ZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0FQRmxvYXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0FQRmxvYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzBiNmFlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvQVBGbG9hdC5oCkBAIC0wLDAgKzEsMTI0OSBAQAorLy89PT0tIGxsdm0vQURUL0FQRmxvYXQuaCAtIEFyYml0cmFyeSBQcmVjaXNpb24gRmxvYXRpbmcgUG9pbnQgLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmCisvLy8gVGhpcyBmaWxlIGRlY2xhcmVzIGEgY2xhc3MgdG8gcmVwcmVzZW50IGFyYml0cmFyeSBwcmVjaXNpb24gZmxvYXRpbmcgcG9pbnQKKy8vLyB2YWx1ZXMgYW5kIHByb3ZpZGUgYSB2YXJpZXR5IG9mIGFyaXRobWV0aWMgb3BlcmF0aW9ucyBvbiB0aGVtLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0FQRkxPQVRfSAorI2RlZmluZSBMTFZNX0FEVF9BUEZMT0FUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FQSW50LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworI2RlZmluZSBBUEZMT0FUX0RJU1BBVENIX09OX1NFTUFOVElDUyhNRVRIT0RfQ0FMTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHVzZXNMYXlvdXQ8SUVFRUZsb2F0PihnZXRTZW1hbnRpY3MoKSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIFUuSUVFRS5NRVRIT0RfQ0FMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAodXNlc0xheW91dDxEb3VibGVBUEZsb2F0PihnZXRTZW1hbnRpY3MoKSkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gVS5Eb3VibGUuTUVUSE9EX0NBTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgc2VtYW50aWNzIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSB3aGlsZSAoZmFsc2UpCisKK25hbWVzcGFjZSBsbHZtIHsKKworc3RydWN0IGZsdFNlbWFudGljczsKK2NsYXNzIEFQU0ludDsKK2NsYXNzIFN0cmluZ1JlZjsKK2NsYXNzIEFQRmxvYXQ7CitjbGFzcyByYXdfb3N0cmVhbTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKKworLy8vIEVudW0gdGhhdCByZXByZXNlbnRzIHdoYXQgZnJhY3Rpb24gb2YgdGhlIExTQiB0cnVuY2F0ZWQgYml0cyBvZiBhbiBmcCBudW1iZXIKKy8vLyByZXByZXNlbnQuCisvLy8KKy8vLyBUaGlzIGVzc2VudGlhbGx5IGNvbWJpbmVzIHRoZSByb2xlcyBvZiBndWFyZCBhbmQgc3RpY2t5IGJpdHMuCitlbnVtIGxvc3RGcmFjdGlvbiB7IC8vIEV4YW1wbGUgb2YgdHJ1bmNhdGVkIGJpdHM6CisgIGxmRXhhY3RseVplcm8sICAgIC8vIDAwMDAwMAorICBsZkxlc3NUaGFuSGFsZiwgICAvLyAweHh4eHggIHgncyBub3QgYWxsIHplcm8KKyAgbGZFeGFjdGx5SGFsZiwgICAgLy8gMTAwMDAwCisgIGxmTW9yZVRoYW5IYWxmICAgIC8vIDF4eHh4eCAgeCdzIG5vdCBhbGwgemVybworfTsKKworLy8vIEEgc2VsZi1jb250YWluZWQgaG9zdC0gYW5kIHRhcmdldC1pbmRlcGVuZGVudCBhcmJpdHJhcnktcHJlY2lzaW9uCisvLy8gZmxvYXRpbmctcG9pbnQgc29mdHdhcmUgaW1wbGVtZW50YXRpb24uCisvLy8KKy8vLyBBUEZsb2F0IHVzZXMgYmlnbnVtIGludGVnZXIgYXJpdGhtZXRpYyBhcyBwcm92aWRlZCBieSBzdGF0aWMgZnVuY3Rpb25zIGluCisvLy8gdGhlIEFQSW50IGNsYXNzLiAgVGhlIGxpYnJhcnkgd2lsbCB3b3JrIHdpdGggYmlnbnVtIGludGVnZXJzIHdob3NlIHBhcnRzIGFyZQorLy8vIGFueSB1bnNpZ25lZCB0eXBlIGF0IGxlYXN0IDE2IGJpdHMgd2lkZSwgYnV0IDY0IGJpdHMgaXMgcmVjb21tZW5kZWQuCisvLy8KKy8vLyBXcml0dGVuIGZvciBjbGFyaXR5IHJhdGhlciB0aGFuIHNwZWVkLCBpbiBwYXJ0aWN1bGFyIHdpdGggYSB2aWV3IHRvIHVzZSBpbgorLy8vIHRoZSBmcm9udC1lbmQgb2YgYSBjcm9zcyBjb21waWxlciBzbyB0aGF0IHRhcmdldCBhcml0aG1ldGljIGNhbiBiZSBjb3JyZWN0bHkKKy8vLyBwZXJmb3JtZWQgb24gdGhlIGhvc3QuICBQZXJmb3JtYW5jZSBzaG91bGQgbm9uZXRoZWxlc3MgYmUgcmVhc29uYWJsZSwKKy8vLyBwYXJ0aWN1bGFybHkgZm9yIGl0cyBpbnRlbmRlZCB1c2UuICBJdCBtYXkgYmUgdXNlZnVsIGFzIGEgYmFzZQorLy8vIGltcGxlbWVudGF0aW9uIGZvciBhIHJ1bi10aW1lIGxpYnJhcnkgZHVyaW5nIGRldmVsb3BtZW50IG9mIGEgZmFzdGVyCisvLy8gdGFyZ2V0LXNwZWNpZmljIG9uZS4KKy8vLworLy8vIEFsbCA1IHJvdW5kaW5nIG1vZGVzIGluIHRoZSBJRUVFLTc1NFIgZHJhZnQgYXJlIGhhbmRsZWQgY29ycmVjdGx5IGZvciBhbGwKKy8vLyBpbXBsZW1lbnRlZCBvcGVyYXRpb25zLiAgQ3VycmVudGx5IGltcGxlbWVudGVkIG9wZXJhdGlvbnMgYXJlIGFkZCwgc3VidHJhY3QsCisvLy8gbXVsdGlwbHksIGRpdmlkZSwgZnVzZWQtbXVsdGlwbHktYWRkLCBjb252ZXJzaW9uLXRvLWZsb2F0LAorLy8vIGNvbnZlcnNpb24tdG8taW50ZWdlciBhbmQgY29udmVyc2lvbi1mcm9tLWludGVnZXIuICBOZXcgcm91bmRpbmcgbW9kZXMKKy8vLyAoZS5nLiBhd2F5IGZyb20gemVybykgY2FuIGJlIGFkZGVkIHdpdGggdGhyZWUgb3IgZm91ciBsaW5lcyBvZiBjb2RlLgorLy8vCisvLy8gRm91ciBmb3JtYXRzIGFyZSBidWlsdC1pbjogSUVFRSBzaW5nbGUgcHJlY2lzaW9uLCBkb3VibGUgcHJlY2lzaW9uLAorLy8vIHF1YWRydXBsZSBwcmVjaXNpb24sIGFuZCB4ODcgODAtYml0IGV4dGVuZGVkIGRvdWJsZSAod2hlbiBvcGVyYXRpbmcgd2l0aAorLy8vIGZ1bGwgZXh0ZW5kZWQgcHJlY2lzaW9uKS4gIEFkZGluZyBhIG5ldyBmb3JtYXQgdGhhdCBvYmV5cyBJRUVFIHNlbWFudGljcworLy8vIG9ubHkgcmVxdWlyZXMgYWRkaW5nIHR3byBsaW5lcyBvZiBjb2RlOiBhIGRlY2xhcmF0aW9uIGFuZCBkZWZpbml0aW9uIG9mIHRoZQorLy8vIGZvcm1hdC4KKy8vLworLy8vIEFsbCBvcGVyYXRpb25zIHJldHVybiB0aGUgc3RhdHVzIG9mIHRoYXQgb3BlcmF0aW9uIGFzIGFuIGV4Y2VwdGlvbiBiaXQtbWFzaywKKy8vLyBzbyBtdWx0aXBsZSBvcGVyYXRpb25zIGNhbiBiZSBkb25lIGNvbnNlY3V0aXZlbHkgd2l0aCB0aGVpciByZXN1bHRzIG9yLWVkCisvLy8gdG9nZXRoZXIuICBUaGUgcmV0dXJuZWQgc3RhdHVzIGNhbiBiZSB1c2VmdWwgZm9yIGNvbXBpbGVyIGRpYWdub3N0aWNzOyBlLmcuLAorLy8vIGluZXhhY3QsIHVuZGVyZmxvdyBhbmQgb3ZlcmZsb3cgY2FuIGJlIGVhc2lseSBkaWFnbm9zZWQgb24gY29uc3RhbnQgZm9sZGluZywKKy8vLyBhbmQgY29tcGlsZXIgb3B0aW1pemVycyBjYW4gZGV0ZXJtaW5lIHdoYXQgZXhjZXB0aW9ucyB3b3VsZCBiZSByYWlzZWQgYnkKKy8vLyBmb2xkaW5nIG9wZXJhdGlvbnMgYW5kIG9wdGltaXplLCBvciBwZXJoYXBzIG5vdCBvcHRpbWl6ZSwgYWNjb3JkaW5nbHkuCisvLy8KKy8vLyBBdCBwcmVzZW50LCB1bmRlcmZsb3cgdGluaW5lc3MgaXMgZGV0ZWN0ZWQgYWZ0ZXIgcm91bmRpbmc7IGl0IHNob3VsZCBiZQorLy8vIHN0cmFpZ2h0IGZvcndhcmQgdG8gYWRkIHN1cHBvcnQgZm9yIHRoZSBiZWZvcmUtcm91bmRpbmcgY2FzZSB0b28uCisvLy8KKy8vLyBUaGUgbGlicmFyeSByZWFkcyBoZXhhZGVjaW1hbCBmbG9hdGluZyBwb2ludCBudW1iZXJzIGFzIHBlciBDOTksIGFuZAorLy8vIGNvcnJlY3RseSByb3VuZHMgaWYgbmVjZXNzYXJ5IGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHJvdW5kaW5nIG1vZGUuCisvLy8gU3ludGF4IGlzIHJlcXVpcmVkIHRvIGhhdmUgYmVlbiB2YWxpZGF0ZWQgYnkgdGhlIGNhbGxlci4gIEl0IGFsc28gY29udmVydHMKKy8vLyBmbG9hdGluZyBwb2ludCBudW1iZXJzIHRvIGhleGFkZWNpbWFsIHRleHQgYXMgcGVyIHRoZSBDOTkgJWEgYW5kICVBCisvLy8gY29udmVyc2lvbnMuICBUaGUgb3V0cHV0IHByZWNpc2lvbiAob3IgYWx0ZXJuYXRpdmVseSB0aGUgbmF0dXJhbCBtaW5pbWFsCisvLy8gcHJlY2lzaW9uKSBjYW4gYmUgc3BlY2lmaWVkOyBpZiB0aGUgcmVxdWVzdGVkIHByZWNpc2lvbiBpcyBsZXNzIHRoYW4gdGhlCisvLy8gbmF0dXJhbCBwcmVjaXNpb24gdGhlIG91dHB1dCBpcyBjb3JyZWN0bHkgcm91bmRlZCBmb3IgdGhlIHNwZWNpZmllZCByb3VuZGluZworLy8vIG1vZGUuCisvLy8KKy8vLyBJdCBhbHNvIHJlYWRzIGRlY2ltYWwgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyBhbmQgY29ycmVjdGx5IHJvdW5kcyBhY2NvcmRpbmcKKy8vLyB0byB0aGUgc3BlY2lmaWVkIHJvdW5kaW5nIG1vZGUuCisvLy8KKy8vLyBDb252ZXJzaW9uIHRvIGRlY2ltYWwgdGV4dCBpcyBub3QgY3VycmVudGx5IGltcGxlbWVudGVkLgorLy8vCisvLy8gTm9uLXplcm8gZmluaXRlIG51bWJlcnMgYXJlIHJlcHJlc2VudGVkIGludGVybmFsbHkgYXMgYSBzaWduIGJpdCwgYSAxNi1iaXQKKy8vLyBzaWduZWQgZXhwb25lbnQsIGFuZCB0aGUgc2lnbmlmaWNhbmQgYXMgYW4gYXJyYXkgb2YgaW50ZWdlciBwYXJ0cy4gIEFmdGVyCisvLy8gbm9ybWFsaXphdGlvbiBvZiBhIG51bWJlciBvZiBwcmVjaXNpb24gUCB0aGUgZXhwb25lbnQgaXMgd2l0aGluIHRoZSByYW5nZSBvZgorLy8vIHRoZSBmb3JtYXQsIGFuZCBpZiB0aGUgbnVtYmVyIGlzIG5vdCBkZW5vcm1hbCB0aGUgUC10aCBiaXQgb2YgdGhlCisvLy8gc2lnbmlmaWNhbmQgaXMgc2V0IGFzIGFuIGV4cGxpY2l0IGludGVnZXIgYml0LiAgRm9yIGRlbm9ybWFscyB0aGUgbW9zdAorLy8vIHNpZ25pZmljYW50IGJpdCBpcyBzaGlmdGVkIHJpZ2h0IHNvIHRoYXQgdGhlIGV4cG9uZW50IGlzIG1haW50YWluZWQgYXQgdGhlCisvLy8gZm9ybWF0J3MgbWluaW11bSwgc28gdGhhdCB0aGUgc21hbGxlc3QgZGVub3JtYWwgaGFzIGp1c3QgdGhlIGxlYXN0CisvLy8gc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBzaWduaWZpY2FuZCBzZXQuICBUaGUgc2lnbiBvZiB6ZXJvZXMgYW5kIGluZmluaXRpZXMKKy8vLyBpcyBzaWduaWZpY2FudDsgdGhlIGV4cG9uZW50IGFuZCBzaWduaWZpY2FuZCBvZiBzdWNoIG51bWJlcnMgaXMgbm90IHN0b3JlZCwKKy8vLyBidXQgaGFzIGEga25vd24gaW1wbGljaXQgKGRldGVybWluaXN0aWMpIHZhbHVlOiAwIGZvciB0aGUgc2lnbmlmaWNhbmRzLCAwCisvLy8gZm9yIHplcm8gZXhwb25lbnQsIGFsbCAxIGJpdHMgZm9yIGluZmluaXR5IGV4cG9uZW50LiAgRm9yIE5hTnMgdGhlIHNpZ24gYW5kCisvLy8gc2lnbmlmaWNhbmQgYXJlIGRldGVybWluaXN0aWMsIGFsdGhvdWdoIG5vdCByZWFsbHkgbWVhbmluZ2Z1bCwgYW5kIHByZXNlcnZlZAorLy8vIGluIG5vbi1jb252ZXJzaW9uIG9wZXJhdGlvbnMuICBUaGUgZXhwb25lbnQgaXMgaW1wbGljaXRseSBhbGwgMSBiaXRzLgorLy8vCisvLy8gQVBGbG9hdCBkb2VzIG5vdCBwcm92aWRlIGFueSBleGNlcHRpb24gaGFuZGxpbmcgYmV5b25kIGRlZmF1bHQgZXhjZXB0aW9uCisvLy8gaGFuZGxpbmcuIFdlIHJlcHJlc2VudCBTaWduYWxpbmcgTmFOcyB2aWEgSUVFRS03NTRSIDIwMDggNi4yLjEgc2hvdWxkIGNsYXVzZQorLy8vIGJ5IGVuY29kaW5nIFNpZ25hbGluZyBOYU5zIHdpdGggdGhlIGZpcnN0IGJpdCBvZiBpdHMgdHJhaWxpbmcgc2lnbmlmaWNhbmQgYXMKKy8vLyAwLgorLy8vCisvLy8gVE9ETworLy8vID09PT0KKy8vLworLy8vIFNvbWUgZmVhdHVyZXMgdGhhdCBtYXkgb3IgbWF5IG5vdCBiZSB3b3J0aCBhZGRpbmc6CisvLy8KKy8vLyBCaW5hcnkgdG8gZGVjaW1hbCBjb252ZXJzaW9uIChoYXJkKS4KKy8vLworLy8vIE9wdGlvbmFsIGFiaWxpdHkgdG8gZGV0ZWN0IHVuZGVyZmxvdyB0aW5pbmVzcyBiZWZvcmUgcm91bmRpbmcuCisvLy8KKy8vLyBOZXcgZm9ybWF0czogeDg3IGluIHNpbmdsZSBhbmQgZG91YmxlIHByZWNpc2lvbiBtb2RlIChJRUVFIGFwYXJ0IGZyb20KKy8vLyBleHRlbmRlZCBleHBvbmVudCByYW5nZSkgKGhhcmQpLgorLy8vCisvLy8gTmV3IG9wZXJhdGlvbnM6IHNxcnQsIElFRUUgcmVtYWluZGVyLCBDOTAgZm1vZCwgbmV4dHRvd2FyZC4KKy8vLworCisvLyBUaGlzIGlzIHRoZSBjb21tb24gdHlwZSBkZWZpbml0aW9ucyBzaGFyZWQgYnkgQVBGbG9hdCBhbmQgaXRzIGludGVybmFsCisvLyBpbXBsZW1lbnRhdGlvbiBjbGFzc2VzLiBUaGlzIHN0cnVjdCBzaG91bGQgbm90IGRlZmluZSBhbnkgbm9uLXN0YXRpYyBkYXRhCisvLyBtZW1iZXJzLgorc3RydWN0IEFQRmxvYXRCYXNlIHsKKyAgdHlwZWRlZiBBUEludDo6V29yZFR5cGUgaW50ZWdlclBhcnQ7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnRlZ2VyUGFydFdpZHRoID0gQVBJbnQ6OkFQSU5UX0JJVFNfUEVSX1dPUkQ7CisKKyAgLy8vIEEgc2lnbmVkIHR5cGUgdG8gcmVwcmVzZW50IGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyB1bmJpYXNlZCBleHBvbmVudC4KKyAgdHlwZWRlZiBzaWduZWQgc2hvcnQgRXhwb25lbnRUeXBlOworCisgIC8vLyBcbmFtZSBGbG9hdGluZyBQb2ludCBTZW1hbnRpY3MuCisgIC8vLyBAeworCisgIHN0YXRpYyBjb25zdCBmbHRTZW1hbnRpY3MgJklFRUVoYWxmKCkgTExWTV9SRUFETk9ORTsKKyAgc3RhdGljIGNvbnN0IGZsdFNlbWFudGljcyAmSUVFRXNpbmdsZSgpIExMVk1fUkVBRE5PTkU7CisgIHN0YXRpYyBjb25zdCBmbHRTZW1hbnRpY3MgJklFRUVkb3VibGUoKSBMTFZNX1JFQUROT05FOworICBzdGF0aWMgY29uc3QgZmx0U2VtYW50aWNzICZJRUVFcXVhZCgpIExMVk1fUkVBRE5PTkU7CisgIHN0YXRpYyBjb25zdCBmbHRTZW1hbnRpY3MgJlBQQ0RvdWJsZURvdWJsZSgpIExMVk1fUkVBRE5PTkU7CisgIHN0YXRpYyBjb25zdCBmbHRTZW1hbnRpY3MgJng4N0RvdWJsZUV4dGVuZGVkKCkgTExWTV9SRUFETk9ORTsKKworICAvLy8gQSBQc2V1ZG8gZmx0c2VtYW50aWMgdXNlZCB0byBjb25zdHJ1Y3QgQVBGbG9hdHMgdGhhdCBjYW5ub3QgY29uZmxpY3Qgd2l0aAorICAvLy8gYW55dGhpbmcgcmVhbC4KKyAgc3RhdGljIGNvbnN0IGZsdFNlbWFudGljcyAmQm9ndXMoKSBMTFZNX1JFQUROT05FOworCisgIC8vLyBAfQorCisgIC8vLyBJRUVFLTc1NFIgNS4xMTogRmxvYXRpbmcgUG9pbnQgQ29tcGFyaXNvbiBSZWxhdGlvbnMuCisgIGVudW0gY21wUmVzdWx0IHsKKyAgICBjbXBMZXNzVGhhbiwKKyAgICBjbXBFcXVhbCwKKyAgICBjbXBHcmVhdGVyVGhhbiwKKyAgICBjbXBVbm9yZGVyZWQKKyAgfTsKKworICAvLy8gSUVFRS03NTRSIDQuMzogUm91bmRpbmctZGlyZWN0aW9uIGF0dHJpYnV0ZXMuCisgIGVudW0gcm91bmRpbmdNb2RlIHsKKyAgICBybU5lYXJlc3RUaWVzVG9FdmVuLAorICAgIHJtVG93YXJkUG9zaXRpdmUsCisgICAgcm1Ub3dhcmROZWdhdGl2ZSwKKyAgICBybVRvd2FyZFplcm8sCisgICAgcm1OZWFyZXN0VGllc1RvQXdheQorICB9OworCisgIC8vLyBJRUVFLTc1NFIgNzogRGVmYXVsdCBleGNlcHRpb24gaGFuZGxpbmcuCisgIC8vLworICAvLy8gb3BVbmRlcmZsb3cgb3Igb3BPdmVyZmxvdyBhcmUgYWx3YXlzIHJldHVybmVkIG9yLWVkIHdpdGggb3BJbmV4YWN0LgorICBlbnVtIG9wU3RhdHVzIHsKKyAgICBvcE9LID0gMHgwMCwKKyAgICBvcEludmFsaWRPcCA9IDB4MDEsCisgICAgb3BEaXZCeVplcm8gPSAweDAyLAorICAgIG9wT3ZlcmZsb3cgPSAweDA0LAorICAgIG9wVW5kZXJmbG93ID0gMHgwOCwKKyAgICBvcEluZXhhY3QgPSAweDEwCisgIH07CisKKyAgLy8vIENhdGVnb3J5IG9mIGludGVybmFsbHktcmVwcmVzZW50ZWQgbnVtYmVyLgorICBlbnVtIGZsdENhdGVnb3J5IHsKKyAgICBmY0luZmluaXR5LAorICAgIGZjTmFOLAorICAgIGZjTm9ybWFsLAorICAgIGZjWmVybworICB9OworCisgIC8vLyBDb252ZW5pZW5jZSBlbnVtIHVzZWQgdG8gY29uc3RydWN0IGFuIHVuaW5pdGlhbGl6ZWQgQVBGbG9hdC4KKyAgZW51bSB1bmluaXRpYWxpemVkVGFnIHsKKyAgICB1bmluaXRpYWxpemVkCisgIH07CisKKyAgLy8vIEVudW1lcmF0aW9uIG9mIFxjIGlsb2diIGVycm9yIHJlc3VsdHMuCisgIGVudW0gSWxvZ2JFcnJvcktpbmRzIHsKKyAgICBJRUtfWmVybyA9IElOVF9NSU4gKyAxLAorICAgIElFS19OYU4gPSBJTlRfTUlOLAorICAgIElFS19JbmYgPSBJTlRfTUFYCisgIH07CisKKyAgc3RhdGljIHVuc2lnbmVkIGludCBzZW1hbnRpY3NQcmVjaXNpb24oY29uc3QgZmx0U2VtYW50aWNzICYpOworICBzdGF0aWMgRXhwb25lbnRUeXBlIHNlbWFudGljc01pbkV4cG9uZW50KGNvbnN0IGZsdFNlbWFudGljcyAmKTsKKyAgc3RhdGljIEV4cG9uZW50VHlwZSBzZW1hbnRpY3NNYXhFeHBvbmVudChjb25zdCBmbHRTZW1hbnRpY3MgJik7CisgIHN0YXRpYyB1bnNpZ25lZCBpbnQgc2VtYW50aWNzU2l6ZUluQml0cyhjb25zdCBmbHRTZW1hbnRpY3MgJik7CisKKyAgLy8vIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIGZsb2F0aW5nIHBvaW50IG51bWJlciAoaW4gYml0cykgaW4gdGhlIGdpdmVuCisgIC8vLyBzZW1hbnRpY3MuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRTaXplSW5CaXRzKGNvbnN0IGZsdFNlbWFudGljcyAmU2VtKTsKK307CisKK25hbWVzcGFjZSBkZXRhaWwgeworCitjbGFzcyBJRUVFRmxvYXQgZmluYWwgOiBwdWJsaWMgQVBGbG9hdEJhc2UgeworcHVibGljOgorICAvLy8gXG5hbWUgQ29uc3RydWN0b3JzCisgIC8vLyBAeworCisgIElFRUVGbG9hdChjb25zdCBmbHRTZW1hbnRpY3MgJik7IC8vIERlZmF1bHQgY29uc3RydWN0IHRvIDAuMAorICBJRUVFRmxvYXQoY29uc3QgZmx0U2VtYW50aWNzICYsIGludGVnZXJQYXJ0KTsKKyAgSUVFRUZsb2F0KGNvbnN0IGZsdFNlbWFudGljcyAmLCB1bmluaXRpYWxpemVkVGFnKTsKKyAgSUVFRUZsb2F0KGNvbnN0IGZsdFNlbWFudGljcyAmLCBjb25zdCBBUEludCAmKTsKKyAgZXhwbGljaXQgSUVFRUZsb2F0KGRvdWJsZSBkKTsKKyAgZXhwbGljaXQgSUVFRUZsb2F0KGZsb2F0IGYpOworICBJRUVFRmxvYXQoY29uc3QgSUVFRUZsb2F0ICYpOworICBJRUVFRmxvYXQoSUVFRUZsb2F0ICYmKTsKKyAgfklFRUVGbG9hdCgpOworCisgIC8vLyBAfQorCisgIC8vLyBSZXR1cm5zIHdoZXRoZXIgdGhpcyBpbnN0YW5jZSBhbGxvY2F0ZWQgbWVtb3J5LgorICBib29sIG5lZWRzQ2xlYW51cCgpIGNvbnN0IHsgcmV0dXJuIHBhcnRDb3VudCgpID4gMTsgfQorCisgIC8vLyBcbmFtZSBDb252ZW5pZW5jZSAiY29uc3RydWN0b3JzIgorICAvLy8gQHsKKworICAvLy8gQH0KKworICAvLy8gXG5hbWUgQXJpdGhtZXRpYworICAvLy8gQHsKKworICBvcFN0YXR1cyBhZGQoY29uc3QgSUVFRUZsb2F0ICYsIHJvdW5kaW5nTW9kZSk7CisgIG9wU3RhdHVzIHN1YnRyYWN0KGNvbnN0IElFRUVGbG9hdCAmLCByb3VuZGluZ01vZGUpOworICBvcFN0YXR1cyBtdWx0aXBseShjb25zdCBJRUVFRmxvYXQgJiwgcm91bmRpbmdNb2RlKTsKKyAgb3BTdGF0dXMgZGl2aWRlKGNvbnN0IElFRUVGbG9hdCAmLCByb3VuZGluZ01vZGUpOworICAvLy8gSUVFRSByZW1haW5kZXIuCisgIG9wU3RhdHVzIHJlbWFpbmRlcihjb25zdCBJRUVFRmxvYXQgJik7CisgIC8vLyBDIGZtb2QsIG9yIGxsdm0gZnJlbS4KKyAgb3BTdGF0dXMgbW9kKGNvbnN0IElFRUVGbG9hdCAmKTsKKyAgb3BTdGF0dXMgZnVzZWRNdWx0aXBseUFkZChjb25zdCBJRUVFRmxvYXQgJiwgY29uc3QgSUVFRUZsb2F0ICYsIHJvdW5kaW5nTW9kZSk7CisgIG9wU3RhdHVzIHJvdW5kVG9JbnRlZ3JhbChyb3VuZGluZ01vZGUpOworICAvLy8gSUVFRS03NTRSIDUuMy4xOiBuZXh0VXAvbmV4dERvd24uCisgIG9wU3RhdHVzIG5leHQoYm9vbCBuZXh0RG93bik7CisKKyAgLy8vIEB9CisKKyAgLy8vIFxuYW1lIFNpZ24gb3BlcmF0aW9ucy4KKyAgLy8vIEB7CisKKyAgdm9pZCBjaGFuZ2VTaWduKCk7CisKKyAgLy8vIEB9CisKKyAgLy8vIFxuYW1lIENvbnZlcnNpb25zCisgIC8vLyBAeworCisgIG9wU3RhdHVzIGNvbnZlcnQoY29uc3QgZmx0U2VtYW50aWNzICYsIHJvdW5kaW5nTW9kZSwgYm9vbCAqKTsKKyAgb3BTdGF0dXMgY29udmVydFRvSW50ZWdlcihNdXRhYmxlQXJyYXlSZWY8aW50ZWdlclBhcnQ+LCB1bnNpZ25lZCBpbnQsIGJvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRpbmdNb2RlLCBib29sICopIGNvbnN0OworICBvcFN0YXR1cyBjb252ZXJ0RnJvbUFQSW50KGNvbnN0IEFQSW50ICYsIGJvb2wsIHJvdW5kaW5nTW9kZSk7CisgIG9wU3RhdHVzIGNvbnZlcnRGcm9tU2lnbkV4dGVuZGVkSW50ZWdlcihjb25zdCBpbnRlZ2VyUGFydCAqLCB1bnNpZ25lZCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sLCByb3VuZGluZ01vZGUpOworICBvcFN0YXR1cyBjb252ZXJ0RnJvbVplcm9FeHRlbmRlZEludGVnZXIoY29uc3QgaW50ZWdlclBhcnQgKiwgdW5zaWduZWQgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCwgcm91bmRpbmdNb2RlKTsKKyAgb3BTdGF0dXMgY29udmVydEZyb21TdHJpbmcoU3RyaW5nUmVmLCByb3VuZGluZ01vZGUpOworICBBUEludCBiaXRjYXN0VG9BUEludCgpIGNvbnN0OworICBkb3VibGUgY29udmVydFRvRG91YmxlKCkgY29uc3Q7CisgIGZsb2F0IGNvbnZlcnRUb0Zsb2F0KCkgY29uc3Q7CisKKyAgLy8vIEB9CisKKyAgLy8vIFRoZSBkZWZpbml0aW9uIG9mIGVxdWFsaXR5IGlzIG5vdCBzdHJhaWdodGZvcndhcmQgZm9yIGZsb2F0aW5nIHBvaW50LCBzbworICAvLy8gd2Ugd29uJ3QgdXNlIG9wZXJhdG9yPT0uICBVc2Ugb25lIG9mIHRoZSBmb2xsb3dpbmcsIG9yIHdyaXRlIHdoYXRldmVyIGl0CisgIC8vLyBpcyB5b3UgcmVhbGx5IG1lYW4uCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJRUVFRmxvYXQgJikgY29uc3QgPSBkZWxldGU7CisKKyAgLy8vIElFRUUgY29tcGFyaXNvbiB3aXRoIGFub3RoZXIgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIChOYU5zIGNvbXBhcmUKKyAgLy8vIHVub3JkZXJlZCwgMD09LTApLgorICBjbXBSZXN1bHQgY29tcGFyZShjb25zdCBJRUVFRmxvYXQgJikgY29uc3Q7CisKKyAgLy8vIEJpdHdpc2UgY29tcGFyaXNvbiBmb3IgZXF1YWxpdHkgKFFOYU5zIGNvbXBhcmUgZXF1YWwsIDAhPS0wKS4KKyAgYm9vbCBiaXR3aXNlSXNFcXVhbChjb25zdCBJRUVFRmxvYXQgJikgY29uc3Q7CisKKyAgLy8vIFdyaXRlIG91dCBhIGhleGFkZWNpbWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmbG9hdGluZyBwb2ludCB2YWx1ZSB0byBEU1QsCisgIC8vLyB3aGljaCBtdXN0IGJlIG9mIHN1ZmZpY2llbnQgc2l6ZSwgaW4gdGhlIEM5OSBmb3JtIFstXTB4aC5oaGhocFsrLV1kLgorICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB3cml0dGVuLCBleGNsdWRpbmcgdGhlIHRlcm1pbmF0aW5nIE5VTC4KKyAgdW5zaWduZWQgaW50IGNvbnZlcnRUb0hleFN0cmluZyhjaGFyICpkc3QsIHVuc2lnbmVkIGludCBoZXhEaWdpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1cHBlckNhc2UsIHJvdW5kaW5nTW9kZSkgY29uc3Q7CisKKyAgLy8vIFxuYW1lIElFRUUtNzU0UiA1LjcuMiBHZW5lcmFsIG9wZXJhdGlvbnMuCisgIC8vLyBAeworCisgIC8vLyBJRUVFLTc1NFIgaXNTaWduTWludXM6IFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgY3VycmVudCB2YWx1ZSBpcworICAvLy8gbmVnYXRpdmUuCisgIC8vLworICAvLy8gVGhpcyBhcHBsaWVzIHRvIHplcm9zIGFuZCBOYU5zIGFzIHdlbGwuCisgIGJvb2wgaXNOZWdhdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIHNpZ247IH0KKworICAvLy8gSUVFRS03NTRSIGlzTm9ybWFsOiBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGN1cnJlbnQgdmFsdWUgaXMgbm9ybWFsLgorICAvLy8KKyAgLy8vIFRoaXMgaW1wbGllcyB0aGF0IHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBmbG9hdCBpcyBub3QgemVybywgc3Vibm9ybWFsLAorICAvLy8gaW5maW5pdGUsIG9yIE5hTiBmb2xsb3dpbmcgdGhlIGRlZmluaXRpb24gb2Ygbm9ybWFsaXR5IGZyb20gSUVFRS03NTRSLgorICBib29sIGlzTm9ybWFsKCkgY29uc3QgeyByZXR1cm4gIWlzRGVub3JtYWwoKSAmJiBpc0Zpbml0ZU5vblplcm8oKTsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGN1cnJlbnQgdmFsdWUgaXMgemVybywgc3Vibm9ybWFsLCBvcgorICAvLy8gbm9ybWFsLgorICAvLy8KKyAgLy8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgdmFsdWUgaXMgbm90IGluZmluaXRlIG9yIE5hTi4KKyAgYm9vbCBpc0Zpbml0ZSgpIGNvbnN0IHsgcmV0dXJuICFpc05hTigpICYmICFpc0luZmluaXR5KCk7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBmbG9hdCBpcyBwbHVzIG9yIG1pbnVzIHplcm8uCisgIGJvb2wgaXNaZXJvKCkgY29uc3QgeyByZXR1cm4gY2F0ZWdvcnkgPT0gZmNaZXJvOyB9CisKKyAgLy8vIElFRUUtNzU0UiBpc1N1Ym5vcm1hbCgpOiBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGZsb2F0IGlzIGEKKyAgLy8vIGRlbm9ybWFsLgorICBib29sIGlzRGVub3JtYWwoKSBjb25zdDsKKworICAvLy8gSUVFRS03NTRSIGlzSW5maW5pdGUoKTogUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIHRoZSBmbG9hdCBpcyBpbmZpbml0eS4KKyAgYm9vbCBpc0luZmluaXR5KCkgY29uc3QgeyByZXR1cm4gY2F0ZWdvcnkgPT0gZmNJbmZpbml0eTsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIGZsb2F0IGlzIGEgcXVpZXQgb3Igc2lnbmFsaW5nIE5hTi4KKyAgYm9vbCBpc05hTigpIGNvbnN0IHsgcmV0dXJuIGNhdGVnb3J5ID09IGZjTmFOOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgZmxvYXQgaXMgYSBzaWduYWxpbmcgTmFOLgorICBib29sIGlzU2lnbmFsaW5nKCkgY29uc3Q7CisKKyAgLy8vIEB9CisKKyAgLy8vIFxuYW1lIFNpbXBsZSBRdWVyaWVzCisgIC8vLyBAeworCisgIGZsdENhdGVnb3J5IGdldENhdGVnb3J5KCkgY29uc3QgeyByZXR1cm4gY2F0ZWdvcnk7IH0KKyAgY29uc3QgZmx0U2VtYW50aWNzICZnZXRTZW1hbnRpY3MoKSBjb25zdCB7IHJldHVybiAqc2VtYW50aWNzOyB9CisgIGJvb2wgaXNOb25aZXJvKCkgY29uc3QgeyByZXR1cm4gY2F0ZWdvcnkgIT0gZmNaZXJvOyB9CisgIGJvb2wgaXNGaW5pdGVOb25aZXJvKCkgY29uc3QgeyByZXR1cm4gaXNGaW5pdGUoKSAmJiAhaXNaZXJvKCk7IH0KKyAgYm9vbCBpc1Bvc1plcm8oKSBjb25zdCB7IHJldHVybiBpc1plcm8oKSAmJiAhaXNOZWdhdGl2ZSgpOyB9CisgIGJvb2wgaXNOZWdaZXJvKCkgY29uc3QgeyByZXR1cm4gaXNaZXJvKCkgJiYgaXNOZWdhdGl2ZSgpOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUgbnVtYmVyIGhhcyB0aGUgc21hbGxlc3QgcG9zc2libGUgbm9uLXplcm8KKyAgLy8vIG1hZ25pdHVkZSBpbiB0aGUgY3VycmVudCBzZW1hbnRpY3MuCisgIGJvb2wgaXNTbWFsbGVzdCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIG51bWJlciBoYXMgdGhlIGxhcmdlc3QgcG9zc2libGUgZmluaXRlCisgIC8vLyBtYWduaXR1ZGUgaW4gdGhlIGN1cnJlbnQgc2VtYW50aWNzLgorICBib29sIGlzTGFyZ2VzdCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYW5kIG9ubHkgaWYgdGhlIG51bWJlciBpcyBhbiBleGFjdCBpbnRlZ2VyLgorICBib29sIGlzSW50ZWdlcigpIGNvbnN0OworCisgIC8vLyBAfQorCisgIElFRUVGbG9hdCAmb3BlcmF0b3I9KGNvbnN0IElFRUVGbG9hdCAmKTsKKyAgSUVFRUZsb2F0ICZvcGVyYXRvcj0oSUVFRUZsb2F0ICYmKTsKKworICAvLy8gT3ZlcmxvYWQgdG8gY29tcHV0ZSBhIGhhc2ggY29kZSBmb3IgYW4gQVBGbG9hdCB2YWx1ZS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhlIHVzZSBvZiBoYXNoIGNvZGVzIGZvciBmbG9hdGluZyBwb2ludCB2YWx1ZXMgaXMgaW4gZ2VuZXJhbAorICAvLy8gZnJvdWdodCB3aXRoIHBlcmlsLiBFcXVhbGl0eSBpcyBoYXJkIHRvIGRlZmluZSBmb3IgdGhlc2UgdmFsdWVzLiBGb3IKKyAgLy8vIGV4YW1wbGUsIHNob3VsZCBuZWdhdGl2ZSBhbmQgcG9zaXRpdmUgemVybyBoYXNoIHRvIGRpZmZlcmVudCBjb2Rlcz8gQXJlCisgIC8vLyB0aGV5IGVxdWFsIG9yIG5vdD8gVGhpcyBoYXNoIHZhbHVlIGltcGxlbWVudGF0aW9uIHNwZWNpZmljYWxseQorICAvLy8gZW1waGFzaXplcyBwcm9kdWNpbmcgZGlmZmVyZW50IGNvZGVzIGZvciBkaWZmZXJlbnQgaW5wdXRzIGluIG9yZGVyIHRvCisgIC8vLyBiZSB1c2VkIGluIGNhbm9uaWNhbGl6YXRpb24gYW5kIG1lbW9pemF0aW9uLiBBcyBzdWNoLCBlcXVhbGl0eSBpcworICAvLy8gYml0d2lzZUlzRXF1YWwsIGFuZCAwICE9IC0wLgorICBmcmllbmQgaGFzaF9jb2RlIGhhc2hfdmFsdWUoY29uc3QgSUVFRUZsb2F0ICZBcmcpOworCisgIC8vLyBDb252ZXJ0cyB0aGlzIHZhbHVlIGludG8gYSBkZWNpbWFsIHN0cmluZy4KKyAgLy8vCisgIC8vLyBccGFyYW0gRm9ybWF0UHJlY2lzaW9uIFRoZSBtYXhpbXVtIG51bWJlciBvZiBkaWdpdHMgb2YKKyAgLy8vICAgcHJlY2lzaW9uIHRvIG91dHB1dC4gIElmIHRoZXJlIGFyZSBmZXdlciBkaWdpdHMgYXZhaWxhYmxlLAorICAvLy8gICB6ZXJvIHBhZGRpbmcgd2lsbCBub3QgYmUgdXNlZCB1bmxlc3MgdGhlIHZhbHVlIGlzCisgIC8vLyAgIGludGVncmFsIGFuZCBzbWFsbCBlbm91Z2ggdG8gYmUgZXhwcmVzc2VkIGluCisgIC8vLyAgIEZvcm1hdFByZWNpc2lvbiBkaWdpdHMuICAwIG1lYW5zIHRvIHVzZSB0aGUgbmF0dXJhbAorICAvLy8gICBwcmVjaXNpb24gb2YgdGhlIG51bWJlci4KKyAgLy8vIFxwYXJhbSBGb3JtYXRNYXhQYWRkaW5nIFRoZSBtYXhpbXVtIG51bWJlciBvZiB6ZXJvcyB0bworICAvLy8gICBjb25zaWRlciBpbnNlcnRpbmcgYmVmb3JlIGZhbGxpbmcgYmFjayB0byBzY2llbnRpZmljCisgIC8vLyAgIG5vdGF0aW9uLiAgMCBtZWFucyB0byBhbHdheXMgdXNlIHNjaWVudGlmaWMgbm90YXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFRydW5jYXRlWmVybyBJbmRpY2F0ZSB3aGV0aGVyIHRvIHJlbW92ZSB0aGUgdHJhaWxpbmcgemVybyBpbgorICAvLy8gICBmcmFjdGlvbiBwYXJ0IG9yIG5vdC4gQWxzbyBzZXR0aW5nIHRoaXMgcGFyYW1ldGVyIHRvIGZhbHNlIGZvcmNpbmcKKyAgLy8vICAgcHJvZHVjaW5nIG9mIG91dHB1dCBtb3JlIHNpbWlsYXIgdG8gZGVmYXVsdCBwcmludGYgYmVoYXZpb3IuCisgIC8vLyAgIFNwZWNpZmljYWxseSB0aGUgbG93ZXIgZSBpcyB1c2VkIGFzIGV4cG9uZW50IGRlbGltaXRlciBhbmQgZXhwb25lbnQKKyAgLy8vICAgYWx3YXlzIGNvbnRhaW5zIG5vIGxlc3MgdGhhbiB0d28gZGlnaXRzLgorICAvLy8KKyAgLy8vIE51bWJlciAgICAgICBQcmVjaXNpb24gICAgTWF4UGFkZGluZyAgICAgIFJlc3VsdAorICAvLy8gLS0tLS0tICAgICAgIC0tLS0tLS0tLSAgICAtLS0tLS0tLS0tICAgICAgLS0tLS0tCisgIC8vLyAxLjAxRSs0ICAgICAgICAgICAgICA1ICAgICAgICAgICAgIDIgICAgICAgMTAxMDAKKyAgLy8vIDEuMDFFKzQgICAgICAgICAgICAgIDQgICAgICAgICAgICAgMiAgICAgICAxLjAxRSs0CisgIC8vLyAxLjAxRSs0ICAgICAgICAgICAgICA1ICAgICAgICAgICAgIDEgICAgICAgMS4wMUUrNAorICAvLy8gMS4wMUUtMiAgICAgICAgICAgICAgNSAgICAgICAgICAgICAyICAgICAgIDAuMDEwMQorICAvLy8gMS4wMUUtMiAgICAgICAgICAgICAgNCAgICAgICAgICAgICAyICAgICAgIDAuMDEwMQorICAvLy8gMS4wMUUtMiAgICAgICAgICAgICAgNCAgICAgICAgICAgICAxICAgICAgIDEuMDFFLTIKKyAgdm9pZCB0b1N0cmluZyhTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlN0ciwgdW5zaWduZWQgRm9ybWF0UHJlY2lzaW9uID0gMCwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBGb3JtYXRNYXhQYWRkaW5nID0gMywgYm9vbCBUcnVuY2F0ZVplcm8gPSB0cnVlKSBjb25zdDsKKworICAvLy8gSWYgdGhpcyB2YWx1ZSBoYXMgYW4gZXhhY3QgbXVsdGlwbGljYXRpdmUgaW52ZXJzZSwgc3RvcmUgaXQgaW4gaW52IGFuZAorICAvLy8gcmV0dXJuIHRydWUuCisgIGJvb2wgZ2V0RXhhY3RJbnZlcnNlKEFQRmxvYXQgKmludikgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIGV4cG9uZW50IG9mIHRoZSBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgQVBGbG9hdC4KKyAgLy8vCisgIC8vLyBCZWNhdXNlIHRoZSByYWRpeCBvZiBBUEZsb2F0IGlzIDIsIHRoaXMgaXMgZXF1aXZhbGVudCB0byBmbG9vcihsb2cyKHgpKS4KKyAgLy8vIEZvciBzcGVjaWFsIEFQRmxvYXQgdmFsdWVzLCB0aGlzIHJldHVybnMgc3BlY2lhbCBlcnJvciBjb2RlczoKKyAgLy8vCisgIC8vLyAgIE5hTiAtPiBcYyBJRUtfTmFOCisgIC8vLyAgIDAgICAtPiBcYyBJRUtfWmVybworICAvLy8gICBJbmYgLT4gXGMgSUVLX0luZgorICAvLy8KKyAgZnJpZW5kIGludCBpbG9nYihjb25zdCBJRUVFRmxvYXQgJkFyZyk7CisKKyAgLy8vIFJldHVybnM6IFggKiAyXkV4cCBmb3IgaW50ZWdyYWwgZXhwb25lbnRzLgorICBmcmllbmQgSUVFRUZsb2F0IHNjYWxibihJRUVFRmxvYXQgWCwgaW50IEV4cCwgcm91bmRpbmdNb2RlKTsKKworICBmcmllbmQgSUVFRUZsb2F0IGZyZXhwKGNvbnN0IElFRUVGbG9hdCAmWCwgaW50ICZFeHAsIHJvdW5kaW5nTW9kZSk7CisKKyAgLy8vIFxuYW1lIFNwZWNpYWwgdmFsdWUgc2V0dGVycy4KKyAgLy8vIEB7CisKKyAgdm9pZCBtYWtlTGFyZ2VzdChib29sIE5lZyA9IGZhbHNlKTsKKyAgdm9pZCBtYWtlU21hbGxlc3QoYm9vbCBOZWcgPSBmYWxzZSk7CisgIHZvaWQgbWFrZU5hTihib29sIFNOYU4gPSBmYWxzZSwgYm9vbCBOZWcgPSBmYWxzZSwKKyAgICAgICAgICAgICAgIGNvbnN0IEFQSW50ICpmaWxsID0gbnVsbHB0cik7CisgIHZvaWQgbWFrZUluZihib29sIE5lZyA9IGZhbHNlKTsKKyAgdm9pZCBtYWtlWmVybyhib29sIE5lZyA9IGZhbHNlKTsKKyAgdm9pZCBtYWtlUXVpZXQoKTsKKworICAvLy8gUmV0dXJucyB0aGUgc21hbGxlc3QgKGJ5IG1hZ25pdHVkZSkgbm9ybWFsaXplZCBmaW5pdGUgbnVtYmVyIGluIHRoZSBnaXZlbgorICAvLy8gc2VtYW50aWNzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOZWdhdGl2ZSAtIFRydWUgaWZmIHRoZSBudW1iZXIgc2hvdWxkIGJlIG5lZ2F0aXZlCisgIHZvaWQgbWFrZVNtYWxsZXN0Tm9ybWFsaXplZChib29sIE5lZ2F0aXZlID0gZmFsc2UpOworCisgIC8vLyBAfQorCisgIGNtcFJlc3VsdCBjb21wYXJlQWJzb2x1dGVWYWx1ZShjb25zdCBJRUVFRmxvYXQgJikgY29uc3Q7CisKK3ByaXZhdGU6CisgIC8vLyBcbmFtZSBTaW1wbGUgUXVlcmllcworICAvLy8gQHsKKworICBpbnRlZ2VyUGFydCAqc2lnbmlmaWNhbmRQYXJ0cygpOworICBjb25zdCBpbnRlZ2VyUGFydCAqc2lnbmlmaWNhbmRQYXJ0cygpIGNvbnN0OworICB1bnNpZ25lZCBpbnQgcGFydENvdW50KCkgY29uc3Q7CisKKyAgLy8vIEB9CisKKyAgLy8vIFxuYW1lIFNpZ25pZmljYW5kIG9wZXJhdGlvbnMuCisgIC8vLyBAeworCisgIGludGVnZXJQYXJ0IGFkZFNpZ25pZmljYW5kKGNvbnN0IElFRUVGbG9hdCAmKTsKKyAgaW50ZWdlclBhcnQgc3VidHJhY3RTaWduaWZpY2FuZChjb25zdCBJRUVFRmxvYXQgJiwgaW50ZWdlclBhcnQpOworICBsb3N0RnJhY3Rpb24gYWRkT3JTdWJ0cmFjdFNpZ25pZmljYW5kKGNvbnN0IElFRUVGbG9hdCAmLCBib29sIHN1YnRyYWN0KTsKKyAgbG9zdEZyYWN0aW9uIG11bHRpcGx5U2lnbmlmaWNhbmQoY29uc3QgSUVFRUZsb2F0ICYsIGNvbnN0IElFRUVGbG9hdCAqKTsKKyAgbG9zdEZyYWN0aW9uIGRpdmlkZVNpZ25pZmljYW5kKGNvbnN0IElFRUVGbG9hdCAmKTsKKyAgdm9pZCBpbmNyZW1lbnRTaWduaWZpY2FuZCgpOworICB2b2lkIGluaXRpYWxpemUoY29uc3QgZmx0U2VtYW50aWNzICopOworICB2b2lkIHNoaWZ0U2lnbmlmaWNhbmRMZWZ0KHVuc2lnbmVkIGludCk7CisgIGxvc3RGcmFjdGlvbiBzaGlmdFNpZ25pZmljYW5kUmlnaHQodW5zaWduZWQgaW50KTsKKyAgdW5zaWduZWQgaW50IHNpZ25pZmljYW5kTFNCKCkgY29uc3Q7CisgIHVuc2lnbmVkIGludCBzaWduaWZpY2FuZE1TQigpIGNvbnN0OworICB2b2lkIHplcm9TaWduaWZpY2FuZCgpOworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNpZ25pZmljYW5kIGV4Y2x1ZGluZyB0aGUgaW50ZWdyYWwgYml0IGlzIGFsbCBvbmVzLgorICBib29sIGlzU2lnbmlmaWNhbmRBbGxPbmVzKCkgY29uc3Q7CisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc2lnbmlmaWNhbmQgZXhjbHVkaW5nIHRoZSBpbnRlZ3JhbCBiaXQgaXMgYWxsIHplcm9zLgorICBib29sIGlzU2lnbmlmaWNhbmRBbGxaZXJvcygpIGNvbnN0OworCisgIC8vLyBAfQorCisgIC8vLyBcbmFtZSBBcml0aG1ldGljIG9uIHNwZWNpYWwgdmFsdWVzLgorICAvLy8gQHsKKworICBvcFN0YXR1cyBhZGRPclN1YnRyYWN0U3BlY2lhbHMoY29uc3QgSUVFRUZsb2F0ICYsIGJvb2wgc3VidHJhY3QpOworICBvcFN0YXR1cyBkaXZpZGVTcGVjaWFscyhjb25zdCBJRUVFRmxvYXQgJik7CisgIG9wU3RhdHVzIG11bHRpcGx5U3BlY2lhbHMoY29uc3QgSUVFRUZsb2F0ICYpOworICBvcFN0YXR1cyBtb2RTcGVjaWFscyhjb25zdCBJRUVFRmxvYXQgJik7CisKKyAgLy8vIEB9CisKKyAgLy8vIFxuYW1lIE1pc2NlbGxhbnkKKyAgLy8vIEB7CisKKyAgYm9vbCBjb252ZXJ0RnJvbVN0cmluZ1NwZWNpYWxzKFN0cmluZ1JlZiBzdHIpOworICBvcFN0YXR1cyBub3JtYWxpemUocm91bmRpbmdNb2RlLCBsb3N0RnJhY3Rpb24pOworICBvcFN0YXR1cyBhZGRPclN1YnRyYWN0KGNvbnN0IElFRUVGbG9hdCAmLCByb3VuZGluZ01vZGUsIGJvb2wgc3VidHJhY3QpOworICBvcFN0YXR1cyBoYW5kbGVPdmVyZmxvdyhyb3VuZGluZ01vZGUpOworICBib29sIHJvdW5kQXdheUZyb21aZXJvKHJvdW5kaW5nTW9kZSwgbG9zdEZyYWN0aW9uLCB1bnNpZ25lZCBpbnQpIGNvbnN0OworICBvcFN0YXR1cyBjb252ZXJ0VG9TaWduRXh0ZW5kZWRJbnRlZ2VyKE11dGFibGVBcnJheVJlZjxpbnRlZ2VyUGFydD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50LCBib29sLCByb3VuZGluZ01vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqKSBjb25zdDsKKyAgb3BTdGF0dXMgY29udmVydEZyb21VbnNpZ25lZFBhcnRzKGNvbnN0IGludGVnZXJQYXJ0ICosIHVuc2lnbmVkIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kaW5nTW9kZSk7CisgIG9wU3RhdHVzIGNvbnZlcnRGcm9tSGV4YWRlY2ltYWxTdHJpbmcoU3RyaW5nUmVmLCByb3VuZGluZ01vZGUpOworICBvcFN0YXR1cyBjb252ZXJ0RnJvbURlY2ltYWxTdHJpbmcoU3RyaW5nUmVmLCByb3VuZGluZ01vZGUpOworICBjaGFyICpjb252ZXJ0Tm9ybWFsVG9IZXhTdHJpbmcoY2hhciAqLCB1bnNpZ25lZCBpbnQsIGJvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZGluZ01vZGUpIGNvbnN0OworICBvcFN0YXR1cyByb3VuZFNpZ25pZmljYW5kV2l0aEV4cG9uZW50KGNvbnN0IGludGVnZXJQYXJ0ICosIHVuc2lnbmVkIGludCwgaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kaW5nTW9kZSk7CisKKyAgLy8vIEB9CisKKyAgQVBJbnQgY29udmVydEhhbGZBUEZsb2F0VG9BUEludCgpIGNvbnN0OworICBBUEludCBjb252ZXJ0RmxvYXRBUEZsb2F0VG9BUEludCgpIGNvbnN0OworICBBUEludCBjb252ZXJ0RG91YmxlQVBGbG9hdFRvQVBJbnQoKSBjb25zdDsKKyAgQVBJbnQgY29udmVydFF1YWRydXBsZUFQRmxvYXRUb0FQSW50KCkgY29uc3Q7CisgIEFQSW50IGNvbnZlcnRGODBMb25nRG91YmxlQVBGbG9hdFRvQVBJbnQoKSBjb25zdDsKKyAgQVBJbnQgY29udmVydFBQQ0RvdWJsZURvdWJsZUFQRmxvYXRUb0FQSW50KCkgY29uc3Q7CisgIHZvaWQgaW5pdEZyb21BUEludChjb25zdCBmbHRTZW1hbnRpY3MgKlNlbSwgY29uc3QgQVBJbnQgJmFwaSk7CisgIHZvaWQgaW5pdEZyb21IYWxmQVBJbnQoY29uc3QgQVBJbnQgJmFwaSk7CisgIHZvaWQgaW5pdEZyb21GbG9hdEFQSW50KGNvbnN0IEFQSW50ICZhcGkpOworICB2b2lkIGluaXRGcm9tRG91YmxlQVBJbnQoY29uc3QgQVBJbnQgJmFwaSk7CisgIHZvaWQgaW5pdEZyb21RdWFkcnVwbGVBUEludChjb25zdCBBUEludCAmYXBpKTsKKyAgdm9pZCBpbml0RnJvbUY4MExvbmdEb3VibGVBUEludChjb25zdCBBUEludCAmYXBpKTsKKyAgdm9pZCBpbml0RnJvbVBQQ0RvdWJsZURvdWJsZUFQSW50KGNvbnN0IEFQSW50ICZhcGkpOworCisgIHZvaWQgYXNzaWduKGNvbnN0IElFRUVGbG9hdCAmKTsKKyAgdm9pZCBjb3B5U2lnbmlmaWNhbmQoY29uc3QgSUVFRUZsb2F0ICYpOworICB2b2lkIGZyZWVTaWduaWZpY2FuZCgpOworCisgIC8vLyBOb3RlOiB0aGlzIG11c3QgYmUgdGhlIGZpcnN0IGRhdGEgbWVtYmVyLgorICAvLy8gVGhlIHNlbWFudGljcyB0aGF0IHRoaXMgdmFsdWUgb2JleXMuCisgIGNvbnN0IGZsdFNlbWFudGljcyAqc2VtYW50aWNzOworCisgIC8vLyBBIGJpbmFyeSBmcmFjdGlvbiB3aXRoIGFuIGV4cGxpY2l0IGludGVnZXIgYml0LgorICAvLy8KKyAgLy8vIFRoZSBzaWduaWZpY2FuZCBtdXN0IGJlIGF0IGxlYXN0IG9uZSBiaXQgd2lkZXIgdGhhbiB0aGUgdGFyZ2V0IHByZWNpc2lvbi4KKyAgdW5pb24gU2lnbmlmaWNhbmQgeworICAgIGludGVnZXJQYXJ0IHBhcnQ7CisgICAgaW50ZWdlclBhcnQgKnBhcnRzOworICB9IHNpZ25pZmljYW5kOworCisgIC8vLyBUaGUgc2lnbmVkIHVuYmlhc2VkIGV4cG9uZW50IG9mIHRoZSB2YWx1ZS4KKyAgRXhwb25lbnRUeXBlIGV4cG9uZW50OworCisgIC8vLyBXaGF0IGtpbmQgb2YgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIHRoaXMgaXMuCisgIC8vLworICAvLy8gT25seSAyIGJpdHMgYXJlIHJlcXVpcmVkLCBidXQgVmlzdWFsU3R1ZGlvIGluY29ycmVjdGx5IHNpZ24gZXh0ZW5kcyBpdC4KKyAgLy8vIFVzaW5nIHRoZSBleHRyYSBiaXQga2VlcHMgaXQgZnJvbSBmYWlsaW5nIHVuZGVyIFZpc3VhbFN0dWRpby4KKyAgZmx0Q2F0ZWdvcnkgY2F0ZWdvcnkgOiAzOworCisgIC8vLyBTaWduIGJpdCBvZiB0aGUgbnVtYmVyLgorICB1bnNpZ25lZCBpbnQgc2lnbiA6IDE7Cit9OworCitoYXNoX2NvZGUgaGFzaF92YWx1ZShjb25zdCBJRUVFRmxvYXQgJkFyZyk7CitpbnQgaWxvZ2IoY29uc3QgSUVFRUZsb2F0ICZBcmcpOworSUVFRUZsb2F0IHNjYWxibihJRUVFRmxvYXQgWCwgaW50IEV4cCwgSUVFRUZsb2F0Ojpyb3VuZGluZ01vZGUpOworSUVFRUZsb2F0IGZyZXhwKGNvbnN0IElFRUVGbG9hdCAmVmFsLCBpbnQgJkV4cCwgSUVFRUZsb2F0Ojpyb3VuZGluZ01vZGUgUk0pOworCisvLyBUaGlzIG1vZGUgaW1wbGVtZW50cyBtb3JlIHByZWNpc2UgZmxvYXQgaW4gdGVybXMgb2YgdHdvIEFQRmxvYXRzLgorLy8gVGhlIGludGVyZmFjZSBhbmQgbGF5b3V0IGlzIGRlc2lnbmVkIGZvciBhcmJpdHJheSB1bmRlcmx5aW5nIHNlbWFudGljcywKKy8vIHRob3VnaCBjdXJyZW50bHkgb25seSBQUENEb3VibGVEb3VibGUgc2VtYW50aWNzIGFyZSBzdXBwb3J0ZWQsIHdob3NlCisvLyBjb3JyZXNwb25kaW5nIHVuZGVybHlpbmcgc2VtYW50aWNzIGFyZSBJRUVFZG91YmxlLgorY2xhc3MgRG91YmxlQVBGbG9hdCBmaW5hbCA6IHB1YmxpYyBBUEZsb2F0QmFzZSB7CisgIC8vIE5vdGU6IHRoaXMgbXVzdCBiZSB0aGUgZmlyc3QgZGF0YSBtZW1iZXIuCisgIGNvbnN0IGZsdFNlbWFudGljcyAqU2VtYW50aWNzOworICBzdGQ6OnVuaXF1ZV9wdHI8QVBGbG9hdFtdPiBGbG9hdHM7CisKKyAgb3BTdGF0dXMgYWRkSW1wbChjb25zdCBBUEZsb2F0ICZhLCBjb25zdCBBUEZsb2F0ICZhYSwgY29uc3QgQVBGbG9hdCAmYywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBBUEZsb2F0ICZjYywgcm91bmRpbmdNb2RlIFJNKTsKKworICBvcFN0YXR1cyBhZGRXaXRoU3BlY2lhbChjb25zdCBEb3VibGVBUEZsb2F0ICZMSFMsIGNvbnN0IERvdWJsZUFQRmxvYXQgJlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlQVBGbG9hdCAmT3V0LCByb3VuZGluZ01vZGUgUk0pOworCitwdWJsaWM6CisgIERvdWJsZUFQRmxvYXQoY29uc3QgZmx0U2VtYW50aWNzICZTKTsKKyAgRG91YmxlQVBGbG9hdChjb25zdCBmbHRTZW1hbnRpY3MgJlMsIHVuaW5pdGlhbGl6ZWRUYWcpOworICBEb3VibGVBUEZsb2F0KGNvbnN0IGZsdFNlbWFudGljcyAmUywgaW50ZWdlclBhcnQpOworICBEb3VibGVBUEZsb2F0KGNvbnN0IGZsdFNlbWFudGljcyAmUywgY29uc3QgQVBJbnQgJkkpOworICBEb3VibGVBUEZsb2F0KGNvbnN0IGZsdFNlbWFudGljcyAmUywgQVBGbG9hdCAmJkZpcnN0LCBBUEZsb2F0ICYmU2Vjb25kKTsKKyAgRG91YmxlQVBGbG9hdChjb25zdCBEb3VibGVBUEZsb2F0ICZSSFMpOworICBEb3VibGVBUEZsb2F0KERvdWJsZUFQRmxvYXQgJiZSSFMpOworCisgIERvdWJsZUFQRmxvYXQgJm9wZXJhdG9yPShjb25zdCBEb3VibGVBUEZsb2F0ICZSSFMpOworCisgIERvdWJsZUFQRmxvYXQgJm9wZXJhdG9yPShEb3VibGVBUEZsb2F0ICYmUkhTKSB7CisgICAgaWYgKHRoaXMgIT0gJlJIUykgeworICAgICAgdGhpcy0+fkRvdWJsZUFQRmxvYXQoKTsKKyAgICAgIG5ldyAodGhpcykgRG91YmxlQVBGbG9hdChzdGQ6Om1vdmUoUkhTKSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGJvb2wgbmVlZHNDbGVhbnVwKCkgY29uc3QgeyByZXR1cm4gRmxvYXRzICE9IG51bGxwdHI7IH0KKworICBBUEZsb2F0ICZnZXRGaXJzdCgpIHsgcmV0dXJuIEZsb2F0c1swXTsgfQorICBjb25zdCBBUEZsb2F0ICZnZXRGaXJzdCgpIGNvbnN0IHsgcmV0dXJuIEZsb2F0c1swXTsgfQorICBBUEZsb2F0ICZnZXRTZWNvbmQoKSB7IHJldHVybiBGbG9hdHNbMV07IH0KKyAgY29uc3QgQVBGbG9hdCAmZ2V0U2Vjb25kKCkgY29uc3QgeyByZXR1cm4gRmxvYXRzWzFdOyB9CisKKyAgb3BTdGF0dXMgYWRkKGNvbnN0IERvdWJsZUFQRmxvYXQgJlJIUywgcm91bmRpbmdNb2RlIFJNKTsKKyAgb3BTdGF0dXMgc3VidHJhY3QoY29uc3QgRG91YmxlQVBGbG9hdCAmUkhTLCByb3VuZGluZ01vZGUgUk0pOworICBvcFN0YXR1cyBtdWx0aXBseShjb25zdCBEb3VibGVBUEZsb2F0ICZSSFMsIHJvdW5kaW5nTW9kZSBSTSk7CisgIG9wU3RhdHVzIGRpdmlkZShjb25zdCBEb3VibGVBUEZsb2F0ICZSSFMsIHJvdW5kaW5nTW9kZSBSTSk7CisgIG9wU3RhdHVzIHJlbWFpbmRlcihjb25zdCBEb3VibGVBUEZsb2F0ICZSSFMpOworICBvcFN0YXR1cyBtb2QoY29uc3QgRG91YmxlQVBGbG9hdCAmUkhTKTsKKyAgb3BTdGF0dXMgZnVzZWRNdWx0aXBseUFkZChjb25zdCBEb3VibGVBUEZsb2F0ICZNdWx0aXBsaWNhbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG91YmxlQVBGbG9hdCAmQWRkZW5kLCByb3VuZGluZ01vZGUgUk0pOworICBvcFN0YXR1cyByb3VuZFRvSW50ZWdyYWwocm91bmRpbmdNb2RlIFJNKTsKKyAgdm9pZCBjaGFuZ2VTaWduKCk7CisgIGNtcFJlc3VsdCBjb21wYXJlQWJzb2x1dGVWYWx1ZShjb25zdCBEb3VibGVBUEZsb2F0ICZSSFMpIGNvbnN0OworCisgIGZsdENhdGVnb3J5IGdldENhdGVnb3J5KCkgY29uc3Q7CisgIGJvb2wgaXNOZWdhdGl2ZSgpIGNvbnN0OworCisgIHZvaWQgbWFrZUluZihib29sIE5lZyk7CisgIHZvaWQgbWFrZVplcm8oYm9vbCBOZWcpOworICB2b2lkIG1ha2VMYXJnZXN0KGJvb2wgTmVnKTsKKyAgdm9pZCBtYWtlU21hbGxlc3QoYm9vbCBOZWcpOworICB2b2lkIG1ha2VTbWFsbGVzdE5vcm1hbGl6ZWQoYm9vbCBOZWcpOworICB2b2lkIG1ha2VOYU4oYm9vbCBTTmFOLCBib29sIE5lZywgY29uc3QgQVBJbnQgKmZpbGwpOworCisgIGNtcFJlc3VsdCBjb21wYXJlKGNvbnN0IERvdWJsZUFQRmxvYXQgJlJIUykgY29uc3Q7CisgIGJvb2wgYml0d2lzZUlzRXF1YWwoY29uc3QgRG91YmxlQVBGbG9hdCAmUkhTKSBjb25zdDsKKyAgQVBJbnQgYml0Y2FzdFRvQVBJbnQoKSBjb25zdDsKKyAgb3BTdGF0dXMgY29udmVydEZyb21TdHJpbmcoU3RyaW5nUmVmLCByb3VuZGluZ01vZGUpOworICBvcFN0YXR1cyBuZXh0KGJvb2wgbmV4dERvd24pOworCisgIG9wU3RhdHVzIGNvbnZlcnRUb0ludGVnZXIoTXV0YWJsZUFycmF5UmVmPGludGVnZXJQYXJ0PiBJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgV2lkdGgsIGJvb2wgSXNTaWduZWQsIHJvdW5kaW5nTW9kZSBSTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICpJc0V4YWN0KSBjb25zdDsKKyAgb3BTdGF0dXMgY29udmVydEZyb21BUEludChjb25zdCBBUEludCAmSW5wdXQsIGJvb2wgSXNTaWduZWQsIHJvdW5kaW5nTW9kZSBSTSk7CisgIG9wU3RhdHVzIGNvbnZlcnRGcm9tU2lnbkV4dGVuZGVkSW50ZWdlcihjb25zdCBpbnRlZ2VyUGFydCAqSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgSW5wdXRTaXplLCBib29sIElzU2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRpbmdNb2RlIFJNKTsKKyAgb3BTdGF0dXMgY29udmVydEZyb21aZXJvRXh0ZW5kZWRJbnRlZ2VyKGNvbnN0IGludGVnZXJQYXJ0ICpJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBJbnB1dFNpemUsIGJvb2wgSXNTaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZGluZ01vZGUgUk0pOworICB1bnNpZ25lZCBpbnQgY29udmVydFRvSGV4U3RyaW5nKGNoYXIgKkRTVCwgdW5zaWduZWQgaW50IEhleERpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVwcGVyQ2FzZSwgcm91bmRpbmdNb2RlIFJNKSBjb25zdDsKKworICBib29sIGlzRGVub3JtYWwoKSBjb25zdDsKKyAgYm9vbCBpc1NtYWxsZXN0KCkgY29uc3Q7CisgIGJvb2wgaXNMYXJnZXN0KCkgY29uc3Q7CisgIGJvb2wgaXNJbnRlZ2VyKCkgY29uc3Q7CisKKyAgdm9pZCB0b1N0cmluZyhTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlN0ciwgdW5zaWduZWQgRm9ybWF0UHJlY2lzaW9uLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZvcm1hdE1heFBhZGRpbmcsIGJvb2wgVHJ1bmNhdGVaZXJvID0gdHJ1ZSkgY29uc3Q7CisKKyAgYm9vbCBnZXRFeGFjdEludmVyc2UoQVBGbG9hdCAqaW52KSBjb25zdDsKKworICBmcmllbmQgaW50IGlsb2diKGNvbnN0IERvdWJsZUFQRmxvYXQgJkFyZyk7CisgIGZyaWVuZCBEb3VibGVBUEZsb2F0IHNjYWxibihEb3VibGVBUEZsb2F0IFgsIGludCBFeHAsIHJvdW5kaW5nTW9kZSk7CisgIGZyaWVuZCBEb3VibGVBUEZsb2F0IGZyZXhwKGNvbnN0IERvdWJsZUFQRmxvYXQgJlgsIGludCAmRXhwLCByb3VuZGluZ01vZGUpOworICBmcmllbmQgaGFzaF9jb2RlIGhhc2hfdmFsdWUoY29uc3QgRG91YmxlQVBGbG9hdCAmQXJnKTsKK307CisKK2hhc2hfY29kZSBoYXNoX3ZhbHVlKGNvbnN0IERvdWJsZUFQRmxvYXQgJkFyZyk7CisKK30gLy8gRW5kIGRldGFpbCBuYW1lc3BhY2UKKworLy8gVGhpcyBpcyBhIGludGVyZmFjZSBjbGFzcyB0aGF0IGlzIGN1cnJlbnRseSBmb3J3YXJkaW5nIGZ1bmN0aW9uYWxpdGllcyBmcm9tCisvLyBkZXRhaWw6OklFRUVGbG9hdC4KK2NsYXNzIEFQRmxvYXQgOiBwdWJsaWMgQVBGbG9hdEJhc2UgeworICB0eXBlZGVmIGRldGFpbDo6SUVFRUZsb2F0IElFRUVGbG9hdDsKKyAgdHlwZWRlZiBkZXRhaWw6OkRvdWJsZUFQRmxvYXQgRG91YmxlQVBGbG9hdDsKKworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PElFRUVGbG9hdD46OnZhbHVlLCAiIik7CisKKyAgdW5pb24gU3RvcmFnZSB7CisgICAgY29uc3QgZmx0U2VtYW50aWNzICpzZW1hbnRpY3M7CisgICAgSUVFRUZsb2F0IElFRUU7CisgICAgRG91YmxlQVBGbG9hdCBEb3VibGU7CisKKyAgICBleHBsaWNpdCBTdG9yYWdlKElFRUVGbG9hdCBGLCBjb25zdCBmbHRTZW1hbnRpY3MgJlMpOworICAgIGV4cGxpY2l0IFN0b3JhZ2UoRG91YmxlQVBGbG9hdCBGLCBjb25zdCBmbHRTZW1hbnRpY3MgJlMpCisgICAgICAgIDogRG91YmxlKHN0ZDo6bW92ZShGKSkgeworICAgICAgYXNzZXJ0KCZTID09ICZQUENEb3VibGVEb3VibGUoKSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ1R5cGVzPgorICAgIFN0b3JhZ2UoY29uc3QgZmx0U2VtYW50aWNzICZTZW1hbnRpY3MsIEFyZ1R5cGVzICYmLi4uIEFyZ3MpIHsKKyAgICAgIGlmICh1c2VzTGF5b3V0PElFRUVGbG9hdD4oU2VtYW50aWNzKSkgeworICAgICAgICBuZXcgKCZJRUVFKSBJRUVFRmxvYXQoU2VtYW50aWNzLCBzdGQ6OmZvcndhcmQ8QXJnVHlwZXM+KEFyZ3MpLi4uKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKHVzZXNMYXlvdXQ8RG91YmxlQVBGbG9hdD4oU2VtYW50aWNzKSkgeworICAgICAgICBuZXcgKCZEb3VibGUpIERvdWJsZUFQRmxvYXQoU2VtYW50aWNzLCBzdGQ6OmZvcndhcmQ8QXJnVHlwZXM+KEFyZ3MpLi4uKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBzZW1hbnRpY3MiKTsKKyAgICB9CisKKyAgICB+U3RvcmFnZSgpIHsKKyAgICAgIGlmICh1c2VzTGF5b3V0PElFRUVGbG9hdD4oKnNlbWFudGljcykpIHsKKyAgICAgICAgSUVFRS5+SUVFRUZsb2F0KCk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmICh1c2VzTGF5b3V0PERvdWJsZUFQRmxvYXQ+KCpzZW1hbnRpY3MpKSB7CisgICAgICAgIERvdWJsZS5+RG91YmxlQVBGbG9hdCgpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIHNlbWFudGljcyIpOworICAgIH0KKworICAgIFN0b3JhZ2UoY29uc3QgU3RvcmFnZSAmUkhTKSB7CisgICAgICBpZiAodXNlc0xheW91dDxJRUVFRmxvYXQ+KCpSSFMuc2VtYW50aWNzKSkgeworICAgICAgICBuZXcgKHRoaXMpIElFRUVGbG9hdChSSFMuSUVFRSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGlmICh1c2VzTGF5b3V0PERvdWJsZUFQRmxvYXQ+KCpSSFMuc2VtYW50aWNzKSkgeworICAgICAgICBuZXcgKHRoaXMpIERvdWJsZUFQRmxvYXQoUkhTLkRvdWJsZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgc2VtYW50aWNzIik7CisgICAgfQorCisgICAgU3RvcmFnZShTdG9yYWdlICYmUkhTKSB7CisgICAgICBpZiAodXNlc0xheW91dDxJRUVFRmxvYXQ+KCpSSFMuc2VtYW50aWNzKSkgeworICAgICAgICBuZXcgKHRoaXMpIElFRUVGbG9hdChzdGQ6Om1vdmUoUkhTLklFRUUpKTsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgICAgaWYgKHVzZXNMYXlvdXQ8RG91YmxlQVBGbG9hdD4oKlJIUy5zZW1hbnRpY3MpKSB7CisgICAgICAgIG5ldyAodGhpcykgRG91YmxlQVBGbG9hdChzdGQ6Om1vdmUoUkhTLkRvdWJsZSkpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIHNlbWFudGljcyIpOworICAgIH0KKworICAgIFN0b3JhZ2UgJm9wZXJhdG9yPShjb25zdCBTdG9yYWdlICZSSFMpIHsKKyAgICAgIGlmICh1c2VzTGF5b3V0PElFRUVGbG9hdD4oKnNlbWFudGljcykgJiYKKyAgICAgICAgICB1c2VzTGF5b3V0PElFRUVGbG9hdD4oKlJIUy5zZW1hbnRpY3MpKSB7CisgICAgICAgIElFRUUgPSBSSFMuSUVFRTsKKyAgICAgIH0gZWxzZSBpZiAodXNlc0xheW91dDxEb3VibGVBUEZsb2F0Pigqc2VtYW50aWNzKSAmJgorICAgICAgICAgICAgICAgICB1c2VzTGF5b3V0PERvdWJsZUFQRmxvYXQ+KCpSSFMuc2VtYW50aWNzKSkgeworICAgICAgICBEb3VibGUgPSBSSFMuRG91YmxlOworICAgICAgfSBlbHNlIGlmICh0aGlzICE9ICZSSFMpIHsKKyAgICAgICAgdGhpcy0+flN0b3JhZ2UoKTsKKyAgICAgICAgbmV3ICh0aGlzKSBTdG9yYWdlKFJIUyk7CisgICAgICB9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgU3RvcmFnZSAmb3BlcmF0b3I9KFN0b3JhZ2UgJiZSSFMpIHsKKyAgICAgIGlmICh1c2VzTGF5b3V0PElFRUVGbG9hdD4oKnNlbWFudGljcykgJiYKKyAgICAgICAgICB1c2VzTGF5b3V0PElFRUVGbG9hdD4oKlJIUy5zZW1hbnRpY3MpKSB7CisgICAgICAgIElFRUUgPSBzdGQ6Om1vdmUoUkhTLklFRUUpOworICAgICAgfSBlbHNlIGlmICh1c2VzTGF5b3V0PERvdWJsZUFQRmxvYXQ+KCpzZW1hbnRpY3MpICYmCisgICAgICAgICAgICAgICAgIHVzZXNMYXlvdXQ8RG91YmxlQVBGbG9hdD4oKlJIUy5zZW1hbnRpY3MpKSB7CisgICAgICAgIERvdWJsZSA9IHN0ZDo6bW92ZShSSFMuRG91YmxlKTsKKyAgICAgIH0gZWxzZSBpZiAodGhpcyAhPSAmUkhTKSB7CisgICAgICAgIHRoaXMtPn5TdG9yYWdlKCk7CisgICAgICAgIG5ldyAodGhpcykgU3RvcmFnZShzdGQ6Om1vdmUoUkhTKSk7CisgICAgICB9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICB9IFU7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0YXRpYyBib29sIHVzZXNMYXlvdXQoY29uc3QgZmx0U2VtYW50aWNzICZTZW1hbnRpY3MpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc2FtZTxULCBJRUVFRmxvYXQ+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgc3RkOjppc19zYW1lPFQsIERvdWJsZUFQRmxvYXQ+Ojp2YWx1ZSwgIiIpOworICAgIGlmIChzdGQ6OmlzX3NhbWU8VCwgRG91YmxlQVBGbG9hdD46OnZhbHVlKSB7CisgICAgICByZXR1cm4gJlNlbWFudGljcyA9PSAmUFBDRG91YmxlRG91YmxlKCk7CisgICAgfQorICAgIHJldHVybiAmU2VtYW50aWNzICE9ICZQUENEb3VibGVEb3VibGUoKTsKKyAgfQorCisgIElFRUVGbG9hdCAmZ2V0SUVFRSgpIHsKKyAgICBpZiAodXNlc0xheW91dDxJRUVFRmxvYXQ+KCpVLnNlbWFudGljcykpCisgICAgICByZXR1cm4gVS5JRUVFOworICAgIGlmICh1c2VzTGF5b3V0PERvdWJsZUFQRmxvYXQ+KCpVLnNlbWFudGljcykpCisgICAgICByZXR1cm4gVS5Eb3VibGUuZ2V0Rmlyc3QoKS5VLklFRUU7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBzZW1hbnRpY3MiKTsKKyAgfQorCisgIGNvbnN0IElFRUVGbG9hdCAmZ2V0SUVFRSgpIGNvbnN0IHsKKyAgICBpZiAodXNlc0xheW91dDxJRUVFRmxvYXQ+KCpVLnNlbWFudGljcykpCisgICAgICByZXR1cm4gVS5JRUVFOworICAgIGlmICh1c2VzTGF5b3V0PERvdWJsZUFQRmxvYXQ+KCpVLnNlbWFudGljcykpCisgICAgICByZXR1cm4gVS5Eb3VibGUuZ2V0Rmlyc3QoKS5VLklFRUU7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBzZW1hbnRpY3MiKTsKKyAgfQorCisgIHZvaWQgbWFrZVplcm8oYm9vbCBOZWcpIHsgQVBGTE9BVF9ESVNQQVRDSF9PTl9TRU1BTlRJQ1MobWFrZVplcm8oTmVnKSk7IH0KKworICB2b2lkIG1ha2VJbmYoYm9vbCBOZWcpIHsgQVBGTE9BVF9ESVNQQVRDSF9PTl9TRU1BTlRJQ1MobWFrZUluZihOZWcpKTsgfQorCisgIHZvaWQgbWFrZU5hTihib29sIFNOYU4sIGJvb2wgTmVnLCBjb25zdCBBUEludCAqZmlsbCkgeworICAgIEFQRkxPQVRfRElTUEFUQ0hfT05fU0VNQU5USUNTKG1ha2VOYU4oU05hTiwgTmVnLCBmaWxsKSk7CisgIH0KKworICB2b2lkIG1ha2VMYXJnZXN0KGJvb2wgTmVnKSB7CisgICAgQVBGTE9BVF9ESVNQQVRDSF9PTl9TRU1BTlRJQ1MobWFrZUxhcmdlc3QoTmVnKSk7CisgIH0KKworICB2b2lkIG1ha2VTbWFsbGVzdChib29sIE5lZykgeworICAgIEFQRkxPQVRfRElTUEFUQ0hfT05fU0VNQU5USUNTKG1ha2VTbWFsbGVzdChOZWcpKTsKKyAgfQorCisgIHZvaWQgbWFrZVNtYWxsZXN0Tm9ybWFsaXplZChib29sIE5lZykgeworICAgIEFQRkxPQVRfRElTUEFUQ0hfT05fU0VNQU5USUNTKG1ha2VTbWFsbGVzdE5vcm1hbGl6ZWQoTmVnKSk7CisgIH0KKworICAvLyBGSVhNRTogVGhpcyBpcyBkdWUgdG8gY2xhbmcgMy4zIChvciBvbGRlciB2ZXJzaW9uKSBhbHdheXMgY2hlY2tzIGZvciB0aGUKKyAgLy8gZGVmYXVsdCBjb25zdHJ1Y3RvciBpbiBhbiBhcnJheSBhZ2dyZWdhdGUgaW5pdGlhbGl6YXRpb24sIGV2ZW4gaWYgbm8KKyAgLy8gZWxlbWVudHMgaW4gdGhlIGFycmF5IGlzIGRlZmF1bHQgaW5pdGlhbGl6ZWQuCisgIEFQRmxvYXQoKSA6IFUoSUVFRWRvdWJsZSgpKSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIG9sZCBjbGFuZy4iKTsKKyAgfQorCisgIGV4cGxpY2l0IEFQRmxvYXQoSUVFRUZsb2F0IEYsIGNvbnN0IGZsdFNlbWFudGljcyAmUykgOiBVKHN0ZDo6bW92ZShGKSwgUykge30KKyAgZXhwbGljaXQgQVBGbG9hdChEb3VibGVBUEZsb2F0IEYsIGNvbnN0IGZsdFNlbWFudGljcyAmUykKKyAgICAgIDogVShzdGQ6Om1vdmUoRiksIFMpIHt9CisKKyAgY21wUmVzdWx0IGNvbXBhcmVBYnNvbHV0ZVZhbHVlKGNvbnN0IEFQRmxvYXQgJlJIUykgY29uc3QgeworICAgIGFzc2VydCgmZ2V0U2VtYW50aWNzKCkgPT0gJlJIUy5nZXRTZW1hbnRpY3MoKSAmJgorICAgICAgICAgICAiU2hvdWxkIG9ubHkgY29tcGFyZSBBUEZsb2F0cyB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyIpOworICAgIGlmICh1c2VzTGF5b3V0PElFRUVGbG9hdD4oZ2V0U2VtYW50aWNzKCkpKQorICAgICAgcmV0dXJuIFUuSUVFRS5jb21wYXJlQWJzb2x1dGVWYWx1ZShSSFMuVS5JRUVFKTsKKyAgICBpZiAodXNlc0xheW91dDxEb3VibGVBUEZsb2F0PihnZXRTZW1hbnRpY3MoKSkpCisgICAgICByZXR1cm4gVS5Eb3VibGUuY29tcGFyZUFic29sdXRlVmFsdWUoUkhTLlUuRG91YmxlKTsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIHNlbWFudGljcyIpOworICB9CisKK3B1YmxpYzoKKyAgQVBGbG9hdChjb25zdCBmbHRTZW1hbnRpY3MgJlNlbWFudGljcykgOiBVKFNlbWFudGljcykge30KKyAgQVBGbG9hdChjb25zdCBmbHRTZW1hbnRpY3MgJlNlbWFudGljcywgU3RyaW5nUmVmIFMpOworICBBUEZsb2F0KGNvbnN0IGZsdFNlbWFudGljcyAmU2VtYW50aWNzLCBpbnRlZ2VyUGFydCBJKSA6IFUoU2VtYW50aWNzLCBJKSB7fQorICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBjb25zdHJ1Y3Rvci4gVGhpcyBpc24ndCBmYXN0ZXIgdGhhbiB0aGUgZmlyc3Qgb25lLgorICBBUEZsb2F0KGNvbnN0IGZsdFNlbWFudGljcyAmU2VtYW50aWNzLCB1bmluaXRpYWxpemVkVGFnKQorICAgICAgOiBVKFNlbWFudGljcywgdW5pbml0aWFsaXplZCkge30KKyAgQVBGbG9hdChjb25zdCBmbHRTZW1hbnRpY3MgJlNlbWFudGljcywgY29uc3QgQVBJbnQgJkkpIDogVShTZW1hbnRpY3MsIEkpIHt9CisgIGV4cGxpY2l0IEFQRmxvYXQoZG91YmxlIGQpIDogVShJRUVFRmxvYXQoZCksIElFRUVkb3VibGUoKSkge30KKyAgZXhwbGljaXQgQVBGbG9hdChmbG9hdCBmKSA6IFUoSUVFRUZsb2F0KGYpLCBJRUVFc2luZ2xlKCkpIHt9CisgIEFQRmxvYXQoY29uc3QgQVBGbG9hdCAmUkhTKSA9IGRlZmF1bHQ7CisgIEFQRmxvYXQoQVBGbG9hdCAmJlJIUykgPSBkZWZhdWx0OworCisgIH5BUEZsb2F0KCkgPSBkZWZhdWx0OworCisgIGJvb2wgbmVlZHNDbGVhbnVwKCkgY29uc3QgeyBBUEZMT0FUX0RJU1BBVENIX09OX1NFTUFOVElDUyhuZWVkc0NsZWFudXAoKSk7IH0KKworICAvLy8gRmFjdG9yeSBmb3IgUG9zaXRpdmUgYW5kIE5lZ2F0aXZlIFplcm8uCisgIC8vLworICAvLy8gXHBhcmFtIE5lZ2F0aXZlIFRydWUgaWZmIHRoZSBudW1iZXIgc2hvdWxkIGJlIG5lZ2F0aXZlLgorICBzdGF0aWMgQVBGbG9hdCBnZXRaZXJvKGNvbnN0IGZsdFNlbWFudGljcyAmU2VtLCBib29sIE5lZ2F0aXZlID0gZmFsc2UpIHsKKyAgICBBUEZsb2F0IFZhbChTZW0sIHVuaW5pdGlhbGl6ZWQpOworICAgIFZhbC5tYWtlWmVybyhOZWdhdGl2ZSk7CisgICAgcmV0dXJuIFZhbDsKKyAgfQorCisgIC8vLyBGYWN0b3J5IGZvciBQb3NpdGl2ZSBhbmQgTmVnYXRpdmUgSW5maW5pdHkuCisgIC8vLworICAvLy8gXHBhcmFtIE5lZ2F0aXZlIFRydWUgaWZmIHRoZSBudW1iZXIgc2hvdWxkIGJlIG5lZ2F0aXZlLgorICBzdGF0aWMgQVBGbG9hdCBnZXRJbmYoY29uc3QgZmx0U2VtYW50aWNzICZTZW0sIGJvb2wgTmVnYXRpdmUgPSBmYWxzZSkgeworICAgIEFQRmxvYXQgVmFsKFNlbSwgdW5pbml0aWFsaXplZCk7CisgICAgVmFsLm1ha2VJbmYoTmVnYXRpdmUpOworICAgIHJldHVybiBWYWw7CisgIH0KKworICAvLy8gRmFjdG9yeSBmb3IgTmFOIHZhbHVlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gTmVnYXRpdmUgLSBUcnVlIGlmZiB0aGUgTmFOIGdlbmVyYXRlZCBzaG91bGQgYmUgbmVnYXRpdmUuCisgIC8vLyBccGFyYW0gdHlwZSAtIFRoZSB1bnNwZWNpZmllZCBmaWxsIGJpdHMgZm9yIGNyZWF0aW5nIHRoZSBOYU4sIDAgYnkKKyAgLy8vIGRlZmF1bHQuICBUaGUgdmFsdWUgaXMgdHJ1bmNhdGVkIGFzIG5lY2Vzc2FyeS4KKyAgc3RhdGljIEFQRmxvYXQgZ2V0TmFOKGNvbnN0IGZsdFNlbWFudGljcyAmU2VtLCBib29sIE5lZ2F0aXZlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCB0eXBlID0gMCkgeworICAgIGlmICh0eXBlKSB7CisgICAgICBBUEludCBmaWxsKDY0LCB0eXBlKTsKKyAgICAgIHJldHVybiBnZXRRTmFOKFNlbSwgTmVnYXRpdmUsICZmaWxsKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGdldFFOYU4oU2VtLCBOZWdhdGl2ZSwgbnVsbHB0cik7CisgICAgfQorICB9CisKKyAgLy8vIEZhY3RvcnkgZm9yIFFOYU4gdmFsdWVzLgorICBzdGF0aWMgQVBGbG9hdCBnZXRRTmFOKGNvbnN0IGZsdFNlbWFudGljcyAmU2VtLCBib29sIE5lZ2F0aXZlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBJbnQgKnBheWxvYWQgPSBudWxscHRyKSB7CisgICAgQVBGbG9hdCBWYWwoU2VtLCB1bmluaXRpYWxpemVkKTsKKyAgICBWYWwubWFrZU5hTihmYWxzZSwgTmVnYXRpdmUsIHBheWxvYWQpOworICAgIHJldHVybiBWYWw7CisgIH0KKworICAvLy8gRmFjdG9yeSBmb3IgU05hTiB2YWx1ZXMuCisgIHN0YXRpYyBBUEZsb2F0IGdldFNOYU4oY29uc3QgZmx0U2VtYW50aWNzICZTZW0sIGJvb2wgTmVnYXRpdmUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUEludCAqcGF5bG9hZCA9IG51bGxwdHIpIHsKKyAgICBBUEZsb2F0IFZhbChTZW0sIHVuaW5pdGlhbGl6ZWQpOworICAgIFZhbC5tYWtlTmFOKHRydWUsIE5lZ2F0aXZlLCBwYXlsb2FkKTsKKyAgICByZXR1cm4gVmFsOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIGxhcmdlc3QgZmluaXRlIG51bWJlciBpbiB0aGUgZ2l2ZW4gc2VtYW50aWNzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOZWdhdGl2ZSAtIFRydWUgaWZmIHRoZSBudW1iZXIgc2hvdWxkIGJlIG5lZ2F0aXZlCisgIHN0YXRpYyBBUEZsb2F0IGdldExhcmdlc3QoY29uc3QgZmx0U2VtYW50aWNzICZTZW0sIGJvb2wgTmVnYXRpdmUgPSBmYWxzZSkgeworICAgIEFQRmxvYXQgVmFsKFNlbSwgdW5pbml0aWFsaXplZCk7CisgICAgVmFsLm1ha2VMYXJnZXN0KE5lZ2F0aXZlKTsKKyAgICByZXR1cm4gVmFsOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHNtYWxsZXN0IChieSBtYWduaXR1ZGUpIGZpbml0ZSBudW1iZXIgaW4gdGhlIGdpdmVuIHNlbWFudGljcy4KKyAgLy8vIE1pZ2h0IGJlIGRlbm9ybWFsaXplZCwgd2hpY2ggaW1wbGllcyBhIHJlbGF0aXZlIGxvc3Mgb2YgcHJlY2lzaW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOZWdhdGl2ZSAtIFRydWUgaWZmIHRoZSBudW1iZXIgc2hvdWxkIGJlIG5lZ2F0aXZlCisgIHN0YXRpYyBBUEZsb2F0IGdldFNtYWxsZXN0KGNvbnN0IGZsdFNlbWFudGljcyAmU2VtLCBib29sIE5lZ2F0aXZlID0gZmFsc2UpIHsKKyAgICBBUEZsb2F0IFZhbChTZW0sIHVuaW5pdGlhbGl6ZWQpOworICAgIFZhbC5tYWtlU21hbGxlc3QoTmVnYXRpdmUpOworICAgIHJldHVybiBWYWw7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgc21hbGxlc3QgKGJ5IG1hZ25pdHVkZSkgbm9ybWFsaXplZCBmaW5pdGUgbnVtYmVyIGluIHRoZSBnaXZlbgorICAvLy8gc2VtYW50aWNzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOZWdhdGl2ZSAtIFRydWUgaWZmIHRoZSBudW1iZXIgc2hvdWxkIGJlIG5lZ2F0aXZlCisgIHN0YXRpYyBBUEZsb2F0IGdldFNtYWxsZXN0Tm9ybWFsaXplZChjb25zdCBmbHRTZW1hbnRpY3MgJlNlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTmVnYXRpdmUgPSBmYWxzZSkgeworICAgIEFQRmxvYXQgVmFsKFNlbSwgdW5pbml0aWFsaXplZCk7CisgICAgVmFsLm1ha2VTbWFsbGVzdE5vcm1hbGl6ZWQoTmVnYXRpdmUpOworICAgIHJldHVybiBWYWw7CisgIH0KKworICAvLy8gUmV0dXJucyBhIGZsb2F0IHdoaWNoIGlzIGJpdGNhc3RlZCBmcm9tIGFuIGFsbCBvbmUgdmFsdWUgaW50LgorICAvLy8KKyAgLy8vIFxwYXJhbSBCaXRXaWR0aCAtIFNlbGVjdCBmbG9hdCB0eXBlCisgIC8vLyBccGFyYW0gaXNJRUVFICAgLSBJZiAxMjggYml0IG51bWJlciwgc2VsZWN0IGJldHdlZW4gUFBDIGFuZCBJRUVFCisgIHN0YXRpYyBBUEZsb2F0IGdldEFsbE9uZXNWYWx1ZSh1bnNpZ25lZCBCaXRXaWR0aCwgYm9vbCBpc0lFRUUgPSBmYWxzZSk7CisKKyAgLy8vIFVzZWQgdG8gaW5zZXJ0IEFQRmxvYXQgb2JqZWN0cywgb3Igb2JqZWN0cyB0aGF0IGNvbnRhaW4gQVBGbG9hdCBvYmplY3RzLAorICAvLy8gaW50byBGb2xkaW5nU2V0cy4KKyAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJk5JRCkgY29uc3Q7CisKKyAgb3BTdGF0dXMgYWRkKGNvbnN0IEFQRmxvYXQgJlJIUywgcm91bmRpbmdNb2RlIFJNKSB7CisgICAgYXNzZXJ0KCZnZXRTZW1hbnRpY3MoKSA9PSAmUkhTLmdldFNlbWFudGljcygpICYmCisgICAgICAgICAgICJTaG91bGQgb25seSBjYWxsIG9uIHR3byBBUEZsb2F0cyB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyIpOworICAgIGlmICh1c2VzTGF5b3V0PElFRUVGbG9hdD4oZ2V0U2VtYW50aWNzKCkpKQorICAgICAgcmV0dXJuIFUuSUVFRS5hZGQoUkhTLlUuSUVFRSwgUk0pOworICAgIGlmICh1c2VzTGF5b3V0PERvdWJsZUFQRmxvYXQ+KGdldFNlbWFudGljcygpKSkKKyAgICAgIHJldHVybiBVLkRvdWJsZS5hZGQoUkhTLlUuRG91YmxlLCBSTSk7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBzZW1hbnRpY3MiKTsKKyAgfQorICBvcFN0YXR1cyBzdWJ0cmFjdChjb25zdCBBUEZsb2F0ICZSSFMsIHJvdW5kaW5nTW9kZSBSTSkgeworICAgIGFzc2VydCgmZ2V0U2VtYW50aWNzKCkgPT0gJlJIUy5nZXRTZW1hbnRpY3MoKSAmJgorICAgICAgICAgICAiU2hvdWxkIG9ubHkgY2FsbCBvbiB0d28gQVBGbG9hdHMgd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MiKTsKKyAgICBpZiAodXNlc0xheW91dDxJRUVFRmxvYXQ+KGdldFNlbWFudGljcygpKSkKKyAgICAgIHJldHVybiBVLklFRUUuc3VidHJhY3QoUkhTLlUuSUVFRSwgUk0pOworICAgIGlmICh1c2VzTGF5b3V0PERvdWJsZUFQRmxvYXQ+KGdldFNlbWFudGljcygpKSkKKyAgICAgIHJldHVybiBVLkRvdWJsZS5zdWJ0cmFjdChSSFMuVS5Eb3VibGUsIFJNKTsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIHNlbWFudGljcyIpOworICB9CisgIG9wU3RhdHVzIG11bHRpcGx5KGNvbnN0IEFQRmxvYXQgJlJIUywgcm91bmRpbmdNb2RlIFJNKSB7CisgICAgYXNzZXJ0KCZnZXRTZW1hbnRpY3MoKSA9PSAmUkhTLmdldFNlbWFudGljcygpICYmCisgICAgICAgICAgICJTaG91bGQgb25seSBjYWxsIG9uIHR3byBBUEZsb2F0cyB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyIpOworICAgIGlmICh1c2VzTGF5b3V0PElFRUVGbG9hdD4oZ2V0U2VtYW50aWNzKCkpKQorICAgICAgcmV0dXJuIFUuSUVFRS5tdWx0aXBseShSSFMuVS5JRUVFLCBSTSk7CisgICAgaWYgKHVzZXNMYXlvdXQ8RG91YmxlQVBGbG9hdD4oZ2V0U2VtYW50aWNzKCkpKQorICAgICAgcmV0dXJuIFUuRG91YmxlLm11bHRpcGx5KFJIUy5VLkRvdWJsZSwgUk0pOworICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgc2VtYW50aWNzIik7CisgIH0KKyAgb3BTdGF0dXMgZGl2aWRlKGNvbnN0IEFQRmxvYXQgJlJIUywgcm91bmRpbmdNb2RlIFJNKSB7CisgICAgYXNzZXJ0KCZnZXRTZW1hbnRpY3MoKSA9PSAmUkhTLmdldFNlbWFudGljcygpICYmCisgICAgICAgICAgICJTaG91bGQgb25seSBjYWxsIG9uIHR3byBBUEZsb2F0cyB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyIpOworICAgIGlmICh1c2VzTGF5b3V0PElFRUVGbG9hdD4oZ2V0U2VtYW50aWNzKCkpKQorICAgICAgcmV0dXJuIFUuSUVFRS5kaXZpZGUoUkhTLlUuSUVFRSwgUk0pOworICAgIGlmICh1c2VzTGF5b3V0PERvdWJsZUFQRmxvYXQ+KGdldFNlbWFudGljcygpKSkKKyAgICAgIHJldHVybiBVLkRvdWJsZS5kaXZpZGUoUkhTLlUuRG91YmxlLCBSTSk7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBzZW1hbnRpY3MiKTsKKyAgfQorICBvcFN0YXR1cyByZW1haW5kZXIoY29uc3QgQVBGbG9hdCAmUkhTKSB7CisgICAgYXNzZXJ0KCZnZXRTZW1hbnRpY3MoKSA9PSAmUkhTLmdldFNlbWFudGljcygpICYmCisgICAgICAgICAgICJTaG91bGQgb25seSBjYWxsIG9uIHR3byBBUEZsb2F0cyB3aXRoIHRoZSBzYW1lIHNlbWFudGljcyIpOworICAgIGlmICh1c2VzTGF5b3V0PElFRUVGbG9hdD4oZ2V0U2VtYW50aWNzKCkpKQorICAgICAgcmV0dXJuIFUuSUVFRS5yZW1haW5kZXIoUkhTLlUuSUVFRSk7CisgICAgaWYgKHVzZXNMYXlvdXQ8RG91YmxlQVBGbG9hdD4oZ2V0U2VtYW50aWNzKCkpKQorICAgICAgcmV0dXJuIFUuRG91YmxlLnJlbWFpbmRlcihSSFMuVS5Eb3VibGUpOworICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgc2VtYW50aWNzIik7CisgIH0KKyAgb3BTdGF0dXMgbW9kKGNvbnN0IEFQRmxvYXQgJlJIUykgeworICAgIGFzc2VydCgmZ2V0U2VtYW50aWNzKCkgPT0gJlJIUy5nZXRTZW1hbnRpY3MoKSAmJgorICAgICAgICAgICAiU2hvdWxkIG9ubHkgY2FsbCBvbiB0d28gQVBGbG9hdHMgd2l0aCB0aGUgc2FtZSBzZW1hbnRpY3MiKTsKKyAgICBpZiAodXNlc0xheW91dDxJRUVFRmxvYXQ+KGdldFNlbWFudGljcygpKSkKKyAgICAgIHJldHVybiBVLklFRUUubW9kKFJIUy5VLklFRUUpOworICAgIGlmICh1c2VzTGF5b3V0PERvdWJsZUFQRmxvYXQ+KGdldFNlbWFudGljcygpKSkKKyAgICAgIHJldHVybiBVLkRvdWJsZS5tb2QoUkhTLlUuRG91YmxlKTsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIHNlbWFudGljcyIpOworICB9CisgIG9wU3RhdHVzIGZ1c2VkTXVsdGlwbHlBZGQoY29uc3QgQVBGbG9hdCAmTXVsdGlwbGljYW5kLCBjb25zdCBBUEZsb2F0ICZBZGRlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm91bmRpbmdNb2RlIFJNKSB7CisgICAgYXNzZXJ0KCZnZXRTZW1hbnRpY3MoKSA9PSAmTXVsdGlwbGljYW5kLmdldFNlbWFudGljcygpICYmCisgICAgICAgICAgICJTaG91bGQgb25seSBjYWxsIG9uIEFQRmxvYXRzIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIik7CisgICAgYXNzZXJ0KCZnZXRTZW1hbnRpY3MoKSA9PSAmQWRkZW5kLmdldFNlbWFudGljcygpICYmCisgICAgICAgICAgICJTaG91bGQgb25seSBjYWxsIG9uIEFQRmxvYXRzIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIik7CisgICAgaWYgKHVzZXNMYXlvdXQ8SUVFRUZsb2F0PihnZXRTZW1hbnRpY3MoKSkpCisgICAgICByZXR1cm4gVS5JRUVFLmZ1c2VkTXVsdGlwbHlBZGQoTXVsdGlwbGljYW5kLlUuSUVFRSwgQWRkZW5kLlUuSUVFRSwgUk0pOworICAgIGlmICh1c2VzTGF5b3V0PERvdWJsZUFQRmxvYXQ+KGdldFNlbWFudGljcygpKSkKKyAgICAgIHJldHVybiBVLkRvdWJsZS5mdXNlZE11bHRpcGx5QWRkKE11bHRpcGxpY2FuZC5VLkRvdWJsZSwgQWRkZW5kLlUuRG91YmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUk0pOworICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgc2VtYW50aWNzIik7CisgIH0KKyAgb3BTdGF0dXMgcm91bmRUb0ludGVncmFsKHJvdW5kaW5nTW9kZSBSTSkgeworICAgIEFQRkxPQVRfRElTUEFUQ0hfT05fU0VNQU5USUNTKHJvdW5kVG9JbnRlZ3JhbChSTSkpOworICB9CisKKyAgLy8gVE9ETzogYm9vbCBwYXJhbWV0ZXJzIGFyZSBub3QgcmVhZGFibGUgYW5kIGEgc291cmNlIG9mIGJ1Z3MuCisgIC8vIERvIHNvbWV0aGluZy4KKyAgb3BTdGF0dXMgbmV4dChib29sIG5leHREb3duKSB7CisgICAgQVBGTE9BVF9ESVNQQVRDSF9PTl9TRU1BTlRJQ1MobmV4dChuZXh0RG93bikpOworICB9CisKKyAgLy8vIEFkZCB0d28gQVBGbG9hdHMsIHJvdW5kaW5nIHRpZXMgdG8gdGhlIG5lYXJlc3QgZXZlbi4KKyAgLy8vIE5vIGVycm9yIGNoZWNraW5nLgorICBBUEZsb2F0IG9wZXJhdG9yKyhjb25zdCBBUEZsb2F0ICZSSFMpIGNvbnN0IHsKKyAgICBBUEZsb2F0IFJlc3VsdCgqdGhpcyk7CisgICAgKHZvaWQpUmVzdWx0LmFkZChSSFMsIHJtTmVhcmVzdFRpZXNUb0V2ZW4pOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICAvLy8gU3VidHJhY3QgdHdvIEFQRmxvYXRzLCByb3VuZGluZyB0aWVzIHRvIHRoZSBuZWFyZXN0IGV2ZW4uCisgIC8vLyBObyBlcnJvciBjaGVja2luZy4KKyAgQVBGbG9hdCBvcGVyYXRvci0oY29uc3QgQVBGbG9hdCAmUkhTKSBjb25zdCB7CisgICAgQVBGbG9hdCBSZXN1bHQoKnRoaXMpOworICAgICh2b2lkKVJlc3VsdC5zdWJ0cmFjdChSSFMsIHJtTmVhcmVzdFRpZXNUb0V2ZW4pOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICAvLy8gTXVsdGlwbHkgdHdvIEFQRmxvYXRzLCByb3VuZGluZyB0aWVzIHRvIHRoZSBuZWFyZXN0IGV2ZW4uCisgIC8vLyBObyBlcnJvciBjaGVja2luZy4KKyAgQVBGbG9hdCBvcGVyYXRvciooY29uc3QgQVBGbG9hdCAmUkhTKSBjb25zdCB7CisgICAgQVBGbG9hdCBSZXN1bHQoKnRoaXMpOworICAgICh2b2lkKVJlc3VsdC5tdWx0aXBseShSSFMsIHJtTmVhcmVzdFRpZXNUb0V2ZW4pOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICAvLy8gRGl2aWRlIHRoZSBmaXJzdCBBUEZsb2F0IGJ5IHRoZSBzZWNvbmQsIHJvdW5kaW5nIHRpZXMgdG8gdGhlIG5lYXJlc3QgZXZlbi4KKyAgLy8vIE5vIGVycm9yIGNoZWNraW5nLgorICBBUEZsb2F0IG9wZXJhdG9yLyhjb25zdCBBUEZsb2F0ICZSSFMpIGNvbnN0IHsKKyAgICBBUEZsb2F0IFJlc3VsdCgqdGhpcyk7CisgICAgKHZvaWQpUmVzdWx0LmRpdmlkZShSSFMsIHJtTmVhcmVzdFRpZXNUb0V2ZW4pOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICB2b2lkIGNoYW5nZVNpZ24oKSB7IEFQRkxPQVRfRElTUEFUQ0hfT05fU0VNQU5USUNTKGNoYW5nZVNpZ24oKSk7IH0KKyAgdm9pZCBjbGVhclNpZ24oKSB7CisgICAgaWYgKGlzTmVnYXRpdmUoKSkKKyAgICAgIGNoYW5nZVNpZ24oKTsKKyAgfQorICB2b2lkIGNvcHlTaWduKGNvbnN0IEFQRmxvYXQgJlJIUykgeworICAgIGlmIChpc05lZ2F0aXZlKCkgIT0gUkhTLmlzTmVnYXRpdmUoKSkKKyAgICAgIGNoYW5nZVNpZ24oKTsKKyAgfQorCisgIC8vLyBBIHN0YXRpYyBoZWxwZXIgdG8gcHJvZHVjZSBhIGNvcHkgb2YgYW4gQVBGbG9hdCB2YWx1ZSB3aXRoIGl0cyBzaWduCisgIC8vLyBjb3BpZWQgZnJvbSBzb21lIG90aGVyIEFQRmxvYXQuCisgIHN0YXRpYyBBUEZsb2F0IGNvcHlTaWduKEFQRmxvYXQgVmFsdWUsIGNvbnN0IEFQRmxvYXQgJlNpZ24pIHsKKyAgICBWYWx1ZS5jb3B5U2lnbihTaWduKTsKKyAgICByZXR1cm4gVmFsdWU7CisgIH0KKworICBvcFN0YXR1cyBjb252ZXJ0KGNvbnN0IGZsdFNlbWFudGljcyAmVG9TZW1hbnRpY3MsIHJvdW5kaW5nTW9kZSBSTSwKKyAgICAgICAgICAgICAgICAgICBib29sICpsb3Nlc0luZm8pOworICBvcFN0YXR1cyBjb252ZXJ0VG9JbnRlZ2VyKE11dGFibGVBcnJheVJlZjxpbnRlZ2VyUGFydD4gSW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IFdpZHRoLCBib29sIElzU2lnbmVkLCByb3VuZGluZ01vZGUgUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqSXNFeGFjdCkgY29uc3QgeworICAgIEFQRkxPQVRfRElTUEFUQ0hfT05fU0VNQU5USUNTKAorICAgICAgICBjb252ZXJ0VG9JbnRlZ2VyKElucHV0LCBXaWR0aCwgSXNTaWduZWQsIFJNLCBJc0V4YWN0KSk7CisgIH0KKyAgb3BTdGF0dXMgY29udmVydFRvSW50ZWdlcihBUFNJbnQgJlJlc3VsdCwgcm91bmRpbmdNb2RlIFJNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKklzRXhhY3QpIGNvbnN0OworICBvcFN0YXR1cyBjb252ZXJ0RnJvbUFQSW50KGNvbnN0IEFQSW50ICZJbnB1dCwgYm9vbCBJc1NpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZGluZ01vZGUgUk0pIHsKKyAgICBBUEZMT0FUX0RJU1BBVENIX09OX1NFTUFOVElDUyhjb252ZXJ0RnJvbUFQSW50KElucHV0LCBJc1NpZ25lZCwgUk0pKTsKKyAgfQorICBvcFN0YXR1cyBjb252ZXJ0RnJvbVNpZ25FeHRlbmRlZEludGVnZXIoY29uc3QgaW50ZWdlclBhcnQgKklucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IElucHV0U2l6ZSwgYm9vbCBJc1NpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvdW5kaW5nTW9kZSBSTSkgeworICAgIEFQRkxPQVRfRElTUEFUQ0hfT05fU0VNQU5USUNTKAorICAgICAgICBjb252ZXJ0RnJvbVNpZ25FeHRlbmRlZEludGVnZXIoSW5wdXQsIElucHV0U2l6ZSwgSXNTaWduZWQsIFJNKSk7CisgIH0KKyAgb3BTdGF0dXMgY29udmVydEZyb21aZXJvRXh0ZW5kZWRJbnRlZ2VyKGNvbnN0IGludGVnZXJQYXJ0ICpJbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBJbnB1dFNpemUsIGJvb2wgSXNTaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb3VuZGluZ01vZGUgUk0pIHsKKyAgICBBUEZMT0FUX0RJU1BBVENIX09OX1NFTUFOVElDUygKKyAgICAgICAgY29udmVydEZyb21aZXJvRXh0ZW5kZWRJbnRlZ2VyKElucHV0LCBJbnB1dFNpemUsIElzU2lnbmVkLCBSTSkpOworICB9CisgIG9wU3RhdHVzIGNvbnZlcnRGcm9tU3RyaW5nKFN0cmluZ1JlZiwgcm91bmRpbmdNb2RlKTsKKyAgQVBJbnQgYml0Y2FzdFRvQVBJbnQoKSBjb25zdCB7CisgICAgQVBGTE9BVF9ESVNQQVRDSF9PTl9TRU1BTlRJQ1MoYml0Y2FzdFRvQVBJbnQoKSk7CisgIH0KKyAgZG91YmxlIGNvbnZlcnRUb0RvdWJsZSgpIGNvbnN0IHsgcmV0dXJuIGdldElFRUUoKS5jb252ZXJ0VG9Eb3VibGUoKTsgfQorICBmbG9hdCBjb252ZXJ0VG9GbG9hdCgpIGNvbnN0IHsgcmV0dXJuIGdldElFRUUoKS5jb252ZXJ0VG9GbG9hdCgpOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFQRmxvYXQgJikgY29uc3QgPSBkZWxldGU7CisKKyAgY21wUmVzdWx0IGNvbXBhcmUoY29uc3QgQVBGbG9hdCAmUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KCZnZXRTZW1hbnRpY3MoKSA9PSAmUkhTLmdldFNlbWFudGljcygpICYmCisgICAgICAgICAgICJTaG91bGQgb25seSBjb21wYXJlIEFQRmxvYXRzIHdpdGggdGhlIHNhbWUgc2VtYW50aWNzIik7CisgICAgaWYgKHVzZXNMYXlvdXQ8SUVFRUZsb2F0PihnZXRTZW1hbnRpY3MoKSkpCisgICAgICByZXR1cm4gVS5JRUVFLmNvbXBhcmUoUkhTLlUuSUVFRSk7CisgICAgaWYgKHVzZXNMYXlvdXQ8RG91YmxlQVBGbG9hdD4oZ2V0U2VtYW50aWNzKCkpKQorICAgICAgcmV0dXJuIFUuRG91YmxlLmNvbXBhcmUoUkhTLlUuRG91YmxlKTsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIHNlbWFudGljcyIpOworICB9CisKKyAgYm9vbCBiaXR3aXNlSXNFcXVhbChjb25zdCBBUEZsb2F0ICZSSFMpIGNvbnN0IHsKKyAgICBpZiAoJmdldFNlbWFudGljcygpICE9ICZSSFMuZ2V0U2VtYW50aWNzKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKHVzZXNMYXlvdXQ8SUVFRUZsb2F0PihnZXRTZW1hbnRpY3MoKSkpCisgICAgICByZXR1cm4gVS5JRUVFLmJpdHdpc2VJc0VxdWFsKFJIUy5VLklFRUUpOworICAgIGlmICh1c2VzTGF5b3V0PERvdWJsZUFQRmxvYXQ+KGdldFNlbWFudGljcygpKSkKKyAgICAgIHJldHVybiBVLkRvdWJsZS5iaXR3aXNlSXNFcXVhbChSSFMuVS5Eb3VibGUpOworICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgc2VtYW50aWNzIik7CisgIH0KKworICAvLy8gV2UgZG9uJ3QgcmVseSBvbiBvcGVyYXRvcj09IHdvcmtpbmcgb24gZG91YmxlIHZhbHVlcywgYXMKKyAgLy8vIGl0IHJldHVybnMgdHJ1ZSBmb3IgdGhpbmdzIHRoYXQgYXJlIGNsZWFybHkgbm90IGVxdWFsLCBsaWtlIC0wLjAgYW5kIDAuMC4KKyAgLy8vIEFzIHN1Y2gsIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGRvIGFuIGV4YWN0IGJpdC1mb3ItYml0IGNvbXBhcmlzb24gb2YKKyAgLy8vIHR3byBmbG9hdGluZyBwb2ludCB2YWx1ZXMuCisgIC8vLworICAvLy8gV2UgbGVhdmUgdGhlIHZlcnNpb24gd2l0aCB0aGUgZG91YmxlIGFyZ3VtZW50IGhlcmUgYmVjYXVzZSBpdCdzIGp1c3Qgc28KKyAgLy8vIGNvbnZlbmllbnQgdG8gd3JpdGUgIjIuMCIgYW5kIHRoZSBsaWtlLiAgV2l0aG91dCB0aGlzIGZ1bmN0aW9uIHdlJ2QKKyAgLy8vIGhhdmUgdG8gZHVwbGljYXRlIGl0cyBsb2dpYyBldmVyeXdoZXJlIGl0J3MgY2FsbGVkLgorICBib29sIGlzRXhhY3RseVZhbHVlKGRvdWJsZSBWKSBjb25zdCB7CisgICAgYm9vbCBpZ25vcmVkOworICAgIEFQRmxvYXQgVG1wKFYpOworICAgIFRtcC5jb252ZXJ0KGdldFNlbWFudGljcygpLCBBUEZsb2F0OjpybU5lYXJlc3RUaWVzVG9FdmVuLCAmaWdub3JlZCk7CisgICAgcmV0dXJuIGJpdHdpc2VJc0VxdWFsKFRtcCk7CisgIH0KKworICB1bnNpZ25lZCBpbnQgY29udmVydFRvSGV4U3RyaW5nKGNoYXIgKkRTVCwgdW5zaWduZWQgaW50IEhleERpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVwcGVyQ2FzZSwgcm91bmRpbmdNb2RlIFJNKSBjb25zdCB7CisgICAgQVBGTE9BVF9ESVNQQVRDSF9PTl9TRU1BTlRJQ1MoCisgICAgICAgIGNvbnZlcnRUb0hleFN0cmluZyhEU1QsIEhleERpZ2l0cywgVXBwZXJDYXNlLCBSTSkpOworICB9CisKKyAgYm9vbCBpc1plcm8oKSBjb25zdCB7IHJldHVybiBnZXRDYXRlZ29yeSgpID09IGZjWmVybzsgfQorICBib29sIGlzSW5maW5pdHkoKSBjb25zdCB7IHJldHVybiBnZXRDYXRlZ29yeSgpID09IGZjSW5maW5pdHk7IH0KKyAgYm9vbCBpc05hTigpIGNvbnN0IHsgcmV0dXJuIGdldENhdGVnb3J5KCkgPT0gZmNOYU47IH0KKworICBib29sIGlzTmVnYXRpdmUoKSBjb25zdCB7IHJldHVybiBnZXRJRUVFKCkuaXNOZWdhdGl2ZSgpOyB9CisgIGJvb2wgaXNEZW5vcm1hbCgpIGNvbnN0IHsgQVBGTE9BVF9ESVNQQVRDSF9PTl9TRU1BTlRJQ1MoaXNEZW5vcm1hbCgpKTsgfQorICBib29sIGlzU2lnbmFsaW5nKCkgY29uc3QgeyByZXR1cm4gZ2V0SUVFRSgpLmlzU2lnbmFsaW5nKCk7IH0KKworICBib29sIGlzTm9ybWFsKCkgY29uc3QgeyByZXR1cm4gIWlzRGVub3JtYWwoKSAmJiBpc0Zpbml0ZU5vblplcm8oKTsgfQorICBib29sIGlzRmluaXRlKCkgY29uc3QgeyByZXR1cm4gIWlzTmFOKCkgJiYgIWlzSW5maW5pdHkoKTsgfQorCisgIGZsdENhdGVnb3J5IGdldENhdGVnb3J5KCkgY29uc3QgeyByZXR1cm4gZ2V0SUVFRSgpLmdldENhdGVnb3J5KCk7IH0KKyAgY29uc3QgZmx0U2VtYW50aWNzICZnZXRTZW1hbnRpY3MoKSBjb25zdCB7IHJldHVybiAqVS5zZW1hbnRpY3M7IH0KKyAgYm9vbCBpc05vblplcm8oKSBjb25zdCB7IHJldHVybiAhaXNaZXJvKCk7IH0KKyAgYm9vbCBpc0Zpbml0ZU5vblplcm8oKSBjb25zdCB7IHJldHVybiBpc0Zpbml0ZSgpICYmICFpc1plcm8oKTsgfQorICBib29sIGlzUG9zWmVybygpIGNvbnN0IHsgcmV0dXJuIGlzWmVybygpICYmICFpc05lZ2F0aXZlKCk7IH0KKyAgYm9vbCBpc05lZ1plcm8oKSBjb25zdCB7IHJldHVybiBpc1plcm8oKSAmJiBpc05lZ2F0aXZlKCk7IH0KKyAgYm9vbCBpc1NtYWxsZXN0KCkgY29uc3QgeyBBUEZMT0FUX0RJU1BBVENIX09OX1NFTUFOVElDUyhpc1NtYWxsZXN0KCkpOyB9CisgIGJvb2wgaXNMYXJnZXN0KCkgY29uc3QgeyBBUEZMT0FUX0RJU1BBVENIX09OX1NFTUFOVElDUyhpc0xhcmdlc3QoKSk7IH0KKyAgYm9vbCBpc0ludGVnZXIoKSBjb25zdCB7IEFQRkxPQVRfRElTUEFUQ0hfT05fU0VNQU5USUNTKGlzSW50ZWdlcigpKTsgfQorCisgIEFQRmxvYXQgJm9wZXJhdG9yPShjb25zdCBBUEZsb2F0ICZSSFMpID0gZGVmYXVsdDsKKyAgQVBGbG9hdCAmb3BlcmF0b3I9KEFQRmxvYXQgJiZSSFMpID0gZGVmYXVsdDsKKworICB2b2lkIHRvU3RyaW5nKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmU3RyLCB1bnNpZ25lZCBGb3JtYXRQcmVjaXNpb24gPSAwLAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZvcm1hdE1heFBhZGRpbmcgPSAzLCBib29sIFRydW5jYXRlWmVybyA9IHRydWUpIGNvbnN0IHsKKyAgICBBUEZMT0FUX0RJU1BBVENIX09OX1NFTUFOVElDUygKKyAgICAgICAgdG9TdHJpbmcoU3RyLCBGb3JtYXRQcmVjaXNpb24sIEZvcm1hdE1heFBhZGRpbmcsIFRydW5jYXRlWmVybykpOworICB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgYm9vbCBnZXRFeGFjdEludmVyc2UoQVBGbG9hdCAqaW52KSBjb25zdCB7CisgICAgQVBGTE9BVF9ESVNQQVRDSF9PTl9TRU1BTlRJQ1MoZ2V0RXhhY3RJbnZlcnNlKGludikpOworICB9CisKKyAgZnJpZW5kIGhhc2hfY29kZSBoYXNoX3ZhbHVlKGNvbnN0IEFQRmxvYXQgJkFyZyk7CisgIGZyaWVuZCBpbnQgaWxvZ2IoY29uc3QgQVBGbG9hdCAmQXJnKSB7IHJldHVybiBpbG9nYihBcmcuZ2V0SUVFRSgpKTsgfQorICBmcmllbmQgQVBGbG9hdCBzY2FsYm4oQVBGbG9hdCBYLCBpbnQgRXhwLCByb3VuZGluZ01vZGUgUk0pOworICBmcmllbmQgQVBGbG9hdCBmcmV4cChjb25zdCBBUEZsb2F0ICZYLCBpbnQgJkV4cCwgcm91bmRpbmdNb2RlIFJNKTsKKyAgZnJpZW5kIElFRUVGbG9hdDsKKyAgZnJpZW5kIERvdWJsZUFQRmxvYXQ7Cit9OworCisvLy8gU2VlIGZyaWVuZCBkZWNsYXJhdGlvbnMgYWJvdmUuCisvLy8KKy8vLyBUaGVzZSBhZGRpdGlvbmFsIGRlY2xhcmF0aW9ucyBhcmUgcmVxdWlyZWQgaW4gb3JkZXIgdG8gY29tcGlsZSBMTFZNIHdpdGggSUJNCisvLy8geGxDIGNvbXBpbGVyLgoraGFzaF9jb2RlIGhhc2hfdmFsdWUoY29uc3QgQVBGbG9hdCAmQXJnKTsKK2lubGluZSBBUEZsb2F0IHNjYWxibihBUEZsb2F0IFgsIGludCBFeHAsIEFQRmxvYXQ6OnJvdW5kaW5nTW9kZSBSTSkgeworICBpZiAoQVBGbG9hdDo6dXNlc0xheW91dDxkZXRhaWw6OklFRUVGbG9hdD4oWC5nZXRTZW1hbnRpY3MoKSkpCisgICAgcmV0dXJuIEFQRmxvYXQoc2NhbGJuKFguVS5JRUVFLCBFeHAsIFJNKSwgWC5nZXRTZW1hbnRpY3MoKSk7CisgIGlmIChBUEZsb2F0Ojp1c2VzTGF5b3V0PGRldGFpbDo6RG91YmxlQVBGbG9hdD4oWC5nZXRTZW1hbnRpY3MoKSkpCisgICAgcmV0dXJuIEFQRmxvYXQoc2NhbGJuKFguVS5Eb3VibGUsIEV4cCwgUk0pLCBYLmdldFNlbWFudGljcygpKTsKKyAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBzZW1hbnRpY3MiKTsKK30KKworLy8vIEVxdWl2YWxlbnQgb2YgQyBzdGFuZGFyZCBsaWJyYXJ5IGZ1bmN0aW9uLgorLy8vCisvLy8gV2hpbGUgdGhlIEMgc3RhbmRhcmQgc2F5cyBFeHAgaXMgYW4gdW5zcGVjaWZpZWQgdmFsdWUgZm9yIGluZmluaXR5IGFuZCBuYW4sCisvLy8gdGhpcyByZXR1cm5zIElOVF9NQVggZm9yIGluZmluaXRpZXMsIGFuZCBJTlRfTUlOIGZvciBOYU5zLgoraW5saW5lIEFQRmxvYXQgZnJleHAoY29uc3QgQVBGbG9hdCAmWCwgaW50ICZFeHAsIEFQRmxvYXQ6OnJvdW5kaW5nTW9kZSBSTSkgeworICBpZiAoQVBGbG9hdDo6dXNlc0xheW91dDxkZXRhaWw6OklFRUVGbG9hdD4oWC5nZXRTZW1hbnRpY3MoKSkpCisgICAgcmV0dXJuIEFQRmxvYXQoZnJleHAoWC5VLklFRUUsIEV4cCwgUk0pLCBYLmdldFNlbWFudGljcygpKTsKKyAgaWYgKEFQRmxvYXQ6OnVzZXNMYXlvdXQ8ZGV0YWlsOjpEb3VibGVBUEZsb2F0PihYLmdldFNlbWFudGljcygpKSkKKyAgICByZXR1cm4gQVBGbG9hdChmcmV4cChYLlUuRG91YmxlLCBFeHAsIFJNKSwgWC5nZXRTZW1hbnRpY3MoKSk7CisgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgc2VtYW50aWNzIik7Cit9CisvLy8gUmV0dXJucyB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGFyZ3VtZW50LgoraW5saW5lIEFQRmxvYXQgYWJzKEFQRmxvYXQgWCkgeworICBYLmNsZWFyU2lnbigpOworICByZXR1cm4gWDsKK30KKworLy8vIFxicmllZiBSZXR1cm5zIHRoZSBuZWdhdGVkIHZhbHVlIG9mIHRoZSBhcmd1bWVudC4KK2lubGluZSBBUEZsb2F0IG5lZyhBUEZsb2F0IFgpIHsKKyAgWC5jaGFuZ2VTaWduKCk7CisgIHJldHVybiBYOworfQorCisvLy8gSW1wbGVtZW50cyBJRUVFIG1pbk51bSBzZW1hbnRpY3MuIFJldHVybnMgdGhlIHNtYWxsZXIgb2YgdGhlIDIgYXJndW1lbnRzIGlmCisvLy8gYm90aCBhcmUgbm90IE5hTi4gSWYgZWl0aGVyIGFyZ3VtZW50IGlzIGEgTmFOLCByZXR1cm5zIHRoZSBvdGhlciBhcmd1bWVudC4KK0xMVk1fUkVBRE9OTFkKK2lubGluZSBBUEZsb2F0IG1pbm51bShjb25zdCBBUEZsb2F0ICZBLCBjb25zdCBBUEZsb2F0ICZCKSB7CisgIGlmIChBLmlzTmFOKCkpCisgICAgcmV0dXJuIEI7CisgIGlmIChCLmlzTmFOKCkpCisgICAgcmV0dXJuIEE7CisgIHJldHVybiAoQi5jb21wYXJlKEEpID09IEFQRmxvYXQ6OmNtcExlc3NUaGFuKSA/IEIgOiBBOworfQorCisvLy8gSW1wbGVtZW50cyBJRUVFIG1heE51bSBzZW1hbnRpY3MuIFJldHVybnMgdGhlIGxhcmdlciBvZiB0aGUgMiBhcmd1bWVudHMgaWYKKy8vLyBib3RoIGFyZSBub3QgTmFOLiBJZiBlaXRoZXIgYXJndW1lbnQgaXMgYSBOYU4sIHJldHVybnMgdGhlIG90aGVyIGFyZ3VtZW50LgorTExWTV9SRUFET05MWQoraW5saW5lIEFQRmxvYXQgbWF4bnVtKGNvbnN0IEFQRmxvYXQgJkEsIGNvbnN0IEFQRmxvYXQgJkIpIHsKKyAgaWYgKEEuaXNOYU4oKSkKKyAgICByZXR1cm4gQjsKKyAgaWYgKEIuaXNOYU4oKSkKKyAgICByZXR1cm4gQTsKKyAgcmV0dXJuIChBLmNvbXBhcmUoQikgPT0gQVBGbG9hdDo6Y21wTGVzc1RoYW4pID8gQiA6IEE7Cit9CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI3VuZGVmIEFQRkxPQVRfRElTUEFUQ0hfT05fU0VNQU5USUNTCisjZW5kaWYgLy8gTExWTV9BRFRfQVBGTE9BVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9BUEludC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvQVBJbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMThjNjJlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvQVBJbnQuaApAQCAtMCwwICsxLDIxNTYgQEAKKy8vPT09LS0gbGx2bS9BRFQvQVBJbnQuaCAtIEZvciBBcmJpdHJhcnkgUHJlY2lzaW9uIEludGVnZXIgLS0tLS0qLSBDKysgLSotLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIGNsYXNzIHRvIHJlcHJlc2VudCBhcmJpdHJhcnkgcHJlY2lzaW9uCisvLy8gaW50ZWdyYWwgY29uc3RhbnQgdmFsdWVzIGFuZCBvcGVyYXRpb25zIG9uIHRoZW0uCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfQVBJTlRfSAorI2RlZmluZSBMTFZNX0FEVF9BUElOVF9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgRm9sZGluZ1NldE5vZGVJRDsKK2NsYXNzIFN0cmluZ1JlZjsKK2NsYXNzIGhhc2hfY29kZTsKK2NsYXNzIHJhd19vc3RyZWFtOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgU21hbGxWZWN0b3JJbXBsOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEFycmF5UmVmOworCitjbGFzcyBBUEludDsKKworaW5saW5lIEFQSW50IG9wZXJhdG9yLShBUEludCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gXGJyaWVmIENsYXNzIGZvciBhcmJpdHJhcnkgcHJlY2lzaW9uIGludGVnZXJzLgorLy8vCisvLy8gQVBJbnQgaXMgYSBmdW5jdGlvbmFsIHJlcGxhY2VtZW50IGZvciBjb21tb24gY2FzZSB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgbGlrZQorLy8vICJ1bnNpZ25lZCIsICJ1bnNpZ25lZCBsb25nIiBvciAidWludDY0X3QiLCBidXQgYWxzbyBhbGxvd3Mgbm9uLWJ5dGUtd2lkdGgKKy8vLyBpbnRlZ2VyIHNpemVzIGFuZCBsYXJnZSBpbnRlZ2VyIHZhbHVlIHR5cGVzIHN1Y2ggYXMgMy1iaXRzLCAxNS1iaXRzLCBvciBtb3JlCisvLy8gdGhhbiA2NC1iaXRzIG9mIHByZWNpc2lvbi4gQVBJbnQgcHJvdmlkZXMgYSB2YXJpZXR5IG9mIGFyaXRobWV0aWMgb3BlcmF0b3JzCisvLy8gYW5kIG1ldGhvZHMgdG8gbWFuaXB1bGF0ZSBpbnRlZ2VyIHZhbHVlcyBvZiBhbnkgYml0LXdpZHRoLiBJdCBzdXBwb3J0cyBib3RoCisvLy8gdGhlIHR5cGljYWwgaW50ZWdlciBhcml0aG1ldGljIGFuZCBjb21wYXJpc29uIG9wZXJhdGlvbnMgYXMgd2VsbCBhcyBiaXR3aXNlCisvLy8gbWFuaXB1bGF0aW9uLgorLy8vCisvLy8gVGhlIGNsYXNzIGhhcyBzZXZlcmFsIGludmFyaWFudHMgd29ydGggbm90aW5nOgorLy8vICAgKiBBbGwgYml0LCBieXRlLCBhbmQgd29yZCBwb3NpdGlvbnMgYXJlIHplcm8tYmFzZWQuCisvLy8gICAqIE9uY2UgdGhlIGJpdCB3aWR0aCBpcyBzZXQsIGl0IGRvZXNuJ3QgY2hhbmdlIGV4Y2VwdCBieSB0aGUgVHJ1bmNhdGUsCisvLy8gICAgIFNpZ25FeHRlbmQsIG9yIFplcm9FeHRlbmQgb3BlcmF0aW9ucy4KKy8vLyAgICogQWxsIGJpbmFyeSBvcGVyYXRvcnMgbXVzdCBiZSBvbiBBUEludCBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgYml0IHdpZHRoLgorLy8vICAgICBBdHRlbXB0aW5nIHRvIHVzZSB0aGVzZSBvcGVyYXRvcnMgb24gaW5zdGFuY2VzIHdpdGggZGlmZmVyZW50IGJpdAorLy8vICAgICB3aWR0aHMgd2lsbCB5aWVsZCBhbiBhc3NlcnRpb24uCisvLy8gICAqIFRoZSB2YWx1ZSBpcyBzdG9yZWQgY2Fub25pY2FsbHkgYXMgYW4gdW5zaWduZWQgdmFsdWUuIEZvciBvcGVyYXRpb25zCisvLy8gICAgIHdoZXJlIGl0IG1ha2VzIGEgZGlmZmVyZW5jZSwgdGhlcmUgYXJlIGJvdGggc2lnbmVkIGFuZCB1bnNpZ25lZCB2YXJpYW50cworLy8vICAgICBvZiB0aGUgb3BlcmF0aW9uLiBGb3IgZXhhbXBsZSwgc2RpdiBhbmQgdWRpdi4gSG93ZXZlciwgYmVjYXVzZSB0aGUgYml0CisvLy8gICAgIHdpZHRocyBtdXN0IGJlIHRoZSBzYW1lLCBvcGVyYXRpb25zIHN1Y2ggYXMgTXVsIGFuZCBBZGQgcHJvZHVjZSB0aGUgc2FtZQorLy8vICAgICByZXN1bHRzIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgdmFsdWVzIGFyZSBpbnRlcnByZXRlZCBhcyBzaWduZWQgb3IKKy8vLyAgICAgbm90LgorLy8vICAgKiBJbiBnZW5lcmFsLCB0aGUgY2xhc3MgdHJpZXMgdG8gZm9sbG93IHRoZSBzdHlsZSBvZiBjb21wdXRhdGlvbiB0aGF0IExMVk0KKy8vLyAgICAgdXNlcyBpbiBpdHMgSVIuIFRoaXMgc2ltcGxpZmllcyBpdHMgdXNlIGZvciBMTFZNLgorLy8vCitjbGFzcyBMTFZNX05PRElTQ0FSRCBBUEludCB7CitwdWJsaWM6CisgIHR5cGVkZWYgdWludDY0X3QgV29yZFR5cGU7CisKKyAgLy8vIFRoaXMgZW51bSBpcyB1c2VkIHRvIGhvbGQgdGhlIGNvbnN0YW50cyB3ZSBuZWVkZWQgZm9yIEFQSW50LgorICBlbnVtIDogdW5zaWduZWQgeworICAgIC8vLyBCeXRlIHNpemUgb2YgYSB3b3JkLgorICAgIEFQSU5UX1dPUkRfU0laRSA9IHNpemVvZihXb3JkVHlwZSksCisgICAgLy8vIEJpdHMgaW4gYSB3b3JkLgorICAgIEFQSU5UX0JJVFNfUEVSX1dPUkQgPSBBUElOVF9XT1JEX1NJWkUgKiBDSEFSX0JJVAorICB9OworCisgIHN0YXRpYyBjb25zdCBXb3JkVHlwZSBXT1JEX01BWCA9IH5Xb3JkVHlwZSgwKTsKKworcHJpdmF0ZToKKyAgLy8vIFRoaXMgdW5pb24gaXMgdXNlZCB0byBzdG9yZSB0aGUgaW50ZWdlciB2YWx1ZS4gV2hlbiB0aGUKKyAgLy8vIGludGVnZXIgYml0LXdpZHRoIDw9IDY0LCBpdCB1c2VzIFZBTCwgb3RoZXJ3aXNlIGl0IHVzZXMgcFZhbC4KKyAgdW5pb24geworICAgIHVpbnQ2NF90IFZBTDsgICAvLy88IFVzZWQgdG8gc3RvcmUgdGhlIDw9IDY0IGJpdHMgaW50ZWdlciB2YWx1ZS4KKyAgICB1aW50NjRfdCAqcFZhbDsgLy8vPCBVc2VkIHRvIHN0b3JlIHRoZSA+NjQgYml0cyBpbnRlZ2VyIHZhbHVlLgorICB9IFU7CisKKyAgdW5zaWduZWQgQml0V2lkdGg7IC8vLzwgVGhlIG51bWJlciBvZiBiaXRzIGluIHRoaXMgQVBJbnQuCisKKyAgZnJpZW5kIHN0cnVjdCBEZW5zZU1hcEFQSW50S2V5SW5mbzsKKworICBmcmllbmQgY2xhc3MgQVBTSW50OworCisgIC8vLyBcYnJpZWYgRmFzdCBpbnRlcm5hbCBjb25zdHJ1Y3RvcgorICAvLy8KKyAgLy8vIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBvbmx5IGludGVybmFsbHkgZm9yIHNwZWVkIG9mIGNvbnN0cnVjdGlvbiBvZgorICAvLy8gdGVtcG9yYXJpZXMuIEl0IGlzIHVuc2FmZSBmb3IgZ2VuZXJhbCB1c2Ugc28gaXQgaXMgbm90IHB1YmxpYy4KKyAgQVBJbnQodWludDY0X3QgKnZhbCwgdW5zaWduZWQgYml0cykgOiBCaXRXaWR0aChiaXRzKSB7CisgICAgVS5wVmFsID0gdmFsOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBBUEludCBqdXN0IGhhcyBvbmUgd29yZCB0byBzdG9yZSB2YWx1ZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoZSBudW1iZXIgb2YgYml0cyA8PSA2NCwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIGlzU2luZ2xlV29yZCgpIGNvbnN0IHsgcmV0dXJuIEJpdFdpZHRoIDw9IEFQSU5UX0JJVFNfUEVSX1dPUkQ7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGljaCB3b3JkIGEgYml0IGlzIGluLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSB3b3JkIHBvc2l0aW9uIGZvciB0aGUgc3BlY2lmaWVkIGJpdCBwb3NpdGlvbi4KKyAgc3RhdGljIHVuc2lnbmVkIHdoaWNoV29yZCh1bnNpZ25lZCBiaXRQb3NpdGlvbikgeworICAgIHJldHVybiBiaXRQb3NpdGlvbiAvIEFQSU5UX0JJVFNfUEVSX1dPUkQ7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB3aGljaCBiaXQgaW4gYSB3b3JkIGEgYml0IGlzIGluLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSBiaXQgcG9zaXRpb24gaW4gYSB3b3JkIGZvciB0aGUgc3BlY2lmaWVkIGJpdCBwb3NpdGlvbgorICAvLy8gaW4gdGhlIEFQSW50LgorICBzdGF0aWMgdW5zaWduZWQgd2hpY2hCaXQodW5zaWduZWQgYml0UG9zaXRpb24pIHsKKyAgICByZXR1cm4gYml0UG9zaXRpb24gJSBBUElOVF9CSVRTX1BFUl9XT1JEOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgYSBzaW5nbGUgYml0IG1hc2suCisgIC8vLworICAvLy8gXHJldHVybnMgYSB1aW50NjRfdCB3aXRoIG9ubHkgYml0IGF0ICJ3aGljaEJpdChiaXRQb3NpdGlvbikiIHNldAorICAvLy8gVGhpcyBtZXRob2QgZ2VuZXJhdGVzIGFuZCByZXR1cm5zIGEgdWludDY0X3QgKHdvcmQpIG1hc2sgZm9yIGEgc2luZ2xlCisgIC8vLyBiaXQgYXQgYSBzcGVjaWZpYyBiaXQgcG9zaXRpb24uIFRoaXMgaXMgdXNlZCB0byBtYXNrIHRoZSBiaXQgaW4gdGhlCisgIC8vLyBjb3JyZXNwb25kaW5nIHdvcmQuCisgIHN0YXRpYyB1aW50NjRfdCBtYXNrQml0KHVuc2lnbmVkIGJpdFBvc2l0aW9uKSB7CisgICAgcmV0dXJuIDFVTEwgPDwgd2hpY2hCaXQoYml0UG9zaXRpb24pOworICB9CisKKyAgLy8vIFxicmllZiBDbGVhciB1bnVzZWQgaGlnaCBvcmRlciBiaXRzCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBpbnRlcm5hbGx5IHRvIGNsZWFyIHRoZSB0b3AgIk4iIGJpdHMgaW4gdGhlIGhpZ2ggb3JkZXIKKyAgLy8vIHdvcmQgdGhhdCBhcmUgbm90IHVzZWQgYnkgdGhlIEFQSW50LiBUaGlzIGlzIG5lZWRlZCBhZnRlciB0aGUgbW9zdAorICAvLy8gc2lnbmlmaWNhbnQgd29yZCBpcyBhc3NpZ25lZCBhIHZhbHVlIHRvIGVuc3VyZSB0aGF0IHRob3NlIGJpdHMgYXJlCisgIC8vLyB6ZXJvJ2Qgb3V0LgorICBBUEludCAmY2xlYXJVbnVzZWRCaXRzKCkgeworICAgIC8vIENvbXB1dGUgaG93IG1hbnkgYml0cyBhcmUgdXNlZCBpbiB0aGUgZmluYWwgd29yZAorICAgIHVuc2lnbmVkIFdvcmRCaXRzID0gKChCaXRXaWR0aC0xKSAlIEFQSU5UX0JJVFNfUEVSX1dPUkQpICsgMTsKKworICAgIC8vIE1hc2sgb3V0IHRoZSBoaWdoIGJpdHMuCisgICAgdWludDY0X3QgbWFzayA9IFdPUkRfTUFYID4+IChBUElOVF9CSVRTX1BFUl9XT1JEIC0gV29yZEJpdHMpOworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIFUuVkFMICY9IG1hc2s7CisgICAgZWxzZQorICAgICAgVS5wVmFsW2dldE51bVdvcmRzKCkgLSAxXSAmPSBtYXNrOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSB3b3JkIGNvcnJlc3BvbmRpbmcgdG8gYSBiaXQgcG9zaXRpb24KKyAgLy8vIFxyZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHdvcmQgZm9yIHRoZSBzcGVjaWZpZWQgYml0IHBvc2l0aW9uLgorICB1aW50NjRfdCBnZXRXb3JkKHVuc2lnbmVkIGJpdFBvc2l0aW9uKSBjb25zdCB7CisgICAgcmV0dXJuIGlzU2luZ2xlV29yZCgpID8gVS5WQUwgOiBVLnBWYWxbd2hpY2hXb3JkKGJpdFBvc2l0aW9uKV07CisgIH0KKworICAvLy8gVXRpbGl0eSBtZXRob2QgdG8gY2hhbmdlIHRoZSBiaXQgd2lkdGggb2YgdGhpcyBBUEludCB0byBuZXcgYml0IHdpZHRoLAorICAvLy8gYWxsb2NhdGluZyBhbmQvb3IgZGVhbGxvY2F0aW5nIGFzIG5lY2Vzc2FyeS4gVGhlcmUgaXMgbm8gZ3VhcmFudGVlIG9uIHRoZQorICAvLy8gdmFsdWUgb2YgYW55IGJpdHMgdXBvbiByZXR1cm4uIENhbGxlciBzaG91bGQgcG9wdWxhdGUgdGhlIGJpdHMgYWZ0ZXIuCisgIHZvaWQgcmVhbGxvY2F0ZSh1bnNpZ25lZCBOZXdCaXRXaWR0aCk7CisKKyAgLy8vIFxicmllZiBDb252ZXJ0IGEgY2hhciBhcnJheSBpbnRvIGFuIEFQSW50CisgIC8vLworICAvLy8gXHBhcmFtIHJhZGl4IDIsIDgsIDEwLCAxNiwgb3IgMzYKKyAgLy8vIENvbnZlcnRzIGEgc3RyaW5nIGludG8gYSBudW1iZXIuICBUaGUgc3RyaW5nIG11c3QgYmUgbm9uLWVtcHR5CisgIC8vLyBhbmQgd2VsbC1mb3JtZWQgYXMgYSBudW1iZXIgb2YgdGhlIGdpdmVuIGJhc2UuIFRoZSBiaXQtd2lkdGgKKyAgLy8vIG11c3QgYmUgc3VmZmljaWVudCB0byBob2xkIHRoZSByZXN1bHQuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIGJ5IHRoZSBjb25zdHJ1Y3RvcnMgdGhhdCB0YWtlIHN0cmluZyBhcmd1bWVudHMuCisgIC8vLworICAvLy8gU3RyaW5nUmVmOjpnZXRBc0ludGVnZXIgaXMgc3VwZXJmaWNpYWxseSBzaW1pbGFyIGJ1dCAoMSkgZG9lcworICAvLy8gbm90IGFzc3VtZSB0aGF0IHRoZSBzdHJpbmcgaXMgd2VsbC1mb3JtZWQgYW5kICgyKSBncm93cyB0aGUKKyAgLy8vIHJlc3VsdCB0byBob2xkIHRoZSBpbnB1dC4KKyAgdm9pZCBmcm9tU3RyaW5nKHVuc2lnbmVkIG51bUJpdHMsIFN0cmluZ1JlZiBzdHIsIHVpbnQ4X3QgcmFkaXgpOworCisgIC8vLyBcYnJpZWYgQW4gaW50ZXJuYWwgZGl2aXNpb24gZnVuY3Rpb24gZm9yIGRpdmlkaW5nIEFQSW50cy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgYnkgdGhlIHRvU3RyaW5nIG1ldGhvZCB0byBkaXZpZGUgYnkgdGhlIHJhZGl4LiBJdCBzaW1wbHkKKyAgLy8vIHByb3ZpZGVzIGEgbW9yZSBjb252ZW5pZW50IGZvcm0gb2YgZGl2aWRlIGZvciBpbnRlcm5hbCB1c2Ugc2luY2UgS251dGhEaXYKKyAgLy8vIGhhcyBzcGVjaWZpYyBjb25zdHJhaW50cyBvbiBpdHMgaW5wdXRzLiBJZiB0aG9zZSBjb25zdHJhaW50cyBhcmUgbm90IG1ldAorICAvLy8gdGhlbiBpdCBwcm92aWRlcyBhIHNpbXBsZXIgZm9ybSBvZiBkaXZpZGUuCisgIHN0YXRpYyB2b2lkIGRpdmlkZShjb25zdCBXb3JkVHlwZSAqTEhTLCB1bnNpZ25lZCBsaHNXb3JkcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmRUeXBlICpSSFMsIHVuc2lnbmVkIHJoc1dvcmRzLCBXb3JkVHlwZSAqUXVvdGllbnQsCisgICAgICAgICAgICAgICAgICAgICBXb3JkVHlwZSAqUmVtYWluZGVyKTsKKworICAvLy8gb3V0LW9mLWxpbmUgc2xvdyBjYXNlIGZvciBpbmxpbmUgY29uc3RydWN0b3IKKyAgdm9pZCBpbml0U2xvd0Nhc2UodWludDY0X3QgdmFsLCBib29sIGlzU2lnbmVkKTsKKworICAvLy8gc2hhcmVkIGNvZGUgYmV0d2VlbiB0d28gYXJyYXkgY29uc3RydWN0b3JzCisgIHZvaWQgaW5pdEZyb21BcnJheShBcnJheVJlZjx1aW50NjRfdD4gYXJyYXkpOworCisgIC8vLyBvdXQtb2YtbGluZSBzbG93IGNhc2UgZm9yIGlubGluZSBjb3B5IGNvbnN0cnVjdG9yCisgIHZvaWQgaW5pdFNsb3dDYXNlKGNvbnN0IEFQSW50ICZ0aGF0KTsKKworICAvLy8gb3V0LW9mLWxpbmUgc2xvdyBjYXNlIGZvciBzaGwKKyAgdm9pZCBzaGxTbG93Q2FzZSh1bnNpZ25lZCBTaGlmdEFtdCk7CisKKyAgLy8vIG91dC1vZi1saW5lIHNsb3cgY2FzZSBmb3IgbHNoci4KKyAgdm9pZCBsc2hyU2xvd0Nhc2UodW5zaWduZWQgU2hpZnRBbXQpOworCisgIC8vLyBvdXQtb2YtbGluZSBzbG93IGNhc2UgZm9yIGFzaHIuCisgIHZvaWQgYXNoclNsb3dDYXNlKHVuc2lnbmVkIFNoaWZ0QW10KTsKKworICAvLy8gb3V0LW9mLWxpbmUgc2xvdyBjYXNlIGZvciBvcGVyYXRvcj0KKyAgdm9pZCBBc3NpZ25TbG93Q2FzZShjb25zdCBBUEludCAmUkhTKTsKKworICAvLy8gb3V0LW9mLWxpbmUgc2xvdyBjYXNlIGZvciBvcGVyYXRvcj09CisgIGJvb2wgRXF1YWxTbG93Q2FzZShjb25zdCBBUEludCAmUkhTKSBjb25zdCBMTFZNX1JFQURPTkxZOworCisgIC8vLyBvdXQtb2YtbGluZSBzbG93IGNhc2UgZm9yIGNvdW50TGVhZGluZ1plcm9zCisgIHVuc2lnbmVkIGNvdW50TGVhZGluZ1plcm9zU2xvd0Nhc2UoKSBjb25zdCBMTFZNX1JFQURPTkxZOworCisgIC8vLyBvdXQtb2YtbGluZSBzbG93IGNhc2UgZm9yIGNvdW50TGVhZGluZ09uZXMuCisgIHVuc2lnbmVkIGNvdW50TGVhZGluZ09uZXNTbG93Q2FzZSgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisKKyAgLy8vIG91dC1vZi1saW5lIHNsb3cgY2FzZSBmb3IgY291bnRUcmFpbGluZ1plcm9zLgorICB1bnNpZ25lZCBjb3VudFRyYWlsaW5nWmVyb3NTbG93Q2FzZSgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisKKyAgLy8vIG91dC1vZi1saW5lIHNsb3cgY2FzZSBmb3IgY291bnRUcmFpbGluZ09uZXMKKyAgdW5zaWduZWQgY291bnRUcmFpbGluZ09uZXNTbG93Q2FzZSgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisKKyAgLy8vIG91dC1vZi1saW5lIHNsb3cgY2FzZSBmb3IgY291bnRQb3B1bGF0aW9uCisgIHVuc2lnbmVkIGNvdW50UG9wdWxhdGlvblNsb3dDYXNlKCkgY29uc3QgTExWTV9SRUFET05MWTsKKworICAvLy8gb3V0LW9mLWxpbmUgc2xvdyBjYXNlIGZvciBpbnRlcnNlY3RzLgorICBib29sIGludGVyc2VjdHNTbG93Q2FzZShjb25zdCBBUEludCAmUkhTKSBjb25zdCBMTFZNX1JFQURPTkxZOworCisgIC8vLyBvdXQtb2YtbGluZSBzbG93IGNhc2UgZm9yIGlzU3Vic2V0T2YuCisgIGJvb2wgaXNTdWJzZXRPZlNsb3dDYXNlKGNvbnN0IEFQSW50ICZSSFMpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisKKyAgLy8vIG91dC1vZi1saW5lIHNsb3cgY2FzZSBmb3Igc2V0Qml0cy4KKyAgdm9pZCBzZXRCaXRzU2xvd0Nhc2UodW5zaWduZWQgbG9CaXQsIHVuc2lnbmVkIGhpQml0KTsKKworICAvLy8gb3V0LW9mLWxpbmUgc2xvdyBjYXNlIGZvciBmbGlwQWxsQml0cy4KKyAgdm9pZCBmbGlwQWxsQml0c1Nsb3dDYXNlKCk7CisKKyAgLy8vIG91dC1vZi1saW5lIHNsb3cgY2FzZSBmb3Igb3BlcmF0b3ImPS4KKyAgdm9pZCBBbmRBc3NpZ25TbG93Q2FzZShjb25zdCBBUEludCYgUkhTKTsKKworICAvLy8gb3V0LW9mLWxpbmUgc2xvdyBjYXNlIGZvciBvcGVyYXRvcnw9LgorICB2b2lkIE9yQXNzaWduU2xvd0Nhc2UoY29uc3QgQVBJbnQmIFJIUyk7CisKKyAgLy8vIG91dC1vZi1saW5lIHNsb3cgY2FzZSBmb3Igb3BlcmF0b3JePS4KKyAgdm9pZCBYb3JBc3NpZ25TbG93Q2FzZShjb25zdCBBUEludCYgUkhTKTsKKworICAvLy8gVW5zaWduZWQgY29tcGFyaXNvbi4gUmV0dXJucyAtMSwgMCwgb3IgMSBpZiB0aGlzIEFQSW50IGlzIGxlc3MgdGhhbiwgZXF1YWwKKyAgLy8vIHRvLCBvciBncmVhdGVyIHRoYW4gUkhTLgorICBpbnQgY29tcGFyZShjb25zdCBBUEludCAmUkhTKSBjb25zdCBMTFZNX1JFQURPTkxZOworCisgIC8vLyBTaWduZWQgY29tcGFyaXNvbi4gUmV0dXJucyAtMSwgMCwgb3IgMSBpZiB0aGlzIEFQSW50IGlzIGxlc3MgdGhhbiwgZXF1YWwKKyAgLy8vIHRvLCBvciBncmVhdGVyIHRoYW4gUkhTLgorICBpbnQgY29tcGFyZVNpZ25lZChjb25zdCBBUEludCAmUkhTKSBjb25zdCBMTFZNX1JFQURPTkxZOworCitwdWJsaWM6CisgIC8vLyBcbmFtZSBDb25zdHJ1Y3RvcnMKKyAgLy8vIEB7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBuZXcgQVBJbnQgb2YgbnVtQml0cyB3aWR0aCwgaW5pdGlhbGl6ZWQgYXMgdmFsLgorICAvLy8KKyAgLy8vIElmIGlzU2lnbmVkIGlzIHRydWUgdGhlbiB2YWwgaXMgdHJlYXRlZCBhcyBpZiBpdCB3ZXJlIGEgc2lnbmVkIHZhbHVlCisgIC8vLyAoaS5lLiBhcyBhbiBpbnQ2NF90KSBhbmQgdGhlIGFwcHJvcHJpYXRlIHNpZ24gZXh0ZW5zaW9uIHRvIHRoZSBiaXQgd2lkdGgKKyAgLy8vIHdpbGwgYmUgZG9uZS4gT3RoZXJ3aXNlLCBubyBzaWduIGV4dGVuc2lvbiBvY2N1cnMgKGhpZ2ggb3JkZXIgYml0cyBiZXlvbmQKKyAgLy8vIHRoZSByYW5nZSBvZiB2YWwgYXJlIHplcm8gZmlsbGVkKS4KKyAgLy8vCisgIC8vLyBccGFyYW0gbnVtQml0cyB0aGUgYml0IHdpZHRoIG9mIHRoZSBjb25zdHJ1Y3RlZCBBUEludAorICAvLy8gXHBhcmFtIHZhbCB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgQVBJbnQKKyAgLy8vIFxwYXJhbSBpc1NpZ25lZCBob3cgdG8gdHJlYXQgc2lnbmVkbmVzcyBvZiB2YWwKKyAgQVBJbnQodW5zaWduZWQgbnVtQml0cywgdWludDY0X3QgdmFsLCBib29sIGlzU2lnbmVkID0gZmFsc2UpCisgICAgICA6IEJpdFdpZHRoKG51bUJpdHMpIHsKKyAgICBhc3NlcnQoQml0V2lkdGggJiYgImJpdHdpZHRoIHRvbyBzbWFsbCIpOworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkgeworICAgICAgVS5WQUwgPSB2YWw7CisgICAgICBjbGVhclVudXNlZEJpdHMoKTsKKyAgICB9IGVsc2UgeworICAgICAgaW5pdFNsb3dDYXNlKHZhbCwgaXNTaWduZWQpOworICAgIH0KKyAgfQorCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGFuIEFQSW50IG9mIG51bUJpdHMgd2lkdGgsIGluaXRpYWxpemVkIGFzIGJpZ1ZhbFtdLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBiaWdWYWwuc2l6ZSgpIGNhbiBiZSBzbWFsbGVyIG9yIGxhcmdlciB0aGFuIHRoZSBjb3JyZXNwb25kaW5nCisgIC8vLyBiaXQgd2lkdGggYnV0IGFueSBleHRyYW5lb3VzIGJpdHMgd2lsbCBiZSBkcm9wcGVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBudW1CaXRzIHRoZSBiaXQgd2lkdGggb2YgdGhlIGNvbnN0cnVjdGVkIEFQSW50CisgIC8vLyBccGFyYW0gYmlnVmFsIGEgc2VxdWVuY2Ugb2Ygd29yZHMgdG8gZm9ybSB0aGUgaW5pdGlhbCB2YWx1ZSBvZiB0aGUgQVBJbnQKKyAgQVBJbnQodW5zaWduZWQgbnVtQml0cywgQXJyYXlSZWY8dWludDY0X3Q+IGJpZ1ZhbCk7CisKKyAgLy8vIEVxdWl2YWxlbnQgdG8gQVBJbnQobnVtQml0cywgQXJyYXlSZWY8dWludDY0X3Q+KGJpZ1ZhbCwgbnVtV29yZHMpKSwgYnV0CisgIC8vLyBkZXByZWNhdGVkIGJlY2F1c2UgdGhpcyBjb25zdHJ1Y3RvciBpcyBwcm9uZSB0byBhbWJpZ3VpdHkgd2l0aCB0aGUKKyAgLy8vIEFQSW50KHVuc2lnbmVkLCB1aW50NjRfdCwgYm9vbCkgY29uc3RydWN0b3IuCisgIC8vLworICAvLy8gSWYgdGhpcyBvdmVybG9hZCBpcyBldmVyIGRlbGV0ZWQsIGNhcmUgc2hvdWxkIGJlIHRha2VuIHRvIHByZXZlbnQgY2FsbHMKKyAgLy8vIGZyb20gYmVpbmcgaW5jb3JyZWN0bHkgY2FwdHVyZWQgYnkgdGhlIEFQSW50KHVuc2lnbmVkLCB1aW50NjRfdCwgYm9vbCkKKyAgLy8vIGNvbnN0cnVjdG9yLgorICBBUEludCh1bnNpZ25lZCBudW1CaXRzLCB1bnNpZ25lZCBudW1Xb3JkcywgY29uc3QgdWludDY0X3QgYmlnVmFsW10pOworCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGFuIEFQSW50IGZyb20gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24uCisgIC8vLworICAvLy8gVGhpcyBjb25zdHJ1Y3RvciBpbnRlcnByZXRzIHRoZSBzdHJpbmcgXHAgc3RyIGluIHRoZSBnaXZlbiByYWRpeC4gVGhlCisgIC8vLyBpbnRlcnByZXRhdGlvbiBzdG9wcyB3aGVuIHRoZSBmaXJzdCBjaGFyYWN0ZXIgdGhhdCBpcyBub3Qgc3VpdGFibGUgZm9yIHRoZQorICAvLy8gcmFkaXggaXMgZW5jb3VudGVyZWQsIG9yIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gQWNjZXB0YWJsZSByYWRpeCB2YWx1ZXMKKyAgLy8vIGFyZSAyLCA4LCAxMCwgMTYsIGFuZCAzNi4gSXQgaXMgYW4gZXJyb3IgZm9yIHRoZSB2YWx1ZSBpbXBsaWVkIGJ5IHRoZQorICAvLy8gc3RyaW5nIHRvIHJlcXVpcmUgbW9yZSBiaXRzIHRoYW4gbnVtQml0cy4KKyAgLy8vCisgIC8vLyBccGFyYW0gbnVtQml0cyB0aGUgYml0IHdpZHRoIG9mIHRoZSBjb25zdHJ1Y3RlZCBBUEludAorICAvLy8gXHBhcmFtIHN0ciB0aGUgc3RyaW5nIHRvIGJlIGludGVycHJldGVkCisgIC8vLyBccGFyYW0gcmFkaXggdGhlIHJhZGl4IHRvIHVzZSBmb3IgdGhlIGNvbnZlcnNpb24KKyAgQVBJbnQodW5zaWduZWQgbnVtQml0cywgU3RyaW5nUmVmIHN0ciwgdWludDhfdCByYWRpeCk7CisKKyAgLy8vIFNpbXBseSBtYWtlcyAqdGhpcyBhIGNvcHkgb2YgdGhhdC4KKyAgLy8vIEBicmllZiBDb3B5IENvbnN0cnVjdG9yLgorICBBUEludChjb25zdCBBUEludCAmdGhhdCkgOiBCaXRXaWR0aCh0aGF0LkJpdFdpZHRoKSB7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgVS5WQUwgPSB0aGF0LlUuVkFMOworICAgIGVsc2UKKyAgICAgIGluaXRTbG93Q2FzZSh0aGF0KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgTW92ZSBDb25zdHJ1Y3Rvci4KKyAgQVBJbnQoQVBJbnQgJiZ0aGF0KSA6IEJpdFdpZHRoKHRoYXQuQml0V2lkdGgpIHsKKyAgICBtZW1jcHkoJlUsICZ0aGF0LlUsIHNpemVvZihVKSk7CisgICAgdGhhdC5CaXRXaWR0aCA9IDA7CisgIH0KKworICAvLy8gXGJyaWVmIERlc3RydWN0b3IuCisgIH5BUEludCgpIHsKKyAgICBpZiAobmVlZHNDbGVhbnVwKCkpCisgICAgICBkZWxldGVbXSBVLnBWYWw7CisgIH0KKworICAvLy8gXGJyaWVmIERlZmF1bHQgY29uc3RydWN0b3IgdGhhdCBjcmVhdGVzIGFuIHVuaW50ZXJlc3RpbmcgQVBJbnQKKyAgLy8vIHJlcHJlc2VudGluZyBhIDEtYml0IHplcm8gdmFsdWUuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VmdWwgZm9yIG9iamVjdCBkZXNlcmlhbGl6YXRpb24gKHBhaXIgdGhpcyB3aXRoIHRoZSBzdGF0aWMKKyAgLy8vICBtZXRob2QgUmVhZCkuCisgIGV4cGxpY2l0IEFQSW50KCkgOiBCaXRXaWR0aCgxKSB7IFUuVkFMID0gMDsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB3aGV0aGVyIHRoaXMgaW5zdGFuY2UgYWxsb2NhdGVkIG1lbW9yeS4KKyAgYm9vbCBuZWVkc0NsZWFudXAoKSBjb25zdCB7IHJldHVybiAhaXNTaW5nbGVXb3JkKCk7IH0KKworICAvLy8gVXNlZCB0byBpbnNlcnQgQVBJbnQgb2JqZWN0cywgb3Igb2JqZWN0cyB0aGF0IGNvbnRhaW4gQVBJbnQgb2JqZWN0cywgaW50bworICAvLy8gIEZvbGRpbmdTZXRzLgorICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmaWQpIGNvbnN0OworCisgIC8vLyBAfQorICAvLy8gXG5hbWUgVmFsdWUgVGVzdHMKKyAgLy8vIEB7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgc2lnbiBvZiB0aGlzIEFQSW50LgorICAvLy8KKyAgLy8vIFRoaXMgdGVzdHMgdGhlIGhpZ2ggYml0IG9mIHRoaXMgQVBJbnQgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIHNldC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoaXMgQVBJbnQgaXMgbmVnYXRpdmUsIGZhbHNlIG90aGVyd2lzZQorICBib29sIGlzTmVnYXRpdmUoKSBjb25zdCB7IHJldHVybiAoKnRoaXMpW0JpdFdpZHRoIC0gMV07IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSBpZiB0aGlzIEFQSW50IFZhbHVlIGlzIG5vbi1uZWdhdGl2ZSAoPj0gMCkKKyAgLy8vCisgIC8vLyBUaGlzIHRlc3RzIHRoZSBoaWdoIGJpdCBvZiB0aGUgQVBJbnQgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIHVuc2V0LgorICBib29sIGlzTm9uTmVnYXRpdmUoKSBjb25zdCB7IHJldHVybiAhaXNOZWdhdGl2ZSgpOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgaWYgc2lnbiBiaXQgb2YgdGhpcyBBUEludCBpcyBzZXQuCisgIC8vLworICAvLy8gVGhpcyB0ZXN0cyB0aGUgaGlnaCBiaXQgb2YgdGhpcyBBUEludCB0byBkZXRlcm1pbmUgaWYgaXQgaXMgc2V0LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhpcyBBUEludCBoYXMgaXRzIHNpZ24gYml0IHNldCwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIGlzU2lnbkJpdFNldCgpIGNvbnN0IHsgcmV0dXJuICgqdGhpcylbQml0V2lkdGgtMV07IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSBpZiBzaWduIGJpdCBvZiB0aGlzIEFQSW50IGlzIGNsZWFyLgorICAvLy8KKyAgLy8vIFRoaXMgdGVzdHMgdGhlIGhpZ2ggYml0IG9mIHRoaXMgQVBJbnQgdG8gZGV0ZXJtaW5lIGlmIGl0IGlzIGNsZWFyLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhpcyBBUEludCBoYXMgaXRzIHNpZ24gYml0IGNsZWFyLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgaXNTaWduQml0Q2xlYXIoKSBjb25zdCB7IHJldHVybiAhaXNTaWduQml0U2V0KCk7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSBpZiB0aGlzIEFQSW50IFZhbHVlIGlzIHBvc2l0aXZlLgorICAvLy8KKyAgLy8vIFRoaXMgdGVzdHMgaWYgdGhlIHZhbHVlIG9mIHRoaXMgQVBJbnQgaXMgcG9zaXRpdmUgKD4gMCkuIE5vdGUKKyAgLy8vIHRoYXQgMCBpcyBub3QgYSBwb3NpdGl2ZSB2YWx1ZS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoaXMgQVBJbnQgaXMgcG9zaXRpdmUuCisgIGJvb2wgaXNTdHJpY3RseVBvc2l0aXZlKCkgY29uc3QgeyByZXR1cm4gaXNOb25OZWdhdGl2ZSgpICYmICFpc051bGxWYWx1ZSgpOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgaWYgYWxsIGJpdHMgYXJlIHNldAorICAvLy8KKyAgLy8vIFRoaXMgY2hlY2tzIHRvIHNlZSBpZiB0aGUgdmFsdWUgaGFzIGFsbCBiaXRzIG9mIHRoZSBBUEludCBhcmUgc2V0IG9yIG5vdC4KKyAgYm9vbCBpc0FsbE9uZXNWYWx1ZSgpIGNvbnN0IHsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgICByZXR1cm4gVS5WQUwgPT0gV09SRF9NQVggPj4gKEFQSU5UX0JJVFNfUEVSX1dPUkQgLSBCaXRXaWR0aCk7CisgICAgcmV0dXJuIGNvdW50VHJhaWxpbmdPbmVzU2xvd0Nhc2UoKSA9PSBCaXRXaWR0aDsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIGlmIGFsbCBiaXRzIGFyZSBjbGVhcgorICAvLy8KKyAgLy8vIFRoaXMgY2hlY2tzIHRvIHNlZSBpZiB0aGUgdmFsdWUgaGFzIGFsbCBiaXRzIG9mIHRoZSBBUEludCBhcmUgY2xlYXIgb3IKKyAgLy8vIG5vdC4KKyAgYm9vbCBpc051bGxWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuICEqdGhpczsgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYSB2YWx1ZSBvZiAxLgorICAvLy8KKyAgLy8vIFRoaXMgY2hlY2tzIHRvIHNlZSBpZiB0aGUgdmFsdWUgb2YgdGhpcyBBUEludCBpcyBvbmUuCisgIGJvb2wgaXNPbmVWYWx1ZSgpIGNvbnN0IHsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgICByZXR1cm4gVS5WQUwgPT0gMTsKKyAgICByZXR1cm4gY291bnRMZWFkaW5nWmVyb3NTbG93Q2FzZSgpID09IEJpdFdpZHRoIC0gMTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIGlmIHRoaXMgaXMgdGhlIGxhcmdlc3QgdW5zaWduZWQgdmFsdWUuCisgIC8vLworICAvLy8gVGhpcyBjaGVja3MgdG8gc2VlIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIEFQSW50IGlzIHRoZSBtYXhpbXVtIHVuc2lnbmVkCisgIC8vLyB2YWx1ZSBmb3IgdGhlIEFQSW50J3MgYml0IHdpZHRoLgorICBib29sIGlzTWF4VmFsdWUoKSBjb25zdCB7IHJldHVybiBpc0FsbE9uZXNWYWx1ZSgpOyB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBpcyB0aGUgbGFyZ2VzdCBzaWduZWQgdmFsdWUuCisgIC8vLworICAvLy8gVGhpcyBjaGVja3MgdG8gc2VlIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIEFQSW50IGlzIHRoZSBtYXhpbXVtIHNpZ25lZAorICAvLy8gdmFsdWUgZm9yIHRoZSBBUEludCdzIGJpdCB3aWR0aC4KKyAgYm9vbCBpc01heFNpZ25lZFZhbHVlKCkgY29uc3QgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIHJldHVybiBVLlZBTCA9PSAoKFdvcmRUeXBlKDEpIDw8IChCaXRXaWR0aCAtIDEpKSAtIDEpOworICAgIHJldHVybiAhaXNOZWdhdGl2ZSgpICYmIGNvdW50VHJhaWxpbmdPbmVzU2xvd0Nhc2UoKSA9PSBCaXRXaWR0aCAtIDE7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSBpZiB0aGlzIGlzIHRoZSBzbWFsbGVzdCB1bnNpZ25lZCB2YWx1ZS4KKyAgLy8vCisgIC8vLyBUaGlzIGNoZWNrcyB0byBzZWUgaWYgdGhlIHZhbHVlIG9mIHRoaXMgQVBJbnQgaXMgdGhlIG1pbmltdW0gdW5zaWduZWQKKyAgLy8vIHZhbHVlIGZvciB0aGUgQVBJbnQncyBiaXQgd2lkdGguCisgIGJvb2wgaXNNaW5WYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGlzTnVsbFZhbHVlKCk7IH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSBpZiB0aGlzIGlzIHRoZSBzbWFsbGVzdCBzaWduZWQgdmFsdWUuCisgIC8vLworICAvLy8gVGhpcyBjaGVja3MgdG8gc2VlIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIEFQSW50IGlzIHRoZSBtaW5pbXVtIHNpZ25lZAorICAvLy8gdmFsdWUgZm9yIHRoZSBBUEludCdzIGJpdCB3aWR0aC4KKyAgYm9vbCBpc01pblNpZ25lZFZhbHVlKCkgY29uc3QgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIHJldHVybiBVLlZBTCA9PSAoV29yZFR5cGUoMSkgPDwgKEJpdFdpZHRoIC0gMSkpOworICAgIHJldHVybiBpc05lZ2F0aXZlKCkgJiYgY291bnRUcmFpbGluZ1plcm9zU2xvd0Nhc2UoKSA9PSBCaXRXaWR0aCAtIDE7CisgIH0KKworICAvLy8gXGJyaWVmIENoZWNrIGlmIHRoaXMgQVBJbnQgaGFzIGFuIE4tYml0cyB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlLgorICBib29sIGlzSW50Tih1bnNpZ25lZCBOKSBjb25zdCB7CisgICAgYXNzZXJ0KE4gJiYgIk4gPT0gMCA/Pz8iKTsKKyAgICByZXR1cm4gZ2V0QWN0aXZlQml0cygpIDw9IE47CisgIH0KKworICAvLy8gXGJyaWVmIENoZWNrIGlmIHRoaXMgQVBJbnQgaGFzIGFuIE4tYml0cyBzaWduZWQgaW50ZWdlciB2YWx1ZS4KKyAgYm9vbCBpc1NpZ25lZEludE4odW5zaWduZWQgTikgY29uc3QgeworICAgIGFzc2VydChOICYmICJOID09IDAgPz8/Iik7CisgICAgcmV0dXJuIGdldE1pblNpZ25lZEJpdHMoKSA8PSBOOworICB9CisKKyAgLy8vIFxicmllZiBDaGVjayBpZiB0aGlzIEFQSW50J3MgdmFsdWUgaXMgYSBwb3dlciBvZiB0d28gZ3JlYXRlciB0aGFuIHplcm8uCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGUgYXJndW1lbnQgQVBJbnQgdmFsdWUgaXMgYSBwb3dlciBvZiB0d28gPiAwLgorICBib29sIGlzUG93ZXJPZjIoKSBjb25zdCB7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgcmV0dXJuIGlzUG93ZXJPZjJfNjQoVS5WQUwpOworICAgIHJldHVybiBjb3VudFBvcHVsYXRpb25TbG93Q2FzZSgpID09IDE7CisgIH0KKworICAvLy8gXGJyaWVmIENoZWNrIGlmIHRoZSBBUEludCdzIHZhbHVlIGlzIHJldHVybmVkIGJ5IGdldFNpZ25NYXNrLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhpcyBpcyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgZ2V0U2lnbk1hc2suCisgIGJvb2wgaXNTaWduTWFzaygpIGNvbnN0IHsgcmV0dXJuIGlzTWluU2lnbmVkVmFsdWUoKTsgfQorCisgIC8vLyBcYnJpZWYgQ29udmVydCBBUEludCB0byBhIGJvb2xlYW4gdmFsdWUuCisgIC8vLworICAvLy8gVGhpcyBjb252ZXJ0cyB0aGUgQVBJbnQgdG8gYSBib29sZWFuIHZhbHVlIGFzIGEgdGVzdCBhZ2FpbnN0IHplcm8uCisgIGJvb2wgZ2V0Qm9vbFZhbHVlKCkgY29uc3QgeyByZXR1cm4gISEqdGhpczsgfQorCisgIC8vLyBJZiB0aGlzIHZhbHVlIGlzIHNtYWxsZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxpbWl0LCByZXR1cm4gaXQsIG90aGVyd2lzZQorICAvLy8gcmV0dXJuIHRoZSBsaW1pdCB2YWx1ZS4gIFRoaXMgY2F1c2VzIHRoZSB2YWx1ZSB0byBzYXR1cmF0ZSB0byB0aGUgbGltaXQuCisgIHVpbnQ2NF90IGdldExpbWl0ZWRWYWx1ZSh1aW50NjRfdCBMaW1pdCA9IFVJTlQ2NF9NQVgpIGNvbnN0IHsKKyAgICByZXR1cm4gdWd0KExpbWl0KSA/IExpbWl0IDogZ2V0WkV4dFZhbHVlKCk7CisgIH0KKworICAvLy8gXGJyaWVmIENoZWNrIGlmIHRoZSBBUEludCBjb25zaXN0cyBvZiBhIHJlcGVhdGVkIGJpdCBwYXR0ZXJuLgorICAvLy8KKyAgLy8vIGUuZy4gMHgwMTAxMDEwMSBzYXRpc2ZpZXMgaXNTcGxhdCg4KS4KKyAgLy8vIFxwYXJhbSBTcGxhdFNpemVJbkJpdHMgVGhlIHNpemUgb2YgdGhlIHBhdHRlcm4gaW4gYml0cy4gTXVzdCBkaXZpZGUgYml0CisgIC8vLyB3aWR0aCB3aXRob3V0IHJlbWFpbmRlci4KKyAgYm9vbCBpc1NwbGF0KHVuc2lnbmVkIFNwbGF0U2l6ZUluQml0cykgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhpcyBBUEludCB2YWx1ZSBpcyBhIHNlcXVlbmNlIG9mIFxwYXJhbSBudW1CaXRzIG9uZXMKKyAgLy8vIHN0YXJ0aW5nIGF0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgd2l0aCB0aGUgcmVtYWluZGVyIHplcm8uCisgIGJvb2wgaXNNYXNrKHVuc2lnbmVkIG51bUJpdHMpIGNvbnN0IHsKKyAgICBhc3NlcnQobnVtQml0cyAhPSAwICYmICJudW1CaXRzIG11c3QgYmUgbm9uLXplcm8iKTsKKyAgICBhc3NlcnQobnVtQml0cyA8PSBCaXRXaWR0aCAmJiAibnVtQml0cyBvdXQgb2YgcmFuZ2UiKTsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgICByZXR1cm4gVS5WQUwgPT0gKFdPUkRfTUFYID4+IChBUElOVF9CSVRTX1BFUl9XT1JEIC0gbnVtQml0cykpOworICAgIHVuc2lnbmVkIE9uZXMgPSBjb3VudFRyYWlsaW5nT25lc1Nsb3dDYXNlKCk7CisgICAgcmV0dXJuIChudW1CaXRzID09IE9uZXMpICYmCisgICAgICAgICAgICgoT25lcyArIGNvdW50TGVhZGluZ1plcm9zU2xvd0Nhc2UoKSkgPT0gQml0V2lkdGgpOworICB9CisKKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhpcyBBUEludCBpcyBhIG5vbi1lbXB0eSBzZXF1ZW5jZSBvZiBvbmVzIHN0YXJ0aW5nIGF0CisgIC8vLyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHdpdGggdGhlIHJlbWFpbmRlciB6ZXJvLgorICAvLy8gRXguIGlzTWFzaygweDAwMDBGRkZGVSkgPT0gdHJ1ZS4KKyAgYm9vbCBpc01hc2soKSBjb25zdCB7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgcmV0dXJuIGlzTWFza182NChVLlZBTCk7CisgICAgdW5zaWduZWQgT25lcyA9IGNvdW50VHJhaWxpbmdPbmVzU2xvd0Nhc2UoKTsKKyAgICByZXR1cm4gKE9uZXMgPiAwKSAmJiAoKE9uZXMgKyBjb3VudExlYWRpbmdaZXJvc1Nsb3dDYXNlKCkpID09IEJpdFdpZHRoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBBUEludCB2YWx1ZSBjb250YWlucyBhIHNlcXVlbmNlIG9mIG9uZXMgd2l0aAorICAvLy8gdGhlIHJlbWFpbmRlciB6ZXJvLgorICBib29sIGlzU2hpZnRlZE1hc2soKSBjb25zdCB7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgcmV0dXJuIGlzU2hpZnRlZE1hc2tfNjQoVS5WQUwpOworICAgIHVuc2lnbmVkIE9uZXMgPSBjb3VudFBvcHVsYXRpb25TbG93Q2FzZSgpOworICAgIHVuc2lnbmVkIExlYWRaID0gY291bnRMZWFkaW5nWmVyb3NTbG93Q2FzZSgpOworICAgIHJldHVybiAoT25lcyArIExlYWRaICsgY291bnRUcmFpbGluZ1plcm9zKCkpID09IEJpdFdpZHRoOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBWYWx1ZSBHZW5lcmF0b3JzCisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgR2V0cyBtYXhpbXVtIHVuc2lnbmVkIHZhbHVlIG9mIEFQSW50IGZvciBzcGVjaWZpYyBiaXQgd2lkdGguCisgIHN0YXRpYyBBUEludCBnZXRNYXhWYWx1ZSh1bnNpZ25lZCBudW1CaXRzKSB7CisgICAgcmV0dXJuIGdldEFsbE9uZXNWYWx1ZShudW1CaXRzKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0cyBtYXhpbXVtIHNpZ25lZCB2YWx1ZSBvZiBBUEludCBmb3IgYSBzcGVjaWZpYyBiaXQgd2lkdGguCisgIHN0YXRpYyBBUEludCBnZXRTaWduZWRNYXhWYWx1ZSh1bnNpZ25lZCBudW1CaXRzKSB7CisgICAgQVBJbnQgQVBJID0gZ2V0QWxsT25lc1ZhbHVlKG51bUJpdHMpOworICAgIEFQSS5jbGVhckJpdChudW1CaXRzIC0gMSk7CisgICAgcmV0dXJuIEFQSTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0cyBtaW5pbXVtIHVuc2lnbmVkIHZhbHVlIG9mIEFQSW50IGZvciBhIHNwZWNpZmljIGJpdCB3aWR0aC4KKyAgc3RhdGljIEFQSW50IGdldE1pblZhbHVlKHVuc2lnbmVkIG51bUJpdHMpIHsgcmV0dXJuIEFQSW50KG51bUJpdHMsIDApOyB9CisKKyAgLy8vIFxicmllZiBHZXRzIG1pbmltdW0gc2lnbmVkIHZhbHVlIG9mIEFQSW50IGZvciBhIHNwZWNpZmljIGJpdCB3aWR0aC4KKyAgc3RhdGljIEFQSW50IGdldFNpZ25lZE1pblZhbHVlKHVuc2lnbmVkIG51bUJpdHMpIHsKKyAgICBBUEludCBBUEkobnVtQml0cywgMCk7CisgICAgQVBJLnNldEJpdChudW1CaXRzIC0gMSk7CisgICAgcmV0dXJuIEFQSTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBTaWduTWFzayBmb3IgYSBzcGVjaWZpYyBiaXQgd2lkdGguCisgIC8vLworICAvLy8gVGhpcyBpcyBqdXN0IGEgd3JhcHBlciBmdW5jdGlvbiBvZiBnZXRTaWduZWRNaW5WYWx1ZSgpLCBhbmQgaXQgaGVscHMgY29kZQorICAvLy8gcmVhZGFiaWxpdHkgd2hlbiB3ZSB3YW50IHRvIGdldCBhIFNpZ25NYXNrLgorICBzdGF0aWMgQVBJbnQgZ2V0U2lnbk1hc2sodW5zaWduZWQgQml0V2lkdGgpIHsKKyAgICByZXR1cm4gZ2V0U2lnbmVkTWluVmFsdWUoQml0V2lkdGgpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGFsbC1vbmVzIHZhbHVlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSBhbGwtb25lcyB2YWx1ZSBmb3IgYW4gQVBJbnQgb2YgdGhlIHNwZWNpZmllZCBiaXQtd2lkdGguCisgIHN0YXRpYyBBUEludCBnZXRBbGxPbmVzVmFsdWUodW5zaWduZWQgbnVtQml0cykgeworICAgIHJldHVybiBBUEludChudW1CaXRzLCBXT1JEX01BWCwgdHJ1ZSk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgJzAnIHZhbHVlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSAnMCcgdmFsdWUgZm9yIGFuIEFQSW50IG9mIHRoZSBzcGVjaWZpZWQgYml0LXdpZHRoLgorICBzdGF0aWMgQVBJbnQgZ2V0TnVsbFZhbHVlKHVuc2lnbmVkIG51bUJpdHMpIHsgcmV0dXJuIEFQSW50KG51bUJpdHMsIDApOyB9CisKKyAgLy8vIFxicmllZiBDb21wdXRlIGFuIEFQSW50IGNvbnRhaW5pbmcgbnVtQml0cyBoaWdoYml0cyBmcm9tIHRoaXMgQVBJbnQuCisgIC8vLworICAvLy8gR2V0IGFuIEFQSW50IHdpdGggdGhlIHNhbWUgQml0V2lkdGggYXMgdGhpcyBBUEludCwganVzdCB6ZXJvIG1hc2sKKyAgLy8vIHRoZSBsb3cgYml0cyBhbmQgcmlnaHQgc2hpZnQgdG8gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgaGlnaCAibnVtQml0cyIgYml0cyBvZiB0aGlzIEFQSW50LgorICBBUEludCBnZXRIaUJpdHModW5zaWduZWQgbnVtQml0cykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDb21wdXRlIGFuIEFQSW50IGNvbnRhaW5pbmcgbnVtQml0cyBsb3diaXRzIGZyb20gdGhpcyBBUEludC4KKyAgLy8vCisgIC8vLyBHZXQgYW4gQVBJbnQgd2l0aCB0aGUgc2FtZSBCaXRXaWR0aCBhcyB0aGlzIEFQSW50LCBqdXN0IHplcm8gbWFzaworICAvLy8gdGhlIGhpZ2ggYml0cy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgbG93ICJudW1CaXRzIiBiaXRzIG9mIHRoaXMgQVBJbnQuCisgIEFQSW50IGdldExvQml0cyh1bnNpZ25lZCBudW1CaXRzKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiBhbiBBUEludCB3aXRoIGV4YWN0bHkgb25lIGJpdCBzZXQgaW4gdGhlIHJlc3VsdC4KKyAgc3RhdGljIEFQSW50IGdldE9uZUJpdFNldCh1bnNpZ25lZCBudW1CaXRzLCB1bnNpZ25lZCBCaXRObykgeworICAgIEFQSW50IFJlcyhudW1CaXRzLCAwKTsKKyAgICBSZXMuc2V0Qml0KEJpdE5vKTsKKyAgICByZXR1cm4gUmVzOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgYSB2YWx1ZSB3aXRoIGEgYmxvY2sgb2YgYml0cyBzZXQuCisgIC8vLworICAvLy8gQ29uc3RydWN0cyBhbiBBUEludCB2YWx1ZSB0aGF0IGhhcyBhIGNvbnRpZ3VvdXMgcmFuZ2Ugb2YgYml0cyBzZXQuIFRoZQorICAvLy8gYml0cyBmcm9tIGxvQml0IChpbmNsdXNpdmUpIHRvIGhpQml0IChleGNsdXNpdmUpIHdpbGwgYmUgc2V0LiBBbGwgb3RoZXIKKyAgLy8vIGJpdHMgd2lsbCBiZSB6ZXJvLiBGb3IgZXhhbXBsZSwgd2l0aCBwYXJhbWV0ZXJzKDMyLCAwLCAxNikgeW91IHdvdWxkIGdldAorICAvLy8gMHgwMDAwRkZGRi4gSWYgaGlCaXQgaXMgbGVzcyB0aGFuIGxvQml0IHRoZW4gdGhlIHNldCBiaXRzICJ3cmFwIi4gRm9yCisgIC8vLyBleGFtcGxlLCB3aXRoIHBhcmFtZXRlcnMgKDMyLCAyOCwgNCksIHlvdSB3b3VsZCBnZXQgMHhGMDAwMDAwRi4KKyAgLy8vCisgIC8vLyBccGFyYW0gbnVtQml0cyB0aGUgaW50ZW5kZWQgYml0IHdpZHRoIG9mIHRoZSByZXN1bHQKKyAgLy8vIFxwYXJhbSBsb0JpdCB0aGUgaW5kZXggb2YgdGhlIGxvd2VzdCBiaXQgc2V0LgorICAvLy8gXHBhcmFtIGhpQml0IHRoZSBpbmRleCBvZiB0aGUgaGlnaGVzdCBiaXQgc2V0LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIEFuIEFQSW50IHZhbHVlIHdpdGggdGhlIHJlcXVlc3RlZCBiaXRzIHNldC4KKyAgc3RhdGljIEFQSW50IGdldEJpdHNTZXQodW5zaWduZWQgbnVtQml0cywgdW5zaWduZWQgbG9CaXQsIHVuc2lnbmVkIGhpQml0KSB7CisgICAgQVBJbnQgUmVzKG51bUJpdHMsIDApOworICAgIFJlcy5zZXRCaXRzKGxvQml0LCBoaUJpdCk7CisgICAgcmV0dXJuIFJlczsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGEgdmFsdWUgd2l0aCB1cHBlciBiaXRzIHN0YXJ0aW5nIGF0IGxvQml0IHNldC4KKyAgLy8vCisgIC8vLyBDb25zdHJ1Y3RzIGFuIEFQSW50IHZhbHVlIHRoYXQgaGFzIGEgY29udGlndW91cyByYW5nZSBvZiBiaXRzIHNldC4gVGhlCisgIC8vLyBiaXRzIGZyb20gbG9CaXQgKGluY2x1c2l2ZSkgdG8gbnVtQml0cyAoZXhjbHVzaXZlKSB3aWxsIGJlIHNldC4gQWxsIG90aGVyCisgIC8vLyBiaXRzIHdpbGwgYmUgemVyby4gRm9yIGV4YW1wbGUsIHdpdGggcGFyYW1ldGVycygzMiwgMTIpIHlvdSB3b3VsZCBnZXQKKyAgLy8vIDB4RkZGRkYwMDAuCisgIC8vLworICAvLy8gXHBhcmFtIG51bUJpdHMgdGhlIGludGVuZGVkIGJpdCB3aWR0aCBvZiB0aGUgcmVzdWx0CisgIC8vLyBccGFyYW0gbG9CaXQgdGhlIGluZGV4IG9mIHRoZSBsb3dlc3QgYml0IHRvIHNldC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBBbiBBUEludCB2YWx1ZSB3aXRoIHRoZSByZXF1ZXN0ZWQgYml0cyBzZXQuCisgIHN0YXRpYyBBUEludCBnZXRCaXRzU2V0RnJvbSh1bnNpZ25lZCBudW1CaXRzLCB1bnNpZ25lZCBsb0JpdCkgeworICAgIEFQSW50IFJlcyhudW1CaXRzLCAwKTsKKyAgICBSZXMuc2V0Qml0c0Zyb20obG9CaXQpOworICAgIHJldHVybiBSZXM7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCBhIHZhbHVlIHdpdGggaGlnaCBiaXRzIHNldAorICAvLy8KKyAgLy8vIENvbnN0cnVjdHMgYW4gQVBJbnQgdmFsdWUgdGhhdCBoYXMgdGhlIHRvcCBoaUJpdHNTZXQgYml0cyBzZXQuCisgIC8vLworICAvLy8gXHBhcmFtIG51bUJpdHMgdGhlIGJpdHdpZHRoIG9mIHRoZSByZXN1bHQKKyAgLy8vIFxwYXJhbSBoaUJpdHNTZXQgdGhlIG51bWJlciBvZiBoaWdoLW9yZGVyIGJpdHMgc2V0IGluIHRoZSByZXN1bHQuCisgIHN0YXRpYyBBUEludCBnZXRIaWdoQml0c1NldCh1bnNpZ25lZCBudW1CaXRzLCB1bnNpZ25lZCBoaUJpdHNTZXQpIHsKKyAgICBBUEludCBSZXMobnVtQml0cywgMCk7CisgICAgUmVzLnNldEhpZ2hCaXRzKGhpQml0c1NldCk7CisgICAgcmV0dXJuIFJlczsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGEgdmFsdWUgd2l0aCBsb3cgYml0cyBzZXQKKyAgLy8vCisgIC8vLyBDb25zdHJ1Y3RzIGFuIEFQSW50IHZhbHVlIHRoYXQgaGFzIHRoZSBib3R0b20gbG9CaXRzU2V0IGJpdHMgc2V0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBudW1CaXRzIHRoZSBiaXR3aWR0aCBvZiB0aGUgcmVzdWx0CisgIC8vLyBccGFyYW0gbG9CaXRzU2V0IHRoZSBudW1iZXIgb2YgbG93LW9yZGVyIGJpdHMgc2V0IGluIHRoZSByZXN1bHQuCisgIHN0YXRpYyBBUEludCBnZXRMb3dCaXRzU2V0KHVuc2lnbmVkIG51bUJpdHMsIHVuc2lnbmVkIGxvQml0c1NldCkgeworICAgIEFQSW50IFJlcyhudW1CaXRzLCAwKTsKKyAgICBSZXMuc2V0TG93Qml0cyhsb0JpdHNTZXQpOworICAgIHJldHVybiBSZXM7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBhIHZhbHVlIGNvbnRhaW5pbmcgViBicm9hZGNhc3RlZCBvdmVyIE5ld0xlbiBiaXRzLgorICBzdGF0aWMgQVBJbnQgZ2V0U3BsYXQodW5zaWduZWQgTmV3TGVuLCBjb25zdCBBUEludCAmVik7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgaWYgdHdvIEFQSW50cyBoYXZlIHRoZSBzYW1lIHZhbHVlLCBhZnRlciB6ZXJvLWV4dGVuZGluZworICAvLy8gb25lIG9mIHRoZW0gKGlmIG5lZWRlZCEpIHRvIGVuc3VyZSB0aGF0IHRoZSBiaXQtd2lkdGhzIG1hdGNoLgorICBzdGF0aWMgYm9vbCBpc1NhbWVWYWx1ZShjb25zdCBBUEludCAmSTEsIGNvbnN0IEFQSW50ICZJMikgeworICAgIGlmIChJMS5nZXRCaXRXaWR0aCgpID09IEkyLmdldEJpdFdpZHRoKCkpCisgICAgICByZXR1cm4gSTEgPT0gSTI7CisKKyAgICBpZiAoSTEuZ2V0Qml0V2lkdGgoKSA+IEkyLmdldEJpdFdpZHRoKCkpCisgICAgICByZXR1cm4gSTEgPT0gSTIuemV4dChJMS5nZXRCaXRXaWR0aCgpKTsKKworICAgIHJldHVybiBJMS56ZXh0KEkyLmdldEJpdFdpZHRoKCkpID09IEkyOworICB9CisKKyAgLy8vIFxicmllZiBPdmVybG9hZCB0byBjb21wdXRlIGEgaGFzaF9jb2RlIGZvciBhbiBBUEludCB2YWx1ZS4KKyAgZnJpZW5kIGhhc2hfY29kZSBoYXNoX3ZhbHVlKGNvbnN0IEFQSW50ICZBcmcpOworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBpbnRlcm5hbCBzdG9yYWdlIG9mIHRoZSBBUEludC4KKyAgLy8vIFRoaXMgaXMgdXNlZnVsIGZvciB3cml0aW5nIG91dCB0aGUgQVBJbnQgaW4gYmluYXJ5IGZvcm0gd2l0aG91dCBhbnkKKyAgLy8vIGNvbnZlcnNpb25zLgorICBjb25zdCB1aW50NjRfdCAqZ2V0UmF3RGF0YSgpIGNvbnN0IHsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgICByZXR1cm4gJlUuVkFMOworICAgIHJldHVybiAmVS5wVmFsWzBdOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBVbmFyeSBPcGVyYXRvcnMKKyAgLy8vIEB7CisKKyAgLy8vIFxicmllZiBQb3N0Zml4IGluY3JlbWVudCBvcGVyYXRvci4KKyAgLy8vCisgIC8vLyBJbmNyZW1lbnRzICp0aGlzIGJ5IDEuCisgIC8vLworICAvLy8gXHJldHVybnMgYSBuZXcgQVBJbnQgdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBvcmlnaW5hbCB2YWx1ZSBvZiAqdGhpcy4KKyAgY29uc3QgQVBJbnQgb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBBUEludCBBUEkoKnRoaXMpOworICAgICsrKCp0aGlzKTsKKyAgICByZXR1cm4gQVBJOworICB9CisKKyAgLy8vIFxicmllZiBQcmVmaXggaW5jcmVtZW50IG9wZXJhdG9yLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zICp0aGlzIGluY3JlbWVudGVkIGJ5IG9uZQorICBBUEludCAmb3BlcmF0b3IrKygpOworCisgIC8vLyBcYnJpZWYgUG9zdGZpeCBkZWNyZW1lbnQgb3BlcmF0b3IuCisgIC8vLworICAvLy8gRGVjcmVtZW50cyAqdGhpcyBieSAxLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgbmV3IEFQSW50IHZhbHVlIHJlcHJlc2VudGluZyB0aGUgb3JpZ2luYWwgdmFsdWUgb2YgKnRoaXMuCisgIGNvbnN0IEFQSW50IG9wZXJhdG9yLS0oaW50KSB7CisgICAgQVBJbnQgQVBJKCp0aGlzKTsKKyAgICAtLSgqdGhpcyk7CisgICAgcmV0dXJuIEFQSTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUHJlZml4IGRlY3JlbWVudCBvcGVyYXRvci4KKyAgLy8vCisgIC8vLyBccmV0dXJucyAqdGhpcyBkZWNyZW1lbnRlZCBieSBvbmUuCisgIEFQSW50ICZvcGVyYXRvci0tKCk7CisKKyAgLy8vIFxicmllZiBMb2dpY2FsIG5lZ2F0aW9uIG9wZXJhdG9yLgorICAvLy8KKyAgLy8vIFBlcmZvcm1zIGxvZ2ljYWwgbmVnYXRpb24gb3BlcmF0aW9uIG9uIHRoaXMgQVBJbnQuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiAqdGhpcyBpcyB6ZXJvLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgb3BlcmF0b3IhKCkgY29uc3QgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIHJldHVybiBVLlZBTCA9PSAwOworICAgIHJldHVybiBjb3VudExlYWRpbmdaZXJvc1Nsb3dDYXNlKCkgPT0gQml0V2lkdGg7CisgIH0KKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIEFzc2lnbm1lbnQgT3BlcmF0b3JzCisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgQ29weSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zICp0aGlzIGFmdGVyIGFzc2lnbm1lbnQgb2YgUkhTLgorICBBUEludCAmb3BlcmF0b3I9KGNvbnN0IEFQSW50ICZSSFMpIHsKKyAgICAvLyBJZiB0aGUgYml0d2lkdGhzIGFyZSB0aGUgc2FtZSwgd2UgY2FuIGF2b2lkIG11Y2tpbmcgd2l0aCBtZW1vcnkKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkgJiYgUkhTLmlzU2luZ2xlV29yZCgpKSB7CisgICAgICBVLlZBTCA9IFJIUy5VLlZBTDsKKyAgICAgIEJpdFdpZHRoID0gUkhTLkJpdFdpZHRoOworICAgICAgcmV0dXJuIGNsZWFyVW51c2VkQml0cygpOworICAgIH0KKworICAgIEFzc2lnblNsb3dDYXNlKFJIUyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIEBicmllZiBNb3ZlIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgIEFQSW50ICZvcGVyYXRvcj0oQVBJbnQgJiZ0aGF0KSB7CisgICAgYXNzZXJ0KHRoaXMgIT0gJnRoYXQgJiYgIlNlbGYtbW92ZSBub3Qgc3VwcG9ydGVkIik7CisgICAgaWYgKCFpc1NpbmdsZVdvcmQoKSkKKyAgICAgIGRlbGV0ZVtdIFUucFZhbDsKKworICAgIC8vIFVzZSBtZW1jcHkgc28gdGhhdCB0eXBlIGJhc2VkIGFsaWFzIGFuYWx5c2lzIHNlZXMgYm90aCBWQUwgYW5kIHBWYWwKKyAgICAvLyBhcyBtb2RpZmllZC4KKyAgICBtZW1jcHkoJlUsICZ0aGF0LlUsIHNpemVvZihVKSk7CisKKyAgICBCaXRXaWR0aCA9IHRoYXQuQml0V2lkdGg7CisgICAgdGhhdC5CaXRXaWR0aCA9IDA7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gXGJyaWVmIEFzc2lnbm1lbnQgb3BlcmF0b3IuCisgIC8vLworICAvLy8gVGhlIFJIUyB2YWx1ZSBpcyBhc3NpZ25lZCB0byAqdGhpcy4gSWYgdGhlIHNpZ25pZmljYW50IGJpdHMgaW4gUkhTIGV4Y2VlZAorICAvLy8gdGhlIGJpdCB3aWR0aCwgdGhlIGV4Y2VzcyBiaXRzIGFyZSB0cnVuY2F0ZWQuIElmIHRoZSBiaXQgd2lkdGggaXMgbGFyZ2VyCisgIC8vLyB0aGFuIDY0LCB0aGUgdmFsdWUgaXMgemVybyBmaWxsZWQgaW4gdGhlIHVuc3BlY2lmaWVkIGhpZ2ggb3JkZXIgYml0cy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyAqdGhpcyBhZnRlciBhc3NpZ25tZW50IG9mIFJIUyB2YWx1ZS4KKyAgQVBJbnQgJm9wZXJhdG9yPSh1aW50NjRfdCBSSFMpIHsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpIHsKKyAgICAgIFUuVkFMID0gUkhTOworICAgICAgY2xlYXJVbnVzZWRCaXRzKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFUucFZhbFswXSA9IFJIUzsKKyAgICAgIG1lbXNldChVLnBWYWwrMSwgMCwgKGdldE51bVdvcmRzKCkgLSAxKSAqIEFQSU5UX1dPUkRfU0laRSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBcYnJpZWYgQml0d2lzZSBBTkQgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgLy8vCisgIC8vLyBQZXJmb3JtcyBhIGJpdHdpc2UgQU5EIG9wZXJhdGlvbiBvbiB0aGlzIEFQSW50IGFuZCBSSFMuIFRoZSByZXN1bHQgaXMKKyAgLy8vIGFzc2lnbmVkIHRvICp0aGlzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zICp0aGlzIGFmdGVyIEFORGluZyB3aXRoIFJIUy4KKyAgQVBJbnQgJm9wZXJhdG9yJj0oY29uc3QgQVBJbnQgJlJIUykgeworICAgIGFzc2VydChCaXRXaWR0aCA9PSBSSFMuQml0V2lkdGggJiYgIkJpdCB3aWR0aHMgbXVzdCBiZSB0aGUgc2FtZSIpOworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIFUuVkFMICY9IFJIUy5VLlZBTDsKKyAgICBlbHNlCisgICAgICBBbmRBc3NpZ25TbG93Q2FzZShSSFMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBcYnJpZWYgQml0d2lzZSBBTkQgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgLy8vCisgIC8vLyBQZXJmb3JtcyBhIGJpdHdpc2UgQU5EIG9wZXJhdGlvbiBvbiB0aGlzIEFQSW50IGFuZCBSSFMuIFJIUyBpcworICAvLy8gbG9naWNhbGx5IHplcm8tZXh0ZW5kZWQgb3IgdHJ1bmNhdGVkIHRvIG1hdGNoIHRoZSBiaXQtd2lkdGggb2YKKyAgLy8vIHRoZSBMSFMuCisgIEFQSW50ICZvcGVyYXRvciY9KHVpbnQ2NF90IFJIUykgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkgeworICAgICAgVS5WQUwgJj0gUkhTOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBVLnBWYWxbMF0gJj0gUkhTOworICAgIG1lbXNldChVLnBWYWwrMSwgMCwgKGdldE51bVdvcmRzKCkgLSAxKSAqIEFQSU5UX1dPUkRfU0laRSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxicmllZiBCaXR3aXNlIE9SIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgIC8vLworICAvLy8gUGVyZm9ybXMgYSBiaXR3aXNlIE9SIG9wZXJhdGlvbiBvbiB0aGlzIEFQSW50IGFuZCBSSFMuIFRoZSByZXN1bHQgaXMKKyAgLy8vIGFzc2lnbmVkICp0aGlzOworICAvLy8KKyAgLy8vIFxyZXR1cm5zICp0aGlzIGFmdGVyIE9SaW5nIHdpdGggUkhTLgorICBBUEludCAmb3BlcmF0b3J8PShjb25zdCBBUEludCAmUkhTKSB7CisgICAgYXNzZXJ0KEJpdFdpZHRoID09IFJIUy5CaXRXaWR0aCAmJiAiQml0IHdpZHRocyBtdXN0IGJlIHRoZSBzYW1lIik7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgVS5WQUwgfD0gUkhTLlUuVkFMOworICAgIGVsc2UKKyAgICAgIE9yQXNzaWduU2xvd0Nhc2UoUkhTKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gXGJyaWVmIEJpdHdpc2UgT1IgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgLy8vCisgIC8vLyBQZXJmb3JtcyBhIGJpdHdpc2UgT1Igb3BlcmF0aW9uIG9uIHRoaXMgQVBJbnQgYW5kIFJIUy4gUkhTIGlzCisgIC8vLyBsb2dpY2FsbHkgemVyby1leHRlbmRlZCBvciB0cnVuY2F0ZWQgdG8gbWF0Y2ggdGhlIGJpdC13aWR0aCBvZgorICAvLy8gdGhlIExIUy4KKyAgQVBJbnQgJm9wZXJhdG9yfD0odWludDY0X3QgUkhTKSB7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKSB7CisgICAgICBVLlZBTCB8PSBSSFM7CisgICAgICBjbGVhclVudXNlZEJpdHMoKTsKKyAgICB9IGVsc2UgeworICAgICAgVS5wVmFsWzBdIHw9IFJIUzsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxicmllZiBCaXR3aXNlIFhPUiBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAvLy8KKyAgLy8vIFBlcmZvcm1zIGEgYml0d2lzZSBYT1Igb3BlcmF0aW9uIG9uIHRoaXMgQVBJbnQgYW5kIFJIUy4gVGhlIHJlc3VsdCBpcworICAvLy8gYXNzaWduZWQgdG8gKnRoaXMuCisgIC8vLworICAvLy8gXHJldHVybnMgKnRoaXMgYWZ0ZXIgWE9SaW5nIHdpdGggUkhTLgorICBBUEludCAmb3BlcmF0b3JePShjb25zdCBBUEludCAmUkhTKSB7CisgICAgYXNzZXJ0KEJpdFdpZHRoID09IFJIUy5CaXRXaWR0aCAmJiAiQml0IHdpZHRocyBtdXN0IGJlIHRoZSBzYW1lIik7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgVS5WQUwgXj0gUkhTLlUuVkFMOworICAgIGVsc2UKKyAgICAgIFhvckFzc2lnblNsb3dDYXNlKFJIUyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxicmllZiBCaXR3aXNlIFhPUiBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAvLy8KKyAgLy8vIFBlcmZvcm1zIGEgYml0d2lzZSBYT1Igb3BlcmF0aW9uIG9uIHRoaXMgQVBJbnQgYW5kIFJIUy4gUkhTIGlzCisgIC8vLyBsb2dpY2FsbHkgemVyby1leHRlbmRlZCBvciB0cnVuY2F0ZWQgdG8gbWF0Y2ggdGhlIGJpdC13aWR0aCBvZgorICAvLy8gdGhlIExIUy4KKyAgQVBJbnQgJm9wZXJhdG9yXj0odWludDY0X3QgUkhTKSB7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKSB7CisgICAgICBVLlZBTCBePSBSSFM7CisgICAgICBjbGVhclVudXNlZEJpdHMoKTsKKyAgICB9IGVsc2UgeworICAgICAgVS5wVmFsWzBdIF49IFJIUzsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxicmllZiBNdWx0aXBsaWNhdGlvbiBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAvLy8KKyAgLy8vIE11bHRpcGxpZXMgdGhpcyBBUEludCBieSBSSFMgYW5kIGFzc2lnbnMgdGhlIHJlc3VsdCB0byAqdGhpcy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyAqdGhpcworICBBUEludCAmb3BlcmF0b3IqPShjb25zdCBBUEludCAmUkhTKTsKKyAgQVBJbnQgJm9wZXJhdG9yKj0odWludDY0X3QgUkhTKTsKKworICAvLy8gXGJyaWVmIEFkZGl0aW9uIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgIC8vLworICAvLy8gQWRkcyBSSFMgdG8gKnRoaXMgYW5kIGFzc2lnbnMgdGhlIHJlc3VsdCB0byAqdGhpcy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyAqdGhpcworICBBUEludCAmb3BlcmF0b3IrPShjb25zdCBBUEludCAmUkhTKTsKKyAgQVBJbnQgJm9wZXJhdG9yKz0odWludDY0X3QgUkhTKTsKKworICAvLy8gXGJyaWVmIFN1YnRyYWN0aW9uIGFzc2lnbm1lbnQgb3BlcmF0b3IuCisgIC8vLworICAvLy8gU3VidHJhY3RzIFJIUyBmcm9tICp0aGlzIGFuZCBhc3NpZ25zIHRoZSByZXN1bHQgdG8gKnRoaXMuCisgIC8vLworICAvLy8gXHJldHVybnMgKnRoaXMKKyAgQVBJbnQgJm9wZXJhdG9yLT0oY29uc3QgQVBJbnQgJlJIUyk7CisgIEFQSW50ICZvcGVyYXRvci09KHVpbnQ2NF90IFJIUyk7CisKKyAgLy8vIFxicmllZiBMZWZ0LXNoaWZ0IGFzc2lnbm1lbnQgZnVuY3Rpb24uCisgIC8vLworICAvLy8gU2hpZnRzICp0aGlzIGxlZnQgYnkgc2hpZnRBbXQgYW5kIGFzc2lnbnMgdGhlIHJlc3VsdCB0byAqdGhpcy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyAqdGhpcyBhZnRlciBzaGlmdGluZyBsZWZ0IGJ5IFNoaWZ0QW10CisgIEFQSW50ICZvcGVyYXRvcjw8PSh1bnNpZ25lZCBTaGlmdEFtdCkgeworICAgIGFzc2VydChTaGlmdEFtdCA8PSBCaXRXaWR0aCAmJiAiSW52YWxpZCBzaGlmdCBhbW91bnQiKTsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpIHsKKyAgICAgIGlmIChTaGlmdEFtdCA9PSBCaXRXaWR0aCkKKyAgICAgICAgVS5WQUwgPSAwOworICAgICAgZWxzZQorICAgICAgICBVLlZBTCA8PD0gU2hpZnRBbXQ7CisgICAgICByZXR1cm4gY2xlYXJVbnVzZWRCaXRzKCk7CisgICAgfQorICAgIHNobFNsb3dDYXNlKFNoaWZ0QW10KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gXGJyaWVmIExlZnQtc2hpZnQgYXNzaWdubWVudCBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBTaGlmdHMgKnRoaXMgbGVmdCBieSBzaGlmdEFtdCBhbmQgYXNzaWducyB0aGUgcmVzdWx0IHRvICp0aGlzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zICp0aGlzIGFmdGVyIHNoaWZ0aW5nIGxlZnQgYnkgU2hpZnRBbXQKKyAgQVBJbnQgJm9wZXJhdG9yPDw9KGNvbnN0IEFQSW50ICZTaGlmdEFtdCk7CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBCaW5hcnkgT3BlcmF0b3JzCisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgTXVsdGlwbGljYXRpb24gb3BlcmF0b3IuCisgIC8vLworICAvLy8gTXVsdGlwbGllcyB0aGlzIEFQSW50IGJ5IFJIUyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0LgorICBBUEludCBvcGVyYXRvciooY29uc3QgQVBJbnQgJlJIUykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBMZWZ0IGxvZ2ljYWwgc2hpZnQgb3BlcmF0b3IuCisgIC8vLworICAvLy8gU2hpZnRzIHRoaXMgQVBJbnQgbGVmdCBieSBccCBCaXRzIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisgIEFQSW50IG9wZXJhdG9yPDwodW5zaWduZWQgQml0cykgY29uc3QgeyByZXR1cm4gc2hsKEJpdHMpOyB9CisKKyAgLy8vIFxicmllZiBMZWZ0IGxvZ2ljYWwgc2hpZnQgb3BlcmF0b3IuCisgIC8vLworICAvLy8gU2hpZnRzIHRoaXMgQVBJbnQgbGVmdCBieSBccCBCaXRzIGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCisgIEFQSW50IG9wZXJhdG9yPDwoY29uc3QgQVBJbnQgJkJpdHMpIGNvbnN0IHsgcmV0dXJuIHNobChCaXRzKTsgfQorCisgIC8vLyBcYnJpZWYgQXJpdGhtZXRpYyByaWdodC1zaGlmdCBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBBcml0aG1ldGljIHJpZ2h0LXNoaWZ0IHRoaXMgQVBJbnQgYnkgc2hpZnRBbXQuCisgIEFQSW50IGFzaHIodW5zaWduZWQgU2hpZnRBbXQpIGNvbnN0IHsKKyAgICBBUEludCBSKCp0aGlzKTsKKyAgICBSLmFzaHJJblBsYWNlKFNoaWZ0QW10KTsKKyAgICByZXR1cm4gUjsKKyAgfQorCisgIC8vLyBBcml0aG1ldGljIHJpZ2h0LXNoaWZ0IHRoaXMgQVBJbnQgYnkgU2hpZnRBbXQgaW4gcGxhY2UuCisgIHZvaWQgYXNockluUGxhY2UodW5zaWduZWQgU2hpZnRBbXQpIHsKKyAgICBhc3NlcnQoU2hpZnRBbXQgPD0gQml0V2lkdGggJiYgIkludmFsaWQgc2hpZnQgYW1vdW50Iik7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKSB7CisgICAgICBpbnQ2NF90IFNFeHRWQUwgPSBTaWduRXh0ZW5kNjQoVS5WQUwsIEJpdFdpZHRoKTsKKyAgICAgIGlmIChTaGlmdEFtdCA9PSBCaXRXaWR0aCkKKyAgICAgICAgVS5WQUwgPSBTRXh0VkFMID4+IChBUElOVF9CSVRTX1BFUl9XT1JEIC0gMSk7IC8vIEZpbGwgd2l0aCBzaWduIGJpdC4KKyAgICAgIGVsc2UKKyAgICAgICAgVS5WQUwgPSBTRXh0VkFMID4+IFNoaWZ0QW10OworICAgICAgY2xlYXJVbnVzZWRCaXRzKCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGFzaHJTbG93Q2FzZShTaGlmdEFtdCk7CisgIH0KKworICAvLy8gXGJyaWVmIExvZ2ljYWwgcmlnaHQtc2hpZnQgZnVuY3Rpb24uCisgIC8vLworICAvLy8gTG9naWNhbCByaWdodC1zaGlmdCB0aGlzIEFQSW50IGJ5IHNoaWZ0QW10LgorICBBUEludCBsc2hyKHVuc2lnbmVkIHNoaWZ0QW10KSBjb25zdCB7CisgICAgQVBJbnQgUigqdGhpcyk7CisgICAgUi5sc2hySW5QbGFjZShzaGlmdEFtdCk7CisgICAgcmV0dXJuIFI7CisgIH0KKworICAvLy8gTG9naWNhbCByaWdodC1zaGlmdCB0aGlzIEFQSW50IGJ5IFNoaWZ0QW10IGluIHBsYWNlLgorICB2b2lkIGxzaHJJblBsYWNlKHVuc2lnbmVkIFNoaWZ0QW10KSB7CisgICAgYXNzZXJ0KFNoaWZ0QW10IDw9IEJpdFdpZHRoICYmICJJbnZhbGlkIHNoaWZ0IGFtb3VudCIpOworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkgeworICAgICAgaWYgKFNoaWZ0QW10ID09IEJpdFdpZHRoKQorICAgICAgICBVLlZBTCA9IDA7CisgICAgICBlbHNlCisgICAgICAgIFUuVkFMID4+PSBTaGlmdEFtdDsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgbHNoclNsb3dDYXNlKFNoaWZ0QW10KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgTGVmdC1zaGlmdCBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBMZWZ0LXNoaWZ0IHRoaXMgQVBJbnQgYnkgc2hpZnRBbXQuCisgIEFQSW50IHNobCh1bnNpZ25lZCBzaGlmdEFtdCkgY29uc3QgeworICAgIEFQSW50IFIoKnRoaXMpOworICAgIFIgPDw9IHNoaWZ0QW10OworICAgIHJldHVybiBSOworICB9CisKKyAgLy8vIFxicmllZiBSb3RhdGUgbGVmdCBieSByb3RhdGVBbXQuCisgIEFQSW50IHJvdGwodW5zaWduZWQgcm90YXRlQW10KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJvdGF0ZSByaWdodCBieSByb3RhdGVBbXQuCisgIEFQSW50IHJvdHIodW5zaWduZWQgcm90YXRlQW10KSBjb25zdDsKKworICAvLy8gXGJyaWVmIEFyaXRobWV0aWMgcmlnaHQtc2hpZnQgZnVuY3Rpb24uCisgIC8vLworICAvLy8gQXJpdGhtZXRpYyByaWdodC1zaGlmdCB0aGlzIEFQSW50IGJ5IHNoaWZ0QW10LgorICBBUEludCBhc2hyKGNvbnN0IEFQSW50ICZTaGlmdEFtdCkgY29uc3QgeworICAgIEFQSW50IFIoKnRoaXMpOworICAgIFIuYXNockluUGxhY2UoU2hpZnRBbXQpOworICAgIHJldHVybiBSOworICB9CisKKyAgLy8vIEFyaXRobWV0aWMgcmlnaHQtc2hpZnQgdGhpcyBBUEludCBieSBzaGlmdEFtdCBpbiBwbGFjZS4KKyAgdm9pZCBhc2hySW5QbGFjZShjb25zdCBBUEludCAmc2hpZnRBbXQpOworCisgIC8vLyBcYnJpZWYgTG9naWNhbCByaWdodC1zaGlmdCBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBMb2dpY2FsIHJpZ2h0LXNoaWZ0IHRoaXMgQVBJbnQgYnkgc2hpZnRBbXQuCisgIEFQSW50IGxzaHIoY29uc3QgQVBJbnQgJlNoaWZ0QW10KSBjb25zdCB7CisgICAgQVBJbnQgUigqdGhpcyk7CisgICAgUi5sc2hySW5QbGFjZShTaGlmdEFtdCk7CisgICAgcmV0dXJuIFI7CisgIH0KKworICAvLy8gTG9naWNhbCByaWdodC1zaGlmdCB0aGlzIEFQSW50IGJ5IFNoaWZ0QW10IGluIHBsYWNlLgorICB2b2lkIGxzaHJJblBsYWNlKGNvbnN0IEFQSW50ICZTaGlmdEFtdCk7CisKKyAgLy8vIFxicmllZiBMZWZ0LXNoaWZ0IGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIExlZnQtc2hpZnQgdGhpcyBBUEludCBieSBzaGlmdEFtdC4KKyAgQVBJbnQgc2hsKGNvbnN0IEFQSW50ICZTaGlmdEFtdCkgY29uc3QgeworICAgIEFQSW50IFIoKnRoaXMpOworICAgIFIgPDw9IFNoaWZ0QW10OworICAgIHJldHVybiBSOworICB9CisKKyAgLy8vIFxicmllZiBSb3RhdGUgbGVmdCBieSByb3RhdGVBbXQuCisgIEFQSW50IHJvdGwoY29uc3QgQVBJbnQgJnJvdGF0ZUFtdCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSb3RhdGUgcmlnaHQgYnkgcm90YXRlQW10LgorICBBUEludCByb3RyKGNvbnN0IEFQSW50ICZyb3RhdGVBbXQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVW5zaWduZWQgZGl2aXNpb24gb3BlcmF0aW9uLgorICAvLy8KKyAgLy8vIFBlcmZvcm0gYW4gdW5zaWduZWQgZGl2aWRlIG9wZXJhdGlvbiBvbiB0aGlzIEFQSW50IGJ5IFJIUy4gQm90aCB0aGlzIGFuZAorICAvLy8gUkhTIGFyZSB0cmVhdGVkIGFzIHVuc2lnbmVkIHF1YW50aXRpZXMgZm9yIHB1cnBvc2VzIG9mIHRoaXMgZGl2aXNpb24uCisgIC8vLworICAvLy8gXHJldHVybnMgYSBuZXcgQVBJbnQgdmFsdWUgY29udGFpbmluZyB0aGUgZGl2aXNpb24gcmVzdWx0CisgIEFQSW50IHVkaXYoY29uc3QgQVBJbnQgJlJIUykgY29uc3Q7CisgIEFQSW50IHVkaXYodWludDY0X3QgUkhTKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFNpZ25lZCBkaXZpc2lvbiBmdW5jdGlvbiBmb3IgQVBJbnQuCisgIC8vLworICAvLy8gU2lnbmVkIGRpdmlkZSB0aGlzIEFQSW50IGJ5IEFQSW50IFJIUy4KKyAgQVBJbnQgc2Rpdihjb25zdCBBUEludCAmUkhTKSBjb25zdDsKKyAgQVBJbnQgc2RpdihpbnQ2NF90IFJIUykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBVbnNpZ25lZCByZW1haW5kZXIgb3BlcmF0aW9uLgorICAvLy8KKyAgLy8vIFBlcmZvcm0gYW4gdW5zaWduZWQgcmVtYWluZGVyIG9wZXJhdGlvbiBvbiB0aGlzIEFQSW50IHdpdGggUkhTIGJlaW5nIHRoZQorICAvLy8gZGl2aXNvci4gQm90aCB0aGlzIGFuZCBSSFMgYXJlIHRyZWF0ZWQgYXMgdW5zaWduZWQgcXVhbnRpdGllcyBmb3IgcHVycG9zZXMKKyAgLy8vIG9mIHRoaXMgb3BlcmF0aW9uLiBOb3RlIHRoYXQgdGhpcyBpcyBhIHRydWUgcmVtYWluZGVyIG9wZXJhdGlvbiBhbmQgbm90IGEKKyAgLy8vIG1vZHVsbyBvcGVyYXRpb24gYmVjYXVzZSB0aGUgc2lnbiBmb2xsb3dzIHRoZSBzaWduIG9mIHRoZSBkaXZpZGVuZCB3aGljaAorICAvLy8gaXMgKnRoaXMuCisgIC8vLworICAvLy8gXHJldHVybnMgYSBuZXcgQVBJbnQgdmFsdWUgY29udGFpbmluZyB0aGUgcmVtYWluZGVyIHJlc3VsdAorICBBUEludCB1cmVtKGNvbnN0IEFQSW50ICZSSFMpIGNvbnN0OworICB1aW50NjRfdCB1cmVtKHVpbnQ2NF90IFJIUykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBGdW5jdGlvbiBmb3Igc2lnbmVkIHJlbWFpbmRlciBvcGVyYXRpb24uCisgIC8vLworICAvLy8gU2lnbmVkIHJlbWFpbmRlciBvcGVyYXRpb24gb24gQVBJbnQuCisgIEFQSW50IHNyZW0oY29uc3QgQVBJbnQgJlJIUykgY29uc3Q7CisgIGludDY0X3Qgc3JlbShpbnQ2NF90IFJIUykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEdWFsIGRpdmlzaW9uL3JlbWFpbmRlciBpbnRlcmZhY2UuCisgIC8vLworICAvLy8gU29tZXRpbWVzIGl0IGlzIGNvbnZlbmllbnQgdG8gZGl2aWRlIHR3byBBUEludCB2YWx1ZXMgYW5kIG9idGFpbiBib3RoIHRoZQorICAvLy8gcXVvdGllbnQgYW5kIHJlbWFpbmRlci4gVGhpcyBmdW5jdGlvbiBkb2VzIGJvdGggb3BlcmF0aW9ucyBpbiB0aGUgc2FtZQorICAvLy8gY29tcHV0YXRpb24gbWFraW5nIGl0IGEgbGl0dGxlIG1vcmUgZWZmaWNpZW50LiBUaGUgcGFpciBvZiBpbnB1dCBhcmd1bWVudHMKKyAgLy8vIG1heSBvdmVybGFwIHdpdGggdGhlIHBhaXIgb2Ygb3V0cHV0IGFyZ3VtZW50cy4gSXQgaXMgc2FmZSB0byBjYWxsCisgIC8vLyB1ZGl2cmVtKFgsIFksIFgsIFkpLCBmb3IgZXhhbXBsZS4KKyAgc3RhdGljIHZvaWQgdWRpdnJlbShjb25zdCBBUEludCAmTEhTLCBjb25zdCBBUEludCAmUkhTLCBBUEludCAmUXVvdGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgJlJlbWFpbmRlcik7CisgIHN0YXRpYyB2b2lkIHVkaXZyZW0oY29uc3QgQVBJbnQgJkxIUywgdWludDY0X3QgUkhTLCBBUEludCAmUXVvdGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgJlJlbWFpbmRlcik7CisKKyAgc3RhdGljIHZvaWQgc2RpdnJlbShjb25zdCBBUEludCAmTEhTLCBjb25zdCBBUEludCAmUkhTLCBBUEludCAmUXVvdGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgJlJlbWFpbmRlcik7CisgIHN0YXRpYyB2b2lkIHNkaXZyZW0oY29uc3QgQVBJbnQgJkxIUywgaW50NjRfdCBSSFMsIEFQSW50ICZRdW90aWVudCwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICZSZW1haW5kZXIpOworCisgIC8vIE9wZXJhdGlvbnMgdGhhdCByZXR1cm4gb3ZlcmZsb3cgaW5kaWNhdG9ycy4KKyAgQVBJbnQgc2FkZF9vdihjb25zdCBBUEludCAmUkhTLCBib29sICZPdmVyZmxvdykgY29uc3Q7CisgIEFQSW50IHVhZGRfb3YoY29uc3QgQVBJbnQgJlJIUywgYm9vbCAmT3ZlcmZsb3cpIGNvbnN0OworICBBUEludCBzc3ViX292KGNvbnN0IEFQSW50ICZSSFMsIGJvb2wgJk92ZXJmbG93KSBjb25zdDsKKyAgQVBJbnQgdXN1Yl9vdihjb25zdCBBUEludCAmUkhTLCBib29sICZPdmVyZmxvdykgY29uc3Q7CisgIEFQSW50IHNkaXZfb3YoY29uc3QgQVBJbnQgJlJIUywgYm9vbCAmT3ZlcmZsb3cpIGNvbnN0OworICBBUEludCBzbXVsX292KGNvbnN0IEFQSW50ICZSSFMsIGJvb2wgJk92ZXJmbG93KSBjb25zdDsKKyAgQVBJbnQgdW11bF9vdihjb25zdCBBUEludCAmUkhTLCBib29sICZPdmVyZmxvdykgY29uc3Q7CisgIEFQSW50IHNzaGxfb3YoY29uc3QgQVBJbnQgJkFtdCwgYm9vbCAmT3ZlcmZsb3cpIGNvbnN0OworICBBUEludCB1c2hsX292KGNvbnN0IEFQSW50ICZBbXQsIGJvb2wgJk92ZXJmbG93KSBjb25zdDsKKworICAvLy8gXGJyaWVmIEFycmF5LWluZGV4aW5nIHN1cHBvcnQuCisgIC8vLworICAvLy8gXHJldHVybnMgdGhlIGJpdCB2YWx1ZSBhdCBiaXRQb3NpdGlvbgorICBib29sIG9wZXJhdG9yW10odW5zaWduZWQgYml0UG9zaXRpb24pIGNvbnN0IHsKKyAgICBhc3NlcnQoYml0UG9zaXRpb24gPCBnZXRCaXRXaWR0aCgpICYmICJCaXQgcG9zaXRpb24gb3V0IG9mIGJvdW5kcyEiKTsKKyAgICByZXR1cm4gKG1hc2tCaXQoYml0UG9zaXRpb24pICYgZ2V0V29yZChiaXRQb3NpdGlvbikpICE9IDA7CisgIH0KKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIENvbXBhcmlzb24gT3BlcmF0b3JzCisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgRXF1YWxpdHkgb3BlcmF0b3IuCisgIC8vLworICAvLy8gQ29tcGFyZXMgdGhpcyBBUEludCB3aXRoIFJIUyBmb3IgdGhlIHZhbGlkaXR5IG9mIHRoZSBlcXVhbGl0eQorICAvLy8gcmVsYXRpb25zaGlwLgorICBib29sIG9wZXJhdG9yPT0oY29uc3QgQVBJbnQgJlJIUykgY29uc3QgeworICAgIGFzc2VydChCaXRXaWR0aCA9PSBSSFMuQml0V2lkdGggJiYgIkNvbXBhcmlzb24gcmVxdWlyZXMgZXF1YWwgYml0IHdpZHRocyIpOworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIHJldHVybiBVLlZBTCA9PSBSSFMuVS5WQUw7CisgICAgcmV0dXJuIEVxdWFsU2xvd0Nhc2UoUkhTKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRXF1YWxpdHkgb3BlcmF0b3IuCisgIC8vLworICAvLy8gQ29tcGFyZXMgdGhpcyBBUEludCB3aXRoIGEgdWludDY0X3QgZm9yIHRoZSB2YWxpZGl0eSBvZiB0aGUgZXF1YWxpdHkKKyAgLy8vIHJlbGF0aW9uc2hpcC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmICp0aGlzID09IFZhbAorICBib29sIG9wZXJhdG9yPT0odWludDY0X3QgVmFsKSBjb25zdCB7CisgICAgcmV0dXJuIChpc1NpbmdsZVdvcmQoKSB8fCBnZXRBY3RpdmVCaXRzKCkgPD0gNjQpICYmIGdldFpFeHRWYWx1ZSgpID09IFZhbDsKKyAgfQorCisgIC8vLyBcYnJpZWYgRXF1YWxpdHkgY29tcGFyaXNvbi4KKyAgLy8vCisgIC8vLyBDb21wYXJlcyB0aGlzIEFQSW50IHdpdGggUkhTIGZvciB0aGUgdmFsaWRpdHkgb2YgdGhlIGVxdWFsaXR5CisgIC8vLyByZWxhdGlvbnNoaXAuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiAqdGhpcyA9PSBWYWwKKyAgYm9vbCBlcShjb25zdCBBUEludCAmUkhTKSBjb25zdCB7IHJldHVybiAoKnRoaXMpID09IFJIUzsgfQorCisgIC8vLyBcYnJpZWYgSW5lcXVhbGl0eSBvcGVyYXRvci4KKyAgLy8vCisgIC8vLyBDb21wYXJlcyB0aGlzIEFQSW50IHdpdGggUkhTIGZvciB0aGUgdmFsaWRpdHkgb2YgdGhlIGluZXF1YWxpdHkKKyAgLy8vIHJlbGF0aW9uc2hpcC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmICp0aGlzICE9IFZhbAorICBib29sIG9wZXJhdG9yIT0oY29uc3QgQVBJbnQgJlJIUykgY29uc3QgeyByZXR1cm4gISgoKnRoaXMpID09IFJIUyk7IH0KKworICAvLy8gXGJyaWVmIEluZXF1YWxpdHkgb3BlcmF0b3IuCisgIC8vLworICAvLy8gQ29tcGFyZXMgdGhpcyBBUEludCB3aXRoIGEgdWludDY0X3QgZm9yIHRoZSB2YWxpZGl0eSBvZiB0aGUgaW5lcXVhbGl0eQorICAvLy8gcmVsYXRpb25zaGlwLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgKnRoaXMgIT0gVmFsCisgIGJvb2wgb3BlcmF0b3IhPSh1aW50NjRfdCBWYWwpIGNvbnN0IHsgcmV0dXJuICEoKCp0aGlzKSA9PSBWYWwpOyB9CisKKyAgLy8vIFxicmllZiBJbmVxdWFsaXR5IGNvbXBhcmlzb24KKyAgLy8vCisgIC8vLyBDb21wYXJlcyB0aGlzIEFQSW50IHdpdGggUkhTIGZvciB0aGUgdmFsaWRpdHkgb2YgdGhlIGluZXF1YWxpdHkKKyAgLy8vIHJlbGF0aW9uc2hpcC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmICp0aGlzICE9IFZhbAorICBib29sIG5lKGNvbnN0IEFQSW50ICZSSFMpIGNvbnN0IHsgcmV0dXJuICEoKCp0aGlzKSA9PSBSSFMpOyB9CisKKyAgLy8vIFxicmllZiBVbnNpZ25lZCBsZXNzIHRoYW4gY29tcGFyaXNvbgorICAvLy8KKyAgLy8vIFJlZ2FyZHMgYm90aCAqdGhpcyBhbmQgUkhTIGFzIHVuc2lnbmVkIHF1YW50aXRpZXMgYW5kIGNvbXBhcmVzIHRoZW0gZm9yCisgIC8vLyB0aGUgdmFsaWRpdHkgb2YgdGhlIGxlc3MtdGhhbiByZWxhdGlvbnNoaXAuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiAqdGhpcyA8IFJIUyB3aGVuIGJvdGggYXJlIGNvbnNpZGVyZWQgdW5zaWduZWQuCisgIGJvb2wgdWx0KGNvbnN0IEFQSW50ICZSSFMpIGNvbnN0IHsgcmV0dXJuIGNvbXBhcmUoUkhTKSA8IDA7IH0KKworICAvLy8gXGJyaWVmIFVuc2lnbmVkIGxlc3MgdGhhbiBjb21wYXJpc29uCisgIC8vLworICAvLy8gUmVnYXJkcyBib3RoICp0aGlzIGFzIGFuIHVuc2lnbmVkIHF1YW50aXR5IGFuZCBjb21wYXJlcyBpdCB3aXRoIFJIUyBmb3IKKyAgLy8vIHRoZSB2YWxpZGl0eSBvZiB0aGUgbGVzcy10aGFuIHJlbGF0aW9uc2hpcC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmICp0aGlzIDwgUkhTIHdoZW4gY29uc2lkZXJlZCB1bnNpZ25lZC4KKyAgYm9vbCB1bHQodWludDY0X3QgUkhTKSBjb25zdCB7CisgICAgLy8gT25seSBuZWVkIHRvIGNoZWNrIGFjdGl2ZSBiaXRzIGlmIG5vdCBhIHNpbmdsZSB3b3JkLgorICAgIHJldHVybiAoaXNTaW5nbGVXb3JkKCkgfHwgZ2V0QWN0aXZlQml0cygpIDw9IDY0KSAmJiBnZXRaRXh0VmFsdWUoKSA8IFJIUzsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2lnbmVkIGxlc3MgdGhhbiBjb21wYXJpc29uCisgIC8vLworICAvLy8gUmVnYXJkcyBib3RoICp0aGlzIGFuZCBSSFMgYXMgc2lnbmVkIHF1YW50aXRpZXMgYW5kIGNvbXBhcmVzIHRoZW0gZm9yCisgIC8vLyB2YWxpZGl0eSBvZiB0aGUgbGVzcy10aGFuIHJlbGF0aW9uc2hpcC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmICp0aGlzIDwgUkhTIHdoZW4gYm90aCBhcmUgY29uc2lkZXJlZCBzaWduZWQuCisgIGJvb2wgc2x0KGNvbnN0IEFQSW50ICZSSFMpIGNvbnN0IHsgcmV0dXJuIGNvbXBhcmVTaWduZWQoUkhTKSA8IDA7IH0KKworICAvLy8gXGJyaWVmIFNpZ25lZCBsZXNzIHRoYW4gY29tcGFyaXNvbgorICAvLy8KKyAgLy8vIFJlZ2FyZHMgYm90aCAqdGhpcyBhcyBhIHNpZ25lZCBxdWFudGl0eSBhbmQgY29tcGFyZXMgaXQgd2l0aCBSSFMgZm9yCisgIC8vLyB0aGUgdmFsaWRpdHkgb2YgdGhlIGxlc3MtdGhhbiByZWxhdGlvbnNoaXAuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiAqdGhpcyA8IFJIUyB3aGVuIGNvbnNpZGVyZWQgc2lnbmVkLgorICBib29sIHNsdChpbnQ2NF90IFJIUykgY29uc3QgeworICAgIHJldHVybiAoIWlzU2luZ2xlV29yZCgpICYmIGdldE1pblNpZ25lZEJpdHMoKSA+IDY0KSA/IGlzTmVnYXRpdmUoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGdldFNFeHRWYWx1ZSgpIDwgUkhTOworICB9CisKKyAgLy8vIFxicmllZiBVbnNpZ25lZCBsZXNzIG9yIGVxdWFsIGNvbXBhcmlzb24KKyAgLy8vCisgIC8vLyBSZWdhcmRzIGJvdGggKnRoaXMgYW5kIFJIUyBhcyB1bnNpZ25lZCBxdWFudGl0aWVzIGFuZCBjb21wYXJlcyB0aGVtIGZvcgorICAvLy8gdmFsaWRpdHkgb2YgdGhlIGxlc3Mtb3ItZXF1YWwgcmVsYXRpb25zaGlwLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgKnRoaXMgPD0gUkhTIHdoZW4gYm90aCBhcmUgY29uc2lkZXJlZCB1bnNpZ25lZC4KKyAgYm9vbCB1bGUoY29uc3QgQVBJbnQgJlJIUykgY29uc3QgeyByZXR1cm4gY29tcGFyZShSSFMpIDw9IDA7IH0KKworICAvLy8gXGJyaWVmIFVuc2lnbmVkIGxlc3Mgb3IgZXF1YWwgY29tcGFyaXNvbgorICAvLy8KKyAgLy8vIFJlZ2FyZHMgYm90aCAqdGhpcyBhcyBhbiB1bnNpZ25lZCBxdWFudGl0eSBhbmQgY29tcGFyZXMgaXQgd2l0aCBSSFMgZm9yCisgIC8vLyB0aGUgdmFsaWRpdHkgb2YgdGhlIGxlc3Mtb3ItZXF1YWwgcmVsYXRpb25zaGlwLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgKnRoaXMgPD0gUkhTIHdoZW4gY29uc2lkZXJlZCB1bnNpZ25lZC4KKyAgYm9vbCB1bGUodWludDY0X3QgUkhTKSBjb25zdCB7IHJldHVybiAhdWd0KFJIUyk7IH0KKworICAvLy8gXGJyaWVmIFNpZ25lZCBsZXNzIG9yIGVxdWFsIGNvbXBhcmlzb24KKyAgLy8vCisgIC8vLyBSZWdhcmRzIGJvdGggKnRoaXMgYW5kIFJIUyBhcyBzaWduZWQgcXVhbnRpdGllcyBhbmQgY29tcGFyZXMgdGhlbSBmb3IKKyAgLy8vIHZhbGlkaXR5IG9mIHRoZSBsZXNzLW9yLWVxdWFsIHJlbGF0aW9uc2hpcC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmICp0aGlzIDw9IFJIUyB3aGVuIGJvdGggYXJlIGNvbnNpZGVyZWQgc2lnbmVkLgorICBib29sIHNsZShjb25zdCBBUEludCAmUkhTKSBjb25zdCB7IHJldHVybiBjb21wYXJlU2lnbmVkKFJIUykgPD0gMDsgfQorCisgIC8vLyBcYnJpZWYgU2lnbmVkIGxlc3Mgb3IgZXF1YWwgY29tcGFyaXNvbgorICAvLy8KKyAgLy8vIFJlZ2FyZHMgYm90aCAqdGhpcyBhcyBhIHNpZ25lZCBxdWFudGl0eSBhbmQgY29tcGFyZXMgaXQgd2l0aCBSSFMgZm9yIHRoZQorICAvLy8gdmFsaWRpdHkgb2YgdGhlIGxlc3Mtb3ItZXF1YWwgcmVsYXRpb25zaGlwLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgKnRoaXMgPD0gUkhTIHdoZW4gY29uc2lkZXJlZCBzaWduZWQuCisgIGJvb2wgc2xlKHVpbnQ2NF90IFJIUykgY29uc3QgeyByZXR1cm4gIXNndChSSFMpOyB9CisKKyAgLy8vIFxicmllZiBVbnNpZ25lZCBncmVhdGhlciB0aGFuIGNvbXBhcmlzb24KKyAgLy8vCisgIC8vLyBSZWdhcmRzIGJvdGggKnRoaXMgYW5kIFJIUyBhcyB1bnNpZ25lZCBxdWFudGl0aWVzIGFuZCBjb21wYXJlcyB0aGVtIGZvcgorICAvLy8gdGhlIHZhbGlkaXR5IG9mIHRoZSBncmVhdGVyLXRoYW4gcmVsYXRpb25zaGlwLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgKnRoaXMgPiBSSFMgd2hlbiBib3RoIGFyZSBjb25zaWRlcmVkIHVuc2lnbmVkLgorICBib29sIHVndChjb25zdCBBUEludCAmUkhTKSBjb25zdCB7IHJldHVybiAhdWxlKFJIUyk7IH0KKworICAvLy8gXGJyaWVmIFVuc2lnbmVkIGdyZWF0ZXIgdGhhbiBjb21wYXJpc29uCisgIC8vLworICAvLy8gUmVnYXJkcyBib3RoICp0aGlzIGFzIGFuIHVuc2lnbmVkIHF1YW50aXR5IGFuZCBjb21wYXJlcyBpdCB3aXRoIFJIUyBmb3IKKyAgLy8vIHRoZSB2YWxpZGl0eSBvZiB0aGUgZ3JlYXRlci10aGFuIHJlbGF0aW9uc2hpcC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmICp0aGlzID4gUkhTIHdoZW4gY29uc2lkZXJlZCB1bnNpZ25lZC4KKyAgYm9vbCB1Z3QodWludDY0X3QgUkhTKSBjb25zdCB7CisgICAgLy8gT25seSBuZWVkIHRvIGNoZWNrIGFjdGl2ZSBiaXRzIGlmIG5vdCBhIHNpbmdsZSB3b3JkLgorICAgIHJldHVybiAoIWlzU2luZ2xlV29yZCgpICYmIGdldEFjdGl2ZUJpdHMoKSA+IDY0KSB8fCBnZXRaRXh0VmFsdWUoKSA+IFJIUzsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2lnbmVkIGdyZWF0aGVyIHRoYW4gY29tcGFyaXNvbgorICAvLy8KKyAgLy8vIFJlZ2FyZHMgYm90aCAqdGhpcyBhbmQgUkhTIGFzIHNpZ25lZCBxdWFudGl0aWVzIGFuZCBjb21wYXJlcyB0aGVtIGZvciB0aGUKKyAgLy8vIHZhbGlkaXR5IG9mIHRoZSBncmVhdGVyLXRoYW4gcmVsYXRpb25zaGlwLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgKnRoaXMgPiBSSFMgd2hlbiBib3RoIGFyZSBjb25zaWRlcmVkIHNpZ25lZC4KKyAgYm9vbCBzZ3QoY29uc3QgQVBJbnQgJlJIUykgY29uc3QgeyByZXR1cm4gIXNsZShSSFMpOyB9CisKKyAgLy8vIFxicmllZiBTaWduZWQgZ3JlYXRlciB0aGFuIGNvbXBhcmlzb24KKyAgLy8vCisgIC8vLyBSZWdhcmRzIGJvdGggKnRoaXMgYXMgYSBzaWduZWQgcXVhbnRpdHkgYW5kIGNvbXBhcmVzIGl0IHdpdGggUkhTIGZvcgorICAvLy8gdGhlIHZhbGlkaXR5IG9mIHRoZSBncmVhdGVyLXRoYW4gcmVsYXRpb25zaGlwLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgKnRoaXMgPiBSSFMgd2hlbiBjb25zaWRlcmVkIHNpZ25lZC4KKyAgYm9vbCBzZ3QoaW50NjRfdCBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gKCFpc1NpbmdsZVdvcmQoKSAmJiBnZXRNaW5TaWduZWRCaXRzKCkgPiA2NCkgPyAhaXNOZWdhdGl2ZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogZ2V0U0V4dFZhbHVlKCkgPiBSSFM7CisgIH0KKworICAvLy8gXGJyaWVmIFVuc2lnbmVkIGdyZWF0ZXIgb3IgZXF1YWwgY29tcGFyaXNvbgorICAvLy8KKyAgLy8vIFJlZ2FyZHMgYm90aCAqdGhpcyBhbmQgUkhTIGFzIHVuc2lnbmVkIHF1YW50aXRpZXMgYW5kIGNvbXBhcmVzIHRoZW0gZm9yCisgIC8vLyB2YWxpZGl0eSBvZiB0aGUgZ3JlYXRlci1vci1lcXVhbCByZWxhdGlvbnNoaXAuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiAqdGhpcyA+PSBSSFMgd2hlbiBib3RoIGFyZSBjb25zaWRlcmVkIHVuc2lnbmVkLgorICBib29sIHVnZShjb25zdCBBUEludCAmUkhTKSBjb25zdCB7IHJldHVybiAhdWx0KFJIUyk7IH0KKworICAvLy8gXGJyaWVmIFVuc2lnbmVkIGdyZWF0ZXIgb3IgZXF1YWwgY29tcGFyaXNvbgorICAvLy8KKyAgLy8vIFJlZ2FyZHMgYm90aCAqdGhpcyBhcyBhbiB1bnNpZ25lZCBxdWFudGl0eSBhbmQgY29tcGFyZXMgaXQgd2l0aCBSSFMgZm9yCisgIC8vLyB0aGUgdmFsaWRpdHkgb2YgdGhlIGdyZWF0ZXItb3ItZXF1YWwgcmVsYXRpb25zaGlwLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgKnRoaXMgPj0gUkhTIHdoZW4gY29uc2lkZXJlZCB1bnNpZ25lZC4KKyAgYm9vbCB1Z2UodWludDY0X3QgUkhTKSBjb25zdCB7IHJldHVybiAhdWx0KFJIUyk7IH0KKworICAvLy8gXGJyaWVmIFNpZ25lZCBncmVhdGVyIG9yIGVxdWFsIGNvbXBhcmlzb24KKyAgLy8vCisgIC8vLyBSZWdhcmRzIGJvdGggKnRoaXMgYW5kIFJIUyBhcyBzaWduZWQgcXVhbnRpdGllcyBhbmQgY29tcGFyZXMgdGhlbSBmb3IKKyAgLy8vIHZhbGlkaXR5IG9mIHRoZSBncmVhdGVyLW9yLWVxdWFsIHJlbGF0aW9uc2hpcC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmICp0aGlzID49IFJIUyB3aGVuIGJvdGggYXJlIGNvbnNpZGVyZWQgc2lnbmVkLgorICBib29sIHNnZShjb25zdCBBUEludCAmUkhTKSBjb25zdCB7IHJldHVybiAhc2x0KFJIUyk7IH0KKworICAvLy8gXGJyaWVmIFNpZ25lZCBncmVhdGVyIG9yIGVxdWFsIGNvbXBhcmlzb24KKyAgLy8vCisgIC8vLyBSZWdhcmRzIGJvdGggKnRoaXMgYXMgYSBzaWduZWQgcXVhbnRpdHkgYW5kIGNvbXBhcmVzIGl0IHdpdGggUkhTIGZvcgorICAvLy8gdGhlIHZhbGlkaXR5IG9mIHRoZSBncmVhdGVyLW9yLWVxdWFsIHJlbGF0aW9uc2hpcC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmICp0aGlzID49IFJIUyB3aGVuIGNvbnNpZGVyZWQgc2lnbmVkLgorICBib29sIHNnZShpbnQ2NF90IFJIUykgY29uc3QgeyByZXR1cm4gIXNsdChSSFMpOyB9CisKKyAgLy8vIFRoaXMgb3BlcmF0aW9uIHRlc3RzIGlmIHRoZXJlIGFyZSBhbnkgcGFpcnMgb2YgY29ycmVzcG9uZGluZyBiaXRzCisgIC8vLyBiZXR3ZWVuIHRoaXMgQVBJbnQgYW5kIFJIUyB0aGF0IGFyZSBib3RoIHNldC4KKyAgYm9vbCBpbnRlcnNlY3RzKGNvbnN0IEFQSW50ICZSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoQml0V2lkdGggPT0gUkhTLkJpdFdpZHRoICYmICJCaXQgd2lkdGhzIG11c3QgYmUgdGhlIHNhbWUiKTsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgICByZXR1cm4gKFUuVkFMICYgUkhTLlUuVkFMKSAhPSAwOworICAgIHJldHVybiBpbnRlcnNlY3RzU2xvd0Nhc2UoUkhTKTsKKyAgfQorCisgIC8vLyBUaGlzIG9wZXJhdGlvbiBjaGVja3MgdGhhdCBhbGwgYml0cyBzZXQgaW4gdGhpcyBBUEludCBhcmUgYWxzbyBzZXQgaW4gUkhTLgorICBib29sIGlzU3Vic2V0T2YoY29uc3QgQVBJbnQgJlJIUykgY29uc3QgeworICAgIGFzc2VydChCaXRXaWR0aCA9PSBSSFMuQml0V2lkdGggJiYgIkJpdCB3aWR0aHMgbXVzdCBiZSB0aGUgc2FtZSIpOworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIHJldHVybiAoVS5WQUwgJiB+UkhTLlUuVkFMKSA9PSAwOworICAgIHJldHVybiBpc1N1YnNldE9mU2xvd0Nhc2UoUkhTKTsKKyAgfQorCisgIC8vLyBAfQorICAvLy8gXG5hbWUgUmVzaXppbmcgT3BlcmF0b3JzCisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgVHJ1bmNhdGUgdG8gbmV3IHdpZHRoLgorICAvLy8KKyAgLy8vIFRydW5jYXRlIHRoZSBBUEludCB0byBhIHNwZWNpZmllZCB3aWR0aC4gSXQgaXMgYW4gZXJyb3IgdG8gc3BlY2lmeSBhIHdpZHRoCisgIC8vLyB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCB3aWR0aC4KKyAgQVBJbnQgdHJ1bmModW5zaWduZWQgd2lkdGgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgU2lnbiBleHRlbmQgdG8gYSBuZXcgd2lkdGguCisgIC8vLworICAvLy8gVGhpcyBvcGVyYXRpb24gc2lnbiBleHRlbmRzIHRoZSBBUEludCB0byBhIG5ldyB3aWR0aC4gSWYgdGhlIGhpZ2ggb3JkZXIKKyAgLy8vIGJpdCBpcyBzZXQsIHRoZSBmaWxsIG9uIHRoZSBsZWZ0IHdpbGwgYmUgZG9uZSB3aXRoIDEgYml0cywgb3RoZXJ3aXNlIHplcm8uCisgIC8vLyBJdCBpcyBhbiBlcnJvciB0byBzcGVjaWZ5IGEgd2lkdGggdGhhdCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlCisgIC8vLyBjdXJyZW50IHdpZHRoLgorICBBUEludCBzZXh0KHVuc2lnbmVkIHdpZHRoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFplcm8gZXh0ZW5kIHRvIGEgbmV3IHdpZHRoLgorICAvLy8KKyAgLy8vIFRoaXMgb3BlcmF0aW9uIHplcm8gZXh0ZW5kcyB0aGUgQVBJbnQgdG8gYSBuZXcgd2lkdGguIFRoZSBoaWdoIG9yZGVyIGJpdHMKKyAgLy8vIGFyZSBmaWxsZWQgd2l0aCAwIGJpdHMuICBJdCBpcyBhbiBlcnJvciB0byBzcGVjaWZ5IGEgd2lkdGggdGhhdCBpcyBsZXNzCisgIC8vLyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IHdpZHRoLgorICBBUEludCB6ZXh0KHVuc2lnbmVkIHdpZHRoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFNpZ24gZXh0ZW5kIG9yIHRydW5jYXRlIHRvIHdpZHRoCisgIC8vLworICAvLy8gTWFrZSB0aGlzIEFQSW50IGhhdmUgdGhlIGJpdCB3aWR0aCBnaXZlbiBieSBccCB3aWR0aC4gVGhlIHZhbHVlIGlzIHNpZ24KKyAgLy8vIGV4dGVuZGVkLCB0cnVuY2F0ZWQsIG9yIGxlZnQgYWxvbmUgdG8gbWFrZSBpdCB0aGF0IHdpZHRoLgorICBBUEludCBzZXh0T3JUcnVuYyh1bnNpZ25lZCB3aWR0aCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBaZXJvIGV4dGVuZCBvciB0cnVuY2F0ZSB0byB3aWR0aAorICAvLy8KKyAgLy8vIE1ha2UgdGhpcyBBUEludCBoYXZlIHRoZSBiaXQgd2lkdGggZ2l2ZW4gYnkgXHAgd2lkdGguIFRoZSB2YWx1ZSBpcyB6ZXJvCisgIC8vLyBleHRlbmRlZCwgdHJ1bmNhdGVkLCBvciBsZWZ0IGFsb25lIHRvIG1ha2UgaXQgdGhhdCB3aWR0aC4KKyAgQVBJbnQgemV4dE9yVHJ1bmModW5zaWduZWQgd2lkdGgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgU2lnbiBleHRlbmQgb3IgdHJ1bmNhdGUgdG8gd2lkdGgKKyAgLy8vCisgIC8vLyBNYWtlIHRoaXMgQVBJbnQgaGF2ZSB0aGUgYml0IHdpZHRoIGdpdmVuIGJ5IFxwIHdpZHRoLiBUaGUgdmFsdWUgaXMgc2lnbgorICAvLy8gZXh0ZW5kZWQsIG9yIGxlZnQgYWxvbmUgdG8gbWFrZSBpdCB0aGF0IHdpZHRoLgorICBBUEludCBzZXh0T3JTZWxmKHVuc2lnbmVkIHdpZHRoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFplcm8gZXh0ZW5kIG9yIHRydW5jYXRlIHRvIHdpZHRoCisgIC8vLworICAvLy8gTWFrZSB0aGlzIEFQSW50IGhhdmUgdGhlIGJpdCB3aWR0aCBnaXZlbiBieSBccCB3aWR0aC4gVGhlIHZhbHVlIGlzIHplcm8KKyAgLy8vIGV4dGVuZGVkLCBvciBsZWZ0IGFsb25lIHRvIG1ha2UgaXQgdGhhdCB3aWR0aC4KKyAgQVBJbnQgemV4dE9yU2VsZih1bnNpZ25lZCB3aWR0aCkgY29uc3Q7CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBCaXQgTWFuaXB1bGF0aW9uIE9wZXJhdG9ycworICAvLy8gQHsKKworICAvLy8gXGJyaWVmIFNldCBldmVyeSBiaXQgdG8gMS4KKyAgdm9pZCBzZXRBbGxCaXRzKCkgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIFUuVkFMID0gV09SRF9NQVg7CisgICAgZWxzZQorICAgICAgLy8gU2V0IGFsbCB0aGUgYml0cyBpbiBhbGwgdGhlIHdvcmRzLgorICAgICAgbWVtc2V0KFUucFZhbCwgLTEsIGdldE51bVdvcmRzKCkgKiBBUElOVF9XT1JEX1NJWkUpOworICAgIC8vIENsZWFyIHRoZSB1bnVzZWQgb25lcworICAgIGNsZWFyVW51c2VkQml0cygpOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgYSBnaXZlbiBiaXQgdG8gMS4KKyAgLy8vCisgIC8vLyBTZXQgdGhlIGdpdmVuIGJpdCB0byAxIHdob3NlIHBvc2l0aW9uIGlzIGdpdmVuIGFzICJiaXRQb3NpdGlvbiIuCisgIHZvaWQgc2V0Qml0KHVuc2lnbmVkIEJpdFBvc2l0aW9uKSB7CisgICAgYXNzZXJ0KEJpdFBvc2l0aW9uIDw9IEJpdFdpZHRoICYmICJCaXRQb3NpdGlvbiBvdXQgb2YgcmFuZ2UiKTsKKyAgICBXb3JkVHlwZSBNYXNrID0gbWFza0JpdChCaXRQb3NpdGlvbik7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgVS5WQUwgfD0gTWFzazsKKyAgICBlbHNlCisgICAgICBVLnBWYWxbd2hpY2hXb3JkKEJpdFBvc2l0aW9uKV0gfD0gTWFzazsKKyAgfQorCisgIC8vLyBTZXQgdGhlIHNpZ24gYml0IHRvIDEuCisgIHZvaWQgc2V0U2lnbkJpdCgpIHsKKyAgICBzZXRCaXQoQml0V2lkdGggLSAxKTsKKyAgfQorCisgIC8vLyBTZXQgdGhlIGJpdHMgZnJvbSBsb0JpdCAoaW5jbHVzaXZlKSB0byBoaUJpdCAoZXhjbHVzaXZlKSB0byAxLgorICB2b2lkIHNldEJpdHModW5zaWduZWQgbG9CaXQsIHVuc2lnbmVkIGhpQml0KSB7CisgICAgYXNzZXJ0KGhpQml0IDw9IEJpdFdpZHRoICYmICJoaUJpdCBvdXQgb2YgcmFuZ2UiKTsKKyAgICBhc3NlcnQobG9CaXQgPD0gQml0V2lkdGggJiYgImxvQml0IG91dCBvZiByYW5nZSIpOworICAgIGFzc2VydChsb0JpdCA8PSBoaUJpdCAmJiAibG9CaXQgZ3JlYXRlciB0aGFuIGhpQml0Iik7CisgICAgaWYgKGxvQml0ID09IGhpQml0KQorICAgICAgcmV0dXJuOworICAgIGlmIChsb0JpdCA8IEFQSU5UX0JJVFNfUEVSX1dPUkQgJiYgaGlCaXQgPD0gQVBJTlRfQklUU19QRVJfV09SRCkgeworICAgICAgdWludDY0X3QgbWFzayA9IFdPUkRfTUFYID4+IChBUElOVF9CSVRTX1BFUl9XT1JEIC0gKGhpQml0IC0gbG9CaXQpKTsKKyAgICAgIG1hc2sgPDw9IGxvQml0OworICAgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgICBVLlZBTCB8PSBtYXNrOworICAgICAgZWxzZQorICAgICAgICBVLnBWYWxbMF0gfD0gbWFzazsKKyAgICB9IGVsc2UgeworICAgICAgc2V0Qml0c1Nsb3dDYXNlKGxvQml0LCBoaUJpdCk7CisgICAgfQorICB9CisKKyAgLy8vIFNldCB0aGUgdG9wIGJpdHMgc3RhcnRpbmcgZnJvbSBsb0JpdC4KKyAgdm9pZCBzZXRCaXRzRnJvbSh1bnNpZ25lZCBsb0JpdCkgeworICAgIHJldHVybiBzZXRCaXRzKGxvQml0LCBCaXRXaWR0aCk7CisgIH0KKworICAvLy8gU2V0IHRoZSBib3R0b20gbG9CaXRzIGJpdHMuCisgIHZvaWQgc2V0TG93Qml0cyh1bnNpZ25lZCBsb0JpdHMpIHsKKyAgICByZXR1cm4gc2V0Qml0cygwLCBsb0JpdHMpOworICB9CisKKyAgLy8vIFNldCB0aGUgdG9wIGhpQml0cyBiaXRzLgorICB2b2lkIHNldEhpZ2hCaXRzKHVuc2lnbmVkIGhpQml0cykgeworICAgIHJldHVybiBzZXRCaXRzKEJpdFdpZHRoIC0gaGlCaXRzLCBCaXRXaWR0aCk7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCBldmVyeSBiaXQgdG8gMC4KKyAgdm9pZCBjbGVhckFsbEJpdHMoKSB7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgVS5WQUwgPSAwOworICAgIGVsc2UKKyAgICAgIG1lbXNldChVLnBWYWwsIDAsIGdldE51bVdvcmRzKCkgKiBBUElOVF9XT1JEX1NJWkUpOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgYSBnaXZlbiBiaXQgdG8gMC4KKyAgLy8vCisgIC8vLyBTZXQgdGhlIGdpdmVuIGJpdCB0byAwIHdob3NlIHBvc2l0aW9uIGlzIGdpdmVuIGFzICJiaXRQb3NpdGlvbiIuCisgIHZvaWQgY2xlYXJCaXQodW5zaWduZWQgQml0UG9zaXRpb24pIHsKKyAgICBhc3NlcnQoQml0UG9zaXRpb24gPD0gQml0V2lkdGggJiYgIkJpdFBvc2l0aW9uIG91dCBvZiByYW5nZSIpOworICAgIFdvcmRUeXBlIE1hc2sgPSB+bWFza0JpdChCaXRQb3NpdGlvbik7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgVS5WQUwgJj0gTWFzazsKKyAgICBlbHNlCisgICAgICBVLnBWYWxbd2hpY2hXb3JkKEJpdFBvc2l0aW9uKV0gJj0gTWFzazsKKyAgfQorCisgIC8vLyBTZXQgdGhlIHNpZ24gYml0IHRvIDAuCisgIHZvaWQgY2xlYXJTaWduQml0KCkgeworICAgIGNsZWFyQml0KEJpdFdpZHRoIC0gMSk7CisgIH0KKworICAvLy8gXGJyaWVmIFRvZ2dsZSBldmVyeSBiaXQgdG8gaXRzIG9wcG9zaXRlIHZhbHVlLgorICB2b2lkIGZsaXBBbGxCaXRzKCkgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkgeworICAgICAgVS5WQUwgXj0gV09SRF9NQVg7CisgICAgICBjbGVhclVudXNlZEJpdHMoKTsKKyAgICB9IGVsc2UgeworICAgICAgZmxpcEFsbEJpdHNTbG93Q2FzZSgpOworICAgIH0KKyAgfQorCisgIC8vLyBcYnJpZWYgVG9nZ2xlcyBhIGdpdmVuIGJpdCB0byBpdHMgb3Bwb3NpdGUgdmFsdWUuCisgIC8vLworICAvLy8gVG9nZ2xlIGEgZ2l2ZW4gYml0IHRvIGl0cyBvcHBvc2l0ZSB2YWx1ZSB3aG9zZSBwb3NpdGlvbiBpcyBnaXZlbgorICAvLy8gYXMgImJpdFBvc2l0aW9uIi4KKyAgdm9pZCBmbGlwQml0KHVuc2lnbmVkIGJpdFBvc2l0aW9uKTsKKworICAvLy8gTmVnYXRlIHRoaXMgQVBJbnQgaW4gcGxhY2UuCisgIHZvaWQgbmVnYXRlKCkgeworICAgIGZsaXBBbGxCaXRzKCk7CisgICAgKysoKnRoaXMpOworICB9CisKKyAgLy8vIEluc2VydCB0aGUgYml0cyBmcm9tIGEgc21hbGxlciBBUEludCBzdGFydGluZyBhdCBiaXRQb3NpdGlvbi4KKyAgdm9pZCBpbnNlcnRCaXRzKGNvbnN0IEFQSW50ICZTdWJCaXRzLCB1bnNpZ25lZCBiaXRQb3NpdGlvbik7CisKKyAgLy8vIFJldHVybiBhbiBBUEludCB3aXRoIHRoZSBleHRyYWN0ZWQgYml0cyBbYml0UG9zaXRpb24sYml0UG9zaXRpb24rbnVtQml0cykuCisgIEFQSW50IGV4dHJhY3RCaXRzKHVuc2lnbmVkIG51bUJpdHMsIHVuc2lnbmVkIGJpdFBvc2l0aW9uKSBjb25zdDsKKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIFZhbHVlIENoYXJhY3Rlcml6YXRpb24gRnVuY3Rpb25zCisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgQVBJbnQuCisgIHVuc2lnbmVkIGdldEJpdFdpZHRoKCkgY29uc3QgeyByZXR1cm4gQml0V2lkdGg7IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbnVtYmVyIG9mIHdvcmRzLgorICAvLy8KKyAgLy8vIEhlcmUgb25lIHdvcmQncyBiaXR3aWR0aCBlcXVhbHMgdG8gdGhhdCBvZiB1aW50NjRfdC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgbnVtYmVyIG9mIHdvcmRzIHRvIGhvbGQgdGhlIGludGVnZXIgdmFsdWUgb2YgdGhpcyBBUEludC4KKyAgdW5zaWduZWQgZ2V0TnVtV29yZHMoKSBjb25zdCB7IHJldHVybiBnZXROdW1Xb3JkcyhCaXRXaWR0aCk7IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbnVtYmVyIG9mIHdvcmRzLgorICAvLy8KKyAgLy8vICpOT1RFKiBIZXJlIG9uZSB3b3JkJ3MgYml0d2lkdGggZXF1YWxzIHRvIHRoYXQgb2YgdWludDY0X3QuCisgIC8vLworICAvLy8gXHJldHVybnMgdGhlIG51bWJlciBvZiB3b3JkcyB0byBob2xkIHRoZSBpbnRlZ2VyIHZhbHVlIHdpdGggYSBnaXZlbiBiaXQKKyAgLy8vIHdpZHRoLgorICBzdGF0aWMgdW5zaWduZWQgZ2V0TnVtV29yZHModW5zaWduZWQgQml0V2lkdGgpIHsKKyAgICByZXR1cm4gKCh1aW50NjRfdClCaXRXaWR0aCArIEFQSU5UX0JJVFNfUEVSX1dPUkQgLSAxKSAvIEFQSU5UX0JJVFNfUEVSX1dPUkQ7CisgIH0KKworICAvLy8gXGJyaWVmIENvbXB1dGUgdGhlIG51bWJlciBvZiBhY3RpdmUgYml0cyBpbiB0aGUgdmFsdWUKKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG51bWJlciBvZiBhY3RpdmUgYml0cyB3aGljaCBpcyBkZWZpbmVkIGFzIHRoZQorICAvLy8gYml0IHdpZHRoIG1pbnVzIHRoZSBudW1iZXIgb2YgbGVhZGluZyB6ZXJvcy4gVGhpcyBpcyB1c2VkIGluIHNldmVyYWwKKyAgLy8vIGNvbXB1dGF0aW9ucyB0byBzZWUgaG93ICJ3aWRlIiB0aGUgdmFsdWUgaXMuCisgIHVuc2lnbmVkIGdldEFjdGl2ZUJpdHMoKSBjb25zdCB7IHJldHVybiBCaXRXaWR0aCAtIGNvdW50TGVhZGluZ1plcm9zKCk7IH0KKworICAvLy8gXGJyaWVmIENvbXB1dGUgdGhlIG51bWJlciBvZiBhY3RpdmUgd29yZHMgaW4gdGhlIHZhbHVlIG9mIHRoaXMgQVBJbnQuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggZ2V0QWN0aXZlRGF0YSB0byBleHRyYWN0IHRoZSByYXcgdmFsdWUgb2YKKyAgLy8vIHRoZSBBUEludC4KKyAgdW5zaWduZWQgZ2V0QWN0aXZlV29yZHMoKSBjb25zdCB7CisgICAgdW5zaWduZWQgbnVtQWN0aXZlQml0cyA9IGdldEFjdGl2ZUJpdHMoKTsKKyAgICByZXR1cm4gbnVtQWN0aXZlQml0cyA/IHdoaWNoV29yZChudW1BY3RpdmVCaXRzIC0gMSkgKyAxIDogMTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBtaW5pbXVtIGJpdCBzaXplIGZvciB0aGlzIHNpZ25lZCBBUEludAorICAvLy8KKyAgLy8vIENvbXB1dGVzIHRoZSBtaW5pbXVtIGJpdCB3aWR0aCBmb3IgdGhpcyBBUEludCB3aGlsZSBjb25zaWRlcmluZyBpdCB0byBiZSBhCisgIC8vLyBzaWduZWQgKGFuZCBwcm9iYWJseSBuZWdhdGl2ZSkgdmFsdWUuIElmIHRoZSB2YWx1ZSBpcyBub3QgbmVnYXRpdmUsIHRoaXMKKyAgLy8vIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNhbWUgdmFsdWUgYXMgZ2V0QWN0aXZlQml0cygpKzEuIE90aGVyd2lzZSwgaXQKKyAgLy8vIHJldHVybnMgdGhlIHNtYWxsZXN0IGJpdCB3aWR0aCB0aGF0IHdpbGwgcmV0YWluIHRoZSBuZWdhdGl2ZSB2YWx1ZS4gRm9yCisgIC8vLyBleGFtcGxlLCAtMSBjYW4gYmUgd3JpdHRlbiBhcyAwYjEgb3IgMHhGRkZGRkZGRkZGLiAwYjEgaXMgc2hvcnRlciBhbmQgc28KKyAgLy8vIGZvciAtMSwgdGhpcyBmdW5jdGlvbiB3aWxsIGFsd2F5cyByZXR1cm4gMS4KKyAgdW5zaWduZWQgZ2V0TWluU2lnbmVkQml0cygpIGNvbnN0IHsKKyAgICBpZiAoaXNOZWdhdGl2ZSgpKQorICAgICAgcmV0dXJuIEJpdFdpZHRoIC0gY291bnRMZWFkaW5nT25lcygpICsgMTsKKyAgICByZXR1cm4gZ2V0QWN0aXZlQml0cygpICsgMTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHplcm8gZXh0ZW5kZWQgdmFsdWUKKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBhdHRlbXB0cyB0byByZXR1cm4gdGhlIHZhbHVlIG9mIHRoaXMgQVBJbnQgYXMgYSB6ZXJvIGV4dGVuZGVkCisgIC8vLyB1aW50NjRfdC4gVGhlIGJpdHdpZHRoIG11c3QgYmUgPD0gNjQgb3IgdGhlIHZhbHVlIG11c3QgZml0IHdpdGhpbiBhCisgIC8vLyB1aW50NjRfdC4gT3RoZXJ3aXNlIGFuIGFzc2VydGlvbiB3aWxsIHJlc3VsdC4KKyAgdWludDY0X3QgZ2V0WkV4dFZhbHVlKCkgY29uc3QgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIHJldHVybiBVLlZBTDsKKyAgICBhc3NlcnQoZ2V0QWN0aXZlQml0cygpIDw9IDY0ICYmICJUb28gbWFueSBiaXRzIGZvciB1aW50NjRfdCIpOworICAgIHJldHVybiBVLnBWYWxbMF07CisgIH0KKworICAvLy8gXGJyaWVmIEdldCBzaWduIGV4dGVuZGVkIHZhbHVlCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgYXR0ZW1wdHMgdG8gcmV0dXJuIHRoZSB2YWx1ZSBvZiB0aGlzIEFQSW50IGFzIGEgc2lnbiBleHRlbmRlZAorICAvLy8gaW50NjRfdC4gVGhlIGJpdCB3aWR0aCBtdXN0IGJlIDw9IDY0IG9yIHRoZSB2YWx1ZSBtdXN0IGZpdCB3aXRoaW4gYW4KKyAgLy8vIGludDY0X3QuIE90aGVyd2lzZSBhbiBhc3NlcnRpb24gd2lsbCByZXN1bHQuCisgIGludDY0X3QgZ2V0U0V4dFZhbHVlKCkgY29uc3QgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkKKyAgICAgIHJldHVybiBTaWduRXh0ZW5kNjQoVS5WQUwsIEJpdFdpZHRoKTsKKyAgICBhc3NlcnQoZ2V0TWluU2lnbmVkQml0cygpIDw9IDY0ICYmICJUb28gbWFueSBiaXRzIGZvciBpbnQ2NF90Iik7CisgICAgcmV0dXJuIGludDY0X3QoVS5wVmFsWzBdKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGJpdHMgcmVxdWlyZWQgZm9yIHN0cmluZyB2YWx1ZS4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBkZXRlcm1pbmVzIGhvdyBtYW55IGJpdHMgYXJlIHJlcXVpcmVkIHRvIGhvbGQgdGhlIEFQSW50CisgIC8vLyBlcXVpdmFsZW50IG9mIHRoZSBzdHJpbmcgZ2l2ZW4gYnkgXHAgc3RyLgorICBzdGF0aWMgdW5zaWduZWQgZ2V0Qml0c05lZWRlZChTdHJpbmdSZWYgc3RyLCB1aW50OF90IHJhZGl4KTsKKworICAvLy8gXGJyaWVmIFRoZSBBUEludCB2ZXJzaW9uIG9mIHRoZSBjb3VudExlYWRpbmdaZXJvcyBmdW5jdGlvbnMgaW4KKyAgLy8vICAgTWF0aEV4dHJhcy5oLgorICAvLy8KKyAgLy8vIEl0IGNvdW50cyB0aGUgbnVtYmVyIG9mIHplcm9zIGZyb20gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHRoZSBmaXJzdAorICAvLy8gb25lIGJpdC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBCaXRXaWR0aCBpZiB0aGUgdmFsdWUgaXMgemVybywgb3RoZXJ3aXNlIHJldHVybnMgdGhlIG51bWJlciBvZgorICAvLy8gICB6ZXJvcyBmcm9tIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCB0byB0aGUgZmlyc3Qgb25lIGJpdHMuCisgIHVuc2lnbmVkIGNvdW50TGVhZGluZ1plcm9zKCkgY29uc3QgeworICAgIGlmIChpc1NpbmdsZVdvcmQoKSkgeworICAgICAgdW5zaWduZWQgdW51c2VkQml0cyA9IEFQSU5UX0JJVFNfUEVSX1dPUkQgLSBCaXRXaWR0aDsKKyAgICAgIHJldHVybiBsbHZtOjpjb3VudExlYWRpbmdaZXJvcyhVLlZBTCkgLSB1bnVzZWRCaXRzOworICAgIH0KKyAgICByZXR1cm4gY291bnRMZWFkaW5nWmVyb3NTbG93Q2FzZSgpOworICB9CisKKyAgLy8vIFxicmllZiBDb3VudCB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgb25lIGJpdHMuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBpcyBhbiBBUEludCB2ZXJzaW9uIG9mIHRoZSBjb3VudExlYWRpbmdPbmVzCisgIC8vLyBmdW5jdGlvbnMgaW4gTWF0aEV4dHJhcy5oLiBJdCBjb3VudHMgdGhlIG51bWJlciBvZiBvbmVzIGZyb20gdGhlIG1vc3QKKyAgLy8vIHNpZ25pZmljYW50IGJpdCB0byB0aGUgZmlyc3QgemVybyBiaXQuCisgIC8vLworICAvLy8gXHJldHVybnMgMCBpZiB0aGUgaGlnaCBvcmRlciBiaXQgaXMgbm90IHNldCwgb3RoZXJ3aXNlIHJldHVybnMgdGhlIG51bWJlcgorICAvLy8gb2YgMSBiaXRzIGZyb20gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgdG8gdGhlIGxlYXN0CisgIHVuc2lnbmVkIGNvdW50TGVhZGluZ09uZXMoKSBjb25zdCB7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgcmV0dXJuIGxsdm06OmNvdW50TGVhZGluZ09uZXMoVS5WQUwgPDwgKEFQSU5UX0JJVFNfUEVSX1dPUkQgLSBCaXRXaWR0aCkpOworICAgIHJldHVybiBjb3VudExlYWRpbmdPbmVzU2xvd0Nhc2UoKTsKKyAgfQorCisgIC8vLyBDb21wdXRlcyB0aGUgbnVtYmVyIG9mIGxlYWRpbmcgYml0cyBvZiB0aGlzIEFQSW50IHRoYXQgYXJlIGVxdWFsIHRvIGl0cworICAvLy8gc2lnbiBiaXQuCisgIHVuc2lnbmVkIGdldE51bVNpZ25CaXRzKCkgY29uc3QgeworICAgIHJldHVybiBpc05lZ2F0aXZlKCkgPyBjb3VudExlYWRpbmdPbmVzKCkgOiBjb3VudExlYWRpbmdaZXJvcygpOworICB9CisKKyAgLy8vIFxicmllZiBDb3VudCB0aGUgbnVtYmVyIG9mIHRyYWlsaW5nIHplcm8gYml0cy4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIGFuIEFQSW50IHZlcnNpb24gb2YgdGhlIGNvdW50VHJhaWxpbmdaZXJvcworICAvLy8gZnVuY3Rpb25zIGluIE1hdGhFeHRyYXMuaC4gSXQgY291bnRzIHRoZSBudW1iZXIgb2YgemVyb3MgZnJvbSB0aGUgbGVhc3QKKyAgLy8vIHNpZ25pZmljYW50IGJpdCB0byB0aGUgZmlyc3Qgc2V0IGJpdC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBCaXRXaWR0aCBpZiB0aGUgdmFsdWUgaXMgemVybywgb3RoZXJ3aXNlIHJldHVybnMgdGhlIG51bWJlciBvZgorICAvLy8gemVyb3MgZnJvbSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHRoZSBmaXJzdCBvbmUgYml0LgorICB1bnNpZ25lZCBjb3VudFRyYWlsaW5nWmVyb3MoKSBjb25zdCB7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgcmV0dXJuIHN0ZDo6bWluKHVuc2lnbmVkKGxsdm06OmNvdW50VHJhaWxpbmdaZXJvcyhVLlZBTCkpLCBCaXRXaWR0aCk7CisgICAgcmV0dXJuIGNvdW50VHJhaWxpbmdaZXJvc1Nsb3dDYXNlKCk7CisgIH0KKworICAvLy8gXGJyaWVmIENvdW50IHRoZSBudW1iZXIgb2YgdHJhaWxpbmcgb25lIGJpdHMuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBpcyBhbiBBUEludCB2ZXJzaW9uIG9mIHRoZSBjb3VudFRyYWlsaW5nT25lcworICAvLy8gZnVuY3Rpb25zIGluIE1hdGhFeHRyYXMuaC4gSXQgY291bnRzIHRoZSBudW1iZXIgb2Ygb25lcyBmcm9tIHRoZSBsZWFzdAorICAvLy8gc2lnbmlmaWNhbnQgYml0IHRvIHRoZSBmaXJzdCB6ZXJvIGJpdC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBCaXRXaWR0aCBpZiB0aGUgdmFsdWUgaXMgYWxsIG9uZXMsIG90aGVyd2lzZSByZXR1cm5zIHRoZSBudW1iZXIKKyAgLy8vIG9mIG9uZXMgZnJvbSB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHRoZSBmaXJzdCB6ZXJvIGJpdC4KKyAgdW5zaWduZWQgY291bnRUcmFpbGluZ09uZXMoKSBjb25zdCB7CisgICAgaWYgKGlzU2luZ2xlV29yZCgpKQorICAgICAgcmV0dXJuIGxsdm06OmNvdW50VHJhaWxpbmdPbmVzKFUuVkFMKTsKKyAgICByZXR1cm4gY291bnRUcmFpbGluZ09uZXNTbG93Q2FzZSgpOworICB9CisKKyAgLy8vIFxicmllZiBDb3VudCB0aGUgbnVtYmVyIG9mIGJpdHMgc2V0LgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gaXMgYW4gQVBJbnQgdmVyc2lvbiBvZiB0aGUgY291bnRQb3B1bGF0aW9uIGZ1bmN0aW9ucworICAvLy8gaW4gTWF0aEV4dHJhcy5oLiBJdCBjb3VudHMgdGhlIG51bWJlciBvZiAxIGJpdHMgaW4gdGhlIEFQSW50IHZhbHVlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIDAgaWYgdGhlIHZhbHVlIGlzIHplcm8sIG90aGVyd2lzZSByZXR1cm5zIHRoZSBudW1iZXIgb2Ygc2V0IGJpdHMuCisgIHVuc2lnbmVkIGNvdW50UG9wdWxhdGlvbigpIGNvbnN0IHsKKyAgICBpZiAoaXNTaW5nbGVXb3JkKCkpCisgICAgICByZXR1cm4gbGx2bTo6Y291bnRQb3B1bGF0aW9uKFUuVkFMKTsKKyAgICByZXR1cm4gY291bnRQb3B1bGF0aW9uU2xvd0Nhc2UoKTsKKyAgfQorCisgIC8vLyBAfQorICAvLy8gXG5hbWUgQ29udmVyc2lvbiBGdW5jdGlvbnMKKyAgLy8vIEB7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBib29sIGlzU2lnbmVkKSBjb25zdDsKKworICAvLy8gQ29udmVydHMgYW4gQVBJbnQgdG8gYSBzdHJpbmcgYW5kIGFwcGVuZCBpdCB0byBTdHIuICBTdHIgaXMgY29tbW9ubHkgYQorICAvLy8gU21hbGxTdHJpbmcuCisgIHZvaWQgdG9TdHJpbmcoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZTdHIsIHVuc2lnbmVkIFJhZGl4LCBib29sIFNpZ25lZCwKKyAgICAgICAgICAgICAgICBib29sIGZvcm1hdEFzQ0xpdGVyYWwgPSBmYWxzZSkgY29uc3Q7CisKKyAgLy8vIENvbnNpZGVycyB0aGUgQVBJbnQgdG8gYmUgdW5zaWduZWQgYW5kIGNvbnZlcnRzIGl0IGludG8gYSBzdHJpbmcgaW4gdGhlCisgIC8vLyByYWRpeCBnaXZlbi4gVGhlIHJhZGl4IGNhbiBiZSAyLCA4LCAxMCAxNiwgb3IgMzYuCisgIHZvaWQgdG9TdHJpbmdVbnNpZ25lZChTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlN0ciwgdW5zaWduZWQgUmFkaXggPSAxMCkgY29uc3QgeworICAgIHRvU3RyaW5nKFN0ciwgUmFkaXgsIGZhbHNlLCBmYWxzZSk7CisgIH0KKworICAvLy8gQ29uc2lkZXJzIHRoZSBBUEludCB0byBiZSBzaWduZWQgYW5kIGNvbnZlcnRzIGl0IGludG8gYSBzdHJpbmcgaW4gdGhlCisgIC8vLyByYWRpeCBnaXZlbi4gVGhlIHJhZGl4IGNhbiBiZSAyLCA4LCAxMCwgMTYsIG9yIDM2LgorICB2b2lkIHRvU3RyaW5nU2lnbmVkKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmU3RyLCB1bnNpZ25lZCBSYWRpeCA9IDEwKSBjb25zdCB7CisgICAgdG9TdHJpbmcoU3RyLCBSYWRpeCwgdHJ1ZSwgZmFsc2UpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIEFQSW50IGFzIGEgc3RkOjpzdHJpbmcuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgaXMgYW4gaW5lZmZpY2llbnQgbWV0aG9kLiAgSXQgaXMgYmV0dGVyIHRvIHBhc3MgaW4gYQorICAvLy8gU21hbGxWZWN0b3IvU21hbGxTdHJpbmcgdG8gdGhlIG1ldGhvZHMgYWJvdmUgdG8gYXZvaWQgdGhyYXNoaW5nIHRoZSBoZWFwCisgIC8vLyBmb3IgdGhlIHN0cmluZy4KKyAgc3RkOjpzdHJpbmcgdG9TdHJpbmcodW5zaWduZWQgUmFkaXgsIGJvb2wgU2lnbmVkKSBjb25zdDsKKworICAvLy8gXHJldHVybnMgYSBieXRlLXN3YXBwZWQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBBUEludCBWYWx1ZS4KKyAgQVBJbnQgYnl0ZVN3YXAoKSBjb25zdDsKKworICAvLy8gXHJldHVybnMgdGhlIHZhbHVlIHdpdGggdGhlIGJpdCByZXByZXNlbnRhdGlvbiByZXZlcnNlZCBvZiB0aGlzIEFQSW50CisgIC8vLyBWYWx1ZS4KKyAgQVBJbnQgcmV2ZXJzZUJpdHMoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIENvbnZlcnRzIHRoaXMgQVBJbnQgdG8gYSBkb3VibGUgdmFsdWUuCisgIGRvdWJsZSByb3VuZFRvRG91YmxlKGJvb2wgaXNTaWduZWQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQ29udmVydHMgdGhpcyB1bnNpZ25lZCBBUEludCB0byBhIGRvdWJsZSB2YWx1ZS4KKyAgZG91YmxlIHJvdW5kVG9Eb3VibGUoKSBjb25zdCB7IHJldHVybiByb3VuZFRvRG91YmxlKGZhbHNlKTsgfQorCisgIC8vLyBcYnJpZWYgQ29udmVydHMgdGhpcyBzaWduZWQgQVBJbnQgdG8gYSBkb3VibGUgdmFsdWUuCisgIGRvdWJsZSBzaWduZWRSb3VuZFRvRG91YmxlKCkgY29uc3QgeyByZXR1cm4gcm91bmRUb0RvdWJsZSh0cnVlKTsgfQorCisgIC8vLyBcYnJpZWYgQ29udmVydHMgQVBJbnQgYml0cyB0byBhIGRvdWJsZQorICAvLy8KKyAgLy8vIFRoZSBjb252ZXJzaW9uIGRvZXMgbm90IGRvIGEgdHJhbnNsYXRpb24gZnJvbSBpbnRlZ2VyIHRvIGRvdWJsZSwgaXQganVzdAorICAvLy8gcmUtaW50ZXJwcmV0cyB0aGUgYml0cyBhcyBhIGRvdWJsZS4gTm90ZSB0aGF0IGl0IGlzIHZhbGlkIHRvIGRvIHRoaXMgb24KKyAgLy8vIGFueSBiaXQgd2lkdGguIEV4YWN0bHkgNjQgYml0cyB3aWxsIGJlIHRyYW5zbGF0ZWQuCisgIGRvdWJsZSBiaXRzVG9Eb3VibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIEJpdHNUb0RvdWJsZShnZXRXb3JkKDApKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29udmVydHMgQVBJbnQgYml0cyB0byBhIGRvdWJsZQorICAvLy8KKyAgLy8vIFRoZSBjb252ZXJzaW9uIGRvZXMgbm90IGRvIGEgdHJhbnNsYXRpb24gZnJvbSBpbnRlZ2VyIHRvIGZsb2F0LCBpdCBqdXN0CisgIC8vLyByZS1pbnRlcnByZXRzIHRoZSBiaXRzIGFzIGEgZmxvYXQuIE5vdGUgdGhhdCBpdCBpcyB2YWxpZCB0byBkbyB0aGlzIG9uCisgIC8vLyBhbnkgYml0IHdpZHRoLiBFeGFjdGx5IDMyIGJpdHMgd2lsbCBiZSB0cmFuc2xhdGVkLgorICBmbG9hdCBiaXRzVG9GbG9hdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQml0c1RvRmxvYXQoZ2V0V29yZCgwKSk7CisgIH0KKworICAvLy8gXGJyaWVmIENvbnZlcnRzIGEgZG91YmxlIHRvIEFQSW50IGJpdHMuCisgIC8vLworICAvLy8gVGhlIGNvbnZlcnNpb24gZG9lcyBub3QgZG8gYSB0cmFuc2xhdGlvbiBmcm9tIGRvdWJsZSB0byBpbnRlZ2VyLCBpdCBqdXN0CisgIC8vLyByZS1pbnRlcnByZXRzIHRoZSBiaXRzIG9mIHRoZSBkb3VibGUuCisgIHN0YXRpYyBBUEludCBkb3VibGVUb0JpdHMoZG91YmxlIFYpIHsKKyAgICByZXR1cm4gQVBJbnQoc2l6ZW9mKGRvdWJsZSkgKiBDSEFSX0JJVCwgRG91YmxlVG9CaXRzKFYpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29udmVydHMgYSBmbG9hdCB0byBBUEludCBiaXRzLgorICAvLy8KKyAgLy8vIFRoZSBjb252ZXJzaW9uIGRvZXMgbm90IGRvIGEgdHJhbnNsYXRpb24gZnJvbSBmbG9hdCB0byBpbnRlZ2VyLCBpdCBqdXN0CisgIC8vLyByZS1pbnRlcnByZXRzIHRoZSBiaXRzIG9mIHRoZSBmbG9hdC4KKyAgc3RhdGljIEFQSW50IGZsb2F0VG9CaXRzKGZsb2F0IFYpIHsKKyAgICByZXR1cm4gQVBJbnQoc2l6ZW9mKGZsb2F0KSAqIENIQVJfQklULCBGbG9hdFRvQml0cyhWKSk7CisgIH0KKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIE1hdGhlbWF0aWNzIE9wZXJhdGlvbnMKKyAgLy8vIEB7CisKKyAgLy8vIFxyZXR1cm5zIHRoZSBmbG9vciBsb2cgYmFzZSAyIG9mIHRoaXMgQVBJbnQuCisgIHVuc2lnbmVkIGxvZ0Jhc2UyKCkgY29uc3QgeyByZXR1cm4gZ2V0QWN0aXZlQml0cygpIC0gIDE7IH0KKworICAvLy8gXHJldHVybnMgdGhlIGNlaWwgbG9nIGJhc2UgMiBvZiB0aGlzIEFQSW50LgorICB1bnNpZ25lZCBjZWlsTG9nQmFzZTIoKSBjb25zdCB7CisgICAgQVBJbnQgdGVtcCgqdGhpcyk7CisgICAgLS10ZW1wOworICAgIHJldHVybiB0ZW1wLmdldEFjdGl2ZUJpdHMoKTsKKyAgfQorCisgIC8vLyBccmV0dXJucyB0aGUgbmVhcmVzdCBsb2cgYmFzZSAyIG9mIHRoaXMgQVBJbnQuIFRpZXMgcm91bmQgdXAuCisgIC8vLworICAvLy8gTk9URTogV2hlbiB3ZSBoYXZlIGEgQml0V2lkdGggb2YgMSwgd2UgZGVmaW5lOgorICAvLy8KKyAgLy8vICAgbG9nMigwKSA9IFVJTlQzMl9NQVgKKyAgLy8vICAgbG9nMigxKSA9IDAKKyAgLy8vCisgIC8vLyB0byBnZXQgYXJvdW5kIGFueSBtYXRoZW1hdGljYWwgY29uY2VybnMgcmVzdWx0aW5nIGZyb20KKyAgLy8vIHJlZmVyZW5jaW5nIDIgaW4gYSBzcGFjZSB3aGVyZSAyIGRvZXMgbm8gZXhpc3QuCisgIHVuc2lnbmVkIG5lYXJlc3RMb2dCYXNlMigpIGNvbnN0IHsKKyAgICAvLyBTcGVjaWFsIGNhc2Ugd2hlbiB3ZSBoYXZlIGEgYml0d2lkdGggb2YgMS4gSWYgVkFMIGlzIDEsIHRoZW4gd2UKKyAgICAvLyBnZXQgMC4gSWYgVkFMIGlzIDAsIHdlIGdldCBXT1JEX01BWCB3aGljaCBnZXRzIHRydW5jYXRlZCB0bworICAgIC8vIFVJTlQzMl9NQVguCisgICAgaWYgKEJpdFdpZHRoID09IDEpCisgICAgICByZXR1cm4gVS5WQUwgLSAxOworCisgICAgLy8gSGFuZGxlIHRoZSB6ZXJvIGNhc2UuCisgICAgaWYgKGlzTnVsbFZhbHVlKCkpCisgICAgICByZXR1cm4gVUlOVDMyX01BWDsKKworICAgIC8vIFRoZSBub24temVybyBjYXNlIGlzIGhhbmRsZWQgYnkgY29tcHV0aW5nOgorICAgIC8vCisgICAgLy8gICBuZWFyZXN0TG9nQmFzZTIoeCkgPSBsb2dCYXNlMih4KSArIHhbbG9nQmFzZTIoeCktMV0uCisgICAgLy8KKyAgICAvLyB3aGVyZSB4W2ldIGlzIHJlZmVycmluZyB0byB0aGUgdmFsdWUgb2YgdGhlIGl0aCBiaXQgb2YgeC4KKyAgICB1bnNpZ25lZCBsZyA9IGxvZ0Jhc2UyKCk7CisgICAgcmV0dXJuIGxnICsgdW5zaWduZWQoKCp0aGlzKVtsZyAtIDFdKTsKKyAgfQorCisgIC8vLyBccmV0dXJucyB0aGUgbG9nIGJhc2UgMiBvZiB0aGlzIEFQSW50IGlmIGl0cyBhbiBleGFjdCBwb3dlciBvZiB0d28sIC0xCisgIC8vLyBvdGhlcndpc2UKKyAgaW50MzJfdCBleGFjdExvZ0Jhc2UyKCkgY29uc3QgeworICAgIGlmICghaXNQb3dlck9mMigpKQorICAgICAgcmV0dXJuIC0xOworICAgIHJldHVybiBsb2dCYXNlMigpOworICB9CisKKyAgLy8vIFxicmllZiBDb21wdXRlIHRoZSBzcXVhcmUgcm9vdAorICBBUEludCBzcXJ0KCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGFic29sdXRlIHZhbHVlOworICAvLy8KKyAgLy8vIElmICp0aGlzIGlzIDwgMCB0aGVuIHJldHVybiAtKCp0aGlzKSwgb3RoZXJ3aXNlICp0aGlzOworICBBUEludCBhYnMoKSBjb25zdCB7CisgICAgaWYgKGlzTmVnYXRpdmUoKSkKKyAgICAgIHJldHVybiAtKCp0aGlzKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gXHJldHVybnMgdGhlIG11bHRpcGxpY2F0aXZlIGludmVyc2UgZm9yIGEgZ2l2ZW4gbW9kdWxvLgorICBBUEludCBtdWx0aXBsaWNhdGl2ZUludmVyc2UoY29uc3QgQVBJbnQgJm1vZHVsbykgY29uc3Q7CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBTdXBwb3J0IGZvciBkaXZpc2lvbiBieSBjb25zdGFudAorICAvLy8gQHsKKworICAvLy8gQ2FsY3VsYXRlIHRoZSBtYWdpYyBudW1iZXIgZm9yIHNpZ25lZCBkaXZpc2lvbiBieSBhIGNvbnN0YW50LgorICBzdHJ1Y3QgbXM7CisgIG1zIG1hZ2ljKCkgY29uc3Q7CisKKyAgLy8vIENhbGN1bGF0ZSB0aGUgbWFnaWMgbnVtYmVyIGZvciB1bnNpZ25lZCBkaXZpc2lvbiBieSBhIGNvbnN0YW50LgorICBzdHJ1Y3QgbXU7CisgIG11IG1hZ2ljdSh1bnNpZ25lZCBMZWFkaW5nWmVyb3MgPSAwKSBjb25zdDsKKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIEJ1aWxkaW5nLWJsb2NrIE9wZXJhdGlvbnMgZm9yIEFQSW50IGFuZCBBUEZsb2F0CisgIC8vLyBAeworCisgIC8vIFRoZXNlIGJ1aWxkaW5nIGJsb2NrIG9wZXJhdGlvbnMgb3BlcmF0ZSBvbiBhIHJlcHJlc2VudGF0aW9uIG9mIGFyYml0cmFyeQorICAvLyBwcmVjaXNpb24sIHR3bydzLWNvbXBsZW1lbnQsIGJpZ251bSBpbnRlZ2VyIHZhbHVlcy4gVGhleSBzaG91bGQgYmUKKyAgLy8gc3VmZmljaWVudCB0byBpbXBsZW1lbnQgQVBJbnQgYW5kIEFQRmxvYXQgYmlnbnVtIHJlcXVpcmVtZW50cy4gSW5wdXRzIGFyZQorICAvLyBnZW5lcmFsbHkgYSBwb2ludGVyIHRvIHRoZSBiYXNlIG9mIGFuIGFycmF5IG9mIGludGVnZXIgcGFydHMsIHJlcHJlc2VudGluZworICAvLyBhbiB1bnNpZ25lZCBiaWdudW0sIGFuZCBhIGNvdW50IG9mIGhvdyBtYW55IHBhcnRzIHRoZXJlIGFyZS4KKworICAvLy8gU2V0cyB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQgcGFydCBvZiBhIGJpZ251bSB0byB0aGUgaW5wdXQgdmFsdWUsIGFuZCB6ZXJvZXMKKyAgLy8vIG91dCBoaWdoZXIgcGFydHMuCisgIHN0YXRpYyB2b2lkIHRjU2V0KFdvcmRUeXBlICosIFdvcmRUeXBlLCB1bnNpZ25lZCk7CisKKyAgLy8vIEFzc2lnbiBvbmUgYmlnbnVtIHRvIGFub3RoZXIuCisgIHN0YXRpYyB2b2lkIHRjQXNzaWduKFdvcmRUeXBlICosIGNvbnN0IFdvcmRUeXBlICosIHVuc2lnbmVkKTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIGEgYmlnbnVtIGlzIHplcm8sIGZhbHNlIG90aGVyd2lzZS4KKyAgc3RhdGljIGJvb2wgdGNJc1plcm8oY29uc3QgV29yZFR5cGUgKiwgdW5zaWduZWQpOworCisgIC8vLyBFeHRyYWN0IHRoZSBnaXZlbiBiaXQgb2YgYSBiaWdudW07IHJldHVybnMgMCBvciAxLiAgWmVyby1iYXNlZC4KKyAgc3RhdGljIGludCB0Y0V4dHJhY3RCaXQoY29uc3QgV29yZFR5cGUgKiwgdW5zaWduZWQgYml0KTsKKworICAvLy8gQ29weSB0aGUgYml0IHZlY3RvciBvZiB3aWR0aCBzcmNCSVRTIGZyb20gU1JDLCBzdGFydGluZyBhdCBiaXQgc3JjTFNCLCB0bworICAvLy8gRFNULCBvZiBkc3RDT1VOVCBwYXJ0cywgc3VjaCB0aGF0IHRoZSBiaXQgc3JjTFNCIGJlY29tZXMgdGhlIGxlYXN0CisgIC8vLyBzaWduaWZpY2FudCBiaXQgb2YgRFNULiAgQWxsIGhpZ2ggYml0cyBhYm92ZSBzcmNCSVRTIGluIERTVCBhcmUKKyAgLy8vIHplcm8tZmlsbGVkLgorICBzdGF0aWMgdm9pZCB0Y0V4dHJhY3QoV29yZFR5cGUgKiwgdW5zaWduZWQgZHN0Q291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBXb3JkVHlwZSAqLCB1bnNpZ25lZCBzcmNCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc3JjTFNCKTsKKworICAvLy8gU2V0IHRoZSBnaXZlbiBiaXQgb2YgYSBiaWdudW0uICBaZXJvLWJhc2VkLgorICBzdGF0aWMgdm9pZCB0Y1NldEJpdChXb3JkVHlwZSAqLCB1bnNpZ25lZCBiaXQpOworCisgIC8vLyBDbGVhciB0aGUgZ2l2ZW4gYml0IG9mIGEgYmlnbnVtLiAgWmVyby1iYXNlZC4KKyAgc3RhdGljIHZvaWQgdGNDbGVhckJpdChXb3JkVHlwZSAqLCB1bnNpZ25lZCBiaXQpOworCisgIC8vLyBSZXR1cm5zIHRoZSBiaXQgbnVtYmVyIG9mIHRoZSBsZWFzdCBvciBtb3N0IHNpZ25pZmljYW50IHNldCBiaXQgb2YgYQorICAvLy8gbnVtYmVyLiAgSWYgdGhlIGlucHV0IG51bWJlciBoYXMgbm8gYml0cyBzZXQgLTFVIGlzIHJldHVybmVkLgorICBzdGF0aWMgdW5zaWduZWQgdGNMU0IoY29uc3QgV29yZFR5cGUgKiwgdW5zaWduZWQgbik7CisgIHN0YXRpYyB1bnNpZ25lZCB0Y01TQihjb25zdCBXb3JkVHlwZSAqcGFydHMsIHVuc2lnbmVkIG4pOworCisgIC8vLyBOZWdhdGUgYSBiaWdudW0gaW4tcGxhY2UuCisgIHN0YXRpYyB2b2lkIHRjTmVnYXRlKFdvcmRUeXBlICosIHVuc2lnbmVkKTsKKworICAvLy8gRFNUICs9IFJIUyArIENBUlJZIHdoZXJlIENBUlJZIGlzIHplcm8gb3Igb25lLiAgUmV0dXJucyB0aGUgY2FycnkgZmxhZy4KKyAgc3RhdGljIFdvcmRUeXBlIHRjQWRkKFdvcmRUeXBlICosIGNvbnN0IFdvcmRUeXBlICosCisgICAgICAgICAgICAgICAgICAgICAgICBXb3JkVHlwZSBjYXJyeSwgdW5zaWduZWQpOworICAvLy8gRFNUICs9IFJIUy4gIFJldHVybnMgdGhlIGNhcnJ5IGZsYWcuCisgIHN0YXRpYyBXb3JkVHlwZSB0Y0FkZFBhcnQoV29yZFR5cGUgKiwgV29yZFR5cGUsIHVuc2lnbmVkKTsKKworICAvLy8gRFNUIC09IFJIUyArIENBUlJZIHdoZXJlIENBUlJZIGlzIHplcm8gb3Igb25lLiBSZXR1cm5zIHRoZSBjYXJyeSBmbGFnLgorICBzdGF0aWMgV29yZFR5cGUgdGNTdWJ0cmFjdChXb3JkVHlwZSAqLCBjb25zdCBXb3JkVHlwZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkVHlwZSBjYXJyeSwgdW5zaWduZWQpOworICAvLy8gRFNUIC09IFJIUy4gIFJldHVybnMgdGhlIGNhcnJ5IGZsYWcuCisgIHN0YXRpYyBXb3JkVHlwZSB0Y1N1YnRyYWN0UGFydChXb3JkVHlwZSAqLCBXb3JkVHlwZSwgdW5zaWduZWQpOworCisgIC8vLyBEU1QgKz0gU1JDICogTVVMVElQTElFUiArIFBBUlQgICBpZiBhZGQgaXMgdHJ1ZQorICAvLy8gRFNUICA9IFNSQyAqIE1VTFRJUExJRVIgKyBQQVJUICAgaWYgYWRkIGlzIGZhbHNlCisgIC8vLworICAvLy8gUmVxdWlyZXMgMCA8PSBEU1RQQVJUUyA8PSBTUkNQQVJUUyArIDEuICBJZiBEU1Qgb3ZlcmxhcHMgU1JDIHRoZXkgbXVzdAorICAvLy8gc3RhcnQgYXQgdGhlIHNhbWUgcG9pbnQsIGkuZS4gRFNUID09IFNSQy4KKyAgLy8vCisgIC8vLyBJZiBEU1RQQVJUUyA9PSBTUkNfUEFSVFMgKyAxIG5vIG92ZXJmbG93IG9jY3VycyBhbmQgemVybyBpcyByZXR1cm5lZC4KKyAgLy8vIE90aGVyd2lzZSBEU1QgaXMgZmlsbGVkIHdpdGggdGhlIGxlYXN0IHNpZ25pZmljYW50IERTVFBBUlRTIHBhcnRzIG9mIHRoZQorICAvLy8gcmVzdWx0LCBhbmQgaWYgYWxsIG9mIHRoZSBvbWl0dGVkIGhpZ2hlciBwYXJ0cyB3ZXJlIHplcm8gcmV0dXJuIHplcm8sCisgIC8vLyBvdGhlcndpc2Ugb3ZlcmZsb3cgb2NjdXJyZWQgYW5kIHJldHVybiBvbmUuCisgIHN0YXRpYyBpbnQgdGNNdWx0aXBseVBhcnQoV29yZFR5cGUgKmRzdCwgY29uc3QgV29yZFR5cGUgKnNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXb3JkVHlwZSBtdWx0aXBsaWVyLCBXb3JkVHlwZSBjYXJyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzcmNQYXJ0cywgdW5zaWduZWQgZHN0UGFydHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhZGQpOworCisgIC8vLyBEU1QgPSBMSFMgKiBSSFMsIHdoZXJlIERTVCBoYXMgdGhlIHNhbWUgd2lkdGggYXMgdGhlIG9wZXJhbmRzIGFuZCBpcworICAvLy8gZmlsbGVkIHdpdGggdGhlIGxlYXN0IHNpZ25pZmljYW50IHBhcnRzIG9mIHRoZSByZXN1bHQuICBSZXR1cm5zIG9uZSBpZgorICAvLy8gb3ZlcmZsb3cgb2NjdXJyZWQsIG90aGVyd2lzZSB6ZXJvLiAgRFNUIG11c3QgYmUgZGlzam9pbnQgZnJvbSBib3RoCisgIC8vLyBvcGVyYW5kcy4KKyAgc3RhdGljIGludCB0Y011bHRpcGx5KFdvcmRUeXBlICosIGNvbnN0IFdvcmRUeXBlICosIGNvbnN0IFdvcmRUeXBlICosCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCk7CisKKyAgLy8vIERTVCA9IExIUyAqIFJIUywgd2hlcmUgRFNUIGhhcyB3aWR0aCB0aGUgc3VtIG9mIHRoZSB3aWR0aHMgb2YgdGhlCisgIC8vLyBvcGVyYW5kcy4gTm8gb3ZlcmZsb3cgb2NjdXJzLiBEU1QgbXVzdCBiZSBkaXNqb2ludCBmcm9tIGJvdGggb3BlcmFuZHMuCisgIHN0YXRpYyB2b2lkIHRjRnVsbE11bHRpcGx5KFdvcmRUeXBlICosIGNvbnN0IFdvcmRUeXBlICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdvcmRUeXBlICosIHVuc2lnbmVkLCB1bnNpZ25lZCk7CisKKyAgLy8vIElmIFJIUyBpcyB6ZXJvIExIUyBhbmQgUkVNQUlOREVSIGFyZSBsZWZ0IHVuY2hhbmdlZCwgcmV0dXJuIG9uZS4KKyAgLy8vIE90aGVyd2lzZSBzZXQgTEhTIHRvIExIUyAvIFJIUyB3aXRoIHRoZSBmcmFjdGlvbmFsIHBhcnQgZGlzY2FyZGVkLCBzZXQKKyAgLy8vIFJFTUFJTkRFUiB0byB0aGUgcmVtYWluZGVyLCByZXR1cm4gemVyby4gIGkuZS4KKyAgLy8vCisgIC8vLyAgT0xEX0xIUyA9IFJIUyAqIExIUyArIFJFTUFJTkRFUgorICAvLy8KKyAgLy8vIFNDUkFUQ0ggaXMgYSBiaWdudW0gb2YgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgb3BlcmFuZHMgYW5kIHJlc3VsdCBmb3IgdXNlIGJ5CisgIC8vLyB0aGUgcm91dGluZTsgaXRzIGNvbnRlbnRzIG5lZWQgbm90IGJlIGluaXRpYWxpemVkIGFuZCBhcmUgZGVzdHJveWVkLiAgTEhTLAorICAvLy8gUkVNQUlOREVSIGFuZCBTQ1JBVENIIG11c3QgYmUgZGlzdGluY3QuCisgIHN0YXRpYyBpbnQgdGNEaXZpZGUoV29yZFR5cGUgKmxocywgY29uc3QgV29yZFR5cGUgKnJocywKKyAgICAgICAgICAgICAgICAgICAgICBXb3JkVHlwZSAqcmVtYWluZGVyLCBXb3JkVHlwZSAqc2NyYXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBwYXJ0cyk7CisKKyAgLy8vIFNoaWZ0IGEgYmlnbnVtIGxlZnQgQ291bnQgYml0cy4gU2hpZnRlZCBpbiBiaXRzIGFyZSB6ZXJvLiBUaGVyZSBhcmUgbm8KKyAgLy8vIHJlc3RyaWN0aW9ucyBvbiBDb3VudC4KKyAgc3RhdGljIHZvaWQgdGNTaGlmdExlZnQoV29yZFR5cGUgKiwgdW5zaWduZWQgV29yZHMsIHVuc2lnbmVkIENvdW50KTsKKworICAvLy8gU2hpZnQgYSBiaWdudW0gcmlnaHQgQ291bnQgYml0cy4gIFNoaWZ0ZWQgaW4gYml0cyBhcmUgemVyby4gIFRoZXJlIGFyZSBubworICAvLy8gcmVzdHJpY3Rpb25zIG9uIENvdW50LgorICBzdGF0aWMgdm9pZCB0Y1NoaWZ0UmlnaHQoV29yZFR5cGUgKiwgdW5zaWduZWQgV29yZHMsIHVuc2lnbmVkIENvdW50KTsKKworICAvLy8gVGhlIG9idmlvdXMgQU5ELCBPUiBhbmQgWE9SIGFuZCBjb21wbGVtZW50IG9wZXJhdGlvbnMuCisgIHN0YXRpYyB2b2lkIHRjQW5kKFdvcmRUeXBlICosIGNvbnN0IFdvcmRUeXBlICosIHVuc2lnbmVkKTsKKyAgc3RhdGljIHZvaWQgdGNPcihXb3JkVHlwZSAqLCBjb25zdCBXb3JkVHlwZSAqLCB1bnNpZ25lZCk7CisgIHN0YXRpYyB2b2lkIHRjWG9yKFdvcmRUeXBlICosIGNvbnN0IFdvcmRUeXBlICosIHVuc2lnbmVkKTsKKyAgc3RhdGljIHZvaWQgdGNDb21wbGVtZW50KFdvcmRUeXBlICosIHVuc2lnbmVkKTsKKworICAvLy8gQ29tcGFyaXNvbiAodW5zaWduZWQpIG9mIHR3byBiaWdudW1zLgorICBzdGF0aWMgaW50IHRjQ29tcGFyZShjb25zdCBXb3JkVHlwZSAqLCBjb25zdCBXb3JkVHlwZSAqLCB1bnNpZ25lZCk7CisKKyAgLy8vIEluY3JlbWVudCBhIGJpZ251bSBpbi1wbGFjZS4gIFJldHVybiB0aGUgY2FycnkgZmxhZy4KKyAgc3RhdGljIFdvcmRUeXBlIHRjSW5jcmVtZW50KFdvcmRUeXBlICpkc3QsIHVuc2lnbmVkIHBhcnRzKSB7CisgICAgcmV0dXJuIHRjQWRkUGFydChkc3QsIDEsIHBhcnRzKTsKKyAgfQorCisgIC8vLyBEZWNyZW1lbnQgYSBiaWdudW0gaW4tcGxhY2UuICBSZXR1cm4gdGhlIGJvcnJvdyBmbGFnLgorICBzdGF0aWMgV29yZFR5cGUgdGNEZWNyZW1lbnQoV29yZFR5cGUgKmRzdCwgdW5zaWduZWQgcGFydHMpIHsKKyAgICByZXR1cm4gdGNTdWJ0cmFjdFBhcnQoZHN0LCAxLCBwYXJ0cyk7CisgIH0KKworICAvLy8gU2V0IHRoZSBsZWFzdCBzaWduaWZpY2FudCBCSVRTIGFuZCBjbGVhciB0aGUgcmVzdC4KKyAgc3RhdGljIHZvaWQgdGNTZXRMZWFzdFNpZ25pZmljYW50Qml0cyhXb3JkVHlwZSAqLCB1bnNpZ25lZCwgdW5zaWduZWQgYml0cyk7CisKKyAgLy8vIFxicmllZiBkZWJ1ZyBtZXRob2QKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8vIEB9Cit9OworCisvLy8gTWFnaWMgZGF0YSBmb3Igb3B0aW1pc2luZyBzaWduZWQgZGl2aXNpb24gYnkgYSBjb25zdGFudC4KK3N0cnVjdCBBUEludDo6bXMgeworICBBUEludCBtOyAgICAvLy88IG1hZ2ljIG51bWJlcgorICB1bnNpZ25lZCBzOyAvLy88IHNoaWZ0IGFtb3VudAorfTsKKworLy8vIE1hZ2ljIGRhdGEgZm9yIG9wdGltaXNpbmcgdW5zaWduZWQgZGl2aXNpb24gYnkgYSBjb25zdGFudC4KK3N0cnVjdCBBUEludDo6bXUgeworICBBUEludCBtOyAgICAvLy88IG1hZ2ljIG51bWJlcgorICBib29sIGE7ICAgICAvLy88IGFkZCBpbmRpY2F0b3IKKyAgdW5zaWduZWQgczsgLy8vPCBzaGlmdCBhbW91bnQKK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0odWludDY0X3QgVjEsIGNvbnN0IEFQSW50ICZWMikgeyByZXR1cm4gVjIgPT0gVjE7IH0KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPSh1aW50NjRfdCBWMSwgY29uc3QgQVBJbnQgJlYyKSB7IHJldHVybiBWMiAhPSBWMTsgfQorCisvLy8gXGJyaWVmIFVuYXJ5IGJpdHdpc2UgY29tcGxlbWVudCBvcGVyYXRvci4KKy8vLworLy8vIFxyZXR1cm5zIGFuIEFQSW50IHRoYXQgaXMgdGhlIGJpdHdpc2UgY29tcGxlbWVudCBvZiBccCB2LgoraW5saW5lIEFQSW50IG9wZXJhdG9yfihBUEludCB2KSB7CisgIHYuZmxpcEFsbEJpdHMoKTsKKyAgcmV0dXJuIHY7Cit9CisKK2lubGluZSBBUEludCBvcGVyYXRvciYoQVBJbnQgYSwgY29uc3QgQVBJbnQgJmIpIHsKKyAgYSAmPSBiOworICByZXR1cm4gYTsKK30KKworaW5saW5lIEFQSW50IG9wZXJhdG9yJihjb25zdCBBUEludCAmYSwgQVBJbnQgJiZiKSB7CisgIGIgJj0gYTsKKyAgcmV0dXJuIHN0ZDo6bW92ZShiKTsKK30KKworaW5saW5lIEFQSW50IG9wZXJhdG9yJihBUEludCBhLCB1aW50NjRfdCBSSFMpIHsKKyAgYSAmPSBSSFM7CisgIHJldHVybiBhOworfQorCitpbmxpbmUgQVBJbnQgb3BlcmF0b3ImKHVpbnQ2NF90IExIUywgQVBJbnQgYikgeworICBiICY9IExIUzsKKyAgcmV0dXJuIGI7Cit9CisKK2lubGluZSBBUEludCBvcGVyYXRvcnwoQVBJbnQgYSwgY29uc3QgQVBJbnQgJmIpIHsKKyAgYSB8PSBiOworICByZXR1cm4gYTsKK30KKworaW5saW5lIEFQSW50IG9wZXJhdG9yfChjb25zdCBBUEludCAmYSwgQVBJbnQgJiZiKSB7CisgIGIgfD0gYTsKKyAgcmV0dXJuIHN0ZDo6bW92ZShiKTsKK30KKworaW5saW5lIEFQSW50IG9wZXJhdG9yfChBUEludCBhLCB1aW50NjRfdCBSSFMpIHsKKyAgYSB8PSBSSFM7CisgIHJldHVybiBhOworfQorCitpbmxpbmUgQVBJbnQgb3BlcmF0b3J8KHVpbnQ2NF90IExIUywgQVBJbnQgYikgeworICBiIHw9IExIUzsKKyAgcmV0dXJuIGI7Cit9CisKK2lubGluZSBBUEludCBvcGVyYXRvcl4oQVBJbnQgYSwgY29uc3QgQVBJbnQgJmIpIHsKKyAgYSBePSBiOworICByZXR1cm4gYTsKK30KKworaW5saW5lIEFQSW50IG9wZXJhdG9yXihjb25zdCBBUEludCAmYSwgQVBJbnQgJiZiKSB7CisgIGIgXj0gYTsKKyAgcmV0dXJuIHN0ZDo6bW92ZShiKTsKK30KKworaW5saW5lIEFQSW50IG9wZXJhdG9yXihBUEludCBhLCB1aW50NjRfdCBSSFMpIHsKKyAgYSBePSBSSFM7CisgIHJldHVybiBhOworfQorCitpbmxpbmUgQVBJbnQgb3BlcmF0b3JeKHVpbnQ2NF90IExIUywgQVBJbnQgYikgeworICBiIF49IExIUzsKKyAgcmV0dXJuIGI7Cit9CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IEFQSW50ICZJKSB7CisgIEkucHJpbnQoT1MsIHRydWUpOworICByZXR1cm4gT1M7Cit9CisKK2lubGluZSBBUEludCBvcGVyYXRvci0oQVBJbnQgdikgeworICB2Lm5lZ2F0ZSgpOworICByZXR1cm4gdjsKK30KKworaW5saW5lIEFQSW50IG9wZXJhdG9yKyhBUEludCBhLCBjb25zdCBBUEludCAmYikgeworICBhICs9IGI7CisgIHJldHVybiBhOworfQorCitpbmxpbmUgQVBJbnQgb3BlcmF0b3IrKGNvbnN0IEFQSW50ICZhLCBBUEludCAmJmIpIHsKKyAgYiArPSBhOworICByZXR1cm4gc3RkOjptb3ZlKGIpOworfQorCitpbmxpbmUgQVBJbnQgb3BlcmF0b3IrKEFQSW50IGEsIHVpbnQ2NF90IFJIUykgeworICBhICs9IFJIUzsKKyAgcmV0dXJuIGE7Cit9CisKK2lubGluZSBBUEludCBvcGVyYXRvcisodWludDY0X3QgTEhTLCBBUEludCBiKSB7CisgIGIgKz0gTEhTOworICByZXR1cm4gYjsKK30KKworaW5saW5lIEFQSW50IG9wZXJhdG9yLShBUEludCBhLCBjb25zdCBBUEludCAmYikgeworICBhIC09IGI7CisgIHJldHVybiBhOworfQorCitpbmxpbmUgQVBJbnQgb3BlcmF0b3ItKGNvbnN0IEFQSW50ICZhLCBBUEludCAmJmIpIHsKKyAgYi5uZWdhdGUoKTsKKyAgYiArPSBhOworICByZXR1cm4gc3RkOjptb3ZlKGIpOworfQorCitpbmxpbmUgQVBJbnQgb3BlcmF0b3ItKEFQSW50IGEsIHVpbnQ2NF90IFJIUykgeworICBhIC09IFJIUzsKKyAgcmV0dXJuIGE7Cit9CisKK2lubGluZSBBUEludCBvcGVyYXRvci0odWludDY0X3QgTEhTLCBBUEludCBiKSB7CisgIGIubmVnYXRlKCk7CisgIGIgKz0gTEhTOworICByZXR1cm4gYjsKK30KKworaW5saW5lIEFQSW50IG9wZXJhdG9yKihBUEludCBhLCB1aW50NjRfdCBSSFMpIHsKKyAgYSAqPSBSSFM7CisgIHJldHVybiBhOworfQorCitpbmxpbmUgQVBJbnQgb3BlcmF0b3IqKHVpbnQ2NF90IExIUywgQVBJbnQgYikgeworICBiICo9IExIUzsKKyAgcmV0dXJuIGI7Cit9CisKKworbmFtZXNwYWNlIEFQSW50T3BzIHsKKworLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIHNtYWxsZXIgb2YgdHdvIEFQSW50cyBjb25zaWRlcmVkIHRvIGJlIHNpZ25lZC4KK2lubGluZSBjb25zdCBBUEludCAmc21pbihjb25zdCBBUEludCAmQSwgY29uc3QgQVBJbnQgJkIpIHsKKyAgcmV0dXJuIEEuc2x0KEIpID8gQSA6IEI7Cit9CisKKy8vLyBcYnJpZWYgRGV0ZXJtaW5lIHRoZSBsYXJnZXIgb2YgdHdvIEFQSW50cyBjb25zaWRlcmVkIHRvIGJlIHNpZ25lZC4KK2lubGluZSBjb25zdCBBUEludCAmc21heChjb25zdCBBUEludCAmQSwgY29uc3QgQVBJbnQgJkIpIHsKKyAgcmV0dXJuIEEuc2d0KEIpID8gQSA6IEI7Cit9CisKKy8vLyBcYnJpZWYgRGV0ZXJtaW5lIHRoZSBzbWFsbGVyIG9mIHR3byBBUEludHMgY29uc2lkZXJlZCB0byBiZSBzaWduZWQuCitpbmxpbmUgY29uc3QgQVBJbnQgJnVtaW4oY29uc3QgQVBJbnQgJkEsIGNvbnN0IEFQSW50ICZCKSB7CisgIHJldHVybiBBLnVsdChCKSA/IEEgOiBCOworfQorCisvLy8gXGJyaWVmIERldGVybWluZSB0aGUgbGFyZ2VyIG9mIHR3byBBUEludHMgY29uc2lkZXJlZCB0byBiZSB1bnNpZ25lZC4KK2lubGluZSBjb25zdCBBUEludCAmdW1heChjb25zdCBBUEludCAmQSwgY29uc3QgQVBJbnQgJkIpIHsKKyAgcmV0dXJuIEEudWd0KEIpID8gQSA6IEI7Cit9CisKKy8vLyBcYnJpZWYgQ29tcHV0ZSBHQ0Qgb2YgdHdvIHVuc2lnbmVkIEFQSW50IHZhbHVlcy4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZ3JlYXRlc3QgY29tbW9uIGRpdmlzb3Igb2YgdGhlIHR3byBBUEludCB2YWx1ZXMKKy8vLyB1c2luZyBTdGVpbidzIGFsZ29yaXRobS4KKy8vLworLy8vIFxyZXR1cm5zIHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBvZiBBIGFuZCBCLgorQVBJbnQgR3JlYXRlc3RDb21tb25EaXZpc29yKEFQSW50IEEsIEFQSW50IEIpOworCisvLy8gXGJyaWVmIENvbnZlcnRzIHRoZSBnaXZlbiBBUEludCB0byBhIGRvdWJsZSB2YWx1ZS4KKy8vLworLy8vIFRyZWF0cyB0aGUgQVBJbnQgYXMgYW4gdW5zaWduZWQgdmFsdWUgZm9yIGNvbnZlcnNpb24gcHVycG9zZXMuCitpbmxpbmUgZG91YmxlIFJvdW5kQVBJbnRUb0RvdWJsZShjb25zdCBBUEludCAmQVBJVmFsKSB7CisgIHJldHVybiBBUElWYWwucm91bmRUb0RvdWJsZSgpOworfQorCisvLy8gXGJyaWVmIENvbnZlcnRzIHRoZSBnaXZlbiBBUEludCB0byBhIGRvdWJsZSB2YWx1ZS4KKy8vLworLy8vIFRyZWF0cyB0aGUgQVBJbnQgYXMgYSBzaWduZWQgdmFsdWUgZm9yIGNvbnZlcnNpb24gcHVycG9zZXMuCitpbmxpbmUgZG91YmxlIFJvdW5kU2lnbmVkQVBJbnRUb0RvdWJsZShjb25zdCBBUEludCAmQVBJVmFsKSB7CisgIHJldHVybiBBUElWYWwuc2lnbmVkUm91bmRUb0RvdWJsZSgpOworfQorCisvLy8gXGJyaWVmIENvbnZlcnRzIHRoZSBnaXZlbiBBUEludCB0byBhIGZsb2F0IHZsYWx1ZS4KK2lubGluZSBmbG9hdCBSb3VuZEFQSW50VG9GbG9hdChjb25zdCBBUEludCAmQVBJVmFsKSB7CisgIHJldHVybiBmbG9hdChSb3VuZEFQSW50VG9Eb3VibGUoQVBJVmFsKSk7Cit9CisKKy8vLyBcYnJpZWYgQ29udmVydHMgdGhlIGdpdmVuIEFQSW50IHRvIGEgZmxvYXQgdmFsdWUuCisvLy8KKy8vLyBUcmVhc3QgdGhlIEFQSW50IGFzIGEgc2lnbmVkIHZhbHVlIGZvciBjb252ZXJzaW9uIHB1cnBvc2VzLgoraW5saW5lIGZsb2F0IFJvdW5kU2lnbmVkQVBJbnRUb0Zsb2F0KGNvbnN0IEFQSW50ICZBUElWYWwpIHsKKyAgcmV0dXJuIGZsb2F0KEFQSVZhbC5zaWduZWRSb3VuZFRvRG91YmxlKCkpOworfQorCisvLy8gXGJyaWVmIENvbnZlcnRzIHRoZSBnaXZlbiBkb3VibGUgdmFsdWUgaW50byBhIEFQSW50LgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiBjb252ZXJ0IGEgZG91YmxlIHZhbHVlIHRvIGFuIEFQSW50IHZhbHVlLgorQVBJbnQgUm91bmREb3VibGVUb0FQSW50KGRvdWJsZSBEb3VibGUsIHVuc2lnbmVkIHdpZHRoKTsKKworLy8vIFxicmllZiBDb252ZXJ0cyBhIGZsb2F0IHZhbHVlIGludG8gYSBBUEludC4KKy8vLworLy8vIENvbnZlcnRzIGEgZmxvYXQgdmFsdWUgaW50byBhbiBBUEludCB2YWx1ZS4KK2lubGluZSBBUEludCBSb3VuZEZsb2F0VG9BUEludChmbG9hdCBGbG9hdCwgdW5zaWduZWQgd2lkdGgpIHsKKyAgcmV0dXJuIFJvdW5kRG91YmxlVG9BUEludChkb3VibGUoRmxvYXQpLCB3aWR0aCk7Cit9CisKK30gLy8gRW5kIG9mIEFQSW50T3BzIG5hbWVzcGFjZQorCisvLyBTZWUgZnJpZW5kIGRlY2xhcmF0aW9uIGFib3ZlLiBUaGlzIGFkZGl0aW9uYWwgZGVjbGFyYXRpb24gaXMgcmVxdWlyZWQgaW4KKy8vIG9yZGVyIHRvIGNvbXBpbGUgTExWTSB3aXRoIElCTSB4bEMgY29tcGlsZXIuCitoYXNoX2NvZGUgaGFzaF92YWx1ZShjb25zdCBBUEludCAmQXJnKTsKK30gLy8gRW5kIG9mIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvQVBTSW50LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9BUFNJbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWJiZjMzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvQVBTSW50LmgKQEAgLTAsMCArMSwzMzYgQEAKKy8vPT09LS0gbGx2bS9BRFQvQVBTSW50LmggLSBBcmJpdHJhcnkgUHJlY2lzaW9uIFNpZ25lZCBJbnQgLS0tLS0qLSBDKysgLSotLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEFQU0ludCBjbGFzcywgd2hpY2ggaXMgYSBzaW1wbGUgY2xhc3MgdGhhdAorLy8gcmVwcmVzZW50cyBhbiBhcmJpdHJhcnkgc2l6ZWQgaW50ZWdlciB0aGF0IGtub3dzIGl0cyBzaWduZWRuZXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfQVBTSU5UX0gKKyNkZWZpbmUgTExWTV9BRFRfQVBTSU5UX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FQSW50LmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTExWTV9OT0RJU0NBUkQgQVBTSW50IDogcHVibGljIEFQSW50IHsKKyAgYm9vbCBJc1Vuc2lnbmVkOworCitwdWJsaWM6CisgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yIHRoYXQgY3JlYXRlcyBhbiB1bmluaXRpYWxpemVkIEFQSW50LgorICBleHBsaWNpdCBBUFNJbnQoKSA6IElzVW5zaWduZWQoZmFsc2UpIHt9CisKKyAgLy8vIEFQU0ludCBjdG9yIC0gQ3JlYXRlIGFuIEFQU0ludCB3aXRoIHRoZSBzcGVjaWZpZWQgd2lkdGgsIGRlZmF1bHQgdG8KKyAgLy8vIHVuc2lnbmVkLgorICBleHBsaWNpdCBBUFNJbnQodWludDMyX3QgQml0V2lkdGgsIGJvb2wgaXNVbnNpZ25lZCA9IHRydWUpCisgICA6IEFQSW50KEJpdFdpZHRoLCAwKSwgSXNVbnNpZ25lZChpc1Vuc2lnbmVkKSB7fQorCisgIGV4cGxpY2l0IEFQU0ludChBUEludCBJLCBib29sIGlzVW5zaWduZWQgPSB0cnVlKQorICAgOiBBUEludChzdGQ6Om1vdmUoSSkpLCBJc1Vuc2lnbmVkKGlzVW5zaWduZWQpIHt9CisKKyAgLy8vIENvbnN0cnVjdCBhbiBBUFNJbnQgZnJvbSBhIHN0cmluZyByZXByZXNlbnRhdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGNvbnN0cnVjdG9yIGludGVycHJldHMgdGhlIHN0cmluZyBccCBTdHIgdXNpbmcgdGhlIHJhZGl4IG9mIDEwLgorICAvLy8gVGhlIGludGVycHJldGF0aW9uIHN0b3BzIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gVGhlIGJpdCB3aWR0aCBvZiB0aGUKKyAgLy8vIGNvbnN0cnVjdGVkIEFQU0ludCBpcyBkZXRlcm1pbmVkIGF1dG9tYXRpY2FsbHkuCisgIC8vLworICAvLy8gXHBhcmFtIFN0ciB0aGUgc3RyaW5nIHRvIGJlIGludGVycHJldGVkLgorICBleHBsaWNpdCBBUFNJbnQoU3RyaW5nUmVmIFN0cik7CisKKyAgQVBTSW50ICZvcGVyYXRvcj0oQVBJbnQgUkhTKSB7CisgICAgLy8gUmV0YWluIG91ciBjdXJyZW50IHNpZ24uCisgICAgQVBJbnQ6Om9wZXJhdG9yPShzdGQ6Om1vdmUoUkhTKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQVBTSW50ICZvcGVyYXRvcj0odWludDY0X3QgUkhTKSB7CisgICAgLy8gUmV0YWluIG91ciBjdXJyZW50IHNpZ24uCisgICAgQVBJbnQ6Om9wZXJhdG9yPShSSFMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIFF1ZXJ5IHNpZ24gaW5mb3JtYXRpb24uCisgIGJvb2wgaXNTaWduZWQoKSBjb25zdCB7IHJldHVybiAhSXNVbnNpZ25lZDsgfQorICBib29sIGlzVW5zaWduZWQoKSBjb25zdCB7IHJldHVybiBJc1Vuc2lnbmVkOyB9CisgIHZvaWQgc2V0SXNVbnNpZ25lZChib29sIFZhbCkgeyBJc1Vuc2lnbmVkID0gVmFsOyB9CisgIHZvaWQgc2V0SXNTaWduZWQoYm9vbCBWYWwpIHsgSXNVbnNpZ25lZCA9ICFWYWw7IH0KKworICAvLy8gdG9TdHJpbmcgLSBBcHBlbmQgdGhpcyBBUFNJbnQgdG8gdGhlIHNwZWNpZmllZCBTbWFsbFN0cmluZy4KKyAgdm9pZCB0b1N0cmluZyhTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlN0ciwgdW5zaWduZWQgUmFkaXggPSAxMCkgY29uc3QgeworICAgIEFQSW50Ojp0b1N0cmluZyhTdHIsIFJhZGl4LCBpc1NpZ25lZCgpKTsKKyAgfQorICAvLy8gdG9TdHJpbmcgLSBDb252ZXJ0cyBhbiBBUEludCB0byBhIHN0ZDo6c3RyaW5nLiAgVGhpcyBpcyBhbiBpbmVmZmljaWVudAorICAvLy8gbWV0aG9kOyB5b3Ugc2hvdWxkIHByZWZlciBwYXNzaW5nIGluIGEgU21hbGxTdHJpbmcgaW5zdGVhZC4KKyAgc3RkOjpzdHJpbmcgdG9TdHJpbmcodW5zaWduZWQgUmFkaXgpIGNvbnN0IHsKKyAgICByZXR1cm4gQVBJbnQ6OnRvU3RyaW5nKFJhZGl4LCBpc1NpZ25lZCgpKTsKKyAgfQorICB1c2luZyBBUEludDo6dG9TdHJpbmc7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGNvcnJlY3RseS1leHRlbmRlZCBcYyBpbnQ2NF90IHZhbHVlLgorICBpbnQ2NF90IGdldEV4dFZhbHVlKCkgY29uc3QgeworICAgIGFzc2VydChnZXRNaW5TaWduZWRCaXRzKCkgPD0gNjQgJiYgIlRvbyBtYW55IGJpdHMgZm9yIGludDY0X3QiKTsKKyAgICByZXR1cm4gaXNTaWduZWQoKSA/IGdldFNFeHRWYWx1ZSgpIDogZ2V0WkV4dFZhbHVlKCk7CisgIH0KKworICBBUFNJbnQgdHJ1bmModWludDMyX3Qgd2lkdGgpIGNvbnN0IHsKKyAgICByZXR1cm4gQVBTSW50KEFQSW50Ojp0cnVuYyh3aWR0aCksIElzVW5zaWduZWQpOworICB9CisKKyAgQVBTSW50IGV4dGVuZCh1aW50MzJfdCB3aWR0aCkgY29uc3QgeworICAgIGlmIChJc1Vuc2lnbmVkKQorICAgICAgcmV0dXJuIEFQU0ludCh6ZXh0KHdpZHRoKSwgSXNVbnNpZ25lZCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIEFQU0ludChzZXh0KHdpZHRoKSwgSXNVbnNpZ25lZCk7CisgIH0KKworICBBUFNJbnQgZXh0T3JUcnVuYyh1aW50MzJfdCB3aWR0aCkgY29uc3QgeworICAgIGlmIChJc1Vuc2lnbmVkKQorICAgICAgcmV0dXJuIEFQU0ludCh6ZXh0T3JUcnVuYyh3aWR0aCksIElzVW5zaWduZWQpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBBUFNJbnQoc2V4dE9yVHJ1bmMod2lkdGgpLCBJc1Vuc2lnbmVkKTsKKyAgfQorCisgIGNvbnN0IEFQU0ludCAmb3BlcmF0b3IlPShjb25zdCBBUFNJbnQgJlJIUykgeworICAgIGFzc2VydChJc1Vuc2lnbmVkID09IFJIUy5Jc1Vuc2lnbmVkICYmICJTaWduZWRuZXNzIG1pc21hdGNoISIpOworICAgIGlmIChJc1Vuc2lnbmVkKQorICAgICAgKnRoaXMgPSB1cmVtKFJIUyk7CisgICAgZWxzZQorICAgICAgKnRoaXMgPSBzcmVtKFJIUyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGNvbnN0IEFQU0ludCAmb3BlcmF0b3IvPShjb25zdCBBUFNJbnQgJlJIUykgeworICAgIGFzc2VydChJc1Vuc2lnbmVkID09IFJIUy5Jc1Vuc2lnbmVkICYmICJTaWduZWRuZXNzIG1pc21hdGNoISIpOworICAgIGlmIChJc1Vuc2lnbmVkKQorICAgICAgKnRoaXMgPSB1ZGl2KFJIUyk7CisgICAgZWxzZQorICAgICAgKnRoaXMgPSBzZGl2KFJIUyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEFQU0ludCBvcGVyYXRvciUoY29uc3QgQVBTSW50ICZSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICByZXR1cm4gSXNVbnNpZ25lZCA/IEFQU0ludCh1cmVtKFJIUyksIHRydWUpIDogQVBTSW50KHNyZW0oUkhTKSwgZmFsc2UpOworICB9CisgIEFQU0ludCBvcGVyYXRvci8oY29uc3QgQVBTSW50ICZSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICByZXR1cm4gSXNVbnNpZ25lZCA/IEFQU0ludCh1ZGl2KFJIUyksIHRydWUpIDogQVBTSW50KHNkaXYoUkhTKSwgZmFsc2UpOworICB9CisKKyAgQVBTSW50IG9wZXJhdG9yPj4odW5zaWduZWQgQW10KSBjb25zdCB7CisgICAgcmV0dXJuIElzVW5zaWduZWQgPyBBUFNJbnQobHNocihBbXQpLCB0cnVlKSA6IEFQU0ludChhc2hyKEFtdCksIGZhbHNlKTsKKyAgfQorICBBUFNJbnQmIG9wZXJhdG9yPj49KHVuc2lnbmVkIEFtdCkgeworICAgIGlmIChJc1Vuc2lnbmVkKQorICAgICAgbHNockluUGxhY2UoQW10KTsKKyAgICBlbHNlCisgICAgICBhc2hySW5QbGFjZShBbXQpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBBUFNJbnQmIFJIUykgY29uc3QgeworICAgIGFzc2VydChJc1Vuc2lnbmVkID09IFJIUy5Jc1Vuc2lnbmVkICYmICJTaWduZWRuZXNzIG1pc21hdGNoISIpOworICAgIHJldHVybiBJc1Vuc2lnbmVkID8gdWx0KFJIUykgOiBzbHQoUkhTKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgQVBTSW50JiBSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICByZXR1cm4gSXNVbnNpZ25lZCA/IHVndChSSFMpIDogc2d0KFJIUyk7CisgIH0KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBBUFNJbnQmIFJIUykgY29uc3QgeworICAgIGFzc2VydChJc1Vuc2lnbmVkID09IFJIUy5Jc1Vuc2lnbmVkICYmICJTaWduZWRuZXNzIG1pc21hdGNoISIpOworICAgIHJldHVybiBJc1Vuc2lnbmVkID8gdWxlKFJIUykgOiBzbGUoUkhTKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEFQU0ludCYgUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KElzVW5zaWduZWQgPT0gUkhTLklzVW5zaWduZWQgJiYgIlNpZ25lZG5lc3MgbWlzbWF0Y2ghIik7CisgICAgcmV0dXJuIElzVW5zaWduZWQgPyB1Z2UoUkhTKSA6IHNnZShSSFMpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgQVBTSW50JiBSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICByZXR1cm4gZXEoUkhTKTsKKyAgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFQU0ludCYgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuICEoKCp0aGlzKSA9PSBSSFMpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGludDY0X3QgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbXBhcmVWYWx1ZXMoKnRoaXMsIGdldChSSFMpKSA9PSAwOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShpbnQ2NF90IFJIUykgY29uc3QgeworICAgIHJldHVybiBjb21wYXJlVmFsdWVzKCp0aGlzLCBnZXQoUkhTKSkgIT0gMDsKKyAgfQorICBib29sIG9wZXJhdG9yPD0oaW50NjRfdCBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gY29tcGFyZVZhbHVlcygqdGhpcywgZ2V0KFJIUykpIDw9IDA7CisgIH0KKyAgYm9vbCBvcGVyYXRvcj49KGludDY0X3QgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbXBhcmVWYWx1ZXMoKnRoaXMsIGdldChSSFMpKSA+PSAwOworICB9CisgIGJvb2wgb3BlcmF0b3I8KGludDY0X3QgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbXBhcmVWYWx1ZXMoKnRoaXMsIGdldChSSFMpKSA8IDA7CisgIH0KKyAgYm9vbCBvcGVyYXRvcj4oaW50NjRfdCBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gY29tcGFyZVZhbHVlcygqdGhpcywgZ2V0KFJIUykpID4gMDsKKyAgfQorCisgIC8vIFRoZSByZW1haW5pbmcgb3BlcmF0b3JzIGp1c3Qgd3JhcCB0aGUgbG9naWMgb2YgQVBJbnQsIGJ1dCByZXRhaW4gdGhlCisgIC8vIHNpZ25lZG5lc3MgaW5mb3JtYXRpb24uCisKKyAgQVBTSW50IG9wZXJhdG9yPDwodW5zaWduZWQgQml0cykgY29uc3QgeworICAgIHJldHVybiBBUFNJbnQoc3RhdGljX2Nhc3Q8Y29uc3QgQVBJbnQmPigqdGhpcykgPDwgQml0cywgSXNVbnNpZ25lZCk7CisgIH0KKyAgQVBTSW50JiBvcGVyYXRvcjw8PSh1bnNpZ25lZCBBbXQpIHsKKyAgICBzdGF0aWNfY2FzdDxBUEludCY+KCp0aGlzKSA8PD0gQW10OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEFQU0ludCYgb3BlcmF0b3IrKygpIHsKKyAgICArKyhzdGF0aWNfY2FzdDxBUEludCY+KCp0aGlzKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEFQU0ludCYgb3BlcmF0b3ItLSgpIHsKKyAgICAtLShzdGF0aWNfY2FzdDxBUEludCY+KCp0aGlzKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEFQU0ludCBvcGVyYXRvcisrKGludCkgeworICAgIHJldHVybiBBUFNJbnQoKytzdGF0aWNfY2FzdDxBUEludCY+KCp0aGlzKSwgSXNVbnNpZ25lZCk7CisgIH0KKyAgQVBTSW50IG9wZXJhdG9yLS0oaW50KSB7CisgICAgcmV0dXJuIEFQU0ludCgtLXN0YXRpY19jYXN0PEFQSW50Jj4oKnRoaXMpLCBJc1Vuc2lnbmVkKTsKKyAgfQorICBBUFNJbnQgb3BlcmF0b3ItKCkgY29uc3QgeworICAgIHJldHVybiBBUFNJbnQoLXN0YXRpY19jYXN0PGNvbnN0IEFQSW50Jj4oKnRoaXMpLCBJc1Vuc2lnbmVkKTsKKyAgfQorICBBUFNJbnQmIG9wZXJhdG9yKz0oY29uc3QgQVBTSW50JiBSSFMpIHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICBzdGF0aWNfY2FzdDxBUEludCY+KCp0aGlzKSArPSBSSFM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEFQU0ludCYgb3BlcmF0b3ItPShjb25zdCBBUFNJbnQmIFJIUykgeworICAgIGFzc2VydChJc1Vuc2lnbmVkID09IFJIUy5Jc1Vuc2lnbmVkICYmICJTaWduZWRuZXNzIG1pc21hdGNoISIpOworICAgIHN0YXRpY19jYXN0PEFQSW50Jj4oKnRoaXMpIC09IFJIUzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgQVBTSW50JiBvcGVyYXRvcio9KGNvbnN0IEFQU0ludCYgUkhTKSB7CisgICAgYXNzZXJ0KElzVW5zaWduZWQgPT0gUkhTLklzVW5zaWduZWQgJiYgIlNpZ25lZG5lc3MgbWlzbWF0Y2ghIik7CisgICAgc3RhdGljX2Nhc3Q8QVBJbnQmPigqdGhpcykgKj0gUkhTOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBBUFNJbnQmIG9wZXJhdG9yJj0oY29uc3QgQVBTSW50JiBSSFMpIHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICBzdGF0aWNfY2FzdDxBUEludCY+KCp0aGlzKSAmPSBSSFM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIEFQU0ludCYgb3BlcmF0b3J8PShjb25zdCBBUFNJbnQmIFJIUykgeworICAgIGFzc2VydChJc1Vuc2lnbmVkID09IFJIUy5Jc1Vuc2lnbmVkICYmICJTaWduZWRuZXNzIG1pc21hdGNoISIpOworICAgIHN0YXRpY19jYXN0PEFQSW50Jj4oKnRoaXMpIHw9IFJIUzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgQVBTSW50JiBvcGVyYXRvcl49KGNvbnN0IEFQU0ludCYgUkhTKSB7CisgICAgYXNzZXJ0KElzVW5zaWduZWQgPT0gUkhTLklzVW5zaWduZWQgJiYgIlNpZ25lZG5lc3MgbWlzbWF0Y2ghIik7CisgICAgc3RhdGljX2Nhc3Q8QVBJbnQmPigqdGhpcykgXj0gUkhTOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEFQU0ludCBvcGVyYXRvciYoY29uc3QgQVBTSW50JiBSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICByZXR1cm4gQVBTSW50KHN0YXRpY19jYXN0PGNvbnN0IEFQSW50Jj4oKnRoaXMpICYgUkhTLCBJc1Vuc2lnbmVkKTsKKyAgfQorCisgIEFQU0ludCBvcGVyYXRvcnwoY29uc3QgQVBTSW50JiBSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICByZXR1cm4gQVBTSW50KHN0YXRpY19jYXN0PGNvbnN0IEFQSW50Jj4oKnRoaXMpIHwgUkhTLCBJc1Vuc2lnbmVkKTsKKyAgfQorCisgIEFQU0ludCBvcGVyYXRvcl4oY29uc3QgQVBTSW50ICZSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICByZXR1cm4gQVBTSW50KHN0YXRpY19jYXN0PGNvbnN0IEFQSW50Jj4oKnRoaXMpIF4gUkhTLCBJc1Vuc2lnbmVkKTsKKyAgfQorCisgIEFQU0ludCBvcGVyYXRvciooY29uc3QgQVBTSW50JiBSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoSXNVbnNpZ25lZCA9PSBSSFMuSXNVbnNpZ25lZCAmJiAiU2lnbmVkbmVzcyBtaXNtYXRjaCEiKTsKKyAgICByZXR1cm4gQVBTSW50KHN0YXRpY19jYXN0PGNvbnN0IEFQSW50Jj4oKnRoaXMpICogUkhTLCBJc1Vuc2lnbmVkKTsKKyAgfQorICBBUFNJbnQgb3BlcmF0b3IrKGNvbnN0IEFQU0ludCYgUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KElzVW5zaWduZWQgPT0gUkhTLklzVW5zaWduZWQgJiYgIlNpZ25lZG5lc3MgbWlzbWF0Y2ghIik7CisgICAgcmV0dXJuIEFQU0ludChzdGF0aWNfY2FzdDxjb25zdCBBUEludCY+KCp0aGlzKSArIFJIUywgSXNVbnNpZ25lZCk7CisgIH0KKyAgQVBTSW50IG9wZXJhdG9yLShjb25zdCBBUFNJbnQmIFJIUykgY29uc3QgeworICAgIGFzc2VydChJc1Vuc2lnbmVkID09IFJIUy5Jc1Vuc2lnbmVkICYmICJTaWduZWRuZXNzIG1pc21hdGNoISIpOworICAgIHJldHVybiBBUFNJbnQoc3RhdGljX2Nhc3Q8Y29uc3QgQVBJbnQmPigqdGhpcykgLSBSSFMsIElzVW5zaWduZWQpOworICB9CisgIEFQU0ludCBvcGVyYXRvcn4oKSBjb25zdCB7CisgICAgcmV0dXJuIEFQU0ludCh+c3RhdGljX2Nhc3Q8Y29uc3QgQVBJbnQmPigqdGhpcyksIElzVW5zaWduZWQpOworICB9CisKKyAgLy8vIGdldE1heFZhbHVlIC0gUmV0dXJuIHRoZSBBUFNJbnQgcmVwcmVzZW50aW5nIHRoZSBtYXhpbXVtIGludGVnZXIgdmFsdWUKKyAgLy8vICB3aXRoIHRoZSBnaXZlbiBiaXQgd2lkdGggYW5kIHNpZ25lZG5lc3MuCisgIHN0YXRpYyBBUFNJbnQgZ2V0TWF4VmFsdWUodWludDMyX3QgbnVtQml0cywgYm9vbCBVbnNpZ25lZCkgeworICAgIHJldHVybiBBUFNJbnQoVW5zaWduZWQgPyBBUEludDo6Z2V0TWF4VmFsdWUobnVtQml0cykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQVBJbnQ6OmdldFNpZ25lZE1heFZhbHVlKG51bUJpdHMpLCBVbnNpZ25lZCk7CisgIH0KKworICAvLy8gZ2V0TWluVmFsdWUgLSBSZXR1cm4gdGhlIEFQU0ludCByZXByZXNlbnRpbmcgdGhlIG1pbmltdW0gaW50ZWdlciB2YWx1ZQorICAvLy8gIHdpdGggdGhlIGdpdmVuIGJpdCB3aWR0aCBhbmQgc2lnbmVkbmVzcy4KKyAgc3RhdGljIEFQU0ludCBnZXRNaW5WYWx1ZSh1aW50MzJfdCBudW1CaXRzLCBib29sIFVuc2lnbmVkKSB7CisgICAgcmV0dXJuIEFQU0ludChVbnNpZ25lZCA/IEFQSW50OjpnZXRNaW5WYWx1ZShudW1CaXRzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBBUEludDo6Z2V0U2lnbmVkTWluVmFsdWUobnVtQml0cyksIFVuc2lnbmVkKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIGlmIHR3byBBUFNJbnRzIGhhdmUgdGhlIHNhbWUgdmFsdWUsIHplcm8tIG9yCisgIC8vLyBzaWduLWV4dGVuZGluZyBhcyBuZWVkZWQuCisgIHN0YXRpYyBib29sIGlzU2FtZVZhbHVlKGNvbnN0IEFQU0ludCAmSTEsIGNvbnN0IEFQU0ludCAmSTIpIHsKKyAgICByZXR1cm4gIWNvbXBhcmVWYWx1ZXMoSTEsIEkyKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29tcGFyZSB1bmRlcmx5aW5nIHZhbHVlcyBvZiB0d28gbnVtYmVycy4KKyAgc3RhdGljIGludCBjb21wYXJlVmFsdWVzKGNvbnN0IEFQU0ludCAmSTEsIGNvbnN0IEFQU0ludCAmSTIpIHsKKyAgICBpZiAoSTEuZ2V0Qml0V2lkdGgoKSA9PSBJMi5nZXRCaXRXaWR0aCgpICYmIEkxLmlzU2lnbmVkKCkgPT0gSTIuaXNTaWduZWQoKSkKKyAgICAgIHJldHVybiBJMS5Jc1Vuc2lnbmVkID8gSTEuY29tcGFyZShJMikgOiBJMS5jb21wYXJlU2lnbmVkKEkyKTsKKworICAgIC8vIENoZWNrIGZvciBhIGJpdC13aWR0aCBtaXNtYXRjaC4KKyAgICBpZiAoSTEuZ2V0Qml0V2lkdGgoKSA+IEkyLmdldEJpdFdpZHRoKCkpCisgICAgICByZXR1cm4gY29tcGFyZVZhbHVlcyhJMSwgSTIuZXh0ZW5kKEkxLmdldEJpdFdpZHRoKCkpKTsKKyAgICBpZiAoSTIuZ2V0Qml0V2lkdGgoKSA+IEkxLmdldEJpdFdpZHRoKCkpCisgICAgICByZXR1cm4gY29tcGFyZVZhbHVlcyhJMS5leHRlbmQoSTIuZ2V0Qml0V2lkdGgoKSksIEkyKTsKKworICAgIC8vIFdlIGhhdmUgYSBzaWduZWRuZXNzIG1pc21hdGNoLiBDaGVjayBmb3IgbmVnYXRpdmUgdmFsdWVzIGFuZCBkbyBhbgorICAgIC8vIHVuc2lnbmVkIGNvbXBhcmUgaWYgYm90aCBhcmUgcG9zaXRpdmUuCisgICAgaWYgKEkxLmlzU2lnbmVkKCkpIHsKKyAgICAgIGFzc2VydCghSTIuaXNTaWduZWQoKSAmJiAiRXhwZWN0ZWQgc2lnbmVkIG1pc21hdGNoIik7CisgICAgICBpZiAoSTEuaXNOZWdhdGl2ZSgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChJMi5pc1NpZ25lZCgpICYmICJFeHBlY3RlZCBzaWduZWQgbWlzbWF0Y2giKTsKKyAgICAgIGlmIChJMi5pc05lZ2F0aXZlKCkpCisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIHJldHVybiBJMS5jb21wYXJlKEkyKTsKKyAgfQorCisgIHN0YXRpYyBBUFNJbnQgZ2V0KGludDY0X3QgWCkgeyByZXR1cm4gQVBTSW50KEFQSW50KDY0LCBYKSwgZmFsc2UpOyB9CisgIHN0YXRpYyBBUFNJbnQgZ2V0VW5zaWduZWQodWludDY0X3QgWCkgeyByZXR1cm4gQVBTSW50KEFQSW50KDY0LCBYKSwgdHJ1ZSk7IH0KKworICAvLy8gUHJvZmlsZSAtIFVzZWQgdG8gaW5zZXJ0IEFQU0ludCBvYmplY3RzLCBvciBvYmplY3RzIHRoYXQgY29udGFpbiBBUFNJbnQKKyAgLy8vICBvYmplY3RzLCBpbnRvIEZvbGRpbmdTZXRzLgorICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCYgSUQpIGNvbnN0OworfTsKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShpbnQ2NF90IFYxLCBjb25zdCBBUFNJbnQgJlYyKSB7IHJldHVybiBWMiA9PSBWMTsgfQoraW5saW5lIGJvb2wgb3BlcmF0b3IhPShpbnQ2NF90IFYxLCBjb25zdCBBUFNJbnQgJlYyKSB7IHJldHVybiBWMiAhPSBWMTsgfQoraW5saW5lIGJvb2wgb3BlcmF0b3I8PShpbnQ2NF90IFYxLCBjb25zdCBBUFNJbnQgJlYyKSB7IHJldHVybiBWMiA+PSBWMTsgfQoraW5saW5lIGJvb2wgb3BlcmF0b3I+PShpbnQ2NF90IFYxLCBjb25zdCBBUFNJbnQgJlYyKSB7IHJldHVybiBWMiA8PSBWMTsgfQoraW5saW5lIGJvb2wgb3BlcmF0b3I8KGludDY0X3QgVjEsIGNvbnN0IEFQU0ludCAmVjIpIHsgcmV0dXJuIFYyID4gVjE7IH0KK2lubGluZSBib29sIG9wZXJhdG9yPihpbnQ2NF90IFYxLCBjb25zdCBBUFNJbnQgJlYyKSB7IHJldHVybiBWMiA8IFYxOyB9CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IEFQU0ludCAmSSkgeworICBJLnByaW50KE9TLCBJLmlzU2lnbmVkKCkpOworICByZXR1cm4gT1M7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvQWxsb2NhdG9yTGlzdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvQWxsb2NhdG9yTGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3OGM2NzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9BbGxvY2F0b3JMaXN0LmgKQEAgLTAsMCArMSwyNDEgQEAKKy8vPT09LSBsbHZtL0FEVC9BbGxvY2F0b3JMaXN0LmggLSBDdXN0b20gYWxsb2NhdG9yIGxpc3QgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfQUxMT0NBVE9STElTVF9ICisjZGVmaW5lIExMVk1fQURUX0FMTE9DQVRPUkxJU1RfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3Rfbm9kZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvc2ltcGxlX2lsaXN0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQSBsaW5rZWQtbGlzdCB3aXRoIGEgY3VzdG9tLCBsb2NhbCBhbGxvY2F0b3IuCisvLy8KKy8vLyBFeHBvc2UgYSBzdGQ6Omxpc3QtbGlrZSBpbnRlcmZhY2UgdGhhdCBvd25zIGFuZCB1c2VzIGEgY3VzdG9tIExMVk0tc3R5bGUKKy8vLyBhbGxvY2F0b3IgKGUuZy4sIEJ1bXBQdHJBbGxvY2F0b3IpLCBsZXZlcmFnaW5nIFxhIHNpbXBsZV9pbGlzdCBmb3IgdGhlCisvLy8gaW1wbGVtZW50YXRpb24gZGV0YWlscy4KKy8vLworLy8vIEJlY2F1c2UgdGhpcyBsaXN0IG93bnMgdGhlIGFsbG9jYXRvciwgY2FsbGluZyBcYSBzcGxpY2UoKSB3aXRoIGEgZGlmZmVyZW50CisvLy8gbGlzdCBpc24ndCBnZW5lcmFsbHkgc2FmZS4gIEFzIHN1Y2gsIFxhIHNwbGljZSBoYXMgYmVlbiBsZWZ0IG91dCBvZiB0aGUKKy8vLyBpbnRlcmZhY2UgZW50aXJlbHkuCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQWxsb2NhdG9yVD4gY2xhc3MgQWxsb2NhdG9yTGlzdCA6IEFsbG9jYXRvclQgeworICBzdHJ1Y3QgTm9kZSA6IGlsaXN0X25vZGU8Tm9kZT4geworICAgIE5vZGUoTm9kZSAmJikgPSBkZWxldGU7CisgICAgTm9kZShjb25zdCBOb2RlICYpID0gZGVsZXRlOworICAgIE5vZGUgJm9wZXJhdG9yPShOb2RlICYmKSA9IGRlbGV0ZTsKKyAgICBOb2RlICZvcGVyYXRvcj0oY29uc3QgTm9kZSAmKSA9IGRlbGV0ZTsKKworICAgIE5vZGUoVCAmJlYpIDogVihzdGQ6Om1vdmUoVikpIHt9CisgICAgTm9kZShjb25zdCBUICZWKSA6IFYoVikge30KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gVHM+IE5vZGUoVHMgJiYuLi4gVnMpIDogVihzdGQ6OmZvcndhcmQ8VHM+KFZzKS4uLikge30KKyAgICBUIFY7CisgIH07CisKKyAgdXNpbmcgbGlzdF90eXBlID0gc2ltcGxlX2lsaXN0PE5vZGU+OworCisgIGxpc3RfdHlwZSBMaXN0OworCisgIEFsbG9jYXRvclQgJmdldEFsbG9jKCkgeyByZXR1cm4gKnRoaXM7IH0KKyAgY29uc3QgQWxsb2NhdG9yVCAmZ2V0QWxsb2MoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorCisgIHRlbXBsYXRlIDxjbGFzcy4uLiBBcmdUcz4gTm9kZSAqY3JlYXRlKEFyZ1RzICYmLi4uIEFyZ3MpIHsKKyAgICByZXR1cm4gbmV3IChnZXRBbGxvYygpKSBOb2RlKHN0ZDo6Zm9yd2FyZDxBcmdUcz4oQXJncykuLi4pOworICB9CisKKyAgc3RydWN0IENsb25lciB7CisgICAgQWxsb2NhdG9yTGlzdCAmQUw7CisKKyAgICBDbG9uZXIoQWxsb2NhdG9yTGlzdCAmQUwpIDogQUwoQUwpIHt9CisKKyAgICBOb2RlICpvcGVyYXRvcigpKGNvbnN0IE5vZGUgJk4pIGNvbnN0IHsgcmV0dXJuIEFMLmNyZWF0ZShOLlYpOyB9CisgIH07CisKKyAgc3RydWN0IERpc3Bvc2VyIHsKKyAgICBBbGxvY2F0b3JMaXN0ICZBTDsKKworICAgIERpc3Bvc2VyKEFsbG9jYXRvckxpc3QgJkFMKSA6IEFMKEFMKSB7fQorCisgICAgdm9pZCBvcGVyYXRvcigpKE5vZGUgKk4pIGNvbnN0IHsKKyAgICAgIE4tPn5Ob2RlKCk7CisgICAgICBBTC5nZXRBbGxvYygpLkRlYWxsb2NhdGUoTik7CisgICAgfQorICB9OworCitwdWJsaWM6CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBUOworICB1c2luZyBwb2ludGVyID0gVCAqOworICB1c2luZyByZWZlcmVuY2UgPSBUICY7CisgIHVzaW5nIGNvbnN0X3BvaW50ZXIgPSBjb25zdCBUICo7CisgIHVzaW5nIGNvbnN0X3JlZmVyZW5jZSA9IGNvbnN0IFQgJjsKKyAgdXNpbmcgc2l6ZV90eXBlID0gdHlwZW5hbWUgbGlzdF90eXBlOjpzaXplX3R5cGU7CisgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IHR5cGVuYW1lIGxpc3RfdHlwZTo6ZGlmZmVyZW5jZV90eXBlOworCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8Y2xhc3MgVmFsdWVULCBjbGFzcyBJdGVyYXRvckJhc2U+CisgIGNsYXNzIEl0ZXJhdG9ySW1wbAorICAgICAgOiBwdWJsaWMgaXRlcmF0b3JfYWRhcHRvcl9iYXNlPEl0ZXJhdG9ySW1wbDxWYWx1ZVQsIEl0ZXJhdG9yQmFzZT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3JCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcsIFZhbHVlVD4geworICAgIHRlbXBsYXRlIDxjbGFzcyBPdGhlclZhbHVlVCwgY2xhc3MgT3RoZXJJdGVyYXRvckJhc2U+CisgICAgZnJpZW5kIGNsYXNzIEl0ZXJhdG9ySW1wbDsKKyAgICBmcmllbmQgQWxsb2NhdG9yTGlzdDsKKworICAgIHVzaW5nIGJhc2VfdHlwZSA9CisgICAgICAgIGl0ZXJhdG9yX2FkYXB0b3JfYmFzZTxJdGVyYXRvckltcGw8VmFsdWVULCBJdGVyYXRvckJhc2U+LCBJdGVyYXRvckJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnLCBWYWx1ZVQ+OworCisgIHB1YmxpYzoKKyAgICB1c2luZyB2YWx1ZV90eXBlID0gVmFsdWVUOworICAgIHVzaW5nIHBvaW50ZXIgPSBWYWx1ZVQgKjsKKyAgICB1c2luZyByZWZlcmVuY2UgPSBWYWx1ZVQgJjsKKworICAgIEl0ZXJhdG9ySW1wbCgpID0gZGVmYXVsdDsKKyAgICBJdGVyYXRvckltcGwoY29uc3QgSXRlcmF0b3JJbXBsICYpID0gZGVmYXVsdDsKKyAgICBJdGVyYXRvckltcGwgJm9wZXJhdG9yPShjb25zdCBJdGVyYXRvckltcGwgJikgPSBkZWZhdWx0OworCisgICAgZXhwbGljaXQgSXRlcmF0b3JJbXBsKGNvbnN0IEl0ZXJhdG9yQmFzZSAmSSkgOiBiYXNlX3R5cGUoSSkge30KKworICAgIHRlbXBsYXRlIDxjbGFzcyBPdGhlclZhbHVlVCwgY2xhc3MgT3RoZXJJdGVyYXRvckJhc2U+CisgICAgSXRlcmF0b3JJbXBsKGNvbnN0IEl0ZXJhdG9ySW1wbDxPdGhlclZhbHVlVCwgT3RoZXJJdGVyYXRvckJhc2U+ICZYLAorICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPAorICAgICAgICAgICAgICAgICAgICAgT3RoZXJJdGVyYXRvckJhc2UsIEl0ZXJhdG9yQmFzZT46OnZhbHVlPjo6dHlwZSAqID0gbnVsbHB0cikKKyAgICAgICAgOiBiYXNlX3R5cGUoWC53cmFwcGVkKCkpIHt9CisKKyAgICB+SXRlcmF0b3JJbXBsKCkgPSBkZWZhdWx0OworCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIGJhc2VfdHlwZTo6d3JhcHBlZCgpLT5WOyB9CisgICAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJm9wZXJhdG9yKigpOyB9CisKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEl0ZXJhdG9ySW1wbCAmTCwgY29uc3QgSXRlcmF0b3JJbXBsICZSKSB7CisgICAgICByZXR1cm4gTC53cmFwcGVkKCkgPT0gUi53cmFwcGVkKCk7CisgICAgfQorICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgSXRlcmF0b3JJbXBsICZMLCBjb25zdCBJdGVyYXRvckltcGwgJlIpIHsKKyAgICAgIHJldHVybiAhKEwgPT0gUik7CisgICAgfQorICB9OworCitwdWJsaWM6CisgIHVzaW5nIGl0ZXJhdG9yID0gSXRlcmF0b3JJbXBsPFQsIHR5cGVuYW1lIGxpc3RfdHlwZTo6aXRlcmF0b3I+OworICB1c2luZyByZXZlcnNlX2l0ZXJhdG9yID0KKyAgICAgIEl0ZXJhdG9ySW1wbDxULCB0eXBlbmFtZSBsaXN0X3R5cGU6OnJldmVyc2VfaXRlcmF0b3I+OworICB1c2luZyBjb25zdF9pdGVyYXRvciA9CisgICAgICBJdGVyYXRvckltcGw8Y29uc3QgVCwgdHlwZW5hbWUgbGlzdF90eXBlOjpjb25zdF9pdGVyYXRvcj47CisgIHVzaW5nIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgPQorICAgICAgSXRlcmF0b3JJbXBsPGNvbnN0IFQsIHR5cGVuYW1lIGxpc3RfdHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcj47CisKKyAgQWxsb2NhdG9yTGlzdCgpID0gZGVmYXVsdDsKKyAgQWxsb2NhdG9yTGlzdChBbGxvY2F0b3JMaXN0ICYmWCkKKyAgICAgIDogQWxsb2NhdG9yVChzdGQ6Om1vdmUoWC5nZXRBbGxvYygpKSksIExpc3Qoc3RkOjptb3ZlKFguTGlzdCkpIHt9CisKKyAgQWxsb2NhdG9yTGlzdChjb25zdCBBbGxvY2F0b3JMaXN0ICZYKSB7CisgICAgTGlzdC5jbG9uZUZyb20oWC5MaXN0LCBDbG9uZXIoKnRoaXMpLCBEaXNwb3NlcigqdGhpcykpOworICB9CisKKyAgQWxsb2NhdG9yTGlzdCAmb3BlcmF0b3I9KEFsbG9jYXRvckxpc3QgJiZYKSB7CisgICAgY2xlYXIoKTsgLy8gRGlzcG9zZSBvZiBjdXJyZW50IG5vZGVzIGV4cGxpY2l0bHkuCisgICAgTGlzdCA9IHN0ZDo6bW92ZShYLkxpc3QpOworICAgIGdldEFsbG9jKCkgPSBzdGQ6Om1vdmUoWC5nZXRBbGxvYygpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBBbGxvY2F0b3JMaXN0ICZvcGVyYXRvcj0oY29uc3QgQWxsb2NhdG9yTGlzdCAmWCkgeworICAgIExpc3QuY2xvbmVGcm9tKFguTGlzdCwgQ2xvbmVyKCp0aGlzKSwgRGlzcG9zZXIoKnRoaXMpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB+QWxsb2NhdG9yTGlzdCgpIHsgY2xlYXIoKTsgfQorCisgIHZvaWQgc3dhcChBbGxvY2F0b3JMaXN0ICZSSFMpIHsKKyAgICBMaXN0LnN3YXAoUkhTLkxpc3QpOworICAgIHN0ZDo6c3dhcChnZXRBbGxvYygpLCBSSFMuZ2V0QWxsb2MoKSk7CisgIH0KKworICBib29sIGVtcHR5KCkgeyByZXR1cm4gTGlzdC5lbXB0eSgpOyB9CisgIHNpemVfdCBzaXplKCkgeyByZXR1cm4gTGlzdC5zaXplKCk7IH0KKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGl0ZXJhdG9yKExpc3QuYmVnaW4oKSk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gaXRlcmF0b3IoTGlzdC5lbmQoKSk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcihMaXN0LmJlZ2luKCkpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKExpc3QuZW5kKCkpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihMaXN0LnJiZWdpbigpKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKExpc3QucmVuZCgpKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihMaXN0LnJiZWdpbigpKTsKKyAgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoTGlzdC5yZW5kKCkpOworICB9CisKKyAgVCAmYmFjaygpIHsgcmV0dXJuIExpc3QuYmFjaygpLlY7IH0KKyAgVCAmZnJvbnQoKSB7IHJldHVybiBMaXN0LmZyb250KCkuVjsgfQorICBjb25zdCBUICZiYWNrKCkgY29uc3QgeyByZXR1cm4gTGlzdC5iYWNrKCkuVjsgfQorICBjb25zdCBUICZmcm9udCgpIGNvbnN0IHsgcmV0dXJuIExpc3QuZnJvbnQoKS5WOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzLi4uIFRzPiBpdGVyYXRvciBlbXBsYWNlKGl0ZXJhdG9yIEksIFRzICYmLi4uIFZzKSB7CisgICAgcmV0dXJuIGl0ZXJhdG9yKExpc3QuaW5zZXJ0KEkud3JhcHBlZCgpLCAqY3JlYXRlKHN0ZDo6Zm9yd2FyZDxUcz4oVnMpLi4uKSkpOworICB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIEksIFQgJiZWKSB7CisgICAgcmV0dXJuIGl0ZXJhdG9yKExpc3QuaW5zZXJ0KEkud3JhcHBlZCgpLCAqY3JlYXRlKHN0ZDo6bW92ZShWKSkpKTsKKyAgfQorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgSSwgY29uc3QgVCAmVikgeworICAgIHJldHVybiBpdGVyYXRvcihMaXN0Lmluc2VydChJLndyYXBwZWQoKSwgKmNyZWF0ZShWKSkpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yPgorICB2b2lkIGluc2VydChpdGVyYXRvciBJLCBJdGVyYXRvciBGaXJzdCwgSXRlcmF0b3IgTGFzdCkgeworICAgIGZvciAoOyBGaXJzdCAhPSBMYXN0OyArK0ZpcnN0KQorICAgICAgTGlzdC5pbnNlcnQoSS53cmFwcGVkKCksICpjcmVhdGUoKkZpcnN0KSk7CisgIH0KKworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBJKSB7CisgICAgcmV0dXJuIGl0ZXJhdG9yKExpc3QuZXJhc2VBbmREaXNwb3NlKEkud3JhcHBlZCgpLCBEaXNwb3NlcigqdGhpcykpKTsKKyAgfQorCisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIEZpcnN0LCBpdGVyYXRvciBMYXN0KSB7CisgICAgcmV0dXJuIGl0ZXJhdG9yKAorICAgICAgICBMaXN0LmVyYXNlQW5kRGlzcG9zZShGaXJzdC53cmFwcGVkKCksIExhc3Qud3JhcHBlZCgpLCBEaXNwb3NlcigqdGhpcykpKTsKKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7IExpc3QuY2xlYXJBbmREaXNwb3NlKERpc3Bvc2VyKCp0aGlzKSk7IH0KKyAgdm9pZCBwb3BfYmFjaygpIHsgTGlzdC5lcmFzZUFuZERpc3Bvc2UoLS1MaXN0LmVuZCgpLCBEaXNwb3NlcigqdGhpcykpOyB9CisgIHZvaWQgcG9wX2Zyb250KCkgeyBMaXN0LmVyYXNlQW5kRGlzcG9zZShMaXN0LmJlZ2luKCksIERpc3Bvc2VyKCp0aGlzKSk7IH0KKyAgdm9pZCBwdXNoX2JhY2soVCAmJlYpIHsgaW5zZXJ0KGVuZCgpLCBzdGQ6Om1vdmUoVikpOyB9CisgIHZvaWQgcHVzaF9mcm9udChUICYmVikgeyBpbnNlcnQoYmVnaW4oKSwgc3RkOjptb3ZlKFYpKTsgfQorICB2b2lkIHB1c2hfYmFjayhjb25zdCBUICZWKSB7IGluc2VydChlbmQoKSwgVik7IH0KKyAgdm9pZCBwdXNoX2Zyb250KGNvbnN0IFQgJlYpIHsgaW5zZXJ0KGJlZ2luKCksIFYpOyB9CisgIHRlbXBsYXRlIDxjbGFzcy4uLiBUcz4gdm9pZCBlbXBsYWNlX2JhY2soVHMgJiYuLi4gVnMpIHsKKyAgICBlbXBsYWNlKGVuZCgpLCBzdGQ6OmZvcndhcmQ8VHM+KFZzKS4uLik7CisgIH0KKyAgdGVtcGxhdGUgPGNsYXNzLi4uIFRzPiB2b2lkIGVtcGxhY2VfZnJvbnQoVHMgJiYuLi4gVnMpIHsKKyAgICBlbXBsYWNlKGJlZ2luKCksIHN0ZDo6Zm9yd2FyZDxUcz4oVnMpLi4uKTsKKyAgfQorCisgIC8vLyBSZXNldCB0aGUgdW5kZXJseWluZyBhbGxvY2F0b3IuCisgIC8vLworICAvLy8gXHByZSBcYyBlbXB0eSgpCisgIHZvaWQgcmVzZXRBbGxvYygpIHsKKyAgICBhc3NlcnQoZW1wdHkoKSAmJiAiQ2Fubm90IHJlc2V0IGFsbG9jYXRvciBpZiBub3QgZW1wdHkiKTsKKyAgICBnZXRBbGxvYygpLlJlc2V0KCk7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPiB1c2luZyBCdW1wUHRyTGlzdCA9IEFsbG9jYXRvckxpc3Q8VCwgQnVtcFB0ckFsbG9jYXRvcj47CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9BTExPQ0FUT1JMSVNUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0FycmF5UmVmLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9BcnJheVJlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmN2E3NjkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9BcnJheVJlZi5oCkBAIC0wLDAgKzEsNTQxIEBACisvLz09PS0gQXJyYXlSZWYuaCAtIEFycmF5IFJlZmVyZW5jZSBXcmFwcGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0FSUkFZUkVGX0gKKyNkZWZpbmUgTExWTV9BRFRfQVJSQVlSRUZfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvSGFzaGluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgLy8vIEFycmF5UmVmIC0gUmVwcmVzZW50IGEgY29uc3RhbnQgcmVmZXJlbmNlIHRvIGFuIGFycmF5ICgwIG9yIG1vcmUgZWxlbWVudHMKKyAgLy8vIGNvbnNlY3V0aXZlbHkgaW4gbWVtb3J5KSwgaS5lLiBhIHN0YXJ0IHBvaW50ZXIgYW5kIGEgbGVuZ3RoLiAgSXQgYWxsb3dzCisgIC8vLyB2YXJpb3VzIEFQSXMgdG8gdGFrZSBjb25zZWN1dGl2ZSBlbGVtZW50cyBlYXNpbHkgYW5kIGNvbnZlbmllbnRseS4KKyAgLy8vCisgIC8vLyBUaGlzIGNsYXNzIGRvZXMgbm90IG93biB0aGUgdW5kZXJseWluZyBkYXRhLCBpdCBpcyBleHBlY3RlZCB0byBiZSB1c2VkIGluCisgIC8vLyBzaXR1YXRpb25zIHdoZXJlIHRoZSBkYXRhIHJlc2lkZXMgaW4gc29tZSBvdGhlciBidWZmZXIsIHdob3NlIGxpZmV0aW1lCisgIC8vLyBleHRlbmRzIHBhc3QgdGhhdCBvZiB0aGUgQXJyYXlSZWYuIEZvciB0aGlzIHJlYXNvbiwgaXQgaXMgbm90IGluIGdlbmVyYWwKKyAgLy8vIHNhZmUgdG8gc3RvcmUgYW4gQXJyYXlSZWYuCisgIC8vLworICAvLy8gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB0cml2aWFsbHkgY29weWFibGUsIHNvIGl0IHNob3VsZCBiZSBwYXNzZWQgYnkKKyAgLy8vIHZhbHVlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBjbGFzcyBMTFZNX05PRElTQ0FSRCBBcnJheVJlZiB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBpdGVyYXRvciA9IGNvbnN0IFQgKjsKKyAgICB1c2luZyBjb25zdF9pdGVyYXRvciA9IGNvbnN0IFQgKjsKKyAgICB1c2luZyBzaXplX3R5cGUgPSBzaXplX3Q7CisgICAgdXNpbmcgcmV2ZXJzZV9pdGVyYXRvciA9IHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj47CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gVGhlIHN0YXJ0IG9mIHRoZSBhcnJheSwgaW4gYW4gZXh0ZXJuYWwgYnVmZmVyLgorICAgIGNvbnN0IFQgKkRhdGEgPSBudWxscHRyOworCisgICAgLy8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMuCisgICAgc2l6ZV90eXBlIExlbmd0aCA9IDA7CisKKyAgcHVibGljOgorICAgIC8vLyBAbmFtZSBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gQHsKKworICAgIC8vLyBDb25zdHJ1Y3QgYW4gZW1wdHkgQXJyYXlSZWYuCisgICAgLyppbXBsaWNpdCovIEFycmF5UmVmKCkgPSBkZWZhdWx0OworCisgICAgLy8vIENvbnN0cnVjdCBhbiBlbXB0eSBBcnJheVJlZiBmcm9tIE5vbmUuCisgICAgLyppbXBsaWNpdCovIEFycmF5UmVmKE5vbmVUeXBlKSB7fQorCisgICAgLy8vIENvbnN0cnVjdCBhbiBBcnJheVJlZiBmcm9tIGEgc2luZ2xlIGVsZW1lbnQuCisgICAgLyppbXBsaWNpdCovIEFycmF5UmVmKGNvbnN0IFQgJk9uZUVsdCkKKyAgICAgIDogRGF0YSgmT25lRWx0KSwgTGVuZ3RoKDEpIHt9CisKKyAgICAvLy8gQ29uc3RydWN0IGFuIEFycmF5UmVmIGZyb20gYSBwb2ludGVyIGFuZCBsZW5ndGguCisgICAgLyppbXBsaWNpdCovIEFycmF5UmVmKGNvbnN0IFQgKmRhdGEsIHNpemVfdCBsZW5ndGgpCisgICAgICA6IERhdGEoZGF0YSksIExlbmd0aChsZW5ndGgpIHt9CisKKyAgICAvLy8gQ29uc3RydWN0IGFuIEFycmF5UmVmIGZyb20gYSByYW5nZS4KKyAgICBBcnJheVJlZihjb25zdCBUICpiZWdpbiwgY29uc3QgVCAqZW5kKQorICAgICAgOiBEYXRhKGJlZ2luKSwgTGVuZ3RoKGVuZCAtIGJlZ2luKSB7fQorCisgICAgLy8vIENvbnN0cnVjdCBhbiBBcnJheVJlZiBmcm9tIGEgU21hbGxWZWN0b3IuIFRoaXMgaXMgdGVtcGxhdGVkIGluIG9yZGVyIHRvCisgICAgLy8vIGF2b2lkIGluc3RhbnRpYXRpbmcgU21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxUPiB3aGVuZXZlciB3ZQorICAgIC8vLyBjb3B5LWNvbnN0cnVjdCBhbiBBcnJheVJlZi4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICAgIC8qaW1wbGljaXQqLyBBcnJheVJlZihjb25zdCBTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uPFQsIFU+ICZWZWMpCisgICAgICA6IERhdGEoVmVjLmRhdGEoKSksIExlbmd0aChWZWMuc2l6ZSgpKSB7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBhbiBBcnJheVJlZiBmcm9tIGEgc3RkOjp2ZWN0b3IuCisgICAgdGVtcGxhdGU8dHlwZW5hbWUgQT4KKyAgICAvKmltcGxpY2l0Ki8gQXJyYXlSZWYoY29uc3Qgc3RkOjp2ZWN0b3I8VCwgQT4gJlZlYykKKyAgICAgIDogRGF0YShWZWMuZGF0YSgpKSwgTGVuZ3RoKFZlYy5zaXplKCkpIHt9CisKKyAgICAvLy8gQ29uc3RydWN0IGFuIEFycmF5UmVmIGZyb20gYSBzdGQ6OmFycmF5CisgICAgdGVtcGxhdGUgPHNpemVfdCBOPgorICAgIC8qaW1wbGljaXQqLyBjb25zdGV4cHIgQXJyYXlSZWYoY29uc3Qgc3RkOjphcnJheTxULCBOPiAmQXJyKQorICAgICAgICA6IERhdGEoQXJyLmRhdGEoKSksIExlbmd0aChOKSB7fQorCisgICAgLy8vIENvbnN0cnVjdCBhbiBBcnJheVJlZiBmcm9tIGEgQyBhcnJheS4KKyAgICB0ZW1wbGF0ZSA8c2l6ZV90IE4+CisgICAgLyppbXBsaWNpdCovIGNvbnN0ZXhwciBBcnJheVJlZihjb25zdCBUICgmQXJyKVtOXSkgOiBEYXRhKEFyciksIExlbmd0aChOKSB7fQorCisgICAgLy8vIENvbnN0cnVjdCBhbiBBcnJheVJlZiBmcm9tIGEgc3RkOjppbml0aWFsaXplcl9saXN0LgorICAgIC8qaW1wbGljaXQqLyBBcnJheVJlZihjb25zdCBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gJlZlYykKKyAgICA6IERhdGEoVmVjLmJlZ2luKCkgPT0gVmVjLmVuZCgpID8gKFQqKW51bGxwdHIgOiBWZWMuYmVnaW4oKSksCisgICAgICBMZW5ndGgoVmVjLnNpemUoKSkge30KKworICAgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWY8Y29uc3QgVCo+IGZyb20gQXJyYXlSZWY8VCo+LiBUaGlzIHVzZXMgU0ZJTkFFIHRvCisgICAgLy8vIGVuc3VyZSB0aGF0IG9ubHkgQXJyYXlSZWZzIG9mIHBvaW50ZXJzIGNhbiBiZSBjb252ZXJ0ZWQuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgICAgQXJyYXlSZWYoCisgICAgICAgIGNvbnN0IEFycmF5UmVmPFUgKj4gJkEsCisgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICBzdGQ6OmlzX2NvbnZlcnRpYmxlPFUgKmNvbnN0ICosIFQgY29uc3QgKj46OnZhbHVlPjo6dHlwZSAqID0gbnVsbHB0cikKKyAgICAgIDogRGF0YShBLmRhdGEoKSksIExlbmd0aChBLnNpemUoKSkge30KKworICAgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWY8Y29uc3QgVCo+IGZyb20gYSBTbWFsbFZlY3RvcjxUKj4uIFRoaXMgaXMKKyAgICAvLy8gdGVtcGxhdGVkIGluIG9yZGVyIHRvIGF2b2lkIGluc3RhbnRpYXRpbmcgU21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxUPgorICAgIC8vLyB3aGVuZXZlciB3ZSBjb3B5LWNvbnN0cnVjdCBhbiBBcnJheVJlZi4KKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBEdW1teVQ+CisgICAgLyppbXBsaWNpdCovIEFycmF5UmVmKAorICAgICAgY29uc3QgU21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxVICosIER1bW15VD4gJlZlYywKKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgIHN0ZDo6aXNfY29udmVydGlibGU8VSAqY29uc3QgKiwgVCBjb25zdCAqPjo6dmFsdWU+Ojp0eXBlICogPSBudWxscHRyKQorICAgICAgOiBEYXRhKFZlYy5kYXRhKCkpLCBMZW5ndGgoVmVjLnNpemUoKSkgeworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWY8Y29uc3QgVCo+IGZyb20gc3RkOjp2ZWN0b3I8VCo+LiBUaGlzIHVzZXMgU0ZJTkFFCisgICAgLy8vIHRvIGVuc3VyZSB0aGF0IG9ubHkgdmVjdG9ycyBvZiBwb2ludGVycyBjYW4gYmUgY29udmVydGVkLgorICAgIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIEE+CisgICAgQXJyYXlSZWYoY29uc3Qgc3RkOjp2ZWN0b3I8VSAqLCBBPiAmVmVjLAorICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICBzdGQ6OmlzX2NvbnZlcnRpYmxlPFUgKmNvbnN0ICosIFQgY29uc3QgKj46OnZhbHVlPjo6dHlwZSogPSAwKQorICAgICAgOiBEYXRhKFZlYy5kYXRhKCkpLCBMZW5ndGgoVmVjLnNpemUoKSkge30KKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBTaW1wbGUgT3BlcmF0aW9ucworICAgIC8vLyBAeworCisgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBEYXRhOyB9CisgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gRGF0YSArIExlbmd0aDsgfQorCisgICAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICAgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7IH0KKworICAgIC8vLyBlbXB0eSAtIENoZWNrIGlmIHRoZSBhcnJheSBpcyBlbXB0eS4KKyAgICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gTGVuZ3RoID09IDA7IH0KKworICAgIGNvbnN0IFQgKmRhdGEoKSBjb25zdCB7IHJldHVybiBEYXRhOyB9CisKKyAgICAvLy8gc2l6ZSAtIEdldCB0aGUgYXJyYXkgc2l6ZS4KKyAgICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIExlbmd0aDsgfQorCisgICAgLy8vIGZyb250IC0gR2V0IHRoZSBmaXJzdCBlbGVtZW50LgorICAgIGNvbnN0IFQgJmZyb250KCkgY29uc3QgeworICAgICAgYXNzZXJ0KCFlbXB0eSgpKTsKKyAgICAgIHJldHVybiBEYXRhWzBdOworICAgIH0KKworICAgIC8vLyBiYWNrIC0gR2V0IHRoZSBsYXN0IGVsZW1lbnQuCisgICAgY29uc3QgVCAmYmFjaygpIGNvbnN0IHsKKyAgICAgIGFzc2VydCghZW1wdHkoKSk7CisgICAgICByZXR1cm4gRGF0YVtMZW5ndGgtMV07CisgICAgfQorCisgICAgLy8gY29weSAtIEFsbG9jYXRlIGNvcHkgaW4gQWxsb2NhdG9yIGFuZCByZXR1cm4gQXJyYXlSZWY8VD4gdG8gaXQuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEFsbG9jYXRvcj4gQXJyYXlSZWY8VD4gY29weShBbGxvY2F0b3IgJkEpIHsKKyAgICAgIFQgKkJ1ZmYgPSBBLnRlbXBsYXRlIEFsbG9jYXRlPFQ+KExlbmd0aCk7CisgICAgICBzdGQ6OnVuaW5pdGlhbGl6ZWRfY29weShiZWdpbigpLCBlbmQoKSwgQnVmZik7CisgICAgICByZXR1cm4gQXJyYXlSZWY8VD4oQnVmZiwgTGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLy8gZXF1YWxzIC0gQ2hlY2sgZm9yIGVsZW1lbnQtd2lzZSBlcXVhbGl0eS4KKyAgICBib29sIGVxdWFscyhBcnJheVJlZiBSSFMpIGNvbnN0IHsKKyAgICAgIGlmIChMZW5ndGggIT0gUkhTLkxlbmd0aCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIHN0ZDo6ZXF1YWwoYmVnaW4oKSwgZW5kKCksIFJIUy5iZWdpbigpKTsKKyAgICB9CisKKyAgICAvLy8gc2xpY2UobiwgbSkgLSBDaG9wIG9mZiB0aGUgZmlyc3QgTiBlbGVtZW50cyBvZiB0aGUgYXJyYXksIGFuZCBrZWVwIE0KKyAgICAvLy8gZWxlbWVudHMgaW4gdGhlIGFycmF5LgorICAgIEFycmF5UmVmPFQ+IHNsaWNlKHNpemVfdCBOLCBzaXplX3QgTSkgY29uc3QgeworICAgICAgYXNzZXJ0KE4rTSA8PSBzaXplKCkgJiYgIkludmFsaWQgc3BlY2lmaWVyIik7CisgICAgICByZXR1cm4gQXJyYXlSZWY8VD4oZGF0YSgpK04sIE0pOworICAgIH0KKworICAgIC8vLyBzbGljZShuKSAtIENob3Agb2ZmIHRoZSBmaXJzdCBOIGVsZW1lbnRzIG9mIHRoZSBhcnJheS4KKyAgICBBcnJheVJlZjxUPiBzbGljZShzaXplX3QgTikgY29uc3QgeyByZXR1cm4gc2xpY2UoTiwgc2l6ZSgpIC0gTik7IH0KKworICAgIC8vLyBcYnJpZWYgRHJvcCB0aGUgZmlyc3QgXHAgTiBlbGVtZW50cyBvZiB0aGUgYXJyYXkuCisgICAgQXJyYXlSZWY8VD4gZHJvcF9mcm9udChzaXplX3QgTiA9IDEpIGNvbnN0IHsKKyAgICAgIGFzc2VydChzaXplKCkgPj0gTiAmJiAiRHJvcHBpbmcgbW9yZSBlbGVtZW50cyB0aGFuIGV4aXN0Iik7CisgICAgICByZXR1cm4gc2xpY2UoTiwgc2l6ZSgpIC0gTik7CisgICAgfQorCisgICAgLy8vIFxicmllZiBEcm9wIHRoZSBsYXN0IFxwIE4gZWxlbWVudHMgb2YgdGhlIGFycmF5LgorICAgIEFycmF5UmVmPFQ+IGRyb3BfYmFjayhzaXplX3QgTiA9IDEpIGNvbnN0IHsKKyAgICAgIGFzc2VydChzaXplKCkgPj0gTiAmJiAiRHJvcHBpbmcgbW9yZSBlbGVtZW50cyB0aGFuIGV4aXN0Iik7CisgICAgICByZXR1cm4gc2xpY2UoMCwgc2l6ZSgpIC0gTik7CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZXR1cm4gYSBjb3B5IG9mICp0aGlzIHdpdGggdGhlIGZpcnN0IE4gZWxlbWVudHMgc2F0aXNmeWluZyB0aGUKKyAgICAvLy8gZ2l2ZW4gcHJlZGljYXRlIHJlbW92ZWQuCisgICAgdGVtcGxhdGUgPGNsYXNzIFByZWRpY2F0ZVQ+IEFycmF5UmVmPFQ+IGRyb3Bfd2hpbGUoUHJlZGljYXRlVCBQcmVkKSBjb25zdCB7CisgICAgICByZXR1cm4gQXJyYXlSZWY8VD4oZmluZF9pZl9ub3QoKnRoaXMsIFByZWQpLCBlbmQoKSk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZXR1cm4gYSBjb3B5IG9mICp0aGlzIHdpdGggdGhlIGZpcnN0IE4gZWxlbWVudHMgbm90IHNhdGlzZnlpbmcKKyAgICAvLy8gdGhlIGdpdmVuIHByZWRpY2F0ZSByZW1vdmVkLgorICAgIHRlbXBsYXRlIDxjbGFzcyBQcmVkaWNhdGVUPiBBcnJheVJlZjxUPiBkcm9wX3VudGlsKFByZWRpY2F0ZVQgUHJlZCkgY29uc3QgeworICAgICAgcmV0dXJuIEFycmF5UmVmPFQ+KGZpbmRfaWYoKnRoaXMsIFByZWQpLCBlbmQoKSk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZXR1cm4gYSBjb3B5IG9mICp0aGlzIHdpdGggb25seSB0aGUgZmlyc3QgXHAgTiBlbGVtZW50cy4KKyAgICBBcnJheVJlZjxUPiB0YWtlX2Zyb250KHNpemVfdCBOID0gMSkgY29uc3QgeworICAgICAgaWYgKE4gPj0gc2l6ZSgpKQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICByZXR1cm4gZHJvcF9iYWNrKHNpemUoKSAtIE4pOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJuIGEgY29weSBvZiAqdGhpcyB3aXRoIG9ubHkgdGhlIGxhc3QgXHAgTiBlbGVtZW50cy4KKyAgICBBcnJheVJlZjxUPiB0YWtlX2JhY2soc2l6ZV90IE4gPSAxKSBjb25zdCB7CisgICAgICBpZiAoTiA+PSBzaXplKCkpCisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIHJldHVybiBkcm9wX2Zyb250KHNpemUoKSAtIE4pOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBmaXJzdCBOIGVsZW1lbnRzIG9mIHRoaXMgQXJyYXkgdGhhdCBzYXRpc2Z5IHRoZSBnaXZlbgorICAgIC8vLyBwcmVkaWNhdGUuCisgICAgdGVtcGxhdGUgPGNsYXNzIFByZWRpY2F0ZVQ+IEFycmF5UmVmPFQ+IHRha2Vfd2hpbGUoUHJlZGljYXRlVCBQcmVkKSBjb25zdCB7CisgICAgICByZXR1cm4gQXJyYXlSZWY8VD4oYmVnaW4oKSwgZmluZF9pZl9ub3QoKnRoaXMsIFByZWQpKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZmlyc3QgTiBlbGVtZW50cyBvZiB0aGlzIEFycmF5IHRoYXQgZG9uJ3Qgc2F0aXNmeSB0aGUKKyAgICAvLy8gZ2l2ZW4gcHJlZGljYXRlLgorICAgIHRlbXBsYXRlIDxjbGFzcyBQcmVkaWNhdGVUPiBBcnJheVJlZjxUPiB0YWtlX3VudGlsKFByZWRpY2F0ZVQgUHJlZCkgY29uc3QgeworICAgICAgcmV0dXJuIEFycmF5UmVmPFQ+KGJlZ2luKCksIGZpbmRfaWYoKnRoaXMsIFByZWQpKTsKKyAgICB9CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgT3BlcmF0b3IgT3ZlcmxvYWRzCisgICAgLy8vIEB7CisgICAgY29uc3QgVCAmb3BlcmF0b3JbXShzaXplX3QgSW5kZXgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChJbmRleCA8IExlbmd0aCAmJiAiSW52YWxpZCBpbmRleCEiKTsKKyAgICAgIHJldHVybiBEYXRhW0luZGV4XTsKKyAgICB9CisKKyAgICAvLy8gRGlzYWxsb3cgYWNjaWRlbnRhbCBhc3NpZ25tZW50IGZyb20gYSB0ZW1wb3JhcnkuCisgICAgLy8vCisgICAgLy8vIFRoZSBkZWNsYXJhdGlvbiBoZXJlIGlzIGV4dHJhIGNvbXBsaWNhdGVkIHNvIHRoYXQgImFycmF5UmVmID0ge30iCisgICAgLy8vIGNvbnRpbnVlcyB0byBzZWxlY3QgdGhlIG1vdmUgYXNzaWdubWVudCBvcGVyYXRvci4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NhbWU8VSwgVD46OnZhbHVlLCBBcnJheVJlZjxUPj46OnR5cGUgJgorICAgIG9wZXJhdG9yPShVICYmVGVtcG9yYXJ5KSA9IGRlbGV0ZTsKKworICAgIC8vLyBEaXNhbGxvdyBhY2NpZGVudGFsIGFzc2lnbm1lbnQgZnJvbSBhIHRlbXBvcmFyeS4KKyAgICAvLy8KKyAgICAvLy8gVGhlIGRlY2xhcmF0aW9uIGhlcmUgaXMgZXh0cmEgY29tcGxpY2F0ZWQgc28gdGhhdCAiYXJyYXlSZWYgPSB7fSIKKyAgICAvLy8gY29udGludWVzIHRvIHNlbGVjdCB0aGUgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfc2FtZTxVLCBUPjo6dmFsdWUsIEFycmF5UmVmPFQ+Pjo6dHlwZSAmCisgICAgb3BlcmF0b3I9KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxVPikgPSBkZWxldGU7CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgRXhwZW5zaXZlIE9wZXJhdGlvbnMKKyAgICAvLy8gQHsKKyAgICBzdGQ6OnZlY3RvcjxUPiB2ZWMoKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp2ZWN0b3I8VD4oRGF0YSwgRGF0YStMZW5ndGgpOworICAgIH0KKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBDb252ZXJzaW9uIG9wZXJhdG9ycworICAgIC8vLyBAeworICAgIG9wZXJhdG9yIHN0ZDo6dmVjdG9yPFQ+KCkgY29uc3QgeworICAgICAgcmV0dXJuIHN0ZDo6dmVjdG9yPFQ+KERhdGEsIERhdGErTGVuZ3RoKTsKKyAgICB9CisKKyAgICAvLy8gQH0KKyAgfTsKKworICAvLy8gTXV0YWJsZUFycmF5UmVmIC0gUmVwcmVzZW50IGEgbXV0YWJsZSByZWZlcmVuY2UgdG8gYW4gYXJyYXkgKDAgb3IgbW9yZQorICAvLy8gZWxlbWVudHMgY29uc2VjdXRpdmVseSBpbiBtZW1vcnkpLCBpLmUuIGEgc3RhcnQgcG9pbnRlciBhbmQgYSBsZW5ndGguICBJdAorICAvLy8gYWxsb3dzIHZhcmlvdXMgQVBJcyB0byB0YWtlIGFuZCBtb2RpZnkgY29uc2VjdXRpdmUgZWxlbWVudHMgZWFzaWx5IGFuZAorICAvLy8gY29udmVuaWVudGx5LgorICAvLy8KKyAgLy8vIFRoaXMgY2xhc3MgZG9lcyBub3Qgb3duIHRoZSB1bmRlcmx5aW5nIGRhdGEsIGl0IGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQgaW4KKyAgLy8vIHNpdHVhdGlvbnMgd2hlcmUgdGhlIGRhdGEgcmVzaWRlcyBpbiBzb21lIG90aGVyIGJ1ZmZlciwgd2hvc2UgbGlmZXRpbWUKKyAgLy8vIGV4dGVuZHMgcGFzdCB0aGF0IG9mIHRoZSBNdXRhYmxlQXJyYXlSZWYuIEZvciB0aGlzIHJlYXNvbiwgaXQgaXMgbm90IGluCisgIC8vLyBnZW5lcmFsIHNhZmUgdG8gc3RvcmUgYSBNdXRhYmxlQXJyYXlSZWYuCisgIC8vLworICAvLy8gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB0cml2aWFsbHkgY29weWFibGUsIHNvIGl0IHNob3VsZCBiZSBwYXNzZWQgYnkKKyAgLy8vIHZhbHVlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBjbGFzcyBMTFZNX05PRElTQ0FSRCBNdXRhYmxlQXJyYXlSZWYgOiBwdWJsaWMgQXJyYXlSZWY8VD4geworICBwdWJsaWM6CisgICAgdXNpbmcgaXRlcmF0b3IgPSBUICo7CisgICAgdXNpbmcgcmV2ZXJzZV9pdGVyYXRvciA9IHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj47CisKKyAgICAvLy8gQ29uc3RydWN0IGFuIGVtcHR5IE11dGFibGVBcnJheVJlZi4KKyAgICAvKmltcGxpY2l0Ki8gTXV0YWJsZUFycmF5UmVmKCkgPSBkZWZhdWx0OworCisgICAgLy8vIENvbnN0cnVjdCBhbiBlbXB0eSBNdXRhYmxlQXJyYXlSZWYgZnJvbSBOb25lLgorICAgIC8qaW1wbGljaXQqLyBNdXRhYmxlQXJyYXlSZWYoTm9uZVR5cGUpIDogQXJyYXlSZWY8VD4oKSB7fQorCisgICAgLy8vIENvbnN0cnVjdCBhbiBNdXRhYmxlQXJyYXlSZWYgZnJvbSBhIHNpbmdsZSBlbGVtZW50LgorICAgIC8qaW1wbGljaXQqLyBNdXRhYmxlQXJyYXlSZWYoVCAmT25lRWx0KSA6IEFycmF5UmVmPFQ+KE9uZUVsdCkge30KKworICAgIC8vLyBDb25zdHJ1Y3QgYW4gTXV0YWJsZUFycmF5UmVmIGZyb20gYSBwb2ludGVyIGFuZCBsZW5ndGguCisgICAgLyppbXBsaWNpdCovIE11dGFibGVBcnJheVJlZihUICpkYXRhLCBzaXplX3QgbGVuZ3RoKQorICAgICAgOiBBcnJheVJlZjxUPihkYXRhLCBsZW5ndGgpIHt9CisKKyAgICAvLy8gQ29uc3RydWN0IGFuIE11dGFibGVBcnJheVJlZiBmcm9tIGEgcmFuZ2UuCisgICAgTXV0YWJsZUFycmF5UmVmKFQgKmJlZ2luLCBUICplbmQpIDogQXJyYXlSZWY8VD4oYmVnaW4sIGVuZCkge30KKworICAgIC8vLyBDb25zdHJ1Y3QgYW4gTXV0YWJsZUFycmF5UmVmIGZyb20gYSBTbWFsbFZlY3Rvci4KKyAgICAvKmltcGxpY2l0Ki8gTXV0YWJsZUFycmF5UmVmKFNtYWxsVmVjdG9ySW1wbDxUPiAmVmVjKQorICAgIDogQXJyYXlSZWY8VD4oVmVjKSB7fQorCisgICAgLy8vIENvbnN0cnVjdCBhIE11dGFibGVBcnJheVJlZiBmcm9tIGEgc3RkOjp2ZWN0b3IuCisgICAgLyppbXBsaWNpdCovIE11dGFibGVBcnJheVJlZihzdGQ6OnZlY3RvcjxUPiAmVmVjKQorICAgIDogQXJyYXlSZWY8VD4oVmVjKSB7fQorCisgICAgLy8vIENvbnN0cnVjdCBhbiBBcnJheVJlZiBmcm9tIGEgc3RkOjphcnJheQorICAgIHRlbXBsYXRlIDxzaXplX3QgTj4KKyAgICAvKmltcGxpY2l0Ki8gY29uc3RleHByIE11dGFibGVBcnJheVJlZihzdGQ6OmFycmF5PFQsIE4+ICZBcnIpCisgICAgICAgIDogQXJyYXlSZWY8VD4oQXJyKSB7fQorCisgICAgLy8vIENvbnN0cnVjdCBhbiBNdXRhYmxlQXJyYXlSZWYgZnJvbSBhIEMgYXJyYXkuCisgICAgdGVtcGxhdGUgPHNpemVfdCBOPgorICAgIC8qaW1wbGljaXQqLyBjb25zdGV4cHIgTXV0YWJsZUFycmF5UmVmKFQgKCZBcnIpW05dKSA6IEFycmF5UmVmPFQ+KEFycikge30KKworICAgIFQgKmRhdGEoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PFQqPihBcnJheVJlZjxUPjo6ZGF0YSgpKTsgfQorCisgICAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBkYXRhKCk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBkYXRhKCkgKyB0aGlzLT5zaXplKCk7IH0KKworICAgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgICAvLy8gZnJvbnQgLSBHZXQgdGhlIGZpcnN0IGVsZW1lbnQuCisgICAgVCAmZnJvbnQoKSBjb25zdCB7CisgICAgICBhc3NlcnQoIXRoaXMtPmVtcHR5KCkpOworICAgICAgcmV0dXJuIGRhdGEoKVswXTsKKyAgICB9CisKKyAgICAvLy8gYmFjayAtIEdldCB0aGUgbGFzdCBlbGVtZW50LgorICAgIFQgJmJhY2soKSBjb25zdCB7CisgICAgICBhc3NlcnQoIXRoaXMtPmVtcHR5KCkpOworICAgICAgcmV0dXJuIGRhdGEoKVt0aGlzLT5zaXplKCktMV07CisgICAgfQorCisgICAgLy8vIHNsaWNlKG4sIG0pIC0gQ2hvcCBvZmYgdGhlIGZpcnN0IE4gZWxlbWVudHMgb2YgdGhlIGFycmF5LCBhbmQga2VlcCBNCisgICAgLy8vIGVsZW1lbnRzIGluIHRoZSBhcnJheS4KKyAgICBNdXRhYmxlQXJyYXlSZWY8VD4gc2xpY2Uoc2l6ZV90IE4sIHNpemVfdCBNKSBjb25zdCB7CisgICAgICBhc3NlcnQoTiArIE0gPD0gdGhpcy0+c2l6ZSgpICYmICJJbnZhbGlkIHNwZWNpZmllciIpOworICAgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxUPih0aGlzLT5kYXRhKCkgKyBOLCBNKTsKKyAgICB9CisKKyAgICAvLy8gc2xpY2UobikgLSBDaG9wIG9mZiB0aGUgZmlyc3QgTiBlbGVtZW50cyBvZiB0aGUgYXJyYXkuCisgICAgTXV0YWJsZUFycmF5UmVmPFQ+IHNsaWNlKHNpemVfdCBOKSBjb25zdCB7CisgICAgICByZXR1cm4gc2xpY2UoTiwgdGhpcy0+c2l6ZSgpIC0gTik7CisgICAgfQorCisgICAgLy8vIFxicmllZiBEcm9wIHRoZSBmaXJzdCBccCBOIGVsZW1lbnRzIG9mIHRoZSBhcnJheS4KKyAgICBNdXRhYmxlQXJyYXlSZWY8VD4gZHJvcF9mcm9udChzaXplX3QgTiA9IDEpIGNvbnN0IHsKKyAgICAgIGFzc2VydCh0aGlzLT5zaXplKCkgPj0gTiAmJiAiRHJvcHBpbmcgbW9yZSBlbGVtZW50cyB0aGFuIGV4aXN0Iik7CisgICAgICByZXR1cm4gc2xpY2UoTiwgdGhpcy0+c2l6ZSgpIC0gTik7CisgICAgfQorCisgICAgTXV0YWJsZUFycmF5UmVmPFQ+IGRyb3BfYmFjayhzaXplX3QgTiA9IDEpIGNvbnN0IHsKKyAgICAgIGFzc2VydCh0aGlzLT5zaXplKCkgPj0gTiAmJiAiRHJvcHBpbmcgbW9yZSBlbGVtZW50cyB0aGFuIGV4aXN0Iik7CisgICAgICByZXR1cm4gc2xpY2UoMCwgdGhpcy0+c2l6ZSgpIC0gTik7CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZXR1cm4gYSBjb3B5IG9mICp0aGlzIHdpdGggdGhlIGZpcnN0IE4gZWxlbWVudHMgc2F0aXNmeWluZyB0aGUKKyAgICAvLy8gZ2l2ZW4gcHJlZGljYXRlIHJlbW92ZWQuCisgICAgdGVtcGxhdGUgPGNsYXNzIFByZWRpY2F0ZVQ+CisgICAgTXV0YWJsZUFycmF5UmVmPFQ+IGRyb3Bfd2hpbGUoUHJlZGljYXRlVCBQcmVkKSBjb25zdCB7CisgICAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPFQ+KGZpbmRfaWZfbm90KCp0aGlzLCBQcmVkKSwgZW5kKCkpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJuIGEgY29weSBvZiAqdGhpcyB3aXRoIHRoZSBmaXJzdCBOIGVsZW1lbnRzIG5vdCBzYXRpc2Z5aW5nCisgICAgLy8vIHRoZSBnaXZlbiBwcmVkaWNhdGUgcmVtb3ZlZC4KKyAgICB0ZW1wbGF0ZSA8Y2xhc3MgUHJlZGljYXRlVD4KKyAgICBNdXRhYmxlQXJyYXlSZWY8VD4gZHJvcF91bnRpbChQcmVkaWNhdGVUIFByZWQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBNdXRhYmxlQXJyYXlSZWY8VD4oZmluZF9pZigqdGhpcywgUHJlZCksIGVuZCgpKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFJldHVybiBhIGNvcHkgb2YgKnRoaXMgd2l0aCBvbmx5IHRoZSBmaXJzdCBccCBOIGVsZW1lbnRzLgorICAgIE11dGFibGVBcnJheVJlZjxUPiB0YWtlX2Zyb250KHNpemVfdCBOID0gMSkgY29uc3QgeworICAgICAgaWYgKE4gPj0gdGhpcy0+c2l6ZSgpKQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICByZXR1cm4gZHJvcF9iYWNrKHRoaXMtPnNpemUoKSAtIE4pOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJuIGEgY29weSBvZiAqdGhpcyB3aXRoIG9ubHkgdGhlIGxhc3QgXHAgTiBlbGVtZW50cy4KKyAgICBNdXRhYmxlQXJyYXlSZWY8VD4gdGFrZV9iYWNrKHNpemVfdCBOID0gMSkgY29uc3QgeworICAgICAgaWYgKE4gPj0gdGhpcy0+c2l6ZSgpKQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICByZXR1cm4gZHJvcF9mcm9udCh0aGlzLT5zaXplKCkgLSBOKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZmlyc3QgTiBlbGVtZW50cyBvZiB0aGlzIEFycmF5IHRoYXQgc2F0aXNmeSB0aGUgZ2l2ZW4KKyAgICAvLy8gcHJlZGljYXRlLgorICAgIHRlbXBsYXRlIDxjbGFzcyBQcmVkaWNhdGVUPgorICAgIE11dGFibGVBcnJheVJlZjxUPiB0YWtlX3doaWxlKFByZWRpY2F0ZVQgUHJlZCkgY29uc3QgeworICAgICAgcmV0dXJuIE11dGFibGVBcnJheVJlZjxUPihiZWdpbigpLCBmaW5kX2lmX25vdCgqdGhpcywgUHJlZCkpOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBmaXJzdCBOIGVsZW1lbnRzIG9mIHRoaXMgQXJyYXkgdGhhdCBkb24ndCBzYXRpc2Z5IHRoZQorICAgIC8vLyBnaXZlbiBwcmVkaWNhdGUuCisgICAgdGVtcGxhdGUgPGNsYXNzIFByZWRpY2F0ZVQ+CisgICAgTXV0YWJsZUFycmF5UmVmPFQ+IHRha2VfdW50aWwoUHJlZGljYXRlVCBQcmVkKSBjb25zdCB7CisgICAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPFQ+KGJlZ2luKCksIGZpbmRfaWYoKnRoaXMsIFByZWQpKTsKKyAgICB9CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgT3BlcmF0b3IgT3ZlcmxvYWRzCisgICAgLy8vIEB7CisgICAgVCAmb3BlcmF0b3JbXShzaXplX3QgSW5kZXgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChJbmRleCA8IHRoaXMtPnNpemUoKSAmJiAiSW52YWxpZCBpbmRleCEiKTsKKyAgICAgIHJldHVybiBkYXRhKClbSW5kZXhdOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBpcyBhIE11dGFibGVBcnJheVJlZiB0aGF0IG93bnMgaXRzIGFycmF5LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgT3duaW5nQXJyYXlSZWYgOiBwdWJsaWMgTXV0YWJsZUFycmF5UmVmPFQ+IHsKKyAgcHVibGljOgorICAgIE93bmluZ0FycmF5UmVmKCkgPSBkZWZhdWx0OworICAgIE93bmluZ0FycmF5UmVmKHNpemVfdCBTaXplKSA6IE11dGFibGVBcnJheVJlZjxUPihuZXcgVFtTaXplXSwgU2l6ZSkge30KKworICAgIE93bmluZ0FycmF5UmVmKEFycmF5UmVmPFQ+IERhdGEpCisgICAgICAgIDogTXV0YWJsZUFycmF5UmVmPFQ+KG5ldyBUW0RhdGEuc2l6ZSgpXSwgRGF0YS5zaXplKCkpIHsKKyAgICAgIHN0ZDo6Y29weShEYXRhLmJlZ2luKCksIERhdGEuZW5kKCksIHRoaXMtPmJlZ2luKCkpOworICAgIH0KKworICAgIE93bmluZ0FycmF5UmVmKE93bmluZ0FycmF5UmVmICYmT3RoZXIpIHsgKnRoaXMgPSBPdGhlcjsgfQorCisgICAgT3duaW5nQXJyYXlSZWYgJm9wZXJhdG9yPShPd25pbmdBcnJheVJlZiAmJk90aGVyKSB7CisgICAgICBkZWxldGVbXSB0aGlzLT5kYXRhKCk7CisgICAgICB0aGlzLT5NdXRhYmxlQXJyYXlSZWY8VD46Om9wZXJhdG9yPShPdGhlcik7CisgICAgICBPdGhlci5NdXRhYmxlQXJyYXlSZWY8VD46Om9wZXJhdG9yPShNdXRhYmxlQXJyYXlSZWY8VD4oKSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgfk93bmluZ0FycmF5UmVmKCkgeyBkZWxldGVbXSB0aGlzLT5kYXRhKCk7IH0KKyAgfTsKKworICAvLy8gQG5hbWUgQXJyYXlSZWYgQ29udmVuaWVuY2UgY29uc3RydWN0b3JzCisgIC8vLyBAeworCisgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIHNpbmdsZSBlbGVtZW50LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBBcnJheVJlZjxUPiBtYWtlQXJyYXlSZWYoY29uc3QgVCAmT25lRWx0KSB7CisgICAgcmV0dXJuIE9uZUVsdDsKKyAgfQorCisgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIHBvaW50ZXIgYW5kIGxlbmd0aC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgQXJyYXlSZWY8VD4gbWFrZUFycmF5UmVmKGNvbnN0IFQgKmRhdGEsIHNpemVfdCBsZW5ndGgpIHsKKyAgICByZXR1cm4gQXJyYXlSZWY8VD4oZGF0YSwgbGVuZ3RoKTsKKyAgfQorCisgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIHJhbmdlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBBcnJheVJlZjxUPiBtYWtlQXJyYXlSZWYoY29uc3QgVCAqYmVnaW4sIGNvbnN0IFQgKmVuZCkgeworICAgIHJldHVybiBBcnJheVJlZjxUPihiZWdpbiwgZW5kKTsKKyAgfQorCisgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIFNtYWxsVmVjdG9yLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgQXJyYXlSZWY8VD4gbWFrZUFycmF5UmVmKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxUPiAmVmVjKSB7CisgICAgcmV0dXJuIFZlYzsKKyAgfQorCisgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhIFNtYWxsVmVjdG9yLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdW5zaWduZWQgTj4KKyAgQXJyYXlSZWY8VD4gbWFrZUFycmF5UmVmKGNvbnN0IFNtYWxsVmVjdG9yPFQsIE4+ICZWZWMpIHsKKyAgICByZXR1cm4gVmVjOworICB9CisKKyAgLy8vIENvbnN0cnVjdCBhbiBBcnJheVJlZiBmcm9tIGEgc3RkOjp2ZWN0b3IuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIEFycmF5UmVmPFQ+IG1ha2VBcnJheVJlZihjb25zdCBzdGQ6OnZlY3RvcjxUPiAmVmVjKSB7CisgICAgcmV0dXJuIFZlYzsKKyAgfQorCisgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhbiBBcnJheVJlZiAobm8tb3ApIChjb25zdCkKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEFycmF5UmVmPFQ+IG1ha2VBcnJheVJlZihjb25zdCBBcnJheVJlZjxUPiAmVmVjKSB7CisgICAgcmV0dXJuIFZlYzsKKyAgfQorCisgIC8vLyBDb25zdHJ1Y3QgYW4gQXJyYXlSZWYgZnJvbSBhbiBBcnJheVJlZiAobm8tb3ApCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBBcnJheVJlZjxUPiAmbWFrZUFycmF5UmVmKEFycmF5UmVmPFQ+ICZWZWMpIHsKKyAgICByZXR1cm4gVmVjOworICB9CisKKyAgLy8vIENvbnN0cnVjdCBhbiBBcnJheVJlZiBmcm9tIGEgQyBhcnJheS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IE4+CisgIEFycmF5UmVmPFQ+IG1ha2VBcnJheVJlZihjb25zdCBUICgmQXJyKVtOXSkgeworICAgIHJldHVybiBBcnJheVJlZjxUPihBcnIpOworICB9CisKKyAgLy8vIENvbnN0cnVjdCBhIE11dGFibGVBcnJheVJlZiBmcm9tIGEgc2luZ2xlIGVsZW1lbnQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIE11dGFibGVBcnJheVJlZjxUPiBtYWtlTXV0YWJsZUFycmF5UmVmKFQgJk9uZUVsdCkgeworICAgIHJldHVybiBPbmVFbHQ7CisgIH0KKworICAvLy8gQ29uc3RydWN0IGEgTXV0YWJsZUFycmF5UmVmIGZyb20gYSBwb2ludGVyIGFuZCBsZW5ndGguCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIE11dGFibGVBcnJheVJlZjxUPiBtYWtlTXV0YWJsZUFycmF5UmVmKFQgKmRhdGEsIHNpemVfdCBsZW5ndGgpIHsKKyAgICByZXR1cm4gTXV0YWJsZUFycmF5UmVmPFQ+KGRhdGEsIGxlbmd0aCk7CisgIH0KKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIEFycmF5UmVmIENvbXBhcmlzb24gT3BlcmF0b3JzCisgIC8vLyBAeworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oQXJyYXlSZWY8VD4gTEhTLCBBcnJheVJlZjxUPiBSSFMpIHsKKyAgICByZXR1cm4gTEhTLmVxdWFscyhSSFMpOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShBcnJheVJlZjxUPiBMSFMsIEFycmF5UmVmPFQ+IFJIUykgeworICAgIHJldHVybiAhKExIUyA9PSBSSFMpOworICB9CisKKyAgLy8vIEB9CisKKyAgLy8gQXJyYXlSZWZzIGNhbiBiZSB0cmVhdGVkIGxpa2UgYSBQT0QgdHlwZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBpc1BvZExpa2U7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNQb2RMaWtlPEFycmF5UmVmPFQ+PiB7CisgICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBoYXNoX2NvZGUgaGFzaF92YWx1ZShBcnJheVJlZjxUPiBTKSB7CisgICAgcmV0dXJuIGhhc2hfY29tYmluZV9yYW5nZShTLmJlZ2luKCksIFMuZW5kKCkpOworICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9BUlJBWVJFRl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9CaXRWZWN0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0JpdFZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNGMyYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9CaXRWZWN0b3IuaApAQCAtMCwwICsxLDkyOSBAQAorLy89PT0tIGxsdm0vQURUL0JpdFZlY3Rvci5oIC0gQml0IHZlY3RvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgQml0VmVjdG9yIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfQklUVkVDVE9SX0gKKyNkZWZpbmUgTExWTV9BRFRfQklUVkVDVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gRm9yd2FyZEl0ZXJhdG9yIGZvciB0aGUgYml0cyB0aGF0IGFyZSBzZXQuCisvLy8gSXRlcmF0b3JzIGdldCBpbnZhbGlkYXRlZCB3aGVuIHJlc2l6ZSAvIHJlc2VydmUgaXMgY2FsbGVkLgordGVtcGxhdGUgPHR5cGVuYW1lIEJpdFZlY3RvclQ+IGNsYXNzIGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yX2ltcGwgeworICBjb25zdCBCaXRWZWN0b3JUICZQYXJlbnQ7CisgIGludCBDdXJyZW50ID0gMDsKKworICB2b2lkIGFkdmFuY2UoKSB7CisgICAgYXNzZXJ0KEN1cnJlbnQgIT0gLTEgJiYgIlRyeWluZyB0byBhZHZhbmNlIHBhc3QgZW5kLiIpOworICAgIEN1cnJlbnQgPSBQYXJlbnQuZmluZF9uZXh0KEN1cnJlbnQpOworICB9CisKK3B1YmxpYzoKKyAgY29uc3Rfc2V0X2JpdHNfaXRlcmF0b3JfaW1wbChjb25zdCBCaXRWZWN0b3JUICZQYXJlbnQsIGludCBDdXJyZW50KQorICAgICAgOiBQYXJlbnQoUGFyZW50KSwgQ3VycmVudChDdXJyZW50KSB7fQorICBleHBsaWNpdCBjb25zdF9zZXRfYml0c19pdGVyYXRvcl9pbXBsKGNvbnN0IEJpdFZlY3RvclQgJlBhcmVudCkKKyAgICAgIDogY29uc3Rfc2V0X2JpdHNfaXRlcmF0b3JfaW1wbChQYXJlbnQsIFBhcmVudC5maW5kX2ZpcnN0KCkpIHt9CisgIGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yX2ltcGwoY29uc3QgY29uc3Rfc2V0X2JpdHNfaXRlcmF0b3JfaW1wbCAmKSA9IGRlZmF1bHQ7CisKKyAgY29uc3Rfc2V0X2JpdHNfaXRlcmF0b3JfaW1wbCBvcGVyYXRvcisrKGludCkgeworICAgIGF1dG8gUHJldiA9ICp0aGlzOworICAgIGFkdmFuY2UoKTsKKyAgICByZXR1cm4gUHJldjsKKyAgfQorCisgIGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yX2ltcGwgJm9wZXJhdG9yKysoKSB7CisgICAgYWR2YW5jZSgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHVuc2lnbmVkIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIEN1cnJlbnQ7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgY29uc3Rfc2V0X2JpdHNfaXRlcmF0b3JfaW1wbCAmT3RoZXIpIGNvbnN0IHsKKyAgICBhc3NlcnQoJlBhcmVudCA9PSAmT3RoZXIuUGFyZW50ICYmCisgICAgICAgICAgICJDb21wYXJpbmcgaXRlcmF0b3JzIGZyb20gZGlmZmVyZW50IEJpdFZlY3RvcnMiKTsKKyAgICByZXR1cm4gQ3VycmVudCA9PSBPdGhlci5DdXJyZW50OworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yX2ltcGwgJk90aGVyKSBjb25zdCB7CisgICAgYXNzZXJ0KCZQYXJlbnQgPT0gJk90aGVyLlBhcmVudCAmJgorICAgICAgICAgICAiQ29tcGFyaW5nIGl0ZXJhdG9ycyBmcm9tIGRpZmZlcmVudCBCaXRWZWN0b3JzIik7CisgICAgcmV0dXJuIEN1cnJlbnQgIT0gT3RoZXIuQ3VycmVudDsKKyAgfQorfTsKKworY2xhc3MgQml0VmVjdG9yIHsKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIEJpdFdvcmQ7CisKKyAgZW51bSB7IEJJVFdPUkRfU0laRSA9ICh1bnNpZ25lZClzaXplb2YoQml0V29yZCkgKiBDSEFSX0JJVCB9OworCisgIHN0YXRpY19hc3NlcnQoQklUV09SRF9TSVpFID09IDY0IHx8IEJJVFdPUkRfU0laRSA9PSAzMiwKKyAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgd29yZCBzaXplIik7CisKKyAgTXV0YWJsZUFycmF5UmVmPEJpdFdvcmQ+IEJpdHM7IC8vIEFjdHVhbCBiaXRzLgorICB1bnNpZ25lZCBTaXplOyAgICAgICAgICAgICAgICAgLy8gU2l6ZSBvZiBiaXR2ZWN0b3IgaW4gYml0cy4KKworcHVibGljOgorICB0eXBlZGVmIHVuc2lnbmVkIHNpemVfdHlwZTsKKyAgLy8gRW5jYXBzdWxhdGlvbiBvZiBhIHNpbmdsZSBiaXQuCisgIGNsYXNzIHJlZmVyZW5jZSB7CisgICAgZnJpZW5kIGNsYXNzIEJpdFZlY3RvcjsKKworICAgIEJpdFdvcmQgKldvcmRSZWY7CisgICAgdW5zaWduZWQgQml0UG9zOworCisgIHB1YmxpYzoKKyAgICByZWZlcmVuY2UoQml0VmVjdG9yICZiLCB1bnNpZ25lZCBJZHgpIHsKKyAgICAgIFdvcmRSZWYgPSAmYi5CaXRzW0lkeCAvIEJJVFdPUkRfU0laRV07CisgICAgICBCaXRQb3MgPSBJZHggJSBCSVRXT1JEX1NJWkU7CisgICAgfQorCisgICAgcmVmZXJlbmNlKCkgPSBkZWxldGU7CisgICAgcmVmZXJlbmNlKGNvbnN0IHJlZmVyZW5jZSYpID0gZGVmYXVsdDsKKworICAgIHJlZmVyZW5jZSAmb3BlcmF0b3I9KHJlZmVyZW5jZSB0KSB7CisgICAgICAqdGhpcyA9IGJvb2wodCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgcmVmZXJlbmNlJiBvcGVyYXRvcj0oYm9vbCB0KSB7CisgICAgICBpZiAodCkKKyAgICAgICAgKldvcmRSZWYgfD0gQml0V29yZCgxKSA8PCBCaXRQb3M7CisgICAgICBlbHNlCisgICAgICAgICpXb3JkUmVmICY9IH4oQml0V29yZCgxKSA8PCBCaXRQb3MpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgICByZXR1cm4gKCgqV29yZFJlZikgJiAoQml0V29yZCgxKSA8PCBCaXRQb3MpKSAhPSAwOworICAgIH0KKyAgfTsKKworICB0eXBlZGVmIGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yX2ltcGw8Qml0VmVjdG9yPiBjb25zdF9zZXRfYml0c19pdGVyYXRvcjsKKyAgdHlwZWRlZiBjb25zdF9zZXRfYml0c19pdGVyYXRvciBzZXRfaXRlcmF0b3I7CisKKyAgY29uc3Rfc2V0X2JpdHNfaXRlcmF0b3Igc2V0X2JpdHNfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yKCp0aGlzKTsKKyAgfQorICBjb25zdF9zZXRfYml0c19pdGVyYXRvciBzZXRfYml0c19lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yKCp0aGlzLCAtMSk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3Rfc2V0X2JpdHNfaXRlcmF0b3I+IHNldF9iaXRzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHNldF9iaXRzX2JlZ2luKCksIHNldF9iaXRzX2VuZCgpKTsKKyAgfQorCisgIC8vLyBCaXRWZWN0b3IgZGVmYXVsdCBjdG9yIC0gQ3JlYXRlcyBhbiBlbXB0eSBiaXR2ZWN0b3IuCisgIEJpdFZlY3RvcigpIDogU2l6ZSgwKSB7fQorCisgIC8vLyBCaXRWZWN0b3IgY3RvciAtIENyZWF0ZXMgYSBiaXR2ZWN0b3Igb2Ygc3BlY2lmaWVkIG51bWJlciBvZiBiaXRzLiBBbGwKKyAgLy8vIGJpdHMgYXJlIGluaXRpYWxpemVkIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgIGV4cGxpY2l0IEJpdFZlY3Rvcih1bnNpZ25lZCBzLCBib29sIHQgPSBmYWxzZSkgOiBTaXplKHMpIHsKKyAgICBzaXplX3QgQ2FwYWNpdHkgPSBOdW1CaXRXb3JkcyhzKTsKKyAgICBCaXRzID0gYWxsb2NhdGUoQ2FwYWNpdHkpOworICAgIGluaXRfd29yZHMoQml0cywgdCk7CisgICAgaWYgKHQpCisgICAgICBjbGVhcl91bnVzZWRfYml0cygpOworICB9CisKKyAgLy8vIEJpdFZlY3RvciBjb3B5IGN0b3IuCisgIEJpdFZlY3Rvcihjb25zdCBCaXRWZWN0b3IgJlJIUykgOiBTaXplKFJIUy5zaXplKCkpIHsKKyAgICBpZiAoU2l6ZSA9PSAwKSB7CisgICAgICBCaXRzID0gTXV0YWJsZUFycmF5UmVmPEJpdFdvcmQ+KCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IENhcGFjaXR5ID0gTnVtQml0V29yZHMoUkhTLnNpemUoKSk7CisgICAgQml0cyA9IGFsbG9jYXRlKENhcGFjaXR5KTsKKyAgICBzdGQ6Om1lbWNweShCaXRzLmRhdGEoKSwgUkhTLkJpdHMuZGF0YSgpLCBDYXBhY2l0eSAqIHNpemVvZihCaXRXb3JkKSk7CisgIH0KKworICBCaXRWZWN0b3IoQml0VmVjdG9yICYmUkhTKSA6IEJpdHMoUkhTLkJpdHMpLCBTaXplKFJIUy5TaXplKSB7CisgICAgUkhTLkJpdHMgPSBNdXRhYmxlQXJyYXlSZWY8Qml0V29yZD4oKTsKKyAgICBSSFMuU2l6ZSA9IDA7CisgIH0KKworICB+Qml0VmVjdG9yKCkgeyBzdGQ6OmZyZWUoQml0cy5kYXRhKCkpOyB9CisKKyAgLy8vIGVtcHR5IC0gVGVzdHMgd2hldGhlciB0aGVyZSBhcmUgbm8gYml0cyBpbiB0aGlzIGJpdHZlY3Rvci4KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFNpemUgPT0gMDsgfQorCisgIC8vLyBzaXplIC0gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhpcyBiaXR2ZWN0b3IuCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gU2l6ZTsgfQorCisgIC8vLyBjb3VudCAtIFJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIHdoaWNoIGFyZSBzZXQuCisgIHNpemVfdHlwZSBjb3VudCgpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBOdW1CaXRzID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtQml0V29yZHMoc2l6ZSgpKTsgKytpKQorICAgICAgTnVtQml0cyArPSBjb3VudFBvcHVsYXRpb24oQml0c1tpXSk7CisgICAgcmV0dXJuIE51bUJpdHM7CisgIH0KKworICAvLy8gYW55IC0gUmV0dXJucyB0cnVlIGlmIGFueSBiaXQgaXMgc2V0LgorICBib29sIGFueSgpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtQml0V29yZHMoc2l6ZSgpKTsgKytpKQorICAgICAgaWYgKEJpdHNbaV0gIT0gMCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIGFsbCAtIFJldHVybnMgdHJ1ZSBpZiBhbGwgYml0cyBhcmUgc2V0LgorICBib29sIGFsbCgpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgU2l6ZSAvIEJJVFdPUkRfU0laRTsgKytpKQorICAgICAgaWYgKEJpdHNbaV0gIT0gfjBVTCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSWYgYml0cyByZW1haW4gY2hlY2sgdGhhdCB0aGV5IGFyZSBvbmVzLiBUaGUgdW51c2VkIGJpdHMgYXJlIGFsd2F5cyB6ZXJvLgorICAgIGlmICh1bnNpZ25lZCBSZW1haW5kZXIgPSBTaXplICUgQklUV09SRF9TSVpFKQorICAgICAgcmV0dXJuIEJpdHNbU2l6ZSAvIEJJVFdPUkRfU0laRV0gPT0gKDFVTCA8PCBSZW1haW5kZXIpIC0gMTsKKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIG5vbmUgLSBSZXR1cm5zIHRydWUgaWYgbm9uZSBvZiB0aGUgYml0cyBhcmUgc2V0LgorICBib29sIG5vbmUoKSBjb25zdCB7CisgICAgcmV0dXJuICFhbnkoKTsKKyAgfQorCisgIC8vLyBmaW5kX2ZpcnN0X2luIC0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHNldCBiaXQgaW4gdGhlIHJhbmdlCisgIC8vLyBbQmVnaW4sIEVuZCkuICBSZXR1cm5zIC0xIGlmIGFsbCBiaXRzIGluIHRoZSByYW5nZSBhcmUgdW5zZXQuCisgIGludCBmaW5kX2ZpcnN0X2luKHVuc2lnbmVkIEJlZ2luLCB1bnNpZ25lZCBFbmQpIGNvbnN0IHsKKyAgICBhc3NlcnQoQmVnaW4gPD0gRW5kICYmIEVuZCA8PSBTaXplKTsKKyAgICBpZiAoQmVnaW4gPT0gRW5kKQorICAgICAgcmV0dXJuIC0xOworCisgICAgdW5zaWduZWQgRmlyc3RXb3JkID0gQmVnaW4gLyBCSVRXT1JEX1NJWkU7CisgICAgdW5zaWduZWQgTGFzdFdvcmQgPSAoRW5kIC0gMSkgLyBCSVRXT1JEX1NJWkU7CisKKyAgICAvLyBDaGVjayBzdWJzZXF1ZW50IHdvcmRzLgorICAgIGZvciAodW5zaWduZWQgaSA9IEZpcnN0V29yZDsgaSA8PSBMYXN0V29yZDsgKytpKSB7CisgICAgICBCaXRXb3JkIENvcHkgPSBCaXRzW2ldOworCisgICAgICBpZiAoaSA9PSBGaXJzdFdvcmQpIHsKKyAgICAgICAgdW5zaWduZWQgRmlyc3RCaXQgPSBCZWdpbiAlIEJJVFdPUkRfU0laRTsKKyAgICAgICAgQ29weSAmPSBtYXNrVHJhaWxpbmdaZXJvczxCaXRXb3JkPihGaXJzdEJpdCk7CisgICAgICB9CisKKyAgICAgIGlmIChpID09IExhc3RXb3JkKSB7CisgICAgICAgIHVuc2lnbmVkIExhc3RCaXQgPSAoRW5kIC0gMSkgJSBCSVRXT1JEX1NJWkU7CisgICAgICAgIENvcHkgJj0gbWFza1RyYWlsaW5nT25lczxCaXRXb3JkPihMYXN0Qml0ICsgMSk7CisgICAgICB9CisgICAgICBpZiAoQ29weSAhPSAwKQorICAgICAgICByZXR1cm4gaSAqIEJJVFdPUkRfU0laRSArIGNvdW50VHJhaWxpbmdaZXJvcyhDb3B5KTsKKyAgICB9CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLy8vIGZpbmRfbGFzdF9pbiAtIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHNldCBiaXQgaW4gdGhlIHJhbmdlCisgIC8vLyBbQmVnaW4sIEVuZCkuICBSZXR1cm5zIC0xIGlmIGFsbCBiaXRzIGluIHRoZSByYW5nZSBhcmUgdW5zZXQuCisgIGludCBmaW5kX2xhc3RfaW4odW5zaWduZWQgQmVnaW4sIHVuc2lnbmVkIEVuZCkgY29uc3QgeworICAgIGFzc2VydChCZWdpbiA8PSBFbmQgJiYgRW5kIDw9IFNpemUpOworICAgIGlmIChCZWdpbiA9PSBFbmQpCisgICAgICByZXR1cm4gLTE7CisKKyAgICB1bnNpZ25lZCBMYXN0V29yZCA9IChFbmQgLSAxKSAvIEJJVFdPUkRfU0laRTsKKyAgICB1bnNpZ25lZCBGaXJzdFdvcmQgPSBCZWdpbiAvIEJJVFdPUkRfU0laRTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IExhc3RXb3JkICsgMTsgaSA+PSBGaXJzdFdvcmQgKyAxOyAtLWkpIHsKKyAgICAgIHVuc2lnbmVkIEN1cnJlbnRXb3JkID0gaSAtIDE7CisKKyAgICAgIEJpdFdvcmQgQ29weSA9IEJpdHNbQ3VycmVudFdvcmRdOworICAgICAgaWYgKEN1cnJlbnRXb3JkID09IExhc3RXb3JkKSB7CisgICAgICAgIHVuc2lnbmVkIExhc3RCaXQgPSAoRW5kIC0gMSkgJSBCSVRXT1JEX1NJWkU7CisgICAgICAgIENvcHkgJj0gbWFza1RyYWlsaW5nT25lczxCaXRXb3JkPihMYXN0Qml0ICsgMSk7CisgICAgICB9CisKKyAgICAgIGlmIChDdXJyZW50V29yZCA9PSBGaXJzdFdvcmQpIHsKKyAgICAgICAgdW5zaWduZWQgRmlyc3RCaXQgPSBCZWdpbiAlIEJJVFdPUkRfU0laRTsKKyAgICAgICAgQ29weSAmPSBtYXNrVHJhaWxpbmdaZXJvczxCaXRXb3JkPihGaXJzdEJpdCk7CisgICAgICB9CisKKyAgICAgIGlmIChDb3B5ICE9IDApCisgICAgICAgIHJldHVybiAoQ3VycmVudFdvcmQgKyAxKSAqIEJJVFdPUkRfU0laRSAtIGNvdW50TGVhZGluZ1plcm9zKENvcHkpIC0gMTsKKyAgICB9CisKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvLy8gZmluZF9maXJzdF91bnNldF9pbiAtIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCB1bnNldCBiaXQgaW4gdGhlCisgIC8vLyByYW5nZSBbQmVnaW4sIEVuZCkuICBSZXR1cm5zIC0xIGlmIGFsbCBiaXRzIGluIHRoZSByYW5nZSBhcmUgc2V0LgorICBpbnQgZmluZF9maXJzdF91bnNldF9pbih1bnNpZ25lZCBCZWdpbiwgdW5zaWduZWQgRW5kKSBjb25zdCB7CisgICAgYXNzZXJ0KEJlZ2luIDw9IEVuZCAmJiBFbmQgPD0gU2l6ZSk7CisgICAgaWYgKEJlZ2luID09IEVuZCkKKyAgICAgIHJldHVybiAtMTsKKworICAgIHVuc2lnbmVkIEZpcnN0V29yZCA9IEJlZ2luIC8gQklUV09SRF9TSVpFOworICAgIHVuc2lnbmVkIExhc3RXb3JkID0gKEVuZCAtIDEpIC8gQklUV09SRF9TSVpFOworCisgICAgLy8gQ2hlY2sgc3Vic2VxdWVudCB3b3Jkcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBGaXJzdFdvcmQ7IGkgPD0gTGFzdFdvcmQ7ICsraSkgeworICAgICAgQml0V29yZCBDb3B5ID0gQml0c1tpXTsKKworICAgICAgaWYgKGkgPT0gRmlyc3RXb3JkKSB7CisgICAgICAgIHVuc2lnbmVkIEZpcnN0Qml0ID0gQmVnaW4gJSBCSVRXT1JEX1NJWkU7CisgICAgICAgIENvcHkgfD0gbWFza1RyYWlsaW5nT25lczxCaXRXb3JkPihGaXJzdEJpdCk7CisgICAgICB9CisKKyAgICAgIGlmIChpID09IExhc3RXb3JkKSB7CisgICAgICAgIHVuc2lnbmVkIExhc3RCaXQgPSAoRW5kIC0gMSkgJSBCSVRXT1JEX1NJWkU7CisgICAgICAgIENvcHkgfD0gbWFza1RyYWlsaW5nWmVyb3M8Qml0V29yZD4oTGFzdEJpdCArIDEpOworICAgICAgfQorICAgICAgaWYgKENvcHkgIT0gfjBVTCkgeworICAgICAgICB1bnNpZ25lZCBSZXN1bHQgPSBpICogQklUV09SRF9TSVpFICsgY291bnRUcmFpbGluZ09uZXMoQ29weSk7CisgICAgICAgIHJldHVybiBSZXN1bHQgPCBzaXplKCkgPyBSZXN1bHQgOiAtMTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLy8vIGZpbmRfbGFzdF91bnNldF9pbiAtIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHVuc2V0IGJpdCBpbiB0aGUKKyAgLy8vIHJhbmdlIFtCZWdpbiwgRW5kKS4gIFJldHVybnMgLTEgaWYgYWxsIGJpdHMgaW4gdGhlIHJhbmdlIGFyZSBzZXQuCisgIGludCBmaW5kX2xhc3RfdW5zZXRfaW4odW5zaWduZWQgQmVnaW4sIHVuc2lnbmVkIEVuZCkgY29uc3QgeworICAgIGFzc2VydChCZWdpbiA8PSBFbmQgJiYgRW5kIDw9IFNpemUpOworICAgIGlmIChCZWdpbiA9PSBFbmQpCisgICAgICByZXR1cm4gLTE7CisKKyAgICB1bnNpZ25lZCBMYXN0V29yZCA9IChFbmQgLSAxKSAvIEJJVFdPUkRfU0laRTsKKyAgICB1bnNpZ25lZCBGaXJzdFdvcmQgPSBCZWdpbiAvIEJJVFdPUkRfU0laRTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IExhc3RXb3JkICsgMTsgaSA+PSBGaXJzdFdvcmQgKyAxOyAtLWkpIHsKKyAgICAgIHVuc2lnbmVkIEN1cnJlbnRXb3JkID0gaSAtIDE7CisKKyAgICAgIEJpdFdvcmQgQ29weSA9IEJpdHNbQ3VycmVudFdvcmRdOworICAgICAgaWYgKEN1cnJlbnRXb3JkID09IExhc3RXb3JkKSB7CisgICAgICAgIHVuc2lnbmVkIExhc3RCaXQgPSAoRW5kIC0gMSkgJSBCSVRXT1JEX1NJWkU7CisgICAgICAgIENvcHkgfD0gbWFza1RyYWlsaW5nWmVyb3M8Qml0V29yZD4oTGFzdEJpdCArIDEpOworICAgICAgfQorCisgICAgICBpZiAoQ3VycmVudFdvcmQgPT0gRmlyc3RXb3JkKSB7CisgICAgICAgIHVuc2lnbmVkIEZpcnN0Qml0ID0gQmVnaW4gJSBCSVRXT1JEX1NJWkU7CisgICAgICAgIENvcHkgfD0gbWFza1RyYWlsaW5nT25lczxCaXRXb3JkPihGaXJzdEJpdCk7CisgICAgICB9CisKKyAgICAgIGlmIChDb3B5ICE9IH4wVUwpIHsKKyAgICAgICAgdW5zaWduZWQgUmVzdWx0ID0KKyAgICAgICAgICAgIChDdXJyZW50V29yZCArIDEpICogQklUV09SRF9TSVpFIC0gY291bnRMZWFkaW5nT25lcyhDb3B5KSAtIDE7CisgICAgICAgIHJldHVybiBSZXN1bHQgPCBTaXplID8gUmVzdWx0IDogLTE7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vLyBmaW5kX2ZpcnN0IC0gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IHNldCBiaXQsIC0xIGlmIG5vbmUKKyAgLy8vIG9mIHRoZSBiaXRzIGFyZSBzZXQuCisgIGludCBmaW5kX2ZpcnN0KCkgY29uc3QgeyByZXR1cm4gZmluZF9maXJzdF9pbigwLCBTaXplKTsgfQorCisgIC8vLyBmaW5kX2xhc3QgLSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzZXQgYml0LCAtMSBpZiBub25lIG9mIHRoZSBiaXRzCisgIC8vLyBhcmUgc2V0LgorICBpbnQgZmluZF9sYXN0KCkgY29uc3QgeyByZXR1cm4gZmluZF9sYXN0X2luKDAsIFNpemUpOyB9CisKKyAgLy8vIGZpbmRfbmV4dCAtIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBuZXh0IHNldCBiaXQgZm9sbG93aW5nIHRoZQorICAvLy8gIlByZXYiIGJpdC4gUmV0dXJucyAtMSBpZiB0aGUgbmV4dCBzZXQgYml0IGlzIG5vdCBmb3VuZC4KKyAgaW50IGZpbmRfbmV4dCh1bnNpZ25lZCBQcmV2KSBjb25zdCB7IHJldHVybiBmaW5kX2ZpcnN0X2luKFByZXYgKyAxLCBTaXplKTsgfQorCisgIC8vLyBmaW5kX3ByZXYgLSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgc2V0IGJpdCB0aGF0IHByZWNlZGVzIHRoZQorICAvLy8gdGhlIGJpdCBhdCBccCBQcmlvclRvLiAgUmV0dXJucyAtMSBpZiBhbGwgcHJldmlvdXMgYml0cyBhcmUgdW5zZXQuCisgIGludCBmaW5kX3ByZXYodW5zaWduZWQgUHJpb3JUbykgY29uc3QgeyByZXR1cm4gZmluZF9sYXN0X2luKDAsIFByaW9yVG8pOyB9CisKKyAgLy8vIGZpbmRfZmlyc3RfdW5zZXQgLSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5zZXQgYml0LCAtMSBpZiBhbGwKKyAgLy8vIG9mIHRoZSBiaXRzIGFyZSBzZXQuCisgIGludCBmaW5kX2ZpcnN0X3Vuc2V0KCkgY29uc3QgeyByZXR1cm4gZmluZF9maXJzdF91bnNldF9pbigwLCBTaXplKTsgfQorCisgIC8vLyBmaW5kX25leHRfdW5zZXQgLSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV4dCB1bnNldCBiaXQgZm9sbG93aW5nIHRoZQorICAvLy8gIlByZXYiIGJpdC4gIFJldHVybnMgLTEgaWYgYWxsIHJlbWFpbmluZyBiaXRzIGFyZSBzZXQuCisgIGludCBmaW5kX25leHRfdW5zZXQodW5zaWduZWQgUHJldikgY29uc3QgeworICAgIHJldHVybiBmaW5kX2ZpcnN0X3Vuc2V0X2luKFByZXYgKyAxLCBTaXplKTsKKyAgfQorCisgIC8vLyBmaW5kX2xhc3RfdW5zZXQgLSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCB1bnNldCBiaXQsIC0xIGlmIGFsbCBvZgorICAvLy8gdGhlIGJpdHMgYXJlIHNldC4KKyAgaW50IGZpbmRfbGFzdF91bnNldCgpIGNvbnN0IHsgcmV0dXJuIGZpbmRfbGFzdF91bnNldF9pbigwLCBTaXplKTsgfQorCisgIC8vLyBmaW5kX3ByZXZfdW5zZXQgLSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgdW5zZXQgYml0IHRoYXQgcHJlY2VkZXMKKyAgLy8vIHRoZSBiaXQgYXQgXHAgUHJpb3JUby4gIFJldHVybnMgLTEgaWYgYWxsIHByZXZpb3VzIGJpdHMgYXJlIHNldC4KKyAgaW50IGZpbmRfcHJldl91bnNldCh1bnNpZ25lZCBQcmlvclRvKSB7CisgICAgcmV0dXJuIGZpbmRfbGFzdF91bnNldF9pbigwLCBQcmlvclRvKTsKKyAgfQorCisgIC8vLyBjbGVhciAtIFJlbW92ZXMgYWxsIGJpdHMgZnJvbSB0aGUgYml0dmVjdG9yLiBEb2VzIG5vdCBjaGFuZ2UgY2FwYWNpdHkuCisgIHZvaWQgY2xlYXIoKSB7CisgICAgU2l6ZSA9IDA7CisgIH0KKworICAvLy8gcmVzaXplIC0gR3JvdyBvciBzaHJpbmsgdGhlIGJpdHZlY3Rvci4KKyAgdm9pZCByZXNpemUodW5zaWduZWQgTiwgYm9vbCB0ID0gZmFsc2UpIHsKKyAgICBpZiAoTiA+IGdldEJpdENhcGFjaXR5KCkpIHsKKyAgICAgIHVuc2lnbmVkIE9sZENhcGFjaXR5ID0gQml0cy5zaXplKCk7CisgICAgICBncm93KE4pOworICAgICAgaW5pdF93b3JkcyhCaXRzLmRyb3BfZnJvbnQoT2xkQ2FwYWNpdHkpLCB0KTsKKyAgICB9CisKKyAgICAvLyBTZXQgYW55IG9sZCB1bnVzZWQgYml0cyB0aGF0IGFyZSBub3cgaW5jbHVkZWQgaW4gdGhlIEJpdFZlY3Rvci4gVGhpcworICAgIC8vIG1heSBzZXQgYml0cyB0aGF0IGFyZSBub3QgaW5jbHVkZWQgaW4gdGhlIG5ldyB2ZWN0b3IsIGJ1dCB3ZSB3aWxsIGNsZWFyCisgICAgLy8gdGhlbSBiYWNrIG91dCBiZWxvdy4KKyAgICBpZiAoTiA+IFNpemUpCisgICAgICBzZXRfdW51c2VkX2JpdHModCk7CisKKyAgICAvLyBVcGRhdGUgdGhlIHNpemUsIGFuZCBjbGVhciBvdXQgYW55IGJpdHMgdGhhdCBhcmUgbm93IHVudXNlZAorICAgIHVuc2lnbmVkIE9sZFNpemUgPSBTaXplOworICAgIFNpemUgPSBOOworICAgIGlmICh0IHx8IE4gPCBPbGRTaXplKQorICAgICAgY2xlYXJfdW51c2VkX2JpdHMoKTsKKyAgfQorCisgIHZvaWQgcmVzZXJ2ZSh1bnNpZ25lZCBOKSB7CisgICAgaWYgKE4gPiBnZXRCaXRDYXBhY2l0eSgpKQorICAgICAgZ3JvdyhOKTsKKyAgfQorCisgIC8vIFNldCwgcmVzZXQsIGZsaXAKKyAgQml0VmVjdG9yICZzZXQoKSB7CisgICAgaW5pdF93b3JkcyhCaXRzLCB0cnVlKTsKKyAgICBjbGVhcl91bnVzZWRfYml0cygpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEJpdFZlY3RvciAmc2V0KHVuc2lnbmVkIElkeCkgeworICAgIGFzc2VydChCaXRzLmRhdGEoKSAmJiAiQml0cyBuZXZlciBhbGxvY2F0ZWQiKTsKKyAgICBCaXRzW0lkeCAvIEJJVFdPUkRfU0laRV0gfD0gQml0V29yZCgxKSA8PCAoSWR4ICUgQklUV09SRF9TSVpFKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gc2V0IC0gRWZmaWNpZW50bHkgc2V0IGEgcmFuZ2Ugb2YgYml0cyBpbiBbSSwgRSkKKyAgQml0VmVjdG9yICZzZXQodW5zaWduZWQgSSwgdW5zaWduZWQgRSkgeworICAgIGFzc2VydChJIDw9IEUgJiYgIkF0dGVtcHRlZCB0byBzZXQgYmFja3dhcmRzIHJhbmdlISIpOworICAgIGFzc2VydChFIDw9IHNpemUoKSAmJiAiQXR0ZW1wdGVkIHRvIHNldCBvdXQtb2YtYm91bmRzIHJhbmdlISIpOworCisgICAgaWYgKEkgPT0gRSkgcmV0dXJuICp0aGlzOworCisgICAgaWYgKEkgLyBCSVRXT1JEX1NJWkUgPT0gRSAvIEJJVFdPUkRfU0laRSkgeworICAgICAgQml0V29yZCBFTWFzayA9IDFVTCA8PCAoRSAlIEJJVFdPUkRfU0laRSk7CisgICAgICBCaXRXb3JkIElNYXNrID0gMVVMIDw8IChJICUgQklUV09SRF9TSVpFKTsKKyAgICAgIEJpdFdvcmQgTWFzayA9IEVNYXNrIC0gSU1hc2s7CisgICAgICBCaXRzW0kgLyBCSVRXT1JEX1NJWkVdIHw9IE1hc2s7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQml0V29yZCBQcmVmaXhNYXNrID0gfjBVTCA8PCAoSSAlIEJJVFdPUkRfU0laRSk7CisgICAgQml0c1tJIC8gQklUV09SRF9TSVpFXSB8PSBQcmVmaXhNYXNrOworICAgIEkgPSBhbGlnblRvKEksIEJJVFdPUkRfU0laRSk7CisKKyAgICBmb3IgKDsgSSArIEJJVFdPUkRfU0laRSA8PSBFOyBJICs9IEJJVFdPUkRfU0laRSkKKyAgICAgIEJpdHNbSSAvIEJJVFdPUkRfU0laRV0gPSB+MFVMOworCisgICAgQml0V29yZCBQb3N0Zml4TWFzayA9ICgxVUwgPDwgKEUgJSBCSVRXT1JEX1NJWkUpKSAtIDE7CisgICAgaWYgKEkgPCBFKQorICAgICAgQml0c1tJIC8gQklUV09SRF9TSVpFXSB8PSBQb3N0Zml4TWFzazsKKworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEJpdFZlY3RvciAmcmVzZXQoKSB7CisgICAgaW5pdF93b3JkcyhCaXRzLCBmYWxzZSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQml0VmVjdG9yICZyZXNldCh1bnNpZ25lZCBJZHgpIHsKKyAgICBCaXRzW0lkeCAvIEJJVFdPUkRfU0laRV0gJj0gfihCaXRXb3JkKDEpIDw8IChJZHggJSBCSVRXT1JEX1NJWkUpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gcmVzZXQgLSBFZmZpY2llbnRseSByZXNldCBhIHJhbmdlIG9mIGJpdHMgaW4gW0ksIEUpCisgIEJpdFZlY3RvciAmcmVzZXQodW5zaWduZWQgSSwgdW5zaWduZWQgRSkgeworICAgIGFzc2VydChJIDw9IEUgJiYgIkF0dGVtcHRlZCB0byByZXNldCBiYWNrd2FyZHMgcmFuZ2UhIik7CisgICAgYXNzZXJ0KEUgPD0gc2l6ZSgpICYmICJBdHRlbXB0ZWQgdG8gcmVzZXQgb3V0LW9mLWJvdW5kcyByYW5nZSEiKTsKKworICAgIGlmIChJID09IEUpIHJldHVybiAqdGhpczsKKworICAgIGlmIChJIC8gQklUV09SRF9TSVpFID09IEUgLyBCSVRXT1JEX1NJWkUpIHsKKyAgICAgIEJpdFdvcmQgRU1hc2sgPSAxVUwgPDwgKEUgJSBCSVRXT1JEX1NJWkUpOworICAgICAgQml0V29yZCBJTWFzayA9IDFVTCA8PCAoSSAlIEJJVFdPUkRfU0laRSk7CisgICAgICBCaXRXb3JkIE1hc2sgPSBFTWFzayAtIElNYXNrOworICAgICAgQml0c1tJIC8gQklUV09SRF9TSVpFXSAmPSB+TWFzazsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBCaXRXb3JkIFByZWZpeE1hc2sgPSB+MFVMIDw8IChJICUgQklUV09SRF9TSVpFKTsKKyAgICBCaXRzW0kgLyBCSVRXT1JEX1NJWkVdICY9IH5QcmVmaXhNYXNrOworICAgIEkgPSBhbGlnblRvKEksIEJJVFdPUkRfU0laRSk7CisKKyAgICBmb3IgKDsgSSArIEJJVFdPUkRfU0laRSA8PSBFOyBJICs9IEJJVFdPUkRfU0laRSkKKyAgICAgIEJpdHNbSSAvIEJJVFdPUkRfU0laRV0gPSAwVUw7CisKKyAgICBCaXRXb3JkIFBvc3RmaXhNYXNrID0gKDFVTCA8PCAoRSAlIEJJVFdPUkRfU0laRSkpIC0gMTsKKyAgICBpZiAoSSA8IEUpCisgICAgICBCaXRzW0kgLyBCSVRXT1JEX1NJWkVdICY9IH5Qb3N0Zml4TWFzazsKKworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEJpdFZlY3RvciAmZmxpcCgpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtQml0V29yZHMoc2l6ZSgpKTsgKytpKQorICAgICAgQml0c1tpXSA9IH5CaXRzW2ldOworICAgIGNsZWFyX3VudXNlZF9iaXRzKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQml0VmVjdG9yICZmbGlwKHVuc2lnbmVkIElkeCkgeworICAgIEJpdHNbSWR4IC8gQklUV09SRF9TSVpFXSBePSBCaXRXb3JkKDEpIDw8IChJZHggJSBCSVRXT1JEX1NJWkUpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIEluZGV4aW5nLgorICByZWZlcmVuY2Ugb3BlcmF0b3JbXSh1bnNpZ25lZCBJZHgpIHsKKyAgICBhc3NlcnQgKElkeCA8IFNpemUgJiYgIk91dC1vZi1ib3VuZHMgQml0IGFjY2Vzcy4iKTsKKyAgICByZXR1cm4gcmVmZXJlbmNlKCp0aGlzLCBJZHgpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcltdKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIGFzc2VydCAoSWR4IDwgU2l6ZSAmJiAiT3V0LW9mLWJvdW5kcyBCaXQgYWNjZXNzLiIpOworICAgIEJpdFdvcmQgTWFzayA9IEJpdFdvcmQoMSkgPDwgKElkeCAlIEJJVFdPUkRfU0laRSk7CisgICAgcmV0dXJuIChCaXRzW0lkeCAvIEJJVFdPUkRfU0laRV0gJiBNYXNrKSAhPSAwOworICB9CisKKyAgYm9vbCB0ZXN0KHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIHJldHVybiAoKnRoaXMpW0lkeF07CisgIH0KKworICAvLy8gVGVzdCBpZiBhbnkgY29tbW9uIGJpdHMgYXJlIHNldC4KKyAgYm9vbCBhbnlDb21tb24oY29uc3QgQml0VmVjdG9yICZSSFMpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBUaGlzV29yZHMgPSBOdW1CaXRXb3JkcyhzaXplKCkpOworICAgIHVuc2lnbmVkIFJIU1dvcmRzICA9IE51bUJpdFdvcmRzKFJIUy5zaXplKCkpOworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBzdGQ6Om1pbihUaGlzV29yZHMsIFJIU1dvcmRzKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoQml0c1tpXSAmIFJIUy5CaXRzW2ldKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBDb21wYXJpc29uIG9wZXJhdG9ycy4KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEJpdFZlY3RvciAmUkhTKSBjb25zdCB7CisgICAgdW5zaWduZWQgVGhpc1dvcmRzID0gTnVtQml0V29yZHMoc2l6ZSgpKTsKKyAgICB1bnNpZ25lZCBSSFNXb3JkcyAgPSBOdW1CaXRXb3JkcyhSSFMuc2l6ZSgpKTsKKyAgICB1bnNpZ25lZCBpOworICAgIGZvciAoaSA9IDA7IGkgIT0gc3RkOjptaW4oVGhpc1dvcmRzLCBSSFNXb3Jkcyk7ICsraSkKKyAgICAgIGlmIChCaXRzW2ldICE9IFJIUy5CaXRzW2ldKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBWZXJpZnkgdGhhdCBhbnkgZXh0cmEgd29yZHMgYXJlIGFsbCB6ZXJvcy4KKyAgICBpZiAoaSAhPSBUaGlzV29yZHMpIHsKKyAgICAgIGZvciAoOyBpICE9IFRoaXNXb3JkczsgKytpKQorICAgICAgICBpZiAoQml0c1tpXSkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfSBlbHNlIGlmIChpICE9IFJIU1dvcmRzKSB7CisgICAgICBmb3IgKDsgaSAhPSBSSFNXb3JkczsgKytpKQorICAgICAgICBpZiAoUkhTLkJpdHNbaV0pCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBCaXRWZWN0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiAhKCp0aGlzID09IFJIUyk7CisgIH0KKworICAvLy8gSW50ZXJzZWN0aW9uLCB1bmlvbiwgZGlzam9pbnQgdW5pb24uCisgIEJpdFZlY3RvciAmb3BlcmF0b3ImPShjb25zdCBCaXRWZWN0b3IgJlJIUykgeworICAgIHVuc2lnbmVkIFRoaXNXb3JkcyA9IE51bUJpdFdvcmRzKHNpemUoKSk7CisgICAgdW5zaWduZWQgUkhTV29yZHMgID0gTnVtQml0V29yZHMoUkhTLnNpemUoKSk7CisgICAgdW5zaWduZWQgaTsKKyAgICBmb3IgKGkgPSAwOyBpICE9IHN0ZDo6bWluKFRoaXNXb3JkcywgUkhTV29yZHMpOyArK2kpCisgICAgICBCaXRzW2ldICY9IFJIUy5CaXRzW2ldOworCisgICAgLy8gQW55IGJpdHMgdGhhdCBhcmUganVzdCBpbiB0aGlzIGJpdHZlY3RvciBiZWNvbWUgemVybywgYmVjYXVzZSB0aGV5IGFyZW4ndAorICAgIC8vIGluIHRoZSBSSFMgYml0IHZlY3Rvci4gIEFueSB3b3JkcyBvbmx5IGluIFJIUyBhcmUgaWdub3JlZCBiZWNhdXNlIHRoZXkKKyAgICAvLyBhcmUgYWxyZWFkeSB6ZXJvIGluIHRoZSBMSFMuCisgICAgZm9yICg7IGkgIT0gVGhpc1dvcmRzOyArK2kpCisgICAgICBCaXRzW2ldID0gMDsKKworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyByZXNldCAtIFJlc2V0IGJpdHMgdGhhdCBhcmUgc2V0IGluIFJIUy4gU2FtZSBhcyAqdGhpcyAmPSB+UkhTLgorICBCaXRWZWN0b3IgJnJlc2V0KGNvbnN0IEJpdFZlY3RvciAmUkhTKSB7CisgICAgdW5zaWduZWQgVGhpc1dvcmRzID0gTnVtQml0V29yZHMoc2l6ZSgpKTsKKyAgICB1bnNpZ25lZCBSSFNXb3JkcyAgPSBOdW1CaXRXb3JkcyhSSFMuc2l6ZSgpKTsKKyAgICB1bnNpZ25lZCBpOworICAgIGZvciAoaSA9IDA7IGkgIT0gc3RkOjptaW4oVGhpc1dvcmRzLCBSSFNXb3Jkcyk7ICsraSkKKyAgICAgIEJpdHNbaV0gJj0gflJIUy5CaXRzW2ldOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyB0ZXN0IC0gQ2hlY2sgaWYgKFRoaXMgLSBSSFMpIGlzIHplcm8uCisgIC8vLyBUaGlzIGlzIHRoZSBzYW1lIGFzIHJlc2V0KFJIUykgYW5kIGFueSgpLgorICBib29sIHRlc3QoY29uc3QgQml0VmVjdG9yICZSSFMpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBUaGlzV29yZHMgPSBOdW1CaXRXb3JkcyhzaXplKCkpOworICAgIHVuc2lnbmVkIFJIU1dvcmRzICA9IE51bUJpdFdvcmRzKFJIUy5zaXplKCkpOworICAgIHVuc2lnbmVkIGk7CisgICAgZm9yIChpID0gMDsgaSAhPSBzdGQ6Om1pbihUaGlzV29yZHMsIFJIU1dvcmRzKTsgKytpKQorICAgICAgaWYgKChCaXRzW2ldICYgflJIUy5CaXRzW2ldKSAhPSAwKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGZvciAoOyBpICE9IFRoaXNXb3JkcyA7ICsraSkKKyAgICAgIGlmIChCaXRzW2ldICE9IDApCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQml0VmVjdG9yICZvcGVyYXRvcnw9KGNvbnN0IEJpdFZlY3RvciAmUkhTKSB7CisgICAgaWYgKHNpemUoKSA8IFJIUy5zaXplKCkpCisgICAgICByZXNpemUoUkhTLnNpemUoKSk7CisgICAgZm9yIChzaXplX3QgaSA9IDAsIGUgPSBOdW1CaXRXb3JkcyhSSFMuc2l6ZSgpKTsgaSAhPSBlOyArK2kpCisgICAgICBCaXRzW2ldIHw9IFJIUy5CaXRzW2ldOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEJpdFZlY3RvciAmb3BlcmF0b3JePShjb25zdCBCaXRWZWN0b3IgJlJIUykgeworICAgIGlmIChzaXplKCkgPCBSSFMuc2l6ZSgpKQorICAgICAgcmVzaXplKFJIUy5zaXplKCkpOworICAgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gTnVtQml0V29yZHMoUkhTLnNpemUoKSk7IGkgIT0gZTsgKytpKQorICAgICAgQml0c1tpXSBePSBSSFMuQml0c1tpXTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBCaXRWZWN0b3IgJm9wZXJhdG9yPj49KHVuc2lnbmVkIE4pIHsKKyAgICBhc3NlcnQoTiA8PSBTaXplKTsKKyAgICBpZiAoTExWTV9VTkxJS0VMWShlbXB0eSgpIHx8IE4gPT0gMCkpCisgICAgICByZXR1cm4gKnRoaXM7CisKKyAgICB1bnNpZ25lZCBOdW1Xb3JkcyA9IE51bUJpdFdvcmRzKFNpemUpOworICAgIGFzc2VydChOdW1Xb3JkcyA+PSAxKTsKKworICAgIHdvcmRTaHIoTiAvIEJJVFdPUkRfU0laRSk7CisKKyAgICB1bnNpZ25lZCBCaXREaXN0YW5jZSA9IE4gJSBCSVRXT1JEX1NJWkU7CisgICAgaWYgKEJpdERpc3RhbmNlID09IDApCisgICAgICByZXR1cm4gKnRoaXM7CisKKyAgICAvLyBXaGVuIHRoZSBzaGlmdCBzaXplIGlzIG5vdCBhIG11bHRpcGxlIG9mIHRoZSB3b3JkIHNpemUsIHRoZW4gd2UgaGF2ZQorICAgIC8vIGEgdHJpY2t5IHNpdHVhdGlvbiB3aGVyZSBlYWNoIHdvcmQgaW4gc3VjY2Vzc2lvbiBuZWVkcyB0byBleHRyYWN0IHNvbWUKKyAgICAvLyBvZiB0aGUgYml0cyBmcm9tIHRoZSBuZXh0IHdvcmQgYW5kIG9yIHRoZW0gaW50byB0aGlzIHdvcmQgd2hpbGUKKyAgICAvLyBzaGlmdGluZyB0aGlzIHdvcmQgdG8gbWFrZSByb29tIGZvciB0aGUgbmV3IGJpdHMuICBUaGlzIGhhcyB0byBiZSBkb25lCisgICAgLy8gZm9yIGV2ZXJ5IHdvcmQgaW4gdGhlIGFycmF5LgorCisgICAgLy8gU2luY2Ugd2UncmUgc2hpZnRpbmcgZWFjaCB3b3JkIHJpZ2h0LCBzb21lIGJpdHMgd2lsbCBmYWxsIG9mZiB0aGUgZW5kCisgICAgLy8gb2YgZWFjaCB3b3JkIHRvIHRoZSByaWdodCwgYW5kIGVtcHR5IHNwYWNlIHdpbGwgYmUgY3JlYXRlZCBvbiB0aGUgbGVmdC4KKyAgICAvLyBUaGUgZmluYWwgd29yZCBpbiB0aGUgYXJyYXkgd2lsbCBsb3NlIGJpdHMgcGVybWFuZW50bHksIHNvIHN0YXJ0aW5nIGF0CisgICAgLy8gdGhlIGJlZ2lubmluZywgd29yayBmb3J3YXJkcyBzaGlmdGluZyBlYWNoIHdvcmQgdG8gdGhlIHJpZ2h0LCBhbmQKKyAgICAvLyBPUidpbmcgaW4gdGhlIGJpdHMgZnJvbSB0aGUgZW5kIG9mIHRoZSBuZXh0IHdvcmQgdG8gdGhlIGJlZ2lubmluZyBvZgorICAgIC8vIHRoZSBjdXJyZW50IHdvcmQuCisKKyAgICAvLyBFeGFtcGxlOgorICAgIC8vICAgU3RhcnRpbmcgd2l0aCB7MHhBQUJCQ0NERCwgMHhFRUZGMDAxMSwgMHgyMjMzNDQ1NX0gYW5kIHNoaWZ0aW5nIHJpZ2h0CisgICAgLy8gICBieSA0IGJpdHMuCisgICAgLy8gU3RlcCAxOiBXb3JkWzBdID4+PSA0ICAgICAgICAgICA7IDB4MEFCQkNDREQKKyAgICAvLyBTdGVwIDI6IFdvcmRbMF0gfD0gMHgxMDAwMDAwMCAgIDsgMHgxQUJCQ0NERAorICAgIC8vIFN0ZXAgMzogV29yZFsxXSA+Pj0gNCAgICAgICAgICAgOyAweDBFRUZGMDAxCisgICAgLy8gU3RlcCA0OiBXb3JkWzFdIHw9IDB4NTAwMDAwMDAgICA7IDB4NUVFRkYwMDEKKyAgICAvLyBTdGVwIDU6IFdvcmRbMl0gPj49IDQgICAgICAgICAgIDsgMHgwMjMzNDQ1NQorICAgIC8vIFJlc3VsdDogeyAweDFBQkJDQ0RELCAweDVFRUZGMDAxLCAweDAyMzM0NDU1IH0KKyAgICBjb25zdCBCaXRXb3JkIE1hc2sgPSBtYXNrVHJhaWxpbmdPbmVzPEJpdFdvcmQ+KEJpdERpc3RhbmNlKTsKKyAgICBjb25zdCB1bnNpZ25lZCBMU0ggPSBCSVRXT1JEX1NJWkUgLSBCaXREaXN0YW5jZTsKKworICAgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgPCBOdW1Xb3JkcyAtIDE7ICsrSSkgeworICAgICAgQml0c1tJXSA+Pj0gQml0RGlzdGFuY2U7CisgICAgICBCaXRzW0ldIHw9IChCaXRzW0kgKyAxXSAmIE1hc2spIDw8IExTSDsKKyAgICB9CisKKyAgICBCaXRzW051bVdvcmRzIC0gMV0gPj49IEJpdERpc3RhbmNlOworCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQml0VmVjdG9yICZvcGVyYXRvcjw8PSh1bnNpZ25lZCBOKSB7CisgICAgYXNzZXJ0KE4gPD0gU2l6ZSk7CisgICAgaWYgKExMVk1fVU5MSUtFTFkoZW1wdHkoKSB8fCBOID09IDApKQorICAgICAgcmV0dXJuICp0aGlzOworCisgICAgdW5zaWduZWQgTnVtV29yZHMgPSBOdW1CaXRXb3JkcyhTaXplKTsKKyAgICBhc3NlcnQoTnVtV29yZHMgPj0gMSk7CisKKyAgICB3b3JkU2hsKE4gLyBCSVRXT1JEX1NJWkUpOworCisgICAgdW5zaWduZWQgQml0RGlzdGFuY2UgPSBOICUgQklUV09SRF9TSVpFOworICAgIGlmIChCaXREaXN0YW5jZSA9PSAwKQorICAgICAgcmV0dXJuICp0aGlzOworCisgICAgLy8gV2hlbiB0aGUgc2hpZnQgc2l6ZSBpcyBub3QgYSBtdWx0aXBsZSBvZiB0aGUgd29yZCBzaXplLCB0aGVuIHdlIGhhdmUKKyAgICAvLyBhIHRyaWNreSBzaXR1YXRpb24gd2hlcmUgZWFjaCB3b3JkIGluIHN1Y2Nlc3Npb24gbmVlZHMgdG8gZXh0cmFjdCBzb21lCisgICAgLy8gb2YgdGhlIGJpdHMgZnJvbSB0aGUgcHJldmlvdXMgd29yZCBhbmQgb3IgdGhlbSBpbnRvIHRoaXMgd29yZCB3aGlsZQorICAgIC8vIHNoaWZ0aW5nIHRoaXMgd29yZCB0byBtYWtlIHJvb20gZm9yIHRoZSBuZXcgYml0cy4gIFRoaXMgaGFzIHRvIGJlIGRvbmUKKyAgICAvLyBmb3IgZXZlcnkgd29yZCBpbiB0aGUgYXJyYXkuICBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIGFsZ29yaXRobSBvdXRsaW5lZAorICAgIC8vIGluIG9wZXJhdG9yPj49LCBidXQgYmFja3dhcmRzLgorCisgICAgLy8gU2luY2Ugd2UncmUgc2hpZnRpbmcgZWFjaCB3b3JkIGxlZnQsIHNvbWUgYml0cyB3aWxsIGZhbGwgb2ZmIHRoZSBlbmQKKyAgICAvLyBvZiBlYWNoIHdvcmQgdG8gdGhlIGxlZnQsIGFuZCBlbXB0eSBzcGFjZSB3aWxsIGJlIGNyZWF0ZWQgb24gdGhlIHJpZ2h0LgorICAgIC8vIFRoZSBmaXJzdCB3b3JkIGluIHRoZSBhcnJheSB3aWxsIGxvc2UgYml0cyBwZXJtYW5lbnRseSwgc28gc3RhcnRpbmcgYXQKKyAgICAvLyB0aGUgZW5kLCB3b3JrIGJhY2t3YXJkcyBzaGlmdGluZyBlYWNoIHdvcmQgdG8gdGhlIGxlZnQsIGFuZCBPUidpbmcKKyAgICAvLyBpbiB0aGUgYml0cyBmcm9tIHRoZSBlbmQgb2YgdGhlIG5leHQgd29yZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAgIC8vIGN1cnJlbnQgd29yZC4KKworICAgIC8vIEV4YW1wbGU6CisgICAgLy8gICBTdGFydGluZyB3aXRoIHsweEFBQkJDQ0RELCAweEVFRkYwMDExLCAweDIyMzM0NDU1fSBhbmQgc2hpZnRpbmcgbGVmdAorICAgIC8vICAgYnkgNCBiaXRzLgorICAgIC8vIFN0ZXAgMTogV29yZFsyXSA8PD0gNCAgICAgICAgICAgOyAweDIzMzQ0NTUwCisgICAgLy8gU3RlcCAyOiBXb3JkWzJdIHw9IDB4MDAwMDAwMEUgICA7IDB4MjMzNDQ1NUUKKyAgICAvLyBTdGVwIDM6IFdvcmRbMV0gPDw9IDQgICAgICAgICAgIDsgMHhFRkYwMDExMAorICAgIC8vIFN0ZXAgNDogV29yZFsxXSB8PSAweDAwMDAwMDBBICAgOyAweEVGRjAwMTFBCisgICAgLy8gU3RlcCA1OiBXb3JkWzBdIDw8PSA0ICAgICAgICAgICA7IDB4QUJCQ0NERDAKKyAgICAvLyBSZXN1bHQ6IHsgMHhBQkJDQ0REMCwgMHhFRkYwMDExQSwgMHgyMzM0NDU1RSB9CisgICAgY29uc3QgQml0V29yZCBNYXNrID0gbWFza0xlYWRpbmdPbmVzPEJpdFdvcmQ+KEJpdERpc3RhbmNlKTsKKyAgICBjb25zdCB1bnNpZ25lZCBSU0ggPSBCSVRXT1JEX1NJWkUgLSBCaXREaXN0YW5jZTsKKworICAgIGZvciAoaW50IEkgPSBOdW1Xb3JkcyAtIDE7IEkgPiAwOyAtLUkpIHsKKyAgICAgIEJpdHNbSV0gPDw9IEJpdERpc3RhbmNlOworICAgICAgQml0c1tJXSB8PSAoQml0c1tJIC0gMV0gJiBNYXNrKSA+PiBSU0g7CisgICAgfQorICAgIEJpdHNbMF0gPDw9IEJpdERpc3RhbmNlOworICAgIGNsZWFyX3VudXNlZF9iaXRzKCk7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBBc3NpZ25tZW50IG9wZXJhdG9yLgorICBjb25zdCBCaXRWZWN0b3IgJm9wZXJhdG9yPShjb25zdCBCaXRWZWN0b3IgJlJIUykgeworICAgIGlmICh0aGlzID09ICZSSFMpIHJldHVybiAqdGhpczsKKworICAgIFNpemUgPSBSSFMuc2l6ZSgpOworICAgIHVuc2lnbmVkIFJIU1dvcmRzID0gTnVtQml0V29yZHMoU2l6ZSk7CisgICAgaWYgKFNpemUgPD0gZ2V0Qml0Q2FwYWNpdHkoKSkgeworICAgICAgaWYgKFNpemUpCisgICAgICAgIHN0ZDo6bWVtY3B5KEJpdHMuZGF0YSgpLCBSSFMuQml0cy5kYXRhKCksIFJIU1dvcmRzICogc2l6ZW9mKEJpdFdvcmQpKTsKKyAgICAgIGNsZWFyX3VudXNlZF9iaXRzKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8gR3JvdyB0aGUgYml0dmVjdG9yIHRvIGhhdmUgZW5vdWdoIGVsZW1lbnRzLgorICAgIHVuc2lnbmVkIE5ld0NhcGFjaXR5ID0gUkhTV29yZHM7CisgICAgYXNzZXJ0KE5ld0NhcGFjaXR5ID4gMCAmJiAibmVnYXRpdmUgY2FwYWNpdHk/Iik7CisgICAgYXV0byBOZXdCaXRzID0gYWxsb2NhdGUoTmV3Q2FwYWNpdHkpOworICAgIHN0ZDo6bWVtY3B5KE5ld0JpdHMuZGF0YSgpLCBSSFMuQml0cy5kYXRhKCksIE5ld0NhcGFjaXR5ICogc2l6ZW9mKEJpdFdvcmQpKTsKKworICAgIC8vIERlc3Ryb3kgdGhlIG9sZCBiaXRzLgorICAgIHN0ZDo6ZnJlZShCaXRzLmRhdGEoKSk7CisgICAgQml0cyA9IE5ld0JpdHM7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBCaXRWZWN0b3IgJm9wZXJhdG9yPShCaXRWZWN0b3IgJiZSSFMpIHsKKyAgICBpZiAodGhpcyA9PSAmUkhTKSByZXR1cm4gKnRoaXM7CisKKyAgICBzdGQ6OmZyZWUoQml0cy5kYXRhKCkpOworICAgIEJpdHMgPSBSSFMuQml0czsKKyAgICBTaXplID0gUkhTLlNpemU7CisKKyAgICBSSFMuQml0cyA9IE11dGFibGVBcnJheVJlZjxCaXRXb3JkPigpOworICAgIFJIUy5TaXplID0gMDsKKworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZvaWQgc3dhcChCaXRWZWN0b3IgJlJIUykgeworICAgIHN0ZDo6c3dhcChCaXRzLCBSSFMuQml0cyk7CisgICAgc3RkOjpzd2FwKFNpemUsIFJIUy5TaXplKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBQb3J0YWJsZSBiaXQgbWFzayBvcGVyYXRpb25zLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8KKyAgLy8gVGhlc2UgbWV0aG9kcyBhbGwgb3BlcmF0ZSBvbiBhcnJheXMgb2YgdWludDMyX3QsIGVhY2ggaG9sZGluZyAzMiBiaXRzLiBUaGUKKyAgLy8gZml4ZWQgd29yZCBzaXplIG1ha2VzIGl0IGVhc2llciB0byB3b3JrIHdpdGggbGl0ZXJhbCBiaXQgdmVjdG9yIGNvbnN0YW50cworICAvLyBpbiBwb3J0YWJsZSBjb2RlLgorICAvLworICAvLyBUaGUgTFNCIGluIGVhY2ggd29yZCBpcyB0aGUgbG93ZXN0IG51bWJlcmVkIGJpdC4gIFRoZSBzaXplIG9mIGEgcG9ydGFibGUKKyAgLy8gYml0IG1hc2sgaXMgYWx3YXlzIGEgd2hvbGUgbXVsdGlwbGUgb2YgMzIgYml0cy4gIElmIG5vIGJpdCBtYXNrIHNpemUgaXMKKyAgLy8gZ2l2ZW4sIHRoZSBiaXQgbWFzayBpcyBhc3N1bWVkIHRvIGNvdmVyIHRoZSBlbnRpcmUgQml0VmVjdG9yLgorCisgIC8vLyBzZXRCaXRzSW5NYXNrIC0gQWRkICcxJyBiaXRzIGZyb20gTWFzayB0byB0aGlzIHZlY3Rvci4gRG9uJ3QgcmVzaXplLgorICAvLy8gVGhpcyBjb21wdXRlcyAiKnRoaXMgfD0gTWFzayIuCisgIHZvaWQgc2V0Qml0c0luTWFzayhjb25zdCB1aW50MzJfdCAqTWFzaywgdW5zaWduZWQgTWFza1dvcmRzID0gfjB1KSB7CisgICAgYXBwbHlNYXNrPHRydWUsIGZhbHNlPihNYXNrLCBNYXNrV29yZHMpOworICB9CisKKyAgLy8vIGNsZWFyQml0c0luTWFzayAtIENsZWFyIGFueSBiaXRzIGluIHRoaXMgdmVjdG9yIHRoYXQgYXJlIHNldCBpbiBNYXNrLgorICAvLy8gRG9uJ3QgcmVzaXplLiBUaGlzIGNvbXB1dGVzICIqdGhpcyAmPSB+TWFzayIuCisgIHZvaWQgY2xlYXJCaXRzSW5NYXNrKGNvbnN0IHVpbnQzMl90ICpNYXNrLCB1bnNpZ25lZCBNYXNrV29yZHMgPSB+MHUpIHsKKyAgICBhcHBseU1hc2s8ZmFsc2UsIGZhbHNlPihNYXNrLCBNYXNrV29yZHMpOworICB9CisKKyAgLy8vIHNldEJpdHNOb3RJbk1hc2sgLSBBZGQgYSBiaXQgdG8gdGhpcyB2ZWN0b3IgZm9yIGV2ZXJ5ICcwJyBiaXQgaW4gTWFzay4KKyAgLy8vIERvbid0IHJlc2l6ZS4gIFRoaXMgY29tcHV0ZXMgIip0aGlzIHw9IH5NYXNrIi4KKyAgdm9pZCBzZXRCaXRzTm90SW5NYXNrKGNvbnN0IHVpbnQzMl90ICpNYXNrLCB1bnNpZ25lZCBNYXNrV29yZHMgPSB+MHUpIHsKKyAgICBhcHBseU1hc2s8dHJ1ZSwgdHJ1ZT4oTWFzaywgTWFza1dvcmRzKTsKKyAgfQorCisgIC8vLyBjbGVhckJpdHNOb3RJbk1hc2sgLSBDbGVhciBhIGJpdCBpbiB0aGlzIHZlY3RvciBmb3IgZXZlcnkgJzAnIGJpdCBpbiBNYXNrLgorICAvLy8gRG9uJ3QgcmVzaXplLiAgVGhpcyBjb21wdXRlcyAiKnRoaXMgJj0gTWFzayIuCisgIHZvaWQgY2xlYXJCaXRzTm90SW5NYXNrKGNvbnN0IHVpbnQzMl90ICpNYXNrLCB1bnNpZ25lZCBNYXNrV29yZHMgPSB+MHUpIHsKKyAgICBhcHBseU1hc2s8ZmFsc2UsIHRydWU+KE1hc2ssIE1hc2tXb3Jkcyk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBQZXJmb3JtIGEgbG9naWNhbCBsZWZ0IHNoaWZ0IG9mIFxwIENvdW50IHdvcmRzIGJ5IG1vdmluZyBldmVyeXRoaW5nCisgIC8vLyBccCBDb3VudCB3b3JkcyB0byB0aGUgcmlnaHQgaW4gbWVtb3J5LgorICAvLy8KKyAgLy8vIFdoaWxlIGNvbmZ1c2luZywgd29yZHMgYXJlIHN0b3JlZCBmcm9tIGxlYXN0IHNpZ25pZmljYW50IGF0IEJpdHNbMF0gdG8KKyAgLy8vIG1vc3Qgc2lnbmlmaWNhbnQgYXQgQml0c1tOdW1Xb3Jkcy0xXS4gIEEgbG9naWNhbCBzaGlmdCBsZWZ0LCBob3dldmVyLAorICAvLy8gbW92ZXMgdGhlIGN1cnJlbnQgbGVhc3Qgc2lnbmlmaWNhbnQgYml0IHRvIGEgaGlnaGVyIGxvZ2ljYWwgaW5kZXgsIGFuZAorICAvLy8gZmlsbHMgdGhlIHByZXZpb3VzIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgd2l0aCAwLiAgVGh1cywgd2UgYWN0dWFsbHkKKyAgLy8vIG5lZWQgdG8gbW92ZSB0aGUgYnl0ZXMgb2YgdGhlIG1lbW9yeSB0byB0aGUgcmlnaHQsIG5vdCB0byB0aGUgbGVmdC4KKyAgLy8vIEV4YW1wbGU6CisgIC8vLyAgIFdvcmRzID0gWzB4QkJCQkFBQUEsIDB4REREREZGRkYsIDB4MDAwMDAwMDAsIDB4RERERDAwMDBdCisgIC8vLyByZXByZXNlbnRzIGEgQml0VmVjdG9yIHdoZXJlIDB4QkJCQkFBQUEgY29udGFpbiB0aGUgbGVhc3Qgc2lnbmlmaWNhbnQKKyAgLy8vIGJpdHMuICBTbyBpZiB3ZSB3YW50IHRvIHNoaWZ0IHRoZSBCaXRWZWN0b3IgbGVmdCBieSAyIHdvcmRzLCB3ZSBuZWVkIHRvCisgIC8vLyB0dXJuIHRoaXMgaW50byAweDAwMDAwMDAwIDB4MDAwMDAwMDAgMHhCQkJCQUFBQSAweERERERGRkZGIGJ5IHVzaW5nIGEKKyAgLy8vIG1lbW1vdmUgd2hpY2ggbW92ZXMgcmlnaHQsIG5vdCBsZWZ0LgorICB2b2lkIHdvcmRTaGwodWludDMyX3QgQ291bnQpIHsKKyAgICBpZiAoQ291bnQgPT0gMCkKKyAgICAgIHJldHVybjsKKworICAgIHVpbnQzMl90IE51bVdvcmRzID0gTnVtQml0V29yZHMoU2l6ZSk7CisKKyAgICBhdXRvIFNyYyA9IEJpdHMudGFrZV9mcm9udChOdW1Xb3JkcykuZHJvcF9iYWNrKENvdW50KTsKKyAgICBhdXRvIERlc3QgPSBCaXRzLnRha2VfZnJvbnQoTnVtV29yZHMpLmRyb3BfZnJvbnQoQ291bnQpOworCisgICAgLy8gU2luY2Ugd2UgYWx3YXlzIG1vdmUgV29yZC1zaXplZCBjaHVua3Mgb2YgZGF0YSB3aXRoIHNyYyBhbmQgZGVzdCBib3RoCisgICAgLy8gYWxpZ25lZCB0byBhIHdvcmQtYm91bmRhcnksIHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgZW5kaWFubmVzcworICAgIC8vIGhlcmUuCisgICAgc3RkOjptZW1tb3ZlKERlc3QuYmVnaW4oKSwgU3JjLmJlZ2luKCksIERlc3Quc2l6ZSgpICogc2l6ZW9mKEJpdFdvcmQpKTsKKyAgICBzdGQ6Om1lbXNldChCaXRzLmRhdGEoKSwgMCwgQ291bnQgKiBzaXplb2YoQml0V29yZCkpOworICAgIGNsZWFyX3VudXNlZF9iaXRzKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFBlcmZvcm0gYSBsb2dpY2FsIHJpZ2h0IHNoaWZ0IG9mIFxwIENvdW50IHdvcmRzIGJ5IG1vdmluZyB0aG9zZQorICAvLy8gd29yZHMgdG8gdGhlIGxlZnQgaW4gbWVtb3J5LiAgU2VlIHdvcmRTaGwgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgIC8vLworICB2b2lkIHdvcmRTaHIodWludDMyX3QgQ291bnQpIHsKKyAgICBpZiAoQ291bnQgPT0gMCkKKyAgICAgIHJldHVybjsKKworICAgIHVpbnQzMl90IE51bVdvcmRzID0gTnVtQml0V29yZHMoU2l6ZSk7CisKKyAgICBhdXRvIFNyYyA9IEJpdHMudGFrZV9mcm9udChOdW1Xb3JkcykuZHJvcF9mcm9udChDb3VudCk7CisgICAgYXV0byBEZXN0ID0gQml0cy50YWtlX2Zyb250KE51bVdvcmRzKS5kcm9wX2JhY2soQ291bnQpOworICAgIGFzc2VydChEZXN0LnNpemUoKSA9PSBTcmMuc2l6ZSgpKTsKKworICAgIHN0ZDo6bWVtbW92ZShEZXN0LmJlZ2luKCksIFNyYy5iZWdpbigpLCBEZXN0LnNpemUoKSAqIHNpemVvZihCaXRXb3JkKSk7CisgICAgc3RkOjptZW1zZXQoRGVzdC5lbmQoKSwgMCwgQ291bnQgKiBzaXplb2YoQml0V29yZCkpOworICB9CisKKyAgTXV0YWJsZUFycmF5UmVmPEJpdFdvcmQ+IGFsbG9jYXRlKHNpemVfdCBOdW1Xb3JkcykgeworICAgIEJpdFdvcmQgKlJhd0JpdHMgPSBzdGF0aWNfY2FzdDxCaXRXb3JkICo+KAorICAgICAgICBzYWZlX21hbGxvYyhOdW1Xb3JkcyAqIHNpemVvZihCaXRXb3JkKSkpOworICAgIHJldHVybiBNdXRhYmxlQXJyYXlSZWY8Qml0V29yZD4oUmF3Qml0cywgTnVtV29yZHMpOworICB9CisKKyAgaW50IG5leHRfdW5zZXRfaW5fd29yZChpbnQgV29yZEluZGV4LCBCaXRXb3JkIFdvcmQpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBSZXN1bHQgPSBXb3JkSW5kZXggKiBCSVRXT1JEX1NJWkUgKyBjb3VudFRyYWlsaW5nT25lcyhXb3JkKTsKKyAgICByZXR1cm4gUmVzdWx0IDwgc2l6ZSgpID8gUmVzdWx0IDogLTE7CisgIH0KKworICB1bnNpZ25lZCBOdW1CaXRXb3Jkcyh1bnNpZ25lZCBTKSBjb25zdCB7CisgICAgcmV0dXJuIChTICsgQklUV09SRF9TSVpFLTEpIC8gQklUV09SRF9TSVpFOworICB9CisKKyAgLy8gU2V0IHRoZSB1bnVzZWQgYml0cyBpbiB0aGUgaGlnaCB3b3Jkcy4KKyAgdm9pZCBzZXRfdW51c2VkX2JpdHMoYm9vbCB0ID0gdHJ1ZSkgeworICAgIC8vICBTZXQgaGlnaCB3b3JkcyBmaXJzdC4KKyAgICB1bnNpZ25lZCBVc2VkV29yZHMgPSBOdW1CaXRXb3JkcyhTaXplKTsKKyAgICBpZiAoQml0cy5zaXplKCkgPiBVc2VkV29yZHMpCisgICAgICBpbml0X3dvcmRzKEJpdHMuZHJvcF9mcm9udChVc2VkV29yZHMpLCB0KTsKKworICAgIC8vICBUaGVuIHNldCBhbnkgc3RyYXkgaGlnaCBiaXRzIG9mIHRoZSBsYXN0IHVzZWQgd29yZC4KKyAgICB1bnNpZ25lZCBFeHRyYUJpdHMgPSBTaXplICUgQklUV09SRF9TSVpFOworICAgIGlmIChFeHRyYUJpdHMpIHsKKyAgICAgIEJpdFdvcmQgRXh0cmFCaXRNYXNrID0gfjBVTCA8PCBFeHRyYUJpdHM7CisgICAgICBpZiAodCkKKyAgICAgICAgQml0c1tVc2VkV29yZHMtMV0gfD0gRXh0cmFCaXRNYXNrOworICAgICAgZWxzZQorICAgICAgICBCaXRzW1VzZWRXb3Jkcy0xXSAmPSB+RXh0cmFCaXRNYXNrOworICAgIH0KKyAgfQorCisgIC8vIENsZWFyIHRoZSB1bnVzZWQgYml0cyBpbiB0aGUgaGlnaCB3b3Jkcy4KKyAgdm9pZCBjbGVhcl91bnVzZWRfYml0cygpIHsKKyAgICBzZXRfdW51c2VkX2JpdHMoZmFsc2UpOworICB9CisKKyAgdm9pZCBncm93KHVuc2lnbmVkIE5ld1NpemUpIHsKKyAgICBzaXplX3QgTmV3Q2FwYWNpdHkgPSBzdGQ6Om1heDxzaXplX3Q+KE51bUJpdFdvcmRzKE5ld1NpemUpLCBCaXRzLnNpemUoKSAqIDIpOworICAgIGFzc2VydChOZXdDYXBhY2l0eSA+IDAgJiYgInJlYWxsb2MtaW5nIHplcm8gc3BhY2UiKTsKKyAgICBCaXRXb3JkICpOZXdCaXRzID0gc3RhdGljX2Nhc3Q8Qml0V29yZCAqPigKKyAgICAgICAgc2FmZV9yZWFsbG9jKEJpdHMuZGF0YSgpLCBOZXdDYXBhY2l0eSAqIHNpemVvZihCaXRXb3JkKSkpOworICAgIEJpdHMgPSBNdXRhYmxlQXJyYXlSZWY8Qml0V29yZD4oTmV3Qml0cywgTmV3Q2FwYWNpdHkpOworICAgIGNsZWFyX3VudXNlZF9iaXRzKCk7CisgIH0KKworICB2b2lkIGluaXRfd29yZHMoTXV0YWJsZUFycmF5UmVmPEJpdFdvcmQ+IEIsIGJvb2wgdCkgeworICAgIGlmIChCLnNpemUoKSA+IDApCisgICAgICBtZW1zZXQoQi5kYXRhKCksIDAgLSAoaW50KXQsIEIuc2l6ZSgpICogc2l6ZW9mKEJpdFdvcmQpKTsKKyAgfQorCisgIHRlbXBsYXRlPGJvb2wgQWRkQml0cywgYm9vbCBJbnZlcnRNYXNrPgorICB2b2lkIGFwcGx5TWFzayhjb25zdCB1aW50MzJfdCAqTWFzaywgdW5zaWduZWQgTWFza1dvcmRzKSB7CisgICAgc3RhdGljX2Fzc2VydChCSVRXT1JEX1NJWkUgJSAzMiA9PSAwLCAiVW5zdXBwb3J0ZWQgQml0V29yZCBzaXplLiIpOworICAgIE1hc2tXb3JkcyA9IHN0ZDo6bWluKE1hc2tXb3JkcywgKHNpemUoKSArIDMxKSAvIDMyKTsKKyAgICBjb25zdCB1bnNpZ25lZCBTY2FsZSA9IEJJVFdPUkRfU0laRSAvIDMyOworICAgIHVuc2lnbmVkIGk7CisgICAgZm9yIChpID0gMDsgTWFza1dvcmRzID49IFNjYWxlOyArK2ksIE1hc2tXb3JkcyAtPSBTY2FsZSkgeworICAgICAgQml0V29yZCBCVyA9IEJpdHNbaV07CisgICAgICAvLyBUaGlzIGlubmVyIGxvb3Agc2hvdWxkIHVucm9sbCBjb21wbGV0ZWx5IHdoZW4gQklUV09SRF9TSVpFID4gMzIuCisgICAgICBmb3IgKHVuc2lnbmVkIGIgPSAwOyBiICE9IEJJVFdPUkRfU0laRTsgYiArPSAzMikgeworICAgICAgICB1aW50MzJfdCBNID0gKk1hc2srKzsKKyAgICAgICAgaWYgKEludmVydE1hc2spIE0gPSB+TTsKKyAgICAgICAgaWYgKEFkZEJpdHMpIEJXIHw9ICAgQml0V29yZChNKSA8PCBiOworICAgICAgICBlbHNlICAgICAgICAgQlcgJj0gfihCaXRXb3JkKE0pIDw8IGIpOworICAgICAgfQorICAgICAgQml0c1tpXSA9IEJXOworICAgIH0KKyAgICBmb3IgKHVuc2lnbmVkIGIgPSAwOyBNYXNrV29yZHM7IGIgKz0gMzIsIC0tTWFza1dvcmRzKSB7CisgICAgICB1aW50MzJfdCBNID0gKk1hc2srKzsKKyAgICAgIGlmIChJbnZlcnRNYXNrKSBNID0gfk07CisgICAgICBpZiAoQWRkQml0cykgQml0c1tpXSB8PSAgIEJpdFdvcmQoTSkgPDwgYjsKKyAgICAgIGVsc2UgICAgICAgICBCaXRzW2ldICY9IH4oQml0V29yZChNKSA8PCBiKTsKKyAgICB9CisgICAgaWYgKEFkZEJpdHMpCisgICAgICBjbGVhcl91bnVzZWRfYml0cygpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIFJldHVybiB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSBiaXQgdmVjdG9yLgorICBzaXplX3QgZ2V0TWVtb3J5U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEJpdHMuc2l6ZSgpICogc2l6ZW9mKEJpdFdvcmQpOyB9CisgIHNpemVfdCBnZXRCaXRDYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIEJpdHMuc2l6ZSgpICogQklUV09SRF9TSVpFOyB9Cit9OworCitpbmxpbmUgc2l6ZV90IGNhcGFjaXR5X2luX2J5dGVzKGNvbnN0IEJpdFZlY3RvciAmWCkgeworICByZXR1cm4gWC5nZXRNZW1vcnlTaXplKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKK25hbWVzcGFjZSBzdGQgeworICAvLy8gSW1wbGVtZW50IHN0ZDo6c3dhcCBpbiB0ZXJtcyBvZiBCaXRWZWN0b3Igc3dhcC4KKyAgaW5saW5lIHZvaWQKKyAgc3dhcChsbHZtOjpCaXRWZWN0b3IgJkxIUywgbGx2bTo6Qml0VmVjdG9yICZSSFMpIHsKKyAgICBMSFMuc3dhcChSSFMpOworICB9Cit9IC8vIGVuZCBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9CSVRWRUNUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvQml0bWFza0VudW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0JpdG1hc2tFbnVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThjNmJhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0JpdG1hc2tFbnVtLmgKQEAgLTAsMCArMSwxNTMgQEAKKy8vPT09LS0gbGx2bS9BRFQvQml0bWFza0VudW0uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfQklUTUFTS0VOVU1fSAorI2RlZmluZSBMTFZNX0FEVF9CSVRNQVNLRU5VTV9ICisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorCisvLy8gTExWTV9NQVJLX0FTX0JJVE1BU0tfRU5VTSBsZXRzIHlvdSBvcHQgaW4gYW4gaW5kaXZpZHVhbCBlbnVtIHR5cGUgc28geW91IGNhbgorLy8vIHBlcmZvcm0gYml0d2lzZSBvcGVyYXRpb25zIG9uIGl0IHdpdGhvdXQgcHV0dGluZyBzdGF0aWNfY2FzdCBldmVyeXdoZXJlLgorLy8vCisvLy8gXGNvZGUKKy8vLyAgIGVudW0gTXlFbnVtIHsKKy8vLyAgICAgRTEgPSAxLCBFMiA9IDIsIEUzID0gNCwgRTQgPSA4LAorLy8vICAgICBMTFZNX01BUktfQVNfQklUTUFTS19FTlVNKC8qIExhcmdlc3RWYWx1ZSA9ICovIEU0KQorLy8vICAgfTsKKy8vLworLy8vICAgdm9pZCBGb28oKSB7CisvLy8gICAgIE15RW51bSBBID0gKEUxIHwgRTIpICYgRTMgXiB+RTQ7IC8vIExvb2ssIG1hOiBObyBzdGF0aWNfY2FzdCEKKy8vLyAgIH0KKy8vLyBcZW5kY29kZQorLy8vCisvLy8gTm9ybWFsbHkgd2hlbiB5b3UgZG8gYSBiaXR3aXNlIG9wZXJhdGlvbiBvbiBhbiBlbnVtIHZhbHVlLCB5b3UgZ2V0IGJhY2sgYW4KKy8vLyBpbnN0YW5jZSBvZiB0aGUgdW5kZXJseWluZyB0eXBlIChlLmcuIGludCkuICBCdXQgdXNpbmcgdGhpcyBtYWNybywgYml0d2lzZQorLy8vIG9wcyBvbiB5b3VyIGVudW0gd2lsbCByZXR1cm4geW91IGJhY2sgaW5zdGFuY2VzIG9mIHRoZSBlbnVtLiAgVGhpcyBpcworLy8vIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIGVudW1zIHdoaWNoIHJlcHJlc2VudCBhIGNvbWJpbmF0aW9uIG9mIGZsYWdzLgorLy8vCisvLy8gVGhlIHBhcmFtZXRlciB0byBMTFZNX01BUktfQVNfQklUTUFTS19FTlVNIHNob3VsZCBiZSB0aGUgbGFyZ2VzdCBpbmRpdmlkdWFsCisvLy8gdmFsdWUgaW4geW91ciBlbnVtLgorLy8vCisvLy8gQWxsIG9mIHRoZSBlbnVtJ3MgdmFsdWVzIG11c3QgYmUgbm9uLW5lZ2F0aXZlLgorI2RlZmluZSBMTFZNX01BUktfQVNfQklUTUFTS19FTlVNKExhcmdlc3RWYWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgTExWTV9CSVRNQVNLX0xBUkdFU1RfRU5VTUVSQVRPUiA9IExhcmdlc3RWYWx1ZQorCisvLy8gTExWTV9FTkFCTEVfQklUTUFTS19FTlVNU19JTl9OQU1FU1BBQ0UoKSBwdWxscyB0aGUgb3BlcmF0b3Igb3ZlcmxvYWRzIHVzZWQKKy8vLyBieSBMTFZNX01BUktfQVNfQklUTUFTS19FTlVNIGludG8gdGhlIGN1cnJlbnQgbmFtZXNwYWNlLgorLy8vCisvLy8gU3VwcG9zZSB5b3UgaGF2ZSBhbiBlbnVtIGZvbzo6YmFyOjpNeUVudW0uICBCZWZvcmUgdXNpbmcKKy8vLyBMTFZNX01BUktfQVNfQklUTUFTS19FTlVNIG9uIE15RW51bSwgeW91IG11c3QgcHV0CisvLy8gTExWTV9FTkFCTEVfQklUTUFTS19FTlVNU19JTl9OQU1FU1BBQ0UoKSBzb21ld2hlcmUgaW5zaWRlIG5hbWVzcGFjZSBmb28gb3IKKy8vLyBuYW1lc3BhY2UgZm9vOjpiYXIuICBUaGlzIGFsbG93cyB0aGUgcmVsZXZhbnQgb3BlcmF0b3Igb3ZlcmxvYWRzIHRvIGJlIGZvdW5kCisvLy8gYnkgQURMLgorLy8vCisvLy8gWW91IGRvbid0IG5lZWQgdG8gdXNlIHRoaXMgbWFjcm8gaW4gbmFtZXNwYWNlIGxsdm07IGl0J3MgZG9uZSBhdCB0aGUgYm90dG9tCisvLy8gb2YgdGhpcyBmaWxlLgorI2RlZmluZSBMTFZNX0VOQUJMRV9CSVRNQVNLX0VOVU1TX0lOX05BTUVTUEFDRSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdXNpbmcgOjpsbHZtOjpCaXRtYXNrRW51bURldGFpbDo6b3BlcmF0b3J+OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVzaW5nIDo6bGx2bTo6Qml0bWFza0VudW1EZXRhaWw6Om9wZXJhdG9yfDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1c2luZyA6Omxsdm06OkJpdG1hc2tFbnVtRGV0YWlsOjpvcGVyYXRvciY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdXNpbmcgOjpsbHZtOjpCaXRtYXNrRW51bURldGFpbDo6b3BlcmF0b3JeOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVzaW5nIDo6bGx2bTo6Qml0bWFza0VudW1EZXRhaWw6Om9wZXJhdG9yfD07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1c2luZyA6Omxsdm06OkJpdG1hc2tFbnVtRGV0YWlsOjpvcGVyYXRvciY9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgLyogRm9yY2UgYSBzZW1pY29sb24gYXQgdGhlIGVuZCBvZiB0aGlzIG1hY3JvLiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVzaW5nIDo6bGx2bTo6Qml0bWFza0VudW1EZXRhaWw6Om9wZXJhdG9yXj0KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gVHJhaXRzIGNsYXNzIHRvIGRldGVybWluZSB3aGV0aGVyIGFuIGVudW0gaGFzIGEKKy8vLyBMTFZNX0JJVE1BU0tfTEFSR0VTVF9FTlVNRVJBVE9SIGVudW1lcmF0b3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRSwgdHlwZW5hbWUgRW5hYmxlID0gdm9pZD4KK3N0cnVjdCBpc19iaXRtYXNrX2VudW0gOiBzdGQ6OmZhbHNlX3R5cGUge307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFPgorc3RydWN0IGlzX2JpdG1hc2tfZW51bTwKKyAgICBFLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzaXplb2YoRTo6TExWTV9CSVRNQVNLX0xBUkdFU1RfRU5VTUVSQVRPUikgPj0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwPjo6dHlwZT4gOiBzdGQ6OnRydWVfdHlwZSB7fTsKK25hbWVzcGFjZSBCaXRtYXNrRW51bURldGFpbCB7CisKKy8vLyBHZXQgYSBiaXRtYXNrIHdpdGggMXMgaW4gYWxsIHBsYWNlcyB1cCB0byB0aGUgaGlnaC1vcmRlciBiaXQgb2YgRSdzIGxhcmdlc3QKKy8vLyB2YWx1ZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFPiB0eXBlbmFtZSBzdGQ6OnVuZGVybHlpbmdfdHlwZTxFPjo6dHlwZSBNYXNrKCkgeworICAvLyBPbiBvdmVyZmxvdywgTmV4dFBvd2VyT2YyIHJldHVybnMgemVybyB3aXRoIHRoZSB0eXBlIHVpbnQ2NF90LCBzbworICAvLyBzdWJ0cmFjdGluZyAxIGdpdmVzIHVzIHRoZSBtYXNrIHdpdGggYWxsIGJpdHMgc2V0LCBsaWtlIHdlIHdhbnQuCisgIHJldHVybiBOZXh0UG93ZXJPZjIoc3RhdGljX2Nhc3Q8dHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8RT46OnR5cGU+KAorICAgICAgICAgICAgIEU6OkxMVk1fQklUTUFTS19MQVJHRVNUX0VOVU1FUkFUT1IpKSAtCisgICAgICAgICAxOworfQorCisvLy8gQ2hlY2sgdGhhdCBWYWwgaXMgaW4gcmFuZ2UgZm9yIEUsIGFuZCByZXR1cm4gVmFsIGNhc3QgdG8gRSdzIHVuZGVybHlpbmcKKy8vLyB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIEU+IHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPEU+Ojp0eXBlIFVuZGVybHlpbmcoRSBWYWwpIHsKKyAgYXV0byBVID0gc3RhdGljX2Nhc3Q8dHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8RT46OnR5cGU+KFZhbCk7CisgIGFzc2VydChVID49IDAgJiYgIk5lZ2F0aXZlIGVudW0gdmFsdWVzIGFyZSBub3QgYWxsb3dlZC4iKTsKKyAgYXNzZXJ0KFUgPD0gTWFzazxFPigpICYmICJFbnVtIHZhbHVlIHRvbyBsYXJnZSAob3IgbGFyZ2VzdCB2YWwgdG9vIHNtYWxsPykiKTsKKyAgcmV0dXJuIFU7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFLAorICAgICAgICAgIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aXNfYml0bWFza19lbnVtPEU+Ojp2YWx1ZT46OnR5cGU+CitFIG9wZXJhdG9yfihFIFZhbCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8RT4oflVuZGVybHlpbmcoVmFsKSAmIE1hc2s8RT4oKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFLAorICAgICAgICAgIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aXNfYml0bWFza19lbnVtPEU+Ojp2YWx1ZT46OnR5cGU+CitFIG9wZXJhdG9yfChFIExIUywgRSBSSFMpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEU+KFVuZGVybHlpbmcoTEhTKSB8IFVuZGVybHlpbmcoUkhTKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFLAorICAgICAgICAgIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aXNfYml0bWFza19lbnVtPEU+Ojp2YWx1ZT46OnR5cGU+CitFIG9wZXJhdG9yJihFIExIUywgRSBSSFMpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEU+KFVuZGVybHlpbmcoTEhTKSAmIFVuZGVybHlpbmcoUkhTKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFLAorICAgICAgICAgIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aXNfYml0bWFza19lbnVtPEU+Ojp2YWx1ZT46OnR5cGU+CitFIG9wZXJhdG9yXihFIExIUywgRSBSSFMpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PEU+KFVuZGVybHlpbmcoTEhTKSBeIFVuZGVybHlpbmcoUkhTKSk7Cit9CisKKy8vIHw9LCAmPSwgYW5kIF49IHJldHVybiBhIHJlZmVyZW5jZSB0byBMSFMsIHRvIG1hdGNoIHRoZSBiZWhhdmlvciBvZiB0aGUKKy8vIG9wZXJhdG9ycyBvbiBidWlsdGluIHR5cGVzLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRSwKKyAgICAgICAgICB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGlzX2JpdG1hc2tfZW51bTxFPjo6dmFsdWU+Ojp0eXBlPgorRSAmb3BlcmF0b3J8PShFICZMSFMsIEUgUkhTKSB7CisgIExIUyA9IExIUyB8IFJIUzsKKyAgcmV0dXJuIExIUzsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEUsCisgICAgICAgICAgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxpc19iaXRtYXNrX2VudW08RT46OnZhbHVlPjo6dHlwZT4KK0UgJm9wZXJhdG9yJj0oRSAmTEhTLCBFIFJIUykgeworICBMSFMgPSBMSFMgJiBSSFM7CisgIHJldHVybiBMSFM7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFLAorICAgICAgICAgIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aXNfYml0bWFza19lbnVtPEU+Ojp2YWx1ZT46OnR5cGU+CitFICZvcGVyYXRvcl49KEUgJkxIUywgRSBSSFMpIHsKKyAgTEhTID0gTEhTIF4gUkhTOworICByZXR1cm4gTEhTOworfQorCit9IC8vIG5hbWVzcGFjZSBCaXRtYXNrRW51bURldGFpbAorCisvLyBFbmFibGUgYml0bWFzayBlbnVtcyBpbiBuYW1lc3BhY2UgOjpsbHZtIGFuZCBhbGwgbmVzdGVkIG5hbWVzcGFjZXMuCitMTFZNX0VOQUJMRV9CSVRNQVNLX0VOVU1TX0lOX05BTUVTUEFDRSgpOworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvQnJlYWR0aEZpcnN0SXRlcmF0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0JyZWFkdGhGaXJzdEl0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjNjNjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0JyZWFkdGhGaXJzdEl0ZXJhdG9yLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8vPT09LSBsbHZtL0FEVC9CcmVhZHRoRmlyc3RJdGVyYXRvci5oIC0gQnJlYWR0aCBGaXJzdCBpdGVyYXRvciAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGJ1aWxkcyBvbiB0aGUgQURUL0dyYXBoVHJhaXRzLmggZmlsZSB0byBidWlsZCBhIGdlbmVyaWMgYnJlYWR0aAorLy8gZmlyc3QgZ3JhcGggaXRlcmF0b3IuICBUaGlzIGZpbGUgZXhwb3NlcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucy90eXBlczoKKy8vCisvLyBiZl9iZWdpbi9iZl9lbmQvYmZfaXRlcmF0b3IKKy8vICAgKiBOb3JtYWwgYnJlYWR0aC1maXJzdCBpdGVyYXRpb24gLSB2aXNpdCBhIGdyYXBoIGxldmVsLWJ5LWxldmVsLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfQlJFQURUSEZJUlNUSVRFUkFUT1JfSAorI2RlZmluZSBMTFZNX0FEVF9CUkVBRFRIRklSU1RJVEVSQVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vIGJmX2l0ZXJhdG9yX3N0b3JhZ2UgLSBBIHByaXZhdGUgY2xhc3Mgd2hpY2ggaXMgdXNlZCB0byBmaWd1cmUgb3V0IHdoZXJlIHRvCisvLyBzdG9yZSB0aGUgdmlzaXRlZCBzZXQuIFdlIG9ubHkgcHJvdmlkZSBhIG5vbi1leHRlcm5hbCB2YXJpYW50IGZvciBub3cuCit0ZW1wbGF0ZSA8Y2xhc3MgU2V0VHlwZT4gY2xhc3MgYmZfaXRlcmF0b3Jfc3RvcmFnZSB7CitwdWJsaWM6CisgIFNldFR5cGUgVmlzaXRlZDsKK307CisKKy8vIFRoZSB2aXNpdGVkIHN0YXRlIGZvciB0aGUgaXRlcmF0aW9uIGlzIGEgc2ltcGxlIHNldC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBOb2RlUmVmLCB1bnNpZ25lZCBTbWFsbFNpemUgPSA4PgordXNpbmcgYmZfaXRlcmF0b3JfZGVmYXVsdF9zZXQgPSBTbWFsbFB0clNldDxOb2RlUmVmLCBTbWFsbFNpemU+OworCisvLyBHZW5lcmljIEJyZWFkdGggZmlyc3Qgc2VhcmNoIGl0ZXJhdG9yLgordGVtcGxhdGUgPGNsYXNzIEdyYXBoVCwKKyAgICAgICAgICBjbGFzcyBTZXRUeXBlID0KKyAgICAgICAgICAgICAgYmZfaXRlcmF0b3JfZGVmYXVsdF9zZXQ8dHlwZW5hbWUgR3JhcGhUcmFpdHM8R3JhcGhUPjo6Tm9kZVJlZj4sCisgICAgICAgICAgY2xhc3MgR1QgPSBHcmFwaFRyYWl0czxHcmFwaFQ+PgorY2xhc3MgYmZfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIHR5cGVuYW1lIEdUOjpOb2RlUmVmPiwKKyAgICAgIHB1YmxpYyBiZl9pdGVyYXRvcl9zdG9yYWdlPFNldFR5cGU+IHsKKyAgdXNpbmcgc3VwZXIgPSBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIHR5cGVuYW1lIEdUOjpOb2RlUmVmPjsKKworICB1c2luZyBOb2RlUmVmID0gdHlwZW5hbWUgR1Q6Ok5vZGVSZWY7CisgIHVzaW5nIENoaWxkSXRUeSA9IHR5cGVuYW1lIEdUOjpDaGlsZEl0ZXJhdG9yVHlwZTsKKworICAvLyBGaXJzdCBlbGVtZW50IGlzIHRoZSBub2RlIHJlZmVyZW5jZSwgc2Vjb25kIGlzIHRoZSBuZXh0IGNoaWxkIHRvIHZpc2l0LgorICB1c2luZyBRdWV1ZUVsZW1lbnQgPSBzdGQ6OnBhaXI8Tm9kZVJlZiwgT3B0aW9uYWw8Q2hpbGRJdFR5Pj47CisKKyAgLy8gVmlzaXQgcXVldWUgLSB1c2VkIHRvIG1haW50YWluIEJGUyBvcmRlcmluZy4KKyAgLy8gT3B0aW9uYWw8PiBiZWNhdXNlIHdlIG5lZWQgbWFya2VycyBmb3IgbGV2ZWxzLgorICBzdGQ6OnF1ZXVlPE9wdGlvbmFsPFF1ZXVlRWxlbWVudD4+IFZpc2l0UXVldWU7CisKKyAgLy8gQ3VycmVudCBsZXZlbC4KKyAgdW5zaWduZWQgTGV2ZWw7CisKK3ByaXZhdGU6CisgIGlubGluZSBiZl9pdGVyYXRvcihOb2RlUmVmIE5vZGUpIHsKKyAgICB0aGlzLT5WaXNpdGVkLmluc2VydChOb2RlKTsKKyAgICBMZXZlbCA9IDA7CisKKyAgICAvLyBBbHNvLCBpbnNlcnQgYSBkdW1teSBub2RlIGFzIG1hcmtlci4KKyAgICBWaXNpdFF1ZXVlLnB1c2goUXVldWVFbGVtZW50KE5vZGUsIE5vbmUpKTsKKyAgICBWaXNpdFF1ZXVlLnB1c2goTm9uZSk7CisgIH0KKworICBpbmxpbmUgYmZfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgaW5saW5lIHZvaWQgdG9OZXh0KCkgeworICAgIE9wdGlvbmFsPFF1ZXVlRWxlbWVudD4gSGVhZCA9IFZpc2l0UXVldWUuZnJvbnQoKTsKKyAgICBRdWV1ZUVsZW1lbnQgSCA9IEhlYWQuZ2V0VmFsdWUoKTsKKyAgICBOb2RlUmVmIE5vZGUgPSBILmZpcnN0OworICAgIE9wdGlvbmFsPENoaWxkSXRUeT4gJkNoaWxkSXQgPSBILnNlY29uZDsKKworICAgIGlmICghQ2hpbGRJdCkKKyAgICAgIENoaWxkSXQuZW1wbGFjZShHVDo6Y2hpbGRfYmVnaW4oTm9kZSkpOworICAgIHdoaWxlICgqQ2hpbGRJdCAhPSBHVDo6Y2hpbGRfZW5kKE5vZGUpKSB7CisgICAgICBOb2RlUmVmIE5leHQgPSAqKCpDaGlsZEl0KSsrOworCisgICAgICAvLyBBbHJlYWR5IHZpc2l0ZWQ/CisgICAgICBpZiAodGhpcy0+VmlzaXRlZC5pbnNlcnQoTmV4dCkuc2Vjb25kKQorICAgICAgICBWaXNpdFF1ZXVlLnB1c2goUXVldWVFbGVtZW50KE5leHQsIE5vbmUpKTsKKyAgICB9CisgICAgVmlzaXRRdWV1ZS5wb3AoKTsKKworICAgIC8vIEdvIHRvIHRoZSBuZXh0IGVsZW1lbnQgc2tpcHBpbmcgbWFya2VycyBpZiBuZWVkZWQuCisgICAgaWYgKCFWaXNpdFF1ZXVlLmVtcHR5KCkpIHsKKyAgICAgIEhlYWQgPSBWaXNpdFF1ZXVlLmZyb250KCk7CisgICAgICBpZiAoSGVhZCAhPSBOb25lKQorICAgICAgICByZXR1cm47CisgICAgICBMZXZlbCArPSAxOworICAgICAgVmlzaXRRdWV1ZS5wb3AoKTsKKworICAgICAgLy8gRG9uJ3QgcHVzaCBhbm90aGVyIG1hcmtlciBpZiB0aGlzIGlzIHRoZSBsYXN0CisgICAgICAvLyBlbGVtZW50LgorICAgICAgaWYgKCFWaXNpdFF1ZXVlLmVtcHR5KCkpCisgICAgICAgIFZpc2l0UXVldWUucHVzaChOb25lKTsKKyAgICB9CisgIH0KKworcHVibGljOgorICB1c2luZyBwb2ludGVyID0gdHlwZW5hbWUgc3VwZXI6OnBvaW50ZXI7CisKKyAgLy8gUHJvdmlkZSBzdGF0aWMgYmVnaW4gYW5kIGVuZCBtZXRob2RzIGFzIG91ciBwdWJsaWMgImNvbnN0cnVjdG9ycyIKKyAgc3RhdGljIGJmX2l0ZXJhdG9yIGJlZ2luKGNvbnN0IEdyYXBoVCAmRykgeworICAgIHJldHVybiBiZl9pdGVyYXRvcihHVDo6Z2V0RW50cnlOb2RlKEcpKTsKKyAgfQorCisgIHN0YXRpYyBiZl9pdGVyYXRvciBlbmQoY29uc3QgR3JhcGhUICZHKSB7IHJldHVybiBiZl9pdGVyYXRvcigpOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGJmX2l0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gVmlzaXRRdWV1ZSA9PSBSSFMuVmlzaXRRdWV1ZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBiZl9pdGVyYXRvciAmUkhTKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IFJIUyk7IH0KKworICBjb25zdCBOb2RlUmVmICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBWaXNpdFF1ZXVlLmZyb250KCktPmZpcnN0OyB9CisKKyAgLy8gVGhpcyBpcyBhIG5vbnN0YW5kYXJkIG9wZXJhdG9yLT4gdGhhdCBkZXJlZmVyZW5mY2VzIHRoZSBwb2ludGVyIGFuIGV4dHJhCisgIC8vIHRpbWUgc28gdGhhdCB5b3UgY2FuIGFjdHVhbGx5IGNhbGwgbWV0aG9kcyBvbiB0aGUgbm9kZSwgYmVjYXVzZSB0aGUKKyAgLy8gY29udGFpbmVkIHR5cGUgaXMgYSBwb2ludGVyLgorICBOb2RlUmVmIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAqKnRoaXM7IH0KKworICBiZl9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsgLy8gUHJlLWluY3JlbWVudAorICAgIHRvTmV4dCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGJmX2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7IC8vIFBvc3QtaW5jcmVtZW50CisgICAgYmZfaXRlcmF0b3IgSXRDb3B5ID0gKnRoaXM7CisgICAgKysqdGhpczsKKyAgICByZXR1cm4gSXRDb3B5OworICB9CisKKyAgdW5zaWduZWQgZ2V0TGV2ZWwoKSBjb25zdCB7IHJldHVybiBMZXZlbDsgfQorfTsKKworLy8gUHJvdmlkZSBnbG9iYWwgY29uc3RydWN0b3JzIHRoYXQgYXV0b21hdGljYWxseSBmaWd1cmUgb3V0IGNvcnJlY3QgdHlwZXMuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gYmZfaXRlcmF0b3I8VD4gYmZfYmVnaW4oY29uc3QgVCAmRykgeworICByZXR1cm4gYmZfaXRlcmF0b3I8VD46OmJlZ2luKEcpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gYmZfaXRlcmF0b3I8VD4gYmZfZW5kKGNvbnN0IFQgJkcpIHsKKyAgcmV0dXJuIGJmX2l0ZXJhdG9yPFQ+OjplbmQoRyk7Cit9CisKKy8vIFByb3ZpZGUgYW4gYWNjZXNzb3IgbWV0aG9kIHRvIHVzZSB0aGVtIGluIHJhbmdlLWJhc2VkIHBhdHRlcm5zLgordGVtcGxhdGUgPGNsYXNzIFQ+IGl0ZXJhdG9yX3JhbmdlPGJmX2l0ZXJhdG9yPFQ+PiBicmVhZHRoX2ZpcnN0KGNvbnN0IFQgJkcpIHsKKyAgcmV0dXJuIG1ha2VfcmFuZ2UoYmZfYmVnaW4oRyksIGJmX2VuZChHKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9CUkVBRFRIRklSU1RJVEVSQVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9DYWNoZWRIYXNoU3RyaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9DYWNoZWRIYXNoU3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU2YTYyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0NhY2hlZEhhc2hTdHJpbmcuaApAQCAtMCwwICsxLDE4NCBAQAorLy89PT0tIGxsdm0vQURUL0NhY2hlZEhhc2hTdHJpbmcuaCAtIFByZWhhc2hlZCBzdHJpbmcvU3RyaW5nUmVmIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBDYWNoZWRIYXNoU3RyaW5nIGFuZCBDYWNoZWRIYXNoU3RyaW5nUmVmLiAgVGhlc2UgYXJlIG93bmluZworLy8gYW5kIG5vdC1vd25pbmcgc3RyaW5nIHR5cGVzIHRoYXQgc3RvcmUgdGhlaXIgaGFzaCBpbiBhZGRpdGlvbiB0byB0aGVpciBzdHJpbmcKKy8vIGRhdGEuCisvLworLy8gVW5saWtlIHN0ZDo6c3RyaW5nLCBDYWNoZWRIYXNoU3RyaW5nIGNhbiBiZSB1c2VkIGluIERlbnNlU2V0L0RlbnNlTWFwCisvLyAoYmVjYXVzZSwgdW5saWtlIHN0ZDo6c3RyaW5nLCBDYWNoZWRIYXNoU3RyaW5nIGxldHMgdXMgaGF2ZSBlbXB0eSBhbmQKKy8vIHRvbWJzdG9uZSB2YWx1ZXMpLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfQ0FDSEVEX0hBU0hfU1RSSU5HX0gKKyNkZWZpbmUgTExWTV9BRFRfQ0FDSEVEX0hBU0hfU1RSSU5HX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEEgY29udGFpbmVyIHdoaWNoIGNvbnRhaW5zIGEgU3RyaW5nUmVmIHBsdXMgYSBwcmVjb21wdXRlZCBoYXNoLgorY2xhc3MgQ2FjaGVkSGFzaFN0cmluZ1JlZiB7CisgIGNvbnN0IGNoYXIgKlA7CisgIHVpbnQzMl90IFNpemU7CisgIHVpbnQzMl90IEhhc2g7CisKK3B1YmxpYzoKKyAgLy8gRXhwbGljaXQgYmVjYXVzZSBoYXNoaW5nIGEgc3RyaW5nIGlzbid0IGZyZWUuCisgIGV4cGxpY2l0IENhY2hlZEhhc2hTdHJpbmdSZWYoU3RyaW5nUmVmIFMpCisgICAgICA6IENhY2hlZEhhc2hTdHJpbmdSZWYoUywgRGVuc2VNYXBJbmZvPFN0cmluZ1JlZj46OmdldEhhc2hWYWx1ZShTKSkge30KKworICBDYWNoZWRIYXNoU3RyaW5nUmVmKFN0cmluZ1JlZiBTLCB1aW50MzJfdCBIYXNoKQorICAgICAgOiBQKFMuZGF0YSgpKSwgU2l6ZShTLnNpemUoKSksIEhhc2goSGFzaCkgeworICAgIGFzc2VydChTLnNpemUoKSA8PSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkpOworICB9CisKKyAgU3RyaW5nUmVmIHZhbCgpIGNvbnN0IHsgcmV0dXJuIFN0cmluZ1JlZihQLCBTaXplKTsgfQorICB1aW50MzJfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gU2l6ZTsgfQorICB1aW50MzJfdCBoYXNoKCkgY29uc3QgeyByZXR1cm4gSGFzaDsgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IERlbnNlTWFwSW5mbzxDYWNoZWRIYXNoU3RyaW5nUmVmPiB7CisgIHN0YXRpYyBDYWNoZWRIYXNoU3RyaW5nUmVmIGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiBDYWNoZWRIYXNoU3RyaW5nUmVmKERlbnNlTWFwSW5mbzxTdHJpbmdSZWY+OjpnZXRFbXB0eUtleSgpLCAwKTsKKyAgfQorICBzdGF0aWMgQ2FjaGVkSGFzaFN0cmluZ1JlZiBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgcmV0dXJuIENhY2hlZEhhc2hTdHJpbmdSZWYoRGVuc2VNYXBJbmZvPFN0cmluZ1JlZj46OmdldFRvbWJzdG9uZUtleSgpLCAxKTsKKyAgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IENhY2hlZEhhc2hTdHJpbmdSZWYgJlMpIHsKKyAgICBhc3NlcnQoIWlzRXF1YWwoUywgZ2V0RW1wdHlLZXkoKSkgJiYgIkNhbm5vdCBoYXNoIHRoZSBlbXB0eSBrZXkhIik7CisgICAgYXNzZXJ0KCFpc0VxdWFsKFMsIGdldFRvbWJzdG9uZUtleSgpKSAmJiAiQ2Fubm90IGhhc2ggdGhlIHRvbWJzdG9uZSBrZXkhIik7CisgICAgcmV0dXJuIFMuaGFzaCgpOworICB9CisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgQ2FjaGVkSGFzaFN0cmluZ1JlZiAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhY2hlZEhhc2hTdHJpbmdSZWYgJlJIUykgeworICAgIHJldHVybiBMSFMuaGFzaCgpID09IFJIUy5oYXNoKCkgJiYKKyAgICAgICAgICAgRGVuc2VNYXBJbmZvPFN0cmluZ1JlZj46OmlzRXF1YWwoTEhTLnZhbCgpLCBSSFMudmFsKCkpOworICB9Cit9OworCisvLy8gQSBjb250YWluZXIgd2hpY2ggY29udGFpbnMgYSBzdHJpbmcsIHdoaWNoIGl0IG93bnMsIHBsdXMgYSBwcmVjb21wdXRlZCBoYXNoLgorLy8vCisvLy8gV2UgZG8gbm90IG51bGwtdGVybWluYXRlIHRoZSBzdHJpbmcuCitjbGFzcyBDYWNoZWRIYXNoU3RyaW5nIHsKKyAgZnJpZW5kIHN0cnVjdCBEZW5zZU1hcEluZm88Q2FjaGVkSGFzaFN0cmluZz47CisKKyAgY2hhciAqUDsKKyAgdWludDMyX3QgU2l6ZTsKKyAgdWludDMyX3QgSGFzaDsKKworICBzdGF0aWMgY2hhciAqZ2V0RW1wdHlLZXlQdHIoKSB7IHJldHVybiBEZW5zZU1hcEluZm88Y2hhciAqPjo6Z2V0RW1wdHlLZXkoKTsgfQorICBzdGF0aWMgY2hhciAqZ2V0VG9tYnN0b25lS2V5UHRyKCkgeworICAgIHJldHVybiBEZW5zZU1hcEluZm88Y2hhciAqPjo6Z2V0VG9tYnN0b25lS2V5KCk7CisgIH0KKworICBib29sIGlzRW1wdHlPclRvbWJzdG9uZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gUCA9PSBnZXRFbXB0eUtleVB0cigpIHx8IFAgPT0gZ2V0VG9tYnN0b25lS2V5UHRyKCk7CisgIH0KKworICBzdHJ1Y3QgQ29uc3RydWN0RW1wdHlPclRvbWJzdG9uZVR5IHt9OworCisgIENhY2hlZEhhc2hTdHJpbmcoQ29uc3RydWN0RW1wdHlPclRvbWJzdG9uZVR5LCBjaGFyICpFbXB0eU9yVG9tYnN0b25lUHRyKQorICAgICAgOiBQKEVtcHR5T3JUb21ic3RvbmVQdHIpLCBTaXplKDApLCBIYXNoKDApIHsKKyAgICBhc3NlcnQoaXNFbXB0eU9yVG9tYnN0b25lKCkpOworICB9CisKKyAgLy8gVE9ETzogVXNlIHNtYWxsLXN0cmluZyBvcHRpbWl6YXRpb24gdG8gYXZvaWQgYWxsb2NhdGluZy4KKworcHVibGljOgorICBleHBsaWNpdCBDYWNoZWRIYXNoU3RyaW5nKGNvbnN0IGNoYXIgKlMpIDogQ2FjaGVkSGFzaFN0cmluZyhTdHJpbmdSZWYoUykpIHt9CisKKyAgLy8gRXhwbGljaXQgYmVjYXVzZSBjb3B5aW5nIGFuZCBoYXNoaW5nIGEgc3RyaW5nIGlzbid0IGZyZWUuCisgIGV4cGxpY2l0IENhY2hlZEhhc2hTdHJpbmcoU3RyaW5nUmVmIFMpCisgICAgICA6IENhY2hlZEhhc2hTdHJpbmcoUywgRGVuc2VNYXBJbmZvPFN0cmluZ1JlZj46OmdldEhhc2hWYWx1ZShTKSkge30KKworICBDYWNoZWRIYXNoU3RyaW5nKFN0cmluZ1JlZiBTLCB1aW50MzJfdCBIYXNoKQorICAgICAgOiBQKG5ldyBjaGFyW1Muc2l6ZSgpXSksIFNpemUoUy5zaXplKCkpLCBIYXNoKEhhc2gpIHsKKyAgICBtZW1jcHkoUCwgUy5kYXRhKCksIFMuc2l6ZSgpKTsKKyAgfQorCisgIC8vIElkZWFsbHkgdGhpcyBjbGFzcyB3b3VsZCBub3QgYmUgY29weWFibGUuICBCdXQgU2V0VmVjdG9yIHJlcXVpcmVzIGNvcHlhYmxlCisgIC8vIGtleXMsIGFuZCB3ZSB3YW50IHRoaXMgdG8gYmUgdXNhYmxlIHRoZXJlLgorICBDYWNoZWRIYXNoU3RyaW5nKGNvbnN0IENhY2hlZEhhc2hTdHJpbmcgJk90aGVyKQorICAgICAgOiBTaXplKE90aGVyLlNpemUpLCBIYXNoKE90aGVyLkhhc2gpIHsKKyAgICBpZiAoT3RoZXIuaXNFbXB0eU9yVG9tYnN0b25lKCkpIHsKKyAgICAgIFAgPSBPdGhlci5QOworICAgIH0gZWxzZSB7CisgICAgICBQID0gbmV3IGNoYXJbU2l6ZV07CisgICAgICBtZW1jcHkoUCwgT3RoZXIuUCwgU2l6ZSk7CisgICAgfQorICB9CisKKyAgQ2FjaGVkSGFzaFN0cmluZyAmb3BlcmF0b3I9KENhY2hlZEhhc2hTdHJpbmcgT3RoZXIpIHsKKyAgICBzd2FwKCp0aGlzLCBPdGhlcik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQ2FjaGVkSGFzaFN0cmluZyhDYWNoZWRIYXNoU3RyaW5nICYmT3RoZXIpIG5vZXhjZXB0CisgICAgICA6IFAoT3RoZXIuUCksIFNpemUoT3RoZXIuU2l6ZSksIEhhc2goT3RoZXIuSGFzaCkgeworICAgIE90aGVyLlAgPSBnZXRFbXB0eUtleVB0cigpOworICB9CisKKyAgfkNhY2hlZEhhc2hTdHJpbmcoKSB7CisgICAgaWYgKCFpc0VtcHR5T3JUb21ic3RvbmUoKSkKKyAgICAgIGRlbGV0ZVtdIFA7CisgIH0KKworICBTdHJpbmdSZWYgdmFsKCkgY29uc3QgeyByZXR1cm4gU3RyaW5nUmVmKFAsIFNpemUpOyB9CisgIHVpbnQzMl90IHNpemUoKSBjb25zdCB7IHJldHVybiBTaXplOyB9CisgIHVpbnQzMl90IGhhc2goKSBjb25zdCB7IHJldHVybiBIYXNoOyB9CisKKyAgb3BlcmF0b3IgU3RyaW5nUmVmKCkgY29uc3QgeyByZXR1cm4gdmFsKCk7IH0KKyAgb3BlcmF0b3IgQ2FjaGVkSGFzaFN0cmluZ1JlZigpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2FjaGVkSGFzaFN0cmluZ1JlZih2YWwoKSwgSGFzaCk7CisgIH0KKworICBmcmllbmQgdm9pZCBzd2FwKENhY2hlZEhhc2hTdHJpbmcgJkxIUywgQ2FjaGVkSGFzaFN0cmluZyAmUkhTKSB7CisgICAgdXNpbmcgc3RkOjpzd2FwOworICAgIHN3YXAoTEhTLlAsIFJIUy5QKTsKKyAgICBzd2FwKExIUy5TaXplLCBSSFMuU2l6ZSk7CisgICAgc3dhcChMSFMuSGFzaCwgUkhTLkhhc2gpOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPENhY2hlZEhhc2hTdHJpbmc+IHsKKyAgc3RhdGljIENhY2hlZEhhc2hTdHJpbmcgZ2V0RW1wdHlLZXkoKSB7CisgICAgcmV0dXJuIENhY2hlZEhhc2hTdHJpbmcoQ2FjaGVkSGFzaFN0cmluZzo6Q29uc3RydWN0RW1wdHlPclRvbWJzdG9uZVR5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FjaGVkSGFzaFN0cmluZzo6Z2V0RW1wdHlLZXlQdHIoKSk7CisgIH0KKyAgc3RhdGljIENhY2hlZEhhc2hTdHJpbmcgZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiBDYWNoZWRIYXNoU3RyaW5nKENhY2hlZEhhc2hTdHJpbmc6OkNvbnN0cnVjdEVtcHR5T3JUb21ic3RvbmVUeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhY2hlZEhhc2hTdHJpbmc6OmdldFRvbWJzdG9uZUtleVB0cigpKTsKKyAgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IENhY2hlZEhhc2hTdHJpbmcgJlMpIHsKKyAgICBhc3NlcnQoIWlzRXF1YWwoUywgZ2V0RW1wdHlLZXkoKSkgJiYgIkNhbm5vdCBoYXNoIHRoZSBlbXB0eSBrZXkhIik7CisgICAgYXNzZXJ0KCFpc0VxdWFsKFMsIGdldFRvbWJzdG9uZUtleSgpKSAmJiAiQ2Fubm90IGhhc2ggdGhlIHRvbWJzdG9uZSBrZXkhIik7CisgICAgcmV0dXJuIFMuaGFzaCgpOworICB9CisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgQ2FjaGVkSGFzaFN0cmluZyAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhY2hlZEhhc2hTdHJpbmcgJlJIUykgeworICAgIGlmIChMSFMuaGFzaCgpICE9IFJIUy5oYXNoKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKExIUy5QID09IENhY2hlZEhhc2hTdHJpbmc6OmdldEVtcHR5S2V5UHRyKCkpCisgICAgICByZXR1cm4gUkhTLlAgPT0gQ2FjaGVkSGFzaFN0cmluZzo6Z2V0RW1wdHlLZXlQdHIoKTsKKyAgICBpZiAoTEhTLlAgPT0gQ2FjaGVkSGFzaFN0cmluZzo6Z2V0VG9tYnN0b25lS2V5UHRyKCkpCisgICAgICByZXR1cm4gUkhTLlAgPT0gQ2FjaGVkSGFzaFN0cmluZzo6Z2V0VG9tYnN0b25lS2V5UHRyKCk7CisKKyAgICAvLyBUaGlzIGlzIHNhZmUgYmVjYXVzZSBpZiBSSFMuUCBpcyB0aGUgZW1wdHkgb3IgdG9tYnN0b25lIGtleSwgaXQgd2lsbCBoYXZlCisgICAgLy8gbGVuZ3RoIDAsIHNvIHdlJ2xsIG5ldmVyIGRlcmVmZXJlbmNlIGl0cyBwb2ludGVyLgorICAgIHJldHVybiBMSFMudmFsKCkgPT0gUkhTLnZhbCgpOworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvREFHRGVsdGFBbGdvcml0aG0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0RBR0RlbHRhQWxnb3JpdGhtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFmZGQ0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0RBR0RlbHRhQWxnb3JpdGhtLmgKQEAgLTAsMCArMSw3OSBAQAorLy89PT0tIERBR0RlbHRhQWxnb3JpdGhtLmggLSBBIERBRyBNaW5pbWl6YXRpb24gQWxnb3JpdGhtIC0tLS0tLSotIEMrKyAtKi0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0RBR0RFTFRBQUxHT1JJVEhNX0gKKyNkZWZpbmUgTExWTV9BRFRfREFHREVMVEFBTEdPUklUSE1fSAorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBEQUdEZWx0YUFsZ29yaXRobSAtIEltcGxlbWVudHMgYSAiZGVsdGEgZGVidWdnaW5nIiBhbGdvcml0aG0gZm9yIG1pbmltaXppbmcKKy8vLyBkaXJlY3RlZCBhY3ljbGljIGdyYXBocyB1c2luZyBhIHByZWRpY2F0ZSBmdW5jdGlvbi4KKy8vLworLy8vIFRoZSByZXN1bHQgb2YgdGhlIGFsZ29yaXRobSBpcyBhIHN1YnNldCBvZiB0aGUgaW5wdXQgY2hhbmdlIHNldCB3aGljaCBpcworLy8vIGd1YXJhbnRlZWQgdG8gc2F0aXNmeSB0aGUgcHJlZGljYXRlLCBhc3N1bWluZyB0aGF0IHRoZSBpbnB1dCBzZXQgZGlkLiBGb3IKKy8vLyB3ZWxsIGZvcm1lZCBwcmVkaWNhdGVzLCB0aGUgcmVzdWx0IHNldCBpcyBndWFyYW50ZWVkIHRvIGJlIHN1Y2ggdGhhdAorLy8vIHJlbW92aW5nIGFueSBzaW5nbGUgZWxlbWVudCBub3QgcmVxdWlyZWQgYnkgdGhlIGRlcGVuZGVuY2llcyBvbiB0aGUgb3RoZXIKKy8vLyBlbGVtZW50cyB3b3VsZCBmYWxzaWZ5IHRoZSBwcmVkaWNhdGUuCisvLy8KKy8vLyBUaGUgREFHIHNob3VsZCBiZSB1c2VkIHRvIHJlcHJlc2VudCBkZXBlbmRlbmNpZXMgaW4gdGhlIGNoYW5nZXMgd2hpY2ggYXJlCisvLy8gbGlrZWx5IHRvIGhvbGQgYWNyb3NzIHRoZSBwcmVkaWNhdGUgZnVuY3Rpb24uIFRoYXQgaXMsIGZvciBhIHBhcnRpY3VsYXIKKy8vLyBjaGFuZ2VzZXQgUyBhbmQgcHJlZGljYXRlIFA6CisvLy8KKy8vLyAgIFAoUykgPT4gUChTIHVuaW9uIHByZWQoUykpCisvLy8KKy8vLyBUaGUgbWluaXphdGlvbiBhbGdvcml0aG0gdXNlcyB0aGlzIGRlcGVuZGVuY3kgaW5mb3JtYXRpb24gdG8gYXR0ZW1wdCB0bworLy8vIGVhZ2VybHkgcHJ1bmUgbGFyZ2Ugc3Vic2V0cyBvZiBjaGFuZ2VzLiBBcyB3aXRoIFxzZWUgRGVsdGFBbGdvcml0aG0sIHRoZSBEQUcKKy8vLyBpcyBub3QgcmVxdWlyZWQgdG8gc2F0aXNmeSB0aGlzIHByb3BlcnR5LCBidXQgdGhlIGFsZ29yaXRobSB3aWxsIHJ1bgorLy8vIHN1YnN0YW50aWFsbHkgZmV3ZXIgdGVzdHMgd2l0aCBhcHByb3ByaWF0ZSBkZXBlbmRlbmNpZXMuIFxzZWUgRGVsdGFBbGdvcml0aG0KKy8vLyBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGUgcHJvcGVydGllcyB3aGljaCB0aGUgcHJlZGljYXRlIGZ1bmN0aW9uIGl0c2VsZgorLy8vIHNob3VsZCBzYXRpc2Z5LgorY2xhc3MgREFHRGVsdGFBbGdvcml0aG0geworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3B1YmxpYzoKKyAgdXNpbmcgY2hhbmdlX3R5ID0gdW5zaWduZWQ7CisgIHVzaW5nIGVkZ2VfdHkgPSBzdGQ6OnBhaXI8Y2hhbmdlX3R5LCBjaGFuZ2VfdHk+OworCisgIC8vIEZJWE1FOiBVc2UgYSBkZWNlbnQgZGF0YSBzdHJ1Y3R1cmUuCisgIHVzaW5nIGNoYW5nZXNldF90eSA9IHN0ZDo6c2V0PGNoYW5nZV90eT47CisgIHVzaW5nIGNoYW5nZXNldGxpc3RfdHkgPSBzdGQ6OnZlY3RvcjxjaGFuZ2VzZXRfdHk+OworCitwdWJsaWM6CisgIHZpcnR1YWwgfkRBR0RlbHRhQWxnb3JpdGhtKCkgPSBkZWZhdWx0OworCisgIC8vLyBSdW4gLSBNaW5pbWl6ZSB0aGUgREFHIGZvcm1lZCBieSB0aGUgXHAgQ2hhbmdlcyB2ZXJ0aWNlcyBhbmQgdGhlCisgIC8vLyBccCBEZXBlbmRlbmNpZXMgZWRnZXMgYnkgZXhlY3V0aW5nIFxzZWUgRXhlY3V0ZU9uZVRlc3QoKSBvbiBzdWJzZXRzIG9mCisgIC8vLyBjaGFuZ2VzIGFuZCByZXR1cm5pbmcgdGhlIHNtYWxsZXN0IHNldCB3aGljaCBzdGlsbCBzYXRpc2ZpZXMgdGhlIHRlc3QKKyAgLy8vIHByZWRpY2F0ZSBhbmQgdGhlIGlucHV0IFxwIERlcGVuZGVuY2llcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ2hhbmdlcyBUaGUgbGlzdCBvZiBjaGFuZ2VzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBEZXBlbmRlbmNpZXMgVGhlIGxpc3Qgb2YgZGVwZW5kZW5jaWVzIGFtb25nc3QgY2hhbmdlcy4gRm9yIGVhY2gKKyAgLy8vICh4LHkpIGluIFxwIERlcGVuZGVuY2llcywgYm90aCB4IGFuZCB5IG11c3QgYmUgaW4gXHAgQ2hhbmdlcy4gVGhlCisgIC8vLyBtaW5pbWl6YXRpb24gYWxnb3JpdGhtIGd1YXJhbnRlZXMgdGhhdCBmb3IgZWFjaCB0ZXN0ZWQgY2hhbmdlZCBzZXQgUywKKyAgLy8vIFxmJCB4IFxpbiBTIFxmJCBpbXBsaWVzIFxmJCB5IFxpbiBTIFxmJC4gSXQgaXMgYW4gZXJyb3IgdG8gaGF2ZSBjeWNsaWMKKyAgLy8vIGRlcGVuZGVuY2llcy4KKyAgY2hhbmdlc2V0X3R5IFJ1bihjb25zdCBjaGFuZ2VzZXRfdHkgJkNoYW5nZXMsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZWRnZV90eT4gJkRlcGVuZGVuY2llcyk7CisKKyAgLy8vIFVwZGF0ZWRTZWFyY2hTdGF0ZSAtIENhbGxiYWNrIHVzZWQgd2hlbiB0aGUgc2VhcmNoIHN0YXRlIGNoYW5nZXMuCisgIHZpcnR1YWwgdm9pZCBVcGRhdGVkU2VhcmNoU3RhdGUoY29uc3QgY2hhbmdlc2V0X3R5ICZDaGFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZXNldGxpc3RfdHkgJlNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlc2V0X3R5ICZSZXF1aXJlZCkge30KKworICAvLy8gRXhlY3V0ZU9uZVRlc3QgLSBFeGVjdXRlIGEgc2luZ2xlIHRlc3QgcHJlZGljYXRlIG9uIHRoZSBjaGFuZ2Ugc2V0IFxwIFMuCisgIHZpcnR1YWwgYm9vbCBFeGVjdXRlT25lVGVzdChjb25zdCBjaGFuZ2VzZXRfdHkgJlMpID0gMDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9EQUdERUxUQUFMR09SSVRITV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9EZWx0YUFsZ29yaXRobS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvRGVsdGFBbGdvcml0aG0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmVjYjJhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvRGVsdGFBbGdvcml0aG0uaApAQCAtMCwwICsxLDkzIEBACisvLz09PS0gRGVsdGFBbGdvcml0aG0uaCAtIEEgU2V0IE1pbmltaXphdGlvbiBBbGdvcml0aG0gLS0tLS0tLS0tKi0gQysrIC0qLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfREVMVEFBTEdPUklUSE1fSAorI2RlZmluZSBMTFZNX0FEVF9ERUxUQUFMR09SSVRITV9ICisKKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBEZWx0YUFsZ29yaXRobSAtIEltcGxlbWVudHMgdGhlIGRlbHRhIGRlYnVnZ2luZyBhbGdvcml0aG0gKEEuIFplbGxlciAnOTkpCisvLy8gZm9yIG1pbmltaXppbmcgYXJiaXRyYXJ5IHNldHMgdXNpbmcgYSBwcmVkaWNhdGUgZnVuY3Rpb24uCisvLy8KKy8vLyBUaGUgcmVzdWx0IG9mIHRoZSBhbGdvcml0aG0gaXMgYSBzdWJzZXQgb2YgdGhlIGlucHV0IGNoYW5nZSBzZXQgd2hpY2ggaXMKKy8vLyBndWFyYW50ZWVkIHRvIHNhdGlzZnkgdGhlIHByZWRpY2F0ZSwgYXNzdW1pbmcgdGhhdCB0aGUgaW5wdXQgc2V0IGRpZC4gRm9yCisvLy8gd2VsbCBmb3JtZWQgcHJlZGljYXRlcywgdGhlIHJlc3VsdCBzZXQgaXMgZ3VhcmFudGVlZCB0byBiZSBzdWNoIHRoYXQKKy8vLyByZW1vdmluZyBhbnkgc2luZ2xlIGVsZW1lbnQgd291bGQgZmFsc2lmeSB0aGUgcHJlZGljYXRlLgorLy8vCisvLy8gRm9yIGJlc3QgcmVzdWx0cyB0aGUgcHJlZGljYXRlIGZ1bmN0aW9uICpzaG91bGQqIChidXQgbmVlZCBub3QpIHNhdGlzZnkKKy8vLyBjZXJ0YWluIHByb3BlcnRpZXMsIGluIHBhcnRpY3VsYXI6CisvLy8gICgxKSBUaGUgcHJlZGljYXRlIHNob3VsZCByZXR1cm4gZmFsc2Ugb24gYW4gZW1wdHkgc2V0IGFuZCB0cnVlIG9uIHRoZSBmdWxsCisvLy8gIHNldC4KKy8vLyAgKDIpIElmIHRoZSBwcmVkaWNhdGUgcmV0dXJucyB0cnVlIGZvciBhIHNldCBvZiBjaGFuZ2VzLCBpdCBzaG91bGQgcmV0dXJuCisvLy8gIHRydWUgZm9yIGFsbCBzdXBlcnNldHMgb2YgdGhhdCBzZXQuCisvLy8KKy8vLyBJdCBpcyBub3QgYW4gZXJyb3IgdG8gcHJvdmlkZSBhIHByZWRpY2F0ZSB0aGF0IGRvZXMgbm90IHNhdGlzZnkgdGhlc2UKKy8vLyByZXF1aXJlbWVudHMsIGFuZCB0aGUgYWxnb3JpdGhtIHdpbGwgZ2VuZXJhbGx5IHByb2R1Y2UgcmVhc29uYWJsZQorLy8vIHJlc3VsdHMuIEhvd2V2ZXIsIGl0IG1heSBydW4gc3Vic3RhbnRpYWxseSBtb3JlIHRlc3RzIHRoYW4gd2l0aCBhIGdvb2QKKy8vLyBwcmVkaWNhdGUuCitjbGFzcyBEZWx0YUFsZ29yaXRobSB7CitwdWJsaWM6CisgIHVzaW5nIGNoYW5nZV90eSA9IHVuc2lnbmVkOworICAvLyBGSVhNRTogVXNlIGEgZGVjZW50IGRhdGEgc3RydWN0dXJlLgorICB1c2luZyBjaGFuZ2VzZXRfdHkgPSBzdGQ6OnNldDxjaGFuZ2VfdHk+OworICB1c2luZyBjaGFuZ2VzZXRsaXN0X3R5ID0gc3RkOjp2ZWN0b3I8Y2hhbmdlc2V0X3R5PjsKKworcHJpdmF0ZToKKyAgLy8vIENhY2hlIG9mIGZhaWxlZCB0ZXN0IHJlc3VsdHMuIFN1Y2Nlc3NmdWwgdGVzdCByZXN1bHRzIGFyZSBuZXZlciBjYWNoZWQKKyAgLy8vIHNpbmNlIHdlIGFsd2F5cyByZWR1Y2UgZm9sbG93aW5nIGEgc3VjY2Vzcy4KKyAgc3RkOjpzZXQ8Y2hhbmdlc2V0X3R5PiBGYWlsZWRUZXN0c0NhY2hlOworCisgIC8vLyBHZXRUZXN0UmVzdWx0IC0gR2V0IHRoZSB0ZXN0IHJlc3VsdCBmb3IgdGhlIFxwIENoYW5nZXMgZnJvbSB0aGUKKyAgLy8vIGNhY2hlLCBleGVjdXRpbmcgdGhlIHRlc3QgaWYgbmVjZXNzYXJ5LgorICAvLy8KKyAgLy8vIFxwYXJhbSBDaGFuZ2VzIC0gVGhlIGNoYW5nZSBzZXQgdG8gdGVzdC4KKyAgLy8vIFxyZXR1cm4gLSBUaGUgdGVzdCByZXN1bHQuCisgIGJvb2wgR2V0VGVzdFJlc3VsdChjb25zdCBjaGFuZ2VzZXRfdHkgJkNoYW5nZXMpOworCisgIC8vLyBTcGxpdCAtIFBhcnRpdGlvbiBhIHNldCBvZiBjaGFuZ2VzIFxwIFMgaW50byBvbmUgb3IgdHdvIHN1YnNldHMuCisgIHZvaWQgU3BsaXQoY29uc3QgY2hhbmdlc2V0X3R5ICZTLCBjaGFuZ2VzZXRsaXN0X3R5ICZSZXMpOworCisgIC8vLyBEZWx0YSAtIE1pbmltaXplIGEgc2V0IG9mIFxwIENoYW5nZXMgd2hpY2ggaGFzIGJlZW4gcGFydGlvbmVkIGludG8KKyAgLy8vIHNtYWxsZXIgc2V0cywgYnkgYXR0ZW1wdGluZyB0byByZW1vdmUgaW5kaXZpZHVhbCBzdWJzZXRzLgorICBjaGFuZ2VzZXRfdHkgRGVsdGEoY29uc3QgY2hhbmdlc2V0X3R5ICZDaGFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhbmdlc2V0bGlzdF90eSAmU2V0cyk7CisKKyAgLy8vIFNlYXJjaCAtIFNlYXJjaCBmb3IgYSBzdWJzZXQgKG9yIHN1YnNldHMpIGluIFxwIFNldHMgd2hpY2ggY2FuIGJlCisgIC8vLyByZW1vdmVkIGZyb20gXHAgQ2hhbmdlcyB3aGlsZSBzdGlsbCBzYXRpc2Z5aW5nIHRoZSBwcmVkaWNhdGUuCisgIC8vLworICAvLy8gXHBhcmFtIFJlcyAtIE9uIHN1Y2Nlc3MsIGEgc3Vic2V0IG9mIENoYW5nZXMgd2hpY2ggc2F0aXNmaWVzIHRoZQorICAvLy8gcHJlZGljYXRlLgorICAvLy8gXHJldHVybiAtIFRydWUgb24gc3VjY2Vzcy4KKyAgYm9vbCBTZWFyY2goY29uc3QgY2hhbmdlc2V0X3R5ICZDaGFuZ2VzLCBjb25zdCBjaGFuZ2VzZXRsaXN0X3R5ICZTZXRzLAorICAgICAgICAgICAgICBjaGFuZ2VzZXRfdHkgJlJlcyk7CisKK3Byb3RlY3RlZDoKKyAgLy8vIFVwZGF0ZWRTZWFyY2hTdGF0ZSAtIENhbGxiYWNrIHVzZWQgd2hlbiB0aGUgc2VhcmNoIHN0YXRlIGNoYW5nZXMuCisgIHZpcnR1YWwgdm9pZCBVcGRhdGVkU2VhcmNoU3RhdGUoY29uc3QgY2hhbmdlc2V0X3R5ICZDaGFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYW5nZXNldGxpc3RfdHkgJlNldHMpIHt9CisKKyAgLy8vIEV4ZWN1dGVPbmVUZXN0IC0gRXhlY3V0ZSBhIHNpbmdsZSB0ZXN0IHByZWRpY2F0ZSBvbiB0aGUgY2hhbmdlIHNldCBccCBTLgorICB2aXJ0dWFsIGJvb2wgRXhlY3V0ZU9uZVRlc3QoY29uc3QgY2hhbmdlc2V0X3R5ICZTKSA9IDA7CisKKyAgRGVsdGFBbGdvcml0aG0mIG9wZXJhdG9yPShjb25zdCBEZWx0YUFsZ29yaXRobSYpID0gZGVmYXVsdDsKKworcHVibGljOgorICB2aXJ0dWFsIH5EZWx0YUFsZ29yaXRobSgpOworCisgIC8vLyBSdW4gLSBNaW5pbWl6ZSB0aGUgc2V0IFxwIENoYW5nZXMgYnkgZXhlY3V0aW5nIFxzZWUgRXhlY3V0ZU9uZVRlc3QoKSBvbgorICAvLy8gc3Vic2V0cyBvZiBjaGFuZ2VzIGFuZCByZXR1cm5pbmcgdGhlIHNtYWxsZXN0IHNldCB3aGljaCBzdGlsbCBzYXRpc2ZpZXMKKyAgLy8vIHRoZSB0ZXN0IHByZWRpY2F0ZS4KKyAgY2hhbmdlc2V0X3R5IFJ1bihjb25zdCBjaGFuZ2VzZXRfdHkgJkNoYW5nZXMpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX0RFTFRBQUxHT1JJVEhNX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0RlbnNlTWFwLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9EZW5zZU1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNjBiNzkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9EZW5zZU1hcC5oCkBAIC0wLDAgKzEsMTIyNCBAQAorLy89PT0tIGxsdm0vQURUL0RlbnNlTWFwLmggLSBEZW5zZSBwcm9iZWQgaGFzaCB0YWJsZSAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgRGVuc2VNYXAgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9ERU5TRU1BUF9ICisjZGVmaW5lIExMVk1fQURUX0RFTlNFTUFQX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL0Vwb2NoVHJhY2tlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGlnbk9mLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUmV2ZXJzZUl0ZXJhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgZGV0YWlsIHsKKworLy8gV2UgZXh0ZW5kIGEgcGFpciB0byBhbGxvdyB1c2VycyB0byBvdmVycmlkZSB0aGUgYnVja2V0IHR5cGUgd2l0aCB0aGVpciBvd24KKy8vIGltcGxlbWVudGF0aW9uIHdpdGhvdXQgcmVxdWlyaW5nIHR3byBtZW1iZXJzLgordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbHVlVD4KK3N0cnVjdCBEZW5zZU1hcFBhaXIgOiBwdWJsaWMgc3RkOjpwYWlyPEtleVQsIFZhbHVlVD4geworICBLZXlUICZnZXRGaXJzdCgpIHsgcmV0dXJuIHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+OjpmaXJzdDsgfQorICBjb25zdCBLZXlUICZnZXRGaXJzdCgpIGNvbnN0IHsgcmV0dXJuIHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+OjpmaXJzdDsgfQorICBWYWx1ZVQgJmdldFNlY29uZCgpIHsgcmV0dXJuIHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+OjpzZWNvbmQ7IH0KKyAgY29uc3QgVmFsdWVUICZnZXRTZWNvbmQoKSBjb25zdCB7IHJldHVybiBzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPjo6c2Vjb25kOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgZGV0YWlsCisKK3RlbXBsYXRlIDwKKyAgICB0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWx1ZVQsIHR5cGVuYW1lIEtleUluZm9UID0gRGVuc2VNYXBJbmZvPEtleVQ+LAorICAgIHR5cGVuYW1lIEJ1Y2tldCA9IGRldGFpbDo6RGVuc2VNYXBQYWlyPEtleVQsIFZhbHVlVD4sIGJvb2wgSXNDb25zdCA9IGZhbHNlPgorY2xhc3MgRGVuc2VNYXBJdGVyYXRvcjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWRULCB0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWx1ZVQsIHR5cGVuYW1lIEtleUluZm9ULAorICAgICAgICAgIHR5cGVuYW1lIEJ1Y2tldFQ+CitjbGFzcyBEZW5zZU1hcEJhc2UgOiBwdWJsaWMgRGVidWdFcG9jaEJhc2UgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdXNpbmcgY29uc3RfYXJnX3R5cGVfdCA9IHR5cGVuYW1lIGNvbnN0X3BvaW50ZXJfb3JfY29uc3RfcmVmPFQ+Ojp0eXBlOworCitwdWJsaWM6CisgIHVzaW5nIHNpemVfdHlwZSA9IHVuc2lnbmVkOworICB1c2luZyBrZXlfdHlwZSA9IEtleVQ7CisgIHVzaW5nIG1hcHBlZF90eXBlID0gVmFsdWVUOworICB1c2luZyB2YWx1ZV90eXBlID0gQnVja2V0VDsKKworICB1c2luZyBpdGVyYXRvciA9IERlbnNlTWFwSXRlcmF0b3I8S2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0VD47CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0KKyAgICAgIERlbnNlTWFwSXRlcmF0b3I8S2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0VCwgdHJ1ZT47CisKKyAgaW5saW5lIGl0ZXJhdG9yIGJlZ2luKCkgeworICAgIC8vIFdoZW4gdGhlIG1hcCBpcyBlbXB0eSwgYXZvaWQgdGhlIG92ZXJoZWFkIG9mIGFkdmFuY2luZy9yZXRyZWF0aW5nIHBhc3QKKyAgICAvLyBlbXB0eSBidWNrZXRzLgorICAgIGlmIChlbXB0eSgpKQorICAgICAgcmV0dXJuIGVuZCgpOworICAgIGlmIChzaG91bGRSZXZlcnNlSXRlcmF0ZTxLZXlUPigpKQorICAgICAgcmV0dXJuIG1ha2VJdGVyYXRvcihnZXRCdWNrZXRzRW5kKCkgLSAxLCBnZXRCdWNrZXRzKCksICp0aGlzKTsKKyAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKGdldEJ1Y2tldHMoKSwgZ2V0QnVja2V0c0VuZCgpLCAqdGhpcyk7CisgIH0KKyAgaW5saW5lIGl0ZXJhdG9yIGVuZCgpIHsKKyAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKGdldEJ1Y2tldHNFbmQoKSwgZ2V0QnVja2V0c0VuZCgpLCAqdGhpcywgdHJ1ZSk7CisgIH0KKyAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeworICAgIGlmIChlbXB0eSgpKQorICAgICAgcmV0dXJuIGVuZCgpOworICAgIGlmIChzaG91bGRSZXZlcnNlSXRlcmF0ZTxLZXlUPigpKQorICAgICAgcmV0dXJuIG1ha2VDb25zdEl0ZXJhdG9yKGdldEJ1Y2tldHNFbmQoKSAtIDEsIGdldEJ1Y2tldHMoKSwgKnRoaXMpOworICAgIHJldHVybiBtYWtlQ29uc3RJdGVyYXRvcihnZXRCdWNrZXRzKCksIGdldEJ1Y2tldHNFbmQoKSwgKnRoaXMpOworICB9CisgIGlubGluZSBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VDb25zdEl0ZXJhdG9yKGdldEJ1Y2tldHNFbmQoKSwgZ2V0QnVja2V0c0VuZCgpLCAqdGhpcywgdHJ1ZSk7CisgIH0KKworICBMTFZNX05PRElTQ0FSRCBib29sIGVtcHR5KCkgY29uc3QgeworICAgIHJldHVybiBnZXROdW1FbnRyaWVzKCkgPT0gMDsKKyAgfQorICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtRW50cmllcygpOyB9CisKKyAgLy8vIEdyb3cgdGhlIGRlbnNlbWFwIHNvIHRoYXQgaXQgY2FuIGNvbnRhaW4gYXQgbGVhc3QgXHAgTnVtRW50cmllcyBpdGVtcworICAvLy8gYmVmb3JlIHJlc2l6aW5nIGFnYWluLgorICB2b2lkIHJlc2VydmUoc2l6ZV90eXBlIE51bUVudHJpZXMpIHsKKyAgICBhdXRvIE51bUJ1Y2tldHMgPSBnZXRNaW5CdWNrZXRUb1Jlc2VydmVGb3JFbnRyaWVzKE51bUVudHJpZXMpOworICAgIGluY3JlbWVudEVwb2NoKCk7CisgICAgaWYgKE51bUJ1Y2tldHMgPiBnZXROdW1CdWNrZXRzKCkpCisgICAgICBncm93KE51bUJ1Y2tldHMpOworICB9CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBpbmNyZW1lbnRFcG9jaCgpOworICAgIGlmIChnZXROdW1FbnRyaWVzKCkgPT0gMCAmJiBnZXROdW1Ub21ic3RvbmVzKCkgPT0gMCkgcmV0dXJuOworCisgICAgLy8gSWYgdGhlIGNhcGFjaXR5IG9mIHRoZSBhcnJheSBpcyBodWdlLCBhbmQgdGhlICMgZWxlbWVudHMgdXNlZCBpcyBzbWFsbCwKKyAgICAvLyBzaHJpbmsgdGhlIGFycmF5LgorICAgIGlmIChnZXROdW1FbnRyaWVzKCkgKiA0IDwgZ2V0TnVtQnVja2V0cygpICYmIGdldE51bUJ1Y2tldHMoKSA+IDY0KSB7CisgICAgICBzaHJpbmtfYW5kX2NsZWFyKCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgY29uc3QgS2V5VCBFbXB0eUtleSA9IGdldEVtcHR5S2V5KCksIFRvbWJzdG9uZUtleSA9IGdldFRvbWJzdG9uZUtleSgpOworICAgIGlmIChpc1BvZExpa2U8S2V5VD46OnZhbHVlICYmIGlzUG9kTGlrZTxWYWx1ZVQ+Ojp2YWx1ZSkgeworICAgICAgLy8gVXNlIGEgc2ltcGxlciBsb29wIHdoZW4gdGhlc2UgYXJlIHRyaXZpYWwgdHlwZXMuCisgICAgICBmb3IgKEJ1Y2tldFQgKlAgPSBnZXRCdWNrZXRzKCksICpFID0gZ2V0QnVja2V0c0VuZCgpOyBQICE9IEU7ICsrUCkKKyAgICAgICAgUC0+Z2V0Rmlyc3QoKSA9IEVtcHR5S2V5OworICAgIH0gZWxzZSB7CisgICAgICB1bnNpZ25lZCBOdW1FbnRyaWVzID0gZ2V0TnVtRW50cmllcygpOworICAgICAgZm9yIChCdWNrZXRUICpQID0gZ2V0QnVja2V0cygpLCAqRSA9IGdldEJ1Y2tldHNFbmQoKTsgUCAhPSBFOyArK1ApIHsKKyAgICAgICAgaWYgKCFLZXlJbmZvVDo6aXNFcXVhbChQLT5nZXRGaXJzdCgpLCBFbXB0eUtleSkpIHsKKyAgICAgICAgICBpZiAoIUtleUluZm9UOjppc0VxdWFsKFAtPmdldEZpcnN0KCksIFRvbWJzdG9uZUtleSkpIHsKKyAgICAgICAgICAgIFAtPmdldFNlY29uZCgpLn5WYWx1ZVQoKTsKKyAgICAgICAgICAgIC0tTnVtRW50cmllczsKKyAgICAgICAgICB9CisgICAgICAgICAgUC0+Z2V0Rmlyc3QoKSA9IEVtcHR5S2V5OworICAgICAgICB9CisgICAgICB9CisgICAgICBhc3NlcnQoTnVtRW50cmllcyA9PSAwICYmICJOb2RlIGNvdW50IGltYmFsYW5jZSEiKTsKKyAgICB9CisgICAgc2V0TnVtRW50cmllcygwKTsKKyAgICBzZXROdW1Ub21ic3RvbmVzKDApOworICB9CisKKyAgLy8vIFJldHVybiAxIGlmIHRoZSBzcGVjaWZpZWQga2V5IGlzIGluIHRoZSBtYXAsIDAgb3RoZXJ3aXNlLgorICBzaXplX3R5cGUgY291bnQoY29uc3RfYXJnX3R5cGVfdDxLZXlUPiBWYWwpIGNvbnN0IHsKKyAgICBjb25zdCBCdWNrZXRUICpUaGVCdWNrZXQ7CisgICAgcmV0dXJuIExvb2t1cEJ1Y2tldEZvcihWYWwsIFRoZUJ1Y2tldCkgPyAxIDogMDsKKyAgfQorCisgIGl0ZXJhdG9yIGZpbmQoY29uc3RfYXJnX3R5cGVfdDxLZXlUPiBWYWwpIHsKKyAgICBCdWNrZXRUICpUaGVCdWNrZXQ7CisgICAgaWYgKExvb2t1cEJ1Y2tldEZvcihWYWwsIFRoZUJ1Y2tldCkpCisgICAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKFRoZUJ1Y2tldCwgZ2V0QnVja2V0c0VuZCgpLCAqdGhpcywgdHJ1ZSk7CisgICAgcmV0dXJuIGVuZCgpOworICB9CisgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3RfYXJnX3R5cGVfdDxLZXlUPiBWYWwpIGNvbnN0IHsKKyAgICBjb25zdCBCdWNrZXRUICpUaGVCdWNrZXQ7CisgICAgaWYgKExvb2t1cEJ1Y2tldEZvcihWYWwsIFRoZUJ1Y2tldCkpCisgICAgICByZXR1cm4gbWFrZUNvbnN0SXRlcmF0b3IoVGhlQnVja2V0LCBnZXRCdWNrZXRzRW5kKCksICp0aGlzLCB0cnVlKTsKKyAgICByZXR1cm4gZW5kKCk7CisgIH0KKworICAvLy8gQWx0ZXJuYXRlIHZlcnNpb24gb2YgZmluZCgpIHdoaWNoIGFsbG93cyBhIGRpZmZlcmVudCwgYW5kIHBvc3NpYmx5CisgIC8vLyBsZXNzIGV4cGVuc2l2ZSwga2V5IHR5cGUuCisgIC8vLyBUaGUgRGVuc2VNYXBJbmZvIGlzIHJlc3BvbnNpYmxlIGZvciBzdXBwbHlpbmcgbWV0aG9kcworICAvLy8gZ2V0SGFzaFZhbHVlKExvb2t1cEtleVQpIGFuZCBpc0VxdWFsKExvb2t1cEtleVQsIEtleVQpIGZvciBlYWNoIGtleQorICAvLy8gdHlwZSB1c2VkLgorICB0ZW1wbGF0ZTxjbGFzcyBMb29rdXBLZXlUPgorICBpdGVyYXRvciBmaW5kX2FzKGNvbnN0IExvb2t1cEtleVQgJlZhbCkgeworICAgIEJ1Y2tldFQgKlRoZUJ1Y2tldDsKKyAgICBpZiAoTG9va3VwQnVja2V0Rm9yKFZhbCwgVGhlQnVja2V0KSkKKyAgICAgIHJldHVybiBtYWtlSXRlcmF0b3IoVGhlQnVja2V0LCBnZXRCdWNrZXRzRW5kKCksICp0aGlzLCB0cnVlKTsKKyAgICByZXR1cm4gZW5kKCk7CisgIH0KKyAgdGVtcGxhdGU8Y2xhc3MgTG9va3VwS2V5VD4KKyAgY29uc3RfaXRlcmF0b3IgZmluZF9hcyhjb25zdCBMb29rdXBLZXlUICZWYWwpIGNvbnN0IHsKKyAgICBjb25zdCBCdWNrZXRUICpUaGVCdWNrZXQ7CisgICAgaWYgKExvb2t1cEJ1Y2tldEZvcihWYWwsIFRoZUJ1Y2tldCkpCisgICAgICByZXR1cm4gbWFrZUNvbnN0SXRlcmF0b3IoVGhlQnVja2V0LCBnZXRCdWNrZXRzRW5kKCksICp0aGlzLCB0cnVlKTsKKyAgICByZXR1cm4gZW5kKCk7CisgIH0KKworICAvLy8gbG9va3VwIC0gUmV0dXJuIHRoZSBlbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBrZXksIG9yIGEgZGVmYXVsdAorICAvLy8gY29uc3RydWN0ZWQgdmFsdWUgaWYgbm8gc3VjaCBlbnRyeSBleGlzdHMuCisgIFZhbHVlVCBsb29rdXAoY29uc3RfYXJnX3R5cGVfdDxLZXlUPiBWYWwpIGNvbnN0IHsKKyAgICBjb25zdCBCdWNrZXRUICpUaGVCdWNrZXQ7CisgICAgaWYgKExvb2t1cEJ1Y2tldEZvcihWYWwsIFRoZUJ1Y2tldCkpCisgICAgICByZXR1cm4gVGhlQnVja2V0LT5nZXRTZWNvbmQoKTsKKyAgICByZXR1cm4gVmFsdWVUKCk7CisgIH0KKworICAvLyBJbnNlcnRzIGtleSx2YWx1ZSBwYWlyIGludG8gdGhlIG1hcCBpZiB0aGUga2V5IGlzbid0IGFscmVhZHkgaW4gdGhlIG1hcC4KKyAgLy8gSWYgdGhlIGtleSBpcyBhbHJlYWR5IGluIHRoZSBtYXAsIGl0IHJldHVybnMgZmFsc2UgYW5kIGRvZXNuJ3QgdXBkYXRlIHRoZQorICAvLyB2YWx1ZS4KKyAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnQoY29uc3Qgc3RkOjpwYWlyPEtleVQsIFZhbHVlVD4gJktWKSB7CisgICAgcmV0dXJuIHRyeV9lbXBsYWNlKEtWLmZpcnN0LCBLVi5zZWNvbmQpOworICB9CisKKyAgLy8gSW5zZXJ0cyBrZXksdmFsdWUgcGFpciBpbnRvIHRoZSBtYXAgaWYgdGhlIGtleSBpc24ndCBhbHJlYWR5IGluIHRoZSBtYXAuCisgIC8vIElmIHRoZSBrZXkgaXMgYWxyZWFkeSBpbiB0aGUgbWFwLCBpdCByZXR1cm5zIGZhbHNlIGFuZCBkb2Vzbid0IHVwZGF0ZSB0aGUKKyAgLy8gdmFsdWUuCisgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+ICYmS1YpIHsKKyAgICByZXR1cm4gdHJ5X2VtcGxhY2Uoc3RkOjptb3ZlKEtWLmZpcnN0KSwgc3RkOjptb3ZlKEtWLnNlY29uZCkpOworICB9CisKKyAgLy8gSW5zZXJ0cyBrZXksdmFsdWUgcGFpciBpbnRvIHRoZSBtYXAgaWYgdGhlIGtleSBpc24ndCBhbHJlYWR5IGluIHRoZSBtYXAuCisgIC8vIFRoZSB2YWx1ZSBpcyBjb25zdHJ1Y3RlZCBpbi1wbGFjZSBpZiB0aGUga2V5IGlzIG5vdCBpbiB0aGUgbWFwLCBvdGhlcndpc2UKKyAgLy8gaXQgaXMgbm90IG1vdmVkLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVHM+CisgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gdHJ5X2VtcGxhY2UoS2V5VCAmJktleSwgVHMgJiYuLi4gQXJncykgeworICAgIEJ1Y2tldFQgKlRoZUJ1Y2tldDsKKyAgICBpZiAoTG9va3VwQnVja2V0Rm9yKEtleSwgVGhlQnVja2V0KSkKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgIG1ha2VJdGVyYXRvcihUaGVCdWNrZXQsIGdldEJ1Y2tldHNFbmQoKSwgKnRoaXMsIHRydWUpLAorICAgICAgICAgICAgICAgZmFsc2UpOyAvLyBBbHJlYWR5IGluIG1hcC4KKworICAgIC8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBuZXcgZWxlbWVudC4KKyAgICBUaGVCdWNrZXQgPQorICAgICAgICBJbnNlcnRJbnRvQnVja2V0KFRoZUJ1Y2tldCwgc3RkOjptb3ZlKEtleSksIHN0ZDo6Zm9yd2FyZDxUcz4oQXJncykuLi4pOworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICBtYWtlSXRlcmF0b3IoVGhlQnVja2V0LCBnZXRCdWNrZXRzRW5kKCksICp0aGlzLCB0cnVlKSwKKyAgICAgICAgICAgICB0cnVlKTsKKyAgfQorCisgIC8vIEluc2VydHMga2V5LHZhbHVlIHBhaXIgaW50byB0aGUgbWFwIGlmIHRoZSBrZXkgaXNuJ3QgYWxyZWFkeSBpbiB0aGUgbWFwLgorICAvLyBUaGUgdmFsdWUgaXMgY29uc3RydWN0ZWQgaW4tcGxhY2UgaWYgdGhlIGtleSBpcyBub3QgaW4gdGhlIG1hcCwgb3RoZXJ3aXNlCisgIC8vIGl0IGlzIG5vdCBtb3ZlZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFRzPgorICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IHRyeV9lbXBsYWNlKGNvbnN0IEtleVQgJktleSwgVHMgJiYuLi4gQXJncykgeworICAgIEJ1Y2tldFQgKlRoZUJ1Y2tldDsKKyAgICBpZiAoTG9va3VwQnVja2V0Rm9yKEtleSwgVGhlQnVja2V0KSkKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICAgIG1ha2VJdGVyYXRvcihUaGVCdWNrZXQsIGdldEJ1Y2tldHNFbmQoKSwgKnRoaXMsIHRydWUpLAorICAgICAgICAgICAgICAgZmFsc2UpOyAvLyBBbHJlYWR5IGluIG1hcC4KKworICAgIC8vIE90aGVyd2lzZSwgaW5zZXJ0IHRoZSBuZXcgZWxlbWVudC4KKyAgICBUaGVCdWNrZXQgPSBJbnNlcnRJbnRvQnVja2V0KFRoZUJ1Y2tldCwgS2V5LCBzdGQ6OmZvcndhcmQ8VHM+KEFyZ3MpLi4uKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgbWFrZUl0ZXJhdG9yKFRoZUJ1Y2tldCwgZ2V0QnVja2V0c0VuZCgpLCAqdGhpcywgdHJ1ZSksCisgICAgICAgICAgICAgdHJ1ZSk7CisgIH0KKworICAvLy8gQWx0ZXJuYXRlIHZlcnNpb24gb2YgaW5zZXJ0KCkgd2hpY2ggYWxsb3dzIGEgZGlmZmVyZW50LCBhbmQgcG9zc2libHkKKyAgLy8vIGxlc3MgZXhwZW5zaXZlLCBrZXkgdHlwZS4KKyAgLy8vIFRoZSBEZW5zZU1hcEluZm8gaXMgcmVzcG9uc2libGUgZm9yIHN1cHBseWluZyBtZXRob2RzCisgIC8vLyBnZXRIYXNoVmFsdWUoTG9va3VwS2V5VCkgYW5kIGlzRXF1YWwoTG9va3VwS2V5VCwgS2V5VCkgZm9yIGVhY2gga2V5CisgIC8vLyB0eXBlIHVzZWQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBMb29rdXBLZXlUPgorICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydF9hcyhzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPiAmJktWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29rdXBLZXlUICZWYWwpIHsKKyAgICBCdWNrZXRUICpUaGVCdWNrZXQ7CisgICAgaWYgKExvb2t1cEJ1Y2tldEZvcihWYWwsIFRoZUJ1Y2tldCkpCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoCisgICAgICAgICAgICAgICBtYWtlSXRlcmF0b3IoVGhlQnVja2V0LCBnZXRCdWNrZXRzRW5kKCksICp0aGlzLCB0cnVlKSwKKyAgICAgICAgICAgICAgIGZhbHNlKTsgLy8gQWxyZWFkeSBpbiBtYXAuCisKKyAgICAvLyBPdGhlcndpc2UsIGluc2VydCB0aGUgbmV3IGVsZW1lbnQuCisgICAgVGhlQnVja2V0ID0gSW5zZXJ0SW50b0J1Y2tldFdpdGhMb29rdXAoVGhlQnVja2V0LCBzdGQ6Om1vdmUoS1YuZmlyc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShLVi5zZWNvbmQpLCBWYWwpOworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICAgICBtYWtlSXRlcmF0b3IoVGhlQnVja2V0LCBnZXRCdWNrZXRzRW5kKCksICp0aGlzLCB0cnVlKSwKKyAgICAgICAgICAgICB0cnVlKTsKKyAgfQorCisgIC8vLyBpbnNlcnQgLSBSYW5nZSBpbnNlcnRpb24gb2YgcGFpcnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXQ+CisgIHZvaWQgaW5zZXJ0KElucHV0SXQgSSwgSW5wdXRJdCBFKSB7CisgICAgZm9yICg7IEkgIT0gRTsgKytJKQorICAgICAgaW5zZXJ0KCpJKTsKKyAgfQorCisgIGJvb2wgZXJhc2UoY29uc3QgS2V5VCAmVmFsKSB7CisgICAgQnVja2V0VCAqVGhlQnVja2V0OworICAgIGlmICghTG9va3VwQnVja2V0Rm9yKFZhbCwgVGhlQnVja2V0KSkKKyAgICAgIHJldHVybiBmYWxzZTsgLy8gbm90IGluIG1hcC4KKworICAgIFRoZUJ1Y2tldC0+Z2V0U2Vjb25kKCkuflZhbHVlVCgpOworICAgIFRoZUJ1Y2tldC0+Z2V0Rmlyc3QoKSA9IGdldFRvbWJzdG9uZUtleSgpOworICAgIGRlY3JlbWVudE51bUVudHJpZXMoKTsKKyAgICBpbmNyZW1lbnROdW1Ub21ic3RvbmVzKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgdm9pZCBlcmFzZShpdGVyYXRvciBJKSB7CisgICAgQnVja2V0VCAqVGhlQnVja2V0ID0gJipJOworICAgIFRoZUJ1Y2tldC0+Z2V0U2Vjb25kKCkuflZhbHVlVCgpOworICAgIFRoZUJ1Y2tldC0+Z2V0Rmlyc3QoKSA9IGdldFRvbWJzdG9uZUtleSgpOworICAgIGRlY3JlbWVudE51bUVudHJpZXMoKTsKKyAgICBpbmNyZW1lbnROdW1Ub21ic3RvbmVzKCk7CisgIH0KKworICB2YWx1ZV90eXBlJiBGaW5kQW5kQ29uc3RydWN0KGNvbnN0IEtleVQgJktleSkgeworICAgIEJ1Y2tldFQgKlRoZUJ1Y2tldDsKKyAgICBpZiAoTG9va3VwQnVja2V0Rm9yKEtleSwgVGhlQnVja2V0KSkKKyAgICAgIHJldHVybiAqVGhlQnVja2V0OworCisgICAgcmV0dXJuICpJbnNlcnRJbnRvQnVja2V0KFRoZUJ1Y2tldCwgS2V5KTsKKyAgfQorCisgIFZhbHVlVCAmb3BlcmF0b3JbXShjb25zdCBLZXlUICZLZXkpIHsKKyAgICByZXR1cm4gRmluZEFuZENvbnN0cnVjdChLZXkpLnNlY29uZDsKKyAgfQorCisgIHZhbHVlX3R5cGUmIEZpbmRBbmRDb25zdHJ1Y3QoS2V5VCAmJktleSkgeworICAgIEJ1Y2tldFQgKlRoZUJ1Y2tldDsKKyAgICBpZiAoTG9va3VwQnVja2V0Rm9yKEtleSwgVGhlQnVja2V0KSkKKyAgICAgIHJldHVybiAqVGhlQnVja2V0OworCisgICAgcmV0dXJuICpJbnNlcnRJbnRvQnVja2V0KFRoZUJ1Y2tldCwgc3RkOjptb3ZlKEtleSkpOworICB9CisKKyAgVmFsdWVUICZvcGVyYXRvcltdKEtleVQgJiZLZXkpIHsKKyAgICByZXR1cm4gRmluZEFuZENvbnN0cnVjdChzdGQ6Om1vdmUoS2V5KSkuc2Vjb25kOworICB9CisKKyAgLy8vIGlzUG9pbnRlckludG9CdWNrZXRzQXJyYXkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgcG9pbnRzCisgIC8vLyBzb21ld2hlcmUgaW50byB0aGUgRGVuc2VNYXAncyBhcnJheSBvZiBidWNrZXRzIChpLmUuIGVpdGhlciB0byBhIGtleSBvcgorICAvLy8gdmFsdWUgaW4gdGhlIERlbnNlTWFwKS4KKyAgYm9vbCBpc1BvaW50ZXJJbnRvQnVja2V0c0FycmF5KGNvbnN0IHZvaWQgKlB0cikgY29uc3QgeworICAgIHJldHVybiBQdHIgPj0gZ2V0QnVja2V0cygpICYmIFB0ciA8IGdldEJ1Y2tldHNFbmQoKTsKKyAgfQorCisgIC8vLyBnZXRQb2ludGVySW50b0J1Y2tldHNBcnJheSgpIC0gUmV0dXJuIGFuIG9wYXF1ZSBwb2ludGVyIGludG8gdGhlIGJ1Y2tldHMKKyAgLy8vIGFycmF5LiAgSW4gY29uanVuY3Rpb24gd2l0aCB0aGUgcHJldmlvdXMgbWV0aG9kLCB0aGlzIGNhbiBiZSB1c2VkIHRvCisgIC8vLyBkZXRlcm1pbmUgd2hldGhlciBhbiBpbnNlcnRpb24gY2F1c2VkIHRoZSBEZW5zZU1hcCB0byByZWFsbG9jYXRlLgorICBjb25zdCB2b2lkICpnZXRQb2ludGVySW50b0J1Y2tldHNBcnJheSgpIGNvbnN0IHsgcmV0dXJuIGdldEJ1Y2tldHMoKTsgfQorCitwcm90ZWN0ZWQ6CisgIERlbnNlTWFwQmFzZSgpID0gZGVmYXVsdDsKKworICB2b2lkIGRlc3Ryb3lBbGwoKSB7CisgICAgaWYgKGdldE51bUJ1Y2tldHMoKSA9PSAwKSAvLyBOb3RoaW5nIHRvIGRvLgorICAgICAgcmV0dXJuOworCisgICAgY29uc3QgS2V5VCBFbXB0eUtleSA9IGdldEVtcHR5S2V5KCksIFRvbWJzdG9uZUtleSA9IGdldFRvbWJzdG9uZUtleSgpOworICAgIGZvciAoQnVja2V0VCAqUCA9IGdldEJ1Y2tldHMoKSwgKkUgPSBnZXRCdWNrZXRzRW5kKCk7IFAgIT0gRTsgKytQKSB7CisgICAgICBpZiAoIUtleUluZm9UOjppc0VxdWFsKFAtPmdldEZpcnN0KCksIEVtcHR5S2V5KSAmJgorICAgICAgICAgICFLZXlJbmZvVDo6aXNFcXVhbChQLT5nZXRGaXJzdCgpLCBUb21ic3RvbmVLZXkpKQorICAgICAgICBQLT5nZXRTZWNvbmQoKS5+VmFsdWVUKCk7CisgICAgICBQLT5nZXRGaXJzdCgpLn5LZXlUKCk7CisgICAgfQorICB9CisKKyAgdm9pZCBpbml0RW1wdHkoKSB7CisgICAgc2V0TnVtRW50cmllcygwKTsKKyAgICBzZXROdW1Ub21ic3RvbmVzKDApOworCisgICAgYXNzZXJ0KChnZXROdW1CdWNrZXRzKCkgJiAoZ2V0TnVtQnVja2V0cygpLTEpKSA9PSAwICYmCisgICAgICAgICAgICIjIGluaXRpYWwgYnVja2V0cyBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvISIpOworICAgIGNvbnN0IEtleVQgRW1wdHlLZXkgPSBnZXRFbXB0eUtleSgpOworICAgIGZvciAoQnVja2V0VCAqQiA9IGdldEJ1Y2tldHMoKSwgKkUgPSBnZXRCdWNrZXRzRW5kKCk7IEIgIT0gRTsgKytCKQorICAgICAgOjpuZXcgKCZCLT5nZXRGaXJzdCgpKSBLZXlUKEVtcHR5S2V5KTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnVja2V0cyB0byBhbGxvY2F0ZSB0byBlbnN1cmUgdGhhdCB0aGUgRGVuc2VNYXAgY2FuCisgIC8vLyBhY2NvbW1vZGF0ZSBccCBOdW1FbnRyaWVzIHdpdGhvdXQgbmVlZCB0byBncm93KCkuCisgIHVuc2lnbmVkIGdldE1pbkJ1Y2tldFRvUmVzZXJ2ZUZvckVudHJpZXModW5zaWduZWQgTnVtRW50cmllcykgeworICAgIC8vIEVuc3VyZSB0aGF0ICJOdW1FbnRyaWVzICogNCA8IE51bUJ1Y2tldHMgKiAzIgorICAgIGlmIChOdW1FbnRyaWVzID09IDApCisgICAgICByZXR1cm4gMDsKKyAgICAvLyArMSBpcyByZXF1aXJlZCBiZWNhdXNlIG9mIHRoZSBzdHJpY3QgZXF1YWxpdHkuCisgICAgLy8gRm9yIGV4YW1wbGUgaWYgTnVtRW50cmllcyBpcyA0OCwgd2UgbmVlZCB0byByZXR1cm4gNDAxLgorICAgIHJldHVybiBOZXh0UG93ZXJPZjIoTnVtRW50cmllcyAqIDQgLyAzICsgMSk7CisgIH0KKworICB2b2lkIG1vdmVGcm9tT2xkQnVja2V0cyhCdWNrZXRUICpPbGRCdWNrZXRzQmVnaW4sIEJ1Y2tldFQgKk9sZEJ1Y2tldHNFbmQpIHsKKyAgICBpbml0RW1wdHkoKTsKKworICAgIC8vIEluc2VydCBhbGwgdGhlIG9sZCBlbGVtZW50cy4KKyAgICBjb25zdCBLZXlUIEVtcHR5S2V5ID0gZ2V0RW1wdHlLZXkoKTsKKyAgICBjb25zdCBLZXlUIFRvbWJzdG9uZUtleSA9IGdldFRvbWJzdG9uZUtleSgpOworICAgIGZvciAoQnVja2V0VCAqQiA9IE9sZEJ1Y2tldHNCZWdpbiwgKkUgPSBPbGRCdWNrZXRzRW5kOyBCICE9IEU7ICsrQikgeworICAgICAgaWYgKCFLZXlJbmZvVDo6aXNFcXVhbChCLT5nZXRGaXJzdCgpLCBFbXB0eUtleSkgJiYKKyAgICAgICAgICAhS2V5SW5mb1Q6OmlzRXF1YWwoQi0+Z2V0Rmlyc3QoKSwgVG9tYnN0b25lS2V5KSkgeworICAgICAgICAvLyBJbnNlcnQgdGhlIGtleS92YWx1ZSBpbnRvIHRoZSBuZXcgdGFibGUuCisgICAgICAgIEJ1Y2tldFQgKkRlc3RCdWNrZXQ7CisgICAgICAgIGJvb2wgRm91bmRWYWwgPSBMb29rdXBCdWNrZXRGb3IoQi0+Z2V0Rmlyc3QoKSwgRGVzdEJ1Y2tldCk7CisgICAgICAgICh2b2lkKUZvdW5kVmFsOyAvLyBzaWxlbmNlIHdhcm5pbmcuCisgICAgICAgIGFzc2VydCghRm91bmRWYWwgJiYgIktleSBhbHJlYWR5IGluIG5ldyBtYXA/Iik7CisgICAgICAgIERlc3RCdWNrZXQtPmdldEZpcnN0KCkgPSBzdGQ6Om1vdmUoQi0+Z2V0Rmlyc3QoKSk7CisgICAgICAgIDo6bmV3ICgmRGVzdEJ1Y2tldC0+Z2V0U2Vjb25kKCkpIFZhbHVlVChzdGQ6Om1vdmUoQi0+Z2V0U2Vjb25kKCkpKTsKKyAgICAgICAgaW5jcmVtZW50TnVtRW50cmllcygpOworCisgICAgICAgIC8vIEZyZWUgdGhlIHZhbHVlLgorICAgICAgICBCLT5nZXRTZWNvbmQoKS5+VmFsdWVUKCk7CisgICAgICB9CisgICAgICBCLT5nZXRGaXJzdCgpLn5LZXlUKCk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE90aGVyQmFzZVQ+CisgIHZvaWQgY29weUZyb20oCisgICAgICBjb25zdCBEZW5zZU1hcEJhc2U8T3RoZXJCYXNlVCwgS2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0VD4gJm90aGVyKSB7CisgICAgYXNzZXJ0KCZvdGhlciAhPSB0aGlzKTsKKyAgICBhc3NlcnQoZ2V0TnVtQnVja2V0cygpID09IG90aGVyLmdldE51bUJ1Y2tldHMoKSk7CisKKyAgICBzZXROdW1FbnRyaWVzKG90aGVyLmdldE51bUVudHJpZXMoKSk7CisgICAgc2V0TnVtVG9tYnN0b25lcyhvdGhlci5nZXROdW1Ub21ic3RvbmVzKCkpOworCisgICAgaWYgKGlzUG9kTGlrZTxLZXlUPjo6dmFsdWUgJiYgaXNQb2RMaWtlPFZhbHVlVD46OnZhbHVlKQorICAgICAgbWVtY3B5KGdldEJ1Y2tldHMoKSwgb3RoZXIuZ2V0QnVja2V0cygpLAorICAgICAgICAgICAgIGdldE51bUJ1Y2tldHMoKSAqIHNpemVvZihCdWNrZXRUKSk7CisgICAgZWxzZQorICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBnZXROdW1CdWNrZXRzKCk7ICsraSkgeworICAgICAgICA6Om5ldyAoJmdldEJ1Y2tldHMoKVtpXS5nZXRGaXJzdCgpKQorICAgICAgICAgICAgS2V5VChvdGhlci5nZXRCdWNrZXRzKClbaV0uZ2V0Rmlyc3QoKSk7CisgICAgICAgIGlmICghS2V5SW5mb1Q6OmlzRXF1YWwoZ2V0QnVja2V0cygpW2ldLmdldEZpcnN0KCksIGdldEVtcHR5S2V5KCkpICYmCisgICAgICAgICAgICAhS2V5SW5mb1Q6OmlzRXF1YWwoZ2V0QnVja2V0cygpW2ldLmdldEZpcnN0KCksIGdldFRvbWJzdG9uZUtleSgpKSkKKyAgICAgICAgICA6Om5ldyAoJmdldEJ1Y2tldHMoKVtpXS5nZXRTZWNvbmQoKSkKKyAgICAgICAgICAgICAgVmFsdWVUKG90aGVyLmdldEJ1Y2tldHMoKVtpXS5nZXRTZWNvbmQoKSk7CisgICAgICB9CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IEtleVQgJlZhbCkgeworICAgIHJldHVybiBLZXlJbmZvVDo6Z2V0SGFzaFZhbHVlKFZhbCk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBMb29rdXBLZXlUPgorICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IExvb2t1cEtleVQgJlZhbCkgeworICAgIHJldHVybiBLZXlJbmZvVDo6Z2V0SGFzaFZhbHVlKFZhbCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgS2V5VCBnZXRFbXB0eUtleSgpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfYmFzZV9vZjxEZW5zZU1hcEJhc2UsIERlcml2ZWRUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiTXVzdCBwYXNzIHRoZSBkZXJpdmVkIHR5cGUgdG8gdGhpcyB0ZW1wbGF0ZSEiKTsKKyAgICByZXR1cm4gS2V5SW5mb1Q6OmdldEVtcHR5S2V5KCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgS2V5VCBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgcmV0dXJuIEtleUluZm9UOjpnZXRUb21ic3RvbmVLZXkoKTsKKyAgfQorCitwcml2YXRlOgorICBpdGVyYXRvciBtYWtlSXRlcmF0b3IoQnVja2V0VCAqUCwgQnVja2V0VCAqRSwKKyAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnRXBvY2hCYXNlICZFcG9jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTm9BZHZhbmNlPWZhbHNlKSB7CisgICAgaWYgKHNob3VsZFJldmVyc2VJdGVyYXRlPEtleVQ+KCkpIHsKKyAgICAgIEJ1Y2tldFQgKkIgPSBQID09IGdldEJ1Y2tldHNFbmQoKSA/IGdldEJ1Y2tldHMoKSA6IFAgKyAxOworICAgICAgcmV0dXJuIGl0ZXJhdG9yKEIsIEUsIEVwb2NoLCBOb0FkdmFuY2UpOworICAgIH0KKyAgICByZXR1cm4gaXRlcmF0b3IoUCwgRSwgRXBvY2gsIE5vQWR2YW5jZSk7CisgIH0KKworICBjb25zdF9pdGVyYXRvciBtYWtlQ29uc3RJdGVyYXRvcihjb25zdCBCdWNrZXRUICpQLCBjb25zdCBCdWNrZXRUICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z0Vwb2NoQmFzZSAmRXBvY2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJvb2wgTm9BZHZhbmNlPWZhbHNlKSBjb25zdCB7CisgICAgaWYgKHNob3VsZFJldmVyc2VJdGVyYXRlPEtleVQ+KCkpIHsKKyAgICAgIGNvbnN0IEJ1Y2tldFQgKkIgPSBQID09IGdldEJ1Y2tldHNFbmQoKSA/IGdldEJ1Y2tldHMoKSA6IFAgKyAxOworICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKEIsIEUsIEVwb2NoLCBOb0FkdmFuY2UpOworICAgIH0KKyAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoUCwgRSwgRXBvY2gsIE5vQWR2YW5jZSk7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1FbnRyaWVzKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkVCAqPih0aGlzKS0+Z2V0TnVtRW50cmllcygpOworICB9CisKKyAgdm9pZCBzZXROdW1FbnRyaWVzKHVuc2lnbmVkIE51bSkgeworICAgIHN0YXRpY19jYXN0PERlcml2ZWRUICo+KHRoaXMpLT5zZXROdW1FbnRyaWVzKE51bSk7CisgIH0KKworICB2b2lkIGluY3JlbWVudE51bUVudHJpZXMoKSB7CisgICAgc2V0TnVtRW50cmllcyhnZXROdW1FbnRyaWVzKCkgKyAxKTsKKyAgfQorCisgIHZvaWQgZGVjcmVtZW50TnVtRW50cmllcygpIHsKKyAgICBzZXROdW1FbnRyaWVzKGdldE51bUVudHJpZXMoKSAtIDEpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtVG9tYnN0b25lcygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZFQgKj4odGhpcyktPmdldE51bVRvbWJzdG9uZXMoKTsKKyAgfQorCisgIHZvaWQgc2V0TnVtVG9tYnN0b25lcyh1bnNpZ25lZCBOdW0pIHsKKyAgICBzdGF0aWNfY2FzdDxEZXJpdmVkVCAqPih0aGlzKS0+c2V0TnVtVG9tYnN0b25lcyhOdW0pOworICB9CisKKyAgdm9pZCBpbmNyZW1lbnROdW1Ub21ic3RvbmVzKCkgeworICAgIHNldE51bVRvbWJzdG9uZXMoZ2V0TnVtVG9tYnN0b25lcygpICsgMSk7CisgIH0KKworICB2b2lkIGRlY3JlbWVudE51bVRvbWJzdG9uZXMoKSB7CisgICAgc2V0TnVtVG9tYnN0b25lcyhnZXROdW1Ub21ic3RvbmVzKCkgLSAxKTsKKyAgfQorCisgIGNvbnN0IEJ1Y2tldFQgKmdldEJ1Y2tldHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWRUICo+KHRoaXMpLT5nZXRCdWNrZXRzKCk7CisgIH0KKworICBCdWNrZXRUICpnZXRCdWNrZXRzKCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkVCAqPih0aGlzKS0+Z2V0QnVja2V0cygpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtQnVja2V0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZFQgKj4odGhpcyktPmdldE51bUJ1Y2tldHMoKTsKKyAgfQorCisgIEJ1Y2tldFQgKmdldEJ1Y2tldHNFbmQoKSB7CisgICAgcmV0dXJuIGdldEJ1Y2tldHMoKSArIGdldE51bUJ1Y2tldHMoKTsKKyAgfQorCisgIGNvbnN0IEJ1Y2tldFQgKmdldEJ1Y2tldHNFbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEJ1Y2tldHMoKSArIGdldE51bUJ1Y2tldHMoKTsKKyAgfQorCisgIHZvaWQgZ3Jvdyh1bnNpZ25lZCBBdExlYXN0KSB7CisgICAgc3RhdGljX2Nhc3Q8RGVyaXZlZFQgKj4odGhpcyktPmdyb3coQXRMZWFzdCk7CisgIH0KKworICB2b2lkIHNocmlua19hbmRfY2xlYXIoKSB7CisgICAgc3RhdGljX2Nhc3Q8RGVyaXZlZFQgKj4odGhpcyktPnNocmlua19hbmRfY2xlYXIoKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXlBcmcsIHR5cGVuYW1lLi4uIFZhbHVlQXJncz4KKyAgQnVja2V0VCAqSW5zZXJ0SW50b0J1Y2tldChCdWNrZXRUICpUaGVCdWNrZXQsIEtleUFyZyAmJktleSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUFyZ3MgJiYuLi4gVmFsdWVzKSB7CisgICAgVGhlQnVja2V0ID0gSW5zZXJ0SW50b0J1Y2tldEltcGwoS2V5LCBLZXksIFRoZUJ1Y2tldCk7CisKKyAgICBUaGVCdWNrZXQtPmdldEZpcnN0KCkgPSBzdGQ6OmZvcndhcmQ8S2V5QXJnPihLZXkpOworICAgIDo6bmV3ICgmVGhlQnVja2V0LT5nZXRTZWNvbmQoKSkgVmFsdWVUKHN0ZDo6Zm9yd2FyZDxWYWx1ZUFyZ3M+KFZhbHVlcykuLi4pOworICAgIHJldHVybiBUaGVCdWNrZXQ7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTG9va3VwS2V5VD4KKyAgQnVja2V0VCAqSW5zZXJ0SW50b0J1Y2tldFdpdGhMb29rdXAoQnVja2V0VCAqVGhlQnVja2V0LCBLZXlUICYmS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVQgJiZWYWx1ZSwgTG9va3VwS2V5VCAmTG9va3VwKSB7CisgICAgVGhlQnVja2V0ID0gSW5zZXJ0SW50b0J1Y2tldEltcGwoS2V5LCBMb29rdXAsIFRoZUJ1Y2tldCk7CisKKyAgICBUaGVCdWNrZXQtPmdldEZpcnN0KCkgPSBzdGQ6Om1vdmUoS2V5KTsKKyAgICA6Om5ldyAoJlRoZUJ1Y2tldC0+Z2V0U2Vjb25kKCkpIFZhbHVlVChzdGQ6Om1vdmUoVmFsdWUpKTsKKyAgICByZXR1cm4gVGhlQnVja2V0OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIExvb2t1cEtleVQ+CisgIEJ1Y2tldFQgKkluc2VydEludG9CdWNrZXRJbXBsKGNvbnN0IEtleVQgJktleSwgY29uc3QgTG9va3VwS2V5VCAmTG9va3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWNrZXRUICpUaGVCdWNrZXQpIHsKKyAgICBpbmNyZW1lbnRFcG9jaCgpOworCisgICAgLy8gSWYgdGhlIGxvYWQgb2YgdGhlIGhhc2ggdGFibGUgaXMgbW9yZSB0aGFuIDMvNCwgb3IgaWYgZmV3ZXIgdGhhbiAxLzggb2YKKyAgICAvLyB0aGUgYnVja2V0cyBhcmUgZW1wdHkgKG1lYW5pbmcgdGhhdCBtYW55IGFyZSBmaWxsZWQgd2l0aCB0b21ic3RvbmVzKSwKKyAgICAvLyBncm93IHRoZSB0YWJsZS4KKyAgICAvLworICAgIC8vIFRoZSBsYXRlciBjYXNlIGlzIHRyaWNreS4gIEZvciBleGFtcGxlLCBpZiB3ZSBoYWQgb25lIGVtcHR5IGJ1Y2tldCB3aXRoCisgICAgLy8gdG9ucyBvZiB0b21ic3RvbmVzLCBmYWlsaW5nIGxvb2t1cHMgKGUuZy4gZm9yIGluc2VydGlvbikgd291bGQgaGF2ZSB0bworICAgIC8vIHByb2JlIGFsbW9zdCB0aGUgZW50aXJlIHRhYmxlIHVudGlsIGl0IGZvdW5kIHRoZSBlbXB0eSBidWNrZXQuICBJZiB0aGUKKyAgICAvLyB0YWJsZSBjb21wbGV0ZWx5IGZpbGxlZCB3aXRoIHRvbWJzdG9uZXMsIG5vIGxvb2t1cCB3b3VsZCBldmVyIHN1Y2NlZWQsCisgICAgLy8gY2F1c2luZyBpbmZpbml0ZSBsb29wcyBpbiBsb29rdXAuCisgICAgdW5zaWduZWQgTmV3TnVtRW50cmllcyA9IGdldE51bUVudHJpZXMoKSArIDE7CisgICAgdW5zaWduZWQgTnVtQnVja2V0cyA9IGdldE51bUJ1Y2tldHMoKTsKKyAgICBpZiAoTExWTV9VTkxJS0VMWShOZXdOdW1FbnRyaWVzICogNCA+PSBOdW1CdWNrZXRzICogMykpIHsKKyAgICAgIHRoaXMtPmdyb3coTnVtQnVja2V0cyAqIDIpOworICAgICAgTG9va3VwQnVja2V0Rm9yKExvb2t1cCwgVGhlQnVja2V0KTsKKyAgICAgIE51bUJ1Y2tldHMgPSBnZXROdW1CdWNrZXRzKCk7CisgICAgfSBlbHNlIGlmIChMTFZNX1VOTElLRUxZKE51bUJ1Y2tldHMtKE5ld051bUVudHJpZXMrZ2V0TnVtVG9tYnN0b25lcygpKSA8PQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1CdWNrZXRzLzgpKSB7CisgICAgICB0aGlzLT5ncm93KE51bUJ1Y2tldHMpOworICAgICAgTG9va3VwQnVja2V0Rm9yKExvb2t1cCwgVGhlQnVja2V0KTsKKyAgICB9CisgICAgYXNzZXJ0KFRoZUJ1Y2tldCk7CisKKyAgICAvLyBPbmx5IHVwZGF0ZSB0aGUgc3RhdGUgYWZ0ZXIgd2UndmUgZ3Jvd24gb3VyIGJ1Y2tldCBzcGFjZSBhcHByb3ByaWF0ZWx5CisgICAgLy8gc28gdGhhdCB3aGVuIGdyb3dpbmcgYnVja2V0cyB3ZSBoYXZlIHNlbGYtY29uc2lzdGVudCBlbnRyeSBjb3VudC4KKyAgICBpbmNyZW1lbnROdW1FbnRyaWVzKCk7CisKKyAgICAvLyBJZiB3ZSBhcmUgd3JpdGluZyBvdmVyIGEgdG9tYnN0b25lLCByZW1lbWJlciB0aGlzLgorICAgIGNvbnN0IEtleVQgRW1wdHlLZXkgPSBnZXRFbXB0eUtleSgpOworICAgIGlmICghS2V5SW5mb1Q6OmlzRXF1YWwoVGhlQnVja2V0LT5nZXRGaXJzdCgpLCBFbXB0eUtleSkpCisgICAgICBkZWNyZW1lbnROdW1Ub21ic3RvbmVzKCk7CisKKyAgICByZXR1cm4gVGhlQnVja2V0OworICB9CisKKyAgLy8vIExvb2t1cEJ1Y2tldEZvciAtIExvb2t1cCB0aGUgYXBwcm9wcmlhdGUgYnVja2V0IGZvciBWYWwsIHJldHVybmluZyBpdCBpbgorICAvLy8gRm91bmRCdWNrZXQuICBJZiB0aGUgYnVja2V0IGNvbnRhaW5zIHRoZSBrZXkgYW5kIGEgdmFsdWUsIHRoaXMgcmV0dXJucworICAvLy8gdHJ1ZSwgb3RoZXJ3aXNlIGl0IHJldHVybnMgYSBidWNrZXQgd2l0aCBhbiBlbXB0eSBtYXJrZXIgb3IgdG9tYnN0b25lIGFuZAorICAvLy8gcmV0dXJucyBmYWxzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTG9va3VwS2V5VD4KKyAgYm9vbCBMb29rdXBCdWNrZXRGb3IoY29uc3QgTG9va3VwS2V5VCAmVmFsLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCdWNrZXRUIComRm91bmRCdWNrZXQpIGNvbnN0IHsKKyAgICBjb25zdCBCdWNrZXRUICpCdWNrZXRzUHRyID0gZ2V0QnVja2V0cygpOworICAgIGNvbnN0IHVuc2lnbmVkIE51bUJ1Y2tldHMgPSBnZXROdW1CdWNrZXRzKCk7CisKKyAgICBpZiAoTnVtQnVja2V0cyA9PSAwKSB7CisgICAgICBGb3VuZEJ1Y2tldCA9IG51bGxwdHI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gRm91bmRUb21ic3RvbmUgLSBLZWVwIHRyYWNrIG9mIHdoZXRoZXIgd2UgZmluZCBhIHRvbWJzdG9uZSB3aGlsZSBwcm9iaW5nLgorICAgIGNvbnN0IEJ1Y2tldFQgKkZvdW5kVG9tYnN0b25lID0gbnVsbHB0cjsKKyAgICBjb25zdCBLZXlUIEVtcHR5S2V5ID0gZ2V0RW1wdHlLZXkoKTsKKyAgICBjb25zdCBLZXlUIFRvbWJzdG9uZUtleSA9IGdldFRvbWJzdG9uZUtleSgpOworICAgIGFzc2VydCghS2V5SW5mb1Q6OmlzRXF1YWwoVmFsLCBFbXB0eUtleSkgJiYKKyAgICAgICAgICAgIUtleUluZm9UOjppc0VxdWFsKFZhbCwgVG9tYnN0b25lS2V5KSAmJgorICAgICAgICAgICAiRW1wdHkvVG9tYnN0b25lIHZhbHVlIHNob3VsZG4ndCBiZSBpbnNlcnRlZCBpbnRvIG1hcCEiKTsKKworICAgIHVuc2lnbmVkIEJ1Y2tldE5vID0gZ2V0SGFzaFZhbHVlKFZhbCkgJiAoTnVtQnVja2V0cy0xKTsKKyAgICB1bnNpZ25lZCBQcm9iZUFtdCA9IDE7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGNvbnN0IEJ1Y2tldFQgKlRoaXNCdWNrZXQgPSBCdWNrZXRzUHRyICsgQnVja2V0Tm87CisgICAgICAvLyBGb3VuZCBWYWwncyBidWNrZXQ/ICBJZiBzbywgcmV0dXJuIGl0LgorICAgICAgaWYgKExMVk1fTElLRUxZKEtleUluZm9UOjppc0VxdWFsKFZhbCwgVGhpc0J1Y2tldC0+Z2V0Rmlyc3QoKSkpKSB7CisgICAgICAgIEZvdW5kQnVja2V0ID0gVGhpc0J1Y2tldDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIC8vIElmIHdlIGZvdW5kIGFuIGVtcHR5IGJ1Y2tldCwgdGhlIGtleSBkb2Vzbid0IGV4aXN0IGluIHRoZSBzZXQuCisgICAgICAvLyBJbnNlcnQgaXQgYW5kIHJldHVybiB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICAgIGlmIChMTFZNX0xJS0VMWShLZXlJbmZvVDo6aXNFcXVhbChUaGlzQnVja2V0LT5nZXRGaXJzdCgpLCBFbXB0eUtleSkpKSB7CisgICAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgc2VlbiBhIHRvbWJzdG9uZSB3aGlsZSBwcm9iaW5nLCBmaWxsIGl0IGluIGluc3RlYWQKKyAgICAgICAgLy8gb2YgdGhlIGVtcHR5IGJ1Y2tldCB3ZSBldmVudHVhbGx5IHByb2JlZCB0by4KKyAgICAgICAgRm91bmRCdWNrZXQgPSBGb3VuZFRvbWJzdG9uZSA/IEZvdW5kVG9tYnN0b25lIDogVGhpc0J1Y2tldDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICAvLyBJZiB0aGlzIGlzIGEgdG9tYnN0b25lLCByZW1lbWJlciBpdC4gIElmIFZhbCBlbmRzIHVwIG5vdCBpbiB0aGUgbWFwLCB3ZQorICAgICAgLy8gcHJlZmVyIHRvIHJldHVybiBpdCB0aGFuIHNvbWV0aGluZyB0aGF0IHdvdWxkIHJlcXVpcmUgbW9yZSBwcm9iaW5nLgorICAgICAgaWYgKEtleUluZm9UOjppc0VxdWFsKFRoaXNCdWNrZXQtPmdldEZpcnN0KCksIFRvbWJzdG9uZUtleSkgJiYKKyAgICAgICAgICAhRm91bmRUb21ic3RvbmUpCisgICAgICAgIEZvdW5kVG9tYnN0b25lID0gVGhpc0J1Y2tldDsgIC8vIFJlbWVtYmVyIHRoZSBmaXJzdCB0b21ic3RvbmUgZm91bmQuCisKKyAgICAgIC8vIE90aGVyd2lzZSwgaXQncyBhIGhhc2ggY29sbGlzaW9uIG9yIGEgdG9tYnN0b25lLCBjb250aW51ZSBxdWFkcmF0aWMKKyAgICAgIC8vIHByb2JpbmcuCisgICAgICBCdWNrZXRObyArPSBQcm9iZUFtdCsrOworICAgICAgQnVja2V0Tm8gJj0gKE51bUJ1Y2tldHMtMSk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIExvb2t1cEtleVQ+CisgIGJvb2wgTG9va3VwQnVja2V0Rm9yKGNvbnN0IExvb2t1cEtleVQgJlZhbCwgQnVja2V0VCAqJkZvdW5kQnVja2V0KSB7CisgICAgY29uc3QgQnVja2V0VCAqQ29uc3RGb3VuZEJ1Y2tldDsKKyAgICBib29sIFJlc3VsdCA9IGNvbnN0X2Nhc3Q8Y29uc3QgRGVuc2VNYXBCYXNlICo+KHRoaXMpCisgICAgICAtPkxvb2t1cEJ1Y2tldEZvcihWYWwsIENvbnN0Rm91bmRCdWNrZXQpOworICAgIEZvdW5kQnVja2V0ID0gY29uc3RfY2FzdDxCdWNrZXRUICo+KENvbnN0Rm91bmRCdWNrZXQpOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworcHVibGljOgorICAvLy8gUmV0dXJuIHRoZSBhcHByb3hpbWF0ZSBzaXplIChpbiBieXRlcykgb2YgdGhlIGFjdHVhbCBtYXAuCisgIC8vLyBUaGlzIGlzIGp1c3QgdGhlIHJhdyBtZW1vcnkgdXNlZCBieSBEZW5zZU1hcC4KKyAgLy8vIElmIGVudHJpZXMgYXJlIHBvaW50ZXJzIHRvIG9iamVjdHMsIHRoZSBzaXplIG9mIHRoZSByZWZlcmVuY2VkIG9iamVjdHMKKyAgLy8vIGFyZSBub3QgaW5jbHVkZWQuCisgIHNpemVfdCBnZXRNZW1vcnlTaXplKCkgY29uc3QgeworICAgIHJldHVybiBnZXROdW1CdWNrZXRzKCkgKiBzaXplb2YoQnVja2V0VCk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWx1ZVQsCisgICAgICAgICAgdHlwZW5hbWUgS2V5SW5mb1QgPSBEZW5zZU1hcEluZm88S2V5VD4sCisgICAgICAgICAgdHlwZW5hbWUgQnVja2V0VCA9IGRldGFpbDo6RGVuc2VNYXBQYWlyPEtleVQsIFZhbHVlVD4+CitjbGFzcyBEZW5zZU1hcCA6IHB1YmxpYyBEZW5zZU1hcEJhc2U8RGVuc2VNYXA8S2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0VD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0VD4geworICBmcmllbmQgY2xhc3MgRGVuc2VNYXBCYXNlPERlbnNlTWFwLCBLZXlULCBWYWx1ZVQsIEtleUluZm9ULCBCdWNrZXRUPjsKKworICAvLyBMaWZ0IHNvbWUgdHlwZXMgZnJvbSB0aGUgZGVwZW5kZW50IGJhc2UgY2xhc3MgaW50byB0aGlzIGNsYXNzIGZvcgorICAvLyBzaW1wbGljaXR5IG9mIHJlZmVycmluZyB0byB0aGVtLgorICB1c2luZyBCYXNlVCA9IERlbnNlTWFwQmFzZTxEZW5zZU1hcCwgS2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0VD47CisKKyAgQnVja2V0VCAqQnVja2V0czsKKyAgdW5zaWduZWQgTnVtRW50cmllczsKKyAgdW5zaWduZWQgTnVtVG9tYnN0b25lczsKKyAgdW5zaWduZWQgTnVtQnVja2V0czsKKworcHVibGljOgorICAvLy8gQ3JlYXRlIGEgRGVuc2VNYXAgd3RoIGFuIG9wdGlvbmFsIFxwIEluaXRpYWxSZXNlcnZlIHRoYXQgZ3VhcmFudGVlIHRoYXQKKyAgLy8vIHRoaXMgbnVtYmVyIG9mIGVsZW1lbnRzIGNhbiBiZSBpbnNlcnRlZCBpbiB0aGUgbWFwIHdpdGhvdXQgZ3JvdygpCisgIGV4cGxpY2l0IERlbnNlTWFwKHVuc2lnbmVkIEluaXRpYWxSZXNlcnZlID0gMCkgeyBpbml0KEluaXRpYWxSZXNlcnZlKTsgfQorCisgIERlbnNlTWFwKGNvbnN0IERlbnNlTWFwICZvdGhlcikgOiBCYXNlVCgpIHsKKyAgICBpbml0KDApOworICAgIGNvcHlGcm9tKG90aGVyKTsKKyAgfQorCisgIERlbnNlTWFwKERlbnNlTWFwICYmb3RoZXIpIDogQmFzZVQoKSB7CisgICAgaW5pdCgwKTsKKyAgICBzd2FwKG90aGVyKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXQ+CisgIERlbnNlTWFwKGNvbnN0IElucHV0SXQgJkksIGNvbnN0IElucHV0SXQgJkUpIHsKKyAgICBpbml0KHN0ZDo6ZGlzdGFuY2UoSSwgRSkpOworICAgIHRoaXMtPmluc2VydChJLCBFKTsKKyAgfQorCisgIH5EZW5zZU1hcCgpIHsKKyAgICB0aGlzLT5kZXN0cm95QWxsKCk7CisgICAgb3BlcmF0b3IgZGVsZXRlKEJ1Y2tldHMpOworICB9CisKKyAgdm9pZCBzd2FwKERlbnNlTWFwJiBSSFMpIHsKKyAgICB0aGlzLT5pbmNyZW1lbnRFcG9jaCgpOworICAgIFJIUy5pbmNyZW1lbnRFcG9jaCgpOworICAgIHN0ZDo6c3dhcChCdWNrZXRzLCBSSFMuQnVja2V0cyk7CisgICAgc3RkOjpzd2FwKE51bUVudHJpZXMsIFJIUy5OdW1FbnRyaWVzKTsKKyAgICBzdGQ6OnN3YXAoTnVtVG9tYnN0b25lcywgUkhTLk51bVRvbWJzdG9uZXMpOworICAgIHN0ZDo6c3dhcChOdW1CdWNrZXRzLCBSSFMuTnVtQnVja2V0cyk7CisgIH0KKworICBEZW5zZU1hcCYgb3BlcmF0b3I9KGNvbnN0IERlbnNlTWFwJiBvdGhlcikgeworICAgIGlmICgmb3RoZXIgIT0gdGhpcykKKyAgICAgIGNvcHlGcm9tKG90aGVyKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBEZW5zZU1hcCYgb3BlcmF0b3I9KERlbnNlTWFwICYmb3RoZXIpIHsKKyAgICB0aGlzLT5kZXN0cm95QWxsKCk7CisgICAgb3BlcmF0b3IgZGVsZXRlKEJ1Y2tldHMpOworICAgIGluaXQoMCk7CisgICAgc3dhcChvdGhlcik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdm9pZCBjb3B5RnJvbShjb25zdCBEZW5zZU1hcCYgb3RoZXIpIHsKKyAgICB0aGlzLT5kZXN0cm95QWxsKCk7CisgICAgb3BlcmF0b3IgZGVsZXRlKEJ1Y2tldHMpOworICAgIGlmIChhbGxvY2F0ZUJ1Y2tldHMob3RoZXIuTnVtQnVja2V0cykpIHsKKyAgICAgIHRoaXMtPkJhc2VUOjpjb3B5RnJvbShvdGhlcik7CisgICAgfSBlbHNlIHsKKyAgICAgIE51bUVudHJpZXMgPSAwOworICAgICAgTnVtVG9tYnN0b25lcyA9IDA7CisgICAgfQorICB9CisKKyAgdm9pZCBpbml0KHVuc2lnbmVkIEluaXROdW1FbnRyaWVzKSB7CisgICAgYXV0byBJbml0QnVja2V0cyA9IEJhc2VUOjpnZXRNaW5CdWNrZXRUb1Jlc2VydmVGb3JFbnRyaWVzKEluaXROdW1FbnRyaWVzKTsKKyAgICBpZiAoYWxsb2NhdGVCdWNrZXRzKEluaXRCdWNrZXRzKSkgeworICAgICAgdGhpcy0+QmFzZVQ6OmluaXRFbXB0eSgpOworICAgIH0gZWxzZSB7CisgICAgICBOdW1FbnRyaWVzID0gMDsKKyAgICAgIE51bVRvbWJzdG9uZXMgPSAwOworICAgIH0KKyAgfQorCisgIHZvaWQgZ3Jvdyh1bnNpZ25lZCBBdExlYXN0KSB7CisgICAgdW5zaWduZWQgT2xkTnVtQnVja2V0cyA9IE51bUJ1Y2tldHM7CisgICAgQnVja2V0VCAqT2xkQnVja2V0cyA9IEJ1Y2tldHM7CisKKyAgICBhbGxvY2F0ZUJ1Y2tldHMoc3RkOjptYXg8dW5zaWduZWQ+KDY0LCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oTmV4dFBvd2VyT2YyKEF0TGVhc3QtMSkpKSk7CisgICAgYXNzZXJ0KEJ1Y2tldHMpOworICAgIGlmICghT2xkQnVja2V0cykgeworICAgICAgdGhpcy0+QmFzZVQ6OmluaXRFbXB0eSgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHRoaXMtPm1vdmVGcm9tT2xkQnVja2V0cyhPbGRCdWNrZXRzLCBPbGRCdWNrZXRzK09sZE51bUJ1Y2tldHMpOworCisgICAgLy8gRnJlZSB0aGUgb2xkIHRhYmxlLgorICAgIG9wZXJhdG9yIGRlbGV0ZShPbGRCdWNrZXRzKTsKKyAgfQorCisgIHZvaWQgc2hyaW5rX2FuZF9jbGVhcigpIHsKKyAgICB1bnNpZ25lZCBPbGROdW1FbnRyaWVzID0gTnVtRW50cmllczsKKyAgICB0aGlzLT5kZXN0cm95QWxsKCk7CisKKyAgICAvLyBSZWR1Y2UgdGhlIG51bWJlciBvZiBidWNrZXRzLgorICAgIHVuc2lnbmVkIE5ld051bUJ1Y2tldHMgPSAwOworICAgIGlmIChPbGROdW1FbnRyaWVzKQorICAgICAgTmV3TnVtQnVja2V0cyA9IHN0ZDo6bWF4KDY0LCAxIDw8IChMb2cyXzMyX0NlaWwoT2xkTnVtRW50cmllcykgKyAxKSk7CisgICAgaWYgKE5ld051bUJ1Y2tldHMgPT0gTnVtQnVja2V0cykgeworICAgICAgdGhpcy0+QmFzZVQ6OmluaXRFbXB0eSgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG9wZXJhdG9yIGRlbGV0ZShCdWNrZXRzKTsKKyAgICBpbml0KE5ld051bUJ1Y2tldHMpOworICB9CisKK3ByaXZhdGU6CisgIHVuc2lnbmVkIGdldE51bUVudHJpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIE51bUVudHJpZXM7CisgIH0KKworICB2b2lkIHNldE51bUVudHJpZXModW5zaWduZWQgTnVtKSB7CisgICAgTnVtRW50cmllcyA9IE51bTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bVRvbWJzdG9uZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIE51bVRvbWJzdG9uZXM7CisgIH0KKworICB2b2lkIHNldE51bVRvbWJzdG9uZXModW5zaWduZWQgTnVtKSB7CisgICAgTnVtVG9tYnN0b25lcyA9IE51bTsKKyAgfQorCisgIEJ1Y2tldFQgKmdldEJ1Y2tldHMoKSBjb25zdCB7CisgICAgcmV0dXJuIEJ1Y2tldHM7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1CdWNrZXRzKCkgY29uc3QgeworICAgIHJldHVybiBOdW1CdWNrZXRzOworICB9CisKKyAgYm9vbCBhbGxvY2F0ZUJ1Y2tldHModW5zaWduZWQgTnVtKSB7CisgICAgTnVtQnVja2V0cyA9IE51bTsKKyAgICBpZiAoTnVtQnVja2V0cyA9PSAwKSB7CisgICAgICBCdWNrZXRzID0gbnVsbHB0cjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBCdWNrZXRzID0gc3RhdGljX2Nhc3Q8QnVja2V0VCo+KG9wZXJhdG9yIG5ldyhzaXplb2YoQnVja2V0VCkgKiBOdW1CdWNrZXRzKSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWx1ZVQsIHVuc2lnbmVkIElubGluZUJ1Y2tldHMgPSA0LAorICAgICAgICAgIHR5cGVuYW1lIEtleUluZm9UID0gRGVuc2VNYXBJbmZvPEtleVQ+LAorICAgICAgICAgIHR5cGVuYW1lIEJ1Y2tldFQgPSBkZXRhaWw6OkRlbnNlTWFwUGFpcjxLZXlULCBWYWx1ZVQ+PgorY2xhc3MgU21hbGxEZW5zZU1hcAorICAgIDogcHVibGljIERlbnNlTWFwQmFzZTwKKyAgICAgICAgICBTbWFsbERlbnNlTWFwPEtleVQsIFZhbHVlVCwgSW5saW5lQnVja2V0cywgS2V5SW5mb1QsIEJ1Y2tldFQ+LCBLZXlULAorICAgICAgICAgIFZhbHVlVCwgS2V5SW5mb1QsIEJ1Y2tldFQ+IHsKKyAgZnJpZW5kIGNsYXNzIERlbnNlTWFwQmFzZTxTbWFsbERlbnNlTWFwLCBLZXlULCBWYWx1ZVQsIEtleUluZm9ULCBCdWNrZXRUPjsKKworICAvLyBMaWZ0IHNvbWUgdHlwZXMgZnJvbSB0aGUgZGVwZW5kZW50IGJhc2UgY2xhc3MgaW50byB0aGlzIGNsYXNzIGZvcgorICAvLyBzaW1wbGljaXR5IG9mIHJlZmVycmluZyB0byB0aGVtLgorICB1c2luZyBCYXNlVCA9IERlbnNlTWFwQmFzZTxTbWFsbERlbnNlTWFwLCBLZXlULCBWYWx1ZVQsIEtleUluZm9ULCBCdWNrZXRUPjsKKworICBzdGF0aWNfYXNzZXJ0KGlzUG93ZXJPZjJfNjQoSW5saW5lQnVja2V0cyksCisgICAgICAgICAgICAgICAgIklubGluZUJ1Y2tldHMgbXVzdCBiZSBhIHBvd2VyIG9mIDIuIik7CisKKyAgdW5zaWduZWQgU21hbGwgOiAxOworICB1bnNpZ25lZCBOdW1FbnRyaWVzIDogMzE7CisgIHVuc2lnbmVkIE51bVRvbWJzdG9uZXM7CisKKyAgc3RydWN0IExhcmdlUmVwIHsKKyAgICBCdWNrZXRUICpCdWNrZXRzOworICAgIHVuc2lnbmVkIE51bUJ1Y2tldHM7CisgIH07CisKKyAgLy8vIEEgInVuaW9uIiBvZiBhbiBpbmxpbmUgYnVja2V0IGFycmF5IGFuZCB0aGUgc3RydWN0IHJlcHJlc2VudGluZworICAvLy8gYSBsYXJnZSBidWNrZXQuIFRoaXMgdW5pb24gd2lsbCBiZSBkaXNjcmltaW5hdGVkIGJ5IHRoZSAnU21hbGwnIGJpdC4KKyAgQWxpZ25lZENoYXJBcnJheVVuaW9uPEJ1Y2tldFRbSW5saW5lQnVja2V0c10sIExhcmdlUmVwPiBzdG9yYWdlOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFNtYWxsRGVuc2VNYXAodW5zaWduZWQgTnVtSW5pdEJ1Y2tldHMgPSAwKSB7CisgICAgaW5pdChOdW1Jbml0QnVja2V0cyk7CisgIH0KKworICBTbWFsbERlbnNlTWFwKGNvbnN0IFNtYWxsRGVuc2VNYXAgJm90aGVyKSA6IEJhc2VUKCkgeworICAgIGluaXQoMCk7CisgICAgY29weUZyb20ob3RoZXIpOworICB9CisKKyAgU21hbGxEZW5zZU1hcChTbWFsbERlbnNlTWFwICYmb3RoZXIpIDogQmFzZVQoKSB7CisgICAgaW5pdCgwKTsKKyAgICBzd2FwKG90aGVyKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXQ+CisgIFNtYWxsRGVuc2VNYXAoY29uc3QgSW5wdXRJdCAmSSwgY29uc3QgSW5wdXRJdCAmRSkgeworICAgIGluaXQoTmV4dFBvd2VyT2YyKHN0ZDo6ZGlzdGFuY2UoSSwgRSkpKTsKKyAgICB0aGlzLT5pbnNlcnQoSSwgRSk7CisgIH0KKworICB+U21hbGxEZW5zZU1hcCgpIHsKKyAgICB0aGlzLT5kZXN0cm95QWxsKCk7CisgICAgZGVhbGxvY2F0ZUJ1Y2tldHMoKTsKKyAgfQorCisgIHZvaWQgc3dhcChTbWFsbERlbnNlTWFwJiBSSFMpIHsKKyAgICB1bnNpZ25lZCBUbXBOdW1FbnRyaWVzID0gUkhTLk51bUVudHJpZXM7CisgICAgUkhTLk51bUVudHJpZXMgPSBOdW1FbnRyaWVzOworICAgIE51bUVudHJpZXMgPSBUbXBOdW1FbnRyaWVzOworICAgIHN0ZDo6c3dhcChOdW1Ub21ic3RvbmVzLCBSSFMuTnVtVG9tYnN0b25lcyk7CisKKyAgICBjb25zdCBLZXlUIEVtcHR5S2V5ID0gdGhpcy0+Z2V0RW1wdHlLZXkoKTsKKyAgICBjb25zdCBLZXlUIFRvbWJzdG9uZUtleSA9IHRoaXMtPmdldFRvbWJzdG9uZUtleSgpOworICAgIGlmIChTbWFsbCAmJiBSSFMuU21hbGwpIHsKKyAgICAgIC8vIElmIHdlJ3JlIHN3YXBwaW5nIGlubGluZSBidWNrZXQgYXJyYXlzLCB3ZSBoYXZlIHRvIGNvcGUgd2l0aCBzb21lIG9mCisgICAgICAvLyB0aGUgdHJpY2t5IGJpdHMgb2YgRGVuc2VNYXAncyBzdG9yYWdlIHN5c3RlbTogdGhlIGJ1Y2tldHMgYXJlIG5vdAorICAgICAgLy8gZnVsbHkgaW5pdGlhbGl6ZWQuIFRodXMgd2Ugc3dhcCBldmVyeSBrZXksIGJ1dCB3ZSBtYXkgaGF2ZQorICAgICAgLy8gYSBvbmUtZGlyZWN0aW9uYWwgbW92ZSBvZiB0aGUgdmFsdWUuCisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gSW5saW5lQnVja2V0czsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgQnVja2V0VCAqTEhTQiA9ICZnZXRJbmxpbmVCdWNrZXRzKClbaV0sCisgICAgICAgICAgICAgICAgKlJIU0IgPSAmUkhTLmdldElubGluZUJ1Y2tldHMoKVtpXTsKKyAgICAgICAgYm9vbCBoYXNMSFNWYWx1ZSA9ICghS2V5SW5mb1Q6OmlzRXF1YWwoTEhTQi0+Z2V0Rmlyc3QoKSwgRW1wdHlLZXkpICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIUtleUluZm9UOjppc0VxdWFsKExIU0ItPmdldEZpcnN0KCksIFRvbWJzdG9uZUtleSkpOworICAgICAgICBib29sIGhhc1JIU1ZhbHVlID0gKCFLZXlJbmZvVDo6aXNFcXVhbChSSFNCLT5nZXRGaXJzdCgpLCBFbXB0eUtleSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAhS2V5SW5mb1Q6OmlzRXF1YWwoUkhTQi0+Z2V0Rmlyc3QoKSwgVG9tYnN0b25lS2V5KSk7CisgICAgICAgIGlmIChoYXNMSFNWYWx1ZSAmJiBoYXNSSFNWYWx1ZSkgeworICAgICAgICAgIC8vIFN3YXAgdG9nZXRoZXIgaWYgd2UgY2FuLi4uCisgICAgICAgICAgc3RkOjpzd2FwKCpMSFNCLCAqUkhTQik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgLy8gU3dhcCBzZXBhcmF0ZWx5IGFuZCBoYW5kbGUgYW55IGFzc3ltZXRyeS4KKyAgICAgICAgc3RkOjpzd2FwKExIU0ItPmdldEZpcnN0KCksIFJIU0ItPmdldEZpcnN0KCkpOworICAgICAgICBpZiAoaGFzTEhTVmFsdWUpIHsKKyAgICAgICAgICA6Om5ldyAoJlJIU0ItPmdldFNlY29uZCgpKSBWYWx1ZVQoc3RkOjptb3ZlKExIU0ItPmdldFNlY29uZCgpKSk7CisgICAgICAgICAgTEhTQi0+Z2V0U2Vjb25kKCkuflZhbHVlVCgpOworICAgICAgICB9IGVsc2UgaWYgKGhhc1JIU1ZhbHVlKSB7CisgICAgICAgICAgOjpuZXcgKCZMSFNCLT5nZXRTZWNvbmQoKSkgVmFsdWVUKHN0ZDo6bW92ZShSSFNCLT5nZXRTZWNvbmQoKSkpOworICAgICAgICAgIFJIU0ItPmdldFNlY29uZCgpLn5WYWx1ZVQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiAoIVNtYWxsICYmICFSSFMuU21hbGwpIHsKKyAgICAgIHN0ZDo6c3dhcChnZXRMYXJnZVJlcCgpLT5CdWNrZXRzLCBSSFMuZ2V0TGFyZ2VSZXAoKS0+QnVja2V0cyk7CisgICAgICBzdGQ6OnN3YXAoZ2V0TGFyZ2VSZXAoKS0+TnVtQnVja2V0cywgUkhTLmdldExhcmdlUmVwKCktPk51bUJ1Y2tldHMpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIFNtYWxsRGVuc2VNYXAgJlNtYWxsU2lkZSA9IFNtYWxsID8gKnRoaXMgOiBSSFM7CisgICAgU21hbGxEZW5zZU1hcCAmTGFyZ2VTaWRlID0gU21hbGwgPyBSSFMgOiAqdGhpczsKKworICAgIC8vIEZpcnN0IHN0YXNoIHRoZSBsYXJnZSBzaWRlJ3MgcmVwIGFuZCBtb3ZlIHRoZSBzbWFsbCBzaWRlIGFjcm9zcy4KKyAgICBMYXJnZVJlcCBUbXBSZXAgPSBzdGQ6Om1vdmUoKkxhcmdlU2lkZS5nZXRMYXJnZVJlcCgpKTsKKyAgICBMYXJnZVNpZGUuZ2V0TGFyZ2VSZXAoKS0+fkxhcmdlUmVwKCk7CisgICAgTGFyZ2VTaWRlLlNtYWxsID0gdHJ1ZTsKKyAgICAvLyBUaGlzIGlzIHNpbWlsYXIgdG8gdGhlIHN0YW5kYXJkIG1vdmUtZnJvbS1vbGQtYnVja2V0cywgYnV0IHRoZSBidWNrZXQKKyAgICAvLyBjb3VudCBoYXNuJ3QgYWN0dWFsbHkgcm90YXRlZCBpbiB0aGlzIGNhc2UuIFNvIHdlIGhhdmUgdG8gY2FyZWZ1bGx5CisgICAgLy8gbW92ZSBjb25zdHJ1Y3QgdGhlIGtleXMgYW5kIHZhbHVlcyBpbnRvIHRoZWlyIG5ldyBsb2NhdGlvbnMsIGJ1dCB0aGVyZQorICAgIC8vIGlzIG5vIG5lZWQgdG8gcmUtaGFzaCB0aGluZ3MuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IElubGluZUJ1Y2tldHM7IGkgIT0gZTsgKytpKSB7CisgICAgICBCdWNrZXRUICpOZXdCID0gJkxhcmdlU2lkZS5nZXRJbmxpbmVCdWNrZXRzKClbaV0sCisgICAgICAgICAgICAgICpPbGRCID0gJlNtYWxsU2lkZS5nZXRJbmxpbmVCdWNrZXRzKClbaV07CisgICAgICA6Om5ldyAoJk5ld0ItPmdldEZpcnN0KCkpIEtleVQoc3RkOjptb3ZlKE9sZEItPmdldEZpcnN0KCkpKTsKKyAgICAgIE9sZEItPmdldEZpcnN0KCkufktleVQoKTsKKyAgICAgIGlmICghS2V5SW5mb1Q6OmlzRXF1YWwoTmV3Qi0+Z2V0Rmlyc3QoKSwgRW1wdHlLZXkpICYmCisgICAgICAgICAgIUtleUluZm9UOjppc0VxdWFsKE5ld0ItPmdldEZpcnN0KCksIFRvbWJzdG9uZUtleSkpIHsKKyAgICAgICAgOjpuZXcgKCZOZXdCLT5nZXRTZWNvbmQoKSkgVmFsdWVUKHN0ZDo6bW92ZShPbGRCLT5nZXRTZWNvbmQoKSkpOworICAgICAgICBPbGRCLT5nZXRTZWNvbmQoKS5+VmFsdWVUKCk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gVGhlIGhhcmQgcGFydCBvZiBtb3ZpbmcgdGhlIHNtYWxsIGJ1Y2tldHMgYWNyb3NzIGlzIGRvbmUsIGp1c3QgbW92ZQorICAgIC8vIHRoZSBUbXBSZXAgaW50byBpdHMgbmV3IGhvbWUuCisgICAgU21hbGxTaWRlLlNtYWxsID0gZmFsc2U7CisgICAgbmV3IChTbWFsbFNpZGUuZ2V0TGFyZ2VSZXAoKSkgTGFyZ2VSZXAoc3RkOjptb3ZlKFRtcFJlcCkpOworICB9CisKKyAgU21hbGxEZW5zZU1hcCYgb3BlcmF0b3I9KGNvbnN0IFNtYWxsRGVuc2VNYXAmIG90aGVyKSB7CisgICAgaWYgKCZvdGhlciAhPSB0aGlzKQorICAgICAgY29weUZyb20ob3RoZXIpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFNtYWxsRGVuc2VNYXAmIG9wZXJhdG9yPShTbWFsbERlbnNlTWFwICYmb3RoZXIpIHsKKyAgICB0aGlzLT5kZXN0cm95QWxsKCk7CisgICAgZGVhbGxvY2F0ZUJ1Y2tldHMoKTsKKyAgICBpbml0KDApOworICAgIHN3YXAob3RoZXIpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZvaWQgY29weUZyb20oY29uc3QgU21hbGxEZW5zZU1hcCYgb3RoZXIpIHsKKyAgICB0aGlzLT5kZXN0cm95QWxsKCk7CisgICAgZGVhbGxvY2F0ZUJ1Y2tldHMoKTsKKyAgICBTbWFsbCA9IHRydWU7CisgICAgaWYgKG90aGVyLmdldE51bUJ1Y2tldHMoKSA+IElubGluZUJ1Y2tldHMpIHsKKyAgICAgIFNtYWxsID0gZmFsc2U7CisgICAgICBuZXcgKGdldExhcmdlUmVwKCkpIExhcmdlUmVwKGFsbG9jYXRlQnVja2V0cyhvdGhlci5nZXROdW1CdWNrZXRzKCkpKTsKKyAgICB9CisgICAgdGhpcy0+QmFzZVQ6OmNvcHlGcm9tKG90aGVyKTsKKyAgfQorCisgIHZvaWQgaW5pdCh1bnNpZ25lZCBJbml0QnVja2V0cykgeworICAgIFNtYWxsID0gdHJ1ZTsKKyAgICBpZiAoSW5pdEJ1Y2tldHMgPiBJbmxpbmVCdWNrZXRzKSB7CisgICAgICBTbWFsbCA9IGZhbHNlOworICAgICAgbmV3IChnZXRMYXJnZVJlcCgpKSBMYXJnZVJlcChhbGxvY2F0ZUJ1Y2tldHMoSW5pdEJ1Y2tldHMpKTsKKyAgICB9CisgICAgdGhpcy0+QmFzZVQ6OmluaXRFbXB0eSgpOworICB9CisKKyAgdm9pZCBncm93KHVuc2lnbmVkIEF0TGVhc3QpIHsKKyAgICBpZiAoQXRMZWFzdCA+PSBJbmxpbmVCdWNrZXRzKQorICAgICAgQXRMZWFzdCA9IHN0ZDo6bWF4PHVuc2lnbmVkPig2NCwgTmV4dFBvd2VyT2YyKEF0TGVhc3QtMSkpOworCisgICAgaWYgKFNtYWxsKSB7CisgICAgICBpZiAoQXRMZWFzdCA8IElubGluZUJ1Y2tldHMpCisgICAgICAgIHJldHVybjsgLy8gTm90aGluZyB0byBkby4KKworICAgICAgLy8gRmlyc3QgbW92ZSB0aGUgaW5saW5lIGJ1Y2tldHMgaW50byBhIHRlbXBvcmFyeSBzdG9yYWdlLgorICAgICAgQWxpZ25lZENoYXJBcnJheVVuaW9uPEJ1Y2tldFRbSW5saW5lQnVja2V0c10+IFRtcFN0b3JhZ2U7CisgICAgICBCdWNrZXRUICpUbXBCZWdpbiA9IHJlaW50ZXJwcmV0X2Nhc3Q8QnVja2V0VCAqPihUbXBTdG9yYWdlLmJ1ZmZlcik7CisgICAgICBCdWNrZXRUICpUbXBFbmQgPSBUbXBCZWdpbjsKKworICAgICAgLy8gTG9vcCBvdmVyIHRoZSBidWNrZXRzLCBtb3Zpbmcgbm9uLWVtcHR5LCBub24tdG9tYnN0b25lcyBpbnRvIHRoZQorICAgICAgLy8gdGVtcG9yYXJ5IHN0b3JhZ2UuIEhhdmUgdGhlIGxvb3AgbW92ZSB0aGUgVG1wRW5kIGZvcndhcmQgYXMgaXQgZ29lcy4KKyAgICAgIGNvbnN0IEtleVQgRW1wdHlLZXkgPSB0aGlzLT5nZXRFbXB0eUtleSgpOworICAgICAgY29uc3QgS2V5VCBUb21ic3RvbmVLZXkgPSB0aGlzLT5nZXRUb21ic3RvbmVLZXkoKTsKKyAgICAgIGZvciAoQnVja2V0VCAqUCA9IGdldEJ1Y2tldHMoKSwgKkUgPSBQICsgSW5saW5lQnVja2V0czsgUCAhPSBFOyArK1ApIHsKKyAgICAgICAgaWYgKCFLZXlJbmZvVDo6aXNFcXVhbChQLT5nZXRGaXJzdCgpLCBFbXB0eUtleSkgJiYKKyAgICAgICAgICAgICFLZXlJbmZvVDo6aXNFcXVhbChQLT5nZXRGaXJzdCgpLCBUb21ic3RvbmVLZXkpKSB7CisgICAgICAgICAgYXNzZXJ0KHNpemVfdChUbXBFbmQgLSBUbXBCZWdpbikgPCBJbmxpbmVCdWNrZXRzICYmCisgICAgICAgICAgICAgICAgICJUb28gbWFueSBpbmxpbmUgYnVja2V0cyEiKTsKKyAgICAgICAgICA6Om5ldyAoJlRtcEVuZC0+Z2V0Rmlyc3QoKSkgS2V5VChzdGQ6Om1vdmUoUC0+Z2V0Rmlyc3QoKSkpOworICAgICAgICAgIDo6bmV3ICgmVG1wRW5kLT5nZXRTZWNvbmQoKSkgVmFsdWVUKHN0ZDo6bW92ZShQLT5nZXRTZWNvbmQoKSkpOworICAgICAgICAgICsrVG1wRW5kOworICAgICAgICAgIFAtPmdldFNlY29uZCgpLn5WYWx1ZVQoKTsKKyAgICAgICAgfQorICAgICAgICBQLT5nZXRGaXJzdCgpLn5LZXlUKCk7CisgICAgICB9CisKKyAgICAgIC8vIE5vdyBtYWtlIHRoaXMgbWFwIHVzZSB0aGUgbGFyZ2UgcmVwLCBhbmQgbW92ZSBhbGwgdGhlIGVudHJpZXMgYmFjaworICAgICAgLy8gaW50byBpdC4KKyAgICAgIFNtYWxsID0gZmFsc2U7CisgICAgICBuZXcgKGdldExhcmdlUmVwKCkpIExhcmdlUmVwKGFsbG9jYXRlQnVja2V0cyhBdExlYXN0KSk7CisgICAgICB0aGlzLT5tb3ZlRnJvbU9sZEJ1Y2tldHMoVG1wQmVnaW4sIFRtcEVuZCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgTGFyZ2VSZXAgT2xkUmVwID0gc3RkOjptb3ZlKCpnZXRMYXJnZVJlcCgpKTsKKyAgICBnZXRMYXJnZVJlcCgpLT5+TGFyZ2VSZXAoKTsKKyAgICBpZiAoQXRMZWFzdCA8PSBJbmxpbmVCdWNrZXRzKSB7CisgICAgICBTbWFsbCA9IHRydWU7CisgICAgfSBlbHNlIHsKKyAgICAgIG5ldyAoZ2V0TGFyZ2VSZXAoKSkgTGFyZ2VSZXAoYWxsb2NhdGVCdWNrZXRzKEF0TGVhc3QpKTsKKyAgICB9CisKKyAgICB0aGlzLT5tb3ZlRnJvbU9sZEJ1Y2tldHMoT2xkUmVwLkJ1Y2tldHMsIE9sZFJlcC5CdWNrZXRzK09sZFJlcC5OdW1CdWNrZXRzKTsKKworICAgIC8vIEZyZWUgdGhlIG9sZCB0YWJsZS4KKyAgICBvcGVyYXRvciBkZWxldGUoT2xkUmVwLkJ1Y2tldHMpOworICB9CisKKyAgdm9pZCBzaHJpbmtfYW5kX2NsZWFyKCkgeworICAgIHVuc2lnbmVkIE9sZFNpemUgPSB0aGlzLT5zaXplKCk7CisgICAgdGhpcy0+ZGVzdHJveUFsbCgpOworCisgICAgLy8gUmVkdWNlIHRoZSBudW1iZXIgb2YgYnVja2V0cy4KKyAgICB1bnNpZ25lZCBOZXdOdW1CdWNrZXRzID0gMDsKKyAgICBpZiAoT2xkU2l6ZSkgeworICAgICAgTmV3TnVtQnVja2V0cyA9IDEgPDwgKExvZzJfMzJfQ2VpbChPbGRTaXplKSArIDEpOworICAgICAgaWYgKE5ld051bUJ1Y2tldHMgPiBJbmxpbmVCdWNrZXRzICYmIE5ld051bUJ1Y2tldHMgPCA2NHUpCisgICAgICAgIE5ld051bUJ1Y2tldHMgPSA2NDsKKyAgICB9CisgICAgaWYgKChTbWFsbCAmJiBOZXdOdW1CdWNrZXRzIDw9IElubGluZUJ1Y2tldHMpIHx8CisgICAgICAgICghU21hbGwgJiYgTmV3TnVtQnVja2V0cyA9PSBnZXRMYXJnZVJlcCgpLT5OdW1CdWNrZXRzKSkgeworICAgICAgdGhpcy0+QmFzZVQ6OmluaXRFbXB0eSgpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGRlYWxsb2NhdGVCdWNrZXRzKCk7CisgICAgaW5pdChOZXdOdW1CdWNrZXRzKTsKKyAgfQorCitwcml2YXRlOgorICB1bnNpZ25lZCBnZXROdW1FbnRyaWVzKCkgY29uc3QgeworICAgIHJldHVybiBOdW1FbnRyaWVzOworICB9CisKKyAgdm9pZCBzZXROdW1FbnRyaWVzKHVuc2lnbmVkIE51bSkgeworICAgIC8vIE51bUVudHJpZXMgaXMgaGFyZGNvZGVkIHRvIGJlIDMxIGJpdHMgd2lkZS4KKyAgICBhc3NlcnQoTnVtIDwgKDFVIDw8IDMxKSAmJiAiQ2Fubm90IHN1cHBvcnQgbW9yZSB0aGFuIDE8PDMxIGVudHJpZXMiKTsKKyAgICBOdW1FbnRyaWVzID0gTnVtOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtVG9tYnN0b25lcygpIGNvbnN0IHsKKyAgICByZXR1cm4gTnVtVG9tYnN0b25lczsKKyAgfQorCisgIHZvaWQgc2V0TnVtVG9tYnN0b25lcyh1bnNpZ25lZCBOdW0pIHsKKyAgICBOdW1Ub21ic3RvbmVzID0gTnVtOworICB9CisKKyAgY29uc3QgQnVja2V0VCAqZ2V0SW5saW5lQnVja2V0cygpIGNvbnN0IHsKKyAgICBhc3NlcnQoU21hbGwpOworICAgIC8vIE5vdGUgdGhhdCB0aGlzIGNhc3QgZG9lcyBub3QgdmlvbGF0ZSBhbGlhc2luZyBydWxlcyBhcyB3ZSBhc3NlcnQgdGhhdAorICAgIC8vIHRoZSBtZW1vcnkncyBkeW5hbWljIHR5cGUgaXMgdGhlIHNtYWxsLCBpbmxpbmUgYnVja2V0IGJ1ZmZlciwgYW5kIHRoZQorICAgIC8vICdzdG9yYWdlLmJ1ZmZlcicgc3RhdGljIHR5cGUgaXMgJ2NoYXIgKicuCisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQnVja2V0VCAqPihzdG9yYWdlLmJ1ZmZlcik7CisgIH0KKworICBCdWNrZXRUICpnZXRJbmxpbmVCdWNrZXRzKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PEJ1Y2tldFQgKj4oCisgICAgICBjb25zdF9jYXN0PGNvbnN0IFNtYWxsRGVuc2VNYXAgKj4odGhpcyktPmdldElubGluZUJ1Y2tldHMoKSk7CisgIH0KKworICBjb25zdCBMYXJnZVJlcCAqZ2V0TGFyZ2VSZXAoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFTbWFsbCk7CisgICAgLy8gTm90ZSwgc2FtZSBydWxlIGFib3V0IGFsaWFzaW5nIGFzIHdpdGggZ2V0SW5saW5lQnVja2V0cy4KKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBMYXJnZVJlcCAqPihzdG9yYWdlLmJ1ZmZlcik7CisgIH0KKworICBMYXJnZVJlcCAqZ2V0TGFyZ2VSZXAoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TGFyZ2VSZXAgKj4oCisgICAgICBjb25zdF9jYXN0PGNvbnN0IFNtYWxsRGVuc2VNYXAgKj4odGhpcyktPmdldExhcmdlUmVwKCkpOworICB9CisKKyAgY29uc3QgQnVja2V0VCAqZ2V0QnVja2V0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gU21hbGwgPyBnZXRJbmxpbmVCdWNrZXRzKCkgOiBnZXRMYXJnZVJlcCgpLT5CdWNrZXRzOworICB9CisKKyAgQnVja2V0VCAqZ2V0QnVja2V0cygpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxCdWNrZXRUICo+KAorICAgICAgY29uc3RfY2FzdDxjb25zdCBTbWFsbERlbnNlTWFwICo+KHRoaXMpLT5nZXRCdWNrZXRzKCkpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtQnVja2V0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gU21hbGwgPyBJbmxpbmVCdWNrZXRzIDogZ2V0TGFyZ2VSZXAoKS0+TnVtQnVja2V0czsKKyAgfQorCisgIHZvaWQgZGVhbGxvY2F0ZUJ1Y2tldHMoKSB7CisgICAgaWYgKFNtYWxsKQorICAgICAgcmV0dXJuOworCisgICAgb3BlcmF0b3IgZGVsZXRlKGdldExhcmdlUmVwKCktPkJ1Y2tldHMpOworICAgIGdldExhcmdlUmVwKCktPn5MYXJnZVJlcCgpOworICB9CisKKyAgTGFyZ2VSZXAgYWxsb2NhdGVCdWNrZXRzKHVuc2lnbmVkIE51bSkgeworICAgIGFzc2VydChOdW0gPiBJbmxpbmVCdWNrZXRzICYmICJNdXN0IGFsbG9jYXRlIG1vcmUgYnVja2V0cyB0aGFuIGFyZSBpbmxpbmUiKTsKKyAgICBMYXJnZVJlcCBSZXAgPSB7CisgICAgICBzdGF0aWNfY2FzdDxCdWNrZXRUKj4ob3BlcmF0b3IgbmV3KHNpemVvZihCdWNrZXRUKSAqIE51bSkpLCBOdW0KKyAgICB9OworICAgIHJldHVybiBSZXA7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWx1ZVQsIHR5cGVuYW1lIEtleUluZm9ULCB0eXBlbmFtZSBCdWNrZXQsCisgICAgICAgICAgYm9vbCBJc0NvbnN0PgorY2xhc3MgRGVuc2VNYXBJdGVyYXRvciA6IERlYnVnRXBvY2hCYXNlOjpIYW5kbGVCYXNlIHsKKyAgZnJpZW5kIGNsYXNzIERlbnNlTWFwSXRlcmF0b3I8S2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0LCB0cnVlPjsKKyAgZnJpZW5kIGNsYXNzIERlbnNlTWFwSXRlcmF0b3I8S2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0LCBmYWxzZT47CisKKyAgdXNpbmcgQ29uc3RJdGVyYXRvciA9IERlbnNlTWFwSXRlcmF0b3I8S2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0LCB0cnVlPjsKKworcHVibGljOgorICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSBwdHJkaWZmX3Q7CisgIHVzaW5nIHZhbHVlX3R5cGUgPQorICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxJc0NvbnN0LCBjb25zdCBCdWNrZXQsIEJ1Y2tldD46OnR5cGU7CisgIHVzaW5nIHBvaW50ZXIgPSB2YWx1ZV90eXBlICo7CisgIHVzaW5nIHJlZmVyZW5jZSA9IHZhbHVlX3R5cGUgJjsKKyAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnOworCitwcml2YXRlOgorICBwb2ludGVyIFB0ciA9IG51bGxwdHI7CisgIHBvaW50ZXIgRW5kID0gbnVsbHB0cjsKKworcHVibGljOgorICBEZW5zZU1hcEl0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgIERlbnNlTWFwSXRlcmF0b3IocG9pbnRlciBQb3MsIHBvaW50ZXIgRSwgY29uc3QgRGVidWdFcG9jaEJhc2UgJkVwb2NoLAorICAgICAgICAgICAgICAgICAgIGJvb2wgTm9BZHZhbmNlID0gZmFsc2UpCisgICAgICA6IERlYnVnRXBvY2hCYXNlOjpIYW5kbGVCYXNlKCZFcG9jaCksIFB0cihQb3MpLCBFbmQoRSkgeworICAgIGFzc2VydChpc0hhbmRsZUluU3luYygpICYmICJpbnZhbGlkIGNvbnN0cnVjdGlvbiEiKTsKKworICAgIGlmIChOb0FkdmFuY2UpIHJldHVybjsKKyAgICBpZiAoc2hvdWxkUmV2ZXJzZUl0ZXJhdGU8S2V5VD4oKSkgeworICAgICAgUmV0cmVhdFBhc3RFbXB0eUJ1Y2tldHMoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgQWR2YW5jZVBhc3RFbXB0eUJ1Y2tldHMoKTsKKyAgfQorCisgIC8vIENvbnZlcnRpbmcgY3RvciBmcm9tIG5vbi1jb25zdCBpdGVyYXRvcnMgdG8gY29uc3QgaXRlcmF0b3JzLiBTRklOQUUnZCBvdXQKKyAgLy8gZm9yIGNvbnN0IGl0ZXJhdG9yIGRlc3RpbmF0aW9ucyBzbyBpdCBkb2Vzbid0IGVuZCB1cCBhcyBhIHVzZXIgZGVmaW5lZCBjb3B5CisgIC8vIGNvbnN0cnVjdG9yLgorICB0ZW1wbGF0ZSA8Ym9vbCBJc0NvbnN0U3JjLAorICAgICAgICAgICAgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhSXNDb25zdFNyYyAmJiBJc0NvbnN0Pjo6dHlwZT4KKyAgRGVuc2VNYXBJdGVyYXRvcigKKyAgICAgIGNvbnN0IERlbnNlTWFwSXRlcmF0b3I8S2V5VCwgVmFsdWVULCBLZXlJbmZvVCwgQnVja2V0LCBJc0NvbnN0U3JjPiAmSSkKKyAgICAgIDogRGVidWdFcG9jaEJhc2U6OkhhbmRsZUJhc2UoSSksIFB0cihJLlB0ciksIEVuZChJLkVuZCkge30KKworICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeworICAgIGFzc2VydChpc0hhbmRsZUluU3luYygpICYmICJpbnZhbGlkIGl0ZXJhdG9yIGFjY2VzcyEiKTsKKyAgICBpZiAoc2hvdWxkUmV2ZXJzZUl0ZXJhdGU8S2V5VD4oKSkKKyAgICAgIHJldHVybiBQdHJbLTFdOworICAgIHJldHVybiAqUHRyOworICB9CisgIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNIYW5kbGVJblN5bmMoKSAmJiAiaW52YWxpZCBpdGVyYXRvciBhY2Nlc3MhIik7CisgICAgaWYgKHNob3VsZFJldmVyc2VJdGVyYXRlPEtleVQ+KCkpCisgICAgICByZXR1cm4gJihQdHJbLTFdKTsKKyAgICByZXR1cm4gUHRyOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENvbnN0SXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgIGFzc2VydCgoIVB0ciB8fCBpc0hhbmRsZUluU3luYygpKSAmJiAiaGFuZGxlIG5vdCBpbiBzeW5jISIpOworICAgIGFzc2VydCgoIVJIUy5QdHIgfHwgUkhTLmlzSGFuZGxlSW5TeW5jKCkpICYmICJoYW5kbGUgbm90IGluIHN5bmMhIik7CisgICAgYXNzZXJ0KGdldEVwb2NoQWRkcmVzcygpID09IFJIUy5nZXRFcG9jaEFkZHJlc3MoKSAmJgorICAgICAgICAgICAiY29tcGFyaW5nIGluY29tcGFyYWJsZSBpdGVyYXRvcnMhIik7CisgICAgcmV0dXJuIFB0ciA9PSBSSFMuUHRyOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDb25zdEl0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoKCFQdHIgfHwgaXNIYW5kbGVJblN5bmMoKSkgJiYgImhhbmRsZSBub3QgaW4gc3luYyEiKTsKKyAgICBhc3NlcnQoKCFSSFMuUHRyIHx8IFJIUy5pc0hhbmRsZUluU3luYygpKSAmJiAiaGFuZGxlIG5vdCBpbiBzeW5jISIpOworICAgIGFzc2VydChnZXRFcG9jaEFkZHJlc3MoKSA9PSBSSFMuZ2V0RXBvY2hBZGRyZXNzKCkgJiYKKyAgICAgICAgICAgImNvbXBhcmluZyBpbmNvbXBhcmFibGUgaXRlcmF0b3JzISIpOworICAgIHJldHVybiBQdHIgIT0gUkhTLlB0cjsKKyAgfQorCisgIGlubGluZSBEZW5zZU1hcEl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyAgLy8gUHJlaW5jcmVtZW50CisgICAgYXNzZXJ0KGlzSGFuZGxlSW5TeW5jKCkgJiYgImludmFsaWQgaXRlcmF0b3IgYWNjZXNzISIpOworICAgIGlmIChzaG91bGRSZXZlcnNlSXRlcmF0ZTxLZXlUPigpKSB7CisgICAgICAtLVB0cjsKKyAgICAgIFJldHJlYXRQYXN0RW1wdHlCdWNrZXRzKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgICsrUHRyOworICAgIEFkdmFuY2VQYXN0RW1wdHlCdWNrZXRzKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIERlbnNlTWFwSXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgIC8vIFBvc3RpbmNyZW1lbnQKKyAgICBhc3NlcnQoaXNIYW5kbGVJblN5bmMoKSAmJiAiaW52YWxpZCBpdGVyYXRvciBhY2Nlc3MhIik7CisgICAgRGVuc2VNYXBJdGVyYXRvciB0bXAgPSAqdGhpczsgKysqdGhpczsgcmV0dXJuIHRtcDsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIEFkdmFuY2VQYXN0RW1wdHlCdWNrZXRzKCkgeworICAgIGFzc2VydChQdHIgPD0gRW5kKTsKKyAgICBjb25zdCBLZXlUIEVtcHR5ID0gS2V5SW5mb1Q6OmdldEVtcHR5S2V5KCk7CisgICAgY29uc3QgS2V5VCBUb21ic3RvbmUgPSBLZXlJbmZvVDo6Z2V0VG9tYnN0b25lS2V5KCk7CisKKyAgICB3aGlsZSAoUHRyICE9IEVuZCAmJiAoS2V5SW5mb1Q6OmlzRXF1YWwoUHRyLT5nZXRGaXJzdCgpLCBFbXB0eSkgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5SW5mb1Q6OmlzRXF1YWwoUHRyLT5nZXRGaXJzdCgpLCBUb21ic3RvbmUpKSkKKyAgICAgICsrUHRyOworICB9CisKKyAgdm9pZCBSZXRyZWF0UGFzdEVtcHR5QnVja2V0cygpIHsKKyAgICBhc3NlcnQoUHRyID49IEVuZCk7CisgICAgY29uc3QgS2V5VCBFbXB0eSA9IEtleUluZm9UOjpnZXRFbXB0eUtleSgpOworICAgIGNvbnN0IEtleVQgVG9tYnN0b25lID0gS2V5SW5mb1Q6OmdldFRvbWJzdG9uZUtleSgpOworCisgICAgd2hpbGUgKFB0ciAhPSBFbmQgJiYgKEtleUluZm9UOjppc0VxdWFsKFB0clstMV0uZ2V0Rmlyc3QoKSwgRW1wdHkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgIEtleUluZm9UOjppc0VxdWFsKFB0clstMV0uZ2V0Rmlyc3QoKSwgVG9tYnN0b25lKSkpCisgICAgICAtLVB0cjsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbHVlVCwgdHlwZW5hbWUgS2V5SW5mb1Q+CitpbmxpbmUgc2l6ZV90IGNhcGFjaXR5X2luX2J5dGVzKGNvbnN0IERlbnNlTWFwPEtleVQsIFZhbHVlVCwgS2V5SW5mb1Q+ICZYKSB7CisgIHJldHVybiBYLmdldE1lbW9yeVNpemUoKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX0RFTlNFTUFQX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0RlbnNlTWFwSW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvRGVuc2VNYXBJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTk2OTA0YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0RlbnNlTWFwSW5mby5oCkBAIC0wLDAgKzEsMjY3IEBACisvLz09PS0gbGx2bS9BRFQvRGVuc2VNYXBJbmZvLmggLSBUeXBlIHRyYWl0cyBmb3IgRGVuc2VNYXAgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIERlbnNlTWFwSW5mbyB0cmFpdHMgZm9yIERlbnNlTWFwLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfREVOU0VNQVBJTkZPX0gKKyNkZWZpbmUgTExWTV9BRFRfREVOU0VNQVBJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSGFzaGluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Qb2ludGVyTGlrZVR5cGVUcmFpdHMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgRGVuc2VNYXBJbmZvIHsKKyAgLy9zdGF0aWMgaW5saW5lIFQgZ2V0RW1wdHlLZXkoKTsKKyAgLy9zdGF0aWMgaW5saW5lIFQgZ2V0VG9tYnN0b25lS2V5KCk7CisgIC8vc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBUICZWYWwpOworICAvL3N0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgVCAmTEhTLCBjb25zdCBUICZSSFMpOworfTsKKworLy8gUHJvdmlkZSBEZW5zZU1hcEluZm8gZm9yIGFsbCBwb2ludGVycy4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgRGVuc2VNYXBJbmZvPFQqPiB7CisgIHN0YXRpYyBpbmxpbmUgVCogZ2V0RW1wdHlLZXkoKSB7CisgICAgdWludHB0cl90IFZhbCA9IHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oLTEpOworICAgIFZhbCA8PD0gUG9pbnRlckxpa2VUeXBlVHJhaXRzPFQqPjo6TnVtTG93Qml0c0F2YWlsYWJsZTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUKj4oVmFsKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgVCogZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHVpbnRwdHJfdCBWYWwgPSBzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KC0yKTsKKyAgICBWYWwgPDw9IFBvaW50ZXJMaWtlVHlwZVRyYWl0czxUKj46Ok51bUxvd0JpdHNBdmFpbGFibGU7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KFZhbCk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IFQgKlB0clZhbCkgeworICAgIHJldHVybiAodW5zaWduZWQoKHVpbnRwdHJfdClQdHJWYWwpID4+IDQpIF4KKyAgICAgICAgICAgKHVuc2lnbmVkKCh1aW50cHRyX3QpUHRyVmFsKSA+PiA5KTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgVCAqTEhTLCBjb25zdCBUICpSSFMpIHsgcmV0dXJuIExIUyA9PSBSSFM7IH0KK307CisKKy8vIFByb3ZpZGUgRGVuc2VNYXBJbmZvIGZvciBjaGFycy4KK3RlbXBsYXRlPD4gc3RydWN0IERlbnNlTWFwSW5mbzxjaGFyPiB7CisgIHN0YXRpYyBpbmxpbmUgY2hhciBnZXRFbXB0eUtleSgpIHsgcmV0dXJuIH4wOyB9CisgIHN0YXRpYyBpbmxpbmUgY2hhciBnZXRUb21ic3RvbmVLZXkoKSB7IHJldHVybiB+MCAtIDE7IH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBjaGFyJiBWYWwpIHsgcmV0dXJuIFZhbCAqIDM3VTsgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgY2hhciAmTEhTLCBjb25zdCBjaGFyICZSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKKworLy8gUHJvdmlkZSBEZW5zZU1hcEluZm8gZm9yIHVuc2lnbmVkIHNob3J0cy4KK3RlbXBsYXRlIDw+IHN0cnVjdCBEZW5zZU1hcEluZm88dW5zaWduZWQgc2hvcnQ+IHsKKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBzaG9ydCBnZXRFbXB0eUtleSgpIHsgcmV0dXJuIDB4RkZGRjsgfQorICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIHNob3J0IGdldFRvbWJzdG9uZUtleSgpIHsgcmV0dXJuIDB4RkZGRiAtIDE7IH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCB1bnNpZ25lZCBzaG9ydCAmVmFsKSB7IHJldHVybiBWYWwgKiAzN1U7IH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IHVuc2lnbmVkIHNob3J0ICZMSFMsIGNvbnN0IHVuc2lnbmVkIHNob3J0ICZSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKKworLy8gUHJvdmlkZSBEZW5zZU1hcEluZm8gZm9yIHVuc2lnbmVkIGludHMuCit0ZW1wbGF0ZTw+IHN0cnVjdCBEZW5zZU1hcEluZm88dW5zaWduZWQ+IHsKKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBnZXRFbXB0eUtleSgpIHsgcmV0dXJuIH4wVTsgfQorICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldFRvbWJzdG9uZUtleSgpIHsgcmV0dXJuIH4wVSAtIDE7IH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCB1bnNpZ25lZCYgVmFsKSB7IHJldHVybiBWYWwgKiAzN1U7IH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IHVuc2lnbmVkJiBMSFMsIGNvbnN0IHVuc2lnbmVkJiBSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKKworLy8gUHJvdmlkZSBEZW5zZU1hcEluZm8gZm9yIHVuc2lnbmVkIGxvbmdzLgordGVtcGxhdGU8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPHVuc2lnbmVkIGxvbmc+IHsKKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGdldEVtcHR5S2V5KCkgeyByZXR1cm4gfjBVTDsgfQorICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGxvbmcgZ2V0VG9tYnN0b25lS2V5KCkgeyByZXR1cm4gfjBVTCAtIDFMOyB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCB1bnNpZ25lZCBsb25nJiBWYWwpIHsKKyAgICByZXR1cm4gKHVuc2lnbmVkKShWYWwgKiAzN1VMKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgdW5zaWduZWQgbG9uZyYgTEhTLCBjb25zdCB1bnNpZ25lZCBsb25nJiBSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKKworLy8gUHJvdmlkZSBEZW5zZU1hcEluZm8gZm9yIHVuc2lnbmVkIGxvbmcgbG9uZ3MuCit0ZW1wbGF0ZTw+IHN0cnVjdCBEZW5zZU1hcEluZm88dW5zaWduZWQgbG9uZyBsb25nPiB7CisgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIGdldEVtcHR5S2V5KCkgeyByZXR1cm4gfjBVTEw7IH0KKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIGxvbmcgZ2V0VG9tYnN0b25lS2V5KCkgeyByZXR1cm4gfjBVTEwgLSAxVUxMOyB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcmIFZhbCkgeworICAgIHJldHVybiAodW5zaWduZWQpKFZhbCAqIDM3VUxMKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgdW5zaWduZWQgbG9uZyBsb25nJiBMSFMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nJiBSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKKworLy8gUHJvdmlkZSBEZW5zZU1hcEluZm8gZm9yIHNob3J0cy4KK3RlbXBsYXRlIDw+IHN0cnVjdCBEZW5zZU1hcEluZm88c2hvcnQ+IHsKKyAgc3RhdGljIGlubGluZSBzaG9ydCBnZXRFbXB0eUtleSgpIHsgcmV0dXJuIDB4N0ZGRjsgfQorICBzdGF0aWMgaW5saW5lIHNob3J0IGdldFRvbWJzdG9uZUtleSgpIHsgcmV0dXJuIC0weDdGRkYgLSAxOyB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3Qgc2hvcnQgJlZhbCkgeyByZXR1cm4gVmFsICogMzdVOyB9CisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3Qgc2hvcnQgJkxIUywgY29uc3Qgc2hvcnQgJlJIUykgeyByZXR1cm4gTEhTID09IFJIUzsgfQorfTsKKworLy8gUHJvdmlkZSBEZW5zZU1hcEluZm8gZm9yIGludHMuCit0ZW1wbGF0ZTw+IHN0cnVjdCBEZW5zZU1hcEluZm88aW50PiB7CisgIHN0YXRpYyBpbmxpbmUgaW50IGdldEVtcHR5S2V5KCkgeyByZXR1cm4gMHg3ZmZmZmZmZjsgfQorICBzdGF0aWMgaW5saW5lIGludCBnZXRUb21ic3RvbmVLZXkoKSB7IHJldHVybiAtMHg3ZmZmZmZmZiAtIDE7IH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBpbnQmIFZhbCkgeyByZXR1cm4gKHVuc2lnbmVkKShWYWwgKiAzN1UpOyB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBpbnQmIExIUywgY29uc3QgaW50JiBSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKKworLy8gUHJvdmlkZSBEZW5zZU1hcEluZm8gZm9yIGxvbmdzLgordGVtcGxhdGU8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPGxvbmc+IHsKKyAgc3RhdGljIGlubGluZSBsb25nIGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiAoMVVMIDw8IChzaXplb2YobG9uZykgKiA4IC0gMSkpIC0gMVVMOworICB9CisKKyAgc3RhdGljIGlubGluZSBsb25nIGdldFRvbWJzdG9uZUtleSgpIHsgcmV0dXJuIGdldEVtcHR5S2V5KCkgLSAxTDsgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgbG9uZyYgVmFsKSB7CisgICAgcmV0dXJuICh1bnNpZ25lZCkoVmFsICogMzdVTCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IGxvbmcmIExIUywgY29uc3QgbG9uZyYgUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisKKy8vIFByb3ZpZGUgRGVuc2VNYXBJbmZvIGZvciBsb25nIGxvbmdzLgordGVtcGxhdGU8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPGxvbmcgbG9uZz4geworICBzdGF0aWMgaW5saW5lIGxvbmcgbG9uZyBnZXRFbXB0eUtleSgpIHsgcmV0dXJuIDB4N2ZmZmZmZmZmZmZmZmZmZkxMOyB9CisgIHN0YXRpYyBpbmxpbmUgbG9uZyBsb25nIGdldFRvbWJzdG9uZUtleSgpIHsgcmV0dXJuIC0weDdmZmZmZmZmZmZmZmZmZmZMTC0xOyB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBsb25nIGxvbmcmIFZhbCkgeworICAgIHJldHVybiAodW5zaWduZWQpKFZhbCAqIDM3VUxMKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgbG9uZyBsb25nJiBMSFMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbG9uZyBsb25nJiBSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKKworLy8gUHJvdmlkZSBEZW5zZU1hcEluZm8gZm9yIGFsbCBwYWlycyB3aG9zZSBtZW1iZXJzIGhhdmUgaW5mby4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitzdHJ1Y3QgRGVuc2VNYXBJbmZvPHN0ZDo6cGFpcjxULCBVPj4geworICB1c2luZyBQYWlyID0gc3RkOjpwYWlyPFQsIFU+OworICB1c2luZyBGaXJzdEluZm8gPSBEZW5zZU1hcEluZm88VD47CisgIHVzaW5nIFNlY29uZEluZm8gPSBEZW5zZU1hcEluZm88VT47CisKKyAgc3RhdGljIGlubGluZSBQYWlyIGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihGaXJzdEluZm86OmdldEVtcHR5S2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY29uZEluZm86OmdldEVtcHR5S2V5KCkpOworICB9CisKKyAgc3RhdGljIGlubGluZSBQYWlyIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoRmlyc3RJbmZvOjpnZXRUb21ic3RvbmVLZXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2Vjb25kSW5mbzo6Z2V0VG9tYnN0b25lS2V5KCkpOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBQYWlyJiBQYWlyVmFsKSB7CisgICAgdWludDY0X3Qga2V5ID0gKHVpbnQ2NF90KUZpcnN0SW5mbzo6Z2V0SGFzaFZhbHVlKFBhaXJWYWwuZmlyc3QpIDw8IDMyCisgICAgICAgICAgfCAodWludDY0X3QpU2Vjb25kSW5mbzo6Z2V0SGFzaFZhbHVlKFBhaXJWYWwuc2Vjb25kKTsKKyAgICBrZXkgKz0gfihrZXkgPDwgMzIpOworICAgIGtleSBePSAoa2V5ID4+IDIyKTsKKyAgICBrZXkgKz0gfihrZXkgPDwgMTMpOworICAgIGtleSBePSAoa2V5ID4+IDgpOworICAgIGtleSArPSAoa2V5IDw8IDMpOworICAgIGtleSBePSAoa2V5ID4+IDE1KTsKKyAgICBrZXkgKz0gfihrZXkgPDwgMjcpOworICAgIGtleSBePSAoa2V5ID4+IDMxKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkKWtleTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgUGFpciAmTEhTLCBjb25zdCBQYWlyICZSSFMpIHsKKyAgICByZXR1cm4gRmlyc3RJbmZvOjppc0VxdWFsKExIUy5maXJzdCwgUkhTLmZpcnN0KSAmJgorICAgICAgICAgICBTZWNvbmRJbmZvOjppc0VxdWFsKExIUy5zZWNvbmQsIFJIUy5zZWNvbmQpOworICB9Cit9OworCisvLyBQcm92aWRlIERlbnNlTWFwSW5mbyBmb3IgU3RyaW5nUmVmcy4KK3RlbXBsYXRlIDw+IHN0cnVjdCBEZW5zZU1hcEluZm88U3RyaW5nUmVmPiB7CisgIHN0YXRpYyBpbmxpbmUgU3RyaW5nUmVmIGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiBTdHJpbmdSZWYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KH5zdGF0aWNfY2FzdDx1aW50cHRyX3Q+KDApKSwKKyAgICAgICAgICAgICAgICAgICAgIDApOworICB9CisKKyAgc3RhdGljIGlubGluZSBTdHJpbmdSZWYgZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiBTdHJpbmdSZWYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KH5zdGF0aWNfY2FzdDx1aW50cHRyX3Q+KDEpKSwKKyAgICAgICAgICAgICAgICAgICAgIDApOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShTdHJpbmdSZWYgVmFsKSB7CisgICAgYXNzZXJ0KFZhbC5kYXRhKCkgIT0gZ2V0RW1wdHlLZXkoKS5kYXRhKCkgJiYgIkNhbm5vdCBoYXNoIHRoZSBlbXB0eSBrZXkhIik7CisgICAgYXNzZXJ0KFZhbC5kYXRhKCkgIT0gZ2V0VG9tYnN0b25lS2V5KCkuZGF0YSgpICYmCisgICAgICAgICAgICJDYW5ub3QgaGFzaCB0aGUgdG9tYnN0b25lIGtleSEiKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkKShoYXNoX3ZhbHVlKFZhbCkpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChTdHJpbmdSZWYgTEhTLCBTdHJpbmdSZWYgUkhTKSB7CisgICAgaWYgKFJIUy5kYXRhKCkgPT0gZ2V0RW1wdHlLZXkoKS5kYXRhKCkpCisgICAgICByZXR1cm4gTEhTLmRhdGEoKSA9PSBnZXRFbXB0eUtleSgpLmRhdGEoKTsKKyAgICBpZiAoUkhTLmRhdGEoKSA9PSBnZXRUb21ic3RvbmVLZXkoKS5kYXRhKCkpCisgICAgICByZXR1cm4gTEhTLmRhdGEoKSA9PSBnZXRUb21ic3RvbmVLZXkoKS5kYXRhKCk7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisKKy8vIFByb3ZpZGUgRGVuc2VNYXBJbmZvIGZvciBBcnJheVJlZnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IERlbnNlTWFwSW5mbzxBcnJheVJlZjxUPj4geworICBzdGF0aWMgaW5saW5lIEFycmF5UmVmPFQ+IGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiBBcnJheVJlZjxUPihyZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4ofnN0YXRpY19jYXN0PHVpbnRwdHJfdD4oMCkpLAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QoMCkpOworICB9CisKKyAgc3RhdGljIGlubGluZSBBcnJheVJlZjxUPiBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgcmV0dXJuIEFycmF5UmVmPFQ+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCAqPih+c3RhdGljX2Nhc3Q8dWludHB0cl90PigxKSksCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCgwKSk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKEFycmF5UmVmPFQ+IFZhbCkgeworICAgIGFzc2VydChWYWwuZGF0YSgpICE9IGdldEVtcHR5S2V5KCkuZGF0YSgpICYmICJDYW5ub3QgaGFzaCB0aGUgZW1wdHkga2V5ISIpOworICAgIGFzc2VydChWYWwuZGF0YSgpICE9IGdldFRvbWJzdG9uZUtleSgpLmRhdGEoKSAmJgorICAgICAgICAgICAiQ2Fubm90IGhhc2ggdGhlIHRvbWJzdG9uZSBrZXkhIik7CisgICAgcmV0dXJuICh1bnNpZ25lZCkoaGFzaF92YWx1ZShWYWwpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoQXJyYXlSZWY8VD4gTEhTLCBBcnJheVJlZjxUPiBSSFMpIHsKKyAgICBpZiAoUkhTLmRhdGEoKSA9PSBnZXRFbXB0eUtleSgpLmRhdGEoKSkKKyAgICAgIHJldHVybiBMSFMuZGF0YSgpID09IGdldEVtcHR5S2V5KCkuZGF0YSgpOworICAgIGlmIChSSFMuZGF0YSgpID09IGdldFRvbWJzdG9uZUtleSgpLmRhdGEoKSkKKyAgICAgIHJldHVybiBMSFMuZGF0YSgpID09IGdldFRvbWJzdG9uZUtleSgpLmRhdGEoKTsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX0RFTlNFTUFQSU5GT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9EZW5zZVNldC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvRGVuc2VTZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTUxNzFjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvRGVuc2VTZXQuaApAQCAtMCwwICsxLDI1NSBAQAorLy89PT0tIGxsdm0vQURUL0RlbnNlU2V0LmggLSBEZW5zZSBwcm9iZWQgaGFzaCB0YWJsZSAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgRGVuc2VTZXQgYW5kIFNtYWxsRGVuc2VTZXQgY2xhc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0RFTlNFU0VUX0gKKyNkZWZpbmUgTExWTV9BRFRfREVOU0VTRVRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+IAorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBkZXRhaWwgeworCitzdHJ1Y3QgRGVuc2VTZXRFbXB0eSB7fTsKKworLy8gVXNlIHRoZSBlbXB0eSBiYXNlIGNsYXNzIHRyaWNrIHNvIHdlIGNhbiBjcmVhdGUgYSBEZW5zZU1hcCB3aGVyZSB0aGUgYnVja2V0cworLy8gY29udGFpbiBvbmx5IGEgc2luZ2xlIGl0ZW0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VD4gY2xhc3MgRGVuc2VTZXRQYWlyIDogcHVibGljIERlbnNlU2V0RW1wdHkgeworICBLZXlUIGtleTsKKworcHVibGljOgorICBLZXlUICZnZXRGaXJzdCgpIHsgcmV0dXJuIGtleTsgfQorICBjb25zdCBLZXlUICZnZXRGaXJzdCgpIGNvbnN0IHsgcmV0dXJuIGtleTsgfQorICBEZW5zZVNldEVtcHR5ICZnZXRTZWNvbmQoKSB7IHJldHVybiAqdGhpczsgfQorICBjb25zdCBEZW5zZVNldEVtcHR5ICZnZXRTZWNvbmQoKSBjb25zdCB7IHJldHVybiAqdGhpczsgfQorfTsKKworLy8vIEJhc2UgY2xhc3MgZm9yIERlbnNlU2V0IGFuZCBEZW5zZVNtYWxsU2V0LgorLy8vCisvLy8gTWFwVHkgc2hvdWxkIGJlIGVpdGhlcgorLy8vCisvLy8gICBEZW5zZU1hcDxWYWx1ZVQsIGRldGFpbDo6RGVuc2VTZXRFbXB0eSwgVmFsdWVJbmZvVCwKKy8vLyAgICAgICAgICAgIGRldGFpbDo6RGVuc2VTZXRQYWlyPFZhbHVlVD4+CisvLy8KKy8vLyBvciB0aGUgZXF1aXZhbGVudCBTbWFsbERlbnNlTWFwIHR5cGUuICBWYWx1ZUluZm9UIG11c3QgaW1wbGVtZW50IHRoZQorLy8vIERlbnNlTWFwSW5mbyAiY29uY2VwdCIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVULCB0eXBlbmFtZSBNYXBUeSwgdHlwZW5hbWUgVmFsdWVJbmZvVD4KK2NsYXNzIERlbnNlU2V0SW1wbCB7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHR5cGVuYW1lIE1hcFR5Ojp2YWx1ZV90eXBlKSA9PSBzaXplb2YoVmFsdWVUKSwKKyAgICAgICAgICAgICAgICAiRGVuc2VNYXAgYnVja2V0cyB1bmV4cGVjdGVkbHkgbGFyZ2UhIik7CisgIE1hcFR5IFRoZU1hcDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdXNpbmcgY29uc3RfYXJnX3R5cGVfdCA9IHR5cGVuYW1lIGNvbnN0X3BvaW50ZXJfb3JfY29uc3RfcmVmPFQ+Ojp0eXBlOworCitwdWJsaWM6CisgIHVzaW5nIGtleV90eXBlID0gVmFsdWVUOworICB1c2luZyB2YWx1ZV90eXBlID0gVmFsdWVUOworICB1c2luZyBzaXplX3R5cGUgPSB1bnNpZ25lZDsKKworICBleHBsaWNpdCBEZW5zZVNldEltcGwodW5zaWduZWQgSW5pdGlhbFJlc2VydmUgPSAwKSA6IFRoZU1hcChJbml0aWFsUmVzZXJ2ZSkge30KKworICBEZW5zZVNldEltcGwoc3RkOjppbml0aWFsaXplcl9saXN0PFZhbHVlVD4gRWxlbXMpCisgICAgICA6IERlbnNlU2V0SW1wbChFbGVtcy5zaXplKCkpIHsKKyAgICBpbnNlcnQoRWxlbXMuYmVnaW4oKSwgRWxlbXMuZW5kKCkpOworICB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFRoZU1hcC5lbXB0eSgpOyB9CisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gVGhlTWFwLnNpemUoKTsgfQorICBzaXplX3QgZ2V0TWVtb3J5U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFRoZU1hcC5nZXRNZW1vcnlTaXplKCk7IH0KKworICAvLy8gR3JvdyB0aGUgRGVuc2VTZXQgc28gdGhhdCBpdCBoYXMgYXQgbGVhc3QgU2l6ZSBidWNrZXRzLiBXaWxsIG5vdCBzaHJpbmsKKyAgLy8vIHRoZSBTaXplIG9mIHRoZSBzZXQuCisgIHZvaWQgcmVzaXplKHNpemVfdCBTaXplKSB7IFRoZU1hcC5yZXNpemUoU2l6ZSk7IH0KKworICAvLy8gR3JvdyB0aGUgRGVuc2VTZXQgc28gdGhhdCBpdCBjYW4gY29udGFpbiBhdCBsZWFzdCBccCBOdW1FbnRyaWVzIGl0ZW1zCisgIC8vLyBiZWZvcmUgcmVzaXppbmcgYWdhaW4uCisgIHZvaWQgcmVzZXJ2ZShzaXplX3QgU2l6ZSkgeyBUaGVNYXAucmVzZXJ2ZShTaXplKTsgfQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgVGhlTWFwLmNsZWFyKCk7CisgIH0KKworICAvLy8gUmV0dXJuIDEgaWYgdGhlIHNwZWNpZmllZCBrZXkgaXMgaW4gdGhlIHNldCwgMCBvdGhlcndpc2UuCisgIHNpemVfdHlwZSBjb3VudChjb25zdF9hcmdfdHlwZV90PFZhbHVlVD4gVikgY29uc3QgeworICAgIHJldHVybiBUaGVNYXAuY291bnQoVik7CisgIH0KKworICBib29sIGVyYXNlKGNvbnN0IFZhbHVlVCAmVikgeworICAgIHJldHVybiBUaGVNYXAuZXJhc2UoVik7CisgIH0KKworICB2b2lkIHN3YXAoRGVuc2VTZXRJbXBsICZSSFMpIHsgVGhlTWFwLnN3YXAoUkhTLlRoZU1hcCk7IH0KKworICAvLyBJdGVyYXRvcnMuCisKKyAgY2xhc3MgQ29uc3RJdGVyYXRvcjsKKworICBjbGFzcyBJdGVyYXRvciB7CisgICAgdHlwZW5hbWUgTWFwVHk6Oml0ZXJhdG9yIEk7CisgICAgZnJpZW5kIGNsYXNzIERlbnNlU2V0SW1wbDsKKyAgICBmcmllbmQgY2xhc3MgQ29uc3RJdGVyYXRvcjsKKworICBwdWJsaWM6CisgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gdHlwZW5hbWUgTWFwVHk6Oml0ZXJhdG9yOjpkaWZmZXJlbmNlX3R5cGU7CisgICAgdXNpbmcgdmFsdWVfdHlwZSA9IFZhbHVlVDsKKyAgICB1c2luZyBwb2ludGVyID0gdmFsdWVfdHlwZSAqOworICAgIHVzaW5nIHJlZmVyZW5jZSA9IHZhbHVlX3R5cGUgJjsKKyAgICB1c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWc7CisKKyAgICBJdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgICBJdGVyYXRvcihjb25zdCB0eXBlbmFtZSBNYXBUeTo6aXRlcmF0b3IgJmkpIDogSShpKSB7fQorCisgICAgVmFsdWVUICZvcGVyYXRvciooKSB7IHJldHVybiBJLT5nZXRGaXJzdCgpOyB9CisgICAgY29uc3QgVmFsdWVUICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBJLT5nZXRGaXJzdCgpOyB9CisgICAgVmFsdWVUICpvcGVyYXRvci0+KCkgeyByZXR1cm4gJkktPmdldEZpcnN0KCk7IH0KKyAgICBjb25zdCBWYWx1ZVQgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmSS0+Z2V0Rmlyc3QoKTsgfQorCisgICAgSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7ICsrSTsgcmV0dXJuICp0aGlzOyB9CisgICAgSXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgYXV0byBUID0gKnRoaXM7ICsrSTsgcmV0dXJuIFQ7IH0KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ29uc3RJdGVyYXRvciYgWCkgY29uc3QgeyByZXR1cm4gSSA9PSBYLkk7IH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ29uc3RJdGVyYXRvciYgWCkgY29uc3QgeyByZXR1cm4gSSAhPSBYLkk7IH0KKyAgfTsKKworICBjbGFzcyBDb25zdEl0ZXJhdG9yIHsKKyAgICB0eXBlbmFtZSBNYXBUeTo6Y29uc3RfaXRlcmF0b3IgSTsKKyAgICBmcmllbmQgY2xhc3MgRGVuc2VTZXQ7CisgICAgZnJpZW5kIGNsYXNzIEl0ZXJhdG9yOworCisgIHB1YmxpYzoKKyAgICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSB0eXBlbmFtZSBNYXBUeTo6Y29uc3RfaXRlcmF0b3I6OmRpZmZlcmVuY2VfdHlwZTsKKyAgICB1c2luZyB2YWx1ZV90eXBlID0gVmFsdWVUOworICAgIHVzaW5nIHBvaW50ZXIgPSB2YWx1ZV90eXBlICo7CisgICAgdXNpbmcgcmVmZXJlbmNlID0gdmFsdWVfdHlwZSAmOworICAgIHVzaW5nIGl0ZXJhdG9yX2NhdGVnb3J5ID0gc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZzsKKworICAgIENvbnN0SXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgICAgQ29uc3RJdGVyYXRvcihjb25zdCBJdGVyYXRvciAmQikgOiBJKEIuSSkge30KKyAgICBDb25zdEl0ZXJhdG9yKGNvbnN0IHR5cGVuYW1lIE1hcFR5Ojpjb25zdF9pdGVyYXRvciAmaSkgOiBJKGkpIHt9CisKKyAgICBjb25zdCBWYWx1ZVQgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIEktPmdldEZpcnN0KCk7IH0KKyAgICBjb25zdCBWYWx1ZVQgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmSS0+Z2V0Rmlyc3QoKTsgfQorCisgICAgQ29uc3RJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsgKytJOyByZXR1cm4gKnRoaXM7IH0KKyAgICBDb25zdEl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7IGF1dG8gVCA9ICp0aGlzOyArK0k7IHJldHVybiBUOyB9CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENvbnN0SXRlcmF0b3ImIFgpIGNvbnN0IHsgcmV0dXJuIEkgPT0gWC5JOyB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IENvbnN0SXRlcmF0b3ImIFgpIGNvbnN0IHsgcmV0dXJuIEkgIT0gWC5JOyB9CisgIH07CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBJdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBDb25zdEl0ZXJhdG9yOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gSXRlcmF0b3IoVGhlTWFwLmJlZ2luKCkpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIEl0ZXJhdG9yKFRoZU1hcC5lbmQoKSk7IH0KKworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIENvbnN0SXRlcmF0b3IoVGhlTWFwLmJlZ2luKCkpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIENvbnN0SXRlcmF0b3IoVGhlTWFwLmVuZCgpKTsgfQorCisgIGl0ZXJhdG9yIGZpbmQoY29uc3RfYXJnX3R5cGVfdDxWYWx1ZVQ+IFYpIHsgcmV0dXJuIEl0ZXJhdG9yKFRoZU1hcC5maW5kKFYpKTsgfQorICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0X2FyZ190eXBlX3Q8VmFsdWVUPiBWKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0SXRlcmF0b3IoVGhlTWFwLmZpbmQoVikpOworICB9CisKKyAgLy8vIEFsdGVybmF0aXZlIHZlcnNpb24gb2YgZmluZCgpIHdoaWNoIGFsbG93cyBhIGRpZmZlcmVudCwgYW5kIHBvc3NpYmx5IGxlc3MKKyAgLy8vIGV4cGVuc2l2ZSwga2V5IHR5cGUuCisgIC8vLyBUaGUgRGVuc2VNYXBJbmZvIGlzIHJlc3BvbnNpYmxlIGZvciBzdXBwbHlpbmcgbWV0aG9kcworICAvLy8gZ2V0SGFzaFZhbHVlKExvb2t1cEtleVQpIGFuZCBpc0VxdWFsKExvb2t1cEtleVQsIEtleVQpIGZvciBlYWNoIGtleSB0eXBlCisgIC8vLyB1c2VkLgorICB0ZW1wbGF0ZSA8Y2xhc3MgTG9va3VwS2V5VD4KKyAgaXRlcmF0b3IgZmluZF9hcyhjb25zdCBMb29rdXBLZXlUICZWYWwpIHsKKyAgICByZXR1cm4gSXRlcmF0b3IoVGhlTWFwLmZpbmRfYXMoVmFsKSk7CisgIH0KKyAgdGVtcGxhdGUgPGNsYXNzIExvb2t1cEtleVQ+CisgIGNvbnN0X2l0ZXJhdG9yIGZpbmRfYXMoY29uc3QgTG9va3VwS2V5VCAmVmFsKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0SXRlcmF0b3IoVGhlTWFwLmZpbmRfYXMoVmFsKSk7CisgIH0KKworICB2b2lkIGVyYXNlKEl0ZXJhdG9yIEkpIHsgcmV0dXJuIFRoZU1hcC5lcmFzZShJLkkpOyB9CisgIHZvaWQgZXJhc2UoQ29uc3RJdGVyYXRvciBDSSkgeyByZXR1cm4gVGhlTWFwLmVyYXNlKENJLkkpOyB9CisKKyAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnQoY29uc3QgVmFsdWVUICZWKSB7CisgICAgZGV0YWlsOjpEZW5zZVNldEVtcHR5IEVtcHR5OworICAgIHJldHVybiBUaGVNYXAudHJ5X2VtcGxhY2UoViwgRW1wdHkpOworICB9CisKKyAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnQoVmFsdWVUICYmVikgeworICAgIGRldGFpbDo6RGVuc2VTZXRFbXB0eSBFbXB0eTsKKyAgICByZXR1cm4gVGhlTWFwLnRyeV9lbXBsYWNlKHN0ZDo6bW92ZShWKSwgRW1wdHkpOworICB9CisKKyAgLy8vIEFsdGVybmF0aXZlIHZlcnNpb24gb2YgaW5zZXJ0IHRoYXQgdXNlcyBhIGRpZmZlcmVudCAoYW5kIHBvc3NpYmx5IGxlc3MKKyAgLy8vIGV4cGVuc2l2ZSkga2V5IHR5cGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBMb29rdXBLZXlUPgorICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydF9hcyhjb25zdCBWYWx1ZVQgJlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb2t1cEtleVQgJkxvb2t1cEtleSkgeworICAgIHJldHVybiBUaGVNYXAuaW5zZXJ0X2FzKHtWLCBkZXRhaWw6OkRlbnNlU2V0RW1wdHkoKX0sIExvb2t1cEtleSk7CisgIH0KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIExvb2t1cEtleVQ+CisgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0X2FzKFZhbHVlVCAmJlYsIGNvbnN0IExvb2t1cEtleVQgJkxvb2t1cEtleSkgeworICAgIHJldHVybiBUaGVNYXAuaW5zZXJ0X2FzKHtzdGQ6Om1vdmUoViksIGRldGFpbDo6RGVuc2VTZXRFbXB0eSgpfSwgTG9va3VwS2V5KTsKKyAgfQorCisgIC8vIFJhbmdlIGluc2VydGlvbiBvZiB2YWx1ZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIElucHV0SXQ+CisgIHZvaWQgaW5zZXJ0KElucHV0SXQgSSwgSW5wdXRJdCBFKSB7CisgICAgZm9yICg7IEkgIT0gRTsgKytJKQorICAgICAgaW5zZXJ0KCpJKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAorCisvLy8gSW1wbGVtZW50cyBhIGRlbnNlIHByb2JlZCBoYXNoLXRhYmxlIGJhc2VkIHNldC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVQsIHR5cGVuYW1lIFZhbHVlSW5mb1QgPSBEZW5zZU1hcEluZm88VmFsdWVUPj4KK2NsYXNzIERlbnNlU2V0IDogcHVibGljIGRldGFpbDo6RGVuc2VTZXRJbXBsPAorICAgICAgICAgICAgICAgICAgICAgVmFsdWVULCBEZW5zZU1hcDxWYWx1ZVQsIGRldGFpbDo6RGVuc2VTZXRFbXB0eSwgVmFsdWVJbmZvVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOjpEZW5zZVNldFBhaXI8VmFsdWVUPj4sCisgICAgICAgICAgICAgICAgICAgICBWYWx1ZUluZm9UPiB7CisgIHVzaW5nIEJhc2VUID0KKyAgICAgIGRldGFpbDo6RGVuc2VTZXRJbXBsPFZhbHVlVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPFZhbHVlVCwgZGV0YWlsOjpEZW5zZVNldEVtcHR5LCBWYWx1ZUluZm9ULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWlsOjpEZW5zZVNldFBhaXI8VmFsdWVUPj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZUluZm9UPjsKKworcHVibGljOgorICB1c2luZyBCYXNlVDo6QmFzZVQ7Cit9OworCisvLy8gSW1wbGVtZW50cyBhIGRlbnNlIHByb2JlZCBoYXNoLXRhYmxlIGJhc2VkIHNldCB3aXRoIHNvbWUgbnVtYmVyIG9mIGJ1Y2tldHMKKy8vLyBzdG9yZWQgaW5saW5lLgordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVCwgdW5zaWduZWQgSW5saW5lQnVja2V0cyA9IDQsCisgICAgICAgICAgdHlwZW5hbWUgVmFsdWVJbmZvVCA9IERlbnNlTWFwSW5mbzxWYWx1ZVQ+PgorY2xhc3MgU21hbGxEZW5zZVNldAorICAgIDogcHVibGljIGRldGFpbDo6RGVuc2VTZXRJbXBsPAorICAgICAgICAgIFZhbHVlVCwgU21hbGxEZW5zZU1hcDxWYWx1ZVQsIGRldGFpbDo6RGVuc2VTZXRFbXB0eSwgSW5saW5lQnVja2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVJbmZvVCwgZGV0YWlsOjpEZW5zZVNldFBhaXI8VmFsdWVUPj4sCisgICAgICAgICAgVmFsdWVJbmZvVD4geworICB1c2luZyBCYXNlVCA9IGRldGFpbDo6RGVuc2VTZXRJbXBsPAorICAgICAgVmFsdWVULCBTbWFsbERlbnNlTWFwPFZhbHVlVCwgZGV0YWlsOjpEZW5zZVNldEVtcHR5LCBJbmxpbmVCdWNrZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlSW5mb1QsIGRldGFpbDo6RGVuc2VTZXRQYWlyPFZhbHVlVD4+LAorICAgICAgVmFsdWVJbmZvVD47CisKK3B1YmxpYzoKKyAgdXNpbmcgQmFzZVQ6OkJhc2VUOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX0RFTlNFU0VUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0RlcHRoRmlyc3RJdGVyYXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvRGVwdGhGaXJzdEl0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk2NGQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0RlcHRoRmlyc3RJdGVyYXRvci5oCkBAIC0wLDAgKzEsMzA4IEBACisvLz09PS0gbGx2bS9BRFQvRGVwdGhGaXJzdEl0ZXJhdG9yLmggLSBEZXB0aCBGaXJzdCBpdGVyYXRvciAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBidWlsZHMgb24gdGhlIEFEVC9HcmFwaFRyYWl0cy5oIGZpbGUgdG8gYnVpbGQgZ2VuZXJpYyBkZXB0aAorLy8gZmlyc3QgZ3JhcGggaXRlcmF0b3IuICBUaGlzIGZpbGUgZXhwb3NlcyB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucy90eXBlczoKKy8vCisvLyBkZl9iZWdpbi9kZl9lbmQvZGZfaXRlcmF0b3IKKy8vICAgKiBOb3JtYWwgZGVwdGgtZmlyc3QgaXRlcmF0aW9uIC0gdmlzaXQgYSBub2RlIGFuZCB0aGVuIGFsbCBvZiBpdHMgY2hpbGRyZW4uCisvLworLy8gaWRmX2JlZ2luL2lkZl9lbmQvaWRmX2l0ZXJhdG9yCisvLyAgICogRGVwdGgtZmlyc3QgaXRlcmF0aW9uIG9uIHRoZSAnaW52ZXJzZScgZ3JhcGguCisvLworLy8gZGZfZXh0X2JlZ2luL2RmX2V4dF9lbmQvZGZfZXh0X2l0ZXJhdG9yCisvLyAgICogTm9ybWFsIGRlcHRoLWZpcnN0IGl0ZXJhdGlvbiAtIHZpc2l0IGEgbm9kZSBhbmQgdGhlbiBhbGwgb2YgaXRzIGNoaWxkcmVuLgorLy8gICAgIFRoaXMgaXRlcmF0b3Igc3RvcmVzIHRoZSAndmlzaXRlZCcgc2V0IGluIGFuIGV4dGVybmFsIHNldCwgd2hpY2ggYWxsb3dzCisvLyAgICAgaXQgdG8gYmUgbW9yZSBlZmZpY2llbnQsIGFuZCBhbGxvd3MgZXh0ZXJuYWwgY2xpZW50cyB0byB1c2UgdGhlIHNldCBmb3IKKy8vICAgICBvdGhlciBwdXJwb3Nlcy4KKy8vCisvLyBpZGZfZXh0X2JlZ2luL2lkZl9leHRfZW5kL2lkZl9leHRfaXRlcmF0b3IKKy8vICAgKiBEZXB0aC1maXJzdCBpdGVyYXRpb24gb24gdGhlICdpbnZlcnNlJyBncmFwaC4KKy8vICAgICBUaGlzIGl0ZXJhdG9yIHN0b3JlcyB0aGUgJ3Zpc2l0ZWQnIHNldCBpbiBhbiBleHRlcm5hbCBzZXQsIHdoaWNoIGFsbG93cworLy8gICAgIGl0IHRvIGJlIG1vcmUgZWZmaWNpZW50LCBhbmQgYWxsb3dzIGV4dGVybmFsIGNsaWVudHMgdG8gdXNlIHRoZSBzZXQgZm9yCisvLyAgICAgb3RoZXIgcHVycG9zZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9ERVBUSEZJUlNUSVRFUkFUT1JfSAorI2RlZmluZSBMTFZNX0FEVF9ERVBUSEZJUlNUSVRFUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ob25lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vIGRmX2l0ZXJhdG9yX3N0b3JhZ2UgLSBBIHByaXZhdGUgY2xhc3Mgd2hpY2ggaXMgdXNlZCB0byBmaWd1cmUgb3V0IHdoZXJlIHRvCisvLyBzdG9yZSB0aGUgdmlzaXRlZCBzZXQuCit0ZW1wbGF0ZTxjbGFzcyBTZXRUeXBlLCBib29sIEV4dGVybmFsPiAgIC8vIE5vbi1leHRlcm5hbCBzZXQKK2NsYXNzIGRmX2l0ZXJhdG9yX3N0b3JhZ2UgeworcHVibGljOgorICBTZXRUeXBlIFZpc2l0ZWQ7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBTZXRUeXBlPgorY2xhc3MgZGZfaXRlcmF0b3Jfc3RvcmFnZTxTZXRUeXBlLCB0cnVlPiB7CitwdWJsaWM6CisgIGRmX2l0ZXJhdG9yX3N0b3JhZ2UoU2V0VHlwZSAmVlNldCkgOiBWaXNpdGVkKFZTZXQpIHt9CisgIGRmX2l0ZXJhdG9yX3N0b3JhZ2UoY29uc3QgZGZfaXRlcmF0b3Jfc3RvcmFnZSAmUykgOiBWaXNpdGVkKFMuVmlzaXRlZCkge30KKworICBTZXRUeXBlICZWaXNpdGVkOworfTsKKworLy8gVGhlIHZpc2l0ZWQgc3RhdGVkIGZvciB0aGUgaXRlcmF0aW9uIGlzIGEgc2ltcGxlIHNldCBhdWdtZW50ZWQgd2l0aAorLy8gb25lIG1vcmUgbWV0aG9kLCBjb21wbGV0ZWQsIHdoaWNoIGlzIGludm9rZWQgd2hlbiBhbGwgY2hpbGRyZW4gb2YgYQorLy8gbm9kZSBoYXZlIGJlZW4gcHJvY2Vzc2VkLiBJdCBpcyBpbnRlbmRlZCB0byBkaXN0aW5ndWlzaCBvZiBiYWNrIGFuZAorLy8gY3Jvc3MgZWRnZXMgaW4gdGhlIHNwYW5uaW5nIHRyZWUgYnV0IGlzIG5vdCB1c2VkIGluIHRoZSBjb21tb24gY2FzZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBOb2RlUmVmLCB1bnNpZ25lZCBTbWFsbFNpemU9OD4KK3N0cnVjdCBkZl9pdGVyYXRvcl9kZWZhdWx0X3NldCA6IHB1YmxpYyBTbWFsbFB0clNldDxOb2RlUmVmLCBTbWFsbFNpemU+IHsKKyAgdXNpbmcgQmFzZVNldCA9IFNtYWxsUHRyU2V0PE5vZGVSZWYsIFNtYWxsU2l6ZT47CisgIHVzaW5nIGl0ZXJhdG9yID0gdHlwZW5hbWUgQmFzZVNldDo6aXRlcmF0b3I7CisKKyAgc3RkOjpwYWlyPGl0ZXJhdG9yLGJvb2w+IGluc2VydChOb2RlUmVmIE4pIHsgcmV0dXJuIEJhc2VTZXQ6Omluc2VydChOKTsgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlclQ+CisgIHZvaWQgaW5zZXJ0KEl0ZXJUIEJlZ2luLCBJdGVyVCBFbmQpIHsgQmFzZVNldDo6aW5zZXJ0KEJlZ2luLEVuZCk7IH0KKworICB2b2lkIGNvbXBsZXRlZChOb2RlUmVmKSB7fQorfTsKKworLy8gR2VuZXJpYyBEZXB0aCBGaXJzdCBJdGVyYXRvcgordGVtcGxhdGUgPGNsYXNzIEdyYXBoVCwKKyAgICAgICAgICBjbGFzcyBTZXRUeXBlID0KKyAgICAgICAgICAgICAgZGZfaXRlcmF0b3JfZGVmYXVsdF9zZXQ8dHlwZW5hbWUgR3JhcGhUcmFpdHM8R3JhcGhUPjo6Tm9kZVJlZj4sCisgICAgICAgICAgYm9vbCBFeHRTdG9yYWdlID0gZmFsc2UsIGNsYXNzIEdUID0gR3JhcGhUcmFpdHM8R3JhcGhUPj4KK2NsYXNzIGRmX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCB0eXBlbmFtZSBHVDo6Tm9kZVJlZj4sCisgICAgICBwdWJsaWMgZGZfaXRlcmF0b3Jfc3RvcmFnZTxTZXRUeXBlLCBFeHRTdG9yYWdlPiB7CisgIHVzaW5nIHN1cGVyID0gc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCB0eXBlbmFtZSBHVDo6Tm9kZVJlZj47CisgIHVzaW5nIE5vZGVSZWYgPSB0eXBlbmFtZSBHVDo6Tm9kZVJlZjsKKyAgdXNpbmcgQ2hpbGRJdFR5ID0gdHlwZW5hbWUgR1Q6OkNoaWxkSXRlcmF0b3JUeXBlOworCisgIC8vIEZpcnN0IGVsZW1lbnQgaXMgbm9kZSByZWZlcmVuY2UsIHNlY29uZCBpcyB0aGUgJ25leHQgY2hpbGQnIHRvIHZpc2l0LgorICAvLyBUaGUgc2Vjb25kIGNoaWxkIGlzIGluaXRpYWxpemVkIGxhemlseSB0byBwaWNrIHVwIGdyYXBoIGNoYW5nZXMgZHVyaW5nIHRoZQorICAvLyBERlMuCisgIHVzaW5nIFN0YWNrRWxlbWVudCA9IHN0ZDo6cGFpcjxOb2RlUmVmLCBPcHRpb25hbDxDaGlsZEl0VHk+PjsKKworICAvLyBWaXNpdFN0YWNrIC0gVXNlZCB0byBtYWludGFpbiB0aGUgb3JkZXJpbmcuICBUb3AgPSBjdXJyZW50IGJsb2NrCisgIHN0ZDo6dmVjdG9yPFN0YWNrRWxlbWVudD4gVmlzaXRTdGFjazsKKworcHJpdmF0ZToKKyAgaW5saW5lIGRmX2l0ZXJhdG9yKE5vZGVSZWYgTm9kZSkgeworICAgIHRoaXMtPlZpc2l0ZWQuaW5zZXJ0KE5vZGUpOworICAgIFZpc2l0U3RhY2sucHVzaF9iYWNrKFN0YWNrRWxlbWVudChOb2RlLCBOb25lKSk7CisgIH0KKworICBpbmxpbmUgZGZfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7IC8vIEVuZCBpcyB3aGVuIHN0YWNrIGlzIGVtcHR5CisKKyAgaW5saW5lIGRmX2l0ZXJhdG9yKE5vZGVSZWYgTm9kZSwgU2V0VHlwZSAmUykKKyAgICAgIDogZGZfaXRlcmF0b3Jfc3RvcmFnZTxTZXRUeXBlLCBFeHRTdG9yYWdlPihTKSB7CisgICAgaWYgKHRoaXMtPlZpc2l0ZWQuaW5zZXJ0KE5vZGUpLnNlY29uZCkKKyAgICAgIFZpc2l0U3RhY2sucHVzaF9iYWNrKFN0YWNrRWxlbWVudChOb2RlLCBOb25lKSk7CisgIH0KKworICBpbmxpbmUgZGZfaXRlcmF0b3IoU2V0VHlwZSAmUykKKyAgICA6IGRmX2l0ZXJhdG9yX3N0b3JhZ2U8U2V0VHlwZSwgRXh0U3RvcmFnZT4oUykgeworICAgIC8vIEVuZCBpcyB3aGVuIHN0YWNrIGlzIGVtcHR5CisgIH0KKworICBpbmxpbmUgdm9pZCB0b05leHQoKSB7CisgICAgZG8geworICAgICAgTm9kZVJlZiBOb2RlID0gVmlzaXRTdGFjay5iYWNrKCkuZmlyc3Q7CisgICAgICBPcHRpb25hbDxDaGlsZEl0VHk+ICZPcHQgPSBWaXNpdFN0YWNrLmJhY2soKS5zZWNvbmQ7CisKKyAgICAgIGlmICghT3B0KQorICAgICAgICBPcHQuZW1wbGFjZShHVDo6Y2hpbGRfYmVnaW4oTm9kZSkpOworCisgICAgICAvLyBOb3RpY2UgdGhhdCB3ZSBkaXJlY3RseSBtdXRhdGUgKk9wdCBoZXJlLCBzbyB0aGF0CisgICAgICAvLyBWaXNpdFN0YWNrLmJhY2soKS5zZWNvbmQgYWN0dWFsbHkgZ2V0cyB1cGRhdGVkIGFzIHRoZSBpdGVyYXRvcgorICAgICAgLy8gaW5jcmVhc2VzLgorICAgICAgd2hpbGUgKCpPcHQgIT0gR1Q6OmNoaWxkX2VuZChOb2RlKSkgeworICAgICAgICBOb2RlUmVmIE5leHQgPSAqKCpPcHQpKys7CisgICAgICAgIC8vIEhhcyBvdXIgbmV4dCBzaWJsaW5nIGJlZW4gdmlzaXRlZD8KKyAgICAgICAgaWYgKHRoaXMtPlZpc2l0ZWQuaW5zZXJ0KE5leHQpLnNlY29uZCkgeworICAgICAgICAgIC8vIE5vLCBkbyBpdCBub3cuCisgICAgICAgICAgVmlzaXRTdGFjay5wdXNoX2JhY2soU3RhY2tFbGVtZW50KE5leHQsIE5vbmUpKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHRoaXMtPlZpc2l0ZWQuY29tcGxldGVkKE5vZGUpOworCisgICAgICAvLyBPb3BzLCByYW4gb3V0IG9mIHN1Y2Nlc3NvcnMuLi4gZ28gdXAgYSBsZXZlbCBvbiB0aGUgc3RhY2suCisgICAgICBWaXNpdFN0YWNrLnBvcF9iYWNrKCk7CisgICAgfSB3aGlsZSAoIVZpc2l0U3RhY2suZW1wdHkoKSk7CisgIH0KKworcHVibGljOgorICB1c2luZyBwb2ludGVyID0gdHlwZW5hbWUgc3VwZXI6OnBvaW50ZXI7CisKKyAgLy8gUHJvdmlkZSBzdGF0aWMgYmVnaW4gYW5kIGVuZCBtZXRob2RzIGFzIG91ciBwdWJsaWMgImNvbnN0cnVjdG9ycyIKKyAgc3RhdGljIGRmX2l0ZXJhdG9yIGJlZ2luKGNvbnN0IEdyYXBoVCAmRykgeworICAgIHJldHVybiBkZl9pdGVyYXRvcihHVDo6Z2V0RW50cnlOb2RlKEcpKTsKKyAgfQorICBzdGF0aWMgZGZfaXRlcmF0b3IgZW5kKGNvbnN0IEdyYXBoVCAmRykgeyByZXR1cm4gZGZfaXRlcmF0b3IoKTsgfQorCisgIC8vIFN0YXRpYyBiZWdpbiBhbmQgZW5kIG1ldGhvZHMgYXMgb3VyIHB1YmxpYyBjdG9ycyBmb3IgZXh0ZXJuYWwgaXRlcmF0b3JzCisgIHN0YXRpYyBkZl9pdGVyYXRvciBiZWdpbihjb25zdCBHcmFwaFQgJkcsIFNldFR5cGUgJlMpIHsKKyAgICByZXR1cm4gZGZfaXRlcmF0b3IoR1Q6OmdldEVudHJ5Tm9kZShHKSwgUyk7CisgIH0KKyAgc3RhdGljIGRmX2l0ZXJhdG9yIGVuZChjb25zdCBHcmFwaFQgJkcsIFNldFR5cGUgJlMpIHsgcmV0dXJuIGRmX2l0ZXJhdG9yKFMpOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGRmX2l0ZXJhdG9yICZ4KSBjb25zdCB7CisgICAgcmV0dXJuIFZpc2l0U3RhY2sgPT0geC5WaXNpdFN0YWNrOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBkZl9pdGVyYXRvciAmeCkgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSB4KTsgfQorCisgIGNvbnN0IE5vZGVSZWYgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIFZpc2l0U3RhY2suYmFjaygpLmZpcnN0OyB9CisKKyAgLy8gVGhpcyBpcyBhIG5vbnN0YW5kYXJkIG9wZXJhdG9yLT4gdGhhdCBkZXJlZmVyZW5jZXMgdGhlIHBvaW50ZXIgYW4gZXh0cmEKKyAgLy8gdGltZS4uLiBzbyB0aGF0IHlvdSBjYW4gYWN0dWFsbHkgY2FsbCBtZXRob2RzIE9OIHRoZSBOb2RlLCBiZWNhdXNlCisgIC8vIHRoZSBjb250YWluZWQgdHlwZSBpcyBhIHBvaW50ZXIuICBUaGlzIGFsbG93cyBCQkl0LT5nZXRUZXJtaW5hdG9yKCkgZi5lLgorICAvLworICBOb2RlUmVmIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAqKnRoaXM7IH0KKworICBkZl9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsgLy8gUHJlaW5jcmVtZW50CisgICAgdG9OZXh0KCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxicmllZiBTa2lwcyBhbGwgY2hpbGRyZW4gb2YgdGhlIGN1cnJlbnQgbm9kZSBhbmQgdHJhdmVyc2VzIHRvIG5leHQgbm9kZQorICAvLy8KKyAgLy8vIE5vdGU6IFRoaXMgZnVuY3Rpb24gdGFrZXMgY2FyZSBvZiBpbmNyZW1lbnRpbmcgdGhlIGl0ZXJhdG9yLiBJZiB5b3UKKyAgLy8vIGFsd2F5cyBpbmNyZW1lbnQgYW5kIGNhbGwgdGhpcyBmdW5jdGlvbiwgeW91IHJpc2sgd2Fsa2luZyBvZmYgdGhlIGVuZC4KKyAgZGZfaXRlcmF0b3IgJnNraXBDaGlsZHJlbigpIHsKKyAgICBWaXNpdFN0YWNrLnBvcF9iYWNrKCk7CisgICAgaWYgKCFWaXNpdFN0YWNrLmVtcHR5KCkpCisgICAgICB0b05leHQoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBkZl9pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAvLyBQb3N0aW5jcmVtZW50CisgICAgZGZfaXRlcmF0b3IgdG1wID0gKnRoaXM7CisgICAgKysqdGhpczsKKyAgICByZXR1cm4gdG1wOworICB9CisKKyAgLy8gbm9kZVZpc2l0ZWQgLSByZXR1cm4gdHJ1ZSBpZiB0aGlzIGl0ZXJhdG9yIGhhcyBhbHJlYWR5IHZpc2l0ZWQgdGhlCisgIC8vIHNwZWNpZmllZCBub2RlLiAgVGhpcyBpcyBwdWJsaWMsIGFuZCB3aWxsIHByb2JhYmx5IGJlIHVzZWQgdG8gaXRlcmF0ZSBvdmVyCisgIC8vIG5vZGVzIHRoYXQgYSBkZXB0aCBmaXJzdCBpdGVyYXRpb24gZGlkIG5vdCBmaW5kOiBpZSB1bnJlYWNoYWJsZSBub2Rlcy4KKyAgLy8KKyAgYm9vbCBub2RlVmlzaXRlZChOb2RlUmVmIE5vZGUpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+VmlzaXRlZC5jb3VudChOb2RlKSAhPSAwOworICB9CisKKyAgLy8vIGdldFBhdGhMZW5ndGggLSBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgcGF0aCBmcm9tIHRoZSBlbnRyeSBub2RlIHRvIHRoZQorICAvLy8gY3VycmVudCBub2RlLCBjb3VudGluZyBib3RoIG5vZGVzLgorICB1bnNpZ25lZCBnZXRQYXRoTGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gVmlzaXRTdGFjay5zaXplKCk7IH0KKworICAvLy8gZ2V0UGF0aCAtIFJldHVybiB0aGUgbid0aCBub2RlIGluIHRoZSBwYXRoIGZyb20gdGhlIGVudHJ5IG5vZGUgdG8gdGhlCisgIC8vLyBjdXJyZW50IG5vZGUuCisgIE5vZGVSZWYgZ2V0UGF0aCh1bnNpZ25lZCBuKSBjb25zdCB7IHJldHVybiBWaXNpdFN0YWNrW25dLmZpcnN0OyB9Cit9OworCisvLyBQcm92aWRlIGdsb2JhbCBjb25zdHJ1Y3RvcnMgdGhhdCBhdXRvbWF0aWNhbGx5IGZpZ3VyZSBvdXQgY29ycmVjdCB0eXBlcy4uLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBUPgorZGZfaXRlcmF0b3I8VD4gZGZfYmVnaW4oY29uc3QgVCYgRykgeworICByZXR1cm4gZGZfaXRlcmF0b3I8VD46OmJlZ2luKEcpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2RmX2l0ZXJhdG9yPFQ+IGRmX2VuZChjb25zdCBUJiBHKSB7CisgIHJldHVybiBkZl9pdGVyYXRvcjxUPjo6ZW5kKEcpOworfQorCisvLyBQcm92aWRlIGFuIGFjY2Vzc29yIG1ldGhvZCB0byB1c2UgdGhlbSBpbiByYW5nZS1iYXNlZCBwYXR0ZXJucy4KK3RlbXBsYXRlIDxjbGFzcyBUPgoraXRlcmF0b3JfcmFuZ2U8ZGZfaXRlcmF0b3I8VD4+IGRlcHRoX2ZpcnN0KGNvbnN0IFQmIEcpIHsKKyAgcmV0dXJuIG1ha2VfcmFuZ2UoZGZfYmVnaW4oRyksIGRmX2VuZChHKSk7Cit9CisKKy8vIFByb3ZpZGUgZ2xvYmFsIGRlZmluaXRpb25zIG9mIGV4dGVybmFsIGRlcHRoIGZpcnN0IGl0ZXJhdG9ycy4uLgordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFNldFR5ID0gc3RkOjpzZXQ8dHlwZW5hbWUgR3JhcGhUcmFpdHM8VD46Ok5vZGVSZWY+Pgorc3RydWN0IGRmX2V4dF9pdGVyYXRvciA6IHB1YmxpYyBkZl9pdGVyYXRvcjxULCBTZXRUeSwgdHJ1ZT4geworICBkZl9leHRfaXRlcmF0b3IoY29uc3QgZGZfaXRlcmF0b3I8VCwgU2V0VHksIHRydWU+ICZWKQorICAgIDogZGZfaXRlcmF0b3I8VCwgU2V0VHksIHRydWU+KFYpIHt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgU2V0VHk+CitkZl9leHRfaXRlcmF0b3I8VCwgU2V0VHk+IGRmX2V4dF9iZWdpbihjb25zdCBUJiBHLCBTZXRUeSAmUykgeworICByZXR1cm4gZGZfZXh0X2l0ZXJhdG9yPFQsIFNldFR5Pjo6YmVnaW4oRywgUyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBTZXRUeT4KK2RmX2V4dF9pdGVyYXRvcjxULCBTZXRUeT4gZGZfZXh0X2VuZChjb25zdCBUJiBHLCBTZXRUeSAmUykgeworICByZXR1cm4gZGZfZXh0X2l0ZXJhdG9yPFQsIFNldFR5Pjo6ZW5kKEcsIFMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgU2V0VHk+CitpdGVyYXRvcl9yYW5nZTxkZl9leHRfaXRlcmF0b3I8VCwgU2V0VHk+PiBkZXB0aF9maXJzdF9leHQoY29uc3QgVCYgRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXRUeSAmUykgeworICByZXR1cm4gbWFrZV9yYW5nZShkZl9leHRfYmVnaW4oRywgUyksIGRmX2V4dF9lbmQoRywgUykpOworfQorCisvLyBQcm92aWRlIGdsb2JhbCBkZWZpbml0aW9ucyBvZiBpbnZlcnNlIGRlcHRoIGZpcnN0IGl0ZXJhdG9ycy4uLgordGVtcGxhdGUgPGNsYXNzIFQsCisgICAgICAgICAgY2xhc3MgU2V0VHkgPQorICAgICAgICAgICAgICBkZl9pdGVyYXRvcl9kZWZhdWx0X3NldDx0eXBlbmFtZSBHcmFwaFRyYWl0czxUPjo6Tm9kZVJlZj4sCisgICAgICAgICAgYm9vbCBFeHRlcm5hbCA9IGZhbHNlPgorc3RydWN0IGlkZl9pdGVyYXRvciA6IHB1YmxpYyBkZl9pdGVyYXRvcjxJbnZlcnNlPFQ+LCBTZXRUeSwgRXh0ZXJuYWw+IHsKKyAgaWRmX2l0ZXJhdG9yKGNvbnN0IGRmX2l0ZXJhdG9yPEludmVyc2U8VD4sIFNldFR5LCBFeHRlcm5hbD4gJlYpCisgICAgOiBkZl9pdGVyYXRvcjxJbnZlcnNlPFQ+LCBTZXRUeSwgRXh0ZXJuYWw+KFYpIHt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lkZl9pdGVyYXRvcjxUPiBpZGZfYmVnaW4oY29uc3QgVCYgRykgeworICByZXR1cm4gaWRmX2l0ZXJhdG9yPFQ+OjpiZWdpbihJbnZlcnNlPFQ+KEcpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitpZGZfaXRlcmF0b3I8VD4gaWRmX2VuZChjb25zdCBUJiBHKXsKKyAgcmV0dXJuIGlkZl9pdGVyYXRvcjxUPjo6ZW5kKEludmVyc2U8VD4oRykpOworfQorCisvLyBQcm92aWRlIGFuIGFjY2Vzc29yIG1ldGhvZCB0byB1c2UgdGhlbSBpbiByYW5nZS1iYXNlZCBwYXR0ZXJucy4KK3RlbXBsYXRlIDxjbGFzcyBUPgoraXRlcmF0b3JfcmFuZ2U8aWRmX2l0ZXJhdG9yPFQ+PiBpbnZlcnNlX2RlcHRoX2ZpcnN0KGNvbnN0IFQmIEcpIHsKKyAgcmV0dXJuIG1ha2VfcmFuZ2UoaWRmX2JlZ2luKEcpLCBpZGZfZW5kKEcpKTsKK30KKworLy8gUHJvdmlkZSBnbG9iYWwgZGVmaW5pdGlvbnMgb2YgZXh0ZXJuYWwgaW52ZXJzZSBkZXB0aCBmaXJzdCBpdGVyYXRvcnMuLi4KK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBTZXRUeSA9IHN0ZDo6c2V0PHR5cGVuYW1lIEdyYXBoVHJhaXRzPFQ+OjpOb2RlUmVmPj4KK3N0cnVjdCBpZGZfZXh0X2l0ZXJhdG9yIDogcHVibGljIGlkZl9pdGVyYXRvcjxULCBTZXRUeSwgdHJ1ZT4geworICBpZGZfZXh0X2l0ZXJhdG9yKGNvbnN0IGlkZl9pdGVyYXRvcjxULCBTZXRUeSwgdHJ1ZT4gJlYpCisgICAgOiBpZGZfaXRlcmF0b3I8VCwgU2V0VHksIHRydWU+KFYpIHt9CisgIGlkZl9leHRfaXRlcmF0b3IoY29uc3QgZGZfaXRlcmF0b3I8SW52ZXJzZTxUPiwgU2V0VHksIHRydWU+ICZWKQorICAgIDogaWRmX2l0ZXJhdG9yPFQsIFNldFR5LCB0cnVlPihWKSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFNldFR5PgoraWRmX2V4dF9pdGVyYXRvcjxULCBTZXRUeT4gaWRmX2V4dF9iZWdpbihjb25zdCBUJiBHLCBTZXRUeSAmUykgeworICByZXR1cm4gaWRmX2V4dF9pdGVyYXRvcjxULCBTZXRUeT46OmJlZ2luKEludmVyc2U8VD4oRyksIFMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgU2V0VHk+CitpZGZfZXh0X2l0ZXJhdG9yPFQsIFNldFR5PiBpZGZfZXh0X2VuZChjb25zdCBUJiBHLCBTZXRUeSAmUykgeworICByZXR1cm4gaWRmX2V4dF9pdGVyYXRvcjxULCBTZXRUeT46OmVuZChJbnZlcnNlPFQ+KEcpLCBTKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFNldFR5PgoraXRlcmF0b3JfcmFuZ2U8aWRmX2V4dF9pdGVyYXRvcjxULCBTZXRUeT4+IGludmVyc2VfZGVwdGhfZmlyc3RfZXh0KGNvbnN0IFQmIEcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0VHkgJlMpIHsKKyAgcmV0dXJuIG1ha2VfcmFuZ2UoaWRmX2V4dF9iZWdpbihHLCBTKSwgaWRmX2V4dF9lbmQoRywgUykpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfREVQVEhGSVJTVElURVJBVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0Vwb2NoVHJhY2tlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvRXBvY2hUcmFja2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIzOWJhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0Vwb2NoVHJhY2tlci5oCkBAIC0wLDAgKzEsMTAwIEBACisvLz09PS0gbGx2bS9BRFQvRXBvY2hUcmFja2VyLmggLSBBRFQgZXBvY2ggdHJhY2tpbmcgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBEZWJ1Z0Vwb2NoQmFzZSBhbmQgRGVidWdFcG9jaEJhc2U6OkhhbmRsZUJhc2UgY2xhc3Nlcy4KKy8vIFRoZXNlIGNhbiBiZSB1c2VkIHRvIHdyaXRlIGl0ZXJhdG9ycyB0aGF0IGFyZSBmYWlsLWZhc3Qgd2hlbiBMTFZNIGlzIGJ1aWx0CisvLyB3aXRoIGFzc2VydHMgZW5hYmxlZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0VQT0NIX1RSQUNLRVJfSAorI2RlZmluZSBMTFZNX0FEVF9FUE9DSF9UUkFDS0VSX0gKKworI2luY2x1ZGUgImxsdm0vQ29uZmlnL2FiaS1icmVha2luZy5oIgorI2luY2x1ZGUgImxsdm0vQ29uZmlnL2xsdm0tY29uZmlnLmgiCisKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKKyNpZiBMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTCisKKy8vLyBcYnJpZWYgQSBiYXNlIGNsYXNzIGZvciBkYXRhIHN0cnVjdHVyZSBjbGFzc2VzIHdpc2hpbmcgdG8gbWFrZSBpdGVyYXRvcnMKKy8vLyAoImhhbmRsZXMiKSBwb2ludGluZyBpbnRvIHRoZW1zZWx2ZXMgZmFpbC1mYXN0LiAgV2hlbiBidWlsZGluZyB3aXRob3V0CisvLy8gYXNzZXJ0cywgdGhpcyBjbGFzcyBpcyBlbXB0eSBhbmQgZG9lcyBub3RoaW5nLgorLy8vCisvLy8gRGVidWdFcG9jaEJhc2UgZG9lcyBub3QgYnkgaXRzZWxmIHRyYWNrIGhhbmRsZXMgcG9pbnRpbmcgaW50byBpdHNlbGYuICBUaGUKKy8vLyBleHBlY3RhdGlvbiBpcyB0aGF0IHJvdXRpbmVzIHRvdWNoaW5nIHRoZSBoYW5kbGVzIHdpbGwgcG9sbCBvbgorLy8vIGlzSGFuZGxlSW5TeW5jIGF0IGFwcHJvcHJpYXRlIHBvaW50cyB0byBhc3NlcnQgdGhhdCB0aGUgaGFuZGxlIHRoZXkncmUgdXNpbmcKKy8vLyBpcyBzdGlsbCB2YWxpZC4KKy8vLworY2xhc3MgRGVidWdFcG9jaEJhc2UgeworICB1aW50NjRfdCBFcG9jaDsKKworcHVibGljOgorICBEZWJ1Z0Vwb2NoQmFzZSgpIDogRXBvY2goMCkge30KKworICAvLy8gXGJyaWVmIENhbGxpbmcgaW5jcmVtZW50RXBvY2ggaW52YWxpZGF0ZXMgYWxsIGhhbmRsZXMgcG9pbnRpbmcgaW50byB0aGUKKyAgLy8vIGNhbGxpbmcgaW5zdGFuY2UuCisgIHZvaWQgaW5jcmVtZW50RXBvY2goKSB7ICsrRXBvY2g7IH0KKworICAvLy8gXGJyaWVmIFRoZSBkZXN0cnVjdG9yIGNhbGxzIGluY3JlbWVudEVwb2NoIHRvIG1ha2UgdXNlLWFmdGVyLWZyZWUgYnVncworICAvLy8gbW9yZSBsaWtlbHkgdG8gY3Jhc2ggZGV0ZXJtaW5pc3RpY2FsbHkuCisgIH5EZWJ1Z0Vwb2NoQmFzZSgpIHsgaW5jcmVtZW50RXBvY2goKTsgfQorCisgIC8vLyBcYnJpZWYgQSBiYXNlIGNsYXNzIGZvciBpdGVyYXRvciBjbGFzc2VzICgiaGFuZGxlcyIpIHRoYXQgd2lzaCB0byBwb2xsIGZvcgorICAvLy8gaXRlcmF0b3IgaW52YWxpZGF0aW5nIG1vZGlmaWNhdGlvbnMgaW4gdGhlIHVuZGVybHlpbmcgZGF0YSBzdHJ1Y3R1cmUuCisgIC8vLyBXaGVuIExMVk0gaXMgYnVpbHQgd2l0aG91dCBhc3NlcnRzLCB0aGlzIGNsYXNzIGlzIGVtcHR5IGFuZCBkb2VzIG5vdGhpbmcuCisgIC8vLworICAvLy8gSGFuZGxlQmFzZSBkb2VzIG5vdCB0cmFjayB0aGUgcGFyZW50IGRhdGEgc3RydWN0dXJlIGJ5IGl0c2VsZi4gIEl0IGV4cGVjdHMKKyAgLy8vIHRoZSByb3V0aW5lcyBtb2RpZnlpbmcgdGhlIGRhdGEgc3RydWN0dXJlIHRvIGNhbGwgaW5jcmVtZW50RXBvY2ggd2hlbiB0aGV5CisgIC8vLyBtYWtlIGFuIGl0ZXJhdG9yLWludmFsaWRhdGluZyBtb2RpZmljYXRpb24uCisgIC8vLworICBjbGFzcyBIYW5kbGVCYXNlIHsKKyAgICBjb25zdCB1aW50NjRfdCAqRXBvY2hBZGRyZXNzOworICAgIHVpbnQ2NF90IEVwb2NoQXRDcmVhdGlvbjsKKworICBwdWJsaWM6CisgICAgSGFuZGxlQmFzZSgpIDogRXBvY2hBZGRyZXNzKG51bGxwdHIpLCBFcG9jaEF0Q3JlYXRpb24oVUlOVDY0X01BWCkge30KKworICAgIGV4cGxpY2l0IEhhbmRsZUJhc2UoY29uc3QgRGVidWdFcG9jaEJhc2UgKlBhcmVudCkKKyAgICAgICAgOiBFcG9jaEFkZHJlc3MoJlBhcmVudC0+RXBvY2gpLCBFcG9jaEF0Q3JlYXRpb24oUGFyZW50LT5FcG9jaCkge30KKworICAgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZSBEZWJ1Z0Vwb2NoQmFzZSB0aGlzIEhhbmRsZSBpcyBsaW5rZWQgdG8gaGFzCisgICAgLy8vIG5vdCBjYWxsZWQgaW5jcmVtZW50RXBvY2ggb24gaXRzZWxmIHNpbmNlIHRoZSBjcmVhdGlvbiBvZiB0aGlzCisgICAgLy8vIEhhbmRsZUJhc2UgaW5zdGFuY2UuCisgICAgYm9vbCBpc0hhbmRsZUluU3luYygpIGNvbnN0IHsgcmV0dXJuICpFcG9jaEFkZHJlc3MgPT0gRXBvY2hBdENyZWF0aW9uOyB9CisKKyAgICAvLy8gXGJyaWVmIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBlcG9jaCB3b3JkIHN0b3JlZCBpbiB0aGUgZGF0YSBzdHJ1Y3R1cmUKKyAgICAvLy8gdGhpcyBoYW5kbGUgcG9pbnRzIGludG8uICBDYW4gYmUgdXNlZCB0byBjaGVjayBpZiB0d28gaXRlcmF0b3JzIHBvaW50CisgICAgLy8vIGludG8gdGhlIHNhbWUgZGF0YSBzdHJ1Y3R1cmUuCisgICAgY29uc3Qgdm9pZCAqZ2V0RXBvY2hBZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gRXBvY2hBZGRyZXNzOyB9CisgIH07Cit9OworCisjZWxzZQorCitjbGFzcyBEZWJ1Z0Vwb2NoQmFzZSB7CitwdWJsaWM6CisgIHZvaWQgaW5jcmVtZW50RXBvY2goKSB7fQorCisgIGNsYXNzIEhhbmRsZUJhc2UgeworICBwdWJsaWM6CisgICAgSGFuZGxlQmFzZSgpID0gZGVmYXVsdDsKKyAgICBleHBsaWNpdCBIYW5kbGVCYXNlKGNvbnN0IERlYnVnRXBvY2hCYXNlICopIHt9CisgICAgYm9vbCBpc0hhbmRsZUluU3luYygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgICBjb25zdCB2b2lkICpnZXRFcG9jaEFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBudWxscHRyOyB9CisgIH07Cit9OworCisjZW5kaWYgLy8gTExWTV9FTkFCTEVfQUJJX0JSRUFLSU5HX0NIRUNLUworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvRXF1aXZhbGVuY2VDbGFzc2VzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9FcXVpdmFsZW5jZUNsYXNzZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lM2Y0ODQzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvRXF1aXZhbGVuY2VDbGFzc2VzLmgKQEAgLTAsMCArMSwyOTggQEAKKy8vPT09LSBsbHZtL0FEVC9FcXVpdmFsZW5jZUNsYXNzZXMuaCAtIEdlbmVyaWMgRXF1aXYuIENsYXNzZXMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gR2VuZXJpYyBpbXBsZW1lbnRhdGlvbiBvZiBlcXVpdmFsZW5jZSBjbGFzc2VzIHRocm91Z2ggdGhlIHVzZSBUYXJqYW4ncworLy8gZWZmaWNpZW50IHVuaW9uLWZpbmQgYWxnb3JpdGhtLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfRVFVSVZBTEVOQ0VDTEFTU0VTX0gKKyNkZWZpbmUgTExWTV9BRFRfRVFVSVZBTEVOQ0VDTEFTU0VTX0gKKworI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHNldD4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gRXF1aXZhbGVuY2VDbGFzc2VzIC0gVGhpcyByZXByZXNlbnRzIGEgY29sbGVjdGlvbiBvZiBlcXVpdmFsZW5jZSBjbGFzc2VzIGFuZAorLy8vIHN1cHBvcnRzIHRocmVlIGVmZmljaWVudCBvcGVyYXRpb25zOiBpbnNlcnQgYW4gZWxlbWVudCBpbnRvIGEgY2xhc3Mgb2YgaXRzCisvLy8gb3duLCB1bmlvbiB0d28gY2xhc3NlcywgYW5kIGZpbmQgdGhlIGNsYXNzIGZvciBhIGdpdmVuIGVsZW1lbnQuICBJbgorLy8vIGFkZGl0aW9uIHRvIHRoZXNlIG1vZGlmaWNhdGlvbiBtZXRob2RzLCBpdCBpcyBwb3NzaWJsZSB0byBpdGVyYXRlIG92ZXIgYWxsCisvLy8gb2YgdGhlIGVxdWl2YWxlbmNlIGNsYXNzZXMgYW5kIGFsbCBvZiB0aGUgZWxlbWVudHMgaW4gYSBjbGFzcy4KKy8vLworLy8vIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYW4gZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIHRoYXQgb25seSBzdG9yZXMgb25lIGNvcHkKKy8vLyBvZiB0aGUgZWxlbWVudCBiZWluZyBpbmRleGVkIHBlciBlbnRyeSBpbiB0aGUgc2V0LCBhbmQgYWxsb3dzIGFueSBhcmJpdHJhcnkKKy8vLyB0eXBlIHRvIGJlIGluZGV4ZWQgKGFzIGxvbmcgYXMgaXQgY2FuIGJlIG9yZGVyZWQgd2l0aCBvcGVyYXRvcjwpLgorLy8vCisvLy8gSGVyZSBpcyBhIHNpbXBsZSBleGFtcGxlIHVzaW5nIGludGVnZXJzOgorLy8vCisvLy8gXGNvZGUKKy8vLyAgRXF1aXZhbGVuY2VDbGFzc2VzPGludD4gRUM7CisvLy8gIEVDLnVuaW9uU2V0cygxLCAyKTsgICAgICAgICAgICAgICAgLy8gaW5zZXJ0IDEsIDIgaW50byB0aGUgc2FtZSBzZXQKKy8vLyAgRUMuaW5zZXJ0KDQpOyBFQy5pbnNlcnQoNSk7ICAgICAgICAvLyBpbnNlcnQgNCwgNSBpbnRvIG93biBzZXRzCisvLy8gIEVDLnVuaW9uU2V0cyg1LCAxKTsgICAgICAgICAgICAgICAgLy8gbWVyZ2UgdGhlIHNldCBmb3IgMSB3aXRoIDUncyBzZXQuCisvLy8KKy8vLyAgZm9yIChFcXVpdmFsZW5jZUNsYXNzZXM8aW50Pjo6aXRlcmF0b3IgSSA9IEVDLmJlZ2luKCksIEUgPSBFQy5lbmQoKTsKKy8vLyAgICAgICBJICE9IEU7ICsrSSkgeyAgICAgICAgICAgLy8gSXRlcmF0ZSBvdmVyIGFsbCBvZiB0aGUgZXF1aXZhbGVuY2Ugc2V0cy4KKy8vLyAgICBpZiAoIUktPmlzTGVhZGVyKCkpIGNvbnRpbnVlOyAgIC8vIElnbm9yZSBub24tbGVhZGVyIHNldHMuCisvLy8gICAgZm9yIChFcXVpdmFsZW5jZUNsYXNzZXM8aW50Pjo6bWVtYmVyX2l0ZXJhdG9yIE1JID0gRUMubWVtYmVyX2JlZ2luKEkpOworLy8vICAgICAgICAgTUkgIT0gRUMubWVtYmVyX2VuZCgpOyArK01JKSAgIC8vIExvb3Agb3ZlciBtZW1iZXJzIGluIHRoaXMgc2V0LgorLy8vICAgICAgY2VyciA8PCAqTUkgPDwgIiAiOyAgLy8gUHJpbnQgbWVtYmVyLgorLy8vICAgIGNlcnIgPDwgIlxuIjsgICAvLyBGaW5pc2ggc2V0LgorLy8vICB9CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoaXMgZXhhbXBsZSBwcmludHM6CisvLy8gICA0CisvLy8gICA1IDEgMgorLy8vCit0ZW1wbGF0ZSA8Y2xhc3MgRWxlbVR5PgorY2xhc3MgRXF1aXZhbGVuY2VDbGFzc2VzIHsKKyAgLy8vIEVDVmFsdWUgLSBUaGUgRXF1aXZhbGVuY2VDbGFzc2VzIGRhdGEgc3RydWN0dXJlIGlzIGp1c3QgYSBzZXQgb2YgdGhlc2UuCisgIC8vLyBFYWNoIG9mIHRoZXNlIHJlcHJlc2VudHMgYSByZWxhdGlvbiBmb3IgYSB2YWx1ZS4gIEZpcnN0IGl0IHN0b3JlcyB0aGUKKyAgLy8vIHZhbHVlIGl0c2VsZiwgd2hpY2ggcHJvdmlkZXMgdGhlIG9yZGVyaW5nIHRoYXQgdGhlIHNldCBxdWVyaWVzLiAgTmV4dCwgaXQKKyAgLy8vIHByb3ZpZGVzIGEgIm5leHQgcG9pbnRlciIsIHdoaWNoIGlzIHVzZWQgdG8gZW51bWVyYXRlIGFsbCBvZiB0aGUgZWxlbWVudHMKKyAgLy8vIGluIHRoZSB1bmlvbmVkIHNldC4gIEZpbmFsbHksIGl0IGRlZmluZXMgZWl0aGVyIGEgImVuZCBvZiBsaXN0IHBvaW50ZXIiIG9yCisgIC8vLyAibGVhZGVyIHBvaW50ZXIiIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSB2YWx1ZSBpdHNlbGYgaXMgYSBsZWFkZXIuICBBCisgIC8vLyAibGVhZGVyIHBvaW50ZXIiIHBvaW50cyB0byB0aGUgbm9kZSB0aGF0IGlzIHRoZSBsZWFkZXIgZm9yIHRoaXMgZWxlbWVudCwKKyAgLy8vIGlmIHRoZSBub2RlIGlzIG5vdCBhIGxlYWRlci4gIEEgImVuZCBvZiBsaXN0IHBvaW50ZXIiIHBvaW50cyB0byB0aGUgbGFzdAorICAvLy8gbm9kZSBpbiB0aGUgbGlzdCBvZiBtZW1iZXJzIG9mIHRoaXMgbGlzdC4gIFdoZXRoZXIgb3Igbm90IGEgbm9kZSBpcyBhCisgIC8vLyBsZWFkZXIgaXMgZGV0ZXJtaW5lZCBieSBhIGJpdCBzdG9sZW4gZnJvbSBvbmUgb2YgdGhlIHBvaW50ZXJzLgorICBjbGFzcyBFQ1ZhbHVlIHsKKyAgICBmcmllbmQgY2xhc3MgRXF1aXZhbGVuY2VDbGFzc2VzOworCisgICAgbXV0YWJsZSBjb25zdCBFQ1ZhbHVlICpMZWFkZXIsICpOZXh0OworICAgIEVsZW1UeSBEYXRhOworCisgICAgLy8gRUNWYWx1ZSBjdG9yIC0gU3RhcnQgb3V0IHdpdGggRW5kT2ZMaXN0IHBvaW50aW5nIHRvIHRoaXMgbm9kZSwgTmV4dCBpcworICAgIC8vIE51bGwsIGlzTGVhZGVyID0gdHJ1ZS4KKyAgICBFQ1ZhbHVlKGNvbnN0IEVsZW1UeSAmRWx0KQorICAgICAgOiBMZWFkZXIodGhpcyksIE5leHQoKEVDVmFsdWUqKShpbnRwdHJfdCkxKSwgRGF0YShFbHQpIHt9CisKKyAgICBjb25zdCBFQ1ZhbHVlICpnZXRMZWFkZXIoKSBjb25zdCB7CisgICAgICBpZiAoaXNMZWFkZXIoKSkgcmV0dXJuIHRoaXM7CisgICAgICBpZiAoTGVhZGVyLT5pc0xlYWRlcigpKSByZXR1cm4gTGVhZGVyOworICAgICAgLy8gUGF0aCBjb21wcmVzc2lvbi4KKyAgICAgIHJldHVybiBMZWFkZXIgPSBMZWFkZXItPmdldExlYWRlcigpOworICAgIH0KKworICAgIGNvbnN0IEVDVmFsdWUgKmdldEVuZE9mTGlzdCgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChpc0xlYWRlcigpICYmICJDYW5ub3QgZ2V0IHRoZSBlbmQgb2YgYSBsaXN0IGZvciBhIG5vbi1sZWFkZXIhIik7CisgICAgICByZXR1cm4gTGVhZGVyOworICAgIH0KKworICAgIHZvaWQgc2V0TmV4dChjb25zdCBFQ1ZhbHVlICpOZXdOZXh0KSBjb25zdCB7CisgICAgICBhc3NlcnQoZ2V0TmV4dCgpID09IG51bGxwdHIgJiYgIkFscmVhZHkgaGFzIGEgbmV4dCBwb2ludGVyISIpOworICAgICAgTmV4dCA9IChjb25zdCBFQ1ZhbHVlKikoKGludHB0cl90KU5ld05leHQgfCAoaW50cHRyX3QpaXNMZWFkZXIoKSk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBFQ1ZhbHVlKGNvbnN0IEVDVmFsdWUgJlJIUykgOiBMZWFkZXIodGhpcyksIE5leHQoKEVDVmFsdWUqKShpbnRwdHJfdCkxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEYXRhKFJIUy5EYXRhKSB7CisgICAgICAvLyBPbmx5IHN1cHBvcnQgY29weWluZyBvZiBzaW5nbGV0b24gbm9kZXMuCisgICAgICBhc3NlcnQoUkhTLmlzTGVhZGVyKCkgJiYgUkhTLmdldE5leHQoKSA9PSBudWxscHRyICYmICJOb3QgYSBzaW5nbGV0b24hIik7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgRUNWYWx1ZSAmVUZOKSBjb25zdCB7IHJldHVybiBEYXRhIDwgVUZOLkRhdGE7IH0KKworICAgIGJvb2wgaXNMZWFkZXIoKSBjb25zdCB7IHJldHVybiAoaW50cHRyX3QpTmV4dCAmIDE7IH0KKyAgICBjb25zdCBFbGVtVHkgJmdldERhdGEoKSBjb25zdCB7IHJldHVybiBEYXRhOyB9CisKKyAgICBjb25zdCBFQ1ZhbHVlICpnZXROZXh0KCkgY29uc3QgeworICAgICAgcmV0dXJuIChFQ1ZhbHVlKikoKGludHB0cl90KU5leHQgJiB+KGludHB0cl90KTEpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgVCAmVmFsKSBjb25zdCB7IHJldHVybiBEYXRhIDwgVmFsOyB9CisgIH07CisKKyAgLy8vIFRoZU1hcHBpbmcgLSBUaGlzIGltcGxpY2l0bHkgcHJvdmlkZXMgYSBtYXBwaW5nIGZyb20gRWxlbVR5IHZhbHVlcyB0byB0aGUKKyAgLy8vIEVDVmFsdWVzLCBpdCBqdXN0IGtlZXBzIHRoZSBrZXkgYXMgcGFydCBvZiB0aGUgdmFsdWUuCisgIHN0ZDo6c2V0PEVDVmFsdWU+IFRoZU1hcHBpbmc7CisKK3B1YmxpYzoKKyAgRXF1aXZhbGVuY2VDbGFzc2VzKCkgPSBkZWZhdWx0OworICBFcXVpdmFsZW5jZUNsYXNzZXMoY29uc3QgRXF1aXZhbGVuY2VDbGFzc2VzICZSSFMpIHsKKyAgICBvcGVyYXRvcj0oUkhTKTsKKyAgfQorCisgIGNvbnN0IEVxdWl2YWxlbmNlQ2xhc3NlcyAmb3BlcmF0b3I9KGNvbnN0IEVxdWl2YWxlbmNlQ2xhc3NlcyAmUkhTKSB7CisgICAgVGhlTWFwcGluZy5jbGVhcigpOworICAgIGZvciAoaXRlcmF0b3IgSSA9IFJIUy5iZWdpbigpLCBFID0gUkhTLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGlmIChJLT5pc0xlYWRlcigpKSB7CisgICAgICAgIG1lbWJlcl9pdGVyYXRvciBNSSA9IFJIUy5tZW1iZXJfYmVnaW4oSSk7CisgICAgICAgIG1lbWJlcl9pdGVyYXRvciBMZWFkZXJJdCA9IG1lbWJlcl9iZWdpbihpbnNlcnQoKk1JKSk7CisgICAgICAgIGZvciAoKytNSTsgTUkgIT0gbWVtYmVyX2VuZCgpOyArK01JKQorICAgICAgICAgIHVuaW9uU2V0cyhMZWFkZXJJdCwgbWVtYmVyX2JlZ2luKGluc2VydCgqTUkpKSk7CisgICAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEluc3BlY3Rpb24gbWV0aG9kcworICAvLworCisgIC8vLyBpdGVyYXRvciogLSBQcm92aWRlcyBhIHdheSB0byBpdGVyYXRlIG92ZXIgYWxsIHZhbHVlcyBpbiB0aGUgc2V0LgorICB1c2luZyBpdGVyYXRvciA9IHR5cGVuYW1lIHN0ZDo6c2V0PEVDVmFsdWU+Ojpjb25zdF9pdGVyYXRvcjsKKworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFRoZU1hcHBpbmcuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBUaGVNYXBwaW5nLmVuZCgpOyB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFRoZU1hcHBpbmcuZW1wdHkoKTsgfQorCisgIC8vLyBtZW1iZXJfKiBJdGVyYXRlIG92ZXIgdGhlIG1lbWJlcnMgb2YgYW4gZXF1aXZhbGVuY2UgY2xhc3MuCisgIGNsYXNzIG1lbWJlcl9pdGVyYXRvcjsKKyAgbWVtYmVyX2l0ZXJhdG9yIG1lbWJlcl9iZWdpbihpdGVyYXRvciBJKSBjb25zdCB7CisgICAgLy8gT25seSBsZWFkZXJzIHByb3ZpZGUgYW55dGhpbmcgdG8gaXRlcmF0ZSBvdmVyLgorICAgIHJldHVybiBtZW1iZXJfaXRlcmF0b3IoSS0+aXNMZWFkZXIoKSA/ICYqSSA6IG51bGxwdHIpOworICB9CisgIG1lbWJlcl9pdGVyYXRvciBtZW1iZXJfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBtZW1iZXJfaXRlcmF0b3IobnVsbHB0cik7CisgIH0KKworICAvLy8gZmluZFZhbHVlIC0gUmV0dXJuIGFuIGl0ZXJhdG9yIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUuICBJZiBpdCBkb2VzIG5vdAorICAvLy8gZXhpc3QsIGVuZCgpIGlzIHJldHVybmVkLgorICBpdGVyYXRvciBmaW5kVmFsdWUoY29uc3QgRWxlbVR5ICZWKSBjb25zdCB7CisgICAgcmV0dXJuIFRoZU1hcHBpbmcuZmluZChWKTsKKyAgfQorCisgIC8vLyBnZXRMZWFkZXJWYWx1ZSAtIFJldHVybiB0aGUgbGVhZGVyIGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlIHRoYXQgaXMgaW4gdGhlCisgIC8vLyBzZXQuICBJdCBpcyBhbiBlcnJvciB0byBjYWxsIHRoaXMgbWV0aG9kIGZvciBhIHZhbHVlIHRoYXQgaXMgbm90IHlldCBpbgorICAvLy8gdGhlIHNldC4gIEZvciB0aGF0LCBjYWxsIGdldE9ySW5zZXJ0TGVhZGVyVmFsdWUoVikuCisgIGNvbnN0IEVsZW1UeSAmZ2V0TGVhZGVyVmFsdWUoY29uc3QgRWxlbVR5ICZWKSBjb25zdCB7CisgICAgbWVtYmVyX2l0ZXJhdG9yIE1JID0gZmluZExlYWRlcihWKTsKKyAgICBhc3NlcnQoTUkgIT0gbWVtYmVyX2VuZCgpICYmICJWYWx1ZSBpcyBub3QgaW4gdGhlIHNldCEiKTsKKyAgICByZXR1cm4gKk1JOworICB9CisKKyAgLy8vIGdldE9ySW5zZXJ0TGVhZGVyVmFsdWUgLSBSZXR1cm4gdGhlIGxlYWRlciBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZSB0aGF0IGlzCisgIC8vLyBpbiB0aGUgc2V0LiAgSWYgdGhlIG1lbWJlciBpcyBub3QgaW4gdGhlIHNldCwgaXQgaXMgaW5zZXJ0ZWQsIHRoZW4KKyAgLy8vIHJldHVybmVkLgorICBjb25zdCBFbGVtVHkgJmdldE9ySW5zZXJ0TGVhZGVyVmFsdWUoY29uc3QgRWxlbVR5ICZWKSB7CisgICAgbWVtYmVyX2l0ZXJhdG9yIE1JID0gZmluZExlYWRlcihpbnNlcnQoVikpOworICAgIGFzc2VydChNSSAhPSBtZW1iZXJfZW5kKCkgJiYgIlZhbHVlIGlzIG5vdCBpbiB0aGUgc2V0ISIpOworICAgIHJldHVybiAqTUk7CisgIH0KKworICAvLy8gZ2V0TnVtQ2xhc3NlcyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIGVxdWl2YWxlbmNlIGNsYXNzZXMgaW4gdGhpcyBzZXQuCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBpcyBhIGxpbmVhciB0aW1lIG9wZXJhdGlvbi4KKyAgdW5zaWduZWQgZ2V0TnVtQ2xhc3NlcygpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBOQyA9IDA7CisgICAgZm9yIChpdGVyYXRvciBJID0gYmVnaW4oKSwgRSA9IGVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIGlmIChJLT5pc0xlYWRlcigpKSArK05DOworICAgIHJldHVybiBOQzsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBNdXRhdGlvbiBtZXRob2RzCisKKyAgLy8vIGluc2VydCAtIEluc2VydCBhIG5ldyB2YWx1ZSBpbnRvIHRoZSB1bmlvbi9maW5kIHNldCwgaWdub3JpbmcgdGhlIHJlcXVlc3QKKyAgLy8vIGlmIHRoZSB2YWx1ZSBhbHJlYWR5IGV4aXN0cy4KKyAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0IEVsZW1UeSAmRGF0YSkgeworICAgIHJldHVybiBUaGVNYXBwaW5nLmluc2VydChFQ1ZhbHVlKERhdGEpKS5maXJzdDsKKyAgfQorCisgIC8vLyBmaW5kTGVhZGVyIC0gR2l2ZW4gYSB2YWx1ZSBpbiB0aGUgc2V0LCByZXR1cm4gYSBtZW1iZXIgaXRlcmF0b3IgZm9yIHRoZQorICAvLy8gZXF1aXZhbGVuY2UgY2xhc3MgaXQgaXMgaW4uICBUaGlzIGRvZXMgdGhlIHBhdGgtY29tcHJlc3Npb24gcGFydCB0aGF0CisgIC8vLyBtYWtlcyB1bmlvbi1maW5kICJ1bmlvbiBmaW5keSIuICBUaGlzIHJldHVybnMgYW4gZW5kIGl0ZXJhdG9yIGlmIHRoZSB2YWx1ZQorICAvLy8gaXMgbm90IGluIHRoZSBlcXVpdmFsZW5jZSBjbGFzcy4KKyAgbWVtYmVyX2l0ZXJhdG9yIGZpbmRMZWFkZXIoaXRlcmF0b3IgSSkgY29uc3QgeworICAgIGlmIChJID09IFRoZU1hcHBpbmcuZW5kKCkpIHJldHVybiBtZW1iZXJfZW5kKCk7CisgICAgcmV0dXJuIG1lbWJlcl9pdGVyYXRvcihJLT5nZXRMZWFkZXIoKSk7CisgIH0KKyAgbWVtYmVyX2l0ZXJhdG9yIGZpbmRMZWFkZXIoY29uc3QgRWxlbVR5ICZWKSBjb25zdCB7CisgICAgcmV0dXJuIGZpbmRMZWFkZXIoVGhlTWFwcGluZy5maW5kKFYpKTsKKyAgfQorCisgIC8vLyB1bmlvbiAtIE1lcmdlIHRoZSB0d28gZXF1aXZhbGVuY2Ugc2V0cyBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZXMsIGluc2VydGluZworICAvLy8gdGhlbSBpZiB0aGV5IGRvIG5vdCBhbHJlYWR5IGV4aXN0IGluIHRoZSBlcXVpdmFsZW5jZSBzZXQuCisgIG1lbWJlcl9pdGVyYXRvciB1bmlvblNldHMoY29uc3QgRWxlbVR5ICZWMSwgY29uc3QgRWxlbVR5ICZWMikgeworICAgIGl0ZXJhdG9yIFYxSSA9IGluc2VydChWMSksIFYySSA9IGluc2VydChWMik7CisgICAgcmV0dXJuIHVuaW9uU2V0cyhmaW5kTGVhZGVyKFYxSSksIGZpbmRMZWFkZXIoVjJJKSk7CisgIH0KKyAgbWVtYmVyX2l0ZXJhdG9yIHVuaW9uU2V0cyhtZW1iZXJfaXRlcmF0b3IgTDEsIG1lbWJlcl9pdGVyYXRvciBMMikgeworICAgIGFzc2VydChMMSAhPSBtZW1iZXJfZW5kKCkgJiYgTDIgIT0gbWVtYmVyX2VuZCgpICYmICJJbGxlZ2FsIGlucHV0cyEiKTsKKyAgICBpZiAoTDEgPT0gTDIpIHJldHVybiBMMTsgICAvLyBVbmlmeWluZyB0aGUgc2FtZSB0d28gc2V0cywgbm9vcC4KKworICAgIC8vIE90aGVyd2lzZSwgdGhpcyBpcyBhIHJlYWwgdW5pb24gb3BlcmF0aW9uLiAgU2V0IHRoZSBlbmQgb2YgdGhlIEwxIGxpc3QgdG8KKyAgICAvLyBwb2ludCB0byB0aGUgTDIgbGVhZGVyIG5vZGUuCisgICAgY29uc3QgRUNWYWx1ZSAmTDFMViA9ICpMMS5Ob2RlLCAmTDJMViA9ICpMMi5Ob2RlOworICAgIEwxTFYuZ2V0RW5kT2ZMaXN0KCktPnNldE5leHQoJkwyTFYpOworCisgICAgLy8gVXBkYXRlIEwxTFYncyBlbmQgb2YgbGlzdCBwb2ludGVyLgorICAgIEwxTFYuTGVhZGVyID0gTDJMVi5nZXRFbmRPZkxpc3QoKTsKKworICAgIC8vIENsZWFyIEwyJ3MgbGVhZGVyIGZsYWc6CisgICAgTDJMVi5OZXh0ID0gTDJMVi5nZXROZXh0KCk7CisKKyAgICAvLyBMMidzIGxlYWRlciBpcyBub3cgTDEuCisgICAgTDJMVi5MZWFkZXIgPSAmTDFMVjsKKyAgICByZXR1cm4gTDE7CisgIH0KKworICAvLyBpc0VxdWl2YWxlbnQgLSBSZXR1cm4gdHJ1ZSBpZiBWMSBpcyBlcXVpdmFsZW50IHRvIFYyLiBUaGlzIGNhbiBoYXBwZW4gaWYKKyAgLy8gVjEgaXMgZXF1YWwgdG8gVjIgb3IgaWYgdGhleSBiZWxvbmcgdG8gb25lIGVxdWl2YWxlbmNlIGNsYXNzLgorICBib29sIGlzRXF1aXZhbGVudChjb25zdCBFbGVtVHkgJlYxLCBjb25zdCBFbGVtVHkgJlYyKSBjb25zdCB7CisgICAgLy8gRmFzdCBwYXRoOiBhbnkgZWxlbWVudCBpcyBlcXVpdmFsZW50IHRvIGl0c2VsZi4KKyAgICBpZiAoVjEgPT0gVjIpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBhdXRvIEl0ID0gZmluZExlYWRlcihWMSk7CisgICAgcmV0dXJuIEl0ICE9IG1lbWJlcl9lbmQoKSAmJiBJdCA9PSBmaW5kTGVhZGVyKFYyKTsKKyAgfQorCisgIGNsYXNzIG1lbWJlcl9pdGVyYXRvciA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVsZW1UeSwgcHRyZGlmZl90PiB7CisgICAgZnJpZW5kIGNsYXNzIEVxdWl2YWxlbmNlQ2xhc3NlczsKKworICAgIHVzaW5nIHN1cGVyID0gc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbGVtVHksIHB0cmRpZmZfdD47CisKKyAgICBjb25zdCBFQ1ZhbHVlICpOb2RlOworCisgIHB1YmxpYzoKKyAgICB1c2luZyBzaXplX3R5cGUgPSBzaXplX3Q7CisgICAgdXNpbmcgcG9pbnRlciA9IHR5cGVuYW1lIHN1cGVyOjpwb2ludGVyOworICAgIHVzaW5nIHJlZmVyZW5jZSA9IHR5cGVuYW1lIHN1cGVyOjpyZWZlcmVuY2U7CisKKyAgICBleHBsaWNpdCBtZW1iZXJfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgICAgZXhwbGljaXQgbWVtYmVyX2l0ZXJhdG9yKGNvbnN0IEVDVmFsdWUgKk4pIDogTm9kZShOKSB7fQorCisgICAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgIGFzc2VydChOb2RlICE9IG51bGxwdHIgJiYgIkRlcmVmZXJlbmNpbmcgZW5kKCkhIik7CisgICAgICByZXR1cm4gTm9kZS0+Z2V0RGF0YSgpOworICAgIH0KKyAgICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmb3BlcmF0b3IqKCk7IH0KKworICAgIG1lbWJlcl9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICAgIGFzc2VydChOb2RlICE9IG51bGxwdHIgJiYgIisrJ2Qgb2ZmIHRoZSBlbmQgb2YgdGhlIGxpc3QhIik7CisgICAgICBOb2RlID0gTm9kZS0+Z2V0TmV4dCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG1lbWJlcl9pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAgICAvLyBwb3N0aW5jcmVtZW50IG9wZXJhdG9ycy4KKyAgICAgIG1lbWJlcl9pdGVyYXRvciB0bXAgPSAqdGhpczsKKyAgICAgICsrKnRoaXM7CisgICAgICByZXR1cm4gdG1wOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBtZW1iZXJfaXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgICAgcmV0dXJuIE5vZGUgPT0gUkhTLk5vZGU7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBtZW1iZXJfaXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgICAgcmV0dXJuIE5vZGUgIT0gUkhTLk5vZGU7CisgICAgfQorICB9OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX0VRVUlWQUxFTkNFQ0xBU1NFU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Gb2xkaW5nU2V0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Gb2xkaW5nU2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTM2M2U2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0ZvbGRpbmdTZXQuaApAQCAtMCwwICsxLDc2MiBAQAorLy89PT0tIGxsdm0vQURUL0ZvbGRpbmdTZXQuaCAtIFVuaXF1aW5nIEhhc2ggU2V0IC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIGhhc2ggc2V0IHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVtb3ZlIGR1cGxpY2F0aW9uIG9mIG5vZGVzCisvLyBpbiBhIGdyYXBoLiAgVGhpcyBjb2RlIHdhcyBvcmlnaW5hbGx5IGNyZWF0ZWQgYnkgQ2hyaXMgTGF0dG5lciBmb3IgdXNlIHdpdGgKKy8vIFNlbGVjdGlvbkRBR0NTRU1hcCwgYnV0IHdhcyBpc29sYXRlZCB0byBwcm92aWRlIHVzZSBhY3Jvc3MgdGhlIGxsdm0gY29kZSBzZXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9GT0xESU5HU0VUX0gKKyNkZWZpbmUgTExWTV9BRFRfRk9MRElOR1NFVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFRoaXMgZm9sZGluZyBzZXQgdXNlZCBmb3IgdHdvIHB1cnBvc2VzOgorLy8vICAgMS4gR2l2ZW4gaW5mb3JtYXRpb24gYWJvdXQgYSBub2RlIHdlIHdhbnQgdG8gY3JlYXRlLCBsb29rIHVwIHRoZSB1bmlxdWUKKy8vLyAgICAgIGluc3RhbmNlIG9mIHRoZSBub2RlIGluIHRoZSBzZXQuICBJZiB0aGUgbm9kZSBhbHJlYWR5IGV4aXN0cywgcmV0dXJuCisvLy8gICAgICBpdCwgb3RoZXJ3aXNlIHJldHVybiB0aGUgYnVja2V0IGl0IHNob3VsZCBiZSBpbnNlcnRlZCBpbnRvLgorLy8vICAgMi4gR2l2ZW4gYSBub2RlIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjcmVhdGVkLCByZW1vdmUgaXQgZnJvbSB0aGUgc2V0LgorLy8vCisvLy8gVGhpcyBjbGFzcyBpcyBpbXBsZW1lbnRlZCBhcyBhIHNpbmdsZS1saW5rIGNoYWluZWQgaGFzaCB0YWJsZSwgd2hlcmUgdGhlCisvLy8gImJ1Y2tldHMiIGFyZSBhY3R1YWxseSB0aGUgbm9kZXMgdGhlbXNlbHZlcyAodGhlIG5leHQgcG9pbnRlciBpcyBpbiB0aGUKKy8vLyBub2RlKS4gIFRoZSBsYXN0IG5vZGUgcG9pbnRzIGJhY2sgdG8gdGhlIGJ1Y2tldCB0byBzaW1wbGlmeSBub2RlIHJlbW92YWwuCisvLy8KKy8vLyBBbnkgbm9kZSB0aGF0IGlzIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBmb2xkaW5nIHNldCBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YKKy8vLyBGb2xkaW5nU2V0Tm9kZS4gIFRoZSBub2RlIGNsYXNzIG11c3QgYWxzbyBkZWZpbmUgYSBQcm9maWxlIG1ldGhvZCB1c2VkIHRvCisvLy8gZXN0YWJsaXNoIHRoZSB1bmlxdWUgYml0cyBvZiBkYXRhIGZvciB0aGUgbm9kZS4gIFRoZSBQcm9maWxlIG1ldGhvZCBpcworLy8vIHBhc3NlZCBhIEZvbGRpbmdTZXROb2RlSUQgb2JqZWN0IHdoaWNoIGlzIHVzZWQgdG8gZ2F0aGVyIHRoZSBiaXRzLiAgSnVzdAorLy8vIGNhbGwgb25lIG9mIHRoZSBBZGQqIGZ1bmN0aW9ucyBkZWZpbmVkIGluIHRoZSBGb2xkaW5nU2V0QmFzZTo6Tm9kZUlEIGNsYXNzLgorLy8vIE5PVEU6IFRoYXQgdGhlIGZvbGRpbmcgc2V0IGRvZXMgbm90IG93biB0aGUgbm9kZXMgYW5kIGl0IGlzIHRoZQorLy8vIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSB1c2VyIHRvIGRpc3Bvc2Ugb2YgdGhlIG5vZGVzLgorLy8vCisvLy8gRWcuCisvLy8gICAgY2xhc3MgTXlOb2RlIDogcHVibGljIEZvbGRpbmdTZXROb2RlIHsKKy8vLyAgICBwcml2YXRlOgorLy8vICAgICAgc3RkOjpzdHJpbmcgTmFtZTsKKy8vLyAgICAgIHVuc2lnbmVkIFZhbHVlOworLy8vICAgIHB1YmxpYzoKKy8vLyAgICAgIE15Tm9kZShjb25zdCBjaGFyICpOLCB1bnNpZ25lZCBWKSA6IE5hbWUoTiksIFZhbHVlKFYpIHt9CisvLy8gICAgICAgLi4uCisvLy8gICAgICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IHsKKy8vLyAgICAgICAgSUQuQWRkU3RyaW5nKE5hbWUpOworLy8vICAgICAgICBJRC5BZGRJbnRlZ2VyKFZhbHVlKTsKKy8vLyAgICAgIH0KKy8vLyAgICAgIC4uLgorLy8vICAgIH07CisvLy8KKy8vLyBUbyBkZWZpbmUgdGhlIGZvbGRpbmcgc2V0IGl0c2VsZiB1c2UgdGhlIEZvbGRpbmdTZXQgdGVtcGxhdGU7CisvLy8KKy8vLyBFZy4KKy8vLyAgICBGb2xkaW5nU2V0PE15Tm9kZT4gTXlGb2xkaW5nU2V0OworLy8vCisvLy8gRm91ciBwdWJsaWMgbWV0aG9kcyBhcmUgYXZhaWxhYmxlIHRvIG1hbmlwdWxhdGUgdGhlIGZvbGRpbmcgc2V0OworLy8vCisvLy8gMSkgSWYgeW91IGhhdmUgYW4gZXhpc3Rpbmcgbm9kZSB0aGF0IHlvdSB3YW50IGFkZCB0byB0aGUgc2V0IGJ1dCB1bnN1cmUKKy8vLyB0aGF0IHRoZSBub2RlIG1pZ2h0IGFscmVhZHkgZXhpc3QgdGhlbiBjYWxsOworLy8vCisvLy8gICAgTXlOb2RlICpNID0gTXlGb2xkaW5nU2V0LkdldE9ySW5zZXJ0Tm9kZShOKTsKKy8vLworLy8vIElmIFRoZSByZXN1bHQgaXMgZXF1YWwgdG8gdGhlIGlucHV0IHRoZW4gdGhlIG5vZGUgaGFzIGJlZW4gaW5zZXJ0ZWQuCisvLy8gT3RoZXJ3aXNlLCB0aGUgcmVzdWx0IGlzIHRoZSBub2RlIGV4aXN0aW5nIGluIHRoZSBmb2xkaW5nIHNldCwgYW5kIHRoZQorLy8vIGlucHV0IGNhbiBiZSBkaXNjYXJkZWQgKHVzZSB0aGUgcmVzdWx0IGluc3RlYWQuKQorLy8vCisvLy8gMikgSWYgeW91IGFyZSByZWFkeSB0byBjb25zdHJ1Y3QgYSBub2RlIGJ1dCB3YW50IHRvIGNoZWNrIGlmIGl0IGFscmVhZHkKKy8vLyBleGlzdHMsIHRoZW4gY2FsbCBGaW5kTm9kZU9ySW5zZXJ0UG9zIHdpdGggYSBGb2xkaW5nU2V0Tm9kZUlEIG9mIHRoZSBiaXRzIHRvCisvLy8gY2hlY2s7CisvLy8KKy8vLyAgIEZvbGRpbmdTZXROb2RlSUQgSUQ7CisvLy8gICBJRC5BZGRTdHJpbmcoTmFtZSk7CisvLy8gICBJRC5BZGRJbnRlZ2VyKFZhbHVlKTsKKy8vLyAgIHZvaWQgKkluc2VydFBvaW50OworLy8vCisvLy8gICAgTXlOb2RlICpNID0gTXlGb2xkaW5nU2V0LkZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIEluc2VydFBvaW50KTsKKy8vLworLy8vIElmIGZvdW5kIHRoZW4gTSB3aXRoIGJlIG5vbi1OVUxMLCBlbHNlIEluc2VydFBvaW50IHdpbGwgcG9pbnQgdG8gd2hlcmUgaXQKKy8vLyBzaG91bGQgYmUgaW5zZXJ0ZWQgdXNpbmcgSW5zZXJ0Tm9kZS4KKy8vLworLy8vIDMpIElmIHlvdSBnZXQgYSBOVUxMIHJlc3VsdCBmcm9tIEZpbmROb2RlT3JJbnNlcnRQb3MgdGhlbiB5b3UgY2FuIGFzIGEgbmV3CisvLy8gbm9kZSB3aXRoIEZpbmROb2RlT3JJbnNlcnRQb3M7CisvLy8KKy8vLyAgICBJbnNlcnROb2RlKE4sIEluc2VydFBvaW50KTsKKy8vLworLy8vIDQpIEZpbmFsbHksIGlmIHlvdSB3YW50IHRvIHJlbW92ZSBhIG5vZGUgZnJvbSB0aGUgZm9sZGluZyBzZXQgY2FsbDsKKy8vLworLy8vICAgIGJvb2wgV2FzUmVtb3ZlZCA9IFJlbW92ZU5vZGUoTik7CisvLy8KKy8vLyBUaGUgcmVzdWx0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBub2RlIGV4aXN0ZWQgaW4gdGhlIGZvbGRpbmcgc2V0LgorCitjbGFzcyBGb2xkaW5nU2V0Tm9kZUlEOworY2xhc3MgU3RyaW5nUmVmOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEZvbGRpbmdTZXRCYXNlIC0gSW1wbGVtZW50cyB0aGUgZm9sZGluZyBzZXQgZnVuY3Rpb25hbGl0eS4gIFRoZSBtYWluCisvLy8gc3RydWN0dXJlIGlzIGFuIGFycmF5IG9mIGJ1Y2tldHMuICBFYWNoIGJ1Y2tldCBpcyBpbmRleGVkIGJ5IHRoZSBoYXNoIG9mCisvLy8gdGhlIG5vZGVzIGl0IGNvbnRhaW5zLiAgVGhlIGJ1Y2tldCBpdHNlbGYgcG9pbnRzIHRvIHRoZSBub2RlcyBjb250YWluZWQKKy8vLyBpbiB0aGUgYnVja2V0IHZpYSBhIHNpbmdseSBsaW5rZWQgbGlzdC4gIFRoZSBsYXN0IG5vZGUgaW4gdGhlIGxpc3QgcG9pbnRzCisvLy8gYmFjayB0byB0aGUgYnVja2V0IHRvIGZhY2lsaXRhdGUgbm9kZSByZW1vdmFsLgorLy8vCitjbGFzcyBGb2xkaW5nU2V0QmFzZSB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsgLy8gT3V0IG9mIGxpbmUgdmlydHVhbCBtZXRob2QuCisKK3Byb3RlY3RlZDoKKyAgLy8vIEJ1Y2tldHMgLSBBcnJheSBvZiBidWNrZXQgY2hhaW5zLgorICB2b2lkICoqQnVja2V0czsKKworICAvLy8gTnVtQnVja2V0cyAtIExlbmd0aCBvZiB0aGUgQnVja2V0cyBhcnJheS4gIEFsd2F5cyBhIHBvd2VyIG9mIDIuCisgIHVuc2lnbmVkIE51bUJ1Y2tldHM7CisKKyAgLy8vIE51bU5vZGVzIC0gTnVtYmVyIG9mIG5vZGVzIGluIHRoZSBmb2xkaW5nIHNldC4gR3Jvd3RoIG9jY3VycyB3aGVuIE51bU5vZGVzCisgIC8vLyBpcyBncmVhdGVyIHRoYW4gdHdpY2UgdGhlIG51bWJlciBvZiBidWNrZXRzLgorICB1bnNpZ25lZCBOdW1Ob2RlczsKKworICBleHBsaWNpdCBGb2xkaW5nU2V0QmFzZSh1bnNpZ25lZCBMb2cySW5pdFNpemUgPSA2KTsKKyAgRm9sZGluZ1NldEJhc2UoRm9sZGluZ1NldEJhc2UgJiZBcmcpOworICBGb2xkaW5nU2V0QmFzZSAmb3BlcmF0b3I9KEZvbGRpbmdTZXRCYXNlICYmUkhTKTsKKyAgfkZvbGRpbmdTZXRCYXNlKCk7CisKK3B1YmxpYzoKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBOb2RlIC0gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIG1haW50YWluIHRoZSBzaW5nbHkgbGlua2VkIGJ1Y2tldCBsaXN0IGluCisgIC8vLyBhIGZvbGRpbmcgc2V0LgorICBjbGFzcyBOb2RlIHsKKyAgcHJpdmF0ZToKKyAgICAvLyBOZXh0SW5Gb2xkaW5nU2V0QnVja2V0IC0gbmV4dCBsaW5rIGluIHRoZSBidWNrZXQgbGlzdC4KKyAgICB2b2lkICpOZXh0SW5Gb2xkaW5nU2V0QnVja2V0ID0gbnVsbHB0cjsKKworICBwdWJsaWM6CisgICAgTm9kZSgpID0gZGVmYXVsdDsKKworICAgIC8vIEFjY2Vzc29ycworICAgIHZvaWQgKmdldE5leHRJbkJ1Y2tldCgpIGNvbnN0IHsgcmV0dXJuIE5leHRJbkZvbGRpbmdTZXRCdWNrZXQ7IH0KKyAgICB2b2lkIFNldE5leHRJbkJ1Y2tldCh2b2lkICpOKSB7IE5leHRJbkZvbGRpbmdTZXRCdWNrZXQgPSBOOyB9CisgIH07CisKKyAgLy8vIGNsZWFyIC0gUmVtb3ZlIGFsbCBub2RlcyBmcm9tIHRoZSBmb2xkaW5nIHNldC4KKyAgdm9pZCBjbGVhcigpOworCisgIC8vLyBzaXplIC0gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBmb2xkaW5nIHNldC4KKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIE51bU5vZGVzOyB9CisKKyAgLy8vIGVtcHR5IC0gUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBubyBub2RlcyBpbiB0aGUgZm9sZGluZyBzZXQuCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBOdW1Ob2RlcyA9PSAwOyB9CisKKyAgLy8vIHJlc2VydmUgLSBJbmNyZWFzZSB0aGUgbnVtYmVyIG9mIGJ1Y2tldHMgc3VjaCB0aGF0IGFkZGluZyB0aGUKKyAgLy8vIEVsdENvdW50LXRoIG5vZGUgd29uJ3QgY2F1c2UgYSByZWJ1Y2tldCBvcGVyYXRpb24uIHJlc2VydmUgaXMgcGVybWl0dGVkCisgIC8vLyB0byBhbGxvY2F0ZSBtb3JlIHNwYWNlIHRoYW4gcmVxdWVzdGVkIGJ5IEVsdENvdW50LgorICB2b2lkIHJlc2VydmUodW5zaWduZWQgRWx0Q291bnQpOworCisgIC8vLyBjYXBhY2l0eSAtIFJldHVybnMgdGhlIG51bWJlciBvZiBub2RlcyBwZXJtaXR0ZWQgaW4gdGhlIGZvbGRpbmcgc2V0CisgIC8vLyBiZWZvcmUgYSByZWJ1Y2tldCBvcGVyYXRpb24gaXMgcGVyZm9ybWVkLgorICB1bnNpZ25lZCBjYXBhY2l0eSgpIHsKKyAgICAvLyBXZSBhbGxvdyBhIGxvYWQgZmFjdG9yIG9mIHVwIHRvIDIuMCwKKyAgICAvLyBzbyB0aGF0IG1lYW5zIG91ciBjYXBhY2l0eSBpcyBOdW1CdWNrZXRzICogMgorICAgIHJldHVybiBOdW1CdWNrZXRzICogMjsKKyAgfQorCitwcml2YXRlOgorICAvLy8gR3Jvd0hhc2hUYWJsZSAtIERvdWJsZSB0aGUgc2l6ZSBvZiB0aGUgaGFzaCB0YWJsZSBhbmQgcmVoYXNoIGV2ZXJ5dGhpbmcuCisgIHZvaWQgR3Jvd0hhc2hUYWJsZSgpOworCisgIC8vLyBHcm93QnVja2V0Q291bnQgLSByZXNpemUgdGhlIGhhc2ggdGFibGUgYW5kIHJlaGFzaCBldmVyeXRoaW5nLgorICAvLy8gTmV3QnVja2V0Q291bnQgbXVzdCBiZSBhIHBvd2VyIG9mIHR3bywgYW5kIG11c3QgYmUgZ3JlYXRlciB0aGFuIHRoZSBvbGQKKyAgLy8vIGJ1Y2tldCBjb3VudC4KKyAgdm9pZCBHcm93QnVja2V0Q291bnQodW5zaWduZWQgTmV3QnVja2V0Q291bnQpOworCitwcm90ZWN0ZWQ6CisgIC8vLyBHZXROb2RlUHJvZmlsZSAtIEluc3RhbnRpYXRpb25zIG9mIHRoZSBGb2xkaW5nU2V0IHRlbXBsYXRlIGltcGxlbWVudAorICAvLy8gdGhpcyBmdW5jdGlvbiB0byBnYXRoZXIgZGF0YSBiaXRzIGZvciB0aGUgZ2l2ZW4gbm9kZS4KKyAgdmlydHVhbCB2b2lkIEdldE5vZGVQcm9maWxlKE5vZGUgKk4sIEZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCA9IDA7CisKKyAgLy8vIE5vZGVFcXVhbHMgLSBJbnN0YW50aWF0aW9ucyBvZiB0aGUgRm9sZGluZ1NldCB0ZW1wbGF0ZSBpbXBsZW1lbnQKKyAgLy8vIHRoaXMgZnVuY3Rpb24gdG8gY29tcGFyZSB0aGUgZ2l2ZW4gbm9kZSB3aXRoIHRoZSBnaXZlbiBJRC4KKyAgdmlydHVhbCBib29sIE5vZGVFcXVhbHMoTm9kZSAqTiwgY29uc3QgRm9sZGluZ1NldE5vZGVJRCAmSUQsIHVuc2lnbmVkIElESGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRm9sZGluZ1NldE5vZGVJRCAmVGVtcElEKSBjb25zdD0wOworCisgIC8vLyBDb21wdXRlTm9kZUhhc2ggLSBJbnN0YW50aWF0aW9ucyBvZiB0aGUgRm9sZGluZ1NldCB0ZW1wbGF0ZSBpbXBsZW1lbnQKKyAgLy8vIHRoaXMgZnVuY3Rpb24gdG8gY29tcHV0ZSBhIGhhc2ggdmFsdWUgZm9yIHRoZSBnaXZlbiBub2RlLgorICB2aXJ0dWFsIHVuc2lnbmVkIENvbXB1dGVOb2RlSGFzaChOb2RlICpOLCBGb2xkaW5nU2V0Tm9kZUlEICZUZW1wSUQpIGNvbnN0ID0gMDsKKworICAvLyBUaGUgYmVsb3cgbWV0aG9kcyBhcmUgcHJvdGVjdGVkIHRvIGVuY291cmFnZSBzdWJjbGFzc2VzIHRvIHByb3ZpZGUgYSBtb3JlCisgIC8vIHR5cGUtc2FmZSBBUEkuCisKKyAgLy8vIFJlbW92ZU5vZGUgLSBSZW1vdmUgYSBub2RlIGZyb20gdGhlIGZvbGRpbmcgc2V0LCByZXR1cm5pbmcgdHJ1ZSBpZiBvbmUKKyAgLy8vIHdhcyByZW1vdmVkIG9yIGZhbHNlIGlmIHRoZSBub2RlIHdhcyBub3QgaW4gdGhlIGZvbGRpbmcgc2V0LgorICBib29sIFJlbW92ZU5vZGUoTm9kZSAqTik7CisKKyAgLy8vIEdldE9ySW5zZXJ0Tm9kZSAtIElmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIHNpbXBsZSBOb2RlIGV4YWN0bHkKKyAgLy8vIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgbm9kZSwgcmV0dXJuIGl0LiAgT3RoZXJ3aXNlLCBpbnNlcnQgJ04nIGFuZCByZXR1cm4KKyAgLy8vIGl0IGluc3RlYWQuCisgIE5vZGUgKkdldE9ySW5zZXJ0Tm9kZShOb2RlICpOKTsKKworICAvLy8gRmluZE5vZGVPckluc2VydFBvcyAtIExvb2sgdXAgdGhlIG5vZGUgc3BlY2lmaWVkIGJ5IElELiAgSWYgaXQgZXhpc3RzLAorICAvLy8gcmV0dXJuIGl0LiAgSWYgbm90LCByZXR1cm4gdGhlIGluc2VydGlvbiB0b2tlbiB0aGF0IHdpbGwgbWFrZSBpbnNlcnRpb24KKyAgLy8vIGZhc3Rlci4KKyAgTm9kZSAqRmluZE5vZGVPckluc2VydFBvcyhjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZJRCwgdm9pZCAqJkluc2VydFBvcyk7CisKKyAgLy8vIEluc2VydE5vZGUgLSBJbnNlcnQgdGhlIHNwZWNpZmllZCBub2RlIGludG8gdGhlIGZvbGRpbmcgc2V0LCBrbm93aW5nIHRoYXQKKyAgLy8vIGl0IGlzIG5vdCBhbHJlYWR5IGluIHRoZSBmb2xkaW5nIHNldC4gIEluc2VydFBvcyBtdXN0IGJlIG9idGFpbmVkIGZyb20KKyAgLy8vIEZpbmROb2RlT3JJbnNlcnRQb3MuCisgIHZvaWQgSW5zZXJ0Tm9kZShOb2RlICpOLCB2b2lkICpJbnNlcnRQb3MpOworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIERlZmF1bHRGb2xkaW5nU2V0VHJhaXQgLSBUaGlzIGNsYXNzIHByb3ZpZGVzIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zCisvLy8gZm9yIEZvbGRpbmdTZXRUcmFpdCBpbXBsZW1lbnRhdGlvbnMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgRGVmYXVsdEZvbGRpbmdTZXRUcmFpdCB7CisgIHN0YXRpYyB2b2lkIFByb2ZpbGUoY29uc3QgVCAmWCwgRm9sZGluZ1NldE5vZGVJRCAmSUQpIHsKKyAgICBYLlByb2ZpbGUoSUQpOworICB9CisgIHN0YXRpYyB2b2lkIFByb2ZpbGUoVCAmWCwgRm9sZGluZ1NldE5vZGVJRCAmSUQpIHsKKyAgICBYLlByb2ZpbGUoSUQpOworICB9CisKKyAgLy8gRXF1YWxzIC0gVGVzdCBpZiB0aGUgcHJvZmlsZSBmb3IgWCB3b3VsZCBtYXRjaCBJRCwgdXNpbmcgVGVtcElECisgIC8vIHRvIGNvbXB1dGUgYSB0ZW1wb3JhcnkgSUQgaWYgbmVjZXNzYXJ5LiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAvLyBqdXN0IGNhbGxzIFByb2ZpbGUgYW5kIGRvZXMgYSByZWd1bGFyIGNvbXBhcmlzb24uIEltcGxlbWVudGF0aW9ucworICAvLyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGltcGxlbWVudGF0aW9ucy4KKyAgc3RhdGljIGlubGluZSBib29sIEVxdWFscyhUICZYLCBjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZJRCwgdW5zaWduZWQgSURIYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbGRpbmdTZXROb2RlSUQgJlRlbXBJRCk7CisKKyAgLy8gQ29tcHV0ZUhhc2ggLSBDb21wdXRlIGEgaGFzaCB2YWx1ZSBmb3IgWCwgdXNpbmcgVGVtcElEIHRvCisgIC8vIGNvbXB1dGUgYSB0ZW1wb3JhcnkgSUQgaWYgbmVjZXNzYXJ5LiBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorICAvLyBqdXN0IGNhbGxzIFByb2ZpbGUgYW5kIGRvZXMgYSByZWd1bGFyIGhhc2ggY29tcHV0YXRpb24uCisgIC8vIEltcGxlbWVudGF0aW9ucyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBwcm92aWRlIG1vcmUgZWZmaWNpZW50CisgIC8vIGltcGxlbWVudGF0aW9ucy4KKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBDb21wdXRlSGFzaChUICZYLCBGb2xkaW5nU2V0Tm9kZUlEICZUZW1wSUQpOworfTsKKworLy8vIEZvbGRpbmdTZXRUcmFpdCAtIFRoaXMgdHJhaXQgY2xhc3MgaXMgdXNlZCB0byBkZWZpbmUgYmVoYXZpb3Igb2YgaG93CisvLy8gdG8gInByb2ZpbGUiIChpbiB0aGUgRm9sZGluZ1NldCBwYXJsYW5jZSkgYW4gb2JqZWN0IG9mIGEgZ2l2ZW4gdHlwZS4KKy8vLyBUaGUgZGVmYXVsdCBiZWhhdmlvciBpcyB0byBpbnZva2UgYSAnUHJvZmlsZScgbWV0aG9kIG9uIGFuIG9iamVjdCwgYnV0CisvLy8gdGhyb3VnaCB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbiB0aGUgYmVoYXZpb3IgY2FuIGJlIHRhaWxvcmVkIGZvciBzcGVjaWZpYworLy8vIHR5cGVzLiAgQ29tYmluZWQgd2l0aCB0aGUgRm9sZGluZ1NldE5vZGVXcmFwcGVyIGNsYXNzLCBvbmUgY2FuIGFkZCBvYmplY3RzCisvLy8gdG8gRm9sZGluZ1NldHMgdGhhdCB3ZXJlIG5vdCBvcmlnaW5hbGx5IGRlc2lnbmVkIHRvIGhhdmUgdGhhdCBiZWhhdmlvci4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBGb2xkaW5nU2V0VHJhaXQKKyAgOiBwdWJsaWMgRGVmYXVsdEZvbGRpbmdTZXRUcmFpdDxUPiB7fTsKKworLy8vIERlZmF1bHRDb250ZXh0dWFsRm9sZGluZ1NldFRyYWl0IC0gTGlrZSBEZWZhdWx0Rm9sZGluZ1NldFRyYWl0LCBidXQKKy8vLyBmb3IgQ29udGV4dHVhbEZvbGRpbmdTZXRzLgordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ3R4Pgorc3RydWN0IERlZmF1bHRDb250ZXh0dWFsRm9sZGluZ1NldFRyYWl0IHsKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShUICZYLCBGb2xkaW5nU2V0Tm9kZUlEICZJRCwgQ3R4IENvbnRleHQpIHsKKyAgICBYLlByb2ZpbGUoSUQsIENvbnRleHQpOworICB9CisKKyAgc3RhdGljIGlubGluZSBib29sIEVxdWFscyhUICZYLCBjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZJRCwgdW5zaWduZWQgSURIYXNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbGRpbmdTZXROb2RlSUQgJlRlbXBJRCwgQ3R4IENvbnRleHQpOworICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIENvbXB1dGVIYXNoKFQgJlgsIEZvbGRpbmdTZXROb2RlSUQgJlRlbXBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdHggQ29udGV4dCk7Cit9OworCisvLy8gQ29udGV4dHVhbEZvbGRpbmdTZXRUcmFpdCAtIExpa2UgRm9sZGluZ1NldFRyYWl0LCBidXQgZm9yCisvLy8gQ29udGV4dHVhbEZvbGRpbmdTZXRzLgordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ3R4PiBzdHJ1Y3QgQ29udGV4dHVhbEZvbGRpbmdTZXRUcmFpdAorICA6IHB1YmxpYyBEZWZhdWx0Q29udGV4dHVhbEZvbGRpbmdTZXRUcmFpdDxULCBDdHg+IHt9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBGb2xkaW5nU2V0Tm9kZUlEUmVmIC0gVGhpcyBjbGFzcyBkZXNjcmliZXMgYSByZWZlcmVuY2UgdG8gYW4gaW50ZXJuZWQKKy8vLyBGb2xkaW5nU2V0Tm9kZUlELCB3aGljaCBjYW4gYmUgYSB1c2VmdWwgdG8gc3RvcmUgbm9kZSBpZCBkYXRhIHJhdGhlcgorLy8vIHRoYW4gdXNpbmcgcGxhaW4gRm9sZGluZ1NldE5vZGVJRHMsIHNpbmNlIHRoZSAzMi1lbGVtZW50IFNtYWxsVmVjdG9yCisvLy8gaXMgb2Z0ZW4gbXVjaCBsYXJnZXIgdGhhbiBuZWNlc3NhcnksIGFuZCB0aGUgcG9zc2liaWxpdHkgb2YgaGVhcAorLy8vIGFsbG9jYXRpb24gbWVhbnMgaXQgcmVxdWlyZXMgYSBub24tdHJpdmlhbCBkZXN0cnVjdG9yIGNhbGwuCitjbGFzcyBGb2xkaW5nU2V0Tm9kZUlEUmVmIHsKKyAgY29uc3QgdW5zaWduZWQgKkRhdGEgPSBudWxscHRyOworICBzaXplX3QgU2l6ZSA9IDA7CisKK3B1YmxpYzoKKyAgRm9sZGluZ1NldE5vZGVJRFJlZigpID0gZGVmYXVsdDsKKyAgRm9sZGluZ1NldE5vZGVJRFJlZihjb25zdCB1bnNpZ25lZCAqRCwgc2l6ZV90IFMpIDogRGF0YShEKSwgU2l6ZShTKSB7fQorCisgIC8vLyBDb21wdXRlSGFzaCAtIENvbXB1dGUgYSBzdHJvbmcgaGFzaCB2YWx1ZSBmb3IgdGhpcyBGb2xkaW5nU2V0Tm9kZUlEUmVmLAorICAvLy8gdXNlZCB0byBsb29rdXAgdGhlIG5vZGUgaW4gdGhlIEZvbGRpbmdTZXRCYXNlLgorICB1bnNpZ25lZCBDb21wdXRlSGFzaCgpIGNvbnN0OworCisgIGJvb2wgb3BlcmF0b3I9PShGb2xkaW5nU2V0Tm9kZUlEUmVmKSBjb25zdDsKKworICBib29sIG9wZXJhdG9yIT0oRm9sZGluZ1NldE5vZGVJRFJlZiBSSFMpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gUkhTKTsgfQorCisgIC8vLyBVc2VkIHRvIGNvbXBhcmUgdGhlICJvcmRlcmluZyIgb2YgdHdvIG5vZGVzIGFzIGRlZmluZWQgYnkgdGhlCisgIC8vLyBwcm9maWxlZCBiaXRzIGFuZCB0aGVpciBvcmRlcmluZyBkZWZpbmVkIGJ5IG1lbWNtcCgpLgorICBib29sIG9wZXJhdG9yPChGb2xkaW5nU2V0Tm9kZUlEUmVmKSBjb25zdDsKKworICBjb25zdCB1bnNpZ25lZCAqZ2V0RGF0YSgpIGNvbnN0IHsgcmV0dXJuIERhdGE7IH0KKyAgc2l6ZV90IGdldFNpemUoKSBjb25zdCB7IHJldHVybiBTaXplOyB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBGb2xkaW5nU2V0Tm9kZUlEIC0gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGdhdGhlciBhbGwgdGhlIHVuaXF1ZSBkYXRhIGJpdHMgb2YKKy8vLyBhIG5vZGUuICBXaGVuIGFsbCB0aGUgYml0cyBhcmUgZ2F0aGVyZWQgdGhpcyBjbGFzcyBpcyB1c2VkIHRvIHByb2R1Y2UgYQorLy8vIGhhc2ggdmFsdWUgZm9yIHRoZSBub2RlLgorY2xhc3MgRm9sZGluZ1NldE5vZGVJRCB7CisgIC8vLyBCaXRzIC0gVmVjdG9yIG9mIGFsbCB0aGUgZGF0YSBiaXRzIHRoYXQgbWFrZSB0aGUgbm9kZSB1bmlxdWUuCisgIC8vLyBVc2UgYSBTbWFsbFZlY3RvciB0byBhdm9pZCBhIGhlYXAgYWxsb2NhdGlvbiBpbiB0aGUgY29tbW9uIGNhc2UuCisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCAzMj4gQml0czsKKworcHVibGljOgorICBGb2xkaW5nU2V0Tm9kZUlEKCkgPSBkZWZhdWx0OworCisgIEZvbGRpbmdTZXROb2RlSUQoRm9sZGluZ1NldE5vZGVJRFJlZiBSZWYpCisgICAgOiBCaXRzKFJlZi5nZXREYXRhKCksIFJlZi5nZXREYXRhKCkgKyBSZWYuZ2V0U2l6ZSgpKSB7fQorCisgIC8vLyBBZGQqIC0gQWRkIHZhcmlvdXMgZGF0YSB0eXBlcyB0byBCaXQgZGF0YS4KKyAgdm9pZCBBZGRQb2ludGVyKGNvbnN0IHZvaWQgKlB0cik7CisgIHZvaWQgQWRkSW50ZWdlcihzaWduZWQgSSk7CisgIHZvaWQgQWRkSW50ZWdlcih1bnNpZ25lZCBJKTsKKyAgdm9pZCBBZGRJbnRlZ2VyKGxvbmcgSSk7CisgIHZvaWQgQWRkSW50ZWdlcih1bnNpZ25lZCBsb25nIEkpOworICB2b2lkIEFkZEludGVnZXIobG9uZyBsb25nIEkpOworICB2b2lkIEFkZEludGVnZXIodW5zaWduZWQgbG9uZyBsb25nIEkpOworICB2b2lkIEFkZEJvb2xlYW4oYm9vbCBCKSB7IEFkZEludGVnZXIoQiA/IDFVIDogMFUpOyB9CisgIHZvaWQgQWRkU3RyaW5nKFN0cmluZ1JlZiBTdHJpbmcpOworICB2b2lkIEFkZE5vZGVJRChjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZJRCk7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGlubGluZSB2b2lkIEFkZChjb25zdCBUICZ4KSB7IEZvbGRpbmdTZXRUcmFpdDxUPjo6UHJvZmlsZSh4LCAqdGhpcyk7IH0KKworICAvLy8gY2xlYXIgLSBDbGVhciB0aGUgYWNjdW11bGF0ZWQgcHJvZmlsZSwgYWxsb3dpbmcgdGhpcyBGb2xkaW5nU2V0Tm9kZUlECisgIC8vLyBvYmplY3QgdG8gYmUgdXNlZCB0byBjb21wdXRlIGEgbmV3IHByb2ZpbGUuCisgIGlubGluZSB2b2lkIGNsZWFyKCkgeyBCaXRzLmNsZWFyKCk7IH0KKworICAvLy8gQ29tcHV0ZUhhc2ggLSBDb21wdXRlIGEgc3Ryb25nIGhhc2ggdmFsdWUgZm9yIHRoaXMgRm9sZGluZ1NldE5vZGVJRCwgdXNlZAorICAvLy8gdG8gbG9va3VwIHRoZSBub2RlIGluIHRoZSBGb2xkaW5nU2V0QmFzZS4KKyAgdW5zaWduZWQgQ29tcHV0ZUhhc2goKSBjb25zdDsKKworICAvLy8gb3BlcmF0b3I9PSAtIFVzZWQgdG8gY29tcGFyZSB0d28gbm9kZXMgdG8gZWFjaCBvdGhlci4KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZvbGRpbmdTZXROb2RlSUQgJlJIUykgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGb2xkaW5nU2V0Tm9kZUlEUmVmIFJIUykgY29uc3Q7CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEZvbGRpbmdTZXROb2RlSUQgJlJIUykgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBSSFMpOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBGb2xkaW5nU2V0Tm9kZUlEUmVmIFJIUykgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PVJIUyk7fQorCisgIC8vLyBVc2VkIHRvIGNvbXBhcmUgdGhlICJvcmRlcmluZyIgb2YgdHdvIG5vZGVzIGFzIGRlZmluZWQgYnkgdGhlCisgIC8vLyBwcm9maWxlZCBiaXRzIGFuZCB0aGVpciBvcmRlcmluZyBkZWZpbmVkIGJ5IG1lbWNtcCgpLgorICBib29sIG9wZXJhdG9yPChjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZSSFMpIGNvbnN0OworICBib29sIG9wZXJhdG9yPChjb25zdCBGb2xkaW5nU2V0Tm9kZUlEUmVmIFJIUykgY29uc3Q7CisKKyAgLy8vIEludGVybiAtIENvcHkgdGhpcyBub2RlJ3MgZGF0YSB0byBhIG1lbW9yeSByZWdpb24gYWxsb2NhdGVkIGZyb20gdGhlCisgIC8vLyBnaXZlbiBhbGxvY2F0b3IgYW5kIHJldHVybiBhIEZvbGRpbmdTZXROb2RlSURSZWYgZGVzY3JpYmluZyB0aGUKKyAgLy8vIGludGVybmVkIGRhdGEuCisgIEZvbGRpbmdTZXROb2RlSURSZWYgSW50ZXJuKEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvcikgY29uc3Q7Cit9OworCisvLyBDb252ZW5pZW5jZSB0eXBlIHRvIGhpZGUgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBmb2xkaW5nIHNldC4KK3VzaW5nIEZvbGRpbmdTZXROb2RlID0gRm9sZGluZ1NldEJhc2U6Ok5vZGU7Cit0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb2xkaW5nU2V0SXRlcmF0b3I7Cit0ZW1wbGF0ZTxjbGFzcyBUPiBjbGFzcyBGb2xkaW5nU2V0QnVja2V0SXRlcmF0b3I7CisKKy8vIERlZmluaXRpb25zIG9mIEZvbGRpbmdTZXRUcmFpdCBhbmQgQ29udGV4dHVhbEZvbGRpbmdTZXRUcmFpdCBmdW5jdGlvbnMsIHdoaWNoCisvLyByZXF1aXJlIHRoZSBkZWZpbml0aW9uIG9mIEZvbGRpbmdTZXROb2RlSUQuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5saW5lIGJvb2wKK0RlZmF1bHRGb2xkaW5nU2V0VHJhaXQ8VD46OkVxdWFscyhUICZYLCBjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAvKklESGFzaCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbGRpbmdTZXROb2RlSUQgJlRlbXBJRCkgeworICBGb2xkaW5nU2V0VHJhaXQ8VD46OlByb2ZpbGUoWCwgVGVtcElEKTsKKyAgcmV0dXJuIFRlbXBJRCA9PSBJRDsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgdW5zaWduZWQKK0RlZmF1bHRGb2xkaW5nU2V0VHJhaXQ8VD46OkNvbXB1dGVIYXNoKFQgJlgsIEZvbGRpbmdTZXROb2RlSUQgJlRlbXBJRCkgeworICBGb2xkaW5nU2V0VHJhaXQ8VD46OlByb2ZpbGUoWCwgVGVtcElEKTsKKyAgcmV0dXJuIFRlbXBJRC5Db21wdXRlSGFzaCgpOworfQordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ3R4PgoraW5saW5lIGJvb2wKK0RlZmF1bHRDb250ZXh0dWFsRm9sZGluZ1NldFRyYWl0PFQsIEN0eD46OkVxdWFscyhUICZYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZvbGRpbmdTZXROb2RlSUQgJklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIC8qSURIYXNoKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9sZGluZ1NldE5vZGVJRCAmVGVtcElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0eCBDb250ZXh0KSB7CisgIENvbnRleHR1YWxGb2xkaW5nU2V0VHJhaXQ8VCwgQ3R4Pjo6UHJvZmlsZShYLCBUZW1wSUQsIENvbnRleHQpOworICByZXR1cm4gVGVtcElEID09IElEOworfQordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ3R4PgoraW5saW5lIHVuc2lnbmVkCitEZWZhdWx0Q29udGV4dHVhbEZvbGRpbmdTZXRUcmFpdDxULCBDdHg+OjpDb21wdXRlSGFzaChUICZYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9sZGluZ1NldE5vZGVJRCAmVGVtcElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3R4IENvbnRleHQpIHsKKyAgQ29udGV4dHVhbEZvbGRpbmdTZXRUcmFpdDxULCBDdHg+OjpQcm9maWxlKFgsIFRlbXBJRCwgQ29udGV4dCk7CisgIHJldHVybiBUZW1wSUQuQ29tcHV0ZUhhc2goKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBGb2xkaW5nU2V0SW1wbCAtIEFuIGltcGxlbWVudGF0aW9uIGRldGFpbCB0aGF0IGxldHMgdXMgc2hhcmUgY29kZSBiZXR3ZWVuCisvLy8gRm9sZGluZ1NldCBhbmQgQ29udGV4dHVhbEZvbGRpbmdTZXQuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgRm9sZGluZ1NldEltcGwgOiBwdWJsaWMgRm9sZGluZ1NldEJhc2UgeworcHJvdGVjdGVkOgorICBleHBsaWNpdCBGb2xkaW5nU2V0SW1wbCh1bnNpZ25lZCBMb2cySW5pdFNpemUpCisgICAgICA6IEZvbGRpbmdTZXRCYXNlKExvZzJJbml0U2l6ZSkge30KKworICBGb2xkaW5nU2V0SW1wbChGb2xkaW5nU2V0SW1wbCAmJkFyZykgPSBkZWZhdWx0OworICBGb2xkaW5nU2V0SW1wbCAmb3BlcmF0b3I9KEZvbGRpbmdTZXRJbXBsICYmUkhTKSA9IGRlZmF1bHQ7CisgIH5Gb2xkaW5nU2V0SW1wbCgpID0gZGVmYXVsdDsKKworcHVibGljOgorICB1c2luZyBpdGVyYXRvciA9IEZvbGRpbmdTZXRJdGVyYXRvcjxUPjsKKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGl0ZXJhdG9yKEJ1Y2tldHMpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGl0ZXJhdG9yKEJ1Y2tldHMrTnVtQnVja2V0cyk7IH0KKworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IEZvbGRpbmdTZXRJdGVyYXRvcjxjb25zdCBUPjsKKworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKEJ1Y2tldHMpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKEJ1Y2tldHMrTnVtQnVja2V0cyk7IH0KKworICB1c2luZyBidWNrZXRfaXRlcmF0b3IgPSBGb2xkaW5nU2V0QnVja2V0SXRlcmF0b3I8VD47CisKKyAgYnVja2V0X2l0ZXJhdG9yIGJ1Y2tldF9iZWdpbih1bnNpZ25lZCBoYXNoKSB7CisgICAgcmV0dXJuIGJ1Y2tldF9pdGVyYXRvcihCdWNrZXRzICsgKGhhc2ggJiAoTnVtQnVja2V0cy0xKSkpOworICB9CisKKyAgYnVja2V0X2l0ZXJhdG9yIGJ1Y2tldF9lbmQodW5zaWduZWQgaGFzaCkgeworICAgIHJldHVybiBidWNrZXRfaXRlcmF0b3IoQnVja2V0cyArIChoYXNoICYgKE51bUJ1Y2tldHMtMSkpLCB0cnVlKTsKKyAgfQorCisgIC8vLyBSZW1vdmVOb2RlIC0gUmVtb3ZlIGEgbm9kZSBmcm9tIHRoZSBmb2xkaW5nIHNldCwgcmV0dXJuaW5nIHRydWUgaWYgb25lCisgIC8vLyB3YXMgcmVtb3ZlZCBvciBmYWxzZSBpZiB0aGUgbm9kZSB3YXMgbm90IGluIHRoZSBmb2xkaW5nIHNldC4KKyAgYm9vbCBSZW1vdmVOb2RlKFQgKk4pIHsgcmV0dXJuIEZvbGRpbmdTZXRCYXNlOjpSZW1vdmVOb2RlKE4pOyB9CisKKyAgLy8vIEdldE9ySW5zZXJ0Tm9kZSAtIElmIHRoZXJlIGlzIGFuIGV4aXN0aW5nIHNpbXBsZSBOb2RlIGV4YWN0bHkKKyAgLy8vIGVxdWFsIHRvIHRoZSBzcGVjaWZpZWQgbm9kZSwgcmV0dXJuIGl0LiAgT3RoZXJ3aXNlLCBpbnNlcnQgJ04nIGFuZAorICAvLy8gcmV0dXJuIGl0IGluc3RlYWQuCisgIFQgKkdldE9ySW5zZXJ0Tm9kZShUICpOKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4oRm9sZGluZ1NldEJhc2U6OkdldE9ySW5zZXJ0Tm9kZShOKSk7CisgIH0KKworICAvLy8gRmluZE5vZGVPckluc2VydFBvcyAtIExvb2sgdXAgdGhlIG5vZGUgc3BlY2lmaWVkIGJ5IElELiAgSWYgaXQgZXhpc3RzLAorICAvLy8gcmV0dXJuIGl0LiAgSWYgbm90LCByZXR1cm4gdGhlIGluc2VydGlvbiB0b2tlbiB0aGF0IHdpbGwgbWFrZSBpbnNlcnRpb24KKyAgLy8vIGZhc3Rlci4KKyAgVCAqRmluZE5vZGVPckluc2VydFBvcyhjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZJRCwgdm9pZCAqJkluc2VydFBvcykgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KEZvbGRpbmdTZXRCYXNlOjpGaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJbnNlcnRQb3MpKTsKKyAgfQorCisgIC8vLyBJbnNlcnROb2RlIC0gSW5zZXJ0IHRoZSBzcGVjaWZpZWQgbm9kZSBpbnRvIHRoZSBmb2xkaW5nIHNldCwga25vd2luZyB0aGF0CisgIC8vLyBpdCBpcyBub3QgYWxyZWFkeSBpbiB0aGUgZm9sZGluZyBzZXQuICBJbnNlcnRQb3MgbXVzdCBiZSBvYnRhaW5lZCBmcm9tCisgIC8vLyBGaW5kTm9kZU9ySW5zZXJ0UG9zLgorICB2b2lkIEluc2VydE5vZGUoVCAqTiwgdm9pZCAqSW5zZXJ0UG9zKSB7CisgICAgRm9sZGluZ1NldEJhc2U6Okluc2VydE5vZGUoTiwgSW5zZXJ0UG9zKTsKKyAgfQorCisgIC8vLyBJbnNlcnROb2RlIC0gSW5zZXJ0IHRoZSBzcGVjaWZpZWQgbm9kZSBpbnRvIHRoZSBmb2xkaW5nIHNldCwga25vd2luZyB0aGF0CisgIC8vLyBpdCBpcyBub3QgYWxyZWFkeSBpbiB0aGUgZm9sZGluZyBzZXQuCisgIHZvaWQgSW5zZXJ0Tm9kZShUICpOKSB7CisgICAgVCAqSW5zZXJ0ZWQgPSBHZXRPckluc2VydE5vZGUoTik7CisgICAgKHZvaWQpSW5zZXJ0ZWQ7CisgICAgYXNzZXJ0KEluc2VydGVkID09IE4gJiYgIk5vZGUgYWxyZWFkeSBpbnNlcnRlZCEiKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBGb2xkaW5nU2V0IC0gVGhpcyB0ZW1wbGF0ZSBjbGFzcyBpcyB1c2VkIHRvIGluc3RhbnRpYXRlIGEgc3BlY2lhbGl6ZWQKKy8vLyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZm9sZGluZyBzZXQgdG8gdGhlIG5vZGUgY2xhc3MgVC4gIFQgbXVzdCBiZSBhCisvLy8gc3ViY2xhc3Mgb2YgRm9sZGluZ1NldE5vZGUgYW5kIGltcGxlbWVudCBhIFByb2ZpbGUgZnVuY3Rpb24uCisvLy8KKy8vLyBOb3RlIHRoYXQgdGhpcyBzZXQgdHlwZSBpcyBtb3ZhYmxlIGFuZCBtb3ZlLWFzc2lnbmFibGUuIEhvd2V2ZXIsIGl0cworLy8vIG1vdmVkLWZyb20gc3RhdGUgaXMgbm90IGEgdmFsaWQgc3RhdGUgZm9yIGFueXRoaW5nIG90aGVyIHRoYW4KKy8vLyBtb3ZlLWFzc2lnbmluZyBhbmQgZGVzdHJveWluZy4gVGhpcyBpcyBwcmltYXJpbHkgdG8gZW5hYmxlIG1vdmFibGUgQVBJcworLy8vIHRoYXQgaW5jb3Jwb3JhdGUgdGhlc2Ugb2JqZWN0cy4KK3RlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBGb2xkaW5nU2V0IGZpbmFsIDogcHVibGljIEZvbGRpbmdTZXRJbXBsPFQ+IHsKKyAgdXNpbmcgU3VwZXIgPSBGb2xkaW5nU2V0SW1wbDxUPjsKKyAgdXNpbmcgTm9kZSA9IHR5cGVuYW1lIFN1cGVyOjpOb2RlOworCisgIC8vLyBHZXROb2RlUHJvZmlsZSAtIEVhY2ggaW5zdGFudGlhdGF0aW9uIG9mIHRoZSBGb2xkaW5nU2V0IG5lZWRzIHRvIHByb3ZpZGUgYQorICAvLy8gd2F5IHRvIGNvbnZlcnQgbm9kZXMgaW50byBhIHVuaXF1ZSBzcGVjaWZpZXIuCisgIHZvaWQgR2V0Tm9kZVByb2ZpbGUoTm9kZSAqTiwgRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBUICpUTiA9IHN0YXRpY19jYXN0PFQgKj4oTik7CisgICAgRm9sZGluZ1NldFRyYWl0PFQ+OjpQcm9maWxlKCpUTiwgSUQpOworICB9CisKKyAgLy8vIE5vZGVFcXVhbHMgLSBJbnN0YW50aWF0aW9ucyBtYXkgb3B0aW9uYWxseSBwcm92aWRlIGEgd2F5IHRvIGNvbXBhcmUgYQorICAvLy8gbm9kZSB3aXRoIGEgc3BlY2lmaWVkIElELgorICBib29sIE5vZGVFcXVhbHMoTm9kZSAqTiwgY29uc3QgRm9sZGluZ1NldE5vZGVJRCAmSUQsIHVuc2lnbmVkIElESGFzaCwKKyAgICAgICAgICAgICAgICAgIEZvbGRpbmdTZXROb2RlSUQgJlRlbXBJRCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIFQgKlROID0gc3RhdGljX2Nhc3Q8VCAqPihOKTsKKyAgICByZXR1cm4gRm9sZGluZ1NldFRyYWl0PFQ+OjpFcXVhbHMoKlROLCBJRCwgSURIYXNoLCBUZW1wSUQpOworICB9CisKKyAgLy8vIENvbXB1dGVOb2RlSGFzaCAtIEluc3RhbnRpYXRpb25zIG1heSBvcHRpb25hbGx5IHByb3ZpZGUgYSB3YXkgdG8gY29tcHV0ZSBhCisgIC8vLyBoYXNoIHZhbHVlIGRpcmVjdGx5IGZyb20gYSBub2RlLgorICB1bnNpZ25lZCBDb21wdXRlTm9kZUhhc2goTm9kZSAqTiwgRm9sZGluZ1NldE5vZGVJRCAmVGVtcElEKSBjb25zdCBvdmVycmlkZSB7CisgICAgVCAqVE4gPSBzdGF0aWNfY2FzdDxUICo+KE4pOworICAgIHJldHVybiBGb2xkaW5nU2V0VHJhaXQ8VD46OkNvbXB1dGVIYXNoKCpUTiwgVGVtcElEKTsKKyAgfQorCitwdWJsaWM6CisgIGV4cGxpY2l0IEZvbGRpbmdTZXQodW5zaWduZWQgTG9nMkluaXRTaXplID0gNikgOiBTdXBlcihMb2cySW5pdFNpemUpIHt9CisgIEZvbGRpbmdTZXQoRm9sZGluZ1NldCAmJkFyZykgPSBkZWZhdWx0OworICBGb2xkaW5nU2V0ICZvcGVyYXRvcj0oRm9sZGluZ1NldCAmJlJIUykgPSBkZWZhdWx0OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBDb250ZXh0dWFsRm9sZGluZ1NldCAtIFRoaXMgdGVtcGxhdGUgY2xhc3MgaXMgYSBmdXJ0aGVyIHJlZmluZW1lbnQKKy8vLyBvZiBGb2xkaW5nU2V0IHdoaWNoIHByb3ZpZGVzIGEgY29udGV4dCBhcmd1bWVudCB3aGVuIGNhbGxpbmcKKy8vLyBQcm9maWxlIG9uIGl0cyBub2Rlcy4gIEN1cnJlbnRseSwgdGhhdCBhcmd1bWVudCBpcyBmaXhlZCBhdAorLy8vIGluaXRpYWxpemF0aW9uIHRpbWUuCisvLy8KKy8vLyBUIG11c3QgYmUgYSBzdWJjbGFzcyBvZiBGb2xkaW5nU2V0Tm9kZSBhbmQgaW1wbGVtZW50IGEgUHJvZmlsZQorLy8vIGZ1bmN0aW9uIHdpdGggc2lnbmF0dXJlCisvLy8gICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmLCBDdHgpOwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEN0eD4KK2NsYXNzIENvbnRleHR1YWxGb2xkaW5nU2V0IGZpbmFsIDogcHVibGljIEZvbGRpbmdTZXRJbXBsPFQ+IHsKKyAgLy8gVW5mb3J0dW5hdGVseSwgdGhpcyBjYW4ndCBkZXJpdmUgZnJvbSBGb2xkaW5nU2V0PFQ+IGJlY2F1c2UgdGhlCisgIC8vIGNvbnN0cnVjdGlvbiBvZiB0aGUgdnRhYmxlIGZvciBGb2xkaW5nU2V0PFQ+IHJlcXVpcmVzCisgIC8vIEZvbGRpbmdTZXQ8VD46OkdldE5vZGVQcm9maWxlIHRvIGJlIGluc3RhbnRpYXRlZCwgd2hpY2ggaW4gdHVybgorICAvLyByZXF1aXJlcyBhIHNpbmdsZS1hcmd1bWVudCBUOjpQcm9maWxlKCkuCisKKyAgdXNpbmcgU3VwZXIgPSBGb2xkaW5nU2V0SW1wbDxUPjsKKyAgdXNpbmcgTm9kZSA9IHR5cGVuYW1lIFN1cGVyOjpOb2RlOworCisgIEN0eCBDb250ZXh0OworCisgIC8vLyBHZXROb2RlUHJvZmlsZSAtIEVhY2ggaW5zdGFudGlhdGF0aW9uIG9mIHRoZSBGb2xkaW5nU2V0IG5lZWRzIHRvIHByb3ZpZGUgYQorICAvLy8gd2F5IHRvIGNvbnZlcnQgbm9kZXMgaW50byBhIHVuaXF1ZSBzcGVjaWZpZXIuCisgIHZvaWQgR2V0Tm9kZVByb2ZpbGUoTm9kZSAqTiwgRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBUICpUTiA9IHN0YXRpY19jYXN0PFQgKj4oTik7CisgICAgQ29udGV4dHVhbEZvbGRpbmdTZXRUcmFpdDxULCBDdHg+OjpQcm9maWxlKCpUTiwgSUQsIENvbnRleHQpOworICB9CisKKyAgYm9vbCBOb2RlRXF1YWxzKE5vZGUgKk4sIGNvbnN0IEZvbGRpbmdTZXROb2RlSUQgJklELCB1bnNpZ25lZCBJREhhc2gsCisgICAgICAgICAgICAgICAgICBGb2xkaW5nU2V0Tm9kZUlEICZUZW1wSUQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBUICpUTiA9IHN0YXRpY19jYXN0PFQgKj4oTik7CisgICAgcmV0dXJuIENvbnRleHR1YWxGb2xkaW5nU2V0VHJhaXQ8VCwgQ3R4Pjo6RXF1YWxzKCpUTiwgSUQsIElESGFzaCwgVGVtcElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KTsKKyAgfQorCisgIHVuc2lnbmVkIENvbXB1dGVOb2RlSGFzaChOb2RlICpOLCBGb2xkaW5nU2V0Tm9kZUlEICZUZW1wSUQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBUICpUTiA9IHN0YXRpY19jYXN0PFQgKj4oTik7CisgICAgcmV0dXJuIENvbnRleHR1YWxGb2xkaW5nU2V0VHJhaXQ8VCwgQ3R4Pjo6Q29tcHV0ZUhhc2goKlROLCBUZW1wSUQsIENvbnRleHQpOworICB9CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgQ29udGV4dHVhbEZvbGRpbmdTZXQoQ3R4IENvbnRleHQsIHVuc2lnbmVkIExvZzJJbml0U2l6ZSA9IDYpCisgICAgICA6IFN1cGVyKExvZzJJbml0U2l6ZSksIENvbnRleHQoQ29udGV4dCkge30KKworICBDdHggZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIENvbnRleHQ7IH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gRm9sZGluZ1NldFZlY3RvciAtIFRoaXMgdGVtcGxhdGUgY2xhc3MgY29tYmluZXMgYSBGb2xkaW5nU2V0IGFuZCBhIHZlY3RvcgorLy8vIHRvIHByb3ZpZGUgdGhlIGludGVyZmFjZSBvZiBGb2xkaW5nU2V0IGJ1dCB3aXRoIGRldGVybWluaXN0aWMgaXRlcmF0aW9uCisvLy8gb3JkZXIgYmFzZWQgb24gdGhlIGluc2VydGlvbiBvcmRlci4gVCBtdXN0IGJlIGEgc3ViY2xhc3Mgb2YgRm9sZGluZ1NldE5vZGUKKy8vLyBhbmQgaW1wbGVtZW50IGEgUHJvZmlsZSBmdW5jdGlvbi4KK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBWZWN0b3JUID0gU21hbGxWZWN0b3I8VCosIDg+PgorY2xhc3MgRm9sZGluZ1NldFZlY3RvciB7CisgIEZvbGRpbmdTZXQ8VD4gU2V0OworICBWZWN0b3JUIFZlY3RvcjsKKworcHVibGljOgorICBleHBsaWNpdCBGb2xkaW5nU2V0VmVjdG9yKHVuc2lnbmVkIExvZzJJbml0U2l6ZSA9IDYpIDogU2V0KExvZzJJbml0U2l6ZSkge30KKworICB1c2luZyBpdGVyYXRvciA9IHBvaW50ZWVfaXRlcmF0b3I8dHlwZW5hbWUgVmVjdG9yVDo6aXRlcmF0b3I+OworCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gVmVjdG9yLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgICB7IHJldHVybiBWZWN0b3IuZW5kKCk7IH0KKworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IHBvaW50ZWVfaXRlcmF0b3I8dHlwZW5hbWUgVmVjdG9yVDo6Y29uc3RfaXRlcmF0b3I+OworCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gVmVjdG9yLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgICBjb25zdCB7IHJldHVybiBWZWN0b3IuZW5kKCk7IH0KKworICAvLy8gY2xlYXIgLSBSZW1vdmUgYWxsIG5vZGVzIGZyb20gdGhlIGZvbGRpbmcgc2V0LgorICB2b2lkIGNsZWFyKCkgeyBTZXQuY2xlYXIoKTsgVmVjdG9yLmNsZWFyKCk7IH0KKworICAvLy8gRmluZE5vZGVPckluc2VydFBvcyAtIExvb2sgdXAgdGhlIG5vZGUgc3BlY2lmaWVkIGJ5IElELiAgSWYgaXQgZXhpc3RzLAorICAvLy8gcmV0dXJuIGl0LiAgSWYgbm90LCByZXR1cm4gdGhlIGluc2VydGlvbiB0b2tlbiB0aGF0IHdpbGwgbWFrZSBpbnNlcnRpb24KKyAgLy8vIGZhc3Rlci4KKyAgVCAqRmluZE5vZGVPckluc2VydFBvcyhjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZJRCwgdm9pZCAqJkluc2VydFBvcykgeworICAgIHJldHVybiBTZXQuRmluZE5vZGVPckluc2VydFBvcyhJRCwgSW5zZXJ0UG9zKTsKKyAgfQorCisgIC8vLyBHZXRPckluc2VydE5vZGUgLSBJZiB0aGVyZSBpcyBhbiBleGlzdGluZyBzaW1wbGUgTm9kZSBleGFjdGx5CisgIC8vLyBlcXVhbCB0byB0aGUgc3BlY2lmaWVkIG5vZGUsIHJldHVybiBpdC4gIE90aGVyd2lzZSwgaW5zZXJ0ICdOJyBhbmQKKyAgLy8vIHJldHVybiBpdCBpbnN0ZWFkLgorICBUICpHZXRPckluc2VydE5vZGUoVCAqTikgeworICAgIFQgKlJlc3VsdCA9IFNldC5HZXRPckluc2VydE5vZGUoTik7CisgICAgaWYgKFJlc3VsdCA9PSBOKSBWZWN0b3IucHVzaF9iYWNrKE4pOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICAvLy8gSW5zZXJ0Tm9kZSAtIEluc2VydCB0aGUgc3BlY2lmaWVkIG5vZGUgaW50byB0aGUgZm9sZGluZyBzZXQsIGtub3dpbmcgdGhhdAorICAvLy8gaXQgaXMgbm90IGFscmVhZHkgaW4gdGhlIGZvbGRpbmcgc2V0LiAgSW5zZXJ0UG9zIG11c3QgYmUgb2J0YWluZWQgZnJvbQorICAvLy8gRmluZE5vZGVPckluc2VydFBvcy4KKyAgdm9pZCBJbnNlcnROb2RlKFQgKk4sIHZvaWQgKkluc2VydFBvcykgeworICAgIFNldC5JbnNlcnROb2RlKE4sIEluc2VydFBvcyk7CisgICAgVmVjdG9yLnB1c2hfYmFjayhOKTsKKyAgfQorCisgIC8vLyBJbnNlcnROb2RlIC0gSW5zZXJ0IHRoZSBzcGVjaWZpZWQgbm9kZSBpbnRvIHRoZSBmb2xkaW5nIHNldCwga25vd2luZyB0aGF0CisgIC8vLyBpdCBpcyBub3QgYWxyZWFkeSBpbiB0aGUgZm9sZGluZyBzZXQuCisgIHZvaWQgSW5zZXJ0Tm9kZShUICpOKSB7CisgICAgU2V0Lkluc2VydE5vZGUoTik7CisgICAgVmVjdG9yLnB1c2hfYmFjayhOKTsKKyAgfQorCisgIC8vLyBzaXplIC0gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBmb2xkaW5nIHNldC4KKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNldC5zaXplKCk7IH0KKworICAvLy8gZW1wdHkgLSBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG5vIG5vZGVzIGluIHRoZSBmb2xkaW5nIHNldC4KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFNldC5lbXB0eSgpOyB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEZvbGRpbmdTZXRJdGVyYXRvckltcGwgLSBUaGlzIGlzIHRoZSBjb21tb24gaXRlcmF0b3Igc3VwcG9ydCBzaGFyZWQgYnkgYWxsCisvLy8gZm9sZGluZyBzZXRzLCB3aGljaCBrbm93cyBob3cgdG8gd2FsayB0aGUgZm9sZGluZyBzZXQgaGFzaCB0YWJsZS4KK2NsYXNzIEZvbGRpbmdTZXRJdGVyYXRvckltcGwgeworcHJvdGVjdGVkOgorICBGb2xkaW5nU2V0Tm9kZSAqTm9kZVB0cjsKKworICBGb2xkaW5nU2V0SXRlcmF0b3JJbXBsKHZvaWQgKipCdWNrZXQpOworCisgIHZvaWQgYWR2YW5jZSgpOworCitwdWJsaWM6CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGb2xkaW5nU2V0SXRlcmF0b3JJbXBsICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gTm9kZVB0ciA9PSBSSFMuTm9kZVB0cjsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgRm9sZGluZ1NldEl0ZXJhdG9ySW1wbCAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIE5vZGVQdHIgIT0gUkhTLk5vZGVQdHI7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBGb2xkaW5nU2V0SXRlcmF0b3IgOiBwdWJsaWMgRm9sZGluZ1NldEl0ZXJhdG9ySW1wbCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IEZvbGRpbmdTZXRJdGVyYXRvcih2b2lkICoqQnVja2V0KSA6IEZvbGRpbmdTZXRJdGVyYXRvckltcGwoQnVja2V0KSB7fQorCisgIFQgJm9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gKnN0YXRpY19jYXN0PFQqPihOb2RlUHRyKTsKKyAgfQorCisgIFQgKm9wZXJhdG9yLT4oKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihOb2RlUHRyKTsKKyAgfQorCisgIGlubGluZSBGb2xkaW5nU2V0SXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7ICAgICAgICAgIC8vIFByZWluY3JlbWVudAorICAgIGFkdmFuY2UoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgRm9sZGluZ1NldEl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7ICAgICAgICAvLyBQb3N0aW5jcmVtZW50CisgICAgRm9sZGluZ1NldEl0ZXJhdG9yIHRtcCA9ICp0aGlzOyArKyp0aGlzOyByZXR1cm4gdG1wOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEZvbGRpbmdTZXRCdWNrZXRJdGVyYXRvckltcGwgLSBUaGlzIGlzIHRoZSBjb21tb24gYnVja2V0IGl0ZXJhdG9yIHN1cHBvcnQKKy8vLyBzaGFyZWQgYnkgYWxsIGZvbGRpbmcgc2V0cywgd2hpY2gga25vd3MgaG93IHRvIHdhbGsgYSBwYXJ0aWN1bGFyIGJ1Y2tldAorLy8vIG9mIGEgZm9sZGluZyBzZXQgaGFzaCB0YWJsZS4KK2NsYXNzIEZvbGRpbmdTZXRCdWNrZXRJdGVyYXRvckltcGwgeworcHJvdGVjdGVkOgorICB2b2lkICpQdHI7CisKKyAgZXhwbGljaXQgRm9sZGluZ1NldEJ1Y2tldEl0ZXJhdG9ySW1wbCh2b2lkICoqQnVja2V0KTsKKworICBGb2xkaW5nU2V0QnVja2V0SXRlcmF0b3JJbXBsKHZvaWQgKipCdWNrZXQsIGJvb2wpIDogUHRyKEJ1Y2tldCkge30KKworICB2b2lkIGFkdmFuY2UoKSB7CisgICAgdm9pZCAqUHJvYmUgPSBzdGF0aWNfY2FzdDxGb2xkaW5nU2V0Tm9kZSo+KFB0ciktPmdldE5leHRJbkJ1Y2tldCgpOworICAgIHVpbnRwdHJfdCB4ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFByb2JlKSAmIH4weDE7CisgICAgUHRyID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oeCk7CisgIH0KKworcHVibGljOgorICBib29sIG9wZXJhdG9yPT0oY29uc3QgRm9sZGluZ1NldEJ1Y2tldEl0ZXJhdG9ySW1wbCAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFB0ciA9PSBSSFMuUHRyOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBGb2xkaW5nU2V0QnVja2V0SXRlcmF0b3JJbXBsICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gUHRyICE9IFJIUy5QdHI7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorY2xhc3MgRm9sZGluZ1NldEJ1Y2tldEl0ZXJhdG9yIDogcHVibGljIEZvbGRpbmdTZXRCdWNrZXRJdGVyYXRvckltcGwgeworcHVibGljOgorICBleHBsaWNpdCBGb2xkaW5nU2V0QnVja2V0SXRlcmF0b3Iodm9pZCAqKkJ1Y2tldCkgOgorICAgIEZvbGRpbmdTZXRCdWNrZXRJdGVyYXRvckltcGwoQnVja2V0KSB7fQorCisgIEZvbGRpbmdTZXRCdWNrZXRJdGVyYXRvcih2b2lkICoqQnVja2V0LCBib29sKSA6CisgICAgRm9sZGluZ1NldEJ1Y2tldEl0ZXJhdG9ySW1wbChCdWNrZXQsIHRydWUpIHt9CisKKyAgVCAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKnN0YXRpY19jYXN0PFQqPihQdHIpOyB9CisgIFQgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxUKj4oUHRyKTsgfQorCisgIGlubGluZSBGb2xkaW5nU2V0QnVja2V0SXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7IC8vIFByZWluY3JlbWVudAorICAgIGFkdmFuY2UoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgRm9sZGluZ1NldEJ1Y2tldEl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7ICAgICAgLy8gUG9zdGluY3JlbWVudAorICAgIEZvbGRpbmdTZXRCdWNrZXRJdGVyYXRvciB0bXAgPSAqdGhpczsgKysqdGhpczsgcmV0dXJuIHRtcDsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBGb2xkaW5nU2V0Tm9kZVdyYXBwZXIgLSBUaGlzIHRlbXBsYXRlIGNsYXNzIGlzIHVzZWQgdG8gIndyYXAiIGFyYml0cmFyeQorLy8vIHR5cGVzIGluIGFuIGVuY2xvc2luZyBvYmplY3Qgc28gdGhhdCB0aGV5IGNhbiBiZSBpbnNlcnRlZCBpbnRvIEZvbGRpbmdTZXRzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBGb2xkaW5nU2V0Tm9kZVdyYXBwZXIgOiBwdWJsaWMgRm9sZGluZ1NldE5vZGUgeworICBUIGRhdGE7CisKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFRzPgorICBleHBsaWNpdCBGb2xkaW5nU2V0Tm9kZVdyYXBwZXIoVHMgJiYuLi4gQXJncykKKyAgICAgIDogZGF0YShzdGQ6OmZvcndhcmQ8VHM+KEFyZ3MpLi4uKSB7fQorCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCkgeyBGb2xkaW5nU2V0VHJhaXQ8VD46OlByb2ZpbGUoZGF0YSwgSUQpOyB9CisKKyAgVCAmZ2V0VmFsdWUoKSB7IHJldHVybiBkYXRhOyB9CisgIGNvbnN0IFQgJmdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gZGF0YTsgfQorCisgIG9wZXJhdG9yIFQmKCkgeyByZXR1cm4gZGF0YTsgfQorICBvcGVyYXRvciBjb25zdCBUJigpIGNvbnN0IHsgcmV0dXJuIGRhdGE7IH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gRmFzdEZvbGRpbmdTZXROb2RlIC0gVGhpcyBpcyBhIHN1YmNsYXNzIG9mIEZvbGRpbmdTZXROb2RlIHdoaWNoIHN0b3JlcworLy8vIGEgRm9sZGluZ1NldE5vZGVJRCB2YWx1ZSByYXRoZXIgdGhhbiByZXF1aXJpbmcgdGhlIG5vZGUgdG8gcmVjb21wdXRlIGl0CisvLy8gZWFjaCB0aW1lIGl0IGlzIG5lZWRlZC4gVGhpcyB0cmFkZXMgc3BhY2UgZm9yIHNwZWVkICh3aGljaCBjYW4gYmUKKy8vLyBzaWduaWZpY2FudCBpZiB0aGUgSUQgaXMgbG9uZyksIGFuZCBpdCBhbHNvIHBlcm1pdHMgbm9kZXMgdG8gZHJvcAorLy8vIGluZm9ybWF0aW9uIHRoYXQgd291bGQgb3RoZXJ3aXNlIG9ubHkgYmUgcmVxdWlyZWQgZm9yIHJlY29tcHV0aW5nIGFuIElELgorY2xhc3MgRmFzdEZvbGRpbmdTZXROb2RlIDogcHVibGljIEZvbGRpbmdTZXROb2RlIHsKKyAgRm9sZGluZ1NldE5vZGVJRCBGYXN0SUQ7CisKK3Byb3RlY3RlZDoKKyAgZXhwbGljaXQgRmFzdEZvbGRpbmdTZXROb2RlKGNvbnN0IEZvbGRpbmdTZXROb2RlSUQgJklEKSA6IEZhc3RJRChJRCkge30KKworcHVibGljOgorICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IHsgSUQuQWRkTm9kZUlEKEZhc3RJRCk7IH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQYXJ0aWFsIHNwZWNpYWxpemF0aW9ucyBvZiBGb2xkaW5nU2V0VHJhaXQuCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBGb2xkaW5nU2V0VHJhaXQ8VCo+IHsKKyAgc3RhdGljIGlubGluZSB2b2lkIFByb2ZpbGUoVCAqWCwgRm9sZGluZ1NldE5vZGVJRCAmSUQpIHsKKyAgICBJRC5BZGRQb2ludGVyKFgpOworICB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3N0cnVjdCBGb2xkaW5nU2V0VHJhaXQ8c3RkOjpwYWlyPFQxLCBUMj4+IHsKKyAgc3RhdGljIGlubGluZSB2b2lkIFByb2ZpbGUoY29uc3Qgc3RkOjpwYWlyPFQxLCBUMj4gJlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbGRpbmdTZXROb2RlSUQgJklEKSB7CisgICAgSUQuQWRkKFAuZmlyc3QpOworICAgIElELkFkZChQLnNlY29uZCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9GT0xESU5HU0VUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0dyYXBoVHJhaXRzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9HcmFwaFRyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YzY0N2YKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9HcmFwaFRyYWl0cy5oCkBAIC0wLDAgKzEsMTM2IEBACisvLz09PS0gbGx2bS9BRFQvR3JhcGhUcmFpdHMuaCAtIEdyYXBoIHRyYWl0cyB0ZW1wbGF0ZSAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBsaXR0bGUgR3JhcGhUcmFpdHM8WD4gdGVtcGxhdGUgY2xhc3MgdGhhdCBzaG91bGQgYmUKKy8vIHNwZWNpYWxpemVkIGJ5IGNsYXNzZXMgdGhhdCB3YW50IHRvIGJlIGl0ZXJhdGFibGUgYnkgZ2VuZXJpYyBncmFwaCBpdGVyYXRvcnMuCisvLworLy8gVGhpcyBmaWxlIGFsc28gZGVmaW5lcyB0aGUgbWFya2VyIGNsYXNzIEludmVyc2UgdGhhdCBpcyB1c2VkIHRvIGl0ZXJhdGUgb3ZlcgorLy8gZ3JhcGhzIGluIGEgZ3JhcGggZGVmaW5lZCwgaW52ZXJzZSBvcmRlcmluZy4uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfR1JBUEhUUkFJVFNfSAorI2RlZmluZSBMTFZNX0FEVF9HUkFQSFRSQUlUU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vIEdyYXBoVHJhaXRzIC0gVGhpcyBjbGFzcyBzaG91bGQgYmUgc3BlY2lhbGl6ZWQgYnkgZGlmZmVyZW50IGdyYXBoIHR5cGVzLi4uCisvLyB3aGljaCBpcyB3aHkgdGhlIGRlZmF1bHQgdmVyc2lvbiBpcyBlbXB0eS4KKy8vCit0ZW1wbGF0ZTxjbGFzcyBHcmFwaFR5cGU+CitzdHJ1Y3QgR3JhcGhUcmFpdHMgeworICAvLyBFbGVtZW50cyB0byBwcm92aWRlOgorCisgIC8vIHR5cGVkZWYgTm9kZVJlZiAgICAgICAgICAgLSBUeXBlIG9mIE5vZGUgdG9rZW4gaW4gdGhlIGdyYXBoLCB3aGljaCBzaG91bGQKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlIGNoZWFwIHRvIGNvcHkuCisgIC8vIHR5cGVkZWYgQ2hpbGRJdGVyYXRvclR5cGUgLSBUeXBlIHVzZWQgdG8gaXRlcmF0ZSBvdmVyIGNoaWxkcmVuIGluIGdyYXBoLAorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVyZWZlcmVuY2UgdG8gYSBOb2RlUmVmLgorCisgIC8vIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShjb25zdCBHcmFwaFR5cGUgJikKKyAgLy8gICAgUmV0dXJuIHRoZSBlbnRyeSBub2RlIG9mIHRoZSBncmFwaAorCisgIC8vIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmKQorICAvLyBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kICAoTm9kZVJlZikKKyAgLy8gICAgUmV0dXJuIGl0ZXJhdG9ycyB0aGF0IHBvaW50IHRvIHRoZSBiZWdpbm5pbmcgYW5kIGVuZGluZyBvZiB0aGUgY2hpbGQKKyAgLy8gICAgbm9kZSBsaXN0IGZvciB0aGUgc3BlY2lmaWVkIG5vZGUuCisKKyAgLy8gdHlwZWRlZiAgLi4uaXRlcmF0b3Igbm9kZXNfaXRlcmF0b3I7IC0gZGVyZWZlcmVuY2UgdG8gYSBOb2RlUmVmCisgIC8vIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihHcmFwaFR5cGUgKkcpCisgIC8vIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQgIChHcmFwaFR5cGUgKkcpCisgIC8vICAgIG5vZGVzX2l0ZXJhdG9yL2JlZ2luL2VuZCAtIEFsbG93IGl0ZXJhdGlvbiBvdmVyIGFsbCBub2RlcyBpbiB0aGUgZ3JhcGgKKworICAvLyB0eXBlZGVmIEVkZ2VSZWYgICAgICAgICAgIC0gVHlwZSBvZiBFZGdlIHRva2VuIGluIHRoZSBncmFwaCwgd2hpY2ggc2hvdWxkCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBjaGVhcCB0byBjb3B5LgorICAvLyB0eXBlZGVmIENoaWxkRWRnZUl0ZXJhdG9yVHlwZSAtIFR5cGUgdXNlZCB0byBpdGVyYXRlIG92ZXIgY2hpbGRyZW4gZWRnZXMgaW4KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYXBoLCBkZXJlZmVyZW5jZSB0byBhIEVkZ2VSZWYuCisKKyAgLy8gc3RhdGljIENoaWxkRWRnZUl0ZXJhdG9yVHlwZSBjaGlsZF9lZGdlX2JlZ2luKE5vZGVSZWYpCisgIC8vIHN0YXRpYyBDaGlsZEVkZ2VJdGVyYXRvclR5cGUgY2hpbGRfZWRnZV9lbmQoTm9kZVJlZikKKyAgLy8gICAgIFJldHVybiBpdGVyYXRvcnMgdGhhdCBwb2ludCB0byB0aGUgYmVnaW5uaW5nIGFuZCBlbmRpbmcgb2YgdGhlCisgIC8vICAgICBlZGdlIGxpc3QgZm9yIHRoZSBnaXZlbiBjYWxsZ3JhcGggbm9kZS4KKyAgLy8KKyAgLy8gc3RhdGljIE5vZGVSZWYgZWRnZV9kZXN0KEVkZ2VSZWYpCisgIC8vICAgICBSZXR1cm4gdGhlIGRlc3RpbmF0aW9uIG5vZGUgb2YgYW4gZWRnZS4KKworICAvLyBzdGF0aWMgdW5zaWduZWQgICAgICAgc2l6ZSAgICAgICAoR3JhcGhUeXBlICpHKQorICAvLyAgICBSZXR1cm4gdG90YWwgbnVtYmVyIG9mIG5vZGVzIGluIHRoZSBncmFwaAorCisgIC8vIElmIGFueW9uZSB0cmllcyB0byB1c2UgdGhpcyBjbGFzcyB3aXRob3V0IGhhdmluZyBhbiBhcHByb3ByaWF0ZQorICAvLyBzcGVjaWFsaXphdGlvbiwgbWFrZSBhbiBlcnJvci4gIElmIHlvdSBnZXQgdGhpcyBlcnJvciwgaXQncyBiZWNhdXNlIHlvdQorICAvLyBuZWVkIHRvIGluY2x1ZGUgdGhlIGFwcHJvcHJpYXRlIHNwZWNpYWxpemF0aW9uIG9mIEdyYXBoVHJhaXRzPD4gZm9yIHlvdXIKKyAgLy8gZ3JhcGgsIG9yIHlvdSBuZWVkIHRvIGRlZmluZSBpdCBmb3IgYSBuZXcgZ3JhcGggdHlwZS4gRWl0aGVyIHRoYXQgb3IKKyAgLy8geW91ciBhcmd1bWVudCB0byBYWFhfYmVnaW4oLi4uKSBpcyB1bmtub3duIG9yIG5lZWRzIHRvIGhhdmUgdGhlIHByb3BlciAuaAorICAvLyBmaWxlICNpbmNsdWRlJ2QuCisgIHVzaW5nIE5vZGVSZWYgPSB0eXBlbmFtZSBHcmFwaFR5cGU6OlVua25vd25HcmFwaFR5cGVFcnJvcjsKK307CisKKy8vIEludmVyc2UgLSBUaGlzIGNsYXNzIGlzIHVzZWQgYXMgYSBsaXR0bGUgbWFya2VyIGNsYXNzIHRvIHRlbGwgdGhlIGdyYXBoCisvLyBpdGVyYXRvciB0byBpdGVyYXRlIG92ZXIgdGhlIGdyYXBoIGluIGEgZ3JhcGggZGVmaW5lZCAiSW52ZXJzZSIgb3JkZXJpbmcuCisvLyBOb3QgYWxsIGdyYXBocyBkZWZpbmUgYW4gaW52ZXJzZSBvcmRlcmluZywgYW5kIGlmIHRoZXkgZG8sIGl0IGRlcGVuZHMgb24KKy8vIHRoZSBncmFwaCBleGFjdGx5IHdoYXQgdGhhdCBpcy4gIEhlcmUncyBhbiBleGFtcGxlIG9mIHVzYWdlIHdpdGggdGhlCisvLyBkZl9pdGVyYXRvcjoKKy8vCisvLyBpZGZfaXRlcmF0b3I8TWV0aG9kKj4gSSA9IGlkZl9iZWdpbihNKSwgRSA9IGlkZl9lbmQoTSk7CisvLyBmb3IgKDsgSSAhPSBFOyArK0kpIHsgLi4uIH0KKy8vCisvLyBXaGljaCBpcyBlcXVpdmFsZW50IHRvOgorLy8gZGZfaXRlcmF0b3I8SW52ZXJzZTxNZXRob2QqPj4gSSA9IGlkZl9iZWdpbihNKSwgRSA9IGlkZl9lbmQoTSk7CisvLyBmb3IgKDsgSSAhPSBFOyArK0kpIHsgLi4uIH0KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgR3JhcGhUeXBlPgorc3RydWN0IEludmVyc2UgeworICBjb25zdCBHcmFwaFR5cGUgJkdyYXBoOworCisgIGlubGluZSBJbnZlcnNlKGNvbnN0IEdyYXBoVHlwZSAmRykgOiBHcmFwaChHKSB7fQorfTsKKworLy8gUHJvdmlkZSBhIHBhcnRpYWwgc3BlY2lhbGl6YXRpb24gb2YgR3JhcGhUcmFpdHMgc28gdGhhdCB0aGUgaW52ZXJzZSBvZiBhbgorLy8gaW52ZXJzZSBmYWxscyBiYWNrIHRvIHRoZSBvcmlnaW5hbCBncmFwaC4KK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgR3JhcGhUcmFpdHM8SW52ZXJzZTxJbnZlcnNlPFQ+Pj4gOiBHcmFwaFRyYWl0czxUPiB7fTsKKworLy8gUHJvdmlkZSBpdGVyYXRvciByYW5nZXMgZm9yIHRoZSBncmFwaCB0cmFpdHMgbm9kZXMgYW5kIGNoaWxkcmVuCit0ZW1wbGF0ZSA8Y2xhc3MgR3JhcGhUeXBlPgoraXRlcmF0b3JfcmFuZ2U8dHlwZW5hbWUgR3JhcGhUcmFpdHM8R3JhcGhUeXBlPjo6bm9kZXNfaXRlcmF0b3I+Citub2Rlcyhjb25zdCBHcmFwaFR5cGUgJkcpIHsKKyAgcmV0dXJuIG1ha2VfcmFuZ2UoR3JhcGhUcmFpdHM8R3JhcGhUeXBlPjo6bm9kZXNfYmVnaW4oRyksCisgICAgICAgICAgICAgICAgICAgIEdyYXBoVHJhaXRzPEdyYXBoVHlwZT46Om5vZGVzX2VuZChHKSk7Cit9Cit0ZW1wbGF0ZSA8Y2xhc3MgR3JhcGhUeXBlPgoraXRlcmF0b3JfcmFuZ2U8dHlwZW5hbWUgR3JhcGhUcmFpdHM8SW52ZXJzZTxHcmFwaFR5cGU+Pjo6bm9kZXNfaXRlcmF0b3I+CitpbnZlcnNlX25vZGVzKGNvbnN0IEdyYXBoVHlwZSAmRykgeworICByZXR1cm4gbWFrZV9yYW5nZShHcmFwaFRyYWl0czxJbnZlcnNlPEdyYXBoVHlwZT4+Ojpub2Rlc19iZWdpbihHKSwKKyAgICAgICAgICAgICAgICAgICAgR3JhcGhUcmFpdHM8SW52ZXJzZTxHcmFwaFR5cGU+Pjo6bm9kZXNfZW5kKEcpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEdyYXBoVHlwZT4KK2l0ZXJhdG9yX3JhbmdlPHR5cGVuYW1lIEdyYXBoVHJhaXRzPEdyYXBoVHlwZT46OkNoaWxkSXRlcmF0b3JUeXBlPgorY2hpbGRyZW4oY29uc3QgdHlwZW5hbWUgR3JhcGhUcmFpdHM8R3JhcGhUeXBlPjo6Tm9kZVJlZiAmRykgeworICByZXR1cm4gbWFrZV9yYW5nZShHcmFwaFRyYWl0czxHcmFwaFR5cGU+OjpjaGlsZF9iZWdpbihHKSwKKyAgICAgICAgICAgICAgICAgICAgR3JhcGhUcmFpdHM8R3JhcGhUeXBlPjo6Y2hpbGRfZW5kKEcpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEdyYXBoVHlwZT4KK2l0ZXJhdG9yX3JhbmdlPHR5cGVuYW1lIEdyYXBoVHJhaXRzPEludmVyc2U8R3JhcGhUeXBlPj46OkNoaWxkSXRlcmF0b3JUeXBlPgoraW52ZXJzZV9jaGlsZHJlbihjb25zdCB0eXBlbmFtZSBHcmFwaFRyYWl0czxHcmFwaFR5cGU+OjpOb2RlUmVmICZHKSB7CisgIHJldHVybiBtYWtlX3JhbmdlKEdyYXBoVHJhaXRzPEludmVyc2U8R3JhcGhUeXBlPj46OmNoaWxkX2JlZ2luKEcpLAorICAgICAgICAgICAgICAgICAgICBHcmFwaFRyYWl0czxJbnZlcnNlPEdyYXBoVHlwZT4+OjpjaGlsZF9lbmQoRykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgR3JhcGhUeXBlPgoraXRlcmF0b3JfcmFuZ2U8dHlwZW5hbWUgR3JhcGhUcmFpdHM8R3JhcGhUeXBlPjo6Q2hpbGRFZGdlSXRlcmF0b3JUeXBlPgorY2hpbGRyZW5fZWRnZXMoY29uc3QgdHlwZW5hbWUgR3JhcGhUcmFpdHM8R3JhcGhUeXBlPjo6Tm9kZVJlZiAmRykgeworICByZXR1cm4gbWFrZV9yYW5nZShHcmFwaFRyYWl0czxHcmFwaFR5cGU+OjpjaGlsZF9lZGdlX2JlZ2luKEcpLAorICAgICAgICAgICAgICAgICAgICBHcmFwaFRyYWl0czxHcmFwaFR5cGU+OjpjaGlsZF9lZGdlX2VuZChHKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9HUkFQSFRSQUlUU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9IYXNoaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9IYXNoaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNiNTc0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0hhc2hpbmcuaApAQCAtMCwwICsxLDY2MSBAQAorLy89PT0tLSBsbHZtL0FEVC9IYXNoaW5nLmggLSBVdGlsaXRpZXMgZm9yIGhhc2hpbmcgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgbmV3bHkgcHJvcG9zZWQgc3RhbmRhcmQgQysrIGludGVyZmFjZXMgZm9yIGhhc2hpbmcKKy8vIGFyYml0cmFyeSBkYXRhIGFuZCBidWlsZGluZyBoYXNoIGZ1bmN0aW9ucyBmb3IgdXNlci1kZWZpbmVkIHR5cGVzLiBUaGlzCisvLyBpbnRlcmZhY2Ugd2FzIG9yaWdpbmFsbHkgcHJvcG9zZWQgaW4gTjMzMzNbMV0gYW5kIGlzIGN1cnJlbnRseSB1bmRlciByZXZpZXcKKy8vIGZvciBpbmNsdXNpb24gaW4gYSBmdXR1cmUgVFIgYW5kL29yIHN0YW5kYXJkLgorLy8KKy8vIFRoZSBwcmltYXJ5IGludGVyZmFjZXMgcHJvdmlkZSBhcmUgY29tcHJpc2VkIG9mIG9uZSB0eXBlIGFuZCB0aHJlZSBmdW5jdGlvbnM6CisvLworLy8gIC0tICdoYXNoX2NvZGUnIGNsYXNzIGlzIGFuIG9wYXF1ZSB0eXBlIHJlcHJlc2VudGluZyB0aGUgaGFzaCBjb2RlIGZvciBzb21lCisvLyAgICAgZGF0YS4gSXQgaXMgdGhlIGludGVuZGVkIHByb2R1Y3Qgb2YgaGFzaGluZywgYW5kIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudAorLy8gICAgIGhhc2ggdGFibGVzLCBjaGVja3N1bW1pbmcsIGFuZCBvdGhlciBjb21tb24gdXNlcyBvZiBoYXNoZXMuIEl0IGlzIG5vdCBhbgorLy8gICAgIGludGVnZXIgdHlwZSAoYWx0aG91Z2ggaXQgY2FuIGJlIGNvbnZlcnRlZCB0byBvbmUpIGJlY2F1c2UgaXQgaXMgcmlza3kKKy8vICAgICB0byBhc3N1bWUgbXVjaCBhYm91dCB0aGUgaW50ZXJuYWxzIG9mIGEgaGFzaF9jb2RlLiBJbiBwYXJ0aWN1bGFyLCBlYWNoCisvLyAgICAgZXhlY3V0aW9uIG9mIHRoZSBwcm9ncmFtIGhhcyBhIGhpZ2ggcHJvYmFiaWxpdHkgb2YgcHJvZHVjaW5nIGEgZGlmZmVyZW50CisvLyAgICAgaGFzaF9jb2RlIGZvciBhIGdpdmVuIGlucHV0LiBUaHVzIHRoZWlyIHZhbHVlcyBhcmUgbm90IHN0YWJsZSB0byBzYXZlIG9yCisvLyAgICAgcGVyc2lzdCwgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgZHVyaW5nIHRoZSBleGVjdXRpb24gZm9yIHRoZQorLy8gICAgIGNvbnN0cnVjdGlvbiBvZiBoYXNoaW5nIGRhdGFzdHJ1Y3R1cmVzLgorLy8KKy8vICAtLSAnaGFzaF92YWx1ZScgaXMgYSBmdW5jdGlvbiBkZXNpZ25lZCB0byBiZSBvdmVybG9hZGVkIGZvciBlYWNoCisvLyAgICAgdXNlci1kZWZpbmVkIHR5cGUgd2hpY2ggd2lzaGVzIHRvIGJlIHVzZWQgd2l0aGluIGEgaGFzaGluZyBjb250ZXh0LiBJdAorLy8gICAgIHNob3VsZCBiZSBvdmVybG9hZGVkIHdpdGhpbiB0aGUgdXNlci1kZWZpbmVkIHR5cGUncyBuYW1lc3BhY2UgYW5kIGZvdW5kCisvLyAgICAgdmlhIEFETC4gT3ZlcmxvYWRzIGZvciBwcmltaXRpdmUgdHlwZXMgYXJlIHByb3ZpZGVkIGJ5IHRoaXMgbGlicmFyeS4KKy8vCisvLyAgLS0gJ2hhc2hfY29tYmluZScgYW5kICdoYXNoX2NvbWJpbmVfcmFuZ2UnIGFyZSBmdW5jdGlvbnMgZGVzaWduZWQgdG8gYWlkCisvLyAgICAgIHByb2dyYW1tZXJzIGluIGVhc2lseSBhbmQgaW50dWl0aXZlbHkgY29tYmluaW5nIGEgc2V0IG9mIGRhdGEgaW50bworLy8gICAgICBhIHNpbmdsZSBoYXNoX2NvZGUgZm9yIHRoZWlyIG9iamVjdC4gVGhleSBzaG91bGQgb25seSBsb2dpY2FsbHkgYmUgdXNlZAorLy8gICAgICB3aXRoaW4gdGhlIGltcGxlbWVudGF0aW9uIG9mIGEgJ2hhc2hfdmFsdWUnIHJvdXRpbmUgb3Igc2ltaWxhciBjb250ZXh0LgorLy8KKy8vIE5vdGUgdGhhdCAnaGFzaF9jb21iaW5lX3JhbmdlJyBjb250YWlucyB2ZXJ5IHNwZWNpYWwgbG9naWMgZm9yIGhhc2hpbmcKKy8vIGEgY29udGlndW91cyBhcnJheSBvZiBpbnRlZ2VycyBvciBwb2ludGVycy4gVGhpcyBsb2dpYyBpcyAqZXh0cmVtZWx5KiBmYXN0LAorLy8gb24gYSBtb2Rlcm4gSW50ZWwgIkdhaW5lc3Rvd24iIFhlb24gKE5laGFsZW0gdWFyY2gpIEAyLjIgR0h6LCB0aGVzZSB3ZXJlCisvLyBiZW5jaG1hcmtlZCBhdCBvdmVyIDYuNSBHaUIvcyBmb3IgbGFyZ2Uga2V5cywgYW5kIDwyMCBjeWNsZXMvaGFzaCBmb3Iga2V5cworLy8gdW5kZXIgMzItYnl0ZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9IQVNISU5HX0gKKyNkZWZpbmUgTExWTV9BRFRfSEFTSElOR19ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0hvc3QuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU3dhcEJ5dGVPcmRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFxicmllZiBBbiBvcGFxdWUgb2JqZWN0IHJlcHJlc2VudGluZyBhIGhhc2ggY29kZS4KKy8vLworLy8vIFRoaXMgb2JqZWN0IHJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBoYXNoaW5nIHNvbWUgZW50aXR5LiBJdCBpcyBpbnRlbmRlZCB0bworLy8vIGJlIHVzZWQgdG8gaW1wbGVtZW50IGhhc2h0YWJsZXMgb3Igb3RoZXIgaGFzaGluZy1iYXNlZCBkYXRhIHN0cnVjdHVyZXMuCisvLy8gV2hpbGUgaXQgd3JhcHMgYW5kIGV4cG9zZXMgYSBudW1lcmljIHZhbHVlLCB0aGlzIHZhbHVlIHNob3VsZCBub3QgYmUKKy8vLyB0cnVzdGVkIHRvIGJlIHN0YWJsZSBvciBwcmVkaWN0YWJsZSBhY3Jvc3MgcHJvY2Vzc2VzIG9yIGV4ZWN1dGlvbnMuCisvLy8KKy8vLyBJbiBvcmRlciB0byBvYnRhaW4gdGhlIGhhc2hfY29kZSBmb3IgYW4gb2JqZWN0ICd4JzoKKy8vLyBcY29kZQorLy8vICAgdXNpbmcgbGx2bTo6aGFzaF92YWx1ZTsKKy8vLyAgIGxsdm06Omhhc2hfY29kZSBjb2RlID0gaGFzaF92YWx1ZSh4KTsKKy8vLyBcZW5kY29kZQorY2xhc3MgaGFzaF9jb2RlIHsKKyAgc2l6ZV90IHZhbHVlOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3QgYSBoYXNoX2NvZGUuCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBsZWF2ZXMgdGhlIHZhbHVlIHVuaW5pdGlhbGl6ZWQuCisgIGhhc2hfY29kZSgpID0gZGVmYXVsdDsKKworICAvLy8gXGJyaWVmIEZvcm0gYSBoYXNoIGNvZGUgZGlyZWN0bHkgZnJvbSBhIG51bWVyaWNhbCB2YWx1ZS4KKyAgaGFzaF9jb2RlKHNpemVfdCB2YWx1ZSkgOiB2YWx1ZSh2YWx1ZSkge30KKworICAvLy8gXGJyaWVmIENvbnZlcnQgdGhlIGhhc2ggY29kZSB0byBpdHMgbnVtZXJpY2FsIHZhbHVlIGZvciB1c2UuCisgIC8qZXhwbGljaXQqLyBvcGVyYXRvciBzaXplX3QoKSBjb25zdCB7IHJldHVybiB2YWx1ZTsgfQorCisgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgaGFzaF9jb2RlICZsaHMsIGNvbnN0IGhhc2hfY29kZSAmcmhzKSB7CisgICAgcmV0dXJuIGxocy52YWx1ZSA9PSByaHMudmFsdWU7CisgIH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBoYXNoX2NvZGUgJmxocywgY29uc3QgaGFzaF9jb2RlICZyaHMpIHsKKyAgICByZXR1cm4gbGhzLnZhbHVlICE9IHJocy52YWx1ZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWxsb3cgYSBoYXNoX2NvZGUgdG8gYmUgZGlyZWN0bHkgcnVuIHRocm91Z2ggaGFzaF92YWx1ZS4KKyAgZnJpZW5kIHNpemVfdCBoYXNoX3ZhbHVlKGNvbnN0IGhhc2hfY29kZSAmY29kZSkgeyByZXR1cm4gY29kZS52YWx1ZTsgfQorfTsKKworLy8vIFxicmllZiBDb21wdXRlIGEgaGFzaF9jb2RlIGZvciBhbnkgaW50ZWdlciB2YWx1ZS4KKy8vLworLy8vIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIHRvIGNvbXB1dGUgdGhlIHNhbWUgaGFzaF9jb2RlIGZvcgorLy8vIGEgcGFydGljdWxhciB2YWx1ZSB3aXRob3V0IHJlZ2FyZCB0byB0aGUgcHJlLXByb21vdGlvbiB0eXBlLiBUaGlzIGlzIGluCisvLy8gY29udHJhc3QgdG8gaGFzaF9jb21iaW5lIHdoaWNoIG1heSBwcm9kdWNlIGRpZmZlcmVudCBoYXNoX2NvZGVzIGZvcgorLy8vIGRpZmZlcmluZyBhcmd1bWVudCB0eXBlcyBldmVuIGlmIHRoZXkgd291bGQgaW1wbGljaXQgcHJvbW90ZSB0byBhIGNvbW1vbgorLy8vIHR5cGUgd2l0aG91dCBjaGFuZ2luZyB0aGUgdmFsdWUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGlzX2ludGVncmFsX29yX2VudW08VD46OnZhbHVlLCBoYXNoX2NvZGU+Ojp0eXBlCitoYXNoX3ZhbHVlKFQgdmFsdWUpOworCisvLy8gXGJyaWVmIENvbXB1dGUgYSBoYXNoX2NvZGUgZm9yIGEgcG9pbnRlcidzIGFkZHJlc3MuCisvLy8KKy8vLyBOLkIuOiBUaGlzIGhhc2hlcyB0aGUgKmFkZHJlc3MqLiBOb3QgdGhlIHZhbHVlIGFuZCBub3QgdGhlIHR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gaGFzaF9jb2RlIGhhc2hfdmFsdWUoY29uc3QgVCAqcHRyKTsKKworLy8vIFxicmllZiBDb21wdXRlIGEgaGFzaF9jb2RlIGZvciBhIHBhaXIgb2Ygb2JqZWN0cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgoraGFzaF9jb2RlIGhhc2hfdmFsdWUoY29uc3Qgc3RkOjpwYWlyPFQsIFU+ICZhcmcpOworCisvLy8gXGJyaWVmIENvbXB1dGUgYSBoYXNoX2NvZGUgZm9yIGEgc3RhbmRhcmQgc3RyaW5nLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitoYXNoX2NvZGUgaGFzaF92YWx1ZShjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxUPiAmYXJnKTsKKworCisvLy8gXGJyaWVmIE92ZXJyaWRlIHRoZSBleGVjdXRpb24gc2VlZCB3aXRoIGEgZml4ZWQgdmFsdWUuCisvLy8KKy8vLyBUaGlzIGhhc2hpbmcgbGlicmFyeSB1c2VzIGEgcGVyLWV4ZWN1dGlvbiBzZWVkIGRlc2lnbmVkIHRvIGNoYW5nZSBvbiBlYWNoCisvLy8gcnVuIHdpdGggaGlnaCBwcm9iYWJpbGl0eSBpbiBvcmRlciB0byBlbnN1cmUgdGhhdCB0aGUgaGFzaCBjb2RlcyBhcmUgbm90CisvLy8gYXR0YWNrYWJsZSBhbmQgdG8gZW5zdXJlIHRoYXQgb3V0cHV0IHdoaWNoIGlzIGludGVuZGVkIHRvIGJlIHN0YWJsZSBkb2VzCisvLy8gbm90IHJlbHkgb24gdGhlIHBhcnRpY3VsYXJzIG9mIHRoZSBoYXNoIGNvZGVzIHByb2R1Y2VkLgorLy8vCisvLy8gVGhhdCBzYWlkLCB0aGVyZSBhcmUgdXNlIGNhc2VzIHdoZXJlIGl0IGlzIGltcG9ydGFudCB0byBiZSBhYmxlIHRvCisvLy8gcmVwcm9kdWNlICpleGFjdGx5KiBhIHNwZWNpZmljIGJlaGF2aW9yLiBUbyB0aGF0IGVuZCwgd2UgcHJvdmlkZSBhIGZ1bmN0aW9uCisvLy8gd2hpY2ggd2lsbCBmb3JjaWJseSBzZXQgdGhlIHNlZWQgdG8gYSBmaXhlZCB2YWx1ZS4gVGhpcyBtdXN0IGJlIGRvbmUgYXQgdGhlCisvLy8gc3RhcnQgb2YgdGhlIHByb2dyYW0sIGJlZm9yZSBhbnkgaGFzaGVzIGFyZSBjb21wdXRlZC4gQWxzbywgaXQgY2Fubm90IGJlCisvLy8gdW5kb25lLiBUaGlzIG1ha2VzIGl0IHRocmVhZC1ob3N0aWxlIGFuZCB2ZXJ5IGhhcmQgdG8gdXNlIG91dHNpZGUgb2YKKy8vLyBpbW1lZGlhdGVseSBvbiBzdGFydCBvZiBhIHNpbXBsZSBwcm9ncmFtIGRlc2lnbmVkIGZvciByZXByb2R1Y2libGUKKy8vLyBiZWhhdmlvci4KK3ZvaWQgc2V0X2ZpeGVkX2V4ZWN1dGlvbl9oYXNoX3NlZWQoc2l6ZV90IGZpeGVkX3ZhbHVlKTsKKworCisvLyBBbGwgb2YgdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgYWN0dWFsbHkgY29tcHV0aW5nIHRoZSB2YXJpb3VzIGhhc2gKKy8vIGNvZGUgdmFsdWVzIGFyZSBoZWxkIHdpdGhpbiB0aGlzIG5hbWVzcGFjZS4gVGhlc2Ugcm91dGluZXMgYXJlIGluY2x1ZGVkIGluCisvLyB0aGUgaGVhZGVyIGZpbGUgbWFpbmx5IHRvIGFsbG93IGlubGluaW5nIGFuZCBjb25zdGFudCBwcm9wYWdhdGlvbi4KK25hbWVzcGFjZSBoYXNoaW5nIHsKK25hbWVzcGFjZSBkZXRhaWwgeworCitpbmxpbmUgdWludDY0X3QgZmV0Y2g2NChjb25zdCBjaGFyICpwKSB7CisgIHVpbnQ2NF90IHJlc3VsdDsKKyAgbWVtY3B5KCZyZXN1bHQsIHAsIHNpemVvZihyZXN1bHQpKTsKKyAgaWYgKHN5czo6SXNCaWdFbmRpYW5Ib3N0KQorICAgIHN5czo6c3dhcEJ5dGVPcmRlcihyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorCitpbmxpbmUgdWludDMyX3QgZmV0Y2gzMihjb25zdCBjaGFyICpwKSB7CisgIHVpbnQzMl90IHJlc3VsdDsKKyAgbWVtY3B5KCZyZXN1bHQsIHAsIHNpemVvZihyZXN1bHQpKTsKKyAgaWYgKHN5czo6SXNCaWdFbmRpYW5Ib3N0KQorICAgIHN5czo6c3dhcEJ5dGVPcmRlcihyZXN1bHQpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLy8gU29tZSBwcmltZXMgYmV0d2VlbiAyXjYzIGFuZCAyXjY0IGZvciB2YXJpb3VzIHVzZXMuCitzdGF0aWMgY29uc3QgdWludDY0X3QgazAgPSAweGMzYTVjODVjOTdjYjMxMjdVTEw7CitzdGF0aWMgY29uc3QgdWludDY0X3QgazEgPSAweGI0OTJiNjZmYmU5OGYyNzNVTEw7CitzdGF0aWMgY29uc3QgdWludDY0X3QgazIgPSAweDlhZTE2YTNiMmY5MDQwNGZVTEw7CitzdGF0aWMgY29uc3QgdWludDY0X3QgazMgPSAweGM5NDlkN2M3NTA5ZTY1NTdVTEw7CisKKy8vLyBcYnJpZWYgQml0d2lzZSByaWdodCByb3RhdGUuCisvLy8gTm9ybWFsbHkgdGhpcyB3aWxsIGNvbXBpbGUgdG8gYSBzaW5nbGUgaW5zdHJ1Y3Rpb24sIGVzcGVjaWFsbHkgaWYgdGhlCisvLy8gc2hpZnQgaXMgYSBtYW5pZmVzdCBjb25zdGFudC4KK2lubGluZSB1aW50NjRfdCByb3RhdGUodWludDY0X3QgdmFsLCBzaXplX3Qgc2hpZnQpIHsKKyAgLy8gQXZvaWQgc2hpZnRpbmcgYnkgNjQ6IGRvaW5nIHNvIHlpZWxkcyBhbiB1bmRlZmluZWQgcmVzdWx0LgorICByZXR1cm4gc2hpZnQgPT0gMCA/IHZhbCA6ICgodmFsID4+IHNoaWZ0KSB8ICh2YWwgPDwgKDY0IC0gc2hpZnQpKSk7Cit9CisKK2lubGluZSB1aW50NjRfdCBzaGlmdF9taXgodWludDY0X3QgdmFsKSB7CisgIHJldHVybiB2YWwgXiAodmFsID4+IDQ3KTsKK30KKworaW5saW5lIHVpbnQ2NF90IGhhc2hfMTZfYnl0ZXModWludDY0X3QgbG93LCB1aW50NjRfdCBoaWdoKSB7CisgIC8vIE11cm11ci1pbnNwaXJlZCBoYXNoaW5nLgorICBjb25zdCB1aW50NjRfdCBrTXVsID0gMHg5ZGRmZWEwOGViMzgyZDY5VUxMOworICB1aW50NjRfdCBhID0gKGxvdyBeIGhpZ2gpICoga011bDsKKyAgYSBePSAoYSA+PiA0Nyk7CisgIHVpbnQ2NF90IGIgPSAoaGlnaCBeIGEpICoga011bDsKKyAgYiBePSAoYiA+PiA0Nyk7CisgIGIgKj0ga011bDsKKyAgcmV0dXJuIGI7Cit9CisKK2lubGluZSB1aW50NjRfdCBoYXNoXzF0bzNfYnl0ZXMoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbiwgdWludDY0X3Qgc2VlZCkgeworICB1aW50OF90IGEgPSBzWzBdOworICB1aW50OF90IGIgPSBzW2xlbiA+PiAxXTsKKyAgdWludDhfdCBjID0gc1tsZW4gLSAxXTsKKyAgdWludDMyX3QgeSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihhKSArIChzdGF0aWNfY2FzdDx1aW50MzJfdD4oYikgPDwgOCk7CisgIHVpbnQzMl90IHogPSBsZW4gKyAoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGMpIDw8IDIpOworICByZXR1cm4gc2hpZnRfbWl4KHkgKiBrMiBeIHogKiBrMyBeIHNlZWQpICogazI7Cit9CisKK2lubGluZSB1aW50NjRfdCBoYXNoXzR0bzhfYnl0ZXMoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbiwgdWludDY0X3Qgc2VlZCkgeworICB1aW50NjRfdCBhID0gZmV0Y2gzMihzKTsKKyAgcmV0dXJuIGhhc2hfMTZfYnl0ZXMobGVuICsgKGEgPDwgMyksIHNlZWQgXiBmZXRjaDMyKHMgKyBsZW4gLSA0KSk7Cit9CisKK2lubGluZSB1aW50NjRfdCBoYXNoXzl0bzE2X2J5dGVzKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4sIHVpbnQ2NF90IHNlZWQpIHsKKyAgdWludDY0X3QgYSA9IGZldGNoNjQocyk7CisgIHVpbnQ2NF90IGIgPSBmZXRjaDY0KHMgKyBsZW4gLSA4KTsKKyAgcmV0dXJuIGhhc2hfMTZfYnl0ZXMoc2VlZCBeIGEsIHJvdGF0ZShiICsgbGVuLCBsZW4pKSBeIGI7Cit9CisKK2lubGluZSB1aW50NjRfdCBoYXNoXzE3dG8zMl9ieXRlcyhjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuLCB1aW50NjRfdCBzZWVkKSB7CisgIHVpbnQ2NF90IGEgPSBmZXRjaDY0KHMpICogazE7CisgIHVpbnQ2NF90IGIgPSBmZXRjaDY0KHMgKyA4KTsKKyAgdWludDY0X3QgYyA9IGZldGNoNjQocyArIGxlbiAtIDgpICogazI7CisgIHVpbnQ2NF90IGQgPSBmZXRjaDY0KHMgKyBsZW4gLSAxNikgKiBrMDsKKyAgcmV0dXJuIGhhc2hfMTZfYnl0ZXMocm90YXRlKGEgLSBiLCA0MykgKyByb3RhdGUoYyBeIHNlZWQsIDMwKSArIGQsCisgICAgICAgICAgICAgICAgICAgICAgIGEgKyByb3RhdGUoYiBeIGszLCAyMCkgLSBjICsgbGVuICsgc2VlZCk7Cit9CisKK2lubGluZSB1aW50NjRfdCBoYXNoXzMzdG82NF9ieXRlcyhjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuLCB1aW50NjRfdCBzZWVkKSB7CisgIHVpbnQ2NF90IHogPSBmZXRjaDY0KHMgKyAyNCk7CisgIHVpbnQ2NF90IGEgPSBmZXRjaDY0KHMpICsgKGxlbiArIGZldGNoNjQocyArIGxlbiAtIDE2KSkgKiBrMDsKKyAgdWludDY0X3QgYiA9IHJvdGF0ZShhICsgeiwgNTIpOworICB1aW50NjRfdCBjID0gcm90YXRlKGEsIDM3KTsKKyAgYSArPSBmZXRjaDY0KHMgKyA4KTsKKyAgYyArPSByb3RhdGUoYSwgNyk7CisgIGEgKz0gZmV0Y2g2NChzICsgMTYpOworICB1aW50NjRfdCB2ZiA9IGEgKyB6OworICB1aW50NjRfdCB2cyA9IGIgKyByb3RhdGUoYSwgMzEpICsgYzsKKyAgYSA9IGZldGNoNjQocyArIDE2KSArIGZldGNoNjQocyArIGxlbiAtIDMyKTsKKyAgeiA9IGZldGNoNjQocyArIGxlbiAtIDgpOworICBiID0gcm90YXRlKGEgKyB6LCA1Mik7CisgIGMgPSByb3RhdGUoYSwgMzcpOworICBhICs9IGZldGNoNjQocyArIGxlbiAtIDI0KTsKKyAgYyArPSByb3RhdGUoYSwgNyk7CisgIGEgKz0gZmV0Y2g2NChzICsgbGVuIC0gMTYpOworICB1aW50NjRfdCB3ZiA9IGEgKyB6OworICB1aW50NjRfdCB3cyA9IGIgKyByb3RhdGUoYSwgMzEpICsgYzsKKyAgdWludDY0X3QgciA9IHNoaWZ0X21peCgodmYgKyB3cykgKiBrMiArICh3ZiArIHZzKSAqIGswKTsKKyAgcmV0dXJuIHNoaWZ0X21peCgoc2VlZCBeIChyICogazApKSArIHZzKSAqIGsyOworfQorCitpbmxpbmUgdWludDY0X3QgaGFzaF9zaG9ydChjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuZ3RoLCB1aW50NjRfdCBzZWVkKSB7CisgIGlmIChsZW5ndGggPj0gNCAmJiBsZW5ndGggPD0gOCkKKyAgICByZXR1cm4gaGFzaF80dG84X2J5dGVzKHMsIGxlbmd0aCwgc2VlZCk7CisgIGlmIChsZW5ndGggPiA4ICYmIGxlbmd0aCA8PSAxNikKKyAgICByZXR1cm4gaGFzaF85dG8xNl9ieXRlcyhzLCBsZW5ndGgsIHNlZWQpOworICBpZiAobGVuZ3RoID4gMTYgJiYgbGVuZ3RoIDw9IDMyKQorICAgIHJldHVybiBoYXNoXzE3dG8zMl9ieXRlcyhzLCBsZW5ndGgsIHNlZWQpOworICBpZiAobGVuZ3RoID4gMzIpCisgICAgcmV0dXJuIGhhc2hfMzN0bzY0X2J5dGVzKHMsIGxlbmd0aCwgc2VlZCk7CisgIGlmIChsZW5ndGggIT0gMCkKKyAgICByZXR1cm4gaGFzaF8xdG8zX2J5dGVzKHMsIGxlbmd0aCwgc2VlZCk7CisKKyAgcmV0dXJuIGsyIF4gc2VlZDsKK30KKworLy8vIFxicmllZiBUaGUgaW50ZXJtZWRpYXRlIHN0YXRlIHVzZWQgZHVyaW5nIGhhc2hpbmcuCisvLy8gQ3VycmVudGx5LCB0aGUgYWxnb3JpdGhtIGZvciBjb21wdXRpbmcgaGFzaCBjb2RlcyBpcyBiYXNlZCBvbiBDaXR5SGFzaCBhbmQKKy8vLyBrZWVwcyA1NiBieXRlcyBvZiBhcmJpdHJhcnkgc3RhdGUuCitzdHJ1Y3QgaGFzaF9zdGF0ZSB7CisgIHVpbnQ2NF90IGgwLCBoMSwgaDIsIGgzLCBoNCwgaDUsIGg2OworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgbmV3IGhhc2hfc3RhdGUgc3RydWN0dXJlIGFuZCBpbml0aWFsaXplIGl0IGJhc2VkIG9uIHRoZQorICAvLy8gc2VlZCBhbmQgdGhlIGZpcnN0IDY0LWJ5dGUgY2h1bmsuCisgIC8vLyBUaGlzIGVmZmVjdGl2ZWx5IHBlcmZvcm1zIHRoZSBpbml0aWFsIG1peC4KKyAgc3RhdGljIGhhc2hfc3RhdGUgY3JlYXRlKGNvbnN0IGNoYXIgKnMsIHVpbnQ2NF90IHNlZWQpIHsKKyAgICBoYXNoX3N0YXRlIHN0YXRlID0geworICAgICAgMCwgc2VlZCwgaGFzaF8xNl9ieXRlcyhzZWVkLCBrMSksIHJvdGF0ZShzZWVkIF4gazEsIDQ5KSwKKyAgICAgIHNlZWQgKiBrMSwgc2hpZnRfbWl4KHNlZWQpLCAwIH07CisgICAgc3RhdGUuaDYgPSBoYXNoXzE2X2J5dGVzKHN0YXRlLmg0LCBzdGF0ZS5oNSk7CisgICAgc3RhdGUubWl4KHMpOworICAgIHJldHVybiBzdGF0ZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgTWl4IDMyLWJ5dGVzIGZyb20gdGhlIGlucHV0IHNlcXVlbmNlIGludG8gdGhlIDE2LWJ5dGVzIG9mICdhJworICAvLy8gYW5kICdiJywgaW5jbHVkaW5nIHdoYXRldmVyIGlzIGFscmVhZHkgaW4gJ2EnIGFuZCAnYicuCisgIHN0YXRpYyB2b2lkIG1peF8zMl9ieXRlcyhjb25zdCBjaGFyICpzLCB1aW50NjRfdCAmYSwgdWludDY0X3QgJmIpIHsKKyAgICBhICs9IGZldGNoNjQocyk7CisgICAgdWludDY0X3QgYyA9IGZldGNoNjQocyArIDI0KTsKKyAgICBiID0gcm90YXRlKGIgKyBhICsgYywgMjEpOworICAgIHVpbnQ2NF90IGQgPSBhOworICAgIGEgKz0gZmV0Y2g2NChzICsgOCkgKyBmZXRjaDY0KHMgKyAxNik7CisgICAgYiArPSByb3RhdGUoYSwgNDQpICsgZDsKKyAgICBhICs9IGM7CisgIH0KKworICAvLy8gXGJyaWVmIE1peCBpbiBhIDY0LWJ5dGUgYnVmZmVyIG9mIGRhdGEuCisgIC8vLyBXZSBtaXggYWxsIDY0IGJ5dGVzIGV2ZW4gd2hlbiB0aGUgY2h1bmsgbGVuZ3RoIGlzIHNtYWxsZXIsIGJ1dCB3ZQorICAvLy8gcmVjb3JkIHRoZSBhY3R1YWwgbGVuZ3RoLgorICB2b2lkIG1peChjb25zdCBjaGFyICpzKSB7CisgICAgaDAgPSByb3RhdGUoaDAgKyBoMSArIGgzICsgZmV0Y2g2NChzICsgOCksIDM3KSAqIGsxOworICAgIGgxID0gcm90YXRlKGgxICsgaDQgKyBmZXRjaDY0KHMgKyA0OCksIDQyKSAqIGsxOworICAgIGgwIF49IGg2OworICAgIGgxICs9IGgzICsgZmV0Y2g2NChzICsgNDApOworICAgIGgyID0gcm90YXRlKGgyICsgaDUsIDMzKSAqIGsxOworICAgIGgzID0gaDQgKiBrMTsKKyAgICBoNCA9IGgwICsgaDU7CisgICAgbWl4XzMyX2J5dGVzKHMsIGgzLCBoNCk7CisgICAgaDUgPSBoMiArIGg2OworICAgIGg2ID0gaDEgKyBmZXRjaDY0KHMgKyAxNik7CisgICAgbWl4XzMyX2J5dGVzKHMgKyAzMiwgaDUsIGg2KTsKKyAgICBzdGQ6OnN3YXAoaDIsIGgwKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29tcHV0ZSB0aGUgZmluYWwgNjQtYml0IGhhc2ggY29kZSB2YWx1ZSBiYXNlZCBvbiB0aGUgY3VycmVudAorICAvLy8gc3RhdGUgYW5kIHRoZSBsZW5ndGggb2YgYnl0ZXMgaGFzaGVkLgorICB1aW50NjRfdCBmaW5hbGl6ZShzaXplX3QgbGVuZ3RoKSB7CisgICAgcmV0dXJuIGhhc2hfMTZfYnl0ZXMoaGFzaF8xNl9ieXRlcyhoMywgaDUpICsgc2hpZnRfbWl4KGgxKSAqIGsxICsgaDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgaGFzaF8xNl9ieXRlcyhoNCwgaDYpICsgc2hpZnRfbWl4KGxlbmd0aCkgKiBrMSArIGgwKTsKKyAgfQorfTsKKworCisvLy8gXGJyaWVmIEEgZ2xvYmFsLCBmaXhlZCBzZWVkLW92ZXJyaWRlIHZhcmlhYmxlLgorLy8vCisvLy8gVGhpcyB2YXJpYWJsZSBjYW4gYmUgc2V0IHVzaW5nIHRoZSBcc2VlIGxsdm06OnNldF9maXhlZF9leGVjdXRpb25fc2VlZAorLy8vIGZ1bmN0aW9uLiBTZWUgdGhhdCBmdW5jdGlvbiBmb3IgZGV0YWlscy4gRG8gbm90LCB1bmRlciBhbnkgY2lyY3Vtc3RhbmNlcywKKy8vLyBzZXQgb3IgcmVhZCB0aGlzIHZhcmlhYmxlLgorZXh0ZXJuIHNpemVfdCBmaXhlZF9zZWVkX292ZXJyaWRlOworCitpbmxpbmUgc2l6ZV90IGdldF9leGVjdXRpb25fc2VlZCgpIHsKKyAgLy8gRklYTUU6IFRoaXMgbmVlZHMgdG8gYmUgYSBwZXItZXhlY3V0aW9uIHNlZWQuIFRoaXMgaXMganVzdCBhIHBsYWNlaG9sZGVyCisgIC8vIGltcGxlbWVudGF0aW9uLiBTd2l0Y2hpbmcgdG8gYSBwZXItZXhlY3V0aW9uIHNlZWQgaXMgbGlrZWx5IHRvIGZsdXNoIG91dAorICAvLyBpbnN0YWJpbGl0eSBidWdzIGFuZCBzbyB3aWxsIGhhcHBlbiBhcyBpdHMgb3duIGNvbW1pdC4KKyAgLy8KKyAgLy8gSG93ZXZlciwgaWYgdGhlcmUgaXMgYSBmaXhlZCBzZWVkIG92ZXJyaWRlIHNldCB0aGUgZmlyc3QgdGltZSB0aGlzIGlzCisgIC8vIGNhbGxlZCwgcmV0dXJuIHRoYXQgaW5zdGVhZCBvZiB0aGUgcGVyLWV4ZWN1dGlvbiBzZWVkLgorICBjb25zdCB1aW50NjRfdCBzZWVkX3ByaW1lID0gMHhmZjUxYWZkN2VkNTU4Y2NkVUxMOworICBzdGF0aWMgc2l6ZV90IHNlZWQgPSBmaXhlZF9zZWVkX292ZXJyaWRlID8gZml4ZWRfc2VlZF9vdmVycmlkZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKHNpemVfdClzZWVkX3ByaW1lOworICByZXR1cm4gc2VlZDsKK30KKworCisvLy8gXGJyaWVmIFRyYWl0IHRvIGluZGljYXRlIHdoZXRoZXIgYSB0eXBlJ3MgYml0cyBjYW4gYmUgaGFzaGVkIGRpcmVjdGx5LgorLy8vCisvLy8gQSB0eXBlIHRyYWl0IHdoaWNoIGlzIHRydWUgaWYgd2Ugd2FudCB0byBjb21iaW5lIHZhbHVlcyBmb3IgaGFzaGluZyBieQorLy8vIHJlYWRpbmcgdGhlIHVuZGVybHlpbmcgZGF0YS4gSXQgaXMgZmFsc2UgaWYgdmFsdWVzIG9mIHRoaXMgdHlwZSBtdXN0CisvLy8gZmlyc3QgYmUgcGFzc2VkIHRvIGhhc2hfdmFsdWUsIGFuZCB0aGUgcmVzdWx0aW5nIGhhc2hfY29kZXMgY29tYmluZWQuCisvLworLy8gRklYTUU6IFdlIHdhbnQgdG8gcmVwbGFjZSBpc19pbnRlZ3JhbF9vcl9lbnVtIGFuZCBpc19wb2ludGVyIGhlcmUgd2l0aAorLy8gYSBwcmVkaWNhdGUgd2hpY2ggYXNzZXJ0cyB0aGF0IGNvbXBhcmluZyB0aGUgdW5kZXJseWluZyBzdG9yYWdlIG9mIHR3bworLy8gdmFsdWVzIG9mIHRoZSB0eXBlIGZvciBlcXVhbGl0eSBpcyBlcXVpdmFsZW50IHRvIGNvbXBhcmluZyB0aGUgdHdvIHZhbHVlcworLy8gZm9yIGVxdWFsaXR5LiBGb3IgYWxsIHRoZSBwbGF0Zm9ybXMgd2UgY2FyZSBhYm91dCwgdGhpcyBob2xkcyBmb3IgaW50ZWdlcnMKKy8vIGFuZCBwb2ludGVycywgYnV0IHRoZXJlIGFyZSBwbGF0Zm9ybXMgd2hlcmUgaXQgZG9lc24ndCBhbmQgd2Ugd291bGQgbGlrZSB0bworLy8gc3VwcG9ydCB1c2VyLWRlZmluZWQgdHlwZXMgd2hpY2ggaGFwcGVuIHRvIHNhdGlzZnkgdGhpcyBwcm9wZXJ0eS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNfaGFzaGFibGVfZGF0YQorICA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgKChpc19pbnRlZ3JhbF9vcl9lbnVtPFQ+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlzX3BvaW50ZXI8VD46OnZhbHVlKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDY0ICUgc2l6ZW9mKFQpID09IDApPiB7fTsKKworLy8gU3BlY2lhbCBjYXNlIHN0ZDo6cGFpciB0byBkZXRlY3Qgd2hlbiBib3RoIHR5cGVzIGFyZSB2aWFibGUgYW5kIHdoZW4gdGhlcmUKKy8vIGlzIG5vIGFsaWdubWVudC1kZXJpdmVkIHBhZGRpbmcgaW4gdGhlIHBhaXIuIFRoaXMgaXMgYSBiaXQgb2YgYSBsaWUgYmVjYXVzZQorLy8gc3RkOjpwYWlyIGlzbid0IHRydWx5IFBPRCwgYnV0IGl0J3MgY2xvc2UgZW5vdWdoIGluIGFsbCByZWFzb25hYmxlCisvLyBpbXBsZW1lbnRhdGlvbnMgZm9yIG91ciB1c2UgY2FzZSBvZiBoYXNoaW5nIHRoZSB1bmRlcmx5aW5nIGRhdGEuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4gc3RydWN0IGlzX2hhc2hhYmxlX2RhdGE8c3RkOjpwYWlyPFQsIFU+ID4KKyAgOiBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIChpc19oYXNoYWJsZV9kYXRhPFQ+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2hhc2hhYmxlX2RhdGE8VT46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihUKSArIHNpemVvZihVKSkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHN0ZDo6cGFpcjxULCBVPikpPiB7fTsKKworLy8vIFxicmllZiBIZWxwZXIgdG8gZ2V0IHRoZSBoYXNoYWJsZSBkYXRhIHJlcHJlc2VudGF0aW9uIGZvciBhIHR5cGUuCisvLy8gVGhpcyB2YXJpYW50IGlzIGVuYWJsZWQgd2hlbiB0aGUgdHlwZSBpdHNlbGYgY2FuIGJlIHVzZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGlzX2hhc2hhYmxlX2RhdGE8VD46OnZhbHVlLCBUPjo6dHlwZQorZ2V0X2hhc2hhYmxlX2RhdGEoY29uc3QgVCAmdmFsdWUpIHsKKyAgcmV0dXJuIHZhbHVlOworfQorLy8vIFxicmllZiBIZWxwZXIgdG8gZ2V0IHRoZSBoYXNoYWJsZSBkYXRhIHJlcHJlc2VudGF0aW9uIGZvciBhIHR5cGUuCisvLy8gVGhpcyB2YXJpYW50IGlzIGVuYWJsZWQgd2hlbiB3ZSBtdXN0IGZpcnN0IGNhbGwgaGFzaF92YWx1ZSBhbmQgdXNlIHRoZQorLy8vIHJlc3VsdCBhcyBvdXIgZGF0YS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IWlzX2hhc2hhYmxlX2RhdGE8VD46OnZhbHVlLCBzaXplX3Q+Ojp0eXBlCitnZXRfaGFzaGFibGVfZGF0YShjb25zdCBUICZ2YWx1ZSkgeworICB1c2luZyA6Omxsdm06Omhhc2hfdmFsdWU7CisgIHJldHVybiBoYXNoX3ZhbHVlKHZhbHVlKTsKK30KKworLy8vIFxicmllZiBIZWxwZXIgdG8gc3RvcmUgZGF0YSBmcm9tIGEgdmFsdWUgaW50byBhIGJ1ZmZlciBhbmQgYWR2YW5jZSB0aGUKKy8vLyBwb2ludGVyIGludG8gdGhhdCBidWZmZXIuCisvLy8KKy8vLyBUaGlzIHJvdXRpbmUgZmlyc3QgY2hlY2tzIHdoZXRoZXIgdGhlcmUgaXMgZW5vdWdoIHNwYWNlIGluIHRoZSBwcm92aWRlZAorLy8vIGJ1ZmZlciwgYW5kIGlmIG5vdCBpbW1lZGlhdGVseSByZXR1cm5zIGZhbHNlLiBJZiB0aGVyZSBpcyBzcGFjZSwgaXQKKy8vLyBjb3BpZXMgdGhlIHVuZGVybHlpbmcgYnl0ZXMgb2YgdmFsdWUgaW50byB0aGUgYnVmZmVyLCBhZHZhbmNlcyB0aGUKKy8vLyBidWZmZXJfcHRyIHBhc3QgdGhlIGNvcGllZCBieXRlcywgYW5kIHJldHVybnMgdHJ1ZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBzdG9yZV9hbmRfYWR2YW5jZShjaGFyIComYnVmZmVyX3B0ciwgY2hhciAqYnVmZmVyX2VuZCwgY29uc3QgVCYgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQgPSAwKSB7CisgIHNpemVfdCBzdG9yZV9zaXplID0gc2l6ZW9mKHZhbHVlKSAtIG9mZnNldDsKKyAgaWYgKGJ1ZmZlcl9wdHIgKyBzdG9yZV9zaXplID4gYnVmZmVyX2VuZCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGNvbnN0IGNoYXIgKnZhbHVlX2RhdGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oJnZhbHVlKTsKKyAgbWVtY3B5KGJ1ZmZlcl9wdHIsIHZhbHVlX2RhdGEgKyBvZmZzZXQsIHN0b3JlX3NpemUpOworICBidWZmZXJfcHRyICs9IHN0b3JlX3NpemU7CisgIHJldHVybiB0cnVlOworfQorCisvLy8gXGJyaWVmIEltcGxlbWVudCB0aGUgY29tYmluaW5nIG9mIGludGVncmFsIHZhbHVlcyBpbnRvIGEgaGFzaF9jb2RlLgorLy8vCisvLy8gVGhpcyBvdmVybG9hZCBpcyBzZWxlY3RlZCB3aGVuIHRoZSB2YWx1ZSB0eXBlIG9mIHRoZSBpdGVyYXRvciBpcworLy8vIGludGVncmFsLiBSYXRoZXIgdGhhbiBjb21wdXRpbmcgYSBoYXNoX2NvZGUgZm9yIGVhY2ggb2JqZWN0IGFuZCB0aGVuCisvLy8gY29tYmluaW5nIHRoZW0sIHRoaXMgKGFzIGFuIG9wdGltaXphdGlvbikgZGlyZWN0bHkgY29tYmluZXMgdGhlIGludGVnZXJzLgordGVtcGxhdGUgPHR5cGVuYW1lIElucHV0SXRlcmF0b3JUPgoraGFzaF9jb2RlIGhhc2hfY29tYmluZV9yYW5nZV9pbXBsKElucHV0SXRlcmF0b3JUIGZpcnN0LCBJbnB1dEl0ZXJhdG9yVCBsYXN0KSB7CisgIGNvbnN0IHNpemVfdCBzZWVkID0gZ2V0X2V4ZWN1dGlvbl9zZWVkKCk7CisgIGNoYXIgYnVmZmVyWzY0XSwgKmJ1ZmZlcl9wdHIgPSBidWZmZXI7CisgIGNoYXIgKmNvbnN0IGJ1ZmZlcl9lbmQgPSBzdGQ6OmVuZChidWZmZXIpOworICB3aGlsZSAoZmlyc3QgIT0gbGFzdCAmJiBzdG9yZV9hbmRfYWR2YW5jZShidWZmZXJfcHRyLCBidWZmZXJfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfaGFzaGFibGVfZGF0YSgqZmlyc3QpKSkKKyAgICArK2ZpcnN0OworICBpZiAoZmlyc3QgPT0gbGFzdCkKKyAgICByZXR1cm4gaGFzaF9zaG9ydChidWZmZXIsIGJ1ZmZlcl9wdHIgLSBidWZmZXIsIHNlZWQpOworICBhc3NlcnQoYnVmZmVyX3B0ciA9PSBidWZmZXJfZW5kKTsKKworICBoYXNoX3N0YXRlIHN0YXRlID0gc3RhdGUuY3JlYXRlKGJ1ZmZlciwgc2VlZCk7CisgIHNpemVfdCBsZW5ndGggPSA2NDsKKyAgd2hpbGUgKGZpcnN0ICE9IGxhc3QpIHsKKyAgICAvLyBGaWxsIHVwIHRoZSBidWZmZXIuIFdlIGRvbid0IGNsZWFyIGl0LCB3aGljaCByZS1taXhlcyB0aGUgbGFzdCByb3VuZAorICAgIC8vIHdoZW4gb25seSBhIHBhcnRpYWwgNjQtYnl0ZSBjaHVuayBpcyBsZWZ0LgorICAgIGJ1ZmZlcl9wdHIgPSBidWZmZXI7CisgICAgd2hpbGUgKGZpcnN0ICE9IGxhc3QgJiYgc3RvcmVfYW5kX2FkdmFuY2UoYnVmZmVyX3B0ciwgYnVmZmVyX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRfaGFzaGFibGVfZGF0YSgqZmlyc3QpKSkKKyAgICAgICsrZmlyc3Q7CisKKyAgICAvLyBSb3RhdGUgdGhlIGJ1ZmZlciBpZiB3ZSBkaWQgYSBwYXJ0aWFsIGZpbGwgaW4gb3JkZXIgdG8gc2ltdWxhdGUgZG9pbmcKKyAgICAvLyBhIG1peCBvZiB0aGUgbGFzdCA2NC1ieXRlcy4gVGhhdCBpcyBob3cgdGhlIGFsZ29yaXRobSB3b3JrcyB3aGVuIHdlCisgICAgLy8gaGF2ZSBhIGNvbnRpZ3VvdXMgYnl0ZSBzZXF1ZW5jZSwgYW5kIHdlIHdhbnQgdG8gZW11bGF0ZSB0aGF0IGhlcmUuCisgICAgc3RkOjpyb3RhdGUoYnVmZmVyLCBidWZmZXJfcHRyLCBidWZmZXJfZW5kKTsKKworICAgIC8vIE1peCB0aGlzIGNodW5rIGludG8gdGhlIGN1cnJlbnQgc3RhdGUuCisgICAgc3RhdGUubWl4KGJ1ZmZlcik7CisgICAgbGVuZ3RoICs9IGJ1ZmZlcl9wdHIgLSBidWZmZXI7CisgIH07CisKKyAgcmV0dXJuIHN0YXRlLmZpbmFsaXplKGxlbmd0aCk7Cit9CisKKy8vLyBcYnJpZWYgSW1wbGVtZW50IHRoZSBjb21iaW5pbmcgb2YgaW50ZWdyYWwgdmFsdWVzIGludG8gYSBoYXNoX2NvZGUuCisvLy8KKy8vLyBUaGlzIG92ZXJsb2FkIGlzIHNlbGVjdGVkIHdoZW4gdGhlIHZhbHVlIHR5cGUgb2YgdGhlIGl0ZXJhdG9yIGlzIGludGVncmFsCisvLy8gYW5kIHdoZW4gdGhlIGlucHV0IGl0ZXJhdG9yIGlzIGFjdHVhbGx5IGEgcG9pbnRlci4gUmF0aGVyIHRoYW4gY29tcHV0aW5nCisvLy8gYSBoYXNoX2NvZGUgZm9yIGVhY2ggb2JqZWN0IGFuZCB0aGVuIGNvbWJpbmluZyB0aGVtLCB0aGlzIChhcyBhbgorLy8vIG9wdGltaXphdGlvbikgZGlyZWN0bHkgY29tYmluZXMgdGhlIGludGVnZXJzLiBBbHNvLCBiZWNhdXNlIHRoZSBpbnRlZ2VycworLy8vIGFyZSBzdG9yZWQgaW4gY29udGlndW91cyBtZW1vcnksIHRoaXMgcm91dGluZSBhdm9pZHMgY29weWluZyBlYWNoIHZhbHVlCisvLy8gYW5kIGRpcmVjdGx5IHJlYWRzIGZyb20gdGhlIHVuZGVybHlpbmcgbWVtb3J5LgordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVD4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGlzX2hhc2hhYmxlX2RhdGE8VmFsdWVUPjo6dmFsdWUsIGhhc2hfY29kZT46OnR5cGUKK2hhc2hfY29tYmluZV9yYW5nZV9pbXBsKFZhbHVlVCAqZmlyc3QsIFZhbHVlVCAqbGFzdCkgeworICBjb25zdCBzaXplX3Qgc2VlZCA9IGdldF9leGVjdXRpb25fc2VlZCgpOworICBjb25zdCBjaGFyICpzX2JlZ2luID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KGZpcnN0KTsKKyAgY29uc3QgY2hhciAqc19lbmQgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4obGFzdCk7CisgIGNvbnN0IHNpemVfdCBsZW5ndGggPSBzdGQ6OmRpc3RhbmNlKHNfYmVnaW4sIHNfZW5kKTsKKyAgaWYgKGxlbmd0aCA8PSA2NCkKKyAgICByZXR1cm4gaGFzaF9zaG9ydChzX2JlZ2luLCBsZW5ndGgsIHNlZWQpOworCisgIGNvbnN0IGNoYXIgKnNfYWxpZ25lZF9lbmQgPSBzX2JlZ2luICsgKGxlbmd0aCAmIH42Myk7CisgIGhhc2hfc3RhdGUgc3RhdGUgPSBzdGF0ZS5jcmVhdGUoc19iZWdpbiwgc2VlZCk7CisgIHNfYmVnaW4gKz0gNjQ7CisgIHdoaWxlIChzX2JlZ2luICE9IHNfYWxpZ25lZF9lbmQpIHsKKyAgICBzdGF0ZS5taXgoc19iZWdpbik7CisgICAgc19iZWdpbiArPSA2NDsKKyAgfQorICBpZiAobGVuZ3RoICYgNjMpCisgICAgc3RhdGUubWl4KHNfZW5kIC0gNjQpOworCisgIHJldHVybiBzdGF0ZS5maW5hbGl6ZShsZW5ndGgpOworfQorCit9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIGhhc2hpbmcKKworCisvLy8gXGJyaWVmIENvbXB1dGUgYSBoYXNoX2NvZGUgZm9yIGEgc2VxdWVuY2Ugb2YgdmFsdWVzLgorLy8vCisvLy8gVGhpcyBoYXNoZXMgYSBzZXF1ZW5jZSBvZiB2YWx1ZXMuIEl0IHByb2R1Y2VzIHRoZSBzYW1lIGhhc2hfY29kZSBhcworLy8vICdoYXNoX2NvbWJpbmUoYSwgYiwgYywgLi4uKScsIGJ1dCBjYW4gcnVuIG92ZXIgYXJiaXRyYXJ5IHNpemVkIHNlcXVlbmNlcworLy8vIGFuZCBpcyBzaWduaWZpY2FudGx5IGZhc3RlciBnaXZlbiBwb2ludGVycyBhbmQgdHlwZXMgd2hpY2ggY2FuIGJlIGhhc2hlZCBhcworLy8vIGEgc2VxdWVuY2Ugb2YgYnl0ZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRJdGVyYXRvclQ+CitoYXNoX2NvZGUgaGFzaF9jb21iaW5lX3JhbmdlKElucHV0SXRlcmF0b3JUIGZpcnN0LCBJbnB1dEl0ZXJhdG9yVCBsYXN0KSB7CisgIHJldHVybiA6Omxsdm06Omhhc2hpbmc6OmRldGFpbDo6aGFzaF9jb21iaW5lX3JhbmdlX2ltcGwoZmlyc3QsIGxhc3QpOworfQorCisKKy8vIEltcGxlbWVudGF0aW9uIGRldGFpbHMgZm9yIGhhc2hfY29tYmluZS4KK25hbWVzcGFjZSBoYXNoaW5nIHsKK25hbWVzcGFjZSBkZXRhaWwgeworCisvLy8gXGJyaWVmIEhlbHBlciBjbGFzcyB0byBtYW5hZ2UgdGhlIHJlY3Vyc2l2ZSBjb21iaW5pbmcgb2YgaGFzaF9jb21iaW5lCisvLy8gYXJndW1lbnRzLgorLy8vCisvLy8gVGhpcyBjbGFzcyBleGlzdHMgdG8gbWFuYWdlIHRoZSBzdGF0ZSBhbmQgdmFyaW91cyBjYWxscyBpbnZvbHZlZCBpbiB0aGUKKy8vLyByZWN1cnNpdmUgY29tYmluaW5nIG9mIGFyZ3VtZW50cyB1c2VkIGluIGhhc2hfY29tYmluZS4gSXQgaXMgcGFydGljdWxhcmx5CisvLy8gdXNlZnVsIGF0IG1pbmltaXppbmcgdGhlIGNvZGUgaW4gdGhlIHJlY3Vyc2l2ZSBjYWxscyB0byBlYXNlIHRoZSBwYWluCisvLy8gY2F1c2VkIGJ5IGEgbGFjayBvZiB2YXJpYWRpYyBmdW5jdGlvbnMuCitzdHJ1Y3QgaGFzaF9jb21iaW5lX3JlY3Vyc2l2ZV9oZWxwZXIgeworICBjaGFyIGJ1ZmZlcls2NF07CisgIGhhc2hfc3RhdGUgc3RhdGU7CisgIGNvbnN0IHNpemVfdCBzZWVkOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgcmVjdXJzaXZlIGhhc2ggY29tYmluaW5nIGhlbHBlci4KKyAgLy8vCisgIC8vLyBUaGlzIHNldHMgdXAgdGhlIHN0YXRlIGZvciBhIHJlY3Vyc2l2ZSBoYXNoIGNvbWJpbmUsIGluY2x1ZGluZyBnZXR0aW5nCisgIC8vLyB0aGUgc2VlZCBhbmQgYnVmZmVyIHNldHVwLgorICBoYXNoX2NvbWJpbmVfcmVjdXJzaXZlX2hlbHBlcigpCisgICAgOiBzZWVkKGdldF9leGVjdXRpb25fc2VlZCgpKSB7fQorCisgIC8vLyBcYnJpZWYgQ29tYmluZSBvbmUgY2h1bmsgb2YgZGF0YSBpbnRvIHRoZSBjdXJyZW50IGluLWZsaWdodCBoYXNoLgorICAvLy8KKyAgLy8vIFRoaXMgbWVyZ2VzIG9uZSBjaHVuayBvZiBkYXRhIGludG8gdGhlIGhhc2guIEZpcnN0IGl0IHRyaWVzIHRvIGJ1ZmZlcgorICAvLy8gdGhlIGRhdGEuIElmIHRoZSBidWZmZXIgaXMgZnVsbCwgaXQgaGFzaGVzIHRoZSBidWZmZXIgaW50byBpdHMKKyAgLy8vIGhhc2hfc3RhdGUsIGVtcHRpZXMgaXQsIGFuZCB0aGVuIG1lcmdlcyB0aGUgbmV3IGNodW5rIGluLiBUaGlzIGFsc28KKyAgLy8vIGhhbmRsZXMgY2FzZXMgd2hlcmUgdGhlIGRhdGEgc3RyYWRkbGVzIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGNoYXIgKmNvbWJpbmVfZGF0YShzaXplX3QgJmxlbmd0aCwgY2hhciAqYnVmZmVyX3B0ciwgY2hhciAqYnVmZmVyX2VuZCwgVCBkYXRhKSB7CisgICAgaWYgKCFzdG9yZV9hbmRfYWR2YW5jZShidWZmZXJfcHRyLCBidWZmZXJfZW5kLCBkYXRhKSkgeworICAgICAgLy8gQ2hlY2sgZm9yIHNrZXcgd2hpY2ggcHJldmVudHMgdGhlIGJ1ZmZlciBmcm9tIGJlaW5nIHBhY2tlZCwgYW5kIGRvCisgICAgICAvLyBhIHBhcnRpYWwgc3RvcmUgaW50byB0aGUgYnVmZmVyIHRvIGZpbGwgaXQuIFRoaXMgaXMgb25seSBhIGNvbmNlcm4KKyAgICAgIC8vIHdpdGggdGhlIHZhcmlhZGljIGNvbWJpbmUgYmVjYXVzZSB0aGF0IGZvcm1hdGlvbiBjYW4gaGF2ZSB2YXJ5aW5nCisgICAgICAvLyBhcmd1bWVudCB0eXBlcy4KKyAgICAgIHNpemVfdCBwYXJ0aWFsX3N0b3JlX3NpemUgPSBidWZmZXJfZW5kIC0gYnVmZmVyX3B0cjsKKyAgICAgIG1lbWNweShidWZmZXJfcHRyLCAmZGF0YSwgcGFydGlhbF9zdG9yZV9zaXplKTsKKworICAgICAgLy8gSWYgdGhlIHN0b3JlIGZhaWxzLCBvdXIgYnVmZmVyIGlzIGZ1bGwgYW5kIHJlYWR5IHRvIGhhc2guIFdlIGhhdmUgdG8KKyAgICAgIC8vIGVpdGhlciBpbml0aWFsaXplIHRoZSBoYXNoIHN0YXRlIChvbiB0aGUgZmlyc3QgZnVsbCBidWZmZXIpIG9yIG1peAorICAgICAgLy8gdGhpcyBidWZmZXIgaW50byB0aGUgZXhpc3RpbmcgaGFzaCBzdGF0ZS4gTGVuZ3RoIHRyYWNrcyB0aGUgKmhhc2hlZCoKKyAgICAgIC8vIGxlbmd0aCwgbm90IHRoZSBidWZmZXJlZCBsZW5ndGguCisgICAgICBpZiAobGVuZ3RoID09IDApIHsKKyAgICAgICAgc3RhdGUgPSBzdGF0ZS5jcmVhdGUoYnVmZmVyLCBzZWVkKTsKKyAgICAgICAgbGVuZ3RoID0gNjQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBNaXggdGhpcyBjaHVuayBpbnRvIHRoZSBjdXJyZW50IHN0YXRlIGFuZCBidW1wIGxlbmd0aCB1cCBieSA2NC4KKyAgICAgICAgc3RhdGUubWl4KGJ1ZmZlcik7CisgICAgICAgIGxlbmd0aCArPSA2NDsKKyAgICAgIH0KKyAgICAgIC8vIFJlc2V0IHRoZSBidWZmZXJfcHRyIHRvIHRoZSBoZWFkIG9mIHRoZSBidWZmZXIgZm9yIHRoZSBuZXh0IGNodW5rIG9mCisgICAgICAvLyBkYXRhLgorICAgICAgYnVmZmVyX3B0ciA9IGJ1ZmZlcjsKKworICAgICAgLy8gVHJ5IGFnYWluIHRvIHN0b3JlIGludG8gdGhlIGJ1ZmZlciAtLSB0aGlzIGNhbm5vdCBmYWlsIGFzIHdlIG9ubHkKKyAgICAgIC8vIHN0b3JlIHR5cGVzIHNtYWxsZXIgdGhhbiB0aGUgYnVmZmVyLgorICAgICAgaWYgKCFzdG9yZV9hbmRfYWR2YW5jZShidWZmZXJfcHRyLCBidWZmZXJfZW5kLCBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJ0aWFsX3N0b3JlX3NpemUpKQorICAgICAgICBhYm9ydCgpOworICAgIH0KKyAgICByZXR1cm4gYnVmZmVyX3B0cjsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVjdXJzaXZlLCB2YXJpYWRpYyBjb21iaW5pbmcgbWV0aG9kLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gcmVjdXJzZXMgdGhyb3VnaCBlYWNoIGFyZ3VtZW50LCBjb21iaW5pbmcgdGhhdCBhcmd1bWVudAorICAvLy8gaW50byBhIHNpbmdsZSBoYXNoLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgLi4uVHM+CisgIGhhc2hfY29kZSBjb21iaW5lKHNpemVfdCBsZW5ndGgsIGNoYXIgKmJ1ZmZlcl9wdHIsIGNoYXIgKmJ1ZmZlcl9lbmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQgJmFyZywgY29uc3QgVHMgJi4uLmFyZ3MpIHsKKyAgICBidWZmZXJfcHRyID0gY29tYmluZV9kYXRhKGxlbmd0aCwgYnVmZmVyX3B0ciwgYnVmZmVyX2VuZCwgZ2V0X2hhc2hhYmxlX2RhdGEoYXJnKSk7CisKKyAgICAvLyBSZWN1cnNlIHRvIHRoZSBuZXh0IGFyZ3VtZW50LgorICAgIHJldHVybiBjb21iaW5lKGxlbmd0aCwgYnVmZmVyX3B0ciwgYnVmZmVyX2VuZCwgYXJncy4uLik7CisgIH0KKworICAvLy8gXGJyaWVmIEJhc2UgY2FzZSBmb3IgcmVjdXJzaXZlLCB2YXJpYWRpYyBjb21iaW5pbmcuCisgIC8vLworICAvLy8gVGhlIGJhc2UgY2FzZSB3aGVuIGNvbWJpbmluZyBhcmd1bWVudHMgcmVjdXJzaXZlbHkgaXMgcmVhY2hlZCB3aGVuIGFsbAorICAvLy8gYXJndW1lbnRzIGhhdmUgYmVlbiBoYW5kbGVkLiBJdCBmbHVzaGVzIHRoZSByZW1haW5pbmcgYnVmZmVyIGFuZAorICAvLy8gY29uc3RydWN0cyBhIGhhc2hfY29kZS4KKyAgaGFzaF9jb2RlIGNvbWJpbmUoc2l6ZV90IGxlbmd0aCwgY2hhciAqYnVmZmVyX3B0ciwgY2hhciAqYnVmZmVyX2VuZCkgeworICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGVudGlyZSBzZXQgb2YgdmFsdWVzIGZpdCBpbiB0aGUgYnVmZmVyLiBJZiBzbywgd2UnbGwKKyAgICAvLyB1c2UgdGhlIG9wdGltaXplZCBzaG9ydCBoYXNoaW5nIHJvdXRpbmUgYW5kIHNraXAgc3RhdGUgZW50aXJlbHkuCisgICAgaWYgKGxlbmd0aCA9PSAwKQorICAgICAgcmV0dXJuIGhhc2hfc2hvcnQoYnVmZmVyLCBidWZmZXJfcHRyIC0gYnVmZmVyLCBzZWVkKTsKKworICAgIC8vIE1peCB0aGUgZmluYWwgYnVmZmVyLCByb3RhdGluZyBpdCBpZiB3ZSBkaWQgYSBwYXJ0aWFsIGZpbGwgaW4gb3JkZXIgdG8KKyAgICAvLyBzaW11bGF0ZSBkb2luZyBhIG1peCBvZiB0aGUgbGFzdCA2NC1ieXRlcy4gVGhhdCBpcyBob3cgdGhlIGFsZ29yaXRobQorICAgIC8vIHdvcmtzIHdoZW4gd2UgaGF2ZSBhIGNvbnRpZ3VvdXMgYnl0ZSBzZXF1ZW5jZSwgYW5kIHdlIHdhbnQgdG8gZW11bGF0ZQorICAgIC8vIHRoYXQgaGVyZS4KKyAgICBzdGQ6OnJvdGF0ZShidWZmZXIsIGJ1ZmZlcl9wdHIsIGJ1ZmZlcl9lbmQpOworCisgICAgLy8gTWl4IHRoaXMgY2h1bmsgaW50byB0aGUgY3VycmVudCBzdGF0ZS4KKyAgICBzdGF0ZS5taXgoYnVmZmVyKTsKKyAgICBsZW5ndGggKz0gYnVmZmVyX3B0ciAtIGJ1ZmZlcjsKKworICAgIHJldHVybiBzdGF0ZS5maW5hbGl6ZShsZW5ndGgpOworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBkZXRhaWwKK30gLy8gbmFtZXNwYWNlIGhhc2hpbmcKKworLy8vIFxicmllZiBDb21iaW5lIHZhbHVlcyBpbnRvIGEgc2luZ2xlIGhhc2hfY29kZS4KKy8vLworLy8vIFRoaXMgcm91dGluZSBhY2NlcHRzIGEgdmFyeWluZyBudW1iZXIgb2YgYXJndW1lbnRzIG9mIGFueSB0eXBlLiBJdCB3aWxsCisvLy8gYXR0ZW1wdCB0byBjb21iaW5lIHRoZW0gaW50byBhIHNpbmdsZSBoYXNoX2NvZGUuIEZvciB1c2VyLWRlZmluZWQgdHlwZXMgaXQKKy8vLyBhdHRlbXB0cyB0byBjYWxsIGEgXHNlZSBoYXNoX3ZhbHVlIG92ZXJsb2FkICh2aWEgQURMKSBmb3IgdGhlIHR5cGUuIEZvcgorLy8vIGludGVnZXIgYW5kIHBvaW50ZXIgdHlwZXMgaXQgZGlyZWN0bHkgY29tYmluZXMgdGhlaXIgZGF0YSBpbnRvIHRoZQorLy8vIHJlc3VsdGluZyBoYXNoX2NvZGUuCisvLy8KKy8vLyBUaGUgcmVzdWx0IGlzIHN1aXRhYmxlIGZvciByZXR1cm5pbmcgZnJvbSBhIHVzZXIncyBoYXNoX3ZhbHVlCisvLy8gKmltcGxlbWVudGF0aW9uKiBmb3IgdGhlaXIgdXNlci1kZWZpbmVkIHR5cGUuIENvbnN1bWVycyBvZiBhIHR5cGUgc2hvdWxkCisvLy8gKm5vdCogY2FsbCB0aGlzIHJvdXRpbmUsIHRoZXkgc2hvdWxkIGluc3RlYWQgY2FsbCAnaGFzaF92YWx1ZScuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgLi4uVHM+IGhhc2hfY29kZSBoYXNoX2NvbWJpbmUoY29uc3QgVHMgJi4uLmFyZ3MpIHsKKyAgLy8gUmVjdXJzaXZlbHkgaGFzaCBlYWNoIGFyZ3VtZW50IHVzaW5nIGEgaGVscGVyIGNsYXNzLgorICA6Omxsdm06Omhhc2hpbmc6OmRldGFpbDo6aGFzaF9jb21iaW5lX3JlY3Vyc2l2ZV9oZWxwZXIgaGVscGVyOworICByZXR1cm4gaGVscGVyLmNvbWJpbmUoMCwgaGVscGVyLmJ1ZmZlciwgaGVscGVyLmJ1ZmZlciArIDY0LCBhcmdzLi4uKTsKK30KKworLy8gSW1wbGVtZW50YXRpb24gZGV0YWlscyBmb3IgaW1wbGVtZW50YXRpb25zIG9mIGhhc2hfdmFsdWUgb3ZlcmxvYWRzIHByb3ZpZGVkCisvLyBoZXJlLgorbmFtZXNwYWNlIGhhc2hpbmcgeworbmFtZXNwYWNlIGRldGFpbCB7CisKKy8vLyBcYnJpZWYgSGVscGVyIHRvIGhhc2ggdGhlIHZhbHVlIG9mIGEgc2luZ2xlIGludGVnZXIuCisvLy8KKy8vLyBPdmVybG9hZHMgZm9yIHNtYWxsZXIgaW50ZWdlciB0eXBlcyBhcmUgbm90IHByb3ZpZGVkIHRvIGVuc3VyZSBjb25zaXN0ZW50CisvLy8gYmVoYXZpb3IgaW4gdGhlIHByZXNlbmNlIG9mIGludGVncmFsIHByb21vdGlvbnMuIEVzc2VudGlhbGx5LAorLy8vICJoYXNoX3ZhbHVlKCc0JykiIGFuZCAiaGFzaF92YWx1ZSgnMCcgKyA0KSIgc2hvdWxkIGJlIHRoZSBzYW1lLgoraW5saW5lIGhhc2hfY29kZSBoYXNoX2ludGVnZXJfdmFsdWUodWludDY0X3QgdmFsdWUpIHsKKyAgLy8gU2ltaWxhciB0byBoYXNoXzR0bzhfYnl0ZXMgYnV0IHVzaW5nIGEgc2VlZCBpbnN0ZWFkIG9mIGxlbmd0aC4KKyAgY29uc3QgdWludDY0X3Qgc2VlZCA9IGdldF9leGVjdXRpb25fc2VlZCgpOworICBjb25zdCBjaGFyICpzID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZ2YWx1ZSk7CisgIGNvbnN0IHVpbnQ2NF90IGEgPSBmZXRjaDMyKHMpOworICByZXR1cm4gaGFzaF8xNl9ieXRlcyhzZWVkICsgKGEgPDwgMyksIGZldGNoMzIocyArIDQpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBoYXNoaW5nCisKKy8vIERlY2xhcmVkIGFuZCBkb2N1bWVudGVkIGFib3ZlLCBidXQgZGVmaW5lZCBoZXJlIHNvIHRoYXQgYW55IG9mIHRoZSBoYXNoaW5nCisvLyBpbmZyYXN0cnVjdHVyZSBpcyBhdmFpbGFibGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGlzX2ludGVncmFsX29yX2VudW08VD46OnZhbHVlLCBoYXNoX2NvZGU+Ojp0eXBlCitoYXNoX3ZhbHVlKFQgdmFsdWUpIHsKKyAgcmV0dXJuIDo6bGx2bTo6aGFzaGluZzo6ZGV0YWlsOjpoYXNoX2ludGVnZXJfdmFsdWUoCisgICAgICBzdGF0aWNfY2FzdDx1aW50NjRfdD4odmFsdWUpKTsKK30KKworLy8gRGVjbGFyZWQgYW5kIGRvY3VtZW50ZWQgYWJvdmUsIGJ1dCBkZWZpbmVkIGhlcmUgc28gdGhhdCBhbnkgb2YgdGhlIGhhc2hpbmcKKy8vIGluZnJhc3RydWN0dXJlIGlzIGF2YWlsYWJsZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBoYXNoX2NvZGUgaGFzaF92YWx1ZShjb25zdCBUICpwdHIpIHsKKyAgcmV0dXJuIDo6bGx2bTo6aGFzaGluZzo6ZGV0YWlsOjpoYXNoX2ludGVnZXJfdmFsdWUoCisgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHB0cikpOworfQorCisvLyBEZWNsYXJlZCBhbmQgZG9jdW1lbnRlZCBhYm92ZSwgYnV0IGRlZmluZWQgaGVyZSBzbyB0aGF0IGFueSBvZiB0aGUgaGFzaGluZworLy8gaW5mcmFzdHJ1Y3R1cmUgaXMgYXZhaWxhYmxlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitoYXNoX2NvZGUgaGFzaF92YWx1ZShjb25zdCBzdGQ6OnBhaXI8VCwgVT4gJmFyZykgeworICByZXR1cm4gaGFzaF9jb21iaW5lKGFyZy5maXJzdCwgYXJnLnNlY29uZCk7Cit9CisKKy8vIERlY2xhcmVkIGFuZCBkb2N1bWVudGVkIGFib3ZlLCBidXQgZGVmaW5lZCBoZXJlIHNvIHRoYXQgYW55IG9mIHRoZSBoYXNoaW5nCisvLyBpbmZyYXN0cnVjdHVyZSBpcyBhdmFpbGFibGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2hhc2hfY29kZSBoYXNoX3ZhbHVlKGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPFQ+ICZhcmcpIHsKKyAgcmV0dXJuIGhhc2hfY29tYmluZV9yYW5nZShhcmcuYmVnaW4oKSwgYXJnLmVuZCgpKTsKK30KKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0ltbXV0YWJsZUxpc3QuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0ltbXV0YWJsZUxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGQ2M2UwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvSW1tdXRhYmxlTGlzdC5oCkBAIC0wLDAgKzEsMjM1IEBACisvLz09LS0tIEltbXV0YWJsZUxpc3QuaCAtIEltbXV0YWJsZSAoZnVuY3Rpb25hbCkgbGlzdCBpbnRlcmZhY2UgLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBJbW11dGFibGVMaXN0IGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfSU1NVVRBQkxFTElTVF9ICisjZGVmaW5lIExMVk1fQURUX0lNTVVUQUJMRUxJU1RfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bmV3PgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBJbW11dGFibGVMaXN0RmFjdG9yeTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBJbW11dGFibGVMaXN0SW1wbCA6IHB1YmxpYyBGb2xkaW5nU2V0Tm9kZSB7CisgIGZyaWVuZCBjbGFzcyBJbW11dGFibGVMaXN0RmFjdG9yeTxUPjsKKworICBUIEhlYWQ7CisgIGNvbnN0IEltbXV0YWJsZUxpc3RJbXBsKiBUYWlsOworCisgIEltbXV0YWJsZUxpc3RJbXBsKGNvbnN0IFQmIGhlYWQsIGNvbnN0IEltbXV0YWJsZUxpc3RJbXBsKiB0YWlsID0gbnVsbHB0cikKKyAgICA6IEhlYWQoaGVhZCksIFRhaWwodGFpbCkge30KKworcHVibGljOgorICBJbW11dGFibGVMaXN0SW1wbChjb25zdCBJbW11dGFibGVMaXN0SW1wbCAmKSA9IGRlbGV0ZTsKKyAgSW1tdXRhYmxlTGlzdEltcGwgJm9wZXJhdG9yPShjb25zdCBJbW11dGFibGVMaXN0SW1wbCAmKSA9IGRlbGV0ZTsKKworICBjb25zdCBUJiBnZXRIZWFkKCkgY29uc3QgeyByZXR1cm4gSGVhZDsgfQorICBjb25zdCBJbW11dGFibGVMaXN0SW1wbCogZ2V0VGFpbCgpIGNvbnN0IHsgcmV0dXJuIFRhaWw7IH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEJiBJRCwgY29uc3QgVCYgSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW1tdXRhYmxlTGlzdEltcGwqIEwpeworICAgIElELkFkZFBvaW50ZXIoTCk7CisgICAgSUQuQWRkKEgpOworICB9CisKKyAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQmIElEKSB7CisgICAgUHJvZmlsZShJRCwgSGVhZCwgVGFpbCk7CisgIH0KK307CisKKy8vLyBJbW11dGFibGVMaXN0IC0gVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIGltbXV0YWJsZSAoZnVuY3Rpb25hbCkgbGlzdC4KKy8vLyAgSXQgaXMgaW1wbGVtZW50ZWQgYXMgYSBzbWFydCBwb2ludGVyICh3cmFwcyBJbW11dGFibGVMaXN0SW1wbCksIHNvIGl0CisvLy8gIGl0IGlzIGludGVuZGVkIHRvIGFsd2F5cyBiZSBjb3BpZWQgYnkgdmFsdWUgYXMgaWYgaXQgd2VyZSBhIHBvaW50ZXIuCisvLy8gIFRoaXMgaW50ZXJmYWNlIG1hdGNoZXMgSW1tdXRhYmxlU2V0IGFuZCBJbW11dGFibGVNYXAuICBJbW11dGFibGVMaXN0CisvLy8gIG9iamVjdHMgc2hvdWxkIGFsbW9zdCBuZXZlciBiZSBjcmVhdGVkIGRpcmVjdGx5LCBhbmQgaW5zdGVhZCBzaG91bGQKKy8vLyAgYmUgY3JlYXRlZCBieSBJbW11dGFibGVMaXN0RmFjdG9yeSBvYmplY3RzIHRoYXQgbWFuYWdlIHRoZSBsaWZldGltZQorLy8vICBvZiBhIGdyb3VwIG9mIGxpc3RzLiAgV2hlbiB0aGUgZmFjdG9yeSBvYmplY3QgaXMgcmVjbGFpbWVkLCBhbGwgbGlzdHMKKy8vLyAgY3JlYXRlZCBieSB0aGF0IGZhY3RvcnkgYXJlIHJlbGVhc2VkIGFzIHdlbGwuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEltbXV0YWJsZUxpc3QgeworcHVibGljOgorICB1c2luZyB2YWx1ZV90eXBlID0gVDsKKyAgdXNpbmcgRmFjdG9yeSA9IEltbXV0YWJsZUxpc3RGYWN0b3J5PFQ+OworCitwcml2YXRlOgorICBjb25zdCBJbW11dGFibGVMaXN0SW1wbDxUPiogWDsKKworcHVibGljOgorICAvLyBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBub3JtYWxseSBvbmx5IGJlIGNhbGxlZCBieSBJbW11dGFibGVMaXN0RmFjdG9yeTxUPi4KKyAgLy8gVGhlcmUgbWF5IGJlIGNhc2VzLCBob3dldmVyLCB3aGVuIG9uZSBuZWVkcyB0byBleHRyYWN0IHRoZSBpbnRlcm5hbCBwb2ludGVyCisgIC8vIGFuZCByZWNvbnN0cnVjdCBhIGxpc3Qgb2JqZWN0IGZyb20gdGhhdCBwb2ludGVyLgorICBJbW11dGFibGVMaXN0KGNvbnN0IEltbXV0YWJsZUxpc3RJbXBsPFQ+KiB4ID0gbnVsbHB0cikgOiBYKHgpIHt9CisKKyAgY29uc3QgSW1tdXRhYmxlTGlzdEltcGw8VD4qIGdldEludGVybmFsUG9pbnRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gWDsKKyAgfQorCisgIGNsYXNzIGl0ZXJhdG9yIHsKKyAgICBjb25zdCBJbW11dGFibGVMaXN0SW1wbDxUPiogTCA9IG51bGxwdHI7CisKKyAgcHVibGljOgorICAgIGl0ZXJhdG9yKCkgPSBkZWZhdWx0OworICAgIGl0ZXJhdG9yKEltbXV0YWJsZUxpc3QgbCkgOiBMKGwuZ2V0SW50ZXJuYWxQb2ludGVyKCkpIHt9CisKKyAgICBpdGVyYXRvciYgb3BlcmF0b3IrKygpIHsgTCA9IEwtPmdldFRhaWwoKTsgcmV0dXJuICp0aGlzOyB9CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBJKSBjb25zdCB7IHJldHVybiBMID09IEkuTDsgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgSSkgY29uc3QgeyByZXR1cm4gTCAhPSBJLkw7IH0KKyAgICBjb25zdCB2YWx1ZV90eXBlJiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBMLT5nZXRIZWFkKCk7IH0KKworICAgIEltbXV0YWJsZUxpc3QgZ2V0TGlzdCgpIGNvbnN0IHsgcmV0dXJuIEw7IH0KKyAgfTsKKworICAvLy8gYmVnaW4gLSBSZXR1cm5zIGFuIGl0ZXJhdG9yIHJlZmVycmluZyB0byB0aGUgaGVhZCBvZiB0aGUgbGlzdCwgb3IKKyAgLy8vICBhbiBpdGVyYXRvciBkZW5vdGluZyB0aGUgZW5kIG9mIHRoZSBsaXN0IGlmIHRoZSBsaXN0IGlzIGVtcHR5LgorICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKFgpOyB9CisKKyAgLy8vIGVuZCAtIFJldHVybnMgYW4gaXRlcmF0b3IgZGVub3RpbmcgdGhlIGVuZCBvZiB0aGUgbGlzdC4gIFRoaXMgaXRlcmF0b3IKKyAgLy8vICBkb2VzIG5vdCByZWZlciB0byBhIHZhbGlkIGxpc3QgZWxlbWVudC4KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoKTsgfQorCisgIC8vLyBpc0VtcHR5IC0gUmV0dXJucyB0cnVlIGlmIHRoZSBsaXN0IGlzIGVtcHR5LgorICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiAhWDsgfQorCisgIGJvb2wgY29udGFpbnMoY29uc3QgVCYgVikgY29uc3QgeworICAgIGZvciAoaXRlcmF0b3IgSSA9IGJlZ2luKCksIEUgPSBlbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIGlmICgqSSA9PSBWKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIGlzRXF1YWwgLSBSZXR1cm5zIHRydWUgaWYgdHdvIGxpc3RzIGFyZSBlcXVhbC4gIEJlY2F1c2UgYWxsIGxpc3RzIGNyZWF0ZWQKKyAgLy8vICBmcm9tIHRoZSBzYW1lIEltbXV0YWJsZUxpc3RGYWN0b3J5IGFyZSB1bmlxdWVkLCB0aGlzIGhhcyBPKDEpIGNvbXBsZXhpdHkKKyAgLy8vICBiZWNhdXNlIGl0IHRoZSBjb250ZW50cyBvZiB0aGUgbGlzdCBkbyBub3QgbmVlZCB0byBiZSBjb21wYXJlZC4gIE5vdGUKKyAgLy8vICB0aGF0IHlvdSBzaG91bGQgb25seSBjb21wYXJlIHR3byBsaXN0cyBjcmVhdGVkIGZyb20gdGhlIHNhbWUKKyAgLy8vICBJbW11dGFibGVMaXN0RmFjdG9yeS4KKyAgYm9vbCBpc0VxdWFsKGNvbnN0IEltbXV0YWJsZUxpc3QmIEwpIGNvbnN0IHsgcmV0dXJuIFggPT0gTC5YOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEltbXV0YWJsZUxpc3QmIEwpIGNvbnN0IHsgcmV0dXJuIGlzRXF1YWwoTCk7IH0KKworICAvLy8gZ2V0SGVhZCAtIFJldHVybnMgdGhlIGhlYWQgb2YgdGhlIGxpc3QuCisgIGNvbnN0IFQmIGdldEhlYWQoKSB7CisgICAgYXNzZXJ0KCFpc0VtcHR5KCkgJiYgIkNhbm5vdCBnZXQgdGhlIGhlYWQgb2YgYW4gZW1wdHkgbGlzdC4iKTsKKyAgICByZXR1cm4gWC0+Z2V0SGVhZCgpOworICB9CisKKyAgLy8vIGdldFRhaWwgLSBSZXR1cm5zIHRoZSB0YWlsIG9mIHRoZSBsaXN0LCB3aGljaCBpcyBhbm90aGVyIChwb3NzaWJseSBlbXB0eSkKKyAgLy8vICBJbW11dGFibGVMaXN0LgorICBJbW11dGFibGVMaXN0IGdldFRhaWwoKSB7CisgICAgcmV0dXJuIFggPyBYLT5nZXRUYWlsKCkgOiBudWxscHRyOworICB9CisKKyAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQmIElEKSBjb25zdCB7CisgICAgSUQuQWRkUG9pbnRlcihYKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBJbW11dGFibGVMaXN0RmFjdG9yeSB7CisgIHVzaW5nIExpc3RUeSA9IEltbXV0YWJsZUxpc3RJbXBsPFQ+OworICB1c2luZyBDYWNoZVR5ID0gRm9sZGluZ1NldDxMaXN0VHk+OworCisgIENhY2hlVHkgQ2FjaGU7CisgIHVpbnRwdHJfdCBBbGxvY2F0b3I7CisKKyAgYm9vbCBvd25zQWxsb2NhdG9yKCkgY29uc3QgeworICAgIHJldHVybiAoQWxsb2NhdG9yICYgMHgxKSA9PSAwOworICB9CisKKyAgQnVtcFB0ckFsbG9jYXRvciYgZ2V0QWxsb2NhdG9yKCkgY29uc3QgeworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdW1wUHRyQWxsb2NhdG9yKj4oQWxsb2NhdG9yICYgfjB4MSk7CisgIH0KKworcHVibGljOgorICBJbW11dGFibGVMaXN0RmFjdG9yeSgpCisgICAgOiBBbGxvY2F0b3IocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KG5ldyBCdW1wUHRyQWxsb2NhdG9yKCkpKSB7fQorCisgIEltbXV0YWJsZUxpc3RGYWN0b3J5KEJ1bXBQdHJBbGxvY2F0b3ImIEFsbG9jKQorICA6IEFsbG9jYXRvcihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oJkFsbG9jKSB8IDB4MSkge30KKworICB+SW1tdXRhYmxlTGlzdEZhY3RvcnkoKSB7CisgICAgaWYgKG93bnNBbGxvY2F0b3IoKSkgZGVsZXRlICZnZXRBbGxvY2F0b3IoKTsKKyAgfQorCisgIEltbXV0YWJsZUxpc3Q8VD4gY29uY2F0KGNvbnN0IFQmIEhlYWQsIEltbXV0YWJsZUxpc3Q8VD4gVGFpbCkgeworICAgIC8vIFByb2ZpbGUgdGhlIG5ldyBsaXN0IHRvIHNlZSBpZiBpdCBhbHJlYWR5IGV4aXN0cyBpbiBvdXIgY2FjaGUuCisgICAgRm9sZGluZ1NldE5vZGVJRCBJRDsKKyAgICB2b2lkKiBJbnNlcnRQb3M7CisKKyAgICBjb25zdCBMaXN0VHkqIFRhaWxJbXBsID0gVGFpbC5nZXRJbnRlcm5hbFBvaW50ZXIoKTsKKyAgICBMaXN0VHk6OlByb2ZpbGUoSUQsIEhlYWQsIFRhaWxJbXBsKTsKKyAgICBMaXN0VHkqIEwgPSBDYWNoZS5GaW5kTm9kZU9ySW5zZXJ0UG9zKElELCBJbnNlcnRQb3MpOworCisgICAgaWYgKCFMKSB7CisgICAgICAvLyBUaGUgbGlzdCBkb2VzIG5vdCBleGlzdCBpbiBvdXIgY2FjaGUuICBDcmVhdGUgaXQuCisgICAgICBCdW1wUHRyQWxsb2NhdG9yJiBBID0gZ2V0QWxsb2NhdG9yKCk7CisgICAgICBMID0gKExpc3RUeSopIEEuQWxsb2NhdGU8TGlzdFR5PigpOworICAgICAgbmV3IChMKSBMaXN0VHkoSGVhZCwgVGFpbEltcGwpOworCisgICAgICAvLyBJbnNlcnQgdGhlIG5ldyBsaXN0IGludG8gdGhlIGNhY2hlLgorICAgICAgQ2FjaGUuSW5zZXJ0Tm9kZShMLCBJbnNlcnRQb3MpOworICAgIH0KKworICAgIHJldHVybiBMOworICB9CisKKyAgSW1tdXRhYmxlTGlzdDxUPiBhZGQoY29uc3QgVCYgRCwgSW1tdXRhYmxlTGlzdDxUPiBMKSB7CisgICAgcmV0dXJuIGNvbmNhdChELCBMKTsKKyAgfQorCisgIEltbXV0YWJsZUxpc3Q8VD4gZ2V0RW1wdHlMaXN0KCkgY29uc3QgeworICAgIHJldHVybiBJbW11dGFibGVMaXN0PFQ+KG51bGxwdHIpOworICB9CisKKyAgSW1tdXRhYmxlTGlzdDxUPiBjcmVhdGUoY29uc3QgVCYgWCkgeworICAgIHJldHVybiBDb25jYXQoWCwgZ2V0RW1wdHlMaXN0KCkpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUGFydGlhbGx5LXNwZWNpYWxpemVkIFRyYWl0cy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCBEZW5zZU1hcEluZm87Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPEltbXV0YWJsZUxpc3Q8VD4+IHsKKyAgc3RhdGljIGlubGluZSBJbW11dGFibGVMaXN0PFQ+IGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEltbXV0YWJsZUxpc3RJbXBsPFQ+Kj4oLTEpOworICB9CisKKyAgc3RhdGljIGlubGluZSBJbW11dGFibGVMaXN0PFQ+IGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxJbW11dGFibGVMaXN0SW1wbDxUPio+KC0yKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoSW1tdXRhYmxlTGlzdDxUPiBYKSB7CisgICAgdWludHB0cl90IFB0clZhbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihYLmdldEludGVybmFsUG9pbnRlcigpKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkKCh1aW50cHRyX3QpUHRyVmFsKSA+PiA0KSBeCisgICAgICAgICAgICh1bnNpZ25lZCgodWludHB0cl90KVB0clZhbCkgPj4gOSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKEltbXV0YWJsZUxpc3Q8VD4gWDEsIEltbXV0YWJsZUxpc3Q8VD4gWDIpIHsKKyAgICByZXR1cm4gWDEgPT0gWDI7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNQb2RMaWtlOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXNQb2RMaWtlPEltbXV0YWJsZUxpc3Q8VD4+IHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfSU1NVVRBQkxFTElTVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9JbW11dGFibGVNYXAuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0ltbXV0YWJsZU1hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZDFlMWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9JbW11dGFibGVNYXAuaApAQCAtMCwwICsxLDQxNCBAQAorLy89PT0tLS0gSW1tdXRhYmxlTWFwLmggLSBJbW11dGFibGUgKGZ1bmN0aW9uYWwpIG1hcCBpbnRlcmZhY2UgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgSW1tdXRhYmxlTWFwIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfSU1NVVRBQkxFTUFQX0gKKyNkZWZpbmUgTExWTV9BRFRfSU1NVVRBQkxFTUFQX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0ZvbGRpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9JbW11dGFibGVTZXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gSW11dEtleVZhbHVlSW5mbyAtVHJhaXRzIGNsYXNzIHVzZWQgYnkgSW1tdXRhYmxlTWFwLiAgV2hpbGUgYm90aCB0aGUgZmlyc3QKKy8vLyBhbmQgc2Vjb25kIGVsZW1lbnRzIGluIGEgcGFpciBhcmUgdXNlZCB0byBnZW5lcmF0ZSBwcm9maWxlIGluZm9ybWF0aW9uLAorLy8vIG9ubHkgdGhlIGZpcnN0IGVsZW1lbnQgKHRoZSBrZXkpIGlzIHVzZWQgYnkgaXNFcXVhbCBhbmQgaXNMZXNzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFM+CitzdHJ1Y3QgSW11dEtleVZhbHVlSW5mbyB7CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBjb25zdCBzdGQ6OnBhaXI8VCxTPjsKKyAgdXNpbmcgdmFsdWVfdHlwZV9yZWYgPSBjb25zdCB2YWx1ZV90eXBlJjsKKyAgdXNpbmcga2V5X3R5cGUgPSBjb25zdCBUOworICB1c2luZyBrZXlfdHlwZV9yZWYgPSBjb25zdCBUJjsKKyAgdXNpbmcgZGF0YV90eXBlID0gY29uc3QgUzsKKyAgdXNpbmcgZGF0YV90eXBlX3JlZiA9IGNvbnN0IFMmOworCisgIHN0YXRpYyBpbmxpbmUga2V5X3R5cGVfcmVmIEtleU9mVmFsdWUodmFsdWVfdHlwZV9yZWYgVikgeworICAgIHJldHVybiBWLmZpcnN0OworICB9CisKKyAgc3RhdGljIGlubGluZSBkYXRhX3R5cGVfcmVmIERhdGFPZlZhbHVlKHZhbHVlX3R5cGVfcmVmIFYpIHsKKyAgICByZXR1cm4gVi5zZWNvbmQ7CisgIH0KKworICBzdGF0aWMgaW5saW5lIGJvb2wgaXNFcXVhbChrZXlfdHlwZV9yZWYgTCwga2V5X3R5cGVfcmVmIFIpIHsKKyAgICByZXR1cm4gSW11dENvbnRhaW5lckluZm88VD46OmlzRXF1YWwoTCxSKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGJvb2wgaXNMZXNzKGtleV90eXBlX3JlZiBMLCBrZXlfdHlwZV9yZWYgUikgeworICAgIHJldHVybiBJbXV0Q29udGFpbmVySW5mbzxUPjo6aXNMZXNzKEwsUik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIGJvb2wgaXNEYXRhRXF1YWwoZGF0YV90eXBlX3JlZiBMLCBkYXRhX3R5cGVfcmVmIFIpIHsKKyAgICByZXR1cm4gSW11dENvbnRhaW5lckluZm88Uz46OmlzRXF1YWwoTCxSKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQmIElELCB2YWx1ZV90eXBlX3JlZiBWKSB7CisgICAgSW11dENvbnRhaW5lckluZm88VD46OlByb2ZpbGUoSUQsIFYuZmlyc3QpOworICAgIEltdXRDb250YWluZXJJbmZvPFM+OjpQcm9maWxlKElELCBWLnNlY29uZCk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULAorICAgICAgICAgIHR5cGVuYW1lIFZhbEluZm8gPSBJbXV0S2V5VmFsdWVJbmZvPEtleVQsVmFsVD4+CitjbGFzcyBJbW11dGFibGVNYXAgeworcHVibGljOgorICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgVmFsSW5mbzo6dmFsdWVfdHlwZTsKKyAgdXNpbmcgdmFsdWVfdHlwZV9yZWYgPSB0eXBlbmFtZSBWYWxJbmZvOjp2YWx1ZV90eXBlX3JlZjsKKyAgdXNpbmcga2V5X3R5cGUgPSB0eXBlbmFtZSBWYWxJbmZvOjprZXlfdHlwZTsKKyAgdXNpbmcga2V5X3R5cGVfcmVmID0gdHlwZW5hbWUgVmFsSW5mbzo6a2V5X3R5cGVfcmVmOworICB1c2luZyBkYXRhX3R5cGUgPSB0eXBlbmFtZSBWYWxJbmZvOjpkYXRhX3R5cGU7CisgIHVzaW5nIGRhdGFfdHlwZV9yZWYgPSB0eXBlbmFtZSBWYWxJbmZvOjpkYXRhX3R5cGVfcmVmOworICB1c2luZyBUcmVlVHkgPSBJbXV0QVZMVHJlZTxWYWxJbmZvPjsKKworcHJvdGVjdGVkOgorICBUcmVlVHkqIFJvb3Q7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdHMgYSBtYXAgZnJvbSBhIHBvaW50ZXIgdG8gYSB0cmVlIHJvb3QuICBJbiBnZW5lcmFsIG9uZQorICAvLy8gc2hvdWxkIHVzZSBhIEZhY3Rvcnkgb2JqZWN0IHRvIGNyZWF0ZSBtYXBzIGluc3RlYWQgb2YgZGlyZWN0bHkKKyAgLy8vIGludm9raW5nIHRoZSBjb25zdHJ1Y3RvciwgYnV0IHRoZXJlIGFyZSBjYXNlcyB3aGVyZSBtYWtlIHRoaXMKKyAgLy8vIGNvbnN0cnVjdG9yIHB1YmxpYyBpcyB1c2VmdWwuCisgIGV4cGxpY2l0IEltbXV0YWJsZU1hcChjb25zdCBUcmVlVHkqIFIpIDogUm9vdChjb25zdF9jYXN0PFRyZWVUeSo+KFIpKSB7CisgICAgaWYgKFJvb3QpIHsgUm9vdC0+cmV0YWluKCk7IH0KKyAgfQorCisgIEltbXV0YWJsZU1hcChjb25zdCBJbW11dGFibGVNYXAgJlgpIDogUm9vdChYLlJvb3QpIHsKKyAgICBpZiAoUm9vdCkgeyBSb290LT5yZXRhaW4oKTsgfQorICB9CisKKyAgfkltbXV0YWJsZU1hcCgpIHsKKyAgICBpZiAoUm9vdCkgeyBSb290LT5yZWxlYXNlKCk7IH0KKyAgfQorCisgIEltbXV0YWJsZU1hcCAmb3BlcmF0b3I9KGNvbnN0IEltbXV0YWJsZU1hcCAmWCkgeworICAgIGlmIChSb290ICE9IFguUm9vdCkgeworICAgICAgaWYgKFguUm9vdCkgeyBYLlJvb3QtPnJldGFpbigpOyB9CisgICAgICBpZiAoUm9vdCkgeyBSb290LT5yZWxlYXNlKCk7IH0KKyAgICAgIFJvb3QgPSBYLlJvb3Q7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNsYXNzIEZhY3RvcnkgeworICAgIHR5cGVuYW1lIFRyZWVUeTo6RmFjdG9yeSBGOworICAgIGNvbnN0IGJvb2wgQ2Fub25pY2FsaXplOworCisgIHB1YmxpYzoKKyAgICBGYWN0b3J5KGJvb2wgY2Fub25pY2FsaXplID0gdHJ1ZSkgOiBDYW5vbmljYWxpemUoY2Fub25pY2FsaXplKSB7fQorCisgICAgRmFjdG9yeShCdW1wUHRyQWxsb2NhdG9yICZBbGxvYywgYm9vbCBjYW5vbmljYWxpemUgPSB0cnVlKQorICAgICAgICA6IEYoQWxsb2MpLCBDYW5vbmljYWxpemUoY2Fub25pY2FsaXplKSB7fQorCisgICAgRmFjdG9yeShjb25zdCBGYWN0b3J5ICYpID0gZGVsZXRlOworICAgIEZhY3RvcnkgJm9wZXJhdG9yPShjb25zdCBGYWN0b3J5ICYpID0gZGVsZXRlOworCisgICAgSW1tdXRhYmxlTWFwIGdldEVtcHR5TWFwKCkgeyByZXR1cm4gSW1tdXRhYmxlTWFwKEYuZ2V0RW1wdHlUcmVlKCkpOyB9CisKKyAgICBJbW11dGFibGVNYXAgYWRkKEltbXV0YWJsZU1hcCBPbGQsIGtleV90eXBlX3JlZiBLLCBkYXRhX3R5cGVfcmVmIEQpIHsKKyAgICAgIFRyZWVUeSAqVCA9IEYuYWRkKE9sZC5Sb290LCBzdGQ6OnBhaXI8a2V5X3R5cGUsZGF0YV90eXBlPihLLEQpKTsKKyAgICAgIHJldHVybiBJbW11dGFibGVNYXAoQ2Fub25pY2FsaXplID8gRi5nZXRDYW5vbmljYWxUcmVlKFQpOiBUKTsKKyAgICB9CisKKyAgICBJbW11dGFibGVNYXAgcmVtb3ZlKEltbXV0YWJsZU1hcCBPbGQsIGtleV90eXBlX3JlZiBLKSB7CisgICAgICBUcmVlVHkgKlQgPSBGLnJlbW92ZShPbGQuUm9vdCxLKTsKKyAgICAgIHJldHVybiBJbW11dGFibGVNYXAoQ2Fub25pY2FsaXplID8gRi5nZXRDYW5vbmljYWxUcmVlKFQpOiBUKTsKKyAgICB9CisKKyAgICB0eXBlbmFtZSBUcmVlVHk6OkZhY3RvcnkgKmdldFRyZWVGYWN0b3J5KCkgY29uc3QgeworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8dHlwZW5hbWUgVHJlZVR5OjpGYWN0b3J5ICo+KCZGKTsKKyAgICB9CisgIH07CisKKyAgYm9vbCBjb250YWlucyhrZXlfdHlwZV9yZWYgSykgY29uc3QgeworICAgIHJldHVybiBSb290ID8gUm9vdC0+Y29udGFpbnMoSykgOiBmYWxzZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbW11dGFibGVNYXAgJlJIUykgY29uc3QgeworICAgIHJldHVybiBSb290ICYmIFJIUy5Sb290ID8gUm9vdC0+aXNFcXVhbCgqUkhTLlJvb3QpIDogUm9vdCA9PSBSSFMuUm9vdDsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJbW11dGFibGVNYXAgJlJIUykgY29uc3QgeworICAgIHJldHVybiBSb290ICYmIFJIUy5Sb290ID8gUm9vdC0+aXNOb3RFcXVhbCgqUkhTLlJvb3QpIDogUm9vdCAhPSBSSFMuUm9vdDsKKyAgfQorCisgIFRyZWVUeSAqZ2V0Um9vdCgpIGNvbnN0IHsKKyAgICBpZiAoUm9vdCkgeyBSb290LT5yZXRhaW4oKTsgfQorICAgIHJldHVybiBSb290OworICB9CisKKyAgVHJlZVR5ICpnZXRSb290V2l0aG91dFJldGFpbigpIGNvbnN0IHsgcmV0dXJuIFJvb3Q7IH0KKworICB2b2lkIG1hbnVhbFJldGFpbigpIHsKKyAgICBpZiAoUm9vdCkgUm9vdC0+cmV0YWluKCk7CisgIH0KKworICB2b2lkIG1hbnVhbFJlbGVhc2UoKSB7CisgICAgaWYgKFJvb3QpIFJvb3QtPnJlbGVhc2UoKTsKKyAgfQorCisgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICFSb290OyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEZvcmVhY2ggLSBBIGxpbWl0ZWQgZm9ybSBvZiBtYXAgaXRlcmF0aW9uLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENhbGxiYWNrPgorICBzdHJ1Y3QgQ0JXcmFwcGVyIHsKKyAgICBDYWxsYmFjayBDOworCisgICAgdm9pZCBvcGVyYXRvcigpKHZhbHVlX3R5cGVfcmVmIFYpIHsgQyhWLmZpcnN0LFYuc2Vjb25kKTsgfQorICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDYWxsYmFjaz4KKyAgc3RydWN0IENCV3JhcHBlclJlZiB7CisgICAgQ2FsbGJhY2sgJkM7CisKKyAgICBDQldyYXBwZXJSZWYoQ2FsbGJhY2smIGMpIDogQyhjKSB7fQorCisgICAgdm9pZCBvcGVyYXRvcigpKHZhbHVlX3R5cGVfcmVmIFYpIHsgQyhWLmZpcnN0LFYuc2Vjb25kKTsgfQorICB9OworCitwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDYWxsYmFjaz4KKyAgdm9pZCBmb3JlYWNoKENhbGxiYWNrJiBDKSB7CisgICAgaWYgKFJvb3QpIHsKKyAgICAgIENCV3JhcHBlclJlZjxDYWxsYmFjaz4gQ0IoQyk7CisgICAgICBSb290LT5mb3JlYWNoKENCKTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FsbGJhY2s+CisgIHZvaWQgZm9yZWFjaCgpIHsKKyAgICBpZiAoUm9vdCkgeworICAgICAgQ0JXcmFwcGVyPENhbGxiYWNrPiBDQjsKKyAgICAgIFJvb3QtPmZvcmVhY2goQ0IpOworICAgIH0KKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBGb3IgdGVzdGluZy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgdm9pZCB2ZXJpZnkoKSBjb25zdCB7IGlmIChSb290KSBSb290LT52ZXJpZnkoKTsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJdGVyYXRvcnMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIGNsYXNzIGl0ZXJhdG9yIDogcHVibGljIEltdXRBVkxWYWx1ZUl0ZXJhdG9yPEltbXV0YWJsZU1hcD4geworICAgIGZyaWVuZCBjbGFzcyBJbW11dGFibGVNYXA7CisKKyAgICBpdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgICBleHBsaWNpdCBpdGVyYXRvcihUcmVlVHkgKlRyZWUpIDogaXRlcmF0b3I6OkltdXRBVkxWYWx1ZUl0ZXJhdG9yKFRyZWUpIHt9CisKKyAgcHVibGljOgorICAgIGtleV90eXBlX3JlZiBnZXRLZXkoKSBjb25zdCB7IHJldHVybiAoKnRoaXMpLT5maXJzdDsgfQorICAgIGRhdGFfdHlwZV9yZWYgZ2V0RGF0YSgpIGNvbnN0IHsgcmV0dXJuICgqdGhpcyktPnNlY29uZDsgfQorICB9OworCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoUm9vdCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoKTsgfQorCisgIGRhdGFfdHlwZSogbG9va3VwKGtleV90eXBlX3JlZiBLKSBjb25zdCB7CisgICAgaWYgKFJvb3QpIHsKKyAgICAgIFRyZWVUeSogVCA9IFJvb3QtPmZpbmQoSyk7CisgICAgICBpZiAoVCkgcmV0dXJuICZULT5nZXRWYWx1ZSgpLnNlY29uZDsKKyAgICB9CisKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBnZXRNYXhFbGVtZW50IC0gUmV0dXJucyB0aGUgPGtleSx2YWx1ZT4gcGFpciBpbiB0aGUgSW1tdXRhYmxlTWFwIGZvcgorICAvLy8gIHdoaWNoIGtleSBpcyB0aGUgaGlnaGVzdCBpbiB0aGUgb3JkZXJpbmcgb2Yga2V5cyBpbiB0aGUgbWFwLiAgVGhpcworICAvLy8gIG1ldGhvZCByZXR1cm5zIE5VTEwgaWYgdGhlIG1hcCBpcyBlbXB0eS4KKyAgdmFsdWVfdHlwZSogZ2V0TWF4RWxlbWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUm9vdCA/ICYoUm9vdC0+Z2V0TWF4RWxlbWVudCgpLT5nZXRWYWx1ZSgpKSA6IG51bGxwdHI7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gVXRpbGl0eSBtZXRob2RzLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICB1bnNpZ25lZCBnZXRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBSb290ID8gUm9vdC0+Z2V0SGVpZ2h0KCkgOiAwOyB9CisKKyAgc3RhdGljIGlubGluZSB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCYgSUQsIGNvbnN0IEltbXV0YWJsZU1hcCYgTSkgeworICAgIElELkFkZFBvaW50ZXIoTS5Sb290KTsKKyAgfQorCisgIGlubGluZSB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCYgSUQpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJvZmlsZShJRCwqdGhpcyk7CisgIH0KK307CisKKy8vIE5PVEU6IFRoaXMgd2lsbCBwb3NzaWJseSBiZWNvbWUgdGhlIG5ldyBpbXBsZW1lbnRhdGlvbiBvZiBJbW11dGFibGVNYXAgc29tZSBkYXkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwKK3R5cGVuYW1lIFZhbEluZm8gPSBJbXV0S2V5VmFsdWVJbmZvPEtleVQsVmFsVD4+CitjbGFzcyBJbW11dGFibGVNYXBSZWYgeworcHVibGljOgorICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgVmFsSW5mbzo6dmFsdWVfdHlwZTsKKyAgdXNpbmcgdmFsdWVfdHlwZV9yZWYgPSB0eXBlbmFtZSBWYWxJbmZvOjp2YWx1ZV90eXBlX3JlZjsKKyAgdXNpbmcga2V5X3R5cGUgPSB0eXBlbmFtZSBWYWxJbmZvOjprZXlfdHlwZTsKKyAgdXNpbmcga2V5X3R5cGVfcmVmID0gdHlwZW5hbWUgVmFsSW5mbzo6a2V5X3R5cGVfcmVmOworICB1c2luZyBkYXRhX3R5cGUgPSB0eXBlbmFtZSBWYWxJbmZvOjpkYXRhX3R5cGU7CisgIHVzaW5nIGRhdGFfdHlwZV9yZWYgPSB0eXBlbmFtZSBWYWxJbmZvOjpkYXRhX3R5cGVfcmVmOworICB1c2luZyBUcmVlVHkgPSBJbXV0QVZMVHJlZTxWYWxJbmZvPjsKKyAgdXNpbmcgRmFjdG9yeVR5ID0gdHlwZW5hbWUgVHJlZVR5OjpGYWN0b3J5OworCitwcm90ZWN0ZWQ6CisgIFRyZWVUeSAqUm9vdDsKKyAgRmFjdG9yeVR5ICpGYWN0b3J5OworCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3RzIGEgbWFwIGZyb20gYSBwb2ludGVyIHRvIGEgdHJlZSByb290LiAgSW4gZ2VuZXJhbCBvbmUKKyAgLy8vIHNob3VsZCB1c2UgYSBGYWN0b3J5IG9iamVjdCB0byBjcmVhdGUgbWFwcyBpbnN0ZWFkIG9mIGRpcmVjdGx5CisgIC8vLyBpbnZva2luZyB0aGUgY29uc3RydWN0b3IsIGJ1dCB0aGVyZSBhcmUgY2FzZXMgd2hlcmUgbWFrZSB0aGlzCisgIC8vLyBjb25zdHJ1Y3RvciBwdWJsaWMgaXMgdXNlZnVsLgorICBleHBsaWNpdCBJbW11dGFibGVNYXBSZWYoY29uc3QgVHJlZVR5ICpSLCBGYWN0b3J5VHkgKkYpCisgICAgICA6IFJvb3QoY29uc3RfY2FzdDxUcmVlVHkgKj4oUikpLCBGYWN0b3J5KEYpIHsKKyAgICBpZiAoUm9vdCkgeworICAgICAgUm9vdC0+cmV0YWluKCk7CisgICAgfQorICB9CisKKyAgZXhwbGljaXQgSW1tdXRhYmxlTWFwUmVmKGNvbnN0IEltbXV0YWJsZU1hcDxLZXlULCBWYWxUPiAmWCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEltbXV0YWJsZU1hcDxLZXlULCBWYWxUPjo6RmFjdG9yeSAmRikKKyAgICA6IFJvb3QoWC5nZXRSb290V2l0aG91dFJldGFpbigpKSwKKyAgICAgIEZhY3RvcnkoRi5nZXRUcmVlRmFjdG9yeSgpKSB7CisgICAgaWYgKFJvb3QpIHsgUm9vdC0+cmV0YWluKCk7IH0KKyAgfQorCisgIEltbXV0YWJsZU1hcFJlZihjb25zdCBJbW11dGFibGVNYXBSZWYgJlgpIDogUm9vdChYLlJvb3QpLCBGYWN0b3J5KFguRmFjdG9yeSkgeworICAgIGlmIChSb290KSB7CisgICAgICBSb290LT5yZXRhaW4oKTsKKyAgICB9CisgIH0KKworICB+SW1tdXRhYmxlTWFwUmVmKCkgeworICAgIGlmIChSb290KQorICAgICAgUm9vdC0+cmVsZWFzZSgpOworICB9CisKKyAgSW1tdXRhYmxlTWFwUmVmICZvcGVyYXRvcj0oY29uc3QgSW1tdXRhYmxlTWFwUmVmICZYKSB7CisgICAgaWYgKFJvb3QgIT0gWC5Sb290KSB7CisgICAgICBpZiAoWC5Sb290KQorICAgICAgICBYLlJvb3QtPnJldGFpbigpOworCisgICAgICBpZiAoUm9vdCkKKyAgICAgICAgUm9vdC0+cmVsZWFzZSgpOworCisgICAgICBSb290ID0gWC5Sb290OworICAgICAgRmFjdG9yeSA9IFguRmFjdG9yeTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIGlubGluZSBJbW11dGFibGVNYXBSZWYgZ2V0RW1wdHlNYXAoRmFjdG9yeVR5ICpGKSB7CisgICAgcmV0dXJuIEltbXV0YWJsZU1hcFJlZigwLCBGKTsKKyAgfQorCisgIHZvaWQgbWFudWFsUmV0YWluKCkgeworICAgIGlmIChSb290KSBSb290LT5yZXRhaW4oKTsKKyAgfQorCisgIHZvaWQgbWFudWFsUmVsZWFzZSgpIHsKKyAgICBpZiAoUm9vdCkgUm9vdC0+cmVsZWFzZSgpOworICB9CisKKyAgSW1tdXRhYmxlTWFwUmVmIGFkZChrZXlfdHlwZV9yZWYgSywgZGF0YV90eXBlX3JlZiBEKSBjb25zdCB7CisgICAgVHJlZVR5ICpOZXdUID0gRmFjdG9yeS0+YWRkKFJvb3QsIHN0ZDo6cGFpcjxrZXlfdHlwZSwgZGF0YV90eXBlPihLLCBEKSk7CisgICAgcmV0dXJuIEltbXV0YWJsZU1hcFJlZihOZXdULCBGYWN0b3J5KTsKKyAgfQorCisgIEltbXV0YWJsZU1hcFJlZiByZW1vdmUoa2V5X3R5cGVfcmVmIEspIGNvbnN0IHsKKyAgICBUcmVlVHkgKk5ld1QgPSBGYWN0b3J5LT5yZW1vdmUoUm9vdCwgSyk7CisgICAgcmV0dXJuIEltbXV0YWJsZU1hcFJlZihOZXdULCBGYWN0b3J5KTsKKyAgfQorCisgIGJvb2wgY29udGFpbnMoa2V5X3R5cGVfcmVmIEspIGNvbnN0IHsKKyAgICByZXR1cm4gUm9vdCA/IFJvb3QtPmNvbnRhaW5zKEspIDogZmFsc2U7CisgIH0KKworICBJbW11dGFibGVNYXA8S2V5VCwgVmFsVD4gYXNJbW11dGFibGVNYXAoKSBjb25zdCB7CisgICAgcmV0dXJuIEltbXV0YWJsZU1hcDxLZXlULCBWYWxUPihGYWN0b3J5LT5nZXRDYW5vbmljYWxUcmVlKFJvb3QpKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbW11dGFibGVNYXBSZWYgJlJIUykgY29uc3QgeworICAgIHJldHVybiBSb290ICYmIFJIUy5Sb290ID8gUm9vdC0+aXNFcXVhbCgqUkhTLlJvb3QpIDogUm9vdCA9PSBSSFMuUm9vdDsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJbW11dGFibGVNYXBSZWYgJlJIUykgY29uc3QgeworICAgIHJldHVybiBSb290ICYmIFJIUy5Sb290ID8gUm9vdC0+aXNOb3RFcXVhbCgqUkhTLlJvb3QpIDogUm9vdCAhPSBSSFMuUm9vdDsKKyAgfQorCisgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICFSb290OyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEZvciB0ZXN0aW5nLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICB2b2lkIHZlcmlmeSgpIGNvbnN0IHsKKyAgICBpZiAoUm9vdCkKKyAgICAgIFJvb3QtPnZlcmlmeSgpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEl0ZXJhdG9ycy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgY2xhc3MgaXRlcmF0b3IgOiBwdWJsaWMgSW11dEFWTFZhbHVlSXRlcmF0b3I8SW1tdXRhYmxlTWFwUmVmPiB7CisgICAgZnJpZW5kIGNsYXNzIEltbXV0YWJsZU1hcFJlZjsKKworICAgIGl0ZXJhdG9yKCkgPSBkZWZhdWx0OworICAgIGV4cGxpY2l0IGl0ZXJhdG9yKFRyZWVUeSAqVHJlZSkgOiBpdGVyYXRvcjo6SW11dEFWTFZhbHVlSXRlcmF0b3IoVHJlZSkge30KKworICBwdWJsaWM6CisgICAga2V5X3R5cGVfcmVmIGdldEtleSgpIGNvbnN0IHsgcmV0dXJuICgqdGhpcyktPmZpcnN0OyB9CisgICAgZGF0YV90eXBlX3JlZiBnZXREYXRhKCkgY29uc3QgeyByZXR1cm4gKCp0aGlzKS0+c2Vjb25kOyB9CisgIH07CisKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcihSb290KTsgfQorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigpOyB9CisKKyAgZGF0YV90eXBlICpsb29rdXAoa2V5X3R5cGVfcmVmIEspIGNvbnN0IHsKKyAgICBpZiAoUm9vdCkgeworICAgICAgVHJlZVR5KiBUID0gUm9vdC0+ZmluZChLKTsKKyAgICAgIGlmIChUKSByZXR1cm4gJlQtPmdldFZhbHVlKCkuc2Vjb25kOworICAgIH0KKworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIGdldE1heEVsZW1lbnQgLSBSZXR1cm5zIHRoZSA8a2V5LHZhbHVlPiBwYWlyIGluIHRoZSBJbW11dGFibGVNYXAgZm9yCisgIC8vLyAgd2hpY2gga2V5IGlzIHRoZSBoaWdoZXN0IGluIHRoZSBvcmRlcmluZyBvZiBrZXlzIGluIHRoZSBtYXAuICBUaGlzCisgIC8vLyAgbWV0aG9kIHJldHVybnMgTlVMTCBpZiB0aGUgbWFwIGlzIGVtcHR5LgorICB2YWx1ZV90eXBlKiBnZXRNYXhFbGVtZW50KCkgY29uc3QgeworICAgIHJldHVybiBSb290ID8gJihSb290LT5nZXRNYXhFbGVtZW50KCktPmdldFZhbHVlKCkpIDogMDsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBVdGlsaXR5IG1ldGhvZHMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIHVuc2lnbmVkIGdldEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIFJvb3QgPyBSb290LT5nZXRIZWlnaHQoKSA6IDA7IH0KKworICBzdGF0aWMgaW5saW5lIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCwgY29uc3QgSW1tdXRhYmxlTWFwUmVmICZNKSB7CisgICAgSUQuQWRkUG9pbnRlcihNLlJvb3QpOworICB9CisKKyAgaW5saW5lIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3QgeyByZXR1cm4gUHJvZmlsZShJRCwgKnRoaXMpOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfSU1NVVRBQkxFTUFQX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0ltbXV0YWJsZVNldC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvSW1tdXRhYmxlU2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ1ODBjNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0ltbXV0YWJsZVNldC5oCkBAIC0wLDAgKzEsMTIyNCBAQAorLy89PT0tLS0gSW1tdXRhYmxlU2V0LmggLSBJbW11dGFibGUgKGZ1bmN0aW9uYWwpIHNldCBpbnRlcmZhY2UgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgSW11dEFWTFRyZWUgYW5kIEltbXV0YWJsZVNldCBjbGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfSU1NVVRBQkxFU0VUX0gKKyNkZWZpbmUgTExWTV9BRFRfSU1NVVRBQkxFU0VUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxuZXc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbW11dGFibGUgQVZMLVRyZWUgRGVmaW5pdGlvbi4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXV0SW5mbz4gY2xhc3MgSW11dEFWTEZhY3Rvcnk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW11dEluZm8+IGNsYXNzIEltdXRJbnRlcnZhbEFWTEZhY3Rvcnk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW11dEluZm8+IGNsYXNzIEltdXRBVkxUcmVlSW5PcmRlckl0ZXJhdG9yOwordGVtcGxhdGUgPHR5cGVuYW1lIEltdXRJbmZvPiBjbGFzcyBJbXV0QVZMVHJlZUdlbmVyaWNJdGVyYXRvcjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEltdXRJbmZvID4KK2NsYXNzIEltdXRBVkxUcmVlIHsKK3B1YmxpYzoKKyAgdXNpbmcga2V5X3R5cGVfcmVmID0gdHlwZW5hbWUgSW11dEluZm86OmtleV90eXBlX3JlZjsKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIEltdXRJbmZvOjp2YWx1ZV90eXBlOworICB1c2luZyB2YWx1ZV90eXBlX3JlZiA9IHR5cGVuYW1lIEltdXRJbmZvOjp2YWx1ZV90eXBlX3JlZjsKKyAgdXNpbmcgRmFjdG9yeSA9IEltdXRBVkxGYWN0b3J5PEltdXRJbmZvPjsKKyAgdXNpbmcgaXRlcmF0b3IgPSBJbXV0QVZMVHJlZUluT3JkZXJJdGVyYXRvcjxJbXV0SW5mbz47CisKKyAgZnJpZW5kIGNsYXNzIEltdXRBVkxGYWN0b3J5PEltdXRJbmZvPjsKKyAgZnJpZW5kIGNsYXNzIEltdXRJbnRlcnZhbEFWTEZhY3Rvcnk8SW11dEluZm8+OworICBmcmllbmQgY2xhc3MgSW11dEFWTFRyZWVHZW5lcmljSXRlcmF0b3I8SW11dEluZm8+OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFB1YmxpYyBJbnRlcmZhY2UuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGxlZnQgc3VidHJlZS4gIFRoaXMgdmFsdWUKKyAgLy8vICBpcyBOVUxMIGlmIHRoZXJlIGlzIG5vIGxlZnQgc3VidHJlZS4KKyAgSW11dEFWTFRyZWUgKmdldExlZnQoKSBjb25zdCB7IHJldHVybiBsZWZ0OyB9CisKKyAgLy8vIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHJpZ2h0IHN1YnRyZWUuICBUaGlzIHZhbHVlIGlzCisgIC8vLyAgTlVMTCBpZiB0aGVyZSBpcyBubyByaWdodCBzdWJ0cmVlLgorICBJbXV0QVZMVHJlZSAqZ2V0UmlnaHQoKSBjb25zdCB7IHJldHVybiByaWdodDsgfQorCisgIC8vLyBnZXRIZWlnaHQgLSBSZXR1cm5zIHRoZSBoZWlnaHQgb2YgdGhlIHRyZWUuICBBIHRyZWUgd2l0aCBubyBzdWJ0cmVlcworICAvLy8gIGhhcyBhIGhlaWdodCBvZiAxLgorICB1bnNpZ25lZCBnZXRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBoZWlnaHQ7IH0KKworICAvLy8gZ2V0VmFsdWUgLSBSZXR1cm5zIHRoZSBkYXRhIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdHJlZSBub2RlLgorICBjb25zdCB2YWx1ZV90eXBlJiBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHZhbHVlOyB9CisKKyAgLy8vIGZpbmQgLSBGaW5kcyB0aGUgc3VidHJlZSBhc3NvY2lhdGVkIHdpdGggdGhlIHNwZWNpZmllZCBrZXkgdmFsdWUuCisgIC8vLyAgVGhpcyBtZXRob2QgcmV0dXJucyBOVUxMIGlmIG5vIG1hdGNoaW5nIHN1YnRyZWUgaXMgZm91bmQuCisgIEltdXRBVkxUcmVlKiBmaW5kKGtleV90eXBlX3JlZiBLKSB7CisgICAgSW11dEFWTFRyZWUgKlQgPSB0aGlzOworICAgIHdoaWxlIChUKSB7CisgICAgICBrZXlfdHlwZV9yZWYgQ3VycmVudEtleSA9IEltdXRJbmZvOjpLZXlPZlZhbHVlKFQtPmdldFZhbHVlKCkpOworICAgICAgaWYgKEltdXRJbmZvOjppc0VxdWFsKEssQ3VycmVudEtleSkpCisgICAgICAgIHJldHVybiBUOworICAgICAgZWxzZSBpZiAoSW11dEluZm86OmlzTGVzcyhLLEN1cnJlbnRLZXkpKQorICAgICAgICBUID0gVC0+Z2V0TGVmdCgpOworICAgICAgZWxzZQorICAgICAgICBUID0gVC0+Z2V0UmlnaHQoKTsKKyAgICB9CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gZ2V0TWF4RWxlbWVudCAtIEZpbmQgdGhlIHN1YnRyZWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBoaWdoZXN0IHJhbmdlZAorICAvLy8gIGtleSB2YWx1ZS4KKyAgSW11dEFWTFRyZWUqIGdldE1heEVsZW1lbnQoKSB7CisgICAgSW11dEFWTFRyZWUgKlQgPSB0aGlzOworICAgIEltdXRBVkxUcmVlICpSaWdodCA9IFQtPmdldFJpZ2h0KCk7CisgICAgd2hpbGUgKFJpZ2h0KSB7IFQgPSBSaWdodDsgUmlnaHQgPSBULT5nZXRSaWdodCgpOyB9CisgICAgcmV0dXJuIFQ7CisgIH0KKworICAvLy8gc2l6ZSAtIFJldHVybnMgdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgdHJlZSwgd2hpY2ggaW5jbHVkZXMKKyAgLy8vICBib3RoIGxlYXZlcyBhbmQgbm9uLWxlYWYgbm9kZXMuCisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7CisgICAgdW5zaWduZWQgbiA9IDE7CisgICAgaWYgKGNvbnN0IEltdXRBVkxUcmVlKiBMID0gZ2V0TGVmdCgpKQorICAgICAgbiArPSBMLT5zaXplKCk7CisgICAgaWYgKGNvbnN0IEltdXRBVkxUcmVlKiBSID0gZ2V0UmlnaHQoKSkKKyAgICAgIG4gKz0gUi0+c2l6ZSgpOworICAgIHJldHVybiBuOworICB9CisKKyAgLy8vIGJlZ2luIC0gUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IGl0ZXJhdGVzIG92ZXIgdGhlIG5vZGVzIG9mIHRoZSB0cmVlCisgIC8vLyAgaW4gYW4gaW5vcmRlciB0cmF2ZXJzYWwuICBUaGUgcmV0dXJuZWQgaXRlcmF0b3IgdGh1cyByZWZlcnMgdG8gdGhlCisgIC8vLyAgdGhlIHRyZWUgbm9kZSB3aXRoIHRoZSBtaW5pbXVtIGRhdGEgZWxlbWVudC4KKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcih0aGlzKTsgfQorCisgIC8vLyBlbmQgLSBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciB0aGUgdHJlZSB0aGF0IGRlbm90ZXMgdGhlIGVuZCBvZiBhbgorICAvLy8gIGlub3JkZXIgdHJhdmVyc2FsLgorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcigpOyB9CisKKyAgYm9vbCBpc0VsZW1lbnRFcXVhbCh2YWx1ZV90eXBlX3JlZiBWKSBjb25zdCB7CisgICAgLy8gQ29tcGFyZSB0aGUga2V5cy4KKyAgICBpZiAoIUltdXRJbmZvOjppc0VxdWFsKEltdXRJbmZvOjpLZXlPZlZhbHVlKGdldFZhbHVlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW11dEluZm86OktleU9mVmFsdWUoVikpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gQWxzbyBjb21wYXJlIHRoZSBkYXRhIHZhbHVlcy4KKyAgICBpZiAoIUltdXRJbmZvOjppc0RhdGFFcXVhbChJbXV0SW5mbzo6RGF0YU9mVmFsdWUoZ2V0VmFsdWUoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW11dEluZm86OkRhdGFPZlZhbHVlKFYpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCBpc0VsZW1lbnRFcXVhbChjb25zdCBJbXV0QVZMVHJlZSogUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRWxlbWVudEVxdWFsKFJIUy0+Z2V0VmFsdWUoKSk7CisgIH0KKworICAvLy8gaXNFcXVhbCAtIENvbXBhcmVzIHR3byB0cmVlcyBmb3Igc3RydWN0dXJhbCBlcXVhbGl0eSBhbmQgcmV0dXJucyB0cnVlCisgIC8vLyAgIGlmIHRoZXkgYXJlIGVxdWFsLiAgVGhpcyB3b3JzdCBjYXNlIHBlcmZvcm1hbmNlIG9mIHRoaXMgb3BlcmF0aW9uIGlzCisgIC8vICAgIGxpbmVhciBpbiB0aGUgc2l6ZXMgb2YgdGhlIHRyZWVzLgorICBib29sIGlzRXF1YWwoY29uc3QgSW11dEFWTFRyZWUmIFJIUykgY29uc3QgeworICAgIGlmICgmUkhTID09IHRoaXMpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGl0ZXJhdG9yIExJdHIgPSBiZWdpbigpLCBMRW5kID0gZW5kKCk7CisgICAgaXRlcmF0b3IgUkl0ciA9IFJIUy5iZWdpbigpLCBSRW5kID0gUkhTLmVuZCgpOworCisgICAgd2hpbGUgKExJdHIgIT0gTEVuZCAmJiBSSXRyICE9IFJFbmQpIHsKKyAgICAgIGlmICgmKkxJdHIgPT0gJipSSXRyKSB7CisgICAgICAgIExJdHIuc2tpcFN1YlRyZWUoKTsKKyAgICAgICAgUkl0ci5za2lwU3ViVHJlZSgpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKCFMSXRyLT5pc0VsZW1lbnRFcXVhbCgmKlJJdHIpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICsrTEl0cjsKKyAgICAgICsrUkl0cjsKKyAgICB9CisKKyAgICByZXR1cm4gTEl0ciA9PSBMRW5kICYmIFJJdHIgPT0gUkVuZDsKKyAgfQorCisgIC8vLyBpc05vdEVxdWFsIC0gQ29tcGFyZXMgdHdvIHRyZWVzIGZvciBzdHJ1Y3R1cmFsIGluZXF1YWxpdHkuICBQZXJmb3JtYW5jZQorICAvLy8gIGlzIHRoZSBzYW1lIGlzIGlzRXF1YWwuCisgIGJvb2wgaXNOb3RFcXVhbChjb25zdCBJbXV0QVZMVHJlZSYgUkhTKSBjb25zdCB7IHJldHVybiAhaXNFcXVhbChSSFMpOyB9CisKKyAgLy8vIGNvbnRhaW5zIC0gUmV0dXJucyB0cnVlIGlmIHRoaXMgdHJlZSBjb250YWlucyBhIHN1YnRyZWUgKG5vZGUpIHRoYXQKKyAgLy8vICBoYXMgYW4gZGF0YSBlbGVtZW50IHRoYXQgbWF0Y2hlcyB0aGUgc3BlY2lmaWVkIGtleS4gIENvbXBsZXhpdHkKKyAgLy8vICBpcyBsb2dhcml0aG1pYyBpbiB0aGUgc2l6ZSBvZiB0aGUgdHJlZS4KKyAgYm9vbCBjb250YWlucyhrZXlfdHlwZV9yZWYgSykgeyByZXR1cm4gKGJvb2wpIGZpbmQoSyk7IH0KKworICAvLy8gZm9yZWFjaCAtIEEgbWVtYmVyIHRlbXBsYXRlIHRoZSBhY2NlcHRzIGludm9rZXMgb3BlcmF0b3IoKSBvbiBhIGZ1bmN0b3IKKyAgLy8vICBvYmplY3QgKHNwZWNpZmVkIGJ5IENhbGxiYWNrKSBmb3IgZXZlcnkgbm9kZS9zdWJ0cmVlIGluIHRoZSB0cmVlLgorICAvLy8gIE5vZGVzIGFyZSB2aXNpdGVkIHVzaW5nIGFuIGlub3JkZXIgdHJhdmVyc2FsLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FsbGJhY2s+CisgIHZvaWQgZm9yZWFjaChDYWxsYmFjayYgQykgeworICAgIGlmIChJbXV0QVZMVHJlZSogTCA9IGdldExlZnQoKSkKKyAgICAgIEwtPmZvcmVhY2goQyk7CisKKyAgICBDKHZhbHVlKTsKKworICAgIGlmIChJbXV0QVZMVHJlZSogUiA9IGdldFJpZ2h0KCkpCisgICAgICBSLT5mb3JlYWNoKEMpOworICB9CisKKyAgLy8vIHZhbGlkYXRlVHJlZSAtIEEgdXRpbGl0eSBtZXRob2QgdGhhdCBjaGVja3MgdGhhdCB0aGUgYmFsYW5jaW5nIGFuZAorICAvLy8gIG9yZGVyaW5nIGludmFyaWFudHMgb2YgdGhlIHRyZWUgYXJlIHNhdGlzaWZlZC4gIEl0IGlzIGEgcmVjdXJzaXZlCisgIC8vLyAgbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoZSB0cmVlLCB3aGljaCBpcyB0aGVuIGNvbnN1bWVkCisgIC8vLyAgYnkgdGhlIGVuY2xvc2luZyB2YWxpZGF0ZVRyZWUgY2FsbC4gIEV4dGVybmFsIGNhbGxlcnMgc2hvdWxkIGlnbm9yZSB0aGUKKyAgLy8vICByZXR1cm4gdmFsdWUuICBBbiBpbnZhbGlkIHRyZWUgd2lsbCBjYXVzZSBhbiBhc3NlcnRpb24gdG8gZmlyZSBpbgorICAvLy8gIGEgZGVidWcgYnVpbGQuCisgIHVuc2lnbmVkIHZhbGlkYXRlVHJlZSgpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBITCA9IGdldExlZnQoKSA/IGdldExlZnQoKS0+dmFsaWRhdGVUcmVlKCkgOiAwOworICAgIHVuc2lnbmVkIEhSID0gZ2V0UmlnaHQoKSA/IGdldFJpZ2h0KCktPnZhbGlkYXRlVHJlZSgpIDogMDsKKyAgICAodm9pZCkgSEw7CisgICAgKHZvaWQpIEhSOworCisgICAgYXNzZXJ0KGdldEhlaWdodCgpID09ICggSEwgPiBIUiA/IEhMIDogSFIgKSArIDEKKyAgICAgICAgICAgICYmICJIZWlnaHQgY2FsY3VsYXRpb24gd3JvbmciKTsKKworICAgIGFzc2VydCgoSEwgPiBIUiA/IEhMLUhSIDogSFItSEwpIDw9IDIKKyAgICAgICAgICAgJiYgIkJhbGFuY2luZyBpbnZhcmlhbnQgdmlvbGF0ZWQiKTsKKworICAgIGFzc2VydCgoIWdldExlZnQoKSB8fAorICAgICAgICAgICAgSW11dEluZm86OmlzTGVzcyhJbXV0SW5mbzo6S2V5T2ZWYWx1ZShnZXRMZWZ0KCktPmdldFZhbHVlKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbXV0SW5mbzo6S2V5T2ZWYWx1ZShnZXRWYWx1ZSgpKSkpICYmCisgICAgICAgICAgICJWYWx1ZSBpbiBsZWZ0IGNoaWxkIGlzIG5vdCBsZXNzIHRoYXQgY3VycmVudCB2YWx1ZSIpOworCisKKyAgICBhc3NlcnQoIShnZXRSaWdodCgpIHx8CisgICAgICAgICAgICAgSW11dEluZm86OmlzTGVzcyhJbXV0SW5mbzo6S2V5T2ZWYWx1ZShnZXRWYWx1ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltdXRJbmZvOjpLZXlPZlZhbHVlKGdldFJpZ2h0KCktPmdldFZhbHVlKCkpKSkgJiYKKyAgICAgICAgICAgIkN1cnJlbnQgdmFsdWUgaXMgbm90IGxlc3MgdGhhdCB2YWx1ZSBvZiByaWdodCBjaGlsZCIpOworCisgICAgcmV0dXJuIGdldEhlaWdodCgpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSW50ZXJuYWwgdmFsdWVzLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitwcml2YXRlOgorICBGYWN0b3J5ICpmYWN0b3J5OworICBJbXV0QVZMVHJlZSAqbGVmdDsKKyAgSW11dEFWTFRyZWUgKnJpZ2h0OworICBJbXV0QVZMVHJlZSAqcHJldiA9IG51bGxwdHI7CisgIEltdXRBVkxUcmVlICpuZXh0ID0gbnVsbHB0cjsKKworICB1bnNpZ25lZCBoZWlnaHQgOiAyODsKKyAgYm9vbCBJc011dGFibGUgOiAxOworICBib29sIElzRGlnZXN0Q2FjaGVkIDogMTsKKyAgYm9vbCBJc0Nhbm9uaWNhbGl6ZWQgOiAxOworCisgIHZhbHVlX3R5cGUgdmFsdWU7CisgIHVpbnQzMl90IGRpZ2VzdCA9IDA7CisgIHVpbnQzMl90IHJlZkNvdW50ID0gMDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJbnRlcm5hbCBtZXRob2RzIChub2RlIG1hbmlwdWxhdGlvbjsgdXNlZCBieSBGYWN0b3J5KS4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworcHJpdmF0ZToKKyAgLy8vIEltdXRBVkxUcmVlIC0gSW50ZXJuYWwgY29uc3RydWN0b3IgdGhhdCBpcyBvbmx5IGNhbGxlZCBieQorICAvLy8gICBJbXV0QVZMRmFjdG9yeS4KKyAgSW11dEFWTFRyZWUoRmFjdG9yeSAqZiwgSW11dEFWTFRyZWUqIGwsIEltdXRBVkxUcmVlKiByLCB2YWx1ZV90eXBlX3JlZiB2LAorICAgICAgICAgICAgICB1bnNpZ25lZCBoZWlnaHQpCisgICAgOiBmYWN0b3J5KGYpLCBsZWZ0KGwpLCByaWdodChyKSwgaGVpZ2h0KGhlaWdodCksIElzTXV0YWJsZSh0cnVlKSwKKyAgICAgIElzRGlnZXN0Q2FjaGVkKGZhbHNlKSwgSXNDYW5vbmljYWxpemVkKGZhbHNlKSwgdmFsdWUodikKKyAgeworICAgIGlmIChsZWZ0KSBsZWZ0LT5yZXRhaW4oKTsKKyAgICBpZiAocmlnaHQpIHJpZ2h0LT5yZXRhaW4oKTsKKyAgfQorCisgIC8vLyBpc011dGFibGUgLSBSZXR1cm5zIHRydWUgaWYgdGhlIGxlZnQgYW5kIHJpZ2h0IHN1YnRyZWUgcmVmZXJlbmNlcworICAvLy8gIChhcyB3ZWxsIGFzIGhlaWdodCkgY2FuIGJlIGNoYW5nZWQuICBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlLAorICAvLy8gIHRoZSB0cmVlIGlzIHRydWx5IGltbXV0YWJsZS4gIFRyZWVzIHJldHVybmVkIGZyb20gYW4gSW11dEFWTEZhY3RvcnkKKyAgLy8vICBvYmplY3Qgc2hvdWxkIGFsd2F5cyBoYXZlIHRoaXMgbWV0aG9kIHJldHVybiB0cnVlLiAgRnVydGhlciwgaWYgdGhpcworICAvLy8gIG1ldGhvZCByZXR1cm5zIGZhbHNlIGZvciBhbiBpbnN0YW5jZSBvZiBJbXV0QVZMVHJlZSwgYWxsIHN1YnRyZWVzCisgIC8vLyAgd2lsbCBhbHNvIGhhdmUgdGhpcyBtZXRob2QgcmV0dXJuIGZhbHNlLiAgVGhlIGNvbnZlcnNlIGlzIG5vdCB0cnVlLgorICBib29sIGlzTXV0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIElzTXV0YWJsZTsgfQorCisgIC8vLyBoYXNDYWNoZWREaWdlc3QgLSBSZXR1cm5zIHRydWUgaWYgdGhlIGRpZ2VzdCBmb3IgdGhpcyB0cmVlIGlzIGNhY2hlZC4KKyAgLy8vICBUaGlzIGNhbiBvbmx5IGJlIHRydWUgaWYgdGhlIHRyZWUgaXMgaW1tdXRhYmxlLgorICBib29sIGhhc0NhY2hlZERpZ2VzdCgpIGNvbnN0IHsgcmV0dXJuIElzRGlnZXN0Q2FjaGVkOyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTXV0YXRpbmcgb3BlcmF0aW9ucy4gIEEgdHJlZSByb290IGNhbiBiZSBtYW5pcHVsYXRlZCBhcworICAvLyBsb25nIGFzIGl0cyByZWZlcmVuY2UgaGFzIG5vdCAiZXNjYXBlZCIgZnJvbSBpbnRlcm5hbAorICAvLyBtZXRob2RzIG9mIGEgZmFjdG9yeSBvYmplY3QgKHNlZSBiZWxvdykuICBXaGVuIGEgdHJlZQorICAvLyBwb2ludGVyIGlzIGV4dGVybmFsbHkgdmlld2FibGUgYnkgY2xpZW50IGNvZGUsIHRoZQorICAvLyBpbnRlcm5hbCAibXV0YWJsZSBiaXQiIGlzIGNsZWFyZWQgdG8gbWFyayB0aGUgdHJlZQorICAvLyBpbW11dGFibGUuICBOb3RlIHRoYXQgYSB0cmVlIHRoYXQgc3RpbGwgaGFzIGl0cyBtdXRhYmxlCisgIC8vIGJpdCBzZXQgbWF5IGhhdmUgY2hpbGRyZW4gKHN1YnRyZWVzKSB0aGF0IGFyZSB0aGVtc2VsdmVzCisgIC8vIGltbXV0YWJsZS4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gbWFya0ltbXV0YWJsZSAtIENsZWFycyB0aGUgbXV0YWJsZSBmbGFnIGZvciBhIHRyZWUuICBBZnRlciB0aGlzIGhhcHBlbnMsCisgIC8vLyAgIGl0IGlzIGFuIGVycm9yIHRvIGNhbGwgc2V0TGVmdCgpLCBzZXRSaWdodCgpLCBhbmQgc2V0SGVpZ2h0KCkuCisgIHZvaWQgbWFya0ltbXV0YWJsZSgpIHsKKyAgICBhc3NlcnQoaXNNdXRhYmxlKCkgJiYgIk11dGFibGUgZmxhZyBhbHJlYWR5IHJlbW92ZWQuIik7CisgICAgSXNNdXRhYmxlID0gZmFsc2U7CisgIH0KKworICAvLy8gbWFya2VkQ2FjaGVkRGlnZXN0IC0gQ2xlYXJzIHRoZSBOb0NhY2hlZERpZ2VzdCBmbGFnIGZvciBhIHRyZWUuCisgIHZvaWQgbWFya2VkQ2FjaGVkRGlnZXN0KCkgeworICAgIGFzc2VydCghaGFzQ2FjaGVkRGlnZXN0KCkgJiYgIk5vQ2FjaGVkRGlnZXN0IGZsYWcgYWxyZWFkeSByZW1vdmVkLiIpOworICAgIElzRGlnZXN0Q2FjaGVkID0gdHJ1ZTsKKyAgfQorCisgIC8vLyBzZXRIZWlnaHQgLSBDaGFuZ2VzIHRoZSBoZWlnaHQgb2YgdGhlIHRyZWUuICBVc2VkIGludGVybmFsbHkgYnkKKyAgLy8vICBJbXV0QVZMRmFjdG9yeS4KKyAgdm9pZCBzZXRIZWlnaHQodW5zaWduZWQgaCkgeworICAgIGFzc2VydChpc011dGFibGUoKSAmJiAiT25seSBhIG11dGFibGUgdHJlZSBjYW4gaGF2ZSBpdHMgaGVpZ2h0IGNoYW5nZWQuIik7CisgICAgaGVpZ2h0ID0gaDsKKyAgfQorCisgIHN0YXRpYyB1aW50MzJfdCBjb21wdXRlRGlnZXN0KEltdXRBVkxUcmVlICpMLCBJbXV0QVZMVHJlZSAqUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZV9yZWYgVikgeworICAgIHVpbnQzMl90IGRpZ2VzdCA9IDA7CisKKyAgICBpZiAoTCkKKyAgICAgIGRpZ2VzdCArPSBMLT5jb21wdXRlRGlnZXN0KCk7CisKKyAgICAvLyBDb21wdXRlIGRpZ2VzdCBvZiBzdG9yZWQgZGF0YS4KKyAgICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICAgIEltdXRJbmZvOjpQcm9maWxlKElELFYpOworICAgIGRpZ2VzdCArPSBJRC5Db21wdXRlSGFzaCgpOworCisgICAgaWYgKFIpCisgICAgICBkaWdlc3QgKz0gUi0+Y29tcHV0ZURpZ2VzdCgpOworCisgICAgcmV0dXJuIGRpZ2VzdDsKKyAgfQorCisgIHVpbnQzMl90IGNvbXB1dGVEaWdlc3QoKSB7CisgICAgLy8gQ2hlY2sgdGhlIGxvd2VzdCBiaXQgdG8gZGV0ZXJtaW5lIGlmIGRpZ2VzdCBoYXMgYWN0dWFsbHkgYmVlbgorICAgIC8vIHByZS1jb21wdXRlZC4KKyAgICBpZiAoaGFzQ2FjaGVkRGlnZXN0KCkpCisgICAgICByZXR1cm4gZGlnZXN0OworCisgICAgdWludDMyX3QgWCA9IGNvbXB1dGVEaWdlc3QoZ2V0TGVmdCgpLCBnZXRSaWdodCgpLCBnZXRWYWx1ZSgpKTsKKyAgICBkaWdlc3QgPSBYOworICAgIG1hcmtlZENhY2hlZERpZ2VzdCgpOworICAgIHJldHVybiBYOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUmVmZXJlbmNlIGNvdW50IG9wZXJhdGlvbnMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3B1YmxpYzoKKyAgdm9pZCByZXRhaW4oKSB7ICsrcmVmQ291bnQ7IH0KKworICB2b2lkIHJlbGVhc2UoKSB7CisgICAgYXNzZXJ0KHJlZkNvdW50ID4gMCk7CisgICAgaWYgKC0tcmVmQ291bnQgPT0gMCkKKyAgICAgIGRlc3Ryb3koKTsKKyAgfQorCisgIHZvaWQgZGVzdHJveSgpIHsKKyAgICBpZiAobGVmdCkKKyAgICAgIGxlZnQtPnJlbGVhc2UoKTsKKyAgICBpZiAocmlnaHQpCisgICAgICByaWdodC0+cmVsZWFzZSgpOworICAgIGlmIChJc0Nhbm9uaWNhbGl6ZWQpIHsKKyAgICAgIGlmIChuZXh0KQorICAgICAgICBuZXh0LT5wcmV2ID0gcHJldjsKKworICAgICAgaWYgKHByZXYpCisgICAgICAgIHByZXYtPm5leHQgPSBuZXh0OworICAgICAgZWxzZQorICAgICAgICBmYWN0b3J5LT5DYWNoZVtmYWN0b3J5LT5tYXNrQ2FjaGVJbmRleChjb21wdXRlRGlnZXN0KCkpXSA9IG5leHQ7CisgICAgfQorCisgICAgLy8gV2UgbmVlZCB0byBjbGVhciB0aGUgbXV0YWJpbGl0eSBiaXQgaW4gY2FzZSB3ZSBhcmUKKyAgICAvLyBkZXN0cm95aW5nIHRoZSBub2RlIGFzIHBhcnQgb2YgYSBzd2VlcCBpbiBJbXV0QVZMRmFjdG9yeTo6cmVjb3Zlck5vZGVzKCkuCisgICAgSXNNdXRhYmxlID0gZmFsc2U7CisgICAgZmFjdG9yeS0+ZnJlZU5vZGVzLnB1c2hfYmFjayh0aGlzKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEltbXV0YWJsZSBBVkwtVHJlZSBGYWN0b3J5IGNsYXNzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltdXRJbmZvID4KK2NsYXNzIEltdXRBVkxGYWN0b3J5IHsKKyAgZnJpZW5kIGNsYXNzIEltdXRBVkxUcmVlPEltdXRJbmZvPjsKKworICB1c2luZyBUcmVlVHkgPSBJbXV0QVZMVHJlZTxJbXV0SW5mbz47CisgIHVzaW5nIHZhbHVlX3R5cGVfcmVmID0gdHlwZW5hbWUgVHJlZVR5Ojp2YWx1ZV90eXBlX3JlZjsKKyAgdXNpbmcga2V5X3R5cGVfcmVmID0gdHlwZW5hbWUgVHJlZVR5OjprZXlfdHlwZV9yZWY7CisgIHVzaW5nIENhY2hlVHkgPSBEZW5zZU1hcDx1bnNpZ25lZCwgVHJlZVR5Kj47CisKKyAgQ2FjaGVUeSBDYWNoZTsKKyAgdWludHB0cl90IEFsbG9jYXRvcjsKKyAgc3RkOjp2ZWN0b3I8VHJlZVR5Kj4gY3JlYXRlZE5vZGVzOworICBzdGQ6OnZlY3RvcjxUcmVlVHkqPiBmcmVlTm9kZXM7CisKKyAgYm9vbCBvd25zQWxsb2NhdG9yKCkgY29uc3QgeworICAgIHJldHVybiAoQWxsb2NhdG9yICYgMHgxKSA9PSAwOworICB9CisKKyAgQnVtcFB0ckFsbG9jYXRvciYgZ2V0QWxsb2NhdG9yKCkgY29uc3QgeworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxCdW1wUHRyQWxsb2NhdG9yKj4oQWxsb2NhdG9yICYgfjB4MSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUHVibGljIGludGVyZmFjZS4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3B1YmxpYzoKKyAgSW11dEFWTEZhY3RvcnkoKQorICAgIDogQWxsb2NhdG9yKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihuZXcgQnVtcFB0ckFsbG9jYXRvcigpKSkge30KKworICBJbXV0QVZMRmFjdG9yeShCdW1wUHRyQWxsb2NhdG9yJiBBbGxvYykKKyAgICA6IEFsbG9jYXRvcihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oJkFsbG9jKSB8IDB4MSkge30KKworICB+SW11dEFWTEZhY3RvcnkoKSB7CisgICAgaWYgKG93bnNBbGxvY2F0b3IoKSkgZGVsZXRlICZnZXRBbGxvY2F0b3IoKTsKKyAgfQorCisgIFRyZWVUeSogYWRkKFRyZWVUeSogVCwgdmFsdWVfdHlwZV9yZWYgVikgeworICAgIFQgPSBhZGRfaW50ZXJuYWwoVixUKTsKKyAgICBtYXJrSW1tdXRhYmxlKFQpOworICAgIHJlY292ZXJOb2RlcygpOworICAgIHJldHVybiBUOworICB9CisKKyAgVHJlZVR5KiByZW1vdmUoVHJlZVR5KiBULCBrZXlfdHlwZV9yZWYgVikgeworICAgIFQgPSByZW1vdmVfaW50ZXJuYWwoVixUKTsKKyAgICBtYXJrSW1tdXRhYmxlKFQpOworICAgIHJlY292ZXJOb2RlcygpOworICAgIHJldHVybiBUOworICB9CisKKyAgVHJlZVR5KiBnZXRFbXB0eVRyZWUoKSBjb25zdCB7IHJldHVybiBudWxscHRyOyB9CisKK3Byb3RlY3RlZDoKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEEgYnVuY2ggb2YgcXVpY2sgaGVscGVyIGZ1bmN0aW9ucyB1c2VkIGZvciByZWFzb25pbmcKKyAgLy8gYWJvdXQgdGhlIHByb3BlcnRpZXMgb2YgdHJlZXMgYW5kIHRoZWlyIGNoaWxkcmVuLgorICAvLyBUaGVzZSBoYXZlIHN1Y2NpbmN0IG5hbWVzIHNvIHRoYXQgdGhlIGJhbGFuY2luZyBjb2RlCisgIC8vIGlzIGFzIHRlcnNlIChhbmQgcmVhZGFibGUpIGFzIHBvc3NpYmxlLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBib29sICAgICAgICAgICAgaXNFbXB0eShUcmVlVHkqIFQpIGNvbnN0IHsgcmV0dXJuICFUOyB9CisgIHVuc2lnbmVkICAgICAgICBnZXRIZWlnaHQoVHJlZVR5KiBUKSBjb25zdCB7IHJldHVybiBUID8gVC0+Z2V0SGVpZ2h0KCkgOiAwOyB9CisgIFRyZWVUeSogICAgICAgICBnZXRMZWZ0KFRyZWVUeSogVCkgY29uc3QgeyByZXR1cm4gVC0+Z2V0TGVmdCgpOyB9CisgIFRyZWVUeSogICAgICAgICBnZXRSaWdodChUcmVlVHkqIFQpIGNvbnN0IHsgcmV0dXJuIFQtPmdldFJpZ2h0KCk7IH0KKyAgdmFsdWVfdHlwZV9yZWYgIGdldFZhbHVlKFRyZWVUeSogVCkgY29uc3QgeyByZXR1cm4gVC0+dmFsdWU7IH0KKworICAvLyBNYWtlIHN1cmUgdGhlIGluZGV4IGlzIG5vdCB0aGUgVG9tYnN0b25lIG9yIEVudHJ5IGtleSBvZiB0aGUgRGVuc2VNYXAuCisgIHN0YXRpYyB1bnNpZ25lZCBtYXNrQ2FjaGVJbmRleCh1bnNpZ25lZCBJKSB7IHJldHVybiAoSSAmIH4weDAyKTsgfQorCisgIHVuc2lnbmVkIGluY3JlbWVudEhlaWdodChUcmVlVHkqIEwsIFRyZWVUeSogUikgY29uc3QgeworICAgIHVuc2lnbmVkIGhsID0gZ2V0SGVpZ2h0KEwpOworICAgIHVuc2lnbmVkIGhyID0gZ2V0SGVpZ2h0KFIpOworICAgIHJldHVybiAoaGwgPiBociA/IGhsIDogaHIpICsgMTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNvbXBhcmVUcmVlV2l0aFNlY3Rpb24oVHJlZVR5KiBULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFRyZWVUeTo6aXRlcmF0b3ImIFRJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIFRyZWVUeTo6aXRlcmF0b3ImIFRFKSB7CisgICAgdHlwZW5hbWUgVHJlZVR5OjppdGVyYXRvciBJID0gVC0+YmVnaW4oKSwgRSA9IFQtPmVuZCgpOworICAgIGZvciAoIDsgSSE9RSA7ICsrSSwgKytUSSkgeworICAgICAgaWYgKFRJID09IFRFIHx8ICFJLT5pc0VsZW1lbnRFcXVhbCgmKlRJKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyAiY3JlYXRlTm9kZSIgaXMgdXNlZCB0byBnZW5lcmF0ZSBuZXcgdHJlZSByb290cyB0aGF0IGxpbmsKKyAgLy8gdG8gb3RoZXIgdHJlZXMuICBUaGUgZnVuY3RvbiBtYXkgYWxzbyBzaW1wbHkgbW92ZSBsaW5rcworICAvLyBpbiBhbiBleGlzdGluZyByb290IGlmIHRoYXQgcm9vdCBpcyBzdGlsbCBtYXJrZWQgbXV0YWJsZS4KKyAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvdGhlcndpc2Ugb3VyIGJhbGFuY2luZyBjb2RlCisgIC8vIHdvdWxkIGxlYWsgbWVtb3J5IGFzIGl0IHdvdWxkIGNyZWF0ZSBub2RlcyB0aGF0IGFyZQorICAvLyB0aGVuIGRpc2NhcmRlZCBsYXRlciBiZWZvcmUgdGhlIGZpbmlzaGVkIHRyZWUgaXMKKyAgLy8gcmV0dXJuZWQgdG8gdGhlIGNhbGxlci4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgVHJlZVR5KiBjcmVhdGVOb2RlKFRyZWVUeSogTCwgdmFsdWVfdHlwZV9yZWYgViwgVHJlZVR5KiBSKSB7CisgICAgQnVtcFB0ckFsbG9jYXRvciYgQSA9IGdldEFsbG9jYXRvcigpOworICAgIFRyZWVUeSogVDsKKyAgICBpZiAoIWZyZWVOb2Rlcy5lbXB0eSgpKSB7CisgICAgICBUID0gZnJlZU5vZGVzLmJhY2soKTsKKyAgICAgIGZyZWVOb2Rlcy5wb3BfYmFjaygpOworICAgICAgYXNzZXJ0KFQgIT0gTCk7CisgICAgICBhc3NlcnQoVCAhPSBSKTsKKyAgICB9IGVsc2UgeworICAgICAgVCA9IChUcmVlVHkqKSBBLkFsbG9jYXRlPFRyZWVUeT4oKTsKKyAgICB9CisgICAgbmV3IChUKSBUcmVlVHkodGhpcywgTCwgUiwgViwgaW5jcmVtZW50SGVpZ2h0KEwsUikpOworICAgIGNyZWF0ZWROb2Rlcy5wdXNoX2JhY2soVCk7CisgICAgcmV0dXJuIFQ7CisgIH0KKworICBUcmVlVHkqIGNyZWF0ZU5vZGUoVHJlZVR5KiBuZXdMZWZ0LCBUcmVlVHkqIG9sZFRyZWUsIFRyZWVUeSogbmV3UmlnaHQpIHsKKyAgICByZXR1cm4gY3JlYXRlTm9kZShuZXdMZWZ0LCBnZXRWYWx1ZShvbGRUcmVlKSwgbmV3UmlnaHQpOworICB9CisKKyAgdm9pZCByZWNvdmVyTm9kZXMoKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgbiA9IGNyZWF0ZWROb2Rlcy5zaXplKCk7IGkgPCBuOyArK2kpIHsKKyAgICAgIFRyZWVUeSAqTiA9IGNyZWF0ZWROb2Rlc1tpXTsKKyAgICAgIGlmIChOLT5pc011dGFibGUoKSAmJiBOLT5yZWZDb3VudCA9PSAwKQorICAgICAgICBOLT5kZXN0cm95KCk7CisgICAgfQorICAgIGNyZWF0ZWROb2Rlcy5jbGVhcigpOworICB9CisKKyAgLy8vIGJhbGFuY2VUcmVlIC0gVXNlZCBieSBhZGRfaW50ZXJuYWwgYW5kIHJlbW92ZV9pbnRlcm5hbCB0bworICAvLy8gIGJhbGFuY2UgYSBuZXdseSBjcmVhdGVkIHRyZWUuCisgIFRyZWVUeSogYmFsYW5jZVRyZWUoVHJlZVR5KiBMLCB2YWx1ZV90eXBlX3JlZiBWLCBUcmVlVHkqIFIpIHsKKyAgICB1bnNpZ25lZCBobCA9IGdldEhlaWdodChMKTsKKyAgICB1bnNpZ25lZCBociA9IGdldEhlaWdodChSKTsKKworICAgIGlmIChobCA+IGhyICsgMikgeworICAgICAgYXNzZXJ0KCFpc0VtcHR5KEwpICYmICJMZWZ0IHRyZWUgY2Fubm90IGJlIGVtcHR5IHRvIGhhdmUgYSBoZWlnaHQgPj0gMiIpOworCisgICAgICBUcmVlVHkgKkxMID0gZ2V0TGVmdChMKTsKKyAgICAgIFRyZWVUeSAqTFIgPSBnZXRSaWdodChMKTsKKworICAgICAgaWYgKGdldEhlaWdodChMTCkgPj0gZ2V0SGVpZ2h0KExSKSkKKyAgICAgICAgcmV0dXJuIGNyZWF0ZU5vZGUoTEwsIEwsIGNyZWF0ZU5vZGUoTFIsVixSKSk7CisKKyAgICAgIGFzc2VydCghaXNFbXB0eShMUikgJiYgIkxSIGNhbm5vdCBiZSBlbXB0eSBiZWNhdXNlIGl0IGhhcyBhIGhlaWdodCA+PSAxIik7CisKKyAgICAgIFRyZWVUeSAqTFJMID0gZ2V0TGVmdChMUik7CisgICAgICBUcmVlVHkgKkxSUiA9IGdldFJpZ2h0KExSKTsKKworICAgICAgcmV0dXJuIGNyZWF0ZU5vZGUoY3JlYXRlTm9kZShMTCxMLExSTCksIExSLCBjcmVhdGVOb2RlKExSUixWLFIpKTsKKyAgICB9CisKKyAgICBpZiAoaHIgPiBobCArIDIpIHsKKyAgICAgIGFzc2VydCghaXNFbXB0eShSKSAmJiAiUmlnaHQgdHJlZSBjYW5ub3QgYmUgZW1wdHkgdG8gaGF2ZSBhIGhlaWdodCA+PSAyIik7CisKKyAgICAgIFRyZWVUeSAqUkwgPSBnZXRMZWZ0KFIpOworICAgICAgVHJlZVR5ICpSUiA9IGdldFJpZ2h0KFIpOworCisgICAgICBpZiAoZ2V0SGVpZ2h0KFJSKSA+PSBnZXRIZWlnaHQoUkwpKQorICAgICAgICByZXR1cm4gY3JlYXRlTm9kZShjcmVhdGVOb2RlKEwsVixSTCksIFIsIFJSKTsKKworICAgICAgYXNzZXJ0KCFpc0VtcHR5KFJMKSAmJiAiUkwgY2Fubm90IGJlIGVtcHR5IGJlY2F1c2UgaXQgaGFzIGEgaGVpZ2h0ID49IDEiKTsKKworICAgICAgVHJlZVR5ICpSTEwgPSBnZXRMZWZ0KFJMKTsKKyAgICAgIFRyZWVUeSAqUkxSID0gZ2V0UmlnaHQoUkwpOworCisgICAgICByZXR1cm4gY3JlYXRlTm9kZShjcmVhdGVOb2RlKEwsVixSTEwpLCBSTCwgY3JlYXRlTm9kZShSTFIsUixSUikpOworICAgIH0KKworICAgIHJldHVybiBjcmVhdGVOb2RlKEwsVixSKTsKKyAgfQorCisgIC8vLyBhZGRfaW50ZXJuYWwgLSBDcmVhdGVzIGEgbmV3IHRyZWUgdGhhdCBpbmNsdWRlcyB0aGUgc3BlY2lmaWVkCisgIC8vLyAgZGF0YSBhbmQgdGhlIGRhdGEgZnJvbSB0aGUgb3JpZ2luYWwgdHJlZS4gIElmIHRoZSBvcmlnaW5hbCB0cmVlCisgIC8vLyAgYWxyZWFkeSBjb250YWluZWQgdGhlIGRhdGEgaXRlbSwgdGhlIG9yaWdpbmFsIHRyZWUgaXMgcmV0dXJuZWQuCisgIFRyZWVUeSogYWRkX2ludGVybmFsKHZhbHVlX3R5cGVfcmVmIFYsIFRyZWVUeSogVCkgeworICAgIGlmIChpc0VtcHR5KFQpKQorICAgICAgcmV0dXJuIGNyZWF0ZU5vZGUoVCwgViwgVCk7CisgICAgYXNzZXJ0KCFULT5pc011dGFibGUoKSk7CisKKyAgICBrZXlfdHlwZV9yZWYgSyA9IEltdXRJbmZvOjpLZXlPZlZhbHVlKFYpOworICAgIGtleV90eXBlX3JlZiBLQ3VycmVudCA9IEltdXRJbmZvOjpLZXlPZlZhbHVlKGdldFZhbHVlKFQpKTsKKworICAgIGlmIChJbXV0SW5mbzo6aXNFcXVhbChLLEtDdXJyZW50KSkKKyAgICAgIHJldHVybiBjcmVhdGVOb2RlKGdldExlZnQoVCksIFYsIGdldFJpZ2h0KFQpKTsKKyAgICBlbHNlIGlmIChJbXV0SW5mbzo6aXNMZXNzKEssS0N1cnJlbnQpKQorICAgICAgcmV0dXJuIGJhbGFuY2VUcmVlKGFkZF9pbnRlcm5hbChWLCBnZXRMZWZ0KFQpKSwgZ2V0VmFsdWUoVCksIGdldFJpZ2h0KFQpKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gYmFsYW5jZVRyZWUoZ2V0TGVmdChUKSwgZ2V0VmFsdWUoVCksIGFkZF9pbnRlcm5hbChWLCBnZXRSaWdodChUKSkpOworICB9CisKKyAgLy8vIHJlbW92ZV9pbnRlcm5hbCAtIENyZWF0ZXMgYSBuZXcgdHJlZSB0aGF0IGluY2x1ZGVzIGFsbCB0aGUgZGF0YQorICAvLy8gIGZyb20gdGhlIG9yaWdpbmFsIHRyZWUgZXhjZXB0IHRoZSBzcGVjaWZpZWQgZGF0YS4gIElmIHRoZQorICAvLy8gIHNwZWNpZmllZCBkYXRhIGRpZCBub3QgZXhpc3QgaW4gdGhlIG9yaWdpbmFsIHRyZWUsIHRoZSBvcmlnaW5hbAorICAvLy8gIHRyZWUgaXMgcmV0dXJuZWQuCisgIFRyZWVUeSogcmVtb3ZlX2ludGVybmFsKGtleV90eXBlX3JlZiBLLCBUcmVlVHkqIFQpIHsKKyAgICBpZiAoaXNFbXB0eShUKSkKKyAgICAgIHJldHVybiBUOworCisgICAgYXNzZXJ0KCFULT5pc011dGFibGUoKSk7CisKKyAgICBrZXlfdHlwZV9yZWYgS0N1cnJlbnQgPSBJbXV0SW5mbzo6S2V5T2ZWYWx1ZShnZXRWYWx1ZShUKSk7CisKKyAgICBpZiAoSW11dEluZm86OmlzRXF1YWwoSyxLQ3VycmVudCkpIHsKKyAgICAgIHJldHVybiBjb21iaW5lVHJlZXMoZ2V0TGVmdChUKSwgZ2V0UmlnaHQoVCkpOworICAgIH0gZWxzZSBpZiAoSW11dEluZm86OmlzTGVzcyhLLEtDdXJyZW50KSkgeworICAgICAgcmV0dXJuIGJhbGFuY2VUcmVlKHJlbW92ZV9pbnRlcm5hbChLLCBnZXRMZWZ0KFQpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWUoVCksIGdldFJpZ2h0KFQpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGJhbGFuY2VUcmVlKGdldExlZnQoVCksIGdldFZhbHVlKFQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZV9pbnRlcm5hbChLLCBnZXRSaWdodChUKSkpOworICAgIH0KKyAgfQorCisgIFRyZWVUeSogY29tYmluZVRyZWVzKFRyZWVUeSogTCwgVHJlZVR5KiBSKSB7CisgICAgaWYgKGlzRW1wdHkoTCkpCisgICAgICByZXR1cm4gUjsKKyAgICBpZiAoaXNFbXB0eShSKSkKKyAgICAgIHJldHVybiBMOworICAgIFRyZWVUeSogT2xkTm9kZTsKKyAgICBUcmVlVHkqIG5ld1JpZ2h0ID0gcmVtb3ZlTWluQmluZGluZyhSLE9sZE5vZGUpOworICAgIHJldHVybiBiYWxhbmNlVHJlZShMLCBnZXRWYWx1ZShPbGROb2RlKSwgbmV3UmlnaHQpOworICB9CisKKyAgVHJlZVR5KiByZW1vdmVNaW5CaW5kaW5nKFRyZWVUeSogVCwgVHJlZVR5KiYgTm9kZXJlbW92ZWQpIHsKKyAgICBhc3NlcnQoIWlzRW1wdHkoVCkpOworICAgIGlmIChpc0VtcHR5KGdldExlZnQoVCkpKSB7CisgICAgICBOb2RlcmVtb3ZlZCA9IFQ7CisgICAgICByZXR1cm4gZ2V0UmlnaHQoVCk7CisgICAgfQorICAgIHJldHVybiBiYWxhbmNlVHJlZShyZW1vdmVNaW5CaW5kaW5nKGdldExlZnQoVCksIE5vZGVyZW1vdmVkKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWUoVCksIGdldFJpZ2h0KFQpKTsKKyAgfQorCisgIC8vLyBtYXJrSW1tdXRhYmxlIC0gQ2xlYXJzIHRoZSBtdXRhYmxlIGJpdHMgb2YgYSByb290IGFuZCBhbGwgb2YgaXRzCisgIC8vLyAgZGVzY2VuZGFudHMuCisgIHZvaWQgbWFya0ltbXV0YWJsZShUcmVlVHkqIFQpIHsKKyAgICBpZiAoIVQgfHwgIVQtPmlzTXV0YWJsZSgpKQorICAgICAgcmV0dXJuOworICAgIFQtPm1hcmtJbW11dGFibGUoKTsKKyAgICBtYXJrSW1tdXRhYmxlKGdldExlZnQoVCkpOworICAgIG1hcmtJbW11dGFibGUoZ2V0UmlnaHQoVCkpOworICB9CisKK3B1YmxpYzoKKyAgVHJlZVR5ICpnZXRDYW5vbmljYWxUcmVlKFRyZWVUeSAqVE5ldykgeworICAgIGlmICghVE5ldykKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgaWYgKFROZXctPklzQ2Fub25pY2FsaXplZCkKKyAgICAgIHJldHVybiBUTmV3OworCisgICAgLy8gU2VhcmNoIHRoZSBoYXNodGFibGUgZm9yIGFub3RoZXIgdHJlZSB3aXRoIHRoZSBzYW1lIGRpZ2VzdCwgYW5kCisgICAgLy8gaWYgZmluZCBhIGNvbGxpc2lvbiBjb21wYXJlIHRob3NlIHRyZWVzIGJ5IHRoZWlyIGNvbnRlbnRzLgorICAgIHVuc2lnbmVkIGRpZ2VzdCA9IFROZXctPmNvbXB1dGVEaWdlc3QoKTsKKyAgICBUcmVlVHkgKiZlbnRyeSA9IENhY2hlW21hc2tDYWNoZUluZGV4KGRpZ2VzdCldOworICAgIGRvIHsKKyAgICAgIGlmICghZW50cnkpCisgICAgICAgIGJyZWFrOworICAgICAgZm9yIChUcmVlVHkgKlQgPSBlbnRyeSA7IFQgIT0gbnVsbHB0cjsgVCA9IFQtPm5leHQpIHsKKyAgICAgICAgLy8gQ29tcGFyZSB0aGUgQ29udGVudHMoJ1QnKSB3aXRoIENvbnRlbnRzKCdUTmV3JykKKyAgICAgICAgdHlwZW5hbWUgVHJlZVR5OjppdGVyYXRvciBUSSA9IFQtPmJlZ2luKCksIFRFID0gVC0+ZW5kKCk7CisgICAgICAgIGlmICghY29tcGFyZVRyZWVXaXRoU2VjdGlvbihUTmV3LCBUSSwgVEUpKQorICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICBpZiAoVEkgIT0gVEUpCisgICAgICAgICAgY29udGludWU7IC8vIFQgaGFzIG1vcmUgY29udGVudHMgdGhhbiBUTmV3LgorICAgICAgICAvLyBUcmVlcyBkaWQgbWF0Y2ghICBSZXR1cm4gJ1QnLgorICAgICAgICBpZiAoVE5ldy0+cmVmQ291bnQgPT0gMCkKKyAgICAgICAgICBUTmV3LT5kZXN0cm95KCk7CisgICAgICAgIHJldHVybiBUOworICAgICAgfQorICAgICAgZW50cnktPnByZXYgPSBUTmV3OworICAgICAgVE5ldy0+bmV4dCA9IGVudHJ5OworICAgIH0KKyAgICB3aGlsZSAoZmFsc2UpOworCisgICAgZW50cnkgPSBUTmV3OworICAgIFROZXctPklzQ2Fub25pY2FsaXplZCA9IHRydWU7CisgICAgcmV0dXJuIFROZXc7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbW11dGFibGUgQVZMLVRyZWUgSXRlcmF0b3JzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGUgPHR5cGVuYW1lIEltdXRJbmZvPgorY2xhc3MgSW11dEFWTFRyZWVHZW5lcmljSXRlcmF0b3IKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbXV0QVZMVHJlZTxJbXV0SW5mbz4+IHsKKyAgU21hbGxWZWN0b3I8dWludHB0cl90LDIwPiBzdGFjazsKKworcHVibGljOgorICBlbnVtIFZpc2l0RmxhZyB7IFZpc2l0ZWROb25lPTB4MCwgVmlzaXRlZExlZnQ9MHgxLCBWaXNpdGVkUmlnaHQ9MHgzLAorICAgICAgICAgICAgICAgICAgIEZsYWdzPTB4MyB9OworCisgIHVzaW5nIFRyZWVUeSA9IEltdXRBVkxUcmVlPEltdXRJbmZvPjsKKworICBJbXV0QVZMVHJlZUdlbmVyaWNJdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgSW11dEFWTFRyZWVHZW5lcmljSXRlcmF0b3IoY29uc3QgVHJlZVR5ICpSb290KSB7CisgICAgaWYgKFJvb3QpIHN0YWNrLnB1c2hfYmFjayhyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oUm9vdCkpOworICB9CisKKyAgVHJlZVR5ICZvcGVyYXRvciooKSBjb25zdCB7CisgICAgYXNzZXJ0KCFzdGFjay5lbXB0eSgpKTsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8VHJlZVR5ICo+KHN0YWNrLmJhY2soKSAmIH5GbGFncyk7CisgIH0KKyAgVHJlZVR5ICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJip0aGlzOyB9CisKKyAgdWludHB0cl90IGdldFZpc2l0U3RhdGUoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFzdGFjay5lbXB0eSgpKTsKKyAgICByZXR1cm4gc3RhY2suYmFjaygpICYgRmxhZ3M7CisgIH0KKworICBib29sIGF0RW5kKCkgY29uc3QgeyByZXR1cm4gc3RhY2suZW1wdHkoKTsgfQorCisgIGJvb2wgYXRCZWdpbm5pbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YWNrLnNpemUoKSA9PSAxICYmIGdldFZpc2l0U3RhdGUoKSA9PSBWaXNpdGVkTm9uZTsKKyAgfQorCisgIHZvaWQgc2tpcFRvUGFyZW50KCkgeworICAgIGFzc2VydCghc3RhY2suZW1wdHkoKSk7CisgICAgc3RhY2sucG9wX2JhY2soKTsKKyAgICBpZiAoc3RhY2suZW1wdHkoKSkKKyAgICAgIHJldHVybjsKKyAgICBzd2l0Y2ggKGdldFZpc2l0U3RhdGUoKSkgeworICAgICAgY2FzZSBWaXNpdGVkTm9uZToKKyAgICAgICAgc3RhY2suYmFjaygpIHw9IFZpc2l0ZWRMZWZ0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVmlzaXRlZExlZnQ6CisgICAgICAgIHN0YWNrLmJhY2soKSB8PSBWaXNpdGVkUmlnaHQ7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5yZWFjaGFibGUuIik7CisgICAgfQorICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEltdXRBVkxUcmVlR2VuZXJpY0l0ZXJhdG9yICZ4KSBjb25zdCB7CisgICAgcmV0dXJuIHN0YWNrID09IHguc3RhY2s7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgSW11dEFWTFRyZWVHZW5lcmljSXRlcmF0b3IgJngpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSB4KTsKKyAgfQorCisgIEltdXRBVkxUcmVlR2VuZXJpY0l0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgIGFzc2VydCghc3RhY2suZW1wdHkoKSk7CisgICAgVHJlZVR5KiBDdXJyZW50ID0gcmVpbnRlcnByZXRfY2FzdDxUcmVlVHkqPihzdGFjay5iYWNrKCkgJiB+RmxhZ3MpOworICAgIGFzc2VydChDdXJyZW50KTsKKyAgICBzd2l0Y2ggKGdldFZpc2l0U3RhdGUoKSkgeworICAgICAgY2FzZSBWaXNpdGVkTm9uZToKKyAgICAgICAgaWYgKFRyZWVUeSogTCA9IEN1cnJlbnQtPmdldExlZnQoKSkKKyAgICAgICAgICBzdGFjay5wdXNoX2JhY2socmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KEwpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHN0YWNrLmJhY2soKSB8PSBWaXNpdGVkTGVmdDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFZpc2l0ZWRMZWZ0OgorICAgICAgICBpZiAoVHJlZVR5KiBSID0gQ3VycmVudC0+Z2V0UmlnaHQoKSkKKyAgICAgICAgICBzdGFjay5wdXNoX2JhY2socmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFIpKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHN0YWNrLmJhY2soKSB8PSBWaXNpdGVkUmlnaHQ7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBWaXNpdGVkUmlnaHQ6CisgICAgICAgIHNraXBUb1BhcmVudCgpOworICAgICAgICBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVucmVhY2hhYmxlLiIpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBJbXV0QVZMVHJlZUdlbmVyaWNJdGVyYXRvciAmb3BlcmF0b3ItLSgpIHsKKyAgICBhc3NlcnQoIXN0YWNrLmVtcHR5KCkpOworICAgIFRyZWVUeSogQ3VycmVudCA9IHJlaW50ZXJwcmV0X2Nhc3Q8VHJlZVR5Kj4oc3RhY2suYmFjaygpICYgfkZsYWdzKTsKKyAgICBhc3NlcnQoQ3VycmVudCk7CisgICAgc3dpdGNoIChnZXRWaXNpdFN0YXRlKCkpIHsKKyAgICAgIGNhc2UgVmlzaXRlZE5vbmU6CisgICAgICAgIHN0YWNrLnBvcF9iYWNrKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBWaXNpdGVkTGVmdDoKKyAgICAgICAgc3RhY2suYmFjaygpICY9IH5GbGFnczsgLy8gU2V0IHN0YXRlIHRvICJWaXNpdGVkTm9uZS4iCisgICAgICAgIGlmIChUcmVlVHkqIEwgPSBDdXJyZW50LT5nZXRMZWZ0KCkpCisgICAgICAgICAgc3RhY2sucHVzaF9iYWNrKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihMKSB8IFZpc2l0ZWRSaWdodCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBWaXNpdGVkUmlnaHQ6CisgICAgICAgIHN0YWNrLmJhY2soKSAmPSB+RmxhZ3M7CisgICAgICAgIHN0YWNrLmJhY2soKSB8PSBWaXNpdGVkTGVmdDsKKyAgICAgICAgaWYgKFRyZWVUeSogUiA9IEN1cnJlbnQtPmdldFJpZ2h0KCkpCisgICAgICAgICAgc3RhY2sucHVzaF9iYWNrKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihSKSB8IFZpc2l0ZWRSaWdodCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5yZWFjaGFibGUuIik7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEltdXRJbmZvPgorY2xhc3MgSW11dEFWTFRyZWVJbk9yZGVySXRlcmF0b3IKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbXV0QVZMVHJlZTxJbXV0SW5mbz4+IHsKKyAgdXNpbmcgSW50ZXJuYWxJdGVyYXRvclR5ID0gSW11dEFWTFRyZWVHZW5lcmljSXRlcmF0b3I8SW11dEluZm8+OworCisgIEludGVybmFsSXRlcmF0b3JUeSBJbnRlcm5hbEl0cjsKKworcHVibGljOgorICB1c2luZyBUcmVlVHkgPSBJbXV0QVZMVHJlZTxJbXV0SW5mbz47CisKKyAgSW11dEFWTFRyZWVJbk9yZGVySXRlcmF0b3IoY29uc3QgVHJlZVR5KiBSb290KSA6IEludGVybmFsSXRyKFJvb3QpIHsKKyAgICBpZiAoUm9vdCkKKyAgICAgICsrKnRoaXM7IC8vIEFkdmFuY2UgdG8gZmlyc3QgZWxlbWVudC4KKyAgfQorCisgIEltdXRBVkxUcmVlSW5PcmRlckl0ZXJhdG9yKCkgOiBJbnRlcm5hbEl0cigpIHt9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEltdXRBVkxUcmVlSW5PcmRlckl0ZXJhdG9yICZ4KSBjb25zdCB7CisgICAgcmV0dXJuIEludGVybmFsSXRyID09IHguSW50ZXJuYWxJdHI7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgSW11dEFWTFRyZWVJbk9yZGVySXRlcmF0b3IgJngpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSB4KTsKKyAgfQorCisgIFRyZWVUeSAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKkludGVybmFsSXRyOyB9CisgIFRyZWVUeSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYqSW50ZXJuYWxJdHI7IH0KKworICBJbXV0QVZMVHJlZUluT3JkZXJJdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICBkbyArK0ludGVybmFsSXRyOworICAgIHdoaWxlICghSW50ZXJuYWxJdHIuYXRFbmQoKSAmJgorICAgICAgICAgICBJbnRlcm5hbEl0ci5nZXRWaXNpdFN0YXRlKCkgIT0gSW50ZXJuYWxJdGVyYXRvclR5OjpWaXNpdGVkTGVmdCk7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBJbXV0QVZMVHJlZUluT3JkZXJJdGVyYXRvciAmb3BlcmF0b3ItLSgpIHsKKyAgICBkbyAtLUludGVybmFsSXRyOworICAgIHdoaWxlICghSW50ZXJuYWxJdHIuYXRCZWdpbm5pbmcoKSAmJgorICAgICAgICAgICBJbnRlcm5hbEl0ci5nZXRWaXNpdFN0YXRlKCkgIT0gSW50ZXJuYWxJdGVyYXRvclR5OjpWaXNpdGVkTGVmdCk7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkIHNraXBTdWJUcmVlKCkgeworICAgIEludGVybmFsSXRyLnNraXBUb1BhcmVudCgpOworCisgICAgd2hpbGUgKCFJbnRlcm5hbEl0ci5hdEVuZCgpICYmCisgICAgICAgICAgIEludGVybmFsSXRyLmdldFZpc2l0U3RhdGUoKSAhPSBJbnRlcm5hbEl0ZXJhdG9yVHk6OlZpc2l0ZWRMZWZ0KQorICAgICAgKytJbnRlcm5hbEl0cjsKKyAgfQorfTsKKworLy8vIEdlbmVyaWMgaXRlcmF0b3IgdGhhdCB3cmFwcyBhIFQ6OlRyZWVUeTo6aXRlcmF0b3IgYW5kIGV4cG9zZXMKKy8vLyBpdGVyYXRvcjo6Z2V0VmFsdWUoKSBvbiBkZXJlZmVyZW5jZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEltdXRBVkxWYWx1ZUl0ZXJhdG9yCisgICAgOiBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U8CisgICAgICAgICAgSW11dEFWTFZhbHVlSXRlcmF0b3I8VD4sIHR5cGVuYW1lIFQ6OlRyZWVUeTo6aXRlcmF0b3IsCisgICAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8CisgICAgICAgICAgICAgIHR5cGVuYW1lIFQ6OlRyZWVUeTo6aXRlcmF0b3I+OjppdGVyYXRvcl9jYXRlZ29yeSwKKyAgICAgICAgICBjb25zdCB0eXBlbmFtZSBUOjp2YWx1ZV90eXBlPiB7CisgIEltdXRBVkxWYWx1ZUl0ZXJhdG9yKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBJbXV0QVZMVmFsdWVJdGVyYXRvcih0eXBlbmFtZSBUOjpUcmVlVHkgKlRyZWUpCisgICAgICA6IEltdXRBVkxWYWx1ZUl0ZXJhdG9yOjppdGVyYXRvcl9hZGFwdG9yX2Jhc2UoVHJlZSkge30KKworICB0eXBlbmFtZSBJbXV0QVZMVmFsdWVJdGVyYXRvcjo6cmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+SS0+Z2V0VmFsdWUoKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRyYWl0IGNsYXNzZXMgZm9yIFByb2ZpbGUgaW5mb3JtYXRpb24uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gR2VuZXJpYyBwcm9maWxlIHRlbXBsYXRlLiAgVGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gaW52b2tlIHRoZQorLy8vIHByb2ZpbGUgbWV0aG9kIG9mIGFuIG9iamVjdC4gIFNwZWNpYWxpemF0aW9ucyBmb3IgcHJpbWl0aXZlIGludGVnZXJzCisvLy8gYW5kIGdlbmVyaWMgaGFuZGxpbmcgb2YgcG9pbnRlcnMgaXMgZG9uZSBiZWxvdy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEltdXRQcm9maWxlSW5mbyB7CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBjb25zdCBUOworICB1c2luZyB2YWx1ZV90eXBlX3JlZiA9IGNvbnN0IFQmOworCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQsIHZhbHVlX3R5cGVfcmVmIFgpIHsKKyAgICBGb2xkaW5nU2V0VHJhaXQ8VD46OlByb2ZpbGUoWCxJRCk7CisgIH0KK307CisKKy8vLyBQcm9maWxlIHRyYWl0cyBmb3IgaW50ZWdlcnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJbXV0UHJvZmlsZUludGVnZXIgeworICB1c2luZyB2YWx1ZV90eXBlID0gY29uc3QgVDsKKyAgdXNpbmcgdmFsdWVfdHlwZV9yZWYgPSBjb25zdCBUJjsKKworICBzdGF0aWMgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklELCB2YWx1ZV90eXBlX3JlZiBYKSB7CisgICAgSUQuQWRkSW50ZWdlcihYKTsKKyAgfQorfTsKKworI2RlZmluZSBQUk9GSUxFX0lOVEVHRVJfSU5GTyhYKVwKK3RlbXBsYXRlPD4gc3RydWN0IEltdXRQcm9maWxlSW5mbzxYPiA6IEltdXRQcm9maWxlSW50ZWdlcjxYPiB7fTsKKworUFJPRklMRV9JTlRFR0VSX0lORk8oY2hhcikKK1BST0ZJTEVfSU5URUdFUl9JTkZPKHVuc2lnbmVkIGNoYXIpCitQUk9GSUxFX0lOVEVHRVJfSU5GTyhzaG9ydCkKK1BST0ZJTEVfSU5URUdFUl9JTkZPKHVuc2lnbmVkIHNob3J0KQorUFJPRklMRV9JTlRFR0VSX0lORk8odW5zaWduZWQpCitQUk9GSUxFX0lOVEVHRVJfSU5GTyhzaWduZWQpCitQUk9GSUxFX0lOVEVHRVJfSU5GTyhsb25nKQorUFJPRklMRV9JTlRFR0VSX0lORk8odW5zaWduZWQgbG9uZykKK1BST0ZJTEVfSU5URUdFUl9JTkZPKGxvbmcgbG9uZykKK1BST0ZJTEVfSU5URUdFUl9JTkZPKHVuc2lnbmVkIGxvbmcgbG9uZykKKworI3VuZGVmIFBST0ZJTEVfSU5URUdFUl9JTkZPCisKKy8vLyBQcm9maWxlIHRyYWl0cyBmb3IgYm9vbGVhbnMuCit0ZW1wbGF0ZSA8Pgorc3RydWN0IEltdXRQcm9maWxlSW5mbzxib29sPiB7CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBjb25zdCBib29sOworICB1c2luZyB2YWx1ZV90eXBlX3JlZiA9IGNvbnN0IGJvb2wmOworCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQsIHZhbHVlX3R5cGVfcmVmIFgpIHsKKyAgICBJRC5BZGRCb29sZWFuKFgpOworICB9Cit9OworCisvLy8gR2VuZXJpYyBwcm9maWxlIHRyYWl0IGZvciBwb2ludGVyIHR5cGVzLiAgV2UgdHJlYXQgcG9pbnRlcnMgYXMKKy8vLyByZWZlcmVuY2VzIHRvIHVuaXF1ZSBvYmplY3RzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgSW11dFByb2ZpbGVJbmZvPFQqPiB7CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBjb25zdCBUKjsKKyAgdXNpbmcgdmFsdWVfdHlwZV9yZWYgPSB2YWx1ZV90eXBlOworCisgIHN0YXRpYyB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQsIHZhbHVlX3R5cGVfcmVmIFgpIHsKKyAgICBJRC5BZGRQb2ludGVyKFgpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVHJhaXQgY2xhc3NlcyB0aGF0IGNvbnRhaW4gZWxlbWVudCBjb21wYXJpc29uIG9wZXJhdG9ycyBhbmQgdHlwZQorLy8gIGRlZmluaXRpb25zIHVzZWQgYnkgSW11dEFWTFRyZWUsIEltbXV0YWJsZVNldCwgYW5kIEltbXV0YWJsZU1hcC4gIFRoZXNlCisvLyAgaW5oZXJpdCBmcm9tIHRoZSBwcm9maWxlIHRyYWl0cyAoSW11dFByb2ZpbGVJbmZvKSB0byBpbmNsdWRlIG9wZXJhdGlvbnMKKy8vICBmb3IgZWxlbWVudCBwcm9maWxpbmcuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gSW11dENvbnRhaW5lckluZm8gLSBHZW5lcmljIGRlZmluaXRpb24gb2YgY29tcGFyaXNvbiBvcGVyYXRpb25zIGZvcgorLy8vICAgZWxlbWVudHMgb2YgaW1tdXRhYmxlIGNvbnRhaW5lcnMgdGhhdCBkZWZhdWx0cyB0byB1c2luZworLy8vICAgc3RkOjplcXVhbF90bzw+IGFuZCBzdGQ6Omxlc3M8PiB0byBwZXJmb3JtIGNvbXBhcmlzb24gb2YgZWxlbWVudHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJbXV0Q29udGFpbmVySW5mbyA6IHB1YmxpYyBJbXV0UHJvZmlsZUluZm88VD4geworICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgSW11dFByb2ZpbGVJbmZvPFQ+Ojp2YWx1ZV90eXBlOworICB1c2luZyB2YWx1ZV90eXBlX3JlZiA9IHR5cGVuYW1lIEltdXRQcm9maWxlSW5mbzxUPjo6dmFsdWVfdHlwZV9yZWY7CisgIHVzaW5nIGtleV90eXBlID0gdmFsdWVfdHlwZTsKKyAgdXNpbmcga2V5X3R5cGVfcmVmID0gdmFsdWVfdHlwZV9yZWY7CisgIHVzaW5nIGRhdGFfdHlwZSA9IGJvb2w7CisgIHVzaW5nIGRhdGFfdHlwZV9yZWYgPSBib29sOworCisgIHN0YXRpYyBrZXlfdHlwZV9yZWYgS2V5T2ZWYWx1ZSh2YWx1ZV90eXBlX3JlZiBEKSB7IHJldHVybiBEOyB9CisgIHN0YXRpYyBkYXRhX3R5cGVfcmVmIERhdGFPZlZhbHVlKHZhbHVlX3R5cGVfcmVmKSB7IHJldHVybiB0cnVlOyB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChrZXlfdHlwZV9yZWYgTEhTLCBrZXlfdHlwZV9yZWYgUkhTKSB7CisgICAgcmV0dXJuIHN0ZDo6ZXF1YWxfdG88a2V5X3R5cGU+KCkoTEhTLFJIUyk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0xlc3Moa2V5X3R5cGVfcmVmIExIUywga2V5X3R5cGVfcmVmIFJIUykgeworICAgIHJldHVybiBzdGQ6Omxlc3M8a2V5X3R5cGU+KCkoTEhTLFJIUyk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0RhdGFFcXVhbChkYXRhX3R5cGVfcmVmLCBkYXRhX3R5cGVfcmVmKSB7IHJldHVybiB0cnVlOyB9Cit9OworCisvLy8gSW11dENvbnRhaW5lckluZm8gLSBTcGVjaWFsaXphdGlvbiBmb3IgcG9pbnRlciB2YWx1ZXMgdG8gdHJlYXQgcG9pbnRlcnMKKy8vLyAgYXMgcmVmZXJlbmNlcyB0byB1bmlxdWUgb2JqZWN0cy4gIFBvaW50ZXJzIGFyZSB0aHVzIGNvbXBhcmVkIGJ5CisvLy8gIHRoZWlyIGFkZHJlc3Nlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IEltdXRDb250YWluZXJJbmZvPFQqPiA6IHB1YmxpYyBJbXV0UHJvZmlsZUluZm88VCo+IHsKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIEltdXRQcm9maWxlSW5mbzxUKj46OnZhbHVlX3R5cGU7CisgIHVzaW5nIHZhbHVlX3R5cGVfcmVmID0gdHlwZW5hbWUgSW11dFByb2ZpbGVJbmZvPFQqPjo6dmFsdWVfdHlwZV9yZWY7CisgIHVzaW5nIGtleV90eXBlID0gdmFsdWVfdHlwZTsKKyAgdXNpbmcga2V5X3R5cGVfcmVmID0gdmFsdWVfdHlwZV9yZWY7CisgIHVzaW5nIGRhdGFfdHlwZSA9IGJvb2w7CisgIHVzaW5nIGRhdGFfdHlwZV9yZWYgPSBib29sOworCisgIHN0YXRpYyBrZXlfdHlwZV9yZWYgS2V5T2ZWYWx1ZSh2YWx1ZV90eXBlX3JlZiBEKSB7IHJldHVybiBEOyB9CisgIHN0YXRpYyBkYXRhX3R5cGVfcmVmIERhdGFPZlZhbHVlKHZhbHVlX3R5cGVfcmVmKSB7IHJldHVybiB0cnVlOyB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChrZXlfdHlwZV9yZWYgTEhTLCBrZXlfdHlwZV9yZWYgUkhTKSB7IHJldHVybiBMSFMgPT0gUkhTOyB9CisKKyAgc3RhdGljIGJvb2wgaXNMZXNzKGtleV90eXBlX3JlZiBMSFMsIGtleV90eXBlX3JlZiBSSFMpIHsgcmV0dXJuIExIUyA8IFJIUzsgfQorCisgIHN0YXRpYyBib29sIGlzRGF0YUVxdWFsKGRhdGFfdHlwZV9yZWYsIGRhdGFfdHlwZV9yZWYpIHsgcmV0dXJuIHRydWU7IH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbW11dGFibGUgU2V0CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsVCwgdHlwZW5hbWUgVmFsSW5mbyA9IEltdXRDb250YWluZXJJbmZvPFZhbFQ+PgorY2xhc3MgSW1tdXRhYmxlU2V0IHsKK3B1YmxpYzoKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIFZhbEluZm86OnZhbHVlX3R5cGU7CisgIHVzaW5nIHZhbHVlX3R5cGVfcmVmID0gdHlwZW5hbWUgVmFsSW5mbzo6dmFsdWVfdHlwZV9yZWY7CisgIHVzaW5nIFRyZWVUeSA9IEltdXRBVkxUcmVlPFZhbEluZm8+OworCitwcml2YXRlOgorICBUcmVlVHkgKlJvb3Q7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdHMgYSBzZXQgZnJvbSBhIHBvaW50ZXIgdG8gYSB0cmVlIHJvb3QuICBJbiBnZW5lcmFsIG9uZQorICAvLy8gc2hvdWxkIHVzZSBhIEZhY3Rvcnkgb2JqZWN0IHRvIGNyZWF0ZSBzZXRzIGluc3RlYWQgb2YgZGlyZWN0bHkKKyAgLy8vIGludm9raW5nIHRoZSBjb25zdHJ1Y3RvciwgYnV0IHRoZXJlIGFyZSBjYXNlcyB3aGVyZSBtYWtlIHRoaXMKKyAgLy8vIGNvbnN0cnVjdG9yIHB1YmxpYyBpcyB1c2VmdWwuCisgIGV4cGxpY2l0IEltbXV0YWJsZVNldChUcmVlVHkqIFIpIDogUm9vdChSKSB7CisgICAgaWYgKFJvb3QpIHsgUm9vdC0+cmV0YWluKCk7IH0KKyAgfQorCisgIEltbXV0YWJsZVNldChjb25zdCBJbW11dGFibGVTZXQgJlgpIDogUm9vdChYLlJvb3QpIHsKKyAgICBpZiAoUm9vdCkgeyBSb290LT5yZXRhaW4oKTsgfQorICB9CisKKyAgfkltbXV0YWJsZVNldCgpIHsKKyAgICBpZiAoUm9vdCkgeyBSb290LT5yZWxlYXNlKCk7IH0KKyAgfQorCisgIEltbXV0YWJsZVNldCAmb3BlcmF0b3I9KGNvbnN0IEltbXV0YWJsZVNldCAmWCkgeworICAgIGlmIChSb290ICE9IFguUm9vdCkgeworICAgICAgaWYgKFguUm9vdCkgeyBYLlJvb3QtPnJldGFpbigpOyB9CisgICAgICBpZiAoUm9vdCkgeyBSb290LT5yZWxlYXNlKCk7IH0KKyAgICAgIFJvb3QgPSBYLlJvb3Q7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNsYXNzIEZhY3RvcnkgeworICAgIHR5cGVuYW1lIFRyZWVUeTo6RmFjdG9yeSBGOworICAgIGNvbnN0IGJvb2wgQ2Fub25pY2FsaXplOworCisgIHB1YmxpYzoKKyAgICBGYWN0b3J5KGJvb2wgY2Fub25pY2FsaXplID0gdHJ1ZSkKKyAgICAgIDogQ2Fub25pY2FsaXplKGNhbm9uaWNhbGl6ZSkge30KKworICAgIEZhY3RvcnkoQnVtcFB0ckFsbG9jYXRvciYgQWxsb2MsIGJvb2wgY2Fub25pY2FsaXplID0gdHJ1ZSkKKyAgICAgIDogRihBbGxvYyksIENhbm9uaWNhbGl6ZShjYW5vbmljYWxpemUpIHt9CisKKyAgICBGYWN0b3J5KGNvbnN0IEZhY3RvcnkmIFJIUykgPSBkZWxldGU7CisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgRmFjdG9yeSYgUkhTKSA9IGRlbGV0ZTsKKworICAgIC8vLyBnZXRFbXB0eVNldCAtIFJldHVybnMgYW4gaW1tdXRhYmxlIHNldCB0aGF0IGNvbnRhaW5zIG5vIGVsZW1lbnRzLgorICAgIEltbXV0YWJsZVNldCBnZXRFbXB0eVNldCgpIHsKKyAgICAgIHJldHVybiBJbW11dGFibGVTZXQoRi5nZXRFbXB0eVRyZWUoKSk7CisgICAgfQorCisgICAgLy8vIGFkZCAtIENyZWF0ZXMgYSBuZXcgaW1tdXRhYmxlIHNldCB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUgdmFsdWVzCisgICAgLy8vICBvZiB0aGUgb3JpZ2luYWwgc2V0IHdpdGggdGhlIGFkZGl0aW9uIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUuICBJZgorICAgIC8vLyAgdGhlIG9yaWdpbmFsIHNldCBhbHJlYWR5IGluY2x1ZGVkIHRoZSB2YWx1ZSwgdGhlbiB0aGUgb3JpZ2luYWwgc2V0IGlzCisgICAgLy8vICByZXR1cm5lZCBhbmQgbm8gbWVtb3J5IGlzIGFsbG9jYXRlZC4gIFRoZSB0aW1lIGFuZCBzcGFjZSBjb21wbGV4aXR5CisgICAgLy8vICBvZiB0aGlzIG9wZXJhdGlvbiBpcyBsb2dhcml0aG1pYyBpbiB0aGUgc2l6ZSBvZiB0aGUgb3JpZ2luYWwgc2V0LgorICAgIC8vLyAgVGhlIG1lbW9yeSBhbGxvY2F0ZWQgdG8gcmVwcmVzZW50IHRoZSBzZXQgaXMgcmVsZWFzZWQgd2hlbiB0aGUKKyAgICAvLy8gIGZhY3Rvcnkgb2JqZWN0IHRoYXQgY3JlYXRlZCB0aGUgc2V0IGlzIGRlc3Ryb3llZC4KKyAgICBJbW11dGFibGVTZXQgYWRkKEltbXV0YWJsZVNldCBPbGQsIHZhbHVlX3R5cGVfcmVmIFYpIHsKKyAgICAgIFRyZWVUeSAqTmV3VCA9IEYuYWRkKE9sZC5Sb290LCBWKTsKKyAgICAgIHJldHVybiBJbW11dGFibGVTZXQoQ2Fub25pY2FsaXplID8gRi5nZXRDYW5vbmljYWxUcmVlKE5ld1QpIDogTmV3VCk7CisgICAgfQorCisgICAgLy8vIHJlbW92ZSAtIENyZWF0ZXMgYSBuZXcgaW1tdXRhYmxlIHNldCB0aGF0IGNvbnRhaW5zIGFsbCBvZiB0aGUgdmFsdWVzCisgICAgLy8vICBvZiB0aGUgb3JpZ2luYWwgc2V0IHdpdGggdGhlIGV4Y2VwdGlvbiBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLiAgSWYKKyAgICAvLy8gIHRoZSBvcmlnaW5hbCBzZXQgZGlkIG5vdCBjb250YWluIHRoZSB2YWx1ZSwgdGhlIG9yaWdpbmFsIHNldCBpcworICAgIC8vLyAgcmV0dXJuZWQgYW5kIG5vIG1lbW9yeSBpcyBhbGxvY2F0ZWQuICBUaGUgdGltZSBhbmQgc3BhY2UgY29tcGxleGl0eQorICAgIC8vLyAgb2YgdGhpcyBvcGVyYXRpb24gaXMgbG9nYXJpdGhtaWMgaW4gdGhlIHNpemUgb2YgdGhlIG9yaWdpbmFsIHNldC4KKyAgICAvLy8gIFRoZSBtZW1vcnkgYWxsb2NhdGVkIHRvIHJlcHJlc2VudCB0aGUgc2V0IGlzIHJlbGVhc2VkIHdoZW4gdGhlCisgICAgLy8vICBmYWN0b3J5IG9iamVjdCB0aGF0IGNyZWF0ZWQgdGhlIHNldCBpcyBkZXN0cm95ZWQuCisgICAgSW1tdXRhYmxlU2V0IHJlbW92ZShJbW11dGFibGVTZXQgT2xkLCB2YWx1ZV90eXBlX3JlZiBWKSB7CisgICAgICBUcmVlVHkgKk5ld1QgPSBGLnJlbW92ZShPbGQuUm9vdCwgVik7CisgICAgICByZXR1cm4gSW1tdXRhYmxlU2V0KENhbm9uaWNhbGl6ZSA/IEYuZ2V0Q2Fub25pY2FsVHJlZShOZXdUKSA6IE5ld1QpOworICAgIH0KKworICAgIEJ1bXBQdHJBbGxvY2F0b3ImIGdldEFsbG9jYXRvcigpIHsgcmV0dXJuIEYuZ2V0QWxsb2NhdG9yKCk7IH0KKworICAgIHR5cGVuYW1lIFRyZWVUeTo6RmFjdG9yeSAqZ2V0VHJlZUZhY3RvcnkoKSBjb25zdCB7CisgICAgICByZXR1cm4gY29uc3RfY2FzdDx0eXBlbmFtZSBUcmVlVHk6OkZhY3RvcnkgKj4oJkYpOworICAgIH0KKyAgfTsKKworICBmcmllbmQgY2xhc3MgRmFjdG9yeTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzZXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgYm9vbCBjb250YWlucyh2YWx1ZV90eXBlX3JlZiBWKSBjb25zdCB7CisgICAgcmV0dXJuIFJvb3QgPyBSb290LT5jb250YWlucyhWKSA6IGZhbHNlOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEltbXV0YWJsZVNldCAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFJvb3QgJiYgUkhTLlJvb3QgPyBSb290LT5pc0VxdWFsKCpSSFMuUm9vdCkgOiBSb290ID09IFJIUy5Sb290OworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEltbXV0YWJsZVNldCAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFJvb3QgJiYgUkhTLlJvb3QgPyBSb290LT5pc05vdEVxdWFsKCpSSFMuUm9vdCkgOiBSb290ICE9IFJIUy5Sb290OworICB9CisKKyAgVHJlZVR5ICpnZXRSb290KCkgeworICAgIGlmIChSb290KSB7IFJvb3QtPnJldGFpbigpOyB9CisgICAgcmV0dXJuIFJvb3Q7CisgIH0KKworICBUcmVlVHkgKmdldFJvb3RXaXRob3V0UmV0YWluKCkgY29uc3QgeworICAgIHJldHVybiBSb290OworICB9CisKKyAgLy8vIGlzRW1wdHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc2V0IGNvbnRhaW5zIG5vIGVsZW1lbnRzLgorICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiAhUm9vdDsgfQorCisgIC8vLyBpc1NpbmdsZXRvbiAtIFJldHVybiB0cnVlIGlmIHRoZSBzZXQgY29udGFpbnMgZXhhY3RseSBvbmUgZWxlbWVudC4KKyAgLy8vICAgVGhpcyBtZXRob2QgcnVucyBpbiBjb25zdGFudCB0aW1lLgorICBib29sIGlzU2luZ2xldG9uKCkgY29uc3QgeyByZXR1cm4gZ2V0SGVpZ2h0KCkgPT0gMTsgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDYWxsYmFjaz4KKyAgdm9pZCBmb3JlYWNoKENhbGxiYWNrJiBDKSB7IGlmIChSb290KSBSb290LT5mb3JlYWNoKEMpOyB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENhbGxiYWNrPgorICB2b2lkIGZvcmVhY2goKSB7IGlmIChSb290KSB7IENhbGxiYWNrIEM7IFJvb3QtPmZvcmVhY2goQyk7IH0gfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJdGVyYXRvcnMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIHVzaW5nIGl0ZXJhdG9yID0gSW11dEFWTFZhbHVlSXRlcmF0b3I8SW1tdXRhYmxlU2V0PjsKKworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKFJvb3QpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCk7IH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gVXRpbGl0eSBtZXRob2RzLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICB1bnNpZ25lZCBnZXRIZWlnaHQoKSBjb25zdCB7IHJldHVybiBSb290ID8gUm9vdC0+Z2V0SGVpZ2h0KCkgOiAwOyB9CisKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCwgY29uc3QgSW1tdXRhYmxlU2V0ICZTKSB7CisgICAgSUQuQWRkUG9pbnRlcihTLlJvb3QpOworICB9CisKKyAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCB7IHJldHVybiBQcm9maWxlKElELCAqdGhpcyk7IH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gRm9yIHRlc3RpbmcuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIHZvaWQgdmFsaWRhdGVUcmVlKCkgY29uc3QgeyBpZiAoUm9vdCkgUm9vdC0+dmFsaWRhdGVUcmVlKCk7IH0KK307CisKKy8vIE5PVEU6IFRoaXMgbWF5IHNvbWUgZGF5IHJlcGxhY2UgdGhlIGN1cnJlbnQgSW1tdXRhYmxlU2V0LgordGVtcGxhdGUgPHR5cGVuYW1lIFZhbFQsIHR5cGVuYW1lIFZhbEluZm8gPSBJbXV0Q29udGFpbmVySW5mbzxWYWxUPj4KK2NsYXNzIEltbXV0YWJsZVNldFJlZiB7CitwdWJsaWM6CisgIHVzaW5nIHZhbHVlX3R5cGUgPSB0eXBlbmFtZSBWYWxJbmZvOjp2YWx1ZV90eXBlOworICB1c2luZyB2YWx1ZV90eXBlX3JlZiA9IHR5cGVuYW1lIFZhbEluZm86OnZhbHVlX3R5cGVfcmVmOworICB1c2luZyBUcmVlVHkgPSBJbXV0QVZMVHJlZTxWYWxJbmZvPjsKKyAgdXNpbmcgRmFjdG9yeVR5ID0gdHlwZW5hbWUgVHJlZVR5OjpGYWN0b3J5OworCitwcml2YXRlOgorICBUcmVlVHkgKlJvb3Q7CisgIEZhY3RvcnlUeSAqRmFjdG9yeTsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0cyBhIHNldCBmcm9tIGEgcG9pbnRlciB0byBhIHRyZWUgcm9vdC4gIEluIGdlbmVyYWwgb25lCisgIC8vLyBzaG91bGQgdXNlIGEgRmFjdG9yeSBvYmplY3QgdG8gY3JlYXRlIHNldHMgaW5zdGVhZCBvZiBkaXJlY3RseQorICAvLy8gaW52b2tpbmcgdGhlIGNvbnN0cnVjdG9yLCBidXQgdGhlcmUgYXJlIGNhc2VzIHdoZXJlIG1ha2UgdGhpcworICAvLy8gY29uc3RydWN0b3IgcHVibGljIGlzIHVzZWZ1bC4KKyAgZXhwbGljaXQgSW1tdXRhYmxlU2V0UmVmKFRyZWVUeSogUiwgRmFjdG9yeVR5ICpGKQorICAgIDogUm9vdChSKSwKKyAgICAgIEZhY3RvcnkoRikgeworICAgIGlmIChSb290KSB7IFJvb3QtPnJldGFpbigpOyB9CisgIH0KKworICBJbW11dGFibGVTZXRSZWYoY29uc3QgSW1tdXRhYmxlU2V0UmVmICZYKQorICAgIDogUm9vdChYLlJvb3QpLAorICAgICAgRmFjdG9yeShYLkZhY3RvcnkpIHsKKyAgICBpZiAoUm9vdCkgeyBSb290LT5yZXRhaW4oKTsgfQorICB9CisKKyAgfkltbXV0YWJsZVNldFJlZigpIHsKKyAgICBpZiAoUm9vdCkgeyBSb290LT5yZWxlYXNlKCk7IH0KKyAgfQorCisgIEltbXV0YWJsZVNldFJlZiAmb3BlcmF0b3I9KGNvbnN0IEltbXV0YWJsZVNldFJlZiAmWCkgeworICAgIGlmIChSb290ICE9IFguUm9vdCkgeworICAgICAgaWYgKFguUm9vdCkgeyBYLlJvb3QtPnJldGFpbigpOyB9CisgICAgICBpZiAoUm9vdCkgeyBSb290LT5yZWxlYXNlKCk7IH0KKyAgICAgIFJvb3QgPSBYLlJvb3Q7CisgICAgICBGYWN0b3J5ID0gWC5GYWN0b3J5OworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBzdGF0aWMgSW1tdXRhYmxlU2V0UmVmIGdldEVtcHR5U2V0KEZhY3RvcnlUeSAqRikgeworICAgIHJldHVybiBJbW11dGFibGVTZXRSZWYoMCwgRik7CisgIH0KKworICBJbW11dGFibGVTZXRSZWYgYWRkKHZhbHVlX3R5cGVfcmVmIFYpIHsKKyAgICByZXR1cm4gSW1tdXRhYmxlU2V0UmVmKEZhY3RvcnktPmFkZChSb290LCBWKSwgRmFjdG9yeSk7CisgIH0KKworICBJbW11dGFibGVTZXRSZWYgcmVtb3ZlKHZhbHVlX3R5cGVfcmVmIFYpIHsKKyAgICByZXR1cm4gSW1tdXRhYmxlU2V0UmVmKEZhY3RvcnktPnJlbW92ZShSb290LCBWKSwgRmFjdG9yeSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzZXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgYm9vbCBjb250YWlucyh2YWx1ZV90eXBlX3JlZiBWKSBjb25zdCB7CisgICAgcmV0dXJuIFJvb3QgPyBSb290LT5jb250YWlucyhWKSA6IGZhbHNlOworICB9CisKKyAgSW1tdXRhYmxlU2V0PFZhbFQ+IGFzSW1tdXRhYmxlU2V0KGJvb2wgY2Fub25pY2FsaXplID0gdHJ1ZSkgY29uc3QgeworICAgIHJldHVybiBJbW11dGFibGVTZXQ8VmFsVD4oY2Fub25pY2FsaXplID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZhY3RvcnktPmdldENhbm9uaWNhbFRyZWUoUm9vdCkgOiBSb290KTsKKyAgfQorCisgIFRyZWVUeSAqZ2V0Um9vdFdpdGhvdXRSZXRhaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIFJvb3Q7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgSW1tdXRhYmxlU2V0UmVmICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gUm9vdCAmJiBSSFMuUm9vdCA/IFJvb3QtPmlzRXF1YWwoKlJIUy5Sb290KSA6IFJvb3QgPT0gUkhTLlJvb3Q7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgSW1tdXRhYmxlU2V0UmVmICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gUm9vdCAmJiBSSFMuUm9vdCA/IFJvb3QtPmlzTm90RXF1YWwoKlJIUy5Sb290KSA6IFJvb3QgIT0gUkhTLlJvb3Q7CisgIH0KKworICAvLy8gaXNFbXB0eSAtIFJldHVybiB0cnVlIGlmIHRoZSBzZXQgY29udGFpbnMgbm8gZWxlbWVudHMuCisgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICFSb290OyB9CisKKyAgLy8vIGlzU2luZ2xldG9uIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNldCBjb250YWlucyBleGFjdGx5IG9uZSBlbGVtZW50LgorICAvLy8gICBUaGlzIG1ldGhvZCBydW5zIGluIGNvbnN0YW50IHRpbWUuCisgIGJvb2wgaXNTaW5nbGV0b24oKSBjb25zdCB7IHJldHVybiBnZXRIZWlnaHQoKSA9PSAxOyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEl0ZXJhdG9ycy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgdXNpbmcgaXRlcmF0b3IgPSBJbXV0QVZMVmFsdWVJdGVyYXRvcjxJbW11dGFibGVTZXRSZWY+OworCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoUm9vdCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoKTsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBVdGlsaXR5IG1ldGhvZHMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIHVuc2lnbmVkIGdldEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIFJvb3QgPyBSb290LT5nZXRIZWlnaHQoKSA6IDA7IH0KKworICBzdGF0aWMgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklELCBjb25zdCBJbW11dGFibGVTZXRSZWYgJlMpIHsKKyAgICBJRC5BZGRQb2ludGVyKFMuUm9vdCk7CisgIH0KKworICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IHsgcmV0dXJuIFByb2ZpbGUoSUQsICp0aGlzKTsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBGb3IgdGVzdGluZy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgdm9pZCB2YWxpZGF0ZVRyZWUoKSBjb25zdCB7IGlmIChSb290KSBSb290LT52YWxpZGF0ZVRyZWUoKTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX0lNTVVUQUJMRVNFVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9JbmRleGVkTWFwLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9JbmRleGVkTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmVlODBkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0luZGV4ZWRNYXAuaApAQCAtMCwwICsxLDg1IEBACisvLz09PS0gbGx2bS9BRFQvSW5kZXhlZE1hcC5oIC0gQW4gaW5kZXggbWFwIGltcGxlbWVudGF0aW9uIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGFuIGluZGV4ZWQgbWFwLiBUaGUgaW5kZXggbWFwIHRlbXBsYXRlIHRha2VzIHR3bworLy8gdHlwZXMuIFRoZSBmaXJzdCBpcyB0aGUgbWFwcGVkIHR5cGUgYW5kIHRoZSBzZWNvbmQgaXMgYSBmdW5jdG9yCisvLyB0aGF0IG1hcHMgaXRzIGFyZ3VtZW50IHRvIGEgc2l6ZV90LiBPbiBpbnN0YW50aWF0aW9uIGEgIm51bGwiIHZhbHVlCisvLyBjYW4gYmUgcHJvdmlkZWQgdG8gYmUgdXNlZCBhcyBhICJkb2VzIG5vdCBleGlzdCIgaW5kaWNhdG9yIGluIHRoZQorLy8gbWFwLiBBIG1lbWJlciBmdW5jdGlvbiBncm93KCkgaXMgcHJvdmlkZWQgdGhhdCBnaXZlbiB0aGUgdmFsdWUgb2YKKy8vIHRoZSBtYXhpbWFsbHkgaW5kZXhlZCBrZXkgKHRoZSBhcmd1bWVudCBvZiB0aGUgZnVuY3RvcikgbWFrZXMgc3VyZQorLy8gdGhlIG1hcCBoYXMgZW5vdWdoIHNwYWNlIGZvciBpdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0lOREVYRURNQVBfSAorI2RlZmluZSBMTFZNX0FEVF9JTkRFWEVETUFQX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVG9JbmRleFQgPSBpZGVudGl0eTx1bnNpZ25lZD4+CisgIGNsYXNzIEluZGV4ZWRNYXAgeworICAgIHVzaW5nIEluZGV4VCA9IHR5cGVuYW1lIFRvSW5kZXhUOjphcmd1bWVudF90eXBlOworICAgIC8vIFByZWZlciBTbWFsbFZlY3RvciB3aXRoIHplcm8gaW5saW5lIHN0b3JhZ2Ugb3ZlciBzdGQ6OnZlY3Rvci4gSW5kZXhlZE1hcHMKKyAgICAvLyBjYW4gZ3JvdyB2ZXJ5IGxhcmdlIGFuZCBTbWFsbFZlY3RvciBncm93cyBtb3JlIGVmZmljaWVudGx5IGFzIGxvbmcgYXMgVAorICAgIC8vIGlzIHRyaXZpYWxseSBjb3B5YWJsZS4KKyAgICB1c2luZyBTdG9yYWdlVCA9IFNtYWxsVmVjdG9yPFQsIDA+OworCisgICAgU3RvcmFnZVQgc3RvcmFnZV87CisgICAgVCBudWxsVmFsXzsKKyAgICBUb0luZGV4VCB0b0luZGV4XzsKKworICBwdWJsaWM6CisgICAgSW5kZXhlZE1hcCgpIDogbnVsbFZhbF8oVCgpKSB7fQorCisgICAgZXhwbGljaXQgSW5kZXhlZE1hcChjb25zdCBUJiB2YWwpIDogbnVsbFZhbF8odmFsKSB7fQorCisgICAgdHlwZW5hbWUgU3RvcmFnZVQ6OnJlZmVyZW5jZSBvcGVyYXRvcltdKEluZGV4VCBuKSB7CisgICAgICBhc3NlcnQodG9JbmRleF8obikgPCBzdG9yYWdlXy5zaXplKCkgJiYgImluZGV4IG91dCBvZiBib3VuZHMhIik7CisgICAgICByZXR1cm4gc3RvcmFnZV9bdG9JbmRleF8obildOworICAgIH0KKworICAgIHR5cGVuYW1lIFN0b3JhZ2VUOjpjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShJbmRleFQgbikgY29uc3QgeworICAgICAgYXNzZXJ0KHRvSW5kZXhfKG4pIDwgc3RvcmFnZV8uc2l6ZSgpICYmICJpbmRleCBvdXQgb2YgYm91bmRzISIpOworICAgICAgcmV0dXJuIHN0b3JhZ2VfW3RvSW5kZXhfKG4pXTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2VydmUodHlwZW5hbWUgU3RvcmFnZVQ6OnNpemVfdHlwZSBzKSB7CisgICAgICBzdG9yYWdlXy5yZXNlcnZlKHMpOworICAgIH0KKworICAgIHZvaWQgcmVzaXplKHR5cGVuYW1lIFN0b3JhZ2VUOjpzaXplX3R5cGUgcykgeworICAgICAgc3RvcmFnZV8ucmVzaXplKHMsIG51bGxWYWxfKTsKKyAgICB9CisKKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgc3RvcmFnZV8uY2xlYXIoKTsKKyAgICB9CisKKyAgICB2b2lkIGdyb3coSW5kZXhUIG4pIHsKKyAgICAgIHVuc2lnbmVkIE5ld1NpemUgPSB0b0luZGV4XyhuKSArIDE7CisgICAgICBpZiAoTmV3U2l6ZSA+IHN0b3JhZ2VfLnNpemUoKSkKKyAgICAgICAgcmVzaXplKE5ld1NpemUpOworICAgIH0KKworICAgIGJvb2wgaW5Cb3VuZHMoSW5kZXhUIG4pIGNvbnN0IHsKKyAgICAgIHJldHVybiB0b0luZGV4XyhuKSA8IHN0b3JhZ2VfLnNpemUoKTsKKyAgICB9CisKKyAgICB0eXBlbmFtZSBTdG9yYWdlVDo6c2l6ZV90eXBlIHNpemUoKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RvcmFnZV8uc2l6ZSgpOworICAgIH0KKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX0lOREVYRURNQVBfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvSW50RXFDbGFzc2VzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9JbnRFcUNsYXNzZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmFlZTJmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvSW50RXFDbGFzc2VzLmgKQEAgLTAsMCArMSw4OCBAQAorLy89PT0tLSBsbHZtL0FEVC9JbnRFcUNsYXNzZXMuaCAtIEVxdWl2LiBDbGFzc2VzIG9mIEludGVnZXJzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBFcXVpdmFsZW5jZSBjbGFzc2VzIGZvciBzbWFsbCBpbnRlZ2Vycy4gVGhpcyBpcyBhIG1hcHBpbmcgb2YgdGhlIGludGVnZXJzCisvLyAwIC4uIE4tMSBpbnRvIE0gZXF1aXZhbGVuY2UgY2xhc3NlcyBudW1iZXJlZCAwIC4uIE0tMS4KKy8vCisvLyBJbml0aWFsbHkgZWFjaCBpbnRlZ2VyIGhhcyBpdHMgb3duIGVxdWl2YWxlbmNlIGNsYXNzLiBDbGFzc2VzIGFyZSBqb2luZWQgYnkKKy8vIHBhc3NpbmcgYSByZXByZXNlbnRhdGl2ZSBtZW1iZXIgb2YgZWFjaCBjbGFzcyB0byBqb2luKCkuCisvLworLy8gT25jZSB0aGUgY2xhc3NlcyBhcmUgYnVpbHQsIGNvbXByZXNzKCkgd2lsbCBudW1iZXIgdGhlbSAwIC4uIE0tMSBhbmQgcHJldmVudAorLy8gZnVydGhlciBjaGFuZ2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfSU5URVFDTEFTU0VTX0gKKyNkZWZpbmUgTExWTV9BRFRfSU5URVFDTEFTU0VTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgSW50RXFDbGFzc2VzIHsKKyAgLy8vIEVDIC0gV2hlbiB1bmNvbXByZXNzZWQsIG1hcCBlYWNoIGludGVnZXIgdG8gYSBzbWFsbGVyIG1lbWJlciBvZiBpdHMKKyAgLy8vIGVxdWl2YWxlbmNlIGNsYXNzLiBUaGUgY2xhc3MgbGVhZGVyIGlzIHRoZSBzbWFsbGVzdCBtZW1iZXIgYW5kIG1hcHMgdG8KKyAgLy8vIGl0c2VsZi4KKyAgLy8vCisgIC8vLyBXaGVuIGNvbXByZXNzZWQsIEVDW2ldIGlzIHRoZSBlcXVpdmFsZW5jZSBjbGFzcyBvZiBpLgorICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgOD4gRUM7CisKKyAgLy8vIE51bUNsYXNzZXMgLSBUaGUgbnVtYmVyIG9mIGVxdWl2YWxlbmNlIGNsYXNzZXMgd2hlbiBjb21wcmVzc2VkLCBvciAwIHdoZW4KKyAgLy8vIHVuY29tcHJlc3NlZC4KKyAgdW5zaWduZWQgTnVtQ2xhc3NlczsKKworcHVibGljOgorICAvLy8gSW50RXFDbGFzc2VzIC0gQ3JlYXRlIGFuIGVxdWl2YWxlbmNlIGNsYXNzIG1hcHBpbmcgZm9yIDAgLi4gTi0xLgorICBJbnRFcUNsYXNzZXModW5zaWduZWQgTiA9IDApIDogTnVtQ2xhc3NlcygwKSB7IGdyb3coTik7IH0KKworICAvLy8gZ3JvdyAtIEluY3JlYXNlIGNhcGFjaXR5IHRvIGhvbGQgMCAuLiBOLTEsIHB1dHRpbmcgbmV3IGludGVnZXJzIGluIHVuaXF1ZQorICAvLy8gZXF1aXZhbGVuY2UgY2xhc3Nlcy4KKyAgLy8vIFRoaXMgcmVxdWlyZXMgYW4gdW5jb21wcmVzc2VkIG1hcC4KKyAgdm9pZCBncm93KHVuc2lnbmVkIE4pOworCisgIC8vLyBjbGVhciAtIENsZWFyIGFsbCBjbGFzc2VzIHNvIHRoYXQgZ3JvdygpIHdpbGwgYXNzaWduIGEgdW5pcXVlIGNsYXNzIHRvCisgIC8vLyBldmVyeSBpbnRlZ2VyLgorICB2b2lkIGNsZWFyKCkgeworICAgIEVDLmNsZWFyKCk7CisgICAgTnVtQ2xhc3NlcyA9IDA7CisgIH0KKworICAvLy8gSm9pbiB0aGUgZXF1aXZhbGVuY2UgY2xhc3NlcyBvZiBhIGFuZCBiLiBBZnRlciBqb2luaW5nIGNsYXNzZXMsCisgIC8vLyBmaW5kTGVhZGVyKGEpID09IGZpbmRMZWFkZXIoYikuIFRoaXMgcmVxdWlyZXMgYW4gdW5jb21wcmVzc2VkIG1hcC4KKyAgLy8vIFJldHVybnMgdGhlIG5ldyBsZWFkZXIuCisgIHVuc2lnbmVkIGpvaW4odW5zaWduZWQgYSwgdW5zaWduZWQgYik7CisKKyAgLy8vIGZpbmRMZWFkZXIgLSBDb21wdXRlIHRoZSBsZWFkZXIgb2YgYSdzIGVxdWl2YWxlbmNlIGNsYXNzLiBUaGlzIGlzIHRoZQorICAvLy8gc21hbGxlc3QgbWVtYmVyIG9mIHRoZSBjbGFzcy4KKyAgLy8vIFRoaXMgcmVxdWlyZXMgYW4gdW5jb21wcmVzc2VkIG1hcC4KKyAgdW5zaWduZWQgZmluZExlYWRlcih1bnNpZ25lZCBhKSBjb25zdDsKKworICAvLy8gY29tcHJlc3MgLSBDb21wcmVzcyBlcXVpdmFsZW5jZSBjbGFzc2VzIGJ5IG51bWJlcmluZyB0aGVtIDAgLi4gTS4KKyAgLy8vIFRoaXMgbWFrZXMgdGhlIGVxdWl2YWxlbmNlIGNsYXNzIG1hcCBpbW11dGFibGUuCisgIHZvaWQgY29tcHJlc3MoKTsKKworICAvLy8gZ2V0TnVtQ2xhc3NlcyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIGVxdWl2YWxlbmNlIGNsYXNzZXMgYWZ0ZXIgY29tcHJlc3MoKQorICAvLy8gd2FzIGNhbGxlZC4KKyAgdW5zaWduZWQgZ2V0TnVtQ2xhc3NlcygpIGNvbnN0IHsgcmV0dXJuIE51bUNsYXNzZXM7IH0KKworICAvLy8gb3BlcmF0b3JbXSAtIFJldHVybiBhJ3MgZXF1aXZhbGVuY2UgY2xhc3MgbnVtYmVyLCAwIC4uIGdldE51bUNsYXNzZXMoKS0xLgorICAvLy8gVGhpcyByZXF1aXJlcyBhIGNvbXByZXNzZWQgbWFwLgorICB1bnNpZ25lZCBvcGVyYXRvcltdKHVuc2lnbmVkIGEpIGNvbnN0IHsKKyAgICBhc3NlcnQoTnVtQ2xhc3NlcyAmJiAib3BlcmF0b3JbXSBjYWxsZWQgYmVmb3JlIGNvbXByZXNzKCkiKTsKKyAgICByZXR1cm4gRUNbYV07CisgIH0KKworICAvLy8gdW5jb21wcmVzcyAtIENoYW5nZSBiYWNrIHRvIHRoZSB1bmNvbXByZXNzZWQgcmVwcmVzZW50YXRpb24gdGhhdCBhbGxvd3MKKyAgLy8vIGVkaXRpbmcuCisgIHZvaWQgdW5jb21wcmVzcygpOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9JbnRlcnZhbE1hcC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvSW50ZXJ2YWxNYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzEzNjY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvSW50ZXJ2YWxNYXAuaApAQCAtMCwwICsxLDIxNTggQEAKKy8vPT09LSBsbHZtL0FEVC9JbnRlcnZhbE1hcC5oIC0gQSBzb3J0ZWQgaW50ZXJ2YWwgbWFwIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSBjb2FsZXNjaW5nIGludGVydmFsIG1hcCBmb3Igc21hbGwgb2JqZWN0cy4KKy8vCisvLyBLZXlUIG9iamVjdHMgYXJlIG1hcHBlZCB0byBWYWxUIG9iamVjdHMuIEludGVydmFscyBvZiBrZXlzIHRoYXQgbWFwIHRvIHRoZQorLy8gc2FtZSB2YWx1ZSBhcmUgcmVwcmVzZW50ZWQgaW4gYSBjb21wcmVzc2VkIGZvcm0uCisvLworLy8gSXRlcmF0b3JzIHByb3ZpZGUgb3JkZXJlZCBhY2Nlc3MgdG8gdGhlIGNvbXByZXNzZWQgaW50ZXJ2YWxzIHJhdGhlciB0aGFuIHRoZQorLy8gaW5kaXZpZHVhbCBrZXlzLCBhbmQgaW5zZXJ0IGFuZCBlcmFzZSBvcGVyYXRpb25zIHVzZSBrZXkgaW50ZXJ2YWxzIGFzIHdlbGwuCisvLworLy8gTGlrZSBTbWFsbFZlY3RvciwgSW50ZXJ2YWxNYXAgd2lsbCBzdG9yZSB0aGUgZmlyc3QgTiBpbnRlcnZhbHMgaW4gdGhlIG1hcAorLy8gb2JqZWN0IGl0c2VsZiB3aXRob3V0IGFueSBhbGxvY2F0aW9ucy4gV2hlbiBzcGFjZSBpcyBleGhhdXN0ZWQgaXQgc3dpdGNoZXMgdG8KKy8vIGEgQistdHJlZSByZXByZXNlbnRhdGlvbiB3aXRoIHZlcnkgc21hbGwgb3ZlcmhlYWQgZm9yIHNtYWxsIGtleSBhbmQgdmFsdWUKKy8vIG9iamVjdHMuCisvLworLy8gQSBUcmFpdHMgY2xhc3Mgc3BlY2lmaWVzIGhvdyBrZXlzIGFyZSBjb21wYXJlZC4gSXQgYWxzbyBhbGxvd3MgSW50ZXJ2YWxNYXAgdG8KKy8vIHdvcmsgd2l0aCBib3RoIGNsb3NlZCBhbmQgaGFsZi1vcGVuIGludGVydmFscy4KKy8vCisvLyBLZXlzIGFuZCB2YWx1ZXMgYXJlIG5vdCBzdG9yZWQgbmV4dCB0byBlYWNoIG90aGVyIGluIGEgc3RkOjpwYWlyLCBzbyB3ZSBkb24ndAorLy8gcHJvdmlkZSBzdWNoIGEgdmFsdWVfdHlwZS4gRGVyZWZlcmVuY2luZyBpdGVyYXRvcnMgb25seSByZXR1cm5zIHRoZSBtYXBwZWQKKy8vIHZhbHVlLiBUaGUgaW50ZXJ2YWwgYm91bmRzIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIHN0YXJ0KCkgYW5kIHN0b3AoKQorLy8gaXRlcmF0b3IgbWV0aG9kcy4KKy8vCisvLyBJbnRlcnZhbE1hcCBpcyBvcHRpbWl6ZWQgZm9yIHNtYWxsIGtleSBhbmQgdmFsdWUgb2JqZWN0cywgNCBvciA4IGJ5dGVzIGVhY2gKKy8vIGlzIHRoZSBvcHRpbWFsIHNpemUuIEZvciBsYXJnZSBvYmplY3RzIHVzZSBzdGQ6Om1hcCBpbnN0ZWFkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gU3lub3BzaXM6CisvLworLy8gdGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KKy8vIGNsYXNzIEludGVydmFsTWFwIHsKKy8vIHB1YmxpYzoKKy8vICAgdHlwZWRlZiBLZXlUIGtleV90eXBlOworLy8gICB0eXBlZGVmIFZhbFQgbWFwcGVkX3R5cGU7CisvLyAgIHR5cGVkZWYgUmVjeWNsaW5nQWxsb2NhdG9yPC4uLj4gQWxsb2NhdG9yOworLy8gICBjbGFzcyBpdGVyYXRvcjsKKy8vICAgY2xhc3MgY29uc3RfaXRlcmF0b3I7CisvLworLy8gICBleHBsaWNpdCBJbnRlcnZhbE1hcChBbGxvY2F0b3ImKTsKKy8vICAgfkludGVydmFsTWFwKCk6CisvLworLy8gICBib29sIGVtcHR5KCkgY29uc3Q7CisvLyAgIEtleVQgc3RhcnQoKSBjb25zdDsKKy8vICAgS2V5VCBzdG9wKCkgY29uc3Q7CisvLyAgIFZhbFQgbG9va3VwKEtleVQgeCwgVmFsdWUgTm90Rm91bmQgPSBWYWx1ZSgpKSBjb25zdDsKKy8vCisvLyAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7CisvLyAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0OworLy8gICBpdGVyYXRvciBiZWdpbigpOworLy8gICBpdGVyYXRvciBlbmQoKTsKKy8vICAgY29uc3RfaXRlcmF0b3IgZmluZChLZXlUIHgpIGNvbnN0OworLy8gICBpdGVyYXRvciBmaW5kKEtleVQgeCk7CisvLworLy8gICB2b2lkIGluc2VydChLZXlUIGEsIEtleVQgYiwgVmFsVCB5KTsKKy8vICAgdm9pZCBjbGVhcigpOworLy8gfTsKKy8vCisvLyB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwgdW5zaWduZWQgTiwgdHlwZW5hbWUgVHJhaXRzPgorLy8gY2xhc3MgSW50ZXJ2YWxNYXA6OmNvbnN0X2l0ZXJhdG9yIDoKKy8vICAgcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZywgVmFsVD4geworLy8gcHVibGljOgorLy8gICBib29sIG9wZXJhdG9yPT0oY29uc3QgY29uc3RfaXRlcmF0b3IgJikgY29uc3Q7CisvLyAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBjb25zdF9pdGVyYXRvciAmKSBjb25zdDsKKy8vICAgYm9vbCB2YWxpZCgpIGNvbnN0OworLy8KKy8vICAgY29uc3QgS2V5VCAmc3RhcnQoKSBjb25zdDsKKy8vICAgY29uc3QgS2V5VCAmc3RvcCgpIGNvbnN0OworLy8gICBjb25zdCBWYWxUICZ2YWx1ZSgpIGNvbnN0OworLy8gICBjb25zdCBWYWxUICZvcGVyYXRvciooKSBjb25zdDsKKy8vICAgY29uc3QgVmFsVCAqb3BlcmF0b3ItPigpIGNvbnN0OworLy8KKy8vICAgY29uc3RfaXRlcmF0b3IgJm9wZXJhdG9yKysoKTsKKy8vICAgY29uc3RfaXRlcmF0b3IgJm9wZXJhdG9yKysoaW50KTsKKy8vICAgY29uc3RfaXRlcmF0b3IgJm9wZXJhdG9yLS0oKTsKKy8vICAgY29uc3RfaXRlcmF0b3IgJm9wZXJhdG9yLS0oaW50KTsKKy8vICAgdm9pZCBnb1RvQmVnaW4oKTsKKy8vICAgdm9pZCBnb1RvRW5kKCk7CisvLyAgIHZvaWQgZmluZChLZXlUIHgpOworLy8gICB2b2lkIGFkdmFuY2VUbyhLZXlUIHgpOworLy8gfTsKKy8vCisvLyB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwgdW5zaWduZWQgTiwgdHlwZW5hbWUgVHJhaXRzPgorLy8gY2xhc3MgSW50ZXJ2YWxNYXA6Oml0ZXJhdG9yIDogcHVibGljIGNvbnN0X2l0ZXJhdG9yIHsKKy8vIHB1YmxpYzoKKy8vICAgdm9pZCBpbnNlcnQoS2V5VCBhLCBLZXlUIGIsIFZhbHVlIHkpOworLy8gICB2b2lkIGVyYXNlKCk7CisvLyB9OworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfSU5URVJWQUxNQVBfSAorI2RlZmluZSBMTFZNX0FEVF9JTlRFUlZBTE1BUF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsaWduT2YuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1JlY3ljbGluZ0FsbG9jYXRvci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLS0tICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5IHRyYWl0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoZSBJbnRlcnZhbE1hcCB3b3JrcyB3aXRoIGNsb3NlZCBvciBoYWxmLW9wZW4gaW50ZXJ2YWxzLgorLy8gQWRqYWNlbnQgaW50ZXJ2YWxzIHRoYXQgbWFwIHRvIHRoZSBzYW1lIHZhbHVlIGFyZSBjb2FsZXNjZWQuCisvLworLy8gVGhlIEludGVydmFsTWFwSW5mbyB0cmFpdHMgY2xhc3MgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBrZXkgaXMgY29udGFpbmVkCisvLyBpbiBhbiBpbnRlcnZhbCwgYW5kIGlmIHR3byBpbnRlcnZhbHMgYXJlIGFkamFjZW50IHNvIHRoZXkgY2FuIGJlIGNvYWxlc2NlZC4KKy8vIFRoZSBwcm92aWRlZCBpbXBsZW1lbnRhdGlvbiB3b3JrcyBmb3IgY2xvc2VkIGludGVnZXIgaW50ZXJ2YWxzLCBvdGhlciBrZXlzCisvLyBwcm9iYWJseSBuZWVkIGEgc3BlY2lhbGl6ZWQgdmVyc2lvbi4KKy8vCisvLyBUaGUgcG9pbnQgeCBpcyBjb250YWluZWQgaW4gW2E7Yl0gd2hlbiAhc3RhcnRMZXNzKHgsIGEpICYmICFzdG9wTGVzcyhiLCB4KS4KKy8vCisvLyBJdCBpcyBhc3N1bWVkIHRoYXQgKGE7Yl0gaGFsZi1vcGVuIGludGVydmFscyBhcmUgbm90IHVzZWQsIG9ubHkgW2E7YikgaXMKKy8vIGFsbG93ZWQuIFRoaXMgaXMgc28gdGhhdCBzdG9wTGVzcyhhLCBiKSBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgdHdvCisvLyBpbnRlcnZhbHMgb3ZlcmxhcC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJbnRlcnZhbE1hcEluZm8geworICAvLy8gc3RhcnRMZXNzIC0gUmV0dXJuIHRydWUgaWYgeCBpcyBub3QgaW4gW2E7Yl0uCisgIC8vLyBUaGlzIGlzIHggPCBhIGJvdGggZm9yIGNsb3NlZCBpbnRlcnZhbHMgYW5kIGZvciBbYTtiKSBoYWxmLW9wZW4gaW50ZXJ2YWxzLgorICBzdGF0aWMgaW5saW5lIGJvb2wgc3RhcnRMZXNzKGNvbnN0IFQgJngsIGNvbnN0IFQgJmEpIHsKKyAgICByZXR1cm4geCA8IGE7CisgIH0KKworICAvLy8gc3RvcExlc3MgLSBSZXR1cm4gdHJ1ZSBpZiB4IGlzIG5vdCBpbiBbYTtiXS4KKyAgLy8vIFRoaXMgaXMgYiA8IHggZm9yIGEgY2xvc2VkIGludGVydmFsLCBiIDw9IHggZm9yIFthO2IpIGhhbGYtb3BlbiBpbnRlcnZhbHMuCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBzdG9wTGVzcyhjb25zdCBUICZiLCBjb25zdCBUICZ4KSB7CisgICAgcmV0dXJuIGIgPCB4OworICB9CisKKyAgLy8vIGFkamFjZW50IC0gUmV0dXJuIHRydWUgd2hlbiB0aGUgaW50ZXJ2YWxzIFt4O2FdIGFuZCBbYjt5XSBjYW4gY29hbGVzY2UuCisgIC8vLyBUaGlzIGlzIGErMSA9PSBiIGZvciBjbG9zZWQgaW50ZXJ2YWxzLCBhID09IGIgZm9yIGhhbGYtb3BlbiBpbnRlcnZhbHMuCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBhZGphY2VudChjb25zdCBUICZhLCBjb25zdCBUICZiKSB7CisgICAgcmV0dXJuIGErMSA9PSBiOworICB9CisKKyAgLy8vIG5vbkVtcHR5IC0gUmV0dXJuIHRydWUgaWYgW2E7Yl0gaXMgbm9uLWVtcHR5LgorICAvLy8gVGhpcyBpcyBhIDw9IGIgZm9yIGEgY2xvc2VkIGludGVydmFsLCBhIDwgYiBmb3IgW2E7YikgaGFsZi1vcGVuIGludGVydmFscy4KKyAgc3RhdGljIGlubGluZSBib29sIG5vbkVtcHR5KGNvbnN0IFQgJmEsIGNvbnN0IFQgJmIpIHsKKyAgICByZXR1cm4gYSA8PSBiOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBJbnRlcnZhbE1hcEhhbGZPcGVuSW5mbyB7CisgIC8vLyBzdGFydExlc3MgLSBSZXR1cm4gdHJ1ZSBpZiB4IGlzIG5vdCBpbiBbYTtiKS4KKyAgc3RhdGljIGlubGluZSBib29sIHN0YXJ0TGVzcyhjb25zdCBUICZ4LCBjb25zdCBUICZhKSB7CisgICAgcmV0dXJuIHggPCBhOworICB9CisKKyAgLy8vIHN0b3BMZXNzIC0gUmV0dXJuIHRydWUgaWYgeCBpcyBub3QgaW4gW2E7YikuCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBzdG9wTGVzcyhjb25zdCBUICZiLCBjb25zdCBUICZ4KSB7CisgICAgcmV0dXJuIGIgPD0geDsKKyAgfQorCisgIC8vLyBhZGphY2VudCAtIFJldHVybiB0cnVlIHdoZW4gdGhlIGludGVydmFscyBbeDthKSBhbmQgW2I7eSkgY2FuIGNvYWxlc2NlLgorICBzdGF0aWMgaW5saW5lIGJvb2wgYWRqYWNlbnQoY29uc3QgVCAmYSwgY29uc3QgVCAmYikgeworICAgIHJldHVybiBhID09IGI7CisgIH0KKworICAvLy8gbm9uRW1wdHkgLSBSZXR1cm4gdHJ1ZSBpZiBbYTtiKSBpcyBub24tZW1wdHkuCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBub25FbXB0eShjb25zdCBUICZhLCBjb25zdCBUICZiKSB7CisgICAgcmV0dXJuIGEgPCBiOworICB9Cit9OworCisvLy8gSW50ZXJ2YWxNYXBJbXBsIC0gTmFtZXNwYWNlIHVzZWQgZm9yIEludGVydmFsTWFwIGltcGxlbWVudGF0aW9uIGRldGFpbHMuCisvLy8gSXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgcHJpdmF0ZSB0byB0aGUgaW1wbGVtZW50YXRpb24uCituYW1lc3BhY2UgSW50ZXJ2YWxNYXBJbXBsIHsKKwordXNpbmcgSWR4UGFpciA9IHN0ZDo6cGFpcjx1bnNpZ25lZCx1bnNpZ25lZD47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy0tLSAgICAgICAgICAgICAgICAgICAgSW50ZXJ2YWxNYXBJbXBsOjpOb2RlQmFzZSAgICAgICAgICAgICAgICAgICAgICAgICAtLS0vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBCb3RoIGxlYWYgYW5kIGJyYW5jaCBub2RlcyBzdG9yZSB2ZWN0b3JzIG9mIHBhaXJzLgorLy8gTGVhdmVzIHN0b3JlICgoS2V5VCwgS2V5VCksIFZhbFQpIHBhaXJzLCBicmFuY2hlcyB1c2UgKE5vZGVSZWYsIEtleVQpLgorLy8KKy8vIEtleXMgYW5kIHZhbHVlcyBhcmUgc3RvcmVkIGluIHNlcGFyYXRlIGFycmF5cyB0byBhdm9pZCBwYWRkaW5nIGNhdXNlZCBieQorLy8gZGlmZmVyZW50IG9iamVjdCBhbGlnbm1lbnRzLiBUaGlzIGFsc28gaGVscHMgaW1wcm92ZSBsb2NhbGl0eSBvZiByZWZlcmVuY2UKKy8vIHdoZW4gc2VhcmNoaW5nIHRoZSBrZXlzLgorLy8KKy8vIFRoZSBub2RlcyBkb24ndCBrbm93IGhvdyBtYW55IGVsZW1lbnRzIHRoZXkgY29udGFpbiAtIHRoYXQgaW5mb3JtYXRpb24gaXMKKy8vIHN0b3JlZCBlbHNld2hlcmUuIE9taXR0aW5nIHRoZSBzaXplIGZpZWxkIHByZXZlbnRzIHBhZGRpbmcgYW5kIGFsbG93cyBhIG5vZGUKKy8vIHRvIGZpbGwgdGhlIGFsbG9jYXRlZCBjYWNoZSBsaW5lcyBjb21wbGV0ZWx5LgorLy8KKy8vIFRoZXNlIGFyZSB0eXBpY2FsIGtleSBhbmQgdmFsdWUgc2l6ZXMsIHRoZSBub2RlIGJyYW5jaGluZyBmYWN0b3IgKE4pLCBhbmQKKy8vIHdhc3RlZCBzcGFjZSB3aGVuIG5vZGVzIGFyZSBzaXplZCB0byBmaXQgaW4gdGhyZWUgY2FjaGUgbGluZXMgKDE5MiBieXRlcyk6CisvLworLy8gICBUMSAgVDIgICBOIFdhc3RlICBVc2VkIGJ5CisvLyAgICA0ICAgNCAgMjQgICAwICAgIEJyYW5jaDw0PiAoMzItYml0IHBvaW50ZXJzKQorLy8gICAgOCAgIDQgIDE2ICAgMCAgICBMZWFmPDQsND4sIEJyYW5jaDw0PgorLy8gICAgOCAgIDggIDEyICAgMCAgICBMZWFmPDQsOD4sIEJyYW5jaDw4PgorLy8gICAxNiAgIDQgICA5ICAxMiAgICBMZWFmPDgsND4KKy8vICAgMTYgICA4ICAgOCAgIDAgICAgTGVhZjw4LDg+CisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdW5zaWduZWQgTj4KK2NsYXNzIE5vZGVCYXNlIHsKK3B1YmxpYzoKKyAgZW51bSB7IENhcGFjaXR5ID0gTiB9OworCisgIFQxIGZpcnN0W05dOworICBUMiBzZWNvbmRbTl07CisKKyAgLy8vIGNvcHkgLSBDb3B5IGVsZW1lbnRzIGZyb20gYW5vdGhlciBub2RlLgorICAvLy8gQHBhcmFtIE90aGVyIE5vZGUgZWxlbWVudHMgYXJlIGNvcGllZCBmcm9tLgorICAvLy8gQHBhcmFtIGkgICAgIEJlZ2lubmluZyBvZiB0aGUgc291cmNlIHJhbmdlIGluIG90aGVyLgorICAvLy8gQHBhcmFtIGogICAgIEJlZ2lubmluZyBvZiB0aGUgZGVzdGluYXRpb24gcmFuZ2UgaW4gdGhpcy4KKyAgLy8vIEBwYXJhbSBDb3VudCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gY29weS4KKyAgdGVtcGxhdGUgPHVuc2lnbmVkIE0+CisgIHZvaWQgY29weShjb25zdCBOb2RlQmFzZTxUMSwgVDIsIE0+ICZPdGhlciwgdW5zaWduZWQgaSwKKyAgICAgICAgICAgIHVuc2lnbmVkIGosIHVuc2lnbmVkIENvdW50KSB7CisgICAgYXNzZXJ0KGkgKyBDb3VudCA8PSBNICYmICJJbnZhbGlkIHNvdXJjZSByYW5nZSIpOworICAgIGFzc2VydChqICsgQ291bnQgPD0gTiAmJiAiSW52YWxpZCBkZXN0IHJhbmdlIik7CisgICAgZm9yICh1bnNpZ25lZCBlID0gaSArIENvdW50OyBpICE9IGU7ICsraSwgKytqKSB7CisgICAgICBmaXJzdFtqXSAgPSBPdGhlci5maXJzdFtpXTsKKyAgICAgIHNlY29uZFtqXSA9IE90aGVyLnNlY29uZFtpXTsKKyAgICB9CisgIH0KKworICAvLy8gbW92ZUxlZnQgLSBNb3ZlIGVsZW1lbnRzIHRvIHRoZSBsZWZ0LgorICAvLy8gQHBhcmFtIGkgICAgIEJlZ2lubmluZyBvZiB0aGUgc291cmNlIHJhbmdlLgorICAvLy8gQHBhcmFtIGogICAgIEJlZ2lubmluZyBvZiB0aGUgZGVzdGluYXRpb24gcmFuZ2UuCisgIC8vLyBAcGFyYW0gQ291bnQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIGNvcHkuCisgIHZvaWQgbW92ZUxlZnQodW5zaWduZWQgaSwgdW5zaWduZWQgaiwgdW5zaWduZWQgQ291bnQpIHsKKyAgICBhc3NlcnQoaiA8PSBpICYmICJVc2UgbW92ZVJpZ2h0IHNoaWZ0IGVsZW1lbnRzIHJpZ2h0Iik7CisgICAgY29weSgqdGhpcywgaSwgaiwgQ291bnQpOworICB9CisKKyAgLy8vIG1vdmVSaWdodCAtIE1vdmUgZWxlbWVudHMgdG8gdGhlIHJpZ2h0LgorICAvLy8gQHBhcmFtIGkgICAgIEJlZ2lubmluZyBvZiB0aGUgc291cmNlIHJhbmdlLgorICAvLy8gQHBhcmFtIGogICAgIEJlZ2lubmluZyBvZiB0aGUgZGVzdGluYXRpb24gcmFuZ2UuCisgIC8vLyBAcGFyYW0gQ291bnQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIGNvcHkuCisgIHZvaWQgbW92ZVJpZ2h0KHVuc2lnbmVkIGksIHVuc2lnbmVkIGosIHVuc2lnbmVkIENvdW50KSB7CisgICAgYXNzZXJ0KGkgPD0gaiAmJiAiVXNlIG1vdmVMZWZ0IHNoaWZ0IGVsZW1lbnRzIGxlZnQiKTsKKyAgICBhc3NlcnQoaiArIENvdW50IDw9IE4gJiYgIkludmFsaWQgcmFuZ2UiKTsKKyAgICB3aGlsZSAoQ291bnQtLSkgeworICAgICAgZmlyc3RbaiArIENvdW50XSAgPSBmaXJzdFtpICsgQ291bnRdOworICAgICAgc2Vjb25kW2ogKyBDb3VudF0gPSBzZWNvbmRbaSArIENvdW50XTsKKyAgICB9CisgIH0KKworICAvLy8gZXJhc2UgLSBFcmFzZSBlbGVtZW50cyBbaTtqKS4KKyAgLy8vIEBwYXJhbSBpICAgIEJlZ2lubmluZyBvZiB0aGUgcmFuZ2UgdG8gZXJhc2UuCisgIC8vLyBAcGFyYW0gaiAgICBFbmQgb2YgdGhlIHJhbmdlLiAoRXhjbHVzaXZlKS4KKyAgLy8vIEBwYXJhbSBTaXplIE51bWJlciBvZiBlbGVtZW50cyBpbiBub2RlLgorICB2b2lkIGVyYXNlKHVuc2lnbmVkIGksIHVuc2lnbmVkIGosIHVuc2lnbmVkIFNpemUpIHsKKyAgICBtb3ZlTGVmdChqLCBpLCBTaXplIC0gaik7CisgIH0KKworICAvLy8gZXJhc2UgLSBFcmFzZSBlbGVtZW50IGF0IGkuCisgIC8vLyBAcGFyYW0gaSAgICBJbmRleCBvZiBlbGVtZW50IHRvIGVyYXNlLgorICAvLy8gQHBhcmFtIFNpemUgTnVtYmVyIG9mIGVsZW1lbnRzIGluIG5vZGUuCisgIHZvaWQgZXJhc2UodW5zaWduZWQgaSwgdW5zaWduZWQgU2l6ZSkgeworICAgIGVyYXNlKGksIGkrMSwgU2l6ZSk7CisgIH0KKworICAvLy8gc2hpZnQgLSBTaGlmdCBlbGVtZW50cyBbaTtzaXplKSAxIHBvc2l0aW9uIHRvIHRoZSByaWdodC4KKyAgLy8vIEBwYXJhbSBpICAgIEJlZ2lubmluZyBvZiB0aGUgcmFuZ2UgdG8gbW92ZS4KKyAgLy8vIEBwYXJhbSBTaXplIE51bWJlciBvZiBlbGVtZW50cyBpbiBub2RlLgorICB2b2lkIHNoaWZ0KHVuc2lnbmVkIGksIHVuc2lnbmVkIFNpemUpIHsKKyAgICBtb3ZlUmlnaHQoaSwgaSArIDEsIFNpemUgLSBpKTsKKyAgfQorCisgIC8vLyB0cmFuc2ZlclRvTGVmdFNpYiAtIFRyYW5zZmVyIGVsZW1lbnRzIHRvIGEgbGVmdCBzaWJsaW5nIG5vZGUuCisgIC8vLyBAcGFyYW0gU2l6ZSAgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMuCisgIC8vLyBAcGFyYW0gU2liICAgTGVmdCBzaWJsaW5nIG5vZGUuCisgIC8vLyBAcGFyYW0gU1NpemUgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHNpYi4KKyAgLy8vIEBwYXJhbSBDb3VudCBOdW1iZXIgb2YgZWxlbWVudHMgdG8gdHJhbnNmZXIuCisgIHZvaWQgdHJhbnNmZXJUb0xlZnRTaWIodW5zaWduZWQgU2l6ZSwgTm9kZUJhc2UgJlNpYiwgdW5zaWduZWQgU1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ291bnQpIHsKKyAgICBTaWIuY29weSgqdGhpcywgMCwgU1NpemUsIENvdW50KTsKKyAgICBlcmFzZSgwLCBDb3VudCwgU2l6ZSk7CisgIH0KKworICAvLy8gdHJhbnNmZXJUb1JpZ2h0U2liIC0gVHJhbnNmZXIgZWxlbWVudHMgdG8gYSByaWdodCBzaWJsaW5nIG5vZGUuCisgIC8vLyBAcGFyYW0gU2l6ZSAgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMuCisgIC8vLyBAcGFyYW0gU2liICAgUmlnaHQgc2libGluZyBub2RlLgorICAvLy8gQHBhcmFtIFNTaXplIE51bWJlciBvZiBlbGVtZW50cyBpbiBzaWIuCisgIC8vLyBAcGFyYW0gQ291bnQgTnVtYmVyIG9mIGVsZW1lbnRzIHRvIHRyYW5zZmVyLgorICB2b2lkIHRyYW5zZmVyVG9SaWdodFNpYih1bnNpZ25lZCBTaXplLCBOb2RlQmFzZSAmU2liLCB1bnNpZ25lZCBTU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ291bnQpIHsKKyAgICBTaWIubW92ZVJpZ2h0KDAsIENvdW50LCBTU2l6ZSk7CisgICAgU2liLmNvcHkoKnRoaXMsIFNpemUtQ291bnQsIDAsIENvdW50KTsKKyAgfQorCisgIC8vLyBhZGp1c3RGcm9tTGVmdFNpYiAtIEFkanVzdCB0aGUgbnVtYmVyIGlmIGVsZW1lbnRzIGluIHRoaXMgbm9kZSBieSBtb3ZpbmcKKyAgLy8vIGVsZW1lbnRzIHRvIG9yIGZyb20gYSBsZWZ0IHNpYmxpbmcgbm9kZS4KKyAgLy8vIEBwYXJhbSBTaXplICBOdW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcy4KKyAgLy8vIEBwYXJhbSBTaWIgICBSaWdodCBzaWJsaW5nIG5vZGUuCisgIC8vLyBAcGFyYW0gU1NpemUgTnVtYmVyIG9mIGVsZW1lbnRzIGluIHNpYi4KKyAgLy8vIEBwYXJhbSBBZGQgICBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRvIGFkZCB0byB0aGlzIG5vZGUsIHBvc3NpYmx5IDwgMC4KKyAgLy8vIEByZXR1cm4gICAgICBOdW1iZXIgb2YgZWxlbWVudHMgYWRkZWQgdG8gdGhpcyBub2RlLCBwb3NzaWJseSBuZWdhdGl2ZS4KKyAgaW50IGFkanVzdEZyb21MZWZ0U2liKHVuc2lnbmVkIFNpemUsIE5vZGVCYXNlICZTaWIsIHVuc2lnbmVkIFNTaXplLCBpbnQgQWRkKSB7CisgICAgaWYgKEFkZCA+IDApIHsKKyAgICAgIC8vIFdlIHdhbnQgdG8gZ3JvdywgY29weSBmcm9tIHNpYi4KKyAgICAgIHVuc2lnbmVkIENvdW50ID0gc3RkOjptaW4oc3RkOjptaW4odW5zaWduZWQoQWRkKSwgU1NpemUpLCBOIC0gU2l6ZSk7CisgICAgICBTaWIudHJhbnNmZXJUb1JpZ2h0U2liKFNTaXplLCAqdGhpcywgU2l6ZSwgQ291bnQpOworICAgICAgcmV0dXJuIENvdW50OworICAgIH0gZWxzZSB7CisgICAgICAvLyBXZSB3YW50IHRvIHNocmluaywgY29weSB0byBzaWIuCisgICAgICB1bnNpZ25lZCBDb3VudCA9IHN0ZDo6bWluKHN0ZDo6bWluKHVuc2lnbmVkKC1BZGQpLCBTaXplKSwgTiAtIFNTaXplKTsKKyAgICAgIHRyYW5zZmVyVG9MZWZ0U2liKFNpemUsIFNpYiwgU1NpemUsIENvdW50KTsKKyAgICAgIHJldHVybiAtQ291bnQ7CisgICAgfQorICB9Cit9OworCisvLy8gSW50ZXJ2YWxNYXBJbXBsOjphZGp1c3RTaWJsaW5nU2l6ZXMgLSBNb3ZlIGVsZW1lbnRzIGJldHdlZW4gc2libGluZyBub2Rlcy4KKy8vLyBAcGFyYW0gTm9kZSAgQXJyYXkgb2YgcG9pbnRlcnMgdG8gc2libGluZyBub2Rlcy4KKy8vLyBAcGFyYW0gTm9kZXMgTnVtYmVyIG9mIG5vZGVzLgorLy8vIEBwYXJhbSBDdXJTaXplIEFycmF5IG9mIGN1cnJlbnQgbm9kZSBzaXplcywgd2lsbCBiZSBvdmVyd3JpdHRlbi4KKy8vLyBAcGFyYW0gTmV3U2l6ZSBBcnJheSBvZiBkZXNpcmVkIG5vZGUgc2l6ZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTm9kZVQ+Cit2b2lkIGFkanVzdFNpYmxpbmdTaXplcyhOb2RlVCAqTm9kZVtdLCB1bnNpZ25lZCBOb2RlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEN1clNpemVbXSwgY29uc3QgdW5zaWduZWQgTmV3U2l6ZVtdKSB7CisgIC8vIE1vdmUgZWxlbWVudHMgcmlnaHQuCisgIGZvciAoaW50IG4gPSBOb2RlcyAtIDE7IG47IC0tbikgeworICAgIGlmIChDdXJTaXplW25dID09IE5ld1NpemVbbl0pCisgICAgICBjb250aW51ZTsKKyAgICBmb3IgKGludCBtID0gbiAtIDE7IG0gIT0gLTE7IC0tbSkgeworICAgICAgaW50IGQgPSBOb2RlW25dLT5hZGp1c3RGcm9tTGVmdFNpYihDdXJTaXplW25dLCAqTm9kZVttXSwgQ3VyU2l6ZVttXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3U2l6ZVtuXSAtIEN1clNpemVbbl0pOworICAgICAgQ3VyU2l6ZVttXSAtPSBkOworICAgICAgQ3VyU2l6ZVtuXSArPSBkOworICAgICAgLy8gS2VlcCBnb2luZyBpZiB0aGUgY3VycmVudCBub2RlIHdhcyBleGhhdXN0ZWQuCisgICAgICBpZiAoQ3VyU2l6ZVtuXSA+PSBOZXdTaXplW25dKQorICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChOb2RlcyA9PSAwKQorICAgIHJldHVybjsKKworICAvLyBNb3ZlIGVsZW1lbnRzIGxlZnQuCisgIGZvciAodW5zaWduZWQgbiA9IDA7IG4gIT0gTm9kZXMgLSAxOyArK24pIHsKKyAgICBpZiAoQ3VyU2l6ZVtuXSA9PSBOZXdTaXplW25dKQorICAgICAgY29udGludWU7CisgICAgZm9yICh1bnNpZ25lZCBtID0gbiArIDE7IG0gIT0gTm9kZXM7ICsrbSkgeworICAgICAgaW50IGQgPSBOb2RlW21dLT5hZGp1c3RGcm9tTGVmdFNpYihDdXJTaXplW21dLCAqTm9kZVtuXSwgQ3VyU2l6ZVtuXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDdXJTaXplW25dIC0gIE5ld1NpemVbbl0pOworICAgICAgQ3VyU2l6ZVttXSArPSBkOworICAgICAgQ3VyU2l6ZVtuXSAtPSBkOworICAgICAgLy8gS2VlcCBnb2luZyBpZiB0aGUgY3VycmVudCBub2RlIHdhcyBleGhhdXN0ZWQuCisgICAgICBpZiAoQ3VyU2l6ZVtuXSA+PSBOZXdTaXplW25dKQorICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisjaWZuZGVmIE5ERUJVRworICBmb3IgKHVuc2lnbmVkIG4gPSAwOyBuICE9IE5vZGVzOyBuKyspCisgICAgYXNzZXJ0KEN1clNpemVbbl0gPT0gTmV3U2l6ZVtuXSAmJiAiSW5zdWZmaWNpZW50IGVsZW1lbnQgc2h1ZmZsZSIpOworI2VuZGlmCit9CisKKy8vLyBJbnRlcnZhbE1hcEltcGw6OmRpc3RyaWJ1dGUgLSBDb21wdXRlIGEgbmV3IGRpc3RyaWJ1dGlvbiBvZiBub2RlIGVsZW1lbnRzCisvLy8gYWZ0ZXIgYW4gb3ZlcmZsb3cgb3IgdW5kZXJmbG93LiBSZXNlcnZlIHNwYWNlIGZvciBhIG5ldyBlbGVtZW50IGF0IFBvc2l0aW9uLAorLy8vIGFuZCBjb21wdXRlIHRoZSBub2RlIHRoYXQgd2lsbCBob2xkIFBvc2l0aW9uIGFmdGVyIHJlZGlzdHJpYnV0aW5nIG5vZGUKKy8vLyBlbGVtZW50cy4KKy8vLworLy8vIEl0IGlzIHJlcXVpcmVkIHRoYXQKKy8vLworLy8vICAgRWxlbWVudHMgPT0gc3VtKEN1clNpemUpLCBhbmQKKy8vLyAgIEVsZW1lbnRzICsgR3JvdyA8PSBOb2RlcyAqIENhcGFjaXR5LgorLy8vCisvLy8gTmV3U2l6ZVtdIHdpbGwgYmUgZmlsbGVkIGluIHN1Y2ggdGhhdDoKKy8vLworLy8vICAgc3VtKE5ld1NpemUpID09IEVsZW1lbnRzLCBhbmQKKy8vLyAgIE5ld1NpemVbaV0gPD0gQ2FwYWNpdHkuCisvLy8KKy8vLyBUaGUgcmV0dXJuZWQgaW5kZXggaXMgdGhlIG5vZGUgd2hlcmUgUG9zaXRpb24gd2lsbCBnbywgc286CisvLy8KKy8vLyAgIHN1bShOZXdTaXplWzAuLmlkeC0xXSkgPD0gUG9zaXRpb24KKy8vLyAgIHN1bShOZXdTaXplWzAuLmlkeF0pICAgPj0gUG9zaXRpb24KKy8vLworLy8vIFRoZSBsYXN0IGVxdWFsaXR5LCBzdW0oTmV3U2l6ZVswLi5pZHhdKSA9PSBQb3NpdGlvbiwgY2FuIG9ubHkgaGFwcGVuIHdoZW4KKy8vLyBHcm93IGlzIHNldCBhbmQgTmV3U2l6ZVtpZHhdID09IENhcGFjaXR5LTEuIFRoZSBpbmRleCBwb2ludHMgdG8gdGhlIG5vZGUKKy8vLyBiZWZvcmUgdGhlIG9uZSBob2xkaW5nIHRoZSBQb3NpdGlvbid0aCBlbGVtZW50IHdoZXJlIHRoZXJlIGlzIHJvb20gZm9yIGFuCisvLy8gaW5zZXJ0aW9uLgorLy8vCisvLy8gQHBhcmFtIE5vZGVzICAgIFRoZSBudW1iZXIgb2Ygbm9kZXMuCisvLy8gQHBhcmFtIEVsZW1lbnRzIFRvdGFsIGVsZW1lbnRzIGluIGFsbCBub2Rlcy4KKy8vLyBAcGFyYW0gQ2FwYWNpdHkgVGhlIGNhcGFjaXR5IG9mIGVhY2ggbm9kZS4KKy8vLyBAcGFyYW0gQ3VyU2l6ZSAgQXJyYXlbTm9kZXNdIG9mIGN1cnJlbnQgbm9kZSBzaXplcywgb3IgTlVMTC4KKy8vLyBAcGFyYW0gTmV3U2l6ZSAgQXJyYXlbTm9kZXNdIHRvIHJlY2VpdmUgdGhlIG5ldyBub2RlIHNpemVzLgorLy8vIEBwYXJhbSBQb3NpdGlvbiBJbnNlcnQgcG9zaXRpb24uCisvLy8gQHBhcmFtIEdyb3cgICAgIFJlc2VydmUgc3BhY2UgZm9yIGEgbmV3IGVsZW1lbnQgYXQgUG9zaXRpb24uCisvLy8gQHJldHVybiAgICAgICAgIChub2RlLCBvZmZzZXQpIGZvciBQb3NpdGlvbi4KK0lkeFBhaXIgZGlzdHJpYnV0ZSh1bnNpZ25lZCBOb2RlcywgdW5zaWduZWQgRWxlbWVudHMsIHVuc2lnbmVkIENhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkICpDdXJTaXplLCB1bnNpZ25lZCBOZXdTaXplW10sCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUG9zaXRpb24sIGJvb2wgR3Jvdyk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy0tLSAgICAgICAgICAgICAgICAgICBJbnRlcnZhbE1hcEltcGw6Ok5vZGVTaXplciAgICAgICAgICAgICAgICAgICAgICAgICAtLS0vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDb21wdXRlIG5vZGUgc2l6ZXMgZnJvbSBrZXkgYW5kIHZhbHVlIHR5cGVzLgorLy8KKy8vIFRoZSBicmFuY2hpbmcgZmFjdG9ycyBhcmUgY2hvc2VuIHRvIG1ha2Ugbm9kZXMgZml0IGluIHRocmVlIGNhY2hlIGxpbmVzLgorLy8gVGhpcyBtYXkgbm90IGJlIHBvc3NpYmxlIGlmIGtleXMgb3IgdmFsdWVzIGFyZSB2ZXJ5IGxhcmdlLiBTdWNoIGxhcmdlIG9iamVjdHMKKy8vIGFyZSBoYW5kbGVkIGNvcnJlY3RseSwgYnV0IGEgc3RkOjptYXAgd291bGQgcHJvYmFibHkgZ2l2ZSBiZXR0ZXIgcGVyZm9ybWFuY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZW51bSB7CisgIC8vIENhY2hlIGxpbmUgc2l6ZS4gTW9zdCBhcmNoaXRlY3R1cmVzIGhhdmUgMzIgb3IgNjQgYnl0ZSBjYWNoZSBsaW5lcy4KKyAgLy8gV2UgdXNlIDY0IGJ5dGVzIGhlcmUgYmVjYXVzZSBpdCBwcm92aWRlcyBnb29kIGJyYW5jaGluZyBmYWN0b3JzLgorICBMb2cyQ2FjaGVMaW5lID0gNiwKKyAgQ2FjaGVMaW5lQnl0ZXMgPSAxIDw8IExvZzJDYWNoZUxpbmUsCisgIERlc2lyZWROb2RlQnl0ZXMgPSAzICogQ2FjaGVMaW5lQnl0ZXMKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxUPgorc3RydWN0IE5vZGVTaXplciB7CisgIGVudW0geworICAgIC8vIENvbXB1dGUgdGhlIGxlYWYgbm9kZSBicmFuY2hpbmcgZmFjdG9yIHRoYXQgbWFrZXMgYSBub2RlIGZpdCBpbiB0aHJlZQorICAgIC8vIGNhY2hlIGxpbmVzLiBUaGUgYnJhbmNoaW5nIGZhY3RvciBtdXN0IGJlIGF0IGxlYXN0IDMsIG9yIHNvbWUgQistdHJlZQorICAgIC8vIGJhbGFuY2luZyBhbGdvcml0aG1zIHdvbid0IHdvcmsuCisgICAgLy8gTGVhZlNpemUgY2FuJ3QgYmUgbGFyZ2VyIHRoYW4gQ2FjaGVMaW5lQnl0ZXMuIFRoaXMgaXMgcmVxdWlyZWQgYnkgdGhlCisgICAgLy8gUG9pbnRlckludFBhaXIgdXNlZCBieSBOb2RlUmVmLgorICAgIERlc2lyZWRMZWFmU2l6ZSA9IERlc2lyZWROb2RlQnl0ZXMgLworICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KDIqc2l6ZW9mKEtleVQpK3NpemVvZihWYWxUKSksCisgICAgTWluTGVhZlNpemUgPSAzLAorICAgIExlYWZTaXplID0gRGVzaXJlZExlYWZTaXplID4gTWluTGVhZlNpemUgPyBEZXNpcmVkTGVhZlNpemUgOiBNaW5MZWFmU2l6ZQorICB9OworCisgIHVzaW5nIExlYWZCYXNlID0gTm9kZUJhc2U8c3RkOjpwYWlyPEtleVQsIEtleVQ+LCBWYWxULCBMZWFmU2l6ZT47CisKKyAgZW51bSB7CisgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSB0aGUgbGVhZiBicmFuY2hpbmcgZmFjdG9yLCBjb21wdXRlIHRoZSBhY3R1YWwgYWxsb2NhdGlvbgorICAgIC8vIHVuaXQgc2l6ZSBieSByb3VuZGluZyB1cCB0byBhIHdob2xlIG51bWJlciBvZiBjYWNoZSBsaW5lcy4KKyAgICBBbGxvY0J5dGVzID0gKHNpemVvZihMZWFmQmFzZSkgKyBDYWNoZUxpbmVCeXRlcy0xKSAmIH4oQ2FjaGVMaW5lQnl0ZXMtMSksCisKKyAgICAvLyBEZXRlcm1pbmUgdGhlIGJyYW5jaGluZyBmYWN0b3IgZm9yIGJyYW5jaCBub2Rlcy4KKyAgICBCcmFuY2hTaXplID0gQWxsb2NCeXRlcyAvCisgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oc2l6ZW9mKEtleVQpICsgc2l6ZW9mKHZvaWQqKSkKKyAgfTsKKworICAvLy8gQWxsb2NhdG9yIC0gVGhlIHJlY3ljbGluZyBhbGxvY2F0b3IgdXNlZCBmb3IgYm90aCBicmFuY2ggYW5kIGxlYWYgbm9kZXMuCisgIC8vLyBUaGlzIHR5cGVkZWYgaXMgdmVyeSBsaWtlbHkgdG8gYmUgaWRlbnRpY2FsIGZvciBhbGwgSW50ZXJ2YWxNYXBzIHdpdGgKKyAgLy8vIHJlYXNvbmFibHkgc2l6ZWQgZW50cmllcywgc28gdGhlIHNhbWUgYWxsb2NhdG9yIGNhbiBiZSBzaGFyZWQgYW1vbmcKKyAgLy8vIGRpZmZlcmVudCBraW5kcyBvZiBtYXBzLgorICB1c2luZyBBbGxvY2F0b3IgPQorICAgICAgUmVjeWNsaW5nQWxsb2NhdG9yPEJ1bXBQdHJBbGxvY2F0b3IsIGNoYXIsIEFsbG9jQnl0ZXMsIENhY2hlTGluZUJ5dGVzPjsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy0tLSAgICAgICAgICAgICAgICAgICAgIEludGVydmFsTWFwSW1wbDo6Tm9kZVJlZiAgICAgICAgICAgICAgICAgICAgICAgICAtLS0vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBCKy10cmVlIG5vZGVzIGNhbiBiZSBsZWF2ZXMgb3IgYnJhbmNoZXMsIHNvIHdlIG5lZWQgYSBwb2x5bW9ycGhpYyBub2RlCisvLyBwb2ludGVyIHRoYXQgY2FuIHBvaW50IHRvIGJvdGgga2luZHMuCisvLworLy8gQWxsIG5vZGVzIGFyZSBjYWNoZSBsaW5lIGFsaWduZWQgYW5kIHRoZSBsb3cgNiBiaXRzIG9mIGEgbm9kZSBwb2ludGVyIGFyZQorLy8gYWx3YXlzIDAuIFRoZXNlIGJpdHMgYXJlIHVzZWQgdG8gc3RvcmUgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUKKy8vIHJlZmVyZW5jZWQgbm9kZS4gQmVzaWRlcyBzYXZpbmcgc3BhY2UsIHBsYWNpbmcgbm9kZSBzaXplcyBpbiB0aGUgcGFyZW50cworLy8gYWxsb3cgdHJlZSBiYWxhbmNpbmcgYWxnb3JpdGhtcyB0byBydW4gd2l0aG91dCBmYXVsdGluZyBjYWNoZSBsaW5lcyBmb3Igbm9kZXMKKy8vIHRoYXQgbWF5IG5vdCBuZWVkIHRvIGJlIG1vZGlmaWVkLgorLy8KKy8vIEEgTm9kZVJlZiBkb2Vzbid0IGtub3cgd2hldGhlciBpdCByZWZlcmVuY2VzIGEgbGVhZiBub2RlIG9yIGEgYnJhbmNoIG5vZGUuCisvLyBJdCBpcyB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlciB0byB1c2UgdGhlIGNvcnJlY3QgdHlwZXMuCisvLworLy8gTm9kZXMgYXJlIG5ldmVyIHN1cHBvc2VkIHRvIGJlIGVtcHR5LCBhbmQgaXQgaXMgaW52YWxpZCB0byBzdG9yZSBhIG5vZGUgc2l6ZQorLy8gb2YgMCBpbiBhIE5vZGVSZWYuIFRoZSB2YWxpZCByYW5nZSBvZiBzaXplcyBpcyAxLTY0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIE5vZGVSZWYgeworICBzdHJ1Y3QgQ2FjaGVBbGlnbmVkUG9pbnRlclRyYWl0cyB7CisgICAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKHZvaWQgKlApIHsgcmV0dXJuIFA7IH0KKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgKmdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7IHJldHVybiBQOyB9CisgICAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSBMb2cyQ2FjaGVMaW5lIH07CisgIH07CisgIFBvaW50ZXJJbnRQYWlyPHZvaWQqLCBMb2cyQ2FjaGVMaW5lLCB1bnNpZ25lZCwgQ2FjaGVBbGlnbmVkUG9pbnRlclRyYWl0cz4gcGlwOworCitwdWJsaWM6CisgIC8vLyBOb2RlUmVmIC0gQ3JlYXRlIGEgbnVsbCByZWYuCisgIE5vZGVSZWYoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIG9wZXJhdG9yIGJvb2wgLSBEZXRlY3QgYSBudWxsIHJlZi4KKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIHBpcC5nZXRPcGFxdWVWYWx1ZSgpOyB9CisKKyAgLy8vIE5vZGVSZWYgLSBDcmVhdGUgYSByZWZlcmVuY2UgdG8gdGhlIG5vZGUgcCB3aXRoIG4gZWxlbWVudHMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVD4KKyAgTm9kZVJlZihOb2RlVCAqcCwgdW5zaWduZWQgbikgOiBwaXAocCwgbiAtIDEpIHsKKyAgICBhc3NlcnQobiA8PSBOb2RlVDo6Q2FwYWNpdHkgJiYgIlNpemUgdG9vIGJpZyBmb3Igbm9kZSIpOworICB9CisKKyAgLy8vIHNpemUgLSBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcmVmZXJlbmNlZCBub2RlLgorICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gcGlwLmdldEludCgpICsgMTsgfQorCisgIC8vLyBzZXRTaXplIC0gVXBkYXRlIHRoZSBub2RlIHNpemUuCisgIHZvaWQgc2V0U2l6ZSh1bnNpZ25lZCBuKSB7IHBpcC5zZXRJbnQobiAtIDEpOyB9CisKKyAgLy8vIHN1YnRyZWUgLSBBY2Nlc3MgdGhlIGkndGggc3VidHJlZSByZWZlcmVuY2UgaW4gYSBicmFuY2ggbm9kZS4KKyAgLy8vIFRoaXMgZGVwZW5kcyBvbiBicmFuY2ggbm9kZXMgc3RvcmluZyB0aGUgTm9kZVJlZiBhcnJheSBhcyB0aGVpciBmaXJzdAorICAvLy8gbWVtYmVyLgorICBOb2RlUmVmICZzdWJ0cmVlKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxOb2RlUmVmKj4ocGlwLmdldFBvaW50ZXIoKSlbaV07CisgIH0KKworICAvLy8gZ2V0IC0gRGVyZWZlcmVuY2UgYXMgYSBOb2RlVCByZWZlcmVuY2UuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVD4KKyAgTm9kZVQgJmdldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Tm9kZVQqPihwaXAuZ2V0UG9pbnRlcigpKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBOb2RlUmVmICZSSFMpIGNvbnN0IHsKKyAgICBpZiAocGlwID09IFJIUy5waXApCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBhc3NlcnQocGlwLmdldFBvaW50ZXIoKSAhPSBSSFMucGlwLmdldFBvaW50ZXIoKSAmJiAiSW5jb25zaXN0ZW50IE5vZGVSZWZzIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE5vZGVSZWYgJlJIUykgY29uc3QgeworICAgIHJldHVybiAhb3BlcmF0b3I9PShSSFMpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8tLS0gICAgICAgICAgICAgICAgICAgICAgSW50ZXJ2YWxNYXBJbXBsOjpMZWFmTm9kZSAgICAgICAgICAgICAgICAgICAgICAgLS0tLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTGVhZiBub2RlcyBzdG9yZSB1cCB0byBOIGRpc2pvaW50IGludGVydmFscyB3aXRoIGNvcnJlc3BvbmRpbmcgdmFsdWVzLgorLy8KKy8vIFRoZSBpbnRlcnZhbHMgYXJlIGtlcHQgc29ydGVkIGFuZCBmdWxseSBjb2FsZXNjZWQgc28gdGhlcmUgYXJlIG5vIGFkamFjZW50CisvLyBpbnRlcnZhbHMgbWFwcGluZyB0byB0aGUgc2FtZSB2YWx1ZS4KKy8vCisvLyBUaGVzZSBjb25zdHJhaW50cyBhcmUgYWx3YXlzIHNhdGlzZmllZDoKKy8vCisvLyAtIFRyYWl0czo6c3RvcExlc3Moc3RhcnQoaSksIHN0b3AoaSkpICAgIC0gTm9uLWVtcHR5LCBzYW5lIGludGVydmFscy4KKy8vCisvLyAtIFRyYWl0czo6c3RvcExlc3Moc3RvcChpKSwgc3RhcnQoaSArIDEpIC0gU29ydGVkLgorLy8KKy8vIC0gdmFsdWUoaSkgIT0gdmFsdWUoaSArIDEpIHx8ICFUcmFpdHM6OmFkamFjZW50KHN0b3AoaSksIHN0YXJ0KGkgKyAxKSkKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLSBGdWxseSBjb2FsZXNjZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KK2NsYXNzIExlYWZOb2RlIDogcHVibGljIE5vZGVCYXNlPHN0ZDo6cGFpcjxLZXlULCBLZXlUPiwgVmFsVCwgTj4geworcHVibGljOgorICBjb25zdCBLZXlUICZzdGFydCh1bnNpZ25lZCBpKSBjb25zdCB7IHJldHVybiB0aGlzLT5maXJzdFtpXS5maXJzdDsgfQorICBjb25zdCBLZXlUICZzdG9wKHVuc2lnbmVkIGkpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmZpcnN0W2ldLnNlY29uZDsgfQorICBjb25zdCBWYWxUICZ2YWx1ZSh1bnNpZ25lZCBpKSBjb25zdCB7IHJldHVybiB0aGlzLT5zZWNvbmRbaV07IH0KKworICBLZXlUICZzdGFydCh1bnNpZ25lZCBpKSB7IHJldHVybiB0aGlzLT5maXJzdFtpXS5maXJzdDsgfQorICBLZXlUICZzdG9wKHVuc2lnbmVkIGkpIHsgcmV0dXJuIHRoaXMtPmZpcnN0W2ldLnNlY29uZDsgfQorICBWYWxUICZ2YWx1ZSh1bnNpZ25lZCBpKSB7IHJldHVybiB0aGlzLT5zZWNvbmRbaV07IH0KKworICAvLy8gZmluZEZyb20gLSBGaW5kIHRoZSBmaXJzdCBpbnRlcnZhbCBhZnRlciBpIHRoYXQgbWF5IGNvbnRhaW4geC4KKyAgLy8vIEBwYXJhbSBpICAgIFN0YXJ0aW5nIGluZGV4IGZvciB0aGUgc2VhcmNoLgorICAvLy8gQHBhcmFtIFNpemUgTnVtYmVyIG9mIGVsZW1lbnRzIGluIG5vZGUuCisgIC8vLyBAcGFyYW0geCAgICBLZXkgdG8gc2VhcmNoIGZvci4KKyAgLy8vIEByZXR1cm4gICAgIEZpcnN0IGluZGV4IHdpdGggIXN0b3BMZXNzKGtleVtpXS5zdG9wLCB4KSwgb3Igc2l6ZS4KKyAgLy8vICAgICAgICAgICAgIFRoaXMgaXMgdGhlIGZpcnN0IGludGVydmFsIHRoYXQgY2FuIHBvc3NpYmx5IGNvbnRhaW4geC4KKyAgdW5zaWduZWQgZmluZEZyb20odW5zaWduZWQgaSwgdW5zaWduZWQgU2l6ZSwgS2V5VCB4KSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPD0gU2l6ZSAmJiBTaXplIDw9IE4gJiYgIkJhZCBpbmRpY2VzIik7CisgICAgYXNzZXJ0KChpID09IDAgfHwgVHJhaXRzOjpzdG9wTGVzcyhzdG9wKGkgLSAxKSwgeCkpICYmCisgICAgICAgICAgICJJbmRleCBpcyBwYXN0IHRoZSBuZWVkZWQgcG9pbnQiKTsKKyAgICB3aGlsZSAoaSAhPSBTaXplICYmIFRyYWl0czo6c3RvcExlc3Moc3RvcChpKSwgeCkpICsraTsKKyAgICByZXR1cm4gaTsKKyAgfQorCisgIC8vLyBzYWZlRmluZCAtIEZpbmQgYW4gaW50ZXJ2YWwgdGhhdCBpcyBrbm93biB0byBleGlzdC4gVGhpcyBpcyB0aGUgc2FtZSBhcworICAvLy8gZmluZEZyb20gZXhjZXB0IGlzIGl0IGFzc3VtZWQgdGhhdCB4IGlzIGF0IGxlYXN0IHdpdGhpbiByYW5nZSBvZiB0aGUgbGFzdAorICAvLy8gaW50ZXJ2YWwuCisgIC8vLyBAcGFyYW0gaSBTdGFydGluZyBpbmRleCBmb3IgdGhlIHNlYXJjaC4KKyAgLy8vIEBwYXJhbSB4IEtleSB0byBzZWFyY2ggZm9yLgorICAvLy8gQHJldHVybiAgRmlyc3QgaW5kZXggd2l0aCAhc3RvcExlc3Moa2V5W2ldLnN0b3AsIHgpLCBuZXZlciBzaXplLgorICAvLy8gICAgICAgICAgVGhpcyBpcyB0aGUgZmlyc3QgaW50ZXJ2YWwgdGhhdCBjYW4gcG9zc2libHkgY29udGFpbiB4LgorICB1bnNpZ25lZCBzYWZlRmluZCh1bnNpZ25lZCBpLCBLZXlUIHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IE4gJiYgIkJhZCBpbmRleCIpOworICAgIGFzc2VydCgoaSA9PSAwIHx8IFRyYWl0czo6c3RvcExlc3Moc3RvcChpIC0gMSksIHgpKSAmJgorICAgICAgICAgICAiSW5kZXggaXMgcGFzdCB0aGUgbmVlZGVkIHBvaW50Iik7CisgICAgd2hpbGUgKFRyYWl0czo6c3RvcExlc3Moc3RvcChpKSwgeCkpICsraTsKKyAgICBhc3NlcnQoaSA8IE4gJiYgIlVuc2FmZSBpbnRlcnZhbHMiKTsKKyAgICByZXR1cm4gaTsKKyAgfQorCisgIC8vLyBzYWZlTG9va3VwIC0gTG9va3VwIG1hcHBlZCB2YWx1ZSBmb3IgYSBzYWZlIGtleS4KKyAgLy8vIEl0IGlzIGFzc3VtZWQgdGhhdCB4IGlzIHdpdGhpbiByYW5nZSBvZiB0aGUgbGFzdCBlbnRyeS4KKyAgLy8vIEBwYXJhbSB4ICAgICAgICBLZXkgdG8gc2VhcmNoIGZvci4KKyAgLy8vIEBwYXJhbSBOb3RGb3VuZCBWYWx1ZSB0byByZXR1cm4gaWYgeCBpcyBub3QgaW4gYW55IGludGVydmFsLgorICAvLy8gQHJldHVybiAgICAgICAgIFRoZSBtYXBwZWQgdmFsdWUgYXQgeCBvciBOb3RGb3VuZC4KKyAgVmFsVCBzYWZlTG9va3VwKEtleVQgeCwgVmFsVCBOb3RGb3VuZCkgY29uc3QgeworICAgIHVuc2lnbmVkIGkgPSBzYWZlRmluZCgwLCB4KTsKKyAgICByZXR1cm4gVHJhaXRzOjpzdGFydExlc3MoeCwgc3RhcnQoaSkpID8gTm90Rm91bmQgOiB2YWx1ZShpKTsKKyAgfQorCisgIHVuc2lnbmVkIGluc2VydEZyb20odW5zaWduZWQgJlBvcywgdW5zaWduZWQgU2l6ZSwgS2V5VCBhLCBLZXlUIGIsIFZhbFQgeSk7Cit9OworCisvLy8gaW5zZXJ0RnJvbSAtIEFkZCBtYXBwaW5nIG9mIFthO2JdIHRvIHkgaWYgcG9zc2libGUsIGNvYWxlc2NpbmcgYXMgbXVjaCBhcworLy8vIHBvc3NpYmxlLiBUaGlzIG1heSBjYXVzZSB0aGUgbm9kZSB0byBncm93IGJ5IDEsIG9yIGl0IG1heSBjYXVzZSB0aGUgbm9kZQorLy8vIHRvIHNocmluayBiZWNhdXNlIG9mIGNvYWxlc2NpbmcuCisvLy8gQHBhcmFtIFBvcyAgU3RhcnRpbmcgaW5kZXggPSBpbnNlcnRGcm9tKDAsIHNpemUsIGEpCisvLy8gQHBhcmFtIFNpemUgTnVtYmVyIG9mIGVsZW1lbnRzIGluIG5vZGUuCisvLy8gQHBhcmFtIGEgICAgSW50ZXJ2YWwgc3RhcnQuCisvLy8gQHBhcmFtIGIgICAgSW50ZXJ2YWwgc3RvcC4KKy8vLyBAcGFyYW0geSAgICBWYWx1ZSBiZSBtYXBwZWQuCisvLy8gQHJldHVybiAgICAgKGluc2VydCBwb3NpdGlvbiwgbmV3IHNpemUpLCBvciAoaSwgQ2FwYWNpdHkrMSkgb24gb3ZlcmZsb3cuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwgdW5zaWduZWQgTiwgdHlwZW5hbWUgVHJhaXRzPgordW5zaWduZWQgTGVhZk5vZGU8S2V5VCwgVmFsVCwgTiwgVHJhaXRzPjo6CitpbnNlcnRGcm9tKHVuc2lnbmVkICZQb3MsIHVuc2lnbmVkIFNpemUsIEtleVQgYSwgS2V5VCBiLCBWYWxUIHkpIHsKKyAgdW5zaWduZWQgaSA9IFBvczsKKyAgYXNzZXJ0KGkgPD0gU2l6ZSAmJiBTaXplIDw9IE4gJiYgIkludmFsaWQgaW5kZXgiKTsKKyAgYXNzZXJ0KCFUcmFpdHM6OnN0b3BMZXNzKGIsIGEpICYmICJJbnZhbGlkIGludGVydmFsIik7CisKKyAgLy8gVmVyaWZ5IHRoZSBmaW5kRnJvbSBpbnZhcmlhbnQuCisgIGFzc2VydCgoaSA9PSAwIHx8IFRyYWl0czo6c3RvcExlc3Moc3RvcChpIC0gMSksIGEpKSk7CisgIGFzc2VydCgoaSA9PSBTaXplIHx8ICFUcmFpdHM6OnN0b3BMZXNzKHN0b3AoaSksIGEpKSk7CisgIGFzc2VydCgoaSA9PSBTaXplIHx8IFRyYWl0czo6c3RvcExlc3MoYiwgc3RhcnQoaSkpKSAmJiAiT3ZlcmxhcHBpbmcgaW5zZXJ0Iik7CisKKyAgLy8gQ29hbGVzY2Ugd2l0aCBwcmV2aW91cyBpbnRlcnZhbC4KKyAgaWYgKGkgJiYgdmFsdWUoaSAtIDEpID09IHkgJiYgVHJhaXRzOjphZGphY2VudChzdG9wKGkgLSAxKSwgYSkpIHsKKyAgICBQb3MgPSBpIC0gMTsKKyAgICAvLyBBbHNvIGNvYWxlc2NlIHdpdGggbmV4dCBpbnRlcnZhbD8KKyAgICBpZiAoaSAhPSBTaXplICYmIHZhbHVlKGkpID09IHkgJiYgVHJhaXRzOjphZGphY2VudChiLCBzdGFydChpKSkpIHsKKyAgICAgIHN0b3AoaSAtIDEpID0gc3RvcChpKTsKKyAgICAgIHRoaXMtPmVyYXNlKGksIFNpemUpOworICAgICAgcmV0dXJuIFNpemUgLSAxOworICAgIH0KKyAgICBzdG9wKGkgLSAxKSA9IGI7CisgICAgcmV0dXJuIFNpemU7CisgIH0KKworICAvLyBEZXRlY3Qgb3ZlcmZsb3cuCisgIGlmIChpID09IE4pCisgICAgcmV0dXJuIE4gKyAxOworCisgIC8vIEFkZCBuZXcgaW50ZXJ2YWwgYXQgZW5kLgorICBpZiAoaSA9PSBTaXplKSB7CisgICAgc3RhcnQoaSkgPSBhOworICAgIHN0b3AoaSkgPSBiOworICAgIHZhbHVlKGkpID0geTsKKyAgICByZXR1cm4gU2l6ZSArIDE7CisgIH0KKworICAvLyBUcnkgdG8gY29hbGVzY2Ugd2l0aCBmb2xsb3dpbmcgaW50ZXJ2YWwuCisgIGlmICh2YWx1ZShpKSA9PSB5ICYmIFRyYWl0czo6YWRqYWNlbnQoYiwgc3RhcnQoaSkpKSB7CisgICAgc3RhcnQoaSkgPSBhOworICAgIHJldHVybiBTaXplOworICB9CisKKyAgLy8gV2UgbXVzdCBpbnNlcnQgYmVmb3JlIGkuIERldGVjdCBvdmVyZmxvdy4KKyAgaWYgKFNpemUgPT0gTikKKyAgICByZXR1cm4gTiArIDE7CisKKyAgLy8gSW5zZXJ0IGJlZm9yZSBpLgorICB0aGlzLT5zaGlmdChpLCBTaXplKTsKKyAgc3RhcnQoaSkgPSBhOworICBzdG9wKGkpID0gYjsKKyAgdmFsdWUoaSkgPSB5OworICByZXR1cm4gU2l6ZSArIDE7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy0tLSAgICAgICAgICAgICAgICAgICBJbnRlcnZhbE1hcEltcGw6OkJyYW5jaE5vZGUgICAgICAgICAgICAgICAgICAgICAgICAtLS0vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBBIGJyYW5jaCBub2RlIHN0b3JlcyByZWZlcmVuY2VzIHRvIDEtLU4gc3VidHJlZXMgYWxsIG9mIHRoZSBzYW1lIGhlaWdodC4KKy8vCisvLyBUaGUga2V5IGFycmF5IGluIGEgYnJhbmNoIG5vZGUgaG9sZHMgdGhlIHJpZ2h0bW9zdCBzdG9wIGtleSBvZiBlYWNoIHN1YnRyZWUuCisvLyBJdCBpcyByZWR1bmRhbnQgdG8gc3RvcmUgdGhlIGxhc3Qgc3RvcCBrZXkgc2luY2UgaXQgY2FuIGJlIGZvdW5kIGluIHRoZQorLy8gcGFyZW50IG5vZGUsIGJ1dCBkb2luZyBzbyBtYWtlcyB0cmVlIGJhbGFuY2luZyBhIGxvdCBzaW1wbGVyLgorLy8KKy8vIEl0IGlzIHVudXN1YWwgZm9yIGEgYnJhbmNoIG5vZGUgdG8gb25seSBoYXZlIG9uZSBzdWJ0cmVlLCBidXQgaXQgY2FuIGhhcHBlbgorLy8gaW4gdGhlIHJvb3Qgbm9kZSBpZiBpdCBpcyBzbWFsbGVyIHRoYW4gdGhlIG5vcm1hbCBub2Rlcy4KKy8vCisvLyBXaGVuIGFsbCBvZiB0aGUgbGVhZiBub2RlcyBmcm9tIGFsbCB0aGUgc3VidHJlZXMgYXJlIGNvbmNhdGVuYXRlZCwgdGhleSBtdXN0CisvLyBzYXRpc2Z5IHRoZSBzYW1lIGNvbnN0cmFpbnRzIGFzIGEgc2luZ2xlIGxlYWYgbm9kZS4gVGhleSBtdXN0IGJlIHNvcnRlZCwKKy8vIHNhbmUsIGFuZCBmdWxseSBjb2FsZXNjZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KK2NsYXNzIEJyYW5jaE5vZGUgOiBwdWJsaWMgTm9kZUJhc2U8Tm9kZVJlZiwgS2V5VCwgTj4geworcHVibGljOgorICBjb25zdCBLZXlUICZzdG9wKHVuc2lnbmVkIGkpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPnNlY29uZFtpXTsgfQorICBjb25zdCBOb2RlUmVmICZzdWJ0cmVlKHVuc2lnbmVkIGkpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmZpcnN0W2ldOyB9CisKKyAgS2V5VCAmc3RvcCh1bnNpZ25lZCBpKSB7IHJldHVybiB0aGlzLT5zZWNvbmRbaV07IH0KKyAgTm9kZVJlZiAmc3VidHJlZSh1bnNpZ25lZCBpKSB7IHJldHVybiB0aGlzLT5maXJzdFtpXTsgfQorCisgIC8vLyBmaW5kRnJvbSAtIEZpbmQgdGhlIGZpcnN0IHN1YnRyZWUgYWZ0ZXIgaSB0aGF0IG1heSBjb250YWluIHguCisgIC8vLyBAcGFyYW0gaSAgICBTdGFydGluZyBpbmRleCBmb3IgdGhlIHNlYXJjaC4KKyAgLy8vIEBwYXJhbSBTaXplIE51bWJlciBvZiBlbGVtZW50cyBpbiBub2RlLgorICAvLy8gQHBhcmFtIHggICAgS2V5IHRvIHNlYXJjaCBmb3IuCisgIC8vLyBAcmV0dXJuICAgICBGaXJzdCBpbmRleCB3aXRoICFzdG9wTGVzcyhrZXlbaV0sIHgpLCBvciBzaXplLgorICAvLy8gICAgICAgICAgICAgVGhpcyBpcyB0aGUgZmlyc3Qgc3VidHJlZSB0aGF0IGNhbiBwb3NzaWJseSBjb250YWluIHguCisgIHVuc2lnbmVkIGZpbmRGcm9tKHVuc2lnbmVkIGksIHVuc2lnbmVkIFNpemUsIEtleVQgeCkgY29uc3QgeworICAgIGFzc2VydChpIDw9IFNpemUgJiYgU2l6ZSA8PSBOICYmICJCYWQgaW5kaWNlcyIpOworICAgIGFzc2VydCgoaSA9PSAwIHx8IFRyYWl0czo6c3RvcExlc3Moc3RvcChpIC0gMSksIHgpKSAmJgorICAgICAgICAgICAiSW5kZXggdG8gZmluZEZyb20gaXMgcGFzdCB0aGUgbmVlZGVkIHBvaW50Iik7CisgICAgd2hpbGUgKGkgIT0gU2l6ZSAmJiBUcmFpdHM6OnN0b3BMZXNzKHN0b3AoaSksIHgpKSArK2k7CisgICAgcmV0dXJuIGk7CisgIH0KKworICAvLy8gc2FmZUZpbmQgLSBGaW5kIGEgc3VidHJlZSB0aGF0IGlzIGtub3duIHRvIGV4aXN0LiBUaGlzIGlzIHRoZSBzYW1lIGFzCisgIC8vLyBmaW5kRnJvbSBleGNlcHQgaXMgaXQgYXNzdW1lZCB0aGF0IHggaXMgaW4gcmFuZ2UuCisgIC8vLyBAcGFyYW0gaSBTdGFydGluZyBpbmRleCBmb3IgdGhlIHNlYXJjaC4KKyAgLy8vIEBwYXJhbSB4IEtleSB0byBzZWFyY2ggZm9yLgorICAvLy8gQHJldHVybiAgRmlyc3QgaW5kZXggd2l0aCAhc3RvcExlc3Moa2V5W2ldLCB4KSwgbmV2ZXIgc2l6ZS4KKyAgLy8vICAgICAgICAgIFRoaXMgaXMgdGhlIGZpcnN0IHN1YnRyZWUgdGhhdCBjYW4gcG9zc2libHkgY29udGFpbiB4LgorICB1bnNpZ25lZCBzYWZlRmluZCh1bnNpZ25lZCBpLCBLZXlUIHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IE4gJiYgIkJhZCBpbmRleCIpOworICAgIGFzc2VydCgoaSA9PSAwIHx8IFRyYWl0czo6c3RvcExlc3Moc3RvcChpIC0gMSksIHgpKSAmJgorICAgICAgICAgICAiSW5kZXggaXMgcGFzdCB0aGUgbmVlZGVkIHBvaW50Iik7CisgICAgd2hpbGUgKFRyYWl0czo6c3RvcExlc3Moc3RvcChpKSwgeCkpICsraTsKKyAgICBhc3NlcnQoaSA8IE4gJiYgIlVuc2FmZSBpbnRlcnZhbHMiKTsKKyAgICByZXR1cm4gaTsKKyAgfQorCisgIC8vLyBzYWZlTG9va3VwIC0gR2V0IHRoZSBzdWJ0cmVlIGNvbnRhaW5pbmcgeCwgQXNzdW1pbmcgdGhhdCB4IGlzIGluIHJhbmdlLgorICAvLy8gQHBhcmFtIHggS2V5IHRvIHNlYXJjaCBmb3IuCisgIC8vLyBAcmV0dXJuICBTdWJ0cmVlIGNvbnRhaW5pbmcgeAorICBOb2RlUmVmIHNhZmVMb29rdXAoS2V5VCB4KSBjb25zdCB7CisgICAgcmV0dXJuIHN1YnRyZWUoc2FmZUZpbmQoMCwgeCkpOworICB9CisKKyAgLy8vIGluc2VydCAtIEluc2VydCBhIG5ldyAoc3VidHJlZSwgc3RvcCkgcGFpci4KKyAgLy8vIEBwYXJhbSBpICAgIEluc2VydCBwb3NpdGlvbiwgZm9sbG93aW5nIGVudHJpZXMgd2lsbCBiZSBzaGlmdGVkLgorICAvLy8gQHBhcmFtIFNpemUgTnVtYmVyIG9mIGVsZW1lbnRzIGluIG5vZGUuCisgIC8vLyBAcGFyYW0gTm9kZSBTdWJ0cmVlIHRvIGluc2VydC4KKyAgLy8vIEBwYXJhbSBTdG9wIExhc3Qga2V5IGluIHN1YnRyZWUuCisgIHZvaWQgaW5zZXJ0KHVuc2lnbmVkIGksIHVuc2lnbmVkIFNpemUsIE5vZGVSZWYgTm9kZSwgS2V5VCBTdG9wKSB7CisgICAgYXNzZXJ0KFNpemUgPCBOICYmICJicmFuY2ggbm9kZSBvdmVyZmxvdyIpOworICAgIGFzc2VydChpIDw9IFNpemUgJiYgIkJhZCBpbnNlcnQgcG9zaXRpb24iKTsKKyAgICB0aGlzLT5zaGlmdChpLCBTaXplKTsKKyAgICBzdWJ0cmVlKGkpID0gTm9kZTsKKyAgICBzdG9wKGkpID0gU3RvcDsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLS0tICAgICAgICAgICAgICAgICAgICAgICAgIEludGVydmFsTWFwSW1wbDo6UGF0aCAgICAgICAgICAgICAgICAgICAgICAgIC0tLS8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEEgUGF0aCBpcyB1c2VkIGJ5IGl0ZXJhdG9ycyB0byByZXByZXNlbnQgYSBwb3NpdGlvbiBpbiBhIEIrLXRyZWUsIGFuZCB0aGUKKy8vIHBhdGggdG8gZ2V0IHRoZXJlIGZyb20gdGhlIHJvb3QuCisvLworLy8gVGhlIFBhdGggY2xhc3MgYWxzbyBjb250YWlucyB0aGUgdHJlZSBuYXZpZ2F0aW9uIGNvZGUgdGhhdCBkb2Vzbid0IGhhdmUgdG8KKy8vIGJlIHRlbXBsYXRpemVkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIFBhdGggeworICAvLy8gRW50cnkgLSBFYWNoIHN0ZXAgaW4gdGhlIHBhdGggaXMgYSBub2RlIHBvaW50ZXIgYW5kIGFuIG9mZnNldCBpbnRvIHRoYXQKKyAgLy8vIG5vZGUuCisgIHN0cnVjdCBFbnRyeSB7CisgICAgdm9pZCAqbm9kZTsKKyAgICB1bnNpZ25lZCBzaXplOworICAgIHVuc2lnbmVkIG9mZnNldDsKKworICAgIEVudHJ5KHZvaWQgKk5vZGUsIHVuc2lnbmVkIFNpemUsIHVuc2lnbmVkIE9mZnNldCkKKyAgICAgIDogbm9kZShOb2RlKSwgc2l6ZShTaXplKSwgb2Zmc2V0KE9mZnNldCkge30KKworICAgIEVudHJ5KE5vZGVSZWYgTm9kZSwgdW5zaWduZWQgT2Zmc2V0KQorICAgICAgOiBub2RlKCZOb2RlLnN1YnRyZWUoMCkpLCBzaXplKE5vZGUuc2l6ZSgpKSwgb2Zmc2V0KE9mZnNldCkge30KKworICAgIE5vZGVSZWYgJnN1YnRyZWUodW5zaWduZWQgaSkgY29uc3QgeworICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Tm9kZVJlZio+KG5vZGUpW2ldOworICAgIH0KKyAgfTsKKworICAvLy8gcGF0aCAtIFRoZSBwYXRoIGVudHJpZXMsIHBhdGhbMF0gaXMgdGhlIHJvb3Qgbm9kZSwgcGF0aC5iYWNrKCkgaXMgYSBsZWFmLgorICBTbWFsbFZlY3RvcjxFbnRyeSwgND4gcGF0aDsKKworcHVibGljOgorICAvLyBOb2RlIGFjY2Vzc29ycy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVUPiBOb2RlVCAmbm9kZSh1bnNpZ25lZCBMZXZlbCkgY29uc3QgeworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxOb2RlVCo+KHBhdGhbTGV2ZWxdLm5vZGUpOworICB9CisgIHVuc2lnbmVkIHNpemUodW5zaWduZWQgTGV2ZWwpIGNvbnN0IHsgcmV0dXJuIHBhdGhbTGV2ZWxdLnNpemU7IH0KKyAgdW5zaWduZWQgb2Zmc2V0KHVuc2lnbmVkIExldmVsKSBjb25zdCB7IHJldHVybiBwYXRoW0xldmVsXS5vZmZzZXQ7IH0KKyAgdW5zaWduZWQgJm9mZnNldCh1bnNpZ25lZCBMZXZlbCkgeyByZXR1cm4gcGF0aFtMZXZlbF0ub2Zmc2V0OyB9CisKKyAgLy8gTGVhZiBhY2Nlc3NvcnMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVD4gTm9kZVQgJmxlYWYoKSBjb25zdCB7CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PE5vZGVUKj4ocGF0aC5iYWNrKCkubm9kZSk7CisgIH0KKyAgdW5zaWduZWQgbGVhZlNpemUoKSBjb25zdCB7IHJldHVybiBwYXRoLmJhY2soKS5zaXplOyB9CisgIHVuc2lnbmVkIGxlYWZPZmZzZXQoKSBjb25zdCB7IHJldHVybiBwYXRoLmJhY2soKS5vZmZzZXQ7IH0KKyAgdW5zaWduZWQgJmxlYWZPZmZzZXQoKSB7IHJldHVybiBwYXRoLmJhY2soKS5vZmZzZXQ7IH0KKworICAvLy8gdmFsaWQgLSBSZXR1cm4gdHJ1ZSBpZiBwYXRoIGlzIGF0IGEgdmFsaWQgbm9kZSwgbm90IGF0IGVuZCgpLgorICBib29sIHZhbGlkKCkgY29uc3QgeworICAgIHJldHVybiAhcGF0aC5lbXB0eSgpICYmIHBhdGguZnJvbnQoKS5vZmZzZXQgPCBwYXRoLmZyb250KCkuc2l6ZTsKKyAgfQorCisgIC8vLyBoZWlnaHQgLSBSZXR1cm4gdGhlIGhlaWdodCBvZiB0aGUgdHJlZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgcGF0aC4KKyAgLy8vIFRoaXMgbWF0Y2hlcyBtYXAtPmhlaWdodCBpbiBhIGZ1bGwgcGF0aC4KKyAgdW5zaWduZWQgaGVpZ2h0KCkgY29uc3QgeyByZXR1cm4gcGF0aC5zaXplKCkgLSAxOyB9CisKKyAgLy8vIHN1YnRyZWUgLSBHZXQgdGhlIHN1YnRyZWUgcmVmZXJlbmNlZCBmcm9tIExldmVsLiBXaGVuIHRoZSBwYXRoIGlzCisgIC8vLyBjb25zaXN0ZW50LCBub2RlKExldmVsICsgMSkgPT0gc3VidHJlZShMZXZlbCkuCisgIC8vLyBAcGFyYW0gTGV2ZWwgMC4uaGVpZ2h0LTEuIFRoZSBsZWF2ZXMgaGF2ZSBubyBzdWJ0cmVlcy4KKyAgTm9kZVJlZiAmc3VidHJlZSh1bnNpZ25lZCBMZXZlbCkgY29uc3QgeworICAgIHJldHVybiBwYXRoW0xldmVsXS5zdWJ0cmVlKHBhdGhbTGV2ZWxdLm9mZnNldCk7CisgIH0KKworICAvLy8gcmVzZXQgLSBSZXNldCBjYWNoZWQgaW5mb3JtYXRpb24gYWJvdXQgbm9kZShMZXZlbCkgZnJvbSBzdWJ0cmVlKExldmVsIC0xKS4KKyAgLy8vIEBwYXJhbSBMZXZlbCAxLi5oZWlnaHQuIFRIZSBub2RlIHRvIHVwZGF0ZSBhZnRlciBwYXJlbnQgbm9kZSBjaGFuZ2VkLgorICB2b2lkIHJlc2V0KHVuc2lnbmVkIExldmVsKSB7CisgICAgcGF0aFtMZXZlbF0gPSBFbnRyeShzdWJ0cmVlKExldmVsIC0gMSksIG9mZnNldChMZXZlbCkpOworICB9CisKKyAgLy8vIHB1c2ggLSBBZGQgZW50cnkgdG8gcGF0aC4KKyAgLy8vIEBwYXJhbSBOb2RlIE5vZGUgdG8gYWRkLCBzaG91bGQgYmUgc3VidHJlZShwYXRoLnNpemUoKS0xKS4KKyAgLy8vIEBwYXJhbSBPZmZzZXQgT2Zmc2V0IGludG8gTm9kZS4KKyAgdm9pZCBwdXNoKE5vZGVSZWYgTm9kZSwgdW5zaWduZWQgT2Zmc2V0KSB7CisgICAgcGF0aC5wdXNoX2JhY2soRW50cnkoTm9kZSwgT2Zmc2V0KSk7CisgIH0KKworICAvLy8gcG9wIC0gUmVtb3ZlIHRoZSBsYXN0IHBhdGggZW50cnkuCisgIHZvaWQgcG9wKCkgeworICAgIHBhdGgucG9wX2JhY2soKTsKKyAgfQorCisgIC8vLyBzZXRTaXplIC0gU2V0IHRoZSBzaXplIG9mIGEgbm9kZSBib3RoIGluIHRoZSBwYXRoIGFuZCBpbiB0aGUgdHJlZS4KKyAgLy8vIEBwYXJhbSBMZXZlbCAwLi5oZWlnaHQuIE5vdGUgdGhhdCBzZXR0aW5nIHRoZSByb290IHNpemUgd29uJ3QgY2hhbmdlCisgIC8vLyAgICAgICAgICAgICAgbWFwLT5yb290U2l6ZS4KKyAgLy8vIEBwYXJhbSBTaXplIE5ldyBub2RlIHNpemUuCisgIHZvaWQgc2V0U2l6ZSh1bnNpZ25lZCBMZXZlbCwgdW5zaWduZWQgU2l6ZSkgeworICAgIHBhdGhbTGV2ZWxdLnNpemUgPSBTaXplOworICAgIGlmIChMZXZlbCkKKyAgICAgIHN1YnRyZWUoTGV2ZWwgLSAxKS5zZXRTaXplKFNpemUpOworICB9CisKKyAgLy8vIHNldFJvb3QgLSBDbGVhciB0aGUgcGF0aCBhbmQgc2V0IGEgbmV3IHJvb3Qgbm9kZS4KKyAgLy8vIEBwYXJhbSBOb2RlIE5ldyByb290IG5vZGUuCisgIC8vLyBAcGFyYW0gU2l6ZSBOZXcgcm9vdCBzaXplLgorICAvLy8gQHBhcmFtIE9mZnNldCBPZmZzZXQgaW50byByb290IG5vZGUuCisgIHZvaWQgc2V0Um9vdCh2b2lkICpOb2RlLCB1bnNpZ25lZCBTaXplLCB1bnNpZ25lZCBPZmZzZXQpIHsKKyAgICBwYXRoLmNsZWFyKCk7CisgICAgcGF0aC5wdXNoX2JhY2soRW50cnkoTm9kZSwgU2l6ZSwgT2Zmc2V0KSk7CisgIH0KKworICAvLy8gcmVwbGFjZVJvb3QgLSBSZXBsYWNlIHRoZSBjdXJyZW50IHJvb3Qgbm9kZSB3aXRoIHR3byBuZXcgZW50cmllcyBhZnRlciB0aGUKKyAgLy8vIHRyZWUgaGVpZ2h0IGhhcyBpbmNyZWFzZWQuCisgIC8vLyBAcGFyYW0gUm9vdCBUaGUgbmV3IHJvb3Qgbm9kZS4KKyAgLy8vIEBwYXJhbSBTaXplIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBuZXcgcm9vdC4KKyAgLy8vIEBwYXJhbSBPZmZzZXRzIE9mZnNldHMgaW50byB0aGUgcm9vdCBhbmQgZmlyc3QgYnJhbmNoIG5vZGVzLgorICB2b2lkIHJlcGxhY2VSb290KHZvaWQgKlJvb3QsIHVuc2lnbmVkIFNpemUsIElkeFBhaXIgT2Zmc2V0cyk7CisKKyAgLy8vIGdldExlZnRTaWJsaW5nIC0gR2V0IHRoZSBsZWZ0IHNpYmxpbmcgbm9kZSBhdCBMZXZlbCwgb3IgYSBudWxsIE5vZGVSZWYuCisgIC8vLyBAcGFyYW0gTGV2ZWwgR2V0IHRoZSBzaWJsaW5nIHRvIG5vZGUoTGV2ZWwpLgorICAvLy8gQHJldHVybiBMZWZ0IHNpYmxpbmcsIG9yIE5vZGVSZWYoKS4KKyAgTm9kZVJlZiBnZXRMZWZ0U2libGluZyh1bnNpZ25lZCBMZXZlbCkgY29uc3Q7CisKKyAgLy8vIG1vdmVMZWZ0IC0gTW92ZSBwYXRoIHRvIHRoZSBsZWZ0IHNpYmxpbmcgYXQgTGV2ZWwuIExlYXZlIG5vZGVzIGJlbG93IExldmVsCisgIC8vLyB1bmFsdGVyZWQuCisgIC8vLyBAcGFyYW0gTGV2ZWwgTW92ZSBub2RlKExldmVsKS4KKyAgdm9pZCBtb3ZlTGVmdCh1bnNpZ25lZCBMZXZlbCk7CisKKyAgLy8vIGZpbGxMZWZ0IC0gR3JvdyBwYXRoIHRvIEhlaWdodCBieSB0YWtpbmcgbGVmdG1vc3QgYnJhbmNoZXMuCisgIC8vLyBAcGFyYW0gSGVpZ2h0IFRoZSB0YXJnZXQgaGVpZ2h0LgorICB2b2lkIGZpbGxMZWZ0KHVuc2lnbmVkIEhlaWdodCkgeworICAgIHdoaWxlIChoZWlnaHQoKSA8IEhlaWdodCkKKyAgICAgIHB1c2goc3VidHJlZShoZWlnaHQoKSksIDApOworICB9CisKKyAgLy8vIGdldExlZnRTaWJsaW5nIC0gR2V0IHRoZSBsZWZ0IHNpYmxpbmcgbm9kZSBhdCBMZXZlbCwgb3IgYSBudWxsIE5vZGVSZWYuCisgIC8vLyBAcGFyYW0gTGV2ZWwgR2V0IHRoZSBzaW5ibGluZyB0byBub2RlKExldmVsKS4KKyAgLy8vIEByZXR1cm4gTGVmdCBzaWJsaW5nLCBvciBOb2RlUmVmKCkuCisgIE5vZGVSZWYgZ2V0UmlnaHRTaWJsaW5nKHVuc2lnbmVkIExldmVsKSBjb25zdDsKKworICAvLy8gbW92ZVJpZ2h0IC0gTW92ZSBwYXRoIHRvIHRoZSBsZWZ0IHNpYmxpbmcgYXQgTGV2ZWwuIExlYXZlIG5vZGVzIGJlbG93CisgIC8vLyBMZXZlbCB1bmFsdGVyZWQuCisgIC8vLyBAcGFyYW0gTGV2ZWwgTW92ZSBub2RlKExldmVsKS4KKyAgdm9pZCBtb3ZlUmlnaHQodW5zaWduZWQgTGV2ZWwpOworCisgIC8vLyBhdEJlZ2luIC0gUmV0dXJuIHRydWUgaWYgcGF0aCBpcyBhdCBiZWdpbigpLgorICBib29sIGF0QmVnaW4oKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IHBhdGguc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChwYXRoW2ldLm9mZnNldCAhPSAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gYXRMYXN0RW50cnkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgcGF0aCBpcyBhdCB0aGUgbGFzdCBlbnRyeSBvZiB0aGUgbm9kZSBhdAorICAvLy8gTGV2ZWwuCisgIC8vLyBAcGFyYW0gTGV2ZWwgTm9kZSB0byBleGFtaW5lLgorICBib29sIGF0TGFzdEVudHJ5KHVuc2lnbmVkIExldmVsKSBjb25zdCB7CisgICAgcmV0dXJuIHBhdGhbTGV2ZWxdLm9mZnNldCA9PSBwYXRoW0xldmVsXS5zaXplIC0gMTsKKyAgfQorCisgIC8vLyBsZWdhbGl6ZUZvckluc2VydCAtIFByZXBhcmUgdGhlIHBhdGggZm9yIGFuIGluc2VydGlvbiBhdCBMZXZlbC4gV2hlbiB0aGUKKyAgLy8vIHBhdGggaXMgYXQgZW5kKCksIG5vZGUoTGV2ZWwpIG1heSBub3QgYmUgYSBsZWdhbCBub2RlLiBsZWdhbGl6ZUZvckluc2VydAorICAvLy8gZW5zdXJlcyB0aGF0IG5vZGUoTGV2ZWwpIGlzIHJlYWwgYnkgbW92aW5nIGJhY2sgdG8gdGhlIGxhc3Qgbm9kZSBhdCBMZXZlbCwKKyAgLy8vIGFuZCBzZXR0aW5nIG9mZnNldChMZXZlbCkgdG8gc2l6ZShMZXZlbCkgaWYgcmVxdWlyZWQuCisgIC8vLyBAcGFyYW0gTGV2ZWwgVGhlIGxldmVsIHdoZXJlIGFuIGluc2VydGlvbiBpcyBhYm91dCB0byB0YWtlIHBsYWNlLgorICB2b2lkIGxlZ2FsaXplRm9ySW5zZXJ0KHVuc2lnbmVkIExldmVsKSB7CisgICAgaWYgKHZhbGlkKCkpCisgICAgICByZXR1cm47CisgICAgbW92ZUxlZnQoTGV2ZWwpOworICAgICsrcGF0aFtMZXZlbF0ub2Zmc2V0OworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgSW50ZXJ2YWxNYXBJbXBsCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy0tLSAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJ2YWxNYXAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsCisgICAgICAgICAgdW5zaWduZWQgTiA9IEludGVydmFsTWFwSW1wbDo6Tm9kZVNpemVyPEtleVQsIFZhbFQ+OjpMZWFmU2l6ZSwKKyAgICAgICAgICB0eXBlbmFtZSBUcmFpdHMgPSBJbnRlcnZhbE1hcEluZm88S2V5VD4+CitjbGFzcyBJbnRlcnZhbE1hcCB7CisgIHVzaW5nIFNpemVyID0gSW50ZXJ2YWxNYXBJbXBsOjpOb2RlU2l6ZXI8S2V5VCwgVmFsVD47CisgIHVzaW5nIExlYWYgPSBJbnRlcnZhbE1hcEltcGw6OkxlYWZOb2RlPEtleVQsIFZhbFQsIFNpemVyOjpMZWFmU2l6ZSwgVHJhaXRzPjsKKyAgdXNpbmcgQnJhbmNoID0KKyAgICAgIEludGVydmFsTWFwSW1wbDo6QnJhbmNoTm9kZTxLZXlULCBWYWxULCBTaXplcjo6QnJhbmNoU2l6ZSwgVHJhaXRzPjsKKyAgdXNpbmcgUm9vdExlYWYgPSBJbnRlcnZhbE1hcEltcGw6OkxlYWZOb2RlPEtleVQsIFZhbFQsIE4sIFRyYWl0cz47CisgIHVzaW5nIElkeFBhaXIgPSBJbnRlcnZhbE1hcEltcGw6OklkeFBhaXI7CisKKyAgLy8gVGhlIFJvb3RMZWFmIGNhcGFjaXR5IGlzIGdpdmVuIGFzIGEgdGVtcGxhdGUgcGFyYW1ldGVyLiBXZSBtdXN0IGNvbXB1dGUgdGhlCisgIC8vIGNvcnJlc3BvbmRpbmcgUm9vdEJyYW5jaCBjYXBhY2l0eS4KKyAgZW51bSB7CisgICAgRGVzaXJlZFJvb3RCcmFuY2hDYXAgPSAoc2l6ZW9mKFJvb3RMZWFmKSAtIHNpemVvZihLZXlUKSkgLworICAgICAgKHNpemVvZihLZXlUKSArIHNpemVvZihJbnRlcnZhbE1hcEltcGw6Ok5vZGVSZWYpKSwKKyAgICBSb290QnJhbmNoQ2FwID0gRGVzaXJlZFJvb3RCcmFuY2hDYXAgPyBEZXNpcmVkUm9vdEJyYW5jaENhcCA6IDEKKyAgfTsKKworICB1c2luZyBSb290QnJhbmNoID0KKyAgICAgIEludGVydmFsTWFwSW1wbDo6QnJhbmNoTm9kZTxLZXlULCBWYWxULCBSb290QnJhbmNoQ2FwLCBUcmFpdHM+OworCisgIC8vIFdoZW4gYnJhbmNoZWQsIHdlIHN0b3JlIGEgZ2xvYmFsIHN0YXJ0IGtleSBhcyB3ZWxsIGFzIHRoZSBicmFuY2ggbm9kZS4KKyAgc3RydWN0IFJvb3RCcmFuY2hEYXRhIHsKKyAgICBLZXlUIHN0YXJ0OworICAgIFJvb3RCcmFuY2ggbm9kZTsKKyAgfTsKKworcHVibGljOgorICB1c2luZyBBbGxvY2F0b3IgPSB0eXBlbmFtZSBTaXplcjo6QWxsb2NhdG9yOworICB1c2luZyBLZXlUeXBlID0gS2V5VDsKKyAgdXNpbmcgVmFsdWVUeXBlID0gVmFsVDsKKyAgdXNpbmcgS2V5VHJhaXRzID0gVHJhaXRzOworCitwcml2YXRlOgorICAvLyBUaGUgcm9vdCBkYXRhIGlzIGVpdGhlciBhIFJvb3RMZWFmIG9yIGEgUm9vdEJyYW5jaERhdGEgaW5zdGFuY2UuCisgIEFsaWduZWRDaGFyQXJyYXlVbmlvbjxSb290TGVhZiwgUm9vdEJyYW5jaERhdGE+IGRhdGE7CisKKyAgLy8gVHJlZSBoZWlnaHQuCisgIC8vIDA6IExlYXZlcyBpbiByb290LgorICAvLyAxOiBSb290IHBvaW50cyB0byBsZWFmLgorICAvLyAyOiByb290LT5icmFuY2gtPmxlYWYgLi4uCisgIHVuc2lnbmVkIGhlaWdodDsKKworICAvLyBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcm9vdCBub2RlLgorICB1bnNpZ25lZCByb290U2l6ZTsKKworICAvLyBBbGxvY2F0b3IgdXNlZCBmb3IgY3JlYXRpbmcgZXh0ZXJuYWwgbm9kZXMuCisgIEFsbG9jYXRvciAmYWxsb2NhdG9yOworCisgIC8vLyBkYXRhQXMgLSBSZXByZXNlbnQgZGF0YSBhcyBhIG5vZGUgdHlwZSB3aXRob3V0IGJyZWFraW5nIGFsaWFzaW5nIHJ1bGVzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgVCAmZGF0YUFzKCkgY29uc3QgeworICAgIHVuaW9uIHsKKyAgICAgIGNvbnN0IGNoYXIgKmQ7CisgICAgICBUICp0OworICAgIH0gdTsKKyAgICB1LmQgPSBkYXRhLmJ1ZmZlcjsKKyAgICByZXR1cm4gKnUudDsKKyAgfQorCisgIGNvbnN0IFJvb3RMZWFmICZyb290TGVhZigpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWJyYW5jaGVkKCkgJiYgIkNhbm5vdCBhY2NlcyBsZWFmIGRhdGEgaW4gYnJhbmNoZWQgcm9vdCIpOworICAgIHJldHVybiBkYXRhQXM8Um9vdExlYWY+KCk7CisgIH0KKyAgUm9vdExlYWYgJnJvb3RMZWFmKCkgeworICAgIGFzc2VydCghYnJhbmNoZWQoKSAmJiAiQ2Fubm90IGFjY2VzIGxlYWYgZGF0YSBpbiBicmFuY2hlZCByb290Iik7CisgICAgcmV0dXJuIGRhdGFBczxSb290TGVhZj4oKTsKKyAgfQorCisgIFJvb3RCcmFuY2hEYXRhICZyb290QnJhbmNoRGF0YSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoYnJhbmNoZWQoKSAmJiAiQ2Fubm90IGFjY2VzcyBicmFuY2ggZGF0YSBpbiBub24tYnJhbmNoZWQgcm9vdCIpOworICAgIHJldHVybiBkYXRhQXM8Um9vdEJyYW5jaERhdGE+KCk7CisgIH0KKyAgUm9vdEJyYW5jaERhdGEgJnJvb3RCcmFuY2hEYXRhKCkgeworICAgIGFzc2VydChicmFuY2hlZCgpICYmICJDYW5ub3QgYWNjZXNzIGJyYW5jaCBkYXRhIGluIG5vbi1icmFuY2hlZCByb290Iik7CisgICAgcmV0dXJuIGRhdGFBczxSb290QnJhbmNoRGF0YT4oKTsKKyAgfQorCisgIGNvbnN0IFJvb3RCcmFuY2ggJnJvb3RCcmFuY2goKSBjb25zdCB7IHJldHVybiByb290QnJhbmNoRGF0YSgpLm5vZGU7IH0KKyAgUm9vdEJyYW5jaCAmcm9vdEJyYW5jaCgpICAgICAgICAgICAgIHsgcmV0dXJuIHJvb3RCcmFuY2hEYXRhKCkubm9kZTsgfQorICBLZXlUIHJvb3RCcmFuY2hTdGFydCgpIGNvbnN0IHsgcmV0dXJuIHJvb3RCcmFuY2hEYXRhKCkuc3RhcnQ7IH0KKyAgS2V5VCAmcm9vdEJyYW5jaFN0YXJ0KCkgICAgICB7IHJldHVybiByb290QnJhbmNoRGF0YSgpLnN0YXJ0OyB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVUPiBOb2RlVCAqbmV3Tm9kZSgpIHsKKyAgICByZXR1cm4gbmV3KGFsbG9jYXRvci50ZW1wbGF0ZSBBbGxvY2F0ZTxOb2RlVD4oKSkgTm9kZVQoKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVD4gdm9pZCBkZWxldGVOb2RlKE5vZGVUICpQKSB7CisgICAgUC0+fk5vZGVUKCk7CisgICAgYWxsb2NhdG9yLkRlYWxsb2NhdGUoUCk7CisgIH0KKworICBJZHhQYWlyIGJyYW5jaFJvb3QodW5zaWduZWQgUG9zaXRpb24pOworICBJZHhQYWlyIHNwbGl0Um9vdCh1bnNpZ25lZCBQb3NpdGlvbik7CisKKyAgdm9pZCBzd2l0Y2hSb290VG9CcmFuY2goKSB7CisgICAgcm9vdExlYWYoKS5+Um9vdExlYWYoKTsKKyAgICBoZWlnaHQgPSAxOworICAgIG5ldyAoJnJvb3RCcmFuY2hEYXRhKCkpIFJvb3RCcmFuY2hEYXRhKCk7CisgIH0KKworICB2b2lkIHN3aXRjaFJvb3RUb0xlYWYoKSB7CisgICAgcm9vdEJyYW5jaERhdGEoKS5+Um9vdEJyYW5jaERhdGEoKTsKKyAgICBoZWlnaHQgPSAwOworICAgIG5ldygmcm9vdExlYWYoKSkgUm9vdExlYWYoKTsKKyAgfQorCisgIGJvb2wgYnJhbmNoZWQoKSBjb25zdCB7IHJldHVybiBoZWlnaHQgPiAwOyB9CisKKyAgVmFsVCB0cmVlU2FmZUxvb2t1cChLZXlUIHgsIFZhbFQgTm90Rm91bmQpIGNvbnN0OworICB2b2lkIHZpc2l0Tm9kZXModm9pZCAoSW50ZXJ2YWxNYXA6OipmKShJbnRlcnZhbE1hcEltcGw6Ok5vZGVSZWYsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMZXZlbCkpOworICB2b2lkIGRlbGV0ZU5vZGUoSW50ZXJ2YWxNYXBJbXBsOjpOb2RlUmVmIE5vZGUsIHVuc2lnbmVkIExldmVsKTsKKworcHVibGljOgorICBleHBsaWNpdCBJbnRlcnZhbE1hcChBbGxvY2F0b3IgJmEpIDogaGVpZ2h0KDApLCByb290U2l6ZSgwKSwgYWxsb2NhdG9yKGEpIHsKKyAgICBhc3NlcnQoKHVpbnRwdHJfdChkYXRhLmJ1ZmZlcikgJiAoYWxpZ25vZihSb290TGVhZikgLSAxKSkgPT0gMCAmJgorICAgICAgICAgICAiSW5zdWZmaWNpZW50IGFsaWdubWVudCIpOworICAgIG5ldygmcm9vdExlYWYoKSkgUm9vdExlYWYoKTsKKyAgfQorCisgIH5JbnRlcnZhbE1hcCgpIHsKKyAgICBjbGVhcigpOworICAgIHJvb3RMZWFmKCkuflJvb3RMZWFmKCk7CisgIH0KKworICAvLy8gZW1wdHkgLSAgUmV0dXJuIHRydWUgd2hlbiBubyBpbnRlcnZhbHMgYXJlIG1hcHBlZC4KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gcm9vdFNpemUgPT0gMDsKKyAgfQorCisgIC8vLyBzdGFydCAtIFJldHVybiB0aGUgc21hbGxlc3QgbWFwcGVkIGtleSBpbiBhIG5vbi1lbXB0eSBtYXAuCisgIEtleVQgc3RhcnQoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFlbXB0eSgpICYmICJFbXB0eSBJbnRlcnZhbE1hcCBoYXMgbm8gc3RhcnQiKTsKKyAgICByZXR1cm4gIWJyYW5jaGVkKCkgPyByb290TGVhZigpLnN0YXJ0KDApIDogcm9vdEJyYW5jaFN0YXJ0KCk7CisgIH0KKworICAvLy8gc3RvcCAtIFJldHVybiB0aGUgbGFyZ2VzdCBtYXBwZWQga2V5IGluIGEgbm9uLWVtcHR5IG1hcC4KKyAgS2V5VCBzdG9wKCkgY29uc3QgeworICAgIGFzc2VydCghZW1wdHkoKSAmJiAiRW1wdHkgSW50ZXJ2YWxNYXAgaGFzIG5vIHN0b3AiKTsKKyAgICByZXR1cm4gIWJyYW5jaGVkKCkgPyByb290TGVhZigpLnN0b3Aocm9vdFNpemUgLSAxKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdEJyYW5jaCgpLnN0b3Aocm9vdFNpemUgLSAxKTsKKyAgfQorCisgIC8vLyBsb29rdXAgLSBSZXR1cm4gdGhlIG1hcHBlZCB2YWx1ZSBhdCB4IG9yIE5vdEZvdW5kLgorICBWYWxUIGxvb2t1cChLZXlUIHgsIFZhbFQgTm90Rm91bmQgPSBWYWxUKCkpIGNvbnN0IHsKKyAgICBpZiAoZW1wdHkoKSB8fCBUcmFpdHM6OnN0YXJ0TGVzcyh4LCBzdGFydCgpKSB8fCBUcmFpdHM6OnN0b3BMZXNzKHN0b3AoKSwgeCkpCisgICAgICByZXR1cm4gTm90Rm91bmQ7CisgICAgcmV0dXJuIGJyYW5jaGVkKCkgPyB0cmVlU2FmZUxvb2t1cCh4LCBOb3RGb3VuZCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgcm9vdExlYWYoKS5zYWZlTG9va3VwKHgsIE5vdEZvdW5kKTsKKyAgfQorCisgIC8vLyBpbnNlcnQgLSBBZGQgYSBtYXBwaW5nIG9mIFthO2JdIHRvIHksIGNvYWxlc2NlIHdpdGggYWRqYWNlbnQgaW50ZXJ2YWxzLgorICAvLy8gSXQgaXMgYXNzdW1lZCB0aGF0IG5vIGtleSBpbiB0aGUgaW50ZXJ2YWwgaXMgbWFwcGVkIHRvIGFub3RoZXIgdmFsdWUsIGJ1dAorICAvLy8gb3ZlcmxhcHBpbmcgaW50ZXJ2YWxzIGFscmVhZHkgbWFwcGVkIHRvIHkgd2lsbCBiZSBjb2FsZXNjZWQuCisgIHZvaWQgaW5zZXJ0KEtleVQgYSwgS2V5VCBiLCBWYWxUIHkpIHsKKyAgICBpZiAoYnJhbmNoZWQoKSB8fCByb290U2l6ZSA9PSBSb290TGVhZjo6Q2FwYWNpdHkpCisgICAgICByZXR1cm4gZmluZChhKS5pbnNlcnQoYSwgYiwgeSk7CisKKyAgICAvLyBFYXN5IGluc2VydCBpbnRvIHJvb3QgbGVhZi4KKyAgICB1bnNpZ25lZCBwID0gcm9vdExlYWYoKS5maW5kRnJvbSgwLCByb290U2l6ZSwgYSk7CisgICAgcm9vdFNpemUgPSByb290TGVhZigpLmluc2VydEZyb20ocCwgcm9vdFNpemUsIGEsIGIsIHkpOworICB9CisKKyAgLy8vIGNsZWFyIC0gUmVtb3ZlIGFsbCBlbnRyaWVzLgorICB2b2lkIGNsZWFyKCk7CisKKyAgY2xhc3MgY29uc3RfaXRlcmF0b3I7CisgIGNsYXNzIGl0ZXJhdG9yOworICBmcmllbmQgY2xhc3MgY29uc3RfaXRlcmF0b3I7CisgIGZyaWVuZCBjbGFzcyBpdGVyYXRvcjsKKworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKKyAgICBjb25zdF9pdGVyYXRvciBJKCp0aGlzKTsKKyAgICBJLmdvVG9CZWdpbigpOworICAgIHJldHVybiBJOworICB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7CisgICAgaXRlcmF0b3IgSSgqdGhpcyk7CisgICAgSS5nb1RvQmVnaW4oKTsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKKyAgICBjb25zdF9pdGVyYXRvciBJKCp0aGlzKTsKKyAgICBJLmdvVG9FbmQoKTsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIGl0ZXJhdG9yIGVuZCgpIHsKKyAgICBpdGVyYXRvciBJKCp0aGlzKTsKKyAgICBJLmdvVG9FbmQoKTsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIC8vLyBmaW5kIC0gUmV0dXJuIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBmaXJzdCBpbnRlcnZhbCBlbmRpbmcgYXQgb3IKKyAgLy8vIGFmdGVyIHgsIG9yIGVuZCgpLgorICBjb25zdF9pdGVyYXRvciBmaW5kKEtleVQgeCkgY29uc3QgeworICAgIGNvbnN0X2l0ZXJhdG9yIEkoKnRoaXMpOworICAgIEkuZmluZCh4KTsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIGl0ZXJhdG9yIGZpbmQoS2V5VCB4KSB7CisgICAgaXRlcmF0b3IgSSgqdGhpcyk7CisgICAgSS5maW5kKHgpOworICAgIHJldHVybiBJOworICB9Cit9OworCisvLy8gdHJlZVNhZmVMb29rdXAgLSBSZXR1cm4gdGhlIG1hcHBlZCB2YWx1ZSBhdCB4IG9yIE5vdEZvdW5kLCBhc3N1bWluZyBhCisvLy8gYnJhbmNoZWQgcm9vdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBUcmFpdHM+CitWYWxUIEludGVydmFsTWFwPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46OgordHJlZVNhZmVMb29rdXAoS2V5VCB4LCBWYWxUIE5vdEZvdW5kKSBjb25zdCB7CisgIGFzc2VydChicmFuY2hlZCgpICYmICJ0cmVlTG9va3VwIGFzc3VtZXMgYSBicmFuY2hlZCByb290Iik7CisKKyAgSW50ZXJ2YWxNYXBJbXBsOjpOb2RlUmVmIE5SID0gcm9vdEJyYW5jaCgpLnNhZmVMb29rdXAoeCk7CisgIGZvciAodW5zaWduZWQgaCA9IGhlaWdodC0xOyBoOyAtLWgpCisgICAgTlIgPSBOUi5nZXQ8QnJhbmNoPigpLnNhZmVMb29rdXAoeCk7CisgIHJldHVybiBOUi5nZXQ8TGVhZj4oKS5zYWZlTG9va3VwKHgsIE5vdEZvdW5kKTsKK30KKworLy8gYnJhbmNoUm9vdCAtIFN3aXRjaCBmcm9tIGEgbGVhZiByb290IHRvIGEgYnJhbmNoZWQgcm9vdC4KKy8vIFJldHVybiB0aGUgbmV3IChyb290IG9mZnNldCwgbm9kZSBvZmZzZXQpIGNvcnJlc3BvbmRpbmcgdG8gUG9zaXRpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwgdW5zaWduZWQgTiwgdHlwZW5hbWUgVHJhaXRzPgorSW50ZXJ2YWxNYXBJbXBsOjpJZHhQYWlyIEludGVydmFsTWFwPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46OgorYnJhbmNoUm9vdCh1bnNpZ25lZCBQb3NpdGlvbikgeworICB1c2luZyBuYW1lc3BhY2UgSW50ZXJ2YWxNYXBJbXBsOworICAvLyBIb3cgbWFueSBleHRlcm5hbCBsZWFmIG5vZGVzIHRvIGhvbGQgUm9vdExlYWYrMT8KKyAgY29uc3QgdW5zaWduZWQgTm9kZXMgPSBSb290TGVhZjo6Q2FwYWNpdHkgLyBMZWFmOjpDYXBhY2l0eSArIDE7CisKKyAgLy8gQ29tcHV0ZSBlbGVtZW50IGRpc3RyaWJ1dGlvbiBhbW9uZyBuZXcgbm9kZXMuCisgIHVuc2lnbmVkIHNpemVbTm9kZXNdOworICBJZHhQYWlyIE5ld09mZnNldCgwLCBQb3NpdGlvbik7CisKKyAgLy8gSXMgaXMgdmVyeSBjb21tb24gZm9yIHRoZSByb290IG5vZGUgdG8gYmUgc21hbGxlciB0aGFuIGV4dGVybmFsIG5vZGVzLgorICBpZiAoTm9kZXMgPT0gMSkKKyAgICBzaXplWzBdID0gcm9vdFNpemU7CisgIGVsc2UKKyAgICBOZXdPZmZzZXQgPSBkaXN0cmlidXRlKE5vZGVzLCByb290U2l6ZSwgTGVhZjo6Q2FwYWNpdHksICBudWxscHRyLCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUG9zaXRpb24sIHRydWUpOworCisgIC8vIEFsbG9jYXRlIG5ldyBub2Rlcy4KKyAgdW5zaWduZWQgcG9zID0gMDsKKyAgTm9kZVJlZiBub2RlW05vZGVzXTsKKyAgZm9yICh1bnNpZ25lZCBuID0gMDsgbiAhPSBOb2RlczsgKytuKSB7CisgICAgTGVhZiAqTCA9IG5ld05vZGU8TGVhZj4oKTsKKyAgICBMLT5jb3B5KHJvb3RMZWFmKCksIHBvcywgMCwgc2l6ZVtuXSk7CisgICAgbm9kZVtuXSA9IE5vZGVSZWYoTCwgc2l6ZVtuXSk7CisgICAgcG9zICs9IHNpemVbbl07CisgIH0KKworICAvLyBEZXN0cm95IHRoZSBvbGQgbGVhZiBub2RlLCBjb25zdHJ1Y3QgYnJhbmNoIG5vZGUgaW5zdGVhZC4KKyAgc3dpdGNoUm9vdFRvQnJhbmNoKCk7CisgIGZvciAodW5zaWduZWQgbiA9IDA7IG4gIT0gTm9kZXM7ICsrbikgeworICAgIHJvb3RCcmFuY2goKS5zdG9wKG4pID0gbm9kZVtuXS50ZW1wbGF0ZSBnZXQ8TGVhZj4oKS5zdG9wKHNpemVbbl0tMSk7CisgICAgcm9vdEJyYW5jaCgpLnN1YnRyZWUobikgPSBub2RlW25dOworICB9CisgIHJvb3RCcmFuY2hTdGFydCgpID0gbm9kZVswXS50ZW1wbGF0ZSBnZXQ8TGVhZj4oKS5zdGFydCgwKTsKKyAgcm9vdFNpemUgPSBOb2RlczsKKyAgcmV0dXJuIE5ld09mZnNldDsKK30KKworLy8gc3BsaXRSb290IC0gU3BsaXQgdGhlIGN1cnJlbnQgQnJhbmNoUm9vdCBpbnRvIG11bHRpcGxlIEJyYW5jaCBub2Rlcy4KKy8vIFJldHVybiB0aGUgbmV3IChyb290IG9mZnNldCwgbm9kZSBvZmZzZXQpIGNvcnJlc3BvbmRpbmcgdG8gUG9zaXRpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwgdW5zaWduZWQgTiwgdHlwZW5hbWUgVHJhaXRzPgorSW50ZXJ2YWxNYXBJbXBsOjpJZHhQYWlyIEludGVydmFsTWFwPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46Ogorc3BsaXRSb290KHVuc2lnbmVkIFBvc2l0aW9uKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBJbnRlcnZhbE1hcEltcGw7CisgIC8vIEhvdyBtYW55IGV4dGVybmFsIGxlYWYgbm9kZXMgdG8gaG9sZCBSb290QnJhbmNoKzE/CisgIGNvbnN0IHVuc2lnbmVkIE5vZGVzID0gUm9vdEJyYW5jaDo6Q2FwYWNpdHkgLyBCcmFuY2g6OkNhcGFjaXR5ICsgMTsKKworICAvLyBDb21wdXRlIGVsZW1lbnQgZGlzdHJpYnV0aW9uIGFtb25nIG5ldyBub2Rlcy4KKyAgdW5zaWduZWQgU2l6ZVtOb2Rlc107CisgIElkeFBhaXIgTmV3T2Zmc2V0KDAsIFBvc2l0aW9uKTsKKworICAvLyBJcyBpcyB2ZXJ5IGNvbW1vbiBmb3IgdGhlIHJvb3Qgbm9kZSB0byBiZSBzbWFsbGVyIHRoYW4gZXh0ZXJuYWwgbm9kZXMuCisgIGlmIChOb2RlcyA9PSAxKQorICAgIFNpemVbMF0gPSByb290U2l6ZTsKKyAgZWxzZQorICAgIE5ld09mZnNldCA9IGRpc3RyaWJ1dGUoTm9kZXMsIHJvb3RTaXplLCBMZWFmOjpDYXBhY2l0eSwgIG51bGxwdHIsIFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3NpdGlvbiwgdHJ1ZSk7CisKKyAgLy8gQWxsb2NhdGUgbmV3IG5vZGVzLgorICB1bnNpZ25lZCBQb3MgPSAwOworICBOb2RlUmVmIE5vZGVbTm9kZXNdOworICBmb3IgKHVuc2lnbmVkIG4gPSAwOyBuICE9IE5vZGVzOyArK24pIHsKKyAgICBCcmFuY2ggKkIgPSBuZXdOb2RlPEJyYW5jaD4oKTsKKyAgICBCLT5jb3B5KHJvb3RCcmFuY2goKSwgUG9zLCAwLCBTaXplW25dKTsKKyAgICBOb2RlW25dID0gTm9kZVJlZihCLCBTaXplW25dKTsKKyAgICBQb3MgKz0gU2l6ZVtuXTsKKyAgfQorCisgIGZvciAodW5zaWduZWQgbiA9IDA7IG4gIT0gTm9kZXM7ICsrbikgeworICAgIHJvb3RCcmFuY2goKS5zdG9wKG4pID0gTm9kZVtuXS50ZW1wbGF0ZSBnZXQ8QnJhbmNoPigpLnN0b3AoU2l6ZVtuXS0xKTsKKyAgICByb290QnJhbmNoKCkuc3VidHJlZShuKSA9IE5vZGVbbl07CisgIH0KKyAgcm9vdFNpemUgPSBOb2RlczsKKyAgKytoZWlnaHQ7CisgIHJldHVybiBOZXdPZmZzZXQ7Cit9CisKKy8vLyB2aXNpdE5vZGVzIC0gVmlzaXQgZWFjaCBleHRlcm5hbCBub2RlLgordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KK3ZvaWQgSW50ZXJ2YWxNYXA8S2V5VCwgVmFsVCwgTiwgVHJhaXRzPjo6Cit2aXNpdE5vZGVzKHZvaWQgKEludGVydmFsTWFwOjoqZikoSW50ZXJ2YWxNYXBJbXBsOjpOb2RlUmVmLCB1bnNpZ25lZCBIZWlnaHQpKSB7CisgIGlmICghYnJhbmNoZWQoKSkKKyAgICByZXR1cm47CisgIFNtYWxsVmVjdG9yPEludGVydmFsTWFwSW1wbDo6Tm9kZVJlZiwgND4gUmVmcywgTmV4dFJlZnM7CisKKyAgLy8gQ29sbGVjdCBsZXZlbCAwIG5vZGVzIGZyb20gdGhlIHJvb3QuCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gcm9vdFNpemU7ICsraSkKKyAgICBSZWZzLnB1c2hfYmFjayhyb290QnJhbmNoKCkuc3VidHJlZShpKSk7CisKKyAgLy8gVmlzaXQgYWxsIGJyYW5jaCBub2Rlcy4KKyAgZm9yICh1bnNpZ25lZCBoID0gaGVpZ2h0IC0gMTsgaDsgLS1oKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFJlZnMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgZm9yICh1bnNpZ25lZCBqID0gMCwgcyA9IFJlZnNbaV0uc2l6ZSgpOyBqICE9IHM7ICsraikKKyAgICAgICAgTmV4dFJlZnMucHVzaF9iYWNrKFJlZnNbaV0uc3VidHJlZShqKSk7CisgICAgICAodGhpcy0+KmYpKFJlZnNbaV0sIGgpOworICAgIH0KKyAgICBSZWZzLmNsZWFyKCk7CisgICAgUmVmcy5zd2FwKE5leHRSZWZzKTsKKyAgfQorCisgIC8vIFZpc2l0IGFsbCBsZWFmIG5vZGVzLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gUmVmcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICh0aGlzLT4qZikoUmVmc1tpXSwgMCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBUcmFpdHM+Cit2b2lkIEludGVydmFsTWFwPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46OgorZGVsZXRlTm9kZShJbnRlcnZhbE1hcEltcGw6Ok5vZGVSZWYgTm9kZSwgdW5zaWduZWQgTGV2ZWwpIHsKKyAgaWYgKExldmVsKQorICAgIGRlbGV0ZU5vZGUoJk5vZGUuZ2V0PEJyYW5jaD4oKSk7CisgIGVsc2UKKyAgICBkZWxldGVOb2RlKCZOb2RlLmdldDxMZWFmPigpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KK3ZvaWQgSW50ZXJ2YWxNYXA8S2V5VCwgVmFsVCwgTiwgVHJhaXRzPjo6CitjbGVhcigpIHsKKyAgaWYgKGJyYW5jaGVkKCkpIHsKKyAgICB2aXNpdE5vZGVzKCZJbnRlcnZhbE1hcDo6ZGVsZXRlTm9kZSk7CisgICAgc3dpdGNoUm9vdFRvTGVhZigpOworICB9CisgIHJvb3RTaXplID0gMDsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLS0tICAgICAgICAgICAgICAgICAgIEludGVydmFsTWFwOjpjb25zdF9pdGVyYXRvciAgICAgICAgICAgICAgICAgICAgICAgLS0tLS8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwgdW5zaWduZWQgTiwgdHlwZW5hbWUgVHJhaXRzPgorY2xhc3MgSW50ZXJ2YWxNYXA8S2V5VCwgVmFsVCwgTiwgVHJhaXRzPjo6Y29uc3RfaXRlcmF0b3IgOgorICBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnLCBWYWxUPiB7CisKK3Byb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIEludGVydmFsTWFwOworCisgIC8vIFRoZSBtYXAgcmVmZXJyZWQgdG8uCisgIEludGVydmFsTWFwICptYXAgPSBudWxscHRyOworCisgIC8vIFdlIHN0b3JlIGEgZnVsbCBwYXRoIGZyb20gdGhlIHJvb3QgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgIC8vIFRoZSBwYXRoIG1heSBiZSBwYXJ0aWFsbHkgZmlsbGVkLCBidXQgbmV2ZXIgYmV0d2VlbiBpdGVyYXRvciBjYWxscy4KKyAgSW50ZXJ2YWxNYXBJbXBsOjpQYXRoIHBhdGg7CisKKyAgZXhwbGljaXQgY29uc3RfaXRlcmF0b3IoY29uc3QgSW50ZXJ2YWxNYXAgJm1hcCkgOgorICAgIG1hcChjb25zdF9jYXN0PEludGVydmFsTWFwKj4oJm1hcCkpIHt9CisKKyAgYm9vbCBicmFuY2hlZCgpIGNvbnN0IHsKKyAgICBhc3NlcnQobWFwICYmICJJbnZhbGlkIGl0ZXJhdG9yIik7CisgICAgcmV0dXJuIG1hcC0+YnJhbmNoZWQoKTsKKyAgfQorCisgIHZvaWQgc2V0Um9vdCh1bnNpZ25lZCBPZmZzZXQpIHsKKyAgICBpZiAoYnJhbmNoZWQoKSkKKyAgICAgIHBhdGguc2V0Um9vdCgmbWFwLT5yb290QnJhbmNoKCksIG1hcC0+cm9vdFNpemUsIE9mZnNldCk7CisgICAgZWxzZQorICAgICAgcGF0aC5zZXRSb290KCZtYXAtPnJvb3RMZWFmKCksIG1hcC0+cm9vdFNpemUsIE9mZnNldCk7CisgIH0KKworICB2b2lkIHBhdGhGaWxsRmluZChLZXlUIHgpOworICB2b2lkIHRyZWVGaW5kKEtleVQgeCk7CisgIHZvaWQgdHJlZUFkdmFuY2VUbyhLZXlUIHgpOworCisgIC8vLyB1bnNhZmVTdGFydCAtIFdyaXRhYmxlIGFjY2VzcyB0byBzdGFydCgpIGZvciBpdGVyYXRvci4KKyAgS2V5VCAmdW5zYWZlU3RhcnQoKSBjb25zdCB7CisgICAgYXNzZXJ0KHZhbGlkKCkgJiYgIkNhbm5vdCBhY2Nlc3MgaW52YWxpZCBpdGVyYXRvciIpOworICAgIHJldHVybiBicmFuY2hlZCgpID8gcGF0aC5sZWFmPExlYWY+KCkuc3RhcnQocGF0aC5sZWFmT2Zmc2V0KCkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgubGVhZjxSb290TGVhZj4oKS5zdGFydChwYXRoLmxlYWZPZmZzZXQoKSk7CisgIH0KKworICAvLy8gdW5zYWZlU3RvcCAtIFdyaXRhYmxlIGFjY2VzcyB0byBzdG9wKCkgZm9yIGl0ZXJhdG9yLgorICBLZXlUICZ1bnNhZmVTdG9wKCkgY29uc3QgeworICAgIGFzc2VydCh2YWxpZCgpICYmICJDYW5ub3QgYWNjZXNzIGludmFsaWQgaXRlcmF0b3IiKTsKKyAgICByZXR1cm4gYnJhbmNoZWQoKSA/IHBhdGgubGVhZjxMZWFmPigpLnN0b3AocGF0aC5sZWFmT2Zmc2V0KCkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgubGVhZjxSb290TGVhZj4oKS5zdG9wKHBhdGgubGVhZk9mZnNldCgpKTsKKyAgfQorCisgIC8vLyB1bnNhZmVWYWx1ZSAtIFdyaXRhYmxlIGFjY2VzcyB0byB2YWx1ZSgpIGZvciBpdGVyYXRvci4KKyAgVmFsVCAmdW5zYWZlVmFsdWUoKSBjb25zdCB7CisgICAgYXNzZXJ0KHZhbGlkKCkgJiYgIkNhbm5vdCBhY2Nlc3MgaW52YWxpZCBpdGVyYXRvciIpOworICAgIHJldHVybiBicmFuY2hlZCgpID8gcGF0aC5sZWFmPExlYWY+KCkudmFsdWUocGF0aC5sZWFmT2Zmc2V0KCkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgubGVhZjxSb290TGVhZj4oKS52YWx1ZShwYXRoLmxlYWZPZmZzZXQoKSk7CisgIH0KKworcHVibGljOgorICAvLy8gY29uc3RfaXRlcmF0b3IgLSBDcmVhdGUgYW4gaXRlcmF0b3IgdGhhdCBpc24ndCBwb2ludGluZyBhbnl3aGVyZS4KKyAgY29uc3RfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIHNldE1hcCAtIENoYW5nZSB0aGUgbWFwIGl0ZXJhdGVkIG92ZXIuIFRoaXMgY2FsbCBtdXN0IGJlIGZvbGxvd2VkIGJ5IGEKKyAgLy8vIGNhbGwgdG8gZ29Ub0JlZ2luKCksIGdvVG9FbmQoKSwgb3IgZmluZCgpCisgIHZvaWQgc2V0TWFwKGNvbnN0IEludGVydmFsTWFwICZtKSB7IG1hcCA9IGNvbnN0X2Nhc3Q8SW50ZXJ2YWxNYXAqPigmbSk7IH0KKworICAvLy8gdmFsaWQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyB2YWxpZCwgZmFsc2UgZm9yIGVuZCgpLgorICBib29sIHZhbGlkKCkgY29uc3QgeyByZXR1cm4gcGF0aC52YWxpZCgpOyB9CisKKyAgLy8vIGF0QmVnaW4gLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgY3VycmVudCBwb3NpdGlvbiBpcyB0aGUgZmlyc3QgbWFwIGVudHJ5LgorICBib29sIGF0QmVnaW4oKSBjb25zdCB7IHJldHVybiBwYXRoLmF0QmVnaW4oKTsgfQorCisgIC8vLyBzdGFydCAtIFJldHVybiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IGludGVydmFsLgorICBjb25zdCBLZXlUICZzdGFydCgpIGNvbnN0IHsgcmV0dXJuIHVuc2FmZVN0YXJ0KCk7IH0KKworICAvLy8gc3RvcCAtIFJldHVybiB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGludGVydmFsLgorICBjb25zdCBLZXlUICZzdG9wKCkgY29uc3QgeyByZXR1cm4gdW5zYWZlU3RvcCgpOyB9CisKKyAgLy8vIHZhbHVlIC0gUmV0dXJuIHRoZSBtYXBwZWQgdmFsdWUgYXQgdGhlIGN1cnJlbnQgaW50ZXJ2YWwuCisgIGNvbnN0IFZhbFQgJnZhbHVlKCkgY29uc3QgeyByZXR1cm4gdW5zYWZlVmFsdWUoKTsgfQorCisgIGNvbnN0IFZhbFQgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIHZhbHVlKCk7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgY29uc3RfaXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgIGFzc2VydChtYXAgPT0gUkhTLm1hcCAmJiAiQ2Fubm90IGNvbXBhcmUgaXRlcmF0b3JzIGZyb20gZGlmZmVyZW50IG1hcHMiKTsKKyAgICBpZiAoIXZhbGlkKCkpCisgICAgICByZXR1cm4gIVJIUy52YWxpZCgpOworICAgIGlmIChwYXRoLmxlYWZPZmZzZXQoKSAhPSBSSFMucGF0aC5sZWFmT2Zmc2V0KCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuICZwYXRoLnRlbXBsYXRlIGxlYWY8TGVhZj4oKSA9PSAmUkhTLnBhdGgudGVtcGxhdGUgbGVhZjxMZWFmPigpOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNvbnN0X2l0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gIW9wZXJhdG9yPT0oUkhTKTsKKyAgfQorCisgIC8vLyBnb1RvQmVnaW4gLSBNb3ZlIHRvIHRoZSBmaXJzdCBpbnRlcnZhbCBpbiBtYXAuCisgIHZvaWQgZ29Ub0JlZ2luKCkgeworICAgIHNldFJvb3QoMCk7CisgICAgaWYgKGJyYW5jaGVkKCkpCisgICAgICBwYXRoLmZpbGxMZWZ0KG1hcC0+aGVpZ2h0KTsKKyAgfQorCisgIC8vLyBnb1RvRW5kIC0gTW92ZSBiZXlvbmQgdGhlIGxhc3QgaW50ZXJ2YWwgaW4gbWFwLgorICB2b2lkIGdvVG9FbmQoKSB7CisgICAgc2V0Um9vdChtYXAtPnJvb3RTaXplKTsKKyAgfQorCisgIC8vLyBwcmVpbmNyZW1lbnQgLSBtb3ZlIHRvIHRoZSBuZXh0IGludGVydmFsLgorICBjb25zdF9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICBhc3NlcnQodmFsaWQoKSAmJiAiQ2Fubm90IGluY3JlbWVudCBlbmQoKSIpOworICAgIGlmICgrK3BhdGgubGVhZk9mZnNldCgpID09IHBhdGgubGVhZlNpemUoKSAmJiBicmFuY2hlZCgpKQorICAgICAgcGF0aC5tb3ZlUmlnaHQobWFwLT5oZWlnaHQpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBwb3N0aW5jcmVtZW50IC0gRG9udCBkbyB0aGF0IQorICBjb25zdF9pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeworICAgIGNvbnN0X2l0ZXJhdG9yIHRtcCA9ICp0aGlzOworICAgIG9wZXJhdG9yKysoKTsKKyAgICByZXR1cm4gdG1wOworICB9CisKKyAgLy8vIHByZWRlY3JlbWVudCAtIG1vdmUgdG8gdGhlIHByZXZpb3VzIGludGVydmFsLgorICBjb25zdF9pdGVyYXRvciAmb3BlcmF0b3ItLSgpIHsKKyAgICBpZiAocGF0aC5sZWFmT2Zmc2V0KCkgJiYgKHZhbGlkKCkgfHwgIWJyYW5jaGVkKCkpKQorICAgICAgLS1wYXRoLmxlYWZPZmZzZXQoKTsKKyAgICBlbHNlCisgICAgICBwYXRoLm1vdmVMZWZ0KG1hcC0+aGVpZ2h0KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gcG9zdGRlY3JlbWVudCAtIERvbnQgZG8gdGhhdCEKKyAgY29uc3RfaXRlcmF0b3Igb3BlcmF0b3ItLShpbnQpIHsKKyAgICBjb25zdF9pdGVyYXRvciB0bXAgPSAqdGhpczsKKyAgICBvcGVyYXRvci0tKCk7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorCisgIC8vLyBmaW5kIC0gTW92ZSB0byB0aGUgZmlyc3QgaW50ZXJ2YWwgd2l0aCBzdG9wID49IHgsIG9yIGVuZCgpLgorICAvLy8gVGhpcyBpcyBhIGZ1bGwgc2VhcmNoIGZyb20gdGhlIHJvb3QsIHRoZSBjdXJyZW50IHBvc2l0aW9uIGlzIGlnbm9yZWQuCisgIHZvaWQgZmluZChLZXlUIHgpIHsKKyAgICBpZiAoYnJhbmNoZWQoKSkKKyAgICAgIHRyZWVGaW5kKHgpOworICAgIGVsc2UKKyAgICAgIHNldFJvb3QobWFwLT5yb290TGVhZigpLmZpbmRGcm9tKDAsIG1hcC0+cm9vdFNpemUsIHgpKTsKKyAgfQorCisgIC8vLyBhZHZhbmNlVG8gLSBNb3ZlIHRvIHRoZSBmaXJzdCBpbnRlcnZhbCB3aXRoIHN0b3AgPj0geCwgb3IgZW5kKCkuCisgIC8vLyBUaGUgc2VhcmNoIGlzIHN0YXJ0ZWQgZnJvbSB0aGUgY3VycmVudCBwb3NpdGlvbiwgYW5kIG5vIGVhcmxpZXIgcG9zaXRpb25zCisgIC8vLyBjYW4gYmUgZm91bmQuIFRoaXMgaXMgbXVjaCBmYXN0ZXIgdGhhbiBmaW5kKCkgZm9yIHNtYWxsIG1vdmVzLgorICB2b2lkIGFkdmFuY2VUbyhLZXlUIHgpIHsKKyAgICBpZiAoIXZhbGlkKCkpCisgICAgICByZXR1cm47CisgICAgaWYgKGJyYW5jaGVkKCkpCisgICAgICB0cmVlQWR2YW5jZVRvKHgpOworICAgIGVsc2UKKyAgICAgIHBhdGgubGVhZk9mZnNldCgpID0KKyAgICAgICAgbWFwLT5yb290TGVhZigpLmZpbmRGcm9tKHBhdGgubGVhZk9mZnNldCgpLCBtYXAtPnJvb3RTaXplLCB4KTsKKyAgfQorfTsKKworLy8vIHBhdGhGaWxsRmluZCAtIENvbXBsZXRlIHBhdGggYnkgc2VhcmNoaW5nIGZvciB4LgorLy8vIEBwYXJhbSB4IEtleSB0byBzZWFyY2ggZm9yLgordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KK3ZvaWQgSW50ZXJ2YWxNYXA8S2V5VCwgVmFsVCwgTiwgVHJhaXRzPjo6Citjb25zdF9pdGVyYXRvcjo6cGF0aEZpbGxGaW5kKEtleVQgeCkgeworICBJbnRlcnZhbE1hcEltcGw6Ok5vZGVSZWYgTlIgPSBwYXRoLnN1YnRyZWUocGF0aC5oZWlnaHQoKSk7CisgIGZvciAodW5zaWduZWQgaSA9IG1hcC0+aGVpZ2h0IC0gcGF0aC5oZWlnaHQoKSAtIDE7IGk7IC0taSkgeworICAgIHVuc2lnbmVkIHAgPSBOUi5nZXQ8QnJhbmNoPigpLnNhZmVGaW5kKDAsIHgpOworICAgIHBhdGgucHVzaChOUiwgcCk7CisgICAgTlIgPSBOUi5zdWJ0cmVlKHApOworICB9CisgIHBhdGgucHVzaChOUiwgTlIuZ2V0PExlYWY+KCkuc2FmZUZpbmQoMCwgeCkpOworfQorCisvLy8gdHJlZUZpbmQgLSBGaW5kIGluIGEgYnJhbmNoZWQgdHJlZS4KKy8vLyBAcGFyYW0geCBLZXkgdG8gc2VhcmNoIGZvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBUcmFpdHM+Cit2b2lkIEludGVydmFsTWFwPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46OgorY29uc3RfaXRlcmF0b3I6OnRyZWVGaW5kKEtleVQgeCkgeworICBzZXRSb290KG1hcC0+cm9vdEJyYW5jaCgpLmZpbmRGcm9tKDAsIG1hcC0+cm9vdFNpemUsIHgpKTsKKyAgaWYgKHZhbGlkKCkpCisgICAgcGF0aEZpbGxGaW5kKHgpOworfQorCisvLy8gdHJlZUFkdmFuY2VUbyAtIEZpbmQgcG9zaXRpb24gYWZ0ZXIgdGhlIGN1cnJlbnQgb25lLgorLy8vIEBwYXJhbSB4IEtleSB0byBzZWFyY2ggZm9yLgordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KK3ZvaWQgSW50ZXJ2YWxNYXA8S2V5VCwgVmFsVCwgTiwgVHJhaXRzPjo6Citjb25zdF9pdGVyYXRvcjo6dHJlZUFkdmFuY2VUbyhLZXlUIHgpIHsKKyAgLy8gQ2FuIHdlIHN0YXkgb24gdGhlIHNhbWUgbGVhZiBub2RlPworICBpZiAoIVRyYWl0czo6c3RvcExlc3MocGF0aC5sZWFmPExlYWY+KCkuc3RvcChwYXRoLmxlYWZTaXplKCkgLSAxKSwgeCkpIHsKKyAgICBwYXRoLmxlYWZPZmZzZXQoKSA9IHBhdGgubGVhZjxMZWFmPigpLnNhZmVGaW5kKHBhdGgubGVhZk9mZnNldCgpLCB4KTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBEcm9wIHRoZSBjdXJyZW50IGxlYWYuCisgIHBhdGgucG9wKCk7CisKKyAgLy8gU2VhcmNoIHRvd2FyZHMgdGhlIHJvb3QgZm9yIGEgdXNhYmxlIHN1YnRyZWUuCisgIGlmIChwYXRoLmhlaWdodCgpKSB7CisgICAgZm9yICh1bnNpZ25lZCBsID0gcGF0aC5oZWlnaHQoKSAtIDE7IGw7IC0tbCkgeworICAgICAgaWYgKCFUcmFpdHM6OnN0b3BMZXNzKHBhdGgubm9kZTxCcmFuY2g+KGwpLnN0b3AocGF0aC5vZmZzZXQobCkpLCB4KSkgeworICAgICAgICAvLyBUaGUgYnJhbmNoIG5vZGUgYXQgbCsxIGlzIHVzYWJsZQorICAgICAgICBwYXRoLm9mZnNldChsICsgMSkgPQorICAgICAgICAgIHBhdGgubm9kZTxCcmFuY2g+KGwgKyAxKS5zYWZlRmluZChwYXRoLm9mZnNldChsICsgMSksIHgpOworICAgICAgICByZXR1cm4gcGF0aEZpbGxGaW5kKHgpOworICAgICAgfQorICAgICAgcGF0aC5wb3AoKTsKKyAgICB9CisgICAgLy8gSXMgdGhlIGxldmVsLTEgQnJhbmNoIHVzYWJsZT8KKyAgICBpZiAoIVRyYWl0czo6c3RvcExlc3MobWFwLT5yb290QnJhbmNoKCkuc3RvcChwYXRoLm9mZnNldCgwKSksIHgpKSB7CisgICAgICBwYXRoLm9mZnNldCgxKSA9IHBhdGgubm9kZTxCcmFuY2g+KDEpLnNhZmVGaW5kKHBhdGgub2Zmc2V0KDEpLCB4KTsKKyAgICAgIHJldHVybiBwYXRoRmlsbEZpbmQoeCk7CisgICAgfQorICB9CisKKyAgLy8gV2UgcmVhY2hlZCB0aGUgcm9vdC4KKyAgc2V0Um9vdChtYXAtPnJvb3RCcmFuY2goKS5maW5kRnJvbShwYXRoLm9mZnNldCgwKSwgbWFwLT5yb290U2l6ZSwgeCkpOworICBpZiAodmFsaWQoKSkKKyAgICBwYXRoRmlsbEZpbmQoeCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy0tLSAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJ2YWxNYXA6Oml0ZXJhdG9yICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KK2NsYXNzIEludGVydmFsTWFwPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46Oml0ZXJhdG9yIDogcHVibGljIGNvbnN0X2l0ZXJhdG9yIHsKKyAgZnJpZW5kIGNsYXNzIEludGVydmFsTWFwOworCisgIHVzaW5nIElkeFBhaXIgPSBJbnRlcnZhbE1hcEltcGw6OklkeFBhaXI7CisKKyAgZXhwbGljaXQgaXRlcmF0b3IoSW50ZXJ2YWxNYXAgJm1hcCkgOiBjb25zdF9pdGVyYXRvcihtYXApIHt9CisKKyAgdm9pZCBzZXROb2RlU3RvcCh1bnNpZ25lZCBMZXZlbCwgS2V5VCBTdG9wKTsKKyAgYm9vbCBpbnNlcnROb2RlKHVuc2lnbmVkIExldmVsLCBJbnRlcnZhbE1hcEltcGw6Ok5vZGVSZWYgTm9kZSwgS2V5VCBTdG9wKTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVUPiBib29sIG92ZXJmbG93KHVuc2lnbmVkIExldmVsKTsKKyAgdm9pZCB0cmVlSW5zZXJ0KEtleVQgYSwgS2V5VCBiLCBWYWxUIHkpOworICB2b2lkIGVyYXNlTm9kZSh1bnNpZ25lZCBMZXZlbCk7CisgIHZvaWQgdHJlZUVyYXNlKGJvb2wgVXBkYXRlUm9vdCA9IHRydWUpOworICBib29sIGNhbkNvYWxlc2NlTGVmdChLZXlUIFN0YXJ0LCBWYWxUIHgpOworICBib29sIGNhbkNvYWxlc2NlUmlnaHQoS2V5VCBTdG9wLCBWYWxUIHgpOworCitwdWJsaWM6CisgIC8vLyBpdGVyYXRvciAtIENyZWF0ZSBudWxsIGl0ZXJhdG9yLgorICBpdGVyYXRvcigpID0gZGVmYXVsdDsKKworICAvLy8gc2V0U3RhcnQgLSBNb3ZlIHRoZSBzdGFydCBvZiB0aGUgY3VycmVudCBpbnRlcnZhbC4KKyAgLy8vIFRoaXMgbWF5IGNhdXNlIGNvYWxlc2Npbmcgd2l0aCB0aGUgcHJldmlvdXMgaW50ZXJ2YWwuCisgIC8vLyBAcGFyYW0gYSBOZXcgc3RhcnQga2V5LCBtdXN0IG5vdCBvdmVybGFwIHRoZSBwcmV2aW91cyBpbnRlcnZhbC4KKyAgdm9pZCBzZXRTdGFydChLZXlUIGEpOworCisgIC8vLyBzZXRTdG9wIC0gTW92ZSB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IGludGVydmFsLgorICAvLy8gVGhpcyBtYXkgY2F1c2UgY29hbGVzY2luZyB3aXRoIHRoZSBmb2xsb3dpbmcgaW50ZXJ2YWwuCisgIC8vLyBAcGFyYW0gYiBOZXcgc3RvcCBrZXksIG11c3Qgbm90IG92ZXJsYXAgdGhlIGZvbGxvd2luZyBpbnRlcnZhbC4KKyAgdm9pZCBzZXRTdG9wKEtleVQgYik7CisKKyAgLy8vIHNldFZhbHVlIC0gQ2hhbmdlIHRoZSBtYXBwZWQgdmFsdWUgb2YgdGhlIGN1cnJlbnQgaW50ZXJ2YWwuCisgIC8vLyBUaGlzIG1heSBjYXVzZSBjb2FsZXNjaW5nIHdpdGggdGhlIHByZXZpb3VzIGFuZCBmb2xsb3dpbmcgaW50ZXJ2YWxzLgorICAvLy8gQHBhcmFtIHggTmV3IHZhbHVlLgorICB2b2lkIHNldFZhbHVlKFZhbFQgeCk7CisKKyAgLy8vIHNldFN0YXJ0VW5jaGVja2VkIC0gTW92ZSB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgaW50ZXJ2YWwgd2l0aG91dAorICAvLy8gY2hlY2tpbmcgZm9yIGNvYWxlc2Npbmcgb3Igb3ZlcmxhcHMuCisgIC8vLyBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiBpdCBpcyBrbm93biB0aGF0IGNvYWxlc2NpbmcgaXMgbm90IHJlcXVpcmVkLgorICAvLy8gQHBhcmFtIGEgTmV3IHN0YXJ0IGtleS4KKyAgdm9pZCBzZXRTdGFydFVuY2hlY2tlZChLZXlUIGEpIHsgdGhpcy0+dW5zYWZlU3RhcnQoKSA9IGE7IH0KKworICAvLy8gc2V0U3RvcFVuY2hlY2tlZCAtIE1vdmUgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBpbnRlcnZhbCB3aXRob3V0IGNoZWNraW5nCisgIC8vLyBmb3IgY29hbGVzY2luZyBvciBvdmVybGFwcy4KKyAgLy8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIGl0IGlzIGtub3duIHRoYXQgY29hbGVzY2luZyBpcyBub3QgcmVxdWlyZWQuCisgIC8vLyBAcGFyYW0gYiBOZXcgc3RvcCBrZXkuCisgIHZvaWQgc2V0U3RvcFVuY2hlY2tlZChLZXlUIGIpIHsKKyAgICB0aGlzLT51bnNhZmVTdG9wKCkgPSBiOworICAgIC8vIFVwZGF0ZSBrZXlzIGluIGJyYW5jaCBub2RlcyBhcyB3ZWxsLgorICAgIGlmICh0aGlzLT5wYXRoLmF0TGFzdEVudHJ5KHRoaXMtPnBhdGguaGVpZ2h0KCkpKQorICAgICAgc2V0Tm9kZVN0b3AodGhpcy0+cGF0aC5oZWlnaHQoKSwgYik7CisgIH0KKworICAvLy8gc2V0VmFsdWVVbmNoZWNrZWQgLSBDaGFuZ2UgdGhlIG1hcHBlZCB2YWx1ZSBvZiB0aGUgY3VycmVudCBpbnRlcnZhbAorICAvLy8gd2l0aG91dCBjaGVja2luZyBmb3IgY29hbGVzY2luZy4KKyAgLy8vIEBwYXJhbSB4IE5ldyB2YWx1ZS4KKyAgdm9pZCBzZXRWYWx1ZVVuY2hlY2tlZChWYWxUIHgpIHsgdGhpcy0+dW5zYWZlVmFsdWUoKSA9IHg7IH0KKworICAvLy8gaW5zZXJ0IC0gSW5zZXJ0IG1hcHBpbmcgW2E7Yl0gLT4geSBiZWZvcmUgdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgIHZvaWQgaW5zZXJ0KEtleVQgYSwgS2V5VCBiLCBWYWxUIHkpOworCisgIC8vLyBlcmFzZSAtIEVyYXNlIHRoZSBjdXJyZW50IGludGVydmFsLgorICB2b2lkIGVyYXNlKCk7CisKKyAgaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgY29uc3RfaXRlcmF0b3I6Om9wZXJhdG9yKysoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpdGVyYXRvciBvcGVyYXRvcisrKGludCkgeworICAgIGl0ZXJhdG9yIHRtcCA9ICp0aGlzOworICAgIG9wZXJhdG9yKysoKTsKKyAgICByZXR1cm4gdG1wOworICB9CisKKyAgaXRlcmF0b3IgJm9wZXJhdG9yLS0oKSB7CisgICAgY29uc3RfaXRlcmF0b3I6Om9wZXJhdG9yLS0oKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpdGVyYXRvciBvcGVyYXRvci0tKGludCkgeworICAgIGl0ZXJhdG9yIHRtcCA9ICp0aGlzOworICAgIG9wZXJhdG9yLS0oKTsKKyAgICByZXR1cm4gdG1wOworICB9Cit9OworCisvLy8gY2FuQ29hbGVzY2VMZWZ0IC0gQ2FuIHRoZSBjdXJyZW50IGludGVydmFsIGNvYWxlc2NlIHRvIHRoZSBsZWZ0IGFmdGVyCisvLy8gY2hhbmdpbmcgc3RhcnQgb3IgdmFsdWU/CisvLy8gQHBhcmFtIFN0YXJ0IE5ldyBzdGFydCBvZiBjdXJyZW50IGludGVydmFsLgorLy8vIEBwYXJhbSBWYWx1ZSBOZXcgdmFsdWUgZm9yIGN1cnJlbnQgaW50ZXJ2YWwuCisvLy8gQHJldHVybiBUcnVlIHdoZW4gdXBkYXRpbmcgdGhlIGN1cnJlbnQgaW50ZXJ2YWwgd291bGQgZW5hYmxlIGNvYWxlc2NpbmcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwgdW5zaWduZWQgTiwgdHlwZW5hbWUgVHJhaXRzPgorYm9vbCBJbnRlcnZhbE1hcDxLZXlULCBWYWxULCBOLCBUcmFpdHM+OjoKK2l0ZXJhdG9yOjpjYW5Db2FsZXNjZUxlZnQoS2V5VCBTdGFydCwgVmFsVCBWYWx1ZSkgeworICB1c2luZyBuYW1lc3BhY2UgSW50ZXJ2YWxNYXBJbXBsOworICBQYXRoICZQID0gdGhpcy0+cGF0aDsKKyAgaWYgKCF0aGlzLT5icmFuY2hlZCgpKSB7CisgICAgdW5zaWduZWQgaSA9IFAubGVhZk9mZnNldCgpOworICAgIFJvb3RMZWFmICZOb2RlID0gUC5sZWFmPFJvb3RMZWFmPigpOworICAgIHJldHVybiBpICYmIE5vZGUudmFsdWUoaS0xKSA9PSBWYWx1ZSAmJgorICAgICAgICAgICAgICAgIFRyYWl0czo6YWRqYWNlbnQoTm9kZS5zdG9wKGktMSksIFN0YXJ0KTsKKyAgfQorICAvLyBCcmFuY2hlZC4KKyAgaWYgKHVuc2lnbmVkIGkgPSBQLmxlYWZPZmZzZXQoKSkgeworICAgIExlYWYgJk5vZGUgPSBQLmxlYWY8TGVhZj4oKTsKKyAgICByZXR1cm4gTm9kZS52YWx1ZShpLTEpID09IFZhbHVlICYmIFRyYWl0czo6YWRqYWNlbnQoTm9kZS5zdG9wKGktMSksIFN0YXJ0KTsKKyAgfSBlbHNlIGlmIChOb2RlUmVmIE5SID0gUC5nZXRMZWZ0U2libGluZyhQLmhlaWdodCgpKSkgeworICAgIHVuc2lnbmVkIGkgPSBOUi5zaXplKCkgLSAxOworICAgIExlYWYgJk5vZGUgPSBOUi5nZXQ8TGVhZj4oKTsKKyAgICByZXR1cm4gTm9kZS52YWx1ZShpKSA9PSBWYWx1ZSAmJiBUcmFpdHM6OmFkamFjZW50KE5vZGUuc3RvcChpKSwgU3RhcnQpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8vIGNhbkNvYWxlc2NlUmlnaHQgLSBDYW4gdGhlIGN1cnJlbnQgaW50ZXJ2YWwgY29hbGVzY2UgdG8gdGhlIHJpZ2h0IGFmdGVyCisvLy8gY2hhbmdpbmcgc3RvcCBvciB2YWx1ZT8KKy8vLyBAcGFyYW0gU3RvcCBOZXcgc3RvcCBvZiBjdXJyZW50IGludGVydmFsLgorLy8vIEBwYXJhbSBWYWx1ZSBOZXcgdmFsdWUgZm9yIGN1cnJlbnQgaW50ZXJ2YWwuCisvLy8gQHJldHVybiBUcnVlIHdoZW4gdXBkYXRpbmcgdGhlIGN1cnJlbnQgaW50ZXJ2YWwgd291bGQgZW5hYmxlIGNvYWxlc2NpbmcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwgdW5zaWduZWQgTiwgdHlwZW5hbWUgVHJhaXRzPgorYm9vbCBJbnRlcnZhbE1hcDxLZXlULCBWYWxULCBOLCBUcmFpdHM+OjoKK2l0ZXJhdG9yOjpjYW5Db2FsZXNjZVJpZ2h0KEtleVQgU3RvcCwgVmFsVCBWYWx1ZSkgeworICB1c2luZyBuYW1lc3BhY2UgSW50ZXJ2YWxNYXBJbXBsOworICBQYXRoICZQID0gdGhpcy0+cGF0aDsKKyAgdW5zaWduZWQgaSA9IFAubGVhZk9mZnNldCgpICsgMTsKKyAgaWYgKCF0aGlzLT5icmFuY2hlZCgpKSB7CisgICAgaWYgKGkgPj0gUC5sZWFmU2l6ZSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIFJvb3RMZWFmICZOb2RlID0gUC5sZWFmPFJvb3RMZWFmPigpOworICAgIHJldHVybiBOb2RlLnZhbHVlKGkpID09IFZhbHVlICYmIFRyYWl0czo6YWRqYWNlbnQoU3RvcCwgTm9kZS5zdGFydChpKSk7CisgIH0KKyAgLy8gQnJhbmNoZWQuCisgIGlmIChpIDwgUC5sZWFmU2l6ZSgpKSB7CisgICAgTGVhZiAmTm9kZSA9IFAubGVhZjxMZWFmPigpOworICAgIHJldHVybiBOb2RlLnZhbHVlKGkpID09IFZhbHVlICYmIFRyYWl0czo6YWRqYWNlbnQoU3RvcCwgTm9kZS5zdGFydChpKSk7CisgIH0gZWxzZSBpZiAoTm9kZVJlZiBOUiA9IFAuZ2V0UmlnaHRTaWJsaW5nKFAuaGVpZ2h0KCkpKSB7CisgICAgTGVhZiAmTm9kZSA9IE5SLmdldDxMZWFmPigpOworICAgIHJldHVybiBOb2RlLnZhbHVlKDApID09IFZhbHVlICYmIFRyYWl0czo6YWRqYWNlbnQoU3RvcCwgTm9kZS5zdGFydCgwKSk7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLy8gc2V0Tm9kZVN0b3AgLSBVcGRhdGUgdGhlIHN0b3Aga2V5IG9mIHRoZSBjdXJyZW50IG5vZGUgYXQgbGV2ZWwgYW5kIGFib3ZlLgordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KK3ZvaWQgSW50ZXJ2YWxNYXA8S2V5VCwgVmFsVCwgTiwgVHJhaXRzPjo6CitpdGVyYXRvcjo6c2V0Tm9kZVN0b3AodW5zaWduZWQgTGV2ZWwsIEtleVQgU3RvcCkgeworICAvLyBUaGVyZSBhcmUgbm8gcmVmZXJlbmNlcyB0byB0aGUgcm9vdCBub2RlLCBzbyBub3RoaW5nIHRvIHVwZGF0ZS4KKyAgaWYgKCFMZXZlbCkKKyAgICByZXR1cm47CisgIEludGVydmFsTWFwSW1wbDo6UGF0aCAmUCA9IHRoaXMtPnBhdGg7CisgIC8vIFVwZGF0ZSBub2RlcyBwb2ludGluZyB0byB0aGUgY3VycmVudCBub2RlLgorICB3aGlsZSAoLS1MZXZlbCkgeworICAgIFAubm9kZTxCcmFuY2g+KExldmVsKS5zdG9wKFAub2Zmc2V0KExldmVsKSkgPSBTdG9wOworICAgIGlmICghUC5hdExhc3RFbnRyeShMZXZlbCkpCisgICAgICByZXR1cm47CisgIH0KKyAgLy8gVXBkYXRlIHJvb3Qgc2VwYXJhdGVseSBzaW5jZSBpdCBoYXMgYSBkaWZmZXJlbnQgbGF5b3V0LgorICBQLm5vZGU8Um9vdEJyYW5jaD4oTGV2ZWwpLnN0b3AoUC5vZmZzZXQoTGV2ZWwpKSA9IFN0b3A7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBUcmFpdHM+Cit2b2lkIEludGVydmFsTWFwPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46OgoraXRlcmF0b3I6OnNldFN0YXJ0KEtleVQgYSkgeworICBhc3NlcnQoVHJhaXRzOjpub25FbXB0eShhLCB0aGlzLT5zdG9wKCkpICYmICJDYW5ub3QgbW92ZSBzdGFydCBiZXlvbmQgc3RvcCIpOworICBLZXlUICZDdXJTdGFydCA9IHRoaXMtPnVuc2FmZVN0YXJ0KCk7CisgIGlmICghVHJhaXRzOjpzdGFydExlc3MoYSwgQ3VyU3RhcnQpIHx8ICFjYW5Db2FsZXNjZUxlZnQoYSwgdGhpcy0+dmFsdWUoKSkpIHsKKyAgICBDdXJTdGFydCA9IGE7CisgICAgcmV0dXJuOworICB9CisgIC8vIENvYWxlc2NlIHdpdGggdGhlIGludGVydmFsIHRvIHRoZSBsZWZ0LgorICAtLSp0aGlzOworICBhID0gdGhpcy0+c3RhcnQoKTsKKyAgZXJhc2UoKTsKKyAgc2V0U3RhcnRVbmNoZWNrZWQoYSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBUcmFpdHM+Cit2b2lkIEludGVydmFsTWFwPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46OgoraXRlcmF0b3I6OnNldFN0b3AoS2V5VCBiKSB7CisgIGFzc2VydChUcmFpdHM6Om5vbkVtcHR5KHRoaXMtPnN0YXJ0KCksIGIpICYmICJDYW5ub3QgbW92ZSBzdG9wIGJleW9uZCBzdGFydCIpOworICBpZiAoVHJhaXRzOjpzdGFydExlc3MoYiwgdGhpcy0+c3RvcCgpKSB8fAorICAgICAgIWNhbkNvYWxlc2NlUmlnaHQoYiwgdGhpcy0+dmFsdWUoKSkpIHsKKyAgICBzZXRTdG9wVW5jaGVja2VkKGIpOworICAgIHJldHVybjsKKyAgfQorICAvLyBDb2FsZXNjZSB3aXRoIGludGVydmFsIHRvIHRoZSByaWdodC4KKyAgS2V5VCBhID0gdGhpcy0+c3RhcnQoKTsKKyAgZXJhc2UoKTsKKyAgc2V0U3RhcnRVbmNoZWNrZWQoYSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBUcmFpdHM+Cit2b2lkIEludGVydmFsTWFwPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46OgoraXRlcmF0b3I6OnNldFZhbHVlKFZhbFQgeCkgeworICBzZXRWYWx1ZVVuY2hlY2tlZCh4KTsKKyAgaWYgKGNhbkNvYWxlc2NlUmlnaHQodGhpcy0+c3RvcCgpLCB4KSkgeworICAgIEtleVQgYSA9IHRoaXMtPnN0YXJ0KCk7CisgICAgZXJhc2UoKTsKKyAgICBzZXRTdGFydFVuY2hlY2tlZChhKTsKKyAgfQorICBpZiAoY2FuQ29hbGVzY2VMZWZ0KHRoaXMtPnN0YXJ0KCksIHgpKSB7CisgICAgLS0qdGhpczsKKyAgICBLZXlUIGEgPSB0aGlzLT5zdGFydCgpOworICAgIGVyYXNlKCk7CisgICAgc2V0U3RhcnRVbmNoZWNrZWQoYSk7CisgIH0KK30KKworLy8vIGluc2VydE5vZGUgLSBpbnNlcnQgYSBub2RlIGJlZm9yZSB0aGUgY3VycmVudCBwYXRoIGF0IGxldmVsLgorLy8vIExlYXZlIHRoZSBjdXJyZW50IHBhdGggcG9pbnRpbmcgYXQgdGhlIG5ldyBub2RlLgorLy8vIEBwYXJhbSBMZXZlbCBwYXRoIGluZGV4IG9mIHRoZSBub2RlIHRvIGJlIGluc2VydGVkLgorLy8vIEBwYXJhbSBOb2RlIFRoZSBub2RlIHRvIGJlIGluc2VydGVkLgorLy8vIEBwYXJhbSBTdG9wIFRoZSBsYXN0IGluZGV4IGluIHRoZSBuZXcgbm9kZS4KKy8vLyBAcmV0dXJuIFRydWUgaWYgdGhlIHRyZWUgaGVpZ2h0IHdhcyBpbmNyZWFzZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwgdW5zaWduZWQgTiwgdHlwZW5hbWUgVHJhaXRzPgorYm9vbCBJbnRlcnZhbE1hcDxLZXlULCBWYWxULCBOLCBUcmFpdHM+OjoKK2l0ZXJhdG9yOjppbnNlcnROb2RlKHVuc2lnbmVkIExldmVsLCBJbnRlcnZhbE1hcEltcGw6Ok5vZGVSZWYgTm9kZSwgS2V5VCBTdG9wKSB7CisgIGFzc2VydChMZXZlbCAmJiAiQ2Fubm90IGluc2VydCBuZXh0IHRvIHRoZSByb290Iik7CisgIGJvb2wgU3BsaXRSb290ID0gZmFsc2U7CisgIEludGVydmFsTWFwICZJTSA9ICp0aGlzLT5tYXA7CisgIEludGVydmFsTWFwSW1wbDo6UGF0aCAmUCA9IHRoaXMtPnBhdGg7CisKKyAgaWYgKExldmVsID09IDEpIHsKKyAgICAvLyBJbnNlcnQgaW50byB0aGUgcm9vdCBicmFuY2ggbm9kZS4KKyAgICBpZiAoSU0ucm9vdFNpemUgPCBSb290QnJhbmNoOjpDYXBhY2l0eSkgeworICAgICAgSU0ucm9vdEJyYW5jaCgpLmluc2VydChQLm9mZnNldCgwKSwgSU0ucm9vdFNpemUsIE5vZGUsIFN0b3ApOworICAgICAgUC5zZXRTaXplKDAsICsrSU0ucm9vdFNpemUpOworICAgICAgUC5yZXNldChMZXZlbCk7CisgICAgICByZXR1cm4gU3BsaXRSb290OworICAgIH0KKworICAgIC8vIFdlIG5lZWQgdG8gc3BsaXQgdGhlIHJvb3Qgd2hpbGUga2VlcGluZyBvdXIgcG9zaXRpb24uCisgICAgU3BsaXRSb290ID0gdHJ1ZTsKKyAgICBJZHhQYWlyIE9mZnNldCA9IElNLnNwbGl0Um9vdChQLm9mZnNldCgwKSk7CisgICAgUC5yZXBsYWNlUm9vdCgmSU0ucm9vdEJyYW5jaCgpLCBJTS5yb290U2l6ZSwgT2Zmc2V0KTsKKworICAgIC8vIEZhbGwgdGhyb3VnaCB0byBpbnNlcnQgYXQgdGhlIG5ldyBoaWdoZXIgbGV2ZWwuCisgICAgKytMZXZlbDsKKyAgfQorCisgIC8vIFdoZW4gaW5zZXJ0aW5nIGJlZm9yZSBlbmQoKSwgbWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBwYXRoLgorICBQLmxlZ2FsaXplRm9ySW5zZXJ0KC0tTGV2ZWwpOworCisgIC8vIEluc2VydCBpbnRvIHRoZSBicmFuY2ggbm9kZSBhdCBMZXZlbC0xLgorICBpZiAoUC5zaXplKExldmVsKSA9PSBCcmFuY2g6OkNhcGFjaXR5KSB7CisgICAgLy8gQnJhbmNoIG5vZGUgaXMgZnVsbCwgaGFuZGxlIGhhbmRsZSB0aGUgb3ZlcmZsb3cuCisgICAgYXNzZXJ0KCFTcGxpdFJvb3QgJiYgIkNhbm5vdCBvdmVyZmxvdyBhZnRlciBzcGxpdHRpbmcgdGhlIHJvb3QiKTsKKyAgICBTcGxpdFJvb3QgPSBvdmVyZmxvdzxCcmFuY2g+KExldmVsKTsKKyAgICBMZXZlbCArPSBTcGxpdFJvb3Q7CisgIH0KKyAgUC5ub2RlPEJyYW5jaD4oTGV2ZWwpLmluc2VydChQLm9mZnNldChMZXZlbCksIFAuc2l6ZShMZXZlbCksIE5vZGUsIFN0b3ApOworICBQLnNldFNpemUoTGV2ZWwsIFAuc2l6ZShMZXZlbCkgKyAxKTsKKyAgaWYgKFAuYXRMYXN0RW50cnkoTGV2ZWwpKQorICAgIHNldE5vZGVTdG9wKExldmVsLCBTdG9wKTsKKyAgUC5yZXNldChMZXZlbCArIDEpOworICByZXR1cm4gU3BsaXRSb290OworfQorCisvLyBpbnNlcnQKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBUcmFpdHM+Cit2b2lkIEludGVydmFsTWFwPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46OgoraXRlcmF0b3I6Omluc2VydChLZXlUIGEsIEtleVQgYiwgVmFsVCB5KSB7CisgIGlmICh0aGlzLT5icmFuY2hlZCgpKQorICAgIHJldHVybiB0cmVlSW5zZXJ0KGEsIGIsIHkpOworICBJbnRlcnZhbE1hcCAmSU0gPSAqdGhpcy0+bWFwOworICBJbnRlcnZhbE1hcEltcGw6OlBhdGggJlAgPSB0aGlzLT5wYXRoOworCisgIC8vIFRyeSBzaW1wbGUgcm9vdCBsZWFmIGluc2VydC4KKyAgdW5zaWduZWQgU2l6ZSA9IElNLnJvb3RMZWFmKCkuaW5zZXJ0RnJvbShQLmxlYWZPZmZzZXQoKSwgSU0ucm9vdFNpemUsIGEsIGIsIHkpOworCisgIC8vIFdhcyB0aGUgcm9vdCBub2RlIGluc2VydCBzdWNjZXNzZnVsPworICBpZiAoU2l6ZSA8PSBSb290TGVhZjo6Q2FwYWNpdHkpIHsKKyAgICBQLnNldFNpemUoMCwgSU0ucm9vdFNpemUgPSBTaXplKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBSb290IGxlYWYgbm9kZSBpcyBmdWxsLCB3ZSBtdXN0IGJyYW5jaC4KKyAgSWR4UGFpciBPZmZzZXQgPSBJTS5icmFuY2hSb290KFAubGVhZk9mZnNldCgpKTsKKyAgUC5yZXBsYWNlUm9vdCgmSU0ucm9vdEJyYW5jaCgpLCBJTS5yb290U2l6ZSwgT2Zmc2V0KTsKKworICAvLyBOb3cgaXQgZml0cyBpbiB0aGUgbmV3IGxlYWYuCisgIHRyZWVJbnNlcnQoYSwgYiwgeSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWxULCB1bnNpZ25lZCBOLCB0eXBlbmFtZSBUcmFpdHM+Cit2b2lkIEludGVydmFsTWFwPEtleVQsIFZhbFQsIE4sIFRyYWl0cz46OgoraXRlcmF0b3I6OnRyZWVJbnNlcnQoS2V5VCBhLCBLZXlUIGIsIFZhbFQgeSkgeworICB1c2luZyBuYW1lc3BhY2UgSW50ZXJ2YWxNYXBJbXBsOworICBQYXRoICZQID0gdGhpcy0+cGF0aDsKKworICBpZiAoIVAudmFsaWQoKSkKKyAgICBQLmxlZ2FsaXplRm9ySW5zZXJ0KHRoaXMtPm1hcC0+aGVpZ2h0KTsKKworICAvLyBDaGVjayBpZiB0aGlzIGluc2VydGlvbiB3aWxsIGV4dGVuZCB0aGUgbm9kZSB0byB0aGUgbGVmdC4KKyAgaWYgKFAubGVhZk9mZnNldCgpID09IDAgJiYgVHJhaXRzOjpzdGFydExlc3MoYSwgUC5sZWFmPExlYWY+KCkuc3RhcnQoMCkpKSB7CisgICAgLy8gTm9kZSBpcyBncm93aW5nIHRvIHRoZSBsZWZ0LCB3aWxsIGl0IGFmZmVjdCBhIGxlZnQgc2libGluZyBub2RlPworICAgIGlmIChOb2RlUmVmIFNpYiA9IFAuZ2V0TGVmdFNpYmxpbmcoUC5oZWlnaHQoKSkpIHsKKyAgICAgIExlYWYgJlNpYkxlYWYgPSBTaWIuZ2V0PExlYWY+KCk7CisgICAgICB1bnNpZ25lZCBTaWJPZnMgPSBTaWIuc2l6ZSgpIC0gMTsKKyAgICAgIGlmIChTaWJMZWFmLnZhbHVlKFNpYk9mcykgPT0geSAmJgorICAgICAgICAgIFRyYWl0czo6YWRqYWNlbnQoU2liTGVhZi5zdG9wKFNpYk9mcyksIGEpKSB7CisgICAgICAgIC8vIFRoaXMgaW5zZXJ0aW9uIHdpbGwgY29hbGVzY2Ugd2l0aCB0aGUgbGFzdCBlbnRyeSBpbiBTaWJMZWFmLiBXZSBjYW4KKyAgICAgICAgLy8gaGFuZGxlIGl0IGluIHR3byB3YXlzOgorICAgICAgICAvLyAgMS4gRXh0ZW5kIFNpYkxlYWYuc3RvcCB0byBiIGFuZCBiZSBkb25lLCBvcgorICAgICAgICAvLyAgMi4gRXh0ZW5kIGEgdG8gU2liTGVhZiwgZXJhc2UgdGhlIFNpYkxlYWYgZW50cnkgYW5kIGNvbnRpbnVlLgorICAgICAgICAvLyBXZSBwcmVmZXIgMS4sIGJ1dCBuZWVkIDIgd2hlbiBjb2FsZXNjaW5nIHRvIHRoZSByaWdodCBhcyB3ZWxsLgorICAgICAgICBMZWFmICZDdXJMZWFmID0gUC5sZWFmPExlYWY+KCk7CisgICAgICAgIFAubW92ZUxlZnQoUC5oZWlnaHQoKSk7CisgICAgICAgIGlmIChUcmFpdHM6OnN0b3BMZXNzKGIsIEN1ckxlYWYuc3RhcnQoMCkpICYmCisgICAgICAgICAgICAoeSAhPSBDdXJMZWFmLnZhbHVlKDApIHx8ICFUcmFpdHM6OmFkamFjZW50KGIsIEN1ckxlYWYuc3RhcnQoMCkpKSkgeworICAgICAgICAgIC8vIEVhc3ksIGp1c3QgZXh0ZW5kIFNpYkxlYWYgYW5kIHdlJ3JlIGRvbmUuCisgICAgICAgICAgc2V0Tm9kZVN0b3AoUC5oZWlnaHQoKSwgU2liTGVhZi5zdG9wKFNpYk9mcykgPSBiKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gV2UgaGF2ZSBib3RoIGxlZnQgYW5kIHJpZ2h0IGNvYWxlc2NpbmcuIEVyYXNlIHRoZSBvbGQgU2liTGVhZiBlbnRyeQorICAgICAgICAgIC8vIGFuZCBjb250aW51ZSBpbnNlcnRpbmcgdGhlIGxhcmdlciBpbnRlcnZhbC4KKyAgICAgICAgICBhID0gU2liTGVhZi5zdGFydChTaWJPZnMpOworICAgICAgICAgIHRyZWVFcmFzZSgvKiBVcGRhdGVSb290PSAqL2ZhbHNlKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyBObyBsZWZ0IHNpYmxpbmcgbWVhbnMgd2UgYXJlIGF0IGJlZ2luKCkuIFVwZGF0ZSBjYWNoZWQgYm91bmQuCisgICAgICB0aGlzLT5tYXAtPnJvb3RCcmFuY2hTdGFydCgpID0gYTsKKyAgICB9CisgIH0KKworICAvLyBXaGVuIHdlIGFyZSBpbnNlcnRpbmcgYXQgdGhlIGVuZCBvZiBhIGxlYWYgbm9kZSwgd2UgbXVzdCB1cGRhdGUgc3RvcHMuCisgIHVuc2lnbmVkIFNpemUgPSBQLmxlYWZTaXplKCk7CisgIGJvb2wgR3JvdyA9IFAubGVhZk9mZnNldCgpID09IFNpemU7CisgIFNpemUgPSBQLmxlYWY8TGVhZj4oKS5pbnNlcnRGcm9tKFAubGVhZk9mZnNldCgpLCBTaXplLCBhLCBiLCB5KTsKKworICAvLyBMZWFmIGluc2VydGlvbiB1bnN1Y2Nlc3NmdWw/IE92ZXJmbG93IGFuZCB0cnkgYWdhaW4uCisgIGlmIChTaXplID4gTGVhZjo6Q2FwYWNpdHkpIHsKKyAgICBvdmVyZmxvdzxMZWFmPihQLmhlaWdodCgpKTsKKyAgICBHcm93ID0gUC5sZWFmT2Zmc2V0KCkgPT0gUC5sZWFmU2l6ZSgpOworICAgIFNpemUgPSBQLmxlYWY8TGVhZj4oKS5pbnNlcnRGcm9tKFAubGVhZk9mZnNldCgpLCBQLmxlYWZTaXplKCksIGEsIGIsIHkpOworICAgIGFzc2VydChTaXplIDw9IExlYWY6OkNhcGFjaXR5ICYmICJvdmVyZmxvdygpIGRpZG4ndCBtYWtlIHJvb20iKTsKKyAgfQorCisgIC8vIEluc2VydGVkLCB1cGRhdGUgb2Zmc2V0IGFuZCBsZWFmIHNpemUuCisgIFAuc2V0U2l6ZShQLmhlaWdodCgpLCBTaXplKTsKKworICAvLyBJbnNlcnQgd2FzIHRoZSBsYXN0IG5vZGUgZW50cnksIHVwZGF0ZSBzdG9wcy4KKyAgaWYgKEdyb3cpCisgICAgc2V0Tm9kZVN0b3AoUC5oZWlnaHQoKSwgYik7Cit9CisKKy8vLyBlcmFzZSAtIGVyYXNlIHRoZSBjdXJyZW50IGludGVydmFsIGFuZCBtb3ZlIHRvIHRoZSBuZXh0IHBvc2l0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KK3ZvaWQgSW50ZXJ2YWxNYXA8S2V5VCwgVmFsVCwgTiwgVHJhaXRzPjo6CitpdGVyYXRvcjo6ZXJhc2UoKSB7CisgIEludGVydmFsTWFwICZJTSA9ICp0aGlzLT5tYXA7CisgIEludGVydmFsTWFwSW1wbDo6UGF0aCAmUCA9IHRoaXMtPnBhdGg7CisgIGFzc2VydChQLnZhbGlkKCkgJiYgIkNhbm5vdCBlcmFzZSBlbmQoKSIpOworICBpZiAodGhpcy0+YnJhbmNoZWQoKSkKKyAgICByZXR1cm4gdHJlZUVyYXNlKCk7CisgIElNLnJvb3RMZWFmKCkuZXJhc2UoUC5sZWFmT2Zmc2V0KCksIElNLnJvb3RTaXplKTsKKyAgUC5zZXRTaXplKDAsIC0tSU0ucm9vdFNpemUpOworfQorCisvLy8gdHJlZUVyYXNlIC0gZXJhc2UoKSBmb3IgYSBicmFuY2hlZCB0cmVlLgordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KK3ZvaWQgSW50ZXJ2YWxNYXA8S2V5VCwgVmFsVCwgTiwgVHJhaXRzPjo6CitpdGVyYXRvcjo6dHJlZUVyYXNlKGJvb2wgVXBkYXRlUm9vdCkgeworICBJbnRlcnZhbE1hcCAmSU0gPSAqdGhpcy0+bWFwOworICBJbnRlcnZhbE1hcEltcGw6OlBhdGggJlAgPSB0aGlzLT5wYXRoOworICBMZWFmICZOb2RlID0gUC5sZWFmPExlYWY+KCk7CisKKyAgLy8gTm9kZXMgYXJlIG5vdCBhbGxvd2VkIHRvIGJlY29tZSBlbXB0eS4KKyAgaWYgKFAubGVhZlNpemUoKSA9PSAxKSB7CisgICAgSU0uZGVsZXRlTm9kZSgmTm9kZSk7CisgICAgZXJhc2VOb2RlKElNLmhlaWdodCk7CisgICAgLy8gVXBkYXRlIHJvb3RCcmFuY2hTdGFydCBpZiB3ZSBlcmFzZWQgYmVnaW4oKS4KKyAgICBpZiAoVXBkYXRlUm9vdCAmJiBJTS5icmFuY2hlZCgpICYmIFAudmFsaWQoKSAmJiBQLmF0QmVnaW4oKSkKKyAgICAgIElNLnJvb3RCcmFuY2hTdGFydCgpID0gUC5sZWFmPExlYWY+KCkuc3RhcnQoMCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gRXJhc2UgY3VycmVudCBlbnRyeS4KKyAgTm9kZS5lcmFzZShQLmxlYWZPZmZzZXQoKSwgUC5sZWFmU2l6ZSgpKTsKKyAgdW5zaWduZWQgTmV3U2l6ZSA9IFAubGVhZlNpemUoKSAtIDE7CisgIFAuc2V0U2l6ZShJTS5oZWlnaHQsIE5ld1NpemUpOworICAvLyBXaGVuIHdlIGVyYXNlIHRoZSBsYXN0IGVudHJ5LCB1cGRhdGUgc3RvcCBhbmQgbW92ZSB0byBhIGxlZ2FsIHBvc2l0aW9uLgorICBpZiAoUC5sZWFmT2Zmc2V0KCkgPT0gTmV3U2l6ZSkgeworICAgIHNldE5vZGVTdG9wKElNLmhlaWdodCwgTm9kZS5zdG9wKE5ld1NpemUgLSAxKSk7CisgICAgUC5tb3ZlUmlnaHQoSU0uaGVpZ2h0KTsKKyAgfSBlbHNlIGlmIChVcGRhdGVSb290ICYmIFAuYXRCZWdpbigpKQorICAgIElNLnJvb3RCcmFuY2hTdGFydCgpID0gUC5sZWFmPExlYWY+KCkuc3RhcnQoMCk7Cit9CisKKy8vLyBlcmFzZU5vZGUgLSBFcmFzZSB0aGUgY3VycmVudCBub2RlIGF0IExldmVsIGZyb20gaXRzIHBhcmVudCBhbmQgbW92ZSBwYXRoIHRvCisvLy8gdGhlIGZpcnN0IGVudHJ5IG9mIHRoZSBuZXh0IHNpYmxpbmcgbm9kZS4KKy8vLyBUaGUgbm9kZSBtdXN0IGJlIGRlYWxsb2NhdGVkIGJ5IHRoZSBjYWxsZXIuCisvLy8gQHBhcmFtIExldmVsIDEuLmhlaWdodCwgdGhlIHJvb3Qgbm9kZSBjYW5ub3QgYmUgZXJhc2VkLgordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIFRyYWl0cz4KK3ZvaWQgSW50ZXJ2YWxNYXA8S2V5VCwgVmFsVCwgTiwgVHJhaXRzPjo6CitpdGVyYXRvcjo6ZXJhc2VOb2RlKHVuc2lnbmVkIExldmVsKSB7CisgIGFzc2VydChMZXZlbCAmJiAiQ2Fubm90IGVyYXNlIHJvb3Qgbm9kZSIpOworICBJbnRlcnZhbE1hcCAmSU0gPSAqdGhpcy0+bWFwOworICBJbnRlcnZhbE1hcEltcGw6OlBhdGggJlAgPSB0aGlzLT5wYXRoOworCisgIGlmICgtLUxldmVsID09IDApIHsKKyAgICBJTS5yb290QnJhbmNoKCkuZXJhc2UoUC5vZmZzZXQoMCksIElNLnJvb3RTaXplKTsKKyAgICBQLnNldFNpemUoMCwgLS1JTS5yb290U2l6ZSk7CisgICAgLy8gSWYgdGhpcyBjbGVhcmVkIHRoZSByb290LCBzd2l0Y2ggdG8gaGVpZ2h0PTAuCisgICAgaWYgKElNLmVtcHR5KCkpIHsKKyAgICAgIElNLnN3aXRjaFJvb3RUb0xlYWYoKTsKKyAgICAgIHRoaXMtPnNldFJvb3QoMCk7CisgICAgICByZXR1cm47CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIFJlbW92ZSBub2RlIHJlZiBmcm9tIGJyYW5jaCBub2RlIGF0IExldmVsLgorICAgIEJyYW5jaCAmUGFyZW50ID0gUC5ub2RlPEJyYW5jaD4oTGV2ZWwpOworICAgIGlmIChQLnNpemUoTGV2ZWwpID09IDEpIHsKKyAgICAgIC8vIEJyYW5jaCBub2RlIGJlY2FtZSBlbXB0eSwgcmVtb3ZlIGl0IHJlY3Vyc2l2ZWx5LgorICAgICAgSU0uZGVsZXRlTm9kZSgmUGFyZW50KTsKKyAgICAgIGVyYXNlTm9kZShMZXZlbCk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEJyYW5jaCBub2RlIHdvbid0IGJlY29tZSBlbXB0eS4KKyAgICAgIFBhcmVudC5lcmFzZShQLm9mZnNldChMZXZlbCksIFAuc2l6ZShMZXZlbCkpOworICAgICAgdW5zaWduZWQgTmV3U2l6ZSA9IFAuc2l6ZShMZXZlbCkgLSAxOworICAgICAgUC5zZXRTaXplKExldmVsLCBOZXdTaXplKTsKKyAgICAgIC8vIElmIHdlIHJlbW92ZWQgdGhlIGxhc3QgYnJhbmNoLCB1cGRhdGUgc3RvcCBhbmQgbW92ZSB0byBhIGxlZ2FsIHBvcy4KKyAgICAgIGlmIChQLm9mZnNldChMZXZlbCkgPT0gTmV3U2l6ZSkgeworICAgICAgICBzZXROb2RlU3RvcChMZXZlbCwgUGFyZW50LnN0b3AoTmV3U2l6ZSAtIDEpKTsKKyAgICAgICAgUC5tb3ZlUmlnaHQoTGV2ZWwpOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBVcGRhdGUgcGF0aCBjYWNoZSBmb3IgdGhlIG5ldyByaWdodCBzaWJsaW5nIHBvc2l0aW9uLgorICBpZiAoUC52YWxpZCgpKSB7CisgICAgUC5yZXNldChMZXZlbCArIDEpOworICAgIFAub2Zmc2V0KExldmVsICsgMSkgPSAwOworICB9Cit9CisKKy8vLyBvdmVyZmxvdyAtIERpc3RyaWJ1dGUgZW50cmllcyBvZiB0aGUgY3VycmVudCBub2RlIGV2ZW5seSBhbW9uZworLy8vIGl0cyBzaWJsaW5ncyBhbmQgZW5zdXJlIHRoYXQgdGhlIGN1cnJlbnQgbm9kZSBpcyBub3QgZnVsbC4KKy8vLyBUaGlzIG1heSByZXF1aXJlIGFsbG9jYXRpbmcgYSBuZXcgbm9kZS4KKy8vLyBAdHBhcmFtIE5vZGVUIFRoZSB0eXBlIG9mIG5vZGUgYXQgTGV2ZWwgKExlYWYgb3IgQnJhbmNoKS4KKy8vLyBAcGFyYW0gTGV2ZWwgcGF0aCBpbmRleCBvZiB0aGUgb3ZlcmZsb3dpbmcgbm9kZS4KKy8vLyBAcmV0dXJuIFRydWUgd2hlbiB0aGUgdHJlZSBoZWlnaHQgd2FzIGNoYW5nZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsVCwgdW5zaWduZWQgTiwgdHlwZW5hbWUgVHJhaXRzPgordGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVUPgorYm9vbCBJbnRlcnZhbE1hcDxLZXlULCBWYWxULCBOLCBUcmFpdHM+OjoKK2l0ZXJhdG9yOjpvdmVyZmxvdyh1bnNpZ25lZCBMZXZlbCkgeworICB1c2luZyBuYW1lc3BhY2UgSW50ZXJ2YWxNYXBJbXBsOworICBQYXRoICZQID0gdGhpcy0+cGF0aDsKKyAgdW5zaWduZWQgQ3VyU2l6ZVs0XTsKKyAgTm9kZVQgKk5vZGVbNF07CisgIHVuc2lnbmVkIE5vZGVzID0gMDsKKyAgdW5zaWduZWQgRWxlbWVudHMgPSAwOworICB1bnNpZ25lZCBPZmZzZXQgPSBQLm9mZnNldChMZXZlbCk7CisKKyAgLy8gRG8gd2UgaGF2ZSBhIGxlZnQgc2libGluZz8KKyAgTm9kZVJlZiBMZWZ0U2liID0gUC5nZXRMZWZ0U2libGluZyhMZXZlbCk7CisgIGlmIChMZWZ0U2liKSB7CisgICAgT2Zmc2V0ICs9IEVsZW1lbnRzID0gQ3VyU2l6ZVtOb2Rlc10gPSBMZWZ0U2liLnNpemUoKTsKKyAgICBOb2RlW05vZGVzKytdID0gJkxlZnRTaWIuZ2V0PE5vZGVUPigpOworICB9CisKKyAgLy8gQ3VycmVudCBub2RlLgorICBFbGVtZW50cyArPSBDdXJTaXplW05vZGVzXSA9IFAuc2l6ZShMZXZlbCk7CisgIE5vZGVbTm9kZXMrK10gPSAmUC5ub2RlPE5vZGVUPihMZXZlbCk7CisKKyAgLy8gRG8gd2UgaGF2ZSBhIHJpZ2h0IHNpYmxpbmc/CisgIE5vZGVSZWYgUmlnaHRTaWIgPSBQLmdldFJpZ2h0U2libGluZyhMZXZlbCk7CisgIGlmIChSaWdodFNpYikgeworICAgIEVsZW1lbnRzICs9IEN1clNpemVbTm9kZXNdID0gUmlnaHRTaWIuc2l6ZSgpOworICAgIE5vZGVbTm9kZXMrK10gPSAmUmlnaHRTaWIuZ2V0PE5vZGVUPigpOworICB9CisKKyAgLy8gRG8gd2UgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBub2RlPworICB1bnNpZ25lZCBOZXdOb2RlID0gMDsKKyAgaWYgKEVsZW1lbnRzICsgMSA+IE5vZGVzICogTm9kZVQ6OkNhcGFjaXR5KSB7CisgICAgLy8gSW5zZXJ0IE5ld05vZGUgYXQgdGhlIHBlbnVsdGltYXRlIHBvc2l0aW9uLCBvciBhZnRlciBhIHNpbmdsZSBub2RlLgorICAgIE5ld05vZGUgPSBOb2RlcyA9PSAxID8gMSA6IE5vZGVzIC0gMTsKKyAgICBDdXJTaXplW05vZGVzXSA9IEN1clNpemVbTmV3Tm9kZV07CisgICAgTm9kZVtOb2Rlc10gPSBOb2RlW05ld05vZGVdOworICAgIEN1clNpemVbTmV3Tm9kZV0gPSAwOworICAgIE5vZGVbTmV3Tm9kZV0gPSB0aGlzLT5tYXAtPnRlbXBsYXRlIG5ld05vZGU8Tm9kZVQ+KCk7CisgICAgKytOb2RlczsKKyAgfQorCisgIC8vIENvbXB1dGUgdGhlIG5ldyBlbGVtZW50IGRpc3RyaWJ1dGlvbi4KKyAgdW5zaWduZWQgTmV3U2l6ZVs0XTsKKyAgSWR4UGFpciBOZXdPZmZzZXQgPSBkaXN0cmlidXRlKE5vZGVzLCBFbGVtZW50cywgTm9kZVQ6OkNhcGFjaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3VyU2l6ZSwgTmV3U2l6ZSwgT2Zmc2V0LCB0cnVlKTsKKyAgYWRqdXN0U2libGluZ1NpemVzKE5vZGUsIE5vZGVzLCBDdXJTaXplLCBOZXdTaXplKTsKKworICAvLyBNb3ZlIGN1cnJlbnQgbG9jYXRpb24gdG8gdGhlIGxlZnRtb3N0IG5vZGUuCisgIGlmIChMZWZ0U2liKQorICAgIFAubW92ZUxlZnQoTGV2ZWwpOworCisgIC8vIEVsZW1lbnRzIGhhdmUgYmVlbiByZWFycmFuZ2VkLCBub3cgdXBkYXRlIG5vZGUgc2l6ZXMgYW5kIHN0b3BzLgorICBib29sIFNwbGl0Um9vdCA9IGZhbHNlOworICB1bnNpZ25lZCBQb3MgPSAwOworICB3aGlsZSAodHJ1ZSkgeworICAgIEtleVQgU3RvcCA9IE5vZGVbUG9zXS0+c3RvcChOZXdTaXplW1Bvc10tMSk7CisgICAgaWYgKE5ld05vZGUgJiYgUG9zID09IE5ld05vZGUpIHsKKyAgICAgIFNwbGl0Um9vdCA9IGluc2VydE5vZGUoTGV2ZWwsIE5vZGVSZWYoTm9kZVtQb3NdLCBOZXdTaXplW1Bvc10pLCBTdG9wKTsKKyAgICAgIExldmVsICs9IFNwbGl0Um9vdDsKKyAgICB9IGVsc2UgeworICAgICAgUC5zZXRTaXplKExldmVsLCBOZXdTaXplW1Bvc10pOworICAgICAgc2V0Tm9kZVN0b3AoTGV2ZWwsIFN0b3ApOworICAgIH0KKyAgICBpZiAoUG9zICsgMSA9PSBOb2RlcykKKyAgICAgIGJyZWFrOworICAgIFAubW92ZVJpZ2h0KExldmVsKTsKKyAgICArK1BvczsKKyAgfQorCisgIC8vIFdoZXJlIHdhcyBJPyBGaW5kIE5ld09mZnNldC4KKyAgd2hpbGUoUG9zICE9IE5ld09mZnNldC5maXJzdCkgeworICAgIFAubW92ZUxlZnQoTGV2ZWwpOworICAgIC0tUG9zOworICB9CisgIFAub2Zmc2V0KExldmVsKSA9IE5ld09mZnNldC5zZWNvbmQ7CisgIHJldHVybiBTcGxpdFJvb3Q7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy0tLSAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJ2YWxNYXBPdmVybGFwcyAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tLS0vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEludGVydmFsTWFwT3ZlcmxhcHMgLSBJdGVyYXRlIG92ZXIgdGhlIG92ZXJsYXBzIG9mIG1hcHBlZCBpbnRlcnZhbHMgaW4gdHdvCisvLy8gSW50ZXJ2YWxNYXBzLiBUaGUgbWFwcyBtYXkgYmUgZGlmZmVyZW50LCBidXQgdGhlIEtleVQgYW5kIFRyYWl0cyB0eXBlcworLy8vIHNob3VsZCBiZSB0aGUgc2FtZS4KKy8vLworLy8vIFR5cGljYWwgdXNlczoKKy8vLworLy8vIDEuIFRlc3QgZm9yIG92ZXJsYXA6CisvLy8gICAgYm9vbCBvdmVybGFwID0gSW50ZXJ2YWxNYXBPdmVybGFwcyhhLCBiKS52YWxpZCgpOworLy8vCisvLy8gMi4gRW51bWVyYXRlIG92ZXJsYXBzOgorLy8vICAgIGZvciAoSW50ZXJ2YWxNYXBPdmVybGFwcyBJKGEsIGIpOyBJLnZhbGlkKCkgOyArK0kpIHsgLi4uIH0KKy8vLwordGVtcGxhdGUgPHR5cGVuYW1lIE1hcEEsIHR5cGVuYW1lIE1hcEI+CitjbGFzcyBJbnRlcnZhbE1hcE92ZXJsYXBzIHsKKyAgdXNpbmcgS2V5VHlwZSA9IHR5cGVuYW1lIE1hcEE6OktleVR5cGU7CisgIHVzaW5nIFRyYWl0cyA9IHR5cGVuYW1lIE1hcEE6OktleVRyYWl0czsKKworICB0eXBlbmFtZSBNYXBBOjpjb25zdF9pdGVyYXRvciBwb3NBOworICB0eXBlbmFtZSBNYXBCOjpjb25zdF9pdGVyYXRvciBwb3NCOworCisgIC8vLyBhZHZhbmNlIC0gTW92ZSBwb3NBIGFuZCBwb3NCIGZvcndhcmQgdW50aWwgcmVhY2hpbmcgYW4gb3ZlcmxhcCwgb3IgdW50aWwKKyAgLy8vIGVpdGhlciBtZWV0cyBlbmQuCisgIC8vLyBEb24ndCBtb3ZlIHRoZSBpdGVyYXRvcnMgaWYgdGhleSBhcmUgYWxyZWFkeSBvdmVybGFwcGluZy4KKyAgdm9pZCBhZHZhbmNlKCkgeworICAgIGlmICghdmFsaWQoKSkKKyAgICAgIHJldHVybjsKKworICAgIGlmIChUcmFpdHM6OnN0b3BMZXNzKHBvc0Euc3RvcCgpLCBwb3NCLnN0YXJ0KCkpKSB7CisgICAgICAvLyBBIGVuZHMgYmVmb3JlIEIgYmVnaW5zLiBDYXRjaCB1cC4KKyAgICAgIHBvc0EuYWR2YW5jZVRvKHBvc0Iuc3RhcnQoKSk7CisgICAgICBpZiAoIXBvc0EudmFsaWQoKSB8fCAhVHJhaXRzOjpzdG9wTGVzcyhwb3NCLnN0b3AoKSwgcG9zQS5zdGFydCgpKSkKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSBpZiAoVHJhaXRzOjpzdG9wTGVzcyhwb3NCLnN0b3AoKSwgcG9zQS5zdGFydCgpKSkgeworICAgICAgLy8gQiBlbmRzIGJlZm9yZSBBIGJlZ2lucy4gQ2F0Y2ggdXAuCisgICAgICBwb3NCLmFkdmFuY2VUbyhwb3NBLnN0YXJ0KCkpOworICAgICAgaWYgKCFwb3NCLnZhbGlkKCkgfHwgIVRyYWl0czo6c3RvcExlc3MocG9zQS5zdG9wKCksIHBvc0Iuc3RhcnQoKSkpCisgICAgICAgIHJldHVybjsKKyAgICB9IGVsc2UKKyAgICAgIC8vIEFscmVhZHkgb3ZlcmxhcHBpbmcuCisgICAgICByZXR1cm47CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgLy8gTWFrZSBhLmVuZCA+IGIuc3RhcnQuCisgICAgICBwb3NBLmFkdmFuY2VUbyhwb3NCLnN0YXJ0KCkpOworICAgICAgaWYgKCFwb3NBLnZhbGlkKCkgfHwgIVRyYWl0czo6c3RvcExlc3MocG9zQi5zdG9wKCksIHBvc0Euc3RhcnQoKSkpCisgICAgICAgIHJldHVybjsKKyAgICAgIC8vIE1ha2UgYi5lbmQgPiBhLnN0YXJ0LgorICAgICAgcG9zQi5hZHZhbmNlVG8ocG9zQS5zdGFydCgpKTsKKyAgICAgIGlmICghcG9zQi52YWxpZCgpIHx8ICFUcmFpdHM6OnN0b3BMZXNzKHBvc0Euc3RvcCgpLCBwb3NCLnN0YXJ0KCkpKQorICAgICAgICByZXR1cm47CisgICAgfQorICB9CisKK3B1YmxpYzoKKyAgLy8vIEludGVydmFsTWFwT3ZlcmxhcHMgLSBDcmVhdGUgYW4gaXRlcmF0b3IgZm9yIHRoZSBvdmVybGFwcyBvZiBhIGFuZCBiLgorICBJbnRlcnZhbE1hcE92ZXJsYXBzKGNvbnN0IE1hcEEgJmEsIGNvbnN0IE1hcEIgJmIpCisgICAgOiBwb3NBKGIuZW1wdHkoKSA/IGEuZW5kKCkgOiBhLmZpbmQoYi5zdGFydCgpKSksCisgICAgICBwb3NCKHBvc0EudmFsaWQoKSA/IGIuZmluZChwb3NBLnN0YXJ0KCkpIDogYi5lbmQoKSkgeyBhZHZhbmNlKCk7IH0KKworICAvLy8gdmFsaWQgLSBSZXR1cm4gdHJ1ZSBpZiBpdGVyYXRvciBpcyBhdCBhbiBvdmVybGFwLgorICBib29sIHZhbGlkKCkgY29uc3QgeworICAgIHJldHVybiBwb3NBLnZhbGlkKCkgJiYgcG9zQi52YWxpZCgpOworICB9CisKKyAgLy8vIGEgLSBhY2Nlc3MgdGhlIGxlZnQgaGFuZCBzaWRlIGluIHRoZSBvdmVybGFwLgorICBjb25zdCB0eXBlbmFtZSBNYXBBOjpjb25zdF9pdGVyYXRvciAmYSgpIGNvbnN0IHsgcmV0dXJuIHBvc0E7IH0KKworICAvLy8gYiAtIGFjY2VzcyB0aGUgcmlnaHQgaGFuZCBzaWRlIGluIHRoZSBvdmVybGFwLgorICBjb25zdCB0eXBlbmFtZSBNYXBCOjpjb25zdF9pdGVyYXRvciAmYigpIGNvbnN0IHsgcmV0dXJuIHBvc0I7IH0KKworICAvLy8gc3RhcnQgLSBCZWdpbm5pbmcgb2YgdGhlIG92ZXJsYXBwaW5nIGludGVydmFsLgorICBLZXlUeXBlIHN0YXJ0KCkgY29uc3QgeworICAgIEtleVR5cGUgYWsgPSBhKCkuc3RhcnQoKTsKKyAgICBLZXlUeXBlIGJrID0gYigpLnN0YXJ0KCk7CisgICAgcmV0dXJuIFRyYWl0czo6c3RhcnRMZXNzKGFrLCBiaykgPyBiayA6IGFrOworICB9CisKKyAgLy8vIHN0b3AgLSBFbmQgb2YgdGhlIG92ZXJsYXBwaW5nIGludGVydmFsLgorICBLZXlUeXBlIHN0b3AoKSBjb25zdCB7CisgICAgS2V5VHlwZSBhayA9IGEoKS5zdG9wKCk7CisgICAgS2V5VHlwZSBiayA9IGIoKS5zdG9wKCk7CisgICAgcmV0dXJuIFRyYWl0czo6c3RhcnRMZXNzKGFrLCBiaykgPyBhayA6IGJrOworICB9CisKKyAgLy8vIHNraXBBIC0gTW92ZSB0byB0aGUgbmV4dCBvdmVybGFwIHRoYXQgZG9lc24ndCBpbnZvbHZlIGEoKS4KKyAgdm9pZCBza2lwQSgpIHsKKyAgICArK3Bvc0E7CisgICAgYWR2YW5jZSgpOworICB9CisKKyAgLy8vIHNraXBCIC0gTW92ZSB0byB0aGUgbmV4dCBvdmVybGFwIHRoYXQgZG9lc24ndCBpbnZvbHZlIGIoKS4KKyAgdm9pZCBza2lwQigpIHsKKyAgICArK3Bvc0I7CisgICAgYWR2YW5jZSgpOworICB9CisKKyAgLy8vIFByZWluY3JlbWVudCAtIE1vdmUgdG8gdGhlIG5leHQgb3ZlcmxhcC4KKyAgSW50ZXJ2YWxNYXBPdmVybGFwcyAmb3BlcmF0b3IrKygpIHsKKyAgICAvLyBCdW1wIHRoZSBpdGVyYXRvciB0aGF0IGVuZHMgZmlyc3QuIFRoZSBvdGhlciBvbmUgbWF5IGhhdmUgbW9yZSBvdmVybGFwcy4KKyAgICBpZiAoVHJhaXRzOjpzdGFydExlc3MocG9zQi5zdG9wKCksIHBvc0Euc3RvcCgpKSkKKyAgICAgIHNraXBCKCk7CisgICAgZWxzZQorICAgICAgc2tpcEEoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gYWR2YW5jZVRvIC0gTW92ZSB0byB0aGUgZmlyc3Qgb3ZlcmxhcHBpbmcgaW50ZXJ2YWwgd2l0aAorICAvLy8gc3RvcExlc3MoeCwgc3RvcCgpKS4KKyAgdm9pZCBhZHZhbmNlVG8oS2V5VHlwZSB4KSB7CisgICAgaWYgKCF2YWxpZCgpKQorICAgICAgcmV0dXJuOworICAgIC8vIE1ha2Ugc3VyZSBhZHZhbmNlVG8gc2VlcyBtb25vdG9uaWMga2V5cy4KKyAgICBpZiAoVHJhaXRzOjpzdG9wTGVzcyhwb3NBLnN0b3AoKSwgeCkpCisgICAgICBwb3NBLmFkdmFuY2VUbyh4KTsKKyAgICBpZiAoVHJhaXRzOjpzdG9wTGVzcyhwb3NCLnN0b3AoKSwgeCkpCisgICAgICBwb3NCLmFkdmFuY2VUbyh4KTsKKyAgICBhZHZhbmNlKCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9JTlRFUlZBTE1BUF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9JbnRydXNpdmVSZWZDbnRQdHIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL0ludHJ1c2l2ZVJlZkNudFB0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMGVmODYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9JbnRydXNpdmVSZWZDbnRQdHIuaApAQCAtMCwwICsxLDI3MCBAQAorLy89PS0gbGx2bS9BRFQvSW50cnVzaXZlUmVmQ250UHRyLmggLSBTbWFydCBSZWZjb3VudGluZyBQb2ludGVyIC0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgUmVmQ291bnRlZEJhc2UsIFRocmVhZFNhZmVSZWZDb3VudGVkQmFzZSwgYW5kCisvLyBJbnRydXNpdmVSZWZDbnRQdHIgY2xhc3Nlcy4KKy8vCisvLyBJbnRydXNpdmVSZWZDbnRQdHIgaXMgYSBzbWFydCBwb2ludGVyIHRvIGFuIG9iamVjdCB3aGljaCBtYWludGFpbnMgYQorLy8gcmVmZXJlbmNlIGNvdW50LiAgKFRocmVhZFNhZmUpUmVmQ291bnRlZEJhc2UgaXMgYSBtaXhpbiBjbGFzcyB0aGF0IGFkZHMgYQorLy8gcmVmY291bnQgbWVtYmVyIHZhcmlhYmxlIGFuZCBtZXRob2RzIGZvciB1cGRhdGluZyB0aGUgcmVmY291bnQuICBBbiBvYmplY3QKKy8vIHRoYXQgaW5oZXJpdHMgZnJvbSAoVGhyZWFkU2FmZSlSZWZDb3VudGVkQmFzZSBkZWxldGVzIGl0c2VsZiB3aGVuIGl0cworLy8gcmVmY291bnQgaGl0cyB6ZXJvLgorLy8KKy8vIEZvciBleGFtcGxlOgorLy8KKy8vICAgY2xhc3MgTXlDbGFzcyA6IHB1YmxpYyBSZWZDb3VudGVkQmFzZTxNeUNsYXNzPiB7fTsKKy8vCisvLyAgIHZvaWQgZm9vKCkgeworLy8gICAgIC8vIENvbnN0cnVjdGluZyBhbiBJbnRydXNpdmVSZWZDbnRQdHIgaW5jcmVhc2VzIHRoZSBwb2ludGVlJ3MgcmVmY291bnQgYnkKKy8vICAgICAvLyAxIChmcm9tIDAgaW4gdGhpcyBjYXNlKS4KKy8vICAgICBJbnRydXNpdmVSZWZDbnRQdHI8TXlDbGFzcz4gUHRyMShuZXcgTXlDbGFzcygpKTsKKy8vCisvLyAgICAgLy8gQ29weWluZyBhbiBJbnRydXNpdmVSZWZDbnRQdHIgaW5jcmVhc2VzIHRoZSBwb2ludGVlJ3MgcmVmY291bnQgYnkgMS4KKy8vICAgICBJbnRydXNpdmVSZWZDbnRQdHI8TXlDbGFzcz4gUHRyMihQdHIxKTsKKy8vCisvLyAgICAgLy8gQ29uc3RydWN0aW5nIGFuIEludHJ1c2l2ZVJlZkNudFB0ciBoYXMgbm8gZWZmZWN0IG9uIHRoZSBvYmplY3QncworLy8gICAgIC8vIHJlZmNvdW50LiAgQWZ0ZXIgYSBtb3ZlLCB0aGUgbW92ZWQtZnJvbSBwb2ludGVyIGlzIG51bGwuCisvLyAgICAgSW50cnVzaXZlUmVmQ250UHRyPE15Q2xhc3M+IFB0cjMoc3RkOjptb3ZlKFB0cjEpKTsKKy8vICAgICBhc3NlcnQoUHRyMSA9PSBudWxscHRyKTsKKy8vCisvLyAgICAgLy8gQ2xlYXJpbmcgYW4gSW50cnVzaXZlUmVmQ250UHRyIGRlY3JlYXNlcyB0aGUgcG9pbnRlZSdzIHJlZmNvdW50IGJ5IDEuCisvLyAgICAgUHRyMi5yZXNldCgpOworLy8KKy8vICAgICAvLyBUaGUgb2JqZWN0IGRlbGV0ZXMgaXRzZWxmIHdoZW4gd2UgcmV0dXJuIGZyb20gdGhlIGZ1bmN0aW9uLCBiZWNhdXNlCisvLyAgICAgLy8gUHRyMydzIGRlc3RydWN0b3IgZGVjcmVtZW50cyBpdHMgcmVmY291bnQgdG8gMC4KKy8vICAgfQorLy8KKy8vIFlvdSBjYW4gdXNlIEludHJ1c2l2ZVJlZkNudFB0ciB3aXRoIGlzYTxUPigpLCBkeW5fY2FzdDxUPigpLCBldGMuOgorLy8KKy8vICAgSW50cnVzaXZlUmVmQ250UHRyPE15Q2xhc3M+IFB0cihuZXcgTXlDbGFzcygpKTsKKy8vICAgT3RoZXJDbGFzcyAqT3RoZXIgPSBkeW5fY2FzdDxPdGhlckNsYXNzPihQdHIpOyAgLy8gUHRyLmdldCgpIG5vdCByZXF1aXJlZAorLy8KKy8vIEludHJ1c2l2ZVJlZkNudFB0ciB3b3JrcyB3aXRoIGFueSBjbGFzcyB0aGF0CisvLworLy8gIC0gaW5oZXJpdHMgZnJvbSAoVGhyZWFkU2FmZSlSZWZDb3VudGVkQmFzZSwKKy8vICAtIGhhcyBSZXRhaW4oKSBhbmQgUmVsZWFzZSgpIG1ldGhvZHMsIG9yCisvLyAgLSBzcGVjaWFsaXplcyBJbnRydXNpdmVSZWZDbnRQdHJJbmZvLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfSU5UUlVTSVZFUkVGQ05UUFRSX0gKKyNkZWZpbmUgTExWTV9BRFRfSU5UUlVTSVZFUkVGQ05UUFRSX0gKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEEgQ1JUUCBtaXhpbiBjbGFzcyB0aGF0IGFkZHMgcmVmZXJlbmNlIGNvdW50aW5nIHRvIGEgdHlwZS4KKy8vLworLy8vIFRoZSBsaWZldGltZSBvZiBhbiBvYmplY3Qgd2hpY2ggaW5oZXJpdHMgZnJvbSBSZWZDb3VudGVkQmFzZSBpcyBtYW5hZ2VkIGJ5CisvLy8gY2FsbHMgdG8gUmVsZWFzZSgpIGFuZCBSZXRhaW4oKSwgd2hpY2ggaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgdGhlIG9iamVjdCdzCisvLy8gcmVmY291bnQsIHJlc3BlY3RpdmVseS4gIFdoZW4gYSBSZWxlYXNlKCkgY2FsbCBkZWNyZW1lbnRzIHRoZSByZWZjb3VudCB0byAwLAorLy8vIHRoZSBvYmplY3QgZGVsZXRlcyBpdHNlbGYuCit0ZW1wbGF0ZSA8Y2xhc3MgRGVyaXZlZD4gY2xhc3MgUmVmQ291bnRlZEJhc2UgeworICBtdXRhYmxlIHVuc2lnbmVkIFJlZkNvdW50ID0gMDsKKworcHVibGljOgorICBSZWZDb3VudGVkQmFzZSgpID0gZGVmYXVsdDsKKyAgUmVmQ291bnRlZEJhc2UoY29uc3QgUmVmQ291bnRlZEJhc2UgJikge30KKworICB2b2lkIFJldGFpbigpIGNvbnN0IHsgKytSZWZDb3VudDsgfQorCisgIHZvaWQgUmVsZWFzZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoUmVmQ291bnQgPiAwICYmICJSZWZlcmVuY2UgY291bnQgaXMgYWxyZWFkeSB6ZXJvLiIpOworICAgIGlmICgtLVJlZkNvdW50ID09IDApCisgICAgICBkZWxldGUgc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZCAqPih0aGlzKTsKKyAgfQorfTsKKworLy8vIEEgdGhyZWFkLXNhZmUgdmVyc2lvbiBvZiBcYyBSZWZDb3VudGVkQmFzZS4KK3RlbXBsYXRlIDxjbGFzcyBEZXJpdmVkPiBjbGFzcyBUaHJlYWRTYWZlUmVmQ291bnRlZEJhc2UgeworICBtdXRhYmxlIHN0ZDo6YXRvbWljPGludD4gUmVmQ291bnQ7CisKK3Byb3RlY3RlZDoKKyAgVGhyZWFkU2FmZVJlZkNvdW50ZWRCYXNlKCkgOiBSZWZDb3VudCgwKSB7fQorCitwdWJsaWM6CisgIHZvaWQgUmV0YWluKCkgY29uc3QgeyBSZWZDb3VudC5mZXRjaF9hZGQoMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7IH0KKworICB2b2lkIFJlbGVhc2UoKSBjb25zdCB7CisgICAgaW50IE5ld1JlZkNvdW50ID0gUmVmQ291bnQuZmV0Y2hfc3ViKDEsIHN0ZDo6bWVtb3J5X29yZGVyX2FjcV9yZWwpIC0gMTsKKyAgICBhc3NlcnQoTmV3UmVmQ291bnQgPj0gMCAmJiAiUmVmZXJlbmNlIGNvdW50IHdhcyBhbHJlYWR5IHplcm8uIik7CisgICAgaWYgKE5ld1JlZkNvdW50ID09IDApCisgICAgICBkZWxldGUgc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZCAqPih0aGlzKTsKKyAgfQorfTsKKworLy8vIENsYXNzIHlvdSBjYW4gc3BlY2lhbGl6ZSB0byBwcm92aWRlIGN1c3RvbSByZXRhaW4vcmVsZWFzZSBmdW5jdGlvbmFsaXR5IGZvcgorLy8vIGEgdHlwZS4KKy8vLworLy8vIFVzdWFsbHkgc3BlY2lhbGl6aW5nIHRoaXMgY2xhc3MgaXMgbm90IG5lY2Vzc2FyeSwgYXMgSW50cnVzaXZlUmVmQ250UHRyCisvLy8gd29ya3Mgd2l0aCBhbnkgdHlwZSB3aGljaCBkZWZpbmVzIFJldGFpbigpIGFuZCBSZWxlYXNlKCkgZnVuY3Rpb25zIC0tIHlvdQorLy8vIGNhbiBkZWZpbmUgdGhvc2UgZnVuY3Rpb25zIHlvdXJzZWxmIGlmIFJlZkNvdW50ZWRCYXNlIGRvZXNuJ3Qgd29yayBmb3IgeW91LgorLy8vCisvLy8gT25lIGNhc2Ugd2hlbiB5b3UgbWlnaHQgd2FudCB0byBzcGVjaWFsaXplIHRoaXMgdHlwZSBpcyBpZiB5b3UgaGF2ZQorLy8vICAtIEZvby5oIGRlZmluZXMgdHlwZSBGb28gYW5kIGluY2x1ZGVzIEJhci5oLCBhbmQKKy8vLyAgLSBCYXIuaCB1c2VzIEludHJ1c2l2ZVJlZkNudFB0cjxGb28+IGluIGlubGluZSBmdW5jdGlvbnMuCisvLy8KKy8vLyBCZWNhdXNlIEZvby5oIGluY2x1ZGVzIEJhci5oLCBCYXIuaCBjYW4ndCBpbmNsdWRlIEZvby5oIGluIG9yZGVyIHRvIHB1bGwgaW4KKy8vLyB0aGUgZGVjbGFyYXRpb24gb2YgRm9vLiAgV2l0aG91dCB0aGUgZGVjbGFyYXRpb24gb2YgRm9vLCBub3JtYWxseSBCYXIuaAorLy8vIHdvdWxkbid0IGJlIGFibGUgdG8gdXNlIEludHJ1c2l2ZVJlZkNudFB0cjxGb28+LCB3aGljaCB3YW50cyB0byBjYWxsCisvLy8gVDo6UmV0YWluIGFuZCBUOjpSZWxlYXNlLgorLy8vCisvLy8gVG8gcmVzb2x2ZSB0aGlzLCBCYXIuaCBjb3VsZCBpbmNsdWRlIGEgdGhpcmQgaGVhZGVyLCBGb29Gd2QuaCwgd2hpY2gKKy8vLyBmb3J3YXJkLWRlY2xhcmVzIEZvbyBhbmQgc3BlY2lhbGl6ZXMgSW50cnVzaXZlUmVmQ250UHRySW5mbzxGb28+LiAgVGhlbgorLy8vIEJhci5oIGNvdWxkIHVzZSBJbnRydXNpdmVSZWZDbnRQdHI8Rm9vPiwgYWx0aG91Z2ggaXQgc3RpbGwgY291bGRuJ3QgY2FsbCBhbnkKKy8vLyBmdW5jdGlvbnMgb24gRm9vIGl0c2VsZiwgYmVjYXVzZSBGb28gd291bGQgYmUgYW4gaW5jb21wbGV0ZSB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBJbnRydXNpdmVSZWZDbnRQdHJJbmZvIHsKKyAgc3RhdGljIHZvaWQgcmV0YWluKFQgKm9iaikgeyBvYmotPlJldGFpbigpOyB9CisgIHN0YXRpYyB2b2lkIHJlbGVhc2UoVCAqb2JqKSB7IG9iai0+UmVsZWFzZSgpOyB9Cit9OworCisvLy8gQSBzbWFydCBwb2ludGVyIHRvIGEgcmVmZXJlbmNlLWNvdW50ZWQgb2JqZWN0IHRoYXQgaW5oZXJpdHMgZnJvbQorLy8vIFJlZkNvdW50ZWRCYXNlIG9yIFRocmVhZFNhZmVSZWZDb3VudGVkQmFzZS4KKy8vLworLy8vIFRoaXMgY2xhc3MgaW5jcmVtZW50cyBpdHMgcG9pbnRlZSdzIHJlZmVyZW5jZSBjb3VudCB3aGVuIGl0IGlzIGNyZWF0ZWQsIGFuZAorLy8vIGRlY3JlbWVudHMgaXRzIHJlZmNvdW50IHdoZW4gaXQncyBkZXN0cm95ZWQgKG9yIGlzIGNoYW5nZWQgdG8gcG9pbnQgdG8gYQorLy8vIGRpZmZlcmVudCBvYmplY3QpLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEludHJ1c2l2ZVJlZkNudFB0ciB7CisgIFQgKk9iaiA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgdXNpbmcgZWxlbWVudF90eXBlID0gVDsKKworICBleHBsaWNpdCBJbnRydXNpdmVSZWZDbnRQdHIoKSA9IGRlZmF1bHQ7CisgIEludHJ1c2l2ZVJlZkNudFB0cihUICpvYmopIDogT2JqKG9iaikgeyByZXRhaW4oKTsgfQorICBJbnRydXNpdmVSZWZDbnRQdHIoY29uc3QgSW50cnVzaXZlUmVmQ250UHRyICZTKSA6IE9iaihTLk9iaikgeyByZXRhaW4oKTsgfQorICBJbnRydXNpdmVSZWZDbnRQdHIoSW50cnVzaXZlUmVmQ250UHRyICYmUykgOiBPYmooUy5PYmopIHsgUy5PYmogPSBudWxscHRyOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFg+CisgIEludHJ1c2l2ZVJlZkNudFB0cihJbnRydXNpdmVSZWZDbnRQdHI8WD4gJiZTKSA6IE9iaihTLmdldCgpKSB7CisgICAgUy5PYmogPSBudWxscHRyOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFg+CisgIEludHJ1c2l2ZVJlZkNudFB0cihjb25zdCBJbnRydXNpdmVSZWZDbnRQdHI8WD4gJlMpIDogT2JqKFMuZ2V0KCkpIHsKKyAgICByZXRhaW4oKTsKKyAgfQorCisgIH5JbnRydXNpdmVSZWZDbnRQdHIoKSB7IHJlbGVhc2UoKTsgfQorCisgIEludHJ1c2l2ZVJlZkNudFB0ciAmb3BlcmF0b3I9KEludHJ1c2l2ZVJlZkNudFB0ciBTKSB7CisgICAgc3dhcChTKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqT2JqOyB9CisgIFQgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBPYmo7IH0KKyAgVCAqZ2V0KCkgY29uc3QgeyByZXR1cm4gT2JqOyB9CisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBPYmo7IH0KKworICB2b2lkIHN3YXAoSW50cnVzaXZlUmVmQ250UHRyICZvdGhlcikgeworICAgIFQgKnRtcCA9IG90aGVyLk9iajsKKyAgICBvdGhlci5PYmogPSBPYmo7CisgICAgT2JqID0gdG1wOworICB9CisKKyAgdm9pZCByZXNldCgpIHsKKyAgICByZWxlYXNlKCk7CisgICAgT2JqID0gbnVsbHB0cjsKKyAgfQorCisgIHZvaWQgcmVzZXRXaXRob3V0UmVsZWFzZSgpIHsgT2JqID0gbnVsbHB0cjsgfQorCitwcml2YXRlOgorICB2b2lkIHJldGFpbigpIHsKKyAgICBpZiAoT2JqKQorICAgICAgSW50cnVzaXZlUmVmQ250UHRySW5mbzxUPjo6cmV0YWluKE9iaik7CisgIH0KKworICB2b2lkIHJlbGVhc2UoKSB7CisgICAgaWYgKE9iaikKKyAgICAgIEludHJ1c2l2ZVJlZkNudFB0ckluZm88VD46OnJlbGVhc2UoT2JqKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBYPiBmcmllbmQgY2xhc3MgSW50cnVzaXZlUmVmQ250UHRyOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0cjxUPiAmQSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFU+ICZCKSB7CisgIHJldHVybiBBLmdldCgpID09IEIuZ2V0KCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgoraW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJbnRydXNpdmVSZWZDbnRQdHI8VD4gJkEsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0cjxVPiAmQikgeworICByZXR1cm4gQS5nZXQoKSAhPSBCLmdldCgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFQ+ICZBLCBVICpCKSB7CisgIHJldHVybiBBLmdldCgpID09IEI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPgoraW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJbnRydXNpdmVSZWZDbnRQdHI8VD4gJkEsIFUgKkIpIHsKKyAgcmV0dXJuIEEuZ2V0KCkgIT0gQjsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIFU+CitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KFQgKkEsIGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0cjxVPiAmQikgeworICByZXR1cm4gQSA9PSBCLmdldCgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4KK2lubGluZSBib29sIG9wZXJhdG9yIT0oVCAqQSwgY29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFU+ICZCKSB7CisgIHJldHVybiBBICE9IEIuZ2V0KCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorYm9vbCBvcGVyYXRvcj09KHN0ZDo6bnVsbHB0cl90IEEsIGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0cjxUPiAmQikgeworICByZXR1cm4gIUI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUPgorYm9vbCBvcGVyYXRvcj09KGNvbnN0IEludHJ1c2l2ZVJlZkNudFB0cjxUPiAmQSwgc3RkOjpudWxscHRyX3QgQikgeworICByZXR1cm4gQiA9PSBBOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2Jvb2wgb3BlcmF0b3IhPShzdGQ6Om51bGxwdHJfdCBBLCBjb25zdCBJbnRydXNpdmVSZWZDbnRQdHI8VD4gJkIpIHsKKyAgcmV0dXJuICEoQSA9PSBCKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+Citib29sIG9wZXJhdG9yIT0oY29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFQ+ICZBLCBzdGQ6Om51bGxwdHJfdCBCKSB7CisgIHJldHVybiAhKEEgPT0gQik7Cit9CisKKy8vIE1ha2UgSW50cnVzaXZlUmVmQ250UHRyIHdvcmsgd2l0aCBkeW5fY2FzdCwgaXNhLCBhbmQgdGhlIG90aGVyIGlkaW9tcyBmcm9tCisvLyBDYXN0aW5nLmguCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4gc3RydWN0IHNpbXBsaWZ5X3R5cGU7CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxJbnRydXNpdmVSZWZDbnRQdHI8VD4+IHsKKyAgdXNpbmcgU2ltcGxlVHlwZSA9IFQgKjsKKworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoSW50cnVzaXZlUmVmQ250UHRyPFQ+ICZWYWwpIHsKKyAgICByZXR1cm4gVmFsLmdldCgpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8Y29uc3QgSW50cnVzaXZlUmVmQ250UHRyPFQ+PiB7CisgIHVzaW5nIFNpbXBsZVR5cGUgPSAvKmNvbnN0Ki8gVCAqOworCisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShjb25zdCBJbnRydXNpdmVSZWZDbnRQdHI8VD4gJlZhbCkgeworICAgIHJldHVybiBWYWwuZ2V0KCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9JTlRSVVNJVkVSRUZDTlRQVFJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvTWFwVmVjdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9NYXBWZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjlmOGZkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvTWFwVmVjdG9yLmgKQEAgLTAsMCArMSwyMzYgQEAKKy8vPT09LSBsbHZtL0FEVC9NYXBWZWN0b3IuaCAtIE1hcCB3LyBkZXRlcm1pbmlzdGljIHZhbHVlIG9yZGVyIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSBtYXAgdGhhdCBwcm92aWRlcyBpbnNlcnRpb24gb3JkZXIgaXRlcmF0aW9uLiBUaGUKKy8vIGludGVyZmFjZSBpcyBwdXJwb3NlZnVsbHkgbWluaW1hbC4gVGhlIGtleSBpcyBhc3N1bWVkIHRvIGJlIGNoZWFwIHRvIGNvcHkKKy8vIGFuZCAyIGNvcGllcyBhcmUga2VwdCwgb25lIGZvciBpbmRleGluZyBpbiBhIERlbnNlTWFwLCBvbmUgZm9yIGl0ZXJhdGlvbiBpbgorLy8gYSBzdGQ6OnZlY3Rvci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX01BUFZFQ1RPUl9ICisjZGVmaW5lIExMVk1fQURUX01BUFZFQ1RPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgbWFwIHRoYXQgYWxzbyBwcm92aWRlcyBhY2Nlc3MgdG8gYWxsIHN0b3JlZCB2YWx1ZXMKKy8vLyBpbiBhIGRldGVybWluaXN0aWMgb3JkZXIuIFRoZSB2YWx1ZXMgYXJlIGtlcHQgaW4gYSBzdGQ6OnZlY3RvciBhbmQgdGhlCisvLy8gbWFwcGluZyBpcyBkb25lIHdpdGggRGVuc2VNYXAgZnJvbSBLZXlzIHRvIGluZGV4ZXMgaW4gdGhhdCB2ZWN0b3IuCit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWx1ZVQsCisgICAgICAgICB0eXBlbmFtZSBNYXBUeXBlID0gRGVuc2VNYXA8S2V5VCwgdW5zaWduZWQ+LAorICAgICAgICAgdHlwZW5hbWUgVmVjdG9yVHlwZSA9IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+Pj4KK2NsYXNzIE1hcFZlY3RvciB7CisgIE1hcFR5cGUgTWFwOworICBWZWN0b3JUeXBlIFZlY3RvcjsKKworcHVibGljOgorICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgVmVjdG9yVHlwZTo6dmFsdWVfdHlwZTsKKyAgdXNpbmcgc2l6ZV90eXBlID0gdHlwZW5hbWUgVmVjdG9yVHlwZTo6c2l6ZV90eXBlOworCisgIHVzaW5nIGl0ZXJhdG9yID0gdHlwZW5hbWUgVmVjdG9yVHlwZTo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gdHlwZW5hbWUgVmVjdG9yVHlwZTo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIHJldmVyc2VfaXRlcmF0b3IgPSB0eXBlbmFtZSBWZWN0b3JUeXBlOjpyZXZlcnNlX2l0ZXJhdG9yOworICB1c2luZyBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yID0gdHlwZW5hbWUgVmVjdG9yVHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAvLy8gQ2xlYXIgdGhlIE1hcFZlY3RvciBhbmQgcmV0dXJuIHRoZSB1bmRlcmx5aW5nIHZlY3Rvci4KKyAgVmVjdG9yVHlwZSB0YWtlVmVjdG9yKCkgeworICAgIE1hcC5jbGVhcigpOworICAgIHJldHVybiBzdGQ6Om1vdmUoVmVjdG9yKTsKKyAgfQorCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gVmVjdG9yLnNpemUoKTsgfQorCisgIC8vLyBHcm93IHRoZSBNYXBWZWN0b3Igc28gdGhhdCBpdCBjYW4gY29udGFpbiBhdCBsZWFzdCBccCBOdW1FbnRyaWVzIGl0ZW1zCisgIC8vLyBiZWZvcmUgcmVzaXppbmcgYWdhaW4uCisgIHZvaWQgcmVzZXJ2ZShzaXplX3R5cGUgTnVtRW50cmllcykgeworICAgIE1hcC5yZXNlcnZlKE51bUVudHJpZXMpOworICAgIFZlY3Rvci5yZXNlcnZlKE51bUVudHJpZXMpOworICB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBWZWN0b3IuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFZlY3Rvci5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIFZlY3Rvci5lbmQoKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBWZWN0b3IuZW5kKCk7IH0KKworICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIFZlY3Rvci5yYmVnaW4oKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFZlY3Rvci5yYmVnaW4oKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiBWZWN0b3IucmVuZCgpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgcmV0dXJuIFZlY3Rvci5yZW5kKCk7IH0KKworICBib29sIGVtcHR5KCkgY29uc3QgeworICAgIHJldHVybiBWZWN0b3IuZW1wdHkoKTsKKyAgfQorCisgIHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+ICAgICAgICZmcm9udCgpICAgICAgIHsgcmV0dXJuIFZlY3Rvci5mcm9udCgpOyB9CisgIGNvbnN0IHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+ICZmcm9udCgpIGNvbnN0IHsgcmV0dXJuIFZlY3Rvci5mcm9udCgpOyB9CisgIHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+ICAgICAgICZiYWNrKCkgICAgICAgIHsgcmV0dXJuIFZlY3Rvci5iYWNrKCk7IH0KKyAgY29uc3Qgc3RkOjpwYWlyPEtleVQsIFZhbHVlVD4gJmJhY2soKSAgY29uc3QgeyByZXR1cm4gVmVjdG9yLmJhY2soKTsgfQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgTWFwLmNsZWFyKCk7CisgICAgVmVjdG9yLmNsZWFyKCk7CisgIH0KKworICB2b2lkIHN3YXAoTWFwVmVjdG9yICZSSFMpIHsKKyAgICBzdGQ6OnN3YXAoTWFwLCBSSFMuTWFwKTsKKyAgICBzdGQ6OnN3YXAoVmVjdG9yLCBSSFMuVmVjdG9yKTsKKyAgfQorCisgIFZhbHVlVCAmb3BlcmF0b3JbXShjb25zdCBLZXlUICZLZXkpIHsKKyAgICBzdGQ6OnBhaXI8S2V5VCwgdW5zaWduZWQ+IFBhaXIgPSBzdGQ6Om1ha2VfcGFpcihLZXksIDApOworICAgIHN0ZDo6cGFpcjx0eXBlbmFtZSBNYXBUeXBlOjppdGVyYXRvciwgYm9vbD4gUmVzdWx0ID0gTWFwLmluc2VydChQYWlyKTsKKyAgICB1bnNpZ25lZCAmSSA9IFJlc3VsdC5maXJzdC0+c2Vjb25kOworICAgIGlmIChSZXN1bHQuc2Vjb25kKSB7CisgICAgICBWZWN0b3IucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEtleSwgVmFsdWVUKCkpKTsKKyAgICAgIEkgPSBWZWN0b3Iuc2l6ZSgpIC0gMTsKKyAgICB9CisgICAgcmV0dXJuIFZlY3RvcltJXS5zZWNvbmQ7CisgIH0KKworICAvLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgdmFsdWUuICBPbmx5IGFsbG93ZWQgaWYgVmFsdWVUIGlzIGNvcHlhYmxlLgorICBWYWx1ZVQgbG9va3VwKGNvbnN0IEtleVQgJktleSkgY29uc3QgeworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19jb3B5X2NvbnN0cnVjdGlibGU8VmFsdWVUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNhbGwgbG9va3VwKCkgaWYgVmFsdWVUIGlzIG5vdCBjb3B5YWJsZS4iKTsKKyAgICB0eXBlbmFtZSBNYXBUeXBlOjpjb25zdF9pdGVyYXRvciBQb3MgPSBNYXAuZmluZChLZXkpOworICAgIHJldHVybiBQb3MgPT0gTWFwLmVuZCgpPyBWYWx1ZVQoKSA6IFZlY3RvcltQb3MtPnNlY29uZF0uc2Vjb25kOworICB9CisKKyAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnQoY29uc3Qgc3RkOjpwYWlyPEtleVQsIFZhbHVlVD4gJktWKSB7CisgICAgc3RkOjpwYWlyPEtleVQsIHVuc2lnbmVkPiBQYWlyID0gc3RkOjptYWtlX3BhaXIoS1YuZmlyc3QsIDApOworICAgIHN0ZDo6cGFpcjx0eXBlbmFtZSBNYXBUeXBlOjppdGVyYXRvciwgYm9vbD4gUmVzdWx0ID0gTWFwLmluc2VydChQYWlyKTsKKyAgICB1bnNpZ25lZCAmSSA9IFJlc3VsdC5maXJzdC0+c2Vjb25kOworICAgIGlmIChSZXN1bHQuc2Vjb25kKSB7CisgICAgICBWZWN0b3IucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEtWLmZpcnN0LCBLVi5zZWNvbmQpKTsKKyAgICAgIEkgPSBWZWN0b3Iuc2l6ZSgpIC0gMTsKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihzdGQ6OnByZXYoZW5kKCkpLCB0cnVlKTsKKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGJlZ2luKCkgKyBJLCBmYWxzZSk7CisgIH0KKworICBzdGQ6OnBhaXI8aXRlcmF0b3IsIGJvb2w+IGluc2VydChzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPiAmJktWKSB7CisgICAgLy8gQ29weSBLVi5maXJzdCBpbnRvIHRoZSBtYXAsIHRoZW4gbW92ZSBpdCBpbnRvIHRoZSB2ZWN0b3IuCisgICAgc3RkOjpwYWlyPEtleVQsIHVuc2lnbmVkPiBQYWlyID0gc3RkOjptYWtlX3BhaXIoS1YuZmlyc3QsIDApOworICAgIHN0ZDo6cGFpcjx0eXBlbmFtZSBNYXBUeXBlOjppdGVyYXRvciwgYm9vbD4gUmVzdWx0ID0gTWFwLmluc2VydChQYWlyKTsKKyAgICB1bnNpZ25lZCAmSSA9IFJlc3VsdC5maXJzdC0+c2Vjb25kOworICAgIGlmIChSZXN1bHQuc2Vjb25kKSB7CisgICAgICBWZWN0b3IucHVzaF9iYWNrKHN0ZDo6bW92ZShLVikpOworICAgICAgSSA9IFZlY3Rvci5zaXplKCkgLSAxOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHN0ZDo6cHJldihlbmQoKSksIHRydWUpOworICAgIH0KKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoYmVnaW4oKSArIEksIGZhbHNlKTsKKyAgfQorCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBLZXlUICZLZXkpIGNvbnN0IHsKKyAgICB0eXBlbmFtZSBNYXBUeXBlOjpjb25zdF9pdGVyYXRvciBQb3MgPSBNYXAuZmluZChLZXkpOworICAgIHJldHVybiBQb3MgPT0gTWFwLmVuZCgpPyAwIDogMTsKKyAgfQorCisgIGl0ZXJhdG9yIGZpbmQoY29uc3QgS2V5VCAmS2V5KSB7CisgICAgdHlwZW5hbWUgTWFwVHlwZTo6Y29uc3RfaXRlcmF0b3IgUG9zID0gTWFwLmZpbmQoS2V5KTsKKyAgICByZXR1cm4gUG9zID09IE1hcC5lbmQoKT8gVmVjdG9yLmVuZCgpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVmVjdG9yLmJlZ2luKCkgKyBQb3MtPnNlY29uZCk7CisgIH0KKworICBjb25zdF9pdGVyYXRvciBmaW5kKGNvbnN0IEtleVQgJktleSkgY29uc3QgeworICAgIHR5cGVuYW1lIE1hcFR5cGU6OmNvbnN0X2l0ZXJhdG9yIFBvcyA9IE1hcC5maW5kKEtleSk7CisgICAgcmV0dXJuIFBvcyA9PSBNYXAuZW5kKCk/IFZlY3Rvci5lbmQoKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFZlY3Rvci5iZWdpbigpICsgUG9zLT5zZWNvbmQpOworICB9CisKKyAgLy8vIFxicmllZiBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBmcm9tIHRoZSB2ZWN0b3IuCisgIHZvaWQgcG9wX2JhY2soKSB7CisgICAgdHlwZW5hbWUgTWFwVHlwZTo6aXRlcmF0b3IgUG9zID0gTWFwLmZpbmQoVmVjdG9yLmJhY2soKS5maXJzdCk7CisgICAgTWFwLmVyYXNlKFBvcyk7CisgICAgVmVjdG9yLnBvcF9iYWNrKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlbW92ZSB0aGUgZWxlbWVudCBnaXZlbiBieSBJdGVyYXRvci4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBlbGVtZW50IGZvbGxvd2luZyB0aGUgb25lIHdoaWNoIHdhcyByZW1vdmVkLAorICAvLy8gd2hpY2ggbWF5IGJlIGVuZCgpLgorICAvLy8KKyAgLy8vIFxub3RlIFRoaXMgaXMgYSBkZWNlaXZpbmdseSBleHBlbnNpdmUgb3BlcmF0aW9uIChsaW5lYXIgdGltZSkuICBJdCdzCisgIC8vLyB1c3VhbGx5IGJldHRlciB0byB1c2UgXGEgcmVtb3ZlX2lmKCkgaWYgcG9zc2libGUuCisgIHR5cGVuYW1lIFZlY3RvclR5cGU6Oml0ZXJhdG9yIGVyYXNlKHR5cGVuYW1lIFZlY3RvclR5cGU6Oml0ZXJhdG9yIEl0ZXJhdG9yKSB7CisgICAgTWFwLmVyYXNlKEl0ZXJhdG9yLT5maXJzdCk7CisgICAgYXV0byBOZXh0ID0gVmVjdG9yLmVyYXNlKEl0ZXJhdG9yKTsKKyAgICBpZiAoTmV4dCA9PSBWZWN0b3IuZW5kKCkpCisgICAgICByZXR1cm4gTmV4dDsKKworICAgIC8vIFVwZGF0ZSBpbmRpY2VzIGluIHRoZSBtYXAuCisgICAgc2l6ZV90IEluZGV4ID0gTmV4dCAtIFZlY3Rvci5iZWdpbigpOworICAgIGZvciAoYXV0byAmSSA6IE1hcCkgeworICAgICAgYXNzZXJ0KEkuc2Vjb25kICE9IEluZGV4ICYmICJJbmRleCB3YXMgYWxyZWFkeSBlcmFzZWQhIik7CisgICAgICBpZiAoSS5zZWNvbmQgPiBJbmRleCkKKyAgICAgICAgLS1JLnNlY29uZDsKKyAgICB9CisgICAgcmV0dXJuIE5leHQ7CisgIH0KKworICAvLy8gXGJyaWVmIFJlbW92ZSBhbGwgZWxlbWVudHMgd2l0aCB0aGUga2V5IHZhbHVlIEtleS4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgcmVtb3ZlZC4KKyAgc2l6ZV90eXBlIGVyYXNlKGNvbnN0IEtleVQgJktleSkgeworICAgIGF1dG8gSXRlcmF0b3IgPSBmaW5kKEtleSk7CisgICAgaWYgKEl0ZXJhdG9yID09IGVuZCgpKQorICAgICAgcmV0dXJuIDA7CisgICAgZXJhc2UoSXRlcmF0b3IpOworICAgIHJldHVybiAxOworICB9CisKKyAgLy8vIFxicmllZiBSZW1vdmUgdGhlIGVsZW1lbnRzIHRoYXQgbWF0Y2ggdGhlIHByZWRpY2F0ZS4KKyAgLy8vCisgIC8vLyBFcmFzZSBhbGwgZWxlbWVudHMgdGhhdCBtYXRjaCBcYyBQcmVkIGluIGEgc2luZ2xlIHBhc3MuICBUYWtlcyBsaW5lYXIKKyAgLy8vIHRpbWUuCisgIHRlbXBsYXRlIDxjbGFzcyBQcmVkaWNhdGU+IHZvaWQgcmVtb3ZlX2lmKFByZWRpY2F0ZSBQcmVkKTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWx1ZVQsIHR5cGVuYW1lIE1hcFR5cGUsIHR5cGVuYW1lIFZlY3RvclR5cGU+Cit0ZW1wbGF0ZSA8Y2xhc3MgRnVuY3Rpb24+Cit2b2lkIE1hcFZlY3RvcjxLZXlULCBWYWx1ZVQsIE1hcFR5cGUsIFZlY3RvclR5cGU+OjpyZW1vdmVfaWYoRnVuY3Rpb24gUHJlZCkgeworICBhdXRvIE8gPSBWZWN0b3IuYmVnaW4oKTsKKyAgZm9yIChhdXRvIEkgPSBPLCBFID0gVmVjdG9yLmVuZCgpOyBJICE9IEU7ICsrSSkgeworICAgIGlmIChQcmVkKCpJKSkgeworICAgICAgLy8gRXJhc2UgZnJvbSB0aGUgbWFwLgorICAgICAgTWFwLmVyYXNlKEktPmZpcnN0KTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIGlmIChJICE9IE8pIHsKKyAgICAgIC8vIE1vdmUgdGhlIHZhbHVlIGFuZCB1cGRhdGUgdGhlIGluZGV4IGluIHRoZSBtYXAuCisgICAgICAqTyA9IHN0ZDo6bW92ZSgqSSk7CisgICAgICBNYXBbTy0+Zmlyc3RdID0gTyAtIFZlY3Rvci5iZWdpbigpOworICAgIH0KKyAgICArK087CisgIH0KKyAgLy8gRXJhc2UgdHJhaWxpbmcgZW50cmllcyBpbiB0aGUgdmVjdG9yLgorICBWZWN0b3IuZXJhc2UoTywgVmVjdG9yLmVuZCgpKTsKK30KKworLy8vIFxicmllZiBBIE1hcFZlY3RvciB0aGF0IHBlcmZvcm1zIG5vIGFsbG9jYXRpb25zIGlmIHNtYWxsZXIgdGhhbiBhIGNlcnRhaW4KKy8vLyBzaXplLgordGVtcGxhdGUgPHR5cGVuYW1lIEtleVQsIHR5cGVuYW1lIFZhbHVlVCwgdW5zaWduZWQgTj4KK3N0cnVjdCBTbWFsbE1hcFZlY3RvcgorICAgIDogTWFwVmVjdG9yPEtleVQsIFZhbHVlVCwgU21hbGxEZW5zZU1hcDxLZXlULCB1bnNpZ25lZCwgTj4sCisgICAgICAgICAgICAgICAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPEtleVQsIFZhbHVlVD4sIE4+PiB7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfTUFQVkVDVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL05vbmUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL05vbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jN2E5OWM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvTm9uZS5oCkBAIC0wLDAgKzEsMjcgQEAKKy8vPT09LS0gTm9uZS5oIC0gU2ltcGxlIG51bGwgdmFsdWUgZm9yIGltcGxpY2l0IGNvbnN0cnVjdGlvbiAtLS0tLS0qLSBDKysgLSotPS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBwcm92aWRlcyBOb25lLCBhbiBlbnVtZXJhdG9yIGZvciB1c2UgaW4gaW1wbGljaXQgY29uc3RydWN0b3JzCisvLyAgb2YgdmFyaW91cyAodXN1YWxseSB0ZW1wbGF0ZWQpIHR5cGVzIHRvIG1ha2Ugc3VjaCBjb25zdHJ1Y3Rpb24gbW9yZQorLy8gIHRlcnNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfTk9ORV9ICisjZGVmaW5lIExMVk1fQURUX05PTkVfSAorCituYW1lc3BhY2UgbGx2bSB7CisvLy8gXGJyaWVmIEEgc2ltcGxlIG51bGwgb2JqZWN0IHRvIGFsbG93IGltcGxpY2l0IGNvbnN0cnVjdGlvbiBvZiBPcHRpb25hbDxUPgorLy8vIGFuZCBzaW1pbGFyIHR5cGVzIHdpdGhvdXQgaGF2aW5nIHRvIHNwZWxsIG91dCB0aGUgc3BlY2lhbGl6YXRpb24ncyBuYW1lLgorLy8gKGNvbnN0YW50IHZhbHVlIDEgaW4gYW4gYXR0ZW1wdCB0byB3b3JrYXJvdW5kIE1TVkMgYnVpbGQgaXNzdWUuLi4gKQorZW51bSBjbGFzcyBOb25lVHlwZSB7IE5vbmUgPSAxIH07Citjb25zdCBOb25lVHlwZSBOb25lID0gTm9uZVR5cGU6Ok5vbmU7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvT3B0aW9uYWwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL09wdGlvbmFsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUzZTVkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL09wdGlvbmFsLmgKQEAgLTAsMCArMSwzNDYgQEAKKy8vPT09LSBPcHRpb25hbC5oIC0gU2ltcGxlIHZhcmlhbnQgZm9yIHBhc3Npbmcgb3B0aW9uYWwgdmFsdWVzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBwcm92aWRlcyBPcHRpb25hbCwgYSB0ZW1wbGF0ZSBjbGFzcyBtb2RlbGVkIGluIHRoZSBzcGlyaXQgb2YKKy8vICBPQ2FtbCdzICdvcHQnIHZhcmlhbnQuICBUaGUgaWRlYSBpcyB0byBzdHJvbmdseSB0eXBlIHdoZXRoZXIgb3Igbm90CisvLyAgYSB2YWx1ZSBjYW4gYmUgb3B0aW9uYWwuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9PUFRJT05BTF9ICisjZGVmaW5lIExMVk1fQURUX09QVElPTkFMX0gKKworI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxpZ25PZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBvcHRpb25hbF9kZXRhaWwgeworLy8vIFN0b3JhZ2UgZm9yIGFueSB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGJvb2wgSXNQb2RMaWtlPiBzdHJ1Y3QgT3B0aW9uYWxTdG9yYWdlIHsKKyAgQWxpZ25lZENoYXJBcnJheVVuaW9uPFQ+IHN0b3JhZ2U7CisgIGJvb2wgaGFzVmFsID0gZmFsc2U7CisKKyAgT3B0aW9uYWxTdG9yYWdlKCkgPSBkZWZhdWx0OworCisgIE9wdGlvbmFsU3RvcmFnZShjb25zdCBUICZ5KSA6IGhhc1ZhbCh0cnVlKSB7IG5ldyAoc3RvcmFnZS5idWZmZXIpIFQoeSk7IH0KKyAgT3B0aW9uYWxTdG9yYWdlKGNvbnN0IE9wdGlvbmFsU3RvcmFnZSAmTykgOiBoYXNWYWwoTy5oYXNWYWwpIHsKKyAgICBpZiAoaGFzVmFsKQorICAgICAgbmV3IChzdG9yYWdlLmJ1ZmZlcikgVCgqTy5nZXRQb2ludGVyKCkpOworICB9CisgIE9wdGlvbmFsU3RvcmFnZShUICYmeSkgOiBoYXNWYWwodHJ1ZSkgeworICAgIG5ldyAoc3RvcmFnZS5idWZmZXIpIFQoc3RkOjpmb3J3YXJkPFQ+KHkpKTsKKyAgfQorICBPcHRpb25hbFN0b3JhZ2UoT3B0aW9uYWxTdG9yYWdlICYmTykgOiBoYXNWYWwoTy5oYXNWYWwpIHsKKyAgICBpZiAoTy5oYXNWYWwpIHsKKyAgICAgIG5ldyAoc3RvcmFnZS5idWZmZXIpIFQoc3RkOjptb3ZlKCpPLmdldFBvaW50ZXIoKSkpOworICAgIH0KKyAgfQorCisgIE9wdGlvbmFsU3RvcmFnZSAmb3BlcmF0b3I9KFQgJiZ5KSB7CisgICAgaWYgKGhhc1ZhbCkKKyAgICAgICpnZXRQb2ludGVyKCkgPSBzdGQ6Om1vdmUoeSk7CisgICAgZWxzZSB7CisgICAgICBuZXcgKHN0b3JhZ2UuYnVmZmVyKSBUKHN0ZDo6bW92ZSh5KSk7CisgICAgICBoYXNWYWwgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgT3B0aW9uYWxTdG9yYWdlICZvcGVyYXRvcj0oT3B0aW9uYWxTdG9yYWdlICYmTykgeworICAgIGlmICghTy5oYXNWYWwpCisgICAgICByZXNldCgpOworICAgIGVsc2UgeworICAgICAgKnRoaXMgPSBzdGQ6Om1vdmUoKk8uZ2V0UG9pbnRlcigpKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gRklYTUU6IHRoZXNlIGFzc2lnbm1lbnRzICgmIHRoZSBlcXVpdmFsZW50IGNvbnN0IFQmL2NvbnN0IE9wdGlvbmFsJiBjdG9ycykKKyAgLy8gY291bGQgYmUgbWFkZSBtb3JlIGVmZmljaWVudCBieSBwYXNzaW5nIGJ5IHZhbHVlLCBwb3NzaWJseSB1bmlmeWluZyB0aGVtCisgIC8vIHdpdGggdGhlIHJ2YWx1ZSB2ZXJzaW9ucyBhYm92ZSAtIGJ1dCB0aGlzIGNvdWxkIHBsYWNlIGEgZGlmZmVyZW50IHNldCBvZgorICAvLyByZXF1aXJlbWVudHMgKG5vdGFibHk6IHRoZSBleGlzdGVuY2Ugb2YgYSBkZWZhdWx0IGN0b3IpIHdoZW4gaW1wbGVtZW50ZWQKKyAgLy8gaW4gdGhhdCB3YXkuIENhcmVmdWwgU0ZJTkFFIHRvIGF2b2lkIHN1Y2ggcGl0ZmFsbHMgd291bGQgYmUgcmVxdWlyZWQuCisgIE9wdGlvbmFsU3RvcmFnZSAmb3BlcmF0b3I9KGNvbnN0IFQgJnkpIHsKKyAgICBpZiAoaGFzVmFsKQorICAgICAgKmdldFBvaW50ZXIoKSA9IHk7CisgICAgZWxzZSB7CisgICAgICBuZXcgKHN0b3JhZ2UuYnVmZmVyKSBUKHkpOworICAgICAgaGFzVmFsID0gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIE9wdGlvbmFsU3RvcmFnZSAmb3BlcmF0b3I9KGNvbnN0IE9wdGlvbmFsU3RvcmFnZSAmTykgeworICAgIGlmICghTy5oYXNWYWwpCisgICAgICByZXNldCgpOworICAgIGVsc2UKKyAgICAgICp0aGlzID0gKk8uZ2V0UG9pbnRlcigpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIH5PcHRpb25hbFN0b3JhZ2UoKSB7IHJlc2V0KCk7IH0KKworICB2b2lkIHJlc2V0KCkgeworICAgIGlmIChoYXNWYWwpIHsKKyAgICAgICgqZ2V0UG9pbnRlcigpKS5+VCgpOworICAgICAgaGFzVmFsID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgVCAqZ2V0UG9pbnRlcigpIHsKKyAgICBhc3NlcnQoaGFzVmFsKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUICo+KHN0b3JhZ2UuYnVmZmVyKTsKKyAgfQorICBjb25zdCBUICpnZXRQb2ludGVyKCkgY29uc3QgeworICAgIGFzc2VydChoYXNWYWwpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4oc3RvcmFnZS5idWZmZXIpOworICB9Cit9OworCisjaWYgIWRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19jbGFuZ19fKSAvLyBHQ0MgdXAgdG8gR0NDNyBtaXNjb21waWxlcyB0aGlzLgorLy8vIFN0b3JhZ2UgZm9yIHRyaXZpYWxseSBjb3B5YWJsZSB0eXBlcyBvbmx5LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBPcHRpb25hbFN0b3JhZ2U8VCwgdHJ1ZT4geworICBBbGlnbmVkQ2hhckFycmF5VW5pb248VD4gc3RvcmFnZTsKKyAgYm9vbCBoYXNWYWwgPSBmYWxzZTsKKworICBPcHRpb25hbFN0b3JhZ2UoKSA9IGRlZmF1bHQ7CisKKyAgT3B0aW9uYWxTdG9yYWdlKGNvbnN0IFQgJnkpIDogaGFzVmFsKHRydWUpIHsgbmV3IChzdG9yYWdlLmJ1ZmZlcikgVCh5KTsgfQorICBPcHRpb25hbFN0b3JhZ2UgJm9wZXJhdG9yPShjb25zdCBUICZ5KSB7CisgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8VCAqPihzdG9yYWdlLmJ1ZmZlcikgPSB5OworICAgIGhhc1ZhbCA9IHRydWU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdm9pZCByZXNldCgpIHsgaGFzVmFsID0gZmFsc2U7IH0KK307CisjZW5kaWYKK30gLy8gbmFtZXNwYWNlIG9wdGlvbmFsX2RldGFpbAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgT3B0aW9uYWwgeworICBvcHRpb25hbF9kZXRhaWw6Ok9wdGlvbmFsU3RvcmFnZTxULCBpc1BvZExpa2U8VD46OnZhbHVlPiBTdG9yYWdlOworCitwdWJsaWM6CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBUOworCisgIGNvbnN0ZXhwciBPcHRpb25hbCgpIHt9CisgIGNvbnN0ZXhwciBPcHRpb25hbChOb25lVHlwZSkge30KKworICBPcHRpb25hbChjb25zdCBUICZ5KSA6IFN0b3JhZ2UoeSkge30KKyAgT3B0aW9uYWwoY29uc3QgT3B0aW9uYWwgJk8pID0gZGVmYXVsdDsKKworICBPcHRpb25hbChUICYmeSkgOiBTdG9yYWdlKHN0ZDo6Zm9yd2FyZDxUPih5KSkge30KKyAgT3B0aW9uYWwoT3B0aW9uYWwgJiZPKSA9IGRlZmF1bHQ7CisKKyAgT3B0aW9uYWwgJm9wZXJhdG9yPShUICYmeSkgeworICAgIFN0b3JhZ2UgPSBzdGQ6Om1vdmUoeSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIE9wdGlvbmFsICZvcGVyYXRvcj0oT3B0aW9uYWwgJiZPKSA9IGRlZmF1bHQ7CisKKyAgLy8vIENyZWF0ZSBhIG5ldyBvYmplY3QgYnkgY29uc3RydWN0aW5nIGl0IGluIHBsYWNlIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ1R5cGVzPiB2b2lkIGVtcGxhY2UoQXJnVHlwZXMgJiYuLi4gQXJncykgeworICAgIHJlc2V0KCk7CisgICAgU3RvcmFnZS5oYXNWYWwgPSB0cnVlOworICAgIG5ldyAoZ2V0UG9pbnRlcigpKSBUKHN0ZDo6Zm9yd2FyZDxBcmdUeXBlcz4oQXJncykuLi4pOworICB9CisKKyAgc3RhdGljIGlubGluZSBPcHRpb25hbCBjcmVhdGUoY29uc3QgVCAqeSkgeworICAgIHJldHVybiB5ID8gT3B0aW9uYWwoKnkpIDogT3B0aW9uYWwoKTsKKyAgfQorCisgIE9wdGlvbmFsICZvcGVyYXRvcj0oY29uc3QgVCAmeSkgeworICAgIFN0b3JhZ2UgPSB5OworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBPcHRpb25hbCAmb3BlcmF0b3I9KGNvbnN0IE9wdGlvbmFsICZPKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCByZXNldCgpIHsgU3RvcmFnZS5yZXNldCgpOyB9CisKKyAgY29uc3QgVCAqZ2V0UG9pbnRlcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoU3RvcmFnZS5oYXNWYWwpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4oU3RvcmFnZS5zdG9yYWdlLmJ1ZmZlcik7CisgIH0KKyAgVCAqZ2V0UG9pbnRlcigpIHsKKyAgICBhc3NlcnQoU3RvcmFnZS5oYXNWYWwpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFQgKj4oU3RvcmFnZS5zdG9yYWdlLmJ1ZmZlcik7CisgIH0KKyAgY29uc3QgVCAmZ2V0VmFsdWUoKSBjb25zdCBMTFZNX0xWQUxVRV9GVU5DVElPTiB7IHJldHVybiAqZ2V0UG9pbnRlcigpOyB9CisgIFQgJmdldFZhbHVlKCkgTExWTV9MVkFMVUVfRlVOQ1RJT04geyByZXR1cm4gKmdldFBvaW50ZXIoKTsgfQorCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBTdG9yYWdlLmhhc1ZhbDsgfQorICBib29sIGhhc1ZhbHVlKCkgY29uc3QgeyByZXR1cm4gU3RvcmFnZS5oYXNWYWw7IH0KKyAgY29uc3QgVCAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIGdldFBvaW50ZXIoKTsgfQorICBUICpvcGVyYXRvci0+KCkgeyByZXR1cm4gZ2V0UG9pbnRlcigpOyB9CisgIGNvbnN0IFQgJm9wZXJhdG9yKigpIGNvbnN0IExMVk1fTFZBTFVFX0ZVTkNUSU9OIHsgcmV0dXJuICpnZXRQb2ludGVyKCk7IH0KKyAgVCAmb3BlcmF0b3IqKCkgTExWTV9MVkFMVUVfRlVOQ1RJT04geyByZXR1cm4gKmdldFBvaW50ZXIoKTsgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBjb25zdGV4cHIgVCBnZXRWYWx1ZU9yKFUgJiZ2YWx1ZSkgY29uc3QgTExWTV9MVkFMVUVfRlVOQ1RJT04geworICAgIHJldHVybiBoYXNWYWx1ZSgpID8gZ2V0VmFsdWUoKSA6IHN0ZDo6Zm9yd2FyZDxVPih2YWx1ZSk7CisgIH0KKworI2lmIExMVk1fSEFTX1JWQUxVRV9SRUZFUkVOQ0VfVEhJUworICBUICYmZ2V0VmFsdWUoKSAmJiB7IHJldHVybiBzdGQ6Om1vdmUoKmdldFBvaW50ZXIoKSk7IH0KKyAgVCAmJm9wZXJhdG9yKigpICYmIHsgcmV0dXJuIHN0ZDo6bW92ZSgqZ2V0UG9pbnRlcigpKTsgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBUIGdldFZhbHVlT3IoVSAmJnZhbHVlKSAmJiB7CisgICAgcmV0dXJuIGhhc1ZhbHVlKCkgPyBzdGQ6Om1vdmUoZ2V0VmFsdWUoKSkgOiBzdGQ6OmZvcndhcmQ8VT4odmFsdWUpOworICB9CisjZW5kaWYKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNQb2RMaWtlPE9wdGlvbmFsPFQ+PiB7CisgIC8vIEFuIE9wdGlvbmFsPFQ+IGlzIHBvZC1saWtlIGlmIFQgaXMuCisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gaXNQb2RMaWtlPFQ+Ojp2YWx1ZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorYm9vbCBvcGVyYXRvcj09KGNvbnN0IE9wdGlvbmFsPFQ+ICZYLCBjb25zdCBPcHRpb25hbDxVPiAmWSkgeworICBpZiAoWCAmJiBZKQorICAgIHJldHVybiAqWCA9PSAqWTsKKyAgcmV0dXJuIFguaGFzVmFsdWUoKSA9PSBZLmhhc1ZhbHVlKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorYm9vbCBvcGVyYXRvciE9KGNvbnN0IE9wdGlvbmFsPFQ+ICZYLCBjb25zdCBPcHRpb25hbDxVPiAmWSkgeworICByZXR1cm4gIShYID09IFkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK2Jvb2wgb3BlcmF0b3I8KGNvbnN0IE9wdGlvbmFsPFQ+ICZYLCBjb25zdCBPcHRpb25hbDxVPiAmWSkgeworICBpZiAoWCAmJiBZKQorICAgIHJldHVybiAqWCA8ICpZOworICByZXR1cm4gWC5oYXNWYWx1ZSgpIDwgWS5oYXNWYWx1ZSgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK2Jvb2wgb3BlcmF0b3I8PShjb25zdCBPcHRpb25hbDxUPiAmWCwgY29uc3QgT3B0aW9uYWw8VT4gJlkpIHsKKyAgcmV0dXJuICEoWSA8IFgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK2Jvb2wgb3BlcmF0b3I+KGNvbnN0IE9wdGlvbmFsPFQ+ICZYLCBjb25zdCBPcHRpb25hbDxVPiAmWSkgeworICByZXR1cm4gWSA8IFg7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorYm9vbCBvcGVyYXRvcj49KGNvbnN0IE9wdGlvbmFsPFQ+ICZYLCBjb25zdCBPcHRpb25hbDxVPiAmWSkgeworICByZXR1cm4gIShYIDwgWSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Citib29sIG9wZXJhdG9yPT0oY29uc3QgT3B0aW9uYWw8VD4gJlgsIE5vbmVUeXBlKSB7CisgIHJldHVybiAhWDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgb3BlcmF0b3I9PShOb25lVHlwZSwgY29uc3QgT3B0aW9uYWw8VD4gJlgpIHsKKyAgcmV0dXJuIFggPT0gTm9uZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgb3BlcmF0b3IhPShjb25zdCBPcHRpb25hbDxUPiAmWCwgTm9uZVR5cGUpIHsKKyAgcmV0dXJuICEoWCA9PSBOb25lKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2Jvb2wgb3BlcmF0b3IhPShOb25lVHlwZSwgY29uc3QgT3B0aW9uYWw8VD4gJlgpIHsKKyAgcmV0dXJuIFggIT0gTm9uZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgb3BlcmF0b3I8KGNvbnN0IE9wdGlvbmFsPFQ+ICZYLCBOb25lVHlwZSkgeworICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBib29sIG9wZXJhdG9yPChOb25lVHlwZSwgY29uc3QgT3B0aW9uYWw8VD4gJlgpIHsKKyAgcmV0dXJuIFguaGFzVmFsdWUoKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgb3BlcmF0b3I8PShjb25zdCBPcHRpb25hbDxUPiAmWCwgTm9uZVR5cGUpIHsKKyAgcmV0dXJuICEoTm9uZSA8IFgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gYm9vbCBvcGVyYXRvcjw9KE5vbmVUeXBlLCBjb25zdCBPcHRpb25hbDxUPiAmWCkgeworICByZXR1cm4gIShYIDwgTm9uZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBib29sIG9wZXJhdG9yPihjb25zdCBPcHRpb25hbDxUPiAmWCwgTm9uZVR5cGUpIHsKKyAgcmV0dXJuIE5vbmUgPCBYOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gYm9vbCBvcGVyYXRvcj4oTm9uZVR5cGUsIGNvbnN0IE9wdGlvbmFsPFQ+ICZYKSB7CisgIHJldHVybiBYIDwgTm9uZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgb3BlcmF0b3I+PShjb25zdCBPcHRpb25hbDxUPiAmWCwgTm9uZVR5cGUpIHsKKyAgcmV0dXJuIE5vbmUgPD0gWDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgb3BlcmF0b3I+PShOb25lVHlwZSwgY29uc3QgT3B0aW9uYWw8VD4gJlgpIHsKKyAgcmV0dXJuIFggPD0gTm9uZTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgb3BlcmF0b3I9PShjb25zdCBPcHRpb25hbDxUPiAmWCwgY29uc3QgVCAmWSkgeworICByZXR1cm4gWCAmJiAqWCA9PSBZOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gYm9vbCBvcGVyYXRvcj09KGNvbnN0IFQgJlgsIGNvbnN0IE9wdGlvbmFsPFQ+ICZZKSB7CisgIHJldHVybiBZICYmIFggPT0gKlk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBib29sIG9wZXJhdG9yIT0oY29uc3QgT3B0aW9uYWw8VD4gJlgsIGNvbnN0IFQgJlkpIHsKKyAgcmV0dXJuICEoWCA9PSBZKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgb3BlcmF0b3IhPShjb25zdCBUICZYLCBjb25zdCBPcHRpb25hbDxUPiAmWSkgeworICByZXR1cm4gIShYID09IFkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gYm9vbCBvcGVyYXRvcjwoY29uc3QgT3B0aW9uYWw8VD4gJlgsIGNvbnN0IFQgJlkpIHsKKyAgcmV0dXJuICFYIHx8ICpYIDwgWTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgb3BlcmF0b3I8KGNvbnN0IFQgJlgsIGNvbnN0IE9wdGlvbmFsPFQ+ICZZKSB7CisgIHJldHVybiBZICYmIFggPCAqWTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgb3BlcmF0b3I8PShjb25zdCBPcHRpb25hbDxUPiAmWCwgY29uc3QgVCAmWSkgeworICByZXR1cm4gIShZIDwgWCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBib29sIG9wZXJhdG9yPD0oY29uc3QgVCAmWCwgY29uc3QgT3B0aW9uYWw8VD4gJlkpIHsKKyAgcmV0dXJuICEoWSA8IFgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gYm9vbCBvcGVyYXRvcj4oY29uc3QgT3B0aW9uYWw8VD4gJlgsIGNvbnN0IFQgJlkpIHsKKyAgcmV0dXJuIFkgPCBYOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gYm9vbCBvcGVyYXRvcj4oY29uc3QgVCAmWCwgY29uc3QgT3B0aW9uYWw8VD4gJlkpIHsKKyAgcmV0dXJuIFkgPCBYOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gYm9vbCBvcGVyYXRvcj49KGNvbnN0IE9wdGlvbmFsPFQ+ICZYLCBjb25zdCBUICZZKSB7CisgIHJldHVybiAhKFggPCBZKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgb3BlcmF0b3I+PShjb25zdCBUICZYLCBjb25zdCBPcHRpb25hbDxUPiAmWSkgeworICByZXR1cm4gIShYIDwgWSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9PUFRJT05BTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9QYWNrZWRWZWN0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1BhY2tlZFZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk1YWRjMjkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9QYWNrZWRWZWN0b3IuaApAQCAtMCwwICsxLDE1MSBAQAorLy89PT0tIGxsdm0vQURUL1BhY2tlZFZlY3Rvci5oIC0gUGFja2VkIHZhbHVlcyB2ZWN0b3IgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgUGFja2VkVmVjdG9yIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfUEFDS0VEVkVDVE9SX0gKKyNkZWZpbmUgTExWTV9BRFRfUEFDS0VEVkVDVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0JpdFZlY3Rvci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB1bnNpZ25lZCBCaXROdW0sIHR5cGVuYW1lIEJpdFZlY3RvclR5LCBib29sIGlzU2lnbmVkPgorY2xhc3MgUGFja2VkVmVjdG9yQmFzZTsKKworLy8gVGhpcyB3b24ndCBiZSBuZWNlc3NhcnkgaWYgd2UgY2FuIHNwZWNpYWxpemUgbWVtYmVycyB3aXRob3V0IHNwZWNpYWxpemluZworLy8gdGhlIHBhcmVudCB0ZW1wbGF0ZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB1bnNpZ25lZCBCaXROdW0sIHR5cGVuYW1lIEJpdFZlY3RvclR5PgorY2xhc3MgUGFja2VkVmVjdG9yQmFzZTxULCBCaXROdW0sIEJpdFZlY3RvclR5LCBmYWxzZT4geworcHJvdGVjdGVkOgorICBzdGF0aWMgVCBnZXRWYWx1ZShjb25zdCBCaXRWZWN0b3JUeSAmQml0cywgdW5zaWduZWQgSWR4KSB7CisgICAgVCB2YWwgPSBUKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBCaXROdW07ICsraSkKKyAgICAgIHZhbCA9IFQodmFsIHwgKChCaXRzWyhJZHggPDwgKEJpdE51bS0xKSkgKyBpXSA/IDFVTCA6IDBVTCkgPDwgaSkpOworICAgIHJldHVybiB2YWw7CisgIH0KKworICBzdGF0aWMgdm9pZCBzZXRWYWx1ZShCaXRWZWN0b3JUeSAmQml0cywgdW5zaWduZWQgSWR4LCBUIHZhbCkgeworICAgIGFzc2VydCgodmFsID4+IEJpdE51bSkgPT0gMCAmJiAidmFsdWUgaXMgdG9vIGJpZyIpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gQml0TnVtOyArK2kpCisgICAgICBCaXRzWyhJZHggPDwgKEJpdE51bS0xKSkgKyBpXSA9IHZhbCAmIChUKDEpIDw8IGkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdW5zaWduZWQgQml0TnVtLCB0eXBlbmFtZSBCaXRWZWN0b3JUeT4KK2NsYXNzIFBhY2tlZFZlY3RvckJhc2U8VCwgQml0TnVtLCBCaXRWZWN0b3JUeSwgdHJ1ZT4geworcHJvdGVjdGVkOgorICBzdGF0aWMgVCBnZXRWYWx1ZShjb25zdCBCaXRWZWN0b3JUeSAmQml0cywgdW5zaWduZWQgSWR4KSB7CisgICAgVCB2YWwgPSBUKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBCaXROdW0tMTsgKytpKQorICAgICAgdmFsID0gVCh2YWwgfCAoKEJpdHNbKElkeCA8PCAoQml0TnVtLTEpKSArIGldID8gMVVMIDogMFVMKSA8PCBpKSk7CisgICAgaWYgKEJpdHNbKElkeCA8PCAoQml0TnVtLTEpKSArIEJpdE51bS0xXSkKKyAgICAgIHZhbCA9IH52YWw7CisgICAgcmV0dXJuIHZhbDsKKyAgfQorCisgIHN0YXRpYyB2b2lkIHNldFZhbHVlKEJpdFZlY3RvclR5ICZCaXRzLCB1bnNpZ25lZCBJZHgsIFQgdmFsKSB7CisgICAgaWYgKHZhbCA8IDApIHsKKyAgICAgIHZhbCA9IH52YWw7CisgICAgICBCaXRzLnNldCgoSWR4IDw8IChCaXROdW0tMSkpICsgQml0TnVtLTEpOworICAgIH0KKyAgICBhc3NlcnQoKHZhbCA+PiAoQml0TnVtLTEpKSA9PSAwICYmICJ2YWx1ZSBpcyB0b28gYmlnIik7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBCaXROdW0tMTsgKytpKQorICAgICAgQml0c1soSWR4IDw8IChCaXROdW0tMSkpICsgaV0gPSB2YWwgJiAoVCgxKSA8PCBpKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBTdG9yZSBhIHZlY3RvciBvZiB2YWx1ZXMgdXNpbmcgYSBzcGVjaWZpYyBudW1iZXIgb2YgYml0cyBmb3IgZWFjaAorLy8vIHZhbHVlLiBCb3RoIHNpZ25lZCBhbmQgdW5zaWduZWQgdHlwZXMgY2FuIGJlIHVzZWQsIGUuZworLy8vIEBjb2RlCisvLy8gICBQYWNrZWRWZWN0b3I8c2lnbmVkLCAyPiB2ZWM7CisvLy8gQGVuZGNvZGUKKy8vLyB3aWxsIGNyZWF0ZSBhIHZlY3RvciBhY2NlcHRpbmcgdmFsdWVzIC0yLCAtMSwgMCwgMS4gQW55IG90aGVyIHZhbHVlIHdpbGwgaGl0CisvLy8gYW4gYXNzZXJ0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHVuc2lnbmVkIEJpdE51bSwgdHlwZW5hbWUgQml0VmVjdG9yVHkgPSBCaXRWZWN0b3I+CitjbGFzcyBQYWNrZWRWZWN0b3IgOiBwdWJsaWMgUGFja2VkVmVjdG9yQmFzZTxULCBCaXROdW0sIEJpdFZlY3RvclR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zaWduZWQ+IHsKKyAgQml0VmVjdG9yVHkgQml0czsKKyAgdXNpbmcgYmFzZSA9IFBhY2tlZFZlY3RvckJhc2U8VCwgQml0TnVtLCBCaXRWZWN0b3JUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkPjsKKworcHVibGljOgorICBjbGFzcyByZWZlcmVuY2UgeworICAgIFBhY2tlZFZlY3RvciAmVmVjOworICAgIGNvbnN0IHVuc2lnbmVkIElkeDsKKworICBwdWJsaWM6CisgICAgcmVmZXJlbmNlKCkgPSBkZWxldGU7CisgICAgcmVmZXJlbmNlKFBhY2tlZFZlY3RvciAmdmVjLCB1bnNpZ25lZCBpZHgpIDogVmVjKHZlYyksIElkeChpZHgpIHt9CisKKyAgICByZWZlcmVuY2UgJm9wZXJhdG9yPShUIHZhbCkgeworICAgICAgVmVjLnNldFZhbHVlKFZlYy5CaXRzLCBJZHgsIHZhbCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BlcmF0b3IgVCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBWZWMuZ2V0VmFsdWUoVmVjLkJpdHMsIElkeCk7CisgICAgfQorICB9OworCisgIFBhY2tlZFZlY3RvcigpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgUGFja2VkVmVjdG9yKHVuc2lnbmVkIHNpemUpIDogQml0cyhzaXplIDw8IChCaXROdW0tMSkpIHt9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEJpdHMuZW1wdHkoKTsgfQorCisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBCaXRzLnNpemUoKSA+PiAoQml0TnVtIC0gMSk7IH0KKworICB2b2lkIGNsZWFyKCkgeyBCaXRzLmNsZWFyKCk7IH0KKworICB2b2lkIHJlc2l6ZSh1bnNpZ25lZCBOKSB7IEJpdHMucmVzaXplKE4gPDwgKEJpdE51bSAtIDEpKTsgfQorCisgIHZvaWQgcmVzZXJ2ZSh1bnNpZ25lZCBOKSB7IEJpdHMucmVzZXJ2ZShOIDw8IChCaXROdW0tMSkpOyB9CisKKyAgUGFja2VkVmVjdG9yICZyZXNldCgpIHsKKyAgICBCaXRzLnJlc2V0KCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdm9pZCBwdXNoX2JhY2soVCB2YWwpIHsKKyAgICByZXNpemUoc2l6ZSgpKzEpOworICAgICgqdGhpcylbc2l6ZSgpLTFdID0gdmFsOworICB9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yW10odW5zaWduZWQgSWR4KSB7CisgICAgcmV0dXJuIHJlZmVyZW5jZSgqdGhpcywgSWR4KTsKKyAgfQorCisgIFQgb3BlcmF0b3JbXSh1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gYmFzZTo6Z2V0VmFsdWUoQml0cywgSWR4KTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQYWNrZWRWZWN0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiBCaXRzID09IFJIUy5CaXRzOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFBhY2tlZFZlY3RvciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpdHMgIT0gUkhTLkJpdHM7CisgIH0KKworICBQYWNrZWRWZWN0b3IgJm9wZXJhdG9yfD0oY29uc3QgUGFja2VkVmVjdG9yICZSSFMpIHsKKyAgICBCaXRzIHw9IFJIUy5CaXRzOworICAgIHJldHVybiAqdGhpczsKKyAgfQorfTsKKworLy8gTGVhdmUgQml0TnVtPTAgdW5kZWZpbmVkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFBhY2tlZFZlY3RvcjxULCAwPjsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX1BBQ0tFRFZFQ1RPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Qb2ludGVyRW1iZWRkZWRJbnQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1BvaW50ZXJFbWJlZGRlZEludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNGUxMDQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Qb2ludGVyRW1iZWRkZWRJbnQuaApAQCAtMCwwICsxLDEyMCBAQAorLy89PT0tIGxsdm0vQURUL1BvaW50ZXJFbWJlZGRlZEludC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9QT0lOVEVSRU1CRURERURJTlRfSAorI2RlZmluZSBMTFZNX0FEVF9QT0lOVEVSRU1CRURERURJTlRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXBJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUG9pbnRlckxpa2VUeXBlVHJhaXRzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFV0aWxpdHkgdG8gZW1iZWQgYW4gaW50ZWdlciBpbnRvIGEgcG9pbnRlci1saWtlIHR5cGUuIFRoaXMgaXMgc3BlY2lmaWNhbGx5CisvLy8gaW50ZW5kZWQgdG8gYWxsb3cgZW1iZWRkaW5nIGludGVnZXJzIHdoZXJlIGZld2VyIGJpdHMgYXJlIHJlcXVpcmVkIHRoYW4KKy8vLyBleGlzdCBpbiBhIHBvaW50ZXIsIGFuZCB0aGUgaW50ZWdlciBjYW4gcGFydGljaXBhdGUgaW4gYWJzdHJhY3Rpb25zIGFsb25nCisvLy8gc2lkZSBvdGhlciBwb2ludGVyLWxpa2UgdHlwZXMuIEZvciBleGFtcGxlIGl0IGNhbiBiZSBwbGFjZWQgaW50byBhIFxjCisvLy8gUG9pbnRlclN1bVR5cGUgb3IgXGMgUG9pbnRlclVuaW9uLgorLy8vCisvLy8gTm90ZSB0aGF0IG11Y2ggbGlrZSBwb2ludGVycywgYW4gaW50ZWdlciB2YWx1ZSBvZiB6ZXJvIGhhcyBzcGVjaWFsIHV0aWxpdHkKKy8vLyBkdWUgdG8gYm9vbGVhbiBjb252ZXJzaW9ucy4gRm9yIGV4YW1wbGUsIGEgbm9uLW51bGwgdmFsdWUgY2FuIGJlIHRlc3RlZCBmb3IKKy8vLyBpbiB0aGUgYWJvdmUgYWJzdHJhY3Rpb25zIHdpdGhvdXQgdGVzdGluZyB0aGUgcGFydGljdWxhciBhY3RpdmUgbWVtYmVyLgorLy8vIEFsc28sIHRoZSBkZWZhdWx0IGNvbnN0cnVjdGVkIHZhbHVlIHplcm8gaW5pdGlhbGl6ZXMgdGhlIGludGVnZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW50VCwgaW50IEJpdHMgPSBzaXplb2YoSW50VCkgKiBDSEFSX0JJVD4KK2NsYXNzIFBvaW50ZXJFbWJlZGRlZEludCB7CisgIHVpbnRwdHJfdCBWYWx1ZSA9IDA7CisKKyAgLy8gTm90ZTogVGhpcyAnPCcgaXMgY29ycmVjdDsgdXNpbmcgJzw9JyB3b3VsZCByZXN1bHQgaW4gc29tZSBzaGlmdHMKKyAgLy8gb3ZlcmZsb3dpbmcgdGhlaXIgc3RvcmFnZSB0eXBlcy4KKyAgc3RhdGljX2Fzc2VydChCaXRzIDwgc2l6ZW9mKHVpbnRwdHJfdCkgKiBDSEFSX0JJVCwKKyAgICAgICAgICAgICAgICAiQ2Fubm90IGVtYmVkIG1vcmUgYml0cyB0aGFuIHdlIGhhdmUgaW4gYSBwb2ludGVyISIpOworCisgIGVudW0gOiB1aW50cHRyX3QgeworICAgIC8vIFdlIHNoaWZ0IGFzIG1hbnkgemVyb3MgaW50byB0aGUgdmFsdWUgYXMgd2UgY2FuIHdoaWxlIHByZXNlcnZpbmcgdGhlCisgICAgLy8gbnVtYmVyIG9mIGJpdHMgZGVzaXJlZCBmb3IgdGhlIGludGVnZXIuCisgICAgU2hpZnQgPSBzaXplb2YodWludHB0cl90KSAqIENIQVJfQklUIC0gQml0cywKKworICAgIC8vIFdlIGFsc28gd2FudCB0byBiZSBhYmxlIHRvIG1hc2sgb3V0IHRoZSBwcmVzZXJ2ZWQgYml0cyBmb3IgYXNzZXJ0cy4KKyAgICBNYXNrID0gc3RhdGljX2Nhc3Q8dWludHB0cl90PigtMSkgPDwgQml0cworICB9OworCisgIHN0cnVjdCBSYXdWYWx1ZVRhZyB7CisgICAgZXhwbGljaXQgUmF3VmFsdWVUYWcoKSA9IGRlZmF1bHQ7CisgIH07CisKKyAgZnJpZW5kIHN0cnVjdCBQb2ludGVyTGlrZVR5cGVUcmFpdHM8UG9pbnRlckVtYmVkZGVkSW50PjsKKworICBleHBsaWNpdCBQb2ludGVyRW1iZWRkZWRJbnQodWludHB0cl90IFZhbHVlLCBSYXdWYWx1ZVRhZykgOiBWYWx1ZShWYWx1ZSkge30KKworcHVibGljOgorICBQb2ludGVyRW1iZWRkZWRJbnQoKSA9IGRlZmF1bHQ7CisKKyAgUG9pbnRlckVtYmVkZGVkSW50KEludFQgSSkgeyAqdGhpcyA9IEk7IH0KKworICBQb2ludGVyRW1iZWRkZWRJbnQgJm9wZXJhdG9yPShJbnRUIEkpIHsKKyAgICBhc3NlcnQoKHN0ZDo6aXNfc2lnbmVkPEludFQ+Ojp2YWx1ZSA/IGlzSW50PEJpdHM+KEkpIDogaXNVSW50PEJpdHM+KEkpKSAmJgorICAgICAgICAgICAiSW50ZWdlciBoYXMgYml0cyBvdXRzaWRlIHRob3NlIHByZXNlcnZlZCEiKTsKKyAgICBWYWx1ZSA9IHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oSSkgPDwgU2hpZnQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gTm90ZSB0aGF0IHRoaXMgaW1wbGljaXQgY29udmVyc2lvbiBhZGRpdGlvbmFsbHkgYWxsb3dzIGFsbCBvZiB0aGUgYmFzaWMKKyAgLy8gY29tcGFyaXNvbiBvcGVyYXRvcnMgdG8gd29yayB0cmFuc3BhcmVudGx5LCBldGMuCisgIG9wZXJhdG9yIEludFQoKSBjb25zdCB7CisgICAgaWYgKHN0ZDo6aXNfc2lnbmVkPEludFQ+Ojp2YWx1ZSkKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxJbnRUPihzdGF0aWNfY2FzdDxpbnRwdHJfdD4oVmFsdWUpID4+IFNoaWZ0KTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SW50VD4oVmFsdWUgPj4gU2hpZnQpOworICB9Cit9OworCisvLyBQcm92aWRlIHBvaW50ZXIgbGlrZSB0cmFpdHMgdG8gc3VwcG9ydCB1c2Ugd2l0aCBwb2ludGVyIHVuaW9ucyBhbmQgc3VtCisvLyB0eXBlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbnRULCBpbnQgQml0cz4KK3N0cnVjdCBQb2ludGVyTGlrZVR5cGVUcmFpdHM8UG9pbnRlckVtYmVkZGVkSW50PEludFQsIEJpdHM+PiB7CisgIHVzaW5nIFQgPSBQb2ludGVyRW1iZWRkZWRJbnQ8SW50VCwgQml0cz47CisKKyAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKGNvbnN0IFQgJlApIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KFAuVmFsdWUpOworICB9CisKKyAgc3RhdGljIGlubGluZSBUIGdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7CisgICAgcmV0dXJuIFQocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFApLCB0eXBlbmFtZSBUOjpSYXdWYWx1ZVRhZygpKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgVCBnZXRGcm9tVm9pZFBvaW50ZXIoY29uc3Qgdm9pZCAqUCkgeworICAgIHJldHVybiBUKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihQKSwgdHlwZW5hbWUgVDo6UmF3VmFsdWVUYWcoKSk7CisgIH0KKworICBlbnVtIHsgTnVtTG93Qml0c0F2YWlsYWJsZSA9IFQ6OlNoaWZ0IH07Cit9OworCisvLyBUZWFjaCBEZW5zZU1hcCBob3cgdG8gdXNlIFBvaW50ZXJFbWJlZGRlZEludCBvYmplY3RzIGFzIGtleXMgaWYgdGhlIEludCB0eXBlCisvLyBpdHNlbGYgY2FuIGJlIGEga2V5LgordGVtcGxhdGUgPHR5cGVuYW1lIEludFQsIGludCBCaXRzPgorc3RydWN0IERlbnNlTWFwSW5mbzxQb2ludGVyRW1iZWRkZWRJbnQ8SW50VCwgQml0cz4+IHsKKyAgdXNpbmcgVCA9IFBvaW50ZXJFbWJlZGRlZEludDxJbnRULCBCaXRzPjsKKyAgdXNpbmcgSW50SW5mbyA9IERlbnNlTWFwSW5mbzxJbnRUPjsKKworICBzdGF0aWMgaW5saW5lIFQgZ2V0RW1wdHlLZXkoKSB7IHJldHVybiBJbnRJbmZvOjpnZXRFbXB0eUtleSgpOyB9CisgIHN0YXRpYyBpbmxpbmUgVCBnZXRUb21ic3RvbmVLZXkoKSB7IHJldHVybiBJbnRJbmZvOjpnZXRUb21ic3RvbmVLZXkoKTsgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgVCAmQXJnKSB7CisgICAgcmV0dXJuIEludEluZm86OmdldEhhc2hWYWx1ZShBcmcpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBUICZMSFMsIGNvbnN0IFQgJlJIUykgeyByZXR1cm4gTEhTID09IFJIUzsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX1BPSU5URVJFTUJFRERFRElOVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvUG9pbnRlckludFBhaXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODRkMDUxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvUG9pbnRlckludFBhaXIuaApAQCAtMCwwICsxLDIzMyBAQAorLy89PT0tIGxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmggLSBQYWlyIGZvciBwb2ludGVyIGFuZCBpbnQgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgUG9pbnRlckludFBhaXIgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9QT0lOVEVSSU5UUEFJUl9ICisjZGVmaW5lIExMVk1fQURUX1BPSU5URVJJTlRQQUlSX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Qb2ludGVyTGlrZVR5cGVUcmFpdHMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgRGVuc2VNYXBJbmZvOwordGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50ZXJULCB1bnNpZ25lZCBJbnRCaXRzLCB0eXBlbmFtZSBQdHJUcmFpdHM+CitzdHJ1Y3QgUG9pbnRlckludFBhaXJJbmZvOworCisvLy8gUG9pbnRlckludFBhaXIgLSBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBwYWlyIG9mIGEgcG9pbnRlciBhbmQgc21hbGwKKy8vLyBpbnRlZ2VyLiAgSXQgaXMgZGVzaWduZWQgdG8gcmVwcmVzZW50IHRoaXMgaW4gdGhlIHNwYWNlIHJlcXVpcmVkIGJ5IG9uZQorLy8vIHBvaW50ZXIgYnkgYml0bWFuZ2xpbmcgdGhlIGludGVnZXIgaW50byB0aGUgbG93IHBhcnQgb2YgdGhlIHBvaW50ZXIuICBUaGlzCisvLy8gY2FuIG9ubHkgYmUgZG9uZSBmb3Igc21hbGwgaW50ZWdlcnM6IHR5cGljYWxseSB1cCB0byAzIGJpdHMsIGJ1dCBpdCBkZXBlbmRzCisvLy8gb24gdGhlIG51bWJlciBvZiBiaXRzIGF2YWlsYWJsZSBhY2NvcmRpbmcgdG8gUG9pbnRlckxpa2VUeXBlVHJhaXRzIGZvciB0aGUKKy8vLyB0eXBlLgorLy8vCisvLy8gTm90ZSB0aGF0IFBvaW50ZXJJbnRQYWlyIGFsd2F5cyBwdXRzIHRoZSBJbnRWYWwgcGFydCBpbiB0aGUgaGlnaGVzdCBiaXRzCisvLy8gcG9zc2libGUuICBGb3IgZXhhbXBsZSwgUG9pbnRlckludFBhaXI8dm9pZCosIDEsIGJvb2w+IHdpbGwgcHV0IHRoZSBiaXQgZm9yCisvLy8gdGhlIGJvb2wgaW50byBiaXQgIzIsIG5vdCBiaXQgIzAsIHdoaWNoIGFsbG93cyB0aGUgbG93IHR3byBiaXRzIHRvIGJlIHVzZWQKKy8vLyBmb3Igc29tZXRoaW5nIGVsc2UuICBGb3IgZXhhbXBsZSwgdGhpcyBhbGxvd3M6CisvLy8gICBQb2ludGVySW50UGFpcjxQb2ludGVySW50UGFpcjx2b2lkKiwgMSwgYm9vbD4sIDEsIGJvb2w+CisvLy8gLi4uIGFuZCB0aGUgdHdvIGJvb2xzIHdpbGwgbGFuZCBpbiBkaWZmZXJlbnQgYml0cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQb2ludGVyVHksIHVuc2lnbmVkIEludEJpdHMsIHR5cGVuYW1lIEludFR5cGUgPSB1bnNpZ25lZCwKKyAgICAgICAgICB0eXBlbmFtZSBQdHJUcmFpdHMgPSBQb2ludGVyTGlrZVR5cGVUcmFpdHM8UG9pbnRlclR5PiwKKyAgICAgICAgICB0eXBlbmFtZSBJbmZvID0gUG9pbnRlckludFBhaXJJbmZvPFBvaW50ZXJUeSwgSW50Qml0cywgUHRyVHJhaXRzPj4KK2NsYXNzIFBvaW50ZXJJbnRQYWlyIHsKKyAgaW50cHRyX3QgVmFsdWUgPSAwOworCitwdWJsaWM6CisgIGNvbnN0ZXhwciBQb2ludGVySW50UGFpcigpID0gZGVmYXVsdDsKKworICBQb2ludGVySW50UGFpcihQb2ludGVyVHkgUHRyVmFsLCBJbnRUeXBlIEludFZhbCkgeworICAgIHNldFBvaW50ZXJBbmRJbnQoUHRyVmFsLCBJbnRWYWwpOworICB9CisKKyAgZXhwbGljaXQgUG9pbnRlckludFBhaXIoUG9pbnRlclR5IFB0clZhbCkgeyBpbml0V2l0aFBvaW50ZXIoUHRyVmFsKTsgfQorCisgIFBvaW50ZXJUeSBnZXRQb2ludGVyKCkgY29uc3QgeyByZXR1cm4gSW5mbzo6Z2V0UG9pbnRlcihWYWx1ZSk7IH0KKworICBJbnRUeXBlIGdldEludCgpIGNvbnN0IHsgcmV0dXJuIChJbnRUeXBlKUluZm86OmdldEludChWYWx1ZSk7IH0KKworICB2b2lkIHNldFBvaW50ZXIoUG9pbnRlclR5IFB0clZhbCkgeworICAgIFZhbHVlID0gSW5mbzo6dXBkYXRlUG9pbnRlcihWYWx1ZSwgUHRyVmFsKTsKKyAgfQorCisgIHZvaWQgc2V0SW50KEludFR5cGUgSW50VmFsKSB7CisgICAgVmFsdWUgPSBJbmZvOjp1cGRhdGVJbnQoVmFsdWUsIHN0YXRpY19jYXN0PGludHB0cl90PihJbnRWYWwpKTsKKyAgfQorCisgIHZvaWQgaW5pdFdpdGhQb2ludGVyKFBvaW50ZXJUeSBQdHJWYWwpIHsKKyAgICBWYWx1ZSA9IEluZm86OnVwZGF0ZVBvaW50ZXIoMCwgUHRyVmFsKTsKKyAgfQorCisgIHZvaWQgc2V0UG9pbnRlckFuZEludChQb2ludGVyVHkgUHRyVmFsLCBJbnRUeXBlIEludFZhbCkgeworICAgIFZhbHVlID0gSW5mbzo6dXBkYXRlSW50KEluZm86OnVwZGF0ZVBvaW50ZXIoMCwgUHRyVmFsKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnRwdHJfdD4oSW50VmFsKSk7CisgIH0KKworICBQb2ludGVyVHkgY29uc3QgKmdldEFkZHJPZlBvaW50ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8UG9pbnRlckludFBhaXIgKj4odGhpcyktPmdldEFkZHJPZlBvaW50ZXIoKTsKKyAgfQorCisgIFBvaW50ZXJUeSAqZ2V0QWRkck9mUG9pbnRlcigpIHsKKyAgICBhc3NlcnQoVmFsdWUgPT0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oZ2V0UG9pbnRlcigpKSAmJgorICAgICAgICAgICAiQ2FuIG9ubHkgcmV0dXJuIHRoZSBhZGRyZXNzIGlmIEludEJpdHMgaXMgY2xlYXJlZCBhbmQgIgorICAgICAgICAgICAiUHRyVHJhaXRzIGRvZXNuJ3QgY2hhbmdlIHRoZSBwb2ludGVyIik7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UG9pbnRlclR5ICo+KCZWYWx1ZSk7CisgIH0KKworICB2b2lkICpnZXRPcGFxdWVWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihWYWx1ZSk7IH0KKworICB2b2lkIHNldEZyb21PcGFxdWVWYWx1ZSh2b2lkICpWYWwpIHsKKyAgICBWYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KFZhbCk7CisgIH0KKworICBzdGF0aWMgUG9pbnRlckludFBhaXIgZ2V0RnJvbU9wYXF1ZVZhbHVlKHZvaWQgKlYpIHsKKyAgICBQb2ludGVySW50UGFpciBQOworICAgIFAuc2V0RnJvbU9wYXF1ZVZhbHVlKFYpOworICAgIHJldHVybiBQOworICB9CisKKyAgLy8gQWxsb3cgUG9pbnRlckludFBhaXJzIHRvIGJlIGNyZWF0ZWQgZnJvbSBjb25zdCB2b2lkICogaWYgYW5kIG9ubHkgaWYgdGhlCisgIC8vIHBvaW50ZXIgdHlwZSBjb3VsZCBiZSBjcmVhdGVkIGZyb20gYSBjb25zdCB2b2lkICouCisgIHN0YXRpYyBQb2ludGVySW50UGFpciBnZXRGcm9tT3BhcXVlVmFsdWUoY29uc3Qgdm9pZCAqVikgeworICAgICh2b2lkKVB0clRyYWl0czo6Z2V0RnJvbVZvaWRQb2ludGVyKFYpOworICAgIHJldHVybiBnZXRGcm9tT3BhcXVlVmFsdWUoY29uc3RfY2FzdDx2b2lkICo+KFYpKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQb2ludGVySW50UGFpciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlID09IFJIUy5WYWx1ZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBQb2ludGVySW50UGFpciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlICE9IFJIUy5WYWx1ZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFBvaW50ZXJJbnRQYWlyICZSSFMpIGNvbnN0IHsgcmV0dXJuIFZhbHVlIDwgUkhTLlZhbHVlOyB9CisgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IFBvaW50ZXJJbnRQYWlyICZSSFMpIGNvbnN0IHsgcmV0dXJuIFZhbHVlID4gUkhTLlZhbHVlOyB9CisKKyAgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IFBvaW50ZXJJbnRQYWlyICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWUgPD0gUkhTLlZhbHVlOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFBvaW50ZXJJbnRQYWlyICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWUgPj0gUkhTLlZhbHVlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRlclQsIHVuc2lnbmVkIEludEJpdHMsIHR5cGVuYW1lIFB0clRyYWl0cz4KK3N0cnVjdCBQb2ludGVySW50UGFpckluZm8geworICBzdGF0aWNfYXNzZXJ0KFB0clRyYWl0czo6TnVtTG93Qml0c0F2YWlsYWJsZSA8CisgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludHB0cl90Pjo6ZGlnaXRzLAorICAgICAgICAgICAgICAgICJjYW5ub3QgdXNlIGEgcG9pbnRlciB0eXBlIHRoYXQgaGFzIGFsbCBiaXRzIGZyZWUiKTsKKyAgc3RhdGljX2Fzc2VydChJbnRCaXRzIDw9IFB0clRyYWl0czo6TnVtTG93Qml0c0F2YWlsYWJsZSwKKyAgICAgICAgICAgICAgICAiUG9pbnRlckludFBhaXIgd2l0aCBpbnRlZ2VyIHNpemUgdG9vIGxhcmdlIGZvciBwb2ludGVyIik7CisgIGVudW0gOiB1aW50cHRyX3QgeworICAgIC8vLyBQb2ludGVyQml0TWFzayAtIFRoZSBiaXRzIHRoYXQgY29tZSBmcm9tIHRoZSBwb2ludGVyLgorICAgIFBvaW50ZXJCaXRNYXNrID0KKyAgICAgICAgfih1aW50cHRyX3QpKCgoaW50cHRyX3QpMSA8PCBQdHJUcmFpdHM6Ok51bUxvd0JpdHNBdmFpbGFibGUpIC0gMSksCisKKyAgICAvLy8gSW50U2hpZnQgLSBUaGUgbnVtYmVyIG9mIGxvdyBiaXRzIHRoYXQgd2UgcmVzZXJ2ZSBmb3Igb3RoZXIgdXNlcywgYW5kCisgICAgLy8vIGtlZXAgemVyby4KKyAgICBJbnRTaGlmdCA9ICh1aW50cHRyX3QpUHRyVHJhaXRzOjpOdW1Mb3dCaXRzQXZhaWxhYmxlIC0gSW50Qml0cywKKworICAgIC8vLyBJbnRNYXNrIC0gVGhpcyBpcyB0aGUgdW5zaGlmdGVkIG1hc2sgZm9yIHZhbGlkIGJpdHMgb2YgdGhlIGludCB0eXBlLgorICAgIEludE1hc2sgPSAodWludHB0cl90KSgoKGludHB0cl90KTEgPDwgSW50Qml0cykgLSAxKSwKKworICAgIC8vIFNoaWZ0ZWRJbnRNYXNrIC0gVGhpcyBpcyB0aGUgYml0cyBmb3IgdGhlIGludGVnZXIgc2hpZnRlZCBpbiBwbGFjZS4KKyAgICBTaGlmdGVkSW50TWFzayA9ICh1aW50cHRyX3QpKEludE1hc2sgPDwgSW50U2hpZnQpCisgIH07CisKKyAgc3RhdGljIFBvaW50ZXJUIGdldFBvaW50ZXIoaW50cHRyX3QgVmFsdWUpIHsKKyAgICByZXR1cm4gUHRyVHJhaXRzOjpnZXRGcm9tVm9pZFBvaW50ZXIoCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihWYWx1ZSAmIFBvaW50ZXJCaXRNYXNrKSk7CisgIH0KKworICBzdGF0aWMgaW50cHRyX3QgZ2V0SW50KGludHB0cl90IFZhbHVlKSB7CisgICAgcmV0dXJuIChWYWx1ZSA+PiBJbnRTaGlmdCkgJiBJbnRNYXNrOworICB9CisKKyAgc3RhdGljIGludHB0cl90IHVwZGF0ZVBvaW50ZXIoaW50cHRyX3QgT3JpZ1ZhbHVlLCBQb2ludGVyVCBQdHIpIHsKKyAgICBpbnRwdHJfdCBQdHJXb3JkID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oUHRyVHJhaXRzOjpnZXRBc1ZvaWRQb2ludGVyKFB0cikpOworICAgIGFzc2VydCgoUHRyV29yZCAmIH5Qb2ludGVyQml0TWFzaykgPT0gMCAmJgorICAgICAgICAgICAiUG9pbnRlciBpcyBub3Qgc3VmZmljaWVudGx5IGFsaWduZWQiKTsKKyAgICAvLyBQcmVzZXJ2ZSBhbGwgbG93IGJpdHMsIGp1c3QgdXBkYXRlIHRoZSBwb2ludGVyLgorICAgIHJldHVybiBQdHJXb3JkIHwgKE9yaWdWYWx1ZSAmIH5Qb2ludGVyQml0TWFzayk7CisgIH0KKworICBzdGF0aWMgaW50cHRyX3QgdXBkYXRlSW50KGludHB0cl90IE9yaWdWYWx1ZSwgaW50cHRyX3QgSW50KSB7CisgICAgaW50cHRyX3QgSW50V29yZCA9IHN0YXRpY19jYXN0PGludHB0cl90PihJbnQpOworICAgIGFzc2VydCgoSW50V29yZCAmIH5JbnRNYXNrKSA9PSAwICYmICJJbnRlZ2VyIHRvbyBsYXJnZSBmb3IgZmllbGQiKTsKKworICAgIC8vIFByZXNlcnZlIGFsbCBiaXRzIG90aGVyIHRoYW4gdGhlIG9uZXMgd2UgYXJlIHVwZGF0aW5nLgorICAgIHJldHVybiAoT3JpZ1ZhbHVlICYgflNoaWZ0ZWRJbnRNYXNrKSB8IEludFdvcmQgPDwgSW50U2hpZnQ7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNQb2RMaWtlOwordGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50ZXJUeSwgdW5zaWduZWQgSW50Qml0cywgdHlwZW5hbWUgSW50VHlwZT4KK3N0cnVjdCBpc1BvZExpa2U8UG9pbnRlckludFBhaXI8UG9pbnRlclR5LCBJbnRCaXRzLCBJbnRUeXBlPj4geworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OworCisvLyBQcm92aWRlIHNwZWNpYWxpemF0aW9uIG9mIERlbnNlTWFwSW5mbyBmb3IgUG9pbnRlckludFBhaXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRlclR5LCB1bnNpZ25lZCBJbnRCaXRzLCB0eXBlbmFtZSBJbnRUeXBlPgorc3RydWN0IERlbnNlTWFwSW5mbzxQb2ludGVySW50UGFpcjxQb2ludGVyVHksIEludEJpdHMsIEludFR5cGU+PiB7CisgIHVzaW5nIFR5ID0gUG9pbnRlckludFBhaXI8UG9pbnRlclR5LCBJbnRCaXRzLCBJbnRUeXBlPjsKKworICBzdGF0aWMgVHkgZ2V0RW1wdHlLZXkoKSB7CisgICAgdWludHB0cl90IFZhbCA9IHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oLTEpOworICAgIFZhbCA8PD0gUG9pbnRlckxpa2VUeXBlVHJhaXRzPFR5Pjo6TnVtTG93Qml0c0F2YWlsYWJsZTsKKyAgICByZXR1cm4gVHk6OmdldEZyb21PcGFxdWVWYWx1ZShyZWludGVycHJldF9jYXN0PHZvaWQgKj4oVmFsKSk7CisgIH0KKworICBzdGF0aWMgVHkgZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHVpbnRwdHJfdCBWYWwgPSBzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KC0yKTsKKyAgICBWYWwgPDw9IFBvaW50ZXJMaWtlVHlwZVRyYWl0czxQb2ludGVyVHk+OjpOdW1Mb3dCaXRzQXZhaWxhYmxlOworICAgIHJldHVybiBUeTo6Z2V0RnJvbU9wYXF1ZVZhbHVlKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihWYWwpKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoVHkgVikgeworICAgIHVpbnRwdHJfdCBJViA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihWLmdldE9wYXF1ZVZhbHVlKCkpOworICAgIHJldHVybiB1bnNpZ25lZChJVikgXiB1bnNpZ25lZChJViA+PiA5KTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgVHkgJkxIUywgY29uc3QgVHkgJlJIUykgeyByZXR1cm4gTEhTID09IFJIUzsgfQorfTsKKworLy8gVGVhY2ggU21hbGxQdHJTZXQgdGhhdCBQb2ludGVySW50UGFpciBpcyAiYmFzaWNhbGx5IGEgcG9pbnRlciIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUG9pbnRlclR5LCB1bnNpZ25lZCBJbnRCaXRzLCB0eXBlbmFtZSBJbnRUeXBlLAorICAgICAgICAgIHR5cGVuYW1lIFB0clRyYWl0cz4KK3N0cnVjdCBQb2ludGVyTGlrZVR5cGVUcmFpdHM8CisgICAgUG9pbnRlckludFBhaXI8UG9pbnRlclR5LCBJbnRCaXRzLCBJbnRUeXBlLCBQdHJUcmFpdHM+PiB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCAqCisgIGdldEFzVm9pZFBvaW50ZXIoY29uc3QgUG9pbnRlckludFBhaXI8UG9pbnRlclR5LCBJbnRCaXRzLCBJbnRUeXBlPiAmUCkgeworICAgIHJldHVybiBQLmdldE9wYXF1ZVZhbHVlKCk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIFBvaW50ZXJJbnRQYWlyPFBvaW50ZXJUeSwgSW50Qml0cywgSW50VHlwZT4KKyAgZ2V0RnJvbVZvaWRQb2ludGVyKHZvaWQgKlApIHsKKyAgICByZXR1cm4gUG9pbnRlckludFBhaXI8UG9pbnRlclR5LCBJbnRCaXRzLCBJbnRUeXBlPjo6Z2V0RnJvbU9wYXF1ZVZhbHVlKFApOworICB9CisKKyAgc3RhdGljIGlubGluZSBQb2ludGVySW50UGFpcjxQb2ludGVyVHksIEludEJpdHMsIEludFR5cGU+CisgIGdldEZyb21Wb2lkUG9pbnRlcihjb25zdCB2b2lkICpQKSB7CisgICAgcmV0dXJuIFBvaW50ZXJJbnRQYWlyPFBvaW50ZXJUeSwgSW50Qml0cywgSW50VHlwZT46OmdldEZyb21PcGFxdWVWYWx1ZShQKTsKKyAgfQorCisgIGVudW0geyBOdW1Mb3dCaXRzQXZhaWxhYmxlID0gUHRyVHJhaXRzOjpOdW1Mb3dCaXRzQXZhaWxhYmxlIC0gSW50Qml0cyB9OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX1BPSU5URVJJTlRQQUlSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1BvaW50ZXJTdW1UeXBlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Qb2ludGVyU3VtVHlwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzNzk1NzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Qb2ludGVyU3VtVHlwZS5oCkBAIC0wLDAgKzEsMjA3IEBACisvLz09PS0gbGx2bS9BRFQvUG9pbnRlclN1bVR5cGUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1BPSU5URVJTVU1UWVBFX0gKKyNkZWZpbmUgTExWTV9BRFRfUE9JTlRFUlNVTVRZUEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXBJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BvaW50ZXJMaWtlVHlwZVRyYWl0cy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQSBjb21waWxlIHRpbWUgcGFpciBvZiBhbiBpbnRlZ2VyIHRhZyBhbmQgdGhlIHBvaW50ZXItbGlrZSB0eXBlIHdoaWNoIGl0CisvLy8gaW5kZXhlcyB3aXRoaW4gYSBzdW0gdHlwZS4gQWxzbyBhbGxvd3MgdGhlIHVzZXIgdG8gc3BlY2lmeSBhIHBhcnRpY3VsYXIKKy8vLyB0cmFpdHMgY2xhc3MgZm9yIHBvaW50ZXIgdHlwZXMgd2l0aCBjdXN0b20gYmVoYXZpb3Igc3VjaCBhcyBvdmVyLWFsaWduZWQKKy8vLyBhbGxvY2F0aW9uLgordGVtcGxhdGUgPHVpbnRwdHJfdCBOLCB0eXBlbmFtZSBQb2ludGVyQXJnVCwKKyAgICAgICAgICB0eXBlbmFtZSBUcmFpdHNBcmdUID0gUG9pbnRlckxpa2VUeXBlVHJhaXRzPFBvaW50ZXJBcmdUPj4KK3N0cnVjdCBQb2ludGVyU3VtVHlwZU1lbWJlciB7CisgIGVudW0geyBUYWcgPSBOIH07CisgIHVzaW5nIFBvaW50ZXJUID0gUG9pbnRlckFyZ1Q7CisgIHVzaW5nIFRyYWl0c1QgPSBUcmFpdHNBcmdUOworfTsKKworbmFtZXNwYWNlIGRldGFpbCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUYWdULCB0eXBlbmFtZS4uLiBNZW1iZXJUcz4gc3RydWN0IFBvaW50ZXJTdW1UeXBlSGVscGVyOworCit9IC8vIGVuZCBuYW1lc3BhY2UgZGV0YWlsCisKKy8vLyBBIHN1bSB0eXBlIG92ZXIgcG9pbnRlci1saWtlIHR5cGVzLgorLy8vCisvLy8gVGhpcyBpcyBhIG5vcm1hbCB0YWdnZWQgdW5pb24gYWNyb3NzIHBvaW50ZXItbGlrZSB0eXBlcyB0aGF0IHVzZXMgdGhlIGxvdworLy8vIGJpdHMgb2YgdGhlIHBvaW50ZXJzIHRvIHN0b3JlIHRoZSB0YWcuCisvLy8KKy8vLyBFYWNoIG1lbWJlciBvZiB0aGUgc3VtIHR5cGUgaXMgc3BlY2lmaWVkIGJ5IHBhc3NpbmcgYSBcYworLy8vIFBvaW50ZXJTdW1UeXBlTWVtYmVyIHNwZWNpYWxpemF0aW9uIGluIHRoZSB2YXJpYWRpYyBtZW1iZXIgYXJndW1lbnQgbGlzdC4KKy8vLyBUaGlzIGFsbG93cyB0aGUgdXNlciB0byBjb250cm9sIHRoZSBwYXJ0aWN1bGFyIHRhZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGgKKy8vLyBhIHBhcnRpY3VsYXIgdHlwZSwgdXNlIHRoZSBzYW1lIHR5cGUgZm9yIG11bHRpcGxlIGRpZmZlcmVudCB0YWdzLCBhbmQKKy8vLyBjdXN0b21pemUgdGhlIHBvaW50ZXItbGlrZSB0cmFpdHMgdXNlZCBmb3IgYSBwYXJ0aWN1bGFyIG1lbWJlci4gTm90ZSB0aGF0CisvLy8gdGhlc2UgKm11c3QqIGJlIHNwZWNpYWxpemF0aW9ucyBvZiBcYyBQb2ludGVyU3VtVHlwZU1lbWJlciwgbm8gb3RoZXIgdHlwZQorLy8vIHdpbGwgc3VmZmljZSwgZXZlbiBpZiBpdCBwcm92aWRlcyBhIGNvbXBhdGlibGUgaW50ZXJmYWNlLgorLy8vCisvLy8gVGhpcyB0eXBlIGltcGxlbWVudHMgYWxsIG9mIHRoZSBjb21wYXJpc29uIG9wZXJhdG9ycyBhbmQgZXZlbiBoYXNoIHRhYmxlCisvLy8gc3VwcG9ydCBieSBjb21wYXJpbmcgdGhlIHVuZGVybHlpbmcgc3RvcmFnZSBvZiB0aGUgcG9pbnRlciB2YWx1ZXMuIEl0CisvLy8gZG9lc24ndCBzdXBwb3J0IGRlbGVnYXRpbmcgdG8gcGFydGljdWxhciBtZW1iZXJzIGZvciBjb21wYXJpc29ucy4KKy8vLworLy8vIEl0IGFsc28gZGVmYXVsdCBjb25zdHJ1Y3RzIHRvIGEgemVybyB0YWcgd2l0aCBhIG51bGwgcG9pbnRlciwgd2hhdGV2ZXIgdGhhdAorLy8vIHdvdWxkIGJlLiBUaGlzIG1lYW5zIHRoYXQgdGhlIHplcm8gdmFsdWUgZm9yIHRoZSB0YWcgdHlwZSBpcyBzaWduaWZpY2FudAorLy8vIGFuZCBtYXkgYmUgZGVzaXJhYmxlIHRvIHNldCB0byBhIHN0YXRlIHRoYXQgaXMgcGFydGljdWxhcmx5IGRlc2lyYWJsZSB0bworLy8vIGRlZmF1bHQgY29uc3RydWN0LgorLy8vCisvLy8gVGhlcmUgaXMgbm8gc3VwcG9ydCBmb3IgY29uc3RydWN0aW5nIG9yIGFjY2Vzc2luZyB3aXRoIGEgZHluYW1pYyB0YWcgYXMKKy8vLyB0aGF0IHdvdWxkIGZ1bmRhbWVudGFsbHkgdmlvbGF0ZSB0aGUgdHlwZSBzYWZldHkgcHJvdmlkZWQgYnkgdGhlIHN1bSB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIFRhZ1QsIHR5cGVuYW1lLi4uIE1lbWJlclRzPiBjbGFzcyBQb2ludGVyU3VtVHlwZSB7CisgIHVpbnRwdHJfdCBWYWx1ZSA9IDA7CisKKyAgdXNpbmcgSGVscGVyVCA9IGRldGFpbDo6UG9pbnRlclN1bVR5cGVIZWxwZXI8VGFnVCwgTWVtYmVyVHMuLi4+OworCitwdWJsaWM6CisgIGNvbnN0ZXhwciBQb2ludGVyU3VtVHlwZSgpID0gZGVmYXVsdDsKKworICAvLy8gQSB0eXBlZCBjb25zdHJ1Y3RvciBmb3IgYSBzcGVjaWZpYyB0YWdnZWQgbWVtYmVyIG9mIHRoZSBzdW0gdHlwZS4KKyAgdGVtcGxhdGUgPFRhZ1QgTj4KKyAgc3RhdGljIFBvaW50ZXJTdW1UeXBlCisgIGNyZWF0ZSh0eXBlbmFtZSBIZWxwZXJUOjp0ZW1wbGF0ZSBMb29rdXA8Tj46OlBvaW50ZXJUIFBvaW50ZXIpIHsKKyAgICBQb2ludGVyU3VtVHlwZSBSZXN1bHQ7CisgICAgdm9pZCAqViA9IEhlbHBlclQ6OnRlbXBsYXRlIExvb2t1cDxOPjo6VHJhaXRzVDo6Z2V0QXNWb2lkUG9pbnRlcihQb2ludGVyKTsKKyAgICBhc3NlcnQoKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihWKSAmIEhlbHBlclQ6OlRhZ01hc2spID09IDAgJiYKKyAgICAgICAgICAgIlBvaW50ZXIgaXMgaW5zdWZmaWNpZW50bHkgYWxpZ25lZCB0byBzdG9yZSB0aGUgZGlzY3JpbWluYW50ISIpOworICAgIFJlc3VsdC5WYWx1ZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihWKSB8IE47CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIFRhZ1QgZ2V0VGFnKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8VGFnVD4oVmFsdWUgJiBIZWxwZXJUOjpUYWdNYXNrKTsgfQorCisgIHRlbXBsYXRlIDxUYWdUIE4+IGJvb2wgaXMoKSBjb25zdCB7IHJldHVybiBOID09IGdldFRhZygpOyB9CisKKyAgdGVtcGxhdGUgPFRhZ1QgTj4gdHlwZW5hbWUgSGVscGVyVDo6dGVtcGxhdGUgTG9va3VwPE4+OjpQb2ludGVyVCBnZXQoKSBjb25zdCB7CisgICAgdm9pZCAqUCA9IGlzPE4+KCkgPyBnZXRJbXBsKCkgOiBudWxscHRyOworICAgIHJldHVybiBIZWxwZXJUOjp0ZW1wbGF0ZSBMb29rdXA8Tj46OlRyYWl0c1Q6OmdldEZyb21Wb2lkUG9pbnRlcihQKTsKKyAgfQorCisgIHRlbXBsYXRlIDxUYWdUIE4+CisgIHR5cGVuYW1lIEhlbHBlclQ6OnRlbXBsYXRlIExvb2t1cDxOPjo6UG9pbnRlclQgY2FzdCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXM8Tj4oKSAmJiAiVGhpcyBpbnN0YW5jZSBoYXMgYSBkaWZmZXJlbnQgYWN0aXZlIG1lbWJlci4iKTsKKyAgICByZXR1cm4gSGVscGVyVDo6dGVtcGxhdGUgTG9va3VwPE4+OjpUcmFpdHNUOjpnZXRGcm9tVm9pZFBvaW50ZXIoZ2V0SW1wbCgpKTsKKyAgfQorCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBWYWx1ZSAmIEhlbHBlclQ6OlBvaW50ZXJNYXNrOyB9CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQb2ludGVyU3VtVHlwZSAmUikgY29uc3QgeyByZXR1cm4gVmFsdWUgPT0gUi5WYWx1ZTsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgUG9pbnRlclN1bVR5cGUgJlIpIGNvbnN0IHsgcmV0dXJuIFZhbHVlICE9IFIuVmFsdWU7IH0KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUG9pbnRlclN1bVR5cGUgJlIpIGNvbnN0IHsgcmV0dXJuIFZhbHVlIDwgUi5WYWx1ZTsgfQorICBib29sIG9wZXJhdG9yPihjb25zdCBQb2ludGVyU3VtVHlwZSAmUikgY29uc3QgeyByZXR1cm4gVmFsdWUgPiBSLlZhbHVlOyB9CisgIGJvb2wgb3BlcmF0b3I8PShjb25zdCBQb2ludGVyU3VtVHlwZSAmUikgY29uc3QgeyByZXR1cm4gVmFsdWUgPD0gUi5WYWx1ZTsgfQorICBib29sIG9wZXJhdG9yPj0oY29uc3QgUG9pbnRlclN1bVR5cGUgJlIpIGNvbnN0IHsgcmV0dXJuIFZhbHVlID49IFIuVmFsdWU7IH0KKworICB1aW50cHRyX3QgZ2V0T3BhcXVlVmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZTsgfQorCitwcm90ZWN0ZWQ6CisgIHZvaWQgKmdldEltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihWYWx1ZSAmIEhlbHBlclQ6OlBvaW50ZXJNYXNrKTsKKyAgfQorfTsKKworbmFtZXNwYWNlIGRldGFpbCB7CisKKy8vLyBBIGhlbHBlciB0ZW1wbGF0ZSBmb3IgaW1wbGVtZW50aW5nIFxjIFBvaW50ZXJTdW1UeXBlLiBJdCBwcm92aWRlcyBmYXN0CisvLy8gY29tcGlsZS10aW1lIGxvb2t1cCBvZiB0aGUgbWVtYmVyIGZyb20gYSBwYXJ0aWN1bGFyIHRhZyB2YWx1ZSwgYWxvbmcgd2l0aAorLy8vIHVzZWZ1bCBjb25zdGFudHMgYW5kIGNvbXBpbGUgdGltZSBjaGVja2luZyBpbmZyYXN0cnVjdHVyZS4uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGFnVCwgdHlwZW5hbWUuLi4gTWVtYmVyVHM+CitzdHJ1Y3QgUG9pbnRlclN1bVR5cGVIZWxwZXIgOiBNZW1iZXJUcy4uLiB7CisgIC8vIEZpcnN0IHdlIHVzZSBhIHRyaWNrIHRvIGFsbG93IHF1aWNrbHkgbG9va2luZyB1cCBpbmZvcm1hdGlvbiBhYm91dAorICAvLyBhIHBhcnRpY3VsYXIgbWVtYmVyIG9mIHRoZSBzdW0gdHlwZS4gVGhpcyB3b3JrcyBiZWNhdXNlIHdlIGFycmFuZ2VkIHRvCisgIC8vIGhhdmUgdGhpcyB0eXBlIGRlcml2ZSBmcm9tIGFsbCBvZiB0aGUgbWVtYmVyIHR5cGUgdGVtcGxhdGVzLiBXZSBjYW4gc2VsZWN0CisgIC8vIHRoZSBtYXRjaGluZyBtZW1iZXIgZm9yIGEgdGFnIHVzaW5nIHR5cGUgZGVkdWN0aW9uIGR1cmluZyBvdmVybG9hZAorICAvLyByZXNvbHV0aW9uLgorICB0ZW1wbGF0ZSA8VGFnVCBOLCB0eXBlbmFtZSBQb2ludGVyVCwgdHlwZW5hbWUgVHJhaXRzVD4KKyAgc3RhdGljIFBvaW50ZXJTdW1UeXBlTWVtYmVyPE4sIFBvaW50ZXJULCBUcmFpdHNUPgorICBMb29rdXBPdmVybG9hZChQb2ludGVyU3VtVHlwZU1lbWJlcjxOLCBQb2ludGVyVCwgVHJhaXRzVD4gKik7CisgIHRlbXBsYXRlIDxUYWdUIE4+IHN0YXRpYyB2b2lkIExvb2t1cE92ZXJsb2FkKC4uLik7CisgIHRlbXBsYXRlIDxUYWdUIE4+IHN0cnVjdCBMb29rdXAgeworICAgIC8vIENvbXB1dGUgYSBwYXJ0aWN1bGFyIG1lbWJlciB0eXBlIGJ5IHJlc29sdmluZyB0aGUgbG9va3VwIGhlbHBlciBvdm9ybG9hZC4KKyAgICB1c2luZyBNZW1iZXJUID0gZGVjbHR5cGUoCisgICAgICAgIExvb2t1cE92ZXJsb2FkPE4+KHN0YXRpY19jYXN0PFBvaW50ZXJTdW1UeXBlSGVscGVyICo+KG51bGxwdHIpKSk7CisKKyAgICAvLy8gVGhlIE50aCBtZW1iZXIncyBwb2ludGVyIHR5cGUuCisgICAgdXNpbmcgUG9pbnRlclQgPSB0eXBlbmFtZSBNZW1iZXJUOjpQb2ludGVyVDsKKworICAgIC8vLyBUaGUgTnRoIG1lbWJlcidzIHRyYWl0cyB0eXBlLgorICAgIHVzaW5nIFRyYWl0c1QgPSB0eXBlbmFtZSBNZW1iZXJUOjpUcmFpdHNUOworICB9OworCisgIC8vIE5leHQgd2UgbmVlZCB0byBjb21wdXRlIHRoZSBudW1iZXIgb2YgYml0cyBhdmFpbGFibGUgZm9yIHRoZSBkaXNjcmltaW5hbnQKKyAgLy8gYnkgdGFraW5nIHRoZSBtaW4gb2YgdGhlIGJpdHMgYXZhaWxhYmxlIGZvciBlYWNoIG1lbWJlci4gTXVjaCBvZiB0aGlzCisgIC8vIHdvdWxkIGJlIGFtYXppbmdseSBlYXNpZXIgd2l0aCBnb29kIGNvbnN0ZXhwciBzdXBwb3J0LgorICB0ZW1wbGF0ZSA8dWludHB0cl90IFYsIHVpbnRwdHJfdC4uLiBWcz4KKyAgc3RydWN0IE1pbiA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8CisgICAgICAgICAgICAgICAgICAgdWludHB0cl90LCAoViA8IE1pbjxWcy4uLj46OnZhbHVlID8gViA6IE1pbjxWcy4uLj46OnZhbHVlKT4geworICB9OworICB0ZW1wbGF0ZSA8dWludHB0cl90IFY+CisgIHN0cnVjdCBNaW48Vj4gOiBzdGQ6OmludGVncmFsX2NvbnN0YW50PHVpbnRwdHJfdCwgVj4ge307CisgIGVudW0geyBOdW1UYWdCaXRzID0gTWluPE1lbWJlclRzOjpUcmFpdHNUOjpOdW1Mb3dCaXRzQXZhaWxhYmxlLi4uPjo6dmFsdWUgfTsKKworICAvLyBBbHNvIGNvbXB1dGUgdGhlIHNtYWxsZXN0IGRpc2NyaW1pbmFudCBhbmQgdmFyaW91cyBtYXNrcyBmb3IgY29udmVuaWVuY2UuCisgIGVudW0gOiB1aW50NjRfdCB7CisgICAgTWluVGFnID0gTWluPE1lbWJlclRzOjpUYWcuLi4+Ojp2YWx1ZSwKKyAgICBQb2ludGVyTWFzayA9IHN0YXRpY19jYXN0PHVpbnQ2NF90PigtMSkgPDwgTnVtVGFnQml0cywKKyAgICBUYWdNYXNrID0gflBvaW50ZXJNYXNrCisgIH07CisKKyAgLy8gRmluYWxseSB3ZSBuZWVkIGEgcmVjdXJzaXZlIHRlbXBsYXRlIHRvIGRvIHN0YXRpYyBjaGVja3Mgb2YgZWFjaAorICAvLyBtZW1iZXIuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNZW1iZXJULCB0eXBlbmFtZS4uLiBJbm5lck1lbWJlclRzPgorICBzdHJ1Y3QgQ2hlY2tlciA6IENoZWNrZXI8SW5uZXJNZW1iZXJUcy4uLj4geworICAgIHN0YXRpY19hc3NlcnQoTWVtYmVyVDo6VGFnIDwgKDEgPDwgTnVtVGFnQml0cyksCisgICAgICAgICAgICAgICAgICAiVGhpcyBkaXNjcmltaW5hbnQgdmFsdWUgcmVxdWlyZXMgdG9vIG1hbnkgYml0cyEiKTsKKyAgfTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1lbWJlclQ+IHN0cnVjdCBDaGVja2VyPE1lbWJlclQ+IDogc3RkOjp0cnVlX3R5cGUgeworICAgIHN0YXRpY19hc3NlcnQoTWVtYmVyVDo6VGFnIDwgKDEgPDwgTnVtVGFnQml0cyksCisgICAgICAgICAgICAgICAgICAiVGhpcyBkaXNjcmltaW5hbnQgdmFsdWUgcmVxdWlyZXMgdG9vIG1hbnkgYml0cyEiKTsKKyAgfTsKKyAgc3RhdGljX2Fzc2VydChDaGVja2VyPE1lbWJlclRzLi4uPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIkVhY2ggbWVtYmVyIG11c3QgcGFzcyB0aGUgY2hlY2tlci4iKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkZXRhaWwKKworLy8gVGVhY2ggRGVuc2VNYXAgaG93IHRvIHVzZSBQb2ludGVyU3VtVHlwZXMgYXMga2V5cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUYWdULCB0eXBlbmFtZS4uLiBNZW1iZXJUcz4KK3N0cnVjdCBEZW5zZU1hcEluZm88UG9pbnRlclN1bVR5cGU8VGFnVCwgTWVtYmVyVHMuLi4+PiB7CisgIHVzaW5nIFN1bVR5cGUgPSBQb2ludGVyU3VtVHlwZTxUYWdULCBNZW1iZXJUcy4uLj47CisgIHVzaW5nIEhlbHBlclQgPSBkZXRhaWw6OlBvaW50ZXJTdW1UeXBlSGVscGVyPFRhZ1QsIE1lbWJlclRzLi4uPjsKKyAgZW51bSB7IFNvbWVUYWcgPSBIZWxwZXJUOjpNaW5UYWcgfTsKKyAgdXNpbmcgU29tZVBvaW50ZXJUID0KKyAgICAgIHR5cGVuYW1lIEhlbHBlclQ6OnRlbXBsYXRlIExvb2t1cDxIZWxwZXJUOjpNaW5UYWc+OjpQb2ludGVyVDsKKyAgdXNpbmcgU29tZVBvaW50ZXJJbmZvID0gRGVuc2VNYXBJbmZvPFNvbWVQb2ludGVyVD47CisKKyAgc3RhdGljIGlubGluZSBTdW1UeXBlIGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiBTdW1UeXBlOjpjcmVhdGU8U29tZVRhZz4oU29tZVBvaW50ZXJJbmZvOjpnZXRFbXB0eUtleSgpKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgU3VtVHlwZSBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgcmV0dXJuIFN1bVR5cGU6OmNyZWF0ZTxTb21lVGFnPihTb21lUG9pbnRlckluZm86OmdldFRvbWJzdG9uZUtleSgpKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgU3VtVHlwZSAmQXJnKSB7CisgICAgdWludHB0cl90IE9wYXF1ZVZhbHVlID0gQXJnLmdldE9wYXF1ZVZhbHVlKCk7CisgICAgcmV0dXJuIERlbnNlTWFwSW5mbzx1aW50cHRyX3Q+OjpnZXRIYXNoVmFsdWUoT3BhcXVlVmFsdWUpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBTdW1UeXBlICZMSFMsIGNvbnN0IFN1bVR5cGUgJlJIUykgeworICAgIHJldHVybiBMSFMgPT0gUkhTOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfUE9JTlRFUlNVTVRZUEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvUG9pbnRlclVuaW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Qb2ludGVyVW5pb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTVlNTgzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvUG9pbnRlclVuaW9uLmgKQEAgLTAsMCArMSw0OTEgQEAKKy8vPT09LSBsbHZtL0FEVC9Qb2ludGVyVW5pb24uaCAtIERpc2NyaW1pbmF0ZWQgVW5pb24gb2YgMiBQdHJzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFBvaW50ZXJVbmlvbiBjbGFzcywgd2hpY2ggaXMgYSBkaXNjcmltaW5hdGVkIHVuaW9uIG9mCisvLyBwb2ludGVyIHR5cGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfUE9JTlRFUlVOSU9OX0gKKyNkZWZpbmUgTExWTV9BRFRfUE9JTlRFUlVOSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BvaW50ZXJMaWtlVHlwZVRyYWl0cy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgUG9pbnRlclVuaW9uVHlwZVNlbGVjdG9yUmV0dXJuIHsKKyAgdXNpbmcgUmV0dXJuID0gVDsKK307CisKKy8vLyBHZXQgYSB0eXBlIGJhc2VkIG9uIHdoZXRoZXIgdHdvIHR5cGVzIGFyZSB0aGUgc2FtZSBvciBub3QuCisvLy8KKy8vLyBGb3I6CisvLy8KKy8vLyBcY29kZQorLy8vICAgdXNpbmcgUmV0ID0gdHlwZW5hbWUgUG9pbnRlclVuaW9uVHlwZVNlbGVjdG9yPFQxLCBUMiwgRVEsIE5FPjo6UmV0dXJuOworLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBSZXQgd2lsbCBiZSBFUSB0eXBlIGlmIFQxIGlzIHNhbWUgYXMgVDIgb3IgTkUgdHlwZSBvdGhlcndpc2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyLCB0eXBlbmFtZSBSRVRfRVEsIHR5cGVuYW1lIFJFVF9ORT4KK3N0cnVjdCBQb2ludGVyVW5pb25UeXBlU2VsZWN0b3IgeworICB1c2luZyBSZXR1cm4gPSB0eXBlbmFtZSBQb2ludGVyVW5pb25UeXBlU2VsZWN0b3JSZXR1cm48UkVUX05FPjo6UmV0dXJuOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFJFVF9FUSwgdHlwZW5hbWUgUkVUX05FPgorc3RydWN0IFBvaW50ZXJVbmlvblR5cGVTZWxlY3RvcjxULCBULCBSRVRfRVEsIFJFVF9ORT4geworICB1c2luZyBSZXR1cm4gPSB0eXBlbmFtZSBQb2ludGVyVW5pb25UeXBlU2VsZWN0b3JSZXR1cm48UkVUX0VRPjo6UmV0dXJuOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgUkVUX0VRLCB0eXBlbmFtZSBSRVRfTkU+CitzdHJ1Y3QgUG9pbnRlclVuaW9uVHlwZVNlbGVjdG9yUmV0dXJuPAorICAgIFBvaW50ZXJVbmlvblR5cGVTZWxlY3RvcjxUMSwgVDIsIFJFVF9FUSwgUkVUX05FPj4geworICB1c2luZyBSZXR1cm4gPQorICAgICAgdHlwZW5hbWUgUG9pbnRlclVuaW9uVHlwZVNlbGVjdG9yPFQxLCBUMiwgUkVUX0VRLCBSRVRfTkU+OjpSZXR1cm47Cit9OworCisvLy8gUHJvdmlkZSBQb2ludGVyTGlrZVR5cGVUcmFpdHMgZm9yIHZvaWQqIHRoYXQgaXMgdXNlZCBieSBQb2ludGVyVW5pb24KKy8vLyBmb3IgdGhlIHR3byB0ZW1wbGF0ZSBhcmd1bWVudHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUFQxLCB0eXBlbmFtZSBQVDI+IGNsYXNzIFBvaW50ZXJVbmlvblVJbnRUcmFpdHMgeworcHVibGljOgorICBzdGF0aWMgaW5saW5lIHZvaWQgKmdldEFzVm9pZFBvaW50ZXIodm9pZCAqUCkgeyByZXR1cm4gUDsgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgKmdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7IHJldHVybiBQOyB9CisKKyAgZW51bSB7CisgICAgUFQxQml0c0F2ID0gKGludCkoUG9pbnRlckxpa2VUeXBlVHJhaXRzPFBUMT46Ok51bUxvd0JpdHNBdmFpbGFibGUpLAorICAgIFBUMkJpdHNBdiA9IChpbnQpKFBvaW50ZXJMaWtlVHlwZVRyYWl0czxQVDI+OjpOdW1Mb3dCaXRzQXZhaWxhYmxlKSwKKyAgICBOdW1Mb3dCaXRzQXZhaWxhYmxlID0gUFQxQml0c0F2IDwgUFQyQml0c0F2ID8gUFQxQml0c0F2IDogUFQyQml0c0F2CisgIH07Cit9OworCisvLy8gQSBkaXNjcmltaW5hdGVkIHVuaW9uIG9mIHR3byBwb2ludGVyIHR5cGVzLCB3aXRoIHRoZSBkaXNjcmltaW5hdG9yIGluIHRoZQorLy8vIGxvdyBiaXQgb2YgdGhlIHBvaW50ZXIuCisvLy8KKy8vLyBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGV4dHJlbWVseSBlZmZpY2llbnQgaW4gc3BhY2UgZHVlIHRvIGxldmVyYWdpbmcgdGhlCisvLy8gbG93IGJpdHMgb2YgdGhlIHBvaW50ZXIsIHdoaWxlIGV4cG9zaW5nIGEgbmF0dXJhbCBhbmQgdHlwZS1zYWZlIEFQSS4KKy8vLworLy8vIENvbW1vbiB1c2UgcGF0dGVybnMgd291bGQgYmUgc29tZXRoaW5nIGxpa2UgdGhpczoKKy8vLyAgICBQb2ludGVyVW5pb248aW50KiwgZmxvYXQqPiBQOworLy8vICAgIFAgPSAoaW50KikwOworLy8vICAgIHByaW50ZigiJWQgJWQiLCBQLmlzPGludCo+KCksIFAuaXM8ZmxvYXQqPigpKTsgIC8vIHByaW50cyAiMSAwIgorLy8vICAgIFggPSBQLmdldDxpbnQqPigpOyAgICAgLy8gb2suCisvLy8gICAgWSA9IFAuZ2V0PGZsb2F0Kj4oKTsgICAvLyBydW50aW1lIGFzc2VydGlvbiBmYWlsdXJlLgorLy8vICAgIFogPSBQLmdldDxkb3VibGUqPigpOyAgLy8gY29tcGlsZSB0aW1lIGZhaWx1cmUuCisvLy8gICAgUCA9IChmbG9hdCopMDsKKy8vLyAgICBZID0gUC5nZXQ8ZmxvYXQqPigpOyAgIC8vIG9rLgorLy8vICAgIFggPSBQLmdldDxpbnQqPigpOyAgICAgLy8gcnVudGltZSBhc3NlcnRpb24gZmFpbHVyZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQVDEsIHR5cGVuYW1lIFBUMj4gY2xhc3MgUG9pbnRlclVuaW9uIHsKK3B1YmxpYzoKKyAgdXNpbmcgVmFsVHkgPQorICAgICAgUG9pbnRlckludFBhaXI8dm9pZCAqLCAxLCBib29sLCBQb2ludGVyVW5pb25VSW50VHJhaXRzPFBUMSwgUFQyPj47CisKK3ByaXZhdGU6CisgIFZhbFR5IFZhbDsKKworICBzdHJ1Y3QgSXNQVDEgeworICAgIHN0YXRpYyBjb25zdCBpbnQgTnVtID0gMDsKKyAgfTsKKyAgc3RydWN0IElzUFQyIHsKKyAgICBzdGF0aWMgY29uc3QgaW50IE51bSA9IDE7CisgIH07CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgVU5JT05fRE9FU05UX0NPTlRBSU5fVFlQRSB7fTsKKworcHVibGljOgorICBQb2ludGVyVW5pb24oKSA9IGRlZmF1bHQ7CisgIFBvaW50ZXJVbmlvbihQVDEgVikKKyAgICAgIDogVmFsKGNvbnN0X2Nhc3Q8dm9pZCAqPigKKyAgICAgICAgICAgIFBvaW50ZXJMaWtlVHlwZVRyYWl0czxQVDE+OjpnZXRBc1ZvaWRQb2ludGVyKFYpKSkge30KKyAgUG9pbnRlclVuaW9uKFBUMiBWKQorICAgICAgOiBWYWwoY29uc3RfY2FzdDx2b2lkICo+KFBvaW50ZXJMaWtlVHlwZVRyYWl0czxQVDI+OjpnZXRBc1ZvaWRQb2ludGVyKFYpKSwKKyAgICAgICAgICAgIDEpIHt9CisKKyAgLy8vIFRlc3QgaWYgdGhlIHBvaW50ZXIgaGVsZCBpbiB0aGUgdW5pb24gaXMgbnVsbCwgcmVnYXJkbGVzcyBvZgorICAvLy8gd2hpY2ggdHlwZSBpdCBpcy4KKyAgYm9vbCBpc051bGwoKSBjb25zdCB7CisgICAgLy8gQ29udmVydCBmcm9tIHRoZSB2b2lkKiB0byBvbmUgb2YgdGhlIHBvaW50ZXIgdHlwZXMsIHRvIG1ha2Ugc3VyZSB0aGF0CisgICAgLy8gd2UgcmVjdXJzaXZlbHkgc3RyaXAgb2ZmIGxvdyBiaXRzIGlmIHdlIGhhdmUgYSBuZXN0ZWQgUG9pbnRlclVuaW9uLgorICAgIHJldHVybiAhUG9pbnRlckxpa2VUeXBlVHJhaXRzPFBUMT46OmdldEZyb21Wb2lkUG9pbnRlcihWYWwuZ2V0UG9pbnRlcigpKTsKKyAgfQorCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAhaXNOdWxsKCk7IH0KKworICAvLy8gVGVzdCBpZiB0aGUgVW5pb24gY3VycmVudGx5IGhvbGRzIHRoZSB0eXBlIG1hdGNoaW5nIFQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBpbnQgaXMoKSBjb25zdCB7CisgICAgdXNpbmcgVHkgPSB0eXBlbmFtZSA6Omxsdm06OlBvaW50ZXJVbmlvblR5cGVTZWxlY3RvcjwKKyAgICAgICAgUFQxLCBULCBJc1BUMSwKKyAgICAgICAgOjpsbHZtOjpQb2ludGVyVW5pb25UeXBlU2VsZWN0b3I8UFQyLCBULCBJc1BUMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVU5JT05fRE9FU05UX0NPTlRBSU5fVFlQRTxUPj4+OjpSZXR1cm47CisgICAgaW50IFR5Tm8gPSBUeTo6TnVtOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KFZhbC5nZXRJbnQoKSkgPT0gVHlObzsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgdHlwZS4KKyAgLy8vCisgIC8vLyBJZiB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgdHlwZSBpcyBpbmNvcnJlY3QsIGFzc2VydC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgZ2V0KCkgY29uc3QgeworICAgIGFzc2VydChpczxUPigpICYmICJJbnZhbGlkIGFjY2Vzc29yIGNhbGxlZCIpOworICAgIHJldHVybiBQb2ludGVyTGlrZVR5cGVUcmFpdHM8VD46OmdldEZyb21Wb2lkUG9pbnRlcihWYWwuZ2V0UG9pbnRlcigpKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBjdXJyZW50IHBvaW50ZXIgaWYgaXQgaXMgb2YgdGhlIHNwZWNpZmllZCBwb2ludGVyIHR5cGUsCisgIC8vLyBvdGhlcndpc2VzIHJldHVybnMgbnVsbC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgZHluX2Nhc3QoKSBjb25zdCB7CisgICAgaWYgKGlzPFQ+KCkpCisgICAgICByZXR1cm4gZ2V0PFQ+KCk7CisgICAgcmV0dXJuIFQoKTsKKyAgfQorCisgIC8vLyBJZiB0aGUgdW5pb24gaXMgc2V0IHRvIHRoZSBmaXJzdCBwb2ludGVyIHR5cGUgZ2V0IGFuIGFkZHJlc3MgcG9pbnRpbmcgdG8KKyAgLy8vIGl0LgorICBQVDEgY29uc3QgKmdldEFkZHJPZlB0cjEoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8UG9pbnRlclVuaW9uICo+KHRoaXMpLT5nZXRBZGRyT2ZQdHIxKCk7CisgIH0KKworICAvLy8gSWYgdGhlIHVuaW9uIGlzIHNldCB0byB0aGUgZmlyc3QgcG9pbnRlciB0eXBlIGdldCBhbiBhZGRyZXNzIHBvaW50aW5nIHRvCisgIC8vLyBpdC4KKyAgUFQxICpnZXRBZGRyT2ZQdHIxKCkgeworICAgIGFzc2VydChpczxQVDE+KCkgJiYgIlZhbCBpcyBub3QgdGhlIGZpcnN0IHBvaW50ZXIiKTsKKyAgICBhc3NlcnQoCisgICAgICAgIGdldDxQVDE+KCkgPT0gVmFsLmdldFBvaW50ZXIoKSAmJgorICAgICAgICAiQ2FuJ3QgZ2V0IHRoZSBhZGRyZXNzIGJlY2F1c2UgUG9pbnRlckxpa2VUeXBlVHJhaXRzIGNoYW5nZXMgdGhlIHB0ciIpOworICAgIHJldHVybiBjb25zdF9jYXN0PFBUMSAqPigKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBQVDEgKj4oVmFsLmdldEFkZHJPZlBvaW50ZXIoKSkpOworICB9CisKKyAgLy8vIEFzc2lnbm1lbnQgZnJvbSBudWxscHRyIHdoaWNoIGp1c3QgY2xlYXJzIHRoZSB1bmlvbi4KKyAgY29uc3QgUG9pbnRlclVuaW9uICZvcGVyYXRvcj0oc3RkOjpudWxscHRyX3QpIHsKKyAgICBWYWwuaW5pdFdpdGhQb2ludGVyKG51bGxwdHIpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBBc3NpZ25tZW50IG9wZXJhdG9ycyAtIEFsbG93IGFzc2lnbmluZyBpbnRvIHRoaXMgdW5pb24gZnJvbSBlaXRoZXIKKyAgLy8vIHBvaW50ZXIgdHlwZSwgc2V0dGluZyB0aGUgZGlzY3JpbWluYXRvciB0byByZW1lbWJlciB3aGF0IGl0IGNhbWUgZnJvbS4KKyAgY29uc3QgUG9pbnRlclVuaW9uICZvcGVyYXRvcj0oY29uc3QgUFQxICZSSFMpIHsKKyAgICBWYWwuaW5pdFdpdGhQb2ludGVyKAorICAgICAgICBjb25zdF9jYXN0PHZvaWQgKj4oUG9pbnRlckxpa2VUeXBlVHJhaXRzPFBUMT46OmdldEFzVm9pZFBvaW50ZXIoUkhTKSkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBjb25zdCBQb2ludGVyVW5pb24gJm9wZXJhdG9yPShjb25zdCBQVDIgJlJIUykgeworICAgIFZhbC5zZXRQb2ludGVyQW5kSW50KAorICAgICAgICBjb25zdF9jYXN0PHZvaWQgKj4oUG9pbnRlckxpa2VUeXBlVHJhaXRzPFBUMj46OmdldEFzVm9pZFBvaW50ZXIoUkhTKSksCisgICAgICAgIDEpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZvaWQgKmdldE9wYXF1ZVZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsLmdldE9wYXF1ZVZhbHVlKCk7IH0KKyAgc3RhdGljIGlubGluZSBQb2ludGVyVW5pb24gZ2V0RnJvbU9wYXF1ZVZhbHVlKHZvaWQgKlZQKSB7CisgICAgUG9pbnRlclVuaW9uIFY7CisgICAgVi5WYWwgPSBWYWxUeTo6Z2V0RnJvbU9wYXF1ZVZhbHVlKFZQKTsKKyAgICByZXR1cm4gVjsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFBUMSwgdHlwZW5hbWUgUFQyPgorYm9vbCBvcGVyYXRvcj09KFBvaW50ZXJVbmlvbjxQVDEsIFBUMj4gbGhzLCBQb2ludGVyVW5pb248UFQxLCBQVDI+IHJocykgeworICByZXR1cm4gbGhzLmdldE9wYXF1ZVZhbHVlKCkgPT0gcmhzLmdldE9wYXF1ZVZhbHVlKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBQVDEsIHR5cGVuYW1lIFBUMj4KK2Jvb2wgb3BlcmF0b3IhPShQb2ludGVyVW5pb248UFQxLCBQVDI+IGxocywgUG9pbnRlclVuaW9uPFBUMSwgUFQyPiByaHMpIHsKKyAgcmV0dXJuIGxocy5nZXRPcGFxdWVWYWx1ZSgpICE9IHJocy5nZXRPcGFxdWVWYWx1ZSgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUFQxLCB0eXBlbmFtZSBQVDI+Citib29sIG9wZXJhdG9yPChQb2ludGVyVW5pb248UFQxLCBQVDI+IGxocywgUG9pbnRlclVuaW9uPFBUMSwgUFQyPiByaHMpIHsKKyAgcmV0dXJuIGxocy5nZXRPcGFxdWVWYWx1ZSgpIDwgcmhzLmdldE9wYXF1ZVZhbHVlKCk7Cit9CisKKy8vIFRlYWNoIFNtYWxsUHRyU2V0IHRoYXQgUG9pbnRlclVuaW9uIGlzICJiYXNpY2FsbHkgYSBwb2ludGVyIiwgdGhhdCBoYXMKKy8vICMgbG93IGJpdHMgYXZhaWxhYmxlID0gbWluKFBUMWJpdHMsUFQyYml0cyktMS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQVDEsIHR5cGVuYW1lIFBUMj4KK3N0cnVjdCBQb2ludGVyTGlrZVR5cGVUcmFpdHM8UG9pbnRlclVuaW9uPFBUMSwgUFQyPj4geworICBzdGF0aWMgaW5saW5lIHZvaWQgKmdldEFzVm9pZFBvaW50ZXIoY29uc3QgUG9pbnRlclVuaW9uPFBUMSwgUFQyPiAmUCkgeworICAgIHJldHVybiBQLmdldE9wYXF1ZVZhbHVlKCk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIFBvaW50ZXJVbmlvbjxQVDEsIFBUMj4gZ2V0RnJvbVZvaWRQb2ludGVyKHZvaWQgKlApIHsKKyAgICByZXR1cm4gUG9pbnRlclVuaW9uPFBUMSwgUFQyPjo6Z2V0RnJvbU9wYXF1ZVZhbHVlKFApOworICB9CisKKyAgLy8gVGhlIG51bWJlciBvZiBiaXRzIGF2YWlsYWJsZSBhcmUgdGhlIG1pbiBvZiB0aGUgdHdvIHBvaW50ZXIgdHlwZXMuCisgIGVudW0geworICAgIE51bUxvd0JpdHNBdmFpbGFibGUgPSBQb2ludGVyTGlrZVR5cGVUcmFpdHM8CisgICAgICAgIHR5cGVuYW1lIFBvaW50ZXJVbmlvbjxQVDEsIFBUMj46OlZhbFR5Pjo6TnVtTG93Qml0c0F2YWlsYWJsZQorICB9OworfTsKKworLy8vIEEgcG9pbnRlciB1bmlvbiBvZiB0aHJlZSBwb2ludGVyIHR5cGVzLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgUG9pbnRlclVuaW9uCisvLy8gZm9yIHVzYWdlLgordGVtcGxhdGUgPHR5cGVuYW1lIFBUMSwgdHlwZW5hbWUgUFQyLCB0eXBlbmFtZSBQVDM+IGNsYXNzIFBvaW50ZXJVbmlvbjMgeworcHVibGljOgorICB1c2luZyBJbm5lclVuaW9uID0gUG9pbnRlclVuaW9uPFBUMSwgUFQyPjsKKyAgdXNpbmcgVmFsVHkgPSBQb2ludGVyVW5pb248SW5uZXJVbmlvbiwgUFQzPjsKKworcHJpdmF0ZToKKyAgVmFsVHkgVmFsOworCisgIHN0cnVjdCBJc0lubmVyVW5pb24geworICAgIFZhbFR5IFZhbDsKKworICAgIElzSW5uZXJVbmlvbihWYWxUeSB2YWwpIDogVmFsKHZhbCkge30KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBpbnQgaXMoKSBjb25zdCB7CisgICAgICByZXR1cm4gVmFsLnRlbXBsYXRlIGlzPElubmVyVW5pb24+KCkgJiYKKyAgICAgICAgICAgICBWYWwudGVtcGxhdGUgZ2V0PElubmVyVW5pb24+KCkudGVtcGxhdGUgaXM8VD4oKTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBnZXQoKSBjb25zdCB7CisgICAgICByZXR1cm4gVmFsLnRlbXBsYXRlIGdldDxJbm5lclVuaW9uPigpLnRlbXBsYXRlIGdldDxUPigpOworICAgIH0KKyAgfTsKKworICBzdHJ1Y3QgSXNQVDMgeworICAgIFZhbFR5IFZhbDsKKworICAgIElzUFQzKFZhbFR5IHZhbCkgOiBWYWwodmFsKSB7fQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGludCBpcygpIGNvbnN0IHsgcmV0dXJuIFZhbC50ZW1wbGF0ZSBpczxUPigpOyB9CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgZ2V0KCkgY29uc3QgeyByZXR1cm4gVmFsLnRlbXBsYXRlIGdldDxUPigpOyB9CisgIH07CisKK3B1YmxpYzoKKyAgUG9pbnRlclVuaW9uMygpID0gZGVmYXVsdDsKKyAgUG9pbnRlclVuaW9uMyhQVDEgVikgeyBWYWwgPSBJbm5lclVuaW9uKFYpOyB9CisgIFBvaW50ZXJVbmlvbjMoUFQyIFYpIHsgVmFsID0gSW5uZXJVbmlvbihWKTsgfQorICBQb2ludGVyVW5pb24zKFBUMyBWKSB7IFZhbCA9IFY7IH0KKworICAvLy8gVGVzdCBpZiB0aGUgcG9pbnRlciBoZWxkIGluIHRoZSB1bmlvbiBpcyBudWxsLCByZWdhcmRsZXNzIG9mCisgIC8vLyB3aGljaCB0eXBlIGl0IGlzLgorICBib29sIGlzTnVsbCgpIGNvbnN0IHsgcmV0dXJuIFZhbC5pc051bGwoKTsgfQorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gIWlzTnVsbCgpOyB9CisKKyAgLy8vIFRlc3QgaWYgdGhlIFVuaW9uIGN1cnJlbnRseSBob2xkcyB0aGUgdHlwZSBtYXRjaGluZyBULgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gaW50IGlzKCkgY29uc3QgeworICAgIC8vIElmIFQgaXMgUFQxL1BUMiBjaG9vc2UgSXNJbm5lclVuaW9uIG90aGVyd2lzZSBjaG9vc2UgSXNQVDMuCisgICAgdXNpbmcgVHkgPSB0eXBlbmFtZSA6Omxsdm06OlBvaW50ZXJVbmlvblR5cGVTZWxlY3RvcjwKKyAgICAgICAgUFQxLCBULCBJc0lubmVyVW5pb24sCisgICAgICAgIDo6bGx2bTo6UG9pbnRlclVuaW9uVHlwZVNlbGVjdG9yPFBUMiwgVCwgSXNJbm5lclVuaW9uLCBJc1BUMz4+OjpSZXR1cm47CisgICAgcmV0dXJuIFR5KFZhbCkudGVtcGxhdGUgaXM8VD4oKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgdHlwZS4KKyAgLy8vCisgIC8vLyBJZiB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgdHlwZSBpcyBpbmNvcnJlY3QsIGFzc2VydC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgZ2V0KCkgY29uc3QgeworICAgIGFzc2VydChpczxUPigpICYmICJJbnZhbGlkIGFjY2Vzc29yIGNhbGxlZCIpOworICAgIC8vIElmIFQgaXMgUFQxL1BUMiBjaG9vc2UgSXNJbm5lclVuaW9uIG90aGVyd2lzZSBjaG9vc2UgSXNQVDMuCisgICAgdXNpbmcgVHkgPSB0eXBlbmFtZSA6Omxsdm06OlBvaW50ZXJVbmlvblR5cGVTZWxlY3RvcjwKKyAgICAgICAgUFQxLCBULCBJc0lubmVyVW5pb24sCisgICAgICAgIDo6bGx2bTo6UG9pbnRlclVuaW9uVHlwZVNlbGVjdG9yPFBUMiwgVCwgSXNJbm5lclVuaW9uLCBJc1BUMz4+OjpSZXR1cm47CisgICAgcmV0dXJuIFR5KFZhbCkudGVtcGxhdGUgZ2V0PFQ+KCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgY3VycmVudCBwb2ludGVyIGlmIGl0IGlzIG9mIHRoZSBzcGVjaWZpZWQgcG9pbnRlciB0eXBlLAorICAvLy8gb3RoZXJ3aXNlcyByZXR1cm5zIG51bGwuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIGR5bl9jYXN0KCkgY29uc3QgeworICAgIGlmIChpczxUPigpKQorICAgICAgcmV0dXJuIGdldDxUPigpOworICAgIHJldHVybiBUKCk7CisgIH0KKworICAvLy8gQXNzaWdubWVudCBmcm9tIG51bGxwdHIgd2hpY2gganVzdCBjbGVhcnMgdGhlIHVuaW9uLgorICBjb25zdCBQb2ludGVyVW5pb24zICZvcGVyYXRvcj0oc3RkOjpudWxscHRyX3QpIHsKKyAgICBWYWwgPSBudWxscHRyOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBBc3NpZ25tZW50IG9wZXJhdG9ycyAtIEFsbG93IGFzc2lnbmluZyBpbnRvIHRoaXMgdW5pb24gZnJvbSBlaXRoZXIKKyAgLy8vIHBvaW50ZXIgdHlwZSwgc2V0dGluZyB0aGUgZGlzY3JpbWluYXRvciB0byByZW1lbWJlciB3aGF0IGl0IGNhbWUgZnJvbS4KKyAgY29uc3QgUG9pbnRlclVuaW9uMyAmb3BlcmF0b3I9KGNvbnN0IFBUMSAmUkhTKSB7CisgICAgVmFsID0gSW5uZXJVbmlvbihSSFMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBjb25zdCBQb2ludGVyVW5pb24zICZvcGVyYXRvcj0oY29uc3QgUFQyICZSSFMpIHsKKyAgICBWYWwgPSBJbm5lclVuaW9uKFJIUyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGNvbnN0IFBvaW50ZXJVbmlvbjMgJm9wZXJhdG9yPShjb25zdCBQVDMgJlJIUykgeworICAgIFZhbCA9IFJIUzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkICpnZXRPcGFxdWVWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbC5nZXRPcGFxdWVWYWx1ZSgpOyB9CisgIHN0YXRpYyBpbmxpbmUgUG9pbnRlclVuaW9uMyBnZXRGcm9tT3BhcXVlVmFsdWUodm9pZCAqVlApIHsKKyAgICBQb2ludGVyVW5pb24zIFY7CisgICAgVi5WYWwgPSBWYWxUeTo6Z2V0RnJvbU9wYXF1ZVZhbHVlKFZQKTsKKyAgICByZXR1cm4gVjsKKyAgfQorfTsKKworLy8gVGVhY2ggU21hbGxQdHJTZXQgdGhhdCBQb2ludGVyVW5pb24zIGlzICJiYXNpY2FsbHkgYSBwb2ludGVyIiwgdGhhdCBoYXMKKy8vICMgbG93IGJpdHMgYXZhaWxhYmxlID0gbWluKFBUMWJpdHMsUFQyYml0cyxQVDJiaXRzKS0yLgordGVtcGxhdGUgPHR5cGVuYW1lIFBUMSwgdHlwZW5hbWUgUFQyLCB0eXBlbmFtZSBQVDM+CitzdHJ1Y3QgUG9pbnRlckxpa2VUeXBlVHJhaXRzPFBvaW50ZXJVbmlvbjM8UFQxLCBQVDIsIFBUMz4+IHsKKyAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKGNvbnN0IFBvaW50ZXJVbmlvbjM8UFQxLCBQVDIsIFBUMz4gJlApIHsKKyAgICByZXR1cm4gUC5nZXRPcGFxdWVWYWx1ZSgpOworICB9CisKKyAgc3RhdGljIGlubGluZSBQb2ludGVyVW5pb24zPFBUMSwgUFQyLCBQVDM+IGdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7CisgICAgcmV0dXJuIFBvaW50ZXJVbmlvbjM8UFQxLCBQVDIsIFBUMz46OmdldEZyb21PcGFxdWVWYWx1ZShQKTsKKyAgfQorCisgIC8vIFRoZSBudW1iZXIgb2YgYml0cyBhdmFpbGFibGUgYXJlIHRoZSBtaW4gb2YgdGhlIHR3byBwb2ludGVyIHR5cGVzLgorICBlbnVtIHsKKyAgICBOdW1Mb3dCaXRzQXZhaWxhYmxlID0gUG9pbnRlckxpa2VUeXBlVHJhaXRzPAorICAgICAgICB0eXBlbmFtZSBQb2ludGVyVW5pb24zPFBUMSwgUFQyLCBQVDM+OjpWYWxUeT46Ok51bUxvd0JpdHNBdmFpbGFibGUKKyAgfTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBQVDEsIHR5cGVuYW1lIFBUMiwgdHlwZW5hbWUgUFQzPgorYm9vbCBvcGVyYXRvcjwoUG9pbnRlclVuaW9uMzxQVDEsIFBUMiwgUFQzPiBsaHMsCisgICAgICAgICAgICAgICBQb2ludGVyVW5pb24zPFBUMSwgUFQyLCBQVDM+IHJocykgeworICByZXR1cm4gbGhzLmdldE9wYXF1ZVZhbHVlKCkgPCByaHMuZ2V0T3BhcXVlVmFsdWUoKTsKK30KKworLy8vIEEgcG9pbnRlciB1bmlvbiBvZiBmb3VyIHBvaW50ZXIgdHlwZXMuIFNlZSBkb2N1bWVudGF0aW9uIGZvciBQb2ludGVyVW5pb24KKy8vLyBmb3IgdXNhZ2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUFQxLCB0eXBlbmFtZSBQVDIsIHR5cGVuYW1lIFBUMywgdHlwZW5hbWUgUFQ0PgorY2xhc3MgUG9pbnRlclVuaW9uNCB7CitwdWJsaWM6CisgIHVzaW5nIElubmVyVW5pb24xID0gUG9pbnRlclVuaW9uPFBUMSwgUFQyPjsKKyAgdXNpbmcgSW5uZXJVbmlvbjIgPSBQb2ludGVyVW5pb248UFQzLCBQVDQ+OworICB1c2luZyBWYWxUeSA9IFBvaW50ZXJVbmlvbjxJbm5lclVuaW9uMSwgSW5uZXJVbmlvbjI+OworCitwcml2YXRlOgorICBWYWxUeSBWYWw7CisKK3B1YmxpYzoKKyAgUG9pbnRlclVuaW9uNCgpID0gZGVmYXVsdDsKKyAgUG9pbnRlclVuaW9uNChQVDEgVikgeyBWYWwgPSBJbm5lclVuaW9uMShWKTsgfQorICBQb2ludGVyVW5pb240KFBUMiBWKSB7IFZhbCA9IElubmVyVW5pb24xKFYpOyB9CisgIFBvaW50ZXJVbmlvbjQoUFQzIFYpIHsgVmFsID0gSW5uZXJVbmlvbjIoVik7IH0KKyAgUG9pbnRlclVuaW9uNChQVDQgVikgeyBWYWwgPSBJbm5lclVuaW9uMihWKTsgfQorCisgIC8vLyBUZXN0IGlmIHRoZSBwb2ludGVyIGhlbGQgaW4gdGhlIHVuaW9uIGlzIG51bGwsIHJlZ2FyZGxlc3Mgb2YKKyAgLy8vIHdoaWNoIHR5cGUgaXQgaXMuCisgIGJvb2wgaXNOdWxsKCkgY29uc3QgeyByZXR1cm4gVmFsLmlzTnVsbCgpOyB9CisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiAhaXNOdWxsKCk7IH0KKworICAvLy8gVGVzdCBpZiB0aGUgVW5pb24gY3VycmVudGx5IGhvbGRzIHRoZSB0eXBlIG1hdGNoaW5nIFQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBpbnQgaXMoKSBjb25zdCB7CisgICAgLy8gSWYgVCBpcyBQVDEvUFQyIGNob29zZSBJbm5lclVuaW9uMSBvdGhlcndpc2UgY2hvb3NlIElubmVyVW5pb24yLgorICAgIHVzaW5nIFR5ID0gdHlwZW5hbWUgOjpsbHZtOjpQb2ludGVyVW5pb25UeXBlU2VsZWN0b3I8CisgICAgICAgIFBUMSwgVCwgSW5uZXJVbmlvbjEsCisgICAgICAgIDo6bGx2bTo6UG9pbnRlclVuaW9uVHlwZVNlbGVjdG9yPFBUMiwgVCwgSW5uZXJVbmlvbjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElubmVyVW5pb24yPj46OlJldHVybjsKKyAgICByZXR1cm4gVmFsLnRlbXBsYXRlIGlzPFR5PigpICYmIFZhbC50ZW1wbGF0ZSBnZXQ8VHk+KCkudGVtcGxhdGUgaXM8VD4oKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgdHlwZS4KKyAgLy8vCisgIC8vLyBJZiB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgdHlwZSBpcyBpbmNvcnJlY3QsIGFzc2VydC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgZ2V0KCkgY29uc3QgeworICAgIGFzc2VydChpczxUPigpICYmICJJbnZhbGlkIGFjY2Vzc29yIGNhbGxlZCIpOworICAgIC8vIElmIFQgaXMgUFQxL1BUMiBjaG9vc2UgSW5uZXJVbmlvbjEgb3RoZXJ3aXNlIGNob29zZSBJbm5lclVuaW9uMi4KKyAgICB1c2luZyBUeSA9IHR5cGVuYW1lIDo6bGx2bTo6UG9pbnRlclVuaW9uVHlwZVNlbGVjdG9yPAorICAgICAgICBQVDEsIFQsIElubmVyVW5pb24xLAorICAgICAgICA6Omxsdm06OlBvaW50ZXJVbmlvblR5cGVTZWxlY3RvcjxQVDIsIFQsIElubmVyVW5pb24xLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbm5lclVuaW9uMj4+OjpSZXR1cm47CisgICAgcmV0dXJuIFZhbC50ZW1wbGF0ZSBnZXQ8VHk+KCkudGVtcGxhdGUgZ2V0PFQ+KCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgY3VycmVudCBwb2ludGVyIGlmIGl0IGlzIG9mIHRoZSBzcGVjaWZpZWQgcG9pbnRlciB0eXBlLAorICAvLy8gb3RoZXJ3aXNlcyByZXR1cm5zIG51bGwuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIGR5bl9jYXN0KCkgY29uc3QgeworICAgIGlmIChpczxUPigpKQorICAgICAgcmV0dXJuIGdldDxUPigpOworICAgIHJldHVybiBUKCk7CisgIH0KKworICAvLy8gQXNzaWdubWVudCBmcm9tIG51bGxwdHIgd2hpY2gganVzdCBjbGVhcnMgdGhlIHVuaW9uLgorICBjb25zdCBQb2ludGVyVW5pb240ICZvcGVyYXRvcj0oc3RkOjpudWxscHRyX3QpIHsKKyAgICBWYWwgPSBudWxscHRyOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBBc3NpZ25tZW50IG9wZXJhdG9ycyAtIEFsbG93IGFzc2lnbmluZyBpbnRvIHRoaXMgdW5pb24gZnJvbSBlaXRoZXIKKyAgLy8vIHBvaW50ZXIgdHlwZSwgc2V0dGluZyB0aGUgZGlzY3JpbWluYXRvciB0byByZW1lbWJlciB3aGF0IGl0IGNhbWUgZnJvbS4KKyAgY29uc3QgUG9pbnRlclVuaW9uNCAmb3BlcmF0b3I9KGNvbnN0IFBUMSAmUkhTKSB7CisgICAgVmFsID0gSW5uZXJVbmlvbjEoUkhTKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgY29uc3QgUG9pbnRlclVuaW9uNCAmb3BlcmF0b3I9KGNvbnN0IFBUMiAmUkhTKSB7CisgICAgVmFsID0gSW5uZXJVbmlvbjEoUkhTKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgY29uc3QgUG9pbnRlclVuaW9uNCAmb3BlcmF0b3I9KGNvbnN0IFBUMyAmUkhTKSB7CisgICAgVmFsID0gSW5uZXJVbmlvbjIoUkhTKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgY29uc3QgUG9pbnRlclVuaW9uNCAmb3BlcmF0b3I9KGNvbnN0IFBUNCAmUkhTKSB7CisgICAgVmFsID0gSW5uZXJVbmlvbjIoUkhTKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkICpnZXRPcGFxdWVWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbC5nZXRPcGFxdWVWYWx1ZSgpOyB9CisgIHN0YXRpYyBpbmxpbmUgUG9pbnRlclVuaW9uNCBnZXRGcm9tT3BhcXVlVmFsdWUodm9pZCAqVlApIHsKKyAgICBQb2ludGVyVW5pb240IFY7CisgICAgVi5WYWwgPSBWYWxUeTo6Z2V0RnJvbU9wYXF1ZVZhbHVlKFZQKTsKKyAgICByZXR1cm4gVjsKKyAgfQorfTsKKworLy8gVGVhY2ggU21hbGxQdHJTZXQgdGhhdCBQb2ludGVyVW5pb240IGlzICJiYXNpY2FsbHkgYSBwb2ludGVyIiwgdGhhdCBoYXMKKy8vICMgbG93IGJpdHMgYXZhaWxhYmxlID0gbWluKFBUMWJpdHMsUFQyYml0cyxQVDJiaXRzKS0yLgordGVtcGxhdGUgPHR5cGVuYW1lIFBUMSwgdHlwZW5hbWUgUFQyLCB0eXBlbmFtZSBQVDMsIHR5cGVuYW1lIFBUND4KK3N0cnVjdCBQb2ludGVyTGlrZVR5cGVUcmFpdHM8UG9pbnRlclVuaW9uNDxQVDEsIFBUMiwgUFQzLCBQVDQ+PiB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCAqCisgIGdldEFzVm9pZFBvaW50ZXIoY29uc3QgUG9pbnRlclVuaW9uNDxQVDEsIFBUMiwgUFQzLCBQVDQ+ICZQKSB7CisgICAgcmV0dXJuIFAuZ2V0T3BhcXVlVmFsdWUoKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgUG9pbnRlclVuaW9uNDxQVDEsIFBUMiwgUFQzLCBQVDQ+IGdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7CisgICAgcmV0dXJuIFBvaW50ZXJVbmlvbjQ8UFQxLCBQVDIsIFBUMywgUFQ0Pjo6Z2V0RnJvbU9wYXF1ZVZhbHVlKFApOworICB9CisKKyAgLy8gVGhlIG51bWJlciBvZiBiaXRzIGF2YWlsYWJsZSBhcmUgdGhlIG1pbiBvZiB0aGUgdHdvIHBvaW50ZXIgdHlwZXMuCisgIGVudW0geworICAgIE51bUxvd0JpdHNBdmFpbGFibGUgPSBQb2ludGVyTGlrZVR5cGVUcmFpdHM8CisgICAgICAgIHR5cGVuYW1lIFBvaW50ZXJVbmlvbjQ8UFQxLCBQVDIsIFBUMywgUFQ0Pjo6VmFsVHk+OjpOdW1Mb3dCaXRzQXZhaWxhYmxlCisgIH07Cit9OworCisvLyBUZWFjaCBEZW5zZU1hcCBob3cgdG8gdXNlIFBvaW50ZXJVbmlvbnMgYXMga2V5cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPFBvaW50ZXJVbmlvbjxULCBVPj4geworICB1c2luZyBQYWlyID0gUG9pbnRlclVuaW9uPFQsIFU+OworICB1c2luZyBGaXJzdEluZm8gPSBEZW5zZU1hcEluZm88VD47CisgIHVzaW5nIFNlY29uZEluZm8gPSBEZW5zZU1hcEluZm88VT47CisKKyAgc3RhdGljIGlubGluZSBQYWlyIGdldEVtcHR5S2V5KCkgeyByZXR1cm4gUGFpcihGaXJzdEluZm86OmdldEVtcHR5S2V5KCkpOyB9CisKKyAgc3RhdGljIGlubGluZSBQYWlyIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gUGFpcihGaXJzdEluZm86OmdldFRvbWJzdG9uZUtleSgpKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgUGFpciAmUGFpclZhbCkgeworICAgIGludHB0cl90IGtleSA9IChpbnRwdHJfdClQYWlyVmFsLmdldE9wYXF1ZVZhbHVlKCk7CisgICAgcmV0dXJuIERlbnNlTWFwSW5mbzxpbnRwdHJfdD46OmdldEhhc2hWYWx1ZShrZXkpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBQYWlyICZMSFMsIGNvbnN0IFBhaXIgJlJIUykgeworICAgIHJldHVybiBMSFMudGVtcGxhdGUgaXM8VD4oKSA9PSBSSFMudGVtcGxhdGUgaXM8VD4oKSAmJgorICAgICAgICAgICAoTEhTLnRlbXBsYXRlIGlzPFQ+KCkgPyBGaXJzdEluZm86OmlzRXF1YWwoTEhTLnRlbXBsYXRlIGdldDxUPigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUkhTLnRlbXBsYXRlIGdldDxUPigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBTZWNvbmRJbmZvOjppc0VxdWFsKExIUy50ZW1wbGF0ZSBnZXQ8VT4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSFMudGVtcGxhdGUgZ2V0PFU+KCkpKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX1BPSU5URVJVTklPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Qb3N0T3JkZXJJdGVyYXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvUG9zdE9yZGVySXRlcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzhhOWI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvUG9zdE9yZGVySXRlcmF0b3IuaApAQCAtMCwwICsxLDMwOSBAQAorLy89PT0tIGxsdm0vQURUL1Bvc3RPcmRlckl0ZXJhdG9yLmggLSBQb3N0T3JkZXIgaXRlcmF0b3IgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgYnVpbGRzIG9uIHRoZSBBRFQvR3JhcGhUcmFpdHMuaCBmaWxlIHRvIGJ1aWxkIGEgZ2VuZXJpYyBncmFwaAorLy8gcG9zdCBvcmRlciBpdGVyYXRvci4gIFRoaXMgc2hvdWxkIHdvcmsgb3ZlciBhbnkgZ3JhcGggdHlwZSB0aGF0IGhhcyBhCisvLyBHcmFwaFRyYWl0cyBzcGVjaWFsaXphdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1BPU1RPUkRFUklURVJBVE9SX0gKKyNkZWZpbmUgTExWTV9BRFRfUE9TVE9SREVSSVRFUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8gVGhlIHBvX2l0ZXJhdG9yX3N0b3JhZ2UgdGVtcGxhdGUgcHJvdmlkZXMgYWNjZXNzIHRvIHRoZSBzZXQgb2YgYWxyZWFkeQorLy8gdmlzaXRlZCBub2RlcyBkdXJpbmcgdGhlIHBvX2l0ZXJhdG9yJ3MgZGVwdGgtZmlyc3QgdHJhdmVyc2FsLgorLy8KKy8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSBjb250YWlucyBhIHNldCBvZiB2aXNpdGVkIG5vZGVzLCB3aGlsZQorLy8gdGhlIEV4dGVybmFsPXRydWUgdmVyc2lvbiB1c2VzIGEgcmVmZXJlbmNlIHRvIGFuIGV4dGVybmFsIHNldC4KKy8vCisvLyBJdCBpcyBwb3NzaWJsZSB0byBwcnVuZSB0aGUgZGVwdGgtZmlyc3QgdHJhdmVyc2FsIGluIHNldmVyYWwgd2F5czoKKy8vCisvLyAtIFdoZW4gcHJvdmlkaW5nIGFuIGV4dGVybmFsIHNldCB0aGF0IGFscmVhZHkgY29udGFpbnMgc29tZSBncmFwaCBub2RlcywKKy8vICAgdGhvc2Ugbm9kZXMgd29uJ3QgYmUgdmlzaXRlZCBhZ2Fpbi4gVGhpcyBpcyB1c2VmdWwgZm9yIHJlc3RhcnRpbmcgYQorLy8gICBwb3N0LW9yZGVyIHRyYXZlcnNhbCBvbiBhIGdyYXBoIHdpdGggbm9kZXMgdGhhdCBhcmVuJ3QgZG9taW5hdGVkIGJ5IGEKKy8vICAgc2luZ2xlIG5vZGUuCisvLworLy8gLSBCeSBwcm92aWRpbmcgYSBjdXN0b20gU2V0VHlwZSBjbGFzcywgdW53YW50ZWQgZ3JhcGggbm9kZXMgY2FuIGJlIGV4Y2x1ZGVkCisvLyAgIGJ5IGhhdmluZyB0aGUgaW5zZXJ0KCkgZnVuY3Rpb24gcmV0dXJuIGZhbHNlLiBUaGlzIGNvdWxkIGZvciBleGFtcGxlCisvLyAgIGNvbmZpbmUgYSBDRkcgdHJhdmVyc2FsIHRvIGJsb2NrcyBpbiBhIHNwZWNpZmljIGxvb3AuCisvLworLy8gLSBGaW5hbGx5LCBieSBzcGVjaWFsaXppbmcgdGhlIHBvX2l0ZXJhdG9yX3N0b3JhZ2UgdGVtcGxhdGUgaXRzZWxmLCBncmFwaAorLy8gICBlZGdlcyBjYW4gYmUgcHJ1bmVkIGJ5IHJldHVybmluZyBmYWxzZSBpbiB0aGUgaW5zZXJ0RWRnZSgpIGZ1bmN0aW9uLiBUaGlzCisvLyAgIGNvdWxkIGJlIHVzZWQgdG8gcmVtb3ZlIGxvb3AgYmFjay1lZGdlcyBmcm9tIHRoZSBDRkcgc2VlbiBieSBwb19pdGVyYXRvci4KKy8vCisvLyBBIHNwZWNpYWxpemVkIHBvX2l0ZXJhdG9yX3N0b3JhZ2UgY2xhc3MgY2FuIG9ic2VydmUgYm90aCB0aGUgcHJlLW9yZGVyIGFuZAorLy8gdGhlIHBvc3Qtb3JkZXIuIFRoZSBpbnNlcnRFZGdlKCkgZnVuY3Rpb24gaXMgY2FsbGVkIGluIGEgcHJlLW9yZGVyLCB3aGlsZQorLy8gdGhlIGZpbmlzaFBvc3RvcmRlcigpIGZ1bmN0aW9uIGlzIGNhbGxlZCBqdXN0IGJlZm9yZSB0aGUgcG9faXRlcmF0b3IgbW92ZXMKKy8vIG9uIHRvIHRoZSBuZXh0IG5vZGUuCisKKy8vLyBEZWZhdWx0IHBvX2l0ZXJhdG9yX3N0b3JhZ2UgaW1wbGVtZW50YXRpb24gd2l0aCBhbiBpbnRlcm5hbCBzZXQgb2JqZWN0LgordGVtcGxhdGU8Y2xhc3MgU2V0VHlwZSwgYm9vbCBFeHRlcm5hbD4KK2NsYXNzIHBvX2l0ZXJhdG9yX3N0b3JhZ2UgeworICBTZXRUeXBlIFZpc2l0ZWQ7CisKK3B1YmxpYzoKKyAgLy8gUmV0dXJuIHRydWUgaWYgZWRnZSBkZXN0aW5hdGlvbiBzaG91bGQgYmUgdmlzaXRlZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVSZWY+CisgIGJvb2wgaW5zZXJ0RWRnZShPcHRpb25hbDxOb2RlUmVmPiBGcm9tLCBOb2RlUmVmIFRvKSB7CisgICAgcmV0dXJuIFZpc2l0ZWQuaW5zZXJ0KFRvKS5zZWNvbmQ7CisgIH0KKworICAvLyBDYWxsZWQgYWZ0ZXIgYWxsIGNoaWxkcmVuIG9mIEJCIGhhdmUgYmVlbiB2aXNpdGVkLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTm9kZVJlZj4gdm9pZCBmaW5pc2hQb3N0b3JkZXIoTm9kZVJlZiBCQikge30KK307CisKKy8vLyBTcGVjaWFsaXphdGlvbiBvZiBwb19pdGVyYXRvcl9zdG9yYWdlIHRoYXQgcmVmZXJlbmNlcyBhbiBleHRlcm5hbCBzZXQuCit0ZW1wbGF0ZTxjbGFzcyBTZXRUeXBlPgorY2xhc3MgcG9faXRlcmF0b3Jfc3RvcmFnZTxTZXRUeXBlLCB0cnVlPiB7CisgIFNldFR5cGUgJlZpc2l0ZWQ7CisKK3B1YmxpYzoKKyAgcG9faXRlcmF0b3Jfc3RvcmFnZShTZXRUeXBlICZWU2V0KSA6IFZpc2l0ZWQoVlNldCkge30KKyAgcG9faXRlcmF0b3Jfc3RvcmFnZShjb25zdCBwb19pdGVyYXRvcl9zdG9yYWdlICZTKSA6IFZpc2l0ZWQoUy5WaXNpdGVkKSB7fQorCisgIC8vIFJldHVybiB0cnVlIGlmIGVkZ2UgZGVzdGluYXRpb24gc2hvdWxkIGJlIHZpc2l0ZWQsIGNhbGxlZCB3aXRoIEZyb20gPSAwIGZvcgorICAvLyB0aGUgcm9vdCBub2RlLgorICAvLyBHcmFwaCBlZGdlcyBjYW4gYmUgcHJ1bmVkIGJ5IHNwZWNpYWxpemluZyB0aGlzIGZ1bmN0aW9uLgorICB0ZW1wbGF0ZSA8Y2xhc3MgTm9kZVJlZj4gYm9vbCBpbnNlcnRFZGdlKE9wdGlvbmFsPE5vZGVSZWY+IEZyb20sIE5vZGVSZWYgVG8pIHsKKyAgICByZXR1cm4gVmlzaXRlZC5pbnNlcnQoVG8pLnNlY29uZDsKKyAgfQorCisgIC8vIENhbGxlZCBhZnRlciBhbGwgY2hpbGRyZW4gb2YgQkIgaGF2ZSBiZWVuIHZpc2l0ZWQuCisgIHRlbXBsYXRlIDxjbGFzcyBOb2RlUmVmPiB2b2lkIGZpbmlzaFBvc3RvcmRlcihOb2RlUmVmIEJCKSB7fQorfTsKKwordGVtcGxhdGUgPGNsYXNzIEdyYXBoVCwKKyAgICAgICAgICBjbGFzcyBTZXRUeXBlID0KKyAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8dHlwZW5hbWUgR3JhcGhUcmFpdHM8R3JhcGhUPjo6Tm9kZVJlZiwgOD4sCisgICAgICAgICAgYm9vbCBFeHRTdG9yYWdlID0gZmFsc2UsIGNsYXNzIEdUID0gR3JhcGhUcmFpdHM8R3JhcGhUPj4KK2NsYXNzIHBvX2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCB0eXBlbmFtZSBHVDo6Tm9kZVJlZj4sCisgICAgICBwdWJsaWMgcG9faXRlcmF0b3Jfc3RvcmFnZTxTZXRUeXBlLCBFeHRTdG9yYWdlPiB7CisgIHVzaW5nIHN1cGVyID0gc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCB0eXBlbmFtZSBHVDo6Tm9kZVJlZj47CisgIHVzaW5nIE5vZGVSZWYgPSB0eXBlbmFtZSBHVDo6Tm9kZVJlZjsKKyAgdXNpbmcgQ2hpbGRJdFR5ID0gdHlwZW5hbWUgR1Q6OkNoaWxkSXRlcmF0b3JUeXBlOworCisgIC8vIFZpc2l0U3RhY2sgLSBVc2VkIHRvIG1haW50YWluIHRoZSBvcmRlcmluZy4gIFRvcCA9IGN1cnJlbnQgYmxvY2sKKyAgLy8gRmlyc3QgZWxlbWVudCBpcyBiYXNpYyBibG9jayBwb2ludGVyLCBzZWNvbmQgaXMgdGhlICduZXh0IGNoaWxkJyB0byB2aXNpdAorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Tm9kZVJlZiwgQ2hpbGRJdFR5Pj4gVmlzaXRTdGFjazsKKworICBwb19pdGVyYXRvcihOb2RlUmVmIEJCKSB7CisgICAgdGhpcy0+aW5zZXJ0RWRnZShPcHRpb25hbDxOb2RlUmVmPigpLCBCQik7CisgICAgVmlzaXRTdGFjay5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoQkIsIEdUOjpjaGlsZF9iZWdpbihCQikpKTsKKyAgICB0cmF2ZXJzZUNoaWxkKCk7CisgIH0KKworICBwb19pdGVyYXRvcigpID0gZGVmYXVsdDsgLy8gRW5kIGlzIHdoZW4gc3RhY2sgaXMgZW1wdHkuCisKKyAgcG9faXRlcmF0b3IoTm9kZVJlZiBCQiwgU2V0VHlwZSAmUykKKyAgICAgIDogcG9faXRlcmF0b3Jfc3RvcmFnZTxTZXRUeXBlLCBFeHRTdG9yYWdlPihTKSB7CisgICAgaWYgKHRoaXMtPmluc2VydEVkZ2UoT3B0aW9uYWw8Tm9kZVJlZj4oKSwgQkIpKSB7CisgICAgICBWaXNpdFN0YWNrLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihCQiwgR1Q6OmNoaWxkX2JlZ2luKEJCKSkpOworICAgICAgdHJhdmVyc2VDaGlsZCgpOworICAgIH0KKyAgfQorCisgIHBvX2l0ZXJhdG9yKFNldFR5cGUgJlMpCisgICAgICA6IHBvX2l0ZXJhdG9yX3N0b3JhZ2U8U2V0VHlwZSwgRXh0U3RvcmFnZT4oUykgeworICB9IC8vIEVuZCBpcyB3aGVuIHN0YWNrIGlzIGVtcHR5LgorCisgIHZvaWQgdHJhdmVyc2VDaGlsZCgpIHsKKyAgICB3aGlsZSAoVmlzaXRTdGFjay5iYWNrKCkuc2Vjb25kICE9IEdUOjpjaGlsZF9lbmQoVmlzaXRTdGFjay5iYWNrKCkuZmlyc3QpKSB7CisgICAgICBOb2RlUmVmIEJCID0gKlZpc2l0U3RhY2suYmFjaygpLnNlY29uZCsrOworICAgICAgaWYgKHRoaXMtPmluc2VydEVkZ2UoT3B0aW9uYWw8Tm9kZVJlZj4oVmlzaXRTdGFjay5iYWNrKCkuZmlyc3QpLCBCQikpIHsKKyAgICAgICAgLy8gSWYgdGhlIGJsb2NrIGlzIG5vdCB2aXNpdGVkLi4uCisgICAgICAgIFZpc2l0U3RhY2sucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEJCLCBHVDo6Y2hpbGRfYmVnaW4oQkIpKSk7CisgICAgICB9CisgICAgfQorICB9CisKK3B1YmxpYzoKKyAgdXNpbmcgcG9pbnRlciA9IHR5cGVuYW1lIHN1cGVyOjpwb2ludGVyOworCisgIC8vIFByb3ZpZGUgc3RhdGljICJjb25zdHJ1Y3RvcnMiLi4uCisgIHN0YXRpYyBwb19pdGVyYXRvciBiZWdpbihHcmFwaFQgRykgeworICAgIHJldHVybiBwb19pdGVyYXRvcihHVDo6Z2V0RW50cnlOb2RlKEcpKTsKKyAgfQorICBzdGF0aWMgcG9faXRlcmF0b3IgZW5kKEdyYXBoVCBHKSB7IHJldHVybiBwb19pdGVyYXRvcigpOyB9CisKKyAgc3RhdGljIHBvX2l0ZXJhdG9yIGJlZ2luKEdyYXBoVCBHLCBTZXRUeXBlICZTKSB7CisgICAgcmV0dXJuIHBvX2l0ZXJhdG9yKEdUOjpnZXRFbnRyeU5vZGUoRyksIFMpOworICB9CisgIHN0YXRpYyBwb19pdGVyYXRvciBlbmQoR3JhcGhUIEcsIFNldFR5cGUgJlMpIHsgcmV0dXJuIHBvX2l0ZXJhdG9yKFMpOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHBvX2l0ZXJhdG9yICZ4KSBjb25zdCB7CisgICAgcmV0dXJuIFZpc2l0U3RhY2sgPT0geC5WaXNpdFN0YWNrOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBwb19pdGVyYXRvciAmeCkgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSB4KTsgfQorCisgIGNvbnN0IE5vZGVSZWYgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIFZpc2l0U3RhY2suYmFjaygpLmZpcnN0OyB9CisKKyAgLy8gVGhpcyBpcyBhIG5vbnN0YW5kYXJkIG9wZXJhdG9yLT4gdGhhdCBkZXJlZmVyZW5jZXMgdGhlIHBvaW50ZXIgYW4gZXh0cmEKKyAgLy8gdGltZS4uLiBzbyB0aGF0IHlvdSBjYW4gYWN0dWFsbHkgY2FsbCBtZXRob2RzIE9OIHRoZSBCYXNpY0Jsb2NrLCBiZWNhdXNlCisgIC8vIHRoZSBjb250YWluZWQgdHlwZSBpcyBhIHBvaW50ZXIuICBUaGlzIGFsbG93cyBCQkl0LT5nZXRUZXJtaW5hdG9yKCkgZi5lLgorICAvLworICBOb2RlUmVmIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAqKnRoaXM7IH0KKworICBwb19pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsgLy8gUHJlaW5jcmVtZW50CisgICAgdGhpcy0+ZmluaXNoUG9zdG9yZGVyKFZpc2l0U3RhY2suYmFjaygpLmZpcnN0KTsKKyAgICBWaXNpdFN0YWNrLnBvcF9iYWNrKCk7CisgICAgaWYgKCFWaXNpdFN0YWNrLmVtcHR5KCkpCisgICAgICB0cmF2ZXJzZUNoaWxkKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgcG9faXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgLy8gUG9zdGluY3JlbWVudAorICAgIHBvX2l0ZXJhdG9yIHRtcCA9ICp0aGlzOworICAgICsrKnRoaXM7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorfTsKKworLy8gUHJvdmlkZSBnbG9iYWwgY29uc3RydWN0b3JzIHRoYXQgYXV0b21hdGljYWxseSBmaWd1cmUgb3V0IGNvcnJlY3QgdHlwZXMuLi4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3BvX2l0ZXJhdG9yPFQ+IHBvX2JlZ2luKGNvbnN0IFQgJkcpIHsgcmV0dXJuIHBvX2l0ZXJhdG9yPFQ+OjpiZWdpbihHKTsgfQordGVtcGxhdGUgPGNsYXNzIFQ+Citwb19pdGVyYXRvcjxUPiBwb19lbmQgIChjb25zdCBUICZHKSB7IHJldHVybiBwb19pdGVyYXRvcjxUPjo6ZW5kKEcpOyB9CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBpdGVyYXRvcl9yYW5nZTxwb19pdGVyYXRvcjxUPj4gcG9zdF9vcmRlcihjb25zdCBUICZHKSB7CisgIHJldHVybiBtYWtlX3JhbmdlKHBvX2JlZ2luKEcpLCBwb19lbmQoRykpOworfQorCisvLyBQcm92aWRlIGdsb2JhbCBkZWZpbml0aW9ucyBvZiBleHRlcm5hbCBwb3N0b3JkZXIgaXRlcmF0b3JzLi4uCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgU2V0VHlwZSA9IHN0ZDo6c2V0PHR5cGVuYW1lIEdyYXBoVHJhaXRzPFQ+OjpOb2RlUmVmPj4KK3N0cnVjdCBwb19leHRfaXRlcmF0b3IgOiBwdWJsaWMgcG9faXRlcmF0b3I8VCwgU2V0VHlwZSwgdHJ1ZT4geworICBwb19leHRfaXRlcmF0b3IoY29uc3QgcG9faXRlcmF0b3I8VCwgU2V0VHlwZSwgdHJ1ZT4gJlYpIDoKKyAgcG9faXRlcmF0b3I8VCwgU2V0VHlwZSwgdHJ1ZT4oVikge30KK307CisKK3RlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFNldFR5cGU+Citwb19leHRfaXRlcmF0b3I8VCwgU2V0VHlwZT4gcG9fZXh0X2JlZ2luKFQgRywgU2V0VHlwZSAmUykgeworICByZXR1cm4gcG9fZXh0X2l0ZXJhdG9yPFQsIFNldFR5cGU+OjpiZWdpbihHLCBTKTsKK30KKwordGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgU2V0VHlwZT4KK3BvX2V4dF9pdGVyYXRvcjxULCBTZXRUeXBlPiBwb19leHRfZW5kKFQgRywgU2V0VHlwZSAmUykgeworICByZXR1cm4gcG9fZXh0X2l0ZXJhdG9yPFQsIFNldFR5cGU+OjplbmQoRywgUyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBTZXRUeXBlPgoraXRlcmF0b3JfcmFuZ2U8cG9fZXh0X2l0ZXJhdG9yPFQsIFNldFR5cGU+PiBwb3N0X29yZGVyX2V4dChjb25zdCBUICZHLCBTZXRUeXBlICZTKSB7CisgIHJldHVybiBtYWtlX3JhbmdlKHBvX2V4dF9iZWdpbihHLCBTKSwgcG9fZXh0X2VuZChHLCBTKSk7Cit9CisKKy8vIFByb3ZpZGUgZ2xvYmFsIGRlZmluaXRpb25zIG9mIGludmVyc2UgcG9zdCBvcmRlciBpdGVyYXRvcnMuLi4KK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBTZXRUeXBlID0gc3RkOjpzZXQ8dHlwZW5hbWUgR3JhcGhUcmFpdHM8VD46Ok5vZGVSZWY+LAorICAgICAgICAgIGJvb2wgRXh0ZXJuYWwgPSBmYWxzZT4KK3N0cnVjdCBpcG9faXRlcmF0b3IgOiBwdWJsaWMgcG9faXRlcmF0b3I8SW52ZXJzZTxUPiwgU2V0VHlwZSwgRXh0ZXJuYWw+IHsKKyAgaXBvX2l0ZXJhdG9yKGNvbnN0IHBvX2l0ZXJhdG9yPEludmVyc2U8VD4sIFNldFR5cGUsIEV4dGVybmFsPiAmVikgOgorICAgICBwb19pdGVyYXRvcjxJbnZlcnNlPFQ+LCBTZXRUeXBlLCBFeHRlcm5hbD4gKFYpIHt9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lwb19pdGVyYXRvcjxUPiBpcG9fYmVnaW4oY29uc3QgVCAmRykgeworICByZXR1cm4gaXBvX2l0ZXJhdG9yPFQ+OjpiZWdpbihHKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFQ+CitpcG9faXRlcmF0b3I8VD4gaXBvX2VuZChjb25zdCBUICZHKXsKKyAgcmV0dXJuIGlwb19pdGVyYXRvcjxUPjo6ZW5kKEcpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2l0ZXJhdG9yX3JhbmdlPGlwb19pdGVyYXRvcjxUPj4gaW52ZXJzZV9wb3N0X29yZGVyKGNvbnN0IFQgJkcpIHsKKyAgcmV0dXJuIG1ha2VfcmFuZ2UoaXBvX2JlZ2luKEcpLCBpcG9fZW5kKEcpKTsKK30KKworLy8gUHJvdmlkZSBnbG9iYWwgZGVmaW5pdGlvbnMgb2YgZXh0ZXJuYWwgaW52ZXJzZSBwb3N0b3JkZXIgaXRlcmF0b3JzLi4uCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgU2V0VHlwZSA9IHN0ZDo6c2V0PHR5cGVuYW1lIEdyYXBoVHJhaXRzPFQ+OjpOb2RlUmVmPj4KK3N0cnVjdCBpcG9fZXh0X2l0ZXJhdG9yIDogcHVibGljIGlwb19pdGVyYXRvcjxULCBTZXRUeXBlLCB0cnVlPiB7CisgIGlwb19leHRfaXRlcmF0b3IoY29uc3QgaXBvX2l0ZXJhdG9yPFQsIFNldFR5cGUsIHRydWU+ICZWKSA6CisgICAgaXBvX2l0ZXJhdG9yPFQsIFNldFR5cGUsIHRydWU+KFYpIHt9CisgIGlwb19leHRfaXRlcmF0b3IoY29uc3QgcG9faXRlcmF0b3I8SW52ZXJzZTxUPiwgU2V0VHlwZSwgdHJ1ZT4gJlYpIDoKKyAgICBpcG9faXRlcmF0b3I8VCwgU2V0VHlwZSwgdHJ1ZT4oVikge30KK307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBTZXRUeXBlPgoraXBvX2V4dF9pdGVyYXRvcjxULCBTZXRUeXBlPiBpcG9fZXh0X2JlZ2luKGNvbnN0IFQgJkcsIFNldFR5cGUgJlMpIHsKKyAgcmV0dXJuIGlwb19leHRfaXRlcmF0b3I8VCwgU2V0VHlwZT46OmJlZ2luKEcsIFMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgU2V0VHlwZT4KK2lwb19leHRfaXRlcmF0b3I8VCwgU2V0VHlwZT4gaXBvX2V4dF9lbmQoY29uc3QgVCAmRywgU2V0VHlwZSAmUykgeworICByZXR1cm4gaXBvX2V4dF9pdGVyYXRvcjxULCBTZXRUeXBlPjo6ZW5kKEcsIFMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgU2V0VHlwZT4KK2l0ZXJhdG9yX3JhbmdlPGlwb19leHRfaXRlcmF0b3I8VCwgU2V0VHlwZT4+CitpbnZlcnNlX3Bvc3Rfb3JkZXJfZXh0KGNvbnN0IFQgJkcsIFNldFR5cGUgJlMpIHsKKyAgcmV0dXJuIG1ha2VfcmFuZ2UoaXBvX2V4dF9iZWdpbihHLCBTKSwgaXBvX2V4dF9lbmQoRywgUykpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFJldmVyc2UgUG9zdCBPcmRlciBDRkcgaXRlcmF0b3IgY29kZQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBpcyB1c2VkIHRvIHZpc2l0IGJhc2ljIGJsb2NrcyBpbiBhIG1ldGhvZCBpbiByZXZlcnNlIHBvc3Qgb3JkZXIuICBUaGlzCisvLyBjbGFzcyBpcyBhd2t3YXJkIHRvIHVzZSBiZWNhdXNlIEkgZG9uJ3Qga25vdyBhIGdvb2QgaW5jcmVtZW50YWwgYWxnb3JpdGhtIHRvCisvLyBjb21wdXRlciBSUE8gZnJvbSBhIGdyYXBoLiAgQmVjYXVzZSBvZiB0aGlzLCB0aGUgY29uc3RydWN0aW9uIG9mIHRoZQorLy8gUmV2ZXJzZVBvc3RPcmRlclRyYXZlcnNhbCBvYmplY3QgaXMgZXhwZW5zaXZlIChpdCBtdXN0IHdhbGsgdGhlIGVudGlyZSBncmFwaAorLy8gd2l0aCBhIHBvc3RvcmRlciBpdGVyYXRvciB0byBidWlsZCB0aGUgZGF0YSBzdHJ1Y3R1cmVzKS4gIFRoZSBtb3JhbCBvZiB0aGlzCisvLyBzdG9yeSBpczogRG9uJ3QgY3JlYXRlIG1vcmUgUmV2ZXJzZVBvc3RPcmRlclRyYXZlcnNhbCBjbGFzc2VzIHRoYW4gbmVjZXNzYXJ5LgorLy8KKy8vIEJlY2F1c2UgaXQgZG9lcyB0aGUgdHJhdmVyc2FsIGluIGl0cyBjb25zdHJ1Y3RvciwgaXQgd29uJ3QgaW52YWxpZGF0ZSB3aGVuCisvLyBCYXNpY0Jsb2NrcyBhcmUgcmVtb3ZlZCwgKmJ1dCogaXQgbWF5IGNvbnRhaW4gZXJhc2VkIGJsb2Nrcy4gU29tZSBwbGFjZXMKKy8vIHJlbHkgb24gdGhpcyBiZWhhdmlvciAoaS5lLiBHVk4pLgorLy8KKy8vIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHVzZWQgbGlrZSB0aGlzOgorLy8geworLy8gICBSZXZlcnNlUG9zdE9yZGVyVHJhdmVyc2FsPEZ1bmN0aW9uKj4gUlBPVChGdW5jUHRyKTsgLy8gRXhwZW5zaXZlIHRvIGNyZWF0ZQorLy8gICBmb3IgKHJwb19pdGVyYXRvciBJID0gUlBPVC5iZWdpbigpOyBJICE9IFJQT1QuZW5kKCk7ICsrSSkgeworLy8gICAgICAuLi4KKy8vICAgfQorLy8gICBmb3IgKHJwb19pdGVyYXRvciBJID0gUlBPVC5iZWdpbigpOyBJICE9IFJQT1QuZW5kKCk7ICsrSSkgeworLy8gICAgICAuLi4KKy8vICAgfQorLy8gfQorLy8KKwordGVtcGxhdGU8Y2xhc3MgR3JhcGhULCBjbGFzcyBHVCA9IEdyYXBoVHJhaXRzPEdyYXBoVD4+CitjbGFzcyBSZXZlcnNlUG9zdE9yZGVyVHJhdmVyc2FsIHsKKyAgdXNpbmcgTm9kZVJlZiA9IHR5cGVuYW1lIEdUOjpOb2RlUmVmOworCisgIHN0ZDo6dmVjdG9yPE5vZGVSZWY+IEJsb2NrczsgLy8gQmxvY2sgbGlzdCBpbiBub3JtYWwgUE8gb3JkZXIKKworICB2b2lkIEluaXRpYWxpemUoTm9kZVJlZiBCQikgeworICAgIHN0ZDo6Y29weShwb19iZWdpbihCQiksIHBvX2VuZChCQiksIHN0ZDo6YmFja19pbnNlcnRlcihCbG9ja3MpKTsKKyAgfQorCitwdWJsaWM6CisgIHVzaW5nIHJwb19pdGVyYXRvciA9IHR5cGVuYW1lIHN0ZDo6dmVjdG9yPE5vZGVSZWY+OjpyZXZlcnNlX2l0ZXJhdG9yOworCisgIFJldmVyc2VQb3N0T3JkZXJUcmF2ZXJzYWwoR3JhcGhUIEcpIHsgSW5pdGlhbGl6ZShHVDo6Z2V0RW50cnlOb2RlKEcpKTsgfQorCisgIC8vIEJlY2F1c2Ugd2Ugd2FudCBhIHJldmVyc2UgcG9zdCBvcmRlciwgdXNlIHJldmVyc2UgaXRlcmF0b3JzIGZyb20gdGhlIHZlY3RvcgorICBycG9faXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBCbG9ja3MucmJlZ2luKCk7IH0KKyAgcnBvX2l0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIEJsb2Nrcy5yZW5kKCk7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9QT1NUT1JERVJJVEVSQVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Qcmlvcml0eVF1ZXVlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Qcmlvcml0eVF1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJhODcxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1ByaW9yaXR5UXVldWUuaApAQCAtMCwwICsxLDgzIEBACisvLz09PS0gbGx2bS9BRFQvUHJpb3JpdHlRdWV1ZS5oIC0gUHJpb3JpdHkgcXVldWVzIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBQcmlvcml0eVF1ZXVlIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfUFJJT1JJVFlRVUVVRV9ICisjZGVmaW5lIExMVk1fQURUX1BSSU9SSVRZUVVFVUVfSAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHF1ZXVlPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBQcmlvcml0eVF1ZXVlIC0gVGhpcyBjbGFzcyBiZWhhdmVzIGxpa2Ugc3RkOjpwcmlvcml0eV9xdWV1ZSBhbmQKKy8vLyBwcm92aWRlcyBhIGZldyBhZGRpdGlvbmFsIGNvbnZlbmllbmNlIGZ1bmN0aW9ucy4KKy8vLwordGVtcGxhdGU8Y2xhc3MgVCwKKyAgICAgICAgIGNsYXNzIFNlcXVlbmNlID0gc3RkOjp2ZWN0b3I8VD4sCisgICAgICAgICBjbGFzcyBDb21wYXJlID0gc3RkOjpsZXNzPHR5cGVuYW1lIFNlcXVlbmNlOjp2YWx1ZV90eXBlPiA+CitjbGFzcyBQcmlvcml0eVF1ZXVlIDogcHVibGljIHN0ZDo6cHJpb3JpdHlfcXVldWU8VCwgU2VxdWVuY2UsIENvbXBhcmU+IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgUHJpb3JpdHlRdWV1ZShjb25zdCBDb21wYXJlICZjb21wYXJlID0gQ29tcGFyZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlcXVlbmNlICZzZXF1ZW5jZSA9IFNlcXVlbmNlKCkpCisgICAgOiBzdGQ6OnByaW9yaXR5X3F1ZXVlPFQsIFNlcXVlbmNlLCBDb21wYXJlPihjb21wYXJlLCBzZXF1ZW5jZSkKKyAge30KKworICB0ZW1wbGF0ZTxjbGFzcyBJdGVyYXRvcj4KKyAgUHJpb3JpdHlRdWV1ZShJdGVyYXRvciBiZWdpbiwgSXRlcmF0b3IgZW5kLAorICAgICAgICAgICAgICAgIGNvbnN0IENvbXBhcmUgJmNvbXBhcmUgPSBDb21wYXJlKCksCisgICAgICAgICAgICAgICAgY29uc3QgU2VxdWVuY2UgJnNlcXVlbmNlID0gU2VxdWVuY2UoKSkKKyAgICA6IHN0ZDo6cHJpb3JpdHlfcXVldWU8VCwgU2VxdWVuY2UsIENvbXBhcmU+KGJlZ2luLCBlbmQsIGNvbXBhcmUsIHNlcXVlbmNlKQorICB7fQorCisgIC8vLyBlcmFzZV9vbmUgLSBFcmFzZSBvbmUgZWxlbWVudCBmcm9tIHRoZSBxdWV1ZSwgcmVnYXJkbGVzcyBvZiBpdHMKKyAgLy8vIHBvc2l0aW9uLiBUaGlzIG9wZXJhdGlvbiBwZXJmb3JtcyBhIGxpbmVhciBzZWFyY2ggdG8gZmluZCBhbiBlbGVtZW50CisgIC8vLyBlcXVhbCB0byB0LCBidXQgdGhlbiB1c2VzIGFsbCBsb2dhcml0aG1pYy10aW1lIGFsZ29yaXRobXMgdG8gZG8KKyAgLy8vIHRoZSBlcmFzZSBvcGVyYXRpb24uCisgIC8vLworICB2b2lkIGVyYXNlX29uZShjb25zdCBUICZ0KSB7CisgICAgLy8gTGluZWFyLXNlYXJjaCB0byBmaW5kIHRoZSBlbGVtZW50LgorICAgIHR5cGVuYW1lIFNlcXVlbmNlOjpzaXplX3R5cGUgaSA9IGZpbmQodGhpcy0+YywgdCkgLSB0aGlzLT5jLmJlZ2luKCk7CisKKyAgICAvLyBMb2dhcml0aG1pYy10aW1lIGhlYXAgYnViYmxlLXVwLgorICAgIHdoaWxlIChpICE9IDApIHsKKyAgICAgIHR5cGVuYW1lIFNlcXVlbmNlOjpzaXplX3R5cGUgcGFyZW50ID0gKGkgLSAxKSAvIDI7CisgICAgICB0aGlzLT5jW2ldID0gdGhpcy0+Y1twYXJlbnRdOworICAgICAgaSA9IHBhcmVudDsKKyAgICB9CisKKyAgICAvLyBUaGUgZWxlbWVudCB3ZSB3YW50IHRvIHJlbW92ZSBpcyBub3cgYXQgdGhlIHJvb3QsIHNvIHdlIGNhbiB1c2UKKyAgICAvLyBwcmlvcml0eV9xdWV1ZSdzIHBsYWluIHBvcCB0byByZW1vdmUgaXQuCisgICAgdGhpcy0+cG9wKCk7CisgIH0KKworICAvLy8gcmVoZWFwaWZ5IC0gSWYgYW4gZWxlbWVudCBpbiB0aGUgcXVldWUgaGFzIGNoYW5nZWQgaW4gYSB3YXkgdGhhdAorICAvLy8gYWZmZWN0cyBpdHMgc3RhbmRpbmcgaW4gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb24sIHRoZSBxdWV1ZSdzCisgIC8vLyBpbnRlcm5hbCBzdGF0ZSBiZWNvbWVzIGludmFsaWQuIENhbGxpbmcgcmVoZWFwaWZ5KCkgcmVzZXRzIHRoZQorICAvLy8gcXVldWUncyBzdGF0ZSwgbWFraW5nIGl0IHZhbGlkIGFnYWluLiBUaGlzIG9wZXJhdGlvbiBoYXMgdGltZQorICAvLy8gY29tcGxleGl0eSBwcm9wb3J0aW9uYWwgdG8gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcXVldWUsCisgIC8vLyBzbyBkb24ndCBwbGFuIHRvIHVzZSBpdCBhIGxvdC4KKyAgLy8vCisgIHZvaWQgcmVoZWFwaWZ5KCkgeworICAgIHN0ZDo6bWFrZV9oZWFwKHRoaXMtPmMuYmVnaW4oKSwgdGhpcy0+Yy5lbmQoKSwgdGhpcy0+Y29tcCk7CisgIH0KKworICAvLy8gY2xlYXIgLSBFcmFzZSBhbGwgZWxlbWVudHMgZnJvbSB0aGUgcXVldWUuCisgIC8vLworICB2b2lkIGNsZWFyKCkgeworICAgIHRoaXMtPmMuY2xlYXIoKTsKKyAgfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Qcmlvcml0eVdvcmtsaXN0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9Qcmlvcml0eVdvcmtsaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWE1MzFmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1ByaW9yaXR5V29ya2xpc3QuaApAQCAtMCwwICsxLDI2NiBAQAorLy89PT0tIFByaW9yaXR5V29ya2xpc3QuaCAtIFdvcmtsaXN0IHdpdGggaW5zZXJ0aW9uIHByaW9yaXR5IC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8KKy8vLyBUaGlzIGZpbGUgcHJvdmlkZXMgYSBwcmlvcml0eSB3b3JrbGlzdC4gU2VlIHRoZSBjbGFzcyBjb21tZW50cyBmb3IgZGV0YWlscy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9QUklPUklUWVdPUktMSVNUX0gKKyNkZWZpbmUgTExWTV9BRFRfUFJJT1JJVFlXT1JLTElTVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEEgRklMTyB3b3JrbGlzdCB0aGF0IHByaW9yaXRpemVzIG9uIHJlLWluc2VydGlvbiB3aXRob3V0IGR1cGxpY2F0aW9uLgorLy8vCisvLy8gVGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gYSBcYyBTZXRWZWN0b3Igd2l0aCB0aGUgcHJpbWFyeSBkaWZmZXJlbmNlIHRoYXQKKy8vLyB3aGlsZSByZS1pbnNlcnRpb24gZG9lcyBub3QgY3JlYXRlIGEgZHVwbGljYXRlLCBpdCBkb2VzIGFkanVzdCB0aGUKKy8vLyB2aXNpdGF0aW9uIG9yZGVyIHRvIHJlc3BlY3QgdGhlIGxhc3QgaW5zZXJ0aW9uIHBvaW50LiBUaGlzIGNhbiBiZSB1c2VmdWwKKy8vLyB3aGVuIHRoZSB2aXNpdCBvcmRlciBuZWVkcyB0byBiZSBwcmlvcml0aXplZCBiYXNlZCBvbiBpbnNlcnRpb24gcG9pbnQKKy8vLyB3aXRob3V0IGFjdHVhbGx5IGhhdmluZyBkdXBsaWNhdGUgdmlzaXRzLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgZG9lc24ndCBwcmV2ZW50IHJlLWluc2VydGlvbiBvZiBlbGVtZW50cyB3aGljaCBoYXZlIGJlZW4KKy8vLyB2aXNpdGVkIC0tIGlmIHlvdSBuZWVkIHRvIGJyZWFrIGN5Y2xlcywgYSBzZXQgd2lsbCBzdGlsbCBiZSBuZWNlc3NhcnkuCisvLy8KKy8vLyBUaGUgdHlwZSBcYyBUIG11c3QgYmUgZGVmYXVsdCBjb25zdHJ1Y3RhYmxlIHRvIGEgbnVsbCB2YWx1ZSB0aGF0IHdpbGwgYmUKKy8vLyBpZ25vcmVkLiBJdCBpcyBhbiBlcnJvciB0byBpbnNlcnQgc3VjaCBhIHZhbHVlLCBhbmQgcG9wcGluZyBlbGVtZW50cyB3aWxsCisvLy8gbmV2ZXIgcHJvZHVjZSBzdWNoIGEgdmFsdWUuIEl0IGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQgd2l0aCBjb21tb24gbnVsbGFibGUKKy8vLyB0eXBlcyBsaWtlIHBvaW50ZXJzIG9yIG9wdGlvbmFscy4KKy8vLworLy8vIEludGVybmFsbHkgdGhpcyB1c2VzIGEgdmVjdG9yIHRvIHN0b3JlIHRoZSB3b3JrbGlzdCBhbmQgYSBtYXAgdG8gaWRlbnRpZnkKKy8vLyBleGlzdGluZyBlbGVtZW50cyBpbiB0aGUgd29ya2xpc3QuIEJvdGggb2YgdGhlc2UgbWF5IGJlIGN1c3RvbWl6ZWQsIGJ1dCB0aGUKKy8vLyBtYXAgbXVzdCBzdXBwb3J0IHRoZSBiYXNpYyBEZW5zZU1hcCBBUEkgZm9yIG1hcHBpbmcgZnJvbSBhIFQgdG8gYW4gaW50ZWdlcgorLy8vIGluZGV4IGludG8gdGhlIHZlY3Rvci4KKy8vLworLy8vIEEgcGFydGlhbCBzcGVjaWFsaXphdGlvbiBpcyBwcm92aWRlZCB0byBhdXRvbWF0aWNhbGx5IHNlbGVjdCBhIFNtYWxsVmVjdG9yCisvLy8gYW5kIGEgU21hbGxEZW5zZU1hcCBpZiBjdXN0b20gZGF0YSBzdHJ1Y3R1cmVzIGFyZSBub3QgcHJvdmlkZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVmVjdG9yVCA9IHN0ZDo6dmVjdG9yPFQ+LAorICAgICAgICAgIHR5cGVuYW1lIE1hcFQgPSBEZW5zZU1hcDxULCBwdHJkaWZmX3Q+PgorY2xhc3MgUHJpb3JpdHlXb3JrbGlzdCB7CitwdWJsaWM6CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBUOworICB1c2luZyBrZXlfdHlwZSA9IFQ7CisgIHVzaW5nIHJlZmVyZW5jZSA9IFQmOworICB1c2luZyBjb25zdF9yZWZlcmVuY2UgPSBjb25zdCBUJjsKKyAgdXNpbmcgc2l6ZV90eXBlID0gdHlwZW5hbWUgTWFwVDo6c2l6ZV90eXBlOworCisgIC8vLyBDb25zdHJ1Y3QgYW4gZW1wdHkgUHJpb3JpdHlXb3JrbGlzdAorICBQcmlvcml0eVdvcmtsaXN0KCkgPSBkZWZhdWx0OworCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIFByaW9yaXR5V29ya2xpc3QgaXMgZW1wdHkgb3Igbm90LgorICBib29sIGVtcHR5KCkgY29uc3QgeworICAgIHJldHVybiBWLmVtcHR5KCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSB3b3JrbGlzdC4KKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIE0uc2l6ZSgpOworICB9CisKKyAgLy8vIENvdW50IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgYSBnaXZlbiBrZXkgaW4gdGhlIFByaW9yaXR5V29ya2xpc3QuCisgIC8vLyBccmV0dXJucyAwIGlmIHRoZSBlbGVtZW50IGlzIG5vdCBpbiB0aGUgUHJpb3JpdHlXb3JrbGlzdCwgMSBpZiBpdCBpcy4KKyAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IGtleV90eXBlICZrZXkpIGNvbnN0IHsKKyAgICByZXR1cm4gTS5jb3VudChrZXkpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBQcmlvcml0eVdvcmtsaXN0LgorICBjb25zdCBUICZiYWNrKCkgY29uc3QgeworICAgIGFzc2VydCghZW1wdHkoKSAmJiAiQ2Fubm90IGNhbGwgYmFjaygpIG9uIGVtcHR5IFByaW9yaXR5V29ya2xpc3QhIik7CisgICAgcmV0dXJuIFYuYmFjaygpOworICB9CisKKyAgLy8vIEluc2VydCBhIG5ldyBlbGVtZW50IGludG8gdGhlIFByaW9yaXR5V29ya2xpc3QuCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoZSBlbGVtZW50IHdhcyBpbnNlcnRlZCBpbnRvIHRoZSBQcmlvcml0eVdvcmtsaXN0LgorICBib29sIGluc2VydChjb25zdCBUICZYKSB7CisgICAgYXNzZXJ0KFggIT0gVCgpICYmICJDYW5ub3QgaW5zZXJ0IGEgbnVsbCAoZGVmYXVsdCBjb25zdHJ1Y3RlZCkgdmFsdWUhIik7CisgICAgYXV0byBJbnNlcnRSZXN1bHQgPSBNLmluc2VydCh7WCwgVi5zaXplKCl9KTsKKyAgICBpZiAoSW5zZXJ0UmVzdWx0LnNlY29uZCkgeworICAgICAgLy8gRnJlc2ggdmFsdWUsIGp1c3QgYXBwZW5kIGl0IHRvIHRoZSB2ZWN0b3IuCisgICAgICBWLnB1c2hfYmFjayhYKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGF1dG8gJkluZGV4ID0gSW5zZXJ0UmVzdWx0LmZpcnN0LT5zZWNvbmQ7CisgICAgYXNzZXJ0KFZbSW5kZXhdID09IFggJiYgIlZhbHVlIG5vdCBhY3R1YWxseSBhdCBpbmRleCBpbiBtYXAhIik7CisgICAgaWYgKEluZGV4ICE9IChwdHJkaWZmX3QpKFYuc2l6ZSgpIC0gMSkpIHsKKyAgICAgIC8vIElmIHRoZSBlbGVtZW50IGlzbid0IGF0IHRoZSBiYWNrLCBudWxsIGl0IG91dCBhbmQgYXBwZW5kIGEgZnJlc2ggb25lLgorICAgICAgVltJbmRleF0gPSBUKCk7CisgICAgICBJbmRleCA9IChwdHJkaWZmX3QpVi5zaXplKCk7CisgICAgICBWLnB1c2hfYmFjayhYKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIEluc2VydCBhIHNlcXVlbmNlIG9mIG5ldyBlbGVtZW50cyBpbnRvIHRoZSBQcmlvcml0eVdvcmtsaXN0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VxdWVuY2VUPgorICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhc3RkOjppc19jb252ZXJ0aWJsZTxTZXF1ZW5jZVQsIFQ+Ojp2YWx1ZT46OnR5cGUKKyAgaW5zZXJ0KFNlcXVlbmNlVCAmJklucHV0KSB7CisgICAgaWYgKHN0ZDo6YmVnaW4oSW5wdXQpID09IHN0ZDo6ZW5kKElucHV0KSkKKyAgICAgIC8vIE5vdGhpbmcgdG8gZG8gZm9yIGFuIGVtcHR5IGlucHV0IHNlcXVlbmNlLgorICAgICAgcmV0dXJuOworCisgICAgLy8gRmlyc3QgcHVsbCB0aGUgaW5wdXQgc2VxdWVuY2UgaW50byB0aGUgdmVjdG9yIGFzIGEgYnVsayBhcHBlbmQKKyAgICAvLyBvcGVyYXRpb24uCisgICAgcHRyZGlmZl90IFN0YXJ0SW5kZXggPSBWLnNpemUoKTsKKyAgICBWLmluc2VydChWLmVuZCgpLCBzdGQ6OmJlZ2luKElucHV0KSwgc3RkOjplbmQoSW5wdXQpKTsKKyAgICAvLyBOb3cgd2FsayBiYWNrd2FyZHMgZml4aW5nIHVwIHRoZSBpbmRleCBtYXAgYW5kIGRlbGV0aW5nIGFueSBkdXBsaWNhdGVzLgorICAgIGZvciAocHRyZGlmZl90IGkgPSBWLnNpemUoKSAtIDE7IGkgPj0gU3RhcnRJbmRleDsgLS1pKSB7CisgICAgICBhdXRvIEluc2VydFJlc3VsdCA9IE0uaW5zZXJ0KHtWW2ldLCBpfSk7CisgICAgICBpZiAoSW5zZXJ0UmVzdWx0LnNlY29uZCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIElmIHRoZSBleGlzdGluZyBpbmRleCBpcyBiZWZvcmUgdGhpcyBpbnNlcnQncyBzdGFydCwgbnVrZSB0aGF0IG9uZSBhbmQKKyAgICAgIC8vIG1vdmUgaXQgdXAuCisgICAgICBwdHJkaWZmX3QgJkluZGV4ID0gSW5zZXJ0UmVzdWx0LmZpcnN0LT5zZWNvbmQ7CisgICAgICBpZiAoSW5kZXggPCBTdGFydEluZGV4KSB7CisgICAgICAgIFZbSW5kZXhdID0gVCgpOworICAgICAgICBJbmRleCA9IGk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBPdGhlcndpc2UgdGhlIGV4aXN0aW5nIG9uZSBjb21lcyBmaXJzdCBzbyBqdXN0IGNsZWFyIG91dCB0aGUgdmFsdWUgaW4KKyAgICAgIC8vIHRoaXMgc2xvdC4KKyAgICAgIFZbaV0gPSBUKCk7CisgICAgfQorICB9CisKKyAgLy8vIFJlbW92ZSB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBQcmlvcml0eVdvcmtsaXN0LgorICB2b2lkIHBvcF9iYWNrKCkgeworICAgIGFzc2VydCghZW1wdHkoKSAmJiAiQ2Fubm90IHJlbW92ZSBhbiBlbGVtZW50IHdoZW4gZW1wdHkhIik7CisgICAgYXNzZXJ0KGJhY2soKSAhPSBUKCkgJiYgIkNhbm5vdCBoYXZlIGEgbnVsbCBlbGVtZW50IGF0IHRoZSBiYWNrISIpOworICAgIE0uZXJhc2UoYmFjaygpKTsKKyAgICBkbyB7CisgICAgICBWLnBvcF9iYWNrKCk7CisgICAgfSB3aGlsZSAoIVYuZW1wdHkoKSAmJiBWLmJhY2soKSA9PSBUKCkpOworICB9CisKKyAgTExWTV9OT0RJU0NBUkQgVCBwb3BfYmFja192YWwoKSB7CisgICAgVCBSZXQgPSBiYWNrKCk7CisgICAgcG9wX2JhY2soKTsKKyAgICByZXR1cm4gUmV0OworICB9CisKKyAgLy8vIEVyYXNlIGFuIGl0ZW0gZnJvbSB0aGUgd29ya2xpc3QuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgaXMgY29uc3RhbnQgdGltZSBkdWUgdG8gdGhlIG5hdHVyZSBvZiB0aGUgd29ya2xpc3QgaW1wbGVtZW50YXRpb24uCisgIGJvb2wgZXJhc2UoY29uc3QgVCYgWCkgeworICAgIGF1dG8gSSA9IE0uZmluZChYKTsKKyAgICBpZiAoSSA9PSBNLmVuZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYXNzZXJ0KFZbSS0+c2Vjb25kXSA9PSBYICYmICJWYWx1ZSBub3QgYWN0dWFsbHkgYXQgaW5kZXggaW4gbWFwISIpOworICAgIGlmIChJLT5zZWNvbmQgPT0gKHB0cmRpZmZfdCkoVi5zaXplKCkgLSAxKSkgeworICAgICAgZG8geworICAgICAgICBWLnBvcF9iYWNrKCk7CisgICAgICB9IHdoaWxlICghVi5lbXB0eSgpICYmIFYuYmFjaygpID09IFQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIFZbSS0+c2Vjb25kXSA9IFQoKTsKKyAgICB9CisgICAgTS5lcmFzZShJKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBFcmFzZSBpdGVtcyBmcm9tIHRoZSBzZXQgdmVjdG9yIGJhc2VkIG9uIGEgcHJlZGljYXRlIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIGNvZGUsIGlmIHdlIGNvdWxkCisgIC8vLyB3cml0ZSBpdDoKKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gICBWLmVyYXNlKHJlbW92ZV9pZihWLCBQKSwgVi5lbmQoKSk7CisgIC8vLyBcZW5kY29kZQorICAvLy8KKyAgLy8vIEhvd2V2ZXIsIFByaW9yaXR5V29ya2xpc3QgZG9lc24ndCBleHBvc2Ugbm9uLWNvbnN0IGl0ZXJhdG9ycywgbWFraW5nIGFueQorICAvLy8gYWxnb3JpdGhtIGxpa2UgcmVtb3ZlX2lmIGltcG9zc2libGUgdG8gdXNlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgYW55IGVsZW1lbnQgaXMgcmVtb3ZlZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFVuYXJ5UHJlZGljYXRlPgorICBib29sIGVyYXNlX2lmKFVuYXJ5UHJlZGljYXRlIFApIHsKKyAgICB0eXBlbmFtZSBWZWN0b3JUOjppdGVyYXRvciBFID0KKyAgICAgICAgcmVtb3ZlX2lmKFYsIFRlc3RBbmRFcmFzZUZyb21NYXA8VW5hcnlQcmVkaWNhdGU+KFAsIE0pKTsKKyAgICBpZiAoRSA9PSBWLmVuZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGZvciAoYXV0byBJID0gVi5iZWdpbigpOyBJICE9IEU7ICsrSSkKKyAgICAgIGlmICgqSSAhPSBUKCkpCisgICAgICAgIE1bKkldID0gSSAtIFYuYmVnaW4oKTsKKyAgICBWLmVyYXNlKEUsIFYuZW5kKCkpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFJldmVyc2UgdGhlIGl0ZW1zIGluIHRoZSBQcmlvcml0eVdvcmtsaXN0LgorICAvLy8KKyAgLy8vIFRoaXMgZG9lcyBhbiBpbi1wbGFjZSByZXZlcnNhbC4gT3RoZXIga2luZHMgb2YgcmV2ZXJzZSBhcmVuJ3QgZWFzeSB0bworICAvLy8gc3VwcG9ydCBpbiB0aGUgZmFjZSBvZiB0aGUgd29ya2xpc3Qgc2VtYW50aWNzLgorCisgIC8vLyBDb21wbGV0ZWx5IGNsZWFyIHRoZSBQcmlvcml0eVdvcmtsaXN0CisgIHZvaWQgY2xlYXIoKSB7CisgICAgTS5jbGVhcigpOworICAgIFYuY2xlYXIoKTsKKyAgfQorCitwcml2YXRlOgorICAvLy8gQSB3cmFwcGVyIHByZWRpY2F0ZSBkZXNpZ25lZCBmb3IgdXNlIHdpdGggc3RkOjpyZW1vdmVfaWYuCisgIC8vLworICAvLy8gVGhpcyBwcmVkaWNhdGUgd3JhcHMgYSBwcmVkaWNhdGUgc3VpdGFibGUgZm9yIHVzZSB3aXRoIHN0ZDo6cmVtb3ZlX2lmIHRvCisgIC8vLyBjYWxsIE0uZXJhc2UoeCkgb24gZWFjaCBlbGVtZW50IHdoaWNoIGlzIHNsYXRlZCBmb3IgcmVtb3ZhbC4gVGhpcyBqdXN0CisgIC8vLyBhbGxvd3MgdGhlIHByZWRpY2F0ZSB0byBiZSBtb3ZlIG9ubHkgd2hpY2ggd2UgY2FuJ3QgZG8gd2l0aCBsYW1iZGFzCisgIC8vLyB0b2RheS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFVuYXJ5UHJlZGljYXRlVD4KKyAgY2xhc3MgVGVzdEFuZEVyYXNlRnJvbU1hcCB7CisgICAgVW5hcnlQcmVkaWNhdGVUIFA7CisgICAgTWFwVCAmTTsKKworICBwdWJsaWM6CisgICAgVGVzdEFuZEVyYXNlRnJvbU1hcChVbmFyeVByZWRpY2F0ZVQgUCwgTWFwVCAmTSkKKyAgICAgICAgOiBQKHN0ZDo6bW92ZShQKSksIE0oTSkge30KKworICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUICZBcmcpIHsKKyAgICAgIGlmIChBcmcgPT0gVCgpKQorICAgICAgICAvLyBTa2lwIG51bGwgdmFsdWVzIGluIHRoZSBQcmlvcml0eVdvcmtsaXN0LgorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIGlmIChQKEFyZykpIHsKKyAgICAgICAgTS5lcmFzZShBcmcpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH07CisKKyAgLy8vIFRoZSBtYXAgZnJvbSB2YWx1ZSB0byBpbmRleCBpbiB0aGUgdmVjdG9yLgorICBNYXBUIE07CisKKyAgLy8vIFRoZSB2ZWN0b3Igb2YgZWxlbWVudHMgaW4gaW5zZXJ0aW9uIG9yZGVyLgorICBWZWN0b3JUIFY7Cit9OworCisvLy8gQSB2ZXJzaW9uIG9mIFxjIFByaW9yaXR5V29ya2xpc3QgdGhhdCBzZWxlY3RzIHNtYWxsIHNpemUgb3B0aW1pemVkIGRhdGEKKy8vLyBzdHJ1Y3R1cmVzIGZvciB0aGUgdmVjdG9yIGFuZCBtYXAuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdW5zaWduZWQgTj4KK2NsYXNzIFNtYWxsUHJpb3JpdHlXb3JrbGlzdAorICAgIDogcHVibGljIFByaW9yaXR5V29ya2xpc3Q8VCwgU21hbGxWZWN0b3I8VCwgTj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbERlbnNlTWFwPFQsIHB0cmRpZmZfdD4+IHsKK3B1YmxpYzoKKyAgU21hbGxQcmlvcml0eVdvcmtsaXN0KCkgPSBkZWZhdWx0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX1BSSU9SSVRZV09SS0xJU1RfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU0NDSXRlcmF0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NDQ0l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg0YTU4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NDQ0l0ZXJhdG9yLmgKQEAgLTAsMCArMSwyMzcgQEAKKy8vPT09LSBBRFQvU0NDSXRlcmF0b3IuaCAtIFN0cm9uZ2x5IENvbm5lY3RlZCBDb21wLiBJdGVyLiAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLworLy8vIFRoaXMgYnVpbGRzIG9uIHRoZSBsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIGZpbGUgdG8gZmluZCB0aGUgc3Ryb25nbHkKKy8vLyBjb25uZWN0ZWQgY29tcG9uZW50cyAoU0NDcykgb2YgYSBncmFwaCBpbiBPKE4rRSkgdGltZSB1c2luZyBUYXJqYW4ncyBERlMKKy8vLyBhbGdvcml0aG0uCisvLy8KKy8vLyBUaGUgU0NDIGl0ZXJhdG9yIGhhcyB0aGUgaW1wb3J0YW50IHByb3BlcnR5IHRoYXQgaWYgYSBub2RlIGluIFNDQyBTMSBoYXMgYW4KKy8vLyBlZGdlIHRvIGEgbm9kZSBpbiBTQ0MgUzIsIHRoZW4gaXQgdmlzaXRzIFMxICphZnRlciogUzIuCisvLy8KKy8vLyBUbyB2aXNpdCBTMSAqYmVmb3JlKiBTMiwgdXNlIHRoZSBzY2NfaXRlcmF0b3Igb24gdGhlIEludmVyc2UgZ3JhcGguIChOT1RFOgorLy8vIFRoaXMgcmVxdWlyZXMgc29tZSBzaW1wbGUgd3JhcHBlcnMgYW5kIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LikKKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9TQ0NJVEVSQVRPUl9ICisjZGVmaW5lIExMVk1fQURUX1NDQ0lURVJBVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFxicmllZiBFbnVtZXJhdGUgdGhlIFNDQ3Mgb2YgYSBkaXJlY3RlZCBncmFwaCBpbiByZXZlcnNlIHRvcG9sb2dpY2FsIG9yZGVyCisvLy8gb2YgdGhlIFNDQyBEQUcuCisvLy8KKy8vLyBUaGlzIGlzIGltcGxlbWVudGVkIHVzaW5nIFRhcmphbidzIERGUyBhbGdvcml0aG0gdXNpbmcgYW4gaW50ZXJuYWwgc3RhY2sgdG8KKy8vLyBidWlsZCB1cCBhIHZlY3RvciBvZiBub2RlcyBpbiBhIHBhcnRpY3VsYXIgU0NDLiBOb3RlIHRoYXQgaXQgaXMgYSBmb3J3YXJkCisvLy8gaXRlcmF0b3IgYW5kIHRodXMgeW91IGNhbm5vdCBiYWNrdHJhY2sgb3IgcmUtdmlzaXQgbm9kZXMuCit0ZW1wbGF0ZSA8Y2xhc3MgR3JhcGhULCBjbGFzcyBHVCA9IEdyYXBoVHJhaXRzPEdyYXBoVD4+CitjbGFzcyBzY2NfaXRlcmF0b3IgOiBwdWJsaWMgaXRlcmF0b3JfZmFjYWRlX2Jhc2U8CisgICAgICAgICAgICAgICAgICAgICAgICAgc2NjX2l0ZXJhdG9yPEdyYXBoVCwgR1Q+LCBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHR5cGVuYW1lIEdUOjpOb2RlUmVmPiwgcHRyZGlmZl90PiB7CisgIHVzaW5nIE5vZGVSZWYgPSB0eXBlbmFtZSBHVDo6Tm9kZVJlZjsKKyAgdXNpbmcgQ2hpbGRJdFR5ID0gdHlwZW5hbWUgR1Q6OkNoaWxkSXRlcmF0b3JUeXBlOworICB1c2luZyBTY2NUeSA9IHN0ZDo6dmVjdG9yPE5vZGVSZWY+OworICB1c2luZyByZWZlcmVuY2UgPSB0eXBlbmFtZSBzY2NfaXRlcmF0b3I6OnJlZmVyZW5jZTsKKworICAvLy8gRWxlbWVudCBvZiBWaXNpdFN0YWNrIGR1cmluZyBERlMuCisgIHN0cnVjdCBTdGFja0VsZW1lbnQgeworICAgIE5vZGVSZWYgTm9kZTsgICAgICAgICAvLy88IFRoZSBjdXJyZW50IG5vZGUgcG9pbnRlci4KKyAgICBDaGlsZEl0VHkgTmV4dENoaWxkOyAgLy8vPCBUaGUgbmV4dCBjaGlsZCwgbW9kaWZpZWQgaW5wbGFjZSBkdXJpbmcgREZTLgorICAgIHVuc2lnbmVkIE1pblZpc2l0ZWQ7ICAvLy88IE1pbmltdW0gdXBsaW5rIHZhbHVlIG9mIGFsbCBjaGlsZHJlbiBvZiBOb2RlLgorCisgICAgU3RhY2tFbGVtZW50KE5vZGVSZWYgTm9kZSwgY29uc3QgQ2hpbGRJdFR5ICZDaGlsZCwgdW5zaWduZWQgTWluKQorICAgICAgICA6IE5vZGUoTm9kZSksIE5leHRDaGlsZChDaGlsZCksIE1pblZpc2l0ZWQoTWluKSB7fQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFN0YWNrRWxlbWVudCAmT3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBOb2RlID09IE90aGVyLk5vZGUgJiYKKyAgICAgICAgICAgICBOZXh0Q2hpbGQgPT0gT3RoZXIuTmV4dENoaWxkICYmCisgICAgICAgICAgICAgTWluVmlzaXRlZCA9PSBPdGhlci5NaW5WaXNpdGVkOworICAgIH0KKyAgfTsKKworICAvLy8gVGhlIHZpc2l0IGNvdW50ZXJzIHVzZWQgdG8gZGV0ZWN0IHdoZW4gYSBjb21wbGV0ZSBTQ0MgaXMgb24gdGhlIHN0YWNrLgorICAvLy8gdmlzaXROdW0gaXMgdGhlIGdsb2JhbCBjb3VudGVyLgorICAvLy8KKyAgLy8vIG5vZGVWaXNpdE51bWJlcnMgYXJlIHBlci1ub2RlIHZpc2l0IG51bWJlcnMsIGFsc28gdXNlZCBhcyBERlMgZmxhZ3MuCisgIHVuc2lnbmVkIHZpc2l0TnVtOworICBEZW5zZU1hcDxOb2RlUmVmLCB1bnNpZ25lZD4gbm9kZVZpc2l0TnVtYmVyczsKKworICAvLy8gU3RhY2sgaG9sZGluZyBub2RlcyBvZiB0aGUgU0NDLgorICBzdGQ6OnZlY3RvcjxOb2RlUmVmPiBTQ0NOb2RlU3RhY2s7CisKKyAgLy8vIFRoZSBjdXJyZW50IFNDQywgcmV0cmlldmVkIHVzaW5nIG9wZXJhdG9yKigpLgorICBTY2NUeSBDdXJyZW50U0NDOworCisgIC8vLyBERlMgc3RhY2ssIFVzZWQgdG8gbWFpbnRhaW4gdGhlIG9yZGVyaW5nLiAgVGhlIHRvcCBjb250YWlucyB0aGUgY3VycmVudAorICAvLy8gbm9kZSwgdGhlIG5leHQgY2hpbGQgdG8gdmlzaXQsIGFuZCB0aGUgbWluaW11bSB1cGxpbmsgdmFsdWUgb2YgYWxsIGNoaWxkCisgIHN0ZDo6dmVjdG9yPFN0YWNrRWxlbWVudD4gVmlzaXRTdGFjazsKKworICAvLy8gQSBzaW5nbGUgInZpc2l0IiB3aXRoaW4gdGhlIG5vbi1yZWN1cnNpdmUgREZTIHRyYXZlcnNhbC4KKyAgdm9pZCBERlNWaXNpdE9uZShOb2RlUmVmIE4pOworCisgIC8vLyBUaGUgc3RhY2stYmFzZWQgREZTIHRyYXZlcnNhbDsgZGVmaW5lZCBiZWxvdy4KKyAgdm9pZCBERlNWaXNpdENoaWxkcmVuKCk7CisKKyAgLy8vIENvbXB1dGUgdGhlIG5leHQgU0NDIHVzaW5nIHRoZSBERlMgdHJhdmVyc2FsLgorICB2b2lkIEdldE5leHRTQ0MoKTsKKworICBzY2NfaXRlcmF0b3IoTm9kZVJlZiBlbnRyeU4pIDogdmlzaXROdW0oMCkgeworICAgIERGU1Zpc2l0T25lKGVudHJ5Tik7CisgICAgR2V0TmV4dFNDQygpOworICB9CisKKyAgLy8vIEVuZCBpcyB3aGVuIHRoZSBERlMgc3RhY2sgaXMgZW1wdHkuCisgIHNjY19pdGVyYXRvcigpID0gZGVmYXVsdDsKKworcHVibGljOgorICBzdGF0aWMgc2NjX2l0ZXJhdG9yIGJlZ2luKGNvbnN0IEdyYXBoVCAmRykgeworICAgIHJldHVybiBzY2NfaXRlcmF0b3IoR1Q6OmdldEVudHJ5Tm9kZShHKSk7CisgIH0KKyAgc3RhdGljIHNjY19pdGVyYXRvciBlbmQoY29uc3QgR3JhcGhUICYpIHsgcmV0dXJuIHNjY19pdGVyYXRvcigpOyB9CisKKyAgLy8vIFxicmllZiBEaXJlY3QgbG9vcCB0ZXJtaW5hdGlvbiB0ZXN0IHdoaWNoIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4KKyAgLy8vIGNvbXBhcmlzb24gd2l0aCBcYyBlbmQoKS4KKyAgYm9vbCBpc0F0RW5kKCkgY29uc3QgeworICAgIGFzc2VydCghQ3VycmVudFNDQy5lbXB0eSgpIHx8IFZpc2l0U3RhY2suZW1wdHkoKSk7CisgICAgcmV0dXJuIEN1cnJlbnRTQ0MuZW1wdHkoKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBzY2NfaXRlcmF0b3IgJngpIGNvbnN0IHsKKyAgICByZXR1cm4gVmlzaXRTdGFjayA9PSB4LlZpc2l0U3RhY2sgJiYgQ3VycmVudFNDQyA9PSB4LkN1cnJlbnRTQ0M7CisgIH0KKworICBzY2NfaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgR2V0TmV4dFNDQygpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7CisgICAgYXNzZXJ0KCFDdXJyZW50U0NDLmVtcHR5KCkgJiYgIkRlcmVmZXJlbmNpbmcgRU5EIFNDQyBpdGVyYXRvciEiKTsKKyAgICByZXR1cm4gQ3VycmVudFNDQzsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGVzdCBpZiB0aGUgY3VycmVudCBTQ0MgaGFzIGEgbG9vcC4KKyAgLy8vCisgIC8vLyBJZiB0aGUgU0NDIGhhcyBtb3JlIHRoYW4gb25lIG5vZGUsIHRoaXMgaXMgdHJpdmlhbGx5IHRydWUuICBJZiBub3QsIGl0IG1heQorICAvLy8gc3RpbGwgY29udGFpbiBhIGxvb3AgaWYgdGhlIG5vZGUgaGFzIGFuIGVkZ2UgYmFjayB0byBpdHNlbGYuCisgIGJvb2wgaGFzTG9vcCgpIGNvbnN0OworCisgIC8vLyBUaGlzIGluZm9ybXMgdGhlIFxjIHNjY19pdGVyYXRvciB0aGF0IHRoZSBzcGVjaWZpZWQgXGMgT2xkIG5vZGUKKyAgLy8vIGhhcyBiZWVuIGRlbGV0ZWQsIGFuZCBcYyBOZXcgaXMgdG8gYmUgdXNlZCBpbiBpdHMgcGxhY2UuCisgIHZvaWQgUmVwbGFjZU5vZGUoTm9kZVJlZiBPbGQsIE5vZGVSZWYgTmV3KSB7CisgICAgYXNzZXJ0KG5vZGVWaXNpdE51bWJlcnMuY291bnQoT2xkKSAmJiAiT2xkIG5vdCBpbiBzY2NfaXRlcmF0b3I/Iik7CisgICAgbm9kZVZpc2l0TnVtYmVyc1tOZXddID0gbm9kZVZpc2l0TnVtYmVyc1tPbGRdOworICAgIG5vZGVWaXNpdE51bWJlcnMuZXJhc2UoT2xkKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIEdyYXBoVCwgY2xhc3MgR1Q+Cit2b2lkIHNjY19pdGVyYXRvcjxHcmFwaFQsIEdUPjo6REZTVmlzaXRPbmUoTm9kZVJlZiBOKSB7CisgICsrdmlzaXROdW07CisgIG5vZGVWaXNpdE51bWJlcnNbTl0gPSB2aXNpdE51bTsKKyAgU0NDTm9kZVN0YWNrLnB1c2hfYmFjayhOKTsKKyAgVmlzaXRTdGFjay5wdXNoX2JhY2soU3RhY2tFbGVtZW50KE4sIEdUOjpjaGlsZF9iZWdpbihOKSwgdmlzaXROdW0pKTsKKyNpZiAwIC8vIEVuYWJsZSBpZiBuZWVkZWQgd2hlbiBkZWJ1Z2dpbmcuCisgIGRiZ3MoKSA8PCAiVGFyamFuU0NDOiBOb2RlICIgPDwgTiA8PAorICAgICAgICAiIDogdmlzaXROdW0gPSAiIDw8IHZpc2l0TnVtIDw8ICJcbiI7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPGNsYXNzIEdyYXBoVCwgY2xhc3MgR1Q+Cit2b2lkIHNjY19pdGVyYXRvcjxHcmFwaFQsIEdUPjo6REZTVmlzaXRDaGlsZHJlbigpIHsKKyAgYXNzZXJ0KCFWaXNpdFN0YWNrLmVtcHR5KCkpOworICB3aGlsZSAoVmlzaXRTdGFjay5iYWNrKCkuTmV4dENoaWxkICE9IEdUOjpjaGlsZF9lbmQoVmlzaXRTdGFjay5iYWNrKCkuTm9kZSkpIHsKKyAgICAvLyBUT1MgaGFzIGF0IGxlYXN0IG9uZSBtb3JlIGNoaWxkIHNvIGNvbnRpbnVlIERGUworICAgIE5vZGVSZWYgY2hpbGROID0gKlZpc2l0U3RhY2suYmFjaygpLk5leHRDaGlsZCsrOworICAgIHR5cGVuYW1lIERlbnNlTWFwPE5vZGVSZWYsIHVuc2lnbmVkPjo6aXRlcmF0b3IgVmlzaXRlZCA9CisgICAgICAgIG5vZGVWaXNpdE51bWJlcnMuZmluZChjaGlsZE4pOworICAgIGlmIChWaXNpdGVkID09IG5vZGVWaXNpdE51bWJlcnMuZW5kKCkpIHsKKyAgICAgIC8vIHRoaXMgbm9kZSBoYXMgbmV2ZXIgYmVlbiBzZWVuLgorICAgICAgREZTVmlzaXRPbmUoY2hpbGROKTsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIHVuc2lnbmVkIGNoaWxkTnVtID0gVmlzaXRlZC0+c2Vjb25kOworICAgIGlmIChWaXNpdFN0YWNrLmJhY2soKS5NaW5WaXNpdGVkID4gY2hpbGROdW0pCisgICAgICBWaXNpdFN0YWNrLmJhY2soKS5NaW5WaXNpdGVkID0gY2hpbGROdW07CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIEdyYXBoVCwgY2xhc3MgR1Q+IHZvaWQgc2NjX2l0ZXJhdG9yPEdyYXBoVCwgR1Q+OjpHZXROZXh0U0NDKCkgeworICBDdXJyZW50U0NDLmNsZWFyKCk7IC8vIFByZXBhcmUgdG8gY29tcHV0ZSB0aGUgbmV4dCBTQ0MKKyAgd2hpbGUgKCFWaXNpdFN0YWNrLmVtcHR5KCkpIHsKKyAgICBERlNWaXNpdENoaWxkcmVuKCk7CisKKyAgICAvLyBQb3AgdGhlIGxlYWYgb24gdG9wIG9mIHRoZSBWaXNpdFN0YWNrLgorICAgIE5vZGVSZWYgdmlzaXRpbmdOID0gVmlzaXRTdGFjay5iYWNrKCkuTm9kZTsKKyAgICB1bnNpZ25lZCBtaW5WaXNpdE51bSA9IFZpc2l0U3RhY2suYmFjaygpLk1pblZpc2l0ZWQ7CisgICAgYXNzZXJ0KFZpc2l0U3RhY2suYmFjaygpLk5leHRDaGlsZCA9PSBHVDo6Y2hpbGRfZW5kKHZpc2l0aW5nTikpOworICAgIFZpc2l0U3RhY2sucG9wX2JhY2soKTsKKworICAgIC8vIFByb3BhZ2F0ZSBNaW5WaXNpdE51bSB0byBwYXJlbnQgc28gd2UgY2FuIGRldGVjdCB0aGUgU0NDIHN0YXJ0aW5nIG5vZGUuCisgICAgaWYgKCFWaXNpdFN0YWNrLmVtcHR5KCkgJiYgVmlzaXRTdGFjay5iYWNrKCkuTWluVmlzaXRlZCA+IG1pblZpc2l0TnVtKQorICAgICAgVmlzaXRTdGFjay5iYWNrKCkuTWluVmlzaXRlZCA9IG1pblZpc2l0TnVtOworCisjaWYgMCAvLyBFbmFibGUgaWYgbmVlZGVkIHdoZW4gZGVidWdnaW5nLgorICAgIGRiZ3MoKSA8PCAiVGFyamFuU0NDOiBQb3BwZWQgbm9kZSAiIDw8IHZpc2l0aW5nTiA8PAorICAgICAgICAgICIgOiBtaW5WaXNpdE51bSA9ICIgPDwgbWluVmlzaXROdW0gPDwgIjsgTm9kZSB2aXNpdCBudW0gPSAiIDw8CisgICAgICAgICAgbm9kZVZpc2l0TnVtYmVyc1t2aXNpdGluZ05dIDw8ICJcbiI7CisjZW5kaWYKKworICAgIGlmIChtaW5WaXNpdE51bSAhPSBub2RlVmlzaXROdW1iZXJzW3Zpc2l0aW5nTl0pCisgICAgICBjb250aW51ZTsKKworICAgIC8vIEEgZnVsbCBTQ0MgaXMgb24gdGhlIFNDQ05vZGVTdGFjayEgIEl0IGluY2x1ZGVzIGFsbCBub2RlcyBiZWxvdworICAgIC8vIHZpc2l0aW5nTiBvbiB0aGUgc3RhY2suICBDb3B5IHRob3NlIG5vZGVzIHRvIEN1cnJlbnRTQ0MsCisgICAgLy8gcmVzZXQgdGhlaXIgbWluVmlzaXQgdmFsdWVzLCBhbmQgcmV0dXJuICh0aGlzIHN1c3BlbmRzCisgICAgLy8gdGhlIERGUyB0cmF2ZXJzYWwgdGlsbCB0aGUgbmV4dCArKykuCisgICAgZG8geworICAgICAgQ3VycmVudFNDQy5wdXNoX2JhY2soU0NDTm9kZVN0YWNrLmJhY2soKSk7CisgICAgICBTQ0NOb2RlU3RhY2sucG9wX2JhY2soKTsKKyAgICAgIG5vZGVWaXNpdE51bWJlcnNbQ3VycmVudFNDQy5iYWNrKCldID0gfjBVOworICAgIH0gd2hpbGUgKEN1cnJlbnRTQ0MuYmFjaygpICE9IHZpc2l0aW5nTik7CisgICAgcmV0dXJuOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBHcmFwaFQsIGNsYXNzIEdUPgorYm9vbCBzY2NfaXRlcmF0b3I8R3JhcGhULCBHVD46Omhhc0xvb3AoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFDdXJyZW50U0NDLmVtcHR5KCkgJiYgIkRlcmVmZXJlbmNpbmcgRU5EIFNDQyBpdGVyYXRvciEiKTsKKyAgICBpZiAoQ3VycmVudFNDQy5zaXplKCkgPiAxKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgTm9kZVJlZiBOID0gQ3VycmVudFNDQy5mcm9udCgpOworICAgIGZvciAoQ2hpbGRJdFR5IENJID0gR1Q6OmNoaWxkX2JlZ2luKE4pLCBDRSA9IEdUOjpjaGlsZF9lbmQoTik7IENJICE9IENFOworICAgICAgICAgKytDSSkKKyAgICAgIGlmICgqQ0kgPT0gTikKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKy8vLyBcYnJpZWYgQ29uc3RydWN0IHRoZSBiZWdpbiBpdGVyYXRvciBmb3IgYSBkZWR1Y2VkIGdyYXBoIHR5cGUgVC4KK3RlbXBsYXRlIDxjbGFzcyBUPiBzY2NfaXRlcmF0b3I8VD4gc2NjX2JlZ2luKGNvbnN0IFQgJkcpIHsKKyAgcmV0dXJuIHNjY19pdGVyYXRvcjxUPjo6YmVnaW4oRyk7Cit9CisKKy8vLyBcYnJpZWYgQ29uc3RydWN0IHRoZSBlbmQgaXRlcmF0b3IgZm9yIGEgZGVkdWNlZCBncmFwaCB0eXBlIFQuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc2NjX2l0ZXJhdG9yPFQ+IHNjY19lbmQoY29uc3QgVCAmRykgeworICByZXR1cm4gc2NjX2l0ZXJhdG9yPFQ+OjplbmQoRyk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9TQ0NJVEVSQVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TVExFeHRyYXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NUTEV4dHJhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA1MWI5MDAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TVExFeHRyYXMuaApAQCAtMCwwICsxLDExODEgQEAKKy8vPT09LSBsbHZtL0FEVC9TVExFeHRyYXMuaCAtIFVzZWZ1bCBTVEwgcmVsYXRlZCBmdW5jdGlvbnMgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHNvbWUgdGVtcGxhdGVzIHRoYXQgYXJlIHVzZWZ1bCBpZiB5b3UgYXJlIHdvcmtpbmcgd2l0aCB0aGUKKy8vIFNUTCBhdCBhbGwuCisvLworLy8gTm8gbGlicmFyeSBpcyByZXF1aXJlZCB3aGVuIHVzaW5nIHRoZXNlIGZ1bmN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NUTEVYVFJBU19ICisjZGVmaW5lIExMVk1fQURUX1NUTEVYVFJBU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2lmZGVmIEVYUEVOU0lWRV9DSEVDS1MKKyNpbmNsdWRlIDxyYW5kb20+IC8vIGZvciBzdGQ6Om10MTk5MzcKKyNlbmRpZgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vIE9ubHkgdXNlZCBieSBjb21waWxlciBpZiBib3RoIHRlbXBsYXRlIHR5cGVzIGFyZSB0aGUgc2FtZS4gIFVzZWZ1bCB3aGVuCisvLyB1c2luZyBTRklOQUUgdG8gdGVzdCBmb3IgdGhlIGV4aXN0ZW5jZSBvZiBtZW1iZXIgZnVuY3Rpb25zLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIFQ+IHN0cnVjdCBTYW1lVHlwZTsKKworbmFtZXNwYWNlIGRldGFpbCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSYW5nZVQ+Cit1c2luZyBJdGVyT2ZSYW5nZSA9IGRlY2x0eXBlKHN0ZDo6YmVnaW4oc3RkOjpkZWNsdmFsPFJhbmdlVCAmPigpKSk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSYW5nZVQ+Cit1c2luZyBWYWx1ZU9mUmFuZ2UgPSB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8ZGVjbHR5cGUoCisgICAgKnN0ZDo6YmVnaW4oc3RkOjpkZWNsdmFsPFJhbmdlVCAmPigpKSk+Ojp0eXBlOworCit9IC8vIGVuZCBuYW1lc3BhY2UgZGV0YWlsCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgRXh0cmEgYWRkaXRpb25zIHRvIDxmdW5jdGlvbmFsPgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKwordGVtcGxhdGUgPGNsYXNzIFR5PiBzdHJ1Y3QgaWRlbnRpdHkgeworICB1c2luZyBhcmd1bWVudF90eXBlID0gVHk7CisKKyAgVHkgJm9wZXJhdG9yKCkoVHkgJnNlbGYpIGNvbnN0IHsKKyAgICByZXR1cm4gc2VsZjsKKyAgfQorICBjb25zdCBUeSAmb3BlcmF0b3IoKShjb25zdCBUeSAmc2VsZikgY29uc3QgeworICAgIHJldHVybiBzZWxmOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVHk+IHN0cnVjdCBsZXNzX3B0ciB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUeSogbGVmdCwgY29uc3QgVHkqIHJpZ2h0KSBjb25zdCB7CisgICAgcmV0dXJuICpsZWZ0IDwgKnJpZ2h0OworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVHk+IHN0cnVjdCBncmVhdGVyX3B0ciB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBUeSogbGVmdCwgY29uc3QgVHkqIHJpZ2h0KSBjb25zdCB7CisgICAgcmV0dXJuICpyaWdodCA8ICpsZWZ0OworICB9Cit9OworCisvLy8gQW4gZWZmaWNpZW50LCB0eXBlLWVyYXNpbmcsIG5vbi1vd25pbmcgcmVmZXJlbmNlIHRvIGEgY2FsbGFibGUuIFRoaXMgaXMKKy8vLyBpbnRlbmRlZCBmb3IgdXNlIGFzIHRoZSB0eXBlIG9mIGEgZnVuY3Rpb24gcGFyYW1ldGVyIHRoYXQgaXMgbm90IHVzZWQKKy8vLyBhZnRlciB0aGUgZnVuY3Rpb24gaW4gcXVlc3Rpb24gcmV0dXJucy4KKy8vLworLy8vIFRoaXMgY2xhc3MgZG9lcyBub3Qgb3duIHRoZSBjYWxsYWJsZSwgc28gaXQgaXMgbm90IGluIGdlbmVyYWwgc2FmZSB0byBzdG9yZQorLy8vIGEgZnVuY3Rpb25fcmVmLgordGVtcGxhdGU8dHlwZW5hbWUgRm4+IGNsYXNzIGZ1bmN0aW9uX3JlZjsKKwordGVtcGxhdGU8dHlwZW5hbWUgUmV0LCB0eXBlbmFtZSAuLi5QYXJhbXM+CitjbGFzcyBmdW5jdGlvbl9yZWY8UmV0KFBhcmFtcy4uLik+IHsKKyAgUmV0ICgqY2FsbGJhY2spKGludHB0cl90IGNhbGxhYmxlLCBQYXJhbXMgLi4ucGFyYW1zKSA9IG51bGxwdHI7CisgIGludHB0cl90IGNhbGxhYmxlOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIENhbGxhYmxlPgorICBzdGF0aWMgUmV0IGNhbGxiYWNrX2ZuKGludHB0cl90IGNhbGxhYmxlLCBQYXJhbXMgLi4ucGFyYW1zKSB7CisgICAgcmV0dXJuICgqcmVpbnRlcnByZXRfY2FzdDxDYWxsYWJsZSo+KGNhbGxhYmxlKSkoCisgICAgICAgIHN0ZDo6Zm9yd2FyZDxQYXJhbXM+KHBhcmFtcykuLi4pOworICB9CisKK3B1YmxpYzoKKyAgZnVuY3Rpb25fcmVmKCkgPSBkZWZhdWx0OworICBmdW5jdGlvbl9yZWYoc3RkOjpudWxscHRyX3QpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENhbGxhYmxlPgorICBmdW5jdGlvbl9yZWYoQ2FsbGFibGUgJiZjYWxsYWJsZSwKKyAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgICAgICFzdGQ6OmlzX3NhbWU8dHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPENhbGxhYmxlPjo6dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX3JlZj46OnZhbHVlPjo6dHlwZSAqID0gbnVsbHB0cikKKyAgICAgIDogY2FsbGJhY2soY2FsbGJhY2tfZm48dHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPENhbGxhYmxlPjo6dHlwZT4pLAorICAgICAgICBjYWxsYWJsZShyZWludGVycHJldF9jYXN0PGludHB0cl90PigmY2FsbGFibGUpKSB7fQorCisgIFJldCBvcGVyYXRvcigpKFBhcmFtcyAuLi5wYXJhbXMpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FsbGJhY2soY2FsbGFibGUsIHN0ZDo6Zm9yd2FyZDxQYXJhbXM+KHBhcmFtcykuLi4pOworICB9CisKKyAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGNhbGxiYWNrOyB9Cit9OworCisvLyBkZWxldGVyIC0gVmVyeSB2ZXJ5IHZlcnkgc2ltcGxlIG1ldGhvZCB0aGF0IGlzIHVzZWQgdG8gaW52b2tlIG9wZXJhdG9yCisvLyBkZWxldGUgb24gc29tZXRoaW5nLiAgSXQgaXMgdXNlZCBsaWtlIHRoaXM6CisvLworLy8gICBmb3JfZWFjaChWLmJlZ2luKCksIEIuZW5kKCksIGRlbGV0ZXI8SW50ZXJ2YWw+KTsKK3RlbXBsYXRlIDxjbGFzcyBUPgoraW5saW5lIHZvaWQgZGVsZXRlcihUICpQdHIpIHsKKyAgZGVsZXRlIFB0cjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICBFeHRyYSBhZGRpdGlvbnMgdG8gPGl0ZXJhdG9yPgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworbmFtZXNwYWNlIGFkbF9kZXRhaWwgeworCit1c2luZyBzdGQ6OmJlZ2luOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyVHk+CithdXRvIGFkbF9iZWdpbihDb250YWluZXJUeSAmJmNvbnRhaW5lcikKKyAgICAtPiBkZWNsdHlwZShiZWdpbihzdGQ6OmZvcndhcmQ8Q29udGFpbmVyVHk+KGNvbnRhaW5lcikpKSB7CisgIHJldHVybiBiZWdpbihzdGQ6OmZvcndhcmQ8Q29udGFpbmVyVHk+KGNvbnRhaW5lcikpOworfQorCit1c2luZyBzdGQ6OmVuZDsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lclR5PgorYXV0byBhZGxfZW5kKENvbnRhaW5lclR5ICYmY29udGFpbmVyKQorICAgIC0+IGRlY2x0eXBlKGVuZChzdGQ6OmZvcndhcmQ8Q29udGFpbmVyVHk+KGNvbnRhaW5lcikpKSB7CisgIHJldHVybiBlbmQoc3RkOjpmb3J3YXJkPENvbnRhaW5lclR5Pihjb250YWluZXIpKTsKK30KKwordXNpbmcgc3RkOjpzd2FwOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgYWRsX3N3YXAoVCAmJmxocywgVCAmJnJocykgbm9leGNlcHQobm9leGNlcHQoc3dhcChzdGQ6OmRlY2x2YWw8VD4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmRlY2x2YWw8VD4oKSkpKSB7CisgIHN3YXAoc3RkOjpmb3J3YXJkPFQ+KGxocyksIHN0ZDo6Zm9yd2FyZDxUPihyaHMpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGFkbF9kZXRhaWwKKwordGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lclR5PgorYXV0byBhZGxfYmVnaW4oQ29udGFpbmVyVHkgJiZjb250YWluZXIpCisgICAgLT4gZGVjbHR5cGUoYWRsX2RldGFpbDo6YWRsX2JlZ2luKHN0ZDo6Zm9yd2FyZDxDb250YWluZXJUeT4oY29udGFpbmVyKSkpIHsKKyAgcmV0dXJuIGFkbF9kZXRhaWw6OmFkbF9iZWdpbihzdGQ6OmZvcndhcmQ8Q29udGFpbmVyVHk+KGNvbnRhaW5lcikpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyVHk+CithdXRvIGFkbF9lbmQoQ29udGFpbmVyVHkgJiZjb250YWluZXIpCisgICAgLT4gZGVjbHR5cGUoYWRsX2RldGFpbDo6YWRsX2VuZChzdGQ6OmZvcndhcmQ8Q29udGFpbmVyVHk+KGNvbnRhaW5lcikpKSB7CisgIHJldHVybiBhZGxfZGV0YWlsOjphZGxfZW5kKHN0ZDo6Zm9yd2FyZDxDb250YWluZXJUeT4oY29udGFpbmVyKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBhZGxfc3dhcChUICYmbGhzLCBUICYmcmhzKSBub2V4Y2VwdCgKKyAgICBub2V4Y2VwdChhZGxfZGV0YWlsOjphZGxfc3dhcChzdGQ6OmRlY2x2YWw8VD4oKSwgc3RkOjpkZWNsdmFsPFQ+KCkpKSkgeworICBhZGxfZGV0YWlsOjphZGxfc3dhcChzdGQ6OmZvcndhcmQ8VD4obGhzKSwgc3RkOjpmb3J3YXJkPFQ+KHJocykpOworfQorCisvLyBtYXBwZWRfaXRlcmF0b3IgLSBUaGlzIGlzIGEgc2ltcGxlIGl0ZXJhdG9yIGFkYXB0ZXIgdGhhdCBjYXVzZXMgYSBmdW5jdGlvbiB0bworLy8gYmUgYXBwbGllZCB3aGVuZXZlciBvcGVyYXRvciogaXMgaW52b2tlZCBvbiB0aGUgaXRlcmF0b3IuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJdFR5LCB0eXBlbmFtZSBGdW5jVHksCisgICAgICAgICAgdHlwZW5hbWUgRnVuY1JldHVyblR5ID0KKyAgICAgICAgICAgIGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxGdW5jVHk+KCkoKnN0ZDo6ZGVjbHZhbDxJdFR5PigpKSk+CitjbGFzcyBtYXBwZWRfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U8CisgICAgICAgICAgICAgbWFwcGVkX2l0ZXJhdG9yPEl0VHksIEZ1bmNUeT4sIEl0VHksCisgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SXRUeT46Oml0ZXJhdG9yX2NhdGVnb3J5LAorICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxGdW5jUmV0dXJuVHk+Ojp0eXBlPiB7CitwdWJsaWM6CisgIG1hcHBlZF9pdGVyYXRvcihJdFR5IFUsIEZ1bmNUeSBGKQorICAgIDogbWFwcGVkX2l0ZXJhdG9yOjppdGVyYXRvcl9hZGFwdG9yX2Jhc2Uoc3RkOjptb3ZlKFUpKSwgRihzdGQ6Om1vdmUoRikpIHt9CisKKyAgSXRUeSBnZXRDdXJyZW50KCkgeyByZXR1cm4gdGhpcy0+STsgfQorCisgIEZ1bmNSZXR1cm5UeSBvcGVyYXRvciooKSB7IHJldHVybiBGKCp0aGlzLT5JKTsgfQorCitwcml2YXRlOgorICBGdW5jVHkgRjsKK307CisKKy8vIG1hcF9pdGVyYXRvciAtIFByb3ZpZGUgYSBjb252ZW5pZW50IHdheSB0byBjcmVhdGUgbWFwcGVkX2l0ZXJhdG9ycywganVzdCBsaWtlCisvLyBtYWtlX3BhaXIgaXMgdXNlZnVsIGZvciBjcmVhdGluZyBwYWlycy4uLgordGVtcGxhdGUgPGNsYXNzIEl0VHksIGNsYXNzIEZ1bmNUeT4KK2lubGluZSBtYXBwZWRfaXRlcmF0b3I8SXRUeSwgRnVuY1R5PiBtYXBfaXRlcmF0b3IoSXRUeSBJLCBGdW5jVHkgRikgeworICByZXR1cm4gbWFwcGVkX2l0ZXJhdG9yPEl0VHksIEZ1bmNUeT4oc3RkOjptb3ZlKEkpLCBzdGQ6Om1vdmUoRikpOworfQorCisvLy8gSGVscGVyIHRvIGRldGVybWluZSBpZiB0eXBlIFQgaGFzIGEgbWVtYmVyIGNhbGxlZCByYmVnaW4oKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUeT4gY2xhc3MgaGFzX3JiZWdpbl9pbXBsIHsKKyAgdXNpbmcgeWVzID0gY2hhclsxXTsKKyAgdXNpbmcgbm8gPSBjaGFyWzJdOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbm5lcj4KKyAgc3RhdGljIHllcyYgdGVzdChJbm5lciAqSSwgZGVjbHR5cGUoSS0+cmJlZ2luKCkpICogPSBudWxscHRyKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWU+CisgIHN0YXRpYyBubyYgdGVzdCguLi4pOworCitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gc2l6ZW9mKHRlc3Q8VHk+KG51bGxwdHIpKSA9PSBzaXplb2YoeWVzKTsKK307CisKKy8vLyBNZXRhZnVuY3Rpb24gdG8gZGV0ZXJtaW5lIGlmIFQmIG9yIFQgaGFzIGEgbWVtYmVyIGNhbGxlZCByYmVnaW4oKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUeT4KK3N0cnVjdCBoYXNfcmJlZ2luIDogaGFzX3JiZWdpbl9pbXBsPHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxUeT46OnR5cGU+IHsKK307CisKKy8vIFJldHVybnMgYW4gaXRlcmF0b3JfcmFuZ2Ugb3ZlciB0aGUgZ2l2ZW4gY29udGFpbmVyIHdoaWNoIGl0ZXJhdGVzIGluIHJldmVyc2UuCisvLyBOb3RlIHRoYXQgdGhlIGNvbnRhaW5lciBtdXN0IGhhdmUgcmJlZ2luKCkvcmVuZCgpIG1ldGhvZHMgZm9yIHRoaXMgdG8gd29yay4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXJUeT4KK2F1dG8gcmV2ZXJzZShDb250YWluZXJUeSAmJkMsCisgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aGFzX3JiZWdpbjxDb250YWluZXJUeT46OnZhbHVlPjo6dHlwZSAqID0KKyAgICAgICAgICAgICAgICAgbnVsbHB0cikgLT4gZGVjbHR5cGUobWFrZV9yYW5nZShDLnJiZWdpbigpLCBDLnJlbmQoKSkpIHsKKyAgcmV0dXJuIG1ha2VfcmFuZ2UoQy5yYmVnaW4oKSwgQy5yZW5kKCkpOworfQorCisvLyBSZXR1cm5zIGEgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yIHdyYXBwZWQgYXJvdW5kIHRoZSBnaXZlbiBpdGVyYXRvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJdGVyYXRvclR5Pgorc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPEl0ZXJhdG9yVHk+IG1ha2VfcmV2ZXJzZV9pdGVyYXRvcihJdGVyYXRvclR5IEl0KSB7CisgIHJldHVybiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8SXRlcmF0b3JUeT4oSXQpOworfQorCisvLyBSZXR1cm5zIGFuIGl0ZXJhdG9yX3JhbmdlIG92ZXIgdGhlIGdpdmVuIGNvbnRhaW5lciB3aGljaCBpdGVyYXRlcyBpbiByZXZlcnNlLgorLy8gTm90ZSB0aGF0IHRoZSBjb250YWluZXIgbXVzdCBoYXZlIGJlZ2luKCkvZW5kKCkgbWV0aG9kcyB3aGljaCByZXR1cm4KKy8vIGJpZGlyZWN0aW9uYWwgaXRlcmF0b3JzIGZvciB0aGlzIHRvIHdvcmsuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyVHk+CithdXRvIHJldmVyc2UoCisgICAgQ29udGFpbmVyVHkgJiZDLAorICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFoYXNfcmJlZ2luPENvbnRhaW5lclR5Pjo6dmFsdWU+Ojp0eXBlICogPSBudWxscHRyKQorICAgIC0+IGRlY2x0eXBlKG1ha2VfcmFuZ2UobGx2bTo6bWFrZV9yZXZlcnNlX2l0ZXJhdG9yKHN0ZDo6ZW5kKEMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om1ha2VfcmV2ZXJzZV9pdGVyYXRvcihzdGQ6OmJlZ2luKEMpKSkpIHsKKyAgcmV0dXJuIG1ha2VfcmFuZ2UobGx2bTo6bWFrZV9yZXZlcnNlX2l0ZXJhdG9yKHN0ZDo6ZW5kKEMpKSwKKyAgICAgICAgICAgICAgICAgICAgbGx2bTo6bWFrZV9yZXZlcnNlX2l0ZXJhdG9yKHN0ZDo6YmVnaW4oQykpKTsKK30KKworLy8vIEFuIGl0ZXJhdG9yIGFkYXB0b3IgdGhhdCBmaWx0ZXJzIHRoZSBlbGVtZW50cyBvZiBnaXZlbiBpbm5lciBpdGVyYXRvcnMuCisvLy8KKy8vLyBUaGUgcHJlZGljYXRlIHBhcmFtZXRlciBzaG91bGQgYmUgYSBjYWxsYWJsZSBvYmplY3QgdGhhdCBhY2NlcHRzIHRoZSB3cmFwcGVkCisvLy8gaXRlcmF0b3IncyByZWZlcmVuY2UgdHlwZSBhbmQgcmV0dXJucyBhIGJvb2wuIFdoZW4gaW5jcmVtZW50aW5nIG9yCisvLy8gZGVjcmVtZW50aW5nIHRoZSBpdGVyYXRvciwgaXQgd2lsbCBjYWxsIHRoZSBwcmVkaWNhdGUgb24gZWFjaCBlbGVtZW50IGFuZAorLy8vIHNraXAgYW55IHdoZXJlIGl0IHJldHVybnMgZmFsc2UuCisvLy8KKy8vLyBcY29kZQorLy8vICAgaW50IEFbXSA9IHsgMSwgMiwgMywgNCB9OworLy8vICAgYXV0byBSID0gbWFrZV9maWx0ZXJfcmFuZ2UoQSwgW10oaW50IE4pIHsgcmV0dXJuIE4gJSAyID09IDE7IH0pOworLy8vICAgLy8gUiBjb250YWlucyB7IDEsIDMgfS4KKy8vLyBcZW5kY29kZQordGVtcGxhdGUgPHR5cGVuYW1lIFdyYXBwZWRJdGVyYXRvclQsIHR5cGVuYW1lIFByZWRpY2F0ZVQ+CitjbGFzcyBmaWx0ZXJfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U8CisgICAgICAgICAgZmlsdGVyX2l0ZXJhdG9yPFdyYXBwZWRJdGVyYXRvclQsIFByZWRpY2F0ZVQ+LCBXcmFwcGVkSXRlcmF0b3JULAorICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6Y29tbW9uX3R5cGU8CisgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPAorICAgICAgICAgICAgICAgICAgV3JhcHBlZEl0ZXJhdG9yVD46Oml0ZXJhdG9yX2NhdGVnb3J5Pjo6dHlwZT4geworICB1c2luZyBCYXNlVCA9IGl0ZXJhdG9yX2FkYXB0b3JfYmFzZTwKKyAgICAgIGZpbHRlcl9pdGVyYXRvcjxXcmFwcGVkSXRlcmF0b3JULCBQcmVkaWNhdGVUPiwgV3JhcHBlZEl0ZXJhdG9yVCwKKyAgICAgIHR5cGVuYW1lIHN0ZDo6Y29tbW9uX3R5cGU8CisgICAgICAgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxXcmFwcGVkSXRlcmF0b3JUPjo6aXRlcmF0b3JfY2F0ZWdvcnk+OjoKKyAgICAgICAgICB0eXBlPjsKKworICBzdHJ1Y3QgUGF5bG9hZFR5cGUgeworICAgIFdyYXBwZWRJdGVyYXRvclQgRW5kOworICAgIFByZWRpY2F0ZVQgUHJlZDsKKyAgfTsKKworICBPcHRpb25hbDxQYXlsb2FkVHlwZT4gUGF5bG9hZDsKKworICB2b2lkIGZpbmROZXh0VmFsaWQoKSB7CisgICAgYXNzZXJ0KFBheWxvYWQgJiYgIlBheWxvYWQgc2hvdWxkIGJlIGVuZ2FnZWQgd2hlbiBmaW5kTmV4dFZhbGlkIGlzIGNhbGxlZCIpOworICAgIHdoaWxlICh0aGlzLT5JICE9IFBheWxvYWQtPkVuZCAmJiAhUGF5bG9hZC0+UHJlZCgqdGhpcy0+SSkpCisgICAgICBCYXNlVDo6b3BlcmF0b3IrKygpOworICB9CisKKyAgLy8gQ29uc3RydWN0IHRoZSBiZWdpbiBpdGVyYXRvci4gVGhlIGJlZ2luIGl0ZXJhdG9yIHJlcXVpcmVzIHRvIGtub3cgd2hlcmUgZW5kCisgIC8vIGlzLCBzbyB0aGF0IGl0IGNhbiBwcm9wZXJseSBzdG9wIHdoZW4gaXQgaGl0cyBlbmQuCisgIGZpbHRlcl9pdGVyYXRvcihXcmFwcGVkSXRlcmF0b3JUIEJlZ2luLCBXcmFwcGVkSXRlcmF0b3JUIEVuZCwgUHJlZGljYXRlVCBQcmVkKQorICAgICAgOiBCYXNlVChzdGQ6Om1vdmUoQmVnaW4pKSwKKyAgICAgICAgUGF5bG9hZChQYXlsb2FkVHlwZXtzdGQ6Om1vdmUoRW5kKSwgc3RkOjptb3ZlKFByZWQpfSkgeworICAgIGZpbmROZXh0VmFsaWQoKTsKKyAgfQorCisgIC8vIENvbnN0cnVjdCB0aGUgZW5kIGl0ZXJhdG9yLiBJdCdzIG5vdCBpbmNyZW1lbnRhYmxlLCBzbyBQYXlsb2FkIGRvZXNuJ3QKKyAgLy8gaGF2ZSB0byBiZSBlbmdhZ2VkLgorICBmaWx0ZXJfaXRlcmF0b3IoV3JhcHBlZEl0ZXJhdG9yVCBFbmQpIDogQmFzZVQoRW5kKSB7fQorCitwdWJsaWM6CisgIHVzaW5nIEJhc2VUOjpvcGVyYXRvcisrOworCisgIGZpbHRlcl9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICBCYXNlVDo6b3BlcmF0b3IrKygpOworICAgIGZpbmROZXh0VmFsaWQoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUlQsIHR5cGVuYW1lIFBUPgorICBmcmllbmQgaXRlcmF0b3JfcmFuZ2U8ZmlsdGVyX2l0ZXJhdG9yPGRldGFpbDo6SXRlck9mUmFuZ2U8UlQ+LCBQVD4+CisgIG1ha2VfZmlsdGVyX3JhbmdlKFJUICYmLCBQVCk7Cit9OworCisvLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCB0YWtlcyBhIHJhbmdlIG9mIGVsZW1lbnRzIGFuZCBhIHByZWRpY2F0ZSwKKy8vLyBhbmQgcmV0dXJuIGEgbmV3IGZpbHRlcl9pdGVyYXRvciByYW5nZS4KKy8vLworLy8vIEZJWE1FOiBDdXJyZW50bHkgaWYgUmFuZ2VUICYmIGlzIGEgcnZhbHVlIHJlZmVyZW5jZSB0byBhIHRlbXBvcmFyeSwgdGhlCisvLy8gbGlmZXRpbWUgb2YgdGhhdCB0ZW1wb3JhcnkgaXMgbm90IGtlcHQgYnkgdGhlIHJldHVybmVkIHJhbmdlIG9iamVjdCwgYW5kIHRoZQorLy8vIHRlbXBvcmFyeSBpcyBnb2luZyB0byBiZSBkcm9wcGVkIG9uIHRoZSBmbG9vciBhZnRlciB0aGUgbWFrZV9pdGVyYXRvcl9yYW5nZQorLy8vIGZ1bGwgZXhwcmVzc2lvbiB0aGF0IGNvbnRhaW5zIHRoaXMgZnVuY3Rpb24gY2FsbC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSYW5nZVQsIHR5cGVuYW1lIFByZWRpY2F0ZVQ+CitpdGVyYXRvcl9yYW5nZTxmaWx0ZXJfaXRlcmF0b3I8ZGV0YWlsOjpJdGVyT2ZSYW5nZTxSYW5nZVQ+LCBQcmVkaWNhdGVUPj4KK21ha2VfZmlsdGVyX3JhbmdlKFJhbmdlVCAmJlJhbmdlLCBQcmVkaWNhdGVUIFByZWQpIHsKKyAgdXNpbmcgRmlsdGVySXRlcmF0b3JUID0KKyAgICAgIGZpbHRlcl9pdGVyYXRvcjxkZXRhaWw6Okl0ZXJPZlJhbmdlPFJhbmdlVD4sIFByZWRpY2F0ZVQ+OworICByZXR1cm4gbWFrZV9yYW5nZShGaWx0ZXJJdGVyYXRvclQoc3RkOjpiZWdpbihzdGQ6OmZvcndhcmQ8UmFuZ2VUPihSYW5nZSkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjplbmQoc3RkOjpmb3J3YXJkPFJhbmdlVD4oUmFuZ2UpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShQcmVkKSksCisgICAgICAgICAgICAgICAgICAgIEZpbHRlckl0ZXJhdG9yVChzdGQ6OmVuZChzdGQ6OmZvcndhcmQ8UmFuZ2VUPihSYW5nZSkpKSk7Cit9CisKKy8vIGZvcndhcmQgZGVjbGFyYXRpb25zIHJlcXVpcmVkIGJ5IHppcF9zaG9ydGVzdC96aXBfZmlyc3QKK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBVbmFyeVByZWRpY2F0ZT4KK2Jvb2wgYWxsX29mKFIgJiZyYW5nZSwgVW5hcnlQcmVkaWNhdGUgUCk7CisKK3RlbXBsYXRlIDxzaXplX3QuLi4gST4gc3RydWN0IGluZGV4X3NlcXVlbmNlOworCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gVHM+IHN0cnVjdCBpbmRleF9zZXF1ZW5jZV9mb3I7CisKK25hbWVzcGFjZSBkZXRhaWwgeworCit1c2luZyBzdGQ6OmRlY2x2YWw7CisKKy8vIFdlIGhhdmUgdG8gYWxpYXMgdGhpcyBzaW5jZSBpbmxpbmluZyB0aGUgYWN0dWFsIHR5cGUgYXQgdGhlIHVzYWdlIHNpdGUKKy8vIGluIHRoZSBwYXJhbWV0ZXIgbGlzdCBvZiBpdGVyYXRvcl9mYWNhZGVfYmFzZTw+IGJlbG93IElDRXMgTVNWQyAyMDE3LgordGVtcGxhdGU8dHlwZW5hbWUuLi4gSXRlcnM+IHN0cnVjdCBaaXBUdXBsZVR5cGUgeworICB1c2luZyB0eXBlID0gc3RkOjp0dXBsZTxkZWNsdHlwZSgqZGVjbHZhbDxJdGVycz4oKSkuLi4+OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFppcFR5cGUsIHR5cGVuYW1lLi4uIEl0ZXJzPgordXNpbmcgemlwX3RyYWl0cyA9IGl0ZXJhdG9yX2ZhY2FkZV9iYXNlPAorICAgIFppcFR5cGUsIHR5cGVuYW1lIHN0ZDo6Y29tbW9uX3R5cGU8c3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEl0ZXJzPjo6aXRlcmF0b3JfY2F0ZWdvcnkuLi4+Ojp0eXBlLAorICAgIC8vIF4gVE9ETzogSW1wbGVtZW50IHJhbmRvbSBhY2Nlc3MgbWV0aG9kcy4KKyAgICB0eXBlbmFtZSBaaXBUdXBsZVR5cGU8SXRlcnMuLi4+Ojp0eXBlLAorICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPHR5cGVuYW1lIHN0ZDo6dHVwbGVfZWxlbWVudDwKKyAgICAgICAgMCwgc3RkOjp0dXBsZTxJdGVycy4uLj4+Ojp0eXBlPjo6ZGlmZmVyZW5jZV90eXBlLAorICAgIC8vIF4gRklYTUU6IFRoaXMgZm9sbG93cyBib29zdDo6bWFrZV96aXBfaXRlcmF0b3IncyBhc3N1bXB0aW9uIHRoYXQgYWxsCisgICAgLy8gaW5uZXIgaXRlcmF0b3JzIGhhdmUgdGhlIHNhbWUgZGlmZmVyZW5jZV90eXBlLiBJdCB3b3VsZCBmYWlsIGlmLCBmb3IKKyAgICAvLyBpbnN0YW5jZSwgdGhlIHNlY29uZCBmaWVsZCdzIGRpZmZlcmVuY2VfdHlwZSB3ZXJlIG5vbi1udW1lcmljIHdoaWxlIHRoZQorICAgIC8vIGZpcnN0IGlzLgorICAgIHR5cGVuYW1lIFppcFR1cGxlVHlwZTxJdGVycy4uLj46OnR5cGUgKiwKKyAgICB0eXBlbmFtZSBaaXBUdXBsZVR5cGU8SXRlcnMuLi4+Ojp0eXBlPjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFppcFR5cGUsIHR5cGVuYW1lLi4uIEl0ZXJzPgorc3RydWN0IHppcF9jb21tb24gOiBwdWJsaWMgemlwX3RyYWl0czxaaXBUeXBlLCBJdGVycy4uLj4geworICB1c2luZyBCYXNlID0gemlwX3RyYWl0czxaaXBUeXBlLCBJdGVycy4uLj47CisgIHVzaW5nIHZhbHVlX3R5cGUgPSB0eXBlbmFtZSBCYXNlOjp2YWx1ZV90eXBlOworCisgIHN0ZDo6dHVwbGU8SXRlcnMuLi4+IGl0ZXJhdG9yczsKKworcHJvdGVjdGVkOgorICB0ZW1wbGF0ZSA8c2l6ZV90Li4uIE5zPiB2YWx1ZV90eXBlIGRlcmVmKGluZGV4X3NlcXVlbmNlPE5zLi4uPikgY29uc3QgeworICAgIHJldHVybiB2YWx1ZV90eXBlKCpzdGQ6OmdldDxOcz4oaXRlcmF0b3JzKS4uLik7CisgIH0KKworICB0ZW1wbGF0ZSA8c2l6ZV90Li4uIE5zPgorICBkZWNsdHlwZShpdGVyYXRvcnMpIHR1cF9pbmMoaW5kZXhfc2VxdWVuY2U8TnMuLi4+KSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6dHVwbGU8SXRlcnMuLi4+KHN0ZDo6bmV4dChzdGQ6OmdldDxOcz4oaXRlcmF0b3JzKSkuLi4pOworICB9CisKKyAgdGVtcGxhdGUgPHNpemVfdC4uLiBOcz4KKyAgZGVjbHR5cGUoaXRlcmF0b3JzKSB0dXBfZGVjKGluZGV4X3NlcXVlbmNlPE5zLi4uPikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnR1cGxlPEl0ZXJzLi4uPihzdGQ6OnByZXYoc3RkOjpnZXQ8TnM+KGl0ZXJhdG9ycykpLi4uKTsKKyAgfQorCitwdWJsaWM6CisgIHppcF9jb21tb24oSXRlcnMgJiYuLi4gdHMpIDogaXRlcmF0b3JzKHN0ZDo6Zm9yd2FyZDxJdGVycz4odHMpLi4uKSB7fQorCisgIHZhbHVlX3R5cGUgb3BlcmF0b3IqKCkgeyByZXR1cm4gZGVyZWYoaW5kZXhfc2VxdWVuY2VfZm9yPEl0ZXJzLi4uPnt9KTsgfQorCisgIGNvbnN0IHZhbHVlX3R5cGUgb3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiBkZXJlZihpbmRleF9zZXF1ZW5jZV9mb3I8SXRlcnMuLi4+e30pOworICB9CisKKyAgWmlwVHlwZSAmb3BlcmF0b3IrKygpIHsKKyAgICBpdGVyYXRvcnMgPSB0dXBfaW5jKGluZGV4X3NlcXVlbmNlX2ZvcjxJdGVycy4uLj57fSk7CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFppcFR5cGUgKj4odGhpcyk7CisgIH0KKworICBaaXBUeXBlICZvcGVyYXRvci0tKCkgeworICAgIHN0YXRpY19hc3NlcnQoQmFzZTo6SXNCaWRpcmVjdGlvbmFsLAorICAgICAgICAgICAgICAgICAgIkFsbCBpbm5lciBpdGVyYXRvcnMgbXVzdCBiZSBhdCBsZWFzdCBiaWRpcmVjdGlvbmFsLiIpOworICAgIGl0ZXJhdG9ycyA9IHR1cF9kZWMoaW5kZXhfc2VxdWVuY2VfZm9yPEl0ZXJzLi4uPnt9KTsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8WmlwVHlwZSAqPih0aGlzKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lLi4uIEl0ZXJzPgorc3RydWN0IHppcF9maXJzdCA6IHB1YmxpYyB6aXBfY29tbW9uPHppcF9maXJzdDxJdGVycy4uLj4sIEl0ZXJzLi4uPiB7CisgIHVzaW5nIEJhc2UgPSB6aXBfY29tbW9uPHppcF9maXJzdDxJdGVycy4uLj4sIEl0ZXJzLi4uPjsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgemlwX2ZpcnN0PEl0ZXJzLi4uPiAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpnZXQ8MD4odGhpcy0+aXRlcmF0b3JzKSA9PSBzdGQ6OmdldDwwPihvdGhlci5pdGVyYXRvcnMpOworICB9CisKKyAgemlwX2ZpcnN0KEl0ZXJzICYmLi4uIHRzKSA6IEJhc2Uoc3RkOjpmb3J3YXJkPEl0ZXJzPih0cykuLi4pIHt9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gSXRlcnM+CitjbGFzcyB6aXBfc2hvcnRlc3QgOiBwdWJsaWMgemlwX2NvbW1vbjx6aXBfc2hvcnRlc3Q8SXRlcnMuLi4+LCBJdGVycy4uLj4geworICB0ZW1wbGF0ZSA8c2l6ZV90Li4uIE5zPgorICBib29sIHRlc3QoY29uc3QgemlwX3Nob3J0ZXN0PEl0ZXJzLi4uPiAmb3RoZXIsIGluZGV4X3NlcXVlbmNlPE5zLi4uPikgY29uc3QgeworICAgIHJldHVybiBhbGxfb2Yoc3RkOjppbml0aWFsaXplcl9saXN0PGJvb2w+e3N0ZDo6Z2V0PE5zPih0aGlzLT5pdGVyYXRvcnMpICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpnZXQ8TnM+KG90aGVyLml0ZXJhdG9ycykuLi59LAorICAgICAgICAgICAgICAgICAgaWRlbnRpdHk8Ym9vbD57fSk7CisgIH0KKworcHVibGljOgorICB1c2luZyBCYXNlID0gemlwX2NvbW1vbjx6aXBfc2hvcnRlc3Q8SXRlcnMuLi4+LCBJdGVycy4uLj47CisKKyAgemlwX3Nob3J0ZXN0KEl0ZXJzICYmLi4uIHRzKSA6IEJhc2Uoc3RkOjpmb3J3YXJkPEl0ZXJzPih0cykuLi4pIHt9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHppcF9zaG9ydGVzdDxJdGVycy4uLj4gJm90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuICF0ZXN0KG90aGVyLCBpbmRleF9zZXF1ZW5jZV9mb3I8SXRlcnMuLi4+e30pOworICB9Cit9OworCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPHR5cGVuYW1lLi4uPiBjbGFzcyBJdFR5cGUsIHR5cGVuYW1lLi4uIEFyZ3M+IGNsYXNzIHppcHB5IHsKK3B1YmxpYzoKKyAgdXNpbmcgaXRlcmF0b3IgPSBJdFR5cGU8ZGVjbHR5cGUoc3RkOjpiZWdpbihzdGQ6OmRlY2x2YWw8QXJncz4oKSkpLi4uPjsKKyAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSB0eXBlbmFtZSBpdGVyYXRvcjo6aXRlcmF0b3JfY2F0ZWdvcnk7CisgIHVzaW5nIHZhbHVlX3R5cGUgPSB0eXBlbmFtZSBpdGVyYXRvcjo6dmFsdWVfdHlwZTsKKyAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gdHlwZW5hbWUgaXRlcmF0b3I6OmRpZmZlcmVuY2VfdHlwZTsKKyAgdXNpbmcgcG9pbnRlciA9IHR5cGVuYW1lIGl0ZXJhdG9yOjpwb2ludGVyOworICB1c2luZyByZWZlcmVuY2UgPSB0eXBlbmFtZSBpdGVyYXRvcjo6cmVmZXJlbmNlOworCitwcml2YXRlOgorICBzdGQ6OnR1cGxlPEFyZ3MuLi4+IHRzOworCisgIHRlbXBsYXRlIDxzaXplX3QuLi4gTnM+IGl0ZXJhdG9yIGJlZ2luX2ltcGwoaW5kZXhfc2VxdWVuY2U8TnMuLi4+KSBjb25zdCB7CisgICAgcmV0dXJuIGl0ZXJhdG9yKHN0ZDo6YmVnaW4oc3RkOjpnZXQ8TnM+KHRzKSkuLi4pOworICB9CisgIHRlbXBsYXRlIDxzaXplX3QuLi4gTnM+IGl0ZXJhdG9yIGVuZF9pbXBsKGluZGV4X3NlcXVlbmNlPE5zLi4uPikgY29uc3QgeworICAgIHJldHVybiBpdGVyYXRvcihzdGQ6OmVuZChzdGQ6OmdldDxOcz4odHMpKS4uLik7CisgIH0KKworcHVibGljOgorICB6aXBweShBcmdzICYmLi4uIHRzXykgOiB0cyhzdGQ6OmZvcndhcmQ8QXJncz4odHNfKS4uLikge30KKworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGJlZ2luX2ltcGwoaW5kZXhfc2VxdWVuY2VfZm9yPEFyZ3MuLi4+e30pOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGVuZF9pbXBsKGluZGV4X3NlcXVlbmNlX2ZvcjxBcmdzLi4uPnt9KTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAorCisvLy8gemlwIGl0ZXJhdG9yIGZvciB0d28gb3IgbW9yZSBpdGVyYXRhYmxlIHR5cGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lLi4uIEFyZ3M+CitkZXRhaWw6OnppcHB5PGRldGFpbDo6emlwX3Nob3J0ZXN0LCBULCBVLCBBcmdzLi4uPiB6aXAoVCAmJnQsIFUgJiZ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3MgJiYuLi4gYXJncykgeworICByZXR1cm4gZGV0YWlsOjp6aXBweTxkZXRhaWw6OnppcF9zaG9ydGVzdCwgVCwgVSwgQXJncy4uLj4oCisgICAgICBzdGQ6OmZvcndhcmQ8VD4odCksIHN0ZDo6Zm9yd2FyZDxVPih1KSwgc3RkOjpmb3J3YXJkPEFyZ3M+KGFyZ3MpLi4uKTsKK30KKworLy8vIHppcCBpdGVyYXRvciB0aGF0LCBmb3IgdGhlIHNha2Ugb2YgZWZmaWNpZW5jeSwgYXNzdW1lcyB0aGUgZmlyc3QgaXRlcmF0ZWUgdG8KKy8vLyBiZSB0aGUgc2hvcnRlc3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSwgdHlwZW5hbWUuLi4gQXJncz4KK2RldGFpbDo6emlwcHk8ZGV0YWlsOjp6aXBfZmlyc3QsIFQsIFUsIEFyZ3MuLi4+IHppcF9maXJzdChUICYmdCwgVSAmJnUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJncyAmJi4uLiBhcmdzKSB7CisgIHJldHVybiBkZXRhaWw6OnppcHB5PGRldGFpbDo6emlwX2ZpcnN0LCBULCBVLCBBcmdzLi4uPigKKyAgICAgIHN0ZDo6Zm9yd2FyZDxUPih0KSwgc3RkOjpmb3J3YXJkPFU+KHUpLCBzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOworfQorCisvLy8gSXRlcmF0b3Igd3JhcHBlciB0aGF0IGNvbmNhdGVuYXRlcyBzZXF1ZW5jZXMgdG9nZXRoZXIuCisvLy8KKy8vLyBUaGlzIGNhbiBjb25jYXRlbmF0ZSBkaWZmZXJlbnQgaXRlcmF0b3JzLCBldmVuIHdpdGggZGlmZmVyZW50IHR5cGVzLCBpbnRvCisvLy8gYSBzaW5nbGUgaXRlcmF0b3IgcHJvdmlkZWQgdGhlIHZhbHVlIHR5cGVzIG9mIGFsbCB0aGUgY29uY2F0ZW5hdGVkCisvLy8gaXRlcmF0b3JzIGV4cG9zZSBgcmVmZXJlbmNlYCBhbmQgYHBvaW50ZXJgIHR5cGVzIHRoYXQgY2FuIGJlIGNvbnZlcnRlZCB0bworLy8vIGBWYWx1ZVQgJmAgYW5kIGBWYWx1ZVQgKmAgcmVzcGVjdGl2ZWx5LiBJdCBkb2Vzbid0IHN1cHBvcnQgbW9yZQorLy8vIGludGVyZXN0aW5nL2N1c3RvbWl6ZWQgcG9pbnRlciBvciByZWZlcmVuY2UgdHlwZXMuCisvLy8KKy8vLyBDdXJyZW50bHkgdGhpcyBvbmx5IHN1cHBvcnRzIGZvcndhcmQgb3IgaGlnaGVyIGl0ZXJhdG9yIGNhdGVnb3JpZXMgYXMKKy8vLyBpbnB1dHMgYW5kIGFsd2F5cyBleHBvc2VzIGEgZm9yd2FyZCBpdGVyYXRvciBpbnRlcmZhY2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVULCB0eXBlbmFtZS4uLiBJdGVyVHM+CitjbGFzcyBjb25jYXRfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcl9mYWNhZGVfYmFzZTxjb25jYXRfaXRlcmF0b3I8VmFsdWVULCBJdGVyVHMuLi4+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIFZhbHVlVD4geworICB1c2luZyBCYXNlVCA9IHR5cGVuYW1lIGNvbmNhdF9pdGVyYXRvcjo6aXRlcmF0b3JfZmFjYWRlX2Jhc2U7CisKKyAgLy8vIFdlIHN0b3JlIGJvdGggdGhlIGN1cnJlbnQgYW5kIGVuZCBpdGVyYXRvcnMgZm9yIGVhY2ggY29uY2F0ZW5hdGVkCisgIC8vLyBzZXF1ZW5jZSBpbiBhIHR1cGxlIG9mIHBhaXJzLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBzb21ldGhpbmcgbGlrZSBpdGVyYXRvcl9yYW5nZSBzZWVtcyBuaWNlIGF0IGZpcnN0IGhlcmUsIGJ1dCB0aGUKKyAgLy8vIHJhbmdlIHByb3BlcnRpZXMgYXJlIG9mIGxpdHRsZSBiZW5lZml0IGFuZCBlbmQgdXAgZ2V0dGluZyBpbiB0aGUgd2F5CisgIC8vLyBiZWNhdXNlIHdlIG5lZWQgdG8gZG8gbXV0YXRpb24gb24gdGhlIGN1cnJlbnQgaXRlcmF0b3JzLgorICBzdGQ6OnR1cGxlPHN0ZDo6cGFpcjxJdGVyVHMsIEl0ZXJUcz4uLi4+IEl0ZXJQYWlyczsKKworICAvLy8gQXR0ZW1wdHMgdG8gaW5jcmVtZW50IGEgc3BlY2lmaWMgaXRlcmF0b3IuCisgIC8vLworICAvLy8gUmV0dXJucyB0cnVlIGlmIGl0IHdhcyBhYmxlIHRvIGluY3JlbWVudCB0aGUgaXRlcmF0b3IuIFJldHVybnMgZmFsc2UgaWYKKyAgLy8vIHRoZSBpdGVyYXRvciBpcyBhbHJlYWR5IGF0IHRoZSBlbmQgaXRlcmF0b3IuCisgIHRlbXBsYXRlIDxzaXplX3QgSW5kZXg+IGJvb2wgaW5jcmVtZW50SGVscGVyKCkgeworICAgIGF1dG8gJkl0ZXJQYWlyID0gc3RkOjpnZXQ8SW5kZXg+KEl0ZXJQYWlycyk7CisgICAgaWYgKEl0ZXJQYWlyLmZpcnN0ID09IEl0ZXJQYWlyLnNlY29uZCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgICsrSXRlclBhaXIuZmlyc3Q7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gSW5jcmVtZW50cyB0aGUgZmlyc3Qgbm9uLWVuZCBpdGVyYXRvci4KKyAgLy8vCisgIC8vLyBJdCBpcyBhbiBlcnJvciB0byBjYWxsIHRoaXMgd2l0aCBhbGwgaXRlcmF0b3JzIGF0IHRoZSBlbmQuCisgIHRlbXBsYXRlIDxzaXplX3QuLi4gTnM+IHZvaWQgaW5jcmVtZW50KGluZGV4X3NlcXVlbmNlPE5zLi4uPikgeworICAgIC8vIEJ1aWxkIGEgc2VxdWVuY2Ugb2YgZnVuY3Rpb25zIHRvIGluY3JlbWVudCBlYWNoIGl0ZXJhdG9yIGlmIHBvc3NpYmxlLgorICAgIGJvb2wgKGNvbmNhdF9pdGVyYXRvcjo6KkluY3JlbWVudEhlbHBlckZuc1tdKSgpID0geworICAgICAgICAmY29uY2F0X2l0ZXJhdG9yOjppbmNyZW1lbnRIZWxwZXI8TnM+Li4ufTsKKworICAgIC8vIExvb3Agb3ZlciB0aGVtLCBhbmQgc3RvcCBhcyBzb29uIGFzIHdlIHN1Y2NlZWQgYXQgaW5jcmVtZW50aW5nIG9uZS4KKyAgICBmb3IgKGF1dG8gJkluY3JlbWVudEhlbHBlckZuIDogSW5jcmVtZW50SGVscGVyRm5zKQorICAgICAgaWYgKCh0aGlzLT4qSW5jcmVtZW50SGVscGVyRm4pKCkpCisgICAgICAgIHJldHVybjsKKworICAgIGxsdm1fdW5yZWFjaGFibGUoIkF0dGVtcHRlZCB0byBpbmNyZW1lbnQgYW4gZW5kIGNvbmNhdCBpdGVyYXRvciEiKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIG51bGwgaWYgdGhlIHNwZWNpZmllZCBpdGVyYXRvciBpcyBhdCB0aGUgZW5kLiBPdGhlcndpc2UsCisgIC8vLyBkZXJlZmVyZW5jZXMgdGhlIGl0ZXJhdG9yIGFuZCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSByZXN1bHRpbmcKKyAgLy8vIHJlZmVyZW5jZS4KKyAgdGVtcGxhdGUgPHNpemVfdCBJbmRleD4gVmFsdWVUICpnZXRIZWxwZXIoKSBjb25zdCB7CisgICAgYXV0byAmSXRlclBhaXIgPSBzdGQ6OmdldDxJbmRleD4oSXRlclBhaXJzKTsKKyAgICBpZiAoSXRlclBhaXIuZmlyc3QgPT0gSXRlclBhaXIuc2Vjb25kKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICByZXR1cm4gJipJdGVyUGFpci5maXJzdDsKKyAgfQorCisgIC8vLyBGaW5kcyB0aGUgZmlyc3Qgbm9uLWVuZCBpdGVyYXRvciwgZGVyZWZlcmVuY2VzLCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0aW5nCisgIC8vLyByZWZlcmVuY2UuCisgIC8vLworICAvLy8gSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIHdpdGggYWxsIGl0ZXJhdG9ycyBhdCB0aGUgZW5kLgorICB0ZW1wbGF0ZSA8c2l6ZV90Li4uIE5zPiBWYWx1ZVQgJmdldChpbmRleF9zZXF1ZW5jZTxOcy4uLj4pIGNvbnN0IHsKKyAgICAvLyBCdWlsZCBhIHNlcXVlbmNlIG9mIGZ1bmN0aW9ucyB0byBnZXQgZnJvbSBpdGVyYXRvciBpZiBwb3NzaWJsZS4KKyAgICBWYWx1ZVQgKihjb25jYXRfaXRlcmF0b3I6OipHZXRIZWxwZXJGbnNbXSkoKSBjb25zdCA9IHsKKyAgICAgICAgJmNvbmNhdF9pdGVyYXRvcjo6Z2V0SGVscGVyPE5zPi4uLn07CisKKyAgICAvLyBMb29wIG92ZXIgdGhlbSwgYW5kIHJldHVybiB0aGUgZmlyc3QgcmVzdWx0IHdlIGZpbmQuCisgICAgZm9yIChhdXRvICZHZXRIZWxwZXJGbiA6IEdldEhlbHBlckZucykKKyAgICAgIGlmIChWYWx1ZVQgKlAgPSAodGhpcy0+KkdldEhlbHBlckZuKSgpKQorICAgICAgICByZXR1cm4gKlA7CisKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJBdHRlbXB0ZWQgdG8gZ2V0IGEgcG9pbnRlciBmcm9tIGFuIGVuZCBjb25jYXQgaXRlcmF0b3IhIik7CisgIH0KKworcHVibGljOgorICAvLy8gQ29uc3RydWN0cyBhbiBpdGVyYXRvciBmcm9tIGEgc3F1ZW5jZSBvZiByYW5nZXMuCisgIC8vLworICAvLy8gV2UgbmVlZCB0aGUgZnVsbCByYW5nZSB0byBrbm93IGhvdyB0byBzd2l0Y2ggYmV0d2VlbiBlYWNoIG9mIHRoZQorICAvLy8gaXRlcmF0b3JzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gUmFuZ2VUcz4KKyAgZXhwbGljaXQgY29uY2F0X2l0ZXJhdG9yKFJhbmdlVHMgJiYuLi4gUmFuZ2VzKQorICAgICAgOiBJdGVyUGFpcnMoe3N0ZDo6YmVnaW4oUmFuZ2VzKSwgc3RkOjplbmQoUmFuZ2VzKX0uLi4pIHt9CisKKyAgdXNpbmcgQmFzZVQ6Om9wZXJhdG9yKys7CisKKyAgY29uY2F0X2l0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgIGluY3JlbWVudChpbmRleF9zZXF1ZW5jZV9mb3I8SXRlclRzLi4uPigpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBWYWx1ZVQgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIGdldChpbmRleF9zZXF1ZW5jZV9mb3I8SXRlclRzLi4uPigpKTsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBjb25jYXRfaXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiBJdGVyUGFpcnMgPT0gUkhTLkl0ZXJQYWlyczsKKyAgfQorfTsKKworbmFtZXNwYWNlIGRldGFpbCB7CisKKy8vLyBIZWxwZXIgdG8gc3RvcmUgYSBzZXF1ZW5jZSBvZiByYW5nZXMgYmVpbmcgY29uY2F0ZW5hdGVkIGFuZCBhY2Nlc3MgdGhlbS4KKy8vLworLy8vIFRoaXMgaXMgZGVzaWduZWQgdG8gZmFjaWxpdGF0ZSBwcm92aWRpbmcgYWN0dWFsIHN0b3JhZ2Ugd2hlbiB0ZW1wb3JhcmllcworLy8vIGFyZSBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3Igc3VjaCB0aGF0IHdlIGNhbiB1c2UgaXQgYXMgcGFydCBvZiByYW5nZQorLy8vIGJhc2VkIGZvciBsb29wcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVQsIHR5cGVuYW1lLi4uIFJhbmdlVHM+IGNsYXNzIGNvbmNhdF9yYW5nZSB7CitwdWJsaWM6CisgIHVzaW5nIGl0ZXJhdG9yID0KKyAgICAgIGNvbmNhdF9pdGVyYXRvcjxWYWx1ZVQsCisgICAgICAgICAgICAgICAgICAgICAgZGVjbHR5cGUoc3RkOjpiZWdpbihzdGQ6OmRlY2x2YWw8UmFuZ2VUcyAmPigpKSkuLi4+OworCitwcml2YXRlOgorICBzdGQ6OnR1cGxlPFJhbmdlVHMuLi4+IFJhbmdlczsKKworICB0ZW1wbGF0ZSA8c2l6ZV90Li4uIE5zPiBpdGVyYXRvciBiZWdpbl9pbXBsKGluZGV4X3NlcXVlbmNlPE5zLi4uPikgeworICAgIHJldHVybiBpdGVyYXRvcihzdGQ6OmdldDxOcz4oUmFuZ2VzKS4uLik7CisgIH0KKyAgdGVtcGxhdGUgPHNpemVfdC4uLiBOcz4gaXRlcmF0b3IgZW5kX2ltcGwoaW5kZXhfc2VxdWVuY2U8TnMuLi4+KSB7CisgICAgcmV0dXJuIGl0ZXJhdG9yKG1ha2VfcmFuZ2Uoc3RkOjplbmQoc3RkOjpnZXQ8TnM+KFJhbmdlcykpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZW5kKHN0ZDo6Z2V0PE5zPihSYW5nZXMpKSkuLi4pOworICB9CisKK3B1YmxpYzoKKyAgY29uY2F0X3JhbmdlKFJhbmdlVHMgJiYuLi4gUmFuZ2VzKQorICAgICAgOiBSYW5nZXMoc3RkOjpmb3J3YXJkPFJhbmdlVHM+KFJhbmdlcykuLi4pIHt9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBiZWdpbl9pbXBsKGluZGV4X3NlcXVlbmNlX2ZvcjxSYW5nZVRzLi4uPnt9KTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBlbmRfaW1wbChpbmRleF9zZXF1ZW5jZV9mb3I8UmFuZ2VUcy4uLj57fSk7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkZXRhaWwKKworLy8vIENvbmNhdGVuYXRlZCByYW5nZSBhY3Jvc3MgdHdvIG9yIG1vcmUgcmFuZ2VzLgorLy8vCisvLy8gVGhlIGRlc2lyZWQgdmFsdWUgdHlwZSBtdXN0IGJlIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVCwgdHlwZW5hbWUuLi4gUmFuZ2VUcz4KK2RldGFpbDo6Y29uY2F0X3JhbmdlPFZhbHVlVCwgUmFuZ2VUcy4uLj4gY29uY2F0KFJhbmdlVHMgJiYuLi4gUmFuZ2VzKSB7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mLi4uKFJhbmdlVHMpID4gMSwKKyAgICAgICAgICAgICAgICAiTmVlZCBtb3JlIHRoYW4gb25lIHJhbmdlIHRvIGNvbmNhdGVuYXRlISIpOworICByZXR1cm4gZGV0YWlsOjpjb25jYXRfcmFuZ2U8VmFsdWVULCBSYW5nZVRzLi4uPigKKyAgICAgIHN0ZDo6Zm9yd2FyZDxSYW5nZVRzPihSYW5nZXMpLi4uKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICBFeHRyYSBhZGRpdGlvbnMgdG8gPHV0aWxpdHk+CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gXGJyaWVmIEZ1bmN0aW9uIG9iamVjdCB0byBjaGVjayB3aGV0aGVyIHRoZSBmaXJzdCBjb21wb25lbnQgb2YgYSBzdGQ6OnBhaXIKKy8vLyBjb21wYXJlcyBsZXNzIHRoYW4gdGhlIGZpcnN0IGNvbXBvbmVudCBvZiBhbm90aGVyIHN0ZDo6cGFpci4KK3N0cnVjdCBsZXNzX2ZpcnN0IHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGJvb2wgb3BlcmF0b3IoKShjb25zdCBUICZsaHMsIGNvbnN0IFQgJnJocykgY29uc3QgeworICAgIHJldHVybiBsaHMuZmlyc3QgPCByaHMuZmlyc3Q7CisgIH0KK307CisKKy8vLyBcYnJpZWYgRnVuY3Rpb24gb2JqZWN0IHRvIGNoZWNrIHdoZXRoZXIgdGhlIHNlY29uZCBjb21wb25lbnQgb2YgYSBzdGQ6OnBhaXIKKy8vLyBjb21wYXJlcyBsZXNzIHRoYW4gdGhlIHNlY29uZCBjb21wb25lbnQgb2YgYW5vdGhlciBzdGQ6OnBhaXIuCitzdHJ1Y3QgbGVzc19zZWNvbmQgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gYm9vbCBvcGVyYXRvcigpKGNvbnN0IFQgJmxocywgY29uc3QgVCAmcmhzKSBjb25zdCB7CisgICAgcmV0dXJuIGxocy5zZWNvbmQgPCByaHMuc2Vjb25kOworICB9Cit9OworCisvLyBBIHN1YnNldCBvZiBOMzY1OC4gTW9yZSBzdHVmZiBjYW4gYmUgYWRkZWQgYXMtbmVlZGVkLgorCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBjb21waWxlLXRpbWUgc2VxdWVuY2Ugb2YgaW50ZWdlcnMuCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgVC4uLiBJPiBzdHJ1Y3QgaW50ZWdlcl9zZXF1ZW5jZSB7CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBUOworCisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IHNpemUoKSB7IHJldHVybiBzaXplb2YuLi4oSSk7IH0KK307CisKKy8vLyBcYnJpZWYgQWxpYXMgZm9yIHRoZSBjb21tb24gY2FzZSBvZiBhIHNlcXVlbmNlIG9mIHNpemVfdHMuCit0ZW1wbGF0ZSA8c2l6ZV90Li4uIEk+CitzdHJ1Y3QgaW5kZXhfc2VxdWVuY2UgOiBpbnRlZ2VyX3NlcXVlbmNlPHN0ZDo6c2l6ZV90LCBJLi4uPiB7fTsKKwordGVtcGxhdGUgPHN0ZDo6c2l6ZV90IE4sIHN0ZDo6c2l6ZV90Li4uIEk+CitzdHJ1Y3QgYnVpbGRfaW5kZXhfaW1wbCA6IGJ1aWxkX2luZGV4X2ltcGw8TiAtIDEsIE4gLSAxLCBJLi4uPiB7fTsKK3RlbXBsYXRlIDxzdGQ6OnNpemVfdC4uLiBJPgorc3RydWN0IGJ1aWxkX2luZGV4X2ltcGw8MCwgSS4uLj4gOiBpbmRleF9zZXF1ZW5jZTxJLi4uPiB7fTsKKworLy8vIFxicmllZiBDcmVhdGVzIGEgY29tcGlsZS10aW1lIGludGVnZXIgc2VxdWVuY2UgZm9yIGEgcGFyYW1ldGVyIHBhY2suCit0ZW1wbGF0ZSA8Y2xhc3MuLi4gVHM+CitzdHJ1Y3QgaW5kZXhfc2VxdWVuY2VfZm9yIDogYnVpbGRfaW5kZXhfaW1wbDxzaXplb2YuLi4oVHMpPiB7fTsKKworLy8vIFV0aWxpdHkgdHlwZSB0byBidWlsZCBhbiBpbmhlcml0YW5jZSBjaGFpbiB0aGF0IG1ha2VzIGl0IGVhc3kgdG8gcmFuaworLy8vIG92ZXJsb2FkIGNhbmRpZGF0ZXMuCit0ZW1wbGF0ZSA8aW50IE4+IHN0cnVjdCByYW5rIDogcmFuazxOIC0gMT4ge307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgcmFuazwwPiB7fTsKKworLy8vIFxicmllZiB0cmFpdHMgY2xhc3MgZm9yIGNoZWNraW5nIHdoZXRoZXIgdHlwZSBUIGlzIG9uZSBvZiBhbnkgb2YgdGhlIGdpdmVuCisvLy8gdHlwZXMgaW4gdGhlIHZhcmlhZGljIGxpc3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gVHM+IHN0cnVjdCBpc19vbmVfb2YgeworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lLi4uIFRzPgorc3RydWN0IGlzX29uZV9vZjxULCBVLCBUcy4uLj4geworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9CisgICAgICBzdGQ6OmlzX3NhbWU8VCwgVT46OnZhbHVlIHx8IGlzX29uZV9vZjxULCBUcy4uLj46OnZhbHVlOworfTsKKworLy8vIFxicmllZiB0cmFpdHMgY2xhc3MgZm9yIGNoZWNraW5nIHdoZXRoZXIgdHlwZSBUIGlzIGEgYmFzZSBjbGFzcyBmb3IgYWxsCisvLy8gIHRoZSBnaXZlbiB0eXBlcyBpbiB0aGUgdmFyaWFkaWMgbGlzdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBUcz4gc3RydWN0IGFyZV9iYXNlX29mIHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFUsIHR5cGVuYW1lLi4uIFRzPgorc3RydWN0IGFyZV9iYXNlX29mPFQsIFUsIFRzLi4uPiB7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0KKyAgICAgIHN0ZDo6aXNfYmFzZV9vZjxULCBVPjo6dmFsdWUgJiYgYXJlX2Jhc2Vfb2Y8VCwgVHMuLi4+Ojp2YWx1ZTsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgRXh0cmEgYWRkaXRpb25zIGZvciBhcnJheXMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBGaW5kIHRoZSBsZW5ndGggb2YgYW4gYXJyYXkuCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgc3RkOjpzaXplX3QgTj4KK2NvbnN0ZXhwciBpbmxpbmUgc2l6ZV90IGFycmF5X2xlbmd0aG9mKFQgKCYpW05dKSB7CisgIHJldHVybiBOOworfQorCisvLy8gQWRhcHQgc3RkOjpsZXNzPFQ+IGZvciBhcnJheV9wb2Rfc29ydC4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitpbmxpbmUgaW50IGFycmF5X3BvZF9zb3J0X2NvbXBhcmF0b3IoY29uc3Qgdm9pZCAqUDEsIGNvbnN0IHZvaWQgKlAyKSB7CisgIGlmIChzdGQ6Omxlc3M8VD4oKSgqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUKj4oUDEpLAorICAgICAgICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KFAyKSkpCisgICAgcmV0dXJuIC0xOworICBpZiAoc3RkOjpsZXNzPFQ+KCkoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KFAyKSwKKyAgICAgICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PGNvbnN0IFQqPihQMSkpKQorICAgIHJldHVybiAxOworICByZXR1cm4gMDsKK30KKworLy8vIGdldF9hcnJheV9wb2Rfc29ydF9jb21wYXJhdG9yIC0gVGhpcyBpcyBhbiBpbnRlcm5hbCBoZWxwZXIgZnVuY3Rpb24gdXNlZCB0bworLy8vIGdldCB0eXBlIGRlZHVjdGlvbiBvZiBUIHJpZ2h0LgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2lubGluZSBpbnQgKCpnZXRfYXJyYXlfcG9kX3NvcnRfY29tcGFyYXRvcihjb25zdCBUICYpKQorICAgICAgICAgICAgIChjb25zdCB2b2lkKiwgY29uc3Qgdm9pZCopIHsKKyAgcmV0dXJuIGFycmF5X3BvZF9zb3J0X2NvbXBhcmF0b3I8VD47Cit9CisKKy8vLyBhcnJheV9wb2Rfc29ydCAtIFRoaXMgc29ydHMgYW4gYXJyYXkgd2l0aCB0aGUgc3BlY2lmaWVkIHN0YXJ0IGFuZCBlbmQKKy8vLyBleHRlbnQuICBUaGlzIGlzIGp1c3QgbGlrZSBzdGQ6OnNvcnQsIGV4Y2VwdCB0aGF0IGl0IGNhbGxzIHFzb3J0IGluc3RlYWQgb2YKKy8vLyB1c2luZyBhbiBpbmxpbmVkIHRlbXBsYXRlLiAgcXNvcnQgaXMgc2xpZ2h0bHkgc2xvd2VyIHRoYW4gc3RkOjpzb3J0LCBidXQKKy8vLyBtb3N0IHNvcnRzIGFyZSBub3QgcGVyZm9ybWFuY2UgY3JpdGljYWwgaW4gTExWTSBhbmQgc3RkOjpzb3J0IGhhcyB0byBiZQorLy8vIHRlbXBsYXRlIGluc3RhbnRpYXRlZCBmb3IgZWFjaCB0eXBlLCBsZWFkaW5nIHRvIHNpZ25pZmljYW50IG1lYXN1cmVkIGNvZGUKKy8vLyBibG9hdC4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGdlbmVyYWxseSBiZSB1c2VkIGluc3RlYWQgb2Ygc3RkOjpzb3J0IHdoZXJlCisvLy8gcG9zc2libGUuCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIGFzc3VtZXMgdGhhdCB5b3UgaGF2ZSBzaW1wbGUgUE9ELWxpa2UgdHlwZXMgdGhhdCBjYW4gYmUKKy8vLyBjb21wYXJlZCB3aXRoIHN0ZDo6bGVzcyBhbmQgY2FuIGJlIG1vdmVkIHdpdGggbWVtY3B5LiAgSWYgdGhpcyBpc24ndCB0cnVlLAorLy8vIHlvdSBzaG91bGQgdXNlIHN0ZDo6c29ydC4KKy8vLworLy8vIE5PVEU6IElmIHFzb3J0X3Igd2VyZSBwb3J0YWJsZSwgd2UgY291bGQgYWxsb3cgYSBjdXN0b20gY29tcGFyYXRvciBhbmQKKy8vLyBkZWZhdWx0IHRvIHN0ZDo6bGVzcy4KK3RlbXBsYXRlPGNsYXNzIEl0ZXJhdG9yVHk+CitpbmxpbmUgdm9pZCBhcnJheV9wb2Rfc29ydChJdGVyYXRvclR5IFN0YXJ0LCBJdGVyYXRvclR5IEVuZCkgeworICAvLyBEb24ndCBpbmVmZmljaWVudGx5IGNhbGwgcXNvcnQgd2l0aCBvbmUgZWxlbWVudCBvciB0cmlnZ2VyIHVuZGVmaW5lZAorICAvLyBiZWhhdmlvciB3aXRoIGFuIGVtcHR5IHNlcXVlbmNlLgorICBhdXRvIE5FbHRzID0gRW5kIC0gU3RhcnQ7CisgIGlmIChORWx0cyA8PSAxKSByZXR1cm47CisjaWZkZWYgRVhQRU5TSVZFX0NIRUNLUworICBzdGQ6Om10MTk5MzcgR2VuZXJhdG9yKHN0ZDo6cmFuZG9tX2RldmljZXt9KCkpOworICBzdGQ6OnNodWZmbGUoU3RhcnQsIEVuZCwgR2VuZXJhdG9yKTsKKyNlbmRpZgorICBxc29ydCgmKlN0YXJ0LCBORWx0cywgc2l6ZW9mKCpTdGFydCksIGdldF9hcnJheV9wb2Rfc29ydF9jb21wYXJhdG9yKCpTdGFydCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3JUeT4KK2lubGluZSB2b2lkIGFycmF5X3BvZF9zb3J0KAorICAgIEl0ZXJhdG9yVHkgU3RhcnQsIEl0ZXJhdG9yVHkgRW5kLAorICAgIGludCAoKkNvbXBhcmUpKAorICAgICAgICBjb25zdCB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyYXRvclR5Pjo6dmFsdWVfdHlwZSAqLAorICAgICAgICBjb25zdCB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyYXRvclR5Pjo6dmFsdWVfdHlwZSAqKSkgeworICAvLyBEb24ndCBpbmVmZmljaWVudGx5IGNhbGwgcXNvcnQgd2l0aCBvbmUgZWxlbWVudCBvciB0cmlnZ2VyIHVuZGVmaW5lZAorICAvLyBiZWhhdmlvciB3aXRoIGFuIGVtcHR5IHNlcXVlbmNlLgorICBhdXRvIE5FbHRzID0gRW5kIC0gU3RhcnQ7CisgIGlmIChORWx0cyA8PSAxKSByZXR1cm47CisjaWZkZWYgRVhQRU5TSVZFX0NIRUNLUworICBzdGQ6Om10MTk5MzcgR2VuZXJhdG9yKHN0ZDo6cmFuZG9tX2RldmljZXt9KCkpOworICBzdGQ6OnNodWZmbGUoU3RhcnQsIEVuZCwgR2VuZXJhdG9yKTsKKyNlbmRpZgorICBxc29ydCgmKlN0YXJ0LCBORWx0cywgc2l6ZW9mKCpTdGFydCksCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8aW50ICgqKShjb25zdCB2b2lkICosIGNvbnN0IHZvaWQgKik+KENvbXBhcmUpKTsKK30KKworLy8gUHJvdmlkZSB3cmFwcGVycyB0byBzdGQ6OnNvcnQgd2hpY2ggc2h1ZmZsZSB0aGUgZWxlbWVudHMgYmVmb3JlIHNvcnRpbmcKKy8vIHRvIGhlbHAgdW5jb3ZlciBub24tZGV0ZXJtaW5pc3RpYyBiZWhhdmlvciAoUFIzNTEzNSkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3JUeT4KK2lubGluZSB2b2lkIHNvcnQoSXRlcmF0b3JUeSBTdGFydCwgSXRlcmF0b3JUeSBFbmQpIHsKKyNpZmRlZiBFWFBFTlNJVkVfQ0hFQ0tTCisgIHN0ZDo6bXQxOTkzNyBHZW5lcmF0b3Ioc3RkOjpyYW5kb21fZGV2aWNle30oKSk7CisgIHN0ZDo6c2h1ZmZsZShTdGFydCwgRW5kLCBHZW5lcmF0b3IpOworI2VuZGlmCisgIHN0ZDo6c29ydChTdGFydCwgRW5kKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yVHksIHR5cGVuYW1lIENvbXBhcmU+CitpbmxpbmUgdm9pZCBzb3J0KEl0ZXJhdG9yVHkgU3RhcnQsIEl0ZXJhdG9yVHkgRW5kLCBDb21wYXJlIENvbXApIHsKKyNpZmRlZiBFWFBFTlNJVkVfQ0hFQ0tTCisgIHN0ZDo6bXQxOTkzNyBHZW5lcmF0b3Ioc3RkOjpyYW5kb21fZGV2aWNle30oKSk7CisgIHN0ZDo6c2h1ZmZsZShTdGFydCwgRW5kLCBHZW5lcmF0b3IpOworI2VuZGlmCisgIHN0ZDo6c29ydChTdGFydCwgRW5kLCBDb21wKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICBFeHRyYSBhZGRpdGlvbnMgdG8gPGFsZ29yaXRobT4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBGb3IgYSBjb250YWluZXIgb2YgcG9pbnRlcnMsIGRlbGV0ZXMgdGhlIHBvaW50ZXJzIGFuZCB0aGVuIGNsZWFycyB0aGUKKy8vLyBjb250YWluZXIuCit0ZW1wbGF0ZTx0eXBlbmFtZSBDb250YWluZXI+Cit2b2lkIERlbGV0ZUNvbnRhaW5lclBvaW50ZXJzKENvbnRhaW5lciAmQykgeworICBmb3IgKGF1dG8gViA6IEMpCisgICAgZGVsZXRlIFY7CisgIEMuY2xlYXIoKTsKK30KKworLy8vIEluIGEgY29udGFpbmVyIG9mIHBhaXJzICh1c3VhbGx5IGEgbWFwKSB3aG9zZSBzZWNvbmQgZWxlbWVudCBpcyBhIHBvaW50ZXIsCisvLy8gZGVsZXRlcyB0aGUgc2Vjb25kIGVsZW1lbnRzIGFuZCB0aGVuIGNsZWFycyB0aGUgY29udGFpbmVyLgordGVtcGxhdGU8dHlwZW5hbWUgQ29udGFpbmVyPgordm9pZCBEZWxldGVDb250YWluZXJTZWNvbmRzKENvbnRhaW5lciAmQykgeworICBmb3IgKGF1dG8gJlYgOiBDKQorICAgIGRlbGV0ZSBWLnNlY29uZDsKKyAgQy5jbGVhcigpOworfQorCisvLy8gUHJvdmlkZSB3cmFwcGVycyB0byBzdGQ6OmZvcl9lYWNoIHdoaWNoIHRha2UgcmFuZ2VzIGluc3RlYWQgb2YgaGF2aW5nIHRvCisvLy8gcGFzcyBiZWdpbi9lbmQgZXhwbGljaXRseS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBVbmFyeVByZWRpY2F0ZT4KK1VuYXJ5UHJlZGljYXRlIGZvcl9lYWNoKFIgJiZSYW5nZSwgVW5hcnlQcmVkaWNhdGUgUCkgeworICByZXR1cm4gc3RkOjpmb3JfZWFjaChhZGxfYmVnaW4oUmFuZ2UpLCBhZGxfZW5kKFJhbmdlKSwgUCk7Cit9CisKKy8vLyBQcm92aWRlIHdyYXBwZXJzIHRvIHN0ZDo6YWxsX29mIHdoaWNoIHRha2UgcmFuZ2VzIGluc3RlYWQgb2YgaGF2aW5nIHRvIHBhc3MKKy8vLyBiZWdpbi9lbmQgZXhwbGljaXRseS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBVbmFyeVByZWRpY2F0ZT4KK2Jvb2wgYWxsX29mKFIgJiZSYW5nZSwgVW5hcnlQcmVkaWNhdGUgUCkgeworICByZXR1cm4gc3RkOjphbGxfb2YoYWRsX2JlZ2luKFJhbmdlKSwgYWRsX2VuZChSYW5nZSksIFApOworfQorCisvLy8gUHJvdmlkZSB3cmFwcGVycyB0byBzdGQ6OmFueV9vZiB3aGljaCB0YWtlIHJhbmdlcyBpbnN0ZWFkIG9mIGhhdmluZyB0byBwYXNzCisvLy8gYmVnaW4vZW5kIGV4cGxpY2l0bHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVW5hcnlQcmVkaWNhdGU+Citib29sIGFueV9vZihSICYmUmFuZ2UsIFVuYXJ5UHJlZGljYXRlIFApIHsKKyAgcmV0dXJuIHN0ZDo6YW55X29mKGFkbF9iZWdpbihSYW5nZSksIGFkbF9lbmQoUmFuZ2UpLCBQKTsKK30KKworLy8vIFByb3ZpZGUgd3JhcHBlcnMgdG8gc3RkOjpub25lX29mIHdoaWNoIHRha2UgcmFuZ2VzIGluc3RlYWQgb2YgaGF2aW5nIHRvIHBhc3MKKy8vLyBiZWdpbi9lbmQgZXhwbGljaXRseS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBVbmFyeVByZWRpY2F0ZT4KK2Jvb2wgbm9uZV9vZihSICYmUmFuZ2UsIFVuYXJ5UHJlZGljYXRlIFApIHsKKyAgcmV0dXJuIHN0ZDo6bm9uZV9vZihhZGxfYmVnaW4oUmFuZ2UpLCBhZGxfZW5kKFJhbmdlKSwgUCk7Cit9CisKKy8vLyBQcm92aWRlIHdyYXBwZXJzIHRvIHN0ZDo6ZmluZCB3aGljaCB0YWtlIHJhbmdlcyBpbnN0ZWFkIG9mIGhhdmluZyB0byBwYXNzCisvLy8gYmVnaW4vZW5kIGV4cGxpY2l0bHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVD4KK2F1dG8gZmluZChSICYmUmFuZ2UsIGNvbnN0IFQgJlZhbCkgLT4gZGVjbHR5cGUoYWRsX2JlZ2luKFJhbmdlKSkgeworICByZXR1cm4gc3RkOjpmaW5kKGFkbF9iZWdpbihSYW5nZSksIGFkbF9lbmQoUmFuZ2UpLCBWYWwpOworfQorCisvLy8gUHJvdmlkZSB3cmFwcGVycyB0byBzdGQ6OmZpbmRfaWYgd2hpY2ggdGFrZSByYW5nZXMgaW5zdGVhZCBvZiBoYXZpbmcgdG8gcGFzcworLy8vIGJlZ2luL2VuZCBleHBsaWNpdGx5LgordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFVuYXJ5UHJlZGljYXRlPgorYXV0byBmaW5kX2lmKFIgJiZSYW5nZSwgVW5hcnlQcmVkaWNhdGUgUCkgLT4gZGVjbHR5cGUoYWRsX2JlZ2luKFJhbmdlKSkgeworICByZXR1cm4gc3RkOjpmaW5kX2lmKGFkbF9iZWdpbihSYW5nZSksIGFkbF9lbmQoUmFuZ2UpLCBQKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFVuYXJ5UHJlZGljYXRlPgorYXV0byBmaW5kX2lmX25vdChSICYmUmFuZ2UsIFVuYXJ5UHJlZGljYXRlIFApIC0+IGRlY2x0eXBlKGFkbF9iZWdpbihSYW5nZSkpIHsKKyAgcmV0dXJuIHN0ZDo6ZmluZF9pZl9ub3QoYWRsX2JlZ2luKFJhbmdlKSwgYWRsX2VuZChSYW5nZSksIFApOworfQorCisvLy8gUHJvdmlkZSB3cmFwcGVycyB0byBzdGQ6OnJlbW92ZV9pZiB3aGljaCB0YWtlIHJhbmdlcyBpbnN0ZWFkIG9mIGhhdmluZyB0bworLy8vIHBhc3MgYmVnaW4vZW5kIGV4cGxpY2l0bHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVW5hcnlQcmVkaWNhdGU+CithdXRvIHJlbW92ZV9pZihSICYmUmFuZ2UsIFVuYXJ5UHJlZGljYXRlIFApIC0+IGRlY2x0eXBlKGFkbF9iZWdpbihSYW5nZSkpIHsKKyAgcmV0dXJuIHN0ZDo6cmVtb3ZlX2lmKGFkbF9iZWdpbihSYW5nZSksIGFkbF9lbmQoUmFuZ2UpLCBQKTsKK30KKworLy8vIFByb3ZpZGUgd3JhcHBlcnMgdG8gc3RkOjpjb3B5X2lmIHdoaWNoIHRha2UgcmFuZ2VzIGluc3RlYWQgb2YgaGF2aW5nIHRvCisvLy8gcGFzcyBiZWdpbi9lbmQgZXhwbGljaXRseS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBPdXRwdXRJdCwgdHlwZW5hbWUgVW5hcnlQcmVkaWNhdGU+CitPdXRwdXRJdCBjb3B5X2lmKFIgJiZSYW5nZSwgT3V0cHV0SXQgT3V0LCBVbmFyeVByZWRpY2F0ZSBQKSB7CisgIHJldHVybiBzdGQ6OmNvcHlfaWYoYWRsX2JlZ2luKFJhbmdlKSwgYWRsX2VuZChSYW5nZSksIE91dCwgUCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBPdXRwdXRJdD4KK091dHB1dEl0IGNvcHkoUiAmJlJhbmdlLCBPdXRwdXRJdCBPdXQpIHsKKyAgcmV0dXJuIHN0ZDo6Y29weShhZGxfYmVnaW4oUmFuZ2UpLCBhZGxfZW5kKFJhbmdlKSwgT3V0KTsKK30KKworLy8vIFdyYXBwZXIgZnVuY3Rpb24gYXJvdW5kIHN0ZDo6ZmluZCB0byBkZXRlY3QgaWYgYW4gZWxlbWVudCBleGlzdHMKKy8vLyBpbiBhIGNvbnRhaW5lci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSLCB0eXBlbmFtZSBFPgorYm9vbCBpc19jb250YWluZWQoUiAmJlJhbmdlLCBjb25zdCBFICZFbGVtZW50KSB7CisgIHJldHVybiBzdGQ6OmZpbmQoYWRsX2JlZ2luKFJhbmdlKSwgYWRsX2VuZChSYW5nZSksIEVsZW1lbnQpICE9IGFkbF9lbmQoUmFuZ2UpOworfQorCisvLy8gV3JhcHBlciBmdW5jdGlvbiBhcm91bmQgc3RkOjpjb3VudCB0byBjb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIGFuIGVsZW1lbnQKKy8vLyBccCBFbGVtZW50IG9jY3VycyBpbiB0aGUgZ2l2ZW4gcmFuZ2UgXHAgUmFuZ2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgRT4KK2F1dG8gY291bnQoUiAmJlJhbmdlLCBjb25zdCBFICZFbGVtZW50KSAtPgorICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPGRlY2x0eXBlKGFkbF9iZWdpbihSYW5nZSkpPjo6ZGlmZmVyZW5jZV90eXBlIHsKKyAgcmV0dXJuIHN0ZDo6Y291bnQoYWRsX2JlZ2luKFJhbmdlKSwgYWRsX2VuZChSYW5nZSksIEVsZW1lbnQpOworfQorCisvLy8gV3JhcHBlciBmdW5jdGlvbiBhcm91bmQgc3RkOjpjb3VudF9pZiB0byBjb3VudCB0aGUgbnVtYmVyIG9mIHRpbWVzIGFuCisvLy8gZWxlbWVudCBzYXRpc2Z5aW5nIGEgZ2l2ZW4gcHJlZGljYXRlIG9jY3VycyBpbiBhIHJhbmdlLgordGVtcGxhdGUgPHR5cGVuYW1lIFIsIHR5cGVuYW1lIFVuYXJ5UHJlZGljYXRlPgorYXV0byBjb3VudF9pZihSICYmUmFuZ2UsIFVuYXJ5UHJlZGljYXRlIFApIC0+CisgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8ZGVjbHR5cGUoYWRsX2JlZ2luKFJhbmdlKSk+OjpkaWZmZXJlbmNlX3R5cGUgeworICByZXR1cm4gc3RkOjpjb3VudF9pZihhZGxfYmVnaW4oUmFuZ2UpLCBhZGxfZW5kKFJhbmdlKSwgUCk7Cit9CisKKy8vLyBXcmFwcGVyIGZ1bmN0aW9uIGFyb3VuZCBzdGQ6OnRyYW5zZm9ybSB0byBhcHBseSBhIGZ1bmN0aW9uIHRvIGEgcmFuZ2UgYW5kCisvLy8gc3RvcmUgdGhlIHJlc3VsdCBlbHNld2hlcmUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgT3V0cHV0SXQsIHR5cGVuYW1lIFVuYXJ5UHJlZGljYXRlPgorT3V0cHV0SXQgdHJhbnNmb3JtKFIgJiZSYW5nZSwgT3V0cHV0SXQgZF9maXJzdCwgVW5hcnlQcmVkaWNhdGUgUCkgeworICByZXR1cm4gc3RkOjp0cmFuc2Zvcm0oYWRsX2JlZ2luKFJhbmdlKSwgYWRsX2VuZChSYW5nZSksIGRfZmlyc3QsIFApOworfQorCisvLy8gUHJvdmlkZSB3cmFwcGVycyB0byBzdGQ6OnBhcnRpdGlvbiB3aGljaCB0YWtlIHJhbmdlcyBpbnN0ZWFkIG9mIGhhdmluZyB0bworLy8vIHBhc3MgYmVnaW4vZW5kIGV4cGxpY2l0bHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgVW5hcnlQcmVkaWNhdGU+CithdXRvIHBhcnRpdGlvbihSICYmUmFuZ2UsIFVuYXJ5UHJlZGljYXRlIFApIC0+IGRlY2x0eXBlKGFkbF9iZWdpbihSYW5nZSkpIHsKKyAgcmV0dXJuIHN0ZDo6cGFydGl0aW9uKGFkbF9iZWdpbihSYW5nZSksIGFkbF9lbmQoUmFuZ2UpLCBQKTsKK30KKworLy8vIFByb3ZpZGUgd3JhcHBlcnMgdG8gc3RkOjpsb3dlcl9ib3VuZCB3aGljaCB0YWtlIHJhbmdlcyBpbnN0ZWFkIG9mIGhhdmluZyB0bworLy8vIHBhc3MgYmVnaW4vZW5kIGV4cGxpY2l0bHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUiwgdHlwZW5hbWUgRm9yd2FyZEl0PgorYXV0byBsb3dlcl9ib3VuZChSICYmUmFuZ2UsIEZvcndhcmRJdCBJKSAtPiBkZWNsdHlwZShhZGxfYmVnaW4oUmFuZ2UpKSB7CisgIHJldHVybiBzdGQ6Omxvd2VyX2JvdW5kKGFkbF9iZWdpbihSYW5nZSksIGFkbF9lbmQoUmFuZ2UpLCBJKTsKK30KKworLy8vIFxicmllZiBHaXZlbiBhIHJhbmdlIG9mIHR5cGUgUiwgaXRlcmF0ZSB0aGUgZW50aXJlIHJhbmdlIGFuZCByZXR1cm4gYQorLy8vIFNtYWxsVmVjdG9yIHdpdGggZWxlbWVudHMgb2YgdGhlIHZlY3Rvci4gIFRoaXMgaXMgdXNlZnVsLCBmb3IgZXhhbXBsZSwKKy8vLyB3aGVuIHlvdSB3YW50IHRvIGl0ZXJhdGUgYSByYW5nZSBhbmQgdGhlbiBzb3J0IHRoZSByZXN1bHRzLgordGVtcGxhdGUgPHVuc2lnbmVkIFNpemUsIHR5cGVuYW1lIFI+CitTbWFsbFZlY3Rvcjx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDxkZXRhaWw6OlZhbHVlT2ZSYW5nZTxSPj46OnR5cGUsIFNpemU+Cit0b192ZWN0b3IoUiAmJlJhbmdlKSB7CisgIHJldHVybiB7YWRsX2JlZ2luKFJhbmdlKSwgYWRsX2VuZChSYW5nZSl9OworfQorCisvLy8gUHJvdmlkZSBhIGNvbnRhaW5lciBhbGdvcml0aG0gc2ltaWxhciB0byBDKysgTGlicmFyeSBGdW5kYW1lbnRhbHMgdjIncworLy8vIGBlcmFzZV9pZmAgd2hpY2ggaXMgZXF1aXZhbGVudCB0bzoKKy8vLworLy8vICAgQy5lcmFzZShyZW1vdmVfaWYoQywgcHJlZCksIEMuZW5kKCkpOworLy8vCisvLy8gVGhpcyB2ZXJzaW9uIHdvcmtzIGZvciBhbnkgY29udGFpbmVyIHdpdGggYW4gZXJhc2UgbWV0aG9kIGNhbGwgYWNjZXB0aW5nCisvLy8gdHdvIGl0ZXJhdG9ycy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXIsIHR5cGVuYW1lIFVuYXJ5UHJlZGljYXRlPgordm9pZCBlcmFzZV9pZihDb250YWluZXIgJkMsIFVuYXJ5UHJlZGljYXRlIFApIHsKKyAgQy5lcmFzZShyZW1vdmVfaWYoQywgUCksIEMuZW5kKCkpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgIEV4dHJhIGFkZGl0aW9ucyB0byA8bWVtb3J5PgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gSW1wbGVtZW50IG1ha2VfdW5pcXVlIGFjY29yZGluZyB0byBOMzY1Ni4KKworLy8vIFxicmllZiBDb25zdHJ1Y3RzIGEgYG5ldyBUKClgIHdpdGggdGhlIGdpdmVuIGFyZ3MgYW5kIHJldHVybnMgYQorLy8vICAgICAgICBgdW5pcXVlX3B0cjxUPmAgd2hpY2ggb3ducyB0aGUgb2JqZWN0LgorLy8vCisvLy8gRXhhbXBsZToKKy8vLworLy8vICAgICBhdXRvIHAgPSBtYWtlX3VuaXF1ZTxpbnQ+KCk7CisvLy8gICAgIGF1dG8gcCA9IG1ha2VfdW5pcXVlPHN0ZDo6dHVwbGU8aW50LCBpbnQ+PigwLCAxKTsKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcy4uLiBBcmdzPgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfYXJyYXk8VD46OnZhbHVlLCBzdGQ6OnVuaXF1ZV9wdHI8VD4+Ojp0eXBlCittYWtlX3VuaXF1ZShBcmdzICYmLi4uIGFyZ3MpIHsKKyAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxUPihuZXcgVChzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pKTsKK30KKworLy8vIFxicmllZiBDb25zdHJ1Y3RzIGEgYG5ldyBUW25dYCB3aXRoIHRoZSBnaXZlbiBhcmdzIGFuZCByZXR1cm5zIGEKKy8vLyAgICAgICAgYHVuaXF1ZV9wdHI8VFtdPmAgd2hpY2ggb3ducyB0aGUgb2JqZWN0LgorLy8vCisvLy8gXHBhcmFtIG4gc2l6ZSBvZiB0aGUgbmV3IGFycmF5LgorLy8vCisvLy8gRXhhbXBsZToKKy8vLworLy8vICAgICBhdXRvIHAgPSBtYWtlX3VuaXF1ZTxpbnRbXT4oMik7IC8vIHZhbHVlLWluaXRpYWxpemVzIHRoZSBhcnJheSB3aXRoIDAncy4KK3RlbXBsYXRlIDxjbGFzcyBUPgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19hcnJheTxUPjo6dmFsdWUgJiYgc3RkOjpleHRlbnQ8VD46OnZhbHVlID09IDAsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4+Ojp0eXBlCittYWtlX3VuaXF1ZShzaXplX3QgbikgeworICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFQ+KG5ldyB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9leHRlbnQ8VD46OnR5cGVbbl0oKSk7Cit9CisKKy8vLyBUaGlzIGZ1bmN0aW9uIGlzbid0IHVzZWQgYW5kIGlzIG9ubHkgaGVyZSB0byBwcm92aWRlIGJldHRlciBjb21waWxlIGVycm9ycy4KK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcy4uLiBBcmdzPgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjpleHRlbnQ8VD46OnZhbHVlICE9IDA+Ojp0eXBlCittYWtlX3VuaXF1ZShBcmdzICYmLi4uKSA9IGRlbGV0ZTsKKworc3RydWN0IEZyZWVEZWxldGVyIHsKKyAgdm9pZCBvcGVyYXRvcigpKHZvaWQqIHYpIHsKKyAgICA6OmZyZWUodik7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIEZpcnN0LCB0eXBlbmFtZSBTZWNvbmQ+CitzdHJ1Y3QgcGFpcl9oYXNoIHsKKyAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3Qgc3RkOjpwYWlyPEZpcnN0LCBTZWNvbmQ+ICZQKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6aGFzaDxGaXJzdD4oKShQLmZpcnN0KSAqIDMxICsgc3RkOjpoYXNoPFNlY29uZD4oKShQLnNlY29uZCk7CisgIH0KK307CisKKy8vLyBBIGZ1bmN0b3IgbGlrZSBDKysxNCdzIHN0ZDo6bGVzczx2b2lkPiBpbiBpdHMgYWJzZW5jZS4KK3N0cnVjdCBsZXNzIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+IGJvb2wgb3BlcmF0b3IoKShBICYmYSwgQiAmJmIpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpmb3J3YXJkPEE+KGEpIDwgc3RkOjpmb3J3YXJkPEI+KGIpOworICB9Cit9OworCisvLy8gQSBmdW5jdG9yIGxpa2UgQysrMTQncyBzdGQ6OmVxdWFsPHZvaWQ+IGluIGl0cyBhYnNlbmNlLgorc3RydWN0IGVxdWFsIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+IGJvb2wgb3BlcmF0b3IoKShBICYmYSwgQiAmJmIpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpmb3J3YXJkPEE+KGEpID09IHN0ZDo6Zm9yd2FyZDxCPihiKTsKKyAgfQorfTsKKworLy8vIEJpbmFyeSBmdW5jdG9yIHRoYXQgYWRhcHRzIHRvIGFueSBvdGhlciBiaW5hcnkgZnVuY3RvciBhZnRlciBkZXJlZmVyZW5jaW5nCisvLy8gb3BlcmFuZHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGRlcmVmIHsKKyAgVCBmdW5jOworCisgIC8vIENvdWxkIGJlIGZ1cnRoZXIgaW1wcm92ZWQgdG8gY29wZSB3aXRoIG5vbi1kZXJpdmFibGUgZnVuY3RvcnMgYW5kCisgIC8vIG5vbi1iaW5hcnkgZnVuY3RvcnMgKHNob3VsZCBiZSBhIHZhcmlhZGljIHRlbXBsYXRlIG1lbWJlciBmdW5jdGlvbgorICAvLyBvcGVyYXRvcigpKS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEEsIHR5cGVuYW1lIEI+CisgIGF1dG8gb3BlcmF0b3IoKShBICZsaHMsIEIgJnJocykgY29uc3QgLT4gZGVjbHR5cGUoZnVuYygqbGhzLCAqcmhzKSkgeworICAgIGFzc2VydChsaHMpOworICAgIGFzc2VydChyaHMpOworICAgIHJldHVybiBmdW5jKCpsaHMsICpyaHMpOworICB9Cit9OworCituYW1lc3BhY2UgZGV0YWlsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFI+IGNsYXNzIGVudW1lcmF0b3JfaXRlcjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFI+IHN0cnVjdCByZXN1bHRfcGFpciB7CisgIGZyaWVuZCBjbGFzcyBlbnVtZXJhdG9yX2l0ZXI8Uj47CisKKyAgcmVzdWx0X3BhaXIoKSA9IGRlZmF1bHQ7CisgIHJlc3VsdF9wYWlyKHN0ZDo6c2l6ZV90IEluZGV4LCBJdGVyT2ZSYW5nZTxSPiBJdGVyKQorICAgICAgOiBJbmRleChJbmRleCksIEl0ZXIoSXRlcikge30KKworICByZXN1bHRfcGFpcjxSPiAmb3BlcmF0b3I9KGNvbnN0IHJlc3VsdF9wYWlyPFI+ICZPdGhlcikgeworICAgIEluZGV4ID0gT3RoZXIuSW5kZXg7CisgICAgSXRlciA9IE90aGVyLkl0ZXI7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RkOjpzaXplX3QgaW5kZXgoKSBjb25zdCB7IHJldHVybiBJbmRleDsgfQorICBjb25zdCBWYWx1ZU9mUmFuZ2U8Uj4gJnZhbHVlKCkgY29uc3QgeyByZXR1cm4gKkl0ZXI7IH0KKyAgVmFsdWVPZlJhbmdlPFI+ICZ2YWx1ZSgpIHsgcmV0dXJuICpJdGVyOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c2l6ZV90IEluZGV4ID0gc3RkOjpudW1lcmljX2xpbWl0czxzdGQ6OnNpemVfdD46Om1heCgpOworICBJdGVyT2ZSYW5nZTxSPiBJdGVyOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFI+CitjbGFzcyBlbnVtZXJhdG9yX2l0ZXIKKyAgICA6IHB1YmxpYyBpdGVyYXRvcl9mYWNhZGVfYmFzZTwKKyAgICAgICAgICBlbnVtZXJhdG9yX2l0ZXI8Uj4sIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIHJlc3VsdF9wYWlyPFI+LAorICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXJPZlJhbmdlPFI+Pjo6ZGlmZmVyZW5jZV90eXBlLAorICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXJPZlJhbmdlPFI+Pjo6cG9pbnRlciwKKyAgICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyT2ZSYW5nZTxSPj46OnJlZmVyZW5jZT4geworICB1c2luZyByZXN1bHRfdHlwZSA9IHJlc3VsdF9wYWlyPFI+OworCitwdWJsaWM6CisgIGV4cGxpY2l0IGVudW1lcmF0b3JfaXRlcihJdGVyT2ZSYW5nZTxSPiBFbmRJdGVyKQorICAgICAgOiBSZXN1bHQoc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSwgRW5kSXRlcikge30KKworICBlbnVtZXJhdG9yX2l0ZXIoc3RkOjpzaXplX3QgSW5kZXgsIEl0ZXJPZlJhbmdlPFI+IEl0ZXIpCisgICAgICA6IFJlc3VsdChJbmRleCwgSXRlcikge30KKworICByZXN1bHRfdHlwZSAmb3BlcmF0b3IqKCkgeyByZXR1cm4gUmVzdWx0OyB9CisgIGNvbnN0IHJlc3VsdF90eXBlICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBSZXN1bHQ7IH0KKworICBlbnVtZXJhdG9yX2l0ZXI8Uj4gJm9wZXJhdG9yKysoKSB7CisgICAgYXNzZXJ0KFJlc3VsdC5JbmRleCAhPSBzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpKTsKKyAgICArK1Jlc3VsdC5JdGVyOworICAgICsrUmVzdWx0LkluZGV4OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBlbnVtZXJhdG9yX2l0ZXI8Uj4gJlJIUykgY29uc3QgeworICAgIC8vIERvbid0IGNvbXBhcmUgaW5kaWNlcyBoZXJlLCBvbmx5IGl0ZXJhdG9ycy4gIEl0J3MgcG9zc2libGUgZm9yIGFuIGVuZAorICAgIC8vIGl0ZXJhdG9yIHRvIGhhdmUgZGlmZmVyZW50IGluZGljZXMgZGVwZW5kaW5nIG9uIHdoZXRoZXIgaXQgd2FzIGNyZWF0ZWQKKyAgICAvLyBieSBjYWxsaW5nIHN0ZDo6ZW5kKCkgdmVyc3VzIGluY3JlbWVudGluZyBhIHZhbGlkIGl0ZXJhdG9yLgorICAgIHJldHVybiBSZXN1bHQuSXRlciA9PSBSSFMuUmVzdWx0Lkl0ZXI7CisgIH0KKworICBlbnVtZXJhdG9yX2l0ZXI8Uj4gJm9wZXJhdG9yPShjb25zdCBlbnVtZXJhdG9yX2l0ZXI8Uj4gJk90aGVyKSB7CisgICAgUmVzdWx0ID0gT3RoZXIuUmVzdWx0OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCitwcml2YXRlOgorICByZXN1bHRfdHlwZSBSZXN1bHQ7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUj4gY2xhc3MgZW51bWVyYXRvciB7CitwdWJsaWM6CisgIGV4cGxpY2l0IGVudW1lcmF0b3IoUiAmJlJhbmdlKSA6IFRoZVJhbmdlKHN0ZDo6Zm9yd2FyZDxSPihSYW5nZSkpIHt9CisKKyAgZW51bWVyYXRvcl9pdGVyPFI+IGJlZ2luKCkgeworICAgIHJldHVybiBlbnVtZXJhdG9yX2l0ZXI8Uj4oMCwgc3RkOjpiZWdpbihUaGVSYW5nZSkpOworICB9CisKKyAgZW51bWVyYXRvcl9pdGVyPFI+IGVuZCgpIHsKKyAgICByZXR1cm4gZW51bWVyYXRvcl9pdGVyPFI+KHN0ZDo6ZW5kKFRoZVJhbmdlKSk7CisgIH0KKworcHJpdmF0ZToKKyAgUiBUaGVSYW5nZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkZXRhaWwKKworLy8vIEdpdmVuIGFuIGlucHV0IHJhbmdlLCByZXR1cm5zIGEgbmV3IHJhbmdlIHdob3NlIHZhbHVlcyBhcmUgYXJlIHBhaXIgKEEsQikKKy8vLyBzdWNoIHRoYXQgQSBpcyB0aGUgMC1iYXNlZCBpbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUgc2VxdWVuY2UsIGFuZCBCIGlzCisvLy8gdGhlIHZhbHVlIGZyb20gdGhlIG9yaWdpbmFsIHNlcXVlbmNlLiAgRXhhbXBsZToKKy8vLworLy8vIHN0ZDo6dmVjdG9yPGNoYXI+IEl0ZW1zID0geydBJywgJ0InLCAnQycsICdEJ307CisvLy8gZm9yIChhdXRvIFggOiBlbnVtZXJhdGUoSXRlbXMpKSB7CisvLy8gICBwcmludGYoIkl0ZW0gJWQgLSAlY1xuIiwgWC5pbmRleCgpLCBYLnZhbHVlKCkpOworLy8vIH0KKy8vLworLy8vIE91dHB1dDoKKy8vLyAgIEl0ZW0gMCAtIEEKKy8vLyAgIEl0ZW0gMSAtIEIKKy8vLyAgIEl0ZW0gMiAtIEMKKy8vLyAgIEl0ZW0gMyAtIEQKKy8vLwordGVtcGxhdGUgPHR5cGVuYW1lIFI+IGRldGFpbDo6ZW51bWVyYXRvcjxSPiBlbnVtZXJhdGUoUiAmJlRoZVJhbmdlKSB7CisgIHJldHVybiBkZXRhaWw6OmVudW1lcmF0b3I8Uj4oc3RkOjpmb3J3YXJkPFI+KFRoZVJhbmdlKSk7Cit9CisKK25hbWVzcGFjZSBkZXRhaWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRiwgdHlwZW5hbWUgVHVwbGUsIHN0ZDo6c2l6ZV90Li4uIEk+CithdXRvIGFwcGx5X3R1cGxlX2ltcGwoRiAmJmYsIFR1cGxlICYmdCwgaW5kZXhfc2VxdWVuY2U8SS4uLj4pCisgICAgLT4gZGVjbHR5cGUoc3RkOjpmb3J3YXJkPEY+KGYpKHN0ZDo6Z2V0PEk+KHN0ZDo6Zm9yd2FyZDxUdXBsZT4odCkpLi4uKSkgeworICByZXR1cm4gc3RkOjpmb3J3YXJkPEY+KGYpKHN0ZDo6Z2V0PEk+KHN0ZDo6Zm9yd2FyZDxUdXBsZT4odCkpLi4uKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAorCisvLy8gR2l2ZW4gYW4gaW5wdXQgdHVwbGUgKGExLCBhMiwgLi4uLCBhbiksIHBhc3MgdGhlIGFyZ3VtZW50cyBvZiB0aGUKKy8vLyB0dXBsZSB2YXJpYWRpY2FsbHkgdG8gZiBhcyBpZiBieSBjYWxsaW5nIGYoYTEsIGEyLCAuLi4sIGFuKSBhbmQKKy8vLyByZXR1cm4gdGhlIHJlc3VsdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGLCB0eXBlbmFtZSBUdXBsZT4KK2F1dG8gYXBwbHlfdHVwbGUoRiAmJmYsIFR1cGxlICYmdCkgLT4gZGVjbHR5cGUoZGV0YWlsOjphcHBseV90dXBsZV9pbXBsKAorICAgIHN0ZDo6Zm9yd2FyZDxGPihmKSwgc3RkOjpmb3J3YXJkPFR1cGxlPih0KSwKKyAgICBidWlsZF9pbmRleF9pbXBsPAorICAgICAgICBzdGQ6OnR1cGxlX3NpemU8dHlwZW5hbWUgc3RkOjpkZWNheTxUdXBsZT46OnR5cGU+Ojp2YWx1ZT57fSkpIHsKKyAgdXNpbmcgSW5kaWNlcyA9IGJ1aWxkX2luZGV4X2ltcGw8CisgICAgICBzdGQ6OnR1cGxlX3NpemU8dHlwZW5hbWUgc3RkOjpkZWNheTxUdXBsZT46OnR5cGU+Ojp2YWx1ZT47CisKKyAgcmV0dXJuIGRldGFpbDo6YXBwbHlfdHVwbGVfaW1wbChzdGQ6OmZvcndhcmQ8Rj4oZiksIHN0ZDo6Zm9yd2FyZDxUdXBsZT4odCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaWNlc3t9KTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX1NUTEVYVFJBU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TY29wZUV4aXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1Njb3BlRXhpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMTM3NTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TY29wZUV4aXQuaApAQCAtMCwwICsxLDY2IEBACisvLz09PS0gbGx2bS9BRFQvU2NvcGVFeGl0LmggLSBFeGVjdXRlIGNvZGUgYXQgc2NvcGUgZXhpdCAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBtYWtlX3Njb3BlX2V4aXQgZnVuY3Rpb24sIHdoaWNoIGV4ZWN1dGVzIHVzZXItZGVmaW5lZAorLy8gY2xlYW51cCBsb2dpYyBhdCBzY29wZSBleGl0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU0NPUEVfRVhJVF9ICisjZGVmaW5lIExMVk1fQURUX1NDT1BFX0VYSVRfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgZGV0YWlsIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENhbGxhYmxlPiBjbGFzcyBzY29wZV9leGl0IHsKKyAgQ2FsbGFibGUgRXhpdEZ1bmN0aW9uOworICBib29sIEVuZ2FnZWQgPSB0cnVlOyAvLyBGYWxzZSBvbmNlIG1vdmVkLWZyb20gb3IgcmVsZWFzZSgpZC4KKworcHVibGljOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnA+CisgIGV4cGxpY2l0IHNjb3BlX2V4aXQoRnAgJiZGKSA6IEV4aXRGdW5jdGlvbihzdGQ6OmZvcndhcmQ8RnA+KEYpKSB7fQorCisgIHNjb3BlX2V4aXQoc2NvcGVfZXhpdCAmJlJocykKKyAgICAgIDogRXhpdEZ1bmN0aW9uKHN0ZDo6bW92ZShSaHMuRXhpdEZ1bmN0aW9uKSksIEVuZ2FnZWQoUmhzLkVuZ2FnZWQpIHsKKyAgICBSaHMucmVsZWFzZSgpOworICB9CisgIHNjb3BlX2V4aXQoY29uc3Qgc2NvcGVfZXhpdCAmKSA9IGRlbGV0ZTsKKyAgc2NvcGVfZXhpdCAmb3BlcmF0b3I9KHNjb3BlX2V4aXQgJiYpID0gZGVsZXRlOworICBzY29wZV9leGl0ICZvcGVyYXRvcj0oY29uc3Qgc2NvcGVfZXhpdCAmKSA9IGRlbGV0ZTsKKworICB2b2lkIHJlbGVhc2UoKSB7IEVuZ2FnZWQgPSBmYWxzZTsgfQorCisgIH5zY29wZV9leGl0KCkgeworICAgIGlmIChFbmdhZ2VkKQorICAgICAgRXhpdEZ1bmN0aW9uKCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkZXRhaWwKKworLy8gS2VlcHMgdGhlIGNhbGxhYmxlIG9iamVjdCB0aGF0IGlzIHBhc3NlZCBpbiwgYW5kIGV4ZWN1dGUgaXQgYXQgdGhlCisvLyBkZXN0cnVjdGlvbiBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0ICh1c3VhbGx5IGF0IHRoZSBzY29wZSBleGl0IHdoZXJlIHRoZQorLy8gcmV0dXJuZWQgb2JqZWN0IGlzIGtlcHQpLgorLy8KKy8vIEludGVyZmFjZSBpcyBzcGVjaWZpZWQgYnkgcDAwNTJyMi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDYWxsYWJsZT4KK0xMVk1fTk9ESVNDQVJEIGRldGFpbDo6c2NvcGVfZXhpdDx0eXBlbmFtZSBzdGQ6OmRlY2F5PENhbGxhYmxlPjo6dHlwZT4KK21ha2Vfc2NvcGVfZXhpdChDYWxsYWJsZSAmJkYpIHsKKyAgcmV0dXJuIGRldGFpbDo6c2NvcGVfZXhpdDx0eXBlbmFtZSBzdGQ6OmRlY2F5PENhbGxhYmxlPjo6dHlwZT4oCisgICAgICBzdGQ6OmZvcndhcmQ8Q2FsbGFibGU+KEYpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TY29wZWRIYXNoVGFibGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1Njb3BlZEhhc2hUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYjBjMWIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TY29wZWRIYXNoVGFibGUuaApAQCAtMCwwICsxLDI2NCBAQAorLy89PT0tIFNjb3BlZEhhc2hUYWJsZS5oIC0gQSBzaW1wbGUgc2NvcGVkIGhhc2ggdGFibGUgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhbiBlZmZpY2llbnQgc2NvcGVkIGhhc2ggdGFibGUsIHdoaWNoIGlzIHVzZWZ1bCBmb3IKKy8vIHRoaW5ncyBsaWtlIGRvbWluYXRvci1iYXNlZCBvcHRpbWl6YXRpb25zLiAgVGhpcyBhbGxvd3MgY2xpZW50cyB0byBkbyB0aGluZ3MKKy8vIGxpa2UgdGhpczoKKy8vCisvLyAgU2NvcGVkSGFzaFRhYmxlPGludCwgaW50PiBIVDsKKy8vICB7CisvLyAgICBTY29wZWRIYXNoVGFibGVTY29wZTxpbnQsIGludD4gU2NvcGUxKEhUKTsKKy8vICAgIEhULmluc2VydCgwLCAwKTsKKy8vICAgIEhULmluc2VydCgxLCAxKTsKKy8vICAgIHsKKy8vICAgICAgU2NvcGVkSGFzaFRhYmxlU2NvcGU8aW50LCBpbnQ+IFNjb3BlMihIVCk7CisvLyAgICAgIEhULmluc2VydCgwLCA0Mik7CisvLyAgICB9CisvLyAgfQorLy8KKy8vIExvb2tpbmcgdXAgdGhlIHZhbHVlIGZvciAiMCIgaW4gdGhlIFNjb3BlMiBibG9jayB3aWxsIHJldHVybiA0Mi4gIExvb2tpbmcKKy8vIHVwIHRoZSB2YWx1ZSBmb3IgMCBiZWZvcmUgNDIgaXMgaW5zZXJ0ZWQgb3IgYWZ0ZXIgU2NvcGUyIGlzIHBvcHBlZCB3aWxsCisvLyByZXR1cm4gMC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NDT1BFREhBU0hUQUJMRV9ICisjZGVmaW5lIExMVk1fQURUX1NDT1BFREhBU0hUQUJMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwSW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPG5ldz4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgViwgdHlwZW5hbWUgS0luZm8gPSBEZW5zZU1hcEluZm88Sz4sCisgICAgICAgICAgdHlwZW5hbWUgQWxsb2NhdG9yVHkgPSBNYWxsb2NBbGxvY2F0b3I+CitjbGFzcyBTY29wZWRIYXNoVGFibGU7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWPgorY2xhc3MgU2NvcGVkSGFzaFRhYmxlVmFsIHsKKyAgU2NvcGVkSGFzaFRhYmxlVmFsICpOZXh0SW5TY29wZTsKKyAgU2NvcGVkSGFzaFRhYmxlVmFsICpOZXh0Rm9yS2V5OworICBLIEtleTsKKyAgViBWYWw7CisKKyAgU2NvcGVkSGFzaFRhYmxlVmFsKGNvbnN0IEsgJmtleSwgY29uc3QgViAmdmFsKSA6IEtleShrZXkpLCBWYWwodmFsKSB7fQorCitwdWJsaWM6CisgIGNvbnN0IEsgJmdldEtleSgpIGNvbnN0IHsgcmV0dXJuIEtleTsgfQorICBjb25zdCBWICZnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbDsgfQorICBWICZnZXRWYWx1ZSgpIHsgcmV0dXJuIFZhbDsgfQorCisgIFNjb3BlZEhhc2hUYWJsZVZhbCAqZ2V0TmV4dEZvcktleSgpIHsgcmV0dXJuIE5leHRGb3JLZXk7IH0KKyAgY29uc3QgU2NvcGVkSGFzaFRhYmxlVmFsICpnZXROZXh0Rm9yS2V5KCkgY29uc3QgeyByZXR1cm4gTmV4dEZvcktleTsgfQorICBTY29wZWRIYXNoVGFibGVWYWwgKmdldE5leHRJblNjb3BlKCkgeyByZXR1cm4gTmV4dEluU2NvcGU7IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQWxsb2NhdG9yVHk+CisgIHN0YXRpYyBTY29wZWRIYXNoVGFibGVWYWwgKkNyZWF0ZShTY29wZWRIYXNoVGFibGVWYWwgKm5leHRJblNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NvcGVkSGFzaFRhYmxlVmFsICpuZXh0Rm9yS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSyAma2V5LCBjb25zdCBWICZ2YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2F0b3JUeSAmQWxsb2NhdG9yKSB7CisgICAgU2NvcGVkSGFzaFRhYmxlVmFsICpOZXcgPSBBbGxvY2F0b3IudGVtcGxhdGUgQWxsb2NhdGU8U2NvcGVkSGFzaFRhYmxlVmFsPigpOworICAgIC8vIFNldCB1cCB0aGUgdmFsdWUuCisgICAgbmV3IChOZXcpIFNjb3BlZEhhc2hUYWJsZVZhbChrZXksIHZhbCk7CisgICAgTmV3LT5OZXh0SW5TY29wZSA9IG5leHRJblNjb3BlOworICAgIE5ldy0+TmV4dEZvcktleSA9IG5leHRGb3JLZXk7CisgICAgcmV0dXJuIE5ldzsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBbGxvY2F0b3JUeT4gdm9pZCBEZXN0cm95KEFsbG9jYXRvclR5ICZBbGxvY2F0b3IpIHsKKyAgICAvLyBGcmVlIG1lbW9yeSByZWZlcmVuY2VkIGJ5IHRoZSBpdGVtLgorICAgIHRoaXMtPn5TY29wZWRIYXNoVGFibGVWYWwoKTsKKyAgICBBbGxvY2F0b3IuRGVhbGxvY2F0ZSh0aGlzKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFYsIHR5cGVuYW1lIEtJbmZvID0gRGVuc2VNYXBJbmZvPEs+LAorICAgICAgICAgIHR5cGVuYW1lIEFsbG9jYXRvclR5ID0gTWFsbG9jQWxsb2NhdG9yPgorY2xhc3MgU2NvcGVkSGFzaFRhYmxlU2NvcGUgeworICAvLy8gSFQgLSBUaGUgaGFzaHRhYmxlIHRoYXQgd2UgYXJlIGFjdGl2ZSBmb3IuCisgIFNjb3BlZEhhc2hUYWJsZTxLLCBWLCBLSW5mbywgQWxsb2NhdG9yVHk+ICZIVDsKKworICAvLy8gUHJldlNjb3BlIC0gVGhpcyBpcyB0aGUgc2NvcGUgdGhhdCB3ZSBhcmUgc2hhZG93aW5nIGluIEhULgorICBTY29wZWRIYXNoVGFibGVTY29wZSAqUHJldlNjb3BlOworCisgIC8vLyBMYXN0VmFsSW5TY29wZSAtIFRoaXMgaXMgdGhlIGxhc3QgdmFsdWUgdGhhdCB3YXMgaW5zZXJ0ZWQgZm9yIHRoaXMgc2NvcGUKKyAgLy8vIG9yIG51bGwgaWYgbm9uZSBoYXZlIGJlZW4gaW5zZXJ0ZWQgeWV0LgorICBTY29wZWRIYXNoVGFibGVWYWw8SywgVj4gKkxhc3RWYWxJblNjb3BlOworCitwdWJsaWM6CisgIFNjb3BlZEhhc2hUYWJsZVNjb3BlKFNjb3BlZEhhc2hUYWJsZTxLLCBWLCBLSW5mbywgQWxsb2NhdG9yVHk+ICZIVCk7CisgIFNjb3BlZEhhc2hUYWJsZVNjb3BlKFNjb3BlZEhhc2hUYWJsZVNjb3BlICYpID0gZGVsZXRlOworICBTY29wZWRIYXNoVGFibGVTY29wZSAmb3BlcmF0b3I9KFNjb3BlZEhhc2hUYWJsZVNjb3BlICYpID0gZGVsZXRlOworICB+U2NvcGVkSGFzaFRhYmxlU2NvcGUoKTsKKworICBTY29wZWRIYXNoVGFibGVTY29wZSAqZ2V0UGFyZW50U2NvcGUoKSB7IHJldHVybiBQcmV2U2NvcGU7IH0KKyAgY29uc3QgU2NvcGVkSGFzaFRhYmxlU2NvcGUgKmdldFBhcmVudFNjb3BlKCkgY29uc3QgeyByZXR1cm4gUHJldlNjb3BlOyB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBTY29wZWRIYXNoVGFibGU8SywgViwgS0luZm8sIEFsbG9jYXRvclR5PjsKKworICBTY29wZWRIYXNoVGFibGVWYWw8SywgVj4gKmdldExhc3RWYWxJblNjb3BlKCkgeworICAgIHJldHVybiBMYXN0VmFsSW5TY29wZTsKKyAgfQorCisgIHZvaWQgc2V0TGFzdFZhbEluU2NvcGUoU2NvcGVkSGFzaFRhYmxlVmFsPEssIFY+ICpWYWwpIHsKKyAgICBMYXN0VmFsSW5TY29wZSA9IFZhbDsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFYsIHR5cGVuYW1lIEtJbmZvID0gRGVuc2VNYXBJbmZvPEs+PgorY2xhc3MgU2NvcGVkSGFzaFRhYmxlSXRlcmF0b3IgeworICBTY29wZWRIYXNoVGFibGVWYWw8SywgVj4gKk5vZGU7CisKK3B1YmxpYzoKKyAgU2NvcGVkSGFzaFRhYmxlSXRlcmF0b3IoU2NvcGVkSGFzaFRhYmxlVmFsPEssIFY+ICpub2RlKSA6IE5vZGUobm9kZSkge30KKworICBWICZvcGVyYXRvciooKSBjb25zdCB7CisgICAgYXNzZXJ0KE5vZGUgJiYgIkRlcmVmZXJlbmNlIGVuZCgpIik7CisgICAgcmV0dXJuIE5vZGUtPmdldFZhbHVlKCk7CisgIH0KKyAgViAqb3BlcmF0b3ItPigpIGNvbnN0IHsKKyAgICByZXR1cm4gJk5vZGUtPmdldFZhbHVlKCk7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgU2NvcGVkSGFzaFRhYmxlSXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiBOb2RlID09IFJIUy5Ob2RlOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTY29wZWRIYXNoVGFibGVJdGVyYXRvciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIE5vZGUgIT0gUkhTLk5vZGU7CisgIH0KKworICBpbmxpbmUgU2NvcGVkSGFzaFRhYmxlSXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7ICAgICAgICAgIC8vIFByZWluY3JlbWVudAorICAgIGFzc2VydChOb2RlICYmICJpbmNyZW1lbnRpbmcgcGFzdCBlbmQoKSIpOworICAgIE5vZGUgPSBOb2RlLT5nZXROZXh0Rm9yS2V5KCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIFNjb3BlZEhhc2hUYWJsZUl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7ICAgICAgICAvLyBQb3N0aW5jcmVtZW50CisgICAgU2NvcGVkSGFzaFRhYmxlSXRlcmF0b3IgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLLCB0eXBlbmFtZSBWLCB0eXBlbmFtZSBLSW5mbywgdHlwZW5hbWUgQWxsb2NhdG9yVHk+CitjbGFzcyBTY29wZWRIYXNoVGFibGUgeworcHVibGljOgorICAvLy8gU2NvcGVUeSAtIFRoaXMgaXMgYSBoZWxwZnVsIHR5cGVkZWYgdGhhdCBhbGxvd3MgY2xpZW50cyB0byBnZXQgZWFzeSBhY2Nlc3MKKyAgLy8vIHRvIHRoZSBuYW1lIG9mIHRoZSBzY29wZSBmb3IgdGhpcyBoYXNoIHRhYmxlLgorICB1c2luZyBTY29wZVR5ID0gU2NvcGVkSGFzaFRhYmxlU2NvcGU8SywgViwgS0luZm8sIEFsbG9jYXRvclR5PjsKKyAgdXNpbmcgc2l6ZV90eXBlID0gdW5zaWduZWQ7CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBTY29wZWRIYXNoVGFibGVTY29wZTxLLCBWLCBLSW5mbywgQWxsb2NhdG9yVHk+OworCisgIHVzaW5nIFZhbFR5ID0gU2NvcGVkSGFzaFRhYmxlVmFsPEssIFY+OworCisgIERlbnNlTWFwPEssIFZhbFR5KiwgS0luZm8+IFRvcExldmVsTWFwOworICBTY29wZVR5ICpDdXJTY29wZSA9IG51bGxwdHI7CisKKyAgQWxsb2NhdG9yVHkgQWxsb2NhdG9yOworCitwdWJsaWM6CisgIFNjb3BlZEhhc2hUYWJsZSgpID0gZGVmYXVsdDsKKyAgU2NvcGVkSGFzaFRhYmxlKEFsbG9jYXRvclR5IEEpIDogQWxsb2NhdG9yKEEpIHt9CisgIFNjb3BlZEhhc2hUYWJsZShjb25zdCBTY29wZWRIYXNoVGFibGUgJikgPSBkZWxldGU7CisgIFNjb3BlZEhhc2hUYWJsZSAmb3BlcmF0b3I9KGNvbnN0IFNjb3BlZEhhc2hUYWJsZSAmKSA9IGRlbGV0ZTsKKworICB+U2NvcGVkSGFzaFRhYmxlKCkgeworICAgIGFzc2VydCghQ3VyU2NvcGUgJiYgVG9wTGV2ZWxNYXAuZW1wdHkoKSAmJiAiU2NvcGUgaW1iYWxhbmNlISIpOworICB9CisKKyAgLy8vIEFjY2VzcyB0byB0aGUgYWxsb2NhdG9yLgorICBBbGxvY2F0b3JUeSAmZ2V0QWxsb2NhdG9yKCkgeyByZXR1cm4gQWxsb2NhdG9yOyB9CisgIGNvbnN0IEFsbG9jYXRvclR5ICZnZXRBbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBBbGxvY2F0b3I7IH0KKworICAvLy8gUmV0dXJuIDEgaWYgdGhlIHNwZWNpZmllZCBrZXkgaXMgaW4gdGhlIHRhYmxlLCAwIG90aGVyd2lzZS4KKyAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IEsgJktleSkgY29uc3QgeworICAgIHJldHVybiBUb3BMZXZlbE1hcC5jb3VudChLZXkpOworICB9CisKKyAgViBsb29rdXAoY29uc3QgSyAmS2V5KSBjb25zdCB7CisgICAgYXV0byBJID0gVG9wTGV2ZWxNYXAuZmluZChLZXkpOworICAgIGlmIChJICE9IFRvcExldmVsTWFwLmVuZCgpKQorICAgICAgcmV0dXJuIEktPnNlY29uZC0+Z2V0VmFsdWUoKTsKKworICAgIHJldHVybiBWKCk7CisgIH0KKworICB2b2lkIGluc2VydChjb25zdCBLICZLZXksIGNvbnN0IFYgJlZhbCkgeworICAgIGluc2VydEludG9TY29wZShDdXJTY29wZSwgS2V5LCBWYWwpOworICB9CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBTY29wZWRIYXNoVGFibGVJdGVyYXRvcjxLLCBWLCBLSW5mbz47CisKKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gaXRlcmF0b3IoMCk7IH0KKworICBpdGVyYXRvciBiZWdpbihjb25zdCBLICZLZXkpIHsKKyAgICB0eXBlbmFtZSBEZW5zZU1hcDxLLCBWYWxUeSosIEtJbmZvPjo6aXRlcmF0b3IgSSA9CisgICAgICBUb3BMZXZlbE1hcC5maW5kKEtleSk7CisgICAgaWYgKEkgPT0gVG9wTGV2ZWxNYXAuZW5kKCkpIHJldHVybiBlbmQoKTsKKyAgICByZXR1cm4gaXRlcmF0b3IoSS0+c2Vjb25kKTsKKyAgfQorCisgIFNjb3BlVHkgKmdldEN1clNjb3BlKCkgeyByZXR1cm4gQ3VyU2NvcGU7IH0KKyAgY29uc3QgU2NvcGVUeSAqZ2V0Q3VyU2NvcGUoKSBjb25zdCB7IHJldHVybiBDdXJTY29wZTsgfQorCisgIC8vLyBpbnNlcnRJbnRvU2NvcGUgLSBUaGlzIGluc2VydHMgdGhlIHNwZWNpZmllZCBrZXkvdmFsdWUgYXQgdGhlIHNwZWNpZmllZAorICAvLy8gKHBvc3NpYmx5IG5vdCB0aGUgY3VycmVudCkgc2NvcGUuICBXaGlsZSBpdCBpcyBvayB0byBpbnNlcnQgaW50byBhIHNjb3BlCisgIC8vLyB0aGF0IGlzbid0IHRoZSBjdXJyZW50IG9uZSwgaXQgaXNuJ3Qgb2sgdG8gaW5zZXJ0ICp1bmRlcm5lYXRoKiBhbiBleGlzdGluZworICAvLy8gdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBrZXkuCisgIHZvaWQgaW5zZXJ0SW50b1Njb3BlKFNjb3BlVHkgKlMsIGNvbnN0IEsgJktleSwgY29uc3QgViAmVmFsKSB7CisgICAgYXNzZXJ0KFMgJiYgIk5vIHNjb3BlIGFjdGl2ZSEiKTsKKyAgICBTY29wZWRIYXNoVGFibGVWYWw8SywgVj4gKiZLZXlFbnRyeSA9IFRvcExldmVsTWFwW0tleV07CisgICAgS2V5RW50cnkgPSBWYWxUeTo6Q3JlYXRlKFMtPmdldExhc3RWYWxJblNjb3BlKCksIEtleUVudHJ5LCBLZXksIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxsb2NhdG9yKTsKKyAgICBTLT5zZXRMYXN0VmFsSW5TY29wZShLZXlFbnRyeSk7CisgIH0KK307CisKKy8vLyBTY29wZWRIYXNoVGFibGVTY29wZSBjdG9yIC0gSW5zdGFsbCB0aGlzIGFzIHRoZSBjdXJyZW50IHNjb3BlIGZvciB0aGUgaGFzaAorLy8vIHRhYmxlLgordGVtcGxhdGUgPHR5cGVuYW1lIEssIHR5cGVuYW1lIFYsIHR5cGVuYW1lIEtJbmZvLCB0eXBlbmFtZSBBbGxvY2F0b3I+CitTY29wZWRIYXNoVGFibGVTY29wZTxLLCBWLCBLSW5mbywgQWxsb2NhdG9yPjo6CisgIFNjb3BlZEhhc2hUYWJsZVNjb3BlKFNjb3BlZEhhc2hUYWJsZTxLLCBWLCBLSW5mbywgQWxsb2NhdG9yPiAmaHQpIDogSFQoaHQpIHsKKyAgUHJldlNjb3BlID0gSFQuQ3VyU2NvcGU7CisgIEhULkN1clNjb3BlID0gdGhpczsKKyAgTGFzdFZhbEluU2NvcGUgPSBudWxscHRyOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSywgdHlwZW5hbWUgViwgdHlwZW5hbWUgS0luZm8sIHR5cGVuYW1lIEFsbG9jYXRvcj4KK1Njb3BlZEhhc2hUYWJsZVNjb3BlPEssIFYsIEtJbmZvLCBBbGxvY2F0b3I+Ojp+U2NvcGVkSGFzaFRhYmxlU2NvcGUoKSB7CisgIGFzc2VydChIVC5DdXJTY29wZSA9PSB0aGlzICYmICJTY29wZSBpbWJhbGFuY2UhIik7CisgIEhULkN1clNjb3BlID0gUHJldlNjb3BlOworCisgIC8vIFBvcCBhbmQgZGVsZXRlIGFsbCB2YWx1ZXMgY29ycmVzcG9uZGluZyB0byB0aGlzIHNjb3BlLgorICB3aGlsZSAoU2NvcGVkSGFzaFRhYmxlVmFsPEssIFY+ICpUaGlzRW50cnkgPSBMYXN0VmFsSW5TY29wZSkgeworICAgIC8vIFBvcCB0aGlzIHZhbHVlIG91dCBvZiB0aGUgVG9wTGV2ZWxNYXAuCisgICAgaWYgKCFUaGlzRW50cnktPmdldE5leHRGb3JLZXkoKSkgeworICAgICAgYXNzZXJ0KEhULlRvcExldmVsTWFwW1RoaXNFbnRyeS0+Z2V0S2V5KCldID09IFRoaXNFbnRyeSAmJgorICAgICAgICAgICAgICJTY29wZSBpbWJhbGFuY2UhIik7CisgICAgICBIVC5Ub3BMZXZlbE1hcC5lcmFzZShUaGlzRW50cnktPmdldEtleSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgU2NvcGVkSGFzaFRhYmxlVmFsPEssIFY+IComS2V5RW50cnkgPSBIVC5Ub3BMZXZlbE1hcFtUaGlzRW50cnktPmdldEtleSgpXTsKKyAgICAgIGFzc2VydChLZXlFbnRyeSA9PSBUaGlzRW50cnkgJiYgIlNjb3BlIGltYmFsYW5jZSEiKTsKKyAgICAgIEtleUVudHJ5ID0gVGhpc0VudHJ5LT5nZXROZXh0Rm9yS2V5KCk7CisgICAgfQorCisgICAgLy8gUG9wIHRoaXMgdmFsdWUgb3V0IG9mIHRoZSBzY29wZS4KKyAgICBMYXN0VmFsSW5TY29wZSA9IFRoaXNFbnRyeS0+Z2V0TmV4dEluU2NvcGUoKTsKKworICAgIC8vIERlbGV0ZSB0aGlzIGVudHJ5LgorICAgIFRoaXNFbnRyeS0+RGVzdHJveShIVC5nZXRBbGxvY2F0b3IoKSk7CisgIH0KK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX1NDT1BFREhBU0hUQUJMRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TZXF1ZW5jZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU2VxdWVuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDRhODk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU2VxdWVuY2UuaApAQCAtMCwwICsxLDg0IEBACisvLz09PS0gU2VxdWVuY2UuaCAtIFV0aWxpdHkgZm9yIHByb2R1Y2luZyBzZXF1ZW5jZXMgb2YgdmFsdWVzIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gVGhpcyByb3V0aW5lIHByb3ZpZGVzIHNvbWUgc3ludGhlc2lzIHV0aWxpdGllcyB0byBwcm9kdWNlIHNlcXVlbmNlcyBvZgorLy8vIHZhbHVlcy4gVGhlIG5hbWVzIGFyZSBpbnRlbnRpb25hbGx5IGtlcHQgdmVyeSBzaG9ydCBhcyB0aGV5IHRlbmQgdG8gb2NjdXIKKy8vLyBpbiBjb21tb24gYW5kIHdpZGVseSB1c2VkIGNvbnRleHRzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NFUVVFTkNFX0gKKyNkZWZpbmUgTExWTV9BRFRfU0VRVUVOQ0VfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBkZXRhaWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVUPgorY2xhc3MgdmFsdWVfc2VxdWVuY2VfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcl9mYWNhZGVfYmFzZTx2YWx1ZV9zZXF1ZW5jZV9pdGVyYXRvcjxWYWx1ZVQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWVUPiB7CisgIHVzaW5nIEJhc2VUID0gdHlwZW5hbWUgdmFsdWVfc2VxdWVuY2VfaXRlcmF0b3I6Oml0ZXJhdG9yX2ZhY2FkZV9iYXNlOworCisgIFZhbHVlVCBWYWx1ZTsKKworcHVibGljOgorICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSB0eXBlbmFtZSBCYXNlVDo6ZGlmZmVyZW5jZV90eXBlOworICB1c2luZyByZWZlcmVuY2UgPSB0eXBlbmFtZSBCYXNlVDo6cmVmZXJlbmNlOworCisgIHZhbHVlX3NlcXVlbmNlX2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworICB2YWx1ZV9zZXF1ZW5jZV9pdGVyYXRvcihjb25zdCB2YWx1ZV9zZXF1ZW5jZV9pdGVyYXRvciAmKSA9IGRlZmF1bHQ7CisgIHZhbHVlX3NlcXVlbmNlX2l0ZXJhdG9yKHZhbHVlX3NlcXVlbmNlX2l0ZXJhdG9yICYmQXJnKQorICAgICAgOiBWYWx1ZShzdGQ6Om1vdmUoQXJnLlZhbHVlKSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVSwgdHlwZW5hbWUgRW5hYmxlciA9IGRlY2x0eXBlKFZhbHVlVChzdGQ6OmRlY2x2YWw8VT4oKSkpPgorICB2YWx1ZV9zZXF1ZW5jZV9pdGVyYXRvcihVICYmVmFsdWUpIDogVmFsdWUoc3RkOjpmb3J3YXJkPFU+KFZhbHVlKSkge30KKworICB2YWx1ZV9zZXF1ZW5jZV9pdGVyYXRvciAmb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgTikgeworICAgIFZhbHVlICs9IE47CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIHZhbHVlX3NlcXVlbmNlX2l0ZXJhdG9yICZvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBOKSB7CisgICAgVmFsdWUgLT0gTjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgdXNpbmcgQmFzZVQ6Om9wZXJhdG9yLTsKKyAgZGlmZmVyZW5jZV90eXBlIG9wZXJhdG9yLShjb25zdCB2YWx1ZV9zZXF1ZW5jZV9pdGVyYXRvciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlIC0gUkhTLlZhbHVlOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHZhbHVlX3NlcXVlbmNlX2l0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWUgPT0gUkhTLlZhbHVlOworICB9CisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IHZhbHVlX3NlcXVlbmNlX2l0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWUgPCBSSFMuVmFsdWU7CisgIH0KKworICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkZXRhaWwKKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVD4KK2l0ZXJhdG9yX3JhbmdlPGRldGFpbDo6dmFsdWVfc2VxdWVuY2VfaXRlcmF0b3I8VmFsdWVUPj4gc2VxKFZhbHVlVCBCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlVCBFbmQpIHsKKyAgcmV0dXJuIG1ha2VfcmFuZ2UoZGV0YWlsOjp2YWx1ZV9zZXF1ZW5jZV9pdGVyYXRvcjxWYWx1ZVQ+KEJlZ2luKSwKKyAgICAgICAgICAgICAgICAgICAgZGV0YWlsOjp2YWx1ZV9zZXF1ZW5jZV9pdGVyYXRvcjxWYWx1ZVQ+KEVuZCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfU0VRVUVOQ0VfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU2V0T3BlcmF0aW9ucy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU2V0T3BlcmF0aW9ucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOWYyZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TZXRPcGVyYXRpb25zLmgKQEAgLTAsMCArMSw3MSBAQAorLy89PT0tLSBsbHZtL0FEVC9TZXRPcGVyYXRpb25zLmggLSBHZW5lcmljIFNldCBPcGVyYXRpb25zIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBnZW5lcmljIHNldCBvcGVyYXRpb25zIHRoYXQgbWF5IGJlIHVzZWQgb24gc2V0J3Mgb2YKKy8vIGRpZmZlcmVudCB0eXBlcywgYW5kIGRpZmZlcmVudCBlbGVtZW50IHR5cGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU0VUT1BFUkFUSU9OU19ICisjZGVmaW5lIExMVk1fQURUX1NFVE9QRVJBVElPTlNfSAorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBzZXRfdW5pb24oQSwgQikgLSBDb21wdXRlIEEgOj0gQSB1IEIsIHJldHVybiB3aGV0aGVyIEEgY2hhbmdlZC4KKy8vLwordGVtcGxhdGUgPGNsYXNzIFMxVHksIGNsYXNzIFMyVHk+Citib29sIHNldF91bmlvbihTMVR5ICZTMSwgY29uc3QgUzJUeSAmUzIpIHsKKyAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisKKyAgZm9yICh0eXBlbmFtZSBTMlR5Ojpjb25zdF9pdGVyYXRvciBTSSA9IFMyLmJlZ2luKCksIFNFID0gUzIuZW5kKCk7CisgICAgICAgU0kgIT0gU0U7ICsrU0kpCisgICAgaWYgKFMxLmluc2VydCgqU0kpLnNlY29uZCkKKyAgICAgIENoYW5nZWQgPSB0cnVlOworCisgIHJldHVybiBDaGFuZ2VkOworfQorCisvLy8gc2V0X2ludGVyc2VjdChBLCBCKSAtIENvbXB1dGUgQSA6PSBBIF4gQgorLy8vIElkZW50aWNhbCB0byBzZXRfaW50ZXJzZWN0aW9uLCBleGNlcHQgdGhhdCBpdCB3b3JrcyBvbiBzZXQ8PidzIGFuZAorLy8vIGlzIG5pY2VyIHRvIHVzZS4gIEZ1bmN0aW9uYWxseSwgdGhpcyBpdGVyYXRlcyB0aHJvdWdoIFMxLCByZW1vdmluZworLy8vIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCBjb250YWluZWQgaW4gUzIuCisvLy8KK3RlbXBsYXRlIDxjbGFzcyBTMVR5LCBjbGFzcyBTMlR5Pgordm9pZCBzZXRfaW50ZXJzZWN0KFMxVHkgJlMxLCBjb25zdCBTMlR5ICZTMikgeworICAgZm9yICh0eXBlbmFtZSBTMVR5OjppdGVyYXRvciBJID0gUzEuYmVnaW4oKTsgSSAhPSBTMS5lbmQoKTspIHsKKyAgICAgY29uc3QgYXV0byAmRSA9ICpJOworICAgICArK0k7CisgICAgIGlmICghUzIuY291bnQoRSkpIFMxLmVyYXNlKEUpOyAgIC8vIEVyYXNlIGVsZW1lbnQgaWYgbm90IGluIFMyCisgICB9Cit9CisKKy8vLyBzZXRfZGlmZmVyZW5jZShBLCBCKSAtIFJldHVybiBBIC0gQgorLy8vCit0ZW1wbGF0ZSA8Y2xhc3MgUzFUeSwgY2xhc3MgUzJUeT4KK1MxVHkgc2V0X2RpZmZlcmVuY2UoY29uc3QgUzFUeSAmUzEsIGNvbnN0IFMyVHkgJlMyKSB7CisgIFMxVHkgUmVzdWx0OworICBmb3IgKHR5cGVuYW1lIFMxVHk6OmNvbnN0X2l0ZXJhdG9yIFNJID0gUzEuYmVnaW4oKSwgU0UgPSBTMS5lbmQoKTsKKyAgICAgICBTSSAhPSBTRTsgKytTSSkKKyAgICBpZiAoIVMyLmNvdW50KCpTSSkpICAgICAgIC8vIGlmIHRoZSBlbGVtZW50IGlzIG5vdCBpbiBzZXQyCisgICAgICBSZXN1bHQuaW5zZXJ0KCpTSSk7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vLyBzZXRfc3VidHJhY3QoQSwgQikgLSBDb21wdXRlIEEgOj0gQSAtIEIKKy8vLwordGVtcGxhdGUgPGNsYXNzIFMxVHksIGNsYXNzIFMyVHk+Cit2b2lkIHNldF9zdWJ0cmFjdChTMVR5ICZTMSwgY29uc3QgUzJUeSAmUzIpIHsKKyAgZm9yICh0eXBlbmFtZSBTMlR5Ojpjb25zdF9pdGVyYXRvciBTSSA9IFMyLmJlZ2luKCksIFNFID0gUzIuZW5kKCk7CisgICAgICAgU0kgIT0gU0U7ICsrU0kpCisgICAgUzEuZXJhc2UoKlNJKTsKK30KKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TZXRWZWN0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NldFZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0ZWQ1MmYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TZXRWZWN0b3IuaApAQCAtMCwwICsxLDMxMiBAQAorLy89PT0tIGxsdm0vQURUL1NldFZlY3Rvci5oIC0gU2V0IHdpdGggaW5zZXJ0IG9yZGVyIGl0ZXJhdGlvbiAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHNldCB0aGF0IGhhcyBpbnNlcnRpb24gb3JkZXIgaXRlcmF0aW9uCisvLyBjaGFyYWN0ZXJpc3RpY3MuIFRoaXMgaXMgdXNlZnVsIGZvciBrZWVwaW5nIGEgc2V0IG9mIHRoaW5ncyB0aGF0IG5lZWQgdG8gYmUKKy8vIHZpc2l0ZWQgbGF0ZXIgYnV0IGluIGEgZGV0ZXJtaW5pc3RpYyBvcmRlciAoaW5zZXJ0aW9uIG9yZGVyKS4gVGhlIGludGVyZmFjZQorLy8gaXMgcHVycG9zZWZ1bGx5IG1pbmltYWwuCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgU2V0VmVjdG9yIGFuZCBTbWFsbFNldFZlY3Rvciwgd2hpY2ggcGVyZm9ybXMgbm8gYWxsb2NhdGlvbnMKKy8vIGlmIHRoZSBTZXRWZWN0b3IgaGFzIGxlc3MgdGhhbiBhIGNlcnRhaW4gbnVtYmVyIG9mIGVsZW1lbnRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU0VUVkVDVE9SX0gKKyNkZWZpbmUgTExWTV9BRFRfU0VUVkVDVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFxicmllZiBBIHZlY3RvciB0aGF0IGhhcyBzZXQgaW5zZXJ0aW9uIHNlbWFudGljcy4KKy8vLworLy8vIFRoaXMgYWRhcHRlciBjbGFzcyBwcm92aWRlcyBhIHdheSB0byBrZWVwIGEgc2V0IG9mIHRoaW5ncyB0aGF0IGFsc28gaGFzIHRoZQorLy8vIHByb3BlcnR5IG9mIGEgZGV0ZXJtaW5pc3RpYyBpdGVyYXRpb24gb3JkZXIuIFRoZSBvcmRlciBvZiBpdGVyYXRpb24gaXMgdGhlCisvLy8gb3JkZXIgb2YgaW5zZXJ0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFZlY3RvciA9IHN0ZDo6dmVjdG9yPFQ+LAorICAgICAgICAgIHR5cGVuYW1lIFNldCA9IERlbnNlU2V0PFQ+PgorY2xhc3MgU2V0VmVjdG9yIHsKK3B1YmxpYzoKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IFQ7CisgIHVzaW5nIGtleV90eXBlID0gVDsKKyAgdXNpbmcgcmVmZXJlbmNlID0gVCY7CisgIHVzaW5nIGNvbnN0X3JlZmVyZW5jZSA9IGNvbnN0IFQmOworICB1c2luZyBzZXRfdHlwZSA9IFNldDsKKyAgdXNpbmcgdmVjdG9yX3R5cGUgPSBWZWN0b3I7CisgIHVzaW5nIGl0ZXJhdG9yID0gdHlwZW5hbWUgdmVjdG9yX3R5cGU6OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IHR5cGVuYW1lIHZlY3Rvcl90eXBlOjpjb25zdF9pdGVyYXRvcjsKKyAgdXNpbmcgcmV2ZXJzZV9pdGVyYXRvciA9IHR5cGVuYW1lIHZlY3Rvcl90eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICB1c2luZyBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yID0gdHlwZW5hbWUgdmVjdG9yX3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgIHVzaW5nIHNpemVfdHlwZSA9IHR5cGVuYW1lIHZlY3Rvcl90eXBlOjpzaXplX3R5cGU7CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYW4gZW1wdHkgU2V0VmVjdG9yCisgIFNldFZlY3RvcigpID0gZGVmYXVsdDsKKworICAvLy8gXGJyaWVmIEluaXRpYWxpemUgYSBTZXRWZWN0b3Igd2l0aCBhIHJhbmdlIG9mIGVsZW1lbnRzCisgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICBTZXRWZWN0b3IoSXQgU3RhcnQsIEl0IEVuZCkgeworICAgIGluc2VydChTdGFydCwgRW5kKTsKKyAgfQorCisgIEFycmF5UmVmPFQ+IGdldEFycmF5UmVmKCkgY29uc3QgeyByZXR1cm4gdmVjdG9yXzsgfQorCisgIC8vLyBDbGVhciB0aGUgU2V0VmVjdG9yIGFuZCByZXR1cm4gdGhlIHVuZGVybHlpbmcgdmVjdG9yLgorICBWZWN0b3IgdGFrZVZlY3RvcigpIHsKKyAgICBzZXRfLmNsZWFyKCk7CisgICAgcmV0dXJuIHN0ZDo6bW92ZSh2ZWN0b3JfKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBTZXRWZWN0b3IgaXMgZW1wdHkgb3Igbm90LgorICBib29sIGVtcHR5KCkgY29uc3QgeworICAgIHJldHVybiB2ZWN0b3JfLmVtcHR5KCk7CisgIH0KKworICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBTZXRWZWN0b3IuCisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeworICAgIHJldHVybiB2ZWN0b3JfLnNpemUoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGFuIGl0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIFNldFZlY3Rvci4KKyAgaXRlcmF0b3IgYmVnaW4oKSB7CisgICAgcmV0dXJuIHZlY3Rvcl8uYmVnaW4oKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGEgY29uc3RfaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgU2V0VmVjdG9yLgorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gdmVjdG9yXy5iZWdpbigpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgYW4gaXRlcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgU2V0VmVjdG9yLgorICBpdGVyYXRvciBlbmQoKSB7CisgICAgcmV0dXJuIHZlY3Rvcl8uZW5kKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCBhIGNvbnN0X2l0ZXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIFNldFZlY3Rvci4KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeworICAgIHJldHVybiB2ZWN0b3JfLmVuZCgpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgYW4gcmV2ZXJzZV9pdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoZSBTZXRWZWN0b3IuCisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeworICAgIHJldHVybiB2ZWN0b3JfLnJiZWdpbigpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgYSBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIFNldFZlY3Rvci4KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIHZlY3Rvcl8ucmJlZ2luKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCBhIHJldmVyc2VfaXRlcmF0b3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgU2V0VmVjdG9yLgorICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7CisgICAgcmV0dXJuIHZlY3Rvcl8ucmVuZCgpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgYSBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIFNldFZlY3Rvci4KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeworICAgIHJldHVybiB2ZWN0b3JfLnJlbmQoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBmaXJzdCBlbGVtZW50IG9mIHRoZSBTZXRWZWN0b3IuCisgIGNvbnN0IFQgJmZyb250KCkgY29uc3QgeworICAgIGFzc2VydCghZW1wdHkoKSAmJiAiQ2Fubm90IGNhbGwgZnJvbnQoKSBvbiBlbXB0eSBTZXRWZWN0b3IhIik7CisgICAgcmV0dXJuIHZlY3Rvcl8uZnJvbnQoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIFNldFZlY3Rvci4KKyAgY29uc3QgVCAmYmFjaygpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWVtcHR5KCkgJiYgIkNhbm5vdCBjYWxsIGJhY2soKSBvbiBlbXB0eSBTZXRWZWN0b3IhIik7CisgICAgcmV0dXJuIHZlY3Rvcl8uYmFjaygpOworICB9CisKKyAgLy8vIFxicmllZiBJbmRleCBpbnRvIHRoZSBTZXRWZWN0b3IuCisgIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBuKSBjb25zdCB7CisgICAgYXNzZXJ0KG4gPCB2ZWN0b3JfLnNpemUoKSAmJiAiU2V0VmVjdG9yIGFjY2VzcyBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIHZlY3Rvcl9bbl07CisgIH0KKworICAvLy8gXGJyaWVmIEluc2VydCBhIG5ldyBlbGVtZW50IGludG8gdGhlIFNldFZlY3Rvci4KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhlIGVsZW1lbnQgd2FzIGluc2VydGVkIGludG8gdGhlIFNldFZlY3Rvci4KKyAgYm9vbCBpbnNlcnQoY29uc3QgdmFsdWVfdHlwZSAmWCkgeworICAgIGJvb2wgcmVzdWx0ID0gc2V0Xy5pbnNlcnQoWCkuc2Vjb25kOworICAgIGlmIChyZXN1bHQpCisgICAgICB2ZWN0b3JfLnB1c2hfYmFjayhYKTsKKyAgICByZXR1cm4gcmVzdWx0OworICB9CisKKyAgLy8vIFxicmllZiBJbnNlcnQgYSByYW5nZSBvZiBlbGVtZW50cyBpbnRvIHRoZSBTZXRWZWN0b3IuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICB2b2lkIGluc2VydChJdCBTdGFydCwgSXQgRW5kKSB7CisgICAgZm9yICg7IFN0YXJ0ICE9IEVuZDsgKytTdGFydCkKKyAgICAgIGlmIChzZXRfLmluc2VydCgqU3RhcnQpLnNlY29uZCkKKyAgICAgICAgdmVjdG9yXy5wdXNoX2JhY2soKlN0YXJ0KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVtb3ZlIGFuIGl0ZW0gZnJvbSB0aGUgc2V0IHZlY3Rvci4KKyAgYm9vbCByZW1vdmUoY29uc3QgdmFsdWVfdHlwZSYgWCkgeworICAgIGlmIChzZXRfLmVyYXNlKFgpKSB7CisgICAgICB0eXBlbmFtZSB2ZWN0b3JfdHlwZTo6aXRlcmF0b3IgSSA9IGZpbmQodmVjdG9yXywgWCk7CisgICAgICBhc3NlcnQoSSAhPSB2ZWN0b3JfLmVuZCgpICYmICJDb3JydXB0ZWQgU2V0VmVjdG9yIGluc3RhbmNlcyEiKTsKKyAgICAgIHZlY3Rvcl8uZXJhc2UoSSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIEVyYXNlIGEgc2luZ2xlIGVsZW1lbnQgZnJvbSB0aGUgc2V0IHZlY3Rvci4KKyAgLy8vIFxyZXR1cm5zIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBuZXh0IGVsZW1lbnQgdGhhdCBmb2xsb3dlZCB0aGUKKyAgLy8vIGVsZW1lbnQgZXJhc2VkLiBUaGlzIGlzIHRoZSBlbmQgb2YgdGhlIFNldFZlY3RvciBpZiB0aGUgbGFzdCBlbGVtZW50IGlzCisgIC8vLyBlcmFzZWQuCisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIEkpIHsKKyAgICBjb25zdCBrZXlfdHlwZSAmViA9ICpJOworICAgIGFzc2VydChzZXRfLmNvdW50KFYpICYmICJDb3JydXB0ZWQgU2V0VmVjdG9yIGluc3RhbmNlcyEiKTsKKyAgICBzZXRfLmVyYXNlKFYpOworCisgICAgLy8gRklYTUU6IE5vIG5lZWQgdG8gdXNlIHRoZSBub24tY29uc3QgaXRlcmF0b3Igd2hlbiBidWlsdCB3aXRoCisgICAgLy8gc3RkOnZlY3Rvci5lcmFzZShjb25zdF9pdGVyYXRvcikgYXMgZGVmaW5lZCBpbiBDKysxMS4gVGhpcyBpcyBmb3IKKyAgICAvLyBjb21wYXRpYmlsaXR5IHdpdGggbm9uLXN0YW5kYXJkIGxpYnN0ZGMrKyB1cCB0byA0LjggKGZpeGVkIGluIDQuOSkuCisgICAgYXV0byBOSSA9IHZlY3Rvcl8uYmVnaW4oKTsKKyAgICBzdGQ6OmFkdmFuY2UoTkksIHN0ZDo6ZGlzdGFuY2U8aXRlcmF0b3I+KE5JLCBJKSk7CisKKyAgICByZXR1cm4gdmVjdG9yXy5lcmFzZShOSSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlbW92ZSBpdGVtcyBmcm9tIHRoZSBzZXQgdmVjdG9yIGJhc2VkIG9uIGEgcHJlZGljYXRlIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgaW50ZW5kZWQgdG8gYmUgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIGNvZGUsIGlmIHdlIGNvdWxkCisgIC8vLyB3cml0ZSBpdDoKKyAgLy8vCisgIC8vLyBcY29kZQorICAvLy8gICBWLmVyYXNlKHJlbW92ZV9pZihWLCBQKSwgVi5lbmQoKSk7CisgIC8vLyBcZW5kY29kZQorICAvLy8KKyAgLy8vIEhvd2V2ZXIsIFNldFZlY3RvciBkb2Vzbid0IGV4cG9zZSBub24tY29uc3QgaXRlcmF0b3JzLCBtYWtpbmcgYW55CisgIC8vLyBhbGdvcml0aG0gbGlrZSByZW1vdmVfaWYgaW1wb3NzaWJsZSB0byB1c2UuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBhbnkgZWxlbWVudCBpcyByZW1vdmVkLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVW5hcnlQcmVkaWNhdGU+CisgIGJvb2wgcmVtb3ZlX2lmKFVuYXJ5UHJlZGljYXRlIFApIHsKKyAgICB0eXBlbmFtZSB2ZWN0b3JfdHlwZTo6aXRlcmF0b3IgSSA9CisgICAgICAgIGxsdm06OnJlbW92ZV9pZih2ZWN0b3JfLCBUZXN0QW5kRXJhc2VGcm9tU2V0PFVuYXJ5UHJlZGljYXRlPihQLCBzZXRfKSk7CisgICAgaWYgKEkgPT0gdmVjdG9yXy5lbmQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB2ZWN0b3JfLmVyYXNlKEksIHZlY3Rvcl8uZW5kKCkpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFxicmllZiBDb3VudCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIGEgZ2l2ZW4ga2V5IGluIHRoZSBTZXRWZWN0b3IuCisgIC8vLyBccmV0dXJucyAwIGlmIHRoZSBlbGVtZW50IGlzIG5vdCBpbiB0aGUgU2V0VmVjdG9yLCAxIGlmIGl0IGlzLgorICBzaXplX3R5cGUgY291bnQoY29uc3Qga2V5X3R5cGUgJmtleSkgY29uc3QgeworICAgIHJldHVybiBzZXRfLmNvdW50KGtleSk7CisgIH0KKworICAvLy8gXGJyaWVmIENvbXBsZXRlbHkgY2xlYXIgdGhlIFNldFZlY3RvcgorICB2b2lkIGNsZWFyKCkgeworICAgIHNldF8uY2xlYXIoKTsKKyAgICB2ZWN0b3JfLmNsZWFyKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlbW92ZSB0aGUgbGFzdCBlbGVtZW50IG9mIHRoZSBTZXRWZWN0b3IuCisgIHZvaWQgcG9wX2JhY2soKSB7CisgICAgYXNzZXJ0KCFlbXB0eSgpICYmICJDYW5ub3QgcmVtb3ZlIGFuIGVsZW1lbnQgZnJvbSBhbiBlbXB0eSBTZXRWZWN0b3IhIik7CisgICAgc2V0Xy5lcmFzZShiYWNrKCkpOworICAgIHZlY3Rvcl8ucG9wX2JhY2soKTsKKyAgfQorCisgIExMVk1fTk9ESVNDQVJEIFQgcG9wX2JhY2tfdmFsKCkgeworICAgIFQgUmV0ID0gYmFjaygpOworICAgIHBvcF9iYWNrKCk7CisgICAgcmV0dXJuIFJldDsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTZXRWZWN0b3IgJnRoYXQpIGNvbnN0IHsKKyAgICByZXR1cm4gdmVjdG9yXyA9PSB0aGF0LnZlY3Rvcl87CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgU2V0VmVjdG9yICZ0aGF0KSBjb25zdCB7CisgICAgcmV0dXJuIHZlY3Rvcl8gIT0gdGhhdC52ZWN0b3JfOworICB9CisKKyAgLy8vIFxicmllZiBDb21wdXRlIFRoaXMgOj0gVGhpcyB1IFMsIHJldHVybiB3aGV0aGVyICdUaGlzJyBjaGFuZ2VkLgorICAvLy8gVE9ETzogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHNldF91bmlvbiBmcm9tIFNldE9wZXJhdGlvbnMuaCwgYnV0CisgIC8vLyAgICAgICBTZXRWZWN0b3IgaW50ZXJmYWNlIGlzIGluY29uc2lzdGVudCB3aXRoIERlbnNlU2V0LgorICB0ZW1wbGF0ZSA8Y2xhc3MgU1R5PgorICBib29sIHNldF91bmlvbihjb25zdCBTVHkgJlMpIHsKKyAgICBib29sIENoYW5nZWQgPSBmYWxzZTsKKworICAgIGZvciAodHlwZW5hbWUgU1R5Ojpjb25zdF9pdGVyYXRvciBTSSA9IFMuYmVnaW4oKSwgU0UgPSBTLmVuZCgpOyBTSSAhPSBTRTsKKyAgICAgICAgICsrU0kpCisgICAgICBpZiAoaW5zZXJ0KCpTSSkpCisgICAgICAgIENoYW5nZWQgPSB0cnVlOworCisgICAgcmV0dXJuIENoYW5nZWQ7CisgIH0KKworICAvLy8gXGJyaWVmIENvbXB1dGUgVGhpcyA6PSBUaGlzIC0gQgorICAvLy8gVE9ETzogV2Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIHNldF9zdWJ0cmFjdCBmcm9tIFNldE9wZXJhdGlvbnMuaCwgYnV0CisgIC8vLyAgICAgICBTZXRWZWN0b3IgaW50ZXJmYWNlIGlzIGluY29uc2lzdGVudCB3aXRoIERlbnNlU2V0LgorICB0ZW1wbGF0ZSA8Y2xhc3MgU1R5PgorICB2b2lkIHNldF9zdWJ0cmFjdChjb25zdCBTVHkgJlMpIHsKKyAgICBmb3IgKHR5cGVuYW1lIFNUeTo6Y29uc3RfaXRlcmF0b3IgU0kgPSBTLmJlZ2luKCksIFNFID0gUy5lbmQoKTsgU0kgIT0gU0U7CisgICAgICAgICArK1NJKQorICAgICAgcmVtb3ZlKCpTSSk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBBIHdyYXBwZXIgcHJlZGljYXRlIGRlc2lnbmVkIGZvciB1c2Ugd2l0aCBzdGQ6OnJlbW92ZV9pZi4KKyAgLy8vCisgIC8vLyBUaGlzIHByZWRpY2F0ZSB3cmFwcyBhIHByZWRpY2F0ZSBzdWl0YWJsZSBmb3IgdXNlIHdpdGggc3RkOjpyZW1vdmVfaWYgdG8KKyAgLy8vIGNhbGwgc2V0Xy5lcmFzZSh4KSBvbiBlYWNoIGVsZW1lbnQgd2hpY2ggaXMgc2xhdGVkIGZvciByZW1vdmFsLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVW5hcnlQcmVkaWNhdGU+CisgIGNsYXNzIFRlc3RBbmRFcmFzZUZyb21TZXQgeworICAgIFVuYXJ5UHJlZGljYXRlIFA7CisgICAgc2V0X3R5cGUgJnNldF87CisKKyAgcHVibGljOgorICAgIFRlc3RBbmRFcmFzZUZyb21TZXQoVW5hcnlQcmVkaWNhdGUgUCwgc2V0X3R5cGUgJnNldF8pCisgICAgICAgIDogUChzdGQ6Om1vdmUoUCkpLCBzZXRfKHNldF8pIHt9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJndW1lbnRUPgorICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBBcmd1bWVudFQgJkFyZykgeworICAgICAgaWYgKFAoQXJnKSkgeworICAgICAgICBzZXRfLmVyYXNlKEFyZyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfTsKKworICBzZXRfdHlwZSBzZXRfOyAgICAgICAgIC8vLzwgVGhlIHNldC4KKyAgdmVjdG9yX3R5cGUgdmVjdG9yXzsgICAvLy88IFRoZSB2ZWN0b3IuCit9OworCisvLy8gXGJyaWVmIEEgU2V0VmVjdG9yIHRoYXQgcGVyZm9ybXMgbm8gYWxsb2NhdGlvbnMgaWYgc21hbGxlciB0aGFuCisvLy8gYSBjZXJ0YWluIHNpemUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdW5zaWduZWQgTj4KK2NsYXNzIFNtYWxsU2V0VmVjdG9yCisgICAgOiBwdWJsaWMgU2V0VmVjdG9yPFQsIFNtYWxsVmVjdG9yPFQsIE4+LCBTbWFsbERlbnNlU2V0PFQsIE4+PiB7CitwdWJsaWM6CisgIFNtYWxsU2V0VmVjdG9yKCkgPSBkZWZhdWx0OworCisgIC8vLyBcYnJpZWYgSW5pdGlhbGl6ZSBhIFNtYWxsU2V0VmVjdG9yIHdpdGggYSByYW5nZSBvZiBlbGVtZW50cworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdD4KKyAgU21hbGxTZXRWZWN0b3IoSXQgU3RhcnQsIEl0IEVuZCkgeworICAgIHRoaXMtPmluc2VydChTdGFydCwgRW5kKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX1NFVFZFQ1RPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TbWFsbEJpdFZlY3Rvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxCaXRWZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjM5MTc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxCaXRWZWN0b3IuaApAQCAtMCwwICsxLDcwMiBAQAorLy89PT0tIGxsdm0vQURUL1NtYWxsQml0VmVjdG9yLmggLSAnTm9ybWFsbHkgc21hbGwnIGJpdCB2ZWN0b3JzIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgU21hbGxCaXRWZWN0b3IgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9TTUFMTEJJVFZFQ1RPUl9ICisjZGVmaW5lIExMVk1fQURUX1NNQUxMQklUVkVDVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0JpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gVGhpcyBpcyBhICdiaXR2ZWN0b3InIChyZWFsbHksIGEgdmFyaWFibGUtc2l6ZWQgYml0IGFycmF5KSwgb3B0aW1pemVkIGZvcgorLy8vIHRoZSBjYXNlIHdoZW4gdGhlIGFycmF5IGlzIHNtYWxsLiBJdCBjb250YWlucyBvbmUgcG9pbnRlci1zaXplZCBmaWVsZCwgd2hpY2gKKy8vLyBpcyBkaXJlY3RseSB1c2VkIGFzIGEgcGxhaW4gY29sbGVjdGlvbiBvZiBiaXRzIHdoZW4gcG9zc2libGUsIG9yIGFzIGEKKy8vLyBwb2ludGVyIHRvIGEgbGFyZ2VyIGhlYXAtYWxsb2NhdGVkIGFycmF5IHdoZW4gbmVjZXNzYXJ5LiBUaGlzIGFsbG93cyBub3JtYWwKKy8vLyAic21hbGwiIGNhc2VzIHRvIGJlIGZhc3Qgd2l0aG91dCBsb3NpbmcgZ2VuZXJhbGl0eSBmb3IgbGFyZ2UgaW5wdXRzLgorY2xhc3MgU21hbGxCaXRWZWN0b3IgeworICAvLyBUT0RPOiBJbiAibGFyZ2UiIG1vZGUsIGEgcG9pbnRlciB0byBhIEJpdFZlY3RvciBpcyB1c2VkLCBsZWFkaW5nIHRvIGFuCisgIC8vIHVubmVjZXNzYXJ5IGxldmVsIG9mIGluZGlyZWN0aW9uLiBJdCB3b3VsZCBiZSBtb3JlIGVmZmljaWVudCB0byB1c2UgYQorICAvLyBwb2ludGVyIHRvIG1lbW9yeSBjb250YWluaW5nIHNpemUsIGFsbG9jYXRpb24gc2l6ZSwgYW5kIHRoZSBhcnJheSBvZiBiaXRzLgorICB1aW50cHRyX3QgWCA9IDE7CisKKyAgZW51bSB7CisgICAgLy8gVGhlIG51bWJlciBvZiBiaXRzIGluIHRoaXMgY2xhc3MuCisgICAgTnVtQmFzZUJpdHMgPSBzaXplb2YodWludHB0cl90KSAqIENIQVJfQklULAorCisgICAgLy8gT25lIGJpdCBpcyB1c2VkIHRvIGRpc2NyaW1pbmF0ZSBiZXR3ZWVuIHNtYWxsIGFuZCBsYXJnZSBtb2RlLiBUaGUKKyAgICAvLyByZW1haW5pbmcgYml0cyBhcmUgdXNlZCBmb3IgdGhlIHNtYWxsLW1vZGUgcmVwcmVzZW50YXRpb24uCisgICAgU21hbGxOdW1SYXdCaXRzID0gTnVtQmFzZUJpdHMgLSAxLAorCisgICAgLy8gQSBmZXcgbW9yZSBiaXRzIGFyZSB1c2VkIHRvIHN0b3JlIHRoZSBzaXplIG9mIHRoZSBiaXQgc2V0IGluIHNtYWxsIG1vZGUuCisgICAgLy8gVGhlb3JldGljYWxseSB0aGlzIGlzIGEgY2VpbC1sb2cyLiBUaGVzZSBiaXRzIGFyZSBlbmNvZGVkIGluIHRoZSBtb3N0CisgICAgLy8gc2lnbmlmaWNhbnQgYml0cyBvZiB0aGUgcmF3IGJpdHMuCisgICAgU21hbGxOdW1TaXplQml0cyA9IChOdW1CYXNlQml0cyA9PSAzMiA/IDUgOgorICAgICAgICAgICAgICAgICAgICAgICAgTnVtQmFzZUJpdHMgPT0gNjQgPyA2IDoKKyAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsTnVtUmF3Qml0cyksCisKKyAgICAvLyBUaGUgcmVtYWluaW5nIGJpdHMgYXJlIHVzZWQgdG8gc3RvcmUgdGhlIGFjdHVhbCBzZXQgaW4gc21hbGwgbW9kZS4KKyAgICBTbWFsbE51bURhdGFCaXRzID0gU21hbGxOdW1SYXdCaXRzIC0gU21hbGxOdW1TaXplQml0cworICB9OworCisgIHN0YXRpY19hc3NlcnQoTnVtQmFzZUJpdHMgPT0gNjQgfHwgTnVtQmFzZUJpdHMgPT0gMzIsCisgICAgICAgICAgICAgICAgIlVuc3VwcG9ydGVkIHdvcmQgc2l6ZSIpOworCitwdWJsaWM6CisgIHVzaW5nIHNpemVfdHlwZSA9IHVuc2lnbmVkOworCisgIC8vIEVuY2Fwc3VsYXRpb24gb2YgYSBzaW5nbGUgYml0LgorICBjbGFzcyByZWZlcmVuY2UgeworICAgIFNtYWxsQml0VmVjdG9yICZUaGVWZWN0b3I7CisgICAgdW5zaWduZWQgQml0UG9zOworCisgIHB1YmxpYzoKKyAgICByZWZlcmVuY2UoU21hbGxCaXRWZWN0b3IgJmIsIHVuc2lnbmVkIElkeCkgOiBUaGVWZWN0b3IoYiksIEJpdFBvcyhJZHgpIHt9CisKKyAgICByZWZlcmVuY2UoY29uc3QgcmVmZXJlbmNlJikgPSBkZWZhdWx0OworCisgICAgcmVmZXJlbmNlJiBvcGVyYXRvcj0ocmVmZXJlbmNlIHQpIHsKKyAgICAgICp0aGlzID0gYm9vbCh0KTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICByZWZlcmVuY2UmIG9wZXJhdG9yPShib29sIHQpIHsKKyAgICAgIGlmICh0KQorICAgICAgICBUaGVWZWN0b3Iuc2V0KEJpdFBvcyk7CisgICAgICBlbHNlCisgICAgICAgIFRoZVZlY3Rvci5yZXNldChCaXRQb3MpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgICByZXR1cm4gY29uc3RfY2FzdDxjb25zdCBTbWFsbEJpdFZlY3RvciAmPihUaGVWZWN0b3IpLm9wZXJhdG9yW10oQml0UG9zKTsKKyAgICB9CisgIH07CisKK3ByaXZhdGU6CisgIGJvb2wgaXNTbWFsbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gWCAmIHVpbnRwdHJfdCgxKTsKKyAgfQorCisgIEJpdFZlY3RvciAqZ2V0UG9pbnRlcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzU21hbGwoKSk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Qml0VmVjdG9yICo+KFgpOworICB9CisKKyAgdm9pZCBzd2l0Y2hUb1NtYWxsKHVpbnRwdHJfdCBOZXdTbWFsbEJpdHMsIHNpemVfdCBOZXdTaXplKSB7CisgICAgWCA9IDE7CisgICAgc2V0U21hbGxTaXplKE5ld1NpemUpOworICAgIHNldFNtYWxsQml0cyhOZXdTbWFsbEJpdHMpOworICB9CisKKyAgdm9pZCBzd2l0Y2hUb0xhcmdlKEJpdFZlY3RvciAqQlYpIHsKKyAgICBYID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KEJWKTsKKyAgICBhc3NlcnQoIWlzU21hbGwoKSAmJiAiVHJpZWQgdG8gdXNlIGFuIHVuYWxpZ25lZCBwb2ludGVyIik7CisgIH0KKworICAvLyBSZXR1cm4gYWxsIHRoZSBiaXRzIHVzZWQgZm9yIHRoZSAic21hbGwiIHJlcHJlc2VudGF0aW9uOyB0aGlzIGluY2x1ZGVzCisgIC8vIGJpdHMgZm9yIHRoZSBzaXplIGFzIHdlbGwgYXMgdGhlIGVsZW1lbnQgYml0cy4KKyAgdWludHB0cl90IGdldFNtYWxsUmF3Qml0cygpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNTbWFsbCgpKTsKKyAgICByZXR1cm4gWCA+PiAxOworICB9CisKKyAgdm9pZCBzZXRTbWFsbFJhd0JpdHModWludHB0cl90IE5ld1Jhd0JpdHMpIHsKKyAgICBhc3NlcnQoaXNTbWFsbCgpKTsKKyAgICBYID0gKE5ld1Jhd0JpdHMgPDwgMSkgfCB1aW50cHRyX3QoMSk7CisgIH0KKworICAvLyBSZXR1cm4gdGhlIHNpemUuCisgIHNpemVfdCBnZXRTbWFsbFNpemUoKSBjb25zdCB7IHJldHVybiBnZXRTbWFsbFJhd0JpdHMoKSA+PiBTbWFsbE51bURhdGFCaXRzOyB9CisKKyAgdm9pZCBzZXRTbWFsbFNpemUoc2l6ZV90IFNpemUpIHsKKyAgICBzZXRTbWFsbFJhd0JpdHMoZ2V0U21hbGxCaXRzKCkgfCAoU2l6ZSA8PCBTbWFsbE51bURhdGFCaXRzKSk7CisgIH0KKworICAvLyBSZXR1cm4gdGhlIGVsZW1lbnQgYml0cy4KKyAgdWludHB0cl90IGdldFNtYWxsQml0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U21hbGxSYXdCaXRzKCkgJiB+KH51aW50cHRyX3QoMCkgPDwgZ2V0U21hbGxTaXplKCkpOworICB9CisKKyAgdm9pZCBzZXRTbWFsbEJpdHModWludHB0cl90IE5ld0JpdHMpIHsKKyAgICBzZXRTbWFsbFJhd0JpdHMoKE5ld0JpdHMgJiB+KH51aW50cHRyX3QoMCkgPDwgZ2V0U21hbGxTaXplKCkpKSB8CisgICAgICAgICAgICAgICAgICAgIChnZXRTbWFsbFNpemUoKSA8PCBTbWFsbE51bURhdGFCaXRzKSk7CisgIH0KKworcHVibGljOgorICAvLy8gQ3JlYXRlcyBhbiBlbXB0eSBiaXR2ZWN0b3IuCisgIFNtYWxsQml0VmVjdG9yKCkgPSBkZWZhdWx0OworCisgIC8vLyBDcmVhdGVzIGEgYml0dmVjdG9yIG9mIHNwZWNpZmllZCBudW1iZXIgb2YgYml0cy4gQWxsIGJpdHMgYXJlIGluaXRpYWxpemVkCisgIC8vLyB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICBleHBsaWNpdCBTbWFsbEJpdFZlY3Rvcih1bnNpZ25lZCBzLCBib29sIHQgPSBmYWxzZSkgeworICAgIGlmIChzIDw9IFNtYWxsTnVtRGF0YUJpdHMpCisgICAgICBzd2l0Y2hUb1NtYWxsKHQgPyB+dWludHB0cl90KDApIDogMCwgcyk7CisgICAgZWxzZQorICAgICAgc3dpdGNoVG9MYXJnZShuZXcgQml0VmVjdG9yKHMsIHQpKTsKKyAgfQorCisgIC8vLyBTbWFsbEJpdFZlY3RvciBjb3B5IGN0b3IuCisgIFNtYWxsQml0VmVjdG9yKGNvbnN0IFNtYWxsQml0VmVjdG9yICZSSFMpIHsKKyAgICBpZiAoUkhTLmlzU21hbGwoKSkKKyAgICAgIFggPSBSSFMuWDsKKyAgICBlbHNlCisgICAgICBzd2l0Y2hUb0xhcmdlKG5ldyBCaXRWZWN0b3IoKlJIUy5nZXRQb2ludGVyKCkpKTsKKyAgfQorCisgIFNtYWxsQml0VmVjdG9yKFNtYWxsQml0VmVjdG9yICYmUkhTKSA6IFgoUkhTLlgpIHsKKyAgICBSSFMuWCA9IDE7CisgIH0KKworICB+U21hbGxCaXRWZWN0b3IoKSB7CisgICAgaWYgKCFpc1NtYWxsKCkpCisgICAgICBkZWxldGUgZ2V0UG9pbnRlcigpOworICB9CisKKyAgdXNpbmcgY29uc3Rfc2V0X2JpdHNfaXRlcmF0b3IgPSBjb25zdF9zZXRfYml0c19pdGVyYXRvcl9pbXBsPFNtYWxsQml0VmVjdG9yPjsKKyAgdXNpbmcgc2V0X2l0ZXJhdG9yID0gY29uc3Rfc2V0X2JpdHNfaXRlcmF0b3I7CisKKyAgY29uc3Rfc2V0X2JpdHNfaXRlcmF0b3Igc2V0X2JpdHNfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yKCp0aGlzKTsKKyAgfQorCisgIGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yIHNldF9iaXRzX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3Rfc2V0X2JpdHNfaXRlcmF0b3IoKnRoaXMsIC0xKTsKKyAgfQorCisgIGl0ZXJhdG9yX3JhbmdlPGNvbnN0X3NldF9iaXRzX2l0ZXJhdG9yPiBzZXRfYml0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShzZXRfYml0c19iZWdpbigpLCBzZXRfYml0c19lbmQoKSk7CisgIH0KKworICAvLy8gVGVzdHMgd2hldGhlciB0aGVyZSBhcmUgbm8gYml0cyBpbiB0aGlzIGJpdHZlY3Rvci4KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNTbWFsbCgpID8gZ2V0U21hbGxTaXplKCkgPT0gMCA6IGdldFBvaW50ZXIoKS0+ZW1wdHkoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGlzIGJpdHZlY3Rvci4KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzU21hbGwoKSA/IGdldFNtYWxsU2l6ZSgpIDogZ2V0UG9pbnRlcigpLT5zaXplKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJpdHMgd2hpY2ggYXJlIHNldC4KKyAgc2l6ZV90eXBlIGNvdW50KCkgY29uc3QgeworICAgIGlmIChpc1NtYWxsKCkpIHsKKyAgICAgIHVpbnRwdHJfdCBCaXRzID0gZ2V0U21hbGxCaXRzKCk7CisgICAgICByZXR1cm4gY291bnRQb3B1bGF0aW9uKEJpdHMpOworICAgIH0KKyAgICByZXR1cm4gZ2V0UG9pbnRlcigpLT5jb3VudCgpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgYml0IGlzIHNldC4KKyAgYm9vbCBhbnkoKSBjb25zdCB7CisgICAgaWYgKGlzU21hbGwoKSkKKyAgICAgIHJldHVybiBnZXRTbWFsbEJpdHMoKSAhPSAwOworICAgIHJldHVybiBnZXRQb2ludGVyKCktPmFueSgpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbGwgYml0cyBhcmUgc2V0LgorICBib29sIGFsbCgpIGNvbnN0IHsKKyAgICBpZiAoaXNTbWFsbCgpKQorICAgICAgcmV0dXJuIGdldFNtYWxsQml0cygpID09ICh1aW50cHRyX3QoMSkgPDwgZ2V0U21hbGxTaXplKCkpIC0gMTsKKyAgICByZXR1cm4gZ2V0UG9pbnRlcigpLT5hbGwoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgbm9uZSBvZiB0aGUgYml0cyBhcmUgc2V0LgorICBib29sIG5vbmUoKSBjb25zdCB7CisgICAgaWYgKGlzU21hbGwoKSkKKyAgICAgIHJldHVybiBnZXRTbWFsbEJpdHMoKSA9PSAwOworICAgIHJldHVybiBnZXRQb2ludGVyKCktPm5vbmUoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgc2V0IGJpdCwgLTEgaWYgbm9uZSBvZiB0aGUgYml0cyBhcmUgc2V0LgorICBpbnQgZmluZF9maXJzdCgpIGNvbnN0IHsKKyAgICBpZiAoaXNTbWFsbCgpKSB7CisgICAgICB1aW50cHRyX3QgQml0cyA9IGdldFNtYWxsQml0cygpOworICAgICAgaWYgKEJpdHMgPT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgcmV0dXJuIGNvdW50VHJhaWxpbmdaZXJvcyhCaXRzKTsKKyAgICB9CisgICAgcmV0dXJuIGdldFBvaW50ZXIoKS0+ZmluZF9maXJzdCgpOworICB9CisKKyAgaW50IGZpbmRfbGFzdCgpIGNvbnN0IHsKKyAgICBpZiAoaXNTbWFsbCgpKSB7CisgICAgICB1aW50cHRyX3QgQml0cyA9IGdldFNtYWxsQml0cygpOworICAgICAgaWYgKEJpdHMgPT0gMCkKKyAgICAgICAgcmV0dXJuIC0xOworICAgICAgcmV0dXJuIE51bUJhc2VCaXRzIC0gY291bnRMZWFkaW5nWmVyb3MoQml0cyk7CisgICAgfQorICAgIHJldHVybiBnZXRQb2ludGVyKCktPmZpbmRfbGFzdCgpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCB1bnNldCBiaXQsIC0xIGlmIGFsbCBvZiB0aGUgYml0cyBhcmUgc2V0LgorICBpbnQgZmluZF9maXJzdF91bnNldCgpIGNvbnN0IHsKKyAgICBpZiAoaXNTbWFsbCgpKSB7CisgICAgICBpZiAoY291bnQoKSA9PSBnZXRTbWFsbFNpemUoKSkKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgICB1aW50cHRyX3QgQml0cyA9IGdldFNtYWxsQml0cygpOworICAgICAgcmV0dXJuIGNvdW50VHJhaWxpbmdPbmVzKEJpdHMpOworICAgIH0KKyAgICByZXR1cm4gZ2V0UG9pbnRlcigpLT5maW5kX2ZpcnN0X3Vuc2V0KCk7CisgIH0KKworICBpbnQgZmluZF9sYXN0X3Vuc2V0KCkgY29uc3QgeworICAgIGlmIChpc1NtYWxsKCkpIHsKKyAgICAgIGlmIChjb3VudCgpID09IGdldFNtYWxsU2l6ZSgpKQorICAgICAgICByZXR1cm4gLTE7CisKKyAgICAgIHVpbnRwdHJfdCBCaXRzID0gZ2V0U21hbGxCaXRzKCk7CisgICAgICByZXR1cm4gTnVtQmFzZUJpdHMgLSBjb3VudExlYWRpbmdPbmVzKEJpdHMpOworICAgIH0KKyAgICByZXR1cm4gZ2V0UG9pbnRlcigpLT5maW5kX2xhc3RfdW5zZXQoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBzZXQgYml0IGZvbGxvd2luZyB0aGUgIlByZXYiIGJpdC4KKyAgLy8vIFJldHVybnMgLTEgaWYgdGhlIG5leHQgc2V0IGJpdCBpcyBub3QgZm91bmQuCisgIGludCBmaW5kX25leHQodW5zaWduZWQgUHJldikgY29uc3QgeworICAgIGlmIChpc1NtYWxsKCkpIHsKKyAgICAgIHVpbnRwdHJfdCBCaXRzID0gZ2V0U21hbGxCaXRzKCk7CisgICAgICAvLyBNYXNrIG9mZiBwcmV2aW91cyBiaXRzLgorICAgICAgQml0cyAmPSB+dWludHB0cl90KDApIDw8IChQcmV2ICsgMSk7CisgICAgICBpZiAoQml0cyA9PSAwIHx8IFByZXYgKyAxID49IGdldFNtYWxsU2l6ZSgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICByZXR1cm4gY291bnRUcmFpbGluZ1plcm9zKEJpdHMpOworICAgIH0KKyAgICByZXR1cm4gZ2V0UG9pbnRlcigpLT5maW5kX25leHQoUHJldik7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIG5leHQgdW5zZXQgYml0IGZvbGxvd2luZyB0aGUgIlByZXYiIGJpdC4KKyAgLy8vIFJldHVybnMgLTEgaWYgdGhlIG5leHQgdW5zZXQgYml0IGlzIG5vdCBmb3VuZC4KKyAgaW50IGZpbmRfbmV4dF91bnNldCh1bnNpZ25lZCBQcmV2KSBjb25zdCB7CisgICAgaWYgKGlzU21hbGwoKSkgeworICAgICAgKytQcmV2OworICAgICAgdWludHB0cl90IEJpdHMgPSBnZXRTbWFsbEJpdHMoKTsKKyAgICAgIC8vIE1hc2sgaW4gcHJldmlvdXMgYml0cy4KKyAgICAgIHVpbnRwdHJfdCBNYXNrID0gKDEgPDwgUHJldikgLSAxOworICAgICAgQml0cyB8PSBNYXNrOworCisgICAgICBpZiAoQml0cyA9PSB+dWludHB0cl90KDApIHx8IFByZXYgKyAxID49IGdldFNtYWxsU2l6ZSgpKQorICAgICAgICByZXR1cm4gLTE7CisgICAgICByZXR1cm4gY291bnRUcmFpbGluZ09uZXMoQml0cyk7CisgICAgfQorICAgIHJldHVybiBnZXRQb2ludGVyKCktPmZpbmRfbmV4dF91bnNldChQcmV2KTsKKyAgfQorCisgIC8vLyBmaW5kX3ByZXYgLSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgc2V0IGJpdCB0aGF0IHByZWNlZGVzIHRoZQorICAvLy8gdGhlIGJpdCBhdCBccCBQcmlvclRvLiAgUmV0dXJucyAtMSBpZiBhbGwgcHJldmlvdXMgYml0cyBhcmUgdW5zZXQuCisgIGludCBmaW5kX3ByZXYodW5zaWduZWQgUHJpb3JUbykgY29uc3QgeworICAgIGlmIChpc1NtYWxsKCkpIHsKKyAgICAgIGlmIChQcmlvclRvID09IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgICAgLS1QcmlvclRvOworICAgICAgdWludHB0cl90IEJpdHMgPSBnZXRTbWFsbEJpdHMoKTsKKyAgICAgIEJpdHMgJj0gbWFza1RyYWlsaW5nT25lczx1aW50cHRyX3Q+KFByaW9yVG8gKyAxKTsKKyAgICAgIGlmIChCaXRzID09IDApCisgICAgICAgIHJldHVybiAtMTsKKworICAgICAgcmV0dXJuIE51bUJhc2VCaXRzIC0gY291bnRMZWFkaW5nWmVyb3MoQml0cykgLSAxOworICAgIH0KKyAgICByZXR1cm4gZ2V0UG9pbnRlcigpLT5maW5kX3ByZXYoUHJpb3JUbyk7CisgIH0KKworICAvLy8gQ2xlYXIgYWxsIGJpdHMuCisgIHZvaWQgY2xlYXIoKSB7CisgICAgaWYgKCFpc1NtYWxsKCkpCisgICAgICBkZWxldGUgZ2V0UG9pbnRlcigpOworICAgIHN3aXRjaFRvU21hbGwoMCwgMCk7CisgIH0KKworICAvLy8gR3JvdyBvciBzaHJpbmsgdGhlIGJpdHZlY3Rvci4KKyAgdm9pZCByZXNpemUodW5zaWduZWQgTiwgYm9vbCB0ID0gZmFsc2UpIHsKKyAgICBpZiAoIWlzU21hbGwoKSkgeworICAgICAgZ2V0UG9pbnRlcigpLT5yZXNpemUoTiwgdCk7CisgICAgfSBlbHNlIGlmIChTbWFsbE51bURhdGFCaXRzID49IE4pIHsKKyAgICAgIHVpbnRwdHJfdCBOZXdCaXRzID0gdCA/IH51aW50cHRyX3QoMCkgPDwgZ2V0U21hbGxTaXplKCkgOiAwOworICAgICAgc2V0U21hbGxTaXplKE4pOworICAgICAgc2V0U21hbGxCaXRzKE5ld0JpdHMgfCBnZXRTbWFsbEJpdHMoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIEJpdFZlY3RvciAqQlYgPSBuZXcgQml0VmVjdG9yKE4sIHQpOworICAgICAgdWludHB0cl90IE9sZEJpdHMgPSBnZXRTbWFsbEJpdHMoKTsKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gZ2V0U21hbGxTaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAoKkJWKVtpXSA9IChPbGRCaXRzID4+IGkpICYgMTsKKyAgICAgIHN3aXRjaFRvTGFyZ2UoQlYpOworICAgIH0KKyAgfQorCisgIHZvaWQgcmVzZXJ2ZSh1bnNpZ25lZCBOKSB7CisgICAgaWYgKGlzU21hbGwoKSkgeworICAgICAgaWYgKE4gPiBTbWFsbE51bURhdGFCaXRzKSB7CisgICAgICAgIHVpbnRwdHJfdCBPbGRCaXRzID0gZ2V0U21hbGxSYXdCaXRzKCk7CisgICAgICAgIHNpemVfdCBTbWFsbFNpemUgPSBnZXRTbWFsbFNpemUoKTsKKyAgICAgICAgQml0VmVjdG9yICpCViA9IG5ldyBCaXRWZWN0b3IoU21hbGxTaXplKTsKKyAgICAgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBTbWFsbFNpemU7ICsraSkKKyAgICAgICAgICBpZiAoKE9sZEJpdHMgPj4gaSkgJiAxKQorICAgICAgICAgICAgQlYtPnNldChpKTsKKyAgICAgICAgQlYtPnJlc2VydmUoTik7CisgICAgICAgIHN3aXRjaFRvTGFyZ2UoQlYpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBnZXRQb2ludGVyKCktPnJlc2VydmUoTik7CisgICAgfQorICB9CisKKyAgLy8gU2V0LCByZXNldCwgZmxpcAorICBTbWFsbEJpdFZlY3RvciAmc2V0KCkgeworICAgIGlmIChpc1NtYWxsKCkpCisgICAgICBzZXRTbWFsbEJpdHMofnVpbnRwdHJfdCgwKSk7CisgICAgZWxzZQorICAgICAgZ2V0UG9pbnRlcigpLT5zZXQoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBTbWFsbEJpdFZlY3RvciAmc2V0KHVuc2lnbmVkIElkeCkgeworICAgIGlmIChpc1NtYWxsKCkpIHsKKyAgICAgIGFzc2VydChJZHggPD0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czx1aW50cHRyX3Q+OjpkaWdpdHMpICYmCisgICAgICAgICAgICAgInVuZGVmaW5lZCBiZWhhdmlvciIpOworICAgICAgc2V0U21hbGxCaXRzKGdldFNtYWxsQml0cygpIHwgKHVpbnRwdHJfdCgxKSA8PCBJZHgpKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgZ2V0UG9pbnRlcigpLT5zZXQoSWR4KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gRWZmaWNpZW50bHkgc2V0IGEgcmFuZ2Ugb2YgYml0cyBpbiBbSSwgRSkKKyAgU21hbGxCaXRWZWN0b3IgJnNldCh1bnNpZ25lZCBJLCB1bnNpZ25lZCBFKSB7CisgICAgYXNzZXJ0KEkgPD0gRSAmJiAiQXR0ZW1wdGVkIHRvIHNldCBiYWNrd2FyZHMgcmFuZ2UhIik7CisgICAgYXNzZXJ0KEUgPD0gc2l6ZSgpICYmICJBdHRlbXB0ZWQgdG8gc2V0IG91dC1vZi1ib3VuZHMgcmFuZ2UhIik7CisgICAgaWYgKEkgPT0gRSkgcmV0dXJuICp0aGlzOworICAgIGlmIChpc1NtYWxsKCkpIHsKKyAgICAgIHVpbnRwdHJfdCBFTWFzayA9ICgodWludHB0cl90KTEpIDw8IEU7CisgICAgICB1aW50cHRyX3QgSU1hc2sgPSAoKHVpbnRwdHJfdCkxKSA8PCBJOworICAgICAgdWludHB0cl90IE1hc2sgPSBFTWFzayAtIElNYXNrOworICAgICAgc2V0U21hbGxCaXRzKGdldFNtYWxsQml0cygpIHwgTWFzayk7CisgICAgfSBlbHNlCisgICAgICBnZXRQb2ludGVyKCktPnNldChJLCBFKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBTbWFsbEJpdFZlY3RvciAmcmVzZXQoKSB7CisgICAgaWYgKGlzU21hbGwoKSkKKyAgICAgIHNldFNtYWxsQml0cygwKTsKKyAgICBlbHNlCisgICAgICBnZXRQb2ludGVyKCktPnJlc2V0KCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgU21hbGxCaXRWZWN0b3IgJnJlc2V0KHVuc2lnbmVkIElkeCkgeworICAgIGlmIChpc1NtYWxsKCkpCisgICAgICBzZXRTbWFsbEJpdHMoZ2V0U21hbGxCaXRzKCkgJiB+KHVpbnRwdHJfdCgxKSA8PCBJZHgpKTsKKyAgICBlbHNlCisgICAgICBnZXRQb2ludGVyKCktPnJlc2V0KElkeCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIEVmZmljaWVudGx5IHJlc2V0IGEgcmFuZ2Ugb2YgYml0cyBpbiBbSSwgRSkKKyAgU21hbGxCaXRWZWN0b3IgJnJlc2V0KHVuc2lnbmVkIEksIHVuc2lnbmVkIEUpIHsKKyAgICBhc3NlcnQoSSA8PSBFICYmICJBdHRlbXB0ZWQgdG8gcmVzZXQgYmFja3dhcmRzIHJhbmdlISIpOworICAgIGFzc2VydChFIDw9IHNpemUoKSAmJiAiQXR0ZW1wdGVkIHRvIHJlc2V0IG91dC1vZi1ib3VuZHMgcmFuZ2UhIik7CisgICAgaWYgKEkgPT0gRSkgcmV0dXJuICp0aGlzOworICAgIGlmIChpc1NtYWxsKCkpIHsKKyAgICAgIHVpbnRwdHJfdCBFTWFzayA9ICgodWludHB0cl90KTEpIDw8IEU7CisgICAgICB1aW50cHRyX3QgSU1hc2sgPSAoKHVpbnRwdHJfdCkxKSA8PCBJOworICAgICAgdWludHB0cl90IE1hc2sgPSBFTWFzayAtIElNYXNrOworICAgICAgc2V0U21hbGxCaXRzKGdldFNtYWxsQml0cygpICYgfk1hc2spOworICAgIH0gZWxzZQorICAgICAgZ2V0UG9pbnRlcigpLT5yZXNldChJLCBFKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBTbWFsbEJpdFZlY3RvciAmZmxpcCgpIHsKKyAgICBpZiAoaXNTbWFsbCgpKQorICAgICAgc2V0U21hbGxCaXRzKH5nZXRTbWFsbEJpdHMoKSk7CisgICAgZWxzZQorICAgICAgZ2V0UG9pbnRlcigpLT5mbGlwKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgU21hbGxCaXRWZWN0b3IgJmZsaXAodW5zaWduZWQgSWR4KSB7CisgICAgaWYgKGlzU21hbGwoKSkKKyAgICAgIHNldFNtYWxsQml0cyhnZXRTbWFsbEJpdHMoKSBeICh1aW50cHRyX3QoMSkgPDwgSWR4KSk7CisgICAgZWxzZQorICAgICAgZ2V0UG9pbnRlcigpLT5mbGlwKElkeCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gTm8gYXJndW1lbnQgZmxpcC4KKyAgU21hbGxCaXRWZWN0b3Igb3BlcmF0b3J+KCkgY29uc3QgeworICAgIHJldHVybiBTbWFsbEJpdFZlY3RvcigqdGhpcykuZmxpcCgpOworICB9CisKKyAgLy8gSW5kZXhpbmcuCisgIHJlZmVyZW5jZSBvcGVyYXRvcltdKHVuc2lnbmVkIElkeCkgeworICAgIGFzc2VydChJZHggPCBzaXplKCkgJiYgIk91dC1vZi1ib3VuZHMgQml0IGFjY2Vzcy4iKTsKKyAgICByZXR1cm4gcmVmZXJlbmNlKCp0aGlzLCBJZHgpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcltdKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIGFzc2VydChJZHggPCBzaXplKCkgJiYgIk91dC1vZi1ib3VuZHMgQml0IGFjY2Vzcy4iKTsKKyAgICBpZiAoaXNTbWFsbCgpKQorICAgICAgcmV0dXJuICgoZ2V0U21hbGxCaXRzKCkgPj4gSWR4KSAmIDEpICE9IDA7CisgICAgcmV0dXJuIGdldFBvaW50ZXIoKS0+b3BlcmF0b3JbXShJZHgpOworICB9CisKKyAgYm9vbCB0ZXN0KHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIHJldHVybiAoKnRoaXMpW0lkeF07CisgIH0KKworICAvLy8gVGVzdCBpZiBhbnkgY29tbW9uIGJpdHMgYXJlIHNldC4KKyAgYm9vbCBhbnlDb21tb24oY29uc3QgU21hbGxCaXRWZWN0b3IgJlJIUykgY29uc3QgeworICAgIGlmIChpc1NtYWxsKCkgJiYgUkhTLmlzU21hbGwoKSkKKyAgICAgIHJldHVybiAoZ2V0U21hbGxCaXRzKCkgJiBSSFMuZ2V0U21hbGxCaXRzKCkpICE9IDA7CisgICAgaWYgKCFpc1NtYWxsKCkgJiYgIVJIUy5pc1NtYWxsKCkpCisgICAgICByZXR1cm4gZ2V0UG9pbnRlcigpLT5hbnlDb21tb24oKlJIUy5nZXRQb2ludGVyKCkpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IHN0ZDo6bWluKHNpemUoKSwgUkhTLnNpemUoKSk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKHRlc3QoaSkgJiYgUkhTLnRlc3QoaSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIENvbXBhcmlzb24gb3BlcmF0b3JzLgorICBib29sIG9wZXJhdG9yPT0oY29uc3QgU21hbGxCaXRWZWN0b3IgJlJIUykgY29uc3QgeworICAgIGlmIChzaXplKCkgIT0gUkhTLnNpemUoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoaXNTbWFsbCgpKQorICAgICAgcmV0dXJuIGdldFNtYWxsQml0cygpID09IFJIUy5nZXRTbWFsbEJpdHMoKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gKmdldFBvaW50ZXIoKSA9PSAqUkhTLmdldFBvaW50ZXIoKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTbWFsbEJpdFZlY3RvciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gUkhTKTsKKyAgfQorCisgIC8vIEludGVyc2VjdGlvbiwgdW5pb24sIGRpc2pvaW50IHVuaW9uLgorICBTbWFsbEJpdFZlY3RvciAmb3BlcmF0b3ImPShjb25zdCBTbWFsbEJpdFZlY3RvciAmUkhTKSB7CisgICAgcmVzaXplKHN0ZDo6bWF4KHNpemUoKSwgUkhTLnNpemUoKSkpOworICAgIGlmIChpc1NtYWxsKCkpCisgICAgICBzZXRTbWFsbEJpdHMoZ2V0U21hbGxCaXRzKCkgJiBSSFMuZ2V0U21hbGxCaXRzKCkpOworICAgIGVsc2UgaWYgKCFSSFMuaXNTbWFsbCgpKQorICAgICAgZ2V0UG9pbnRlcigpLT5vcGVyYXRvciY9KCpSSFMuZ2V0UG9pbnRlcigpKTsKKyAgICBlbHNlIHsKKyAgICAgIFNtYWxsQml0VmVjdG9yIENvcHkgPSBSSFM7CisgICAgICBDb3B5LnJlc2l6ZShzaXplKCkpOworICAgICAgZ2V0UG9pbnRlcigpLT5vcGVyYXRvciY9KCpDb3B5LmdldFBvaW50ZXIoKSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBSZXNldCBiaXRzIHRoYXQgYXJlIHNldCBpbiBSSFMuIFNhbWUgYXMgKnRoaXMgJj0gflJIUy4KKyAgU21hbGxCaXRWZWN0b3IgJnJlc2V0KGNvbnN0IFNtYWxsQml0VmVjdG9yICZSSFMpIHsKKyAgICBpZiAoaXNTbWFsbCgpICYmIFJIUy5pc1NtYWxsKCkpCisgICAgICBzZXRTbWFsbEJpdHMoZ2V0U21hbGxCaXRzKCkgJiB+UkhTLmdldFNtYWxsQml0cygpKTsKKyAgICBlbHNlIGlmICghaXNTbWFsbCgpICYmICFSSFMuaXNTbWFsbCgpKQorICAgICAgZ2V0UG9pbnRlcigpLT5yZXNldCgqUkhTLmdldFBvaW50ZXIoKSk7CisgICAgZWxzZQorICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IHN0ZDo6bWluKHNpemUoKSwgUkhTLnNpemUoKSk7IGkgIT0gZTsgKytpKQorICAgICAgICBpZiAoUkhTLnRlc3QoaSkpCisgICAgICAgICAgcmVzZXQoaSk7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gQ2hlY2sgaWYgKFRoaXMgLSBSSFMpIGlzIHplcm8uIFRoaXMgaXMgdGhlIHNhbWUgYXMgcmVzZXQoUkhTKSBhbmQgYW55KCkuCisgIGJvb2wgdGVzdChjb25zdCBTbWFsbEJpdFZlY3RvciAmUkhTKSBjb25zdCB7CisgICAgaWYgKGlzU21hbGwoKSAmJiBSSFMuaXNTbWFsbCgpKQorICAgICAgcmV0dXJuIChnZXRTbWFsbEJpdHMoKSAmIH5SSFMuZ2V0U21hbGxCaXRzKCkpICE9IDA7CisgICAgaWYgKCFpc1NtYWxsKCkgJiYgIVJIUy5pc1NtYWxsKCkpCisgICAgICByZXR1cm4gZ2V0UG9pbnRlcigpLT50ZXN0KCpSSFMuZ2V0UG9pbnRlcigpKTsKKworICAgIHVuc2lnbmVkIGksIGU7CisgICAgZm9yIChpID0gMCwgZSA9IHN0ZDo6bWluKHNpemUoKSwgUkhTLnNpemUoKSk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKHRlc3QoaSkgJiYgIVJIUy50ZXN0KGkpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGZvciAoZSA9IHNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAodGVzdChpKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBTbWFsbEJpdFZlY3RvciAmb3BlcmF0b3J8PShjb25zdCBTbWFsbEJpdFZlY3RvciAmUkhTKSB7CisgICAgcmVzaXplKHN0ZDo6bWF4KHNpemUoKSwgUkhTLnNpemUoKSkpOworICAgIGlmIChpc1NtYWxsKCkpCisgICAgICBzZXRTbWFsbEJpdHMoZ2V0U21hbGxCaXRzKCkgfCBSSFMuZ2V0U21hbGxCaXRzKCkpOworICAgIGVsc2UgaWYgKCFSSFMuaXNTbWFsbCgpKQorICAgICAgZ2V0UG9pbnRlcigpLT5vcGVyYXRvcnw9KCpSSFMuZ2V0UG9pbnRlcigpKTsKKyAgICBlbHNlIHsKKyAgICAgIFNtYWxsQml0VmVjdG9yIENvcHkgPSBSSFM7CisgICAgICBDb3B5LnJlc2l6ZShzaXplKCkpOworICAgICAgZ2V0UG9pbnRlcigpLT5vcGVyYXRvcnw9KCpDb3B5LmdldFBvaW50ZXIoKSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFNtYWxsQml0VmVjdG9yICZvcGVyYXRvcl49KGNvbnN0IFNtYWxsQml0VmVjdG9yICZSSFMpIHsKKyAgICByZXNpemUoc3RkOjptYXgoc2l6ZSgpLCBSSFMuc2l6ZSgpKSk7CisgICAgaWYgKGlzU21hbGwoKSkKKyAgICAgIHNldFNtYWxsQml0cyhnZXRTbWFsbEJpdHMoKSBeIFJIUy5nZXRTbWFsbEJpdHMoKSk7CisgICAgZWxzZSBpZiAoIVJIUy5pc1NtYWxsKCkpCisgICAgICBnZXRQb2ludGVyKCktPm9wZXJhdG9yXj0oKlJIUy5nZXRQb2ludGVyKCkpOworICAgIGVsc2UgeworICAgICAgU21hbGxCaXRWZWN0b3IgQ29weSA9IFJIUzsKKyAgICAgIENvcHkucmVzaXplKHNpemUoKSk7CisgICAgICBnZXRQb2ludGVyKCktPm9wZXJhdG9yXj0oKkNvcHkuZ2V0UG9pbnRlcigpKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgU21hbGxCaXRWZWN0b3IgJm9wZXJhdG9yPDw9KHVuc2lnbmVkIE4pIHsKKyAgICBpZiAoaXNTbWFsbCgpKQorICAgICAgc2V0U21hbGxCaXRzKGdldFNtYWxsQml0cygpIDw8IE4pOworICAgIGVsc2UKKyAgICAgIGdldFBvaW50ZXIoKS0+b3BlcmF0b3I8PD0oTik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgU21hbGxCaXRWZWN0b3IgJm9wZXJhdG9yPj49KHVuc2lnbmVkIE4pIHsKKyAgICBpZiAoaXNTbWFsbCgpKQorICAgICAgc2V0U21hbGxCaXRzKGdldFNtYWxsQml0cygpID4+IE4pOworICAgIGVsc2UKKyAgICAgIGdldFBvaW50ZXIoKS0+b3BlcmF0b3I+Pj0oTik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gQXNzaWdubWVudCBvcGVyYXRvci4KKyAgY29uc3QgU21hbGxCaXRWZWN0b3IgJm9wZXJhdG9yPShjb25zdCBTbWFsbEJpdFZlY3RvciAmUkhTKSB7CisgICAgaWYgKGlzU21hbGwoKSkgeworICAgICAgaWYgKFJIUy5pc1NtYWxsKCkpCisgICAgICAgIFggPSBSSFMuWDsKKyAgICAgIGVsc2UKKyAgICAgICAgc3dpdGNoVG9MYXJnZShuZXcgQml0VmVjdG9yKCpSSFMuZ2V0UG9pbnRlcigpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmICghUkhTLmlzU21hbGwoKSkKKyAgICAgICAgKmdldFBvaW50ZXIoKSA9ICpSSFMuZ2V0UG9pbnRlcigpOworICAgICAgZWxzZSB7CisgICAgICAgIGRlbGV0ZSBnZXRQb2ludGVyKCk7CisgICAgICAgIFggPSBSSFMuWDsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgU21hbGxCaXRWZWN0b3IgJm9wZXJhdG9yPShTbWFsbEJpdFZlY3RvciAmJlJIUykgeworICAgIGlmICh0aGlzICE9ICZSSFMpIHsKKyAgICAgIGNsZWFyKCk7CisgICAgICBzd2FwKFJIUyk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZvaWQgc3dhcChTbWFsbEJpdFZlY3RvciAmUkhTKSB7CisgICAgc3RkOjpzd2FwKFgsIFJIUy5YKTsKKyAgfQorCisgIC8vLyBBZGQgJzEnIGJpdHMgZnJvbSBNYXNrIHRvIHRoaXMgdmVjdG9yLiBEb24ndCByZXNpemUuCisgIC8vLyBUaGlzIGNvbXB1dGVzICIqdGhpcyB8PSBNYXNrIi4KKyAgdm9pZCBzZXRCaXRzSW5NYXNrKGNvbnN0IHVpbnQzMl90ICpNYXNrLCB1bnNpZ25lZCBNYXNrV29yZHMgPSB+MHUpIHsKKyAgICBpZiAoaXNTbWFsbCgpKQorICAgICAgYXBwbHlNYXNrPHRydWUsIGZhbHNlPihNYXNrLCBNYXNrV29yZHMpOworICAgIGVsc2UKKyAgICAgIGdldFBvaW50ZXIoKS0+c2V0Qml0c0luTWFzayhNYXNrLCBNYXNrV29yZHMpOworICB9CisKKyAgLy8vIENsZWFyIGFueSBiaXRzIGluIHRoaXMgdmVjdG9yIHRoYXQgYXJlIHNldCBpbiBNYXNrLiBEb24ndCByZXNpemUuCisgIC8vLyBUaGlzIGNvbXB1dGVzICIqdGhpcyAmPSB+TWFzayIuCisgIHZvaWQgY2xlYXJCaXRzSW5NYXNrKGNvbnN0IHVpbnQzMl90ICpNYXNrLCB1bnNpZ25lZCBNYXNrV29yZHMgPSB+MHUpIHsKKyAgICBpZiAoaXNTbWFsbCgpKQorICAgICAgYXBwbHlNYXNrPGZhbHNlLCBmYWxzZT4oTWFzaywgTWFza1dvcmRzKTsKKyAgICBlbHNlCisgICAgICBnZXRQb2ludGVyKCktPmNsZWFyQml0c0luTWFzayhNYXNrLCBNYXNrV29yZHMpOworICB9CisKKyAgLy8vIEFkZCBhIGJpdCB0byB0aGlzIHZlY3RvciBmb3IgZXZlcnkgJzAnIGJpdCBpbiBNYXNrLiBEb24ndCByZXNpemUuCisgIC8vLyBUaGlzIGNvbXB1dGVzICIqdGhpcyB8PSB+TWFzayIuCisgIHZvaWQgc2V0Qml0c05vdEluTWFzayhjb25zdCB1aW50MzJfdCAqTWFzaywgdW5zaWduZWQgTWFza1dvcmRzID0gfjB1KSB7CisgICAgaWYgKGlzU21hbGwoKSkKKyAgICAgIGFwcGx5TWFzazx0cnVlLCB0cnVlPihNYXNrLCBNYXNrV29yZHMpOworICAgIGVsc2UKKyAgICAgIGdldFBvaW50ZXIoKS0+c2V0Qml0c05vdEluTWFzayhNYXNrLCBNYXNrV29yZHMpOworICB9CisKKyAgLy8vIENsZWFyIGEgYml0IGluIHRoaXMgdmVjdG9yIGZvciBldmVyeSAnMCcgYml0IGluIE1hc2suIERvbid0IHJlc2l6ZS4KKyAgLy8vIFRoaXMgY29tcHV0ZXMgIip0aGlzICY9IE1hc2siLgorICB2b2lkIGNsZWFyQml0c05vdEluTWFzayhjb25zdCB1aW50MzJfdCAqTWFzaywgdW5zaWduZWQgTWFza1dvcmRzID0gfjB1KSB7CisgICAgaWYgKGlzU21hbGwoKSkKKyAgICAgIGFwcGx5TWFzazxmYWxzZSwgdHJ1ZT4oTWFzaywgTWFza1dvcmRzKTsKKyAgICBlbHNlCisgICAgICBnZXRQb2ludGVyKCktPmNsZWFyQml0c05vdEluTWFzayhNYXNrLCBNYXNrV29yZHMpOworICB9CisKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDxib29sIEFkZEJpdHMsIGJvb2wgSW52ZXJ0TWFzaz4KKyAgdm9pZCBhcHBseU1hc2soY29uc3QgdWludDMyX3QgKk1hc2ssIHVuc2lnbmVkIE1hc2tXb3JkcykgeworICAgIGFzc2VydChNYXNrV29yZHMgPD0gc2l6ZW9mKHVpbnRwdHJfdCkgJiYgIk1hc2sgaXMgbGFyZ2VyIHRoYW4gYmFzZSEiKTsKKyAgICB1aW50cHRyX3QgTSA9IE1hc2tbMF07CisgICAgaWYgKE51bUJhc2VCaXRzID09IDY0KQorICAgICAgTSB8PSB1aW50NjRfdChNYXNrWzFdKSA8PCAzMjsKKyAgICBpZiAoSW52ZXJ0TWFzaykKKyAgICAgIE0gPSB+TTsKKyAgICBpZiAoQWRkQml0cykKKyAgICAgIHNldFNtYWxsQml0cyhnZXRTbWFsbEJpdHMoKSB8IE0pOworICAgIGVsc2UKKyAgICAgIHNldFNtYWxsQml0cyhnZXRTbWFsbEJpdHMoKSAmIH5NKTsKKyAgfQorfTsKKworaW5saW5lIFNtYWxsQml0VmVjdG9yCitvcGVyYXRvciYoY29uc3QgU21hbGxCaXRWZWN0b3IgJkxIUywgY29uc3QgU21hbGxCaXRWZWN0b3IgJlJIUykgeworICBTbWFsbEJpdFZlY3RvciBSZXN1bHQoTEhTKTsKKyAgUmVzdWx0ICY9IFJIUzsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworaW5saW5lIFNtYWxsQml0VmVjdG9yCitvcGVyYXRvcnwoY29uc3QgU21hbGxCaXRWZWN0b3IgJkxIUywgY29uc3QgU21hbGxCaXRWZWN0b3IgJlJIUykgeworICBTbWFsbEJpdFZlY3RvciBSZXN1bHQoTEhTKTsKKyAgUmVzdWx0IHw9IFJIUzsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworaW5saW5lIFNtYWxsQml0VmVjdG9yCitvcGVyYXRvcl4oY29uc3QgU21hbGxCaXRWZWN0b3IgJkxIUywgY29uc3QgU21hbGxCaXRWZWN0b3IgJlJIUykgeworICBTbWFsbEJpdFZlY3RvciBSZXN1bHQoTEhTKTsKKyAgUmVzdWx0IF49IFJIUzsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworbmFtZXNwYWNlIHN0ZCB7CisKKy8vLyBJbXBsZW1lbnQgc3RkOjpzd2FwIGluIHRlcm1zIG9mIEJpdFZlY3RvciBzd2FwLgoraW5saW5lIHZvaWQKK3N3YXAobGx2bTo6U21hbGxCaXRWZWN0b3IgJkxIUywgbGx2bTo6U21hbGxCaXRWZWN0b3IgJlJIUykgeworICBMSFMuc3dhcChSSFMpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9TTUFMTEJJVFZFQ1RPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFB0clNldC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxQdHJTZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OGVhNjEzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxQdHJTZXQuaApAQCAtMCwwICsxLDQ4NiBAQAorLy89PT0tIGxsdm0vQURUL1NtYWxsUHRyU2V0LmggLSAnTm9ybWFsbHkgc21hbGwnIHBvaW50ZXIgc2V0IC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgU21hbGxQdHJTZXQgY2xhc3MuICBTZWUgdGhlIGRveHlnZW4gY29tbWVudCBmb3IKKy8vIFNtYWxsUHRyU2V0SW1wbEJhc2UgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgYWxnb3JpdGhtIHVzZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9TTUFMTFBUUlNFVF9ICisjZGVmaW5lIExMVk1fQURUX1NNQUxMUFRSU0VUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0Vwb2NoVHJhY2tlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9SZXZlcnNlSXRlcmF0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFNtYWxsUHRyU2V0SW1wbEJhc2UgLSBUaGlzIGlzIHRoZSBjb21tb24gY29kZSBzaGFyZWQgYW1vbmcgYWxsIHRoZQorLy8vIFNtYWxsUHRyU2V0PD4ncywgd2hpY2ggaXMgYWxtb3N0IGV2ZXJ5dGhpbmcuICBTbWFsbFB0clNldCBoYXMgdHdvIG1vZGVzLCBvbmUKKy8vLyBmb3Igc21hbGwgYW5kIG9uZSBmb3IgbGFyZ2Ugc2V0cy4KKy8vLworLy8vIFNtYWxsIHNldHMgdXNlIGFuIGFycmF5IG9mIHBvaW50ZXJzIGFsbG9jYXRlZCBpbiB0aGUgU21hbGxQdHJTZXQgb2JqZWN0LAorLy8vIHdoaWNoIGlzIHRyZWF0ZWQgYXMgYSBzaW1wbGUgYXJyYXkgb2YgcG9pbnRlcnMuICBXaGVuIGEgcG9pbnRlciBpcyBhZGRlZCB0bworLy8vIHRoZSBzZXQsIHRoZSBhcnJheSBpcyBzY2FubmVkIHRvIHNlZSBpZiB0aGUgZWxlbWVudCBhbHJlYWR5IGV4aXN0cywgaWYgbm90CisvLy8gdGhlIGVsZW1lbnQgaXMgJ3B1c2hlZCBiYWNrJyBvbnRvIHRoZSBhcnJheS4gIElmIHdlIHJ1biBvdXQgb2Ygc3BhY2UgaW4gdGhlCisvLy8gYXJyYXksIHdlIGdyb3cgaW50byB0aGUgJ2xhcmdlIHNldCcgY2FzZS4gIFNtYWxsU2V0IHNob3VsZCBiZSB1c2VkIHdoZW4gdGhlCisvLy8gc2V0cyBhcmUgb2Z0ZW4gc21hbGwuICBJbiB0aGlzIGNhc2UsIG5vIG1lbW9yeSBhbGxvY2F0aW9uIGlzIHVzZWQsIGFuZCBvbmx5CisvLy8gbGlnaHQtd2VpZ2h0IGFuZCBjYWNoZS1lZmZpY2llbnQgc2Nhbm5pbmcgaXMgdXNlZC4KKy8vLworLy8vIExhcmdlIHNldHMgdXNlIGEgY2xhc3NpYyBleHBvbmVudGlhbGx5LXByb2JlZCBoYXNoIHRhYmxlLiAgRW1wdHkgYnVja2V0cyBhcmUKKy8vLyByZXByZXNlbnRlZCB3aXRoIGFuIGlsbGVnYWwgcG9pbnRlciB2YWx1ZSAoLTEpIHRvIGFsbG93IG51bGwgcG9pbnRlcnMgdG8gYmUKKy8vLyBpbnNlcnRlZC4gIFRvbWJzdG9uZXMgYXJlIHJlcHJlc2VudGVkIHdpdGggYW5vdGhlciBpbGxlZ2FsIHBvaW50ZXIgdmFsdWUKKy8vLyAoLTIpLCB0byBhbGxvdyBkZWxldGlvbi4gIFRoZSBoYXNoIHRhYmxlIGlzIHJlc2l6ZWQgd2hlbiB0aGUgdGFibGUgaXMgMy80IG9yCisvLy8gbW9yZS4gIFdoZW4gdGhpcyBoYXBwZW5zLCB0aGUgdGFibGUgaXMgZG91YmxlZCBpbiBzaXplLgorLy8vCitjbGFzcyBTbWFsbFB0clNldEltcGxCYXNlIDogcHVibGljIERlYnVnRXBvY2hCYXNlIHsKKyAgZnJpZW5kIGNsYXNzIFNtYWxsUHRyU2V0SXRlcmF0b3JJbXBsOworCitwcm90ZWN0ZWQ6CisgIC8vLyBTbWFsbEFycmF5IC0gUG9pbnRzIHRvIGEgZml4ZWQgc2l6ZSBzZXQgb2YgYnVja2V0cywgdXNlZCBpbiAnc21hbGwgbW9kZScuCisgIGNvbnN0IHZvaWQgKipTbWFsbEFycmF5OworICAvLy8gQ3VyQXJyYXkgLSBUaGlzIGlzIHRoZSBjdXJyZW50IHNldCBvZiBidWNrZXRzLiAgSWYgZXF1YWwgdG8gU21hbGxBcnJheSwKKyAgLy8vIHRoZW4gdGhlIHNldCBpcyBpbiAnc21hbGwgbW9kZScuCisgIGNvbnN0IHZvaWQgKipDdXJBcnJheTsKKyAgLy8vIEN1ckFycmF5U2l6ZSAtIFRoZSBhbGxvY2F0ZWQgc2l6ZSBvZiBDdXJBcnJheSwgYWx3YXlzIGEgcG93ZXIgb2YgdHdvLgorICB1bnNpZ25lZCBDdXJBcnJheVNpemU7CisKKyAgLy8vIE51bWJlciBvZiBlbGVtZW50cyBpbiBDdXJBcnJheSB0aGF0IGNvbnRhaW4gYSB2YWx1ZSBvciBhcmUgYSB0b21ic3RvbmUuCisgIC8vLyBJZiBzbWFsbCwgYWxsIHRoZXNlIGVsZW1lbnRzIGFyZSBhdCB0aGUgYmVnaW5uaW5nIG9mIEN1ckFycmF5IGFuZCB0aGUgcmVzdAorICAvLy8gaXMgdW5pbml0aWFsaXplZC4KKyAgdW5zaWduZWQgTnVtTm9uRW1wdHk7CisgIC8vLyBOdW1iZXIgb2YgdG9tYnN0b25lcyBpbiBDdXJBcnJheS4KKyAgdW5zaWduZWQgTnVtVG9tYnN0b25lczsKKworICAvLyBIZWxwZXJzIHRvIGNvcHkgYW5kIG1vdmUgY29uc3RydWN0IGEgU21hbGxQdHJTZXQuCisgIFNtYWxsUHRyU2V0SW1wbEJhc2UoY29uc3Qgdm9pZCAqKlNtYWxsU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFB0clNldEltcGxCYXNlICZ0aGF0KTsKKyAgU21hbGxQdHJTZXRJbXBsQmFzZShjb25zdCB2b2lkICoqU21hbGxTdG9yYWdlLCB1bnNpZ25lZCBTbWFsbFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXRJbXBsQmFzZSAmJnRoYXQpOworCisgIGV4cGxpY2l0IFNtYWxsUHRyU2V0SW1wbEJhc2UoY29uc3Qgdm9pZCAqKlNtYWxsU3RvcmFnZSwgdW5zaWduZWQgU21hbGxTaXplKQorICAgICAgOiBTbWFsbEFycmF5KFNtYWxsU3RvcmFnZSksIEN1ckFycmF5KFNtYWxsU3RvcmFnZSksCisgICAgICAgIEN1ckFycmF5U2l6ZShTbWFsbFNpemUpLCBOdW1Ob25FbXB0eSgwKSwgTnVtVG9tYnN0b25lcygwKSB7CisgICAgYXNzZXJ0KFNtYWxsU2l6ZSAmJiAoU21hbGxTaXplICYgKFNtYWxsU2l6ZS0xKSkgPT0gMCAmJgorICAgICAgICAgICAiSW5pdGlhbCBzaXplIG11c3QgYmUgYSBwb3dlciBvZiB0d28hIik7CisgIH0KKworICB+U21hbGxQdHJTZXRJbXBsQmFzZSgpIHsKKyAgICBpZiAoIWlzU21hbGwoKSkKKyAgICAgIGZyZWUoQ3VyQXJyYXkpOworICB9CisKK3B1YmxpYzoKKyAgdXNpbmcgc2l6ZV90eXBlID0gdW5zaWduZWQ7CisKKyAgU21hbGxQdHJTZXRJbXBsQmFzZSAmb3BlcmF0b3I9KGNvbnN0IFNtYWxsUHRyU2V0SW1wbEJhc2UgJikgPSBkZWxldGU7CisKKyAgTExWTV9OT0RJU0NBUkQgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHNpemUoKSA9PSAwOyB9CisgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gTnVtTm9uRW1wdHkgLSBOdW1Ub21ic3RvbmVzOyB9CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBpbmNyZW1lbnRFcG9jaCgpOworICAgIC8vIElmIHRoZSBjYXBhY2l0eSBvZiB0aGUgYXJyYXkgaXMgaHVnZSwgYW5kIHRoZSAjIGVsZW1lbnRzIHVzZWQgaXMgc21hbGwsCisgICAgLy8gc2hyaW5rIHRoZSBhcnJheS4KKyAgICBpZiAoIWlzU21hbGwoKSkgeworICAgICAgaWYgKHNpemUoKSAqIDQgPCBDdXJBcnJheVNpemUgJiYgQ3VyQXJyYXlTaXplID4gMzIpCisgICAgICAgIHJldHVybiBzaHJpbmtfYW5kX2NsZWFyKCk7CisgICAgICAvLyBGaWxsIHRoZSBhcnJheSB3aXRoIGVtcHR5IG1hcmtlcnMuCisgICAgICBtZW1zZXQoQ3VyQXJyYXksIC0xLCBDdXJBcnJheVNpemUgKiBzaXplb2Yodm9pZCAqKSk7CisgICAgfQorCisgICAgTnVtTm9uRW1wdHkgPSAwOworICAgIE51bVRvbWJzdG9uZXMgPSAwOworICB9CisKK3Byb3RlY3RlZDoKKyAgc3RhdGljIHZvaWQgKmdldFRvbWJzdG9uZU1hcmtlcigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KC0yKTsgfQorCisgIHN0YXRpYyB2b2lkICpnZXRFbXB0eU1hcmtlcigpIHsKKyAgICAvLyBOb3RlIHRoYXQgLTEgaXMgY2hvc2VuIHRvIG1ha2UgY2xlYXIoKSBlZmZpY2llbnRseSBpbXBsZW1lbnRhYmxlIHdpdGgKKyAgICAvLyBtZW1zZXQgYW5kIGJlY2F1c2UgaXQncyBub3QgYSB2YWxpZCBwb2ludGVyIHZhbHVlLgorICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQqPigtMSk7CisgIH0KKworICBjb25zdCB2b2lkICoqRW5kUG9pbnRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNTbWFsbCgpID8gQ3VyQXJyYXkgKyBOdW1Ob25FbXB0eSA6IEN1ckFycmF5ICsgQ3VyQXJyYXlTaXplOworICB9CisKKyAgLy8vIGluc2VydF9pbXAgLSBUaGlzIHJldHVybnMgdHJ1ZSBpZiB0aGUgcG9pbnRlciB3YXMgbmV3IHRvIHRoZSBzZXQsIGZhbHNlIGlmCisgIC8vLyBpdCB3YXMgYWxyZWFkeSBpbiB0aGUgc2V0LiAgVGhpcyBpcyBoaWRkZW4gZnJvbSB0aGUgY2xpZW50IHNvIHRoYXQgdGhlCisgIC8vLyBkZXJpdmVkIGNsYXNzIGNhbiBjaGVjayB0aGF0IHRoZSByaWdodCB0eXBlIG9mIHBvaW50ZXIgaXMgcGFzc2VkIGluLgorICBzdGQ6OnBhaXI8Y29uc3Qgdm9pZCAqY29uc3QgKiwgYm9vbD4gaW5zZXJ0X2ltcChjb25zdCB2b2lkICpQdHIpIHsKKyAgICBpZiAoaXNTbWFsbCgpKSB7CisgICAgICAvLyBDaGVjayB0byBzZWUgaWYgaXQgaXMgYWxyZWFkeSBpbiB0aGUgc2V0LgorICAgICAgY29uc3Qgdm9pZCAqKkxhc3RUb21ic3RvbmUgPSBudWxscHRyOworICAgICAgZm9yIChjb25zdCB2b2lkICoqQVB0ciA9IFNtYWxsQXJyYXksICoqRSA9IFNtYWxsQXJyYXkgKyBOdW1Ob25FbXB0eTsKKyAgICAgICAgICAgQVB0ciAhPSBFOyArK0FQdHIpIHsKKyAgICAgICAgY29uc3Qgdm9pZCAqVmFsdWUgPSAqQVB0cjsKKyAgICAgICAgaWYgKFZhbHVlID09IFB0cikKKyAgICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoQVB0ciwgZmFsc2UpOworICAgICAgICBpZiAoVmFsdWUgPT0gZ2V0VG9tYnN0b25lTWFya2VyKCkpCisgICAgICAgICAgTGFzdFRvbWJzdG9uZSA9IEFQdHI7CisgICAgICB9CisKKyAgICAgIC8vIERpZCB3ZSBmaW5kIGFueSB0b21ic3RvbmUgbWFya2VyPworICAgICAgaWYgKExhc3RUb21ic3RvbmUgIT0gbnVsbHB0cikgeworICAgICAgICAqTGFzdFRvbWJzdG9uZSA9IFB0cjsKKyAgICAgICAgLS1OdW1Ub21ic3RvbmVzOworICAgICAgICBpbmNyZW1lbnRFcG9jaCgpOworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoTGFzdFRvbWJzdG9uZSwgdHJ1ZSk7CisgICAgICB9CisKKyAgICAgIC8vIE5vcGUsIHRoZXJlIGlzbid0LiAgSWYgd2Ugc3RheSBzbWFsbCwganVzdCAncHVzaGJhY2snIG5vdy4KKyAgICAgIGlmIChOdW1Ob25FbXB0eSA8IEN1ckFycmF5U2l6ZSkgeworICAgICAgICBTbWFsbEFycmF5W051bU5vbkVtcHR5KytdID0gUHRyOworICAgICAgICBpbmNyZW1lbnRFcG9jaCgpOworICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoU21hbGxBcnJheSArIChOdW1Ob25FbXB0eSAtIDEpLCB0cnVlKTsKKyAgICAgIH0KKyAgICAgIC8vIE90aGVyd2lzZSwgaGl0IHRoZSBiaWcgc2V0IGNhc2UsIHdoaWNoIHdpbGwgY2FsbCBncm93LgorICAgIH0KKyAgICByZXR1cm4gaW5zZXJ0X2ltcF9iaWcoUHRyKTsKKyAgfQorCisgIC8vLyBlcmFzZV9pbXAgLSBJZiB0aGUgc2V0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgcG9pbnRlciwgcmVtb3ZlIGl0IGFuZAorICAvLy8gcmV0dXJuIHRydWUsIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuICBUaGlzIGlzIGhpZGRlbiBmcm9tIHRoZSBjbGllbnQgc28KKyAgLy8vIHRoYXQgdGhlIGRlcml2ZWQgY2xhc3MgY2FuIGNoZWNrIHRoYXQgdGhlIHJpZ2h0IHR5cGUgb2YgcG9pbnRlciBpcyBwYXNzZWQKKyAgLy8vIGluLgorICBib29sIGVyYXNlX2ltcChjb25zdCB2b2lkICogUHRyKSB7CisgICAgY29uc3Qgdm9pZCAqY29uc3QgKlAgPSBmaW5kX2ltcChQdHIpOworICAgIGlmIChQID09IEVuZFBvaW50ZXIoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGNvbnN0IHZvaWQgKipMb2MgPSBjb25zdF9jYXN0PGNvbnN0IHZvaWQgKio+KFApOworICAgIGFzc2VydCgqTG9jID09IFB0ciAmJiAiYnJva2VuIGZpbmQhIik7CisgICAgKkxvYyA9IGdldFRvbWJzdG9uZU1hcmtlcigpOworICAgIE51bVRvbWJzdG9uZXMrKzsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSByYXcgcG9pbnRlciBuZWVkZWQgdG8gY29uc3RydWN0IGFuIGl0ZXJhdG9yLiAgSWYgZWxlbWVudCBub3QKKyAgLy8vIGZvdW5kLCB0aGlzIHdpbGwgYmUgRW5kUG9pbnRlci4gIE90aGVyd2lzZSwgaXQgd2lsbCBiZSBhIHBvaW50ZXIgdG8gdGhlCisgIC8vLyBzbG90IHdoaWNoIHN0b3JlcyBQdHI7CisgIGNvbnN0IHZvaWQgKmNvbnN0ICogZmluZF9pbXAoY29uc3Qgdm9pZCAqIFB0cikgY29uc3QgeworICAgIGlmIChpc1NtYWxsKCkpIHsKKyAgICAgIC8vIExpbmVhciBzZWFyY2ggZm9yIHRoZSBpdGVtLgorICAgICAgZm9yIChjb25zdCB2b2lkICpjb25zdCAqQVB0ciA9IFNtYWxsQXJyYXksCisgICAgICAgICAgICAgICAgICAgICAgKmNvbnN0ICpFID0gU21hbGxBcnJheSArIE51bU5vbkVtcHR5OyBBUHRyICE9IEU7ICsrQVB0cikKKyAgICAgICAgaWYgKCpBUHRyID09IFB0cikKKyAgICAgICAgICByZXR1cm4gQVB0cjsKKyAgICAgIHJldHVybiBFbmRQb2ludGVyKCk7CisgICAgfQorCisgICAgLy8gQmlnIHNldCBjYXNlLgorICAgIGF1dG8gKkJ1Y2tldCA9IEZpbmRCdWNrZXRGb3IoUHRyKTsKKyAgICBpZiAoKkJ1Y2tldCA9PSBQdHIpCisgICAgICByZXR1cm4gQnVja2V0OworICAgIHJldHVybiBFbmRQb2ludGVyKCk7CisgIH0KKworcHJpdmF0ZToKKyAgYm9vbCBpc1NtYWxsKCkgY29uc3QgeyByZXR1cm4gQ3VyQXJyYXkgPT0gU21hbGxBcnJheTsgfQorCisgIHN0ZDo6cGFpcjxjb25zdCB2b2lkICpjb25zdCAqLCBib29sPiBpbnNlcnRfaW1wX2JpZyhjb25zdCB2b2lkICpQdHIpOworCisgIGNvbnN0IHZvaWQgKiBjb25zdCAqRmluZEJ1Y2tldEZvcihjb25zdCB2b2lkICpQdHIpIGNvbnN0OworICB2b2lkIHNocmlua19hbmRfY2xlYXIoKTsKKworICAvLy8gR3JvdyAtIEFsbG9jYXRlIGEgbGFyZ2VyIGJhY2tpbmcgc3RvcmUgZm9yIHRoZSBidWNrZXRzIGFuZCBtb3ZlIGl0IG92ZXIuCisgIHZvaWQgR3Jvdyh1bnNpZ25lZCBOZXdTaXplKTsKKworcHJvdGVjdGVkOgorICAvLy8gc3dhcCAtIFN3YXBzIHRoZSBlbGVtZW50cyBvZiB0d28gc2V0cy4KKyAgLy8vIE5vdGU6IFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCBib3RoIHNldHMgaGF2ZSB0aGUgc2FtZSBzbWFsbCBzaXplLgorICB2b2lkIHN3YXAoU21hbGxQdHJTZXRJbXBsQmFzZSAmUkhTKTsKKworICB2b2lkIENvcHlGcm9tKGNvbnN0IFNtYWxsUHRyU2V0SW1wbEJhc2UgJlJIUyk7CisgIHZvaWQgTW92ZUZyb20odW5zaWduZWQgU21hbGxTaXplLCBTbWFsbFB0clNldEltcGxCYXNlICYmUkhTKTsKKworcHJpdmF0ZToKKyAgLy8vIENvZGUgc2hhcmVkIGJ5IE1vdmVGcm9tKCkgYW5kIG1vdmUgY29uc3RydWN0b3IuCisgIHZvaWQgTW92ZUhlbHBlcih1bnNpZ25lZCBTbWFsbFNpemUsIFNtYWxsUHRyU2V0SW1wbEJhc2UgJiZSSFMpOworICAvLy8gQ29kZSBzaGFyZWQgYnkgQ29weUZyb20oKSBhbmQgY29weSBjb25zdHJ1Y3Rvci4KKyAgdm9pZCBDb3B5SGVscGVyKGNvbnN0IFNtYWxsUHRyU2V0SW1wbEJhc2UgJlJIUyk7Cit9OworCisvLy8gU21hbGxQdHJTZXRJdGVyYXRvckltcGwgLSBUaGlzIGlzIHRoZSBjb21tb24gYmFzZSBjbGFzcyBzaGFyZWQgYmV0d2VlbiBhbGwKKy8vLyBpbnN0YW5jZXMgb2YgU21hbGxQdHJTZXRJdGVyYXRvci4KK2NsYXNzIFNtYWxsUHRyU2V0SXRlcmF0b3JJbXBsIHsKK3Byb3RlY3RlZDoKKyAgY29uc3Qgdm9pZCAqY29uc3QgKkJ1Y2tldDsKKyAgY29uc3Qgdm9pZCAqY29uc3QgKkVuZDsKKworcHVibGljOgorICBleHBsaWNpdCBTbWFsbFB0clNldEl0ZXJhdG9ySW1wbChjb25zdCB2b2lkICpjb25zdCAqQlAsIGNvbnN0IHZvaWQqY29uc3QgKkUpCisgICAgOiBCdWNrZXQoQlApLCBFbmQoRSkgeworICAgIGlmIChzaG91bGRSZXZlcnNlSXRlcmF0ZSgpKSB7CisgICAgICBSZXRyZWF0SWZOb3RWYWxpZCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBBZHZhbmNlSWZOb3RWYWxpZCgpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNtYWxsUHRyU2V0SXRlcmF0b3JJbXBsICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQnVja2V0ID09IFJIUy5CdWNrZXQ7CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNtYWxsUHRyU2V0SXRlcmF0b3JJbXBsICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQnVja2V0ICE9IFJIUy5CdWNrZXQ7CisgIH0KKworcHJvdGVjdGVkOgorICAvLy8gQWR2YW5jZUlmTm90VmFsaWQgLSBJZiB0aGUgY3VycmVudCBidWNrZXQgaXNuJ3QgdmFsaWQsIGFkdmFuY2UgdG8gYSBidWNrZXQKKyAgLy8vIHRoYXQgaXMuICAgVGhpcyBpcyBndWFyYW50ZWVkIHRvIHN0b3AgYmVjYXVzZSB0aGUgZW5kKCkgYnVja2V0IGlzIG1hcmtlZAorICAvLy8gdmFsaWQuCisgIHZvaWQgQWR2YW5jZUlmTm90VmFsaWQoKSB7CisgICAgYXNzZXJ0KEJ1Y2tldCA8PSBFbmQpOworICAgIHdoaWxlIChCdWNrZXQgIT0gRW5kICYmCisgICAgICAgICAgICgqQnVja2V0ID09IFNtYWxsUHRyU2V0SW1wbEJhc2U6OmdldEVtcHR5TWFya2VyKCkgfHwKKyAgICAgICAgICAgICpCdWNrZXQgPT0gU21hbGxQdHJTZXRJbXBsQmFzZTo6Z2V0VG9tYnN0b25lTWFya2VyKCkpKQorICAgICAgKytCdWNrZXQ7CisgIH0KKyAgdm9pZCBSZXRyZWF0SWZOb3RWYWxpZCgpIHsKKyAgICBhc3NlcnQoQnVja2V0ID49IEVuZCk7CisgICAgd2hpbGUgKEJ1Y2tldCAhPSBFbmQgJiYKKyAgICAgICAgICAgKEJ1Y2tldFstMV0gPT0gU21hbGxQdHJTZXRJbXBsQmFzZTo6Z2V0RW1wdHlNYXJrZXIoKSB8fAorICAgICAgICAgICAgQnVja2V0Wy0xXSA9PSBTbWFsbFB0clNldEltcGxCYXNlOjpnZXRUb21ic3RvbmVNYXJrZXIoKSkpIHsKKyAgICAgIC0tQnVja2V0OworICAgIH0KKyAgfQorfTsKKworLy8vIFNtYWxsUHRyU2V0SXRlcmF0b3IgLSBUaGlzIGltcGxlbWVudHMgYSBjb25zdF9pdGVyYXRvciBmb3IgU21hbGxQdHJTZXQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUHRyVHk+CitjbGFzcyBTbWFsbFB0clNldEl0ZXJhdG9yIDogcHVibGljIFNtYWxsUHRyU2V0SXRlcmF0b3JJbXBsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnRXBvY2hCYXNlOjpIYW5kbGVCYXNlIHsKKyAgdXNpbmcgUHRyVHJhaXRzID0gUG9pbnRlckxpa2VUeXBlVHJhaXRzPFB0clR5PjsKKworcHVibGljOgorICB1c2luZyB2YWx1ZV90eXBlID0gUHRyVHk7CisgIHVzaW5nIHJlZmVyZW5jZSA9IFB0clR5OworICB1c2luZyBwb2ludGVyID0gUHRyVHk7CisgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IHN0ZDo6cHRyZGlmZl90OworICB1c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWc7CisKKyAgZXhwbGljaXQgU21hbGxQdHJTZXRJdGVyYXRvcihjb25zdCB2b2lkICpjb25zdCAqQlAsIGNvbnN0IHZvaWQgKmNvbnN0ICpFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnRXBvY2hCYXNlICZFcG9jaCkKKyAgICAgIDogU21hbGxQdHJTZXRJdGVyYXRvckltcGwoQlAsIEUpLCBEZWJ1Z0Vwb2NoQmFzZTo6SGFuZGxlQmFzZSgmRXBvY2gpIHt9CisKKyAgLy8gTW9zdCBtZXRob2RzIHByb3ZpZGVkIGJ5IGJhc2VjbGFzcy4KKworICBjb25zdCBQdHJUeSBvcGVyYXRvciooKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzSGFuZGxlSW5TeW5jKCkgJiYgImludmFsaWQgaXRlcmF0b3IgYWNjZXNzISIpOworICAgIGlmIChzaG91bGRSZXZlcnNlSXRlcmF0ZSgpKSB7CisgICAgICBhc3NlcnQoQnVja2V0ID4gRW5kKTsKKyAgICAgIHJldHVybiBQdHJUcmFpdHM6OmdldEZyb21Wb2lkUG9pbnRlcihjb25zdF9jYXN0PHZvaWQgKj4oQnVja2V0Wy0xXSkpOworICAgIH0KKyAgICBhc3NlcnQoQnVja2V0IDwgRW5kKTsKKyAgICByZXR1cm4gUHRyVHJhaXRzOjpnZXRGcm9tVm9pZFBvaW50ZXIoY29uc3RfY2FzdDx2b2lkKj4oKkJ1Y2tldCkpOworICB9CisKKyAgaW5saW5lIFNtYWxsUHRyU2V0SXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7ICAgICAgICAgIC8vIFByZWluY3JlbWVudAorICAgIGFzc2VydChpc0hhbmRsZUluU3luYygpICYmICJpbnZhbGlkIGl0ZXJhdG9yIGFjY2VzcyEiKTsKKyAgICBpZiAoc2hvdWxkUmV2ZXJzZUl0ZXJhdGUoKSkgeworICAgICAgLS1CdWNrZXQ7CisgICAgICBSZXRyZWF0SWZOb3RWYWxpZCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICArK0J1Y2tldDsKKyAgICBBZHZhbmNlSWZOb3RWYWxpZCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFNtYWxsUHRyU2V0SXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgICAgICAgIC8vIFBvc3RpbmNyZW1lbnQKKyAgICBTbWFsbFB0clNldEl0ZXJhdG9yIHRtcCA9ICp0aGlzOworICAgICsrKnRoaXM7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorfTsKKworLy8vIFJvdW5kVXBUb1Bvd2VyT2ZUd28gLSBUaGlzIGlzIGEgaGVscGVyIHRlbXBsYXRlIHRoYXQgcm91bmRzIE4gdXAgdG8gdGhlIG5leHQKKy8vLyBwb3dlciBvZiB0d28gKHdoaWNoIG1lYW5zIE4gaXRzZWxmIGlmIE4gaXMgYWxyZWFkeSBhIHBvd2VyIG9mIHR3bykuCit0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorc3RydWN0IFJvdW5kVXBUb1Bvd2VyT2ZUd287CisKKy8vLyBSb3VuZFVwVG9Qb3dlck9mVHdvSCAtIElmIE4gaXMgbm90IGEgcG93ZXIgb2YgdHdvLCBpbmNyZWFzZSBpdC4gIFRoaXMgaXMgYQorLy8vIGhlbHBlciB0ZW1wbGF0ZSB1c2VkIHRvIGltcGxlbWVudCBSb3VuZFVwVG9Qb3dlck9mVHdvLgordGVtcGxhdGU8dW5zaWduZWQgTiwgYm9vbCBpc1Bvd2VyVHdvPgorc3RydWN0IFJvdW5kVXBUb1Bvd2VyT2ZUd29IIHsKKyAgZW51bSB7IFZhbCA9IE4gfTsKK307Cit0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorc3RydWN0IFJvdW5kVXBUb1Bvd2VyT2ZUd29IPE4sIGZhbHNlPiB7CisgIGVudW0geworICAgIC8vIFdlIGNvdWxkIGp1c3QgdXNlIE5leHRWYWwgPSBOKzEsIGJ1dCB0aGlzIGNvbnZlcmdlcyBmYXN0ZXIuICBOfChOLTEpIHNldHMKKyAgICAvLyB0aGUgcmlnaHQtbW9zdCB6ZXJvIGJpdHMgdG8gb25lIGFsbCBhdCBvbmNlLCBlLmcuIDBiMDAxMTAwMCAtPiAwYjAwMTExMTEuCisgICAgVmFsID0gUm91bmRVcFRvUG93ZXJPZlR3bzwoTnwoTi0xKSkgKyAxPjo6VmFsCisgIH07Cit9OworCit0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorc3RydWN0IFJvdW5kVXBUb1Bvd2VyT2ZUd28geworICBlbnVtIHsgVmFsID0gUm91bmRVcFRvUG93ZXJPZlR3b0g8TiwgKE4mKE4tMSkpID09IDA+OjpWYWwgfTsKK307CisKKy8vLyBcYnJpZWYgQSB0ZW1wbGF0ZWQgYmFzZSBjbGFzcyBmb3IgXGMgU21hbGxQdHJTZXQgd2hpY2ggcHJvdmlkZXMgdGhlCisvLy8gdHlwZXNhZmUgaW50ZXJmYWNlIHRoYXQgaXMgY29tbW9uIGFjcm9zcyBhbGwgc21hbGwgc2l6ZXMuCisvLy8KKy8vLyBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHBhc3NpbmcgYXJvdW5kIGJldHdlZW4gaW50ZXJmYWNlIGJvdW5kYXJpZXMKKy8vLyB0byBhdm9pZCBlbmNvZGluZyBhIHBhcnRpY3VsYXIgc21hbGwgc2l6ZSBpbiB0aGUgaW50ZXJmYWNlIGJvdW5kYXJ5LgordGVtcGxhdGUgPHR5cGVuYW1lIFB0clR5cGU+CitjbGFzcyBTbWFsbFB0clNldEltcGwgOiBwdWJsaWMgU21hbGxQdHJTZXRJbXBsQmFzZSB7CisgIHVzaW5nIENvbnN0UHRyVHlwZSA9IHR5cGVuYW1lIGFkZF9jb25zdF9wYXN0X3BvaW50ZXI8UHRyVHlwZT46OnR5cGU7CisgIHVzaW5nIFB0clRyYWl0cyA9IFBvaW50ZXJMaWtlVHlwZVRyYWl0czxQdHJUeXBlPjsKKyAgdXNpbmcgQ29uc3RQdHJUcmFpdHMgPSBQb2ludGVyTGlrZVR5cGVUcmFpdHM8Q29uc3RQdHJUeXBlPjsKKworcHJvdGVjdGVkOgorICAvLyBDb25zdHJ1Y3RvcnMgdGhhdCBmb3J3YXJkIHRvIHRoZSBiYXNlLgorICBTbWFsbFB0clNldEltcGwoY29uc3Qgdm9pZCAqKlNtYWxsU3RvcmFnZSwgY29uc3QgU21hbGxQdHJTZXRJbXBsICZ0aGF0KQorICAgICAgOiBTbWFsbFB0clNldEltcGxCYXNlKFNtYWxsU3RvcmFnZSwgdGhhdCkge30KKyAgU21hbGxQdHJTZXRJbXBsKGNvbnN0IHZvaWQgKipTbWFsbFN0b3JhZ2UsIHVuc2lnbmVkIFNtYWxsU2l6ZSwKKyAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0SW1wbCAmJnRoYXQpCisgICAgICA6IFNtYWxsUHRyU2V0SW1wbEJhc2UoU21hbGxTdG9yYWdlLCBTbWFsbFNpemUsIHN0ZDo6bW92ZSh0aGF0KSkge30KKyAgZXhwbGljaXQgU21hbGxQdHJTZXRJbXBsKGNvbnN0IHZvaWQgKipTbWFsbFN0b3JhZ2UsIHVuc2lnbmVkIFNtYWxsU2l6ZSkKKyAgICAgIDogU21hbGxQdHJTZXRJbXBsQmFzZShTbWFsbFN0b3JhZ2UsIFNtYWxsU2l6ZSkge30KKworcHVibGljOgorICB1c2luZyBpdGVyYXRvciA9IFNtYWxsUHRyU2V0SXRlcmF0b3I8UHRyVHlwZT47CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gU21hbGxQdHJTZXRJdGVyYXRvcjxQdHJUeXBlPjsKKyAgdXNpbmcga2V5X3R5cGUgPSBDb25zdFB0clR5cGU7CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBQdHJUeXBlOworCisgIFNtYWxsUHRyU2V0SW1wbChjb25zdCBTbWFsbFB0clNldEltcGwgJikgPSBkZWxldGU7CisKKyAgLy8vIEluc2VydHMgUHRyIGlmIGFuZCBvbmx5IGlmIHRoZXJlIGlzIG5vIGVsZW1lbnQgaW4gdGhlIGNvbnRhaW5lciBlcXVhbCB0bworICAvLy8gUHRyLiBUaGUgYm9vbCBjb21wb25lbnQgb2YgdGhlIHJldHVybmVkIHBhaXIgaXMgdHJ1ZSBpZiBhbmQgb25seSBpZiB0aGUKKyAgLy8vIGluc2VydGlvbiB0YWtlcyBwbGFjZSwgYW5kIHRoZSBpdGVyYXRvciBjb21wb25lbnQgb2YgdGhlIHBhaXIgcG9pbnRzIHRvCisgIC8vLyB0aGUgZWxlbWVudCBlcXVhbCB0byBQdHIuCisgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KFB0clR5cGUgUHRyKSB7CisgICAgYXV0byBwID0gaW5zZXJ0X2ltcChQdHJUcmFpdHM6OmdldEFzVm9pZFBvaW50ZXIoUHRyKSk7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKG1ha2VJdGVyYXRvcihwLmZpcnN0KSwgcC5zZWNvbmQpOworICB9CisKKyAgLy8vIGVyYXNlIC0gSWYgdGhlIHNldCBjb250YWlucyB0aGUgc3BlY2lmaWVkIHBvaW50ZXIsIHJlbW92ZSBpdCBhbmQgcmV0dXJuCisgIC8vLyB0cnVlLCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLgorICBib29sIGVyYXNlKFB0clR5cGUgUHRyKSB7CisgICAgcmV0dXJuIGVyYXNlX2ltcChQdHJUcmFpdHM6OmdldEFzVm9pZFBvaW50ZXIoUHRyKSk7CisgIH0KKyAgLy8vIGNvdW50IC0gUmV0dXJuIDEgaWYgdGhlIHNwZWNpZmllZCBwb2ludGVyIGlzIGluIHRoZSBzZXQsIDAgb3RoZXJ3aXNlLgorICBzaXplX3R5cGUgY291bnQoQ29uc3RQdHJUeXBlIFB0cikgY29uc3QgeyByZXR1cm4gZmluZChQdHIpICE9IGVuZCgpID8gMSA6IDA7IH0KKyAgaXRlcmF0b3IgZmluZChDb25zdFB0clR5cGUgUHRyKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VJdGVyYXRvcihmaW5kX2ltcChDb25zdFB0clRyYWl0czo6Z2V0QXNWb2lkUG9pbnRlcihQdHIpKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlclQ+CisgIHZvaWQgaW5zZXJ0KEl0ZXJUIEksIEl0ZXJUIEUpIHsKKyAgICBmb3IgKDsgSSAhPSBFOyArK0kpCisgICAgICBpbnNlcnQoKkkpOworICB9CisKKyAgdm9pZCBpbnNlcnQoc3RkOjppbml0aWFsaXplcl9saXN0PFB0clR5cGU+IElMKSB7CisgICAgaW5zZXJ0KElMLmJlZ2luKCksIElMLmVuZCgpKTsKKyAgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeworICAgIGlmIChzaG91bGRSZXZlcnNlSXRlcmF0ZSgpKQorICAgICAgcmV0dXJuIG1ha2VJdGVyYXRvcihFbmRQb2ludGVyKCkgLSAxKTsKKyAgICByZXR1cm4gbWFrZUl0ZXJhdG9yKEN1ckFycmF5KTsKKyAgfQorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBtYWtlSXRlcmF0b3IoRW5kUG9pbnRlcigpKTsgfQorCitwcml2YXRlOgorICAvLy8gQ3JlYXRlIGFuIGl0ZXJhdG9yIHRoYXQgZGVyZWZlcmVuY2VzIHRvIHNhbWUgcGxhY2UgYXMgdGhlIGdpdmVuIHBvaW50ZXIuCisgIGl0ZXJhdG9yIG1ha2VJdGVyYXRvcihjb25zdCB2b2lkICpjb25zdCAqUCkgY29uc3QgeworICAgIGlmIChzaG91bGRSZXZlcnNlSXRlcmF0ZSgpKQorICAgICAgcmV0dXJuIGl0ZXJhdG9yKFAgPT0gRW5kUG9pbnRlcigpID8gQ3VyQXJyYXkgOiBQICsgMSwgQ3VyQXJyYXksICp0aGlzKTsKKyAgICByZXR1cm4gaXRlcmF0b3IoUCwgRW5kUG9pbnRlcigpLCAqdGhpcyk7CisgIH0KK307CisKKy8vLyBTbWFsbFB0clNldCAtIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHNldCB3aGljaCBpcyBvcHRpbWl6ZWQgZm9yIGhvbGRpbmcKKy8vLyBTbWFsbFNpemUgb3IgbGVzcyBlbGVtZW50cy4gIFRoaXMgaW50ZXJuYWxseSByb3VuZHMgdXAgU21hbGxTaXplIHRvIHRoZSBuZXh0CisvLy8gcG93ZXIgb2YgdHdvIGlmIGl0IGlzIG5vdCBhbHJlYWR5IGEgcG93ZXIgb2YgdHdvLiAgU2VlIHRoZSBjb21tZW50cyBhYm92ZQorLy8vIFNtYWxsUHRyU2V0SW1wbEJhc2UgZm9yIGRldGFpbHMgb2YgdGhlIGFsZ29yaXRobS4KK3RlbXBsYXRlPGNsYXNzIFB0clR5cGUsIHVuc2lnbmVkIFNtYWxsU2l6ZT4KK2NsYXNzIFNtYWxsUHRyU2V0IDogcHVibGljIFNtYWxsUHRyU2V0SW1wbDxQdHJUeXBlPiB7CisgIC8vIEluIHNtYWxsIG1vZGUgU21hbGxQdHJTZXQgdXNlcyBsaW5lYXIgc2VhcmNoIGZvciB0aGUgZWxlbWVudHMsIHNvIGl0IGlzCisgIC8vIG5vdCBhIGdvb2QgaWRlYSB0byBjaG9vc2UgdGhpcyB2YWx1ZSB0b28gaGlnaC4gWW91IG1heSBjb25zaWRlciB1c2luZyBhCisgIC8vIERlbnNlU2V0PD4gaW5zdGVhZCBpZiB5b3UgZXhwZWN0IG1hbnkgZWxlbWVudHMgaW4gdGhlIHNldC4KKyAgc3RhdGljX2Fzc2VydChTbWFsbFNpemUgPD0gMzIsICJTbWFsbFNpemUgc2hvdWxkIGJlIHNtYWxsIik7CisKKyAgdXNpbmcgQmFzZVQgPSBTbWFsbFB0clNldEltcGw8UHRyVHlwZT47CisKKyAgLy8gTWFrZSBzdXJlIHRoYXQgU21hbGxTaXplIGlzIGEgcG93ZXIgb2YgdHdvLCByb3VuZCB1cCBpZiBub3QuCisgIGVudW0geyBTbWFsbFNpemVQb3dUd28gPSBSb3VuZFVwVG9Qb3dlck9mVHdvPFNtYWxsU2l6ZT46OlZhbCB9OworICAvLy8gU21hbGxTdG9yYWdlIC0gRml4ZWQgc2l6ZSBzdG9yYWdlIHVzZWQgaW4gJ3NtYWxsIG1vZGUnLgorICBjb25zdCB2b2lkICpTbWFsbFN0b3JhZ2VbU21hbGxTaXplUG93VHdvXTsKKworcHVibGljOgorICBTbWFsbFB0clNldCgpIDogQmFzZVQoU21hbGxTdG9yYWdlLCBTbWFsbFNpemVQb3dUd28pIHt9CisgIFNtYWxsUHRyU2V0KGNvbnN0IFNtYWxsUHRyU2V0ICZ0aGF0KSA6IEJhc2VUKFNtYWxsU3RvcmFnZSwgdGhhdCkge30KKyAgU21hbGxQdHJTZXQoU21hbGxQdHJTZXQgJiZ0aGF0KQorICAgICAgOiBCYXNlVChTbWFsbFN0b3JhZ2UsIFNtYWxsU2l6ZVBvd1R3bywgc3RkOjptb3ZlKHRoYXQpKSB7fQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIEl0PgorICBTbWFsbFB0clNldChJdCBJLCBJdCBFKSA6IEJhc2VUKFNtYWxsU3RvcmFnZSwgU21hbGxTaXplUG93VHdvKSB7CisgICAgdGhpcy0+aW5zZXJ0KEksIEUpOworICB9CisKKyAgU21hbGxQdHJTZXQoc3RkOjppbml0aWFsaXplcl9saXN0PFB0clR5cGU+IElMKQorICAgICAgOiBCYXNlVChTbWFsbFN0b3JhZ2UsIFNtYWxsU2l6ZVBvd1R3bykgeworICAgIHRoaXMtPmluc2VydChJTC5iZWdpbigpLCBJTC5lbmQoKSk7CisgIH0KKworICBTbWFsbFB0clNldDxQdHJUeXBlLCBTbWFsbFNpemU+ICYKKyAgb3BlcmF0b3I9KGNvbnN0IFNtYWxsUHRyU2V0PFB0clR5cGUsIFNtYWxsU2l6ZT4gJlJIUykgeworICAgIGlmICgmUkhTICE9IHRoaXMpCisgICAgICB0aGlzLT5Db3B5RnJvbShSSFMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFNtYWxsUHRyU2V0PFB0clR5cGUsIFNtYWxsU2l6ZT4gJgorICBvcGVyYXRvcj0oU21hbGxQdHJTZXQ8UHRyVHlwZSwgU21hbGxTaXplPiAmJlJIUykgeworICAgIGlmICgmUkhTICE9IHRoaXMpCisgICAgICB0aGlzLT5Nb3ZlRnJvbShTbWFsbFNpemVQb3dUd28sIHN0ZDo6bW92ZShSSFMpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBTbWFsbFB0clNldDxQdHJUeXBlLCBTbWFsbFNpemU+ICYKKyAgb3BlcmF0b3I9KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxQdHJUeXBlPiBJTCkgeworICAgIHRoaXMtPmNsZWFyKCk7CisgICAgdGhpcy0+aW5zZXJ0KElMLmJlZ2luKCksIElMLmVuZCgpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gc3dhcCAtIFN3YXBzIHRoZSBlbGVtZW50cyBvZiB0d28gc2V0cy4KKyAgdm9pZCBzd2FwKFNtYWxsUHRyU2V0PFB0clR5cGUsIFNtYWxsU2l6ZT4gJlJIUykgeworICAgIFNtYWxsUHRyU2V0SW1wbEJhc2U6OnN3YXAoUkhTKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworbmFtZXNwYWNlIHN0ZCB7CisKKyAgLy8vIEltcGxlbWVudCBzdGQ6OnN3YXAgaW4gdGVybXMgb2YgU21hbGxQdHJTZXQgc3dhcC4KKyAgdGVtcGxhdGU8Y2xhc3MgVCwgdW5zaWduZWQgTj4KKyAgaW5saW5lIHZvaWQgc3dhcChsbHZtOjpTbWFsbFB0clNldDxULCBOPiAmTEhTLCBsbHZtOjpTbWFsbFB0clNldDxULCBOPiAmUkhTKSB7CisgICAgTEhTLnN3YXAoUkhTKTsKKyAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9TTUFMTFBUUlNFVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TbWFsbFNldC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxTZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTJkMGYwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxTZXQuaApAQCAtMCwwICsxLDE0MiBAQAorLy89PT0tIGxsdm0vQURUL1NtYWxsU2V0LmggLSAnTm9ybWFsbHkgc21hbGwnIHNldHMgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgU21hbGxTZXQgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9TTUFMTFNFVF9ICisjZGVmaW5lIExMVk1fQURUX1NNQUxMU0VUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBTbWFsbFNldCAtIFRoaXMgbWFpbnRhaW5zIGEgc2V0IG9mIHVuaXF1ZSB2YWx1ZXMsIG9wdGltaXppbmcgZm9yIHRoZSBjYXNlCisvLy8gd2hlbiB0aGUgc2V0IGlzIHNtYWxsIChsZXNzIHRoYW4gTikuICBJbiB0aGlzIGNhc2UsIHRoZSBzZXQgY2FuIGJlCisvLy8gbWFpbnRhaW5lZCB3aXRoIG5vIG1hbGxvY3MuICBJZiB0aGUgc2V0IGdldHMgbGFyZ2UsIHdlIGV4cGFuZCB0byB1c2luZyBhbgorLy8vIHN0ZDo6c2V0IHRvIG1haW50YWluIHJlYXNvbmFibGUgbG9va3VwIHRpbWVzLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgc2V0IGRvZXMgbm90IHByb3ZpZGUgYSB3YXkgdG8gaXRlcmF0ZSBvdmVyIG1lbWJlcnMgaW4gdGhlCisvLy8gc2V0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4sIHR5cGVuYW1lIEMgPSBzdGQ6Omxlc3M8VD4+CitjbGFzcyBTbWFsbFNldCB7CisgIC8vLyBVc2UgYSBTbWFsbFZlY3RvciB0byBob2xkIHRoZSBlbGVtZW50cyBoZXJlIChldmVuIHRob3VnaCBpdCB3aWxsIG5ldmVyCisgIC8vLyByZWFjaCBpdHMgJ2xhcmdlJyBzdGFnZSkgdG8gYXZvaWQgY2FsbGluZyB0aGUgZGVmYXVsdCBjdG9ycyBvZiBlbGVtZW50cworICAvLy8gd2Ugd2lsbCBuZXZlciB1c2UuCisgIFNtYWxsVmVjdG9yPFQsIE4+IFZlY3RvcjsKKyAgc3RkOjpzZXQ8VCwgQz4gU2V0OworCisgIHVzaW5nIFZJdGVyYXRvciA9IHR5cGVuYW1lIFNtYWxsVmVjdG9yPFQsIE4+Ojpjb25zdF9pdGVyYXRvcjsKKyAgdXNpbmcgbXV0YWJsZV9pdGVyYXRvciA9IHR5cGVuYW1lIFNtYWxsVmVjdG9yPFQsIE4+OjppdGVyYXRvcjsKKworICAvLyBJbiBzbWFsbCBtb2RlIFNtYWxsUHRyU2V0IHVzZXMgbGluZWFyIHNlYXJjaCBmb3IgdGhlIGVsZW1lbnRzLCBzbyBpdCBpcworICAvLyBub3QgYSBnb29kIGlkZWEgdG8gY2hvb3NlIHRoaXMgdmFsdWUgdG9vIGhpZ2guIFlvdSBtYXkgY29uc2lkZXIgdXNpbmcgYQorICAvLyBEZW5zZVNldDw+IGluc3RlYWQgaWYgeW91IGV4cGVjdCBtYW55IGVsZW1lbnRzIGluIHRoZSBzZXQuCisgIHN0YXRpY19hc3NlcnQoTiA8PSAzMiwgIk4gc2hvdWxkIGJlIHNtYWxsIik7CisKK3B1YmxpYzoKKyAgdXNpbmcgc2l6ZV90eXBlID0gc2l6ZV90OworCisgIFNtYWxsU2V0KCkgPSBkZWZhdWx0OworCisgIExMVk1fTk9ESVNDQVJEIGJvb2wgZW1wdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIFZlY3Rvci5lbXB0eSgpICYmIFNldC5lbXB0eSgpOworICB9CisKKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzU21hbGwoKSA/IFZlY3Rvci5zaXplKCkgOiBTZXQuc2l6ZSgpOworICB9CisKKyAgLy8vIGNvdW50IC0gUmV0dXJuIDEgaWYgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIHNldCwgMCBvdGhlcndpc2UuCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBUICZWKSBjb25zdCB7CisgICAgaWYgKGlzU21hbGwoKSkgeworICAgICAgLy8gU2luY2UgdGhlIGNvbGxlY3Rpb24gaXMgc21hbGwsIGp1c3QgZG8gYSBsaW5lYXIgc2VhcmNoLgorICAgICAgcmV0dXJuIHZmaW5kKFYpID09IFZlY3Rvci5lbmQoKSA/IDAgOiAxOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gU2V0LmNvdW50KFYpOworICAgIH0KKyAgfQorCisgIC8vLyBpbnNlcnQgLSBJbnNlcnQgYW4gZWxlbWVudCBpbnRvIHRoZSBzZXQgaWYgaXQgaXNuJ3QgYWxyZWFkeSB0aGVyZS4KKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZWxlbWVudCBpcyBpbnNlcnRlZCAoaXQgd2FzIG5vdCBpbiB0aGUgc2V0IGJlZm9yZSkuCisgIC8vLyBUaGUgZmlyc3QgdmFsdWUgb2YgdGhlIHJldHVybmVkIHBhaXIgaXMgdW51c2VkIGFuZCBwcm92aWRlZCBmb3IKKyAgLy8vIHBhcnRpYWwgY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBzdGFuZGFyZCBsaWJyYXJ5IHNlbGYtYXNzb2NpYXRpdmUgY29udGFpbmVyCisgIC8vLyBjb25jZXB0LgorICAvLyBGSVhNRTogQWRkIGl0ZXJhdG9ycyB0aGF0IGFic3RyYWN0IG92ZXIgdGhlIHNtYWxsIGFuZCBsYXJnZSBmb3JtLCBhbmQgdGhlbgorICAvLyByZXR1cm4gdGhvc2UgaGVyZS4KKyAgc3RkOjpwYWlyPE5vbmVUeXBlLCBib29sPiBpbnNlcnQoY29uc3QgVCAmVikgeworICAgIGlmICghaXNTbWFsbCgpKQorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKE5vbmUsIFNldC5pbnNlcnQoVikuc2Vjb25kKTsKKworICAgIFZJdGVyYXRvciBJID0gdmZpbmQoVik7CisgICAgaWYgKEkgIT0gVmVjdG9yLmVuZCgpKSAgICAvLyBEb24ndCByZWluc2VydCBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihOb25lLCBmYWxzZSk7CisgICAgaWYgKFZlY3Rvci5zaXplKCkgPCBOKSB7CisgICAgICBWZWN0b3IucHVzaF9iYWNrKFYpOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKE5vbmUsIHRydWUpOworICAgIH0KKworICAgIC8vIE90aGVyd2lzZSwgZ3JvdyBmcm9tIHZlY3RvciB0byBzZXQuCisgICAgd2hpbGUgKCFWZWN0b3IuZW1wdHkoKSkgeworICAgICAgU2V0Lmluc2VydChWZWN0b3IuYmFjaygpKTsKKyAgICAgIFZlY3Rvci5wb3BfYmFjaygpOworICAgIH0KKyAgICBTZXQuaW5zZXJ0KFYpOworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihOb25lLCB0cnVlKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyVD4KKyAgdm9pZCBpbnNlcnQoSXRlclQgSSwgSXRlclQgRSkgeworICAgIGZvciAoOyBJICE9IEU7ICsrSSkKKyAgICAgIGluc2VydCgqSSk7CisgIH0KKworICBib29sIGVyYXNlKGNvbnN0IFQgJlYpIHsKKyAgICBpZiAoIWlzU21hbGwoKSkKKyAgICAgIHJldHVybiBTZXQuZXJhc2UoVik7CisgICAgZm9yIChtdXRhYmxlX2l0ZXJhdG9yIEkgPSBWZWN0b3IuYmVnaW4oKSwgRSA9IFZlY3Rvci5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBpZiAoKkkgPT0gVikgeworICAgICAgICBWZWN0b3IuZXJhc2UoSSk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgVmVjdG9yLmNsZWFyKCk7CisgICAgU2V0LmNsZWFyKCk7CisgIH0KKworcHJpdmF0ZToKKyAgYm9vbCBpc1NtYWxsKCkgY29uc3QgeyByZXR1cm4gU2V0LmVtcHR5KCk7IH0KKworICBWSXRlcmF0b3IgdmZpbmQoY29uc3QgVCAmVikgY29uc3QgeworICAgIGZvciAoVkl0ZXJhdG9yIEkgPSBWZWN0b3IuYmVnaW4oKSwgRSA9IFZlY3Rvci5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBpZiAoKkkgPT0gVikKKyAgICAgICAgcmV0dXJuIEk7CisgICAgcmV0dXJuIFZlY3Rvci5lbmQoKTsKKyAgfQorfTsKKworLy8vIElmIHRoaXMgc2V0IGlzIG9mIHBvaW50ZXIgdmFsdWVzLCB0cmFuc3BhcmVudGx5IHN3aXRjaCBvdmVyIHRvIHVzaW5nCisvLy8gU21hbGxQdHJTZXQgZm9yIHBlcmZvcm1hbmNlLgordGVtcGxhdGUgPHR5cGVuYW1lIFBvaW50ZWVUeXBlLCB1bnNpZ25lZCBOPgorY2xhc3MgU21hbGxTZXQ8UG9pbnRlZVR5cGUqLCBOPiA6IHB1YmxpYyBTbWFsbFB0clNldDxQb2ludGVlVHlwZSosIE4+IHt9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfU01BTExTRVRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxTdHJpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NtYWxsU3RyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0NmU4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NtYWxsU3RyaW5nLmgKQEAgLTAsMCArMSwyOTcgQEAKKy8vPT09LSBsbHZtL0FEVC9TbWFsbFN0cmluZy5oIC0gJ05vcm1hbGx5IHNtYWxsJyBzdHJpbmdzIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFNtYWxsU3RyaW5nIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU01BTExTVFJJTkdfSAorI2RlZmluZSBMTFZNX0FEVF9TTUFMTFNUUklOR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPGNzdGRkZWY+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFNtYWxsU3RyaW5nIC0gQSBTbWFsbFN0cmluZyBpcyBqdXN0IGEgU21hbGxWZWN0b3Igd2l0aCBtZXRob2RzIGFuZCBhY2Nlc3NvcnMKKy8vLyB0aGF0IG1ha2UgaXQgd29yayBiZXR0ZXIgYXMgYSBzdHJpbmcgKGUuZy4gb3BlcmF0b3IrIGV0YykuCit0ZW1wbGF0ZTx1bnNpZ25lZCBJbnRlcm5hbExlbj4KK2NsYXNzIFNtYWxsU3RyaW5nIDogcHVibGljIFNtYWxsVmVjdG9yPGNoYXIsIEludGVybmFsTGVuPiB7CitwdWJsaWM6CisgIC8vLyBEZWZhdWx0IGN0b3IgLSBJbml0aWFsaXplIHRvIGVtcHR5LgorICBTbWFsbFN0cmluZygpID0gZGVmYXVsdDsKKworICAvLy8gSW5pdGlhbGl6ZSBmcm9tIGEgU3RyaW5nUmVmLgorICBTbWFsbFN0cmluZyhTdHJpbmdSZWYgUykgOiBTbWFsbFZlY3RvcjxjaGFyLCBJbnRlcm5hbExlbj4oUy5iZWdpbigpLCBTLmVuZCgpKSB7fQorCisgIC8vLyBJbml0aWFsaXplIHdpdGggYSByYW5nZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSXRUeT4KKyAgU21hbGxTdHJpbmcoSXRUeSBTLCBJdFR5IEUpIDogU21hbGxWZWN0b3I8Y2hhciwgSW50ZXJuYWxMZW4+KFMsIEUpIHt9CisKKyAgLy8gTm90ZSB0aGF0IGluIG9yZGVyIHRvIGFkZCBuZXcgb3ZlcmxvYWRzIGZvciBhcHBlbmQgJiBhc3NpZ24sIHdlIGhhdmUgdG8KKyAgLy8gZHVwbGljYXRlIHRoZSBpbmhlcml0ZWQgdmVyc2lvbnMgc28gYXMgbm90IHRvIGluYWR2ZXJ0ZW50bHkgaGlkZSB0aGVtLgorCisgIC8vLyBAfQorICAvLy8gQG5hbWUgU3RyaW5nIEFzc2lnbm1lbnQKKyAgLy8vIEB7CisKKyAgLy8vIEFzc2lnbiBmcm9tIGEgcmVwZWF0ZWQgZWxlbWVudC4KKyAgdm9pZCBhc3NpZ24oc2l6ZV90IE51bUVsdHMsIGNoYXIgRWx0KSB7CisgICAgdGhpcy0+U21hbGxWZWN0b3JJbXBsPGNoYXI+Ojphc3NpZ24oTnVtRWx0cywgRWx0KTsKKyAgfQorCisgIC8vLyBBc3NpZ24gZnJvbSBhbiBpdGVyYXRvciBwYWlyLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBpbl9pdGVyPgorICB2b2lkIGFzc2lnbihpbl9pdGVyIFMsIGluX2l0ZXIgRSkgeworICAgIHRoaXMtPmNsZWFyKCk7CisgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+OjphcHBlbmQoUywgRSk7CisgIH0KKworICAvLy8gQXNzaWduIGZyb20gYSBTdHJpbmdSZWYuCisgIHZvaWQgYXNzaWduKFN0cmluZ1JlZiBSSFMpIHsKKyAgICB0aGlzLT5jbGVhcigpOworICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPjo6YXBwZW5kKFJIUy5iZWdpbigpLCBSSFMuZW5kKCkpOworICB9CisKKyAgLy8vIEFzc2lnbiBmcm9tIGEgU21hbGxWZWN0b3IuCisgIHZvaWQgYXNzaWduKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUkhTKSB7CisgICAgdGhpcy0+Y2xlYXIoKTsKKyAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj46OmFwcGVuZChSSFMuYmVnaW4oKSwgUkhTLmVuZCgpKTsKKyAgfQorCisgIC8vLyBAfQorICAvLy8gQG5hbWUgU3RyaW5nIENvbmNhdGVuYXRpb24KKyAgLy8vIEB7CisKKyAgLy8vIEFwcGVuZCBmcm9tIGFuIGl0ZXJhdG9yIHBhaXIuCisgIHRlbXBsYXRlPHR5cGVuYW1lIGluX2l0ZXI+CisgIHZvaWQgYXBwZW5kKGluX2l0ZXIgUywgaW5faXRlciBFKSB7CisgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+OjphcHBlbmQoUywgRSk7CisgIH0KKworICB2b2lkIGFwcGVuZChzaXplX3QgTnVtSW5wdXRzLCBjaGFyIEVsdCkgeworICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPjo6YXBwZW5kKE51bUlucHV0cywgRWx0KTsKKyAgfQorCisgIC8vLyBBcHBlbmQgZnJvbSBhIFN0cmluZ1JlZi4KKyAgdm9pZCBhcHBlbmQoU3RyaW5nUmVmIFJIUykgeworICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPjo6YXBwZW5kKFJIUy5iZWdpbigpLCBSSFMuZW5kKCkpOworICB9CisKKyAgLy8vIEFwcGVuZCBmcm9tIGEgU21hbGxWZWN0b3IuCisgIHZvaWQgYXBwZW5kKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUkhTKSB7CisgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+OjphcHBlbmQoUkhTLmJlZ2luKCksIFJIUy5lbmQoKSk7CisgIH0KKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIFN0cmluZyBDb21wYXJpc29uCisgIC8vLyBAeworCisgIC8vLyBDaGVjayBmb3Igc3RyaW5nIGVxdWFsaXR5LiAgVGhpcyBpcyBtb3JlIGVmZmljaWVudCB0aGFuIGNvbXBhcmUoKSB3aGVuCisgIC8vLyB0aGUgcmVsYXRpdmUgb3JkZXJpbmcgb2YgaW5lcXVhbCBzdHJpbmdzIGlzbid0IG5lZWRlZC4KKyAgYm9vbCBlcXVhbHMoU3RyaW5nUmVmIFJIUykgY29uc3QgeworICAgIHJldHVybiBzdHIoKS5lcXVhbHMoUkhTKTsKKyAgfQorCisgIC8vLyBDaGVjayBmb3Igc3RyaW5nIGVxdWFsaXR5LCBpZ25vcmluZyBjYXNlLgorICBib29sIGVxdWFsc19sb3dlcihTdHJpbmdSZWYgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cigpLmVxdWFsc19sb3dlcihSSFMpOworICB9CisKKyAgLy8vIENvbXBhcmUgdHdvIHN0cmluZ3M7IHRoZSByZXN1bHQgaXMgLTEsIDAsIG9yIDEgaWYgdGhpcyBzdHJpbmcgaXMKKyAgLy8vIGxleGljb2dyYXBoaWNhbGx5IGxlc3MgdGhhbiwgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB0aGUgXHAgUkhTLgorICBpbnQgY29tcGFyZShTdHJpbmdSZWYgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cigpLmNvbXBhcmUoUkhTKTsKKyAgfQorCisgIC8vLyBjb21wYXJlX2xvd2VyIC0gQ29tcGFyZSB0d28gc3RyaW5ncywgaWdub3JpbmcgY2FzZS4KKyAgaW50IGNvbXBhcmVfbG93ZXIoU3RyaW5nUmVmIFJIUykgY29uc3QgeworICAgIHJldHVybiBzdHIoKS5jb21wYXJlX2xvd2VyKFJIUyk7CisgIH0KKworICAvLy8gY29tcGFyZV9udW1lcmljIC0gQ29tcGFyZSB0d28gc3RyaW5ncywgdHJlYXRpbmcgc2VxdWVuY2VzIG9mIGRpZ2l0cyBhcworICAvLy8gbnVtYmVycy4KKyAgaW50IGNvbXBhcmVfbnVtZXJpYyhTdHJpbmdSZWYgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cigpLmNvbXBhcmVfbnVtZXJpYyhSSFMpOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBTdHJpbmcgUHJlZGljYXRlcworICAvLy8gQHsKKworICAvLy8gc3RhcnRzd2l0aCAtIENoZWNrIGlmIHRoaXMgc3RyaW5nIHN0YXJ0cyB3aXRoIHRoZSBnaXZlbiBccCBQcmVmaXguCisgIGJvb2wgc3RhcnRzd2l0aChTdHJpbmdSZWYgUHJlZml4KSBjb25zdCB7CisgICAgcmV0dXJuIHN0cigpLnN0YXJ0c3dpdGgoUHJlZml4KTsKKyAgfQorCisgIC8vLyBlbmRzd2l0aCAtIENoZWNrIGlmIHRoaXMgc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gXHAgU3VmZml4LgorICBib29sIGVuZHN3aXRoKFN0cmluZ1JlZiBTdWZmaXgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyKCkuZW5kc3dpdGgoU3VmZml4KTsKKyAgfQorCisgIC8vLyBAfQorICAvLy8gQG5hbWUgU3RyaW5nIFNlYXJjaGluZworICAvLy8gQHsKKworICAvLy8gZmluZCAtIFNlYXJjaCBmb3IgdGhlIGZpcnN0IGNoYXJhY3RlciBccCBDIGluIHRoZSBzdHJpbmcuCisgIC8vLworICAvLy8gXHJldHVybiAtIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBccCBDLCBvciBucG9zIGlmIG5vdAorICAvLy8gZm91bmQuCisgIHNpemVfdCBmaW5kKGNoYXIgQywgc2l6ZV90IEZyb20gPSAwKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cigpLmZpbmQoQywgRnJvbSk7CisgIH0KKworICAvLy8gU2VhcmNoIGZvciB0aGUgZmlyc3Qgc3RyaW5nIFxwIFN0ciBpbiB0aGUgc3RyaW5nLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBccCBTdHIsIG9yIG5wb3MgaWYgbm90CisgIC8vLyBmb3VuZC4KKyAgc2l6ZV90IGZpbmQoU3RyaW5nUmVmIFN0ciwgc2l6ZV90IEZyb20gPSAwKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cigpLmZpbmQoU3RyLCBGcm9tKTsKKyAgfQorCisgIC8vLyBTZWFyY2ggZm9yIHRoZSBsYXN0IGNoYXJhY3RlciBccCBDIGluIHRoZSBzdHJpbmcuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgXHAgQywgb3IgbnBvcyBpZiBub3QKKyAgLy8vIGZvdW5kLgorICBzaXplX3QgcmZpbmQoY2hhciBDLCBzaXplX3QgRnJvbSA9IFN0cmluZ1JlZjo6bnBvcykgY29uc3QgeworICAgIHJldHVybiBzdHIoKS5yZmluZChDLCBGcm9tKTsKKyAgfQorCisgIC8vLyBTZWFyY2ggZm9yIHRoZSBsYXN0IHN0cmluZyBccCBTdHIgaW4gdGhlIHN0cmluZy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBUaGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBccCBTdHIsIG9yIG5wb3MgaWYgbm90CisgIC8vLyBmb3VuZC4KKyAgc2l6ZV90IHJmaW5kKFN0cmluZ1JlZiBTdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyKCkucmZpbmQoU3RyKTsKKyAgfQorCisgIC8vLyBGaW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyB0aGF0IGlzIFxwIEMsIG9yIG5wb3MgaWYgbm90CisgIC8vLyBmb3VuZC4gU2FtZSBhcyBmaW5kLgorICBzaXplX3QgZmluZF9maXJzdF9vZihjaGFyIEMsIHNpemVfdCBGcm9tID0gMCkgY29uc3QgeworICAgIHJldHVybiBzdHIoKS5maW5kX2ZpcnN0X29mKEMsIEZyb20pOworICB9CisKKyAgLy8vIEZpbmQgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIHRoYXQgaXMgaW4gXHAgQ2hhcnMsIG9yIG5wb3MgaWYKKyAgLy8vIG5vdCBmb3VuZC4KKyAgLy8vCisgIC8vLyBDb21wbGV4aXR5OiBPKHNpemUoKSArIENoYXJzLnNpemUoKSkKKyAgc2l6ZV90IGZpbmRfZmlyc3Rfb2YoU3RyaW5nUmVmIENoYXJzLCBzaXplX3QgRnJvbSA9IDApIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyKCkuZmluZF9maXJzdF9vZihDaGFycywgRnJvbSk7CisgIH0KKworICAvLy8gRmluZCB0aGUgZmlyc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBub3QgXHAgQyBvciBucG9zIGlmIG5vdAorICAvLy8gZm91bmQuCisgIHNpemVfdCBmaW5kX2ZpcnN0X25vdF9vZihjaGFyIEMsIHNpemVfdCBGcm9tID0gMCkgY29uc3QgeworICAgIHJldHVybiBzdHIoKS5maW5kX2ZpcnN0X25vdF9vZihDLCBGcm9tKTsKKyAgfQorCisgIC8vLyBGaW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyB0aGF0IGlzIG5vdCBpbiB0aGUgc3RyaW5nCisgIC8vLyBccCBDaGFycywgb3IgbnBvcyBpZiBub3QgZm91bmQuCisgIC8vLworICAvLy8gQ29tcGxleGl0eTogTyhzaXplKCkgKyBDaGFycy5zaXplKCkpCisgIHNpemVfdCBmaW5kX2ZpcnN0X25vdF9vZihTdHJpbmdSZWYgQ2hhcnMsIHNpemVfdCBGcm9tID0gMCkgY29uc3QgeworICAgIHJldHVybiBzdHIoKS5maW5kX2ZpcnN0X25vdF9vZihDaGFycywgRnJvbSk7CisgIH0KKworICAvLy8gRmluZCB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyB0aGF0IGlzIFxwIEMsIG9yIG5wb3MgaWYgbm90CisgIC8vLyBmb3VuZC4KKyAgc2l6ZV90IGZpbmRfbGFzdF9vZihjaGFyIEMsIHNpemVfdCBGcm9tID0gU3RyaW5nUmVmOjpucG9zKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cigpLmZpbmRfbGFzdF9vZihDLCBGcm9tKTsKKyAgfQorCisgIC8vLyBGaW5kIHRoZSBsYXN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIHRoYXQgaXMgaW4gXHAgQywgb3IgbnBvcyBpZiBub3QKKyAgLy8vIGZvdW5kLgorICAvLy8KKyAgLy8vIENvbXBsZXhpdHk6IE8oc2l6ZSgpICsgQ2hhcnMuc2l6ZSgpKQorICBzaXplX3QgZmluZF9sYXN0X29mKAorICAgICAgU3RyaW5nUmVmIENoYXJzLCBzaXplX3QgRnJvbSA9IFN0cmluZ1JlZjo6bnBvcykgY29uc3QgeworICAgIHJldHVybiBzdHIoKS5maW5kX2xhc3Rfb2YoQ2hhcnMsIEZyb20pOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBIZWxwZnVsIEFsZ29yaXRobXMKKyAgLy8vIEB7CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIG9mIFxwIEMgaW4gdGhlIHN0cmluZy4KKyAgc2l6ZV90IGNvdW50KGNoYXIgQykgY29uc3QgeworICAgIHJldHVybiBzdHIoKS5jb3VudChDKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBub24tb3ZlcmxhcHBlZCBvY2N1cnJlbmNlcyBvZiBccCBTdHIgaW4gdGhlCisgIC8vLyBzdHJpbmcuCisgIHNpemVfdCBjb3VudChTdHJpbmdSZWYgU3RyKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cigpLmNvdW50KFN0cik7CisgIH0KKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIFN1YnN0cmluZyBPcGVyYXRpb25zCisgIC8vLyBAeworCisgIC8vLyBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIHN1YnN0cmluZyBmcm9tIFtTdGFydCwgU3RhcnQgKyBOKS4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnQgVGhlIGluZGV4IG9mIHRoZSBzdGFydGluZyBjaGFyYWN0ZXIgaW4gdGhlIHN1YnN0cmluZzsgaWYKKyAgLy8vIHRoZSBpbmRleCBpcyBucG9zIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdGhlbiB0aGUKKyAgLy8vIGVtcHR5IHN1YnN0cmluZyB3aWxsIGJlIHJldHVybmVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBpbmNsdWRlZCBpbiB0aGUgc3Vic3RyaW5nLiBJZiBccCBOCisgIC8vLyBleGNlZWRzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZW1haW5pbmcgaW4gdGhlIHN0cmluZywgdGhlIHN0cmluZworICAvLy8gc3VmZml4IChzdGFydGluZyB3aXRoIFxwIFN0YXJ0KSB3aWxsIGJlIHJldHVybmVkLgorICBTdHJpbmdSZWYgc3Vic3RyKHNpemVfdCBTdGFydCwgc2l6ZV90IE4gPSBTdHJpbmdSZWY6Om5wb3MpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RyKCkuc3Vic3RyKFN0YXJ0LCBOKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIHN1YnN0cmluZyBmcm9tIFtTdGFydCwgRW5kKS4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RhcnQgVGhlIGluZGV4IG9mIHRoZSBzdGFydGluZyBjaGFyYWN0ZXIgaW4gdGhlIHN1YnN0cmluZzsgaWYKKyAgLy8vIHRoZSBpbmRleCBpcyBucG9zIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdGhlbiB0aGUKKyAgLy8vIGVtcHR5IHN1YnN0cmluZyB3aWxsIGJlIHJldHVybmVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBFbmQgVGhlIGluZGV4IGZvbGxvd2luZyB0aGUgbGFzdCBjaGFyYWN0ZXIgdG8gaW5jbHVkZSBpbiB0aGUKKyAgLy8vIHN1YnN0cmluZy4gSWYgdGhpcyBpcyBucG9zLCBvciBsZXNzIHRoYW4gXHAgU3RhcnQsIG9yIGV4Y2VlZHMgdGhlCisgIC8vLyBudW1iZXIgb2YgY2hhcmFjdGVycyByZW1haW5pbmcgaW4gdGhlIHN0cmluZywgdGhlIHN0cmluZyBzdWZmaXgKKyAgLy8vIChzdGFydGluZyB3aXRoIFxwIFN0YXJ0KSB3aWxsIGJlIHJldHVybmVkLgorICBTdHJpbmdSZWYgc2xpY2Uoc2l6ZV90IFN0YXJ0LCBzaXplX3QgRW5kKSBjb25zdCB7CisgICAgcmV0dXJuIHN0cigpLnNsaWNlKFN0YXJ0LCBFbmQpOworICB9CisKKyAgLy8gRXh0cmEgbWV0aG9kcy4KKworICAvLy8gRXhwbGljaXQgY29udmVyc2lvbiB0byBTdHJpbmdSZWYuCisgIFN0cmluZ1JlZiBzdHIoKSBjb25zdCB7IHJldHVybiBTdHJpbmdSZWYodGhpcy0+YmVnaW4oKSwgdGhpcy0+c2l6ZSgpKTsgfQorCisgIC8vIFRPRE86IE1ha2UgdGhpcyBjb25zdCwgaWYgaXQncyBzYWZlLi4uCisgIGNvbnN0IGNoYXIqIGNfc3RyKCkgeworICAgIHRoaXMtPnB1c2hfYmFjaygwKTsKKyAgICB0aGlzLT5wb3BfYmFjaygpOworICAgIHJldHVybiB0aGlzLT5kYXRhKCk7CisgIH0KKworICAvLy8gSW1wbGljaXQgY29udmVyc2lvbiB0byBTdHJpbmdSZWYuCisgIG9wZXJhdG9yIFN0cmluZ1JlZigpIGNvbnN0IHsgcmV0dXJuIHN0cigpOyB9CisKKyAgLy8gRXh0cmEgb3BlcmF0b3JzLgorICBjb25zdCBTbWFsbFN0cmluZyAmb3BlcmF0b3I9KFN0cmluZ1JlZiBSSFMpIHsKKyAgICB0aGlzLT5jbGVhcigpOworICAgIHJldHVybiAqdGhpcyArPSBSSFM7CisgIH0KKworICBTbWFsbFN0cmluZyAmb3BlcmF0b3IrPShTdHJpbmdSZWYgUkhTKSB7CisgICAgdGhpcy0+YXBwZW5kKFJIUy5iZWdpbigpLCBSSFMuZW5kKCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBTbWFsbFN0cmluZyAmb3BlcmF0b3IrPShjaGFyIEMpIHsKKyAgICB0aGlzLT5wdXNoX2JhY2soQyk7CisgICAgcmV0dXJuICp0aGlzOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfU01BTExTVFJJTkdfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU21hbGxWZWN0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NtYWxsVmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2QxN2U3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NtYWxsVmVjdG9yLmgKQEAgLTAsMCArMSw5NTggQEAKKy8vPT09LSBsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIC0gJ05vcm1hbGx5IHNtYWxsJyB2ZWN0b3JzIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFNtYWxsVmVjdG9yIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU01BTExWRUNUT1JfSAorI2RlZmluZSBMTFZNX0FEVF9TTUFMTFZFQ1RPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGlnbk9mLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBUaGlzIGlzIGFsbCB0aGUgbm9uLXRlbXBsYXRlZCBzdHVmZiBjb21tb24gdG8gYWxsIFNtYWxsVmVjdG9ycy4KK2NsYXNzIFNtYWxsVmVjdG9yQmFzZSB7Citwcm90ZWN0ZWQ6CisgIHZvaWQgKkJlZ2luWCwgKkVuZFgsICpDYXBhY2l0eVg7CisKK3Byb3RlY3RlZDoKKyAgU21hbGxWZWN0b3JCYXNlKHZvaWQgKkZpcnN0RWwsIHNpemVfdCBTaXplKQorICAgIDogQmVnaW5YKEZpcnN0RWwpLCBFbmRYKEZpcnN0RWwpLCBDYXBhY2l0eVgoKGNoYXIqKUZpcnN0RWwrU2l6ZSkge30KKworICAvLy8gVGhpcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgZ3JvdygpIG1ldGhvZCB3aGljaCBvbmx5IHdvcmtzCisgIC8vLyBvbiBQT0QtbGlrZSBkYXRhIHR5cGVzIGFuZCBpcyBvdXQgb2YgbGluZSB0byByZWR1Y2UgY29kZSBkdXBsaWNhdGlvbi4KKyAgdm9pZCBncm93X3BvZCh2b2lkICpGaXJzdEVsLCBzaXplX3QgTWluU2l6ZUluQnl0ZXMsIHNpemVfdCBUU2l6ZSk7CisKK3B1YmxpYzoKKyAgLy8vIFRoaXMgcmV0dXJucyBzaXplKCkqc2l6ZW9mKFQpLgorICBzaXplX3Qgc2l6ZV9pbl9ieXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gc2l6ZV90KChjaGFyKilFbmRYIC0gKGNoYXIqKUJlZ2luWCk7CisgIH0KKworICAvLy8gY2FwYWNpdHlfaW5fYnl0ZXMgLSBUaGlzIHJldHVybnMgY2FwYWNpdHkoKSpzaXplb2YoVCkuCisgIHNpemVfdCBjYXBhY2l0eV9pbl9ieXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gc2l6ZV90KChjaGFyKilDYXBhY2l0eVggLSAoY2hhciopQmVnaW5YKTsKKyAgfQorCisgIExMVk1fTk9ESVNDQVJEIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBCZWdpblggPT0gRW5kWDsgfQorfTsKKworLy8vIFRoaXMgaXMgdGhlIHBhcnQgb2YgU21hbGxWZWN0b3JUZW1wbGF0ZUJhc2Ugd2hpY2ggZG9lcyBub3QgZGVwZW5kIG9uIHdoZXRoZXIKKy8vLyB0aGUgdHlwZSBUIGlzIGEgUE9ELiBUaGUgZXh0cmEgZHVtbXkgdGVtcGxhdGUgYXJndW1lbnQgaXMgdXNlZCBieSBBcnJheVJlZgorLy8vIHRvIGF2b2lkIHVubmVjZXNzYXJpbHkgcmVxdWlyaW5nIFQgdG8gYmUgY29tcGxldGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB2b2lkPgorY2xhc3MgU21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbiA6IHB1YmxpYyBTbWFsbFZlY3RvckJhc2UgeworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lLCB1bnNpZ25lZD4gZnJpZW5kIHN0cnVjdCBTbWFsbFZlY3RvclN0b3JhZ2U7CisKKyAgLy8gQWxsb2NhdGUgcmF3IHNwYWNlIGZvciBOIGVsZW1lbnRzIG9mIHR5cGUgVC4gIElmIFQgaGFzIGEgY3RvciBvciBkdG9yLCB3ZQorICAvLyBkb24ndCB3YW50IGl0IHRvIGJlIGF1dG9tYXRpY2FsbHkgcnVuLCBzbyB3ZSBuZWVkIHRvIHJlcHJlc2VudCB0aGUgc3BhY2UgYXMKKyAgLy8gc29tZXRoaW5nIGVsc2UuICBVc2UgYW4gYXJyYXkgb2YgY2hhciBvZiBzdWZmaWNpZW50IGFsaWdubWVudC4KKyAgdXNpbmcgVSA9IEFsaWduZWRDaGFyQXJyYXlVbmlvbjxUPjsKKyAgVSBGaXJzdEVsOworICAvLyBTcGFjZSBhZnRlciAnRmlyc3RFbCcgaXMgY2xvYmJlcmVkLCBkbyBub3QgYWRkIGFueSBpbnN0YW5jZSB2YXJzIGFmdGVyIGl0LgorCitwcm90ZWN0ZWQ6CisgIFNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb24oc2l6ZV90IFNpemUpIDogU21hbGxWZWN0b3JCYXNlKCZGaXJzdEVsLCBTaXplKSB7fQorCisgIHZvaWQgZ3Jvd19wb2Qoc2l6ZV90IE1pblNpemVJbkJ5dGVzLCBzaXplX3QgVFNpemUpIHsKKyAgICBTbWFsbFZlY3RvckJhc2U6Omdyb3dfcG9kKCZGaXJzdEVsLCBNaW5TaXplSW5CeXRlcywgVFNpemUpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBzbWFsbHZlY3RvciB3aGljaCBoYXMgbm90IGhhZCBkeW5hbWljCisgIC8vLyBtZW1vcnkgYWxsb2NhdGVkIGZvciBpdC4KKyAgYm9vbCBpc1NtYWxsKCkgY29uc3QgeworICAgIHJldHVybiBCZWdpblggPT0gc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KCZGaXJzdEVsKTsKKyAgfQorCisgIC8vLyBQdXQgdGhpcyB2ZWN0b3IgaW4gYSBzdGF0ZSBvZiBiZWluZyBzbWFsbC4KKyAgdm9pZCByZXNldFRvU21hbGwoKSB7CisgICAgQmVnaW5YID0gRW5kWCA9IENhcGFjaXR5WCA9ICZGaXJzdEVsOworICB9CisKKyAgdm9pZCBzZXRFbmQoVCAqUCkgeyB0aGlzLT5FbmRYID0gUDsgfQorCitwdWJsaWM6CisgIHVzaW5nIHNpemVfdHlwZSA9IHNpemVfdDsKKyAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gcHRyZGlmZl90OworICB1c2luZyB2YWx1ZV90eXBlID0gVDsKKyAgdXNpbmcgaXRlcmF0b3IgPSBUICo7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gY29uc3QgVCAqOworCisgIHVzaW5nIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgPSBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+OworICB1c2luZyByZXZlcnNlX2l0ZXJhdG9yID0gc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPjsKKworICB1c2luZyByZWZlcmVuY2UgPSBUICY7CisgIHVzaW5nIGNvbnN0X3JlZmVyZW5jZSA9IGNvbnN0IFQgJjsKKyAgdXNpbmcgcG9pbnRlciA9IFQgKjsKKyAgdXNpbmcgY29uc3RfcG9pbnRlciA9IGNvbnN0IFQgKjsKKworICAvLyBmb3J3YXJkIGl0ZXJhdG9yIGNyZWF0aW9uIG1ldGhvZHMuCisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiAoaXRlcmF0b3IpdGhpcy0+QmVnaW5YOyB9CisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiAoY29uc3RfaXRlcmF0b3IpdGhpcy0+QmVnaW5YOyB9CisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gKGl0ZXJhdG9yKXRoaXMtPkVuZFg7IH0KKyAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiAoY29uc3RfaXRlcmF0b3IpdGhpcy0+RW5kWDsgfQorCitwcm90ZWN0ZWQ6CisgIGl0ZXJhdG9yIGNhcGFjaXR5X3B0cigpIHsgcmV0dXJuIChpdGVyYXRvcil0aGlzLT5DYXBhY2l0eVg7IH0KKyAgY29uc3RfaXRlcmF0b3IgY2FwYWNpdHlfcHRyKCkgY29uc3QgeyByZXR1cm4gKGNvbnN0X2l0ZXJhdG9yKXRoaXMtPkNhcGFjaXR5WDt9CisKK3B1YmxpYzoKKyAgLy8gcmV2ZXJzZSBpdGVyYXRvciBjcmVhdGlvbiBtZXRob2RzLgorICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpICAgICAgICAgICAgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpICAgICAgICAgICAgICB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7fQorCisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBlbmQoKS1iZWdpbigpOyB9CisgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfdHlwZSgtMSkgLyBzaXplb2YoVCk7IH0KKworICAvLy8gUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGN1cnJlbnRseSBhbGxvY2F0ZWQgYnVmZmVyLgorICBzaXplX3QgY2FwYWNpdHkoKSBjb25zdCB7IHJldHVybiBjYXBhY2l0eV9wdHIoKSAtIGJlZ2luKCk7IH0KKworICAvLy8gUmV0dXJuIGEgcG9pbnRlciB0byB0aGUgdmVjdG9yJ3MgYnVmZmVyLCBldmVuIGlmIGVtcHR5KCkuCisgIHBvaW50ZXIgZGF0YSgpIHsgcmV0dXJuIHBvaW50ZXIoYmVnaW4oKSk7IH0KKyAgLy8vIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIHZlY3RvcidzIGJ1ZmZlciwgZXZlbiBpZiBlbXB0eSgpLgorICBjb25zdF9wb2ludGVyIGRhdGEoKSBjb25zdCB7IHJldHVybiBjb25zdF9wb2ludGVyKGJlZ2luKCkpOyB9CisKKyAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICByZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgaWR4KSB7CisgICAgYXNzZXJ0KGlkeCA8IHNpemUoKSk7CisgICAgcmV0dXJuIGJlZ2luKClbaWR4XTsKKyAgfQorICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBpZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaWR4IDwgc2l6ZSgpKTsKKyAgICByZXR1cm4gYmVnaW4oKVtpZHhdOworICB9CisKKyAgcmVmZXJlbmNlIGZyb250KCkgeworICAgIGFzc2VydCghZW1wdHkoKSk7CisgICAgcmV0dXJuIGJlZ2luKClbMF07CisgIH0KKyAgY29uc3RfcmVmZXJlbmNlIGZyb250KCkgY29uc3QgeworICAgIGFzc2VydCghZW1wdHkoKSk7CisgICAgcmV0dXJuIGJlZ2luKClbMF07CisgIH0KKworICByZWZlcmVuY2UgYmFjaygpIHsKKyAgICBhc3NlcnQoIWVtcHR5KCkpOworICAgIHJldHVybiBlbmQoKVstMV07CisgIH0KKyAgY29uc3RfcmVmZXJlbmNlIGJhY2soKSBjb25zdCB7CisgICAgYXNzZXJ0KCFlbXB0eSgpKTsKKyAgICByZXR1cm4gZW5kKClbLTFdOworICB9Cit9OworCisvLy8gU21hbGxWZWN0b3JUZW1wbGF0ZUJhc2U8aXNQb2RMaWtlID0gZmFsc2U+IC0gVGhpcyBpcyB3aGVyZSB3ZSBwdXQgbWV0aG9kCisvLy8gaW1wbGVtZW50YXRpb25zIHRoYXQgYXJlIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBub24tUE9ELWxpa2UgVCdzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGJvb2wgaXNQb2RMaWtlPgorY2xhc3MgU21hbGxWZWN0b3JUZW1wbGF0ZUJhc2UgOiBwdWJsaWMgU21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxUPiB7Citwcm90ZWN0ZWQ6CisgIFNtYWxsVmVjdG9yVGVtcGxhdGVCYXNlKHNpemVfdCBTaXplKSA6IFNtYWxsVmVjdG9yVGVtcGxhdGVDb21tb248VD4oU2l6ZSkge30KKworICBzdGF0aWMgdm9pZCBkZXN0cm95X3JhbmdlKFQgKlMsIFQgKkUpIHsKKyAgICB3aGlsZSAoUyAhPSBFKSB7CisgICAgICAtLUU7CisgICAgICBFLT5+VCgpOworICAgIH0KKyAgfQorCisgIC8vLyBNb3ZlIHRoZSByYW5nZSBbSSwgRSkgaW50byB0aGUgdW5pbml0aWFsaXplZCBtZW1vcnkgc3RhcnRpbmcgd2l0aCAiRGVzdCIsCisgIC8vLyBjb25zdHJ1Y3RpbmcgZWxlbWVudHMgYXMgbmVlZGVkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdDEsIHR5cGVuYW1lIEl0Mj4KKyAgc3RhdGljIHZvaWQgdW5pbml0aWFsaXplZF9tb3ZlKEl0MSBJLCBJdDEgRSwgSXQyIERlc3QpIHsKKyAgICBzdGQ6OnVuaW5pdGlhbGl6ZWRfY29weShzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihJKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1ha2VfbW92ZV9pdGVyYXRvcihFKSwgRGVzdCk7CisgIH0KKworICAvLy8gQ29weSB0aGUgcmFuZ2UgW0ksIEUpIG9udG8gdGhlIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IHN0YXJ0aW5nIHdpdGggIkRlc3QiLAorICAvLy8gY29uc3RydWN0aW5nIGVsZW1lbnRzIGFzIG5lZWRlZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSXQxLCB0eXBlbmFtZSBJdDI+CisgIHN0YXRpYyB2b2lkIHVuaW5pdGlhbGl6ZWRfY29weShJdDEgSSwgSXQxIEUsIEl0MiBEZXN0KSB7CisgICAgc3RkOjp1bmluaXRpYWxpemVkX2NvcHkoSSwgRSwgRGVzdCk7CisgIH0KKworICAvLy8gR3JvdyB0aGUgYWxsb2NhdGVkIG1lbW9yeSAod2l0aG91dCBpbml0aWFsaXppbmcgbmV3IGVsZW1lbnRzKSwgZG91YmxpbmcKKyAgLy8vIHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LiBHdWFyYW50ZWVzIHNwYWNlIGZvciBhdCBsZWFzdCBvbmUgbW9yZQorICAvLy8gZWxlbWVudCwgb3IgTWluU2l6ZSBtb3JlIGVsZW1lbnRzIGlmIHNwZWNpZmllZC4KKyAgdm9pZCBncm93KHNpemVfdCBNaW5TaXplID0gMCk7CisKK3B1YmxpYzoKKyAgdm9pZCBwdXNoX2JhY2soY29uc3QgVCAmRWx0KSB7CisgICAgaWYgKExMVk1fVU5MSUtFTFkodGhpcy0+RW5kWCA+PSB0aGlzLT5DYXBhY2l0eVgpKQorICAgICAgdGhpcy0+Z3JvdygpOworICAgIDo6bmV3ICgodm9pZCopIHRoaXMtPmVuZCgpKSBUKEVsdCk7CisgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmVuZCgpKzEpOworICB9CisKKyAgdm9pZCBwdXNoX2JhY2soVCAmJkVsdCkgeworICAgIGlmIChMTFZNX1VOTElLRUxZKHRoaXMtPkVuZFggPj0gdGhpcy0+Q2FwYWNpdHlYKSkKKyAgICAgIHRoaXMtPmdyb3coKTsKKyAgICA6Om5ldyAoKHZvaWQqKSB0aGlzLT5lbmQoKSkgVCg6OnN0ZDo6bW92ZShFbHQpKTsKKyAgICB0aGlzLT5zZXRFbmQodGhpcy0+ZW5kKCkrMSk7CisgIH0KKworICB2b2lkIHBvcF9iYWNrKCkgeworICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKS0xKTsKKyAgICB0aGlzLT5lbmQoKS0+flQoKTsKKyAgfQorfTsKKworLy8gRGVmaW5lIHRoaXMgb3V0LW9mLWxpbmUgdG8gZGlzc3VhZGUgdGhlIEMrKyBjb21waWxlciBmcm9tIGlubGluaW5nIGl0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGJvb2wgaXNQb2RMaWtlPgordm9pZCBTbWFsbFZlY3RvclRlbXBsYXRlQmFzZTxULCBpc1BvZExpa2U+Ojpncm93KHNpemVfdCBNaW5TaXplKSB7CisgIHNpemVfdCBDdXJDYXBhY2l0eSA9IHRoaXMtPmNhcGFjaXR5KCk7CisgIHNpemVfdCBDdXJTaXplID0gdGhpcy0+c2l6ZSgpOworICAvLyBBbHdheXMgZ3JvdywgZXZlbiBmcm9tIHplcm8uCisgIHNpemVfdCBOZXdDYXBhY2l0eSA9IHNpemVfdChOZXh0UG93ZXJPZjIoQ3VyQ2FwYWNpdHkrMikpOworICBpZiAoTmV3Q2FwYWNpdHkgPCBNaW5TaXplKQorICAgIE5ld0NhcGFjaXR5ID0gTWluU2l6ZTsKKyAgVCAqTmV3RWx0cyA9IHN0YXRpY19jYXN0PFQqPihtYWxsb2MoTmV3Q2FwYWNpdHkqc2l6ZW9mKFQpKSk7CisgIGlmIChOZXdFbHRzID09IG51bGxwdHIpCisgICAgcmVwb3J0X2JhZF9hbGxvY19lcnJvcigiQWxsb2NhdGlvbiBvZiBTbWFsbFZlY3RvciBlbGVtZW50IGZhaWxlZC4iKTsKKworICAvLyBNb3ZlIHRoZSBlbGVtZW50cyBvdmVyLgorICB0aGlzLT51bmluaXRpYWxpemVkX21vdmUodGhpcy0+YmVnaW4oKSwgdGhpcy0+ZW5kKCksIE5ld0VsdHMpOworCisgIC8vIERlc3Ryb3kgdGhlIG9yaWdpbmFsIGVsZW1lbnRzLgorICBkZXN0cm95X3JhbmdlKHRoaXMtPmJlZ2luKCksIHRoaXMtPmVuZCgpKTsKKworICAvLyBJZiB0aGlzIHdhc24ndCBncm93biBmcm9tIHRoZSBpbmxpbmUgY29weSwgZGVhbGxvY2F0ZSB0aGUgb2xkIHNwYWNlLgorICBpZiAoIXRoaXMtPmlzU21hbGwoKSkKKyAgICBmcmVlKHRoaXMtPmJlZ2luKCkpOworCisgIHRoaXMtPnNldEVuZChOZXdFbHRzK0N1clNpemUpOworICB0aGlzLT5CZWdpblggPSBOZXdFbHRzOworICB0aGlzLT5DYXBhY2l0eVggPSB0aGlzLT5iZWdpbigpK05ld0NhcGFjaXR5OworfQorCisKKy8vLyBTbWFsbFZlY3RvclRlbXBsYXRlQmFzZTxpc1BvZExpa2UgPSB0cnVlPiAtIFRoaXMgaXMgd2hlcmUgd2UgcHV0IG1ldGhvZAorLy8vIGltcGxlbWVudGF0aW9ucyB0aGF0IGFyZSBkZXNpZ25lZCB0byB3b3JrIHdpdGggUE9ELWxpa2UgVCdzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBTbWFsbFZlY3RvclRlbXBsYXRlQmFzZTxULCB0cnVlPiA6IHB1YmxpYyBTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uPFQ+IHsKK3Byb3RlY3RlZDoKKyAgU21hbGxWZWN0b3JUZW1wbGF0ZUJhc2Uoc2l6ZV90IFNpemUpIDogU21hbGxWZWN0b3JUZW1wbGF0ZUNvbW1vbjxUPihTaXplKSB7fQorCisgIC8vIE5vIG5lZWQgdG8gZG8gYSBkZXN0cm95IGxvb3AgZm9yIFBPRCdzLgorICBzdGF0aWMgdm9pZCBkZXN0cm95X3JhbmdlKFQgKiwgVCAqKSB7fQorCisgIC8vLyBNb3ZlIHRoZSByYW5nZSBbSSwgRSkgb250byB0aGUgdW5pbml0aWFsaXplZCBtZW1vcnkKKyAgLy8vIHN0YXJ0aW5nIHdpdGggIkRlc3QiLCBjb25zdHJ1Y3RpbmcgZWxlbWVudHMgaW50byBpdCBhcyBuZWVkZWQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEl0MSwgdHlwZW5hbWUgSXQyPgorICBzdGF0aWMgdm9pZCB1bmluaXRpYWxpemVkX21vdmUoSXQxIEksIEl0MSBFLCBJdDIgRGVzdCkgeworICAgIC8vIEp1c3QgZG8gYSBjb3B5LgorICAgIHVuaW5pdGlhbGl6ZWRfY29weShJLCBFLCBEZXN0KTsKKyAgfQorCisgIC8vLyBDb3B5IHRoZSByYW5nZSBbSSwgRSkgb250byB0aGUgdW5pbml0aWFsaXplZCBtZW1vcnkKKyAgLy8vIHN0YXJ0aW5nIHdpdGggIkRlc3QiLCBjb25zdHJ1Y3RpbmcgZWxlbWVudHMgaW50byBpdCBhcyBuZWVkZWQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEl0MSwgdHlwZW5hbWUgSXQyPgorICBzdGF0aWMgdm9pZCB1bmluaXRpYWxpemVkX2NvcHkoSXQxIEksIEl0MSBFLCBJdDIgRGVzdCkgeworICAgIC8vIEFyYml0cmFyeSBpdGVyYXRvciB0eXBlczsganVzdCB1c2UgdGhlIGJhc2ljIGltcGxlbWVudGF0aW9uLgorICAgIHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5KEksIEUsIERlc3QpOworICB9CisKKyAgLy8vIENvcHkgdGhlIHJhbmdlIFtJLCBFKSBvbnRvIHRoZSB1bmluaXRpYWxpemVkIG1lbW9yeQorICAvLy8gc3RhcnRpbmcgd2l0aCAiRGVzdCIsIGNvbnN0cnVjdGluZyBlbGVtZW50cyBpbnRvIGl0IGFzIG5lZWRlZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KKyAgc3RhdGljIHZvaWQgdW5pbml0aWFsaXplZF9jb3B5KAorICAgICAgVDEgKkksIFQxICpFLCBUMiAqRGVzdCwKKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfc2FtZTx0eXBlbmFtZSBzdGQ6OnJlbW92ZV9jb25zdDxUMT46OnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVDI+Ojp2YWx1ZT46OnR5cGUgKiA9IG51bGxwdHIpIHsKKyAgICAvLyBVc2UgbWVtY3B5IGZvciBQT0RzIGl0ZXJhdGVkIGJ5IHBvaW50ZXJzICh3aGljaCBpbmNsdWRlcyBTbWFsbFZlY3RvcgorICAgIC8vIGl0ZXJhdG9ycyk6IHN0ZDo6dW5pbml0aWFsaXplZF9jb3B5IG9wdGltaXplcyB0byBtZW1tb3ZlLCBidXQgd2UgY2FuCisgICAgLy8gdXNlIG1lbWNweSBoZXJlLiBOb3RlIHRoYXQgSSBhbmQgRSBhcmUgaXRlcmF0b3JzIGFuZCB0aHVzIG1pZ2h0IGJlCisgICAgLy8gaW52YWxpZCBmb3IgbWVtY3B5IGlmIHRoZXkgYXJlIGVxdWFsLgorICAgIGlmIChJICE9IEUpCisgICAgICBtZW1jcHkoRGVzdCwgSSwgKEUgLSBJKSAqIHNpemVvZihUKSk7CisgIH0KKworICAvLy8gRG91YmxlIHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgbWVtb3J5LCBndWFyYW50ZWVpbmcgc3BhY2UgZm9yIGF0CisgIC8vLyBsZWFzdCBvbmUgbW9yZSBlbGVtZW50IG9yIE1pblNpemUgaWYgc3BlY2lmaWVkLgorICB2b2lkIGdyb3coc2l6ZV90IE1pblNpemUgPSAwKSB7CisgICAgdGhpcy0+Z3Jvd19wb2QoTWluU2l6ZSpzaXplb2YoVCksIHNpemVvZihUKSk7CisgIH0KKworcHVibGljOgorICB2b2lkIHB1c2hfYmFjayhjb25zdCBUICZFbHQpIHsKKyAgICBpZiAoTExWTV9VTkxJS0VMWSh0aGlzLT5FbmRYID49IHRoaXMtPkNhcGFjaXR5WCkpCisgICAgICB0aGlzLT5ncm93KCk7CisgICAgbWVtY3B5KHRoaXMtPmVuZCgpLCAmRWx0LCBzaXplb2YoVCkpOworICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKSsxKTsKKyAgfQorCisgIHZvaWQgcG9wX2JhY2soKSB7CisgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmVuZCgpLTEpOworICB9Cit9OworCisvLy8gVGhpcyBjbGFzcyBjb25zaXN0cyBvZiBjb21tb24gY29kZSBmYWN0b3JlZCBvdXQgb2YgdGhlIFNtYWxsVmVjdG9yIGNsYXNzIHRvCisvLy8gcmVkdWNlIGNvZGUgZHVwbGljYXRpb24gYmFzZWQgb24gdGhlIFNtYWxsVmVjdG9yICdOJyB0ZW1wbGF0ZSBwYXJhbWV0ZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFNtYWxsVmVjdG9ySW1wbCA6IHB1YmxpYyBTbWFsbFZlY3RvclRlbXBsYXRlQmFzZTxULCBpc1BvZExpa2U8VD46OnZhbHVlPiB7CisgIHVzaW5nIFN1cGVyQ2xhc3MgPSBTbWFsbFZlY3RvclRlbXBsYXRlQmFzZTxULCBpc1BvZExpa2U8VD46OnZhbHVlPjsKKworcHVibGljOgorICB1c2luZyBpdGVyYXRvciA9IHR5cGVuYW1lIFN1cGVyQ2xhc3M6Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IHR5cGVuYW1lIFN1cGVyQ2xhc3M6OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyBzaXplX3R5cGUgPSB0eXBlbmFtZSBTdXBlckNsYXNzOjpzaXplX3R5cGU7CisKK3Byb3RlY3RlZDoKKyAgLy8gRGVmYXVsdCBjdG9yIC0gSW5pdGlhbGl6ZSB0byBlbXB0eS4KKyAgZXhwbGljaXQgU21hbGxWZWN0b3JJbXBsKHVuc2lnbmVkIE4pCisgICAgOiBTbWFsbFZlY3RvclRlbXBsYXRlQmFzZTxULCBpc1BvZExpa2U8VD46OnZhbHVlPihOKnNpemVvZihUKSkgeworICB9CisKK3B1YmxpYzoKKyAgU21hbGxWZWN0b3JJbXBsKGNvbnN0IFNtYWxsVmVjdG9ySW1wbCAmKSA9IGRlbGV0ZTsKKworICB+U21hbGxWZWN0b3JJbXBsKCkgeworICAgIC8vIFN1YmNsYXNzIGhhcyBhbHJlYWR5IGRlc3RydWN0ZWQgdGhpcyB2ZWN0b3IncyBlbGVtZW50cy4KKyAgICAvLyBJZiB0aGlzIHdhc24ndCBncm93biBmcm9tIHRoZSBpbmxpbmUgY29weSwgZGVhbGxvY2F0ZSB0aGUgb2xkIHNwYWNlLgorICAgIGlmICghdGhpcy0+aXNTbWFsbCgpKQorICAgICAgZnJlZSh0aGlzLT5iZWdpbigpKTsKKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgdGhpcy0+ZGVzdHJveV9yYW5nZSh0aGlzLT5iZWdpbigpLCB0aGlzLT5lbmQoKSk7CisgICAgdGhpcy0+RW5kWCA9IHRoaXMtPkJlZ2luWDsKKyAgfQorCisgIHZvaWQgcmVzaXplKHNpemVfdHlwZSBOKSB7CisgICAgaWYgKE4gPCB0aGlzLT5zaXplKCkpIHsKKyAgICAgIHRoaXMtPmRlc3Ryb3lfcmFuZ2UodGhpcy0+YmVnaW4oKStOLCB0aGlzLT5lbmQoKSk7CisgICAgICB0aGlzLT5zZXRFbmQodGhpcy0+YmVnaW4oKStOKTsKKyAgICB9IGVsc2UgaWYgKE4gPiB0aGlzLT5zaXplKCkpIHsKKyAgICAgIGlmICh0aGlzLT5jYXBhY2l0eSgpIDwgTikKKyAgICAgICAgdGhpcy0+Z3JvdyhOKTsKKyAgICAgIGZvciAoYXV0byBJID0gdGhpcy0+ZW5kKCksIEUgPSB0aGlzLT5iZWdpbigpICsgTjsgSSAhPSBFOyArK0kpCisgICAgICAgIG5ldyAoJipJKSBUKCk7CisgICAgICB0aGlzLT5zZXRFbmQodGhpcy0+YmVnaW4oKStOKTsKKyAgICB9CisgIH0KKworICB2b2lkIHJlc2l6ZShzaXplX3R5cGUgTiwgY29uc3QgVCAmTlYpIHsKKyAgICBpZiAoTiA8IHRoaXMtPnNpemUoKSkgeworICAgICAgdGhpcy0+ZGVzdHJveV9yYW5nZSh0aGlzLT5iZWdpbigpK04sIHRoaXMtPmVuZCgpKTsKKyAgICAgIHRoaXMtPnNldEVuZCh0aGlzLT5iZWdpbigpK04pOworICAgIH0gZWxzZSBpZiAoTiA+IHRoaXMtPnNpemUoKSkgeworICAgICAgaWYgKHRoaXMtPmNhcGFjaXR5KCkgPCBOKQorICAgICAgICB0aGlzLT5ncm93KE4pOworICAgICAgc3RkOjp1bmluaXRpYWxpemVkX2ZpbGwodGhpcy0+ZW5kKCksIHRoaXMtPmJlZ2luKCkrTiwgTlYpOworICAgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmJlZ2luKCkrTik7CisgICAgfQorICB9CisKKyAgdm9pZCByZXNlcnZlKHNpemVfdHlwZSBOKSB7CisgICAgaWYgKHRoaXMtPmNhcGFjaXR5KCkgPCBOKQorICAgICAgdGhpcy0+Z3JvdyhOKTsKKyAgfQorCisgIExMVk1fTk9ESVNDQVJEIFQgcG9wX2JhY2tfdmFsKCkgeworICAgIFQgUmVzdWx0ID0gOjpzdGQ6Om1vdmUodGhpcy0+YmFjaygpKTsKKyAgICB0aGlzLT5wb3BfYmFjaygpOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICB2b2lkIHN3YXAoU21hbGxWZWN0b3JJbXBsICZSSFMpOworCisgIC8vLyBBZGQgdGhlIHNwZWNpZmllZCByYW5nZSB0byB0aGUgZW5kIG9mIHRoZSBTbWFsbFZlY3Rvci4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIGluX2l0ZXIsCisgICAgICAgICAgICB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8aW5faXRlcj46Oml0ZXJhdG9yX2NhdGVnb3J5LAorICAgICAgICAgICAgICAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnPjo6dmFsdWU+Ojp0eXBlPgorICB2b2lkIGFwcGVuZChpbl9pdGVyIGluX3N0YXJ0LCBpbl9pdGVyIGluX2VuZCkgeworICAgIHNpemVfdHlwZSBOdW1JbnB1dHMgPSBzdGQ6OmRpc3RhbmNlKGluX3N0YXJ0LCBpbl9lbmQpOworICAgIC8vIEdyb3cgYWxsb2NhdGVkIHNwYWNlIGlmIG5lZWRlZC4KKyAgICBpZiAoTnVtSW5wdXRzID4gc2l6ZV90eXBlKHRoaXMtPmNhcGFjaXR5X3B0cigpLXRoaXMtPmVuZCgpKSkKKyAgICAgIHRoaXMtPmdyb3codGhpcy0+c2l6ZSgpK051bUlucHV0cyk7CisKKyAgICAvLyBDb3B5IHRoZSBuZXcgZWxlbWVudHMgb3Zlci4KKyAgICB0aGlzLT51bmluaXRpYWxpemVkX2NvcHkoaW5fc3RhcnQsIGluX2VuZCwgdGhpcy0+ZW5kKCkpOworICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKSArIE51bUlucHV0cyk7CisgIH0KKworICAvLy8gQWRkIHRoZSBzcGVjaWZpZWQgcmFuZ2UgdG8gdGhlIGVuZCBvZiB0aGUgU21hbGxWZWN0b3IuCisgIHZvaWQgYXBwZW5kKHNpemVfdHlwZSBOdW1JbnB1dHMsIGNvbnN0IFQgJkVsdCkgeworICAgIC8vIEdyb3cgYWxsb2NhdGVkIHNwYWNlIGlmIG5lZWRlZC4KKyAgICBpZiAoTnVtSW5wdXRzID4gc2l6ZV90eXBlKHRoaXMtPmNhcGFjaXR5X3B0cigpLXRoaXMtPmVuZCgpKSkKKyAgICAgIHRoaXMtPmdyb3codGhpcy0+c2l6ZSgpK051bUlucHV0cyk7CisKKyAgICAvLyBDb3B5IHRoZSBuZXcgZWxlbWVudHMgb3Zlci4KKyAgICBzdGQ6OnVuaW5pdGlhbGl6ZWRfZmlsbF9uKHRoaXMtPmVuZCgpLCBOdW1JbnB1dHMsIEVsdCk7CisgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmVuZCgpICsgTnVtSW5wdXRzKTsKKyAgfQorCisgIHZvaWQgYXBwZW5kKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBJTCkgeworICAgIGFwcGVuZChJTC5iZWdpbigpLCBJTC5lbmQoKSk7CisgIH0KKworICAvLyBGSVhNRTogQ29uc2lkZXIgYXNzaWduaW5nIG92ZXIgZXhpc3RpbmcgZWxlbWVudHMsIHJhdGhlciB0aGFuIGNsZWFyaW5nICYKKyAgLy8gcmUtaW5pdGlhbGl6aW5nIHRoZW0gLSBmb3IgYWxsIGFzc2lnbiguLi4pIHZhcmlhbnRzLgorCisgIHZvaWQgYXNzaWduKHNpemVfdHlwZSBOdW1FbHRzLCBjb25zdCBUICZFbHQpIHsKKyAgICBjbGVhcigpOworICAgIGlmICh0aGlzLT5jYXBhY2l0eSgpIDwgTnVtRWx0cykKKyAgICAgIHRoaXMtPmdyb3coTnVtRWx0cyk7CisgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmJlZ2luKCkrTnVtRWx0cyk7CisgICAgc3RkOjp1bmluaXRpYWxpemVkX2ZpbGwodGhpcy0+YmVnaW4oKSwgdGhpcy0+ZW5kKCksIEVsdCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgaW5faXRlciwKKyAgICAgICAgICAgIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTwKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxpbl9pdGVyPjo6aXRlcmF0b3JfY2F0ZWdvcnksCisgICAgICAgICAgICAgICAgc3RkOjppbnB1dF9pdGVyYXRvcl90YWc+Ojp2YWx1ZT46OnR5cGU+CisgIHZvaWQgYXNzaWduKGluX2l0ZXIgaW5fc3RhcnQsIGluX2l0ZXIgaW5fZW5kKSB7CisgICAgY2xlYXIoKTsKKyAgICBhcHBlbmQoaW5fc3RhcnQsIGluX2VuZCk7CisgIH0KKworICB2b2lkIGFzc2lnbihzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gSUwpIHsKKyAgICBjbGVhcigpOworICAgIGFwcGVuZChJTCk7CisgIH0KKworICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBDSSkgeworICAgIC8vIEp1c3QgY2FzdCBhd2F5IGNvbnN0bmVzcyBiZWNhdXNlIHRoaXMgaXMgYSBub24tY29uc3QgbWVtYmVyIGZ1bmN0aW9uLgorICAgIGl0ZXJhdG9yIEkgPSBjb25zdF9jYXN0PGl0ZXJhdG9yPihDSSk7CisKKyAgICBhc3NlcnQoSSA+PSB0aGlzLT5iZWdpbigpICYmICJJdGVyYXRvciB0byBlcmFzZSBpcyBvdXQgb2YgYm91bmRzLiIpOworICAgIGFzc2VydChJIDwgdGhpcy0+ZW5kKCkgJiYgIkVyYXNpbmcgYXQgcGFzdC10aGUtZW5kIGl0ZXJhdG9yLiIpOworCisgICAgaXRlcmF0b3IgTiA9IEk7CisgICAgLy8gU2hpZnQgYWxsIGVsdHMgZG93biBvbmUuCisgICAgc3RkOjptb3ZlKEkrMSwgdGhpcy0+ZW5kKCksIEkpOworICAgIC8vIERyb3AgdGhlIGxhc3QgZWx0LgorICAgIHRoaXMtPnBvcF9iYWNrKCk7CisgICAgcmV0dXJuKE4pOworICB9CisKKyAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgQ1MsIGNvbnN0X2l0ZXJhdG9yIENFKSB7CisgICAgLy8gSnVzdCBjYXN0IGF3YXkgY29uc3RuZXNzIGJlY2F1c2UgdGhpcyBpcyBhIG5vbi1jb25zdCBtZW1iZXIgZnVuY3Rpb24uCisgICAgaXRlcmF0b3IgUyA9IGNvbnN0X2Nhc3Q8aXRlcmF0b3I+KENTKTsKKyAgICBpdGVyYXRvciBFID0gY29uc3RfY2FzdDxpdGVyYXRvcj4oQ0UpOworCisgICAgYXNzZXJ0KFMgPj0gdGhpcy0+YmVnaW4oKSAmJiAiUmFuZ2UgdG8gZXJhc2UgaXMgb3V0IG9mIGJvdW5kcy4iKTsKKyAgICBhc3NlcnQoUyA8PSBFICYmICJUcnlpbmcgdG8gZXJhc2UgaW52YWxpZCByYW5nZS4iKTsKKyAgICBhc3NlcnQoRSA8PSB0aGlzLT5lbmQoKSAmJiAiVHJ5aW5nIHRvIGVyYXNlIHBhc3QgdGhlIGVuZC4iKTsKKworICAgIGl0ZXJhdG9yIE4gPSBTOworICAgIC8vIFNoaWZ0IGFsbCBlbHRzIGRvd24uCisgICAgaXRlcmF0b3IgSSA9IHN0ZDo6bW92ZShFLCB0aGlzLT5lbmQoKSwgUyk7CisgICAgLy8gRHJvcCB0aGUgbGFzdCBlbHRzLgorICAgIHRoaXMtPmRlc3Ryb3lfcmFuZ2UoSSwgdGhpcy0+ZW5kKCkpOworICAgIHRoaXMtPnNldEVuZChJKTsKKyAgICByZXR1cm4oTik7CisgIH0KKworICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgSSwgVCAmJkVsdCkgeworICAgIGlmIChJID09IHRoaXMtPmVuZCgpKSB7ICAvLyBJbXBvcnRhbnQgc3BlY2lhbCBjYXNlIGZvciBlbXB0eSB2ZWN0b3IuCisgICAgICB0aGlzLT5wdXNoX2JhY2soOjpzdGQ6Om1vdmUoRWx0KSk7CisgICAgICByZXR1cm4gdGhpcy0+ZW5kKCktMTsKKyAgICB9CisKKyAgICBhc3NlcnQoSSA+PSB0aGlzLT5iZWdpbigpICYmICJJbnNlcnRpb24gaXRlcmF0b3IgaXMgb3V0IG9mIGJvdW5kcy4iKTsKKyAgICBhc3NlcnQoSSA8PSB0aGlzLT5lbmQoKSAmJiAiSW5zZXJ0aW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgdmVjdG9yLiIpOworCisgICAgaWYgKHRoaXMtPkVuZFggPj0gdGhpcy0+Q2FwYWNpdHlYKSB7CisgICAgICBzaXplX3QgRWx0Tm8gPSBJLXRoaXMtPmJlZ2luKCk7CisgICAgICB0aGlzLT5ncm93KCk7CisgICAgICBJID0gdGhpcy0+YmVnaW4oKStFbHRObzsKKyAgICB9CisKKyAgICA6Om5ldyAoKHZvaWQqKSB0aGlzLT5lbmQoKSkgVCg6OnN0ZDo6bW92ZSh0aGlzLT5iYWNrKCkpKTsKKyAgICAvLyBQdXNoIGV2ZXJ5dGhpbmcgZWxzZSBvdmVyLgorICAgIHN0ZDo6bW92ZV9iYWNrd2FyZChJLCB0aGlzLT5lbmQoKS0xLCB0aGlzLT5lbmQoKSk7CisgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmVuZCgpKzEpOworCisgICAgLy8gSWYgd2UganVzdCBtb3ZlZCB0aGUgZWxlbWVudCB3ZSdyZSBpbnNlcnRpbmcsIGJlIHN1cmUgdG8gdXBkYXRlCisgICAgLy8gdGhlIHJlZmVyZW5jZS4KKyAgICBUICpFbHRQdHIgPSAmRWx0OworICAgIGlmIChJIDw9IEVsdFB0ciAmJiBFbHRQdHIgPCB0aGlzLT5FbmRYKQorICAgICAgKytFbHRQdHI7CisKKyAgICAqSSA9IDo6c3RkOjptb3ZlKCpFbHRQdHIpOworICAgIHJldHVybiBJOworICB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIEksIGNvbnN0IFQgJkVsdCkgeworICAgIGlmIChJID09IHRoaXMtPmVuZCgpKSB7ICAvLyBJbXBvcnRhbnQgc3BlY2lhbCBjYXNlIGZvciBlbXB0eSB2ZWN0b3IuCisgICAgICB0aGlzLT5wdXNoX2JhY2soRWx0KTsKKyAgICAgIHJldHVybiB0aGlzLT5lbmQoKS0xOworICAgIH0KKworICAgIGFzc2VydChJID49IHRoaXMtPmJlZ2luKCkgJiYgIkluc2VydGlvbiBpdGVyYXRvciBpcyBvdXQgb2YgYm91bmRzLiIpOworICAgIGFzc2VydChJIDw9IHRoaXMtPmVuZCgpICYmICJJbnNlcnRpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSB2ZWN0b3IuIik7CisKKyAgICBpZiAodGhpcy0+RW5kWCA+PSB0aGlzLT5DYXBhY2l0eVgpIHsKKyAgICAgIHNpemVfdCBFbHRObyA9IEktdGhpcy0+YmVnaW4oKTsKKyAgICAgIHRoaXMtPmdyb3coKTsKKyAgICAgIEkgPSB0aGlzLT5iZWdpbigpK0VsdE5vOworICAgIH0KKyAgICA6Om5ldyAoKHZvaWQqKSB0aGlzLT5lbmQoKSkgVChzdGQ6Om1vdmUodGhpcy0+YmFjaygpKSk7CisgICAgLy8gUHVzaCBldmVyeXRoaW5nIGVsc2Ugb3Zlci4KKyAgICBzdGQ6Om1vdmVfYmFja3dhcmQoSSwgdGhpcy0+ZW5kKCktMSwgdGhpcy0+ZW5kKCkpOworICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKSsxKTsKKworICAgIC8vIElmIHdlIGp1c3QgbW92ZWQgdGhlIGVsZW1lbnQgd2UncmUgaW5zZXJ0aW5nLCBiZSBzdXJlIHRvIHVwZGF0ZQorICAgIC8vIHRoZSByZWZlcmVuY2UuCisgICAgY29uc3QgVCAqRWx0UHRyID0gJkVsdDsKKyAgICBpZiAoSSA8PSBFbHRQdHIgJiYgRWx0UHRyIDwgdGhpcy0+RW5kWCkKKyAgICAgICsrRWx0UHRyOworCisgICAgKkkgPSAqRWx0UHRyOworICAgIHJldHVybiBJOworICB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIEksIHNpemVfdHlwZSBOdW1Ub0luc2VydCwgY29uc3QgVCAmRWx0KSB7CisgICAgLy8gQ29udmVydCBpdGVyYXRvciB0byBlbHQjIHRvIGF2b2lkIGludmFsaWRhdGluZyBpdGVyYXRvciB3aGVuIHdlIHJlc2VydmUoKQorICAgIHNpemVfdCBJbnNlcnRFbHQgPSBJIC0gdGhpcy0+YmVnaW4oKTsKKworICAgIGlmIChJID09IHRoaXMtPmVuZCgpKSB7ICAvLyBJbXBvcnRhbnQgc3BlY2lhbCBjYXNlIGZvciBlbXB0eSB2ZWN0b3IuCisgICAgICBhcHBlbmQoTnVtVG9JbnNlcnQsIEVsdCk7CisgICAgICByZXR1cm4gdGhpcy0+YmVnaW4oKStJbnNlcnRFbHQ7CisgICAgfQorCisgICAgYXNzZXJ0KEkgPj0gdGhpcy0+YmVnaW4oKSAmJiAiSW5zZXJ0aW9uIGl0ZXJhdG9yIGlzIG91dCBvZiBib3VuZHMuIik7CisgICAgYXNzZXJ0KEkgPD0gdGhpcy0+ZW5kKCkgJiYgIkluc2VydGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIHZlY3Rvci4iKTsKKworICAgIC8vIEVuc3VyZSB0aGVyZSBpcyBlbm91Z2ggc3BhY2UuCisgICAgcmVzZXJ2ZSh0aGlzLT5zaXplKCkgKyBOdW1Ub0luc2VydCk7CisKKyAgICAvLyBVbmludmFsaWRhdGUgdGhlIGl0ZXJhdG9yLgorICAgIEkgPSB0aGlzLT5iZWdpbigpK0luc2VydEVsdDsKKworICAgIC8vIElmIHRoZXJlIGFyZSBtb3JlIGVsZW1lbnRzIGJldHdlZW4gdGhlIGluc2VydGlvbiBwb2ludCBhbmQgdGhlIGVuZCBvZiB0aGUKKyAgICAvLyByYW5nZSB0aGFuIHRoZXJlIGFyZSBiZWluZyBpbnNlcnRlZCwgd2UgY2FuIHVzZSBhIHNpbXBsZSBhcHByb2FjaCB0bworICAgIC8vIGluc2VydGlvbi4gIFNpbmNlIHdlIGFscmVhZHkgcmVzZXJ2ZWQgc3BhY2UsIHdlIGtub3cgdGhhdCB0aGlzIHdvbid0CisgICAgLy8gcmVhbGxvY2F0ZSB0aGUgdmVjdG9yLgorICAgIGlmIChzaXplX3QodGhpcy0+ZW5kKCktSSkgPj0gTnVtVG9JbnNlcnQpIHsKKyAgICAgIFQgKk9sZEVuZCA9IHRoaXMtPmVuZCgpOworICAgICAgYXBwZW5kKHN0ZDo6bW92ZV9pdGVyYXRvcjxpdGVyYXRvcj4odGhpcy0+ZW5kKCkgLSBOdW1Ub0luc2VydCksCisgICAgICAgICAgICAgc3RkOjptb3ZlX2l0ZXJhdG9yPGl0ZXJhdG9yPih0aGlzLT5lbmQoKSkpOworCisgICAgICAvLyBDb3B5IHRoZSBleGlzdGluZyBlbGVtZW50cyB0aGF0IGdldCByZXBsYWNlZC4KKyAgICAgIHN0ZDo6bW92ZV9iYWNrd2FyZChJLCBPbGRFbmQtTnVtVG9JbnNlcnQsIE9sZEVuZCk7CisKKyAgICAgIHN0ZDo6ZmlsbF9uKEksIE51bVRvSW5zZXJ0LCBFbHQpOworICAgICAgcmV0dXJuIEk7CisgICAgfQorCisgICAgLy8gT3RoZXJ3aXNlLCB3ZSdyZSBpbnNlcnRpbmcgbW9yZSBlbGVtZW50cyB0aGFuIGV4aXN0IGFscmVhZHksIGFuZCB3ZSdyZQorICAgIC8vIG5vdCBpbnNlcnRpbmcgYXQgdGhlIGVuZC4KKworICAgIC8vIE1vdmUgb3ZlciB0aGUgZWxlbWVudHMgdGhhdCB3ZSdyZSBhYm91dCB0byBvdmVyd3JpdGUuCisgICAgVCAqT2xkRW5kID0gdGhpcy0+ZW5kKCk7CisgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmVuZCgpICsgTnVtVG9JbnNlcnQpOworICAgIHNpemVfdCBOdW1PdmVyd3JpdHRlbiA9IE9sZEVuZC1JOworICAgIHRoaXMtPnVuaW5pdGlhbGl6ZWRfbW92ZShJLCBPbGRFbmQsIHRoaXMtPmVuZCgpLU51bU92ZXJ3cml0dGVuKTsKKworICAgIC8vIFJlcGxhY2UgdGhlIG92ZXJ3cml0dGVuIHBhcnQuCisgICAgc3RkOjpmaWxsX24oSSwgTnVtT3ZlcndyaXR0ZW4sIEVsdCk7CisKKyAgICAvLyBJbnNlcnQgdGhlIG5vbi1vdmVyd3JpdHRlbiBtaWRkbGUgcGFydC4KKyAgICBzdGQ6OnVuaW5pdGlhbGl6ZWRfZmlsbF9uKE9sZEVuZCwgTnVtVG9JbnNlcnQtTnVtT3ZlcndyaXR0ZW4sIEVsdCk7CisgICAgcmV0dXJuIEk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRUeSwKKyAgICAgICAgICAgIHR5cGVuYW1lID0gdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTwKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdFR5Pjo6aXRlcmF0b3JfY2F0ZWdvcnksCisgICAgICAgICAgICAgICAgc3RkOjppbnB1dF9pdGVyYXRvcl90YWc+Ojp2YWx1ZT46OnR5cGU+CisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBJLCBJdFR5IEZyb20sIEl0VHkgVG8pIHsKKyAgICAvLyBDb252ZXJ0IGl0ZXJhdG9yIHRvIGVsdCMgdG8gYXZvaWQgaW52YWxpZGF0aW5nIGl0ZXJhdG9yIHdoZW4gd2UgcmVzZXJ2ZSgpCisgICAgc2l6ZV90IEluc2VydEVsdCA9IEkgLSB0aGlzLT5iZWdpbigpOworCisgICAgaWYgKEkgPT0gdGhpcy0+ZW5kKCkpIHsgIC8vIEltcG9ydGFudCBzcGVjaWFsIGNhc2UgZm9yIGVtcHR5IHZlY3Rvci4KKyAgICAgIGFwcGVuZChGcm9tLCBUbyk7CisgICAgICByZXR1cm4gdGhpcy0+YmVnaW4oKStJbnNlcnRFbHQ7CisgICAgfQorCisgICAgYXNzZXJ0KEkgPj0gdGhpcy0+YmVnaW4oKSAmJiAiSW5zZXJ0aW9uIGl0ZXJhdG9yIGlzIG91dCBvZiBib3VuZHMuIik7CisgICAgYXNzZXJ0KEkgPD0gdGhpcy0+ZW5kKCkgJiYgIkluc2VydGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIHZlY3Rvci4iKTsKKworICAgIHNpemVfdCBOdW1Ub0luc2VydCA9IHN0ZDo6ZGlzdGFuY2UoRnJvbSwgVG8pOworCisgICAgLy8gRW5zdXJlIHRoZXJlIGlzIGVub3VnaCBzcGFjZS4KKyAgICByZXNlcnZlKHRoaXMtPnNpemUoKSArIE51bVRvSW5zZXJ0KTsKKworICAgIC8vIFVuaW52YWxpZGF0ZSB0aGUgaXRlcmF0b3IuCisgICAgSSA9IHRoaXMtPmJlZ2luKCkrSW5zZXJ0RWx0OworCisgICAgLy8gSWYgdGhlcmUgYXJlIG1vcmUgZWxlbWVudHMgYmV0d2VlbiB0aGUgaW5zZXJ0aW9uIHBvaW50IGFuZCB0aGUgZW5kIG9mIHRoZQorICAgIC8vIHJhbmdlIHRoYW4gdGhlcmUgYXJlIGJlaW5nIGluc2VydGVkLCB3ZSBjYW4gdXNlIGEgc2ltcGxlIGFwcHJvYWNoIHRvCisgICAgLy8gaW5zZXJ0aW9uLiAgU2luY2Ugd2UgYWxyZWFkeSByZXNlcnZlZCBzcGFjZSwgd2Uga25vdyB0aGF0IHRoaXMgd29uJ3QKKyAgICAvLyByZWFsbG9jYXRlIHRoZSB2ZWN0b3IuCisgICAgaWYgKHNpemVfdCh0aGlzLT5lbmQoKS1JKSA+PSBOdW1Ub0luc2VydCkgeworICAgICAgVCAqT2xkRW5kID0gdGhpcy0+ZW5kKCk7CisgICAgICBhcHBlbmQoc3RkOjptb3ZlX2l0ZXJhdG9yPGl0ZXJhdG9yPih0aGlzLT5lbmQoKSAtIE51bVRvSW5zZXJ0KSwKKyAgICAgICAgICAgICBzdGQ6Om1vdmVfaXRlcmF0b3I8aXRlcmF0b3I+KHRoaXMtPmVuZCgpKSk7CisKKyAgICAgIC8vIENvcHkgdGhlIGV4aXN0aW5nIGVsZW1lbnRzIHRoYXQgZ2V0IHJlcGxhY2VkLgorICAgICAgc3RkOjptb3ZlX2JhY2t3YXJkKEksIE9sZEVuZC1OdW1Ub0luc2VydCwgT2xkRW5kKTsKKworICAgICAgc3RkOjpjb3B5KEZyb20sIFRvLCBJKTsKKyAgICAgIHJldHVybiBJOworICAgIH0KKworICAgIC8vIE90aGVyd2lzZSwgd2UncmUgaW5zZXJ0aW5nIG1vcmUgZWxlbWVudHMgdGhhbiBleGlzdCBhbHJlYWR5LCBhbmQgd2UncmUKKyAgICAvLyBub3QgaW5zZXJ0aW5nIGF0IHRoZSBlbmQuCisKKyAgICAvLyBNb3ZlIG92ZXIgdGhlIGVsZW1lbnRzIHRoYXQgd2UncmUgYWJvdXQgdG8gb3ZlcndyaXRlLgorICAgIFQgKk9sZEVuZCA9IHRoaXMtPmVuZCgpOworICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKSArIE51bVRvSW5zZXJ0KTsKKyAgICBzaXplX3QgTnVtT3ZlcndyaXR0ZW4gPSBPbGRFbmQtSTsKKyAgICB0aGlzLT51bmluaXRpYWxpemVkX21vdmUoSSwgT2xkRW5kLCB0aGlzLT5lbmQoKS1OdW1PdmVyd3JpdHRlbik7CisKKyAgICAvLyBSZXBsYWNlIHRoZSBvdmVyd3JpdHRlbiBwYXJ0LgorICAgIGZvciAoVCAqSiA9IEk7IE51bU92ZXJ3cml0dGVuID4gMDsgLS1OdW1PdmVyd3JpdHRlbikgeworICAgICAgKkogPSAqRnJvbTsKKyAgICAgICsrSjsgKytGcm9tOworICAgIH0KKworICAgIC8vIEluc2VydCB0aGUgbm9uLW92ZXJ3cml0dGVuIG1pZGRsZSBwYXJ0LgorICAgIHRoaXMtPnVuaW5pdGlhbGl6ZWRfY29weShGcm9tLCBUbywgT2xkRW5kKTsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIEksIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBJTCkgeworICAgIGluc2VydChJLCBJTC5iZWdpbigpLCBJTC5lbmQoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJnVHlwZXM+IHZvaWQgZW1wbGFjZV9iYWNrKEFyZ1R5cGVzICYmLi4uIEFyZ3MpIHsKKyAgICBpZiAoTExWTV9VTkxJS0VMWSh0aGlzLT5FbmRYID49IHRoaXMtPkNhcGFjaXR5WCkpCisgICAgICB0aGlzLT5ncm93KCk7CisgICAgOjpuZXcgKCh2b2lkICopdGhpcy0+ZW5kKCkpIFQoc3RkOjpmb3J3YXJkPEFyZ1R5cGVzPihBcmdzKS4uLik7CisgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmVuZCgpICsgMSk7CisgIH0KKworICBTbWFsbFZlY3RvckltcGwgJm9wZXJhdG9yPShjb25zdCBTbWFsbFZlY3RvckltcGwgJlJIUyk7CisKKyAgU21hbGxWZWN0b3JJbXBsICZvcGVyYXRvcj0oU21hbGxWZWN0b3JJbXBsICYmUkhTKTsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgU21hbGxWZWN0b3JJbXBsICZSSFMpIGNvbnN0IHsKKyAgICBpZiAodGhpcy0+c2l6ZSgpICE9IFJIUy5zaXplKCkpIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gc3RkOjplcXVhbCh0aGlzLT5iZWdpbigpLCB0aGlzLT5lbmQoKSwgUkhTLmJlZ2luKCkpOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTbWFsbFZlY3RvckltcGwgJlJIUykgY29uc3QgeworICAgIHJldHVybiAhKCp0aGlzID09IFJIUyk7CisgIH0KKworICBib29sIG9wZXJhdG9yPChjb25zdCBTbWFsbFZlY3RvckltcGwgJlJIUykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OmxleGljb2dyYXBoaWNhbF9jb21wYXJlKHRoaXMtPmJlZ2luKCksIHRoaXMtPmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJIUy5iZWdpbigpLCBSSFMuZW5kKCkpOworICB9CisKKyAgLy8vIFNldCB0aGUgYXJyYXkgc2l6ZSB0byBccCBOLCB3aGljaCB0aGUgY3VycmVudCBhcnJheSBtdXN0IGhhdmUgZW5vdWdoCisgIC8vLyBjYXBhY2l0eSBmb3IuCisgIC8vLworICAvLy8gVGhpcyBkb2VzIG5vdCBjb25zdHJ1Y3Qgb3IgZGVzdHJveSBhbnkgZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KKyAgLy8vCisgIC8vLyBDbGllbnRzIGNhbiB1c2UgdGhpcyBpbiBjb25qdW5jdGlvbiB3aXRoIGNhcGFjaXR5KCkgdG8gd3JpdGUgcGFzdCB0aGUgZW5kCisgIC8vLyBvZiB0aGUgYnVmZmVyIHdoZW4gdGhleSBrbm93IHRoYXQgbW9yZSBlbGVtZW50cyBhcmUgYXZhaWxhYmxlLCBhbmQgb25seQorICAvLy8gdXBkYXRlIHRoZSBzaXplIGxhdGVyLiBUaGlzIGF2b2lkcyB0aGUgY29zdCBvZiB2YWx1ZSBpbml0aWFsaXppbmcgZWxlbWVudHMKKyAgLy8vIHdoaWNoIHdpbGwgb25seSBiZSBvdmVyd3JpdHRlbi4KKyAgdm9pZCBzZXRfc2l6ZShzaXplX3R5cGUgTikgeworICAgIGFzc2VydChOIDw9IHRoaXMtPmNhcGFjaXR5KCkpOworICAgIHRoaXMtPnNldEVuZCh0aGlzLT5iZWdpbigpICsgTik7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordm9pZCBTbWFsbFZlY3RvckltcGw8VD46OnN3YXAoU21hbGxWZWN0b3JJbXBsPFQ+ICZSSFMpIHsKKyAgaWYgKHRoaXMgPT0gJlJIUykgcmV0dXJuOworCisgIC8vIFdlIGNhbiBvbmx5IGF2b2lkIGNvcHlpbmcgZWxlbWVudHMgaWYgbmVpdGhlciB2ZWN0b3IgaXMgc21hbGwuCisgIGlmICghdGhpcy0+aXNTbWFsbCgpICYmICFSSFMuaXNTbWFsbCgpKSB7CisgICAgc3RkOjpzd2FwKHRoaXMtPkJlZ2luWCwgUkhTLkJlZ2luWCk7CisgICAgc3RkOjpzd2FwKHRoaXMtPkVuZFgsIFJIUy5FbmRYKTsKKyAgICBzdGQ6OnN3YXAodGhpcy0+Q2FwYWNpdHlYLCBSSFMuQ2FwYWNpdHlYKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKFJIUy5zaXplKCkgPiB0aGlzLT5jYXBhY2l0eSgpKQorICAgIHRoaXMtPmdyb3coUkhTLnNpemUoKSk7CisgIGlmICh0aGlzLT5zaXplKCkgPiBSSFMuY2FwYWNpdHkoKSkKKyAgICBSSFMuZ3Jvdyh0aGlzLT5zaXplKCkpOworCisgIC8vIFN3YXAgdGhlIHNoYXJlZCBlbGVtZW50cy4KKyAgc2l6ZV90IE51bVNoYXJlZCA9IHRoaXMtPnNpemUoKTsKKyAgaWYgKE51bVNoYXJlZCA+IFJIUy5zaXplKCkpIE51bVNoYXJlZCA9IFJIUy5zaXplKCk7CisgIGZvciAoc2l6ZV90eXBlIGkgPSAwOyBpICE9IE51bVNoYXJlZDsgKytpKQorICAgIHN0ZDo6c3dhcCgoKnRoaXMpW2ldLCBSSFNbaV0pOworCisgIC8vIENvcHkgb3ZlciB0aGUgZXh0cmEgZWx0cy4KKyAgaWYgKHRoaXMtPnNpemUoKSA+IFJIUy5zaXplKCkpIHsKKyAgICBzaXplX3QgRWx0RGlmZiA9IHRoaXMtPnNpemUoKSAtIFJIUy5zaXplKCk7CisgICAgdGhpcy0+dW5pbml0aWFsaXplZF9jb3B5KHRoaXMtPmJlZ2luKCkrTnVtU2hhcmVkLCB0aGlzLT5lbmQoKSwgUkhTLmVuZCgpKTsKKyAgICBSSFMuc2V0RW5kKFJIUy5lbmQoKStFbHREaWZmKTsKKyAgICB0aGlzLT5kZXN0cm95X3JhbmdlKHRoaXMtPmJlZ2luKCkrTnVtU2hhcmVkLCB0aGlzLT5lbmQoKSk7CisgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmJlZ2luKCkrTnVtU2hhcmVkKTsKKyAgfSBlbHNlIGlmIChSSFMuc2l6ZSgpID4gdGhpcy0+c2l6ZSgpKSB7CisgICAgc2l6ZV90IEVsdERpZmYgPSBSSFMuc2l6ZSgpIC0gdGhpcy0+c2l6ZSgpOworICAgIHRoaXMtPnVuaW5pdGlhbGl6ZWRfY29weShSSFMuYmVnaW4oKStOdW1TaGFyZWQsIFJIUy5lbmQoKSwgdGhpcy0+ZW5kKCkpOworICAgIHRoaXMtPnNldEVuZCh0aGlzLT5lbmQoKSArIEVsdERpZmYpOworICAgIHRoaXMtPmRlc3Ryb3lfcmFuZ2UoUkhTLmJlZ2luKCkrTnVtU2hhcmVkLCBSSFMuZW5kKCkpOworICAgIFJIUy5zZXRFbmQoUkhTLmJlZ2luKCkrTnVtU2hhcmVkKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1NtYWxsVmVjdG9ySW1wbDxUPiAmU21hbGxWZWN0b3JJbXBsPFQ+OjoKKyAgb3BlcmF0b3I9KGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxUPiAmUkhTKSB7CisgIC8vIEF2b2lkIHNlbGYtYXNzaWdubWVudC4KKyAgaWYgKHRoaXMgPT0gJlJIUykgcmV0dXJuICp0aGlzOworCisgIC8vIElmIHdlIGFscmVhZHkgaGF2ZSBzdWZmaWNpZW50IHNwYWNlLCBhc3NpZ24gdGhlIGNvbW1vbiBlbGVtZW50cywgdGhlbgorICAvLyBkZXN0cm95IGFueSBleGNlc3MuCisgIHNpemVfdCBSSFNTaXplID0gUkhTLnNpemUoKTsKKyAgc2l6ZV90IEN1clNpemUgPSB0aGlzLT5zaXplKCk7CisgIGlmIChDdXJTaXplID49IFJIU1NpemUpIHsKKyAgICAvLyBBc3NpZ24gY29tbW9uIGVsZW1lbnRzLgorICAgIGl0ZXJhdG9yIE5ld0VuZDsKKyAgICBpZiAoUkhTU2l6ZSkKKyAgICAgIE5ld0VuZCA9IHN0ZDo6Y29weShSSFMuYmVnaW4oKSwgUkhTLmJlZ2luKCkrUkhTU2l6ZSwgdGhpcy0+YmVnaW4oKSk7CisgICAgZWxzZQorICAgICAgTmV3RW5kID0gdGhpcy0+YmVnaW4oKTsKKworICAgIC8vIERlc3Ryb3kgZXhjZXNzIGVsZW1lbnRzLgorICAgIHRoaXMtPmRlc3Ryb3lfcmFuZ2UoTmV3RW5kLCB0aGlzLT5lbmQoKSk7CisKKyAgICAvLyBUcmltLgorICAgIHRoaXMtPnNldEVuZChOZXdFbmQpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIElmIHdlIGhhdmUgdG8gZ3JvdyB0byBoYXZlIGVub3VnaCBlbGVtZW50cywgZGVzdHJveSB0aGUgY3VycmVudCBlbGVtZW50cy4KKyAgLy8gVGhpcyBhbGxvd3MgdXMgdG8gYXZvaWQgY29weWluZyB0aGVtIGR1cmluZyB0aGUgZ3Jvdy4KKyAgLy8gRklYTUU6IGRvbid0IGRvIHRoaXMgaWYgdGhleSdyZSBlZmZpY2llbnRseSBtb3ZlYWJsZS4KKyAgaWYgKHRoaXMtPmNhcGFjaXR5KCkgPCBSSFNTaXplKSB7CisgICAgLy8gRGVzdHJveSBjdXJyZW50IGVsZW1lbnRzLgorICAgIHRoaXMtPmRlc3Ryb3lfcmFuZ2UodGhpcy0+YmVnaW4oKSwgdGhpcy0+ZW5kKCkpOworICAgIHRoaXMtPnNldEVuZCh0aGlzLT5iZWdpbigpKTsKKyAgICBDdXJTaXplID0gMDsKKyAgICB0aGlzLT5ncm93KFJIU1NpemUpOworICB9IGVsc2UgaWYgKEN1clNpemUpIHsKKyAgICAvLyBPdGhlcndpc2UsIHVzZSBhc3NpZ25tZW50IGZvciB0aGUgYWxyZWFkeS1jb25zdHJ1Y3RlZCBlbGVtZW50cy4KKyAgICBzdGQ6OmNvcHkoUkhTLmJlZ2luKCksIFJIUy5iZWdpbigpK0N1clNpemUsIHRoaXMtPmJlZ2luKCkpOworICB9CisKKyAgLy8gQ29weSBjb25zdHJ1Y3QgdGhlIG5ldyBlbGVtZW50cyBpbiBwbGFjZS4KKyAgdGhpcy0+dW5pbml0aWFsaXplZF9jb3B5KFJIUy5iZWdpbigpK0N1clNpemUsIFJIUy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMtPmJlZ2luKCkrQ3VyU2l6ZSk7CisKKyAgLy8gU2V0IGVuZC4KKyAgdGhpcy0+c2V0RW5kKHRoaXMtPmJlZ2luKCkrUkhTU2l6ZSk7CisgIHJldHVybiAqdGhpczsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitTbWFsbFZlY3RvckltcGw8VD4gJlNtYWxsVmVjdG9ySW1wbDxUPjo6b3BlcmF0b3I9KFNtYWxsVmVjdG9ySW1wbDxUPiAmJlJIUykgeworICAvLyBBdm9pZCBzZWxmLWFzc2lnbm1lbnQuCisgIGlmICh0aGlzID09ICZSSFMpIHJldHVybiAqdGhpczsKKworICAvLyBJZiB0aGUgUkhTIGlzbid0IHNtYWxsLCBjbGVhciB0aGlzIHZlY3RvciBhbmQgdGhlbiBzdGVhbCBpdHMgYnVmZmVyLgorICBpZiAoIVJIUy5pc1NtYWxsKCkpIHsKKyAgICB0aGlzLT5kZXN0cm95X3JhbmdlKHRoaXMtPmJlZ2luKCksIHRoaXMtPmVuZCgpKTsKKyAgICBpZiAoIXRoaXMtPmlzU21hbGwoKSkgZnJlZSh0aGlzLT5iZWdpbigpKTsKKyAgICB0aGlzLT5CZWdpblggPSBSSFMuQmVnaW5YOworICAgIHRoaXMtPkVuZFggPSBSSFMuRW5kWDsKKyAgICB0aGlzLT5DYXBhY2l0eVggPSBSSFMuQ2FwYWNpdHlYOworICAgIFJIUy5yZXNldFRvU21hbGwoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBJZiB3ZSBhbHJlYWR5IGhhdmUgc3VmZmljaWVudCBzcGFjZSwgYXNzaWduIHRoZSBjb21tb24gZWxlbWVudHMsIHRoZW4KKyAgLy8gZGVzdHJveSBhbnkgZXhjZXNzLgorICBzaXplX3QgUkhTU2l6ZSA9IFJIUy5zaXplKCk7CisgIHNpemVfdCBDdXJTaXplID0gdGhpcy0+c2l6ZSgpOworICBpZiAoQ3VyU2l6ZSA+PSBSSFNTaXplKSB7CisgICAgLy8gQXNzaWduIGNvbW1vbiBlbGVtZW50cy4KKyAgICBpdGVyYXRvciBOZXdFbmQgPSB0aGlzLT5iZWdpbigpOworICAgIGlmIChSSFNTaXplKQorICAgICAgTmV3RW5kID0gc3RkOjptb3ZlKFJIUy5iZWdpbigpLCBSSFMuZW5kKCksIE5ld0VuZCk7CisKKyAgICAvLyBEZXN0cm95IGV4Y2VzcyBlbGVtZW50cyBhbmQgdHJpbSB0aGUgYm91bmRzLgorICAgIHRoaXMtPmRlc3Ryb3lfcmFuZ2UoTmV3RW5kLCB0aGlzLT5lbmQoKSk7CisgICAgdGhpcy0+c2V0RW5kKE5ld0VuZCk7CisKKyAgICAvLyBDbGVhciB0aGUgUkhTLgorICAgIFJIUy5jbGVhcigpOworCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gSWYgd2UgaGF2ZSB0byBncm93IHRvIGhhdmUgZW5vdWdoIGVsZW1lbnRzLCBkZXN0cm95IHRoZSBjdXJyZW50IGVsZW1lbnRzLgorICAvLyBUaGlzIGFsbG93cyB1cyB0byBhdm9pZCBjb3B5aW5nIHRoZW0gZHVyaW5nIHRoZSBncm93LgorICAvLyBGSVhNRTogdGhpcyBtYXkgbm90IGFjdHVhbGx5IG1ha2UgYW55IHNlbnNlIGlmIHdlIGNhbiBlZmZpY2llbnRseSBtb3ZlCisgIC8vIGVsZW1lbnRzLgorICBpZiAodGhpcy0+Y2FwYWNpdHkoKSA8IFJIU1NpemUpIHsKKyAgICAvLyBEZXN0cm95IGN1cnJlbnQgZWxlbWVudHMuCisgICAgdGhpcy0+ZGVzdHJveV9yYW5nZSh0aGlzLT5iZWdpbigpLCB0aGlzLT5lbmQoKSk7CisgICAgdGhpcy0+c2V0RW5kKHRoaXMtPmJlZ2luKCkpOworICAgIEN1clNpemUgPSAwOworICAgIHRoaXMtPmdyb3coUkhTU2l6ZSk7CisgIH0gZWxzZSBpZiAoQ3VyU2l6ZSkgeworICAgIC8vIE90aGVyd2lzZSwgdXNlIGFzc2lnbm1lbnQgZm9yIHRoZSBhbHJlYWR5LWNvbnN0cnVjdGVkIGVsZW1lbnRzLgorICAgIHN0ZDo6bW92ZShSSFMuYmVnaW4oKSwgUkhTLmJlZ2luKCkrQ3VyU2l6ZSwgdGhpcy0+YmVnaW4oKSk7CisgIH0KKworICAvLyBNb3ZlLWNvbnN0cnVjdCB0aGUgbmV3IGVsZW1lbnRzIGluIHBsYWNlLgorICB0aGlzLT51bmluaXRpYWxpemVkX21vdmUoUkhTLmJlZ2luKCkrQ3VyU2l6ZSwgUkhTLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy0+YmVnaW4oKStDdXJTaXplKTsKKworICAvLyBTZXQgZW5kLgorICB0aGlzLT5zZXRFbmQodGhpcy0+YmVnaW4oKStSSFNTaXplKTsKKworICBSSFMuY2xlYXIoKTsKKyAgcmV0dXJuICp0aGlzOworfQorCisvLy8gU3RvcmFnZSBmb3IgdGhlIFNtYWxsVmVjdG9yIGVsZW1lbnRzIHdoaWNoIGFyZW4ndCBjb250YWluZWQgaW4KKy8vLyBTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uLiBUaGVyZSBhcmUgJ04tMScgZWxlbWVudHMgaGVyZS4gVGhlIHJlbWFpbmluZyAnMScKKy8vLyBlbGVtZW50IGlzIGluIHRoZSBiYXNlIGNsYXNzLiBUaGlzIGlzIHNwZWNpYWxpemVkIGZvciB0aGUgTj0xIGFuZCBOPTAgY2FzZXMKKy8vLyB0byBhdm9pZCBhbGxvY2F0aW5nIHVubmVjZXNzYXJ5IHN0b3JhZ2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdW5zaWduZWQgTj4KK3N0cnVjdCBTbWFsbFZlY3RvclN0b3JhZ2UgeworICB0eXBlbmFtZSBTbWFsbFZlY3RvclRlbXBsYXRlQ29tbW9uPFQ+OjpVIElubGluZUVsdHNbTiAtIDFdOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgU21hbGxWZWN0b3JTdG9yYWdlPFQsIDE+IHt9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBTbWFsbFZlY3RvclN0b3JhZ2U8VCwgMD4ge307CisKKy8vLyBUaGlzIGlzIGEgJ3ZlY3RvcicgKHJlYWxseSwgYSB2YXJpYWJsZS1zaXplZCBhcnJheSksIG9wdGltaXplZAorLy8vIGZvciB0aGUgY2FzZSB3aGVuIHRoZSBhcnJheSBpcyBzbWFsbC4gIEl0IGNvbnRhaW5zIHNvbWUgbnVtYmVyIG9mIGVsZW1lbnRzCisvLy8gaW4tcGxhY2UsIHdoaWNoIGFsbG93cyBpdCB0byBhdm9pZCBoZWFwIGFsbG9jYXRpb24gd2hlbiB0aGUgYWN0dWFsIG51bWJlciBvZgorLy8vIGVsZW1lbnRzIGlzIGJlbG93IHRoYXQgdGhyZXNob2xkLiAgVGhpcyBhbGxvd3Mgbm9ybWFsICJzbWFsbCIgY2FzZXMgdG8gYmUKKy8vLyBmYXN0IHdpdGhvdXQgbG9zaW5nIGdlbmVyYWxpdHkgZm9yIGxhcmdlIGlucHV0cy4KKy8vLworLy8vIE5vdGUgdGhhdCB0aGlzIGRvZXMgbm90IGF0dGVtcHQgdG8gYmUgZXhjZXB0aW9uIHNhZmUuCisvLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB1bnNpZ25lZCBOPgorY2xhc3MgU21hbGxWZWN0b3IgOiBwdWJsaWMgU21hbGxWZWN0b3JJbXBsPFQ+IHsKKyAgLy8vIElubGluZSBzcGFjZSBmb3IgZWxlbWVudHMgd2hpY2ggYXJlbid0IHN0b3JlZCBpbiB0aGUgYmFzZSBjbGFzcy4KKyAgU21hbGxWZWN0b3JTdG9yYWdlPFQsIE4+IFN0b3JhZ2U7CisKK3B1YmxpYzoKKyAgU21hbGxWZWN0b3IoKSA6IFNtYWxsVmVjdG9ySW1wbDxUPihOKSB7fQorCisgIH5TbWFsbFZlY3RvcigpIHsKKyAgICAvLyBEZXN0cm95IHRoZSBjb25zdHJ1Y3RlZCBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLgorICAgIHRoaXMtPmRlc3Ryb3lfcmFuZ2UodGhpcy0+YmVnaW4oKSwgdGhpcy0+ZW5kKCkpOworICB9CisKKyAgZXhwbGljaXQgU21hbGxWZWN0b3Ioc2l6ZV90IFNpemUsIGNvbnN0IFQgJlZhbHVlID0gVCgpKQorICAgIDogU21hbGxWZWN0b3JJbXBsPFQ+KE4pIHsKKyAgICB0aGlzLT5hc3NpZ24oU2l6ZSwgVmFsdWUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0VHksCisgICAgICAgICAgICB0eXBlbmFtZSA9IHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8CisgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SXRUeT46Oml0ZXJhdG9yX2NhdGVnb3J5LAorICAgICAgICAgICAgICAgIHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnPjo6dmFsdWU+Ojp0eXBlPgorICBTbWFsbFZlY3RvcihJdFR5IFMsIEl0VHkgRSkgOiBTbWFsbFZlY3RvckltcGw8VD4oTikgeworICAgIHRoaXMtPmFwcGVuZChTLCBFKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSYW5nZVR5PgorICBleHBsaWNpdCBTbWFsbFZlY3Rvcihjb25zdCBpdGVyYXRvcl9yYW5nZTxSYW5nZVR5PiAmUikKKyAgICAgIDogU21hbGxWZWN0b3JJbXBsPFQ+KE4pIHsKKyAgICB0aGlzLT5hcHBlbmQoUi5iZWdpbigpLCBSLmVuZCgpKTsKKyAgfQorCisgIFNtYWxsVmVjdG9yKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxUPiBJTCkgOiBTbWFsbFZlY3RvckltcGw8VD4oTikgeworICAgIHRoaXMtPmFzc2lnbihJTCk7CisgIH0KKworICBTbWFsbFZlY3Rvcihjb25zdCBTbWFsbFZlY3RvciAmUkhTKSA6IFNtYWxsVmVjdG9ySW1wbDxUPihOKSB7CisgICAgaWYgKCFSSFMuZW1wdHkoKSkKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxUPjo6b3BlcmF0b3I9KFJIUyk7CisgIH0KKworICBjb25zdCBTbWFsbFZlY3RvciAmb3BlcmF0b3I9KGNvbnN0IFNtYWxsVmVjdG9yICZSSFMpIHsKKyAgICBTbWFsbFZlY3RvckltcGw8VD46Om9wZXJhdG9yPShSSFMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFNtYWxsVmVjdG9yKFNtYWxsVmVjdG9yICYmUkhTKSA6IFNtYWxsVmVjdG9ySW1wbDxUPihOKSB7CisgICAgaWYgKCFSSFMuZW1wdHkoKSkKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxUPjo6b3BlcmF0b3I9KDo6c3RkOjptb3ZlKFJIUykpOworICB9CisKKyAgU21hbGxWZWN0b3IoU21hbGxWZWN0b3JJbXBsPFQ+ICYmUkhTKSA6IFNtYWxsVmVjdG9ySW1wbDxUPihOKSB7CisgICAgaWYgKCFSSFMuZW1wdHkoKSkKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxUPjo6b3BlcmF0b3I9KDo6c3RkOjptb3ZlKFJIUykpOworICB9CisKKyAgY29uc3QgU21hbGxWZWN0b3IgJm9wZXJhdG9yPShTbWFsbFZlY3RvciAmJlJIUykgeworICAgIFNtYWxsVmVjdG9ySW1wbDxUPjo6b3BlcmF0b3I9KDo6c3RkOjptb3ZlKFJIUykpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IFNtYWxsVmVjdG9yICZvcGVyYXRvcj0oU21hbGxWZWN0b3JJbXBsPFQ+ICYmUkhTKSB7CisgICAgU21hbGxWZWN0b3JJbXBsPFQ+OjpvcGVyYXRvcj0oOjpzdGQ6Om1vdmUoUkhTKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgU21hbGxWZWN0b3IgJm9wZXJhdG9yPShzdGQ6OmluaXRpYWxpemVyX2xpc3Q8VD4gSUwpIHsKKyAgICB0aGlzLT5hc3NpZ24oSUwpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4+CitpbmxpbmUgc2l6ZV90IGNhcGFjaXR5X2luX2J5dGVzKGNvbnN0IFNtYWxsVmVjdG9yPFQsIE4+ICZYKSB7CisgIHJldHVybiBYLmNhcGFjaXR5X2luX2J5dGVzKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKK25hbWVzcGFjZSBzdGQgeworCisgIC8vLyBJbXBsZW1lbnQgc3RkOjpzd2FwIGluIHRlcm1zIG9mIFNtYWxsVmVjdG9yIHN3YXAuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIGlubGluZSB2b2lkCisgIHN3YXAobGx2bTo6U21hbGxWZWN0b3JJbXBsPFQ+ICZMSFMsIGxsdm06OlNtYWxsVmVjdG9ySW1wbDxUPiAmUkhTKSB7CisgICAgTEhTLnN3YXAoUkhTKTsKKyAgfQorCisgIC8vLyBJbXBsZW1lbnQgc3RkOjpzd2FwIGluIHRlcm1zIG9mIFNtYWxsVmVjdG9yIHN3YXAuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHVuc2lnbmVkIE4+CisgIGlubGluZSB2b2lkCisgIHN3YXAobGx2bTo6U21hbGxWZWN0b3I8VCwgTj4gJkxIUywgbGx2bTo6U21hbGxWZWN0b3I8VCwgTj4gJlJIUykgeworICAgIExIUy5zd2FwKFJIUyk7CisgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gTExWTV9BRFRfU01BTExWRUNUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3BhcnNlQml0VmVjdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TcGFyc2VCaXRWZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Y2JmNDBjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3BhcnNlQml0VmVjdG9yLmgKQEAgLTAsMCArMSw4ODggQEAKKy8vPT09LSBsbHZtL0FEVC9TcGFyc2VCaXRWZWN0b3IuaCAtIEVmZmljaWVudCBTcGFyc2UgQml0VmVjdG9yIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFNwYXJzZUJpdFZlY3RvciBjbGFzcy4gIFNlZSB0aGUgZG94eWdlbiBjb21tZW50IGZvcgorLy8gU3BhcnNlQml0VmVjdG9yIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIGFsZ29yaXRobSB1c2VkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU1BBUlNFQklUVkVDVE9SX0gKKyNkZWZpbmUgTExWTV9BRFRfU1BBUlNFQklUVkVDVE9SX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaXN0PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBTcGFyc2VCaXRWZWN0b3IgaXMgYW4gaW1wbGVtZW50YXRpb24gb2YgYSBiaXR2ZWN0b3IgdGhhdCBpcyBzcGFyc2UgYnkgb25seQorLy8vIHN0b3JpbmcgdGhlIGVsZW1lbnRzIHRoYXQgaGF2ZSBub24temVybyBiaXRzIHNldC4gIEluIG9yZGVyIHRvIG1ha2UgdGhpcworLy8vIGZhc3QgZm9yIHRoZSBtb3N0IGNvbW1vbiBjYXNlcywgU3BhcnNlQml0VmVjdG9yIGlzIGltcGxlbWVudGVkIGFzIGEgbGlua2VkCisvLy8gbGlzdCBvZiBTcGFyc2VCaXRWZWN0b3JFbGVtZW50cy4gIFdlIG1haW50YWluIGEgcG9pbnRlciB0byB0aGUgbGFzdAorLy8vIFNwYXJzZUJpdFZlY3RvckVsZW1lbnQgYWNjZXNzZWQgKGluIHRoZSBmb3JtIG9mIGEgbGlzdCBpdGVyYXRvciksIGluIG9yZGVyCisvLy8gdG8gbWFrZSBtdWx0aXBsZSBpbi1vcmRlciB0ZXN0L3NldCBjb25zdGFudCB0aW1lIGFmdGVyIHRoZSBmaXJzdCBvbmUgaXMKKy8vLyBleGVjdXRlZC4gIE5vdGUgdGhhdCB1c2luZyB2ZWN0b3JzIHRvIHN0b3JlIFNwYXJzZUJpdFZlY3RvckVsZW1lbnQncyBkb2VzCisvLy8gbm90IHdvcmsgb3V0IHZlcnkgd2VsbCBiZWNhdXNlIGl0IGNhdXNlcyBpbnNlcnRpb24gaW4gdGhlIG1pZGRsZSB0byB0YWtlCisvLy8gZW5vcm1vdXMgYW1vdW50cyBvZiB0aW1lIHdpdGggYSBsYXJnZSBhbW91bnQgb2YgYml0cy4gIE90aGVyIHN0cnVjdHVyZXMgdGhhdAorLy8vIGhhdmUgYmV0dGVyIHdvcnN0IGNhc2VzIGZvciBpbnNlcnRpb24gaW4gdGhlIG1pZGRsZSAodmFyaW91cyBiYWxhbmNlZCB0cmVlcywKKy8vLyBldGMpIGRvIG5vdCBwZXJmb3JtIGFzIHdlbGwgaW4gcHJhY3RpY2UgYXMgYSBsaW5rZWQgbGlzdCB3aXRoIHRoaXMgaXRlcmF0b3IKKy8vLyBrZXB0IHVwIHRvIGRhdGUuICBUaGV5IGFyZSBhbHNvIHNpZ25pZmljYW50bHkgbW9yZSBtZW1vcnkgaW50ZW5zaXZlLgorCit0ZW1wbGF0ZSA8dW5zaWduZWQgRWxlbWVudFNpemUgPSAxMjg+IHN0cnVjdCBTcGFyc2VCaXRWZWN0b3JFbGVtZW50IHsKK3B1YmxpYzoKKyAgdXNpbmcgQml0V29yZCA9IHVuc2lnbmVkIGxvbmc7CisgIHVzaW5nIHNpemVfdHlwZSA9IHVuc2lnbmVkOworICBlbnVtIHsKKyAgICBCSVRXT1JEX1NJWkUgPSBzaXplb2YoQml0V29yZCkgKiBDSEFSX0JJVCwKKyAgICBCSVRXT1JEU19QRVJfRUxFTUVOVCA9IChFbGVtZW50U2l6ZSArIEJJVFdPUkRfU0laRSAtIDEpIC8gQklUV09SRF9TSVpFLAorICAgIEJJVFNfUEVSX0VMRU1FTlQgPSBFbGVtZW50U2l6ZQorICB9OworCitwcml2YXRlOgorICAvLyBJbmRleCBvZiBFbGVtZW50IGluIHRlcm1zIG9mIHdoZXJlIGZpcnN0IGJpdCBzdGFydHMuCisgIHVuc2lnbmVkIEVsZW1lbnRJbmRleDsKKyAgQml0V29yZCBCaXRzW0JJVFdPUkRTX1BFUl9FTEVNRU5UXTsKKworICBTcGFyc2VCaXRWZWN0b3JFbGVtZW50KCkgeworICAgIEVsZW1lbnRJbmRleCA9IH4wVTsKKyAgICBtZW1zZXQoJkJpdHNbMF0sIDAsIHNpemVvZiAoQml0V29yZCkgKiBCSVRXT1JEU19QRVJfRUxFTUVOVCk7CisgIH0KKworcHVibGljOgorICBleHBsaWNpdCBTcGFyc2VCaXRWZWN0b3JFbGVtZW50KHVuc2lnbmVkIElkeCkgeworICAgIEVsZW1lbnRJbmRleCA9IElkeDsKKyAgICBtZW1zZXQoJkJpdHNbMF0sIDAsIHNpemVvZiAoQml0V29yZCkgKiBCSVRXT1JEU19QRVJfRUxFTUVOVCk7CisgIH0KKworICAvLyBDb21wYXJpc29uLgorICBib29sIG9wZXJhdG9yPT0oY29uc3QgU3BhcnNlQml0VmVjdG9yRWxlbWVudCAmUkhTKSBjb25zdCB7CisgICAgaWYgKEVsZW1lbnRJbmRleCAhPSBSSFMuRWxlbWVudEluZGV4KQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBCSVRXT1JEU19QRVJfRUxFTUVOVDsgKytpKQorICAgICAgaWYgKEJpdHNbaV0gIT0gUkhTLkJpdHNbaV0pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTcGFyc2VCaXRWZWN0b3JFbGVtZW50ICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSBSSFMpOworICB9CisKKyAgLy8gUmV0dXJuIHRoZSBiaXRzIHRoYXQgbWFrZSB1cCB3b3JkIElkeCBpbiBvdXIgZWxlbWVudC4KKyAgQml0V29yZCB3b3JkKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIGFzc2VydChJZHggPCBCSVRXT1JEU19QRVJfRUxFTUVOVCk7CisgICAgcmV0dXJuIEJpdHNbSWR4XTsKKyAgfQorCisgIHVuc2lnbmVkIGluZGV4KCkgY29uc3QgeworICAgIHJldHVybiBFbGVtZW50SW5kZXg7CisgIH0KKworICBib29sIGVtcHR5KCkgY29uc3QgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBCSVRXT1JEU19QRVJfRUxFTUVOVDsgKytpKQorICAgICAgaWYgKEJpdHNbaV0pCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHZvaWQgc2V0KHVuc2lnbmVkIElkeCkgeworICAgIEJpdHNbSWR4IC8gQklUV09SRF9TSVpFXSB8PSAxTCA8PCAoSWR4ICUgQklUV09SRF9TSVpFKTsKKyAgfQorCisgIGJvb2wgdGVzdF9hbmRfc2V0KHVuc2lnbmVkIElkeCkgeworICAgIGJvb2wgb2xkID0gdGVzdChJZHgpOworICAgIGlmICghb2xkKSB7CisgICAgICBzZXQoSWR4KTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2b2lkIHJlc2V0KHVuc2lnbmVkIElkeCkgeworICAgIEJpdHNbSWR4IC8gQklUV09SRF9TSVpFXSAmPSB+KDFMIDw8IChJZHggJSBCSVRXT1JEX1NJWkUpKTsKKyAgfQorCisgIGJvb2wgdGVzdCh1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gQml0c1tJZHggLyBCSVRXT1JEX1NJWkVdICYgKDFMIDw8IChJZHggJSBCSVRXT1JEX1NJWkUpKTsKKyAgfQorCisgIHNpemVfdHlwZSBjb3VudCgpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBOdW1CaXRzID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgQklUV09SRFNfUEVSX0VMRU1FTlQ7ICsraSkKKyAgICAgIE51bUJpdHMgKz0gY291bnRQb3B1bGF0aW9uKEJpdHNbaV0pOworICAgIHJldHVybiBOdW1CaXRzOworICB9CisKKyAgLy8vIGZpbmRfZmlyc3QgLSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3Qgc2V0IGJpdC4KKyAgaW50IGZpbmRfZmlyc3QoKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEJJVFdPUkRTX1BFUl9FTEVNRU5UOyArK2kpCisgICAgICBpZiAoQml0c1tpXSAhPSAwKQorICAgICAgICByZXR1cm4gaSAqIEJJVFdPUkRfU0laRSArIGNvdW50VHJhaWxpbmdaZXJvcyhCaXRzW2ldKTsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbGxlZ2FsIGVtcHR5IGVsZW1lbnQiKTsKKyAgfQorCisgIC8vLyBmaW5kX2xhc3QgLSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBzZXQgYml0LgorICBpbnQgZmluZF9sYXN0KCkgY29uc3QgeworICAgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgPCBCSVRXT1JEU19QRVJfRUxFTUVOVDsgKytJKSB7CisgICAgICB1bnNpZ25lZCBJZHggPSBCSVRXT1JEU19QRVJfRUxFTUVOVCAtIEkgLSAxOworICAgICAgaWYgKEJpdHNbSWR4XSAhPSAwKQorICAgICAgICByZXR1cm4gSWR4ICogQklUV09SRF9TSVpFICsgQklUV09SRF9TSVpFIC0KKyAgICAgICAgICAgICAgIGNvdW50TGVhZGluZ1plcm9zKEJpdHNbSWR4XSkgLSAxOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbGxlZ2FsIGVtcHR5IGVsZW1lbnQiKTsKKyAgfQorCisgIC8vLyBmaW5kX25leHQgLSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBzZXQgYml0IHN0YXJ0aW5nIGZyb20gdGhlCisgIC8vLyAiQ3VyciIgYml0LiBSZXR1cm5zIC0xIGlmIHRoZSBuZXh0IHNldCBiaXQgaXMgbm90IGZvdW5kLgorICBpbnQgZmluZF9uZXh0KHVuc2lnbmVkIEN1cnIpIGNvbnN0IHsKKyAgICBpZiAoQ3VyciA+PSBCSVRTX1BFUl9FTEVNRU5UKQorICAgICAgcmV0dXJuIC0xOworCisgICAgdW5zaWduZWQgV29yZFBvcyA9IEN1cnIgLyBCSVRXT1JEX1NJWkU7CisgICAgdW5zaWduZWQgQml0UG9zID0gQ3VyciAlIEJJVFdPUkRfU0laRTsKKyAgICBCaXRXb3JkIENvcHkgPSBCaXRzW1dvcmRQb3NdOworICAgIGFzc2VydChXb3JkUG9zIDw9IEJJVFdPUkRTX1BFUl9FTEVNRU5UCisgICAgICAgICAgICYmICJXb3JkIFBvc2l0aW9uIG91dHNpZGUgb2YgZWxlbWVudCIpOworCisgICAgLy8gTWFzayBvZmYgcHJldmlvdXMgYml0cy4KKyAgICBDb3B5ICY9IH4wVUwgPDwgQml0UG9zOworCisgICAgaWYgKENvcHkgIT0gMCkKKyAgICAgIHJldHVybiBXb3JkUG9zICogQklUV09SRF9TSVpFICsgY291bnRUcmFpbGluZ1plcm9zKENvcHkpOworCisgICAgLy8gQ2hlY2sgc3Vic2VxdWVudCB3b3Jkcy4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBXb3JkUG9zKzE7IGkgPCBCSVRXT1JEU19QRVJfRUxFTUVOVDsgKytpKQorICAgICAgaWYgKEJpdHNbaV0gIT0gMCkKKyAgICAgICAgcmV0dXJuIGkgKiBCSVRXT1JEX1NJWkUgKyBjb3VudFRyYWlsaW5nWmVyb3MoQml0c1tpXSk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgLy8gVW5pb24gdGhpcyBlbGVtZW50IHdpdGggUkhTIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGlzIG9uZSBjaGFuZ2VkLgorICBib29sIHVuaW9uV2l0aChjb25zdCBTcGFyc2VCaXRWZWN0b3JFbGVtZW50ICZSSFMpIHsKKyAgICBib29sIGNoYW5nZWQgPSBmYWxzZTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgQklUV09SRFNfUEVSX0VMRU1FTlQ7ICsraSkgeworICAgICAgQml0V29yZCBvbGQgPSBjaGFuZ2VkID8gMCA6IEJpdHNbaV07CisKKyAgICAgIEJpdHNbaV0gfD0gUkhTLkJpdHNbaV07CisgICAgICBpZiAoIWNoYW5nZWQgJiYgb2xkICE9IEJpdHNbaV0pCisgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gY2hhbmdlZDsKKyAgfQorCisgIC8vIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgYW55IGJpdHMgaW4gY29tbW9uIHdpdGggUkhTCisgIGJvb2wgaW50ZXJzZWN0cyhjb25zdCBTcGFyc2VCaXRWZWN0b3JFbGVtZW50ICZSSFMpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgQklUV09SRFNfUEVSX0VMRU1FTlQ7ICsraSkgeworICAgICAgaWYgKFJIUy5CaXRzW2ldICYgQml0c1tpXSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIEludGVyc2VjdCB0aGlzIEVsZW1lbnQgd2l0aCBSSFMgYW5kIHJldHVybiB0cnVlIGlmIHRoaXMgb25lIGNoYW5nZWQuCisgIC8vIEJlY2FtZVplcm8gaXMgc2V0IHRvIHRydWUgaWYgdGhpcyBlbGVtZW50IGJlY2FtZSBhbGwtemVybyBiaXRzLgorICBib29sIGludGVyc2VjdFdpdGgoY29uc3QgU3BhcnNlQml0VmVjdG9yRWxlbWVudCAmUkhTLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCAmQmVjYW1lWmVybykgeworICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgIGJvb2wgYWxsemVybyA9IHRydWU7CisKKyAgICBCZWNhbWVaZXJvID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEJJVFdPUkRTX1BFUl9FTEVNRU5UOyArK2kpIHsKKyAgICAgIEJpdFdvcmQgb2xkID0gY2hhbmdlZCA/IDAgOiBCaXRzW2ldOworCisgICAgICBCaXRzW2ldICY9IFJIUy5CaXRzW2ldOworICAgICAgaWYgKEJpdHNbaV0gIT0gMCkKKyAgICAgICAgYWxsemVybyA9IGZhbHNlOworCisgICAgICBpZiAoIWNoYW5nZWQgJiYgb2xkICE9IEJpdHNbaV0pCisgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgIH0KKyAgICBCZWNhbWVaZXJvID0gYWxsemVybzsKKyAgICByZXR1cm4gY2hhbmdlZDsKKyAgfQorCisgIC8vIEludGVyc2VjdCB0aGlzIEVsZW1lbnQgd2l0aCB0aGUgY29tcGxlbWVudCBvZiBSSFMgYW5kIHJldHVybiB0cnVlIGlmIHRoaXMKKyAgLy8gb25lIGNoYW5nZWQuICBCZWNhbWVaZXJvIGlzIHNldCB0byB0cnVlIGlmIHRoaXMgZWxlbWVudCBiZWNhbWUgYWxsLXplcm8KKyAgLy8gYml0cy4KKyAgYm9vbCBpbnRlcnNlY3RXaXRoQ29tcGxlbWVudChjb25zdCBTcGFyc2VCaXRWZWN0b3JFbGVtZW50ICZSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmQmVjYW1lWmVybykgeworICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgIGJvb2wgYWxsemVybyA9IHRydWU7CisKKyAgICBCZWNhbWVaZXJvID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEJJVFdPUkRTX1BFUl9FTEVNRU5UOyArK2kpIHsKKyAgICAgIEJpdFdvcmQgb2xkID0gY2hhbmdlZCA/IDAgOiBCaXRzW2ldOworCisgICAgICBCaXRzW2ldICY9IH5SSFMuQml0c1tpXTsKKyAgICAgIGlmIChCaXRzW2ldICE9IDApCisgICAgICAgIGFsbHplcm8gPSBmYWxzZTsKKworICAgICAgaWYgKCFjaGFuZ2VkICYmIG9sZCAhPSBCaXRzW2ldKQorICAgICAgICBjaGFuZ2VkID0gdHJ1ZTsKKyAgICB9CisgICAgQmVjYW1lWmVybyA9IGFsbHplcm87CisgICAgcmV0dXJuIGNoYW5nZWQ7CisgIH0KKworICAvLyBUaHJlZSBhcmd1bWVudCB2ZXJzaW9uIG9mIGludGVyc2VjdFdpdGhDb21wbGVtZW50IHRoYXQgaW50ZXJzZWN0cworICAvLyBSSFMxICYgflJIUzIgaW50byB0aGlzIGVsZW1lbnQKKyAgdm9pZCBpbnRlcnNlY3RXaXRoQ29tcGxlbWVudChjb25zdCBTcGFyc2VCaXRWZWN0b3JFbGVtZW50ICZSSFMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNwYXJzZUJpdFZlY3RvckVsZW1lbnQgJlJIUzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmQmVjYW1lWmVybykgeworICAgIGJvb2wgYWxsemVybyA9IHRydWU7CisKKyAgICBCZWNhbWVaZXJvID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IEJJVFdPUkRTX1BFUl9FTEVNRU5UOyArK2kpIHsKKyAgICAgIEJpdHNbaV0gPSBSSFMxLkJpdHNbaV0gJiB+UkhTMi5CaXRzW2ldOworICAgICAgaWYgKEJpdHNbaV0gIT0gMCkKKyAgICAgICAgYWxsemVybyA9IGZhbHNlOworICAgIH0KKyAgICBCZWNhbWVaZXJvID0gYWxsemVybzsKKyAgfQorfTsKKwordGVtcGxhdGUgPHVuc2lnbmVkIEVsZW1lbnRTaXplID0gMTI4PgorY2xhc3MgU3BhcnNlQml0VmVjdG9yIHsKKyAgdXNpbmcgRWxlbWVudExpc3QgPSBzdGQ6Omxpc3Q8U3BhcnNlQml0VmVjdG9yRWxlbWVudDxFbGVtZW50U2l6ZT4+OworICB1c2luZyBFbGVtZW50TGlzdEl0ZXIgPSB0eXBlbmFtZSBFbGVtZW50TGlzdDo6aXRlcmF0b3I7CisgIHVzaW5nIEVsZW1lbnRMaXN0Q29uc3RJdGVyID0gdHlwZW5hbWUgRWxlbWVudExpc3Q6OmNvbnN0X2l0ZXJhdG9yOworICBlbnVtIHsKKyAgICBCSVRXT1JEX1NJWkUgPSBTcGFyc2VCaXRWZWN0b3JFbGVtZW50PEVsZW1lbnRTaXplPjo6QklUV09SRF9TSVpFCisgIH07CisKKyAgLy8gUG9pbnRlciB0byBvdXIgY3VycmVudCBFbGVtZW50LgorICBFbGVtZW50TGlzdEl0ZXIgQ3VyckVsZW1lbnRJdGVyOworICBFbGVtZW50TGlzdCBFbGVtZW50czsKKworICAvLyBUaGlzIGlzIGxpa2Ugc3RkOjpsb3dlcl9ib3VuZCwgZXhjZXB0IHdlIGRvIGxpbmVhciBzZWFyY2hpbmcgZnJvbSB0aGUKKyAgLy8gY3VycmVudCBwb3NpdGlvbi4KKyAgRWxlbWVudExpc3RJdGVyIEZpbmRMb3dlckJvdW5kKHVuc2lnbmVkIEVsZW1lbnRJbmRleCkgeworCisgICAgaWYgKEVsZW1lbnRzLmVtcHR5KCkpIHsKKyAgICAgIEN1cnJFbGVtZW50SXRlciA9IEVsZW1lbnRzLmJlZ2luKCk7CisgICAgICByZXR1cm4gRWxlbWVudHMuYmVnaW4oKTsKKyAgICB9CisKKyAgICAvLyBNYWtlIHN1cmUgb3VyIGN1cnJlbnQgaXRlcmF0b3IgaXMgdmFsaWQuCisgICAgaWYgKEN1cnJFbGVtZW50SXRlciA9PSBFbGVtZW50cy5lbmQoKSkKKyAgICAgIC0tQ3VyckVsZW1lbnRJdGVyOworCisgICAgLy8gU2VhcmNoIGZyb20gb3VyIGN1cnJlbnQgaXRlcmF0b3IsIGVpdGhlciBiYWNrd2FyZHMgb3IgZm9yd2FyZHMsCisgICAgLy8gZGVwZW5kaW5nIG9uIHdoYXQgZWxlbWVudCB3ZSBhcmUgbG9va2luZyBmb3IuCisgICAgRWxlbWVudExpc3RJdGVyIEVsZW1lbnRJdGVyID0gQ3VyckVsZW1lbnRJdGVyOworICAgIGlmIChDdXJyRWxlbWVudEl0ZXItPmluZGV4KCkgPT0gRWxlbWVudEluZGV4KSB7CisgICAgICByZXR1cm4gRWxlbWVudEl0ZXI7CisgICAgfSBlbHNlIGlmIChDdXJyRWxlbWVudEl0ZXItPmluZGV4KCkgPiBFbGVtZW50SW5kZXgpIHsKKyAgICAgIHdoaWxlIChFbGVtZW50SXRlciAhPSBFbGVtZW50cy5iZWdpbigpCisgICAgICAgICAgICAgJiYgRWxlbWVudEl0ZXItPmluZGV4KCkgPiBFbGVtZW50SW5kZXgpCisgICAgICAgIC0tRWxlbWVudEl0ZXI7CisgICAgfSBlbHNlIHsKKyAgICAgIHdoaWxlIChFbGVtZW50SXRlciAhPSBFbGVtZW50cy5lbmQoKSAmJgorICAgICAgICAgICAgIEVsZW1lbnRJdGVyLT5pbmRleCgpIDwgRWxlbWVudEluZGV4KQorICAgICAgICArK0VsZW1lbnRJdGVyOworICAgIH0KKyAgICBDdXJyRWxlbWVudEl0ZXIgPSBFbGVtZW50SXRlcjsKKyAgICByZXR1cm4gRWxlbWVudEl0ZXI7CisgIH0KKworICAvLyBJdGVyYXRvciB0byB3YWxrIHNldCBiaXRzIGluIHRoZSBiaXRtYXAuICBUaGlzIGl0ZXJhdG9yIGlzIGEgbG90IHVnbGllcgorICAvLyB0aGFuIGl0IHdvdWxkIGJlLCBpbiBvcmRlciB0byBiZSBlZmZpY2llbnQuCisgIGNsYXNzIFNwYXJzZUJpdFZlY3Rvckl0ZXJhdG9yIHsKKyAgcHJpdmF0ZToKKyAgICBib29sIEF0RW5kOworCisgICAgY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAqQml0VmVjdG9yID0gbnVsbHB0cjsKKworICAgIC8vIEN1cnJlbnQgZWxlbWVudCBpbnNpZGUgb2YgYml0bWFwLgorICAgIEVsZW1lbnRMaXN0Q29uc3RJdGVyIEl0ZXI7CisKKyAgICAvLyBDdXJyZW50IGJpdCBudW1iZXIgaW5zaWRlIG9mIG91ciBiaXRtYXAuCisgICAgdW5zaWduZWQgQml0TnVtYmVyOworCisgICAgLy8gQ3VycmVudCB3b3JkIG51bWJlciBpbnNpZGUgb2Ygb3VyIGVsZW1lbnQuCisgICAgdW5zaWduZWQgV29yZE51bWJlcjsKKworICAgIC8vIEN1cnJlbnQgYml0cyBmcm9tIHRoZSBlbGVtZW50LgorICAgIHR5cGVuYW1lIFNwYXJzZUJpdFZlY3RvckVsZW1lbnQ8RWxlbWVudFNpemU+OjpCaXRXb3JkIEJpdHM7CisKKyAgICAvLyBNb3ZlIG91ciBpdGVyYXRvciB0byB0aGUgZmlyc3Qgbm9uLXplcm8gYml0IGluIHRoZSBiaXRtYXAuCisgICAgdm9pZCBBZHZhbmNlVG9GaXJzdE5vblplcm8oKSB7CisgICAgICBpZiAoQXRFbmQpCisgICAgICAgIHJldHVybjsKKyAgICAgIGlmIChCaXRWZWN0b3ItPkVsZW1lbnRzLmVtcHR5KCkpIHsKKyAgICAgICAgQXRFbmQgPSB0cnVlOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBJdGVyID0gQml0VmVjdG9yLT5FbGVtZW50cy5iZWdpbigpOworICAgICAgQml0TnVtYmVyID0gSXRlci0+aW5kZXgoKSAqIEVsZW1lbnRTaXplOworICAgICAgdW5zaWduZWQgQml0UG9zID0gSXRlci0+ZmluZF9maXJzdCgpOworICAgICAgQml0TnVtYmVyICs9IEJpdFBvczsKKyAgICAgIFdvcmROdW1iZXIgPSAoQml0TnVtYmVyICUgRWxlbWVudFNpemUpIC8gQklUV09SRF9TSVpFOworICAgICAgQml0cyA9IEl0ZXItPndvcmQoV29yZE51bWJlcik7CisgICAgICBCaXRzID4+PSBCaXRQb3MgJSBCSVRXT1JEX1NJWkU7CisgICAgfQorCisgICAgLy8gTW92ZSBvdXIgaXRlcmF0b3IgdG8gdGhlIG5leHQgbm9uLXplcm8gYml0LgorICAgIHZvaWQgQWR2YW5jZVRvTmV4dE5vblplcm8oKSB7CisgICAgICBpZiAoQXRFbmQpCisgICAgICAgIHJldHVybjsKKworICAgICAgd2hpbGUgKEJpdHMgJiYgIShCaXRzICYgMSkpIHsKKyAgICAgICAgQml0cyA+Pj0gMTsKKyAgICAgICAgQml0TnVtYmVyICs9IDE7CisgICAgICB9CisKKyAgICAgIC8vIFNlZSBpZiB3ZSByYW4gb3V0IG9mIEJpdHMgaW4gdGhpcyB3b3JkLgorICAgICAgaWYgKCFCaXRzKSB7CisgICAgICAgIGludCBOZXh0U2V0Qml0TnVtYmVyID0gSXRlci0+ZmluZF9uZXh0KEJpdE51bWJlciAlIEVsZW1lbnRTaXplKSA7CisgICAgICAgIC8vIElmIHdlIHJhbiBvdXQgb2Ygc2V0IGJpdHMgaW4gdGhpcyBlbGVtZW50LCBtb3ZlIHRvIG5leHQgZWxlbWVudC4KKyAgICAgICAgaWYgKE5leHRTZXRCaXROdW1iZXIgPT0gLTEgfHwgKEJpdE51bWJlciAlIEVsZW1lbnRTaXplID09IDApKSB7CisgICAgICAgICAgKytJdGVyOworICAgICAgICAgIFdvcmROdW1iZXIgPSAwOworCisgICAgICAgICAgLy8gV2UgbWF5IHJ1biBvdXQgb2YgZWxlbWVudHMgaW4gdGhlIGJpdG1hcC4KKyAgICAgICAgICBpZiAoSXRlciA9PSBCaXRWZWN0b3ItPkVsZW1lbnRzLmVuZCgpKSB7CisgICAgICAgICAgICBBdEVuZCA9IHRydWU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgfQorICAgICAgICAgIC8vIFNldCB1cCBmb3IgbmV4dCBub24temVybyB3b3JkIGluIGJpdG1hcC4KKyAgICAgICAgICBCaXROdW1iZXIgPSBJdGVyLT5pbmRleCgpICogRWxlbWVudFNpemU7CisgICAgICAgICAgTmV4dFNldEJpdE51bWJlciA9IEl0ZXItPmZpbmRfZmlyc3QoKTsKKyAgICAgICAgICBCaXROdW1iZXIgKz0gTmV4dFNldEJpdE51bWJlcjsKKyAgICAgICAgICBXb3JkTnVtYmVyID0gKEJpdE51bWJlciAlIEVsZW1lbnRTaXplKSAvIEJJVFdPUkRfU0laRTsKKyAgICAgICAgICBCaXRzID0gSXRlci0+d29yZChXb3JkTnVtYmVyKTsKKyAgICAgICAgICBCaXRzID4+PSBOZXh0U2V0Qml0TnVtYmVyICUgQklUV09SRF9TSVpFOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFdvcmROdW1iZXIgPSAoTmV4dFNldEJpdE51bWJlciAlIEVsZW1lbnRTaXplKSAvIEJJVFdPUkRfU0laRTsKKyAgICAgICAgICBCaXRzID0gSXRlci0+d29yZChXb3JkTnVtYmVyKTsKKyAgICAgICAgICBCaXRzID4+PSBOZXh0U2V0Qml0TnVtYmVyICUgQklUV09SRF9TSVpFOworICAgICAgICAgIEJpdE51bWJlciA9IEl0ZXItPmluZGV4KCkgKiBFbGVtZW50U2l6ZTsKKyAgICAgICAgICBCaXROdW1iZXIgKz0gTmV4dFNldEJpdE51bWJlcjsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICBwdWJsaWM6CisgICAgU3BhcnNlQml0VmVjdG9ySXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICBTcGFyc2VCaXRWZWN0b3JJdGVyYXRvcihjb25zdCBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmQgPSBmYWxzZSk6Qml0VmVjdG9yKFJIUykgeworICAgICAgSXRlciA9IEJpdFZlY3Rvci0+RWxlbWVudHMuYmVnaW4oKTsKKyAgICAgIEJpdE51bWJlciA9IDA7CisgICAgICBCaXRzID0gMDsKKyAgICAgIFdvcmROdW1iZXIgPSB+MDsKKyAgICAgIEF0RW5kID0gZW5kOworICAgICAgQWR2YW5jZVRvRmlyc3ROb25aZXJvKCk7CisgICAgfQorCisgICAgLy8gUHJlaW5jcmVtZW50LgorICAgIGlubGluZSBTcGFyc2VCaXRWZWN0b3JJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsKKyAgICAgICsrQml0TnVtYmVyOworICAgICAgQml0cyA+Pj0gMTsKKyAgICAgIEFkdmFuY2VUb05leHROb25aZXJvKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8gUG9zdGluY3JlbWVudC4KKyAgICBpbmxpbmUgU3BhcnNlQml0VmVjdG9ySXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsKKyAgICAgIFNwYXJzZUJpdFZlY3Rvckl0ZXJhdG9yIHRtcCA9ICp0aGlzOworICAgICAgKysqdGhpczsKKyAgICAgIHJldHVybiB0bXA7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHRoZSBjdXJyZW50IHNldCBiaXQgbnVtYmVyLgorICAgIHVuc2lnbmVkIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBCaXROdW1iZXI7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNwYXJzZUJpdFZlY3Rvckl0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICAgIC8vIElmIHRoZXkgYXJlIGJvdGggYXQgdGhlIGVuZCwgaWdub3JlIHRoZSByZXN0IG9mIHRoZSBmaWVsZHMuCisgICAgICBpZiAoQXRFbmQgJiYgUkhTLkF0RW5kKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIC8vIE90aGVyd2lzZSB0aGV5IGFyZSB0aGUgc2FtZSBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgYml0IG51bWJlciBhbmQKKyAgICAgIC8vIGJpdG1hcC4KKyAgICAgIHJldHVybiBBdEVuZCA9PSBSSFMuQXRFbmQgJiYgUkhTLkJpdE51bWJlciA9PSBCaXROdW1iZXI7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNwYXJzZUJpdFZlY3Rvckl0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhKCp0aGlzID09IFJIUyk7CisgICAgfQorICB9OworCitwdWJsaWM6CisgIHVzaW5nIGl0ZXJhdG9yID0gU3BhcnNlQml0VmVjdG9ySXRlcmF0b3I7CisKKyAgU3BhcnNlQml0VmVjdG9yKCkgeworICAgIEN1cnJFbGVtZW50SXRlciA9IEVsZW1lbnRzLmJlZ2luKCk7CisgIH0KKworICAvLyBTcGFyc2VCaXRWZWN0b3IgY29weSBjdG9yLgorICBTcGFyc2VCaXRWZWN0b3IoY29uc3QgU3BhcnNlQml0VmVjdG9yICZSSFMpIHsKKyAgICBFbGVtZW50TGlzdENvbnN0SXRlciBFbGVtZW50SXRlciA9IFJIUy5FbGVtZW50cy5iZWdpbigpOworICAgIHdoaWxlIChFbGVtZW50SXRlciAhPSBSSFMuRWxlbWVudHMuZW5kKCkpIHsKKyAgICAgIEVsZW1lbnRzLnB1c2hfYmFjayhTcGFyc2VCaXRWZWN0b3JFbGVtZW50PEVsZW1lbnRTaXplPigqRWxlbWVudEl0ZXIpKTsKKyAgICAgICsrRWxlbWVudEl0ZXI7CisgICAgfQorCisgICAgQ3VyckVsZW1lbnRJdGVyID0gRWxlbWVudHMuYmVnaW4gKCk7CisgIH0KKworICB+U3BhcnNlQml0VmVjdG9yKCkgPSBkZWZhdWx0OworCisgIC8vIENsZWFyLgorICB2b2lkIGNsZWFyKCkgeworICAgIEVsZW1lbnRzLmNsZWFyKCk7CisgIH0KKworICAvLyBBc3NpZ25tZW50CisgIFNwYXJzZUJpdFZlY3RvciYgb3BlcmF0b3I9KGNvbnN0IFNwYXJzZUJpdFZlY3RvciYgUkhTKSB7CisgICAgaWYgKHRoaXMgPT0gJlJIUykKKyAgICAgIHJldHVybiAqdGhpczsKKworICAgIEVsZW1lbnRzLmNsZWFyKCk7CisKKyAgICBFbGVtZW50TGlzdENvbnN0SXRlciBFbGVtZW50SXRlciA9IFJIUy5FbGVtZW50cy5iZWdpbigpOworICAgIHdoaWxlIChFbGVtZW50SXRlciAhPSBSSFMuRWxlbWVudHMuZW5kKCkpIHsKKyAgICAgIEVsZW1lbnRzLnB1c2hfYmFjayhTcGFyc2VCaXRWZWN0b3JFbGVtZW50PEVsZW1lbnRTaXplPigqRWxlbWVudEl0ZXIpKTsKKyAgICAgICsrRWxlbWVudEl0ZXI7CisgICAgfQorCisgICAgQ3VyckVsZW1lbnRJdGVyID0gRWxlbWVudHMuYmVnaW4gKCk7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLyBUZXN0LCBSZXNldCwgYW5kIFNldCBhIGJpdCBpbiB0aGUgYml0bWFwLgorICBib29sIHRlc3QodW5zaWduZWQgSWR4KSB7CisgICAgaWYgKEVsZW1lbnRzLmVtcHR5KCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB1bnNpZ25lZCBFbGVtZW50SW5kZXggPSBJZHggLyBFbGVtZW50U2l6ZTsKKyAgICBFbGVtZW50TGlzdEl0ZXIgRWxlbWVudEl0ZXIgPSBGaW5kTG93ZXJCb3VuZChFbGVtZW50SW5kZXgpOworCisgICAgLy8gSWYgd2UgY2FuJ3QgZmluZCBhbiBlbGVtZW50IHRoYXQgaXMgc3VwcG9zZWQgdG8gY29udGFpbiB0aGlzIGJpdCwgdGhlcmUKKyAgICAvLyBpcyBub3RoaW5nIG1vcmUgdG8gZG8uCisgICAgaWYgKEVsZW1lbnRJdGVyID09IEVsZW1lbnRzLmVuZCgpIHx8CisgICAgICAgIEVsZW1lbnRJdGVyLT5pbmRleCgpICE9IEVsZW1lbnRJbmRleCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gRWxlbWVudEl0ZXItPnRlc3QoSWR4ICUgRWxlbWVudFNpemUpOworICB9CisKKyAgdm9pZCByZXNldCh1bnNpZ25lZCBJZHgpIHsKKyAgICBpZiAoRWxlbWVudHMuZW1wdHkoKSkKKyAgICAgIHJldHVybjsKKworICAgIHVuc2lnbmVkIEVsZW1lbnRJbmRleCA9IElkeCAvIEVsZW1lbnRTaXplOworICAgIEVsZW1lbnRMaXN0SXRlciBFbGVtZW50SXRlciA9IEZpbmRMb3dlckJvdW5kKEVsZW1lbnRJbmRleCk7CisKKyAgICAvLyBJZiB3ZSBjYW4ndCBmaW5kIGFuIGVsZW1lbnQgdGhhdCBpcyBzdXBwb3NlZCB0byBjb250YWluIHRoaXMgYml0LCB0aGVyZQorICAgIC8vIGlzIG5vdGhpbmcgbW9yZSB0byBkby4KKyAgICBpZiAoRWxlbWVudEl0ZXIgPT0gRWxlbWVudHMuZW5kKCkgfHwKKyAgICAgICAgRWxlbWVudEl0ZXItPmluZGV4KCkgIT0gRWxlbWVudEluZGV4KQorICAgICAgcmV0dXJuOworICAgIEVsZW1lbnRJdGVyLT5yZXNldChJZHggJSBFbGVtZW50U2l6ZSk7CisKKyAgICAvLyBXaGVuIHRoZSBlbGVtZW50IGlzIHplcm9lZCBvdXQsIGRlbGV0ZSBpdC4KKyAgICBpZiAoRWxlbWVudEl0ZXItPmVtcHR5KCkpIHsKKyAgICAgICsrQ3VyckVsZW1lbnRJdGVyOworICAgICAgRWxlbWVudHMuZXJhc2UoRWxlbWVudEl0ZXIpOworICAgIH0KKyAgfQorCisgIHZvaWQgc2V0KHVuc2lnbmVkIElkeCkgeworICAgIHVuc2lnbmVkIEVsZW1lbnRJbmRleCA9IElkeCAvIEVsZW1lbnRTaXplOworICAgIEVsZW1lbnRMaXN0SXRlciBFbGVtZW50SXRlcjsKKyAgICBpZiAoRWxlbWVudHMuZW1wdHkoKSkgeworICAgICAgRWxlbWVudEl0ZXIgPSBFbGVtZW50cy5lbXBsYWNlKEVsZW1lbnRzLmVuZCgpLCBFbGVtZW50SW5kZXgpOworICAgIH0gZWxzZSB7CisgICAgICBFbGVtZW50SXRlciA9IEZpbmRMb3dlckJvdW5kKEVsZW1lbnRJbmRleCk7CisKKyAgICAgIGlmIChFbGVtZW50SXRlciA9PSBFbGVtZW50cy5lbmQoKSB8fAorICAgICAgICAgIEVsZW1lbnRJdGVyLT5pbmRleCgpICE9IEVsZW1lbnRJbmRleCkgeworICAgICAgICAvLyBXZSBtYXkgaGF2ZSBoaXQgdGhlIGJlZ2lubmluZyBvZiBvdXIgU3BhcnNlQml0VmVjdG9yLCBpbiB3aGljaCBjYXNlLAorICAgICAgICAvLyB3ZSBtYXkgbmVlZCB0byBpbnNlcnQgcmlnaHQgYWZ0ZXIgdGhpcyBlbGVtZW50LCB3aGljaCByZXF1aXJlcyBtb3ZpbmcKKyAgICAgICAgLy8gdGhlIGN1cnJlbnQgaXRlcmF0b3IgZm9yd2FyZCBvbmUsIGJlY2F1c2UgaW5zZXJ0IGRvZXMgaW5zZXJ0IGJlZm9yZS4KKyAgICAgICAgaWYgKEVsZW1lbnRJdGVyICE9IEVsZW1lbnRzLmVuZCgpICYmCisgICAgICAgICAgICBFbGVtZW50SXRlci0+aW5kZXgoKSA8IEVsZW1lbnRJbmRleCkKKyAgICAgICAgICArK0VsZW1lbnRJdGVyOworICAgICAgICBFbGVtZW50SXRlciA9IEVsZW1lbnRzLmVtcGxhY2UoRWxlbWVudEl0ZXIsIEVsZW1lbnRJbmRleCk7CisgICAgICB9CisgICAgfQorICAgIEN1cnJFbGVtZW50SXRlciA9IEVsZW1lbnRJdGVyOworCisgICAgRWxlbWVudEl0ZXItPnNldChJZHggJSBFbGVtZW50U2l6ZSk7CisgIH0KKworICBib29sIHRlc3RfYW5kX3NldCh1bnNpZ25lZCBJZHgpIHsKKyAgICBib29sIG9sZCA9IHRlc3QoSWR4KTsKKyAgICBpZiAoIW9sZCkgeworICAgICAgc2V0KElkeCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNwYXJzZUJpdFZlY3RvciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gUkhTKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTcGFyc2VCaXRWZWN0b3IgJlJIUykgY29uc3QgeworICAgIEVsZW1lbnRMaXN0Q29uc3RJdGVyIEl0ZXIxID0gRWxlbWVudHMuYmVnaW4oKTsKKyAgICBFbGVtZW50TGlzdENvbnN0SXRlciBJdGVyMiA9IFJIUy5FbGVtZW50cy5iZWdpbigpOworCisgICAgZm9yICg7IEl0ZXIxICE9IEVsZW1lbnRzLmVuZCgpICYmIEl0ZXIyICE9IFJIUy5FbGVtZW50cy5lbmQoKTsKKyAgICAgICAgICsrSXRlcjEsICsrSXRlcjIpIHsKKyAgICAgIGlmICgqSXRlcjEgIT0gKkl0ZXIyKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHJldHVybiBJdGVyMSA9PSBFbGVtZW50cy5lbmQoKSAmJiBJdGVyMiA9PSBSSFMuRWxlbWVudHMuZW5kKCk7CisgIH0KKworICAvLyBVbmlvbiBvdXIgYml0bWFwIHdpdGggdGhlIFJIUyBhbmQgcmV0dXJuIHRydWUgaWYgd2UgY2hhbmdlZC4KKyAgYm9vbCBvcGVyYXRvcnw9KGNvbnN0IFNwYXJzZUJpdFZlY3RvciAmUkhTKSB7CisgICAgaWYgKHRoaXMgPT0gJlJIUykKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgIEVsZW1lbnRMaXN0SXRlciBJdGVyMSA9IEVsZW1lbnRzLmJlZ2luKCk7CisgICAgRWxlbWVudExpc3RDb25zdEl0ZXIgSXRlcjIgPSBSSFMuRWxlbWVudHMuYmVnaW4oKTsKKworICAgIC8vIElmIFJIUyBpcyBlbXB0eSwgd2UgYXJlIGRvbmUKKyAgICBpZiAoUkhTLkVsZW1lbnRzLmVtcHR5KCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICB3aGlsZSAoSXRlcjIgIT0gUkhTLkVsZW1lbnRzLmVuZCgpKSB7CisgICAgICBpZiAoSXRlcjEgPT0gRWxlbWVudHMuZW5kKCkgfHwgSXRlcjEtPmluZGV4KCkgPiBJdGVyMi0+aW5kZXgoKSkgeworICAgICAgICBFbGVtZW50cy5pbnNlcnQoSXRlcjEsICpJdGVyMik7CisgICAgICAgICsrSXRlcjI7CisgICAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgICAgfSBlbHNlIGlmIChJdGVyMS0+aW5kZXgoKSA9PSBJdGVyMi0+aW5kZXgoKSkgeworICAgICAgICBjaGFuZ2VkIHw9IEl0ZXIxLT51bmlvbldpdGgoKkl0ZXIyKTsKKyAgICAgICAgKytJdGVyMTsKKyAgICAgICAgKytJdGVyMjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICsrSXRlcjE7CisgICAgICB9CisgICAgfQorICAgIEN1cnJFbGVtZW50SXRlciA9IEVsZW1lbnRzLmJlZ2luKCk7CisgICAgcmV0dXJuIGNoYW5nZWQ7CisgIH0KKworICAvLyBJbnRlcnNlY3Qgb3VyIGJpdG1hcCB3aXRoIHRoZSBSSFMgYW5kIHJldHVybiB0cnVlIGlmIG91cnMgY2hhbmdlZC4KKyAgYm9vbCBvcGVyYXRvciY9KGNvbnN0IFNwYXJzZUJpdFZlY3RvciAmUkhTKSB7CisgICAgaWYgKHRoaXMgPT0gJlJIUykKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2wgY2hhbmdlZCA9IGZhbHNlOworICAgIEVsZW1lbnRMaXN0SXRlciBJdGVyMSA9IEVsZW1lbnRzLmJlZ2luKCk7CisgICAgRWxlbWVudExpc3RDb25zdEl0ZXIgSXRlcjIgPSBSSFMuRWxlbWVudHMuYmVnaW4oKTsKKworICAgIC8vIENoZWNrIGlmIGJvdGggYml0bWFwcyBhcmUgZW1wdHkuCisgICAgaWYgKEVsZW1lbnRzLmVtcHR5KCkgJiYgUkhTLkVsZW1lbnRzLmVtcHR5KCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBMb29wIHRocm91Z2gsIGludGVyc2VjdGluZyBhcyB3ZSBnbywgZXJhc2luZyBlbGVtZW50cyB3aGVuIG5lY2Vzc2FyeS4KKyAgICB3aGlsZSAoSXRlcjIgIT0gUkhTLkVsZW1lbnRzLmVuZCgpKSB7CisgICAgICBpZiAoSXRlcjEgPT0gRWxlbWVudHMuZW5kKCkpIHsKKyAgICAgICAgQ3VyckVsZW1lbnRJdGVyID0gRWxlbWVudHMuYmVnaW4oKTsKKyAgICAgICAgcmV0dXJuIGNoYW5nZWQ7CisgICAgICB9CisKKyAgICAgIGlmIChJdGVyMS0+aW5kZXgoKSA+IEl0ZXIyLT5pbmRleCgpKSB7CisgICAgICAgICsrSXRlcjI7CisgICAgICB9IGVsc2UgaWYgKEl0ZXIxLT5pbmRleCgpID09IEl0ZXIyLT5pbmRleCgpKSB7CisgICAgICAgIGJvb2wgQmVjYW1lWmVybzsKKyAgICAgICAgY2hhbmdlZCB8PSBJdGVyMS0+aW50ZXJzZWN0V2l0aCgqSXRlcjIsIEJlY2FtZVplcm8pOworICAgICAgICBpZiAoQmVjYW1lWmVybykgeworICAgICAgICAgIEVsZW1lbnRMaXN0SXRlciBJdGVyVG1wID0gSXRlcjE7CisgICAgICAgICAgKytJdGVyMTsKKyAgICAgICAgICBFbGVtZW50cy5lcmFzZShJdGVyVG1wKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICArK0l0ZXIxOworICAgICAgICB9CisgICAgICAgICsrSXRlcjI7CisgICAgICB9IGVsc2UgeworICAgICAgICBFbGVtZW50TGlzdEl0ZXIgSXRlclRtcCA9IEl0ZXIxOworICAgICAgICArK0l0ZXIxOworICAgICAgICBFbGVtZW50cy5lcmFzZShJdGVyVG1wKTsKKyAgICAgICAgY2hhbmdlZCA9IHRydWU7CisgICAgICB9CisgICAgfQorICAgIGlmIChJdGVyMSAhPSBFbGVtZW50cy5lbmQoKSkgeworICAgICAgRWxlbWVudHMuZXJhc2UoSXRlcjEsIEVsZW1lbnRzLmVuZCgpKTsKKyAgICAgIGNoYW5nZWQgPSB0cnVlOworICAgIH0KKyAgICBDdXJyRWxlbWVudEl0ZXIgPSBFbGVtZW50cy5iZWdpbigpOworICAgIHJldHVybiBjaGFuZ2VkOworICB9CisKKyAgLy8gSW50ZXJzZWN0IG91ciBiaXRtYXAgd2l0aCB0aGUgY29tcGxlbWVudCBvZiB0aGUgUkhTIGFuZCByZXR1cm4gdHJ1ZQorICAvLyBpZiBvdXJzIGNoYW5nZWQuCisgIGJvb2wgaW50ZXJzZWN0V2l0aENvbXBsZW1lbnQoY29uc3QgU3BhcnNlQml0VmVjdG9yICZSSFMpIHsKKyAgICBpZiAodGhpcyA9PSAmUkhTKSB7CisgICAgICBpZiAoIWVtcHR5KCkpIHsKKyAgICAgICAgY2xlYXIoKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBjaGFuZ2VkID0gZmFsc2U7CisgICAgRWxlbWVudExpc3RJdGVyIEl0ZXIxID0gRWxlbWVudHMuYmVnaW4oKTsKKyAgICBFbGVtZW50TGlzdENvbnN0SXRlciBJdGVyMiA9IFJIUy5FbGVtZW50cy5iZWdpbigpOworCisgICAgLy8gSWYgZWl0aGVyIG91ciBiaXRtYXAgb3IgUkhTIGlzIGVtcHR5LCB3ZSBhcmUgZG9uZQorICAgIGlmIChFbGVtZW50cy5lbXB0eSgpIHx8IFJIUy5FbGVtZW50cy5lbXB0eSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gTG9vcCB0aHJvdWdoLCBpbnRlcnNlY3RpbmcgYXMgd2UgZ28sIGVyYXNpbmcgZWxlbWVudHMgd2hlbiBuZWNlc3NhcnkuCisgICAgd2hpbGUgKEl0ZXIyICE9IFJIUy5FbGVtZW50cy5lbmQoKSkgeworICAgICAgaWYgKEl0ZXIxID09IEVsZW1lbnRzLmVuZCgpKSB7CisgICAgICAgIEN1cnJFbGVtZW50SXRlciA9IEVsZW1lbnRzLmJlZ2luKCk7CisgICAgICAgIHJldHVybiBjaGFuZ2VkOworICAgICAgfQorCisgICAgICBpZiAoSXRlcjEtPmluZGV4KCkgPiBJdGVyMi0+aW5kZXgoKSkgeworICAgICAgICArK0l0ZXIyOworICAgICAgfSBlbHNlIGlmIChJdGVyMS0+aW5kZXgoKSA9PSBJdGVyMi0+aW5kZXgoKSkgeworICAgICAgICBib29sIEJlY2FtZVplcm87CisgICAgICAgIGNoYW5nZWQgfD0gSXRlcjEtPmludGVyc2VjdFdpdGhDb21wbGVtZW50KCpJdGVyMiwgQmVjYW1lWmVybyk7CisgICAgICAgIGlmIChCZWNhbWVaZXJvKSB7CisgICAgICAgICAgRWxlbWVudExpc3RJdGVyIEl0ZXJUbXAgPSBJdGVyMTsKKyAgICAgICAgICArK0l0ZXIxOworICAgICAgICAgIEVsZW1lbnRzLmVyYXNlKEl0ZXJUbXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICsrSXRlcjE7CisgICAgICAgIH0KKyAgICAgICAgKytJdGVyMjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICsrSXRlcjE7CisgICAgICB9CisgICAgfQorICAgIEN1cnJFbGVtZW50SXRlciA9IEVsZW1lbnRzLmJlZ2luKCk7CisgICAgcmV0dXJuIGNoYW5nZWQ7CisgIH0KKworICBib29sIGludGVyc2VjdFdpdGhDb21wbGVtZW50KGNvbnN0IFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gKlJIUykgY29uc3QgeworICAgIHJldHVybiBpbnRlcnNlY3RXaXRoQ29tcGxlbWVudCgqUkhTKTsKKyAgfQorCisgIC8vICBUaHJlZSBhcmd1bWVudCB2ZXJzaW9uIG9mIGludGVyc2VjdFdpdGhDb21wbGVtZW50LgorICAvLyAgUmVzdWx0IG9mIFJIUzEgJiB+UkhTMiBpcyBzdG9yZWQgaW50byB0aGlzIGJpdG1hcC4KKyAgdm9pZCBpbnRlcnNlY3RXaXRoQ29tcGxlbWVudChjb25zdCBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+ICZSSFMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gJlJIUzIpCisgIHsKKyAgICBpZiAodGhpcyA9PSAmUkhTMSkgeworICAgICAgaW50ZXJzZWN0V2l0aENvbXBsZW1lbnQoUkhTMik7CisgICAgICByZXR1cm47CisgICAgfSBlbHNlIGlmICh0aGlzID09ICZSSFMyKSB7CisgICAgICBTcGFyc2VCaXRWZWN0b3IgUkhTMkNvcHkoUkhTMik7CisgICAgICBpbnRlcnNlY3RXaXRoQ29tcGxlbWVudChSSFMxLCBSSFMyQ29weSk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgRWxlbWVudHMuY2xlYXIoKTsKKyAgICBDdXJyRWxlbWVudEl0ZXIgPSBFbGVtZW50cy5iZWdpbigpOworICAgIEVsZW1lbnRMaXN0Q29uc3RJdGVyIEl0ZXIxID0gUkhTMS5FbGVtZW50cy5iZWdpbigpOworICAgIEVsZW1lbnRMaXN0Q29uc3RJdGVyIEl0ZXIyID0gUkhTMi5FbGVtZW50cy5iZWdpbigpOworCisgICAgLy8gSWYgUkhTMSBpcyBlbXB0eSwgd2UgYXJlIGRvbmUKKyAgICAvLyBJZiBSSFMyIGlzIGVtcHR5LCB3ZSBzdGlsbCBoYXZlIHRvIGNvcHkgUkhTMQorICAgIGlmIChSSFMxLkVsZW1lbnRzLmVtcHR5KCkpCisgICAgICByZXR1cm47CisKKyAgICAvLyBMb29wIHRocm91Z2gsIGludGVyc2VjdGluZyBhcyB3ZSBnbywgZXJhc2luZyBlbGVtZW50cyB3aGVuIG5lY2Vzc2FyeS4KKyAgICB3aGlsZSAoSXRlcjIgIT0gUkhTMi5FbGVtZW50cy5lbmQoKSkgeworICAgICAgaWYgKEl0ZXIxID09IFJIUzEuRWxlbWVudHMuZW5kKCkpCisgICAgICAgIHJldHVybjsKKworICAgICAgaWYgKEl0ZXIxLT5pbmRleCgpID4gSXRlcjItPmluZGV4KCkpIHsKKyAgICAgICAgKytJdGVyMjsKKyAgICAgIH0gZWxzZSBpZiAoSXRlcjEtPmluZGV4KCkgPT0gSXRlcjItPmluZGV4KCkpIHsKKyAgICAgICAgYm9vbCBCZWNhbWVaZXJvID0gZmFsc2U7CisgICAgICAgIEVsZW1lbnRzLmVtcGxhY2VfYmFjayhJdGVyMS0+aW5kZXgoKSk7CisgICAgICAgIEVsZW1lbnRzLmJhY2soKS5pbnRlcnNlY3RXaXRoQ29tcGxlbWVudCgqSXRlcjEsICpJdGVyMiwgQmVjYW1lWmVybyk7CisgICAgICAgIGlmIChCZWNhbWVaZXJvKQorICAgICAgICAgIEVsZW1lbnRzLnBvcF9iYWNrKCk7CisgICAgICAgICsrSXRlcjE7CisgICAgICAgICsrSXRlcjI7CisgICAgICB9IGVsc2UgeworICAgICAgICBFbGVtZW50cy5wdXNoX2JhY2soKkl0ZXIxKyspOworICAgICAgfQorICAgIH0KKworICAgIC8vIGNvcHkgdGhlIHJlbWFpbmluZyBlbGVtZW50cworICAgIHN0ZDo6Y29weShJdGVyMSwgUkhTMS5FbGVtZW50cy5lbmQoKSwgc3RkOjpiYWNrX2luc2VydGVyKEVsZW1lbnRzKSk7CisgIH0KKworICB2b2lkIGludGVyc2VjdFdpdGhDb21wbGVtZW50KGNvbnN0IFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gKlJIUzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAqUkhTMikgeworICAgIGludGVyc2VjdFdpdGhDb21wbGVtZW50KCpSSFMxLCAqUkhTMik7CisgIH0KKworICBib29sIGludGVyc2VjdHMoY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIGludGVyc2VjdHMoKlJIUyk7CisgIH0KKworICAvLyBSZXR1cm4gdHJ1ZSBpZiB3ZSBzaGFyZSBhbnkgYml0cyBpbiBjb21tb24gd2l0aCBSSFMKKyAgYm9vbCBpbnRlcnNlY3RzKGNvbnN0IFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gJlJIUykgY29uc3QgeworICAgIEVsZW1lbnRMaXN0Q29uc3RJdGVyIEl0ZXIxID0gRWxlbWVudHMuYmVnaW4oKTsKKyAgICBFbGVtZW50TGlzdENvbnN0SXRlciBJdGVyMiA9IFJIUy5FbGVtZW50cy5iZWdpbigpOworCisgICAgLy8gQ2hlY2sgaWYgYm90aCBiaXRtYXBzIGFyZSBlbXB0eS4KKyAgICBpZiAoRWxlbWVudHMuZW1wdHkoKSAmJiBSSFMuRWxlbWVudHMuZW1wdHkoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIExvb3AgdGhyb3VnaCwgaW50ZXJzZWN0aW5nIHN0b3BwaW5nIHdoZW4gd2UgaGl0IGJpdHMgaW4gY29tbW9uLgorICAgIHdoaWxlIChJdGVyMiAhPSBSSFMuRWxlbWVudHMuZW5kKCkpIHsKKyAgICAgIGlmIChJdGVyMSA9PSBFbGVtZW50cy5lbmQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBpZiAoSXRlcjEtPmluZGV4KCkgPiBJdGVyMi0+aW5kZXgoKSkgeworICAgICAgICArK0l0ZXIyOworICAgICAgfSBlbHNlIGlmIChJdGVyMS0+aW5kZXgoKSA9PSBJdGVyMi0+aW5kZXgoKSkgeworICAgICAgICBpZiAoSXRlcjEtPmludGVyc2VjdHMoKkl0ZXIyKSkKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgKytJdGVyMTsKKyAgICAgICAgKytJdGVyMjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgICsrSXRlcjE7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFJldHVybiB0cnVlIGlmZiBhbGwgYml0cyBzZXQgaW4gdGhpcyBTcGFyc2VCaXRWZWN0b3IgYXJlCisgIC8vIGFsc28gc2V0IGluIFJIUy4KKyAgYm9vbCBjb250YWlucyhjb25zdCBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+ICZSSFMpIGNvbnN0IHsKKyAgICBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+IFJlc3VsdCgqdGhpcyk7CisgICAgUmVzdWx0ICY9IFJIUzsKKyAgICByZXR1cm4gKFJlc3VsdCA9PSBSSFMpOworICB9CisKKyAgLy8gUmV0dXJuIHRoZSBmaXJzdCBzZXQgYml0IGluIHRoZSBiaXRtYXAuICBSZXR1cm4gLTEgaWYgbm8gYml0cyBhcmUgc2V0LgorICBpbnQgZmluZF9maXJzdCgpIGNvbnN0IHsKKyAgICBpZiAoRWxlbWVudHMuZW1wdHkoKSkKKyAgICAgIHJldHVybiAtMTsKKyAgICBjb25zdCBTcGFyc2VCaXRWZWN0b3JFbGVtZW50PEVsZW1lbnRTaXplPiAmRmlyc3QgPSAqKEVsZW1lbnRzLmJlZ2luKCkpOworICAgIHJldHVybiAoRmlyc3QuaW5kZXgoKSAqIEVsZW1lbnRTaXplKSArIEZpcnN0LmZpbmRfZmlyc3QoKTsKKyAgfQorCisgIC8vIFJldHVybiB0aGUgbGFzdCBzZXQgYml0IGluIHRoZSBiaXRtYXAuICBSZXR1cm4gLTEgaWYgbm8gYml0cyBhcmUgc2V0LgorICBpbnQgZmluZF9sYXN0KCkgY29uc3QgeworICAgIGlmIChFbGVtZW50cy5lbXB0eSgpKQorICAgICAgcmV0dXJuIC0xOworICAgIGNvbnN0IFNwYXJzZUJpdFZlY3RvckVsZW1lbnQ8RWxlbWVudFNpemU+ICZMYXN0ID0gKihFbGVtZW50cy5yYmVnaW4oKSk7CisgICAgcmV0dXJuIChMYXN0LmluZGV4KCkgKiBFbGVtZW50U2l6ZSkgKyBMYXN0LmZpbmRfbGFzdCgpOworICB9CisKKyAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIFNwYXJzZUJpdFZlY3RvciBpcyBlbXB0eQorICBib29sIGVtcHR5KCkgY29uc3QgeworICAgIHJldHVybiBFbGVtZW50cy5lbXB0eSgpOworICB9CisKKyAgdW5zaWduZWQgY291bnQoKSBjb25zdCB7CisgICAgdW5zaWduZWQgQml0Q291bnQgPSAwOworICAgIGZvciAoRWxlbWVudExpc3RDb25zdEl0ZXIgSXRlciA9IEVsZW1lbnRzLmJlZ2luKCk7CisgICAgICAgICBJdGVyICE9IEVsZW1lbnRzLmVuZCgpOworICAgICAgICAgKytJdGVyKQorICAgICAgQml0Q291bnQgKz0gSXRlci0+Y291bnQoKTsKKworICAgIHJldHVybiBCaXRDb3VudDsKKyAgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBpdGVyYXRvcih0aGlzKTsKKyAgfQorCisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXRlcmF0b3IodGhpcywgdHJ1ZSk7CisgIH0KK307CisKKy8vIENvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBhbGxvdyBPciBhbmQgQW5kIHdpdGhvdXQgZGVyZWZlcmVuY2luZyBpbiB0aGUgdXNlcgorLy8gY29kZS4KKwordGVtcGxhdGUgPHVuc2lnbmVkIEVsZW1lbnRTaXplPgoraW5saW5lIGJvb2wgb3BlcmF0b3IgfD0oU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAqUkhTKSB7CisgIHJldHVybiBMSFMgfD0gKlJIUzsKK30KKwordGVtcGxhdGUgPHVuc2lnbmVkIEVsZW1lbnRTaXplPgoraW5saW5lIGJvb2wgb3BlcmF0b3IgfD0oU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAmUkhTKSB7CisgIHJldHVybiBMSFMtPm9wZXJhdG9yfD0oUkhTKTsKK30KKwordGVtcGxhdGUgPHVuc2lnbmVkIEVsZW1lbnRTaXplPgoraW5saW5lIGJvb2wgb3BlcmF0b3IgJj0oU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAmUkhTKSB7CisgIHJldHVybiBMSFMtPm9wZXJhdG9yJj0oUkhTKTsKK30KKwordGVtcGxhdGUgPHVuc2lnbmVkIEVsZW1lbnRTaXplPgoraW5saW5lIGJvb2wgb3BlcmF0b3IgJj0oU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAqUkhTKSB7CisgIHJldHVybiBMSFMgJj0gKlJIUzsKK30KKworLy8gQ29udmVuaWVuY2UgZnVuY3Rpb25zIGZvciBpbmZpeCB1bmlvbiwgaW50ZXJzZWN0aW9uLCBkaWZmZXJlbmNlIG9wZXJhdG9ycy4KKwordGVtcGxhdGUgPHVuc2lnbmVkIEVsZW1lbnRTaXplPgoraW5saW5lIFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4KK29wZXJhdG9yfChjb25zdCBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+ICZMSFMsCisgICAgICAgICAgY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAmUkhTKSB7CisgIFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gUmVzdWx0KExIUyk7CisgIFJlc3VsdCB8PSBSSFM7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDx1bnNpZ25lZCBFbGVtZW50U2l6ZT4KK2lubGluZSBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+CitvcGVyYXRvciYoY29uc3QgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiAmTEhTLAorICAgICAgICAgIGNvbnN0IFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gJlJIUykgeworICBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+IFJlc3VsdChMSFMpOworICBSZXN1bHQgJj0gUkhTOworICByZXR1cm4gUmVzdWx0OworfQorCit0ZW1wbGF0ZSA8dW5zaWduZWQgRWxlbWVudFNpemU+CitpbmxpbmUgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPgorb3BlcmF0b3ItKGNvbnN0IFNwYXJzZUJpdFZlY3RvcjxFbGVtZW50U2l6ZT4gJkxIUywKKyAgICAgICAgICBjb25zdCBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+ICZSSFMpIHsKKyAgU3BhcnNlQml0VmVjdG9yPEVsZW1lbnRTaXplPiBSZXN1bHQ7CisgIFJlc3VsdC5pbnRlcnNlY3RXaXRoQ29tcGxlbWVudChMSFMsIFJIUyk7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vIER1bXAgYSBTcGFyc2VCaXRWZWN0b3IgdG8gYSBzdHJlYW0KK3RlbXBsYXRlIDx1bnNpZ25lZCBFbGVtZW50U2l6ZT4KK3ZvaWQgZHVtcChjb25zdCBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+ICZMSFMsIHJhd19vc3RyZWFtICZvdXQpIHsKKyAgb3V0IDw8ICJbIjsKKworICB0eXBlbmFtZSBTcGFyc2VCaXRWZWN0b3I8RWxlbWVudFNpemU+OjppdGVyYXRvciBiaSA9IExIUy5iZWdpbigpLAorICAgIGJlID0gTEhTLmVuZCgpOworICBpZiAoYmkgIT0gYmUpIHsKKyAgICBvdXQgPDwgKmJpOworICAgIGZvciAoKytiaTsgYmkgIT0gYmU7ICsrYmkpIHsKKyAgICAgIG91dCA8PCAiICIgPDwgKmJpOworICAgIH0KKyAgfQorICBvdXQgPDwgIl1cbiI7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9TUEFSU0VCSVRWRUNUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3BhcnNlTXVsdGlTZXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NwYXJzZU11bHRpU2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M4NjM3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NwYXJzZU11bHRpU2V0LmgKQEAgLTAsMCArMSw1MjMgQEAKKy8vPT09LSBsbHZtL0FEVC9TcGFyc2VNdWx0aVNldC5oIC0gU3BhcnNlIG11bHRpc2V0IC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFNwYXJzZU11bHRpU2V0IGNsYXNzLCB3aGljaCBhZGRzIG11bHRpc2V0IGJlaGF2aW9yIHRvCisvLyB0aGUgU3BhcnNlU2V0LgorLy8KKy8vIEEgc3BhcnNlIG11bHRpc2V0IGhvbGRzIGEgc21hbGwgbnVtYmVyIG9mIG9iamVjdHMgaWRlbnRpZmllZCBieSBpbnRlZ2VyIGtleXMKKy8vIGZyb20gYSBtb2RlcmF0ZWx5IHNpemVkIHVuaXZlcnNlLiBUaGUgc3BhcnNlIG11bHRpc2V0IHVzZXMgbW9yZSBtZW1vcnkgdGhhbgorLy8gb3RoZXIgY29udGFpbmVycyBpbiBvcmRlciB0byBwcm92aWRlIGZhc3RlciBvcGVyYXRpb25zLiBBbnkga2V5IGNhbiBtYXAgdG8KKy8vIG11bHRpcGxlIHZhbHVlcy4gQSBTcGFyc2VNdWx0aVNldE5vZGUgY2xhc3MgaXMgcHJvdmlkZWQsIHdoaWNoIHNlcnZlcyBhcyBhCisvLyBjb252ZW5pZW50IGJhc2UgY2xhc3MgZm9yIHRoZSBjb250ZW50cyBvZiBhIFNwYXJzZU11bHRpU2V0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU1BBUlNFTVVMVElTRVRfSAorI2RlZmluZSBMTFZNX0FEVF9TUEFSU0VNVUxUSVNFVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NwYXJzZVNldC5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBGYXN0IG11bHRpc2V0IGltcGxlbWVudGF0aW9uIGZvciBvYmplY3RzIHRoYXQgY2FuIGJlIGlkZW50aWZpZWQgYnkgc21hbGwKKy8vLyB1bnNpZ25lZCBrZXlzLgorLy8vCisvLy8gU3BhcnNlTXVsdGlTZXQgYWxsb2NhdGVzIG1lbW9yeSBwcm9wb3J0aW9uYWwgdG8gdGhlIHNpemUgb2YgdGhlIGtleQorLy8vIHVuaXZlcnNlLCBzbyBpdCBpcyBub3QgcmVjb21tZW5kZWQgZm9yIGJ1aWxkaW5nIGNvbXBvc2l0ZSBkYXRhIHN0cnVjdHVyZXMuCisvLy8gSXQgaXMgdXNlZnVsIGZvciBhbGdvcml0aG1zIHRoYXQgcmVxdWlyZSBhIHNpbmdsZSBzZXQgd2l0aCBmYXN0IG9wZXJhdGlvbnMuCisvLy8KKy8vLyBDb21wYXJlZCB0byBEZW5zZVNldCBhbmQgRGVuc2VNYXAsIFNwYXJzZU11bHRpU2V0IHByb3ZpZGVzIGNvbnN0YW50LXRpbWUKKy8vLyBmYXN0IGNsZWFyKCkgYXMgZmFzdCBhcyBhIHZlY3Rvci4gIFRoZSBmaW5kKCksIGluc2VydCgpLCBhbmQgZXJhc2UoKQorLy8vIG9wZXJhdGlvbnMgYXJlIGFsbCBjb25zdGFudCB0aW1lLCBhbmQgdHlwaWNhbGx5IGZhc3RlciB0aGFuIGEgaGFzaCB0YWJsZS4KKy8vLyBUaGUgaXRlcmF0aW9uIG9yZGVyIGRvZXNuJ3QgZGVwZW5kIG9uIG51bWVyaWNhbCBrZXkgdmFsdWVzLCBpdCBvbmx5IGRlcGVuZHMKKy8vLyBvbiB0aGUgb3JkZXIgb2YgaW5zZXJ0KCkgYW5kIGVyYXNlKCkgb3BlcmF0aW9ucy4gIEl0ZXJhdGlvbiBvcmRlciBpcyB0aGUKKy8vLyBpbnNlcnRpb24gb3JkZXIuIEl0ZXJhdGlvbiBpcyBvbmx5IHByb3ZpZGVkIG92ZXIgZWxlbWVudHMgb2YgZXF1aXZhbGVudAorLy8vIGtleXMsIGJ1dCBpdGVyYXRvcnMgYXJlIGJpZGlyZWN0aW9uYWwuCisvLy8KKy8vLyBDb21wYXJlZCB0byBCaXRWZWN0b3IsIFNwYXJzZU11bHRpU2V0PHVuc2lnbmVkPiB1c2VzIDh4LTQweCBtb3JlIG1lbW9yeSwgYnV0CisvLy8gb2ZmZXJzIGNvbnN0YW50LXRpbWUgY2xlYXIoKSBhbmQgc2l6ZSgpIG9wZXJhdGlvbnMgYXMgd2VsbCBhcyBmYXN0IGl0ZXJhdGlvbgorLy8vIGluZGVwZW5kZW50IG9uIHRoZSBzaXplIG9mIHRoZSB1bml2ZXJzZS4KKy8vLworLy8vIFNwYXJzZU11bHRpU2V0IGNvbnRhaW5zIGEgZGVuc2UgdmVjdG9yIGhvbGRpbmcgYWxsIHRoZSBvYmplY3RzIGFuZCBhIHNwYXJzZQorLy8vIGFycmF5IGhvbGRpbmcgaW5kZXhlcyBpbnRvIHRoZSBkZW5zZSB2ZWN0b3IuICBNb3N0IG9mIHRoZSBtZW1vcnkgaXMgdXNlZCBieQorLy8vIHRoZSBzcGFyc2UgYXJyYXkgd2hpY2ggaXMgdGhlIHNpemUgb2YgdGhlIGtleSB1bml2ZXJzZS4gVGhlIFNwYXJzZVQgdGVtcGxhdGUKKy8vLyBwYXJhbWV0ZXIgcHJvdmlkZXMgYSBzcGFjZS9zcGVlZCB0cmFkZW9mZiBmb3Igc2V0cyBob2xkaW5nIG1hbnkgZWxlbWVudHMuCisvLy8KKy8vLyBXaGVuIFNwYXJzZVQgaXMgdWludDMyX3QsIGZpbmQoKSBvbmx5IHRvdWNoZXMgdXAgdG8gMyBjYWNoZSBsaW5lcywgYnV0IHRoZQorLy8vIHNwYXJzZSBhcnJheSB1c2VzIDQgeCBVbml2ZXJzZSBieXRlcy4KKy8vLworLy8vIFdoZW4gU3BhcnNlVCBpcyB1aW50OF90ICh0aGUgZGVmYXVsdCksIGZpbmQoKSB0b3VjaGVzIHVwIHRvIDMrW04vMjU2XSBjYWNoZQorLy8vIGxpbmVzLCBidXQgdGhlIHNwYXJzZSBhcnJheSBpcyA0eCBzbWFsbGVyLiAgTiBpcyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluCisvLy8gdGhlIHNldC4KKy8vLworLy8vIEZvciBzZXRzIHRoYXQgbWF5IGdyb3cgdG8gdGhvdXNhbmRzIG9mIGVsZW1lbnRzLCBTcGFyc2VUIHNob3VsZCBiZSBzZXQgdG8KKy8vLyB1aW50MTZfdCBvciB1aW50MzJfdC4KKy8vLworLy8vIE11bHRpc2V0IGJlaGF2aW9yIGlzIHByb3ZpZGVkIGJ5IHByb3ZpZGluZyBkb3VibHkgbGlua2VkIGxpc3RzIGZvciB2YWx1ZXMKKy8vLyB0aGF0IGFyZSBpbmxpbmVkIGluIHRoZSBkZW5zZSB2ZWN0b3IuIFNwYXJzZU11bHRpU2V0IGlzIGEgZ29vZCBjaG9pY2Ugd2hlbgorLy8vIG9uZSBkZXNpcmVzIGEgZ3Jvd2FibGUgbnVtYmVyIG9mIGVudHJpZXMgcGVyIGtleSwgYXMgaXQgd2lsbCByZXRhaW4gdGhlCisvLy8gU3BhcnNlU2V0IGFsZ29yaXRobWljIHByb3BlcnRpZXMgZGVzcGl0ZSBiZWluZyBncm93YWJsZS4gVGh1cywgaXQgaXMgb2Z0ZW4gYQorLy8vIGJldHRlciBjaG9pY2UgdGhhbiBhIFNwYXJzZVNldCBvZiBncm93YWJsZSBjb250YWluZXJzIG9yIGEgdmVjdG9yIG9mCisvLy8gdmVjdG9ycy4gU3BhcnNlTXVsdGlTZXQgYWxzbyBrZWVwcyBpdGVyYXRvcnMgdmFsaWQgYWZ0ZXIgZXJhc3VyZSAocHJvdmlkZWQKKy8vLyB0aGUgaXRlcmF0b3JzIGRvbid0IHBvaW50IHRvIHRoZSBlbGVtZW50IGVyYXNlZCksIGFsbG93aW5nIGZvciBtb3JlCisvLy8gaW50dWl0aXZlIGFuZCBmYXN0IHJlbW92YWwuCisvLy8KKy8vLyBAdHBhcmFtIFZhbHVlVCAgICAgIFRoZSB0eXBlIG9mIG9iamVjdHMgaW4gdGhlIHNldC4KKy8vLyBAdHBhcmFtIEtleUZ1bmN0b3JUIEEgZnVuY3RvciB0aGF0IGNvbXB1dGVzIGFuIHVuc2lnbmVkIGluZGV4IGZyb20gS2V5VC4KKy8vLyBAdHBhcmFtIFNwYXJzZVQgICAgIEFuIHVuc2lnbmVkIGludGVnZXIgdHlwZS4gU2VlIGFib3ZlLgorLy8vCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVQsCisgICAgICAgICB0eXBlbmFtZSBLZXlGdW5jdG9yVCA9IGlkZW50aXR5PHVuc2lnbmVkPiwKKyAgICAgICAgIHR5cGVuYW1lIFNwYXJzZVQgPSB1aW50OF90PgorY2xhc3MgU3BhcnNlTXVsdGlTZXQgeworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8U3BhcnNlVD46OmlzX2ludGVnZXIgJiYKKyAgICAgICAgICAgICAgICAhc3RkOjpudW1lcmljX2xpbWl0czxTcGFyc2VUPjo6aXNfc2lnbmVkLAorICAgICAgICAgICAgICAgICJTcGFyc2VUIG11c3QgYmUgYW4gdW5zaWduZWQgaW50ZWdlciB0eXBlIik7CisKKyAgLy8vIFRoZSBhY3R1YWwgZGF0YSB0aGF0J3Mgc3RvcmVkLCBhcyBhIGRvdWJseS1saW5rZWQgbGlzdCBpbXBsZW1lbnRlZCB2aWEKKyAgLy8vIGluZGljZXMgaW50byB0aGUgRGVuc2VWZWN0b3IuICBUaGUgZG91Ymx5IGxpbmtlZCBsaXN0IGlzIGltcGxlbWVudGVkCisgIC8vLyBjaXJjdWxhciBpbiBQcmV2IGluZGljZXMsIGFuZCBJTlZBTElELXRlcm1pbmF0ZWQgaW4gTmV4dCBpbmRpY2VzLiBUaGlzCisgIC8vLyBwcm92aWRlcyBlZmZpY2llbnQgYWNjZXNzIHRvIGxpc3QgdGFpbHMuIFRoZXNlIG5vZGVzIGNhbiBhbHNvIGJlCisgIC8vLyB0b21ic3RvbmVzLCBpbiB3aGljaCBjYXNlIHRoZXkgYXJlIGFjdHVhbGx5IG5vZGVzIGluIGEgc2luZ2xlLWxpbmtlZAorICAvLy8gZnJlZWxpc3Qgb2YgcmVjeWNsYWJsZSBzbG90cy4KKyAgc3RydWN0IFNNU05vZGUgeworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBJTlZBTElEID0gfjBVOworCisgICAgVmFsdWVUIERhdGE7CisgICAgdW5zaWduZWQgUHJldjsKKyAgICB1bnNpZ25lZCBOZXh0OworCisgICAgU01TTm9kZShWYWx1ZVQgRCwgdW5zaWduZWQgUCwgdW5zaWduZWQgTikgOiBEYXRhKEQpLCBQcmV2KFApLCBOZXh0KE4pIHt9CisKKyAgICAvLy8gTGlzdCB0YWlscyBoYXZlIGludmFsaWQgTmV4dHMuCisgICAgYm9vbCBpc1RhaWwoKSBjb25zdCB7CisgICAgICByZXR1cm4gTmV4dCA9PSBJTlZBTElEOworICAgIH0KKworICAgIC8vLyBXaGV0aGVyIHRoaXMgbm9kZSBpcyBhIHRvbWJzdG9uZSBub2RlLCBhbmQgdGh1cyBpcyBpbiBvdXIgZnJlZWxpc3QuCisgICAgYm9vbCBpc1RvbWJzdG9uZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBQcmV2ID09IElOVkFMSUQ7CisgICAgfQorCisgICAgLy8vIFNpbmNlIHRoZSBsaXN0IGlzIGNpcmN1bGFyIGluIFByZXYsIGFsbCBub24tdG9tYnN0b25lIG5vZGVzIGhhdmUgYSB2YWxpZAorICAgIC8vLyBQcmV2LgorICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIFByZXYgIT0gSU5WQUxJRDsgfQorICB9OworCisgIHVzaW5nIEtleVQgPSB0eXBlbmFtZSBLZXlGdW5jdG9yVDo6YXJndW1lbnRfdHlwZTsKKyAgdXNpbmcgRGVuc2VUID0gU21hbGxWZWN0b3I8U01TTm9kZSwgOD47CisgIERlbnNlVCBEZW5zZTsKKyAgU3BhcnNlVCAqU3BhcnNlID0gbnVsbHB0cjsKKyAgdW5zaWduZWQgVW5pdmVyc2UgPSAwOworICBLZXlGdW5jdG9yVCBLZXlJbmRleE9mOworICBTcGFyc2VTZXRWYWxGdW5jdG9yPEtleVQsIFZhbHVlVCwgS2V5RnVuY3RvclQ+IFZhbEluZGV4T2Y7CisKKyAgLy8vIFdlIGhhdmUgYSBidWlsdC1pbiByZWN5Y2xlciBmb3IgcmV1c2luZyB0b21ic3RvbmUgc2xvdHMuIFRoaXMgcmVjeWNsZXIKKyAgLy8vIHB1dHMgYSBzaW5nbHktbGlua2VkIGZyZWUgbGlzdCBpbnRvIHRvbWJzdG9uZSBzbG90cywgYWxsb3dpbmcgdXMgcXVpY2sKKyAgLy8vIGVyYXN1cmUsIGl0ZXJhdG9yIHByZXNlcnZhdGlvbiwgYW5kIGRlbnNlIHNpemUuCisgIHVuc2lnbmVkIEZyZWVsaXN0SWR4ID0gU01TTm9kZTo6SU5WQUxJRDsKKyAgdW5zaWduZWQgTnVtRnJlZSA9IDA7CisKKyAgdW5zaWduZWQgc3BhcnNlSW5kZXgoY29uc3QgVmFsdWVUICZWYWwpIGNvbnN0IHsKKyAgICBhc3NlcnQoVmFsSW5kZXhPZihWYWwpIDwgVW5pdmVyc2UgJiYKKyAgICAgICAgICAgIkludmFsaWQga2V5IGluIHNldC4gRGlkIG9iamVjdCBtdXRhdGU/Iik7CisgICAgcmV0dXJuIFZhbEluZGV4T2YoVmFsKTsKKyAgfQorICB1bnNpZ25lZCBzcGFyc2VJbmRleChjb25zdCBTTVNOb2RlICZOKSBjb25zdCB7IHJldHVybiBzcGFyc2VJbmRleChOLkRhdGEpOyB9CisKKyAgLy8vIFdoZXRoZXIgdGhlIGdpdmVuIGVudHJ5IGlzIHRoZSBoZWFkIG9mIHRoZSBsaXN0LiBMaXN0IGhlYWRzJ3MgcHJldmlvdXMKKyAgLy8vIHBvaW50ZXJzIGFyZSB0byB0aGUgdGFpbCBvZiB0aGUgbGlzdCwgYWxsb3dpbmcgZm9yIGVmZmljaWVudCBhY2Nlc3MgdG8gdGhlCisgIC8vLyBsaXN0IHRhaWwuIEQgbXVzdCBiZSBhIHZhbGlkIGVudHJ5IG5vZGUuCisgIGJvb2wgaXNIZWFkKGNvbnN0IFNNU05vZGUgJkQpIGNvbnN0IHsKKyAgICBhc3NlcnQoRC5pc1ZhbGlkKCkgJiYgIkludmFsaWQgbm9kZSBmb3IgaGVhZCIpOworICAgIHJldHVybiBEZW5zZVtELlByZXZdLmlzVGFpbCgpOworICB9CisKKyAgLy8vIFdoZXRoZXIgdGhlIGdpdmVuIGVudHJ5IGlzIGEgc2luZ2xldG9uIGVudHJ5LCBpLmUuIHRoZSBvbmx5IGVudHJ5IHdpdGgKKyAgLy8vIHRoYXQga2V5LgorICBib29sIGlzU2luZ2xldG9uKGNvbnN0IFNNU05vZGUgJk4pIGNvbnN0IHsKKyAgICBhc3NlcnQoTi5pc1ZhbGlkKCkgJiYgIkludmFsaWQgbm9kZSBmb3Igc2luZ2xldG9uIik7CisgICAgLy8gSXMgTiBpdHMgb3duIHByZWRlY2Vzc29yPworICAgIHJldHVybiAmRGVuc2VbTi5QcmV2XSA9PSAmTjsKKyAgfQorCisgIC8vLyBBZGQgaW4gdGhlIGdpdmVuIFNNU05vZGUuIFVzZXMgYSBmcmVlIGVudHJ5IGluIG91ciBmcmVlbGlzdCBpZgorICAvLy8gYXZhaWxhYmxlLiBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgYWRkZWQgbm9kZS4KKyAgdW5zaWduZWQgYWRkVmFsdWUoY29uc3QgVmFsdWVUJiBWLCB1bnNpZ25lZCBQcmV2LCB1bnNpZ25lZCBOZXh0KSB7CisgICAgaWYgKE51bUZyZWUgPT0gMCkgeworICAgICAgRGVuc2UucHVzaF9iYWNrKFNNU05vZGUoViwgUHJldiwgTmV4dCkpOworICAgICAgcmV0dXJuIERlbnNlLnNpemUoKSAtIDE7CisgICAgfQorCisgICAgLy8gUGVlbCBvZmYgYSBmcmVlIHNsb3QKKyAgICB1bnNpZ25lZCBJZHggPSBGcmVlbGlzdElkeDsKKyAgICB1bnNpZ25lZCBOZXh0RnJlZSA9IERlbnNlW0lkeF0uTmV4dDsKKyAgICBhc3NlcnQoRGVuc2VbSWR4XS5pc1RvbWJzdG9uZSgpICYmICJOb24tdG9tYnN0b25lIGZyZWU/Iik7CisKKyAgICBEZW5zZVtJZHhdID0gU01TTm9kZShWLCBQcmV2LCBOZXh0KTsKKyAgICBGcmVlbGlzdElkeCA9IE5leHRGcmVlOworICAgIC0tTnVtRnJlZTsKKyAgICByZXR1cm4gSWR4OworICB9CisKKyAgLy8vIE1ha2UgdGhlIGN1cnJlbnQgaW5kZXggYSBuZXcgdG9tYnN0b25lLiBQdXNoZXMgaXQgb250byB0aGUgZnJlZWxpc3QuCisgIHZvaWQgbWFrZVRvbWJzdG9uZSh1bnNpZ25lZCBJZHgpIHsKKyAgICBEZW5zZVtJZHhdLlByZXYgPSBTTVNOb2RlOjpJTlZBTElEOworICAgIERlbnNlW0lkeF0uTmV4dCA9IEZyZWVsaXN0SWR4OworICAgIEZyZWVsaXN0SWR4ID0gSWR4OworICAgICsrTnVtRnJlZTsKKyAgfQorCitwdWJsaWM6CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBWYWx1ZVQ7CisgIHVzaW5nIHJlZmVyZW5jZSA9IFZhbHVlVCAmOworICB1c2luZyBjb25zdF9yZWZlcmVuY2UgPSBjb25zdCBWYWx1ZVQgJjsKKyAgdXNpbmcgcG9pbnRlciA9IFZhbHVlVCAqOworICB1c2luZyBjb25zdF9wb2ludGVyID0gY29uc3QgVmFsdWVUICo7CisgIHVzaW5nIHNpemVfdHlwZSA9IHVuc2lnbmVkOworCisgIFNwYXJzZU11bHRpU2V0KCkgPSBkZWZhdWx0OworICBTcGFyc2VNdWx0aVNldChjb25zdCBTcGFyc2VNdWx0aVNldCAmKSA9IGRlbGV0ZTsKKyAgU3BhcnNlTXVsdGlTZXQgJm9wZXJhdG9yPShjb25zdCBTcGFyc2VNdWx0aVNldCAmKSA9IGRlbGV0ZTsKKyAgflNwYXJzZU11bHRpU2V0KCkgeyBmcmVlKFNwYXJzZSk7IH0KKworICAvLy8gU2V0IHRoZSB1bml2ZXJzZSBzaXplIHdoaWNoIGRldGVybWluZXMgdGhlIGxhcmdlc3Qga2V5IHRoZSBzZXQgY2FuIGhvbGQuCisgIC8vLyBUaGUgdW5pdmVyc2UgbXVzdCBiZSBzaXplZCBiZWZvcmUgYW55IGVsZW1lbnRzIGNhbiBiZSBhZGRlZC4KKyAgLy8vCisgIC8vLyBAcGFyYW0gVSBVbml2ZXJzZSBzaXplLiBBbGwgb2JqZWN0IGtleXMgbXVzdCBiZSBsZXNzIHRoYW4gVS4KKyAgLy8vCisgIHZvaWQgc2V0VW5pdmVyc2UodW5zaWduZWQgVSkgeworICAgIC8vIEl0J3Mgbm90IGhhcmQgdG8gcmVzaXplIHRoZSB1bml2ZXJzZSBvbiBhIG5vbi1lbXB0eSBzZXQsIGJ1dCBpdCBkb2Vzbid0CisgICAgLy8gc2VlbSBsaWtlIGEgbGlrZWx5IHVzZSBjYXNlLCBzbyB3ZSBjYW4gYWRkIHRoYXQgY29kZSB3aGVuIHdlIG5lZWQgaXQuCisgICAgYXNzZXJ0KGVtcHR5KCkgJiYgIkNhbiBvbmx5IHJlc2l6ZSB1bml2ZXJzZSBvbiBhbiBlbXB0eSBtYXAiKTsKKyAgICAvLyBIeXN0ZXJlc2lzIHByZXZlbnRzIG5lZWRsZXNzIHJlYWxsb2NhdGlvbnMuCisgICAgaWYgKFUgPj0gVW5pdmVyc2UvNCAmJiBVIDw9IFVuaXZlcnNlKQorICAgICAgcmV0dXJuOworICAgIGZyZWUoU3BhcnNlKTsKKyAgICAvLyBUaGUgU3BhcnNlIGFycmF5IGRvZXNuJ3QgYWN0dWFsbHkgbmVlZCB0byBiZSBpbml0aWFsaXplZCwgc28gbWFsbG9jCisgICAgLy8gd291bGQgYmUgZW5vdWdoIGhlcmUsIGJ1dCB0aGF0IHdpbGwgY2F1c2UgdG9vbHMgbGlrZSB2YWxncmluZCB0bworICAgIC8vIGNvbXBsYWluIGFib3V0IGJyYW5jaGluZyBvbiB1bmluaXRpYWxpemVkIGRhdGEuCisgICAgU3BhcnNlID0gc3RhdGljX2Nhc3Q8U3BhcnNlVCo+KHNhZmVfY2FsbG9jKFUsIHNpemVvZihTcGFyc2VUKSkpOworICAgIFVuaXZlcnNlID0gVTsKKyAgfQorCisgIC8vLyBPdXIgaXRlcmF0b3JzIGFyZSBpdGVyYXRvcnMgb3ZlciB0aGUgY29sbGVjdGlvbiBvZiBvYmplY3RzIHRoYXQgc2hhcmUgYQorICAvLy8ga2V5LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTTVNQdHJUeT4KKyAgY2xhc3MgaXRlcmF0b3JfYmFzZSA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVQ+IHsKKyAgICBmcmllbmQgY2xhc3MgU3BhcnNlTXVsdGlTZXQ7CisKKyAgICBTTVNQdHJUeSBTTVM7CisgICAgdW5zaWduZWQgSWR4OworICAgIHVuc2lnbmVkIFNwYXJzZUlkeDsKKworICAgIGl0ZXJhdG9yX2Jhc2UoU01TUHRyVHkgUCwgdW5zaWduZWQgSSwgdW5zaWduZWQgU0kpCisgICAgICA6IFNNUyhQKSwgSWR4KEkpLCBTcGFyc2VJZHgoU0kpIHt9CisKKyAgICAvLy8gV2hldGhlciBvdXIgaXRlcmF0b3IgaGFzIGZhbGxlbiBvdXRzaWRlIG91ciBkZW5zZSB2ZWN0b3IuCisgICAgYm9vbCBpc0VuZCgpIGNvbnN0IHsKKyAgICAgIGlmIChJZHggPT0gU01TTm9kZTo6SU5WQUxJRCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIGFzc2VydChJZHggPCBTTVMtPkRlbnNlLnNpemUoKSAmJiAiT3V0IG9mIHJhbmdlLCBub24tSU5WQUxJRCBJZHg/Iik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8vIFdoZXRoZXIgb3VyIGl0ZXJhdG9yIGlzIHByb3Blcmx5IGtleWVkLCBpLmUuIHRoZSBTcGFyc2VJZHggaXMgdmFsaWQKKyAgICBib29sIGlzS2V5ZWQoKSBjb25zdCB7IHJldHVybiBTcGFyc2VJZHggPCBTTVMtPlVuaXZlcnNlOyB9CisKKyAgICB1bnNpZ25lZCBQcmV2KCkgY29uc3QgeyByZXR1cm4gU01TLT5EZW5zZVtJZHhdLlByZXY7IH0KKyAgICB1bnNpZ25lZCBOZXh0KCkgY29uc3QgeyByZXR1cm4gU01TLT5EZW5zZVtJZHhdLk5leHQ7IH0KKworICAgIHZvaWQgc2V0UHJldih1bnNpZ25lZCBQKSB7IFNNUy0+RGVuc2VbSWR4XS5QcmV2ID0gUDsgfQorICAgIHZvaWQgc2V0TmV4dCh1bnNpZ25lZCBOKSB7IFNNUy0+RGVuc2VbSWR4XS5OZXh0ID0gTjsgfQorCisgIHB1YmxpYzoKKyAgICB1c2luZyBzdXBlciA9IHN0ZDo6aXRlcmF0b3I8c3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZywgVmFsdWVUPjsKKyAgICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgc3VwZXI6OnZhbHVlX3R5cGU7CisgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gdHlwZW5hbWUgc3VwZXI6OmRpZmZlcmVuY2VfdHlwZTsKKyAgICB1c2luZyBwb2ludGVyID0gdHlwZW5hbWUgc3VwZXI6OnBvaW50ZXI7CisgICAgdXNpbmcgcmVmZXJlbmNlID0gdHlwZW5hbWUgc3VwZXI6OnJlZmVyZW5jZTsKKworICAgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7CisgICAgICBhc3NlcnQoaXNLZXllZCgpICYmIFNNUy0+c3BhcnNlSW5kZXgoU01TLT5EZW5zZVtJZHhdLkRhdGEpID09IFNwYXJzZUlkeCAmJgorICAgICAgICAgICAgICJEZXJlZmVyZW5jaW5nIGl0ZXJhdG9yIG9mIGludmFsaWQga2V5IG9yIGluZGV4Iik7CisKKyAgICAgIHJldHVybiBTTVMtPkRlbnNlW0lkeF0uRGF0YTsKKyAgICB9CisgICAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJm9wZXJhdG9yKigpOyB9CisKKyAgICAvLy8gQ29tcGFyaXNvbiBvcGVyYXRvcnMKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3JfYmFzZSAmUkhTKSBjb25zdCB7CisgICAgICAvLyBlbmQgY29tcGFyZXMgZXF1YWwKKyAgICAgIGlmIChTTVMgPT0gUkhTLlNNUyAmJiBJZHggPT0gUkhTLklkeCkgeworICAgICAgICBhc3NlcnQoKGlzRW5kKCkgfHwgU3BhcnNlSWR4ID09IFJIUy5TcGFyc2VJZHgpICYmCisgICAgICAgICAgICAgICAiU2FtZSBkZW5zZSBlbnRyeSwgYnV0IGRpZmZlcmVudCBrZXlzPyIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvcl9iYXNlICZSSFMpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PShSSFMpOworICAgIH0KKworICAgIC8vLyBJbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBvcGVyYXRvcnMKKyAgICBpdGVyYXRvcl9iYXNlICZvcGVyYXRvci0tKCkgeyAvLyBwcmVkZWNyZW1lbnQgLSBCYWNrIHVwCisgICAgICBhc3NlcnQoaXNLZXllZCgpICYmICJEZWNyZW1lbnRpbmcgYW4gaW52YWxpZCBpdGVyYXRvciIpOworICAgICAgYXNzZXJ0KChpc0VuZCgpIHx8ICFTTVMtPmlzSGVhZChTTVMtPkRlbnNlW0lkeF0pKSAmJgorICAgICAgICAgICAgICJEZWNyZW1lbnRpbmcgaGVhZCBvZiBsaXN0Iik7CisKKyAgICAgIC8vIElmIHdlJ3JlIGF0IHRoZSBlbmQsIHRoZW4gaXNzdWUgYSBuZXcgZmluZCgpCisgICAgICBpZiAoaXNFbmQoKSkKKyAgICAgICAgSWR4ID0gU01TLT5maW5kSW5kZXgoU3BhcnNlSWR4KS5QcmV2KCk7CisgICAgICBlbHNlCisgICAgICAgIElkeCA9IFByZXYoKTsKKworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBpdGVyYXRvcl9iYXNlICZvcGVyYXRvcisrKCkgeyAvLyBwcmVpbmNyZW1lbnQgLSBBZHZhbmNlCisgICAgICBhc3NlcnQoIWlzRW5kKCkgJiYgaXNLZXllZCgpICYmICJJbmNyZW1lbnRpbmcgYW4gaW52YWxpZC9lbmQgaXRlcmF0b3IiKTsKKyAgICAgIElkeCA9IE5leHQoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgaXRlcmF0b3JfYmFzZSBvcGVyYXRvci0tKGludCkgeyAvLyBwb3N0ZGVjcmVtZW50CisgICAgICBpdGVyYXRvcl9iYXNlIEkoKnRoaXMpOworICAgICAgLS0qdGhpczsKKyAgICAgIHJldHVybiBJOworICAgIH0KKyAgICBpdGVyYXRvcl9iYXNlIG9wZXJhdG9yKysoaW50KSB7IC8vIHBvc3RpbmNyZW1lbnQKKyAgICAgIGl0ZXJhdG9yX2Jhc2UgSSgqdGhpcyk7CisgICAgICArKyp0aGlzOworICAgICAgcmV0dXJuIEk7CisgICAgfQorICB9OworCisgIHVzaW5nIGl0ZXJhdG9yID0gaXRlcmF0b3JfYmFzZTxTcGFyc2VNdWx0aVNldCAqPjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBpdGVyYXRvcl9iYXNlPGNvbnN0IFNwYXJzZU11bHRpU2V0ICo+OworCisgIC8vIENvbnZlbmllbmNlIHR5cGVzCisgIHVzaW5nIFJhbmdlUGFpciA9IHN0ZDo6cGFpcjxpdGVyYXRvciwgaXRlcmF0b3I+OworCisgIC8vLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHBhc3QgdGhpcyBjb250YWluZXIuIE5vdGUgdGhhdCBzdWNoIGFuIGl0ZXJhdG9yIGNhbm5vdAorICAvLy8gYmUgZGVjcmVtZW50ZWQsIGJ1dCB3aWxsIGNvbXBhcmUgZXF1YWwgdG8gb3RoZXIgZW5kIGl0ZXJhdG9ycy4KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gaXRlcmF0b3IodGhpcywgU01TTm9kZTo6SU5WQUxJRCwgU01TTm9kZTo6SU5WQUxJRCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzLCBTTVNOb2RlOjpJTlZBTElELCBTTVNOb2RlOjpJTlZBTElEKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNldCBpcyBlbXB0eS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBCaXRWZWN0b3I6OmVtcHR5KCkuCisgIC8vLworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gc2l6ZSgpID09IDA7IH0KKworICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBzZXQuCisgIC8vLworICAvLy8gVGhpcyBpcyBub3QgdGhlIHNhbWUgYXMgQml0VmVjdG9yOjpzaXplKCkgd2hpY2ggcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUKKyAgLy8vIHVuaXZlcnNlLgorICAvLy8KKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7CisgICAgYXNzZXJ0KE51bUZyZWUgPD0gRGVuc2Uuc2l6ZSgpICYmICJPdXQtb2YtYm91bmRzIGZyZWUgZW50cmllcyIpOworICAgIHJldHVybiBEZW5zZS5zaXplKCkgLSBOdW1GcmVlOworICB9CisKKyAgLy8vIENsZWFycyB0aGUgc2V0LiAgVGhpcyBpcyBhIHZlcnkgZmFzdCBjb25zdGFudCB0aW1lIG9wZXJhdGlvbi4KKyAgLy8vCisgIHZvaWQgY2xlYXIoKSB7CisgICAgLy8gU3BhcnNlIGRvZXMgbm90IG5lZWQgdG8gYmUgY2xlYXJlZCwgc2VlIGZpbmQoKS4KKyAgICBEZW5zZS5jbGVhcigpOworICAgIE51bUZyZWUgPSAwOworICAgIEZyZWVsaXN0SWR4ID0gU01TTm9kZTo6SU5WQUxJRDsKKyAgfQorCisgIC8vLyBGaW5kIGFuIGVsZW1lbnQgYnkgaXRzIGluZGV4LgorICAvLy8KKyAgLy8vIEBwYXJhbSAgIElkeCBBIHZhbGlkIGluZGV4IHRvIGZpbmQuCisgIC8vLyBAcmV0dXJucyBBbiBpdGVyYXRvciB0byB0aGUgZWxlbWVudCBpZGVudGlmaWVkIGJ5IGtleSwgb3IgZW5kKCkuCisgIC8vLworICBpdGVyYXRvciBmaW5kSW5kZXgodW5zaWduZWQgSWR4KSB7CisgICAgYXNzZXJ0KElkeCA8IFVuaXZlcnNlICYmICJLZXkgb3V0IG9mIHJhbmdlIik7CisgICAgY29uc3QgdW5zaWduZWQgU3RyaWRlID0gc3RkOjpudW1lcmljX2xpbWl0czxTcGFyc2VUPjo6bWF4KCkgKyAxdTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBTcGFyc2VbSWR4XSwgZSA9IERlbnNlLnNpemUoKTsgaSA8IGU7IGkgKz0gU3RyaWRlKSB7CisgICAgICBjb25zdCB1bnNpZ25lZCBGb3VuZElkeCA9IHNwYXJzZUluZGV4KERlbnNlW2ldKTsKKyAgICAgIC8vIENoZWNrIHRoYXQgd2UncmUgcG9pbnRpbmcgYXQgdGhlIGNvcnJlY3QgZW50cnkgYW5kIHRoYXQgaXQgaXMgdGhlIGhlYWQKKyAgICAgIC8vIG9mIGEgdmFsaWQgbGlzdC4KKyAgICAgIGlmIChJZHggPT0gRm91bmRJZHggJiYgRGVuc2VbaV0uaXNWYWxpZCgpICYmIGlzSGVhZChEZW5zZVtpXSkpCisgICAgICAgIHJldHVybiBpdGVyYXRvcih0aGlzLCBpLCBJZHgpOworICAgICAgLy8gU3RyaWRlIGlzIDAgd2hlbiBTcGFyc2VUID49IHVuc2lnbmVkLiAgV2UgZG9uJ3QgbmVlZCB0byBsb29wLgorICAgICAgaWYgKCFTdHJpZGUpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gZW5kKCk7CisgIH0KKworICAvLy8gRmluZCBhbiBlbGVtZW50IGJ5IGl0cyBrZXkuCisgIC8vLworICAvLy8gQHBhcmFtICAgS2V5IEEgdmFsaWQga2V5IHRvIGZpbmQuCisgIC8vLyBAcmV0dXJucyBBbiBpdGVyYXRvciB0byB0aGUgZWxlbWVudCBpZGVudGlmaWVkIGJ5IGtleSwgb3IgZW5kKCkuCisgIC8vLworICBpdGVyYXRvciBmaW5kKGNvbnN0IEtleVQgJktleSkgeworICAgIHJldHVybiBmaW5kSW5kZXgoS2V5SW5kZXhPZihLZXkpKTsKKyAgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgS2V5VCAmS2V5KSBjb25zdCB7CisgICAgaXRlcmF0b3IgSSA9IGNvbnN0X2Nhc3Q8U3BhcnNlTXVsdGlTZXQqPih0aGlzKS0+ZmluZEluZGV4KEtleUluZGV4T2YoS2V5KSk7CisgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKEkuU01TLCBJLklkeCwgS2V5SW5kZXhPZihLZXkpKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaWRlbnRpZmllZCBieSBLZXkuIFRoaXMgd2lsbCBiZSBsaW5lYXIgaW4KKyAgLy8vIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgdGhhdCBrZXkuCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBLZXlUICZLZXkpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBSZXQgPSAwOworICAgIGZvciAoY29uc3RfaXRlcmF0b3IgSXQgPSBmaW5kKEtleSk7IEl0ICE9IGVuZCgpOyArK0l0KQorICAgICAgKytSZXQ7CisKKyAgICByZXR1cm4gUmV0OworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHNldCBjb250YWlucyBhbiBlbGVtZW50IGlkZW50aWZpZWQgYnkgS2V5LgorICBib29sIGNvbnRhaW5zKGNvbnN0IEtleVQgJktleSkgY29uc3QgeworICAgIHJldHVybiBmaW5kKEtleSkgIT0gZW5kKCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBoZWFkIGFuZCB0YWlsIG9mIHRoZSBzdWJzZXQncyBsaXN0LCBvdGhlcndpc2UgcmV0dXJucyBlbmQoKS4KKyAgaXRlcmF0b3IgZ2V0SGVhZChjb25zdCBLZXlUICZLZXkpIHsgcmV0dXJuIGZpbmQoS2V5KTsgfQorICBpdGVyYXRvciBnZXRUYWlsKGNvbnN0IEtleVQgJktleSkgeworICAgIGl0ZXJhdG9yIEkgPSBmaW5kKEtleSk7CisgICAgaWYgKEkgIT0gZW5kKCkpCisgICAgICBJID0gaXRlcmF0b3IodGhpcywgSS5QcmV2KCksIEtleUluZGV4T2YoS2V5KSk7CisgICAgcmV0dXJuIEk7CisgIH0KKworICAvLy8gVGhlIGJvdW5kcyBvZiB0aGUgcmFuZ2Ugb2YgaXRlbXMgc2hhcmluZyBLZXkgSy4gRmlyc3QgbWVtYmVyIGlzIHRoZSBoZWFkCisgIC8vLyBvZiB0aGUgbGlzdCwgYW5kIHRoZSBzZWNvbmQgbWVtYmVyIGlzIGEgZGVjcmVtZW50YWJsZSBlbmQgaXRlcmF0b3IgZm9yCisgIC8vLyB0aGF0IGtleS4KKyAgUmFuZ2VQYWlyIGVxdWFsX3JhbmdlKGNvbnN0IEtleVQgJkspIHsKKyAgICBpdGVyYXRvciBCID0gZmluZChLKTsKKyAgICBpdGVyYXRvciBFID0gaXRlcmF0b3IodGhpcywgU01TTm9kZTo6SU5WQUxJRCwgQi5TcGFyc2VJZHgpOworICAgIHJldHVybiBtYWtlX3BhaXIoQiwgRSk7CisgIH0KKworICAvLy8gSW5zZXJ0IGEgbmV3IGVsZW1lbnQgYXQgdGhlIHRhaWwgb2YgdGhlIHN1YnNldCBsaXN0LiBSZXR1cm5zIGFuIGl0ZXJhdG9yCisgIC8vLyB0byB0aGUgbmV3bHkgYWRkZWQgZW50cnkuCisgIGl0ZXJhdG9yIGluc2VydChjb25zdCBWYWx1ZVQgJlZhbCkgeworICAgIHVuc2lnbmVkIElkeCA9IHNwYXJzZUluZGV4KFZhbCk7CisgICAgaXRlcmF0b3IgSSA9IGZpbmRJbmRleChJZHgpOworCisgICAgdW5zaWduZWQgTm9kZUlkeCA9IGFkZFZhbHVlKFZhbCwgU01TTm9kZTo6SU5WQUxJRCwgU01TTm9kZTo6SU5WQUxJRCk7CisKKyAgICBpZiAoSSA9PSBlbmQoKSkgeworICAgICAgLy8gTWFrZSBhIHNpbmdsZXRvbiBsaXN0CisgICAgICBTcGFyc2VbSWR4XSA9IE5vZGVJZHg7CisgICAgICBEZW5zZVtOb2RlSWR4XS5QcmV2ID0gTm9kZUlkeDsKKyAgICAgIHJldHVybiBpdGVyYXRvcih0aGlzLCBOb2RlSWR4LCBJZHgpOworICAgIH0KKworICAgIC8vIFN0aWNrIGl0IGF0IHRoZSBlbmQuCisgICAgdW5zaWduZWQgSGVhZElkeCA9IEkuSWR4OworICAgIHVuc2lnbmVkIFRhaWxJZHggPSBJLlByZXYoKTsKKyAgICBEZW5zZVtUYWlsSWR4XS5OZXh0ID0gTm9kZUlkeDsKKyAgICBEZW5zZVtIZWFkSWR4XS5QcmV2ID0gTm9kZUlkeDsKKyAgICBEZW5zZVtOb2RlSWR4XS5QcmV2ID0gVGFpbElkeDsKKworICAgIHJldHVybiBpdGVyYXRvcih0aGlzLCBOb2RlSWR4LCBJZHgpOworICB9CisKKyAgLy8vIEVyYXNlcyBhbiBleGlzdGluZyBlbGVtZW50IGlkZW50aWZpZWQgYnkgYSB2YWxpZCBpdGVyYXRvci4KKyAgLy8vCisgIC8vLyBUaGlzIGludmFsaWRhdGVzIGl0ZXJhdG9ycyBwb2ludGluZyBhdCB0aGUgc2FtZSBlbnRyeSwgYnV0IGVyYXNlKCkgcmV0dXJucworICAvLy8gYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgc3Vic2V0J3MgbGlzdC4gVGhpcyBtYWtlcworICAvLy8gaXQgcG9zc2libGUgdG8gZXJhc2Ugc2VsZWN0ZWQgZWxlbWVudHMgd2hpbGUgaXRlcmF0aW5nIG92ZXIgdGhlIHN1YnNldDoKKyAgLy8vCisgIC8vLyAgIHRpZShJLCBFKSA9IFNldC5lcXVhbF9yYW5nZShLZXkpOworICAvLy8gICB3aGlsZSAoSSAhPSBFKQorICAvLy8gICAgIGlmICh0ZXN0KCpJKSkKKyAgLy8vICAgICAgIEkgPSBTZXQuZXJhc2UoSSk7CisgIC8vLyAgICAgZWxzZQorICAvLy8gICAgICAgKytJOworICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBpZiB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBzdWJzZXQgbGlzdCBpcyBlcmFzZWQsIHRoaXMgd2lsbAorICAvLy8gcmV0dXJuIGFuIGVuZCBpdGVyYXRvciB3aGljaCBjYW4gYmUgZGVjcmVtZW50ZWQgdG8gZ2V0IHRoZSBuZXcgdGFpbCAoaWYgaXQKKyAgLy8vIGV4aXN0cyk6CisgIC8vLworICAvLy8gIHRpZShCLCBJKSA9IFNldC5lcXVhbF9yYW5nZShLZXkpOworICAvLy8gIGZvciAoYm9vbCBpc0JlZ2luID0gQiA9PSBJOyAhaXNCZWdpbjsgLyogZW1wdHkgKi8pIHsKKyAgLy8vICAgIGlzQmVnaW4gPSAoLS1JKSA9PSBCOworICAvLy8gICAgaWYgKHRlc3QoSSkpCisgIC8vLyAgICAgIGJyZWFrOworICAvLy8gICAgSSA9IGVyYXNlKEkpOworICAvLy8gIH0KKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgSSkgeworICAgIGFzc2VydChJLmlzS2V5ZWQoKSAmJiAhSS5pc0VuZCgpICYmICFEZW5zZVtJLklkeF0uaXNUb21ic3RvbmUoKSAmJgorICAgICAgICAgICAiZXJhc2luZyBpbnZhbGlkL2VuZC90b21ic3RvbmUgaXRlcmF0b3IiKTsKKworICAgIC8vIEZpcnN0LCB1bmxpbmsgdGhlIG5vZGUgZnJvbSBpdHMgbGlzdC4gVGhlbiBzd2FwIHRoZSBub2RlIG91dCB3aXRoIHRoZQorICAgIC8vIGRlbnNlIHZlY3RvcidzIGxhc3QgZW50cnkKKyAgICBpdGVyYXRvciBOZXh0SSA9IHVubGluayhEZW5zZVtJLklkeF0pOworCisgICAgLy8gUHV0IGluIGEgdG9tYnN0b25lLgorICAgIG1ha2VUb21ic3RvbmUoSS5JZHgpOworCisgICAgcmV0dXJuIE5leHRJOworICB9CisKKyAgLy8vIEVyYXNlIGFsbCBlbGVtZW50cyB3aXRoIHRoZSBnaXZlbiBrZXkuIFRoaXMgaW52YWxpZGF0ZXMgYWxsCisgIC8vLyBpdGVyYXRvcnMgb2YgdGhhdCBrZXkuCisgIHZvaWQgZXJhc2VBbGwoY29uc3QgS2V5VCAmSykgeworICAgIGZvciAoaXRlcmF0b3IgSSA9IGZpbmQoSyk7IEkgIT0gZW5kKCk7IC8qIGVtcHR5ICovKQorICAgICAgSSA9IGVyYXNlKEkpOworICB9CisKK3ByaXZhdGU6CisgIC8vLyBVbmxpbmsgdGhlIG5vZGUgZnJvbSBpdHMgbGlzdC4gUmV0dXJucyB0aGUgbmV4dCBub2RlIGluIHRoZSBsaXN0LgorICBpdGVyYXRvciB1bmxpbmsoY29uc3QgU01TTm9kZSAmTikgeworICAgIGlmIChpc1NpbmdsZXRvbihOKSkgeworICAgICAgLy8gU2luZ2xldG9uIGlzIGFscmVhZHkgdW5saW5rZWQKKyAgICAgIGFzc2VydChOLk5leHQgPT0gU01TTm9kZTo6SU5WQUxJRCAmJiAiU2luZ2xldG9uIGhhcyBuZXh0PyIpOworICAgICAgcmV0dXJuIGl0ZXJhdG9yKHRoaXMsIFNNU05vZGU6OklOVkFMSUQsIFZhbEluZGV4T2YoTi5EYXRhKSk7CisgICAgfQorCisgICAgaWYgKGlzSGVhZChOKSkgeworICAgICAgLy8gSWYgd2UncmUgdGhlIGhlYWQsIHRoZW4gdXBkYXRlIHRoZSBzcGFyc2UgYXJyYXkgYW5kIG91ciBuZXh0LgorICAgICAgU3BhcnNlW3NwYXJzZUluZGV4KE4pXSA9IE4uTmV4dDsKKyAgICAgIERlbnNlW04uTmV4dF0uUHJldiA9IE4uUHJldjsKKyAgICAgIHJldHVybiBpdGVyYXRvcih0aGlzLCBOLk5leHQsIFZhbEluZGV4T2YoTi5EYXRhKSk7CisgICAgfQorCisgICAgaWYgKE4uaXNUYWlsKCkpIHsKKyAgICAgIC8vIElmIHdlJ3JlIHRoZSB0YWlsLCB0aGVuIHVwZGF0ZSBvdXIgaGVhZCBhbmQgb3VyIHByZXZpb3VzLgorICAgICAgZmluZEluZGV4KHNwYXJzZUluZGV4KE4pKS5zZXRQcmV2KE4uUHJldik7CisgICAgICBEZW5zZVtOLlByZXZdLk5leHQgPSBOLk5leHQ7CisKKyAgICAgIC8vIEdpdmUgYmFjayBhbiBlbmQgaXRlcmF0b3IgdGhhdCBjYW4gYmUgZGVjcmVtZW50ZWQKKyAgICAgIGl0ZXJhdG9yIEkodGhpcywgTi5QcmV2LCBWYWxJbmRleE9mKE4uRGF0YSkpOworICAgICAgcmV0dXJuICsrSTsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIGp1c3QgZHJvcCB1cworICAgIERlbnNlW04uTmV4dF0uUHJldiA9IE4uUHJldjsKKyAgICBEZW5zZVtOLlByZXZdLk5leHQgPSBOLk5leHQ7CisgICAgcmV0dXJuIGl0ZXJhdG9yKHRoaXMsIE4uTmV4dCwgVmFsSW5kZXhPZihOLkRhdGEpKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX1NQQVJTRU1VTFRJU0VUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NwYXJzZVNldC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3BhcnNlU2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzRjYzZkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1NwYXJzZVNldC5oCkBAIC0wLDAgKzEsMzE2IEBACisvLz09PS0gbGx2bS9BRFQvU3BhcnNlU2V0LmggLSBTcGFyc2Ugc2V0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBTcGFyc2VTZXQgY2xhc3MgZGVyaXZlZCBmcm9tIHRoZSB2ZXJzaW9uIGRlc2NyaWJlZCBpbgorLy8gQnJpZ2dzLCBUb3Jjem9uLCAiQW4gZWZmaWNpZW50IHJlcHJlc2VudGF0aW9uIGZvciBzcGFyc2Ugc2V0cyIsIEFDTSBMZXR0ZXJzCisvLyBvbiBQcm9ncmFtbWluZyBMYW5ndWFnZXMgYW5kIFN5c3RlbXMsIFZvbHVtZSAyIElzc3VlIDEtNCwgTWFyY2gtRGVjLiAgMTk5My4KKy8vCisvLyBBIHNwYXJzZSBzZXQgaG9sZHMgYSBzbWFsbCBudW1iZXIgb2Ygb2JqZWN0cyBpZGVudGlmaWVkIGJ5IGludGVnZXIga2V5cyBmcm9tCisvLyBhIG1vZGVyYXRlbHkgc2l6ZWQgdW5pdmVyc2UuIFRoZSBzcGFyc2Ugc2V0IHVzZXMgbW9yZSBtZW1vcnkgdGhhbiBvdGhlcgorLy8gY29udGFpbmVycyBpbiBvcmRlciB0byBwcm92aWRlIGZhc3RlciBvcGVyYXRpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU1BBUlNFU0VUX0gKKyNkZWZpbmUgTExWTV9BRFRfU1BBUlNFU0VUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RkbGliPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBTcGFyc2VTZXRWYWxUcmFpdHMgLSBPYmplY3RzIGluIGEgU3BhcnNlU2V0IGFyZSBpZGVudGlmaWVkIGJ5IGtleXMgdGhhdCBjYW4KKy8vLyBiZSB1bmlxdWVseSBjb252ZXJ0ZWQgdG8gYSBzbWFsbCBpbnRlZ2VyIGxlc3MgdGhhbiB0aGUgc2V0J3MgdW5pdmVyc2UuIFRoaXMKKy8vLyBjbGFzcyBhbGxvd3MgdGhlIHNldCB0byBob2xkIHZhbHVlcyB0aGF0IGRpZmZlciBmcm9tIHRoZSBzZXQncyBrZXkgdHlwZSBhcworLy8vIGxvbmcgYXMgYW4gaW5kZXggY2FuIHN0aWxsIGJlIGRlcml2ZWQgZnJvbSB0aGUgdmFsdWUuIFNwYXJzZVNldCBuZXZlcgorLy8vIGRpcmVjdGx5IGNvbXBhcmVzIFZhbHVlVCwgb25seSB0aGVpciBpbmRpY2VzLCBzbyBpdCBjYW4gbWFwIGtleXMgdG8KKy8vLyBhcmJpdHJhcnkgdmFsdWVzLiBTcGFyc2VTZXRWYWxUcmFpdHMgY29tcHV0ZXMgdGhlIGluZGV4IGZyb20gdGhlIHZhbHVlCisvLy8gb2JqZWN0LiBUbyBjb21wdXRlIHRoZSBpbmRleCBmcm9tIGEga2V5LCBTcGFyc2VTZXQgdXNlcyBhIHNlcGFyYXRlCisvLy8gS2V5RnVuY3RvclQgdGVtcGxhdGUgYXJndW1lbnQuCisvLy8KKy8vLyBBIHNpbXBsZSB0eXBlIGRlY2xhcmF0aW9uLCBTcGFyc2VTZXQ8VHlwZT4sIGhhbmRsZXMgdGhlc2UgY2FzZXM6CisvLy8gLSB1bnNpZ25lZCBrZXksIGlkZW50aXR5IGluZGV4LCBpZGVudGl0eSB2YWx1ZQorLy8vIC0gdW5zaWduZWQga2V5LCBpZGVudGl0eSBpbmRleCwgZmF0IHZhbHVlIHByb3ZpZGluZyBnZXRTcGFyc2VTZXRJbmRleCgpCisvLy8KKy8vLyBUaGUgdHlwZSBkZWNsYXJhdGlvbiBTcGFyc2VTZXQ8VHlwZSwgVW5hcnlGdW5jdGlvbj4gaGFuZGxlczoKKy8vLyAtIHVuc2lnbmVkIGtleSwgcmVtYXBwZWQgaW5kZXgsIGlkZW50aXR5IHZhbHVlICh2aXJ0dWFsIHJlZ2lzdGVycykKKy8vLyAtIHBvaW50ZXIga2V5LCBwb2ludGVyLWRlcml2ZWQgaW5kZXgsIGlkZW50aXR5IHZhbHVlIChub2RlK0lEKQorLy8vIC0gcG9pbnRlciBrZXksIHBvaW50ZXItZGVyaXZlZCBpbmRleCwgZmF0IHZhbHVlIHdpdGggZ2V0U3BhcnNlU2V0SW5kZXgoKQorLy8vCisvLy8gT25seSBvdGhlciwgdW5leHBlY3RlZCBjYXNlcyByZXF1aXJlIHNwZWNpYWxpemluZyBTcGFyc2VTZXRWYWxUcmFpdHMuCisvLy8KKy8vLyBGb3IgYmVzdCByZXN1bHRzLCBWYWx1ZVQgc2hvdWxkIG5vdCByZXF1aXJlIGEgZGVzdHJ1Y3Rvci4KKy8vLwordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUPgorc3RydWN0IFNwYXJzZVNldFZhbFRyYWl0cyB7CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRWYWxJbmRleChjb25zdCBWYWx1ZVQgJlZhbCkgeworICAgIHJldHVybiBWYWwuZ2V0U3BhcnNlU2V0SW5kZXgoKTsKKyAgfQorfTsKKworLy8vIFNwYXJzZVNldFZhbEZ1bmN0b3IgLSBIZWxwZXIgY2xhc3MgZm9yIHNlbGVjdGluZyBTcGFyc2VTZXRWYWxUcmFpdHMuIFRoZQorLy8vIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gaGFuZGxlcyBWYWx1ZVQgY2xhc3NlcyB3aGljaCBlaXRoZXIgcHJvdmlkZQorLy8vIGdldFNwYXJzZVNldEluZGV4KCkgb3Igc3BlY2lhbGl6ZSBTcGFyc2VTZXRWYWxUcmFpdHM8Pi4KKy8vLwordGVtcGxhdGU8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsdWVULCB0eXBlbmFtZSBLZXlGdW5jdG9yVD4KK3N0cnVjdCBTcGFyc2VTZXRWYWxGdW5jdG9yIHsKKyAgdW5zaWduZWQgb3BlcmF0b3IoKShjb25zdCBWYWx1ZVQgJlZhbCkgY29uc3QgeworICAgIHJldHVybiBTcGFyc2VTZXRWYWxUcmFpdHM8VmFsdWVUPjo6Z2V0VmFsSW5kZXgoVmFsKTsKKyAgfQorfTsKKworLy8vIFNwYXJzZVNldFZhbEZ1bmN0b3I8S2V5VCwgS2V5VD4gLSBIZWxwZXIgY2xhc3MgZm9yIHRoZSBjb21tb24gY2FzZSBvZgorLy8vIGlkZW50aXR5IGtleS92YWx1ZSBzZXRzLgordGVtcGxhdGU8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgS2V5RnVuY3RvclQ+CitzdHJ1Y3QgU3BhcnNlU2V0VmFsRnVuY3RvcjxLZXlULCBLZXlULCBLZXlGdW5jdG9yVD4geworICB1bnNpZ25lZCBvcGVyYXRvcigpKGNvbnN0IEtleVQgJktleSkgY29uc3QgeworICAgIHJldHVybiBLZXlGdW5jdG9yVCgpKEtleSk7CisgIH0KK307CisKKy8vLyBTcGFyc2VTZXQgLSBGYXN0IHNldCBpbXBsbWVudGF0aW9uIGZvciBvYmplY3RzIHRoYXQgY2FuIGJlIGlkZW50aWZpZWQgYnkKKy8vLyBzbWFsbCB1bnNpZ25lZCBrZXlzLgorLy8vCisvLy8gU3BhcnNlU2V0IGFsbG9jYXRlcyBtZW1vcnkgcHJvcG9ydGlvbmFsIHRvIHRoZSBzaXplIG9mIHRoZSBrZXkgdW5pdmVyc2UsIHNvCisvLy8gaXQgaXMgbm90IHJlY29tbWVuZGVkIGZvciBidWlsZGluZyBjb21wb3NpdGUgZGF0YSBzdHJ1Y3R1cmVzLiAgSXQgaXMgdXNlZnVsCisvLy8gZm9yIGFsZ29yaXRobXMgdGhhdCByZXF1aXJlIGEgc2luZ2xlIHNldCB3aXRoIGZhc3Qgb3BlcmF0aW9ucy4KKy8vLworLy8vIENvbXBhcmVkIHRvIERlbnNlU2V0IGFuZCBEZW5zZU1hcCwgU3BhcnNlU2V0IHByb3ZpZGVzIGNvbnN0YW50LXRpbWUgZmFzdAorLy8vIGNsZWFyKCkgYW5kIGl0ZXJhdGlvbiBhcyBmYXN0IGFzIGEgdmVjdG9yLiAgVGhlIGZpbmQoKSwgaW5zZXJ0KCksIGFuZAorLy8vIGVyYXNlKCkgb3BlcmF0aW9ucyBhcmUgYWxsIGNvbnN0YW50IHRpbWUsIGFuZCB0eXBpY2FsbHkgZmFzdGVyIHRoYW4gYSBoYXNoCisvLy8gdGFibGUuICBUaGUgaXRlcmF0aW9uIG9yZGVyIGRvZXNuJ3QgZGVwZW5kIG9uIG51bWVyaWNhbCBrZXkgdmFsdWVzLCBpdCBvbmx5CisvLy8gZGVwZW5kcyBvbiB0aGUgb3JkZXIgb2YgaW5zZXJ0KCkgYW5kIGVyYXNlKCkgb3BlcmF0aW9ucy4gIFdoZW4gbm8gZWxlbWVudHMKKy8vLyBoYXZlIGJlZW4gZXJhc2VkLCB0aGUgaXRlcmF0aW9uIG9yZGVyIGlzIHRoZSBpbnNlcnRpb24gb3JkZXIuCisvLy8KKy8vLyBDb21wYXJlZCB0byBCaXRWZWN0b3IsIFNwYXJzZVNldDx1bnNpZ25lZD4gdXNlcyA4eC00MHggbW9yZSBtZW1vcnksIGJ1dAorLy8vIG9mZmVycyBjb25zdGFudC10aW1lIGNsZWFyKCkgYW5kIHNpemUoKSBvcGVyYXRpb25zIGFzIHdlbGwgYXMgZmFzdAorLy8vIGl0ZXJhdGlvbiBpbmRlcGVuZGVudCBvbiB0aGUgc2l6ZSBvZiB0aGUgdW5pdmVyc2UuCisvLy8KKy8vLyBTcGFyc2VTZXQgY29udGFpbnMgYSBkZW5zZSB2ZWN0b3IgaG9sZGluZyBhbGwgdGhlIG9iamVjdHMgYW5kIGEgc3BhcnNlCisvLy8gYXJyYXkgaG9sZGluZyBpbmRleGVzIGludG8gdGhlIGRlbnNlIHZlY3Rvci4gIE1vc3Qgb2YgdGhlIG1lbW9yeSBpcyB1c2VkIGJ5CisvLy8gdGhlIHNwYXJzZSBhcnJheSB3aGljaCBpcyB0aGUgc2l6ZSBvZiB0aGUga2V5IHVuaXZlcnNlLiAgVGhlIFNwYXJzZVQKKy8vLyB0ZW1wbGF0ZSBwYXJhbWV0ZXIgcHJvdmlkZXMgYSBzcGFjZS9zcGVlZCB0cmFkZW9mZiBmb3Igc2V0cyBob2xkaW5nIG1hbnkKKy8vLyBlbGVtZW50cy4KKy8vLworLy8vIFdoZW4gU3BhcnNlVCBpcyB1aW50MzJfdCwgZmluZCgpIG9ubHkgdG91Y2hlcyAyIGNhY2hlIGxpbmVzLCBidXQgdGhlIHNwYXJzZQorLy8vIGFycmF5IHVzZXMgNCB4IFVuaXZlcnNlIGJ5dGVzLgorLy8vCisvLy8gV2hlbiBTcGFyc2VUIGlzIHVpbnQ4X3QgKHRoZSBkZWZhdWx0KSwgZmluZCgpIHRvdWNoZXMgdXAgdG8gMitbTi8yNTZdIGNhY2hlCisvLy8gbGluZXMsIGJ1dCB0aGUgc3BhcnNlIGFycmF5IGlzIDR4IHNtYWxsZXIuICBOIGlzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4KKy8vLyB0aGUgc2V0LgorLy8vCisvLy8gRm9yIHNldHMgdGhhdCBtYXkgZ3JvdyB0byB0aG91c2FuZHMgb2YgZWxlbWVudHMsIFNwYXJzZVQgc2hvdWxkIGJlIHNldCB0bworLy8vIHVpbnQxNl90IG9yIHVpbnQzMl90LgorLy8vCisvLy8gQHRwYXJhbSBWYWx1ZVQgICAgICBUaGUgdHlwZSBvZiBvYmplY3RzIGluIHRoZSBzZXQuCisvLy8gQHRwYXJhbSBLZXlGdW5jdG9yVCBBIGZ1bmN0b3IgdGhhdCBjb21wdXRlcyBhbiB1bnNpZ25lZCBpbmRleCBmcm9tIEtleVQuCisvLy8gQHRwYXJhbSBTcGFyc2VUICAgICBBbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUuIFNlZSBhYm92ZS4KKy8vLwordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVULAorICAgICAgICAgdHlwZW5hbWUgS2V5RnVuY3RvclQgPSBpZGVudGl0eTx1bnNpZ25lZD4sCisgICAgICAgICB0eXBlbmFtZSBTcGFyc2VUID0gdWludDhfdD4KK2NsYXNzIFNwYXJzZVNldCB7CisgIHN0YXRpY19hc3NlcnQoc3RkOjpudW1lcmljX2xpbWl0czxTcGFyc2VUPjo6aXNfaW50ZWdlciAmJgorICAgICAgICAgICAgICAgICFzdGQ6Om51bWVyaWNfbGltaXRzPFNwYXJzZVQ+Ojppc19zaWduZWQsCisgICAgICAgICAgICAgICAgIlNwYXJzZVQgbXVzdCBiZSBhbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUiKTsKKworICB1c2luZyBLZXlUID0gdHlwZW5hbWUgS2V5RnVuY3RvclQ6OmFyZ3VtZW50X3R5cGU7CisgIHVzaW5nIERlbnNlVCA9IFNtYWxsVmVjdG9yPFZhbHVlVCwgOD47CisgIHVzaW5nIHNpemVfdHlwZSA9IHVuc2lnbmVkOworICBEZW5zZVQgRGVuc2U7CisgIFNwYXJzZVQgKlNwYXJzZSA9IG51bGxwdHI7CisgIHVuc2lnbmVkIFVuaXZlcnNlID0gMDsKKyAgS2V5RnVuY3RvclQgS2V5SW5kZXhPZjsKKyAgU3BhcnNlU2V0VmFsRnVuY3RvcjxLZXlULCBWYWx1ZVQsIEtleUZ1bmN0b3JUPiBWYWxJbmRleE9mOworCitwdWJsaWM6CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBWYWx1ZVQ7CisgIHVzaW5nIHJlZmVyZW5jZSA9IFZhbHVlVCAmOworICB1c2luZyBjb25zdF9yZWZlcmVuY2UgPSBjb25zdCBWYWx1ZVQgJjsKKyAgdXNpbmcgcG9pbnRlciA9IFZhbHVlVCAqOworICB1c2luZyBjb25zdF9wb2ludGVyID0gY29uc3QgVmFsdWVUICo7CisKKyAgU3BhcnNlU2V0KCkgPSBkZWZhdWx0OworICBTcGFyc2VTZXQoY29uc3QgU3BhcnNlU2V0ICYpID0gZGVsZXRlOworICBTcGFyc2VTZXQgJm9wZXJhdG9yPShjb25zdCBTcGFyc2VTZXQgJikgPSBkZWxldGU7CisgIH5TcGFyc2VTZXQoKSB7IGZyZWUoU3BhcnNlKTsgfQorCisgIC8vLyBzZXRVbml2ZXJzZSAtIFNldCB0aGUgdW5pdmVyc2Ugc2l6ZSB3aGljaCBkZXRlcm1pbmVzIHRoZSBsYXJnZXN0IGtleSB0aGUKKyAgLy8vIHNldCBjYW4gaG9sZC4gIFRoZSB1bml2ZXJzZSBtdXN0IGJlIHNpemVkIGJlZm9yZSBhbnkgZWxlbWVudHMgY2FuIGJlCisgIC8vLyBhZGRlZC4KKyAgLy8vCisgIC8vLyBAcGFyYW0gVSBVbml2ZXJzZSBzaXplLiBBbGwgb2JqZWN0IGtleXMgbXVzdCBiZSBsZXNzIHRoYW4gVS4KKyAgLy8vCisgIHZvaWQgc2V0VW5pdmVyc2UodW5zaWduZWQgVSkgeworICAgIC8vIEl0J3Mgbm90IGhhcmQgdG8gcmVzaXplIHRoZSB1bml2ZXJzZSBvbiBhIG5vbi1lbXB0eSBzZXQsIGJ1dCBpdCBkb2Vzbid0CisgICAgLy8gc2VlbSBsaWtlIGEgbGlrZWx5IHVzZSBjYXNlLCBzbyB3ZSBjYW4gYWRkIHRoYXQgY29kZSB3aGVuIHdlIG5lZWQgaXQuCisgICAgYXNzZXJ0KGVtcHR5KCkgJiYgIkNhbiBvbmx5IHJlc2l6ZSB1bml2ZXJzZSBvbiBhbiBlbXB0eSBtYXAiKTsKKyAgICAvLyBIeXN0ZXJlc2lzIHByZXZlbnRzIG5lZWRsZXNzIHJlYWxsb2NhdGlvbnMuCisgICAgaWYgKFUgPj0gVW5pdmVyc2UvNCAmJiBVIDw9IFVuaXZlcnNlKQorICAgICAgcmV0dXJuOworICAgIGZyZWUoU3BhcnNlKTsKKyAgICAvLyBUaGUgU3BhcnNlIGFycmF5IGRvZXNuJ3QgYWN0dWFsbHkgbmVlZCB0byBiZSBpbml0aWFsaXplZCwgc28gbWFsbG9jCisgICAgLy8gd291bGQgYmUgZW5vdWdoIGhlcmUsIGJ1dCB0aGF0IHdpbGwgY2F1c2UgdG9vbHMgbGlrZSB2YWxncmluZCB0bworICAgIC8vIGNvbXBsYWluIGFib3V0IGJyYW5jaGluZyBvbiB1bmluaXRpYWxpemVkIGRhdGEuCisgICAgU3BhcnNlID0gc3RhdGljX2Nhc3Q8U3BhcnNlVCo+KHNhZmVfY2FsbG9jKFUsIHNpemVvZihTcGFyc2VUKSkpOworICAgIFVuaXZlcnNlID0gVTsKKyAgfQorCisgIC8vIEltcG9ydCB0cml2aWFsIHZlY3RvciBzdHVmZiBmcm9tIERlbnNlVC4KKyAgdXNpbmcgaXRlcmF0b3IgPSB0eXBlbmFtZSBEZW5zZVQ6Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IHR5cGVuYW1lIERlbnNlVDo6Y29uc3RfaXRlcmF0b3I7CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBEZW5zZS5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIERlbnNlLmVuZCgpOyB9CisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gRGVuc2UuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBEZW5zZS5lbmQoKTsgfQorCisgIC8vLyBlbXB0eSAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2V0IGlzIGVtcHR5LgorICAvLy8KKyAgLy8vIFRoaXMgaXMgbm90IHRoZSBzYW1lIGFzIEJpdFZlY3Rvcjo6ZW1wdHkoKS4KKyAgLy8vCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBEZW5zZS5lbXB0eSgpOyB9CisKKyAgLy8vIHNpemUgLSBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHNldC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIG5vdCB0aGUgc2FtZSBhcyBCaXRWZWN0b3I6OnNpemUoKSB3aGljaCByZXR1cm5zIHRoZSBzaXplIG9mIHRoZQorICAvLy8gdW5pdmVyc2UuCisgIC8vLworICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIERlbnNlLnNpemUoKTsgfQorCisgIC8vLyBjbGVhciAtIENsZWFycyB0aGUgc2V0LiAgVGhpcyBpcyBhIHZlcnkgZmFzdCBjb25zdGFudCB0aW1lIG9wZXJhdGlvbi4KKyAgLy8vCisgIHZvaWQgY2xlYXIoKSB7CisgICAgLy8gU3BhcnNlIGRvZXMgbm90IG5lZWQgdG8gYmUgY2xlYXJlZCwgc2VlIGZpbmQoKS4KKyAgICBEZW5zZS5jbGVhcigpOworICB9CisKKyAgLy8vIGZpbmRJbmRleCAtIEZpbmQgYW4gZWxlbWVudCBieSBpdHMgaW5kZXguCisgIC8vLworICAvLy8gQHBhcmFtICAgSWR4IEEgdmFsaWQgaW5kZXggdG8gZmluZC4KKyAgLy8vIEByZXR1cm5zIEFuIGl0ZXJhdG9yIHRvIHRoZSBlbGVtZW50IGlkZW50aWZpZWQgYnkga2V5LCBvciBlbmQoKS4KKyAgLy8vCisgIGl0ZXJhdG9yIGZpbmRJbmRleCh1bnNpZ25lZCBJZHgpIHsKKyAgICBhc3NlcnQoSWR4IDwgVW5pdmVyc2UgJiYgIktleSBvdXQgb2YgcmFuZ2UiKTsKKyAgICBjb25zdCB1bnNpZ25lZCBTdHJpZGUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPFNwYXJzZVQ+OjptYXgoKSArIDF1OworICAgIGZvciAodW5zaWduZWQgaSA9IFNwYXJzZVtJZHhdLCBlID0gc2l6ZSgpOyBpIDwgZTsgaSArPSBTdHJpZGUpIHsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIEZvdW5kSWR4ID0gVmFsSW5kZXhPZihEZW5zZVtpXSk7CisgICAgICBhc3NlcnQoRm91bmRJZHggPCBVbml2ZXJzZSAmJiAiSW52YWxpZCBrZXkgaW4gc2V0LiBEaWQgb2JqZWN0IG11dGF0ZT8iKTsKKyAgICAgIGlmIChJZHggPT0gRm91bmRJZHgpCisgICAgICAgIHJldHVybiBiZWdpbigpICsgaTsKKyAgICAgIC8vIFN0cmlkZSBpcyAwIHdoZW4gU3BhcnNlVCA+PSB1bnNpZ25lZC4gIFdlIGRvbid0IG5lZWQgdG8gbG9vcC4KKyAgICAgIGlmICghU3RyaWRlKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIGVuZCgpOworICB9CisKKyAgLy8vIGZpbmQgLSBGaW5kIGFuIGVsZW1lbnQgYnkgaXRzIGtleS4KKyAgLy8vCisgIC8vLyBAcGFyYW0gICBLZXkgQSB2YWxpZCBrZXkgdG8gZmluZC4KKyAgLy8vIEByZXR1cm5zIEFuIGl0ZXJhdG9yIHRvIHRoZSBlbGVtZW50IGlkZW50aWZpZWQgYnkga2V5LCBvciBlbmQoKS4KKyAgLy8vCisgIGl0ZXJhdG9yIGZpbmQoY29uc3QgS2V5VCAmS2V5KSB7CisgICAgcmV0dXJuIGZpbmRJbmRleChLZXlJbmRleE9mKEtleSkpOworICB9CisKKyAgY29uc3RfaXRlcmF0b3IgZmluZChjb25zdCBLZXlUICZLZXkpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxTcGFyc2VTZXQqPih0aGlzKS0+ZmluZEluZGV4KEtleUluZGV4T2YoS2V5KSk7CisgIH0KKworICAvLy8gY291bnQgLSBSZXR1cm5zIDEgaWYgdGhpcyBzZXQgY29udGFpbnMgYW4gZWxlbWVudCBpZGVudGlmaWVkIGJ5IEtleSwKKyAgLy8vIDAgb3RoZXJ3aXNlLgorICAvLy8KKyAgc2l6ZV90eXBlIGNvdW50KGNvbnN0IEtleVQgJktleSkgY29uc3QgeworICAgIHJldHVybiBmaW5kKEtleSkgPT0gZW5kKCkgPyAwIDogMTsKKyAgfQorCisgIC8vLyBpbnNlcnQgLSBBdHRlbXB0cyB0byBpbnNlcnQgYSBuZXcgZWxlbWVudC4KKyAgLy8vCisgIC8vLyBJZiBWYWwgaXMgc3VjY2Vzc2Z1bGx5IGluc2VydGVkLCByZXR1cm4gKEksIHRydWUpLCB3aGVyZSBJIGlzIGFuIGl0ZXJhdG9yCisgIC8vLyBwb2ludGluZyB0byB0aGUgbmV3bHkgaW5zZXJ0ZWQgZWxlbWVudC4KKyAgLy8vCisgIC8vLyBJZiB0aGUgc2V0IGFscmVhZHkgY29udGFpbnMgYW4gZWxlbWVudCB3aXRoIHRoZSBzYW1lIGtleSBhcyBWYWwsIHJldHVybgorICAvLy8gKEksIGZhbHNlKSwgd2hlcmUgSSBpcyBhbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZXhpc3RpbmcgZWxlbWVudC4KKyAgLy8vCisgIC8vLyBJbnNlcnRpb24gaW52YWxpZGF0ZXMgYWxsIGl0ZXJhdG9ycy4KKyAgLy8vCisgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KGNvbnN0IFZhbHVlVCAmVmFsKSB7CisgICAgdW5zaWduZWQgSWR4ID0gVmFsSW5kZXhPZihWYWwpOworICAgIGl0ZXJhdG9yIEkgPSBmaW5kSW5kZXgoSWR4KTsKKyAgICBpZiAoSSAhPSBlbmQoKSkKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihJLCBmYWxzZSk7CisgICAgU3BhcnNlW0lkeF0gPSBzaXplKCk7CisgICAgRGVuc2UucHVzaF9iYWNrKFZhbCk7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGVuZCgpIC0gMSwgdHJ1ZSk7CisgIH0KKworICAvLy8gYXJyYXkgc3Vic2NyaXB0IC0gSWYgYW4gZWxlbWVudCBhbHJlYWR5IGV4aXN0cyB3aXRoIHRoaXMga2V5LCByZXR1cm4gaXQuCisgIC8vLyBPdGhlcndpc2UsIGF1dG9tYXRpY2FsbHkgY29uc3RydWN0IGEgbmV3IHZhbHVlIGZyb20gS2V5LCBpbnNlcnQgaXQsCisgIC8vLyBhbmQgcmV0dXJuIHRoZSBuZXdseSBpbnNlcnRlZCBlbGVtZW50LgorICBWYWx1ZVQgJm9wZXJhdG9yW10oY29uc3QgS2V5VCAmS2V5KSB7CisgICAgcmV0dXJuICppbnNlcnQoVmFsdWVUKEtleSkpLmZpcnN0OworICB9CisKKyAgVmFsdWVUIHBvcF9iYWNrX3ZhbCgpIHsKKyAgICAvLyBTcGFyc2UgZG9lcyBub3QgbmVlZCB0byBiZSBjbGVhcmVkLCBzZWUgZmluZCgpLgorICAgIHJldHVybiBEZW5zZS5wb3BfYmFja192YWwoKTsKKyAgfQorCisgIC8vLyBlcmFzZSAtIEVyYXNlcyBhbiBleGlzdGluZyBlbGVtZW50IGlkZW50aWZpZWQgYnkgYSB2YWxpZCBpdGVyYXRvci4KKyAgLy8vCisgIC8vLyBUaGlzIGludmFsaWRhdGVzIGFsbCBpdGVyYXRvcnMsIGJ1dCBlcmFzZSgpIHJldHVybnMgYW4gaXRlcmF0b3IgcG9pbnRpbmcKKyAgLy8vIHRvIHRoZSBuZXh0IGVsZW1lbnQuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvIGVyYXNlIHNlbGVjdGVkIGVsZW1lbnRzCisgIC8vLyB3aGlsZSBpdGVyYXRpbmcgb3ZlciB0aGUgc2V0OgorICAvLy8KKyAgLy8vICAgZm9yIChTcGFyc2VTZXQ6Oml0ZXJhdG9yIEkgPSBTZXQuYmVnaW4oKTsgSSAhPSBTZXQuZW5kKCk7KQorICAvLy8gICAgIGlmICh0ZXN0KCpJKSkKKyAgLy8vICAgICAgIEkgPSBTZXQuZXJhc2UoSSk7CisgIC8vLyAgICAgZWxzZQorICAvLy8gICAgICAgKytJOworICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBlbmQoKSBjaGFuZ2VzIHdoZW4gZWxlbWVudHMgYXJlIGVyYXNlZCwgdW5saWtlIHN0ZDo6bGlzdC4KKyAgLy8vCisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIEkpIHsKKyAgICBhc3NlcnQodW5zaWduZWQoSSAtIGJlZ2luKCkpIDwgc2l6ZSgpICYmICJJbnZhbGlkIGl0ZXJhdG9yIik7CisgICAgaWYgKEkgIT0gZW5kKCkgLSAxKSB7CisgICAgICAqSSA9IERlbnNlLmJhY2soKTsKKyAgICAgIHVuc2lnbmVkIEJhY2tJZHggPSBWYWxJbmRleE9mKERlbnNlLmJhY2soKSk7CisgICAgICBhc3NlcnQoQmFja0lkeCA8IFVuaXZlcnNlICYmICJJbnZhbGlkIGtleSBpbiBzZXQuIERpZCBvYmplY3QgbXV0YXRlPyIpOworICAgICAgU3BhcnNlW0JhY2tJZHhdID0gSSAtIGJlZ2luKCk7CisgICAgfQorICAgIC8vIFRoaXMgZGVwZW5kcyBvbiBTbWFsbFZlY3Rvcjo6cG9wX2JhY2soKSBub3QgaW52YWxpZGF0aW5nIGl0ZXJhdG9ycy4KKyAgICAvLyBzdGQ6OnZlY3Rvcjo6cG9wX2JhY2soKSBkb2Vzbid0IGdpdmUgdGhhdCBndWFyYW50ZWUuCisgICAgRGVuc2UucG9wX2JhY2soKTsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIC8vLyBlcmFzZSAtIEVyYXNlcyBhbiBlbGVtZW50IGlkZW50aWZpZWQgYnkgS2V5LCBpZiBpdCBleGlzdHMuCisgIC8vLworICAvLy8gQHBhcmFtICAgS2V5IFRoZSBrZXkgaWRlbnRpZnlpbmcgdGhlIGVsZW1lbnQgdG8gZXJhc2UuCisgIC8vLyBAcmV0dXJucyBUcnVlIHdoZW4gYW4gZWxlbWVudCB3YXMgZXJhc2VkLCBmYWxzZSBpZiBubyBlbGVtZW50IHdhcyBmb3VuZC4KKyAgLy8vCisgIGJvb2wgZXJhc2UoY29uc3QgS2V5VCAmS2V5KSB7CisgICAgaXRlcmF0b3IgSSA9IGZpbmQoS2V5KTsKKyAgICBpZiAoSSA9PSBlbmQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBlcmFzZShJKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX1NQQVJTRVNFVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TdGF0aXN0aWMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1N0YXRpc3RpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhMDg5OTcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TdGF0aXN0aWMuaApAQCAtMCwwICsxLDIxOSBAQAorLy89PT0tLSBsbHZtL0FEVC9TdGF0aXN0aWMuaCAtIEVhc3kgd2F5IHRvIGV4cG9zZSBzdGF0cyAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgJ1N0YXRpc3RpYycgY2xhc3MsIHdoaWNoIGlzIGRlc2lnbmVkIHRvIGJlIGFuIGVhc3kgd2F5CisvLyB0byBleHBvc2UgdmFyaW91cyBtZXRyaWNzIGZyb20gcGFzc2VzLiAgVGhlc2Ugc3RhdGlzdGljcyBhcmUgcHJpbnRlZCBhdCB0aGUKKy8vIGVuZCBvZiBhIHJ1biAoZnJvbSBsbHZtX3NodXRkb3duKSwgd2hlbiB0aGUgLXN0YXRzIGNvbW1hbmQgbGluZSBvcHRpb24gaXMKKy8vIHBhc3NlZCBvbiB0aGUgY29tbWFuZCBsaW5lLgorLy8KKy8vIFRoaXMgaXMgdXNlZnVsIGZvciByZXBvcnRpbmcgaW5mb3JtYXRpb24gbGlrZSB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucworLy8gc2ltcGxpZmllZCwgb3B0aW1pemVkIG9yIHJlbW92ZWQgYnkgdmFyaW91cyB0cmFuc2Zvcm1hdGlvbnMsIGxpa2UgdGhpczoKKy8vCisvLyBzdGF0aWMgU3RhdGlzdGljIE51bUluc3RzS2lsbGVkKCJnY3NlIiwgIk51bWJlciBvZiBpbnN0cnVjdGlvbnMga2lsbGVkIik7CisvLworLy8gTGF0ZXIsIGluIHRoZSBjb2RlOiArK051bUluc3RzS2lsbGVkOworLy8KKy8vIE5PVEU6IFN0YXRpc3RpY3MgKm11c3QqIGJlIGRlY2xhcmVkIGFzIGdsb2JhbCB2YXJpYWJsZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9TVEFUSVNUSUNfSAorI2RlZmluZSBMTFZNX0FEVF9TVEFUSVNUSUNfSAorCisjaW5jbHVkZSAibGx2bS9Db25maWcvbGx2bS1jb25maWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8gRGV0ZXJtaW5lIHdoZXRoZXIgc3RhdGlzdGljcyBzaG91bGQgYmUgZW5hYmxlZC4gV2UgbXVzdCBkbyBpdCBoZXJlIHJhdGhlcgorLy8gdGhhbiBpbiBDTWFrZSBiZWNhdXNlIG11bHRpLWNvbmZpZyBnZW5lcmF0b3JzIGNhbm5vdCBkZXRlcm1pbmUgdGhpcyBhdAorLy8gY29uZmlndXJlIHRpbWUuCisjaWYgIWRlZmluZWQoTkRFQlVHKSB8fCBMTFZNX0ZPUkNFX0VOQUJMRV9TVEFUUworI2RlZmluZSBMTFZNX0VOQUJMRV9TVEFUUyAxCisjZW5kaWYKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIHJhd19mZF9vc3RyZWFtOworY2xhc3MgU3RyaW5nUmVmOworCitjbGFzcyBTdGF0aXN0aWMgeworcHVibGljOgorICBjb25zdCBjaGFyICpEZWJ1Z1R5cGU7CisgIGNvbnN0IGNoYXIgKk5hbWU7CisgIGNvbnN0IGNoYXIgKkRlc2M7CisgIHN0ZDo6YXRvbWljPHVuc2lnbmVkPiBWYWx1ZTsKKyAgc3RkOjphdG9taWM8Ym9vbD4gSW5pdGlhbGl6ZWQ7CisKKyAgdW5zaWduZWQgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZS5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOyB9CisgIGNvbnN0IGNoYXIgKmdldERlYnVnVHlwZSgpIGNvbnN0IHsgcmV0dXJuIERlYnVnVHlwZTsgfQorICBjb25zdCBjaGFyICpnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorICBjb25zdCBjaGFyICpnZXREZXNjKCkgY29uc3QgeyByZXR1cm4gRGVzYzsgfQorCisgIC8vLyBjb25zdHJ1Y3QgLSBUaGlzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBmb3Igbm9uLWdsb2JhbCBzdGF0aXN0aWNzLgorICB2b2lkIGNvbnN0cnVjdChjb25zdCBjaGFyICpkZWJ1Z3R5cGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRlc2MpIHsKKyAgICBEZWJ1Z1R5cGUgPSBkZWJ1Z3R5cGU7CisgICAgTmFtZSA9IG5hbWU7CisgICAgRGVzYyA9IGRlc2M7CisgICAgVmFsdWUgPSAwOworICAgIEluaXRpYWxpemVkID0gZmFsc2U7CisgIH0KKworICAvLyBBbGxvdyB1c2Ugb2YgdGhpcyBjbGFzcyBhcyB0aGUgdmFsdWUgaXRzZWxmLgorICBvcGVyYXRvciB1bnNpZ25lZCgpIGNvbnN0IHsgcmV0dXJuIGdldFZhbHVlKCk7IH0KKworI2lmIExMVk1fRU5BQkxFX1NUQVRTCisgICBjb25zdCBTdGF0aXN0aWMgJm9wZXJhdG9yPSh1bnNpZ25lZCBWYWwpIHsKKyAgICBWYWx1ZS5zdG9yZShWYWwsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIHJldHVybiBpbml0KCk7CisgIH0KKworICBjb25zdCBTdGF0aXN0aWMgJm9wZXJhdG9yKysoKSB7CisgICAgVmFsdWUuZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICAgIHJldHVybiBpbml0KCk7CisgIH0KKworICB1bnNpZ25lZCBvcGVyYXRvcisrKGludCkgeworICAgIGluaXQoKTsKKyAgICByZXR1cm4gVmFsdWUuZmV0Y2hfYWRkKDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpOworICB9CisKKyAgY29uc3QgU3RhdGlzdGljICZvcGVyYXRvci0tKCkgeworICAgIFZhbHVlLmZldGNoX3N1YigxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICByZXR1cm4gaW5pdCgpOworICB9CisKKyAgdW5zaWduZWQgb3BlcmF0b3ItLShpbnQpIHsKKyAgICBpbml0KCk7CisgICAgcmV0dXJuIFZhbHVlLmZldGNoX3N1YigxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgfQorCisgIGNvbnN0IFN0YXRpc3RpYyAmb3BlcmF0b3IrPSh1bnNpZ25lZCBWKSB7CisgICAgaWYgKFYgPT0gMCkKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICBWYWx1ZS5mZXRjaF9hZGQoViwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgcmV0dXJuIGluaXQoKTsKKyAgfQorCisgIGNvbnN0IFN0YXRpc3RpYyAmb3BlcmF0b3ItPSh1bnNpZ25lZCBWKSB7CisgICAgaWYgKFYgPT0gMCkKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICBWYWx1ZS5mZXRjaF9zdWIoViwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCk7CisgICAgcmV0dXJuIGluaXQoKTsKKyAgfQorCisgIHZvaWQgdXBkYXRlTWF4KHVuc2lnbmVkIFYpIHsKKyAgICB1bnNpZ25lZCBQcmV2TWF4ID0gVmFsdWUubG9hZChzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkKTsKKyAgICAvLyBLZWVwIHRyeWluZyB0byB1cGRhdGUgbWF4IHVudGlsIHdlIHN1Y2NlZWQgb3IgYW5vdGhlciB0aHJlYWQgcHJvZHVjZXMKKyAgICAvLyBhIGJpZ2dlciBtYXggdGhhbiB1cy4KKyAgICB3aGlsZSAoViA+IFByZXZNYXggJiYgIVZhbHVlLmNvbXBhcmVfZXhjaGFuZ2Vfd2VhaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXZNYXgsIFYsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQpKSB7CisgICAgfQorICAgIGluaXQoKTsKKyAgfQorCisjZWxzZSAgLy8gU3RhdGlzdGljcyBhcmUgZGlzYWJsZWQgaW4gcmVsZWFzZSBidWlsZHMuCisKKyAgY29uc3QgU3RhdGlzdGljICZvcGVyYXRvcj0odW5zaWduZWQgVmFsKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgU3RhdGlzdGljICZvcGVyYXRvcisrKCkgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHVuc2lnbmVkIG9wZXJhdG9yKysoaW50KSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBjb25zdCBTdGF0aXN0aWMgJm9wZXJhdG9yLS0oKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdW5zaWduZWQgb3BlcmF0b3ItLShpbnQpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGNvbnN0IFN0YXRpc3RpYyAmb3BlcmF0b3IrPShjb25zdCB1bnNpZ25lZCAmVikgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IFN0YXRpc3RpYyAmb3BlcmF0b3ItPShjb25zdCB1bnNpZ25lZCAmVikgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHZvaWQgdXBkYXRlTWF4KHVuc2lnbmVkIFYpIHt9CisKKyNlbmRpZiAgLy8gTExWTV9FTkFCTEVfU1RBVFMKKworcHJvdGVjdGVkOgorICBTdGF0aXN0aWMgJmluaXQoKSB7CisgICAgaWYgKCFJbml0aWFsaXplZC5sb2FkKHN0ZDo6bWVtb3J5X29yZGVyX2FjcXVpcmUpKQorICAgICAgUmVnaXN0ZXJTdGF0aXN0aWMoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkIFJlZ2lzdGVyU3RhdGlzdGljKCk7Cit9OworCisvLyBTVEFUSVNUSUMgLSBBIG1hY3JvIHRvIG1ha2UgZGVmaW5pdGlvbiBvZiBzdGF0aXN0aWNzIHJlYWxseSBzaW1wbGUuICBUaGlzCisvLyBhdXRvbWF0aWNhbGx5IHBhc3NlcyB0aGUgREVCVUdfVFlQRSBvZiB0aGUgZmlsZSBpbnRvIHRoZSBzdGF0aXN0aWMuCisjZGVmaW5lIFNUQVRJU1RJQyhWQVJOQU1FLCBERVNDKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgbGx2bTo6U3RhdGlzdGljIFZBUk5BTUUgPSB7REVCVUdfVFlQRSwgI1ZBUk5BTUUsIERFU0MsIHswfSwge2ZhbHNlfX0KKworLy8vIFxicmllZiBFbmFibGUgdGhlIGNvbGxlY3Rpb24gYW5kIHByaW50aW5nIG9mIHN0YXRpc3RpY3MuCit2b2lkIEVuYWJsZVN0YXRpc3RpY3MoYm9vbCBQcmludE9uRXhpdCA9IHRydWUpOworCisvLy8gXGJyaWVmIENoZWNrIGlmIHN0YXRpc3RpY3MgYXJlIGVuYWJsZWQuCitib29sIEFyZVN0YXRpc3RpY3NFbmFibGVkKCk7CisKKy8vLyBcYnJpZWYgUmV0dXJuIGEgZmlsZSBzdHJlYW0gdG8gcHJpbnQgb3VyIG91dHB1dCBvbi4KK3N0ZDo6dW5pcXVlX3B0cjxyYXdfZmRfb3N0cmVhbT4gQ3JlYXRlSW5mb091dHB1dEZpbGUoKTsKKworLy8vIFxicmllZiBQcmludCBzdGF0aXN0aWNzIHRvIHRoZSBmaWxlIHJldHVybmVkIGJ5IENyZWF0ZUluZm9PdXRwdXRGaWxlKCkuCit2b2lkIFByaW50U3RhdGlzdGljcygpOworCisvLy8gXGJyaWVmIFByaW50IHN0YXRpc3RpY3MgdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uCit2b2lkIFByaW50U3RhdGlzdGljcyhyYXdfb3N0cmVhbSAmT1MpOworCisvLy8gUHJpbnQgc3RhdGlzdGljcyBpbiBKU09OIGZvcm1hdC4gVGhpcyBkb2VzIGluY2x1ZGUgYWxsIGdsb2JhbCB0aW1lcnMgKFxzZWUKKy8vLyBUaW1lciwgVGltZXJHcm91cCkuIE5vdGUgdGhhdCB0aGUgdGltZXJzIGFyZSBjbGVhcmVkIGFmdGVyIHByaW50aW5nIGFuZCB3aWxsCisvLy8gbm90IGJlIHByaW50ZWQgaW4gaHVtYW4gcmVhZGFibGUgZm9ybSBvciBpbiBhIHNlY29uZCBjYWxsIG9mCisvLy8gUHJpbnRTdGF0aXN0aWNzSlNPTigpLgordm9pZCBQcmludFN0YXRpc3RpY3NKU09OKHJhd19vc3RyZWFtICZPUyk7CisKKy8vLyBcYnJpZWYgR2V0IHRoZSBzdGF0aXN0aWNzLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGxvb2sgdXAgdGhlIHZhbHVlIG9mCisvLy8gc3RhdGlzdGljcyB3aXRob3V0IG5lZWRpbmcgdG8gcGFyc2UgSlNPTi4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gZG9lcyBub3QgcHJldmVudCBzdGF0aXN0aWNzIGJlaW5nIHVwZGF0ZWQgYnkgb3RoZXIgdGhyZWFkcworLy8vIGR1cmluZyBpdCdzIGV4ZWN1dGlvbi4gSXQgd2lsbCByZXR1cm4gdGhlIHZhbHVlIGF0IHRoZSBwb2ludCB0aGF0IGl0IGlzCisvLy8gcmVhZC4gSG93ZXZlciwgaXQgd2lsbCBwcmV2ZW50IG5ldyBzdGF0aXN0aWNzIGZyb20gcmVnaXN0ZXJpbmcgdW50aWwgaXQKKy8vLyBjb21wbGV0ZXMuCitjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8U3RyaW5nUmVmLCB1bnNpZ25lZD4+IEdldFN0YXRpc3RpY3MoKTsKKworLy8vIFxicmllZiBSZXNldCB0aGUgc3RhdGlzdGljcy4gVGhpcyBjYW4gYmUgdXNlZCB0byB6ZXJvIGFuZCBkZS1yZWdpc3RlciB0aGUKKy8vLyBzdGF0aXN0aWNzIGluIG9yZGVyIHRvIG1lYXN1cmUgYSBjb21waWxhdGlvbi4KKy8vLworLy8vIFdoZW4gdGhpcyBmdW5jdGlvbiBiZWdpbnMgdG8gY2FsbCBkZXN0cnVjdG9ycyBwcmlvciB0byByZXR1cm5pbmcsIGFsbAorLy8vIHN0YXRpc3RpY3Mgd2lsbCBiZSB6ZXJvIGFuZCB1bnJlZ2lzdGVyZWQuIEhvd2V2ZXIsIHRoYXQgbWlnaHQgbm90IHJlbWFpbiB0aGUKKy8vLyBjYXNlIGJ5IHRoZSB0aW1lIHRoaXMgZnVuY3Rpb24gZmluaXNoZXMgcmV0dXJuaW5nLiBXaGV0aGVyIHVwZGF0ZSBmcm9tIG90aGVyCisvLy8gdGhyZWFkcyBhcmUgbG9zdCBvciBtZXJlbHkgZGVmZXJyZWQgdW50aWwgZHVyaW5nIHRoZSBmdW5jdGlvbiByZXR1cm4gaXMKKy8vLyB0aW1pbmcgc2Vuc2l0aXZlLgorLy8vCisvLy8gQ2FsbGVycyB3aG8gaW50ZW5kIHRvIHVzZSB0aGlzIHRvIG1lYXN1cmUgc3RhdGlzdGljcyBmb3IgYSBzaW5nbGUKKy8vLyBjb21waWxhdGlvbiBzaG91bGQgZW5zdXJlIHRoYXQgbm8gY29tcGlsYXRpb25zIGFyZSBpbiBwcm9ncmVzcyBhdCB0aGUgcG9pbnQKKy8vLyB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBhbmQgdGhhdCBvbmx5IG9uZSBjb21waWxhdGlvbiBleGVjdXRlcyB1bnRpbCBjYWxsaW5nCisvLy8gR2V0U3RhdGlzdGljcygpLgordm9pZCBSZXNldFN0YXRpc3RpY3MoKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX1NUQVRJU1RJQ19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1N0cmluZ0V4dHJhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZjY2NzcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TdHJpbmdFeHRyYXMuaApAQCAtMCwwICsxLDM2NyBAQAorLy89PT0tIGxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIC0gVXNlZnVsIHN0cmluZyBmdW5jdGlvbnMgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgc29tZSBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZnVsIHdoZW4gZGVhbGluZyB3aXRoIHN0cmluZ3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9TVFJJTkdFWFRSQVNfSAorI2RlZmluZSBMTFZNX0FEVF9TVFJJTkdFWFRSQVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gaGV4ZGlnaXQgLSBSZXR1cm4gdGhlIGhleGFkZWNpbWFsIGNoYXJhY3RlciBmb3IgdGhlCisvLy8gZ2l2ZW4gbnVtYmVyIFxwIFggKHdoaWNoIHNob3VsZCBiZSBsZXNzIHRoYW4gMTYpLgoraW5saW5lIGNoYXIgaGV4ZGlnaXQodW5zaWduZWQgWCwgYm9vbCBMb3dlckNhc2UgPSBmYWxzZSkgeworICBjb25zdCBjaGFyIEhleENoYXIgPSBMb3dlckNhc2UgPyAnYScgOiAnQSc7CisgIHJldHVybiBYIDwgMTAgPyAnMCcgKyBYIDogSGV4Q2hhciArIFggLSAxMDsKK30KKworLy8vIENvbnN0cnVjdCBhIHN0cmluZyByZWYgZnJvbSBhIGJvb2xlYW4uCitpbmxpbmUgU3RyaW5nUmVmIHRvU3RyaW5nUmVmKGJvb2wgQikgeyByZXR1cm4gU3RyaW5nUmVmKEIgPyAidHJ1ZSIgOiAiZmFsc2UiKTsgfQorCisvLy8gQ29uc3RydWN0IGEgc3RyaW5nIHJlZiBmcm9tIGFuIGFycmF5IHJlZiBvZiB1bnNpZ25lZCBjaGFycy4KK2lubGluZSBTdHJpbmdSZWYgdG9TdHJpbmdSZWYoQXJyYXlSZWY8dWludDhfdD4gSW5wdXQpIHsKKyAgcmV0dXJuIFN0cmluZ1JlZihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oSW5wdXQuYmVnaW4oKSksIElucHV0LnNpemUoKSk7Cit9CisKKy8vLyBDb25zdHJ1Y3QgYSBzdHJpbmcgcmVmIGZyb20gYW4gYXJyYXkgcmVmIG9mIHVuc2lnbmVkIGNoYXJzLgoraW5saW5lIEFycmF5UmVmPHVpbnQ4X3Q+IGFycmF5UmVmRnJvbVN0cmluZ1JlZihTdHJpbmdSZWYgSW5wdXQpIHsKKyAgcmV0dXJuIHtJbnB1dC5ieXRlc19iZWdpbigpLCBJbnB1dC5ieXRlc19lbmQoKX07Cit9CisKKy8vLyBJbnRlcnByZXQgdGhlIGdpdmVuIGNoYXJhY3RlciBccCBDIGFzIGEgaGV4YWRlY2ltYWwgZGlnaXQgYW5kIHJldHVybiBpdHMKKy8vLyB2YWx1ZS4KKy8vLworLy8vIElmIFxwIEMgaXMgbm90IGEgdmFsaWQgaGV4IGRpZ2l0LCAtMVUgaXMgcmV0dXJuZWQuCitpbmxpbmUgdW5zaWduZWQgaGV4RGlnaXRWYWx1ZShjaGFyIEMpIHsKKyAgaWYgKEMgPj0gJzAnICYmIEMgPD0gJzknKSByZXR1cm4gQy0nMCc7CisgIGlmIChDID49ICdhJyAmJiBDIDw9ICdmJykgcmV0dXJuIEMtJ2EnKzEwVTsKKyAgaWYgKEMgPj0gJ0EnICYmIEMgPD0gJ0YnKSByZXR1cm4gQy0nQScrMTBVOworICByZXR1cm4gLTFVOworfQorCisvLy8gQ2hlY2tzIGlmIGNoYXJhY3RlciBccCBDIGlzIG9uZSBvZiB0aGUgMTAgZGVjaW1hbCBkaWdpdHMuCitpbmxpbmUgYm9vbCBpc0RpZ2l0KGNoYXIgQykgeyByZXR1cm4gQyA+PSAnMCcgJiYgQyA8PSAnOSc7IH0KKworLy8vIENoZWNrcyBpZiBjaGFyYWN0ZXIgXHAgQyBpcyBhIGhleGFkZWNpbWFsIG51bWVyaWMgY2hhcmFjdGVyLgoraW5saW5lIGJvb2wgaXNIZXhEaWdpdChjaGFyIEMpIHsgcmV0dXJuIGhleERpZ2l0VmFsdWUoQykgIT0gLTFVOyB9CisKKy8vLyBDaGVja3MgaWYgY2hhcmFjdGVyIFxwIEMgaXMgYSB2YWxpZCBsZXR0ZXIgYXMgY2xhc3NpZmllZCBieSAiQyIgbG9jYWxlLgoraW5saW5lIGJvb2wgaXNBbHBoYShjaGFyIEMpIHsKKyAgcmV0dXJuICgnYScgPD0gQyAmJiBDIDw9ICd6JykgfHwgKCdBJyA8PSBDICYmIEMgPD0gJ1onKTsKK30KKworLy8vIENoZWNrcyB3aGV0aGVyIGNoYXJhY3RlciBccCBDIGlzIGVpdGhlciBhIGRlY2ltYWwgZGlnaXQgb3IgYW4gdXBwZXJjYXNlIG9yCisvLy8gbG93ZXJjYXNlIGxldHRlciBhcyBjbGFzc2lmaWVkIGJ5ICJDIiBsb2NhbGUuCitpbmxpbmUgYm9vbCBpc0FsbnVtKGNoYXIgQykgeyByZXR1cm4gaXNBbHBoYShDKSB8fCBpc0RpZ2l0KEMpOyB9CisKKy8vLyBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIGxvd2VyY2FzZSBjaGFyYWN0ZXIgaWYgXHAgeCBpcyB1cHBlcmNhc2UuCitpbmxpbmUgY2hhciB0b0xvd2VyKGNoYXIgeCkgeworICBpZiAoeCA+PSAnQScgJiYgeCA8PSAnWicpCisgICAgcmV0dXJuIHggLSAnQScgKyAnYSc7CisgIHJldHVybiB4OworfQorCisvLy8gUmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyB1cHBlcmNhc2UgY2hhcmFjdGVyIGlmIFxwIHggaXMgbG93ZXJjYXNlLgoraW5saW5lIGNoYXIgdG9VcHBlcihjaGFyIHgpIHsKKyAgaWYgKHggPj0gJ2EnICYmIHggPD0gJ3onKQorICAgIHJldHVybiB4IC0gJ2EnICsgJ0EnOworICByZXR1cm4geDsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIHV0b2hleHN0cih1aW50NjRfdCBYLCBib29sIExvd2VyQ2FzZSA9IGZhbHNlKSB7CisgIGNoYXIgQnVmZmVyWzE3XTsKKyAgY2hhciAqQnVmUHRyID0gc3RkOjplbmQoQnVmZmVyKTsKKworICBpZiAoWCA9PSAwKSAqLS1CdWZQdHIgPSAnMCc7CisKKyAgd2hpbGUgKFgpIHsKKyAgICB1bnNpZ25lZCBjaGFyIE1vZCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KFgpICYgMTU7CisgICAgKi0tQnVmUHRyID0gaGV4ZGlnaXQoTW9kLCBMb3dlckNhc2UpOworICAgIFggPj49IDQ7CisgIH0KKworICByZXR1cm4gc3RkOjpzdHJpbmcoQnVmUHRyLCBzdGQ6OmVuZChCdWZmZXIpKTsKK30KKworLy8vIENvbnZlcnQgYnVmZmVyIFxwIElucHV0IHRvIGl0cyBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbi4KKy8vLyBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGRvdWJsZSB0aGUgc2l6ZSBvZiBccCBJbnB1dC4KK2lubGluZSBzdGQ6OnN0cmluZyB0b0hleChTdHJpbmdSZWYgSW5wdXQpIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IExVVCA9ICIwMTIzNDU2Nzg5QUJDREVGIjsKKyAgc2l6ZV90IExlbmd0aCA9IElucHV0LnNpemUoKTsKKworICBzdGQ6OnN0cmluZyBPdXRwdXQ7CisgIE91dHB1dC5yZXNlcnZlKDIgKiBMZW5ndGgpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IExlbmd0aDsgKytpKSB7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciBjID0gSW5wdXRbaV07CisgICAgT3V0cHV0LnB1c2hfYmFjayhMVVRbYyA+PiA0XSk7CisgICAgT3V0cHV0LnB1c2hfYmFjayhMVVRbYyAmIDE1XSk7CisgIH0KKyAgcmV0dXJuIE91dHB1dDsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIHRvSGV4KEFycmF5UmVmPHVpbnQ4X3Q+IElucHV0KSB7CisgIHJldHVybiB0b0hleCh0b1N0cmluZ1JlZihJbnB1dCkpOworfQorCitpbmxpbmUgdWludDhfdCBoZXhGcm9tTmliYmxlcyhjaGFyIE1TQiwgY2hhciBMU0IpIHsKKyAgdW5zaWduZWQgVTEgPSBoZXhEaWdpdFZhbHVlKE1TQik7CisgIHVuc2lnbmVkIFUyID0gaGV4RGlnaXRWYWx1ZShMU0IpOworICBhc3NlcnQoVTEgIT0gLTFVICYmIFUyICE9IC0xVSk7CisKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQ4X3Q+KChVMSA8PCA0KSB8IFUyKTsKK30KKworLy8vIENvbnZlcnQgaGV4YWRlY2ltYWwgc3RyaW5nIFxwIElucHV0IHRvIGl0cyBiaW5hcnkgcmVwcmVzZW50YXRpb24uCisvLy8gVGhlIHJldHVybiBzdHJpbmcgaXMgaGFsZiB0aGUgc2l6ZSBvZiBccCBJbnB1dC4KK2lubGluZSBzdGQ6OnN0cmluZyBmcm9tSGV4KFN0cmluZ1JlZiBJbnB1dCkgeworICBpZiAoSW5wdXQuZW1wdHkoKSkKKyAgICByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKworICBzdGQ6OnN0cmluZyBPdXRwdXQ7CisgIE91dHB1dC5yZXNlcnZlKChJbnB1dC5zaXplKCkgKyAxKSAvIDIpOworICBpZiAoSW5wdXQuc2l6ZSgpICUgMiA9PSAxKSB7CisgICAgT3V0cHV0LnB1c2hfYmFjayhoZXhGcm9tTmliYmxlcygnMCcsIElucHV0LmZyb250KCkpKTsKKyAgICBJbnB1dCA9IElucHV0LmRyb3BfZnJvbnQoKTsKKyAgfQorCisgIGFzc2VydChJbnB1dC5zaXplKCkgJSAyID09IDApOworICB3aGlsZSAoIUlucHV0LmVtcHR5KCkpIHsKKyAgICB1aW50OF90IEhleCA9IGhleEZyb21OaWJibGVzKElucHV0WzBdLCBJbnB1dFsxXSk7CisgICAgT3V0cHV0LnB1c2hfYmFjayhIZXgpOworICAgIElucHV0ID0gSW5wdXQuZHJvcF9mcm9udCgyKTsKKyAgfQorICByZXR1cm4gT3V0cHV0OworfQorCisvLy8gXGJyaWVmIENvbnZlcnQgdGhlIHN0cmluZyBccCBTIHRvIGFuIGludGVnZXIgb2YgdGhlIHNwZWNpZmllZCB0eXBlIHVzaW5nCisvLy8gdGhlIHJhZGl4IFxwIEJhc2UuICBJZiBccCBCYXNlIGlzIDAsIGF1dG8tZGV0ZWN0cyB0aGUgcmFkaXguCisvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBudW1iZXIgd2FzIHN1Y2Nlc3NmdWxseSBjb252ZXJ0ZWQsIGZhbHNlIG90aGVyd2lzZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBOPiBib29sIHRvX2ludGVnZXIoU3RyaW5nUmVmIFMsIE4gJk51bSwgdW5zaWduZWQgQmFzZSA9IDApIHsKKyAgcmV0dXJuICFTLmdldEFzSW50ZWdlcihCYXNlLCBOdW0pOworfQorCituYW1lc3BhY2UgZGV0YWlsIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBOPgoraW5saW5lIGJvb2wgdG9fZmxvYXQoY29uc3QgVHdpbmUgJlQsIE4gJk51bSwgTiAoKlN0clRvKShjb25zdCBjaGFyICosIGNoYXIgKiopKSB7CisgIFNtYWxsU3RyaW5nPDMyPiBTdG9yYWdlOworICBTdHJpbmdSZWYgUyA9IFQudG9OdWxsVGVybWluYXRlZFN0cmluZ1JlZihTdG9yYWdlKTsKKyAgY2hhciAqRW5kOworICBOIFRlbXAgPSBTdHJUbyhTLmRhdGEoKSwgJkVuZCk7CisgIGlmICgqRW5kICE9ICdcMCcpCisgICAgcmV0dXJuIGZhbHNlOworICBOdW0gPSBUZW1wOworICByZXR1cm4gdHJ1ZTsKK30KK30KKworaW5saW5lIGJvb2wgdG9fZmxvYXQoY29uc3QgVHdpbmUgJlQsIGZsb2F0ICZOdW0pIHsKKyAgcmV0dXJuIGRldGFpbDo6dG9fZmxvYXQoVCwgTnVtLCBzdHJ0b2YpOworfQorCitpbmxpbmUgYm9vbCB0b19mbG9hdChjb25zdCBUd2luZSAmVCwgZG91YmxlICZOdW0pIHsKKyAgcmV0dXJuIGRldGFpbDo6dG9fZmxvYXQoVCwgTnVtLCBzdHJ0b2QpOworfQorCitpbmxpbmUgYm9vbCB0b19mbG9hdChjb25zdCBUd2luZSAmVCwgbG9uZyBkb3VibGUgJk51bSkgeworICByZXR1cm4gZGV0YWlsOjp0b19mbG9hdChULCBOdW0sIHN0cnRvbGQpOworfQorCitpbmxpbmUgc3RkOjpzdHJpbmcgdXRvc3RyKHVpbnQ2NF90IFgsIGJvb2wgaXNOZWcgPSBmYWxzZSkgeworICBjaGFyIEJ1ZmZlclsyMV07CisgIGNoYXIgKkJ1ZlB0ciA9IHN0ZDo6ZW5kKEJ1ZmZlcik7CisKKyAgaWYgKFggPT0gMCkgKi0tQnVmUHRyID0gJzAnOyAgLy8gSGFuZGxlIHNwZWNpYWwgY2FzZS4uLgorCisgIHdoaWxlIChYKSB7CisgICAgKi0tQnVmUHRyID0gJzAnICsgY2hhcihYICUgMTApOworICAgIFggLz0gMTA7CisgIH0KKworICBpZiAoaXNOZWcpICotLUJ1ZlB0ciA9ICctJzsgICAvLyBBZGQgbmVnYXRpdmUgc2lnbi4uLgorICByZXR1cm4gc3RkOjpzdHJpbmcoQnVmUHRyLCBzdGQ6OmVuZChCdWZmZXIpKTsKK30KKworaW5saW5lIHN0ZDo6c3RyaW5nIGl0b3N0cihpbnQ2NF90IFgpIHsKKyAgaWYgKFggPCAwKQorICAgIHJldHVybiB1dG9zdHIoc3RhdGljX2Nhc3Q8dWludDY0X3Q+KC1YKSwgdHJ1ZSk7CisgIGVsc2UKKyAgICByZXR1cm4gdXRvc3RyKHN0YXRpY19jYXN0PHVpbnQ2NF90PihYKSk7Cit9CisKKy8vLyBTdHJJblN0ck5vQ2FzZSAtIFBvcnRhYmxlIHZlcnNpb24gb2Ygc3RyY2FzZXN0ci4gIExvY2F0ZXMgdGhlIGZpcnN0CisvLy8gb2NjdXJyZW5jZSBvZiBzdHJpbmcgJ3MxJyBpbiBzdHJpbmcgJ3MyJywgaWdub3JpbmcgY2FzZS4gIFJldHVybnMKKy8vLyB0aGUgb2Zmc2V0IG9mIHMyIGluIHMxIG9yIG5wb3MgaWYgczIgY2Fubm90IGJlIGZvdW5kLgorU3RyaW5nUmVmOjpzaXplX3R5cGUgU3RySW5TdHJOb0Nhc2UoU3RyaW5nUmVmIHMxLCBTdHJpbmdSZWYgczIpOworCisvLy8gZ2V0VG9rZW4gLSBUaGlzIGZ1bmN0aW9uIGV4dHJhY3RzIG9uZSB0b2tlbiBmcm9tIHNvdXJjZSwgaWdub3JpbmcgYW55CisvLy8gbGVhZGluZyBjaGFyYWN0ZXJzIHRoYXQgYXBwZWFyIGluIHRoZSBEZWxpbWl0ZXJzIHN0cmluZywgYW5kIGVuZGluZyB0aGUKKy8vLyB0b2tlbiBhdCBhbnkgb2YgdGhlIGNoYXJhY3RlcnMgdGhhdCBhcHBlYXIgaW4gdGhlIERlbGltaXRlcnMgc3RyaW5nLiAgSWYKKy8vLyB0aGVyZSBhcmUgbm8gdG9rZW5zIGluIHRoZSBzb3VyY2Ugc3RyaW5nLCBhbiBlbXB0eSBzdHJpbmcgaXMgcmV0dXJuZWQuCisvLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgYSBwYWlyIGNvbnRhaW5pbmcgdGhlIGV4dHJhY3RlZCB0b2tlbiBhbmQgdGhlCisvLy8gcmVtYWluaW5nIHRhaWwgc3RyaW5nLgorc3RkOjpwYWlyPFN0cmluZ1JlZiwgU3RyaW5nUmVmPiBnZXRUb2tlbihTdHJpbmdSZWYgU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRGVsaW1pdGVycyA9ICIgXHRcblx2XGZcciIpOworCisvLy8gU3BsaXRTdHJpbmcgLSBTcGxpdCB1cCB0aGUgc3BlY2lmaWVkIHN0cmluZyBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZAorLy8vIGRlbGltaXRlcnMsIGFwcGVuZGluZyB0aGUgcmVzdWx0IGZyYWdtZW50cyB0byB0aGUgb3V0cHV0IGxpc3QuCit2b2lkIFNwbGl0U3RyaW5nKFN0cmluZ1JlZiBTb3VyY2UsCisgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTdHJpbmdSZWY+ICZPdXRGcmFnbWVudHMsCisgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEZWxpbWl0ZXJzID0gIiBcdFxuXHZcZlxyIik7CisKKy8vLyBSZXR1cm5zIHRoZSBFbmdsaXNoIHN1ZmZpeCBmb3IgYW4gb3JkaW5hbCBpbnRlZ2VyICgtc3QsIC1uZCwgLXJkLCAtdGgpLgoraW5saW5lIFN0cmluZ1JlZiBnZXRPcmRpbmFsU3VmZml4KHVuc2lnbmVkIFZhbCkgeworICAvLyBJdCBpcyBjcml0aWNhbGx5IGltcG9ydGFudCB0aGF0IHdlIGRvIHRoaXMgcGVyZmVjdGx5IGZvcgorICAvLyB1c2VyLXdyaXR0ZW4gc2VxdWVuY2VzIHdpdGggb3ZlciAxMDAgZWxlbWVudHMuCisgIHN3aXRjaCAoVmFsICUgMTAwKSB7CisgIGNhc2UgMTE6CisgIGNhc2UgMTI6CisgIGNhc2UgMTM6CisgICAgcmV0dXJuICJ0aCI7CisgIGRlZmF1bHQ6CisgICAgc3dpdGNoIChWYWwgJSAxMCkgeworICAgICAgY2FzZSAxOiByZXR1cm4gInN0IjsKKyAgICAgIGNhc2UgMjogcmV0dXJuICJuZCI7CisgICAgICBjYXNlIDM6IHJldHVybiAicmQiOworICAgICAgZGVmYXVsdDogcmV0dXJuICJ0aCI7CisgICAgfQorICB9Cit9CisKKy8vLyBQcmludEVzY2FwZWRTdHJpbmcgLSBQcmludCBlYWNoIGNoYXJhY3RlciBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZywgZXNjYXBpbmcKKy8vLyBpdCBpZiBpdCBpcyBub3QgcHJpbnRhYmxlIG9yIGlmIGl0IGlzIGFuIGVzY2FwZSBjaGFyLgordm9pZCBQcmludEVzY2FwZWRTdHJpbmcoU3RyaW5nUmVmIE5hbWUsIHJhd19vc3RyZWFtICZPdXQpOworCisvLy8gcHJpbnRMb3dlckNhc2UgLSBQcmludCBlYWNoIGNoYXJhY3RlciBhcyBsb3dlcmNhc2UgaWYgaXQgaXMgdXBwZXJjYXNlLgordm9pZCBwcmludExvd2VyQ2FzZShTdHJpbmdSZWYgU3RyaW5nLCByYXdfb3N0cmVhbSAmT3V0KTsKKworbmFtZXNwYWNlIGRldGFpbCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJdGVyYXRvclQ+CitpbmxpbmUgc3RkOjpzdHJpbmcgam9pbl9pbXBsKEl0ZXJhdG9yVCBCZWdpbiwgSXRlcmF0b3JUIEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFNlcGFyYXRvciwgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcpIHsKKyAgc3RkOjpzdHJpbmcgUzsKKyAgaWYgKEJlZ2luID09IEVuZCkKKyAgICByZXR1cm4gUzsKKworICBTICs9ICgqQmVnaW4pOworICB3aGlsZSAoKytCZWdpbiAhPSBFbmQpIHsKKyAgICBTICs9IFNlcGFyYXRvcjsKKyAgICBTICs9ICgqQmVnaW4pOworICB9CisgIHJldHVybiBTOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3JUPgoraW5saW5lIHN0ZDo6c3RyaW5nIGpvaW5faW1wbChJdGVyYXRvclQgQmVnaW4sIEl0ZXJhdG9yVCBFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTZXBhcmF0b3IsIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpIHsKKyAgc3RkOjpzdHJpbmcgUzsKKyAgaWYgKEJlZ2luID09IEVuZCkKKyAgICByZXR1cm4gUzsKKworICBzaXplX3QgTGVuID0gKHN0ZDo6ZGlzdGFuY2UoQmVnaW4sIEVuZCkgLSAxKSAqIFNlcGFyYXRvci5zaXplKCk7CisgIGZvciAoSXRlcmF0b3JUIEkgPSBCZWdpbjsgSSAhPSBFbmQ7ICsrSSkKKyAgICBMZW4gKz0gKCpCZWdpbikuc2l6ZSgpOworICBTLnJlc2VydmUoTGVuKTsKKyAgUyArPSAoKkJlZ2luKTsKKyAgd2hpbGUgKCsrQmVnaW4gIT0gRW5kKSB7CisgICAgUyArPSBTZXBhcmF0b3I7CisgICAgUyArPSAoKkJlZ2luKTsKKyAgfQorICByZXR1cm4gUzsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNlcD4KK2lubGluZSB2b2lkIGpvaW5faXRlbXNfaW1wbChzdGQ6OnN0cmluZyAmUmVzdWx0LCBTZXAgU2VwYXJhdG9yKSB7fQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VwLCB0eXBlbmFtZSBBcmc+CitpbmxpbmUgdm9pZCBqb2luX2l0ZW1zX2ltcGwoc3RkOjpzdHJpbmcgJlJlc3VsdCwgU2VwIFNlcGFyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmcgJkl0ZW0pIHsKKyAgUmVzdWx0ICs9IEl0ZW07Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXAsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lLi4uIEFyZ3M+CitpbmxpbmUgdm9pZCBqb2luX2l0ZW1zX2ltcGwoc3RkOjpzdHJpbmcgJlJlc3VsdCwgU2VwIFNlcGFyYXRvciwgY29uc3QgQXJnMSAmQTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJncyAmJi4uLiBJdGVtcykgeworICBSZXN1bHQgKz0gQTE7CisgIFJlc3VsdCArPSBTZXBhcmF0b3I7CisgIGpvaW5faXRlbXNfaW1wbChSZXN1bHQsIFNlcGFyYXRvciwgc3RkOjpmb3J3YXJkPEFyZ3M+KEl0ZW1zKS4uLik7Cit9CisKK2lubGluZSBzaXplX3Qgam9pbl9vbmVfaXRlbV9zaXplKGNoYXIgQykgeyByZXR1cm4gMTsgfQoraW5saW5lIHNpemVfdCBqb2luX29uZV9pdGVtX3NpemUoY29uc3QgY2hhciAqUykgeyByZXR1cm4gUyA/IDo6c3RybGVuKFMpIDogMDsgfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gaW5saW5lIHNpemVfdCBqb2luX29uZV9pdGVtX3NpemUoY29uc3QgVCAmU3RyKSB7CisgIHJldHVybiBTdHIuc2l6ZSgpOworfQorCitpbmxpbmUgc2l6ZV90IGpvaW5faXRlbXNfc2l6ZSgpIHsgcmV0dXJuIDA7IH0KKwordGVtcGxhdGUgPHR5cGVuYW1lIEExPiBpbmxpbmUgc2l6ZV90IGpvaW5faXRlbXNfc2l6ZShjb25zdCBBMSAmQSkgeworICByZXR1cm4gam9pbl9vbmVfaXRlbV9zaXplKEEpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZS4uLiBBcmdzPgoraW5saW5lIHNpemVfdCBqb2luX2l0ZW1zX3NpemUoY29uc3QgQTEgJkEsIEFyZ3MgJiYuLi4gSXRlbXMpIHsKKyAgcmV0dXJuIGpvaW5fb25lX2l0ZW1fc2l6ZShBKSArIGpvaW5faXRlbXNfc2l6ZShzdGQ6OmZvcndhcmQ8QXJncz4oSXRlbXMpLi4uKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAorCisvLy8gSm9pbnMgdGhlIHN0cmluZ3MgaW4gdGhlIHJhbmdlIFtCZWdpbiwgRW5kKSwgYWRkaW5nIFNlcGFyYXRvciBiZXR3ZWVuCisvLy8gdGhlIGVsZW1lbnRzLgordGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yVD4KK2lubGluZSBzdGQ6OnN0cmluZyBqb2luKEl0ZXJhdG9yVCBCZWdpbiwgSXRlcmF0b3JUIEVuZCwgU3RyaW5nUmVmIFNlcGFyYXRvcikgeworICB1c2luZyB0YWcgPSB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyYXRvclQ+OjppdGVyYXRvcl9jYXRlZ29yeTsKKyAgcmV0dXJuIGRldGFpbDo6am9pbl9pbXBsKEJlZ2luLCBFbmQsIFNlcGFyYXRvciwgdGFnKCkpOworfQorCisvLy8gSm9pbnMgdGhlIHN0cmluZ3MgaW4gdGhlIHJhbmdlIFtSLmJlZ2luKCksIFIuZW5kKCkpLCBhZGRpbmcgU2VwYXJhdG9yCisvLy8gYmV0d2VlbiB0aGUgZWxlbWVudHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmFuZ2U+CitpbmxpbmUgc3RkOjpzdHJpbmcgam9pbihSYW5nZSAmJlIsIFN0cmluZ1JlZiBTZXBhcmF0b3IpIHsKKyAgcmV0dXJuIGpvaW4oUi5iZWdpbigpLCBSLmVuZCgpLCBTZXBhcmF0b3IpOworfQorCisvLy8gSm9pbnMgdGhlIHN0cmluZ3MgaW4gdGhlIHBhcmFtZXRlciBwYWNrIFxwIEl0ZW1zLCBhZGRpbmcgXHAgU2VwYXJhdG9yCisvLy8gYmV0d2VlbiB0aGUgZWxlbWVudHMuICBBbGwgYXJndW1lbnRzIG11c3QgYmUgaW1wbGljaXRseSBjb252ZXJ0aWJsZSB0bworLy8vIHN0ZDo6c3RyaW5nLCBvciB0aGVyZSBzaG91bGQgYmUgYW4gb3ZlcmxvYWQgb2Ygc3RkOjpzdHJpbmc6Om9wZXJhdG9yKz0oKQorLy8vIHRoYXQgYWNjZXB0cyB0aGUgYXJndW1lbnQgZXhwbGljaXRseS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXAsIHR5cGVuYW1lLi4uIEFyZ3M+CitpbmxpbmUgc3RkOjpzdHJpbmcgam9pbl9pdGVtcyhTZXAgU2VwYXJhdG9yLCBBcmdzICYmLi4uIEl0ZW1zKSB7CisgIHN0ZDo6c3RyaW5nIFJlc3VsdDsKKyAgaWYgKHNpemVvZi4uLihJdGVtcykgPT0gMCkKKyAgICByZXR1cm4gUmVzdWx0OworCisgIHNpemVfdCBOUyA9IGRldGFpbDo6am9pbl9vbmVfaXRlbV9zaXplKFNlcGFyYXRvcik7CisgIHNpemVfdCBOSSA9IGRldGFpbDo6am9pbl9pdGVtc19zaXplKHN0ZDo6Zm9yd2FyZDxBcmdzPihJdGVtcykuLi4pOworICBSZXN1bHQucmVzZXJ2ZShOSSArIChzaXplb2YuLi4oSXRlbXMpIC0gMSkgKiBOUyArIDEpOworICBkZXRhaWw6OmpvaW5faXRlbXNfaW1wbChSZXN1bHQsIFNlcGFyYXRvciwgc3RkOjpmb3J3YXJkPEFyZ3M+KEl0ZW1zKS4uLik7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9TVFJJTkdFWFRSQVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nTWFwLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TdHJpbmdNYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzRkNWVkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nTWFwLmgKQEAgLTAsMCArMSw1NTggQEAKKy8vPT09LSBTdHJpbmdNYXAuaCAtIFN0cmluZyBIYXNoIHRhYmxlIG1hcCBpbnRlcmZhY2UgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFN0cmluZ01hcCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1NUUklOR01BUF9ICisjZGVmaW5lIExMVk1fQURUX1NUUklOR01BUF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Qb2ludGVyTGlrZVR5cGVUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5PiBjbGFzcyBTdHJpbmdNYXBDb25zdEl0ZXJhdG9yOwordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeT4gY2xhc3MgU3RyaW5nTWFwSXRlcmF0b3I7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBWYWx1ZVR5PiBjbGFzcyBTdHJpbmdNYXBLZXlJdGVyYXRvcjsKKworLy8vIFN0cmluZ01hcEVudHJ5QmFzZSAtIFNoYXJlZCBiYXNlIGNsYXNzIG9mIFN0cmluZ01hcEVudHJ5IGluc3RhbmNlcy4KK2NsYXNzIFN0cmluZ01hcEVudHJ5QmFzZSB7CisgIHNpemVfdCBTdHJMZW47CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgU3RyaW5nTWFwRW50cnlCYXNlKHNpemVfdCBMZW4pIDogU3RyTGVuKExlbikge30KKworICBzaXplX3QgZ2V0S2V5TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gU3RyTGVuOyB9Cit9OworCisvLy8gU3RyaW5nTWFwSW1wbCAtIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3Mgb2YgU3RyaW5nTWFwIHRoYXQgaXMgc2hhcmVkIGFtb25nCisvLy8gYWxsIG9mIGl0cyBpbnN0YW50aWF0aW9ucy4KK2NsYXNzIFN0cmluZ01hcEltcGwgeworcHJvdGVjdGVkOgorICAvLyBBcnJheSBvZiBOdW1CdWNrZXRzIHBvaW50ZXJzIHRvIGVudHJpZXMsIG51bGwgcG9pbnRlcnMgYXJlIGhvbGVzLgorICAvLyBUaGVUYWJsZVtOdW1CdWNrZXRzXSBjb250YWlucyBhIHNlbnRpbmVsIHZhbHVlIGZvciBlYXN5IGl0ZXJhdGlvbi4gRm9sbG93ZWQKKyAgLy8gYnkgYW4gYXJyYXkgb2YgdGhlIGFjdHVhbCBoYXNoIHZhbHVlcyBhcyB1bnNpZ25lZCBpbnRlZ2Vycy4KKyAgU3RyaW5nTWFwRW50cnlCYXNlICoqVGhlVGFibGUgPSBudWxscHRyOworICB1bnNpZ25lZCBOdW1CdWNrZXRzID0gMDsKKyAgdW5zaWduZWQgTnVtSXRlbXMgPSAwOworICB1bnNpZ25lZCBOdW1Ub21ic3RvbmVzID0gMDsKKyAgdW5zaWduZWQgSXRlbVNpemU7CisKK3Byb3RlY3RlZDoKKyAgZXhwbGljaXQgU3RyaW5nTWFwSW1wbCh1bnNpZ25lZCBpdGVtU2l6ZSkKKyAgICAgIDogSXRlbVNpemUoaXRlbVNpemUpIHt9CisgIFN0cmluZ01hcEltcGwoU3RyaW5nTWFwSW1wbCAmJlJIUykKKyAgICAgIDogVGhlVGFibGUoUkhTLlRoZVRhYmxlKSwgTnVtQnVja2V0cyhSSFMuTnVtQnVja2V0cyksCisgICAgICAgIE51bUl0ZW1zKFJIUy5OdW1JdGVtcyksIE51bVRvbWJzdG9uZXMoUkhTLk51bVRvbWJzdG9uZXMpLAorICAgICAgICBJdGVtU2l6ZShSSFMuSXRlbVNpemUpIHsKKyAgICBSSFMuVGhlVGFibGUgPSBudWxscHRyOworICAgIFJIUy5OdW1CdWNrZXRzID0gMDsKKyAgICBSSFMuTnVtSXRlbXMgPSAwOworICAgIFJIUy5OdW1Ub21ic3RvbmVzID0gMDsKKyAgfQorCisgIFN0cmluZ01hcEltcGwodW5zaWduZWQgSW5pdFNpemUsIHVuc2lnbmVkIEl0ZW1TaXplKTsKKyAgdW5zaWduZWQgUmVoYXNoVGFibGUodW5zaWduZWQgQnVja2V0Tm8gPSAwKTsKKworICAvLy8gTG9va3VwQnVja2V0Rm9yIC0gTG9vayB1cCB0aGUgYnVja2V0IHRoYXQgdGhlIHNwZWNpZmllZCBzdHJpbmcgc2hvdWxkIGVuZAorICAvLy8gdXAgaW4uICBJZiBpdCBhbHJlYWR5IGV4aXN0cyBhcyBhIGtleSBpbiB0aGUgbWFwLCB0aGUgSXRlbSBwb2ludGVyIGZvciB0aGUKKyAgLy8vIHNwZWNpZmllZCBidWNrZXQgd2lsbCBiZSBub24tbnVsbC4gIE90aGVyd2lzZSwgaXQgd2lsbCBiZSBudWxsLiAgSW4gZWl0aGVyCisgIC8vLyBjYXNlLCB0aGUgRnVsbEhhc2hWYWx1ZSBmaWVsZCBvZiB0aGUgYnVja2V0IHdpbGwgYmUgc2V0IHRvIHRoZSBoYXNoIHZhbHVlCisgIC8vLyBvZiB0aGUgc3RyaW5nLgorICB1bnNpZ25lZCBMb29rdXBCdWNrZXRGb3IoU3RyaW5nUmVmIEtleSk7CisKKyAgLy8vIEZpbmRLZXkgLSBMb29rIHVwIHRoZSBidWNrZXQgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGtleS4gSWYgaXQgZXhpc3RzCisgIC8vLyBpbiB0aGUgbWFwLCByZXR1cm4gdGhlIGJ1Y2tldCBudW1iZXIgb2YgdGhlIGtleS4gIE90aGVyd2lzZSByZXR1cm4gLTEuCisgIC8vLyBUaGlzIGRvZXMgbm90IG1vZGlmeSB0aGUgbWFwLgorICBpbnQgRmluZEtleShTdHJpbmdSZWYgS2V5KSBjb25zdDsKKworICAvLy8gUmVtb3ZlS2V5IC0gUmVtb3ZlIHRoZSBzcGVjaWZpZWQgU3RyaW5nTWFwRW50cnkgZnJvbSB0aGUgdGFibGUsIGJ1dCBkbyBub3QKKyAgLy8vIGRlbGV0ZSBpdC4gIFRoaXMgYWJvcnRzIGlmIHRoZSB2YWx1ZSBpc24ndCBpbiB0aGUgdGFibGUuCisgIHZvaWQgUmVtb3ZlS2V5KFN0cmluZ01hcEVudHJ5QmFzZSAqVik7CisKKyAgLy8vIFJlbW92ZUtleSAtIFJlbW92ZSB0aGUgU3RyaW5nTWFwRW50cnkgZm9yIHRoZSBzcGVjaWZpZWQga2V5IGZyb20gdGhlCisgIC8vLyB0YWJsZSwgcmV0dXJuaW5nIGl0LiAgSWYgdGhlIGtleSBpcyBub3QgaW4gdGhlIHRhYmxlLCB0aGlzIHJldHVybnMgbnVsbC4KKyAgU3RyaW5nTWFwRW50cnlCYXNlICpSZW1vdmVLZXkoU3RyaW5nUmVmIEtleSk7CisKKyAgLy8vIEFsbG9jYXRlIHRoZSB0YWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGJ1Y2tldHMgYW5kIG90aGVyd2lzZQorICAvLy8gc2V0dXAgdGhlIG1hcCBhcyBlbXB0eS4KKyAgdm9pZCBpbml0KHVuc2lnbmVkIFNpemUpOworCitwdWJsaWM6CisgIHN0YXRpYyBTdHJpbmdNYXBFbnRyeUJhc2UgKmdldFRvbWJzdG9uZVZhbCgpIHsKKyAgICB1aW50cHRyX3QgVmFsID0gc3RhdGljX2Nhc3Q8dWludHB0cl90PigtMSk7CisgICAgVmFsIDw8PSBQb2ludGVyTGlrZVR5cGVUcmFpdHM8U3RyaW5nTWFwRW50cnlCYXNlICo+OjpOdW1Mb3dCaXRzQXZhaWxhYmxlOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFN0cmluZ01hcEVudHJ5QmFzZSAqPihWYWwpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtQnVja2V0cygpIGNvbnN0IHsgcmV0dXJuIE51bUJ1Y2tldHM7IH0KKyAgdW5zaWduZWQgZ2V0TnVtSXRlbXMoKSBjb25zdCB7IHJldHVybiBOdW1JdGVtczsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBOdW1JdGVtcyA9PSAwOyB9CisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBOdW1JdGVtczsgfQorCisgIHZvaWQgc3dhcChTdHJpbmdNYXBJbXBsICZPdGhlcikgeworICAgIHN0ZDo6c3dhcChUaGVUYWJsZSwgT3RoZXIuVGhlVGFibGUpOworICAgIHN0ZDo6c3dhcChOdW1CdWNrZXRzLCBPdGhlci5OdW1CdWNrZXRzKTsKKyAgICBzdGQ6OnN3YXAoTnVtSXRlbXMsIE90aGVyLk51bUl0ZW1zKTsKKyAgICBzdGQ6OnN3YXAoTnVtVG9tYnN0b25lcywgT3RoZXIuTnVtVG9tYnN0b25lcyk7CisgIH0KK307CisKKy8vLyBTdHJpbmdNYXBFbnRyeSAtIFRoaXMgaXMgdXNlZCB0byByZXByZXNlbnQgb25lIHZhbHVlIHRoYXQgaXMgaW5zZXJ0ZWQgaW50bworLy8vIGEgU3RyaW5nTWFwLiAgSXQgY29udGFpbnMgdGhlIFZhbHVlIGl0c2VsZiBhbmQgdGhlIGtleTogdGhlIHN0cmluZyBsZW5ndGgKKy8vLyBhbmQgZGF0YS4KK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHk+CitjbGFzcyBTdHJpbmdNYXBFbnRyeSA6IHB1YmxpYyBTdHJpbmdNYXBFbnRyeUJhc2UgeworcHVibGljOgorICBWYWx1ZVR5IHNlY29uZDsKKworICBleHBsaWNpdCBTdHJpbmdNYXBFbnRyeShzaXplX3Qgc3RyTGVuKQorICAgIDogU3RyaW5nTWFwRW50cnlCYXNlKHN0ckxlbiksIHNlY29uZCgpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBJbml0VHk+CisgIFN0cmluZ01hcEVudHJ5KHNpemVfdCBzdHJMZW4sIEluaXRUeSAmJi4uLiBJbml0VmFscykKKyAgICAgIDogU3RyaW5nTWFwRW50cnlCYXNlKHN0ckxlbiksIHNlY29uZChzdGQ6OmZvcndhcmQ8SW5pdFR5PihJbml0VmFscykuLi4pIHt9CisgIFN0cmluZ01hcEVudHJ5KFN0cmluZ01hcEVudHJ5ICZFKSA9IGRlbGV0ZTsKKworICBTdHJpbmdSZWYgZ2V0S2V5KCkgY29uc3QgeworICAgIHJldHVybiBTdHJpbmdSZWYoZ2V0S2V5RGF0YSgpLCBnZXRLZXlMZW5ndGgoKSk7CisgIH0KKworICBjb25zdCBWYWx1ZVR5ICZnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHNlY29uZDsgfQorICBWYWx1ZVR5ICZnZXRWYWx1ZSgpIHsgcmV0dXJuIHNlY29uZDsgfQorCisgIHZvaWQgc2V0VmFsdWUoY29uc3QgVmFsdWVUeSAmVikgeyBzZWNvbmQgPSBWOyB9CisKKyAgLy8vIGdldEtleURhdGEgLSBSZXR1cm4gdGhlIHN0YXJ0IG9mIHRoZSBzdHJpbmcgZGF0YSB0aGF0IGlzIHRoZSBrZXkgZm9yIHRoaXMKKyAgLy8vIHZhbHVlLiAgVGhlIHN0cmluZyBkYXRhIGlzIGFsd2F5cyBzdG9yZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCisgIC8vLyBTdHJpbmdNYXBFbnRyeSBvYmplY3QuCisgIGNvbnN0IGNoYXIgKmdldEtleURhdGEoKSBjb25zdCB7cmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHRoaXMrMSk7fQorCisgIFN0cmluZ1JlZiBmaXJzdCgpIGNvbnN0IHsgcmV0dXJuIFN0cmluZ1JlZihnZXRLZXlEYXRhKCksIGdldEtleUxlbmd0aCgpKTsgfQorCisgIC8vLyBDcmVhdGUgYSBTdHJpbmdNYXBFbnRyeSBmb3IgdGhlIHNwZWNpZmllZCBrZXkgY29uc3RydWN0IHRoZSB2YWx1ZSB1c2luZworICAvLy8gXHAgSW5pdGlWYWxzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQWxsb2NhdG9yVHksIHR5cGVuYW1lLi4uIEluaXRUeT4KKyAgc3RhdGljIFN0cmluZ01hcEVudHJ5ICpDcmVhdGUoU3RyaW5nUmVmIEtleSwgQWxsb2NhdG9yVHkgJkFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5pdFR5ICYmLi4uIEluaXRWYWxzKSB7CisgICAgc2l6ZV90IEtleUxlbmd0aCA9IEtleS5zaXplKCk7CisKKyAgICAvLyBBbGxvY2F0ZSBhIG5ldyBpdGVtIHdpdGggc3BhY2UgZm9yIHRoZSBzdHJpbmcgYXQgdGhlIGVuZCBhbmQgYSBudWxsCisgICAgLy8gdGVybWluYXRvci4KKyAgICBzaXplX3QgQWxsb2NTaXplID0gc2l6ZW9mKFN0cmluZ01hcEVudHJ5KSArIEtleUxlbmd0aCArIDE7CisgICAgc2l6ZV90IEFsaWdubWVudCA9IGFsaWdub2YoU3RyaW5nTWFwRW50cnkpOworCisgICAgU3RyaW5nTWFwRW50cnkgKk5ld0l0ZW0gPQorICAgICAgc3RhdGljX2Nhc3Q8U3RyaW5nTWFwRW50cnkqPihBbGxvY2F0b3IuQWxsb2NhdGUoQWxsb2NTaXplLEFsaWdubWVudCkpOworCisgICAgaWYgKE5ld0l0ZW0gPT0gbnVsbHB0cikKKyAgICAgIHJlcG9ydF9iYWRfYWxsb2NfZXJyb3IoIkFsbG9jYXRpb24gb2YgU3RyaW5nTWFwIGVudHJ5IGZhaWxlZC4iKTsKKworICAgIC8vIENvbnN0cnVjdCB0aGUgdmFsdWUuCisgICAgbmV3IChOZXdJdGVtKSBTdHJpbmdNYXBFbnRyeShLZXlMZW5ndGgsIHN0ZDo6Zm9yd2FyZDxJbml0VHk+KEluaXRWYWxzKS4uLik7CisKKyAgICAvLyBDb3B5IHRoZSBzdHJpbmcgaW5mb3JtYXRpb24uCisgICAgY2hhciAqU3RyQnVmZmVyID0gY29uc3RfY2FzdDxjaGFyKj4oTmV3SXRlbS0+Z2V0S2V5RGF0YSgpKTsKKyAgICBpZiAoS2V5TGVuZ3RoID4gMCkKKyAgICAgIG1lbWNweShTdHJCdWZmZXIsIEtleS5kYXRhKCksIEtleUxlbmd0aCk7CisgICAgU3RyQnVmZmVyW0tleUxlbmd0aF0gPSAwOyAgLy8gTnVsbCB0ZXJtaW5hdGUgZm9yIGNvbnZlbmllbmNlIG9mIGNsaWVudHMuCisgICAgcmV0dXJuIE5ld0l0ZW07CisgIH0KKworICAvLy8gQ3JlYXRlIC0gQ3JlYXRlIGEgU3RyaW5nTWFwRW50cnkgd2l0aCBub3JtYWwgbWFsbG9jL2ZyZWUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBJbml0VHlwZT4KKyAgc3RhdGljIFN0cmluZ01hcEVudHJ5ICpDcmVhdGUoU3RyaW5nUmVmIEtleSwgSW5pdFR5cGUgJiYuLi4gSW5pdFZhbCkgeworICAgIE1hbGxvY0FsbG9jYXRvciBBOworICAgIHJldHVybiBDcmVhdGUoS2V5LCBBLCBzdGQ6OmZvcndhcmQ8SW5pdFR5cGU+KEluaXRWYWwpLi4uKTsKKyAgfQorCisgIHN0YXRpYyBTdHJpbmdNYXBFbnRyeSAqQ3JlYXRlKFN0cmluZ1JlZiBLZXkpIHsKKyAgICByZXR1cm4gQ3JlYXRlKEtleSwgVmFsdWVUeSgpKTsKKyAgfQorCisgIC8vLyBHZXRTdHJpbmdNYXBFbnRyeUZyb21LZXlEYXRhIC0gR2l2ZW4ga2V5IGRhdGEgdGhhdCBpcyBrbm93biB0byBiZSBlbWJlZGRlZAorICAvLy8gaW50byBhIFN0cmluZ01hcEVudHJ5LCByZXR1cm4gdGhlIFN0cmluZ01hcEVudHJ5IGl0c2VsZi4KKyAgc3RhdGljIFN0cmluZ01hcEVudHJ5ICZHZXRTdHJpbmdNYXBFbnRyeUZyb21LZXlEYXRhKGNvbnN0IGNoYXIgKktleURhdGEpIHsKKyAgICBjaGFyICpQdHIgPSBjb25zdF9jYXN0PGNoYXIqPihLZXlEYXRhKSAtIHNpemVvZihTdHJpbmdNYXBFbnRyeTxWYWx1ZVR5Pik7CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PFN0cmluZ01hcEVudHJ5Kj4oUHRyKTsKKyAgfQorCisgIC8vLyBEZXN0cm95IC0gRGVzdHJveSB0aGlzIFN0cmluZ01hcEVudHJ5LCByZWxlYXNpbmcgbWVtb3J5IGJhY2sgdG8gdGhlCisgIC8vLyBzcGVjaWZpZWQgYWxsb2NhdG9yLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbGxvY2F0b3JUeT4KKyAgdm9pZCBEZXN0cm95KEFsbG9jYXRvclR5ICZBbGxvY2F0b3IpIHsKKyAgICAvLyBGcmVlIG1lbW9yeSByZWZlcmVuY2VkIGJ5IHRoZSBpdGVtLgorICAgIHNpemVfdCBBbGxvY1NpemUgPSBzaXplb2YoU3RyaW5nTWFwRW50cnkpICsgZ2V0S2V5TGVuZ3RoKCkgKyAxOworICAgIHRoaXMtPn5TdHJpbmdNYXBFbnRyeSgpOworICAgIEFsbG9jYXRvci5EZWFsbG9jYXRlKHN0YXRpY19jYXN0PHZvaWQgKj4odGhpcyksIEFsbG9jU2l6ZSk7CisgIH0KKworICAvLy8gRGVzdHJveSB0aGlzIG9iamVjdCwgcmVsZWFzaW5nIG1lbW9yeSBiYWNrIHRvIHRoZSBtYWxsb2MgYWxsb2NhdG9yLgorICB2b2lkIERlc3Ryb3koKSB7CisgICAgTWFsbG9jQWxsb2NhdG9yIEE7CisgICAgRGVzdHJveShBKTsKKyAgfQorfTsKKworLy8vIFN0cmluZ01hcCAtIFRoaXMgaXMgYW4gdW5jb252ZW50aW9uYWwgbWFwIHRoYXQgaXMgc3BlY2lhbGl6ZWQgZm9yIGhhbmRsaW5nCisvLy8ga2V5cyB0aGF0IGFyZSAic3RyaW5ncyIsIHdoaWNoIGFyZSBiYXNpY2FsbHkgcmFuZ2VzIG9mIGJ5dGVzLiBUaGlzIGRvZXMgc29tZQorLy8vIGZ1bmt5IG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBoYXNoaW5nIHRoaW5ncyB0byBtYWtlIGl0IGV4dHJlbWVseSBlZmZpY2llbnQsCisvLy8gc3RvcmluZyB0aGUgc3RyaW5nIGRhdGEgKmFmdGVyKiB0aGUgdmFsdWUgaW4gdGhlIG1hcC4KK3RlbXBsYXRlPHR5cGVuYW1lIFZhbHVlVHksIHR5cGVuYW1lIEFsbG9jYXRvclR5ID0gTWFsbG9jQWxsb2NhdG9yPgorY2xhc3MgU3RyaW5nTWFwIDogcHVibGljIFN0cmluZ01hcEltcGwgeworICBBbGxvY2F0b3JUeSBBbGxvY2F0b3I7CisKK3B1YmxpYzoKKyAgdXNpbmcgTWFwRW50cnlUeSA9IFN0cmluZ01hcEVudHJ5PFZhbHVlVHk+OworCisgIFN0cmluZ01hcCgpIDogU3RyaW5nTWFwSW1wbChzdGF0aWNfY2FzdDx1bnNpZ25lZD4oc2l6ZW9mKE1hcEVudHJ5VHkpKSkge30KKworICBleHBsaWNpdCBTdHJpbmdNYXAodW5zaWduZWQgSW5pdGlhbFNpemUpCisgICAgOiBTdHJpbmdNYXBJbXBsKEluaXRpYWxTaXplLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oc2l6ZW9mKE1hcEVudHJ5VHkpKSkge30KKworICBleHBsaWNpdCBTdHJpbmdNYXAoQWxsb2NhdG9yVHkgQSkKKyAgICA6IFN0cmluZ01hcEltcGwoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KHNpemVvZihNYXBFbnRyeVR5KSkpLCBBbGxvY2F0b3IoQSkge30KKworICBTdHJpbmdNYXAodW5zaWduZWQgSW5pdGlhbFNpemUsIEFsbG9jYXRvclR5IEEpCisgICAgOiBTdHJpbmdNYXBJbXBsKEluaXRpYWxTaXplLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oc2l6ZW9mKE1hcEVudHJ5VHkpKSksCisgICAgICBBbGxvY2F0b3IoQSkge30KKworICBTdHJpbmdNYXAoc3RkOjppbml0aWFsaXplcl9saXN0PHN0ZDo6cGFpcjxTdHJpbmdSZWYsIFZhbHVlVHk+PiBMaXN0KQorICAgICAgOiBTdHJpbmdNYXBJbXBsKExpc3Quc2l6ZSgpLCBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oc2l6ZW9mKE1hcEVudHJ5VHkpKSkgeworICAgIGZvciAoY29uc3QgYXV0byAmUCA6IExpc3QpIHsKKyAgICAgIGluc2VydChQKTsKKyAgICB9CisgIH0KKworICBTdHJpbmdNYXAoU3RyaW5nTWFwICYmUkhTKQorICAgICAgOiBTdHJpbmdNYXBJbXBsKHN0ZDo6bW92ZShSSFMpKSwgQWxsb2NhdG9yKHN0ZDo6bW92ZShSSFMuQWxsb2NhdG9yKSkge30KKworICBTdHJpbmdNYXAoY29uc3QgU3RyaW5nTWFwICZSSFMpIDoKKyAgICBTdHJpbmdNYXBJbXBsKHN0YXRpY19jYXN0PHVuc2lnbmVkPihzaXplb2YoTWFwRW50cnlUeSkpKSwKKyAgICBBbGxvY2F0b3IoUkhTLkFsbG9jYXRvcikgeworICAgIGlmIChSSFMuZW1wdHkoKSkKKyAgICAgIHJldHVybjsKKworICAgIC8vIEFsbG9jYXRlIFRoZVRhYmxlIG9mIHRoZSBzYW1lIHNpemUgYXMgUkhTJ3MgVGhlVGFibGUsIGFuZCBzZXQgdGhlCisgICAgLy8gc2VudGluZWwgYXBwcm9wcmlhdGVseSAoYW5kIE51bUJ1Y2tldHMpLgorICAgIGluaXQoUkhTLk51bUJ1Y2tldHMpOworICAgIHVuc2lnbmVkICpIYXNoVGFibGUgPSAodW5zaWduZWQgKikoVGhlVGFibGUgKyBOdW1CdWNrZXRzICsgMSksCisgICAgICAgICAgICAgKlJIU0hhc2hUYWJsZSA9ICh1bnNpZ25lZCAqKShSSFMuVGhlVGFibGUgKyBOdW1CdWNrZXRzICsgMSk7CisKKyAgICBOdW1JdGVtcyA9IFJIUy5OdW1JdGVtczsKKyAgICBOdW1Ub21ic3RvbmVzID0gUkhTLk51bVRvbWJzdG9uZXM7CisgICAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IE51bUJ1Y2tldHM7IEkgIT0gRTsgKytJKSB7CisgICAgICBTdHJpbmdNYXBFbnRyeUJhc2UgKkJ1Y2tldCA9IFJIUy5UaGVUYWJsZVtJXTsKKyAgICAgIGlmICghQnVja2V0IHx8IEJ1Y2tldCA9PSBnZXRUb21ic3RvbmVWYWwoKSkgeworICAgICAgICBUaGVUYWJsZVtJXSA9IEJ1Y2tldDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIFRoZVRhYmxlW0ldID0gTWFwRW50cnlUeTo6Q3JlYXRlKAorICAgICAgICAgIHN0YXRpY19jYXN0PE1hcEVudHJ5VHkgKj4oQnVja2V0KS0+Z2V0S2V5KCksIEFsbG9jYXRvciwKKyAgICAgICAgICBzdGF0aWNfY2FzdDxNYXBFbnRyeVR5ICo+KEJ1Y2tldCktPmdldFZhbHVlKCkpOworICAgICAgSGFzaFRhYmxlW0ldID0gUkhTSGFzaFRhYmxlW0ldOworICAgIH0KKworICAgIC8vIE5vdGUgdGhhdCBoZXJlIHdlJ3ZlIGNvcGllZCBldmVyeXRoaW5nIGZyb20gdGhlIFJIUyBpbnRvIHRoaXMgb2JqZWN0LAorICAgIC8vIHRvbWJzdG9uZXMgaW5jbHVkZWQuIFdlIGNvdWxkLCBpbnN0ZWFkLCBoYXZlIHJlLXByb2JlZCBmb3IgZWFjaCBrZXkgdG8KKyAgICAvLyBpbnN0YW50aWF0ZSB0aGlzIG5ldyBvYmplY3Qgd2l0aG91dCBhbnkgdG9tYnN0b25lIGJ1Y2tldHMuIFRoZQorICAgIC8vIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IGl0ZW1zIGFyZSByYXJlbHkgZGVsZXRlZCBmcm9tIG1vc3QgU3RyaW5nTWFwcywKKyAgICAvLyBhbmQgc28gdG9tYnN0b25lcyBhcmUgcmFyZSwgc28gdGhlIGNvc3Qgb2YgcmUtcHJvYmluZyBmb3IgYWxsIGlucHV0cyBpcworICAgIC8vIG5vdCB3b3J0aHdoaWxlLgorICB9CisKKyAgU3RyaW5nTWFwICZvcGVyYXRvcj0oU3RyaW5nTWFwIFJIUykgeworICAgIFN0cmluZ01hcEltcGw6OnN3YXAoUkhTKTsKKyAgICBzdGQ6OnN3YXAoQWxsb2NhdG9yLCBSSFMuQWxsb2NhdG9yKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB+U3RyaW5nTWFwKCkgeworICAgIC8vIERlbGV0ZSBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBtYXAsIGJ1dCBkb24ndCByZXNldCB0aGUgZWxlbWVudHMKKyAgICAvLyB0byBkZWZhdWx0IHZhbHVlcy4gIFRoaXMgaXMgYSBjb3B5IG9mIGNsZWFyKCksIGJ1dCBhdm9pZHMgdW5uZWNlc3NhcnkKKyAgICAvLyB3b3JrIG5vdCByZXF1aXJlZCBpbiB0aGUgZGVzdHJ1Y3Rvci4KKyAgICBpZiAoIWVtcHR5KCkpIHsKKyAgICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBOdW1CdWNrZXRzOyBJICE9IEU7ICsrSSkgeworICAgICAgICBTdHJpbmdNYXBFbnRyeUJhc2UgKkJ1Y2tldCA9IFRoZVRhYmxlW0ldOworICAgICAgICBpZiAoQnVja2V0ICYmIEJ1Y2tldCAhPSBnZXRUb21ic3RvbmVWYWwoKSkgeworICAgICAgICAgIHN0YXRpY19jYXN0PE1hcEVudHJ5VHkqPihCdWNrZXQpLT5EZXN0cm95KEFsbG9jYXRvcik7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgZnJlZShUaGVUYWJsZSk7CisgIH0KKworICBBbGxvY2F0b3JUeSAmZ2V0QWxsb2NhdG9yKCkgeyByZXR1cm4gQWxsb2NhdG9yOyB9CisgIGNvbnN0IEFsbG9jYXRvclR5ICZnZXRBbGxvY2F0b3IoKSBjb25zdCB7IHJldHVybiBBbGxvY2F0b3I7IH0KKworICB1c2luZyBrZXlfdHlwZSA9IGNvbnN0IGNoYXIqOworICB1c2luZyBtYXBwZWRfdHlwZSA9IFZhbHVlVHk7CisgIHVzaW5nIHZhbHVlX3R5cGUgPSBTdHJpbmdNYXBFbnRyeTxWYWx1ZVR5PjsKKyAgdXNpbmcgc2l6ZV90eXBlID0gc2l6ZV90OworCisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gU3RyaW5nTWFwQ29uc3RJdGVyYXRvcjxWYWx1ZVR5PjsKKyAgdXNpbmcgaXRlcmF0b3IgPSBTdHJpbmdNYXBJdGVyYXRvcjxWYWx1ZVR5PjsKKworICBpdGVyYXRvciBiZWdpbigpIHsKKyAgICByZXR1cm4gaXRlcmF0b3IoVGhlVGFibGUsIE51bUJ1Y2tldHMgPT0gMCk7CisgIH0KKyAgaXRlcmF0b3IgZW5kKCkgeworICAgIHJldHVybiBpdGVyYXRvcihUaGVUYWJsZStOdW1CdWNrZXRzLCB0cnVlKTsKKyAgfQorICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoVGhlVGFibGUsIE51bUJ1Y2tldHMgPT0gMCk7CisgIH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihUaGVUYWJsZStOdW1CdWNrZXRzLCB0cnVlKTsKKyAgfQorCisgIGl0ZXJhdG9yX3JhbmdlPFN0cmluZ01hcEtleUl0ZXJhdG9yPFZhbHVlVHk+PiBrZXlzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKFN0cmluZ01hcEtleUl0ZXJhdG9yPFZhbHVlVHk+KGJlZ2luKCkpLAorICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ01hcEtleUl0ZXJhdG9yPFZhbHVlVHk+KGVuZCgpKSk7CisgIH0KKworICBpdGVyYXRvciBmaW5kKFN0cmluZ1JlZiBLZXkpIHsKKyAgICBpbnQgQnVja2V0ID0gRmluZEtleShLZXkpOworICAgIGlmIChCdWNrZXQgPT0gLTEpIHJldHVybiBlbmQoKTsKKyAgICByZXR1cm4gaXRlcmF0b3IoVGhlVGFibGUrQnVja2V0LCB0cnVlKTsKKyAgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoU3RyaW5nUmVmIEtleSkgY29uc3QgeworICAgIGludCBCdWNrZXQgPSBGaW5kS2V5KEtleSk7CisgICAgaWYgKEJ1Y2tldCA9PSAtMSkgcmV0dXJuIGVuZCgpOworICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihUaGVUYWJsZStCdWNrZXQsIHRydWUpOworICB9CisKKyAgLy8vIGxvb2t1cCAtIFJldHVybiB0aGUgZW50cnkgZm9yIHRoZSBzcGVjaWZpZWQga2V5LCBvciBhIGRlZmF1bHQKKyAgLy8vIGNvbnN0cnVjdGVkIHZhbHVlIGlmIG5vIHN1Y2ggZW50cnkgZXhpc3RzLgorICBWYWx1ZVR5IGxvb2t1cChTdHJpbmdSZWYgS2V5KSBjb25zdCB7CisgICAgY29uc3RfaXRlcmF0b3IgaXQgPSBmaW5kKEtleSk7CisgICAgaWYgKGl0ICE9IGVuZCgpKQorICAgICAgcmV0dXJuIGl0LT5zZWNvbmQ7CisgICAgcmV0dXJuIFZhbHVlVHkoKTsKKyAgfQorCisgIC8vLyBMb29rdXAgdGhlIFZhbHVlVHkgZm9yIHRoZSBccCBLZXksIG9yIGNyZWF0ZSBhIGRlZmF1bHQgY29uc3RydWN0ZWQgdmFsdWUKKyAgLy8vIGlmIHRoZSBrZXkgaXMgbm90IGluIHRoZSBtYXAuCisgIFZhbHVlVHkgJm9wZXJhdG9yW10oU3RyaW5nUmVmIEtleSkgeyByZXR1cm4gdHJ5X2VtcGxhY2UoS2V5KS5maXJzdC0+c2Vjb25kOyB9CisKKyAgLy8vIGNvdW50IC0gUmV0dXJuIDEgaWYgdGhlIGVsZW1lbnQgaXMgaW4gdGhlIG1hcCwgMCBvdGhlcndpc2UuCisgIHNpemVfdHlwZSBjb3VudChTdHJpbmdSZWYgS2V5KSBjb25zdCB7CisgICAgcmV0dXJuIGZpbmQoS2V5KSA9PSBlbmQoKSA/IDAgOiAxOworICB9CisKKyAgLy8vIGluc2VydCAtIEluc2VydCB0aGUgc3BlY2lmaWVkIGtleS92YWx1ZSBwYWlyIGludG8gdGhlIG1hcC4gIElmIHRoZSBrZXkKKyAgLy8vIGFscmVhZHkgZXhpc3RzIGluIHRoZSBtYXAsIHJldHVybiBmYWxzZSBhbmQgaWdub3JlIHRoZSByZXF1ZXN0LCBvdGhlcndpc2UKKyAgLy8vIGluc2VydCBpdCBhbmQgcmV0dXJuIHRydWUuCisgIGJvb2wgaW5zZXJ0KE1hcEVudHJ5VHkgKktleVZhbHVlKSB7CisgICAgdW5zaWduZWQgQnVja2V0Tm8gPSBMb29rdXBCdWNrZXRGb3IoS2V5VmFsdWUtPmdldEtleSgpKTsKKyAgICBTdHJpbmdNYXBFbnRyeUJhc2UgKiZCdWNrZXQgPSBUaGVUYWJsZVtCdWNrZXROb107CisgICAgaWYgKEJ1Y2tldCAmJiBCdWNrZXQgIT0gZ2V0VG9tYnN0b25lVmFsKCkpCisgICAgICByZXR1cm4gZmFsc2U7ICAvLyBBbHJlYWR5IGV4aXN0cyBpbiBtYXAuCisKKyAgICBpZiAoQnVja2V0ID09IGdldFRvbWJzdG9uZVZhbCgpKQorICAgICAgLS1OdW1Ub21ic3RvbmVzOworICAgIEJ1Y2tldCA9IEtleVZhbHVlOworICAgICsrTnVtSXRlbXM7CisgICAgYXNzZXJ0KE51bUl0ZW1zICsgTnVtVG9tYnN0b25lcyA8PSBOdW1CdWNrZXRzKTsKKworICAgIFJlaGFzaFRhYmxlKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gaW5zZXJ0IC0gSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIGtleS92YWx1ZSBwYWlyIGludG8gdGhlIG1hcCBpZiB0aGUga2V5CisgIC8vLyBpc24ndCBhbHJlYWR5IGluIHRoZSBtYXAuIFRoZSBib29sIGNvbXBvbmVudCBvZiB0aGUgcmV0dXJuZWQgcGFpciBpcyB0cnVlCisgIC8vLyBpZiBhbmQgb25seSBpZiB0aGUgaW5zZXJ0aW9uIHRha2VzIHBsYWNlLCBhbmQgdGhlIGl0ZXJhdG9yIGNvbXBvbmVudCBvZgorICAvLy8gdGhlIHBhaXIgcG9pbnRzIHRvIHRoZSBlbGVtZW50IHdpdGgga2V5IGVxdWl2YWxlbnQgdG8gdGhlIGtleSBvZiB0aGUgcGFpci4KKyAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnQoc3RkOjpwYWlyPFN0cmluZ1JlZiwgVmFsdWVUeT4gS1YpIHsKKyAgICByZXR1cm4gdHJ5X2VtcGxhY2UoS1YuZmlyc3QsIHN0ZDo6bW92ZShLVi5zZWNvbmQpKTsKKyAgfQorCisgIC8vLyBFbXBsYWNlIGEgbmV3IGVsZW1lbnQgZm9yIHRoZSBzcGVjaWZpZWQga2V5IGludG8gdGhlIG1hcCBpZiB0aGUga2V5IGlzbid0CisgIC8vLyBhbHJlYWR5IGluIHRoZSBtYXAuIFRoZSBib29sIGNvbXBvbmVudCBvZiB0aGUgcmV0dXJuZWQgcGFpciBpcyB0cnVlCisgIC8vLyBpZiBhbmQgb25seSBpZiB0aGUgaW5zZXJ0aW9uIHRha2VzIHBsYWNlLCBhbmQgdGhlIGl0ZXJhdG9yIGNvbXBvbmVudCBvZgorICAvLy8gdGhlIHBhaXIgcG9pbnRzIHRvIHRoZSBlbGVtZW50IHdpdGgga2V5IGVxdWl2YWxlbnQgdG8gdGhlIGtleSBvZiB0aGUgcGFpci4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3NUeT4KKyAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiB0cnlfZW1wbGFjZShTdHJpbmdSZWYgS2V5LCBBcmdzVHkgJiYuLi4gQXJncykgeworICAgIHVuc2lnbmVkIEJ1Y2tldE5vID0gTG9va3VwQnVja2V0Rm9yKEtleSk7CisgICAgU3RyaW5nTWFwRW50cnlCYXNlIComQnVja2V0ID0gVGhlVGFibGVbQnVja2V0Tm9dOworICAgIGlmIChCdWNrZXQgJiYgQnVja2V0ICE9IGdldFRvbWJzdG9uZVZhbCgpKQorICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKFRoZVRhYmxlICsgQnVja2V0Tm8sIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7IC8vIEFscmVhZHkgZXhpc3RzIGluIG1hcC4KKworICAgIGlmIChCdWNrZXQgPT0gZ2V0VG9tYnN0b25lVmFsKCkpCisgICAgICAtLU51bVRvbWJzdG9uZXM7CisgICAgQnVja2V0ID0gTWFwRW50cnlUeTo6Q3JlYXRlKEtleSwgQWxsb2NhdG9yLCBzdGQ6OmZvcndhcmQ8QXJnc1R5PihBcmdzKS4uLik7CisgICAgKytOdW1JdGVtczsKKyAgICBhc3NlcnQoTnVtSXRlbXMgKyBOdW1Ub21ic3RvbmVzIDw9IE51bUJ1Y2tldHMpOworCisgICAgQnVja2V0Tm8gPSBSZWhhc2hUYWJsZShCdWNrZXRObyk7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKFRoZVRhYmxlICsgQnVja2V0Tm8sIGZhbHNlKSwgdHJ1ZSk7CisgIH0KKworICAvLyBjbGVhciAtIEVtcHRpZXMgb3V0IHRoZSBTdHJpbmdNYXAKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBpZiAoZW1wdHkoKSkgcmV0dXJuOworCisgICAgLy8gWmFwIGFsbCB2YWx1ZXMsIHJlc2V0dGluZyB0aGUga2V5cyBiYWNrIHRvIG5vbi1wcmVzZW50IChub3QgdG9tYnN0b25lKSwKKyAgICAvLyB3aGljaCBpcyBzYWZlIGJlY2F1c2Ugd2UncmUgcmVtb3ZpbmcgYWxsIGVsZW1lbnRzLgorICAgIGZvciAodW5zaWduZWQgSSA9IDAsIEUgPSBOdW1CdWNrZXRzOyBJICE9IEU7ICsrSSkgeworICAgICAgU3RyaW5nTWFwRW50cnlCYXNlIComQnVja2V0ID0gVGhlVGFibGVbSV07CisgICAgICBpZiAoQnVja2V0ICYmIEJ1Y2tldCAhPSBnZXRUb21ic3RvbmVWYWwoKSkgeworICAgICAgICBzdGF0aWNfY2FzdDxNYXBFbnRyeVR5Kj4oQnVja2V0KS0+RGVzdHJveShBbGxvY2F0b3IpOworICAgICAgfQorICAgICAgQnVja2V0ID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICBOdW1JdGVtcyA9IDA7CisgICAgTnVtVG9tYnN0b25lcyA9IDA7CisgIH0KKworICAvLy8gcmVtb3ZlIC0gUmVtb3ZlIHRoZSBzcGVjaWZpZWQga2V5L3ZhbHVlIHBhaXIgZnJvbSB0aGUgbWFwLCBidXQgZG8gbm90CisgIC8vLyBlcmFzZSBpdC4gIFRoaXMgYWJvcnRzIGlmIHRoZSBrZXkgaXMgbm90IGluIHRoZSBtYXAuCisgIHZvaWQgcmVtb3ZlKE1hcEVudHJ5VHkgKktleVZhbHVlKSB7CisgICAgUmVtb3ZlS2V5KEtleVZhbHVlKTsKKyAgfQorCisgIHZvaWQgZXJhc2UoaXRlcmF0b3IgSSkgeworICAgIE1hcEVudHJ5VHkgJlYgPSAqSTsKKyAgICByZW1vdmUoJlYpOworICAgIFYuRGVzdHJveShBbGxvY2F0b3IpOworICB9CisKKyAgYm9vbCBlcmFzZShTdHJpbmdSZWYgS2V5KSB7CisgICAgaXRlcmF0b3IgSSA9IGZpbmQoS2V5KTsKKyAgICBpZiAoSSA9PSBlbmQoKSkgcmV0dXJuIGZhbHNlOworICAgIGVyYXNlKEkpOworICAgIHJldHVybiB0cnVlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZFR5LCB0eXBlbmFtZSBWYWx1ZVR5PgorY2xhc3MgU3RyaW5nTWFwSXRlckJhc2UKKyAgICA6IHB1YmxpYyBpdGVyYXRvcl9mYWNhZGVfYmFzZTxEZXJpdmVkVHksIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVUeT4geworcHJvdGVjdGVkOgorICBTdHJpbmdNYXBFbnRyeUJhc2UgKipQdHIgPSBudWxscHRyOworCitwdWJsaWM6CisgIFN0cmluZ01hcEl0ZXJCYXNlKCkgPSBkZWZhdWx0OworCisgIGV4cGxpY2l0IFN0cmluZ01hcEl0ZXJCYXNlKFN0cmluZ01hcEVudHJ5QmFzZSAqKkJ1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb0FkdmFuY2UgPSBmYWxzZSkKKyAgICAgIDogUHRyKEJ1Y2tldCkgeworICAgIGlmICghTm9BZHZhbmNlKSBBZHZhbmNlUGFzdEVtcHR5QnVja2V0cygpOworICB9CisKKyAgRGVyaXZlZFR5ICZvcGVyYXRvcj0oY29uc3QgRGVyaXZlZFR5ICZPdGhlcikgeworICAgIFB0ciA9IE90aGVyLlB0cjsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RGVyaXZlZFR5ICY+KCp0aGlzKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEZXJpdmVkVHkgJlJIUykgY29uc3QgeyByZXR1cm4gUHRyID09IFJIUy5QdHI7IH0KKworICBEZXJpdmVkVHkgJm9wZXJhdG9yKysoKSB7IC8vIFByZWluY3JlbWVudAorICAgICsrUHRyOworICAgIEFkdmFuY2VQYXN0RW1wdHlCdWNrZXRzKCk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PERlcml2ZWRUeSAmPigqdGhpcyk7CisgIH0KKworICBEZXJpdmVkVHkgb3BlcmF0b3IrKyhpbnQpIHsgLy8gUG9zdC1pbmNyZW1lbnQKKyAgICBEZXJpdmVkVHkgVG1wKFB0cik7CisgICAgKysqdGhpczsKKyAgICByZXR1cm4gVG1wOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgQWR2YW5jZVBhc3RFbXB0eUJ1Y2tldHMoKSB7CisgICAgd2hpbGUgKCpQdHIgPT0gbnVsbHB0ciB8fCAqUHRyID09IFN0cmluZ01hcEltcGw6OmdldFRvbWJzdG9uZVZhbCgpKQorICAgICAgKytQdHI7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVR5PgorY2xhc3MgU3RyaW5nTWFwQ29uc3RJdGVyYXRvcgorICAgIDogcHVibGljIFN0cmluZ01hcEl0ZXJCYXNlPFN0cmluZ01hcENvbnN0SXRlcmF0b3I8VmFsdWVUeT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nTWFwRW50cnk8VmFsdWVUeT4+IHsKKyAgdXNpbmcgYmFzZSA9IFN0cmluZ01hcEl0ZXJCYXNlPFN0cmluZ01hcENvbnN0SXRlcmF0b3I8VmFsdWVUeT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdNYXBFbnRyeTxWYWx1ZVR5Pj47CisKK3B1YmxpYzoKKyAgU3RyaW5nTWFwQ29uc3RJdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgU3RyaW5nTWFwQ29uc3RJdGVyYXRvcihTdHJpbmdNYXBFbnRyeUJhc2UgKipCdWNrZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb0FkdmFuY2UgPSBmYWxzZSkKKyAgICAgIDogYmFzZShCdWNrZXQsIE5vQWR2YW5jZSkge30KKworICBjb25zdCBTdHJpbmdNYXBFbnRyeTxWYWx1ZVR5PiAmb3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgU3RyaW5nTWFwRW50cnk8VmFsdWVUeT4gKj4oKnRoaXMtPlB0cik7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVR5PgorY2xhc3MgU3RyaW5nTWFwSXRlcmF0b3IgOiBwdWJsaWMgU3RyaW5nTWFwSXRlckJhc2U8U3RyaW5nTWFwSXRlcmF0b3I8VmFsdWVUeT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdNYXBFbnRyeTxWYWx1ZVR5Pj4geworICB1c2luZyBiYXNlID0KKyAgICAgIFN0cmluZ01hcEl0ZXJCYXNlPFN0cmluZ01hcEl0ZXJhdG9yPFZhbHVlVHk+LCBTdHJpbmdNYXBFbnRyeTxWYWx1ZVR5Pj47CisKK3B1YmxpYzoKKyAgU3RyaW5nTWFwSXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IFN0cmluZ01hcEl0ZXJhdG9yKFN0cmluZ01hcEVudHJ5QmFzZSAqKkJ1Y2tldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb0FkdmFuY2UgPSBmYWxzZSkKKyAgICAgIDogYmFzZShCdWNrZXQsIE5vQWR2YW5jZSkge30KKworICBTdHJpbmdNYXBFbnRyeTxWYWx1ZVR5PiAmb3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8U3RyaW5nTWFwRW50cnk8VmFsdWVUeT4gKj4oKnRoaXMtPlB0cik7CisgIH0KKworICBvcGVyYXRvciBTdHJpbmdNYXBDb25zdEl0ZXJhdG9yPFZhbHVlVHk+KCkgY29uc3QgeworICAgIHJldHVybiBTdHJpbmdNYXBDb25zdEl0ZXJhdG9yPFZhbHVlVHk+KHRoaXMtPlB0ciwgdHJ1ZSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVR5PgorY2xhc3MgU3RyaW5nTWFwS2V5SXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U8U3RyaW5nTWFwS2V5SXRlcmF0b3I8VmFsdWVUeT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ01hcENvbnN0SXRlcmF0b3I8VmFsdWVUeT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIFN0cmluZ1JlZj4geworICB1c2luZyBiYXNlID0gaXRlcmF0b3JfYWRhcHRvcl9iYXNlPFN0cmluZ01hcEtleUl0ZXJhdG9yPFZhbHVlVHk+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ01hcENvbnN0SXRlcmF0b3I8VmFsdWVUeT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgU3RyaW5nUmVmPjsKKworcHVibGljOgorICBTdHJpbmdNYXBLZXlJdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgU3RyaW5nTWFwS2V5SXRlcmF0b3IoU3RyaW5nTWFwQ29uc3RJdGVyYXRvcjxWYWx1ZVR5PiBJdGVyKQorICAgICAgOiBiYXNlKHN0ZDo6bW92ZShJdGVyKSkge30KKworICBTdHJpbmdSZWYgJm9wZXJhdG9yKigpIHsKKyAgICBLZXkgPSB0aGlzLT53cmFwcGVkKCktPmdldEtleSgpOworICAgIHJldHVybiBLZXk7CisgIH0KKworcHJpdmF0ZToKKyAgU3RyaW5nUmVmIEtleTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9TVFJJTkdNQVBfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nUmVmLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TdHJpbmdSZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDI0MTdhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nUmVmLmgKQEAgLTAsMCArMSw5MjUgQEAKKy8vPT09LSBTdHJpbmdSZWYuaCAtIENvbnN0YW50IFN0cmluZyBSZWZlcmVuY2UgV3JhcHBlciAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU1RSSU5HUkVGX0gKKyNkZWZpbmUgTExWTV9BRFRfU1RSSU5HUkVGX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCisgIGNsYXNzIEFQSW50OworICBjbGFzcyBoYXNoX2NvZGU7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBTbWFsbFZlY3RvckltcGw7CisgIGNsYXNzIFN0cmluZ1JlZjsKKworICAvLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgU3RyaW5nUmVmOjpnZXRBc0ludGVnZXIuCisgIGJvb2wgZ2V0QXNVbnNpZ25lZEludGVnZXIoU3RyaW5nUmVmIFN0ciwgdW5zaWduZWQgUmFkaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nICZSZXN1bHQpOworCisgIGJvb2wgZ2V0QXNTaWduZWRJbnRlZ2VyKFN0cmluZ1JlZiBTdHIsIHVuc2lnbmVkIFJhZGl4LCBsb25nIGxvbmcgJlJlc3VsdCk7CisKKyAgYm9vbCBjb25zdW1lVW5zaWduZWRJbnRlZ2VyKFN0cmluZ1JlZiAmU3RyLCB1bnNpZ25lZCBSYWRpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAmUmVzdWx0KTsKKyAgYm9vbCBjb25zdW1lU2lnbmVkSW50ZWdlcihTdHJpbmdSZWYgJlN0ciwgdW5zaWduZWQgUmFkaXgsIGxvbmcgbG9uZyAmUmVzdWx0KTsKKworICAvLy8gU3RyaW5nUmVmIC0gUmVwcmVzZW50IGEgY29uc3RhbnQgcmVmZXJlbmNlIHRvIGEgc3RyaW5nLCBpLmUuIGEgY2hhcmFjdGVyCisgIC8vLyBhcnJheSBhbmQgYSBsZW5ndGgsIHdoaWNoIG5lZWQgbm90IGJlIG51bGwgdGVybWluYXRlZC4KKyAgLy8vCisgIC8vLyBUaGlzIGNsYXNzIGRvZXMgbm90IG93biB0aGUgc3RyaW5nIGRhdGEsIGl0IGlzIGV4cGVjdGVkIHRvIGJlIHVzZWQgaW4KKyAgLy8vIHNpdHVhdGlvbnMgd2hlcmUgdGhlIGNoYXJhY3RlciBkYXRhIHJlc2lkZXMgaW4gc29tZSBvdGhlciBidWZmZXIsIHdob3NlCisgIC8vLyBsaWZldGltZSBleHRlbmRzIHBhc3QgdGhhdCBvZiB0aGUgU3RyaW5nUmVmLiBGb3IgdGhpcyByZWFzb24sIGl0IGlzIG5vdCBpbgorICAvLy8gZ2VuZXJhbCBzYWZlIHRvIHN0b3JlIGEgU3RyaW5nUmVmLgorICBjbGFzcyBTdHJpbmdSZWYgeworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBucG9zID0gfnNpemVfdCgwKTsKKworICAgIHVzaW5nIGl0ZXJhdG9yID0gY29uc3QgY2hhciAqOworICAgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gY29uc3QgY2hhciAqOworICAgIHVzaW5nIHNpemVfdHlwZSA9IHNpemVfdDsKKworICBwcml2YXRlOgorICAgIC8vLyBUaGUgc3RhcnQgb2YgdGhlIHN0cmluZywgaW4gYW4gZXh0ZXJuYWwgYnVmZmVyLgorICAgIGNvbnN0IGNoYXIgKkRhdGEgPSBudWxscHRyOworCisgICAgLy8vIFRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4KKyAgICBzaXplX3QgTGVuZ3RoID0gMDsKKworICAgIC8vIFdvcmthcm91bmQgbWVtY21wIGlzc3VlIHdpdGggbnVsbCBwb2ludGVycyAodW5kZWZpbmVkIGJlaGF2aW9yKQorICAgIC8vIGJ5IHByb3ZpZGluZyBhIHNwZWNpYWxpemVkIHZlcnNpb24KKyAgICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgICAgc3RhdGljIGludCBjb21wYXJlTWVtb3J5KGNvbnN0IGNoYXIgKkxocywgY29uc3QgY2hhciAqUmhzLCBzaXplX3QgTGVuZ3RoKSB7CisgICAgICBpZiAoTGVuZ3RoID09IDApIHsgcmV0dXJuIDA7IH0KKyAgICAgIHJldHVybiA6Om1lbWNtcChMaHMsUmhzLExlbmd0aCk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICAvLy8gQG5hbWUgQ29uc3RydWN0b3JzCisgICAgLy8vIEB7CisKKyAgICAvLy8gQ29uc3RydWN0IGFuIGVtcHR5IHN0cmluZyByZWYuCisgICAgLyppbXBsaWNpdCovIFN0cmluZ1JlZigpID0gZGVmYXVsdDsKKworICAgIC8vLyBEaXNhYmxlIGNvbnZlcnNpb24gZnJvbSBudWxscHRyLiAgVGhpcyBwcmV2ZW50cyB0aGluZ3MgbGlrZQorICAgIC8vLyBpZiAoUyA9PSBudWxscHRyKQorICAgIFN0cmluZ1JlZihzdGQ6Om51bGxwdHJfdCkgPSBkZWxldGU7CisKKyAgICAvLy8gQ29uc3RydWN0IGEgc3RyaW5nIHJlZiBmcm9tIGEgY3N0cmluZy4KKyAgICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgICAgLyppbXBsaWNpdCovIFN0cmluZ1JlZihjb25zdCBjaGFyICpTdHIpCisgICAgICAgIDogRGF0YShTdHIpLCBMZW5ndGgoU3RyID8gOjpzdHJsZW4oU3RyKSA6IDApIHt9CisKKyAgICAvLy8gQ29uc3RydWN0IGEgc3RyaW5nIHJlZiBmcm9tIGEgcG9pbnRlciBhbmQgbGVuZ3RoLgorICAgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgICAvKmltcGxpY2l0Ki8gY29uc3RleHByIFN0cmluZ1JlZihjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKQorICAgICAgICA6IERhdGEoZGF0YSksIExlbmd0aChsZW5ndGgpIHt9CisKKyAgICAvLy8gQ29uc3RydWN0IGEgc3RyaW5nIHJlZiBmcm9tIGFuIHN0ZDo6c3RyaW5nLgorICAgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgICAvKmltcGxpY2l0Ki8gU3RyaW5nUmVmKGNvbnN0IHN0ZDo6c3RyaW5nICZTdHIpCisgICAgICA6IERhdGEoU3RyLmRhdGEoKSksIExlbmd0aChTdHIubGVuZ3RoKCkpIHt9CisKKyAgICBzdGF0aWMgU3RyaW5nUmVmIHdpdGhOdWxsQXNFbXB0eShjb25zdCBjaGFyICpkYXRhKSB7CisgICAgICByZXR1cm4gU3RyaW5nUmVmKGRhdGEgPyBkYXRhIDogIiIpOworICAgIH0KKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBJdGVyYXRvcnMKKyAgICAvLy8gQHsKKworICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gRGF0YTsgfQorCisgICAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gRGF0YSArIExlbmd0aDsgfQorCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXNfYmVnaW4oKSBjb25zdCB7CisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyICo+KGJlZ2luKCkpOworICAgIH0KKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpieXRlc19lbmQoKSBjb25zdCB7CisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyICo+KGVuZCgpKTsKKyAgICB9CisgICAgaXRlcmF0b3JfcmFuZ2U8Y29uc3QgdW5zaWduZWQgY2hhciAqPiBieXRlcygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBtYWtlX3JhbmdlKGJ5dGVzX2JlZ2luKCksIGJ5dGVzX2VuZCgpKTsKKyAgICB9CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgU3RyaW5nIE9wZXJhdGlvbnMKKyAgICAvLy8gQHsKKworICAgIC8vLyBkYXRhIC0gR2V0IGEgcG9pbnRlciB0byB0aGUgc3RhcnQgb2YgdGhlIHN0cmluZyAod2hpY2ggbWF5IG5vdCBiZSBudWxsCisgICAgLy8vIHRlcm1pbmF0ZWQpLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIGNvbnN0IGNoYXIgKmRhdGEoKSBjb25zdCB7IHJldHVybiBEYXRhOyB9CisKKyAgICAvLy8gZW1wdHkgLSBDaGVjayBpZiB0aGUgc3RyaW5nIGlzIGVtcHR5LgorICAgIExMVk1fTk9ESVNDQVJECisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBMZW5ndGggPT0gMDsgfQorCisgICAgLy8vIHNpemUgLSBHZXQgdGhlIHN0cmluZyBzaXplLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gTGVuZ3RoOyB9CisKKyAgICAvLy8gZnJvbnQgLSBHZXQgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgY2hhciBmcm9udCgpIGNvbnN0IHsKKyAgICAgIGFzc2VydCghZW1wdHkoKSk7CisgICAgICByZXR1cm4gRGF0YVswXTsKKyAgICB9CisKKyAgICAvLy8gYmFjayAtIEdldCB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZy4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIGNoYXIgYmFjaygpIGNvbnN0IHsKKyAgICAgIGFzc2VydCghZW1wdHkoKSk7CisgICAgICByZXR1cm4gRGF0YVtMZW5ndGgtMV07CisgICAgfQorCisgICAgLy8gY29weSAtIEFsbG9jYXRlIGNvcHkgaW4gQWxsb2NhdG9yIGFuZCByZXR1cm4gU3RyaW5nUmVmIHRvIGl0LgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBBbGxvY2F0b3I+CisgICAgTExWTV9OT0RJU0NBUkQgU3RyaW5nUmVmIGNvcHkoQWxsb2NhdG9yICZBKSBjb25zdCB7CisgICAgICAvLyBEb24ndCByZXF1ZXN0IGEgbGVuZ3RoIDAgY29weSBmcm9tIHRoZSBhbGxvY2F0b3IuCisgICAgICBpZiAoZW1wdHkoKSkKKyAgICAgICAgcmV0dXJuIFN0cmluZ1JlZigpOworICAgICAgY2hhciAqUyA9IEEudGVtcGxhdGUgQWxsb2NhdGU8Y2hhcj4oTGVuZ3RoKTsKKyAgICAgIHN0ZDo6Y29weShiZWdpbigpLCBlbmQoKSwgUyk7CisgICAgICByZXR1cm4gU3RyaW5nUmVmKFMsIExlbmd0aCk7CisgICAgfQorCisgICAgLy8vIGVxdWFscyAtIENoZWNrIGZvciBzdHJpbmcgZXF1YWxpdHksIHRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbgorICAgIC8vLyBjb21wYXJlKCkgd2hlbiB0aGUgcmVsYXRpdmUgb3JkZXJpbmcgb2YgaW5lcXVhbCBzdHJpbmdzIGlzbid0IG5lZWRlZC4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgICBib29sIGVxdWFscyhTdHJpbmdSZWYgUkhTKSBjb25zdCB7CisgICAgICByZXR1cm4gKExlbmd0aCA9PSBSSFMuTGVuZ3RoICYmCisgICAgICAgICAgICAgIGNvbXBhcmVNZW1vcnkoRGF0YSwgUkhTLkRhdGEsIFJIUy5MZW5ndGgpID09IDApOworICAgIH0KKworICAgIC8vLyBlcXVhbHNfbG93ZXIgLSBDaGVjayBmb3Igc3RyaW5nIGVxdWFsaXR5LCBpZ25vcmluZyBjYXNlLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgYm9vbCBlcXVhbHNfbG93ZXIoU3RyaW5nUmVmIFJIUykgY29uc3QgeworICAgICAgcmV0dXJuIExlbmd0aCA9PSBSSFMuTGVuZ3RoICYmIGNvbXBhcmVfbG93ZXIoUkhTKSA9PSAwOworICAgIH0KKworICAgIC8vLyBjb21wYXJlIC0gQ29tcGFyZSB0d28gc3RyaW5nczsgdGhlIHJlc3VsdCBpcyAtMSwgMCwgb3IgMSBpZiB0aGlzIHN0cmluZworICAgIC8vLyBpcyBsZXhpY29ncmFwaGljYWxseSBsZXNzIHRoYW4sIGVxdWFsIHRvLCBvciBncmVhdGVyIHRoYW4gdGhlIFxwIFJIUy4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgICBpbnQgY29tcGFyZShTdHJpbmdSZWYgUkhTKSBjb25zdCB7CisgICAgICAvLyBDaGVjayB0aGUgcHJlZml4IGZvciBhIG1pc21hdGNoLgorICAgICAgaWYgKGludCBSZXMgPSBjb21wYXJlTWVtb3J5KERhdGEsIFJIUy5EYXRhLCBzdGQ6Om1pbihMZW5ndGgsIFJIUy5MZW5ndGgpKSkKKyAgICAgICAgcmV0dXJuIFJlcyA8IDAgPyAtMSA6IDE7CisKKyAgICAgIC8vIE90aGVyd2lzZSB0aGUgcHJlZml4ZXMgbWF0Y2gsIHNvIHdlIG9ubHkgbmVlZCB0byBjaGVjayB0aGUgbGVuZ3Rocy4KKyAgICAgIGlmIChMZW5ndGggPT0gUkhTLkxlbmd0aCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgICByZXR1cm4gTGVuZ3RoIDwgUkhTLkxlbmd0aCA/IC0xIDogMTsKKyAgICB9CisKKyAgICAvLy8gY29tcGFyZV9sb3dlciAtIENvbXBhcmUgdHdvIHN0cmluZ3MsIGlnbm9yaW5nIGNhc2UuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBpbnQgY29tcGFyZV9sb3dlcihTdHJpbmdSZWYgUkhTKSBjb25zdDsKKworICAgIC8vLyBjb21wYXJlX251bWVyaWMgLSBDb21wYXJlIHR3byBzdHJpbmdzLCB0cmVhdGluZyBzZXF1ZW5jZXMgb2YgZGlnaXRzIGFzCisgICAgLy8vIG51bWJlcnMuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBpbnQgY29tcGFyZV9udW1lcmljKFN0cmluZ1JlZiBSSFMpIGNvbnN0OworCisgICAgLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIGVkaXQgZGlzdGFuY2UgYmV0d2VlbiB0aGlzIHN0cmluZyBhbmQgYW5vdGhlcgorICAgIC8vLyBzdHJpbmcuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBPdGhlciB0aGUgc3RyaW5nIHRvIGNvbXBhcmUgdGhpcyBzdHJpbmcgYWdhaW5zdC4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIEFsbG93UmVwbGFjZW1lbnRzIHdoZXRoZXIgdG8gYWxsb3cgY2hhcmFjdGVyCisgICAgLy8vIHJlcGxhY2VtZW50cyAoY2hhbmdlIG9uZSBjaGFyYWN0ZXIgaW50byBhbm90aGVyKSBhcyBhIHNpbmdsZQorICAgIC8vLyBvcGVyYXRpb24sIHJhdGhlciB0aGFuIGFzIHR3byBvcGVyYXRpb25zIChhbiBpbnNlcnRpb24gYW5kIGEKKyAgICAvLy8gcmVtb3ZhbCkuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBNYXhFZGl0RGlzdGFuY2UgSWYgbm9uLXplcm8sIHRoZSBtYXhpbXVtIGVkaXQgZGlzdGFuY2UgdGhhdAorICAgIC8vLyB0aGlzIHJvdXRpbmUgaXMgYWxsb3dlZCB0byBjb21wdXRlLiBJZiB0aGUgZWRpdCBkaXN0YW5jZSB3aWxsIGV4Y2VlZAorICAgIC8vLyB0aGF0IG1heGltdW0sIHJldHVybnMgXGMgTWF4RWRpdERpc3RhbmNlKzEuCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiBjaGFyYWN0ZXIgaW5zZXJ0aW9ucywgcmVtb3ZhbHMsCisgICAgLy8vIG9yIChpZiBccCBBbGxvd1JlcGxhY2VtZW50cyBpcyBcYyB0cnVlKSByZXBsYWNlbWVudHMgbmVlZGVkIHRvCisgICAgLy8vIHRyYW5zZm9ybSBvbmUgb2YgdGhlIGdpdmVuIHN0cmluZ3MgaW50byB0aGUgb3RoZXIuIElmIHplcm8sCisgICAgLy8vIHRoZSBzdHJpbmdzIGFyZSBpZGVudGljYWwuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICB1bnNpZ25lZCBlZGl0X2Rpc3RhbmNlKFN0cmluZ1JlZiBPdGhlciwgYm9vbCBBbGxvd1JlcGxhY2VtZW50cyA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNYXhFZGl0RGlzdGFuY2UgPSAwKSBjb25zdDsKKworICAgIC8vLyBzdHIgLSBHZXQgdGhlIGNvbnRlbnRzIGFzIGFuIHN0ZDo6c3RyaW5nLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgc3RkOjpzdHJpbmcgc3RyKCkgY29uc3QgeworICAgICAgaWYgKCFEYXRhKSByZXR1cm4gc3RkOjpzdHJpbmcoKTsKKyAgICAgIHJldHVybiBzdGQ6OnN0cmluZyhEYXRhLCBMZW5ndGgpOworICAgIH0KKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBPcGVyYXRvciBPdmVybG9hZHMKKyAgICAvLy8gQHsKKworICAgIExMVk1fTk9ESVNDQVJECisgICAgY2hhciBvcGVyYXRvcltdKHNpemVfdCBJbmRleCkgY29uc3QgeworICAgICAgYXNzZXJ0KEluZGV4IDwgTGVuZ3RoICYmICJJbnZhbGlkIGluZGV4ISIpOworICAgICAgcmV0dXJuIERhdGFbSW5kZXhdOworICAgIH0KKworICAgIC8vLyBEaXNhbGxvdyBhY2NpZGVudGFsIGFzc2lnbm1lbnQgZnJvbSBhIHRlbXBvcmFyeSBzdGQ6OnN0cmluZy4KKyAgICAvLy8KKyAgICAvLy8gVGhlIGRlY2xhcmF0aW9uIGhlcmUgaXMgZXh0cmEgY29tcGxpY2F0ZWQgc28gdGhhdCBgc3RyaW5nUmVmID0ge31gCisgICAgLy8vIGFuZCBgc3RyaW5nUmVmID0gImFiYyJgIGNvbnRpbnVlIHRvIHNlbGVjdCB0aGUgbW92ZSBhc3NpZ25tZW50IG9wZXJhdG9yLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfc2FtZTxULCBzdGQ6OnN0cmluZz46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZj46OnR5cGUgJgorICAgIG9wZXJhdG9yPShUICYmU3RyKSA9IGRlbGV0ZTsKKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBUeXBlIENvbnZlcnNpb25zCisgICAgLy8vIEB7CisKKyAgICBvcGVyYXRvciBzdGQ6OnN0cmluZygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdHIoKTsKKyAgICB9CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgU3RyaW5nIFByZWRpY2F0ZXMKKyAgICAvLy8gQHsKKworICAgIC8vLyBDaGVjayBpZiB0aGlzIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gXHAgUHJlZml4LgorICAgIExMVk1fTk9ESVNDQVJECisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIGJvb2wgc3RhcnRzd2l0aChTdHJpbmdSZWYgUHJlZml4KSBjb25zdCB7CisgICAgICByZXR1cm4gTGVuZ3RoID49IFByZWZpeC5MZW5ndGggJiYKKyAgICAgICAgICAgICBjb21wYXJlTWVtb3J5KERhdGEsIFByZWZpeC5EYXRhLCBQcmVmaXguTGVuZ3RoKSA9PSAwOworICAgIH0KKworICAgIC8vLyBDaGVjayBpZiB0aGlzIHN0cmluZyBzdGFydHMgd2l0aCB0aGUgZ2l2ZW4gXHAgUHJlZml4LCBpZ25vcmluZyBjYXNlLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgYm9vbCBzdGFydHN3aXRoX2xvd2VyKFN0cmluZ1JlZiBQcmVmaXgpIGNvbnN0OworCisgICAgLy8vIENoZWNrIGlmIHRoaXMgc3RyaW5nIGVuZHMgd2l0aCB0aGUgZ2l2ZW4gXHAgU3VmZml4LgorICAgIExMVk1fTk9ESVNDQVJECisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIGJvb2wgZW5kc3dpdGgoU3RyaW5nUmVmIFN1ZmZpeCkgY29uc3QgeworICAgICAgcmV0dXJuIExlbmd0aCA+PSBTdWZmaXguTGVuZ3RoICYmCisgICAgICAgIGNvbXBhcmVNZW1vcnkoZW5kKCkgLSBTdWZmaXguTGVuZ3RoLCBTdWZmaXguRGF0YSwgU3VmZml4Lkxlbmd0aCkgPT0gMDsKKyAgICB9CisKKyAgICAvLy8gQ2hlY2sgaWYgdGhpcyBzdHJpbmcgZW5kcyB3aXRoIHRoZSBnaXZlbiBccCBTdWZmaXgsIGlnbm9yaW5nIGNhc2UuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBib29sIGVuZHN3aXRoX2xvd2VyKFN0cmluZ1JlZiBTdWZmaXgpIGNvbnN0OworCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIFN0cmluZyBTZWFyY2hpbmcKKyAgICAvLy8gQHsKKworICAgIC8vLyBTZWFyY2ggZm9yIHRoZSBmaXJzdCBjaGFyYWN0ZXIgXHAgQyBpbiB0aGUgc3RyaW5nLgorICAgIC8vLworICAgIC8vLyBccmV0dXJucyBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgXHAgQywgb3IgbnBvcyBpZiBub3QKKyAgICAvLy8gZm91bmQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgICAgc2l6ZV90IGZpbmQoY2hhciBDLCBzaXplX3QgRnJvbSA9IDApIGNvbnN0IHsKKyAgICAgIHNpemVfdCBGaW5kQmVnaW4gPSBzdGQ6Om1pbihGcm9tLCBMZW5ndGgpOworICAgICAgaWYgKEZpbmRCZWdpbiA8IExlbmd0aCkgeyAvLyBBdm9pZCBjYWxsaW5nIG1lbWNociB3aXRoIG51bGxwdHIuCisgICAgICAgIC8vIEp1c3QgZm9yd2FyZCB0byBtZW1jaHIsIHdoaWNoIGlzIGZhc3RlciB0aGFuIGEgaGFuZC1yb2xsZWQgbG9vcC4KKyAgICAgICAgaWYgKGNvbnN0IHZvaWQgKlAgPSA6Om1lbWNocihEYXRhICsgRmluZEJlZ2luLCBDLCBMZW5ndGggLSBGaW5kQmVnaW4pKQorICAgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBjaGFyICo+KFApIC0gRGF0YTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICAgIC8vLyBTZWFyY2ggZm9yIHRoZSBmaXJzdCBjaGFyYWN0ZXIgXHAgQyBpbiB0aGUgc3RyaW5nLCBpZ25vcmluZyBjYXNlLgorICAgIC8vLworICAgIC8vLyBccmV0dXJucyBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgXHAgQywgb3IgbnBvcyBpZiBub3QKKyAgICAvLy8gZm91bmQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBzaXplX3QgZmluZF9sb3dlcihjaGFyIEMsIHNpemVfdCBGcm9tID0gMCkgY29uc3Q7CisKKyAgICAvLy8gU2VhcmNoIGZvciB0aGUgZmlyc3QgY2hhcmFjdGVyIHNhdGlzZnlpbmcgdGhlIHByZWRpY2F0ZSBccCBGCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm5zIFRoZSBpbmRleCBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIHNhdGlzZnlpbmcgXHAgRiBzdGFydGluZyBmcm9tCisgICAgLy8vIFxwIEZyb20sIG9yIG5wb3MgaWYgbm90IGZvdW5kLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIHNpemVfdCBmaW5kX2lmKGZ1bmN0aW9uX3JlZjxib29sKGNoYXIpPiBGLCBzaXplX3QgRnJvbSA9IDApIGNvbnN0IHsKKyAgICAgIFN0cmluZ1JlZiBTID0gZHJvcF9mcm9udChGcm9tKTsKKyAgICAgIHdoaWxlICghUy5lbXB0eSgpKSB7CisgICAgICAgIGlmIChGKFMuZnJvbnQoKSkpCisgICAgICAgICAgcmV0dXJuIHNpemUoKSAtIFMuc2l6ZSgpOworICAgICAgICBTID0gUy5kcm9wX2Zyb250KCk7CisgICAgICB9CisgICAgICByZXR1cm4gbnBvczsKKyAgICB9CisKKyAgICAvLy8gU2VhcmNoIGZvciB0aGUgZmlyc3QgY2hhcmFjdGVyIG5vdCBzYXRpc2Z5aW5nIHRoZSBwcmVkaWNhdGUgXHAgRgorICAgIC8vLworICAgIC8vLyBccmV0dXJucyBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IGNoYXJhY3RlciBub3Qgc2F0aXNmeWluZyBccCBGIHN0YXJ0aW5nCisgICAgLy8vIGZyb20gXHAgRnJvbSwgb3IgbnBvcyBpZiBub3QgZm91bmQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgICAgc2l6ZV90IGZpbmRfaWZfbm90KGZ1bmN0aW9uX3JlZjxib29sKGNoYXIpPiBGLCBzaXplX3QgRnJvbSA9IDApIGNvbnN0IHsKKyAgICAgIHJldHVybiBmaW5kX2lmKFtGXShjaGFyIGMpIHsgcmV0dXJuICFGKGMpOyB9LCBGcm9tKTsKKyAgICB9CisKKyAgICAvLy8gU2VhcmNoIGZvciB0aGUgZmlyc3Qgc3RyaW5nIFxwIFN0ciBpbiB0aGUgc3RyaW5nLgorICAgIC8vLworICAgIC8vLyBccmV0dXJucyBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgXHAgU3RyLCBvciBucG9zIGlmIG5vdAorICAgIC8vLyBmb3VuZC4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIHNpemVfdCBmaW5kKFN0cmluZ1JlZiBTdHIsIHNpemVfdCBGcm9tID0gMCkgY29uc3Q7CisKKyAgICAvLy8gU2VhcmNoIGZvciB0aGUgZmlyc3Qgc3RyaW5nIFxwIFN0ciBpbiB0aGUgc3RyaW5nLCBpZ25vcmluZyBjYXNlLgorICAgIC8vLworICAgIC8vLyBccmV0dXJucyBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgXHAgU3RyLCBvciBucG9zIGlmIG5vdAorICAgIC8vLyBmb3VuZC4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIHNpemVfdCBmaW5kX2xvd2VyKFN0cmluZ1JlZiBTdHIsIHNpemVfdCBGcm9tID0gMCkgY29uc3Q7CisKKyAgICAvLy8gU2VhcmNoIGZvciB0aGUgbGFzdCBjaGFyYWN0ZXIgXHAgQyBpbiB0aGUgc3RyaW5nLgorICAgIC8vLworICAgIC8vLyBccmV0dXJucyBUaGUgaW5kZXggb2YgdGhlIGxhc3Qgb2NjdXJyZW5jZSBvZiBccCBDLCBvciBucG9zIGlmIG5vdAorICAgIC8vLyBmb3VuZC4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIHNpemVfdCByZmluZChjaGFyIEMsIHNpemVfdCBGcm9tID0gbnBvcykgY29uc3QgeworICAgICAgRnJvbSA9IHN0ZDo6bWluKEZyb20sIExlbmd0aCk7CisgICAgICBzaXplX3QgaSA9IEZyb207CisgICAgICB3aGlsZSAoaSAhPSAwKSB7CisgICAgICAgIC0taTsKKyAgICAgICAgaWYgKERhdGFbaV0gPT0gQykKKyAgICAgICAgICByZXR1cm4gaTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBucG9zOworICAgIH0KKworICAgIC8vLyBTZWFyY2ggZm9yIHRoZSBsYXN0IGNoYXJhY3RlciBccCBDIGluIHRoZSBzdHJpbmcsIGlnbm9yaW5nIGNhc2UuCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm5zIFRoZSBpbmRleCBvZiB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIFxwIEMsIG9yIG5wb3MgaWYgbm90CisgICAgLy8vIGZvdW5kLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgc2l6ZV90IHJmaW5kX2xvd2VyKGNoYXIgQywgc2l6ZV90IEZyb20gPSBucG9zKSBjb25zdDsKKworICAgIC8vLyBTZWFyY2ggZm9yIHRoZSBsYXN0IHN0cmluZyBccCBTdHIgaW4gdGhlIHN0cmluZy4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybnMgVGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgXHAgU3RyLCBvciBucG9zIGlmIG5vdAorICAgIC8vLyBmb3VuZC4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIHNpemVfdCByZmluZChTdHJpbmdSZWYgU3RyKSBjb25zdDsKKworICAgIC8vLyBTZWFyY2ggZm9yIHRoZSBsYXN0IHN0cmluZyBccCBTdHIgaW4gdGhlIHN0cmluZywgaWdub3JpbmcgY2FzZS4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybnMgVGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VycmVuY2Ugb2YgXHAgU3RyLCBvciBucG9zIGlmIG5vdAorICAgIC8vLyBmb3VuZC4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIHNpemVfdCByZmluZF9sb3dlcihTdHJpbmdSZWYgU3RyKSBjb25zdDsKKworICAgIC8vLyBGaW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyB0aGF0IGlzIFxwIEMsIG9yIG5wb3MgaWYgbm90CisgICAgLy8vIGZvdW5kLiBTYW1lIGFzIGZpbmQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBzaXplX3QgZmluZF9maXJzdF9vZihjaGFyIEMsIHNpemVfdCBGcm9tID0gMCkgY29uc3QgeworICAgICAgcmV0dXJuIGZpbmQoQywgRnJvbSk7CisgICAgfQorCisgICAgLy8vIEZpbmQgdGhlIGZpcnN0IGNoYXJhY3RlciBpbiB0aGUgc3RyaW5nIHRoYXQgaXMgaW4gXHAgQ2hhcnMsIG9yIG5wb3MgaWYKKyAgICAvLy8gbm90IGZvdW5kLgorICAgIC8vLworICAgIC8vLyBDb21wbGV4aXR5OiBPKHNpemUoKSArIENoYXJzLnNpemUoKSkKKyAgICBMTFZNX05PRElTQ0FSRAorICAgIHNpemVfdCBmaW5kX2ZpcnN0X29mKFN0cmluZ1JlZiBDaGFycywgc2l6ZV90IEZyb20gPSAwKSBjb25zdDsKKworICAgIC8vLyBGaW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyB0aGF0IGlzIG5vdCBccCBDIG9yIG5wb3MgaWYgbm90CisgICAgLy8vIGZvdW5kLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgc2l6ZV90IGZpbmRfZmlyc3Rfbm90X29mKGNoYXIgQywgc2l6ZV90IEZyb20gPSAwKSBjb25zdDsKKworICAgIC8vLyBGaW5kIHRoZSBmaXJzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyB0aGF0IGlzIG5vdCBpbiB0aGUgc3RyaW5nCisgICAgLy8vIFxwIENoYXJzLCBvciBucG9zIGlmIG5vdCBmb3VuZC4KKyAgICAvLy8KKyAgICAvLy8gQ29tcGxleGl0eTogTyhzaXplKCkgKyBDaGFycy5zaXplKCkpCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBzaXplX3QgZmluZF9maXJzdF9ub3Rfb2YoU3RyaW5nUmVmIENoYXJzLCBzaXplX3QgRnJvbSA9IDApIGNvbnN0OworCisgICAgLy8vIEZpbmQgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBccCBDLCBvciBucG9zIGlmIG5vdAorICAgIC8vLyBmb3VuZC4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIHNpemVfdCBmaW5kX2xhc3Rfb2YoY2hhciBDLCBzaXplX3QgRnJvbSA9IG5wb3MpIGNvbnN0IHsKKyAgICAgIHJldHVybiByZmluZChDLCBGcm9tKTsKKyAgICB9CisKKyAgICAvLy8gRmluZCB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyB0aGF0IGlzIGluIFxwIEMsIG9yIG5wb3MgaWYgbm90CisgICAgLy8vIGZvdW5kLgorICAgIC8vLworICAgIC8vLyBDb21wbGV4aXR5OiBPKHNpemUoKSArIENoYXJzLnNpemUoKSkKKyAgICBMTFZNX05PRElTQ0FSRAorICAgIHNpemVfdCBmaW5kX2xhc3Rfb2YoU3RyaW5nUmVmIENoYXJzLCBzaXplX3QgRnJvbSA9IG5wb3MpIGNvbnN0OworCisgICAgLy8vIEZpbmQgdGhlIGxhc3QgY2hhcmFjdGVyIGluIHRoZSBzdHJpbmcgdGhhdCBpcyBub3QgXHAgQywgb3IgbnBvcyBpZiBub3QKKyAgICAvLy8gZm91bmQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBzaXplX3QgZmluZF9sYXN0X25vdF9vZihjaGFyIEMsIHNpemVfdCBGcm9tID0gbnBvcykgY29uc3Q7CisKKyAgICAvLy8gRmluZCB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlIHN0cmluZyB0aGF0IGlzIG5vdCBpbiBccCBDaGFycywgb3IKKyAgICAvLy8gbnBvcyBpZiBub3QgZm91bmQuCisgICAgLy8vCisgICAgLy8vIENvbXBsZXhpdHk6IE8oc2l6ZSgpICsgQ2hhcnMuc2l6ZSgpKQorICAgIExMVk1fTk9ESVNDQVJECisgICAgc2l6ZV90IGZpbmRfbGFzdF9ub3Rfb2YoU3RyaW5nUmVmIENoYXJzLCBzaXplX3QgRnJvbSA9IG5wb3MpIGNvbnN0OworCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBzdHJpbmcgaXMgYSBzdWJzdHJpbmcgb2YgKnRoaXMsIGFuZCBmYWxzZQorICAgIC8vLyBvdGhlcndpc2UuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgICAgYm9vbCBjb250YWlucyhTdHJpbmdSZWYgT3RoZXIpIGNvbnN0IHsgcmV0dXJuIGZpbmQoT3RoZXIpICE9IG5wb3M7IH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIGNvbnRhaW5lZCBpbiAqdGhpcywgYW5kIGZhbHNlCisgICAgLy8vIG90aGVyd2lzZS4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgICBib29sIGNvbnRhaW5zKGNoYXIgQykgY29uc3QgeyByZXR1cm4gZmluZF9maXJzdF9vZihDKSAhPSBucG9zOyB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHN0cmluZyBpcyBhIHN1YnN0cmluZyBvZiAqdGhpcywgYW5kIGZhbHNlCisgICAgLy8vIG90aGVyd2lzZS4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgICBib29sIGNvbnRhaW5zX2xvd2VyKFN0cmluZ1JlZiBPdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIGZpbmRfbG93ZXIoT3RoZXIpICE9IG5wb3M7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBjaGFyYWN0ZXIgaXMgY29udGFpbmVkIGluICp0aGlzLCBhbmQgZmFsc2UKKyAgICAvLy8gb3RoZXJ3aXNlLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIGJvb2wgY29udGFpbnNfbG93ZXIoY2hhciBDKSBjb25zdCB7IHJldHVybiBmaW5kX2xvd2VyKEMpICE9IG5wb3M7IH0KKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBIZWxwZnVsIEFsZ29yaXRobXMKKyAgICAvLy8gQHsKKworICAgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiBccCBDIGluIHRoZSBzdHJpbmcuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBzaXplX3QgY291bnQoY2hhciBDKSBjb25zdCB7CisgICAgICBzaXplX3QgQ291bnQgPSAwOworICAgICAgZm9yIChzaXplX3QgaSA9IDAsIGUgPSBMZW5ndGg7IGkgIT0gZTsgKytpKQorICAgICAgICBpZiAoRGF0YVtpXSA9PSBDKQorICAgICAgICAgICsrQ291bnQ7CisgICAgICByZXR1cm4gQ291bnQ7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIG5vbi1vdmVybGFwcGVkIG9jY3VycmVuY2VzIG9mIFxwIFN0ciBpbgorICAgIC8vLyB0aGUgc3RyaW5nLgorICAgIHNpemVfdCBjb3VudChTdHJpbmdSZWYgU3RyKSBjb25zdDsKKworICAgIC8vLyBQYXJzZSB0aGUgY3VycmVudCBzdHJpbmcgYXMgYW4gaW50ZWdlciBvZiB0aGUgc3BlY2lmaWVkIHJhZGl4LiAgSWYKKyAgICAvLy8gXHAgUmFkaXggaXMgc3BlY2lmaWVkIGFzIHplcm8sIHRoaXMgZG9lcyByYWRpeCBhdXRvc2Vuc2luZyB1c2luZworICAgIC8vLyBleHRlbmRlZCBDIHJ1bGVzOiAwIGlzIG9jdGFsLCAweCBpcyBoZXgsIDBiIGlzIGJpbmFyeS4KKyAgICAvLy8KKyAgICAvLy8gSWYgdGhlIHN0cmluZyBpcyBpbnZhbGlkIG9yIGlmIG9ubHkgYSBzdWJzZXQgb2YgdGhlIHN0cmluZyBpcyB2YWxpZCwKKyAgICAvLy8gdGhpcyByZXR1cm5zIHRydWUgdG8gc2lnbmlmeSB0aGUgZXJyb3IuICBUaGUgc3RyaW5nIGlzIGNvbnNpZGVyZWQKKyAgICAvLy8gZXJyb25lb3VzIGlmIGVtcHR5IG9yIGlmIGl0IG92ZXJmbG93cyBULgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCwgYm9vbD46OnR5cGUKKyAgICBnZXRBc0ludGVnZXIodW5zaWduZWQgUmFkaXgsIFQgJlJlc3VsdCkgY29uc3QgeworICAgICAgbG9uZyBsb25nIExMVmFsOworICAgICAgaWYgKGdldEFzU2lnbmVkSW50ZWdlcigqdGhpcywgUmFkaXgsIExMVmFsKSB8fAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8VD4oTExWYWwpICE9IExMVmFsKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIFJlc3VsdCA9IExMVmFsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zaWduZWQsIGJvb2w+Ojp0eXBlCisgICAgZ2V0QXNJbnRlZ2VyKHVuc2lnbmVkIFJhZGl4LCBUICZSZXN1bHQpIGNvbnN0IHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBVTExWYWw7CisgICAgICAvLyBUaGUgYWRkaXRpb25hbCBjYXN0IHRvIHVuc2lnbmVkIGxvbmcgbG9uZyBpcyByZXF1aXJlZCB0byBhdm9pZCB0aGUKKyAgICAgIC8vIFZpc3VhbCBDKysgd2FybmluZyBDNDgwNTogJyE9JyA6IHVuc2FmZSBtaXggb2YgdHlwZSAnYm9vbCcgYW5kIHR5cGUKKyAgICAgIC8vICd1bnNpZ25lZCBfX2ludDY0JyB3aGVuIGluc3RhbnRpYXRpbmcgZ2V0QXNJbnRlZ2VyIHdpdGggVCA9IGJvb2wuCisgICAgICBpZiAoZ2V0QXNVbnNpZ25lZEludGVnZXIoKnRoaXMsIFJhZGl4LCBVTExWYWwpIHx8CisgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgbG9uZyBsb25nPihzdGF0aWNfY2FzdDxUPihVTExWYWwpKSAhPSBVTExWYWwpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgUmVzdWx0ID0gVUxMVmFsOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vLyBQYXJzZSB0aGUgY3VycmVudCBzdHJpbmcgYXMgYW4gaW50ZWdlciBvZiB0aGUgc3BlY2lmaWVkIHJhZGl4LiAgSWYKKyAgICAvLy8gXHAgUmFkaXggaXMgc3BlY2lmaWVkIGFzIHplcm8sIHRoaXMgZG9lcyByYWRpeCBhdXRvc2Vuc2luZyB1c2luZworICAgIC8vLyBleHRlbmRlZCBDIHJ1bGVzOiAwIGlzIG9jdGFsLCAweCBpcyBoZXgsIDBiIGlzIGJpbmFyeS4KKyAgICAvLy8KKyAgICAvLy8gSWYgdGhlIHN0cmluZyBkb2VzIG5vdCBiZWdpbiB3aXRoIGEgbnVtYmVyIG9mIHRoZSBzcGVjaWZpZWQgcmFkaXgsCisgICAgLy8vIHRoaXMgcmV0dXJucyB0cnVlIHRvIHNpZ25pZnkgdGhlIGVycm9yLiBUaGUgc3RyaW5nIGlzIGNvbnNpZGVyZWQKKyAgICAvLy8gZXJyb25lb3VzIGlmIGVtcHR5IG9yIGlmIGl0IG92ZXJmbG93cyBULgorICAgIC8vLyBUaGUgcG9ydGlvbiBvZiB0aGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgZGlzY292ZXJlZCBudW1lcmljIHZhbHVlCisgICAgLy8vIGlzIHJlbW92ZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkLCBib29sPjo6dHlwZQorICAgIGNvbnN1bWVJbnRlZ2VyKHVuc2lnbmVkIFJhZGl4LCBUICZSZXN1bHQpIHsKKyAgICAgIGxvbmcgbG9uZyBMTFZhbDsKKyAgICAgIGlmIChjb25zdW1lU2lnbmVkSW50ZWdlcigqdGhpcywgUmFkaXgsIExMVmFsKSB8fAorICAgICAgICAgIHN0YXRpY19jYXN0PGxvbmcgbG9uZz4oc3RhdGljX2Nhc3Q8VD4oTExWYWwpKSAhPSBMTFZhbCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBSZXN1bHQgPSBMTFZhbDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkLCBib29sPjo6dHlwZQorICAgIGNvbnN1bWVJbnRlZ2VyKHVuc2lnbmVkIFJhZGl4LCBUICZSZXN1bHQpIHsKKyAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBVTExWYWw7CisgICAgICBpZiAoY29uc3VtZVVuc2lnbmVkSW50ZWdlcigqdGhpcywgUmFkaXgsIFVMTFZhbCkgfHwKKyAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBsb25nIGxvbmc+KHN0YXRpY19jYXN0PFQ+KFVMTFZhbCkpICE9IFVMTFZhbCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBSZXN1bHQgPSBVTExWYWw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8vIFBhcnNlIHRoZSBjdXJyZW50IHN0cmluZyBhcyBhbiBpbnRlZ2VyIG9mIHRoZSBzcGVjaWZpZWQgXHAgUmFkaXgsIG9yIG9mCisgICAgLy8vIGFuIGF1dG9zZW5zZWQgcmFkaXggaWYgdGhlIFxwIFJhZGl4IGdpdmVuIGlzIDAuICBUaGUgY3VycmVudCB2YWx1ZSBpbgorICAgIC8vLyBccCBSZXN1bHQgaXMgZGlzY2FyZGVkLCBhbmQgdGhlIHN0b3JhZ2UgaXMgY2hhbmdlZCB0byBiZSB3aWRlIGVub3VnaCB0bworICAgIC8vLyBzdG9yZSB0aGUgcGFyc2VkIGludGVnZXIuCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhlIHN0cmluZyBkb2VzIG5vdCBzb2xlbHkgY29uc2lzdCBvZiBhIHZhbGlkCisgICAgLy8vIG5vbi1lbXB0eSBudW1iZXIgaW4gdGhlIGFwcHJvcHJpYXRlIGJhc2UuCisgICAgLy8vCisgICAgLy8vIEFQSW50Ojpmcm9tU3RyaW5nIGlzIHN1cGVyZmljaWFsbHkgc2ltaWxhciBidXQgYXNzdW1lcyB0aGUKKyAgICAvLy8gc3RyaW5nIGlzIHdlbGwtZm9ybWVkIGluIHRoZSBnaXZlbiByYWRpeC4KKyAgICBib29sIGdldEFzSW50ZWdlcih1bnNpZ25lZCBSYWRpeCwgQVBJbnQgJlJlc3VsdCkgY29uc3Q7CisKKyAgICAvLy8gUGFyc2UgdGhlIGN1cnJlbnQgc3RyaW5nIGFzIGFuIElFRUUgZG91YmxlLXByZWNpc2lvbiBmbG9hdGluZworICAgIC8vLyBwb2ludCB2YWx1ZS4gIFRoZSBzdHJpbmcgbXVzdCBiZSBhIHdlbGwtZm9ybWVkIGRvdWJsZS4KKyAgICAvLy8KKyAgICAvLy8gSWYgXHAgQWxsb3dJbmV4YWN0IGlzIGZhbHNlLCB0aGUgZnVuY3Rpb24gd2lsbCBmYWlsIGlmIHRoZSBzdHJpbmcKKyAgICAvLy8gY2Fubm90IGJlIHJlcHJlc2VudGVkIGV4YWN0bHkuICBPdGhlcndpc2UsIHRoZSBmdW5jdGlvbiBvbmx5IGZhaWxzCisgICAgLy8vIGluIGNhc2Ugb2YgYW4gb3ZlcmZsb3cgb3IgdW5kZXJmbG93LgorICAgIGJvb2wgZ2V0QXNEb3VibGUoZG91YmxlICZSZXN1bHQsIGJvb2wgQWxsb3dJbmV4YWN0ID0gdHJ1ZSkgY29uc3Q7CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgU3RyaW5nIE9wZXJhdGlvbnMKKyAgICAvLy8gQHsKKworICAgIC8vIENvbnZlcnQgdGhlIGdpdmVuIEFTQ0lJIHN0cmluZyB0byBsb3dlcmNhc2UuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBzdGQ6OnN0cmluZyBsb3dlcigpIGNvbnN0OworCisgICAgLy8vIENvbnZlcnQgdGhlIGdpdmVuIEFTQ0lJIHN0cmluZyB0byB1cHBlcmNhc2UuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBzdGQ6OnN0cmluZyB1cHBlcigpIGNvbnN0OworCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIFN1YnN0cmluZyBPcGVyYXRpb25zCisgICAgLy8vIEB7CisKKyAgICAvLy8gUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBzdWJzdHJpbmcgZnJvbSBbU3RhcnQsIFN0YXJ0ICsgTikuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBTdGFydCBUaGUgaW5kZXggb2YgdGhlIHN0YXJ0aW5nIGNoYXJhY3RlciBpbiB0aGUgc3Vic3RyaW5nOyBpZgorICAgIC8vLyB0aGUgaW5kZXggaXMgbnBvcyBvciBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIHRoZW4gdGhlCisgICAgLy8vIGVtcHR5IHN1YnN0cmluZyB3aWxsIGJlIHJldHVybmVkLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gTiBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gaW5jbHVkZWQgaW4gdGhlIHN1YnN0cmluZy4gSWYgTgorICAgIC8vLyBleGNlZWRzIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyByZW1haW5pbmcgaW4gdGhlIHN0cmluZywgdGhlIHN0cmluZworICAgIC8vLyBzdWZmaXggKHN0YXJ0aW5nIHdpdGggXHAgU3RhcnQpIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgICAgU3RyaW5nUmVmIHN1YnN0cihzaXplX3QgU3RhcnQsIHNpemVfdCBOID0gbnBvcykgY29uc3QgeworICAgICAgU3RhcnQgPSBzdGQ6Om1pbihTdGFydCwgTGVuZ3RoKTsKKyAgICAgIHJldHVybiBTdHJpbmdSZWYoRGF0YSArIFN0YXJ0LCBzdGQ6Om1pbihOLCBMZW5ndGggLSBTdGFydCkpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gYSBTdHJpbmdSZWYgZXF1YWwgdG8gJ3RoaXMnIGJ1dCB3aXRoIG9ubHkgdGhlIGZpcnN0IFxwIE4KKyAgICAvLy8gZWxlbWVudHMgcmVtYWluaW5nLiAgSWYgXHAgTiBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUKKyAgICAvLy8gc3RyaW5nLCB0aGUgZW50aXJlIHN0cmluZyBpcyByZXR1cm5lZC4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgICBTdHJpbmdSZWYgdGFrZV9mcm9udChzaXplX3QgTiA9IDEpIGNvbnN0IHsKKyAgICAgIGlmIChOID49IHNpemUoKSkKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgcmV0dXJuIGRyb3BfYmFjayhzaXplKCkgLSBOKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIGEgU3RyaW5nUmVmIGVxdWFsIHRvICd0aGlzJyBidXQgd2l0aCBvbmx5IHRoZSBsYXN0IFxwIE4KKyAgICAvLy8gZWxlbWVudHMgcmVtYWluaW5nLiAgSWYgXHAgTiBpcyBncmVhdGVyIHRoYW4gdGhlIGxlbmd0aCBvZiB0aGUKKyAgICAvLy8gc3RyaW5nLCB0aGUgZW50aXJlIHN0cmluZyBpcyByZXR1cm5lZC4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgICBTdHJpbmdSZWYgdGFrZV9iYWNrKHNpemVfdCBOID0gMSkgY29uc3QgeworICAgICAgaWYgKE4gPj0gc2l6ZSgpKQorICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICByZXR1cm4gZHJvcF9mcm9udChzaXplKCkgLSBOKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSBsb25nZXN0IHByZWZpeCBvZiAndGhpcycgc3VjaCB0aGF0IGV2ZXJ5IGNoYXJhY3RlcgorICAgIC8vLyBpbiB0aGUgcHJlZml4IHNhdGlzZmllcyB0aGUgZ2l2ZW4gcHJlZGljYXRlLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIFN0cmluZ1JlZiB0YWtlX3doaWxlKGZ1bmN0aW9uX3JlZjxib29sKGNoYXIpPiBGKSBjb25zdCB7CisgICAgICByZXR1cm4gc3Vic3RyKDAsIGZpbmRfaWZfbm90KEYpKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSBsb25nZXN0IHByZWZpeCBvZiAndGhpcycgc3VjaCB0aGF0IG5vIGNoYXJhY3RlciBpbgorICAgIC8vLyB0aGUgcHJlZml4IHNhdGlzZmllcyB0aGUgZ2l2ZW4gcHJlZGljYXRlLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIFN0cmluZ1JlZiB0YWtlX3VudGlsKGZ1bmN0aW9uX3JlZjxib29sKGNoYXIpPiBGKSBjb25zdCB7CisgICAgICByZXR1cm4gc3Vic3RyKDAsIGZpbmRfaWYoRikpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gYSBTdHJpbmdSZWYgZXF1YWwgdG8gJ3RoaXMnIGJ1dCB3aXRoIHRoZSBmaXJzdCBccCBOIGVsZW1lbnRzCisgICAgLy8vIGRyb3BwZWQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgICAgU3RyaW5nUmVmIGRyb3BfZnJvbnQoc2l6ZV90IE4gPSAxKSBjb25zdCB7CisgICAgICBhc3NlcnQoc2l6ZSgpID49IE4gJiYgIkRyb3BwaW5nIG1vcmUgZWxlbWVudHMgdGhhbiBleGlzdCIpOworICAgICAgcmV0dXJuIHN1YnN0cihOKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIGEgU3RyaW5nUmVmIGVxdWFsIHRvICd0aGlzJyBidXQgd2l0aCB0aGUgbGFzdCBccCBOIGVsZW1lbnRzCisgICAgLy8vIGRyb3BwZWQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgICAgU3RyaW5nUmVmIGRyb3BfYmFjayhzaXplX3QgTiA9IDEpIGNvbnN0IHsKKyAgICAgIGFzc2VydChzaXplKCkgPj0gTiAmJiAiRHJvcHBpbmcgbW9yZSBlbGVtZW50cyB0aGFuIGV4aXN0Iik7CisgICAgICByZXR1cm4gc3Vic3RyKDAsIHNpemUoKS1OKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIGEgU3RyaW5nUmVmIGVxdWFsIHRvICd0aGlzJywgYnV0IHdpdGggYWxsIGNoYXJhY3RlcnMgc2F0aXNmeWluZworICAgIC8vLyB0aGUgZ2l2ZW4gcHJlZGljYXRlIGRyb3BwZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgICAgU3RyaW5nUmVmIGRyb3Bfd2hpbGUoZnVuY3Rpb25fcmVmPGJvb2woY2hhcik+IEYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdWJzdHIoZmluZF9pZl9ub3QoRikpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gYSBTdHJpbmdSZWYgZXF1YWwgdG8gJ3RoaXMnLCBidXQgd2l0aCBhbGwgY2hhcmFjdGVycyBub3QKKyAgICAvLy8gc2F0aXNmeWluZyB0aGUgZ2l2ZW4gcHJlZGljYXRlIGRyb3BwZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJpbmcuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgICAgU3RyaW5nUmVmIGRyb3BfdW50aWwoZnVuY3Rpb25fcmVmPGJvb2woY2hhcik+IEYpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdWJzdHIoZmluZF9pZihGKSk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIFN0cmluZ1JlZiBoYXMgdGhlIGdpdmVuIHByZWZpeCBhbmQgcmVtb3ZlcyB0aGF0CisgICAgLy8vIHByZWZpeC4KKyAgICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgICAgYm9vbCBjb25zdW1lX2Zyb250KFN0cmluZ1JlZiBQcmVmaXgpIHsKKyAgICAgIGlmICghc3RhcnRzd2l0aChQcmVmaXgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICp0aGlzID0gZHJvcF9mcm9udChQcmVmaXguc2l6ZSgpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBTdHJpbmdSZWYgaGFzIHRoZSBnaXZlbiBzdWZmaXggYW5kIHJlbW92ZXMgdGhhdAorICAgIC8vLyBzdWZmaXguCisgICAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICAgIGJvb2wgY29uc3VtZV9iYWNrKFN0cmluZ1JlZiBTdWZmaXgpIHsKKyAgICAgIGlmICghZW5kc3dpdGgoU3VmZml4KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAqdGhpcyA9IGRyb3BfYmFjayhTdWZmaXguc2l6ZSgpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIHN1YnN0cmluZyBmcm9tIFtTdGFydCwgRW5kKS4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIFN0YXJ0IFRoZSBpbmRleCBvZiB0aGUgc3RhcnRpbmcgY2hhcmFjdGVyIGluIHRoZSBzdWJzdHJpbmc7IGlmCisgICAgLy8vIHRoZSBpbmRleCBpcyBucG9zIG9yIGdyZWF0ZXIgdGhhbiB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdGhlbiB0aGUKKyAgICAvLy8gZW1wdHkgc3Vic3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBFbmQgVGhlIGluZGV4IGZvbGxvd2luZyB0aGUgbGFzdCBjaGFyYWN0ZXIgdG8gaW5jbHVkZSBpbiB0aGUKKyAgICAvLy8gc3Vic3RyaW5nLiBJZiB0aGlzIGlzIG5wb3Mgb3IgZXhjZWVkcyB0aGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMKKyAgICAvLy8gcmVtYWluaW5nIGluIHRoZSBzdHJpbmcsIHRoZSBzdHJpbmcgc3VmZml4IChzdGFydGluZyB3aXRoIFxwIFN0YXJ0KQorICAgIC8vLyB3aWxsIGJlIHJldHVybmVkLiBJZiB0aGlzIGlzIGxlc3MgdGhhbiBccCBTdGFydCwgYW4gZW1wdHkgc3RyaW5nIHdpbGwKKyAgICAvLy8gYmUgcmV0dXJuZWQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgICAgU3RyaW5nUmVmIHNsaWNlKHNpemVfdCBTdGFydCwgc2l6ZV90IEVuZCkgY29uc3QgeworICAgICAgU3RhcnQgPSBzdGQ6Om1pbihTdGFydCwgTGVuZ3RoKTsKKyAgICAgIEVuZCA9IHN0ZDo6bWluKHN0ZDo6bWF4KFN0YXJ0LCBFbmQpLCBMZW5ndGgpOworICAgICAgcmV0dXJuIFN0cmluZ1JlZihEYXRhICsgU3RhcnQsIEVuZCAtIFN0YXJ0KTsKKyAgICB9CisKKyAgICAvLy8gU3BsaXQgaW50byB0d28gc3Vic3RyaW5ncyBhcm91bmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYSBzZXBhcmF0b3IKKyAgICAvLy8gY2hhcmFjdGVyLgorICAgIC8vLworICAgIC8vLyBJZiBccCBTZXBhcmF0b3IgaXMgaW4gdGhlIHN0cmluZywgdGhlbiB0aGUgcmVzdWx0IGlzIGEgcGFpciAoTEhTLCBSSFMpCisgICAgLy8vIHN1Y2ggdGhhdCAoKnRoaXMgPT0gTEhTICsgU2VwYXJhdG9yICsgUkhTKSBpcyB0cnVlIGFuZCBSSFMgaXMKKyAgICAvLy8gbWF4aW1hbC4gSWYgXHAgU2VwYXJhdG9yIGlzIG5vdCBpbiB0aGUgc3RyaW5nLCB0aGVuIHRoZSByZXN1bHQgaXMgYQorICAgIC8vLyBwYWlyIChMSFMsIFJIUykgd2hlcmUgKCp0aGlzID09IExIUykgYW5kIChSSFMgPT0gIiIpLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gU2VwYXJhdG9yIFRoZSBjaGFyYWN0ZXIgdG8gc3BsaXQgb24uCisgICAgLy8vIFxyZXR1cm5zIFRoZSBzcGxpdCBzdWJzdHJpbmdzLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgc3RkOjpwYWlyPFN0cmluZ1JlZiwgU3RyaW5nUmVmPiBzcGxpdChjaGFyIFNlcGFyYXRvcikgY29uc3QgeworICAgICAgc2l6ZV90IElkeCA9IGZpbmQoU2VwYXJhdG9yKTsKKyAgICAgIGlmIChJZHggPT0gbnBvcykKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKCp0aGlzLCBTdHJpbmdSZWYoKSk7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoc2xpY2UoMCwgSWR4KSwgc2xpY2UoSWR4KzEsIG5wb3MpKTsKKyAgICB9CisKKyAgICAvLy8gU3BsaXQgaW50byB0d28gc3Vic3RyaW5ncyBhcm91bmQgdGhlIGZpcnN0IG9jY3VycmVuY2Ugb2YgYSBzZXBhcmF0b3IKKyAgICAvLy8gc3RyaW5nLgorICAgIC8vLworICAgIC8vLyBJZiBccCBTZXBhcmF0b3IgaXMgaW4gdGhlIHN0cmluZywgdGhlbiB0aGUgcmVzdWx0IGlzIGEgcGFpciAoTEhTLCBSSFMpCisgICAgLy8vIHN1Y2ggdGhhdCAoKnRoaXMgPT0gTEhTICsgU2VwYXJhdG9yICsgUkhTKSBpcyB0cnVlIGFuZCBSSFMgaXMKKyAgICAvLy8gbWF4aW1hbC4gSWYgXHAgU2VwYXJhdG9yIGlzIG5vdCBpbiB0aGUgc3RyaW5nLCB0aGVuIHRoZSByZXN1bHQgaXMgYQorICAgIC8vLyBwYWlyIChMSFMsIFJIUykgd2hlcmUgKCp0aGlzID09IExIUykgYW5kIChSSFMgPT0gIiIpLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gU2VwYXJhdG9yIC0gVGhlIHN0cmluZyB0byBzcGxpdCBvbi4KKyAgICAvLy8gXHJldHVybiAtIFRoZSBzcGxpdCBzdWJzdHJpbmdzLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgc3RkOjpwYWlyPFN0cmluZ1JlZiwgU3RyaW5nUmVmPiBzcGxpdChTdHJpbmdSZWYgU2VwYXJhdG9yKSBjb25zdCB7CisgICAgICBzaXplX3QgSWR4ID0gZmluZChTZXBhcmF0b3IpOworICAgICAgaWYgKElkeCA9PSBucG9zKQorICAgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoKnRoaXMsIFN0cmluZ1JlZigpKTsKKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihzbGljZSgwLCBJZHgpLCBzbGljZShJZHggKyBTZXBhcmF0b3Iuc2l6ZSgpLCBucG9zKSk7CisgICAgfQorCisgICAgLy8vIFNwbGl0IGludG8gc3Vic3RyaW5ncyBhcm91bmQgdGhlIG9jY3VycmVuY2VzIG9mIGEgc2VwYXJhdG9yIHN0cmluZy4KKyAgICAvLy8KKyAgICAvLy8gRWFjaCBzdWJzdHJpbmcgaXMgc3RvcmVkIGluIFxwIEEuIElmIFxwIE1heFNwbGl0IGlzID49IDAsIGF0IG1vc3QKKyAgICAvLy8gXHAgTWF4U3BsaXQgc3BsaXRzIGFyZSBkb25lIGFuZCBjb25zZXF1ZW50bHkgPD0gXHAgTWF4U3BsaXQgKyAxCisgICAgLy8vIGVsZW1lbnRzIGFyZSBhZGRlZCB0byBBLgorICAgIC8vLyBJZiBccCBLZWVwRW1wdHkgaXMgZmFsc2UsIGVtcHR5IHN0cmluZ3MgYXJlIG5vdCBhZGRlZCB0byBccCBBLiBUaGV5CisgICAgLy8vIHN0aWxsIGNvdW50IHdoZW4gY29uc2lkZXJpbmcgXHAgTWF4U3BsaXQKKyAgICAvLy8gQW4gdXNlZnVsIGludmFyaWFudCBpcyB0aGF0CisgICAgLy8vIFNlcGFyYXRvci5qb2luKEEpID09ICp0aGlzIGlmIE1heFNwbGl0ID09IC0xIGFuZCBLZWVwRW1wdHkgPT0gdHJ1ZQorICAgIC8vLworICAgIC8vLyBccGFyYW0gQSAtIFdoZXJlIHRvIHB1dCB0aGUgc3Vic3RyaW5ncy4KKyAgICAvLy8gXHBhcmFtIFNlcGFyYXRvciAtIFRoZSBzdHJpbmcgdG8gc3BsaXQgb24uCisgICAgLy8vIFxwYXJhbSBNYXhTcGxpdCAtIFRoZSBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyB0aGUgc3RyaW5nIGlzIHNwbGl0LgorICAgIC8vLyBccGFyYW0gS2VlcEVtcHR5IC0gVHJ1ZSBpZiBlbXB0eSBzdWJzdHJpbmcgc2hvdWxkIGJlIGFkZGVkLgorICAgIHZvaWQgc3BsaXQoU21hbGxWZWN0b3JJbXBsPFN0cmluZ1JlZj4gJkEsCisgICAgICAgICAgICAgICBTdHJpbmdSZWYgU2VwYXJhdG9yLCBpbnQgTWF4U3BsaXQgPSAtMSwKKyAgICAgICAgICAgICAgIGJvb2wgS2VlcEVtcHR5ID0gdHJ1ZSkgY29uc3Q7CisKKyAgICAvLy8gU3BsaXQgaW50byBzdWJzdHJpbmdzIGFyb3VuZCB0aGUgb2NjdXJyZW5jZXMgb2YgYSBzZXBhcmF0b3IgY2hhcmFjdGVyLgorICAgIC8vLworICAgIC8vLyBFYWNoIHN1YnN0cmluZyBpcyBzdG9yZWQgaW4gXHAgQS4gSWYgXHAgTWF4U3BsaXQgaXMgPj0gMCwgYXQgbW9zdAorICAgIC8vLyBccCBNYXhTcGxpdCBzcGxpdHMgYXJlIGRvbmUgYW5kIGNvbnNlcXVlbnRseSA8PSBccCBNYXhTcGxpdCArIDEKKyAgICAvLy8gZWxlbWVudHMgYXJlIGFkZGVkIHRvIEEuCisgICAgLy8vIElmIFxwIEtlZXBFbXB0eSBpcyBmYWxzZSwgZW1wdHkgc3RyaW5ncyBhcmUgbm90IGFkZGVkIHRvIFxwIEEuIFRoZXkKKyAgICAvLy8gc3RpbGwgY291bnQgd2hlbiBjb25zaWRlcmluZyBccCBNYXhTcGxpdAorICAgIC8vLyBBbiB1c2VmdWwgaW52YXJpYW50IGlzIHRoYXQKKyAgICAvLy8gU2VwYXJhdG9yLmpvaW4oQSkgPT0gKnRoaXMgaWYgTWF4U3BsaXQgPT0gLTEgYW5kIEtlZXBFbXB0eSA9PSB0cnVlCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBBIC0gV2hlcmUgdG8gcHV0IHRoZSBzdWJzdHJpbmdzLgorICAgIC8vLyBccGFyYW0gU2VwYXJhdG9yIC0gVGhlIHN0cmluZyB0byBzcGxpdCBvbi4KKyAgICAvLy8gXHBhcmFtIE1heFNwbGl0IC0gVGhlIG1heGltdW0gbnVtYmVyIG9mIHRpbWVzIHRoZSBzdHJpbmcgaXMgc3BsaXQuCisgICAgLy8vIFxwYXJhbSBLZWVwRW1wdHkgLSBUcnVlIGlmIGVtcHR5IHN1YnN0cmluZyBzaG91bGQgYmUgYWRkZWQuCisgICAgdm9pZCBzcGxpdChTbWFsbFZlY3RvckltcGw8U3RyaW5nUmVmPiAmQSwgY2hhciBTZXBhcmF0b3IsIGludCBNYXhTcGxpdCA9IC0xLAorICAgICAgICAgICAgICAgYm9vbCBLZWVwRW1wdHkgPSB0cnVlKSBjb25zdDsKKworICAgIC8vLyBTcGxpdCBpbnRvIHR3byBzdWJzdHJpbmdzIGFyb3VuZCB0aGUgbGFzdCBvY2N1cnJlbmNlIG9mIGEgc2VwYXJhdG9yCisgICAgLy8vIGNoYXJhY3Rlci4KKyAgICAvLy8KKyAgICAvLy8gSWYgXHAgU2VwYXJhdG9yIGlzIGluIHRoZSBzdHJpbmcsIHRoZW4gdGhlIHJlc3VsdCBpcyBhIHBhaXIgKExIUywgUkhTKQorICAgIC8vLyBzdWNoIHRoYXQgKCp0aGlzID09IExIUyArIFNlcGFyYXRvciArIFJIUykgaXMgdHJ1ZSBhbmQgUkhTIGlzCisgICAgLy8vIG1pbmltYWwuIElmIFxwIFNlcGFyYXRvciBpcyBub3QgaW4gdGhlIHN0cmluZywgdGhlbiB0aGUgcmVzdWx0IGlzIGEKKyAgICAvLy8gcGFpciAoTEhTLCBSSFMpIHdoZXJlICgqdGhpcyA9PSBMSFMpIGFuZCAoUkhTID09ICIiKS4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIFNlcGFyYXRvciAtIFRoZSBjaGFyYWN0ZXIgdG8gc3BsaXQgb24uCisgICAgLy8vIFxyZXR1cm4gLSBUaGUgc3BsaXQgc3Vic3RyaW5ncy4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIHN0ZDo6cGFpcjxTdHJpbmdSZWYsIFN0cmluZ1JlZj4gcnNwbGl0KGNoYXIgU2VwYXJhdG9yKSBjb25zdCB7CisgICAgICBzaXplX3QgSWR4ID0gcmZpbmQoU2VwYXJhdG9yKTsKKyAgICAgIGlmIChJZHggPT0gbnBvcykKKyAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKCp0aGlzLCBTdHJpbmdSZWYoKSk7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoc2xpY2UoMCwgSWR4KSwgc2xpY2UoSWR4KzEsIG5wb3MpKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHN0cmluZyB3aXRoIGNvbnNlY3V0aXZlIFxwIENoYXIgY2hhcmFjdGVycyBzdGFydGluZyBmcm9tIHRoZQorICAgIC8vLyB0aGUgbGVmdCByZW1vdmVkLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgU3RyaW5nUmVmIGx0cmltKGNoYXIgQ2hhcikgY29uc3QgeworICAgICAgcmV0dXJuIGRyb3BfZnJvbnQoc3RkOjptaW4oTGVuZ3RoLCBmaW5kX2ZpcnN0X25vdF9vZihDaGFyKSkpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gc3RyaW5nIHdpdGggY29uc2VjdXRpdmUgY2hhcmFjdGVycyBpbiBccCBDaGFycyBzdGFydGluZyBmcm9tCisgICAgLy8vIHRoZSBsZWZ0IHJlbW92ZWQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBTdHJpbmdSZWYgbHRyaW0oU3RyaW5nUmVmIENoYXJzID0gIiBcdFxuXHZcZlxyIikgY29uc3QgeworICAgICAgcmV0dXJuIGRyb3BfZnJvbnQoc3RkOjptaW4oTGVuZ3RoLCBmaW5kX2ZpcnN0X25vdF9vZihDaGFycykpKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHN0cmluZyB3aXRoIGNvbnNlY3V0aXZlIFxwIENoYXIgY2hhcmFjdGVycyBzdGFydGluZyBmcm9tIHRoZQorICAgIC8vLyByaWdodCByZW1vdmVkLgorICAgIExMVk1fTk9ESVNDQVJECisgICAgU3RyaW5nUmVmIHJ0cmltKGNoYXIgQ2hhcikgY29uc3QgeworICAgICAgcmV0dXJuIGRyb3BfYmFjayhMZW5ndGggLSBzdGQ6Om1pbihMZW5ndGgsIGZpbmRfbGFzdF9ub3Rfb2YoQ2hhcikgKyAxKSk7CisgICAgfQorCisgICAgLy8vIFJldHVybiBzdHJpbmcgd2l0aCBjb25zZWN1dGl2ZSBjaGFyYWN0ZXJzIGluIFxwIENoYXJzIHN0YXJ0aW5nIGZyb20KKyAgICAvLy8gdGhlIHJpZ2h0IHJlbW92ZWQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBTdHJpbmdSZWYgcnRyaW0oU3RyaW5nUmVmIENoYXJzID0gIiBcdFxuXHZcZlxyIikgY29uc3QgeworICAgICAgcmV0dXJuIGRyb3BfYmFjayhMZW5ndGggLSBzdGQ6Om1pbihMZW5ndGgsIGZpbmRfbGFzdF9ub3Rfb2YoQ2hhcnMpICsgMSkpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gc3RyaW5nIHdpdGggY29uc2VjdXRpdmUgXHAgQ2hhciBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlCisgICAgLy8vIGxlZnQgYW5kIHJpZ2h0IHJlbW92ZWQuCisgICAgTExWTV9OT0RJU0NBUkQKKyAgICBTdHJpbmdSZWYgdHJpbShjaGFyIENoYXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBsdHJpbShDaGFyKS5ydHJpbShDaGFyKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHN0cmluZyB3aXRoIGNvbnNlY3V0aXZlIGNoYXJhY3RlcnMgaW4gXHAgQ2hhcnMgc3RhcnRpbmcgZnJvbQorICAgIC8vLyB0aGUgbGVmdCBhbmQgcmlnaHQgcmVtb3ZlZC4KKyAgICBMTFZNX05PRElTQ0FSRAorICAgIFN0cmluZ1JlZiB0cmltKFN0cmluZ1JlZiBDaGFycyA9ICIgXHRcblx2XGZcciIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBsdHJpbShDaGFycykucnRyaW0oQ2hhcnMpOworICAgIH0KKworICAgIC8vLyBAfQorICB9OworCisgIC8vLyBBIHdyYXBwZXIgYXJvdW5kIGEgc3RyaW5nIGxpdGVyYWwgdGhhdCBzZXJ2ZXMgYXMgYSBwcm94eSBmb3IgY29uc3RydWN0aW5nCisgIC8vLyBnbG9iYWwgdGFibGVzIG9mIFN0cmluZ1JlZnMgd2l0aCB0aGUgbGVuZ3RoIGNvbXB1dGVkIGF0IGNvbXBpbGUgdGltZS4KKyAgLy8vIEluIG9yZGVyIHRvIGF2b2lkIHRoZSBpbnZvY2F0aW9uIG9mIGEgZ2xvYmFsIGNvbnN0cnVjdG9yLCBTdHJpbmdMaXRlcmFsCisgIC8vLyBzaG91bGQgKm9ubHkqIGJlIHVzZWQgaW4gYSBjb25zdGV4cHIgY29udGV4dCwgYXMgc3VjaDoKKyAgLy8vCisgIC8vLyBjb25zdGV4cHIgU3RyaW5nTGl0ZXJhbCBTKCJ0ZXN0Iik7CisgIC8vLworICBjbGFzcyBTdHJpbmdMaXRlcmFsIDogcHVibGljIFN0cmluZ1JlZiB7CisgIHByaXZhdGU6CisgICAgY29uc3RleHByIFN0cmluZ0xpdGVyYWwoY29uc3QgY2hhciAqU3RyLCBzaXplX3QgTikgOiBTdHJpbmdSZWYoU3RyLCBOKSB7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICB0ZW1wbGF0ZSA8c2l6ZV90IE4+CisgICAgY29uc3RleHByIFN0cmluZ0xpdGVyYWwoY29uc3QgY2hhciAoJlN0cilbTl0pCisjaWYgZGVmaW5lZChfX2NsYW5nX18pICYmIF9faGFzX2F0dHJpYnV0ZShlbmFibGVfaWYpCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAorI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZ2NjLWNvbXBhdCIKKyAgICAgICAgX19hdHRyaWJ1dGUoKGVuYWJsZV9pZihfX2J1aWx0aW5fc3RybGVuKFN0cikgPT0gTiAtIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImludmFsaWQgc3RyaW5nIGxpdGVyYWwiKSkpCisjcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCisjZW5kaWYKKyAgICAgICAgOiBTdHJpbmdSZWYoU3RyLCBOIC0gMSkgeworICAgIH0KKworICAgIC8vIEV4cGxpY2l0IGNvbnN0cnVjdGlvbiBmb3Igc3RyaW5ncyBsaWtlICJmb29cMGJhciIuCisgICAgdGVtcGxhdGUgPHNpemVfdCBOPgorICAgIHN0YXRpYyBjb25zdGV4cHIgU3RyaW5nTGl0ZXJhbCB3aXRoSW5uZXJOVUwoY29uc3QgY2hhciAoJlN0cilbTl0pIHsKKyAgICAgIHJldHVybiBTdHJpbmdMaXRlcmFsKFN0ciwgTiAtIDEpOworICAgIH0KKyAgfTsKKworICAvLy8gQG5hbWUgU3RyaW5nUmVmIENvbXBhcmlzb24gT3BlcmF0b3JzCisgIC8vLyBAeworCisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShTdHJpbmdSZWYgTEhTLCBTdHJpbmdSZWYgUkhTKSB7CisgICAgcmV0dXJuIExIUy5lcXVhbHMoUkhTKTsKKyAgfQorCisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShTdHJpbmdSZWYgTEhTLCBTdHJpbmdSZWYgUkhTKSB7IHJldHVybiAhKExIUyA9PSBSSFMpOyB9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KFN0cmluZ1JlZiBMSFMsIFN0cmluZ1JlZiBSSFMpIHsKKyAgICByZXR1cm4gTEhTLmNvbXBhcmUoUkhTKSA9PSAtMTsKKyAgfQorCisgIGlubGluZSBib29sIG9wZXJhdG9yPD0oU3RyaW5nUmVmIExIUywgU3RyaW5nUmVmIFJIUykgeworICAgIHJldHVybiBMSFMuY29tcGFyZShSSFMpICE9IDE7CisgIH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcj4oU3RyaW5nUmVmIExIUywgU3RyaW5nUmVmIFJIUykgeworICAgIHJldHVybiBMSFMuY29tcGFyZShSSFMpID09IDE7CisgIH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcj49KFN0cmluZ1JlZiBMSFMsIFN0cmluZ1JlZiBSSFMpIHsKKyAgICByZXR1cm4gTEhTLmNvbXBhcmUoUkhTKSAhPSAtMTsKKyAgfQorCisgIGlubGluZSBzdGQ6OnN0cmluZyAmb3BlcmF0b3IrPShzdGQ6OnN0cmluZyAmYnVmZmVyLCBTdHJpbmdSZWYgc3RyaW5nKSB7CisgICAgcmV0dXJuIGJ1ZmZlci5hcHBlbmQoc3RyaW5nLmRhdGEoKSwgc3RyaW5nLnNpemUoKSk7CisgIH0KKworICAvLy8gQH0KKworICAvLy8gXGJyaWVmIENvbXB1dGUgYSBoYXNoX2NvZGUgZm9yIGEgU3RyaW5nUmVmLgorICBMTFZNX05PRElTQ0FSRAorICBoYXNoX2NvZGUgaGFzaF92YWx1ZShTdHJpbmdSZWYgUyk7CisKKyAgLy8gU3RyaW5nUmVmcyBjYW4gYmUgdHJlYXRlZCBsaWtlIGEgUE9EIHR5cGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNQb2RMaWtlOworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNQb2RMaWtlPFN0cmluZ1JlZj4geyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7IH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9TVFJJTkdSRUZfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nU2V0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TdHJpbmdTZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWY0NGMwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nU2V0LmgKQEAgLTAsMCArMSw1MiBAQAorLy89PT0tIFN0cmluZ1NldC5oIC0gVGhlIExMVk0gQ29tcGlsZXIgRHJpdmVyIC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgU3RyaW5nU2V0IC0gQSBzZXQtbGlrZSB3cmFwcGVyIGZvciB0aGUgU3RyaW5nTWFwLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU1RSSU5HU0VUX0gKKyNkZWZpbmUgTExWTV9BRFRfU1RSSU5HU0VUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCisgIC8vLyBTdHJpbmdTZXQgLSBBIHdyYXBwZXIgZm9yIFN0cmluZ01hcCB0aGF0IHByb3ZpZGVzIHNldC1saWtlIGZ1bmN0aW9uYWxpdHkuCisgIHRlbXBsYXRlIDxjbGFzcyBBbGxvY2F0b3JUeSA9IE1hbGxvY0FsbG9jYXRvcj4KKyAgY2xhc3MgU3RyaW5nU2V0IDogcHVibGljIFN0cmluZ01hcDxjaGFyLCBBbGxvY2F0b3JUeT4geworICAgIHVzaW5nIGJhc2UgPSBTdHJpbmdNYXA8Y2hhciwgQWxsb2NhdG9yVHk+OworCisgIHB1YmxpYzoKKyAgICBTdHJpbmdTZXQoKSA9IGRlZmF1bHQ7CisgICAgU3RyaW5nU2V0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxTdHJpbmdSZWY+IFMpIHsKKyAgICAgIGZvciAoU3RyaW5nUmVmIFggOiBTKQorICAgICAgICBpbnNlcnQoWCk7CisgICAgfQorCisgICAgc3RkOjpwYWlyPHR5cGVuYW1lIGJhc2U6Oml0ZXJhdG9yLCBib29sPiBpbnNlcnQoU3RyaW5nUmVmIEtleSkgeworICAgICAgYXNzZXJ0KCFLZXkuZW1wdHkoKSk7CisgICAgICByZXR1cm4gYmFzZTo6aW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEtleSwgJ1wwJykpOworICAgIH0KKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbnB1dEl0PgorICAgIHZvaWQgaW5zZXJ0KGNvbnN0IElucHV0SXQgJkJlZ2luLCBjb25zdCBJbnB1dEl0ICZFbmQpIHsKKyAgICAgIGZvciAoYXV0byBJdCA9IEJlZ2luOyBJdCAhPSBFbmQ7ICsrSXQpCisgICAgICAgIGJhc2U6Omluc2VydChzdGQ6Om1ha2VfcGFpcigqSXQsICdcMCcpKTsKKyAgICB9CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9TVFJJTkdTRVRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nU3dpdGNoLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9TdHJpbmdTd2l0Y2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTA3MzAzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvU3RyaW5nU3dpdGNoLmgKQEAgLTAsMCArMSwyMTkgQEAKKy8vPT09LS0tIFN0cmluZ1N3aXRjaC5oIC0gU3dpdGNoLW9uLWxpdGVyYWwtc3RyaW5nIENvbnN0cnVjdCAtLS0tLS0tLS0tLS0tLT09PS8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vCisvLworLy8gIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBTdHJpbmdTd2l0Y2ggdGVtcGxhdGUsIHdoaWNoIG1pbWljcyBhIHN3aXRjaCgpCisvLyAgc3RhdGVtZW50IHdob3NlIGNhc2VzIGFyZSBzdHJpbmcgbGl0ZXJhbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09LworI2lmbmRlZiBMTFZNX0FEVF9TVFJJTkdTV0lUQ0hfSAorI2RlZmluZSBMTFZNX0FEVF9TVFJJTkdTV0lUQ0hfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBcYnJpZWYgQSBzd2l0Y2goKS1saWtlIHN0YXRlbWVudCB3aG9zZSBjYXNlcyBhcmUgc3RyaW5nIGxpdGVyYWxzLgorLy8vCisvLy8gVGhlIFN0cmluZ1N3aXRjaCBjbGFzcyBpcyBhIHNpbXBsZSBmb3JtIG9mIGEgc3dpdGNoKCkgc3RhdGVtZW50IHRoYXQKKy8vLyBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIHN0cmluZyBtYXRjaGVzIG9uZSBvZiB0aGUgZ2l2ZW4gc3RyaW5nCisvLy8gbGl0ZXJhbHMuIFRoZSB0ZW1wbGF0ZSB0eXBlIHBhcmFtZXRlciBccCBUIGlzIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZSB0aGF0CisvLy8gd2lsbCBiZSByZXR1cm5lZCBmcm9tIHRoZSBzdHJpbmctc3dpdGNoIGV4cHJlc3Npb24uIEZvciBleGFtcGxlLAorLy8vIHRoZSBmb2xsb3dpbmcgY29kZSBzd2l0Y2hlcyBvbiB0aGUgbmFtZSBvZiBhIGNvbG9yIGluIFxjIGFyZ3ZbaV06CisvLy8KKy8vLyBcY29kZQorLy8vIENvbG9yIGNvbG9yID0gU3RyaW5nU3dpdGNoPENvbG9yPihhcmd2W2ldKQorLy8vICAgLkNhc2UoInJlZCIsIFJlZCkKKy8vLyAgIC5DYXNlKCJvcmFuZ2UiLCBPcmFuZ2UpCisvLy8gICAuQ2FzZSgieWVsbG93IiwgWWVsbG93KQorLy8vICAgLkNhc2UoImdyZWVuIiwgR3JlZW4pCisvLy8gICAuQ2FzZSgiYmx1ZSIsIEJsdWUpCisvLy8gICAuQ2FzZSgiaW5kaWdvIiwgSW5kaWdvKQorLy8vICAgLkNhc2VzKCJ2aW9sZXQiLCAicHVycGxlIiwgVmlvbGV0KQorLy8vICAgLkRlZmF1bHQoVW5rbm93bkNvbG9yKTsKKy8vLyBcZW5kY29kZQordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgUiA9IFQ+CitjbGFzcyBTdHJpbmdTd2l0Y2ggeworICAvLy8gXGJyaWVmIFRoZSBzdHJpbmcgd2UgYXJlIG1hdGNoaW5nLgorICBjb25zdCBTdHJpbmdSZWYgU3RyOworCisgIC8vLyBcYnJpZWYgVGhlIHBvaW50ZXIgdG8gdGhlIHJlc3VsdCBvZiB0aGlzIHN3aXRjaCBzdGF0ZW1lbnQsIG9uY2Uga25vd24sCisgIC8vLyBudWxsIGJlZm9yZSB0aGF0LgorICBPcHRpb25hbDxUPiBSZXN1bHQ7CisKK3B1YmxpYzoKKyAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICBleHBsaWNpdCBTdHJpbmdTd2l0Y2goU3RyaW5nUmVmIFMpCisgIDogU3RyKFMpLCBSZXN1bHQoKSB7IH0KKworICAvLyBTdHJpbmdTd2l0Y2ggaXMgbm90IGNvcHlhYmxlLgorICBTdHJpbmdTd2l0Y2goY29uc3QgU3RyaW5nU3dpdGNoICYpID0gZGVsZXRlOworCisgIC8vIFN0cmluZ1N3aXRjaCBpcyBub3QgYXNzaWduYWJsZSBkdWUgdG8gJ1N0cicgYmVpbmcgJ2NvbnN0Jy4KKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgU3RyaW5nU3dpdGNoICYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShTdHJpbmdTd2l0Y2ggJiZvdGhlcikgPSBkZWxldGU7CisKKyAgU3RyaW5nU3dpdGNoKFN0cmluZ1N3aXRjaCAmJm90aGVyKQorICAgIDogU3RyKG90aGVyLlN0ciksIFJlc3VsdChzdGQ6Om1vdmUob3RoZXIuUmVzdWx0KSkgeyB9CisKKyAgflN0cmluZ1N3aXRjaCgpID0gZGVmYXVsdDsKKworICAvLyBDYXNlLXNlbnNpdGl2ZSBjYXNlIG1hdGNoZXJzCisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgU3RyaW5nU3dpdGNoICZDYXNlKFN0cmluZ0xpdGVyYWwgUywgVCBWYWx1ZSkgeworICAgIGlmICghUmVzdWx0ICYmIFN0ciA9PSBTKSB7CisgICAgICBSZXN1bHQgPSBzdGQ6Om1vdmUoVmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFN0cmluZ1N3aXRjaCYgRW5kc1dpdGgoU3RyaW5nTGl0ZXJhbCBTLCBUIFZhbHVlKSB7CisgICAgaWYgKCFSZXN1bHQgJiYgU3RyLmVuZHN3aXRoKFMpKSB7CisgICAgICBSZXN1bHQgPSBzdGQ6Om1vdmUoVmFsdWUpOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFN0cmluZ1N3aXRjaCYgU3RhcnRzV2l0aChTdHJpbmdMaXRlcmFsIFMsIFQgVmFsdWUpIHsKKyAgICBpZiAoIVJlc3VsdCAmJiBTdHIuc3RhcnRzd2l0aChTKSkgeworICAgICAgUmVzdWx0ID0gc3RkOjptb3ZlKFZhbHVlKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICBTdHJpbmdTd2l0Y2ggJkNhc2VzKFN0cmluZ0xpdGVyYWwgUzAsIFN0cmluZ0xpdGVyYWwgUzEsIFQgVmFsdWUpIHsKKyAgICByZXR1cm4gQ2FzZShTMCwgVmFsdWUpLkNhc2UoUzEsIFZhbHVlKTsKKyAgfQorCisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgU3RyaW5nU3dpdGNoICZDYXNlcyhTdHJpbmdMaXRlcmFsIFMwLCBTdHJpbmdMaXRlcmFsIFMxLCBTdHJpbmdMaXRlcmFsIFMyLAorICAgICAgICAgICAgICAgICAgICAgIFQgVmFsdWUpIHsKKyAgICByZXR1cm4gQ2FzZShTMCwgVmFsdWUpLkNhc2VzKFMxLCBTMiwgVmFsdWUpOworICB9CisKKyAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICBTdHJpbmdTd2l0Y2ggJkNhc2VzKFN0cmluZ0xpdGVyYWwgUzAsIFN0cmluZ0xpdGVyYWwgUzEsIFN0cmluZ0xpdGVyYWwgUzIsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbCBTMywgVCBWYWx1ZSkgeworICAgIHJldHVybiBDYXNlKFMwLCBWYWx1ZSkuQ2FzZXMoUzEsIFMyLCBTMywgVmFsdWUpOworICB9CisKKyAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICBTdHJpbmdTd2l0Y2ggJkNhc2VzKFN0cmluZ0xpdGVyYWwgUzAsIFN0cmluZ0xpdGVyYWwgUzEsIFN0cmluZ0xpdGVyYWwgUzIsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbCBTMywgU3RyaW5nTGl0ZXJhbCBTNCwgVCBWYWx1ZSkgeworICAgIHJldHVybiBDYXNlKFMwLCBWYWx1ZSkuQ2FzZXMoUzEsIFMyLCBTMywgUzQsIFZhbHVlKTsKKyAgfQorCisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgU3RyaW5nU3dpdGNoICZDYXNlcyhTdHJpbmdMaXRlcmFsIFMwLCBTdHJpbmdMaXRlcmFsIFMxLCBTdHJpbmdMaXRlcmFsIFMyLAorICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgUzMsIFN0cmluZ0xpdGVyYWwgUzQsIFN0cmluZ0xpdGVyYWwgUzUsCisgICAgICAgICAgICAgICAgICAgICAgVCBWYWx1ZSkgeworICAgIHJldHVybiBDYXNlKFMwLCBWYWx1ZSkuQ2FzZXMoUzEsIFMyLCBTMywgUzQsIFM1LCBWYWx1ZSk7CisgIH0KKworICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFN0cmluZ1N3aXRjaCAmQ2FzZXMoU3RyaW5nTGl0ZXJhbCBTMCwgU3RyaW5nTGl0ZXJhbCBTMSwgU3RyaW5nTGl0ZXJhbCBTMiwKKyAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsIFMzLCBTdHJpbmdMaXRlcmFsIFM0LCBTdHJpbmdMaXRlcmFsIFM1LAorICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgUzYsIFQgVmFsdWUpIHsKKyAgICByZXR1cm4gQ2FzZShTMCwgVmFsdWUpLkNhc2VzKFMxLCBTMiwgUzMsIFM0LCBTNSwgUzYsIFZhbHVlKTsKKyAgfQorCisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgU3RyaW5nU3dpdGNoICZDYXNlcyhTdHJpbmdMaXRlcmFsIFMwLCBTdHJpbmdMaXRlcmFsIFMxLCBTdHJpbmdMaXRlcmFsIFMyLAorICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgUzMsIFN0cmluZ0xpdGVyYWwgUzQsIFN0cmluZ0xpdGVyYWwgUzUsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbCBTNiwgU3RyaW5nTGl0ZXJhbCBTNywgVCBWYWx1ZSkgeworICAgIHJldHVybiBDYXNlKFMwLCBWYWx1ZSkuQ2FzZXMoUzEsIFMyLCBTMywgUzQsIFM1LCBTNiwgUzcsIFZhbHVlKTsKKyAgfQorCisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgU3RyaW5nU3dpdGNoICZDYXNlcyhTdHJpbmdMaXRlcmFsIFMwLCBTdHJpbmdMaXRlcmFsIFMxLCBTdHJpbmdMaXRlcmFsIFMyLAorICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgUzMsIFN0cmluZ0xpdGVyYWwgUzQsIFN0cmluZ0xpdGVyYWwgUzUsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbCBTNiwgU3RyaW5nTGl0ZXJhbCBTNywgU3RyaW5nTGl0ZXJhbCBTOCwKKyAgICAgICAgICAgICAgICAgICAgICBUIFZhbHVlKSB7CisgICAgcmV0dXJuIENhc2UoUzAsIFZhbHVlKS5DYXNlcyhTMSwgUzIsIFMzLCBTNCwgUzUsIFM2LCBTNywgUzgsIFZhbHVlKTsKKyAgfQorCisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgU3RyaW5nU3dpdGNoICZDYXNlcyhTdHJpbmdMaXRlcmFsIFMwLCBTdHJpbmdMaXRlcmFsIFMxLCBTdHJpbmdMaXRlcmFsIFMyLAorICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0xpdGVyYWwgUzMsIFN0cmluZ0xpdGVyYWwgUzQsIFN0cmluZ0xpdGVyYWwgUzUsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbCBTNiwgU3RyaW5nTGl0ZXJhbCBTNywgU3RyaW5nTGl0ZXJhbCBTOCwKKyAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsIFM5LCBUIFZhbHVlKSB7CisgICAgcmV0dXJuIENhc2UoUzAsIFZhbHVlKS5DYXNlcyhTMSwgUzIsIFMzLCBTNCwgUzUsIFM2LCBTNywgUzgsIFM5LCBWYWx1ZSk7CisgIH0KKworICAvLyBDYXNlLWluc2Vuc2l0aXZlIGNhc2UgbWF0Y2hlcnMuCisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgU3RyaW5nU3dpdGNoICZDYXNlTG93ZXIoU3RyaW5nTGl0ZXJhbCBTLCBUIFZhbHVlKSB7CisgICAgaWYgKCFSZXN1bHQgJiYgU3RyLmVxdWFsc19sb3dlcihTKSkKKyAgICAgIFJlc3VsdCA9IHN0ZDo6bW92ZShWYWx1ZSk7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFN0cmluZ1N3aXRjaCAmRW5kc1dpdGhMb3dlcihTdHJpbmdMaXRlcmFsIFMsIFQgVmFsdWUpIHsKKyAgICBpZiAoIVJlc3VsdCAmJiBTdHIuZW5kc3dpdGhfbG93ZXIoUykpCisgICAgICBSZXN1bHQgPSBWYWx1ZTsKKworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgU3RyaW5nU3dpdGNoICZTdGFydHNXaXRoTG93ZXIoU3RyaW5nTGl0ZXJhbCBTLCBUIFZhbHVlKSB7CisgICAgaWYgKCFSZXN1bHQgJiYgU3RyLnN0YXJ0c3dpdGhfbG93ZXIoUykpCisgICAgICBSZXN1bHQgPSBzdGQ6Om1vdmUoVmFsdWUpOworCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICBTdHJpbmdTd2l0Y2ggJkNhc2VzTG93ZXIoU3RyaW5nTGl0ZXJhbCBTMCwgU3RyaW5nTGl0ZXJhbCBTMSwgVCBWYWx1ZSkgeworICAgIHJldHVybiBDYXNlTG93ZXIoUzAsIFZhbHVlKS5DYXNlTG93ZXIoUzEsIFZhbHVlKTsKKyAgfQorCisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgU3RyaW5nU3dpdGNoICZDYXNlc0xvd2VyKFN0cmluZ0xpdGVyYWwgUzAsIFN0cmluZ0xpdGVyYWwgUzEsIFN0cmluZ0xpdGVyYWwgUzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUIFZhbHVlKSB7CisgICAgcmV0dXJuIENhc2VMb3dlcihTMCwgVmFsdWUpLkNhc2VzTG93ZXIoUzEsIFMyLCBWYWx1ZSk7CisgIH0KKworICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFN0cmluZ1N3aXRjaCAmQ2FzZXNMb3dlcihTdHJpbmdMaXRlcmFsIFMwLCBTdHJpbmdMaXRlcmFsIFMxLCBTdHJpbmdMaXRlcmFsIFMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nTGl0ZXJhbCBTMywgVCBWYWx1ZSkgeworICAgIHJldHVybiBDYXNlTG93ZXIoUzAsIFZhbHVlKS5DYXNlc0xvd2VyKFMxLCBTMiwgUzMsIFZhbHVlKTsKKyAgfQorCisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgU3RyaW5nU3dpdGNoICZDYXNlc0xvd2VyKFN0cmluZ0xpdGVyYWwgUzAsIFN0cmluZ0xpdGVyYWwgUzEsIFN0cmluZ0xpdGVyYWwgUzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdMaXRlcmFsIFMzLCBTdHJpbmdMaXRlcmFsIFM0LCBUIFZhbHVlKSB7CisgICAgcmV0dXJuIENhc2VMb3dlcihTMCwgVmFsdWUpLkNhc2VzTG93ZXIoUzEsIFMyLCBTMywgUzQsIFZhbHVlKTsKKyAgfQorCisgIExMVk1fTk9ESVNDQVJECisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgUiBEZWZhdWx0KFQgVmFsdWUpIHsKKyAgICBpZiAoUmVzdWx0KQorICAgICAgcmV0dXJuIHN0ZDo6bW92ZSgqUmVzdWx0KTsKKyAgICByZXR1cm4gVmFsdWU7CisgIH0KKworICBMTFZNX05PRElTQ0FSRAorICBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIG9wZXJhdG9yIFIoKSB7CisgICAgYXNzZXJ0KFJlc3VsdCAmJiAiRmVsbCBvZmYgdGhlIGVuZCBvZiBhIHN0cmluZy1zd2l0Y2giKTsKKyAgICByZXR1cm4gc3RkOjptb3ZlKCpSZXN1bHQpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfU1RSSU5HU1dJVENIX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1RpbnlQdHJWZWN0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1RpbnlQdHJWZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzU3M2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvVGlueVB0clZlY3Rvci5oCkBAIC0wLDAgKzEsMzQ3IEBACisvLz09PS0gbGx2bS9BRFQvVGlueVB0clZlY3Rvci5oIC0gJ05vcm1hbGx5IHRpbnknIHZlY3RvcnMgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1RJTllQVFJWRUNUT1JfSAorI2RlZmluZSBMTFZNX0FEVF9USU5ZUFRSVkVDVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJVbmlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBUaW55UHRyVmVjdG9yIC0gVGhpcyBjbGFzcyBpcyBzcGVjaWFsaXplZCBmb3IgY2FzZXMgd2hlcmUgdGhlcmUgYXJlCisvLy8gbm9ybWFsbHkgMCBvciAxIGVsZW1lbnQgaW4gYSB2ZWN0b3IsIGJ1dCBpcyBnZW5lcmFsIGVub3VnaCB0byBnbyBiZXlvbmQgdGhhdAorLy8vIHdoZW4gcmVxdWlyZWQuCisvLy8KKy8vLyBOT1RFOiBUaGlzIGNvbnRhaW5lciBkb2Vzbid0IGFsbG93IHlvdSB0byBzdG9yZSBhIG51bGwgcG9pbnRlciBpbnRvIGl0LgorLy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWx0VHk+CitjbGFzcyBUaW55UHRyVmVjdG9yIHsKK3B1YmxpYzoKKyAgdXNpbmcgVmVjVHkgPSBTbWFsbFZlY3RvcjxFbHRUeSwgND47CisgIHVzaW5nIHZhbHVlX3R5cGUgPSB0eXBlbmFtZSBWZWNUeTo6dmFsdWVfdHlwZTsKKyAgdXNpbmcgUHRyVW5pb24gPSBQb2ludGVyVW5pb248RWx0VHksIFZlY1R5ICo+OworCitwcml2YXRlOgorICBQdHJVbmlvbiBWYWw7CisKK3B1YmxpYzoKKyAgVGlueVB0clZlY3RvcigpID0gZGVmYXVsdDsKKworICB+VGlueVB0clZlY3RvcigpIHsKKyAgICBpZiAoVmVjVHkgKlYgPSBWYWwudGVtcGxhdGUgZHluX2Nhc3Q8VmVjVHkqPigpKQorICAgICAgZGVsZXRlIFY7CisgIH0KKworICBUaW55UHRyVmVjdG9yKGNvbnN0IFRpbnlQdHJWZWN0b3IgJlJIUykgOiBWYWwoUkhTLlZhbCkgeworICAgIGlmIChWZWNUeSAqViA9IFZhbC50ZW1wbGF0ZSBkeW5fY2FzdDxWZWNUeSo+KCkpCisgICAgICBWYWwgPSBuZXcgVmVjVHkoKlYpOworICB9CisKKyAgVGlueVB0clZlY3RvciAmb3BlcmF0b3I9KGNvbnN0IFRpbnlQdHJWZWN0b3IgJlJIUykgeworICAgIGlmICh0aGlzID09ICZSSFMpCisgICAgICByZXR1cm4gKnRoaXM7CisgICAgaWYgKFJIUy5lbXB0eSgpKSB7CisgICAgICB0aGlzLT5jbGVhcigpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIC8vIFRyeSB0byBzcXVlZXplIGludG8gdGhlIHNpbmdsZSBzbG90LiBJZiBpdCB3b24ndCBmaXQsIGFsbG9jYXRlIGEgY29waWVkCisgICAgLy8gdmVjdG9yLgorICAgIGlmIChWYWwudGVtcGxhdGUgaXM8RWx0VHk+KCkpIHsKKyAgICAgIGlmIChSSFMuc2l6ZSgpID09IDEpCisgICAgICAgIFZhbCA9IFJIUy5mcm9udCgpOworICAgICAgZWxzZQorICAgICAgICBWYWwgPSBuZXcgVmVjVHkoKlJIUy5WYWwudGVtcGxhdGUgZ2V0PFZlY1R5Kj4oKSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgLy8gSWYgd2UgaGF2ZSBhIGZ1bGwgdmVjdG9yIGFsbG9jYXRlZCwgdHJ5IHRvIHJlLXVzZSBpdC4KKyAgICBpZiAoUkhTLlZhbC50ZW1wbGF0ZSBpczxFbHRUeT4oKSkgeworICAgICAgVmFsLnRlbXBsYXRlIGdldDxWZWNUeSo+KCktPmNsZWFyKCk7CisgICAgICBWYWwudGVtcGxhdGUgZ2V0PFZlY1R5Kj4oKS0+cHVzaF9iYWNrKFJIUy5mcm9udCgpKTsKKyAgICB9IGVsc2UgeworICAgICAgKlZhbC50ZW1wbGF0ZSBnZXQ8VmVjVHkqPigpID0gKlJIUy5WYWwudGVtcGxhdGUgZ2V0PFZlY1R5Kj4oKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVGlueVB0clZlY3RvcihUaW55UHRyVmVjdG9yICYmUkhTKSA6IFZhbChSSFMuVmFsKSB7CisgICAgUkhTLlZhbCA9IChFbHRUeSludWxscHRyOworICB9CisKKyAgVGlueVB0clZlY3RvciAmb3BlcmF0b3I9KFRpbnlQdHJWZWN0b3IgJiZSSFMpIHsKKyAgICBpZiAodGhpcyA9PSAmUkhTKQorICAgICAgcmV0dXJuICp0aGlzOworICAgIGlmIChSSFMuZW1wdHkoKSkgeworICAgICAgdGhpcy0+Y2xlYXIoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLyBJZiB0aGlzIHZlY3RvciBoYXMgYmVlbiBhbGxvY2F0ZWQgb24gdGhlIGhlYXAsIHJlLXVzZSBpdCBpZiBjaGVhcC4gSWYgaXQKKyAgICAvLyB3b3VsZCByZXF1aXJlIG1vcmUgY29weWluZywganVzdCBkZWxldGUgaXQgYW5kIHdlJ2xsIHN0ZWFsIHRoZSBvdGhlcgorICAgIC8vIHNpZGUuCisgICAgaWYgKFZlY1R5ICpWID0gVmFsLnRlbXBsYXRlIGR5bl9jYXN0PFZlY1R5Kj4oKSkgeworICAgICAgaWYgKFJIUy5WYWwudGVtcGxhdGUgaXM8RWx0VHk+KCkpIHsKKyAgICAgICAgVi0+Y2xlYXIoKTsKKyAgICAgICAgVi0+cHVzaF9iYWNrKFJIUy5mcm9udCgpKTsKKyAgICAgICAgUkhTLlZhbCA9IChFbHRUeSludWxscHRyOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgICBkZWxldGUgVjsKKyAgICB9CisKKyAgICBWYWwgPSBSSFMuVmFsOworICAgIFJIUy5WYWwgPSAoRWx0VHkpbnVsbHB0cjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gQ29uc3RydWN0b3IgZnJvbSBhbiBBcnJheVJlZi4KKyAgLy8vCisgIC8vLyBUaGlzIGFsc28gaXMgYSBjb25zdHJ1Y3RvciBmb3IgaW5kaXZpZHVhbCBhcnJheSBlbGVtZW50cyBkdWUgdG8gdGhlIHNpbmdsZQorICAvLy8gZWxlbWVudCBjb25zdHJ1Y3RvciBmb3IgQXJyYXlSZWYuCisgIGV4cGxpY2l0IFRpbnlQdHJWZWN0b3IoQXJyYXlSZWY8RWx0VHk+IEVsdHMpCisgICAgICA6IFZhbChFbHRzLmVtcHR5KCkKKyAgICAgICAgICAgICAgICA/IFB0clVuaW9uKCkKKyAgICAgICAgICAgICAgICA6IEVsdHMuc2l6ZSgpID09IDEKKyAgICAgICAgICAgICAgICAgICAgICA/IFB0clVuaW9uKEVsdHNbMF0pCisgICAgICAgICAgICAgICAgICAgICAgOiBQdHJVbmlvbihuZXcgVmVjVHkoRWx0cy5iZWdpbigpLCBFbHRzLmVuZCgpKSkpIHt9CisKKyAgVGlueVB0clZlY3RvcihzaXplX3QgQ291bnQsIEVsdFR5IFZhbHVlKQorICAgICAgOiBWYWwoQ291bnQgPT0gMCA/IFB0clVuaW9uKCkKKyAgICAgICAgICAgICAgICAgICAgICAgOiBDb3VudCA9PSAxID8gUHRyVW5pb24oVmFsdWUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFB0clVuaW9uKG5ldyBWZWNUeShDb3VudCwgVmFsdWUpKSkge30KKworICAvLyBpbXBsaWNpdCBjb252ZXJzaW9uIG9wZXJhdG9yIHRvIEFycmF5UmVmLgorICBvcGVyYXRvciBBcnJheVJlZjxFbHRUeT4oKSBjb25zdCB7CisgICAgaWYgKFZhbC5pc051bGwoKSkKKyAgICAgIHJldHVybiBOb25lOworICAgIGlmIChWYWwudGVtcGxhdGUgaXM8RWx0VHk+KCkpCisgICAgICByZXR1cm4gKlZhbC5nZXRBZGRyT2ZQdHIxKCk7CisgICAgcmV0dXJuICpWYWwudGVtcGxhdGUgZ2V0PFZlY1R5Kj4oKTsKKyAgfQorCisgIC8vIGltcGxpY2l0IGNvbnZlcnNpb24gb3BlcmF0b3IgdG8gTXV0YWJsZUFycmF5UmVmLgorICBvcGVyYXRvciBNdXRhYmxlQXJyYXlSZWY8RWx0VHk+KCkgeworICAgIGlmIChWYWwuaXNOdWxsKCkpCisgICAgICByZXR1cm4gTm9uZTsKKyAgICBpZiAoVmFsLnRlbXBsYXRlIGlzPEVsdFR5PigpKQorICAgICAgcmV0dXJuICpWYWwuZ2V0QWRkck9mUHRyMSgpOworICAgIHJldHVybiAqVmFsLnRlbXBsYXRlIGdldDxWZWNUeSo+KCk7CisgIH0KKworICAvLyBJbXBsaWNpdCBjb252ZXJzaW9uIHRvIEFycmF5UmVmPFU+IGlmIEVsdFR5KiBpbXBsaWNpdGx5IGNvbnZlcnRzIHRvIFUqLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLAorICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICAgIHN0ZDo6aXNfY29udmVydGlibGU8QXJyYXlSZWY8RWx0VHk+LCBBcnJheVJlZjxVPj46OnZhbHVlLAorICAgICAgICAgICAgICAgYm9vbD46OnR5cGUgPSBmYWxzZT4KKyAgb3BlcmF0b3IgQXJyYXlSZWY8VT4oKSBjb25zdCB7CisgICAgcmV0dXJuIG9wZXJhdG9yIEFycmF5UmVmPEVsdFR5PigpOworICB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICAvLyBUaGlzIHZlY3RvciBjYW4gYmUgZW1wdHkgaWYgaXQgY29udGFpbnMgbm8gZWxlbWVudCwgb3IgaWYgaXQKKyAgICAvLyBjb250YWlucyBhIHBvaW50ZXIgdG8gYW4gZW1wdHkgdmVjdG9yLgorICAgIGlmIChWYWwuaXNOdWxsKCkpIHJldHVybiB0cnVlOworICAgIGlmIChWZWNUeSAqVmVjID0gVmFsLnRlbXBsYXRlIGR5bl9jYXN0PFZlY1R5Kj4oKSkKKyAgICAgIHJldHVybiBWZWMtPmVtcHR5KCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsKKyAgICBpZiAoZW1wdHkoKSkKKyAgICAgIHJldHVybiAwOworICAgIGlmIChWYWwudGVtcGxhdGUgaXM8RWx0VHk+KCkpCisgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gVmFsLnRlbXBsYXRlIGdldDxWZWNUeSo+KCktPnNpemUoKTsKKyAgfQorCisgIHVzaW5nIGl0ZXJhdG9yID0gRWx0VHkgKjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBjb25zdCBFbHRUeSAqOworICB1c2luZyByZXZlcnNlX2l0ZXJhdG9yID0gc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPjsKKyAgdXNpbmcgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciA9IHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj47CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7CisgICAgaWYgKFZhbC50ZW1wbGF0ZSBpczxFbHRUeT4oKSkKKyAgICAgIHJldHVybiBWYWwuZ2V0QWRkck9mUHRyMSgpOworCisgICAgcmV0dXJuIFZhbC50ZW1wbGF0ZSBnZXQ8VmVjVHkgKj4oKS0+YmVnaW4oKTsKKyAgfQorCisgIGl0ZXJhdG9yIGVuZCgpIHsKKyAgICBpZiAoVmFsLnRlbXBsYXRlIGlzPEVsdFR5PigpKQorICAgICAgcmV0dXJuIGJlZ2luKCkgKyAoVmFsLmlzTnVsbCgpID8gMCA6IDEpOworCisgICAgcmV0dXJuIFZhbC50ZW1wbGF0ZSBnZXQ8VmVjVHkgKj4oKS0+ZW5kKCk7CisgIH0KKworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gKGNvbnN0X2l0ZXJhdG9yKWNvbnN0X2Nhc3Q8VGlueVB0clZlY3Rvcio+KHRoaXMpLT5iZWdpbigpOworICB9CisKKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeworICAgIHJldHVybiAoY29uc3RfaXRlcmF0b3IpY29uc3RfY2FzdDxUaW55UHRyVmVjdG9yKj4odGhpcyktPmVuZCgpOworICB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOyB9CisKKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOworICB9CisKKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOworICB9CisKKyAgRWx0VHkgb3BlcmF0b3JbXSh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KCFWYWwuaXNOdWxsKCkgJiYgImNhbid0IGluZGV4IGludG8gYW4gZW1wdHkgdmVjdG9yIik7CisgICAgaWYgKEVsdFR5IFYgPSBWYWwudGVtcGxhdGUgZHluX2Nhc3Q8RWx0VHk+KCkpIHsKKyAgICAgIGFzc2VydChpID09IDAgJiYgInRpbnl2ZWN0b3IgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgICByZXR1cm4gVjsKKyAgICB9CisKKyAgICBhc3NlcnQoaSA8IFZhbC50ZW1wbGF0ZSBnZXQ8VmVjVHkqPigpLT5zaXplKCkgJiYKKyAgICAgICAgICAgInRpbnl2ZWN0b3IgaW5kZXggb3V0IG9mIHJhbmdlIik7CisgICAgcmV0dXJuICgqVmFsLnRlbXBsYXRlIGdldDxWZWNUeSo+KCkpW2ldOworICB9CisKKyAgRWx0VHkgZnJvbnQoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFlbXB0eSgpICYmICJ2ZWN0b3IgZW1wdHkiKTsKKyAgICBpZiAoRWx0VHkgViA9IFZhbC50ZW1wbGF0ZSBkeW5fY2FzdDxFbHRUeT4oKSkKKyAgICAgIHJldHVybiBWOworICAgIHJldHVybiBWYWwudGVtcGxhdGUgZ2V0PFZlY1R5Kj4oKS0+ZnJvbnQoKTsKKyAgfQorCisgIEVsdFR5IGJhY2soKSBjb25zdCB7CisgICAgYXNzZXJ0KCFlbXB0eSgpICYmICJ2ZWN0b3IgZW1wdHkiKTsKKyAgICBpZiAoRWx0VHkgViA9IFZhbC50ZW1wbGF0ZSBkeW5fY2FzdDxFbHRUeT4oKSkKKyAgICAgIHJldHVybiBWOworICAgIHJldHVybiBWYWwudGVtcGxhdGUgZ2V0PFZlY1R5Kj4oKS0+YmFjaygpOworICB9CisKKyAgdm9pZCBwdXNoX2JhY2soRWx0VHkgTmV3VmFsKSB7CisgICAgYXNzZXJ0KE5ld1ZhbCAmJiAiQ2FuJ3QgYWRkIGEgbnVsbCB2YWx1ZSIpOworCisgICAgLy8gSWYgd2UgaGF2ZSBub3RoaW5nLCBhZGQgc29tZXRoaW5nLgorICAgIGlmIChWYWwuaXNOdWxsKCkpIHsKKyAgICAgIFZhbCA9IE5ld1ZhbDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBJZiB3ZSBoYXZlIGEgc2luZ2xlIHZhbHVlLCBjb252ZXJ0IHRvIGEgdmVjdG9yLgorICAgIGlmIChFbHRUeSBWID0gVmFsLnRlbXBsYXRlIGR5bl9jYXN0PEVsdFR5PigpKSB7CisgICAgICBWYWwgPSBuZXcgVmVjVHkoKTsKKyAgICAgIFZhbC50ZW1wbGF0ZSBnZXQ8VmVjVHkqPigpLT5wdXNoX2JhY2soVik7CisgICAgfQorCisgICAgLy8gQWRkIHRoZSBuZXcgdmFsdWUsIHdlIGtub3cgd2UgaGF2ZSBhIHZlY3Rvci4KKyAgICBWYWwudGVtcGxhdGUgZ2V0PFZlY1R5Kj4oKS0+cHVzaF9iYWNrKE5ld1ZhbCk7CisgIH0KKworICB2b2lkIHBvcF9iYWNrKCkgeworICAgIC8vIElmIHdlIGhhdmUgYSBzaW5nbGUgdmFsdWUsIGNvbnZlcnQgdG8gZW1wdHkuCisgICAgaWYgKFZhbC50ZW1wbGF0ZSBpczxFbHRUeT4oKSkKKyAgICAgIFZhbCA9IChFbHRUeSludWxscHRyOworICAgIGVsc2UgaWYgKFZlY1R5ICpWZWMgPSBWYWwudGVtcGxhdGUgZ2V0PFZlY1R5Kj4oKSkKKyAgICAgIFZlYy0+cG9wX2JhY2soKTsKKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgLy8gSWYgd2UgaGF2ZSBhIHNpbmdsZSB2YWx1ZSwgY29udmVydCB0byBlbXB0eS4KKyAgICBpZiAoVmFsLnRlbXBsYXRlIGlzPEVsdFR5PigpKSB7CisgICAgICBWYWwgPSAoRWx0VHkpbnVsbHB0cjsKKyAgICB9IGVsc2UgaWYgKFZlY1R5ICpWZWMgPSBWYWwudGVtcGxhdGUgZHluX2Nhc3Q8VmVjVHkqPigpKSB7CisgICAgICAvLyBJZiB3ZSBoYXZlIGEgdmVjdG9yIGZvcm0sIGp1c3QgY2xlYXIgaXQuCisgICAgICBWZWMtPmNsZWFyKCk7CisgICAgfQorICAgIC8vIE90aGVyd2lzZSwgd2UncmUgYWxyZWFkeSBlbXB0eS4KKyAgfQorCisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIEkpIHsKKyAgICBhc3NlcnQoSSA+PSBiZWdpbigpICYmICJJdGVyYXRvciB0byBlcmFzZSBpcyBvdXQgb2YgYm91bmRzLiIpOworICAgIGFzc2VydChJIDwgZW5kKCkgJiYgIkVyYXNpbmcgYXQgcGFzdC10aGUtZW5kIGl0ZXJhdG9yLiIpOworCisgICAgLy8gSWYgd2UgaGF2ZSBhIHNpbmdsZSB2YWx1ZSwgY29udmVydCB0byBlbXB0eS4KKyAgICBpZiAoVmFsLnRlbXBsYXRlIGlzPEVsdFR5PigpKSB7CisgICAgICBpZiAoSSA9PSBiZWdpbigpKQorICAgICAgICBWYWwgPSAoRWx0VHkpbnVsbHB0cjsKKyAgICB9IGVsc2UgaWYgKFZlY1R5ICpWZWMgPSBWYWwudGVtcGxhdGUgZHluX2Nhc3Q8VmVjVHkqPigpKSB7CisgICAgICAvLyBtdWx0aXBsZSBpdGVtcyBpbiBhIHZlY3RvcjsganVzdCBkbyB0aGUgZXJhc2UsIHRoZXJlIGlzIG5vCisgICAgICAvLyBiZW5lZml0IHRvIGNvbGxhcHNpbmcgYmFjayB0byBhIHBvaW50ZXIKKyAgICAgIHJldHVybiBWZWMtPmVyYXNlKEkpOworICAgIH0KKyAgICByZXR1cm4gZW5kKCk7CisgIH0KKworICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBTLCBpdGVyYXRvciBFKSB7CisgICAgYXNzZXJ0KFMgPj0gYmVnaW4oKSAmJiAiUmFuZ2UgdG8gZXJhc2UgaXMgb3V0IG9mIGJvdW5kcy4iKTsKKyAgICBhc3NlcnQoUyA8PSBFICYmICJUcnlpbmcgdG8gZXJhc2UgaW52YWxpZCByYW5nZS4iKTsKKyAgICBhc3NlcnQoRSA8PSBlbmQoKSAmJiAiVHJ5aW5nIHRvIGVyYXNlIHBhc3QgdGhlIGVuZC4iKTsKKworICAgIGlmIChWYWwudGVtcGxhdGUgaXM8RWx0VHk+KCkpIHsKKyAgICAgIGlmIChTID09IGJlZ2luKCkgJiYgUyAhPSBFKQorICAgICAgICBWYWwgPSAoRWx0VHkpbnVsbHB0cjsKKyAgICB9IGVsc2UgaWYgKFZlY1R5ICpWZWMgPSBWYWwudGVtcGxhdGUgZHluX2Nhc3Q8VmVjVHkqPigpKSB7CisgICAgICByZXR1cm4gVmVjLT5lcmFzZShTLCBFKTsKKyAgICB9CisgICAgcmV0dXJuIGVuZCgpOworICB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIEksIGNvbnN0IEVsdFR5ICZFbHQpIHsKKyAgICBhc3NlcnQoSSA+PSB0aGlzLT5iZWdpbigpICYmICJJbnNlcnRpb24gaXRlcmF0b3IgaXMgb3V0IG9mIGJvdW5kcy4iKTsKKyAgICBhc3NlcnQoSSA8PSB0aGlzLT5lbmQoKSAmJiAiSW5zZXJ0aW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgdmVjdG9yLiIpOworICAgIGlmIChJID09IGVuZCgpKSB7CisgICAgICBwdXNoX2JhY2soRWx0KTsKKyAgICAgIHJldHVybiBzdGQ6OnByZXYoZW5kKCkpOworICAgIH0KKyAgICBhc3NlcnQoIVZhbC5pc051bGwoKSAmJiAiTnVsbCB2YWx1ZSB3aXRoIG5vbi1lbmQgaW5zZXJ0IGl0ZXJhdG9yLiIpOworICAgIGlmIChFbHRUeSBWID0gVmFsLnRlbXBsYXRlIGR5bl9jYXN0PEVsdFR5PigpKSB7CisgICAgICBhc3NlcnQoSSA9PSBiZWdpbigpKTsKKyAgICAgIFZhbCA9IEVsdDsKKyAgICAgIHB1c2hfYmFjayhWKTsKKyAgICAgIHJldHVybiBiZWdpbigpOworICAgIH0KKworICAgIHJldHVybiBWYWwudGVtcGxhdGUgZ2V0PFZlY1R5Kj4oKS0+aW5zZXJ0KEksIEVsdCk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdFR5PgorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgSSwgSXRUeSBGcm9tLCBJdFR5IFRvKSB7CisgICAgYXNzZXJ0KEkgPj0gdGhpcy0+YmVnaW4oKSAmJiAiSW5zZXJ0aW9uIGl0ZXJhdG9yIGlzIG91dCBvZiBib3VuZHMuIik7CisgICAgYXNzZXJ0KEkgPD0gdGhpcy0+ZW5kKCkgJiYgIkluc2VydGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIHZlY3Rvci4iKTsKKyAgICBpZiAoRnJvbSA9PSBUbykKKyAgICAgIHJldHVybiBJOworCisgICAgLy8gSWYgd2UgaGF2ZSBhIHNpbmdsZSB2YWx1ZSwgY29udmVydCB0byBhIHZlY3Rvci4KKyAgICBwdHJkaWZmX3QgT2Zmc2V0ID0gSSAtIGJlZ2luKCk7CisgICAgaWYgKFZhbC5pc051bGwoKSkgeworICAgICAgaWYgKHN0ZDo6bmV4dChGcm9tKSA9PSBUbykgeworICAgICAgICBWYWwgPSAqRnJvbTsKKyAgICAgICAgcmV0dXJuIGJlZ2luKCk7CisgICAgICB9CisKKyAgICAgIFZhbCA9IG5ldyBWZWNUeSgpOworICAgIH0gZWxzZSBpZiAoRWx0VHkgViA9IFZhbC50ZW1wbGF0ZSBkeW5fY2FzdDxFbHRUeT4oKSkgeworICAgICAgVmFsID0gbmV3IFZlY1R5KCk7CisgICAgICBWYWwudGVtcGxhdGUgZ2V0PFZlY1R5Kj4oKS0+cHVzaF9iYWNrKFYpOworICAgIH0KKyAgICByZXR1cm4gVmFsLnRlbXBsYXRlIGdldDxWZWNUeSo+KCktPmluc2VydChiZWdpbigpICsgT2Zmc2V0LCBGcm9tLCBUbyk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9USU5ZUFRSVkVDVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1RyaXBsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvVHJpcGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGJhNTBkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1RyaXBsZS5oCkBAIC0wLDAgKzEsODA5IEBACisvLz09PS0tIGxsdm0vQURUL1RyaXBsZS5oIC0gVGFyZ2V0IHRyaXBsZSBoZWxwZXIgY2xhc3MgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1RSSVBMRV9ICisjZGVmaW5lIExMVk1fQURUX1RSSVBMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorCisvLyBTb21lIHN5c3RlbSBoZWFkZXJzIG9yIEdDQyBwcmVkZWZpbmVkIG1hY3JvcyBjb25mbGljdCB3aXRoIGlkZW50aWZpZXJzIGluCisvLyB0aGlzIGZpbGUuICBVbmRlZmluZSB0aGVtIGhlcmUuCisjdW5kZWYgTmV0QlNECisjdW5kZWYgbWlwcworI3VuZGVmIHNwYXJjCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFRyaXBsZSAtIEhlbHBlciBjbGFzcyBmb3Igd29ya2luZyB3aXRoIGF1dG9jb25mIGNvbmZpZ3VyYXRpb24gbmFtZXMuIEZvcgorLy8vIGhpc3RvcmljYWwgcmVhc29ucywgd2UgYWxzbyBjYWxsIHRoZXNlICd0cmlwbGVzJyAodGhleSB1c2VkIHRvIGNvbnRhaW4KKy8vLyBleGFjdGx5IHRocmVlIGZpZWxkcykuCisvLy8KKy8vLyBDb25maWd1cmF0aW9uIG5hbWVzIGFyZSBzdHJpbmdzIGluIHRoZSBjYW5vbmljYWwgZm9ybToKKy8vLyAgIEFSQ0hJVEVDVFVSRS1WRU5ET1ItT1BFUkFUSU5HX1NZU1RFTQorLy8vIG9yCisvLy8gICBBUkNISVRFQ1RVUkUtVkVORE9SLU9QRVJBVElOR19TWVNURU0tRU5WSVJPTk1FTlQKKy8vLworLy8vIFRoaXMgY2xhc3MgaXMgdXNlZCBmb3IgY2xpZW50cyB3aGljaCB3YW50IHRvIHN1cHBvcnQgYXJiaXRyYXJ5CisvLy8gY29uZmlndXJhdGlvbiBuYW1lcywgYnV0IGFsc28gd2FudCB0byBpbXBsZW1lbnQgY2VydGFpbiBzcGVjaWFsCisvLy8gYmVoYXZpb3IgZm9yIHBhcnRpY3VsYXIgY29uZmlndXJhdGlvbnMuIFRoaXMgY2xhc3MgaXNvbGF0ZXMgdGhlIG1hcHBpbmcKKy8vLyBmcm9tIHRoZSBjb21wb25lbnRzIG9mIHRoZSBjb25maWd1cmF0aW9uIG5hbWUgdG8gd2VsbCBrbm93biBJRHMuCisvLy8KKy8vLyBBdCBpdHMgY29yZSB0aGUgVHJpcGxlIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGJlIGEgd3JhcHBlciBmb3IgYSB0cmlwbGUKKy8vLyBzdHJpbmc7IHRoZSBjb25zdHJ1Y3RvciBkb2VzIG5vdCBjaGFuZ2Ugb3Igbm9ybWFsaXplIHRoZSB0cmlwbGUgc3RyaW5nLgorLy8vIENsaWVudHMgdGhhdCBuZWVkIHRvIGhhbmRsZSB0aGUgbm9uLWNhbm9uaWNhbCB0cmlwbGVzIHRoYXQgdXNlcnMgb2Z0ZW4KKy8vLyBzcGVjaWZ5IHNob3VsZCB1c2UgdGhlIG5vcm1hbGl6ZSBtZXRob2QuCisvLy8KKy8vLyBTZWUgYXV0b2NvbmYvY29uZmlnLmd1ZXNzIGZvciBhIGdsaW1wc2UgaW50byB3aGF0IGNvbmZpZ3VyYXRpb24gbmFtZXMKKy8vLyBsb29rIGxpa2UgaW4gcHJhY3RpY2UuCitjbGFzcyBUcmlwbGUgeworcHVibGljOgorICBlbnVtIEFyY2hUeXBlIHsKKyAgICBVbmtub3duQXJjaCwKKworICAgIGFybSwgICAgICAgICAgICAvLyBBUk0gKGxpdHRsZSBlbmRpYW4pOiBhcm0sIGFybXYuKiwgeHNjYWxlCisgICAgYXJtZWIsICAgICAgICAgIC8vIEFSTSAoYmlnIGVuZGlhbik6IGFybWViCisgICAgYWFyY2g2NCwgICAgICAgIC8vIEFBcmNoNjQgKGxpdHRsZSBlbmRpYW4pOiBhYXJjaDY0CisgICAgYWFyY2g2NF9iZSwgICAgIC8vIEFBcmNoNjQgKGJpZyBlbmRpYW4pOiBhYXJjaDY0X2JlCisgICAgYXJjLCAgICAgICAgICAgIC8vIEFSQzogU3lub3BzeXMgQVJDCisgICAgYXZyLCAgICAgICAgICAgIC8vIEFWUjogQXRtZWwgQVZSIG1pY3JvY29udHJvbGxlcgorICAgIGJwZmVsLCAgICAgICAgICAvLyBlQlBGIG9yIGV4dGVuZGVkIEJQRiBvciA2NC1iaXQgQlBGIChsaXR0bGUgZW5kaWFuKQorICAgIGJwZmViLCAgICAgICAgICAvLyBlQlBGIG9yIGV4dGVuZGVkIEJQRiBvciA2NC1iaXQgQlBGIChiaWcgZW5kaWFuKQorICAgIGhleGFnb24sICAgICAgICAvLyBIZXhhZ29uOiBoZXhhZ29uCisgICAgbWlwcywgICAgICAgICAgIC8vIE1JUFM6IG1pcHMsIG1pcHNhbGxlZ3JleAorICAgIG1pcHNlbCwgICAgICAgICAvLyBNSVBTRUw6IG1pcHNlbCwgbWlwc2FsbGVncmV4ZWwKKyAgICBtaXBzNjQsICAgICAgICAgLy8gTUlQUzY0OiBtaXBzNjQKKyAgICBtaXBzNjRlbCwgICAgICAgLy8gTUlQUzY0RUw6IG1pcHM2NGVsCisgICAgbXNwNDMwLCAgICAgICAgIC8vIE1TUDQzMDogbXNwNDMwCisgICAgbmlvczIsICAgICAgICAgIC8vIE5JT1NJSTogbmlvczIKKyAgICBwcGMsICAgICAgICAgICAgLy8gUFBDOiBwb3dlcnBjCisgICAgcHBjNjQsICAgICAgICAgIC8vIFBQQzY0OiBwb3dlcnBjNjQsIHBwdQorICAgIHBwYzY0bGUsICAgICAgICAvLyBQUEM2NExFOiBwb3dlcnBjNjRsZQorICAgIHI2MDAsICAgICAgICAgICAvLyBSNjAwOiBBTUQgR1BVcyBIRDJYWFggLSBIRDZYWFgKKyAgICBhbWRnY24sICAgICAgICAgLy8gQU1ER0NOOiBBTUQgR0NOIEdQVXMKKyAgICByaXNjdjMyLCAgICAgICAgLy8gUklTQy1WICgzMi1iaXQpOiByaXNjdjMyCisgICAgcmlzY3Y2NCwgICAgICAgIC8vIFJJU0MtViAoNjQtYml0KTogcmlzY3Y2NAorICAgIHNwYXJjLCAgICAgICAgICAvLyBTcGFyYzogc3BhcmMKKyAgICBzcGFyY3Y5LCAgICAgICAgLy8gU3BhcmN2OTogU3BhcmN2OQorICAgIHNwYXJjZWwsICAgICAgICAvLyBTcGFyYzogKGVuZGlhbm5lc3MgPSBsaXR0bGUpLiBOQjogJ1NwYXJjbGUnIGlzIGEgQ1BVIHZhcmlhbnQKKyAgICBzeXN0ZW16LCAgICAgICAgLy8gU3lzdGVtWjogczM5MHgKKyAgICB0Y2UsICAgICAgICAgICAgLy8gVENFIChodHRwOi8vdGNlLmNzLnR1dC5maS8pOiB0Y2UKKyAgICB0Y2VsZSwgICAgICAgICAgLy8gVENFIGxpdHRsZSBlbmRpYW4gKGh0dHA6Ly90Y2UuY3MudHV0LmZpLyk6IHRjZWxlCisgICAgdGh1bWIsICAgICAgICAgIC8vIFRodW1iIChsaXR0bGUgZW5kaWFuKTogdGh1bWIsIHRodW1idi4qCisgICAgdGh1bWJlYiwgICAgICAgIC8vIFRodW1iIChiaWcgZW5kaWFuKTogdGh1bWJlYgorICAgIHg4NiwgICAgICAgICAgICAvLyBYODY6IGlbMy05XTg2CisgICAgeDg2XzY0LCAgICAgICAgIC8vIFg4Ni02NDogYW1kNjQsIHg4Nl82NAorICAgIHhjb3JlLCAgICAgICAgICAvLyBYQ29yZTogeGNvcmUKKyAgICBudnB0eCwgICAgICAgICAgLy8gTlZQVFg6IDMyLWJpdAorICAgIG52cHR4NjQsICAgICAgICAvLyBOVlBUWDogNjQtYml0CisgICAgbGUzMiwgICAgICAgICAgIC8vIGxlMzI6IGdlbmVyaWMgbGl0dGxlLWVuZGlhbiAzMi1iaXQgQ1BVIChQTmFDbCkKKyAgICBsZTY0LCAgICAgICAgICAgLy8gbGU2NDogZ2VuZXJpYyBsaXR0bGUtZW5kaWFuIDY0LWJpdCBDUFUgKFBOYUNsKQorICAgIGFtZGlsLCAgICAgICAgICAvLyBBTURJTAorICAgIGFtZGlsNjQsICAgICAgICAvLyBBTURJTCB3aXRoIDY0LWJpdCBwb2ludGVycworICAgIGhzYWlsLCAgICAgICAgICAvLyBBTUQgSFNBSUwKKyAgICBoc2FpbDY0LCAgICAgICAgLy8gQU1EIEhTQUlMIHdpdGggNjQtYml0IHBvaW50ZXJzCisgICAgc3BpciwgICAgICAgICAgIC8vIFNQSVI6IHN0YW5kYXJkIHBvcnRhYmxlIElSIGZvciBPcGVuQ0wgMzItYml0IHZlcnNpb24KKyAgICBzcGlyNjQsICAgICAgICAgLy8gU1BJUjogc3RhbmRhcmQgcG9ydGFibGUgSVIgZm9yIE9wZW5DTCA2NC1iaXQgdmVyc2lvbgorICAgIGthbGltYmEsICAgICAgICAvLyBLYWxpbWJhOiBnZW5lcmljIGthbGltYmEKKyAgICBzaGF2ZSwgICAgICAgICAgLy8gU0hBVkU6IE1vdmlkaXVzIHZlY3RvciBWTElXIHByb2Nlc3NvcnMKKyAgICBsYW5haSwgICAgICAgICAgLy8gTGFuYWk6IExhbmFpIDMyLWJpdAorICAgIHdhc20zMiwgICAgICAgICAvLyBXZWJBc3NlbWJseSB3aXRoIDMyLWJpdCBwb2ludGVycworICAgIHdhc202NCwgICAgICAgICAvLyBXZWJBc3NlbWJseSB3aXRoIDY0LWJpdCBwb2ludGVycworICAgIHJlbmRlcnNjcmlwdDMyLCAvLyAzMi1iaXQgUmVuZGVyU2NyaXB0CisgICAgcmVuZGVyc2NyaXB0NjQsIC8vIDY0LWJpdCBSZW5kZXJTY3JpcHQKKyAgICBMYXN0QXJjaFR5cGUgPSByZW5kZXJzY3JpcHQ2NAorICB9OworICBlbnVtIFN1YkFyY2hUeXBlIHsKKyAgICBOb1N1YkFyY2gsCisKKyAgICBBUk1TdWJBcmNoX3Y4XzNhLAorICAgIEFSTVN1YkFyY2hfdjhfMmEsCisgICAgQVJNU3ViQXJjaF92OF8xYSwKKyAgICBBUk1TdWJBcmNoX3Y4LAorICAgIEFSTVN1YkFyY2hfdjhyLAorICAgIEFSTVN1YkFyY2hfdjhtX2Jhc2VsaW5lLAorICAgIEFSTVN1YkFyY2hfdjhtX21haW5saW5lLAorICAgIEFSTVN1YkFyY2hfdjcsCisgICAgQVJNU3ViQXJjaF92N2VtLAorICAgIEFSTVN1YkFyY2hfdjdtLAorICAgIEFSTVN1YkFyY2hfdjdzLAorICAgIEFSTVN1YkFyY2hfdjdrLAorICAgIEFSTVN1YkFyY2hfdjd2ZSwKKyAgICBBUk1TdWJBcmNoX3Y2LAorICAgIEFSTVN1YkFyY2hfdjZtLAorICAgIEFSTVN1YkFyY2hfdjZrLAorICAgIEFSTVN1YkFyY2hfdjZ0MiwKKyAgICBBUk1TdWJBcmNoX3Y1LAorICAgIEFSTVN1YkFyY2hfdjV0ZSwKKyAgICBBUk1TdWJBcmNoX3Y0dCwKKworICAgIEthbGltYmFTdWJBcmNoX3YzLAorICAgIEthbGltYmFTdWJBcmNoX3Y0LAorICAgIEthbGltYmFTdWJBcmNoX3Y1CisgIH07CisgIGVudW0gVmVuZG9yVHlwZSB7CisgICAgVW5rbm93blZlbmRvciwKKworICAgIEFwcGxlLAorICAgIFBDLAorICAgIFNDRUksCisgICAgQkdQLAorICAgIEJHUSwKKyAgICBGcmVlc2NhbGUsCisgICAgSUJNLAorICAgIEltYWdpbmF0aW9uVGVjaG5vbG9naWVzLAorICAgIE1pcHNUZWNobm9sb2dpZXMsCisgICAgTlZJRElBLAorICAgIENTUiwKKyAgICBNeXJpYWQsCisgICAgQU1ELAorICAgIE1lc2EsCisgICAgU1VTRSwKKyAgICBMYXN0VmVuZG9yVHlwZSA9IFNVU0UKKyAgfTsKKyAgZW51bSBPU1R5cGUgeworICAgIFVua25vd25PUywKKworICAgIEFuYW5hcywKKyAgICBDbG91ZEFCSSwKKyAgICBEYXJ3aW4sCisgICAgRHJhZ29uRmx5LAorICAgIEZyZWVCU0QsCisgICAgRnVjaHNpYSwKKyAgICBJT1MsCisgICAgS0ZyZWVCU0QsCisgICAgTGludXgsCisgICAgTHYyLCAgICAgICAgLy8gUFMzCisgICAgTWFjT1NYLAorICAgIE5ldEJTRCwKKyAgICBPcGVuQlNELAorICAgIFNvbGFyaXMsCisgICAgV2luMzIsCisgICAgSGFpa3UsCisgICAgTWluaXgsCisgICAgUlRFTVMsCisgICAgTmFDbCwgICAgICAgLy8gTmF0aXZlIENsaWVudAorICAgIENOSywgICAgICAgIC8vIEJHL1AgQ29tcHV0ZS1Ob2RlIEtlcm5lbAorICAgIEFJWCwKKyAgICBDVURBLCAgICAgICAvLyBOVklESUEgQ1VEQQorICAgIE5WQ0wsICAgICAgIC8vIE5WSURJQSBPcGVuQ0wKKyAgICBBTURIU0EsICAgICAvLyBBTUQgSFNBIFJ1bnRpbWUKKyAgICBQUzQsCisgICAgRUxGSUFNQ1UsCisgICAgVHZPUywgICAgICAgLy8gQXBwbGUgdHZPUworICAgIFdhdGNoT1MsICAgIC8vIEFwcGxlIHdhdGNoT1MKKyAgICBNZXNhM0QsCisgICAgQ29udGlraSwKKyAgICBBTURQQUwsICAgICAvLyBBTUQgUEFMIFJ1bnRpbWUKKyAgICBMYXN0T1NUeXBlID0gQU1EUEFMCisgIH07CisgIGVudW0gRW52aXJvbm1lbnRUeXBlIHsKKyAgICBVbmtub3duRW52aXJvbm1lbnQsCisKKyAgICBHTlUsCisgICAgR05VQUJJTjMyLAorICAgIEdOVUFCSTY0LAorICAgIEdOVUVBQkksCisgICAgR05VRUFCSUhGLAorICAgIEdOVVgzMiwKKyAgICBDT0RFMTYsCisgICAgRUFCSSwKKyAgICBFQUJJSEYsCisgICAgQW5kcm9pZCwKKyAgICBNdXNsLAorICAgIE11c2xFQUJJLAorICAgIE11c2xFQUJJSEYsCisKKyAgICBNU1ZDLAorICAgIEl0YW5pdW0sCisgICAgQ3lnbnVzLAorICAgIENvcmVDTFIsCisgICAgU2ltdWxhdG9yLCAgLy8gU2ltdWxhdG9yIHZhcmlhbnRzIG9mIG90aGVyIHN5c3RlbXMsIGUuZy4sIEFwcGxlJ3MgaU9TCisgICAgTGFzdEVudmlyb25tZW50VHlwZSA9IFNpbXVsYXRvcgorICB9OworICBlbnVtIE9iamVjdEZvcm1hdFR5cGUgeworICAgIFVua25vd25PYmplY3RGb3JtYXQsCisKKyAgICBDT0ZGLAorICAgIEVMRiwKKyAgICBNYWNoTywKKyAgICBXYXNtLAorICB9OworCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBEYXRhOworCisgIC8vLyBUaGUgcGFyc2VkIGFyY2ggdHlwZS4KKyAgQXJjaFR5cGUgQXJjaDsKKworICAvLy8gVGhlIHBhcnNlZCBzdWJhcmNoaXRlY3R1cmUgdHlwZS4KKyAgU3ViQXJjaFR5cGUgU3ViQXJjaDsKKworICAvLy8gVGhlIHBhcnNlZCB2ZW5kb3IgdHlwZS4KKyAgVmVuZG9yVHlwZSBWZW5kb3I7CisKKyAgLy8vIFRoZSBwYXJzZWQgT1MgdHlwZS4KKyAgT1NUeXBlIE9TOworCisgIC8vLyBUaGUgcGFyc2VkIEVudmlyb25tZW50IHR5cGUuCisgIEVudmlyb25tZW50VHlwZSBFbnZpcm9ubWVudDsKKworICAvLy8gVGhlIG9iamVjdCBmb3JtYXQgdHlwZS4KKyAgT2JqZWN0Rm9ybWF0VHlwZSBPYmplY3RGb3JtYXQ7CisKK3B1YmxpYzoKKyAgLy8vIEBuYW1lIENvbnN0cnVjdG9ycworICAvLy8gQHsKKworICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciBpcyB0aGUgc2FtZSBhcyBhbiBlbXB0eSBzdHJpbmcgYW5kIGxlYXZlcyBhbGwKKyAgLy8vIHRyaXBsZSBmaWVsZHMgdW5rbm93bi4KKyAgVHJpcGxlKCkKKyAgICAgIDogRGF0YSgpLCBBcmNoKCksIFN1YkFyY2goKSwgVmVuZG9yKCksIE9TKCksIEVudmlyb25tZW50KCksCisgICAgICAgIE9iamVjdEZvcm1hdCgpIHt9CisKKyAgZXhwbGljaXQgVHJpcGxlKGNvbnN0IFR3aW5lICZTdHIpOworICBUcmlwbGUoY29uc3QgVHdpbmUgJkFyY2hTdHIsIGNvbnN0IFR3aW5lICZWZW5kb3JTdHIsIGNvbnN0IFR3aW5lICZPU1N0cik7CisgIFRyaXBsZShjb25zdCBUd2luZSAmQXJjaFN0ciwgY29uc3QgVHdpbmUgJlZlbmRvclN0ciwgY29uc3QgVHdpbmUgJk9TU3RyLAorICAgICAgICAgY29uc3QgVHdpbmUgJkVudmlyb25tZW50U3RyKTsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgVHJpcGxlICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBBcmNoID09IE90aGVyLkFyY2ggJiYgU3ViQXJjaCA9PSBPdGhlci5TdWJBcmNoICYmCisgICAgICAgICAgIFZlbmRvciA9PSBPdGhlci5WZW5kb3IgJiYgT1MgPT0gT3RoZXIuT1MgJiYKKyAgICAgICAgICAgRW52aXJvbm1lbnQgPT0gT3RoZXIuRW52aXJvbm1lbnQgJiYKKyAgICAgICAgICAgT2JqZWN0Rm9ybWF0ID09IE90aGVyLk9iamVjdEZvcm1hdDsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUcmlwbGUgJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gT3RoZXIpOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBOb3JtYWxpemF0aW9uCisgIC8vLyBAeworCisgIC8vLyBub3JtYWxpemUgLSBUdXJuIGFuIGFyYml0cmFyeSBtYWNoaW5lIHNwZWNpZmljYXRpb24gaW50byB0aGUgY2Fub25pY2FsCisgIC8vLyB0cmlwbGUgZm9ybSAob3Igc29tZXRoaW5nIHNlbnNpYmxlIHRoYXQgdGhlIFRyaXBsZSBjbGFzcyB1bmRlcnN0YW5kcyBpZgorICAvLy8gbm90aGluZyBiZXR0ZXIgY2FuIHJlYXNvbmFibHkgYmUgZG9uZSkuICBJbiBwYXJ0aWN1bGFyLCBpdCBoYW5kbGVzIHRoZQorICAvLy8gY29tbW9uIGNhc2UgaW4gd2hpY2ggb3RoZXJ3aXNlIHZhbGlkIGNvbXBvbmVudHMgYXJlIGluIHRoZSB3cm9uZyBvcmRlci4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIG5vcm1hbGl6ZShTdHJpbmdSZWYgU3RyKTsKKworICAvLy8gUmV0dXJuIHRoZSBub3JtYWxpemVkIGZvcm0gb2YgdGhpcyB0cmlwbGUncyBzdHJpbmcuCisgIHN0ZDo6c3RyaW5nIG5vcm1hbGl6ZSgpIGNvbnN0IHsgcmV0dXJuIG5vcm1hbGl6ZShEYXRhKTsgfQorCisgIC8vLyBAfQorICAvLy8gQG5hbWUgVHlwZWQgQ29tcG9uZW50IEFjY2VzcworICAvLy8gQHsKKworICAvLy8gZ2V0QXJjaCAtIEdldCB0aGUgcGFyc2VkIGFyY2hpdGVjdHVyZSB0eXBlIG9mIHRoaXMgdHJpcGxlLgorICBBcmNoVHlwZSBnZXRBcmNoKCkgY29uc3QgeyByZXR1cm4gQXJjaDsgfQorCisgIC8vLyBnZXRTdWJBcmNoIC0gZ2V0IHRoZSBwYXJzZWQgc3ViYXJjaGl0ZWN0dXJlIHR5cGUgZm9yIHRoaXMgdHJpcGxlLgorICBTdWJBcmNoVHlwZSBnZXRTdWJBcmNoKCkgY29uc3QgeyByZXR1cm4gU3ViQXJjaDsgfQorCisgIC8vLyBnZXRWZW5kb3IgLSBHZXQgdGhlIHBhcnNlZCB2ZW5kb3IgdHlwZSBvZiB0aGlzIHRyaXBsZS4KKyAgVmVuZG9yVHlwZSBnZXRWZW5kb3IoKSBjb25zdCB7IHJldHVybiBWZW5kb3I7IH0KKworICAvLy8gZ2V0T1MgLSBHZXQgdGhlIHBhcnNlZCBvcGVyYXRpbmcgc3lzdGVtIHR5cGUgb2YgdGhpcyB0cmlwbGUuCisgIE9TVHlwZSBnZXRPUygpIGNvbnN0IHsgcmV0dXJuIE9TOyB9CisKKyAgLy8vIGhhc0Vudmlyb25tZW50IC0gRG9lcyB0aGlzIHRyaXBsZSBoYXZlIHRoZSBvcHRpb25hbCBlbnZpcm9ubWVudAorICAvLy8gKGZvdXJ0aCkgY29tcG9uZW50PworICBib29sIGhhc0Vudmlyb25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBnZXRFbnZpcm9ubWVudE5hbWUoKSAhPSAiIjsKKyAgfQorCisgIC8vLyBnZXRFbnZpcm9ubWVudCAtIEdldCB0aGUgcGFyc2VkIGVudmlyb25tZW50IHR5cGUgb2YgdGhpcyB0cmlwbGUuCisgIEVudmlyb25tZW50VHlwZSBnZXRFbnZpcm9ubWVudCgpIGNvbnN0IHsgcmV0dXJuIEVudmlyb25tZW50OyB9CisKKyAgLy8vIFBhcnNlIHRoZSB2ZXJzaW9uIG51bWJlciBmcm9tIHRoZSBPUyBuYW1lIGNvbXBvbmVudCBvZiB0aGUKKyAgLy8vIHRyaXBsZSwgaWYgcHJlc2VudC4KKyAgLy8vCisgIC8vLyBGb3IgZXhhbXBsZSwgImZvb29zMS4yLjMiIHdvdWxkIHJldHVybiAoMSwgMiwgMykuCisgIC8vLworICAvLy8gSWYgYW4gZW50cnkgaXMgbm90IGRlZmluZWQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgYXMgMC4KKyAgdm9pZCBnZXRFbnZpcm9ubWVudFZlcnNpb24odW5zaWduZWQgJk1ham9yLCB1bnNpZ25lZCAmTWlub3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZNaWNybykgY29uc3Q7CisKKyAgLy8vIGdldEZvcm1hdCAtIEdldCB0aGUgb2JqZWN0IGZvcm1hdCBmb3IgdGhpcyB0cmlwbGUuCisgIE9iamVjdEZvcm1hdFR5cGUgZ2V0T2JqZWN0Rm9ybWF0KCkgY29uc3QgeyByZXR1cm4gT2JqZWN0Rm9ybWF0OyB9CisKKyAgLy8vIGdldE9TVmVyc2lvbiAtIFBhcnNlIHRoZSB2ZXJzaW9uIG51bWJlciBmcm9tIHRoZSBPUyBuYW1lIGNvbXBvbmVudCBvZiB0aGUKKyAgLy8vIHRyaXBsZSwgaWYgcHJlc2VudC4KKyAgLy8vCisgIC8vLyBGb3IgZXhhbXBsZSwgImZvb29zMS4yLjMiIHdvdWxkIHJldHVybiAoMSwgMiwgMykuCisgIC8vLworICAvLy8gSWYgYW4gZW50cnkgaXMgbm90IGRlZmluZWQsIGl0IHdpbGwgYmUgcmV0dXJuZWQgYXMgMC4KKyAgdm9pZCBnZXRPU1ZlcnNpb24odW5zaWduZWQgJk1ham9yLCB1bnNpZ25lZCAmTWlub3IsIHVuc2lnbmVkICZNaWNybykgY29uc3Q7CisKKyAgLy8vIGdldE9TTWFqb3JWZXJzaW9uIC0gUmV0dXJuIGp1c3QgdGhlIG1ham9yIHZlcnNpb24gbnVtYmVyLCB0aGlzIGlzCisgIC8vLyBzcGVjaWFsaXplZCBiZWNhdXNlIGl0IGlzIGEgY29tbW9uIHF1ZXJ5LgorICB1bnNpZ25lZCBnZXRPU01ham9yVmVyc2lvbigpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBNYWosIE1pbiwgTWljcm87CisgICAgZ2V0T1NWZXJzaW9uKE1haiwgTWluLCBNaWNybyk7CisgICAgcmV0dXJuIE1hajsKKyAgfQorCisgIC8vLyBnZXRNYWNPU1hWZXJzaW9uIC0gUGFyc2UgdGhlIHZlcnNpb24gbnVtYmVyIGFzIHdpdGggZ2V0T1NWZXJzaW9uIGFuZCB0aGVuCisgIC8vLyB0cmFuc2xhdGUgZ2VuZXJpYyAiZGFyd2luIiB2ZXJzaW9ucyB0byB0aGUgY29ycmVzcG9uZGluZyBPUyBYIHZlcnNpb25zLgorICAvLy8gVGhpcyBtYXkgYWxzbyBiZSBjYWxsZWQgd2l0aCBJT1MgdHJpcGxlcyBidXQgdGhlIE9TIFggdmVyc2lvbiBudW1iZXIgaXMKKyAgLy8vIGp1c3Qgc2V0IHRvIGEgY29uc3RhbnQgMTAuNC4wIGluIHRoYXQgY2FzZS4gIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLgorICBib29sIGdldE1hY09TWFZlcnNpb24odW5zaWduZWQgJk1ham9yLCB1bnNpZ25lZCAmTWlub3IsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTWljcm8pIGNvbnN0OworCisgIC8vLyBnZXRpT1NWZXJzaW9uIC0gUGFyc2UgdGhlIHZlcnNpb24gbnVtYmVyIGFzIHdpdGggZ2V0T1NWZXJzaW9uLiAgVGhpcyBzaG91bGQKKyAgLy8vIG9ubHkgYmUgY2FsbGVkIHdpdGggSU9TIG9yIGdlbmVyaWMgdHJpcGxlcy4KKyAgdm9pZCBnZXRpT1NWZXJzaW9uKHVuc2lnbmVkICZNYWpvciwgdW5zaWduZWQgJk1pbm9yLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk1pY3JvKSBjb25zdDsKKworICAvLy8gZ2V0V2F0Y2hPU1ZlcnNpb24gLSBQYXJzZSB0aGUgdmVyc2lvbiBudW1iZXIgYXMgd2l0aCBnZXRPU1ZlcnNpb24uICBUaGlzCisgIC8vLyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2l0aCBXYXRjaE9TIG9yIGdlbmVyaWMgdHJpcGxlcy4KKyAgdm9pZCBnZXRXYXRjaE9TVmVyc2lvbih1bnNpZ25lZCAmTWFqb3IsIHVuc2lnbmVkICZNaW5vciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmTWljcm8pIGNvbnN0OworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgRGlyZWN0IENvbXBvbmVudCBBY2Nlc3MKKyAgLy8vIEB7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJnN0cigpIGNvbnN0IHsgcmV0dXJuIERhdGE7IH0KKworICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0VHJpcGxlKCkgY29uc3QgeyByZXR1cm4gRGF0YTsgfQorCisgIC8vLyBnZXRBcmNoTmFtZSAtIEdldCB0aGUgYXJjaGl0ZWN0dXJlIChmaXJzdCkgY29tcG9uZW50IG9mIHRoZQorICAvLy8gdHJpcGxlLgorICBTdHJpbmdSZWYgZ2V0QXJjaE5hbWUoKSBjb25zdDsKKworICAvLy8gZ2V0VmVuZG9yTmFtZSAtIEdldCB0aGUgdmVuZG9yIChzZWNvbmQpIGNvbXBvbmVudCBvZiB0aGUgdHJpcGxlLgorICBTdHJpbmdSZWYgZ2V0VmVuZG9yTmFtZSgpIGNvbnN0OworCisgIC8vLyBnZXRPU05hbWUgLSBHZXQgdGhlIG9wZXJhdGluZyBzeXN0ZW0gKHRoaXJkKSBjb21wb25lbnQgb2YgdGhlCisgIC8vLyB0cmlwbGUuCisgIFN0cmluZ1JlZiBnZXRPU05hbWUoKSBjb25zdDsKKworICAvLy8gZ2V0RW52aXJvbm1lbnROYW1lIC0gR2V0IHRoZSBvcHRpb25hbCBlbnZpcm9ubWVudCAoZm91cnRoKQorICAvLy8gY29tcG9uZW50IG9mIHRoZSB0cmlwbGUsIG9yICIiIGlmIGVtcHR5LgorICBTdHJpbmdSZWYgZ2V0RW52aXJvbm1lbnROYW1lKCkgY29uc3Q7CisKKyAgLy8vIGdldE9TQW5kRW52aXJvbm1lbnROYW1lIC0gR2V0IHRoZSBvcGVyYXRpbmcgc3lzdGVtIGFuZCBvcHRpb25hbAorICAvLy8gZW52aXJvbm1lbnQgY29tcG9uZW50cyBhcyBhIHNpbmdsZSBzdHJpbmcgKHNlcGFyYXRlZCBieSBhICctJworICAvLy8gaWYgdGhlIGVudmlyb25tZW50IGNvbXBvbmVudCBpcyBwcmVzZW50KS4KKyAgU3RyaW5nUmVmIGdldE9TQW5kRW52aXJvbm1lbnROYW1lKCkgY29uc3Q7CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBDb252ZW5pZW5jZSBQcmVkaWNhdGVzCisgIC8vLyBAeworCisgIC8vLyBUZXN0IHdoZXRoZXIgdGhlIGFyY2hpdGVjdHVyZSBpcyA2NC1iaXQKKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyB0ZXN0cyBmb3IgNjQtYml0IHBvaW50ZXIgd2lkdGgsIGFuZCBub3RoaW5nIGVsc2UuIE5vdGUKKyAgLy8vIHRoYXQgd2UgaW50ZW50aW9uYWxseSBleHBvc2Ugb25seSB0aHJlZSBwcmVkaWNhdGVzLCA2NC1iaXQsIDMyLWJpdCwgYW5kCisgIC8vLyAxNi1iaXQuIFRoZSBpbm5lciBkZXRhaWxzIG9mIHBvaW50ZXIgd2lkdGggZm9yIHBhcnRpY3VsYXIgYXJjaGl0ZWN0dXJlcworICAvLy8gaXMgbm90IHN1bW1lZCB1cCBpbiB0aGUgdHJpcGxlLCBhbmQgc28gb25seSBhIGNvYXJzZSBncmFpbmVkIHByZWRpY2F0ZQorICAvLy8gc3lzdGVtIGlzIHByb3ZpZGVkLgorICBib29sIGlzQXJjaDY0Qml0KCkgY29uc3Q7CisKKyAgLy8vIFRlc3Qgd2hldGhlciB0aGUgYXJjaGl0ZWN0dXJlIGlzIDMyLWJpdAorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIHRlc3RzIGZvciAzMi1iaXQgcG9pbnRlciB3aWR0aCwgYW5kIG5vdGhpbmcgZWxzZS4KKyAgYm9vbCBpc0FyY2gzMkJpdCgpIGNvbnN0OworCisgIC8vLyBUZXN0IHdoZXRoZXIgdGhlIGFyY2hpdGVjdHVyZSBpcyAxNi1iaXQKKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyB0ZXN0cyBmb3IgMTYtYml0IHBvaW50ZXIgd2lkdGgsIGFuZCBub3RoaW5nIGVsc2UuCisgIGJvb2wgaXNBcmNoMTZCaXQoKSBjb25zdDsKKworICAvLy8gaXNPU1ZlcnNpb25MVCAtIEhlbHBlciBmdW5jdGlvbiBmb3IgZG9pbmcgY29tcGFyaXNvbnMgYWdhaW5zdCB2ZXJzaW9uCisgIC8vLyBudW1iZXJzIGluY2x1ZGVkIGluIHRoZSB0YXJnZXQgdHJpcGxlLgorICBib29sIGlzT1NWZXJzaW9uTFQodW5zaWduZWQgTWFqb3IsIHVuc2lnbmVkIE1pbm9yID0gMCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1pY3JvID0gMCkgY29uc3QgeworICAgIHVuc2lnbmVkIExIU1szXTsKKyAgICBnZXRPU1ZlcnNpb24oTEhTWzBdLCBMSFNbMV0sIExIU1syXSk7CisKKyAgICBpZiAoTEhTWzBdICE9IE1ham9yKQorICAgICAgcmV0dXJuIExIU1swXSA8IE1ham9yOworICAgIGlmIChMSFNbMV0gIT0gTWlub3IpCisgICAgICByZXR1cm4gTEhTWzFdIDwgTWlub3I7CisgICAgaWYgKExIU1syXSAhPSBNaWNybykKKyAgICAgIHJldHVybiBMSFNbMV0gPCBNaWNybzsKKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgaXNPU1ZlcnNpb25MVChjb25zdCBUcmlwbGUgJk90aGVyKSBjb25zdCB7CisgICAgdW5zaWduZWQgUkhTWzNdOworICAgIE90aGVyLmdldE9TVmVyc2lvbihSSFNbMF0sIFJIU1sxXSwgUkhTWzJdKTsKKyAgICByZXR1cm4gaXNPU1ZlcnNpb25MVChSSFNbMF0sIFJIU1sxXSwgUkhTWzJdKTsKKyAgfQorCisgIC8vLyBpc01hY09TWFZlcnNpb25MVCAtIENvbXBhcmlzb24gZnVuY3Rpb24gZm9yIGNoZWNraW5nIE9TIFggdmVyc2lvbgorICAvLy8gY29tcGF0aWJpbGl0eSwgd2hpY2ggaGFuZGxlcyBzdXBwb3J0aW5nIHNrZXdlZCB2ZXJzaW9uIG51bWJlcmluZyBzY2hlbWVzCisgIC8vLyB1c2VkIGJ5IHRoZSAiZGFyd2luIiB0cmlwbGVzLgorICBib29sIGlzTWFjT1NYVmVyc2lvbkxUKHVuc2lnbmVkIE1ham9yLCB1bnNpZ25lZCBNaW5vciA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWljcm8gPSAwKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzTWFjT1NYKCkgJiYgIk5vdCBhbiBPUyBYIHRyaXBsZSEiKTsKKworICAgIC8vIElmIHRoaXMgaXMgT1MgWCwgZXhwZWN0IGEgc2FuZSB2ZXJzaW9uIG51bWJlci4KKyAgICBpZiAoZ2V0T1MoKSA9PSBUcmlwbGU6Ok1hY09TWCkKKyAgICAgIHJldHVybiBpc09TVmVyc2lvbkxUKE1ham9yLCBNaW5vciwgTWljcm8pOworCisgICAgLy8gT3RoZXJ3aXNlLCBjb21wYXJlIHRvIHRoZSAiRGFyd2luIiBudW1iZXIuCisgICAgYXNzZXJ0KE1ham9yID09IDEwICYmICJVbmV4cGVjdGVkIG1ham9yIHZlcnNpb24iKTsKKyAgICByZXR1cm4gaXNPU1ZlcnNpb25MVChNaW5vciArIDQsIE1pY3JvLCAwKTsKKyAgfQorCisgIC8vLyBpc01hY09TWCAtIElzIHRoaXMgYSBNYWMgT1MgWCB0cmlwbGUuIEZvciBsZWdhY3kgcmVhc29ucywgd2Ugc3VwcG9ydCBib3RoCisgIC8vLyAiZGFyd2luIiBhbmQgIm9zeCIgYXMgT1MgWCB0cmlwbGVzLgorICBib29sIGlzTWFjT1NYKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPUygpID09IFRyaXBsZTo6RGFyd2luIHx8IGdldE9TKCkgPT0gVHJpcGxlOjpNYWNPU1g7CisgIH0KKworICAvLy8gSXMgdGhpcyBhbiBpT1MgdHJpcGxlLgorICAvLy8gTm90ZTogVGhpcyBpZGVudGlmaWVzIHR2T1MgYXMgYSB2YXJpYW50IG9mIGlPUy4gSWYgdGhhdCBldmVyCisgIC8vLyBjaGFuZ2VzLCBpLmUuLCBpZiB0aGUgdHdvIG9wZXJhdGluZyBzeXN0ZW1zIGRpdmVyZ2Ugb3IgdGhlaXIgdmVyc2lvbgorICAvLy8gbnVtYmVycyBnZXQgb3V0IG9mIHN5bmMsIHRoYXQgd2lsbCBuZWVkIHRvIGJlIGNoYW5nZWQuCisgIC8vLyB3YXRjaE9TIGhhcyBjb21wbGV0ZWx5IGRpZmZlcmVudCB2ZXJzaW9uIG51bWJlcnMgc28gaXQgaXMgbm90IGluY2x1ZGVkLgorICBib29sIGlzaU9TKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPUygpID09IFRyaXBsZTo6SU9TIHx8IGlzVHZPUygpOworICB9CisKKyAgLy8vIElzIHRoaXMgYW4gQXBwbGUgdHZPUyB0cmlwbGUuCisgIGJvb2wgaXNUdk9TKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPUygpID09IFRyaXBsZTo6VHZPUzsKKyAgfQorCisgIC8vLyBJcyB0aGlzIGFuIEFwcGxlIHdhdGNoT1MgdHJpcGxlLgorICBib29sIGlzV2F0Y2hPUygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T1MoKSA9PSBUcmlwbGU6OldhdGNoT1M7CisgIH0KKworICBib29sIGlzV2F0Y2hBQkkoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN1YkFyY2goKSA9PSBUcmlwbGU6OkFSTVN1YkFyY2hfdjdrOworICB9CisKKyAgLy8vIGlzT1NEYXJ3aW4gLSBJcyB0aGlzIGEgIkRhcndpbiIgT1MgKE9TIFgsIGlPUywgb3Igd2F0Y2hPUykuCisgIGJvb2wgaXNPU0RhcndpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNNYWNPU1goKSB8fCBpc2lPUygpIHx8IGlzV2F0Y2hPUygpOworICB9CisKKyAgYm9vbCBpc1NpbXVsYXRvckVudmlyb25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBnZXRFbnZpcm9ubWVudCgpID09IFRyaXBsZTo6U2ltdWxhdG9yOworICB9CisKKyAgYm9vbCBpc09TTmV0QlNEKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPUygpID09IFRyaXBsZTo6TmV0QlNEOworICB9CisKKyAgYm9vbCBpc09TT3BlbkJTRCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T1MoKSA9PSBUcmlwbGU6Ok9wZW5CU0Q7CisgIH0KKworICBib29sIGlzT1NGcmVlQlNEKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPUygpID09IFRyaXBsZTo6RnJlZUJTRDsKKyAgfQorCisgIGJvb2wgaXNPU0Z1Y2hzaWEoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9TKCkgPT0gVHJpcGxlOjpGdWNoc2lhOworICB9CisKKyAgYm9vbCBpc09TRHJhZ29uRmx5KCkgY29uc3QgeyByZXR1cm4gZ2V0T1MoKSA9PSBUcmlwbGU6OkRyYWdvbkZseTsgfQorCisgIGJvb2wgaXNPU1NvbGFyaXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9TKCkgPT0gVHJpcGxlOjpTb2xhcmlzOworICB9CisKKyAgYm9vbCBpc09TSUFNQ1UoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9TKCkgPT0gVHJpcGxlOjpFTEZJQU1DVTsKKyAgfQorCisgIGJvb2wgaXNPU1Vua25vd24oKSBjb25zdCB7IHJldHVybiBnZXRPUygpID09IFRyaXBsZTo6VW5rbm93bk9TOyB9CisKKyAgYm9vbCBpc0dOVUVudmlyb25tZW50KCkgY29uc3QgeworICAgIEVudmlyb25tZW50VHlwZSBFbnYgPSBnZXRFbnZpcm9ubWVudCgpOworICAgIHJldHVybiBFbnYgPT0gVHJpcGxlOjpHTlUgfHwgRW52ID09IFRyaXBsZTo6R05VQUJJTjMyIHx8CisgICAgICAgICAgIEVudiA9PSBUcmlwbGU6OkdOVUFCSTY0IHx8IEVudiA9PSBUcmlwbGU6OkdOVUVBQkkgfHwKKyAgICAgICAgICAgRW52ID09IFRyaXBsZTo6R05VRUFCSUhGIHx8IEVudiA9PSBUcmlwbGU6OkdOVVgzMjsKKyAgfQorCisgIGJvb2wgaXNPU0NvbnRpa2koKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9TKCkgPT0gVHJpcGxlOjpDb250aWtpOworICB9CisKKyAgLy8vIFRlc3RzIHdoZXRoZXIgdGhlIE9TIGlzIEhhaWt1LgorICBib29sIGlzT1NIYWlrdSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T1MoKSA9PSBUcmlwbGU6OkhhaWt1OworICB9CisKKyAgLy8vIENoZWNrcyBpZiB0aGUgZW52aXJvbm1lbnQgY291bGQgYmUgTVNWQy4KKyAgYm9vbCBpc1dpbmRvd3NNU1ZDRW52aXJvbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9TKCkgPT0gVHJpcGxlOjpXaW4zMiAmJgorICAgICAgICAgICAoZ2V0RW52aXJvbm1lbnQoKSA9PSBUcmlwbGU6OlVua25vd25FbnZpcm9ubWVudCB8fAorICAgICAgICAgICAgZ2V0RW52aXJvbm1lbnQoKSA9PSBUcmlwbGU6Ok1TVkMpOworICB9CisKKyAgLy8vIENoZWNrcyBpZiB0aGUgZW52aXJvbm1lbnQgaXMgTVNWQy4KKyAgYm9vbCBpc0tub3duV2luZG93c01TVkNFbnZpcm9ubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T1MoKSA9PSBUcmlwbGU6OldpbjMyICYmIGdldEVudmlyb25tZW50KCkgPT0gVHJpcGxlOjpNU1ZDOworICB9CisKKyAgYm9vbCBpc1dpbmRvd3NDb3JlQ0xSRW52aXJvbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9TKCkgPT0gVHJpcGxlOjpXaW4zMiAmJiBnZXRFbnZpcm9ubWVudCgpID09IFRyaXBsZTo6Q29yZUNMUjsKKyAgfQorCisgIGJvb2wgaXNXaW5kb3dzSXRhbml1bUVudmlyb25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBnZXRPUygpID09IFRyaXBsZTo6V2luMzIgJiYgZ2V0RW52aXJvbm1lbnQoKSA9PSBUcmlwbGU6Okl0YW5pdW07CisgIH0KKworICBib29sIGlzV2luZG93c0N5Z3dpbkVudmlyb25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBnZXRPUygpID09IFRyaXBsZTo6V2luMzIgJiYgZ2V0RW52aXJvbm1lbnQoKSA9PSBUcmlwbGU6OkN5Z251czsKKyAgfQorCisgIGJvb2wgaXNXaW5kb3dzR05VRW52aXJvbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9TKCkgPT0gVHJpcGxlOjpXaW4zMiAmJiBnZXRFbnZpcm9ubWVudCgpID09IFRyaXBsZTo6R05VOworICB9CisKKyAgLy8vIFRlc3RzIGZvciBlaXRoZXIgQ3lnd2luIG9yIE1pbkdXIE9TCisgIGJvb2wgaXNPU0N5Z01pbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzV2luZG93c0N5Z3dpbkVudmlyb25tZW50KCkgfHwgaXNXaW5kb3dzR05VRW52aXJvbm1lbnQoKTsKKyAgfQorCisgIC8vLyBJcyB0aGlzIGEgIldpbmRvd3MiIE9TIHRhcmdldGluZyBhICJNU1ZDUlQuZGxsIiBlbnZpcm9ubWVudC4KKyAgYm9vbCBpc09TTVNWQ1JUKCkgY29uc3QgeworICAgIHJldHVybiBpc1dpbmRvd3NNU1ZDRW52aXJvbm1lbnQoKSB8fCBpc1dpbmRvd3NHTlVFbnZpcm9ubWVudCgpIHx8CisgICAgICAgICAgIGlzV2luZG93c0l0YW5pdW1FbnZpcm9ubWVudCgpOworICB9CisKKyAgLy8vIFRlc3RzIHdoZXRoZXIgdGhlIE9TIGlzIFdpbmRvd3MuCisgIGJvb2wgaXNPU1dpbmRvd3MoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9TKCkgPT0gVHJpcGxlOjpXaW4zMjsKKyAgfQorCisgIC8vLyBUZXN0cyB3aGV0aGVyIHRoZSBPUyBpcyBOYUNsIChOYXRpdmUgQ2xpZW50KQorICBib29sIGlzT1NOYUNsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPUygpID09IFRyaXBsZTo6TmFDbDsKKyAgfQorCisgIC8vLyBUZXN0cyB3aGV0aGVyIHRoZSBPUyBpcyBMaW51eC4KKyAgYm9vbCBpc09TTGludXgoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9TKCkgPT0gVHJpcGxlOjpMaW51eDsKKyAgfQorCisgIC8vLyBUZXN0cyB3aGV0aGVyIHRoZSBPUyBpcyBrRnJlZUJTRC4KKyAgYm9vbCBpc09TS0ZyZWVCU0QoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9TKCkgPT0gVHJpcGxlOjpLRnJlZUJTRDsKKyAgfQorCisgIC8vLyBUZXN0cyB3aGV0aGVyIHRoZSBPUyB1c2VzIGdsaWJjLgorICBib29sIGlzT1NHbGliYygpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdldE9TKCkgPT0gVHJpcGxlOjpMaW51eCB8fCBnZXRPUygpID09IFRyaXBsZTo6S0ZyZWVCU0QpICYmCisgICAgICAgICAgICFpc0FuZHJvaWQoKTsKKyAgfQorCisgIC8vLyBUZXN0cyB3aGV0aGVyIHRoZSBPUyB1c2VzIHRoZSBFTEYgYmluYXJ5IGZvcm1hdC4KKyAgYm9vbCBpc09TQmluRm9ybWF0RUxGKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPYmplY3RGb3JtYXQoKSA9PSBUcmlwbGU6OkVMRjsKKyAgfQorCisgIC8vLyBUZXN0cyB3aGV0aGVyIHRoZSBPUyB1c2VzIHRoZSBDT0ZGIGJpbmFyeSBmb3JtYXQuCisgIGJvb2wgaXNPU0JpbkZvcm1hdENPRkYoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9iamVjdEZvcm1hdCgpID09IFRyaXBsZTo6Q09GRjsKKyAgfQorCisgIC8vLyBUZXN0cyB3aGV0aGVyIHRoZSBlbnZpcm9ubWVudCBpcyBNYWNoTy4KKyAgYm9vbCBpc09TQmluRm9ybWF0TWFjaE8oKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9iamVjdEZvcm1hdCgpID09IFRyaXBsZTo6TWFjaE87CisgIH0KKworICAvLy8gVGVzdHMgd2hldGhlciB0aGUgT1MgdXNlcyB0aGUgV2FzbSBiaW5hcnkgZm9ybWF0LgorICBib29sIGlzT1NCaW5Gb3JtYXRXYXNtKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPYmplY3RGb3JtYXQoKSA9PSBUcmlwbGU6Oldhc207CisgIH0KKworICAvLy8gVGVzdHMgd2hldGhlciB0aGUgdGFyZ2V0IGlzIHRoZSBQUzQgQ1BVCisgIGJvb2wgaXNQUzRDUFUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEFyY2goKSA9PSBUcmlwbGU6Ong4Nl82NCAmJgorICAgICAgICAgICBnZXRWZW5kb3IoKSA9PSBUcmlwbGU6OlNDRUkgJiYKKyAgICAgICAgICAgZ2V0T1MoKSA9PSBUcmlwbGU6OlBTNDsKKyAgfQorCisgIC8vLyBUZXN0cyB3aGV0aGVyIHRoZSB0YXJnZXQgaXMgdGhlIFBTNCBwbGF0Zm9ybQorICBib29sIGlzUFM0KCkgY29uc3QgeworICAgIHJldHVybiBnZXRWZW5kb3IoKSA9PSBUcmlwbGU6OlNDRUkgJiYKKyAgICAgICAgICAgZ2V0T1MoKSA9PSBUcmlwbGU6OlBTNDsKKyAgfQorCisgIC8vLyBUZXN0cyB3aGV0aGVyIHRoZSB0YXJnZXQgaXMgQW5kcm9pZAorICBib29sIGlzQW5kcm9pZCgpIGNvbnN0IHsgcmV0dXJuIGdldEVudmlyb25tZW50KCkgPT0gVHJpcGxlOjpBbmRyb2lkOyB9CisKKyAgYm9vbCBpc0FuZHJvaWRWZXJzaW9uTFQodW5zaWduZWQgTWFqb3IpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNBbmRyb2lkKCkgJiYgIk5vdCBhbiBBbmRyb2lkIHRyaXBsZSEiKTsKKworICAgIHVuc2lnbmVkIEVudlszXTsKKyAgICBnZXRFbnZpcm9ubWVudFZlcnNpb24oRW52WzBdLCBFbnZbMV0sIEVudlsyXSk7CisKKyAgICAvLyA2NC1iaXQgdGFyZ2V0cyBkaWQgbm90IGV4aXN0IGJlZm9yZSBBUEkgbGV2ZWwgMjEgKExvbGxpcG9wKS4KKyAgICBpZiAoaXNBcmNoNjRCaXQoKSAmJiBFbnZbMF0gPCAyMSkKKyAgICAgIEVudlswXSA9IDIxOworCisgICAgcmV0dXJuIEVudlswXSA8IE1ham9yOworICB9CisKKyAgLy8vIFRlc3RzIHdoZXRoZXIgdGhlIGVudmlyb25tZW50IGlzIG11c2wtbGliYworICBib29sIGlzTXVzbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RW52aXJvbm1lbnQoKSA9PSBUcmlwbGU6Ok11c2wgfHwKKyAgICAgICAgICAgZ2V0RW52aXJvbm1lbnQoKSA9PSBUcmlwbGU6Ok11c2xFQUJJIHx8CisgICAgICAgICAgIGdldEVudmlyb25tZW50KCkgPT0gVHJpcGxlOjpNdXNsRUFCSUhGOworICB9CisKKyAgLy8vIFRlc3RzIHdoZXRoZXIgdGhlIHRhcmdldCBpcyBOVlBUWCAoMzItIG9yIDY0LWJpdCkuCisgIGJvb2wgaXNOVlBUWCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QXJjaCgpID09IFRyaXBsZTo6bnZwdHggfHwgZ2V0QXJjaCgpID09IFRyaXBsZTo6bnZwdHg2NDsKKyAgfQorCisgIC8vLyBUZXN0cyB3aGV0aGVyIHRoZSB0YXJnZXQgaXMgVGh1bWIgKGxpdHRsZSBhbmQgYmlnIGVuZGlhbikuCisgIGJvb2wgaXNUaHVtYigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QXJjaCgpID09IFRyaXBsZTo6dGh1bWIgfHwgZ2V0QXJjaCgpID09IFRyaXBsZTo6dGh1bWJlYjsKKyAgfQorCisgIC8vLyBUZXN0cyB3aGV0aGVyIHRoZSB0YXJnZXQgaXMgQVJNIChsaXR0bGUgYW5kIGJpZyBlbmRpYW4pLgorICBib29sIGlzQVJNKCkgY29uc3QgeworICAgIHJldHVybiBnZXRBcmNoKCkgPT0gVHJpcGxlOjphcm0gfHwgZ2V0QXJjaCgpID09IFRyaXBsZTo6YXJtZWI7CisgIH0KKworICAvLy8gVGVzdHMgd2hldGhlciB0aGUgdGFyZ2V0IGlzIEFBcmNoNjQgKGxpdHRsZSBhbmQgYmlnIGVuZGlhbikuCisgIGJvb2wgaXNBQXJjaDY0KCkgY29uc3QgeworICAgIHJldHVybiBnZXRBcmNoKCkgPT0gVHJpcGxlOjphYXJjaDY0IHx8IGdldEFyY2goKSA9PSBUcmlwbGU6OmFhcmNoNjRfYmU7CisgIH0KKworICAvLy8gVGVzdHMgd2hldGhlciB0aGUgdGFyZ2V0IHN1cHBvcnRzIGNvbWRhdAorICBib29sIHN1cHBvcnRzQ09NREFUKCkgY29uc3QgeworICAgIHJldHVybiAhaXNPU0JpbkZvcm1hdE1hY2hPKCk7CisgIH0KKworICAvLy8gVGVzdHMgd2hldGhlciB0aGUgdGFyZ2V0IHVzZXMgZW11bGF0ZWQgVExTIGFzIGRlZmF1bHQuCisgIGJvb2wgaGFzRGVmYXVsdEVtdWxhdGVkVExTKCkgY29uc3QgeworICAgIHJldHVybiBpc0FuZHJvaWQoKSB8fCBpc09TT3BlbkJTRCgpIHx8IGlzV2luZG93c0N5Z3dpbkVudmlyb25tZW50KCk7CisgIH0KKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIE11dGF0b3JzCisgIC8vLyBAeworCisgIC8vLyBzZXRBcmNoIC0gU2V0IHRoZSBhcmNoaXRlY3R1cmUgKGZpcnN0KSBjb21wb25lbnQgb2YgdGhlIHRyaXBsZQorICAvLy8gdG8gYSBrbm93biB0eXBlLgorICB2b2lkIHNldEFyY2goQXJjaFR5cGUgS2luZCk7CisKKyAgLy8vIHNldFZlbmRvciAtIFNldCB0aGUgdmVuZG9yIChzZWNvbmQpIGNvbXBvbmVudCBvZiB0aGUgdHJpcGxlIHRvIGEKKyAgLy8vIGtub3duIHR5cGUuCisgIHZvaWQgc2V0VmVuZG9yKFZlbmRvclR5cGUgS2luZCk7CisKKyAgLy8vIHNldE9TIC0gU2V0IHRoZSBvcGVyYXRpbmcgc3lzdGVtICh0aGlyZCkgY29tcG9uZW50IG9mIHRoZSB0cmlwbGUKKyAgLy8vIHRvIGEga25vd24gdHlwZS4KKyAgdm9pZCBzZXRPUyhPU1R5cGUgS2luZCk7CisKKyAgLy8vIHNldEVudmlyb25tZW50IC0gU2V0IHRoZSBlbnZpcm9ubWVudCAoZm91cnRoKSBjb21wb25lbnQgb2YgdGhlIHRyaXBsZQorICAvLy8gdG8gYSBrbm93biB0eXBlLgorICB2b2lkIHNldEVudmlyb25tZW50KEVudmlyb25tZW50VHlwZSBLaW5kKTsKKworICAvLy8gc2V0T2JqZWN0Rm9ybWF0IC0gU2V0IHRoZSBvYmplY3QgZmlsZSBmb3JtYXQKKyAgdm9pZCBzZXRPYmplY3RGb3JtYXQoT2JqZWN0Rm9ybWF0VHlwZSBLaW5kKTsKKworICAvLy8gc2V0VHJpcGxlIC0gU2V0IGFsbCBjb21wb25lbnRzIHRvIHRoZSBuZXcgdHJpcGxlIFxwIFN0ci4KKyAgdm9pZCBzZXRUcmlwbGUoY29uc3QgVHdpbmUgJlN0cik7CisKKyAgLy8vIHNldEFyY2hOYW1lIC0gU2V0IHRoZSBhcmNoaXRlY3R1cmUgKGZpcnN0KSBjb21wb25lbnQgb2YgdGhlCisgIC8vLyB0cmlwbGUgYnkgbmFtZS4KKyAgdm9pZCBzZXRBcmNoTmFtZShTdHJpbmdSZWYgU3RyKTsKKworICAvLy8gc2V0VmVuZG9yTmFtZSAtIFNldCB0aGUgdmVuZG9yIChzZWNvbmQpIGNvbXBvbmVudCBvZiB0aGUgdHJpcGxlCisgIC8vLyBieSBuYW1lLgorICB2b2lkIHNldFZlbmRvck5hbWUoU3RyaW5nUmVmIFN0cik7CisKKyAgLy8vIHNldE9TTmFtZSAtIFNldCB0aGUgb3BlcmF0aW5nIHN5c3RlbSAodGhpcmQpIGNvbXBvbmVudCBvZiB0aGUKKyAgLy8vIHRyaXBsZSBieSBuYW1lLgorICB2b2lkIHNldE9TTmFtZShTdHJpbmdSZWYgU3RyKTsKKworICAvLy8gc2V0RW52aXJvbm1lbnROYW1lIC0gU2V0IHRoZSBvcHRpb25hbCBlbnZpcm9ubWVudCAoZm91cnRoKQorICAvLy8gY29tcG9uZW50IG9mIHRoZSB0cmlwbGUgYnkgbmFtZS4KKyAgdm9pZCBzZXRFbnZpcm9ubWVudE5hbWUoU3RyaW5nUmVmIFN0cik7CisKKyAgLy8vIHNldE9TQW5kRW52aXJvbm1lbnROYW1lIC0gU2V0IHRoZSBvcGVyYXRpbmcgc3lzdGVtIGFuZCBvcHRpb25hbAorICAvLy8gZW52aXJvbm1lbnQgY29tcG9uZW50cyB3aXRoIGEgc2luZ2xlIHN0cmluZy4KKyAgdm9pZCBzZXRPU0FuZEVudmlyb25tZW50TmFtZShTdHJpbmdSZWYgU3RyKTsKKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIEhlbHBlcnMgdG8gYnVpbGQgdmFyaWFudHMgb2YgYSBwYXJ0aWN1bGFyIHRyaXBsZS4KKyAgLy8vIEB7CisKKyAgLy8vIEZvcm0gYSB0cmlwbGUgd2l0aCBhIDMyLWJpdCB2YXJpYW50IG9mIHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZS4KKyAgLy8vCisgIC8vLyBUaGlzIGNhbiBiZSB1c2VkIHRvIG1vdmUgYWNyb3NzICJmYW1pbGllcyIgb2YgYXJjaGl0ZWN0dXJlcyB3aGVyZSB1c2VmdWwuCisgIC8vLworICAvLy8gXHJldHVybnMgQSBuZXcgdHJpcGxlIHdpdGggYSAzMi1iaXQgYXJjaGl0ZWN0dXJlIG9yIGFuIHVua25vd24KKyAgLy8vICAgICAgICAgIGFyY2hpdGVjdHVyZSBpZiBubyBzdWNoIHZhcmlhbnQgY2FuIGJlIGZvdW5kLgorICBsbHZtOjpUcmlwbGUgZ2V0MzJCaXRBcmNoVmFyaWFudCgpIGNvbnN0OworCisgIC8vLyBGb3JtIGEgdHJpcGxlIHdpdGggYSA2NC1iaXQgdmFyaWFudCBvZiB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUuCisgIC8vLworICAvLy8gVGhpcyBjYW4gYmUgdXNlZCB0byBtb3ZlIGFjcm9zcyAiZmFtaWxpZXMiIG9mIGFyY2hpdGVjdHVyZXMgd2hlcmUgdXNlZnVsLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIEEgbmV3IHRyaXBsZSB3aXRoIGEgNjQtYml0IGFyY2hpdGVjdHVyZSBvciBhbiB1bmtub3duCisgIC8vLyAgICAgICAgICBhcmNoaXRlY3R1cmUgaWYgbm8gc3VjaCB2YXJpYW50IGNhbiBiZSBmb3VuZC4KKyAgbGx2bTo6VHJpcGxlIGdldDY0Qml0QXJjaFZhcmlhbnQoKSBjb25zdDsKKworICAvLy8gRm9ybSBhIHRyaXBsZSB3aXRoIGEgYmlnIGVuZGlhbiB2YXJpYW50IG9mIHRoZSBjdXJyZW50IGFyY2hpdGVjdHVyZS4KKyAgLy8vCisgIC8vLyBUaGlzIGNhbiBiZSB1c2VkIHRvIG1vdmUgYWNyb3NzICJmYW1pbGllcyIgb2YgYXJjaGl0ZWN0dXJlcyB3aGVyZSB1c2VmdWwuCisgIC8vLworICAvLy8gXHJldHVybnMgQSBuZXcgdHJpcGxlIHdpdGggYSBiaWcgZW5kaWFuIGFyY2hpdGVjdHVyZSBvciBhbiB1bmtub3duCisgIC8vLyAgICAgICAgICBhcmNoaXRlY3R1cmUgaWYgbm8gc3VjaCB2YXJpYW50IGNhbiBiZSBmb3VuZC4KKyAgbGx2bTo6VHJpcGxlIGdldEJpZ0VuZGlhbkFyY2hWYXJpYW50KCkgY29uc3Q7CisKKyAgLy8vIEZvcm0gYSB0cmlwbGUgd2l0aCBhIGxpdHRsZSBlbmRpYW4gdmFyaWFudCBvZiB0aGUgY3VycmVudCBhcmNoaXRlY3R1cmUuCisgIC8vLworICAvLy8gVGhpcyBjYW4gYmUgdXNlZCB0byBtb3ZlIGFjcm9zcyAiZmFtaWxpZXMiIG9mIGFyY2hpdGVjdHVyZXMgd2hlcmUgdXNlZnVsLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIEEgbmV3IHRyaXBsZSB3aXRoIGEgbGl0dGxlIGVuZGlhbiBhcmNoaXRlY3R1cmUgb3IgYW4gdW5rbm93bgorICAvLy8gICAgICAgICAgYXJjaGl0ZWN0dXJlIGlmIG5vIHN1Y2ggdmFyaWFudCBjYW4gYmUgZm91bmQuCisgIGxsdm06OlRyaXBsZSBnZXRMaXR0bGVFbmRpYW5BcmNoVmFyaWFudCgpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIChMTFZNKSBuYW1lIG9mIHRoZSBtaW5pbXVtIEFSTSBDUFUgZm9yIHRoZSBhcmNoIHdlIGFyZSB0YXJnZXRpbmcuCisgIC8vLworICAvLy8gXHBhcmFtIEFyY2ggdGhlIGFyY2hpdGVjdHVyZSBuYW1lIChlLmcuLCAiYXJtdjdzIikuIElmIGl0IGlzIGFuIGVtcHR5CisgIC8vLyBzdHJpbmcgdGhlbiB0aGUgdHJpcGxlJ3MgYXJjaCBuYW1lIGlzIHVzZWQuCisgIFN0cmluZ1JlZiBnZXRBUk1DUFVGb3JBcmNoKFN0cmluZ1JlZiBBcmNoID0gU3RyaW5nUmVmKCkpIGNvbnN0OworCisgIC8vLyBUZXN0cyB3aGV0aGVyIHRoZSB0YXJnZXQgdHJpcGxlIGlzIGxpdHRsZSBlbmRpYW4uCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGUgdHJpcGxlIGlzIGxpdHRsZSBlbmRpYW4sIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBpc0xpdHRsZUVuZGlhbigpIGNvbnN0OworCisgIC8vLyBUZXN0IHdoZXRoZXIgdGFyZ2V0IHRyaXBsZXMgYXJlIGNvbXBhdGlibGUuCisgIGJvb2wgaXNDb21wYXRpYmxlV2l0aChjb25zdCBUcmlwbGUgJk90aGVyKSBjb25zdDsKKworICAvLy8gTWVyZ2UgdGFyZ2V0IHRyaXBsZXMuCisgIHN0ZDo6c3RyaW5nIG1lcmdlKGNvbnN0IFRyaXBsZSAmT3RoZXIpIGNvbnN0OworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgU3RhdGljIGhlbHBlcnMgZm9yIElEcy4KKyAgLy8vIEB7CisKKyAgLy8vIGdldEFyY2hUeXBlTmFtZSAtIEdldCB0aGUgY2Fub25pY2FsIG5hbWUgZm9yIHRoZSBccCBLaW5kIGFyY2hpdGVjdHVyZS4KKyAgc3RhdGljIFN0cmluZ1JlZiBnZXRBcmNoVHlwZU5hbWUoQXJjaFR5cGUgS2luZCk7CisKKyAgLy8vIGdldEFyY2hUeXBlUHJlZml4IC0gR2V0IHRoZSAicHJlZml4IiBjYW5vbmljYWwgbmFtZSBmb3IgdGhlIFxwIEtpbmQKKyAgLy8vIGFyY2hpdGVjdHVyZS4gVGhpcyBpcyB0aGUgcHJlZml4IHVzZWQgYnkgdGhlIGFyY2hpdGVjdHVyZSBzcGVjaWZpYworICAvLy8gYnVpbHRpbnMsIGFuZCBpcyBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBcc2VlCisgIC8vLyBJbnRyaW5zaWM6OmdldEludHJpbnNpY0ZvckdDQ0J1aWx0aW4oKS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIC0gVGhlIGFyY2hpdGVjdHVyZSBwcmVmaXgsIG9yIDAgaWYgbm9uZSBpcyBkZWZpbmVkLgorICBzdGF0aWMgU3RyaW5nUmVmIGdldEFyY2hUeXBlUHJlZml4KEFyY2hUeXBlIEtpbmQpOworCisgIC8vLyBnZXRWZW5kb3JUeXBlTmFtZSAtIEdldCB0aGUgY2Fub25pY2FsIG5hbWUgZm9yIHRoZSBccCBLaW5kIHZlbmRvci4KKyAgc3RhdGljIFN0cmluZ1JlZiBnZXRWZW5kb3JUeXBlTmFtZShWZW5kb3JUeXBlIEtpbmQpOworCisgIC8vLyBnZXRPU1R5cGVOYW1lIC0gR2V0IHRoZSBjYW5vbmljYWwgbmFtZSBmb3IgdGhlIFxwIEtpbmQgb3BlcmF0aW5nIHN5c3RlbS4KKyAgc3RhdGljIFN0cmluZ1JlZiBnZXRPU1R5cGVOYW1lKE9TVHlwZSBLaW5kKTsKKworICAvLy8gZ2V0RW52aXJvbm1lbnRUeXBlTmFtZSAtIEdldCB0aGUgY2Fub25pY2FsIG5hbWUgZm9yIHRoZSBccCBLaW5kCisgIC8vLyBlbnZpcm9ubWVudC4KKyAgc3RhdGljIFN0cmluZ1JlZiBnZXRFbnZpcm9ubWVudFR5cGVOYW1lKEVudmlyb25tZW50VHlwZSBLaW5kKTsKKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIFN0YXRpYyBoZWxwZXJzIGZvciBjb252ZXJ0aW5nIGFsdGVybmF0ZSBhcmNoaXRlY3R1cmUgbmFtZXMuCisgIC8vLyBAeworCisgIC8vLyBnZXRBcmNoVHlwZUZvckxMVk1OYW1lIC0gVGhlIGNhbm9uaWNhbCB0eXBlIGZvciB0aGUgZ2l2ZW4gTExWTQorICAvLy8gYXJjaGl0ZWN0dXJlIG5hbWUgKGUuZy4sICJ4ODYiKS4KKyAgc3RhdGljIEFyY2hUeXBlIGdldEFyY2hUeXBlRm9yTExWTU5hbWUoU3RyaW5nUmVmIFN0cik7CisKKyAgLy8vIEB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvVHdpbmUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1R3aW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjYwZmQwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1R3aW5lLmgKQEAgLTAsMCArMSw1NDIgQEAKKy8vPT09LSBUd2luZS5oIC0gRmFzdCBUZW1wb3JhcnkgU3RyaW5nIENvbmNhdGVuYXRpb24gLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfVFdJTkVfSAorI2RlZmluZSBMTFZNX0FEVF9UV0lORV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCisgIGNsYXNzIGZvcm1hdHZfb2JqZWN0X2Jhc2U7CisgIGNsYXNzIHJhd19vc3RyZWFtOworCisgIC8vLyBUd2luZSAtIEEgbGlnaHR3ZWlnaHQgZGF0YSBzdHJ1Y3R1cmUgZm9yIGVmZmljaWVudGx5IHJlcHJlc2VudGluZyB0aGUKKyAgLy8vIGNvbmNhdGVuYXRpb24gb2YgdGVtcG9yYXJ5IHZhbHVlcyBhcyBzdHJpbmdzLgorICAvLy8KKyAgLy8vIEEgVHdpbmUgaXMgYSBraW5kIG9mIHJvcGUsIGl0IHJlcHJlc2VudHMgYSBjb25jYXRlbmF0ZWQgc3RyaW5nIHVzaW5nIGEKKyAgLy8vIGJpbmFyeS10cmVlLCB3aGVyZSB0aGUgc3RyaW5nIGlzIHRoZSBwcmVvcmRlciBvZiB0aGUgbm9kZXMuIFNpbmNlIHRoZQorICAvLy8gVHdpbmUgY2FuIGJlIGVmZmljaWVudGx5IHJlbmRlcmVkIGludG8gYSBidWZmZXIgd2hlbiBpdHMgcmVzdWx0IGlzIHVzZWQsCisgIC8vLyBpdCBhdm9pZHMgdGhlIGNvc3Qgb2YgZ2VuZXJhdGluZyB0ZW1wb3JhcnkgdmFsdWVzIGZvciBpbnRlcm1lZGlhdGUgc3RyaW5nCisgIC8vLyByZXN1bHRzIC0tIHBhcnRpY3VsYXJseSBpbiBjYXNlcyB3aGVuIHRoZSBUd2luZSByZXN1bHQgaXMgbmV2ZXIKKyAgLy8vIHJlcXVpcmVkLiBCeSBleHBsaWNpdGx5IHRyYWNraW5nIHRoZSB0eXBlIG9mIGxlYWYgbm9kZXMsIHdlIGNhbiBhbHNvIGF2b2lkCisgIC8vLyB0aGUgY3JlYXRpb24gb2YgdGVtcG9yYXJ5IHN0cmluZ3MgZm9yIGNvbnZlcnNpb25zIG9wZXJhdGlvbnMgKHN1Y2ggYXMKKyAgLy8vIGFwcGVuZGluZyBhbiBpbnRlZ2VyIHRvIGEgc3RyaW5nKS4KKyAgLy8vCisgIC8vLyBBIFR3aW5lIGlzIG5vdCBpbnRlbmRlZCBmb3IgdXNlIGRpcmVjdGx5IGFuZCBzaG91bGQgbm90IGJlIHN0b3JlZCwgaXRzCisgIC8vLyBpbXBsZW1lbnRhdGlvbiByZWxpZXMgb24gdGhlIGFiaWxpdHkgdG8gc3RvcmUgcG9pbnRlcnMgdG8gdGVtcG9yYXJ5IHN0YWNrCisgIC8vLyBvYmplY3RzIHdoaWNoIG1heSBiZSBkZWFsbG9jYXRlZCBhdCB0aGUgZW5kIG9mIGEgc3RhdGVtZW50LiBUd2luZXMgc2hvdWxkCisgIC8vLyBvbmx5IGJlIHVzZWQgYWNjZXB0ZWQgYXMgY29uc3QgcmVmZXJlbmNlcyBpbiBhcmd1bWVudHMsIHdoZW4gYW4gQVBJIHdpc2hlcworICAvLy8gdG8gYWNjZXB0IHBvc3NpYmx5LWNvbmNhdGVuYXRlZCBzdHJpbmdzLgorICAvLy8KKyAgLy8vIFR3aW5lcyBzdXBwb3J0IGEgc3BlY2lhbCAnbnVsbCcgdmFsdWUsIHdoaWNoIGFsd2F5cyBjb25jYXRlbmF0ZXMgdG8gZm9ybQorICAvLy8gaXRzZWxmLCBhbmQgcmVuZGVycyBhcyBhbiBlbXB0eSBzdHJpbmcuIFRoaXMgY2FuIGJlIHJldHVybmVkIGZyb20gQVBJcyB0bworICAvLy8gZWZmZWN0aXZlbHkgbnVsbGlmeSBhbnkgY29uY2F0ZW5hdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSByZXN1bHQuCisgIC8vLworICAvLy8gXGIgSW1wbGVtZW50YXRpb24KKyAgLy8vCisgIC8vLyBHaXZlbiB0aGUgbmF0dXJlIG9mIGEgVHdpbmUsIGl0IGlzIG5vdCBwb3NzaWJsZSBmb3IgdGhlIFR3aW5lJ3MKKyAgLy8vIGNvbmNhdGVuYXRpb24gbWV0aG9kIHRvIGNvbnN0cnVjdCBpbnRlcmlvciBub2RlczsgdGhlIHJlc3VsdCBtdXN0IGJlCisgIC8vLyByZXByZXNlbnRlZCBpbnNpZGUgdGhlIHJldHVybmVkIHZhbHVlLiBGb3IgdGhpcyByZWFzb24gYSBUd2luZSBvYmplY3QKKyAgLy8vIGFjdHVhbGx5IGhvbGRzIHR3byB2YWx1ZXMsIHRoZSBsZWZ0LSBhbmQgcmlnaHQtaGFuZCBzaWRlcyBvZiBhCisgIC8vLyBjb25jYXRlbmF0aW9uLiBXZSBhbHNvIGhhdmUgbnVsbGFyeSBUd2luZSBvYmplY3RzLCB3aGljaCBhcmUgZWZmZWN0aXZlbHkKKyAgLy8vIHNlbnRpbmVsIHZhbHVlcyB0aGF0IHJlcHJlc2VudCBlbXB0eSBzdHJpbmdzLgorICAvLy8KKyAgLy8vIFRodXMsIGEgVHdpbmUgY2FuIGVmZmVjdGl2ZWx5IGhhdmUgemVybywgb25lLCBvciB0d28gY2hpbGRyZW4uIFRoZSBcc2VlCisgIC8vLyBpc051bGxhcnkoKSwgXHNlZSBpc1VuYXJ5KCksIGFuZCBcc2VlIGlzQmluYXJ5KCkgcHJlZGljYXRlcyBleGlzdCBmb3IKKyAgLy8vIHRlc3RpbmcgdGhlIG51bWJlciBvZiBjaGlsZHJlbi4KKyAgLy8vCisgIC8vLyBXZSBtYWludGFpbiBhIG51bWJlciBvZiBpbnZhcmlhbnRzIG9uIFR3aW5lIG9iamVjdHMgKEZJWE1FOiBXaHkpOgorICAvLy8gIC0gTnVsbGFyeSB0d2luZXMgYXJlIGFsd2F5cyByZXByZXNlbnRlZCB3aXRoIHRoZWlyIEtpbmQgb24gdGhlIGxlZnQtaGFuZAorICAvLy8gICAgc2lkZSwgYW5kIHRoZSBFbXB0eSBraW5kIG9uIHRoZSByaWdodC1oYW5kIHNpZGUuCisgIC8vLyAgLSBVbmFyeSB0d2luZXMgYXJlIGFsd2F5cyByZXByZXNlbnRlZCB3aXRoIHRoZSB2YWx1ZSBvbiB0aGUgbGVmdC1oYW5kCisgIC8vLyAgICBzaWRlLCBhbmQgdGhlIEVtcHR5IGtpbmQgb24gdGhlIHJpZ2h0LWhhbmQgc2lkZS4KKyAgLy8vICAtIElmIGEgVHdpbmUgaGFzIGFub3RoZXIgVHdpbmUgYXMgYSBjaGlsZCwgdGhhdCBjaGlsZCBzaG91bGQgYWx3YXlzIGJlCisgIC8vLyAgICBiaW5hcnkgKG90aGVyd2lzZSBpdCBjb3VsZCBoYXZlIGJlZW4gZm9sZGVkIGludG8gdGhlIHBhcmVudCkuCisgIC8vLworICAvLy8gVGhlc2UgaW52YXJpYW50cyBhcmUgY2hlY2sgYnkgXHNlZSBpc1ZhbGlkKCkuCisgIC8vLworICAvLy8gXGIgRWZmaWNpZW5jeSBDb25zaWRlcmF0aW9ucworICAvLy8KKyAgLy8vIFRoZSBUd2luZSBpcyBkZXNpZ25lZCB0byB5aWVsZCBlZmZpY2llbnQgYW5kIHNtYWxsIGNvZGUgZm9yIGNvbW1vbgorICAvLy8gc2l0dWF0aW9ucy4gRm9yIHRoaXMgcmVhc29uLCB0aGUgY29uY2F0KCkgbWV0aG9kIGlzIGlubGluZWQgc28gdGhhdAorICAvLy8gY29uY2F0ZW5hdGlvbnMgb2YgbGVhZiBub2RlcyBjYW4gYmUgb3B0aW1pemVkIGludG8gc3RvcmVzIGRpcmVjdGx5IGludG8gYQorICAvLy8gc2luZ2xlIHN0YWNrIGFsbG9jYXRlZCBvYmplY3QuCisgIC8vLworICAvLy8gSW4gcHJhY3RpY2UsIG5vdCBhbGwgY29tcGlsZXJzIGNhbiBiZSB0cnVzdGVkIHRvIG9wdGltaXplIGNvbmNhdCgpIGZ1bGx5LAorICAvLy8gc28gd2UgcHJvdmlkZSB0d28gYWRkaXRpb25hbCBtZXRob2RzIChhbmQgYWNjb21wYW55aW5nIG9wZXJhdG9yKworICAvLy8gb3ZlcmxvYWRzKSB0byBndWFyYW50ZWUgdGhhdCBwYXJ0aWN1bGFybHkgaW1wb3J0YW50IGNhc2VzIChjc3RyaW5nIHBsdXMKKyAgLy8vIFN0cmluZ1JlZikgY29kZWdlbiBhcyBkZXNpcmVkLgorICBjbGFzcyBUd2luZSB7CisgICAgLy8vIE5vZGVLaW5kIC0gUmVwcmVzZW50IHRoZSB0eXBlIG9mIGFuIGFyZ3VtZW50LgorICAgIGVudW0gTm9kZUtpbmQgOiB1bnNpZ25lZCBjaGFyIHsKKyAgICAgIC8vLyBBbiBlbXB0eSBzdHJpbmc7IHRoZSByZXN1bHQgb2YgY29uY2F0ZW5hdGluZyBhbnl0aGluZyB3aXRoIGl0IGlzIGFsc28KKyAgICAgIC8vLyBlbXB0eS4KKyAgICAgIE51bGxLaW5kLAorCisgICAgICAvLy8gVGhlIGVtcHR5IHN0cmluZy4KKyAgICAgIEVtcHR5S2luZCwKKworICAgICAgLy8vIEEgcG9pbnRlciB0byBhIFR3aW5lIGluc3RhbmNlLgorICAgICAgVHdpbmVLaW5kLAorCisgICAgICAvLy8gQSBwb2ludGVyIHRvIGEgQyBzdHJpbmcgaW5zdGFuY2UuCisgICAgICBDU3RyaW5nS2luZCwKKworICAgICAgLy8vIEEgcG9pbnRlciB0byBhbiBzdGQ6OnN0cmluZyBpbnN0YW5jZS4KKyAgICAgIFN0ZFN0cmluZ0tpbmQsCisKKyAgICAgIC8vLyBBIHBvaW50ZXIgdG8gYSBTdHJpbmdSZWYgaW5zdGFuY2UuCisgICAgICBTdHJpbmdSZWZLaW5kLAorCisgICAgICAvLy8gQSBwb2ludGVyIHRvIGEgU21hbGxTdHJpbmcgaW5zdGFuY2UuCisgICAgICBTbWFsbFN0cmluZ0tpbmQsCisKKyAgICAgIC8vLyBBIHBvaW50ZXIgdG8gYSBmb3JtYXR2X29iamVjdF9iYXNlIGluc3RhbmNlLgorICAgICAgRm9ybWF0dk9iamVjdEtpbmQsCisKKyAgICAgIC8vLyBBIGNoYXIgdmFsdWUsIHRvIHJlbmRlciBhcyBhIGNoYXJhY3Rlci4KKyAgICAgIENoYXJLaW5kLAorCisgICAgICAvLy8gQW4gdW5zaWduZWQgaW50IHZhbHVlLCB0byByZW5kZXIgYXMgYW4gdW5zaWduZWQgZGVjaW1hbCBpbnRlZ2VyLgorICAgICAgRGVjVUlLaW5kLAorCisgICAgICAvLy8gQW4gaW50IHZhbHVlLCB0byByZW5kZXIgYXMgYSBzaWduZWQgZGVjaW1hbCBpbnRlZ2VyLgorICAgICAgRGVjSUtpbmQsCisKKyAgICAgIC8vLyBBIHBvaW50ZXIgdG8gYW4gdW5zaWduZWQgbG9uZyB2YWx1ZSwgdG8gcmVuZGVyIGFzIGFuIHVuc2lnbmVkIGRlY2ltYWwKKyAgICAgIC8vLyBpbnRlZ2VyLgorICAgICAgRGVjVUxLaW5kLAorCisgICAgICAvLy8gQSBwb2ludGVyIHRvIGEgbG9uZyB2YWx1ZSwgdG8gcmVuZGVyIGFzIGEgc2lnbmVkIGRlY2ltYWwgaW50ZWdlci4KKyAgICAgIERlY0xLaW5kLAorCisgICAgICAvLy8gQSBwb2ludGVyIHRvIGFuIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSwgdG8gcmVuZGVyIGFzIGFuIHVuc2lnbmVkCisgICAgICAvLy8gZGVjaW1hbCBpbnRlZ2VyLgorICAgICAgRGVjVUxMS2luZCwKKworICAgICAgLy8vIEEgcG9pbnRlciB0byBhIGxvbmcgbG9uZyB2YWx1ZSwgdG8gcmVuZGVyIGFzIGEgc2lnbmVkIGRlY2ltYWwgaW50ZWdlci4KKyAgICAgIERlY0xMS2luZCwKKworICAgICAgLy8vIEEgcG9pbnRlciB0byBhIHVpbnQ2NF90IHZhbHVlLCB0byByZW5kZXIgYXMgYW4gdW5zaWduZWQgaGV4YWRlY2ltYWwKKyAgICAgIC8vLyBpbnRlZ2VyLgorICAgICAgVUhleEtpbmQKKyAgICB9OworCisgICAgdW5pb24gQ2hpbGQKKyAgICB7CisgICAgICBjb25zdCBUd2luZSAqdHdpbmU7CisgICAgICBjb25zdCBjaGFyICpjU3RyaW5nOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgKnN0ZFN0cmluZzsKKyAgICAgIGNvbnN0IFN0cmluZ1JlZiAqc3RyaW5nUmVmOworICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICpzbWFsbFN0cmluZzsKKyAgICAgIGNvbnN0IGZvcm1hdHZfb2JqZWN0X2Jhc2UgKmZvcm1hdHZPYmplY3Q7CisgICAgICBjaGFyIGNoYXJhY3RlcjsKKyAgICAgIHVuc2lnbmVkIGludCBkZWNVSTsKKyAgICAgIGludCBkZWNJOworICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyAqZGVjVUw7CisgICAgICBjb25zdCBsb25nICpkZWNMOworICAgICAgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nICpkZWNVTEw7CisgICAgICBjb25zdCBsb25nIGxvbmcgKmRlY0xMOworICAgICAgY29uc3QgdWludDY0X3QgKnVIZXg7CisgICAgfTsKKworICAgIC8vLyBMSFMgLSBUaGUgcHJlZml4IGluIHRoZSBjb25jYXRlbmF0aW9uLCB3aGljaCBtYXkgYmUgdW5pbml0aWFsaXplZCBmb3IKKyAgICAvLy8gTnVsbCBvciBFbXB0eSBraW5kcy4KKyAgICBDaGlsZCBMSFM7CisKKyAgICAvLy8gUkhTIC0gVGhlIHN1ZmZpeCBpbiB0aGUgY29uY2F0ZW5hdGlvbiwgd2hpY2ggbWF5IGJlIHVuaW5pdGlhbGl6ZWQgZm9yCisgICAgLy8vIE51bGwgb3IgRW1wdHkga2luZHMuCisgICAgQ2hpbGQgUkhTOworCisgICAgLy8vIExIU0tpbmQgLSBUaGUgTm9kZUtpbmQgb2YgdGhlIGxlZnQgaGFuZCBzaWRlLCBcc2VlIGdldExIU0tpbmQoKS4KKyAgICBOb2RlS2luZCBMSFNLaW5kID0gRW1wdHlLaW5kOworCisgICAgLy8vIFJIU0tpbmQgLSBUaGUgTm9kZUtpbmQgb2YgdGhlIHJpZ2h0IGhhbmQgc2lkZSwgXHNlZSBnZXRSSFNLaW5kKCkuCisgICAgTm9kZUtpbmQgUkhTS2luZCA9IEVtcHR5S2luZDsKKworICAgIC8vLyBDb25zdHJ1Y3QgYSBudWxsYXJ5IHR3aW5lOyB0aGUga2luZCBtdXN0IGJlIE51bGxLaW5kIG9yIEVtcHR5S2luZC4KKyAgICBleHBsaWNpdCBUd2luZShOb2RlS2luZCBLaW5kKSA6IExIU0tpbmQoS2luZCkgeworICAgICAgYXNzZXJ0KGlzTnVsbGFyeSgpICYmICJJbnZhbGlkIGtpbmQhIik7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBhIGJpbmFyeSB0d2luZS4KKyAgICBleHBsaWNpdCBUd2luZShjb25zdCBUd2luZSAmTEhTLCBjb25zdCBUd2luZSAmUkhTKQorICAgICAgICA6IExIU0tpbmQoVHdpbmVLaW5kKSwgUkhTS2luZChUd2luZUtpbmQpIHsKKyAgICAgIHRoaXMtPkxIUy50d2luZSA9ICZMSFM7CisgICAgICB0aGlzLT5SSFMudHdpbmUgPSAmUkhTOworICAgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiSW52YWxpZCB0d2luZSEiKTsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGEgdHdpbmUgZnJvbSBleHBsaWNpdCB2YWx1ZXMuCisgICAgZXhwbGljaXQgVHdpbmUoQ2hpbGQgTEhTLCBOb2RlS2luZCBMSFNLaW5kLCBDaGlsZCBSSFMsIE5vZGVLaW5kIFJIU0tpbmQpCisgICAgICAgIDogTEhTKExIUyksIFJIUyhSSFMpLCBMSFNLaW5kKExIU0tpbmQpLCBSSFNLaW5kKFJIU0tpbmQpIHsKKyAgICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIkludmFsaWQgdHdpbmUhIik7CisgICAgfQorCisgICAgLy8vIENoZWNrIGZvciB0aGUgbnVsbCB0d2luZS4KKyAgICBib29sIGlzTnVsbCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRMSFNLaW5kKCkgPT0gTnVsbEtpbmQ7CisgICAgfQorCisgICAgLy8vIENoZWNrIGZvciB0aGUgZW1wdHkgdHdpbmUuCisgICAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldExIU0tpbmQoKSA9PSBFbXB0eUtpbmQ7CisgICAgfQorCisgICAgLy8vIENoZWNrIGlmIHRoaXMgaXMgYSBudWxsYXJ5IHR3aW5lIChudWxsIG9yIGVtcHR5KS4KKyAgICBib29sIGlzTnVsbGFyeSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpc051bGwoKSB8fCBpc0VtcHR5KCk7CisgICAgfQorCisgICAgLy8vIENoZWNrIGlmIHRoaXMgaXMgYSB1bmFyeSB0d2luZS4KKyAgICBib29sIGlzVW5hcnkoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0UkhTS2luZCgpID09IEVtcHR5S2luZCAmJiAhaXNOdWxsYXJ5KCk7CisgICAgfQorCisgICAgLy8vIENoZWNrIGlmIHRoaXMgaXMgYSBiaW5hcnkgdHdpbmUuCisgICAgYm9vbCBpc0JpbmFyeSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRMSFNLaW5kKCkgIT0gTnVsbEtpbmQgJiYgZ2V0UkhTS2luZCgpICE9IEVtcHR5S2luZDsKKyAgICB9CisKKyAgICAvLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIHZhbGlkIHR3aW5lIChzYXRpc2Z5aW5nIHRoZSBpbnZhcmlhbnRzIG9uCisgICAgLy8vIG9yZGVyIGFuZCBudW1iZXIgb2YgYXJndW1lbnRzKS4KKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgICAvLyBOdWxsYXJ5IHR3aW5lcyBhbHdheXMgaGF2ZSBFbXB0eSBvbiB0aGUgUkhTLgorICAgICAgaWYgKGlzTnVsbGFyeSgpICYmIGdldFJIU0tpbmQoKSAhPSBFbXB0eUtpbmQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgLy8gTnVsbCBzaG91bGQgbmV2ZXIgYXBwZWFyIG9uIHRoZSBSSFMuCisgICAgICBpZiAoZ2V0UkhTS2luZCgpID09IE51bGxLaW5kKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIC8vIFRoZSBSSFMgY2Fubm90IGJlIG5vbi1lbXB0eSBpZiB0aGUgTEhTIGlzIGVtcHR5LgorICAgICAgaWYgKGdldFJIU0tpbmQoKSAhPSBFbXB0eUtpbmQgJiYgZ2V0TEhTS2luZCgpID09IEVtcHR5S2luZCkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAvLyBBIHR3aW5lIGNoaWxkIHNob3VsZCBhbHdheXMgYmUgYmluYXJ5LgorICAgICAgaWYgKGdldExIU0tpbmQoKSA9PSBUd2luZUtpbmQgJiYKKyAgICAgICAgICAhTEhTLnR3aW5lLT5pc0JpbmFyeSgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoZ2V0UkhTS2luZCgpID09IFR3aW5lS2luZCAmJgorICAgICAgICAgICFSSFMudHdpbmUtPmlzQmluYXJ5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8vIEdldCB0aGUgTm9kZUtpbmQgb2YgdGhlIGxlZnQtaGFuZCBzaWRlLgorICAgIE5vZGVLaW5kIGdldExIU0tpbmQoKSBjb25zdCB7IHJldHVybiBMSFNLaW5kOyB9CisKKyAgICAvLy8gR2V0IHRoZSBOb2RlS2luZCBvZiB0aGUgcmlnaHQtaGFuZCBzaWRlLgorICAgIE5vZGVLaW5kIGdldFJIU0tpbmQoKSBjb25zdCB7IHJldHVybiBSSFNLaW5kOyB9CisKKyAgICAvLy8gUHJpbnQgb25lIGNoaWxkIGZyb20gYSB0d2luZS4KKyAgICB2b2lkIHByaW50T25lQ2hpbGQocmF3X29zdHJlYW0gJk9TLCBDaGlsZCBQdHIsIE5vZGVLaW5kIEtpbmQpIGNvbnN0OworCisgICAgLy8vIFByaW50IHRoZSByZXByZXNlbnRhdGlvbiBvZiBvbmUgY2hpbGQgZnJvbSBhIHR3aW5lLgorICAgIHZvaWQgcHJpbnRPbmVDaGlsZFJlcHIocmF3X29zdHJlYW0gJk9TLCBDaGlsZCBQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlS2luZCBLaW5kKSBjb25zdDsKKworICBwdWJsaWM6CisgICAgLy8vIEBuYW1lIENvbnN0cnVjdG9ycworICAgIC8vLyBAeworCisgICAgLy8vIENvbnN0cnVjdCBmcm9tIGFuIGVtcHR5IHN0cmluZy4KKyAgICAvKmltcGxpY2l0Ki8gVHdpbmUoKSB7CisgICAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJJbnZhbGlkIHR3aW5lISIpOworICAgIH0KKworICAgIFR3aW5lKGNvbnN0IFR3aW5lICYpID0gZGVmYXVsdDsKKworICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhIEMgc3RyaW5nLgorICAgIC8vLworICAgIC8vLyBXZSB0YWtlIGNhcmUgaGVyZSB0byBvcHRpbWl6ZSAiIiBpbnRvIHRoZSBlbXB0eSB0d2luZSAtLSB0aGlzIHdpbGwgYmUKKyAgICAvLy8gb3B0aW1pemVkIG91dCBmb3Igc3RyaW5nIGNvbnN0YW50cy4gVGhpcyBhbGxvd3MgVHdpbmUgYXJndW1lbnRzIGhhdmUKKyAgICAvLy8gZGVmYXVsdCAiIiB2YWx1ZXMsIHdpdGhvdXQgaW50cm9kdWNpbmcgdW5uZWNlc3Nhcnkgc3RyaW5nIGNvbnN0YW50cy4KKyAgICAvKmltcGxpY2l0Ki8gVHdpbmUoY29uc3QgY2hhciAqU3RyKSB7CisgICAgICBpZiAoU3RyWzBdICE9ICdcMCcpIHsKKyAgICAgICAgTEhTLmNTdHJpbmcgPSBTdHI7CisgICAgICAgIExIU0tpbmQgPSBDU3RyaW5nS2luZDsKKyAgICAgIH0gZWxzZQorICAgICAgICBMSFNLaW5kID0gRW1wdHlLaW5kOworCisgICAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJJbnZhbGlkIHR3aW5lISIpOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhbiBzdGQ6OnN0cmluZy4KKyAgICAvKmltcGxpY2l0Ki8gVHdpbmUoY29uc3Qgc3RkOjpzdHJpbmcgJlN0cikgOiBMSFNLaW5kKFN0ZFN0cmluZ0tpbmQpIHsKKyAgICAgIExIUy5zdGRTdHJpbmcgPSAmU3RyOworICAgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiSW52YWxpZCB0d2luZSEiKTsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYSBTdHJpbmdSZWYuCisgICAgLyppbXBsaWNpdCovIFR3aW5lKGNvbnN0IFN0cmluZ1JlZiAmU3RyKSA6IExIU0tpbmQoU3RyaW5nUmVmS2luZCkgeworICAgICAgTEhTLnN0cmluZ1JlZiA9ICZTdHI7CisgICAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJJbnZhbGlkIHR3aW5lISIpOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhIFNtYWxsU3RyaW5nLgorICAgIC8qaW1wbGljaXQqLyBUd2luZShjb25zdCBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlN0cikKKyAgICAgICAgOiBMSFNLaW5kKFNtYWxsU3RyaW5nS2luZCkgeworICAgICAgTEhTLnNtYWxsU3RyaW5nID0gJlN0cjsKKyAgICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIkludmFsaWQgdHdpbmUhIik7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBmcm9tIGEgZm9ybWF0dl9vYmplY3RfYmFzZS4KKyAgICAvKmltcGxpY2l0Ki8gVHdpbmUoY29uc3QgZm9ybWF0dl9vYmplY3RfYmFzZSAmRm10KQorICAgICAgICA6IExIU0tpbmQoRm9ybWF0dk9iamVjdEtpbmQpIHsKKyAgICAgIExIUy5mb3JtYXR2T2JqZWN0ID0gJkZtdDsKKyAgICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIkludmFsaWQgdHdpbmUhIik7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBmcm9tIGEgY2hhci4KKyAgICBleHBsaWNpdCBUd2luZShjaGFyIFZhbCkgOiBMSFNLaW5kKENoYXJLaW5kKSB7CisgICAgICBMSFMuY2hhcmFjdGVyID0gVmFsOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgZnJvbSBhIHNpZ25lZCBjaGFyLgorICAgIGV4cGxpY2l0IFR3aW5lKHNpZ25lZCBjaGFyIFZhbCkgOiBMSFNLaW5kKENoYXJLaW5kKSB7CisgICAgICBMSFMuY2hhcmFjdGVyID0gc3RhdGljX2Nhc3Q8Y2hhcj4oVmFsKTsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGZyb20gYW4gdW5zaWduZWQgY2hhci4KKyAgICBleHBsaWNpdCBUd2luZSh1bnNpZ25lZCBjaGFyIFZhbCkgOiBMSFNLaW5kKENoYXJLaW5kKSB7CisgICAgICBMSFMuY2hhcmFjdGVyID0gc3RhdGljX2Nhc3Q8Y2hhcj4oVmFsKTsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGEgdHdpbmUgdG8gcHJpbnQgXHAgVmFsIGFzIGFuIHVuc2lnbmVkIGRlY2ltYWwgaW50ZWdlci4KKyAgICBleHBsaWNpdCBUd2luZSh1bnNpZ25lZCBWYWwpIDogTEhTS2luZChEZWNVSUtpbmQpIHsKKyAgICAgIExIUy5kZWNVSSA9IFZhbDsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGEgdHdpbmUgdG8gcHJpbnQgXHAgVmFsIGFzIGEgc2lnbmVkIGRlY2ltYWwgaW50ZWdlci4KKyAgICBleHBsaWNpdCBUd2luZShpbnQgVmFsKSA6IExIU0tpbmQoRGVjSUtpbmQpIHsKKyAgICAgIExIUy5kZWNJID0gVmFsOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgYSB0d2luZSB0byBwcmludCBccCBWYWwgYXMgYW4gdW5zaWduZWQgZGVjaW1hbCBpbnRlZ2VyLgorICAgIGV4cGxpY2l0IFR3aW5lKGNvbnN0IHVuc2lnbmVkIGxvbmcgJlZhbCkgOiBMSFNLaW5kKERlY1VMS2luZCkgeworICAgICAgTEhTLmRlY1VMID0gJlZhbDsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGEgdHdpbmUgdG8gcHJpbnQgXHAgVmFsIGFzIGEgc2lnbmVkIGRlY2ltYWwgaW50ZWdlci4KKyAgICBleHBsaWNpdCBUd2luZShjb25zdCBsb25nICZWYWwpIDogTEhTS2luZChEZWNMS2luZCkgeworICAgICAgTEhTLmRlY0wgPSAmVmFsOworICAgIH0KKworICAgIC8vLyBDb25zdHJ1Y3QgYSB0d2luZSB0byBwcmludCBccCBWYWwgYXMgYW4gdW5zaWduZWQgZGVjaW1hbCBpbnRlZ2VyLgorICAgIGV4cGxpY2l0IFR3aW5lKGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyAmVmFsKSA6IExIU0tpbmQoRGVjVUxMS2luZCkgeworICAgICAgTEhTLmRlY1VMTCA9ICZWYWw7CisgICAgfQorCisgICAgLy8vIENvbnN0cnVjdCBhIHR3aW5lIHRvIHByaW50IFxwIFZhbCBhcyBhIHNpZ25lZCBkZWNpbWFsIGludGVnZXIuCisgICAgZXhwbGljaXQgVHdpbmUoY29uc3QgbG9uZyBsb25nICZWYWwpIDogTEhTS2luZChEZWNMTEtpbmQpIHsKKyAgICAgIExIUy5kZWNMTCA9ICZWYWw7CisgICAgfQorCisgICAgLy8gRklYTUU6IFVuZm9ydHVuYXRlbHksIHRvIG1ha2Ugc3VyZSB0aGlzIGlzIGFzIGVmZmljaWVudCBhcyBwb3NzaWJsZSB3ZQorICAgIC8vIG5lZWQgZXh0cmEgYmluYXJ5IGNvbnN0cnVjdG9ycyBmcm9tIHBhcnRpY3VsYXIgdHlwZXMuIFdlIGNhbid0IHJlbHkgb24KKyAgICAvLyB0aGUgY29tcGlsZXIgdG8gYmUgc21hcnQgZW5vdWdoIHRvIGZvbGQgb3BlcmF0b3IrKCkvY29uY2F0KCkgZG93biB0byB0aGUKKyAgICAvLyByaWdodCB0aGluZy4gWWV0LgorCisgICAgLy8vIENvbnN0cnVjdCBhcyB0aGUgY29uY2F0ZW5hdGlvbiBvZiBhIEMgc3RyaW5nIGFuZCBhIFN0cmluZ1JlZi4KKyAgICAvKmltcGxpY2l0Ki8gVHdpbmUoY29uc3QgY2hhciAqTEhTLCBjb25zdCBTdHJpbmdSZWYgJlJIUykKKyAgICAgICAgOiBMSFNLaW5kKENTdHJpbmdLaW5kKSwgUkhTS2luZChTdHJpbmdSZWZLaW5kKSB7CisgICAgICB0aGlzLT5MSFMuY1N0cmluZyA9IExIUzsKKyAgICAgIHRoaXMtPlJIUy5zdHJpbmdSZWYgPSAmUkhTOworICAgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiSW52YWxpZCB0d2luZSEiKTsKKyAgICB9CisKKyAgICAvLy8gQ29uc3RydWN0IGFzIHRoZSBjb25jYXRlbmF0aW9uIG9mIGEgU3RyaW5nUmVmIGFuZCBhIEMgc3RyaW5nLgorICAgIC8qaW1wbGljaXQqLyBUd2luZShjb25zdCBTdHJpbmdSZWYgJkxIUywgY29uc3QgY2hhciAqUkhTKQorICAgICAgICA6IExIU0tpbmQoU3RyaW5nUmVmS2luZCksIFJIU0tpbmQoQ1N0cmluZ0tpbmQpIHsKKyAgICAgIHRoaXMtPkxIUy5zdHJpbmdSZWYgPSAmTEhTOworICAgICAgdGhpcy0+UkhTLmNTdHJpbmcgPSBSSFM7CisgICAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJJbnZhbGlkIHR3aW5lISIpOworICAgIH0KKworICAgIC8vLyBTaW5jZSB0aGUgaW50ZW5kZWQgdXNlIG9mIHR3aW5lcyBpcyBhcyB0ZW1wb3Jhcnkgb2JqZWN0cywgYXNzaWdubWVudHMKKyAgICAvLy8gd2hlbiBjb25jYXRlbmF0aW5nIG1pZ2h0IGNhdXNlIHVuZGVmaW5lZCBiZWhhdmlvciBvciBzdGFjayBjb3JydXB0aW9ucworICAgIFR3aW5lICZvcGVyYXRvcj0oY29uc3QgVHdpbmUgJikgPSBkZWxldGU7CisKKyAgICAvLy8gQ3JlYXRlIGEgJ251bGwnIHN0cmluZywgd2hpY2ggaXMgYW4gZW1wdHkgc3RyaW5nIHRoYXQgYWx3YXlzCisgICAgLy8vIGNvbmNhdGVuYXRlcyB0byBmb3JtIGFub3RoZXIgZW1wdHkgc3RyaW5nLgorICAgIHN0YXRpYyBUd2luZSBjcmVhdGVOdWxsKCkgeworICAgICAgcmV0dXJuIFR3aW5lKE51bGxLaW5kKTsKKyAgICB9CisKKyAgICAvLy8gQH0KKyAgICAvLy8gQG5hbWUgTnVtZXJpYyBDb252ZXJzaW9ucworICAgIC8vLyBAeworCisgICAgLy8gQ29uc3RydWN0IGEgdHdpbmUgdG8gcHJpbnQgXHAgVmFsIGFzIGFuIHVuc2lnbmVkIGhleGFkZWNpbWFsIGludGVnZXIuCisgICAgc3RhdGljIFR3aW5lIHV0b2hleHN0cihjb25zdCB1aW50NjRfdCAmVmFsKSB7CisgICAgICBDaGlsZCBMSFMsIFJIUzsKKyAgICAgIExIUy51SGV4ID0gJlZhbDsKKyAgICAgIFJIUy50d2luZSA9IG51bGxwdHI7CisgICAgICByZXR1cm4gVHdpbmUoTEhTLCBVSGV4S2luZCwgUkhTLCBFbXB0eUtpbmQpOworICAgIH0KKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBQcmVkaWNhdGUgT3BlcmF0aW9ucworICAgIC8vLyBAeworCisgICAgLy8vIENoZWNrIGlmIHRoaXMgdHdpbmUgaXMgdHJpdmlhbGx5IGVtcHR5OyBhIGZhbHNlIHJldHVybiB2YWx1ZSBkb2VzIG5vdAorICAgIC8vLyBuZWNlc3NhcmlseSBtZWFuIHRoZSB0d2luZSBpcyBlbXB0eS4KKyAgICBib29sIGlzVHJpdmlhbGx5RW1wdHkoKSBjb25zdCB7CisgICAgICByZXR1cm4gaXNOdWxsYXJ5KCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgdHdpbmUgY2FuIGJlIGR5bmFtaWNhbGx5IGFjY2Vzc2VkIGFzIGEgc2luZ2xlCisgICAgLy8vIFN0cmluZ1JlZiB2YWx1ZSB3aXRoIGdldFNpbmdsZVN0cmluZ1JlZigpLgorICAgIGJvb2wgaXNTaW5nbGVTdHJpbmdSZWYoKSBjb25zdCB7CisgICAgICBpZiAoZ2V0UkhTS2luZCgpICE9IEVtcHR5S2luZCkgcmV0dXJuIGZhbHNlOworCisgICAgICBzd2l0Y2ggKGdldExIU0tpbmQoKSkgeworICAgICAgY2FzZSBFbXB0eUtpbmQ6CisgICAgICBjYXNlIENTdHJpbmdLaW5kOgorICAgICAgY2FzZSBTdGRTdHJpbmdLaW5kOgorICAgICAgY2FzZSBTdHJpbmdSZWZLaW5kOgorICAgICAgY2FzZSBTbWFsbFN0cmluZ0tpbmQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBTdHJpbmcgT3BlcmF0aW9ucworICAgIC8vLyBAeworCisgICAgVHdpbmUgY29uY2F0KGNvbnN0IFR3aW5lICZTdWZmaXgpIGNvbnN0OworCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIE91dHB1dCAmIENvbnZlcnNpb24uCisgICAgLy8vIEB7CisKKyAgICAvLy8gUmV0dXJuIHRoZSB0d2luZSBjb250ZW50cyBhcyBhIHN0ZDo6c3RyaW5nLgorICAgIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0OworCisgICAgLy8vIEFwcGVuZCB0aGUgY29uY2F0ZW5hdGVkIHN0cmluZyBpbnRvIHRoZSBnaXZlbiBTbWFsbFN0cmluZyBvciBTbWFsbFZlY3Rvci4KKyAgICB2b2lkIHRvVmVjdG9yKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmT3V0KSBjb25zdDsKKworICAgIC8vLyBUaGlzIHJldHVybnMgdGhlIHR3aW5lIGFzIGEgc2luZ2xlIFN0cmluZ1JlZi4gIFRoaXMgbWV0aG9kIGlzIG9ubHkgdmFsaWQKKyAgICAvLy8gaWYgaXNTaW5nbGVTdHJpbmdSZWYoKSBpcyB0cnVlLgorICAgIFN0cmluZ1JlZiBnZXRTaW5nbGVTdHJpbmdSZWYoKSBjb25zdCB7CisgICAgICBhc3NlcnQoaXNTaW5nbGVTdHJpbmdSZWYoKSAmJiJUaGlzIGNhbm5vdCBiZSBoYWQgYXMgYSBzaW5nbGUgc3RyaW5ncmVmISIpOworICAgICAgc3dpdGNoIChnZXRMSFNLaW5kKCkpIHsKKyAgICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIk91dCBvZiBzeW5jIHdpdGggaXNTaW5nbGVTdHJpbmdSZWYiKTsKKyAgICAgIGNhc2UgRW1wdHlLaW5kOiAgICAgIHJldHVybiBTdHJpbmdSZWYoKTsKKyAgICAgIGNhc2UgQ1N0cmluZ0tpbmQ6ICAgIHJldHVybiBTdHJpbmdSZWYoTEhTLmNTdHJpbmcpOworICAgICAgY2FzZSBTdGRTdHJpbmdLaW5kOiAgcmV0dXJuIFN0cmluZ1JlZigqTEhTLnN0ZFN0cmluZyk7CisgICAgICBjYXNlIFN0cmluZ1JlZktpbmQ6ICByZXR1cm4gKkxIUy5zdHJpbmdSZWY7CisgICAgICBjYXNlIFNtYWxsU3RyaW5nS2luZDoKKyAgICAgICAgcmV0dXJuIFN0cmluZ1JlZihMSFMuc21hbGxTdHJpbmctPmRhdGEoKSwgTEhTLnNtYWxsU3RyaW5nLT5zaXplKCkpOworICAgICAgfQorICAgIH0KKworICAgIC8vLyBUaGlzIHJldHVybnMgdGhlIHR3aW5lIGFzIGEgc2luZ2xlIFN0cmluZ1JlZiBpZiBpdCBjYW4gYmUKKyAgICAvLy8gcmVwcmVzZW50ZWQgYXMgc3VjaC4gT3RoZXJ3aXNlIHRoZSB0d2luZSBpcyB3cml0dGVuIGludG8gdGhlIGdpdmVuCisgICAgLy8vIFNtYWxsVmVjdG9yIGFuZCBhIFN0cmluZ1JlZiB0byB0aGUgU21hbGxWZWN0b3IncyBkYXRhIGlzIHJldHVybmVkLgorICAgIFN0cmluZ1JlZiB0b1N0cmluZ1JlZihTbWFsbFZlY3RvckltcGw8Y2hhcj4gJk91dCkgY29uc3QgeworICAgICAgaWYgKGlzU2luZ2xlU3RyaW5nUmVmKCkpCisgICAgICAgIHJldHVybiBnZXRTaW5nbGVTdHJpbmdSZWYoKTsKKyAgICAgIHRvVmVjdG9yKE91dCk7CisgICAgICByZXR1cm4gU3RyaW5nUmVmKE91dC5kYXRhKCksIE91dC5zaXplKCkpOworICAgIH0KKworICAgIC8vLyBUaGlzIHJldHVybnMgdGhlIHR3aW5lIGFzIGEgc2luZ2xlIG51bGwgdGVybWluYXRlZCBTdHJpbmdSZWYgaWYgaXQKKyAgICAvLy8gY2FuIGJlIHJlcHJlc2VudGVkIGFzIHN1Y2guIE90aGVyd2lzZSB0aGUgdHdpbmUgaXMgd3JpdHRlbiBpbnRvIHRoZQorICAgIC8vLyBnaXZlbiBTbWFsbFZlY3RvciBhbmQgYSBTdHJpbmdSZWYgdG8gdGhlIFNtYWxsVmVjdG9yJ3MgZGF0YSBpcyByZXR1cm5lZC4KKyAgICAvLy8KKyAgICAvLy8gVGhlIHJldHVybmVkIFN0cmluZ1JlZidzIHNpemUgZG9lcyBub3QgaW5jbHVkZSB0aGUgbnVsbCB0ZXJtaW5hdG9yLgorICAgIFN0cmluZ1JlZiB0b051bGxUZXJtaW5hdGVkU3RyaW5nUmVmKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmT3V0KSBjb25zdDsKKworICAgIC8vLyBXcml0ZSB0aGUgY29uY2F0ZW5hdGVkIHN0cmluZyByZXByZXNlbnRlZCBieSB0aGlzIHR3aW5lIHRvIHRoZQorICAgIC8vLyBzdHJlYW0gXHAgT1MuCisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgICAgLy8vIER1bXAgdGhlIGNvbmNhdGVuYXRlZCBzdHJpbmcgcmVwcmVzZW50ZWQgYnkgdGhpcyB0d2luZSB0byBzdGRlcnIuCisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgICAvLy8gV3JpdGUgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHdpbmUgdG8gdGhlIHN0cmVhbSBccCBPUy4KKyAgICB2b2lkIHByaW50UmVwcihyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgICAgLy8vIER1bXAgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdHdpbmUgdG8gc3RkZXJyLgorICAgIHZvaWQgZHVtcFJlcHIoKSBjb25zdDsKKworICAgIC8vLyBAfQorICB9OworCisgIC8vLyBAbmFtZSBUd2luZSBJbmxpbmUgSW1wbGVtZW50YXRpb25zCisgIC8vLyBAeworCisgIGlubGluZSBUd2luZSBUd2luZTo6Y29uY2F0KGNvbnN0IFR3aW5lICZTdWZmaXgpIGNvbnN0IHsKKyAgICAvLyBDb25jYXRlbmF0aW9uIHdpdGggbnVsbCBpcyBudWxsLgorICAgIGlmIChpc051bGwoKSB8fCBTdWZmaXguaXNOdWxsKCkpCisgICAgICByZXR1cm4gVHdpbmUoTnVsbEtpbmQpOworCisgICAgLy8gQ29uY2F0ZW5hdGlvbiB3aXRoIGVtcHR5IHlpZWxkcyB0aGUgb3RoZXIgc2lkZS4KKyAgICBpZiAoaXNFbXB0eSgpKQorICAgICAgcmV0dXJuIFN1ZmZpeDsKKyAgICBpZiAoU3VmZml4LmlzRW1wdHkoKSkKKyAgICAgIHJldHVybiAqdGhpczsKKworICAgIC8vIE90aGVyd2lzZSB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldyBub2RlLCB0YWtpbmcgY2FyZSB0byBmb2xkIGluIHVuYXJ5CisgICAgLy8gdHdpbmVzLgorICAgIENoaWxkIE5ld0xIUywgTmV3UkhTOworICAgIE5ld0xIUy50d2luZSA9IHRoaXM7CisgICAgTmV3UkhTLnR3aW5lID0gJlN1ZmZpeDsKKyAgICBOb2RlS2luZCBOZXdMSFNLaW5kID0gVHdpbmVLaW5kLCBOZXdSSFNLaW5kID0gVHdpbmVLaW5kOworICAgIGlmIChpc1VuYXJ5KCkpIHsKKyAgICAgIE5ld0xIUyA9IExIUzsKKyAgICAgIE5ld0xIU0tpbmQgPSBnZXRMSFNLaW5kKCk7CisgICAgfQorICAgIGlmIChTdWZmaXguaXNVbmFyeSgpKSB7CisgICAgICBOZXdSSFMgPSBTdWZmaXguTEhTOworICAgICAgTmV3UkhTS2luZCA9IFN1ZmZpeC5nZXRMSFNLaW5kKCk7CisgICAgfQorCisgICAgcmV0dXJuIFR3aW5lKE5ld0xIUywgTmV3TEhTS2luZCwgTmV3UkhTLCBOZXdSSFNLaW5kKTsKKyAgfQorCisgIGlubGluZSBUd2luZSBvcGVyYXRvcisoY29uc3QgVHdpbmUgJkxIUywgY29uc3QgVHdpbmUgJlJIUykgeworICAgIHJldHVybiBMSFMuY29uY2F0KFJIUyk7CisgIH0KKworICAvLy8gQWRkaXRpb25hbCBvdmVybG9hZCB0byBndWFyYW50ZWUgc2ltcGxpZmllZCBjb2RlZ2VuOyB0aGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgLy8vIGNvbmNhdCgpLgorCisgIGlubGluZSBUd2luZSBvcGVyYXRvcisoY29uc3QgY2hhciAqTEhTLCBjb25zdCBTdHJpbmdSZWYgJlJIUykgeworICAgIHJldHVybiBUd2luZShMSFMsIFJIUyk7CisgIH0KKworICAvLy8gQWRkaXRpb25hbCBvdmVybG9hZCB0byBndWFyYW50ZWUgc2ltcGxpZmllZCBjb2RlZ2VuOyB0aGlzIGlzIGVxdWl2YWxlbnQgdG8KKyAgLy8vIGNvbmNhdCgpLgorCisgIGlubGluZSBUd2luZSBvcGVyYXRvcisoY29uc3QgU3RyaW5nUmVmICZMSFMsIGNvbnN0IGNoYXIgKlJIUykgeworICAgIHJldHVybiBUd2luZShMSFMsIFJIUyk7CisgIH0KKworICBpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBUd2luZSAmUkhTKSB7CisgICAgUkhTLnByaW50KE9TKTsKKyAgICByZXR1cm4gT1M7CisgIH0KKworICAvLy8gQH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQURUX1RXSU5FX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1VuaXF1ZVZlY3Rvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvVW5pcXVlVmVjdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjE3ZmIyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1VuaXF1ZVZlY3Rvci5oCkBAIC0wLDAgKzEsMTAyIEBACisvLz09PS0gbGx2bS9BRFQvVW5pcXVlVmVjdG9yLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1VOSVFVRVZFQ1RPUl9ICisjZGVmaW5lIExMVk1fQURUX1VOSVFVRVZFQ1RPUl9ICisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFVuaXF1ZVZlY3RvciAtIFRoaXMgY2xhc3MgcHJvZHVjZXMgYSBzZXF1ZW50aWFsIElEIG51bWJlciAoYmFzZSAxKSBmb3IgZWFjaAorLy8vIHVuaXF1ZSBlbnRyeSB0aGF0IGlzIGFkZGVkLiAgVCBpcyB0aGUgdHlwZSBvZiBlbnRyaWVzIGluIHRoZSB2ZWN0b3IuIFRoaXMKKy8vLyBjbGFzcyBzaG91bGQgaGF2ZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiBvcGVyYXRvcj09IGFuZCBvZiBvcGVyYXRvcjwuCisvLy8gRW50cmllcyBjYW4gYmUgZmV0Y2hlZCB1c2luZyBvcGVyYXRvcltdIHdpdGggdGhlIGVudHJ5IElELgordGVtcGxhdGU8Y2xhc3MgVD4gY2xhc3MgVW5pcXVlVmVjdG9yIHsKK3B1YmxpYzoKKyAgdXNpbmcgVmVjdG9yVHlwZSA9IHR5cGVuYW1lIHN0ZDo6dmVjdG9yPFQ+OworICB1c2luZyBpdGVyYXRvciA9IHR5cGVuYW1lIFZlY3RvclR5cGU6Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IHR5cGVuYW1lIFZlY3RvclR5cGU6OmNvbnN0X2l0ZXJhdG9yOworCitwcml2YXRlOgorICAvLyBNYXAgLSBVc2VkIHRvIGhhbmRsZSB0aGUgY29ycmVzcG9uZGVuY2Ugb2YgZW50cnkgdG8gSUQuCisgIHN0ZDo6bWFwPFQsIHVuc2lnbmVkPiBNYXA7CisKKyAgLy8gVmVjdG9yIC0gSUQgb3JkZXJlZCB2ZWN0b3Igb2YgZW50cmllcy4gRW50cmllcyBjYW4gYmUgaW5kZXhlZCBieSBJRCAtIDEuCisgIFZlY3RvclR5cGUgVmVjdG9yOworCitwdWJsaWM6CisgIC8vLyBpbnNlcnQgLSBBcHBlbmQgZW50cnkgdG8gdGhlIHZlY3RvciBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuICBSZXR1cm5zCisgIC8vLyB0aGUgZW50cnkncyBpbmRleCArIDEgdG8gYmUgdXNlZCBhcyBhIHVuaXF1ZSBJRC4KKyAgdW5zaWduZWQgaW5zZXJ0KGNvbnN0IFQgJkVudHJ5KSB7CisgICAgLy8gQ2hlY2sgaWYgdGhlIGVudHJ5IGlzIGFscmVhZHkgaW4gdGhlIG1hcC4KKyAgICB1bnNpZ25lZCAmVmFsID0gTWFwW0VudHJ5XTsKKworICAgIC8vIFNlZSBpZiBlbnRyeSBleGlzdHMsIGlmIHNvIHJldHVybiBwcmlvciBJRC4KKyAgICBpZiAoVmFsKSByZXR1cm4gVmFsOworCisgICAgLy8gQ29tcHV0ZSBJRCBmb3IgZW50cnkuCisgICAgVmFsID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KFZlY3Rvci5zaXplKCkpICsgMTsKKworICAgIC8vIEluc2VydCBpbiB2ZWN0b3IuCisgICAgVmVjdG9yLnB1c2hfYmFjayhFbnRyeSk7CisgICAgcmV0dXJuIFZhbDsKKyAgfQorCisgIC8vLyBpZEZvciAtIHJldHVybiB0aGUgSUQgZm9yIGFuIGV4aXN0aW5nIGVudHJ5LiAgUmV0dXJucyAwIGlmIHRoZSBlbnRyeSBpcworICAvLy8gbm90IGZvdW5kLgorICB1bnNpZ25lZCBpZEZvcihjb25zdCBUICZFbnRyeSkgY29uc3QgeworICAgIC8vIFNlYXJjaCBmb3IgZW50cnkgaW4gdGhlIG1hcC4KKyAgICB0eXBlbmFtZSBzdGQ6Om1hcDxULCB1bnNpZ25lZD46OmNvbnN0X2l0ZXJhdG9yIE1JID0gTWFwLmZpbmQoRW50cnkpOworCisgICAgLy8gU2VlIGlmIGVudHJ5IGV4aXN0cywgaWYgc28gcmV0dXJuIElELgorICAgIGlmIChNSSAhPSBNYXAuZW5kKCkpIHJldHVybiBNSS0+c2Vjb25kOworCisgICAgLy8gTm8gbHVjay4KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBvcGVyYXRvcltdIC0gUmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGUgZW50cnkgd2l0aCB0aGUgc3BlY2lmaWVkIElELgorICBjb25zdCBUICZvcGVyYXRvcltdKHVuc2lnbmVkIElEKSBjb25zdCB7CisgICAgYXNzZXJ0KElELTEgPCBzaXplKCkgJiYgIklEIGlzIDAgb3Igb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBWZWN0b3JbSUQgLSAxXTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGFuIGl0ZXJhdG9yIHRvIHRoZSBzdGFydCBvZiB0aGUgdmVjdG9yLgorICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIFZlY3Rvci5iZWdpbigpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYW4gaXRlcmF0b3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSB2ZWN0b3IuCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gVmVjdG9yLmJlZ2luKCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiBhbiBpdGVyYXRvciB0byB0aGUgZW5kIG9mIHRoZSB2ZWN0b3IuCisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIFZlY3Rvci5lbmQoKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGFuIGl0ZXJhdG9yIHRvIHRoZSBlbmQgb2YgdGhlIHZlY3Rvci4KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gVmVjdG9yLmVuZCgpOyB9CisKKyAgLy8vIHNpemUgLSBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgdmVjdG9yLgorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFZlY3Rvci5zaXplKCk7IH0KKworICAvLy8gZW1wdHkgLSBSZXR1cm5zIHRydWUgaWYgdGhlIHZlY3RvciBpcyBlbXB0eS4KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFZlY3Rvci5lbXB0eSgpOyB9CisKKyAgLy8vIHJlc2V0IC0gQ2xlYXJzIGFsbCB0aGUgZW50cmllcy4KKyAgdm9pZCByZXNldCgpIHsKKyAgICBNYXAuY2xlYXIoKTsKKyAgICBWZWN0b3IucmVzaXplKDAsIDApOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfVU5JUVVFVkVDVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1ZhcmlhZGljRnVuY3Rpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL1ZhcmlhZGljRnVuY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDMxMzBjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvVmFyaWFkaWNGdW5jdGlvbi5oCkBAIC0wLDAgKzEsMzMxIEBACisvLz09PS0tLSBWYXJpYWRpY0Z1bmN0aW9ucy5oIC0gVmFyaWFkaWMgRnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgaW1wbGVtZW50cyBjb21waWxlLXRpbWUgdHlwZS1zYWZlIHZhcmlhZGljIGZ1bmN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX1ZBUklBRElDRlVOQ1RJT05fSAorI2RlZmluZSBMTFZNX0FEVF9WQVJJQURJQ0ZVTkNUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8gRGVmaW5lIG1hY3JvcyB0byBhaWQgaW4gZXhwYW5kaW5nIGEgY29tbWEgc2VwYXJhdGVkIHNlcmllcyB3aXRoIHRoZSBpbmRleCBvZgorLy8gdGhlIHNlcmllcyBwYXN0ZWQgb250byB0aGUgbGFzdCB0b2tlbi4KKyNkZWZpbmUgTExWTV9DT01NQV9KT0lOMSh4KSB4ICMjIDAKKyNkZWZpbmUgTExWTV9DT01NQV9KT0lOMih4KSBMTFZNX0NPTU1BX0pPSU4xKHgpLCB4ICMjIDEKKyNkZWZpbmUgTExWTV9DT01NQV9KT0lOMyh4KSBMTFZNX0NPTU1BX0pPSU4yKHgpLCB4ICMjIDIKKyNkZWZpbmUgTExWTV9DT01NQV9KT0lONCh4KSBMTFZNX0NPTU1BX0pPSU4zKHgpLCB4ICMjIDMKKyNkZWZpbmUgTExWTV9DT01NQV9KT0lONSh4KSBMTFZNX0NPTU1BX0pPSU40KHgpLCB4ICMjIDQKKyNkZWZpbmUgTExWTV9DT01NQV9KT0lONih4KSBMTFZNX0NPTU1BX0pPSU41KHgpLCB4ICMjIDUKKyNkZWZpbmUgTExWTV9DT01NQV9KT0lONyh4KSBMTFZNX0NPTU1BX0pPSU42KHgpLCB4ICMjIDYKKyNkZWZpbmUgTExWTV9DT01NQV9KT0lOOCh4KSBMTFZNX0NPTU1BX0pPSU43KHgpLCB4ICMjIDcKKyNkZWZpbmUgTExWTV9DT01NQV9KT0lOOSh4KSBMTFZNX0NPTU1BX0pPSU44KHgpLCB4ICMjIDgKKyNkZWZpbmUgTExWTV9DT01NQV9KT0lOMTAoeCkgTExWTV9DT01NQV9KT0lOOSh4KSwgeCAjIyA5CisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjExKHgpIExMVk1fQ09NTUFfSk9JTjEwKHgpLCB4ICMjIDEwCisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjEyKHgpIExMVk1fQ09NTUFfSk9JTjExKHgpLCB4ICMjIDExCisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjEzKHgpIExMVk1fQ09NTUFfSk9JTjEyKHgpLCB4ICMjIDEyCisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjE0KHgpIExMVk1fQ09NTUFfSk9JTjEzKHgpLCB4ICMjIDEzCisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjE1KHgpIExMVk1fQ09NTUFfSk9JTjE0KHgpLCB4ICMjIDE0CisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjE2KHgpIExMVk1fQ09NTUFfSk9JTjE1KHgpLCB4ICMjIDE1CisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjE3KHgpIExMVk1fQ09NTUFfSk9JTjE2KHgpLCB4ICMjIDE2CisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjE4KHgpIExMVk1fQ09NTUFfSk9JTjE3KHgpLCB4ICMjIDE3CisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjE5KHgpIExMVk1fQ09NTUFfSk9JTjE4KHgpLCB4ICMjIDE4CisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjIwKHgpIExMVk1fQ09NTUFfSk9JTjE5KHgpLCB4ICMjIDE5CisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjIxKHgpIExMVk1fQ09NTUFfSk9JTjIwKHgpLCB4ICMjIDIwCisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjIyKHgpIExMVk1fQ09NTUFfSk9JTjIxKHgpLCB4ICMjIDIxCisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjIzKHgpIExMVk1fQ09NTUFfSk9JTjIyKHgpLCB4ICMjIDIyCisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjI0KHgpIExMVk1fQ09NTUFfSk9JTjIzKHgpLCB4ICMjIDIzCisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjI1KHgpIExMVk1fQ09NTUFfSk9JTjI0KHgpLCB4ICMjIDI0CisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjI2KHgpIExMVk1fQ09NTUFfSk9JTjI1KHgpLCB4ICMjIDI1CisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjI3KHgpIExMVk1fQ09NTUFfSk9JTjI2KHgpLCB4ICMjIDI2CisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjI4KHgpIExMVk1fQ09NTUFfSk9JTjI3KHgpLCB4ICMjIDI3CisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjI5KHgpIExMVk1fQ09NTUFfSk9JTjI4KHgpLCB4ICMjIDI4CisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjMwKHgpIExMVk1fQ09NTUFfSk9JTjI5KHgpLCB4ICMjIDI5CisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjMxKHgpIExMVk1fQ09NTUFfSk9JTjMwKHgpLCB4ICMjIDMwCisjZGVmaW5lIExMVk1fQ09NTUFfSk9JTjMyKHgpIExMVk1fQ09NTUFfSk9JTjMxKHgpLCB4ICMjIDMxCisKKy8vLyBcYnJpZWYgQ2xhc3Mgd2hpY2ggY2FuIHNpbXVsYXRlIGEgdHlwZS1zYWZlIHZhcmlhZGljIGZ1bmN0aW9uLgorLy8vCisvLy8gVGhlIFZhcmlhZGljRnVuY3Rpb24gY2xhc3MgdGVtcGxhdGUgbWFrZXMgaXQgZWFzeSB0byBkZWZpbmUKKy8vLyB0eXBlLXNhZmUgdmFyaWFkaWMgZnVuY3Rpb25zIHdoZXJlIGFsbCBhcmd1bWVudHMgaGF2ZSB0aGUgc2FtZQorLy8vIHR5cGUuCisvLy8KKy8vLyBTdXBwb3NlIHdlIG5lZWQgYSB2YXJpYWRpYyBmdW5jdGlvbiBsaWtlIHRoaXM6CisvLy8KKy8vLyAgIFJlc3VsdFQgRm9vKGNvbnN0IEFyZ1QgJkFfMCwgY29uc3QgQXJnVCAmQV8xLCAuLi4sIGNvbnN0IEFyZ1QgJkFfTik7CisvLy8KKy8vLyBJbnN0ZWFkIG9mIG1hbnkgb3ZlcmxvYWRzIG9mIEZvbygpLCB3ZSBvbmx5IG5lZWQgdG8gZGVmaW5lIGEgaGVscGVyCisvLy8gZnVuY3Rpb24gdGhhdCB0YWtlcyBhbiBhcnJheSBvZiBhcmd1bWVudHM6CisvLy8KKy8vLyAgIFJlc3VsdFQgRm9vSW1wbChBcnJheVJlZjxjb25zdCBBcmdUICo+IEFyZ3MpIHsKKy8vLyAgICAgLy8gJ0FyZ3NbaV0nIGlzIGEgcG9pbnRlciB0byB0aGUgaS10aCBhcmd1bWVudCBwYXNzZWQgdG8gRm9vKCkuCisvLy8gICAgIC4uLgorLy8vICAgfQorLy8vCisvLy8gYW5kIHRoZW4gZGVmaW5lIEZvbygpIGxpa2UgdGhpczoKKy8vLworLy8vICAgY29uc3QgVmFyaWFkaWNGdW5jdGlvbjxSZXN1bHRULCBBcmdULCBGb29JbXBsPiBGb287CisvLy8KKy8vLyBWYXJpYWRpY0Z1bmN0aW9uIHRha2VzIGNhcmUgb2YgZGVmaW5pbmcgdGhlIG92ZXJsb2FkcyBvZiBGb28oKS4KKy8vLworLy8vIEFjdHVhbGx5LCBGb28gaXMgYSBmdW5jdGlvbiBvYmplY3QgKGkuZS4gZnVuY3RvcikgaW5zdGVhZCBvZiBhIHBsYWluCisvLy8gZnVuY3Rpb24uICBUaGlzIG9iamVjdCBpcyBzdGF0ZWxlc3MgYW5kIGl0cyBjb25zdHJ1Y3Rvci9kZXN0cnVjdG9yCisvLy8gZG9lcyBub3RoaW5nLCBzbyBpdCdzIHNhZmUgdG8gY3JlYXRlIGdsb2JhbCBvYmplY3RzIGFuZCBjYWxsIEZvbyguLi4pIGF0CisvLy8gYW55IHRpbWUuCisvLy8KKy8vLyBTb21ldGltZXMgd2UgbmVlZCBhIHZhcmlhZGljIGZ1bmN0aW9uIHRvIGhhdmUgc29tZSBmaXhlZCBsZWFkaW5nCisvLy8gYXJndW1lbnRzIHdob3NlIHR5cGVzIG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGF0IG9mIHRoZSBvcHRpb25hbAorLy8vIGFyZ3VtZW50cy4gIEZvciBleGFtcGxlOgorLy8vCisvLy8gICBib29sIEZ1bGxNYXRjaChjb25zdCBTdHJpbmdSZWYgJlMsIGNvbnN0IFJFICZSZWdleCwKKy8vLyAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZ1QgJkFfMCwgLi4uLCBjb25zdCBBcmdUICZBX04pOworLy8vCisvLy8gVmFyaWFkaWNGdW5jdGlvbk4gaXMgZm9yIHN1Y2ggY2FzZXMsIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBmaXhlZAorLy8vIGFyZ3VtZW50cy4gIEl0IGlzIGxpa2UgVmFyaWFkaWNGdW5jdGlvbiwgZXhjZXB0IHRoYXQgaXQgdGFrZXMgTiBtb3JlCisvLy8gdGVtcGxhdGUgYXJndW1lbnRzIGZvciB0aGUgdHlwZXMgb2YgdGhlIGZpeGVkIGFyZ3VtZW50czoKKy8vLworLy8vICAgYm9vbCBGdWxsTWF0Y2hJbXBsKGNvbnN0IFN0cmluZ1JlZiAmUywgY29uc3QgUkUgJlJlZ2V4LAorLy8vICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IEFyZ1QgKj4gQXJncykgeyAuLi4gfQorLy8vICAgY29uc3QgVmFyaWFkaWNGdW5jdGlvbjI8Ym9vbCwgY29uc3QgU3RyaW5nUmVmJiwKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJFJiwgQXJnVCwgRnVsbE1hdGNoSW1wbD4KKy8vLyAgICAgICBGdWxsTWF0Y2g7CisvLy8KKy8vLyBDdXJyZW50bHkgVmFyaWFkaWNGdW5jdGlvbiBhbmQgZnJpZW5kcyBzdXBwb3J0IHVwLXRvIDMKKy8vLyBmaXhlZCBsZWFkaW5nIGFyZ3VtZW50cyBhbmQgdXAtdG8gMzIgb3B0aW9uYWwgYXJndW1lbnRzLgordGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdFQsIHR5cGVuYW1lIEFyZ1QsCisgICAgICAgICAgUmVzdWx0VCAoKkZ1bmMpKEFycmF5UmVmPGNvbnN0IEFyZ1QgKj4pPgorc3RydWN0IFZhcmlhZGljRnVuY3Rpb24geworICBSZXN1bHRUIG9wZXJhdG9yKCkoKSBjb25zdCB7CisgICAgcmV0dXJuIEZ1bmMoTm9uZSk7CisgIH0KKworI2RlZmluZSBMTFZNX0RFRklORV9PVkVSTE9BRChOKSBcCisgIFJlc3VsdFQgb3BlcmF0b3IoKShMTFZNX0NPTU1BX0pPSU4gIyMgTihjb25zdCBBcmdUICZBKSkgY29uc3QgeyBcCisgICAgY29uc3QgQXJnVCAqY29uc3QgQXJnc1tdID0geyBMTFZNX0NPTU1BX0pPSU4gIyMgTigmQSkgfTsgXAorICAgIHJldHVybiBGdW5jKG1ha2VBcnJheVJlZihBcmdzKSk7IFwKKyAgfQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgzKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg0KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg1KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg2KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg3KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg4KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg5KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxMCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTEpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDEyKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxMykKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTQpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDE1KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxNikKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTcpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDE4KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxOSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjApCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDIxKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyMikKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjMpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDI0KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyNSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjYpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDI3KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyOCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjkpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDMwKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgzMSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMzIpCisjdW5kZWYgTExWTV9ERUZJTkVfT1ZFUkxPQUQKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHRULCB0eXBlbmFtZSBQYXJhbTBULCB0eXBlbmFtZSBBcmdULAorICAgICAgICAgIFJlc3VsdFQgKCpGdW5jKShQYXJhbTBULCBBcnJheVJlZjxjb25zdCBBcmdUICo+KT4KK3N0cnVjdCBWYXJpYWRpY0Z1bmN0aW9uMSB7CisgIFJlc3VsdFQgb3BlcmF0b3IoKShQYXJhbTBUIFAwKSBjb25zdCB7CisgICAgcmV0dXJuIEZ1bmMoUDAsIE5vbmUpOworICB9CisKKyNkZWZpbmUgTExWTV9ERUZJTkVfT1ZFUkxPQUQoTikgXAorICBSZXN1bHRUIG9wZXJhdG9yKCkoUGFyYW0wVCBQMCwgTExWTV9DT01NQV9KT0lOICMjIE4oY29uc3QgQXJnVCAmQSkpIGNvbnN0IHsgXAorICAgIGNvbnN0IEFyZ1QgKmNvbnN0IEFyZ3NbXSA9IHsgTExWTV9DT01NQV9KT0lOICMjIE4oJkEpIH07IFwKKyAgICByZXR1cm4gRnVuYyhQMCwgbWFrZUFycmF5UmVmKEFyZ3MpKTsgXAorICB9CisgIExMVk1fREVGSU5FX09WRVJMT0FEKDEpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDIpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDMpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDQpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDUpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDYpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDcpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDgpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDkpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDEwKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxMSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTIpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDEzKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxNCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTUpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDE2KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxNykKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTgpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDE5KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyMCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjEpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDIyKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyMykKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjQpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDI1KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyNikKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjcpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDI4KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyOSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMzApCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDMxKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgzMikKKyN1bmRlZiBMTFZNX0RFRklORV9PVkVSTE9BRAorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdFQsIHR5cGVuYW1lIFBhcmFtMFQsIHR5cGVuYW1lIFBhcmFtMVQsIHR5cGVuYW1lIEFyZ1QsCisgICAgICAgICAgUmVzdWx0VCAoKkZ1bmMpKFBhcmFtMFQsIFBhcmFtMVQsIEFycmF5UmVmPGNvbnN0IEFyZ1QgKj4pPgorc3RydWN0IFZhcmlhZGljRnVuY3Rpb24yIHsKKyAgUmVzdWx0VCBvcGVyYXRvcigpKFBhcmFtMFQgUDAsIFBhcmFtMVQgUDEpIGNvbnN0IHsKKyAgICByZXR1cm4gRnVuYyhQMCwgUDEsIE5vbmUpOworICB9CisKKyNkZWZpbmUgTExWTV9ERUZJTkVfT1ZFUkxPQUQoTikgXAorICBSZXN1bHRUIG9wZXJhdG9yKCkoUGFyYW0wVCBQMCwgUGFyYW0xVCBQMSwgXAorICAgICAgICAgICAgICAgICAgICAgTExWTV9DT01NQV9KT0lOICMjIE4oY29uc3QgQXJnVCAmQSkpIGNvbnN0IHsgXAorICAgIGNvbnN0IEFyZ1QgKmNvbnN0IEFyZ3NbXSA9IHsgTExWTV9DT01NQV9KT0lOICMjIE4oJkEpIH07IFwKKyAgICByZXR1cm4gRnVuYyhQMCwgUDEsIG1ha2VBcnJheVJlZihBcmdzKSk7IFwKKyAgfQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgzKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg0KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg1KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg2KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg3KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg4KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCg5KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxMCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTEpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDEyKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxMykKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTQpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDE1KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxNikKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTcpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDE4KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxOSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjApCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDIxKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyMikKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjMpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDI0KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyNSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjYpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDI3KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyOCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjkpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDMwKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgzMSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMzIpCisjdW5kZWYgTExWTV9ERUZJTkVfT1ZFUkxPQUQKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHRULCB0eXBlbmFtZSBQYXJhbTBULCB0eXBlbmFtZSBQYXJhbTFULAorICAgICAgICAgIHR5cGVuYW1lIFBhcmFtMlQsIHR5cGVuYW1lIEFyZ1QsCisgICAgICAgICAgUmVzdWx0VCAoKkZ1bmMpKFBhcmFtMFQsIFBhcmFtMVQsIFBhcmFtMlQsIEFycmF5UmVmPGNvbnN0IEFyZ1QgKj4pPgorc3RydWN0IFZhcmlhZGljRnVuY3Rpb24zIHsKKyAgUmVzdWx0VCBvcGVyYXRvcigpKFBhcmFtMFQgUDAsIFBhcmFtMVQgUDEsIFBhcmFtMlQgUDIpIGNvbnN0IHsKKyAgICByZXR1cm4gRnVuYyhQMCwgUDEsIFAyLCBOb25lKTsKKyAgfQorCisjZGVmaW5lIExMVk1fREVGSU5FX09WRVJMT0FEKE4pIFwKKyAgUmVzdWx0VCBvcGVyYXRvcigpKFBhcmFtMFQgUDAsIFBhcmFtMVQgUDEsIFBhcmFtMlQgUDIsIFwKKyAgICAgICAgICAgICAgICAgICAgIExMVk1fQ09NTUFfSk9JTiAjIyBOKGNvbnN0IEFyZ1QgJkEpKSBjb25zdCB7IFwKKyAgICBjb25zdCBBcmdUICpjb25zdCBBcmdzW10gPSB7IExMVk1fQ09NTUFfSk9JTiAjIyBOKCZBKSB9OyBcCisgICAgcmV0dXJuIEZ1bmMoUDAsIFAxLCBQMiwgbWFrZUFycmF5UmVmKEFyZ3MpKTsgXAorICB9CisgIExMVk1fREVGSU5FX09WRVJMT0FEKDEpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDIpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDMpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDQpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDUpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDYpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDcpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDgpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDkpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDEwKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxMSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTIpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDEzKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxNCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTUpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDE2KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgxNykKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMTgpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDE5KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyMCkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjEpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDIyKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyMykKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjQpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDI1KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyNikKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMjcpCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDI4KQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgyOSkKKyAgTExWTV9ERUZJTkVfT1ZFUkxPQUQoMzApCisgIExMVk1fREVGSU5FX09WRVJMT0FEKDMxKQorICBMTFZNX0RFRklORV9PVkVSTE9BRCgzMikKKyN1bmRlZiBMTFZNX0RFRklORV9PVkVSTE9BRAorfTsKKworLy8gQ2xlYW51cCB0aGUgbWFjcm8gbmFtZXNwYWNlLgorI3VuZGVmIExMVk1fQ09NTUFfSk9JTjEKKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU4yCisjdW5kZWYgTExWTV9DT01NQV9KT0lOMworI3VuZGVmIExMVk1fQ09NTUFfSk9JTjQKKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU41CisjdW5kZWYgTExWTV9DT01NQV9KT0lONgorI3VuZGVmIExMVk1fQ09NTUFfSk9JTjcKKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU44CisjdW5kZWYgTExWTV9DT01NQV9KT0lOOQorI3VuZGVmIExMVk1fQ09NTUFfSk9JTjEwCisjdW5kZWYgTExWTV9DT01NQV9KT0lOMTEKKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU4xMgorI3VuZGVmIExMVk1fQ09NTUFfSk9JTjEzCisjdW5kZWYgTExWTV9DT01NQV9KT0lOMTQKKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU4xNQorI3VuZGVmIExMVk1fQ09NTUFfSk9JTjE2CisjdW5kZWYgTExWTV9DT01NQV9KT0lOMTcKKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU4xOAorI3VuZGVmIExMVk1fQ09NTUFfSk9JTjE5CisjdW5kZWYgTExWTV9DT01NQV9KT0lOMjAKKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU4yMQorI3VuZGVmIExMVk1fQ09NTUFfSk9JTjIyCisjdW5kZWYgTExWTV9DT01NQV9KT0lOMjMKKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU4yNAorI3VuZGVmIExMVk1fQ09NTUFfSk9JTjI1CisjdW5kZWYgTExWTV9DT01NQV9KT0lOMjYKKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU4yNworI3VuZGVmIExMVk1fQ09NTUFfSk9JTjI4CisjdW5kZWYgTExWTV9DT01NQV9KT0lOMjkKKyN1bmRlZiBMTFZNX0NPTU1BX0pPSU4zMAorI3VuZGVmIExMVk1fQ09NTUFfSk9JTjMxCisjdW5kZWYgTExWTV9DT01NQV9KT0lOMzIKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmICAvLyBMTFZNX0FEVF9WQVJJQURJQ0ZVTkNUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL2VkaXRfZGlzdGFuY2UuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL2VkaXRfZGlzdGFuY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmEwMWIxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvZWRpdF9kaXN0YW5jZS5oCkBAIC0wLDAgKzEsMTAzIEBACisvLz09PS0tIGxsdm0vQURUL2VkaXRfZGlzdGFuY2UuaCAtIEFycmF5IGVkaXQgZGlzdGFuY2UgZnVuY3Rpb24gLS0tIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgTGV2ZW5zaHRlaW4gZGlzdGFuY2UgZnVuY3Rpb24gdGhhdCB3b3JrcyBmb3IgYW55IHR3bworLy8gc2VxdWVuY2VzLCB3aXRoIGVhY2ggZWxlbWVudCBvZiBlYWNoIHNlcXVlbmNlIGJlaW5nIGFuYWxvZ291cyB0byBhIGNoYXJhY3RlcgorLy8gaW4gYSBzdHJpbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FEVF9FRElUX0RJU1RBTkNFX0gKKyNkZWZpbmUgTExWTV9BRFRfRURJVF9ESVNUQU5DRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIGVkaXQgZGlzdGFuY2UgYmV0d2VlbiB0d28gc2VxdWVuY2VzLgorLy8vCisvLy8gXHBhcmFtIEZyb21BcnJheSB0aGUgZmlyc3Qgc2VxdWVuY2UgdG8gY29tcGFyZS4KKy8vLworLy8vIFxwYXJhbSBUb0FycmF5IHRoZSBzZWNvbmQgc2VxdWVuY2UgdG8gY29tcGFyZS4KKy8vLworLy8vIFxwYXJhbSBBbGxvd1JlcGxhY2VtZW50cyB3aGV0aGVyIHRvIGFsbG93IGVsZW1lbnQgcmVwbGFjZW1lbnRzIChjaGFuZ2Ugb25lCisvLy8gZWxlbWVudCBpbnRvIGFub3RoZXIpIGFzIGEgc2luZ2xlIG9wZXJhdGlvbiwgcmF0aGVyIHRoYW4gYXMgdHdvIG9wZXJhdGlvbnMKKy8vLyAoYW4gaW5zZXJ0aW9uIGFuZCBhIHJlbW92YWwpLgorLy8vCisvLy8gXHBhcmFtIE1heEVkaXREaXN0YW5jZSBJZiBub24temVybywgdGhlIG1heGltdW0gZWRpdCBkaXN0YW5jZSB0aGF0IHRoaXMKKy8vLyByb3V0aW5lIGlzIGFsbG93ZWQgdG8gY29tcHV0ZS4gSWYgdGhlIGVkaXQgZGlzdGFuY2Ugd2lsbCBleGNlZWQgdGhhdAorLy8vIG1heGltdW0sIHJldHVybnMgXGMgTWF4RWRpdERpc3RhbmNlKzEuCisvLy8KKy8vLyBccmV0dXJucyB0aGUgbWluaW11bSBudW1iZXIgb2YgZWxlbWVudCBpbnNlcnRpb25zLCByZW1vdmFscywgb3IgKGlmCisvLy8gXHAgQWxsb3dSZXBsYWNlbWVudHMgaXMgXGMgdHJ1ZSkgcmVwbGFjZW1lbnRzIG5lZWRlZCB0byB0cmFuc2Zvcm0gb25lIG9mCisvLy8gdGhlIGdpdmVuIHNlcXVlbmNlcyBpbnRvIHRoZSBvdGhlci4gSWYgemVybywgdGhlIHNlcXVlbmNlcyBhcmUgaWRlbnRpY2FsLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3Vuc2lnbmVkIENvbXB1dGVFZGl0RGlzdGFuY2UoQXJyYXlSZWY8VD4gRnJvbUFycmF5LCBBcnJheVJlZjxUPiBUb0FycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93UmVwbGFjZW1lbnRzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF4RWRpdERpc3RhbmNlID0gMCkgeworICAvLyBUaGUgYWxnb3JpdGhtIGltcGxlbWVudGVkIGJlbG93IGlzIHRoZSAiY2xhc3NpYyIKKyAgLy8gZHluYW1pYy1wcm9ncmFtbWluZyBhbGdvcml0aG0gZm9yIGNvbXB1dGluZyB0aGUgTGV2ZW5zaHRlaW4KKyAgLy8gZGlzdGFuY2UsIHdoaWNoIGlzIGRlc2NyaWJlZCBoZXJlOgorICAvLworICAvLyAgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvTGV2ZW5zaHRlaW5fZGlzdGFuY2UKKyAgLy8KKyAgLy8gQWx0aG91Z2ggdGhlIGFsZ29yaXRobSBpcyB0eXBpY2FsbHkgZGVzY3JpYmVkIHVzaW5nIGFuIG0geCBuCisgIC8vIGFycmF5LCBvbmx5IG9uZSByb3cgcGx1cyBvbmUgZWxlbWVudCBhcmUgdXNlZCBhdCBhIHRpbWUsIHNvIHRoaXMKKyAgLy8gaW1wbGVtZW50YXRpb24ganVzdCBrZWVwcyBvbmUgdmVjdG9yIGZvciB0aGUgcm93LiAgVG8gdXBkYXRlIG9uZSBlbnRyeSwKKyAgLy8gb25seSB0aGUgZW50cmllcyB0byB0aGUgbGVmdCwgdG9wLCBhbmQgdG9wLWxlZnQgYXJlIG5lZWRlZC4gIFRoZSBsZWZ0CisgIC8vIGVudHJ5IGlzIGluIFJvd1t4LTFdLCB0aGUgdG9wIGVudHJ5IGlzIHdoYXQncyBpbiBSb3dbeF0gZnJvbSB0aGUgbGFzdAorICAvLyBpdGVyYXRpb24sIGFuZCB0aGUgdG9wLWxlZnQgZW50cnkgaXMgc3RvcmVkIGluIFByZXZpb3VzLgorICB0eXBlbmFtZSBBcnJheVJlZjxUPjo6c2l6ZV90eXBlIG0gPSBGcm9tQXJyYXkuc2l6ZSgpOworICB0eXBlbmFtZSBBcnJheVJlZjxUPjo6c2l6ZV90eXBlIG4gPSBUb0FycmF5LnNpemUoKTsKKworICBjb25zdCB1bnNpZ25lZCBTbWFsbEJ1ZmZlclNpemUgPSA2NDsKKyAgdW5zaWduZWQgU21hbGxCdWZmZXJbU21hbGxCdWZmZXJTaXplXTsKKyAgc3RkOjp1bmlxdWVfcHRyPHVuc2lnbmVkW10+IEFsbG9jYXRlZDsKKyAgdW5zaWduZWQgKlJvdyA9IFNtYWxsQnVmZmVyOworICBpZiAobiArIDEgPiBTbWFsbEJ1ZmZlclNpemUpIHsKKyAgICBSb3cgPSBuZXcgdW5zaWduZWRbbiArIDFdOworICAgIEFsbG9jYXRlZC5yZXNldChSb3cpOworICB9CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8PSBuOyArK2kpCisgICAgUm93W2ldID0gaTsKKworICBmb3IgKHR5cGVuYW1lIEFycmF5UmVmPFQ+OjpzaXplX3R5cGUgeSA9IDE7IHkgPD0gbTsgKyt5KSB7CisgICAgUm93WzBdID0geTsKKyAgICB1bnNpZ25lZCBCZXN0VGhpc1JvdyA9IFJvd1swXTsKKworICAgIHVuc2lnbmVkIFByZXZpb3VzID0geSAtIDE7CisgICAgZm9yICh0eXBlbmFtZSBBcnJheVJlZjxUPjo6c2l6ZV90eXBlIHggPSAxOyB4IDw9IG47ICsreCkgeworICAgICAgaW50IE9sZFJvdyA9IFJvd1t4XTsKKyAgICAgIGlmIChBbGxvd1JlcGxhY2VtZW50cykgeworICAgICAgICBSb3dbeF0gPSBzdGQ6Om1pbigKKyAgICAgICAgICAgIFByZXZpb3VzICsgKEZyb21BcnJheVt5LTFdID09IFRvQXJyYXlbeC0xXSA/IDB1IDogMXUpLAorICAgICAgICAgICAgc3RkOjptaW4oUm93W3gtMV0sIFJvd1t4XSkrMSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgaWYgKEZyb21BcnJheVt5LTFdID09IFRvQXJyYXlbeC0xXSkgUm93W3hdID0gUHJldmlvdXM7CisgICAgICAgIGVsc2UgUm93W3hdID0gc3RkOjptaW4oUm93W3gtMV0sIFJvd1t4XSkgKyAxOworICAgICAgfQorICAgICAgUHJldmlvdXMgPSBPbGRSb3c7CisgICAgICBCZXN0VGhpc1JvdyA9IHN0ZDo6bWluKEJlc3RUaGlzUm93LCBSb3dbeF0pOworICAgIH0KKworICAgIGlmIChNYXhFZGl0RGlzdGFuY2UgJiYgQmVzdFRoaXNSb3cgPiBNYXhFZGl0RGlzdGFuY2UpCisgICAgICByZXR1cm4gTWF4RWRpdERpc3RhbmNlICsgMTsKKyAgfQorCisgIHVuc2lnbmVkIFJlc3VsdCA9IFJvd1tuXTsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9pbGlzdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvaWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzg4ZjgxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvaWxpc3QuaApAQCAtMCwwICsxLDQzNCBAQAorLy89PS0tIGxsdm0vQURUL2lsaXN0LmggLSBJbnRydXNpdmUgTGlua2VkIExpc3QgVGVtcGxhdGUgLS0tLS0tLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBjbGFzc2VzIHRvIGltcGxlbWVudCBhbiBpbnRydXNpdmUgZG91Ymx5IGxpbmtlZCBsaXN0IGNsYXNzCisvLyAoaS5lLiBlYWNoIG5vZGUgb2YgdGhlIGxpc3QgbXVzdCBjb250YWluIGEgbmV4dCBhbmQgcHJldmlvdXMgZmllbGQgZm9yIHRoZQorLy8gbGlzdC4KKy8vCisvLyBUaGUgaWxpc3QgY2xhc3MgaXRzZWxmIHNob3VsZCBiZSBhIHBsdWcgaW4gcmVwbGFjZW1lbnQgZm9yIGxpc3QuICBUaGlzIGxpc3QKKy8vIHJlcGxhY2VtZW50IGRvZXMgbm90IHByb3ZpZGUgYSBjb25zdGFudCB0aW1lIHNpemUoKSBtZXRob2QsIHNvIGJlIGNhcmVmdWwgdG8KKy8vIHVzZSBlbXB0eSgpIHdoZW4geW91IHJlYWxseSB3YW50IHRvIGtub3cgaWYgaXQncyBlbXB0eS4KKy8vCisvLyBUaGUgaWxpc3QgY2xhc3MgaXMgaW1wbGVtZW50ZWQgYXMgYSBjaXJjdWxhciBsaXN0LiAgVGhlIGxpc3QgaXRzZWxmIGNvbnRhaW5zCisvLyBhIHNlbnRpbmVsIG5vZGUsIHdob3NlIE5leHQgcG9pbnRzIGF0IGJlZ2luKCkgYW5kIHdob3NlIFByZXYgcG9pbnRzIGF0CisvLyByYmVnaW4oKS4gIFRoZSBzZW50aW5lbCBub2RlIGl0c2VsZiBzZXJ2ZXMgYXMgZW5kKCkgYW5kIHJlbmQoKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0lMSVNUX0gKKyNkZWZpbmUgTExWTV9BRFRfSUxJU1RfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvc2ltcGxlX2lsaXN0LmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBVc2UgZGVsZXRlIGJ5IGRlZmF1bHQgZm9yIGlwbGlzdCBhbmQgaWxpc3QuCisvLy8KKy8vLyBTcGVjaWFsaXplIHRoaXMgdG8gZ2V0IGRpZmZlcmVudCBiZWhhdmlvdXIgZm9yIG93bmVyc2hpcC1yZWxhdGVkIEFQSS4gIChJZgorLy8vIHlvdSByZWFsbHkgd2FudCBvd25lcnNoaXAgc2VtYW50aWNzLCBjb25zaWRlciB1c2luZyBzdGQ6Omxpc3Qgb3IgYnVpbGRpbmcKKy8vLyBzb21ldGhpbmcgbGlrZSBcYSBCdW1wUHRyTGlzdC4pCisvLy8KKy8vLyBcc2VlIGlsaXN0X25vYWxsb2NfdHJhaXRzCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTm9kZVR5PiBzdHJ1Y3QgaWxpc3RfYWxsb2NfdHJhaXRzIHsKKyAgc3RhdGljIHZvaWQgZGVsZXRlTm9kZShOb2RlVHkgKlYpIHsgZGVsZXRlIFY7IH0KK307CisKKy8vLyBDdXN0b20gdHJhaXRzIHRvIGRvIG5vdGhpbmcgb24gZGVsZXRpb24uCisvLy8KKy8vLyBTcGVjaWFsaXplIGlsaXN0X2FsbG9jX3RyYWl0cyB0byBpbmhlcml0IGZyb20gdGhpcyB0byBkaXNhYmxlIHRoZQorLy8vIG5vbi1pbnRydXNpdmUgZGVsZXRpb24gaW4gaXBsaXN0ICh3aGljaCBpbXBsaWVzIG93bmVyc2hpcCkuCisvLy8KKy8vLyBJZiB5b3Ugd2FudCBwdXJlbHkgaW50cnVzaXZlIHNlbWFudGljcyB3aXRoIG5vIGNhbGxiYWNrcywgY29uc2lkZXIgdXNpbmcgXGEKKy8vLyBzaW1wbGVfaWxpc3QgaW5zdGVhZC4KKy8vLworLy8vIFxjb2RlCisvLy8gdGVtcGxhdGUgPD4KKy8vLyBzdHJ1Y3QgaWxpc3RfYWxsb2NfdHJhaXRzPE15VHlwZT4gOiBpbGlzdF9ub2FsbG9jX3RyYWl0czxNeVR5cGU+IHt9OworLy8vIFxlbmRjb2RlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTm9kZVR5PiBzdHJ1Y3QgaWxpc3Rfbm9hbGxvY190cmFpdHMgeworICBzdGF0aWMgdm9pZCBkZWxldGVOb2RlKE5vZGVUeSAqVikge30KK307CisKKy8vLyBDYWxsYmFja3MgZG8gbm90aGluZyBieSBkZWZhdWx0IGluIGlwbGlzdCBhbmQgaWxpc3QuCisvLy8KKy8vLyBTcGVjaWFsaXplIHRoaXMgZm9yIHRvIHVzZSBjYWxsYmFja3MgZm9yIHdoZW4gbm9kZXMgY2hhbmdlIHRoZWlyIGxpc3QKKy8vLyBtZW1iZXJzaGlwLgordGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVUeT4gc3RydWN0IGlsaXN0X2NhbGxiYWNrX3RyYWl0cyB7CisgIHZvaWQgYWRkTm9kZVRvTGlzdChOb2RlVHkgKikge30KKyAgdm9pZCByZW1vdmVOb2RlRnJvbUxpc3QoTm9kZVR5ICopIHt9CisKKyAgLy8vIENhbGxiYWNrIGJlZm9yZSB0cmFuc2ZlcnJpbmcgbm9kZXMgdG8gdGhpcyBsaXN0LgorICAvLy8KKyAgLy8vIFxwcmUgXGMgdGhpcyE9Jk9sZExpc3QKKyAgdGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yPgorICB2b2lkIHRyYW5zZmVyTm9kZXNGcm9tTGlzdChpbGlzdF9jYWxsYmFja190cmFpdHMgJk9sZExpc3QsIEl0ZXJhdG9yIC8qZmlyc3QqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgLypsYXN0Ki8pIHsKKyAgICAodm9pZClPbGRMaXN0OworICB9Cit9OworCisvLy8gQSBmcmFnbWVudCBmb3IgdGVtcGxhdGUgdHJhaXRzIGZvciBpbnRydXNpdmUgbGlzdCB0aGF0IHByb3ZpZGVzIGRlZmF1bHQKKy8vLyBub2RlIHJlbGF0ZWQgb3BlcmF0aW9ucy4KKy8vLworLy8vIFRPRE86IFJlbW92ZSB0aGlzIGxheWVyIG9mIGluZGlyZWN0aW9uLiAgSXQncyBub3QgbmVjZXNzYXJ5LgordGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVUeT4KK3N0cnVjdCBpbGlzdF9ub2RlX3RyYWl0cyA6IGlsaXN0X2FsbG9jX3RyYWl0czxOb2RlVHk+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaWxpc3RfY2FsbGJhY2tfdHJhaXRzPE5vZGVUeT4ge307CisKKy8vLyBEZWZhdWx0IHRlbXBsYXRlIHRyYWl0cyBmb3IgaW50cnVzaXZlIGxpc3QuCisvLy8KKy8vLyBCeSBpbmhlcml0aW5nIGZyb20gdGhpcywgeW91IGNhbiBlYXNpbHkgdXNlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGZvciBhbGwKKy8vLyBjb21tb24gb3BlcmF0aW9ucy4KKy8vLworLy8vIFRPRE86IFJlbW92ZSB0aGlzIGN1c3RvbWl6YXRpb24gcG9pbnQuICBTcGVjaWFsaXppbmcgaWxpc3RfdHJhaXRzIGlzCisvLy8gYWxyZWFkeSBmdWxseSBnZW5lcmFsLgordGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVUeT4KK3N0cnVjdCBpbGlzdF9kZWZhdWx0X3RyYWl0cyA6IHB1YmxpYyBpbGlzdF9ub2RlX3RyYWl0czxOb2RlVHk+IHt9OworCisvLy8gVGVtcGxhdGUgdHJhaXRzIGZvciBpbnRydXNpdmUgbGlzdC4KKy8vLworLy8vIEN1c3RvbWl6ZSBjYWxsYmFja3MgYW5kIGFsbG9jYXRpb24gc2VtYW50aWNzLgordGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVUeT4KK3N0cnVjdCBpbGlzdF90cmFpdHMgOiBwdWJsaWMgaWxpc3RfZGVmYXVsdF90cmFpdHM8Tm9kZVR5PiB7fTsKKworLy8vIENvbnN0IHRyYWl0cyBzaG91bGQgbmV2ZXIgYmUgaW5zdGFudGlhdGVkLgordGVtcGxhdGUgPHR5cGVuYW1lIFR5PiBzdHJ1Y3QgaWxpc3RfdHJhaXRzPGNvbnN0IFR5PiB7fTsKKworbmFtZXNwYWNlIGlsaXN0X2RldGFpbCB7CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBUICZtYWtlKCk7CisKKy8vLyBUeXBlIHRyYWl0IHRvIGNoZWNrIGZvciBhIHRyYWl0cyBjbGFzcyB0aGF0IGhhcyBhIGdldE5leHQgbWVtYmVyIChhcyBhCisvLy8gY2FuYXJ5IGZvciBhbnkgb2YgdGhlIGlsaXN0X25leHRwcmV2X3RyYWl0cyBBUEkpLgordGVtcGxhdGUgPGNsYXNzIFRyYWl0c1QsIGNsYXNzIE5vZGVUPiBzdHJ1Y3QgSGFzR2V0TmV4dCB7CisgIHR5cGVkZWYgY2hhciBZZXNbMV07CisgIHR5cGVkZWYgY2hhciBOb1syXTsKKyAgdGVtcGxhdGUgPHNpemVfdCBOPiBzdHJ1Y3QgU0ZJTkFFIHt9OworCisgIHRlbXBsYXRlIDxjbGFzcyBVPgorICBzdGF0aWMgWWVzICZ0ZXN0KFUgKkksIGRlY2x0eXBlKEktPmdldE5leHQoJm1ha2U8Tm9kZVQ+KCkpKSAqID0gMCk7CisgIHRlbXBsYXRlIDxjbGFzcz4gc3RhdGljIE5vICZ0ZXN0KC4uLik7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBzaXplb2YodGVzdDxUcmFpdHNUPihudWxscHRyKSkgPT0gc2l6ZW9mKFllcyk7Cit9OworCisvLy8gVHlwZSB0cmFpdCB0byBjaGVjayBmb3IgYSB0cmFpdHMgY2xhc3MgdGhhdCBoYXMgYSBjcmVhdGVTZW50aW5lbCBtZW1iZXIgKGFzCisvLy8gYSBjYW5hcnkgZm9yIGFueSBvZiB0aGUgaWxpc3Rfc2VudGluZWxfdHJhaXRzIEFQSSkuCit0ZW1wbGF0ZSA8Y2xhc3MgVHJhaXRzVD4gc3RydWN0IEhhc0NyZWF0ZVNlbnRpbmVsIHsKKyAgdHlwZWRlZiBjaGFyIFllc1sxXTsKKyAgdHlwZWRlZiBjaGFyIE5vWzJdOworCisgIHRlbXBsYXRlIDxjbGFzcyBVPgorICBzdGF0aWMgWWVzICZ0ZXN0KFUgKkksIGRlY2x0eXBlKEktPmNyZWF0ZVNlbnRpbmVsKCkpICogPSAwKTsKKyAgdGVtcGxhdGUgPGNsYXNzPiBzdGF0aWMgTm8gJnRlc3QoLi4uKTsKKworcHVibGljOgorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHNpemVvZih0ZXN0PFRyYWl0c1Q+KG51bGxwdHIpKSA9PSBzaXplb2YoWWVzKTsKK307CisKKy8vLyBUeXBlIHRyYWl0IHRvIGNoZWNrIGZvciBhIHRyYWl0cyBjbGFzcyB0aGF0IGhhcyBhIGNyZWF0ZU5vZGUgbWVtYmVyLgorLy8vIEFsbG9jYXRpb24gc2hvdWxkIGJlIG1hbmFnZWQgaW4gYSB3cmFwcGVyIGNsYXNzLCBpbnN0ZWFkIG9mIGluCisvLy8gaWxpc3RfdHJhaXRzLgordGVtcGxhdGUgPGNsYXNzIFRyYWl0c1QsIGNsYXNzIE5vZGVUPiBzdHJ1Y3QgSGFzQ3JlYXRlTm9kZSB7CisgIHR5cGVkZWYgY2hhciBZZXNbMV07CisgIHR5cGVkZWYgY2hhciBOb1syXTsKKyAgdGVtcGxhdGUgPHNpemVfdCBOPiBzdHJ1Y3QgU0ZJTkFFIHt9OworCisgIHRlbXBsYXRlIDxjbGFzcyBVPgorICBzdGF0aWMgWWVzICZ0ZXN0KFUgKkksIGRlY2x0eXBlKEktPmNyZWF0ZU5vZGUobWFrZTxOb2RlVD4oKSkpICogPSAwKTsKKyAgdGVtcGxhdGUgPGNsYXNzPiBzdGF0aWMgTm8gJnRlc3QoLi4uKTsKKworcHVibGljOgorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHNpemVvZih0ZXN0PFRyYWl0c1Q+KG51bGxwdHIpKSA9PSBzaXplb2YoWWVzKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBUcmFpdHNULCBjbGFzcyBOb2RlVD4gc3RydWN0IEhhc09ic29sZXRlQ3VzdG9taXphdGlvbiB7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gSGFzR2V0TmV4dDxUcmFpdHNULCBOb2RlVD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzQ3JlYXRlU2VudGluZWw8VHJhaXRzVD46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzQ3JlYXRlTm9kZTxUcmFpdHNULCBOb2RlVD46OnZhbHVlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGlsaXN0X2RldGFpbAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBBIHdyYXBwZXIgYXJvdW5kIGFuIGludHJ1c2l2ZSBsaXN0IHdpdGggY2FsbGJhY2tzIGFuZCBub24taW50cnVzaXZlCisvLy8gb3duZXJzaGlwLgorLy8vCisvLy8gVGhpcyB3cmFwcyBhIHB1cmVseSBpbnRydXNpdmUgbGlzdCAobGlrZSBzaW1wbGVfaWxpc3QpIHdpdGggYSBjb25maWd1cmFibGUKKy8vLyB0cmFpdHMgY2xhc3MuICBUaGUgdHJhaXRzIGNhbiBpbXBsZW1lbnQgY2FsbGJhY2tzIGFuZCBjdXN0b21pemUgdGhlCisvLy8gb3duZXJzaGlwIHNlbWFudGljcy4KKy8vLworLy8vIFRoaXMgaXMgYSBzdWJzZXQgb2YgaWxpc3QgZnVuY3Rpb25hbGl0eSB0aGF0IGNhbiBzYWZlbHkgYmUgdXNlZCBvbiBub2RlcyBvZgorLy8vIHBvbHltb3JwaGljIHR5cGVzLCBpLmUuIGEgaGV0ZXJvZ2VuZW91cyBsaXN0IHdpdGggYSBjb21tb24gYmFzZSBjbGFzcyB0aGF0CisvLy8gaG9sZHMgdGhlIG5leHQvcHJldiBwb2ludGVycy4gIFRoZSBvbmx5IHN0YXRlIG9mIHRoZSBsaXN0IGl0c2VsZiBpcyBhbgorLy8vIGlsaXN0X3NlbnRpbmVsLCB3aGljaCBob2xkcyBwb2ludGVycyB0byB0aGUgZmlyc3QgYW5kIGxhc3Qgbm9kZXMgaW4gdGhlCisvLy8gbGlzdC4KK3RlbXBsYXRlIDxjbGFzcyBJbnRydXNpdmVMaXN0VCwgY2xhc3MgVHJhaXRzVD4KK2NsYXNzIGlwbGlzdF9pbXBsIDogcHVibGljIFRyYWl0c1QsIEludHJ1c2l2ZUxpc3RUIHsKKyAgdHlwZWRlZiBJbnRydXNpdmVMaXN0VCBiYXNlX2xpc3RfdHlwZTsKKworcHJvdGVjdGVkOgorICB0eXBlZGVmIGlwbGlzdF9pbXBsIGlwbGlzdF9pbXBsX3R5cGU7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX2xpc3RfdHlwZTo6cG9pbnRlciBwb2ludGVyOworICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfbGlzdF90eXBlOjpjb25zdF9wb2ludGVyIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV9saXN0X3R5cGU6OnJlZmVyZW5jZSByZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV9saXN0X3R5cGU6OmNvbnN0X3JlZmVyZW5jZSBjb25zdF9yZWZlcmVuY2U7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV9saXN0X3R5cGU6OnZhbHVlX3R5cGUgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX2xpc3RfdHlwZTo6c2l6ZV90eXBlIHNpemVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX2xpc3RfdHlwZTo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX2xpc3RfdHlwZTo6aXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV9saXN0X3R5cGU6OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfbGlzdF90eXBlOjpyZXZlcnNlX2l0ZXJhdG9yIHJldmVyc2VfaXRlcmF0b3I7CisgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIGJhc2VfbGlzdF90eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKK3ByaXZhdGU6CisgIC8vIFRPRE86IERyb3AgdGhpcyBhc3NlcnRpb24gYW5kIHRoZSB0cmFuc2l0aXZlIHR5cGUgdHJhaXRzIGFueXRpbWUgYWZ0ZXIKKyAgLy8gdjQuMCBpcyBicmFuY2hlZCAoaS5lLC4ga2VlcCB0aGVtIGZvciBvbmUgcmVsZWFzZSB0byBoZWxwIG91dC1vZi10cmVlIGNvZGUKKyAgLy8gdXBkYXRlKS4KKyAgc3RhdGljX2Fzc2VydCgKKyAgICAgICFpbGlzdF9kZXRhaWw6Okhhc09ic29sZXRlQ3VzdG9taXphdGlvbjxUcmFpdHNULCB2YWx1ZV90eXBlPjo6dmFsdWUsCisgICAgICAiaWxpc3QgY3VzdG9taXphdGlvbiBwb2ludHMgaGF2ZSBjaGFuZ2VkISIpOworCisgIHN0YXRpYyBib29sIG9wX2xlc3MoY29uc3RfcmVmZXJlbmNlIEwsIGNvbnN0X3JlZmVyZW5jZSBSKSB7IHJldHVybiBMIDwgUjsgfQorICBzdGF0aWMgYm9vbCBvcF9lcXVhbChjb25zdF9yZWZlcmVuY2UgTCwgY29uc3RfcmVmZXJlbmNlIFIpIHsgcmV0dXJuIEwgPT0gUjsgfQorCitwdWJsaWM6CisgIGlwbGlzdF9pbXBsKCkgPSBkZWZhdWx0OworCisgIGlwbGlzdF9pbXBsKGNvbnN0IGlwbGlzdF9pbXBsICYpID0gZGVsZXRlOworICBpcGxpc3RfaW1wbCAmb3BlcmF0b3I9KGNvbnN0IGlwbGlzdF9pbXBsICYpID0gZGVsZXRlOworCisgIGlwbGlzdF9pbXBsKGlwbGlzdF9pbXBsICYmWCkKKyAgICAgIDogVHJhaXRzVChzdGQ6Om1vdmUoWCkpLCBJbnRydXNpdmVMaXN0VChzdGQ6Om1vdmUoWCkpIHt9CisgIGlwbGlzdF9pbXBsICZvcGVyYXRvcj0oaXBsaXN0X2ltcGwgJiZYKSB7CisgICAgKnN0YXRpY19jYXN0PFRyYWl0c1QgKj4odGhpcykgPSBzdGQ6Om1vdmUoWCk7CisgICAgKnN0YXRpY19jYXN0PEludHJ1c2l2ZUxpc3RUICo+KHRoaXMpID0gc3RkOjptb3ZlKFgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIH5pcGxpc3RfaW1wbCgpIHsgY2xlYXIoKTsgfQorCisgIC8vIE1pc2NlbGxhbmVvdXMgaW5zcGVjdGlvbiByb3V0aW5lcy4KKyAgc2l6ZV90eXBlIG1heF9zaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV90eXBlKC0xKTsgfQorCisgIHVzaW5nIGJhc2VfbGlzdF90eXBlOjpiZWdpbjsKKyAgdXNpbmcgYmFzZV9saXN0X3R5cGU6OmVuZDsKKyAgdXNpbmcgYmFzZV9saXN0X3R5cGU6OnJiZWdpbjsKKyAgdXNpbmcgYmFzZV9saXN0X3R5cGU6OnJlbmQ7CisgIHVzaW5nIGJhc2VfbGlzdF90eXBlOjplbXB0eTsKKyAgdXNpbmcgYmFzZV9saXN0X3R5cGU6OmZyb250OworICB1c2luZyBiYXNlX2xpc3RfdHlwZTo6YmFjazsKKworICB2b2lkIHN3YXAoaXBsaXN0X2ltcGwgJlJIUykgeworICAgIGFzc2VydCgwICYmICJTd2FwIGRvZXMgbm90IHVzZSBsaXN0IHRyYWl0cyBjYWxsYmFjayBjb3JyZWN0bHkgeWV0ISIpOworICAgIGJhc2VfbGlzdF90eXBlOjpzd2FwKFJIUyk7CisgIH0KKworICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3Igd2hlcmUsIHBvaW50ZXIgTmV3KSB7CisgICAgdGhpcy0+YWRkTm9kZVRvTGlzdChOZXcpOyAvLyBOb3RpZnkgdHJhaXRzIHRoYXQgd2UgYWRkZWQgYSBub2RlLi4uCisgICAgcmV0dXJuIGJhc2VfbGlzdF90eXBlOjppbnNlcnQod2hlcmUsICpOZXcpOworICB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIHdoZXJlLCBjb25zdF9yZWZlcmVuY2UgTmV3KSB7CisgICAgcmV0dXJuIHRoaXMtPmluc2VydCh3aGVyZSwgbmV3IHZhbHVlX3R5cGUoTmV3KSk7CisgIH0KKworICBpdGVyYXRvciBpbnNlcnRBZnRlcihpdGVyYXRvciB3aGVyZSwgcG9pbnRlciBOZXcpIHsKKyAgICBpZiAoZW1wdHkoKSkKKyAgICAgIHJldHVybiBpbnNlcnQoYmVnaW4oKSwgTmV3KTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gaW5zZXJ0KCsrd2hlcmUsIE5ldyk7CisgIH0KKworICAvLy8gQ2xvbmUgYW5vdGhlciBsaXN0LgorICB0ZW1wbGF0ZSA8Y2xhc3MgQ2xvbmVyPiB2b2lkIGNsb25lRnJvbShjb25zdCBpcGxpc3RfaW1wbCAmTDIsIENsb25lciBjbG9uZSkgeworICAgIGNsZWFyKCk7CisgICAgZm9yIChjb25zdF9yZWZlcmVuY2UgViA6IEwyKQorICAgICAgcHVzaF9iYWNrKGNsb25lKFYpKTsKKyAgfQorCisgIHBvaW50ZXIgcmVtb3ZlKGl0ZXJhdG9yICZJVCkgeworICAgIHBvaW50ZXIgTm9kZSA9ICYqSVQrKzsKKyAgICB0aGlzLT5yZW1vdmVOb2RlRnJvbUxpc3QoTm9kZSk7IC8vIE5vdGlmeSB0cmFpdHMgdGhhdCB3ZSByZW1vdmVkIGEgbm9kZS4uLgorICAgIGJhc2VfbGlzdF90eXBlOjpyZW1vdmUoKk5vZGUpOworICAgIHJldHVybiBOb2RlOworICB9CisKKyAgcG9pbnRlciByZW1vdmUoY29uc3QgaXRlcmF0b3IgJklUKSB7CisgICAgaXRlcmF0b3IgTXV0SXQgPSBJVDsKKyAgICByZXR1cm4gcmVtb3ZlKE11dEl0KTsKKyAgfQorCisgIHBvaW50ZXIgcmVtb3ZlKHBvaW50ZXIgSVQpIHsgcmV0dXJuIHJlbW92ZShpdGVyYXRvcihJVCkpOyB9CisgIHBvaW50ZXIgcmVtb3ZlKHJlZmVyZW5jZSBJVCkgeyByZXR1cm4gcmVtb3ZlKGl0ZXJhdG9yKElUKSk7IH0KKworICAvLyBlcmFzZSAtIHJlbW92ZSBhIG5vZGUgZnJvbSB0aGUgY29udHJvbGxlZCBzZXF1ZW5jZS4uLiBhbmQgZGVsZXRlIGl0LgorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciB3aGVyZSkgeworICAgIHRoaXMtPmRlbGV0ZU5vZGUocmVtb3ZlKHdoZXJlKSk7CisgICAgcmV0dXJuIHdoZXJlOworICB9CisKKyAgaXRlcmF0b3IgZXJhc2UocG9pbnRlciBJVCkgeyByZXR1cm4gZXJhc2UoaXRlcmF0b3IoSVQpKTsgfQorICBpdGVyYXRvciBlcmFzZShyZWZlcmVuY2UgSVQpIHsgcmV0dXJuIGVyYXNlKGl0ZXJhdG9yKElUKSk7IH0KKworICAvLy8gUmVtb3ZlIGFsbCBub2RlcyBmcm9tIHRoZSBsaXN0IGxpa2UgY2xlYXIoKSwgYnV0IGRvIG5vdCBjYWxsCisgIC8vLyByZW1vdmVOb2RlRnJvbUxpc3QoKSBvciBkZWxldGVOb2RlKCkuCisgIC8vLworICAvLy8gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGltbWVkaWF0ZWx5IGJlZm9yZSBmcmVlaW5nIG5vZGVzIGluIGJ1bGsgdG8KKyAgLy8vIGF2b2lkIHRyYXZlcnNpbmcgdGhlIGxpc3QgYW5kIGJyaW5naW5nIGFsbCB0aGUgbm9kZXMgaW50byBjYWNoZS4KKyAgdm9pZCBjbGVhckFuZExlYWtOb2Rlc1Vuc2FmZWx5KCkgeyBiYXNlX2xpc3RfdHlwZTo6Y2xlYXIoKTsgfQorCitwcml2YXRlOgorICAvLyB0cmFuc2ZlciAtIFRoZSBoZWFydCBvZiB0aGUgc3BsaWNlIGZ1bmN0aW9uLiAgTW92ZSBsaW5rZWQgbGlzdCBub2RlcyBmcm9tCisgIC8vIFtmaXJzdCwgbGFzdCkgaW50byBwb3NpdGlvbi4KKyAgLy8KKyAgdm9pZCB0cmFuc2ZlcihpdGVyYXRvciBwb3NpdGlvbiwgaXBsaXN0X2ltcGwgJkwyLCBpdGVyYXRvciBmaXJzdCwgaXRlcmF0b3IgbGFzdCkgeworICAgIGlmIChwb3NpdGlvbiA9PSBsYXN0KQorICAgICAgcmV0dXJuOworCisgICAgaWYgKHRoaXMgIT0gJkwyKSAvLyBOb3RpZnkgdHJhaXRzIHdlIG1vdmVkIHRoZSBub2Rlcy4uLgorICAgICAgdGhpcy0+dHJhbnNmZXJOb2Rlc0Zyb21MaXN0KEwyLCBmaXJzdCwgbGFzdCk7CisKKyAgICBiYXNlX2xpc3RfdHlwZTo6c3BsaWNlKHBvc2l0aW9uLCBMMiwgZmlyc3QsIGxhc3QpOworICB9CisKK3B1YmxpYzoKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09CisgIC8vIEZ1bmN0aW9uYWxpdHkgZGVyaXZlZCBmcm9tIG90aGVyIGZ1bmN0aW9ucyBkZWZpbmVkIGFib3ZlLi4uCisgIC8vCisKKyAgdXNpbmcgYmFzZV9saXN0X3R5cGU6OnNpemU7CisKKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgZmlyc3QsIGl0ZXJhdG9yIGxhc3QpIHsKKyAgICB3aGlsZSAoZmlyc3QgIT0gbGFzdCkKKyAgICAgIGZpcnN0ID0gZXJhc2UoZmlyc3QpOworICAgIHJldHVybiBsYXN0OworICB9CisKKyAgdm9pZCBjbGVhcigpIHsgZXJhc2UoYmVnaW4oKSwgZW5kKCkpOyB9CisKKyAgLy8gRnJvbnQgYW5kIGJhY2sgaW5zZXJ0ZXJzLi4uCisgIHZvaWQgcHVzaF9mcm9udChwb2ludGVyIHZhbCkgeyBpbnNlcnQoYmVnaW4oKSwgdmFsKTsgfQorICB2b2lkIHB1c2hfYmFjayhwb2ludGVyIHZhbCkgeyBpbnNlcnQoZW5kKCksIHZhbCk7IH0KKyAgdm9pZCBwb3BfZnJvbnQoKSB7CisgICAgYXNzZXJ0KCFlbXB0eSgpICYmICJwb3BfZnJvbnQoKSBvbiBlbXB0eSBsaXN0ISIpOworICAgIGVyYXNlKGJlZ2luKCkpOworICB9CisgIHZvaWQgcG9wX2JhY2soKSB7CisgICAgYXNzZXJ0KCFlbXB0eSgpICYmICJwb3BfYmFjaygpIG9uIGVtcHR5IGxpc3QhIik7CisgICAgaXRlcmF0b3IgdCA9IGVuZCgpOyBlcmFzZSgtLXQpOworICB9CisKKyAgLy8gU3BlY2lhbCBmb3JtcyBvZiBpbnNlcnQuLi4KKyAgdGVtcGxhdGU8Y2xhc3MgSW5JdD4gdm9pZCBpbnNlcnQoaXRlcmF0b3Igd2hlcmUsIEluSXQgZmlyc3QsIEluSXQgbGFzdCkgeworICAgIGZvciAoOyBmaXJzdCAhPSBsYXN0OyArK2ZpcnN0KSBpbnNlcnQod2hlcmUsICpmaXJzdCk7CisgIH0KKworICAvLyBTcGxpY2UgbWVtYmVycyAtIGRlZmluZWQgaW4gdGVybXMgb2YgdHJhbnNmZXIuLi4KKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3Igd2hlcmUsIGlwbGlzdF9pbXBsICZMMikgeworICAgIGlmICghTDIuZW1wdHkoKSkKKyAgICAgIHRyYW5zZmVyKHdoZXJlLCBMMiwgTDIuYmVnaW4oKSwgTDIuZW5kKCkpOworICB9CisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIHdoZXJlLCBpcGxpc3RfaW1wbCAmTDIsIGl0ZXJhdG9yIGZpcnN0KSB7CisgICAgaXRlcmF0b3IgbGFzdCA9IGZpcnN0OyArK2xhc3Q7CisgICAgaWYgKHdoZXJlID09IGZpcnN0IHx8IHdoZXJlID09IGxhc3QpIHJldHVybjsgLy8gTm8gY2hhbmdlCisgICAgdHJhbnNmZXIod2hlcmUsIEwyLCBmaXJzdCwgbGFzdCk7CisgIH0KKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3Igd2hlcmUsIGlwbGlzdF9pbXBsICZMMiwgaXRlcmF0b3IgZmlyc3QsIGl0ZXJhdG9yIGxhc3QpIHsKKyAgICBpZiAoZmlyc3QgIT0gbGFzdCkgdHJhbnNmZXIod2hlcmUsIEwyLCBmaXJzdCwgbGFzdCk7CisgIH0KKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3Igd2hlcmUsIGlwbGlzdF9pbXBsICZMMiwgcmVmZXJlbmNlIE4pIHsKKyAgICBzcGxpY2Uod2hlcmUsIEwyLCBpdGVyYXRvcihOKSk7CisgIH0KKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3Igd2hlcmUsIGlwbGlzdF9pbXBsICZMMiwgcG9pbnRlciBOKSB7CisgICAgc3BsaWNlKHdoZXJlLCBMMiwgaXRlcmF0b3IoTikpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIENvbXBhcmU+CisgIHZvaWQgbWVyZ2UoaXBsaXN0X2ltcGwgJlJpZ2h0LCBDb21wYXJlIGNvbXApIHsKKyAgICBpZiAodGhpcyA9PSAmUmlnaHQpCisgICAgICByZXR1cm47CisgICAgdGhpcy0+dHJhbnNmZXJOb2Rlc0Zyb21MaXN0KFJpZ2h0LCBSaWdodC5iZWdpbigpLCBSaWdodC5lbmQoKSk7CisgICAgYmFzZV9saXN0X3R5cGU6Om1lcmdlKFJpZ2h0LCBjb21wKTsKKyAgfQorICB2b2lkIG1lcmdlKGlwbGlzdF9pbXBsICZSaWdodCkgeyByZXR1cm4gbWVyZ2UoUmlnaHQsIG9wX2xlc3MpOyB9CisKKyAgdXNpbmcgYmFzZV9saXN0X3R5cGU6OnNvcnQ7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHByZXZpb3VzIG5vZGUsIG9yIFxjIG51bGxwdHIgZm9yIHRoZSBsaXN0IGhlYWQuCisgIHBvaW50ZXIgZ2V0UHJldk5vZGUocmVmZXJlbmNlIE4pIGNvbnN0IHsKKyAgICBhdXRvIEkgPSBOLmdldEl0ZXJhdG9yKCk7CisgICAgaWYgKEkgPT0gYmVnaW4oKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiAmKnN0ZDo6cHJldihJKTsKKyAgfQorICAvLy8gXGJyaWVmIEdldCB0aGUgcHJldmlvdXMgbm9kZSwgb3IgXGMgbnVsbHB0ciBmb3IgdGhlIGxpc3QgaGVhZC4KKyAgY29uc3RfcG9pbnRlciBnZXRQcmV2Tm9kZShjb25zdF9yZWZlcmVuY2UgTikgY29uc3QgeworICAgIHJldHVybiBnZXRQcmV2Tm9kZShjb25zdF9jYXN0PHJlZmVyZW5jZSA+KE4pKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBuZXh0IG5vZGUsIG9yIFxjIG51bGxwdHIgZm9yIHRoZSBsaXN0IHRhaWwuCisgIHBvaW50ZXIgZ2V0TmV4dE5vZGUocmVmZXJlbmNlIE4pIGNvbnN0IHsKKyAgICBhdXRvIE5leHQgPSBzdGQ6Om5leHQoTi5nZXRJdGVyYXRvcigpKTsKKyAgICBpZiAoTmV4dCA9PSBlbmQoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiAmKk5leHQ7CisgIH0KKyAgLy8vIFxicmllZiBHZXQgdGhlIG5leHQgbm9kZSwgb3IgXGMgbnVsbHB0ciBmb3IgdGhlIGxpc3QgdGFpbC4KKyAgY29uc3RfcG9pbnRlciBnZXROZXh0Tm9kZShjb25zdF9yZWZlcmVuY2UgTikgY29uc3QgeworICAgIHJldHVybiBnZXROZXh0Tm9kZShjb25zdF9jYXN0PHJlZmVyZW5jZSA+KE4pKTsKKyAgfQorfTsKKworLy8vIEFuIGludHJ1c2l2ZSBsaXN0IHdpdGggb3duZXJzaGlwIGFuZCBjYWxsYmFja3Mgc3BlY2lmaWVkL2NvbnRyb2xsZWQgYnkKKy8vLyBpbGlzdF90cmFpdHMsIG9ubHkgd2l0aCBBUEkgc2FmZSBmb3IgcG9seW1vcnBoaWMgdHlwZXMuCisvLy8KKy8vLyBUaGUgXHAgT3B0aW9ucyBwYXJhbWV0ZXJzIGFyZSB0aGUgc2FtZSBhcyB0aG9zZSBmb3IgXGEgc2ltcGxlX2lsaXN0LiAgU2VlCisvLy8gdGhlcmUgZm9yIGEgZGVzY3JpcHRpb24gb2Ygd2hhdCdzIGF2YWlsYWJsZS4KK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcy4uLiBPcHRpb25zPgorY2xhc3MgaXBsaXN0CisgICAgOiBwdWJsaWMgaXBsaXN0X2ltcGw8c2ltcGxlX2lsaXN0PFQsIE9wdGlvbnMuLi4+LCBpbGlzdF90cmFpdHM8VD4+IHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBpcGxpc3Q6OmlwbGlzdF9pbXBsX3R5cGUgaXBsaXN0X2ltcGxfdHlwZTsKKworcHVibGljOgorICBpcGxpc3QoKSA9IGRlZmF1bHQ7CisKKyAgaXBsaXN0KGNvbnN0IGlwbGlzdCAmWCkgPSBkZWxldGU7CisgIGlwbGlzdCAmb3BlcmF0b3I9KGNvbnN0IGlwbGlzdCAmWCkgPSBkZWxldGU7CisKKyAgaXBsaXN0KGlwbGlzdCAmJlgpIDogaXBsaXN0X2ltcGxfdHlwZShzdGQ6Om1vdmUoWCkpIHt9CisgIGlwbGlzdCAmb3BlcmF0b3I9KGlwbGlzdCAmJlgpIHsKKyAgICAqc3RhdGljX2Nhc3Q8aXBsaXN0X2ltcGxfdHlwZSAqPih0aGlzKSA9IHN0ZDo6bW92ZShYKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcy4uLiBPcHRpb25zPiB1c2luZyBpbGlzdCA9IGlwbGlzdDxULCBPcHRpb25zLi4uPjsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworbmFtZXNwYWNlIHN0ZCB7CisKKyAgLy8gRW5zdXJlIHRoYXQgc3dhcCB1c2VzIHRoZSBmYXN0IGxpc3Qgc3dhcC4uLgorICB0ZW1wbGF0ZTxjbGFzcyBUeT4KKyAgdm9pZCBzd2FwKGxsdm06OmlwbGlzdDxUeT4gJkxlZnQsIGxsdm06OmlwbGlzdDxUeT4gJlJpZ2h0KSB7CisgICAgTGVmdC5zd2FwKFJpZ2h0KTsKKyAgfQorCit9IC8vIGVuZCBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9JTElTVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9pbGlzdF9iYXNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9pbGlzdF9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Q4MThhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL2lsaXN0X2Jhc2UuaApAQCAtMCwwICsxLDkzIEBACisvLz09PS0gbGx2bS9BRFQvaWxpc3RfYmFzZS5oIC0gSW50cnVzaXZlIExpc3QgQmFzZSAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0lMSVNUX0JBU0VfSAorI2RlZmluZSBMTFZNX0FEVF9JTElTVF9CQVNFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGVfYmFzZS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEltcGxlbWVudGF0aW9ucyBvZiBsaXN0IGFsZ29yaXRobXMgdXNpbmcgaWxpc3Rfbm9kZV9iYXNlLgordGVtcGxhdGUgPGJvb2wgRW5hYmxlU2VudGluZWxUcmFja2luZz4gY2xhc3MgaWxpc3RfYmFzZSB7CitwdWJsaWM6CisgIHVzaW5nIG5vZGVfYmFzZV90eXBlID0gaWxpc3Rfbm9kZV9iYXNlPEVuYWJsZVNlbnRpbmVsVHJhY2tpbmc+OworCisgIHN0YXRpYyB2b2lkIGluc2VydEJlZm9yZUltcGwobm9kZV9iYXNlX3R5cGUgJk5leHQsIG5vZGVfYmFzZV90eXBlICZOKSB7CisgICAgbm9kZV9iYXNlX3R5cGUgJlByZXYgPSAqTmV4dC5nZXRQcmV2KCk7CisgICAgTi5zZXROZXh0KCZOZXh0KTsKKyAgICBOLnNldFByZXYoJlByZXYpOworICAgIFByZXYuc2V0TmV4dCgmTik7CisgICAgTmV4dC5zZXRQcmV2KCZOKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIHJlbW92ZUltcGwobm9kZV9iYXNlX3R5cGUgJk4pIHsKKyAgICBub2RlX2Jhc2VfdHlwZSAqUHJldiA9IE4uZ2V0UHJldigpOworICAgIG5vZGVfYmFzZV90eXBlICpOZXh0ID0gTi5nZXROZXh0KCk7CisgICAgTmV4dC0+c2V0UHJldihQcmV2KTsKKyAgICBQcmV2LT5zZXROZXh0KE5leHQpOworCisgICAgLy8gTm90IHN0cmljdGx5IG5lY2Vzc2FyeSwgYnV0IGhlbHBzIGNhdGNoIGEgY2xhc3Mgb2YgYnVncy4KKyAgICBOLnNldFByZXYobnVsbHB0cik7CisgICAgTi5zZXROZXh0KG51bGxwdHIpOworICB9CisKKyAgc3RhdGljIHZvaWQgcmVtb3ZlUmFuZ2VJbXBsKG5vZGVfYmFzZV90eXBlICZGaXJzdCwgbm9kZV9iYXNlX3R5cGUgJkxhc3QpIHsKKyAgICBub2RlX2Jhc2VfdHlwZSAqUHJldiA9IEZpcnN0LmdldFByZXYoKTsKKyAgICBub2RlX2Jhc2VfdHlwZSAqRmluYWwgPSBMYXN0LmdldFByZXYoKTsKKyAgICBMYXN0LnNldFByZXYoUHJldik7CisgICAgUHJldi0+c2V0TmV4dCgmTGFzdCk7CisKKyAgICAvLyBOb3Qgc3RyaWN0bHkgbmVjZXNzYXJ5LCBidXQgaGVscHMgY2F0Y2ggYSBjbGFzcyBvZiBidWdzLgorICAgIEZpcnN0LnNldFByZXYobnVsbHB0cik7CisgICAgRmluYWwtPnNldE5leHQobnVsbHB0cik7CisgIH0KKworICBzdGF0aWMgdm9pZCB0cmFuc2ZlckJlZm9yZUltcGwobm9kZV9iYXNlX3R5cGUgJk5leHQsIG5vZGVfYmFzZV90eXBlICZGaXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5vZGVfYmFzZV90eXBlICZMYXN0KSB7CisgICAgaWYgKCZOZXh0ID09ICZMYXN0IHx8ICZGaXJzdCA9PSAmTGFzdCkKKyAgICAgIHJldHVybjsKKworICAgIC8vIFBvc2l0aW9uIGNhbm5vdCBiZSBjb250YWluZWQgaW4gdGhlIHJhbmdlIHRvIGJlIHRyYW5zZmVycmVkLgorICAgIGFzc2VydCgmTmV4dCAhPSAmRmlyc3QgJiYKKyAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBtb3N0IGNvbW1vbiBtaXN0YWtlLgorICAgICAgICAgICAiSW5zZXJ0aW9uIHBvaW50IGNhbid0IGJlIG9uZSBvZiB0aGUgdHJhbnNmZXJyZWQgbm9kZXMiKTsKKworICAgIG5vZGVfYmFzZV90eXBlICZGaW5hbCA9ICpMYXN0LmdldFByZXYoKTsKKworICAgIC8vIERldGFjaCBmcm9tIG9sZCBsaXN0L3Bvc2l0aW9uLgorICAgIEZpcnN0LmdldFByZXYoKS0+c2V0TmV4dCgmTGFzdCk7CisgICAgTGFzdC5zZXRQcmV2KEZpcnN0LmdldFByZXYoKSk7CisKKyAgICAvLyBTcGxpY2UgW0ZpcnN0LCBGaW5hbF0gaW50byBpdHMgbmV3IGxpc3QvcG9zaXRpb24uCisgICAgbm9kZV9iYXNlX3R5cGUgJlByZXYgPSAqTmV4dC5nZXRQcmV2KCk7CisgICAgRmluYWwuc2V0TmV4dCgmTmV4dCk7CisgICAgRmlyc3Quc2V0UHJldigmUHJldik7CisgICAgUHJldi5zZXROZXh0KCZGaXJzdCk7CisgICAgTmV4dC5zZXRQcmV2KCZGaW5hbCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RhdGljIHZvaWQgaW5zZXJ0QmVmb3JlKFQgJk5leHQsIFQgJk4pIHsKKyAgICBpbnNlcnRCZWZvcmVJbXBsKE5leHQsIE4pOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0YXRpYyB2b2lkIHJlbW92ZShUICZOKSB7IHJlbW92ZUltcGwoTik7IH0KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0YXRpYyB2b2lkIHJlbW92ZVJhbmdlKFQgJkZpcnN0LCBUICZMYXN0KSB7CisgICAgcmVtb3ZlUmFuZ2VJbXBsKEZpcnN0LCBMYXN0KTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdGF0aWMgdm9pZCB0cmFuc2ZlckJlZm9yZShUICZOZXh0LCBUICZGaXJzdCwgVCAmTGFzdCkgeworICAgIHRyYW5zZmVyQmVmb3JlSW1wbChOZXh0LCBGaXJzdCwgTGFzdCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9JTElTVF9CQVNFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL2lsaXN0X2l0ZXJhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9pbGlzdF9pdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3MWU2NDQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9pbGlzdF9pdGVyYXRvci5oCkBAIC0wLDAgKzEsMTk5IEBACisvLz09PS0gbGx2bS9BRFQvaWxpc3RfaXRlcmF0b3IuaCAtIEludHJ1c2l2ZSBMaXN0IEl0ZXJhdG9yIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0lMSVNUX0lURVJBVE9SX0gKKyNkZWZpbmUgTExWTV9BRFRfSUxJU1RfSVRFUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3Rfbm9kZS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgaWxpc3RfZGV0YWlsIHsKKworLy8vIEZpbmQgY29uc3QtY29ycmVjdCBub2RlIHR5cGVzLgordGVtcGxhdGUgPGNsYXNzIE9wdGlvbnNULCBib29sIElzQ29uc3Q+IHN0cnVjdCBJdGVyYXRvclRyYWl0czsKK3RlbXBsYXRlIDxjbGFzcyBPcHRpb25zVD4gc3RydWN0IEl0ZXJhdG9yVHJhaXRzPE9wdGlvbnNULCBmYWxzZT4geworICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgT3B0aW9uc1Q6OnZhbHVlX3R5cGU7CisgIHVzaW5nIHBvaW50ZXIgPSB0eXBlbmFtZSBPcHRpb25zVDo6cG9pbnRlcjsKKyAgdXNpbmcgcmVmZXJlbmNlID0gdHlwZW5hbWUgT3B0aW9uc1Q6OnJlZmVyZW5jZTsKKyAgdXNpbmcgbm9kZV9wb2ludGVyID0gaWxpc3Rfbm9kZV9pbXBsPE9wdGlvbnNUPiAqOworICB1c2luZyBub2RlX3JlZmVyZW5jZSA9IGlsaXN0X25vZGVfaW1wbDxPcHRpb25zVD4gJjsKK307Cit0ZW1wbGF0ZSA8Y2xhc3MgT3B0aW9uc1Q+IHN0cnVjdCBJdGVyYXRvclRyYWl0czxPcHRpb25zVCwgdHJ1ZT4geworICB1c2luZyB2YWx1ZV90eXBlID0gY29uc3QgdHlwZW5hbWUgT3B0aW9uc1Q6OnZhbHVlX3R5cGU7CisgIHVzaW5nIHBvaW50ZXIgPSB0eXBlbmFtZSBPcHRpb25zVDo6Y29uc3RfcG9pbnRlcjsKKyAgdXNpbmcgcmVmZXJlbmNlID0gdHlwZW5hbWUgT3B0aW9uc1Q6OmNvbnN0X3JlZmVyZW5jZTsKKyAgdXNpbmcgbm9kZV9wb2ludGVyID0gY29uc3QgaWxpc3Rfbm9kZV9pbXBsPE9wdGlvbnNUPiAqOworICB1c2luZyBub2RlX3JlZmVyZW5jZSA9IGNvbnN0IGlsaXN0X25vZGVfaW1wbDxPcHRpb25zVD4gJjsKK307CisKK3RlbXBsYXRlIDxib29sIElzUmV2ZXJzZT4gc3RydWN0IEl0ZXJhdG9ySGVscGVyOwordGVtcGxhdGUgPD4gc3RydWN0IEl0ZXJhdG9ySGVscGVyPGZhbHNlPiA6IGlsaXN0X2RldGFpbDo6Tm9kZUFjY2VzcyB7CisgIHVzaW5nIEFjY2VzcyA9IGlsaXN0X2RldGFpbDo6Tm9kZUFjY2VzczsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RhdGljIHZvaWQgaW5jcmVtZW50KFQgKiZJKSB7IEkgPSBBY2Nlc3M6OmdldE5leHQoKkkpOyB9CisgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdGF0aWMgdm9pZCBkZWNyZW1lbnQoVCAqJkkpIHsgSSA9IEFjY2Vzczo6Z2V0UHJldigqSSk7IH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgSXRlcmF0b3JIZWxwZXI8dHJ1ZT4gOiBpbGlzdF9kZXRhaWw6Ok5vZGVBY2Nlc3MgeworICB1c2luZyBBY2Nlc3MgPSBpbGlzdF9kZXRhaWw6Ok5vZGVBY2Nlc3M7CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0YXRpYyB2b2lkIGluY3JlbWVudChUIComSSkgeyBJID0gQWNjZXNzOjpnZXRQcmV2KCpJKTsgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RhdGljIHZvaWQgZGVjcmVtZW50KFQgKiZJKSB7IEkgPSBBY2Nlc3M6OmdldE5leHQoKkkpOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgaWxpc3RfZGV0YWlsCisKKy8vLyBJdGVyYXRvciBmb3IgaW50cnVzaXZlIGxpc3RzICBiYXNlZCBvbiBpbGlzdF9ub2RlLgordGVtcGxhdGUgPGNsYXNzIE9wdGlvbnNULCBib29sIElzUmV2ZXJzZSwgYm9vbCBJc0NvbnN0PgorY2xhc3MgaWxpc3RfaXRlcmF0b3IgOiBpbGlzdF9kZXRhaWw6OlNwZWNpZmljTm9kZUFjY2VzczxPcHRpb25zVD4geworICBmcmllbmQgaWxpc3RfaXRlcmF0b3I8T3B0aW9uc1QsIElzUmV2ZXJzZSwgIUlzQ29uc3Q+OworICBmcmllbmQgaWxpc3RfaXRlcmF0b3I8T3B0aW9uc1QsICFJc1JldmVyc2UsIElzQ29uc3Q+OworICBmcmllbmQgaWxpc3RfaXRlcmF0b3I8T3B0aW9uc1QsICFJc1JldmVyc2UsICFJc0NvbnN0PjsKKworICB1c2luZyBUcmFpdHMgPSBpbGlzdF9kZXRhaWw6Okl0ZXJhdG9yVHJhaXRzPE9wdGlvbnNULCBJc0NvbnN0PjsKKyAgdXNpbmcgQWNjZXNzID0gaWxpc3RfZGV0YWlsOjpTcGVjaWZpY05vZGVBY2Nlc3M8T3B0aW9uc1Q+OworCitwdWJsaWM6CisgIHVzaW5nIHZhbHVlX3R5cGUgPSB0eXBlbmFtZSBUcmFpdHM6OnZhbHVlX3R5cGU7CisgIHVzaW5nIHBvaW50ZXIgPSB0eXBlbmFtZSBUcmFpdHM6OnBvaW50ZXI7CisgIHVzaW5nIHJlZmVyZW5jZSA9IHR5cGVuYW1lIFRyYWl0czo6cmVmZXJlbmNlOworICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSBwdHJkaWZmX3Q7CisgIHVzaW5nIGl0ZXJhdG9yX2NhdGVnb3J5ID0gc3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZzsKKyAgdXNpbmcgY29uc3RfcG9pbnRlciA9IHR5cGVuYW1lIE9wdGlvbnNUOjpjb25zdF9wb2ludGVyOworICB1c2luZyBjb25zdF9yZWZlcmVuY2UgPSB0eXBlbmFtZSBPcHRpb25zVDo6Y29uc3RfcmVmZXJlbmNlOworCitwcml2YXRlOgorICB1c2luZyBub2RlX3BvaW50ZXIgPSB0eXBlbmFtZSBUcmFpdHM6Om5vZGVfcG9pbnRlcjsKKyAgdXNpbmcgbm9kZV9yZWZlcmVuY2UgPSB0eXBlbmFtZSBUcmFpdHM6Om5vZGVfcmVmZXJlbmNlOworCisgIG5vZGVfcG9pbnRlciBOb2RlUHRyID0gbnVsbHB0cjsKKworcHVibGljOgorICAvLy8gQ3JlYXRlIGZyb20gYW4gaWxpc3Rfbm9kZS4KKyAgZXhwbGljaXQgaWxpc3RfaXRlcmF0b3Iobm9kZV9yZWZlcmVuY2UgTikgOiBOb2RlUHRyKCZOKSB7fQorCisgIGV4cGxpY2l0IGlsaXN0X2l0ZXJhdG9yKHBvaW50ZXIgTlApIDogTm9kZVB0cihBY2Nlc3M6OmdldE5vZGVQdHIoTlApKSB7fQorICBleHBsaWNpdCBpbGlzdF9pdGVyYXRvcihyZWZlcmVuY2UgTlIpIDogTm9kZVB0cihBY2Nlc3M6OmdldE5vZGVQdHIoJk5SKSkge30KKyAgaWxpc3RfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgLy8gVGhpcyBpcyB0ZW1wbGF0ZWQgc28gdGhhdCB3ZSBjYW4gYWxsb3cgY29uc3RydWN0aW5nIGEgY29uc3QgaXRlcmF0b3IgZnJvbQorICAvLyBhIG5vbmNvbnN0IGl0ZXJhdG9yLi4uCisgIHRlbXBsYXRlIDxib29sIFJIU0lzQ29uc3Q+CisgIGlsaXN0X2l0ZXJhdG9yKAorICAgICAgY29uc3QgaWxpc3RfaXRlcmF0b3I8T3B0aW9uc1QsIElzUmV2ZXJzZSwgUkhTSXNDb25zdD4gJlJIUywKKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPElzQ29uc3QgfHwgIVJIU0lzQ29uc3QsIHZvaWQgKj46OnR5cGUgPSBudWxscHRyKQorICAgICAgOiBOb2RlUHRyKFJIUy5Ob2RlUHRyKSB7fQorCisgIC8vIFRoaXMgaXMgdGVtcGxhdGVkIHNvIHRoYXQgd2UgY2FuIGFsbG93IGFzc2lnbmluZyB0byBhIGNvbnN0IGl0ZXJhdG9yIGZyb20KKyAgLy8gYSBub25jb25zdCBpdGVyYXRvci4uLgorICB0ZW1wbGF0ZSA8Ym9vbCBSSFNJc0NvbnN0PgorICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxJc0NvbnN0IHx8ICFSSFNJc0NvbnN0LCBpbGlzdF9pdGVyYXRvciAmPjo6dHlwZQorICBvcGVyYXRvcj0oY29uc3QgaWxpc3RfaXRlcmF0b3I8T3B0aW9uc1QsIElzUmV2ZXJzZSwgUkhTSXNDb25zdD4gJlJIUykgeworICAgIE5vZGVQdHIgPSBSSFMuTm9kZVB0cjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gRXhwbGljaXQgY29udmVyc2lvbiBiZXR3ZWVuIGZvcndhcmQvcmV2ZXJzZSBpdGVyYXRvcnMuCisgIC8vLworICAvLy8gVHJhbnNsYXRlIGJldHdlZW4gZm9yd2FyZCBhbmQgcmV2ZXJzZSBpdGVyYXRvcnMgd2l0aG91dCBjaGFuZ2luZyByYW5nZQorICAvLy8gYm91bmRhcmllcy4gIFRoZSByZXN1bHRpbmcgaXRlcmF0b3Igd2lsbCBkZXJlZmVyZW5jZSAoYW5kIGhhdmUgYSBoYW5kbGUpCisgIC8vLyB0byB0aGUgcHJldmlvdXMgbm9kZSwgd2hpY2ggaXMgc29tZXdoYXQgdW5leHBlY3RlZDsgYnV0IGNvbnZlcnRpbmcgdGhlCisgIC8vLyB0d28gZW5kcG9pbnRzIGluIGEgcmFuZ2Ugd2lsbCBnaXZlIHRoZSBzYW1lIHJhbmdlIGluIHJldmVyc2UuCisgIC8vLworICAvLy8gVGhpcyBtYXRjaGVzIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvciBjb252ZXJzaW9ucy4KKyAgZXhwbGljaXQgaWxpc3RfaXRlcmF0b3IoCisgICAgICBjb25zdCBpbGlzdF9pdGVyYXRvcjxPcHRpb25zVCwgIUlzUmV2ZXJzZSwgSXNDb25zdD4gJlJIUykKKyAgICAgIDogaWxpc3RfaXRlcmF0b3IoKytSSFMuZ2V0UmV2ZXJzZSgpKSB7fQorCisgIC8vLyBHZXQgYSByZXZlcnNlIGl0ZXJhdG9yIHRvIHRoZSBzYW1lIG5vZGUuCisgIC8vLworICAvLy8gR2l2ZXMgYSByZXZlcnNlIGl0ZXJhdG9yIHRoYXQgd2lsbCBkZXJlZmVyZW5jZSAoYW5kIGhhdmUgYSBoYW5kbGUpIHRvIHRoZQorICAvLy8gc2FtZSBub2RlLiAgQ29udmVydGluZyB0aGUgZW5kcG9pbnQgaXRlcmF0b3JzIGluIGEgcmFuZ2Ugd2lsbCBnaXZlIGEKKyAgLy8vIGRpZmZlcmVudCByYW5nZTsgZm9yIHJhbmdlIG9wZXJhdGlvbnMsIHVzZSB0aGUgZXhwbGljaXQgY29udmVyc2lvbnMuCisgIGlsaXN0X2l0ZXJhdG9yPE9wdGlvbnNULCAhSXNSZXZlcnNlLCBJc0NvbnN0PiBnZXRSZXZlcnNlKCkgY29uc3QgeworICAgIGlmIChOb2RlUHRyKQorICAgICAgcmV0dXJuIGlsaXN0X2l0ZXJhdG9yPE9wdGlvbnNULCAhSXNSZXZlcnNlLCBJc0NvbnN0PigqTm9kZVB0cik7CisgICAgcmV0dXJuIGlsaXN0X2l0ZXJhdG9yPE9wdGlvbnNULCAhSXNSZXZlcnNlLCBJc0NvbnN0PigpOworICB9CisKKyAgLy8vIENvbnN0LWNhc3QuCisgIGlsaXN0X2l0ZXJhdG9yPE9wdGlvbnNULCBJc1JldmVyc2UsIGZhbHNlPiBnZXROb25Db25zdCgpIGNvbnN0IHsKKyAgICBpZiAoTm9kZVB0cikKKyAgICAgIHJldHVybiBpbGlzdF9pdGVyYXRvcjxPcHRpb25zVCwgSXNSZXZlcnNlLCBmYWxzZT4oCisgICAgICAgICAgY29uc3RfY2FzdDx0eXBlbmFtZSBpbGlzdF9pdGVyYXRvcjxPcHRpb25zVCwgSXNSZXZlcnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2U+Ojpub2RlX3JlZmVyZW5jZT4oKk5vZGVQdHIpKTsKKyAgICByZXR1cm4gaWxpc3RfaXRlcmF0b3I8T3B0aW9uc1QsIElzUmV2ZXJzZSwgZmFsc2U+KCk7CisgIH0KKworICAvLyBBY2Nlc3NvcnMuLi4KKyAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICBhc3NlcnQoIU5vZGVQdHItPmlzS25vd25TZW50aW5lbCgpKTsKKyAgICByZXR1cm4gKkFjY2Vzczo6Z2V0VmFsdWVQdHIoTm9kZVB0cik7CisgIH0KKyAgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJm9wZXJhdG9yKigpOyB9CisKKyAgLy8gQ29tcGFyaXNvbiBvcGVyYXRvcnMKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpbGlzdF9pdGVyYXRvciAmTEhTLCBjb25zdCBpbGlzdF9pdGVyYXRvciAmUkhTKSB7CisgICAgcmV0dXJuIExIUy5Ob2RlUHRyID09IFJIUy5Ob2RlUHRyOworICB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgaWxpc3RfaXRlcmF0b3IgJkxIUywgY29uc3QgaWxpc3RfaXRlcmF0b3IgJlJIUykgeworICAgIHJldHVybiBMSFMuTm9kZVB0ciAhPSBSSFMuTm9kZVB0cjsKKyAgfQorCisgIC8vIEluY3JlbWVudCBhbmQgZGVjcmVtZW50IG9wZXJhdG9ycy4uLgorICBpbGlzdF9pdGVyYXRvciAmb3BlcmF0b3ItLSgpIHsKKyAgICBOb2RlUHRyID0gSXNSZXZlcnNlID8gTm9kZVB0ci0+Z2V0TmV4dCgpIDogTm9kZVB0ci0+Z2V0UHJldigpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbGlzdF9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICBOb2RlUHRyID0gSXNSZXZlcnNlID8gTm9kZVB0ci0+Z2V0UHJldigpIDogTm9kZVB0ci0+Z2V0TmV4dCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBpbGlzdF9pdGVyYXRvciBvcGVyYXRvci0tKGludCkgeworICAgIGlsaXN0X2l0ZXJhdG9yIHRtcCA9ICp0aGlzOworICAgIC0tKnRoaXM7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorICBpbGlzdF9pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeworICAgIGlsaXN0X2l0ZXJhdG9yIHRtcCA9ICp0aGlzOworICAgICsrKnRoaXM7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorCisgIC8vLyBHZXQgdGhlIHVuZGVybHlpbmcgaWxpc3Rfbm9kZS4KKyAgbm9kZV9wb2ludGVyIGdldE5vZGVQdHIoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxub2RlX3BvaW50ZXI+KE5vZGVQdHIpOyB9CisKKyAgLy8vIENoZWNrIGZvciBlbmQuICBPbmx5IHZhbGlkIGlmIGlsaXN0X3NlbnRpbmVsX3RyYWNraW5nPHRydWU+LgorICBib29sIGlzRW5kKCkgY29uc3QgeyByZXR1cm4gTm9kZVB0ciA/IE5vZGVQdHItPmlzU2VudGluZWwoKSA6IGZhbHNlOyB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnJvbT4gc3RydWN0IHNpbXBsaWZ5X3R5cGU7CisKKy8vLyBBbGxvdyBpbGlzdF9pdGVyYXRvcnMgdG8gY29udmVydCBpbnRvIHBvaW50ZXJzIHRvIGEgbm9kZSBhdXRvbWF0aWNhbGx5IHdoZW4KKy8vLyB1c2VkIGJ5IHRoZSBkeW5fY2FzdCwgY2FzdCwgaXNhIG1lY2hhbmlzbXMuLi4KKy8vLworLy8vIEZJWE1FOiByZW1vdmUgdGhpcywgc2luY2UgdGhlcmUgaXMgbm8gaW1wbGljaXQgY29udmVyc2lvbiB0byBOb2RlVHkuCit0ZW1wbGF0ZSA8Y2xhc3MgT3B0aW9uc1QsIGJvb2wgSXNDb25zdD4KK3N0cnVjdCBzaW1wbGlmeV90eXBlPGlsaXN0X2l0ZXJhdG9yPE9wdGlvbnNULCBmYWxzZSwgSXNDb25zdD4+IHsKKyAgdXNpbmcgaXRlcmF0b3IgPSBpbGlzdF9pdGVyYXRvcjxPcHRpb25zVCwgZmFsc2UsIElzQ29uc3Q+OworICB1c2luZyBTaW1wbGVUeXBlID0gdHlwZW5hbWUgaXRlcmF0b3I6OnBvaW50ZXI7CisKKyAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKGNvbnN0IGl0ZXJhdG9yICZOb2RlKSB7IHJldHVybiAmKk5vZGU7IH0KK307Cit0ZW1wbGF0ZSA8Y2xhc3MgT3B0aW9uc1QsIGJvb2wgSXNDb25zdD4KK3N0cnVjdCBzaW1wbGlmeV90eXBlPGNvbnN0IGlsaXN0X2l0ZXJhdG9yPE9wdGlvbnNULCBmYWxzZSwgSXNDb25zdD4+CisgICAgOiBzaW1wbGlmeV90eXBlPGlsaXN0X2l0ZXJhdG9yPE9wdGlvbnNULCBmYWxzZSwgSXNDb25zdD4+IHt9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfSUxJU1RfSVRFUkFUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvaWxpc3Rfbm9kZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvaWxpc3Rfbm9kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNjI2MTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9pbGlzdF9ub2RlLmgKQEAgLTAsMCArMSwzMDYgQEAKKy8vPT09LSBsbHZtL0FEVC9pbGlzdF9ub2RlLmggLSBJbnRydXNpdmUgTGlua2VkIExpc3QgSGVscGVyIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGlsaXN0X25vZGUgY2xhc3MgdGVtcGxhdGUsIHdoaWNoIGlzIGEgY29udmVuaWVudAorLy8gYmFzZSBjbGFzcyBmb3IgY3JlYXRpbmcgY2xhc3NlcyB0aGF0IGNhbiBiZSB1c2VkIHdpdGggaWxpc3RzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfSUxJU1RfTk9ERV9ICisjZGVmaW5lIExMVk1fQURUX0lMSVNUX05PREVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3Rfbm9kZV9iYXNlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3Rfbm9kZV9vcHRpb25zLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIGlsaXN0X2RldGFpbCB7CisKK3N0cnVjdCBOb2RlQWNjZXNzOworCit9IC8vIGVuZCBuYW1lc3BhY2UgaWxpc3RfZGV0YWlsCisKK3RlbXBsYXRlIDxjbGFzcyBPcHRpb25zVCwgYm9vbCBJc1JldmVyc2UsIGJvb2wgSXNDb25zdD4gY2xhc3MgaWxpc3RfaXRlcmF0b3I7Cit0ZW1wbGF0ZSA8Y2xhc3MgT3B0aW9uc1Q+IGNsYXNzIGlsaXN0X3NlbnRpbmVsOworCisvLy8gSW1wbGVtZW50YXRpb24gZm9yIGFuIGlsaXN0IG5vZGUuCisvLy8KKy8vLyBUZW1wbGF0ZWQgb24gYW4gYXBwcm9wcmlhdGUgXGEgaWxpc3RfZGV0YWlsOjpub2RlX29wdGlvbnMsIHVzdWFsbHkgY29tcHV0ZWQKKy8vLyBieSBcYSBpbGlzdF9kZXRhaWw6OmNvbXB1dGVfbm9kZV9vcHRpb25zLgorLy8vCisvLy8gVGhpcyBpcyBhIHdyYXBwZXIgYXJvdW5kIFxhIGlsaXN0X25vZGVfYmFzZSB3aG9zZSBtYWluIHB1cnBvc2UgaXMgdG8KKy8vLyBwcm92aWRlIHR5cGUgc2FmZXR5OiB5b3UgY2FuJ3QgaW5zZXJ0IG5vZGVzIG9mIFxhIGlsaXN0X25vZGVfaW1wbCBpbnRvIHRoZQorLy8vIHdyb25nIFxhIHNpbXBsZV9pbGlzdCBvciBcYSBpcGxpc3QuCit0ZW1wbGF0ZSA8Y2xhc3MgT3B0aW9uc1Q+IGNsYXNzIGlsaXN0X25vZGVfaW1wbCA6IE9wdGlvbnNUOjpub2RlX2Jhc2VfdHlwZSB7CisgIHVzaW5nIHZhbHVlX3R5cGUgPSB0eXBlbmFtZSBPcHRpb25zVDo6dmFsdWVfdHlwZTsKKyAgdXNpbmcgbm9kZV9iYXNlX3R5cGUgPSB0eXBlbmFtZSBPcHRpb25zVDo6bm9kZV9iYXNlX3R5cGU7CisgIHVzaW5nIGxpc3RfYmFzZV90eXBlID0gdHlwZW5hbWUgT3B0aW9uc1Q6Omxpc3RfYmFzZV90eXBlOworCisgIGZyaWVuZCB0eXBlbmFtZSBPcHRpb25zVDo6bGlzdF9iYXNlX3R5cGU7CisgIGZyaWVuZCBzdHJ1Y3QgaWxpc3RfZGV0YWlsOjpOb2RlQWNjZXNzOworICBmcmllbmQgY2xhc3MgaWxpc3Rfc2VudGluZWw8T3B0aW9uc1Q+OworICBmcmllbmQgY2xhc3MgaWxpc3RfaXRlcmF0b3I8T3B0aW9uc1QsIGZhbHNlLCBmYWxzZT47CisgIGZyaWVuZCBjbGFzcyBpbGlzdF9pdGVyYXRvcjxPcHRpb25zVCwgZmFsc2UsIHRydWU+OworICBmcmllbmQgY2xhc3MgaWxpc3RfaXRlcmF0b3I8T3B0aW9uc1QsIHRydWUsIGZhbHNlPjsKKyAgZnJpZW5kIGNsYXNzIGlsaXN0X2l0ZXJhdG9yPE9wdGlvbnNULCB0cnVlLCB0cnVlPjsKKworcHJvdGVjdGVkOgorICB1c2luZyBzZWxmX2l0ZXJhdG9yID0gaWxpc3RfaXRlcmF0b3I8T3B0aW9uc1QsIGZhbHNlLCBmYWxzZT47CisgIHVzaW5nIGNvbnN0X3NlbGZfaXRlcmF0b3IgPSBpbGlzdF9pdGVyYXRvcjxPcHRpb25zVCwgZmFsc2UsIHRydWU+OworICB1c2luZyByZXZlcnNlX3NlbGZfaXRlcmF0b3IgPSBpbGlzdF9pdGVyYXRvcjxPcHRpb25zVCwgdHJ1ZSwgZmFsc2U+OworICB1c2luZyBjb25zdF9yZXZlcnNlX3NlbGZfaXRlcmF0b3IgPSBpbGlzdF9pdGVyYXRvcjxPcHRpb25zVCwgdHJ1ZSwgdHJ1ZT47CisKKyAgaWxpc3Rfbm9kZV9pbXBsKCkgPSBkZWZhdWx0OworCitwcml2YXRlOgorICBpbGlzdF9ub2RlX2ltcGwgKmdldFByZXYoKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGlsaXN0X25vZGVfaW1wbCAqPihub2RlX2Jhc2VfdHlwZTo6Z2V0UHJldigpKTsKKyAgfQorCisgIGlsaXN0X25vZGVfaW1wbCAqZ2V0TmV4dCgpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aWxpc3Rfbm9kZV9pbXBsICo+KG5vZGVfYmFzZV90eXBlOjpnZXROZXh0KCkpOworICB9CisKKyAgY29uc3QgaWxpc3Rfbm9kZV9pbXBsICpnZXRQcmV2KCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbGlzdF9ub2RlX2ltcGwgKj4obm9kZV9iYXNlX3R5cGU6OmdldFByZXYoKSk7CisgIH0KKworICBjb25zdCBpbGlzdF9ub2RlX2ltcGwgKmdldE5leHQoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGlsaXN0X25vZGVfaW1wbCAqPihub2RlX2Jhc2VfdHlwZTo6Z2V0TmV4dCgpKTsKKyAgfQorCisgIHZvaWQgc2V0UHJldihpbGlzdF9ub2RlX2ltcGwgKk4pIHsgbm9kZV9iYXNlX3R5cGU6OnNldFByZXYoTik7IH0KKyAgdm9pZCBzZXROZXh0KGlsaXN0X25vZGVfaW1wbCAqTikgeyBub2RlX2Jhc2VfdHlwZTo6c2V0TmV4dChOKTsgfQorCitwdWJsaWM6CisgIHNlbGZfaXRlcmF0b3IgZ2V0SXRlcmF0b3IoKSB7IHJldHVybiBzZWxmX2l0ZXJhdG9yKCp0aGlzKTsgfQorICBjb25zdF9zZWxmX2l0ZXJhdG9yIGdldEl0ZXJhdG9yKCkgY29uc3QgeyByZXR1cm4gY29uc3Rfc2VsZl9pdGVyYXRvcigqdGhpcyk7IH0KKworICByZXZlcnNlX3NlbGZfaXRlcmF0b3IgZ2V0UmV2ZXJzZUl0ZXJhdG9yKCkgeworICAgIHJldHVybiByZXZlcnNlX3NlbGZfaXRlcmF0b3IoKnRoaXMpOworICB9CisKKyAgY29uc3RfcmV2ZXJzZV9zZWxmX2l0ZXJhdG9yIGdldFJldmVyc2VJdGVyYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9zZWxmX2l0ZXJhdG9yKCp0aGlzKTsKKyAgfQorCisgIC8vIFVuZGVyLWFwcHJveGltYXRpb24sIGJ1dCBhbHdheXMgYXZhaWxhYmxlIGZvciBhc3NlcnRpb25zLgorICB1c2luZyBub2RlX2Jhc2VfdHlwZTo6aXNLbm93blNlbnRpbmVsOworCisgIC8vLyBDaGVjayB3aGV0aGVyIHRoaXMgaXMgdGhlIHNlbnRpbmVsIG5vZGUuCisgIC8vLworICAvLy8gVGhpcyByZXF1aXJlcyBzZW50aW5lbCB0cmFja2luZyB0byBiZSBleHBsaWNpdGx5IGVuYWJsZWQuICBVc2UgdGhlCisgIC8vLyBpbGlzdF9zZW50aW5lbF90cmFja2luZzx0cnVlPiBvcHRpb24gdG8gZ2V0IHRoaXMgQVBJLgorICBib29sIGlzU2VudGluZWwoKSBjb25zdCB7CisgICAgc3RhdGljX2Fzc2VydChPcHRpb25zVDo6aXNfc2VudGluZWxfdHJhY2tpbmdfZXhwbGljaXQsCisgICAgICAgICAgICAgICAgICAiVXNlIGlsaXN0X3NlbnRpbmVsX3RyYWNraW5nPHRydWU+IHRvIGVuYWJsZSBpc1NlbnRpbmVsKCkiKTsKKyAgICByZXR1cm4gbm9kZV9iYXNlX3R5cGU6OmlzU2VudGluZWwoKTsKKyAgfQorfTsKKworLy8vIEFuIGludHJ1c2l2ZSBsaXN0IG5vZGUuCisvLy8KKy8vLyBBIGJhc2UgY2xhc3MgdG8gZW5hYmxlIG1lbWJlcnNoaXAgaW4gaW50cnVzaXZlIGxpc3RzLCBpbmNsdWRpbmcgXGEKKy8vLyBzaW1wbGVfaWxpc3QsIFxhIGlwbGlzdCwgYW5kIFxhIGlsaXN0LiAgVGhlIGZpcnN0IHRlbXBsYXRlIHBhcmFtZXRlciBpcyB0aGUKKy8vLyBcYSB2YWx1ZV90eXBlIGZvciB0aGUgbGlzdC4KKy8vLworLy8vIEFuIGlsaXN0IG5vZGUgY2FuIGJlIGNvbmZpZ3VyZWQgd2l0aCBjb21waWxlLXRpbWUgb3B0aW9ucyB0byBjaGFuZ2UKKy8vLyBiZWhhdmlvdXIgYW5kL29yIGFkZCBBUEkuCisvLy8KKy8vLyBCeSBkZWZhdWx0LCBhbiBcYSBpbGlzdF9ub2RlIGtub3dzIHdoZXRoZXIgaXQgaXMgdGhlIGxpc3Qgc2VudGluZWwgKGFuCisvLy8gaW5zdGFuY2Ugb2YgXGEgaWxpc3Rfc2VudGluZWwpIGlmIGFuZCBvbmx5IGlmCisvLy8gTExWTV9FTkFCTEVfQUJJX0JSRUFLSU5HX0NIRUNLUy4gIFRoZSBmdW5jdGlvbiBcYSBpc0tub3duU2VudGluZWwoKSBhbHdheXMKKy8vLyByZXR1cm5zIFxjIGZhbHNlIHRyYWNraW5nIGlzIG9mZi4gIFNlbnRpbmVsIHRyYWNraW5nIHN0ZWFscyBhIGJpdCBmcm9tIHRoZQorLy8vICJwcmV2IiBsaW5rLCB3aGljaCBhZGRzIGEgbWFzayBvcGVyYXRpb24gd2hlbiBkZWNyZW1lbnRpbmcgYW4gaXRlcmF0b3IsIGJ1dAorLy8vIGVuYWJsZXMgYnVnLWZpbmRpbmcgYXNzZXJ0aW9ucyBpbiBcYSBpbGlzdF9pdGVyYXRvci4KKy8vLworLy8vIFRvIHR1cm4gc2VudGluZWwgdHJhY2tpbmcgb24gYWxsIHRoZSB0aW1lLCBwYXNzIGluIHRoZQorLy8vIGlsaXN0X3NlbnRpbmVsX3RyYWNraW5nPHRydWU+IHRlbXBsYXRlIHBhcmFtZXRlci4gIFRoaXMgYWxzbyBlbmFibGVzIHRoZSBcYQorLy8vIGlzU2VudGluZWwoKSBmdW5jdGlvbi4gIFRoZSBzYW1lIG9wdGlvbiBtdXN0IGJlIHBhc3NlZCB0byB0aGUgaW50cnVzaXZlCisvLy8gbGlzdC4gIChpbGlzdF9zZW50aW5lbF90cmFja2luZzxmYWxzZT4gdHVybnMgc2VudGluZWwgdHJhY2tpbmcgb2ZmIGFsbCB0aGUKKy8vLyB0aW1lLikKKy8vLworLy8vIEEgdHlwZSBjYW4gaW5oZXJpdCBmcm9tIGlsaXN0X25vZGUgbXVsdGlwbGUgdGltZXMgYnkgcGFzc2luZyBpbiBkaWZmZXJlbnQKKy8vLyBcYSBpbGlzdF90YWcgb3B0aW9ucy4gIFRoaXMgYWxsb3dzIGEgc2luZ2xlIGluc3RhbmNlIHRvIGJlIGluc2VydGVkIGludG8KKy8vLyBtdWx0aXBsZSBsaXN0cyBzaW11bHRhbmVvdXNseSwgd2hlcmUgZWFjaCBsaXN0IGlzIGdpdmVuIHRoZSBzYW1lIHRhZy4KKy8vLworLy8vIFxleGFtcGxlCisvLy8gc3RydWN0IEEge307CisvLy8gc3RydWN0IEIge307CisvLy8gc3RydWN0IE4gOiBpbGlzdF9ub2RlPE4sIGlsaXN0X3RhZzxBPj4sIGlsaXN0X25vZGU8TiwgaWxpc3RfdGFnPEI+PiB7fTsKKy8vLworLy8vIHZvaWQgZm9vKCkgeworLy8vICAgc2ltcGxlX2lsaXN0PE4sIGlsaXN0X3RhZzxBPj4gTGlzdEE7CisvLy8gICBzaW1wbGVfaWxpc3Q8TiwgaWxpc3RfdGFnPEI+PiBMaXN0QjsKKy8vLyAgIE4gTjE7CisvLy8gICBMaXN0QS5wdXNoX2JhY2soTjEpOworLy8vICAgTGlzdEIucHVzaF9iYWNrKE4xKTsKKy8vLyB9CisvLy8gXGVuZGV4YW1wbGUKKy8vLworLy8vIFNlZSBcYSBpc192YWxpZF9vcHRpb24gZm9yIHN0ZXBzIG9uIGFkZGluZyBhIG5ldyBvcHRpb24uCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MuLi4gT3B0aW9ucz4KK2NsYXNzIGlsaXN0X25vZGUKKyAgICA6IHB1YmxpYyBpbGlzdF9ub2RlX2ltcGw8CisgICAgICAgICAgdHlwZW5hbWUgaWxpc3RfZGV0YWlsOjpjb21wdXRlX25vZGVfb3B0aW9uczxULCBPcHRpb25zLi4uPjo6dHlwZT4geworICBzdGF0aWNfYXNzZXJ0KGlsaXN0X2RldGFpbDo6Y2hlY2tfb3B0aW9uczxPcHRpb25zLi4uPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIlVucmVjb2duaXplZCBub2RlIG9wdGlvbiEiKTsKK307CisKK25hbWVzcGFjZSBpbGlzdF9kZXRhaWwgeworCisvLy8gQW4gYWNjZXNzIGNsYXNzIGZvciBpbGlzdF9ub2RlIHByaXZhdGUgQVBJLgorLy8vCisvLy8gVGhpcyBnaXZlcyBhY2Nlc3MgdG8gdGhlIHByaXZhdGUgcGFydHMgb2YgaWxpc3Qgbm9kZXMuICBOb2RlcyBmb3IgYW4gaWxpc3QKKy8vLyBzaG91bGQgZnJpZW5kIHRoaXMgY2xhc3MgaWYgdGhleSBpbmhlcml0IHByaXZhdGVseSBmcm9tIGlsaXN0X25vZGUuCisvLy8KKy8vLyBVc2luZyB0aGlzIGNsYXNzIG91dHNpZGUgb2YgdGhlIGlsaXN0IGltcGxlbWVudGF0aW9uIGlzIHVuc3VwcG9ydGVkLgorc3RydWN0IE5vZGVBY2Nlc3MgeworcHJvdGVjdGVkOgorICB0ZW1wbGF0ZSA8Y2xhc3MgT3B0aW9uc1Q+CisgIHN0YXRpYyBpbGlzdF9ub2RlX2ltcGw8T3B0aW9uc1Q+ICpnZXROb2RlUHRyKHR5cGVuYW1lIE9wdGlvbnNUOjpwb2ludGVyIE4pIHsKKyAgICByZXR1cm4gTjsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBPcHRpb25zVD4KKyAgc3RhdGljIGNvbnN0IGlsaXN0X25vZGVfaW1wbDxPcHRpb25zVD4gKgorICBnZXROb2RlUHRyKHR5cGVuYW1lIE9wdGlvbnNUOjpjb25zdF9wb2ludGVyIE4pIHsKKyAgICByZXR1cm4gTjsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBPcHRpb25zVD4KKyAgc3RhdGljIHR5cGVuYW1lIE9wdGlvbnNUOjpwb2ludGVyIGdldFZhbHVlUHRyKGlsaXN0X25vZGVfaW1wbDxPcHRpb25zVD4gKk4pIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dHlwZW5hbWUgT3B0aW9uc1Q6OnBvaW50ZXI+KE4pOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIE9wdGlvbnNUPgorICBzdGF0aWMgdHlwZW5hbWUgT3B0aW9uc1Q6OmNvbnN0X3BvaW50ZXIKKyAgZ2V0VmFsdWVQdHIoY29uc3QgaWxpc3Rfbm9kZV9pbXBsPE9wdGlvbnNUPiAqTikgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDx0eXBlbmFtZSBPcHRpb25zVDo6Y29uc3RfcG9pbnRlcj4oTik7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgT3B0aW9uc1Q+CisgIHN0YXRpYyBpbGlzdF9ub2RlX2ltcGw8T3B0aW9uc1Q+ICpnZXRQcmV2KGlsaXN0X25vZGVfaW1wbDxPcHRpb25zVD4gJk4pIHsKKyAgICByZXR1cm4gTi5nZXRQcmV2KCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgT3B0aW9uc1Q+CisgIHN0YXRpYyBpbGlzdF9ub2RlX2ltcGw8T3B0aW9uc1Q+ICpnZXROZXh0KGlsaXN0X25vZGVfaW1wbDxPcHRpb25zVD4gJk4pIHsKKyAgICByZXR1cm4gTi5nZXROZXh0KCk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgT3B0aW9uc1Q+CisgIHN0YXRpYyBjb25zdCBpbGlzdF9ub2RlX2ltcGw8T3B0aW9uc1Q+ICoKKyAgZ2V0UHJldihjb25zdCBpbGlzdF9ub2RlX2ltcGw8T3B0aW9uc1Q+ICZOKSB7CisgICAgcmV0dXJuIE4uZ2V0UHJldigpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIE9wdGlvbnNUPgorICBzdGF0aWMgY29uc3QgaWxpc3Rfbm9kZV9pbXBsPE9wdGlvbnNUPiAqCisgIGdldE5leHQoY29uc3QgaWxpc3Rfbm9kZV9pbXBsPE9wdGlvbnNUPiAmTikgeworICAgIHJldHVybiBOLmdldE5leHQoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIE9wdGlvbnNUPiBzdHJ1Y3QgU3BlY2lmaWNOb2RlQWNjZXNzIDogTm9kZUFjY2VzcyB7Citwcm90ZWN0ZWQ6CisgIHVzaW5nIHBvaW50ZXIgPSB0eXBlbmFtZSBPcHRpb25zVDo6cG9pbnRlcjsKKyAgdXNpbmcgY29uc3RfcG9pbnRlciA9IHR5cGVuYW1lIE9wdGlvbnNUOjpjb25zdF9wb2ludGVyOworICB1c2luZyBub2RlX3R5cGUgPSBpbGlzdF9ub2RlX2ltcGw8T3B0aW9uc1Q+OworCisgIHN0YXRpYyBub2RlX3R5cGUgKmdldE5vZGVQdHIocG9pbnRlciBOKSB7CisgICAgcmV0dXJuIE5vZGVBY2Nlc3M6OmdldE5vZGVQdHI8T3B0aW9uc1Q+KE4pOworICB9CisKKyAgc3RhdGljIGNvbnN0IG5vZGVfdHlwZSAqZ2V0Tm9kZVB0cihjb25zdF9wb2ludGVyIE4pIHsKKyAgICByZXR1cm4gTm9kZUFjY2Vzczo6Z2V0Tm9kZVB0cjxPcHRpb25zVD4oTik7CisgIH0KKworICBzdGF0aWMgcG9pbnRlciBnZXRWYWx1ZVB0cihub2RlX3R5cGUgKk4pIHsKKyAgICByZXR1cm4gTm9kZUFjY2Vzczo6Z2V0VmFsdWVQdHI8T3B0aW9uc1Q+KE4pOworICB9CisKKyAgc3RhdGljIGNvbnN0X3BvaW50ZXIgZ2V0VmFsdWVQdHIoY29uc3Qgbm9kZV90eXBlICpOKSB7CisgICAgcmV0dXJuIE5vZGVBY2Nlc3M6OmdldFZhbHVlUHRyPE9wdGlvbnNUPihOKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGlsaXN0X2RldGFpbAorCit0ZW1wbGF0ZSA8Y2xhc3MgT3B0aW9uc1Q+CitjbGFzcyBpbGlzdF9zZW50aW5lbCA6IHB1YmxpYyBpbGlzdF9ub2RlX2ltcGw8T3B0aW9uc1Q+IHsKK3B1YmxpYzoKKyAgaWxpc3Rfc2VudGluZWwoKSB7CisgICAgdGhpcy0+aW5pdGlhbGl6ZVNlbnRpbmVsKCk7CisgICAgcmVzZXQoKTsKKyAgfQorCisgIHZvaWQgcmVzZXQoKSB7CisgICAgdGhpcy0+c2V0UHJldih0aGlzKTsKKyAgICB0aGlzLT5zZXROZXh0KHRoaXMpOworICB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHRoaXMgPT0gdGhpcy0+Z2V0UHJldigpOyB9Cit9OworCisvLy8gQW4gaWxpc3Qgbm9kZSB0aGF0IGNhbiBhY2Nlc3MgaXRzIHBhcmVudCBsaXN0LgorLy8vCisvLy8gUmVxdWlyZXMgXGMgTm9kZVR5IHRvIGhhdmUgXGEgZ2V0UGFyZW50KCkgdG8gZmluZCB0aGUgcGFyZW50IG5vZGUsIGFuZCB0aGUKKy8vLyBcYyBQYXJlbnRUeSB0byBoYXZlIFxhIGdldFN1Ymxpc3RBY2Nlc3MoKSB0byBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIGxpc3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTm9kZVR5LCB0eXBlbmFtZSBQYXJlbnRUeSwgY2xhc3MuLi4gT3B0aW9ucz4KK2NsYXNzIGlsaXN0X25vZGVfd2l0aF9wYXJlbnQgOiBwdWJsaWMgaWxpc3Rfbm9kZTxOb2RlVHksIE9wdGlvbnMuLi4+IHsKK3Byb3RlY3RlZDoKKyAgaWxpc3Rfbm9kZV93aXRoX3BhcmVudCgpID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgLy8vIEZvcndhcmQgdG8gTm9kZVR5OjpnZXRQYXJlbnQoKS4KKyAgLy8vCisgIC8vLyBOb3RlOiBkbyBub3QgdXNlIHRoZSBuYW1lICJnZXRQYXJlbnQoKSIuICBXZSB3YW50IGEgY29tcGlsZSBlcnJvcgorICAvLy8gKGluc3RlYWQgb2YgcmVjdXJzaW9uKSB3aGVuIHRoZSBzdWJjbGFzcyBmYWlscyB0byBpbXBsZW1lbnQgXGEKKyAgLy8vIGdldFBhcmVudCgpLgorICBjb25zdCBQYXJlbnRUeSAqZ2V0Tm9kZVBhcmVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgTm9kZVR5ICo+KHRoaXMpLT5nZXRQYXJlbnQoKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBAbmFtZSBBZGphY2VudCBOb2RlIEFjY2Vzc29ycworICAvLy8gQHsKKyAgLy8vIFxicmllZiBHZXQgdGhlIHByZXZpb3VzIG5vZGUsIG9yIFxjIG51bGxwdHIgZm9yIHRoZSBsaXN0IGhlYWQuCisgIE5vZGVUeSAqZ2V0UHJldk5vZGUoKSB7CisgICAgLy8gU2hvdWxkIGJlIHNlcGFyYXRlZCB0byBhIHJldXNlZCBmdW5jdGlvbiwgYnV0IHRoZW4gd2UgY291bGRuJ3QgdXNlIGF1dG8KKyAgICAvLyAoYW5kIHdvdWxkIG5lZWQgdGhlIHR5cGUgb2YgdGhlIGxpc3QpLgorICAgIGNvbnN0IGF1dG8gJkxpc3QgPQorICAgICAgICBnZXROb2RlUGFyZW50KCktPiooUGFyZW50VHk6OmdldFN1Ymxpc3RBY2Nlc3MoKE5vZGVUeSAqKW51bGxwdHIpKTsKKyAgICByZXR1cm4gTGlzdC5nZXRQcmV2Tm9kZSgqc3RhdGljX2Nhc3Q8Tm9kZVR5ICo+KHRoaXMpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBwcmV2aW91cyBub2RlLCBvciBcYyBudWxscHRyIGZvciB0aGUgbGlzdCBoZWFkLgorICBjb25zdCBOb2RlVHkgKmdldFByZXZOb2RlKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PGlsaXN0X25vZGVfd2l0aF9wYXJlbnQgKj4odGhpcyktPmdldFByZXZOb2RlKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbmV4dCBub2RlLCBvciBcYyBudWxscHRyIGZvciB0aGUgbGlzdCB0YWlsLgorICBOb2RlVHkgKmdldE5leHROb2RlKCkgeworICAgIC8vIFNob3VsZCBiZSBzZXBhcmF0ZWQgdG8gYSByZXVzZWQgZnVuY3Rpb24sIGJ1dCB0aGVuIHdlIGNvdWxkbid0IHVzZSBhdXRvCisgICAgLy8gKGFuZCB3b3VsZCBuZWVkIHRoZSB0eXBlIG9mIHRoZSBsaXN0KS4KKyAgICBjb25zdCBhdXRvICZMaXN0ID0KKyAgICAgICAgZ2V0Tm9kZVBhcmVudCgpLT4qKFBhcmVudFR5OjpnZXRTdWJsaXN0QWNjZXNzKChOb2RlVHkgKiludWxscHRyKSk7CisgICAgcmV0dXJuIExpc3QuZ2V0TmV4dE5vZGUoKnN0YXRpY19jYXN0PE5vZGVUeSAqPih0aGlzKSk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbmV4dCBub2RlLCBvciBcYyBudWxscHRyIGZvciB0aGUgbGlzdCB0YWlsLgorICBjb25zdCBOb2RlVHkgKmdldE5leHROb2RlKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PGlsaXN0X25vZGVfd2l0aF9wYXJlbnQgKj4odGhpcyktPmdldE5leHROb2RlKCk7CisgIH0KKyAgLy8vIEB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfSUxJU1RfTk9ERV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9pbGlzdF9ub2RlX2Jhc2UuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL2lsaXN0X25vZGVfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1MDYyYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9pbGlzdF9ub2RlX2Jhc2UuaApAQCAtMCwwICsxLDUzIEBACisvLz09PS0gbGx2bS9BRFQvaWxpc3Rfbm9kZV9iYXNlLmggLSBJbnRydXNpdmUgTGlzdCBOb2RlIEJhc2UgLS0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0lMSVNUX05PREVfQkFTRV9ICisjZGVmaW5lIExMVk1fQURUX0lMSVNUX05PREVfQkFTRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBCYXNlIGNsYXNzIGZvciBpbGlzdCBub2Rlcy4KKy8vLworLy8vIE9wdGlvbmFsbHkgdHJhY2tzIHdoZXRoZXIgdGhpcyBub2RlIGlzIHRoZSBzZW50aW5lbC4KK3RlbXBsYXRlIDxib29sIEVuYWJsZVNlbnRpbmVsVHJhY2tpbmc+IGNsYXNzIGlsaXN0X25vZGVfYmFzZTsKKwordGVtcGxhdGUgPD4gY2xhc3MgaWxpc3Rfbm9kZV9iYXNlPGZhbHNlPiB7CisgIGlsaXN0X25vZGVfYmFzZSAqUHJldiA9IG51bGxwdHI7CisgIGlsaXN0X25vZGVfYmFzZSAqTmV4dCA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgdm9pZCBzZXRQcmV2KGlsaXN0X25vZGVfYmFzZSAqUHJldikgeyB0aGlzLT5QcmV2ID0gUHJldjsgfQorICB2b2lkIHNldE5leHQoaWxpc3Rfbm9kZV9iYXNlICpOZXh0KSB7IHRoaXMtPk5leHQgPSBOZXh0OyB9CisgIGlsaXN0X25vZGVfYmFzZSAqZ2V0UHJldigpIGNvbnN0IHsgcmV0dXJuIFByZXY7IH0KKyAgaWxpc3Rfbm9kZV9iYXNlICpnZXROZXh0KCkgY29uc3QgeyByZXR1cm4gTmV4dDsgfQorCisgIGJvb2wgaXNLbm93blNlbnRpbmVsKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKyAgdm9pZCBpbml0aWFsaXplU2VudGluZWwoKSB7fQorfTsKKwordGVtcGxhdGUgPD4gY2xhc3MgaWxpc3Rfbm9kZV9iYXNlPHRydWU+IHsKKyAgUG9pbnRlckludFBhaXI8aWxpc3Rfbm9kZV9iYXNlICosIDE+IFByZXZBbmRTZW50aW5lbDsKKyAgaWxpc3Rfbm9kZV9iYXNlICpOZXh0ID0gbnVsbHB0cjsKKworcHVibGljOgorICB2b2lkIHNldFByZXYoaWxpc3Rfbm9kZV9iYXNlICpQcmV2KSB7IFByZXZBbmRTZW50aW5lbC5zZXRQb2ludGVyKFByZXYpOyB9CisgIHZvaWQgc2V0TmV4dChpbGlzdF9ub2RlX2Jhc2UgKk5leHQpIHsgdGhpcy0+TmV4dCA9IE5leHQ7IH0KKyAgaWxpc3Rfbm9kZV9iYXNlICpnZXRQcmV2KCkgY29uc3QgeyByZXR1cm4gUHJldkFuZFNlbnRpbmVsLmdldFBvaW50ZXIoKTsgfQorICBpbGlzdF9ub2RlX2Jhc2UgKmdldE5leHQoKSBjb25zdCB7IHJldHVybiBOZXh0OyB9CisKKyAgYm9vbCBpc1NlbnRpbmVsKCkgY29uc3QgeyByZXR1cm4gUHJldkFuZFNlbnRpbmVsLmdldEludCgpOyB9CisgIGJvb2wgaXNLbm93blNlbnRpbmVsKCkgY29uc3QgeyByZXR1cm4gaXNTZW50aW5lbCgpOyB9CisgIHZvaWQgaW5pdGlhbGl6ZVNlbnRpbmVsKCkgeyBQcmV2QW5kU2VudGluZWwuc2V0SW50KHRydWUpOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BRFRfSUxJU1RfTk9ERV9CQVNFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL2lsaXN0X25vZGVfb3B0aW9ucy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvaWxpc3Rfbm9kZV9vcHRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMzZGYxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL2lsaXN0X25vZGVfb3B0aW9ucy5oCkBAIC0wLDAgKzEsMTMzIEBACisvLz09PS0gbGx2bS9BRFQvaWxpc3Rfbm9kZV9vcHRpb25zLmggLSBpbGlzdF9ub2RlIE9wdGlvbnMgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQURUX0lMSVNUX05PREVfT1BUSU9OU19ICisjZGVmaW5lIExMVk1fQURUX0lMSVNUX05PREVfT1BUSU9OU19ICisKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9hYmktYnJlYWtpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9sbHZtLWNvbmZpZy5oIgorCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPGJvb2wgRW5hYmxlU2VudGluZWxUcmFja2luZz4gY2xhc3MgaWxpc3Rfbm9kZV9iYXNlOwordGVtcGxhdGUgPGJvb2wgRW5hYmxlU2VudGluZWxUcmFja2luZz4gY2xhc3MgaWxpc3RfYmFzZTsKKworLy8vIE9wdGlvbiB0byBjaG9vc2Ugd2hldGhlciB0byB0cmFjayBzZW50aW5lbHMuCisvLy8KKy8vLyBUaGlzIG9wdGlvbiBhZmZlY3RzIHRoZSBBQkkgZm9yIHRoZSBub2Rlcy4gIFdoZW4gbm90IHNwZWNpZmllZCBleHBsaWNpdGx5LAorLy8vIHRoZSBBQkkgZGVwZW5kcyBvbiBMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTLiAgU3BlY2lmeSBleHBsaWNpdGx5IHRvCisvLy8gZW5hYmxlIFxhIGlsaXN0X25vZGU6OmlzU2VudGluZWwoKS4KK3RlbXBsYXRlIDxib29sIEVuYWJsZVNlbnRpbmVsVHJhY2tpbmc+IHN0cnVjdCBpbGlzdF9zZW50aW5lbF90cmFja2luZyB7fTsKKworLy8vIE9wdGlvbiB0byBzcGVjaWZ5IGEgdGFnIGZvciB0aGUgbm9kZSB0eXBlLgorLy8vCisvLy8gVGhpcyBvcHRpb24gYWxsb3dzIGEgc2luZ2xlIHZhbHVlIHR5cGUgdG8gYmUgaW5zZXJ0ZWQgaW4gbXVsdGlwbGUgbGlzdHMKKy8vLyBzaW11bHRhbmVvdXNseS4gIFNlZSBcYSBpbGlzdF9ub2RlIGZvciB1c2FnZSBleGFtcGxlcy4KK3RlbXBsYXRlIDxjbGFzcyBUYWc+IHN0cnVjdCBpbGlzdF90YWcge307CisKK25hbWVzcGFjZSBpbGlzdF9kZXRhaWwgeworCisvLy8gSGVscGVyIHRyYWl0IGZvciByZWNvcmRpbmcgd2hldGhlciBhbiBvcHRpb24gaXMgc3BlY2lmaWVkIGV4cGxpY2l0bHkuCit0ZW1wbGF0ZSA8Ym9vbCBJc0V4cGxpY2l0PiBzdHJ1Y3QgZXhwbGljaXRuZXNzIHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgaXNfZXhwbGljaXQgPSBJc0V4cGxpY2l0OworfTsKK3R5cGVkZWYgZXhwbGljaXRuZXNzPHRydWU+IGlzX2V4cGxpY2l0OwordHlwZWRlZiBleHBsaWNpdG5lc3M8ZmFsc2U+IGlzX2ltcGxpY2l0OworCisvLy8gQ2hlY2sgd2hldGhlciBhbiBvcHRpb24gaXMgdmFsaWQuCisvLy8KKy8vLyBUaGUgc3RlcHMgZm9yIGFkZGluZyBhbmQgZW5hYmxpbmcgYSBuZXcgaWxpc3Qgb3B0aW9uIGluY2x1ZGU6CisvLy8gXGxpIGRlZmluZSB0aGUgb3B0aW9uLCBpbGlzdF9mb288QmFyPiwgYWJvdmU7CisvLy8gXGxpIGFkZCBuZXcgcGFyYW1ldGVycyBmb3IgQmFyIHRvIFxhIGlsaXN0X2RldGFpbDo6bm9kZV9vcHRpb25zOworLy8vIFxsaSBhZGQgYW4gZXh0cmFjdGlvbiBtZXRhLWZ1bmN0aW9uLCBpbGlzdF9kZXRhaWw6OmV4dHJhY3RfZm9vOworLy8vIFxsaSBjYWxsIGV4dHJhY3RfZm9vIGZyb20gXGEgaWxpc3RfZGV0YWlsOjpjb21wdXRlX25vZGVfb3B0aW9ucyBhbmQgcGFzcyBpdAorLy8vIGludG8gXGEgaWxpc3RfZGV0YWlsOjpub2RlX29wdGlvbnM7IGFuZAorLy8vIFxsaSBzcGVjaWFsaXplIFxjIGlzX3ZhbGlkX29wdGlvbjxpbGlzdF9mb288QmFyPj4gdG8gaW5oZXJpdCBmcm9tIFxjCisvLy8gc3RkOjp0cnVlX3R5cGUgdG8gZ2V0IHN0YXRpYyBhc3NlcnRpb25zIHBhc3NpbmcgaW4gXGEgc2ltcGxlX2lsaXN0IGFuZCBcYQorLy8vIGlsaXN0X25vZGUuCit0ZW1wbGF0ZSA8Y2xhc3MgT3B0aW9uPiBzdHJ1Y3QgaXNfdmFsaWRfb3B0aW9uIDogc3RkOjpmYWxzZV90eXBlIHt9OworCisvLy8gRXh0cmFjdCBzZW50aW5lbCB0cmFja2luZyBvcHRpb24uCisvLy8KKy8vLyBMb29rIHRocm91Z2ggXHAgT3B0aW9ucyBmb3IgdGhlIFxhIGlsaXN0X3NlbnRpbmVsX3RyYWNraW5nIG9wdGlvbiwgd2l0aCB0aGUKKy8vLyBkZWZhdWx0IGRlcGVuZGluZyBvbiBMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTLgordGVtcGxhdGUgPGNsYXNzLi4uIE9wdGlvbnM+IHN0cnVjdCBleHRyYWN0X3NlbnRpbmVsX3RyYWNraW5nOwordGVtcGxhdGUgPGJvb2wgRW5hYmxlU2VudGluZWxUcmFja2luZywgY2xhc3MuLi4gT3B0aW9ucz4KK3N0cnVjdCBleHRyYWN0X3NlbnRpbmVsX3RyYWNraW5nPAorICAgIGlsaXN0X3NlbnRpbmVsX3RyYWNraW5nPEVuYWJsZVNlbnRpbmVsVHJhY2tpbmc+LCBPcHRpb25zLi4uPgorICAgIDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBFbmFibGVTZW50aW5lbFRyYWNraW5nPiwgaXNfZXhwbGljaXQge307Cit0ZW1wbGF0ZSA8Y2xhc3MgT3B0aW9uMSwgY2xhc3MuLi4gT3B0aW9ucz4KK3N0cnVjdCBleHRyYWN0X3NlbnRpbmVsX3RyYWNraW5nPE9wdGlvbjEsIE9wdGlvbnMuLi4+CisgICAgOiBleHRyYWN0X3NlbnRpbmVsX3RyYWNraW5nPE9wdGlvbnMuLi4+IHt9OworI2lmIExMVk1fRU5BQkxFX0FCSV9CUkVBS0lOR19DSEVDS1MKK3RlbXBsYXRlIDw+IHN0cnVjdCBleHRyYWN0X3NlbnRpbmVsX3RyYWNraW5nPD4gOiBzdGQ6OnRydWVfdHlwZSwgaXNfaW1wbGljaXQge307CisjZWxzZQordGVtcGxhdGUgPD4KK3N0cnVjdCBleHRyYWN0X3NlbnRpbmVsX3RyYWNraW5nPD4gOiBzdGQ6OmZhbHNlX3R5cGUsIGlzX2ltcGxpY2l0IHt9OworI2VuZGlmCit0ZW1wbGF0ZSA8Ym9vbCBFbmFibGVTZW50aW5lbFRyYWNraW5nPgorc3RydWN0IGlzX3ZhbGlkX29wdGlvbjxpbGlzdF9zZW50aW5lbF90cmFja2luZzxFbmFibGVTZW50aW5lbFRyYWNraW5nPj4KKyAgICA6IHN0ZDo6dHJ1ZV90eXBlIHt9OworCisvLy8gRXh0cmFjdCBjdXN0b20gdGFnIG9wdGlvbi4KKy8vLworLy8vIExvb2sgdGhyb3VnaCBccCBPcHRpb25zIGZvciB0aGUgXGEgaWxpc3RfdGFnIG9wdGlvbiwgcHVsbGluZyBvdXQgdGhlCisvLy8gY3VzdG9tIHRhZyB0eXBlLCB1c2luZyB2b2lkIGFzIGEgZGVmYXVsdC4KK3RlbXBsYXRlIDxjbGFzcy4uLiBPcHRpb25zPiBzdHJ1Y3QgZXh0cmFjdF90YWc7Cit0ZW1wbGF0ZSA8Y2xhc3MgVGFnLCBjbGFzcy4uLiBPcHRpb25zPgorc3RydWN0IGV4dHJhY3RfdGFnPGlsaXN0X3RhZzxUYWc+LCBPcHRpb25zLi4uPiB7CisgIHR5cGVkZWYgVGFnIHR5cGU7Cit9OwordGVtcGxhdGUgPGNsYXNzIE9wdGlvbjEsIGNsYXNzLi4uIE9wdGlvbnM+CitzdHJ1Y3QgZXh0cmFjdF90YWc8T3B0aW9uMSwgT3B0aW9ucy4uLj4gOiBleHRyYWN0X3RhZzxPcHRpb25zLi4uPiB7fTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBleHRyYWN0X3RhZzw+IHsgdHlwZWRlZiB2b2lkIHR5cGU7IH07Cit0ZW1wbGF0ZSA8Y2xhc3MgVGFnPiBzdHJ1Y3QgaXNfdmFsaWRfb3B0aW9uPGlsaXN0X3RhZzxUYWc+PiA6IHN0ZDo6dHJ1ZV90eXBlIHt9OworCisvLy8gQ2hlY2sgd2hldGhlciBvcHRpb25zIGFyZSB2YWxpZC4KKy8vLworLy8vIFRoZSBjb25qdW5jdGlvbiBvZiBcYSBpc192YWxpZF9vcHRpb24gb24gZWFjaCBpbmRpdmlkdWFsIG9wdGlvbi4KK3RlbXBsYXRlIDxjbGFzcy4uLiBPcHRpb25zPiBzdHJ1Y3QgY2hlY2tfb3B0aW9uczsKK3RlbXBsYXRlIDw+IHN0cnVjdCBjaGVja19vcHRpb25zPD4gOiBzdGQ6OnRydWVfdHlwZSB7fTsKK3RlbXBsYXRlIDxjbGFzcyBPcHRpb24xLCBjbGFzcy4uLiBPcHRpb25zPgorc3RydWN0IGNoZWNrX29wdGlvbnM8T3B0aW9uMSwgT3B0aW9ucy4uLj4KKyAgICA6IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgaXNfdmFsaWRfb3B0aW9uPE9wdGlvbjE+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2tfb3B0aW9uczxPcHRpb25zLi4uPjo6dmFsdWU+IHt9OworCisvLy8gVHJhaXRzIGZvciBvcHRpb25zIGZvciBcYSBpbGlzdF9ub2RlLgorLy8vCisvLy8gVGhpcyBpcyB1c3VhbGx5IGNvbXB1dGVkIHZpYSBcYSBjb21wdXRlX25vZGVfb3B0aW9ucy4KK3RlbXBsYXRlIDxjbGFzcyBULCBib29sIEVuYWJsZVNlbnRpbmVsVHJhY2tpbmcsIGJvb2wgSXNTZW50aW5lbFRyYWNraW5nRXhwbGljaXQsCisgICAgICAgICAgY2xhc3MgVGFnVD4KK3N0cnVjdCBub2RlX29wdGlvbnMgeworICB0eXBlZGVmIFQgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBUICpwb2ludGVyOworICB0eXBlZGVmIFQgJnJlZmVyZW5jZTsKKyAgdHlwZWRlZiBjb25zdCBUICpjb25zdF9wb2ludGVyOworICB0eXBlZGVmIGNvbnN0IFQgJmNvbnN0X3JlZmVyZW5jZTsKKworICBzdGF0aWMgY29uc3QgYm9vbCBlbmFibGVfc2VudGluZWxfdHJhY2tpbmcgPSBFbmFibGVTZW50aW5lbFRyYWNraW5nOworICBzdGF0aWMgY29uc3QgYm9vbCBpc19zZW50aW5lbF90cmFja2luZ19leHBsaWNpdCA9IElzU2VudGluZWxUcmFja2luZ0V4cGxpY2l0OworICB0eXBlZGVmIFRhZ1QgdGFnOworICB0eXBlZGVmIGlsaXN0X25vZGVfYmFzZTxlbmFibGVfc2VudGluZWxfdHJhY2tpbmc+IG5vZGVfYmFzZV90eXBlOworICB0eXBlZGVmIGlsaXN0X2Jhc2U8ZW5hYmxlX3NlbnRpbmVsX3RyYWNraW5nPiBsaXN0X2Jhc2VfdHlwZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcy4uLiBPcHRpb25zPiBzdHJ1Y3QgY29tcHV0ZV9ub2RlX29wdGlvbnMgeworICB0eXBlZGVmIG5vZGVfb3B0aW9uczxULCBleHRyYWN0X3NlbnRpbmVsX3RyYWNraW5nPE9wdGlvbnMuLi4+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgZXh0cmFjdF9zZW50aW5lbF90cmFja2luZzxPcHRpb25zLi4uPjo6aXNfZXhwbGljaXQsCisgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGV4dHJhY3RfdGFnPE9wdGlvbnMuLi4+Ojp0eXBlPgorICAgICAgdHlwZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBpbGlzdF9kZXRhaWwKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9JTElTVF9OT0RFX09QVElPTlNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvaXRlcmF0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL2l0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzExZjhmMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQURUL2l0ZXJhdG9yLmgKQEAgLTAsMCArMSwzMzkgQEAKKy8vPT09LSBpdGVyYXRvci5oIC0gVXRpbGl0aWVzIGZvciB1c2luZyBhbmQgZGVmaW5pbmcgaXRlcmF0b3JzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfSVRFUkFUT1JfSAorI2RlZmluZSBMTFZNX0FEVF9JVEVSQVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFxicmllZiBDUlRQIGJhc2UgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyB0aGUgZW50aXJlIHN0YW5kYXJkIGl0ZXJhdG9yIGZhY2FkZQorLy8vIGluIHRlcm1zIG9mIGEgbWluaW1hbCBzdWJzZXQgb2YgdGhlIGludGVyZmFjZS4KKy8vLworLy8vIFVzZSB0aGlzIHdoZW4gaXQgaXMgcmVhc29uYWJsZSB0byBpbXBsZW1lbnQgbW9zdCBvZiB0aGUgaXRlcmF0b3IKKy8vLyBmdW5jdGlvbmFsaXR5IGluIHRlcm1zIG9mIGEgY29yZSBzdWJzZXQuIElmIHlvdSBuZWVkIHNwZWNpYWwgYmVoYXZpb3Igb3IKKy8vLyB0aGVyZSBhcmUgcGVyZm9ybWFuY2UgaW1wbGljYXRpb25zIGZvciB0aGlzLCB5b3UgbWF5IHdhbnQgdG8gb3ZlcnJpZGUgdGhlCisvLy8gcmVsZXZhbnQgbWVtYmVycyBpbnN0ZWFkLgorLy8vCisvLy8gTm90ZSwgb25lIGFic3RyYWN0aW9uIHRoYXQgdGhpcyBkb2VzICpub3QqIHByb3ZpZGUgaXMgaW1wbGVtZW50aW5nCisvLy8gc3VidHJhY3Rpb24gaW4gdGVybXMgb2YgYWRkaXRpb24gYnkgbmVnYXRpbmcgdGhlIGRpZmZlcmVuY2UuIE5lZ2F0aW9uIGlzbid0CisvLy8gYWx3YXlzIGluZm9ybWF0aW9uIHByZXNlcnZpbmcsIGFuZCBJIGNhbiBzZWUgdmVyeSByZWFzb25hYmxlIGl0ZXJhdG9yCisvLy8gZGVzaWducyB3aGVyZSB0aGlzIGRvZXNuJ3Qgd29yayB3ZWxsLiBJdCBkb2Vzbid0IHJlYWxseSBmb3JjZSBtdWNoIGFkZGVkCisvLy8gYm9pbGVycGxhdGUgYW55d2F5cy4KKy8vLworLy8vIEFub3RoZXIgYWJzdHJhY3Rpb24gdGhhdCB0aGlzIGRvZXNuJ3QgcHJvdmlkZSBpcyBpbXBsZW1lbnRpbmcgaW5jcmVtZW50IGluCisvLy8gdGVybXMgb2YgYWRkaXRpb24gb2Ygb25lLiBUaGVzZSBhcmVuJ3QgZXF1aXZhbGVudCBmb3IgYWxsIGl0ZXJhdG9yCisvLy8gY2F0ZWdvcmllcywgYW5kIHJlc3BlY3RpbmcgdGhhdCBhZGRzIGEgbG90IG9mIGNvbXBsZXhpdHkgZm9yIGxpdHRsZSBnYWluLgorLy8vCisvLy8gQ2xhc3NlcyB3aXNoaW5nIHRvIHVzZSBgaXRlcmF0b3JfZmFjYWRlX2Jhc2VgIHNob3VsZCBpbXBsZW1lbnQgdGhlIGZvbGxvd2luZworLy8vIG1ldGhvZHM6CisvLy8KKy8vLyBGb3J3YXJkIEl0ZXJhdG9yczoKKy8vLyAgIChBbGwgb2YgdGhlIGZvbGxvd2luZyBtZXRob2RzKQorLy8vICAgLSBEZXJpdmVkVCAmb3BlcmF0b3I9KGNvbnN0IERlcml2ZWRUICZSKTsKKy8vLyAgIC0gYm9vbCBvcGVyYXRvcj09KGNvbnN0IERlcml2ZWRUICZSKSBjb25zdDsKKy8vLyAgIC0gY29uc3QgVCAmb3BlcmF0b3IqKCkgY29uc3Q7CisvLy8gICAtIFQgJm9wZXJhdG9yKigpOworLy8vICAgLSBEZXJpdmVkVCAmb3BlcmF0b3IrKygpOworLy8vCisvLy8gQmlkaXJlY3Rpb25hbCBJdGVyYXRvcnM6CisvLy8gICAoQWxsIG1ldGhvZHMgb2YgZm9yd2FyZCBpdGVyYXRvcnMsIHBsdXMgdGhlIGZvbGxvd2luZykKKy8vLyAgIC0gRGVyaXZlZFQgJm9wZXJhdG9yLS0oKTsKKy8vLworLy8vIFJhbmRvbS1hY2Nlc3MgSXRlcmF0b3JzOgorLy8vICAgKEFsbCBtZXRob2RzIG9mIGJpZGlyZWN0aW9uYWwgaXRlcmF0b3JzIGV4Y2x1ZGluZyB0aGUgZm9sbG93aW5nKQorLy8vICAgLSBEZXJpdmVkVCAmb3BlcmF0b3IrKygpOworLy8vICAgLSBEZXJpdmVkVCAmb3BlcmF0b3ItLSgpOworLy8vICAgKGFuZCBwbHVzIHRoZSBmb2xsb3dpbmcpCisvLy8gICAtIGJvb2wgb3BlcmF0b3I8KGNvbnN0IERlcml2ZWRUICZSSFMpIGNvbnN0OworLy8vICAgLSBEaWZmZXJlbmNlVHlwZVQgb3BlcmF0b3ItKGNvbnN0IERlcml2ZWRUICZSKSBjb25zdDsKKy8vLyAgIC0gRGVyaXZlZFQgJm9wZXJhdG9yKz0oRGlmZmVyZW5jZVR5cGVUIE4pOworLy8vICAgLSBEZXJpdmVkVCAmb3BlcmF0b3ItPShEaWZmZXJlbmNlVHlwZVQgTik7CisvLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkVCwgdHlwZW5hbWUgSXRlcmF0b3JDYXRlZ29yeVQsIHR5cGVuYW1lIFQsCisgICAgICAgICAgdHlwZW5hbWUgRGlmZmVyZW5jZVR5cGVUID0gc3RkOjpwdHJkaWZmX3QsIHR5cGVuYW1lIFBvaW50ZXJUID0gVCAqLAorICAgICAgICAgIHR5cGVuYW1lIFJlZmVyZW5jZVQgPSBUICY+CitjbGFzcyBpdGVyYXRvcl9mYWNhZGVfYmFzZQorICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8SXRlcmF0b3JDYXRlZ29yeVQsIFQsIERpZmZlcmVuY2VUeXBlVCwgUG9pbnRlclQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWZlcmVuY2VUPiB7Citwcm90ZWN0ZWQ6CisgIGVudW0geworICAgIElzUmFuZG9tQWNjZXNzID0gc3RkOjppc19iYXNlX29mPHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3JDYXRlZ29yeVQ+Ojp2YWx1ZSwKKyAgICBJc0JpZGlyZWN0aW9uYWwgPSBzdGQ6OmlzX2Jhc2Vfb2Y8c3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3JDYXRlZ29yeVQ+Ojp2YWx1ZSwKKyAgfTsKKworICAvLy8gQSBwcm94eSBvYmplY3QgZm9yIGNvbXB1dGluZyBhIHJlZmVyZW5jZSB2aWEgaW5kaXJlY3RpbmcgYSBjb3B5IG9mIGFuCisgIC8vLyBpdGVyYXRvci4gVGhpcyBpcyB1c2VkIGluIEFQSXMgd2hpY2ggbmVlZCB0byBwcm9kdWNlIGEgcmVmZXJlbmNlIHZpYQorICAvLy8gaW5kaXJlY3Rpb24gYnV0IGZvciB3aGljaCB0aGUgaXRlcmF0b3Igb2JqZWN0IG1pZ2h0IGJlIGEgdGVtcG9yYXJ5LiBUaGUKKyAgLy8vIHByb3h5IHByZXNlcnZlcyB0aGUgaXRlcmF0b3IgaW50ZXJuYWxseSBhbmQgZXhwb3NlcyB0aGUgaW5kaXJlY3RlZAorICAvLy8gcmVmZXJlbmNlIHZpYSBhIGNvbnZlcnNpb24gb3BlcmF0b3IuCisgIGNsYXNzIFJlZmVyZW5jZVByb3h5IHsKKyAgICBmcmllbmQgaXRlcmF0b3JfZmFjYWRlX2Jhc2U7CisKKyAgICBEZXJpdmVkVCBJOworCisgICAgUmVmZXJlbmNlUHJveHkoRGVyaXZlZFQgSSkgOiBJKHN0ZDo6bW92ZShJKSkge30KKworICBwdWJsaWM6CisgICAgb3BlcmF0b3IgUmVmZXJlbmNlVCgpIGNvbnN0IHsgcmV0dXJuICpJOyB9CisgIH07CisKK3B1YmxpYzoKKyAgRGVyaXZlZFQgb3BlcmF0b3IrKERpZmZlcmVuY2VUeXBlVCBuKSBjb25zdCB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Jhc2Vfb2Y8aXRlcmF0b3JfZmFjYWRlX2Jhc2UsIERlcml2ZWRUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiTXVzdCBwYXNzIHRoZSBkZXJpdmVkIHR5cGUgdG8gdGhpcyB0ZW1wbGF0ZSEiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICBJc1JhbmRvbUFjY2VzcywKKyAgICAgICAgIlRoZSAnKycgb3BlcmF0b3IgaXMgb25seSBkZWZpbmVkIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4iKTsKKyAgICBEZXJpdmVkVCB0bXAgPSAqc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZFQgKj4odGhpcyk7CisgICAgdG1wICs9IG47CisgICAgcmV0dXJuIHRtcDsKKyAgfQorICBmcmllbmQgRGVyaXZlZFQgb3BlcmF0b3IrKERpZmZlcmVuY2VUeXBlVCBuLCBjb25zdCBEZXJpdmVkVCAmaSkgeworICAgIHN0YXRpY19hc3NlcnQoCisgICAgICAgIElzUmFuZG9tQWNjZXNzLAorICAgICAgICAiVGhlICcrJyBvcGVyYXRvciBpcyBvbmx5IGRlZmluZWQgZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLiIpOworICAgIHJldHVybiBpICsgbjsKKyAgfQorICBEZXJpdmVkVCBvcGVyYXRvci0oRGlmZmVyZW5jZVR5cGVUIG4pIGNvbnN0IHsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICBJc1JhbmRvbUFjY2VzcywKKyAgICAgICAgIlRoZSAnLScgb3BlcmF0b3IgaXMgb25seSBkZWZpbmVkIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4iKTsKKyAgICBEZXJpdmVkVCB0bXAgPSAqc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZFQgKj4odGhpcyk7CisgICAgdG1wIC09IG47CisgICAgcmV0dXJuIHRtcDsKKyAgfQorCisgIERlcml2ZWRUICZvcGVyYXRvcisrKCkgeworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19iYXNlX29mPGl0ZXJhdG9yX2ZhY2FkZV9iYXNlLCBEZXJpdmVkVD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIk11c3QgcGFzcyB0aGUgZGVyaXZlZCB0eXBlIHRvIHRoaXMgdGVtcGxhdGUhIik7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PERlcml2ZWRUICo+KHRoaXMpLT5vcGVyYXRvcis9KDEpOworICB9CisgIERlcml2ZWRUIG9wZXJhdG9yKysoaW50KSB7CisgICAgRGVyaXZlZFQgdG1wID0gKnN0YXRpY19jYXN0PERlcml2ZWRUICo+KHRoaXMpOworICAgICsrKnN0YXRpY19jYXN0PERlcml2ZWRUICo+KHRoaXMpOworICAgIHJldHVybiB0bXA7CisgIH0KKyAgRGVyaXZlZFQgJm9wZXJhdG9yLS0oKSB7CisgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgSXNCaWRpcmVjdGlvbmFsLAorICAgICAgICAiVGhlIGRlY3JlbWVudCBvcGVyYXRvciBpcyBvbmx5IGRlZmluZWQgZm9yIGJpZGlyZWN0aW9uYWwgaXRlcmF0b3JzLiIpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkVCAqPih0aGlzKS0+b3BlcmF0b3ItPSgxKTsKKyAgfQorICBEZXJpdmVkVCBvcGVyYXRvci0tKGludCkgeworICAgIHN0YXRpY19hc3NlcnQoCisgICAgICAgIElzQmlkaXJlY3Rpb25hbCwKKyAgICAgICAgIlRoZSBkZWNyZW1lbnQgb3BlcmF0b3IgaXMgb25seSBkZWZpbmVkIGZvciBiaWRpcmVjdGlvbmFsIGl0ZXJhdG9ycy4iKTsKKyAgICBEZXJpdmVkVCB0bXAgPSAqc3RhdGljX2Nhc3Q8RGVyaXZlZFQgKj4odGhpcyk7CisgICAgLS0qc3RhdGljX2Nhc3Q8RGVyaXZlZFQgKj4odGhpcyk7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBEZXJpdmVkVCAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuICFzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkVCAqPih0aGlzKS0+b3BlcmF0b3I9PShSSFMpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj4oY29uc3QgRGVyaXZlZFQgJlJIUykgY29uc3QgeworICAgIHN0YXRpY19hc3NlcnQoCisgICAgICAgIElzUmFuZG9tQWNjZXNzLAorICAgICAgICAiUmVsYXRpb25hbCBvcGVyYXRvcnMgYXJlIG9ubHkgZGVmaW5lZCBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMuIik7CisgICAgcmV0dXJuICFzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkVCAqPih0aGlzKS0+b3BlcmF0b3I8KFJIUykgJiYKKyAgICAgICAgICAgIXN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWRUICo+KHRoaXMpLT5vcGVyYXRvcj09KFJIUyk7CisgIH0KKyAgYm9vbCBvcGVyYXRvcjw9KGNvbnN0IERlcml2ZWRUICZSSFMpIGNvbnN0IHsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICBJc1JhbmRvbUFjY2VzcywKKyAgICAgICAgIlJlbGF0aW9uYWwgb3BlcmF0b3JzIGFyZSBvbmx5IGRlZmluZWQgZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLiIpOworICAgIHJldHVybiAhc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZFQgKj4odGhpcyktPm9wZXJhdG9yPihSSFMpOworICB9CisgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBEZXJpdmVkVCAmUkhTKSBjb25zdCB7CisgICAgc3RhdGljX2Fzc2VydCgKKyAgICAgICAgSXNSYW5kb21BY2Nlc3MsCisgICAgICAgICJSZWxhdGlvbmFsIG9wZXJhdG9ycyBhcmUgb25seSBkZWZpbmVkIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4iKTsKKyAgICByZXR1cm4gIXN0YXRpY19jYXN0PGNvbnN0IERlcml2ZWRUICo+KHRoaXMpLT5vcGVyYXRvcjwoUkhTKTsKKyAgfQorCisgIFBvaW50ZXJUIG9wZXJhdG9yLT4oKSB7IHJldHVybiAmc3RhdGljX2Nhc3Q8RGVyaXZlZFQgKj4odGhpcyktPm9wZXJhdG9yKigpOyB9CisgIFBvaW50ZXJUIG9wZXJhdG9yLT4oKSBjb25zdCB7CisgICAgcmV0dXJuICZzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkVCAqPih0aGlzKS0+b3BlcmF0b3IqKCk7CisgIH0KKyAgUmVmZXJlbmNlUHJveHkgb3BlcmF0b3JbXShEaWZmZXJlbmNlVHlwZVQgbikgeworICAgIHN0YXRpY19hc3NlcnQoSXNSYW5kb21BY2Nlc3MsCisgICAgICAgICAgICAgICAgICAiU3Vic2NyaXB0aW5nIGlzIG9ubHkgZGVmaW5lZCBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMuIik7CisgICAgcmV0dXJuIFJlZmVyZW5jZVByb3h5KHN0YXRpY19jYXN0PERlcml2ZWRUICo+KHRoaXMpLT5vcGVyYXRvcisobikpOworICB9CisgIFJlZmVyZW5jZVByb3h5IG9wZXJhdG9yW10oRGlmZmVyZW5jZVR5cGVUIG4pIGNvbnN0IHsKKyAgICBzdGF0aWNfYXNzZXJ0KElzUmFuZG9tQWNjZXNzLAorICAgICAgICAgICAgICAgICAgIlN1YnNjcmlwdGluZyBpcyBvbmx5IGRlZmluZWQgZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLiIpOworICAgIHJldHVybiBSZWZlcmVuY2VQcm94eShzdGF0aWNfY2FzdDxjb25zdCBEZXJpdmVkVCAqPih0aGlzKS0+b3BlcmF0b3IrKG4pKTsKKyAgfQorfTsKKworLy8vIFxicmllZiBDUlRQIGJhc2UgY2xhc3MgZm9yIGFkYXB0aW5nIGFuIGl0ZXJhdG9yIHRvIGEgZGlmZmVyZW50IHR5cGUuCisvLy8KKy8vLyBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRocm91Z2ggQ1JUUCB0byBhZGFwdCBvbmUgaXRlcmF0b3IgaW50byBhbm90aGVyLgorLy8vIFR5cGljYWxseSB0aGlzIGlzIGRvbmUgdGhyb3VnaCBwcm92aWRpbmcgaW4gdGhlIGRlcml2ZWQgY2xhc3MgYSBjdXN0b20gXGMKKy8vLyBvcGVyYXRvciogaW1wbGVtZW50YXRpb24uIE90aGVyIG1ldGhvZHMgY2FuIGJlIG92ZXJyaWRkZW4gYXMgd2VsbC4KK3RlbXBsYXRlIDwKKyAgICB0eXBlbmFtZSBEZXJpdmVkVCwgdHlwZW5hbWUgV3JhcHBlZEl0ZXJhdG9yVCwKKyAgICB0eXBlbmFtZSBJdGVyYXRvckNhdGVnb3J5VCA9CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPFdyYXBwZWRJdGVyYXRvclQ+OjppdGVyYXRvcl9jYXRlZ29yeSwKKyAgICB0eXBlbmFtZSBUID0gdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8V3JhcHBlZEl0ZXJhdG9yVD46OnZhbHVlX3R5cGUsCisgICAgdHlwZW5hbWUgRGlmZmVyZW5jZVR5cGVUID0KKyAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8V3JhcHBlZEl0ZXJhdG9yVD46OmRpZmZlcmVuY2VfdHlwZSwKKyAgICB0eXBlbmFtZSBQb2ludGVyVCA9IHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8CisgICAgICAgIHN0ZDo6aXNfc2FtZTxULCB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcmFwcGVkSXRlcmF0b3JUPjo6dmFsdWVfdHlwZT46OnZhbHVlLAorICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxXcmFwcGVkSXRlcmF0b3JUPjo6cG9pbnRlciwgVCAqPjo6dHlwZSwKKyAgICB0eXBlbmFtZSBSZWZlcmVuY2VUID0gdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDwKKyAgICAgICAgc3RkOjppc19zYW1lPFQsIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyYXBwZWRJdGVyYXRvclQ+Ojp2YWx1ZV90eXBlPjo6dmFsdWUsCisgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPFdyYXBwZWRJdGVyYXRvclQ+OjpyZWZlcmVuY2UsIFQgJj46OnR5cGUsCisgICAgLy8gRG9uJ3QgcHJvdmlkZSB0aGVzZSwgdGhleSBhcmUgbW9zdGx5IHRvIGFjdCBhcyBhbGlhc2VzIGJlbG93LgorICAgIHR5cGVuYW1lIFdyYXBwZWRUcmFpdHNUID0gc3RkOjppdGVyYXRvcl90cmFpdHM8V3JhcHBlZEl0ZXJhdG9yVD4+CitjbGFzcyBpdGVyYXRvcl9hZGFwdG9yX2Jhc2UKKyAgICA6IHB1YmxpYyBpdGVyYXRvcl9mYWNhZGVfYmFzZTxEZXJpdmVkVCwgSXRlcmF0b3JDYXRlZ29yeVQsIFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlmZmVyZW5jZVR5cGVULCBQb2ludGVyVCwgUmVmZXJlbmNlVD4geworICB1c2luZyBCYXNlVCA9IHR5cGVuYW1lIGl0ZXJhdG9yX2FkYXB0b3JfYmFzZTo6aXRlcmF0b3JfZmFjYWRlX2Jhc2U7CisKK3Byb3RlY3RlZDoKKyAgV3JhcHBlZEl0ZXJhdG9yVCBJOworCisgIGl0ZXJhdG9yX2FkYXB0b3JfYmFzZSgpID0gZGVmYXVsdDsKKworICBleHBsaWNpdCBpdGVyYXRvcl9hZGFwdG9yX2Jhc2UoV3JhcHBlZEl0ZXJhdG9yVCB1KSA6IEkoc3RkOjptb3ZlKHUpKSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Jhc2Vfb2Y8aXRlcmF0b3JfYWRhcHRvcl9iYXNlLCBEZXJpdmVkVD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIk11c3QgcGFzcyB0aGUgZGVyaXZlZCB0eXBlIHRvIHRoaXMgdGVtcGxhdGUhIik7CisgIH0KKworICBjb25zdCBXcmFwcGVkSXRlcmF0b3JUICZ3cmFwcGVkKCkgY29uc3QgeyByZXR1cm4gSTsgfQorCitwdWJsaWM6CisgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IERpZmZlcmVuY2VUeXBlVDsKKworICBEZXJpdmVkVCAmb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgbikgeworICAgIHN0YXRpY19hc3NlcnQoCisgICAgICAgIEJhc2VUOjpJc1JhbmRvbUFjY2VzcywKKyAgICAgICAgIlRoZSAnKz0nIG9wZXJhdG9yIGlzIG9ubHkgZGVmaW5lZCBmb3IgcmFuZG9tIGFjY2VzcyBpdGVyYXRvcnMuIik7CisgICAgSSArPSBuOworICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8RGVyaXZlZFQgKj4odGhpcyk7CisgIH0KKyAgRGVyaXZlZFQgJm9wZXJhdG9yLT0oZGlmZmVyZW5jZV90eXBlIG4pIHsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICBCYXNlVDo6SXNSYW5kb21BY2Nlc3MsCisgICAgICAgICJUaGUgJy09JyBvcGVyYXRvciBpcyBvbmx5IGRlZmluZWQgZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLiIpOworICAgIEkgLT0gbjsKKyAgICByZXR1cm4gKnN0YXRpY19jYXN0PERlcml2ZWRUICo+KHRoaXMpOworICB9CisgIHVzaW5nIEJhc2VUOjpvcGVyYXRvci07CisgIGRpZmZlcmVuY2VfdHlwZSBvcGVyYXRvci0oY29uc3QgRGVyaXZlZFQgJlJIUykgY29uc3QgeworICAgIHN0YXRpY19hc3NlcnQoCisgICAgICAgIEJhc2VUOjpJc1JhbmRvbUFjY2VzcywKKyAgICAgICAgIlRoZSAnLScgb3BlcmF0b3IgaXMgb25seSBkZWZpbmVkIGZvciByYW5kb20gYWNjZXNzIGl0ZXJhdG9ycy4iKTsKKyAgICByZXR1cm4gSSAtIFJIUy5JOworICB9CisKKyAgLy8gV2UgaGF2ZSB0byBleHBsaWNpdGx5IHByb3ZpZGUgKysgYW5kIC0tIHJhdGhlciB0aGFuIGxldHRpbmcgdGhlIGZhY2FkZQorICAvLyBmb3J3YXJkIHRvICs9IGJlY2F1c2UgV3JhcHBlZEl0ZXJhdG9yVCBtaWdodCBub3Qgc3VwcG9ydCArPS4KKyAgdXNpbmcgQmFzZVQ6Om9wZXJhdG9yKys7CisgIERlcml2ZWRUICZvcGVyYXRvcisrKCkgeworICAgICsrSTsKKyAgICByZXR1cm4gKnN0YXRpY19jYXN0PERlcml2ZWRUICo+KHRoaXMpOworICB9CisgIHVzaW5nIEJhc2VUOjpvcGVyYXRvci0tOworICBEZXJpdmVkVCAmb3BlcmF0b3ItLSgpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICBCYXNlVDo6SXNCaWRpcmVjdGlvbmFsLAorICAgICAgICAiVGhlIGRlY3JlbWVudCBvcGVyYXRvciBpcyBvbmx5IGRlZmluZWQgZm9yIGJpZGlyZWN0aW9uYWwgaXRlcmF0b3JzLiIpOworICAgIC0tSTsKKyAgICByZXR1cm4gKnN0YXRpY19jYXN0PERlcml2ZWRUICo+KHRoaXMpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IERlcml2ZWRUICZSSFMpIGNvbnN0IHsgcmV0dXJuIEkgPT0gUkhTLkk7IH0KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgRGVyaXZlZFQgJlJIUykgY29uc3QgeworICAgIHN0YXRpY19hc3NlcnQoCisgICAgICAgIEJhc2VUOjpJc1JhbmRvbUFjY2VzcywKKyAgICAgICAgIlJlbGF0aW9uYWwgb3BlcmF0b3JzIGFyZSBvbmx5IGRlZmluZWQgZm9yIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3JzLiIpOworICAgIHJldHVybiBJIDwgUkhTLkk7CisgIH0KKworICBSZWZlcmVuY2VUIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpJOyB9Cit9OworCisvLy8gXGJyaWVmIEFuIGl0ZXJhdG9yIHR5cGUgdGhhdCBhbGxvd3MgaXRlcmF0aW5nIG92ZXIgdGhlIHBvaW50ZWVzIHZpYSBzb21lCisvLy8gb3RoZXIgaXRlcmF0b3IuCisvLy8KKy8vLyBUaGUgdHlwaWNhbCB1c2FnZSBvZiB0aGlzIGlzIHRvIGV4cG9zZSBhIHR5cGUgdGhhdCBpdGVyYXRlcyBvdmVyIFRzLCBidXQKKy8vLyB3aGljaCBpcyBpbXBsZW1lbnRlZCB3aXRoIHNvbWUgaXRlcmF0b3Igb3ZlciBUKnM6CisvLy8KKy8vLyBcY29kZQorLy8vICAgdXNpbmcgaXRlcmF0b3IgPSBwb2ludGVlX2l0ZXJhdG9yPFNtYWxsVmVjdG9ySW1wbDxUICo+OjppdGVyYXRvcj47CisvLy8gXGVuZGNvZGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBXcmFwcGVkSXRlcmF0b3JULAorICAgICAgICAgIHR5cGVuYW1lIFQgPSB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8CisgICAgICAgICAgICAgIGRlY2x0eXBlKCoqc3RkOjpkZWNsdmFsPFdyYXBwZWRJdGVyYXRvclQ+KCkpPjo6dHlwZT4KK3N0cnVjdCBwb2ludGVlX2l0ZXJhdG9yCisgICAgOiBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U8CisgICAgICAgICAgcG9pbnRlZV9pdGVyYXRvcjxXcmFwcGVkSXRlcmF0b3JUPiwgV3JhcHBlZEl0ZXJhdG9yVCwKKyAgICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxXcmFwcGVkSXRlcmF0b3JUPjo6aXRlcmF0b3JfY2F0ZWdvcnksCisgICAgICAgICAgVD4geworICBwb2ludGVlX2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgcG9pbnRlZV9pdGVyYXRvcihVICYmdSkKKyAgICAgIDogcG9pbnRlZV9pdGVyYXRvcjo6aXRlcmF0b3JfYWRhcHRvcl9iYXNlKHN0ZDo6Zm9yd2FyZDxVICYmPih1KSkge30KKworICBUICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqKnRoaXMtPkk7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSYW5nZVQsIHR5cGVuYW1lIFdyYXBwZWRJdGVyYXRvclQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY2x0eXBlKHN0ZDo6YmVnaW4oc3RkOjpkZWNsdmFsPFJhbmdlVD4oKSkpPgoraXRlcmF0b3JfcmFuZ2U8cG9pbnRlZV9pdGVyYXRvcjxXcmFwcGVkSXRlcmF0b3JUPj4KK21ha2VfcG9pbnRlZV9yYW5nZShSYW5nZVQgJiZSYW5nZSkgeworICB1c2luZyBQb2ludGVlSXRlcmF0b3JUID0gcG9pbnRlZV9pdGVyYXRvcjxXcmFwcGVkSXRlcmF0b3JUPjsKKyAgcmV0dXJuIG1ha2VfcmFuZ2UoUG9pbnRlZUl0ZXJhdG9yVChzdGQ6OmJlZ2luKHN0ZDo6Zm9yd2FyZDxSYW5nZVQ+KFJhbmdlKSkpLAorICAgICAgICAgICAgICAgICAgICBQb2ludGVlSXRlcmF0b3JUKHN0ZDo6ZW5kKHN0ZDo6Zm9yd2FyZDxSYW5nZVQ+KFJhbmdlKSkpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFdyYXBwZWRJdGVyYXRvclQsCisgICAgICAgICAgdHlwZW5hbWUgVCA9IGRlY2x0eXBlKCYqc3RkOjpkZWNsdmFsPFdyYXBwZWRJdGVyYXRvclQ+KCkpPgorY2xhc3MgcG9pbnRlcl9pdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yX2FkYXB0b3JfYmFzZTxwb2ludGVyX2l0ZXJhdG9yPFdyYXBwZWRJdGVyYXRvclQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcmFwcGVkSXRlcmF0b3JULCBUPiB7CisgIG11dGFibGUgVCBQdHI7CisKK3B1YmxpYzoKKyAgcG9pbnRlcl9pdGVyYXRvcigpID0gZGVmYXVsdDsKKworICBleHBsaWNpdCBwb2ludGVyX2l0ZXJhdG9yKFdyYXBwZWRJdGVyYXRvclQgdSkKKyAgICAgIDogcG9pbnRlcl9pdGVyYXRvcjo6aXRlcmF0b3JfYWRhcHRvcl9iYXNlKHN0ZDo6bW92ZSh1KSkge30KKworICBUICZvcGVyYXRvciooKSB7IHJldHVybiBQdHIgPSAmKnRoaXMtPkk7IH0KKyAgY29uc3QgVCAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gUHRyID0gJip0aGlzLT5JOyB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmFuZ2VULCB0eXBlbmFtZSBXcmFwcGVkSXRlcmF0b3JUID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNsdHlwZShzdGQ6OmJlZ2luKHN0ZDo6ZGVjbHZhbDxSYW5nZVQ+KCkpKT4KK2l0ZXJhdG9yX3JhbmdlPHBvaW50ZXJfaXRlcmF0b3I8V3JhcHBlZEl0ZXJhdG9yVD4+CittYWtlX3BvaW50ZXJfcmFuZ2UoUmFuZ2VUICYmUmFuZ2UpIHsKKyAgdXNpbmcgUG9pbnRlckl0ZXJhdG9yVCA9IHBvaW50ZXJfaXRlcmF0b3I8V3JhcHBlZEl0ZXJhdG9yVD47CisgIHJldHVybiBtYWtlX3JhbmdlKFBvaW50ZXJJdGVyYXRvclQoc3RkOjpiZWdpbihzdGQ6OmZvcndhcmQ8UmFuZ2VUPihSYW5nZSkpKSwKKyAgICAgICAgICAgICAgICAgICAgUG9pbnRlckl0ZXJhdG9yVChzdGQ6OmVuZChzdGQ6OmZvcndhcmQ8UmFuZ2VUPihSYW5nZSkpKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9JVEVSQVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2JmNjE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaApAQCAtMCwwICsxLDY4IEBACisvLz09PS0gaXRlcmF0b3JfcmFuZ2UuaCAtIEEgcmFuZ2UgYWRhcHRvciBmb3IgaXRlcmF0b3JzIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gVGhpcyBwcm92aWRlcyBhIHZlcnkgc2ltcGxlLCBib3JpbmcgYWRhcHRvciBmb3IgYSBiZWdpbiBhbmQgZW5kIGl0ZXJhdG9yCisvLy8gaW50byBhIHJhbmdlIHR5cGUuIFRoaXMgc2hvdWxkIGJlIHVzZWQgdG8gYnVpbGQgcmFuZ2Ugdmlld3MgdGhhdCB3b3JrIHdlbGwKKy8vLyB3aXRoIHJhbmdlIGJhc2VkIGZvciBsb29wcyBhbmQgcmFuZ2UgYmFzZWQgY29uc3RydWN0b3JzLgorLy8vCisvLy8gTm90ZSB0aGF0IGNvZGUgaGVyZSBmb2xsb3dzIG1vcmUgc3RhbmRhcmRzLWJhc2VkIGNvZGluZyBjb252ZW50aW9ucyBhcyBpdAorLy8vIGlzIG1pcnJvcmluZyBwcm9wb3NlZCBpbnRlcmZhY2VzIGZvciBzdGFuZGFyZGl6YXRpb24uCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfSVRFUkFUT1JfUkFOR0VfSAorI2RlZmluZSBMTFZNX0FEVF9JVEVSQVRPUl9SQU5HRV9ICisKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBcYnJpZWYgQSByYW5nZSBhZGFwdG9yIGZvciBhIHBhaXIgb2YgaXRlcmF0b3JzLgorLy8vCisvLy8gVGhpcyBqdXN0IHdyYXBzIHR3byBpdGVyYXRvcnMgaW50byBhIHJhbmdlLWNvbXBhdGlibGUgaW50ZXJmYWNlLiBOb3RoaW5nCisvLy8gZmFuY3kgYXQgYWxsLgordGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yVD4KK2NsYXNzIGl0ZXJhdG9yX3JhbmdlIHsKKyAgSXRlcmF0b3JUIGJlZ2luX2l0ZXJhdG9yLCBlbmRfaXRlcmF0b3I7CisKK3B1YmxpYzoKKyAgLy9UT0RPOiBBZGQgU0ZJTkFFIHRvIHRlc3QgdGhhdCB0aGUgQ29udGFpbmVyJ3MgaXRlcmF0b3JzIG1hdGNoIHRoZSByYW5nZSdzCisgIC8vICAgICAgaXRlcmF0b3JzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgorICBpdGVyYXRvcl9yYW5nZShDb250YWluZXIgJiZjKQorICAvL1RPRE86IENvbnNpZGVyIEFETC9ub24tbWVtYmVyIGJlZ2luL2VuZCBjYWxscy4KKyAgICAgIDogYmVnaW5faXRlcmF0b3IoYy5iZWdpbigpKSwgZW5kX2l0ZXJhdG9yKGMuZW5kKCkpIHt9CisgIGl0ZXJhdG9yX3JhbmdlKEl0ZXJhdG9yVCBiZWdpbl9pdGVyYXRvciwgSXRlcmF0b3JUIGVuZF9pdGVyYXRvcikKKyAgICAgIDogYmVnaW5faXRlcmF0b3Ioc3RkOjptb3ZlKGJlZ2luX2l0ZXJhdG9yKSksCisgICAgICAgIGVuZF9pdGVyYXRvcihzdGQ6Om1vdmUoZW5kX2l0ZXJhdG9yKSkge30KKworICBJdGVyYXRvclQgYmVnaW4oKSBjb25zdCB7IHJldHVybiBiZWdpbl9pdGVyYXRvcjsgfQorICBJdGVyYXRvclQgZW5kKCkgY29uc3QgeyByZXR1cm4gZW5kX2l0ZXJhdG9yOyB9Cit9OworCisvLy8gXGJyaWVmIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBpdGVyYXRpbmcgb3ZlciBzdWItcmFuZ2VzLgorLy8vCisvLy8gVGhpcyBwcm92aWRlcyBhIGJpdCBvZiBzeW50YWN0aWMgc3VnYXIgdG8gbWFrZSB1c2luZyBzdWItcmFuZ2VzCisvLy8gaW4gZm9yIGxvb3BzIGEgYml0IGVhc2llci4gQW5hbG9nb3VzIHRvIHN0ZDo6bWFrZV9wYWlyKCkuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gaXRlcmF0b3JfcmFuZ2U8VD4gbWFrZV9yYW5nZShUIHgsIFQgeSkgeworICByZXR1cm4gaXRlcmF0b3JfcmFuZ2U8VD4oc3RkOjptb3ZlKHgpLCBzdGQ6Om1vdmUoeSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gaXRlcmF0b3JfcmFuZ2U8VD4gbWFrZV9yYW5nZShzdGQ6OnBhaXI8VCwgVD4gcCkgeworICByZXR1cm4gaXRlcmF0b3JfcmFuZ2U8VD4oc3RkOjptb3ZlKHAuZmlyc3QpLCBzdGQ6Om1vdmUocC5zZWNvbmQpKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2l0ZXJhdG9yX3JhbmdlPGRlY2x0eXBlKGJlZ2luKHN0ZDo6ZGVjbHZhbDxUPigpKSk+IGRyb3BfYmVnaW4oVCAmJnQsIGludCBuKSB7CisgIHJldHVybiBtYWtlX3JhbmdlKHN0ZDo6bmV4dChiZWdpbih0KSwgbiksIGVuZCh0KSk7Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvc2ltcGxlX2lsaXN0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FEVC9zaW1wbGVfaWxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40Yzc1OThhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BRFQvc2ltcGxlX2lsaXN0LmgKQEAgLTAsMCArMSwzMTUgQEAKKy8vPT09LSBsbHZtL0FEVC9zaW1wbGVfaWxpc3QuaCAtIFNpbXBsZSBJbnRydXNpdmUgTGlzdCAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BRFRfU0lNUExFX0lMSVNUX0gKKyNkZWZpbmUgTExWTV9BRFRfU0lNUExFX0lMSVNUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X2Jhc2UuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdF9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdF9ub2RlX29wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQSBzaW1wbGUgaW50cnVzaXZlIGxpc3QgaW1wbGVtZW50YXRpb24uCisvLy8KKy8vLyBUaGlzIGlzIGEgc2ltcGxlIGludHJ1c2l2ZSBsaXN0IGZvciBhIFxjIFQgdGhhdCBpbmhlcml0cyBmcm9tIFxjCisvLy8gaWxpc3Rfbm9kZTxUPi4gIFRoZSBsaXN0IG5ldmVyIHRha2VzIG93bmVyc2hpcCBvZiBhbnl0aGluZyBpbnNlcnRlZCBpbiBpdC4KKy8vLworLy8vIFVubGlrZSBcYSBpcGxpc3Q8VD4gYW5kIFxhIGlsaXN0PFQ+LCBcYSBzaW1wbGVfaWxpc3Q8VD4gbmV2ZXIgYWxsb2NhdGVzIG9yCisvLy8gZGVsZXRlcyB2YWx1ZXMsIGFuZCBoYXMgbm8gY2FsbGJhY2sgdHJhaXRzLgorLy8vCisvLy8gVGhlIEFQSSBmb3IgYWRkaW5nIG5vZGVzIGluY2x1ZGUgXGEgcHVzaF9mcm9udCgpLCBcYSBwdXNoX2JhY2soKSwgYW5kIFxhCisvLy8gaW5zZXJ0KCkuICBUaGVzZSBhbGwgdGFrZSB2YWx1ZXMgYnkgcmVmZXJlbmNlIChub3QgYnkgcG9pbnRlciksIGV4Y2VwdCBmb3IKKy8vLyB0aGUgcmFuZ2UgdmVyc2lvbiBvZiBcYSBpbnNlcnQoKS4KKy8vLworLy8vIFRoZXJlIGFyZSB0aHJlZSBzZXRzIG9mIEFQSSBmb3IgZGlzY2FyZGluZyBub2RlcyBmcm9tIHRoZSBsaXN0OiBcYQorLy8vIHJlbW92ZSgpLCB3aGljaCB0YWtlcyBhIHJlZmVyZW5jZSB0byB0aGUgbm9kZSB0byByZW1vdmUsIFxhIGVyYXNlKCksIHdoaWNoCisvLy8gdGFrZXMgYW4gaXRlcmF0b3Igb3IgaXRlcmF0b3IgcmFuZ2UgYW5kIHJldHVybnMgdGhlIG5leHQgb25lLCBhbmQgXGEKKy8vLyBjbGVhcigpLCB3aGljaCBlbXB0aWVzIG91dCB0aGUgY29udGFpbmVyLiAgQWxsIHRocmVlIGFyZSBjb25zdGFudCB0aW1lCisvLy8gb3BlcmF0aW9ucy4gIE5vbmUgb2YgdGhlc2UgZGVsZXRlcyBhbnkgbm9kZXM7IGluIHBhcnRpY3VsYXIsIGlmIHRoZXJlIGlzIGEKKy8vLyBzaW5nbGUgbm9kZSBpbiB0aGUgbGlzdCwgdGhlbiB0aGVzZSBoYXZlIGlkZW50aWNhbCBzZW1hbnRpY3M6CisvLy8gXGxpIFxjIEwucmVtb3ZlKEwuZnJvbnQoKSk7CisvLy8gXGxpIFxjIEwuZXJhc2UoTC5iZWdpbigpKTsKKy8vLyBcbGkgXGMgTC5jbGVhcigpOworLy8vCisvLy8gQXMgYSBjb252ZW5pZW5jZSBmb3IgY2FsbGVycywgdGhlcmUgYXJlIHBhcmFsbGVsIEFQSXMgdGhhdCB0YWtlIGEgXGMKKy8vLyBEaXNwb3NlciAoc3VjaCBhcyBcYyBzdGQ6OmRlZmF1bHRfZGVsZXRlPFQ+KTogXGEgcmVtb3ZlQW5kRGlzcG9zZSgpLCBcYQorLy8vIGVyYXNlQW5kRGlzcG9zZSgpLCBhbmQgXGEgY2xlYXJBbmREaXNwb3NlKCkuICBUaGVzZSBoYXZlIGRpZmZlcmVudCBuYW1lcworLy8vIGJlY2F1c2UgdGhlIGV4dHJhIHNlbWFudGljIGlzIG90aGVyd2lzZSBub24tb2J2aW91cy4gIFRoZXkgYXJlIGVxdWl2YWxlbnQKKy8vLyB0byBjYWxsaW5nIFxhIHN0ZDo6Zm9yX2VhY2goKSBvbiB0aGUgcmFuZ2UgdG8gYmUgZGlzY2FyZGVkLgorLy8vCisvLy8gVGhlIGN1cnJlbnRseSBhdmFpbGFibGUgXHAgT3B0aW9ucyBjdXN0b21pemUgdGhlIG5vZGVzIGluIHRoZSBsaXN0LiAgVGhlCisvLy8gc2FtZSBvcHRpb25zIG11c3QgYmUgc3BlY2lmaWVkIGluIHRoZSBcYSBpbGlzdF9ub2RlIGluc3RhbnRhdGlvbiBmb3IKKy8vLyBjb21wYXRpYmlsaXR5IChhbHRob3VnaCB0aGUgb3JkZXIgaXMgaXJyZWxldmFudCkuCisvLy8gXGxpIFVzZSBcYSBpbGlzdF90YWcgdG8gZGVzaWduYXRlIHdoaWNoIGlsaXN0X25vZGUgZm9yIGEgZ2l2ZW4gXHAgVCB0aGlzCisvLy8gbGlzdCBzaG91bGQgdXNlLiAgVGhpcyBpcyB1c2VmdWwgaWYgYSB0eXBlIFxwIFQgaXMgcGFydCBvZiBtdWx0aXBsZSwKKy8vLyBpbmRlcGVuZGVudCBsaXN0cyBzaW11bHRhbmVvdXNseS4KKy8vLyBcbGkgVXNlIFxhIGlsaXN0X3NlbnRpbmVsX3RyYWNraW5nIHRvIGFsd2F5cyAob3IgbmV2ZXIpIHRyYWNrIHdoZXRoZXIgYQorLy8vIG5vZGUgaXMgYSBzZW50aW5lbC4gIFNwZWNpZnlpbmcgXGMgdHJ1ZSBlbmFibGVzIHRoZSBcYQorLy8vIGlsaXN0X25vZGU6OmlzU2VudGluZWwoKSBBUEkuICBVbmxpa2UgXGEgaWxpc3Rfbm9kZTo6aXNLbm93blNlbnRpbmVsKCksCisvLy8gd2hpY2ggaXMgb25seSBhcHByb3ByaWF0ZSBmb3IgYXNzZXJ0aW9ucywgXGEgaWxpc3Rfbm9kZTo6aXNTZW50aW5lbCgpIGlzCisvLy8gYXBwcm9wcmlhdGUgZm9yIHJlYWwgbG9naWMuCisvLy8KKy8vLyBIZXJlIGFyZSBleGFtcGxlcyBvZiBccCBPcHRpb25zIHVzYWdlOgorLy8vIFxsaSBcYyBzaW1wbGVfaWxpc3Q8VD4gZ2l2ZXMgdGhlIGRlZmF1bHRzLiAgXGxpIFxjCisvLy8gc2ltcGxlX2lsaXN0PFQsaWxpc3Rfc2VudGluZWxfdHJhY2tpbmc8dHJ1ZT4+IGVuYWJsZXMgdGhlIFxhCisvLy8gaWxpc3Rfbm9kZTo6aXNTZW50aW5lbCgpIEFQSS4KKy8vLyBcbGkgXGMgc2ltcGxlX2lsaXN0PFQsaWxpc3RfdGFnPEE+LGlsaXN0X3NlbnRpbmVsX3RyYWNraW5nPGZhbHNlPj4KKy8vLyBzcGVjaWZpZXMgYSB0YWcgb2YgQSBhbmQgdGhhdCB0cmFja2luZyBzaG91bGQgYmUgb2ZmIChldmVuIHdoZW4KKy8vLyBMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTIGFyZSBlbmFibGVkKS4KKy8vLyBcbGkgXGMgc2ltcGxlX2lsaXN0PFQsaWxpc3Rfc2VudGluZWxfdHJhY2tpbmc8ZmFsc2U+LGlsaXN0X3RhZzxBPj4gaXMKKy8vLyBlcXVpdmFsZW50IHRvIHRoZSBsYXN0LgorLy8vCisvLy8gU2VlIFxhIGlzX3ZhbGlkX29wdGlvbiBmb3Igc3RlcHMgb24gYWRkaW5nIGEgbmV3IG9wdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBjbGFzcy4uLiBPcHRpb25zPgorY2xhc3Mgc2ltcGxlX2lsaXN0CisgICAgOiBpbGlzdF9kZXRhaWw6OmNvbXB1dGVfbm9kZV9vcHRpb25zPFQsIE9wdGlvbnMuLi4+Ojp0eXBlOjpsaXN0X2Jhc2VfdHlwZSwKKyAgICAgIGlsaXN0X2RldGFpbDo6U3BlY2lmaWNOb2RlQWNjZXNzPAorICAgICAgICAgIHR5cGVuYW1lIGlsaXN0X2RldGFpbDo6Y29tcHV0ZV9ub2RlX29wdGlvbnM8VCwgT3B0aW9ucy4uLj46OnR5cGU+IHsKKyAgc3RhdGljX2Fzc2VydChpbGlzdF9kZXRhaWw6OmNoZWNrX29wdGlvbnM8T3B0aW9ucy4uLj46OnZhbHVlLAorICAgICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgbm9kZSBvcHRpb24hIik7CisgIHVzaW5nIE9wdGlvbnNUID0KKyAgICAgIHR5cGVuYW1lIGlsaXN0X2RldGFpbDo6Y29tcHV0ZV9ub2RlX29wdGlvbnM8VCwgT3B0aW9ucy4uLj46OnR5cGU7CisgIHVzaW5nIGxpc3RfYmFzZV90eXBlID0gdHlwZW5hbWUgT3B0aW9uc1Q6Omxpc3RfYmFzZV90eXBlOworICBpbGlzdF9zZW50aW5lbDxPcHRpb25zVD4gU2VudGluZWw7CisKK3B1YmxpYzoKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIE9wdGlvbnNUOjp2YWx1ZV90eXBlOworICB1c2luZyBwb2ludGVyID0gdHlwZW5hbWUgT3B0aW9uc1Q6OnBvaW50ZXI7CisgIHVzaW5nIHJlZmVyZW5jZSA9IHR5cGVuYW1lIE9wdGlvbnNUOjpyZWZlcmVuY2U7CisgIHVzaW5nIGNvbnN0X3BvaW50ZXIgPSB0eXBlbmFtZSBPcHRpb25zVDo6Y29uc3RfcG9pbnRlcjsKKyAgdXNpbmcgY29uc3RfcmVmZXJlbmNlID0gdHlwZW5hbWUgT3B0aW9uc1Q6OmNvbnN0X3JlZmVyZW5jZTsKKyAgdXNpbmcgaXRlcmF0b3IgPSBpbGlzdF9pdGVyYXRvcjxPcHRpb25zVCwgZmFsc2UsIGZhbHNlPjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBpbGlzdF9pdGVyYXRvcjxPcHRpb25zVCwgZmFsc2UsIHRydWU+OworICB1c2luZyByZXZlcnNlX2l0ZXJhdG9yID0gaWxpc3RfaXRlcmF0b3I8T3B0aW9uc1QsIHRydWUsIGZhbHNlPjsKKyAgdXNpbmcgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciA9IGlsaXN0X2l0ZXJhdG9yPE9wdGlvbnNULCB0cnVlLCB0cnVlPjsKKyAgdXNpbmcgc2l6ZV90eXBlID0gc2l6ZV90OworICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSBwdHJkaWZmX3Q7CisKKyAgc2ltcGxlX2lsaXN0KCkgPSBkZWZhdWx0OworICB+c2ltcGxlX2lsaXN0KCkgPSBkZWZhdWx0OworCisgIC8vIE5vIGNvcHkgY29uc3RydWN0b3JzLgorICBzaW1wbGVfaWxpc3QoY29uc3Qgc2ltcGxlX2lsaXN0ICYpID0gZGVsZXRlOworICBzaW1wbGVfaWxpc3QgJm9wZXJhdG9yPShjb25zdCBzaW1wbGVfaWxpc3QgJikgPSBkZWxldGU7CisKKyAgLy8gTW92ZSBjb25zdHJ1Y3RvcnMuCisgIHNpbXBsZV9pbGlzdChzaW1wbGVfaWxpc3QgJiZYKSB7IHNwbGljZShlbmQoKSwgWCk7IH0KKyAgc2ltcGxlX2lsaXN0ICZvcGVyYXRvcj0oc2ltcGxlX2lsaXN0ICYmWCkgeworICAgIGNsZWFyKCk7CisgICAgc3BsaWNlKGVuZCgpLCBYKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuICsraXRlcmF0b3IoU2VudGluZWwpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gKytjb25zdF9pdGVyYXRvcihTZW50aW5lbCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gaXRlcmF0b3IoU2VudGluZWwpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKFNlbnRpbmVsKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuICsrcmV2ZXJzZV9pdGVyYXRvcihTZW50aW5lbCk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuICsrY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihTZW50aW5lbCk7CisgIH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihTZW50aW5lbCk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKFNlbnRpbmVsKTsKKyAgfQorCisgIC8vLyBDaGVjayBpZiB0aGUgbGlzdCBpcyBlbXB0eSBpbiBjb25zdGFudCB0aW1lLgorICBMTFZNX05PRElTQ0FSRCBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gU2VudGluZWwuZW1wdHkoKTsgfQorCisgIC8vLyBDYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIGxpc3QgaW4gbGluZWFyIHRpbWUuCisgIExMVk1fTk9ESVNDQVJEIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OmRpc3RhbmNlKGJlZ2luKCksIGVuZCgpKTsKKyAgfQorCisgIHJlZmVyZW5jZSBmcm9udCgpIHsgcmV0dXJuICpiZWdpbigpOyB9CisgIGNvbnN0X3JlZmVyZW5jZSBmcm9udCgpIGNvbnN0IHsgcmV0dXJuICpiZWdpbigpOyB9CisgIHJlZmVyZW5jZSBiYWNrKCkgeyByZXR1cm4gKnJiZWdpbigpOyB9CisgIGNvbnN0X3JlZmVyZW5jZSBiYWNrKCkgY29uc3QgeyByZXR1cm4gKnJiZWdpbigpOyB9CisKKyAgLy8vIEluc2VydCBhIG5vZGUgYXQgdGhlIGZyb250OyBuZXZlciBjb3BpZXMuCisgIHZvaWQgcHVzaF9mcm9udChyZWZlcmVuY2UgTm9kZSkgeyBpbnNlcnQoYmVnaW4oKSwgTm9kZSk7IH0KKworICAvLy8gSW5zZXJ0IGEgbm9kZSBhdCB0aGUgYmFjazsgbmV2ZXIgY29waWVzLgorICB2b2lkIHB1c2hfYmFjayhyZWZlcmVuY2UgTm9kZSkgeyBpbnNlcnQoZW5kKCksIE5vZGUpOyB9CisKKyAgLy8vIFJlbW92ZSB0aGUgbm9kZSBhdCB0aGUgZnJvbnQ7IG5ldmVyIGRlbGV0ZXMuCisgIHZvaWQgcG9wX2Zyb250KCkgeyBlcmFzZShiZWdpbigpKTsgfQorCisgIC8vLyBSZW1vdmUgdGhlIG5vZGUgYXQgdGhlIGJhY2s7IG5ldmVyIGRlbGV0ZXMuCisgIHZvaWQgcG9wX2JhY2soKSB7IGVyYXNlKC0tZW5kKCkpOyB9CisKKyAgLy8vIFN3YXAgd2l0aCBhbm90aGVyIGxpc3QgaW4gcGxhY2UgdXNpbmcgc3RkOjpzd2FwLgorICB2b2lkIHN3YXAoc2ltcGxlX2lsaXN0ICZYKSB7IHN0ZDo6c3dhcCgqdGhpcywgWCk7IH0KKworICAvLy8gSW5zZXJ0IGEgbm9kZSBieSByZWZlcmVuY2U7IG5ldmVyIGNvcGllcy4KKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIEksIHJlZmVyZW5jZSBOb2RlKSB7CisgICAgbGlzdF9iYXNlX3R5cGU6Omluc2VydEJlZm9yZSgqSS5nZXROb2RlUHRyKCksICp0aGlzLT5nZXROb2RlUHRyKCZOb2RlKSk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKCZOb2RlKTsKKyAgfQorCisgIC8vLyBJbnNlcnQgYSByYW5nZSBvZiBub2RlczsgbmV2ZXIgY29waWVzLgorICB0ZW1wbGF0ZSA8Y2xhc3MgSXRlcmF0b3I+CisgIHZvaWQgaW5zZXJ0KGl0ZXJhdG9yIEksIEl0ZXJhdG9yIEZpcnN0LCBJdGVyYXRvciBMYXN0KSB7CisgICAgZm9yICg7IEZpcnN0ICE9IExhc3Q7ICsrRmlyc3QpCisgICAgICBpbnNlcnQoSSwgKkZpcnN0KTsKKyAgfQorCisgIC8vLyBDbG9uZSBhbm90aGVyIGxpc3QuCisgIHRlbXBsYXRlIDxjbGFzcyBDbG9uZXIsIGNsYXNzIERpc3Bvc2VyPgorICB2b2lkIGNsb25lRnJvbShjb25zdCBzaW1wbGVfaWxpc3QgJkwyLCBDbG9uZXIgY2xvbmUsIERpc3Bvc2VyIGRpc3Bvc2UpIHsKKyAgICBjbGVhckFuZERpc3Bvc2UoZGlzcG9zZSk7CisgICAgZm9yIChjb25zdF9yZWZlcmVuY2UgViA6IEwyKQorICAgICAgcHVzaF9iYWNrKCpjbG9uZShWKSk7CisgIH0KKworICAvLy8gUmVtb3ZlIGEgbm9kZSBieSByZWZlcmVuY2U7IG5ldmVyIGRlbGV0ZXMuCisgIC8vLworICAvLy8gXHNlZSBcYSBlcmFzZSgpIGZvciByZW1vdmluZyBieSBpdGVyYXRvci4KKyAgLy8vIFxzZWUgXGEgcmVtb3ZlQW5kRGlzcG9zZSgpIGlmIHRoZSBub2RlIHNob3VsZCBiZSBkZWxldGVkLgorICB2b2lkIHJlbW92ZShyZWZlcmVuY2UgTikgeyBsaXN0X2Jhc2VfdHlwZTo6cmVtb3ZlKCp0aGlzLT5nZXROb2RlUHRyKCZOKSk7IH0KKworICAvLy8gUmVtb3ZlIGEgbm9kZSBieSByZWZlcmVuY2UgYW5kIGRpc3Bvc2Ugb2YgaXQuCisgIHRlbXBsYXRlIDxjbGFzcyBEaXNwb3Nlcj4KKyAgdm9pZCByZW1vdmVBbmREaXNwb3NlKHJlZmVyZW5jZSBOLCBEaXNwb3NlciBkaXNwb3NlKSB7CisgICAgcmVtb3ZlKE4pOworICAgIGRpc3Bvc2UoJk4pOworICB9CisKKyAgLy8vIFJlbW92ZSBhIG5vZGUgYnkgaXRlcmF0b3I7IG5ldmVyIGRlbGV0ZXMuCisgIC8vLworICAvLy8gXHNlZSBcYSByZW1vdmUoKSBmb3IgcmVtb3ZpbmcgYnkgcmVmZXJlbmNlLgorICAvLy8gXHNlZSBcYSBlcmFzZUFuZERpc3Bvc2UoKSBpdCB0aGUgbm9kZSBzaG91bGQgYmUgZGVsZXRlZC4KKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgSSkgeworICAgIGFzc2VydChJICE9IGVuZCgpICYmICJDYW5ub3QgcmVtb3ZlIGVuZCBvZiBsaXN0ISIpOworICAgIHJlbW92ZSgqSSsrKTsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIC8vLyBSZW1vdmUgYSByYW5nZSBvZiBub2RlczsgbmV2ZXIgZGVsZXRlcy4KKyAgLy8vCisgIC8vLyBcc2VlIFxhIGVyYXNlQW5kRGlzcG9zZSgpIGlmIHRoZSBub2RlcyBzaG91bGQgYmUgZGVsZXRlZC4KKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgRmlyc3QsIGl0ZXJhdG9yIExhc3QpIHsKKyAgICBsaXN0X2Jhc2VfdHlwZTo6cmVtb3ZlUmFuZ2UoKkZpcnN0LmdldE5vZGVQdHIoKSwgKkxhc3QuZ2V0Tm9kZVB0cigpKTsKKyAgICByZXR1cm4gTGFzdDsKKyAgfQorCisgIC8vLyBSZW1vdmUgYSBub2RlIGJ5IGl0ZXJhdG9yIGFuZCBkaXNwb3NlIG9mIGl0LgorICB0ZW1wbGF0ZSA8Y2xhc3MgRGlzcG9zZXI+CisgIGl0ZXJhdG9yIGVyYXNlQW5kRGlzcG9zZShpdGVyYXRvciBJLCBEaXNwb3NlciBkaXNwb3NlKSB7CisgICAgYXV0byBOZXh0ID0gc3RkOjpuZXh0KEkpOworICAgIGVyYXNlKEkpOworICAgIGRpc3Bvc2UoJipJKTsKKyAgICByZXR1cm4gTmV4dDsKKyAgfQorCisgIC8vLyBSZW1vdmUgYSByYW5nZSBvZiBub2RlcyBhbmQgZGlzcG9zZSBvZiB0aGVtLgorICB0ZW1wbGF0ZSA8Y2xhc3MgRGlzcG9zZXI+CisgIGl0ZXJhdG9yIGVyYXNlQW5kRGlzcG9zZShpdGVyYXRvciBGaXJzdCwgaXRlcmF0b3IgTGFzdCwgRGlzcG9zZXIgZGlzcG9zZSkgeworICAgIHdoaWxlIChGaXJzdCAhPSBMYXN0KQorICAgICAgRmlyc3QgPSBlcmFzZUFuZERpc3Bvc2UoRmlyc3QsIGRpc3Bvc2UpOworICAgIHJldHVybiBMYXN0OworICB9CisKKyAgLy8vIENsZWFyIHRoZSBsaXN0OyBuZXZlciBkZWxldGVzLgorICAvLy8KKyAgLy8vIFxzZWUgXGEgY2xlYXJBbmREaXNwb3NlKCkgaWYgdGhlIG5vZGVzIHNob3VsZCBiZSBkZWxldGVkLgorICB2b2lkIGNsZWFyKCkgeyBTZW50aW5lbC5yZXNldCgpOyB9CisKKyAgLy8vIENsZWFyIHRoZSBsaXN0IGFuZCBkaXNwb3NlIG9mIHRoZSBub2Rlcy4KKyAgdGVtcGxhdGUgPGNsYXNzIERpc3Bvc2VyPiB2b2lkIGNsZWFyQW5kRGlzcG9zZShEaXNwb3NlciBkaXNwb3NlKSB7CisgICAgZXJhc2VBbmREaXNwb3NlKGJlZ2luKCksIGVuZCgpLCBkaXNwb3NlKTsKKyAgfQorCisgIC8vLyBTcGxpY2UgaW4gYW5vdGhlciBsaXN0LgorICB2b2lkIHNwbGljZShpdGVyYXRvciBJLCBzaW1wbGVfaWxpc3QgJkwyKSB7CisgICAgc3BsaWNlKEksIEwyLCBMMi5iZWdpbigpLCBMMi5lbmQoKSk7CisgIH0KKworICAvLy8gU3BsaWNlIGluIGEgbm9kZSBmcm9tIGFub3RoZXIgbGlzdC4KKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgSSwgc2ltcGxlX2lsaXN0ICZMMiwgaXRlcmF0b3IgTm9kZSkgeworICAgIHNwbGljZShJLCBMMiwgTm9kZSwgc3RkOjpuZXh0KE5vZGUpKTsKKyAgfQorCisgIC8vLyBTcGxpY2UgaW4gYSByYW5nZSBvZiBub2RlcyBmcm9tIGFub3RoZXIgbGlzdC4KKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgSSwgc2ltcGxlX2lsaXN0ICYsIGl0ZXJhdG9yIEZpcnN0LCBpdGVyYXRvciBMYXN0KSB7CisgICAgbGlzdF9iYXNlX3R5cGU6OnRyYW5zZmVyQmVmb3JlKCpJLmdldE5vZGVQdHIoKSwgKkZpcnN0LmdldE5vZGVQdHIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkxhc3QuZ2V0Tm9kZVB0cigpKTsKKyAgfQorCisgIC8vLyBNZXJnZSBpbiBhbm90aGVyIGxpc3QuCisgIC8vLworICAvLy8gXHByZSBcYyB0aGlzIGFuZCBccCBSSFMgYXJlIHNvcnRlZC4KKyAgLy8vQHsKKyAgdm9pZCBtZXJnZShzaW1wbGVfaWxpc3QgJlJIUykgeyBtZXJnZShSSFMsIHN0ZDo6bGVzczxUPigpKTsgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgQ29tcGFyZT4gdm9pZCBtZXJnZShzaW1wbGVfaWxpc3QgJlJIUywgQ29tcGFyZSBjb21wKTsKKyAgLy8vQH0KKworICAvLy8gU29ydCB0aGUgbGlzdC4KKyAgLy8vQHsKKyAgdm9pZCBzb3J0KCkgeyBzb3J0KHN0ZDo6bGVzczxUPigpKTsgfQorICB0ZW1wbGF0ZSA8Y2xhc3MgQ29tcGFyZT4gdm9pZCBzb3J0KENvbXBhcmUgY29tcCk7CisgIC8vL0B9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MuLi4gT3B0aW9ucz4KK3RlbXBsYXRlIDxjbGFzcyBDb21wYXJlPgordm9pZCBzaW1wbGVfaWxpc3Q8VCwgT3B0aW9ucy4uLj46Om1lcmdlKHNpbXBsZV9pbGlzdCAmUkhTLCBDb21wYXJlIGNvbXApIHsKKyAgaWYgKHRoaXMgPT0gJlJIUyB8fCBSSFMuZW1wdHkoKSkKKyAgICByZXR1cm47CisgIGl0ZXJhdG9yIExJID0gYmVnaW4oKSwgTEUgPSBlbmQoKTsKKyAgaXRlcmF0b3IgUkkgPSBSSFMuYmVnaW4oKSwgUkUgPSBSSFMuZW5kKCk7CisgIHdoaWxlIChMSSAhPSBMRSkgeworICAgIGlmIChjb21wKCpSSSwgKkxJKSkgeworICAgICAgLy8gVHJhbnNmZXIgYSBydW4gb2YgYXQgbGVhc3Qgc2l6ZSAxIGZyb20gUkhTIHRvIExIUy4KKyAgICAgIGl0ZXJhdG9yIFJ1blN0YXJ0ID0gUkkrKzsKKyAgICAgIFJJID0gc3RkOjpmaW5kX2lmKFJJLCBSRSwgWyZdKHJlZmVyZW5jZSBSVikgeyByZXR1cm4gIWNvbXAoUlYsICpMSSk7IH0pOworICAgICAgc3BsaWNlKExJLCBSSFMsIFJ1blN0YXJ0LCBSSSk7CisgICAgICBpZiAoUkkgPT0gUkUpCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgKytMSTsKKyAgfQorICAvLyBUcmFuc2ZlciB0aGUgcmVtYWluaW5nIFJIUyBub2RlcyBvbmNlIExIUyBpcyBmaW5pc2hlZC4KKyAgc3BsaWNlKExFLCBSSFMsIFJJLCBSRSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBULCBjbGFzcy4uLiBPcHRpb25zPgordGVtcGxhdGUgPGNsYXNzIENvbXBhcmU+Cit2b2lkIHNpbXBsZV9pbGlzdDxULCBPcHRpb25zLi4uPjo6c29ydChDb21wYXJlIGNvbXApIHsKKyAgLy8gVmFjdW91c2x5IHNvcnRlZC4KKyAgaWYgKGVtcHR5KCkgfHwgc3RkOjpuZXh0KGJlZ2luKCkpID09IGVuZCgpKQorICAgIHJldHVybjsKKworICAvLyBTcGxpdCB0aGUgbGlzdCBpbiB0aGUgbWlkZGxlLgorICBpdGVyYXRvciBDZW50ZXIgPSBiZWdpbigpLCBFbmQgPSBiZWdpbigpOworICB3aGlsZSAoRW5kICE9IGVuZCgpICYmICsrRW5kICE9IGVuZCgpKSB7CisgICAgKytDZW50ZXI7CisgICAgKytFbmQ7CisgIH0KKyAgc2ltcGxlX2lsaXN0IFJIUzsKKyAgUkhTLnNwbGljZShSSFMuZW5kKCksICp0aGlzLCBDZW50ZXIsIGVuZCgpKTsKKworICAvLyBTb3J0IHRoZSBzdWJsaXN0cyBhbmQgbWVyZ2UgYmFjayB0b2dldGhlci4KKyAgc29ydChjb21wKTsKKyAgUkhTLnNvcnQoY29tcCk7CisgIG1lcmdlKFJIUywgY29tcCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FEVF9TSU1QTEVfSUxJU1RfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYzRhOTBjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgKQEAgLTAsMCArMSwxMDk2IEBACisvLz09PS0gbGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmggLSBBbGlhcyBBbmFseXNpcyBJbnRlcmZhY2UgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBnZW5lcmljIEFsaWFzQW5hbHlzaXMgaW50ZXJmYWNlLCB3aGljaCBpcyB1c2VkIGFzIHRoZQorLy8gY29tbW9uIGludGVyZmFjZSB1c2VkIGJ5IGFsbCBjbGllbnRzIG9mIGFsaWFzIGFuYWx5c2lzIGluZm9ybWF0aW9uLCBhbmQKKy8vIGltcGxlbWVudGVkIGJ5IGFsbCBhbGlhcyBhbmFseXNpcyBpbXBsZW1lbnRhdGlvbnMuICBNb2QvUmVmIGluZm9ybWF0aW9uIGlzCisvLyBhbHNvIGNhcHR1cmVkIGJ5IHRoaXMgaW50ZXJmYWNlLgorLy8KKy8vIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSBtdXN0IGltcGxlbWVudCB0aGUgdmFyaW91cyB2aXJ0dWFsIG1ldGhvZHMsCisvLyB3aGljaCBhdXRvbWF0aWNhbGx5IHByb3ZpZGVzIGZ1bmN0aW9uYWxpdHkgZm9yIHRoZSBlbnRpcmUgc3VpdGUgb2YgY2xpZW50CisvLyBBUElzLgorLy8KKy8vIFRoaXMgQVBJIGlkZW50aWZpZXMgbWVtb3J5IHJlZ2lvbnMgd2l0aCB0aGUgTWVtb3J5TG9jYXRpb24gY2xhc3MuIFRoZSBwb2ludGVyCisvLyBjb21wb25lbnQgc3BlY2lmaWVzIHRoZSBiYXNlIG1lbW9yeSBhZGRyZXNzIG9mIHRoZSByZWdpb24uIFRoZSBTaXplIHNwZWNpZmllcworLy8gdGhlIG1heGltdW0gc2l6ZSAoaW4gYWRkcmVzcyB1bml0cykgb2YgdGhlIG1lbW9yeSByZWdpb24sIG9yCisvLyBNZW1vcnlMb2NhdGlvbjo6VW5rbm93blNpemUgaWYgdGhlIHNpemUgaXMgbm90IGtub3duLiBUaGUgVEJBQSB0YWcKKy8vIGlkZW50aWZpZXMgdGhlICJ0eXBlIiBvZiB0aGUgbWVtb3J5IHJlZmVyZW5jZTsgc2VlIHRoZQorLy8gVHlwZUJhc2VkQWxpYXNBbmFseXNpcyBjbGFzcyBmb3IgZGV0YWlscy4KKy8vCisvLyBTb21lIG5vbi1vYnZpb3VzIGRldGFpbHMgaW5jbHVkZToKKy8vICAtIFBvaW50ZXJzIHRoYXQgcG9pbnQgdG8gdHdvIGNvbXBsZXRlbHkgZGlmZmVyZW50IG9iamVjdHMgaW4gbWVtb3J5IG5ldmVyCisvLyAgICBhbGlhcywgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhlIFNpemUgY29tcG9uZW50LgorLy8gIC0gTm9BbGlhcyBkb2Vzbid0IGltcGx5IGluZXF1YWwgcG9pbnRlcnMuIFRoZSBtb3N0IG9idmlvdXMgZXhhbXBsZSBvZiB0aGlzCisvLyAgICBpcyB0d28gcG9pbnRlcnMgdG8gY29uc3RhbnQgbWVtb3J5LiBFdmVuIGlmIHRoZXkgYXJlIGVxdWFsLCBjb25zdGFudAorLy8gICAgbWVtb3J5IGlzIG5ldmVyIHN0b3JlZCB0bywgc28gdGhlcmUgd2lsbCBuZXZlciBiZSBhbnkgZGVwZW5kZW5jaWVzLgorLy8gICAgSW4gdGhpcyBhbmQgb3RoZXIgc2l0dWF0aW9ucywgdGhlIHBvaW50ZXJzIG1heSBiZSBib3RoIE5vQWxpYXMgYW5kCisvLyAgICBNdXN0QWxpYXMgYXQgdGhlIHNhbWUgdGltZS4gVGhlIGN1cnJlbnQgQVBJIGNhbiBvbmx5IHJldHVybiBvbmUgcmVzdWx0LAorLy8gICAgdGhvdWdoIHRoaXMgaXMgcmFyZWx5IGEgcHJvYmxlbSBpbiBwcmFjdGljZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfQUxJQVNBTkFMWVNJU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfQUxJQVNBTkFMWVNJU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9Ob25lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTWVtb3J5TG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1RhcmdldExpYnJhcnlJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQW5hbHlzaXNVc2FnZTsKK2NsYXNzIEJhc2ljQUFSZXN1bHQ7CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgRG9taW5hdG9yVHJlZTsKK2NsYXNzIE9yZGVyZWRCYXNpY0Jsb2NrOworY2xhc3MgVmFsdWU7CisKKy8vLyBUaGUgcG9zc2libGUgcmVzdWx0cyBvZiBhbiBhbGlhcyBxdWVyeS4KKy8vLworLy8vIFRoZXNlIHJlc3VsdHMgYXJlIGFsd2F5cyBjb21wdXRlZCBiZXR3ZWVuIHR3byBNZW1vcnlMb2NhdGlvbiBvYmplY3RzIGFzCisvLy8gYSBxdWVyeSB0byBzb21lIGFsaWFzIGFuYWx5c2lzLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoZXNlIGFyZSB1bnNjb3BlZCBlbnVtZXJhdGlvbnMgYmVjYXVzZSB3ZSB3b3VsZCBsaWtlIHRvIHN1cHBvcnQKKy8vLyBpbXBsaWNpdGx5IHRlc3RpbmcgYSByZXN1bHQgZm9yIHRoZSBleGlzdGVuY2Ugb2YgYW55IHBvc3NpYmxlIGFsaWFzaW5nIHdpdGgKKy8vLyBhIGNvbnZlcnNpb24gdG8gYm9vbCwgYnV0IGFuICJlbnVtIGNsYXNzIiBkb2Vzbid0IHN1cHBvcnQgdGhpcy4gVGhlCisvLy8gY2Fub25pY2FsIG5hbWVzIGZyb20gdGhlIGxpdGVyYXR1cmUgYXJlIHN1ZmZpeGVkIGFuZCB1bmlxdWUgYW55d2F5cywgYW5kIHNvCisvLy8gdGhleSBzZXJ2ZSBhcyBnbG9iYWwgY29uc3RhbnRzIGluIExMVk0gZm9yIHRoZXNlIHJlc3VsdHMuCisvLy8KKy8vLyBTZWUgZG9jcy9BbGlhc0FuYWx5c2lzLmh0bWwgZm9yIG1vcmUgaW5mb3JtYXRpb24gb24gdGhlIHNwZWNpZmljIG1lYW5pbmdzCisvLy8gb2YgdGhlc2UgdmFsdWVzLgorZW51bSBBbGlhc1Jlc3VsdCA6IHVpbnQ4X3QgeworICAvLy8gVGhlIHR3byBsb2NhdGlvbnMgZG8gbm90IGFsaWFzIGF0IGFsbC4KKyAgLy8vCisgIC8vLyBUaGlzIHZhbHVlIGlzIGFycmFuZ2VkIHRvIGNvbnZlcnQgdG8gZmFsc2UsIHdoaWxlIGFsbCBvdGhlciB2YWx1ZXMKKyAgLy8vIGNvbnZlcnQgdG8gdHJ1ZS4gVGhpcyBhbGxvd3MgYSBib29sZWFuIGNvbnRleHQgdG8gY29udmVydCB0aGUgcmVzdWx0IHRvCisgIC8vLyBhIGJpbmFyeSBmbGFnIGluZGljYXRpbmcgd2hldGhlciB0aGVyZSBpcyB0aGUgcG9zc2liaWxpdHkgb2YgYWxpYXNpbmcuCisgIE5vQWxpYXMgPSAwLAorICAvLy8gVGhlIHR3byBsb2NhdGlvbnMgbWF5IG9yIG1heSBub3QgYWxpYXMuIFRoaXMgaXMgdGhlIGxlYXN0IHByZWNpc2UgcmVzdWx0LgorICBNYXlBbGlhcywKKyAgLy8vIFRoZSB0d28gbG9jYXRpb25zIGFsaWFzLCBidXQgb25seSBkdWUgdG8gYSBwYXJ0aWFsIG92ZXJsYXAuCisgIFBhcnRpYWxBbGlhcywKKyAgLy8vIFRoZSB0d28gbG9jYXRpb25zIHByZWNpc2VseSBhbGlhcyBlYWNoIG90aGVyLgorICBNdXN0QWxpYXMsCit9OworCisvLy8gRmxhZ3MgaW5kaWNhdGluZyB3aGV0aGVyIGEgbWVtb3J5IGFjY2VzcyBtb2RpZmllcyBvciByZWZlcmVuY2VzIG1lbW9yeS4KKy8vLworLy8vIFRoaXMgaXMgbm8gYWNjZXNzIGF0IGFsbCwgYSBtb2RpZmljYXRpb24sIGEgcmVmZXJlbmNlLCBvciBib3RoCisvLy8gYSBtb2RpZmljYXRpb24gYW5kIGEgcmVmZXJlbmNlLiBUaGVzZSBhcmUgc3BlY2lmaWNhbGx5IHN0cnVjdHVyZWQgc3VjaCB0aGF0CisvLy8gdGhleSBmb3JtIGEgdGhyZWUgYml0IG1hdHJpeCBhbmQgYml0LXRlc3RzIGZvciAnbW9kJyBvciAncmVmJyBvciAnbXVzdCcKKy8vLyB3b3JrIHdpdGggYW55IG9mIHRoZSBwb3NzaWJsZSB2YWx1ZXMuCitlbnVtIGNsYXNzIE1vZFJlZkluZm8gOiB1aW50OF90IHsKKyAgLy8vIE11c3QgaXMgcHJvdmlkZWQgZm9yIGNvbXBsZXRlbmVzcywgYnV0IG5vIHJvdXRpbmVzIHdpbGwgcmV0dXJuIG9ubHkKKyAgLy8vIE11c3QgdG9kYXkuIFNlZSBkZWZpbml0aW9uIG9mIE11c3QgYmVsb3cuCisgIE11c3QgPSAwLAorICAvLy8gVGhlIGFjY2VzcyBtYXkgcmVmZXJlbmNlIHRoZSB2YWx1ZSBzdG9yZWQgaW4gbWVtb3J5LAorICAvLy8gYSBtdXN0QWxpYXMgcmVsYXRpb24gd2FzIGZvdW5kLCBhbmQgbm8gbWF5QWxpYXMgb3IgcGFydGlhbEFsaWFzIGZvdW5kLgorICBNdXN0UmVmID0gMSwKKyAgLy8vIFRoZSBhY2Nlc3MgbWF5IG1vZGlmeSB0aGUgdmFsdWUgc3RvcmVkIGluIG1lbW9yeSwKKyAgLy8vIGEgbXVzdEFsaWFzIHJlbGF0aW9uIHdhcyBmb3VuZCwgYW5kIG5vIG1heUFsaWFzIG9yIHBhcnRpYWxBbGlhcyBmb3VuZC4KKyAgTXVzdE1vZCA9IDIsCisgIC8vLyBUaGUgYWNjZXNzIG1heSByZWZlcmVuY2UsIG1vZGlmeSBvciBib3RoIHRoZSB2YWx1ZSBzdG9yZWQgaW4gbWVtb3J5LAorICAvLy8gYSBtdXN0QWxpYXMgcmVsYXRpb24gd2FzIGZvdW5kLCBhbmQgbm8gbWF5QWxpYXMgb3IgcGFydGlhbEFsaWFzIGZvdW5kLgorICBNdXN0TW9kUmVmID0gTXVzdFJlZiB8IE11c3RNb2QsCisgIC8vLyBUaGUgYWNjZXNzIG5laXRoZXIgcmVmZXJlbmNlcyBub3IgbW9kaWZpZXMgdGhlIHZhbHVlIHN0b3JlZCBpbiBtZW1vcnkuCisgIE5vTW9kUmVmID0gNCwKKyAgLy8vIFRoZSBhY2Nlc3MgbWF5IHJlZmVyZW5jZSB0aGUgdmFsdWUgc3RvcmVkIGluIG1lbW9yeS4KKyAgUmVmID0gTm9Nb2RSZWYgfCBNdXN0UmVmLAorICAvLy8gVGhlIGFjY2VzcyBtYXkgbW9kaWZ5IHRoZSB2YWx1ZSBzdG9yZWQgaW4gbWVtb3J5LgorICBNb2QgPSBOb01vZFJlZiB8IE11c3RNb2QsCisgIC8vLyBUaGUgYWNjZXNzIG1heSByZWZlcmVuY2UgYW5kIG1heSBtb2RpZnkgdGhlIHZhbHVlIHN0b3JlZCBpbiBtZW1vcnkuCisgIE1vZFJlZiA9IFJlZiB8IE1vZCwKKworICAvLy8gQWJvdXQgTXVzdDoKKyAgLy8vIE11c3QgaXMgc2V0IGluIGEgYmVzdCBlZmZvcnQgbWFubmVyLgorICAvLy8gV2UgdXN1YWxseSBkbyBub3QgdHJ5IG91ciBiZXN0IHRvIGluZmVyIE11c3QsIGluc3RlYWQgaXQgaXMgbWVyZWx5CisgIC8vLyBhbm90aGVyIHBpZWNlIG9mICJmcmVlIiBpbmZvcm1hdGlvbiB0aGF0IGlzIHByZXNlbnRlZCB3aGVuIGF2YWlsYWJsZS4KKyAgLy8vIE11c3Qgc2V0IG1lYW5zIHRoZXJlIHdhcyBjZXJ0YWlubHkgYSBNdXN0QWxpYXMgZm91bmQuIEZvciBjYWxscywKKyAgLy8vIHdoZXJlIG11bHRpcGxlIGFyZ3VtZW50cyBhcmUgY2hlY2tlZCAoYXJnbWVtb25seSksIHRoaXMgdHJhbnNsYXRlcyB0bworICAvLy8gb25seSBNdXN0QWxpYXMgb3IgTm9BbGlhcyB3YXMgZm91bmQuCisgIC8vLyBNdXN0IGlzIG5vdCBzZXQgZm9yIFJBUiBhY2Nlc3NlcywgZXZlbiBpZiB0aGUgdHdvIGxvY2F0aW9ucyBtdXN0CisgIC8vLyBhbGlhcy4gVGhlIHJlYXNvbiBpcyB0aGF0IHR3byByZWFkIGFjY2Vzc2VzIHRyYW5zbGF0ZSB0byBhbiBlYXJseSByZXR1cm4KKyAgLy8vIG9mIE5vTW9kUmVmLiBBbiBhZGRpdGlvbmFsIGFsaWFzIGNoZWNrIHRvIHNldCBNdXN0IG1heSBiZQorICAvLy8gZXhwZW5zaXZlLiBPdGhlciBjYXNlcyBtYXkgYWxzbyBub3Qgc2V0IE11c3QoZS5nLiBjYWxsQ2FwdHVyZXNCZWZvcmUpLgorICAvLy8gV2UgcmVmZXIgdG8gTXVzdCBiZWluZyAqc2V0KiB3aGVuIHRoZSBtb3N0IHNpZ25pZmljYW50IGJpdCBpcyAqY2xlYXJlZCouCisgIC8vLyBDb252ZXJzZWx5IHdlICpjbGVhciogTXVzdCBpbmZvcm1hdGlvbiBieSAqc2V0dGluZyogdGhlIE11c3QgYml0IHRvIDEuCit9OworCitMTFZNX05PRElTQ0FSRCBpbmxpbmUgYm9vbCBpc05vTW9kUmVmKGNvbnN0IE1vZFJlZkluZm8gTVJJKSB7CisgIHJldHVybiAoc3RhdGljX2Nhc3Q8aW50PihNUkkpICYgc3RhdGljX2Nhc3Q8aW50PihNb2RSZWZJbmZvOjpNdXN0TW9kUmVmKSkgPT0KKyAgICAgICAgIHN0YXRpY19jYXN0PGludD4oTW9kUmVmSW5mbzo6TXVzdCk7Cit9CitMTFZNX05PRElTQ0FSRCBpbmxpbmUgYm9vbCBpc01vZE9yUmVmU2V0KGNvbnN0IE1vZFJlZkluZm8gTVJJKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KE1SSSkgJiBzdGF0aWNfY2FzdDxpbnQ+KE1vZFJlZkluZm86Ok11c3RNb2RSZWYpOworfQorTExWTV9OT0RJU0NBUkQgaW5saW5lIGJvb2wgaXNNb2RBbmRSZWZTZXQoY29uc3QgTW9kUmVmSW5mbyBNUkkpIHsKKyAgcmV0dXJuIChzdGF0aWNfY2FzdDxpbnQ+KE1SSSkgJiBzdGF0aWNfY2FzdDxpbnQ+KE1vZFJlZkluZm86Ok11c3RNb2RSZWYpKSA9PQorICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihNb2RSZWZJbmZvOjpNdXN0TW9kUmVmKTsKK30KK0xMVk1fTk9ESVNDQVJEIGlubGluZSBib29sIGlzTW9kU2V0KGNvbnN0IE1vZFJlZkluZm8gTVJJKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KE1SSSkgJiBzdGF0aWNfY2FzdDxpbnQ+KE1vZFJlZkluZm86Ok11c3RNb2QpOworfQorTExWTV9OT0RJU0NBUkQgaW5saW5lIGJvb2wgaXNSZWZTZXQoY29uc3QgTW9kUmVmSW5mbyBNUkkpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oTVJJKSAmIHN0YXRpY19jYXN0PGludD4oTW9kUmVmSW5mbzo6TXVzdFJlZik7Cit9CitMTFZNX05PRElTQ0FSRCBpbmxpbmUgYm9vbCBpc011c3RTZXQoY29uc3QgTW9kUmVmSW5mbyBNUkkpIHsKKyAgcmV0dXJuICEoc3RhdGljX2Nhc3Q8aW50PihNUkkpICYgc3RhdGljX2Nhc3Q8aW50PihNb2RSZWZJbmZvOjpOb01vZFJlZikpOworfQorCitMTFZNX05PRElTQ0FSRCBpbmxpbmUgTW9kUmVmSW5mbyBzZXRNb2QoY29uc3QgTW9kUmVmSW5mbyBNUkkpIHsKKyAgcmV0dXJuIE1vZFJlZkluZm8oc3RhdGljX2Nhc3Q8aW50PihNUkkpIHwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihNb2RSZWZJbmZvOjpNdXN0TW9kKSk7Cit9CitMTFZNX05PRElTQ0FSRCBpbmxpbmUgTW9kUmVmSW5mbyBzZXRSZWYoY29uc3QgTW9kUmVmSW5mbyBNUkkpIHsKKyAgcmV0dXJuIE1vZFJlZkluZm8oc3RhdGljX2Nhc3Q8aW50PihNUkkpIHwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihNb2RSZWZJbmZvOjpNdXN0UmVmKSk7Cit9CitMTFZNX05PRElTQ0FSRCBpbmxpbmUgTW9kUmVmSW5mbyBzZXRNdXN0KGNvbnN0IE1vZFJlZkluZm8gTVJJKSB7CisgIHJldHVybiBNb2RSZWZJbmZvKHN0YXRpY19jYXN0PGludD4oTVJJKSAmCisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oTW9kUmVmSW5mbzo6TXVzdE1vZFJlZikpOworfQorTExWTV9OT0RJU0NBUkQgaW5saW5lIE1vZFJlZkluZm8gc2V0TW9kQW5kUmVmKGNvbnN0IE1vZFJlZkluZm8gTVJJKSB7CisgIHJldHVybiBNb2RSZWZJbmZvKHN0YXRpY19jYXN0PGludD4oTVJJKSB8CisgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oTW9kUmVmSW5mbzo6TXVzdE1vZFJlZikpOworfQorTExWTV9OT0RJU0NBUkQgaW5saW5lIE1vZFJlZkluZm8gY2xlYXJNb2QoY29uc3QgTW9kUmVmSW5mbyBNUkkpIHsKKyAgcmV0dXJuIE1vZFJlZkluZm8oc3RhdGljX2Nhc3Q8aW50PihNUkkpICYgc3RhdGljX2Nhc3Q8aW50PihNb2RSZWZJbmZvOjpSZWYpKTsKK30KK0xMVk1fTk9ESVNDQVJEIGlubGluZSBNb2RSZWZJbmZvIGNsZWFyUmVmKGNvbnN0IE1vZFJlZkluZm8gTVJJKSB7CisgIHJldHVybiBNb2RSZWZJbmZvKHN0YXRpY19jYXN0PGludD4oTVJJKSAmIHN0YXRpY19jYXN0PGludD4oTW9kUmVmSW5mbzo6TW9kKSk7Cit9CitMTFZNX05PRElTQ0FSRCBpbmxpbmUgTW9kUmVmSW5mbyBjbGVhck11c3QoY29uc3QgTW9kUmVmSW5mbyBNUkkpIHsKKyAgcmV0dXJuIE1vZFJlZkluZm8oc3RhdGljX2Nhc3Q8aW50PihNUkkpIHwKKyAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihNb2RSZWZJbmZvOjpOb01vZFJlZikpOworfQorTExWTV9OT0RJU0NBUkQgaW5saW5lIE1vZFJlZkluZm8gdW5pb25Nb2RSZWYoY29uc3QgTW9kUmVmSW5mbyBNUkkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTW9kUmVmSW5mbyBNUkkyKSB7CisgIHJldHVybiBNb2RSZWZJbmZvKHN0YXRpY19jYXN0PGludD4oTVJJMSkgfCBzdGF0aWNfY2FzdDxpbnQ+KE1SSTIpKTsKK30KK0xMVk1fTk9ESVNDQVJEIGlubGluZSBNb2RSZWZJbmZvIGludGVyc2VjdE1vZFJlZihjb25zdCBNb2RSZWZJbmZvIE1SSTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTW9kUmVmSW5mbyBNUkkyKSB7CisgIHJldHVybiBNb2RSZWZJbmZvKHN0YXRpY19jYXN0PGludD4oTVJJMSkgJiBzdGF0aWNfY2FzdDxpbnQ+KE1SSTIpKTsKK30KKworLy8vIFRoZSBsb2NhdGlvbnMgYXQgd2hpY2ggYSBmdW5jdGlvbiBtaWdodCBhY2Nlc3MgbWVtb3J5LgorLy8vCisvLy8gVGhlc2UgYXJlIHByaW1hcmlseSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIFxjIEFjY2Vzc0tpbmQgYml0cyB0bworLy8vIGRlc2NyaWJlIGJvdGggdGhlIG5hdHVyZSBvZiBhY2Nlc3MgYW5kIHRoZSBsb2NhdGlvbnMgb2YgYWNjZXNzIGZvciBhCisvLy8gZnVuY3Rpb24gY2FsbC4KK2VudW0gRnVuY3Rpb25Nb2RSZWZMb2NhdGlvbiB7CisgIC8vLyBCYXNlIGNhc2UgaXMgbm8gYWNjZXNzIHRvIG1lbW9yeS4KKyAgRk1STF9Ob3doZXJlID0gMCwKKyAgLy8vIEFjY2VzcyB0byBtZW1vcnkgdmlhIGFyZ3VtZW50IHBvaW50ZXJzLgorICBGTVJMX0FyZ3VtZW50UG9pbnRlZXMgPSA4LAorICAvLy8gTWVtb3J5IHRoYXQgaXMgaW5hY2Nlc3NpYmxlIHZpYSBMTFZNIElSLgorICBGTVJMX0luYWNjZXNzaWJsZU1lbSA9IDE2LAorICAvLy8gQWNjZXNzIHRvIGFueSBtZW1vcnkuCisgIEZNUkxfQW55d2hlcmUgPSAzMiB8IEZNUkxfSW5hY2Nlc3NpYmxlTWVtIHwgRk1STF9Bcmd1bWVudFBvaW50ZWVzCit9OworCisvLy8gU3VtbWFyeSBvZiBob3cgYSBmdW5jdGlvbiBhZmZlY3RzIG1lbW9yeSBpbiB0aGUgcHJvZ3JhbS4KKy8vLworLy8vIExvYWRzIGZyb20gY29uc3RhbnQgZ2xvYmFscyBhcmUgbm90IGNvbnNpZGVyZWQgbWVtb3J5IGFjY2Vzc2VzIGZvciB0aGlzCisvLy8gaW50ZXJmYWNlLiBBbHNvLCBmdW5jdGlvbnMgbWF5IGZyZWVseSBtb2RpZnkgc3RhY2sgc3BhY2UgbG9jYWwgdG8gdGhlaXIKKy8vLyBpbnZvY2F0aW9uIHdpdGhvdXQgaGF2aW5nIHRvIHJlcG9ydCBpdCB0aHJvdWdoIHRoZXNlIGludGVyZmFjZXMuCitlbnVtIEZ1bmN0aW9uTW9kUmVmQmVoYXZpb3IgeworICAvLy8gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGFueSBub24tbG9jYWwgbG9hZHMgb3Igc3RvcmVzIHRvIG1lbW9yeS4KKyAgLy8vCisgIC8vLyBUaGlzIHByb3BlcnR5IGNvcnJlc3BvbmRzIHRvIHRoZSBHQ0MgJ2NvbnN0JyBhdHRyaWJ1dGUuCisgIC8vLyBUaGlzIHByb3BlcnR5IGNvcnJlc3BvbmRzIHRvIHRoZSBMTFZNIElSICdyZWFkbm9uZScgYXR0cmlidXRlLgorICAvLy8gVGhpcyBwcm9wZXJ0eSBjb3JyZXNwb25kcyB0byB0aGUgSW50ck5vTWVtIExMVk0gaW50cmluc2ljIGZsYWcuCisgIEZNUkJfRG9lc05vdEFjY2Vzc01lbW9yeSA9CisgICAgICBGTVJMX05vd2hlcmUgfCBzdGF0aWNfY2FzdDxpbnQ+KE1vZFJlZkluZm86Ok5vTW9kUmVmKSwKKworICAvLy8gVGhlIG9ubHkgbWVtb3J5IHJlZmVyZW5jZXMgaW4gdGhpcyBmdW5jdGlvbiAoaWYgaXQgaGFzIGFueSkgYXJlCisgIC8vLyBub24tdm9sYXRpbGUgbG9hZHMgZnJvbSBvYmplY3RzIHBvaW50ZWQgdG8gYnkgaXRzIHBvaW50ZXItdHlwZWQKKyAgLy8vIGFyZ3VtZW50cywgd2l0aCBhcmJpdHJhcnkgb2Zmc2V0cy4KKyAgLy8vCisgIC8vLyBUaGlzIHByb3BlcnR5IGNvcnJlc3BvbmRzIHRvIHRoZSBJbnRyUmVhZEFyZ01lbSBMTFZNIGludHJpbnNpYyBmbGFnLgorICBGTVJCX09ubHlSZWFkc0FyZ3VtZW50UG9pbnRlZXMgPQorICAgICAgRk1STF9Bcmd1bWVudFBvaW50ZWVzIHwgc3RhdGljX2Nhc3Q8aW50PihNb2RSZWZJbmZvOjpSZWYpLAorCisgIC8vLyBUaGUgb25seSBtZW1vcnkgcmVmZXJlbmNlcyBpbiB0aGlzIGZ1bmN0aW9uIChpZiBpdCBoYXMgYW55KSBhcmUKKyAgLy8vIG5vbi12b2xhdGlsZSBsb2FkcyBhbmQgc3RvcmVzIGZyb20gb2JqZWN0cyBwb2ludGVkIHRvIGJ5IGl0cworICAvLy8gcG9pbnRlci10eXBlZCBhcmd1bWVudHMsIHdpdGggYXJiaXRyYXJ5IG9mZnNldHMuCisgIC8vLworICAvLy8gVGhpcyBwcm9wZXJ0eSBjb3JyZXNwb25kcyB0byB0aGUgSW50ckFyZ01lbU9ubHkgTExWTSBpbnRyaW5zaWMgZmxhZy4KKyAgRk1SQl9Pbmx5QWNjZXNzZXNBcmd1bWVudFBvaW50ZWVzID0KKyAgICAgIEZNUkxfQXJndW1lbnRQb2ludGVlcyB8IHN0YXRpY19jYXN0PGludD4oTW9kUmVmSW5mbzo6TW9kUmVmKSwKKworICAvLy8gVGhlIG9ubHkgbWVtb3J5IHJlZmVyZW5jZXMgaW4gdGhpcyBmdW5jdGlvbiAoaWYgaXQgaGFzIGFueSkgYXJlCisgIC8vLyByZWZlcmVuY2VzIG9mIG1lbW9yeSB0aGF0IGlzIG90aGVyd2lzZSBpbmFjY2Vzc2libGUgdmlhIExMVk0gSVIuCisgIC8vLworICAvLy8gVGhpcyBwcm9wZXJ0eSBjb3JyZXNwb25kcyB0byB0aGUgTExWTSBJUiBpbmFjY2Vzc2libGVtZW1vbmx5IGF0dHJpYnV0ZS4KKyAgRk1SQl9Pbmx5QWNjZXNzZXNJbmFjY2Vzc2libGVNZW0gPQorICAgICAgRk1STF9JbmFjY2Vzc2libGVNZW0gfCBzdGF0aWNfY2FzdDxpbnQ+KE1vZFJlZkluZm86Ok1vZFJlZiksCisKKyAgLy8vIFRoZSBmdW5jdGlvbiBtYXkgcGVyZm9ybSBub24tdm9sYXRpbGUgbG9hZHMgYW5kIHN0b3JlcyBvZiBvYmplY3RzCisgIC8vLyBwb2ludGVkIHRvIGJ5IGl0cyBwb2ludGVyLXR5cGVkIGFyZ3VtZW50cywgd2l0aCBhcmJpdHJhcnkgb2Zmc2V0cywgYW5kCisgIC8vLyBpdCBtYXkgYWxzbyBwZXJmb3JtIGxvYWRzIGFuZCBzdG9yZXMgb2YgbWVtb3J5IHRoYXQgaXMgb3RoZXJ3aXNlCisgIC8vLyBpbmFjY2Vzc2libGUgdmlhIExMVk0gSVIuCisgIC8vLworICAvLy8gVGhpcyBwcm9wZXJ0eSBjb3JyZXNwb25kcyB0byB0aGUgTExWTSBJUgorICAvLy8gaW5hY2Nlc3NpYmxlbWVtX29yX2FyZ21lbW9ubHkgYXR0cmlidXRlLgorICBGTVJCX09ubHlBY2Nlc3Nlc0luYWNjZXNzaWJsZU9yQXJnTWVtID0gRk1STF9JbmFjY2Vzc2libGVNZW0gfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk1STF9Bcmd1bWVudFBvaW50ZWVzIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oTW9kUmVmSW5mbzo6TW9kUmVmKSwKKworICAvLy8gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGFueSBub24tbG9jYWwgc3RvcmVzIG9yIHZvbGF0aWxlIGxvYWRzLAorICAvLy8gYnV0IG1heSByZWFkIGZyb20gYW55IG1lbW9yeSBsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIHByb3BlcnR5IGNvcnJlc3BvbmRzIHRvIHRoZSBHQ0MgJ3B1cmUnIGF0dHJpYnV0ZS4KKyAgLy8vIFRoaXMgcHJvcGVydHkgY29ycmVzcG9uZHMgdG8gdGhlIExMVk0gSVIgJ3JlYWRvbmx5JyBhdHRyaWJ1dGUuCisgIC8vLyBUaGlzIHByb3BlcnR5IGNvcnJlc3BvbmRzIHRvIHRoZSBJbnRyUmVhZE1lbSBMTFZNIGludHJpbnNpYyBmbGFnLgorICBGTVJCX09ubHlSZWFkc01lbW9yeSA9IEZNUkxfQW55d2hlcmUgfCBzdGF0aWNfY2FzdDxpbnQ+KE1vZFJlZkluZm86OlJlZiksCisKKyAgLy8gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZWFkIGZyb20gbWVtb3J5IGFueXdoZXJlLCBidXQgbWF5IHdyaXRlIHRvIGFueQorICAvLyBtZW1vcnkgbG9jYXRpb24uCisgIC8vCisgIC8vIFRoaXMgcHJvcGVydHkgY29ycmVzcG9uZHMgdG8gdGhlIExMVk0gSVIgJ3dyaXRlb25seScgYXR0cmlidXRlLgorICAvLyBUaGlzIHByb3BlcnR5IGNvcnJlc3BvbmRzIHRvIHRoZSBJbnRyV3JpdGVNZW0gTExWTSBpbnRyaW5zaWMgZmxhZy4KKyAgRk1SQl9Eb2VzTm90UmVhZE1lbW9yeSA9IEZNUkxfQW55d2hlcmUgfCBzdGF0aWNfY2FzdDxpbnQ+KE1vZFJlZkluZm86Ok1vZCksCisKKyAgLy8vIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGZ1bmN0aW9uIGNvdWxkIG5vdCBiZSBjbGFzc2lmaWVkIGludG8gb25lIG9mIHRoZQorICAvLy8gYmVoYXZpb3JzIGFib3ZlLgorICBGTVJCX1Vua25vd25Nb2RSZWZCZWhhdmlvciA9CisgICAgICBGTVJMX0FueXdoZXJlIHwgc3RhdGljX2Nhc3Q8aW50PihNb2RSZWZJbmZvOjpNb2RSZWYpCit9OworCisvLyBXcmFwcGVyIG1ldGhvZCBzdHJpcHMgYml0cyBzaWduaWZpY2FudCBvbmx5IGluIEZ1bmN0aW9uTW9kUmVmQmVoYXZpb3IsCisvLyB0byBvYnRhaW4gYSB2YWxpZCBNb2RSZWZJbmZvLiBUaGUgYmVuZWZpdCBvZiB1c2luZyB0aGUgd3JhcHBlciBpcyB0aGF0IGlmCisvLyBNb2RSZWZJbmZvIGVudW0gY2hhbmdlcywgdGhlIHdyYXBwZXIgY2FuIGJlIHVwZGF0ZWQgdG8gJiB3aXRoIHRoZSBuZXcgZW51bQorLy8gZW50cnkgd2l0aCBhbGwgYml0cyBzZXQgdG8gMS4KK0xMVk1fTk9ESVNDQVJEIGlubGluZSBNb2RSZWZJbmZvCitjcmVhdGVNb2RSZWZJbmZvKGNvbnN0IEZ1bmN0aW9uTW9kUmVmQmVoYXZpb3IgRk1SQikgeworICByZXR1cm4gTW9kUmVmSW5mbyhGTVJCICYgc3RhdGljX2Nhc3Q8aW50PihNb2RSZWZJbmZvOjpNb2RSZWYpKTsKK30KKworY2xhc3MgQUFSZXN1bHRzIHsKK3B1YmxpYzoKKyAgLy8gTWFrZSB0aGVzZSByZXN1bHRzIGRlZmF1bHQgY29uc3RydWN0YWJsZSBhbmQgbW92YWJsZS4gV2UgaGF2ZSB0byBzcGVsbAorICAvLyB0aGVzZSBvdXQgYmVjYXVzZSBNU1ZDIHdvbid0IHN5bnRoZXNpemUgdGhlbS4KKyAgQUFSZXN1bHRzKGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICZUTEkpIDogVExJKFRMSSkge30KKyAgQUFSZXN1bHRzKEFBUmVzdWx0cyAmJkFyZyk7CisgIH5BQVJlc3VsdHMoKTsKKworICAvLy8gUmVnaXN0ZXIgYSBzcGVjaWZpYyBBQSByZXN1bHQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBQVJlc3VsdFQ+IHZvaWQgYWRkQUFSZXN1bHQoQUFSZXN1bHRUICZBQVJlc3VsdCkgeworICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgdXNlIGEgbXVjaCBsaWdodGVyIHdlaWdodCBzeXN0ZW0gdGhhbiB0aGUgdXN1YWwKKyAgICAvLyBwb2x5bW9ycGhpYyBwYXR0ZXJuIGJlY2F1c2Ugd2UgZG9uJ3Qgb3duIEFBUmVzdWx0LiBJdCBzaG91bGQKKyAgICAvLyBpZGVhbGx5IGludm9sdmUgdHdvIHBvaW50ZXJzIGFuZCBubyBzZXBhcmF0ZSBhbGxvY2F0aW9uLgorICAgIEFBcy5lbXBsYWNlX2JhY2sobmV3IE1vZGVsPEFBUmVzdWx0VD4oQUFSZXN1bHQsICp0aGlzKSk7CisgIH0KKworICAvLy8gUmVnaXN0ZXIgYSBmdW5jdGlvbiBhbmFseXNpcyBJRCB0aGF0IHRoZSByZXN1bHRzIGFnZ3JlZ2F0aW9uIGRlcGVuZHMgb24uCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIGluIHRoZSBuZXcgcGFzcyBtYW5hZ2VyIHRvIGltcGxlbWVudCB0aGUgaW52YWxpZGF0aW9uIGxvZ2ljCisgIC8vLyB3aGVyZSB3ZSBtdXN0IGludmFsaWRhdGUgdGhlIHJlc3VsdHMgYWdncmVnYXRpb24gaWYgYW55IG9mIG91ciBjb21wb25lbnQKKyAgLy8vIGFuYWx5c2VzIGJlY29tZSBpbnZhbGlkLgorICB2b2lkIGFkZEFBRGVwZW5kZW5jeUlEKEFuYWx5c2lzS2V5ICpJRCkgeyBBQURlcHMucHVzaF9iYWNrKElEKTsgfQorCisgIC8vLyBIYW5kbGUgaW52YWxpZGF0aW9uIGV2ZW50cyBpbiB0aGUgbmV3IHBhc3MgbWFuYWdlci4KKyAgLy8vCisgIC8vLyBUaGUgYWdncmVnYXRpb24gaXMgaW52YWxpZGF0ZWQgaWYgYW55IG9mIHRoZSB1bmRlcmx5aW5nIGFuYWx5c2VzIGlzCisgIC8vLyBpbnZhbGlkYXRlZC4KKyAgYm9vbCBpbnZhbGlkYXRlKEZ1bmN0aW9uICZGLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmUEEsCisgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlcjo6SW52YWxpZGF0b3IgJkludik7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBcbmFtZSBBbGlhcyBRdWVyaWVzCisgIC8vLyBAeworCisgIC8vLyBUaGUgbWFpbiBsb3cgbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBhbGlhcyBhbmFseXNpcyBpbXBsZW1lbnRhdGlvbi4KKyAgLy8vIFJldHVybnMgYW4gQWxpYXNSZXN1bHQgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0d28gcG9pbnRlcnMgYXJlIGFsaWFzZWQgdG8KKyAgLy8vIGVhY2ggb3RoZXIuIFRoaXMgaXMgdGhlIGludGVyZmFjZSB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3BlY2lmaWMKKyAgLy8vIGFsaWFzIGFuYWx5c2lzIGltcGxlbWVudGF0aW9ucy4KKyAgQWxpYXNSZXN1bHQgYWxpYXMoY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvY0EsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2NCKTsKKworICAvLy8gQSBjb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgcHJpbWFyeSBcYyBhbGlhcyBpbnRlcmZhY2UuCisgIEFsaWFzUmVzdWx0IGFsaWFzKGNvbnN0IFZhbHVlICpWMSwgdWludDY0X3QgVjFTaXplLCBjb25zdCBWYWx1ZSAqVjIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFYyU2l6ZSkgeworICAgIHJldHVybiBhbGlhcyhNZW1vcnlMb2NhdGlvbihWMSwgVjFTaXplKSwgTWVtb3J5TG9jYXRpb24oVjIsIFYyU2l6ZSkpOworICB9CisKKyAgLy8vIEEgY29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgdGhlIHByaW1hcnkgXGMgYWxpYXMgaW50ZXJmYWNlLgorICBBbGlhc1Jlc3VsdCBhbGlhcyhjb25zdCBWYWx1ZSAqVjEsIGNvbnN0IFZhbHVlICpWMikgeworICAgIHJldHVybiBhbGlhcyhWMSwgTWVtb3J5TG9jYXRpb246OlVua25vd25TaXplLCBWMiwKKyAgICAgICAgICAgICAgICAgTWVtb3J5TG9jYXRpb246OlVua25vd25TaXplKTsKKyAgfQorCisgIC8vLyBBIHRyaXZpYWwgaGVscGVyIGZ1bmN0aW9uIHRvIGNoZWNrIHRvIHNlZSBpZiB0aGUgc3BlY2lmaWVkIHBvaW50ZXJzIGFyZQorICAvLy8gbm8tYWxpYXMuCisgIGJvb2wgaXNOb0FsaWFzKGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2NBLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jQikgeworICAgIHJldHVybiBhbGlhcyhMb2NBLCBMb2NCKSA9PSBOb0FsaWFzOworICB9CisKKyAgLy8vIEEgY29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgdGhlIFxjIGlzTm9BbGlhcyBoZWxwZXIgaW50ZXJmYWNlLgorICBib29sIGlzTm9BbGlhcyhjb25zdCBWYWx1ZSAqVjEsIHVpbnQ2NF90IFYxU2l6ZSwgY29uc3QgVmFsdWUgKlYyLAorICAgICAgICAgICAgICAgICB1aW50NjRfdCBWMlNpemUpIHsKKyAgICByZXR1cm4gaXNOb0FsaWFzKE1lbW9yeUxvY2F0aW9uKFYxLCBWMVNpemUpLCBNZW1vcnlMb2NhdGlvbihWMiwgVjJTaXplKSk7CisgIH0KKworICAvLy8gQSBjb252ZW5pZW5jZSB3cmFwcGVyIGFyb3VuZCB0aGUgXGMgaXNOb0FsaWFzIGhlbHBlciBpbnRlcmZhY2UuCisgIGJvb2wgaXNOb0FsaWFzKGNvbnN0IFZhbHVlICpWMSwgY29uc3QgVmFsdWUgKlYyKSB7CisgICAgcmV0dXJuIGlzTm9BbGlhcyhNZW1vcnlMb2NhdGlvbihWMSksIE1lbW9yeUxvY2F0aW9uKFYyKSk7CisgIH0KKworICAvLy8gQSB0cml2aWFsIGhlbHBlciBmdW5jdGlvbiB0byBjaGVjayB0byBzZWUgaWYgdGhlIHNwZWNpZmllZCBwb2ludGVycyBhcmUKKyAgLy8vIG11c3QtYWxpYXMuCisgIGJvb2wgaXNNdXN0QWxpYXMoY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvY0EsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2NCKSB7CisgICAgcmV0dXJuIGFsaWFzKExvY0EsIExvY0IpID09IE11c3RBbGlhczsKKyAgfQorCisgIC8vLyBBIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBcYyBpc011c3RBbGlhcyBoZWxwZXIgaW50ZXJmYWNlLgorICBib29sIGlzTXVzdEFsaWFzKGNvbnN0IFZhbHVlICpWMSwgY29uc3QgVmFsdWUgKlYyKSB7CisgICAgcmV0dXJuIGFsaWFzKFYxLCAxLCBWMiwgMSkgPT0gTXVzdEFsaWFzOworICB9CisKKyAgLy8vIENoZWNrcyB3aGV0aGVyIHRoZSBnaXZlbiBsb2NhdGlvbiBwb2ludHMgdG8gY29uc3RhbnQgbWVtb3J5LCBvciBpZgorICAvLy8gXHAgT3JMb2NhbCBpcyB0cnVlIHdoZXRoZXIgaXQgcG9pbnRzIHRvIGEgbG9jYWwgYWxsb2NhLgorICBib29sIHBvaW50c1RvQ29uc3RhbnRNZW1vcnkoY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvYywgYm9vbCBPckxvY2FsID0gZmFsc2UpOworCisgIC8vLyBBIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBwcmltYXJ5IFxjIHBvaW50c1RvQ29uc3RhbnRNZW1vcnkKKyAgLy8vIGludGVyZmFjZS4KKyAgYm9vbCBwb2ludHNUb0NvbnN0YW50TWVtb3J5KGNvbnN0IFZhbHVlICpQLCBib29sIE9yTG9jYWwgPSBmYWxzZSkgeworICAgIHJldHVybiBwb2ludHNUb0NvbnN0YW50TWVtb3J5KE1lbW9yeUxvY2F0aW9uKFApLCBPckxvY2FsKTsKKyAgfQorCisgIC8vLyBAfQorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIFxuYW1lIFNpbXBsZSBtb2QvcmVmIGluZm9ybWF0aW9uCisgIC8vLyBAeworCisgIC8vLyBHZXQgdGhlIE1vZFJlZiBpbmZvIGFzc29jaWF0ZWQgd2l0aCBhIHBvaW50ZXIgYXJndW1lbnQgb2YgYSBjYWxsc2l0ZS4gVGhlCisgIC8vLyByZXN1bHQncyBiaXRzIGFyZSBzZXQgdG8gaW5kaWNhdGUgdGhlIGFsbG93ZWQgYWxpYXNpbmcgTW9kUmVmIGtpbmRzLiBOb3RlCisgIC8vLyB0aGF0IHRoZXNlIGJpdHMgZG8gbm90IG5lY2Vzc2FyaWx5IGFjY291bnQgZm9yIHRoZSBvdmVyYWxsIGJlaGF2aW9yIG9mCisgIC8vLyB0aGUgZnVuY3Rpb24sIGJ1dCByYXRoZXIgb25seSBwcm92aWRlIGFkZGl0aW9uYWwgcGVyLWFyZ3VtZW50CisgIC8vLyBpbmZvcm1hdGlvbi4gVGhpcyBuZXZlciBzZXRzIE1vZFJlZkluZm86Ok11c3QuCisgIE1vZFJlZkluZm8gZ2V0QXJnTW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUywgdW5zaWduZWQgQXJnSWR4KTsKKworICAvLy8gUmV0dXJuIHRoZSBiZWhhdmlvciBvZiB0aGUgZ2l2ZW4gY2FsbCBzaXRlLgorICBGdW5jdGlvbk1vZFJlZkJlaGF2aW9yIGdldE1vZFJlZkJlaGF2aW9yKEltbXV0YWJsZUNhbGxTaXRlIENTKTsKKworICAvLy8gUmV0dXJuIHRoZSBiZWhhdmlvciB3aGVuIGNhbGxpbmcgdGhlIGdpdmVuIGZ1bmN0aW9uLgorICBGdW5jdGlvbk1vZFJlZkJlaGF2aW9yIGdldE1vZFJlZkJlaGF2aW9yKGNvbnN0IEZ1bmN0aW9uICpGKTsKKworICAvLy8gQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgY2FsbCBpcyBrbm93biB0byBuZXZlciByZWFkIG9yIHdyaXRlIG1lbW9yeS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgaWYgdGhlIGNhbGwgb25seSByZWFkcyBmcm9tIGtub3duLWNvbnN0YW50IG1lbW9yeSwgaXQgaXMgYWxzbworICAvLy8gbGVnYWwgdG8gcmV0dXJuIHRydWUuIEFsc28sIGNhbGxzIHRoYXQgdW53aW5kIHRoZSBzdGFjayBhcmUgbGVnYWwgZm9yCisgIC8vLyB0aGlzIHByZWRpY2F0ZS4KKyAgLy8vCisgIC8vLyBNYW55IG9wdGltaXphdGlvbnMgKHN1Y2ggYXMgQ1NFIGFuZCBMSUNNKSBjYW4gYmUgcGVyZm9ybWVkIG9uIHN1Y2ggY2FsbHMKKyAgLy8vIHdpdGhvdXQgd29ycnlpbmcgYWJvdXQgYWxpYXNpbmcgcHJvcGVydGllcywgYW5kIG1hbnkgY2FsbHMgaGF2ZSB0aGlzCisgIC8vLyBwcm9wZXJ0eSAoZS5nLiBjYWxscyB0byAnc2luJyBhbmQgJ2NvcycpLgorICAvLy8KKyAgLy8vIFRoaXMgcHJvcGVydHkgY29ycmVzcG9uZHMgdG8gdGhlIEdDQyAnY29uc3QnIGF0dHJpYnV0ZS4KKyAgYm9vbCBkb2VzTm90QWNjZXNzTWVtb3J5KEltbXV0YWJsZUNhbGxTaXRlIENTKSB7CisgICAgcmV0dXJuIGdldE1vZFJlZkJlaGF2aW9yKENTKSA9PSBGTVJCX0RvZXNOb3RBY2Nlc3NNZW1vcnk7CisgIH0KKworICAvLy8gQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gaXMga25vd24gdG8gbmV2ZXIgcmVhZCBvciB3cml0ZSBtZW1vcnkuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IGlmIHRoZSBmdW5jdGlvbiBvbmx5IHJlYWRzIGZyb20ga25vd24tY29uc3RhbnQgbWVtb3J5LCBpdCBpcworICAvLy8gYWxzbyBsZWdhbCB0byByZXR1cm4gdHJ1ZS4gQWxzbywgZnVuY3Rpb24gdGhhdCB1bndpbmQgdGhlIHN0YWNrIGFyZSBsZWdhbAorICAvLy8gZm9yIHRoaXMgcHJlZGljYXRlLgorICAvLy8KKyAgLy8vIE1hbnkgb3B0aW1pemF0aW9ucyAoc3VjaCBhcyBDU0UgYW5kIExJQ00pIGNhbiBiZSBwZXJmb3JtZWQgb24gc3VjaCBjYWxscworICAvLy8gdG8gc3VjaCBmdW5jdGlvbnMgd2l0aG91dCB3b3JyeWluZyBhYm91dCBhbGlhc2luZyBwcm9wZXJ0aWVzLCBhbmQgbWFueQorICAvLy8gZnVuY3Rpb25zIGhhdmUgdGhpcyBwcm9wZXJ0eSAoZS5nLiAnc2luJyBhbmQgJ2NvcycpLgorICAvLy8KKyAgLy8vIFRoaXMgcHJvcGVydHkgY29ycmVzcG9uZHMgdG8gdGhlIEdDQyAnY29uc3QnIGF0dHJpYnV0ZS4KKyAgYm9vbCBkb2VzTm90QWNjZXNzTWVtb3J5KGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgICAgcmV0dXJuIGdldE1vZFJlZkJlaGF2aW9yKEYpID09IEZNUkJfRG9lc05vdEFjY2Vzc01lbW9yeTsKKyAgfQorCisgIC8vLyBDaGVja3MgaWYgdGhlIHNwZWNpZmllZCBjYWxsIGlzIGtub3duIHRvIG9ubHkgcmVhZCBmcm9tIG5vbi12b2xhdGlsZQorICAvLy8gbWVtb3J5IChvciBub3QgYWNjZXNzIG1lbW9yeSBhdCBhbGwpLgorICAvLy8KKyAgLy8vIENhbGxzIHRoYXQgdW53aW5kIHRoZSBzdGFjayBhcmUgbGVnYWwgZm9yIHRoaXMgcHJlZGljYXRlLgorICAvLy8KKyAgLy8vIFRoaXMgcHJvcGVydHkgYWxsb3dzIG1hbnkgY29tbW9uIG9wdGltaXphdGlvbnMgdG8gYmUgcGVyZm9ybWVkIGluIHRoZQorICAvLy8gYWJzZW5jZSBvZiBpbnRlcmZlcmluZyBzdG9yZSBpbnN0cnVjdGlvbnMsIHN1Y2ggYXMgQ1NFIG9mIHN0cmxlbiBjYWxscy4KKyAgLy8vCisgIC8vLyBUaGlzIHByb3BlcnR5IGNvcnJlc3BvbmRzIHRvIHRoZSBHQ0MgJ3B1cmUnIGF0dHJpYnV0ZS4KKyAgYm9vbCBvbmx5UmVhZHNNZW1vcnkoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MpIHsKKyAgICByZXR1cm4gb25seVJlYWRzTWVtb3J5KGdldE1vZFJlZkJlaGF2aW9yKENTKSk7CisgIH0KKworICAvLy8gQ2hlY2tzIGlmIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gaXMga25vd24gdG8gb25seSByZWFkIGZyb20gbm9uLXZvbGF0aWxlCisgIC8vLyBtZW1vcnkgKG9yIG5vdCBhY2Nlc3MgbWVtb3J5IGF0IGFsbCkuCisgIC8vLworICAvLy8gRnVuY3Rpb25zIHRoYXQgdW53aW5kIHRoZSBzdGFjayBhcmUgbGVnYWwgZm9yIHRoaXMgcHJlZGljYXRlLgorICAvLy8KKyAgLy8vIFRoaXMgcHJvcGVydHkgYWxsb3dzIG1hbnkgY29tbW9uIG9wdGltaXphdGlvbnMgdG8gYmUgcGVyZm9ybWVkIGluIHRoZQorICAvLy8gYWJzZW5jZSBvZiBpbnRlcmZlcmluZyBzdG9yZSBpbnN0cnVjdGlvbnMsIHN1Y2ggYXMgQ1NFIG9mIHN0cmxlbiBjYWxscy4KKyAgLy8vCisgIC8vLyBUaGlzIHByb3BlcnR5IGNvcnJlc3BvbmRzIHRvIHRoZSBHQ0MgJ3B1cmUnIGF0dHJpYnV0ZS4KKyAgYm9vbCBvbmx5UmVhZHNNZW1vcnkoY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgICByZXR1cm4gb25seVJlYWRzTWVtb3J5KGdldE1vZFJlZkJlaGF2aW9yKEYpKTsKKyAgfQorCisgIC8vLyBDaGVja3MgaWYgZnVuY3Rpb25zIHdpdGggdGhlIHNwZWNpZmllZCBiZWhhdmlvciBhcmUga25vd24gdG8gb25seSByZWFkCisgIC8vLyBmcm9tIG5vbi12b2xhdGlsZSBtZW1vcnkgKG9yIG5vdCBhY2Nlc3MgbWVtb3J5IGF0IGFsbCkuCisgIHN0YXRpYyBib29sIG9ubHlSZWFkc01lbW9yeShGdW5jdGlvbk1vZFJlZkJlaGF2aW9yIE1SQikgeworICAgIHJldHVybiAhaXNNb2RTZXQoY3JlYXRlTW9kUmVmSW5mbyhNUkIpKTsKKyAgfQorCisgIC8vLyBDaGVja3MgaWYgZnVuY3Rpb25zIHdpdGggdGhlIHNwZWNpZmllZCBiZWhhdmlvciBhcmUga25vd24gdG8gb25seSB3cml0ZQorICAvLy8gbWVtb3J5IChvciBub3QgYWNjZXNzIG1lbW9yeSBhdCBhbGwpLgorICBzdGF0aWMgYm9vbCBkb2VzTm90UmVhZE1lbW9yeShGdW5jdGlvbk1vZFJlZkJlaGF2aW9yIE1SQikgeworICAgIHJldHVybiAhaXNSZWZTZXQoY3JlYXRlTW9kUmVmSW5mbyhNUkIpKTsKKyAgfQorCisgIC8vLyBDaGVja3MgaWYgZnVuY3Rpb25zIHdpdGggdGhlIHNwZWNpZmllZCBiZWhhdmlvciBhcmUga25vd24gdG8gcmVhZCBhbmQKKyAgLy8vIHdyaXRlIGF0IG1vc3QgZnJvbSBvYmplY3RzIHBvaW50ZWQgdG8gYnkgdGhlaXIgcG9pbnRlci10eXBlZCBhcmd1bWVudHMKKyAgLy8vICh3aXRoIGFyYml0cmFyeSBvZmZzZXRzKS4KKyAgc3RhdGljIGJvb2wgb25seUFjY2Vzc2VzQXJnUG9pbnRlZXMoRnVuY3Rpb25Nb2RSZWZCZWhhdmlvciBNUkIpIHsKKyAgICByZXR1cm4gIShNUkIgJiBGTVJMX0FueXdoZXJlICYgfkZNUkxfQXJndW1lbnRQb2ludGVlcyk7CisgIH0KKworICAvLy8gQ2hlY2tzIGlmIGZ1bmN0aW9ucyB3aXRoIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3IgYXJlIGtub3duIHRvIHBvdGVudGlhbGx5CisgIC8vLyByZWFkIG9yIHdyaXRlIGZyb20gb2JqZWN0cyBwb2ludGVkIHRvIGJlIHRoZWlyIHBvaW50ZXItdHlwZWQgYXJndW1lbnRzCisgIC8vLyAod2l0aCBhcmJpdHJhcnkgb2Zmc2V0cykuCisgIHN0YXRpYyBib29sIGRvZXNBY2Nlc3NBcmdQb2ludGVlcyhGdW5jdGlvbk1vZFJlZkJlaGF2aW9yIE1SQikgeworICAgIHJldHVybiBpc01vZE9yUmVmU2V0KGNyZWF0ZU1vZFJlZkluZm8oTVJCKSkgJiYKKyAgICAgICAgICAgKE1SQiAmIEZNUkxfQXJndW1lbnRQb2ludGVlcyk7CisgIH0KKworICAvLy8gQ2hlY2tzIGlmIGZ1bmN0aW9ucyB3aXRoIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3IgYXJlIGtub3duIHRvIHJlYWQgYW5kCisgIC8vLyB3cml0ZSBhdCBtb3N0IGZyb20gbWVtb3J5IHRoYXQgaXMgaW5hY2Nlc3NpYmxlIGZyb20gTExWTSBJUi4KKyAgc3RhdGljIGJvb2wgb25seUFjY2Vzc2VzSW5hY2Nlc3NpYmxlTWVtKEZ1bmN0aW9uTW9kUmVmQmVoYXZpb3IgTVJCKSB7CisgICAgcmV0dXJuICEoTVJCICYgRk1STF9Bbnl3aGVyZSAmIH5GTVJMX0luYWNjZXNzaWJsZU1lbSk7CisgIH0KKworICAvLy8gQ2hlY2tzIGlmIGZ1bmN0aW9ucyB3aXRoIHRoZSBzcGVjaWZpZWQgYmVoYXZpb3IgYXJlIGtub3duIHRvIHBvdGVudGlhbGx5CisgIC8vLyByZWFkIG9yIHdyaXRlIGZyb20gbWVtb3J5IHRoYXQgaXMgaW5hY2Nlc3NpYmxlIGZyb20gTExWTSBJUi4KKyAgc3RhdGljIGJvb2wgZG9lc0FjY2Vzc0luYWNjZXNzaWJsZU1lbShGdW5jdGlvbk1vZFJlZkJlaGF2aW9yIE1SQikgeworICAgIHJldHVybiBpc01vZE9yUmVmU2V0KGNyZWF0ZU1vZFJlZkluZm8oTVJCKSkgJiYgKE1SQiAmIEZNUkxfSW5hY2Nlc3NpYmxlTWVtKTsKKyAgfQorCisgIC8vLyBDaGVja3MgaWYgZnVuY3Rpb25zIHdpdGggdGhlIHNwZWNpZmllZCBiZWhhdmlvciBhcmUga25vd24gdG8gcmVhZCBhbmQKKyAgLy8vIHdyaXRlIGF0IG1vc3QgZnJvbSBtZW1vcnkgdGhhdCBpcyBpbmFjY2Vzc2libGUgZnJvbSBMTFZNIElSIG9yIG9iamVjdHMKKyAgLy8vIHBvaW50ZWQgdG8gYnkgdGhlaXIgcG9pbnRlci10eXBlZCBhcmd1bWVudHMgKHdpdGggYXJiaXRyYXJ5IG9mZnNldHMpLgorICBzdGF0aWMgYm9vbCBvbmx5QWNjZXNzZXNJbmFjY2Vzc2libGVPckFyZ01lbShGdW5jdGlvbk1vZFJlZkJlaGF2aW9yIE1SQikgeworICAgIHJldHVybiAhKE1SQiAmIEZNUkxfQW55d2hlcmUgJgorICAgICAgICAgICAgIH4oRk1STF9JbmFjY2Vzc2libGVNZW0gfCBGTVJMX0FyZ3VtZW50UG9pbnRlZXMpKTsKKyAgfQorCisgIC8vLyBnZXRNb2RSZWZJbmZvIChmb3IgY2FsbCBzaXRlcykgLSBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlcgorICAvLy8gYSBwYXJ0aWN1bGFyIGNhbGwgc2l0ZSBtb2RpZmllcyBvciByZWFkcyB0aGUgc3BlY2lmaWVkIG1lbW9yeSBsb2NhdGlvbi4KKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jKTsKKworICAvLy8gZ2V0TW9kUmVmSW5mbyAoZm9yIGNhbGwgc2l0ZXMpIC0gQSBjb252ZW5pZW5jZSB3cmFwcGVyLgorICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsIGNvbnN0IFZhbHVlICpQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZSkgeworICAgIHJldHVybiBnZXRNb2RSZWZJbmZvKENTLCBNZW1vcnlMb2NhdGlvbihQLCBTaXplKSk7CisgIH0KKworICAvLy8gZ2V0TW9kUmVmSW5mbyAoZm9yIGNhbGxzKSAtIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyCisgIC8vLyBhIHBhcnRpY3VsYXIgY2FsbCBtb2RpZmllcyBvciByZWFkcyB0aGUgc3BlY2lmaWVkIG1lbW9yeSBsb2NhdGlvbi4KKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKGNvbnN0IENhbGxJbnN0ICpDLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jKSB7CisgICAgcmV0dXJuIGdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUoQyksIExvYyk7CisgIH0KKworICAvLy8gZ2V0TW9kUmVmSW5mbyAoZm9yIGNhbGxzKSAtIEEgY29udmVuaWVuY2Ugd3JhcHBlci4KKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKGNvbnN0IENhbGxJbnN0ICpDLCBjb25zdCBWYWx1ZSAqUCwgdWludDY0X3QgU2l6ZSkgeworICAgIHJldHVybiBnZXRNb2RSZWZJbmZvKEMsIE1lbW9yeUxvY2F0aW9uKFAsIFNpemUpKTsKKyAgfQorCisgIC8vLyBnZXRNb2RSZWZJbmZvIChmb3IgaW52b2tlcykgLSBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlcgorICAvLy8gYSBwYXJ0aWN1bGFyIGludm9rZSBtb2RpZmllcyBvciByZWFkcyB0aGUgc3BlY2lmaWVkIG1lbW9yeSBsb2NhdGlvbi4KKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKGNvbnN0IEludm9rZUluc3QgKkksIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MpIHsKKyAgICByZXR1cm4gZ2V0TW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZShJKSwgTG9jKTsKKyAgfQorCisgIC8vLyBnZXRNb2RSZWZJbmZvIChmb3IgaW52b2tlcykgLSBBIGNvbnZlbmllbmNlIHdyYXBwZXIuCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhjb25zdCBJbnZva2VJbnN0ICpJLCBjb25zdCBWYWx1ZSAqUCwgdWludDY0X3QgU2l6ZSkgeworICAgIHJldHVybiBnZXRNb2RSZWZJbmZvKEksIE1lbW9yeUxvY2F0aW9uKFAsIFNpemUpKTsKKyAgfQorCisgIC8vLyBnZXRNb2RSZWZJbmZvIChmb3IgbG9hZHMpIC0gUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIKKyAgLy8vIGEgcGFydGljdWxhciBsb2FkIG1vZGlmaWVzIG9yIHJlYWRzIHRoZSBzcGVjaWZpZWQgbWVtb3J5IGxvY2F0aW9uLgorICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oY29uc3QgTG9hZEluc3QgKkwsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MpOworCisgIC8vLyBnZXRNb2RSZWZJbmZvIChmb3IgbG9hZHMpIC0gQSBjb252ZW5pZW5jZSB3cmFwcGVyLgorICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oY29uc3QgTG9hZEluc3QgKkwsIGNvbnN0IFZhbHVlICpQLCB1aW50NjRfdCBTaXplKSB7CisgICAgcmV0dXJuIGdldE1vZFJlZkluZm8oTCwgTWVtb3J5TG9jYXRpb24oUCwgU2l6ZSkpOworICB9CisKKyAgLy8vIGdldE1vZFJlZkluZm8gKGZvciBzdG9yZXMpIC0gUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIKKyAgLy8vIGEgcGFydGljdWxhciBzdG9yZSBtb2RpZmllcyBvciByZWFkcyB0aGUgc3BlY2lmaWVkIG1lbW9yeSBsb2NhdGlvbi4KKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKGNvbnN0IFN0b3JlSW5zdCAqUywgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvYyk7CisKKyAgLy8vIGdldE1vZFJlZkluZm8gKGZvciBzdG9yZXMpIC0gQSBjb252ZW5pZW5jZSB3cmFwcGVyLgorICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oY29uc3QgU3RvcmVJbnN0ICpTLCBjb25zdCBWYWx1ZSAqUCwgdWludDY0X3QgU2l6ZSkgeworICAgIHJldHVybiBnZXRNb2RSZWZJbmZvKFMsIE1lbW9yeUxvY2F0aW9uKFAsIFNpemUpKTsKKyAgfQorCisgIC8vLyBnZXRNb2RSZWZJbmZvIChmb3IgZmVuY2VzKSAtIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyCisgIC8vLyBhIHBhcnRpY3VsYXIgc3RvcmUgbW9kaWZpZXMgb3IgcmVhZHMgdGhlIHNwZWNpZmllZCBtZW1vcnkgbG9jYXRpb24uCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhjb25zdCBGZW5jZUluc3QgKlMsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MpOworCisgIC8vLyBnZXRNb2RSZWZJbmZvIChmb3IgZmVuY2VzKSAtIEEgY29udmVuaWVuY2Ugd3JhcHBlci4KKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKGNvbnN0IEZlbmNlSW5zdCAqUywgY29uc3QgVmFsdWUgKlAsIHVpbnQ2NF90IFNpemUpIHsKKyAgICByZXR1cm4gZ2V0TW9kUmVmSW5mbyhTLCBNZW1vcnlMb2NhdGlvbihQLCBTaXplKSk7CisgIH0KKworICAvLy8gZ2V0TW9kUmVmSW5mbyAoZm9yIGNtcHhjaGdlcykgLSBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlcgorICAvLy8gYSBwYXJ0aWN1bGFyIGNtcHhjaGcgbW9kaWZpZXMgb3IgcmVhZHMgdGhlIHNwZWNpZmllZCBtZW1vcnkgbG9jYXRpb24uCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhjb25zdCBBdG9taWNDbXBYY2hnSW5zdCAqQ1gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jKTsKKworICAvLy8gZ2V0TW9kUmVmSW5mbyAoZm9yIGNtcHhjaGdlcykgLSBBIGNvbnZlbmllbmNlIHdyYXBwZXIuCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhjb25zdCBBdG9taWNDbXBYY2hnSW5zdCAqQ1gsIGNvbnN0IFZhbHVlICpQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZSkgeworICAgIHJldHVybiBnZXRNb2RSZWZJbmZvKENYLCBNZW1vcnlMb2NhdGlvbihQLCBTaXplKSk7CisgIH0KKworICAvLy8gZ2V0TW9kUmVmSW5mbyAoZm9yIGF0b21pY3Jtd3MpIC0gUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIKKyAgLy8vIGEgcGFydGljdWxhciBhdG9taWNybXcgbW9kaWZpZXMgb3IgcmVhZHMgdGhlIHNwZWNpZmllZCBtZW1vcnkgbG9jYXRpb24uCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhjb25zdCBBdG9taWNSTVdJbnN0ICpSTVcsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MpOworCisgIC8vLyBnZXRNb2RSZWZJbmZvIChmb3IgYXRvbWljcm13cykgLSBBIGNvbnZlbmllbmNlIHdyYXBwZXIuCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhjb25zdCBBdG9taWNSTVdJbnN0ICpSTVcsIGNvbnN0IFZhbHVlICpQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZSkgeworICAgIHJldHVybiBnZXRNb2RSZWZJbmZvKFJNVywgTWVtb3J5TG9jYXRpb24oUCwgU2l6ZSkpOworICB9CisKKyAgLy8vIGdldE1vZFJlZkluZm8gKGZvciB2YV9hcmdzKSAtIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyCisgIC8vLyBhIHBhcnRpY3VsYXIgdmFfYXJnIG1vZGlmaWVzIG9yIHJlYWRzIHRoZSBzcGVjaWZpZWQgbWVtb3J5IGxvY2F0aW9uLgorICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oY29uc3QgVkFBcmdJbnN0ICpJLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jKTsKKworICAvLy8gZ2V0TW9kUmVmSW5mbyAoZm9yIHZhX2FyZ3MpIC0gQSBjb252ZW5pZW5jZSB3cmFwcGVyLgorICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oY29uc3QgVkFBcmdJbnN0ICpJLCBjb25zdCBWYWx1ZSAqUCwgdWludDY0X3QgU2l6ZSkgeworICAgIHJldHVybiBnZXRNb2RSZWZJbmZvKEksIE1lbW9yeUxvY2F0aW9uKFAsIFNpemUpKTsKKyAgfQorCisgIC8vLyBnZXRNb2RSZWZJbmZvIChmb3IgY2F0Y2hwYWRzKSAtIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyCisgIC8vLyBhIHBhcnRpY3VsYXIgY2F0Y2hwYWQgbW9kaWZpZXMgb3IgcmVhZHMgdGhlIHNwZWNpZmllZCBtZW1vcnkgbG9jYXRpb24uCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhjb25zdCBDYXRjaFBhZEluc3QgKkksIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MpOworCisgIC8vLyBnZXRNb2RSZWZJbmZvIChmb3IgY2F0Y2hwYWRzKSAtIEEgY29udmVuaWVuY2Ugd3JhcHBlci4KKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKGNvbnN0IENhdGNoUGFkSW5zdCAqSSwgY29uc3QgVmFsdWUgKlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplKSB7CisgICAgcmV0dXJuIGdldE1vZFJlZkluZm8oSSwgTWVtb3J5TG9jYXRpb24oUCwgU2l6ZSkpOworICB9CisKKyAgLy8vIGdldE1vZFJlZkluZm8gKGZvciBjYXRjaHJldHMpIC0gUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIKKyAgLy8vIGEgcGFydGljdWxhciBjYXRjaHJldCBtb2RpZmllcyBvciByZWFkcyB0aGUgc3BlY2lmaWVkIG1lbW9yeSBsb2NhdGlvbi4KKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKGNvbnN0IENhdGNoUmV0dXJuSW5zdCAqSSwgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvYyk7CisKKyAgLy8vIGdldE1vZFJlZkluZm8gKGZvciBjYXRjaHJldHMpIC0gQSBjb252ZW5pZW5jZSB3cmFwcGVyLgorICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oY29uc3QgQ2F0Y2hSZXR1cm5JbnN0ICpJLCBjb25zdCBWYWx1ZSAqUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUpIHsKKyAgICByZXR1cm4gZ2V0TW9kUmVmSW5mbyhJLCBNZW1vcnlMb2NhdGlvbihQLCBTaXplKSk7CisgIH0KKworICAvLy8gQ2hlY2sgd2hldGhlciBvciBub3QgYW4gaW5zdHJ1Y3Rpb24gbWF5IHJlYWQgb3Igd3JpdGUgdGhlIG9wdGlvbmFsbHkKKyAgLy8vIHNwZWNpZmllZCBtZW1vcnkgbG9jYXRpb24uCisgIC8vLworICAvLy8KKyAgLy8vIEFuIGluc3RydWN0aW9uIHRoYXQgZG9lc24ndCByZWFkIG9yIHdyaXRlIG1lbW9yeSBtYXkgYmUgdHJpdmlhbGx5IExJQ00nZAorICAvLy8gZm9yIGV4YW1wbGUuCisgIC8vLworICAvLy8gRm9yIGZ1bmN0aW9uIGNhbGxzLCB0aGlzIGRlbGVnYXRlcyB0byB0aGUgYWxpYXMtYW5hbHlzaXMgc3BlY2lmaWMKKyAgLy8vIGNhbGwtc2l0ZSBtb2QtcmVmIGJlaGF2aW9yIHF1ZXJpZXMuIE90aGVyd2lzZSBpdCBkZWxlZ2F0ZXMgdG8gdGhlIHNwZWNpZmljCisgIC8vLyBoZWxwZXJzIGFib3ZlLgorICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oY29uc3QgSW5zdHJ1Y3Rpb24gKkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25hbDxNZW1vcnlMb2NhdGlvbj4gJk9wdExvYykgeworICAgIGlmIChPcHRMb2MgPT0gTm9uZSkgeworICAgICAgaWYgKGF1dG8gQ1MgPSBJbW11dGFibGVDYWxsU2l0ZShJKSkgeworICAgICAgICByZXR1cm4gY3JlYXRlTW9kUmVmSW5mbyhnZXRNb2RSZWZCZWhhdmlvcihDUykpOworICAgICAgfQorICAgIH0KKworICAgIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MgPSBPcHRMb2MuZ2V0VmFsdWVPcihNZW1vcnlMb2NhdGlvbigpKTsKKworICAgIHN3aXRjaCAoSS0+Z2V0T3Bjb2RlKCkpIHsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpWQUFyZzogIHJldHVybiBnZXRNb2RSZWZJbmZvKChjb25zdCBWQUFyZ0luc3QqKUksIExvYyk7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6TG9hZDogICByZXR1cm4gZ2V0TW9kUmVmSW5mbygoY29uc3QgTG9hZEluc3QqKUksICBMb2MpOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlN0b3JlOiAgcmV0dXJuIGdldE1vZFJlZkluZm8oKGNvbnN0IFN0b3JlSW5zdCopSSwgTG9jKTsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGZW5jZTogIHJldHVybiBnZXRNb2RSZWZJbmZvKChjb25zdCBGZW5jZUluc3QqKUksIExvYyk7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6QXRvbWljQ21wWGNoZzoKKyAgICAgIHJldHVybiBnZXRNb2RSZWZJbmZvKChjb25zdCBBdG9taWNDbXBYY2hnSW5zdCopSSwgTG9jKTsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpBdG9taWNSTVc6CisgICAgICByZXR1cm4gZ2V0TW9kUmVmSW5mbygoY29uc3QgQXRvbWljUk1XSW5zdCopSSwgTG9jKTsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpDYWxsOiAgIHJldHVybiBnZXRNb2RSZWZJbmZvKChjb25zdCBDYWxsSW5zdCopSSwgIExvYyk7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6SW52b2tlOiByZXR1cm4gZ2V0TW9kUmVmSW5mbygoY29uc3QgSW52b2tlSW5zdCopSSxMb2MpOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkNhdGNoUGFkOgorICAgICAgcmV0dXJuIGdldE1vZFJlZkluZm8oKGNvbnN0IENhdGNoUGFkSW5zdCAqKUksIExvYyk7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6Q2F0Y2hSZXQ6CisgICAgICByZXR1cm4gZ2V0TW9kUmVmSW5mbygoY29uc3QgQ2F0Y2hSZXR1cm5JbnN0ICopSSwgTG9jKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE1vZFJlZkluZm86Ok5vTW9kUmVmOworICAgIH0KKyAgfQorCisgIC8vLyBBIGNvbnZlbmllbmNlIHdyYXBwZXIgZm9yIGNvbnN0cnVjdGluZyB0aGUgbWVtb3J5IGxvY2F0aW9uLgorICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oY29uc3QgSW5zdHJ1Y3Rpb24gKkksIGNvbnN0IFZhbHVlICpQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZSkgeworICAgIHJldHVybiBnZXRNb2RSZWZJbmZvKEksIE1lbW9yeUxvY2F0aW9uKFAsIFNpemUpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciBhIGNhbGwgYW5kIGFuIGluc3RydWN0aW9uIG1heSByZWZlciB0bworICAvLy8gdGhlIHNhbWUgbWVtb3J5IGxvY2F0aW9ucy4KKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKEluc3RydWN0aW9uICpJLCBJbW11dGFibGVDYWxsU2l0ZSBDYWxsKTsKKworICAvLy8gUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgdHdvIGNhbGwgc2l0ZXMgbWF5IHJlZmVyIHRvIHRoZSBzYW1lIHNldAorICAvLy8gb2YgbWVtb3J5IGxvY2F0aW9ucy4gU2VlIHRoZSBBQSBkb2N1bWVudGF0aW9uIGZvciBkZXRhaWxzOgorICAvLy8gICBodHRwOi8vbGx2bS5vcmcvZG9jcy9BbGlhc0FuYWx5c2lzLmh0bWwjTW9kUmVmSW5mbworICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MxLCBJbW11dGFibGVDYWxsU2l0ZSBDUzIpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHdoZXRoZXIgYSBwYXJ0aWN1bGFyIGNhbGwgc2l0ZSBtb2RpZmllcworICAvLy8gb3IgcmVhZHMgdGhlIHNwZWNpZmllZCBtZW1vcnkgbG9jYXRpb24gXHAgTWVtTG9jIGJlZm9yZSBpbnN0cnVjdGlvbiBccCBJCisgIC8vLyBpbiBhIEJhc2ljQmxvY2suIEFuIG9yZGVyZWQgYmFzaWMgYmxvY2sgXHAgT0JCIGNhbiBiZSB1c2VkIHRvIHNwZWVkIHVwCisgIC8vLyBpbnN0cnVjdGlvbiBvcmRlcmluZyBxdWVyaWVzIGluc2lkZSB0aGUgQmFzaWNCbG9jayBjb250YWluaW5nIFxwIEkuCisgIC8vLyBFYXJseSBleGl0cyBpbiBjYWxsQ2FwdHVyZXNCZWZvcmUgbWF5IGxlYWQgdG8gTW9kUmVmSW5mbzo6TXVzdCBub3QgYmVpbmcKKyAgLy8vIHNldC4KKyAgTW9kUmVmSW5mbyBjYWxsQ2FwdHVyZXNCZWZvcmUoY29uc3QgSW5zdHJ1Y3Rpb24gKkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZNZW1Mb2MsIERvbWluYXRvclRyZWUgKkRULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcmRlcmVkQmFzaWNCbG9jayAqT0JCID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBBIGNvbnZlbmllbmNlIHdyYXBwZXIgdG8gc3ludGhlc2l6ZSBhIG1lbW9yeSBsb2NhdGlvbi4KKyAgTW9kUmVmSW5mbyBjYWxsQ2FwdHVyZXNCZWZvcmUoY29uc3QgSW5zdHJ1Y3Rpb24gKkksIGNvbnN0IFZhbHVlICpQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplLCBEb21pbmF0b3JUcmVlICpEVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JkZXJlZEJhc2ljQmxvY2sgKk9CQiA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gY2FsbENhcHR1cmVzQmVmb3JlKEksIE1lbW9yeUxvY2F0aW9uKFAsIFNpemUpLCBEVCwgT0JCKTsKKyAgfQorCisgIC8vLyBAfQorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIFxuYW1lIEhpZ2hlciBsZXZlbCBtZXRob2RzIGZvciBxdWVyeWluZyBtb2QvcmVmIGluZm9ybWF0aW9uLgorICAvLy8gQHsKKworICAvLy8gQ2hlY2sgaWYgaXQgaXMgcG9zc2libGUgZm9yIGV4ZWN1dGlvbiBvZiB0aGUgc3BlY2lmaWVkIGJhc2ljIGJsb2NrIHRvCisgIC8vLyBtb2RpZnkgdGhlIGxvY2F0aW9uIExvYy4KKyAgYm9vbCBjYW5CYXNpY0Jsb2NrTW9kaWZ5KGNvbnN0IEJhc2ljQmxvY2sgJkJCLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jKTsKKworICAvLy8gQSBjb252ZW5pZW5jZSB3cmFwcGVyIHN5bnRoZXNpemluZyBhIG1lbW9yeSBsb2NhdGlvbi4KKyAgYm9vbCBjYW5CYXNpY0Jsb2NrTW9kaWZ5KGNvbnN0IEJhc2ljQmxvY2sgJkJCLCBjb25zdCBWYWx1ZSAqUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUpIHsKKyAgICByZXR1cm4gY2FuQmFzaWNCbG9ja01vZGlmeShCQiwgTWVtb3J5TG9jYXRpb24oUCwgU2l6ZSkpOworICB9CisKKyAgLy8vIENoZWNrIGlmIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgZXhlY3V0aW9uIG9mIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb25zCisgIC8vLyB0byBtb2RccmVmIChhY2NvcmRpbmcgdG8gdGhlIG1vZGUpIHRoZSBsb2NhdGlvbiBMb2MuCisgIC8vLworICAvLy8gVGhlIGluc3RydWN0aW9ucyB0byBjb25zaWRlciBhcmUgYWxsIG9mIHRoZSBpbnN0cnVjdGlvbnMgaW4gdGhlIHJhbmdlIG9mCisgIC8vLyBbSTEsSTJdIElOQ0xVU0lWRS4gSTEgYW5kIEkyIG11c3QgYmUgaW4gdGhlIHNhbWUgYmFzaWMgYmxvY2suCisgIGJvb2wgY2FuSW5zdHJ1Y3Rpb25SYW5nZU1vZFJlZihjb25zdCBJbnN0cnVjdGlvbiAmSTEsIGNvbnN0IEluc3RydWN0aW9uICZJMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2RSZWZJbmZvIE1vZGUpOworCisgIC8vLyBBIGNvbnZlbmllbmNlIHdyYXBwZXIgc3ludGhlc2l6aW5nIGEgbWVtb3J5IGxvY2F0aW9uLgorICBib29sIGNhbkluc3RydWN0aW9uUmFuZ2VNb2RSZWYoY29uc3QgSW5zdHJ1Y3Rpb24gJkkxLCBjb25zdCBJbnN0cnVjdGlvbiAmSTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqUHRyLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTW9kUmVmSW5mbyBNb2RlKSB7CisgICAgcmV0dXJuIGNhbkluc3RydWN0aW9uUmFuZ2VNb2RSZWYoSTEsIEkyLCBNZW1vcnlMb2NhdGlvbihQdHIsIFNpemUpLCBNb2RlKTsKKyAgfQorCitwcml2YXRlOgorICBjbGFzcyBDb25jZXB0OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBNb2RlbDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIEFBUmVzdWx0QmFzZTsKKworICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAmVExJOworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxDb25jZXB0Pj4gQUFzOworCisgIHN0ZDo6dmVjdG9yPEFuYWx5c2lzS2V5ICo+IEFBRGVwczsKK307CisKKy8vLyBUZW1wb3JhcnkgdHlwZWRlZiBmb3IgbGVnYWN5IGNvZGUgdGhhdCB1c2VzIGEgZ2VuZXJpYyBcYyBBbGlhc0FuYWx5c2lzCisvLy8gcG9pbnRlciBvciByZWZlcmVuY2UuCit1c2luZyBBbGlhc0FuYWx5c2lzID0gQUFSZXN1bHRzOworCisvLy8gQSBwcml2YXRlIGFic3RyYWN0IGJhc2UgY2xhc3MgZGVzY3JpYmluZyB0aGUgY29uY2VwdCBvZiBhbiBpbmRpdmlkdWFsIGFsaWFzCisvLy8gYW5hbHlzaXMgaW1wbGVtZW50YXRpb24uCisvLy8KKy8vLyBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBhbnkgXGMgTW9kZWwgaW5zdGFudGlhdGlvbi4gSXQgaXMgYWxzbyB0aGUKKy8vLyBpbnRlcmZhY2Ugd2hpY2ggYSB0eXBlIHVzZWQgdG8gaW5zdGFudGlhdGUgdGhlIG1vZGVsIG11c3QgcHJvdmlkZS4KKy8vLworLy8vIEFsbCBvZiB0aGVzZSBtZXRob2RzIG1vZGVsIG1ldGhvZHMgYnkgdGhlIHNhbWUgbmFtZSBpbiB0aGUgXGMKKy8vLyBBQVJlc3VsdHMgY2xhc3MuIE9ubHkgZGlmZmVyZW5jZXMgYW5kIHNwZWNpZmljcyB0byBob3cgdGhlCisvLy8gaW1wbGVtZW50YXRpb25zIGFyZSBjYWxsZWQgYXJlIGRvY3VtZW50ZWQgaGVyZS4KK2NsYXNzIEFBUmVzdWx0czo6Q29uY2VwdCB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkNvbmNlcHQoKSA9IDA7CisKKyAgLy8vIEFuIHVwZGF0ZSBBUEkgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBBQVJlc3VsdHMgdG8gcHJvdmlkZQorICAvLy8gYSBoYW5kbGUgYmFjayB0byB0aGUgdG9wIGxldmVsIGFnZ3JlZ2F0aW9uLgorICB2aXJ0dWFsIHZvaWQgc2V0QUFSZXN1bHRzKEFBUmVzdWx0cyAqTmV3QUFSKSA9IDA7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBcbmFtZSBBbGlhcyBRdWVyaWVzCisgIC8vLyBAeworCisgIC8vLyBUaGUgbWFpbiBsb3cgbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBhbGlhcyBhbmFseXNpcyBpbXBsZW1lbnRhdGlvbi4KKyAgLy8vIFJldHVybnMgYW4gQWxpYXNSZXN1bHQgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSB0d28gcG9pbnRlcnMgYXJlIGFsaWFzZWQgdG8KKyAgLy8vIGVhY2ggb3RoZXIuIFRoaXMgaXMgdGhlIGludGVyZmFjZSB0aGF0IG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgc3BlY2lmaWMKKyAgLy8vIGFsaWFzIGFuYWx5c2lzIGltcGxlbWVudGF0aW9ucy4KKyAgdmlydHVhbCBBbGlhc1Jlc3VsdCBhbGlhcyhjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jQikgPSAwOworCisgIC8vLyBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gbG9jYXRpb24gcG9pbnRzIHRvIGNvbnN0YW50IG1lbW9yeSwgb3IgaWYKKyAgLy8vIFxwIE9yTG9jYWwgaXMgdHJ1ZSB3aGV0aGVyIGl0IHBvaW50cyB0byBhIGxvY2FsIGFsbG9jYS4KKyAgdmlydHVhbCBib29sIHBvaW50c1RvQ29uc3RhbnRNZW1vcnkoY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPckxvY2FsKSA9IDA7CisKKyAgLy8vIEB9CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gXG5hbWUgU2ltcGxlIG1vZC9yZWYgaW5mb3JtYXRpb24KKyAgLy8vIEB7CisKKyAgLy8vIEdldCB0aGUgTW9kUmVmIGluZm8gYXNzb2NpYXRlZCB3aXRoIGEgcG9pbnRlciBhcmd1bWVudCBvZiBhIGNhbGxzaXRlLiBUaGUKKyAgLy8vIHJlc3VsdCdzIGJpdHMgYXJlIHNldCB0byBpbmRpY2F0ZSB0aGUgYWxsb3dlZCBhbGlhc2luZyBNb2RSZWYga2luZHMuIE5vdGUKKyAgLy8vIHRoYXQgdGhlc2UgYml0cyBkbyBub3QgbmVjZXNzYXJpbHkgYWNjb3VudCBmb3IgdGhlIG92ZXJhbGwgYmVoYXZpb3Igb2YKKyAgLy8vIHRoZSBmdW5jdGlvbiwgYnV0IHJhdGhlciBvbmx5IHByb3ZpZGUgYWRkaXRpb25hbCBwZXItYXJndW1lbnQKKyAgLy8vIGluZm9ybWF0aW9uLgorICB2aXJ0dWFsIE1vZFJlZkluZm8gZ2V0QXJnTW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXJnSWR4KSA9IDA7CisKKyAgLy8vIFJldHVybiB0aGUgYmVoYXZpb3Igb2YgdGhlIGdpdmVuIGNhbGwgc2l0ZS4KKyAgdmlydHVhbCBGdW5jdGlvbk1vZFJlZkJlaGF2aW9yIGdldE1vZFJlZkJlaGF2aW9yKEltbXV0YWJsZUNhbGxTaXRlIENTKSA9IDA7CisKKyAgLy8vIFJldHVybiB0aGUgYmVoYXZpb3Igd2hlbiBjYWxsaW5nIHRoZSBnaXZlbiBmdW5jdGlvbi4KKyAgdmlydHVhbCBGdW5jdGlvbk1vZFJlZkJlaGF2aW9yIGdldE1vZFJlZkJlaGF2aW9yKGNvbnN0IEZ1bmN0aW9uICpGKSA9IDA7CisKKyAgLy8vIGdldE1vZFJlZkluZm8gKGZvciBjYWxsIHNpdGVzKSAtIFJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB3aGV0aGVyCisgIC8vLyBhIHBhcnRpY3VsYXIgY2FsbCBzaXRlIG1vZGlmaWVzIG9yIHJlYWRzIHRoZSBzcGVjaWZpZWQgbWVtb3J5IGxvY2F0aW9uLgorICB2aXJ0dWFsIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvYykgPSAwOworCisgIC8vLyBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgd2hldGhlciB0d28gY2FsbCBzaXRlcyBtYXkgcmVmZXIgdG8gdGhlIHNhbWUgc2V0CisgIC8vLyBvZiBtZW1vcnkgbG9jYXRpb25zLiBTZWUgdGhlIEFBIGRvY3VtZW50YXRpb24gZm9yIGRldGFpbHM6CisgIC8vLyAgIGh0dHA6Ly9sbHZtLm9yZy9kb2NzL0FsaWFzQW5hbHlzaXMuaHRtbCNNb2RSZWZJbmZvCisgIHZpcnR1YWwgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlQ2FsbFNpdGUgQ1MyKSA9IDA7CisKKyAgLy8vIEB9Cit9OworCisvLy8gQSBwcml2YXRlIGNsYXNzIHRlbXBsYXRlIHdoaWNoIGRlcml2ZXMgZnJvbSBcYyBDb25jZXB0IGFuZCB3cmFwcyBzb21lIG90aGVyCisvLy8gdHlwZS4KKy8vLworLy8vIFRoaXMgbW9kZWxzIHRoZSBjb25jZXB0IGJ5IGRpcmVjdGx5IGZvcndhcmRpbmcgZWFjaCBpbnRlcmZhY2UgcG9pbnQgdG8gdGhlCisvLy8gd3JhcHBlZCB0eXBlIHdoaWNoIG11c3QgaW1wbGVtZW50IGEgY29tcGF0aWJsZSBpbnRlcmZhY2UuIFRoaXMgcHJvdmlkZXMKKy8vLyBhIHR5cGUgZXJhc2VkIGJpbmRpbmcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQUFSZXN1bHRUPiBjbGFzcyBBQVJlc3VsdHM6Ok1vZGVsIGZpbmFsIDogcHVibGljIENvbmNlcHQgeworICBBQVJlc3VsdFQgJlJlc3VsdDsKKworcHVibGljOgorICBleHBsaWNpdCBNb2RlbChBQVJlc3VsdFQgJlJlc3VsdCwgQUFSZXN1bHRzICZBQVIpIDogUmVzdWx0KFJlc3VsdCkgeworICAgIFJlc3VsdC5zZXRBQVJlc3VsdHMoJkFBUik7CisgIH0KKyAgfk1vZGVsKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgIHZvaWQgc2V0QUFSZXN1bHRzKEFBUmVzdWx0cyAqTmV3QUFSKSBvdmVycmlkZSB7IFJlc3VsdC5zZXRBQVJlc3VsdHMoTmV3QUFSKTsgfQorCisgIEFsaWFzUmVzdWx0IGFsaWFzKGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2NBLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jQikgb3ZlcnJpZGUgeworICAgIHJldHVybiBSZXN1bHQuYWxpYXMoTG9jQSwgTG9jQik7CisgIH0KKworICBib29sIHBvaW50c1RvQ29uc3RhbnRNZW1vcnkoY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT3JMb2NhbCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBSZXN1bHQucG9pbnRzVG9Db25zdGFudE1lbW9yeShMb2MsIE9yTG9jYWwpOworICB9CisKKyAgTW9kUmVmSW5mbyBnZXRBcmdNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTLCB1bnNpZ25lZCBBcmdJZHgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUmVzdWx0LmdldEFyZ01vZFJlZkluZm8oQ1MsIEFyZ0lkeCk7CisgIH0KKworICBGdW5jdGlvbk1vZFJlZkJlaGF2aW9yIGdldE1vZFJlZkJlaGF2aW9yKEltbXV0YWJsZUNhbGxTaXRlIENTKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIFJlc3VsdC5nZXRNb2RSZWZCZWhhdmlvcihDUyk7CisgIH0KKworICBGdW5jdGlvbk1vZFJlZkJlaGF2aW9yIGdldE1vZFJlZkJlaGF2aW9yKGNvbnN0IEZ1bmN0aW9uICpGKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIFJlc3VsdC5nZXRNb2RSZWZCZWhhdmlvcihGKTsKKyAgfQorCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUmVzdWx0LmdldE1vZFJlZkluZm8oQ1MsIExvYyk7CisgIH0KKworICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlQ2FsbFNpdGUgQ1MyKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIFJlc3VsdC5nZXRNb2RSZWZJbmZvKENTMSwgQ1MyKTsKKyAgfQorfTsKKworLy8vIEEgQ1JUUC1kcml2ZW4gIm1peGluIiBiYXNlIGNsYXNzIHRvIGhlbHAgaW1wbGVtZW50IHRoZSBmdW5jdGlvbiBhbGlhcworLy8vIGFuYWx5c2lzIHJlc3VsdHMgY29uY2VwdC4KKy8vLworLy8vIEJlY2F1c2Ugb2YgdGhlIG5hdHVyZSBvZiBtYW55IGFsaWFzIGFuYWx5c2lzIGltcGxlbWVudGF0aW9ucywgdGhleSBvZnRlbgorLy8vIG9ubHkgaW1wbGVtZW50IGEgc3Vic2V0IG9mIHRoZSBpbnRlcmZhY2UuIFRoaXMgYmFzZSBjbGFzcyB3aWxsIGF0dGVtcHQgdG8KKy8vLyBpbXBsZW1lbnQgdGhlIHJlbWFpbmluZyBwb3J0aW9ucyBvZiB0aGUgaW50ZXJmYWNlIGluIHRlcm1zIG9mIHNpbXBsZXIgZm9ybXMKKy8vLyBvZiB0aGUgaW50ZXJmYWNlIHdoZXJlIHBvc3NpYmxlLCBhbmQgb3RoZXJ3aXNlIHByb3ZpZGUgY29uc2VydmF0aXZlbHkKKy8vLyBjb3JyZWN0IGZhbGxiYWNrIGltcGxlbWVudGF0aW9ucy4KKy8vLworLy8vIEltcGxlbWVudG9ycyBvZiBhbiBhbGlhcyBhbmFseXNpcyBzaG91bGQgZGVyaXZlIGZyb20gdGhpcyBDUlRQLCBhbmQgdGhlbgorLy8vIG92ZXJyaWRlIHNwZWNpZmljIG1ldGhvZHMgdGhhdCB0aGV5IHdpc2ggdG8gY3VzdG9taXplLiBUaGVyZSBpcyBubyBuZWVkIHRvCisvLy8gdXNlIHZpcnR1YWwgYW55d2hlcmUsIHRoZSBDUlRQIGJhc2UgY2xhc3MgZG9lcyBzdGF0aWMgZGlzcGF0Y2ggdG8gdGhlCisvLy8gZGVyaXZlZCB0eXBlIHBhc3NlZCBpbnRvIGl0LgordGVtcGxhdGUgPHR5cGVuYW1lIERlcml2ZWRUPiBjbGFzcyBBQVJlc3VsdEJhc2UgeworICAvLyBFeHBvc2Ugc29tZSBwYXJ0cyBvZiB0aGUgaW50ZXJmYWNlIG9ubHkgdG8gdGhlIEFBUmVzdWx0czo6TW9kZWwKKyAgLy8gZm9yIHdyYXBwaW5nLiBTcGVjaWZpY2FsbHksIHRoaXMgYWxsb3dzIHRoZSBtb2RlbCB0byBjYWxsIG91cgorICAvLyBzZXRBQVJlc3VsdHMgbWV0aG9kIHdpdGhvdXQgZXhwb3NpbmcgaXQgYXMgYSBmdWxseSBwdWJsaWMgQVBJLgorICBmcmllbmQgY2xhc3MgQUFSZXN1bHRzOjpNb2RlbDxEZXJpdmVkVD47CisKKyAgLy8vIEEgcG9pbnRlciB0byB0aGUgQUFSZXN1bHRzIG9iamVjdCB0aGF0IHRoaXMgQUFSZXN1bHQgaXMKKyAgLy8vIGFnZ3JlZ2F0ZWQgd2l0aGluLiBNYXkgYmUgbnVsbCBpZiBub3QgYWdncmVnYXRlZC4KKyAgQUFSZXN1bHRzICpBQVI7CisKKyAgLy8vIEhlbHBlciB0byBkaXNwYXRjaCBjYWxscyBiYWNrIHRocm91Z2ggdGhlIGRlcml2ZWQgdHlwZS4KKyAgRGVyaXZlZFQgJmRlcml2ZWQoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkVCAmPigqdGhpcyk7IH0KKworICAvLy8gQSBzZXR0ZXIgZm9yIHRoZSBBQVJlc3VsdHMgcG9pbnRlciwgd2hpY2ggaXMgdXNlZCB0byBzYXRpc2Z5IHRoZQorICAvLy8gQUFSZXN1bHRzOjpNb2RlbCBjb250cmFjdC4KKyAgdm9pZCBzZXRBQVJlc3VsdHMoQUFSZXN1bHRzICpOZXdBQVIpIHsgQUFSID0gTmV3QUFSOyB9CisKK3Byb3RlY3RlZDoKKyAgLy8vIFRoaXMgcHJveHkgY2xhc3MgbW9kZWxzIGEgY29tbW9uIHBhdHRlcm4gd2hlcmUgd2UgZGVsZWdhdGUgdG8gZWl0aGVyIHRoZQorICAvLy8gdG9wLWxldmVsIFxjIEFBUmVzdWx0cyBhZ2dyZWdhdGlvbiBpZiBvbmUgaXMgcmVnaXN0ZXJlZCwgb3IgdG8gdGhlCisgIC8vLyBjdXJyZW50IHJlc3VsdCBpZiBub25lIGFyZSByZWdpc3RlcmVkLgorICBjbGFzcyBBQVJlc3VsdHNQcm94eSB7CisgICAgQUFSZXN1bHRzICpBQVI7CisgICAgRGVyaXZlZFQgJkN1cnJlbnRSZXN1bHQ7CisKKyAgcHVibGljOgorICAgIEFBUmVzdWx0c1Byb3h5KEFBUmVzdWx0cyAqQUFSLCBEZXJpdmVkVCAmQ3VycmVudFJlc3VsdCkKKyAgICAgICAgOiBBQVIoQUFSKSwgQ3VycmVudFJlc3VsdChDdXJyZW50UmVzdWx0KSB7fQorCisgICAgQWxpYXNSZXN1bHQgYWxpYXMoY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvY0EsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2NCKSB7CisgICAgICByZXR1cm4gQUFSID8gQUFSLT5hbGlhcyhMb2NBLCBMb2NCKSA6IEN1cnJlbnRSZXN1bHQuYWxpYXMoTG9jQSwgTG9jQik7CisgICAgfQorCisgICAgYm9vbCBwb2ludHNUb0NvbnN0YW50TWVtb3J5KGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MsIGJvb2wgT3JMb2NhbCkgeworICAgICAgcmV0dXJuIEFBUiA/IEFBUi0+cG9pbnRzVG9Db25zdGFudE1lbW9yeShMb2MsIE9yTG9jYWwpCisgICAgICAgICAgICAgICAgIDogQ3VycmVudFJlc3VsdC5wb2ludHNUb0NvbnN0YW50TWVtb3J5KExvYywgT3JMb2NhbCk7CisgICAgfQorCisgICAgTW9kUmVmSW5mbyBnZXRBcmdNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTLCB1bnNpZ25lZCBBcmdJZHgpIHsKKyAgICAgIHJldHVybiBBQVIgPyBBQVItPmdldEFyZ01vZFJlZkluZm8oQ1MsIEFyZ0lkeCkgOiBDdXJyZW50UmVzdWx0LmdldEFyZ01vZFJlZkluZm8oQ1MsIEFyZ0lkeCk7CisgICAgfQorCisgICAgRnVuY3Rpb25Nb2RSZWZCZWhhdmlvciBnZXRNb2RSZWZCZWhhdmlvcihJbW11dGFibGVDYWxsU2l0ZSBDUykgeworICAgICAgcmV0dXJuIEFBUiA/IEFBUi0+Z2V0TW9kUmVmQmVoYXZpb3IoQ1MpIDogQ3VycmVudFJlc3VsdC5nZXRNb2RSZWZCZWhhdmlvcihDUyk7CisgICAgfQorCisgICAgRnVuY3Rpb25Nb2RSZWZCZWhhdmlvciBnZXRNb2RSZWZCZWhhdmlvcihjb25zdCBGdW5jdGlvbiAqRikgeworICAgICAgcmV0dXJuIEFBUiA/IEFBUi0+Z2V0TW9kUmVmQmVoYXZpb3IoRikgOiBDdXJyZW50UmVzdWx0LmdldE1vZFJlZkJlaGF2aW9yKEYpOworICAgIH0KKworICAgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUywgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvYykgeworICAgICAgcmV0dXJuIEFBUiA/IEFBUi0+Z2V0TW9kUmVmSW5mbyhDUywgTG9jKQorICAgICAgICAgICAgICAgICA6IEN1cnJlbnRSZXN1bHQuZ2V0TW9kUmVmSW5mbyhDUywgTG9jKTsKKyAgICB9CisKKyAgICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MxLCBJbW11dGFibGVDYWxsU2l0ZSBDUzIpIHsKKyAgICAgIHJldHVybiBBQVIgPyBBQVItPmdldE1vZFJlZkluZm8oQ1MxLCBDUzIpIDogQ3VycmVudFJlc3VsdC5nZXRNb2RSZWZJbmZvKENTMSwgQ1MyKTsKKyAgICB9CisgIH07CisKKyAgZXhwbGljaXQgQUFSZXN1bHRCYXNlKCkgPSBkZWZhdWx0OworCisgIC8vIFByb3ZpZGUgYWxsIHRoZSBjb3B5IGFuZCBtb3ZlIGNvbnN0cnVjdG9ycyBzbyB0aGF0IGRlcml2ZWQgdHlwZXMgYXJlbid0CisgIC8vIGNvbnN0cmFpbmVkLgorICBBQVJlc3VsdEJhc2UoY29uc3QgQUFSZXN1bHRCYXNlICZBcmcpIHt9CisgIEFBUmVzdWx0QmFzZShBQVJlc3VsdEJhc2UgJiZBcmcpIHt9CisKKyAgLy8vIEdldCBhIHByb3h5IGZvciB0aGUgYmVzdCBBQSByZXN1bHQgc2V0IHRvIHF1ZXJ5IGF0IHRoaXMgdGltZS4KKyAgLy8vCisgIC8vLyBXaGVuIHRoaXMgcmVzdWx0IGlzIHBhcnQgb2YgYSBsYXJnZXIgYWdncmVnYXRpb24sIHRoaXMgd2lsbCBwcm94eSB0byB0aGF0CisgIC8vLyBhZ2dyZWdhdGlvbi4gV2hlbiB0aGlzIHJlc3VsdCBpcyB1c2VkIGluIGlzb2xhdGlvbiwgaXQgd2lsbCBqdXN0IGRlbGVnYXRlCisgIC8vLyBiYWNrIHRvIHRoZSBkZXJpdmVkIGNsYXNzJ3MgaW1wbGVtZW50YXRpb24uCisgIC8vLworICAvLy8gTm90ZSB0aGF0IGNhbGxlcnMgb2YgdGhpcyBuZWVkIHRvIHRha2UgY29uc2lkZXJhYmxlIGNhcmUgdG8gbm90IGNhdXNlCisgIC8vLyBwZXJmb3JtYW5jZSBwcm9ibGVtcyB3aGVuIHRoZXkgdXNlIHRoaXMgcm91dGluZSwgaW4gdGhlIGNhc2Ugb2YgYSBsYXJnZQorICAvLy8gbnVtYmVyIG9mIGFsaWFzIGFuYWx5c2VzIGJlaW5nIGFnZ3JlZ2F0ZWQsIGl0IGNhbiBiZSBleHBlbnNpdmUgdG8gd2FsaworICAvLy8gYmFjayBhY3Jvc3MgdGhlIGNoYWluLgorICBBQVJlc3VsdHNQcm94eSBnZXRCZXN0QUFSZXN1bHRzKCkgeyByZXR1cm4gQUFSZXN1bHRzUHJveHkoQUFSLCBkZXJpdmVkKCkpOyB9CisKK3B1YmxpYzoKKyAgQWxpYXNSZXN1bHQgYWxpYXMoY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvY0EsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2NCKSB7CisgICAgcmV0dXJuIE1heUFsaWFzOworICB9CisKKyAgYm9vbCBwb2ludHNUb0NvbnN0YW50TWVtb3J5KGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MsIGJvb2wgT3JMb2NhbCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIE1vZFJlZkluZm8gZ2V0QXJnTW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUywgdW5zaWduZWQgQXJnSWR4KSB7CisgICAgcmV0dXJuIE1vZFJlZkluZm86Ok1vZFJlZjsKKyAgfQorCisgIEZ1bmN0aW9uTW9kUmVmQmVoYXZpb3IgZ2V0TW9kUmVmQmVoYXZpb3IoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MpIHsKKyAgICByZXR1cm4gRk1SQl9Vbmtub3duTW9kUmVmQmVoYXZpb3I7CisgIH0KKworICBGdW5jdGlvbk1vZFJlZkJlaGF2aW9yIGdldE1vZFJlZkJlaGF2aW9yKGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgICAgcmV0dXJuIEZNUkJfVW5rbm93bk1vZFJlZkJlaGF2aW9yOworICB9CisKKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jKSB7CisgICAgcmV0dXJuIE1vZFJlZkluZm86Ok1vZFJlZjsKKyAgfQorCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUzEsIEltbXV0YWJsZUNhbGxTaXRlIENTMikgeworICAgIHJldHVybiBNb2RSZWZJbmZvOjpNb2RSZWY7CisgIH0KK307CisKKy8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHBvaW50ZXIgaXMgcmV0dXJuZWQgYnkgYSBub2FsaWFzIGZ1bmN0aW9uLgorYm9vbCBpc05vQWxpYXNDYWxsKGNvbnN0IFZhbHVlICpWKTsKKworLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gYXJndW1lbnQgd2l0aCB0aGUgbm9hbGlhcyBhdHRyaWJ1dGUuCitib29sIGlzTm9BbGlhc0FyZ3VtZW50KGNvbnN0IFZhbHVlICpWKTsKKworLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgcG9pbnRlciByZWZlcnMgdG8gYSBkaXN0aW5jdCBhbmQgaWRlbnRpZmlhYmxlIG9iamVjdC4KKy8vLyBUaGlzIHJldHVybnMgdHJ1ZSBmb3I6CisvLy8gICAgR2xvYmFsIFZhcmlhYmxlcyBhbmQgRnVuY3Rpb25zIChidXQgbm90IEdsb2JhbCBBbGlhc2VzKQorLy8vICAgIEFsbG9jYXMKKy8vLyAgICBCeVZhbCBhbmQgTm9BbGlhcyBBcmd1bWVudHMKKy8vLyAgICBOb0FsaWFzIHJldHVybnMgKGUuZy4gY2FsbHMgdG8gbWFsbG9jKQorLy8vCitib29sIGlzSWRlbnRpZmllZE9iamVjdChjb25zdCBWYWx1ZSAqVik7CisKKy8vLyBSZXR1cm4gdHJ1ZSBpZiBWIGlzIHVtYWJpZ291c2x5IGlkZW50aWZpZWQgYXQgdGhlIGZ1bmN0aW9uLWxldmVsLgorLy8vIERpZmZlcmVudCBJZGVudGlmaWVkRnVuY3Rpb25Mb2NhbHMgY2FuJ3QgYWxpYXMuCisvLy8gRnVydGhlciwgYW4gSWRlbnRpZmllZEZ1bmN0aW9uTG9jYWwgY2FuIG5vdCBhbGlhcyB3aXRoIGFueSBmdW5jdGlvbgorLy8vIGFyZ3VtZW50cyBvdGhlciB0aGFuIGl0c2VsZiwgd2hpY2ggaXMgbm90IG5lY2Vzc2FyaWx5IHRydWUgZm9yCisvLy8gSWRlbnRpZmllZE9iamVjdHMuCitib29sIGlzSWRlbnRpZmllZEZ1bmN0aW9uTG9jYWwoY29uc3QgVmFsdWUgKlYpOworCisvLy8gQSBtYW5hZ2VyIGZvciBhbGlhcyBhbmFseXNlcy4KKy8vLworLy8vIFRoaXMgY2xhc3MgY2FuIGhhdmUgYW5hbHlzZXMgcmVnaXN0ZXJlZCB3aXRoIGl0IGFuZCB3aGVuIHJ1biwgaXQgd2lsbCBydW4KKy8vLyBhbGwgb2YgdGhlbSBhbmQgYWdncmVnYXRlIHRoZWlyIHJlc3VsdHMgaW50byBzaW5nbGUgQUEgcmVzdWx0cyBpbnRlcmZhY2UKKy8vLyB0aGF0IGRpc3BhdGNoZXMgYWNyb3NzIGFsbCBvZiB0aGUgYWxpYXMgYW5hbHlzaXMgcmVzdWx0cyBhdmFpbGFibGUuCisvLy8KKy8vLyBOb3RlIHRoYXQgdGhlIG9yZGVyIGluIHdoaWNoIGFuYWx5c2VzIGFyZSByZWdpc3RlcmVkIGlzIHZlcnkgc2lnbmlmaWNhbnQuCisvLy8gVGhhdCBpcyB0aGUgb3JkZXIgaW4gd2hpY2ggdGhlIHJlc3VsdHMgd2lsbCBiZSBhZ2dyZWdhdGVkIGFuZCBxdWVyaWVkLgorLy8vCisvLy8gVGhpcyBtYW5hZ2VyIGVmZmVjdGl2ZWx5IHdyYXBzIHRoZSBBbmFseXNpc01hbmFnZXIgZm9yIHJlZ2lzdGVyaW5nIGFsaWFzCisvLy8gYW5hbHlzZXMuIFdoZW4geW91IHJlZ2lzdGVyIHlvdXIgYWxpYXMgYW5hbHlzaXMgd2l0aCB0aGlzIG1hbmFnZXIsIGl0IHdpbGwKKy8vLyBlbnN1cmUgdGhlIGFuYWx5c2lzIGl0c2VsZiBpcyByZWdpc3RlcmVkIHdpdGggaXRzIEFuYWx5c2lzTWFuYWdlci4KK2NsYXNzIEFBTWFuYWdlciA6IHB1YmxpYyBBbmFseXNpc0luZm9NaXhpbjxBQU1hbmFnZXI+IHsKK3B1YmxpYzoKKyAgdXNpbmcgUmVzdWx0ID0gQUFSZXN1bHRzOworCisgIC8vLyBSZWdpc3RlciBhIHNwZWNpZmljIEFBIHJlc3VsdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFuYWx5c2lzVD4gdm9pZCByZWdpc3RlckZ1bmN0aW9uQW5hbHlzaXMoKSB7CisgICAgUmVzdWx0R2V0dGVycy5wdXNoX2JhY2soJmdldEZ1bmN0aW9uQUFSZXN1bHRJbXBsPEFuYWx5c2lzVD4pOworICB9CisKKyAgLy8vIFJlZ2lzdGVyIGEgc3BlY2lmaWMgQUEgcmVzdWx0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQW5hbHlzaXNUPiB2b2lkIHJlZ2lzdGVyTW9kdWxlQW5hbHlzaXMoKSB7CisgICAgUmVzdWx0R2V0dGVycy5wdXNoX2JhY2soJmdldE1vZHVsZUFBUmVzdWx0SW1wbDxBbmFseXNpc1Q+KTsKKyAgfQorCisgIFJlc3VsdCBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSkgeworICAgIFJlc3VsdCBSKEFNLmdldFJlc3VsdDxUYXJnZXRMaWJyYXJ5QW5hbHlzaXM+KEYpKTsKKyAgICBmb3IgKGF1dG8gJkdldHRlciA6IFJlc3VsdEdldHRlcnMpCisgICAgICAoKkdldHRlcikoRiwgQU0sIFIpOworICAgIHJldHVybiBSOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxBQU1hbmFnZXI+OworCisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7CisKKyAgU21hbGxWZWN0b3I8dm9pZCAoKikoRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgQUFSZXN1bHRzICZBQVJlc3VsdHMpLAorICAgICAgICAgICAgICA0PiBSZXN1bHRHZXR0ZXJzOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBbmFseXNpc1Q+CisgIHN0YXRpYyB2b2lkIGdldEZ1bmN0aW9uQUFSZXN1bHRJbXBsKEZ1bmN0aW9uICZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFBUmVzdWx0cyAmQUFSZXN1bHRzKSB7CisgICAgQUFSZXN1bHRzLmFkZEFBUmVzdWx0KEFNLnRlbXBsYXRlIGdldFJlc3VsdDxBbmFseXNpc1Q+KEYpKTsKKyAgICBBQVJlc3VsdHMuYWRkQUFEZXBlbmRlbmN5SUQoQW5hbHlzaXNUOjpJRCgpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBbmFseXNpc1Q+CisgIHN0YXRpYyB2b2lkIGdldE1vZHVsZUFBUmVzdWx0SW1wbChGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQUFSZXN1bHRzICZBQVJlc3VsdHMpIHsKKyAgICBhdXRvICZNQU1Qcm94eSA9IEFNLmdldFJlc3VsdDxNb2R1bGVBbmFseXNpc01hbmFnZXJGdW5jdGlvblByb3h5PihGKTsKKyAgICBhdXRvICZNQU0gPSBNQU1Qcm94eS5nZXRNYW5hZ2VyKCk7CisgICAgaWYgKGF1dG8gKlIgPSBNQU0udGVtcGxhdGUgZ2V0Q2FjaGVkUmVzdWx0PEFuYWx5c2lzVD4oKkYuZ2V0UGFyZW50KCkpKSB7CisgICAgICBBQVJlc3VsdHMuYWRkQUFSZXN1bHQoKlIpOworICAgICAgTUFNUHJveHkKKyAgICAgICAgICAudGVtcGxhdGUgcmVnaXN0ZXJPdXRlckFuYWx5c2lzSW52YWxpZGF0aW9uPEFuYWx5c2lzVCwgQUFNYW5hZ2VyPigpOworICAgIH0KKyAgfQorfTsKKworLy8vIEEgd3JhcHBlciBwYXNzIHRvIHByb3ZpZGUgdGhlIGxlZ2FjeSBwYXNzIG1hbmFnZXIgYWNjZXNzIHRvIGEgc3VpdGFibHkKKy8vLyBwcmVwYXJlZCBBQVJlc3VsdHMgb2JqZWN0LgorY2xhc3MgQUFSZXN1bHRzV3JhcHBlclBhc3MgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgc3RkOjp1bmlxdWVfcHRyPEFBUmVzdWx0cz4gQUFSOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIEFBUmVzdWx0c1dyYXBwZXJQYXNzKCk7CisKKyAgQUFSZXN1bHRzICZnZXRBQVJlc3VsdHMoKSB7IHJldHVybiAqQUFSOyB9CisgIGNvbnN0IEFBUmVzdWx0cyAmZ2V0QUFSZXN1bHRzKCkgY29uc3QgeyByZXR1cm4gKkFBUjsgfQorCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgb3ZlcnJpZGU7CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKK307CisKK0Z1bmN0aW9uUGFzcyAqY3JlYXRlQUFSZXN1bHRzV3JhcHBlclBhc3MoKTsKKworLy8vIEEgd3JhcHBlciBwYXNzIGFyb3VuZCBhIGNhbGxiYWNrIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHBvcHVsYXRlIHRoZQorLy8vIEFBUmVzdWx0cyBpbiB0aGUgQUFSZXN1bHRzV3JhcHBlclBhc3MgZnJvbSBhbiBleHRlcm5hbCBBQS4KKy8vLworLy8vIFRoZSBjYWxsYmFjayBwcm92aWRlZCBoZXJlIHdpbGwgYmUgdXNlZCBlYWNoIHRpbWUgd2UgcHJlcGFyZSBhbiBBQVJlc3VsdHMKKy8vLyBvYmplY3QsIGFuZCB3aWxsIHJlY2VpdmUgYSByZWZlcmVuY2UgdG8gdGhlIGZ1bmN0aW9uIHdyYXBwZXIgcGFzcywgdGhlCisvLy8gZnVuY3Rpb24sIGFuZCB0aGUgQUFSZXN1bHRzIG9iamVjdCB0byBwb3B1bGF0ZS4gVGhpcyBzaG91bGQgYmUgdXNlZCB3aGVuCisvLy8gc2V0dGluZyB1cCBhIGN1c3RvbSBwYXNzIHBpcGVsaW5lIHRvIGluamVjdCBhIGhvb2sgaW50byB0aGUgQUEgcmVzdWx0cy4KK0ltbXV0YWJsZVBhc3MgKmNyZWF0ZUV4dGVybmFsQUFXcmFwcGVyUGFzcygKKyAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoUGFzcyAmLCBGdW5jdGlvbiAmLCBBQVJlc3VsdHMgJik+IENhbGxiYWNrKTsKKworLy8vIEEgaGVscGVyIGZvciB0aGUgbGVnYWN5IHBhc3MgbWFuYWdlciB0byBjcmVhdGUgYSBcYyBBQVJlc3VsdHMKKy8vLyBvYmplY3QgcG9wdWxhdGVkIHRvIHRoZSBiZXN0IG9mIG91ciBhYmlsaXR5IGZvciBhIHBhcnRpY3VsYXIgZnVuY3Rpb24gd2hlbgorLy8vIGluc2lkZSBvZiBhIFxjIE1vZHVsZVBhc3Mgb3IgYSBcYyBDYWxsR3JhcGhTQ0NQYXNzLgorLy8vCisvLy8gSWYgYSBcYyBNb2R1bGVQYXNzIG9yIGEgXGMgQ2FsbEdyYXBoU0NDUGFzcyBjYWxscyBccAorLy8vIGNyZWF0ZUxlZ2FjeVBNQUFSZXN1bHRzLCBpdCBhbHNvIG5lZWRzIHRvIGNhbGwgXHAgYWRkVXNlZEFBQW5hbHlzZXMgaW4gXHAKKy8vLyBnZXRBbmFseXNpc1VzYWdlLgorQUFSZXN1bHRzIGNyZWF0ZUxlZ2FjeVBNQUFSZXN1bHRzKFBhc3MgJlAsIEZ1bmN0aW9uICZGLCBCYXNpY0FBUmVzdWx0ICZCQVIpOworCisvLy8gQSBoZWxwZXIgZm9yIHRoZSBsZWdhY3kgcGFzcyBtYW5hZ2VyIHRvIHBvcHVsYXRlIFxwIEFVIHRvIGFkZCB1c2VzIHRvIG1ha2UKKy8vLyBzdXJlIHRoZSBhbmFseXNlcyByZXF1aXJlZCBieSBccCBjcmVhdGVMZWdhY3lQTUFBUmVzdWx0cyBhcmUgYXZhaWxhYmxlLgordm9pZCBnZXRBQVJlc3VsdHNBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfQUxJQVNBTkFMWVNJU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXNFdmFsdWF0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpc0V2YWx1YXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkMmY2MzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXNFdmFsdWF0b3IuaApAQCAtMCwwICsxLDc0IEBACisvLz09PS0gQWxpYXNBbmFseXNpc0V2YWx1YXRvci5oIC0gQWxpYXMgQW5hbHlzaXMgQWNjdXJhY3kgRXZhbHVhdG9yIC0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8KKy8vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHNpbXBsZSBOXjIgYWxpYXMgYW5hbHlzaXMgYWNjdXJhY3kgZXZhbHVhdG9yLiBUaGUKKy8vLyBhbmFseXNpcyByZXN1bHQgaXMgYSBzZXQgb2Ygc3RhdGlzdGljcyBvZiBob3cgbWFueSB0aW1lcyB0aGUgQUEKKy8vLyBpbmZyYXN0cnVjdHVyZSBwcm92aWRlcyBlYWNoIGtpbmQgb2YgYWxpYXMgcmVzdWx0IGFuZCBtb2QvcmVmIHJlc3VsdCB3aGVuCisvLy8gcXVlcmllZCB3aXRoIGFsbCBwYWlycyBvZiBwb2ludGVycyBpbiB0aGUgZnVuY3Rpb24uCisvLy8KKy8vLyBJdCBjYW4gYmUgdXNlZCB0byBldmFsdWF0ZSBhIGNoYW5nZSBpbiBhbiBhbGlhcyBhbmFseXNpcyBpbXBsZW1lbnRhdGlvbiwKKy8vLyBhbGdvcml0aG0sIG9yIHRoZSBBQSBwaXBlbGluZSBpbmZyYXN0cnVjdHVyZSBpdHNlbGYuIEl0IGFjdHMgbGlrZSBhIHN0YWJsZQorLy8vIGFuZCBlYXNpbHkgdGVzdGVkIGNvbnN1bWVyIG9mIGFsbCBBQSBpbmZvcm1hdGlvbiBleHBvc2VkLgorLy8vCisvLy8gVGhpcyBpcyBpbnNwaXJlZCBhbmQgYWRhcHRlZCBmcm9tIGNvZGUgYnk6IE5hdmVlbiBOZWVsYWthbnRhbSwgRnJhbmNlc2NvCisvLy8gU3BhZGluaSwgYW5kIFdvamNpZWNoIFN0cnlqZXdza2kuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19BTElBU0FOQUxZU0lTRVZBTFVBVE9SX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19BTElBU0FOQUxZU0lTRVZBTFVBVE9SX0gKKworI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEFBUmVzdWx0czsKKworY2xhc3MgQUFFdmFsdWF0b3IgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxBQUV2YWx1YXRvcj4geworICBpbnQ2NF90IEZ1bmN0aW9uQ291bnQ7CisgIGludDY0X3QgTm9BbGlhc0NvdW50LCBNYXlBbGlhc0NvdW50LCBQYXJ0aWFsQWxpYXNDb3VudCwgTXVzdEFsaWFzQ291bnQ7CisgIGludDY0X3QgTm9Nb2RSZWZDb3VudCwgTW9kQ291bnQsIFJlZkNvdW50LCBNb2RSZWZDb3VudDsKKyAgaW50NjRfdCBNdXN0Q291bnQsIE11c3RSZWZDb3VudCwgTXVzdE1vZENvdW50LCBNdXN0TW9kUmVmQ291bnQ7CisKK3B1YmxpYzoKKyAgQUFFdmFsdWF0b3IoKQorICAgICAgOiBGdW5jdGlvbkNvdW50KCksIE5vQWxpYXNDb3VudCgpLCBNYXlBbGlhc0NvdW50KCksIFBhcnRpYWxBbGlhc0NvdW50KCksCisgICAgICAgIE11c3RBbGlhc0NvdW50KCksIE5vTW9kUmVmQ291bnQoKSwgTW9kQ291bnQoKSwgUmVmQ291bnQoKSwKKyAgICAgICAgTW9kUmVmQ291bnQoKSwgTXVzdENvdW50KCksIE11c3RSZWZDb3VudCgpLCBNdXN0TW9kQ291bnQoKSwKKyAgICAgICAgTXVzdE1vZFJlZkNvdW50KCkge30KKyAgQUFFdmFsdWF0b3IoQUFFdmFsdWF0b3IgJiZBcmcpCisgICAgICA6IEZ1bmN0aW9uQ291bnQoQXJnLkZ1bmN0aW9uQ291bnQpLCBOb0FsaWFzQ291bnQoQXJnLk5vQWxpYXNDb3VudCksCisgICAgICAgIE1heUFsaWFzQ291bnQoQXJnLk1heUFsaWFzQ291bnQpLAorICAgICAgICBQYXJ0aWFsQWxpYXNDb3VudChBcmcuUGFydGlhbEFsaWFzQ291bnQpLAorICAgICAgICBNdXN0QWxpYXNDb3VudChBcmcuTXVzdEFsaWFzQ291bnQpLCBOb01vZFJlZkNvdW50KEFyZy5Ob01vZFJlZkNvdW50KSwKKyAgICAgICAgTW9kQ291bnQoQXJnLk1vZENvdW50KSwgUmVmQ291bnQoQXJnLlJlZkNvdW50KSwKKyAgICAgICAgTW9kUmVmQ291bnQoQXJnLk1vZFJlZkNvdW50KSwgTXVzdENvdW50KEFyZy5NdXN0Q291bnQpLAorICAgICAgICBNdXN0UmVmQ291bnQoQXJnLk11c3RSZWZDb3VudCksIE11c3RNb2RDb3VudChBcmcuTXVzdE1vZENvdW50KSwKKyAgICAgICAgTXVzdE1vZFJlZkNvdW50KEFyZy5NdXN0TW9kUmVmQ291bnQpIHsKKyAgICBBcmcuRnVuY3Rpb25Db3VudCA9IDA7CisgIH0KKyAgfkFBRXZhbHVhdG9yKCk7CisKKyAgLy8vIFxicmllZiBSdW4gdGhlIHBhc3Mgb3ZlciB0aGUgZnVuY3Rpb24uCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKKworcHJpdmF0ZToKKyAgLy8gQWxsb3cgdGhlIGxlZ2FjeSBwYXNzIHRvIHJ1biB0aGlzIHVzaW5nIGFuIGludGVybmFsIEFQSS4KKyAgZnJpZW5kIGNsYXNzIEFBRXZhbExlZ2FjeVBhc3M7CisKKyAgdm9pZCBydW5JbnRlcm5hbChGdW5jdGlvbiAmRiwgQUFSZXN1bHRzICZBQSk7Cit9OworCisvLy8gQ3JlYXRlIGEgd3JhcHBlciBvZiB0aGUgYWJvdmUgZm9yIHRoZSBsZWdhY3kgcGFzcyBtYW5hZ2VyLgorRnVuY3Rpb25QYXNzICpjcmVhdGVBQUV2YWxQYXNzKCk7CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0FsaWFzU2V0VHJhY2tlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9BbGlhc1NldFRyYWNrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZGEzZWJhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9BbGlhc1NldFRyYWNrZXIuaApAQCAtMCwwICsxLDQ2OCBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvQWxpYXNTZXRUcmFja2VyLmggLSBCdWlsZCBBbGlhcyBTZXRzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0d28gY2xhc3NlczogQWxpYXNTZXRUcmFja2VyIGFuZCBBbGlhc1NldC4gVGhlc2UgaW50ZXJmYWNlcworLy8gYXJlIHVzZWQgdG8gY2xhc3NpZnkgYSBjb2xsZWN0aW9uIG9mIHBvaW50ZXIgcmVmZXJlbmNlcyBpbnRvIGEgbWF4aW1hbCBudW1iZXIKKy8vIG9mIGRpc2pvaW50IHNldHMuIEVhY2ggQWxpYXNTZXQgb2JqZWN0IGNvbnN0cnVjdGVkIGJ5IHRoZSBBbGlhc1NldFRyYWNrZXIKKy8vIG9iamVjdCByZWZlcnMgdG8gbWVtb3J5IGRpc2pvaW50IGZyb20gdGhlIG90aGVyIHNldHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0FMSUFTU0VUVFJBQ0tFUl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfQUxJQVNTRVRUUkFDS0VSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXBJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3QuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdF9ub2RlLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlSGFuZGxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQWxpYXNTZXRUcmFja2VyOworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIExvYWRJbnN0OworY2xhc3MgTWVtU2V0SW5zdDsKK2NsYXNzIE1lbVRyYW5zZmVySW5zdDsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgU3RvcmVJbnN0OworY2xhc3MgVkFBcmdJbnN0OworY2xhc3MgVmFsdWU7CisKK2NsYXNzIEFsaWFzU2V0IDogcHVibGljIGlsaXN0X25vZGU8QWxpYXNTZXQ+IHsKKyAgZnJpZW5kIGNsYXNzIEFsaWFzU2V0VHJhY2tlcjsKKworICBjbGFzcyBQb2ludGVyUmVjIHsKKyAgICBWYWx1ZSAqVmFsOyAgLy8gVGhlIHBvaW50ZXIgdGhpcyByZWNvcmQgY29ycmVzcG9uZHMgdG8uCisgICAgUG9pbnRlclJlYyAqKlByZXZJbkxpc3QgPSBudWxscHRyOworICAgIFBvaW50ZXJSZWMgKk5leHRJbkxpc3QgPSBudWxscHRyOworICAgIEFsaWFzU2V0ICpBUyA9IG51bGxwdHI7CisgICAgdWludDY0X3QgU2l6ZSA9IDA7CisgICAgQUFNRE5vZGVzIEFBSW5mbzsKKworICBwdWJsaWM6CisgICAgUG9pbnRlclJlYyhWYWx1ZSAqVikKKyAgICAgIDogVmFsKFYpLCBBQUluZm8oRGVuc2VNYXBJbmZvPEFBTUROb2Rlcz46OmdldEVtcHR5S2V5KCkpIHt9CisKKyAgICBWYWx1ZSAqZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWw7IH0KKworICAgIFBvaW50ZXJSZWMgKmdldE5leHQoKSBjb25zdCB7IHJldHVybiBOZXh0SW5MaXN0OyB9CisgICAgYm9vbCBoYXNBbGlhc1NldCgpIGNvbnN0IHsgcmV0dXJuIEFTICE9IG51bGxwdHI7IH0KKworICAgIFBvaW50ZXJSZWMqKiBzZXRQcmV2SW5MaXN0KFBvaW50ZXJSZWMgKipQSUwpIHsKKyAgICAgIFByZXZJbkxpc3QgPSBQSUw7CisgICAgICByZXR1cm4gJk5leHRJbkxpc3Q7CisgICAgfQorCisgICAgYm9vbCB1cGRhdGVTaXplQW5kQUFJbmZvKHVpbnQ2NF90IE5ld1NpemUsIGNvbnN0IEFBTUROb2RlcyAmTmV3QUFJbmZvKSB7CisgICAgICBib29sIFNpemVDaGFuZ2VkID0gZmFsc2U7CisgICAgICBpZiAoTmV3U2l6ZSA+IFNpemUpIHsKKyAgICAgICAgU2l6ZSA9IE5ld1NpemU7CisgICAgICAgIFNpemVDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgaWYgKEFBSW5mbyA9PSBEZW5zZU1hcEluZm88QUFNRE5vZGVzPjo6Z2V0RW1wdHlLZXkoKSkKKyAgICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhIEFBSW5mbyB5ZXQuIFNldCBpdCB0byBOZXdBQUluZm8uCisgICAgICAgIEFBSW5mbyA9IE5ld0FBSW5mbzsKKyAgICAgIGVsc2UgeworICAgICAgICBBQU1ETm9kZXMgSW50ZXJzZWN0aW9uKEFBSW5mby5pbnRlcnNlY3QoTmV3QUFJbmZvKSk7CisgICAgICAgIGlmICghSW50ZXJzZWN0aW9uKSB7CisgICAgICAgICAgLy8gTmV3QUFJbmZvIGNvbmZsaWN0cyB3aXRoIEFBSW5mby4KKyAgICAgICAgICBBQUluZm8gPSBEZW5zZU1hcEluZm88QUFNRE5vZGVzPjo6Z2V0VG9tYnN0b25lS2V5KCk7CisgICAgICAgICAgcmV0dXJuIFNpemVDaGFuZ2VkOworICAgICAgICB9CisgICAgICAgIEFBSW5mbyA9IEludGVyc2VjdGlvbjsKKyAgICAgIH0KKyAgICAgIHJldHVybiBTaXplQ2hhbmdlZDsKKyAgICB9CisKKyAgICB1aW50NjRfdCBnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gU2l6ZTsgfQorCisgICAgLy8vIFJldHVybiB0aGUgQUFJbmZvLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIGluZm9ybWF0aW9uIG9yIGNvbmZsaWN0aW5nCisgICAgLy8vIGluZm9ybWF0aW9uLgorICAgIEFBTUROb2RlcyBnZXRBQUluZm8oKSBjb25zdCB7CisgICAgICAvLyBJZiB3ZSBoYXZlIG1pc3Npbmcgb3IgY29uZmxpY3RpbmcgQUFJbmZvLCByZXR1cm4gbnVsbC4KKyAgICAgIGlmIChBQUluZm8gPT0gRGVuc2VNYXBJbmZvPEFBTUROb2Rlcz46OmdldEVtcHR5S2V5KCkgfHwKKyAgICAgICAgICBBQUluZm8gPT0gRGVuc2VNYXBJbmZvPEFBTUROb2Rlcz46OmdldFRvbWJzdG9uZUtleSgpKQorICAgICAgICByZXR1cm4gQUFNRE5vZGVzKCk7CisgICAgICByZXR1cm4gQUFJbmZvOworICAgIH0KKworICAgIEFsaWFzU2V0ICpnZXRBbGlhc1NldChBbGlhc1NldFRyYWNrZXIgJkFTVCkgeworICAgICAgYXNzZXJ0KEFTICYmICJObyBBbGlhc1NldCB5ZXQhIik7CisgICAgICBpZiAoQVMtPkZvcndhcmQpIHsKKyAgICAgICAgQWxpYXNTZXQgKk9sZEFTID0gQVM7CisgICAgICAgIEFTID0gT2xkQVMtPmdldEZvcndhcmRlZFRhcmdldChBU1QpOworICAgICAgICBBUy0+YWRkUmVmKCk7CisgICAgICAgIE9sZEFTLT5kcm9wUmVmKEFTVCk7CisgICAgICB9CisgICAgICByZXR1cm4gQVM7CisgICAgfQorCisgICAgdm9pZCBzZXRBbGlhc1NldChBbGlhc1NldCAqYXMpIHsKKyAgICAgIGFzc2VydCghQVMgJiYgIkFscmVhZHkgaGF2ZSBhbiBhbGlhcyBzZXQhIik7CisgICAgICBBUyA9IGFzOworICAgIH0KKworICAgIHZvaWQgZXJhc2VGcm9tTGlzdCgpIHsKKyAgICAgIGlmIChOZXh0SW5MaXN0KSBOZXh0SW5MaXN0LT5QcmV2SW5MaXN0ID0gUHJldkluTGlzdDsKKyAgICAgICpQcmV2SW5MaXN0ID0gTmV4dEluTGlzdDsKKyAgICAgIGlmIChBUy0+UHRyTGlzdEVuZCA9PSAmTmV4dEluTGlzdCkgeworICAgICAgICBBUy0+UHRyTGlzdEVuZCA9IFByZXZJbkxpc3Q7CisgICAgICAgIGFzc2VydCgqQVMtPlB0ckxpc3RFbmQgPT0gbnVsbHB0ciAmJiAiTGlzdCBub3QgdGVybWluYXRlZCByaWdodCEiKTsKKyAgICAgIH0KKyAgICAgIGRlbGV0ZSB0aGlzOworICAgIH0KKyAgfTsKKworICAvLyBEb3VibHkgbGlua2VkIGxpc3Qgb2Ygbm9kZXMuCisgIFBvaW50ZXJSZWMgKlB0ckxpc3QgPSBudWxscHRyOworICBQb2ludGVyUmVjICoqUHRyTGlzdEVuZDsKKyAgLy8gRm9yd2FyZGluZyBwb2ludGVyLgorICBBbGlhc1NldCAqRm9yd2FyZCA9IG51bGxwdHI7CisKKyAgLy8vIEFsbCBpbnN0cnVjdGlvbnMgd2l0aG91dCBhIHNwZWNpZmljIGFkZHJlc3MgaW4gdGhpcyBhbGlhcyBzZXQuCisgIC8vLyBJbiByYXJlIGNhc2VzIHRoaXMgdmVjdG9yIGNhbiBoYXZlIGEgbnVsbCdlZCBvdXQgV2Vha1ZICisgIC8vLyBpbnN0YW5jZXMgKGNhbiBoYXBwZW4gaWYgc29tZSBvdGhlciBsb29wIHBhc3MgZGVsZXRlcyBhbgorICAvLy8gaW5zdHJ1Y3Rpb24gaW4gdGhpcyBsaXN0KS4KKyAgc3RkOjp2ZWN0b3I8V2Vha1ZIPiBVbmtub3duSW5zdHM7CisKKyAgLy8vIE51bWJlciBvZiBub2RlcyBwb2ludGluZyB0byB0aGlzIEFsaWFzU2V0IHBsdXMgdGhlIG51bWJlciBvZiBBbGlhc1NldHMKKyAgLy8vIGZvcndhcmRpbmcgdG8gaXQuCisgIHVuc2lnbmVkIFJlZkNvdW50IDogMjc7CisKKyAgLy8gU2lnbmlmaWVzIHRoYXQgdGhpcyBzZXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgdG8gYWxpYXMgYW55IHBvaW50ZXIuCisgIC8vIFVzZSB3aGVuIHRoZSB0cmFja2VyIGhvbGRpbmcgdGhpcyBzZXQgaXMgc2F0dXJhdGVkLgorICB1bnNpZ25lZCBBbGlhc0FueSA6IDE7CisKKyAgLy8vIFRoZSBraW5kcyBvZiBhY2Nlc3MgdGhpcyBhbGlhcyBzZXQgbW9kZWxzLgorICAvLy8KKyAgLy8vIFdlIGtlZXAgdHJhY2sgb2Ygd2hldGhlciB0aGlzIGFsaWFzIHNldCBtZXJlbHkgcmVmZXJzIHRvIHRoZSBsb2NhdGlvbnMgb2YKKyAgLy8vIG1lbW9yeSAoYW5kIG5vdCBhbnkgcGFydGljdWxhciBhY2Nlc3MpLCB3aGV0aGVyIGl0IG1vZGlmaWVzIG9yIHJlZmVyZW5jZXMKKyAgLy8vIHRoZSBtZW1vcnksIG9yIHdoZXRoZXIgaXQgZG9lcyBib3RoLiBUaGUgbGF0dGljZSBnb2VzIGZyb20gIk5vQWNjZXNzIiB0bworICAvLy8gZWl0aGVyIFJlZkFjY2VzcyBvciBNb2RBY2Nlc3MsIHRoZW4gdG8gTW9kUmVmQWNjZXNzIGFzIG5lY2Vzc2FyeS4KKyAgZW51bSBBY2Nlc3NMYXR0aWNlIHsKKyAgICBOb0FjY2VzcyA9IDAsCisgICAgUmVmQWNjZXNzID0gMSwKKyAgICBNb2RBY2Nlc3MgPSAyLAorICAgIE1vZFJlZkFjY2VzcyA9IFJlZkFjY2VzcyB8IE1vZEFjY2VzcworICB9OworICB1bnNpZ25lZCBBY2Nlc3MgOiAyOworCisgIC8vLyBUaGUga2luZCBvZiBhbGlhcyByZWxhdGlvbnNoaXAgYmV0d2VlbiBwb2ludGVycyBvZiB0aGUgc2V0LgorICAvLy8KKyAgLy8vIFRoZXNlIHJlcHJlc2VudCBjb25zZXJ2YXRpdmVseSBjb3JyZWN0IGFsaWFzIHJlc3VsdHMgYmV0d2VlbiBhbnkgbWVtYmVycworICAvLy8gb2YgdGhlIHNldC4gV2UgcmVwcmVzZW50IHRoZXNlIGluZGVwZW5kZW50bHkgb2YgdGhlIHZhbHVlcyBvZiBhbGlhcworICAvLy8gcmVzdWx0cyBpbiBvcmRlciB0byBwYWNrIGl0IGludG8gYSBzaW5nbGUgYml0LiBMYXR0aWNlIGdvZXMgZnJvbQorICAvLy8gTXVzdEFsaWFzIHRvIE1heUFsaWFzLgorICBlbnVtIEFsaWFzTGF0dGljZSB7CisgICAgU2V0TXVzdEFsaWFzID0gMCwgU2V0TWF5QWxpYXMgPSAxCisgIH07CisgIHVuc2lnbmVkIEFsaWFzIDogMTsKKworICAvLy8gVHJ1ZSBpZiB0aGlzIGFsaWFzIHNldCBjb250YWlucyB2b2xhdGlsZSBsb2FkcyBvciBzdG9yZXMuCisgIHVuc2lnbmVkIFZvbGF0aWxlIDogMTsKKworICB1bnNpZ25lZCBTZXRTaXplID0gMDsKKworICB2b2lkIGFkZFJlZigpIHsgKytSZWZDb3VudDsgfQorCisgIHZvaWQgZHJvcFJlZihBbGlhc1NldFRyYWNrZXIgJkFTVCkgeworICAgIGFzc2VydChSZWZDb3VudCA+PSAxICYmICJJbnZhbGlkIHJlZmVyZW5jZSBjb3VudCBkZXRlY3RlZCEiKTsKKyAgICBpZiAoLS1SZWZDb3VudCA9PSAwKQorICAgICAgcmVtb3ZlRnJvbVRyYWNrZXIoQVNUKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpnZXRVbmtub3duSW5zdCh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBVbmtub3duSW5zdHMuc2l6ZSgpKTsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPEluc3RydWN0aW9uPihVbmtub3duSW5zdHNbaV0pOworICB9CisKK3B1YmxpYzoKKyAgQWxpYXNTZXQoY29uc3QgQWxpYXNTZXQgJikgPSBkZWxldGU7CisgIEFsaWFzU2V0ICZvcGVyYXRvcj0oY29uc3QgQWxpYXNTZXQgJikgPSBkZWxldGU7CisKKyAgLy8vIEFjY2Vzc29ycy4uLgorICBib29sIGlzUmVmKCkgY29uc3QgeyByZXR1cm4gQWNjZXNzICYgUmVmQWNjZXNzOyB9CisgIGJvb2wgaXNNb2QoKSBjb25zdCB7IHJldHVybiBBY2Nlc3MgJiBNb2RBY2Nlc3M7IH0KKyAgYm9vbCBpc011c3RBbGlhcygpIGNvbnN0IHsgcmV0dXJuIEFsaWFzID09IFNldE11c3RBbGlhczsgfQorICBib29sIGlzTWF5QWxpYXMoKSAgY29uc3QgeyByZXR1cm4gQWxpYXMgPT0gU2V0TWF5QWxpYXM7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBhbGlhcyBzZXQgY29udGFpbnMgdm9sYXRpbGUgbG9hZHMgb3Igc3RvcmVzLgorICBib29sIGlzVm9sYXRpbGUoKSBjb25zdCB7IHJldHVybiBWb2xhdGlsZTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFsaWFzIHNldCBzaG91bGQgYmUgaWdub3JlZCBhcyBwYXJ0IG9mIHRoZQorICAvLy8gQWxpYXNTZXRUcmFja2VyIG9iamVjdC4KKyAgYm9vbCBpc0ZvcndhcmRpbmdBbGlhc1NldCgpIGNvbnN0IHsgcmV0dXJuIEZvcndhcmQ7IH0KKworICAvLy8gTWVyZ2UgdGhlIHNwZWNpZmllZCBhbGlhcyBzZXQgaW50byB0aGlzIGFsaWFzIHNldC4KKyAgdm9pZCBtZXJnZVNldEluKEFsaWFzU2V0ICZBUywgQWxpYXNTZXRUcmFja2VyICZBU1QpOworCisgIC8vIEFsaWFzIFNldCBpdGVyYXRpb24gLSBBbGxvdyBhY2Nlc3MgdG8gYWxsIG9mIHRoZSBwb2ludGVycyB3aGljaCBhcmUgcGFydCBvZgorICAvLyB0aGlzIGFsaWFzIHNldC4KKyAgY2xhc3MgaXRlcmF0b3I7CisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoUHRyTGlzdCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgICBjb25zdCB7IHJldHVybiBpdGVyYXRvcigpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBQdHJMaXN0ID09IG51bGxwdHI7IH0KKworICAvLyBVbmZvcnR1bmF0ZWx5LCBpbGlzdDo6c2l6ZSgpIGlzIGxpbmVhciwgc28gd2UgaGF2ZSB0byBhZGQgY29kZSB0byBrZWVwCisgIC8vIHRyYWNrIG9mIHRoZSBsaXN0J3MgZXhhY3Qgc2l6ZS4KKyAgdW5zaWduZWQgc2l6ZSgpIHsgcmV0dXJuIFNldFNpemU7IH0KKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyBEZWZpbmUgYW4gaXRlcmF0b3IgZm9yIGFsaWFzIHNldHMuLi4gdGhpcyBpcyBqdXN0IGEgZm9yd2FyZCBpdGVyYXRvci4KKyAgY2xhc3MgaXRlcmF0b3IgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJSZWMsIHB0cmRpZmZfdD4geworICAgIFBvaW50ZXJSZWMgKkN1ck5vZGU7CisKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IGl0ZXJhdG9yKFBvaW50ZXJSZWMgKkNOID0gbnVsbHB0cikgOiBDdXJOb2RlKENOKSB7fQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiB4KSBjb25zdCB7CisgICAgICByZXR1cm4gQ3VyTm9kZSA9PSB4LkN1ck5vZGU7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgeCkgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0oeCk7IH0KKworICAgIHZhbHVlX3R5cGUgJm9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgIGFzc2VydChDdXJOb2RlICYmICJEZXJlZmVyZW5jaW5nIEFsaWFzU2V0LmVuZCgpISIpOworICAgICAgcmV0dXJuICpDdXJOb2RlOworICAgIH0KKyAgICB2YWx1ZV90eXBlICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJm9wZXJhdG9yKigpOyB9CisKKyAgICBWYWx1ZSAqZ2V0UG9pbnRlcigpIGNvbnN0IHsgcmV0dXJuIEN1ck5vZGUtPmdldFZhbHVlKCk7IH0KKyAgICB1aW50NjRfdCBnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gQ3VyTm9kZS0+Z2V0U2l6ZSgpOyB9CisgICAgQUFNRE5vZGVzIGdldEFBSW5mbygpIGNvbnN0IHsgcmV0dXJuIEN1ck5vZGUtPmdldEFBSW5mbygpOyB9CisKKyAgICBpdGVyYXRvciYgb3BlcmF0b3IrKygpIHsgICAgICAgICAgICAgICAgLy8gUHJlaW5jcmVtZW50CisgICAgICBhc3NlcnQoQ3VyTm9kZSAmJiAiQWR2YW5jaW5nIHBhc3QgQWxpYXNTZXQuZW5kKCkhIik7CisgICAgICBDdXJOb2RlID0gQ3VyTm9kZS0+Z2V0TmV4dCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBpdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAvLyBQb3N0aW5jcmVtZW50CisgICAgICBpdGVyYXRvciB0bXAgPSAqdGhpczsgKysqdGhpczsgcmV0dXJuIHRtcDsKKyAgICB9CisgIH07CisKK3ByaXZhdGU6CisgIC8vIENhbiBvbmx5IGJlIGNyZWF0ZWQgYnkgQWxpYXNTZXRUcmFja2VyLgorICBBbGlhc1NldCgpCisgICAgICA6IFB0ckxpc3RFbmQoJlB0ckxpc3QpLCBSZWZDb3VudCgwKSwgIEFsaWFzQW55KGZhbHNlKSwgQWNjZXNzKE5vQWNjZXNzKSwKKyAgICAgICAgQWxpYXMoU2V0TXVzdEFsaWFzKSwgVm9sYXRpbGUoZmFsc2UpIHt9CisKKyAgUG9pbnRlclJlYyAqZ2V0U29tZVBvaW50ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIFB0ckxpc3Q7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSByZWFsIGFsaWFzIHNldCB0aGlzIHJlcHJlc2VudHMuIElmIHRoaXMgaGFzIGJlZW4gbWVyZ2VkIHdpdGgKKyAgLy8vIGFub3RoZXIgc2V0IGFuZCBpcyBmb3J3YXJkaW5nLCByZXR1cm4gdGhlIHVsdGltYXRlIGRlc3RpbmF0aW9uIHNldC4gVGhpcworICAvLy8gYWxzbyBpbXBsZW1lbnRzIHRoZSB1bmlvbi1maW5kIGNvbGxhcHNpbmcgYXMgd2VsbC4KKyAgQWxpYXNTZXQgKmdldEZvcndhcmRlZFRhcmdldChBbGlhc1NldFRyYWNrZXIgJkFTVCkgeworICAgIGlmICghRm9yd2FyZCkgcmV0dXJuIHRoaXM7CisKKyAgICBBbGlhc1NldCAqRGVzdCA9IEZvcndhcmQtPmdldEZvcndhcmRlZFRhcmdldChBU1QpOworICAgIGlmIChEZXN0ICE9IEZvcndhcmQpIHsKKyAgICAgIERlc3QtPmFkZFJlZigpOworICAgICAgRm9yd2FyZC0+ZHJvcFJlZihBU1QpOworICAgICAgRm9yd2FyZCA9IERlc3Q7CisgICAgfQorICAgIHJldHVybiBEZXN0OworICB9CisKKyAgdm9pZCByZW1vdmVGcm9tVHJhY2tlcihBbGlhc1NldFRyYWNrZXIgJkFTVCk7CisKKyAgdm9pZCBhZGRQb2ludGVyKEFsaWFzU2V0VHJhY2tlciAmQVNULCBQb2ludGVyUmVjICZFbnRyeSwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEFBTUROb2RlcyAmQUFJbmZvLAorICAgICAgICAgICAgICAgICAgYm9vbCBLbm93bk11c3RBbGlhcyA9IGZhbHNlKTsKKyAgdm9pZCBhZGRVbmtub3duSW5zdChJbnN0cnVjdGlvbiAqSSwgQWxpYXNBbmFseXNpcyAmQUEpOworCisgIHZvaWQgcmVtb3ZlVW5rbm93bkluc3QoQWxpYXNTZXRUcmFja2VyICZBU1QsIEluc3RydWN0aW9uICpJKSB7CisgICAgYm9vbCBXYXNFbXB0eSA9IFVua25vd25JbnN0cy5lbXB0eSgpOworICAgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gVW5rbm93bkluc3RzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoVW5rbm93bkluc3RzW2ldID09IEkpIHsKKyAgICAgICAgVW5rbm93bkluc3RzW2ldID0gVW5rbm93bkluc3RzLmJhY2soKTsKKyAgICAgICAgVW5rbm93bkluc3RzLnBvcF9iYWNrKCk7CisgICAgICAgIC0taTsgLS1lOyAgLy8gUmV2aXNpdCB0aGUgbW92ZWQgZW50cnkuCisgICAgICB9CisgICAgaWYgKCFXYXNFbXB0eSAmJiBVbmtub3duSW5zdHMuZW1wdHkoKSkKKyAgICAgIGRyb3BSZWYoQVNUKTsKKyAgfQorCisgIHZvaWQgc2V0Vm9sYXRpbGUoKSB7IFZvbGF0aWxlID0gdHJ1ZTsgfQorCitwdWJsaWM6CisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgIm1heSIgKG9yIG11c3QpIGFsaWFzIG9uZSBvZiB0aGUKKyAgLy8vIG1lbWJlcnMgaW4gdGhlIHNldC4KKyAgYm9vbCBhbGlhc2VzUG9pbnRlcihjb25zdCBWYWx1ZSAqUHRyLCB1aW50NjRfdCBTaXplLCBjb25zdCBBQU1ETm9kZXMgJkFBSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICBBbGlhc0FuYWx5c2lzICZBQSkgY29uc3Q7CisgIGJvb2wgYWxpYXNlc1Vua25vd25JbnN0KGNvbnN0IEluc3RydWN0aW9uICpJbnN0LCBBbGlhc0FuYWx5c2lzICZBQSkgY29uc3Q7Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0mIG9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBBbGlhc1NldCAmQVMpIHsKKyAgQVMucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKK2NsYXNzIEFsaWFzU2V0VHJhY2tlciB7CisgIC8vLyBBIENhbGxiYWNrVkggdG8gYXJyYW5nZSBmb3IgQWxpYXNTZXRUcmFja2VyIHRvIGJlIG5vdGlmaWVkIHdoZW5ldmVyIGEKKyAgLy8vIFZhbHVlIGlzIGRlbGV0ZWQuCisgIGNsYXNzIEFTVENhbGxiYWNrVkggZmluYWwgOiBwdWJsaWMgQ2FsbGJhY2tWSCB7CisgICAgQWxpYXNTZXRUcmFja2VyICpBU1Q7CisKKyAgICB2b2lkIGRlbGV0ZWQoKSBvdmVycmlkZTsKKyAgICB2b2lkIGFsbFVzZXNSZXBsYWNlZFdpdGgoVmFsdWUgKikgb3ZlcnJpZGU7CisKKyAgcHVibGljOgorICAgIEFTVENhbGxiYWNrVkgoVmFsdWUgKlYsIEFsaWFzU2V0VHJhY2tlciAqQVNUID0gbnVsbHB0cik7CisKKyAgICBBU1RDYWxsYmFja1ZIICZvcGVyYXRvcj0oVmFsdWUgKlYpOworICB9OworICAvLy8gVHJhaXRzIHRvIHRlbGwgRGVuc2VNYXAgdGhhdCB0ZWxsIHVzIGhvdyB0byBjb21wYXJlIGFuZCBoYXNoIHRoZSB2YWx1ZQorICAvLy8gaGFuZGxlLgorICBzdHJ1Y3QgQVNUQ2FsbGJhY2tWSERlbnNlTWFwSW5mbyA6IHB1YmxpYyBEZW5zZU1hcEluZm88VmFsdWUgKj4ge307CisKKyAgQWxpYXNBbmFseXNpcyAmQUE7CisgIGlsaXN0PEFsaWFzU2V0PiBBbGlhc1NldHM7CisKKyAgdXNpbmcgUG9pbnRlck1hcFR5cGUgPSBEZW5zZU1hcDxBU1RDYWxsYmFja1ZILCBBbGlhc1NldDo6UG9pbnRlclJlYyAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFTVENhbGxiYWNrVkhEZW5zZU1hcEluZm8+OworCisgIC8vIE1hcCBmcm9tIHBvaW50ZXJzIHRvIHRoZWlyIG5vZGUKKyAgUG9pbnRlck1hcFR5cGUgUG9pbnRlck1hcDsKKworcHVibGljOgorICAvLy8gQ3JlYXRlIGFuIGVtcHR5IGNvbGxlY3Rpb24gb2YgQWxpYXNTZXRzLCBhbmQgdXNlIHRoZSBzcGVjaWZpZWQgYWxpYXMKKyAgLy8vIGFuYWx5c2lzIG9iamVjdCB0byBkaXNhbWJpZ3VhdGUgbG9hZCBhbmQgc3RvcmUgYWRkcmVzc2VzLgorICBleHBsaWNpdCBBbGlhc1NldFRyYWNrZXIoQWxpYXNBbmFseXNpcyAmYWEpIDogQUEoYWEpIHt9CisgIH5BbGlhc1NldFRyYWNrZXIoKSB7IGNsZWFyKCk7IH0KKworICAvLy8gVGhlc2UgbWV0aG9kcyBhcmUgdXNlZCB0byBhZGQgZGlmZmVyZW50IHR5cGVzIG9mIGluc3RydWN0aW9ucyB0byB0aGUgYWxpYXMKKyAgLy8vIHNldHMuIEFkZGluZyBhIG5ldyBpbnN0cnVjdGlvbiBjYW4gcmVzdWx0IGluIG9uZSBvZiB0aHJlZSBhY3Rpb25zCisgIC8vLyBoYXBwZW5pbmc6CisgIC8vLworICAvLy8gICAxLiBJZiB0aGUgaW5zdHJ1Y3Rpb24gZG9lc24ndCBhbGlhcyBhbnkgb3RoZXIgc2V0cywgY3JlYXRlIGEgbmV3IHNldC4KKyAgLy8vICAgMi4gSWYgdGhlIGluc3RydWN0aW9uIGFsaWFzZXMgZXhhY3RseSBvbmUgc2V0LCBhZGQgaXQgdG8gdGhlIHNldAorICAvLy8gICAzLiBJZiB0aGUgaW5zdHJ1Y3Rpb24gYWxpYXNlcyBtdWx0aXBsZSBzZXRzLCBtZXJnZSB0aGUgc2V0cywgYW5kIGFkZAorICAvLy8gICAgICB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIHJlc3VsdC4KKyAgLy8vCisgIC8vLyBUaGVzZSBtZXRob2RzIHJldHVybiB0cnVlIGlmIGluc2VydGluZyB0aGUgaW5zdHJ1Y3Rpb24gcmVzdWx0ZWQgaW4gdGhlCisgIC8vLyBhZGRpdGlvbiBvZiBhIG5ldyBhbGlhcyBzZXQgKGkuZS4sIHRoZSBwb2ludGVyIGRpZCBub3QgYWxpYXMgYW55dGhpbmcpLgorICAvLy8KKyAgdm9pZCBhZGQoVmFsdWUgKlB0ciwgdWludDY0X3QgU2l6ZSwgY29uc3QgQUFNRE5vZGVzICZBQUluZm8pOyAvLyBBZGQgYSBsb2MuCisgIHZvaWQgYWRkKExvYWRJbnN0ICpMSSk7CisgIHZvaWQgYWRkKFN0b3JlSW5zdCAqU0kpOworICB2b2lkIGFkZChWQUFyZ0luc3QgKlZBQUkpOworICB2b2lkIGFkZChNZW1TZXRJbnN0ICpNU0kpOworICB2b2lkIGFkZChNZW1UcmFuc2Zlckluc3QgKk1USSk7CisgIHZvaWQgYWRkKEluc3RydWN0aW9uICpJKTsgICAgICAgLy8gRGlzcGF0Y2ggdG8gb25lIG9mIHRoZSBvdGhlciBhZGQgbWV0aG9kcy4uLgorICB2b2lkIGFkZChCYXNpY0Jsb2NrICZCQik7ICAgICAgIC8vIEFkZCBhbGwgaW5zdHJ1Y3Rpb25zIGluIGJhc2ljIGJsb2NrCisgIHZvaWQgYWRkKGNvbnN0IEFsaWFzU2V0VHJhY2tlciAmQVNUKTsgLy8gQWRkIGFsaWFzIHJlbGF0aW9ucyBmcm9tIGFub3RoZXIgQVNUCisgIHZvaWQgYWRkVW5rbm93bihJbnN0cnVjdGlvbiAqSSk7CisKKyAgdm9pZCBjbGVhcigpOworCisgIC8vLyBSZXR1cm4gdGhlIGFsaWFzIHNldHMgdGhhdCBhcmUgYWN0aXZlLgorICBjb25zdCBpbGlzdDxBbGlhc1NldD4gJmdldEFsaWFzU2V0cygpIGNvbnN0IHsgcmV0dXJuIEFsaWFzU2V0czsgfQorCisgIC8vLyBSZXR1cm4gdGhlIGFsaWFzIHNldCB0aGF0IHRoZSBzcGVjaWZpZWQgcG9pbnRlciBsaXZlcyBpbi4gSWYgdGhlIE5ldworICAvLy8gYXJndW1lbnQgaXMgbm9uLW51bGwsIHRoaXMgbWV0aG9kIHNldHMgdGhlIHZhbHVlIHRvIHRydWUgaWYgYSBuZXcgYWxpYXMKKyAgLy8vIHNldCBpcyBjcmVhdGVkIHRvIGNvbnRhaW4gdGhlIHBvaW50ZXIgKGJlY2F1c2UgdGhlIHBvaW50ZXIgZGlkbid0IGFsaWFzCisgIC8vLyBhbnl0aGluZykuCisgIEFsaWFzU2V0ICZnZXRBbGlhc1NldEZvclBvaW50ZXIoVmFsdWUgKlAsIHVpbnQ2NF90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUFNRE5vZGVzICZBQUluZm8pOworCisgIC8vLyBSZXR1cm4gdGhlIGFsaWFzIHNldCBjb250YWluaW5nIHRoZSBsb2NhdGlvbiBzcGVjaWZpZWQgaWYgb25lIGV4aXN0cywKKyAgLy8vIG90aGVyd2lzZSByZXR1cm4gbnVsbC4KKyAgQWxpYXNTZXQgKmdldEFsaWFzU2V0Rm9yUG9pbnRlcklmRXhpc3RzKGNvbnN0IFZhbHVlICpQLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUFNRE5vZGVzICZBQUluZm8pIHsKKyAgICByZXR1cm4gbWVyZ2VBbGlhc1NldHNGb3JQb2ludGVyKFAsIFNpemUsIEFBSW5mbyk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiAibWF5IiAob3IgbXVzdCkgYWxpYXMgb25lIG9mIHRoZQorICAvLy8gbWVtYmVycyBpbiBhbnkgb2YgdGhlIHNldHMuCisgIGJvb2wgY29udGFpbnNVbmtub3duKGNvbnN0IEluc3RydWN0aW9uICpJKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSB1bmRlcmx5aW5nIGFsaWFzIGFuYWx5c2lzIG9iamVjdCB1c2VkIGJ5IHRoaXMgdHJhY2tlci4KKyAgQWxpYXNBbmFseXNpcyAmZ2V0QWxpYXNBbmFseXNpcygpIGNvbnN0IHsgcmV0dXJuIEFBOyB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gcmVtb3ZlIGEgcG9pbnRlciB2YWx1ZSBmcm9tIHRoZSBBbGlhc1NldFRyYWNrZXIKKyAgLy8vIGVudGlyZWx5LiBJdCBzaG91bGQgYmUgdXNlZCB3aGVuIGFuIGluc3RydWN0aW9uIGlzIGRlbGV0ZWQgZnJvbSB0aGUKKyAgLy8vIHByb2dyYW0gdG8gdXBkYXRlIHRoZSBBU1QuIElmIHlvdSBkb24ndCB1c2UgdGhpcywgeW91IHdvdWxkIGhhdmUgZGFuZ2xpbmcKKyAgLy8vIHBvaW50ZXJzIHRvIGRlbGV0ZWQgaW5zdHJ1Y3Rpb25zLgorICB2b2lkIGRlbGV0ZVZhbHVlKFZhbHVlICpQdHJWYWwpOworCisgIC8vLyBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZCB3aGVuZXZlciBhIHByZWV4aXN0aW5nIHZhbHVlIGluIHRoZSBwcm9ncmFtIGlzCisgIC8vLyBjb3BpZWQgb3IgY2xvbmVkLCBpbnRyb2R1Y2luZyBhIG5ldyB2YWx1ZS4gIE5vdGUgdGhhdCBpdCBpcyBvayBmb3IgY2xpZW50cworICAvLy8gdGhhdCB1c2UgdGhpcyBtZXRob2QgdG8gaW50cm9kdWNlIHRoZSBzYW1lIHZhbHVlIG11bHRpcGxlIHRpbWVzOiBpZiB0aGUKKyAgLy8vIHRyYWNrZXIgYWxyZWFkeSBrbm93cyBhYm91dCBhIHZhbHVlLCBpdCB3aWxsIGlnbm9yZSB0aGUgcmVxdWVzdC4KKyAgdm9pZCBjb3B5VmFsdWUoVmFsdWUgKkZyb20sIFZhbHVlICpUbyk7CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBpbGlzdDxBbGlhc1NldD46Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IGlsaXN0PEFsaWFzU2V0Pjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBBbGlhc1NldHMuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSAgIGNvbnN0IHsgcmV0dXJuIEFsaWFzU2V0cy5lbmQoKTsgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gQWxpYXNTZXRzLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgICB7IHJldHVybiBBbGlhc1NldHMuZW5kKCk7IH0KKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQWxpYXNTZXQ7CisKKyAgLy8gVGhlIHRvdGFsIG51bWJlciBvZiBwb2ludGVycyBjb250YWluZWQgaW4gYWxsICJtYXkiIGFsaWFzIHNldHMuCisgIHVuc2lnbmVkIFRvdGFsTWF5QWxpYXNTZXRTaXplID0gMDsKKworICAvLyBBIG5vbi1udWxsIHZhbHVlIHNpZ25pZmllcyB0aGlzIEFTVCBpcyBzYXR1cmF0ZWQuIEEgc2F0dXJhdGVkIEFTVCBsdW1wcworICAvLyBhbGwgcG9pbnRlcnMgaW50byBhIHNpbmdsZSAiTWF5IiBzZXQuCisgIEFsaWFzU2V0ICpBbGlhc0FueUFTID0gbnVsbHB0cjsKKworICB2b2lkIHJlbW92ZUFsaWFzU2V0KEFsaWFzU2V0ICpBUyk7CisKKyAgLy8vIEp1c3QgbGlrZSBvcGVyYXRvcltdIG9uIHRoZSBtYXAsIGV4Y2VwdCB0aGF0IGl0IGNyZWF0ZXMgYW4gZW50cnkgZm9yIHRoZQorICAvLy8gcG9pbnRlciBpZiBpdCBkb2Vzbid0IGFscmVhZHkgZXhpc3QuCisgIEFsaWFzU2V0OjpQb2ludGVyUmVjICZnZXRFbnRyeUZvcihWYWx1ZSAqVikgeworICAgIEFsaWFzU2V0OjpQb2ludGVyUmVjIComRW50cnkgPSBQb2ludGVyTWFwW0FTVENhbGxiYWNrVkgoViwgdGhpcyldOworICAgIGlmICghRW50cnkpCisgICAgICBFbnRyeSA9IG5ldyBBbGlhc1NldDo6UG9pbnRlclJlYyhWKTsKKyAgICByZXR1cm4gKkVudHJ5OworICB9CisKKyAgQWxpYXNTZXQgJmFkZFBvaW50ZXIoVmFsdWUgKlAsIHVpbnQ2NF90IFNpemUsIGNvbnN0IEFBTUROb2RlcyAmQUFJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBBbGlhc1NldDo6QWNjZXNzTGF0dGljZSBFKTsKKyAgQWxpYXNTZXQgKm1lcmdlQWxpYXNTZXRzRm9yUG9pbnRlcihjb25zdCBWYWx1ZSAqUHRyLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFBTUROb2RlcyAmQUFJbmZvKTsKKworICAvLy8gTWVyZ2UgYWxsIGFsaWFzIHNldHMgaW50byBhIHNpbmdsZSBzZXQgdGhhdCBpcyBjb25zaWRlcmVkIHRvIGFsaWFzIGFueQorICAvLy8gcG9pbnRlci4KKyAgQWxpYXNTZXQgJm1lcmdlQWxsQWxpYXNTZXRzKCk7CisKKyAgQWxpYXNTZXQgKmZpbmRBbGlhc1NldEZvclVua25vd25JbnN0KEluc3RydWN0aW9uICpJbnN0KTsKK307CisKK2lubGluZSByYXdfb3N0cmVhbSYgb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IEFsaWFzU2V0VHJhY2tlciAmQVNUKSB7CisgIEFTVC5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfQUxJQVNTRVRUUkFDS0VSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQXNzdW1wdGlvbkNhY2hlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0Fzc3VtcHRpb25DYWNoZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NjVlNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0Fzc3VtcHRpb25DYWNoZS5oCkBAIC0wLDAgKzEsMjMyIEBACisvLz09PS0gbGx2bS9BbmFseXNpcy9Bc3N1bXB0aW9uQ2FjaGUuaCAtIFRyYWNrIEBsbHZtLmFzc3VtZSAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBhIHBhc3MgdGhhdCBrZWVwcyB0cmFjayBvZiBAbGx2bS5hc3N1bWUgaW50cmluc2ljcyBpbgorLy8gdGhlIGZ1bmN0aW9ucyBvZiBhIG1vZHVsZSAoYWxsb3dpbmcgYXNzdW1wdGlvbnMgd2l0aGluIGFueSBmdW5jdGlvbiB0byBiZQorLy8gZm91bmQgY2hlYXBseSBieSBvdGhlciBwYXJ0cyBvZiB0aGUgb3B0aW1pemVyKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfQVNTVU1QVElPTkNBQ0hFX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19BU1NVTVBUSU9OQ0FDSEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQ2FsbEluc3Q7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgVmFsdWU7CisKKy8vLyBcYnJpZWYgQSBjYWNoZSBvZiBAbGx2bS5hc3N1bWUgY2FsbHMgd2l0aGluIGEgZnVuY3Rpb24uCisvLy8KKy8vLyBUaGlzIGNhY2hlIHByb3ZpZGVzIGZhc3QgbG9va3VwIG9mIGFzc3VtcHRpb25zIHdpdGhpbiBhIGZ1bmN0aW9uIGJ5IGNhY2hpbmcKKy8vLyB0aGVtIGFuZCBhbW9ydGl6aW5nIHRoZSBjb3N0IG9mIHNjYW5uaW5nIGZvciB0aGVtIGFjcm9zcyBhbGwgcXVlcmllcy4gUGFzc2VzCisvLy8gdGhhdCBjcmVhdGUgbmV3IGFzc3VtcHRpb25zIGFyZSByZXF1aXJlZCB0byBjYWxsIHJlZ2lzdGVyQXNzdW1wdGlvbigpIHRvCisvLy8gcmVnaXN0ZXIgYW55IG5ldyBAbGx2bS5hc3N1bWUgY2FsbHMgdGhhdCB0aGV5IGNyZWF0ZS4gRGVsZXRpb25zIG9mCisvLy8gQGxsdm0uYXNzdW1lIGNhbGxzIGRvIG5vdCByZXF1aXJlIHNwZWNpYWwgaGFuZGxpbmcuCitjbGFzcyBBc3N1bXB0aW9uQ2FjaGUgeworICAvLy8gXGJyaWVmIFRoZSBmdW5jdGlvbiBmb3Igd2hpY2ggdGhpcyBjYWNoZSBpcyBoYW5kbGluZyBhc3N1bXB0aW9ucy4KKyAgLy8vCisgIC8vLyBXZSB0cmFjayB0aGlzIHRvIGxhemlseSBwb3B1bGF0ZSBvdXIgYXNzdW1wdGlvbnMuCisgIEZ1bmN0aW9uICZGOworCisgIC8vLyBcYnJpZWYgVmVjdG9yIG9mIHdlYWsgdmFsdWUgaGFuZGxlcyB0byBjYWxscyBvZiB0aGUgQGxsdm0uYXNzdW1lCisgIC8vLyBpbnRyaW5zaWMuCisgIFNtYWxsVmVjdG9yPFdlYWtUcmFja2luZ1ZILCA0PiBBc3N1bWVIYW5kbGVzOworCisgIGNsYXNzIEFmZmVjdGVkVmFsdWVDYWxsYmFja1ZIIGZpbmFsIDogcHVibGljIENhbGxiYWNrVkggeworICAgIEFzc3VtcHRpb25DYWNoZSAqQUM7CisKKyAgICB2b2lkIGRlbGV0ZWQoKSBvdmVycmlkZTsKKyAgICB2b2lkIGFsbFVzZXNSZXBsYWNlZFdpdGgoVmFsdWUgKikgb3ZlcnJpZGU7CisKKyAgcHVibGljOgorICAgIHVzaW5nIERNSSA9IERlbnNlTWFwSW5mbzxWYWx1ZSAqPjsKKworICAgIEFmZmVjdGVkVmFsdWVDYWxsYmFja1ZIKFZhbHVlICpWLCBBc3N1bXB0aW9uQ2FjaGUgKkFDID0gbnVsbHB0cikKKyAgICAgICAgOiBDYWxsYmFja1ZIKFYpLCBBQyhBQykge30KKyAgfTsKKworICBmcmllbmQgQWZmZWN0ZWRWYWx1ZUNhbGxiYWNrVkg7CisKKyAgLy8vIFxicmllZiBBIG1hcCBvZiB2YWx1ZXMgYWJvdXQgd2hpY2ggYW4gYXNzdW1wdGlvbiBtaWdodCBiZSBwcm92aWRpbmcKKyAgLy8vIGluZm9ybWF0aW9uIHRvIHRoZSByZWxldmFudCBzZXQgb2YgYXNzdW1wdGlvbnMuCisgIHVzaW5nIEFmZmVjdGVkVmFsdWVzTWFwID0KKyAgICAgIERlbnNlTWFwPEFmZmVjdGVkVmFsdWVDYWxsYmFja1ZILCBTbWFsbFZlY3RvcjxXZWFrVHJhY2tpbmdWSCwgMT4sCisgICAgICAgICAgICAgICBBZmZlY3RlZFZhbHVlQ2FsbGJhY2tWSDo6RE1JPjsKKyAgQWZmZWN0ZWRWYWx1ZXNNYXAgQWZmZWN0ZWRWYWx1ZXM7CisKKyAgLy8vIEdldCB0aGUgdmVjdG9yIG9mIGFzc3VtcHRpb25zIHdoaWNoIGFmZmVjdCBhIHZhbHVlIGZyb20gdGhlIGNhY2hlLgorICBTbWFsbFZlY3RvcjxXZWFrVHJhY2tpbmdWSCwgMT4gJmdldE9ySW5zZXJ0QWZmZWN0ZWRWYWx1ZXMoVmFsdWUgKlYpOworCisgIC8vLyBDb3B5IGFmZmVjdGVkIHZhbHVlcyBpbiB0aGUgY2FjaGUgZm9yIE9WIHRvIGJlIGFmZmVjdGVkIHZhbHVlcyBmb3IgTlYuCisgIHZvaWQgY29weUFmZmVjdGVkVmFsdWVzSW5DYWNoZShWYWx1ZSAqT1YsIFZhbHVlICpOVik7CisKKyAgLy8vIFxicmllZiBGbGFnIHRyYWNraW5nIHdoZXRoZXIgd2UgaGF2ZSBzY2FubmVkIHRoZSBmdW5jdGlvbiB5ZXQuCisgIC8vLworICAvLy8gV2Ugd2FudCB0byBiZSBhcyBsYXp5IGFib3V0IHRoaXMgYXMgcG9zc2libGUsIGFuZCBzbyB3ZSBzY2FuIHRoZSBmdW5jdGlvbgorICAvLy8gYXQgdGhlIGxhc3QgbW9tZW50LgorICBib29sIFNjYW5uZWQgPSBmYWxzZTsKKworICAvLy8gXGJyaWVmIFNjYW4gdGhlIGZ1bmN0aW9uIGZvciBhc3N1bXB0aW9ucyBhbmQgYWRkIHRoZW0gdG8gdGhlIGNhY2hlLgorICB2b2lkIHNjYW5GdW5jdGlvbigpOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGFuIEFzc3VtcHRpb25DYWNoZSBmcm9tIGEgZnVuY3Rpb24gYnkgc2Nhbm5pbmcgYWxsIG9mCisgIC8vLyBpdHMgaW5zdHJ1Y3Rpb25zLgorICBBc3N1bXB0aW9uQ2FjaGUoRnVuY3Rpb24gJkYpIDogRihGKSB7fQorCisgIC8vLyBUaGlzIGNhY2hlIGlzIGRlc2lnbmVkIHRvIGJlIHNlbGYtdXBkYXRpbmcgYW5kIHNvIGl0IHNob3VsZCBuZXZlciBiZQorICAvLy8gaW52YWxpZGF0ZWQuCisgIGJvb2wgaW52YWxpZGF0ZShGdW5jdGlvbiAmLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmLAorICAgICAgICAgICAgICAgICAgRnVuY3Rpb25BbmFseXNpc01hbmFnZXI6OkludmFsaWRhdG9yICYpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gXGJyaWVmIEFkZCBhbiBAbGx2bS5hc3N1bWUgaW50cmluc2ljIHRvIHRoaXMgZnVuY3Rpb24ncyBjYWNoZS4KKyAgLy8vCisgIC8vLyBUaGUgY2FsbCBwYXNzZWQgaW4gbXVzdCBiZSBhbiBpbnN0cnVjdGlvbiB3aXRoaW4gdGhpcyBmdW5jdGlvbiBhbmQgbXVzdAorICAvLy8gbm90IGFscmVhZHkgYmUgaW4gdGhlIGNhY2hlLgorICB2b2lkIHJlZ2lzdGVyQXNzdW1wdGlvbihDYWxsSW5zdCAqQ0kpOworCisgIC8vLyBcYnJpZWYgVXBkYXRlIHRoZSBjYWNoZSBvZiB2YWx1ZXMgYmVpbmcgYWZmZWN0ZWQgYnkgdGhpcyBhc3N1bXB0aW9uIChpLmUuCisgIC8vLyB0aGUgdmFsdWVzIGFib3V0IHdoaWNoIHRoaXMgYXNzdW1wdGlvbiBwcm92aWRlcyBpbmZvcm1hdGlvbikuCisgIHZvaWQgdXBkYXRlQWZmZWN0ZWRWYWx1ZXMoQ2FsbEluc3QgKkNJKTsKKworICAvLy8gXGJyaWVmIENsZWFyIHRoZSBjYWNoZSBvZiBAbGx2bS5hc3N1bWUgaW50cmluc2ljcyBmb3IgYSBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBJdCB3aWxsIGJlIHJlLXNjYW5uZWQgdGhlIG5leHQgdGltZSBpdCBpcyByZXF1ZXN0ZWQuCisgIHZvaWQgY2xlYXIoKSB7CisgICAgQXNzdW1lSGFuZGxlcy5jbGVhcigpOworICAgIEFmZmVjdGVkVmFsdWVzLmNsZWFyKCk7CisgICAgU2Nhbm5lZCA9IGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBBY2Nlc3MgdGhlIGxpc3Qgb2YgYXNzdW1wdGlvbiBoYW5kbGVzIGN1cnJlbnRseSB0cmFja2VkIGZvciB0aGlzCisgIC8vLyBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhlc2UgcHJvZHVjZSB3ZWFrIGhhbmRsZXMgdGhhdCBtYXkgYmUgbnVsbC4gVGhlIGNhbGxlciBtdXN0CisgIC8vLyBoYW5kbGUgdGhhdCBjYXNlLgorICAvLy8gRklYTUU6IFdlIHNob3VsZCByZXBsYWNlIHRoaXMgd2l0aCBwb2ludGVlX2l0ZXJhdG9yPGZpbHRlcl9pdGVyYXRvcjwuLi4+PgorICAvLy8gd2hlbiB3ZSBjYW4gd3JpdGUgdGhhdCB0byBmaWx0ZXIgb3V0IHRoZSBudWxsIHZhbHVlcy4gVGhlbiBjYWxsZXIgY29kZQorICAvLy8gd2lsbCBiZWNvbWUgc2ltcGxlci4KKyAgTXV0YWJsZUFycmF5UmVmPFdlYWtUcmFja2luZ1ZIPiBhc3N1bXB0aW9ucygpIHsKKyAgICBpZiAoIVNjYW5uZWQpCisgICAgICBzY2FuRnVuY3Rpb24oKTsKKyAgICByZXR1cm4gQXNzdW1lSGFuZGxlczsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWNjZXNzIHRoZSBsaXN0IG9mIGFzc3VtcHRpb25zIHdoaWNoIGFmZmVjdCB0aGlzIHZhbHVlLgorICBNdXRhYmxlQXJyYXlSZWY8V2Vha1RyYWNraW5nVkg+IGFzc3VtcHRpb25zRm9yKGNvbnN0IFZhbHVlICpWKSB7CisgICAgaWYgKCFTY2FubmVkKQorICAgICAgc2NhbkZ1bmN0aW9uKCk7CisKKyAgICBhdXRvIEFWSSA9IEFmZmVjdGVkVmFsdWVzLmZpbmRfYXMoY29uc3RfY2FzdDxWYWx1ZSAqPihWKSk7CisgICAgaWYgKEFWSSA9PSBBZmZlY3RlZFZhbHVlcy5lbmQoKSkKKyAgICAgIHJldHVybiBNdXRhYmxlQXJyYXlSZWY8V2Vha1RyYWNraW5nVkg+KCk7CisKKyAgICByZXR1cm4gQVZJLT5zZWNvbmQ7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQSBmdW5jdGlvbiBhbmFseXNpcyB3aGljaCBwcm92aWRlcyBhbiBcYyBBc3N1bXB0aW9uQ2FjaGUuCisvLy8KKy8vLyBUaGlzIGFuYWx5c2lzIGlzIGludGVuZGVkIGZvciB1c2Ugd2l0aCB0aGUgbmV3IHBhc3MgbWFuYWdlciBhbmQgd2lsbCB2ZW5kCisvLy8gYXNzdW1wdGlvbiBjYWNoZXMgZm9yIGEgZ2l2ZW4gZnVuY3Rpb24uCitjbGFzcyBBc3N1bXB0aW9uQW5hbHlzaXMgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48QXNzdW1wdGlvbkFuYWx5c2lzPiB7CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxBc3N1bXB0aW9uQW5hbHlzaXM+OworCisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7CisKK3B1YmxpYzoKKyAgdXNpbmcgUmVzdWx0ID0gQXNzdW1wdGlvbkNhY2hlOworCisgIEFzc3VtcHRpb25DYWNoZSBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICYpIHsKKyAgICByZXR1cm4gQXNzdW1wdGlvbkNhY2hlKEYpOworICB9Cit9OworCisvLy8gXGJyaWVmIFByaW50ZXIgcGFzcyBmb3IgdGhlIFxjIEFzc3VtcHRpb25BbmFseXNpcyByZXN1bHRzLgorY2xhc3MgQXNzdW1wdGlvblByaW50ZXJQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48QXNzdW1wdGlvblByaW50ZXJQYXNzPiB7CisgIHJhd19vc3RyZWFtICZPUzsKKworcHVibGljOgorICBleHBsaWNpdCBBc3N1bXB0aW9uUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk9TKSA6IE9TKE9TKSB7fQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBcYnJpZWYgQW4gaW1tdXRhYmxlIHBhc3MgdGhhdCB0cmFja3MgbGF6aWx5IGNyZWF0ZWQgXGMgQXNzdW1wdGlvbkNhY2hlCisvLy8gb2JqZWN0cy4KKy8vLworLy8vIFRoaXMgaXMgZXNzZW50aWFsbHkgYSB3b3JrYXJvdW5kIGZvciB0aGUgbGVnYWN5IHBhc3MgbWFuYWdlcidzIHdlYWtuZXNzZXMKKy8vLyB3aGljaCBhc3NvY2lhdGVzIGVhY2ggYXNzdW1wdGlvbiBjYWNoZSB3aXRoIEZ1bmN0aW9uIGFuZCBjbGVhcnMgaXQgaWYgdGhlCisvLy8gZnVuY3Rpb24gaXMgZGVsZXRlZC4gVGhlIG5hdHVyZSBvZiB0aGUgQXNzdW1wdGlvbkNhY2hlIGlzIHRoYXQgaXQgaXMgbm90CisvLy8gaW52YWxpZGF0ZWQgYnkgYW55IGNoYW5nZXMgdG8gdGhlIGZ1bmN0aW9uIGJvZHkgYW5kIHNvIHRoaXMgaXMgc3VmZmljaWVudAorLy8vIHRvIGJlIGNvbnNlcnZhdGl2ZWx5IGNvcnJlY3QuCitjbGFzcyBBc3N1bXB0aW9uQ2FjaGVUcmFja2VyIDogcHVibGljIEltbXV0YWJsZVBhc3MgeworICAvLy8gQSBjYWxsYmFjayB2YWx1ZSBoYW5kbGUgYXBwbGllZCB0byBmdW5jdGlvbiBvYmplY3RzLCB3aGljaCB3ZSB1c2UgdG8KKyAgLy8vIGRlbGV0ZSBvdXIgY2FjaGUgb2YgaW50cmluc2ljcyBmb3IgYSBmdW5jdGlvbiB3aGVuIGl0IGlzIGRlbGV0ZWQuCisgIGNsYXNzIEZ1bmN0aW9uQ2FsbGJhY2tWSCBmaW5hbCA6IHB1YmxpYyBDYWxsYmFja1ZIIHsKKyAgICBBc3N1bXB0aW9uQ2FjaGVUcmFja2VyICpBQ1Q7CisKKyAgICB2b2lkIGRlbGV0ZWQoKSBvdmVycmlkZTsKKworICBwdWJsaWM6CisgICAgdXNpbmcgRE1JID0gRGVuc2VNYXBJbmZvPFZhbHVlICo+OworCisgICAgRnVuY3Rpb25DYWxsYmFja1ZIKFZhbHVlICpWLCBBc3N1bXB0aW9uQ2FjaGVUcmFja2VyICpBQ1QgPSBudWxscHRyKQorICAgICAgICA6IENhbGxiYWNrVkgoViksIEFDVChBQ1QpIHt9CisgIH07CisKKyAgZnJpZW5kIEZ1bmN0aW9uQ2FsbGJhY2tWSDsKKworICB1c2luZyBGdW5jdGlvbkNhbGxzTWFwID0KKyAgICAgIERlbnNlTWFwPEZ1bmN0aW9uQ2FsbGJhY2tWSCwgc3RkOjp1bmlxdWVfcHRyPEFzc3VtcHRpb25DYWNoZT4sCisgICAgICAgICAgICAgICBGdW5jdGlvbkNhbGxiYWNrVkg6OkRNST47CisKKyAgRnVuY3Rpb25DYWxsc01hcCBBc3N1bXB0aW9uQ2FjaGVzOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgR2V0IHRoZSBjYWNoZWQgYXNzdW1wdGlvbnMgZm9yIGEgZnVuY3Rpb24uCisgIC8vLworICAvLy8gSWYgbm8gYXNzdW1wdGlvbnMgYXJlIGNhY2hlZCwgdGhpcyB3aWxsIHNjYW4gdGhlIGZ1bmN0aW9uLiBPdGhlcndpc2UsIHRoZQorICAvLy8gZXhpc3RpbmcgY2FjaGUgd2lsbCBiZSByZXR1cm5lZC4KKyAgQXNzdW1wdGlvbkNhY2hlICZnZXRBc3N1bXB0aW9uQ2FjaGUoRnVuY3Rpb24gJkYpOworCisgIEFzc3VtcHRpb25DYWNoZVRyYWNrZXIoKTsKKyAgfkFzc3VtcHRpb25DYWNoZVRyYWNrZXIoKSBvdmVycmlkZTsKKworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZSB7CisgICAgdmVyaWZ5QW5hbHlzaXMoKTsKKyAgICBBc3N1bXB0aW9uQ2FjaGVzLnNocmlua19hbmRfY2xlYXIoKTsKKyAgfQorCisgIHZvaWQgdmVyaWZ5QW5hbHlzaXMoKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIGRvRmluYWxpemF0aW9uKE1vZHVsZSAmKSBvdmVycmlkZSB7CisgICAgdmVyaWZ5QW5hbHlzaXMoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfQVNTVU1QVElPTkNBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQmFzaWNBbGlhc0FuYWx5c2lzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0Jhc2ljQWxpYXNBbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZTVlOTcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0Jhc2ljQWxpYXNBbmFseXNpcy5oCkBAIC0wLDAgKzEsMjcwIEBACisvLz09PS0gQmFzaWNBbGlhc0FuYWx5c2lzLmggLSBTdGF0ZWxlc3MsIGxvY2FsIEFsaWFzIEFuYWx5c2lzIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBMTFZNJ3MgcHJpbWFyeSBzdGF0ZWxlc3MgYW5kIGxvY2FsIGFsaWFzIGFuYWx5c2lzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfQkFTSUNBTElBU0FOQUxZU0lTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19CQVNJQ0FMSUFTQU5BTFlTSVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0Fzc3VtcHRpb25DYWNoZS5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTWVtb3J5TG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK3N0cnVjdCBBQU1ETm9kZXM7CitjbGFzcyBBUEludDsKK2NsYXNzIEFzc3VtcHRpb25DYWNoZTsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBEYXRhTGF5b3V0OworY2xhc3MgRG9taW5hdG9yVHJlZTsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgR0VQT3BlcmF0b3I7CitjbGFzcyBMb29wSW5mbzsKK2NsYXNzIFBISU5vZGU7CitjbGFzcyBTZWxlY3RJbnN0OworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CitjbGFzcyBWYWx1ZTsKKworLy8vIFRoaXMgaXMgdGhlIEFBIHJlc3VsdCBvYmplY3QgZm9yIHRoZSBiYXNpYywgbG9jYWwsIGFuZCBzdGF0ZWxlc3MgYWxpYXMKKy8vLyBhbmFseXNpcy4gSXQgaW1wbGVtZW50cyB0aGUgQUEgcXVlcnkgaW50ZXJmYWNlIGluIGFuIGVudGlyZWx5IHN0YXRlbGVzcworLy8vIG1hbm5lci4gQXMgb25lIGNvbnNlcXVlbmNlLCBpdCBpcyBuZXZlciBpbnZhbGlkYXRlZCBkdWUgdG8gSVIgY2hhbmdlcy4KKy8vLyBXaGlsZSBpdCBkb2VzIHJldGFpbiBzb21lIHN0b3JhZ2UsIHRoYXQgaXMgdXNlZCBhcyBhbiBvcHRpbWl6YXRpb24gYW5kIG5vdAorLy8vIHRvIHByZXNlcnZlIGluZm9ybWF0aW9uIGZyb20gcXVlcnkgdG8gcXVlcnkuIEhvd2V2ZXIgaXQgZG9lcyByZXRhaW4gaGFuZGxlcworLy8vIHRvIHZhcmlvdXMgb3RoZXIgYW5hbHlzZXMgYW5kIG11c3QgYmUgcmVjb21wdXRlZCB3aGVuIHRob3NlIGFuYWx5c2VzIGFyZS4KK2NsYXNzIEJhc2ljQUFSZXN1bHQgOiBwdWJsaWMgQUFSZXN1bHRCYXNlPEJhc2ljQUFSZXN1bHQ+IHsKKyAgZnJpZW5kIEFBUmVzdWx0QmFzZTxCYXNpY0FBUmVzdWx0PjsKKworICBjb25zdCBEYXRhTGF5b3V0ICZETDsKKyAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gJlRMSTsKKyAgQXNzdW1wdGlvbkNhY2hlICZBQzsKKyAgRG9taW5hdG9yVHJlZSAqRFQ7CisgIExvb3BJbmZvICpMSTsKKworcHVibGljOgorICBCYXNpY0FBUmVzdWx0KGNvbnN0IERhdGFMYXlvdXQgJkRMLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAmVExJLAorICAgICAgICAgICAgICAgIEFzc3VtcHRpb25DYWNoZSAmQUMsIERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBMb29wSW5mbyAqTEkgPSBudWxscHRyKQorICAgICAgOiBBQVJlc3VsdEJhc2UoKSwgREwoREwpLCBUTEkoVExJKSwgQUMoQUMpLCBEVChEVCksIExJKExJKSB7fQorCisgIEJhc2ljQUFSZXN1bHQoY29uc3QgQmFzaWNBQVJlc3VsdCAmQXJnKQorICAgICAgOiBBQVJlc3VsdEJhc2UoQXJnKSwgREwoQXJnLkRMKSwgVExJKEFyZy5UTEkpLCBBQyhBcmcuQUMpLCBEVChBcmcuRFQpLAorICAgICAgICBMSShBcmcuTEkpIHt9CisgIEJhc2ljQUFSZXN1bHQoQmFzaWNBQVJlc3VsdCAmJkFyZykKKyAgICAgIDogQUFSZXN1bHRCYXNlKHN0ZDo6bW92ZShBcmcpKSwgREwoQXJnLkRMKSwgVExJKEFyZy5UTEkpLCBBQyhBcmcuQUMpLAorICAgICAgICBEVChBcmcuRFQpLCBMSShBcmcuTEkpIHt9CisKKyAgLy8vIEhhbmRsZSBpbnZhbGlkYXRpb24gZXZlbnRzIGluIHRoZSBuZXcgcGFzcyBtYW5hZ2VyLgorICBib29sIGludmFsaWRhdGUoRnVuY3Rpb24gJkYsIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzICZQQSwKKyAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyOjpJbnZhbGlkYXRvciAmSW52KTsKKworICBBbGlhc1Jlc3VsdCBhbGlhcyhjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jQSwgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvY0IpOworCisgIE1vZFJlZkluZm8gZ2V0TW9kUmVmSW5mbyhJbW11dGFibGVDYWxsU2l0ZSBDUywgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvYyk7CisKKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTMSwgSW1tdXRhYmxlQ2FsbFNpdGUgQ1MyKTsKKworICAvLy8gQ2hhc2VzIHBvaW50ZXJzIHVudGlsIHdlIGZpbmQgYSAoY29uc3RhbnQgZ2xvYmFsKSBvciBub3QuCisgIGJvb2wgcG9pbnRzVG9Db25zdGFudE1lbW9yeShjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jLCBib29sIE9yTG9jYWwpOworCisgIC8vLyBHZXQgdGhlIGxvY2F0aW9uIGFzc29jaWF0ZWQgd2l0aCBhIHBvaW50ZXIgYXJndW1lbnQgb2YgYSBjYWxsc2l0ZS4KKyAgTW9kUmVmSW5mbyBnZXRBcmdNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTLCB1bnNpZ25lZCBBcmdJZHgpOworCisgIC8vLyBSZXR1cm5zIHRoZSBiZWhhdmlvciB3aGVuIGNhbGxpbmcgdGhlIGdpdmVuIGNhbGwgc2l0ZS4KKyAgRnVuY3Rpb25Nb2RSZWZCZWhhdmlvciBnZXRNb2RSZWZCZWhhdmlvcihJbW11dGFibGVDYWxsU2l0ZSBDUyk7CisKKyAgLy8vIFJldHVybnMgdGhlIGJlaGF2aW9yIHdoZW4gY2FsbGluZyB0aGUgZ2l2ZW4gZnVuY3Rpb24uIEZvciB1c2Ugd2hlbiB0aGUKKyAgLy8vIGNhbGwgc2l0ZSBpcyBub3Qga25vd24uCisgIEZ1bmN0aW9uTW9kUmVmQmVoYXZpb3IgZ2V0TW9kUmVmQmVoYXZpb3IoY29uc3QgRnVuY3Rpb24gKkYpOworCitwcml2YXRlOgorICAvLyBBIGxpbmVhciB0cmFuc2Zvcm1hdGlvbiBvZiBhIFZhbHVlOyB0aGlzIGNsYXNzIHJlcHJlc2VudHMgWkV4dChTRXh0KFYsCisgIC8vIFNFeHRCaXRzKSwgWkV4dEJpdHMpICogU2NhbGUgKyBPZmZzZXQuCisgIHN0cnVjdCBWYXJpYWJsZUdFUEluZGV4IHsKKyAgICAvLyBBbiBvcGFxdWUgVmFsdWUgLSB3ZSBjYW4ndCBkZWNvbXBvc2UgdGhpcyBmdXJ0aGVyLgorICAgIGNvbnN0IFZhbHVlICpWOworCisgICAgLy8gV2UgbmVlZCB0byB0cmFjayB3aGF0IGV4dGVuc2lvbnMgd2UndmUgZG9uZSBhcyB3ZSBjb25zaWRlciB0aGUgc2FtZSBWYWx1ZQorICAgIC8vIHdpdGggZGlmZmVyZW50IGV4dGVuc2lvbnMgYXMgZGlmZmVyZW50IHZhcmlhYmxlcyBpbiBhIEdFUCdzIGxpbmVhcgorICAgIC8vIGV4cHJlc3Npb247CisgICAgLy8gZS5nLjogaWYgViA9PSAtMSwgdGhlbiBzZXh0KHgpICE9IHpleHQoeCkuCisgICAgdW5zaWduZWQgWkV4dEJpdHM7CisgICAgdW5zaWduZWQgU0V4dEJpdHM7CisKKyAgICBpbnQ2NF90IFNjYWxlOworCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZhcmlhYmxlR0VQSW5kZXggJk90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gViA9PSBPdGhlci5WICYmIFpFeHRCaXRzID09IE90aGVyLlpFeHRCaXRzICYmCisgICAgICAgICAgICAgU0V4dEJpdHMgPT0gT3RoZXIuU0V4dEJpdHMgJiYgU2NhbGUgPT0gT3RoZXIuU2NhbGU7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFZhcmlhYmxlR0VQSW5kZXggJk90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oT3RoZXIpOworICAgIH0KKyAgfTsKKworICAvLyBSZXByZXNlbnRzIHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgb2YgYSBHRVAsIGRlY29tcG9zZWQgaW50byBhIGJhc2UgcG9pbnRlciwKKyAgLy8gY29uc3RhbnQgb2Zmc2V0cywgYW5kIHZhcmlhYmxlIHNjYWxlZCBpbmRpY2VzLgorICBzdHJ1Y3QgRGVjb21wb3NlZEdFUCB7CisgICAgLy8gQmFzZSBwb2ludGVyIG9mIHRoZSBHRVAKKyAgICBjb25zdCBWYWx1ZSAqQmFzZTsKKyAgICAvLyBUb3RhbCBjb25zdGFudCBvZmZzZXQgdy5yLnQgdGhlIGJhc2UgZnJvbSBpbmRleGluZyBpbnRvIHN0cnVjdHMKKyAgICBpbnQ2NF90IFN0cnVjdE9mZnNldDsKKyAgICAvLyBUb3RhbCBjb25zdGFudCBvZmZzZXQgdy5yLnQgdGhlIGJhc2UgZnJvbSBpbmRleGluZyB0aHJvdWdoCisgICAgLy8gcG9pbnRlcnMvYXJyYXlzL3ZlY3RvcnMKKyAgICBpbnQ2NF90IE90aGVyT2Zmc2V0OworICAgIC8vIFNjYWxlZCB2YXJpYWJsZSAobm9uLWNvbnN0YW50KSBpbmRpY2VzLgorICAgIFNtYWxsVmVjdG9yPFZhcmlhYmxlR0VQSW5kZXgsIDQ+IFZhckluZGljZXM7CisgIH07CisKKyAgLy8vIFRyYWNrIGFsaWFzIHF1ZXJpZXMgdG8gZ3VhcmQgYWdhaW5zdCByZWN1cnNpb24uCisgIHVzaW5nIExvY1BhaXIgPSBzdGQ6OnBhaXI8TWVtb3J5TG9jYXRpb24sIE1lbW9yeUxvY2F0aW9uPjsKKyAgdXNpbmcgQWxpYXNDYWNoZVR5ID0gU21hbGxEZW5zZU1hcDxMb2NQYWlyLCBBbGlhc1Jlc3VsdCwgOD47CisgIEFsaWFzQ2FjaGVUeSBBbGlhc0NhY2hlOworCisgIC8vLyBUcmFja3MgcGhpIG5vZGVzIHdlIGhhdmUgdmlzaXRlZC4KKyAgLy8vCisgIC8vLyBXaGVuIGludGVycHJldCAiVmFsdWUiIHBvaW50ZXIgZXF1YWxpdHkgYXMgdmFsdWUgZXF1YWxpdHkgd2UgbmVlZCB0byBtYWtlCisgIC8vLyBzdXJlIHRoYXQgdGhlICJWYWx1ZSIgaXMgbm90IHBhcnQgb2YgYSBjeWNsZS4gT3RoZXJ3aXNlLCB0d28gdXNlcyBjb3VsZAorICAvLy8gY29tZSBmcm9tIGRpZmZlcmVudCAiaXRlcmF0aW9ucyIgb2YgYSBjeWNsZSBhbmQgc2VlIGRpZmZlcmVudCB2YWx1ZXMgZm9yCisgIC8vLyB0aGUgc2FtZSAiVmFsdWUiIHBvaW50ZXIuCisgIC8vLworICAvLy8gVGhlIGZvbGxvd2luZyBleGFtcGxlIHNob3dzIHRoZSBwcm9ibGVtOgorICAvLy8gICAlcCA9IHBoaSglYWxsb2NhMSwgJWFkZHIyKQorICAvLy8gICAlbCA9IGxvYWQgJXB0cgorICAvLy8gICAlYWRkcjEgPSBnZXAsICVhbGxvY2EyLCAwLCAlbAorICAvLy8gICAlYWRkcjIgPSBnZXAgICVhbGxvY2EyLCAwLCAoJWwgKyAxKQorICAvLy8gICAgICBhbGlhcyglcCwgJWFkZHIxKSAtPiBNYXlBbGlhcyAhCisgIC8vLyAgIHN0b3JlICVsLCAuLi4KKyAgU21hbGxQdHJTZXQ8Y29uc3QgQmFzaWNCbG9jayAqLCA4PiBWaXNpdGVkUGhpQkJzOworCisgIC8vLyBUcmFja3MgaW5zdHJ1Y3Rpb25zIHZpc2l0ZWQgYnkgcG9pbnRzVG9Db25zdGFudE1lbW9yeS4KKyAgU21hbGxQdHJTZXQ8Y29uc3QgVmFsdWUgKiwgMTY+IFZpc2l0ZWQ7CisKKyAgc3RhdGljIGNvbnN0IFZhbHVlICoKKyAgR2V0TGluZWFyRXhwcmVzc2lvbihjb25zdCBWYWx1ZSAqViwgQVBJbnQgJlNjYWxlLCBBUEludCAmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZaRXh0Qml0cywgdW5zaWduZWQgJlNFeHRCaXRzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMLCB1bnNpZ25lZCBEZXB0aCwgQXNzdW1wdGlvbkNhY2hlICpBQywKKyAgICAgICAgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICpEVCwgYm9vbCAmTlNXLCBib29sICZOVVcpOworCisgIHN0YXRpYyBib29sIERlY29tcG9zZUdFUEV4cHJlc3Npb24oY29uc3QgVmFsdWUgKlYsIERlY29tcG9zZWRHRVAgJkRlY29tcG9zZWQsCisgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCwgQXNzdW1wdGlvbkNhY2hlICpBQywgRG9taW5hdG9yVHJlZSAqRFQpOworCisgIHN0YXRpYyBib29sIGlzR0VQQmFzZUF0TmVnYXRpdmVPZmZzZXQoY29uc3QgR0VQT3BlcmF0b3IgKkdFUE9wLAorICAgICAgY29uc3QgRGVjb21wb3NlZEdFUCAmRGVjb21wR0VQLCBjb25zdCBEZWNvbXBvc2VkR0VQICZEZWNvbXBPYmplY3QsCisgICAgICB1aW50NjRfdCBPYmplY3RBY2Nlc3NTaXplKTsKKworICAvLy8gXGJyaWVmIEEgSGV1cmlzdGljIGZvciBhbGlhc0dFUCB0aGF0IHNlYXJjaGVzIGZvciBhIGNvbnN0YW50IG9mZnNldAorICAvLy8gYmV0d2VlbiB0aGUgdmFyaWFibGVzLgorICAvLy8KKyAgLy8vIEdldExpbmVhckV4cHJlc3Npb24gaGFzIHNvbWUgbGltaXRhdGlvbnMsIGFzIGdlbmVyYWxseSB6ZXh0KCV4ICsgMSkKKyAgLy8vICE9IHpleHQoJXgpICsgemV4dCgxKSBpZiB0aGUgYXJpdGhtZXRpYyBvdmVyZmxvd3MuIEdldExpbmVhckV4cHJlc3Npb24KKyAgLy8vIHdpbGwgdGhlcmVmb3JlIGNvbnNlcnZhdGl2ZWx5IHJlZnVzZSB0byBkZWNvbXBvc2UgdGhlc2UgZXhwcmVzc2lvbnMuCisgIC8vLyBIb3dldmVyLCB3ZSBrbm93IHRoYXQsIGZvciBhbGwgJXgsIHpleHQoJXgpICE9IHpleHQoJXggKyAxKSwgZXZlbiBpZgorICAvLy8gdGhlIGFkZGl0aW9uIG92ZXJmbG93cy4KKyAgYm9vbAorICBjb25zdGFudE9mZnNldEhldXJpc3RpYyhjb25zdCBTbWFsbFZlY3RvckltcGw8VmFyaWFibGVHRVBJbmRleD4gJlZhckluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFYxU2l6ZSwgdWludDY0X3QgVjJTaXplLCBpbnQ2NF90IEJhc2VPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc3VtcHRpb25DYWNoZSAqQUMsIERvbWluYXRvclRyZWUgKkRUKTsKKworICBib29sIGlzVmFsdWVFcXVhbEluUG90ZW50aWFsQ3ljbGVzKGNvbnN0IFZhbHVlICpWMSwgY29uc3QgVmFsdWUgKlYyKTsKKworICB2b2lkIEdldEluZGV4RGlmZmVyZW5jZShTbWFsbFZlY3RvckltcGw8VmFyaWFibGVHRVBJbmRleD4gJkRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxWYXJpYWJsZUdFUEluZGV4PiAmU3JjKTsKKworICBBbGlhc1Jlc3VsdCBhbGlhc0dFUChjb25zdCBHRVBPcGVyYXRvciAqVjEsIHVpbnQ2NF90IFYxU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUFNRE5vZGVzICZWMUFBSW5mbywgY29uc3QgVmFsdWUgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBWMlNpemUsIGNvbnN0IEFBTUROb2RlcyAmVjJBQUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpVbmRlcmx5aW5nVjEsIGNvbnN0IFZhbHVlICpVbmRlcmx5aW5nVjIpOworCisgIEFsaWFzUmVzdWx0IGFsaWFzUEhJKGNvbnN0IFBISU5vZGUgKlBOLCB1aW50NjRfdCBQTlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFBTUROb2RlcyAmUE5BQUluZm8sIGNvbnN0IFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgVjJTaXplLCBjb25zdCBBQU1ETm9kZXMgJlYyQUFJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqVW5kZXJWMik7CisKKyAgQWxpYXNSZXN1bHQgYWxpYXNTZWxlY3QoY29uc3QgU2VsZWN0SW5zdCAqU0ksIHVpbnQ2NF90IFNJU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUFNRE5vZGVzICZTSUFBSW5mbywgY29uc3QgVmFsdWUgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBWMlNpemUsIGNvbnN0IEFBTUROb2RlcyAmVjJBQUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpVbmRlclYyKTsKKworICBBbGlhc1Jlc3VsdCBhbGlhc0NoZWNrKGNvbnN0IFZhbHVlICpWMSwgdWludDY0X3QgVjFTaXplLCBBQU1ETm9kZXMgVjFBQVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqVjIsIHVpbnQ2NF90IFYyU2l6ZSwgQUFNRE5vZGVzIFYyQUFUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKk8xID0gbnVsbHB0ciwgY29uc3QgVmFsdWUgKk8yID0gbnVsbHB0cik7Cit9OworCisvLy8gQW5hbHlzaXMgcGFzcyBwcm92aWRpbmcgYSBuZXZlci1pbnZhbGlkYXRlZCBhbGlhcyBhbmFseXNpcyByZXN1bHQuCitjbGFzcyBCYXNpY0FBIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPEJhc2ljQUE+IHsKKyAgZnJpZW5kIEFuYWx5c2lzSW5mb01peGluPEJhc2ljQUE+OworCisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7CisKK3B1YmxpYzoKKyAgdXNpbmcgUmVzdWx0ID0gQmFzaWNBQVJlc3VsdDsKKworICBCYXNpY0FBUmVzdWx0IHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBMZWdhY3kgd3JhcHBlciBwYXNzIHRvIHByb3ZpZGUgdGhlIEJhc2ljQUFSZXN1bHQgb2JqZWN0LgorY2xhc3MgQmFzaWNBQVdyYXBwZXJQYXNzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgIHN0ZDo6dW5pcXVlX3B0cjxCYXNpY0FBUmVzdWx0PiBSZXN1bHQ7CisKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIEJhc2ljQUFXcmFwcGVyUGFzcygpOworCisgIEJhc2ljQUFSZXN1bHQgJmdldFJlc3VsdCgpIHsgcmV0dXJuICpSZXN1bHQ7IH0KKyAgY29uc3QgQmFzaWNBQVJlc3VsdCAmZ2V0UmVzdWx0KCkgY29uc3QgeyByZXR1cm4gKlJlc3VsdDsgfQorCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCitGdW5jdGlvblBhc3MgKmNyZWF0ZUJhc2ljQUFXcmFwcGVyUGFzcygpOworCisvLy8gQSBoZWxwZXIgZm9yIHRoZSBsZWdhY3kgcGFzcyBtYW5hZ2VyIHRvIGNyZWF0ZSBhIFxjIEJhc2ljQUFSZXN1bHQgb2JqZWN0CisvLy8gcG9wdWxhdGVkIHRvIHRoZSBiZXN0IG9mIG91ciBhYmlsaXR5IGZvciBhIHBhcnRpY3VsYXIgZnVuY3Rpb24gd2hlbiBpbnNpZGUKKy8vLyBvZiBhIFxjIE1vZHVsZVBhc3Mgb3IgYSBcYyBDYWxsR3JhcGhTQ0NQYXNzLgorQmFzaWNBQVJlc3VsdCBjcmVhdGVMZWdhY3lQTUJhc2ljQUFSZXN1bHQoUGFzcyAmUCwgRnVuY3Rpb24gJkYpOworCisvLy8gVGhpcyBjbGFzcyBpcyBhIGZ1bmN0b3IgdG8gYmUgdXNlZCBpbiBsZWdhY3kgbW9kdWxlIG9yIFNDQyBwYXNzZXMgZm9yCisvLy8gY29tcHV0aW5nIEFBIHJlc3VsdHMgZm9yIGEgZnVuY3Rpb24uIFdlIHN0b3JlIHRoZSByZXN1bHRzIGluIGZpZWxkcyBzbyB0aGF0CisvLy8gdGhleSBsaXZlIGxvbmcgZW5vdWdoIHRvIGJlIHF1ZXJpZWQsIGJ1dCB3ZSByZS11c2UgdGhlbSBlYWNoIHRpbWUuCitjbGFzcyBMZWdhY3lBQVJHZXR0ZXIgeworICBQYXNzICZQOworICBPcHRpb25hbDxCYXNpY0FBUmVzdWx0PiBCQVI7CisgIE9wdGlvbmFsPEFBUmVzdWx0cz4gQUFSOworCitwdWJsaWM6CisgIExlZ2FjeUFBUkdldHRlcihQYXNzICZQKSA6IFAoUCkge30KKyAgQUFSZXN1bHRzICZvcGVyYXRvcigpKEZ1bmN0aW9uICZGKSB7CisgICAgQkFSLmVtcGxhY2UoY3JlYXRlTGVnYWN5UE1CYXNpY0FBUmVzdWx0KFAsIEYpKTsKKyAgICBBQVIuZW1wbGFjZShjcmVhdGVMZWdhY3lQTUFBUmVzdWx0cyhQLCBGLCAqQkFSKSk7CisgICAgcmV0dXJuICpBQVI7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX0JBU0lDQUxJQVNBTkFMWVNJU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0Jsb2NrRnJlcXVlbmN5SW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9CbG9ja0ZyZXF1ZW5jeUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTM3MGNiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9CbG9ja0ZyZXF1ZW5jeUluZm8uaApAQCAtMCwwICsxLDE1NiBAQAorLy89PT0tIEJsb2NrRnJlcXVlbmN5SW5mby5oIC0gQmxvY2sgRnJlcXVlbmN5IEFuYWx5c2lzIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb29wcyBzaG91bGQgYmUgc2ltcGxpZmllZCBiZWZvcmUgdGhpcyBhbmFseXNpcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfQkxPQ0tGUkVRVUVOQ1lJTkZPX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19CTE9DS0ZSRVFVRU5DWUlORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Jsb2NrRnJlcXVlbmN5LmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIEJyYW5jaFByb2JhYmlsaXR5SW5mbzsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgTG9vcEluZm87CitjbGFzcyBNb2R1bGU7CitjbGFzcyByYXdfb3N0cmVhbTsKK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1Q+IGNsYXNzIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGw7CisKK2VudW0gUEdPVmlld0NvdW50c1R5cGUgeyBQR09WQ1RfTm9uZSwgUEdPVkNUX0dyYXBoLCBQR09WQ1RfVGV4dCB9OworCisvLy8gQmxvY2tGcmVxdWVuY3lJbmZvIHBhc3MgdXNlcyBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsIGltcGxlbWVudGF0aW9uIHRvCisvLy8gZXN0aW1hdGUgSVIgYmFzaWMgYmxvY2sgZnJlcXVlbmNpZXMuCitjbGFzcyBCbG9ja0ZyZXF1ZW5jeUluZm8geworICB1c2luZyBJbXBsVHlwZSA9IEJsb2NrRnJlcXVlbmN5SW5mb0ltcGw8QmFzaWNCbG9jaz47CisKKyAgc3RkOjp1bmlxdWVfcHRyPEltcGxUeXBlPiBCRkk7CisKK3B1YmxpYzoKKyAgQmxvY2tGcmVxdWVuY3lJbmZvKCk7CisgIEJsb2NrRnJlcXVlbmN5SW5mbyhjb25zdCBGdW5jdGlvbiAmRiwgY29uc3QgQnJhbmNoUHJvYmFiaWxpdHlJbmZvICZCUEksCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wSW5mbyAmTEkpOworICBCbG9ja0ZyZXF1ZW5jeUluZm8oY29uc3QgQmxvY2tGcmVxdWVuY3lJbmZvICYpID0gZGVsZXRlOworICBCbG9ja0ZyZXF1ZW5jeUluZm8gJm9wZXJhdG9yPShjb25zdCBCbG9ja0ZyZXF1ZW5jeUluZm8gJikgPSBkZWxldGU7CisgIEJsb2NrRnJlcXVlbmN5SW5mbyhCbG9ja0ZyZXF1ZW5jeUluZm8gJiZBcmcpOworICBCbG9ja0ZyZXF1ZW5jeUluZm8gJm9wZXJhdG9yPShCbG9ja0ZyZXF1ZW5jeUluZm8gJiZSSFMpOworICB+QmxvY2tGcmVxdWVuY3lJbmZvKCk7CisKKyAgLy8vIEhhbmRsZSBpbnZhbGlkYXRpb24gZXhwbGljaXRseS4KKyAgYm9vbCBpbnZhbGlkYXRlKEZ1bmN0aW9uICZGLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmUEEsCisgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlcjo6SW52YWxpZGF0b3IgJik7CisKKyAgY29uc3QgRnVuY3Rpb24gKmdldEZ1bmN0aW9uKCkgY29uc3Q7CisgIGNvbnN0IEJyYW5jaFByb2JhYmlsaXR5SW5mbyAqZ2V0QlBJKCkgY29uc3Q7CisgIHZvaWQgdmlldygpIGNvbnN0OworCisgIC8vLyBnZXRibG9ja0ZyZXEgLSBSZXR1cm4gYmxvY2sgZnJlcXVlbmN5LiBSZXR1cm4gMCBpZiB3ZSBkb24ndCBoYXZlIHRoZQorICAvLy8gaW5mb3JtYXRpb24uIFBsZWFzZSBub3RlIHRoYXQgaW5pdGlhbCBmcmVxdWVuY3kgaXMgZXF1YWwgdG8gRU5UUllfRlJFUS4gSXQKKyAgLy8vIG1lYW5zIHRoYXQgd2Ugc2hvdWxkIG5vdCByZWx5IG9uIHRoZSB2YWx1ZSBpdHNlbGYsIGJ1dCBvbmx5IG9uIHRoZQorICAvLy8gY29tcGFyaXNvbiB0byB0aGUgb3RoZXIgYmxvY2sgZnJlcXVlbmNpZXMuIFdlIGRvIHRoaXMgdG8gYXZvaWQgdXNpbmcgb2YKKyAgLy8vIGZsb2F0aW5nIHBvaW50cy4KKyAgQmxvY2tGcmVxdWVuY3kgZ2V0QmxvY2tGcmVxKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGVzdGltYXRlZCBwcm9maWxlIGNvdW50IG9mIFxwIEJCLgorICAvLy8gVGhpcyBjb21wdXRlcyB0aGUgcmVsYXRpdmUgYmxvY2sgZnJlcXVlbmN5IG9mIFxwIEJCIGFuZCBtdWx0aXBsaWVzIGl0IGJ5CisgIC8vLyB0aGUgZW5jbG9zaW5nIGZ1bmN0aW9uJ3MgY291bnQgKGlmIGF2YWlsYWJsZSkgYW5kIHJldHVybnMgdGhlIHZhbHVlLgorICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0QmxvY2tQcm9maWxlQ291bnQoY29uc3QgQmFzaWNCbG9jayAqQkIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgZXN0aW1hdGVkIHByb2ZpbGUgY291bnQgb2YgXHAgRnJlcS4KKyAgLy8vIFRoaXMgdXNlcyB0aGUgZnJlcXVlbmN5IFxwIEZyZXEgYW5kIG11bHRpcGxpZXMgaXQgYnkKKyAgLy8vIHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24ncyBjb3VudCAoaWYgYXZhaWxhYmxlKSBhbmQgcmV0dXJucyB0aGUgdmFsdWUuCisgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRQcm9maWxlQ291bnRGcm9tRnJlcSh1aW50NjRfdCBGcmVxKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBccCBCQiBpcyBhbiBpcnJlZHVjaWJsZSBsb29wIGhlYWRlcgorICAvLy8gYmxvY2suIE90aGVyd2lzZSBmYWxzZS4KKyAgYm9vbCBpc0lyckxvb3BIZWFkZXIoY29uc3QgQmFzaWNCbG9jayAqQkIpOworCisgIC8vIFNldCB0aGUgZnJlcXVlbmN5IG9mIHRoZSBnaXZlbiBiYXNpYyBibG9jay4KKyAgdm9pZCBzZXRCbG9ja0ZyZXEoY29uc3QgQmFzaWNCbG9jayAqQkIsIHVpbnQ2NF90IEZyZXEpOworCisgIC8vLyBTZXQgdGhlIGZyZXF1ZW5jeSBvZiBccCBSZWZlcmVuY2VCQiB0byBccCBGcmVxIGFuZCBzY2FsZSB0aGUgZnJlcXVlbmNpZXMKKyAgLy8vIG9mIHRoZSBibG9ja3MgaW4gXHAgQmxvY2tzVG9TY2FsZSBzdWNoIHRoYXQgdGhlaXIgZnJlcXVlbmNpZXMgcmVsYXRpdmUKKyAgLy8vIHRvIFxwIFJlZmVyZW5jZUJCIHJlbWFpbiB1bmNoYW5nZWQuCisgIHZvaWQgc2V0QmxvY2tGcmVxQW5kU2NhbGUoY29uc3QgQmFzaWNCbG9jayAqUmVmZXJlbmNlQkIsIHVpbnQ2NF90IEZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXRJbXBsPEJhc2ljQmxvY2sgKj4gJkJsb2Nrc1RvU2NhbGUpOworCisgIC8vLyBjYWxjdWxhdGUgLSBjb21wdXRlIGJsb2NrIGZyZXF1ZW5jeSBpbmZvIGZvciB0aGUgZ2l2ZW4gZnVuY3Rpb24uCisgIHZvaWQgY2FsY3VsYXRlKGNvbnN0IEZ1bmN0aW9uICZGLCBjb25zdCBCcmFuY2hQcm9iYWJpbGl0eUluZm8gJkJQSSwKKyAgICAgICAgICAgICAgICAgY29uc3QgTG9vcEluZm8gJkxJKTsKKworICAvLyBQcmludCB0aGUgYmxvY2sgZnJlcXVlbmN5IEZyZXEgdG8gT1MgdXNpbmcgdGhlIGN1cnJlbnQgZnVuY3Rpb25zIGVudHJ5CisgIC8vIGZyZXF1ZW5jeSB0byBjb252ZXJ0IGZyZXEgaW50byBhIHJlbGF0aXZlIGRlY2ltYWwgZm9ybS4KKyAgcmF3X29zdHJlYW0gJnByaW50QmxvY2tGcmVxKHJhd19vc3RyZWFtICZPUywgY29uc3QgQmxvY2tGcmVxdWVuY3kgRnJlcSkgY29uc3Q7CisKKyAgLy8gQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYXR0ZW1wdHMgdG8gbG9vayB1cCB0aGUgZnJlcXVlbmN5IGFzc29jaWF0ZWQgd2l0aAorICAvLyBCQiBhbmQgcHJpbnQgaXQgdG8gT1MuCisgIHJhd19vc3RyZWFtICZwcmludEJsb2NrRnJlcShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IEJhc2ljQmxvY2sgKkJCKSBjb25zdDsKKworICB1aW50NjRfdCBnZXRFbnRyeUZyZXEoKSBjb25zdDsKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCk7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKK307CisKKy8vLyBcYnJpZWYgQW5hbHlzaXMgcGFzcyB3aGljaCBjb21wdXRlcyBcYyBCbG9ja0ZyZXF1ZW5jeUluZm8uCitjbGFzcyBCbG9ja0ZyZXF1ZW5jeUFuYWx5c2lzCisgICAgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48QmxvY2tGcmVxdWVuY3lBbmFseXNpcz4geworICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48QmxvY2tGcmVxdWVuY3lBbmFseXNpcz47CisKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIFByb3ZpZGUgdGhlIHJlc3VsdCB0eXBlIGZvciB0aGlzIGFuYWx5c2lzIHBhc3MuCisgIHVzaW5nIFJlc3VsdCA9IEJsb2NrRnJlcXVlbmN5SW5mbzsKKworICAvLy8gXGJyaWVmIFJ1biB0aGUgYW5hbHlzaXMgcGFzcyBvdmVyIGEgZnVuY3Rpb24gYW5kIHByb2R1Y2UgQkZJLgorICBSZXN1bHQgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIFxicmllZiBQcmludGVyIHBhc3MgZm9yIHRoZSBcYyBCbG9ja0ZyZXF1ZW5jeUluZm8gcmVzdWx0cy4KK2NsYXNzIEJsb2NrRnJlcXVlbmN5UHJpbnRlclBhc3MKKyAgICA6IHB1YmxpYyBQYXNzSW5mb01peGluPEJsb2NrRnJlcXVlbmN5UHJpbnRlclBhc3M+IHsKKyAgcmF3X29zdHJlYW0gJk9TOworCitwdWJsaWM6CisgIGV4cGxpY2l0IEJsb2NrRnJlcXVlbmN5UHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk9TKSA6IE9TKE9TKSB7fQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBcYnJpZWYgTGVnYWN5IGFuYWx5c2lzIHBhc3Mgd2hpY2ggY29tcHV0ZXMgXGMgQmxvY2tGcmVxdWVuY3lJbmZvLgorY2xhc3MgQmxvY2tGcmVxdWVuY3lJbmZvV3JhcHBlclBhc3MgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgQmxvY2tGcmVxdWVuY3lJbmZvIEJGSTsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBCbG9ja0ZyZXF1ZW5jeUluZm9XcmFwcGVyUGFzcygpOworICB+QmxvY2tGcmVxdWVuY3lJbmZvV3JhcHBlclBhc3MoKSBvdmVycmlkZTsKKworICBCbG9ja0ZyZXF1ZW5jeUluZm8gJmdldEJGSSgpIHsgcmV0dXJuIEJGSTsgfQorICBjb25zdCBCbG9ja0ZyZXF1ZW5jeUluZm8gJmdldEJGSSgpIGNvbnN0IHsgcmV0dXJuIEJGSTsgfQorCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSBvdmVycmlkZTsKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGU7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNb2R1bGUgKk0pIGNvbnN0IG92ZXJyaWRlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfQkxPQ0tGUkVRVUVOQ1lJTkZPX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQmxvY2tGcmVxdWVuY3lJbmZvSW1wbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9CbG9ja0ZyZXF1ZW5jeUluZm9JbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDBjNDBiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQmxvY2tGcmVxdWVuY3lJbmZvSW1wbC5oCkBAIC0wLDAgKzEsMTQ3MyBAQAorLy89PS0gQmxvY2tGcmVxdWVuY3lJbmZvSW1wbC5oIC0gQmxvY2sgRnJlcXVlbmN5IEltcGxlbWVudGF0aW9uIC0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBTaGFyZWQgaW1wbGVtZW50YXRpb24gb2YgQmxvY2tGcmVxdWVuY3kgZm9yIElSIGFuZCBNYWNoaW5lIEluc3RydWN0aW9ucy4KKy8vIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBiZWxvdyBmb3IgQmxvY2tGcmVxdWVuY3lJbmZvSW1wbCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfQkxPQ0tGUkVRVUVOQ1lJTkZPSU1QTF9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfQkxPQ0tGUkVRVUVOQ1lJTkZPSU1QTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1Bvc3RPcmRlckl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TcGFyc2VCaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Jsb2NrRnJlcXVlbmN5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JyYW5jaFByb2JhYmlsaXR5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RPVEdyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NjYWxlZE51bWJlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxkZXF1ZT4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNkZWZpbmUgREVCVUdfVFlQRSAiYmxvY2stZnJlcSIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCcmFuY2hQcm9iYWJpbGl0eUluZm87CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIExvb3A7CitjbGFzcyBMb29wSW5mbzsKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworY2xhc3MgTWFjaGluZUJyYW5jaFByb2JhYmlsaXR5SW5mbzsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVMb29wOworY2xhc3MgTWFjaGluZUxvb3BJbmZvOworCituYW1lc3BhY2UgYmZpX2RldGFpbCB7CisKK3N0cnVjdCBJcnJlZHVjaWJsZUdyYXBoOworCisvLyBUaGlzIGlzIHBhcnQgb2YgYSB3b3JrYXJvdW5kIGZvciBhIEdDQyA0LjcgY3Jhc2ggb24gbGFtYmRhcy4KK3RlbXBsYXRlIDxjbGFzcyBCVD4gc3RydWN0IEJsb2NrRWRnZXNBZGRlcjsKKworLy8vIFxicmllZiBNYXNzIG9mIGEgYmxvY2suCisvLy8KKy8vLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBzb3J0IG9mIGZpeGVkLXBvaW50IGZyYWN0aW9uIGFsd2F5cyBiZXR3ZWVuIDAuMCBhbmQKKy8vLyAxLjAuICBnZXRNYXNzKCkgPT0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpIGluZGljYXRlcyBhIHZhbHVlIG9mCisvLy8gMS4wLgorLy8vCisvLy8gTWFzc2VzIGNhbiBiZSBhZGRlZCBhbmQgc3VidHJhY3RlZC4gIFNpbXBsZSBzYXR1cmF0aW9uIGFyaXRobWV0aWMgaXMgdXNlZCwKKy8vLyBzbyBhcml0aG1ldGljIG9wZXJhdGlvbnMgbmV2ZXIgb3ZlcmZsb3cgb3IgdW5kZXJmbG93LgorLy8vCisvLy8gTWFzc2VzIGNhbiBiZSBtdWx0aXBsaWVkLiAgTXVsdGlwbGljYXRpb24gdHJlYXRzIGZ1bGwgbWFzcyBhcyAxLjAgYW5kIHVzZXMKKy8vLyBhbiBpbmV4cGVuc2l2ZSBmbG9hdGluZy1wb2ludCBhbGdvcml0aG0gdGhhdCdzIG9mZi1ieS1vbmUgKGFsbW9zdCwgYnV0IG5vdAorLy8vIHF1aXRlLCBtYXhpbXVtIHByZWNpc2lvbikuCisvLy8KKy8vLyBNYXNzZXMgY2FuIGJlIHNjYWxlZCBieSBcYSBCcmFuY2hQcm9iYWJpbGl0eSBhdCBtYXhpbXVtIHByZWNpc2lvbi4KK2NsYXNzIEJsb2NrTWFzcyB7CisgIHVpbnQ2NF90IE1hc3MgPSAwOworCitwdWJsaWM6CisgIEJsb2NrTWFzcygpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgQmxvY2tNYXNzKHVpbnQ2NF90IE1hc3MpIDogTWFzcyhNYXNzKSB7fQorCisgIHN0YXRpYyBCbG9ja01hc3MgZ2V0RW1wdHkoKSB7IHJldHVybiBCbG9ja01hc3MoKTsgfQorCisgIHN0YXRpYyBCbG9ja01hc3MgZ2V0RnVsbCgpIHsKKyAgICByZXR1cm4gQmxvY2tNYXNzKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKSk7CisgIH0KKworICB1aW50NjRfdCBnZXRNYXNzKCkgY29uc3QgeyByZXR1cm4gTWFzczsgfQorCisgIGJvb2wgaXNGdWxsKCkgY29uc3QgeyByZXR1cm4gTWFzcyA9PSBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCk7IH0KKyAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gIU1hc3M7IH0KKworICBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsgcmV0dXJuIGlzRW1wdHkoKTsgfQorCisgIC8vLyBcYnJpZWYgQWRkIGFub3RoZXIgbWFzcy4KKyAgLy8vCisgIC8vLyBBZGRzIGFub3RoZXIgbWFzcywgc2F0dXJhdGluZyBhdCBcYSBpc0Z1bGwoKSByYXRoZXIgdGhhbiBvdmVyZmxvd2luZy4KKyAgQmxvY2tNYXNzICZvcGVyYXRvcis9KEJsb2NrTWFzcyBYKSB7CisgICAgdWludDY0X3QgU3VtID0gTWFzcyArIFguTWFzczsKKyAgICBNYXNzID0gU3VtIDwgTWFzcyA/IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDY0X3Q+OjptYXgoKSA6IFN1bTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gXGJyaWVmIFN1YnRyYWN0IGFub3RoZXIgbWFzcy4KKyAgLy8vCisgIC8vLyBTdWJ0cmFjdHMgYW5vdGhlciBtYXNzLCBzYXR1cmF0aW5nIGF0IFxhIGlzRW1wdHkoKSByYXRoZXIgdGhhbgorICAvLy8gdW5kZWZsb3dpbmcuCisgIEJsb2NrTWFzcyAmb3BlcmF0b3ItPShCbG9ja01hc3MgWCkgeworICAgIHVpbnQ2NF90IERpZmYgPSBNYXNzIC0gWC5NYXNzOworICAgIE1hc3MgPSBEaWZmID4gTWFzcyA/IDAgOiBEaWZmOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEJsb2NrTWFzcyAmb3BlcmF0b3IqPShCcmFuY2hQcm9iYWJpbGl0eSBQKSB7CisgICAgTWFzcyA9IFAuc2NhbGUoTWFzcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KEJsb2NrTWFzcyBYKSBjb25zdCB7IHJldHVybiBNYXNzID09IFguTWFzczsgfQorICBib29sIG9wZXJhdG9yIT0oQmxvY2tNYXNzIFgpIGNvbnN0IHsgcmV0dXJuIE1hc3MgIT0gWC5NYXNzOyB9CisgIGJvb2wgb3BlcmF0b3I8PShCbG9ja01hc3MgWCkgY29uc3QgeyByZXR1cm4gTWFzcyA8PSBYLk1hc3M7IH0KKyAgYm9vbCBvcGVyYXRvcj49KEJsb2NrTWFzcyBYKSBjb25zdCB7IHJldHVybiBNYXNzID49IFguTWFzczsgfQorICBib29sIG9wZXJhdG9yPChCbG9ja01hc3MgWCkgY29uc3QgeyByZXR1cm4gTWFzcyA8IFguTWFzczsgfQorICBib29sIG9wZXJhdG9yPihCbG9ja01hc3MgWCkgY29uc3QgeyByZXR1cm4gTWFzcyA+IFguTWFzczsgfQorCisgIC8vLyBcYnJpZWYgQ29udmVydCB0byBzY2FsZWQgbnVtYmVyLgorICAvLy8KKyAgLy8vIENvbnZlcnQgdG8gXGEgU2NhbGVkTnVtYmVyLiAgXGEgaXNGdWxsKCkgZ2l2ZXMgMS4wLCB3aGlsZSBcYSBpc0VtcHR5KCkKKyAgLy8vIGdpdmVzIHNsaWdodGx5IGFib3ZlIDAuMC4KKyAgU2NhbGVkTnVtYmVyPHVpbnQ2NF90PiB0b1NjYWxlZCgpIGNvbnN0OworCisgIHZvaWQgZHVtcCgpIGNvbnN0OworICByYXdfb3N0cmVhbSAmcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKK307CisKK2lubGluZSBCbG9ja01hc3Mgb3BlcmF0b3IrKEJsb2NrTWFzcyBMLCBCbG9ja01hc3MgUikgeworICByZXR1cm4gQmxvY2tNYXNzKEwpICs9IFI7Cit9CitpbmxpbmUgQmxvY2tNYXNzIG9wZXJhdG9yLShCbG9ja01hc3MgTCwgQmxvY2tNYXNzIFIpIHsKKyAgcmV0dXJuIEJsb2NrTWFzcyhMKSAtPSBSOworfQoraW5saW5lIEJsb2NrTWFzcyBvcGVyYXRvciooQmxvY2tNYXNzIEwsIEJyYW5jaFByb2JhYmlsaXR5IFIpIHsKKyAgcmV0dXJuIEJsb2NrTWFzcyhMKSAqPSBSOworfQoraW5saW5lIEJsb2NrTWFzcyBvcGVyYXRvciooQnJhbmNoUHJvYmFiaWxpdHkgTCwgQmxvY2tNYXNzIFIpIHsKKyAgcmV0dXJuIEJsb2NrTWFzcyhSKSAqPSBMOworfQorCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBCbG9ja01hc3MgWCkgeworICByZXR1cm4gWC5wcmludChPUyk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBiZmlfZGV0YWlsCisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc1BvZExpa2U8YmZpX2RldGFpbDo6QmxvY2tNYXNzPiB7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKK307CisKKy8vLyBcYnJpZWYgQmFzZSBjbGFzcyBmb3IgQmxvY2tGcmVxdWVuY3lJbmZvSW1wbAorLy8vCisvLy8gQmxvY2tGcmVxdWVuY3lJbmZvSW1wbEJhc2UgaGFzIHN1cHBvcnRpbmcgZGF0YSBzdHJ1Y3R1cmVzIGFuZCBzb21lCisvLy8gYWxnb3JpdGhtcyBmb3IgQmxvY2tGcmVxdWVuY3lJbmZvSW1wbEJhc2UuICBPbmx5IGFsZ29yaXRobXMgdGhhdCBkZXBlbmQgb24KKy8vLyB0aGUgYmxvY2sgdHlwZSAob3IgdGhhdCBjYWxsIHN1Y2ggYWxnb3JpdGhtcykgYXJlIHNraXBwZWQgaGVyZS4KKy8vLworLy8vIE5ldmVydGhlbGVzcywgdGhlIG1ham9yaXR5IG9mIHRoZSBvdmVyYWxsIGFsZ29yaXRobSBkb2N1bWVudGlvbiBsaXZlcyB3aXRoCisvLy8gQmxvY2tGcmVxdWVuY3lJbmZvSW1wbC4gIFNlZSB0aGVyZSBmb3IgZGV0YWlscy4KK2NsYXNzIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGxCYXNlIHsKK3B1YmxpYzoKKyAgdXNpbmcgU2NhbGVkNjQgPSBTY2FsZWROdW1iZXI8dWludDY0X3Q+OworICB1c2luZyBCbG9ja01hc3MgPSBiZmlfZGV0YWlsOjpCbG9ja01hc3M7CisKKyAgLy8vIFxicmllZiBSZXByZXNlbnRhdGl2ZSBvZiBhIGJsb2NrLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYSBzaW1wbGUgd3JhcHBlciBhcm91bmQgYW4gaW5kZXggaW50byB0aGUgcmV2ZXJzZS1wb3N0LW9yZGVyCisgIC8vLyB0cmF2ZXJzYWwgb2YgdGhlIGJsb2Nrcy4KKyAgLy8vCisgIC8vLyBVbmxpa2UgYSBibG9jayBwb2ludGVyLCBpdHMgb3JkZXIgaGFzIG1lYW5pbmcgKGxvY2F0aW9uIGluIHRoZQorICAvLy8gdG9wb2xvZ2ljYWwgc29ydCkgYW5kIGl0J3MgY2xhc3MgaXMgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiBibG9jayB0eXBlLgorICBzdHJ1Y3QgQmxvY2tOb2RlIHsKKyAgICB1c2luZyBJbmRleFR5cGUgPSB1aW50MzJfdDsKKworICAgIEluZGV4VHlwZSBJbmRleCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKTsKKworICAgIEJsb2NrTm9kZSgpID0gZGVmYXVsdDsKKyAgICBCbG9ja05vZGUoSW5kZXhUeXBlIEluZGV4KSA6IEluZGV4KEluZGV4KSB7fQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEJsb2NrTm9kZSAmWCkgY29uc3QgeyByZXR1cm4gSW5kZXggPT0gWC5JbmRleDsgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBCbG9ja05vZGUgJlgpIGNvbnN0IHsgcmV0dXJuIEluZGV4ICE9IFguSW5kZXg7IH0KKyAgICBib29sIG9wZXJhdG9yPD0oY29uc3QgQmxvY2tOb2RlICZYKSBjb25zdCB7IHJldHVybiBJbmRleCA8PSBYLkluZGV4OyB9CisgICAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEJsb2NrTm9kZSAmWCkgY29uc3QgeyByZXR1cm4gSW5kZXggPj0gWC5JbmRleDsgfQorICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEJsb2NrTm9kZSAmWCkgY29uc3QgeyByZXR1cm4gSW5kZXggPCBYLkluZGV4OyB9CisgICAgYm9vbCBvcGVyYXRvcj4oY29uc3QgQmxvY2tOb2RlICZYKSBjb25zdCB7IHJldHVybiBJbmRleCA+IFguSW5kZXg7IH0KKworICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIEluZGV4IDw9IGdldE1heEluZGV4KCk7IH0KKworICAgIHN0YXRpYyBzaXplX3QgZ2V0TWF4SW5kZXgoKSB7CisgICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSAtIDE7CisgICAgfQorICB9OworCisgIC8vLyBcYnJpZWYgU3RhdHMgYWJvdXQgYSBibG9jayBpdHNlbGYuCisgIHN0cnVjdCBGcmVxdWVuY3lEYXRhIHsKKyAgICBTY2FsZWQ2NCBTY2FsZWQ7CisgICAgdWludDY0X3QgSW50ZWdlcjsKKyAgfTsKKworICAvLy8gXGJyaWVmIERhdGEgYWJvdXQgYSBsb29wLgorICAvLy8KKyAgLy8vIENvbnRhaW5zIHRoZSBkYXRhIG5lY2Vzc2FyeSB0byByZXByZXNlbnQgYSBsb29wIGFzIGEgcHNldWRvLW5vZGUgb25jZSBpdCdzCisgIC8vLyBwYWNrYWdlZC4KKyAgc3RydWN0IExvb3BEYXRhIHsKKyAgICB1c2luZyBFeGl0TWFwID0gU21hbGxWZWN0b3I8c3RkOjpwYWlyPEJsb2NrTm9kZSwgQmxvY2tNYXNzPiwgND47CisgICAgdXNpbmcgTm9kZUxpc3QgPSBTbWFsbFZlY3RvcjxCbG9ja05vZGUsIDQ+OworICAgIHVzaW5nIEhlYWRlck1hc3NMaXN0ID0gU21hbGxWZWN0b3I8QmxvY2tNYXNzLCAxPjsKKworICAgIExvb3BEYXRhICpQYXJlbnQ7ICAgICAgICAgICAgLy8vPCBUaGUgcGFyZW50IGxvb3AuCisgICAgYm9vbCBJc1BhY2thZ2VkID0gZmFsc2U7ICAgICAvLy88IFdoZXRoZXIgdGhpcyBoYXMgYmVlbiBwYWNrYWdlZC4KKyAgICB1aW50MzJfdCBOdW1IZWFkZXJzID0gMTsgICAgIC8vLzwgTnVtYmVyIG9mIGhlYWRlcnMuCisgICAgRXhpdE1hcCBFeGl0czsgICAgICAgICAgICAgICAvLy88IFN1Y2Nlc3NvciBlZGdlcyAoYW5kIHdlaWdodHMpLgorICAgIE5vZGVMaXN0IE5vZGVzOyAgICAgICAgICAgICAgLy8vPCBIZWFkZXIgYW5kIHRoZSBtZW1iZXJzIG9mIHRoZSBsb29wLgorICAgIEhlYWRlck1hc3NMaXN0IEJhY2tlZGdlTWFzczsgLy8vPCBNYXNzIHJldHVybmVkIHRvIGVhY2ggbG9vcCBoZWFkZXIuCisgICAgQmxvY2tNYXNzIE1hc3M7CisgICAgU2NhbGVkNjQgU2NhbGU7CisKKyAgICBMb29wRGF0YShMb29wRGF0YSAqUGFyZW50LCBjb25zdCBCbG9ja05vZGUgJkhlYWRlcikKKyAgICAgIDogUGFyZW50KFBhcmVudCksIE5vZGVzKDEsIEhlYWRlciksIEJhY2tlZGdlTWFzcygxKSB7fQorCisgICAgdGVtcGxhdGUgPGNsYXNzIEl0MSwgY2xhc3MgSXQyPgorICAgIExvb3BEYXRhKExvb3BEYXRhICpQYXJlbnQsIEl0MSBGaXJzdEhlYWRlciwgSXQxIExhc3RIZWFkZXIsIEl0MiBGaXJzdE90aGVyLAorICAgICAgICAgICAgIEl0MiBMYXN0T3RoZXIpCisgICAgICAgIDogUGFyZW50KFBhcmVudCksIE5vZGVzKEZpcnN0SGVhZGVyLCBMYXN0SGVhZGVyKSB7CisgICAgICBOdW1IZWFkZXJzID0gTm9kZXMuc2l6ZSgpOworICAgICAgTm9kZXMuaW5zZXJ0KE5vZGVzLmVuZCgpLCBGaXJzdE90aGVyLCBMYXN0T3RoZXIpOworICAgICAgQmFja2VkZ2VNYXNzLnJlc2l6ZShOdW1IZWFkZXJzKTsKKyAgICB9CisKKyAgICBib29sIGlzSGVhZGVyKGNvbnN0IEJsb2NrTm9kZSAmTm9kZSkgY29uc3QgeworICAgICAgaWYgKGlzSXJyZWR1Y2libGUoKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6YmluYXJ5X3NlYXJjaChOb2Rlcy5iZWdpbigpLCBOb2Rlcy5iZWdpbigpICsgTnVtSGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlKTsKKyAgICAgIHJldHVybiBOb2RlID09IE5vZGVzWzBdOworICAgIH0KKworICAgIEJsb2NrTm9kZSBnZXRIZWFkZXIoKSBjb25zdCB7IHJldHVybiBOb2Rlc1swXTsgfQorICAgIGJvb2wgaXNJcnJlZHVjaWJsZSgpIGNvbnN0IHsgcmV0dXJuIE51bUhlYWRlcnMgPiAxOyB9CisKKyAgICBIZWFkZXJNYXNzTGlzdDo6ZGlmZmVyZW5jZV90eXBlIGdldEhlYWRlckluZGV4KGNvbnN0IEJsb2NrTm9kZSAmQikgeworICAgICAgYXNzZXJ0KGlzSGVhZGVyKEIpICYmICJ0aGlzIGlzIG9ubHkgdmFsaWQgb24gbG9vcCBoZWFkZXIgYmxvY2tzIik7CisgICAgICBpZiAoaXNJcnJlZHVjaWJsZSgpKQorICAgICAgICByZXR1cm4gc3RkOjpsb3dlcl9ib3VuZChOb2Rlcy5iZWdpbigpLCBOb2Rlcy5iZWdpbigpICsgTnVtSGVhZGVycywgQikgLQorICAgICAgICAgICAgICAgTm9kZXMuYmVnaW4oKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIE5vZGVMaXN0Ojpjb25zdF9pdGVyYXRvciBtZW1iZXJzX2JlZ2luKCkgY29uc3QgeworICAgICAgcmV0dXJuIE5vZGVzLmJlZ2luKCkgKyBOdW1IZWFkZXJzOworICAgIH0KKworICAgIE5vZGVMaXN0Ojpjb25zdF9pdGVyYXRvciBtZW1iZXJzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIE5vZGVzLmVuZCgpOyB9CisgICAgaXRlcmF0b3JfcmFuZ2U8Tm9kZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yPiBtZW1iZXJzKCkgY29uc3QgeworICAgICAgcmV0dXJuIG1ha2VfcmFuZ2UobWVtYmVyc19iZWdpbigpLCBtZW1iZXJzX2VuZCgpKTsKKyAgICB9CisgIH07CisKKyAgLy8vIFxicmllZiBJbmRleCBvZiBsb29wIGluZm9ybWF0aW9uLgorICBzdHJ1Y3QgV29ya2luZ0RhdGEgeworICAgIEJsb2NrTm9kZSBOb2RlOyAgICAgICAgICAgLy8vPCBUaGlzIG5vZGUuCisgICAgTG9vcERhdGEgKkxvb3AgPSBudWxscHRyOyAvLy88IFRoZSBsb29wIHRoaXMgYmxvY2sgaXMgaW5zaWRlLgorICAgIEJsb2NrTWFzcyBNYXNzOyAgICAgICAgICAgLy8vPCBNYXNzIGRpc3RyaWJ1dGlvbiBmcm9tIHRoZSBlbnRyeSBibG9jay4KKworICAgIFdvcmtpbmdEYXRhKGNvbnN0IEJsb2NrTm9kZSAmTm9kZSkgOiBOb2RlKE5vZGUpIHt9CisKKyAgICBib29sIGlzTG9vcEhlYWRlcigpIGNvbnN0IHsgcmV0dXJuIExvb3AgJiYgTG9vcC0+aXNIZWFkZXIoTm9kZSk7IH0KKworICAgIGJvb2wgaXNEb3VibGVMb29wSGVhZGVyKCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzTG9vcEhlYWRlcigpICYmIExvb3AtPlBhcmVudCAmJiBMb29wLT5QYXJlbnQtPmlzSXJyZWR1Y2libGUoKSAmJgorICAgICAgICAgICAgIExvb3AtPlBhcmVudC0+aXNIZWFkZXIoTm9kZSk7CisgICAgfQorCisgICAgTG9vcERhdGEgKmdldENvbnRhaW5pbmdMb29wKCkgY29uc3QgeworICAgICAgaWYgKCFpc0xvb3BIZWFkZXIoKSkKKyAgICAgICAgcmV0dXJuIExvb3A7CisgICAgICBpZiAoIWlzRG91YmxlTG9vcEhlYWRlcigpKQorICAgICAgICByZXR1cm4gTG9vcC0+UGFyZW50OworICAgICAgcmV0dXJuIExvb3AtPlBhcmVudC0+UGFyZW50OworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmVzb2x2ZSBhIG5vZGUgdG8gaXRzIHJlcHJlc2VudGF0aXZlLgorICAgIC8vLworICAgIC8vLyBHZXQgdGhlIG5vZGUgY3VycmVudGx5IHJlcHJlc2VudGluZyBOb2RlLCB3aGljaCBjb3VsZCBiZSBhIGNvbnRhaW5pbmcKKyAgICAvLy8gbG9vcC4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSBjYWxsZWQgd2hlbiBkaXN0cmlidXRpbmcgbWFzcy4gIEFzIGxvbmcgYXMKKyAgICAvLy8gdGhlcmUgYXJlIG5vIGlycmVkdWNpYmxlIGVkZ2VzIHRvIE5vZGUsIHRoZW4gaXQgd2lsbCBoYXZlIGNvbXBsZXhpdHkKKyAgICAvLy8gTygxKSBpbiB0aGlzIGNvbnRleHQuCisgICAgLy8vCisgICAgLy8vIEluIGdlbmVyYWwsIHRoZSBjb21wbGV4aXR5IGlzIE8oTCksIHdoZXJlIEwgaXMgdGhlIG51bWJlciBvZiBsb29wCisgICAgLy8vIGhlYWRlcnMgTm9kZSBoYXMgYmVlbiBwYWNrYWdlZCBpbnRvLiAgU2luY2UgdGhpcyBtZXRob2QgaXMgY2FsbGVkIGluCisgICAgLy8vIHRoZSBjb250ZXh0IG9mIGRpc3RyaWJ1dGluZyBtYXNzLCBMIHdpbGwgYmUgdGhlIG51bWJlciBvZiBsb29wIGhlYWRlcnMKKyAgICAvLy8gYW4gZWFybHkgZXhpdCBlZGdlIGp1bXBzIG91dCBvZi4KKyAgICBCbG9ja05vZGUgZ2V0UmVzb2x2ZWROb2RlKCkgY29uc3QgeworICAgICAgYXV0byBMID0gZ2V0UGFja2FnZWRMb29wKCk7CisgICAgICByZXR1cm4gTCA/IEwtPmdldEhlYWRlcigpIDogTm9kZTsKKyAgICB9CisKKyAgICBMb29wRGF0YSAqZ2V0UGFja2FnZWRMb29wKCkgY29uc3QgeworICAgICAgaWYgKCFMb29wIHx8ICFMb29wLT5Jc1BhY2thZ2VkKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIGF1dG8gTCA9IExvb3A7CisgICAgICB3aGlsZSAoTC0+UGFyZW50ICYmIEwtPlBhcmVudC0+SXNQYWNrYWdlZCkKKyAgICAgICAgTCA9IEwtPlBhcmVudDsKKyAgICAgIHJldHVybiBMOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgR2V0IHRoZSBhcHByb3ByaWF0ZSBtYXNzIGZvciBhIG5vZGUuCisgICAgLy8vCisgICAgLy8vIEdldCBhcHByb3ByaWF0ZSBtYXNzIGZvciBOb2RlLiAgSWYgTm9kZSBpcyBhIGxvb3AtaGVhZGVyICh3aG9zZSBsb29wCisgICAgLy8vIGhhcyBiZWVuIHBhY2thZ2VkKSwgcmV0dXJucyB0aGUgbWFzcyBvZiBpdHMgcHNldWRvLW5vZGUuICBJZiBpdCdzIGEKKyAgICAvLy8gbm9kZSBpbnNpZGUgYSBwYWNrYWdlZCBsb29wLCBpdCByZXR1cm5zIHRoZSBsb29wJ3MgbWFzcy4KKyAgICBCbG9ja01hc3MgJmdldE1hc3MoKSB7CisgICAgICBpZiAoIWlzQVBhY2thZ2UoKSkKKyAgICAgICAgcmV0dXJuIE1hc3M7CisgICAgICBpZiAoIWlzQURvdWJsZVBhY2thZ2UoKSkKKyAgICAgICAgcmV0dXJuIExvb3AtPk1hc3M7CisgICAgICByZXR1cm4gTG9vcC0+UGFyZW50LT5NYXNzOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgSGFzIENvbnRhaW5pbmdMb29wIGJlZW4gcGFja2FnZWQgdXA/CisgICAgYm9vbCBpc1BhY2thZ2VkKCkgY29uc3QgeyByZXR1cm4gZ2V0UmVzb2x2ZWROb2RlKCkgIT0gTm9kZTsgfQorCisgICAgLy8vIFxicmllZiBIYXMgTG9vcCBiZWVuIHBhY2thZ2VkIHVwPworICAgIGJvb2wgaXNBUGFja2FnZSgpIGNvbnN0IHsgcmV0dXJuIGlzTG9vcEhlYWRlcigpICYmIExvb3AtPklzUGFja2FnZWQ7IH0KKworICAgIC8vLyBcYnJpZWYgSGFzIExvb3AgYmVlbiBwYWNrYWdlZCB1cCB0d2ljZT8KKyAgICBib29sIGlzQURvdWJsZVBhY2thZ2UoKSBjb25zdCB7CisgICAgICByZXR1cm4gaXNEb3VibGVMb29wSGVhZGVyKCkgJiYgTG9vcC0+UGFyZW50LT5Jc1BhY2thZ2VkOworICAgIH0KKyAgfTsKKworICAvLy8gXGJyaWVmIFVuc2NhbGVkIHByb2JhYmlsaXR5IHdlaWdodC4KKyAgLy8vCisgIC8vLyBQcm9iYWJpbGl0eSB3ZWlnaHQgZm9yIGFuIGVkZ2UgaW4gdGhlIGdyYXBoIChpbmNsdWRpbmcgdGhlCisgIC8vLyBzdWNjZXNzb3IvdGFyZ2V0IG5vZGUpLgorICAvLy8KKyAgLy8vIEFsbCBlZGdlcyBpbiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gYXJlIDMyLWJpdC4gIEhvd2V2ZXIsIGV4aXQgZWRnZXMgZnJvbQorICAvLy8gbG9vcCBwYWNrYWdlcyBhcmUgdGFrZW4gZnJvbSA2NC1iaXQgZXhpdCBtYXNzZXMsIHNvIHdlIG5lZWQgNjQtYml0cyBvZgorICAvLy8gc3BhY2UgaW4gZ2VuZXJhbC4KKyAgLy8vCisgIC8vLyBJbiBhZGRpdGlvbiB0byB0aGUgcmF3IHdlaWdodCBhbW91bnQsIFdlaWdodCBzdG9yZXMgdGhlIHR5cGUgb2YgdGhlIGVkZ2UKKyAgLy8vIGluIHRoZSBjdXJyZW50IGNvbnRleHQgKGkuZS4sIHRoZSBjb250ZXh0IG9mIHRoZSBsb29wIGJlaW5nIHByb2Nlc3NlZCkuCisgIC8vLyBJcyB0aGlzIGEgbG9jYWwgZWRnZSB3aXRoaW4gdGhlIGxvb3AsIGFuIGV4aXQgZnJvbSB0aGUgbG9vcCwgb3IgYQorICAvLy8gYmFja2VkZ2UgdG8gdGhlIGxvb3AgaGVhZGVyPworICBzdHJ1Y3QgV2VpZ2h0IHsKKyAgICBlbnVtIERpc3RUeXBlIHsgTG9jYWwsIEV4aXQsIEJhY2tlZGdlIH07CisgICAgRGlzdFR5cGUgVHlwZSA9IExvY2FsOworICAgIEJsb2NrTm9kZSBUYXJnZXROb2RlOworICAgIHVpbnQ2NF90IEFtb3VudCA9IDA7CisKKyAgICBXZWlnaHQoKSA9IGRlZmF1bHQ7CisgICAgV2VpZ2h0KERpc3RUeXBlIFR5cGUsIEJsb2NrTm9kZSBUYXJnZXROb2RlLCB1aW50NjRfdCBBbW91bnQpCisgICAgICAgIDogVHlwZShUeXBlKSwgVGFyZ2V0Tm9kZShUYXJnZXROb2RlKSwgQW1vdW50KEFtb3VudCkge30KKyAgfTsKKworICAvLy8gXGJyaWVmIERpc3RyaWJ1dGlvbiBvZiB1bnNjYWxlZCBwcm9iYWJpbGl0eSB3ZWlnaHQuCisgIC8vLworICAvLy8gRGlzdHJpYnV0aW9uIG9mIHVuc2NhbGVkIHByb2JhYmlsaXR5IHdlaWdodCB0byBhIHNldCBvZiBzdWNjZXNzb3JzLgorICAvLy8KKyAgLy8vIFRoaXMgY2xhc3MgY29sbGF0ZXMgdGhlIHN1Y2Nlc3NvciBlZGdlIHdlaWdodHMgZm9yIGxhdGVyIHByb2Nlc3NpbmcuCisgIC8vLworICAvLy8gXGEgRGlkT3ZlcmZsb3cgaW5kaWNhdGVzIHdoZXRoZXIgXGEgVG90YWwgZGlkIG92ZXJmbG93IHdoaWxlIGFkZGluZyB0bworICAvLy8gdGhlIGRpc3RyaWJ1dGlvbi4gIEl0IHNob3VsZCBuZXZlciBvdmVyZmxvdyB0d2ljZS4KKyAgc3RydWN0IERpc3RyaWJ1dGlvbiB7CisgICAgdXNpbmcgV2VpZ2h0TGlzdCA9IFNtYWxsVmVjdG9yPFdlaWdodCwgND47CisKKyAgICBXZWlnaHRMaXN0IFdlaWdodHM7ICAgICAgIC8vLzwgSW5kaXZpZHVhbCBzdWNjZXNzb3Igd2VpZ2h0cy4KKyAgICB1aW50NjRfdCBUb3RhbCA9IDA7ICAgICAgIC8vLzwgU3VtIG9mIGFsbCB3ZWlnaHRzLgorICAgIGJvb2wgRGlkT3ZlcmZsb3cgPSBmYWxzZTsgLy8vPCBXaGV0aGVyIFxhIFRvdGFsIGRpZCBvdmVyZmxvdy4KKworICAgIERpc3RyaWJ1dGlvbigpID0gZGVmYXVsdDsKKworICAgIHZvaWQgYWRkTG9jYWwoY29uc3QgQmxvY2tOb2RlICZOb2RlLCB1aW50NjRfdCBBbW91bnQpIHsKKyAgICAgIGFkZChOb2RlLCBBbW91bnQsIFdlaWdodDo6TG9jYWwpOworICAgIH0KKworICAgIHZvaWQgYWRkRXhpdChjb25zdCBCbG9ja05vZGUgJk5vZGUsIHVpbnQ2NF90IEFtb3VudCkgeworICAgICAgYWRkKE5vZGUsIEFtb3VudCwgV2VpZ2h0OjpFeGl0KTsKKyAgICB9CisKKyAgICB2b2lkIGFkZEJhY2tlZGdlKGNvbnN0IEJsb2NrTm9kZSAmTm9kZSwgdWludDY0X3QgQW1vdW50KSB7CisgICAgICBhZGQoTm9kZSwgQW1vdW50LCBXZWlnaHQ6OkJhY2tlZGdlKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIE5vcm1hbGl6ZSB0aGUgZGlzdHJpYnV0aW9uLgorICAgIC8vLworICAgIC8vLyBDb21iaW5lcyBtdWx0aXBsZSBlZGdlcyB0byB0aGUgc2FtZSBcYSBXZWlnaHQ6OlRhcmdldE5vZGUgYW5kIHNjYWxlcworICAgIC8vLyBkb3duIHNvIHRoYXQgXGEgVG90YWwgZml0cyBpbnRvIDMyLWJpdHMuCisgICAgLy8vCisgICAgLy8vIFRoaXMgaXMgbGluZWFyIGluIHRoZSBzaXplIG9mIFxhIFdlaWdodHMuICBGb3IgdGhlIHZhc3QgbWFqb3JpdHkgb2YKKyAgICAvLy8gY2FzZXMsIGFkamFjZW50IGVkZ2Ugd2VpZ2h0cyBhcmUgY29tYmluZWQgYnkgc29ydGluZyBXZWlnaHRMaXN0IGFuZAorICAgIC8vLyBjb21iaW5pbmcgYWRqYWNlbnQgd2VpZ2h0cy4gIEhvd2V2ZXIsIGZvciB2ZXJ5IGxhcmdlIGVkZ2UgbGlzdHMgYW4KKyAgICAvLy8gYXV4aWxpYXJ5IGhhc2ggdGFibGUgaXMgdXNlZC4KKyAgICB2b2lkIG5vcm1hbGl6ZSgpOworCisgIHByaXZhdGU6CisgICAgdm9pZCBhZGQoY29uc3QgQmxvY2tOb2RlICZOb2RlLCB1aW50NjRfdCBBbW91bnQsIFdlaWdodDo6RGlzdFR5cGUgVHlwZSk7CisgIH07CisKKyAgLy8vIFxicmllZiBEYXRhIGFib3V0IGVhY2ggYmxvY2suICBUaGlzIGlzIHVzZWQgZG93bnN0cmVhbS4KKyAgc3RkOjp2ZWN0b3I8RnJlcXVlbmN5RGF0YT4gRnJlcXM7CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIGVhY2ggYmxvY2sgaXMgYW4gaXJyZWR1Y2libGUgbG9vcCBoZWFkZXIuCisgIC8vLyBUaGlzIGlzIHVzZWQgZG93bnN0cmVhbS4KKyAgU3BhcnNlQml0VmVjdG9yPD4gSXNJcnJMb29wSGVhZGVyOworCisgIC8vLyBcYnJpZWYgTG9vcCBkYXRhOiBzZWUgaW5pdGlhbGl6ZUxvb3BzKCkuCisgIHN0ZDo6dmVjdG9yPFdvcmtpbmdEYXRhPiBXb3JraW5nOworCisgIC8vLyBcYnJpZWYgSW5kZXhlZCBpbmZvcm1hdGlvbiBhYm91dCBsb29wcy4KKyAgc3RkOjpsaXN0PExvb3BEYXRhPiBMb29wczsKKworICAvLy8gXGJyaWVmIFZpcnR1YWwgZGVzdHJ1Y3Rvci4KKyAgLy8vCisgIC8vLyBOZWVkIGEgdmlydHVhbCBkZXN0cnVjdG9yIHRvIG1hc2sgdGhlIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQKKyAgLy8vIGdldEJsb2NrTmFtZSgpLgorICB2aXJ0dWFsIH5CbG9ja0ZyZXF1ZW5jeUluZm9JbXBsQmFzZSgpID0gZGVmYXVsdDsKKworICAvLy8gXGJyaWVmIEFkZCBhbGwgZWRnZXMgb3V0IG9mIGEgcGFja2FnZWQgbG9vcCB0byB0aGUgZGlzdHJpYnV0aW9uLgorICAvLy8KKyAgLy8vIEFkZHMgYWxsIGVkZ2VzIGZyb20gTG9jYWxMb29wSGVhZCB0byBEaXN0LiAgQ2FsbHMgYWRkVG9EaXN0KCkgdG8gYWRkIGVhY2gKKyAgLy8vIHN1Y2Nlc3NvciBlZGdlLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gXGMgdHJ1ZSB1bmxlc3MgdGhlcmUncyBhbiBpcnJlZHVjaWJsZSBiYWNrZWRnZS4KKyAgYm9vbCBhZGRMb29wU3VjY2Vzc29yc1RvRGlzdChjb25zdCBMb29wRGF0YSAqT3V0ZXJMb29wLCBMb29wRGF0YSAmTG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaXN0cmlidXRpb24gJkRpc3QpOworCisgIC8vLyBcYnJpZWYgQWRkIGFuIGVkZ2UgdG8gdGhlIGRpc3RyaWJ1dGlvbi4KKyAgLy8vCisgIC8vLyBBZGRzIGFuIGVkZ2UgdG8gU3VjYyB0byBEaXN0LiAgSWYgXGMgTG9vcEhlYWQuaXNWYWxpZCgpLCB0aGVuIHdoZXRoZXIgdGhlCisgIC8vLyBlZGdlIGlzIGxvY2FsL2V4aXQvYmFja2VkZ2UgaXMgaW4gdGhlIGNvbnRleHQgb2YgTG9vcEhlYWQuICBPdGhlcndpc2UsCisgIC8vLyBldmVyeSBlZGdlIHNob3VsZCBiZSBhIGxvY2FsIGVkZ2UgKHNpbmNlIGFsbCB0aGUgbG9vcHMgYXJlIHBhY2thZ2VkIHVwKS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFxjIHRydWUgdW5sZXNzIGFib3J0ZWQgZHVlIHRvIGFuIGlycmVkdWNpYmxlIGJhY2tlZGdlLgorICBib29sIGFkZFRvRGlzdChEaXN0cmlidXRpb24gJkRpc3QsIGNvbnN0IExvb3BEYXRhICpPdXRlckxvb3AsCisgICAgICAgICAgICAgICAgIGNvbnN0IEJsb2NrTm9kZSAmUHJlZCwgY29uc3QgQmxvY2tOb2RlICZTdWNjLCB1aW50NjRfdCBXZWlnaHQpOworCisgIExvb3BEYXRhICZnZXRMb29wUGFja2FnZShjb25zdCBCbG9ja05vZGUgJkhlYWQpIHsKKyAgICBhc3NlcnQoSGVhZC5JbmRleCA8IFdvcmtpbmcuc2l6ZSgpKTsKKyAgICBhc3NlcnQoV29ya2luZ1tIZWFkLkluZGV4XS5pc0xvb3BIZWFkZXIoKSk7CisgICAgcmV0dXJuICpXb3JraW5nW0hlYWQuSW5kZXhdLkxvb3A7CisgIH0KKworICAvLy8gXGJyaWVmIEFuYWx5emUgaXJyZWR1Y2libGUgU0NDcy4KKyAgLy8vCisgIC8vLyBTZXBhcmF0ZSBpcnJlZHVjaWJsZSBTQ0NzIGZyb20gXGMgRywgd2hpY2ggaXMgYW4gZXhwbGljdCBncmFwaCBvZiBcYworICAvLy8gT3V0ZXJMb29wIChvciB0aGUgdG9wLWxldmVsIGZ1bmN0aW9uLCBpZiBcYyBPdXRlckxvb3AgaXMgXGMgbnVsbHB0cikuCisgIC8vLyBJbnNlcnQgdGhlbSBpbnRvIFxhIExvb3BzIGJlZm9yZSBcYyBJbnNlcnQuCisgIC8vLworICAvLy8gXHJldHVybiB0aGUgXGMgTG9vcERhdGEgbm9kZXMgcmVwcmVzZW50aW5nIHRoZSBpcnJlZHVjaWJsZSBTQ0NzLgorICBpdGVyYXRvcl9yYW5nZTxzdGQ6Omxpc3Q8TG9vcERhdGE+OjppdGVyYXRvcj4KKyAgYW5hbHl6ZUlycmVkdWNpYmxlKGNvbnN0IGJmaV9kZXRhaWw6OklycmVkdWNpYmxlR3JhcGggJkcsIExvb3BEYXRhICpPdXRlckxvb3AsCisgICAgICAgICAgICAgICAgICAgICBzdGQ6Omxpc3Q8TG9vcERhdGE+OjppdGVyYXRvciBJbnNlcnQpOworCisgIC8vLyBcYnJpZWYgVXBkYXRlIGEgbG9vcCBhZnRlciBwYWNrYWdpbmcgaXJyZWR1Y2libGUgU0NDcyBpbnNpZGUgb2YgaXQuCisgIC8vLworICAvLy8gVXBkYXRlIFxjIE91dGVyTG9vcC4gIEJlZm9yZSBmaW5kaW5nIGlycmVkdWNpYmxlIGNvbnRyb2wgZmxvdywgaXQgd2FzCisgIC8vLyBwYXJ0d2F5IHRocm91Z2ggXGEgY29tcHV0ZU1hc3NJbkxvb3AoKSwgc28gXGEgTG9vcERhdGE6OkV4aXRzIGFuZCBcYQorICAvLy8gTG9vcERhdGE6OkJhY2tlZGdlTWFzcyBuZWVkIHRvIGJlIHJlc2V0LiAgQWxzbywgbm9kZXMgdGhhdCB3ZXJlIHBhY2thZ2VkCisgIC8vLyB1cCBuZWVkIHRvIGJlIHJlbW92ZWQgZnJvbSBcYSBPdXRlckxvb3A6Ok5vZGVzLgorICB2b2lkIHVwZGF0ZUxvb3BXaXRoSXJyZWR1Y2libGUoTG9vcERhdGEgJk91dGVyTG9vcCk7CisKKyAgLy8vIFxicmllZiBEaXN0cmlidXRlIG1hc3MgYWNjb3JkaW5nIHRvIGEgZGlzdHJpYnV0aW9uLgorICAvLy8KKyAgLy8vIERpc3RyaWJ1dGVzIHRoZSBtYXNzIGluIFNvdXJjZSBhY2NvcmRpbmcgdG8gRGlzdC4gIElmIExvb3BIZWFkLmlzVmFsaWQoKSwKKyAgLy8vIGJhY2tlZGdlcyBhbmQgZXhpdHMgYXJlIHN0b3JlZCBpbiBpdHMgZW50cnkgaW4gTG9vcHMuCisgIC8vLworICAvLy8gTWFzcyBpcyBkaXN0cmlidXRlZCBpbiBwYXJhbGxlbCBmcm9tIHR3byBjb3BpZXMgb2YgdGhlIHNvdXJjZSBtYXNzLgorICB2b2lkIGRpc3RyaWJ1dGVNYXNzKGNvbnN0IEJsb2NrTm9kZSAmU291cmNlLCBMb29wRGF0YSAqT3V0ZXJMb29wLAorICAgICAgICAgICAgICAgICAgICAgIERpc3RyaWJ1dGlvbiAmRGlzdCk7CisKKyAgLy8vIFxicmllZiBDb21wdXRlIHRoZSBsb29wIHNjYWxlIGZvciBhIGxvb3AuCisgIHZvaWQgY29tcHV0ZUxvb3BTY2FsZShMb29wRGF0YSAmTG9vcCk7CisKKyAgLy8vIEFkanVzdCB0aGUgbWFzcyBvZiBhbGwgaGVhZGVycyBpbiBhbiBpcnJlZHVjaWJsZSBsb29wLgorICAvLy8KKyAgLy8vIEluaXRpYWxseSwgaXJyZWR1Y2libGUgbG9vcHMgYXJlIGFzc3VtZWQgdG8gZGlzdHJpYnV0ZSB0aGVpciBtYXNzCisgIC8vLyBlcXVhbGx5IGFtb25nIGl0cyBoZWFkZXJzLiBUaGlzIGNhbiBsZWFkIHRvIHdyb25nIGZyZXF1ZW5jeSBlc3RpbWF0ZXMKKyAgLy8vIHNpbmNlIHNvbWUgaGVhZGVycyBtYXkgYmUgZXhlY3V0ZWQgbW9yZSBmcmVxdWVudGx5IHRoYW4gb3RoZXJzLgorICAvLy8KKyAgLy8vIFRoaXMgYWRqdXN0cyBoZWFkZXIgbWFzcyBkaXN0cmlidXRpb24gc28gaXQgbWF0Y2hlcyB0aGUgd2VpZ2h0cyBvZgorICAvLy8gdGhlIGJhY2tlZGdlcyBnb2luZyBpbnRvIGVhY2ggb2YgdGhlIGxvb3AgaGVhZGVycy4KKyAgdm9pZCBhZGp1c3RMb29wSGVhZGVyTWFzcyhMb29wRGF0YSAmTG9vcCk7CisKKyAgdm9pZCBkaXN0cmlidXRlSXJyTG9vcEhlYWRlck1hc3MoRGlzdHJpYnV0aW9uICZEaXN0KTsKKworICAvLy8gXGJyaWVmIFBhY2thZ2UgdXAgYSBsb29wLgorICB2b2lkIHBhY2thZ2VMb29wKExvb3BEYXRhICZMb29wKTsKKworICAvLy8gXGJyaWVmIFVud3JhcCBsb29wcy4KKyAgdm9pZCB1bndyYXBMb29wcygpOworCisgIC8vLyBcYnJpZWYgRmluYWxpemUgZnJlcXVlbmN5IG1ldHJpY3MuCisgIC8vLworICAvLy8gQ2FsY3VsYXRlcyBmaW5hbCBmcmVxdWVuY2llcyBhbmQgY2xlYW5zIHVwIG5vLWxvbmdlci1uZWVkZWQgZGF0YQorICAvLy8gc3RydWN0dXJlcy4KKyAgdm9pZCBmaW5hbGl6ZU1ldHJpY3MoKTsKKworICAvLy8gXGJyaWVmIENsZWFyIGFsbCBtZW1vcnkuCisgIHZvaWQgY2xlYXIoKTsKKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEJsb2NrTmFtZShjb25zdCBCbG9ja05vZGUgJk5vZGUpIGNvbnN0OworICBzdGQ6OnN0cmluZyBnZXRMb29wTmFtZShjb25zdCBMb29wRGF0YSAmTG9vcCkgY29uc3Q7CisKKyAgdmlydHVhbCByYXdfb3N0cmVhbSAmcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7IHJldHVybiBPUzsgfQorICB2b2lkIGR1bXAoKSBjb25zdCB7IHByaW50KGRiZ3MoKSk7IH0KKworICBTY2FsZWQ2NCBnZXRGbG9hdGluZ0Jsb2NrRnJlcShjb25zdCBCbG9ja05vZGUgJk5vZGUpIGNvbnN0OworCisgIEJsb2NrRnJlcXVlbmN5IGdldEJsb2NrRnJlcShjb25zdCBCbG9ja05vZGUgJk5vZGUpIGNvbnN0OworICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0QmxvY2tQcm9maWxlQ291bnQoY29uc3QgRnVuY3Rpb24gJkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCbG9ja05vZGUgJk5vZGUpIGNvbnN0OworICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0UHJvZmlsZUNvdW50RnJvbUZyZXEoY29uc3QgRnVuY3Rpb24gJkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBGcmVxKSBjb25zdDsKKyAgYm9vbCBpc0lyckxvb3BIZWFkZXIoY29uc3QgQmxvY2tOb2RlICZOb2RlKTsKKworICB2b2lkIHNldEJsb2NrRnJlcShjb25zdCBCbG9ja05vZGUgJk5vZGUsIHVpbnQ2NF90IEZyZXEpOworCisgIHJhd19vc3RyZWFtICZwcmludEJsb2NrRnJlcShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IEJsb2NrTm9kZSAmTm9kZSkgY29uc3Q7CisgIHJhd19vc3RyZWFtICZwcmludEJsb2NrRnJlcShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCbG9ja0ZyZXF1ZW5jeSAmRnJlcSkgY29uc3Q7CisKKyAgdWludDY0X3QgZ2V0RW50cnlGcmVxKCkgY29uc3QgeworICAgIGFzc2VydCghRnJlcXMuZW1wdHkoKSk7CisgICAgcmV0dXJuIEZyZXFzWzBdLkludGVnZXI7CisgIH0KK307CisKK25hbWVzcGFjZSBiZmlfZGV0YWlsIHsKKwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVD4gc3RydWN0IFR5cGVNYXAge307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVHlwZU1hcDxCYXNpY0Jsb2NrPiB7CisgIHVzaW5nIEJsb2NrVCA9IEJhc2ljQmxvY2s7CisgIHVzaW5nIEZ1bmN0aW9uVCA9IEZ1bmN0aW9uOworICB1c2luZyBCcmFuY2hQcm9iYWJpbGl0eUluZm9UID0gQnJhbmNoUHJvYmFiaWxpdHlJbmZvOworICB1c2luZyBMb29wVCA9IExvb3A7CisgIHVzaW5nIExvb3BJbmZvVCA9IExvb3BJbmZvOworfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBUeXBlTWFwPE1hY2hpbmVCYXNpY0Jsb2NrPiB7CisgIHVzaW5nIEJsb2NrVCA9IE1hY2hpbmVCYXNpY0Jsb2NrOworICB1c2luZyBGdW5jdGlvblQgPSBNYWNoaW5lRnVuY3Rpb247CisgIHVzaW5nIEJyYW5jaFByb2JhYmlsaXR5SW5mb1QgPSBNYWNoaW5lQnJhbmNoUHJvYmFiaWxpdHlJbmZvOworICB1c2luZyBMb29wVCA9IE1hY2hpbmVMb29wOworICB1c2luZyBMb29wSW5mb1QgPSBNYWNoaW5lTG9vcEluZm87Cit9OworCisvLy8gXGJyaWVmIEdldCB0aGUgbmFtZSBvZiBhIE1hY2hpbmVCYXNpY0Jsb2NrLgorLy8vCisvLy8gR2V0IHRoZSBuYW1lIG9mIGEgTWFjaGluZUJhc2ljQmxvY2suICBJdCdzIHRlbXBsYXRlZCBzbyB0aGF0IGluY2x1ZGluZyBmcm9tCisvLy8gQ29kZUdlbiBpcyB1bm5lY2Vzc2FyeSAodGhhdCB3b3VsZCBiZSBhIGxheWVyaW5nIGlzc3VlKS4KKy8vLworLy8vIFRoaXMgaXMgdXNlZCBtYWlubHkgZm9yIGRlYnVnIG91dHB1dC4gIFRoZSBuYW1lIGlzIHNpbWlsYXIgdG8KKy8vLyBNYWNoaW5lQmFzaWNCbG9jazo6Z2V0RnVsbE5hbWUoKSwgYnV0IHNraXBzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbi4KK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1Q+IHN0ZDo6c3RyaW5nIGdldEJsb2NrTmFtZShjb25zdCBCbG9ja1QgKkJCKSB7CisgIGFzc2VydChCQiAmJiAiVW5leHBlY3RlZCBudWxscHRyIik7CisgIGF1dG8gTWFjaGluZU5hbWUgPSAiQkIiICsgVHdpbmUoQkItPmdldE51bWJlcigpKTsKKyAgaWYgKEJCLT5nZXRCYXNpY0Jsb2NrKCkpCisgICAgcmV0dXJuIChNYWNoaW5lTmFtZSArICJbIiArIEJCLT5nZXROYW1lKCkgKyAiXSIpLnN0cigpOworICByZXR1cm4gTWFjaGluZU5hbWUuc3RyKCk7Cit9CisvLy8gXGJyaWVmIEdldCB0aGUgbmFtZSBvZiBhIEJhc2ljQmxvY2suCit0ZW1wbGF0ZSA8PiBpbmxpbmUgc3RkOjpzdHJpbmcgZ2V0QmxvY2tOYW1lKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSB7CisgIGFzc2VydChCQiAmJiAiVW5leHBlY3RlZCBudWxscHRyIik7CisgIHJldHVybiBCQi0+Z2V0TmFtZSgpLnN0cigpOworfQorCisvLy8gXGJyaWVmIEdyYXBoIG9mIGlycmVkdWNpYmxlIGNvbnRyb2wgZmxvdy4KKy8vLworLy8vIFRoaXMgZ3JhcGggaXMgdXNlZCBmb3IgZGV0ZXJtaW5pbmcgdGhlIFNDQ3MgaW4gYSBsb29wIChvciB0b3AtbGV2ZWwKKy8vLyBmdW5jdGlvbikgdGhhdCBoYXMgaXJyZWR1Y2libGUgY29udHJvbCBmbG93LgorLy8vCisvLy8gRHVyaW5nIHRoZSBibG9jayBmcmVxdWVuY3kgYWxnb3JpdGhtLCB0aGUgbG9jYWwgZ3JhcGhzIGFyZSBkZWZpbmVkIGluIGEKKy8vLyBsaWdodC13ZWlnaHQgd2F5LCBkZWZlcnJpbmcgdG8gdGhlIFxhIEJhc2ljQmxvY2sgb3IgXGEgTWFjaGluZUJhc2ljQmxvY2sKKy8vLyBncmFwaHMgZm9yIG1vc3QgZWRnZXMsIGJ1dCBnZXR0aW5nIG90aGVycyBmcm9tIFxhIExvb3BEYXRhOjpFeGl0TWFwLiAgVGhlCisvLy8gbGF0dGVyIG9ubHkgaGFzIHN1Y2Nlc3NvciBpbmZvcm1hdGlvbi4KKy8vLworLy8vIFxhIElycmVkdWNpYmxlR3JhcGggbWFrZXMgdGhpcyBncmFwaCBleHBsaWNpdC4gIEl0J3MgaW4gYSBmb3JtIHRoYXQgY2FuIHVzZQorLy8vIFxhIEdyYXBoVHJhaXRzIChzbyB0aGF0IFxhIGFuYWx5emVJcnJlZHVjaWJsZSgpIGNhbiB1c2UgXGEgc2NjX2l0ZXJhdG9yKSwKKy8vLyBhbmQgaXQgZXhwbGljaXRseSBsaXN0cyBwcmVkZWNlc3NvcnMgYW5kIHN1Y2Nlc3NvcnMuICBUaGUgaW5pdGlhbGl6YXRpb24KKy8vLyB0aGF0IHJlbGllcyBvbiBcYyBNYWNoaW5lQmFzaWNCbG9jayBpcyBkZWZpbmVkIGluIHRoZSBoZWFkZXIuCitzdHJ1Y3QgSXJyZWR1Y2libGVHcmFwaCB7CisgIHVzaW5nIEJGSUJhc2UgPSBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsQmFzZTsKKworICBCRklCYXNlICZCRkk7CisKKyAgdXNpbmcgQmxvY2tOb2RlID0gQkZJQmFzZTo6QmxvY2tOb2RlOworICBzdHJ1Y3QgSXJyTm9kZSB7CisgICAgQmxvY2tOb2RlIE5vZGU7CisgICAgdW5zaWduZWQgTnVtSW4gPSAwOworICAgIHN0ZDo6ZGVxdWU8Y29uc3QgSXJyTm9kZSAqPiBFZGdlczsKKworICAgIElyck5vZGUoY29uc3QgQmxvY2tOb2RlICZOb2RlKSA6IE5vZGUoTm9kZSkge30KKworICAgIHVzaW5nIGl0ZXJhdG9yID0gc3RkOjpkZXF1ZTxjb25zdCBJcnJOb2RlICo+Ojpjb25zdF9pdGVyYXRvcjsKKworICAgIGl0ZXJhdG9yIHByZWRfYmVnaW4oKSBjb25zdCB7IHJldHVybiBFZGdlcy5iZWdpbigpOyB9CisgICAgaXRlcmF0b3Igc3VjY19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIEVkZ2VzLmJlZ2luKCkgKyBOdW1JbjsgfQorICAgIGl0ZXJhdG9yIHByZWRfZW5kKCkgY29uc3QgeyByZXR1cm4gc3VjY19iZWdpbigpOyB9CisgICAgaXRlcmF0b3Igc3VjY19lbmQoKSBjb25zdCB7IHJldHVybiBFZGdlcy5lbmQoKTsgfQorICB9OworICBCbG9ja05vZGUgU3RhcnQ7CisgIGNvbnN0IElyck5vZGUgKlN0YXJ0SXJyID0gbnVsbHB0cjsKKyAgc3RkOjp2ZWN0b3I8SXJyTm9kZT4gTm9kZXM7CisgIFNtYWxsRGVuc2VNYXA8dWludDMyX3QsIElyck5vZGUgKiwgND4gTG9va3VwOworCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGFuIGV4cGxpY2l0IGdyYXBoIGNvbnRhaW5pbmcgaXJyZWR1Y2libGUgY29udHJvbCBmbG93LgorICAvLy8KKyAgLy8vIENvbnN0cnVjdCBhbiBleHBsaWNpdCBncmFwaCBvZiB0aGUgY29udHJvbCBmbG93IGluIFxjIE91dGVyTG9vcCAob3IgdGhlCisgIC8vLyB0b3AtbGV2ZWwgZnVuY3Rpb24sIGlmIFxjIE91dGVyTG9vcCBpcyBcYyBudWxscHRyKS4gIFVzZXMgXGMKKyAgLy8vIGFkZEJsb2NrRWRnZXMgdG8gYWRkIGJsb2NrIHN1Y2Nlc3NvcnMgdGhhdCBoYXZlIG5vdCBiZWVuIHBhY2thZ2VkIGludG8KKyAgLy8vIGxvb3BzLgorICAvLy8KKyAgLy8vIFxhIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGw6OmNvbXB1dGVJcnJlZHVjaWJsZU1hc3MoKSBpcyB0aGUgb25seSBleHBlY3RlZAorICAvLy8gdXNlciBvZiB0aGlzLgorICB0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tFZGdlc0FkZGVyPgorICBJcnJlZHVjaWJsZUdyYXBoKEJGSUJhc2UgJkJGSSwgY29uc3QgQkZJQmFzZTo6TG9vcERhdGEgKk91dGVyTG9vcCwKKyAgICAgICAgICAgICAgICAgICBCbG9ja0VkZ2VzQWRkZXIgYWRkQmxvY2tFZGdlcykgOiBCRkkoQkZJKSB7CisgICAgaW5pdGlhbGl6ZShPdXRlckxvb3AsIGFkZEJsb2NrRWRnZXMpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIEJsb2NrRWRnZXNBZGRlcj4KKyAgdm9pZCBpbml0aWFsaXplKGNvbnN0IEJGSUJhc2U6Okxvb3BEYXRhICpPdXRlckxvb3AsCisgICAgICAgICAgICAgICAgICBCbG9ja0VkZ2VzQWRkZXIgYWRkQmxvY2tFZGdlcyk7CisgIHZvaWQgYWRkTm9kZXNJbkxvb3AoY29uc3QgQkZJQmFzZTo6TG9vcERhdGEgJk91dGVyTG9vcCk7CisgIHZvaWQgYWRkTm9kZXNJbkZ1bmN0aW9uKCk7CisKKyAgdm9pZCBhZGROb2RlKGNvbnN0IEJsb2NrTm9kZSAmTm9kZSkgeworICAgIE5vZGVzLmVtcGxhY2VfYmFjayhOb2RlKTsKKyAgICBCRkkuV29ya2luZ1tOb2RlLkluZGV4XS5nZXRNYXNzKCkgPSBCbG9ja01hc3M6OmdldEVtcHR5KCk7CisgIH0KKworICB2b2lkIGluZGV4Tm9kZXMoKTsKKyAgdGVtcGxhdGUgPGNsYXNzIEJsb2NrRWRnZXNBZGRlcj4KKyAgdm9pZCBhZGRFZGdlcyhjb25zdCBCbG9ja05vZGUgJk5vZGUsIGNvbnN0IEJGSUJhc2U6Okxvb3BEYXRhICpPdXRlckxvb3AsCisgICAgICAgICAgICAgICAgQmxvY2tFZGdlc0FkZGVyIGFkZEJsb2NrRWRnZXMpOworICB2b2lkIGFkZEVkZ2UoSXJyTm9kZSAmSXJyLCBjb25zdCBCbG9ja05vZGUgJlN1Y2MsCisgICAgICAgICAgICAgICBjb25zdCBCRklCYXNlOjpMb29wRGF0YSAqT3V0ZXJMb29wKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBCbG9ja0VkZ2VzQWRkZXI+Cit2b2lkIElycmVkdWNpYmxlR3JhcGg6OmluaXRpYWxpemUoY29uc3QgQkZJQmFzZTo6TG9vcERhdGEgKk91dGVyTG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0VkZ2VzQWRkZXIgYWRkQmxvY2tFZGdlcykgeworICBpZiAoT3V0ZXJMb29wKSB7CisgICAgYWRkTm9kZXNJbkxvb3AoKk91dGVyTG9vcCk7CisgICAgZm9yIChhdXRvIE4gOiBPdXRlckxvb3AtPk5vZGVzKQorICAgICAgYWRkRWRnZXMoTiwgT3V0ZXJMb29wLCBhZGRCbG9ja0VkZ2VzKTsKKyAgfSBlbHNlIHsKKyAgICBhZGROb2Rlc0luRnVuY3Rpb24oKTsKKyAgICBmb3IgKHVpbnQzMl90IEluZGV4ID0gMDsgSW5kZXggPCBCRkkuV29ya2luZy5zaXplKCk7ICsrSW5kZXgpCisgICAgICBhZGRFZGdlcyhJbmRleCwgT3V0ZXJMb29wLCBhZGRCbG9ja0VkZ2VzKTsKKyAgfQorICBTdGFydElyciA9IExvb2t1cFtTdGFydC5JbmRleF07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBCbG9ja0VkZ2VzQWRkZXI+Cit2b2lkIElycmVkdWNpYmxlR3JhcGg6OmFkZEVkZ2VzKGNvbnN0IEJsb2NrTm9kZSAmTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQkZJQmFzZTo6TG9vcERhdGEgKk91dGVyTG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tFZGdlc0FkZGVyIGFkZEJsb2NrRWRnZXMpIHsKKyAgYXV0byBMID0gTG9va3VwLmZpbmQoTm9kZS5JbmRleCk7CisgIGlmIChMID09IExvb2t1cC5lbmQoKSkKKyAgICByZXR1cm47CisgIElyck5vZGUgJklyciA9ICpMLT5zZWNvbmQ7CisgIGNvbnN0IGF1dG8gJldvcmtpbmcgPSBCRkkuV29ya2luZ1tOb2RlLkluZGV4XTsKKworICBpZiAoV29ya2luZy5pc0FQYWNrYWdlKCkpCisgICAgZm9yIChjb25zdCBhdXRvICZJIDogV29ya2luZy5Mb29wLT5FeGl0cykKKyAgICAgIGFkZEVkZ2UoSXJyLCBJLmZpcnN0LCBPdXRlckxvb3ApOworICBlbHNlCisgICAgYWRkQmxvY2tFZGdlcygqdGhpcywgSXJyLCBPdXRlckxvb3ApOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgYmZpX2RldGFpbAorCisvLy8gXGJyaWVmIFNoYXJlZCBpbXBsZW1lbnRhdGlvbiBmb3IgYmxvY2sgZnJlcXVlbmN5IGFuYWx5c2lzLgorLy8vCisvLy8gVGhpcyBpcyBhIHNoYXJlZCBpbXBsZW1lbnRhdGlvbiBvZiBCbG9ja0ZyZXF1ZW5jeUluZm8gYW5kCisvLy8gTWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mbywgYW5kIGNhbGN1bGF0ZXMgdGhlIHJlbGF0aXZlIGZyZXF1ZW5jaWVzIG9mCisvLy8gYmxvY2tzLgorLy8vCisvLy8gTG9vcEluZm8gZGVmaW5lcyBhIGxvb3AgYXMgYSAibm9uLXRyaXZpYWwiIFNDQyBkb21pbmF0ZWQgYnkgYSBzaW5nbGUgYmxvY2ssCisvLy8gd2hpY2ggaXMgY2FsbGVkIHRoZSBoZWFkZXIuICBBIGdpdmVuIGxvb3AsIEwsIGNhbiBoYXZlIHN1Yi1sb29wcywgd2hpY2ggYXJlCisvLy8gbG9vcHMgd2l0aGluIHRoZSBzdWJncmFwaCBvZiBMIHRoYXQgZXhjbHVkZSBpdHMgaGVhZGVyLiAgKEEgInRyaXZpYWwiIFNDQworLy8vIGNvbnNpc3RzIG9mIGEgc2luZ2xlIGJsb2NrIHRoYXQgZG9lcyBub3QgaGF2ZSBhIHNlbGYtZWRnZS4pCisvLy8KKy8vLyBJbiBhZGRpdGlvbiB0byBsb29wcywgdGhpcyBhbGdvcml0aG0gaGFzIGxpbWl0ZWQgc3VwcG9ydCBmb3IgaXJyZWR1Y2libGUKKy8vLyBTQ0NzLCB3aGljaCBhcmUgU0NDcyB3aXRoIG11bHRpcGxlIGVudHJ5IGJsb2Nrcy4gIElycmVkdWNpYmxlIFNDQ3MgYXJlCisvLy8gZGlzY292ZXJlZCBvbiB0aGV5IGZseSwgYW5kIG1vZGVsbGVkIGFzIGxvb3BzIHdpdGggbXVsdGlwbGUgaGVhZGVycy4KKy8vLworLy8vIFRoZSBoZWFkZXJzIG9mIGlycmVkdWNpYmxlIHN1Yi1TQ0NzIGNvbnNpc3Qgb2YgaXRzIGVudHJ5IGJsb2NrcyBhbmQgYWxsCisvLy8gbm9kZXMgdGhhdCBhcmUgdGFyZ2V0cyBvZiBhIGJhY2tlZGdlIHdpdGhpbiBpdCAoZXhjbHVkaW5nIGJhY2tlZGdlcyB3aXRoaW4KKy8vLyB0cnVlIHN1Yi1sb29wcykuICBCbG9jayBmcmVxdWVuY3kgY2FsY3VsYXRpb25zIGFjdCBhcyBpZiBhIGJsb2NrIGlzCisvLy8gaW5zZXJ0ZWQgdGhhdCBpbnRlcmNlcHRzIGFsbCB0aGUgZWRnZXMgdG8gdGhlIGhlYWRlcnMuICBBbGwgYmFja2VkZ2VzIGFuZAorLy8vIGVudHJpZXMgcG9pbnQgdG8gdGhpcyBibG9jay4gIEl0cyBzdWNjZXNzb3JzIGFyZSB0aGUgaGVhZGVycywgd2hpY2ggc3BsaXQKKy8vLyB0aGUgZnJlcXVlbmN5IGV2ZW5seS4KKy8vLworLy8vIFRoaXMgYWxnb3JpdGhtIGxldmVyYWdlcyBCbG9ja01hc3MgYW5kIFNjYWxlZE51bWJlciB0byBtYWludGFpbiBwcmVjaXNpb24sCisvLy8gc2VwYXJhdGVzIG1hc3MgZGlzdHJpYnV0aW9uIGZyb20gbG9vcCBzY2FsaW5nLCBhbmQgZGl0aGVycyB0byBlbGltaW5hdGUKKy8vLyBwcm9iYWJpbGl0eSBtYXNzIGxvc3MuCisvLy8KKy8vLyBUaGUgaW1wbGVtZW50YXRpb24gaXMgc3BsaXQgYmV0d2VlbiBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsLCB3aGljaCBrbm93cyB0aGUKKy8vLyB0eXBlIG9mIGdyYXBoIGJlaW5nIG1vZGVsbGVkIChCYXNpY0Jsb2NrIHZzLiBNYWNoaW5lQmFzaWNCbG9jayksIGFuZAorLy8vIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGxCYXNlLCB3aGljaCBkb2Vzbid0LiAgVGhlIGJhc2UgY2xhc3MgdXNlcyBcYQorLy8vIEJsb2NrTm9kZSwgYSB3cmFwcGVyIGFyb3VuZCBhIHVpbnQzMl90LiAgQmxvY2tOb2RlIGlzIG51bWJlcmVkIGZyb20gMCBpbgorLy8vIHJldmVyc2UtcG9zdCBvcmRlci4gIFRoaXMgZ2l2ZXMgdHdvIGFkdmFudGFnZXM6ICBpdCdzIGVhc3kgdG8gY29tcGFyZSB0aGUKKy8vLyByZWxhdGl2ZSBvcmRlcmluZyBvZiB0d28gbm9kZXMsIGFuZCBtYXBzIGtleWVkIG9uIEJsb2NrVCBjYW4gYmUgcmVwcmVzZW50ZWQKKy8vLyBieSB2ZWN0b3JzLgorLy8vCisvLy8gVGhpcyBhbGdvcml0aG0gaXMgTyhWK0UpLCB1bmxlc3MgdGhlcmUgaXMgaXJyZWR1Y2libGUgY29udHJvbCBmbG93LCBpbgorLy8vIHdoaWNoIGNhc2UgaXQncyBPKFYqRSkgaW4gdGhlIHdvcnN0IGNhc2UuCisvLy8KKy8vLyBUaGVzZSBhcmUgdGhlIG1haW4gc3RhZ2VzOgorLy8vCisvLy8gIDAuIFJldmVyc2UgcG9zdC1vcmRlciB0cmF2ZXJzYWwgKFxhIGluaXRpYWxpemVSUE9UKCkpLgorLy8vCisvLy8gICAgIFJ1biBhIHNpbmdsZSBwb3N0LW9yZGVyIHRyYXZlcnNhbCBhbmQgc2F2ZSBpdCAoaW4gcmV2ZXJzZSkgaW4gUlBPVC4KKy8vLyAgICAgQWxsIG90aGVyIHN0YWdlcyBtYWtlIHVzZSBvZiB0aGlzIG9yZGVyaW5nLiAgU2F2ZSBhIGxvb2t1cCBmcm9tIEJsb2NrVAorLy8vICAgICB0byBCbG9ja05vZGUgKHRoZSBpbmRleCBpbnRvIFJQT1QpIGluIE5vZGVzLgorLy8vCisvLy8gIDEuIExvb3AgaW5pdGlhbGl6YXRpb24gKFxhIGluaXRpYWxpemVMb29wcygpKS4KKy8vLworLy8vICAgICBUcmFuc2xhdGUgTG9vcEluZm8vTWFjaGluZUxvb3BJbmZvIGludG8gYSBmb3JtIHN1aXRhYmxlIGZvciB0aGUgcmVzdCBvZgorLy8vICAgICB0aGUgYWxnb3JpdGhtLiAgSW4gcGFydGljdWxhciwgc3RvcmUgdGhlIGltbWVkaWF0ZSBtZW1iZXJzIG9mIGVhY2ggbG9vcAorLy8vICAgICBpbiByZXZlcnNlIHBvc3Qtb3JkZXIuCisvLy8KKy8vLyAgMi4gQ2FsY3VsYXRlIG1hc3MgYW5kIHNjYWxlIGluIGxvb3BzIChcYSBjb21wdXRlTWFzc0luTG9vcHMoKSkuCisvLy8KKy8vLyAgICAgRm9yIGVhY2ggbG9vcCAoYm90dG9tLXVwKSwgZGlzdHJpYnV0ZSBtYXNzIHRocm91Z2ggdGhlIERBRyByZXN1bHRpbmcKKy8vLyAgICAgZnJvbSBpZ25vcmluZyBiYWNrZWRnZXMgYW5kIHRyZWF0aW5nIHN1Yi1sb29wcyBhcyBhIHNpbmdsZSBwc2V1ZG8tbm9kZS4KKy8vLyAgICAgVHJhY2sgdGhlIGJhY2tlZGdlIG1hc3MgZGlzdHJpYnV0ZWQgdG8gdGhlIGxvb3AgaGVhZGVyLCBhbmQgdXNlIGl0IHRvCisvLy8gICAgIGNhbGN1bGF0ZSB0aGUgbG9vcCBzY2FsZSAobnVtYmVyIG9mIGxvb3AgaXRlcmF0aW9ucykuICBJbW1lZGlhdGUKKy8vLyAgICAgbWVtYmVycyB0aGF0IHJlcHJlc2VudCBzdWItbG9vcHMgd2lsbCBhbHJlYWR5IGhhdmUgYmVlbiB2aXNpdGVkIGFuZAorLy8vICAgICBwYWNrYWdlZCBpbnRvIGEgcHNldWRvLW5vZGUuCisvLy8KKy8vLyAgICAgRGlzdHJpYnV0aW5nIG1hc3MgaW4gYSBsb29wIGlzIGEgcmV2ZXJzZS1wb3N0LW9yZGVyIHRyYXZlcnNhbCB0aHJvdWdoCisvLy8gICAgIHRoZSBsb29wLiAgU3RhcnQgYnkgYXNzaWduaW5nIGZ1bGwgbWFzcyB0byB0aGUgTG9vcCBoZWFkZXIuICBGb3IgZWFjaAorLy8vICAgICBub2RlIGluIHRoZSBsb29wOgorLy8vCisvLy8gICAgICAgICAtIEZldGNoIGFuZCBjYXRlZ29yaXplIHRoZSB3ZWlnaHQgZGlzdHJpYnV0aW9uIGZvciBpdHMgc3VjY2Vzc29ycy4KKy8vLyAgICAgICAgICAgSWYgdGhpcyBpcyBhIHBhY2thZ2VkLXN1Ymxvb3AsIHRoZSB3ZWlnaHQgZGlzdHJpYnV0aW9uIGlzIHN0b3JlZAorLy8vICAgICAgICAgICBpbiBcYSBMb29wRGF0YTo6RXhpdHMuICBPdGhlcndpc2UsIGZldGNoIGl0IGZyb20KKy8vLyAgICAgICAgICAgQnJhbmNoUHJvYmFiaWxpdHlJbmZvLgorLy8vCisvLy8gICAgICAgICAtIEVhY2ggc3VjY2Vzc29yIGlzIGNhdGVnb3JpemVkIGFzIFxhIFdlaWdodDo6TG9jYWwsIGEgbG9jYWwgZWRnZQorLy8vICAgICAgICAgICB3aXRoaW4gdGhlIGN1cnJlbnQgbG9vcCwgXGEgV2VpZ2h0OjpCYWNrZWRnZSwgYSBiYWNrZWRnZSB0byB0aGUKKy8vLyAgICAgICAgICAgbG9vcCBoZWFkZXIsIG9yIFxhIFdlaWdodDo6RXhpdCwgYW55IHN1Y2Nlc3NvciBvdXRzaWRlIHRoZSBsb29wLgorLy8vICAgICAgICAgICBUaGUgd2VpZ2h0LCB0aGUgc3VjY2Vzc29yLCBhbmQgaXRzIGNhdGVnb3J5IGFyZSBzdG9yZWQgaW4gXGEKKy8vLyAgICAgICAgICAgRGlzdHJpYnV0aW9uLiAgVGhlcmUgY2FuIGJlIG11bHRpcGxlIGVkZ2VzIHRvIGVhY2ggc3VjY2Vzc29yLgorLy8vCisvLy8gICAgICAgICAtIElmIHRoZXJlJ3MgYSBiYWNrZWRnZSB0byBhIG5vbi1oZWFkZXIsIHRoZXJlJ3MgYW4gaXJyZWR1Y2libGUgU0NDLgorLy8vICAgICAgICAgICBUaGUgdXN1YWwgZmxvdyBpcyB0ZW1wb3JhcmlseSBhYm9ydGVkLiAgXGEKKy8vLyAgICAgICAgICAgY29tcHV0ZUlycmVkdWNpYmxlTWFzcygpIGZpbmRzIHRoZSBpcnJlZHVjaWJsZSBTQ0NzIHdpdGhpbiB0aGUKKy8vLyAgICAgICAgICAgbG9vcCwgcGFja2FnZXMgdGhlbSB1cCwgYW5kIHJlc3RhcnRzIHRoZSBmbG93LgorLy8vCisvLy8gICAgICAgICAtIE5vcm1hbGl6ZSB0aGUgZGlzdHJpYnV0aW9uOiAgc2NhbGUgd2VpZ2h0cyBkb3duIHNvIHRoYXQgdGhlaXIgc3VtCisvLy8gICAgICAgICAgIGlzIDMyLWJpdHMsIGFuZCBjb2FsZXNjZSBtdWx0aXBsZSBlZGdlcyB0byB0aGUgc2FtZSBub2RlLgorLy8vCisvLy8gICAgICAgICAtIERpc3RyaWJ1dGUgdGhlIG1hc3MgYWNjb3JkaW5nbHksIGRpdGhlcmluZyB0byBtaW5pbWl6ZSBtYXNzIGxvc3MsCisvLy8gICAgICAgICAgIGFzIGRlc2NyaWJlZCBpbiBcYSBkaXN0cmlidXRlTWFzcygpLgorLy8vCisvLy8gICAgIEluIHRoZSBjYXNlIG9mIGlycmVkdWNpYmxlIGxvb3BzLCBpbnN0ZWFkIG9mIGEgc2luZ2xlIGxvb3AgaGVhZGVyLAorLy8vICAgICB0aGVyZSB3aWxsIGJlIHNldmVyYWwuIFRoZSBjb21wdXRhdGlvbiBvZiBiYWNrZWRnZSBtYXNzZXMgaXMgc2ltaWxhcgorLy8vICAgICBidXQgaW5zdGVhZCBvZiBoYXZpbmcgYSBzaW5nbGUgYmFja2VkZ2UgbWFzcywgdGhlcmUgd2lsbCBiZSBvbmUKKy8vLyAgICAgYmFja2VkZ2UgcGVyIGxvb3AgaGVhZGVyLiBJbiB0aGVzZSBjYXNlcywgZWFjaCBiYWNrZWRnZSB3aWxsIGNhcnJ5CisvLy8gICAgIGEgbWFzcyBwcm9wb3J0aW9uYWwgdG8gdGhlIGVkZ2Ugd2VpZ2h0cyBhbG9uZyB0aGUgY29ycmVzcG9uZGluZworLy8vICAgICBwYXRoLgorLy8vCisvLy8gICAgIEF0IHRoZSBlbmQgb2YgcHJvcGFnYXRpb24sIHRoZSBmdWxsIG1hc3MgYXNzaWduZWQgdG8gdGhlIGxvb3Agd2lsbCBiZQorLy8vICAgICBkaXN0cmlidXRlZCBhbW9uZyB0aGUgbG9vcCBoZWFkZXJzIHByb3BvcnRpb25hbGx5IGFjY29yZGluZyB0byB0aGUKKy8vLyAgICAgbWFzcyBmbG93aW5nIHRocm91Z2ggdGhlaXIgYmFja2VkZ2VzLgorLy8vCisvLy8gICAgIEZpbmFsbHksIGNhbGN1bGF0ZSB0aGUgbG9vcCBzY2FsZSBmcm9tIHRoZSBhY2N1bXVsYXRlZCBiYWNrZWRnZSBtYXNzLgorLy8vCisvLy8gIDMuIERpc3RyaWJ1dGUgbWFzcyBpbiB0aGUgZnVuY3Rpb24gKFxhIGNvbXB1dGVNYXNzSW5GdW5jdGlvbigpKS4KKy8vLworLy8vICAgICBGaW5hbGx5LCBkaXN0cmlidXRlIG1hc3MgdGhyb3VnaCB0aGUgREFHIHJlc3VsdGluZyBmcm9tIHBhY2thZ2luZyBhbGwKKy8vLyAgICAgbG9vcHMgaW4gdGhlIGZ1bmN0aW9uLiAgVGhpcyB1c2VzIHRoZSBzYW1lIGFsZ29yaXRobSBhcyBkaXN0cmlidXRpbmcKKy8vLyAgICAgbWFzcyBpbiBhIGxvb3AsIGV4Y2VwdCB0aGF0IHRoZXJlIGFyZSBubyBleGl0IG9yIGJhY2tlZGdlIGVkZ2VzLgorLy8vCisvLy8gIDQuIFVucGFja2FnZSBsb29wcyAoXGEgdW53cmFwTG9vcHMoKSkuCisvLy8KKy8vLyAgICAgSW5pdGlhbGl6ZSBlYWNoIGJsb2NrJ3MgZnJlcXVlbmN5IHRvIGEgZmxvYXRpbmcgcG9pbnQgcmVwcmVzZW50YXRpb24gb2YKKy8vLyAgICAgaXRzIG1hc3MuCisvLy8KKy8vLyAgICAgVmlzaXQgbG9vcHMgdG9wLWRvd24sIHNjYWxpbmcgdGhlIGZyZXF1ZW5jaWVzIG9mIGl0cyBpbW1lZGlhdGUgbWVtYmVycworLy8vICAgICBieSB0aGUgbG9vcCdzIHBzZXVkby1ub2RlJ3MgZnJlcXVlbmN5LgorLy8vCisvLy8gIDUuIENvbnZlcnQgZnJlcXVlbmNpZXMgdG8gYSA2NC1iaXQgcmFuZ2UgKFxhIGZpbmFsaXplTWV0cmljcygpKS4KKy8vLworLy8vICAgICBVc2luZyB0aGUgbWluIGFuZCBtYXggZnJlcXVlbmNpZXMgYXMgYSBndWlkZSwgdHJhbnNsYXRlIGZsb2F0aW5nIHBvaW50CisvLy8gICAgIGZyZXF1ZW5jaWVzIHRvIGFuIGFwcHJvcHJpYXRlIHJhbmdlIGluIHVpbnQ2NF90LgorLy8vCisvLy8gSXQgaGFzIHNvbWUga25vd24gZmxhd3MuCisvLy8KKy8vLyAgIC0gVGhlIG1vZGVsIG9mIGlycmVkdWNpYmxlIGNvbnRyb2wgZmxvdyBpcyBhIHJvdWdoIGFwcHJveGltYXRpb24uCisvLy8KKy8vLyAgICAgTW9kZWxsaW5nIGlycmVkdWNpYmxlIGNvbnRyb2wgZmxvdyBleGFjdGx5IGludm9sdmVzIHNldHRpbmcgdXAgYW5kCisvLy8gICAgIHNvbHZpbmcgYSBncm91cCBvZiBpbmZpbml0ZSBnZW9tZXRyaWMgc2VyaWVzLiAgU3VjaCBwcmVjaXNpb24gaXMKKy8vLyAgICAgdW5saWtlbHkgdG8gYmUgd29ydGh3aGlsZSwgc2luY2UgbW9zdCBvZiBvdXIgYWxnb3JpdGhtcyBnaXZlIHVwIG9uCisvLy8gICAgIGlycmVkdWNpYmxlIGNvbnRyb2wgZmxvdyBhbnl3YXkuCisvLy8KKy8vLyAgICAgTmV2ZXJ0aGVsZXNzLCB3ZSBtaWdodCBmaW5kIHRoYXQgd2UgbmVlZCB0byBnZXQgY2xvc2VyLiAgSGVyZSdzIGEgc29ydAorLy8vICAgICBvZiBUT0RPIGxpc3QgZm9yIHRoZSBtb2RlbCB3aXRoIGRpbWluaXNoaW5nIHJldHVybnMsIHRvIGJlIGNvbXBsZXRlZCBhcworLy8vICAgICBuZWNlc3NhcnkuCisvLy8KKy8vLyAgICAgICAtIFRoZSBoZWFkZXJzIGZvciB0aGUgXGEgTG9vcERhdGEgcmVwcmVzZW50aW5nIGFuIGlycmVkdWNpYmxlIFNDQworLy8vICAgICAgICAgaW5jbHVkZSBub24tZW50cnkgYmxvY2tzLiAgV2hlbiB0aGVzZSBleHRyYSBibG9ja3MgZXhpc3QsIHRoZXkKKy8vLyAgICAgICAgIGluZGljYXRlIGEgc2VsZi1jb250YWluZWQgaXJyZWR1Y2libGUgc3ViLVNDQy4gIFdlIGNvdWxkIHRyZWF0IHRoZW0KKy8vLyAgICAgICAgIGFzIHN1Yi1sb29wcywgcmF0aGVyIHRoYW4gYXJiaXRyYXJpbHkgc2hvdmluZyB0aGUgcHJvYmxlbWF0aWMKKy8vLyAgICAgICAgIGJsb2NrcyBpbnRvIHRoZSBoZWFkZXJzIG9mIHRoZSBtYWluIGlycmVkdWNpYmxlIFNDQy4KKy8vLworLy8vICAgICAgIC0gRW50cnkgZnJlcXVlbmNpZXMgYXJlIGFzc3VtZWQgdG8gYmUgZXZlbmx5IHNwbGl0IGJldHdlZW4gdGhlCisvLy8gICAgICAgICBoZWFkZXJzIG9mIGEgZ2l2ZW4gaXJyZWR1Y2libGUgU0NDLCB3aGljaCBpcyB0aGUgb25seSBvcHRpb24gaWYgd2UKKy8vLyAgICAgICAgIG5lZWQgdG8gY29tcHV0ZSBtYXNzIGluIHRoZSBTQ0MgYmVmb3JlIGl0cyBwYXJlbnQgbG9vcC4gIEluc3RlYWQsCisvLy8gICAgICAgICB3ZSBjb3VsZCBwYXJ0aWFsbHkgY29tcHV0ZSBtYXNzIGluIHRoZSBwYXJlbnQgbG9vcCwgYW5kIHN0b3Agd2hlbgorLy8vICAgICAgICAgd2UgZ2V0IHRvIHRoZSBTQ0MuICBIZXJlLCB3ZSBoYXZlIHRoZSBjb3JyZWN0IHJhdGlvIG9mIGVudHJ5CisvLy8gICAgICAgICBtYXNzZXMsIHdoaWNoIHdlIGNhbiB1c2UgdG8gYWRqdXN0IHRoZWlyIHJlbGF0aXZlIGZyZXF1ZW5jaWVzLgorLy8vICAgICAgICAgQ29tcHV0ZSBtYXNzIGluIHRoZSBTQ0MsIGFuZCB0aGVuIGNvbnRpbnVlIHByb3BhZ2F0aW9uIGluIHRoZQorLy8vICAgICAgICAgcGFyZW50LgorLy8vCisvLy8gICAgICAgLSBXZSBjYW4gcHJvcGFnYXRlIG1hc3MgaXRlcmF0aXZlbHkgdGhyb3VnaCB0aGUgU0NDLCBmb3Igc29tZSBmaXhlZAorLy8vICAgICAgICAgbnVtYmVyIG9mIGl0ZXJhdGlvbnMuICBFYWNoIGl0ZXJhdGlvbiBzdGFydHMgYnkgYXNzaWduaW5nIHRoZSBlbnRyeQorLy8vICAgICAgICAgYmxvY2tzIHRoZWlyIGJhY2tlZGdlIG1hc3MgZnJvbSB0aGUgcHJpb3IgaXRlcmF0aW9uLiAgVGhlIGZpbmFsCisvLy8gICAgICAgICBtYXNzIGZvciBlYWNoIGJsb2NrIChhbmQgZWFjaCBleGl0LCBhbmQgdGhlIHRvdGFsIGJhY2tlZGdlIG1hc3MKKy8vLyAgICAgICAgIHVzZWQgZm9yIGNvbXB1dGluZyBsb29wIHNjYWxlKSBpcyB0aGUgc3VtIG9mIGFsbCBpdGVyYXRpb25zLgorLy8vICAgICAgICAgKFJ1bm5pbmcgdGhpcyB1bnRpbCBmaXhlZCBwb2ludCB3b3VsZCAic29sdmUiIHRoZSBnZW9tZXRyaWMKKy8vLyAgICAgICAgIHNlcmllcyBieSBzaW11bGF0aW9uLikKK3RlbXBsYXRlIDxjbGFzcyBCVD4gY2xhc3MgQmxvY2tGcmVxdWVuY3lJbmZvSW1wbCA6IEJsb2NrRnJlcXVlbmN5SW5mb0ltcGxCYXNlIHsKKyAgLy8gVGhpcyBpcyBwYXJ0IG9mIGEgd29ya2Fyb3VuZCBmb3IgYSBHQ0MgNC43IGNyYXNoIG9uIGxhbWJkYXMuCisgIGZyaWVuZCBzdHJ1Y3QgYmZpX2RldGFpbDo6QmxvY2tFZGdlc0FkZGVyPEJUPjsKKworICB1c2luZyBCbG9ja1QgPSB0eXBlbmFtZSBiZmlfZGV0YWlsOjpUeXBlTWFwPEJUPjo6QmxvY2tUOworICB1c2luZyBGdW5jdGlvblQgPSB0eXBlbmFtZSBiZmlfZGV0YWlsOjpUeXBlTWFwPEJUPjo6RnVuY3Rpb25UOworICB1c2luZyBCcmFuY2hQcm9iYWJpbGl0eUluZm9UID0KKyAgICAgIHR5cGVuYW1lIGJmaV9kZXRhaWw6OlR5cGVNYXA8QlQ+OjpCcmFuY2hQcm9iYWJpbGl0eUluZm9UOworICB1c2luZyBMb29wVCA9IHR5cGVuYW1lIGJmaV9kZXRhaWw6OlR5cGVNYXA8QlQ+OjpMb29wVDsKKyAgdXNpbmcgTG9vcEluZm9UID0gdHlwZW5hbWUgYmZpX2RldGFpbDo6VHlwZU1hcDxCVD46Okxvb3BJbmZvVDsKKyAgdXNpbmcgU3VjY2Vzc29yID0gR3JhcGhUcmFpdHM8Y29uc3QgQmxvY2tUICo+OworICB1c2luZyBQcmVkZWNlc3NvciA9IEdyYXBoVHJhaXRzPEludmVyc2U8Y29uc3QgQmxvY2tUICo+PjsKKworICBjb25zdCBCcmFuY2hQcm9iYWJpbGl0eUluZm9UICpCUEkgPSBudWxscHRyOworICBjb25zdCBMb29wSW5mb1QgKkxJID0gbnVsbHB0cjsKKyAgY29uc3QgRnVuY3Rpb25UICpGID0gbnVsbHB0cjsKKworICAvLyBBbGwgYmxvY2tzIGluIHJldmVyc2UgcG9zdG9yZGVyLgorICBzdGQ6OnZlY3Rvcjxjb25zdCBCbG9ja1QgKj4gUlBPVDsKKyAgRGVuc2VNYXA8Y29uc3QgQmxvY2tUICosIEJsb2NrTm9kZT4gTm9kZXM7CisKKyAgdXNpbmcgcnBvdF9pdGVyYXRvciA9IHR5cGVuYW1lIHN0ZDo6dmVjdG9yPGNvbnN0IEJsb2NrVCAqPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgcnBvdF9pdGVyYXRvciBycG90X2JlZ2luKCkgY29uc3QgeyByZXR1cm4gUlBPVC5iZWdpbigpOyB9CisgIHJwb3RfaXRlcmF0b3IgcnBvdF9lbmQoKSBjb25zdCB7IHJldHVybiBSUE9ULmVuZCgpOyB9CisKKyAgc2l6ZV90IGdldEluZGV4KGNvbnN0IHJwb3RfaXRlcmF0b3IgJkkpIGNvbnN0IHsgcmV0dXJuIEkgLSBycG90X2JlZ2luKCk7IH0KKworICBCbG9ja05vZGUgZ2V0Tm9kZShjb25zdCBycG90X2l0ZXJhdG9yICZJKSBjb25zdCB7CisgICAgcmV0dXJuIEJsb2NrTm9kZShnZXRJbmRleChJKSk7CisgIH0KKyAgQmxvY2tOb2RlIGdldE5vZGUoY29uc3QgQmxvY2tUICpCQikgY29uc3QgeyByZXR1cm4gTm9kZXMubG9va3VwKEJCKTsgfQorCisgIGNvbnN0IEJsb2NrVCAqZ2V0QmxvY2soY29uc3QgQmxvY2tOb2RlICZOb2RlKSBjb25zdCB7CisgICAgYXNzZXJ0KE5vZGUuSW5kZXggPCBSUE9ULnNpemUoKSk7CisgICAgcmV0dXJuIFJQT1RbTm9kZS5JbmRleF07CisgIH0KKworICAvLy8gXGJyaWVmIFJ1biAoYW5kIHNhdmUpIGEgcG9zdC1vcmRlciB0cmF2ZXJzYWwuCisgIC8vLworICAvLy8gU2F2ZXMgYSByZXZlcnNlIHBvc3Qtb3JkZXIgdHJhdmVyc2FsIG9mIGFsbCB0aGUgbm9kZXMgaW4gXGEgRi4KKyAgdm9pZCBpbml0aWFsaXplUlBPVCgpOworCisgIC8vLyBcYnJpZWYgSW5pdGlhbGl6ZSBsb29wIGRhdGEuCisgIC8vLworICAvLy8gQnVpbGQgdXAgXGEgTG9vcHMgdXNpbmcgXGEgTG9vcEluZm8uICBcYSBMb29wSW5mbyBnaXZlcyB1cyBhIG1hcHBpbmcgZnJvbQorICAvLy8gZWFjaCBibG9jayB0byB0aGUgZGVlcGVzdCBsb29wIGl0J3MgaW4sIGJ1dCB3ZSBuZWVkIHRoZSBpbnZlcnNlLiAgRm9yIGVhY2gKKyAgLy8vIGxvb3AsIHdlIHN0b3JlIGluIHJldmVyc2UgcG9zdC1vcmRlciBpdHMgImltbWVkaWF0ZSIgbWVtYmVycywgZGVmaW5lZCBhcworICAvLy8gdGhlIGhlYWRlciwgdGhlIGhlYWRlcnMgb2YgaW1tZWRpYXRlIHN1Yi1sb29wcywgYW5kIGFsbCBvdGhlciBibG9ja3MgaW4KKyAgLy8vIHRoZSBsb29wIHRoYXQgYXJlIG5vdCBpbiBzdWItbG9vcHMuCisgIHZvaWQgaW5pdGlhbGl6ZUxvb3BzKCk7CisKKyAgLy8vIFxicmllZiBQcm9wYWdhdGUgdG8gYSBibG9jaydzIHN1Y2Nlc3NvcnMuCisgIC8vLworICAvLy8gSW4gdGhlIGNvbnRleHQgb2YgZGlzdHJpYnV0aW5nIG1hc3MgdGhyb3VnaCBcYyBPdXRlckxvb3AsIGRpdmlkZSB0aGUgbWFzcworICAvLy8gY3VycmVudGx5IGFzc2lnbmVkIHRvIFxjIE5vZGUgYmV0d2VlbiBpdHMgc3VjY2Vzc29ycy4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFxjIHRydWUgdW5sZXNzIHRoZXJlJ3MgYW4gaXJyZWR1Y2libGUgYmFja2VkZ2UuCisgIGJvb2wgcHJvcGFnYXRlTWFzc1RvU3VjY2Vzc29ycyhMb29wRGF0YSAqT3V0ZXJMb29wLCBjb25zdCBCbG9ja05vZGUgJk5vZGUpOworCisgIC8vLyBcYnJpZWYgQ29tcHV0ZSBtYXNzIGluIGEgcGFydGljdWxhciBsb29wLgorICAvLy8KKyAgLy8vIEFzc2lnbiBtYXNzIHRvIFxjIExvb3AncyBoZWFkZXIsIGFuZCB0aGVuIGZvciBlYWNoIGJsb2NrIGluIFxjIExvb3AgaW4KKyAgLy8vIHJldmVyc2UgcG9zdC1vcmRlciwgZGlzdHJpYnV0ZSBtYXNzIHRvIGl0cyBzdWNjZXNzb3JzLiAgT25seSB2aXNpdHMgbm9kZXMKKyAgLy8vIHRoYXQgaGF2ZSBub3QgYmVlbiBwYWNrYWdlZCBpbnRvIHN1Yi1sb29wcy4KKyAgLy8vCisgIC8vLyBccHJlIFxhIGNvbXB1dGVNYXNzSW5Mb29wKCkgaGFzIGJlZW4gY2FsbGVkIGZvciBlYWNoIHN1Ymxvb3Agb2YgXGMgTG9vcC4KKyAgLy8vIFxyZXR1cm4gXGMgdHJ1ZSB1bmxlc3MgdGhlcmUncyBhbiBpcnJlZHVjaWJsZSBiYWNrZWRnZS4KKyAgYm9vbCBjb21wdXRlTWFzc0luTG9vcChMb29wRGF0YSAmTG9vcCk7CisKKyAgLy8vIFxicmllZiBUcnkgdG8gY29tcHV0ZSBtYXNzIGluIHRoZSB0b3AtbGV2ZWwgZnVuY3Rpb24uCisgIC8vLworICAvLy8gQXNzaWduIG1hc3MgdG8gdGhlIGVudHJ5IGJsb2NrLCBhbmQgdGhlbiBmb3IgZWFjaCBibG9jayBpbiByZXZlcnNlCisgIC8vLyBwb3N0LW9yZGVyLCBkaXN0cmlidXRlIG1hc3MgdG8gaXRzIHN1Y2Nlc3NvcnMuICBTa2lwcyBub2RlcyB0aGF0IGhhdmUKKyAgLy8vIGJlZW4gcGFja2FnZWQgaW50byBsb29wcy4KKyAgLy8vCisgIC8vLyBccHJlIFxhIGNvbXB1dGVNYXNzSW5Mb29wcygpIGhhcyBiZWVuIGNhbGxlZC4KKyAgLy8vIFxyZXR1cm4gXGMgdHJ1ZSB1bmxlc3MgdGhlcmUncyBhbiBpcnJlZHVjaWJsZSBiYWNrZWRnZS4KKyAgYm9vbCB0cnlUb0NvbXB1dGVNYXNzSW5GdW5jdGlvbigpOworCisgIC8vLyBcYnJpZWYgQ29tcHV0ZSBtYXNzIGluIChhbmQgcGFja2FnZSB1cCkgaXJyZWR1Y2libGUgU0NDcy4KKyAgLy8vCisgIC8vLyBGaW5kIHRoZSBpcnJlZHVjaWJsZSBTQ0NzIGluIFxjIE91dGVyTG9vcCwgYWRkIHRoZW0gdG8gXGEgTG9vcHMgKGluIGZyb250CisgIC8vLyBvZiBcYyBJbnNlcnQpLCBhbmQgY2FsbCBcYSBjb21wdXRlTWFzc0luTG9vcCgpIG9uIGVhY2ggb2YgdGhlbS4KKyAgLy8vCisgIC8vLyBJZiBcYyBPdXRlckxvb3AgaXMgXGMgbnVsbHB0ciwgaXQgcmVmZXJzIHRvIHRoZSB0b3AtbGV2ZWwgZnVuY3Rpb24uCisgIC8vLworICAvLy8gXHByZSBcYSBjb21wdXRlTWFzc0luTG9vcCgpIGhhcyBiZWVuIGNhbGxlZCBmb3IgZWFjaCBzdWJsb29wIG9mIFxjCisgIC8vLyBPdXRlckxvb3AuCisgIC8vLyBccHJlIFxjIEluc2VydCBwb2ludHMgYXQgdGhlIGxhc3QgbG9vcCBzdWNjZXNzZnVsbHkgcHJvY2Vzc2VkIGJ5IFxhCisgIC8vLyBjb21wdXRlTWFzc0luTG9vcCgpLgorICAvLy8gXHByZSBcYyBPdXRlckxvb3AgaGFzIGlycmVkdWNpYmxlIFNDQ3MuCisgIHZvaWQgY29tcHV0ZUlycmVkdWNpYmxlTWFzcyhMb29wRGF0YSAqT3V0ZXJMb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpsaXN0PExvb3BEYXRhPjo6aXRlcmF0b3IgSW5zZXJ0KTsKKworICAvLy8gXGJyaWVmIENvbXB1dGUgbWFzcyBpbiBhbGwgbG9vcHMuCisgIC8vLworICAvLy8gRm9yIGVhY2ggbG9vcCBib3R0b20tdXAsIGNhbGwgXGEgY29tcHV0ZU1hc3NJbkxvb3AoKS4KKyAgLy8vCisgIC8vLyBcYSBjb21wdXRlTWFzc0luTG9vcCgpIGFib3J0cyAoYW5kIHJldHVybnMgXGMgZmFsc2UpIG9uIGxvb3BzIHRoYXQKKyAgLy8vIGNvbnRhaW4gYSBpcnJlZHVjaWJsZSBzdWItU0NDcy4gIFVzZSBcYSBjb21wdXRlSXJyZWR1Y2libGVNYXNzKCkgYW5kIHRoZW4KKyAgLy8vIHJlLWVudGVyIFxhIGNvbXB1dGVNYXNzSW5Mb29wKCkuCisgIC8vLworICAvLy8gXHBvc3QgXGEgY29tcHV0ZU1hc3NJbkxvb3AoKSBoYXMgcmV0dXJuZWQgXGMgdHJ1ZSBmb3IgZXZlcnkgbG9vcC4KKyAgdm9pZCBjb21wdXRlTWFzc0luTG9vcHMoKTsKKworICAvLy8gXGJyaWVmIENvbXB1dGUgbWFzcyBpbiB0aGUgdG9wLWxldmVsIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIFVzZXMgXGEgdHJ5VG9Db21wdXRlTWFzc0luRnVuY3Rpb24oKSBhbmQgXGEgY29tcHV0ZUlycmVkdWNpYmxlTWFzcygpIHRvCisgIC8vLyBjb21wdXRlIG1hc3MgaW4gdGhlIHRvcC1sZXZlbCBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBccG9zdCBcYSB0cnlUb0NvbXB1dGVNYXNzSW5GdW5jdGlvbigpIGhhcyByZXR1cm5lZCBcYyB0cnVlLgorICB2b2lkIGNvbXB1dGVNYXNzSW5GdW5jdGlvbigpOworCisgIHN0ZDo6c3RyaW5nIGdldEJsb2NrTmFtZShjb25zdCBCbG9ja05vZGUgJk5vZGUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gYmZpX2RldGFpbDo6Z2V0QmxvY2tOYW1lKGdldEJsb2NrKE5vZGUpKTsKKyAgfQorCitwdWJsaWM6CisgIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGwoKSA9IGRlZmF1bHQ7CisKKyAgY29uc3QgRnVuY3Rpb25UICpnZXRGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIEY7IH0KKworICB2b2lkIGNhbGN1bGF0ZShjb25zdCBGdW5jdGlvblQgJkYsIGNvbnN0IEJyYW5jaFByb2JhYmlsaXR5SW5mb1QgJkJQSSwKKyAgICAgICAgICAgICAgICAgY29uc3QgTG9vcEluZm9UICZMSSk7CisKKyAgdXNpbmcgQmxvY2tGcmVxdWVuY3lJbmZvSW1wbEJhc2U6OmdldEVudHJ5RnJlcTsKKworICBCbG9ja0ZyZXF1ZW5jeSBnZXRCbG9ja0ZyZXEoY29uc3QgQmxvY2tUICpCQikgY29uc3QgeworICAgIHJldHVybiBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsQmFzZTo6Z2V0QmxvY2tGcmVxKGdldE5vZGUoQkIpKTsKKyAgfQorCisgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRCbG9ja1Byb2ZpbGVDb3VudChjb25zdCBGdW5jdGlvbiAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJsb2NrVCAqQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gQmxvY2tGcmVxdWVuY3lJbmZvSW1wbEJhc2U6OmdldEJsb2NrUHJvZmlsZUNvdW50KEYsIGdldE5vZGUoQkIpKTsKKyAgfQorCisgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRQcm9maWxlQ291bnRGcm9tRnJlcShjb25zdCBGdW5jdGlvbiAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEZyZXEpIGNvbnN0IHsKKyAgICByZXR1cm4gQmxvY2tGcmVxdWVuY3lJbmZvSW1wbEJhc2U6OmdldFByb2ZpbGVDb3VudEZyb21GcmVxKEYsIEZyZXEpOworICB9CisKKyAgYm9vbCBpc0lyckxvb3BIZWFkZXIoY29uc3QgQmxvY2tUICpCQikgeworICAgIHJldHVybiBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsQmFzZTo6aXNJcnJMb29wSGVhZGVyKGdldE5vZGUoQkIpKTsKKyAgfQorCisgIHZvaWQgc2V0QmxvY2tGcmVxKGNvbnN0IEJsb2NrVCAqQkIsIHVpbnQ2NF90IEZyZXEpOworCisgIFNjYWxlZDY0IGdldEZsb2F0aW5nQmxvY2tGcmVxKGNvbnN0IEJsb2NrVCAqQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gQmxvY2tGcmVxdWVuY3lJbmZvSW1wbEJhc2U6OmdldEZsb2F0aW5nQmxvY2tGcmVxKGdldE5vZGUoQkIpKTsKKyAgfQorCisgIGNvbnN0IEJyYW5jaFByb2JhYmlsaXR5SW5mb1QgJmdldEJQSSgpIGNvbnN0IHsgcmV0dXJuICpCUEk7IH0KKworICAvLy8gXGJyaWVmIFByaW50IHRoZSBmcmVxdWVuY2llcyBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgIC8vLworICAvLy8gUHJpbnRzIHRoZSBmcmVxdWVuY2llcyBmb3IgdGhlIGJsb2NrcyBpbiB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBCbG9ja3MgYXJlIHByaW50ZWQgaW4gdGhlIG5hdHVyYWwgaXRlcmF0aW9uIG9yZGVyIG9mIHRoZSBmdW5jdGlvbiwgcmF0aGVyCisgIC8vLyB0aGFuIHJldmVyc2UgcG9zdC1vcmRlci4gIFRoaXMgcHJvdmlkZXMgdHdvIGFkdmFudGFnZXM6ICB3cml0aW5nIC1hbmFseXplCisgIC8vLyB0ZXN0cyBpcyBlYXNpZXIgKHNpbmNlIGJsb2NrcyBjb21lIG91dCBpbiBzb3VyY2Ugb3JkZXIpLCBhbmQgZXZlbgorICAvLy8gdW5yZWFjaGFibGUgYmxvY2tzIGFyZSBwcmludGVkLgorICAvLy8KKyAgLy8vIFxhIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGxCYXNlOjpwcmludCgpIG9ubHkga25vd3MgcmV2ZXJzZSBwb3N0LW9yZGVyLCBzbworICAvLy8gd2UgbmVlZCB0byBvdmVycmlkZSBpdCBoZXJlLgorICByYXdfb3N0cmVhbSAmcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZTsKKworICB1c2luZyBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsQmFzZTo6ZHVtcDsKKyAgdXNpbmcgQmxvY2tGcmVxdWVuY3lJbmZvSW1wbEJhc2U6OnByaW50QmxvY2tGcmVxOworCisgIHJhd19vc3RyZWFtICZwcmludEJsb2NrRnJlcShyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IEJsb2NrVCAqQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gQmxvY2tGcmVxdWVuY3lJbmZvSW1wbEJhc2U6OnByaW50QmxvY2tGcmVxKE9TLCBnZXROb2RlKEJCKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBCVD4KK3ZvaWQgQmxvY2tGcmVxdWVuY3lJbmZvSW1wbDxCVD46OmNhbGN1bGF0ZShjb25zdCBGdW5jdGlvblQgJkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnJhbmNoUHJvYmFiaWxpdHlJbmZvVCAmQlBJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3BJbmZvVCAmTEkpIHsKKyAgLy8gU2F2ZSB0aGUgcGFyYW1ldGVycy4KKyAgdGhpcy0+QlBJID0gJkJQSTsKKyAgdGhpcy0+TEkgPSAmTEk7CisgIHRoaXMtPkYgPSAmRjsKKworICAvLyBDbGVhbiB1cCBsZWZ0LW92ZXIgZGF0YSBzdHJ1Y3R1cmVzLgorICBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsQmFzZTo6Y2xlYXIoKTsKKyAgUlBPVC5jbGVhcigpOworICBOb2Rlcy5jbGVhcigpOworCisgIC8vIEluaXRpYWxpemUuCisgIERFQlVHKGRiZ3MoKSA8PCAiXG5ibG9jay1mcmVxdWVuY3k6ICIgPDwgRi5nZXROYW1lKCkgPDwgIlxuPT09PT09PT09PT09PT09PT0iCisgICAgICAgICAgICAgICA8PCBzdGQ6OnN0cmluZyhGLmdldE5hbWUoKS5zaXplKCksICc9JykgPDwgIlxuIik7CisgIGluaXRpYWxpemVSUE9UKCk7CisgIGluaXRpYWxpemVMb29wcygpOworCisgIC8vIFZpc2l0IGxvb3BzIGluIHBvc3Qtb3JkZXIgdG8gZmluZCB0aGUgbG9jYWwgbWFzcyBkaXN0cmlidXRpb24sIGFuZCB0aGVuIGRvCisgIC8vIHRoZSBmdWxsIGZ1bmN0aW9uLgorICBjb21wdXRlTWFzc0luTG9vcHMoKTsKKyAgY29tcHV0ZU1hc3NJbkZ1bmN0aW9uKCk7CisgIHVud3JhcExvb3BzKCk7CisgIGZpbmFsaXplTWV0cmljcygpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQlQ+Cit2b2lkIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGw8QlQ+OjpzZXRCbG9ja0ZyZXEoY29uc3QgQmxvY2tUICpCQiwgdWludDY0X3QgRnJlcSkgeworICBpZiAoTm9kZXMuY291bnQoQkIpKQorICAgIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGxCYXNlOjpzZXRCbG9ja0ZyZXEoZ2V0Tm9kZShCQiksIEZyZXEpOworICBlbHNlIHsKKyAgICAvLyBJZiBCQiBpcyBhIG5ld2x5IGFkZGVkIGJsb2NrIGFmdGVyIEJGSSBpcyBkb25lLCB3ZSBuZWVkIHRvIGNyZWF0ZSBhIG5ldworICAgIC8vIEJsb2NrTm9kZSBmb3IgaXQgYXNzaWduZWQgd2l0aCBhIG5ldyBpbmRleC4gVGhlIGluZGV4IGNhbiBiZSBkZXRlcm1pbmVkCisgICAgLy8gYnkgdGhlIHNpemUgb2YgRnJlcXMuCisgICAgQmxvY2tOb2RlIE5ld05vZGUoRnJlcXMuc2l6ZSgpKTsKKyAgICBOb2Rlc1tCQl0gPSBOZXdOb2RlOworICAgIEZyZXFzLmVtcGxhY2VfYmFjaygpOworICAgIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGxCYXNlOjpzZXRCbG9ja0ZyZXEoTmV3Tm9kZSwgRnJlcSk7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIEJUPiB2b2lkIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGw8QlQ+Ojppbml0aWFsaXplUlBPVCgpIHsKKyAgY29uc3QgQmxvY2tUICpFbnRyeSA9ICZGLT5mcm9udCgpOworICBSUE9ULnJlc2VydmUoRi0+c2l6ZSgpKTsKKyAgc3RkOjpjb3B5KHBvX2JlZ2luKEVudHJ5KSwgcG9fZW5kKEVudHJ5KSwgc3RkOjpiYWNrX2luc2VydGVyKFJQT1QpKTsKKyAgc3RkOjpyZXZlcnNlKFJQT1QuYmVnaW4oKSwgUlBPVC5lbmQoKSk7CisKKyAgYXNzZXJ0KFJQT1Quc2l6ZSgpIC0gMSA8PSBCbG9ja05vZGU6OmdldE1heEluZGV4KCkgJiYKKyAgICAgICAgICJNb3JlIG5vZGVzIGluIGZ1bmN0aW9uIHRoYW4gQmxvY2sgRnJlcXVlbmN5IEluZm8gc3VwcG9ydHMiKTsKKworICBERUJVRyhkYmdzKCkgPDwgInJldmVyc2UtcG9zdC1vcmRlci10cmF2ZXJzYWxcbiIpOworICBmb3IgKHJwb3RfaXRlcmF0b3IgSSA9IHJwb3RfYmVnaW4oKSwgRSA9IHJwb3RfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgQmxvY2tOb2RlIE5vZGUgPSBnZXROb2RlKEkpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiIC0gIiA8PCBnZXRJbmRleChJKSA8PCAiOiAiIDw8IGdldEJsb2NrTmFtZShOb2RlKSA8PCAiXG4iKTsKKyAgICBOb2Rlc1sqSV0gPSBOb2RlOworICB9CisKKyAgV29ya2luZy5yZXNlcnZlKFJQT1Quc2l6ZSgpKTsKKyAgZm9yIChzaXplX3QgSW5kZXggPSAwOyBJbmRleCA8IFJQT1Quc2l6ZSgpOyArK0luZGV4KQorICAgIFdvcmtpbmcuZW1wbGFjZV9iYWNrKEluZGV4KTsKKyAgRnJlcXMucmVzaXplKFJQT1Quc2l6ZSgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJUPiB2b2lkIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGw8QlQ+Ojppbml0aWFsaXplTG9vcHMoKSB7CisgIERFQlVHKGRiZ3MoKSA8PCAibG9vcC1kZXRlY3Rpb25cbiIpOworICBpZiAoTEktPmVtcHR5KCkpCisgICAgcmV0dXJuOworCisgIC8vIFZpc2l0IGxvb3BzIHRvcCBkb3duIGFuZCBhc3NpZ24gdGhlbSBhbiBpbmRleC4KKyAgc3RkOjpkZXF1ZTxzdGQ6OnBhaXI8Y29uc3QgTG9vcFQgKiwgTG9vcERhdGEgKj4+IFE7CisgIGZvciAoY29uc3QgTG9vcFQgKkwgOiAqTEkpCisgICAgUS5lbXBsYWNlX2JhY2soTCwgbnVsbHB0cik7CisgIHdoaWxlICghUS5lbXB0eSgpKSB7CisgICAgY29uc3QgTG9vcFQgKkxvb3AgPSBRLmZyb250KCkuZmlyc3Q7CisgICAgTG9vcERhdGEgKlBhcmVudCA9IFEuZnJvbnQoKS5zZWNvbmQ7CisgICAgUS5wb3BfZnJvbnQoKTsKKworICAgIEJsb2NrTm9kZSBIZWFkZXIgPSBnZXROb2RlKExvb3AtPmdldEhlYWRlcigpKTsKKyAgICBhc3NlcnQoSGVhZGVyLmlzVmFsaWQoKSk7CisKKyAgICBMb29wcy5lbXBsYWNlX2JhY2soUGFyZW50LCBIZWFkZXIpOworICAgIFdvcmtpbmdbSGVhZGVyLkluZGV4XS5Mb29wID0gJkxvb3BzLmJhY2soKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAtIGxvb3AgPSAiIDw8IGdldEJsb2NrTmFtZShIZWFkZXIpIDw8ICJcbiIpOworCisgICAgZm9yIChjb25zdCBMb29wVCAqTCA6ICpMb29wKQorICAgICAgUS5lbXBsYWNlX2JhY2soTCwgJkxvb3BzLmJhY2soKSk7CisgIH0KKworICAvLyBWaXNpdCBub2RlcyBpbiByZXZlcnNlIHBvc3Qtb3JkZXIgYW5kIGFkZCB0aGVtIHRvIHRoZWlyIGRlZXBlc3QgY29udGFpbmluZworICAvLyBsb29wLgorICBmb3IgKHNpemVfdCBJbmRleCA9IDA7IEluZGV4IDwgUlBPVC5zaXplKCk7ICsrSW5kZXgpIHsKKyAgICAvLyBMb29wIGhlYWRlcnMgaGF2ZSBhbHJlYWR5IGJlZW4gbW9zdGx5IG1hcHBlZC4KKyAgICBpZiAoV29ya2luZ1tJbmRleF0uaXNMb29wSGVhZGVyKCkpIHsKKyAgICAgIExvb3BEYXRhICpDb250YWluaW5nTG9vcCA9IFdvcmtpbmdbSW5kZXhdLmdldENvbnRhaW5pbmdMb29wKCk7CisgICAgICBpZiAoQ29udGFpbmluZ0xvb3ApCisgICAgICAgIENvbnRhaW5pbmdMb29wLT5Ob2Rlcy5wdXNoX2JhY2soSW5kZXgpOworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgY29uc3QgTG9vcFQgKkxvb3AgPSBMSS0+Z2V0TG9vcEZvcihSUE9UW0luZGV4XSk7CisgICAgaWYgKCFMb29wKQorICAgICAgY29udGludWU7CisKKyAgICAvLyBBZGQgdGhpcyBub2RlIHRvIGl0cyBjb250YWluaW5nIGxvb3AncyBtZW1iZXIgbGlzdC4KKyAgICBCbG9ja05vZGUgSGVhZGVyID0gZ2V0Tm9kZShMb29wLT5nZXRIZWFkZXIoKSk7CisgICAgYXNzZXJ0KEhlYWRlci5pc1ZhbGlkKCkpOworICAgIGNvbnN0IGF1dG8gJkhlYWRlckRhdGEgPSBXb3JraW5nW0hlYWRlci5JbmRleF07CisgICAgYXNzZXJ0KEhlYWRlckRhdGEuaXNMb29wSGVhZGVyKCkpOworCisgICAgV29ya2luZ1tJbmRleF0uTG9vcCA9IEhlYWRlckRhdGEuTG9vcDsKKyAgICBIZWFkZXJEYXRhLkxvb3AtPk5vZGVzLnB1c2hfYmFjayhJbmRleCk7CisgICAgREVCVUcoZGJncygpIDw8ICIgLSBsb29wID0gIiA8PCBnZXRCbG9ja05hbWUoSGVhZGVyKQorICAgICAgICAgICAgICAgICA8PCAiOiBtZW1iZXIgPSAiIDw8IGdldEJsb2NrTmFtZShJbmRleCkgPDwgIlxuIik7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIEJUPiB2b2lkIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGw8QlQ+Ojpjb21wdXRlTWFzc0luTG9vcHMoKSB7CisgIC8vIFZpc2l0IGxvb3BzIHdpdGggdGhlIGRlZXBlc3QgZmlyc3QsIGFuZCB0aGUgdG9wLWxldmVsIGxvb3BzIGxhc3QuCisgIGZvciAoYXV0byBMID0gTG9vcHMucmJlZ2luKCksIEUgPSBMb29wcy5yZW5kKCk7IEwgIT0gRTsgKytMKSB7CisgICAgaWYgKGNvbXB1dGVNYXNzSW5Mb29wKCpMKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGF1dG8gTmV4dCA9IHN0ZDo6bmV4dChMKTsKKyAgICBjb21wdXRlSXJyZWR1Y2libGVNYXNzKCYqTCwgTC5iYXNlKCkpOworICAgIEwgPSBzdGQ6OnByZXYoTmV4dCk7CisgICAgaWYgKGNvbXB1dGVNYXNzSW5Mb29wKCpMKSkKKyAgICAgIGNvbnRpbnVlOworICAgIGxsdm1fdW5yZWFjaGFibGUoInVuaGFuZGxlZCBpcnJlZHVjaWJsZSBjb250cm9sIGZsb3ciKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQlQ+Citib29sIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGw8QlQ+Ojpjb21wdXRlTWFzc0luTG9vcChMb29wRGF0YSAmTG9vcCkgeworICAvLyBDb21wdXRlIG1hc3MgaW4gbG9vcC4KKyAgREVCVUcoZGJncygpIDw8ICJjb21wdXRlLW1hc3MtaW4tbG9vcDogIiA8PCBnZXRMb29wTmFtZShMb29wKSA8PCAiXG4iKTsKKworICBpZiAoTG9vcC5pc0lycmVkdWNpYmxlKCkpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgImlzSXJyZWR1Y2libGUgPSB0cnVlXG4iKTsKKyAgICBEaXN0cmlidXRpb24gRGlzdDsKKyAgICB1bnNpZ25lZCBOdW1IZWFkZXJzV2l0aFdlaWdodCA9IDA7CisgICAgT3B0aW9uYWw8dWludDY0X3Q+IE1pbkhlYWRlcldlaWdodDsKKyAgICBEZW5zZVNldDx1aW50MzJfdD4gSGVhZGVyc1dpdGhvdXRXZWlnaHQ7CisgICAgSGVhZGVyc1dpdGhvdXRXZWlnaHQucmVzZXJ2ZShMb29wLk51bUhlYWRlcnMpOworICAgIGZvciAodWludDMyX3QgSCA9IDA7IEggPCBMb29wLk51bUhlYWRlcnM7ICsrSCkgeworICAgICAgYXV0byAmSGVhZGVyTm9kZSA9IExvb3AuTm9kZXNbSF07CisgICAgICBjb25zdCBCbG9ja1QgKkJsb2NrID0gZ2V0QmxvY2soSGVhZGVyTm9kZSk7CisgICAgICBJc0lyckxvb3BIZWFkZXIuc2V0KExvb3AuTm9kZXNbSF0uSW5kZXgpOworICAgICAgT3B0aW9uYWw8dWludDY0X3Q+IEhlYWRlcldlaWdodCA9IEJsb2NrLT5nZXRJcnJMb29wSGVhZGVyV2VpZ2h0KCk7CisgICAgICBpZiAoIUhlYWRlcldlaWdodCkgeworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIk1pc3NpbmcgaXJyIGxvb3AgaGVhZGVyIG1ldGFkYXRhIG9uICIKKyAgICAgICAgICAgICAgPDwgZ2V0QmxvY2tOYW1lKEhlYWRlck5vZGUpIDw8ICJcbiIpOworICAgICAgICBIZWFkZXJzV2l0aG91dFdlaWdodC5pbnNlcnQoSCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgREVCVUcoZGJncygpIDw8IGdldEJsb2NrTmFtZShIZWFkZXJOb2RlKQorICAgICAgICAgICAgPDwgIiBoYXMgaXJyIGxvb3AgaGVhZGVyIHdlaWdodCAiIDw8IEhlYWRlcldlaWdodC5nZXRWYWx1ZSgpCisgICAgICAgICAgICA8PCAiXG4iKTsKKyAgICAgIE51bUhlYWRlcnNXaXRoV2VpZ2h0Kys7CisgICAgICB1aW50NjRfdCBIZWFkZXJXZWlnaHRWYWx1ZSA9IEhlYWRlcldlaWdodC5nZXRWYWx1ZSgpOworICAgICAgaWYgKCFNaW5IZWFkZXJXZWlnaHQgfHwgSGVhZGVyV2VpZ2h0VmFsdWUgPCBNaW5IZWFkZXJXZWlnaHQpCisgICAgICAgIE1pbkhlYWRlcldlaWdodCA9IEhlYWRlcldlaWdodFZhbHVlOworICAgICAgaWYgKEhlYWRlcldlaWdodFZhbHVlKSB7CisgICAgICAgIERpc3QuYWRkTG9jYWwoSGVhZGVyTm9kZSwgSGVhZGVyV2VpZ2h0VmFsdWUpOworICAgICAgfQorICAgIH0KKyAgICAvLyBBcyBhIGhldXJpc3RpYywgaWYgc29tZSBoZWFkZXJzIGRvbid0IGhhdmUgYSB3ZWlnaHQsIGdpdmUgdGhlbSB0aGUKKyAgICAvLyBtaW5pbWl1bSB3ZWlnaHQgc2VlbiAobm90IHRvIGRpc3J1cHQgdGhlIGV4aXN0aW5nIHRyZW5kcyB0b28gbXVjaCBieQorICAgIC8vIHVzaW5nIGEgd2VpZ2h0IHRoYXQncyBpbiB0aGUgZ2VuZXJhbCByYW5nZSBvZiB0aGUgb3RoZXIgaGVhZGVycycgd2VpZ2h0cywKKyAgICAvLyBhbmQgdGhlIG1pbmltdW0gc2VlbXMgdG8gcGVyZm9ybSBiZXR0ZXIgdGhhbiB0aGUgYXZlcmFnZS4pCisgICAgLy8gRklYTUU6IGJldHRlciB1cGRhdGUgaW4gdGhlIHBhc3NlcyB0aGF0IGRyb3AgdGhlIGhlYWRlciB3ZWlnaHQuCisgICAgLy8gSWYgbm8gaGVhZGVycyBoYXZlIGEgd2VpZ2h0LCBnaXZlIHRoZW0gZXZlbiB3ZWlnaHQgKHVzZSB3ZWlnaHQgMSkuCisgICAgaWYgKCFNaW5IZWFkZXJXZWlnaHQpCisgICAgICBNaW5IZWFkZXJXZWlnaHQgPSAxOworICAgIGZvciAodWludDMyX3QgSCA6IEhlYWRlcnNXaXRob3V0V2VpZ2h0KSB7CisgICAgICBhdXRvICZIZWFkZXJOb2RlID0gTG9vcC5Ob2Rlc1tIXTsKKyAgICAgIGFzc2VydCghZ2V0QmxvY2soSGVhZGVyTm9kZSktPmdldElyckxvb3BIZWFkZXJXZWlnaHQoKSAmJgorICAgICAgICAgICAgICJTaG91bGRuJ3QgaGF2ZSBhIHdlaWdodCBtZXRhZGF0YSIpOworICAgICAgdWludDY0X3QgTWluV2VpZ2h0ID0gTWluSGVhZGVyV2VpZ2h0LmdldFZhbHVlKCk7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIkdpdmluZyB3ZWlnaHQgIiA8PCBNaW5XZWlnaHQKKyAgICAgICAgICAgIDw8ICIgdG8gIiA8PCBnZXRCbG9ja05hbWUoSGVhZGVyTm9kZSkgPDwgIlxuIik7CisgICAgICBpZiAoTWluV2VpZ2h0KQorICAgICAgICBEaXN0LmFkZExvY2FsKEhlYWRlck5vZGUsIE1pbldlaWdodCk7CisgICAgfQorICAgIGRpc3RyaWJ1dGVJcnJMb29wSGVhZGVyTWFzcyhEaXN0KTsKKyAgICBmb3IgKGNvbnN0IEJsb2NrTm9kZSAmTSA6IExvb3AuTm9kZXMpCisgICAgICBpZiAoIXByb3BhZ2F0ZU1hc3NUb1N1Y2Nlc3NvcnMoJkxvb3AsIE0pKQorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJ1bmhhbmRsZWQgaXJyZWR1Y2libGUgY29udHJvbCBmbG93Iik7CisgICAgaWYgKE51bUhlYWRlcnNXaXRoV2VpZ2h0ID09IDApCisgICAgICAvLyBObyBoZWFkZXJzIGhhdmUgYSBtZXRhZGF0YS4gQWRqdXN0IGhlYWRlciBtYXNzLgorICAgICAgYWRqdXN0TG9vcEhlYWRlck1hc3MoTG9vcCk7CisgIH0gZWxzZSB7CisgICAgV29ya2luZ1tMb29wLmdldEhlYWRlcigpLkluZGV4XS5nZXRNYXNzKCkgPSBCbG9ja01hc3M6OmdldEZ1bGwoKTsKKyAgICBpZiAoIXByb3BhZ2F0ZU1hc3NUb1N1Y2Nlc3NvcnMoJkxvb3AsIExvb3AuZ2V0SGVhZGVyKCkpKQorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiaXJyZWR1Y2libGUgY29udHJvbCBmbG93IHRvIGxvb3AgaGVhZGVyIT8iKTsKKyAgICBmb3IgKGNvbnN0IEJsb2NrTm9kZSAmTSA6IExvb3AubWVtYmVycygpKQorICAgICAgaWYgKCFwcm9wYWdhdGVNYXNzVG9TdWNjZXNzb3JzKCZMb29wLCBNKSkKKyAgICAgICAgLy8gSXJyZWR1Y2libGUgYmFja2VkZ2UuCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNvbXB1dGVMb29wU2NhbGUoTG9vcCk7CisgIHBhY2thZ2VMb29wKExvb3ApOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJUPgorYm9vbCBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsPEJUPjo6dHJ5VG9Db21wdXRlTWFzc0luRnVuY3Rpb24oKSB7CisgIC8vIENvbXB1dGUgbWFzcyBpbiBmdW5jdGlvbi4KKyAgREVCVUcoZGJncygpIDw8ICJjb21wdXRlLW1hc3MtaW4tZnVuY3Rpb25cbiIpOworICBhc3NlcnQoIVdvcmtpbmcuZW1wdHkoKSAmJiAibm8gYmxvY2tzIGluIGZ1bmN0aW9uIik7CisgIGFzc2VydCghV29ya2luZ1swXS5pc0xvb3BIZWFkZXIoKSAmJiAiZW50cnkgYmxvY2sgaXMgYSBsb29wIGhlYWRlciIpOworCisgIFdvcmtpbmdbMF0uZ2V0TWFzcygpID0gQmxvY2tNYXNzOjpnZXRGdWxsKCk7CisgIGZvciAocnBvdF9pdGVyYXRvciBJID0gcnBvdF9iZWdpbigpLCBJRSA9IHJwb3RfZW5kKCk7IEkgIT0gSUU7ICsrSSkgeworICAgIC8vIENoZWNrIGZvciBub2RlcyB0aGF0IGhhdmUgYmVlbiBwYWNrYWdlZC4KKyAgICBCbG9ja05vZGUgTm9kZSA9IGdldE5vZGUoSSk7CisgICAgaWYgKFdvcmtpbmdbTm9kZS5JbmRleF0uaXNQYWNrYWdlZCgpKQorICAgICAgY29udGludWU7CisKKyAgICBpZiAoIXByb3BhZ2F0ZU1hc3NUb1N1Y2Nlc3NvcnMobnVsbHB0ciwgTm9kZSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBCVD4gdm9pZCBCbG9ja0ZyZXF1ZW5jeUluZm9JbXBsPEJUPjo6Y29tcHV0ZU1hc3NJbkZ1bmN0aW9uKCkgeworICBpZiAodHJ5VG9Db21wdXRlTWFzc0luRnVuY3Rpb24oKSkKKyAgICByZXR1cm47CisgIGNvbXB1dGVJcnJlZHVjaWJsZU1hc3MobnVsbHB0ciwgTG9vcHMuYmVnaW4oKSk7CisgIGlmICh0cnlUb0NvbXB1dGVNYXNzSW5GdW5jdGlvbigpKQorICAgIHJldHVybjsKKyAgbGx2bV91bnJlYWNoYWJsZSgidW5oYW5kbGVkIGlycmVkdWNpYmxlIGNvbnRyb2wgZmxvdyIpOworfQorCisvLy8gXG5vdGUgVGhpcyBzaG91bGQgYmUgYSBsYW1iZGEsIGJ1dCB0aGF0IGNyYXNoZXMgR0NDIDQuNy4KK25hbWVzcGFjZSBiZmlfZGV0YWlsIHsKKwordGVtcGxhdGUgPGNsYXNzIEJUPiBzdHJ1Y3QgQmxvY2tFZGdlc0FkZGVyIHsKKyAgdXNpbmcgQmxvY2tUID0gQlQ7CisgIHVzaW5nIExvb3BEYXRhID0gQmxvY2tGcmVxdWVuY3lJbmZvSW1wbEJhc2U6Okxvb3BEYXRhOworICB1c2luZyBTdWNjZXNzb3IgPSBHcmFwaFRyYWl0czxjb25zdCBCbG9ja1QgKj47CisKKyAgY29uc3QgQmxvY2tGcmVxdWVuY3lJbmZvSW1wbDxCVD4gJkJGSTsKKworICBleHBsaWNpdCBCbG9ja0VkZ2VzQWRkZXIoY29uc3QgQmxvY2tGcmVxdWVuY3lJbmZvSW1wbDxCVD4gJkJGSSkKKyAgICAgIDogQkZJKEJGSSkge30KKworICB2b2lkIG9wZXJhdG9yKCkoSXJyZWR1Y2libGVHcmFwaCAmRywgSXJyZWR1Y2libGVHcmFwaDo6SXJyTm9kZSAmSXJyLAorICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcERhdGEgKk91dGVyTG9vcCkgeworICAgIGNvbnN0IEJsb2NrVCAqQkIgPSBCRkkuUlBPVFtJcnIuTm9kZS5JbmRleF07CisgICAgZm9yIChjb25zdCBhdXRvIFN1Y2MgOiBjaGlsZHJlbjxjb25zdCBCbG9ja1QgKj4oQkIpKQorICAgICAgRy5hZGRFZGdlKElyciwgQkZJLmdldE5vZGUoU3VjYyksIE91dGVyTG9vcCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBiZmlfZGV0YWlsCisKK3RlbXBsYXRlIDxjbGFzcyBCVD4KK3ZvaWQgQmxvY2tGcmVxdWVuY3lJbmZvSW1wbDxCVD46OmNvbXB1dGVJcnJlZHVjaWJsZU1hc3MoCisgICAgTG9vcERhdGEgKk91dGVyTG9vcCwgc3RkOjpsaXN0PExvb3BEYXRhPjo6aXRlcmF0b3IgSW5zZXJ0KSB7CisgIERFQlVHKGRiZ3MoKSA8PCAiYW5hbHl6ZS1pcnJlZHVjaWJsZS1pbi0iOworICAgICAgICBpZiAoT3V0ZXJMb29wKSBkYmdzKCkgPDwgImxvb3A6ICIgPDwgZ2V0TG9vcE5hbWUoKk91dGVyTG9vcCkgPDwgIlxuIjsKKyAgICAgICAgZWxzZSBkYmdzKCkgPDwgImZ1bmN0aW9uXG4iKTsKKworICB1c2luZyBuYW1lc3BhY2UgYmZpX2RldGFpbDsKKworICAvLyBJZGVhbGx5LCBhZGRCbG9ja0VkZ2VzKCkgd291bGQgYmUgZGVjbGFyZWQgaGVyZSBhcyBhIGxhbWJkYSwgYnV0IHRoYXQKKyAgLy8gY3Jhc2hlcyBHQ0MgNC43LgorICBCbG9ja0VkZ2VzQWRkZXI8QlQ+IGFkZEJsb2NrRWRnZXMoKnRoaXMpOworICBJcnJlZHVjaWJsZUdyYXBoIEcoKnRoaXMsIE91dGVyTG9vcCwgYWRkQmxvY2tFZGdlcyk7CisKKyAgZm9yIChhdXRvICZMIDogYW5hbHl6ZUlycmVkdWNpYmxlKEcsIE91dGVyTG9vcCwgSW5zZXJ0KSkKKyAgICBjb21wdXRlTWFzc0luTG9vcChMKTsKKworICBpZiAoIU91dGVyTG9vcCkKKyAgICByZXR1cm47CisgIHVwZGF0ZUxvb3BXaXRoSXJyZWR1Y2libGUoKk91dGVyTG9vcCk7Cit9CisKKy8vIEEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgY29udmVydHMgYSBicmFuY2ggcHJvYmFiaWxpdHkgaW50byB3ZWlnaHQuCitpbmxpbmUgdWludDMyX3QgZ2V0V2VpZ2h0RnJvbUJyYW5jaFByb2IoY29uc3QgQnJhbmNoUHJvYmFiaWxpdHkgUHJvYikgeworICByZXR1cm4gUHJvYi5nZXROdW1lcmF0b3IoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJUPgorYm9vbAorQmxvY2tGcmVxdWVuY3lJbmZvSW1wbDxCVD46OnByb3BhZ2F0ZU1hc3NUb1N1Y2Nlc3NvcnMoTG9vcERhdGEgKk91dGVyTG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJsb2NrTm9kZSAmTm9kZSkgeworICBERUJVRyhkYmdzKCkgPDwgIiAtIG5vZGU6ICIgPDwgZ2V0QmxvY2tOYW1lKE5vZGUpIDw8ICJcbiIpOworICAvLyBDYWxjdWxhdGUgcHJvYmFiaWxpdHkgZm9yIHN1Y2Nlc3NvcnMuCisgIERpc3RyaWJ1dGlvbiBEaXN0OworICBpZiAoYXV0byAqTG9vcCA9IFdvcmtpbmdbTm9kZS5JbmRleF0uZ2V0UGFja2FnZWRMb29wKCkpIHsKKyAgICBhc3NlcnQoTG9vcCAhPSBPdXRlckxvb3AgJiYgIkNhbm5vdCBwcm9wYWdhdGUgbWFzcyBpbiBhIHBhY2thZ2VkIGxvb3AiKTsKKyAgICBpZiAoIWFkZExvb3BTdWNjZXNzb3JzVG9EaXN0KE91dGVyTG9vcCwgKkxvb3AsIERpc3QpKQorICAgICAgLy8gSXJyZWR1Y2libGUgYmFja2VkZ2UuCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgY29uc3QgQmxvY2tUICpCQiA9IGdldEJsb2NrKE5vZGUpOworICAgIGZvciAoYXV0byBTSSA9IEdyYXBoVHJhaXRzPGNvbnN0IEJsb2NrVCAqPjo6Y2hpbGRfYmVnaW4oQkIpLAorICAgICAgICAgICAgICBTRSA9IEdyYXBoVHJhaXRzPGNvbnN0IEJsb2NrVCAqPjo6Y2hpbGRfZW5kKEJCKTsKKyAgICAgICAgIFNJICE9IFNFOyArK1NJKQorICAgICAgaWYgKCFhZGRUb0Rpc3QoCisgICAgICAgICAgICAgIERpc3QsIE91dGVyTG9vcCwgTm9kZSwgZ2V0Tm9kZSgqU0kpLAorICAgICAgICAgICAgICBnZXRXZWlnaHRGcm9tQnJhbmNoUHJvYihCUEktPmdldEVkZ2VQcm9iYWJpbGl0eShCQiwgU0kpKSkpCisgICAgICAgIC8vIElycmVkdWNpYmxlIGJhY2tlZGdlLgorICAgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBEaXN0cmlidXRlIG1hc3MgdG8gc3VjY2Vzc29ycywgc2F2aW5nIGV4aXQgYW5kIGJhY2tlZGdlIGRhdGEgaW4gdGhlCisgIC8vIGxvb3AgaGVhZGVyLgorICBkaXN0cmlidXRlTWFzcyhOb2RlLCBPdXRlckxvb3AsIERpc3QpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJUPgorcmF3X29zdHJlYW0gJkJsb2NrRnJlcXVlbmN5SW5mb0ltcGw8QlQ+OjpwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgaWYgKCFGKQorICAgIHJldHVybiBPUzsKKyAgT1MgPDwgImJsb2NrLWZyZXF1ZW5jeS1pbmZvOiAiIDw8IEYtPmdldE5hbWUoKSA8PCAiXG4iOworICBmb3IgKGNvbnN0IEJsb2NrVCAmQkIgOiAqRikgeworICAgIE9TIDw8ICIgLSAiIDw8IGJmaV9kZXRhaWw6OmdldEJsb2NrTmFtZSgmQkIpIDw8ICI6IGZsb2F0ID0gIjsKKyAgICBnZXRGbG9hdGluZ0Jsb2NrRnJlcSgmQkIpLnByaW50KE9TLCA1KQorICAgICAgICA8PCAiLCBpbnQgPSAiIDw8IGdldEJsb2NrRnJlcSgmQkIpLmdldEZyZXF1ZW5jeSgpOworICAgIGlmIChPcHRpb25hbDx1aW50NjRfdD4gUHJvZmlsZUNvdW50ID0KKyAgICAgICAgQmxvY2tGcmVxdWVuY3lJbmZvSW1wbEJhc2U6OmdldEJsb2NrUHJvZmlsZUNvdW50KAorICAgICAgICAgICAgRi0+Z2V0RnVuY3Rpb24oKSwgZ2V0Tm9kZSgmQkIpKSkKKyAgICAgIE9TIDw8ICIsIGNvdW50ID0gIiA8PCBQcm9maWxlQ291bnQuZ2V0VmFsdWUoKTsKKyAgICBpZiAoT3B0aW9uYWw8dWludDY0X3Q+IElyckxvb3BIZWFkZXJXZWlnaHQgPQorICAgICAgICBCQi5nZXRJcnJMb29wSGVhZGVyV2VpZ2h0KCkpCisgICAgICBPUyA8PCAiLCBpcnJfbG9vcF9oZWFkZXJfd2VpZ2h0ID0gIiA8PCBJcnJMb29wSGVhZGVyV2VpZ2h0LmdldFZhbHVlKCk7CisgICAgT1MgPDwgIlxuIjsKKyAgfQorCisgIC8vIEFkZCBhbiBleHRyYSBuZXdsaW5lIGZvciByZWFkYWJpbGl0eS4KKyAgT1MgPDwgIlxuIjsKKyAgcmV0dXJuIE9TOworfQorCisvLyBHcmFwaCB0cmFpdCBiYXNlIGNsYXNzIGZvciBibG9jayBmcmVxdWVuY3kgaW5mb3JtYXRpb24gZ3JhcGgKKy8vIHZpZXdlci4KKworZW51bSBHVkRBR1R5cGUgeyBHVkRUX05vbmUsIEdWRFRfRnJhY3Rpb24sIEdWRFRfSW50ZWdlciwgR1ZEVF9Db3VudCB9OworCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tGcmVxdWVuY3lJbmZvVCwgY2xhc3MgQnJhbmNoUHJvYmFiaWxpdHlJbmZvVD4KK3N0cnVjdCBCRklET1RHcmFwaFRyYWl0c0Jhc2UgOiBwdWJsaWMgRGVmYXVsdERPVEdyYXBoVHJhaXRzIHsKKyAgdXNpbmcgR1RyYWl0cyA9IEdyYXBoVHJhaXRzPEJsb2NrRnJlcXVlbmN5SW5mb1QgKj47CisgIHVzaW5nIE5vZGVSZWYgPSB0eXBlbmFtZSBHVHJhaXRzOjpOb2RlUmVmOworICB1c2luZyBFZGdlSXRlciA9IHR5cGVuYW1lIEdUcmFpdHM6OkNoaWxkSXRlcmF0b3JUeXBlOworICB1c2luZyBOb2RlSXRlciA9IHR5cGVuYW1lIEdUcmFpdHM6Om5vZGVzX2l0ZXJhdG9yOworCisgIHVpbnQ2NF90IE1heEZyZXF1ZW5jeSA9IDA7CisKKyAgZXhwbGljaXQgQkZJRE9UR3JhcGhUcmFpdHNCYXNlKGJvb2wgaXNTaW1wbGUgPSBmYWxzZSkKKyAgICAgIDogRGVmYXVsdERPVEdyYXBoVHJhaXRzKGlzU2ltcGxlKSB7fQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRHcmFwaE5hbWUoY29uc3QgQmxvY2tGcmVxdWVuY3lJbmZvVCAqRykgeworICAgIHJldHVybiBHLT5nZXRGdW5jdGlvbigpLT5nZXROYW1lKCk7CisgIH0KKworICBzdGQ6OnN0cmluZyBnZXROb2RlQXR0cmlidXRlcyhOb2RlUmVmIE5vZGUsIGNvbnN0IEJsb2NrRnJlcXVlbmN5SW5mb1QgKkdyYXBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBIb3RQZXJjZW50VGhyZXNob2xkID0gMCkgeworICAgIHN0ZDo6c3RyaW5nIFJlc3VsdDsKKyAgICBpZiAoIUhvdFBlcmNlbnRUaHJlc2hvbGQpCisgICAgICByZXR1cm4gUmVzdWx0OworCisgICAgLy8gQ29tcHV0ZSBNYXhGcmVxdWVuY3kgb24gdGhlIGZseToKKyAgICBpZiAoIU1heEZyZXF1ZW5jeSkgeworICAgICAgZm9yIChOb2RlSXRlciBJID0gR1RyYWl0czo6bm9kZXNfYmVnaW4oR3JhcGgpLAorICAgICAgICAgICAgICAgICAgICBFID0gR1RyYWl0czo6bm9kZXNfZW5kKEdyYXBoKTsKKyAgICAgICAgICAgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgTm9kZVJlZiBOID0gKkk7CisgICAgICAgIE1heEZyZXF1ZW5jeSA9CisgICAgICAgICAgICBzdGQ6Om1heChNYXhGcmVxdWVuY3ksIEdyYXBoLT5nZXRCbG9ja0ZyZXEoTikuZ2V0RnJlcXVlbmN5KCkpOworICAgICAgfQorICAgIH0KKyAgICBCbG9ja0ZyZXF1ZW5jeSBGcmVxID0gR3JhcGgtPmdldEJsb2NrRnJlcShOb2RlKTsKKyAgICBCbG9ja0ZyZXF1ZW5jeSBIb3RGcmVxID0KKyAgICAgICAgKEJsb2NrRnJlcXVlbmN5KE1heEZyZXF1ZW5jeSkgKgorICAgICAgICAgQnJhbmNoUHJvYmFiaWxpdHk6OmdldEJyYW5jaFByb2JhYmlsaXR5KEhvdFBlcmNlbnRUaHJlc2hvbGQsIDEwMCkpOworCisgICAgaWYgKEZyZXEgPCBIb3RGcmVxKQorICAgICAgcmV0dXJuIFJlc3VsdDsKKworICAgIHJhd19zdHJpbmdfb3N0cmVhbSBPUyhSZXN1bHQpOworICAgIE9TIDw8ICJjb2xvcj1cInJlZFwiIjsKKyAgICBPUy5mbHVzaCgpOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICBzdGQ6OnN0cmluZyBnZXROb2RlTGFiZWwoTm9kZVJlZiBOb2RlLCBjb25zdCBCbG9ja0ZyZXF1ZW5jeUluZm9UICpHcmFwaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdWREFHVHlwZSBHVHlwZSwgaW50IGxheW91dF9vcmRlciA9IC0xKSB7CisgICAgc3RkOjpzdHJpbmcgUmVzdWx0OworICAgIHJhd19zdHJpbmdfb3N0cmVhbSBPUyhSZXN1bHQpOworCisgICAgaWYgKGxheW91dF9vcmRlciAhPSAtMSkKKyAgICAgIE9TIDw8IE5vZGUtPmdldE5hbWUoKSA8PCAiWyIgPDwgbGF5b3V0X29yZGVyIDw8ICJdIDogIjsKKyAgICBlbHNlCisgICAgICBPUyA8PCBOb2RlLT5nZXROYW1lKCkgPDwgIiA6ICI7CisgICAgc3dpdGNoIChHVHlwZSkgeworICAgIGNhc2UgR1ZEVF9GcmFjdGlvbjoKKyAgICAgIEdyYXBoLT5wcmludEJsb2NrRnJlcShPUywgTm9kZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdWRFRfSW50ZWdlcjoKKyAgICAgIE9TIDw8IEdyYXBoLT5nZXRCbG9ja0ZyZXEoTm9kZSkuZ2V0RnJlcXVlbmN5KCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEdWRFRfQ291bnQ6IHsKKyAgICAgIGF1dG8gQ291bnQgPSBHcmFwaC0+Z2V0QmxvY2tQcm9maWxlQ291bnQoTm9kZSk7CisgICAgICBpZiAoQ291bnQpCisgICAgICAgIE9TIDw8IENvdW50LmdldFZhbHVlKCk7CisgICAgICBlbHNlCisgICAgICAgIE9TIDw8ICJVbmtub3duIjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdWRFRfTm9uZToKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIklmIHdlIGFyZSBub3Qgc3VwcG9zZWQgdG8gcmVuZGVyIGEgZ3JhcGggd2Ugc2hvdWxkICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm5ldmVyIHJlYWNoIHRoaXMgcG9pbnQuIik7CisgICAgfQorICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICBzdGQ6OnN0cmluZyBnZXRFZGdlQXR0cmlidXRlcyhOb2RlUmVmIE5vZGUsIEVkZ2VJdGVyIEVJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCbG9ja0ZyZXF1ZW5jeUluZm9UICpCRkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJyYW5jaFByb2JhYmlsaXR5SW5mb1QgKkJQSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSG90UGVyY2VudFRocmVzaG9sZCA9IDApIHsKKyAgICBzdGQ6OnN0cmluZyBTdHI7CisgICAgaWYgKCFCUEkpCisgICAgICByZXR1cm4gU3RyOworCisgICAgQnJhbmNoUHJvYmFiaWxpdHkgQlAgPSBCUEktPmdldEVkZ2VQcm9iYWJpbGl0eShOb2RlLCBFSSk7CisgICAgdWludDMyX3QgTiA9IEJQLmdldE51bWVyYXRvcigpOworICAgIHVpbnQzMl90IEQgPSBCUC5nZXREZW5vbWluYXRvcigpOworICAgIGRvdWJsZSBQZXJjZW50ID0gMTAwLjAgKiBOIC8gRDsKKyAgICByYXdfc3RyaW5nX29zdHJlYW0gT1MoU3RyKTsKKyAgICBPUyA8PCBmb3JtYXQoImxhYmVsPVwiJS4xZiUlXCIiLCBQZXJjZW50KTsKKworICAgIGlmIChIb3RQZXJjZW50VGhyZXNob2xkKSB7CisgICAgICBCbG9ja0ZyZXF1ZW5jeSBFRnJlcSA9IEJGSS0+Z2V0QmxvY2tGcmVxKE5vZGUpICogQlA7CisgICAgICBCbG9ja0ZyZXF1ZW5jeSBIb3RGcmVxID0gQmxvY2tGcmVxdWVuY3koTWF4RnJlcXVlbmN5KSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnJhbmNoUHJvYmFiaWxpdHkoSG90UGVyY2VudFRocmVzaG9sZCwgMTAwKTsKKworICAgICAgaWYgKEVGcmVxID49IEhvdEZyZXEpIHsKKyAgICAgICAgT1MgPDwgIixjb2xvcj1cInJlZFwiIjsKKyAgICAgIH0KKyAgICB9CisKKyAgICBPUy5mbHVzaCgpOworICAgIHJldHVybiBTdHI7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyN1bmRlZiBERUJVR19UWVBFCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX0JMT0NLRlJFUVVFTkNZSU5GT0lNUExfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9CcmFuY2hQcm9iYWJpbGl0eUluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQnJhbmNoUHJvYmFiaWxpdHlJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3YjY0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQnJhbmNoUHJvYmFiaWxpdHlJbmZvLmgKQEAgLTAsMCArMSwyNTMgQEAKKy8vPT09LSBCcmFuY2hQcm9iYWJpbGl0eUluZm8uaCAtIEJyYW5jaCBQcm9iYWJpbGl0eSBBbmFseXNpcyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIGlzIHVzZWQgdG8gZXZhbHVhdGUgYnJhbmNoIHByb2JhYmlsdGllcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfQlJBTkNIUFJPQkFCSUxJVFlJTkZPX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19CUkFOQ0hQUk9CQUJJTElUWUlORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DRkcuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZUhhbmRsZS5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CcmFuY2hQcm9iYWJpbGl0eS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgTG9vcEluZm87CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworY2xhc3MgVmFsdWU7CisKKy8vLyBcYnJpZWYgQW5hbHlzaXMgcHJvdmlkaW5nIGJyYW5jaCBwcm9iYWJpbGl0eSBpbmZvcm1hdGlvbi4KKy8vLworLy8vIFRoaXMgaXMgYSBmdW5jdGlvbiBhbmFseXNpcyB3aGljaCBwcm92aWRlcyBpbmZvcm1hdGlvbiBvbiB0aGUgcmVsYXRpdmUKKy8vLyBwcm9iYWJpbGl0aWVzIG9mIGVhY2ggImVkZ2UiIGluIHRoZSBmdW5jdGlvbidzIENGRyB3aGVyZSBzdWNoIGFuIGVkZ2UgaXMKKy8vLyBkZWZpbmVkIGJ5IGEgcGFpciAoUHJlZEJsb2NrIGFuZCBhbiBpbmRleCBpbiB0aGUgc3VjY2Vzc29ycykuIFRoZQorLy8vIHByb2JhYmlsaXR5IG9mIGFuIGVkZ2UgZnJvbSBvbmUgYmxvY2sgaXMgYWx3YXlzIHJlbGF0aXZlIHRvIHRoZQorLy8vIHByb2JhYmlsaXRpZXMgb2Ygb3RoZXIgZWRnZXMgZnJvbSB0aGUgYmxvY2suIFRoZSBwcm9iYWJpbGl0ZXMgb2YgYWxsIGVkZ2VzCisvLy8gZnJvbSBhIGJsb2NrIHN1bSB0byBleGFjdGx5IG9uZSAoMTAwJSkuCisvLy8gV2UgdXNlIGEgcGFpciAoUHJlZEJsb2NrIGFuZCBhbiBpbmRleCBpbiB0aGUgc3VjY2Vzc29ycykgdG8gdW5pcXVlbHkKKy8vLyBpZGVudGlmeSBhbiBlZGdlLCBzaW5jZSB3ZSBjYW4gaGF2ZSBtdWx0aXBsZSBlZGdlcyBmcm9tIFNyYyB0byBEc3QuCisvLy8gQXMgYW4gZXhhbXBsZSwgd2UgY2FuIGhhdmUgYSBzd2l0Y2ggd2hpY2gganVtcHMgdG8gRHN0IHdpdGggdmFsdWUgMCBhbmQKKy8vLyB2YWx1ZSAxMC4KK2NsYXNzIEJyYW5jaFByb2JhYmlsaXR5SW5mbyB7CitwdWJsaWM6CisgIEJyYW5jaFByb2JhYmlsaXR5SW5mbygpID0gZGVmYXVsdDsKKworICBCcmFuY2hQcm9iYWJpbGl0eUluZm8oY29uc3QgRnVuY3Rpb24gJkYsIGNvbnN0IExvb3BJbmZvICZMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkgPSBudWxscHRyKSB7CisgICAgY2FsY3VsYXRlKEYsIExJLCBUTEkpOworICB9CisKKyAgQnJhbmNoUHJvYmFiaWxpdHlJbmZvKEJyYW5jaFByb2JhYmlsaXR5SW5mbyAmJkFyZykKKyAgICAgIDogUHJvYnMoc3RkOjptb3ZlKEFyZy5Qcm9icykpLCBMYXN0RihBcmcuTGFzdEYpLAorICAgICAgICBQb3N0RG9taW5hdGVkQnlVbnJlYWNoYWJsZShzdGQ6Om1vdmUoQXJnLlBvc3REb21pbmF0ZWRCeVVucmVhY2hhYmxlKSksCisgICAgICAgIFBvc3REb21pbmF0ZWRCeUNvbGRDYWxsKHN0ZDo6bW92ZShBcmcuUG9zdERvbWluYXRlZEJ5Q29sZENhbGwpKSB7fQorCisgIEJyYW5jaFByb2JhYmlsaXR5SW5mbyhjb25zdCBCcmFuY2hQcm9iYWJpbGl0eUluZm8gJikgPSBkZWxldGU7CisgIEJyYW5jaFByb2JhYmlsaXR5SW5mbyAmb3BlcmF0b3I9KGNvbnN0IEJyYW5jaFByb2JhYmlsaXR5SW5mbyAmKSA9IGRlbGV0ZTsKKworICBCcmFuY2hQcm9iYWJpbGl0eUluZm8gJm9wZXJhdG9yPShCcmFuY2hQcm9iYWJpbGl0eUluZm8gJiZSSFMpIHsKKyAgICByZWxlYXNlTWVtb3J5KCk7CisgICAgUHJvYnMgPSBzdGQ6Om1vdmUoUkhTLlByb2JzKTsKKyAgICBQb3N0RG9taW5hdGVkQnlDb2xkQ2FsbCA9IHN0ZDo6bW92ZShSSFMuUG9zdERvbWluYXRlZEJ5Q29sZENhbGwpOworICAgIFBvc3REb21pbmF0ZWRCeVVucmVhY2hhYmxlID0gc3RkOjptb3ZlKFJIUy5Qb3N0RG9taW5hdGVkQnlVbnJlYWNoYWJsZSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCk7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IGFuIGVkZ2UncyBwcm9iYWJpbGl0eSwgcmVsYXRpdmUgdG8gb3RoZXIgb3V0LWVkZ2VzIG9mIHRoZSBTcmMuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgZnJhY3Rpb25hbCBwcm9iYWJpbGl0eSBiZXR3ZWVuIHplcm8KKyAgLy8vICgwJSkgYW5kIG9uZSAoMTAwJSkgb2YgdGhpcyBlZGdlIGV4ZWN1dGluZywgcmVsYXRpdmUgdG8gb3RoZXIgZWRnZXMKKyAgLy8vIGxlYXZpbmcgdGhlICdTcmMnIGJsb2NrLiBUaGUgcmV0dXJuZWQgcHJvYmFiaWxpdHkgaXMgbmV2ZXIgemVybywgYW5kIGNhbgorICAvLy8gb25seSBiZSBvbmUgaWYgdGhlIHNvdXJjZSBibG9jayBoYXMgb25seSBvbmUgc3VjY2Vzc29yLgorICBCcmFuY2hQcm9iYWJpbGl0eSBnZXRFZGdlUHJvYmFiaWxpdHkoY29uc3QgQmFzaWNCbG9jayAqU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZXhJblN1Y2Nlc3NvcnMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBwcm9iYWJpbGl0eSBvZiBnb2luZyBmcm9tIFNyYyB0byBEc3QuCisgIC8vLworICAvLy8gSXQgcmV0dXJucyB0aGUgc3VtIG9mIGFsbCBwcm9iYWJpbGl0aWVzIGZvciBlZGdlcyBmcm9tIFNyYyB0byBEc3QuCisgIEJyYW5jaFByb2JhYmlsaXR5IGdldEVkZ2VQcm9iYWJpbGl0eShjb25zdCBCYXNpY0Jsb2NrICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYXNpY0Jsb2NrICpEc3QpIGNvbnN0OworCisgIEJyYW5jaFByb2JhYmlsaXR5IGdldEVkZ2VQcm9iYWJpbGl0eShjb25zdCBCYXNpY0Jsb2NrICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWNjX2NvbnN0X2l0ZXJhdG9yIERzdCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUZXN0IGlmIGFuIGVkZ2UgaXMgaG90IHJlbGF0aXZlIHRvIG90aGVyIG91dC1lZGdlcyBvZiB0aGUgU3JjLgorICAvLy8KKyAgLy8vIENoZWNrIHdoZXRoZXIgdGhpcyBlZGdlIG91dCBvZiB0aGUgc291cmNlIGJsb2NrIGlzICdob3QnLiBXZSBkZWZpbmUgaG90CisgIC8vLyBhcyBoYXZpbmcgYSByZWxhdGl2ZSBwcm9iYWJpbGl0eSA+PSA4MCUuCisgIGJvb2wgaXNFZGdlSG90KGNvbnN0IEJhc2ljQmxvY2sgKlNyYywgY29uc3QgQmFzaWNCbG9jayAqRHN0KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBob3Qgc3VjY2Vzc29yIG9mIGEgYmxvY2sgaWYgb25lIGV4aXN0cy4KKyAgLy8vCisgIC8vLyBHaXZlbiBhIGJhc2ljIGJsb2NrLCBsb29rIHRocm91Z2ggaXRzIHN1Y2Nlc3NvcnMgYW5kIGlmIG9uZSBleGlzdHMgZm9yCisgIC8vLyB3aGljaCBcc2VlIGlzRWRnZUhvdCB3b3VsZCByZXR1cm4gdHJ1ZSwgcmV0dXJuIHRoYXQgc3VjY2Vzc29yIGJsb2NrLgorICBjb25zdCBCYXNpY0Jsb2NrICpnZXRIb3RTdWNjKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFByaW50IGFuIGVkZ2UncyBwcm9iYWJpbGl0eS4KKyAgLy8vCisgIC8vLyBSZXRyaWV2ZXMgYW4gZWRnZSdzIHByb2JhYmlsaXR5IHNpbWlsYXJseSB0byBcc2VlIGdldEVkZ2VQcm9iYWJpbGl0eSwgYnV0CisgIC8vLyB0aGVuIHByaW50cyB0aGF0IHByb2JhYmlsaXR5IHRvIHRoZSBwcm92aWRlZCBzdHJlYW0uIFRoYXQgc3RyZWFtIGlzIHRoZW4KKyAgLy8vIHJldHVybmVkLgorICByYXdfb3N0cmVhbSAmcHJpbnRFZGdlUHJvYmFiaWxpdHkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBCYXNpY0Jsb2NrICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYXNpY0Jsb2NrICpEc3QpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgU2V0IHRoZSByYXcgZWRnZSBwcm9iYWJpbGl0eSBmb3IgdGhlIGdpdmVuIGVkZ2UuCisgIC8vLworICAvLy8gVGhpcyBhbGxvd3MgYSBwYXNzIHRvIGV4cGxpY2l0bHkgc2V0IHRoZSBlZGdlIHByb2JhYmlsaXR5IGZvciBhbiBlZGdlLiBJdAorICAvLy8gY2FuIGJlIHVzZWQgd2hlbiB1cGRhdGluZyB0aGUgQ0ZHIHRvIHVwZGF0ZSBhbmQgcHJlc2VydmUgdGhlIGJyYW5jaAorICAvLy8gcHJvYmFiaWxpdHkgaW5mb3JtYXRpb24uIFJlYWQgdGhlIGltcGxlbWVudGF0aW9uIG9mIGhvdyB0aGVzZSBlZGdlCisgIC8vLyBwcm9iYWJpbGl0aWVzIGFyZSBjYWxjdWxhdGVkIGNhcmVmdWxseSBiZWZvcmUgdXNpbmchCisgIHZvaWQgc2V0RWRnZVByb2JhYmlsaXR5KGNvbnN0IEJhc2ljQmxvY2sgKlNyYywgdW5zaWduZWQgSW5kZXhJblN1Y2Nlc3NvcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJyYW5jaFByb2JhYmlsaXR5IFByb2IpOworCisgIHN0YXRpYyBCcmFuY2hQcm9iYWJpbGl0eSBnZXRCcmFuY2hQcm9iU3RhY2tQcm90ZWN0b3IoYm9vbCBJc0xpa2VseSkgeworICAgIHN0YXRpYyBjb25zdCBCcmFuY2hQcm9iYWJpbGl0eSBMaWtlbHlQcm9iKCgxdSA8PCAyMCkgLSAxLCAxdSA8PCAyMCk7CisgICAgcmV0dXJuIElzTGlrZWx5ID8gTGlrZWx5UHJvYiA6IExpa2VseVByb2IuZ2V0Q29tcGwoKTsKKyAgfQorCisgIHZvaWQgY2FsY3VsYXRlKGNvbnN0IEZ1bmN0aW9uICZGLCBjb25zdCBMb29wSW5mbyAmTEksCisgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkgPSBudWxscHRyKTsKKworICAvLy8gRm9yZ2V0IGFuYWx5c2lzIHJlc3VsdHMgZm9yIHRoZSBnaXZlbiBiYXNpYyBibG9jay4KKyAgdm9pZCBlcmFzZUJsb2NrKGNvbnN0IEJhc2ljQmxvY2sgKkJCKTsKKworICAvLyBVc2UgdG8gdHJhY2sgU0NDcyBmb3IgaGFuZGxpbmcgaXJyZWR1Y2libGUgbG9vcHMuCisgIHVzaW5nIFNjY01hcCA9IERlbnNlTWFwPGNvbnN0IEJhc2ljQmxvY2sgKiwgaW50PjsKKyAgdXNpbmcgU2NjSGVhZGVyTWFwID0gRGVuc2VNYXA8Y29uc3QgQmFzaWNCbG9jayAqLCBib29sPjsKKyAgdXNpbmcgU2NjSGVhZGVyTWFwcyA9IHN0ZDo6dmVjdG9yPFNjY0hlYWRlck1hcD47CisgIHN0cnVjdCBTY2NJbmZvIHsKKyAgICBTY2NNYXAgU2NjTnVtczsKKyAgICBTY2NIZWFkZXJNYXBzIFNjY0hlYWRlcnM7CisgIH07CisKK3ByaXZhdGU6CisgIC8vIFdlIG5lZWQgdG8gc3RvcmUgQ2FsbGJhY2tWSCdzIGluIG9yZGVyIHRvIGNvcnJlY3RseSBoYW5kbGUgYmFzaWMgYmxvY2sKKyAgLy8gcmVtb3ZhbC4KKyAgY2xhc3MgQmFzaWNCbG9ja0NhbGxiYWNrVkggZmluYWwgOiBwdWJsaWMgQ2FsbGJhY2tWSCB7CisgICAgQnJhbmNoUHJvYmFiaWxpdHlJbmZvICpCUEk7CisKKyAgICB2b2lkIGRlbGV0ZWQoKSBvdmVycmlkZSB7CisgICAgICBhc3NlcnQoQlBJICE9IG51bGxwdHIpOworICAgICAgQlBJLT5lcmFzZUJsb2NrKGNhc3Q8QmFzaWNCbG9jaz4oZ2V0VmFsUHRyKCkpKTsKKyAgICAgIEJQSS0+SGFuZGxlcy5lcmFzZSgqdGhpcyk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBCYXNpY0Jsb2NrQ2FsbGJhY2tWSChjb25zdCBWYWx1ZSAqViwgQnJhbmNoUHJvYmFiaWxpdHlJbmZvICpCUEkgPSBudWxscHRyKQorICAgICAgICA6IENhbGxiYWNrVkgoY29uc3RfY2FzdDxWYWx1ZSAqPihWKSksIEJQSShCUEkpIHt9CisgIH07CisKKyAgRGVuc2VTZXQ8QmFzaWNCbG9ja0NhbGxiYWNrVkgsIERlbnNlTWFwSW5mbzxWYWx1ZSo+PiBIYW5kbGVzOworCisgIC8vIFNpbmNlIHdlIGFsbG93IGR1cGxpY2F0ZSBlZGdlcyBmcm9tIG9uZSBiYXNpYyBibG9jayB0byBhbm90aGVyLCB3ZSB1c2UKKyAgLy8gYSBwYWlyIChQcmVkQmxvY2sgYW5kIGFuIGluZGV4IGluIHRoZSBzdWNjZXNzb3JzKSB0byBzcGVjaWZ5IGFuIGVkZ2UuCisgIHVzaW5nIEVkZ2UgPSBzdGQ6OnBhaXI8Y29uc3QgQmFzaWNCbG9jayAqLCB1bnNpZ25lZD47CisKKyAgLy8gRGVmYXVsdCB3ZWlnaHQgdmFsdWUuIFVzZWQgd2hlbiB3ZSBkb24ndCBoYXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlZGdlLgorICAvLyBUT0RPOiBERUZBVUxUX1dFSUdIVCBtYWtlcyBzZW5zZSBkdXJpbmcgc3RhdGljIHByZWRpY2F0aW9uLCB3aGVuIG5vbmUgb2YKKyAgLy8gdGhlIHN1Y2Nlc3NvcnMgaGF2ZSBhIHdlaWdodCB5ZXQuIEJ1dCBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2Ugd2hlbiBwcm92aWRpbmcKKyAgLy8gd2VpZ2h0IHRvIGFuIGVkZ2UgdGhhdCBtYXkgaGF2ZSBzaWJsaW5ncyB3aXRoIG5vbi16ZXJvIHdlaWdodHMuIFRoaXMgY2FuCisgIC8vIGJlIGhhbmRsZWQgdmFyaW91cyB3YXlzLCBidXQgaXQncyBwcm9iYWJseSBmaW5lIGZvciBhbiBlZGdlIHdpdGggdW5rbm93bgorICAvLyB3ZWlnaHQgdG8ganVzdCAiaW5oZXJpdCIgdGhlIG5vbi16ZXJvIHdlaWdodCBvZiBhbiBhZGphY2VudCBzdWNjZXNzb3IuCisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX1dFSUdIVCA9IDE2OworCisgIERlbnNlTWFwPEVkZ2UsIEJyYW5jaFByb2JhYmlsaXR5PiBQcm9iczsKKworICAvLy8gXGJyaWVmIFRyYWNrIHRoZSBsYXN0IGZ1bmN0aW9uIHdlIHJ1biBvdmVyIGZvciBwcmludGluZy4KKyAgY29uc3QgRnVuY3Rpb24gKkxhc3RGOworCisgIC8vLyBcYnJpZWYgVHJhY2sgdGhlIHNldCBvZiBibG9ja3MgZGlyZWN0bHkgc3VjY2VlZGVkIGJ5IGEgcmV0dXJuaW5nIGJsb2NrLgorICBTbWFsbFB0clNldDxjb25zdCBCYXNpY0Jsb2NrICosIDE2PiBQb3N0RG9taW5hdGVkQnlVbnJlYWNoYWJsZTsKKworICAvLy8gXGJyaWVmIFRyYWNrIHRoZSBzZXQgb2YgYmxvY2tzIHRoYXQgYWx3YXlzIGxlYWQgdG8gYSBjb2xkIGNhbGwuCisgIFNtYWxsUHRyU2V0PGNvbnN0IEJhc2ljQmxvY2sgKiwgMTY+IFBvc3REb21pbmF0ZWRCeUNvbGRDYWxsOworCisgIHZvaWQgdXBkYXRlUG9zdERvbWluYXRlZEJ5VW5yZWFjaGFibGUoY29uc3QgQmFzaWNCbG9jayAqQkIpOworICB2b2lkIHVwZGF0ZVBvc3REb21pbmF0ZWRCeUNvbGRDYWxsKGNvbnN0IEJhc2ljQmxvY2sgKkJCKTsKKyAgYm9vbCBjYWxjVW5yZWFjaGFibGVIZXVyaXN0aWNzKGNvbnN0IEJhc2ljQmxvY2sgKkJCKTsKKyAgYm9vbCBjYWxjTWV0YWRhdGFXZWlnaHRzKGNvbnN0IEJhc2ljQmxvY2sgKkJCKTsKKyAgYm9vbCBjYWxjQ29sZENhbGxIZXVyaXN0aWNzKGNvbnN0IEJhc2ljQmxvY2sgKkJCKTsKKyAgYm9vbCBjYWxjUG9pbnRlckhldXJpc3RpY3MoY29uc3QgQmFzaWNCbG9jayAqQkIpOworICBib29sIGNhbGNMb29wQnJhbmNoSGV1cmlzdGljcyhjb25zdCBCYXNpY0Jsb2NrICpCQiwgY29uc3QgTG9vcEluZm8gJkxJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2NJbmZvICZTY2NJKTsKKyAgYm9vbCBjYWxjWmVyb0hldXJpc3RpY3MoY29uc3QgQmFzaWNCbG9jayAqQkIsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkpOworICBib29sIGNhbGNGbG9hdGluZ1BvaW50SGV1cmlzdGljcyhjb25zdCBCYXNpY0Jsb2NrICpCQik7CisgIGJvb2wgY2FsY0ludm9rZUhldXJpc3RpY3MoY29uc3QgQmFzaWNCbG9jayAqQkIpOworfTsKKworLy8vIFxicmllZiBBbmFseXNpcyBwYXNzIHdoaWNoIGNvbXB1dGVzIFxjIEJyYW5jaFByb2JhYmlsaXR5SW5mby4KK2NsYXNzIEJyYW5jaFByb2JhYmlsaXR5QW5hbHlzaXMKKyAgICA6IHB1YmxpYyBBbmFseXNpc0luZm9NaXhpbjxCcmFuY2hQcm9iYWJpbGl0eUFuYWx5c2lzPiB7CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxCcmFuY2hQcm9iYWJpbGl0eUFuYWx5c2lzPjsKKworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgUHJvdmlkZSB0aGUgcmVzdWx0IHR5cGUgZm9yIHRoaXMgYW5hbHlzaXMgcGFzcy4KKyAgdXNpbmcgUmVzdWx0ID0gQnJhbmNoUHJvYmFiaWxpdHlJbmZvOworCisgIC8vLyBcYnJpZWYgUnVuIHRoZSBhbmFseXNpcyBwYXNzIG92ZXIgYSBmdW5jdGlvbiBhbmQgcHJvZHVjZSBCUEkuCisgIEJyYW5jaFByb2JhYmlsaXR5SW5mbyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gXGJyaWVmIFByaW50ZXIgcGFzcyBmb3IgdGhlIFxjIEJyYW5jaFByb2JhYmlsaXR5QW5hbHlzaXMgcmVzdWx0cy4KK2NsYXNzIEJyYW5jaFByb2JhYmlsaXR5UHJpbnRlclBhc3MKKyAgICA6IHB1YmxpYyBQYXNzSW5mb01peGluPEJyYW5jaFByb2JhYmlsaXR5UHJpbnRlclBhc3M+IHsKKyAgcmF3X29zdHJlYW0gJk9TOworCitwdWJsaWM6CisgIGV4cGxpY2l0IEJyYW5jaFByb2JhYmlsaXR5UHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk9TKSA6IE9TKE9TKSB7fQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBcYnJpZWYgTGVnYWN5IGFuYWx5c2lzIHBhc3Mgd2hpY2ggY29tcHV0ZXMgXGMgQnJhbmNoUHJvYmFiaWxpdHlJbmZvLgorY2xhc3MgQnJhbmNoUHJvYmFiaWxpdHlJbmZvV3JhcHBlclBhc3MgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgQnJhbmNoUHJvYmFiaWxpdHlJbmZvIEJQSTsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBCcmFuY2hQcm9iYWJpbGl0eUluZm9XcmFwcGVyUGFzcygpIDogRnVuY3Rpb25QYXNzKElEKSB7CisgICAgaW5pdGlhbGl6ZUJyYW5jaFByb2JhYmlsaXR5SW5mb1dyYXBwZXJQYXNzUGFzcygKKyAgICAgICAgKlBhc3NSZWdpc3RyeTo6Z2V0UGFzc1JlZ2lzdHJ5KCkpOworICB9CisKKyAgQnJhbmNoUHJvYmFiaWxpdHlJbmZvICZnZXRCUEkoKSB7IHJldHVybiBCUEk7IH0KKyAgY29uc3QgQnJhbmNoUHJvYmFiaWxpdHlJbmZvICZnZXRCUEkoKSBjb25zdCB7IHJldHVybiBCUEk7IH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZTsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSAqTSA9IG51bGxwdHIpIGNvbnN0IG92ZXJyaWRlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfQlJBTkNIUFJPQkFCSUxJVFlJTkZPX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ0ZHLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NGRy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1Njk0NjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NGRy5oCkBAIC0wLDAgKzEsMTYxIEBACisvLz09PS0tIEFuYWx5c2lzL0NGRy5oIC0gQmFzaWNCbG9jayBBbmFseXNlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmFtaWx5IG9mIGZ1bmN0aW9ucyBwZXJmb3JtcyBhbmFseXNlcyBvbiBiYXNpYyBibG9ja3MsIGFuZCBpbnN0cnVjdGlvbnMKKy8vIGNvbnRhaW5lZCB3aXRoaW4gYmFzaWMgYmxvY2tzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19DRkdfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0NGR19ICisKKyNpbmNsdWRlICJsbHZtL0lSL0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NGRy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBEb21pbmF0b3JUcmVlOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIExvb3BJbmZvOworY2xhc3MgVGVybWluYXRvckluc3Q7CisKKy8vLyBBbmFseXplIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gdG8gZmluZCBhbGwgb2YgdGhlIGxvb3AgYmFja2VkZ2VzIGluIHRoZQorLy8vIGZ1bmN0aW9uIGFuZCByZXR1cm4gdGhlbS4gIFRoaXMgaXMgYSByZWxhdGl2ZWx5IGNoZWFwIChjb21wYXJlZCB0bworLy8vIGNvbXB1dGluZyBkb21pbmF0b3JzIGFuZCBsb29wIGluZm8pIGFuYWx5c2lzLgorLy8vCisvLy8gVGhlIG91dHB1dCBpcyBhZGRlZCB0byBSZXN1bHQsIGFzIHBhaXJzIG9mIDxmcm9tLHRvPiBlZGdlIGluZm8uCit2b2lkIEZpbmRGdW5jdGlvbkJhY2tlZGdlcygKKyAgICBjb25zdCBGdW5jdGlvbiAmRiwKKyAgICBTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPGNvbnN0IEJhc2ljQmxvY2sgKiwgY29uc3QgQmFzaWNCbG9jayAqPiA+ICYKKyAgICAgICAgUmVzdWx0KTsKKworLy8vIFNlYXJjaCBmb3IgdGhlIHNwZWNpZmllZCBzdWNjZXNzb3Igb2YgYmFzaWMgYmxvY2sgQkIgYW5kIHJldHVybiBpdHMgcG9zaXRpb24KKy8vLyBpbiB0aGUgdGVybWluYXRvciBpbnN0cnVjdGlvbidzIGxpc3Qgb2Ygc3VjY2Vzc29ycy4gIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwKKy8vLyB0aGlzIHdpdGggYSBibG9jayB0aGF0IGlzIG5vdCBhIHN1Y2Nlc3Nvci4KK3Vuc2lnbmVkIEdldFN1Y2Nlc3Nvck51bWJlcihjb25zdCBCYXNpY0Jsb2NrICpCQiwgY29uc3QgQmFzaWNCbG9jayAqU3VjYyk7CisKKy8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGVkZ2UgaXMgYSBjcml0aWNhbCBlZGdlLiBDcml0aWNhbCBlZGdlcyBhcmUKKy8vLyBlZGdlcyBmcm9tIGEgYmxvY2sgd2l0aCBtdWx0aXBsZSBzdWNjZXNzb3JzIHRvIGEgYmxvY2sgd2l0aCBtdWx0aXBsZQorLy8vIHByZWRlY2Vzc29ycy4KKy8vLworYm9vbCBpc0NyaXRpY2FsRWRnZShjb25zdCBUZXJtaW5hdG9ySW5zdCAqVEksIHVuc2lnbmVkIFN1Y2NOdW0sCisgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dJZGVudGljYWxFZGdlcyA9IGZhbHNlKTsKKworLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciBpbnN0cnVjdGlvbiAnVG8nIGlzIHJlYWNoYWJsZSBmcm9tICdGcm9tJywKKy8vLyByZXR1cm5pbmcgdHJ1ZSBpZiB1bmNlcnRhaW4uCisvLy8KKy8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGVyZSBpcyBhIHBhdGggZnJvbSBGcm9tIHRvIFRvIHdpdGhpbiBhIHNpbmdsZSBmdW5jdGlvbi4KKy8vLyBSZXR1cm5zIGZhbHNlIG9ubHkgaWYgd2UgY2FuIHByb3ZlIHRoYXQgb25jZSAnRnJvbScgaGFzIGJlZW4gZXhlY3V0ZWQgdGhlbgorLy8vICdUbycgY2FuIG5vdCBiZSBleGVjdXRlZC4gQ29uc2VydmF0aXZlbHkgcmV0dXJucyB0cnVlLgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiBpcyBsaW5lYXIgd2l0aCByZXNwZWN0IHRvIHRoZSBudW1iZXIgb2YgYmxvY2tzIGluIHRoZSBDRkcsCisvLy8gd2Fsa2luZyBkb3duIHN1Y2Nlc3NvcnMgZnJvbSBGcm9tIHRvIHJlYWNoIFRvLCB3aXRoIGEgZml4ZWQgdGhyZXNob2xkLgorLy8vIFVzaW5nIERUIG9yIExJIGFsbG93cyB1cyB0byBhbnN3ZXIgbW9yZSBxdWlja2x5LiBMSSByZWR1Y2VzIHRoZSBjb3N0IG9mCisvLy8gYW4gZW50aXJlIGxvb3Agb2YgYW55IG51bWJlciBvZiBibG9ja3MgdG8gYmUgdGhlIHNhbWUgYXMgdGhlIGNvc3Qgb2YgYQorLy8vIHNpbmdsZSBibG9jay4gRFQgcmVkdWNlcyB0aGUgY29zdCBieSBhbGxvd2luZyB0aGUgc2VhcmNoIHRvIHRlcm1pbmF0ZSB3aGVuCisvLy8gd2UgZmluZCBhIGJsb2NrIHRoYXQgZG9taW5hdGVzIHRoZSBibG9jayBjb250YWluaW5nICdUbycuIERUIGlzIG1vc3QgdXNlZnVsCisvLy8gb24gYnJhbmNoeSBjb2RlIGJ1dCBub3QgbG9vcHMsIGFuZCBMSSBpcyBtb3N0IHVzZWZ1bCBvbiBjb2RlIHdpdGggbG9vcHMgYnV0CisvLy8gZG9lcyBub3QgaGVscCBvbiBicmFuY2h5IGNvZGUgb3V0c2lkZSBsb29wcy4KK2Jvb2wgaXNQb3RlbnRpYWxseVJlYWNoYWJsZShjb25zdCBJbnN0cnVjdGlvbiAqRnJvbSwgY29uc3QgSW5zdHJ1Y3Rpb24gKlRvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wSW5mbyAqTEkgPSBudWxscHRyKTsKKworLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciBibG9jayAnVG8nIGlzIHJlYWNoYWJsZSBmcm9tICdGcm9tJywgcmV0dXJuaW5nCisvLy8gdHJ1ZSBpZiB1bmNlcnRhaW4uCisvLy8KKy8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGVyZSBpcyBhIHBhdGggZnJvbSBGcm9tIHRvIFRvIHdpdGhpbiBhIHNpbmdsZSBmdW5jdGlvbi4KKy8vLyBSZXR1cm5zIGZhbHNlIG9ubHkgaWYgd2UgY2FuIHByb3ZlIHRoYXQgb25jZSAnRnJvbScgaGFzIGJlZW4gcmVhY2hlZCB0aGVuCisvLy8gJ1RvJyBjYW4gbm90IGJlIGV4ZWN1dGVkLiBDb25zZXJ2YXRpdmVseSByZXR1cm5zIHRydWUuCitib29sIGlzUG90ZW50aWFsbHlSZWFjaGFibGUoY29uc3QgQmFzaWNCbG9jayAqRnJvbSwgY29uc3QgQmFzaWNCbG9jayAqVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3BJbmZvICpMSSA9IG51bGxwdHIpOworCisvLy8gXGJyaWVmIERldGVybWluZSB3aGV0aGVyIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBwYXRoIGZyb20gYSBibG9jayBpbgorLy8vICdXb3JrbGlzdCcgdG8gJ1N0b3BCQicsIHJldHVybmluZyB0cnVlIGlmIHVuY2VydGFpbi4KKy8vLworLy8vIERldGVybWluZSB3aGV0aGVyIHRoZXJlIGlzIGEgcGF0aCBmcm9tIGF0IGxlYXN0IG9uZSBibG9jayBpbiBXb3JrbGlzdCB0bworLy8vIFN0b3BCQiB3aXRoaW4gYSBzaW5nbGUgZnVuY3Rpb24uIFJldHVybnMgZmFsc2Ugb25seSBpZiB3ZSBjYW4gcHJvdmUgdGhhdAorLy8vIG9uY2UgYW55IGJsb2NrIGluICdXb3JrbGlzdCcgaGFzIGJlZW4gcmVhY2hlZCB0aGVuICdTdG9wQkInIGNhbiBub3QgYmUKKy8vLyBleGVjdXRlZC4gQ29uc2VydmF0aXZlbHkgcmV0dXJucyB0cnVlLgorYm9vbCBpc1BvdGVudGlhbGx5UmVhY2hhYmxlRnJvbU1hbnkoU21hbGxWZWN0b3JJbXBsPEJhc2ljQmxvY2sgKj4gJldvcmtsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqU3RvcEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcEluZm8gKkxJID0gbnVsbHB0cik7CisKKy8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGNvbnRyb2wgZmxvdyBpbiBccCBSUE9UcmF2ZXJzYWwgaXMgaXJyZWR1Y2libGUuCisvLy8KKy8vLyBUaGlzIGlzIGEgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbiB0byBkZXRlY3QgQ0ZHIGlycmVkdWNpYmlsaXR5IGJhc2VkIG9uIGxvb3AKKy8vLyBpbmZvIGFuYWx5c2lzLiBJdCBjYW4gYmUgdXNlZCBmb3IgYW55IGtpbmQgb2YgQ0ZHIChMb29wLCBNYWNoaW5lTG9vcCwKKy8vLyBGdW5jdGlvbiwgTWFjaGluZUZ1bmN0aW9uLCBldGMuKSBieSBwcm92aWRpbmcgYW4gUlBPIHRyYXZlcnNhbCAoXHAKKy8vLyBSUE9UcmF2ZXJzYWwpIGFuZCB0aGUgbG9vcCBpbmZvIGFuYWx5c2lzIChccCBMSSkgb2YgdGhlIENGRy4gVGhpcyB1dGlsaXR5CisvLy8gZnVuY3Rpb24gaXMgb25seSByZWNvbW1lbmRlZCB3aGVuIGxvb3AgaW5mbyBhbmFseXNpcyBpcyBhdmFpbGFibGUuIElmIGxvb3AKKy8vLyBpbmZvIGFuYWx5c2lzIGlzbid0IGF2YWlsYWJsZSwgcGxlYXNlLCBkb24ndCBjb21wdXRlIGl0IGV4cGxpY2l0bHkgZm9yIHRoaXMKKy8vLyBwdXJwb3NlLiBUaGVyZSBhcmUgbW9yZSBlZmZpY2llbnQgd2F5cyB0byBkZXRlY3QgQ0ZHIGlycmVkdWNpYmlsaXR5IHRoYXQKKy8vLyBkb24ndCByZXF1aXJlIHJlY29tcHV0aW5nIGxvb3AgaW5mbyBhbmFseXNpcyAoZS5nLiwgVDEvVDIgb3IgVGFyamFuJ3MKKy8vLyBhbGdvcml0aG0pLgorLy8vCisvLy8gUmVxdWlyZW1lbnRzOgorLy8vICAgMSkgR3JhcGhUcmFpdHMgbXVzdCBiZSBpbXBsZW1lbnRlZCBmb3IgTm9kZVQgdHlwZS4gSXQgaXMgdXNlZCB0byBhY2Nlc3MKKy8vLyAgICAgIE5vZGVUIHN1Y2Nlc3NvcnMuCisvLyAgICAyKSBccCBSUE9UcmF2ZXJzYWwgbXVzdCBiZSBhIHZhbGlkIHJldmVyc2UgcG9zdC1vcmRlciB0cmF2ZXJzYWwgb2YgdGhlCisvLy8gICAgICB0YXJnZXQgQ0ZHIHdpdGggYmVnaW4oKS9lbmQoKSBpdGVyYXRvciBpbnRlcmZhY2VzLgorLy8vICAgMykgXHAgTEkgbXVzdCBiZSBhIHZhbGlkIExvb3BJbmZvQmFzZSB0aGF0IGNvbnRhaW5zIHVwLXRvLWRhdGUgbG9vcAorLy8vICAgICAgYW5hbHlzaXMgaW5mb3JtYXRpb24gb2YgdGhlIENGRy4KKy8vLworLy8vIFRoaXMgYWxnb3JpdGhtIHVzZXMgdGhlIGluZm9ybWF0aW9uIGFib3V0IHJlZHVjaWJsZSBsb29wIGJhY2stZWRnZXMgYWxyZWFkeQorLy8vIGNvbXB1dGVkIGluIFxwIExJLiBXaGVuIGEgYmFjay1lZGdlIGlzIGZvdW5kIGR1cmluZyB0aGUgUlBPIHRyYXZlcnNhbCwgdGhlCisvLy8gYWxnb3JpdGhtIGNoZWNrcyB3aGV0aGVyIHRoZSBiYWNrLWVkZ2UgaXMgb25lIG9mIHRoZSByZWR1Y2libGUgYmFjay1lZGdlcyBpbgorLy8vIGxvb3AgaW5mby4gSWYgaXQgaXNuJ3QsIHRoZSBDRkcgaXMgaXJyZWR1Y2libGUuIEZvciBleGFtcGxlLCBmb3IgdGhlIENGRworLy8vIGJlbG93IChjYW5vbmljYWwgaXJyZWR1Y2libGUgZ3JhcGgpIGxvb3AgaW5mbyB3b24ndCBjb250YWluIGFueSBsb29wLCBzbyB0aGUKKy8vLyBhbGdvcml0aG0gd2lsbCByZXR1cm4gdGhhdCB0aGUgQ0ZHIGlzIGlycmVkdWNpYmxlIHdoZW4gY2hlY2tpbmcgdGhlIEIgPC0KKy8vLyAtPiBDIGJhY2stZWRnZS4KKy8vLworLy8vIChBLT5CLCBBLT5DLCBCLT5DLCBDLT5CLCBDLT5EKQorLy8vICAgIEEKKy8vLyAgLyAgIFwKKy8vLyBCPC0gLT5DCisvLy8gICAgICAgfAorLy8vICAgICAgIEQKKy8vLwordGVtcGxhdGUgPGNsYXNzIE5vZGVULCBjbGFzcyBSUE9UcmF2ZXJzYWxULCBjbGFzcyBMb29wSW5mb1QsCisgICAgICAgICAgY2xhc3MgR1QgPSBHcmFwaFRyYWl0czxOb2RlVD4+Citib29sIGNvbnRhaW5zSXJyZWR1Y2libGVDRkcoUlBPVHJhdmVyc2FsVCAmUlBPVHJhdmVyc2FsLCBjb25zdCBMb29wSW5mb1QgJkxJKSB7CisgIC8vLyBDaGVjayB3aGV0aGVyIHRoZSBlZGdlIChccCBTcmMsIFxwIERzdCkgaXMgYSByZWR1Y2libGUgbG9vcCBiYWNrZWRnZQorICAvLy8gYWNjb3JkaW5nIHRvIExJLiBJLmUuLCBjaGVjayBpZiB0aGVyZSBleGlzdHMgYSBsb29wIHRoYXQgY29udGFpbnMgU3JjIGFuZAorICAvLy8gd2hlcmUgRHN0IGlzIHRoZSBsb29wIGhlYWRlci4KKyAgYXV0byBpc1Byb3BlckJhY2tlZGdlID0gWyZdKE5vZGVUIFNyYywgTm9kZVQgRHN0KSB7CisgICAgZm9yIChjb25zdCBhdXRvICpMcCA9IExJLmdldExvb3BGb3IoU3JjKTsgTHA7IExwID0gTHAtPmdldFBhcmVudExvb3AoKSkgeworICAgICAgaWYgKExwLT5nZXRIZWFkZXIoKSA9PSBEc3QpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH07CisKKyAgU21hbGxQdHJTZXQ8Tm9kZVQsIDMyPiBWaXNpdGVkOworICBmb3IgKE5vZGVUIE5vZGUgOiBSUE9UcmF2ZXJzYWwpIHsKKyAgICBWaXNpdGVkLmluc2VydChOb2RlKTsKKyAgICBmb3IgKE5vZGVUIFN1Y2MgOiBtYWtlX3JhbmdlKEdUOjpjaGlsZF9iZWdpbihOb2RlKSwgR1Q6OmNoaWxkX2VuZChOb2RlKSkpIHsKKyAgICAgIC8vIFN1Y2MgaGFzbid0IGJlZW4gdmlzaXRlZCB5ZXQKKyAgICAgIGlmICghVmlzaXRlZC5jb3VudChTdWNjKSkKKyAgICAgICAgY29udGludWU7CisgICAgICAvLyBXZSBhbHJlYWR5IHZpc2l0ZWQgU3VjYywgdGh1cyBOb2RlLT5TdWNjIG11c3QgYmUgYSBiYWNrZWRnZS4gQ2hlY2sgdGhhdAorICAgICAgLy8gdGhlIGhlYWQgbWF0Y2hlcyB3aGF0IHdlIGhhdmUgaW4gdGhlIGxvb3AgaW5mb3JtYXRpb24uIE90aGVyd2lzZSwgd2UKKyAgICAgIC8vIGhhdmUgYW4gaXJyZWR1Y2libGUgZ3JhcGguCisgICAgICBpZiAoIWlzUHJvcGVyQmFja2VkZ2UoTm9kZSwgU3VjYykpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DRkdQcmludGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NGR1ByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Nzg2NzY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DRkdQcmludGVyLmgKQEAgLTAsMCArMSwxODcgQEAKKy8vPT09LS0gQ0ZHUHJpbnRlci5oIC0gQ0ZHIHByaW50ZXIgZXh0ZXJuYWwgaW50ZXJmYWNlIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSAnZG90LWNmZycgYW5hbHlzaXMgcGFzcywgd2hpY2ggZW1pdHMgdGhlCisvLyBjZmcuPGZubmFtZT4uZG90IGZpbGUgZm9yIGVhY2ggZnVuY3Rpb24gaW4gdGhlIHByb2dyYW0sIHdpdGggYSBncmFwaCBvZiB0aGUKKy8vIENGRyBmb3IgdGhhdCBmdW5jdGlvbi4KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBleHRlcm5hbCBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgY2FsbGVkIHRvIGV4cGxpY2l0bHkKKy8vIGluc3RhbnRpYXRlIHRoZSBDRkcgcHJpbnRlci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfQ0ZHUFJJTlRFUl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfQ0ZHUFJJTlRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0lSL0NGRy5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9HcmFwaFdyaXRlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBDRkdWaWV3ZXJQYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxDRkdWaWV3ZXJQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKK2NsYXNzIENGR09ubHlWaWV3ZXJQYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxDRkdPbmx5Vmlld2VyUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCitjbGFzcyBDRkdQcmludGVyUGFzcworICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48Q0ZHUHJpbnRlclBhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworY2xhc3MgQ0ZHT25seVByaW50ZXJQYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxDRkdPbmx5UHJpbnRlclBhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IERPVEdyYXBoVHJhaXRzPGNvbnN0IEZ1bmN0aW9uKj4gOiBwdWJsaWMgRGVmYXVsdERPVEdyYXBoVHJhaXRzIHsKKworICBET1RHcmFwaFRyYWl0cyAoYm9vbCBpc1NpbXBsZT1mYWxzZSkgOiBEZWZhdWx0RE9UR3JhcGhUcmFpdHMoaXNTaW1wbGUpIHt9CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldEdyYXBoTmFtZShjb25zdCBGdW5jdGlvbiAqRikgeworICAgIHJldHVybiAiQ0ZHIGZvciAnIiArIEYtPmdldE5hbWUoKS5zdHIoKSArICInIGZ1bmN0aW9uIjsKKyAgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRTaW1wbGVOb2RlTGFiZWwoY29uc3QgQmFzaWNCbG9jayAqTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbiAqKSB7CisgICAgaWYgKCFOb2RlLT5nZXROYW1lKCkuZW1wdHkoKSkKKyAgICAgIHJldHVybiBOb2RlLT5nZXROYW1lKCkuc3RyKCk7CisKKyAgICBzdGQ6OnN0cmluZyBTdHI7CisgICAgcmF3X3N0cmluZ19vc3RyZWFtIE9TKFN0cik7CisKKyAgICBOb2RlLT5wcmludEFzT3BlcmFuZChPUywgZmFsc2UpOworICAgIHJldHVybiBPUy5zdHIoKTsKKyAgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRDb21wbGV0ZU5vZGVMYWJlbChjb25zdCBCYXNpY0Jsb2NrICpOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb24gKikgeworICAgIGVudW0geyBNYXhDb2x1bW5zID0gODAgfTsKKyAgICBzdGQ6OnN0cmluZyBTdHI7CisgICAgcmF3X3N0cmluZ19vc3RyZWFtIE9TKFN0cik7CisKKyAgICBpZiAoTm9kZS0+Z2V0TmFtZSgpLmVtcHR5KCkpIHsKKyAgICAgIE5vZGUtPnByaW50QXNPcGVyYW5kKE9TLCBmYWxzZSk7CisgICAgICBPUyA8PCAiOiI7CisgICAgfQorCisgICAgT1MgPDwgKk5vZGU7CisgICAgc3RkOjpzdHJpbmcgT3V0U3RyID0gT1Muc3RyKCk7CisgICAgaWYgKE91dFN0clswXSA9PSAnXG4nKSBPdXRTdHIuZXJhc2UoT3V0U3RyLmJlZ2luKCkpOworCisgICAgLy8gUHJvY2VzcyBzdHJpbmcgb3V0cHV0IHRvIG1ha2UgaXQgbmljZXIuLi4KKyAgICB1bnNpZ25lZCBDb2xOdW0gPSAwOworICAgIHVuc2lnbmVkIExhc3RTcGFjZSA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBPdXRTdHIubGVuZ3RoKCk7ICsraSkgeworICAgICAgaWYgKE91dFN0cltpXSA9PSAnXG4nKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIExlZnQganVzdGlmeQorICAgICAgICBPdXRTdHJbaV0gPSAnXFwnOworICAgICAgICBPdXRTdHIuaW5zZXJ0KE91dFN0ci5iZWdpbigpK2krMSwgJ2wnKTsKKyAgICAgICAgQ29sTnVtID0gMDsKKyAgICAgICAgTGFzdFNwYWNlID0gMDsKKyAgICAgIH0gZWxzZSBpZiAoT3V0U3RyW2ldID09ICc7JykgeyAgICAgICAgICAgICAgICAgICAgICAvLyBEZWxldGUgY29tbWVudHMhCisgICAgICAgIHVuc2lnbmVkIElkeCA9IE91dFN0ci5maW5kKCdcbicsIGkrMSk7ICAgICAgICAgICAgLy8gRmluZCBlbmQgb2YgbGluZQorICAgICAgICBPdXRTdHIuZXJhc2UoT3V0U3RyLmJlZ2luKCkraSwgT3V0U3RyLmJlZ2luKCkrSWR4KTsKKyAgICAgICAgLS1pOworICAgICAgfSBlbHNlIGlmIChDb2xOdW0gPT0gTWF4Q29sdW1ucykgeyAgICAgICAgICAgICAgICAgIC8vIFdyYXAgbGluZXMuCisgICAgICAgIC8vIFdyYXAgdmVyeSBsb25nIG5hbWVzIGV2ZW4gdGhvdWdoIHdlIGNhbid0IGZpbmQgYSBzcGFjZS4KKyAgICAgICAgaWYgKCFMYXN0U3BhY2UpCisgICAgICAgICAgTGFzdFNwYWNlID0gaTsKKyAgICAgICAgT3V0U3RyLmluc2VydChMYXN0U3BhY2UsICJcXGwuLi4iKTsKKyAgICAgICAgQ29sTnVtID0gaSAtIExhc3RTcGFjZTsKKyAgICAgICAgTGFzdFNwYWNlID0gMDsKKyAgICAgICAgaSArPSAzOyAvLyBUaGUgbG9vcCB3aWxsIGFkdmFuY2UgJ2knIGFnYWluLgorICAgICAgfQorICAgICAgZWxzZQorICAgICAgICArK0NvbE51bTsKKyAgICAgIGlmIChPdXRTdHJbaV0gPT0gJyAnKQorICAgICAgICBMYXN0U3BhY2UgPSBpOworICAgIH0KKyAgICByZXR1cm4gT3V0U3RyOworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0Tm9kZUxhYmVsKGNvbnN0IEJhc2ljQmxvY2sgKk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbiAqR3JhcGgpIHsKKyAgICBpZiAoaXNTaW1wbGUoKSkKKyAgICAgIHJldHVybiBnZXRTaW1wbGVOb2RlTGFiZWwoTm9kZSwgR3JhcGgpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBnZXRDb21wbGV0ZU5vZGVMYWJlbChOb2RlLCBHcmFwaCk7CisgIH0KKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RWRnZVNvdXJjZUxhYmVsKGNvbnN0IEJhc2ljQmxvY2sgKk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VjY19jb25zdF9pdGVyYXRvciBJKSB7CisgICAgLy8gTGFiZWwgc291cmNlIG9mIGNvbmRpdGlvbmFsIGJyYW5jaGVzIHdpdGggIlQiIG9yICJGIgorICAgIGlmIChjb25zdCBCcmFuY2hJbnN0ICpCSSA9IGR5bl9jYXN0PEJyYW5jaEluc3Q+KE5vZGUtPmdldFRlcm1pbmF0b3IoKSkpCisgICAgICBpZiAoQkktPmlzQ29uZGl0aW9uYWwoKSkKKyAgICAgICAgcmV0dXJuIChJID09IHN1Y2NfYmVnaW4oTm9kZSkpID8gIlQiIDogIkYiOworCisgICAgLy8gTGFiZWwgc291cmNlIG9mIHN3aXRjaCBlZGdlcyB3aXRoIHRoZSBhc3NvY2lhdGVkIHZhbHVlLgorICAgIGlmIChjb25zdCBTd2l0Y2hJbnN0ICpTSSA9IGR5bl9jYXN0PFN3aXRjaEluc3Q+KE5vZGUtPmdldFRlcm1pbmF0b3IoKSkpIHsKKyAgICAgIHVuc2lnbmVkIFN1Y2NObyA9IEkuZ2V0U3VjY2Vzc29ySW5kZXgoKTsKKworICAgICAgaWYgKFN1Y2NObyA9PSAwKSByZXR1cm4gImRlZiI7CisKKyAgICAgIHN0ZDo6c3RyaW5nIFN0cjsKKyAgICAgIHJhd19zdHJpbmdfb3N0cmVhbSBPUyhTdHIpOworICAgICAgYXV0byBDYXNlID0gKlN3aXRjaEluc3Q6OkNvbnN0Q2FzZUl0Ojpmcm9tU3VjY2Vzc29ySW5kZXgoU0ksIFN1Y2NObyk7CisgICAgICBPUyA8PCBDYXNlLmdldENhc2VWYWx1ZSgpLT5nZXRWYWx1ZSgpOworICAgICAgcmV0dXJuIE9TLnN0cigpOworICAgIH0KKyAgICByZXR1cm4gIiI7CisgIH0KKworICAvLy8gRGlzcGxheSB0aGUgcmF3IGJyYW5jaCB3ZWlnaHRzIGZyb20gUEdPLgorICBzdGQ6OnN0cmluZyBnZXRFZGdlQXR0cmlidXRlcyhjb25zdCBCYXNpY0Jsb2NrICpOb2RlLCBzdWNjX2NvbnN0X2l0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgICAgY29uc3QgVGVybWluYXRvckluc3QgKlRJID0gTm9kZS0+Z2V0VGVybWluYXRvcigpOworICAgIGlmIChUSS0+Z2V0TnVtU3VjY2Vzc29ycygpID09IDEpCisgICAgICByZXR1cm4gIiI7CisKKyAgICBNRE5vZGUgKldlaWdodHNOb2RlID0gVEktPmdldE1ldGFkYXRhKExMVk1Db250ZXh0OjpNRF9wcm9mKTsKKyAgICBpZiAoIVdlaWdodHNOb2RlKQorICAgICAgcmV0dXJuICIiOworCisgICAgTURTdHJpbmcgKk1ETmFtZSA9IGNhc3Q8TURTdHJpbmc+KFdlaWdodHNOb2RlLT5nZXRPcGVyYW5kKDApKTsKKyAgICBpZiAoTUROYW1lLT5nZXRTdHJpbmcoKSAhPSAiYnJhbmNoX3dlaWdodHMiKQorICAgICAgcmV0dXJuICIiOworCisgICAgdW5zaWduZWQgT3BObyA9IEkuZ2V0U3VjY2Vzc29ySW5kZXgoKSArIDE7CisgICAgaWYgKE9wTm8gPj0gV2VpZ2h0c05vZGUtPmdldE51bU9wZXJhbmRzKCkpCisgICAgICByZXR1cm4gIiI7CisgICAgQ29uc3RhbnRJbnQgKldlaWdodCA9CisgICAgICAgIG1kY29uc3Q6OmR5bl9leHRyYWN0PENvbnN0YW50SW50PihXZWlnaHRzTm9kZS0+Z2V0T3BlcmFuZChPcE5vKSk7CisgICAgaWYgKCFXZWlnaHQpCisgICAgICByZXR1cm4gIiI7CisKKyAgICAvLyBQcmVwZW5kIGEgJ1cnIHRvIGluZGljYXRlIHRoYXQgdGhpcyBpcyBhIHdlaWdodCByYXRoZXIgdGhhbiB0aGUgYWN0dWFsCisgICAgLy8gcHJvZmlsZSBjb3VudCAoZHVlIHRvIHNjYWxpbmcpLgorICAgIFR3aW5lIEF0dHJzID0gImxhYmVsPVwiVzoiICsgVHdpbmUoV2VpZ2h0LT5nZXRaRXh0VmFsdWUoKSkgKyAiXCIiOworICAgIHJldHVybiBBdHRycy5zdHIoKTsKKyAgfQorfTsKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgRnVuY3Rpb25QYXNzOworICBGdW5jdGlvblBhc3MgKmNyZWF0ZUNGR1ByaW50ZXJMZWdhY3lQYXNzUGFzcyAoKTsKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVDRkdPbmx5UHJpbnRlckxlZ2FjeVBhc3NQYXNzICgpOworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NGTEFsaWFzQW5hbHlzaXNVdGlscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DRkxBbGlhc0FuYWx5c2lzVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODFhOGRkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DRkxBbGlhc0FuYWx5c2lzVXRpbHMuaApAQCAtMCwwICsxLDU4IEBACisvLz0tIENGTEFsaWFzQW5hbHlzaXNVdGlscy5oIC0gVXRpbGl0aWVzIGZvciBDRkwgQWxpYXMgQW5hbHlzaXMgLS0tLSotIEMrKy0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gXGZpbGUKKy8vIFRoZXNlIGFyZSB0aGUgdXRpbGl0aWVzL2hlbHBlcnMgdXNlZCBieSB0aGUgQ0ZMIEFsaWFzIEFuYWx5c2VzIGF2YWlsYWJsZSBpbgorLy8gdHJlZSwgaS5lLiBTdGVlbnNnYWFyZCdzIGFuZCBBbmRlcnNlbnMnLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19DRkxBTElBU0FOQUxZU0lTVVRJTFNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0NGTEFMSUFTQU5BTFlTSVNVVElMU19ICisKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZUhhbmRsZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY2ZsYWEgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQUFSZXN1bHQ+IHN0cnVjdCBGdW5jdGlvbkhhbmRsZSBmaW5hbCA6IHB1YmxpYyBDYWxsYmFja1ZIIHsKKyAgRnVuY3Rpb25IYW5kbGUoRnVuY3Rpb24gKkZuLCBBQVJlc3VsdCAqUmVzdWx0KQorICAgICAgOiBDYWxsYmFja1ZIKEZuKSwgUmVzdWx0KFJlc3VsdCkgeworICAgIGFzc2VydChGbiAhPSBudWxscHRyKTsKKyAgICBhc3NlcnQoUmVzdWx0ICE9IG51bGxwdHIpOworICB9CisKKyAgdm9pZCBkZWxldGVkKCkgb3ZlcnJpZGUgeyByZW1vdmVTZWxmRnJvbUNhY2hlKCk7IH0KKyAgdm9pZCBhbGxVc2VzUmVwbGFjZWRXaXRoKFZhbHVlICopIG92ZXJyaWRlIHsgcmVtb3ZlU2VsZkZyb21DYWNoZSgpOyB9CisKK3ByaXZhdGU6CisgIEFBUmVzdWx0ICpSZXN1bHQ7CisKKyAgdm9pZCByZW1vdmVTZWxmRnJvbUNhY2hlKCkgeworICAgIGFzc2VydChSZXN1bHQgIT0gbnVsbHB0cik7CisgICAgYXV0byAqVmFsID0gZ2V0VmFsUHRyKCk7CisgICAgUmVzdWx0LT5ldmljdChjYXN0PEZ1bmN0aW9uPihWYWwpKTsKKyAgICBzZXRWYWxQdHIobnVsbHB0cik7CisgIH0KK307CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgRnVuY3Rpb24gKnBhcmVudEZ1bmN0aW9uT2ZWYWx1ZShjb25zdCBWYWx1ZSAqVmFsKSB7CisgIGlmIChhdXRvICpJbnN0ID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFZhbCkpIHsKKyAgICBhdXRvICpCYiA9IEluc3QtPmdldFBhcmVudCgpOworICAgIHJldHVybiBCYi0+Z2V0UGFyZW50KCk7CisgIH0KKworICBpZiAoYXV0byAqQXJnID0gZHluX2Nhc3Q8QXJndW1lbnQ+KFZhbCkpCisgICAgcmV0dXJuIEFyZy0+Z2V0UGFyZW50KCk7CisgIHJldHVybiBudWxscHRyOworfSAvLyBuYW1lc3BhY2UgY2ZsYWEKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfQ0ZMQUxJQVNBTkFMWVNJU1VUSUxTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ0ZMQW5kZXJzQWxpYXNBbmFseXNpcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DRkxBbmRlcnNBbGlhc0FuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjIzOWQ1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ0ZMQW5kZXJzQWxpYXNBbmFseXNpcy5oCkBAIC0wLDAgKzEsMTI2IEBACisvLz09LSBDRkxBbmRlcnNBbGlhc0FuYWx5c2lzLmggLSBVbmlmaWNhdGlvbi1iYXNlZCBBbGlhcyBBbmFseXNpcyAtKi0gQysrLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBMTFZNJ3MgaW5jbHVzaW9uLWJhc2VkIGFsaWFzIGFuYWx5c2lzCisvLy8gaW1wbGVtZW50ZWQgd2l0aCBDRkwgZ3JhcGggcmVhY2hhYmlsaXR5LgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfQ0ZMQU5ERVJTQUxJQVNBTkFMWVNJU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfQ0ZMQU5ERVJTQUxJQVNBTkFMWVNJU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9DRkxBbGlhc0FuYWx5c2lzVXRpbHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSA8Zm9yd2FyZF9saXN0PgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIE1lbW9yeUxvY2F0aW9uOworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CisKK25hbWVzcGFjZSBjZmxhYSB7CisKK3N0cnVjdCBBbGlhc1N1bW1hcnk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjZmxhYQorCitjbGFzcyBDRkxBbmRlcnNBQVJlc3VsdCA6IHB1YmxpYyBBQVJlc3VsdEJhc2U8Q0ZMQW5kZXJzQUFSZXN1bHQ+IHsKKyAgZnJpZW5kIEFBUmVzdWx0QmFzZTxDRkxBbmRlcnNBQVJlc3VsdD47CisKKyAgY2xhc3MgRnVuY3Rpb25JbmZvOworCitwdWJsaWM6CisgIGV4cGxpY2l0IENGTEFuZGVyc0FBUmVzdWx0KGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICZUTEkpOworICBDRkxBbmRlcnNBQVJlc3VsdChDRkxBbmRlcnNBQVJlc3VsdCAmJlJIUyk7CisgIH5DRkxBbmRlcnNBQVJlc3VsdCgpOworCisgIC8vLyBIYW5kbGUgaW52YWxpZGF0aW9uIGV2ZW50cyBmcm9tIHRoZSBuZXcgcGFzcyBtYW5hZ2VyLgorICAvLy8gQnkgZGVmaW5pdGlvbiwgdGhpcyByZXN1bHQgaXMgc3RhdGVsZXNzIGFuZCBzbyByZW1haW5zIHZhbGlkLgorICBib29sIGludmFsaWRhdGUoRnVuY3Rpb24gJiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJiwKKyAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyOjpJbnZhbGlkYXRvciAmKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIEV2aWN0IHRoZSBnaXZlbiBmdW5jdGlvbiBmcm9tIGNhY2hlCisgIHZvaWQgZXZpY3QoY29uc3QgRnVuY3Rpb24gKkZuKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgYWxpYXMgc3VtbWFyeSBmb3IgdGhlIGdpdmVuIGZ1bmN0aW9uCisgIC8vLyBSZXR1cm4gbnVsbHB0ciBpZiB0aGUgc3VtbWFyeSBpcyBub3QgZm91bmQgb3Igbm90IGF2YWlsYWJsZQorICBjb25zdCBjZmxhYTo6QWxpYXNTdW1tYXJ5ICpnZXRBbGlhc1N1bW1hcnkoY29uc3QgRnVuY3Rpb24gJik7CisKKyAgQWxpYXNSZXN1bHQgcXVlcnkoY29uc3QgTWVtb3J5TG9jYXRpb24gJiwgY29uc3QgTWVtb3J5TG9jYXRpb24gJik7CisgIEFsaWFzUmVzdWx0IGFsaWFzKGNvbnN0IE1lbW9yeUxvY2F0aW9uICYsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICYpOworCitwcml2YXRlOgorICAvLy8gXGJyaWVmIEVuc3VyZXMgdGhhdCB0aGUgZ2l2ZW4gZnVuY3Rpb24gaXMgYXZhaWxhYmxlIGluIHRoZSBjYWNoZS4KKyAgLy8vIFJldHVybnMgdGhlIGFwcHJvcHJpYXRlIGVudHJ5IGZyb20gdGhlIGNhY2hlLgorICBjb25zdCBPcHRpb25hbDxGdW5jdGlvbkluZm8+ICZlbnN1cmVDYWNoZWQoY29uc3QgRnVuY3Rpb24gJik7CisKKyAgLy8vIFxicmllZiBJbnNlcnRzIHRoZSBnaXZlbiBGdW5jdGlvbiBpbnRvIHRoZSBjYWNoZS4KKyAgdm9pZCBzY2FuKGNvbnN0IEZ1bmN0aW9uICYpOworCisgIC8vLyBcYnJpZWYgQnVpbGQgc3VtbWFyeSBmb3IgYSBnaXZlbiBmdW5jdGlvbgorICBGdW5jdGlvbkluZm8gYnVpbGRJbmZvRnJvbShjb25zdCBGdW5jdGlvbiAmKTsKKworICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAmVExJOworCisgIC8vLyBcYnJpZWYgQ2FjaGVkIG1hcHBpbmcgb2YgRnVuY3Rpb25zIHRvIHRoZWlyIFN0cmF0aWZpZWRTZXRzLgorICAvLy8gSWYgYSBmdW5jdGlvbidzIHNldHMgYXJlIGN1cnJlbnRseSBiZWluZyBidWlsdCwgaXQgaXMgbWFya2VkCisgIC8vLyBpbiB0aGUgY2FjaGUgYXMgYW4gT3B0aW9uYWwgd2l0aG91dCBhIHZhbHVlLiBUaGlzIHdheSwgaWYgd2UKKyAgLy8vIGhhdmUgYW55IGtpbmQgb2YgcmVjdXJzaW9uLCBpdCBpcyBkaXNjZXJuYWJsZSBmcm9tIGEgZnVuY3Rpb24KKyAgLy8vIHRoYXQgc2ltcGx5IGhhcyBlbXB0eSBzZXRzLgorICBEZW5zZU1hcDxjb25zdCBGdW5jdGlvbiAqLCBPcHRpb25hbDxGdW5jdGlvbkluZm8+PiBDYWNoZTsKKworICBzdGQ6OmZvcndhcmRfbGlzdDxjZmxhYTo6RnVuY3Rpb25IYW5kbGU8Q0ZMQW5kZXJzQUFSZXN1bHQ+PiBIYW5kbGVzOworfTsKKworLy8vIEFuYWx5c2lzIHBhc3MgcHJvdmlkaW5nIGEgbmV2ZXItaW52YWxpZGF0ZWQgYWxpYXMgYW5hbHlzaXMgcmVzdWx0LgorLy8vCisvLy8gRklYTUU6IFdlIHJlYWxseSBzaG91bGQgcmVmYWN0b3IgQ0ZMIHRvIHVzZSB0aGUgYW5hbHlzaXMgbW9yZSBoZWF2aWx5LCBhbmQKKy8vLyBpbiBwYXJ0aWN1bGFyIHRvIGxldmVyYWdlIGludmFsaWRhdGlvbiB0byB0cmlnZ2VyIHJlLWNvbXB1dGF0aW9uLgorY2xhc3MgQ0ZMQW5kZXJzQUEgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48Q0ZMQW5kZXJzQUE+IHsKKyAgZnJpZW5kIEFuYWx5c2lzSW5mb01peGluPENGTEFuZGVyc0FBPjsKKworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCitwdWJsaWM6CisgIHVzaW5nIFJlc3VsdCA9IENGTEFuZGVyc0FBUmVzdWx0OworCisgIENGTEFuZGVyc0FBUmVzdWx0IHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBMZWdhY3kgd3JhcHBlciBwYXNzIHRvIHByb3ZpZGUgdGhlIENGTEFuZGVyc0FBUmVzdWx0IG9iamVjdC4KK2NsYXNzIENGTEFuZGVyc0FBV3JhcHBlclBhc3MgOiBwdWJsaWMgSW1tdXRhYmxlUGFzcyB7CisgIHN0ZDo6dW5pcXVlX3B0cjxDRkxBbmRlcnNBQVJlc3VsdD4gUmVzdWx0OworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIENGTEFuZGVyc0FBV3JhcHBlclBhc3MoKTsKKworICBDRkxBbmRlcnNBQVJlc3VsdCAmZ2V0UmVzdWx0KCkgeyByZXR1cm4gKlJlc3VsdDsgfQorICBjb25zdCBDRkxBbmRlcnNBQVJlc3VsdCAmZ2V0UmVzdWx0KCkgY29uc3QgeyByZXR1cm4gKlJlc3VsdDsgfQorCisgIHZvaWQgaW5pdGlhbGl6ZVBhc3MoKSBvdmVycmlkZTsKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vIGNyZWF0ZUNGTEFuZGVyc0FBV3JhcHBlclBhc3MgLSBUaGlzIHBhc3MgaW1wbGVtZW50cyBhIHNldC1iYXNlZCBhcHByb2FjaCB0bworLy8gYWxpYXMgYW5hbHlzaXMuCitJbW11dGFibGVQYXNzICpjcmVhdGVDRkxBbmRlcnNBQVdyYXBwZXJQYXNzKCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX0NGTEFOREVSU0FMSUFTQU5BTFlTSVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DRkxTdGVlbnNBbGlhc0FuYWx5c2lzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NGTFN0ZWVuc0FsaWFzQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZTllMjkwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DRkxTdGVlbnNBbGlhc0FuYWx5c2lzLmgKQEAgLTAsMCArMSwxNDMgQEAKKy8vPT0tIENGTFN0ZWVuc0FsaWFzQW5hbHlzaXMuaCAtIFVuaWZpY2F0aW9uLWJhc2VkIEFsaWFzIEFuYWx5c2lzIC0qLSBDKystKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIExMVk0ncyB1bmlmaWNhdGlvbi1iYXNlZCBhbGlhcyBhbmFseXNpcworLy8vIGltcGxlbWVudGVkIHdpdGggQ0ZMIGdyYXBoIHJlYWNoYWJpbGl0eS4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0NGTFNURUVOU0FMSUFTQU5BTFlTSVNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0NGTFNURUVOU0FMSUFTQU5BTFlTSVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ0ZMQWxpYXNBbmFseXNpc1V0aWxzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9NZW1vcnlMb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgPGZvcndhcmRfbGlzdD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mbzsKKworbmFtZXNwYWNlIGNmbGFhIHsKKworc3RydWN0IEFsaWFzU3VtbWFyeTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNmbGFhCisKK2NsYXNzIENGTFN0ZWVuc0FBUmVzdWx0IDogcHVibGljIEFBUmVzdWx0QmFzZTxDRkxTdGVlbnNBQVJlc3VsdD4geworICBmcmllbmQgQUFSZXN1bHRCYXNlPENGTFN0ZWVuc0FBUmVzdWx0PjsKKworICBjbGFzcyBGdW5jdGlvbkluZm87CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgQ0ZMU3RlZW5zQUFSZXN1bHQoY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gJlRMSSk7CisgIENGTFN0ZWVuc0FBUmVzdWx0KENGTFN0ZWVuc0FBUmVzdWx0ICYmQXJnKTsKKyAgfkNGTFN0ZWVuc0FBUmVzdWx0KCk7CisKKyAgLy8vIEhhbmRsZSBpbnZhbGlkYXRpb24gZXZlbnRzIGZyb20gdGhlIG5ldyBwYXNzIG1hbmFnZXIuCisgIC8vLworICAvLy8gQnkgZGVmaW5pdGlvbiwgdGhpcyByZXN1bHQgaXMgc3RhdGVsZXNzIGFuZCBzbyByZW1haW5zIHZhbGlkLgorICBib29sIGludmFsaWRhdGUoRnVuY3Rpb24gJiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJiwKKyAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyOjpJbnZhbGlkYXRvciAmKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBJbnNlcnRzIHRoZSBnaXZlbiBGdW5jdGlvbiBpbnRvIHRoZSBjYWNoZS4KKyAgdm9pZCBzY2FuKEZ1bmN0aW9uICpGbik7CisKKyAgdm9pZCBldmljdChGdW5jdGlvbiAqRm4pOworCisgIC8vLyBcYnJpZWYgRW5zdXJlcyB0aGF0IHRoZSBnaXZlbiBmdW5jdGlvbiBpcyBhdmFpbGFibGUgaW4gdGhlIGNhY2hlLgorICAvLy8gUmV0dXJucyB0aGUgYXBwcm9wcmlhdGUgZW50cnkgZnJvbSB0aGUgY2FjaGUuCisgIGNvbnN0IE9wdGlvbmFsPEZ1bmN0aW9uSW5mbz4gJmVuc3VyZUNhY2hlZChGdW5jdGlvbiAqRm4pOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBhbGlhcyBzdW1tYXJ5IGZvciB0aGUgZ2l2ZW4gZnVuY3Rpb24KKyAgLy8vIFJldHVybiBudWxscHRyIGlmIHRoZSBzdW1tYXJ5IGlzIG5vdCBmb3VuZCBvciBub3QgYXZhaWxhYmxlCisgIGNvbnN0IGNmbGFhOjpBbGlhc1N1bW1hcnkgKmdldEFsaWFzU3VtbWFyeShGdW5jdGlvbiAmRm4pOworCisgIEFsaWFzUmVzdWx0IHF1ZXJ5KGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2NBLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jQik7CisKKyAgQWxpYXNSZXN1bHQgYWxpYXMoY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvY0EsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2NCKSB7CisgICAgaWYgKExvY0EuUHRyID09IExvY0IuUHRyKQorICAgICAgcmV0dXJuIE11c3RBbGlhczsKKworICAgIC8vIENvbXBhcmlzb25zIGJldHdlZW4gZ2xvYmFsIHZhcmlhYmxlcyBhbmQgb3RoZXIgY29uc3RhbnRzIHNob3VsZCBiZQorICAgIC8vIGhhbmRsZWQgYnkgQmFzaWNBQS4KKyAgICAvLyBDRkxTdGVlbnNBQSBtYXkgcmVwb3J0IE5vQWxpYXMgd2hlbiBjb21wYXJpbmcgYSBHbG9iYWxWYWx1ZSBhbmQKKyAgICAvLyBDb25zdGFudEV4cHIsIGJ1dCBldmVyeSBxdWVyeSBuZWVkcyB0byBoYXZlIGF0IGxlYXN0IG9uZSBWYWx1ZSB0aWVkIHRvIGEKKyAgICAvLyBGdW5jdGlvbiwgYW5kIG5laXRoZXIgR2xvYmFsVmFsdWVzIG5vciBDb25zdGFudEV4cHJzIGFyZS4KKyAgICBpZiAoaXNhPENvbnN0YW50PihMb2NBLlB0cikgJiYgaXNhPENvbnN0YW50PihMb2NCLlB0cikpCisgICAgICByZXR1cm4gQUFSZXN1bHRCYXNlOjphbGlhcyhMb2NBLCBMb2NCKTsKKworICAgIEFsaWFzUmVzdWx0IFF1ZXJ5UmVzdWx0ID0gcXVlcnkoTG9jQSwgTG9jQik7CisgICAgaWYgKFF1ZXJ5UmVzdWx0ID09IE1heUFsaWFzKQorICAgICAgcmV0dXJuIEFBUmVzdWx0QmFzZTo6YWxpYXMoTG9jQSwgTG9jQik7CisKKyAgICByZXR1cm4gUXVlcnlSZXN1bHQ7CisgIH0KKworcHJpdmF0ZToKKyAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gJlRMSTsKKworICAvLy8gXGJyaWVmIENhY2hlZCBtYXBwaW5nIG9mIEZ1bmN0aW9ucyB0byB0aGVpciBTdHJhdGlmaWVkU2V0cy4KKyAgLy8vIElmIGEgZnVuY3Rpb24ncyBzZXRzIGFyZSBjdXJyZW50bHkgYmVpbmcgYnVpbHQsIGl0IGlzIG1hcmtlZAorICAvLy8gaW4gdGhlIGNhY2hlIGFzIGFuIE9wdGlvbmFsIHdpdGhvdXQgYSB2YWx1ZS4gVGhpcyB3YXksIGlmIHdlCisgIC8vLyBoYXZlIGFueSBraW5kIG9mIHJlY3Vyc2lvbiwgaXQgaXMgZGlzY2VybmFibGUgZnJvbSBhIGZ1bmN0aW9uCisgIC8vLyB0aGF0IHNpbXBseSBoYXMgZW1wdHkgc2V0cy4KKyAgRGVuc2VNYXA8RnVuY3Rpb24gKiwgT3B0aW9uYWw8RnVuY3Rpb25JbmZvPj4gQ2FjaGU7CisgIHN0ZDo6Zm9yd2FyZF9saXN0PGNmbGFhOjpGdW5jdGlvbkhhbmRsZTxDRkxTdGVlbnNBQVJlc3VsdD4+IEhhbmRsZXM7CisKKyAgRnVuY3Rpb25JbmZvIGJ1aWxkU2V0c0Zyb20oRnVuY3Rpb24gKkYpOworfTsKKworLy8vIEFuYWx5c2lzIHBhc3MgcHJvdmlkaW5nIGEgbmV2ZXItaW52YWxpZGF0ZWQgYWxpYXMgYW5hbHlzaXMgcmVzdWx0LgorLy8vCisvLy8gRklYTUU6IFdlIHJlYWxseSBzaG91bGQgcmVmYWN0b3IgQ0ZMIHRvIHVzZSB0aGUgYW5hbHlzaXMgbW9yZSBoZWF2aWx5LCBhbmQKKy8vLyBpbiBwYXJ0aWN1bGFyIHRvIGxldmVyYWdlIGludmFsaWRhdGlvbiB0byB0cmlnZ2VyIHJlLWNvbXB1dGF0aW9uIG9mIHNldHMuCitjbGFzcyBDRkxTdGVlbnNBQSA6IHB1YmxpYyBBbmFseXNpc0luZm9NaXhpbjxDRkxTdGVlbnNBQT4geworICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48Q0ZMU3RlZW5zQUE+OworCisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7CisKK3B1YmxpYzoKKyAgdXNpbmcgUmVzdWx0ID0gQ0ZMU3RlZW5zQUFSZXN1bHQ7CisKKyAgQ0ZMU3RlZW5zQUFSZXN1bHQgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIExlZ2FjeSB3cmFwcGVyIHBhc3MgdG8gcHJvdmlkZSB0aGUgQ0ZMU3RlZW5zQUFSZXN1bHQgb2JqZWN0LgorY2xhc3MgQ0ZMU3RlZW5zQUFXcmFwcGVyUGFzcyA6IHB1YmxpYyBJbW11dGFibGVQYXNzIHsKKyAgc3RkOjp1bmlxdWVfcHRyPENGTFN0ZWVuc0FBUmVzdWx0PiBSZXN1bHQ7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgQ0ZMU3RlZW5zQUFXcmFwcGVyUGFzcygpOworCisgIENGTFN0ZWVuc0FBUmVzdWx0ICZnZXRSZXN1bHQoKSB7IHJldHVybiAqUmVzdWx0OyB9CisgIGNvbnN0IENGTFN0ZWVuc0FBUmVzdWx0ICZnZXRSZXN1bHQoKSBjb25zdCB7IHJldHVybiAqUmVzdWx0OyB9CisKKyAgdm9pZCBpbml0aWFsaXplUGFzcygpIG92ZXJyaWRlOworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8gY3JlYXRlQ0ZMU3RlZW5zQUFXcmFwcGVyUGFzcyAtIFRoaXMgcGFzcyBpbXBsZW1lbnRzIGEgc2V0LWJhc2VkIGFwcHJvYWNoIHRvCisvLyBhbGlhcyBhbmFseXNpcy4KK0ltbXV0YWJsZVBhc3MgKmNyZWF0ZUNGTFN0ZWVuc0FBV3JhcHBlclBhc3MoKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfQ0ZMU1RFRU5TQUxJQVNBTkFMWVNJU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NHU0NDUGFzc01hbmFnZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ0dTQ0NQYXNzTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1N2Q1YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NHU0NDUGFzc01hbmFnZXIuaApAQCAtMCwwICsxLDg0MCBAQAorLy89PT0tIENHU0NDUGFzc01hbmFnZXIuaCAtIENhbGwgZ3JhcGggcGFzcyBtYW5hZ2VtZW50IC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vCisvLy8gVGhpcyBoZWFkZXIgcHJvdmlkZXMgY2xhc3NlcyBmb3IgbWFuYWdpbmcgcGFzc2VzIG92ZXIgU0NDcyBvZiB0aGUgY2FsbAorLy8vIGdyYXBoLiBUaGVzZSBwYXNzZXMgZm9ybSBhbiBpbXBvcnRhbnQgY29tcG9uZW50IG9mIExMVk0ncyBpbnRlcnByb2NlZHVyYWwKKy8vLyBvcHRpbWl6YXRpb25zLiBCZWNhdXNlIHRoZXkgb3BlcmF0ZSBvbiB0aGUgU0NDcyBvZiB0aGUgY2FsbCBncmFwaCwgYW5kIHRoZXkKKy8vLyB0cmF2ZXJzZSB0aGUgZ3JhcGggaW4gcG9zdC1vcmRlciwgdGhleSBjYW4gZWZmZWN0aXZlbHkgZG8gcGFpci13aXNlCisvLy8gaW50ZXJwcm9jZWR1cmFsIG9wdGltaXphdGlvbnMgZm9yIGFsbCBjYWxsIGVkZ2VzIGluIHRoZSBwcm9ncmFtIHdoaWxlCisvLy8gaW5jcmVtZW50YWxseSByZWZpbmluZyBpdCBhbmQgaW1wcm92aW5nIHRoZSBjb250ZXh0IG9mIHRoZXNlIHBhaXItd2lzZQorLy8vIG9wdGltaXphdGlvbnMuIEF0IGVhY2ggY2FsbCBzaXRlIGVkZ2UsIHRoZSBjYWxsZWUgaGFzIGFscmVhZHkgYmVlbgorLy8vIG9wdGltaXplZCBhcyBtdWNoIGFzIGlzIHBvc3NpYmxlLiBUaGlzIGluIHR1cm4gYWxsb3dzIHZlcnkgYWNjdXJhdGUKKy8vLyBhbmFseXNpcyBvZiBpdCBmb3IgSVBPLgorLy8vCisvLy8gQSBzZWNvbmRhcnkgbW9yZSBnZW5lcmFsIGdvYWwgaXMgdG8gYmUgYWJsZSB0byBpc29sYXRlIG9wdGltaXphdGlvbiBvbgorLy8vIHVucmVsYXRlZCBwYXJ0cyBvZiB0aGUgSVIgbW9kdWxlLiBUaGlzIGlzIHVzZWZ1bCB0byBlbnN1cmUgb3VyCisvLy8gb3B0aW1pemF0aW9ucyBhcmUgcHJpbmNpcGxlZCBhbmQgZG9uJ3QgbWlzcyBvcG9ydHVuaXRpZXMgd2hlcmUgcmVmaW5lbWVudAorLy8vIG9mIG9uZSBwYXJ0IG9mIHRoZSBtb2R1bGUgaW5mbHVlbmNlIHRyYW5zZm9ybWF0aW9ucyBpbiBhbm90aGVyIHBhcnQgb2YgdGhlCisvLy8gbW9kdWxlLiBCdXQgdGhpcyBpcyBhbHNvIHVzZWZ1bCBpZiB3ZSB3YW50IHRvIHBhcmFsbGVsaXplIHRoZSBvcHRpbWl6YXRpb25zCisvLy8gYWNyb3NzIGNvbW1vbiBsYXJnZSBtb2R1bGUgZ3JhcGggc2hhcGVzIHdoaWNoIHRlbmQgdG8gYmUgdmVyeSB3aWRlIGFuZCBoYXZlCisvLy8gbGFyZ2UgcmVnaW9ucyBvZiB1bnJlbGF0ZWQgY2xpcXVlcy4KKy8vLworLy8vIFRvIHNhdGlzZnkgdGhlc2UgZ29hbHMsIHdlIHVzZSB0aGUgTGF6eUNhbGxHcmFwaCB3aGljaCBwcm92aWRlcyB0d28gZ3JhcGhzCisvLy8gbmVzdGVkIGluc2lkZSBlYWNoIG90aGVyIChhbmQgYnVpbHQgbGF6aWx5IGZyb20gdGhlIGJvdHRvbS11cCk6IHRoZSBjYWxsCisvLy8gZ3JhcGggcHJvcGVyLCBhbmQgYSByZWZlcmVuY2UgZ3JhcGguIFRoZSByZWZlcmVuY2UgZ3JhcGggaXMgc3VwZXIgc2V0IG9mCisvLy8gdGhlIGNhbGwgZ3JhcGggYW5kIGlzIGEgY29uc2VydmF0aXZlIGFwcHJveGltYXRpb24gb2Ygd2hhdCBjb3VsZCB0aHJvdWdoCisvLy8gc2NhbGFyIG9yIENHU0NDIHRyYW5zZm9ybXMgKmJlY29tZSogdGhlIGNhbGwgZ3JhcGguIFVzaW5nIHRoaXMgYWxsb3dzIHVzIHRvCisvLy8gZW5zdXJlIHdlIG9wdGltaXplIGZ1bmN0aW9ucyBwcmlvciB0byB0aGVtIGJlaW5nIGludHJvZHVjZWQgaW50byB0aGUgY2FsbAorLy8vIGdyYXBoIGJ5IGRldmlydHVhbGl6YXRpb24gb3Igb3RoZXIgdGVjaG5pcXVlLCBhbmQgdGh1cyBlbnN1cmVzIHRoYXQKKy8vLyBzdWJzZXF1ZW50IHBhaXItd2lzZSBpbnRlcnByb2NlZHVyYWwgb3B0aW1pemF0aW9ucyBvYnNlcnZlIHRoZSBvcHRpbWl6ZWQKKy8vLyBmb3JtIG9mIHRoZXNlIGZ1bmN0aW9ucy4gVGhlIChwb3RlbnRpYWxseSB0cmFuc2l0aXZlKSByZWZlcmVuY2UKKy8vLyByZWFjaGFiaWxpdHkgdXNlZCBieSB0aGUgcmVmZXJlbmNlIGdyYXBoIGlzIGEgY29uc2VydmF0aXZlIGFwcHJveGltYXRpb24KKy8vLyB0aGF0IHN0aWxsIGFsbG93cyB1cyB0byBoYXZlIGluZGVwZW5kZW50IHJlZ2lvbnMgb2YgdGhlIGdyYXBoLgorLy8vCisvLy8gRklYTUU6IFRoZXJlIGlzIG9uZSBtYWpvciBkcmF3YmFjayBvZiB0aGUgcmVmZXJlbmNlIGdyYXBoOiBpbiBpdHMgbmFpdmUKKy8vLyBmb3JtIGl0IGlzIHF1YWRyYXRpYyBiZWNhdXNlIGl0IGNvbnRhaW5zIGEgZGlzdGluY3QgZWRnZSBmb3IgZWFjaAorLy8vIChwb3RlbnRpYWxseSBpbmRpcmVjdCkgcmVmZXJlbmNlLCBldmVuIGlmIGFyZSBhbGwgdGhyb3VnaCBzb21lIGNvbW1vbgorLy8vIGdsb2JhbCB0YWJsZSBvZiBmdW5jdGlvbiBwb2ludGVycy4gVGhpcyBjYW4gYmUgZml4ZWQgaW4gYSBudW1iZXIgb2Ygd2F5cworLy8vIHRoYXQgZXNzZW50aWFsbHkgcHJlc2VydmUgZW5vdWdoIG9mIHRoZSBub3JtYWxpemF0aW9uLiBXaGlsZSBpdCBpc24ndAorLy8vIGV4cGVjdGVkIHRvIGNvbXBsZXRlbHkgcHJlY2x1ZGUgdGhlIHVzYWJpbGl0eSBvZiB0aGlzLCBpdCB3aWxsIG5lZWQgdG8gYmUKKy8vLyBhZGRyZXNzZWQuCisvLy8KKy8vLworLy8vIEFsbCBvZiB0aGVzZSBpc3N1ZXMgYXJlIG1hZGUgc3Vic3RhbnRpYWxseSBtb3JlIGNvbXBsZXggaW4gdGhlIGZhY2Ugb2YKKy8vLyBtdXRhdGlvbnMgdG8gdGhlIGNhbGwgZ3JhcGggd2hpbGUgb3B0aW1pemF0aW9uIHBhc3NlcyBhcmUgYmVpbmcgcnVuLiBXaGVuCisvLy8gbXV0YXRpb25zIHRvIHRoZSBjYWxsIGdyYXBoIG9jY3VyIHdlIHdhbnQgdG8gYWNoaWV2ZSB0d28gZGlmZmVyZW50IHRoaW5nczoKKy8vLworLy8vIC0gV2UgbmVlZCB0byB1cGRhdGUgdGhlIGNhbGwgZ3JhcGggaW4tZmxpZ2h0IGFuZCBpbnZhbGlkYXRlIGFuYWx5c2VzCisvLy8gICBjYWNoZWQgb24gZW50aXRpZXMgaW4gdGhlIGdyYXBoLiBCZWNhdXNlIG9mIHRoZSBjYWNoZS1iYXNlZCBhbmFseXNpcworLy8vICAgZGVzaWduIG9mIHRoZSBwYXNzIG1hbmFnZXIsIGl0IGlzIGVzc2VudGlhbCB0byBoYXZlIHN0YWJsZSBpZGVudGl0aWVzIGZvcgorLy8vICAgdGhlIGVsZW1lbnRzIG9mIHRoZSBJUiB0aGF0IHBhc3NlcyB0cmF2ZXJzZSwgYW5kIHRvIGludmFsaWRhdGUgYW55CisvLy8gICBhbmFseXNlcyBjYWNoZWQgb24gdGhlc2UgZWxlbWVudHMgYXMgdGhlIG11dGF0aW9ucyB0YWtlIHBsYWNlLgorLy8vCisvLy8gLSBXZSB3YW50IHRvIHByZXNlcnZlIHRoZSBpbmNyZW1lbnRhbCBhbmQgcG9zdC1vcmRlciB0cmF2ZXJzYWwgb2YgdGhlCisvLy8gICBncmFwaCBldmVuIGFzIGl0IGlzIHJlZmluZWQgYW5kIG11dGF0ZWQuIFRoaXMgbWVhbnMgd2Ugd2FudCBvcHRpbWl6YXRpb24KKy8vLyAgIHRvIG9ic2VydmUgdGhlIG1vc3QgcmVmaW5lZCBmb3JtIG9mIHRoZSBjYWxsIGdyYXBoIGFuZCB0byBkbyBzbyBpbgorLy8vICAgcG9zdC1vcmRlci4KKy8vLworLy8vIFRvIGFkZHJlc3MgdGhpcywgdGhlIENHU0NDIG1hbmFnZXIgdXNlcyBib3RoIHdvcmtsaXN0cyB0aGF0IGNhbiBiZSBleHBhbmRlZAorLy8vIGJ5IHBhc3NlcyB3aGljaCB0cmFuc2Zvcm0gdGhlIElSLCBhbmQgcHJvdmlkZXMgaW52YWxpZGF0aW9uIHRlc3RzIHRvIHNraXAKKy8vLyBlbnRyaWVzIHRoYXQgYmVjb21lIGRlYWQuIFRoaXMgZXh0cmEgZGF0YSBpcyBwcm92aWRlZCB0byBldmVyeSBTQ0MgcGFzcyBzbworLy8vIHRoYXQgaXQgY2FuIGNhcmVmdWxseSB1cGRhdGUgdGhlIG1hbmFnZXIncyB0cmF2ZXJzYWwgYXMgdGhlIGNhbGwgZ3JhcGgKKy8vLyBtdXRhdGVzLgorLy8vCisvLy8gV2UgYWxzbyBwcm92aWRlIHN1cHBvcnQgZm9yIHJ1bm5pbmcgZnVuY3Rpb24gcGFzc2VzIHdpdGhpbiB0aGUgQ0dTQ0Mgd2FsaywKKy8vLyBhbmQgdGhlcmUgd2UgcHJvdmlkZSBhdXRvbWF0aWMgdXBkYXRlIG9mIHRoZSBjYWxsIGdyYXBoIGluY2x1ZGluZyBvZiB0aGUKKy8vLyBwYXNzIG1hbmFnZXIgdG8gcmVmbGVjdCBjYWxsIGdyYXBoIGNoYW5nZXMgdGhhdCBmYWxsIG91dCBuYXR1cmFsbHkgYXMgcGFydAorLy8vIG9mIHNjYWxhciB0cmFuc2Zvcm1hdGlvbnMuCisvLy8KKy8vLyBUaGUgcGF0dGVybnMgdXNlZCB0byBlbnN1cmUgdGhlIGdvYWxzIG9mIHBvc3Qtb3JkZXIgdmlzaXRhdGlvbiBvZiB0aGUgZnVsbHkKKy8vLyByZWZpbmVkIGdyYXBoOgorLy8vCisvLy8gMSkgU2luayB0b3dhcmQgdGhlICJib3R0b20iIGFzIHRoZSBncmFwaCBpcyByZWZpbmVkLiBUaGlzIG1lYW5zIHRoYXQgYW55CisvLy8gICAgaXRlcmF0aW9uIGNvbnRpbnVlcyBpbiBzb21lIHZhbGlkIHBvc3Qtb3JkZXIgc2VxdWVuY2UgYWZ0ZXIgdGhlIG11dGF0aW9uCisvLy8gICAgaGFzIGFsdGVyZWQgdGhlIHN0cnVjdHVyZS4KKy8vLworLy8vIDIpIEVucXVldWUgaW4gcG9zdC1vcmRlciwgaW5jbHVkaW5nIHRoZSBjdXJyZW50IGVudGl0eS4gSWYgdGhlIGN1cnJlbnQKKy8vLyAgICBlbnRpdHkncyBzaGFwZSBjaGFuZ2VzLCBpdCBhbmQgZXZlcnl0aGluZyBhZnRlciBpdCBpbiBwb3N0LW9yZGVyIG5lZWRzCisvLy8gICAgdG8gYmUgdmlzaXRlZCB0byBvYnNlcnZlIHRoYXQgc2hhcGUuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19DR1NDQ1BBU1NNQU5BR0VSX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19DR1NDQ1BBU1NNQU5BR0VSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUHJpb3JpdHlXb3JrbGlzdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xhenlDYWxsR3JhcGguaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK3N0cnVjdCBDR1NDQ1VwZGF0ZVJlc3VsdDsKK2NsYXNzIE1vZHVsZTsKKworLy8gQWxsb3cgZGVidWcgbG9nZ2luZyBpbiB0aGlzIGlubGluZSBmdW5jdGlvbi4KKyNkZWZpbmUgREVCVUdfVFlQRSAiY2dzY2MiCisKKy8vLyBFeHRlcm4gdGVtcGxhdGUgZGVjbGFyYXRpb24gZm9yIHRoZSBhbmFseXNpcyBzZXQgZm9yIHRoaXMgSVIgdW5pdC4KK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBBbGxBbmFseXNlc09uPExhenlDYWxsR3JhcGg6OlNDQz47CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBBbmFseXNpc01hbmFnZXI8TGF6eUNhbGxHcmFwaDo6U0NDLCBMYXp5Q2FsbEdyYXBoICY+OworCisvLy8gXGJyaWVmIFRoZSBDR1NDQyBhbmFseXNpcyBtYW5hZ2VyLgorLy8vCisvLy8gU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgQW5hbHlzaXNNYW5hZ2VyIHRlbXBsYXRlIGZvciBkZXRhaWwKKy8vLyBkb2N1bWVudGF0aW9uLiBUaGlzIHR5cGUgc2VydmVzIGFzIGEgY29udmVuaWVudCB3YXkgdG8gcmVmZXIgdG8gdGhpcworLy8vIGNvbnN0cnVjdCBpbiB0aGUgYWRhcHRvcnMgYW5kIHByb3hpZXMgdXNlZCB0byBpbnRlZ3JhdGUgdGhpcyBpbnRvIHRoZSBsYXJnZXIKKy8vLyBwYXNzIG1hbmFnZXIgaW5mcmFzdHJ1Y3R1cmUuCit1c2luZyBDR1NDQ0FuYWx5c2lzTWFuYWdlciA9CisgICAgQW5hbHlzaXNNYW5hZ2VyPExhenlDYWxsR3JhcGg6OlNDQywgTGF6eUNhbGxHcmFwaCAmPjsKKworLy8gRXhwbGljaXQgc3BlY2lhbGl6YXRpb24gYW5kIGluc3RhbnRpYXRpb24gZGVjbGFyYXRpb25zIGZvciB0aGUgcGFzcyBtYW5hZ2VyLgorLy8gU2VlIHRoZSBjb21tZW50cyBvbiB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgc3BlY2lhbGl6YXRpb24gZm9yIGRldGFpbHMgb24gaG93CisvLyBpdCBkaWZmZXJzIGZyb20gdGhlIHByaW1hcnkgdGVtcGxhdGUuCit0ZW1wbGF0ZSA8PgorUHJlc2VydmVkQW5hbHlzZXMKK1Bhc3NNYW5hZ2VyPExhenlDYWxsR3JhcGg6OlNDQywgQ0dTQ0NBbmFseXNpc01hbmFnZXIsIExhenlDYWxsR3JhcGggJiwKKyAgICAgICAgICAgIENHU0NDVXBkYXRlUmVzdWx0ICY+OjpydW4oTGF6eUNhbGxHcmFwaDo6U0NDICZJbml0aWFsQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dTQ0NBbmFseXNpc01hbmFnZXIgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYXp5Q2FsbEdyYXBoICZHLCBDR1NDQ1VwZGF0ZVJlc3VsdCAmVVIpOworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIFBhc3NNYW5hZ2VyPExhenlDYWxsR3JhcGg6OlNDQywgQ0dTQ0NBbmFseXNpc01hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF6eUNhbGxHcmFwaCAmLCBDR1NDQ1VwZGF0ZVJlc3VsdCAmPjsKKworLy8vIFxicmllZiBUaGUgQ0dTQ0MgcGFzcyBtYW5hZ2VyLgorLy8vCisvLy8gU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUgUGFzc01hbmFnZXIgdGVtcGxhdGUgZm9yIGRldGFpbHMuIEl0IHJ1bnMKKy8vLyBhIHNlcXVlbmNlIG9mIFNDQyBwYXNzZXMgb3ZlciBlYWNoIFNDQyB0aGF0IHRoZSBtYW5hZ2VyIGlzIHJ1biBvdmVyLiBUaGlzCisvLy8gdHlwZSBzZXJ2ZXMgYXMgYSBjb252ZW5pZW50IHdheSB0byByZWZlciB0byB0aGlzIGNvbnN0cnVjdC4KK3VzaW5nIENHU0NDUGFzc01hbmFnZXIgPQorICAgIFBhc3NNYW5hZ2VyPExhenlDYWxsR3JhcGg6OlNDQywgQ0dTQ0NBbmFseXNpc01hbmFnZXIsIExhenlDYWxsR3JhcGggJiwKKyAgICAgICAgICAgICAgICBDR1NDQ1VwZGF0ZVJlc3VsdCAmPjsKKworLy8vIEFuIGV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIG9mIHRoZSByZXF1aXJlIGFuYWx5c2lzIHRlbXBsYXRlIHBhc3MuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQW5hbHlzaXNUPgorc3RydWN0IFJlcXVpcmVBbmFseXNpc1Bhc3M8QW5hbHlzaXNULCBMYXp5Q2FsbEdyYXBoOjpTQ0MsIENHU0NDQW5hbHlzaXNNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF6eUNhbGxHcmFwaCAmLCBDR1NDQ1VwZGF0ZVJlc3VsdCAmPgorICAgIDogUGFzc0luZm9NaXhpbjxSZXF1aXJlQW5hbHlzaXNQYXNzPEFuYWx5c2lzVCwgTGF6eUNhbGxHcmFwaDo6U0NDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHU0NDQW5hbHlzaXNNYW5hZ2VyLCBMYXp5Q2FsbEdyYXBoICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0dTQ0NVcGRhdGVSZXN1bHQgJj4+IHsKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKExhenlDYWxsR3JhcGg6OlNDQyAmQywgQ0dTQ0NBbmFseXNpc01hbmFnZXIgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgTGF6eUNhbGxHcmFwaCAmQ0csIENHU0NDVXBkYXRlUmVzdWx0ICYpIHsKKyAgICAodm9pZClBTS50ZW1wbGF0ZSBnZXRSZXN1bHQ8QW5hbHlzaXNUPihDLCBDRyk7CisgICAgcmV0dXJuIFByZXNlcnZlZEFuYWx5c2VzOjphbGwoKTsKKyAgfQorfTsKKworLy8vIEEgcHJveHkgZnJvbSBhIFxjIENHU0NDQW5hbHlzaXNNYW5hZ2VyIHRvIGEgXGMgTW9kdWxlLgordXNpbmcgQ0dTQ0NBbmFseXNpc01hbmFnZXJNb2R1bGVQcm94eSA9CisgICAgSW5uZXJBbmFseXNpc01hbmFnZXJQcm94eTxDR1NDQ0FuYWx5c2lzTWFuYWdlciwgTW9kdWxlPjsKKworLy8vIFdlIG5lZWQgYSBzcGVjaWFsaXplZCByZXN1bHQgZm9yIHRoZSBcYyBDR1NDQ0FuYWx5c2lzTWFuYWdlck1vZHVsZVByb3h5IHNvCisvLy8gaXQgY2FuIGhhdmUgYWNjZXNzIHRvIHRoZSBjYWxsIGdyYXBoIGluIG9yZGVyIHRvIHdhbGsgYWxsIHRoZSBTQ0NzIHdoZW4KKy8vLyBpbnZhbGlkYXRpbmcgdGhpbmdzLgordGVtcGxhdGUgPD4gY2xhc3MgQ0dTQ0NBbmFseXNpc01hbmFnZXJNb2R1bGVQcm94eTo6UmVzdWx0IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgUmVzdWx0KENHU0NDQW5hbHlzaXNNYW5hZ2VyICZJbm5lckFNLCBMYXp5Q2FsbEdyYXBoICZHKQorICAgICAgOiBJbm5lckFNKCZJbm5lckFNKSwgRygmRykge30KKworICAvLy8gXGJyaWVmIEFjY2Vzc29yIGZvciB0aGUgYW5hbHlzaXMgbWFuYWdlci4KKyAgQ0dTQ0NBbmFseXNpc01hbmFnZXIgJmdldE1hbmFnZXIoKSB7IHJldHVybiAqSW5uZXJBTTsgfQorCisgIC8vLyBcYnJpZWYgSGFuZGxlciBmb3IgaW52YWxpZGF0aW9uIG9mIHRoZSBNb2R1bGUuCisgIC8vLworICAvLy8gSWYgdGhlIHByb3h5IGFuYWx5c2lzIGl0c2VsZiBpcyBwcmVzZXJ2ZWQsIHRoZW4gd2UgYXNzdW1lIHRoYXQgdGhlIHNldCBvZgorICAvLy8gU0NDcyBpbiB0aGUgTW9kdWxlIGhhc24ndCBjaGFuZ2VkLiBUaHVzIGFueSBwb2ludGVycyB0byBTQ0NzIGluIHRoZQorICAvLy8gQ0dTQ0NBbmFseXNpc01hbmFnZXIgYXJlIHN0aWxsIHZhbGlkLCBhbmQgd2UgZG9uJ3QgbmVlZCB0byBjYWxsIFxjIGNsZWFyCisgIC8vLyBvbiB0aGUgQ0dTQ0NBbmFseXNpc01hbmFnZXIuCisgIC8vLworICAvLy8gUmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoaXMgYW5hbHlzaXMgaXMgbWFya2VkIGFzIHByZXNlcnZlZCwgYWxsIG9mIHRoZQorICAvLy8gYW5hbHlzZXMgaW4gdGhlIFxjIENHU0NDQW5hbHlzaXNNYW5hZ2VyIGFyZSBwb3RlbnRpYWxseSBpbnZhbGlkYXRlZCBiYXNlZAorICAvLy8gb24gdGhlIHNldCBvZiBwcmVzZXJ2ZWQgYW5hbHlzZXMuCisgIGJvb2wgaW52YWxpZGF0ZShNb2R1bGUgJk0sIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzICZQQSwKKyAgICAgICAgICAgICAgICAgIE1vZHVsZUFuYWx5c2lzTWFuYWdlcjo6SW52YWxpZGF0b3IgJkludik7CisKK3ByaXZhdGU6CisgIENHU0NDQW5hbHlzaXNNYW5hZ2VyICpJbm5lckFNOworICBMYXp5Q2FsbEdyYXBoICpHOworfTsKKworLy8vIFByb3ZpZGUgYSBzcGVjaWFsaXplZCBydW4gbWV0aG9kIGZvciB0aGUgXGMgQ0dTQ0NBbmFseXNpc01hbmFnZXJNb2R1bGVQcm94eQorLy8vIHNvIGl0IGNhbiBwYXNzIHRoZSBsYXp5IGNhbGwgZ3JhcGggdG8gdGhlIHJlc3VsdC4KK3RlbXBsYXRlIDw+CitDR1NDQ0FuYWx5c2lzTWFuYWdlck1vZHVsZVByb3h5OjpSZXN1bHQKK0NHU0NDQW5hbHlzaXNNYW5hZ2VyTW9kdWxlUHJveHk6OnJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworCisvLyBFbnN1cmUgdGhlIFxjIENHU0NDQW5hbHlzaXNNYW5hZ2VyTW9kdWxlUHJveHkgaXMgcHJvdmlkZWQgYXMgYW4gZXh0ZXJuCisvLyB0ZW1wbGF0ZS4KK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBJbm5lckFuYWx5c2lzTWFuYWdlclByb3h5PENHU0NDQW5hbHlzaXNNYW5hZ2VyLCBNb2R1bGU+OworCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgT3V0ZXJBbmFseXNpc01hbmFnZXJQcm94eTwKKyAgICBNb2R1bGVBbmFseXNpc01hbmFnZXIsIExhenlDYWxsR3JhcGg6OlNDQywgTGF6eUNhbGxHcmFwaCAmPjsKKworLy8vIEEgcHJveHkgZnJvbSBhIFxjIE1vZHVsZUFuYWx5c2lzTWFuYWdlciB0byBhbiBcYyBTQ0MuCit1c2luZyBNb2R1bGVBbmFseXNpc01hbmFnZXJDR1NDQ1Byb3h5ID0KKyAgICBPdXRlckFuYWx5c2lzTWFuYWdlclByb3h5PE1vZHVsZUFuYWx5c2lzTWFuYWdlciwgTGF6eUNhbGxHcmFwaDo6U0NDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF6eUNhbGxHcmFwaCAmPjsKKworLy8vIFN1cHBvcnQgc3RydWN0dXJlIGZvciBTQ0MgcGFzc2VzIHRvIGNvbW11bmljYXRlIHVwZGF0ZXMgdGhlIGNhbGwgZ3JhcGggYmFjaworLy8vIHRvIHRoZSBDR1NDQyBwYXNzIG1hbmFnZXIgaW5mcnNhdHJ1Y3R1cmUuCisvLy8KKy8vLyBUaGUgQ0dTQ0MgcGFzcyBtYW5hZ2VyIHJ1bnMgU0NDIHBhc3NlcyB3aGljaCBhcmUgYWxsb3dlZCB0byB1cGRhdGUgdGhlIGNhbGwKKy8vLyBncmFwaCBhbmQgU0NDIHN0cnVjdHVyZXMuIFRoaXMgbWVhbnMgdGhlIHN0cnVjdHVyZSB0aGUgcGFzcyBtYW5hZ2VyIHdvcmtzCisvLy8gb24gaXMgbXV0YXRpbmcgdW5kZXJuZWF0aCBpdC4gSW4gb3JkZXIgdG8gc3VwcG9ydCB0aGF0LCB0aGVyZSBuZWVkcyB0byBiZQorLy8vIGNhcmVmdWwgY29tbXVuaWNhdGlvbiBhYm91dCB0aGUgcHJlY2lzZSBuYXR1cmUgYW5kIHJhbWlmaWNhdGlvbnMgb2YgdGhlc2UKKy8vLyB1cGRhdGVzIHRvIHRoZSBwYXNzIG1hbmFnZW1lbnQgaW5mcmFzdHJ1Y3R1cmUuCisvLy8KKy8vLyBBbGwgU0NDIHBhc3NlcyB3aWxsIGhhdmUgdG8gYWNjZXB0IGEgcmVmZXJlbmNlIHRvIHRoZSBtYW5hZ2VtZW50IGxheWVyJ3MKKy8vLyB1cGRhdGUgcmVzdWx0IHN0cnVjdCBhbmQgdXNlIGl0IHRvIHJlZmxlY3QgdGhlIHJlc3VsdHMgb2YgYW55IENHIHVwZGF0ZXMKKy8vLyBwZXJmb3JtZWQuCisvLy8KKy8vLyBQYXNzZXMgd2hpY2ggZG8gbm90IGNoYW5nZSB0aGUgY2FsbCBncmFwaCBzdHJ1Y3R1cmUgaW4gYW55IHdheSBjYW4ganVzdAorLy8vIGlnbm9yZSB0aGlzIGFyZ3VtZW50IHRvIHRoZWlyIHJ1biBtZXRob2QuCitzdHJ1Y3QgQ0dTQ0NVcGRhdGVSZXN1bHQgeworICAvLy8gV29ya2xpc3Qgb2YgdGhlIFJlZlNDQ3MgcXVldWVkIGZvciBwcm9jZXNzaW5nLgorICAvLy8KKyAgLy8vIFdoZW4gYSBwYXNzIHJlZmluZXMgdGhlIGdyYXBoIGFuZCBjcmVhdGVzIG5ldyBSZWZTQ0NzIG9yIGNhdXNlcyB0aGVtIHRvCisgIC8vLyBoYXZlIGEgZGlmZmVyZW50IHNoYXBlIG9yIHNldCBvZiBjb21wb25lbnQgU0NDcyBpdCBzaG91bGQgYWRkIHRoZSBSZWZTQ0NzCisgIC8vLyB0byB0aGlzIHdvcmtsaXN0IHNvIHRoYXQgd2UgdmlzaXQgdGhlbSBpbiB0aGUgcmVmaW5lZCBmb3JtLgorICAvLy8KKyAgLy8vIFRoaXMgd29ya2xpc3QgaXMgaW4gcmV2ZXJzZSBwb3N0LW9yZGVyLCBhcyB3ZSBwb3Agb2ZmIHRoZSBiYWNrIGluIG9yZGVyCisgIC8vLyB0byBvYnNlcnZlIFJlZlNDQ3MgaW4gcG9zdC1vcmRlci4gV2hlbiBhZGRpbmcgUmVmU0NDcywgY2xpZW50cyBzaG91bGQgYWRkCisgIC8vLyB0aGVtIGluIHJldmVyc2UgcG9zdC1vcmRlci4KKyAgU21hbGxQcmlvcml0eVdvcmtsaXN0PExhenlDYWxsR3JhcGg6OlJlZlNDQyAqLCAxPiAmUkNXb3JrbGlzdDsKKworICAvLy8gV29ya2xpc3Qgb2YgdGhlIFNDQ3MgcXVldWVkIGZvciBwcm9jZXNzaW5nLgorICAvLy8KKyAgLy8vIFdoZW4gYSBwYXNzIHJlZmluZXMgdGhlIGdyYXBoIGFuZCBjcmVhdGVzIG5ldyBTQ0NzIG9yIGNhdXNlcyB0aGVtIHRvIGhhdmUKKyAgLy8vIGEgZGlmZmVyZW50IHNoYXBlIG9yIHNldCBvZiBjb21wb25lbnQgZnVuY3Rpb25zIGl0IHNob3VsZCBhZGQgdGhlIFNDQ3MgdG8KKyAgLy8vIHRoaXMgd29ya2xpc3Qgc28gdGhhdCB3ZSB2aXNpdCB0aGVtIGluIHRoZSByZWZpbmVkIGZvcm0uCisgIC8vLworICAvLy8gTm90ZSB0aGF0IGlmIHRoZSBTQ0NzIGFyZSBwYXJ0IG9mIGEgUmVmU0NDIHRoYXQgaXMgYWRkZWQgdG8gdGhlIFxjCisgIC8vLyBSQ1dvcmtsaXN0LCB0aGV5IGRvbid0IG5lZWQgdG8gYmUgYWRkZWQgaGVyZSBhcyB2aXNpdGluZyB0aGUgUmVmU0NDIHdpbGwKKyAgLy8vIGJlIHN1ZmZpY2llbnQgdG8gcmUtdmlzaXQgdGhlIFNDQ3Mgd2l0aGluIGl0LgorICAvLy8KKyAgLy8vIFRoaXMgd29ya2xpc3QgaXMgaW4gcmV2ZXJzZSBwb3N0LW9yZGVyLCBhcyB3ZSBwb3Agb2ZmIHRoZSBiYWNrIGluIG9yZGVyCisgIC8vLyB0byBvYnNlcnZlIFNDQ3MgaW4gcG9zdC1vcmRlci4gV2hlbiBhZGRpbmcgU0NDcywgY2xpZW50cyBzaG91bGQgYWRkIHRoZW0KKyAgLy8vIGluIHJldmVyc2UgcG9zdC1vcmRlci4KKyAgU21hbGxQcmlvcml0eVdvcmtsaXN0PExhenlDYWxsR3JhcGg6OlNDQyAqLCAxPiAmQ1dvcmtsaXN0OworCisgIC8vLyBUaGUgc2V0IG9mIGludmFsaWRhdGVkIFJlZlNDQ3Mgd2hpY2ggc2hvdWxkIGJlIHNraXBwZWQgaWYgdGhleSBhcmUgZm91bmQKKyAgLy8vIGluIFxjIFJDV29ya2xpc3QuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIHRvIHF1aWNrbHkgcHJ1bmUgb3V0IFJlZlNDQ3Mgd2hlbiB0aGV5IGdldCBkZWxldGVkIGFuZAorICAvLy8gaGFwcGVuIHRvIGFscmVhZHkgYmUgb24gdGhlIHdvcmtsaXN0LiBXZSB1c2UgdGhpcyBwcmltYXJpbHkgdG8gYXZvaWQKKyAgLy8vIHNjYW5uaW5nIHRoZSBsaXN0IGFuZCByZW1vdmluZyBlbnRyaWVzIGZyb20gaXQuCisgIFNtYWxsUHRyU2V0SW1wbDxMYXp5Q2FsbEdyYXBoOjpSZWZTQ0MgKj4gJkludmFsaWRhdGVkUmVmU0NDczsKKworICAvLy8gVGhlIHNldCBvZiBpbnZhbGlkYXRlZCBTQ0NzIHdoaWNoIHNob3VsZCBiZSBza2lwcGVkIGlmIHRoZXkgYXJlIGZvdW5kCisgIC8vLyBpbiBcYyBDV29ya2xpc3QuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIHRvIHF1aWNrbHkgcHJ1bmUgb3V0IFNDQ3Mgd2hlbiB0aGV5IGdldCBkZWxldGVkIGFuZCBoYXBwZW4KKyAgLy8vIHRvIGFscmVhZHkgYmUgb24gdGhlIHdvcmtsaXN0LiBXZSB1c2UgdGhpcyBwcmltYXJpbHkgdG8gYXZvaWQgc2Nhbm5pbmcKKyAgLy8vIHRoZSBsaXN0IGFuZCByZW1vdmluZyBlbnRyaWVzIGZyb20gaXQuCisgIFNtYWxsUHRyU2V0SW1wbDxMYXp5Q2FsbEdyYXBoOjpTQ0MgKj4gJkludmFsaWRhdGVkU0NDczsKKworICAvLy8gSWYgbm9uLW51bGwsIHRoZSB1cGRhdGVkIGN1cnJlbnQgXGMgUmVmU0NDIGJlaW5nIHByb2Nlc3NlZC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHNldCB3aGVuIGEgZ3JhcGggcmVmaW5lbWVudCB0YWtlcyBwbGFjZSBhbiB0aGUgImN1cnJlbnQiIHBvaW50IGluCisgIC8vLyB0aGUgZ3JhcGggbW92ZXMgImRvd24iIG9yIGVhcmxpZXIgaW4gdGhlIHBvc3Qtb3JkZXIgd2Fsay4gVGhpcyB3aWxsIG9mdGVuCisgIC8vLyBjYXVzZSB0aGUgImN1cnJlbnQiIFJlZlNDQyB0byBiZSBhIG5ld2x5IGNyZWF0ZWQgUmVmU0NDIG9iamVjdCBhbmQgdGhlCisgIC8vLyBvbGQgb25lIHRvIGJlIGFkZGVkIHRvIHRoZSBhYm92ZSB3b3JrbGlzdC4gV2hlbiB0aGF0IGhhcHBlbnMsIHRoaXMKKyAgLy8vIHBvaW50ZXIgaXMgbm9uLW51bGwgYW5kIGNhbiBiZSB1c2VkIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcgdGhlICJ0b3AiIG9mCisgIC8vLyB0aGUgcG9zdC1vcmRlciB3YWxrLgorICBMYXp5Q2FsbEdyYXBoOjpSZWZTQ0MgKlVwZGF0ZWRSQzsKKworICAvLy8gSWYgbm9uLW51bGwsIHRoZSB1cGRhdGVkIGN1cnJlbnQgXGMgU0NDIGJlaW5nIHByb2Nlc3NlZC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHNldCB3aGVuIGEgZ3JhcGggcmVmaW5lbWVudCB0YWtlcyBwbGFjZSBhbiB0aGUgImN1cnJlbnQiIHBvaW50IGluCisgIC8vLyB0aGUgZ3JhcGggbW92ZXMgImRvd24iIG9yIGVhcmxpZXIgaW4gdGhlIHBvc3Qtb3JkZXIgd2Fsay4gVGhpcyB3aWxsIG9mdGVuCisgIC8vLyBjYXVzZSB0aGUgImN1cnJlbnQiIFNDQyB0byBiZSBhIG5ld2x5IGNyZWF0ZWQgU0NDIG9iamVjdCBhbmQgdGhlIG9sZCBvbmUKKyAgLy8vIHRvIGJlIGFkZGVkIHRvIHRoZSBhYm92ZSB3b3JrbGlzdC4gV2hlbiB0aGF0IGhhcHBlbnMsIHRoaXMgcG9pbnRlciBpcworICAvLy8gbm9uLW51bGwgYW5kIGNhbiBiZSB1c2VkIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcgdGhlICJ0b3AiIG9mIHRoZQorICAvLy8gcG9zdC1vcmRlciB3YWxrLgorICBMYXp5Q2FsbEdyYXBoOjpTQ0MgKlVwZGF0ZWRDOworCisgIC8vLyBBIGhhY2t5IGFyZWEgd2hlcmUgdGhlIGlubGluZXIgY2FuIHJldGFpbiBoaXN0b3J5IGFib3V0IGlubGluaW5nCisgIC8vLyBkZWNpc2lvbnMgdGhhdCBtdXRhdGVkIHRoZSBjYWxsIGdyYXBoJ3MgU0NDIHN0cnVjdHVyZSBpbiBvcmRlciB0byBhdm9pZAorICAvLy8gaW5maW5pdGUgaW5saW5pbmcuIFNlZSB0aGUgY29tbWVudHMgaW4gdGhlIGlubGluZXIncyBDRyB1cGRhdGUgbG9naWMuCisgIC8vLworICAvLy8gRklYTUU6IEtlZXBpbmcgdGhpcyBoZXJlIHNlZW1zIGxpa2UgYSBiaWcgbGF5ZXJpbmcgaXNzdWUsIHdlIHNob3VsZCBsb29rCisgIC8vLyBmb3IgYSBiZXR0ZXIgdGVjaG5pcXVlLgorICBTbWFsbERlbnNlU2V0PHN0ZDo6cGFpcjxMYXp5Q2FsbEdyYXBoOjpOb2RlICosIExhenlDYWxsR3JhcGg6OlNDQyAqPiwgND4KKyAgICAgICZJbmxpbmVkSW50ZXJuYWxFZGdlczsKK307CisKKy8vLyBcYnJpZWYgVGhlIGNvcmUgbW9kdWxlIHBhc3Mgd2hpY2ggZG9lcyBhIHBvc3Qtb3JkZXIgd2FsayBvZiB0aGUgU0NDcyBhbmQKKy8vLyBydW5zIGEgQ0dTQ0MgcGFzcyBvdmVyIGVhY2ggb25lLgorLy8vCisvLy8gRGVzaWduZWQgdG8gYWxsb3cgY29tcG9zaXRpb24gb2YgYSBDR1NDQ1Bhc3MoTWFuYWdlcikgYW5kCisvLy8gYSBNb2R1bGVQYXNzTWFuYWdlci4gTm90ZSB0aGF0IHRoaXMgcGFzcyBtdXN0IGJlIHJ1biB3aXRoIGEgbW9kdWxlIGFuYWx5c2lzCisvLy8gbWFuYWdlciBhcyBpdCB1c2VzIHRoZSBMYXp5Q2FsbEdyYXBoIGFuYWx5c2lzLiBJdCB3aWxsIGFsc28gcnVuIHRoZQorLy8vIFxjIENHU0NDQW5hbHlzaXNNYW5hZ2VyTW9kdWxlUHJveHkgYW5hbHlzaXMgcHJpb3IgdG8gcnVubmluZyB0aGUgQ0dTQ0MKKy8vLyBwYXNzIG92ZXIgdGhlIG1vZHVsZSB0byBlbmFibGUgYSBcYyBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciB0byBiZSB1c2VkCisvLy8gd2l0aGluIHRoaXMgcnVuIHNhZmVseS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDR1NDQ1Bhc3NUPgorY2xhc3MgTW9kdWxlVG9Qb3N0T3JkZXJDR1NDQ1Bhc3NBZGFwdG9yCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxNb2R1bGVUb1Bvc3RPcmRlckNHU0NDUGFzc0FkYXB0b3I8Q0dTQ0NQYXNzVD4+IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgTW9kdWxlVG9Qb3N0T3JkZXJDR1NDQ1Bhc3NBZGFwdG9yKENHU0NDUGFzc1QgUGFzcykKKyAgICAgIDogUGFzcyhzdGQ6Om1vdmUoUGFzcykpIHt9CisKKyAgLy8gV2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlZmluZSBhbGwgdGhlIHNwZWNpYWwgbWVtYmVyIGZ1bmN0aW9ucyBiZWNhdXNlIE1TVkMKKyAgLy8gcmVmdXNlcyB0byBnZW5lcmF0ZSB0aGVtLgorICBNb2R1bGVUb1Bvc3RPcmRlckNHU0NDUGFzc0FkYXB0b3IoCisgICAgICBjb25zdCBNb2R1bGVUb1Bvc3RPcmRlckNHU0NDUGFzc0FkYXB0b3IgJkFyZykKKyAgICAgIDogUGFzcyhBcmcuUGFzcykge30KKworICBNb2R1bGVUb1Bvc3RPcmRlckNHU0NDUGFzc0FkYXB0b3IoTW9kdWxlVG9Qb3N0T3JkZXJDR1NDQ1Bhc3NBZGFwdG9yICYmQXJnKQorICAgICAgOiBQYXNzKHN0ZDo6bW92ZShBcmcuUGFzcykpIHt9CisKKyAgZnJpZW5kIHZvaWQgc3dhcChNb2R1bGVUb1Bvc3RPcmRlckNHU0NDUGFzc0FkYXB0b3IgJkxIUywKKyAgICAgICAgICAgICAgICAgICBNb2R1bGVUb1Bvc3RPcmRlckNHU0NDUGFzc0FkYXB0b3IgJlJIUykgeworICAgIHN0ZDo6c3dhcChMSFMuUGFzcywgUkhTLlBhc3MpOworICB9CisKKyAgTW9kdWxlVG9Qb3N0T3JkZXJDR1NDQ1Bhc3NBZGFwdG9yICYKKyAgb3BlcmF0b3I9KE1vZHVsZVRvUG9zdE9yZGVyQ0dTQ0NQYXNzQWRhcHRvciBSSFMpIHsKKyAgICBzd2FwKCp0aGlzLCBSSFMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBcYnJpZWYgUnVucyB0aGUgQ0dTQ0MgcGFzcyBhY3Jvc3MgZXZlcnkgU0NDIGluIHRoZSBtb2R1bGUuCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pIHsKKyAgICAvLyBTZXR1cCB0aGUgQ0dTQ0MgYW5hbHlzaXMgbWFuYWdlciBmcm9tIGl0cyBwcm94eS4KKyAgICBDR1NDQ0FuYWx5c2lzTWFuYWdlciAmQ0dBTSA9CisgICAgICAgIEFNLmdldFJlc3VsdDxDR1NDQ0FuYWx5c2lzTWFuYWdlck1vZHVsZVByb3h5PihNKS5nZXRNYW5hZ2VyKCk7CisKKyAgICAvLyBHZXQgdGhlIGNhbGwgZ3JhcGggZm9yIHRoaXMgbW9kdWxlLgorICAgIExhenlDYWxsR3JhcGggJkNHID0gQU0uZ2V0UmVzdWx0PExhenlDYWxsR3JhcGhBbmFseXNpcz4oTSk7CisKKyAgICAvLyBXZSBrZWVwIHdvcmtsaXN0cyB0byBhbGxvdyB1cyB0byBwdXNoIG1vcmUgd29yayBvbnRvIHRoZSBwYXNzIG1hbmFnZXIgYXMKKyAgICAvLyB0aGUgcGFzc2VzIGFyZSBydW4uCisgICAgU21hbGxQcmlvcml0eVdvcmtsaXN0PExhenlDYWxsR3JhcGg6OlJlZlNDQyAqLCAxPiBSQ1dvcmtsaXN0OworICAgIFNtYWxsUHJpb3JpdHlXb3JrbGlzdDxMYXp5Q2FsbEdyYXBoOjpTQ0MgKiwgMT4gQ1dvcmtsaXN0OworCisgICAgLy8gS2VlcCBzZXRzIGZvciBpbnZhbGlkYXRlZCBTQ0NzIGFuZCBSZWZTQ0NzIHRoYXQgc2hvdWxkIGJlIHNraXBwZWQgd2hlbgorICAgIC8vIGl0ZXJhdGluZyBvZmYgdGhlIHdvcmtsaXN0cy4KKyAgICBTbWFsbFB0clNldDxMYXp5Q2FsbEdyYXBoOjpSZWZTQ0MgKiwgND4gSW52YWxpZFJlZlNDQ1NldDsKKyAgICBTbWFsbFB0clNldDxMYXp5Q2FsbEdyYXBoOjpTQ0MgKiwgND4gSW52YWxpZFNDQ1NldDsKKworICAgIFNtYWxsRGVuc2VTZXQ8c3RkOjpwYWlyPExhenlDYWxsR3JhcGg6Ok5vZGUgKiwgTGF6eUNhbGxHcmFwaDo6U0NDICo+LCA0PgorICAgICAgICBJbmxpbmVkSW50ZXJuYWxFZGdlczsKKworICAgIENHU0NDVXBkYXRlUmVzdWx0IFVSID0ge1JDV29ya2xpc3QsICAgICAgICAgIENXb3JrbGlzdCwgSW52YWxpZFJlZlNDQ1NldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkU0NDU2V0LCAgICAgICBudWxscHRyLCAgIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5saW5lZEludGVybmFsRWRnZXN9OworCisgICAgUHJlc2VydmVkQW5hbHlzZXMgUEEgPSBQcmVzZXJ2ZWRBbmFseXNlczo6YWxsKCk7CisgICAgQ0cuYnVpbGRSZWZTQ0NzKCk7CisgICAgZm9yIChhdXRvIFJDSSA9IENHLnBvc3RvcmRlcl9yZWZfc2NjX2JlZ2luKCksCisgICAgICAgICAgICAgIFJDRSA9IENHLnBvc3RvcmRlcl9yZWZfc2NjX2VuZCgpOworICAgICAgICAgUkNJICE9IFJDRTspIHsKKyAgICAgIGFzc2VydChSQ1dvcmtsaXN0LmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAiU2hvdWxkIGFsd2F5cyBzdGFydCB3aXRoIGFuIGVtcHR5IFJlZlNDQyB3b3JrbGlzdCIpOworICAgICAgLy8gVGhlIHBvc3RvcmRlcl9yZWZfc2NjcyByYW5nZSB3ZSBhcmUgd2Fsa2luZyBpcyBsYXppbHkgY29uc3RydWN0ZWQsIHNvCisgICAgICAvLyB3ZSBvbmx5IHB1c2ggdGhlIGZpcnN0IG9uZSBvbnRvIHRoZSB3b3JrbGlzdC4gVGhlIHdvcmtsaXN0IGFsbG93cyB1cworICAgICAgLy8gdG8gY2FwdHVyZSAqbmV3KiBSZWZTQ0NzIGNyZWF0ZWQgZHVyaW5nIHRyYW5zZm9ybWF0aW9ucy4KKyAgICAgIC8vCisgICAgICAvLyBXZSByZWFsbHkgd2FudCB0byBmb3JtIFJlZlNDQ3MgbGF6aWx5IGJlY2F1c2UgdGhhdCBtYWtlcyB0aGVtIGNoZWFwZXIKKyAgICAgIC8vIHRvIHVwZGF0ZSBhcyB0aGUgcHJvZ3JhbSBpcyBzaW1wbGlmaWVkIGFuZCBhbGxvd3MgdXMgdG8gaGF2ZSBncmVhdGVyCisgICAgICAvLyBjYWNoZSBsb2NhbGl0eSBhcyBmb3JtaW5nIGEgUmVmU0NDIHRvdWNoZXMgYWxsIHRoZSBwYXJ0cyBvZiBhbGwgdGhlCisgICAgICAvLyBmdW5jdGlvbnMgd2l0aGluIHRoYXQgUmVmU0NDLgorICAgICAgLy8KKyAgICAgIC8vIFdlIGFsc28gZWFnZXJseSBpbmNyZW1lbnQgdGhlIGl0ZXJhdG9yIHRvIHRoZSBuZXh0IHBvc2l0aW9uIGJlY2F1c2UKKyAgICAgIC8vIHRoZSBDR1NDQyBwYXNzZXMgYmVsb3cgbWF5IGRlbGV0ZSB0aGUgY3VycmVudCBSZWZTQ0MuCisgICAgICBSQ1dvcmtsaXN0Lmluc2VydCgmKlJDSSsrKTsKKworICAgICAgZG8geworICAgICAgICBMYXp5Q2FsbEdyYXBoOjpSZWZTQ0MgKlJDID0gUkNXb3JrbGlzdC5wb3BfYmFja192YWwoKTsKKyAgICAgICAgaWYgKEludmFsaWRSZWZTQ0NTZXQuY291bnQoUkMpKSB7CisgICAgICAgICAgREVCVUcoZGJncygpIDw8ICJTa2lwcGluZyBhbiBpbnZhbGlkIFJlZlNDQy4uLlxuIik7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBhc3NlcnQoQ1dvcmtsaXN0LmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAgICJTaG91bGQgYWx3YXlzIHN0YXJ0IHdpdGggYW4gZW1wdHkgU0NDIHdvcmtsaXN0Iik7CisKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJSdW5uaW5nIGFuIFNDQyBwYXNzIGFjcm9zcyB0aGUgUmVmU0NDOiAiIDw8ICpSQworICAgICAgICAgICAgICAgICAgICAgPDwgIlxuIik7CisKKyAgICAgICAgLy8gUHVzaCB0aGUgaW5pdGlhbCBTQ0NzIGluIHJldmVyc2UgcG9zdC1vcmRlciBhcyB3ZSdsbCBwb3Agb2ZmIHRoZQorICAgICAgICAvLyBiYWNrIGFuZCBzbyBzZWUgdGhpcyBpbiBwb3N0LW9yZGVyLgorICAgICAgICBmb3IgKExhenlDYWxsR3JhcGg6OlNDQyAmQyA6IGxsdm06OnJldmVyc2UoKlJDKSkKKyAgICAgICAgICBDV29ya2xpc3QuaW5zZXJ0KCZDKTsKKworICAgICAgICBkbyB7CisgICAgICAgICAgTGF6eUNhbGxHcmFwaDo6U0NDICpDID0gQ1dvcmtsaXN0LnBvcF9iYWNrX3ZhbCgpOworICAgICAgICAgIC8vIER1ZSB0byBjYWxsIGdyYXBoIG11dGF0aW9ucywgd2UgbWF5IGhhdmUgaW52YWxpZCBTQ0NzIG9yIFNDQ3MgZnJvbQorICAgICAgICAgIC8vIG90aGVyIFJlZlNDQ3MgaW4gdGhlIHdvcmtsaXN0LiBUaGUgaW52YWxpZCBvbmVzIGFyZSBkZWFkIGFuZCB0aGUKKyAgICAgICAgICAvLyBvdGhlciBSZWZTQ0NzIHNob3VsZCBiZSBxdWV1ZWQgYWJvdmUsIHNvIHdlIGp1c3QgbmVlZCB0byBza2lwIGJvdGgKKyAgICAgICAgICAvLyBzY2VuYXJpb3MgaGVyZS4KKyAgICAgICAgICBpZiAoSW52YWxpZFNDQ1NldC5jb3VudChDKSkgeworICAgICAgICAgICAgREVCVUcoZGJncygpIDw8ICJTa2lwcGluZyBhbiBpbnZhbGlkIFNDQy4uLlxuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCZDLT5nZXRPdXRlclJlZlNDQygpICE9IFJDKSB7CisgICAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlNraXBwaW5nIGFuIFNDQyB0aGF0IGlzIG5vdyBwYXJ0IG9mIHNvbWUgb3RoZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJSZWZTQ0MuLi5cbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgfQorCisgICAgICAgICAgZG8geworICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBkaWRuJ3QgbWlzcyBhbnkgdXBkYXRlIHNjZW5hcmlvLgorICAgICAgICAgICAgYXNzZXJ0KCFJbnZhbGlkU0NDU2V0LmNvdW50KEMpICYmICJQcm9jZXNzaW5nIGFuIGludmFsaWQgU0NDISIpOworICAgICAgICAgICAgYXNzZXJ0KEMtPmJlZ2luKCkgIT0gQy0+ZW5kKCkgJiYgIkNhbm5vdCBoYXZlIGFuIGVtcHR5IFNDQyEiKTsKKyAgICAgICAgICAgIGFzc2VydCgmQy0+Z2V0T3V0ZXJSZWZTQ0MoKSA9PSBSQyAmJgorICAgICAgICAgICAgICAgICAgICJQcm9jZXNzaW5nIGFuIFNDQyBpbiBhIGRpZmZlcmVudCBSZWZTQ0MhIik7CisKKyAgICAgICAgICAgIFVSLlVwZGF0ZWRSQyA9IG51bGxwdHI7CisgICAgICAgICAgICBVUi5VcGRhdGVkQyA9IG51bGxwdHI7CisgICAgICAgICAgICBQcmVzZXJ2ZWRBbmFseXNlcyBQYXNzUEEgPSBQYXNzLnJ1bigqQywgQ0dBTSwgQ0csIFVSKTsKKworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBTQ0MgYW5kIFJlZlNDQyBpZiBuZWNlc3NhcnkuCisgICAgICAgICAgICBDID0gVVIuVXBkYXRlZEMgPyBVUi5VcGRhdGVkQyA6IEM7CisgICAgICAgICAgICBSQyA9IFVSLlVwZGF0ZWRSQyA/IFVSLlVwZGF0ZWRSQyA6IFJDOworCisgICAgICAgICAgICAvLyBJZiB0aGUgQ0dTQ0MgcGFzcyB3YXNuJ3QgYWJsZSB0byBwcm92aWRlIGEgdmFsaWQgdXBkYXRlZCBTQ0MsCisgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBTQ0MgbWF5IHNpbXBseSBuZWVkIHRvIGJlIHNraXBwZWQgaWYgaW52YWxpZC4KKyAgICAgICAgICAgIGlmIChVUi5JbnZhbGlkYXRlZFNDQ3MuY291bnQoQykpIHsKKyAgICAgICAgICAgICAgREVCVUcoZGJncygpIDw8ICJTa2lwcGluZyBpbnZhbGlkYXRlZCByb290IG9yIGlzbGFuZCBTQ0MhXG4iKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBtaXNzIGFueSB1cGRhdGUgc2NlbmFyaW8uCisgICAgICAgICAgICBhc3NlcnQoQy0+YmVnaW4oKSAhPSBDLT5lbmQoKSAmJiAiQ2Fubm90IGhhdmUgYW4gZW1wdHkgU0NDISIpOworCisgICAgICAgICAgICAvLyBXZSBoYW5kbGUgaW52YWxpZGF0aW5nIHRoZSBDR1NDQyBhbmFseXNpcyBtYW5hZ2VyJ3MgaW5mb3JtYXRpb24KKyAgICAgICAgICAgIC8vIGZvciB0aGUgKHBvdGVudGlhbGx5IHVwZGF0ZWQpIFNDQyBoZXJlLiBOb3RlIHRoYXQgYW55IG90aGVyIFNDQ3MKKyAgICAgICAgICAgIC8vIHdob3NlIHN0cnVjdHVyZSBoYXMgY2hhbmdlZCBzaG91bGQgaGF2ZSBiZWVuIGludmFsaWRhdGVkIGJ5CisgICAgICAgICAgICAvLyB3aGF0ZXZlciB3YXMgdXBkYXRpbmcgdGhlIGNhbGwgZ3JhcGguIFRoaXMgU0NDIGdldHMgaW52YWxpZGF0ZWQKKyAgICAgICAgICAgIC8vIGxhdGUgYXMgaXQgY29udGFpbnMgdGhlIG5vZGVzIHRoYXQgd2VyZSBhY3RpdmVseSBiZWluZworICAgICAgICAgICAgLy8gcHJvY2Vzc2VkLgorICAgICAgICAgICAgQ0dBTS5pbnZhbGlkYXRlKCpDLCBQYXNzUEEpOworCisgICAgICAgICAgICAvLyBUaGVuIGludGVyc2VjdCB0aGUgcHJlc2VydmVkIHNldCBzbyB0aGF0IGludmFsaWRhdGlvbiBvZiBtb2R1bGUKKyAgICAgICAgICAgIC8vIGFuYWx5c2VzIHdpbGwgZXZlbnR1YWxseSBvY2N1ciB3aGVuIHRoZSBtb2R1bGUgcGFzcyBjb21wbGV0ZXMuCisgICAgICAgICAgICBQQS5pbnRlcnNlY3Qoc3RkOjptb3ZlKFBhc3NQQSkpOworCisgICAgICAgICAgICAvLyBUaGUgcGFzcyBtYXkgaGF2ZSByZXN0cnVjdHVyZWQgdGhlIGNhbGwgZ3JhcGggYW5kIHJlZmluZWQgdGhlCisgICAgICAgICAgICAvLyBjdXJyZW50IFNDQyBhbmQvb3IgUmVmU0NDLiBXZSBuZWVkIHRvIHVwZGF0ZSBvdXIgY3VycmVudCBTQ0MgYW5kCisgICAgICAgICAgICAvLyBSZWZTQ0MgcG9pbnRlcnMgdG8gZm9sbG93IHRoZXNlLiBBbHNvLCB3aGVuIHRoZSBjdXJyZW50IFNDQyBpcworICAgICAgICAgICAgLy8gcmVmaW5lZCwgcmUtcnVuIHRoZSBTQ0MgcGFzcyBvdmVyIHRoZSBuZXdseSByZWZpbmVkIFNDQyBpbiBvcmRlcgorICAgICAgICAgICAgLy8gdG8gb2JzZXJ2ZSB0aGUgbW9zdCBwcmVjaXNlIFNDQyBtb2RlbCBhdmFpbGFibGUuIFRoaXMgaW5oZXJlbnRseQorICAgICAgICAgICAgLy8gY2Fubm90IGN5Y2xlIGV4Y2Vzc2l2ZWx5IGFzIGl0IG9ubHkgaGFwcGVucyB3aGVuIHdlIHNwbGl0IFNDQ3MKKyAgICAgICAgICAgIC8vIGFwYXJ0LCBhdCBtb3N0IGNvbnZlcmdpbmcgb24gYSBEQUcgb2Ygc2luZ2xlIG5vZGVzLgorICAgICAgICAgICAgLy8gRklYTUU6IElmIHdlIGV2ZXIgc3RhcnQgaGF2aW5nIFJlZlNDQyBwYXNzZXMsIHdlJ2xsIHdhbnQgdG8KKyAgICAgICAgICAgIC8vIGl0ZXJhdGUgdGhlcmUgdG9vLgorICAgICAgICAgICAgaWYgKFVSLlVwZGF0ZWRDKQorICAgICAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlJlLXJ1bm5pbmcgU0NDIHBhc3NlcyBhZnRlciBhIHJlZmluZW1lbnQgb2YgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdXJyZW50IFNDQzogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgKlVSLlVwZGF0ZWRDIDw8ICJcbiIpOworCisgICAgICAgICAgICAvLyBOb3RlIHRoYXQgYm90aCBgQ2AgYW5kIGBSQ2AgbWF5IGF0IHRoaXMgcG9pbnQgcmVmZXIgdG8gZGVsZXRlZCwKKyAgICAgICAgICAgIC8vIGludmFsaWQgU0NDIGFuZCBSZWZTQ0NzIHJlc3BlY3RpdmVseS4gQnV0IHdlIHdpbGwgc2hvcnQgY2lyY3VpdAorICAgICAgICAgICAgLy8gdGhlIHByb2Nlc3Npbmcgd2hlbiB3ZSBjaGVjayB0aGVtIGluIHRoZSBsb29wIGFib3ZlLgorICAgICAgICAgIH0gd2hpbGUgKFVSLlVwZGF0ZWRDKTsKKyAgICAgICAgfSB3aGlsZSAoIUNXb3JrbGlzdC5lbXB0eSgpKTsKKworICAgICAgICAvLyBXZSBvbmx5IG5lZWQgdG8ga2VlcCBpbnRlcm5hbCBpbmxpbmVkIGVkZ2UgaW5mb3JtYXRpb24gd2l0aGluCisgICAgICAgIC8vIGEgUmVmU0NDLCBjbGVhciBpdCB0byBzYXZlIG9uIHNwYWNlIGFuZCBsZXQgdGhlIG5leHQgdGltZSB3ZSB2aXNpdAorICAgICAgICAvLyBhbnkgb2YgdGhlc2UgZnVuY3Rpb25zIGhhdmUgYSBmcmVzaCBzdGFydC4KKyAgICAgICAgSW5saW5lZEludGVybmFsRWRnZXMuY2xlYXIoKTsKKyAgICAgIH0gd2hpbGUgKCFSQ1dvcmtsaXN0LmVtcHR5KCkpOworICAgIH0KKworICAgIC8vIEJ5IGRlZmluaXRpb24gd2UgcHJlc2VydmUgdGhlIGNhbGwgZ2FycGgsIGFsbCBTQ0MgYW5hbHlzZXMsIGFuZCB0aGUKKyAgICAvLyBhbmFseXNpcyBwcm94aWVzIGJ5IGhhbmRsaW5nIHRoZW0gYWJvdmUgYW5kIGluIGFueSBuZXN0ZWQgcGFzcyBtYW5hZ2Vycy4KKyAgICBQQS5wcmVzZXJ2ZVNldDxBbGxBbmFseXNlc09uPExhenlDYWxsR3JhcGg6OlNDQz4+KCk7CisgICAgUEEucHJlc2VydmU8TGF6eUNhbGxHcmFwaEFuYWx5c2lzPigpOworICAgIFBBLnByZXNlcnZlPENHU0NDQW5hbHlzaXNNYW5hZ2VyTW9kdWxlUHJveHk+KCk7CisgICAgUEEucHJlc2VydmU8RnVuY3Rpb25BbmFseXNpc01hbmFnZXJNb2R1bGVQcm94eT4oKTsKKyAgICByZXR1cm4gUEE7CisgIH0KKworcHJpdmF0ZToKKyAgQ0dTQ0NQYXNzVCBQYXNzOworfTsKKworLy8vIFxicmllZiBBIGZ1bmN0aW9uIHRvIGRlZHVjZSBhIGZ1bmN0aW9uIHBhc3MgdHlwZSBhbmQgd3JhcCBpdCBpbiB0aGUKKy8vLyB0ZW1wbGF0ZWQgYWRhcHRvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDR1NDQ1Bhc3NUPgorTW9kdWxlVG9Qb3N0T3JkZXJDR1NDQ1Bhc3NBZGFwdG9yPENHU0NDUGFzc1Q+CitjcmVhdGVNb2R1bGVUb1Bvc3RPcmRlckNHU0NDUGFzc0FkYXB0b3IoQ0dTQ0NQYXNzVCBQYXNzKSB7CisgIHJldHVybiBNb2R1bGVUb1Bvc3RPcmRlckNHU0NDUGFzc0FkYXB0b3I8Q0dTQ0NQYXNzVD4oc3RkOjptb3ZlKFBhc3MpKTsKK30KKworLy8vIEEgcHJveHkgZnJvbSBhIFxjIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyIHRvIGFuIFxjIFNDQy4KKy8vLworLy8vIFdoZW4gYSBtb2R1bGUgcGFzcyBydW5zIGFuZCB0cmlnZ2VycyBpbnZhbGlkYXRpb24sIGJvdGggdGhlIENHU0NDIGFuZAorLy8vIEZ1bmN0aW9uIGFuYWx5c2lzIG1hbmFnZXIgcHJveGllcyBvbiB0aGUgbW9kdWxlIGdldCBhbiBpbnZhbGlkYXRpb24gZXZlbnQuCisvLy8gV2UgZG9uJ3Qgd2FudCB0byBmdWxseSBkdXBsaWNhdGUgcmVzcG9uc2liaWxpdHkgZm9yIG1vc3Qgb2YgdGhlCisvLy8gaW52YWxpZGF0aW9uIGxvZ2ljLiBJbnN0ZWFkLCB0aGlzIGxheWVyIGlzIG9ubHkgcmVzcG9uc2libGUgZm9yIFNDQy1sb2NhbAorLy8vIGludmFsaWRhdGlvbiBldmVudHMuIFdlIHdvcmsgd2l0aCB0aGUgbW9kdWxlJ3MgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgdG8KKy8vLyBpbnZhbGlkYXRlIGZ1bmN0aW9uIGFuYWx5c2VzLgorY2xhc3MgRnVuY3Rpb25BbmFseXNpc01hbmFnZXJDR1NDQ1Byb3h5CisgICAgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48RnVuY3Rpb25BbmFseXNpc01hbmFnZXJDR1NDQ1Byb3h5PiB7CitwdWJsaWM6CisgIGNsYXNzIFJlc3VsdCB7CisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBSZXN1bHQoRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkZBTSkgOiBGQU0oJkZBTSkge30KKworICAgIC8vLyBcYnJpZWYgQWNjZXNzb3IgZm9yIHRoZSBhbmFseXNpcyBtYW5hZ2VyLgorICAgIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZnZXRNYW5hZ2VyKCkgeyByZXR1cm4gKkZBTTsgfQorCisgICAgYm9vbCBpbnZhbGlkYXRlKExhenlDYWxsR3JhcGg6OlNDQyAmQywgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJlBBLAorICAgICAgICAgICAgICAgICAgICBDR1NDQ0FuYWx5c2lzTWFuYWdlcjo6SW52YWxpZGF0b3IgJkludik7CisKKyAgcHJpdmF0ZToKKyAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAqRkFNOworICB9OworCisgIC8vLyBDb21wdXRlcyB0aGUgXGMgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgYW5kIHN0b3JlcyBpdCBpbiB0aGUgcmVzdWx0IHByb3h5LgorICBSZXN1bHQgcnVuKExhenlDYWxsR3JhcGg6OlNDQyAmQywgQ0dTQ0NBbmFseXNpc01hbmFnZXIgJkFNLCBMYXp5Q2FsbEdyYXBoICYpOworCitwcml2YXRlOgorICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48RnVuY3Rpb25BbmFseXNpc01hbmFnZXJDR1NDQ1Byb3h5PjsKKworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworfTsKKworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIE91dGVyQW5hbHlzaXNNYW5hZ2VyUHJveHk8Q0dTQ0NBbmFseXNpc01hbmFnZXIsIEZ1bmN0aW9uPjsKKworLy8vIEEgcHJveHkgZnJvbSBhIFxjIENHU0NDQW5hbHlzaXNNYW5hZ2VyIHRvIGEgXGMgRnVuY3Rpb24uCit1c2luZyBDR1NDQ0FuYWx5c2lzTWFuYWdlckZ1bmN0aW9uUHJveHkgPQorICAgIE91dGVyQW5hbHlzaXNNYW5hZ2VyUHJveHk8Q0dTQ0NBbmFseXNpc01hbmFnZXIsIEZ1bmN0aW9uPjsKKworLy8vIEhlbHBlciB0byB1cGRhdGUgdGhlIGNhbGwgZ3JhcGggYWZ0ZXIgcnVubmluZyBhIGZ1bmN0aW9uIHBhc3MuCisvLy8KKy8vLyBGdW5jdGlvbiBwYXNzZXMgY2FuIG9ubHkgbXV0YXRlIHRoZSBjYWxsIGdyYXBoIGluIHNwZWNpZmljIHdheXMuIFRoaXMKKy8vLyByb3V0aW5lIHByb3ZpZGVzIGEgaGVscGVyIHRoYXQgdXBkYXRlcyB0aGUgY2FsbCBncmFwaCBpbiB0aG9zZSB3YXlzCisvLy8gaW5jbHVkaW5nIHJldHVybmluZyB3aGV0aGVyIGFueSBjaGFuZ2VzIHdlcmUgbWFkZSBhbmQgcG9wdWxhdGluZyBhIENHCisvLy8gdXBkYXRlIHJlc3VsdCBzdHJ1Y3QgZm9yIHRoZSBvdmVyYWxsIENHU0NDIHdhbGsuCitMYXp5Q2FsbEdyYXBoOjpTQ0MgJnVwZGF0ZUNHQW5kQW5hbHlzaXNNYW5hZ2VyRm9yRnVuY3Rpb25QYXNzKAorICAgIExhenlDYWxsR3JhcGggJkcsIExhenlDYWxsR3JhcGg6OlNDQyAmQywgTGF6eUNhbGxHcmFwaDo6Tm9kZSAmTiwKKyAgICBDR1NDQ0FuYWx5c2lzTWFuYWdlciAmQU0sIENHU0NDVXBkYXRlUmVzdWx0ICZVUik7CisKKy8vLyBcYnJpZWYgQWRhcHRvciB0aGF0IG1hcHMgZnJvbSBhIFNDQyB0byBpdHMgZnVuY3Rpb25zLgorLy8vCisvLy8gRGVzaWduZWQgdG8gYWxsb3cgY29tcG9zaXRpb24gb2YgYSBGdW5jdGlvblBhc3MoTWFuYWdlcikgYW5kCisvLy8gYSBDR1NDQ1Bhc3NNYW5hZ2VyLiBOb3RlIHRoYXQgaWYgdGhpcyBwYXNzIGlzIGNvbnN0cnVjdGVkIHdpdGggYSBwb2ludGVyCisvLy8gdG8gYSBcYyBDR1NDQ0FuYWx5c2lzTWFuYWdlciBpdCB3aWxsIHJ1biB0aGUKKy8vLyBcYyBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlckNHU0NDUHJveHkgYW5hbHlzaXMgcHJpb3IgdG8gcnVubmluZyB0aGUgZnVuY3Rpb24KKy8vLyBwYXNzIG92ZXIgdGhlIFNDQyB0byBlbmFibGUgYSBcYyBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciB0byBiZSB1c2VkCisvLy8gd2l0aGluIHRoaXMgcnVuIHNhZmVseS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvblBhc3NUPgorY2xhc3MgQ0dTQ0NUb0Z1bmN0aW9uUGFzc0FkYXB0b3IKKyAgICA6IHB1YmxpYyBQYXNzSW5mb01peGluPENHU0NDVG9GdW5jdGlvblBhc3NBZGFwdG9yPEZ1bmN0aW9uUGFzc1Q+PiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IENHU0NDVG9GdW5jdGlvblBhc3NBZGFwdG9yKEZ1bmN0aW9uUGFzc1QgUGFzcykKKyAgICAgIDogUGFzcyhzdGQ6Om1vdmUoUGFzcykpIHt9CisKKyAgLy8gV2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlZmluZSBhbGwgdGhlIHNwZWNpYWwgbWVtYmVyIGZ1bmN0aW9ucyBiZWNhdXNlIE1TVkMKKyAgLy8gcmVmdXNlcyB0byBnZW5lcmF0ZSB0aGVtLgorICBDR1NDQ1RvRnVuY3Rpb25QYXNzQWRhcHRvcihjb25zdCBDR1NDQ1RvRnVuY3Rpb25QYXNzQWRhcHRvciAmQXJnKQorICAgICAgOiBQYXNzKEFyZy5QYXNzKSB7fQorCisgIENHU0NDVG9GdW5jdGlvblBhc3NBZGFwdG9yKENHU0NDVG9GdW5jdGlvblBhc3NBZGFwdG9yICYmQXJnKQorICAgICAgOiBQYXNzKHN0ZDo6bW92ZShBcmcuUGFzcykpIHt9CisKKyAgZnJpZW5kIHZvaWQgc3dhcChDR1NDQ1RvRnVuY3Rpb25QYXNzQWRhcHRvciAmTEhTLAorICAgICAgICAgICAgICAgICAgIENHU0NDVG9GdW5jdGlvblBhc3NBZGFwdG9yICZSSFMpIHsKKyAgICBzdGQ6OnN3YXAoTEhTLlBhc3MsIFJIUy5QYXNzKTsKKyAgfQorCisgIENHU0NDVG9GdW5jdGlvblBhc3NBZGFwdG9yICZvcGVyYXRvcj0oQ0dTQ0NUb0Z1bmN0aW9uUGFzc0FkYXB0b3IgUkhTKSB7CisgICAgc3dhcCgqdGhpcywgUkhTKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gXGJyaWVmIFJ1bnMgdGhlIGZ1bmN0aW9uIHBhc3MgYWNyb3NzIGV2ZXJ5IGZ1bmN0aW9uIGluIHRoZSBtb2R1bGUuCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihMYXp5Q2FsbEdyYXBoOjpTQ0MgJkMsIENHU0NDQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExhenlDYWxsR3JhcGggJkNHLCBDR1NDQ1VwZGF0ZVJlc3VsdCAmVVIpIHsKKyAgICAvLyBTZXR1cCB0aGUgZnVuY3Rpb24gYW5hbHlzaXMgbWFuYWdlciBmcm9tIGl0cyBwcm94eS4KKyAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmRkFNID0KKyAgICAgICAgQU0uZ2V0UmVzdWx0PEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyQ0dTQ0NQcm94eT4oQywgQ0cpLmdldE1hbmFnZXIoKTsKKworICAgIFNtYWxsVmVjdG9yPExhenlDYWxsR3JhcGg6Ok5vZGUgKiwgND4gTm9kZXM7CisgICAgZm9yIChMYXp5Q2FsbEdyYXBoOjpOb2RlICZOIDogQykKKyAgICAgIE5vZGVzLnB1c2hfYmFjaygmTik7CisKKyAgICAvLyBUaGUgU0NDIG1heSBnZXQgc3BsaXQgd2hpbGUgd2UgYXJlIG9wdGltaXppbmcgZnVuY3Rpb25zIGR1ZSB0byBkZWxldGluZworICAgIC8vIGVkZ2VzLiBJZiB0aGlzIGhhcHBlbnMsIHRoZSBjdXJyZW50IFNDQyBjYW4gc2hpZnQsIHNvIGtlZXAgdHJhY2sgb2YKKyAgICAvLyBhIHBvaW50ZXIgd2UgY2FuIG92ZXJ3cml0ZS4KKyAgICBMYXp5Q2FsbEdyYXBoOjpTQ0MgKkN1cnJlbnRDID0gJkM7CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIlJ1bm5pbmcgZnVuY3Rpb24gcGFzc2VzIGFjcm9zcyBhbiBTQ0M6ICIgPDwgQyA8PCAiXG4iKTsKKworICAgIFByZXNlcnZlZEFuYWx5c2VzIFBBID0gUHJlc2VydmVkQW5hbHlzZXM6OmFsbCgpOworICAgIGZvciAoTGF6eUNhbGxHcmFwaDo6Tm9kZSAqTiA6IE5vZGVzKSB7CisgICAgICAvLyBTa2lwIG5vZGVzIGZyb20gb3RoZXIgU0NDcy4gVGhlc2UgbWF5IGhhdmUgYmVlbiBzcGxpdCBvdXQgZHVyaW5nCisgICAgICAvLyBwcm9jZXNzaW5nLiBXZSdsbCBldmVudHVhbGx5IHZpc2l0IHRob3NlIFNDQ3MgYW5kIHBpY2sgdXAgdGhlIG5vZGVzCisgICAgICAvLyB0aGVyZS4KKyAgICAgIGlmIChDRy5sb29rdXBTQ0MoKk4pICE9IEN1cnJlbnRDKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgUHJlc2VydmVkQW5hbHlzZXMgUGFzc1BBID0gUGFzcy5ydW4oTi0+Z2V0RnVuY3Rpb24oKSwgRkFNKTsKKworICAgICAgLy8gV2Uga25vdyB0aGF0IHRoZSBmdW5jdGlvbiBwYXNzIGNvdWxkbid0IGhhdmUgaW52YWxpZGF0ZWQgYW55IG90aGVyCisgICAgICAvLyBmdW5jdGlvbidzIGFuYWx5c2VzICh0aGF0J3MgdGhlIGNvbnRyYWN0IG9mIGEgZnVuY3Rpb24gcGFzcyksIHNvCisgICAgICAvLyBkaXJlY3RseSBoYW5kbGUgdGhlIGZ1bmN0aW9uIGFuYWx5c2lzIG1hbmFnZXIncyBpbnZhbGlkYXRpb24gaGVyZS4KKyAgICAgIEZBTS5pbnZhbGlkYXRlKE4tPmdldEZ1bmN0aW9uKCksIFBhc3NQQSk7CisKKyAgICAgIC8vIFRoZW4gaW50ZXJzZWN0IHRoZSBwcmVzZXJ2ZWQgc2V0IHNvIHRoYXQgaW52YWxpZGF0aW9uIG9mIG1vZHVsZQorICAgICAgLy8gYW5hbHlzZXMgd2lsbCBldmVudHVhbGx5IG9jY3VyIHdoZW4gdGhlIG1vZHVsZSBwYXNzIGNvbXBsZXRlcy4KKyAgICAgIFBBLmludGVyc2VjdChzdGQ6Om1vdmUoUGFzc1BBKSk7CisKKyAgICAgIC8vIElmIHRoZSBjYWxsIGdyYXBoIGhhc24ndCBiZWVuIHByZXNlcnZlZCwgdXBkYXRlIGl0IGJhc2VkIG9uIHRoaXMKKyAgICAgIC8vIGZ1bmN0aW9uIHBhc3MuIFRoaXMgbWF5IGFsc28gdXBkYXRlIHRoZSBjdXJyZW50IFNDQyB0byBwb2ludCB0bworICAgICAgLy8gYSBzbWFsbGVyLCBtb3JlIHJlZmluZWQgU0NDLgorICAgICAgYXV0byBQQUMgPSBQQS5nZXRDaGVja2VyPExhenlDYWxsR3JhcGhBbmFseXNpcz4oKTsKKyAgICAgIGlmICghUEFDLnByZXNlcnZlZCgpICYmICFQQUMucHJlc2VydmVkU2V0PEFsbEFuYWx5c2VzT248TW9kdWxlPj4oKSkgeworICAgICAgICBDdXJyZW50QyA9ICZ1cGRhdGVDR0FuZEFuYWx5c2lzTWFuYWdlckZvckZ1bmN0aW9uUGFzcyhDRywgKkN1cnJlbnRDLCAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU0sIFVSKTsKKyAgICAgICAgYXNzZXJ0KAorICAgICAgICAgICAgQ0cubG9va3VwU0NDKCpOKSA9PSBDdXJyZW50QyAmJgorICAgICAgICAgICAgIkN1cnJlbnQgU0NDIG5vdCB1cGRhdGVkIHRvIHRoZSBTQ0MgY29udGFpbmluZyB0aGUgY3VycmVudCBub2RlISIpOworICAgICAgfQorICAgIH0KKworICAgIC8vIEJ5IGRlZmluaXRpb24gd2UgcHJlc2VydmUgdGhlIHByb3h5LiBBbmQgd2UgcHJlc2VydmUgYWxsIGFuYWx5c2VzIG9uCisgICAgLy8gRnVuY3Rpb25zLiBUaGlzIHByZWNsdWRlcyAqYW55KiBpbnZhbGlkYXRpb24gb2YgZnVuY3Rpb24gYW5hbHlzZXMgYnkgdGhlCisgICAgLy8gcHJveHksIGJ1dCB0aGF0J3MgT0sgYmVjYXVzZSB3ZSd2ZSB0YWtlbiBjYXJlIHRvIGludmFsaWRhdGUgYW5hbHlzZXMgaW4KKyAgICAvLyB0aGUgZnVuY3Rpb24gYW5hbHlzaXMgbWFuYWdlciBpbmNyZW1lbnRhbGx5IGFib3ZlLgorICAgIFBBLnByZXNlcnZlU2V0PEFsbEFuYWx5c2VzT248RnVuY3Rpb24+PigpOworICAgIFBBLnByZXNlcnZlPEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyQ0dTQ0NQcm94eT4oKTsKKworICAgIC8vIFdlJ3ZlIGFsc28gZW5zdXJlZCB0aGF0IHdlIHVwZGF0ZWQgdGhlIGNhbGwgZ3JhcGggYWxvbmcgdGhlIHdheS4KKyAgICBQQS5wcmVzZXJ2ZTxMYXp5Q2FsbEdyYXBoQW5hbHlzaXM+KCk7CisKKyAgICByZXR1cm4gUEE7CisgIH0KKworcHJpdmF0ZToKKyAgRnVuY3Rpb25QYXNzVCBQYXNzOworfTsKKworLy8vIFxicmllZiBBIGZ1bmN0aW9uIHRvIGRlZHVjZSBhIGZ1bmN0aW9uIHBhc3MgdHlwZSBhbmQgd3JhcCBpdCBpbiB0aGUKKy8vLyB0ZW1wbGF0ZWQgYWRhcHRvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvblBhc3NUPgorQ0dTQ0NUb0Z1bmN0aW9uUGFzc0FkYXB0b3I8RnVuY3Rpb25QYXNzVD4KK2NyZWF0ZUNHU0NDVG9GdW5jdGlvblBhc3NBZGFwdG9yKEZ1bmN0aW9uUGFzc1QgUGFzcykgeworICByZXR1cm4gQ0dTQ0NUb0Z1bmN0aW9uUGFzc0FkYXB0b3I8RnVuY3Rpb25QYXNzVD4oc3RkOjptb3ZlKFBhc3MpKTsKK30KKworLy8vIEEgaGVscGVyIHRoYXQgcmVwZWF0cyBhbiBTQ0MgcGFzcyBlYWNoIHRpbWUgYW4gaW5kaXJlY3QgY2FsbCBpcyByZWZpbmVkIHRvCisvLy8gYSBkaXJlY3QgY2FsbCBieSB0aGF0IHBhc3MuCisvLy8KKy8vLyBXaGlsZSB0aGUgQ0dTQ0MgcGFzcyBtYW5hZ2VyIHdvcmtzIHRvIHJlLXZpc2l0IFNDQ3MgYW5kIFJlZlNDQ3MgYXMgdGhleQorLy8vIGNoYW5nZSBzaGFwZSwgd2UgbWF5IGFsc28gd2FudCB0byByZXBlYXQgYW4gU0NDIHBhc3MgaWYgaXQgc2ltcGx5IHJlZmluZXMKKy8vLyBhbiBpbmRpcmVjdCBjYWxsIHRvIGEgZGlyZWN0IGNhbGwsIGV2ZW4gaWYgZG9pbmcgc28gZG9lcyBub3QgYWx0ZXIgdGhlCisvLy8gc2hhcGUgb2YgdGhlIGdyYXBoLiBOb3RlIHRoYXQgdGhpcyBvbmx5IHBlcnRhaW5zIHRvIGRpcmVjdCBjYWxscyB0bworLy8vIGZ1bmN0aW9ucyB3aGVyZSBJUE8gYWNyb3NzIHRoZSBTQ0MgbWF5IGJlIGFibGUgdG8gY29tcHV0ZSBtb3JlIHByZWNpc2UKKy8vLyByZXN1bHRzLiBGb3IgaW50cmluc2ljcywgd2UgYXNzdW1lIHNjYWxhciBvcHRpbWl6YXRpb25zIGFscmVhZHkgY2FuIGZ1bGx5CisvLy8gcmVhc29uIGFib3V0IHRoZW0uCisvLy8KKy8vLyBUaGlzIHJlcGV0aXRpb24gaGFzIHRoZSBwb3RlbnRpYWwgdG8gYmUgdmVyeSBsYXJnZSBob3dldmVyLCBhcyBlYWNoIG9uZQorLy8vIG1pZ2h0IHJlZmluZSBhIHNpbmdsZSBjYWxsIHNpdGUuIEFzIGEgY29uc2VxdWVuY2UsIGluIHByYWN0aWNlIHdlIHVzZSBhbgorLy8vIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YgcmVwZXRpdGlvbnMgdG8gbGltaXQgdGhpbmdzLgordGVtcGxhdGUgPHR5cGVuYW1lIFBhc3NUPgorY2xhc3MgRGV2aXJ0U0NDUmVwZWF0ZWRQYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxEZXZpcnRTQ0NSZXBlYXRlZFBhc3M8UGFzc1Q+PiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IERldmlydFNDQ1JlcGVhdGVkUGFzcyhQYXNzVCBQYXNzLCBpbnQgTWF4SXRlcmF0aW9ucykKKyAgICAgIDogUGFzcyhzdGQ6Om1vdmUoUGFzcykpLCBNYXhJdGVyYXRpb25zKE1heEl0ZXJhdGlvbnMpIHt9CisKKyAgLy8vIFJ1bnMgdGhlIHdyYXBwZWQgcGFzcyB1cCB0byBcYyBNYXhJdGVyYXRpb25zIG9uIHRoZSBTQ0MsIGl0ZXJhdGluZworICAvLy8gd2hlbmV2ZXIgYW4gaW5kaXJlY3QgY2FsbCBpcyByZWZpbmVkLgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTGF6eUNhbGxHcmFwaDo6U0NDICZJbml0aWFsQywgQ0dTQ0NBbmFseXNpc01hbmFnZXIgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgTGF6eUNhbGxHcmFwaCAmQ0csIENHU0NDVXBkYXRlUmVzdWx0ICZVUikgeworICAgIFByZXNlcnZlZEFuYWx5c2VzIFBBID0gUHJlc2VydmVkQW5hbHlzZXM6OmFsbCgpOworCisgICAgLy8gVGhlIFNDQyBtYXkgYmUgcmVmaW5lZCB3aGlsZSB3ZSBhcmUgcnVubmluZyBwYXNzZXMgb3ZlciBpdCwgc28gc2V0IHVwCisgICAgLy8gYSBwb2ludGVyIHRoYXQgd2UgY2FuIHVwZGF0ZS4KKyAgICBMYXp5Q2FsbEdyYXBoOjpTQ0MgKkMgPSAmSW5pdGlhbEM7CisKKyAgICAvLyBDb2xsZWN0IHZhbHVlIGhhbmRsZXMgZm9yIGFsbCBvZiB0aGUgaW5kaXJlY3QgY2FsbCBzaXRlcy4KKyAgICBTbWFsbFZlY3RvcjxXZWFrVHJhY2tpbmdWSCwgOD4gQ2FsbEhhbmRsZXM7CisKKyAgICAvLyBTdHJ1Y3QgdG8gdHJhY2sgdGhlIGNvdW50cyBvZiBkaXJlY3QgYW5kIGluZGlyZWN0IGNhbGxzIGluIGVhY2ggZnVuY3Rpb24KKyAgICAvLyBvZiB0aGUgU0NDLgorICAgIHN0cnVjdCBDYWxsQ291bnQgeworICAgICAgaW50IERpcmVjdDsKKyAgICAgIGludCBJbmRpcmVjdDsKKyAgICB9OworCisgICAgLy8gUHV0IHZhbHVlIGhhbmRsZXMgb24gYWxsIG9mIHRoZSBpbmRpcmVjdCBjYWxscyBhbmQgcmV0dXJuIHRoZSBudW1iZXIgb2YKKyAgICAvLyBkaXJlY3QgY2FsbHMgZm9yIGVhY2ggZnVuY3Rpb24gaW4gdGhlIFNDQy4KKyAgICBhdXRvIFNjYW5TQ0MgPSBbXShMYXp5Q2FsbEdyYXBoOjpTQ0MgJkMsCisgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFdlYWtUcmFja2luZ1ZIPiAmQ2FsbEhhbmRsZXMpIHsKKyAgICAgIGFzc2VydChDYWxsSGFuZGxlcy5lbXB0eSgpICYmICJNdXN0IHN0YXJ0IHdpdGggYSBjbGVhciBzZXQgb2YgaGFuZGxlcy4iKTsKKworICAgICAgU21hbGxWZWN0b3I8Q2FsbENvdW50LCA0PiBDYWxsQ291bnRzOworICAgICAgZm9yIChMYXp5Q2FsbEdyYXBoOjpOb2RlICZOIDogQykgeworICAgICAgICBDYWxsQ291bnRzLnB1c2hfYmFjayh7MCwgMH0pOworICAgICAgICBDYWxsQ291bnQgJkNvdW50ID0gQ2FsbENvdW50cy5iYWNrKCk7CisgICAgICAgIGZvciAoSW5zdHJ1Y3Rpb24gJkkgOiBpbnN0cnVjdGlvbnMoTi5nZXRGdW5jdGlvbigpKSkKKyAgICAgICAgICBpZiAoYXV0byBDUyA9IENhbGxTaXRlKCZJKSkgeworICAgICAgICAgICAgaWYgKENTLmdldENhbGxlZEZ1bmN0aW9uKCkpIHsKKyAgICAgICAgICAgICAgKytDb3VudC5EaXJlY3Q7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICArK0NvdW50LkluZGlyZWN0OworICAgICAgICAgICAgICBDYWxsSGFuZGxlcy5wdXNoX2JhY2soV2Vha1RyYWNraW5nVkgoJkkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBDYWxsQ291bnRzOworICAgIH07CisKKyAgICAvLyBQb3B1bGF0ZSB0aGUgaW5pdGlhbCBjYWxsIGhhbmRsZXMgYW5kIGdldCB0aGUgaW5pdGlhbCBjYWxsIGNvdW50cy4KKyAgICBhdXRvIENhbGxDb3VudHMgPSBTY2FuU0NDKCpDLCBDYWxsSGFuZGxlcyk7CisKKyAgICBmb3IgKGludCBJdGVyYXRpb24gPSAwOzsgKytJdGVyYXRpb24pIHsKKyAgICAgIFByZXNlcnZlZEFuYWx5c2VzIFBhc3NQQSA9IFBhc3MucnVuKCpDLCBBTSwgQ0csIFVSKTsKKworICAgICAgLy8gSWYgdGhlIFNDQyBzdHJ1Y3R1cmUgaGFzIGNoYW5nZWQsIGJhaWwgaW1tZWRpYXRlbHkgYW5kIGxldCB0aGUgb3V0ZXIKKyAgICAgIC8vIENHU0NDIGxheWVyIGhhbmRsZSBhbnkgaXRlcmF0aW9uIHRvIHJlZmxlY3QgdGhlIHJlZmluZWQgc3RydWN0dXJlLgorICAgICAgaWYgKFVSLlVwZGF0ZWRDICYmIFVSLlVwZGF0ZWRDICE9IEMpIHsKKyAgICAgICAgUEEuaW50ZXJzZWN0KHN0ZDo6bW92ZShQYXNzUEEpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIENoZWNrIHRoYXQgd2UgZGlkbid0IG1pc3MgYW55IHVwZGF0ZSBzY2VuYXJpby4KKyAgICAgIGFzc2VydCghVVIuSW52YWxpZGF0ZWRTQ0NzLmNvdW50KEMpICYmICJQcm9jZXNzaW5nIGFuIGludmFsaWQgU0NDISIpOworICAgICAgYXNzZXJ0KEMtPmJlZ2luKCkgIT0gQy0+ZW5kKCkgJiYgIkNhbm5vdCBoYXZlIGFuIGVtcHR5IFNDQyEiKTsKKyAgICAgIGFzc2VydCgoaW50KUNhbGxDb3VudHMuc2l6ZSgpID09IEMtPnNpemUoKSAmJgorICAgICAgICAgICAgICJDYW5ub3QgaGF2ZSBjaGFuZ2VkIHRoZSBzaXplIG9mIHRoZSBTQ0MhIik7CisKKyAgICAgIC8vIENoZWNrIHdoZXRoZXIgYW55IG9mIHRoZSBoYW5kbGVzIHdlcmUgZGV2aXJ0dWFsaXplZC4KKyAgICAgIGF1dG8gSXNEZXZpcnR1YWxpemVkSGFuZGxlID0gWyZdKFdlYWtUcmFja2luZ1ZIICZDYWxsSCkgeworICAgICAgICBpZiAoIUNhbGxIKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgYXV0byBDUyA9IENhbGxTaXRlKENhbGxIKTsKKyAgICAgICAgaWYgKCFDUykKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgLy8gSWYgdGhlIGNhbGwgaXMgc3RpbGwgaW5kaXJlY3QsIGxlYXZlIGl0IGFsb25lLgorICAgICAgICBGdW5jdGlvbiAqRiA9IENTLmdldENhbGxlZEZ1bmN0aW9uKCk7CisgICAgICAgIGlmICghRikKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJGb3VuZCBkZXZpcnV0YWxpemVkIGNhbGwgZnJvbSAiCisgICAgICAgICAgICAgICAgICAgICA8PCBDUy5nZXRQYXJlbnQoKS0+Z2V0UGFyZW50KCktPmdldE5hbWUoKSA8PCAiIHRvICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IEYtPmdldE5hbWUoKSA8PCAiXG4iKTsKKworICAgICAgICAvLyBXZSBub3cgaGF2ZSBhIGRpcmVjdCBjYWxsIHdoZXJlIHByZXZpb3VzbHkgd2UgaGFkIGFuIGluZGlyZWN0IGNhbGwsCisgICAgICAgIC8vIHNvIGl0ZXJhdGUgdG8gcHJvY2VzcyB0aGlzIGRldmlydHVhbGl6YXRpb24gc2l0ZS4KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9OworICAgICAgYm9vbCBEZXZpcnQgPSBsbHZtOjphbnlfb2YoQ2FsbEhhbmRsZXMsIElzRGV2aXJ0dWFsaXplZEhhbmRsZSk7CisKKyAgICAgIC8vIFJlc2NhbiB0byBidWlsZCB1cCBhIG5ldyBzZXQgb2YgaGFuZGxlcyBhbmQgY291bnQgaG93IG1hbnkgZGlyZWN0CisgICAgICAvLyBjYWxscyByZW1haW4uIElmIHdlIGRlY2lkZSB0byBpdGVyYXRlLCB0aGlzIGFsc28gc2V0cyB1cCB0aGUgaW5wdXQgdG8KKyAgICAgIC8vIHRoZSBuZXh0IGl0ZXJhdGlvbi4KKyAgICAgIENhbGxIYW5kbGVzLmNsZWFyKCk7CisgICAgICBhdXRvIE5ld0NhbGxDb3VudHMgPSBTY2FuU0NDKCpDLCBDYWxsSGFuZGxlcyk7CisKKyAgICAgIC8vIElmIHdlIGhhdmVuJ3QgZm91bmQgYW4gZXhwbGljaXQgZGV2aXJ0dWFsaXphdGlvbiBhbHJlYWR5IHNlZSBpZiB3ZQorICAgICAgLy8gaGF2ZSBkZWNyZWFzZWQgdGhlIG51bWJlciBvZiBpbmRpcmVjdCBjYWxscyBhbmQgaW5jcmVhc2VkIHRoZSBudW1iZXIKKyAgICAgIC8vIG9mIGRpcmVjdCBjYWxscyBmb3IgYW55IGZ1bmN0aW9uIGluIHRoZSBTQ0MuIFRoaXMgY2FuIGJlIGZvb2xlZCBieSBhbGwKKyAgICAgIC8vIG1hbm5lciBvZiB0cmFuc2Zvcm1hdGlvbnMgc3VjaCBhcyBEQ0UgYW5kIG90aGVyIHRoaW5ncywgYnV0IHNlZW1zIHRvCisgICAgICAvLyB3b3JrIHdlbGwgaW4gcHJhY3RpY2UuCisgICAgICBpZiAoIURldmlydCkKKyAgICAgICAgZm9yIChpbnQgaSA9IDAsIFNpemUgPSBDLT5zaXplKCk7IGkgPCBTaXplOyArK2kpCisgICAgICAgICAgaWYgKENhbGxDb3VudHNbaV0uSW5kaXJlY3QgPiBOZXdDYWxsQ291bnRzW2ldLkluZGlyZWN0ICYmCisgICAgICAgICAgICAgIENhbGxDb3VudHNbaV0uRGlyZWN0IDwgTmV3Q2FsbENvdW50c1tpXS5EaXJlY3QpIHsKKyAgICAgICAgICAgIERldmlydCA9IHRydWU7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisKKyAgICAgIGlmICghRGV2aXJ0KSB7CisgICAgICAgIFBBLmludGVyc2VjdChzdGQ6Om1vdmUoUGFzc1BBKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBPdGhlcndpc2UsIGlmIHdlJ3ZlIGFscmVhZHkgaGl0IG91ciBtYXgsIHdlJ3JlIGRvbmUuCisgICAgICBpZiAoSXRlcmF0aW9uID49IE1heEl0ZXJhdGlvbnMpIHsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJGb3VuZCBhbm90aGVyIGRldmlydHVhbGl6YXRpb24gYWZ0ZXIgaGl0dGluZyB0aGUgbWF4ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJudW1iZXIgb2YgcmVwZXRpdGlvbnMgKCIKKyAgICAgICAgICAgICAgICAgICAgIDw8IE1heEl0ZXJhdGlvbnMgPDwgIikgb24gU0NDOiAiIDw8ICpDIDw8ICJcbiIpOworICAgICAgICBQQS5pbnRlcnNlY3Qoc3RkOjptb3ZlKFBhc3NQQSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgREVCVUcoZGJncygpCisgICAgICAgICAgICA8PCAiUmVwZWF0aW5nIGFuIFNDQyBwYXNzIGFmdGVyIGZpbmRpbmcgYSBkZXZpcnR1YWxpemF0aW9uIGluOiAiCisgICAgICAgICAgICA8PCAqQyA8PCAiXG4iKTsKKworICAgICAgLy8gTW92ZSBvdmVyIHRoZSBuZXcgY2FsbCBjb3VudHMgaW4gcHJlcGFyYXRpb24gZm9yIGl0ZXJhdGluZy4KKyAgICAgIENhbGxDb3VudHMgPSBzdGQ6Om1vdmUoTmV3Q2FsbENvdW50cyk7CisKKyAgICAgIC8vIFVwZGF0ZSB0aGUgYW5hbHlzaXMgbWFuYWdlciB3aXRoIGVhY2ggcnVuIGFuZCBpbnRlcnNlY3QgdGhlIHRvdGFsIHNldAorICAgICAgLy8gb2YgcHJlc2VydmVkIGFuYWx5c2VzIHNvIHdlJ3JlIHJlYWR5IHRvIGl0ZXJhdGUuCisgICAgICBBTS5pbnZhbGlkYXRlKCpDLCBQYXNzUEEpOworICAgICAgUEEuaW50ZXJzZWN0KHN0ZDo6bW92ZShQYXNzUEEpKTsKKyAgICB9CisKKyAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgYWRkIGFueSBwcmVzZXJ2ZWQgZW50cmllcyBoZXJlIHVubGlrZSBhIG1vcmUgbm9ybWFsCisgICAgLy8gInBhc3MgbWFuYWdlciIgYmVjYXVzZSB3ZSBvbmx5IGhhbmRsZSBpbnZhbGlkYXRpb24gKmJldHdlZW4qIGl0ZXJhdGlvbnMsCisgICAgLy8gbm90IGFmdGVyIHRoZSBsYXN0IGl0ZXJhdGlvbi4KKyAgICByZXR1cm4gUEE7CisgIH0KKworcHJpdmF0ZToKKyAgUGFzc1QgUGFzczsKKyAgaW50IE1heEl0ZXJhdGlvbnM7Cit9OworCisvLy8gXGJyaWVmIEEgZnVuY3Rpb24gdG8gZGVkdWNlIGEgZnVuY3Rpb24gcGFzcyB0eXBlIGFuZCB3cmFwIGl0IGluIHRoZQorLy8vIHRlbXBsYXRlZCBhZGFwdG9yLgordGVtcGxhdGUgPHR5cGVuYW1lIFBhc3NUPgorRGV2aXJ0U0NDUmVwZWF0ZWRQYXNzPFBhc3NUPiBjcmVhdGVEZXZpcnRTQ0NSZXBlYXRlZFBhc3MoUGFzc1QgUGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBNYXhJdGVyYXRpb25zKSB7CisgIHJldHVybiBEZXZpcnRTQ0NSZXBlYXRlZFBhc3M8UGFzc1Q+KHN0ZDo6bW92ZShQYXNzKSwgTWF4SXRlcmF0aW9ucyk7Cit9CisKKy8vIENsZWFyIG91dCB0aGUgZGVidWcgbG9nZ2luZyBtYWNyby4KKyN1bmRlZiBERUJVR19UWVBFCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX0NHU0NDUEFTU01BTkFHRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DYWxsR3JhcGguaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ2FsbEdyYXBoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVmYzg1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ2FsbEdyYXBoLmgKQEAgLTAsMCArMSw1MDkgQEAKKy8vPT09LSBDYWxsR3JhcGguaCAtIEJ1aWxkIGEgTW9kdWxlJ3MgY2FsbCBncmFwaCAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLworLy8vIFRoaXMgZmlsZSBwcm92aWRlcyBpbnRlcmZhY2VzIHVzZWQgdG8gYnVpbGQgYW5kIG1hbmlwdWxhdGUgYSBjYWxsIGdyYXBoLAorLy8vIHdoaWNoIGlzIGEgdmVyeSB1c2VmdWwgdG9vbCBmb3IgaW50ZXJwcm9jZWR1cmFsIG9wdGltaXphdGlvbi4KKy8vLworLy8vIEV2ZXJ5IGZ1bmN0aW9uIGluIGEgbW9kdWxlIGlzIHJlcHJlc2VudGVkIGFzIGEgbm9kZSBpbiB0aGUgY2FsbCBncmFwaC4gIFRoZQorLy8vIGNhbGxncmFwaCBub2RlIGtlZXBzIHRyYWNrIG9mIHdoaWNoIGZ1bmN0aW9ucyBhcmUgY2FsbGVkIGJ5IHRoZSBmdW5jdGlvbgorLy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG5vZGUuCisvLy8KKy8vLyBBIGNhbGwgZ3JhcGggbWF5IGNvbnRhaW4gbm9kZXMgd2hlcmUgdGhlIGZ1bmN0aW9uIHRoYXQgdGhleSBjb3JyZXNwb25kIHRvCisvLy8gaXMgbnVsbC4gIFRoZXNlICdleHRlcm5hbCcgbm9kZXMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IGNvbnRyb2wgZmxvdyB0aGF0IGlzCisvLy8gbm90IHJlcHJlc2VudGVkIChvciBhbmFseXphYmxlKSBpbiB0aGUgbW9kdWxlLiAgSW4gcGFydGljdWxhciwgdGhpcworLy8vIGFuYWx5c2lzIGJ1aWxkcyBvbmUgZXh0ZXJuYWwgbm9kZSBzdWNoIHRoYXQ6CisvLy8gICAxLiBBbGwgZnVuY3Rpb25zIGluIHRoZSBtb2R1bGUgd2l0aG91dCBpbnRlcm5hbCBsaW5rYWdlIHdpbGwgaGF2ZSBlZGdlcworLy8vICAgICAgZnJvbSB0aGlzIGV4dGVybmFsIG5vZGUsIGluZGljYXRpbmcgdGhhdCB0aGV5IGNvdWxkIGJlIGNhbGxlZCBieQorLy8vICAgICAgZnVuY3Rpb25zIG91dHNpZGUgb2YgdGhlIG1vZHVsZS4KKy8vLyAgIDIuIEFsbCBmdW5jdGlvbnMgd2hvc2UgYWRkcmVzcyBpcyB1c2VkIGZvciBzb21ldGhpbmcgbW9yZSB0aGFuIGEgZGlyZWN0CisvLy8gICAgICBjYWxsLCBmb3IgZXhhbXBsZSBiZWluZyBzdG9yZWQgaW50byBhIG1lbW9yeSBsb2NhdGlvbiB3aWxsIGFsc28gaGF2ZQorLy8vICAgICAgYW4gZWRnZSBmcm9tIHRoaXMgZXh0ZXJuYWwgbm9kZS4gIFNpbmNlIHRoZXkgbWF5IGJlIGNhbGxlZCBieSBhbgorLy8vICAgICAgdW5rbm93biBjYWxsZXIgbGF0ZXIsIHRoZXkgbXVzdCBiZSB0cmFja2VkIGFzIHN1Y2guCisvLy8KKy8vLyBUaGVyZSBpcyBhIHNlY29uZCBleHRlcm5hbCBub2RlIGFkZGVkIGZvciBjYWxscyB0aGF0IGxlYXZlIHRoaXMgbW9kdWxlLgorLy8vIEZ1bmN0aW9ucyBoYXZlIGEgY2FsbCBlZGdlIHRvIHRoZSBleHRlcm5hbCBub2RlIGlmZjoKKy8vLyAgIDEuIFRoZSBmdW5jdGlvbiBpcyBleHRlcm5hbCwgcmVmbGVjdGluZyB0aGUgZmFjdCB0aGF0IHRoZXkgY291bGQgY2FsbAorLy8vICAgICAgYW55dGhpbmcgd2l0aG91dCBpbnRlcm5hbCBsaW5rYWdlIG9yIHRoYXQgaGFzIGl0cyBhZGRyZXNzIHRha2VuLgorLy8vICAgMi4gVGhlIGZ1bmN0aW9uIGNvbnRhaW5zIGFuIGluZGlyZWN0IGZ1bmN0aW9uIGNhbGwuCisvLy8KKy8vLyBBcyBhbiBleHRlbnNpb24gaW4gdGhlIGZ1dHVyZSwgdGhlcmUgbWF5IGJlIG11bHRpcGxlIG5vZGVzIHdpdGggYSBudWxsCisvLy8gZnVuY3Rpb24uICBUaGVzZSB3aWxsIGJlIHVzZWQgd2hlbiB3ZSBjYW4gcHJvdmUgKHRocm91Z2ggcG9pbnRlciBhbmFseXNpcykKKy8vLyB0aGF0IGFuIGluZGlyZWN0IGNhbGwgc2l0ZSBjYW4gY2FsbCBvbmx5IGEgc3BlY2lmaWMgc2V0IG9mIGZ1bmN0aW9ucy4KKy8vLworLy8vIEJlY2F1c2Ugb2YgdGhlc2UgcHJvcGVydGllcywgdGhlIENhbGxHcmFwaCBjYXB0dXJlcyBhIGNvbnNlcnZhdGl2ZSBzdXBlcnNldAorLy8vIG9mIGFsbCBvZiB0aGUgY2FsbGVyLWNhbGxlZSByZWxhdGlvbnNoaXBzLCB3aGljaCBpcyB1c2VmdWwgZm9yCisvLy8gdHJhbnNmb3JtYXRpb25zLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfQ0FMTEdSQVBIX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19DQUxMR1JBUEhfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlSGFuZGxlLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIENhbGxHcmFwaE5vZGU7CitjbGFzcyBNb2R1bGU7CitjbGFzcyByYXdfb3N0cmVhbTsKKworLy8vIFxicmllZiBUaGUgYmFzaWMgZGF0YSBjb250YWluZXIgZm9yIHRoZSBjYWxsIGdyYXBoIG9mIGEgXGMgTW9kdWxlIG9mIElSLgorLy8vCisvLy8gVGhpcyBjbGFzcyBleHBvc2VzIGJvdGggdGhlIGludGVyZmFjZSB0byB0aGUgY2FsbCBncmFwaCBmb3IgYSBtb2R1bGUgb2YgSVIuCisvLy8KKy8vLyBUaGUgY29yZSBjYWxsIGdyYXBoIGl0c2VsZiBjYW4gYWxzbyBiZSB1cGRhdGVkIHRvIHJlZmxlY3QgY2hhbmdlcyB0byB0aGUgSVIuCitjbGFzcyBDYWxsR3JhcGggeworICBNb2R1bGUgJk07CisKKyAgdXNpbmcgRnVuY3Rpb25NYXBUeSA9CisgICAgICBzdGQ6Om1hcDxjb25zdCBGdW5jdGlvbiAqLCBzdGQ6OnVuaXF1ZV9wdHI8Q2FsbEdyYXBoTm9kZT4+OworCisgIC8vLyBcYnJpZWYgQSBtYXAgZnJvbSBcYyBGdW5jdGlvbiogdG8gXGMgQ2FsbEdyYXBoTm9kZSouCisgIEZ1bmN0aW9uTWFwVHkgRnVuY3Rpb25NYXA7CisKKyAgLy8vIFxicmllZiBUaGlzIG5vZGUgaGFzIGVkZ2VzIHRvIGFsbCBleHRlcm5hbCBmdW5jdGlvbnMgYW5kIHRob3NlIGludGVybmFsCisgIC8vLyBmdW5jdGlvbnMgdGhhdCBoYXZlIHRoZWlyIGFkZHJlc3MgdGFrZW4uCisgIENhbGxHcmFwaE5vZGUgKkV4dGVybmFsQ2FsbGluZ05vZGU7CisKKyAgLy8vIFxicmllZiBUaGlzIG5vZGUgaGFzIGVkZ2VzIHRvIGl0IGZyb20gYWxsIGZ1bmN0aW9ucyBtYWtpbmcgaW5kaXJlY3QgY2FsbHMKKyAgLy8vIG9yIGNhbGxpbmcgYW4gZXh0ZXJuYWwgZnVuY3Rpb24uCisgIHN0ZDo6dW5pcXVlX3B0cjxDYWxsR3JhcGhOb2RlPiBDYWxsc0V4dGVybmFsTm9kZTsKKworICAvLy8gXGJyaWVmIFJlcGxhY2UgdGhlIGZ1bmN0aW9uIHJlcHJlc2VudGVkIGJ5IHRoaXMgbm9kZSBieSBhbm90aGVyLgorICAvLy8KKyAgLy8vIFRoaXMgZG9lcyBub3QgcmVzY2FuIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbiwgc28gaXQgaXMgc3VpdGFibGUgd2hlbgorICAvLy8gc3BsaWNpbmcgdGhlIGJvZHkgb2Ygb25lIGZ1bmN0aW9uIHRvIGFub3RoZXIgd2hpbGUgYWxzbyB1cGRhdGluZyBhbGwKKyAgLy8vIGNhbGxlcnMgZnJvbSB0aGUgb2xkIGZ1bmN0aW9uIHRvIHRoZSBuZXcuCisgIHZvaWQgc3BsaWNlRnVuY3Rpb24oY29uc3QgRnVuY3Rpb24gKkZyb20sIGNvbnN0IEZ1bmN0aW9uICpUbyk7CisKKyAgLy8vIFxicmllZiBBZGQgYSBmdW5jdGlvbiB0byB0aGUgY2FsbCBncmFwaCwgYW5kIGxpbmsgdGhlIG5vZGUgdG8gYWxsIG9mIHRoZQorICAvLy8gZnVuY3Rpb25zIHRoYXQgaXQgY2FsbHMuCisgIHZvaWQgYWRkVG9DYWxsR3JhcGgoRnVuY3Rpb24gKkYpOworCitwdWJsaWM6CisgIGV4cGxpY2l0IENhbGxHcmFwaChNb2R1bGUgJk0pOworICBDYWxsR3JhcGgoQ2FsbEdyYXBoICYmQXJnKTsKKyAgfkNhbGxHcmFwaCgpOworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBGdW5jdGlvbk1hcFR5OjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBGdW5jdGlvbk1hcFR5Ojpjb25zdF9pdGVyYXRvcjsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG1vZHVsZSB0aGUgY2FsbCBncmFwaCBjb3JyZXNwb25kcyB0by4KKyAgTW9kdWxlICZnZXRNb2R1bGUoKSBjb25zdCB7IHJldHVybiBNOyB9CisKKyAgaW5saW5lIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gRnVuY3Rpb25NYXAuYmVnaW4oKTsgfQorICBpbmxpbmUgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gRnVuY3Rpb25NYXAuZW5kKCk7IH0KKyAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gRnVuY3Rpb25NYXAuYmVnaW4oKTsgfQorICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gRnVuY3Rpb25NYXAuZW5kKCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGNhbGwgZ3JhcGggbm9kZSBmb3IgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLgorICBpbmxpbmUgY29uc3QgQ2FsbEdyYXBoTm9kZSAqb3BlcmF0b3JbXShjb25zdCBGdW5jdGlvbiAqRikgY29uc3QgeworICAgIGNvbnN0X2l0ZXJhdG9yIEkgPSBGdW5jdGlvbk1hcC5maW5kKEYpOworICAgIGFzc2VydChJICE9IEZ1bmN0aW9uTWFwLmVuZCgpICYmICJGdW5jdGlvbiBub3QgaW4gY2FsbGdyYXBoISIpOworICAgIHJldHVybiBJLT5zZWNvbmQuZ2V0KCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGNhbGwgZ3JhcGggbm9kZSBmb3IgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLgorICBpbmxpbmUgQ2FsbEdyYXBoTm9kZSAqb3BlcmF0b3JbXShjb25zdCBGdW5jdGlvbiAqRikgeworICAgIGNvbnN0X2l0ZXJhdG9yIEkgPSBGdW5jdGlvbk1hcC5maW5kKEYpOworICAgIGFzc2VydChJICE9IEZ1bmN0aW9uTWFwLmVuZCgpICYmICJGdW5jdGlvbiBub3QgaW4gY2FsbGdyYXBoISIpOworICAgIHJldHVybiBJLT5zZWNvbmQuZ2V0KCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIFxjIENhbGxHcmFwaE5vZGUgd2hpY2ggaXMgdXNlZCB0byByZXByZXNlbnQKKyAgLy8vIHVuZGV0ZXJtaW5lZCBjYWxscyBpbnRvIHRoZSBjYWxsZ3JhcGguCisgIENhbGxHcmFwaE5vZGUgKmdldEV4dGVybmFsQ2FsbGluZ05vZGUoKSBjb25zdCB7IHJldHVybiBFeHRlcm5hbENhbGxpbmdOb2RlOyB9CisKKyAgQ2FsbEdyYXBoTm9kZSAqZ2V0Q2FsbHNFeHRlcm5hbE5vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIENhbGxzRXh0ZXJuYWxOb2RlLmdldCgpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gRnVuY3Rpb25zIHRvIGtlZXAgYSBjYWxsIGdyYXBoIHVwIHRvIGRhdGUgd2l0aCBhIGZ1bmN0aW9uIHRoYXQgaGFzIGJlZW4KKyAgLy8gbW9kaWZpZWQuCisgIC8vCisKKyAgLy8vIFxicmllZiBVbmxpbmsgdGhlIGZ1bmN0aW9uIGZyb20gdGhpcyBtb2R1bGUsIHJldHVybmluZyBpdC4KKyAgLy8vCisgIC8vLyBCZWNhdXNlIHRoaXMgcmVtb3ZlcyB0aGUgZnVuY3Rpb24gZnJvbSB0aGUgbW9kdWxlLCB0aGUgY2FsbCBncmFwaCBub2RlIGlzCisgIC8vLyBkZXN0cm95ZWQuICBUaGlzIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGZ1bmN0aW9uIGRvZXMgbm90IGNhbGwgYW55IG90aGVyCisgIC8vLyBmdW5jdGlvbnMgKGllLCB0aGVyZSBhcmUgbm8gZWRnZXMgaW4gaXQncyBDR04pLiAgVGhlIGVhc2llc3Qgd2F5IHRvIGRvCisgIC8vLyB0aGlzIGlzIHRvIGRyb3BBbGxSZWZlcmVuY2VzIGJlZm9yZSBjYWxsaW5nIHRoaXMuCisgIEZ1bmN0aW9uICpyZW1vdmVGdW5jdGlvbkZyb21Nb2R1bGUoQ2FsbEdyYXBoTm9kZSAqQ0dOKTsKKworICAvLy8gXGJyaWVmIFNpbWlsYXIgdG8gb3BlcmF0b3JbXSwgYnV0IHRoaXMgd2lsbCBpbnNlcnQgYSBuZXcgQ2FsbEdyYXBoTm9kZSBmb3IKKyAgLy8vIFxjIEYgaWYgb25lIGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCisgIENhbGxHcmFwaE5vZGUgKmdldE9ySW5zZXJ0RnVuY3Rpb24oY29uc3QgRnVuY3Rpb24gKkYpOworfTsKKworLy8vIFxicmllZiBBIG5vZGUgaW4gdGhlIGNhbGwgZ3JhcGggZm9yIGEgbW9kdWxlLgorLy8vCisvLy8gVHlwaWNhbGx5IHJlcHJlc2VudHMgYSBmdW5jdGlvbiBpbiB0aGUgY2FsbCBncmFwaC4gVGhlcmUgYXJlIGFsc28gc3BlY2lhbAorLy8vICJudWxsIiBub2RlcyB1c2VkIHRvIHJlcHJlc2VudCB0aGVvcmV0aWNhbCBlbnRyaWVzIGluIHRoZSBjYWxsIGdyYXBoLgorY2xhc3MgQ2FsbEdyYXBoTm9kZSB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQSBwYWlyIG9mIHRoZSBjYWxsaW5nIGluc3RydWN0aW9uIChhIGNhbGwgb3IgaW52b2tlKQorICAvLy8gYW5kIHRoZSBjYWxsIGdyYXBoIG5vZGUgYmVpbmcgY2FsbGVkLgorICB1c2luZyBDYWxsUmVjb3JkID0gc3RkOjpwYWlyPFdlYWtUcmFja2luZ1ZILCBDYWxsR3JhcGhOb2RlICo+OworCitwdWJsaWM6CisgIHVzaW5nIENhbGxlZEZ1bmN0aW9uc1ZlY3RvciA9IHN0ZDo6dmVjdG9yPENhbGxSZWNvcmQ+OworCisgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhIG5vZGUgZm9yIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24uCisgIGlubGluZSBDYWxsR3JhcGhOb2RlKEZ1bmN0aW9uICpGKSA6IEYoRikge30KKworICBDYWxsR3JhcGhOb2RlKGNvbnN0IENhbGxHcmFwaE5vZGUgJikgPSBkZWxldGU7CisgIENhbGxHcmFwaE5vZGUgJm9wZXJhdG9yPShjb25zdCBDYWxsR3JhcGhOb2RlICYpID0gZGVsZXRlOworCisgIH5DYWxsR3JhcGhOb2RlKCkgeworICAgIGFzc2VydChOdW1SZWZlcmVuY2VzID09IDAgJiYgIk5vZGUgZGVsZXRlZCB3aGlsZSByZWZlcmVuY2VzIHJlbWFpbiIpOworICB9CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBzdGQ6OnZlY3RvcjxDYWxsUmVjb3JkPjo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gc3RkOjp2ZWN0b3I8Q2FsbFJlY29yZD46OmNvbnN0X2l0ZXJhdG9yOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgZnVuY3Rpb24gdGhhdCB0aGlzIGNhbGwgZ3JhcGggbm9kZSByZXByZXNlbnRzLgorICBGdW5jdGlvbiAqZ2V0RnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBGOyB9CisKKyAgaW5saW5lIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gQ2FsbGVkRnVuY3Rpb25zLmJlZ2luKCk7IH0KKyAgaW5saW5lIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIENhbGxlZEZ1bmN0aW9ucy5lbmQoKTsgfQorICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBDYWxsZWRGdW5jdGlvbnMuYmVnaW4oKTsgfQorICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gQ2FsbGVkRnVuY3Rpb25zLmVuZCgpOyB9CisgIGlubGluZSBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gQ2FsbGVkRnVuY3Rpb25zLmVtcHR5KCk7IH0KKyAgaW5saW5lIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiAodW5zaWduZWQpQ2FsbGVkRnVuY3Rpb25zLnNpemUoKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbnVtYmVyIG9mIG90aGVyIENhbGxHcmFwaE5vZGVzIGluIHRoaXMgQ2FsbEdyYXBoIHRoYXQKKyAgLy8vIHJlZmVyZW5jZSB0aGlzIG5vZGUgaW4gdGhlaXIgY2FsbGVlIGxpc3QuCisgIHVuc2lnbmVkIGdldE51bVJlZmVyZW5jZXMoKSBjb25zdCB7IHJldHVybiBOdW1SZWZlcmVuY2VzOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBpJ3RoIGNhbGxlZCBmdW5jdGlvbi4KKyAgQ2FsbEdyYXBoTm9kZSAqb3BlcmF0b3JbXSh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBDYWxsZWRGdW5jdGlvbnMuc2l6ZSgpICYmICJJbnZhbGlkIGluZGV4Iik7CisgICAgcmV0dXJuIENhbGxlZEZ1bmN0aW9uc1tpXS5zZWNvbmQ7CisgIH0KKworICAvLy8gXGJyaWVmIFByaW50IG91dCB0aGlzIGNhbGwgZ3JhcGggbm9kZS4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBNZXRob2RzIHRvIGtlZXAgYSBjYWxsIGdyYXBoIHVwIHRvIGRhdGUgd2l0aCBhIGZ1bmN0aW9uIHRoYXQgaGFzIGJlZW4KKyAgLy8gbW9kaWZpZWQKKyAgLy8KKworICAvLy8gXGJyaWVmIFJlbW92ZXMgYWxsIGVkZ2VzIGZyb20gdGhpcyBDYWxsR3JhcGhOb2RlIHRvIGFueSBmdW5jdGlvbnMgaXQKKyAgLy8vIGNhbGxzLgorICB2b2lkIHJlbW92ZUFsbENhbGxlZEZ1bmN0aW9ucygpIHsKKyAgICB3aGlsZSAoIUNhbGxlZEZ1bmN0aW9ucy5lbXB0eSgpKSB7CisgICAgICBDYWxsZWRGdW5jdGlvbnMuYmFjaygpLnNlY29uZC0+RHJvcFJlZigpOworICAgICAgQ2FsbGVkRnVuY3Rpb25zLnBvcF9iYWNrKCk7CisgICAgfQorICB9CisKKyAgLy8vIFxicmllZiBNb3ZlcyBhbGwgdGhlIGNhbGxlZSBpbmZvcm1hdGlvbiBmcm9tIE4gdG8gdGhpcyBub2RlLgorICB2b2lkIHN0ZWFsQ2FsbGVkRnVuY3Rpb25zRnJvbShDYWxsR3JhcGhOb2RlICpOKSB7CisgICAgYXNzZXJ0KENhbGxlZEZ1bmN0aW9ucy5lbXB0eSgpICYmCisgICAgICAgICAgICJDYW5ub3Qgc3RlYWwgY2FsbHNpdGUgaW5mb3JtYXRpb24gaWYgSSBhbHJlYWR5IGhhdmUgc29tZSIpOworICAgIHN0ZDo6c3dhcChDYWxsZWRGdW5jdGlvbnMsIE4tPkNhbGxlZEZ1bmN0aW9ucyk7CisgIH0KKworICAvLy8gXGJyaWVmIEFkZHMgYSBmdW5jdGlvbiB0byB0aGUgbGlzdCBvZiBmdW5jdGlvbnMgY2FsbGVkIGJ5IHRoaXMgb25lLgorICB2b2lkIGFkZENhbGxlZEZ1bmN0aW9uKENhbGxTaXRlIENTLCBDYWxsR3JhcGhOb2RlICpNKSB7CisgICAgYXNzZXJ0KCFDUy5nZXRJbnN0cnVjdGlvbigpIHx8ICFDUy5nZXRDYWxsZWRGdW5jdGlvbigpIHx8CisgICAgICAgICAgICFDUy5nZXRDYWxsZWRGdW5jdGlvbigpLT5pc0ludHJpbnNpYygpIHx8CisgICAgICAgICAgICFJbnRyaW5zaWM6OmlzTGVhZihDUy5nZXRDYWxsZWRGdW5jdGlvbigpLT5nZXRJbnRyaW5zaWNJRCgpKSk7CisgICAgQ2FsbGVkRnVuY3Rpb25zLmVtcGxhY2VfYmFjayhDUy5nZXRJbnN0cnVjdGlvbigpLCBNKTsKKyAgICBNLT5BZGRSZWYoKTsKKyAgfQorCisgIHZvaWQgcmVtb3ZlQ2FsbEVkZ2UoaXRlcmF0b3IgSSkgeworICAgIEktPnNlY29uZC0+RHJvcFJlZigpOworICAgICpJID0gQ2FsbGVkRnVuY3Rpb25zLmJhY2soKTsKKyAgICBDYWxsZWRGdW5jdGlvbnMucG9wX2JhY2soKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVtb3ZlcyB0aGUgZWRnZSBpbiB0aGUgbm9kZSBmb3IgdGhlIHNwZWNpZmllZCBjYWxsIHNpdGUuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIHRha2VzIGxpbmVhciB0aW1lLCBzbyBpdCBzaG91bGQgYmUgdXNlZCBzcGFyaW5nbHkuCisgIHZvaWQgcmVtb3ZlQ2FsbEVkZ2VGb3IoQ2FsbFNpdGUgQ1MpOworCisgIC8vLyBcYnJpZWYgUmVtb3ZlcyBhbGwgY2FsbCBlZGdlcyBmcm9tIHRoaXMgbm9kZSB0byB0aGUgc3BlY2lmaWVkIGNhbGxlZQorICAvLy8gZnVuY3Rpb24uCisgIC8vLworICAvLy8gVGhpcyB0YWtlcyBtb3JlIHRpbWUgdG8gZXhlY3V0ZSB0aGFuIHJlbW92ZUNhbGxFZGdlVG8sIHNvIGl0IHNob3VsZCBub3QKKyAgLy8vIGJlIHVzZWQgdW5sZXNzIG5lY2Vzc2FyeS4KKyAgdm9pZCByZW1vdmVBbnlDYWxsRWRnZVRvKENhbGxHcmFwaE5vZGUgKkNhbGxlZSk7CisKKyAgLy8vIFxicmllZiBSZW1vdmVzIG9uZSBlZGdlIGFzc29jaWF0ZWQgd2l0aCBhIG51bGwgY2FsbHNpdGUgZnJvbSB0aGlzIG5vZGUgdG8KKyAgLy8vIHRoZSBzcGVjaWZpZWQgY2FsbGVlIGZ1bmN0aW9uLgorICB2b2lkIHJlbW92ZU9uZUFic3RyYWN0RWRnZVRvKENhbGxHcmFwaE5vZGUgKkNhbGxlZSk7CisKKyAgLy8vIFxicmllZiBSZXBsYWNlcyB0aGUgZWRnZSBpbiB0aGUgbm9kZSBmb3IgdGhlIHNwZWNpZmllZCBjYWxsIHNpdGUgd2l0aCBhCisgIC8vLyBuZXcgb25lLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCB0YWtlcyBsaW5lYXIgdGltZSwgc28gaXQgc2hvdWxkIGJlIHVzZWQgc3BhcmluZ2x5LgorICB2b2lkIHJlcGxhY2VDYWxsRWRnZShDYWxsU2l0ZSBDUywgQ2FsbFNpdGUgTmV3Q1MsIENhbGxHcmFwaE5vZGUgKk5ld05vZGUpOworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQ2FsbEdyYXBoOworCisgIEZ1bmN0aW9uICpGOworCisgIHN0ZDo6dmVjdG9yPENhbGxSZWNvcmQ+IENhbGxlZEZ1bmN0aW9uczsKKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgdGltZXMgdGhhdCB0aGlzIENhbGxHcmFwaE5vZGUgb2NjdXJzIGluIHRoZQorICAvLy8gQ2FsbGVkRnVuY3Rpb25zIGFycmF5IG9mIHRoaXMgb3Igb3RoZXIgQ2FsbEdyYXBoTm9kZXMuCisgIHVuc2lnbmVkIE51bVJlZmVyZW5jZXMgPSAwOworCisgIHZvaWQgRHJvcFJlZigpIHsgLS1OdW1SZWZlcmVuY2VzOyB9CisgIHZvaWQgQWRkUmVmKCkgeyArK051bVJlZmVyZW5jZXM7IH0KKworICAvLy8gXGJyaWVmIEEgc3BlY2lhbCBmdW5jdGlvbiB0aGF0IHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgdGhlIENhbGxHcmFwaCBjbGFzcy4KKyAgdm9pZCBhbGxSZWZlcmVuY2VzRHJvcHBlZCgpIHsgTnVtUmVmZXJlbmNlcyA9IDA7IH0KK307CisKKy8vLyBcYnJpZWYgQW4gYW5hbHlzaXMgcGFzcyB0byBjb21wdXRlIHRoZSBcYyBDYWxsR3JhcGggZm9yIGEgXGMgTW9kdWxlLgorLy8vCisvLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBjb25jZXB0IG9mIGFuIGFuYWx5c2lzIHBhc3MgdXNlZCBieSB0aGUgXGMKKy8vLyBNb2R1bGVBbmFseXNpc01hbmFnZXIgdG8gcnVuIGFuIGFuYWx5c2lzIG92ZXIgYSBtb2R1bGUgYW5kIGNhY2hlIHRoZQorLy8vIHJlc3VsdGluZyBkYXRhLgorY2xhc3MgQ2FsbEdyYXBoQW5hbHlzaXMgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48Q2FsbEdyYXBoQW5hbHlzaXM+IHsKKyAgZnJpZW5kIEFuYWx5c2lzSW5mb01peGluPENhbGxHcmFwaEFuYWx5c2lzPjsKKworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQSBmb3JtdWxhaWMgdHlwZSB0byBpbmZvcm0gY2xpZW50cyBvZiB0aGUgcmVzdWx0IHR5cGUuCisgIHVzaW5nIFJlc3VsdCA9IENhbGxHcmFwaDsKKworICAvLy8gXGJyaWVmIENvbXB1dGUgdGhlIFxjIENhbGxHcmFwaCBmb3IgdGhlIG1vZHVsZSBcYyBNLgorICAvLy8KKyAgLy8vIFRoZSByZWFsIHdvcmsgaGVyZSBpcyBkb25lIGluIHRoZSBcYyBDYWxsR3JhcGggY29uc3RydWN0b3IuCisgIENhbGxHcmFwaCBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJikgeyByZXR1cm4gQ2FsbEdyYXBoKE0pOyB9Cit9OworCisvLy8gXGJyaWVmIFByaW50ZXIgcGFzcyBmb3IgdGhlIFxjIENhbGxHcmFwaEFuYWx5c2lzIHJlc3VsdHMuCitjbGFzcyBDYWxsR3JhcGhQcmludGVyUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPENhbGxHcmFwaFByaW50ZXJQYXNzPiB7CisgIHJhd19vc3RyZWFtICZPUzsKKworcHVibGljOgorICBleHBsaWNpdCBDYWxsR3JhcGhQcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmT1MpIDogT1MoT1MpIHt9CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gXGJyaWVmIFRoZSBcYyBNb2R1bGVQYXNzIHdoaWNoIHdyYXBzIHVwIGEgXGMgQ2FsbEdyYXBoIGFuZCB0aGUgbG9naWMgdG8KKy8vLyBidWlsZCBpdC4KKy8vLworLy8vIFRoaXMgY2xhc3MgZXhwb3NlcyBib3RoIHRoZSBpbnRlcmZhY2UgdG8gdGhlIGNhbGwgZ3JhcGggY29udGFpbmVyIGFuZCB0aGUKKy8vLyBtb2R1bGUgcGFzcyB3aGljaCBydW5zIG92ZXIgYSBtb2R1bGUgb2YgSVIgYW5kIHByb2R1Y2VzIHRoZSBjYWxsIGdyYXBoLiBUaGUKKy8vLyBjYWxsIGdyYXBoIGludGVyZmFjZSBpcyBlbnRpcmVsbHkgYSB3cmFwcGVyIGFyb3VuZCBhIFxjIENhbGxHcmFwaCBvYmplY3QKKy8vLyB3aGljaCBpcyBzdG9yZWQgaW50ZXJuYWxseSBmb3IgZWFjaCBtb2R1bGUuCitjbGFzcyBDYWxsR3JhcGhXcmFwcGVyUGFzcyA6IHB1YmxpYyBNb2R1bGVQYXNzIHsKKyAgc3RkOjp1bmlxdWVfcHRyPENhbGxHcmFwaD4gRzsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsgLy8gQ2xhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaW5mbworCisgIENhbGxHcmFwaFdyYXBwZXJQYXNzKCk7CisgIH5DYWxsR3JhcGhXcmFwcGVyUGFzcygpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgVGhlIGludGVybmFsIFxjIENhbGxHcmFwaCBhcm91bmQgd2hpY2ggdGhlIHJlc3Qgb2YgdGhpcyBpbnRlcmZhY2UKKyAgLy8vIGlzIHdyYXBwZWQuCisgIGNvbnN0IENhbGxHcmFwaCAmZ2V0Q2FsbEdyYXBoKCkgY29uc3QgeyByZXR1cm4gKkc7IH0KKyAgQ2FsbEdyYXBoICZnZXRDYWxsR3JhcGgoKSB7IHJldHVybiAqRzsgfQorCisgIHVzaW5nIGl0ZXJhdG9yID0gQ2FsbEdyYXBoOjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBDYWxsR3JhcGg6OmNvbnN0X2l0ZXJhdG9yOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbW9kdWxlIHRoZSBjYWxsIGdyYXBoIGNvcnJlc3BvbmRzIHRvLgorICBNb2R1bGUgJmdldE1vZHVsZSgpIGNvbnN0IHsgcmV0dXJuIEctPmdldE1vZHVsZSgpOyB9CisKKyAgaW5saW5lIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gRy0+YmVnaW4oKTsgfQorICBpbmxpbmUgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gRy0+ZW5kKCk7IH0KKyAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gRy0+YmVnaW4oKTsgfQorICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gRy0+ZW5kKCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGNhbGwgZ3JhcGggbm9kZSBmb3IgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uLgorICBpbmxpbmUgY29uc3QgQ2FsbEdyYXBoTm9kZSAqb3BlcmF0b3JbXShjb25zdCBGdW5jdGlvbiAqRikgY29uc3QgeworICAgIHJldHVybiAoKkcpW0ZdOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBjYWxsIGdyYXBoIG5vZGUgZm9yIHRoZSBwcm92aWRlZCBmdW5jdGlvbi4KKyAgaW5saW5lIENhbGxHcmFwaE5vZGUgKm9wZXJhdG9yW10oY29uc3QgRnVuY3Rpb24gKkYpIHsgcmV0dXJuICgqRylbRl07IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIFxjIENhbGxHcmFwaE5vZGUgd2hpY2ggaXMgdXNlZCB0byByZXByZXNlbnQKKyAgLy8vIHVuZGV0ZXJtaW5lZCBjYWxscyBpbnRvIHRoZSBjYWxsZ3JhcGguCisgIENhbGxHcmFwaE5vZGUgKmdldEV4dGVybmFsQ2FsbGluZ05vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIEctPmdldEV4dGVybmFsQ2FsbGluZ05vZGUoKTsKKyAgfQorCisgIENhbGxHcmFwaE5vZGUgKmdldENhbGxzRXh0ZXJuYWxOb2RlKCkgY29uc3QgeworICAgIHJldHVybiBHLT5nZXRDYWxsc0V4dGVybmFsTm9kZSgpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gRnVuY3Rpb25zIHRvIGtlZXAgYSBjYWxsIGdyYXBoIHVwIHRvIGRhdGUgd2l0aCBhIGZ1bmN0aW9uIHRoYXQgaGFzIGJlZW4KKyAgLy8gbW9kaWZpZWQuCisgIC8vCisKKyAgLy8vIFxicmllZiBVbmxpbmsgdGhlIGZ1bmN0aW9uIGZyb20gdGhpcyBtb2R1bGUsIHJldHVybmluZyBpdC4KKyAgLy8vCisgIC8vLyBCZWNhdXNlIHRoaXMgcmVtb3ZlcyB0aGUgZnVuY3Rpb24gZnJvbSB0aGUgbW9kdWxlLCB0aGUgY2FsbCBncmFwaCBub2RlIGlzCisgIC8vLyBkZXN0cm95ZWQuICBUaGlzIGlzIG9ubHkgdmFsaWQgaWYgdGhlIGZ1bmN0aW9uIGRvZXMgbm90IGNhbGwgYW55IG90aGVyCisgIC8vLyBmdW5jdGlvbnMgKGllLCB0aGVyZSBhcmUgbm8gZWRnZXMgaW4gaXQncyBDR04pLiAgVGhlIGVhc2llc3Qgd2F5IHRvIGRvCisgIC8vLyB0aGlzIGlzIHRvIGRyb3BBbGxSZWZlcmVuY2VzIGJlZm9yZSBjYWxsaW5nIHRoaXMuCisgIEZ1bmN0aW9uICpyZW1vdmVGdW5jdGlvbkZyb21Nb2R1bGUoQ2FsbEdyYXBoTm9kZSAqQ0dOKSB7CisgICAgcmV0dXJuIEctPnJlbW92ZUZ1bmN0aW9uRnJvbU1vZHVsZShDR04pOworICB9CisKKyAgLy8vIFxicmllZiBTaW1pbGFyIHRvIG9wZXJhdG9yW10sIGJ1dCB0aGlzIHdpbGwgaW5zZXJ0IGEgbmV3IENhbGxHcmFwaE5vZGUgZm9yCisgIC8vLyBcYyBGIGlmIG9uZSBkb2VzIG5vdCBhbHJlYWR5IGV4aXN0LgorICBDYWxsR3JhcGhOb2RlICpnZXRPckluc2VydEZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgICAgcmV0dXJuIEctPmdldE9ySW5zZXJ0RnVuY3Rpb24oRik7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgTW9kdWxlUGFzcyBpbnRlcmZhY2UgbmVlZGVkIGhlcmUuCisgIC8vCisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBydW5Pbk1vZHVsZShNb2R1bGUgJk0pIG92ZXJyaWRlOworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZTsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZvLCBjb25zdCBNb2R1bGUgKikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEdyYXBoVHJhaXRzIHNwZWNpYWxpemF0aW9ucyBmb3IgY2FsbCBncmFwaHMgc28gdGhhdCB0aGV5IGNhbiBiZSB0cmVhdGVkIGFzCisvLyBncmFwaHMgYnkgdGhlIGdlbmVyaWMgZ3JhcGggYWxnb3JpdGhtcy4KKy8vCisKKy8vIFByb3ZpZGUgZ3JhcGggdHJhaXRzIGZvciB0cmFudmVyc2luZyBjYWxsIGdyYXBocyB1c2luZyBzdGFuZGFyZCBncmFwaAorLy8gdHJhdmVyc2Fscy4KK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxDYWxsR3JhcGhOb2RlICo+IHsKKyAgdXNpbmcgTm9kZVJlZiA9IENhbGxHcmFwaE5vZGUgKjsKKyAgdXNpbmcgQ0dOUGFpclR5ID0gQ2FsbEdyYXBoTm9kZTo6Q2FsbFJlY29yZDsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoQ2FsbEdyYXBoTm9kZSAqQ0dOKSB7IHJldHVybiBDR047IH0KKyAgc3RhdGljIENhbGxHcmFwaE5vZGUgKkNHTkdldFZhbHVlKENHTlBhaXJUeSBQKSB7IHJldHVybiBQLnNlY29uZDsgfQorCisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0KKyAgICAgIG1hcHBlZF9pdGVyYXRvcjxDYWxsR3JhcGhOb2RlOjppdGVyYXRvciwgZGVjbHR5cGUoJkNHTkdldFZhbHVlKT47CisKKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeworICAgIHJldHVybiBDaGlsZEl0ZXJhdG9yVHlwZShOLT5iZWdpbigpLCAmQ0dOR2V0VmFsdWUpOworICB9CisKKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlUmVmIE4pIHsKKyAgICByZXR1cm4gQ2hpbGRJdGVyYXRvclR5cGUoTi0+ZW5kKCksICZDR05HZXRWYWx1ZSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxjb25zdCBDYWxsR3JhcGhOb2RlICo+IHsKKyAgdXNpbmcgTm9kZVJlZiA9IGNvbnN0IENhbGxHcmFwaE5vZGUgKjsKKyAgdXNpbmcgQ0dOUGFpclR5ID0gQ2FsbEdyYXBoTm9kZTo6Q2FsbFJlY29yZDsKKyAgdXNpbmcgRWRnZVJlZiA9IGNvbnN0IENhbGxHcmFwaE5vZGU6OkNhbGxSZWNvcmQgJjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoY29uc3QgQ2FsbEdyYXBoTm9kZSAqQ0dOKSB7IHJldHVybiBDR047IH0KKyAgc3RhdGljIGNvbnN0IENhbGxHcmFwaE5vZGUgKkNHTkdldFZhbHVlKENHTlBhaXJUeSBQKSB7IHJldHVybiBQLnNlY29uZDsgfQorCisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0KKyAgICAgIG1hcHBlZF9pdGVyYXRvcjxDYWxsR3JhcGhOb2RlOjpjb25zdF9pdGVyYXRvciwgZGVjbHR5cGUoJkNHTkdldFZhbHVlKT47CisgIHVzaW5nIENoaWxkRWRnZUl0ZXJhdG9yVHlwZSA9IENhbGxHcmFwaE5vZGU6OmNvbnN0X2l0ZXJhdG9yOworCisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsKKyAgICByZXR1cm4gQ2hpbGRJdGVyYXRvclR5cGUoTi0+YmVnaW4oKSwgJkNHTkdldFZhbHVlKTsKKyAgfQorCisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7CisgICAgcmV0dXJuIENoaWxkSXRlcmF0b3JUeXBlKE4tPmVuZCgpLCAmQ0dOR2V0VmFsdWUpOworICB9CisKKyAgc3RhdGljIENoaWxkRWRnZUl0ZXJhdG9yVHlwZSBjaGlsZF9lZGdlX2JlZ2luKE5vZGVSZWYgTikgeworICAgIHJldHVybiBOLT5iZWdpbigpOworICB9CisgIHN0YXRpYyBDaGlsZEVkZ2VJdGVyYXRvclR5cGUgY2hpbGRfZWRnZV9lbmQoTm9kZVJlZiBOKSB7IHJldHVybiBOLT5lbmQoKTsgfQorCisgIHN0YXRpYyBOb2RlUmVmIGVkZ2VfZGVzdChFZGdlUmVmIEUpIHsgcmV0dXJuIEUuc2Vjb25kOyB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IEdyYXBoVHJhaXRzPENhbGxHcmFwaCAqPiA6IHB1YmxpYyBHcmFwaFRyYWl0czxDYWxsR3JhcGhOb2RlICo+IHsKKyAgdXNpbmcgUGFpclR5ID0KKyAgICAgIHN0ZDo6cGFpcjxjb25zdCBGdW5jdGlvbiAqY29uc3QsIHN0ZDo6dW5pcXVlX3B0cjxDYWxsR3JhcGhOb2RlPj47CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKENhbGxHcmFwaCAqQ0dOKSB7CisgICAgcmV0dXJuIENHTi0+Z2V0RXh0ZXJuYWxDYWxsaW5nTm9kZSgpOyAvLyBTdGFydCBhdCB0aGUgZXh0ZXJuYWwgbm9kZSEKKyAgfQorCisgIHN0YXRpYyBDYWxsR3JhcGhOb2RlICpDR0dldFZhbHVlUHRyKGNvbnN0IFBhaXJUeSAmUCkgeworICAgIHJldHVybiBQLnNlY29uZC5nZXQoKTsKKyAgfQorCisgIC8vIG5vZGVzX2l0ZXJhdG9yL2JlZ2luL2VuZCAtIEFsbG93IGl0ZXJhdGlvbiBvdmVyIGFsbCBub2RlcyBpbiB0aGUgZ3JhcGgKKyAgdXNpbmcgbm9kZXNfaXRlcmF0b3IgPQorICAgICAgbWFwcGVkX2l0ZXJhdG9yPENhbGxHcmFwaDo6aXRlcmF0b3IsIGRlY2x0eXBlKCZDR0dldFZhbHVlUHRyKT47CisKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2JlZ2luKENhbGxHcmFwaCAqQ0cpIHsKKyAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3IoQ0ctPmJlZ2luKCksICZDR0dldFZhbHVlUHRyKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoQ2FsbEdyYXBoICpDRykgeworICAgIHJldHVybiBub2Rlc19pdGVyYXRvcihDRy0+ZW5kKCksICZDR0dldFZhbHVlUHRyKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBHcmFwaFRyYWl0czxjb25zdCBDYWxsR3JhcGggKj4gOiBwdWJsaWMgR3JhcGhUcmFpdHM8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhbGxHcmFwaE5vZGUgKj4geworICB1c2luZyBQYWlyVHkgPQorICAgICAgc3RkOjpwYWlyPGNvbnN0IEZ1bmN0aW9uICpjb25zdCwgc3RkOjp1bmlxdWVfcHRyPENhbGxHcmFwaE5vZGU+PjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoY29uc3QgQ2FsbEdyYXBoICpDR04pIHsKKyAgICByZXR1cm4gQ0dOLT5nZXRFeHRlcm5hbENhbGxpbmdOb2RlKCk7IC8vIFN0YXJ0IGF0IHRoZSBleHRlcm5hbCBub2RlIQorICB9CisKKyAgc3RhdGljIGNvbnN0IENhbGxHcmFwaE5vZGUgKkNHR2V0VmFsdWVQdHIoY29uc3QgUGFpclR5ICZQKSB7CisgICAgcmV0dXJuIFAuc2Vjb25kLmdldCgpOworICB9CisKKyAgLy8gbm9kZXNfaXRlcmF0b3IvYmVnaW4vZW5kIC0gQWxsb3cgaXRlcmF0aW9uIG92ZXIgYWxsIG5vZGVzIGluIHRoZSBncmFwaAorICB1c2luZyBub2Rlc19pdGVyYXRvciA9CisgICAgICBtYXBwZWRfaXRlcmF0b3I8Q2FsbEdyYXBoOjpjb25zdF9pdGVyYXRvciwgZGVjbHR5cGUoJkNHR2V0VmFsdWVQdHIpPjsKKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfYmVnaW4oY29uc3QgQ2FsbEdyYXBoICpDRykgeworICAgIHJldHVybiBub2Rlc19pdGVyYXRvcihDRy0+YmVnaW4oKSwgJkNHR2V0VmFsdWVQdHIpOworICB9CisKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2VuZChjb25zdCBDYWxsR3JhcGggKkNHKSB7CisgICAgcmV0dXJuIG5vZGVzX2l0ZXJhdG9yKENHLT5lbmQoKSwgJkNHR2V0VmFsdWVQdHIpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19DQUxMR1JBUEhfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DYWxsR3JhcGhTQ0NQYXNzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NhbGxHcmFwaFNDQ1Bhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2U1NDYwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DYWxsR3JhcGhTQ0NQYXNzLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8vPT09LSBDYWxsR3JhcGhTQ0NQYXNzLmggLSBQYXNzIHRoYXQgb3BlcmF0ZXMgQlUgb24gY2FsbCBncmFwaCAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIENhbGxHcmFwaFNDQ1Bhc3MgY2xhc3MsIHdoaWNoIGlzIHVzZWQgZm9yIHBhc3NlcyB3aGljaAorLy8gYXJlIGltcGxlbWVudGVkIGFzIGJvdHRvbS11cCB0cmF2ZXJzYWxzIG9uIHRoZSBjYWxsIGdyYXBoLiAgQmVjYXVzZSB0aGVyZSBtYXkKKy8vIGJlIGN5Y2xlcyBpbiB0aGUgY2FsbCBncmFwaCwgcGFzc2VzIG9mIHRoaXMgdHlwZSBvcGVyYXRlIG9uIHRoZSBjYWxsLWdyYXBoIGluCisvLyBTQ0Mgb3JkZXI6IHRoYXQgaXMsIHRoZXkgcHJvY2VzcyBmdW5jdGlvbiBib3R0b20tdXAsIGV4Y2VwdCBmb3IgcmVjdXJzaXZlCisvLyBmdW5jdGlvbnMsIHdoaWNoIHRoZXkgcHJvY2VzcyBhbGwgYXQgb25jZS4KKy8vCisvLyBUaGVzZSBwYXNzZXMgYXJlIGluaGVyZW50bHkgaW50ZXJwcm9jZWR1cmFsLCBhbmQgYXJlIHJlcXVpcmVkIHRvIGtlZXAgdGhlCisvLyBjYWxsIGdyYXBoIHVwLXRvLWRhdGUgaWYgdGhleSBkbyBhbnl0aGluZyB3aGljaCBjb3VsZCBtb2RpZnkgaXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0NBTExHUkFQSFNDQ1BBU1NfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0NBTExHUkFQSFNDQ1BBU1NfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQ2FsbEdyYXBoOworY2xhc3MgQ2FsbEdyYXBoTm9kZTsKK2NsYXNzIENhbGxHcmFwaFNDQzsKK2NsYXNzIFBNU3RhY2s7CisKK2NsYXNzIENhbGxHcmFwaFNDQ1Bhc3MgOiBwdWJsaWMgUGFzcyB7CitwdWJsaWM6CisgIGV4cGxpY2l0IENhbGxHcmFwaFNDQ1Bhc3MoY2hhciAmcGlkKSA6IFBhc3MoUFRfQ2FsbEdyYXBoU0NDLCBwaWQpIHt9CisKKyAgLy8vIGNyZWF0ZVByaW50ZXJQYXNzIC0gR2V0IGEgcGFzcyB0aGF0IHByaW50cyB0aGUgTW9kdWxlCisgIC8vLyBjb3JyZXNwb25kaW5nIHRvIGEgQ2FsbEdyYXBoLgorICBQYXNzICpjcmVhdGVQcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZCYW5uZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIHVzaW5nIGxsdm06OlBhc3M6OmRvSW5pdGlhbGl6YXRpb247CisgIHVzaW5nIGxsdm06OlBhc3M6OmRvRmluYWxpemF0aW9uOworCisgIC8vLyBkb0luaXRpYWxpemF0aW9uIC0gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJlZm9yZSB0aGUgU0NDJ3Mgb2YgdGhlIHByb2dyYW0KKyAgLy8vIGhhcyBiZWVuIHByb2Nlc3NlZCwgYWxsb3dpbmcgdGhlIHBhc3MgdG8gZG8gaW5pdGlhbGl6YXRpb24gYXMgbmVjZXNzYXJ5LgorICB2aXJ0dWFsIGJvb2wgZG9Jbml0aWFsaXphdGlvbihDYWxsR3JhcGggJkNHKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIHJ1bk9uU0NDIC0gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBzdWJjbGFzcyB0byBwZXJmb3JtCisgIC8vLyB3aGF0ZXZlciBhY3Rpb24gaXMgbmVjZXNzYXJ5IGZvciB0aGUgc3BlY2lmaWVkIFNDQy4gIE5vdGUgdGhhdAorICAvLy8gbm9uLXJlY3Vyc2l2ZSAob3Igb25seSBzZWxmLXJlY3Vyc2l2ZSkgZnVuY3Rpb25zIHdpbGwgaGF2ZSBhbiBTQ0Mgc2l6ZSBvZgorICAvLy8gMSwgd2hlcmUgcmVjdXJzaXZlIHBvcnRpb25zIG9mIHRoZSBjYWxsIGdyYXBoIHdpbGwgaGF2ZSBTQ0Mgc2l6ZSA+IDEuCisgIC8vLworICAvLy8gU0NDIHBhc3NlcyB0aGF0IGFkZCBvciBkZWxldGUgZnVuY3Rpb25zIHRvIHRoZSBTQ0MgYXJlIHJlcXVpcmVkIHRvIHVwZGF0ZQorICAvLy8gdGhlIFNDQyBsaXN0LCBvdGhlcndpc2Ugc3RhbGUgcG9pbnRlcnMgbWF5IGJlIGRlcmVmZXJlbmNlZC4KKyAgdmlydHVhbCBib29sIHJ1bk9uU0NDKENhbGxHcmFwaFNDQyAmU0NDKSA9IDA7CisKKyAgLy8vIGRvRmluYWxpemF0aW9uIC0gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIHRoZSBTQ0MncyBvZiB0aGUgcHJvZ3JhbSBoYXMKKyAgLy8vIGJlZW4gcHJvY2Vzc2VkLCBhbGxvd2luZyB0aGUgcGFzcyB0byBkbyBmaW5hbCBjbGVhbnVwIGFzIG5lY2Vzc2FyeS4KKyAgdmlydHVhbCBib29sIGRvRmluYWxpemF0aW9uKENhbGxHcmFwaCAmQ0cpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gQXNzaWduIHBhc3MgbWFuYWdlciB0byBtYW5hZ2VyIHRoaXMgcGFzcworICB2b2lkIGFzc2lnblBhc3NNYW5hZ2VyKFBNU3RhY2sgJlBNUywgUGFzc01hbmFnZXJUeXBlIFBNVCkgb3ZlcnJpZGU7CisKKyAgLy8vICBSZXR1cm4gd2hhdCBraW5kIG9mIFBhc3MgTWFuYWdlciBjYW4gbWFuYWdlIHRoaXMgcGFzcy4KKyAgUGFzc01hbmFnZXJUeXBlIGdldFBvdGVudGlhbFBhc3NNYW5hZ2VyVHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUE1UX0NhbGxHcmFwaFBhc3NNYW5hZ2VyOworICB9CisKKyAgLy8vIGdldEFuYWx5c2lzVXNhZ2UgLSBGb3IgdGhpcyBjbGFzcywgd2UgZGVjbGFyZSB0aGF0IHdlIHJlcXVpcmUgYW5kIHByZXNlcnZlCisgIC8vLyB0aGUgY2FsbCBncmFwaC4gIElmIHRoZSBkZXJpdmVkIGNsYXNzIGltcGxlbWVudHMgdGhpcyBtZXRob2QsIGl0IHNob3VsZAorICAvLy8gYWx3YXlzIGV4cGxpY2l0bHkgY2FsbCB0aGUgaW1wbGVtZW50YXRpb24gaGVyZS4KKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkluZm8pIGNvbnN0IG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgIC8vLyBPcHRpb25hbCBwYXNzZXMgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHBhc3Mgc2hvdWxkIGJlCisgIC8vLyBza2lwcGVkLiBUaGlzIGlzIHRoZSBjYXNlIHdoZW4gb3B0aW1pemF0aW9uIGJpc2VjdCBpcyBvdmVyIHRoZSBsaW1pdC4KKyAgYm9vbCBza2lwU0NDKENhbGxHcmFwaFNDQyAmU0NDKSBjb25zdDsKK307CisKKy8vLyBDYWxsR3JhcGhTQ0MgLSBUaGlzIGlzIGEgc2luZ2xlIFNDQyB0aGF0IGEgQ2FsbEdyYXBoU0NDUGFzcyBpcyBydW4gb24uCitjbGFzcyBDYWxsR3JhcGhTQ0MgeworICBjb25zdCBDYWxsR3JhcGggJkNHOyAvLyBUaGUgY2FsbCBncmFwaCBmb3IgdGhpcyBTQ0MuCisgIHZvaWQgKkNvbnRleHQ7IC8vIFRoZSBDR1Bhc3NNYW5hZ2VyIG9iamVjdCB0aGF0IGlzIHZlbmRpbmcgdGhpcy4KKyAgc3RkOjp2ZWN0b3I8Q2FsbEdyYXBoTm9kZSAqPiBOb2RlczsKKworcHVibGljOgorICBDYWxsR3JhcGhTQ0MoQ2FsbEdyYXBoICZjZywgdm9pZCAqY29udGV4dCkgOiBDRyhjZyksIENvbnRleHQoY29udGV4dCkge30KKworICB2b2lkIGluaXRpYWxpemUoQXJyYXlSZWY8Q2FsbEdyYXBoTm9kZSAqPiBOZXdOb2RlcykgeworICAgIE5vZGVzLmFzc2lnbihOZXdOb2Rlcy5iZWdpbigpLCBOZXdOb2Rlcy5lbmQoKSk7CisgIH0KKworICBib29sIGlzU2luZ3VsYXIoKSBjb25zdCB7IHJldHVybiBOb2Rlcy5zaXplKCkgPT0gMTsgfQorICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gTm9kZXMuc2l6ZSgpOyB9CisKKyAgLy8vIFJlcGxhY2VOb2RlIC0gVGhpcyBpbmZvcm1zIHRoZSBTQ0MgYW5kIHRoZSBwYXNzIG1hbmFnZXIgdGhhdCB0aGUgc3BlY2lmaWVkCisgIC8vLyBPbGQgbm9kZSBoYXMgYmVlbiBkZWxldGVkLCBhbmQgTmV3IGlzIHRvIGJlIHVzZWQgaW4gaXRzIHBsYWNlLgorICB2b2lkIFJlcGxhY2VOb2RlKENhbGxHcmFwaE5vZGUgKk9sZCwgQ2FsbEdyYXBoTm9kZSAqTmV3KTsKKworICB1c2luZyBpdGVyYXRvciA9IHN0ZDo6dmVjdG9yPENhbGxHcmFwaE5vZGUgKj46OmNvbnN0X2l0ZXJhdG9yOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gTm9kZXMuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBOb2Rlcy5lbmQoKTsgfQorCisgIGNvbnN0IENhbGxHcmFwaCAmZ2V0Q2FsbEdyYXBoKCkgeyByZXR1cm4gQ0c7IH0KK307CisKK3ZvaWQgaW5pdGlhbGl6ZUR1bW15Q0dTQ0NQYXNzUGFzcyhQYXNzUmVnaXN0cnkgJik7CisKKy8vLyBUaGlzIHBhc3MgaXMgcmVxdWlyZWQgYnkgaW50ZXJwcm9jZWR1cmFsIHJlZ2lzdGVyIGFsbG9jYXRpb24uIEl0IGZvcmNlcworLy8vIGNvZGVnZW4gdG8gZm9sbG93IGJvdHRvbSB1cCBvcmRlciBvbiBjYWxsIGdyYXBoLgorY2xhc3MgRHVtbXlDR1NDQ1Bhc3MgOiBwdWJsaWMgQ2FsbEdyYXBoU0NDUGFzcyB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIER1bW15Q0dTQ0NQYXNzKCkgOiBDYWxsR3JhcGhTQ0NQYXNzKElEKSB7CisgICAgUGFzc1JlZ2lzdHJ5ICZSZWdpc3RyeSA9ICpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpOworICAgIGluaXRpYWxpemVEdW1teUNHU0NDUGFzc1Bhc3MoUmVnaXN0cnkpOworICB9CisKKyAgYm9vbCBydW5PblNDQyhDYWxsR3JhcGhTQ0MgJlNDQykgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfQ0FMTEdSQVBIU0NDUEFTU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NhbGxQcmludGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NhbGxQcmludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGI2OTdkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ2FsbFByaW50ZXIuaApAQCAtMCwwICsxLDI3IEBACisvLz09PS0tIENhbGxQcmludGVyLmggLSBDYWxsIGdyYXBoIHByaW50ZXIgZXh0ZXJuYWwgaW50ZXJmYWNlIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBleHRlcm5hbCBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgY2FsbGVkIHRvIGV4cGxpY2l0bHkKKy8vIGluc3RhbnRpYXRlIHRoZSBjYWxsIGdyYXBoIHByaW50ZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0NBTExQUklOVEVSX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19DQUxMUFJJTlRFUl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTW9kdWxlUGFzczsKKworTW9kdWxlUGFzcyAqY3JlYXRlQ2FsbEdyYXBoVmlld2VyUGFzcygpOworTW9kdWxlUGFzcyAqY3JlYXRlQ2FsbEdyYXBoRE9UUHJpbnRlclBhc3MoKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NhcHR1cmVUcmFja2luZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DYXB0dXJlVHJhY2tpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDJjMDk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9DYXB0dXJlVHJhY2tpbmcuaApAQCAtMCwwICsxLDgxIEBACisvLz09PS0tLS0tIGxsdm0vQW5hbHlzaXMvQ2FwdHVyZVRyYWNraW5nLmggLSBQb2ludGVyIGNhcHR1cmUgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyByb3V0aW5lcyB0aGF0IGhlbHAgZGV0ZXJtaW5lIHdoaWNoIHBvaW50ZXJzIGFyZSBjYXB0dXJlZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfQ0FQVFVSRVRSQUNLSU5HX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19DQVBUVVJFVFJBQ0tJTkdfSAorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgY2xhc3MgVmFsdWU7CisgIGNsYXNzIFVzZTsKKyAgY2xhc3MgSW5zdHJ1Y3Rpb247CisgIGNsYXNzIERvbWluYXRvclRyZWU7CisgIGNsYXNzIE9yZGVyZWRCYXNpY0Jsb2NrOworCisgIC8vLyBQb2ludGVyTWF5QmVDYXB0dXJlZCAtIFJldHVybiB0cnVlIGlmIHRoaXMgcG9pbnRlciB2YWx1ZSBtYXkgYmUgY2FwdHVyZWQKKyAgLy8vIGJ5IHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24gKHdoaWNoIGlzIHJlcXVpcmVkIHRvIGV4aXN0KS4gIFRoaXMgcm91dGluZSBjYW4KKyAgLy8vIGJlIGV4cGVuc2l2ZSwgc28gY29uc2lkZXIgY2FjaGluZyB0aGUgcmVzdWx0cy4gIFRoZSBib29sZWFuIFJldHVybkNhcHR1cmVzCisgIC8vLyBzcGVjaWZpZXMgd2hldGhlciByZXR1cm5pbmcgdGhlIHZhbHVlIChvciBwYXJ0IG9mIGl0KSBmcm9tIHRoZSBmdW5jdGlvbgorICAvLy8gY291bnRzIGFzIGNhcHR1cmluZyBpdCBvciBub3QuICBUaGUgYm9vbGVhbiBTdG9yZUNhcHR1cmVzIHNwZWNpZmllZAorICAvLy8gd2hldGhlciBzdG9yaW5nIHRoZSB2YWx1ZSAob3IgcGFydCBvZiBpdCkgaW50byBtZW1vcnkgYW55d2hlcmUKKyAgLy8vIGF1dG9tYXRpY2FsbHkgY291bnRzIGFzIGNhcHR1cmluZyBpdCBvciBub3QuCisgIGJvb2wgUG9pbnRlck1heUJlQ2FwdHVyZWQoY29uc3QgVmFsdWUgKlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZXR1cm5DYXB0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFN0b3JlQ2FwdHVyZXMpOworCisgIC8vLyBQb2ludGVyTWF5QmVDYXB0dXJlZEJlZm9yZSAtIFJldHVybiB0cnVlIGlmIHRoaXMgcG9pbnRlciB2YWx1ZSBtYXkgYmUKKyAgLy8vIGNhcHR1cmVkIGJ5IHRoZSBlbmNsb3NpbmcgZnVuY3Rpb24gKHdoaWNoIGlzIHJlcXVpcmVkIHRvIGV4aXN0KS4gSWYgYQorICAvLy8gRG9taW5hdG9yVHJlZSBpcyBwcm92aWRlZCwgb25seSBjYXB0dXJlcyB3aGljaCBoYXBwZW4gYmVmb3JlIHRoZSBnaXZlbgorICAvLy8gaW5zdHJ1Y3Rpb24gYXJlIGNvbnNpZGVyZWQuIFRoaXMgcm91dGluZSBjYW4gYmUgZXhwZW5zaXZlLCBzbyBjb25zaWRlcgorICAvLy8gY2FjaGluZyB0aGUgcmVzdWx0cy4gIFRoZSBib29sZWFuIFJldHVybkNhcHR1cmVzIHNwZWNpZmllcyB3aGV0aGVyCisgIC8vLyByZXR1cm5pbmcgdGhlIHZhbHVlIChvciBwYXJ0IG9mIGl0KSBmcm9tIHRoZSBmdW5jdGlvbiBjb3VudHMgYXMgY2FwdHVyaW5nCisgIC8vLyBpdCBvciBub3QuICBUaGUgYm9vbGVhbiBTdG9yZUNhcHR1cmVzIHNwZWNpZmllZCB3aGV0aGVyIHN0b3JpbmcgdGhlIHZhbHVlCisgIC8vLyAob3IgcGFydCBvZiBpdCkgaW50byBtZW1vcnkgYW55d2hlcmUgYXV0b21hdGljYWxseSBjb3VudHMgYXMgY2FwdHVyaW5nIGl0CisgIC8vLyBvciBub3QuIENhcHR1cmVzIGJ5IHRoZSBwcm92aWRlZCBpbnN0cnVjdGlvbiBhcmUgY29uc2lkZXJlZCBpZiB0aGUKKyAgLy8vIGZpbmFsIHBhcmFtZXRlciBpcyB0cnVlLiBBbiBvcmRlcmVkIGJhc2ljIGJsb2NrIGluIFxwIE9CQiBjb3VsZCBiZSB1c2VkCisgIC8vLyB0byBzcGVlZCB1cCBjYXB0dXJlLXRyYWNrZXIgcXVlcmllcy4KKyAgYm9vbCBQb2ludGVyTWF5QmVDYXB0dXJlZEJlZm9yZShjb25zdCBWYWx1ZSAqViwgYm9vbCBSZXR1cm5DYXB0dXJlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFN0b3JlQ2FwdHVyZXMsIGNvbnN0IEluc3RydWN0aW9uICpJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbWluYXRvclRyZWUgKkRULCBib29sIEluY2x1ZGVJID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3JkZXJlZEJhc2ljQmxvY2sgKk9CQiA9IG51bGxwdHIpOworCisgIC8vLyBUaGlzIGNhbGxiYWNrIGlzIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBQb2ludGVyTWF5QmVDYXB0dXJlZC4gSW4KKyAgLy8vIGFkZGl0aW9uIHRvIHRoZSBpbnRlcmZhY2UgaGVyZSwgeW91J2xsIG5lZWQgdG8gcHJvdmlkZSB5b3VyIG93biBnZXR0ZXJzCisgIC8vLyB0byBzZWUgd2hldGhlciBhbnl0aGluZyB3YXMgY2FwdHVyZWQuCisgIHN0cnVjdCBDYXB0dXJlVHJhY2tlciB7CisgICAgdmlydHVhbCB+Q2FwdHVyZVRyYWNrZXIoKTsKKworICAgIC8vLyB0b29NYW55VXNlcyAtIFRoZSBkZXB0aCBvZiB0cmF2ZXJzYWwgaGFzIGJyZWFjaGVkIGEgbGltaXQuIFRoZXJlIG1heSBiZQorICAgIC8vLyBjYXB0dXJpbmcgaW5zdHJ1Y3Rpb25zIHRoYXQgd2lsbCBub3QgYmUgcGFzc2VkIGludG8gY2FwdHVyZWQoKS4KKyAgICB2aXJ0dWFsIHZvaWQgdG9vTWFueVVzZXMoKSA9IDA7CisKKyAgICAvLy8gc2hvdWxkRXhwbG9yZSAtIFRoaXMgaXMgdGhlIHVzZSBvZiBhIHZhbHVlIGRlcml2ZWQgZnJvbSB0aGUgcG9pbnRlci4KKyAgICAvLy8gVG8gcHJ1bmUgdGhlIHNlYXJjaCAoaWUuLCBhc3N1bWUgdGhhdCBub25lIG9mIGl0cyB1c2VycyBjb3VsZCBwb3NzaWJseQorICAgIC8vLyBjYXB0dXJlKSByZXR1cm4gZmFsc2UuIFRvIHNlYXJjaCBpdCwgcmV0dXJuIHRydWUuCisgICAgLy8vCisgICAgLy8vIFUtPmdldFVzZXIoKSBpcyBhbHdheXMgYW4gSW5zdHJ1Y3Rpb24uCisgICAgdmlydHVhbCBib29sIHNob3VsZEV4cGxvcmUoY29uc3QgVXNlICpVKTsKKworICAgIC8vLyBjYXB0dXJlZCAtIEluZm9ybWF0aW9uIGFib3V0IHRoZSBwb2ludGVyIHdhcyBjYXB0dXJlZCBieSB0aGUgdXNlciBvZgorICAgIC8vLyB1c2UgVS4gUmV0dXJuIHRydWUgdG8gc3RvcCB0aGUgdHJhdmVyc2FsIG9yIGZhbHNlIHRvIGNvbnRpbnVlIGxvb2tpbmcKKyAgICAvLy8gZm9yIG1vcmUgY2FwdHVyaW5nIGluc3RydWN0aW9ucy4KKyAgICB2aXJ0dWFsIGJvb2wgY2FwdHVyZWQoY29uc3QgVXNlICpVKSA9IDA7CisgIH07CisKKyAgLy8vIFBvaW50ZXJNYXlCZUNhcHR1cmVkIC0gVmlzaXQgdGhlIHZhbHVlIGFuZCB0aGUgdmFsdWVzIGRlcml2ZWQgZnJvbSBpdCBhbmQKKyAgLy8vIGZpbmQgdmFsdWVzIHdoaWNoIGFwcGVhciB0byBiZSBjYXB0dXJpbmcgdGhlIHBvaW50ZXIgdmFsdWUuIFRoaXMgZmVlZHMKKyAgLy8vIHJlc3VsdHMgaW50byBhbmQgaXMgY29udHJvbGxlZCBieSB0aGUgQ2FwdHVyZVRyYWNrZXIgb2JqZWN0LgorICB2b2lkIFBvaW50ZXJNYXlCZUNhcHR1cmVkKGNvbnN0IFZhbHVlICpWLCBDYXB0dXJlVHJhY2tlciAqVHJhY2tlcik7Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ21wSW5zdEFuYWx5c2lzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NtcEluc3RBbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjYzY5ZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NtcEluc3RBbmFseXNpcy5oCkBAIC0wLDAgKzEsNzIgQEAKKy8vPT09LS0gQ21wSW5zdEFuYWx5c2lzLmggLSBVdGlscyB0byBoZWxwIGZvbGQgY29tcGFyZSBpbnN0cyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGhvbGRzIHJvdXRpbmVzIHRvIGhlbHAgYW5hbHlzZSBjb21wYXJlIGluc3RydWN0aW9ucworLy8gYW5kIGZvbGQgdGhlbSBpbnRvIGNvbnN0YW50cyBvciBvdGhlciBjb21wYXJlIGluc3RydWN0aW9ucworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19DTVBJTlNUQU5BTFlTSVNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0NNUElOU1RBTkFMWVNJU19ICisKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RyVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBJQ21wSW5zdDsKKyAgY2xhc3MgVmFsdWU7CisKKyAgLy8vIEVuY29kZSBhIGljbXAgcHJlZGljYXRlIGludG8gYSB0aHJlZSBiaXQgbWFzay4gVGhlc2UgYml0cyBhcmUgY2FyZWZ1bGx5CisgIC8vLyBhcnJhbmdlZCB0byBhbGxvdyBmb2xkaW5nIG9mIGV4cHJlc3Npb25zIHN1Y2ggYXM6CisgIC8vLworICAvLy8gICAgICAoQSA8IEIpIHwgKEEgPiBCKSAtLT4gKEEgIT0gQikKKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IHZhbGlkIGlmIHRoZSBmaXJzdCBhbmQgc2Vjb25kIHByZWRpY2F0ZXMgaGF2ZSB0aGUKKyAgLy8vIHNhbWUgc2lnbi4gSXQgaXMgaWxsZWdhbCB0byBkbzogKEEgdTwgQikgfCAoQSBzPiBCKQorICAvLy8KKyAgLy8vIFRocmVlIGJpdHMgYXJlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjb25kaXRpb24sIGFzIGZvbGxvd3M6CisgIC8vLyAgIDAgIEEgPiBCCisgIC8vLyAgIDEgIEEgPT0gQgorICAvLy8gICAyICBBIDwgQgorICAvLy8KKyAgLy8vIDw9PiAgVmFsdWUgIERlZmluaXRpb24KKyAgLy8vIDAwMCAgICAgMCAgIEFsd2F5cyBmYWxzZQorICAvLy8gMDAxICAgICAxICAgQSA+ICBCCisgIC8vLyAwMTAgICAgIDIgICBBID09IEIKKyAgLy8vIDAxMSAgICAgMyAgIEEgPj0gQgorICAvLy8gMTAwICAgICA0ICAgQSA8ICBCCisgIC8vLyAxMDEgICAgIDUgICBBICE9IEIKKyAgLy8vIDExMCAgICAgNiAgIEEgPD0gQgorICAvLy8gMTExICAgICA3ICAgQWx3YXlzIHRydWUKKyAgLy8vCisgIHVuc2lnbmVkIGdldElDbXBDb2RlKGNvbnN0IElDbXBJbnN0ICpJQ0ksIGJvb2wgSW52ZXJ0UHJlZCA9IGZhbHNlKTsKKworICAvLy8gVGhpcyBpcyB0aGUgY29tcGxlbWVudCBvZiBnZXRJQ21wQ29kZSwgd2hpY2ggdHVybnMgYW4gb3Bjb2RlIGFuZCB0d28KKyAgLy8vIG9wZXJhbmRzIGludG8gZWl0aGVyIGEgY29uc3RhbnQgdHJ1ZSBvciBmYWxzZSwgb3IgdGhlIHByZWRpY2F0ZSBmb3IgYSBuZXcKKyAgLy8vIElDbXAgaW5zdHJ1Y3Rpb24uIFRoZSBzaWduIGlzIHBhc3NlZCBpbiB0byBkZXRlcm1pbmUgd2hpY2gga2luZCBvZgorICAvLy8gcHJlZGljYXRlIHRvIHVzZSBpbiB0aGUgbmV3IGljbXAgaW5zdHJ1Y3Rpb24uCisgIC8vLyBOb24tTlVMTCByZXR1cm4gdmFsdWUgd2lsbCBiZSBhIHRydWUgb3IgZmFsc2UgY29uc3RhbnQuCisgIC8vLyBOVUxMIHJldHVybiBtZWFucyBhIG5ldyBJQ21wIGlzIG5lZWRlZC4gVGhlIHByZWRpY2F0ZSBmb3Igd2hpY2ggaXMgb3V0cHV0CisgIC8vLyBpbiBOZXdJQ21wUHJlZC4KKyAgVmFsdWUgKmdldElDbXBWYWx1ZShib29sIFNpZ24sIHVuc2lnbmVkIENvZGUsIFZhbHVlICpMSFMsIFZhbHVlICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdDo6UHJlZGljYXRlICZOZXdJQ21wUHJlZCk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGJvdGggcHJlZGljYXRlcyBtYXRjaCBzaWduIG9yIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGVtIGlzIGFuCisgIC8vLyBlcXVhbGl0eSBjb21wYXJpc29uICh3aGljaCBpcyBzaWdubGVzcykuCisgIGJvb2wgUHJlZGljYXRlc0ZvbGRhYmxlKENtcEluc3Q6OlByZWRpY2F0ZSBwMSwgQ21wSW5zdDo6UHJlZGljYXRlIHAyKTsKKworICAvLy8gRGVjb21wb3NlIGFuIGljbXAgaW50byB0aGUgZm9ybSAoKFggJiBNYXNrKSBwcmVkIDApIGlmIHBvc3NpYmxlLiBUaGUKKyAgLy8vIHJldHVybmVkIHByZWRpY2F0ZSBpcyBlaXRoZXIgPT0gb3IgIT0uIFJldHVybnMgZmFsc2UgaWYgZGVjb21wb3NpdGlvbgorICAvLy8gZmFpbHMuCisgIGJvb2wgZGVjb21wb3NlQml0VGVzdElDbXAoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgQ21wSW5zdDo6UHJlZGljYXRlICZQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIComWCwgQVBJbnQgJk1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBMb29rVGhyb3VnaFRydW5jID0gdHJ1ZSk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Db2RlTWV0cmljcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Db2RlTWV0cmljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllODYxYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NvZGVNZXRyaWNzLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8vPT09LSBDb2RlTWV0cmljcy5oIC0gQ29kZSBjb3N0IG1lYXN1cmVtZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdmFyaW91cyB3ZWlnaHQgbWVhc3VyZW1lbnRzIGZvciBjb2RlLCBoZWxwaW5nCisvLyB0aGUgSW5saW5lciBhbmQgb3RoZXIgcGFzc2VzIGRlY2lkZSB3aGV0aGVyIHRvIGR1cGxpY2F0ZSBpdHMgY29udGVudHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0NPREVNRVRSSUNTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19DT0RFTUVUUklDU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBBc3N1bXB0aW9uQ2FjaGU7CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgTG9vcDsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBEYXRhTGF5b3V0OworY2xhc3MgVGFyZ2V0VHJhbnNmb3JtSW5mbzsKK2NsYXNzIFZhbHVlOworCisvLy8gXGJyaWVmIENoZWNrIHdoZXRoZXIgYSBjYWxsIHdpbGwgbG93ZXIgdG8gc29tZXRoaW5nIHNtYWxsLgorLy8vCisvLy8gVGhpcyB0ZXN0cyBjaGVja3Mgd2hldGhlciB0aGlzIGNhbGxzaXRlIHdpbGwgbG93ZXIgdG8gc29tZXRoaW5nCisvLy8gc2lnbmlmaWNhbnRseSBjaGVhcGVyIHRoYW4gYSB0cmFkaXRpb25hbCBjYWxsLCBvZnRlbiBhIHNpbmdsZQorLy8vIGluc3RydWN0aW9uLiBOb3RlIHRoYXQgaWYgaXNJbnN0cnVjdGlvbkZyZWUoQ1MuZ2V0SW5zdHJ1Y3Rpb24oKSkgd291bGQKKy8vLyByZXR1cm4gdHJ1ZSwgc28gd2lsbCB0aGlzIGZ1bmN0aW9uLgorYm9vbCBjYWxsSXNTbWFsbChJbW11dGFibGVDYWxsU2l0ZSBDUyk7CisKKy8vLyBcYnJpZWYgVXRpbGl0eSB0byBjYWxjdWxhdGUgdGhlIHNpemUgYW5kIGEgZmV3IHNpbWlsYXIgbWV0cmljcyBmb3IgYSBzZXQKKy8vLyBvZiBiYXNpYyBibG9ja3MuCitzdHJ1Y3QgQ29kZU1ldHJpY3MgeworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhpcyBmdW5jdGlvbiBjb250YWlucyBhIGNhbGwgdG8gc2V0am1wIG9yIG90aGVyIGZ1bmN0aW9ucworICAvLy8gd2l0aCBhdHRyaWJ1dGUgInJldHVybnMgdHdpY2UiIHdpdGhvdXQgaGF2aW5nIHRoZSBhdHRyaWJ1dGUgaXRzZWxmLgorICBib29sIGV4cG9zZXNSZXR1cm5zVHdpY2UgPSBmYWxzZTsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhpcyBmdW5jdGlvbiBjYWxscyBpdHNlbGYuCisgIGJvb2wgaXNSZWN1cnNpdmUgPSBmYWxzZTsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhpcyBmdW5jdGlvbiBjYW5ub3QgYmUgZHVwbGljYXRlZC4KKyAgLy8vCisgIC8vLyBUcnVlIGlmIHRoaXMgZnVuY3Rpb24gY29udGFpbnMgb25lIG9yIG1vcmUgaW5kaXJlY3QgYnJhbmNoZXMsIG9yIGl0IGNvbnRhaW5zCisgIC8vLyBvbmUgb3IgbW9yZSAnbm9kdXBsaWNhdGUnIGluc3RydWN0aW9ucy4KKyAgYm9vbCBub3REdXBsaWNhdGFibGUgPSBmYWxzZTsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhpcyBmdW5jdGlvbiBjb250YWlucyBhIGNhbGwgdG8gYSBjb252ZXJnZW50IGZ1bmN0aW9uLgorICBib29sIGNvbnZlcmdlbnQgPSBmYWxzZTsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhpcyBmdW5jdGlvbiBjYWxscyBhbGxvY2EgKGluIHRoZSBDIHNlbnNlKS4KKyAgYm9vbCB1c2VzRHluYW1pY0FsbG9jYSA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgTnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbiB0aGUgYW5hbHl6ZWQgYmxvY2tzLgorICB1bnNpZ25lZCBOdW1JbnN0cyA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgTnVtYmVyIG9mIGFuYWx5emVkIGJsb2Nrcy4KKyAgdW5zaWduZWQgTnVtQmxvY2tzID0gZmFsc2U7CisKKyAgLy8vIFxicmllZiBLZWVwcyB0cmFjayBvZiBiYXNpYyBibG9jayBjb2RlIHNpemUgZXN0aW1hdGVzLgorICBEZW5zZU1hcDxjb25zdCBCYXNpY0Jsb2NrICosIHVuc2lnbmVkPiBOdW1CQkluc3RzOworCisgIC8vLyBcYnJpZWYgS2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIGNhbGxzIHRvICdiaWcnIGZ1bmN0aW9ucy4KKyAgdW5zaWduZWQgTnVtQ2FsbHMgPSBmYWxzZTsKKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgY2FsbHMgdG8gaW50ZXJuYWwgZnVuY3Rpb25zIHdpdGggYSBzaW5nbGUgY2FsbGVyLgorICAvLy8KKyAgLy8vIFRoZXNlIGFyZSBsaWtlbHkgdGFyZ2V0cyBmb3IgZnV0dXJlIGlubGluaW5nLCBsaWtlbHkgZXhwb3NlZCBieQorICAvLy8gaW50ZXJsZWF2ZWQgZGV2aXJ0dWFsaXphdGlvbi4KKyAgdW5zaWduZWQgTnVtSW5saW5lQ2FuZGlkYXRlcyA9IDA7CisKKyAgLy8vIFxicmllZiBIb3cgbWFueSBpbnN0cnVjdGlvbnMgcHJvZHVjZSB2ZWN0b3IgdmFsdWVzLgorICAvLy8KKyAgLy8vIFRoZSBpbmxpbmVyIGlzIG1vcmUgYWdncmVzc2l2ZSB3aXRoIGlubGluaW5nIHZlY3RvciBrZXJuZWxzLgorICB1bnNpZ25lZCBOdW1WZWN0b3JJbnN0cyA9IDA7CisKKyAgLy8vIFxicmllZiBIb3cgbWFueSAncmV0JyBpbnN0cnVjdGlvbnMgdGhlIGJsb2NrcyBjb250YWluLgorICB1bnNpZ25lZCBOdW1SZXRzID0gMDsKKworICAvLy8gXGJyaWVmIEFkZCBpbmZvcm1hdGlvbiBhYm91dCBhIGJsb2NrIHRvIHRoZSBjdXJyZW50IHN0YXRlLgorICB2b2lkIGFuYWx5emVCYXNpY0Jsb2NrKGNvbnN0IEJhc2ljQmxvY2sgKkJCLCBjb25zdCBUYXJnZXRUcmFuc2Zvcm1JbmZvICZUVEksCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxQdHJTZXRJbXBsPGNvbnN0IFZhbHVlKj4gJkVwaFZhbHVlcyk7CisKKyAgLy8vIFxicmllZiBDb2xsZWN0IGEgbG9vcCdzIGVwaGVtZXJhbCB2YWx1ZXMgKHRob3NlIHVzZWQgb25seSBieSBhbiBhc3N1bWUKKyAgLy8vIG9yIHNpbWlsYXIgaW50cmluc2ljcyBpbiB0aGUgbG9vcCkuCisgIHN0YXRpYyB2b2lkIGNvbGxlY3RFcGhlbWVyYWxWYWx1ZXMoY29uc3QgTG9vcCAqTCwgQXNzdW1wdGlvbkNhY2hlICpBQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldEltcGw8Y29uc3QgVmFsdWUgKj4gJkVwaFZhbHVlcyk7CisKKyAgLy8vIFxicmllZiBDb2xsZWN0IGEgZnVuY3Rpb25zJ3MgZXBoZW1lcmFsIHZhbHVlcyAodGhvc2UgdXNlZCBvbmx5IGJ5IGFuCisgIC8vLyBhc3N1bWUgb3Igc2ltaWxhciBpbnRyaW5zaWNzIGluIHRoZSBmdW5jdGlvbikuCisgIHN0YXRpYyB2b2lkIGNvbGxlY3RFcGhlbWVyYWxWYWx1ZXMoY29uc3QgRnVuY3Rpb24gKkwsIEFzc3VtcHRpb25DYWNoZSAqQUMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXRJbXBsPGNvbnN0IFZhbHVlICo+ICZFcGhWYWx1ZXMpOworfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvQ29uc3RhbnRGb2xkaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NvbnN0YW50Rm9sZGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1NGI1NTcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0NvbnN0YW50Rm9sZGluZy5oCkBAIC0wLDAgKzEsMTYxIEBACisvLz09PS0tIENvbnN0YW50Rm9sZGluZy5oIC0gRm9sZCBpbnN0cnVjdGlvbnMgaW50byBjb25zdGFudHMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyByb3V0aW5lcyBmb3IgZm9sZGluZyBpbnN0cnVjdGlvbnMgaW50byBjb25zdGFudHMgd2hlbiBhbGwKKy8vIG9wZXJhbmRzIGFyZSBjb25zdGFudHMsIGZvciBleGFtcGxlICJzdWIgaTMyIDEsIDAiIC0+ICIxIi4KKy8vCisvLyBBbHNvLCB0byBzdXBwbGVtZW50IHRoZSBiYXNpYyBWTUNvcmUgQ29uc3RhbnRFeHByIHNpbXBsaWZpY2F0aW9ucywKKy8vIHRoaXMgZmlsZSBkZWNsYXJlcyBzb21lIGFkZGl0aW9uYWwgZm9sZGluZyByb3V0aW5lcyB0aGF0IGNhbiBtYWtlIHVzZSBvZgorLy8gRGF0YUxheW91dCBpbmZvcm1hdGlvbi4gVGhlc2UgZnVuY3Rpb25zIGNhbm5vdCBnbyBpbiBWTUNvcmUgZHVlIHRvIGxpYnJhcnkKKy8vIGRlcGVuZGVuY3kgaXNzdWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19DT05TVEFOVEZPTERJTkdfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0NPTlNUQU5URk9MRElOR19ICisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEFQSW50OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEFycmF5UmVmOworY2xhc3MgQ2FsbFNpdGU7CitjbGFzcyBDb25zdGFudDsKK2NsYXNzIENvbnN0YW50RXhwcjsKK2NsYXNzIENvbnN0YW50VmVjdG9yOworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIEltbXV0YWJsZUNhbGxTaXRlOworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CitjbGFzcyBUeXBlOworCisvLy8gSWYgdGhpcyBjb25zdGFudCBpcyBhIGNvbnN0YW50IG9mZnNldCBmcm9tIGEgZ2xvYmFsLCByZXR1cm4gdGhlIGdsb2JhbCBhbmQKKy8vLyB0aGUgY29uc3RhbnQuIEJlY2F1c2Ugb2YgY29uc3RhbnRleHBycywgdGhpcyBmdW5jdGlvbiBpcyByZWN1cnNpdmUuCitib29sIElzQ29uc3RhbnRPZmZzZXRGcm9tR2xvYmFsKENvbnN0YW50ICpDLCBHbG9iYWxWYWx1ZSAqJkdWLCBBUEludCAmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCk7CisKKy8vLyBDb25zdGFudEZvbGRJbnN0cnVjdGlvbiAtIFRyeSB0byBjb25zdGFudCBmb2xkIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uCisvLy8gSWYgc3VjY2Vzc2Z1bCwgdGhlIGNvbnN0YW50IHJlc3VsdCBpcyByZXR1cm5lZCwgaWYgbm90LCBudWxsIGlzIHJldHVybmVkLgorLy8vIE5vdGUgdGhhdCB0aGlzIGZhaWxzIGlmIG5vdCBhbGwgb2YgdGhlIG9wZXJhbmRzIGFyZSBjb25zdGFudC4gIE90aGVyd2lzZSwKKy8vLyB0aGlzIGZ1bmN0aW9uIGNhbiBvbmx5IGZhaWwgd2hlbiBhdHRlbXB0aW5nIHRvIGZvbGQgaW5zdHJ1Y3Rpb25zIGxpa2UgbG9hZHMKKy8vLyBhbmQgc3RvcmVzLCB3aGljaCBoYXZlIG5vIGNvbnN0YW50IGV4cHJlc3Npb24gZm9ybS4KK0NvbnN0YW50ICpDb25zdGFudEZvbGRJbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAqSSwgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSA9IG51bGxwdHIpOworCisvLy8gQ29uc3RhbnRGb2xkQ29uc3RhbnQgLSBBdHRlbXB0IHRvIGZvbGQgdGhlIGNvbnN0YW50IHVzaW5nIHRoZQorLy8vIHNwZWNpZmllZCBEYXRhTGF5b3V0LgorLy8vIElmIHN1Y2Nlc3NmdWwsIHRoZSBjb25zdGFudCByZXN1bHQgaXMgcmV0dXJuZWQsIGlmIG5vdCwgbnVsbCBpcyByZXR1cm5lZC4KK0NvbnN0YW50ICpDb25zdGFudEZvbGRDb25zdGFudChjb25zdCBDb25zdGFudCAqQywgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSA9IG51bGxwdHIpOworCisvLy8gQ29uc3RhbnRGb2xkSW5zdE9wZXJhbmRzIC0gQXR0ZW1wdCB0byBjb25zdGFudCBmb2xkIGFuIGluc3RydWN0aW9uIHdpdGggdGhlCisvLy8gc3BlY2lmaWVkIG9wZXJhbmRzLiAgSWYgc3VjY2Vzc2Z1bCwgdGhlIGNvbnN0YW50IHJlc3VsdCBpcyByZXR1cm5lZCwgaWYgbm90LAorLy8vIG51bGwgaXMgcmV0dXJuZWQuICBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBjYW4gZmFpbCB3aGVuIGF0dGVtcHRpbmcgdG8KKy8vLyBmb2xkIGluc3RydWN0aW9ucyBsaWtlIGxvYWRzIGFuZCBzdG9yZXMsIHdoaWNoIGhhdmUgbm8gY29uc3RhbnQgZXhwcmVzc2lvbgorLy8vIGZvcm0uCisvLy8KK0NvbnN0YW50ICpDb25zdGFudEZvbGRJbnN0T3BlcmFuZHMoSW5zdHJ1Y3Rpb24gKkksIEFycmF5UmVmPENvbnN0YW50ICo+IE9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkgPSBudWxscHRyKTsKKworLy8vIENvbnN0YW50Rm9sZENvbXBhcmVJbnN0T3BlcmFuZHMgLSBBdHRlbXB0IHRvIGNvbnN0YW50IGZvbGQgYSBjb21wYXJlCisvLy8gaW5zdHJ1Y3Rpb24gKGljbXAvZmNtcCkgd2l0aCB0aGUgc3BlY2lmaWVkIG9wZXJhbmRzLiAgSWYgaXQgZmFpbHMsIGl0CisvLy8gcmV0dXJucyBhIGNvbnN0YW50IGV4cHJlc3Npb24gb2YgdGhlIHNwZWNpZmllZCBvcGVyYW5kcy4KKy8vLworQ29uc3RhbnQgKgorQ29uc3RhbnRGb2xkQ29tcGFyZUluc3RPcGVyYW5kcyh1bnNpZ25lZCBQcmVkaWNhdGUsIENvbnN0YW50ICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpSSFMsIGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJID0gbnVsbHB0cik7CisKKy8vLyBcYnJpZWYgQXR0ZW1wdCB0byBjb25zdGFudCBmb2xkIGEgYmluYXJ5IG9wZXJhdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQKKy8vLyBvcGVyYW5kcy4gIElmIGl0IGZhaWxzLCBpdCByZXR1cm5zIGEgY29uc3RhbnQgZXhwcmVzc2lvbiBvZiB0aGUgc3BlY2lmaWVkCisvLy8gb3BlcmFuZHMuCitDb25zdGFudCAqQ29uc3RhbnRGb2xkQmluYXJ5T3BPcGVyYW5kcyh1bnNpZ25lZCBPcGNvZGUsIENvbnN0YW50ICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqUkhTLCBjb25zdCBEYXRhTGF5b3V0ICZETCk7CisKKy8vLyBcYnJpZWYgQXR0ZW1wdCB0byBjb25zdGFudCBmb2xkIGEgc2VsZWN0IGluc3RydWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZAorLy8vIG9wZXJhbmRzLiBUaGUgY29uc3RhbnQgcmVzdWx0IGlzIHJldHVybmVkIGlmIHN1Y2Nlc3NmdWw7IGlmIG5vdCwgbnVsbCBpcworLy8vIHJldHVybmVkLgorQ29uc3RhbnQgKkNvbnN0YW50Rm9sZFNlbGVjdEluc3RydWN0aW9uKENvbnN0YW50ICpDb25kLCBDb25zdGFudCAqVjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKlYyKTsKKworLy8vIFxicmllZiBBdHRlbXB0IHRvIGNvbnN0YW50IGZvbGQgYSBjYXN0IHdpdGggdGhlIHNwZWNpZmllZCBvcGVyYW5kLiAgSWYgaXQKKy8vLyBmYWlscywgaXQgcmV0dXJucyBhIGNvbnN0YW50IGV4cHJlc3Npb24gb2YgdGhlIHNwZWNpZmllZCBvcGVyYW5kLgorQ29uc3RhbnQgKkNvbnN0YW50Rm9sZENhc3RPcGVyYW5kKHVuc2lnbmVkIE9wY29kZSwgQ29uc3RhbnQgKkMsIFR5cGUgKkRlc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCk7CisKKy8vLyBDb25zdGFudEZvbGRJbnNlcnRWYWx1ZUluc3RydWN0aW9uIC0gQXR0ZW1wdCB0byBjb25zdGFudCBmb2xkIGFuIGluc2VydHZhbHVlCisvLy8gaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIG9wZXJhbmRzIGFuZCBpbmRpY2VzLiAgVGhlIGNvbnN0YW50IHJlc3VsdCBpcworLy8vIHJldHVybmVkIGlmIHN1Y2Nlc3NmdWw7IGlmIG5vdCwgbnVsbCBpcyByZXR1cm5lZC4KK0NvbnN0YW50ICpDb25zdGFudEZvbGRJbnNlcnRWYWx1ZUluc3RydWN0aW9uKENvbnN0YW50ICpBZ2csIENvbnN0YW50ICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gSWR4cyk7CisKKy8vLyBcYnJpZWYgQXR0ZW1wdCB0byBjb25zdGFudCBmb2xkIGFuIGV4dHJhY3R2YWx1ZSBpbnN0cnVjdGlvbiB3aXRoIHRoZQorLy8vIHNwZWNpZmllZCBvcGVyYW5kcyBhbmQgaW5kaWNlcy4gIFRoZSBjb25zdGFudCByZXN1bHQgaXMgcmV0dXJuZWQgaWYKKy8vLyBzdWNjZXNzZnVsOyBpZiBub3QsIG51bGwgaXMgcmV0dXJuZWQuCitDb25zdGFudCAqQ29uc3RhbnRGb2xkRXh0cmFjdFZhbHVlSW5zdHJ1Y3Rpb24oQ29uc3RhbnQgKkFnZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gSWR4cyk7CisKKy8vLyBcYnJpZWYgQXR0ZW1wdCB0byBjb25zdGFudCBmb2xkIGFuIGluc2VydGVsZW1lbnQgaW5zdHJ1Y3Rpb24gd2l0aCB0aGUKKy8vLyBzcGVjaWZpZWQgb3BlcmFuZHMgYW5kIGluZGljZXMuICBUaGUgY29uc3RhbnQgcmVzdWx0IGlzIHJldHVybmVkIGlmCisvLy8gc3VjY2Vzc2Z1bDsgaWYgbm90LCBudWxsIGlzIHJldHVybmVkLgorQ29uc3RhbnQgKkNvbnN0YW50Rm9sZEluc2VydEVsZW1lbnRJbnN0cnVjdGlvbihDb25zdGFudCAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqRWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqSWR4KTsKKworLy8vIFxicmllZiBBdHRlbXB0IHRvIGNvbnN0YW50IGZvbGQgYW4gZXh0cmFjdGVsZW1lbnQgaW5zdHJ1Y3Rpb24gd2l0aCB0aGUKKy8vLyBzcGVjaWZpZWQgb3BlcmFuZHMgYW5kIGluZGljZXMuICBUaGUgY29uc3RhbnQgcmVzdWx0IGlzIHJldHVybmVkIGlmCisvLy8gc3VjY2Vzc2Z1bDsgaWYgbm90LCBudWxsIGlzIHJldHVybmVkLgorQ29uc3RhbnQgKkNvbnN0YW50Rm9sZEV4dHJhY3RFbGVtZW50SW5zdHJ1Y3Rpb24oQ29uc3RhbnQgKlZhbCwgQ29uc3RhbnQgKklkeCk7CisKKy8vLyBcYnJpZWYgQXR0ZW1wdCB0byBjb25zdGFudCBmb2xkIGEgc2h1ZmZsZXZlY3RvciBpbnN0cnVjdGlvbiB3aXRoIHRoZQorLy8vIHNwZWNpZmllZCBvcGVyYW5kcyBhbmQgaW5kaWNlcy4gIFRoZSBjb25zdGFudCByZXN1bHQgaXMgcmV0dXJuZWQgaWYKKy8vLyBzdWNjZXNzZnVsOyBpZiBub3QsIG51bGwgaXMgcmV0dXJuZWQuCitDb25zdGFudCAqQ29uc3RhbnRGb2xkU2h1ZmZsZVZlY3Rvckluc3RydWN0aW9uKENvbnN0YW50ICpWMSwgQ29uc3RhbnQgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqTWFzayk7CisKKy8vLyBDb25zdGFudEZvbGRMb2FkRnJvbUNvbnN0UHRyIC0gUmV0dXJuIHRoZSB2YWx1ZSB0aGF0IGEgbG9hZCBmcm9tIEMgd291bGQKKy8vLyBwcm9kdWNlIGlmIGl0IGlzIGNvbnN0YW50IGFuZCBkZXRlcm1pbmFibGUuICBJZiB0aGlzIGlzIG5vdCBkZXRlcm1pbmFibGUsCisvLy8gcmV0dXJuIG51bGwuCitDb25zdGFudCAqQ29uc3RhbnRGb2xkTG9hZEZyb21Db25zdFB0cihDb25zdGFudCAqQywgVHlwZSAqVHksIGNvbnN0IERhdGFMYXlvdXQgJkRMKTsKKworLy8vIENvbnN0YW50Rm9sZExvYWRUaHJvdWdoR0VQQ29uc3RhbnRFeHByIC0gR2l2ZW4gYSBjb25zdGFudCBhbmQgYQorLy8vIGdldGVsZW1lbnRwdHIgY29uc3RhbnRleHByLCByZXR1cm4gdGhlIGNvbnN0YW50IHZhbHVlIGJlaW5nIGFkZHJlc3NlZCBieSB0aGUKKy8vLyBjb25zdGFudCBleHByZXNzaW9uLCBvciBudWxsIGlmIHNvbWV0aGluZyBpcyBmdW5ueSBhbmQgd2UgY2FuJ3QgZGVjaWRlLgorQ29uc3RhbnQgKkNvbnN0YW50Rm9sZExvYWRUaHJvdWdoR0VQQ29uc3RhbnRFeHByKENvbnN0YW50ICpDLCBDb25zdGFudEV4cHIgKkNFKTsKKworLy8vIENvbnN0YW50Rm9sZExvYWRUaHJvdWdoR0VQSW5kaWNlcyAtIEdpdmVuIGEgY29uc3RhbnQgYW5kIGdldGVsZW1lbnRwdHIKKy8vLyBpbmRpY2VzICh3aXRoIGFuICppbXBsaWVkKiB6ZXJvIHBvaW50ZXIgaW5kZXggdGhhdCBpcyBub3QgaW4gdGhlIGxpc3QpLAorLy8vIHJldHVybiB0aGUgY29uc3RhbnQgdmFsdWUgYmVpbmcgYWRkcmVzc2VkIGJ5IGEgdmlydHVhbCBsb2FkLCBvciBudWxsIGlmCisvLy8gc29tZXRoaW5nIGlzIGZ1bm55IGFuZCB3ZSBjYW4ndCBkZWNpZGUuCitDb25zdGFudCAqQ29uc3RhbnRGb2xkTG9hZFRocm91Z2hHRVBJbmRpY2VzKENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDb25zdGFudCAqPiBJbmRpY2VzKTsKKworLy8vIGNhbkNvbnN0YW50Rm9sZENhbGxUbyAtIFJldHVybiB0cnVlIGlmIGl0cyBldmVuIHBvc3NpYmxlIHRvIGZvbGQgYSBjYWxsIHRvCisvLy8gdGhlIHNwZWNpZmllZCBmdW5jdGlvbi4KK2Jvb2wgY2FuQ29uc3RhbnRGb2xkQ2FsbFRvKEltbXV0YWJsZUNhbGxTaXRlIENTLCBjb25zdCBGdW5jdGlvbiAqRik7CisKKy8vLyBDb25zdGFudEZvbGRDYWxsIC0gQXR0ZW1wdCB0byBjb25zdGFudCBmb2xkIGEgY2FsbCB0byB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uCisvLy8gd2l0aCB0aGUgc3BlY2lmaWVkIGFyZ3VtZW50cywgcmV0dXJuaW5nIG51bGwgaWYgdW5zdWNjZXNzZnVsLgorQ29uc3RhbnQgKkNvbnN0YW50Rm9sZENhbGwoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsIEZ1bmN0aW9uICpGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q29uc3RhbnQgKj4gT3BlcmFuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJID0gbnVsbHB0cik7CisKKy8vLyBDb25zdGFudEZvbGRMb2FkVGhyb3VnaEJpdGNhc3QgLSB0cnkgdG8gY2FzdCBjb25zdGFudCB0byBkZXN0aW5hdGlvbiB0eXBlCisvLy8gcmV0dXJuaW5nIG51bGwgaWYgdW5zdWNjZXNzZnVsLiBDYW4gY2FzdCBwb2ludGVyIHRvIHBvaW50ZXIgb3IgcG9pbnRlciB0bworLy8vIGludGVnZXIgYW5kIHZpY2UgdmVyc2EgaWYgdGhlaXIgc2l6ZXMgYXJlIGVxdWFsLgorQ29uc3RhbnQgKkNvbnN0YW50Rm9sZExvYWRUaHJvdWdoQml0Y2FzdChDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCk7CisKKy8vLyBcYnJpZWYgQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4gY2FsbCBoYXMgbm8gc2lkZS1lZmZlY3RzLgorLy8vIFNwZWNpZmljYWxseSBjaGVja3MgZm9yIG1hdGggcm91dGltZXMgd2hpY2ggc29tZXRpbWVzIHNldCBlcnJuby4KK2Jvb2wgaXNNYXRoTGliQ2FsbE5vb3AoQ2FsbFNpdGUgQ1MsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRE9UR3JhcGhUcmFpdHNQYXNzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0RPVEdyYXBoVHJhaXRzUGFzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5ZjljMzkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0RPVEdyYXBoVHJhaXRzUGFzcy5oCkBAIC0wLDAgKzEsMTg5IEBACisvLz09PS0tIERPVEdyYXBoVHJhaXRzUGFzcy5oIC0gUHJpbnQvVmlldyBkb3R0eSBncmFwaHMtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRlbXBsYXRlcyB0byBjcmVhdGUgZG90dHkgdmlld2VyIGFuZCBwcmludGVyIHBhc3NlcyBmb3IgR3JhcGhUcmFpdHMgZ3JhcGhzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19ET1RHUkFQSFRSQUlUU1BBU1NfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0RPVEdSQVBIVFJBSVRTUEFTU19ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0NGR1ByaW50ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRmlsZVN5c3RlbS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBcYnJpZWYgRGVmYXVsdCB0cmFpdHMgY2xhc3MgZm9yIGV4dHJhY3RpbmcgYSBncmFwaCBmcm9tIGFuIGFuYWx5c2lzIHBhc3MuCisvLy8KKy8vLyBUaGlzIGFzc3VtZXMgdGhhdCAnR3JhcGhUJyBpcyAnQW5hbHlzaXNUIConIGFuZCBzbyBqdXN0IHBhc3NlcyBpdCB0aHJvdWdoLgordGVtcGxhdGUgPHR5cGVuYW1lIEFuYWx5c2lzVCwgdHlwZW5hbWUgR3JhcGhUID0gQW5hbHlzaXNUICo+CitzdHJ1Y3QgRGVmYXVsdEFuYWx5c2lzR3JhcGhUcmFpdHMgeworICBzdGF0aWMgR3JhcGhUIGdldEdyYXBoKEFuYWx5c2lzVCAqQSkgeyByZXR1cm4gQTsgfQorfTsKKwordGVtcGxhdGUgPAorICAgIHR5cGVuYW1lIEFuYWx5c2lzVCwgYm9vbCBJc1NpbXBsZSwgdHlwZW5hbWUgR3JhcGhUID0gQW5hbHlzaXNUICosCisgICAgdHlwZW5hbWUgQW5hbHlzaXNHcmFwaFRyYWl0c1QgPSBEZWZhdWx0QW5hbHlzaXNHcmFwaFRyYWl0czxBbmFseXNpc1QsIEdyYXBoVD4gPgorY2xhc3MgRE9UR3JhcGhUcmFpdHNWaWV3ZXIgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKK3B1YmxpYzoKKyAgRE9UR3JhcGhUcmFpdHNWaWV3ZXIoU3RyaW5nUmVmIEdyYXBoTmFtZSwgY2hhciAmSUQpCisgICAgICA6IEZ1bmN0aW9uUGFzcyhJRCksIE5hbWUoR3JhcGhOYW1lKSB7fQorCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgcHJvY2Vzc2VkLgorICAvLy8KKyAgLy8vIEFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgY2xhc3MgbXkgb3ZlcnJpZGUgdGhpcyBmdW5jdGlvbiB0byBpbmRpY2F0ZSB0aGF0CisgIC8vLyBvbmx5IGNlcnRhaW4gZnVuY3Rpb25zIHNob3VsZCBiZSB2aWV3ZWQuCisgIC8vLworICAvLy8gQHBhcmFtIEFuYWx5c2lzIFRoZSBjdXJyZW50IGFuYWx5c2lzIHJlc3VsdCBmb3IgdGhpcyBmdW5jdGlvbi4KKyAgdmlydHVhbCBib29sIHByb2Nlc3NGdW5jdGlvbihGdW5jdGlvbiAmRiwgQW5hbHlzaXNUICZBbmFseXNpcykgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSBvdmVycmlkZSB7CisgICAgYXV0byAmQW5hbHlzaXMgPSBnZXRBbmFseXNpczxBbmFseXNpc1Q+KCk7CisKKyAgICBpZiAoIXByb2Nlc3NGdW5jdGlvbihGLCBBbmFseXNpcykpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBHcmFwaFQgR3JhcGggPSBBbmFseXNpc0dyYXBoVHJhaXRzVDo6Z2V0R3JhcGgoJkFuYWx5c2lzKTsKKyAgICBzdGQ6OnN0cmluZyBHcmFwaE5hbWUgPSBET1RHcmFwaFRyYWl0czxHcmFwaFQ+OjpnZXRHcmFwaE5hbWUoR3JhcGgpOworICAgIHN0ZDo6c3RyaW5nIFRpdGxlID0gR3JhcGhOYW1lICsgIiBmb3IgJyIgKyBGLmdldE5hbWUoKS5zdHIoKSArICInIGZ1bmN0aW9uIjsKKworICAgIFZpZXdHcmFwaChHcmFwaCwgTmFtZSwgSXNTaW1wbGUsIFRpdGxlKTsKKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIEFVLnNldFByZXNlcnZlc0FsbCgpOworICAgIEFVLmFkZFJlcXVpcmVkPEFuYWx5c2lzVD4oKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBOYW1lOworfTsKKwordGVtcGxhdGUgPAorICAgIHR5cGVuYW1lIEFuYWx5c2lzVCwgYm9vbCBJc1NpbXBsZSwgdHlwZW5hbWUgR3JhcGhUID0gQW5hbHlzaXNUICosCisgICAgdHlwZW5hbWUgQW5hbHlzaXNHcmFwaFRyYWl0c1QgPSBEZWZhdWx0QW5hbHlzaXNHcmFwaFRyYWl0czxBbmFseXNpc1QsIEdyYXBoVD4gPgorY2xhc3MgRE9UR3JhcGhUcmFpdHNQcmludGVyIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CitwdWJsaWM6CisgIERPVEdyYXBoVHJhaXRzUHJpbnRlcihTdHJpbmdSZWYgR3JhcGhOYW1lLCBjaGFyICZJRCkKKyAgICAgIDogRnVuY3Rpb25QYXNzKElEKSwgTmFtZShHcmFwaE5hbWUpIHt9CisKKyAgLy8vIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBwcm9jZXNzZWQuCisgIC8vLworICAvLy8gQW4gaW1wbGVtZW50YXRpb24gb2YgdGhpcyBjbGFzcyBteSBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIHRvIGluZGljYXRlIHRoYXQKKyAgLy8vIG9ubHkgY2VydGFpbiBmdW5jdGlvbnMgc2hvdWxkIGJlIHByaW50ZWQuCisgIC8vLworICAvLy8gQHBhcmFtIEFuYWx5c2lzIFRoZSBjdXJyZW50IGFuYWx5c2lzIHJlc3VsdCBmb3IgdGhpcyBmdW5jdGlvbi4KKyAgdmlydHVhbCBib29sIHByb2Nlc3NGdW5jdGlvbihGdW5jdGlvbiAmRiwgQW5hbHlzaXNUICZBbmFseXNpcykgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSBvdmVycmlkZSB7CisgICAgYXV0byAmQW5hbHlzaXMgPSBnZXRBbmFseXNpczxBbmFseXNpc1Q+KCk7CisKKyAgICBpZiAoIXByb2Nlc3NGdW5jdGlvbihGLCBBbmFseXNpcykpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBHcmFwaFQgR3JhcGggPSBBbmFseXNpc0dyYXBoVHJhaXRzVDo6Z2V0R3JhcGgoJkFuYWx5c2lzKTsKKyAgICBzdGQ6OnN0cmluZyBGaWxlbmFtZSA9IE5hbWUgKyAiLiIgKyBGLmdldE5hbWUoKS5zdHIoKSArICIuZG90IjsKKyAgICBzdGQ6OmVycm9yX2NvZGUgRUM7CisKKyAgICBlcnJzKCkgPDwgIldyaXRpbmcgJyIgPDwgRmlsZW5hbWUgPDwgIicuLi4iOworCisgICAgcmF3X2ZkX29zdHJlYW0gRmlsZShGaWxlbmFtZSwgRUMsIHN5czo6ZnM6OkZfVGV4dCk7CisgICAgc3RkOjpzdHJpbmcgR3JhcGhOYW1lID0gRE9UR3JhcGhUcmFpdHM8R3JhcGhUPjo6Z2V0R3JhcGhOYW1lKEdyYXBoKTsKKyAgICBzdGQ6OnN0cmluZyBUaXRsZSA9IEdyYXBoTmFtZSArICIgZm9yICciICsgRi5nZXROYW1lKCkuc3RyKCkgKyAiJyBmdW5jdGlvbiI7CisKKyAgICBpZiAoIUVDKQorICAgICAgV3JpdGVHcmFwaChGaWxlLCBHcmFwaCwgSXNTaW1wbGUsIFRpdGxlKTsKKyAgICBlbHNlCisgICAgICBlcnJzKCkgPDwgIiAgZXJyb3Igb3BlbmluZyBmaWxlIGZvciB3cml0aW5nISI7CisgICAgZXJycygpIDw8ICJcbiI7CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgICBBVS5hZGRSZXF1aXJlZDxBbmFseXNpc1Q+KCk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgTmFtZTsKK307CisKK3RlbXBsYXRlIDwKKyAgICB0eXBlbmFtZSBBbmFseXNpc1QsIGJvb2wgSXNTaW1wbGUsIHR5cGVuYW1lIEdyYXBoVCA9IEFuYWx5c2lzVCAqLAorICAgIHR5cGVuYW1lIEFuYWx5c2lzR3JhcGhUcmFpdHNUID0gRGVmYXVsdEFuYWx5c2lzR3JhcGhUcmFpdHM8QW5hbHlzaXNULCBHcmFwaFQ+ID4KK2NsYXNzIERPVEdyYXBoVHJhaXRzTW9kdWxlVmlld2VyIDogcHVibGljIE1vZHVsZVBhc3MgeworcHVibGljOgorICBET1RHcmFwaFRyYWl0c01vZHVsZVZpZXdlcihTdHJpbmdSZWYgR3JhcGhOYW1lLCBjaGFyICZJRCkKKyAgICAgIDogTW9kdWxlUGFzcyhJRCksIE5hbWUoR3JhcGhOYW1lKSB7fQorCisgIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICZNKSBvdmVycmlkZSB7CisgICAgR3JhcGhUIEdyYXBoID0gQW5hbHlzaXNHcmFwaFRyYWl0c1Q6OmdldEdyYXBoKCZnZXRBbmFseXNpczxBbmFseXNpc1Q+KCkpOworICAgIHN0ZDo6c3RyaW5nIFRpdGxlID0gRE9UR3JhcGhUcmFpdHM8R3JhcGhUPjo6Z2V0R3JhcGhOYW1lKEdyYXBoKTsKKworICAgIFZpZXdHcmFwaChHcmFwaCwgTmFtZSwgSXNTaW1wbGUsIFRpdGxlKTsKKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIEFVLnNldFByZXNlcnZlc0FsbCgpOworICAgIEFVLmFkZFJlcXVpcmVkPEFuYWx5c2lzVD4oKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBOYW1lOworfTsKKwordGVtcGxhdGUgPAorICAgIHR5cGVuYW1lIEFuYWx5c2lzVCwgYm9vbCBJc1NpbXBsZSwgdHlwZW5hbWUgR3JhcGhUID0gQW5hbHlzaXNUICosCisgICAgdHlwZW5hbWUgQW5hbHlzaXNHcmFwaFRyYWl0c1QgPSBEZWZhdWx0QW5hbHlzaXNHcmFwaFRyYWl0czxBbmFseXNpc1QsIEdyYXBoVD4gPgorY2xhc3MgRE9UR3JhcGhUcmFpdHNNb2R1bGVQcmludGVyIDogcHVibGljIE1vZHVsZVBhc3MgeworcHVibGljOgorICBET1RHcmFwaFRyYWl0c01vZHVsZVByaW50ZXIoU3RyaW5nUmVmIEdyYXBoTmFtZSwgY2hhciAmSUQpCisgICAgICA6IE1vZHVsZVBhc3MoSUQpLCBOYW1lKEdyYXBoTmFtZSkge30KKworICBib29sIHJ1bk9uTW9kdWxlKE1vZHVsZSAmTSkgb3ZlcnJpZGUgeworICAgIEdyYXBoVCBHcmFwaCA9IEFuYWx5c2lzR3JhcGhUcmFpdHNUOjpnZXRHcmFwaCgmZ2V0QW5hbHlzaXM8QW5hbHlzaXNUPigpKTsKKyAgICBzdGQ6OnN0cmluZyBGaWxlbmFtZSA9IE5hbWUgKyAiLmRvdCI7CisgICAgc3RkOjplcnJvcl9jb2RlIEVDOworCisgICAgZXJycygpIDw8ICJXcml0aW5nICciIDw8IEZpbGVuYW1lIDw8ICInLi4uIjsKKworICAgIHJhd19mZF9vc3RyZWFtIEZpbGUoRmlsZW5hbWUsIEVDLCBzeXM6OmZzOjpGX1RleHQpOworICAgIHN0ZDo6c3RyaW5nIFRpdGxlID0gRE9UR3JhcGhUcmFpdHM8R3JhcGhUPjo6Z2V0R3JhcGhOYW1lKEdyYXBoKTsKKworICAgIGlmICghRUMpCisgICAgICBXcml0ZUdyYXBoKEZpbGUsIEdyYXBoLCBJc1NpbXBsZSwgVGl0bGUpOworICAgIGVsc2UKKyAgICAgIGVycnMoKSA8PCAiICBlcnJvciBvcGVuaW5nIGZpbGUgZm9yIHdyaXRpbmchIjsKKyAgICBlcnJzKCkgPDwgIlxuIjsKKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIEFVLnNldFByZXNlcnZlc0FsbCgpOworICAgIEFVLmFkZFJlcXVpcmVkPEFuYWx5c2lzVD4oKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBOYW1lOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0RlbWFuZGVkQml0cy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9EZW1hbmRlZEJpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjg2NjgyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9EZW1hbmRlZEJpdHMuaApAQCAtMCwwICsxLDEyMiBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvRGVtYW5kZWRCaXRzLmggLSBEZXRlcm1pbmUgZGVtYW5kZWQgYml0cyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgaW1wbGVtZW50cyBhIGRlbWFuZGVkIGJpdHMgYW5hbHlzaXMuIEEgZGVtYW5kZWQgYml0IGlzIG9uZSB0aGF0CisvLyBjb250cmlidXRlcyB0byBhIHJlc3VsdDsgYml0cyB0aGF0IGFyZSBub3QgZGVtYW5kZWQgY2FuIGJlIGVpdGhlciB6ZXJvIG9yCisvLyBvbmUgd2l0aG91dCBhZmZlY3RpbmcgY29udHJvbCBvciBkYXRhIGZsb3cuIEZvciBleGFtcGxlIGluIHRoaXMgc2VxdWVuY2U6CisvLworLy8gICAlMSA9IGFkZCBpMzIgJXgsICV5CisvLyAgICUyID0gdHJ1bmMgaTMyICUxIHRvIGkxNgorLy8KKy8vIE9ubHkgdGhlIGxvd2VzdCAxNiBiaXRzIG9mICUxIGFyZSBkZW1hbmRlZDsgdGhlIHJlc3QgYXJlIHJlbW92ZWQgYnkgdGhlCisvLyB0cnVuYy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfREVNQU5ERURfQklUU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfREVNQU5ERURfQklUU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBc3N1bXB0aW9uQ2FjaGU7CitjbGFzcyBEb21pbmF0b3JUcmVlOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBJbnN0cnVjdGlvbjsKK3N0cnVjdCBLbm93bkJpdHM7CitjbGFzcyByYXdfb3N0cmVhbTsKKworY2xhc3MgRGVtYW5kZWRCaXRzIHsKK3B1YmxpYzoKKyAgRGVtYW5kZWRCaXRzKEZ1bmN0aW9uICZGLCBBc3N1bXB0aW9uQ2FjaGUgJkFDLCBEb21pbmF0b3JUcmVlICZEVCkgOgorICAgIEYoRiksIEFDKEFDKSwgRFQoRFQpIHt9CisKKyAgLy8vIFJldHVybiB0aGUgYml0cyBkZW1hbmRlZCBmcm9tIGluc3RydWN0aW9uIEkuCisgIEFQSW50IGdldERlbWFuZGVkQml0cyhJbnN0cnVjdGlvbiAqSSk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmLCBkdXJpbmcgYW5hbHlzaXMsIEkgY291bGQgbm90IGJlIHJlYWNoZWQuCisgIGJvb2wgaXNJbnN0cnVjdGlvbkRlYWQoSW5zdHJ1Y3Rpb24gKkkpOworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKTsKKworcHJpdmF0ZToKKyAgdm9pZCBwZXJmb3JtQW5hbHlzaXMoKTsKKyAgdm9pZCBkZXRlcm1pbmVMaXZlT3BlcmFuZEJpdHMoY29uc3QgSW5zdHJ1Y3Rpb24gKlVzZXJJLAorICAgIGNvbnN0IEluc3RydWN0aW9uICpJLCB1bnNpZ25lZCBPcGVyYW5kTm8sCisgICAgY29uc3QgQVBJbnQgJkFPdXQsIEFQSW50ICZBQiwKKyAgICBLbm93bkJpdHMgJktub3duLCBLbm93bkJpdHMgJktub3duMik7CisKKyAgRnVuY3Rpb24gJkY7CisgIEFzc3VtcHRpb25DYWNoZSAmQUM7CisgIERvbWluYXRvclRyZWUgJkRUOworCisgIGJvb2wgQW5hbHl6ZWQgPSBmYWxzZTsKKworICAvLyBUaGUgc2V0IG9mIHZpc2l0ZWQgaW5zdHJ1Y3Rpb25zIChub24taW50ZWdlci10eXBlZCBvbmx5KS4KKyAgU21hbGxQdHJTZXQ8SW5zdHJ1Y3Rpb24qLCAzMj4gVmlzaXRlZDsKKyAgRGVuc2VNYXA8SW5zdHJ1Y3Rpb24gKiwgQVBJbnQ+IEFsaXZlQml0czsKK307CisKK2NsYXNzIERlbWFuZGVkQml0c1dyYXBwZXJQYXNzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7Citwcml2YXRlOgorICBtdXRhYmxlIE9wdGlvbmFsPERlbWFuZGVkQml0cz4gREI7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKworICBEZW1hbmRlZEJpdHNXcmFwcGVyUGFzcygpOworCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIENsZWFuIHVwIG1lbW9yeSBpbiBiZXR3ZWVuIHJ1bnMKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGU7CisKKyAgRGVtYW5kZWRCaXRzICZnZXREZW1hbmRlZEJpdHMoKSB7IHJldHVybiAqREI7IH0KKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlICpNKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vLyBBbiBhbmFseXNpcyB0aGF0IHByb2R1Y2VzIFxjIERlbWFuZGVkQml0cyBmb3IgYSBmdW5jdGlvbi4KK2NsYXNzIERlbWFuZGVkQml0c0FuYWx5c2lzIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPERlbWFuZGVkQml0c0FuYWx5c2lzPiB7CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxEZW1hbmRlZEJpdHNBbmFseXNpcz47CisKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIFByb3ZpZGUgdGhlIHJlc3VsdCB0eXBlIGZvciB0aGlzIGFuYWx5c2lzIHBhc3MuCisgIHVzaW5nIFJlc3VsdCA9IERlbWFuZGVkQml0czsKKworICAvLy8gXGJyaWVmIFJ1biB0aGUgYW5hbHlzaXMgcGFzcyBvdmVyIGEgZnVuY3Rpb24gYW5kIHByb2R1Y2UgZGVtYW5kZWQgYml0cworICAvLy8gaW5mb3JtYXRpb24uCisgIERlbWFuZGVkQml0cyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gXGJyaWVmIFByaW50ZXIgcGFzcyBmb3IgRGVtYW5kZWRCaXRzCitjbGFzcyBEZW1hbmRlZEJpdHNQcmludGVyUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPERlbWFuZGVkQml0c1ByaW50ZXJQYXNzPiB7CisgIHJhd19vc3RyZWFtICZPUzsKKworcHVibGljOgorICBleHBsaWNpdCBEZW1hbmRlZEJpdHNQcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmT1MpIDogT1MoT1MpIHt9CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIENyZWF0ZSBhIGRlbWFuZGVkIGJpdHMgYW5hbHlzaXMgcGFzcy4KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlRGVtYW5kZWRCaXRzV3JhcHBlclBhc3MoKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfREVNQU5ERURfQklUU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0RlcGVuZGVuY2VBbmFseXNpcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9EZXBlbmRlbmNlQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGYzM2I4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9EZXBlbmRlbmNlQW5hbHlzaXMuaApAQCAtMCwwICsxLDk1MyBAQAorLy89PT0tLSBsbHZtL0FuYWx5c2lzL0RlcGVuZGVuY2VBbmFseXNpcy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEZXBlbmRlbmNlQW5hbHlzaXMgaXMgYW4gTExWTSBwYXNzIHRoYXQgYW5hbHlzZXMgZGVwZW5kZW5jZXMgYmV0d2VlbiBtZW1vcnkKKy8vIGFjY2Vzc2VzLiBDdXJyZW50bHksIGl0IGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBhcHByb2FjaCBkZXNjcmliZWQgaW4KKy8vCisvLyAgICAgICAgICAgIFByYWN0aWNhbCBEZXBlbmRlbmNlIFRlc3RpbmcKKy8vICAgICAgICAgICAgR29mZiwgS2VubmVkeSwgVHNlbmcKKy8vICAgICAgICAgICAgUExESSAxOTkxCisvLworLy8gVGhlcmUncyBhIHNpbmdsZSBlbnRyeSBwb2ludCB0aGF0IGFuYWx5emVzIHRoZSBkZXBlbmRlbmNlIGJldHdlZW4gYSBwYWlyCisvLyBvZiBtZW1vcnkgcmVmZXJlbmNlcyBpbiBhIGZ1bmN0aW9uLCByZXR1cm5pbmcgZWl0aGVyIE5VTEwsIGZvciBubyBkZXBlbmRlbmNlLAorLy8gb3IgYSBtb3JlLW9yLWxlc3MgZGV0YWlsZWQgZGVzY3JpcHRpb24gb2YgdGhlIGRlcGVuZGVuY2UgYmV0d2VlbiB0aGVtLgorLy8KKy8vIFRoaXMgcGFzcyBleGlzdHMgdG8gc3VwcG9ydCB0aGUgRGVwZW5kZW5jZUdyYXBoIHBhc3MuIFRoZXJlIGFyZSB0d28gc2VwYXJhdGUKKy8vIHBhc3NlcyBiZWNhdXNlIHRoZXJlJ3MgYSB1c2VmdWwgc2VwYXJhdGlvbiBvZiBjb25jZXJucy4gQSBkZXBlbmRlbmNlIGV4aXN0cworLy8gaWYgdHdvIGNvbmRpdGlvbnMgYXJlIG1ldDoKKy8vCisvLyAgICAxKSBUd28gaW5zdHJ1Y3Rpb25zIHJlZmVyZW5jZSB0aGUgc2FtZSBtZW1vcnkgbG9jYXRpb24sIGFuZAorLy8gICAgMikgVGhlcmUgaXMgYSBmbG93IG9mIGNvbnRyb2wgbGVhZGluZyBmcm9tIG9uZSBpbnN0cnVjdGlvbiB0byB0aGUgb3RoZXIuCisvLworLy8gRGVwZW5kZW5jZUFuYWx5c2lzIGF0dGFja3MgdGhlIGZpcnN0IGNvbmRpdGlvbjsgRGVwZW5kZW5jZUdyYXBoIHdpbGwgYXR0YWNrCisvLyB0aGUgc2Vjb25kIChpdCdzIG5vdCB5ZXQgcmVhZHkpLgorLy8KKy8vIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBpcyB3b3JrIGluIHByb2dyZXNzIGFuZCB0aGUgaW50ZXJmYWNlIGlzIHN1YmplY3QgdG8KKy8vIGNoYW5nZS4KKy8vCisvLyBQbGF1c2libGUgY2hhbmdlczoKKy8vICAgIFJldHVybiBhIHNldCBvZiBtb3JlIHByZWNpc2UgZGVwZW5kZW5jZXMgaW5zdGVhZCBvZiBqdXN0IG9uZSBkZXBlbmRlbmNlCisvLyAgICBzdW1tYXJpemluZyBhbGwuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0RFUEVOREVOQ0VBTkFMWVNJU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfREVQRU5ERU5DRUFOQUxZU0lTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKworbmFtZXNwYWNlIGxsdm0gewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEFycmF5UmVmOworICBjbGFzcyBMb29wOworICBjbGFzcyBMb29wSW5mbzsKKyAgY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworICBjbGFzcyBTQ0VWOworICBjbGFzcyBTQ0VWQ29uc3RhbnQ7CisgIGNsYXNzIHJhd19vc3RyZWFtOworCisgIC8vLyBEZXBlbmRlbmNlIC0gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgZGVwZW5kZW5jZSBiZXR3ZWVuIHR3byBtZW1vcnkKKyAgLy8vIG1lbW9yeSByZWZlcmVuY2VzIGluIGEgZnVuY3Rpb24uIEl0IGNvbnRhaW5zIG1pbmltYWwgaW5mb3JtYXRpb24gYW5kCisgIC8vLyBpcyB1c2VkIGluIHRoZSB2ZXJ5IGNvbW1vbiBzaXR1YXRpb24gd2hlcmUgdGhlIGNvbXBpbGVyIGlzIHVuYWJsZSB0bworICAvLy8gZGV0ZXJtaW5lIGFueXRoaW5nIGJleW9uZCB0aGUgZXhpc3RlbmNlIG9mIGEgZGVwZW5kZW5jZTsgdGhhdCBpcywgaXQKKyAgLy8vIHJlcHJlc2VudHMgYSBjb25mdXNlZCBkZXBlbmRlbmNlIChzZWUgYWxzbyBGdWxsRGVwZW5kZW5jZSkuIEluIG1vc3QKKyAgLy8vIGNhc2VzIChmb3Igb3V0cHV0LCBmbG93LCBhbmQgYW50aSBkZXBlbmRlbmNlcyksIHRoZSBkZXBlbmRlbmNlIGltcGxpZXMKKyAgLy8vIGFuIG9yZGVyaW5nLCB3aGVyZSB0aGUgc291cmNlIG11c3QgcHJlY2VkZSB0aGUgZGVzdGluYXRpb247IGluIGNvbnRyYXN0LAorICAvLy8gaW5wdXQgZGVwZW5kZW5jZXMgYXJlIHVub3JkZXJlZC4KKyAgLy8vCisgIC8vLyBXaGVuIGEgZGVwZW5kZW5jZSBncmFwaCBpcyBidWlsdCwgZWFjaCBEZXBlbmRlbmNlIHdpbGwgYmUgYSBtZW1iZXIgb2YKKyAgLy8vIHRoZSBzZXQgb2YgcHJlZGVjZXNzb3IgZWRnZXMgZm9yIGl0cyBkZXN0aW5hdGlvbiBpbnN0cnVjdGlvbiBhbmQgYSBzZXQKKyAgLy8vIGlmIHN1Y2Nlc3NvciBlZGdlcyBmb3IgaXRzIHNvdXJjZSBpbnN0cnVjdGlvbi4gVGhlc2Ugc2V0cyBhcmUgcmVwcmVzZW50ZWQKKyAgLy8vIGFzIHNpbmdseS1saW5rZWQgbGlzdHMsIHdpdGggdGhlICJuZXh0IiBmaWVsZHMgc3RvcmVkIGluIHRoZSBkZXBlbmRlbmNlCisgIC8vLyBpdGVsZi4KKyAgY2xhc3MgRGVwZW5kZW5jZSB7CisgIHByb3RlY3RlZDoKKyAgICBEZXBlbmRlbmNlKERlcGVuZGVuY2UgJiYpID0gZGVmYXVsdDsKKyAgICBEZXBlbmRlbmNlICZvcGVyYXRvcj0oRGVwZW5kZW5jZSAmJikgPSBkZWZhdWx0OworCisgIHB1YmxpYzoKKyAgICBEZXBlbmRlbmNlKEluc3RydWN0aW9uICpTb3VyY2UsCisgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqRGVzdGluYXRpb24pIDoKKyAgICAgIFNyYyhTb3VyY2UpLAorICAgICAgRHN0KERlc3RpbmF0aW9uKSwKKyAgICAgIE5leHRQcmVkZWNlc3NvcihudWxscHRyKSwKKyAgICAgIE5leHRTdWNjZXNzb3IobnVsbHB0cikge30KKyAgICB2aXJ0dWFsIH5EZXBlbmRlbmNlKCkge30KKworICAgIC8vLyBEZXBlbmRlbmNlOjpEVkVudHJ5IC0gRWFjaCBsZXZlbCBpbiB0aGUgZGlzdGFuY2UvZGlyZWN0aW9uIHZlY3RvcgorICAgIC8vLyBoYXMgYSBkaXJlY3Rpb24gKG9yIHBlcmhhcHMgYSB1bmlvbiBvZiBzZXZlcmFsIGRpcmVjdGlvbnMpLCBhbmQKKyAgICAvLy8gcGVyaGFwcyBhIGRpc3RhbmNlLgorICAgIHN0cnVjdCBEVkVudHJ5IHsKKyAgICAgIGVudW0geyBOT05FID0gMCwKKyAgICAgICAgICAgICBMVCA9IDEsCisgICAgICAgICAgICAgRVEgPSAyLAorICAgICAgICAgICAgIExFID0gMywKKyAgICAgICAgICAgICBHVCA9IDQsCisgICAgICAgICAgICAgTkUgPSA1LAorICAgICAgICAgICAgIEdFID0gNiwKKyAgICAgICAgICAgICBBTEwgPSA3IH07CisgICAgICB1bnNpZ25lZCBjaGFyIERpcmVjdGlvbiA6IDM7IC8vIEluaXQgdG8gQUxMLCB0aGVuIHJlZmluZS4KKyAgICAgIGJvb2wgU2NhbGFyICAgIDogMTsgLy8gSW5pdCB0byB0cnVlLgorICAgICAgYm9vbCBQZWVsRmlyc3QgOiAxOyAvLyBQZWVsaW5nIHRoZSBmaXJzdCBpdGVyYXRpb24gd2lsbCBicmVhayBkZXBlbmRlbmNlLgorICAgICAgYm9vbCBQZWVsTGFzdCAgOiAxOyAvLyBQZWVsaW5nIHRoZSBsYXN0IGl0ZXJhdGlvbiB3aWxsIGJyZWFrIHRoZSBkZXBlbmRlbmNlLgorICAgICAgYm9vbCBTcGxpdGFibGUgOiAxOyAvLyBTcGxpdHRpbmcgdGhlIGxvb3Agd2lsbCBicmVhayBkZXBlbmRlbmNlLgorICAgICAgY29uc3QgU0NFViAqRGlzdGFuY2U7IC8vIE5VTEwgaW1wbGllcyBubyBkaXN0YW5jZSBhdmFpbGFibGUuCisgICAgICBEVkVudHJ5KCkgOiBEaXJlY3Rpb24oQUxMKSwgU2NhbGFyKHRydWUpLCBQZWVsRmlyc3QoZmFsc2UpLAorICAgICAgICAgICAgICAgICAgUGVlbExhc3QoZmFsc2UpLCBTcGxpdGFibGUoZmFsc2UpLCBEaXN0YW5jZShudWxscHRyKSB7IH0KKyAgICB9OworCisgICAgLy8vIGdldFNyYyAtIFJldHVybnMgdGhlIHNvdXJjZSBpbnN0cnVjdGlvbiBmb3IgdGhpcyBkZXBlbmRlbmNlLgorICAgIC8vLworICAgIEluc3RydWN0aW9uICpnZXRTcmMoKSBjb25zdCB7IHJldHVybiBTcmM7IH0KKworICAgIC8vLyBnZXREc3QgLSBSZXR1cm5zIHRoZSBkZXN0aW5hdGlvbiBpbnN0cnVjdGlvbiBmb3IgdGhpcyBkZXBlbmRlbmNlLgorICAgIC8vLworICAgIEluc3RydWN0aW9uICpnZXREc3QoKSBjb25zdCB7IHJldHVybiBEc3Q7IH0KKworICAgIC8vLyBpc0lucHV0IC0gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYW4gaW5wdXQgZGVwZW5kZW5jZS4KKyAgICAvLy8KKyAgICBib29sIGlzSW5wdXQoKSBjb25zdDsKKworICAgIC8vLyBpc091dHB1dCAtIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGFuIG91dHB1dCBkZXBlbmRlbmNlLgorICAgIC8vLworICAgIGJvb2wgaXNPdXRwdXQoKSBjb25zdDsKKworICAgIC8vLyBpc0Zsb3cgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIGZsb3cgKGFrYSB0cnVlKSBkZXBlbmRlbmNlLgorICAgIC8vLworICAgIGJvb2wgaXNGbG93KCkgY29uc3Q7CisKKyAgICAvLy8gaXNBbnRpIC0gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYW4gYW50aSBkZXBlbmRlbmNlLgorICAgIC8vLworICAgIGJvb2wgaXNBbnRpKCkgY29uc3Q7CisKKyAgICAvLy8gaXNPcmRlcmVkIC0gUmV0dXJucyB0cnVlIGlmIGRlcGVuZGVuY2UgaXMgT3V0cHV0LCBGbG93LCBvciBBbnRpCisgICAgLy8vCisgICAgYm9vbCBpc09yZGVyZWQoKSBjb25zdCB7IHJldHVybiBpc091dHB1dCgpIHx8IGlzRmxvdygpIHx8IGlzQW50aSgpOyB9CisKKyAgICAvLy8gaXNVbm9yZGVyZWQgLSBSZXR1cm5zIHRydWUgaWYgZGVwZW5kZW5jZSBpcyBJbnB1dAorICAgIC8vLworICAgIGJvb2wgaXNVbm9yZGVyZWQoKSBjb25zdCB7IHJldHVybiBpc0lucHV0KCk7IH0KKworICAgIC8vLyBpc0xvb3BJbmRlcGVuZGVudCAtIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgbG9vcC1pbmRlcGVuZGVudAorICAgIC8vLyBkZXBlbmRlbmNlLgorICAgIHZpcnR1YWwgYm9vbCBpc0xvb3BJbmRlcGVuZGVudCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAgIC8vLyBpc0NvbmZ1c2VkIC0gUmV0dXJucyB0cnVlIGlmIHRoaXMgZGVwZW5kZW5jZSBpcyBjb25mdXNlZAorICAgIC8vLyAodGhlIGNvbXBpbGVyIHVuZGVyc3RhbmRzIG5vdGhpbmcgYW5kIG1ha2VzIHdvcnN0LWNhc2UKKyAgICAvLy8gYXNzdW1wdGlvbnMpLgorICAgIHZpcnR1YWwgYm9vbCBpc0NvbmZ1c2VkKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgLy8vIGlzQ29uc2lzdGVudCAtIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGRlcGVuZGVuY2UgaXMgY29uc2lzdGVudAorICAgIC8vLyAob2NjdXJzIGV2ZXJ5IHRpbWUgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIGV4ZWN1dGVkKS4KKyAgICB2aXJ0dWFsIGJvb2wgaXNDb25zaXN0ZW50KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIC8vLyBnZXRMZXZlbHMgLSBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29tbW9uIGxvb3BzIHN1cnJvdW5kaW5nIHRoZQorICAgIC8vLyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG9mIHRoZSBkZXBlbmRlbmNlLgorICAgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TGV2ZWxzKCkgY29uc3QgeyByZXR1cm4gMDsgfQorCisgICAgLy8vIGdldERpcmVjdGlvbiAtIFJldHVybnMgdGhlIGRpcmVjdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyCisgICAgLy8vIGxldmVsLgorICAgIHZpcnR1YWwgdW5zaWduZWQgZ2V0RGlyZWN0aW9uKHVuc2lnbmVkIExldmVsKSBjb25zdCB7IHJldHVybiBEVkVudHJ5OjpBTEw7IH0KKworICAgIC8vLyBnZXREaXN0YW5jZSAtIFJldHVybnMgdGhlIGRpc3RhbmNlIChvciBOVUxMKSBhc3NvY2lhdGVkIHdpdGggYQorICAgIC8vLyBwYXJ0aWN1bGFyIGxldmVsLgorICAgIHZpcnR1YWwgY29uc3QgU0NFViAqZ2V0RGlzdGFuY2UodW5zaWduZWQgTGV2ZWwpIGNvbnN0IHsgcmV0dXJuIG51bGxwdHI7IH0KKworICAgIC8vLyBpc1BlZWxGaXJzdCAtIFJldHVybnMgdHJ1ZSBpZiBwZWVsaW5nIHRoZSBmaXJzdCBpdGVyYXRpb24gZnJvbQorICAgIC8vLyB0aGlzIGxvb3Agd2lsbCBicmVhayB0aGlzIGRlcGVuZGVuY2UuCisgICAgdmlydHVhbCBib29sIGlzUGVlbEZpcnN0KHVuc2lnbmVkIExldmVsKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgLy8vIGlzUGVlbExhc3QgLSBSZXR1cm5zIHRydWUgaWYgcGVlbGluZyB0aGUgbGFzdCBpdGVyYXRpb24gZnJvbQorICAgIC8vLyB0aGlzIGxvb3Agd2lsbCBicmVhayB0aGlzIGRlcGVuZGVuY2UuCisgICAgdmlydHVhbCBib29sIGlzUGVlbExhc3QodW5zaWduZWQgTGV2ZWwpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAvLy8gaXNTcGxpdGFibGUgLSBSZXR1cm5zIHRydWUgaWYgc3BsaXR0aW5nIHRoaXMgbG9vcCB3aWxsIGJyZWFrCisgICAgLy8vIHRoZSBkZXBlbmRlbmNlLgorICAgIHZpcnR1YWwgYm9vbCBpc1NwbGl0YWJsZSh1bnNpZ25lZCBMZXZlbCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIC8vLyBpc1NjYWxhciAtIFJldHVybnMgdHJ1ZSBpZiBhIHBhcnRpY3VsYXIgbGV2ZWwgaXMgc2NhbGFyOyB0aGF0IGlzLAorICAgIC8vLyBpZiBubyBzdWJzY3JpcHQgaW4gdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBtZW50aW9uIHRoZSBpbmR1Y3Rpb24KKyAgICAvLy8gdmFyaWFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb29wIGF0IHRoaXMgbGV2ZWwuCisgICAgdmlydHVhbCBib29sIGlzU2NhbGFyKHVuc2lnbmVkIExldmVsKSBjb25zdDsKKworICAgIC8vLyBnZXROZXh0UHJlZGVjZXNzb3IgLSBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgTmV4dFByZWRlY2Vzc29yCisgICAgLy8vIGZpZWxkLgorICAgIGNvbnN0IERlcGVuZGVuY2UgKmdldE5leHRQcmVkZWNlc3NvcigpIGNvbnN0IHsgcmV0dXJuIE5leHRQcmVkZWNlc3NvcjsgfQorCisgICAgLy8vIGdldE5leHRTdWNjZXNzb3IgLSBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgTmV4dFN1Y2Nlc3NvcgorICAgIC8vLyBmaWVsZC4KKyAgICBjb25zdCBEZXBlbmRlbmNlICpnZXROZXh0U3VjY2Vzc29yKCkgY29uc3QgeyByZXR1cm4gTmV4dFN1Y2Nlc3NvcjsgfQorCisgICAgLy8vIHNldE5leHRQcmVkZWNlc3NvciAtIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBOZXh0UHJlZGVjZXNzb3IKKyAgICAvLy8gZmllbGQuCisgICAgdm9pZCBzZXROZXh0UHJlZGVjZXNzb3IoY29uc3QgRGVwZW5kZW5jZSAqcHJlZCkgeyBOZXh0UHJlZGVjZXNzb3IgPSBwcmVkOyB9CisKKyAgICAvLy8gc2V0TmV4dFN1Y2Nlc3NvciAtIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBOZXh0U3VjY2Vzc29yCisgICAgLy8vIGZpZWxkLgorICAgIHZvaWQgc2V0TmV4dFN1Y2Nlc3Nvcihjb25zdCBEZXBlbmRlbmNlICpzdWNjKSB7IE5leHRTdWNjZXNzb3IgPSBzdWNjOyB9CisKKyAgICAvLy8gZHVtcCAtIEZvciBkZWJ1Z2dpbmcgcHVycG9zZXMsIGR1bXBzIGEgZGVwZW5kZW5jZSB0byBPUy4KKyAgICAvLy8KKyAgICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICBwcml2YXRlOgorICAgIEluc3RydWN0aW9uICpTcmMsICpEc3Q7CisgICAgY29uc3QgRGVwZW5kZW5jZSAqTmV4dFByZWRlY2Vzc29yLCAqTmV4dFN1Y2Nlc3NvcjsKKyAgICBmcmllbmQgY2xhc3MgRGVwZW5kZW5jZUluZm87CisgIH07CisKKyAgLy8vIEZ1bGxEZXBlbmRlbmNlIC0gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgZGVwZW5kZW5jZSBiZXR3ZWVuIHR3byBtZW1vcnkKKyAgLy8vIHJlZmVyZW5jZXMgaW4gYSBmdW5jdGlvbi4gSXQgY29udGFpbnMgZGV0YWlsZWQgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgIC8vLyBkZXBlbmRlbmNlIChkaXJlY3Rpb24gdmVjdG9ycywgZXRjLikgYW5kIGlzIHVzZWQgd2hlbiB0aGUgY29tcGlsZXIgaXMKKyAgLy8vIGFibGUgdG8gYWNjdXJhdGVseSBhbmFseXplIHRoZSBpbnRlcmFjdGlvbiBvZiB0aGUgcmVmZXJlbmNlczsgdGhhdCBpcywKKyAgLy8vIGl0IGlzIG5vdCBhIGNvbmZ1c2VkIGRlcGVuZGVuY2UgKHNlZSBEZXBlbmRlbmNlKS4gSW4gbW9zdCBjYXNlcworICAvLy8gKGZvciBvdXRwdXQsIGZsb3csIGFuZCBhbnRpIGRlcGVuZGVuY2VzKSwgdGhlIGRlcGVuZGVuY2UgaW1wbGllcyBhbgorICAvLy8gb3JkZXJpbmcsIHdoZXJlIHRoZSBzb3VyY2UgbXVzdCBwcmVjZWRlIHRoZSBkZXN0aW5hdGlvbjsgaW4gY29udHJhc3QsCisgIC8vLyBpbnB1dCBkZXBlbmRlbmNlcyBhcmUgdW5vcmRlcmVkLgorICBjbGFzcyBGdWxsRGVwZW5kZW5jZSBmaW5hbCA6IHB1YmxpYyBEZXBlbmRlbmNlIHsKKyAgcHVibGljOgorICAgIEZ1bGxEZXBlbmRlbmNlKEluc3RydWN0aW9uICpTcmMsIEluc3RydWN0aW9uICpEc3QsIGJvb2wgTG9vcEluZGVwZW5kZW50LAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExldmVscyk7CisKKyAgICAvLy8gaXNMb29wSW5kZXBlbmRlbnQgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIGxvb3AtaW5kZXBlbmRlbnQKKyAgICAvLy8gZGVwZW5kZW5jZS4KKyAgICBib29sIGlzTG9vcEluZGVwZW5kZW50KCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gTG9vcEluZGVwZW5kZW50OyB9CisKKyAgICAvLy8gaXNDb25mdXNlZCAtIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGRlcGVuZGVuY2UgaXMgY29uZnVzZWQKKyAgICAvLy8gKHRoZSBjb21waWxlciB1bmRlcnN0YW5kcyBub3RoaW5nIGFuZCBtYWtlcyB3b3JzdC1jYXNlCisgICAgLy8vIGFzc3VtcHRpb25zKS4KKyAgICBib29sIGlzQ29uZnVzZWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgLy8vIGlzQ29uc2lzdGVudCAtIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGRlcGVuZGVuY2UgaXMgY29uc2lzdGVudAorICAgIC8vLyAob2NjdXJzIGV2ZXJ5IHRpbWUgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gYXJlIGV4ZWN1dGVkKS4KKyAgICBib29sIGlzQ29uc2lzdGVudCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIENvbnNpc3RlbnQ7IH0KKworICAgIC8vLyBnZXRMZXZlbHMgLSBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29tbW9uIGxvb3BzIHN1cnJvdW5kaW5nIHRoZQorICAgIC8vLyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIG9mIHRoZSBkZXBlbmRlbmNlLgorICAgIHVuc2lnbmVkIGdldExldmVscygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIExldmVsczsgfQorCisgICAgLy8vIGdldERpcmVjdGlvbiAtIFJldHVybnMgdGhlIGRpcmVjdGlvbiBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyCisgICAgLy8vIGxldmVsLgorICAgIHVuc2lnbmVkIGdldERpcmVjdGlvbih1bnNpZ25lZCBMZXZlbCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLy8gZ2V0RGlzdGFuY2UgLSBSZXR1cm5zIHRoZSBkaXN0YW5jZSAob3IgTlVMTCkgYXNzb2NpYXRlZCB3aXRoIGEKKyAgICAvLy8gcGFydGljdWxhciBsZXZlbC4KKyAgICBjb25zdCBTQ0VWICpnZXREaXN0YW5jZSh1bnNpZ25lZCBMZXZlbCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLy8gaXNQZWVsRmlyc3QgLSBSZXR1cm5zIHRydWUgaWYgcGVlbGluZyB0aGUgZmlyc3QgaXRlcmF0aW9uIGZyb20KKyAgICAvLy8gdGhpcyBsb29wIHdpbGwgYnJlYWsgdGhpcyBkZXBlbmRlbmNlLgorICAgIGJvb2wgaXNQZWVsRmlyc3QodW5zaWduZWQgTGV2ZWwpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8vIGlzUGVlbExhc3QgLSBSZXR1cm5zIHRydWUgaWYgcGVlbGluZyB0aGUgbGFzdCBpdGVyYXRpb24gZnJvbQorICAgIC8vLyB0aGlzIGxvb3Agd2lsbCBicmVhayB0aGlzIGRlcGVuZGVuY2UuCisgICAgYm9vbCBpc1BlZWxMYXN0KHVuc2lnbmVkIExldmVsKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vLyBpc1NwbGl0YWJsZSAtIFJldHVybnMgdHJ1ZSBpZiBzcGxpdHRpbmcgdGhlIGxvb3Agd2lsbCBicmVhaworICAgIC8vLyB0aGUgZGVwZW5kZW5jZS4KKyAgICBib29sIGlzU3BsaXRhYmxlKHVuc2lnbmVkIExldmVsKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vLyBpc1NjYWxhciAtIFJldHVybnMgdHJ1ZSBpZiBhIHBhcnRpY3VsYXIgbGV2ZWwgaXMgc2NhbGFyOyB0aGF0IGlzLAorICAgIC8vLyBpZiBubyBzdWJzY3JpcHQgaW4gdGhlIHNvdXJjZSBvciBkZXN0aW5hdGlvbiBtZW50aW9uIHRoZSBpbmR1Y3Rpb24KKyAgICAvLy8gdmFyaWFibGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBsb29wIGF0IHRoaXMgbGV2ZWwuCisgICAgYm9vbCBpc1NjYWxhcih1bnNpZ25lZCBMZXZlbCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICB1bnNpZ25lZCBzaG9ydCBMZXZlbHM7CisgICAgYm9vbCBMb29wSW5kZXBlbmRlbnQ7CisgICAgYm9vbCBDb25zaXN0ZW50OyAvLyBJbml0IHRvIHRydWUsIHRoZW4gcmVmaW5lLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxEVkVudHJ5W10+IERWOworICAgIGZyaWVuZCBjbGFzcyBEZXBlbmRlbmNlSW5mbzsKKyAgfTsKKworICAvLy8gRGVwZW5kZW5jZUluZm8gLSBUaGlzIGNsYXNzIGlzIHRoZSBtYWluIGRlcGVuZGVuY2UtYW5hbHlzaXMgZHJpdmVyLgorICAvLy8KKyAgY2xhc3MgRGVwZW5kZW5jZUluZm8geworICBwdWJsaWM6CisgICAgRGVwZW5kZW5jZUluZm8oRnVuY3Rpb24gKkYsIEFsaWFzQW5hbHlzaXMgKkFBLCBTY2FsYXJFdm9sdXRpb24gKlNFLAorICAgICAgICAgICAgICAgICAgIExvb3BJbmZvICpMSSkKKyAgICAgICAgOiBBQShBQSksIFNFKFNFKSwgTEkoTEkpLCBGKEYpIHt9CisKKyAgICAvLy8gZGVwZW5kcyAtIFRlc3RzIGZvciBhIGRlcGVuZGVuY2UgYmV0d2VlbiB0aGUgU3JjIGFuZCBEc3QgaW5zdHJ1Y3Rpb25zLgorICAgIC8vLyBSZXR1cm5zIE5VTEwgaWYgbm8gZGVwZW5kZW5jZTsgb3RoZXJ3aXNlLCByZXR1cm5zIGEgRGVwZW5kZW5jZSAob3IgYQorICAgIC8vLyBGdWxsRGVwZW5kZW5jZSkgd2l0aCBhcyBtdWNoIGluZm9ybWF0aW9uIGFzIGNhbiBiZSBnbGVhbmVkLgorICAgIC8vLyBUaGUgZmxhZyBQb3NzaWJseUxvb3BJbmRlcGVuZGVudCBzaG91bGQgYmUgc2V0IGJ5IHRoZSBjYWxsZXIKKyAgICAvLy8gaWYgaXQgYXBwZWFycyB0aGF0IGNvbnRyb2wgZmxvdyBjYW4gcmVhY2ggZnJvbSBTcmMgdG8gRHN0CisgICAgLy8vIHdpdGhvdXQgdHJhdmVyc2luZyBhIGxvb3AgYmFjayBlZGdlLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxEZXBlbmRlbmNlPiBkZXBlbmRzKEluc3RydWN0aW9uICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFBvc3NpYmx5TG9vcEluZGVwZW5kZW50KTsKKworICAgIC8vLyBnZXRTcGxpdEl0ZXJhdGlvbiAtIEdpdmUgYSBkZXBlbmRlbmNlIHRoYXQncyBzcGxpdHRhYmxlIGF0IHNvbWUKKyAgICAvLy8gcGFydGljdWxhciBsZXZlbCwgcmV0dXJuIHRoZSBpdGVyYXRpb24gdGhhdCBzaG91bGQgYmUgdXNlZCB0byBzcGxpdAorICAgIC8vLyB0aGUgbG9vcC4KKyAgICAvLy8KKyAgICAvLy8gR2VuZXJhbGx5LCB0aGUgZGVwZW5kZW5jZSBhbmFseXplciB3aWxsIGJlIHVzZWQgdG8gYnVpbGQKKyAgICAvLy8gYSBkZXBlbmRlbmNlIGdyYXBoIGZvciBhIGZ1bmN0aW9uIChiYXNpY2FsbHkgYSBtYXAgZnJvbSBpbnN0cnVjdGlvbnMKKyAgICAvLy8gdG8gZGVwZW5kZW5jZXMpLiBMb29raW5nIGZvciBjeWNsZXMgaW4gdGhlIGdyYXBoIHNob3dzIHVzIGxvb3BzCisgICAgLy8vIHRoYXQgY2Fubm90IGJlIHRyaXZpYWxseSB2ZWN0b3JpemVkL3BhcmFsbGVsaXplZC4KKyAgICAvLy8KKyAgICAvLy8gV2UgY2FuIHRyeSB0byBpbXByb3ZlIHRoZSBzaXR1YXRpb24gYnkgZXhhbWluaW5nIGFsbCB0aGUgZGVwZW5kZW5jZXMKKyAgICAvLy8gdGhhdCBtYWtlIHVwIHRoZSBjeWNsZSwgbG9va2luZyBmb3Igb25lcyB3ZSBjYW4gYnJlYWsuCisgICAgLy8vIFNvbWV0aW1lcywgcGVlbGluZyB0aGUgZmlyc3Qgb3IgbGFzdCBpdGVyYXRpb24gb2YgYSBsb29wIHdpbGwgYnJlYWsKKyAgICAvLy8gZGVwZW5kZW5jZXMsIGFuZCB0aGVyZSBhcmUgZmxhZ3MgZm9yIHRob3NlIHBvc3NpYmlsaXRpZXMuCisgICAgLy8vIFNvbWV0aW1lcywgc3BsaXR0aW5nIGEgbG9vcCBhdCBzb21lIG90aGVyIGl0ZXJhdGlvbiB3aWxsIGRvIHRoZSB0cmljaywKKyAgICAvLy8gYW5kIHdlJ3ZlIGdvdCBhIGZsYWcgZm9yIHRoYXQgY2FzZS4gUmF0aGVyIHRoYW4gd2FzdGUgdGhlIHNwYWNlIHRvCisgICAgLy8vIHJlY29yZCB0aGUgZXhhY3QgaXRlcmF0aW9uIChzaW5jZSB3ZSByYXJlbHkga25vdyksIHdlIHByb3ZpZGUKKyAgICAvLy8gYSBtZXRob2QgdGhhdCBjYWxjdWxhdGVzIHRoZSBpdGVyYXRpb24uIEl0J3MgYSBkcmFnIHRoYXQgaXQgbXVzdCB3b3JrCisgICAgLy8vIGZyb20gc2NyYXRjaCwgYnV0IHdvbmRlcmZ1bCBpbiB0aGF0IGl0J3MgcG9zc2libGUuCisgICAgLy8vCisgICAgLy8vIEhlcmUncyBhbiBleGFtcGxlOgorICAgIC8vLworICAgIC8vLyAgICBmb3IgKGkgPSAwOyBpIDwgMTA7IGkrKykKKyAgICAvLy8gICAgICAgIEFbaV0gPSAuLi4KKyAgICAvLy8gICAgICAgIC4uLiA9IEFbMTEgLSBpXQorICAgIC8vLworICAgIC8vLyBUaGVyZSdzIGEgbG9vcC1jYXJyaWVkIGZsb3cgZGVwZW5kZW5jZSBmcm9tIHRoZSBzdG9yZSB0byB0aGUgbG9hZCwKKyAgICAvLy8gZm91bmQgYnkgdGhlIHdlYWstY3Jvc3NpbmcgU0lWIHRlc3QuIFRoZSBkZXBlbmRlbmNlIHdpbGwgaGF2ZSBhIGZsYWcsCisgICAgLy8vIGluZGljYXRpbmcgdGhhdCB0aGUgZGVwZW5kZW5jZSBjYW4gYmUgYnJva2VuIGJ5IHNwbGl0dGluZyB0aGUgbG9vcC4KKyAgICAvLy8gQ2FsbGluZyBnZXRTcGxpdEl0ZXJhdGlvbiB3aWxsIHJldHVybiA1LgorICAgIC8vLyBTcGxpdHRpbmcgdGhlIGxvb3AgYnJlYWtzIHRoZSBkZXBlbmRlbmNlLCBsaWtlIHNvOgorICAgIC8vLworICAgIC8vLyAgICBmb3IgKGkgPSAwOyBpIDw9IDU7IGkrKykKKyAgICAvLy8gICAgICAgIEFbaV0gPSAuLi4KKyAgICAvLy8gICAgICAgIC4uLiA9IEFbMTEgLSBpXQorICAgIC8vLyAgICBmb3IgKGkgPSA2OyBpIDwgMTA7IGkrKykKKyAgICAvLy8gICAgICAgIEFbaV0gPSAuLi4KKyAgICAvLy8gICAgICAgIC4uLiA9IEFbMTEgLSBpXQorICAgIC8vLworICAgIC8vLyBicmVha3MgdGhlIGRlcGVuZGVuY2UgYW5kIGFsbG93cyB1cyB0byB2ZWN0b3JpemUvcGFyYWxsZWxpemUKKyAgICAvLy8gYm90aCBsb29wcy4KKyAgICBjb25zdCBTQ0VWICpnZXRTcGxpdEl0ZXJhdGlvbihjb25zdCBEZXBlbmRlbmNlICZEZXAsIHVuc2lnbmVkIExldmVsKTsKKworICAgIEZ1bmN0aW9uICpnZXRGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIEY7IH0KKworICBwcml2YXRlOgorICAgIEFsaWFzQW5hbHlzaXMgKkFBOworICAgIFNjYWxhckV2b2x1dGlvbiAqU0U7CisgICAgTG9vcEluZm8gKkxJOworICAgIEZ1bmN0aW9uICpGOworCisgICAgLy8vIFN1YnNjcmlwdCAtIFRoaXMgcHJpdmF0ZSBzdHJ1Y3QgcmVwcmVzZW50cyBhIHBhaXIgb2Ygc3Vic2NyaXB0cyBmcm9tCisgICAgLy8vIGEgcGFpciBvZiBwb3RlbnRpYWxseSBtdWx0aS1kaW1lbnNpb25hbCBhcnJheSByZWZlcmVuY2VzLiBXZSB1c2UgYQorICAgIC8vLyB2ZWN0b3Igb2YgdGhlbSB0byBndWlkZSBzdWJzY3JpcHQgcGFydGl0aW9uaW5nLgorICAgIHN0cnVjdCBTdWJzY3JpcHQgeworICAgICAgY29uc3QgU0NFViAqU3JjOworICAgICAgY29uc3QgU0NFViAqRHN0OworICAgICAgZW51bSBDbGFzc2lmaWNhdGlvbktpbmQgeyBaSVYsIFNJViwgUkRJViwgTUlWLCBOb25MaW5lYXIgfSBDbGFzc2lmaWNhdGlvbjsKKyAgICAgIFNtYWxsQml0VmVjdG9yIExvb3BzOworICAgICAgU21hbGxCaXRWZWN0b3IgR3JvdXBMb29wczsKKyAgICAgIFNtYWxsQml0VmVjdG9yIEdyb3VwOworICAgIH07CisKKyAgICBzdHJ1Y3QgQ29lZmZpY2llbnRJbmZvIHsKKyAgICAgIGNvbnN0IFNDRVYgKkNvZWZmOworICAgICAgY29uc3QgU0NFViAqUG9zUGFydDsKKyAgICAgIGNvbnN0IFNDRVYgKk5lZ1BhcnQ7CisgICAgICBjb25zdCBTQ0VWICpJdGVyYXRpb25zOworICAgIH07CisKKyAgICBzdHJ1Y3QgQm91bmRJbmZvIHsKKyAgICAgIGNvbnN0IFNDRVYgKkl0ZXJhdGlvbnM7CisgICAgICBjb25zdCBTQ0VWICpVcHBlcls4XTsKKyAgICAgIGNvbnN0IFNDRVYgKkxvd2VyWzhdOworICAgICAgdW5zaWduZWQgY2hhciBEaXJlY3Rpb247CisgICAgICB1bnNpZ25lZCBjaGFyIERpclNldDsKKyAgICB9OworCisgICAgLy8vIENvbnN0cmFpbnQgLSBUaGlzIHByaXZhdGUgY2xhc3MgcmVwcmVzZW50cyBhIGNvbnN0cmFpbnQsIGFzIGRlZmluZWQKKyAgICAvLy8gaW4gdGhlIHBhcGVyCisgICAgLy8vCisgICAgLy8vICAgICAgICAgICBQcmFjdGljYWwgRGVwZW5kZW5jZSBUZXN0aW5nCisgICAgLy8vICAgICAgICAgICBHb2ZmLCBLZW5uZWR5LCBUc2VuZworICAgIC8vLyAgICAgICAgICAgUExESSAxOTkxCisgICAgLy8vCisgICAgLy8vIFRoZXJlIGFyZSA1IGtpbmRzIG9mIGNvbnN0cmFpbnQsIGluIGEgaGllcmFyY2h5LgorICAgIC8vLyAgIDEpIEFueSAtIGluZGljYXRlcyBubyBjb25zdHJhaW50LCBhbnkgZGVwZW5kZW5jZSBpcyBwb3NzaWJsZS4KKyAgICAvLy8gICAyKSBMaW5lIC0gQSBsaW5lIGF4ICsgYnkgPSBjLCB3aGVyZSBhLCBiLCBhbmQgYyBhcmUgcGFyYW1ldGVycywKKyAgICAvLy8gICAgICAgICAgICAgcmVwcmVzZW50aW5nIHRoZSBkZXBlbmRlbmNlIGVxdWF0aW9uLgorICAgIC8vLyAgIDMpIERpc3RhbmNlIC0gVGhlIHZhbHVlIGQgb2YgdGhlIGRlcGVuZGVuY2UgZGlzdGFuY2U7CisgICAgLy8vICAgNCkgUG9pbnQgLSBBIHBvaW50IDx4LCB5PiByZXByZXNlbnRpbmcgdGhlIGRlcGVuZGVuY2UgZnJvbQorICAgIC8vLyAgICAgICAgICAgICAgaXRlcmF0aW9uIHggdG8gaXRlcmF0aW9uIHkuCisgICAgLy8vICAgNSkgRW1wdHkgLSBObyBkZXBlbmRlbmNlIGlzIHBvc3NpYmxlLgorICAgIGNsYXNzIENvbnN0cmFpbnQgeworICAgIHByaXZhdGU6CisgICAgICBlbnVtIENvbnN0cmFpbnRLaW5kIHsgRW1wdHksIFBvaW50LCBEaXN0YW5jZSwgTGluZSwgQW55IH0gS2luZDsKKyAgICAgIFNjYWxhckV2b2x1dGlvbiAqU0U7CisgICAgICBjb25zdCBTQ0VWICpBOworICAgICAgY29uc3QgU0NFViAqQjsKKyAgICAgIGNvbnN0IFNDRVYgKkM7CisgICAgICBjb25zdCBMb29wICpBc3NvY2lhdGVkTG9vcDsKKworICAgIHB1YmxpYzoKKyAgICAgIC8vLyBpc0VtcHR5IC0gUmV0dXJuIHRydWUgaWYgdGhlIGNvbnN0cmFpbnQgaXMgb2Yga2luZCBFbXB0eS4KKyAgICAgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gRW1wdHk7IH0KKworICAgICAgLy8vIGlzUG9pbnQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29uc3RyYWludCBpcyBvZiBraW5kIFBvaW50LgorICAgICAgYm9vbCBpc1BvaW50KCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBQb2ludDsgfQorCisgICAgICAvLy8gaXNEaXN0YW5jZSAtIFJldHVybiB0cnVlIGlmIHRoZSBjb25zdHJhaW50IGlzIG9mIGtpbmQgRGlzdGFuY2UuCisgICAgICBib29sIGlzRGlzdGFuY2UoKSBjb25zdCB7IHJldHVybiBLaW5kID09IERpc3RhbmNlOyB9CisKKyAgICAgIC8vLyBpc0xpbmUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29uc3RyYWludCBpcyBvZiBraW5kIExpbmUuCisgICAgICAvLy8gU2luY2UgRGlzdGFuY2UncyBjYW4gYWxzbyBiZSByZXByZXNlbnRlZCBhcyBMaW5lcywgd2UgYWxzbyByZXR1cm4KKyAgICAgIC8vLyB0cnVlIGlmIHRoZSBjb25zdHJhaW50IGlzIG9mIGtpbmQgRGlzdGFuY2UuCisgICAgICBib29sIGlzTGluZSgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gTGluZSB8fCBLaW5kID09IERpc3RhbmNlOyB9CisKKyAgICAgIC8vLyBpc0FueSAtIFJldHVybiB0cnVlIGlmIHRoZSBjb25zdHJhaW50IGlzIG9mIGtpbmQgQW55OworICAgICAgYm9vbCBpc0FueSgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gQW55OyB9CisKKyAgICAgIC8vLyBnZXRYIC0gSWYgY29uc3RyYWludCBpcyBhIHBvaW50IDxYLCBZPiwgcmV0dXJucyBYLgorICAgICAgLy8vIE90aGVyd2lzZSBhc3NlcnQuCisgICAgICBjb25zdCBTQ0VWICpnZXRYKCkgY29uc3Q7CisKKyAgICAgIC8vLyBnZXRZIC0gSWYgY29uc3RyYWludCBpcyBhIHBvaW50IDxYLCBZPiwgcmV0dXJucyBZLgorICAgICAgLy8vIE90aGVyd2lzZSBhc3NlcnQuCisgICAgICBjb25zdCBTQ0VWICpnZXRZKCkgY29uc3Q7CisKKyAgICAgIC8vLyBnZXRBIC0gSWYgY29uc3RyYWludCBpcyBhIGxpbmUgQVggKyBCWSA9IEMsIHJldHVybnMgQS4KKyAgICAgIC8vLyBPdGhlcndpc2UgYXNzZXJ0LgorICAgICAgY29uc3QgU0NFViAqZ2V0QSgpIGNvbnN0OworCisgICAgICAvLy8gZ2V0QiAtIElmIGNvbnN0cmFpbnQgaXMgYSBsaW5lIEFYICsgQlkgPSBDLCByZXR1cm5zIEIuCisgICAgICAvLy8gT3RoZXJ3aXNlIGFzc2VydC4KKyAgICAgIGNvbnN0IFNDRVYgKmdldEIoKSBjb25zdDsKKworICAgICAgLy8vIGdldEMgLSBJZiBjb25zdHJhaW50IGlzIGEgbGluZSBBWCArIEJZID0gQywgcmV0dXJucyBDLgorICAgICAgLy8vIE90aGVyd2lzZSBhc3NlcnQuCisgICAgICBjb25zdCBTQ0VWICpnZXRDKCkgY29uc3Q7CisKKyAgICAgIC8vLyBnZXREIC0gSWYgY29uc3RyYWludCBpcyBhIGRpc3RhbmNlLCByZXR1cm5zIEQuCisgICAgICAvLy8gT3RoZXJ3aXNlIGFzc2VydC4KKyAgICAgIGNvbnN0IFNDRVYgKmdldEQoKSBjb25zdDsKKworICAgICAgLy8vIGdldEFzc29jaWF0ZWRMb29wIC0gUmV0dXJucyB0aGUgbG9vcCBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb25zdHJhaW50LgorICAgICAgY29uc3QgTG9vcCAqZ2V0QXNzb2NpYXRlZExvb3AoKSBjb25zdDsKKworICAgICAgLy8vIHNldFBvaW50IC0gQ2hhbmdlIGEgY29uc3RyYWludCB0byBQb2ludC4KKyAgICAgIHZvaWQgc2V0UG9pbnQoY29uc3QgU0NFViAqWCwgY29uc3QgU0NFViAqWSwgY29uc3QgTG9vcCAqQ3VycmVudExvb3ApOworCisgICAgICAvLy8gc2V0TGluZSAtIENoYW5nZSBhIGNvbnN0cmFpbnQgdG8gTGluZS4KKyAgICAgIHZvaWQgc2V0TGluZShjb25zdCBTQ0VWICpBLCBjb25zdCBTQ0VWICpCLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkMsIGNvbnN0IExvb3AgKkN1cnJlbnRMb29wKTsKKworICAgICAgLy8vIHNldERpc3RhbmNlIC0gQ2hhbmdlIGEgY29uc3RyYWludCB0byBEaXN0YW5jZS4KKyAgICAgIHZvaWQgc2V0RGlzdGFuY2UoY29uc3QgU0NFViAqRCwgY29uc3QgTG9vcCAqQ3VycmVudExvb3ApOworCisgICAgICAvLy8gc2V0RW1wdHkgLSBDaGFuZ2UgYSBjb25zdHJhaW50IHRvIEVtcHR5LgorICAgICAgdm9pZCBzZXRFbXB0eSgpOworCisgICAgICAvLy8gc2V0QW55IC0gQ2hhbmdlIGEgY29uc3RyYWludCB0byBBbnkuCisgICAgICB2b2lkIHNldEFueShTY2FsYXJFdm9sdXRpb24gKlNFKTsKKworICAgICAgLy8vIGR1bXAgLSBGb3IgZGVidWdnaW5nIHB1cnBvc2VzLiBEdW1wcyB0aGUgY29uc3RyYWludAorICAgICAgLy8vIG91dCB0byBPUy4KKyAgICAgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICAgIH07CisKKyAgICAvLy8gZXN0YWJsaXNoTmVzdGluZ0xldmVscyAtIEV4YW1pbmVzIHRoZSBsb29wIG5lc3Rpbmcgb2YgdGhlIFNyYyBhbmQgRHN0CisgICAgLy8vIGluc3RydWN0aW9ucyBhbmQgZXN0YWJsaXNoZXMgdGhlaXIgc2hhcmVkIGxvb3BzLiBTZXRzIHRoZSB2YXJpYWJsZXMKKyAgICAvLy8gQ29tbW9uTGV2ZWxzLCBTcmNMZXZlbHMsIGFuZCBNYXhMZXZlbHMuCisgICAgLy8vIFRoZSBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGluc3RydWN0aW9ucyBuZWVkbid0IGJlIGNvbnRhaW5lZCBpbiB0aGUgc2FtZQorICAgIC8vLyBsb29wLiBUaGUgcm91dGluZSBlc3RhYmxpc2hOZXN0aW5nTGV2ZWxzIGZpbmRzIHRoZSBsZXZlbCBvZiBtb3N0IGRlZXBseQorICAgIC8vLyBuZXN0ZWQgbG9vcCB0aGF0IGNvbnRhaW5zIHRoZW0gYm90aCwgQ29tbW9uTGV2ZWxzLiBBbiBpbnN0cnVjdGlvbiB0aGF0J3MKKyAgICAvLy8gbm90IGNvbnRhaW5lZCBpbiBhIGxvb3AgaXMgYXQgbGV2ZWwgPSAwLiBNYXhMZXZlbHMgaXMgZXF1YWwgdG8gdGhlIGxldmVsCisgICAgLy8vIG9mIHRoZSBzb3VyY2UgcGx1cyB0aGUgbGV2ZWwgb2YgdGhlIGRlc3RpbmF0aW9uLCBtaW51cyBDb21tb25MZXZlbHMuCisgICAgLy8vIFRoaXMgbGV0cyB1cyBhbGxvY2F0ZSB2ZWN0b3JzIE1heExldmVscyBpbiBsZW5ndGgsIHdpdGggcm9vbSBmb3IgZXZlcnkKKyAgICAvLy8gZGlzdGluY3QgbG9vcCByZWZlcmVuY2VkIGluIGJvdGggdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gc3Vic2NyaXB0cy4KKyAgICAvLy8gVGhlIHZhcmlhYmxlIFNyY0xldmVscyBpcyB0aGUgbmVzdGluZyBkZXB0aCBvZiB0aGUgc291cmNlIGluc3RydWN0aW9uLgorICAgIC8vLyBJdCdzIHVzZWQgdG8gaGVscCBjYWxjdWxhdGUgZGlzdGluY3QgbG9vcHMgcmVmZXJlbmNlZCBieSB0aGUgZGVzdGluYXRpb24uCisgICAgLy8vIEhlcmUncyB0aGUgbWFwIGZyb20gbG9vcHMgdG8gbGV2ZWxzOgorICAgIC8vLyAgICAgICAgICAgIDAgLSB1bnVzZWQKKyAgICAvLy8gICAgICAgICAgICAxIC0gb3V0ZXJtb3N0IGNvbW1vbiBsb29wCisgICAgLy8vICAgICAgICAgIC4uLiAtIG90aGVyIGNvbW1vbiBsb29wcworICAgIC8vLyBDb21tb25MZXZlbHMgLSBpbm5lcm1vc3QgY29tbW9uIGxvb3AKKyAgICAvLy8gICAgICAgICAgLi4uIC0gbG9vcHMgY29udGFpbmluZyBTcmMgYnV0IG5vdCBEc3QKKyAgICAvLy8gICAgU3JjTGV2ZWxzIC0gaW5uZXJtb3N0IGxvb3AgY29udGFpbmluZyBTcmMgYnV0IG5vdCBEc3QKKyAgICAvLy8gICAgICAgICAgLi4uIC0gbG9vcHMgY29udGFpbmluZyBEc3QgYnV0IG5vdCBTcmMKKyAgICAvLy8gICAgTWF4TGV2ZWxzIC0gaW5uZXJtb3N0IGxvb3AgY29udGFpbmluZyBEc3QgYnV0IG5vdCBTcmMKKyAgICAvLy8gQ29uc2lkZXIgdGhlIGZvbGxvdyBjb2RlIGZyYWdtZW50OgorICAgIC8vLyAgICBmb3IgKGEgPSAuLi4pIHsKKyAgICAvLy8gICAgICBmb3IgKGIgPSAuLi4pIHsKKyAgICAvLy8gICAgICAgIGZvciAoYyA9IC4uLikgeworICAgIC8vLyAgICAgICAgICBmb3IgKGQgPSAuLi4pIHsKKyAgICAvLy8gICAgICAgICAgICBBW10gPSAuLi47CisgICAgLy8vICAgICAgICAgIH0KKyAgICAvLy8gICAgICAgIH0KKyAgICAvLy8gICAgICAgIGZvciAoZSA9IC4uLikgeworICAgIC8vLyAgICAgICAgICBmb3IgKGYgPSAuLi4pIHsKKyAgICAvLy8gICAgICAgICAgICBmb3IgKGcgPSAuLi4pIHsKKyAgICAvLy8gICAgICAgICAgICAgIC4uLiA9IEFbXTsKKyAgICAvLy8gICAgICAgICAgICB9CisgICAgLy8vICAgICAgICAgIH0KKyAgICAvLy8gICAgICAgIH0KKyAgICAvLy8gICAgICB9CisgICAgLy8vICAgIH0KKyAgICAvLy8gSWYgd2UncmUgbG9va2luZyBhdCB0aGUgcG9zc2liaWxpdHkgb2YgYSBkZXBlbmRlbmNlIGJldHdlZW4gdGhlIHN0b3JlCisgICAgLy8vIHRvIEEgKHRoZSBTcmMpIGFuZCB0aGUgbG9hZCBmcm9tIEEgKHRoZSBEc3QpLCB3ZSdsbCBub3RlIHRoYXQgdGhleQorICAgIC8vLyBoYXZlIDIgbG9vcHMgaW4gY29tbW9uLCBzbyBDb21tb25MZXZlbHMgd2lsbCBlcXVhbCAyIGFuZCB0aGUgZGlyZWN0aW9uCisgICAgLy8vIHZlY3RvciBmb3IgUmVzdWx0IHdpbGwgaGF2ZSAyIGVudHJpZXMuIFNyY0xldmVscyA9IDQgYW5kIE1heExldmVscyA9IDcuCisgICAgLy8vIEEgbWFwIGZyb20gbG9vcCBuYW1lcyB0byBsZXZlbCBpbmRpY2VzIHdvdWxkIGxvb2sgbGlrZQorICAgIC8vLyAgICAgYSAtIDEKKyAgICAvLy8gICAgIGIgLSAyID0gQ29tbW9uTGV2ZWxzCisgICAgLy8vICAgICBjIC0gMworICAgIC8vLyAgICAgZCAtIDQgPSBTcmNMZXZlbHMKKyAgICAvLy8gICAgIGUgLSA1CisgICAgLy8vICAgICBmIC0gNgorICAgIC8vLyAgICAgZyAtIDcgPSBNYXhMZXZlbHMKKyAgICB2b2lkIGVzdGFibGlzaE5lc3RpbmdMZXZlbHMoY29uc3QgSW5zdHJ1Y3Rpb24gKlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkRzdCk7CisKKyAgICB1bnNpZ25lZCBDb21tb25MZXZlbHMsIFNyY0xldmVscywgTWF4TGV2ZWxzOworCisgICAgLy8vIG1hcFNyY0xvb3AgLSBHaXZlbiBvbmUgb2YgdGhlIGxvb3BzIGNvbnRhaW5pbmcgdGhlIHNvdXJjZSwgcmV0dXJuCisgICAgLy8vIGl0cyBsZXZlbCBpbmRleCBpbiBvdXIgbnVtYmVyaW5nIHNjaGVtZS4KKyAgICB1bnNpZ25lZCBtYXBTcmNMb29wKGNvbnN0IExvb3AgKlNyY0xvb3ApIGNvbnN0OworCisgICAgLy8vIG1hcERzdExvb3AgLSBHaXZlbiBvbmUgb2YgdGhlIGxvb3BzIGNvbnRhaW5pbmcgdGhlIGRlc3RpbmF0aW9uLAorICAgIC8vLyByZXR1cm4gaXRzIGxldmVsIGluZGV4IGluIG91ciBudW1iZXJpbmcgc2NoZW1lLgorICAgIHVuc2lnbmVkIG1hcERzdExvb3AoY29uc3QgTG9vcCAqRHN0TG9vcCkgY29uc3Q7CisKKyAgICAvLy8gaXNMb29wSW52YXJpYW50IC0gUmV0dXJucyB0cnVlIGlmIEV4cHJlc3Npb24gaXMgbG9vcCBpbnZhcmlhbnQKKyAgICAvLy8gaW4gTG9vcE5lc3QuCisgICAgYm9vbCBpc0xvb3BJbnZhcmlhbnQoY29uc3QgU0NFViAqRXhwcmVzc2lvbiwgY29uc3QgTG9vcCAqTG9vcE5lc3QpIGNvbnN0OworCisgICAgLy8vIE1ha2VzIHN1cmUgYWxsIHN1YnNjcmlwdCBwYWlycyBzaGFyZSB0aGUgc2FtZSBpbnRlZ2VyIHR5cGUgYnkKKyAgICAvLy8gc2lnbi1leHRlbmRpbmcgYXMgbmVjZXNzYXJ5LgorICAgIC8vLyBTaWduLWV4dGVuZGluZyBhIHN1YnNjcmlwdCBpcyBzYWZlIGJlY2F1c2UgZ2V0ZWxlbWVudHB0ciBhc3N1bWVzIHRoZQorICAgIC8vLyBhcnJheSBzdWJzY3JpcHRzIGFyZSBzaWduZWQuCisgICAgdm9pZCB1bmlmeVN1YnNjcmlwdFR5cGUoQXJyYXlSZWY8U3Vic2NyaXB0ICo+IFBhaXJzKTsKKworICAgIC8vLyByZW1vdmVNYXRjaGluZ0V4dGVuc2lvbnMgLSBFeGFtaW5lcyBhIHN1YnNjcmlwdCBwYWlyLgorICAgIC8vLyBJZiB0aGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhcmUgaWRlbnRpY2FsbHkgc2lnbiAob3IgemVybykKKyAgICAvLy8gZXh0ZW5kZWQsIGl0IHN0cmlwcyBvZmYgdGhlIGV4dGVuc2lvbiBpbiBhbiBlZmZvcnQgdG8KKyAgICAvLy8gc2ltcGxpZnkgdGhlIGFjdHVhbCBhbmFseXNpcy4KKyAgICB2b2lkIHJlbW92ZU1hdGNoaW5nRXh0ZW5zaW9ucyhTdWJzY3JpcHQgKlBhaXIpOworCisgICAgLy8vIGNvbGxlY3RDb21tb25Mb29wcyAtIEZpbmRzIHRoZSBzZXQgb2YgbG9vcHMgZnJvbSB0aGUgTG9vcE5lc3QgdGhhdAorICAgIC8vLyBoYXZlIGEgbGV2ZWwgPD0gQ29tbW9uTGV2ZWxzIGFuZCBhcmUgcmVmZXJyZWQgdG8gYnkgdGhlIFNDRVYgRXhwcmVzc2lvbi4KKyAgICB2b2lkIGNvbGxlY3RDb21tb25Mb29wcyhjb25zdCBTQ0VWICpFeHByZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKkxvb3BOZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsQml0VmVjdG9yICZMb29wcykgY29uc3Q7CisKKyAgICAvLy8gY2hlY2tTcmNTdWJzY3JpcHQgLSBFeGFtaW5lcyB0aGUgU0NFViBTcmMsIHJldHVybmluZyB0cnVlIGlmZiBpdCdzCisgICAgLy8vIGxpbmVhci4gQ29sbGVjdCB0aGUgc2V0IG9mIGxvb3BzIG1lbnRpb25lZCBieSBTcmMuCisgICAgYm9vbCBjaGVja1NyY1N1YnNjcmlwdChjb25zdCBTQ0VWICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpMb29wTmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsQml0VmVjdG9yICZMb29wcyk7CisKKyAgICAvLy8gY2hlY2tEc3RTdWJzY3JpcHQgLSBFeGFtaW5lcyB0aGUgU0NFViBEc3QsIHJldHVybmluZyB0cnVlIGlmZiBpdCdzCisgICAgLy8vIGxpbmVhci4gQ29sbGVjdCB0aGUgc2V0IG9mIGxvb3BzIG1lbnRpb25lZCBieSBEc3QuCisgICAgYm9vbCBjaGVja0RzdFN1YnNjcmlwdChjb25zdCBTQ0VWICpEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpMb29wTmVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsQml0VmVjdG9yICZMb29wcyk7CisKKyAgICAvLy8gaXNLbm93blByZWRpY2F0ZSAtIENvbXBhcmUgWCBhbmQgWSB1c2luZyB0aGUgcHJlZGljYXRlIFByZWQuCisgICAgLy8vIEJhc2ljYWxseSBhIHdyYXBwZXIgZm9yIFNDRVY6OmlzS25vd25QcmVkaWNhdGUsCisgICAgLy8vIGJ1dCB0cmllcyBoYXJkZXIsIGVzcGVjaWFsbHkgaW4gdGhlIHByZXNlbmNlIG9mIHNpZ24gYW5kIHplcm8KKyAgICAvLy8gZXh0ZW5zaW9ucyBhbmQgc3ltYm9saWNzLgorICAgIGJvb2wgaXNLbm93blByZWRpY2F0ZShJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlkpIGNvbnN0OworCisgICAgLy8vIGNvbGxlY3RVcHBlckJvdW5kIC0gQWxsIHN1YnNjcmlwdHMgYXJlIHRoZSBzYW1lIHR5cGUgKG9uIG15IG1hY2hpbmUsCisgICAgLy8vIGFuIGk2NCkuIFRoZSBsb29wIGJvdW5kIG1heSBiZSBhIHNtYWxsZXIgdHlwZS4gY29sbGVjdFVwcGVyQm91bmQKKyAgICAvLy8gZmluZCB0aGUgYm91bmQsIGlmIGF2YWlsYWJsZSwgYW5kIHplcm8gZXh0ZW5kcyBpdCB0byB0aGUgVHlwZSBULgorICAgIC8vLyAoSSB6ZXJvIGV4dGVuZCBzaW5jZSB0aGUgYm91bmQgc2hvdWxkIGFsd2F5cyBiZSA+PSAwLikKKyAgICAvLy8gSWYgbm8gdXBwZXIgYm91bmQgaXMgYXZhaWxhYmxlLCByZXR1cm4gTlVMTC4KKyAgICBjb25zdCBTQ0VWICpjb2xsZWN0VXBwZXJCb3VuZChjb25zdCBMb29wICpsLCBUeXBlICpUKSBjb25zdDsKKworICAgIC8vLyBjb2xsZWN0Q29uc3RhbnRVcHBlckJvdW5kIC0gQ2FsbHMgY29sbGVjdFVwcGVyQm91bmQoKSwgdGhlbgorICAgIC8vLyBhdHRlbXB0cyB0byBjYXN0IGl0IHRvIFNDRVZDb25zdGFudC4gSWYgdGhlIGNhc3QgZmFpbHMsCisgICAgLy8vIHJldHVybnMgTlVMTC4KKyAgICBjb25zdCBTQ0VWQ29uc3RhbnQgKmNvbGxlY3RDb25zdGFudFVwcGVyQm91bmQoY29uc3QgTG9vcCAqbCwgVHlwZSAqVCkgY29uc3Q7CisKKyAgICAvLy8gY2xhc3NpZnlQYWlyIC0gRXhhbWluZXMgdGhlIHN1YnNjcmlwdCBwYWlyICh0aGUgU3JjIGFuZCBEc3QgU0NFVnMpCisgICAgLy8vIGFuZCBjbGFzc2lmaWVzIGl0IGFzIGVpdGhlciBaSVYsIFNJViwgUkRJViwgTUlWLCBvciBOb25saW5lYXIuCisgICAgLy8vIENvbGxlY3RzIHRoZSBhc3NvY2lhdGVkIGxvb3BzIGluIGEgc2V0LgorICAgIFN1YnNjcmlwdDo6Q2xhc3NpZmljYXRpb25LaW5kIGNsYXNzaWZ5UGFpcihjb25zdCBTQ0VWICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqU3JjTG9vcE5lc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKkRzdExvb3BOZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsQml0VmVjdG9yICZMb29wcyk7CisKKyAgICAvLy8gdGVzdFpJViAtIFRlc3RzIHRoZSBaSVYgc3Vic2NyaXB0IHBhaXIgKFNyYyBhbmQgRHN0KSBmb3IgZGVwZW5kZW5jZS4KKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGFueSBwb3NzaWJsZSBkZXBlbmRlbmNlIGlzIGRpc3Byb3ZlZC4KKyAgICAvLy8gSWYgdGhlcmUgbWlnaHQgYmUgYSBkZXBlbmRlbmNlLCByZXR1cm5zIGZhbHNlLgorICAgIC8vLyBJZiB0aGUgZGVwZW5kZW5jZSBpc24ndCBwcm92ZW4gdG8gZXhpc3QsCisgICAgLy8vIG1hcmtzIHRoZSBSZXN1bHQgYXMgaW5jb25zaXN0ZW50LgorICAgIGJvb2wgdGVzdFpJVihjb25zdCBTQ0VWICpTcmMsCisgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkRzdCwKKyAgICAgICAgICAgICAgICAgRnVsbERlcGVuZGVuY2UgJlJlc3VsdCkgY29uc3Q7CisKKyAgICAvLy8gdGVzdFNJViAtIFRlc3RzIHRoZSBTSVYgc3Vic2NyaXB0IHBhaXIgKFNyYyBhbmQgRHN0KSBmb3IgZGVwZW5kZW5jZS4KKyAgICAvLy8gVGhpbmdzIG9mIHRoZSBmb3JtIFtjMSArIGExKmldIGFuZCBbYzIgKyBhMipqXSwgd2hlcmUKKyAgICAvLy8gaSBhbmQgaiBhcmUgaW5kdWN0aW9uIHZhcmlhYmxlcywgYzEgYW5kIGMyIGFyZSBsb29wIGludmFyaWFudCwKKyAgICAvLy8gYW5kIGExIGFuZCBhMiBhcmUgY29uc3RhbnQuCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgcG9zc2libGUgZGVwZW5kZW5jZSBpcyBkaXNwcm92ZWQuCisgICAgLy8vIElmIHRoZXJlIG1pZ2h0IGJlIGEgZGVwZW5kZW5jZSwgcmV0dXJucyBmYWxzZS4KKyAgICAvLy8gU2V0cyBhcHByb3ByaWF0ZSBkaXJlY3Rpb24gdmVjdG9yIGVudHJ5IGFuZCwgd2hlbiBwb3NzaWJsZSwKKyAgICAvLy8gdGhlIGRpc3RhbmNlIHZlY3RvciBlbnRyeS4KKyAgICAvLy8gSWYgdGhlIGRlcGVuZGVuY2UgaXNuJ3QgcHJvdmVuIHRvIGV4aXN0LAorICAgIC8vLyBtYXJrcyB0aGUgUmVzdWx0IGFzIGluY29uc2lzdGVudC4KKyAgICBib29sIHRlc3RTSVYoY29uc3QgU0NFViAqU3JjLAorICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpEc3QsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZMZXZlbCwKKyAgICAgICAgICAgICAgICAgRnVsbERlcGVuZGVuY2UgJlJlc3VsdCwKKyAgICAgICAgICAgICAgICAgQ29uc3RyYWludCAmTmV3Q29uc3RyYWludCwKKyAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqJlNwbGl0SXRlcikgY29uc3Q7CisKKyAgICAvLy8gdGVzdFJESVYgLSBUZXN0cyB0aGUgUkRJViBzdWJzY3JpcHQgcGFpciAoU3JjIGFuZCBEc3QpIGZvciBkZXBlbmRlbmNlLgorICAgIC8vLyBUaGluZ3Mgb2YgdGhlIGZvcm0gW2MxICsgYTEqaV0gYW5kIFtjMiArIGEyKmpdCisgICAgLy8vIHdoZXJlIGkgYW5kIGogYXJlIGluZHVjdGlvbiB2YXJpYWJsZXMsIGMxIGFuZCBjMiBhcmUgbG9vcCBpbnZhcmlhbnQsCisgICAgLy8vIGFuZCBhMSBhbmQgYTIgYXJlIGNvbnN0YW50LgorICAgIC8vLyBXaXRoIG1pbm9yIGFsZ2VicmEsIHRoaXMgdGVzdCBjYW4gYWxzbyBiZSB1c2VkIGZvciB0aGluZ3MgbGlrZQorICAgIC8vLyBbYzEgKyBhMSppICsgYTIqal1bYzJdLgorICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgYW55IHBvc3NpYmxlIGRlcGVuZGVuY2UgaXMgZGlzcHJvdmVkLgorICAgIC8vLyBJZiB0aGVyZSBtaWdodCBiZSBhIGRlcGVuZGVuY2UsIHJldHVybnMgZmFsc2UuCisgICAgLy8vIE1hcmtzIHRoZSBSZXN1bHQgYXMgaW5jb25zaXN0ZW50LgorICAgIGJvb2wgdGVzdFJESVYoY29uc3QgU0NFViAqU3JjLAorICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRHN0LAorICAgICAgICAgICAgICAgICAgRnVsbERlcGVuZGVuY2UgJlJlc3VsdCkgY29uc3Q7CisKKyAgICAvLy8gdGVzdE1JViAtIFRlc3RzIHRoZSBNSVYgc3Vic2NyaXB0IHBhaXIgKFNyYyBhbmQgRHN0KSBmb3IgZGVwZW5kZW5jZS4KKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGRlcGVuZGVuY2UgZGlzcHJvdmVkLgorICAgIC8vLyBDYW4gc29tZXRpbWVzIHJlZmluZSBkaXJlY3Rpb24gdmVjdG9ycy4KKyAgICBib29sIHRlc3RNSVYoY29uc3QgU0NFViAqU3JjLAorICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpEc3QsCisgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsQml0VmVjdG9yICZMb29wcywKKyAgICAgICAgICAgICAgICAgRnVsbERlcGVuZGVuY2UgJlJlc3VsdCkgY29uc3Q7CisKKyAgICAvLy8gc3Ryb25nU0lWdGVzdCAtIFRlc3RzIHRoZSBzdHJvbmcgU0lWIHN1YnNjcmlwdCBwYWlyIChTcmMgYW5kIERzdCkKKyAgICAvLy8gZm9yIGRlcGVuZGVuY2UuCisgICAgLy8vIFRoaW5ncyBvZiB0aGUgZm9ybSBbYzEgKyBhKmldIGFuZCBbYzIgKyBhKmldLAorICAgIC8vLyB3aGVyZSBpIGlzIGFuIGluZHVjdGlvbiB2YXJpYWJsZSwgYzEgYW5kIGMyIGFyZSBsb29wIGludmFyaWFudCwKKyAgICAvLy8gYW5kIGEgaXMgYSBjb25zdGFudAorICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgYW55IHBvc3NpYmxlIGRlcGVuZGVuY2UgaXMgZGlzcHJvdmVkLgorICAgIC8vLyBJZiB0aGVyZSBtaWdodCBiZSBhIGRlcGVuZGVuY2UsIHJldHVybnMgZmFsc2UuCisgICAgLy8vIFNldHMgYXBwcm9wcmlhdGUgZGlyZWN0aW9uIGFuZCBkaXN0YW5jZS4KKyAgICBib29sIHN0cm9uZ1NJVnRlc3QoY29uc3QgU0NFViAqQ29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlNyY0NvbnN0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpEc3RDb25zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqQ3VycmVudExvb3AsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICBGdWxsRGVwZW5kZW5jZSAmUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50ICZOZXdDb25zdHJhaW50KSBjb25zdDsKKworICAgIC8vLyB3ZWFrQ3Jvc3NpbmdTSVZ0ZXN0IC0gVGVzdHMgdGhlIHdlYWstY3Jvc3NpbmcgU0lWIHN1YnNjcmlwdCBwYWlyCisgICAgLy8vIChTcmMgYW5kIERzdCkgZm9yIGRlcGVuZGVuY2UuCisgICAgLy8vIFRoaW5ncyBvZiB0aGUgZm9ybSBbYzEgKyBhKmldIGFuZCBbYzIgLSBhKmldLAorICAgIC8vLyB3aGVyZSBpIGlzIGFuIGluZHVjdGlvbiB2YXJpYWJsZSwgYzEgYW5kIGMyIGFyZSBsb29wIGludmFyaWFudCwKKyAgICAvLy8gYW5kIGEgaXMgYSBjb25zdGFudC4KKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGFueSBwb3NzaWJsZSBkZXBlbmRlbmNlIGlzIGRpc3Byb3ZlZC4KKyAgICAvLy8gSWYgdGhlcmUgbWlnaHQgYmUgYSBkZXBlbmRlbmNlLCByZXR1cm5zIGZhbHNlLgorICAgIC8vLyBTZXRzIGFwcHJvcHJpYXRlIGRpcmVjdGlvbiBlbnRyeS4KKyAgICAvLy8gU2V0IGNvbnNpc3RlbnQgdG8gZmFsc2UuCisgICAgLy8vIE1hcmtzIHRoZSBkZXBlbmRlbmNlIGFzIHNwbGl0YWJsZS4KKyAgICBib29sIHdlYWtDcm9zc2luZ1NJVnRlc3QoY29uc3QgU0NFViAqU3JjQ29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlNyY0NvbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpEc3RDb25zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqQ3VycmVudExvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdWxsRGVwZW5kZW5jZSAmUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50ICZOZXdDb25zdHJhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWIComU3BsaXRJdGVyKSBjb25zdDsKKworICAgIC8vLyBFeGFjdFNJVnRlc3QgLSBUZXN0cyB0aGUgU0lWIHN1YnNjcmlwdCBwYWlyCisgICAgLy8vIChTcmMgYW5kIERzdCkgZm9yIGRlcGVuZGVuY2UuCisgICAgLy8vIFRoaW5ncyBvZiB0aGUgZm9ybSBbYzEgKyBhMSppXSBhbmQgW2MyICsgYTIqaV0sCisgICAgLy8vIHdoZXJlIGkgaXMgYW4gaW5kdWN0aW9uIHZhcmlhYmxlLCBjMSBhbmQgYzIgYXJlIGxvb3AgaW52YXJpYW50LAorICAgIC8vLyBhbmQgYTEgYW5kIGEyIGFyZSBjb25zdGFudC4KKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGFueSBwb3NzaWJsZSBkZXBlbmRlbmNlIGlzIGRpc3Byb3ZlZC4KKyAgICAvLy8gSWYgdGhlcmUgbWlnaHQgYmUgYSBkZXBlbmRlbmNlLCByZXR1cm5zIGZhbHNlLgorICAgIC8vLyBTZXRzIGFwcHJvcHJpYXRlIGRpcmVjdGlvbiBlbnRyeS4KKyAgICAvLy8gU2V0IGNvbnNpc3RlbnQgdG8gZmFsc2UuCisgICAgYm9vbCBleGFjdFNJVnRlc3QoY29uc3QgU0NFViAqU3JjQ29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRHN0Q29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqU3JjQ29uc3QsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRHN0Q29uc3QsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqQ3VycmVudExvb3AsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgRnVsbERlcGVuZGVuY2UgJlJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50ICZOZXdDb25zdHJhaW50KSBjb25zdDsKKworICAgIC8vLyB3ZWFrWmVyb1NyY1NJVnRlc3QgLSBUZXN0cyB0aGUgd2Vhay16ZXJvIFNJViBzdWJzY3JpcHQgcGFpcgorICAgIC8vLyAoU3JjIGFuZCBEc3QpIGZvciBkZXBlbmRlbmNlLgorICAgIC8vLyBUaGluZ3Mgb2YgdGhlIGZvcm0gW2MxXSBhbmQgW2MyICsgYSppXSwKKyAgICAvLy8gd2hlcmUgaSBpcyBhbiBpbmR1Y3Rpb24gdmFyaWFibGUsIGMxIGFuZCBjMiBhcmUgbG9vcCBpbnZhcmlhbnQsCisgICAgLy8vIGFuZCBhIGlzIGEgY29uc3RhbnQuIFNlZSBhbHNvIHdlYWtaZXJvRHN0U0lWdGVzdC4KKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGFueSBwb3NzaWJsZSBkZXBlbmRlbmNlIGlzIGRpc3Byb3ZlZC4KKyAgICAvLy8gSWYgdGhlcmUgbWlnaHQgYmUgYSBkZXBlbmRlbmNlLCByZXR1cm5zIGZhbHNlLgorICAgIC8vLyBTZXRzIGFwcHJvcHJpYXRlIGRpcmVjdGlvbiBlbnRyeS4KKyAgICAvLy8gU2V0IGNvbnNpc3RlbnQgdG8gZmFsc2UuCisgICAgLy8vIElmIGxvb3AgcGVlbGluZyB3aWxsIGJyZWFrIHRoZSBkZXBlbmRlbmNlLCBtYXJrIGFwcHJvcHJpYXRlbHkuCisgICAgYm9vbCB3ZWFrWmVyb1NyY1NJVnRlc3QoY29uc3QgU0NFViAqRHN0Q29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqU3JjQ29uc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRHN0Q29uc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqQ3VycmVudExvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVsbERlcGVuZGVuY2UgJlJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50ICZOZXdDb25zdHJhaW50KSBjb25zdDsKKworICAgIC8vLyB3ZWFrWmVyb0RzdFNJVnRlc3QgLSBUZXN0cyB0aGUgd2Vhay16ZXJvIFNJViBzdWJzY3JpcHQgcGFpcgorICAgIC8vLyAoU3JjIGFuZCBEc3QpIGZvciBkZXBlbmRlbmNlLgorICAgIC8vLyBUaGluZ3Mgb2YgdGhlIGZvcm0gW2MxICsgYSppXSBhbmQgW2MyXSwKKyAgICAvLy8gd2hlcmUgaSBpcyBhbiBpbmR1Y3Rpb24gdmFyaWFibGUsIGMxIGFuZCBjMiBhcmUgbG9vcCBpbnZhcmlhbnQsCisgICAgLy8vIGFuZCBhIGlzIGEgY29uc3RhbnQuIFNlZSBhbHNvIHdlYWtaZXJvU3JjU0lWdGVzdC4KKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGFueSBwb3NzaWJsZSBkZXBlbmRlbmNlIGlzIGRpc3Byb3ZlZC4KKyAgICAvLy8gSWYgdGhlcmUgbWlnaHQgYmUgYSBkZXBlbmRlbmNlLCByZXR1cm5zIGZhbHNlLgorICAgIC8vLyBTZXRzIGFwcHJvcHJpYXRlIGRpcmVjdGlvbiBlbnRyeS4KKyAgICAvLy8gU2V0IGNvbnNpc3RlbnQgdG8gZmFsc2UuCisgICAgLy8vIElmIGxvb3AgcGVlbGluZyB3aWxsIGJyZWFrIHRoZSBkZXBlbmRlbmNlLCBtYXJrIGFwcHJvcHJpYXRlbHkuCisgICAgYm9vbCB3ZWFrWmVyb0RzdFNJVnRlc3QoY29uc3QgU0NFViAqU3JjQ29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqU3JjQ29uc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRHN0Q29uc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqQ3VycmVudExvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVsbERlcGVuZGVuY2UgJlJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50ICZOZXdDb25zdHJhaW50KSBjb25zdDsKKworICAgIC8vLyBleGFjdFJESVZ0ZXN0IC0gVGVzdHMgdGhlIFJESVYgc3Vic2NyaXB0IHBhaXIgZm9yIGRlcGVuZGVuY2UuCisgICAgLy8vIFRoaW5ncyBvZiB0aGUgZm9ybSBbYzEgKyBhKmldIGFuZCBbYzIgKyBiKmpdLAorICAgIC8vLyB3aGVyZSBpIGFuZCBqIGFyZSBpbmR1Y3Rpb24gdmFyaWFibGUsIGMxIGFuZCBjMiBhcmUgbG9vcCBpbnZhcmlhbnQsCisgICAgLy8vIGFuZCBhIGFuZCBiIGFyZSBjb25zdGFudHMuCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgcG9zc2libGUgZGVwZW5kZW5jZSBpcyBkaXNwcm92ZWQuCisgICAgLy8vIE1hcmtzIHRoZSByZXN1bHQgYXMgaW5jb25zaXN0ZW50LgorICAgIC8vLyBXb3JrcyBpbiBzb21lIGNhc2VzIHRoYXQgc3ltYm9saWNSRElWdGVzdCBkb2Vzbid0LAorICAgIC8vLyBhbmQgdmljZSB2ZXJzYS4KKyAgICBib29sIGV4YWN0UkRJVnRlc3QoY29uc3QgU0NFViAqU3JjQ29lZmYsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkRzdENvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpTcmNDb25zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRHN0Q29uc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKlNyY0xvb3AsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKkRzdExvb3AsCisgICAgICAgICAgICAgICAgICAgICAgIEZ1bGxEZXBlbmRlbmNlICZSZXN1bHQpIGNvbnN0OworCisgICAgLy8vIHN5bWJvbGljUkRJVnRlc3QgLSBUZXN0cyB0aGUgUkRJViBzdWJzY3JpcHQgcGFpciBmb3IgZGVwZW5kZW5jZS4KKyAgICAvLy8gVGhpbmdzIG9mIHRoZSBmb3JtIFtjMSArIGEqaV0gYW5kIFtjMiArIGIqal0sCisgICAgLy8vIHdoZXJlIGkgYW5kIGogYXJlIGluZHVjdGlvbiB2YXJpYWJsZSwgYzEgYW5kIGMyIGFyZSBsb29wIGludmFyaWFudCwKKyAgICAvLy8gYW5kIGEgYW5kIGIgYXJlIGNvbnN0YW50cy4KKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIGFueSBwb3NzaWJsZSBkZXBlbmRlbmNlIGlzIGRpc3Byb3ZlZC4KKyAgICAvLy8gTWFya3MgdGhlIHJlc3VsdCBhcyBpbmNvbnNpc3RlbnQuCisgICAgLy8vIFdvcmtzIGluIHNvbWUgY2FzZXMgdGhhdCBleGFjdFJESVZ0ZXN0IGRvZXNuJ3QsCisgICAgLy8vIGFuZCB2aWNlIHZlcnNhLiBDYW4gYWxzbyBiZSB1c2VkIGFzIGEgYmFja3VwIGZvcgorICAgIC8vLyBvcmRpbmFyeSBTSVYgdGVzdHMuCisgICAgYm9vbCBzeW1ib2xpY1JESVZ0ZXN0KGNvbnN0IFNDRVYgKlNyY0NvZWZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpEc3RDb2VmZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqU3JjQ29uc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkRzdENvbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpTcmNMb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpEc3RMb29wKSBjb25zdDsKKworICAgIC8vLyBnY2RNSVZ0ZXN0IC0gVGVzdHMgYW4gTUlWIHN1YnNjcmlwdCBwYWlyIGZvciBkZXBlbmRlbmNlLgorICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgYW55IHBvc3NpYmxlIGRlcGVuZGVuY2UgaXMgZGlzcHJvdmVkLgorICAgIC8vLyBNYXJrcyB0aGUgcmVzdWx0IGFzIGluY29uc2lzdGVudC4KKyAgICAvLy8gQ2FuIHNvbWV0aW1lcyBkaXNwcm92ZSB0aGUgZXF1YWwgZGlyZWN0aW9uIGZvciAxIG9yIG1vcmUgbG9vcHMuCisgICAgLy8gIENhbiBoYW5kbGUgc29tZSBzeW1ib2xpY3MgdGhhdCBldmVuIHRoZSBTSVYgdGVzdHMgZG9uJ3QgZ2V0LAorICAgIC8vLyBzbyB3ZSB1c2UgaXQgYXMgYSBiYWNrdXAgZm9yIGV2ZXJ5dGhpbmcuCisgICAgYm9vbCBnY2RNSVZ0ZXN0KGNvbnN0IFNDRVYgKlNyYywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRHN0LAorICAgICAgICAgICAgICAgICAgICBGdWxsRGVwZW5kZW5jZSAmUmVzdWx0KSBjb25zdDsKKworICAgIC8vLyBiYW5lcmplZU1JVnRlc3QgLSBUZXN0cyBhbiBNSVYgc3Vic2NyaXB0IHBhaXIgZm9yIGRlcGVuZGVuY2UuCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgcG9zc2libGUgZGVwZW5kZW5jZSBpcyBkaXNwcm92ZWQuCisgICAgLy8vIE1hcmtzIHRoZSByZXN1bHQgYXMgaW5jb25zaXN0ZW50LgorICAgIC8vLyBDb21wdXRlcyBkaXJlY3Rpb25zLgorICAgIGJvb2wgYmFuZXJqZWVNSVZ0ZXN0KGNvbnN0IFNDRVYgKlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxCaXRWZWN0b3IgJkxvb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bGxEZXBlbmRlbmNlICZSZXN1bHQpIGNvbnN0OworCisgICAgLy8vIGNvbGxlY3RDb2VmZmljaWVudEluZm8gLSBXYWxrcyB0aHJvdWdoIHRoZSBzdWJzY3JpcHQsCisgICAgLy8vIGNvbGxlY3RpbmcgZWFjaCBjb2VmZmljaWVudCwgdGhlIGFzc29jaWF0ZWQgbG9vcCBib3VuZHMsCisgICAgLy8vIGFuZCByZWNvcmRpbmcgaXRzIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBwYXJ0cyBmb3IgbGF0ZXIgdXNlLgorICAgIENvZWZmaWNpZW50SW5mbyAqY29sbGVjdENvZWZmSW5mbyhjb25zdCBTQ0VWICpTdWJzY3JpcHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU3JjRmxhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqJkNvbnN0YW50KSBjb25zdDsKKworICAgIC8vLyBnZXRQb3NpdGl2ZVBhcnQgLSBYXisgPSBtYXgoWCwgMCkuCisgICAgLy8vCisgICAgY29uc3QgU0NFViAqZ2V0UG9zaXRpdmVQYXJ0KGNvbnN0IFNDRVYgKlgpIGNvbnN0OworCisgICAgLy8vIGdldE5lZ2F0aXZlUGFydCAtIFheLSA9IG1pbihYLCAwKS4KKyAgICAvLy8KKyAgICBjb25zdCBTQ0VWICpnZXROZWdhdGl2ZVBhcnQoY29uc3QgU0NFViAqWCkgY29uc3Q7CisKKyAgICAvLy8gZ2V0TG93ZXJCb3VuZCAtIExvb2tzIHRocm91Z2ggYWxsIHRoZSBib3VuZHMgaW5mbyBhbmQKKyAgICAvLy8gY29tcHV0ZXMgdGhlIGxvd2VyIGJvdW5kIGdpdmVuIHRoZSBjdXJyZW50IGRpcmVjdGlvbiBzZXR0aW5ncworICAgIC8vLyBhdCBlYWNoIGxldmVsLgorICAgIGNvbnN0IFNDRVYgKmdldExvd2VyQm91bmQoQm91bmRJbmZvICpCb3VuZCkgY29uc3Q7CisKKyAgICAvLy8gZ2V0VXBwZXJCb3VuZCAtIExvb2tzIHRocm91Z2ggYWxsIHRoZSBib3VuZHMgaW5mbyBhbmQKKyAgICAvLy8gY29tcHV0ZXMgdGhlIHVwcGVyIGJvdW5kIGdpdmVuIHRoZSBjdXJyZW50IGRpcmVjdGlvbiBzZXR0aW5ncworICAgIC8vLyBhdCBlYWNoIGxldmVsLgorICAgIGNvbnN0IFNDRVYgKmdldFVwcGVyQm91bmQoQm91bmRJbmZvICpCb3VuZCkgY29uc3Q7CisKKyAgICAvLy8gZXhwbG9yZURpcmVjdGlvbnMgLSBIaWVyYXJjaGljYWxseSBleHBhbmRzIHRoZSBkaXJlY3Rpb24gdmVjdG9yCisgICAgLy8vIHNlYXJjaCBzcGFjZSwgY29tYmluaW5nIHRoZSBkaXJlY3Rpb25zIG9mIGRpc2NvdmVyZWQgZGVwZW5kZW5jZXMKKyAgICAvLy8gaW4gdGhlIERpclNldCBmaWVsZCBvZiBCb3VuZC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRpc3RpbmN0CisgICAgLy8vIGRlcGVuZGVuY2VzIGRpc2NvdmVyZWQuIElmIHRoZSBkZXBlbmRlbmNlIGlzIGRpc3Byb3ZlZCwKKyAgICAvLy8gaXQgd2lsbCByZXR1cm4gMC4KKyAgICB1bnNpZ25lZCBleHBsb3JlRGlyZWN0aW9ucyh1bnNpZ25lZCBMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2VmZmljaWVudEluZm8gKkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29lZmZpY2llbnRJbmZvICpCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kSW5mbyAqQm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxCaXRWZWN0b3IgJkxvb3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEZXB0aEV4cGFuZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkRlbHRhKSBjb25zdDsKKworICAgIC8vLyB0ZXN0Qm91bmRzIC0gUmV0dXJucyB0cnVlIGlmZiB0aGUgY3VycmVudCBib3VuZHMgYXJlIHBsYXVzaWJsZS4KKyAgICBib29sIHRlc3RCb3VuZHModW5zaWduZWQgY2hhciBEaXJLaW5kLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgQm91bmRJbmZvICpCb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRGVsdGEpIGNvbnN0OworCisgICAgLy8vIGZpbmRCb3VuZHNBTEwgLSBDb21wdXRlcyB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyBmb3IgbGV2ZWwgSworICAgIC8vLyB1c2luZyB0aGUgKiBkaXJlY3Rpb24uIFJlY29yZHMgdGhlbSBpbiBCb3VuZC4KKyAgICB2b2lkIGZpbmRCb3VuZHNBTEwoQ29lZmZpY2llbnRJbmZvICpBLAorICAgICAgICAgICAgICAgICAgICAgICBDb2VmZmljaWVudEluZm8gKkIsCisgICAgICAgICAgICAgICAgICAgICAgIEJvdW5kSW5mbyAqQm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEspIGNvbnN0OworCisgICAgLy8vIGZpbmRCb3VuZHNMVCAtIENvbXB1dGVzIHRoZSB1cHBlciBhbmQgbG93ZXIgYm91bmRzIGZvciBsZXZlbCBLCisgICAgLy8vIHVzaW5nIHRoZSA8IGRpcmVjdGlvbi4gUmVjb3JkcyB0aGVtIGluIEJvdW5kLgorICAgIHZvaWQgZmluZEJvdW5kc0xUKENvZWZmaWNpZW50SW5mbyAqQSwKKyAgICAgICAgICAgICAgICAgICAgICBDb2VmZmljaWVudEluZm8gKkIsCisgICAgICAgICAgICAgICAgICAgICAgQm91bmRJbmZvICpCb3VuZCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBLKSBjb25zdDsKKworICAgIC8vLyBmaW5kQm91bmRzR1QgLSBDb21wdXRlcyB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyBmb3IgbGV2ZWwgSworICAgIC8vLyB1c2luZyB0aGUgPiBkaXJlY3Rpb24uIFJlY29yZHMgdGhlbSBpbiBCb3VuZC4KKyAgICB2b2lkIGZpbmRCb3VuZHNHVChDb2VmZmljaWVudEluZm8gKkEsCisgICAgICAgICAgICAgICAgICAgICAgQ29lZmZpY2llbnRJbmZvICpCLAorICAgICAgICAgICAgICAgICAgICAgIEJvdW5kSW5mbyAqQm91bmQsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSykgY29uc3Q7CisKKyAgICAvLy8gZmluZEJvdW5kc0VRIC0gQ29tcHV0ZXMgdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgZm9yIGxldmVsIEsKKyAgICAvLy8gdXNpbmcgdGhlID0gZGlyZWN0aW9uLiBSZWNvcmRzIHRoZW0gaW4gQm91bmQuCisgICAgdm9pZCBmaW5kQm91bmRzRVEoQ29lZmZpY2llbnRJbmZvICpBLAorICAgICAgICAgICAgICAgICAgICAgIENvZWZmaWNpZW50SW5mbyAqQiwKKyAgICAgICAgICAgICAgICAgICAgICBCb3VuZEluZm8gKkJvdW5kLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEspIGNvbnN0OworCisgICAgLy8vIGludGVyc2VjdENvbnN0cmFpbnRzIC0gVXBkYXRlcyBYIHdpdGggdGhlIGludGVyc2VjdGlvbgorICAgIC8vLyBvZiB0aGUgQ29uc3RyYWludHMgWCBhbmQgWS4gUmV0dXJucyB0cnVlIGlmIFggaGFzIGNoYW5nZWQuCisgICAgYm9vbCBpbnRlcnNlY3RDb25zdHJhaW50cyhDb25zdHJhaW50ICpYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29uc3RyYWludCAqWSk7CisKKyAgICAvLy8gcHJvcGFnYXRlIC0gUmV2aWV3IHRoZSBjb25zdHJhaW50cywgbG9va2luZyBmb3Igb3Bwb3J0dW5pdGllcworICAgIC8vLyB0byBzaW1wbGlmeSBhIHN1YnNjcmlwdCBwYWlyIChTcmMgYW5kIERzdCkuCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHNvbWUgc2ltcGxpZmljYXRpb24gb2NjdXJzLgorICAgIC8vLyBJZiB0aGUgc2ltcGxpZmljYXRpb24gaXNuJ3QgZXhhY3QgKHRoYXQgaXMsIGlmIGl0IGlzIGNvbnNlcnZhdGl2ZQorICAgIC8vLyBpbiB0ZXJtcyBvZiBkZXBlbmRlbmNlKSwgc2V0IGNvbnNpc3RlbnQgdG8gZmFsc2UuCisgICAgYm9vbCBwcm9wYWdhdGUoY29uc3QgU0NFViAqJlNyYywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWIComRHN0LAorICAgICAgICAgICAgICAgICAgIFNtYWxsQml0VmVjdG9yICZMb29wcywKKyAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Q29uc3RyYWludD4gJkNvbnN0cmFpbnRzLAorICAgICAgICAgICAgICAgICAgIGJvb2wgJkNvbnNpc3RlbnQpOworCisgICAgLy8vIHByb3BhZ2F0ZURpc3RhbmNlIC0gQXR0ZW1wdCB0byBwcm9wYWdhdGUgYSBkaXN0YW5jZQorICAgIC8vLyBjb25zdHJhaW50IGludG8gYSBzdWJzY3JpcHQgcGFpciAoU3JjIGFuZCBEc3QpLgorICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBzb21lIHNpbXBsaWZpY2F0aW9uIG9jY3Vycy4KKyAgICAvLy8gSWYgdGhlIHNpbXBsaWZpY2F0aW9uIGlzbid0IGV4YWN0ICh0aGF0IGlzLCBpZiBpdCBpcyBjb25zZXJ2YXRpdmUKKyAgICAvLy8gaW4gdGVybXMgb2YgZGVwZW5kZW5jZSksIHNldCBjb25zaXN0ZW50IHRvIGZhbHNlLgorICAgIGJvb2wgcHJvcGFnYXRlRGlzdGFuY2UoY29uc3QgU0NFViAqJlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKiZEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50ICZDdXJDb25zdHJhaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmQ29uc2lzdGVudCk7CisKKyAgICAvLy8gcHJvcGFnYXRlUG9pbnQgLSBBdHRlbXB0IHRvIHByb3BhZ2F0ZSBhIHBvaW50CisgICAgLy8vIGNvbnN0cmFpbnQgaW50byBhIHN1YnNjcmlwdCBwYWlyIChTcmMgYW5kIERzdCkuCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHNvbWUgc2ltcGxpZmljYXRpb24gb2NjdXJzLgorICAgIGJvb2wgcHJvcGFnYXRlUG9pbnQoY29uc3QgU0NFViAqJlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKiZEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBDb25zdHJhaW50ICZDdXJDb25zdHJhaW50KTsKKworICAgIC8vLyBwcm9wYWdhdGVMaW5lIC0gQXR0ZW1wdCB0byBwcm9wYWdhdGUgYSBsaW5lCisgICAgLy8vIGNvbnN0cmFpbnQgaW50byBhIHN1YnNjcmlwdCBwYWlyIChTcmMgYW5kIERzdCkuCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHNvbWUgc2ltcGxpZmljYXRpb24gb2NjdXJzLgorICAgIC8vLyBJZiB0aGUgc2ltcGxpZmljYXRpb24gaXNuJ3QgZXhhY3QgKHRoYXQgaXMsIGlmIGl0IGlzIGNvbnNlcnZhdGl2ZQorICAgIC8vLyBpbiB0ZXJtcyBvZiBkZXBlbmRlbmNlKSwgc2V0IGNvbnNpc3RlbnQgdG8gZmFsc2UuCisgICAgYm9vbCBwcm9wYWdhdGVMaW5lKGNvbnN0IFNDRVYgKiZTcmMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKiZEc3QsCisgICAgICAgICAgICAgICAgICAgICAgIENvbnN0cmFpbnQgJkN1ckNvbnN0cmFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkNvbnNpc3RlbnQpOworCisgICAgLy8vIGZpbmRDb2VmZmljaWVudCAtIEdpdmVuIGEgbGluZWFyIFNDRVYsCisgICAgLy8vIHJldHVybiB0aGUgY29lZmZpY2llbnQgY29ycmVzcG9uZGluZyB0byBzcGVjaWZpZWQgbG9vcC4KKyAgICAvLy8gSWYgdGhlcmUgaXNuJ3Qgb25lLCByZXR1cm4gdGhlIFNDRVYgY29uc3RhbnQgMC4KKyAgICAvLy8gRm9yIGV4YW1wbGUsIGdpdmVuIGEqaSArIGIqaiArIGMqaywgcmV0dXJuaW5nIHRoZSBjb2VmZmljaWVudAorICAgIC8vLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBqIGxvb3Agd291bGQgeWllbGQgYi4KKyAgICBjb25zdCBTQ0VWICpmaW5kQ29lZmZpY2llbnQoY29uc3QgU0NFViAqRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqVGFyZ2V0TG9vcCkgY29uc3Q7CisKKyAgICAvLy8gemVyb0NvZWZmaWNpZW50IC0gR2l2ZW4gYSBsaW5lYXIgU0NFViwKKyAgICAvLy8gcmV0dXJuIHRoZSBTQ0VWIGdpdmVuIGJ5IHplcm9pbmcgb3V0IHRoZSBjb2VmZmljaWVudAorICAgIC8vLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgbG9vcC4KKyAgICAvLy8gRm9yIGV4YW1wbGUsIGdpdmVuIGEqaSArIGIqaiArIGMqaywgemVyb2luZyB0aGUgY29lZmZpY2llbnQKKyAgICAvLy8gY29ycmVzcG9uZGluZyB0byB0aGUgaiBsb29wIHdvdWxkIHlpZWxkIGEqaSArIGMqay4KKyAgICBjb25zdCBTQ0VWICp6ZXJvQ29lZmZpY2llbnQoY29uc3QgU0NFViAqRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqVGFyZ2V0TG9vcCkgY29uc3Q7CisKKyAgICAvLy8gYWRkVG9Db2VmZmljaWVudCAtIEdpdmVuIGEgbGluZWFyIFNDRVYgRXhwciwKKyAgICAvLy8gcmV0dXJuIHRoZSBTQ0VWIGdpdmVuIGJ5IGFkZGluZyBzb21lIFZhbHVlIHRvIHRoZQorICAgIC8vLyBjb2VmZmljaWVudCBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgVGFyZ2V0TG9vcC4KKyAgICAvLy8gRm9yIGV4YW1wbGUsIGdpdmVuIGEqaSArIGIqaiArIGMqaywgYWRkaW5nIDEgdG8gdGhlIGNvZWZmaWNpZW50CisgICAgLy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGogbG9vcCB3b3VsZCB5aWVsZCBhKmkgKyAoYisxKSpqICsgYyprLgorICAgIGNvbnN0IFNDRVYgKmFkZFRvQ29lZmZpY2llbnQoY29uc3QgU0NFViAqRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKlRhcmdldExvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpWYWx1ZSkgIGNvbnN0OworCisgICAgLy8vIHVwZGF0ZURpcmVjdGlvbiAtIFVwZGF0ZSBkaXJlY3Rpb24gdmVjdG9yIGVudHJ5CisgICAgLy8vIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNvbnN0cmFpbnQuCisgICAgdm9pZCB1cGRhdGVEaXJlY3Rpb24oRGVwZW5kZW5jZTo6RFZFbnRyeSAmTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29uc3RyYWludCAmQ3VyQ29uc3RyYWludCkgY29uc3Q7CisKKyAgICBib29sIHRyeURlbGluZWFyaXplKEluc3RydWN0aW9uICpTcmMsIEluc3RydWN0aW9uICpEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U3Vic2NyaXB0PiAmUGFpcik7CisgIH07IC8vIGNsYXNzIERlcGVuZGVuY2VJbmZvCisKKyAgLy8vIFxicmllZiBBbmFseXNpc1Bhc3MgdG8gY29tcHV0ZSBkZXBlbmRlbmNlIGluZm9ybWF0aW9uIGluIGEgZnVuY3Rpb24KKyAgY2xhc3MgRGVwZW5kZW5jZUFuYWx5c2lzIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPERlcGVuZGVuY2VBbmFseXNpcz4geworICBwdWJsaWM6CisgICAgdHlwZWRlZiBEZXBlbmRlbmNlSW5mbyBSZXN1bHQ7CisgICAgUmVzdWx0IHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkZBTSk7CisKKyAgcHJpdmF0ZToKKyAgICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworICAgIGZyaWVuZCBzdHJ1Y3QgQW5hbHlzaXNJbmZvTWl4aW48RGVwZW5kZW5jZUFuYWx5c2lzPjsKKyAgfTsgLy8gY2xhc3MgRGVwZW5kZW5jZUFuYWx5c2lzCisKKyAgLy8vIFxicmllZiBMZWdhY3kgcGFzcyBtYW5hZ2VyIHBhc3MgdG8gYWNjZXNzIGRlcGVuZGVuY2UgaW5mb3JtYXRpb24KKyAgY2xhc3MgRGVwZW5kZW5jZUFuYWx5c2lzV3JhcHBlclBhc3MgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOyAvLyBDbGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpbmZvCisgICAgRGVwZW5kZW5jZUFuYWx5c2lzV3JhcHBlclBhc3MoKSA6IEZ1bmN0aW9uUGFzcyhJRCkgeworICAgICAgaW5pdGlhbGl6ZURlcGVuZGVuY2VBbmFseXNpc1dyYXBwZXJQYXNzUGFzcygKKyAgICAgICAgICAqUGFzc1JlZ2lzdHJ5OjpnZXRQYXNzUmVnaXN0cnkoKSk7CisgICAgfQorCisgICAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSBvdmVycmlkZTsKKyAgICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZTsKKyAgICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmKSBjb25zdCBvdmVycmlkZTsKKyAgICB2b2lkIHByaW50KHJhd19vc3RyZWFtICYsIGNvbnN0IE1vZHVsZSAqID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7CisgICAgRGVwZW5kZW5jZUluZm8gJmdldERJKCkgY29uc3Q7CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RGVwZW5kZW5jZUluZm8+IGluZm87CisgIH07IC8vIGNsYXNzIERlcGVuZGVuY2VBbmFseXNpc1dyYXBwZXJQYXNzCisKKyAgLy8vIGNyZWF0ZURlcGVuZGVuY2VBbmFseXNpc1Bhc3MgLSBUaGlzIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlCisgIC8vLyBEZXBlbmRlbmNlQW5hbHlzaXMgd3JhcHBlciBwYXNzLgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZURlcGVuZGVuY2VBbmFseXNpc1dyYXBwZXJQYXNzKCk7CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0RpdmVyZ2VuY2VBbmFseXNpcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9EaXZlcmdlbmNlQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDNjNjhlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9EaXZlcmdlbmNlQW5hbHlzaXMuaApAQCAtMCwwICsxLDUyIEBACisvLz09PS0gbGx2bS9BbmFseXNpcy9EaXZlcmdlbmNlQW5hbHlzaXMuaCAtIERpdmVyZ2VuY2UgQW5hbHlzaXMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoZSBkaXZlcmdlbmNlIGFuYWx5c2lzIGlzIGFuIExMVk0gcGFzcyB3aGljaCBjYW4gYmUgdXNlZCB0byBmaW5kIG91dAorLy8gaWYgYSBicmFuY2ggaW5zdHJ1Y3Rpb24gaW4gYSBHUFUgcHJvZ3JhbSBpcyBkaXZlcmdlbnQgb3Igbm90LiBJdCBjYW4gaGVscAorLy8gYnJhbmNoIG9wdGltaXphdGlvbnMgc3VjaCBhcyBqdW1wIHRocmVhZGluZyBhbmQgbG9vcCB1bnN3aXRjaGluZyB0byBtYWtlCisvLyBiZXR0ZXIgZGVjaXNpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfRElWRVJHRU5DRV9BTkFMWVNJU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfRElWRVJHRU5DRV9BTkFMWVNJU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgVmFsdWU7CitjbGFzcyBEaXZlcmdlbmNlQW5hbHlzaXMgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgRGl2ZXJnZW5jZUFuYWx5c2lzKCkgOiBGdW5jdGlvblBhc3MoSUQpIHsKKyAgICBpbml0aWFsaXplRGl2ZXJnZW5jZUFuYWx5c2lzUGFzcygqUGFzc1JlZ2lzdHJ5OjpnZXRQYXNzUmVnaXN0cnkoKSk7CisgIH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgb3ZlcnJpZGU7CisKKyAgLy8gUHJpbnQgYWxsIGRpdmVyZ2VudCBicmFuY2hlcyBpbiB0aGUgZnVuY3Rpb24uCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNb2R1bGUgKikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIFYgaXMgZGl2ZXJnZW50LgorICBib29sIGlzRGl2ZXJnZW50KGNvbnN0IFZhbHVlICpWKSBjb25zdCB7IHJldHVybiBEaXZlcmdlbnRWYWx1ZXMuY291bnQoVik7IH0KKworICAvLyBSZXR1cm5zIHRydWUgaWYgViBpcyB1bmlmb3JtL25vbi1kaXZlcmdlbnQuCisgIGJvb2wgaXNVbmlmb3JtKGNvbnN0IFZhbHVlICpWKSBjb25zdCB7IHJldHVybiAhaXNEaXZlcmdlbnQoVik7IH0KKworcHJpdmF0ZToKKyAgLy8gU3RvcmVzIGFsbCBkaXZlcmdlbnQgdmFsdWVzLgorICBEZW5zZVNldDxjb25zdCBWYWx1ZSAqPiBEaXZlcmdlbnRWYWx1ZXM7Cit9OworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmIC8vTExWTV9BTkFMWVNJU19ESVZFUkdFTkNFX0FOQUxZU0lTX0gKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0RvbVByaW50ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRG9tUHJpbnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlZDI4OTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0RvbVByaW50ZXIuaApAQCAtMCwwICsxLDMwIEBACisvLz09PS0tIERvbVByaW50ZXIuaCAtIERvbSBwcmludGVyIGV4dGVybmFsIGludGVyZmFjZSAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBleHRlcm5hbCBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgY2FsbGVkIHRvIGV4cGxpY2l0bHkKKy8vIGluc3RhbnRpYXRlIHRoZSBkb21pbmFuY2UgdHJlZSBwcmludGVyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19ET01QUklOVEVSX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19ET01QUklOVEVSX0gKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBGdW5jdGlvblBhc3M7CisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlRG9tUHJpbnRlclBhc3MoKTsKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVEb21Pbmx5UHJpbnRlclBhc3MoKTsKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVEb21WaWV3ZXJQYXNzKCk7CisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlRG9tT25seVZpZXdlclBhc3MoKTsKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVQb3N0RG9tUHJpbnRlclBhc3MoKTsKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVQb3N0RG9tT25seVByaW50ZXJQYXNzKCk7CisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlUG9zdERvbVZpZXdlclBhc3MoKTsKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVQb3N0RG9tT25seVZpZXdlclBhc3MoKTsKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Eb21pbmFuY2VGcm9udGllci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Eb21pbmFuY2VGcm9udGllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzMDRkZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0RvbWluYW5jZUZyb250aWVyLmgKQEAgLTAsMCArMSwyMTAgQEAKKy8vPT09LSBsbHZtL0FuYWx5c2lzL0RvbWluYW5jZUZyb250aWVyLmggLSBEb21pbmF0b3IgRnJvbnRpZXJzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIERvbWluYW5jZUZyb250aWVyIGNsYXNzLCB3aGljaCBjYWxjdWxhdGUgYW5kIGhvbGRzIHRoZQorLy8gZG9taW5hbmNlIGZyb250aWVyIGZvciBhIGZ1bmN0aW9uLgorLy8KKy8vIFRoaXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgZGVwcmVjYXRlZCwgZG9uJ3QgYWRkIGFueSBtb3JlIHVzZXMgb2YgdGhpcyBkYXRhCisvLyBzdHJ1Y3R1cmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0RPTUlOQU5DRUZST05USUVSX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19ET01JTkFOQ0VGUk9OVElFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvR2VuZXJpY0RvbVRyZWUuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CitjbGFzcyByYXdfb3N0cmVhbTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBEb21pbmFuY2VGcm9udGllckJhc2UgLSBDb21tb24gYmFzZSBjbGFzcyBmb3IgY29tcHV0aW5nIGZvcndhcmQgYW5kIGludmVyc2UKKy8vLyBkb21pbmFuY2UgZnJvbnRpZXJzIGZvciBhIGZ1bmN0aW9uLgorLy8vCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBib29sIElzUG9zdERvbT4KK2NsYXNzIERvbWluYW5jZUZyb250aWVyQmFzZSB7CitwdWJsaWM6CisgIHVzaW5nIERvbVNldFR5cGUgPSBzdGQ6OnNldDxCbG9ja1QgKj47ICAgICAgICAgICAgICAgIC8vIERvbSBzZXQgZm9yIGEgYmIKKyAgdXNpbmcgRG9tU2V0TWFwVHlwZSA9IHN0ZDo6bWFwPEJsb2NrVCAqLCBEb21TZXRUeXBlPjsgLy8gRG9tIHNldCBtYXAKKworcHJvdGVjdGVkOgorICB1c2luZyBCbG9ja1RyYWl0cyA9IEdyYXBoVHJhaXRzPEJsb2NrVCAqPjsKKworICBEb21TZXRNYXBUeXBlIEZyb250aWVyczsKKyAgLy8gUG9zdGRvbWluYXRvcnMgY2FuIGhhdmUgbXVsdGlwbGUgcm9vdHMuCisgIFNtYWxsVmVjdG9yPEJsb2NrVCAqLCBJc1Bvc3REb20gPyA0IDogMT4gUm9vdHM7CisgIHN0YXRpYyBjb25zdGV4cHIgYm9vbCBJc1Bvc3REb21pbmF0b3JzID0gSXNQb3N0RG9tOworCitwdWJsaWM6CisgIERvbWluYW5jZUZyb250aWVyQmFzZSgpID0gZGVmYXVsdDsKKworICAvLy8gZ2V0Um9vdHMgLSBSZXR1cm4gdGhlIHJvb3QgYmxvY2tzIG9mIHRoZSBjdXJyZW50IENGRy4gIFRoaXMgbWF5IGluY2x1ZGUKKyAgLy8vIG11bHRpcGxlIGJsb2NrcyBpZiB3ZSBhcmUgY29tcHV0aW5nIHBvc3QgZG9taW5hdG9ycy4gIEZvciBmb3J3YXJkCisgIC8vLyBkb21pbmF0b3JzLCB0aGlzIHdpbGwgYWx3YXlzIGJlIGEgc2luZ2xlIGJsb2NrICh0aGUgZW50cnkgbm9kZSkuCisgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxCbG9ja1QgKj4gJmdldFJvb3RzKCkgY29uc3QgeyByZXR1cm4gUm9vdHM7IH0KKworICBCbG9ja1QgKmdldFJvb3QoKSBjb25zdCB7CisgICAgYXNzZXJ0KFJvb3RzLnNpemUoKSA9PSAxICYmICJTaG91bGQgYWx3YXlzIGhhdmUgZW50cnkgbm9kZSEiKTsKKyAgICByZXR1cm4gUm9vdHNbMF07CisgIH0KKworICAvLy8gaXNQb3N0RG9taW5hdG9yIC0gUmV0dXJucyB0cnVlIGlmIGFuYWx5c2lzIGJhc2VkIG9mIHBvc3Rkb21zCisgIGJvb2wgaXNQb3N0RG9taW5hdG9yKCkgY29uc3QgeworICAgIHJldHVybiBJc1Bvc3REb21pbmF0b3JzOworICB9CisKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgeworICAgIEZyb250aWVycy5jbGVhcigpOworICB9CisKKyAgLy8gQWNjZXNzb3IgaW50ZXJmYWNlOgorICB1c2luZyBpdGVyYXRvciA9IHR5cGVuYW1lIERvbVNldE1hcFR5cGU6Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IHR5cGVuYW1lIERvbVNldE1hcFR5cGU6OmNvbnN0X2l0ZXJhdG9yOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gRnJvbnRpZXJzLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBGcm9udGllcnMuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBGcm9udGllcnMuZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gRnJvbnRpZXJzLmVuZCgpOyB9CisgIGl0ZXJhdG9yIGZpbmQoQmxvY2tUICpCKSB7IHJldHVybiBGcm9udGllcnMuZmluZChCKTsgfQorICBjb25zdF9pdGVyYXRvciBmaW5kKEJsb2NrVCAqQikgY29uc3QgeyByZXR1cm4gRnJvbnRpZXJzLmZpbmQoQik7IH0KKworICBpdGVyYXRvciBhZGRCYXNpY0Jsb2NrKEJsb2NrVCAqQkIsIGNvbnN0IERvbVNldFR5cGUgJmZyb250aWVyKSB7CisgICAgYXNzZXJ0KGZpbmQoQkIpID09IGVuZCgpICYmICJCbG9jayBhbHJlYWR5IGluIERvbWluYW5jZUZyb250aWVyISIpOworICAgIHJldHVybiBGcm9udGllcnMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKEJCLCBmcm9udGllcikpLmZpcnN0OworICB9CisKKyAgLy8vIHJlbW92ZUJsb2NrIC0gUmVtb3ZlIGJhc2ljIGJsb2NrIEJCJ3MgZnJvbnRpZXIuCisgIHZvaWQgcmVtb3ZlQmxvY2soQmxvY2tUICpCQik7CisKKyAgdm9pZCBhZGRUb0Zyb250aWVyKGl0ZXJhdG9yIEksIEJsb2NrVCAqTm9kZSk7CisKKyAgdm9pZCByZW1vdmVGcm9tRnJvbnRpZXIoaXRlcmF0b3IgSSwgQmxvY2tUICpOb2RlKTsKKworICAvLy8gY29tcGFyZURvbVNldCAtIFJldHVybiBmYWxzZSBpZiB0d28gZG9tc2V0cyBtYXRjaC4gT3RoZXJ3aXNlCisgIC8vLyByZXR1cm4gdHJ1ZTsKKyAgYm9vbCBjb21wYXJlRG9tU2V0KERvbVNldFR5cGUgJkRTMSwgY29uc3QgRG9tU2V0VHlwZSAmRFMyKSBjb25zdDsKKworICAvLy8gY29tcGFyZSAtIFJldHVybiB0cnVlIGlmIHRoZSBvdGhlciBkb21pbmFuY2UgZnJvbnRpZXIgYmFzZSBtYXRjaGVzCisgIC8vLyB0aGlzIGRvbWluYW5jZSBmcm9udGllciBiYXNlLiBPdGhlcndpc2UgcmV0dXJuIGZhbHNlLgorICBib29sIGNvbXBhcmUoRG9taW5hbmNlRnJvbnRpZXJCYXNlICZPdGhlcikgY29uc3Q7CisKKyAgLy8vIHByaW50IC0gQ29udmVydCB0byBodW1hbiByZWFkYWJsZSBmb3JtCisgIC8vLworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgLy8vIGR1bXAgLSBEdW1wIHRoZSBkb21pbmFuY2UgZnJvbnRpZXIgdG8gZGJncygpLgorI2lmICFkZWZpbmVkKE5ERUJVRykgfHwgZGVmaW5lZChMTFZNX0VOQUJMRV9EVU1QKQorICB2b2lkIGR1bXAoKSBjb25zdDsKKyNlbmRpZgorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8gRG9taW5hbmNlRnJvbnRpZXIgQ2xhc3MgLSBDb25jcmV0ZSBzdWJjbGFzcyBvZiBEb21pbmFuY2VGcm9udGllckJhc2UgdGhhdCBpcworLy8vIHVzZWQgdG8gY29tcHV0ZSBhIGZvcndhcmQgZG9taW5hdG9yIGZyb250aWVycy4KKy8vLwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVD4KK2NsYXNzIEZvcndhcmREb21pbmFuY2VGcm9udGllckJhc2UKKyAgICA6IHB1YmxpYyBEb21pbmFuY2VGcm9udGllckJhc2U8QmxvY2tULCBmYWxzZT4geworcHJpdmF0ZToKKyAgdXNpbmcgQmxvY2tUcmFpdHMgPSBHcmFwaFRyYWl0czxCbG9ja1QgKj47CisKK3B1YmxpYzoKKyAgdXNpbmcgRG9tVHJlZVQgPSBEb21UcmVlQmFzZTxCbG9ja1Q+OworICB1c2luZyBEb21UcmVlTm9kZVQgPSBEb21UcmVlTm9kZUJhc2U8QmxvY2tUPjsKKyAgdXNpbmcgRG9tU2V0VHlwZSA9IHR5cGVuYW1lIERvbWluYW5jZUZyb250aWVyQmFzZTxCbG9ja1QsIGZhbHNlPjo6RG9tU2V0VHlwZTsKKworICB2b2lkIGFuYWx5emUoRG9tVHJlZVQgJkRUKSB7CisgICAgYXNzZXJ0KERULmdldFJvb3RzKCkuc2l6ZSgpID09IDEgJiYKKyAgICAgICAgICAgIk9ubHkgb25lIGVudHJ5IGJsb2NrIGZvciBmb3J3YXJkIGRvbWZyb250cyEiKTsKKyAgICB0aGlzLT5Sb290cyA9IHtEVC5nZXRSb290KCl9OworICAgIGNhbGN1bGF0ZShEVCwgRFRbdGhpcy0+Um9vdHNbMF1dKTsKKyAgfQorCisgIGNvbnN0IERvbVNldFR5cGUgJmNhbGN1bGF0ZShjb25zdCBEb21UcmVlVCAmRFQsIGNvbnN0IERvbVRyZWVOb2RlVCAqTm9kZSk7Cit9OworCitjbGFzcyBEb21pbmFuY2VGcm9udGllciA6IHB1YmxpYyBGb3J3YXJkRG9taW5hbmNlRnJvbnRpZXJCYXNlPEJhc2ljQmxvY2s+IHsKK3B1YmxpYzoKKyAgdXNpbmcgRG9tVHJlZVQgPSBEb21UcmVlQmFzZTxCYXNpY0Jsb2NrPjsKKyAgdXNpbmcgRG9tVHJlZU5vZGVUID0gRG9tVHJlZU5vZGVCYXNlPEJhc2ljQmxvY2s+OworICB1c2luZyBEb21TZXRUeXBlID0gRG9taW5hbmNlRnJvbnRpZXJCYXNlPEJhc2ljQmxvY2ssIGZhbHNlPjo6RG9tU2V0VHlwZTsKKyAgdXNpbmcgaXRlcmF0b3IgPSBEb21pbmFuY2VGcm9udGllckJhc2U8QmFzaWNCbG9jaywgZmFsc2U+OjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPQorICAgICAgRG9taW5hbmNlRnJvbnRpZXJCYXNlPEJhc2ljQmxvY2ssIGZhbHNlPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgLy8vIEhhbmRsZSBpbnZhbGlkYXRpb24gZXhwbGljaXRseS4KKyAgYm9vbCBpbnZhbGlkYXRlKEZ1bmN0aW9uICZGLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmUEEsCisgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlcjo6SW52YWxpZGF0b3IgJik7Cit9OworCitjbGFzcyBEb21pbmFuY2VGcm9udGllcldyYXBwZXJQYXNzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgIERvbWluYW5jZUZyb250aWVyIERGOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIElELCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisKKyAgRG9taW5hbmNlRnJvbnRpZXJXcmFwcGVyUGFzcygpOworCisgIERvbWluYW5jZUZyb250aWVyICZnZXREb21pbmFuY2VGcm9udGllcigpIHsgcmV0dXJuIERGOyB9CisgIGNvbnN0IERvbWluYW5jZUZyb250aWVyICZnZXREb21pbmFuY2VGcm9udGllcigpIGNvbnN0IHsgcmV0dXJuIERGOyAgfQorCisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlOworCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmKSBvdmVycmlkZTsKKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNb2R1bGUgKiA9IG51bGxwdHIpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIERvbWluYW5jZUZyb250aWVyQmFzZTxCYXNpY0Jsb2NrLCBmYWxzZT47CitleHRlcm4gdGVtcGxhdGUgY2xhc3MgRG9taW5hbmNlRnJvbnRpZXJCYXNlPEJhc2ljQmxvY2ssIHRydWU+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIEZvcndhcmREb21pbmFuY2VGcm9udGllckJhc2U8QmFzaWNCbG9jaz47CisKKy8vLyBcYnJpZWYgQW5hbHlzaXMgcGFzcyB3aGljaCBjb21wdXRlcyBhIFxjIERvbWluYW5jZUZyb250aWVyLgorY2xhc3MgRG9taW5hbmNlRnJvbnRpZXJBbmFseXNpcworICAgIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPERvbWluYW5jZUZyb250aWVyQW5hbHlzaXM+IHsKKyAgZnJpZW5kIEFuYWx5c2lzSW5mb01peGluPERvbWluYW5jZUZyb250aWVyQW5hbHlzaXM+OworCisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBQcm92aWRlIHRoZSByZXN1bHQgdHlwZSBmb3IgdGhpcyBhbmFseXNpcyBwYXNzLgorICB1c2luZyBSZXN1bHQgPSBEb21pbmFuY2VGcm9udGllcjsKKworICAvLy8gXGJyaWVmIFJ1biB0aGUgYW5hbHlzaXMgcGFzcyBvdmVyIGEgZnVuY3Rpb24gYW5kIHByb2R1Y2UgYSBkb21pbmF0b3IgdHJlZS4KKyAgRG9taW5hbmNlRnJvbnRpZXIgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIFxicmllZiBQcmludGVyIHBhc3MgZm9yIHRoZSBcYyBEb21pbmFuY2VGcm9udGllci4KK2NsYXNzIERvbWluYW5jZUZyb250aWVyUHJpbnRlclBhc3MKKyAgICA6IHB1YmxpYyBQYXNzSW5mb01peGluPERvbWluYW5jZUZyb250aWVyUHJpbnRlclBhc3M+IHsKKyAgcmF3X29zdHJlYW0gJk9TOworCitwdWJsaWM6CisgIGV4cGxpY2l0IERvbWluYW5jZUZyb250aWVyUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk9TKTsKKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19ET01JTkFOQ0VGUk9OVElFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0RvbWluYW5jZUZyb250aWVySW1wbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Eb21pbmFuY2VGcm9udGllckltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZmZiMmUwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Eb21pbmFuY2VGcm9udGllckltcGwuaApAQCAtMCwwICsxLDIzMSBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvRG9taW5hbmNlRnJvbnRpZXIuaCAtIERvbWluYXRvciBGcm9udGllcnMgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGlzIHRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBEb21pbmFuY2VGcm9udGllciBjbGFzcywgd2hpY2gKKy8vIGNhbGN1bGF0ZSBhbmQgaG9sZHMgdGhlIGRvbWluYW5jZSBmcm9udGllciBmb3IgYSBmdW5jdGlvbiBmb3IuCisvLworLy8gVGhpcyBzaG91bGQgYmUgY29uc2lkZXJlZCBkZXByZWNhdGVkLCBkb24ndCBhZGQgYW55IG1vcmUgdXNlcyBvZiB0aGlzIGRhdGEKKy8vIHN0cnVjdHVyZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfRE9NSU5BTkNFRlJPTlRJRVJJTVBMX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19ET01JTkFOQ0VGUk9OVElFUklNUExfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRG9taW5hbmNlRnJvbnRpZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvR2VuZXJpY0RvbVRyZWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tUPgorY2xhc3MgREZDYWxjdWxhdGVXb3JrT2JqZWN0IHsKK3B1YmxpYzoKKyAgdXNpbmcgRG9tVHJlZU5vZGVUID0gRG9tVHJlZU5vZGVCYXNlPEJsb2NrVD47CisKKyAgREZDYWxjdWxhdGVXb3JrT2JqZWN0KEJsb2NrVCAqQiwgQmxvY2tUICpQLCBjb25zdCBEb21UcmVlTm9kZVQgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21UcmVlTm9kZVQgKlBOKQorICAgICAgOiBjdXJyZW50QkIoQiksIHBhcmVudEJCKFApLCBOb2RlKE4pLCBwYXJlbnROb2RlKFBOKSB7fQorCisgIEJsb2NrVCAqY3VycmVudEJCOworICBCbG9ja1QgKnBhcmVudEJCOworICBjb25zdCBEb21UcmVlTm9kZVQgKk5vZGU7CisgIGNvbnN0IERvbVRyZWVOb2RlVCAqcGFyZW50Tm9kZTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGJvb2wgSXNQb3N0RG9tPgordm9pZCBEb21pbmFuY2VGcm9udGllckJhc2U8QmxvY2tULCBJc1Bvc3REb20+OjpyZW1vdmVCbG9jayhCbG9ja1QgKkJCKSB7CisgIGFzc2VydChmaW5kKEJCKSAhPSBlbmQoKSAmJiAiQmxvY2sgaXMgbm90IGluIERvbWluYW5jZUZyb250aWVyISIpOworICBmb3IgKGl0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKytJKQorICAgIEktPnNlY29uZC5lcmFzZShCQik7CisgIEZyb250aWVycy5lcmFzZShCQik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGJvb2wgSXNQb3N0RG9tPgordm9pZCBEb21pbmFuY2VGcm9udGllckJhc2U8QmxvY2tULCBJc1Bvc3REb20+OjphZGRUb0Zyb250aWVyKGl0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tUICpOb2RlKSB7CisgIGFzc2VydChJICE9IGVuZCgpICYmICJCQiBpcyBub3QgaW4gRG9taW5hbmNlRnJvbnRpZXIhIik7CisgIGFzc2VydChJLT5zZWNvbmQuY291bnQoTm9kZSkgJiYgIk5vZGUgaXMgbm90IGluIERvbWluYW5jZUZyb250aWVyIG9mIEJCIik7CisgIEktPnNlY29uZC5lcmFzZShOb2RlKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgYm9vbCBJc1Bvc3REb20+Cit2b2lkIERvbWluYW5jZUZyb250aWVyQmFzZTxCbG9ja1QsIElzUG9zdERvbT46OnJlbW92ZUZyb21Gcm9udGllcigKKyAgICBpdGVyYXRvciBJLCBCbG9ja1QgKk5vZGUpIHsKKyAgYXNzZXJ0KEkgIT0gZW5kKCkgJiYgIkJCIGlzIG5vdCBpbiBEb21pbmFuY2VGcm9udGllciEiKTsKKyAgYXNzZXJ0KEktPnNlY29uZC5jb3VudChOb2RlKSAmJiAiTm9kZSBpcyBub3QgaW4gRG9taW5hbmNlRnJvbnRpZXIgb2YgQkIiKTsKKyAgSS0+c2Vjb25kLmVyYXNlKE5vZGUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBib29sIElzUG9zdERvbT4KK2Jvb2wgRG9taW5hbmNlRnJvbnRpZXJCYXNlPEJsb2NrVCwgSXNQb3N0RG9tPjo6Y29tcGFyZURvbVNldCgKKyAgICBEb21TZXRUeXBlICZEUzEsIGNvbnN0IERvbVNldFR5cGUgJkRTMikgY29uc3QgeworICBzdGQ6OnNldDxCbG9ja1QgKj4gdG1wU2V0OworICBmb3IgKEJsb2NrVCAqQkIgOiBEUzIpCisgICAgdG1wU2V0Lmluc2VydChCQik7CisKKyAgZm9yICh0eXBlbmFtZSBEb21TZXRUeXBlOjpjb25zdF9pdGVyYXRvciBJID0gRFMxLmJlZ2luKCksIEUgPSBEUzEuZW5kKCk7CisgICAgICAgSSAhPSBFOykgeworICAgIEJsb2NrVCAqTm9kZSA9ICpJKys7CisKKyAgICBpZiAodG1wU2V0LmVyYXNlKE5vZGUpID09IDApCisgICAgICAvLyBOb2RlIGlzIGluIERTMSBidXQgdG5vdCBpbiBEUzIuCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIGlmICghdG1wU2V0LmVtcHR5KCkpIHsKKyAgICAvLyBUaGVyZSBhcmUgbm9kZXMgdGhhdCBhcmUgaW4gRFMyIGJ1dCBub3QgaW4gRFMxLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gRFMxIGFuZCBEUzIgbWF0Y2hlcy4KKyAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBib29sIElzUG9zdERvbT4KK2Jvb2wgRG9taW5hbmNlRnJvbnRpZXJCYXNlPEJsb2NrVCwgSXNQb3N0RG9tPjo6Y29tcGFyZSgKKyAgICBEb21pbmFuY2VGcm9udGllckJhc2U8QmxvY2tULCBJc1Bvc3REb20+ICZPdGhlcikgY29uc3QgeworICBEb21TZXRNYXBUeXBlIHRtcEZyb250aWVyczsKKyAgZm9yICh0eXBlbmFtZSBEb21TZXRNYXBUeXBlOjpjb25zdF9pdGVyYXRvciBJID0gT3RoZXIuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFID0gT3RoZXIuZW5kKCk7CisgICAgICAgSSAhPSBFOyArK0kpCisgICAgdG1wRnJvbnRpZXJzLmluc2VydChzdGQ6Om1ha2VfcGFpcihJLT5maXJzdCwgSS0+c2Vjb25kKSk7CisKKyAgZm9yICh0eXBlbmFtZSBEb21TZXRNYXBUeXBlOjppdGVyYXRvciBJID0gdG1wRnJvbnRpZXJzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IHRtcEZyb250aWVycy5lbmQoKTsKKyAgICAgICBJICE9IEU7KSB7CisgICAgQmxvY2tUICpOb2RlID0gSS0+Zmlyc3Q7CisgICAgY29uc3RfaXRlcmF0b3IgREZJID0gZmluZChOb2RlKTsKKyAgICBpZiAoREZJID09IGVuZCgpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBpZiAoY29tcGFyZURvbVNldChJLT5zZWNvbmQsIERGSS0+c2Vjb25kKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgKytJOworICAgIHRtcEZyb250aWVycy5lcmFzZShOb2RlKTsKKyAgfQorCisgIGlmICghdG1wRnJvbnRpZXJzLmVtcHR5KCkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgcmV0dXJuIGZhbHNlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBib29sIElzUG9zdERvbT4KK3ZvaWQgRG9taW5hbmNlRnJvbnRpZXJCYXNlPEJsb2NrVCwgSXNQb3N0RG9tPjo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIGZvciAoY29uc3RfaXRlcmF0b3IgSSA9IGJlZ2luKCksIEUgPSBlbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICBPUyA8PCAiICBEb21Gcm9udGllciBmb3IgQkIgIjsKKyAgICBpZiAoSS0+Zmlyc3QpCisgICAgICBJLT5maXJzdC0+cHJpbnRBc09wZXJhbmQoT1MsIGZhbHNlKTsKKyAgICBlbHNlCisgICAgICBPUyA8PCAiIDw8ZXhpdCBub2RlPj4iOworICAgIE9TIDw8ICIgaXM6XHQiOworCisgICAgY29uc3Qgc3RkOjpzZXQ8QmxvY2tUICo+ICZCQnMgPSBJLT5zZWNvbmQ7CisKKyAgICBmb3IgKGNvbnN0IEJsb2NrVCAqQkIgOiBCQnMpIHsKKyAgICAgIE9TIDw8ICcgJzsKKyAgICAgIGlmIChCQikKKyAgICAgICAgQkItPnByaW50QXNPcGVyYW5kKE9TLCBmYWxzZSk7CisgICAgICBlbHNlCisgICAgICAgIE9TIDw8ICI8PGV4aXQgbm9kZT4+IjsKKyAgICB9CisgICAgT1MgPDwgJ1xuJzsKKyAgfQorfQorCisjaWYgIWRlZmluZWQoTkRFQlVHKSB8fCBkZWZpbmVkKExMVk1fRU5BQkxFX0RVTVApCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBib29sIElzUG9zdERvbT4KK3ZvaWQgRG9taW5hbmNlRnJvbnRpZXJCYXNlPEJsb2NrVCwgSXNQb3N0RG9tPjo6ZHVtcCgpIGNvbnN0IHsKKyAgcHJpbnQoZGJncygpKTsKK30KKyNlbmRpZgorCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tUPgorY29uc3QgdHlwZW5hbWUgRm9yd2FyZERvbWluYW5jZUZyb250aWVyQmFzZTxCbG9ja1Q+OjpEb21TZXRUeXBlICYKK0ZvcndhcmREb21pbmFuY2VGcm9udGllckJhc2U8QmxvY2tUPjo6Y2FsY3VsYXRlKGNvbnN0IERvbVRyZWVUICZEVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbVRyZWVOb2RlVCAqTm9kZSkgeworICBCbG9ja1QgKkJCID0gTm9kZS0+Z2V0QmxvY2soKTsKKyAgRG9tU2V0VHlwZSAqUmVzdWx0ID0gbnVsbHB0cjsKKworICBzdGQ6OnZlY3RvcjxERkNhbGN1bGF0ZVdvcmtPYmplY3Q8QmxvY2tUPj4gd29ya0xpc3Q7CisgIFNtYWxsUHRyU2V0PEJsb2NrVCAqLCAzMj4gdmlzaXRlZDsKKworICB3b3JrTGlzdC5wdXNoX2JhY2soREZDYWxjdWxhdGVXb3JrT2JqZWN0PEJsb2NrVD4oQkIsIG51bGxwdHIsIE5vZGUsIG51bGxwdHIpKTsKKyAgZG8geworICAgIERGQ2FsY3VsYXRlV29ya09iamVjdDxCbG9ja1Q+ICpjdXJyZW50VyA9ICZ3b3JrTGlzdC5iYWNrKCk7CisgICAgYXNzZXJ0KGN1cnJlbnRXICYmICJNaXNzaW5nIHdvcmsgb2JqZWN0LiIpOworCisgICAgQmxvY2tUICpjdXJyZW50QkIgPSBjdXJyZW50Vy0+Y3VycmVudEJCOworICAgIEJsb2NrVCAqcGFyZW50QkIgPSBjdXJyZW50Vy0+cGFyZW50QkI7CisgICAgY29uc3QgRG9tVHJlZU5vZGVUICpjdXJyZW50Tm9kZSA9IGN1cnJlbnRXLT5Ob2RlOworICAgIGNvbnN0IERvbVRyZWVOb2RlVCAqcGFyZW50Tm9kZSA9IGN1cnJlbnRXLT5wYXJlbnROb2RlOworICAgIGFzc2VydChjdXJyZW50QkIgJiYgIkludmFsaWQgd29yayBvYmplY3QuIE1pc3NpbmcgY3VycmVudCBCYXNpYyBCbG9jayIpOworICAgIGFzc2VydChjdXJyZW50Tm9kZSAmJiAiSW52YWxpZCB3b3JrIG9iamVjdC4gTWlzc2luZyBjdXJyZW50IE5vZGUiKTsKKyAgICBEb21TZXRUeXBlICZTID0gdGhpcy0+RnJvbnRpZXJzW2N1cnJlbnRCQl07CisKKyAgICAvLyBWaXNpdCBlYWNoIGJsb2NrIG9ubHkgb25jZS4KKyAgICBpZiAodmlzaXRlZC5pbnNlcnQoY3VycmVudEJCKS5zZWNvbmQpIHsKKyAgICAgIC8vIExvb3Agb3ZlciBDRkcgc3VjY2Vzc29ycyB0byBjYWxjdWxhdGUgREZsb2NhbFtjdXJyZW50Tm9kZV0KKyAgICAgIGZvciAoY29uc3QgYXV0byBTdWNjIDogY2hpbGRyZW48QmxvY2tUICo+KGN1cnJlbnRCQikpIHsKKyAgICAgICAgLy8gRG9lcyBOb2RlIGltbWVkaWF0ZWx5IGRvbWluYXRlIHRoaXMgc3VjY2Vzc29yPworICAgICAgICBpZiAoRFRbU3VjY10tPmdldElEb20oKSAhPSBjdXJyZW50Tm9kZSkKKyAgICAgICAgICBTLmluc2VydChTdWNjKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBBdCB0aGlzIHBvaW50LCBTIGlzIERGbG9jYWwuICBOb3cgd2UgdW5pb24gaW4gREZ1cCdzIG9mIG91ciBjaGlsZHJlbi4uLgorICAgIC8vIExvb3AgdGhyb3VnaCBhbmQgdmlzaXQgdGhlIG5vZGVzIHRoYXQgTm9kZSBpbW1lZGlhdGVseSBkb21pbmF0ZXMgKE5vZGUncworICAgIC8vIGNoaWxkcmVuIGluIHRoZSBJRG9tVHJlZSkKKyAgICBib29sIHZpc2l0Q2hpbGQgPSBmYWxzZTsKKyAgICBmb3IgKHR5cGVuYW1lIERvbVRyZWVOb2RlVDo6Y29uc3RfaXRlcmF0b3IgTkkgPSBjdXJyZW50Tm9kZS0+YmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkUgPSBjdXJyZW50Tm9kZS0+ZW5kKCk7CisgICAgICAgICBOSSAhPSBORTsgKytOSSkgeworICAgICAgRG9tVHJlZU5vZGVUICpJRG9taW5lZSA9ICpOSTsKKyAgICAgIEJsb2NrVCAqY2hpbGRCQiA9IElEb21pbmVlLT5nZXRCbG9jaygpOworICAgICAgaWYgKHZpc2l0ZWQuY291bnQoY2hpbGRCQikgPT0gMCkgeworICAgICAgICB3b3JrTGlzdC5wdXNoX2JhY2soREZDYWxjdWxhdGVXb3JrT2JqZWN0PEJsb2NrVD4oCisgICAgICAgICAgICBjaGlsZEJCLCBjdXJyZW50QkIsIElEb21pbmVlLCBjdXJyZW50Tm9kZSkpOworICAgICAgICB2aXNpdENoaWxkID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBJZiBhbGwgY2hpbGRyZW4gYXJlIHZpc2l0ZWQgb3IgdGhlcmUgaXMgYW55IGNoaWxkIHRoZW4gcG9wIHRoaXMgYmxvY2sKKyAgICAvLyBmcm9tIHRoZSB3b3JrTGlzdC4KKyAgICBpZiAoIXZpc2l0Q2hpbGQpIHsKKyAgICAgIGlmICghcGFyZW50QkIpIHsKKyAgICAgICAgUmVzdWx0ID0gJlM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICB0eXBlbmFtZSBEb21TZXRUeXBlOjpjb25zdF9pdGVyYXRvciBDREZJID0gUy5iZWdpbigpLCBDREZFID0gUy5lbmQoKTsKKyAgICAgIERvbVNldFR5cGUgJnBhcmVudFNldCA9IHRoaXMtPkZyb250aWVyc1twYXJlbnRCQl07CisgICAgICBmb3IgKDsgQ0RGSSAhPSBDREZFOyArK0NERkkpIHsKKyAgICAgICAgaWYgKCFEVC5wcm9wZXJseURvbWluYXRlcyhwYXJlbnROb2RlLCBEVFsqQ0RGSV0pKQorICAgICAgICAgIHBhcmVudFNldC5pbnNlcnQoKkNERkkpOworICAgICAgfQorICAgICAgd29ya0xpc3QucG9wX2JhY2soKTsKKyAgICB9CisKKyAgfSB3aGlsZSAoIXdvcmtMaXN0LmVtcHR5KCkpOworCisgIHJldHVybiAqUmVzdWx0OworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19ET01JTkFOQ0VGUk9OVElFUklNUExfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9FSFBlcnNvbmFsaXRpZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRUhQZXJzb25hbGl0aWVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmM0NWFiNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvRUhQZXJzb25hbGl0aWVzLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8vPT09LSBFSFBlcnNvbmFsaXRpZXMuaCAtIENvbXB1dGUgRUgtcmVsYXRlZCBpbmZvcm1hdGlvbiAtLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19FSFBFUlNPTkFMSVRJRVNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0VIUEVSU09OQUxJVElFU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1RpbnlQdHJWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBWYWx1ZTsKKworZW51bSBjbGFzcyBFSFBlcnNvbmFsaXR5IHsKKyAgVW5rbm93biwKKyAgR05VX0FkYSwKKyAgR05VX0MsCisgIEdOVV9DX1NqTGosCisgIEdOVV9DWFgsCisgIEdOVV9DWFhfU2pMaiwKKyAgR05VX09iakMsCisgIE1TVkNfWDg2U0VILAorICBNU1ZDX1dpbjY0U0VILAorICBNU1ZDX0NYWCwKKyAgQ29yZUNMUiwKKyAgUnVzdAorfTsKKworLy8vIFxicmllZiBTZWUgaWYgdGhlIGdpdmVuIGV4Y2VwdGlvbiBoYW5kbGluZyBwZXJzb25hbGl0eSBmdW5jdGlvbiBpcyBvbmUKKy8vLyB0aGF0IHdlIHVuZGVyc3RhbmQuICBJZiBzbywgcmV0dXJuIGEgZGVzY3JpcHRpb24gb2YgaXQ7IG90aGVyd2lzZSByZXR1cm4KKy8vLyBVbmtub3duLgorRUhQZXJzb25hbGl0eSBjbGFzc2lmeUVIUGVyc29uYWxpdHkoY29uc3QgVmFsdWUgKlBlcnMpOworCitTdHJpbmdSZWYgZ2V0RUhQZXJzb25hbGl0eU5hbWUoRUhQZXJzb25hbGl0eSBQZXJzKTsKKworRUhQZXJzb25hbGl0eSBnZXREZWZhdWx0RUhQZXJzb25hbGl0eShjb25zdCBUcmlwbGUgJlQpOworCisvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHBlcnNvbmFsaXR5IGZ1bmN0aW9uIGNhdGNoZXMgYXN5bmNocm9ub3VzCisvLy8gZXhjZXB0aW9ucy4KK2lubGluZSBib29sIGlzQXN5bmNocm9ub3VzRUhQZXJzb25hbGl0eShFSFBlcnNvbmFsaXR5IFBlcnMpIHsKKyAgLy8gVGhlIHR3byBTRUggcGVyc29uYWxpdHkgZnVuY3Rpb25zIGNhbiBjYXRjaCBhc3luY2ggZXhjZXB0aW9ucy4gV2UgYXNzdW1lCisgIC8vIHVua25vd24gcGVyc29uYWxpdGllcyBkb24ndCBjYXRjaCBhc3luY2ggZXhjZXB0aW9ucy4KKyAgc3dpdGNoIChQZXJzKSB7CisgIGNhc2UgRUhQZXJzb25hbGl0eTo6TVNWQ19YODZTRUg6CisgIGNhc2UgRUhQZXJzb25hbGl0eTo6TVNWQ19XaW42NFNFSDoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgbGx2bV91bnJlYWNoYWJsZSgiaW52YWxpZCBlbnVtIik7Cit9CisKKy8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBwZXJzb25hbGl0eSBmdW5jdGlvbiB0aGF0IGludm9rZXMKKy8vLyBoYW5kbGVyIGZ1bmNsZXRzICh3aGljaCBtdXN0IHJldHVybiB0byBpdCkuCitpbmxpbmUgYm9vbCBpc0Z1bmNsZXRFSFBlcnNvbmFsaXR5KEVIUGVyc29uYWxpdHkgUGVycykgeworICBzd2l0Y2ggKFBlcnMpIHsKKyAgY2FzZSBFSFBlcnNvbmFsaXR5OjpNU1ZDX0NYWDoKKyAgY2FzZSBFSFBlcnNvbmFsaXR5OjpNU1ZDX1g4NlNFSDoKKyAgY2FzZSBFSFBlcnNvbmFsaXR5OjpNU1ZDX1dpbjY0U0VIOgorICBjYXNlIEVIUGVyc29uYWxpdHk6OkNvcmVDTFI6CisgICAgcmV0dXJuIHRydWU7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGxsdm1fdW5yZWFjaGFibGUoImludmFsaWQgZW51bSIpOworfQorCisvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgcGVyc29uYWxpdHkgbWF5IGJlIHNhZmVseSByZW1vdmVkIGlmIHRoZXJlCisvLy8gYXJlIG5vIGludm9rZSBpbnN0cnVjdGlvbnMgcmVtYWluaW5nIGluIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgoraW5saW5lIGJvb2wgaXNOb09wV2l0aG91dEludm9rZShFSFBlcnNvbmFsaXR5IFBlcnMpIHsKKyAgc3dpdGNoIChQZXJzKSB7CisgIGNhc2UgRUhQZXJzb25hbGl0eTo6VW5rbm93bjoKKyAgICByZXR1cm4gZmFsc2U7CisgIC8vIEFsbCBrbm93biBwZXJzb25hbGl0aWVzIGN1cnJlbnRseSBoYXZlIHRoaXMgYmVoYXZpb3IKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBsbHZtX3VucmVhY2hhYmxlKCJpbnZhbGlkIGVudW0iKTsKK30KKworYm9vbCBjYW5TaW1wbGlmeUludm9rZU5vVW53aW5kKGNvbnN0IEZ1bmN0aW9uICpGKTsKKwordHlwZWRlZiBUaW55UHRyVmVjdG9yPEJhc2ljQmxvY2sgKj4gQ29sb3JWZWN0b3I7CisKKy8vLyBcYnJpZWYgSWYgYW4gRUggZnVuY2xldCBwZXJzb25hbGl0eSBpcyBpbiB1c2UgKHNlZSBpc0Z1bmNsZXRFSFBlcnNvbmFsaXR5KSwKKy8vLyB0aGlzIHdpbGwgcmVjb21wdXRlIHdoaWNoIGJsb2NrcyBhcmUgaW4gd2hpY2ggZnVuY2xldC4gSXQgaXMgcG9zc2libGUgdGhhdAorLy8vIHNvbWUgYmxvY2tzIGFyZSBpbiBtdWx0aXBsZSBmdW5jbGV0cy4gQ29uc2lkZXIgdGhpcyBhbmFseXNpcyB0byBiZQorLy8vIGV4cGVuc2l2ZS4KK0RlbnNlTWFwPEJhc2ljQmxvY2sgKiwgQ29sb3JWZWN0b3I+IGNvbG9yRUhGdW5jbGV0cyhGdW5jdGlvbiAmRik7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9HbG9iYWxzTW9kUmVmLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0dsb2JhbHNNb2RSZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWNlZjY4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9HbG9iYWxzTW9kUmVmLmgKQEAgLTAsMCArMSwxNTYgQEAKKy8vPT09LSBHbG9iYWxzTW9kUmVmLmggLSBTaW1wbGUgTW9kL1JlZiBBQSBmb3IgR2xvYmFscyAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIGEgc2ltcGxlIG1vZC9yZWYgYW5kIGFsaWFzIGFuYWx5c2lzIG92ZXIgZ2xvYmFscy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0dMT0JBTFNNT0RSRUZfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0dMT0JBTFNNT0RSRUZfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9DYWxsR3JhcGguaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlIDxsaXN0PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBbiBhbGlhcyBhbmFseXNpcyByZXN1bHQgc2V0IGZvciBnbG9iYWxzLgorLy8vCisvLy8gVGhpcyBmb2N1c2VzIG9uIGhhbmRsaW5nIGFsaWFzaW5nIHByb3BlcnRpZXMgb2YgZ2xvYmFscyBhbmQgaW50ZXJwcm9jZWR1cmFsCisvLy8gZnVuY3Rpb24gY2FsbCBtb2QvcmVmIGluZm9ybWF0aW9uLgorY2xhc3MgR2xvYmFsc0FBUmVzdWx0IDogcHVibGljIEFBUmVzdWx0QmFzZTxHbG9iYWxzQUFSZXN1bHQ+IHsKKyAgZnJpZW5kIEFBUmVzdWx0QmFzZTxHbG9iYWxzQUFSZXN1bHQ+OworCisgIGNsYXNzIEZ1bmN0aW9uSW5mbzsKKworICBjb25zdCBEYXRhTGF5b3V0ICZETDsKKyAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gJlRMSTsKKworICAvLy8gVGhlIGdsb2JhbHMgdGhhdCBkbyBub3QgaGF2ZSB0aGVpciBhZGRyZXNzZXMgdGFrZW4uCisgIFNtYWxsUHRyU2V0PGNvbnN0IEdsb2JhbFZhbHVlICosIDg+IE5vbkFkZHJlc3NUYWtlbkdsb2JhbHM7CisKKyAgLy8vIEluZGlyZWN0R2xvYmFscyAtIFRoZSBtZW1vcnkgcG9pbnRlZCB0byBieSB0aGlzIGdsb2JhbCBpcyBrbm93biB0byBiZQorICAvLy8gJ293bmVkJyBieSB0aGUgZ2xvYmFsLgorICBTbWFsbFB0clNldDxjb25zdCBHbG9iYWxWYWx1ZSAqLCA4PiBJbmRpcmVjdEdsb2JhbHM7CisKKyAgLy8vIEFsbG9jc0ZvckluZGlyZWN0R2xvYmFscyAtIElmIGFuIGluc3RydWN0aW9uIGFsbG9jYXRlcyBtZW1vcnkgZm9yIGFuCisgIC8vLyBpbmRpcmVjdCBnbG9iYWwsIHRoaXMgbWFwIGluZGljYXRlcyB3aGljaCBvbmUuCisgIERlbnNlTWFwPGNvbnN0IFZhbHVlICosIGNvbnN0IEdsb2JhbFZhbHVlICo+IEFsbG9jc0ZvckluZGlyZWN0R2xvYmFsczsKKworICAvLy8gRm9yIGVhY2ggZnVuY3Rpb24sIGtlZXAgdHJhY2sgb2Ygd2hhdCBnbG9iYWxzIGFyZSBtb2RpZmllZCBvciByZWFkLgorICBEZW5zZU1hcDxjb25zdCBGdW5jdGlvbiAqLCBGdW5jdGlvbkluZm8+IEZ1bmN0aW9uSW5mb3M7CisKKyAgLy8vIEEgbWFwIG9mIGZ1bmN0aW9ucyB0byBTQ0MuIFRoZSBTQ0NzIGFyZSBkZXNjcmliZWQgYnkgYSBzaW1wbGUgaW50ZWdlcgorICAvLy8gSUQgdGhhdCBpcyBvbmx5IHVzZWZ1bCBmb3IgY29tcGFyaW5nIGZvciBlcXVhbGl0eSAoYXJlIHR3byBmdW5jdGlvbnMKKyAgLy8vIGluIHRoZSBzYW1lIFNDQyBvciBub3Q/KQorICBEZW5zZU1hcDxjb25zdCBGdW5jdGlvbiAqLCB1bnNpZ25lZD4gRnVuY3Rpb25Ub1NDQ01hcDsKKworICAvLy8gSGFuZGxlIHRvIGNsZWFyIHRoaXMgYW5hbHlzaXMgb24gZGVsZXRpb24gb2YgdmFsdWVzLgorICBzdHJ1Y3QgRGVsZXRpb25DYWxsYmFja0hhbmRsZSBmaW5hbCA6IENhbGxiYWNrVkggeworICAgIEdsb2JhbHNBQVJlc3VsdCAqR0FSOworICAgIHN0ZDo6bGlzdDxEZWxldGlvbkNhbGxiYWNrSGFuZGxlPjo6aXRlcmF0b3IgSTsKKworICAgIERlbGV0aW9uQ2FsbGJhY2tIYW5kbGUoR2xvYmFsc0FBUmVzdWx0ICZHQVIsIFZhbHVlICpWKQorICAgICAgICA6IENhbGxiYWNrVkgoViksIEdBUigmR0FSKSB7fQorCisgICAgdm9pZCBkZWxldGVkKCkgb3ZlcnJpZGU7CisgIH07CisKKyAgLy8vIExpc3Qgb2YgY2FsbGJhY2tzIGZvciBnbG9iYWxzIGJlaW5nIHRyYWNrZWQgYnkgdGhpcyBhbmFseXNpcy4gTm90ZSB0aGF0CisgIC8vLyB0aGVzZSBvYmplY3RzIGFyZSBxdWl0ZSBsYXJnZSwgYnV0IHdlIG9ubHkgYW50aWNpcGF0ZSBoYXZpbmcgb25lIHBlcgorICAvLy8gZ2xvYmFsIHRyYWNrZWQgYnkgdGhpcyBhbmFseXNpcy4gVGhlcmUgYXJlIG51bWVyb3VzIG9wdGltaXphdGlvbnMgd2UKKyAgLy8vIGNvdWxkIHBlcmZvcm0gdG8gdGhlIG1lbW9yeSB1dGlsaXphdGlvbiBoZXJlIGlmIHRoaXMgYmVjb21lcyBhIHByb2JsZW0uCisgIHN0ZDo6bGlzdDxEZWxldGlvbkNhbGxiYWNrSGFuZGxlPiBIYW5kbGVzOworCisgIGV4cGxpY2l0IEdsb2JhbHNBQVJlc3VsdChjb25zdCBEYXRhTGF5b3V0ICZETCwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gJlRMSSk7CisKK3B1YmxpYzoKKyAgR2xvYmFsc0FBUmVzdWx0KEdsb2JhbHNBQVJlc3VsdCAmJkFyZyk7CisgIH5HbG9iYWxzQUFSZXN1bHQoKTsKKworICBzdGF0aWMgR2xvYmFsc0FBUmVzdWx0IGFuYWx5emVNb2R1bGUoTW9kdWxlICZNLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAmVExJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbEdyYXBoICZDRyk7CisKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gSW1wbGVtZW50IHRoZSBBbGlhc0FuYWx5c2lzIEFQSQorICAvLworICBBbGlhc1Jlc3VsdCBhbGlhcyhjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jQSwgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvY0IpOworCisgIHVzaW5nIEFBUmVzdWx0QmFzZTo6Z2V0TW9kUmVmSW5mbzsKKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvKEltbXV0YWJsZUNhbGxTaXRlIENTLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jKTsKKworICAvLy8gZ2V0TW9kUmVmQmVoYXZpb3IgLSBSZXR1cm4gdGhlIGJlaGF2aW9yIG9mIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gaWYKKyAgLy8vIGNhbGxlZCBmcm9tIHRoZSBzcGVjaWZpZWQgY2FsbCBzaXRlLiAgVGhlIGNhbGwgc2l0ZSBtYXkgYmUgbnVsbCBpbiB3aGljaAorICAvLy8gY2FzZSB0aGUgbW9zdCBnZW5lcmljIGJlaGF2aW9yIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHJldHVybmVkLgorICBGdW5jdGlvbk1vZFJlZkJlaGF2aW9yIGdldE1vZFJlZkJlaGF2aW9yKGNvbnN0IEZ1bmN0aW9uICpGKTsKKworICAvLy8gZ2V0TW9kUmVmQmVoYXZpb3IgLSBSZXR1cm4gdGhlIGJlaGF2aW9yIG9mIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gaWYKKyAgLy8vIGNhbGxlZCBmcm9tIHRoZSBzcGVjaWZpZWQgY2FsbCBzaXRlLiAgVGhlIGNhbGwgc2l0ZSBtYXkgYmUgbnVsbCBpbiB3aGljaAorICAvLy8gY2FzZSB0aGUgbW9zdCBnZW5lcmljIGJlaGF2aW9yIG9mIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHJldHVybmVkLgorICBGdW5jdGlvbk1vZFJlZkJlaGF2aW9yIGdldE1vZFJlZkJlaGF2aW9yKEltbXV0YWJsZUNhbGxTaXRlIENTKTsKKworcHJpdmF0ZToKKyAgRnVuY3Rpb25JbmZvICpnZXRGdW5jdGlvbkluZm8oY29uc3QgRnVuY3Rpb24gKkYpOworCisgIHZvaWQgQW5hbHl6ZUdsb2JhbHMoTW9kdWxlICZNKTsKKyAgdm9pZCBBbmFseXplQ2FsbEdyYXBoKENhbGxHcmFwaCAmQ0csIE1vZHVsZSAmTSk7CisgIGJvb2wgQW5hbHl6ZVVzZXNPZlBvaW50ZXIoVmFsdWUgKlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXRJbXBsPEZ1bmN0aW9uICo+ICpSZWFkZXJzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldEltcGw8RnVuY3Rpb24gKj4gKldyaXRlcnMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlICpPa2F5U3RvcmVEZXN0ID0gbnVsbHB0cik7CisgIGJvb2wgQW5hbHl6ZUluZGlyZWN0R2xvYmFsTWVtb3J5KEdsb2JhbFZhcmlhYmxlICpHVik7CisgIHZvaWQgQ29sbGVjdFNDQ01lbWJlcnNoaXAoQ2FsbEdyYXBoICZDRyk7CisKKyAgYm9vbCBpc05vbkVzY2FwaW5nR2xvYmFsTm9BbGlhcyhjb25zdCBHbG9iYWxWYWx1ZSAqR1YsIGNvbnN0IFZhbHVlICpWKTsKKyAgTW9kUmVmSW5mbyBnZXRNb2RSZWZJbmZvRm9yQXJndW1lbnQoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdsb2JhbFZhbHVlICpHVik7Cit9OworCisvLy8gQW5hbHlzaXMgcGFzcyBwcm92aWRpbmcgYSBuZXZlci1pbnZhbGlkYXRlZCBhbGlhcyBhbmFseXNpcyByZXN1bHQuCitjbGFzcyBHbG9iYWxzQUEgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48R2xvYmFsc0FBPiB7CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxHbG9iYWxzQUE+OworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCitwdWJsaWM6CisgIHR5cGVkZWYgR2xvYmFsc0FBUmVzdWx0IFJlc3VsdDsKKworICBHbG9iYWxzQUFSZXN1bHQgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gTGVnYWN5IHdyYXBwZXIgcGFzcyB0byBwcm92aWRlIHRoZSBHbG9iYWxzQUFSZXN1bHQgb2JqZWN0LgorY2xhc3MgR2xvYmFsc0FBV3JhcHBlclBhc3MgOiBwdWJsaWMgTW9kdWxlUGFzcyB7CisgIHN0ZDo6dW5pcXVlX3B0cjxHbG9iYWxzQUFSZXN1bHQ+IFJlc3VsdDsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBHbG9iYWxzQUFXcmFwcGVyUGFzcygpOworCisgIEdsb2JhbHNBQVJlc3VsdCAmZ2V0UmVzdWx0KCkgeyByZXR1cm4gKlJlc3VsdDsgfQorICBjb25zdCBHbG9iYWxzQUFSZXN1bHQgJmdldFJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuICpSZXN1bHQ7IH0KKworICBib29sIHJ1bk9uTW9kdWxlKE1vZHVsZSAmTSkgb3ZlcnJpZGU7CisgIGJvb2wgZG9GaW5hbGl6YXRpb24oTW9kdWxlICZNKSBvdmVycmlkZTsKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIGNyZWF0ZUdsb2JhbHNBQVdyYXBwZXJQYXNzIC0gVGhpcyBwYXNzIHByb3ZpZGVzIGFsaWFzIGFuZCBtb2QvcmVmIGluZm8gZm9yCisvLyBnbG9iYWwgdmFsdWVzIHRoYXQgZG8gbm90IGhhdmUgdGhlaXIgYWRkcmVzc2VzIHRha2VuLgorLy8KK01vZHVsZVBhc3MgKmNyZWF0ZUdsb2JhbHNBQVdyYXBwZXJQYXNzKCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JVlVzZXJzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0lWVXNlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzViOTc0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JVlVzZXJzLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8vPT09LSBsbHZtL0FuYWx5c2lzL0lWVXNlcnMuaCAtIEluZHVjdGlvbiBWYXJpYWJsZSBVc2VycyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYm9va2tlZXBpbmcgZm9yICJpbnRlcmVzdGluZyIgdXNlcnMgb2YgZXhwcmVzc2lvbnMKKy8vIGNvbXB1dGVkIGZyb20gaW5kdWN0aW9uIHZhcmlhYmxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfSVZVU0VSU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfSVZVU0VSU19ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BBbmFseXNpc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BQYXNzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25Ob3JtYWxpemF0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZUhhbmRsZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFzc3VtcHRpb25DYWNoZTsKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIFZhbHVlOworY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworY2xhc3MgU0NFVjsKK2NsYXNzIElWVXNlcnM7CitjbGFzcyBEYXRhTGF5b3V0OworCisvLy8gSVZTdHJpZGVVc2UgLSBLZWVwIHRyYWNrIG9mIG9uZSB1c2Ugb2YgYSBzdHJpZGVkIGluZHVjdGlvbiB2YXJpYWJsZS4KKy8vLyBUaGUgRXhwciBtZW1iZXIga2VlcHMgdHJhY2sgb2YgdGhlIGV4cHJlc3Npb24sIFVzZXIgaXMgdGhlIGFjdHVhbCB1c2VyCisvLy8gaW5zdHJ1Y3Rpb24gb2YgdGhlIG9wZXJhbmQsIGFuZCAnT3BlcmFuZFZhbFRvUmVwbGFjZScgaXMgdGhlIG9wZXJhbmQgb2YKKy8vLyB0aGUgVXNlciB0aGF0IGlzIHRoZSB1c2UuCitjbGFzcyBJVlN0cmlkZVVzZSBmaW5hbCA6IHB1YmxpYyBDYWxsYmFja1ZILCBwdWJsaWMgaWxpc3Rfbm9kZTxJVlN0cmlkZVVzZT4geworICBmcmllbmQgY2xhc3MgSVZVc2VyczsKK3B1YmxpYzoKKyAgSVZTdHJpZGVVc2UoSVZVc2VycyAqUCwgSW5zdHJ1Y3Rpb24qIFUsIFZhbHVlICpPKQorICAgIDogQ2FsbGJhY2tWSChVKSwgUGFyZW50KFApLCBPcGVyYW5kVmFsVG9SZXBsYWNlKE8pIHsKKyAgfQorCisgIC8vLyBnZXRVc2VyIC0gUmV0dXJuIHRoZSB1c2VyIGluc3RydWN0aW9uIGZvciB0aGlzIHVzZS4KKyAgSW5zdHJ1Y3Rpb24gKmdldFVzZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8SW5zdHJ1Y3Rpb24+KGdldFZhbFB0cigpKTsKKyAgfQorCisgIC8vLyBzZXRVc2VyIC0gQXNzaWduIGEgbmV3IHVzZXIgaW5zdHJ1Y3Rpb24gZm9yIHRoaXMgdXNlLgorICB2b2lkIHNldFVzZXIoSW5zdHJ1Y3Rpb24gKk5ld1VzZXIpIHsKKyAgICBzZXRWYWxQdHIoTmV3VXNlcik7CisgIH0KKworICAvLy8gZ2V0T3BlcmFuZFZhbFRvUmVwbGFjZSAtIFJldHVybiB0aGUgVmFsdWUgb2YgdGhlIG9wZXJhbmQgaW4gdGhlIHVzZXIKKyAgLy8vIGluc3RydWN0aW9uIHRoYXQgdGhpcyBJVlN0cmlkZVVzZSBpcyByZXByZXNlbnRpbmcuCisgIFZhbHVlICpnZXRPcGVyYW5kVmFsVG9SZXBsYWNlKCkgY29uc3QgeworICAgIHJldHVybiBPcGVyYW5kVmFsVG9SZXBsYWNlOworICB9CisKKyAgLy8vIHNldE9wZXJhbmRWYWxUb1JlcGxhY2UgLSBBc3NpZ24gYSBuZXcgVmFsdWUgYXMgdGhlIG9wZXJhbmQgdmFsdWUKKyAgLy8vIHRvIHJlcGxhY2UuCisgIHZvaWQgc2V0T3BlcmFuZFZhbFRvUmVwbGFjZShWYWx1ZSAqT3ApIHsKKyAgICBPcGVyYW5kVmFsVG9SZXBsYWNlID0gT3A7CisgIH0KKworICAvLy8gZ2V0UG9zdEluY0xvb3BzIC0gUmV0dXJuIHRoZSBzZXQgb2YgbG9vcHMgZm9yIHdoaWNoIHRoZSBleHByZXNzaW9uIGhhcworICAvLy8gYmVlbiBhZGp1c3RlZCB0byB1c2UgcG9zdC1pbmMgbW9kZS4KKyAgY29uc3QgUG9zdEluY0xvb3BTZXQgJmdldFBvc3RJbmNMb29wcygpIGNvbnN0IHsKKyAgICByZXR1cm4gUG9zdEluY0xvb3BzOworICB9CisKKyAgLy8vIHRyYW5zZm9ybVRvUG9zdEluYyAtIFRyYW5zZm9ybSB0aGUgZXhwcmVzc2lvbiB0byBwb3N0LWluYyBmb3JtIGZvciB0aGUKKyAgLy8vIGdpdmVuIGxvb3AuCisgIHZvaWQgdHJhbnNmb3JtVG9Qb3N0SW5jKGNvbnN0IExvb3AgKkwpOworCitwcml2YXRlOgorICAvLy8gUGFyZW50IC0gYSBwb2ludGVyIHRvIHRoZSBJVlVzZXJzIHRoYXQgb3ducyB0aGlzIElWU3RyaWRlVXNlLgorICBJVlVzZXJzICpQYXJlbnQ7CisKKyAgLy8vIE9wZXJhbmRWYWxUb1JlcGxhY2UgLSBUaGUgVmFsdWUgb2YgdGhlIG9wZXJhbmQgaW4gdGhlIHVzZXIgaW5zdHJ1Y3Rpb24KKyAgLy8vIHRoYXQgdGhpcyBJVlN0cmlkZVVzZSBpcyByZXByZXNlbnRpbmcuCisgIFdlYWtUcmFja2luZ1ZIIE9wZXJhbmRWYWxUb1JlcGxhY2U7CisKKyAgLy8vIFBvc3RJbmNMb29wcyAtIFRoZSBzZXQgb2YgbG9vcHMgZm9yIHdoaWNoIEV4cHIgaGFzIGJlZW4gYWRqdXN0ZWQgdG8KKyAgLy8vIHVzZSBwb3N0LWluYyBtb2RlLiBUaGlzIGNvcnJlc3BvbmRzIHdpdGggU0NFVkV4cGFuZGVyJ3MgcG9zdC1pbmMgY29uY2VwdC4KKyAgUG9zdEluY0xvb3BTZXQgUG9zdEluY0xvb3BzOworCisgIC8vLyBEZWxldGVkIC0gSW1wbGVtZW50YXRpb24gb2YgQ2FsbGJhY2tWSCB2aXJ0dWFsIGZ1bmN0aW9uIHRvCisgIC8vLyByZWNlaXZlIG5vdGlmaWNhdGlvbiB3aGVuIHRoZSBVc2VyIGlzIGRlbGV0ZWQuCisgIHZvaWQgZGVsZXRlZCgpIG92ZXJyaWRlOworfTsKKworY2xhc3MgSVZVc2VycyB7CisgIGZyaWVuZCBjbGFzcyBJVlN0cmlkZVVzZTsKKyAgTG9vcCAqTDsKKyAgQXNzdW1wdGlvbkNhY2hlICpBQzsKKyAgTG9vcEluZm8gKkxJOworICBEb21pbmF0b3JUcmVlICpEVDsKKyAgU2NhbGFyRXZvbHV0aW9uICpTRTsKKyAgU21hbGxQdHJTZXQ8SW5zdHJ1Y3Rpb24qLCAxNj4gUHJvY2Vzc2VkOworCisgIC8vLyBJVlVzZXMgLSBBIGxpc3Qgb2YgYWxsIHRyYWNrZWQgSVYgdXNlcyBvZiBpbmR1Y3Rpb24gdmFyaWFibGUgZXhwcmVzc2lvbnMKKyAgLy8vIHdlIGFyZSBpbnRlcmVzdGVkIGluLgorICBpbGlzdDxJVlN0cmlkZVVzZT4gSVZVc2VzOworCisgIC8vIEVwaGVtZXJhbCB2YWx1ZXMgdXNlZCBieSBAbGx2bS5hc3N1bWUgaW4gdGhpcyBmdW5jdGlvbi4KKyAgU21hbGxQdHJTZXQ8Y29uc3QgVmFsdWUgKiwgMzI+IEVwaFZhbHVlczsKKworcHVibGljOgorICBJVlVzZXJzKExvb3AgKkwsIEFzc3VtcHRpb25DYWNoZSAqQUMsIExvb3BJbmZvICpMSSwgRG9taW5hdG9yVHJlZSAqRFQsCisgICAgICAgICAgU2NhbGFyRXZvbHV0aW9uICpTRSk7CisKKyAgSVZVc2VycyhJVlVzZXJzICYmWCkKKyAgICAgIDogTChzdGQ6Om1vdmUoWC5MKSksIEFDKHN0ZDo6bW92ZShYLkFDKSksIERUKHN0ZDo6bW92ZShYLkRUKSksCisgICAgICAgIFNFKHN0ZDo6bW92ZShYLlNFKSksIFByb2Nlc3NlZChzdGQ6Om1vdmUoWC5Qcm9jZXNzZWQpKSwKKyAgICAgICAgSVZVc2VzKHN0ZDo6bW92ZShYLklWVXNlcykpLCBFcGhWYWx1ZXMoc3RkOjptb3ZlKFguRXBoVmFsdWVzKSkgeworICAgIGZvciAoSVZTdHJpZGVVc2UgJlUgOiBJVlVzZXMpCisgICAgICBVLlBhcmVudCA9IHRoaXM7CisgIH0KKyAgSVZVc2Vycyhjb25zdCBJVlVzZXJzICYpID0gZGVsZXRlOworICBJVlVzZXJzICZvcGVyYXRvcj0oSVZVc2VycyAmJikgPSBkZWxldGU7CisgIElWVXNlcnMgJm9wZXJhdG9yPShjb25zdCBJVlVzZXJzICYpID0gZGVsZXRlOworCisgIExvb3AgKmdldExvb3AoKSBjb25zdCB7IHJldHVybiBMOyB9CisKKyAgLy8vIEFkZFVzZXJzSWZJbnRlcmVzdGluZyAtIEluc3BlY3QgdGhlIHNwZWNpZmllZCBJbnN0cnVjdGlvbi4gIElmIGl0IGlzIGEKKyAgLy8vIHJlZHVjaWJsZSBTQ0VWLCByZWN1cnNpdmVseSBhZGQgaXRzIHVzZXJzIHRvIHRoZSBJVlVzZXNCeVN0cmlkZSBzZXQgYW5kCisgIC8vLyByZXR1cm4gdHJ1ZS4gIE90aGVyd2lzZSwgcmV0dXJuIGZhbHNlLgorICBib29sIEFkZFVzZXJzSWZJbnRlcmVzdGluZyhJbnN0cnVjdGlvbiAqSSk7CisKKyAgSVZTdHJpZGVVc2UgJkFkZFVzZXIoSW5zdHJ1Y3Rpb24gKlVzZXIsIFZhbHVlICpPcGVyYW5kKTsKKworICAvLy8gZ2V0UmVwbGFjZW1lbnRFeHByIC0gUmV0dXJuIGEgU0NFViBleHByZXNzaW9uIHdoaWNoIGNvbXB1dGVzIHRoZQorICAvLy8gdmFsdWUgb2YgdGhlIE9wZXJhbmRWYWxUb1JlcGxhY2Ugb2YgdGhlIGdpdmVuIElWU3RyaWRlVXNlLgorICBjb25zdCBTQ0VWICpnZXRSZXBsYWNlbWVudEV4cHIoY29uc3QgSVZTdHJpZGVVc2UgJklVKSBjb25zdDsKKworICAvLy8gZ2V0RXhwciAtIFJldHVybiB0aGUgZXhwcmVzc2lvbiBmb3IgdGhlIHVzZS4KKyAgY29uc3QgU0NFViAqZ2V0RXhwcihjb25zdCBJVlN0cmlkZVVzZSAmSVUpIGNvbnN0OworCisgIGNvbnN0IFNDRVYgKmdldFN0cmlkZShjb25zdCBJVlN0cmlkZVVzZSAmSVUsIGNvbnN0IExvb3AgKkwpIGNvbnN0OworCisgIHR5cGVkZWYgaWxpc3Q8SVZTdHJpZGVVc2U+OjppdGVyYXRvciBpdGVyYXRvcjsKKyAgdHlwZWRlZiBpbGlzdDxJVlN0cmlkZVVzZT46OmNvbnN0X2l0ZXJhdG9yIGNvbnN0X2l0ZXJhdG9yOworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIElWVXNlcy5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpICAgeyByZXR1cm4gSVZVc2VzLmVuZCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gSVZVc2VzLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgICB7IHJldHVybiBJVlVzZXMuZW5kKCk7IH0KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIElWVXNlcy5lbXB0eSgpOyB9CisKKyAgYm9vbCBpc0lWVXNlck9yT3BlcmFuZChJbnN0cnVjdGlvbiAqSW5zdCkgY29uc3QgeworICAgIHJldHVybiBQcm9jZXNzZWQuY291bnQoSW5zdCk7CisgIH0KKworICB2b2lkIHJlbGVhc2VNZW1vcnkoKTsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlICogPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gZHVtcCAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgZm9yIGRlYnVnZ2luZy4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgYm9vbCBBZGRVc2Vyc0ltcGwoSW5zdHJ1Y3Rpb24gKkksIFNtYWxsUHRyU2V0SW1wbDxMb29wKj4gJlNpbXBsZUxvb3BOZXN0cyk7Cit9OworCitQYXNzICpjcmVhdGVJVlVzZXJzUGFzcygpOworCitjbGFzcyBJVlVzZXJzV3JhcHBlclBhc3MgOiBwdWJsaWMgTG9vcFBhc3MgeworICBzdGQ6OnVuaXF1ZV9wdHI8SVZVc2Vycz4gSVU7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgSVZVc2Vyc1dyYXBwZXJQYXNzKCk7CisKKyAgSVZVc2VycyAmZ2V0SVUoKSB7IHJldHVybiAqSVU7IH0KKyAgY29uc3QgSVZVc2VycyAmZ2V0SVUoKSBjb25zdCB7IHJldHVybiAqSVU7IH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgcnVuT25Mb29wKExvb3AgKkwsIExQUGFzc01hbmFnZXIgJkxQTSkgb3ZlcnJpZGU7CisKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSAqID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gQW5hbHlzaXMgcGFzcyB0aGF0IGV4cG9zZXMgdGhlIFxjIElWVXNlcnMgZm9yIGEgbG9vcC4KK2NsYXNzIElWVXNlcnNBbmFseXNpcyA6IHB1YmxpYyBBbmFseXNpc0luZm9NaXhpbjxJVlVzZXJzQW5hbHlzaXM+IHsKKyAgZnJpZW5kIEFuYWx5c2lzSW5mb01peGluPElWVXNlcnNBbmFseXNpcz47CisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBJVlVzZXJzIFJlc3VsdDsKKworICBJVlVzZXJzIHJ1bihMb29wICZMLCBMb29wQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgTG9vcFN0YW5kYXJkQW5hbHlzaXNSZXN1bHRzICZBUik7Cit9OworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbmRpcmVjdENhbGxQcm9tb3Rpb25BbmFseXNpcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbmRpcmVjdENhbGxQcm9tb3Rpb25BbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiMWMxMDEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0luZGlyZWN0Q2FsbFByb21vdGlvbkFuYWx5c2lzLmgKQEAgLTAsMCArMSw2OSBAQAorLy89PT0tIEluZGlyZWN0Q2FsbFByb21vdGlvbkFuYWx5c2lzLmggLSBJbmRpcmVjdCBjYWxsIGFuYWx5c2lzIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIEludGVyZmFjZSB0byBpZGVudGlmeSBpbmRpcmVjdCBjYWxsIHByb21vdGlvbiBjYW5kaWRhdGVzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfSU5ESVJFQ1RDQUxMUFJPTU9USU9OQU5BTFlTSVNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0lORElSRUNUQ0FMTFBST01PVElPTkFOQUxZU0lTX0gKKworI2luY2x1ZGUgImxsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgSW5zdHJ1Y3Rpb247CisKKy8vIENsYXNzIGZvciBpZGVudGlmeWluZyBwcm9maXRhYmxlIGluZGlyZWN0IGNhbGwgcHJvbW90aW9uIGNhbmRpZGF0ZXMgd2hlbgorLy8gdGhlIGluZGlyZWN0LWNhbGwgdmFsdWUgcHJvZmlsZSBtZXRhZGF0YSBpcyBhdmFpbGFibGUuCitjbGFzcyBJQ2FsbFByb21vdGlvbkFuYWx5c2lzIHsKK3ByaXZhdGU6CisgIC8vIEFsbG9jYXRlIHNwYWNlIHRvIHJlYWQgdGhlIHByb2ZpbGUgYW5ub3RhdGlvbi4KKyAgc3RkOjp1bmlxdWVfcHRyPEluc3RyUHJvZlZhbHVlRGF0YVtdPiBWYWx1ZURhdGFBcnJheTsKKworICAvLyBDb3VudCBpcyB0aGUgY2FsbCBjb3VudCBmb3IgdGhlIGRpcmVjdC1jYWxsIHRhcmdldC4KKyAgLy8gVG90YWxDb3VudCBpcyB0aGUgdG90YWwgY2FsbCBjb3VudCBmb3IgdGhlIGluZGlyZWN0LWNhbGwgY2FsbHNpdGUuCisgIC8vIFJlbWFpbmluZ0NvdW50IGlzIHRoZSBUb3RhbENvdW50IG1pbnVzIHByb21vdGVkLWRpcmVjdC1jYWxsIGNvdW50LgorICAvLyBSZXR1cm4gdHJ1ZSB3ZSBzaG91bGQgcHJvbW90ZSB0aGlzIGluZGlyZWN0LWNhbGwgdGFyZ2V0LgorICBib29sIGlzUHJvbW90aW9uUHJvZml0YWJsZSh1aW50NjRfdCBDb3VudCwgdWludDY0X3QgVG90YWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgUmVtYWluaW5nQ291bnQpOworCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBwcm9maXRhYmxlIGNhbmRpZGF0ZXMgdG8gcHJvbW90ZSBmb3IgdGhlCisgIC8vIGN1cnJlbnQgVmFsdWVEYXRhQXJyYXkgYW5kIHRoZSBnaXZlbiBccCBJbnN0LgorICB1aW50MzJfdCBnZXRQcm9maXRhYmxlUHJvbW90aW9uQ2FuZGlkYXRlcyhjb25zdCBJbnN0cnVjdGlvbiAqSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTnVtVmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgVG90YWxDb3VudCk7CisKKyAgLy8gTm9uY29weWFibGUKKyAgSUNhbGxQcm9tb3Rpb25BbmFseXNpcyhjb25zdCBJQ2FsbFByb21vdGlvbkFuYWx5c2lzICZvdGhlcikgPSBkZWxldGU7CisgIElDYWxsUHJvbW90aW9uQW5hbHlzaXMgJgorICBvcGVyYXRvcj0oY29uc3QgSUNhbGxQcm9tb3Rpb25BbmFseXNpcyAmb3RoZXIpID0gZGVsZXRlOworCitwdWJsaWM6CisgIElDYWxsUHJvbW90aW9uQW5hbHlzaXMoKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgcmVmZXJlbmNlIHRvIGFycmF5IG9mIEluc3RyUHJvZlZhbHVlRGF0YSBmb3IgdGhlIGdpdmVuCisgIC8vLyBpbnN0cnVjdGlvbiBccCBJLgorICAvLy8KKyAgLy8vIFRoZSBccCBOdW1WYWxzLCBccCBUb3RhbENvdW50IGFuZCBccCBOdW1DYW5kaWRhdGVzCisgIC8vLyBhcmUgc2V0IHRvIHRoZSBudW1iZXIgb2YgdmFsdWVzIGluIHRoZSBhcnJheSwgdGhlIHRvdGFsIHByb2ZpbGUgY291bnQKKyAgLy8vIG9mIHRoZSBpbmRpcmVjdCBjYWxsIFxwIEksIGFuZCB0aGUgbnVtYmVyIG9mIHByb2ZpdGFibGUgY2FuZGlkYXRlcworICAvLy8gaW4gdGhlIGdpdmVuIGFycmF5ICh3aGljaCBpcyBzb3J0ZWQgaW4gcmV2ZXJzZSBvcmRlciBvZiBwcm9maXRhYmlsaXR5KS4KKyAgLy8vCisgIC8vLyBUaGUgcmV0dXJuZWQgYXJyYXkgc3BhY2UgaXMgb3duZWQgYnkgdGhpcyBjbGFzcywgYW5kIG92ZXJ3cml0dGVuIG9uCisgIC8vLyBzdWJzZXF1ZW50IGNhbGxzLgorICBBcnJheVJlZjxJbnN0clByb2ZWYWx1ZURhdGE+CisgIGdldFByb21vdGlvbkNhbmRpZGF0ZXNGb3JJbnN0cnVjdGlvbihjb25zdCBJbnN0cnVjdGlvbiAqSSwgdWludDMyX3QgJk51bVZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAmVG90YWxDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZOdW1DYW5kaWRhdGVzKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbmRpcmVjdENhbGxTaXRlVmlzaXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbmRpcmVjdENhbGxTaXRlVmlzaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZTU2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0luZGlyZWN0Q2FsbFNpdGVWaXNpdG9yLmgKQEAgLTAsMCArMSwzNSBAQAorLy89PT0tLSBJbmRpcmVjdENhbGxTaXRlVmlzaXRvci5oIC0gaW5kaXJlY3QgY2FsbC1zaXRlcyB2aXNpdG9yIC0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgZGVmaW5lcyBhIHZpc2l0b3IgY2xhc3MgYW5kIGEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgZmluZAorLy8gYWxsIGluZGlyZWN0IGNhbGwtc2l0ZXMgaW4gYSBmdW5jdGlvbi4KKworI2luY2x1ZGUgImxsdm0vSVIvSW5zdFZpc2l0b3IuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKy8vIFZpc2l0b3IgY2xhc3MgdGhhdCBmaW5kcyBhbGwgaW5kaXJlY3QgY2FsbCBzaXRlcy4KK3N0cnVjdCBQR09JbmRpcmVjdENhbGxTaXRlVmlzaXRvcgorICAgIDogcHVibGljIEluc3RWaXNpdG9yPFBHT0luZGlyZWN0Q2FsbFNpdGVWaXNpdG9yPiB7CisgIHN0ZDo6dmVjdG9yPEluc3RydWN0aW9uICo+IEluZGlyZWN0Q2FsbEluc3RzOworICBQR09JbmRpcmVjdENhbGxTaXRlVmlzaXRvcigpIHt9CisKKyAgdm9pZCB2aXNpdENhbGxTaXRlKENhbGxTaXRlIENTKSB7CisgICAgaWYgKENTLmlzSW5kaXJlY3RDYWxsKCkpCisgICAgICBJbmRpcmVjdENhbGxJbnN0cy5wdXNoX2JhY2soQ1MuZ2V0SW5zdHJ1Y3Rpb24oKSk7CisgIH0KK307CisKKy8vIEhlbHBlciBmdW5jdGlvbiB0aGF0IGZpbmRzIGFsbCBpbmRpcmVjdCBjYWxsIHNpdGVzLgoraW5saW5lIHN0ZDo6dmVjdG9yPEluc3RydWN0aW9uICo+IGZpbmRJbmRpcmVjdENhbGxTaXRlcyhGdW5jdGlvbiAmRikgeworICBQR09JbmRpcmVjdENhbGxTaXRlVmlzaXRvciBJQ1Y7CisgIElDVi52aXNpdChGKTsKKyAgcmV0dXJuIElDVi5JbmRpcmVjdENhbGxJbnN0czsKK30KK30KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSW5saW5lQ29zdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbmxpbmVDb3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM4ZDNhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSW5saW5lQ29zdC5oCkBAIC0wLDAgKzEsMjE0IEBACisvLz09PS0gSW5saW5lQ29zdC5oIC0gQ29zdCBhbmFseXNpcyBmb3IgaW5saW5lciAtLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGhldXJpc3RpY3MgZm9yIGlubGluaW5nIGRlY2lzaW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfSU5MSU5FQ09TVF9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfSU5MSU5FQ09TVF9ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0Fzc3VtcHRpb25DYWNoZS5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ2FsbEdyYXBoU0NDUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgQXNzdW1wdGlvbkNhY2hlVHJhY2tlcjsKK2NsYXNzIEJsb2NrRnJlcXVlbmN5SW5mbzsKK2NsYXNzIENhbGxTaXRlOworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgUHJvZmlsZVN1bW1hcnlJbmZvOworY2xhc3MgVGFyZ2V0VHJhbnNmb3JtSW5mbzsKKworbmFtZXNwYWNlIElubGluZUNvbnN0YW50cyB7CisvLyBWYXJpb3VzIHRocmVzaG9sZHMgdXNlZCBieSBpbmxpbmUgY29zdCBhbmFseXNpcy4KKy8vLyBVc2Ugd2hlbiBvcHRzaXplICgtT3MpIGlzIHNwZWNpZmllZC4KK2NvbnN0IGludCBPcHRTaXplVGhyZXNob2xkID0gNTA7CisKKy8vLyBVc2Ugd2hlbiBtaW5zaXplICgtT3opIGlzIHNwZWNpZmllZC4KK2NvbnN0IGludCBPcHRNaW5TaXplVGhyZXNob2xkID0gNTsKKworLy8vIFVzZSB3aGVuIC1PMyBpcyBzcGVjaWZpZWQuCitjb25zdCBpbnQgT3B0QWdncmVzc2l2ZVRocmVzaG9sZCA9IDI1MDsKKworLy8gVmFyaW91cyBtYWdpYyBjb25zdGFudHMgdXNlZCB0byBhZGp1c3QgaGV1cmlzdGljcy4KK2NvbnN0IGludCBJbnN0ckNvc3QgPSA1OworY29uc3QgaW50IEluZGlyZWN0Q2FsbFRocmVzaG9sZCA9IDEwMDsKK2NvbnN0IGludCBDYWxsUGVuYWx0eSA9IDI1OworY29uc3QgaW50IExhc3RDYWxsVG9TdGF0aWNCb251cyA9IDE1MDAwOworY29uc3QgaW50IENvbGRjY1BlbmFsdHkgPSAyMDAwOworY29uc3QgaW50IE5vcmV0dXJuUGVuYWx0eSA9IDEwMDAwOworLy8vIERvIG5vdCBpbmxpbmUgZnVuY3Rpb25zIHdoaWNoIGFsbG9jYXRlIHRoaXMgbWFueSBieXRlcyBvbiB0aGUgc3RhY2sKKy8vLyB3aGVuIHRoZSBjYWxsZXIgaXMgcmVjdXJzaXZlLgorY29uc3QgdW5zaWduZWQgVG90YWxBbGxvY2FTaXplUmVjdXJzaXZlQ2FsbGVyID0gMTAyNDsKK30KKworLy8vIFxicmllZiBSZXByZXNlbnRzIHRoZSBjb3N0IG9mIGlubGluaW5nIGEgZnVuY3Rpb24uCisvLy8KKy8vLyBUaGlzIHN1cHBvcnRzIHNwZWNpYWwgdmFsdWVzIGZvciBmdW5jdGlvbnMgd2hpY2ggc2hvdWxkICJhbHdheXMiIG9yCisvLy8gIm5ldmVyIiBiZSBpbmxpbmVkLiBPdGhlcndpc2UsIHRoZSBjb3N0IHJlcHJlc2VudHMgYSB1bml0bGVzcyBhbW91bnQ7CisvLy8gc21hbGxlciB2YWx1ZXMgaW5jcmVhc2UgdGhlIGxpa2VsaWhvb2Qgb2YgdGhlIGZ1bmN0aW9uIGJlaW5nIGlubGluZWQuCisvLy8KKy8vLyBPYmplY3RzIG9mIHRoaXMgdHlwZSBhbHNvIHByb3ZpZGUgdGhlIGFkanVzdGVkIHRocmVzaG9sZCBmb3IgaW5saW5pbmcKKy8vLyBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGZvciBhIHBhcnRpY3VsYXIgY2FsbHNpdGUuIFRoZXkgY2FuIGJlCisvLy8gZGlyZWN0bHkgdGVzdGVkIHRvIGRldGVybWluZSBpZiBpbmxpbmluZyBzaG91bGQgb2NjdXIgZ2l2ZW4gdGhlIGNvc3QgYW5kCisvLy8gdGhyZXNob2xkIGZvciB0aGlzIGNvc3QgbWV0cmljLgorY2xhc3MgSW5saW5lQ29zdCB7CisgIGVudW0gU2VudGluZWxWYWx1ZXMgeworICAgIEFsd2F5c0lubGluZUNvc3QgPSBJTlRfTUlOLAorICAgIE5ldmVySW5saW5lQ29zdCA9IElOVF9NQVgKKyAgfTsKKworICAvLy8gXGJyaWVmIFRoZSBlc3RpbWF0ZWQgY29zdCBvZiBpbmxpbmluZyB0aGlzIGNhbGxzaXRlLgorICBjb25zdCBpbnQgQ29zdDsKKworICAvLy8gXGJyaWVmIFRoZSBhZGp1c3RlZCB0aHJlc2hvbGQgYWdhaW5zdCB3aGljaCB0aGlzIGNvc3Qgd2FzIGNvbXB1dGVkLgorICBjb25zdCBpbnQgVGhyZXNob2xkOworCisgIC8vIFRyaXZpYWwgY29uc3RydWN0b3IsIGludGVyZXN0aW5nIGxvZ2ljIGluIHRoZSBmYWN0b3J5IGZ1bmN0aW9ucyBiZWxvdy4KKyAgSW5saW5lQ29zdChpbnQgQ29zdCwgaW50IFRocmVzaG9sZCkgOiBDb3N0KENvc3QpLCBUaHJlc2hvbGQoVGhyZXNob2xkKSB7fQorCitwdWJsaWM6CisgIHN0YXRpYyBJbmxpbmVDb3N0IGdldChpbnQgQ29zdCwgaW50IFRocmVzaG9sZCkgeworICAgIGFzc2VydChDb3N0ID4gQWx3YXlzSW5saW5lQ29zdCAmJiAiQ29zdCBjcm9zc2VzIHNlbnRpbmVsIHZhbHVlIik7CisgICAgYXNzZXJ0KENvc3QgPCBOZXZlcklubGluZUNvc3QgJiYgIkNvc3QgY3Jvc3NlcyBzZW50aW5lbCB2YWx1ZSIpOworICAgIHJldHVybiBJbmxpbmVDb3N0KENvc3QsIFRocmVzaG9sZCk7CisgIH0KKyAgc3RhdGljIElubGluZUNvc3QgZ2V0QWx3YXlzKCkgeworICAgIHJldHVybiBJbmxpbmVDb3N0KEFsd2F5c0lubGluZUNvc3QsIDApOworICB9CisgIHN0YXRpYyBJbmxpbmVDb3N0IGdldE5ldmVyKCkgeworICAgIHJldHVybiBJbmxpbmVDb3N0KE5ldmVySW5saW5lQ29zdCwgMCk7CisgIH0KKworICAvLy8gXGJyaWVmIFRlc3Qgd2hldGhlciB0aGUgaW5saW5lIGNvc3QgaXMgbG93IGVub3VnaCBmb3IgaW5saW5pbmcuCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgcmV0dXJuIENvc3QgPCBUaHJlc2hvbGQ7CisgIH0KKworICBib29sIGlzQWx3YXlzKCkgY29uc3QgeyByZXR1cm4gQ29zdCA9PSBBbHdheXNJbmxpbmVDb3N0OyB9CisgIGJvb2wgaXNOZXZlcigpIGNvbnN0IHsgcmV0dXJuIENvc3QgPT0gTmV2ZXJJbmxpbmVDb3N0OyB9CisgIGJvb2wgaXNWYXJpYWJsZSgpIGNvbnN0IHsgcmV0dXJuICFpc0Fsd2F5cygpICYmICFpc05ldmVyKCk7IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgaW5saW5lIGNvc3QgZXN0aW1hdGUuCisgIC8vLyBJdCBpcyBhbiBlcnJvciB0byBjYWxsIHRoaXMgb24gYW4gImFsd2F5cyIgb3IgIm5ldmVyIiBJbmxpbmVDb3N0LgorICBpbnQgZ2V0Q29zdCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNWYXJpYWJsZSgpICYmICJJbnZhbGlkIGFjY2VzcyBvZiBJbmxpbmVDb3N0Iik7CisgICAgcmV0dXJuIENvc3Q7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgdGhyZXNob2xkIGFnYWluc3Qgd2hpY2ggdGhlIGNvc3Qgd2FzIGNvbXB1dGVkCisgIGludCBnZXRUaHJlc2hvbGQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzVmFyaWFibGUoKSAmJiAiSW52YWxpZCBhY2Nlc3Mgb2YgSW5saW5lQ29zdCIpOworICAgIHJldHVybiBUaHJlc2hvbGQ7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgY29zdCBkZWx0YSBmcm9tIHRoZSB0aHJlc2hvbGQgZm9yIGlubGluaW5nLgorICAvLy8gT25seSB2YWxpZCBpZiB0aGUgY29zdCBpcyBvZiB0aGUgdmFyaWFibGUga2luZC4gUmV0dXJucyBhIG5lZ2F0aXZlCisgIC8vLyB2YWx1ZSBpZiB0aGUgY29zdCBpcyB0b28gaGlnaCB0byBpbmxpbmUuCisgIGludCBnZXRDb3N0RGVsdGEoKSBjb25zdCB7IHJldHVybiBUaHJlc2hvbGQgLSBnZXRDb3N0KCk7IH0KK307CisKKy8vLyBUaHJlc2hvbGRzIHRvIHR1bmUgaW5saW5lIGNvc3QgYW5hbHlzaXMuIFRoZSBpbmxpbmUgY29zdCBhbmFseXNpcyBkZWNpZGVzCisvLy8gdGhlIGNvbmRpdGlvbiB0byBhcHBseSBhIHRocmVzaG9sZCBhbmQgYXBwbGllcyBpdC4gT3RoZXJ3aXNlLAorLy8vIERlZmF1bHRUaHJlc2hvbGQgaXMgdXNlZC4gSWYgYSB0aHJlc2hvbGQgaXMgT3B0aW9uYWwsIGl0IGlzIGFwcGxpZWQgb25seQorLy8vIHdoZW4gaXQgaGFzIGEgdmFsaWQgdmFsdWUuIFR5cGljYWxseSwgdXNlcnMgb2YgaW5saW5lIGNvc3QgYW5hbHlzaXMKKy8vLyBvYnRhaW4gYW4gSW5saW5lUGFyYW1zIG9iamVjdCB0aHJvdWdoIG9uZSBvZiB0aGUgXGMgZ2V0SW5saW5lUGFyYW1zIG1ldGhvZHMKKy8vLyBhbmQgcGFzcyBpdCB0byBcYyBnZXRJbmxpbmVDb3N0LiBTb21lIHNwZWNpYWxpemVkIHZlcnNpb25zIG9mIGlubGluZXIKKy8vLyAoc3VjaCBhcyB0aGUgcHJlLWlubGluZXIpIG1pZ2h0IGhhdmUgY3VzdG9tIGxvZ2ljIHRvIGNvbXB1dGUgXGMgSW5saW5lUGFyYW1zCisvLy8gb2JqZWN0LgorCitzdHJ1Y3QgSW5saW5lUGFyYW1zIHsKKyAgLy8vIFRoZSBkZWZhdWx0IHRocmVzaG9sZCB0byBzdGFydCB3aXRoIGZvciBhIGNhbGxlZS4KKyAgaW50IERlZmF1bHRUaHJlc2hvbGQ7CisKKyAgLy8vIFRocmVzaG9sZCB0byB1c2UgZm9yIGNhbGxlZXMgd2l0aCBpbmxpbmUgaGludC4KKyAgT3B0aW9uYWw8aW50PiBIaW50VGhyZXNob2xkOworCisgIC8vLyBUaHJlc2hvbGQgdG8gdXNlIGZvciBjb2xkIGNhbGxlZXMuCisgIE9wdGlvbmFsPGludD4gQ29sZFRocmVzaG9sZDsKKworICAvLy8gVGhyZXNob2xkIHRvIHVzZSB3aGVuIHRoZSBjYWxsZXIgaXMgb3B0aW1pemVkIGZvciBzaXplLgorICBPcHRpb25hbDxpbnQ+IE9wdFNpemVUaHJlc2hvbGQ7CisKKyAgLy8vIFRocmVzaG9sZCB0byB1c2Ugd2hlbiB0aGUgY2FsbGVyIGlzIG9wdGltaXplZCBmb3IgbWluc2l6ZS4KKyAgT3B0aW9uYWw8aW50PiBPcHRNaW5TaXplVGhyZXNob2xkOworCisgIC8vLyBUaHJlc2hvbGQgdG8gdXNlIHdoZW4gdGhlIGNhbGxzaXRlIGlzIGNvbnNpZGVyZWQgaG90LgorICBPcHRpb25hbDxpbnQ+IEhvdENhbGxTaXRlVGhyZXNob2xkOworCisgIC8vLyBUaHJlc2hvbGQgdG8gdXNlIHdoZW4gdGhlIGNhbGxzaXRlIGlzIGNvbnNpZGVyZWQgaG90IHJlbGF0aXZlIHRvIGZ1bmN0aW9uCisgIC8vLyBlbnRyeS4KKyAgT3B0aW9uYWw8aW50PiBMb2NhbGx5SG90Q2FsbFNpdGVUaHJlc2hvbGQ7CisKKyAgLy8vIFRocmVzaG9sZCB0byB1c2Ugd2hlbiB0aGUgY2FsbHNpdGUgaXMgY29uc2lkZXJlZCBjb2xkLgorICBPcHRpb25hbDxpbnQ+IENvbGRDYWxsU2l0ZVRocmVzaG9sZDsKKworICAvLy8gQ29tcHV0ZSBpbmxpbmUgY29zdCBldmVuIHdoZW4gdGhlIGNvc3QgaGFzIGV4Y2VlZGVkIHRoZSB0aHJlc2hvbGQuCisgIE9wdGlvbmFsPGJvb2w+IENvbXB1dGVGdWxsSW5saW5lQ29zdDsKK307CisKKy8vLyBHZW5lcmF0ZSB0aGUgcGFyYW1ldGVycyB0byB0dW5lIHRoZSBpbmxpbmUgY29zdCBhbmFseXNpcyBiYXNlZCBvbmx5IG9uIHRoZQorLy8vIGNvbW1hbmRsaW5lIG9wdGlvbnMuCitJbmxpbmVQYXJhbXMgZ2V0SW5saW5lUGFyYW1zKCk7CisKKy8vLyBHZW5lcmF0ZSB0aGUgcGFyYW1ldGVycyB0byB0dW5lIHRoZSBpbmxpbmUgY29zdCBhbmFseXNpcyBiYXNlZCBvbiBjb21tYW5kCisvLy8gbGluZSBvcHRpb25zLiBJZiAtaW5saW5lLXRocmVzaG9sZCBvcHRpb24gaXMgbm90IGV4cGxpY2l0bHkgcGFzc2VkLAorLy8vIFxwIFRocmVzaG9sZCBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IHRocmVzaG9sZC4KK0lubGluZVBhcmFtcyBnZXRJbmxpbmVQYXJhbXMoaW50IFRocmVzaG9sZCk7CisKKy8vLyBHZW5lcmF0ZSB0aGUgcGFyYW1ldGVycyB0byB0dW5lIHRoZSBpbmxpbmUgY29zdCBhbmFseXNpcyBiYXNlZCBvbiBjb21tYW5kCisvLy8gbGluZSBvcHRpb25zLiBJZiAtaW5saW5lLXRocmVzaG9sZCBvcHRpb24gaXMgbm90IGV4cGxpY2l0bHkgcGFzc2VkLAorLy8vIHRoZSBkZWZhdWx0IHRocmVzaG9sZCBpcyBjb21wdXRlZCBmcm9tIFxwIE9wdExldmVsIGFuZCBccCBTaXplT3B0TGV2ZWwuCisvLy8gQW4gXHAgT3B0TGV2ZWwgdmFsdWUgYWJvdmUgMyBpcyBjb25zaWRlcmVkIGFuIGFnZ3Jlc3NpdmUgb3B0aW1pemF0aW9uIG1vZGUuCisvLy8gXHAgU2l6ZU9wdExldmVsIG9mIDEgY29ycmVzcG9uZHMgdG8gdGhlIC1PcyBmbGFnIGFuZCAyIGNvcnJlc3BvbmRzIHRvCisvLy8gdGhlIC1PeiBmbGFnLgorSW5saW5lUGFyYW1zIGdldElubGluZVBhcmFtcyh1bnNpZ25lZCBPcHRMZXZlbCwgdW5zaWduZWQgU2l6ZU9wdExldmVsKTsKKworLy8vIFJldHVybiB0aGUgY29zdCBhc3NvY2lhdGVkIHdpdGggYSBjYWxsc2l0ZSwgaW5jbHVkaW5nIHBhcmFtZXRlciBwYXNzaW5nCisvLy8gYW5kIHRoZSBjYWxsL3JldHVybiBpbnN0cnVjdGlvbi4KK2ludCBnZXRDYWxsc2l0ZUNvc3QoQ2FsbFNpdGUgQ1MsIGNvbnN0IERhdGFMYXlvdXQgJkRMKTsKKworLy8vIFxicmllZiBHZXQgYW4gSW5saW5lQ29zdCBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBjb3N0IG9mIGlubGluaW5nIHRoaXMKKy8vLyBjYWxsc2l0ZS4KKy8vLworLy8vIE5vdGUgdGhhdCBhIGRlZmF1bHQgdGhyZXNob2xkIGlzIHBhc3NlZCBpbnRvIHRoaXMgZnVuY3Rpb24uIFRoaXMgdGhyZXNob2xkCisvLy8gY291bGQgYmUgbW9kaWZpZWQgYmFzZWQgb24gY2FsbHNpdGUncyBwcm9wZXJ0aWVzIGFuZCBvbmx5IGNvc3RzIGJlbG93IHRoaXMKKy8vLyBuZXcgdGhyZXNob2xkIGFyZSBjb21wdXRlZCB3aXRoIGFueSBhY2N1cmFjeS4gVGhlIG5ldyB0aHJlc2hvbGQgY2FuIGJlCisvLy8gdXNlZCB0byBib3VuZCB0aGUgY29tcHV0YXRpb24gbmVjZXNzYXJ5IHRvIGRldGVybWluZSB3aGV0aGVyIHRoZSBjb3N0IGlzCisvLy8gc3VmZmljaWVudGx5IGxvdyB0byB3YXJyYW50IGlubGluaW5nLgorLy8vCisvLy8gQWxzbyBub3RlIHRoYXQgY2FsbGluZyB0aGlzIGZ1bmN0aW9uICpkeW5hbWljYWxseSogY29tcHV0ZXMgdGhlIGNvc3Qgb2YKKy8vLyBpbmxpbmluZyB0aGUgY2FsbHNpdGUuIEl0IGlzIGFuIGV4cGVuc2l2ZSwgaGVhdnl3ZWlnaHQgY2FsbC4KK0lubGluZUNvc3QgZ2V0SW5saW5lQ29zdCgKKyAgICBDYWxsU2l0ZSBDUywgY29uc3QgSW5saW5lUGFyYW1zICZQYXJhbXMsIFRhcmdldFRyYW5zZm9ybUluZm8gJkNhbGxlZVRUSSwKKyAgICBzdGQ6OmZ1bmN0aW9uPEFzc3VtcHRpb25DYWNoZSAmKEZ1bmN0aW9uICYpPiAmR2V0QXNzdW1wdGlvbkNhY2hlLAorICAgIE9wdGlvbmFsPGZ1bmN0aW9uX3JlZjxCbG9ja0ZyZXF1ZW5jeUluZm8gJihGdW5jdGlvbiAmKT4+IEdldEJGSSwKKyAgICBQcm9maWxlU3VtbWFyeUluZm8gKlBTSSwgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciAqT1JFID0gbnVsbHB0cik7CisKKy8vLyBcYnJpZWYgR2V0IGFuIElubGluZUNvc3Qgd2l0aCB0aGUgY2FsbGVlIGV4cGxpY2l0bHkgc3BlY2lmaWVkLgorLy8vIFRoaXMgYWxsb3dzIHlvdSB0byBjYWxjdWxhdGUgdGhlIGNvc3Qgb2YgaW5saW5pbmcgYSBmdW5jdGlvbiB2aWEgYQorLy8vIHBvaW50ZXIuIFRoaXMgYmVoYXZlcyBleGFjdGx5IGFzIHRoZSB2ZXJzaW9uIHdpdGggbm8gZXhwbGljaXQgY2FsbGVlCisvLy8gcGFyYW1ldGVyIGluIGFsbCBvdGhlciByZXNwZWN0cy4KKy8vCitJbmxpbmVDb3N0CitnZXRJbmxpbmVDb3N0KENhbGxTaXRlIENTLCBGdW5jdGlvbiAqQ2FsbGVlLCBjb25zdCBJbmxpbmVQYXJhbXMgJlBhcmFtcywKKyAgICAgICAgICAgICAgVGFyZ2V0VHJhbnNmb3JtSW5mbyAmQ2FsbGVlVFRJLAorICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPEFzc3VtcHRpb25DYWNoZSAmKEZ1bmN0aW9uICYpPiAmR2V0QXNzdW1wdGlvbkNhY2hlLAorICAgICAgICAgICAgICBPcHRpb25hbDxmdW5jdGlvbl9yZWY8QmxvY2tGcmVxdWVuY3lJbmZvICYoRnVuY3Rpb24gJik+PiBHZXRCRkksCisgICAgICAgICAgICAgIFByb2ZpbGVTdW1tYXJ5SW5mbyAqUFNJLCBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyICpPUkUpOworCisvLy8gXGJyaWVmIE1pbmltYWwgZmlsdGVyIHRvIGRldGVjdCBpbnZhbGlkIGNvbnN0cnVjdHMgZm9yIGlubGluaW5nLgorYm9vbCBpc0lubGluZVZpYWJsZShGdW5jdGlvbiAmQ2FsbGVlKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0luc3RydWN0aW9uU2ltcGxpZnkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSW5zdHJ1Y3Rpb25TaW1wbGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmODk2YmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0luc3RydWN0aW9uU2ltcGxpZnkuaApAQCAtMCwwICsxLDI1MiBAQAorLy89PT0tLSBJbnN0cnVjdGlvblNpbXBsaWZ5LmggLSBGb2xkIGluc3RycyBpbnRvIHNpbXBsZXIgZm9ybXMgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgcm91dGluZXMgZm9yIGZvbGRpbmcgaW5zdHJ1Y3Rpb25zIGludG8gc2ltcGxlciBmb3JtcworLy8gdGhhdCBkbyBub3QgcmVxdWlyZSBjcmVhdGluZyBuZXcgaW5zdHJ1Y3Rpb25zLiAgVGhpcyBkb2VzIGNvbnN0YW50IGZvbGRpbmcKKy8vICgiYWRkIGkzMiAxLCAxIiAtPiAiMiIpIGJ1dCBjYW4gYWxzbyBoYW5kbGUgbm9uLWNvbnN0YW50IG9wZXJhbmRzLCBlaXRoZXIKKy8vIHJldHVybmluZyBhIGNvbnN0YW50ICgiYW5kIGkzMiAleCwgMCIgLT4gIjAiKSBvciBhbiBhbHJlYWR5IGV4aXN0aW5nIHZhbHVlCisvLyAoImFuZCBpMzIgJXgsICV4IiAtPiAiJXgiKS4gIElmIHRoZSBzaW1wbGlmaWNhdGlvbiBpcyBhbHNvIGFuIGluc3RydWN0aW9uCisvLyB0aGVuIGl0IGRvbWluYXRlcyB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24uCisvLworLy8gVGhlc2Ugcm91dGluZXMgaW1wbGljaXRseSByZXNvbHZlIHVuZGVmIHVzZXMuIFRoZSBlYXNpZXN0IHdheSB0byBiZSBzYWZlIHdoZW4KKy8vIHVzaW5nIHRoZXNlIHJvdXRpbmVzIHRvIG9idGFpbiBzaW1wbGlmaWVkIHZhbHVlcyBmb3IgZXhpc3RpbmcgaW5zdHJ1Y3Rpb25zIGlzCisvLyB0byBhbHdheXMgcmVwbGFjZSBhbGwgdXNlcyBvZiB0aGUgaW5zdHJ1Y3Rpb25zIHdpdGggdGhlIHJlc3VsdGluZyBzaW1wbGlmaWVkCisvLyB2YWx1ZXMuIFRoaXMgd2lsbCBwcmV2ZW50IG90aGVyIGNvZGUgZnJvbSBzZWVpbmcgdGhlIHNhbWUgdW5kZWYgdXNlcyBhbmQKKy8vIHJlc29sdmluZyB0aGVtIHRvIGRpZmZlcmVudCB2YWx1ZXMuCisvLworLy8gVGhlc2Ugcm91dGluZXMgYXJlIGRlc2lnbmVkIHRvIHRvbGVyYXRlIG1vZGVyYXRlbHkgaW5jb21wbGV0ZSBJUiwgc3VjaCBhcworLy8gaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIG5vdCBjb25uZWN0ZWQgdG8gYmFzaWMgYmxvY2tzIHlldC4gSG93ZXZlciwgdGhleSBkbworLy8gcmVxdWlyZSB0aGF0IGFsbCB0aGUgSVIgdGhhdCB0aGV5IGVuY291bnRlciBiZSB2YWxpZC4gSW4gcGFydGljdWxhciwgdGhleQorLy8gcmVxdWlyZSB0aGF0IGFsbCBub24tY29uc3RhbnQgdmFsdWVzIGJlIGRlZmluZWQgaW4gdGhlIHNhbWUgZnVuY3Rpb24sIGFuZCB0aGUKKy8vIHNhbWUgY2FsbCBjb250ZXh0IG9mIHRoYXQgZnVuY3Rpb24gKGFuZCBub3Qgc3BsaXQgYmV0d2VlbiBjYWxsZXIgYW5kIGNhbGxlZQorLy8gY29udGV4dHMgb2YgYSBkaXJlY3RseSByZWN1cnNpdmUgY2FsbCwgZm9yIGV4YW1wbGUpLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19JTlNUUlVDVElPTlNJTVBMSUZZX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19JTlNUUlVDVElPTlNJTVBMSUZZX0gKKworI2luY2x1ZGUgImxsdm0vSVIvVXNlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBGdW5jdGlvbjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBUQXJncz4gY2xhc3MgQW5hbHlzaXNNYW5hZ2VyOwordGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIEFycmF5UmVmOworY2xhc3MgQXNzdW1wdGlvbkNhY2hlOworY2xhc3MgRG9taW5hdG9yVHJlZTsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgSW1tdXRhYmxlQ2FsbFNpdGU7CitjbGFzcyBEYXRhTGF5b3V0OworY2xhc3MgRmFzdE1hdGhGbGFnczsKK3N0cnVjdCBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHM7CitjbGFzcyBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyOworY2xhc3MgUGFzczsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworY2xhc3MgVHlwZTsKK2NsYXNzIFZhbHVlOworCitzdHJ1Y3QgU2ltcGxpZnlRdWVyeSB7CisgIGNvbnN0IERhdGFMYXlvdXQgJkRMOworICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJID0gbnVsbHB0cjsKKyAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyOworICBBc3N1bXB0aW9uQ2FjaGUgKkFDID0gbnVsbHB0cjsKKyAgY29uc3QgSW5zdHJ1Y3Rpb24gKkN4dEkgPSBudWxscHRyOworCisgIFNpbXBsaWZ5UXVlcnkoY29uc3QgRGF0YUxheW91dCAmREwsIGNvbnN0IEluc3RydWN0aW9uICpDWFRJID0gbnVsbHB0cikKKyAgICAgIDogREwoREwpLCBDeHRJKENYVEkpIHt9CisKKyAgU2ltcGxpZnlRdWVyeShjb25zdCBEYXRhTGF5b3V0ICZETCwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSwKKyAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgQXNzdW1wdGlvbkNhY2hlICpBQyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkNYVEkgPSBudWxscHRyKQorICAgICAgOiBETChETCksIFRMSShUTEkpLCBEVChEVCksIEFDKEFDKSwgQ3h0SShDWFRJKSB7fQorICBTaW1wbGlmeVF1ZXJ5IGdldFdpdGhJbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAqSSkgY29uc3QgeworICAgIFNpbXBsaWZ5UXVlcnkgQ29weSgqdGhpcyk7CisgICAgQ29weS5DeHRJID0gSTsKKyAgICByZXR1cm4gQ29weTsKKyAgfQorfTsKKworLy8gTk9URTogdGhlIGV4cGxpY2l0IG11bHRpcGxlIGFyZ3VtZW50IHZlcnNpb25zIG9mIHRoZXNlIGZ1bmN0aW9ucyBhcmUKKy8vIGRlcHJlY2F0ZWQuCisvLyBQbGVhc2UgdXNlIHRoZSBTaW1wbGlmeVF1ZXJ5IHZlcnNpb25zIGluIG5ldyBjb2RlLgorCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGFuIEFkZCwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5QWRkSW5zdChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBib29sIGlzTlNXLCBib29sIGlzTlVXLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhIFN1YiwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5U3ViSW5zdChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBib29sIGlzTlNXLCBib29sIGlzTlVXLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhbiBGQWRkLCBmb2xkIHRoZSByZXN1bHQgb3IgcmV0dXJuIG51bGwuCitWYWx1ZSAqU2ltcGxpZnlGQWRkSW5zdChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBGYXN0TWF0aEZsYWdzIEZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGFuIEZTdWIsIGZvbGQgdGhlIHJlc3VsdCBvciByZXR1cm4gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeUZTdWJJbnN0KFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIEZhc3RNYXRoRmxhZ3MgRk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBvcGVyYW5kcyBmb3IgYW4gRk11bCwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5Rk11bEluc3QoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgRmFzdE1hdGhGbGFncyBGTUYsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhIE11bCwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5TXVsSW5zdChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhbiBTRGl2LCBmb2xkIHRoZSByZXN1bHQgb3IgcmV0dXJuIG51bGwuCitWYWx1ZSAqU2ltcGxpZnlTRGl2SW5zdChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhIFVEaXYsIGZvbGQgdGhlIHJlc3VsdCBvciByZXR1cm4gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeVVEaXZJbnN0KFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGFuIEZEaXYsIGZvbGQgdGhlIHJlc3VsdCBvciByZXR1cm4gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeUZEaXZJbnN0KFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIEZhc3RNYXRoRmxhZ3MgRk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBvcGVyYW5kcyBmb3IgYW4gU1JlbSwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5U1JlbUluc3QoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBvcGVyYW5kcyBmb3IgYSBVUmVtLCBmb2xkIHRoZSByZXN1bHQgb3IgcmV0dXJuIG51bGwuCitWYWx1ZSAqU2ltcGxpZnlVUmVtSW5zdChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhbiBGUmVtLCBmb2xkIHRoZSByZXN1bHQgb3IgcmV0dXJuIG51bGwuCitWYWx1ZSAqU2ltcGxpZnlGUmVtSW5zdChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBGYXN0TWF0aEZsYWdzIEZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGEgU2hsLCBmb2xkIHRoZSByZXN1bHQgb3IgcmV0dXJuIG51bGwuCitWYWx1ZSAqU2ltcGxpZnlTaGxJbnN0KFZhbHVlICpPcDAsIFZhbHVlICpPcDEsIGJvb2wgaXNOU1csIGJvb2wgaXNOVVcsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGEgTFNociwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5TFNockluc3QoVmFsdWUgKk9wMCwgVmFsdWUgKk9wMSwgYm9vbCBpc0V4YWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBvcGVyYW5kcyBmb3IgYSBBU2hyLCBmb2xkIHRoZSByZXN1bHQgb3IgcmV0dXJuIG51bGxsLgorVmFsdWUgKlNpbXBsaWZ5QVNockluc3QoVmFsdWUgKk9wMCwgVmFsdWUgKk9wMSwgYm9vbCBpc0V4YWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBvcGVyYW5kcyBmb3IgYW4gQW5kLCBmb2xkIHRoZSByZXN1bHQgb3IgcmV0dXJuIG51bGwuCitWYWx1ZSAqU2ltcGxpZnlBbmRJbnN0KFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGFuIE9yLCBmb2xkIHRoZSByZXN1bHQgb3IgcmV0dXJuIG51bGwuCitWYWx1ZSAqU2ltcGxpZnlPckluc3QoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBvcGVyYW5kcyBmb3IgYW4gWG9yLCBmb2xkIHRoZSByZXN1bHQgb3IgcmV0dXJuIG51bGwuCitWYWx1ZSAqU2ltcGxpZnlYb3JJbnN0KFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGFuIElDbXBJbnN0LCBmb2xkIHRoZSByZXN1bHQgb3IgcmV0dXJuIG51bGwuCitWYWx1ZSAqU2ltcGxpZnlJQ21wSW5zdCh1bnNpZ25lZCBQcmVkaWNhdGUsIFZhbHVlICpMSFMsIFZhbHVlICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhbiBGQ21wSW5zdCwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5RkNtcEluc3QodW5zaWduZWQgUHJlZGljYXRlLCBWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgRmFzdE1hdGhGbGFncyBGTUYsIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGEgU2VsZWN0SW5zdCwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5U2VsZWN0SW5zdChWYWx1ZSAqQ29uZCwgVmFsdWUgKlRydWVWYWwsIFZhbHVlICpGYWxzZVZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBvcGVyYW5kcyBmb3IgYSBHZXRFbGVtZW50UHRySW5zdCwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5R0VQSW5zdChUeXBlICpTcmNUeSwgQXJyYXlSZWY8VmFsdWUgKj4gT3BzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhbiBJbnNlcnRWYWx1ZUluc3QsIGZvbGQgdGhlIHJlc3VsdCBvciByZXR1cm4gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeUluc2VydFZhbHVlSW5zdChWYWx1ZSAqQWdnLCBWYWx1ZSAqVmFsLCBBcnJheVJlZjx1bnNpZ25lZD4gSWR4cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhbiBJbnNlcnRFbGVtZW50LCBmb2xkIHRoZSByZXN1bHQgb3IgcmV0dXJuIG51bGwuCitWYWx1ZSAqU2ltcGxpZnlJbnNlcnRFbGVtZW50SW5zdChWYWx1ZSAqVmVjLCBWYWx1ZSAqRWx0LCBWYWx1ZSAqSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBvcGVyYW5kcyBmb3IgYW4gRXh0cmFjdFZhbHVlSW5zdCwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5RXh0cmFjdFZhbHVlSW5zdChWYWx1ZSAqQWdnLCBBcnJheVJlZjx1bnNpZ25lZD4gSWR4cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBvcGVyYW5kcyBmb3IgYW4gRXh0cmFjdEVsZW1lbnRJbnN0LCBmb2xkIHRoZSByZXN1bHQgb3IgcmV0dXJuIG51bGwuCitWYWx1ZSAqU2ltcGxpZnlFeHRyYWN0RWxlbWVudEluc3QoVmFsdWUgKlZlYywgVmFsdWUgKklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRKTsKKworLy8vIEdpdmVuIG9wZXJhbmRzIGZvciBhIENhc3RJbnN0LCBmb2xkIHRoZSByZXN1bHQgb3IgcmV0dXJuIG51bGwuCitWYWx1ZSAqU2ltcGxpZnlDYXN0SW5zdCh1bnNpZ25lZCBDYXN0T3BjLCBWYWx1ZSAqT3AsIFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBvcGVyYW5kcyBmb3IgYSBTaHVmZmxlVmVjdG9ySW5zdCwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5U2h1ZmZsZVZlY3Rvckluc3QoVmFsdWUgKk9wMCwgVmFsdWUgKk9wMSwgQ29uc3RhbnQgKk1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpSZXRUeSwgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vPT09IEhlbHBlciBmdW5jdGlvbnMgZm9yIGhpZ2hlciB1cCB0aGUgY2xhc3MgaGllcmFyY2h5LgorCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGEgQ21wSW5zdCwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5Q21wSW5zdCh1bnNpZ25lZCBQcmVkaWNhdGUsIFZhbHVlICpMSFMsIFZhbHVlICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGEgQmluYXJ5T3BlcmF0b3IsIGZvbGQgdGhlIHJlc3VsdCBvciByZXR1cm4gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeUJpbk9wKHVuc2lnbmVkIE9wY29kZSwgVmFsdWUgKkxIUywgVmFsdWUgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gb3BlcmFuZHMgZm9yIGFuIEZQIEJpbmFyeU9wZXJhdG9yLCBmb2xkIHRoZSByZXN1bHQgb3IgcmV0dXJuIG51bGwuCisvLy8gSW4gY29udHJhc3QgdG8gU2ltcGxpZnlCaW5PcCwgdHJ5IHRvIHVzZSBGYXN0TWF0aEZsYWcgd2hlbiBmb2xkaW5nIHRoZQorLy8vIHJlc3VsdC4gSW4gY2FzZSB3ZSBkb24ndCBuZWVkIEZhc3RNYXRoRmxhZ3MsIHNpbXBseSBmYWxsIHRvIFNpbXBsaWZ5QmluT3AuCitWYWx1ZSAqU2ltcGxpZnlGUEJpbk9wKHVuc2lnbmVkIE9wY29kZSwgVmFsdWUgKkxIUywgVmFsdWUgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgRmFzdE1hdGhGbGFncyBGTUYsIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gYSBjYWxsc2l0ZSwgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5Q2FsbChJbW11dGFibGVDYWxsU2l0ZSBDUywgY29uc3QgU2ltcGxpZnlRdWVyeSAmUSk7CisKKy8vLyBHaXZlbiBhIGZ1bmN0aW9uIGFuZCBpdGVyYXRvcnMgb3ZlciBhcmd1bWVudHMsIGZvbGQgdGhlIHJlc3VsdCBvciByZXR1cm4KKy8vLyBudWxsLgorVmFsdWUgKlNpbXBsaWZ5Q2FsbChJbW11dGFibGVDYWxsU2l0ZSBDUywgVmFsdWUgKlYsIFVzZXI6Om9wX2l0ZXJhdG9yIEFyZ0JlZ2luLAorICAgICAgICAgICAgICAgICAgICBVc2VyOjpvcF9pdGVyYXRvciBBcmdFbmQsIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gR2l2ZW4gYSBmdW5jdGlvbiBhbmQgc2V0IG9mIGFyZ3VtZW50cywgZm9sZCB0aGUgcmVzdWx0IG9yIHJldHVybiBudWxsLgorVmFsdWUgKlNpbXBsaWZ5Q2FsbChJbW11dGFibGVDYWxsU2l0ZSBDUywgVmFsdWUgKlYsIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpbXBsaWZ5UXVlcnkgJlEpOworCisvLy8gU2VlIGlmIHdlIGNhbiBjb21wdXRlIGEgc2ltcGxpZmllZCB2ZXJzaW9uIG9mIHRoaXMgaW5zdHJ1Y3Rpb24uIElmIG5vdCwKKy8vLyByZXR1cm4gbnVsbC4KK1ZhbHVlICpTaW1wbGlmeUluc3RydWN0aW9uKEluc3RydWN0aW9uICpJLCBjb25zdCBTaW1wbGlmeVF1ZXJ5ICZRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciAqT1JFID0gbnVsbHB0cik7CisKKy8vLyBSZXBsYWNlIGFsbCB1c2VzIG9mICdJJyB3aXRoICdTaW1wbGVWJyBhbmQgc2ltcGxpZnkgdGhlIHVzZXMgcmVjdXJzaXZlbHkuCisvLy8KKy8vLyBUaGlzIGZpcnN0IHBlcmZvcm1zIGEgbm9ybWFsIFJBVVcgb2YgSSB3aXRoIFNpbXBsZVYuIEl0IHRoZW4gcmVjdXJzaXZlbHkKKy8vLyBhdHRlbXB0cyB0byBzaW1wbGlmeSB0aG9zZSB1c2VycyB1cGRhdGVkIGJ5IHRoZSBvcGVyYXRpb24uIFRoZSAnSScKKy8vLyBpbnN0cnVjdGlvbiBtdXN0IG5vdCBiZSBlcXVhbCB0byB0aGUgc2ltcGxpZmllZCB2YWx1ZSAnU2ltcGxlVicuCisvLy8KKy8vLyBUaGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIGFueSBzaW1wbGlmaWNhdGlvbnMgd2VyZSBwZXJmb3JtZWQuCitib29sIHJlcGxhY2VBbmRSZWN1cnNpdmVseVNpbXBsaWZ5KEluc3RydWN0aW9uICpJLCBWYWx1ZSAqU2ltcGxlViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzdW1wdGlvbkNhY2hlICpBQyA9IG51bGxwdHIpOworCisvLy8gUmVjdXJzaXZlbHkgYXR0ZW1wdCB0byBzaW1wbGlmeSBhbiBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFRoaXMgcm91dGluZSB1c2VzIFNpbXBsaWZ5SW5zdHJ1Y3Rpb24gdG8gc2ltcGxpZnkgJ0knLCBhbmQgaWYgc3VjY2Vzc2Z1bAorLy8vIHJlcGxhY2VzIHVzZXMgb2YgJ0knIHdpdGggdGhlIHNpbXBsaWZpZWQgdmFsdWUuIEl0IHRoZW4gcmVjdXJzZXMgb24gZWFjaAorLy8vIG9mIHRoZSB1c2VycyBpbXBhY3RlZC4gSXQgcmV0dXJucyB0cnVlIGlmIGFueSBzaW1wbGlmaWNhdGlvbnMgd2VyZQorLy8vIHBlcmZvcm1lZC4KK2Jvb2wgcmVjdXJzaXZlbHlTaW1wbGlmeUluc3RydWN0aW9uKEluc3RydWN0aW9uICpJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3N1bXB0aW9uQ2FjaGUgKkFDID0gbnVsbHB0cik7CisKKy8vIFRoZXNlIGhlbHBlciBmdW5jdGlvbnMgcmV0dXJuIGEgU2ltcGxpZnlRdWVyeSBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyBhcworLy8gbWFueSBvZiB0aGUgb3B0aW9uYWwgYW5hbHlzaXMgd2UgdXNlIGFzIGFyZSBjdXJyZW50bHkgdmFsaWQuICBUaGlzIGlzIHRoZQorLy8gc3Ryb25nbHkgcHJlZmVycmVkIHdheSBvZiBjb25zdHJ1Y3RpbmcgU2ltcGxpZnlRdWVyeSBpbiBwYXNzZXMuCitjb25zdCBTaW1wbGlmeVF1ZXJ5IGdldEJlc3RTaW1wbGlmeVF1ZXJ5KFBhc3MgJiwgRnVuY3Rpb24gJik7Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MuLi4gVEFyZ3M+Citjb25zdCBTaW1wbGlmeVF1ZXJ5IGdldEJlc3RTaW1wbGlmeVF1ZXJ5KEFuYWx5c2lzTWFuYWdlcjxULCBUQXJncy4uLj4gJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gJik7Citjb25zdCBTaW1wbGlmeVF1ZXJ5IGdldEJlc3RTaW1wbGlmeVF1ZXJ5KExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICYpOworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSW50ZXJ2YWwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSW50ZXJ2YWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzcxNGRkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbnRlcnZhbC5oCkBAIC0wLDAgKzEsMTQyIEBACisvLz09PS0gbGx2bS9BbmFseXNpcy9JbnRlcnZhbC5oIC0gSW50ZXJ2YWwgQ2xhc3MgRGVjbGFyYXRpb24gLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIEludGVydmFsIGNsYXNzLCB3aGljaAorLy8gcmVwcmVzZW50cyBhIHNldCBvZiBDRkcgbm9kZXMgYW5kIGlzIGEgcG9ydGlvbiBvZiBhbiBpbnRlcnZhbCBwYXJ0aXRpb24uCisvLworLy8gSW50ZXJ2YWxzIGhhdmUgc29tZSBpbnRlcmVzdGluZyBhbmQgdXNlZnVsIHByb3BlcnRpZXMsIGluY2x1ZGluZyB0aGUKKy8vIGZvbGxvd2luZzoKKy8vICAgIDEuIFRoZSBoZWFkZXIgbm9kZSBvZiBhbiBpbnRlcnZhbCBkb21pbmF0ZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUKKy8vICAgICAgIGludGVydmFsCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0lOVEVSVkFMX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19JTlRFUlZBTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIEludGVydmFsIENsYXNzIC0gQW4gSW50ZXJ2YWwgaXMgYSBzZXQgb2Ygbm9kZXMgZGVmaW5lZCBzdWNoIHRoYXQgZXZlcnkgbm9kZQorLy8vIGluIHRoZSBpbnRlcnZhbCBoYXMgYWxsIG9mIGl0cyBwcmVkZWNlc3NvcnMgaW4gdGhlIGludGVydmFsIChleGNlcHQgZm9yIHRoZQorLy8vIGhlYWRlcikKKy8vLworY2xhc3MgSW50ZXJ2YWwgeworICAvLy8gSGVhZGVyTm9kZSAtIFRoZSBoZWFkZXIgQmFzaWNCbG9jaywgd2hpY2ggZG9taW5hdGVzIGFsbCBCYXNpY0Jsb2NrcyBpbiB0aGlzCisgIC8vLyBpbnRlcnZhbC4gIEFsc28sIGFueSBsb29wcyBpbiB0aGlzIGludGVydmFsIG11c3QgZ28gdGhyb3VnaCB0aGUgSGVhZGVyTm9kZS4KKyAgLy8vCisgIEJhc2ljQmxvY2sgKkhlYWRlck5vZGU7CisKK3B1YmxpYzoKKyAgdXNpbmcgc3VjY19pdGVyYXRvciA9IHN0ZDo6dmVjdG9yPEJhc2ljQmxvY2sqPjo6aXRlcmF0b3I7CisgIHVzaW5nIHByZWRfaXRlcmF0b3IgPSBzdGQ6OnZlY3RvcjxCYXNpY0Jsb2NrKj46Oml0ZXJhdG9yOworICB1c2luZyBub2RlX2l0ZXJhdG9yID0gc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+OjppdGVyYXRvcjsKKworICBpbmxpbmUgSW50ZXJ2YWwoQmFzaWNCbG9jayAqSGVhZGVyKSA6IEhlYWRlck5vZGUoSGVhZGVyKSB7CisgICAgTm9kZXMucHVzaF9iYWNrKEhlYWRlcik7CisgIH0KKworICBpbmxpbmUgQmFzaWNCbG9jayAqZ2V0SGVhZGVyTm9kZSgpIGNvbnN0IHsgcmV0dXJuIEhlYWRlck5vZGU7IH0KKworICAvLy8gTm9kZXMgLSBUaGUgYmFzaWMgYmxvY2tzIGluIHRoaXMgaW50ZXJ2YWwuCisgIHN0ZDo6dmVjdG9yPEJhc2ljQmxvY2sqPiBOb2RlczsKKworICAvLy8gU3VjY2Vzc29ycyAtIExpc3Qgb2YgQmFzaWNCbG9ja3MgdGhhdCBhcmUgcmVhY2hhYmxlIGRpcmVjdGx5IGZyb20gbm9kZXMgaW4KKyAgLy8vIHRoaXMgaW50ZXJ2YWwsIGJ1dCBhcmUgbm90IGluIHRoZSBpbnRlcnZhbCB0aGVtc2VsdmVzLgorICAvLy8gVGhlc2Ugbm9kZXMgbmVjZXNzYXJpbHkgbXVzdCBiZSBoZWFkZXIgbm9kZXMgZm9yIG90aGVyIGludGVydmFscy4KKyAgc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+IFN1Y2Nlc3NvcnM7CisKKyAgLy8vIFByZWRlY2Vzc29ycyAtIExpc3Qgb2YgQmFzaWNCbG9ja3MgdGhhdCBoYXZlIHRoaXMgSW50ZXJ2YWwncyBoZWFkZXIgYmxvY2sKKyAgLy8vIGFzIG9uZSBvZiB0aGVpciBzdWNjZXNzb3JzLgorICBzdGQ6OnZlY3RvcjxCYXNpY0Jsb2NrKj4gUHJlZGVjZXNzb3JzOworCisgIC8vLyBjb250YWlucyAtIEZpbmQgb3V0IGlmIGEgYmFzaWMgYmxvY2sgaXMgaW4gdGhpcyBpbnRlcnZhbAorICBpbmxpbmUgYm9vbCBjb250YWlucyhCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIGZvciAoQmFzaWNCbG9jayAqTm9kZSA6IE5vZGVzKQorICAgICAgaWYgKE5vZGUgPT0gQkIpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBJIGRvbid0IHdhbnQgdGhlIGRlcGVuZGVuY3kgb24gPGFsZ29yaXRobT4KKyAgICAvL3JldHVybiBmaW5kKE5vZGVzLmJlZ2luKCksIE5vZGVzLmVuZCgpLCBCQikgIT0gTm9kZXMuZW5kKCk7CisgIH0KKworICAvLy8gaXNTdWNjZXNzb3IgLSBmaW5kIG91dCBpZiBhIGJhc2ljIGJsb2NrIGlzIGEgc3VjY2Vzc29yIG9mIHRoaXMgSW50ZXJ2YWwKKyAgaW5saW5lIGJvb2wgaXNTdWNjZXNzb3IoQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICBmb3IgKEJhc2ljQmxvY2sgKlN1Y2Nlc3NvciA6IFN1Y2Nlc3NvcnMpCisgICAgICBpZiAoU3VjY2Vzc29yID09IEJCKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gSSBkb24ndCB3YW50IHRoZSBkZXBlbmRlbmN5IG9uIDxhbGdvcml0aG0+CisgICAgLy9yZXR1cm4gZmluZChTdWNjZXNzb3JzLmJlZ2luKCksIFN1Y2Nlc3NvcnMuZW5kKCksIEJCKSAhPSBTdWNjZXNzb3JzLmVuZCgpOworICB9CisKKyAgLy8vIEVxdWFsaXR5IG9wZXJhdG9yLiAgSXQgaXMgb25seSB2YWxpZCB0byBjb21wYXJlIHR3byBpbnRlcnZhbHMgZnJvbSB0aGUKKyAgLy8vIHNhbWUgcGFydGl0aW9uLCBiZWNhdXNlIG9mIHRoaXMsIGFsbCB3ZSBoYXZlIHRvIGNoZWNrIGlzIHRoZSBoZWFkZXIgbm9kZQorICAvLy8gZm9yIGVxdWFsaXR5LgorICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEludGVydmFsICZJKSBjb25zdCB7CisgICAgcmV0dXJuIEhlYWRlck5vZGUgPT0gSS5IZWFkZXJOb2RlOworICB9CisKKyAgLy8vIGlzTG9vcCAtIEZpbmQgb3V0IGlmIHRoZXJlIGlzIGEgYmFjayBlZGdlIGluIHRoaXMgaW50ZXJ2YWwuLi4KKyAgYm9vbCBpc0xvb3AoKSBjb25zdDsKKworICAvLy8gcHJpbnQgLSBTaG93IGNvbnRlbnRzIGluIGh1bWFuIHJlYWRhYmxlIGZvcm1hdC4uLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPKSBjb25zdDsKK307CisKKy8vLyBzdWNjX2JlZ2luL3N1Y2NfZW5kIC0gZGVmaW5lIG1ldGhvZHMgc28gdGhhdCBJbnRlcnZhbHMgbWF5IGJlIHVzZWQKKy8vLyBqdXN0IGxpa2UgQmFzaWNCbG9ja3MgY2FuIHdpdGggdGhlIHN1Y2NfKiBmdW5jdGlvbnMsIGFuZCAqOjpzdWNjX2l0ZXJhdG9yLgorLy8vCitpbmxpbmUgSW50ZXJ2YWw6OnN1Y2NfaXRlcmF0b3Igc3VjY19iZWdpbihJbnRlcnZhbCAqSSkgeworICByZXR1cm4gSS0+U3VjY2Vzc29ycy5iZWdpbigpOworfQoraW5saW5lIEludGVydmFsOjpzdWNjX2l0ZXJhdG9yIHN1Y2NfZW5kKEludGVydmFsICpJKSAgIHsKKyAgcmV0dXJuIEktPlN1Y2Nlc3NvcnMuZW5kKCk7Cit9CisKKy8vLyBwcmVkX2JlZ2luL3ByZWRfZW5kIC0gZGVmaW5lIG1ldGhvZHMgc28gdGhhdCBJbnRlcnZhbHMgbWF5IGJlIHVzZWQKKy8vLyBqdXN0IGxpa2UgQmFzaWNCbG9ja3MgY2FuIHdpdGggdGhlIHByZWRfKiBmdW5jdGlvbnMsIGFuZCAqOjpwcmVkX2l0ZXJhdG9yLgorLy8vCitpbmxpbmUgSW50ZXJ2YWw6OnByZWRfaXRlcmF0b3IgcHJlZF9iZWdpbihJbnRlcnZhbCAqSSkgeworICByZXR1cm4gSS0+UHJlZGVjZXNzb3JzLmJlZ2luKCk7Cit9CitpbmxpbmUgSW50ZXJ2YWw6OnByZWRfaXRlcmF0b3IgcHJlZF9lbmQoSW50ZXJ2YWwgKkkpICAgeworICByZXR1cm4gSS0+UHJlZGVjZXNzb3JzLmVuZCgpOworfQorCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8SW50ZXJ2YWwqPiB7CisgIHVzaW5nIE5vZGVSZWYgPSBJbnRlcnZhbCAqOworICB1c2luZyBDaGlsZEl0ZXJhdG9yVHlwZSA9IEludGVydmFsOjpzdWNjX2l0ZXJhdG9yOworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShJbnRlcnZhbCAqSSkgeyByZXR1cm4gSTsgfQorCisgIC8vLyBub2Rlc19pdGVyYXRvci9iZWdpbi9lbmQgLSBBbGxvdyBpdGVyYXRpb24gb3ZlciBhbGwgbm9kZXMgaW4gdGhlIGdyYXBoCisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsgcmV0dXJuIHN1Y2NfYmVnaW4oTik7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlUmVmIE4pIHsgcmV0dXJuIHN1Y2NfZW5kKE4pOyB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8SW52ZXJzZTxJbnRlcnZhbCo+PiB7CisgIHVzaW5nIE5vZGVSZWYgPSBJbnRlcnZhbCAqOworICB1c2luZyBDaGlsZEl0ZXJhdG9yVHlwZSA9IEludGVydmFsOjpwcmVkX2l0ZXJhdG9yOworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShJbnZlcnNlPEludGVydmFsICo+IEcpIHsgcmV0dXJuIEcuR3JhcGg7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeyByZXR1cm4gcHJlZF9iZWdpbihOKTsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeyByZXR1cm4gcHJlZF9lbmQoTik7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX0lOVEVSVkFMX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSW50ZXJ2YWxJdGVyYXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbnRlcnZhbEl0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZmY2FlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvSW50ZXJ2YWxJdGVyYXRvci5oCkBAIC0wLDAgKzEsMjY4IEBACisvLz09PS0gSW50ZXJ2YWxJdGVyYXRvci5oIC0gSW50ZXJ2YWwgSXRlcmF0b3IgRGVjbGFyYXRpb24gLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFuIGl0ZXJhdG9yIHRoYXQgZW51bWVyYXRlcyB0aGUgaW50ZXJ2YWxzIGluIGEgY29udHJvbCBmbG93CisvLyBncmFwaCBvZiBzb21lIHNvcnQuICBUaGlzIGl0ZXJhdG9yIGlzIHBhcmFtZXRyaWMsIGFsbG93aW5nIGl0ZXJhdG9yIG92ZXIgdGhlCisvLyBmb2xsb3dpbmcgdHlwZXMgb2YgZ3JhcGhzOgorLy8KKy8vICAxLiBBIEZ1bmN0aW9uKiBvYmplY3QsIGNvbXBvc2VkIG9mIEJhc2ljQmxvY2sgbm9kZXMuCisvLyAgMi4gQW4gSW50ZXJ2YWxQYXJ0aXRpb24mIG9iamVjdCwgY29tcG9zZWQgb2YgSW50ZXJ2YWwgbm9kZXMuCisvLworLy8gVGhpcyBpdGVyYXRvciBpcyBkZWZpbmVkIHRvIHdhbGsgdGhlIGNvbnRyb2wgZmxvdyBncmFwaCwgcmV0dXJuaW5nIGludGVydmFscworLy8gaW4gZGVwdGggZmlyc3Qgb3JkZXIuICBUaGVzZSBpbnRlcnZhbHMgYXJlIGNvbXBsZXRlbHkgZmlsbGVkIGluIGV4Y2VwdCBmb3IKKy8vIHRoZSBwcmVkZWNlc3NvciBmaWVsZHMgKHRoZSBzdWNjZXNzb3IgaW5mb3JtYXRpb24gaXMgZmlsbGVkIGluIGhvd2V2ZXIpLgorLy8KKy8vIEJ5IGRlZmF1bHQsIHRoZSBpbnRlcnZhbHMgY3JlYXRlZCBieSB0aGlzIGl0ZXJhdG9yIGFyZSBkZWxldGVkIGFmdGVyIHRoZXkKKy8vIGFyZSBubyBsb25nZXIgYW55IHVzZSB0byB0aGUgaXRlcmF0b3IuICBUaGlzIGJlaGF2aW9yIGNhbiBiZSBjaGFuZ2VkIGJ5CisvLyBwYXNzaW5nIGEgZmFsc2UgdmFsdWUgaW50byB0aGUgaW50ZXJ2YWxzX2JlZ2luKCkgZnVuY3Rpb24uIFRoaXMgY2F1c2VzIHRoZQorLy8gSU93bk1lbSBtZW1iZXIgdG8gYmUgc2V0LCBhbmQgdGhlIGludGVydmFscyB0byBub3QgYmUgZGVsZXRlZC4KKy8vCisvLyBJdCBpcyBvbmx5IHNhZmUgdG8gdXNlIHRoaXMgaWYgYWxsIG9mIHRoZSBpbnRlcnZhbHMgYXJlIGRlbGV0ZWQgYnkgdGhlIGNhbGxlcgorLy8gYW5kIGFsbCBvZiB0aGUgaW50ZXJ2YWxzIGFyZSBwcm9jZXNzZWQuICBIb3dldmVyLCB0aGUgdXNlciBvZiB0aGUgaXRlcmF0b3IgaXMKKy8vIG5vdCBhbGxvd2VkIHRvIG1vZGlmeSBvciBkZWxldGUgdGhlIGludGVydmFscyB1bnRpbCBhZnRlciB0aGUgaXRlcmF0b3IgaGFzCisvLyBiZWVuIHVzZWQgY29tcGxldGVseS4gIFRoZSBJbnRlcnZhbFBhcnRpdGlvbiBjbGFzcyB1c2VzIHRoaXMgZnVuY3Rpb25hbGl0eS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfSU5URVJWQUxJVEVSQVRPUl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfSU5URVJWQUxJVEVSQVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvSW50ZXJ2YWwuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0ludGVydmFsUGFydGl0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DRkcuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmFzaWNCbG9jazsKKworLy8gZ2V0Tm9kZUhlYWRlciAtIEdpdmVuIGEgc291cmNlIGdyYXBoIG5vZGUgYW5kIHRoZSBzb3VyY2UgZ3JhcGgsIHJldHVybiB0aGUKKy8vIEJhc2ljQmxvY2sgdGhhdCBpcyB0aGUgaGVhZGVyIG5vZGUuICBUaGlzIGlzIHRoZSBvcHBvc2l0ZSBvZgorLy8gZ2V0U291cmNlR3JhcGhOb2RlLgoraW5saW5lIEJhc2ljQmxvY2sgKmdldE5vZGVIZWFkZXIoQmFzaWNCbG9jayAqQkIpIHsgcmV0dXJuIEJCOyB9CitpbmxpbmUgQmFzaWNCbG9jayAqZ2V0Tm9kZUhlYWRlcihJbnRlcnZhbCAqSSkgeyByZXR1cm4gSS0+Z2V0SGVhZGVyTm9kZSgpOyB9CisKKy8vIGdldFNvdXJjZUdyYXBoTm9kZSAtIEdpdmVuIGEgQmFzaWNCbG9jayBhbmQgdGhlIHNvdXJjZSBncmFwaCwgcmV0dXJuIHRoZQorLy8gc291cmNlIGdyYXBoIG5vZGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgQmFzaWNCbG9jay4gIFRoaXMgaXMgdGhlIG9wcG9zaXRlCisvLyBvZiBnZXROb2RlSGVhZGVyLgoraW5saW5lIEJhc2ljQmxvY2sgKmdldFNvdXJjZUdyYXBoTm9kZShGdW5jdGlvbiAqLCBCYXNpY0Jsb2NrICpCQikgeworICByZXR1cm4gQkI7Cit9CitpbmxpbmUgSW50ZXJ2YWwgKmdldFNvdXJjZUdyYXBoTm9kZShJbnRlcnZhbFBhcnRpdGlvbiAqSVAsIEJhc2ljQmxvY2sgKkJCKSB7CisgIHJldHVybiBJUC0+Z2V0QmxvY2tJbnRlcnZhbChCQik7Cit9CisKKy8vIGFkZE5vZGVUb0ludGVydmFsIC0gVGhpcyBtZXRob2QgZXhpc3RzIHRvIGFzc2lzdCB0aGUgZ2VuZXJpYyBQcm9jZXNzTm9kZQorLy8gd2l0aCB0aGUgdGFzayBvZiBhZGRpbmcgYSBub2RlIHRvIHRoZSBuZXcgaW50ZXJ2YWwsIGRlcGVuZGluZyBvbiB0aGUKKy8vIHR5cGUgb2YgdGhlIHNvdXJjZSBub2RlLiAgSW4gdGhlIGNhc2Ugb2YgYSBDRkcgc291cmNlIGdyYXBoIChCYXNpY0Jsb2NrCisvLyBjYXNlKSwgdGhlIEJhc2ljQmxvY2sgaXRzZWxmIGlzIGFkZGVkIHRvIHRoZSBpbnRlcnZhbC4KK2lubGluZSB2b2lkIGFkZE5vZGVUb0ludGVydmFsKEludGVydmFsICpJbnQsIEJhc2ljQmxvY2sgKkJCKSB7CisgIEludC0+Tm9kZXMucHVzaF9iYWNrKEJCKTsKK30KKworLy8gYWRkTm9kZVRvSW50ZXJ2YWwgLSBUaGlzIG1ldGhvZCBleGlzdHMgdG8gYXNzaXN0IHRoZSBnZW5lcmljIFByb2Nlc3NOb2RlCisvLyB3aXRoIHRoZSB0YXNrIG9mIGFkZGluZyBhIG5vZGUgdG8gdGhlIG5ldyBpbnRlcnZhbCwgZGVwZW5kaW5nIG9uIHRoZQorLy8gdHlwZSBvZiB0aGUgc291cmNlIG5vZGUuICBJbiB0aGUgY2FzZSBvZiBhIENGRyBzb3VyY2UgZ3JhcGggKEJhc2ljQmxvY2sKKy8vIGNhc2UpLCB0aGUgQmFzaWNCbG9jayBpdHNlbGYgaXMgYWRkZWQgdG8gdGhlIGludGVydmFsLiAgSW4gdGhlIGNhc2Ugb2YKKy8vIGFuIEludGVydmFsUGFydGl0aW9uIHNvdXJjZSBncmFwaCAoSW50ZXJ2YWwgY2FzZSksIGFsbCBvZiB0aGUgbWVtYmVyCisvLyBCYXNpY0Jsb2NrcyBhcmUgYWRkZWQgdG8gdGhlIGludGVydmFsLgoraW5saW5lIHZvaWQgYWRkTm9kZVRvSW50ZXJ2YWwoSW50ZXJ2YWwgKkludCwgSW50ZXJ2YWwgKkkpIHsKKyAgLy8gQWRkIGFsbCBvZiB0aGUgbm9kZXMgaW4gSSBhcyBuZXcgbm9kZXMgaW4gSW50LgorICBJbnQtPk5vZGVzLmluc2VydChJbnQtPk5vZGVzLmVuZCgpLCBJLT5Ob2Rlcy5iZWdpbigpLCBJLT5Ob2Rlcy5lbmQoKSk7Cit9CisKK3RlbXBsYXRlPGNsYXNzIE5vZGVUeSwgY2xhc3MgT3JpZ0NvbnRhaW5lcl90LCBjbGFzcyBHVCA9IEdyYXBoVHJhaXRzPE5vZGVUeSAqPiwKKyAgICAgICAgIGNsYXNzIElHVCA9IEdyYXBoVHJhaXRzPEludmVyc2U8Tm9kZVR5ICo+Pj4KK2NsYXNzIEludGVydmFsSXRlcmF0b3IgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8SW50ZXJ2YWwgKiwgdHlwZW5hbWUgSW50ZXJ2YWw6OnN1Y2NfaXRlcmF0b3I+PiBJbnRTdGFjazsKKyAgc3RkOjpzZXQ8QmFzaWNCbG9jayAqPiBWaXNpdGVkOworICBPcmlnQ29udGFpbmVyX3QgKk9yaWdDb250YWluZXI7CisgIGJvb2wgSU93bk1lbTsgICAgIC8vIElmIFRydWUsIGRlbGV0ZSBpbnRlcnZhbHMgd2hlbiBkb25lIHdpdGggdGhlbQorICAgICAgICAgICAgICAgICAgICAvLyBTZWUgZmlsZSBoZWFkZXIgZm9yIGNvbmRpdGlvbnMgb2YgdXNlCisKK3B1YmxpYzoKKyAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnOworCisgIEludGVydmFsSXRlcmF0b3IoKSA9IGRlZmF1bHQ7IC8vIEVuZCBpdGVyYXRvciwgZW1wdHkgc3RhY2sKKworICBJbnRlcnZhbEl0ZXJhdG9yKEZ1bmN0aW9uICpNLCBib29sIE93bk1lbW9yeSkgOiBJT3duTWVtKE93bk1lbW9yeSkgeworICAgIE9yaWdDb250YWluZXIgPSBNOworICAgIGlmICghUHJvY2Vzc0ludGVydmFsKCZNLT5mcm9udCgpKSkgeworICAgICAgbGx2bV91bnJlYWNoYWJsZSgiUHJvY2Vzc0ludGVydmFsIHNob3VsZCBuZXZlciBmYWlsIGZvciBmaXJzdCBpbnRlcnZhbCEiKTsKKyAgICB9CisgIH0KKworICBJbnRlcnZhbEl0ZXJhdG9yKEludGVydmFsSXRlcmF0b3IgJiZ4KQorICAgICAgOiBJbnRTdGFjayhzdGQ6Om1vdmUoeC5JbnRTdGFjaykpLCBWaXNpdGVkKHN0ZDo6bW92ZSh4LlZpc2l0ZWQpKSwKKyAgICAgICAgT3JpZ0NvbnRhaW5lcih4Lk9yaWdDb250YWluZXIpLCBJT3duTWVtKHguSU93bk1lbSkgeworICAgIHguSU93bk1lbSA9IGZhbHNlOworICB9CisKKyAgSW50ZXJ2YWxJdGVyYXRvcihJbnRlcnZhbFBhcnRpdGlvbiAmSVAsIGJvb2wgT3duTWVtb3J5KSA6IElPd25NZW0oT3duTWVtb3J5KSB7CisgICAgT3JpZ0NvbnRhaW5lciA9ICZJUDsKKyAgICBpZiAoIVByb2Nlc3NJbnRlcnZhbChJUC5nZXRSb290SW50ZXJ2YWwoKSkpIHsKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlByb2Nlc3NJbnRlcnZhbCBzaG91bGQgbmV2ZXIgZmFpbCBmb3IgZmlyc3QgaW50ZXJ2YWwhIik7CisgICAgfQorICB9CisKKyAgfkludGVydmFsSXRlcmF0b3IoKSB7CisgICAgaWYgKElPd25NZW0pCisgICAgICB3aGlsZSAoIUludFN0YWNrLmVtcHR5KCkpIHsKKyAgICAgICAgZGVsZXRlIG9wZXJhdG9yKigpOworICAgICAgICBJbnRTdGFjay5wb3BfYmFjaygpOworICAgICAgfQorICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEludGVydmFsSXRlcmF0b3IgJngpIGNvbnN0IHsKKyAgICByZXR1cm4gSW50U3RhY2sgPT0geC5JbnRTdGFjazsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgSW50ZXJ2YWxJdGVyYXRvciAmeCkgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSB4KTsgfQorCisgIGNvbnN0IEludGVydmFsICpvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBJbnRTdGFjay5iYWNrKCkuZmlyc3Q7IH0KKyAgSW50ZXJ2YWwgKm9wZXJhdG9yKigpIHsgcmV0dXJuIEludFN0YWNrLmJhY2soKS5maXJzdDsgfQorICBjb25zdCBJbnRlcnZhbCAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG9wZXJhdG9yKigpOyB9CisgIEludGVydmFsICpvcGVyYXRvci0+KCkgeyByZXR1cm4gb3BlcmF0b3IqKCk7IH0KKworICBJbnRlcnZhbEl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeyAvLyBQcmVpbmNyZW1lbnQKKyAgICBhc3NlcnQoIUludFN0YWNrLmVtcHR5KCkgJiYgIkF0dGVtcHRpbmcgdG8gdXNlIGludGVydmFsIGl0ZXJhdG9yIGF0IGVuZCEiKTsKKyAgICBkbyB7CisgICAgICAvLyBBbGwgb2YgdGhlIGludGVydmFscyBvbiB0aGUgc3RhY2sgaGF2ZSBiZWVuIHZpc2l0ZWQuICBUcnkgdmlzaXRpbmcKKyAgICAgIC8vIHRoZWlyIHN1Y2Nlc3NvcnMgbm93LgorICAgICAgSW50ZXJ2YWw6OnN1Y2NfaXRlcmF0b3IgJlN1Y2NJdCA9IEludFN0YWNrLmJhY2soKS5zZWNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVuZEl0ID0gc3VjY19lbmQoSW50U3RhY2suYmFjaygpLmZpcnN0KTsKKyAgICAgIHdoaWxlIChTdWNjSXQgIT0gRW5kSXQpIHsgICAgICAgICAgICAgICAgIC8vIExvb3Agb3ZlciBhbGwgaW50ZXJ2YWwgc3VjY3MKKyAgICAgICAgYm9vbCBEb25lID0gUHJvY2Vzc0ludGVydmFsKGdldFNvdXJjZUdyYXBoTm9kZShPcmlnQ29udGFpbmVyLCAqU3VjY0l0KSk7CisgICAgICAgICsrU3VjY0l0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbmNyZW1lbnQgaXRlcmF0b3IKKyAgICAgICAgaWYgKERvbmUpIHJldHVybiAqdGhpczsgICAgICAgICAgICAgICAgIC8vIEZvdW5kIGEgbmV3IGludGVydmFsISBVc2UgaXQhCisgICAgICB9CisKKyAgICAgIC8vIEZyZWUgaW50ZXJ2YWwgbWVtb3J5Li4uIGlmIG5lY2Vzc2FyeQorICAgICAgaWYgKElPd25NZW0pIGRlbGV0ZSBJbnRTdGFjay5iYWNrKCkuZmlyc3Q7CisKKyAgICAgIC8vIFdlIHJhbiBvdXQgb2Ygc3VjY2Vzc29ycyBmb3IgdGhpcyBpbnRlcnZhbC4uLiBwb3Agb2ZmIHRoZSBzdGFjaworICAgICAgSW50U3RhY2sucG9wX2JhY2soKTsKKyAgICB9IHdoaWxlICghSW50U3RhY2suZW1wdHkoKSk7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBJbnRlcnZhbEl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7IC8vIFBvc3RpbmNyZW1lbnQKKyAgICBJbnRlcnZhbEl0ZXJhdG9yIHRtcCA9ICp0aGlzOworICAgICsrKnRoaXM7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorCitwcml2YXRlOgorICAvLyBQcm9jZXNzSW50ZXJ2YWwgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIGR1cmluZyB0aGUgY29uc3RydWN0aW9uIG9mIHRoZQorICAvLyBpbnRlcnZhbCBncmFwaC4gIEl0IHdhbGtzIHRocm91Z2ggdGhlIHNvdXJjZSBncmFwaCwgcmVjdXJzaXZlbHkgY3JlYXRpbmcKKyAgLy8gYW4gaW50ZXJ2YWwgcGVyIGludm9jYXRpb24gdW50aWwgdGhlIGVudGlyZSBncmFwaCBpcyBjb3ZlcmVkLiAgVGhpcyB1c2VzCisgIC8vIHRoZSBQcm9jZXNzTm9kZSBtZXRob2QgdG8gYWRkIGFsbCBvZiB0aGUgbm9kZXMgdG8gdGhlIGludGVydmFsLgorICAvLworICAvLyBUaGlzIG1ldGhvZCBpcyB0ZW1wbGF0ZWQgYmVjYXVzZSBpdCBtYXkgb3BlcmF0ZSBvbiB0d28gZGlmZmVyZW50IHNvdXJjZQorICAvLyBncmFwaHM6IGEgYmFzaWMgYmxvY2sgZ3JhcGgsIG9yIGEgcHJlZXhpc3RpbmcgaW50ZXJ2YWwgZ3JhcGguCisgIGJvb2wgUHJvY2Vzc0ludGVydmFsKE5vZGVUeSAqTm9kZSkgeworICAgIEJhc2ljQmxvY2sgKkhlYWRlciA9IGdldE5vZGVIZWFkZXIoTm9kZSk7CisgICAgaWYgKCFWaXNpdGVkLmluc2VydChIZWFkZXIpLnNlY29uZCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIEludGVydmFsICpJbnQgPSBuZXcgSW50ZXJ2YWwoSGVhZGVyKTsKKworICAgIC8vIENoZWNrIGFsbCBvZiBvdXIgc3VjY2Vzc29ycyB0byBzZWUgaWYgdGhleSBhcmUgaW4gdGhlIGludGVydmFsLi4uCisgICAgZm9yICh0eXBlbmFtZSBHVDo6Q2hpbGRJdGVyYXRvclR5cGUgSSA9IEdUOjpjaGlsZF9iZWdpbihOb2RlKSwKKyAgICAgICAgICAgRSA9IEdUOjpjaGlsZF9lbmQoTm9kZSk7IEkgIT0gRTsgKytJKQorICAgICAgUHJvY2Vzc05vZGUoSW50LCBnZXRTb3VyY2VHcmFwaE5vZGUoT3JpZ0NvbnRhaW5lciwgKkkpKTsKKworICAgIEludFN0YWNrLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihJbnQsIHN1Y2NfYmVnaW4oSW50KSkpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gUHJvY2Vzc05vZGUgLSBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgUHJvY2Vzc0ludGVydmFsIHRvIGFkZCBub2RlcyB0byB0aGUKKyAgLy8gaW50ZXJ2YWwgYmVpbmcgY29uc3RydWN0ZWQsIGFuZCBpdCBpcyBhbHNvIGNhbGxlZCByZWN1cnNpdmVseSBhcyBpdCB3YWxrcworICAvLyB0aGUgc291cmNlIGdyYXBoLiAgQSBub2RlIGlzIGFkZGVkIHRvIHRoZSBjdXJyZW50IGludGVydmFsIG9ubHkgaWYgYWxsIG9mCisgIC8vIGl0cyBwcmVkZWNlc3NvcnMgYXJlIGFscmVhZHkgaW4gdGhlIGdyYXBoLiAgVGhpcyBhbHNvIHRha2VzIGNhcmUgb2Yga2VlcGluZworICAvLyB0aGUgc3VjY2Vzc29yIHNldCBvZiBhbiBpbnRlcnZhbCB1cCB0byBkYXRlLgorICAvLworICAvLyBUaGlzIG1ldGhvZCBpcyB0ZW1wbGF0ZWQgYmVjYXVzZSBpdCBtYXkgb3BlcmF0ZSBvbiB0d28gZGlmZmVyZW50IHNvdXJjZQorICAvLyBncmFwaHM6IGEgYmFzaWMgYmxvY2sgZ3JhcGgsIG9yIGEgcHJlZXhpc3RpbmcgaW50ZXJ2YWwgZ3JhcGguCisgIHZvaWQgUHJvY2Vzc05vZGUoSW50ZXJ2YWwgKkludCwgTm9kZVR5ICpOb2RlKSB7CisgICAgYXNzZXJ0KEludCAmJiAiTnVsbCBpbnRlcnZhbCA9PSBiYWQhIik7CisgICAgYXNzZXJ0KE5vZGUgJiYgIk51bGwgTm9kZSA9PSBiYWQhIik7CisKKyAgICBCYXNpY0Jsb2NrICpOb2RlSGVhZGVyID0gZ2V0Tm9kZUhlYWRlcihOb2RlKTsKKworICAgIGlmIChWaXNpdGVkLmNvdW50KE5vZGVIZWFkZXIpKSB7ICAgICAvLyBOb2RlIGFscmVhZHkgYmVlbiB2aXNpdGVkPworICAgICAgaWYgKEludC0+Y29udGFpbnMoTm9kZUhlYWRlcikpIHsgICAvLyBBbHJlYWR5IGluIHRoaXMgaW50ZXJ2YWwuLi4KKyAgICAgICAgcmV0dXJuOworICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbiBvdGhlciBpbnRlcnZhbCwgYWRkIGFzIHN1Y2Nlc3NvcgorICAgICAgICBpZiAoIUludC0+aXNTdWNjZXNzb3IoTm9kZUhlYWRlcikpIC8vIEFkZCBvbmx5IGlmIG5vdCBhbHJlYWR5IGluIHNldAorICAgICAgICAgIEludC0+U3VjY2Vzc29ycy5wdXNoX2JhY2soTm9kZUhlYWRlcik7CisgICAgICB9CisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyd2lzZSwgbm90IGluIGludGVydmFsIHlldAorICAgICAgZm9yICh0eXBlbmFtZSBJR1Q6OkNoaWxkSXRlcmF0b3JUeXBlIEkgPSBJR1Q6OmNoaWxkX2JlZ2luKE5vZGUpLAorICAgICAgICAgICAgIEUgPSBJR1Q6OmNoaWxkX2VuZChOb2RlKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgaWYgKCFJbnQtPmNvbnRhaW5zKCpJKSkgeyAgICAgICAgLy8gSWYgcHJlZCBub3QgaW4gaW50ZXJ2YWwsIHdlIGNhbid0IGJlCisgICAgICAgICAgaWYgKCFJbnQtPmlzU3VjY2Vzc29yKE5vZGVIZWFkZXIpKSAvLyBBZGQgb25seSBpZiBub3QgYWxyZWFkeSBpbiBzZXQKKyAgICAgICAgICAgIEludC0+U3VjY2Vzc29ycy5wdXNoX2JhY2soTm9kZUhlYWRlcik7CisgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSB5b3UgbGF0ZXIKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBJZiB3ZSBnZXQgaGVyZSwgdGhlbiBhbGwgb2YgdGhlIHByZWRlY2Vzc29ycyBvZiBCQiBhcmUgaW4gdGhlIGludGVydmFsCisgICAgICAvLyBhbHJlYWR5LiAgSW4gdGhpcyBjYXNlLCB3ZSBtdXN0IGFkZCBCQiB0byB0aGUgaW50ZXJ2YWwhCisgICAgICBhZGROb2RlVG9JbnRlcnZhbChJbnQsIE5vZGUpOworICAgICAgVmlzaXRlZC5pbnNlcnQoTm9kZUhlYWRlcik7ICAgICAvLyBUaGUgbm9kZSBoYXMgbm93IGJlZW4gdmlzaXRlZCEKKworICAgICAgaWYgKEludC0+aXNTdWNjZXNzb3IoTm9kZUhlYWRlcikpIHsKKyAgICAgICAgLy8gSWYgd2Ugd2VyZSBpbiB0aGUgc3VjY2Vzc29yIGxpc3QgZnJvbSBiZWZvcmUuLi4gcmVtb3ZlIGZyb20gc3VjYyBsaXN0CisgICAgICAgIEludC0+U3VjY2Vzc29ycy5lcmFzZShzdGQ6OnJlbW92ZShJbnQtPlN1Y2Nlc3NvcnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludC0+U3VjY2Vzc29ycy5lbmQoKSwgTm9kZUhlYWRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnQtPlN1Y2Nlc3NvcnMuZW5kKCkpOworICAgICAgfQorCisgICAgICAvLyBOb3cgdGhhdCB3ZSBoYXZlIGRpc2NvdmVyZWQgdGhhdCBOb2RlIGlzIGluIHRoZSBpbnRlcnZhbCwgcGVyaGFwcyBzb21lCisgICAgICAvLyBvZiBpdHMgc3VjY2Vzc29ycyBhcmUgYXMgd2VsbD8KKyAgICAgIGZvciAodHlwZW5hbWUgR1Q6OkNoaWxkSXRlcmF0b3JUeXBlIEl0ID0gR1Q6OmNoaWxkX2JlZ2luKE5vZGUpLAorICAgICAgICAgICAgIEVuZCA9IEdUOjpjaGlsZF9lbmQoTm9kZSk7IEl0ICE9IEVuZDsgKytJdCkKKyAgICAgICAgUHJvY2Vzc05vZGUoSW50LCBnZXRTb3VyY2VHcmFwaE5vZGUoT3JpZ0NvbnRhaW5lciwgKkl0KSk7CisgICAgfQorICB9Cit9OworCit1c2luZyBmdW5jdGlvbl9pbnRlcnZhbF9pdGVyYXRvciA9IEludGVydmFsSXRlcmF0b3I8QmFzaWNCbG9jaywgRnVuY3Rpb24+OwordXNpbmcgaW50ZXJ2YWxfcGFydF9pbnRlcnZhbF9pdGVyYXRvciA9CisgICAgSW50ZXJ2YWxJdGVyYXRvcjxJbnRlcnZhbCwgSW50ZXJ2YWxQYXJ0aXRpb24+OworCitpbmxpbmUgZnVuY3Rpb25faW50ZXJ2YWxfaXRlcmF0b3IgaW50ZXJ2YWxzX2JlZ2luKEZ1bmN0aW9uICpGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERlbGV0ZUludHMgPSB0cnVlKSB7CisgIHJldHVybiBmdW5jdGlvbl9pbnRlcnZhbF9pdGVyYXRvcihGLCBEZWxldGVJbnRzKTsKK30KK2lubGluZSBmdW5jdGlvbl9pbnRlcnZhbF9pdGVyYXRvciBpbnRlcnZhbHNfZW5kKEZ1bmN0aW9uICopIHsKKyAgcmV0dXJuIGZ1bmN0aW9uX2ludGVydmFsX2l0ZXJhdG9yKCk7Cit9CisKK2lubGluZSBpbnRlcnZhbF9wYXJ0X2ludGVydmFsX2l0ZXJhdG9yCisgICBpbnRlcnZhbHNfYmVnaW4oSW50ZXJ2YWxQYXJ0aXRpb24gJklQLCBib29sIERlbGV0ZUludGVydmFscyA9IHRydWUpIHsKKyAgcmV0dXJuIGludGVydmFsX3BhcnRfaW50ZXJ2YWxfaXRlcmF0b3IoSVAsIERlbGV0ZUludGVydmFscyk7Cit9CisKK2lubGluZSBpbnRlcnZhbF9wYXJ0X2ludGVydmFsX2l0ZXJhdG9yIGludGVydmFsc19lbmQoSW50ZXJ2YWxQYXJ0aXRpb24gJklQKSB7CisgIHJldHVybiBpbnRlcnZhbF9wYXJ0X2ludGVydmFsX2l0ZXJhdG9yKCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX0lOVEVSVkFMSVRFUkFUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbnRlcnZhbFBhcnRpdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JbnRlcnZhbFBhcnRpdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUwMzM1MTYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0ludGVydmFsUGFydGl0aW9uLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8vPT09LSBJbnRlcnZhbFBhcnRpdGlvbi5oIC0gSW50ZXJ2YWwgcGFydGl0aW9uIENhbGN1bGF0aW9uIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgSW50ZXJ2YWxQYXJ0aXRpb24gY2xhc3MsIHdoaWNoCisvLyBjYWxjdWxhdGVzIGFuZCByZXByZXNlbnRzIHRoZSBpbnRlcnZhbCBwYXJ0aXRpb24gb2YgYSBmdW5jdGlvbiwgb3IgYQorLy8gcHJlZXhpc3RpbmcgaW50ZXJ2YWwgcGFydGl0aW9uLgorLy8KKy8vIEluIHRoaXMgd2F5LCB0aGUgaW50ZXJ2YWwgcGFydGl0aW9uIG1heSBiZSB1c2VkIHRvIHJlZHVjZSBhIGZsb3cgZ3JhcGggZG93bgorLy8gdG8gaXRzIGRlZ2VuZXJhdGUgc2luZ2xlIG5vZGUgaW50ZXJ2YWwgcGFydGl0aW9uICh1bmxlc3MgaXQgaXMgaXJyZWR1Y2libGUpLgorLy8KKy8vIFRPRE86IFRoZSBJbnRlcnZhbFBhcnRpdGlvbiBjbGFzcyBzaG91bGQgdGFrZSBhIGJvb2wgcGFyYW1ldGVyIHRoYXQgdGVsbHMKKy8vIHdoZXRoZXIgaXQgc2hvdWxkIGFkZCB0aGUgInRhaWxzIiBvZiBhbiBpbnRlcnZhbCB0byBhbiBpbnRlcnZhbCBpdHNlbGYgb3IgaWYKKy8vIHRoZXkgc2hvdWxkIGJlIHJlcHJlc2VudGVkIGFzIGRpc3RpbmN0IGludGVydmFscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfSU5URVJWQUxQQVJUSVRJT05fSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0lOVEVSVkFMUEFSVElUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIEludGVydmFsOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEludGVydmFsUGFydGl0aW9uIC0gVGhpcyBjbGFzcyBidWlsZHMgYW5kIGhvbGRzIGFuICJpbnRlcnZhbCBwYXJ0aXRpb24iIGZvcgorLy8gYSBmdW5jdGlvbi4gIFRoaXMgcGFydGl0aW9uIGRpdmlkZXMgdGhlIGNvbnRyb2wgZmxvdyBncmFwaCBpbnRvIGEgc2V0IG9mCisvLyBtYXhpbWFsIGludGVydmFscywgYXMgZGVmaW5lZCB3aXRoIHRoZSBwcm9wZXJ0aWVzIGFib3ZlLiAgSW50dWl0aXZlbHksIGFuCisvLyBpbnRlcnZhbCBpcyBhIChwb3NzaWJseSBub25leGlzdGVudCkgbG9vcCB3aXRoIGEgInRhaWwiIG9mIG5vbi1sb29waW5nCisvLyBub2RlcyBmb2xsb3dpbmcgaXQuCisvLworY2xhc3MgSW50ZXJ2YWxQYXJ0aXRpb24gOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgdXNpbmcgSW50ZXJ2YWxNYXBUeSA9IHN0ZDo6bWFwPEJhc2ljQmxvY2sgKiwgSW50ZXJ2YWwgKj47CisgIEludGVydmFsTWFwVHkgSW50ZXJ2YWxNYXA7CisKKyAgdXNpbmcgSW50ZXJ2YWxMaXN0VHkgPSBzdGQ6OnZlY3RvcjxJbnRlcnZhbCAqPjsKKyAgSW50ZXJ2YWwgKlJvb3RJbnRlcnZhbCA9IG51bGxwdHI7CisgIHN0ZDo6dmVjdG9yPEludGVydmFsICo+IEludGVydmFsczsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorCisgIEludGVydmFsUGFydGl0aW9uKCkgOiBGdW5jdGlvblBhc3MoSUQpIHsKKyAgICBpbml0aWFsaXplSW50ZXJ2YWxQYXJ0aXRpb25QYXNzKCpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpKTsKKyAgfQorCisgIC8vIHJ1biAtIENhbGN1bGF0ZSB0aGUgaW50ZXJ2YWwgcGFydGl0aW9uIGZvciB0aGlzIGZ1bmN0aW9uCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgb3ZlcnJpZGU7CisKKyAgLy8gSW50ZXJ2YWxQYXJ0aXRpb24gY3RvciAtIEJ1aWxkIGEgcmVkdWNlZCBpbnRlcnZhbCBwYXJ0aXRpb24gZnJvbSBhbgorICAvLyBleGlzdGluZyBpbnRlcnZhbCBncmFwaC4gIFRoaXMgdGFrZXMgYW4gYWRkaXRpb25hbCBib29sZWFuIHBhcmFtZXRlciB0bworICAvLyBkaXN0aW5ndWlzaCBpdCBmcm9tIGEgY29weSBjb25zdHJ1Y3Rvci4gIEFsd2F5cyBwYXNzIGluIGZhbHNlIGZvciBub3cuCisgIEludGVydmFsUGFydGl0aW9uKEludGVydmFsUGFydGl0aW9uICZJLCBib29sKTsKKworICAvLyBwcmludCAtIFNob3cgY29udGVudHMgaW4gaHVtYW4gcmVhZGFibGUgZm9ybWF0Li4uCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8sIGNvbnN0IE1vZHVsZSogPSBudWxscHRyKSBjb25zdCBvdmVycmlkZTsKKworICAvLyBnZXRSb290SW50ZXJ2YWwoKSAtIFJldHVybiB0aGUgcm9vdCBpbnRlcnZhbCB0aGF0IGNvbnRhaW5zIHRoZSBzdGFydGluZworICAvLyBibG9jayBvZiB0aGUgZnVuY3Rpb24uCisgIGlubGluZSBJbnRlcnZhbCAqZ2V0Um9vdEludGVydmFsKCkgeyByZXR1cm4gUm9vdEludGVydmFsOyB9CisKKyAgLy8gaXNEZWdlbmVyYXRlUGFydGl0aW9uKCkgLSBSZXR1cm5zIHRydWUgaWYgdGhlIGludGVydmFsIHBhcnRpdGlvbiBjb250YWlucworICAvLyBhIHNpbmdsZSBpbnRlcnZhbCwgYW5kIHRodXMgY2Fubm90IGJlIHNpbXBsaWZpZWQgYW55bW9yZS4KKyAgYm9vbCBpc0RlZ2VuZXJhdGVQYXJ0aXRpb24oKSB7IHJldHVybiBJbnRlcnZhbHMuc2l6ZSgpID09IDE7IH0KKworICAvLyBUT0RPOiBpc0lycmVkdWNpYmxlIC0gbG9vayBmb3IgdHJpYW5nbGUgZ3JhcGguCisKKyAgLy8gZ2V0QmxvY2tJbnRlcnZhbCAtIFJldHVybiB0aGUgaW50ZXJ2YWwgdGhhdCBhIGJhc2ljIGJsb2NrIGV4aXN0cyBpbi4KKyAgaW5saW5lIEludGVydmFsICpnZXRCbG9ja0ludGVydmFsKEJhc2ljQmxvY2sgKkJCKSB7CisgICAgSW50ZXJ2YWxNYXBUeTo6aXRlcmF0b3IgSSA9IEludGVydmFsTWFwLmZpbmQoQkIpOworICAgIHJldHVybiBJICE9IEludGVydmFsTWFwLmVuZCgpID8gSS0+c2Vjb25kIDogbnVsbHB0cjsKKyAgfQorCisgIC8vIGdldEFuYWx5c2lzVXNhZ2UgLSBJbXBsZW1lbnQgdGhlIFBhc3MgQVBJCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIEFVLnNldFByZXNlcnZlc0FsbCgpOworICB9CisKKyAgLy8gSW50ZXJmYWNlIHRvIEludGVydmFscyB2ZWN0b3IuLi4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8SW50ZXJ2YWwqPiAmZ2V0SW50ZXJ2YWxzKCkgY29uc3QgeyByZXR1cm4gSW50ZXJ2YWxzOyB9CisKKyAgLy8gcmVsZWFzZU1lbW9yeSAtIFJlc2V0IHN0YXRlIGJhY2sgdG8gYmVmb3JlIGZ1bmN0aW9uIHdhcyBhbmFseXplZAorICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgLy8gYWRkSW50ZXJ2YWxUb1BhcnRpdGlvbiAtIEFkZCBhbiBpbnRlcnZhbCB0byB0aGUgaW50ZXJuYWwgbGlzdCBvZiBpbnRlcnZhbHMsCisgIC8vIGFuZCB0aGVuIGFkZCBtYXBwaW5ncyBmcm9tIGFsbCBvZiB0aGUgYmFzaWMgYmxvY2tzIGluIHRoZSBpbnRlcnZhbCB0byB0aGUKKyAgLy8gaW50ZXJ2YWwgaXRzZWxmIChpbiB0aGUgSW50ZXJ2YWxNYXApLgorICB2b2lkIGFkZEludGVydmFsVG9QYXJ0aXRpb24oSW50ZXJ2YWwgKkkpOworCisgIC8vIHVwZGF0ZVByZWRlY2Vzc29ycyAtIEludGVydmFsIGdlbmVyYXRpb24gb25seSBzZXRzIHRoZSBzdWNjZXNzb3IgZmllbGRzIG9mCisgIC8vIHRoZSBpbnRlcnZhbCBkYXRhIHN0cnVjdHVyZXMuICBBZnRlciBpbnRlcnZhbCBnZW5lcmF0aW9uIGlzIGNvbXBsZXRlLAorICAvLyBydW4gdGhyb3VnaCBhbGwgb2YgdGhlIGludGVydmFscyBhbmQgcHJvcGFnYXRlIHN1Y2Nlc3NvciBpbmZvIGFzCisgIC8vIHByZWRlY2Vzc29yIGluZm8uCisgIHZvaWQgdXBkYXRlUHJlZGVjZXNzb3JzKEludGVydmFsICpJbnQpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfSU5URVJWQUxQQVJUSVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JdGVyYXRlZERvbWluYW5jZUZyb250aWVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0l0ZXJhdGVkRG9taW5hbmNlRnJvbnRpZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZGFmNGU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9JdGVyYXRlZERvbWluYW5jZUZyb250aWVyLmgKQEAgLTAsMCArMSw5NSBAQAorLy89PT0tIEl0ZXJhdGVkRG9taW5hbmNlRnJvbnRpZXIuaCAtIENhbGN1bGF0ZSBJREYgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGJyaWVmIENvbXB1dGUgaXRlcmF0ZWQgZG9taW5hbmNlIGZyb250aWVycyB1c2luZyBhIGxpbmVhciB0aW1lIGFsZ29yaXRobS4KKy8vLworLy8vIFRoZSBhbGdvcml0aG0gdXNlZCBoZXJlIGlzIGJhc2VkIG9uOgorLy8vCisvLy8gICBTcmVlZGhhciBhbmQgR2FvLiBBIGxpbmVhciB0aW1lIGFsZ29yaXRobSBmb3IgcGxhY2luZyBwaGktbm9kZXMuCisvLy8gICBJbiBQcm9jZWVkaW5ncyBvZiB0aGUgMjJuZCBBQ00gU0lHUExBTi1TSUdBQ1QgU3ltcG9zaXVtIG9uIFByaW5jaXBsZXMgb2YKKy8vLyAgIFByb2dyYW1taW5nIExhbmd1YWdlcworLy8vICAgUE9QTCAnOTUuIEFDTSwgTmV3IFlvcmssIE5ZLCA2Mi03My4KKy8vLworLy8vIEl0IGhhcyBiZWVuIG1vZGlmaWVkIHRvIG5vdCBleHBsaWNpdGx5IHVzZSB0aGUgREogZ3JhcGggZGF0YSBzdHJ1Y3R1cmUgYW5kCisvLy8gdG8gZGlyZWN0bHkgY29tcHV0ZSBwcnVuZWQgU1NBIHVzaW5nIHBlci12YXJpYWJsZSBsaXZlbmVzcyBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfSURGX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19JREZfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Eb21pbmF0b3JzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIGl0ZXJhdGVkIGRvbWluYW5jZSBmcm9udGllciwgZ2l2ZW4gYSBzZXQgb2YgZGVmaW5pbmcKKy8vLyBibG9ja3MsIGFuZCBvcHRpb25hbGx5LCBhIHNldCBvZiBsaXZlLWluIGJsb2Nrcy4KKy8vLworLy8vIEluIHR1cm4sIHRoZSByZXN1bHRzIGNhbiBiZSB1c2VkIHRvIHBsYWNlIHBoaSBub2Rlcy4KKy8vLworLy8vIFRoaXMgYWxnb3JpdGhtIGlzIGEgbGluZWFyIHRpbWUgY29tcHV0YXRpb24gb2YgSXRlcmF0ZWQgRG9taW5hbmNlIEZyb250aWVycywKKy8vLyBwcnVuZWQgdXNpbmcgdGhlIGxpdmUtaW4gc2V0LgorLy8vIEJ5IGRlZmF1bHQsIGxpdmVuZXNzIGlzIG5vdCB1c2VkIHRvIHBydW5lIHRoZSBJREYgY29tcHV0YXRpb24uCisvLy8gVGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgc2hvdWxkIGJlIGVpdGhlciBCYXNpY0Jsb2NrKiBvciBJbnZlcnNlPEJhc2ljQmxvY2sKKy8vLyAqPiwgZGVwZW5kaW5nIG9uIGlmIHlvdSB3YW50IHRoZSBmb3J3YXJkIG9yIHJldmVyc2UgSURGLgordGVtcGxhdGUgPGNsYXNzIE5vZGVUeSwgYm9vbCBJc1Bvc3REb20+CitjbGFzcyBJREZDYWxjdWxhdG9yIHsKKyBwdWJsaWM6CisgIElERkNhbGN1bGF0b3IoRG9taW5hdG9yVHJlZUJhc2U8QmFzaWNCbG9jaywgSXNQb3N0RG9tPiAmRFQpCisgICAgICA6IERUKERUKSwgdXNlTGl2ZUluKGZhbHNlKSB7fQorCisgIC8vLyBcYnJpZWYgR2l2ZSB0aGUgSURGIGNhbGN1bGF0b3IgdGhlIHNldCBvZiBibG9ja3MgaW4gd2hpY2ggdGhlIHZhbHVlIGlzCisgIC8vLyBkZWZpbmVkLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBzZXQgb2Ygc3RhcnRpbmcgYmxvY2tzIGl0IHNob3VsZCBiZQorICAvLy8gY2FsY3VsYXRpbmcgdGhlIElERiBmb3IgKHRob3VnaCBsYXRlciBnZXRzIHBydW5lZCBiYXNlZCBvbiBsaXZlbmVzcykuCisgIC8vLworICAvLy8gTm90ZTogVGhpcyBzZXQgKm11c3QqIGxpdmUgZm9yIHRoZSBlbnRpcmUgbGlmZXRpbWUgb2YgdGhlIElERiBjYWxjdWxhdG9yLgorICB2b2lkIHNldERlZmluaW5nQmxvY2tzKGNvbnN0IFNtYWxsUHRyU2V0SW1wbDxCYXNpY0Jsb2NrICo+ICZCbG9ja3MpIHsKKyAgICBEZWZCbG9ja3MgPSAmQmxvY2tzOworICB9CisKKyAgLy8vIFxicmllZiBHaXZlIHRoZSBJREYgY2FsY3VsYXRvciB0aGUgc2V0IG9mIGJsb2NrcyBpbiB3aGljaCB0aGUgdmFsdWUgaXMKKyAgLy8vIGxpdmUgb24gZW50cnkgdG8gdGhlIGJsb2NrLiAgIFRoaXMgaXMgdXNlZCB0byBwcnVuZSB0aGUgSURGIGNhbGN1bGF0aW9uIHRvCisgIC8vLyBub3QgaW5jbHVkZSBibG9ja3Mgd2hlcmUgYW55IHBoaSBpbnNlcnRpb24gd291bGQgYmUgZGVhZC4KKyAgLy8vCisgIC8vLyBOb3RlOiBUaGlzIHNldCAqbXVzdCogbGl2ZSBmb3IgdGhlIGVudGlyZSBsaWZldGltZSBvZiB0aGUgSURGIGNhbGN1bGF0b3IuCisKKyAgdm9pZCBzZXRMaXZlSW5CbG9ja3MoY29uc3QgU21hbGxQdHJTZXRJbXBsPEJhc2ljQmxvY2sgKj4gJkJsb2NrcykgeworICAgIExpdmVJbkJsb2NrcyA9ICZCbG9ja3M7CisgICAgdXNlTGl2ZUluID0gdHJ1ZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVzZXQgdGhlIGxpdmUtaW4gYmxvY2sgc2V0IHRvIGJlIGVtcHR5LCBhbmQgdGVsbCB0aGUgSURGCisgIC8vLyBjYWxjdWxhdG9yIHRvIG5vdCB1c2UgbGl2ZW5lc3MgYW55bW9yZS4KKyAgdm9pZCByZXNldExpdmVJbkJsb2NrcygpIHsKKyAgICBMaXZlSW5CbG9ja3MgPSBudWxscHRyOworICAgIHVzZUxpdmVJbiA9IGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBDYWxjdWxhdGUgaXRlcmF0ZWQgZG9taW5hbmNlIGZyb250aWVycworICAvLy8KKyAgLy8vIFRoaXMgdXNlcyB0aGUgbGluZWFyLXRpbWUgcGhpIGFsZ29yaXRobSBiYXNlZCBvbiBESi1ncmFwaHMgbWVudGlvbmVkIGluCisgIC8vLyB0aGUgZmlsZS1sZXZlbCBjb21tZW50LiAgSXQgcGVyZm9ybXMgREYtPklERiBwcnVuaW5nIHVzaW5nIHRoZSBsaXZlLWluCisgIC8vLyBzZXQsIHRvIGF2b2lkIGNvbXB1dGluZyB0aGUgSURGIGZvciBibG9ja3Mgd2hlcmUgYW4gaW5zZXJ0ZWQgUEhJIG5vZGUKKyAgLy8vIHdvdWxkIGJlIGRlYWQuCisgIHZvaWQgY2FsY3VsYXRlKFNtYWxsVmVjdG9ySW1wbDxCYXNpY0Jsb2NrICo+ICZJREZCbG9ja3MpOworCitwcml2YXRlOgorIERvbWluYXRvclRyZWVCYXNlPEJhc2ljQmxvY2ssIElzUG9zdERvbT4gJkRUOworIGJvb2wgdXNlTGl2ZUluOworIGNvbnN0IFNtYWxsUHRyU2V0SW1wbDxCYXNpY0Jsb2NrICo+ICpMaXZlSW5CbG9ja3M7CisgY29uc3QgU21hbGxQdHJTZXRJbXBsPEJhc2ljQmxvY2sgKj4gKkRlZkJsb2NrczsKK307Cit0eXBlZGVmIElERkNhbGN1bGF0b3I8QmFzaWNCbG9jayAqLCBmYWxzZT4gRm9yd2FyZElERkNhbGN1bGF0b3I7Cit0eXBlZGVmIElERkNhbGN1bGF0b3I8SW52ZXJzZTxCYXNpY0Jsb2NrICo+LCB0cnVlPiBSZXZlcnNlSURGQ2FsY3VsYXRvcjsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9MYXp5QmxvY2tGcmVxdWVuY3lJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xhenlCbG9ja0ZyZXF1ZW5jeUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MWNlMDg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9MYXp5QmxvY2tGcmVxdWVuY3lJbmZvLmgKQEAgLTAsMCArMSwxMzIgQEAKKy8vPT09LSBMYXp5QmxvY2tGcmVxdWVuY3lJbmZvLmggLSBMYXp5IEJsb2NrIEZyZXF1ZW5jeSBBbmFseXNpcyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSBhbmFseXNpcyBwYXNzIHRvIEJsb2NrRnJlcXVlbmN5SW5mb1dyYXBwZXJQYXNzLiAgVGhlCisvLyBkaWZmZXJlbmNlIGlzIHRoYXQgd2l0aCB0aGlzIHBhc3MgdGhlIGJsb2NrIGZyZXF1ZW5jaWVzIGFyZSBub3QgY29tcHV0ZWQgd2hlbgorLy8gdGhlIGFuYWx5c2lzIHBhc3MgaXMgZXhlY3V0ZWQgYnV0IHJhdGhlciB3aGVuIHRoZSBCRkkgcmVzdWx0IGlzIGV4cGxpY2l0bHkKKy8vIHJlcXVlc3RlZCBieSB0aGUgYW5hbHlzaXMgY2xpZW50LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19MQVpZQkxPQ0tGUkVRVUVOQ1lJTkZPX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19MQVpZQkxPQ0tGUkVRVUVOQ1lJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQmxvY2tGcmVxdWVuY3lJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9MYXp5QnJhbmNoUHJvYmFiaWxpdHlJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEFuYWx5c2lzVXNhZ2U7CitjbGFzcyBCcmFuY2hQcm9iYWJpbGl0eUluZm87CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIExvb3BJbmZvOworCisvLy8gV3JhcHMgYSBCRkkgdG8gYWxsb3cgbGF6eSBjb21wdXRhdGlvbiBvZiB0aGUgYmxvY2sgZnJlcXVlbmNpZXMuCisvLy8KKy8vLyBBIHBhc3MgdGhhdCBvbmx5IGNvbmRpdGlvbmFsbHkgdXNlcyBCRkkgY2FuIHVuY29uZHRpb25hbGx5IHJlcXVpcmUgdGhlCisvLy8gYW5hbHlzaXMgd2l0aG91dCBwYXlpbmcgZm9yIHRoZSBvdmVyaGVhZCBpZiBCRkkgZG9lc24ndCBlbmQgdXAgYmVpbmcgdXNlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvblQsIHR5cGVuYW1lIEJyYW5jaFByb2JhYmlsaXR5SW5mb1Bhc3NULAorICAgICAgICAgIHR5cGVuYW1lIExvb3BJbmZvVCwgdHlwZW5hbWUgQmxvY2tGcmVxdWVuY3lJbmZvVD4KK2NsYXNzIExhenlCbG9ja0ZyZXF1ZW5jeUluZm8geworcHVibGljOgorICBMYXp5QmxvY2tGcmVxdWVuY3lJbmZvKCkKKyAgICAgIDogQ2FsY3VsYXRlZChmYWxzZSksIEYobnVsbHB0ciksIEJQSVBhc3MobnVsbHB0ciksIExJKG51bGxwdHIpIHt9CisKKyAgLy8vIFNldCB1cCB0aGUgcGVyLWZ1bmN0aW9uIGlucHV0LgorICB2b2lkIHNldEFuYWx5c2lzKGNvbnN0IEZ1bmN0aW9uVCAqRiwgQnJhbmNoUHJvYmFiaWxpdHlJbmZvUGFzc1QgKkJQSVBhc3MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcEluZm9UICpMSSkgeworICAgIHRoaXMtPkYgPSBGOworICAgIHRoaXMtPkJQSVBhc3MgPSBCUElQYXNzOworICAgIHRoaXMtPkxJID0gTEk7CisgIH0KKworICAvLy8gUmV0cmlldmUgdGhlIEJGSSB3aXRoIHRoZSBibG9jayBmcmVxdWVuY2llcyBjb21wdXRlZC4KKyAgQmxvY2tGcmVxdWVuY3lJbmZvVCAmZ2V0Q2FsY3VsYXRlZCgpIHsKKyAgICBpZiAoIUNhbGN1bGF0ZWQpIHsKKyAgICAgIGFzc2VydChGICYmIEJQSVBhc3MgJiYgTEkgJiYgImNhbGwgc2V0QW5hbHlzaXMiKTsKKyAgICAgIEJGSS5jYWxjdWxhdGUoCisgICAgICAgICAgKkYsIEJQSVBhc3NUcmFpdDxCcmFuY2hQcm9iYWJpbGl0eUluZm9QYXNzVD46OmdldEJQSShCUElQYXNzKSwgKkxJKTsKKyAgICAgIENhbGN1bGF0ZWQgPSB0cnVlOworICAgIH0KKyAgICByZXR1cm4gQkZJOworICB9CisKKyAgY29uc3QgQmxvY2tGcmVxdWVuY3lJbmZvVCAmZ2V0Q2FsY3VsYXRlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxMYXp5QmxvY2tGcmVxdWVuY3lJbmZvICo+KHRoaXMpLT5nZXRDYWxjdWxhdGVkKCk7CisgIH0KKworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSB7CisgICAgQkZJLnJlbGVhc2VNZW1vcnkoKTsKKyAgICBDYWxjdWxhdGVkID0gZmFsc2U7CisgICAgc2V0QW5hbHlzaXMobnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cik7CisgIH0KKworcHJpdmF0ZToKKyAgQmxvY2tGcmVxdWVuY3lJbmZvVCBCRkk7CisgIGJvb2wgQ2FsY3VsYXRlZDsKKyAgY29uc3QgRnVuY3Rpb25UICpGOworICBCcmFuY2hQcm9iYWJpbGl0eUluZm9QYXNzVCAqQlBJUGFzczsKKyAgY29uc3QgTG9vcEluZm9UICpMSTsKK307CisKKy8vLyBcYnJpZWYgVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSBhbmFseXNpcyBwYXNzIHRvCisvLy8gQmxvY2tGcmVxdWVuY3lJbmZvV3JhcHBlclBhc3MuICBUaGUgZGlmZmVyZW5jZSBpcyB0aGF0IHdpdGggdGhpcyBwYXNzIHRoZQorLy8vIGJsb2NrIGZyZXF1ZW5jaWVzIGFyZSBub3QgY29tcHV0ZWQgd2hlbiB0aGUgYW5hbHlzaXMgcGFzcyBpcyBleGVjdXRlZCBidXQKKy8vLyByYXRoZXIgd2hlbiB0aGUgQkZJIHJlc3VsdCBpcyBleHBsaWNpdGx5IHJlcXVlc3RlZCBieSB0aGUgYW5hbHlzaXMgY2xpZW50LgorLy8vCisvLy8gVGhlcmUgYXJlIHNvbWUgYWRkaXRpb25hbCByZXF1aXJlbWVudHMgZm9yIGFueSBjbGllbnQgcGFzcyB0aGF0IHdhbnRzIHRvIHVzZQorLy8vIHRoZSBhbmFseXNpczoKKy8vLworLy8vIDEuIFRoZSBwYXNzIG5lZWRzIHRvIGluaXRpYWxpemUgZGVwZW5kZW50IHBhc3NlcyB3aXRoOgorLy8vCisvLy8gICBJTklUSUFMSVpFX1BBU1NfREVQRU5ERU5DWShMYXp5QkZJUGFzcykKKy8vLworLy8vIDIuIFNpbWlsYXJseSwgZ2V0QW5hbHlzaXNVc2FnZSBzaG91bGQgY2FsbDoKKy8vLworLy8vICAgTGF6eUJsb2NrRnJlcXVlbmN5SW5mb1Bhc3M6OmdldExhenlCRklBbmFseXNpc1VzYWdlKEFVKQorLy8vCisvLy8gMy4gVGhlIGNvbXB1dGVkIEJGSSBzaG91bGQgYmUgcmVxdWVzdGVkIHdpdGgKKy8vLyAgICBnZXRBbmFseXNpczxMYXp5QmxvY2tGcmVxdWVuY3lJbmZvUGFzcz4oKS5nZXRCRkkoKSBiZWZvcmUgZWl0aGVyIExvb3BJbmZvCisvLy8gICAgb3IgQlBJIGNvdWxkIGJlIGludmFsaWRhdGVkIGZvciBleGFtcGxlIGJ5IGNoYW5naW5nIHRoZSBDRkcuCisvLy8KKy8vLyBOb3RlIHRoYXQgaXQgaXMgZXhwZWN0ZWQgdGhhdCB3ZSB3b3VsZG4ndCBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eSBmb3IgdGhlCisvLy8gbmV3IFBNIHNpbmNlIHdpdGggdGhlIG5ldyBQTSwgYW5hbHlzZXMgYXJlIGV4ZWN1dGVkIG9uIGRlbWFuZC4KKworY2xhc3MgTGF6eUJsb2NrRnJlcXVlbmN5SW5mb1Bhc3MgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKK3ByaXZhdGU6CisgIExhenlCbG9ja0ZyZXF1ZW5jeUluZm88RnVuY3Rpb24sIExhenlCcmFuY2hQcm9iYWJpbGl0eUluZm9QYXNzLCBMb29wSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0ZyZXF1ZW5jeUluZm8+CisgICAgICBMQkZJOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIExhenlCbG9ja0ZyZXF1ZW5jeUluZm9QYXNzKCk7CisKKyAgLy8vIFxicmllZiBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGJsb2NrIGZyZXF1ZW5jaWVzLgorICBCbG9ja0ZyZXF1ZW5jeUluZm8gJmdldEJGSSgpIHsgcmV0dXJuIExCRkkuZ2V0Q2FsY3VsYXRlZCgpOyB9CisKKyAgLy8vIFxicmllZiBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGJsb2NrIGZyZXF1ZW5jaWVzLgorICBjb25zdCBCbG9ja0ZyZXF1ZW5jeUluZm8gJmdldEJGSSgpIGNvbnN0IHsgcmV0dXJuIExCRkkuZ2V0Q2FsY3VsYXRlZCgpOyB9CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gSGVscGVyIGZvciBjbGllbnQgcGFzc2VzIHRvIHNldCB1cCB0aGUgYW5hbHlzaXMgdXNhZ2Ugb24gYmVoYWxmIG9mIHRoaXMKKyAgLy8vIHBhc3MuCisgIHN0YXRpYyB2b2lkIGdldExhenlCRklBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKTsKKworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZTsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSAqTSkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gXGJyaWVmIEhlbHBlciBmb3IgY2xpZW50IHBhc3NlcyB0byBpbml0aWFsaXplIGRlcGVuZGVudCBwYXNzZXMgZm9yIExCRkkuCit2b2lkIGluaXRpYWxpemVMYXp5QkZJUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5ICZSZWdpc3RyeSk7Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTGF6eUJyYW5jaFByb2JhYmlsaXR5SW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9MYXp5QnJhbmNoUHJvYmFiaWxpdHlJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFkNDA0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTGF6eUJyYW5jaFByb2JhYmlsaXR5SW5mby5oCkBAIC0wLDAgKzEsMTI0IEBACisvLz09PS0gTGF6eUJyYW5jaFByb2JhYmlsaXR5SW5mby5oIC0gTGF6eSBCcmFuY2ggUHJvYmFiaWxpdHkgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgYW5hbHlzaXMgcGFzcyB0byBCcmFuY2hQcm9iYWJpbGl0eUluZm9XcmFwcGVyUGFzcy4KKy8vIFRoZSBkaWZmZXJlbmNlIGlzIHRoYXQgd2l0aCB0aGlzIHBhc3MgdGhlIGJyYW5jaCBwcm9iYWJpbGl0aWVzIGFyZSBub3QKKy8vIGNvbXB1dGVkIHdoZW4gdGhlIGFuYWx5c2lzIHBhc3MgaXMgZXhlY3V0ZWQgYnV0IHJhdGhlciB3aGVuIHRoZSBCUEkgcmVzdWx0cworLy8gaXMgZXhwbGljaXRseSByZXF1ZXN0ZWQgYnkgdGhlIGFuYWx5c2lzIGNsaWVudC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfTEFaWUJSQU5DSFBST0JBQklMSVRZSU5GT19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfTEFaWUJSQU5DSFBST0JBQklMSVRZSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0JyYW5jaFByb2JhYmlsaXR5SW5mby5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBBbmFseXNpc1VzYWdlOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBMb29wSW5mbzsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworCisvLy8gXGJyaWVmIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgYW5hbHlzaXMgcGFzcyB0bworLy8vIEJyYW5jaFByb2JhYmlsaXR5SW5mb1dyYXBwZXJQYXNzLiAgVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB3aXRoIHRoaXMgcGFzcyB0aGUKKy8vLyBicmFuY2ggcHJvYmFiaWxpdGllcyBhcmUgbm90IGNvbXB1dGVkIHdoZW4gdGhlIGFuYWx5c2lzIHBhc3MgaXMgZXhlY3V0ZWQgYnV0CisvLy8gcmF0aGVyIHdoZW4gdGhlIEJQSSByZXN1bHRzIGlzIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJ5IHRoZSBhbmFseXNpcyBjbGllbnQuCisvLy8KKy8vLyBUaGVyZSBhcmUgc29tZSBhZGRpdGlvbmFsIHJlcXVpcmVtZW50cyBmb3IgYW55IGNsaWVudCBwYXNzIHRoYXQgd2FudHMgdG8gdXNlCisvLy8gdGhlIGFuYWx5c2lzOgorLy8vCisvLy8gMS4gVGhlIHBhc3MgbmVlZHMgdG8gaW5pdGlhbGl6ZSBkZXBlbmRlbnQgcGFzc2VzIHdpdGg6CisvLy8KKy8vLyAgIElOSVRJQUxJWkVfUEFTU19ERVBFTkRFTkNZKExhenlCUElQYXNzKQorLy8vCisvLy8gMi4gU2ltaWxhcmx5LCBnZXRBbmFseXNpc1VzYWdlIHNob3VsZCBjYWxsOgorLy8vCisvLy8gICBMYXp5QnJhbmNoUHJvYmFiaWxpdHlJbmZvUGFzczo6Z2V0TGF6eUJQSUFuYWx5c2lzVXNhZ2UoQVUpCisvLy8KKy8vLyAzLiBUaGUgY29tcHV0ZWQgQlBJIHNob3VsZCBiZSByZXF1ZXN0ZWQgd2l0aAorLy8vICAgIGdldEFuYWx5c2lzPExhenlCcmFuY2hQcm9iYWJpbGl0eUluZm9QYXNzPigpLmdldEJQSSgpIGJlZm9yZSBMb29wSW5mbworLy8vICAgIGNvdWxkIGJlIGludmFsaWRhdGVkIGZvciBleGFtcGxlIGJ5IGNoYW5naW5nIHRoZSBDRkcuCisvLy8KKy8vLyBOb3RlIHRoYXQgaXQgaXMgZXhwZWN0ZWQgdGhhdCB3ZSB3b3VsZG4ndCBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eSBmb3IgdGhlCisvLy8gbmV3IFBNIHNpbmNlIHdpdGggdGhlIG5ldyBQTSwgYW5hbHlzZXMgYXJlIGV4ZWN1dGVkIG9uIGRlbWFuZC4KK2NsYXNzIExhenlCcmFuY2hQcm9iYWJpbGl0eUluZm9QYXNzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisKKyAgLy8vIFdyYXBzIGEgQlBJIHRvIGFsbG93IGxhenkgY29tcHV0YXRpb24gb2YgdGhlIGJyYW5jaCBwcm9iYWJpbGl0aWVzLgorICAvLy8KKyAgLy8vIEEgcGFzcyB0aGF0IG9ubHkgY29uZGl0aW9uYWxseSB1c2VzIEJQSSBjYW4gdW5jb25kdGlvbmFsbHkgcmVxdWlyZSB0aGUKKyAgLy8vIGFuYWx5c2lzIHdpdGhvdXQgcGF5aW5nIGZvciB0aGUgb3ZlcmhlYWQgaWYgQlBJIGRvZXNuJ3QgZW5kIHVwIGJlaW5nIHVzZWQuCisgIGNsYXNzIExhenlCcmFuY2hQcm9iYWJpbGl0eUluZm8geworICBwdWJsaWM6CisgICAgTGF6eUJyYW5jaFByb2JhYmlsaXR5SW5mbyhjb25zdCBGdW5jdGlvbiAqRiwgY29uc3QgTG9vcEluZm8gKkxJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSkKKyAgICAgICAgOiBDYWxjdWxhdGVkKGZhbHNlKSwgRihGKSwgTEkoTEkpLCBUTEkoVExJKSB7fQorCisgICAgLy8vIFJldHJpZXZlIHRoZSBCUEkgd2l0aCB0aGUgYnJhbmNoIHByb2JhYmlsaXRpZXMgY29tcHV0ZWQuCisgICAgQnJhbmNoUHJvYmFiaWxpdHlJbmZvICZnZXRDYWxjdWxhdGVkKCkgeworICAgICAgaWYgKCFDYWxjdWxhdGVkKSB7CisgICAgICAgIGFzc2VydChGICYmIExJICYmICJjYWxsIHNldEFuYWx5c2lzIik7CisgICAgICAgIEJQSS5jYWxjdWxhdGUoKkYsICpMSSwgVExJKTsKKyAgICAgICAgQ2FsY3VsYXRlZCA9IHRydWU7CisgICAgICB9CisgICAgICByZXR1cm4gQlBJOworICAgIH0KKworICAgIGNvbnN0IEJyYW5jaFByb2JhYmlsaXR5SW5mbyAmZ2V0Q2FsY3VsYXRlZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjb25zdF9jYXN0PExhenlCcmFuY2hQcm9iYWJpbGl0eUluZm8gKj4odGhpcyktPmdldENhbGN1bGF0ZWQoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBCcmFuY2hQcm9iYWJpbGl0eUluZm8gQlBJOworICAgIGJvb2wgQ2FsY3VsYXRlZDsKKyAgICBjb25zdCBGdW5jdGlvbiAqRjsKKyAgICBjb25zdCBMb29wSW5mbyAqTEk7CisgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSTsKKyAgfTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8TGF6eUJyYW5jaFByb2JhYmlsaXR5SW5mbz4gTEJQSTsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBMYXp5QnJhbmNoUHJvYmFiaWxpdHlJbmZvUGFzcygpOworCisgIC8vLyBcYnJpZWYgQ29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBicmFuY2ggcHJvYmFiaWxpdGllcy4KKyAgQnJhbmNoUHJvYmFiaWxpdHlJbmZvICZnZXRCUEkoKSB7IHJldHVybiBMQlBJLT5nZXRDYWxjdWxhdGVkKCk7IH0KKworICAvLy8gXGJyaWVmIENvbXB1dGUgYW5kIHJldHVybiB0aGUgYnJhbmNoIHByb2JhYmlsaXRpZXMuCisgIGNvbnN0IEJyYW5jaFByb2JhYmlsaXR5SW5mbyAmZ2V0QlBJKCkgY29uc3QgeyByZXR1cm4gTEJQSS0+Z2V0Q2FsY3VsYXRlZCgpOyB9CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gSGVscGVyIGZvciBjbGllbnQgcGFzc2VzIHRvIHNldCB1cCB0aGUgYW5hbHlzaXMgdXNhZ2Ugb24gYmVoYWxmIG9mIHRoaXMKKyAgLy8vIHBhc3MuCisgIHN0YXRpYyB2b2lkIGdldExhenlCUElBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKTsKKworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZTsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSAqTSkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gXGJyaWVmIEhlbHBlciBmb3IgY2xpZW50IHBhc3NlcyB0byBpbml0aWFsaXplIGRlcGVuZGVudCBwYXNzZXMgZm9yIExCUEkuCit2b2lkIGluaXRpYWxpemVMYXp5QlBJUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5ICZSZWdpc3RyeSk7CisKKy8vLyBcYnJpZWYgU2ltcGxlIHRyYWl0IGNsYXNzIHRoYXQgcHJvdmlkZXMgYSBtYXBwaW5nIGJldHdlZW4gQlBJIHBhc3NlcyBhbmQgdGhlCisvLy8gY29ycmVzcG9uZGluZyBCUEluZm8uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFzc1Q+IHN0cnVjdCBCUElQYXNzVHJhaXQgeworICBzdGF0aWMgUGFzc1QgJmdldEJQSShQYXNzVCAqUCkgeyByZXR1cm4gKlA7IH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBCUElQYXNzVHJhaXQ8TGF6eUJyYW5jaFByb2JhYmlsaXR5SW5mb1Bhc3M+IHsKKyAgc3RhdGljIEJyYW5jaFByb2JhYmlsaXR5SW5mbyAmZ2V0QlBJKExhenlCcmFuY2hQcm9iYWJpbGl0eUluZm9QYXNzICpQKSB7CisgICAgcmV0dXJuIFAtPmdldEJQSSgpOworICB9Cit9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xhenlDYWxsR3JhcGguaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTGF6eUNhbGxHcmFwaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQxZWM2YTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xhenlDYWxsR3JhcGguaApAQCAtMCwwICsxLDEyODggQEAKKy8vPT09LSBMYXp5Q2FsbEdyYXBoLmggLSBBbmFseXNpcyBvZiBhIE1vZHVsZSdzIGNhbGwgZ3JhcGggLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLworLy8vIEltcGxlbWVudHMgYSBsYXp5IGNhbGwgZ3JhcGggYW5hbHlzaXMgYW5kIHJlbGF0ZWQgcGFzc2VzIGZvciB0aGUgbmV3IHBhc3MKKy8vLyBtYW5hZ2VyLgorLy8vCisvLy8gTkI6IFRoaXMgaXMgKm5vdCogYSB0cmFkaXRpb25hbCBjYWxsIGdyYXBoISBJdCBpcyBhIGdyYXBoIHdoaWNoIG1vZGVscyBib3RoCisvLy8gdGhlIGN1cnJlbnQgY2FsbHMgYW5kIHBvdGVudGlhbCBjYWxscy4gQXMgYSBjb25zZXF1ZW5jZSB0aGVyZSBhcmUgbWFueQorLy8vIGVkZ2VzIGluIHRoaXMgY2FsbCBncmFwaCB0aGF0IGRvIG5vdCBjb3JyZXNwb25kIHRvIGEgJ2NhbGwnIG9yICdpbnZva2UnCisvLy8gaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBUaGUgcHJpbWFyeSB1c2UgY2FzZXMgb2YgdGhpcyBncmFwaCBhbmFseXNpcyBpcyB0byBmYWNpbGl0YXRlIGl0ZXJhdGluZworLy8vIGFjcm9zcyB0aGUgZnVuY3Rpb25zIG9mIGEgbW9kdWxlIGluIHdheXMgdGhhdCBlbnN1cmUgYWxsIGNhbGxlZXMgYXJlCisvLy8gdmlzaXRlZCBwcmlvciB0byBhIGNhbGxlciAoZ2l2ZW4gYW55IFNDQyBjb25zdHJhaW50cyksIG9yIHZpY2UgdmVyc2EuIEFzCisvLy8gc3VjaCBpcyBpdCBwYXJ0aWN1bGFybHkgd2VsbCBzdWl0ZWQgdG8gb3JnYW5pemluZyBDR1NDQyBvcHRpbWl6YXRpb25zIHN1Y2gKKy8vLyBhcyBpbmxpbmluZywgb3V0bGluaW5nLCBhcmd1bWVudCBwcm9tb3Rpb24sIGV0Yy4gVGhhdCBpcyBpdHMgcHJpbWFyeSB1c2UKKy8vLyBjYXNlIGFuZCBtb3RpdmF0ZXMgdGhlIGRlc2lnbi4gSXQgbWF5IG5vdCBiZSBhcHByb3ByaWF0ZSBmb3Igb3RoZXIKKy8vLyBwdXJwb3Nlcy4gVGhlIHVzZSBncmFwaCBvZiBmdW5jdGlvbnMgb3Igc29tZSBvdGhlciBjb25zZXJ2YXRpdmUgYW5hbHlzaXMgb2YKKy8vLyBjYWxsIGluc3RydWN0aW9ucyBtYXkgYmUgaW50ZXJlc3RpbmcgZm9yIG9wdGltaXphdGlvbnMgYW5kIHN1YnNlcXVlbnQKKy8vLyBhbmFseXNlcyB3aGljaCBkb24ndCB3b3JrIGluIHRoZSBjb250ZXh0IG9mIGFuIG92ZXJseSBzcGVjaWZpZWQKKy8vLyBwb3RlbnRpYWwtY2FsbC1lZGdlIGdyYXBoLgorLy8vCisvLy8gVG8gdW5kZXJzdGFuZCB0aGUgc3BlY2lmaWMgcnVsZXMgYW5kIG5hdHVyZSBvZiB0aGlzIGNhbGwgZ3JhcGggYW5hbHlzaXMsCisvLy8gc2VlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBcYyBMYXp5Q2FsbEdyYXBoIGJlbG93LgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfTEFaWUNBTExHUkFQSF9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfTEFaWUNBTExHUkFQSF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9UYXJnZXRMaWJyYXJ5SW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNb2R1bGU7CitjbGFzcyBWYWx1ZTsKKworLy8vIEEgbGF6aWx5IGNvbnN0cnVjdGVkIHZpZXcgb2YgdGhlIGNhbGwgZ3JhcGggb2YgYSBtb2R1bGUuCisvLy8KKy8vLyBXaXRoIHRoZSBlZGdlcyBvZiB0aGlzIGdyYXBoLCB0aGUgbW90aXZhdGluZyBjb25zdHJhaW50IHRoYXQgd2UgYXJlCisvLy8gYXR0ZW1wdGluZyB0byBtYWludGFpbiBpcyB0aGF0IGZ1bmN0aW9uLWxvY2FsIG9wdGltaXphdGlvbiwgQ0dTQ0MtbG9jYWwKKy8vLyBvcHRpbWl6YXRpb25zLCBhbmQgb3B0aW1pemF0aW9ucyB0cmFuc2Zvcm1pbmcgYSBwYWlyIG9mIGZ1bmN0aW9ucyBjb25uZWN0ZWQKKy8vLyBieSBhbiBlZGdlIGluIHRoZSBncmFwaCwgZG8gbm90IGludmFsaWRhdGUgYSBib3R0b20tdXAgdHJhdmVyc2FsIG9mIHRoZSBTQ0MKKy8vLyBEQUcuIFRoYXQgaXMsIG5vIG9wdGltaXphdGlvbnMgd2lsbCBkZWxldGUsIHJlbW92ZSwgb3IgYWRkIGFuIGVkZ2Ugc3VjaAorLy8vIHRoYXQgZnVuY3Rpb25zIGFscmVhZHkgdmlzaXRlZCBpbiBhIGJvdHRvbS11cCBvcmRlciBvZiB0aGUgU0NDIERBRyBhcmUgbm8KKy8vLyBsb25nZXIgdmFsaWQgdG8gaGF2ZSB2aXNpdGVkLCBvciBzdWNoIHRoYXQgZnVuY3Rpb25zIG5vdCB5ZXQgdmlzaXRlZCBpbgorLy8vIGEgYm90dG9tLXVwIG9yZGVyIG9mIHRoZSBTQ0MgREFHIGFyZSBub3QgcmVxdWlyZWQgdG8gaGF2ZSBhbHJlYWR5IGJlZW4KKy8vLyB2aXNpdGVkLgorLy8vCisvLy8gV2l0aGluIHRoaXMgY29uc3RyYWludCwgdGhlIGRlc2lyZSBpcyB0byBtaW5pbWl6ZSB0aGUgbWVyZ2UgcG9pbnRzIG9mIHRoZQorLy8vIFNDQyBEQUcuIFRoZSBncmVhdGVyIHRoZSBmYW5vdXQgb2YgdGhlIFNDQyBEQUcgYW5kIHRoZSBmZXdlciBtZXJnZSBwb2ludHMKKy8vLyBpbiB0aGUgU0NDIERBRywgdGhlIG1vcmUgaW5kZXBlbmRlbmNlIHRoZXJlIGlzIGluIG9wdGltaXppbmcgd2l0aGluIGl0LgorLy8vIFRoZXJlIGlzIGEgc3Ryb25nIGRlc2lyZSB0byBlbmFibGUgcGFyYWxsZWxpemF0aW9uIG9mIG9wdGltaXphdGlvbnMgb3ZlcgorLy8vIHRoZSBjYWxsIGdyYXBoLCBhbmQgYm90aCBsaW1pdGVkIGZhbm91dCBhbmQgbWVyZ2UgcG9pbnRzIHdpbGwgKGFydGlmaWNpYWxseQorLy8vIGluIHNvbWUgY2FzZXMpIGxpbWl0IHRoZSBzY2FsaW5nIG9mIHN1Y2ggYW4gZWZmb3J0LgorLy8vCisvLy8gVG8gdGhpcyBlbmQsIGdyYXBoIHJlcHJlc2VudHMgYm90aCBkaXJlY3QgYW5kIGFueSBwb3RlbnRpYWwgcmVzb2x1dGlvbiB0bworLy8vIGFuIGluZGlyZWN0IGNhbGwgZWRnZS4gQW5vdGhlciB3YXkgdG8gdGhpbmsgYWJvdXQgaXQgaXMgdGhhdCBpdCByZXByZXNlbnRzCisvLy8gYm90aCB0aGUgZGlyZWN0IGNhbGwgZWRnZXMgYW5kIGFueSBkaXJlY3QgY2FsbCBlZGdlcyB0aGF0IG1pZ2h0IGJlIGZvcm1lZAorLy8vIHRocm91Z2ggc3RhdGljIG9wdGltaXphdGlvbnMuIFNwZWNpZmljYWxseSwgaXQgY29uc2lkZXJzIHRha2luZyB0aGUgYWRkcmVzcworLy8vIG9mIGEgZnVuY3Rpb24gdG8gYmUgYW4gZWRnZSBpbiB0aGUgY2FsbCBncmFwaCBiZWNhdXNlIHRoaXMgbWlnaHQgYmUKKy8vLyBmb3J3YXJkZWQgdG8gYmVjb21lIGEgZGlyZWN0IGNhbGwgYnkgc29tZSBzdWJzZXF1ZW50IGZ1bmN0aW9uLWxvY2FsCisvLy8gb3B0aW1pemF0aW9uLiBUaGUgcmVzdWx0IGlzIHRoYXQgdGhlIGdyYXBoIGNsb3NlbHkgZm9sbG93cyB0aGUgdXNlLWRlZgorLy8vIGVkZ2VzIGZvciBmdW5jdGlvbnMuIFdhbGtpbmcgInVwIiB0aGUgZ3JhcGggY2FuIGJlIGRvbmUgYnkgbG9va2luZyBhdCBhbGwKKy8vLyBvZiB0aGUgdXNlcyBvZiBhIGZ1bmN0aW9uLgorLy8vCisvLy8gVGhlIHJvb3RzIG9mIHRoZSBjYWxsIGdyYXBoIGFyZSB0aGUgZXh0ZXJuYWwgZnVuY3Rpb25zIGFuZCBmdW5jdGlvbnMKKy8vLyBlc2NhcGVkIGludG8gZ2xvYmFsIHZhcmlhYmxlcy4gVGhvc2UgZnVuY3Rpb25zIGNhbiBiZSBjYWxsZWQgZnJvbSBvdXRzaWRlCisvLy8gb2YgdGhlIG1vZHVsZSBvciB2aWEgdW5rbm93YWJsZSBtZWFucyBpbiB0aGUgSVIgLS0gd2UgbWF5IG5vdCBiZSBhYmxlIHRvCisvLy8gZm9ybSBldmVuIGEgcG90ZW50aWFsIGNhbGwgZWRnZSBmcm9tIGEgZnVuY3Rpb24gYm9keSB3aGljaCBtYXkgZHluYW1pY2FsbHkKKy8vLyBsb2FkIHRoZSBmdW5jdGlvbiBhbmQgY2FsbCBpdC4KKy8vLworLy8vIFRoaXMgYW5hbHlzaXMgc3RpbGwgcmVxdWlyZXMgdXBkYXRlcyB0byByZW1haW4gdmFsaWQgYWZ0ZXIgb3B0aW1pemF0aW9ucworLy8vIHdoaWNoIGNvdWxkIHBvdGVudGlhbGx5IGNoYW5nZSB0aGUgc2V0IG9mIHBvdGVudGlhbCBjYWxsZWVzLiBUaGUKKy8vLyBjb25zdHJhaW50cyBpdCBvcGVyYXRlcyB1bmRlciBvbmx5IG1ha2UgdGhlIHRyYXZlcnNhbCBvcmRlciByZW1haW4gdmFsaWQuCisvLy8KKy8vLyBUaGUgZW50aXJlIGFuYWx5c2lzIG11c3QgYmUgcmUtY29tcHV0ZWQgaWYgZnVsbCBpbnRlcnByb2NlZHVyYWwKKy8vLyBvcHRpbWl6YXRpb25zIHJ1biBhdCBhbnkgcG9pbnQuIEZvciBleGFtcGxlLCBnbG9iYWxvcHQgY29tcGxldGVseQorLy8vIGludmFsaWRhdGVzIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGlzIGFuYWx5c2lzLgorLy8vCisvLy8gRklYTUU6IFRoaXMgY2xhc3MgaXMgbmFtZWQgTGF6eUNhbGxHcmFwaCBpbiBhIGxhbWUgYXR0ZW1wdCB0byBkaXN0aW5ndWlzaAorLy8vIGl0IGZyb20gdGhlIGV4aXN0aW5nIENhbGxHcmFwaC4gQXQgc29tZSBwb2ludCwgaXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGlzCisvLy8gd2lsbCBiZSB0aGUgb25seSBjYWxsIGdyYXBoIGFuZCBpdCB3aWxsIGJlIHJlbmFtZWQgYWNjb3JkaW5nbHkuCitjbGFzcyBMYXp5Q2FsbEdyYXBoIHsKK3B1YmxpYzoKKyAgY2xhc3MgTm9kZTsKKyAgY2xhc3MgRWRnZVNlcXVlbmNlOworICBjbGFzcyBTQ0M7CisgIGNsYXNzIFJlZlNDQzsKKyAgY2xhc3MgZWRnZV9pdGVyYXRvcjsKKyAgY2xhc3MgY2FsbF9lZGdlX2l0ZXJhdG9yOworCisgIC8vLyBBIGNsYXNzIHVzZWQgdG8gcmVwcmVzZW50IGVkZ2VzIGluIHRoZSBjYWxsIGdyYXBoLgorICAvLy8KKyAgLy8vIFRoZSBsYXp5IGNhbGwgZ3JhcGggbW9kZWxzIGJvdGggKmNhbGwqIGVkZ2VzIGFuZCAqcmVmZXJlbmNlKiBlZGdlcy4gQ2FsbAorICAvLy8gZWRnZXMgYXJlIG11Y2ggd2hhdCB5b3Ugd291bGQgZXhwZWN0LCBhbmQgZXhpc3Qgd2hlbiB0aGVyZSBpcyBhICdjYWxsJyBvcgorICAvLy8gJ2ludm9rZScgaW5zdHJ1Y3Rpb24gb2Ygc29tZSBmdW5jdGlvbi4gUmVmZXJlbmNlIGVkZ2VzIGFyZSBhbHNvIHRyYWNrZWQKKyAgLy8vIGFsb25nIHNpZGUgdGhlc2UsIGFuZCBleGlzdCB3aGVuZXZlciBhbnkgaW5zdHJ1Y3Rpb24gKHRyYW5zaXRpdmVseQorICAvLy8gdGhyb3VnaCBpdHMgb3BlcmFuZHMpIHJlZmVyZW5jZXMgYSBmdW5jdGlvbi4gQWxsIGNhbGwgZWRnZXMgYXJlCisgIC8vLyBpbmhlcmVudGx5IHJlZmVyZW5jZSBlZGdlcywgYW5kIHNvIHRoZSByZWZlcmVuY2UgZ3JhcGggZm9ybXMgYSBzdXBlcnNldAorICAvLy8gb2YgdGhlIGZvcm1hbCBjYWxsIGdyYXBoLgorICAvLy8KKyAgLy8vIEFsbCBvZiB0aGVzZSBmb3JtcyBvZiBlZGdlcyBhcmUgZnVuZGFtZW50YWxseSByZXByZXNlbnRlZCBhcyBvdXRnb2luZworICAvLy8gZWRnZXMuIFRoZSBlZGdlcyBhcmUgc3RvcmVkIGluIHRoZSBzb3VyY2Ugbm9kZSBhbmQgcG9pbnQgYXQgdGhlIHRhcmdldAorICAvLy8gbm9kZS4gVGhpcyBhbGxvd3MgdGhlIGVkZ2Ugc3RydWN0dXJlIGl0c2VsZiB0byBiZSBhIHZlcnkgY29tcGFjdCBkYXRhCisgIC8vLyBzdHJ1Y3R1cmU6IGVzc2VudGlhbGx5IGEgdGFnZ2VkIHBvaW50ZXIuCisgIGNsYXNzIEVkZ2UgeworICBwdWJsaWM6CisgICAgLy8vIFRoZSBraW5kIG9mIGVkZ2UgaW4gdGhlIGdyYXBoLgorICAgIGVudW0gS2luZCA6IGJvb2wgeyBSZWYgPSBmYWxzZSwgQ2FsbCA9IHRydWUgfTsKKworICAgIEVkZ2UoKTsKKyAgICBleHBsaWNpdCBFZGdlKE5vZGUgJk4sIEtpbmQgSyk7CisKKyAgICAvLy8gVGVzdCB3aGV0aGVyIHRoZSBlZGdlIGlzIG51bGwuCisgICAgLy8vCisgICAgLy8vIFRoaXMgaGFwcGVucyB3aGVuIGFuIGVkZ2UgaGFzIGJlZW4gZGVsZXRlZC4gV2UgbGVhdmUgdGhlIGVkZ2Ugb2JqZWN0cworICAgIC8vLyBhcm91bmQgYnV0IGNsZWFyIHRoZW0uCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0OworCisgICAgLy8vIFJldHVybnNzIHRoZSBcYyBLaW5kIG9mIHRoZSBlZGdlLgorICAgIEtpbmQgZ2V0S2luZCgpIGNvbnN0OworCisgICAgLy8vIFRlc3Qgd2hldGhlciB0aGUgZWRnZSByZXByZXNlbnRzIGEgZGlyZWN0IGNhbGwgdG8gYSBmdW5jdGlvbi4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyByZXF1aXJlcyB0aGF0IHRoZSBlZGdlIGlzIG5vdCBudWxsLgorICAgIGJvb2wgaXNDYWxsKCkgY29uc3Q7CisKKyAgICAvLy8gR2V0IHRoZSBjYWxsIGdyYXBoIG5vZGUgcmVmZXJlbmNlZCBieSB0aGlzIGVkZ2UuCisgICAgLy8vCisgICAgLy8vIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgZWRnZSBpcyBub3QgbnVsbC4KKyAgICBOb2RlICZnZXROb2RlKCkgY29uc3Q7CisKKyAgICAvLy8gR2V0IHRoZSBmdW5jdGlvbiByZWZlcmVuY2VkIGJ5IHRoaXMgZWRnZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyByZXF1aXJlcyB0aGF0IHRoZSBlZGdlIGlzIG5vdCBudWxsLgorICAgIEZ1bmN0aW9uICZnZXRGdW5jdGlvbigpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgZnJpZW5kIGNsYXNzIExhenlDYWxsR3JhcGg6OkVkZ2VTZXF1ZW5jZTsKKyAgICBmcmllbmQgY2xhc3MgTGF6eUNhbGxHcmFwaDo6UmVmU0NDOworCisgICAgUG9pbnRlckludFBhaXI8Tm9kZSAqLCAxLCBLaW5kPiBWYWx1ZTsKKworICAgIHZvaWQgc2V0S2luZChLaW5kIEspIHsgVmFsdWUuc2V0SW50KEspOyB9CisgIH07CisKKyAgLy8vIFRoZSBlZGdlIHNlcXVlbmNlIG9iamVjdC4KKyAgLy8vCisgIC8vLyBUaGlzIHR5cGljYWxseSBleGlzdHMgZW50aXJlbHkgd2l0aGluIHRoZSBub2RlIGJ1dCBpcyBleHBvc2VkIGFzCisgIC8vLyBhIHNlcGFyYXRlIHR5cGUgYmVjYXVzZSBhIG5vZGUgZG9lc24ndCBpbml0aWFsbHkgaGF2ZSBlZGdlcy4gQW4gZXhwbGljaXQKKyAgLy8vIHBvcHVsYXRpb24gc3RlcCBpcyByZXF1aXJlZCB0byBwcm9kdWNlIHRoaXMgc2VxdWVuY2UgYXQgZmlyc3QgYW5kIGl0IGlzCisgIC8vLyB0aGVuIGNhY2hlZCBpbiB0aGUgbm9kZS4gSXQgaXMgYWxzbyB1c2VkIHRvIHJlcHJlc2VudCBlZGdlcyBlbnRlcmluZyB0aGUKKyAgLy8vIGdyYXBoIGZyb20gb3V0c2lkZSB0aGUgbW9kdWxlIHRvIG1vZGVsIHRoZSBncmFwaCdzIHJvb3RzLgorICAvLy8KKyAgLy8vIFRoZSBzZXF1ZW5jZSBpdHNlbGYgYm90aCBpdGVyYWJsZSBhbmQgaW5kZXhhYmxlLiBUaGUgaW5kZXhlcyByZW1haW4KKyAgLy8vIHN0YWJsZSBldmVuIGFzIHRoZSBzZXF1ZW5jZSBtdXRhdGVzIChpbmNsdWRpbmcgcmVtb3ZhbCkuCisgIGNsYXNzIEVkZ2VTZXF1ZW5jZSB7CisgICAgZnJpZW5kIGNsYXNzIExhenlDYWxsR3JhcGg7CisgICAgZnJpZW5kIGNsYXNzIExhenlDYWxsR3JhcGg6Ok5vZGU7CisgICAgZnJpZW5kIGNsYXNzIExhenlDYWxsR3JhcGg6OlJlZlNDQzsKKworICAgIHVzaW5nIFZlY3RvclQgPSBTbWFsbFZlY3RvcjxFZGdlLCA0PjsKKyAgICB1c2luZyBWZWN0b3JJbXBsVCA9IFNtYWxsVmVjdG9ySW1wbDxFZGdlPjsKKworICBwdWJsaWM6CisgICAgLy8vIEFuIGl0ZXJhdG9yIHVzZWQgZm9yIHRoZSBlZGdlcyB0byBib3RoIGVudHJ5IG5vZGVzIGFuZCBjaGlsZCBub2Rlcy4KKyAgICBjbGFzcyBpdGVyYXRvcgorICAgICAgICA6IHB1YmxpYyBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U8aXRlcmF0b3IsIFZlY3RvckltcGxUOjppdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWc+IHsKKyAgICAgIGZyaWVuZCBjbGFzcyBMYXp5Q2FsbEdyYXBoOworICAgICAgZnJpZW5kIGNsYXNzIExhenlDYWxsR3JhcGg6Ok5vZGU7CisKKyAgICAgIFZlY3RvckltcGxUOjppdGVyYXRvciBFOworCisgICAgICAvLyBCdWlsZCB0aGUgaXRlcmF0b3IgZm9yIGEgc3BlY2lmaWMgcG9zaXRpb24gaW4gdGhlIGVkZ2UgbGlzdC4KKyAgICAgIGl0ZXJhdG9yKFZlY3RvckltcGxUOjppdGVyYXRvciBCYXNlSSwgVmVjdG9ySW1wbFQ6Oml0ZXJhdG9yIEUpCisgICAgICAgICAgOiBpdGVyYXRvcl9hZGFwdG9yX2Jhc2UoQmFzZUkpLCBFKEUpIHsKKyAgICAgICAgd2hpbGUgKEkgIT0gRSAmJiAhKkkpCisgICAgICAgICAgKytJOworICAgICAgfQorCisgICAgcHVibGljOgorICAgICAgaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICAgIHVzaW5nIGl0ZXJhdG9yX2FkYXB0b3JfYmFzZTo6b3BlcmF0b3IrKzsKKyAgICAgIGl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgICAgICBkbyB7CisgICAgICAgICAgKytJOworICAgICAgICB9IHdoaWxlIChJICE9IEUgJiYgISpJKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorICAgIH07CisKKyAgICAvLy8gQW4gaXRlcmF0b3Igb3ZlciBzcGVjaWZpY2FsbHkgY2FsbCBlZGdlcy4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBoYXMgdGhlIHNhbWUgaXRlcmF0aW9uIHByb3BlcnRpZXMgYXMgdGhlIFxjIGl0ZXJhdG9yLCBidXQKKyAgICAvLy8gcmVzdHJpY3RzIGl0c2VsZiB0byBlZGdlcyB3aGljaCByZXByZXNlbnQgYWN0dWFsIGNhbGxzLgorICAgIGNsYXNzIGNhbGxfaXRlcmF0b3IKKyAgICAgICAgOiBwdWJsaWMgaXRlcmF0b3JfYWRhcHRvcl9iYXNlPGNhbGxfaXRlcmF0b3IsIFZlY3RvckltcGxUOjppdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWc+IHsKKyAgICAgIGZyaWVuZCBjbGFzcyBMYXp5Q2FsbEdyYXBoOworICAgICAgZnJpZW5kIGNsYXNzIExhenlDYWxsR3JhcGg6Ok5vZGU7CisKKyAgICAgIFZlY3RvckltcGxUOjppdGVyYXRvciBFOworCisgICAgICAvLy8gQWR2YW5jZSB0aGUgaXRlcmF0b3IgdG8gdGhlIG5leHQgdmFsaWQsIGNhbGwgZWRnZS4KKyAgICAgIHZvaWQgYWR2YW5jZVRvTmV4dEVkZ2UoKSB7CisgICAgICAgIHdoaWxlIChJICE9IEUgJiYgKCEqSSB8fCAhSS0+aXNDYWxsKCkpKQorICAgICAgICAgICsrSTsKKyAgICAgIH0KKworICAgICAgLy8gQnVpbGQgdGhlIGl0ZXJhdG9yIGZvciBhIHNwZWNpZmljIHBvc2l0aW9uIGluIHRoZSBlZGdlIGxpc3QuCisgICAgICBjYWxsX2l0ZXJhdG9yKFZlY3RvckltcGxUOjppdGVyYXRvciBCYXNlSSwgVmVjdG9ySW1wbFQ6Oml0ZXJhdG9yIEUpCisgICAgICAgICAgOiBpdGVyYXRvcl9hZGFwdG9yX2Jhc2UoQmFzZUkpLCBFKEUpIHsKKyAgICAgICAgYWR2YW5jZVRvTmV4dEVkZ2UoKTsKKyAgICAgIH0KKworICAgIHB1YmxpYzoKKyAgICAgIGNhbGxfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICAgIHVzaW5nIGl0ZXJhdG9yX2FkYXB0b3JfYmFzZTo6b3BlcmF0b3IrKzsKKyAgICAgIGNhbGxfaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgICAgICsrSTsKKyAgICAgICAgYWR2YW5jZVRvTmV4dEVkZ2UoKTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorICAgIH07CisKKyAgICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIGl0ZXJhdG9yKEVkZ2VzLmJlZ2luKCksIEVkZ2VzLmVuZCgpKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGl0ZXJhdG9yKEVkZ2VzLmVuZCgpLCBFZGdlcy5lbmQoKSk7IH0KKworICAgIEVkZ2UgJm9wZXJhdG9yW10oaW50IGkpIHsgcmV0dXJuIEVkZ2VzW2ldOyB9CisgICAgRWRnZSAmb3BlcmF0b3JbXShOb2RlICZOKSB7CisgICAgICBhc3NlcnQoRWRnZUluZGV4TWFwLmZpbmQoJk4pICE9IEVkZ2VJbmRleE1hcC5lbmQoKSAmJiAiTm8gc3VjaCBlZGdlISIpOworICAgICAgYXV0byAmRSA9IEVkZ2VzW0VkZ2VJbmRleE1hcC5maW5kKCZOKS0+c2Vjb25kXTsKKyAgICAgIGFzc2VydChFICYmICJEZWFkIG9yIG51bGwgZWRnZSEiKTsKKyAgICAgIHJldHVybiBFOworICAgIH0KKworICAgIEVkZ2UgKmxvb2t1cChOb2RlICZOKSB7CisgICAgICBhdXRvIEVJID0gRWRnZUluZGV4TWFwLmZpbmQoJk4pOworICAgICAgaWYgKEVJID09IEVkZ2VJbmRleE1hcC5lbmQoKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICBhdXRvICZFID0gRWRnZXNbRUktPnNlY29uZF07CisgICAgICByZXR1cm4gRSA/ICZFIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICBjYWxsX2l0ZXJhdG9yIGNhbGxfYmVnaW4oKSB7CisgICAgICByZXR1cm4gY2FsbF9pdGVyYXRvcihFZGdlcy5iZWdpbigpLCBFZGdlcy5lbmQoKSk7CisgICAgfQorICAgIGNhbGxfaXRlcmF0b3IgY2FsbF9lbmQoKSB7IHJldHVybiBjYWxsX2l0ZXJhdG9yKEVkZ2VzLmVuZCgpLCBFZGdlcy5lbmQoKSk7IH0KKworICAgIGl0ZXJhdG9yX3JhbmdlPGNhbGxfaXRlcmF0b3I+IGNhbGxzKCkgeworICAgICAgcmV0dXJuIG1ha2VfcmFuZ2UoY2FsbF9iZWdpbigpLCBjYWxsX2VuZCgpKTsKKyAgICB9CisKKyAgICBib29sIGVtcHR5KCkgeworICAgICAgZm9yIChhdXRvICZFIDogRWRnZXMpCisgICAgICAgIGlmIChFKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgVmVjdG9yVCBFZGdlczsKKyAgICBEZW5zZU1hcDxOb2RlICosIGludD4gRWRnZUluZGV4TWFwOworCisgICAgRWRnZVNlcXVlbmNlKCkgPSBkZWZhdWx0OworCisgICAgLy8vIEludGVybmFsIGhlbHBlciB0byBpbnNlcnQgYW4gZWRnZSB0byBhIG5vZGUuCisgICAgdm9pZCBpbnNlcnRFZGdlSW50ZXJuYWwoTm9kZSAmQ2hpbGROLCBFZGdlOjpLaW5kIEVLKTsKKworICAgIC8vLyBJbnRlcm5hbCBoZWxwZXIgdG8gY2hhbmdlIGFuIGVkZ2Uga2luZC4KKyAgICB2b2lkIHNldEVkZ2VLaW5kKE5vZGUgJkNoaWxkTiwgRWRnZTo6S2luZCBFSyk7CisKKyAgICAvLy8gSW50ZXJuYWwgaGVscGVyIHRvIHJlbW92ZSB0aGUgZWRnZSB0byB0aGUgZ2l2ZW4gZnVuY3Rpb24uCisgICAgYm9vbCByZW1vdmVFZGdlSW50ZXJuYWwoTm9kZSAmQ2hpbGROKTsKKworICAgIC8vLyBJbnRlcm5hbCBoZWxwZXIgdG8gcmVwbGFjZSBhbiBlZGdlIGtleSB3aXRoIGEgbmV3IG9uZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBzaG91bGQgYmUgdXNlZCB3aGVuIHRoZSBmdW5jdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIG5vZGUgaW4gdGhlCisgICAgLy8vIGdyYXBoIGdldHMgcmVwbGFjZWQgYW5kIHdlIGFyZSB1cGRhdGluZyBhbGwgb2YgdGhlIGVkZ2VzIHRvIHRoYXQgbm9kZQorICAgIC8vLyB0byB1c2UgdGhlIG5ldyBmdW5jdGlvbiBhcyB0aGUga2V5LgorICAgIHZvaWQgcmVwbGFjZUVkZ2VLZXkoRnVuY3Rpb24gJk9sZFRhcmdldCwgRnVuY3Rpb24gJk5ld1RhcmdldCk7CisgIH07CisKKyAgLy8vIEEgbm9kZSBpbiB0aGUgY2FsbCBncmFwaC4KKyAgLy8vCisgIC8vLyBUaGlzIHJlcHJlc2VudHMgYSBzaW5nbGUgbm9kZS4gSXQncyBwcmltYXJ5IHJvbGVzIGFyZSB0byBjYWNoZSB0aGUgbGlzdCBvZgorICAvLy8gY2FsbGVlcywgZGUtZHVwbGljYXRlIGFuZCBwcm92aWRlIGZhc3QgdGVzdGluZyBvZiB3aGV0aGVyIGEgZnVuY3Rpb24gaXMKKyAgLy8vIGEgY2FsbGVlLCBhbmQgZmFjaWxpdGF0ZSBpdGVyYXRpb24gb2YgY2hpbGQgbm9kZXMgaW4gdGhlIGdyYXBoLgorICAvLy8KKyAgLy8vIFRoZSBub2RlIHdvcmtzIG11Y2ggbGlrZSBhbiBvcHRpb25hbCBpbiBvcmRlciB0byBsYXppbHkgcG9wdWxhdGUgdGhlCisgIC8vLyBlZGdlcyBvZiBlYWNoIG5vZGUuIFVudGlsIHBvcHVsYXRlZCwgdGhlcmUgYXJlIG5vIGVkZ2VzLiBPbmNlIHBvcHVsYXRlZCwKKyAgLy8vIHlvdSBjYW4gYWNjZXNzIHRoZSBlZGdlcyBieSBkZXJlZmVyZW5jaW5nIHRoZSBub2RlIG9yIHVzaW5nIHRoZSBgLT5gCisgIC8vLyBvcGVyYXRvciBhcyBpZiB0aGUgbm9kZSB3YXMgYW4gYE9wdGlvbmFsPEVkZ2VTZXF1ZW5jZT5gLgorICBjbGFzcyBOb2RlIHsKKyAgICBmcmllbmQgY2xhc3MgTGF6eUNhbGxHcmFwaDsKKyAgICBmcmllbmQgY2xhc3MgTGF6eUNhbGxHcmFwaDo6UmVmU0NDOworCisgIHB1YmxpYzoKKyAgICBMYXp5Q2FsbEdyYXBoICZnZXRHcmFwaCgpIGNvbnN0IHsgcmV0dXJuICpHOyB9CisKKyAgICBGdW5jdGlvbiAmZ2V0RnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiAqRjsgfQorCisgICAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBGLT5nZXROYW1lKCk7IH0KKworICAgIC8vLyBFcXVhbGl0eSBpcyBkZWZpbmVkIGFzIGFkZHJlc3MgZXF1YWxpdHkuCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE5vZGUgJk4pIGNvbnN0IHsgcmV0dXJuIHRoaXMgPT0gJk47IH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgTm9kZSAmTikgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0oTik7IH0KKworICAgIC8vLyBUZXN0cyB3aGV0aGVyIHRoZSBub2RlIGhhcyBiZWVuIHBvcHVsYXRlZCB3aXRoIGVkZ2VzLgorICAgIGJvb2wgaXNQb3B1bGF0ZWQoKSBjb25zdCB7IHJldHVybiBFZGdlcy5oYXNWYWx1ZSgpOyB9CisKKyAgICAvLy8gVGVzdHMgd2hldGhlciB0aGlzIGlzIGFjdHVhbGx5IGEgZGVhZCBub2RlIGFuZCBubyBsb25nZXIgdmFsaWQuCisgICAgLy8vCisgICAgLy8vIFVzZXJzIHJhcmVseSBpbnRlcmFjdCB3aXRoIG5vZGVzIGluIHRoaXMgc3RhdGUgYW5kIG90aGVyIG1ldGhvZHMgYXJlCisgICAgLy8vIGludmFsaWQuIFRoaXMgaXMgdXNlZCB0byBtb2RlbCBhIG5vZGUgaW4gYW4gZWRnZSBsaXN0IHdoZXJlIHRoZQorICAgIC8vLyBmdW5jdGlvbiBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlbW92ZWQuCisgICAgYm9vbCBpc0RlYWQoKSBjb25zdCB7CisgICAgICBhc3NlcnQoIUcgPT0gIUYgJiYKKyAgICAgICAgICAgICAiQm90aCBncmFwaCBhbmQgZnVuY3Rpb24gcG9pbnRlcnMgc2hvdWxkIGJlIG51bGwgb3Igbm9uLW51bGwuIik7CisgICAgICByZXR1cm4gIUc7CisgICAgfQorCisgICAgLy8gV2UgYWxsb3cgYWNjZXNzaW5nIHRoZSBlZGdlcyBieSBkZXJlZmVyZW5jaW5nIG9yIHVzaW5nIHRoZSBhcnJvdworICAgIC8vIG9wZXJhdG9yLCBlc3NlbnRpYWxseSB3cmFwcGluZyB0aGUgaW50ZXJuYWwgb3B0aW9uYWwuCisgICAgRWRnZVNlcXVlbmNlICZvcGVyYXRvciooKSBjb25zdCB7CisgICAgICAvLyBSaXAgY29uc3Qgb2ZmIGJlY2F1c2UgdGhlIG5vZGUgaXRzZWxmIGlzbid0IGNoYW5naW5nIGhlcmUuCisgICAgICByZXR1cm4gY29uc3RfY2FzdDxFZGdlU2VxdWVuY2UgJj4oKkVkZ2VzKTsKKyAgICB9CisgICAgRWRnZVNlcXVlbmNlICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJioqdGhpczsgfQorCisgICAgLy8vIFBvcHVsYXRlIHRoZSBlZGdlcyBvZiB0aGlzIG5vZGUgaWYgbmVjZXNzYXJ5LgorICAgIC8vLworICAgIC8vLyBUaGUgZmlyc3QgdGltZSB0aGlzIGlzIGNhbGxlZCBpdCB3aWxsIHBvcHVsYXRlIHRoZSBlZGdlcyBmb3IgdGhpcyBub2RlCisgICAgLy8vIGluIHRoZSBncmFwaC4gSXQgZG9lcyB0aGlzIGJ5IHNjYW5uaW5nIHRoZSB1bmRlcmx5aW5nIGZ1bmN0aW9uLCBzbyBvbmNlCisgICAgLy8vIHRoaXMgaXMgZG9uZSwgYW55IGNoYW5nZXMgdG8gdGhhdCBmdW5jdGlvbiBtdXN0IGJlIGV4cGxpY2l0bHkgcmVmbGVjdGVkCisgICAgLy8vIGluIHVwZGF0ZXMgdG8gdGhlIGdyYXBoLgorICAgIC8vLworICAgIC8vLyBccmV0dXJucyB0aGUgcG9wdWxhdGVkIFxjIEVkZ2VTZXF1ZW5jZSB0byBzaW1wbGlmeSB3YWxraW5nIGl0LgorICAgIC8vLworICAgIC8vLyBUaGlzIHdpbGwgbm90IHVwZGF0ZSBvciByZS1zY2FuIGFueXRoaW5nIGlmIGNhbGxlZCByZXBlYXRlZGx5LiBJbnN0ZWFkLAorICAgIC8vLyB0aGUgZWRnZSBzZXF1ZW5jZSBpcyBjYWNoZWQgYW5kIHJldHVybmVkIGltbWVkaWF0ZWx5IG9uIHN1YnNlcXVlbnQKKyAgICAvLy8gY2FsbHMuCisgICAgRWRnZVNlcXVlbmNlICZwb3B1bGF0ZSgpIHsKKyAgICAgIGlmIChFZGdlcykKKyAgICAgICAgcmV0dXJuICpFZGdlczsKKworICAgICAgcmV0dXJuIHBvcHVsYXRlU2xvdygpOworICAgIH0KKworICBwcml2YXRlOgorICAgIExhenlDYWxsR3JhcGggKkc7CisgICAgRnVuY3Rpb24gKkY7CisKKyAgICAvLyBXZSBwcm92aWRlIGZvciB0aGUgREZTIG51bWJlcmluZyBhbmQgVGFyamFuIHdhbGsgbG93bGluayBudW1iZXJzIHRvIGJlCisgICAgLy8gc3RvcmVkIGRpcmVjdGx5IHdpdGhpbiB0aGUgbm9kZS4gVGhlc2UgYXJlIGJvdGggJy0xJyB3aGVuIG5vZGVzIGFyZSBwYXJ0CisgICAgLy8gb2YgYW4gU0NDIChvciBSZWZTQ0MpLCBvciAnMCcgd2hlbiBub3QgeWV0IHJlYWNoZWQgaW4gYSBERlMgd2Fsay4KKyAgICBpbnQgREZTTnVtYmVyID0gMDsKKyAgICBpbnQgTG93TGluayA9IDA7CisKKyAgICBPcHRpb25hbDxFZGdlU2VxdWVuY2U+IEVkZ2VzOworCisgICAgLy8vIEJhc2ljIGNvbnN0cnVjdG9yIGltcGxlbWVudHMgdGhlIHNjYW5uaW5nIG9mIEYgaW50byBFZGdlcyBhbmQKKyAgICAvLy8gRWRnZUluZGV4TWFwLgorICAgIE5vZGUoTGF6eUNhbGxHcmFwaCAmRywgRnVuY3Rpb24gJkYpIDogRygmRyksIEYoJkYpIHt9CisKKyAgICAvLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIHNjYW4gd2hlbiBwb3B1bGF0aW5nLgorICAgIEVkZ2VTZXF1ZW5jZSAmcG9wdWxhdGVTbG93KCk7CisKKyAgICAvLy8gSW50ZXJuYWwgaGVscGVyIHRvIGRpcmVjdGx5IHJlcGxhY2UgdGhlIGZ1bmN0aW9uIHdpdGggYSBuZXcgb25lLgorICAgIC8vLworICAgIC8vLyBUaGlzIGlzIHVzZWQgdG8gZmFjaWxpdGF0ZSB0cmFuZnNvcm1hdGlvbnMgd2hpY2ggbmVlZCB0byByZXBsYWNlIHRoZQorICAgIC8vLyBmb3JtYWwgRnVuY3Rpb24gb2JqZWN0IGJ1dCBkaXJlY3RseSBtb3ZlIHRoZSBib2R5IGFuZCB1c2VycyBmcm9tIG9uZSB0bworICAgIC8vLyB0aGUgb3RoZXIuCisgICAgdm9pZCByZXBsYWNlRnVuY3Rpb24oRnVuY3Rpb24gJk5ld0YpOworCisgICAgdm9pZCBjbGVhcigpIHsgRWRnZXMucmVzZXQoKTsgfQorCisgICAgLy8vIFByaW50IHRoZSBuYW1lIG9mIHRoaXMgbm9kZSdzIGZ1bmN0aW9uLgorICAgIGZyaWVuZCByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE5vZGUgJk4pIHsKKyAgICAgIHJldHVybiBPUyA8PCBOLkYtPmdldE5hbWUoKTsKKyAgICB9CisKKyAgICAvLy8gRHVtcCB0aGUgbmFtZSBvZiB0aGlzIG5vZGUncyBmdW5jdGlvbiB0byBzdGRlcnIuCisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisgIH07CisKKyAgLy8vIEFuIFNDQyBvZiB0aGUgY2FsbCBncmFwaC4KKyAgLy8vCisgIC8vLyBUaGlzIHJlcHJlc2VudHMgYSBTdHJvbmdseSBDb25uZWN0ZWQgQ29tcG9uZW50IG9mIHRoZSBkaXJlY3QgY2FsbCBncmFwaAorICAvLy8gLS0gaWdub3JpbmcgaW5kaXJlY3QgY2FsbHMgYW5kIGZ1bmN0aW9uIHJlZmVyZW5jZXMuIEl0IHN0b3JlcyB0aGlzIGFzCisgIC8vLyBhIGNvbGxlY3Rpb24gb2YgY2FsbCBncmFwaCBub2Rlcy4gV2hpbGUgdGhlIG9yZGVyIG9mIG5vZGVzIGluIHRoZSBTQ0MgaXMKKyAgLy8vIHN0YWJsZSwgaXQgaXMgbm90IGFueSBwYXJ0aWN1bGFyIG9yZGVyLgorICAvLy8KKyAgLy8vIFRoZSBTQ0NzIGFyZSBuZXN0ZWQgd2l0aGluIGEgXGMgUmVmU0NDLCBzZWUgYmVsb3cgZm9yIGRldGFpbHMgYWJvdXQgdGhhdAorICAvLy8gb3V0ZXIgc3RydWN0dXJlLiBTQ0NzIGRvIG5vdCBzdXBwb3J0IG11dGF0aW9uIG9mIHRoZSBjYWxsIGdyYXBoLCB0aGF0CisgIC8vLyBtdXN0IGJlIGRvbmUgdGhyb3VnaCB0aGUgY29udGFpbmluZyBcYyBSZWZTQ0MgaW4gb3JkZXIgdG8gZnVsbHkgcmVhc29uCisgIC8vLyBhYm91dCB0aGUgb3JkZXJpbmcgYW5kIGNvbm5lY3Rpb25zIG9mIHRoZSBncmFwaC4KKyAgY2xhc3MgU0NDIHsKKyAgICBmcmllbmQgY2xhc3MgTGF6eUNhbGxHcmFwaDsKKyAgICBmcmllbmQgY2xhc3MgTGF6eUNhbGxHcmFwaDo6Tm9kZTsKKworICAgIFJlZlNDQyAqT3V0ZXJSZWZTQ0M7CisgICAgU21hbGxWZWN0b3I8Tm9kZSAqLCAxPiBOb2RlczsKKworICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBOb2RlUmFuZ2VUPgorICAgIFNDQyhSZWZTQ0MgJk91dGVyUmVmU0NDLCBOb2RlUmFuZ2VUICYmTm9kZXMpCisgICAgICAgIDogT3V0ZXJSZWZTQ0MoJk91dGVyUmVmU0NDKSwgTm9kZXMoc3RkOjpmb3J3YXJkPE5vZGVSYW5nZVQ+KE5vZGVzKSkge30KKworICAgIHZvaWQgY2xlYXIoKSB7CisgICAgICBPdXRlclJlZlNDQyA9IG51bGxwdHI7CisgICAgICBOb2Rlcy5jbGVhcigpOworICAgIH0KKworICAgIC8vLyBQcmludCBhIHNob3J0IGRlc2NydGlwdGlvbiB1c2VmdWwgZm9yIGRlYnVnZ2luZyBvciBsb2dnaW5nLgorICAgIC8vLworICAgIC8vLyBXZSBwcmludCB0aGUgZnVuY3Rpb24gbmFtZXMgaW4gdGhlIFNDQyB3cmFwcGVkIGluICcoKSdzIGFuZCBza2lwcGluZworICAgIC8vLyB0aGUgbWlkZGxlIGZ1bmN0aW9ucyBpZiB0aGVyZSBhcmUgYSBsYXJnZSBudW1iZXIuCisgICAgLy8KKyAgICAvLyBOb3RlOiB0aGlzIGlzIGRlZmluZWQgaW5saW5lIHRvIGRvZGdlIGlzc3VlcyB3aXRoIEdDQydzIGludGVycHJldGF0aW9uCisgICAgLy8gb2YgZW5jbG9zaW5nIG5hbWVzcGFjZXMgZm9yIGZyaWVuZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCisgICAgZnJpZW5kIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgU0NDICZDKSB7CisgICAgICBPUyA8PCAnKCc7CisgICAgICBpbnQgaSA9IDA7CisgICAgICBmb3IgKExhenlDYWxsR3JhcGg6Ok5vZGUgJk4gOiBDKSB7CisgICAgICAgIGlmIChpID4gMCkKKyAgICAgICAgICBPUyA8PCAiLCAiOworICAgICAgICAvLyBFbGlkZSB0aGUgaW5uZXIgZWxlbWVudHMgaWYgdGhlcmUgYXJlIHRvbyBtYW55LgorICAgICAgICBpZiAoaSA+IDgpIHsKKyAgICAgICAgICBPUyA8PCAiLi4uLCAiIDw8ICpDLk5vZGVzLmJhY2soKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBPUyA8PCBOOworICAgICAgICArK2k7CisgICAgICB9CisgICAgICBPUyA8PCAnKSc7CisgICAgICByZXR1cm4gT1M7CisgICAgfQorCisgICAgLy8vIER1bXAgYSBzaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGlzIFNDQyB0byBzdGRlcnIuCisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyNpZm5kZWYgTkRFQlVHCisgICAgLy8vIFZlcmlmeSBpbnZhcmlhbnRzIGFib3V0IHRoZSBTQ0MuCisgICAgLy8vCisgICAgLy8vIFRoaXMgd2lsbCBhdHRlbXB0IHRvIHZhbGlkYXRlIGFsbCBvZiB0aGUgYmFzaWMgaW52YXJpYW50cyB3aXRoaW4gYW4KKyAgICAvLy8gU0NDLCBidXQgbm90IHRoYXQgaXQgaXMgYSBzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZXQgcGVyLXNlLiBQcmltYXJpbHkKKyAgICAvLy8gdXNlZnVsIHdoaWxlIGJ1aWxkaW5nIGFuZCB1cGRhdGluZyB0aGUgZ3JhcGggdG8gY2hlY2sgdGhhdCBiYXNpYworICAgIC8vLyBwcm9wZXJ0aWVzIGFyZSBpbiBwbGFjZSByYXRoZXIgdGhhbiBoYXZpbmcgaW5leHBsaWNhYmxlIGNyYXNoZXMgbGF0ZXIuCisgICAgdm9pZCB2ZXJpZnkoKTsKKyNlbmRpZgorCisgIHB1YmxpYzoKKyAgICB1c2luZyBpdGVyYXRvciA9IHBvaW50ZWVfaXRlcmF0b3I8U21hbGxWZWN0b3JJbXBsPE5vZGUgKj46OmNvbnN0X2l0ZXJhdG9yPjsKKworICAgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gTm9kZXMuYmVnaW4oKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIE5vZGVzLmVuZCgpOyB9CisKKyAgICBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIE5vZGVzLnNpemUoKTsgfQorCisgICAgUmVmU0NDICZnZXRPdXRlclJlZlNDQygpIGNvbnN0IHsgcmV0dXJuICpPdXRlclJlZlNDQzsgfQorCisgICAgLy8vIFRlc3QgaWYgdGhpcyBTQ0MgaXMgYSBwYXJlbnQgb2YgXGEgQy4KKyAgICAvLy8KKyAgICAvLy8gTm90ZSB0aGF0IHRoaXMgaXMgbGluZWFyIGluIHRoZSBudW1iZXIgb2YgZWRnZXMgZGVwYXJ0aW5nIHRoZSBjdXJyZW50CisgICAgLy8vIFNDQy4KKyAgICBib29sIGlzUGFyZW50T2YoY29uc3QgU0NDICZDKSBjb25zdDsKKworICAgIC8vLyBUZXN0IGlmIHRoaXMgU0NDIGlzIGFuIGFuY2VzdG9yIG9mIFxhIEMuCisgICAgLy8vCisgICAgLy8vIE5vdGUgdGhhdCBpbiB0aGUgd29yc3QgY2FzZSB0aGlzIGlzIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mIGVkZ2VzCisgICAgLy8vIGRlcGFydGluZyB0aGUgY3VycmVudCBTQ0MgYW5kIGV2ZXJ5IFNDQyBpbiB0aGUgZW50aXJlIGdyYXBoIHJlYWNoYWJsZQorICAgIC8vLyBmcm9tIHRoaXMgU0NDLiBUaHVzIHRoaXMgdmVyeSB3ZWxsIG1heSB3YWxrIGV2ZXJ5IGVkZ2UgaW4gdGhlIGVudGlyZQorICAgIC8vLyBjYWxsIGdyYXBoISBEbyBub3QgY2FsbCB0aGlzIGluIGEgdGlnaHQgbG9vcCEKKyAgICBib29sIGlzQW5jZXN0b3JPZihjb25zdCBTQ0MgJkMpIGNvbnN0OworCisgICAgLy8vIFRlc3QgaWYgdGhpcyBTQ0MgaXMgYSBjaGlsZCBvZiBcYSBDLgorICAgIC8vLworICAgIC8vLyBTZWUgdGhlIGNvbW1lbnRzIGZvciBcYyBpc1BhcmVudE9mIGZvciBkZXRhaWxlZCBub3RlcyBhYm91dCB0aGUKKyAgICAvLy8gY29tcGxleGl0eSBvZiB0aGlzIHJvdXRpbmUuCisgICAgYm9vbCBpc0NoaWxkT2YoY29uc3QgU0NDICZDKSBjb25zdCB7IHJldHVybiBDLmlzUGFyZW50T2YoKnRoaXMpOyB9CisKKyAgICAvLy8gVGVzdCBpZiB0aGlzIFNDQyBpcyBhIGRlc2NlbmRhbnQgb2YgXGEgQy4KKyAgICAvLy8KKyAgICAvLy8gU2VlIHRoZSBjb21tZW50cyBmb3IgXGMgaXNQYXJlbnRPZiBmb3IgZGV0YWlsZWQgbm90ZXMgYWJvdXQgdGhlCisgICAgLy8vIGNvbXBsZXhpdHkgb2YgdGhpcyByb3V0aW5lLgorICAgIGJvb2wgaXNEZXNjZW5kYW50T2YoY29uc3QgU0NDICZDKSBjb25zdCB7IHJldHVybiBDLmlzQW5jZXN0b3JPZigqdGhpcyk7IH0KKworICAgIC8vLyBQcm92aWRlIGEgc2hvcnQgbmFtZSBieSBwcmludGluZyB0aGlzIFNDQyB0byBhIHN0ZDo6c3RyaW5nLgorICAgIC8vLworICAgIC8vLyBUaGlzIGNvcGVzIHdpdGggdGhlIGZhY3QgdGhhdCB3ZSBkb24ndCBoYXZlIGEgbmFtZSBwZXItc2UgZm9yIGFuIFNDQworICAgIC8vLyB3aGlsZSBzdGlsbCBtYWtpbmcgdGhlIHVzZSBvZiB0aGlzIGluIGRlYnVnZ2luZyBhbmQgbG9nZ2luZyB1c2VmdWwuCisgICAgc3RkOjpzdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsKKyAgICAgIHN0ZDo6c3RyaW5nIE5hbWU7CisgICAgICByYXdfc3RyaW5nX29zdHJlYW0gT1MoTmFtZSk7CisgICAgICBPUyA8PCAqdGhpczsKKyAgICAgIE9TLmZsdXNoKCk7CisgICAgICByZXR1cm4gTmFtZTsKKyAgICB9CisgIH07CisKKyAgLy8vIEEgUmVmU0NDIG9mIHRoZSBjYWxsIGdyYXBoLgorICAvLy8KKyAgLy8vIFRoaXMgbW9kZWxzIGEgU3Ryb25nbHkgQ29ubmVjdGVkIENvbXBvbmVudCBvZiBmdW5jdGlvbiByZWZlcmVuY2UgZWRnZXMgaW4KKyAgLy8vIHRoZSBjYWxsIGdyYXBoLiBBcyBvcHBvc2VkIHRvIGFjdHVhbCBTQ0NzLCB0aGVzZSBjYW4gYmUgdXNlZCB0byBzY29wZQorICAvLy8gc3ViZ3JhcGhzIG9mIHRoZSBtb2R1bGUgd2hpY2ggYXJlIGluZGVwZW5kZW50IGZyb20gb3RoZXIgc3ViZ3JhcGhzIG9mIHRoZQorICAvLy8gbW9kdWxlIGJlY2F1c2UgdGhleSBkbyBub3QgcmVmZXJlbmNlIGl0IGluIGFueSB3YXkuIFRoaXMgaXMgYWxzbyB0aGUgdW5pdAorICAvLy8gd2hlcmUgd2UgZG8gbXV0YXRpb24gb2YgdGhlIGdyYXBoIGluIG9yZGVyIHRvIHJlc3RyaWN0IG11dGF0aW9ucyB0byB0aG9zZQorICAvLy8gd2hpY2ggZG9uJ3QgdmlvbGF0ZSB0aGlzIGluZGVwZW5kZW5jZS4KKyAgLy8vCisgIC8vLyBBIFJlZlNDQyBjb250YWlucyBhIERBRyBvZiBhY3R1YWwgU0NDcy4gQWxsIHRoZSBub2RlcyB3aXRoaW4gdGhlIFJlZlNDQworICAvLy8gYXJlIG5lY2Vzc2FyaWx5IHdpdGhpbiBzb21lIGFjdHVhbCBTQ0MgdGhhdCBuZXN0cyB3aXRoaW4gaXQuIFNpbmNlCisgIC8vLyBhIGRpcmVjdCBjYWxsICppcyogYSByZWZlcmVuY2UsIHRoZXJlIHdpbGwgYWx3YXlzIGJlIGF0IGxlYXN0IG9uZSBSZWZTQ0MKKyAgLy8vIGFyb3VuZCBhbnkgU0NDLgorICBjbGFzcyBSZWZTQ0MgeworICAgIGZyaWVuZCBjbGFzcyBMYXp5Q2FsbEdyYXBoOworICAgIGZyaWVuZCBjbGFzcyBMYXp5Q2FsbEdyYXBoOjpOb2RlOworCisgICAgTGF6eUNhbGxHcmFwaCAqRzsKKworICAgIC8vLyBBIHBvc3RvcmRlciBsaXN0IG9mIHRoZSBpbm5lciBTQ0NzLgorICAgIFNtYWxsVmVjdG9yPFNDQyAqLCA0PiBTQ0NzOworCisgICAgLy8vIEEgbWFwIGZyb20gU0NDIHRvIGluZGV4IGluIHRoZSBwb3N0b3JkZXIgbGlzdC4KKyAgICBTbWFsbERlbnNlTWFwPFNDQyAqLCBpbnQsIDQ+IFNDQ0luZGljZXM7CisKKyAgICAvLy8gRmFzdC1wYXRoIGNvbnN0cnVjdG9yLiBSZWZTQ0NzIHNob3VsZCBpbnN0ZWFkIGJlIGNvbnN0cnVjdGVkIGJ5IGNhbGxpbmcKKyAgICAvLy8gZm9ybVJlZlNDQ0Zhc3Qgb24gdGhlIGdyYXBoIGl0c2VsZi4KKyAgICBSZWZTQ0MoTGF6eUNhbGxHcmFwaCAmRyk7CisKKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgU0NDcy5jbGVhcigpOworICAgICAgU0NDSW5kaWNlcy5jbGVhcigpOworICAgIH0KKworICAgIC8vLyBQcmludCBhIHNob3J0IGRlc2NyaXB0aW9uIHVzZWZ1bCBmb3IgZGVidWdnaW5nIG9yIGxvZ2dpbmcuCisgICAgLy8vCisgICAgLy8vIFdlIHByaW50IHRoZSBTQ0NzIHdyYXBwZWQgaW4gJ1tdJ3MgYW5kIHNraXBwaW5nIHRoZSBtaWRkbGUgU0NDcyBpZgorICAgIC8vLyB0aGVyZSBhcmUgYSBsYXJnZSBudW1iZXIuCisgICAgLy8KKyAgICAvLyBOb3RlOiB0aGlzIGlzIGRlZmluZWQgaW5saW5lIHRvIGRvZGdlIGlzc3VlcyB3aXRoIEdDQydzIGludGVycHJldGF0aW9uCisgICAgLy8gb2YgZW5jbG9zaW5nIG5hbWVzcGFjZXMgZm9yIGZyaWVuZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCisgICAgZnJpZW5kIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgUmVmU0NDICZSQykgeworICAgICAgT1MgPDwgJ1snOworICAgICAgaW50IGkgPSAwOworICAgICAgZm9yIChMYXp5Q2FsbEdyYXBoOjpTQ0MgJkMgOiBSQykgeworICAgICAgICBpZiAoaSA+IDApCisgICAgICAgICAgT1MgPDwgIiwgIjsKKyAgICAgICAgLy8gRWxpZGUgdGhlIGlubmVyIGVsZW1lbnRzIGlmIHRoZXJlIGFyZSB0b28gbWFueS4KKyAgICAgICAgaWYgKGkgPiA0KSB7CisgICAgICAgICAgT1MgPDwgIi4uLiwgIiA8PCAqUkMuU0NDcy5iYWNrKCk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgT1MgPDwgQzsKKyAgICAgICAgKytpOworICAgICAgfQorICAgICAgT1MgPDwgJ10nOworICAgICAgcmV0dXJuIE9TOworICAgIH0KKworICAgIC8vLyBEdW1wIGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhpcyBSZWZTQ0MgdG8gc3RkZXJyLgorICAgIHZvaWQgZHVtcCgpIGNvbnN0OworCisjaWZuZGVmIE5ERUJVRworICAgIC8vLyBWZXJpZnkgaW52YXJpYW50cyBhYm91dCB0aGUgUmVmU0NDIGFuZCBhbGwgaXRzIFNDQ3MuCisgICAgLy8vCisgICAgLy8vIFRoaXMgd2lsbCBhdHRlbXB0IHRvIHZhbGlkYXRlIGFsbCBvZiB0aGUgaW52YXJpYW50cyAqd2l0aGluKiB0aGUKKyAgICAvLy8gUmVmU0NDLCBidXQgbm90IHRoYXQgaXQgaXMgYSBzdHJvbmdseSBjb25uZWN0ZWQgY29tcG9uZW50IG9mIHRoZSBsYXJnZXIKKyAgICAvLy8gZ3JhcGguIFRoaXMgbWFrZXMgaXQgdXNlZnVsIGV2ZW4gd2hlbiBwYXJ0aWFsbHkgdGhyb3VnaCBhbiB1cGRhdGUuCisgICAgLy8vCisgICAgLy8vIEludmFyaWFudHMgY2hlY2tlZDoKKyAgICAvLy8gLSBTQ0NzIGFuZCB0aGVpciBpbmRpY2VzIG1hdGNoLgorICAgIC8vLyAtIFRoZSBTQ0NzIGxpc3QgaXMgaW4gZmFjdCBpbiBwb3N0LW9yZGVyLgorICAgIHZvaWQgdmVyaWZ5KCk7CisjZW5kaWYKKworICAgIC8vLyBIYW5kbGUgYW55IG5lY2Vzc2FyeSBwYXJlbnQgc2V0IHVwZGF0ZXMgYWZ0ZXIgaW5zZXJ0aW5nIGEgdHJpdmlhbCByZWYKKyAgICAvLy8gb3IgY2FsbCBlZGdlLgorICAgIHZvaWQgaGFuZGxlVHJpdmlhbEVkZ2VJbnNlcnRpb24oTm9kZSAmU291cmNlTiwgTm9kZSAmVGFyZ2V0Tik7CisKKyAgcHVibGljOgorICAgIHVzaW5nIGl0ZXJhdG9yID0gcG9pbnRlZV9pdGVyYXRvcjxTbWFsbFZlY3RvckltcGw8U0NDICo+Ojpjb25zdF9pdGVyYXRvcj47CisgICAgdXNpbmcgcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxpdGVyYXRvcj47CisgICAgdXNpbmcgcGFyZW50X2l0ZXJhdG9yID0KKyAgICAgICAgcG9pbnRlZV9pdGVyYXRvcjxTbWFsbFB0clNldEltcGw8UmVmU0NDICo+Ojpjb25zdF9pdGVyYXRvcj47CisKKyAgICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFNDQ3MuYmVnaW4oKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIFNDQ3MuZW5kKCk7IH0KKworICAgIHNzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNDQ3Muc2l6ZSgpOyB9CisKKyAgICBTQ0MgJm9wZXJhdG9yW10oaW50IElkeCkgeyByZXR1cm4gKlNDQ3NbSWR4XTsgfQorCisgICAgaXRlcmF0b3IgZmluZChTQ0MgJkMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTQ0NzLmJlZ2luKCkgKyBTQ0NJbmRpY2VzLmZpbmQoJkMpLT5zZWNvbmQ7CisgICAgfQorCisgICAgLy8vIFRlc3QgaWYgdGhpcyBSZWZTQ0MgaXMgYSBwYXJlbnQgb2YgXGEgUkMuCisgICAgLy8vCisgICAgLy8vIENBVVRJT046IFRoaXMgbWV0aG9kIHdhbGtzIGV2ZXJ5IGVkZ2UgaW4gdGhlIFxjIFJlZlNDQywgaXQgY2FuIGJlIHZlcnkKKyAgICAvLy8gZXhwZW5zaXZlLgorICAgIGJvb2wgaXNQYXJlbnRPZihjb25zdCBSZWZTQ0MgJlJDKSBjb25zdDsKKworICAgIC8vLyBUZXN0IGlmIHRoaXMgUmVmU0NDIGlzIGFuIGFuY2VzdG9yIG9mIFxhIFJDLgorICAgIC8vLworICAgIC8vLyBDQVVUSU9OOiBUaGlzIG1ldGhvZCB3YWxrcyB0aGUgZGlyZWN0ZWQgZ3JhcGggb2YgZWRnZXMgYXMgZmFyIGFzCisgICAgLy8vIG5lY2Vzc2FyeSB0byBmaW5kIGEgcG9zc2libGUgcGF0aCB0byB0aGUgYXJndW1lbnQuIEluIHRoZSB3b3JzdCBjYXNlCisgICAgLy8vIHRoaXMgbWF5IHdhbGsgdGhlIGVudGlyZSBncmFwaCBhbmQgY2FuIGJlIGV4dHJlbWVseSBleHBlbnNpdmUuCisgICAgYm9vbCBpc0FuY2VzdG9yT2YoY29uc3QgUmVmU0NDICZSQykgY29uc3Q7CisKKyAgICAvLy8gVGVzdCBpZiB0aGlzIFJlZlNDQyBpcyBhIGNoaWxkIG9mIFxhIFJDLgorICAgIC8vLworICAgIC8vLyBDQVVUSU9OOiBUaGlzIG1ldGhvZCB3YWxrcyBldmVyeSBlZGdlIGluIHRoZSBhcmd1bWVudCBcYyBSZWZTQ0MsIGl0IGNhbgorICAgIC8vLyBiZSB2ZXJ5IGV4cGVuc2l2ZS4KKyAgICBib29sIGlzQ2hpbGRPZihjb25zdCBSZWZTQ0MgJlJDKSBjb25zdCB7IHJldHVybiBSQy5pc1BhcmVudE9mKCp0aGlzKTsgfQorCisgICAgLy8vIFRlc3QgaWYgdGhpcyBSZWZTQ0MgaXMgYSBkZXNjZW5kYW50IG9mIFxhIFJDLgorICAgIC8vLworICAgIC8vLyBDQVVUSU9OOiBUaGlzIG1ldGhvZCB3YWxrcyB0aGUgZGlyZWN0ZWQgZ3JhcGggb2YgZWRnZXMgYXMgZmFyIGFzCisgICAgLy8vIG5lY2Vzc2FyeSB0byBmaW5kIGEgcG9zc2libGUgcGF0aCBmcm9tIHRoZSBhcmd1bWVudC4gSW4gdGhlIHdvcnN0IGNhc2UKKyAgICAvLy8gdGhpcyBtYXkgd2FsayB0aGUgZW50aXJlIGdyYXBoIGFuZCBjYW4gYmUgZXh0cmVtZWx5IGV4cGVuc2l2ZS4KKyAgICBib29sIGlzRGVzY2VuZGFudE9mKGNvbnN0IFJlZlNDQyAmUkMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBSQy5pc0FuY2VzdG9yT2YoKnRoaXMpOworICAgIH0KKworICAgIC8vLyBQcm92aWRlIGEgc2hvcnQgbmFtZSBieSBwcmludGluZyB0aGlzIFJlZlNDQyB0byBhIHN0ZDo6c3RyaW5nLgorICAgIC8vLworICAgIC8vLyBUaGlzIGNvcGVzIHdpdGggdGhlIGZhY3QgdGhhdCB3ZSBkb24ndCBoYXZlIGEgbmFtZSBwZXItc2UgZm9yIGFuIFJlZlNDQworICAgIC8vLyB3aGlsZSBzdGlsbCBtYWtpbmcgdGhlIHVzZSBvZiB0aGlzIGluIGRlYnVnZ2luZyBhbmQgbG9nZ2luZyB1c2VmdWwuCisgICAgc3RkOjpzdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IHsKKyAgICAgIHN0ZDo6c3RyaW5nIE5hbWU7CisgICAgICByYXdfc3RyaW5nX29zdHJlYW0gT1MoTmFtZSk7CisgICAgICBPUyA8PCAqdGhpczsKKyAgICAgIE9TLmZsdXNoKCk7CisgICAgICByZXR1cm4gTmFtZTsKKyAgICB9CisKKyAgICAvLy9AeworICAgIC8vLyBcbmFtZSBNdXRhdGlvbiBBUEkKKyAgICAvLy8KKyAgICAvLy8gVGhlc2UgbWV0aG9kcyBwcm92aWRlIHRoZSBjb3JlIEFQSSBmb3IgdXBkYXRpbmcgdGhlIGNhbGwgZ3JhcGggaW4gdGhlCisgICAgLy8vIHByZXNlbmNlIG9mIChwb3RlbnRpYWxseSBzdGlsbCBpbi1mbGlnaHQpIERGUy1mb3VuZCBSZWZTQ0NzIGFuZCBTQ0NzLgorICAgIC8vLworICAgIC8vLyBOb3RlIHRoYXQgdGhlc2UgbWV0aG9kcyBzb21ldGltZXMgaGF2ZSBjb21wbGV4IHJ1bnRpbWVzLCBzbyBiZSBjYXJlZnVsCisgICAgLy8vIGhvdyB5b3UgY2FsbCB0aGVtLgorCisgICAgLy8vIE1ha2UgYW4gZXhpc3RpbmcgaW50ZXJuYWwgcmVmIGVkZ2UgaW50byBhIGNhbGwgZWRnZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBtYXkgZm9ybSBhIGxhcmdlciBjeWNsZSBhbmQgdGh1cyBjb2xsYXBzZSBTQ0NzIGludG8gVGFyZ2V0TidzIFNDQy4KKyAgICAvLy8gSWYgdGhhdCBoYXBwZW5zLCB0aGUgb3B0aW9uYWwgY2FsbGJhY2sgXHAgTWVyZ2VkQ0Igd2lsbCBiZSBpbnZva2VkIChpZgorICAgIC8vLyBwcm92aWRlZCkgb24gdGhlIFNDQ3MgYmVpbmcgbWVyZ2VkIGF3YXkgcHJpb3IgdG8gYWN0dWFsbHkgcGVyZm9ybWluZworICAgIC8vLyB0aGUgbWVyZ2UuIE5vdGUgdGhhdCB0aGlzIHdpbGwgbmV2ZXIgaW5jbHVkZSB0aGUgdGFyZ2V0IFNDQyBhcyB0aGF0CisgICAgLy8vIHdpbGwgYmUgdGhlIFNDQyBmdW5jdGlvbnMgYXJlIG1lcmdlZCBpbnRvIHRvIHJlc29sdmUgdGhlIGN5Y2xlLiBPbmNlCisgICAgLy8vIHRoaXMgZnVuY3Rpb24gcmV0dXJucywgdGhlc2UgbWVyZ2VkIFNDQ3MgYXJlIG5vdCBpbiBhIHZhbGlkIHN0YXRlIGJ1dAorICAgIC8vLyB0aGUgcG9pbnRlcnMgd2lsbCByZW1haW4gdmFsaWQgdW50aWwgZGVzdHJ1Y3Rpb24gb2YgdGhlIHBhcmVudCBncmFwaAorICAgIC8vLyBpbnN0YW5jZSBmb3IgdGhlIHB1cnBvc2Ugb2YgY2xlYXJpbmcgY2FjaGVkIGluZm9ybWF0aW9uLiBUaGlzIGZ1bmN0aW9uCisgICAgLy8vIGFsc28gcmV0dXJucyAndHJ1ZScgaWYgYSBjeWNsZSB3YXMgZm9ybWVkIGFuZCBzb21lIFNDQ3MgbWVyZ2VkIGF3YXkgYXMKKyAgICAvLy8gYSBjb252ZW5pZW5jZS4KKyAgICAvLy8KKyAgICAvLy8gQWZ0ZXIgdGhpcyBvcGVyYXRpb24sIGJvdGggU291cmNlTidzIFNDQyBhbmQgVGFyZ2V0TidzIFNDQyBtYXkgbW92ZQorICAgIC8vLyBwb3NpdGlvbiB3aXRoaW4gdGhpcyBSZWZTQ0MncyBwb3N0b3JkZXIgbGlzdC4gQW55IFNDQ3MgbWVyZ2VkIGFyZQorICAgIC8vLyBtZXJnZWQgaW50byB0aGUgVGFyZ2V0TidzIFNDQyBpbiBvcmRlciB0byBwcmVzZXJ2ZSByZWFjaGFiaWxpdHkgYW5hbHlzZXMKKyAgICAvLy8gd2hpY2ggdG9vayBwbGFjZSBvbiB0aGF0IFNDQy4KKyAgICBib29sIHN3aXRjaEludGVybmFsRWRnZVRvQ2FsbCgKKyAgICAgICAgTm9kZSAmU291cmNlTiwgTm9kZSAmVGFyZ2V0TiwKKyAgICAgICAgZnVuY3Rpb25fcmVmPHZvaWQoQXJyYXlSZWY8U0NDICo+IE1lcmdlZFNDQ3MpPiBNZXJnZUNCID0ge30pOworCisgICAgLy8vIE1ha2UgYW4gZXhpc3RpbmcgaW50ZXJuYWwgY2FsbCBlZGdlIGJldHdlZW4gc2VwYXJhdGUgU0NDcyBpbnRvIGEgcmVmCisgICAgLy8vIGVkZ2UuCisgICAgLy8vCisgICAgLy8vIElmIFNvdXJjZU4gYW5kIFRhcmdldE4gaW4gc2VwYXJhdGUgU0NDcyB3aXRoaW4gdGhpcyBSZWZTQ0MsIGNoYW5naW5nCisgICAgLy8vIHRoZSBjYWxsIGVkZ2UgYmV0d2VlbiB0aGVtIHRvIGEgcmVmIGVkZ2UgaXMgYSB0cml2aWFsIG9wZXJhdGlvbiB0aGF0CisgICAgLy8vIGRvZXMgbm90IHJlcXVpcmUgYW55IHN0cnVjdHVyYWwgY2hhbmdlcyB0byB0aGUgY2FsbCBncmFwaC4KKyAgICB2b2lkIHN3aXRjaFRyaXZpYWxJbnRlcm5hbEVkZ2VUb1JlZihOb2RlICZTb3VyY2VOLCBOb2RlICZUYXJnZXROKTsKKworICAgIC8vLyBNYWtlIGFuIGV4aXN0aW5nIGludGVybmFsIGNhbGwgZWRnZSB3aXRoaW4gYSBzaW5nbGUgU0NDIGludG8gYSByZWYKKyAgICAvLy8gZWRnZS4KKyAgICAvLy8KKyAgICAvLy8gU2luY2UgU291cmNlTiBhbmQgVGFyZ2V0TiBhcmUgcGFydCBvZiBhIHNpbmdsZSBTQ0MsIHRoaXMgU0NDIG1heSBiZQorICAgIC8vLyBzcGxpdCB1cCBkdWUgdG8gYnJlYWtpbmcgYSBjeWNsZSBpbiB0aGUgY2FsbCBlZGdlcyB0aGF0IGZvcm1lZCBpdC4gSWYKKyAgICAvLy8gdGhhdCBoYXBwZW5zLCB0aGVuIHRoaXMgcm91dGluZSB3aWxsIGluc2VydCBuZXcgU0NDcyBpbnRvIHRoZSBwb3N0b3JkZXIKKyAgICAvLy8gbGlzdCAqYmVmb3JlKiB0aGUgU0NDIG9mIFRhcmdldE4gKHByZXZpb3VzbHkgdGhlIFNDQyBvZiBib3RoKS4gVGhpcworICAgIC8vLyBwcmVzZXJ2ZXMgcG9zdG9yZGVyIGFzIHRoZSBUYXJnZXROIGNhbiByZWFjaCBhbGwgb2YgdGhlIG90aGVyIG5vZGVzIGJ5CisgICAgLy8vIGRlZmluaXRpb24gb2YgcHJldmlvdXNseSBiZWluZyBpbiBhIHNpbmdsZSBTQ0MgZm9ybWVkIGJ5IHRoZSBjeWNsZSBmcm9tCisgICAgLy8vIFNvdXJjZU4gdG8gVGFyZ2V0Ti4KKyAgICAvLy8KKyAgICAvLy8gVGhlIG5ld2x5IGFkZGVkIFNDQ3MgYXJlIGFkZGVkICppbW1lZGlhdGVseSogYW5kIGNvbnRpZ3VvdXNseQorICAgIC8vLyBwcmlvciB0byB0aGUgVGFyZ2V0TiBTQ0MgYW5kIHJldHVybiB0aGUgcmFuZ2UgY292ZXJpbmcgdGhlIG5ldyBTQ0NzIGluCisgICAgLy8vIHRoZSBSZWZTQ0MncyBwb3N0b3JkZXIgc2VxdWVuY2UuIFlvdSBjYW4gZGlyZWN0bHkgaXRlcmF0ZSB0aGUgcmV0dXJuZWQKKyAgICAvLy8gcmFuZ2UgdG8gb2JzZXJ2ZSBhbGwgb2YgdGhlIG5ldyBTQ0NzIGluIHBvc3RvcmRlci4KKyAgICAvLy8KKyAgICAvLy8gTm90ZSB0aGF0IGlmIFNvdXJjZU4gYW5kIFRhcmdldE4gYXJlIGluIHNlcGFyYXRlIFNDQ3MsIHRoZSBzaW1wbGVyCisgICAgLy8vIHJvdXRpbmUgYHN3aXRjaFRyaXZpYWxJbnRlcm5hbEVkZ2VUb1JlZmAgc2hvdWxkIGJlIHVzZWQgaW5zdGVhZC4KKyAgICBpdGVyYXRvcl9yYW5nZTxpdGVyYXRvcj4gc3dpdGNoSW50ZXJuYWxFZGdlVG9SZWYoTm9kZSAmU291cmNlTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZSAmVGFyZ2V0Tik7CisKKyAgICAvLy8gTWFrZSBhbiBleGlzdGluZyBvdXRnb2luZyByZWYgZWRnZSBpbnRvIGEgY2FsbCBlZGdlLgorICAgIC8vLworICAgIC8vLyBOb3RlIHRoYXQgdGhpcyBpcyB0cml2aWFsIGFzIHRoZXJlIGFyZSBubyBjeWNsaWMgaW1wYWN0cyBhbmQgdGhlcmUKKyAgICAvLy8gcmVtYWlucyBhIHJlZmVyZW5jZSBlZGdlLgorICAgIHZvaWQgc3dpdGNoT3V0Z29pbmdFZGdlVG9DYWxsKE5vZGUgJlNvdXJjZU4sIE5vZGUgJlRhcmdldE4pOworCisgICAgLy8vIE1ha2UgYW4gZXhpc3Rpbmcgb3V0Z29pbmcgY2FsbCBlZGdlIGludG8gYSByZWYgZWRnZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBpcyB0cml2aWFsIGFzIHRoZXJlIGFyZSBubyBjeWNsaWMgaW1wYWN0cyBhbmQgdGhlcmUgcmVtYWlucworICAgIC8vLyBhIHJlZmVyZW5jZSBlZGdlLgorICAgIHZvaWQgc3dpdGNoT3V0Z29pbmdFZGdlVG9SZWYoTm9kZSAmU291cmNlTiwgTm9kZSAmVGFyZ2V0Tik7CisKKyAgICAvLy8gSW5zZXJ0IGEgcmVmIGVkZ2UgZnJvbSBvbmUgbm9kZSBpbiB0aGlzIFJlZlNDQyB0byBhbm90aGVyIGluIHRoaXMKKyAgICAvLy8gUmVmU0NDLgorICAgIC8vLworICAgIC8vLyBUaGlzIGlzIGFsd2F5cyBhIHRyaXZpYWwgb3BlcmF0aW9uIGFzIGl0IGRvZXNuJ3QgY2hhbmdlIGFueSBwYXJ0IG9mIHRoZQorICAgIC8vLyBncmFwaCBzdHJ1Y3R1cmUgYmVzaWRlcyBjb25uZWN0aW5nIHRoZSB0d28gbm9kZXMuCisgICAgLy8vCisgICAgLy8vIE5vdGUgdGhhdCB3ZSBkb24ndCBzdXBwb3J0IGRpcmVjdGx5IGluc2VydGluZyBpbnRlcm5hbCAqY2FsbCogZWRnZXMKKyAgICAvLy8gYmVjYXVzZSB0aGF0IGNvdWxkIGNoYW5nZSB0aGUgZ3JhcGggc3RydWN0dXJlIGFuZCByZXF1aXJlcyByZXR1cm5pbmcKKyAgICAvLy8gaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBiZWNhbWUgaW52YWxpZC4gQXMgYSBjb25zZXF1ZW5jZSwgdGhlIHBhdHRlcm4KKyAgICAvLy8gc2hvdWxkIGJlIHRvIGZpcnN0IGluc2VydCB0aGUgbmVjZXNzYXJ5IHJlZiBlZGdlLCBhbmQgdGhlbiB0byBzd2l0Y2ggaXQKKyAgICAvLy8gdG8gYSBjYWxsIGVkZ2UgaWYgbmVlZGVkIGFuZCBoYW5kbGUgYW55IGludmFsaWRhdGlvbiB0aGF0IHJlc3VsdHMuIFNlZQorICAgIC8vLyB0aGUgXGMgc3dpdGNoSW50ZXJuYWxFZGdlVG9DYWxsIHJvdXRpbmUgZm9yIGRldGFpbHMuCisgICAgdm9pZCBpbnNlcnRJbnRlcm5hbFJlZkVkZ2UoTm9kZSAmU291cmNlTiwgTm9kZSAmVGFyZ2V0Tik7CisKKyAgICAvLy8gSW5zZXJ0IGFuIGVkZ2Ugd2hvc2UgcGFyZW50IGlzIGluIHRoaXMgUmVmU0NDIGFuZCBjaGlsZCBpcyBpbiBzb21lCisgICAgLy8vIGNoaWxkIFJlZlNDQy4KKyAgICAvLy8KKyAgICAvLy8gVGhlcmUgbXVzdCBiZSBhbiBleGlzdGluZyBwYXRoIGZyb20gdGhlIFxwIFNvdXJjZU4gdG8gdGhlIFxwIFRhcmdldE4uCisgICAgLy8vIFRoaXMgb3BlcmF0aW9uIGlzIGluZXhwZW5zaXZlIGFuZCBkb2VzIG5vdCBjaGFuZ2UgdGhlIHNldCBvZiBTQ0NzIGFuZAorICAgIC8vLyBSZWZTQ0NzIGluIHRoZSBncmFwaC4KKyAgICB2b2lkIGluc2VydE91dGdvaW5nRWRnZShOb2RlICZTb3VyY2VOLCBOb2RlICZUYXJnZXROLCBFZGdlOjpLaW5kIEVLKTsKKworICAgIC8vLyBJbnNlcnQgYW4gZWRnZSB3aG9zZSBzb3VyY2UgaXMgaW4gYSBkZXNjZW5kYW50IFJlZlNDQyBhbmQgdGFyZ2V0IGlzIGluCisgICAgLy8vIHRoaXMgUmVmU0NDLgorICAgIC8vLworICAgIC8vLyBUaGVyZSBtdXN0IGJlIGFuIGV4aXN0aW5nIHBhdGggZnJvbSB0aGUgdGFyZ2V0IHRvIHRoZSBzb3VyY2UgaW4gdGhpcworICAgIC8vLyBjYXNlLgorICAgIC8vLworICAgIC8vLyBOQiEgVGhpcyBpcyBoYXMgdGhlIHBvdGVudGlhbCB0byBiZSBhIHZlcnkgZXhwZW5zaXZlIGZ1bmN0aW9uLiBJdAorICAgIC8vLyBpbmhlcmVudGx5IGZvcm1zIGEgY3ljbGUgaW4gdGhlIHByaW9yIFJlZlNDQyBEQUcgYW5kIHdlIGhhdmUgdG8gbWVyZ2UKKyAgICAvLy8gUmVmU0NDcyB0byByZXNvbHZlIHRoYXQgY3ljbGUuIEJ1dCBmaW5kaW5nIGFsbCBvZiB0aGUgUmVmU0NDcyB3aGljaAorICAgIC8vLyBwYXJ0aWNpcGF0ZSBpbiB0aGUgY3ljbGUgY2FuIGluIHRoZSB3b3JzdCBjYXNlIHJlcXVpcmUgdHJhdmVyc2luZyBldmVyeQorICAgIC8vLyBSZWZTQ0MgaW4gdGhlIGdyYXBoLiBFdmVyeSBhdHRlbXB0IGlzIG1hZGUgdG8gYXZvaWQgdGhhdCwgYnV0IHBhc3NlcworICAgIC8vLyBtdXN0IHN0aWxsIGV4ZXJjaXNlIGNhdXRpb24gY2FsbGluZyB0aGlzIHJvdXRpbmUgcmVwZWF0ZWRseS4KKyAgICAvLy8KKyAgICAvLy8gQWxzbyBub3RlIHRoYXQgdGhpcyBjYW4gb25seSBpbnNlcnQgcmVmIGVkZ2VzLiBJbiBvcmRlciB0byBpbnNlcnQKKyAgICAvLy8gYSBjYWxsIGVkZ2UsIGZpcnN0IGluc2VydCBhIHJlZiBlZGdlIGFuZCB0aGVuIHN3aXRjaCBpdCB0byBhIGNhbGwgZWRnZS4KKyAgICAvLy8gVGhlc2UgYXJlIGludGVudGlvbmFsbHkga2VwdCBhcyBzZXBhcmF0ZSBpbnRlcmZhY2VzIGJlY2F1c2UgZWFjaCBzdGVwCisgICAgLy8vIG9mIHRoZSBvcGVyYXRpb24gaW52YWxpZGF0ZXMgYSBkaWZmZXJlbnQgc2V0IG9mIGRhdGEgc3RydWN0dXJlcy4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyByZXR1cm5zIGFsbCB0aGUgUmVmU0NDcyB3aGljaCB3ZXJlIG1lcmdlZCBpbnRvIHRoZSB0aGlzIFJlZlNDQworICAgIC8vLyAodGhlIHRhcmdldCdzKS4gVGhpcyBhbGxvd3MgY2FsbGVycyB0byBpbnZhbGlkYXRlIGFueSBjYWNoZWQKKyAgICAvLy8gaW5mb3JtYXRpb24uCisgICAgLy8vCisgICAgLy8vIEZJWE1FOiBXZSBjb3VsZCBwb3NzaWJseSBvcHRpbWl6ZSB0aGlzIHF1aXRlIGEgYml0IGZvciBjYXNlcyB3aGVyZSB0aGUKKyAgICAvLy8gY2FsbGVyIGFuZCBjYWxsZWUgYXJlIHZlcnkgbmVhcmJ5IGluIHRoZSBncmFwaC4gU2VlIGNvbW1lbnRzIGluIHRoZQorICAgIC8vLyBpbXBsZW1lbnRhdGlvbiBmb3IgZGV0YWlscywgYnV0IHRoYXQgdXNlIGNhc2UgbWlnaHQgaW1wYWN0IHVzZXJzLgorICAgIFNtYWxsVmVjdG9yPFJlZlNDQyAqLCAxPiBpbnNlcnRJbmNvbWluZ1JlZkVkZ2UoTm9kZSAmU291cmNlTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vZGUgJlRhcmdldE4pOworCisgICAgLy8vIFJlbW92ZSBhbiBlZGdlIHdob3NlIHNvdXJjZSBpcyBpbiB0aGlzIFJlZlNDQyBhbmQgdGFyZ2V0IGlzICpub3QqLgorICAgIC8vLworICAgIC8vLyBUaGlzIHJlbW92ZXMgYW4gaW50ZXItUmVmU0NDIGVkZ2UuIEFsbCBpbnRlci1SZWZTQ0MgZWRnZXMgb3JpZ2luYXRpbmcKKyAgICAvLy8gZnJvbSB0aGlzIFNDQyBoYXZlIGJlZW4gZnVsbHkgZXhwbG9yZWQgYnkgYW55IGluLWZsaWdodCBERlMgZ3JhcGgKKyAgICAvLy8gZm9ybWF0aW9uLCBzbyB0aGlzIGlzIGFsd2F5cyBzYWZlIHRvIGNhbGwgb25jZSB5b3UgaGF2ZSB0aGUgc291cmNlCisgICAgLy8vIFJlZlNDQy4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBvcGVyYXRpb24gZG9lcyBub3QgY2hhbmdlIHRoZSBjeWNsaWMgc3RydWN0dXJlIG9mIHRoZSBncmFwaCBhbmQgc28KKyAgICAvLy8gaXMgdmVyeSBpbmV4cGVuc2l2ZS4gSXQgbWF5IGNoYW5nZSB0aGUgY29ubmVjdGl2aXR5IGdyYXBoIG9mIHRoZSBTQ0NzCisgICAgLy8vIHRob3VnaCwgc28gYmUgY2FyZWZ1bCBjYWxsaW5nIHRoaXMgd2hpbGUgaXRlcmF0aW5nIG92ZXIgdGhlbS4KKyAgICB2b2lkIHJlbW92ZU91dGdvaW5nRWRnZShOb2RlICZTb3VyY2VOLCBOb2RlICZUYXJnZXROKTsKKworICAgIC8vLyBSZW1vdmUgYSBsaXN0IG9mIHJlZiBlZGdlcyB3aGljaCBhcmUgZW50aXJlbHkgd2l0aGluIHRoaXMgUmVmU0NDLgorICAgIC8vLworICAgIC8vLyBCb3RoIHRoZSBcYSBTb3VyY2VOIGFuZCBhbGwgb2YgdGhlIFxhIFRhcmdldE5zIG11c3QgYmUgd2l0aGluIHRoaXMKKyAgICAvLy8gUmVmU0NDLiBSZW1vdmluZyB0aGVzZSBlZGdlcyBtYXkgYnJlYWsgY3ljbGVzIHRoYXQgZm9ybSB0aGlzIFJlZlNDQyBhbmQKKyAgICAvLy8gdGh1cyB0aGlzIG9wZXJhdGlvbiBtYXkgY2hhbmdlIHRoZSBSZWZTQ0MgZ3JhcGggc2lnbmlmaWNhbnRseS4gSW4KKyAgICAvLy8gcGFydGljdWxhciwgdGhpcyBvcGVyYXRpb24gd2lsbCByZS1mb3JtIG5ldyBSZWZTQ0NzIGJhc2VkIG9uIHRoZQorICAgIC8vLyByZW1haW5pbmcgY29ubmVjdGl2aXR5IG9mIHRoZSBncmFwaC4gVGhlIGZvbGxvd2luZyBpbnZhcmlhbnRzIGFyZQorICAgIC8vLyBndWFyYW50ZWVkIHRvIGhvbGQgYWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZDoKKyAgICAvLy8KKyAgICAvLy8gMSkgSWYgYSByZWYtY3ljbGUgcmVtYWlucyBhZnRlciByZW1vdmFsLCBpdCBsZWF2ZXMgdGhpcyBSZWZTQ0MgaW50YWN0CisgICAgLy8vICAgIGFuZCBpbiB0aGUgZ3JhcGguIE5vIG5ldyBSZWZTQ0NzIGFyZSBidWlsdC4KKyAgICAvLy8gMikgT3RoZXJ3aXNlLCB0aGlzIFJlZlNDQyB3aWxsIGJlIGRlYWQgYWZ0ZXIgdGhpcyBjYWxsIGFuZCBubyBsb25nZXIgaW4KKyAgICAvLy8gICAgdGhlIGdyYXBoIG9yIHRoZSBwb3N0b3JkZXIgdHJhdmVyc2FsIG9mIHRoZSBjYWxsIGdyYXBoLiBBbnkgaXRlcmF0b3IKKyAgICAvLy8gICAgcG9pbnRpbmcgYXQgdGhpcyBSZWZTQ0Mgd2lsbCBiZWNvbWUgaW52YWxpZC4KKyAgICAvLy8gMykgQWxsIG5ld2x5IGZvcm1lZCBSZWZTQ0NzIHdpbGwgYmUgcmV0dXJuZWQgYW5kIHRoZSBvcmRlciBvZiB0aGUKKyAgICAvLy8gICAgUmVmU0NDcyByZXR1cm5lZCB3aWxsIGJlIGEgdmFsaWQgcG9zdG9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgbmV3CisgICAgLy8vICAgIFJlZlNDQ3MuCisgICAgLy8vIDQpIE5vIFJlZlNDQyBvdGhlciB0aGFuIHRoaXMgUmVmU0NDIGhhcyBpdHMgbWVtYmVyIHNldCBjaGFuZ2VkICh0aGlzIGlzCisgICAgLy8vICAgIGluaGVyZW50IGluIHRoZSBkZWZpbml0aW9uIG9mIHJlbW92aW5nIHN1Y2ggYW4gZWRnZSkuCisgICAgLy8vCisgICAgLy8vIFRoZXNlIGludmFyaWFudHMgYXJlIHZlcnkgaW1wb3J0YW50IHRvIGVuc3VyZSB0aGF0IHdlIGNhbiBidWlsZAorICAgIC8vLyBvcHRpbWl6YXRpb24gcGlwZWxpbmVzIG9uIHRvcCBvZiB0aGUgQ0dTQ0MgcGFzcyBtYW5hZ2VyIHdoaWNoCisgICAgLy8vIGludGVsbGlnZW50bHkgdXBkYXRlIHRoZSBSZWZTQ0MgZ3JhcGggd2l0aG91dCBpbnZhbGlkYXRpbmcgb3RoZXIgcGFydHMKKyAgICAvLy8gb2YgdGhlIFJlZlNDQyBncmFwaC4KKyAgICAvLy8KKyAgICAvLy8gTm90ZSB0aGF0IHdlIHByb3ZpZGUgbm8gcm91dGluZSB0byByZW1vdmUgYSAqY2FsbCogZWRnZS4gSW5zdGVhZCwgeW91CisgICAgLy8vIG11c3QgZmlyc3Qgc3dpdGNoIGl0IHRvIGEgcmVmIGVkZ2UgdXNpbmcgXGMgc3dpdGNoSW50ZXJuYWxFZGdlVG9SZWYuCisgICAgLy8vIFRoaXMgc3BsaXQgQVBJIGlzIGludGVudGlvbmFsIGFzIGVhY2ggb2YgdGhlc2UgdHdvIHN0ZXBzIGNhbiBpbnZhbGlkYXRlCisgICAgLy8vIGEgZGlmZmVyZW50IGFzcGVjdCBvZiB0aGUgZ3JhcGggc3RydWN0dXJlIGFuZCBuZWVkcyB0byBoYXZlIHRoZQorICAgIC8vLyBpbnZhbGlkYXRpb24gaGFuZGxlZCBpbmRlcGVuZGVudGx5LgorICAgIC8vLworICAgIC8vLyBUaGUgcnVudGltZSBjb21wbGV4aXR5IG9mIHRoaXMgbWV0aG9kIGlzLCBpbiB0aGUgd29yc3QgY2FzZSwgTyhWK0UpCisgICAgLy8vIHdoZXJlIFYgaXMgdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGlzIFJlZlNDQyBhbmQgRSBpcyB0aGUgbnVtYmVyIG9mCisgICAgLy8vIGVkZ2VzIGxlYXZpbmcgdGhlIG5vZGVzIGluIHRoaXMgUmVmU0NDLiBOb3RlIHRoYXQgRSBpbmNsdWRlcyBib3RoIGVkZ2VzCisgICAgLy8vIHdpdGhpbiB0aGlzIFJlZlNDQyBhbmQgZWRnZXMgZnJvbSB0aGlzIFJlZlNDQyB0byBjaGlsZCBSZWZTQ0NzLiBTb21lCisgICAgLy8vIGVmZm9ydCBoYXMgYmVlbiBtYWRlIHRvIG1pbmltaXplIHRoZSBvdmVyaGVhZCBvZiBjb21tb24gY2FzZXMgc3VjaCBhcworICAgIC8vLyBzZWxmLWVkZ2VzIGFuZCBlZGdlIHJlbW92YWxzIHdoaWNoIHJlc3VsdCBpbiBhIHNwYW5uaW5nIHRyZWUgd2l0aCBubworICAgIC8vLyBtb3JlIGN5Y2xlcy4KKyAgICBTbWFsbFZlY3RvcjxSZWZTQ0MgKiwgMT4gcmVtb3ZlSW50ZXJuYWxSZWZFZGdlKE5vZGUgJlNvdXJjZU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxOb2RlICo+IFRhcmdldE5zKTsKKworICAgIC8vLyBBIGNvbnZlbmllbmNlIHdyYXBwZXIgYXJvdW5kIHRoZSBhYm92ZSB0byBoYW5kbGUgdHJpdmlhbCBjYXNlcyBvZgorICAgIC8vLyBpbnNlcnRpbmcgYSBuZXcgY2FsbCBlZGdlLgorICAgIC8vLworICAgIC8vLyBUaGlzIGlzIHRyaXZpYWwgd2hlbmV2ZXIgdGhlIHRhcmdldCBpcyBpbiB0aGUgc2FtZSBTQ0MgYXMgdGhlIHNvdXJjZSBvcgorICAgIC8vLyB0aGUgZWRnZSBpcyBhbiBvdXRnb2luZyBlZGdlIHRvIHNvbWUgZGVzY2VuZGFudCBTQ0MuIEluIHRoZXNlIGNhc2VzCisgICAgLy8vIHRoZXJlIGlzIG5vIGNoYW5nZSB0byB0aGUgY3ljbGljIHN0cnVjdHVyZSBvZiBTQ0NzIG9yIFJlZlNDQ3MuCisgICAgLy8vCisgICAgLy8vIFRvIGZ1cnRoZXIgbWFrZSBjYWxsaW5nIHRoaXMgY29udmVuaWVudCwgaXQgYWxzbyBoYW5kbGVzIGluc2VydGluZworICAgIC8vLyBhbHJlYWR5IGV4aXN0aW5nIGVkZ2VzLgorICAgIHZvaWQgaW5zZXJ0VHJpdmlhbENhbGxFZGdlKE5vZGUgJlNvdXJjZU4sIE5vZGUgJlRhcmdldE4pOworCisgICAgLy8vIEEgY29udmVuaWVuY2Ugd3JhcHBlciBhcm91bmQgdGhlIGFib3ZlIHRvIGhhbmRsZSB0cml2aWFsIGNhc2VzIG9mCisgICAgLy8vIGluc2VydGluZyBhIG5ldyByZWYgZWRnZS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBpcyB0cml2aWFsIHdoZW5ldmVyIHRoZSB0YXJnZXQgaXMgaW4gdGhlIHNhbWUgUmVmU0NDIGFzIHRoZSBzb3VyY2UKKyAgICAvLy8gb3IgdGhlIGVkZ2UgaXMgYW4gb3V0Z29pbmcgZWRnZSB0byBzb21lIGRlc2NlbmRhbnQgUmVmU0NDLiBJbiB0aGVzZQorICAgIC8vLyBjYXNlcyB0aGVyZSBpcyBubyBjaGFuZ2UgdG8gdGhlIGN5Y2xpYyBzdHJ1Y3R1cmUgb2YgdGhlIFJlZlNDQ3MuCisgICAgLy8vCisgICAgLy8vIFRvIGZ1cnRoZXIgbWFrZSBjYWxsaW5nIHRoaXMgY29udmVuaWVudCwgaXQgYWxzbyBoYW5kbGVzIGluc2VydGluZworICAgIC8vLyBhbHJlYWR5IGV4aXN0aW5nIGVkZ2VzLgorICAgIHZvaWQgaW5zZXJ0VHJpdmlhbFJlZkVkZ2UoTm9kZSAmU291cmNlTiwgTm9kZSAmVGFyZ2V0Tik7CisKKyAgICAvLy8gRGlyZWN0bHkgcmVwbGFjZSBhIG5vZGUncyBmdW5jdGlvbiB3aXRoIGEgbmV3IGZ1bmN0aW9uLgorICAgIC8vLworICAgIC8vLyBUaGlzIHNob3VsZCBiZSB1c2VkIHdoZW4gbW92aW5nIHRoZSBib2R5IGFuZCB1c2VycyBvZiBhIGZ1bmN0aW9uIHRvCisgICAgLy8vIGEgbmV3IGZvcm1hbCBmdW5jdGlvbiBvYmplY3QgYnV0IG5vdCBvdGhlcndpc2UgY2hhbmdpbmcgdGhlIGNhbGwgZ3JhcGgKKyAgICAvLy8gc3RydWN0dXJlIGluIGFueSB3YXkuCisgICAgLy8vCisgICAgLy8vIEl0IHJlcXVpcmVzIHRoYXQgdGhlIG9sZCBmdW5jdGlvbiBpbiB0aGUgcHJvdmlkZWQgbm9kZSBoYXZlIHplcm8gdXNlcworICAgIC8vLyBhbmQgdGhlIG5ldyBmdW5jdGlvbiBtdXN0IGhhdmUgY2FsbHMgYW5kIHJlZmVyZW5jZXMgdG8gaXQgZXN0YWJsaXNoaW5nCisgICAgLy8vIGFuIGVxdWl2YWxlbnQgZ3JhcGguCisgICAgdm9pZCByZXBsYWNlTm9kZUZ1bmN0aW9uKE5vZGUgJk4sIEZ1bmN0aW9uICZOZXdGKTsKKworICAgIC8vL0B9CisgIH07CisKKyAgLy8vIEEgcG9zdC1vcmRlciBkZXB0aC1maXJzdCBSZWZTQ0MgaXRlcmF0b3Igb3ZlciB0aGUgY2FsbCBncmFwaC4KKyAgLy8vCisgIC8vLyBUaGlzIGl0ZXJhdG9yIHdhbGtzIHRoZSBjYWNoZWQgcG9zdC1vcmRlciBzZXF1ZW5jZSBvZiBSZWZTQ0NzLiBIb3dldmVyLAorICAvLy8gaXQgdHJhZGVzIHN0YWJpbGl0eSBmb3IgZmxleGliaWxpdHkuIEl0IGlzIHJlc3RyaWN0ZWQgdG8gYSBmb3J3YXJkCisgIC8vLyBpdGVyYXRvciBidXQgd2lsbCBzdXJ2aXZlIG11dGF0aW9ucyB3aGljaCBpbnNlcnQgbmV3IFJlZlNDQ3MgYW5kIGNvbnRpbnVlCisgIC8vLyB0byBwb2ludCB0byB0aGUgc2FtZSBSZWZTQ0MgZXZlbiBpZiBpdCBtb3ZlcyBpbiB0aGUgcG9zdC1vcmRlciBzZXF1ZW5jZS4KKyAgY2xhc3MgcG9zdG9yZGVyX3JlZl9zY2NfaXRlcmF0b3IKKyAgICAgIDogcHVibGljIGl0ZXJhdG9yX2ZhY2FkZV9iYXNlPHBvc3RvcmRlcl9yZWZfc2NjX2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgUmVmU0NDPiB7CisgICAgZnJpZW5kIGNsYXNzIExhenlDYWxsR3JhcGg7CisgICAgZnJpZW5kIGNsYXNzIExhenlDYWxsR3JhcGg6Ok5vZGU7CisKKyAgICAvLy8gTm9uY2UgdHlwZSB0byBzZWxlY3QgdGhlIGNvbnN0cnVjdG9yIGZvciB0aGUgZW5kIGl0ZXJhdG9yLgorICAgIHN0cnVjdCBJc0F0RW5kVCB7fTsKKworICAgIExhenlDYWxsR3JhcGggKkc7CisgICAgUmVmU0NDICpSQyA9IG51bGxwdHI7CisKKyAgICAvLy8gQnVpbGQgdGhlIGJlZ2luIGl0ZXJhdG9yIGZvciBhIG5vZGUuCisgICAgcG9zdG9yZGVyX3JlZl9zY2NfaXRlcmF0b3IoTGF6eUNhbGxHcmFwaCAmRykgOiBHKCZHKSwgUkMoZ2V0UkMoRywgMCkpIHt9CisKKyAgICAvLy8gQnVpbGQgdGhlIGVuZCBpdGVyYXRvciBmb3IgYSBub2RlLiBUaGlzIGlzIHNlbGVjdGVkIHB1cmVseSBieSBvdmVybG9hZC4KKyAgICBwb3N0b3JkZXJfcmVmX3NjY19pdGVyYXRvcihMYXp5Q2FsbEdyYXBoICZHLCBJc0F0RW5kVCAvKk5vbmNlKi8pIDogRygmRykge30KKworICAgIC8vLyBHZXQgdGhlIHBvc3Qtb3JkZXIgUmVmU0NDIGF0IHRoZSBnaXZlbiBpbmRleCBvZiB0aGUgcG9zdG9yZGVyIHdhbGssCisgICAgLy8vIHBvcHVsYXRpbmcgaXQgaWYgbmVjZXNzYXJ5LgorICAgIHN0YXRpYyBSZWZTQ0MgKmdldFJDKExhenlDYWxsR3JhcGggJkcsIGludCBJbmRleCkgeworICAgICAgaWYgKEluZGV4ID09IChpbnQpRy5Qb3N0T3JkZXJSZWZTQ0NzLnNpemUoKSkKKyAgICAgICAgLy8gV2UncmUgYXQgdGhlIGVuZC4KKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgIHJldHVybiBHLlBvc3RPcmRlclJlZlNDQ3NbSW5kZXhdOworICAgIH0KKworICBwdWJsaWM6CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHBvc3RvcmRlcl9yZWZfc2NjX2l0ZXJhdG9yICZBcmcpIGNvbnN0IHsKKyAgICAgIHJldHVybiBHID09IEFyZy5HICYmIFJDID09IEFyZy5SQzsKKyAgICB9CisKKyAgICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKlJDOyB9CisKKyAgICB1c2luZyBpdGVyYXRvcl9mYWNhZGVfYmFzZTo6b3BlcmF0b3IrKzsKKyAgICBwb3N0b3JkZXJfcmVmX3NjY19pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICAgIGFzc2VydChSQyAmJiAiQ2Fubm90IGluY3JlbWVudCB0aGUgZW5kIGl0ZXJhdG9yISIpOworICAgICAgUkMgPSBnZXRSQygqRywgRy0+UmVmU0NDSW5kaWNlcy5maW5kKFJDKS0+c2Vjb25kICsgMSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICB9OworCisgIC8vLyBDb25zdHJ1Y3QgYSBncmFwaCBmb3IgdGhlIGdpdmVuIG1vZHVsZS4KKyAgLy8vCisgIC8vLyBUaGlzIHNldHMgdXAgdGhlIGdyYXBoIGFuZCBjb21wdXRlcyBhbGwgb2YgdGhlIGVudHJ5IHBvaW50cyBvZiB0aGUgZ3JhcGguCisgIC8vLyBObyBmdW5jdGlvbiBkZWZpbml0aW9ucyBhcmUgc2Nhbm5lZCB1bnRpbCB0aGVpciBub2RlcyBpbiB0aGUgZ3JhcGggYXJlCisgIC8vLyByZXF1ZXN0ZWQgZHVyaW5nIHRyYXZlcnNhbC4KKyAgTGF6eUNhbGxHcmFwaChNb2R1bGUgJk0sIFRhcmdldExpYnJhcnlJbmZvICZUTEkpOworCisgIExhenlDYWxsR3JhcGgoTGF6eUNhbGxHcmFwaCAmJkcpOworICBMYXp5Q2FsbEdyYXBoICZvcGVyYXRvcj0oTGF6eUNhbGxHcmFwaCAmJlJIUyk7CisKKyAgRWRnZVNlcXVlbmNlOjppdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIEVudHJ5RWRnZXMuYmVnaW4oKTsgfQorICBFZGdlU2VxdWVuY2U6Oml0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIEVudHJ5RWRnZXMuZW5kKCk7IH0KKworICB2b2lkIGJ1aWxkUmVmU0NDcygpOworCisgIHBvc3RvcmRlcl9yZWZfc2NjX2l0ZXJhdG9yIHBvc3RvcmRlcl9yZWZfc2NjX2JlZ2luKCkgeworICAgIGlmICghRW50cnlFZGdlcy5lbXB0eSgpKQorICAgICAgYXNzZXJ0KCFQb3N0T3JkZXJSZWZTQ0NzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAiTXVzdCBmb3JtIFJlZlNDQ3MgYmVmb3JlIGl0ZXJhdGluZyB0aGVtISIpOworICAgIHJldHVybiBwb3N0b3JkZXJfcmVmX3NjY19pdGVyYXRvcigqdGhpcyk7CisgIH0KKyAgcG9zdG9yZGVyX3JlZl9zY2NfaXRlcmF0b3IgcG9zdG9yZGVyX3JlZl9zY2NfZW5kKCkgeworICAgIGlmICghRW50cnlFZGdlcy5lbXB0eSgpKQorICAgICAgYXNzZXJ0KCFQb3N0T3JkZXJSZWZTQ0NzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgICAiTXVzdCBmb3JtIFJlZlNDQ3MgYmVmb3JlIGl0ZXJhdGluZyB0aGVtISIpOworICAgIHJldHVybiBwb3N0b3JkZXJfcmVmX3NjY19pdGVyYXRvcigqdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zdG9yZGVyX3JlZl9zY2NfaXRlcmF0b3I6OklzQXRFbmRUKCkpOworICB9CisKKyAgaXRlcmF0b3JfcmFuZ2U8cG9zdG9yZGVyX3JlZl9zY2NfaXRlcmF0b3I+IHBvc3RvcmRlcl9yZWZfc2NjcygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShwb3N0b3JkZXJfcmVmX3NjY19iZWdpbigpLCBwb3N0b3JkZXJfcmVmX3NjY19lbmQoKSk7CisgIH0KKworICAvLy8gTG9va3VwIGEgZnVuY3Rpb24gaW4gdGhlIGdyYXBoIHdoaWNoIGhhcyBhbHJlYWR5IGJlZW4gc2Nhbm5lZCBhbmQgYWRkZWQuCisgIE5vZGUgKmxvb2t1cChjb25zdCBGdW5jdGlvbiAmRikgY29uc3QgeyByZXR1cm4gTm9kZU1hcC5sb29rdXAoJkYpOyB9CisKKyAgLy8vIExvb2t1cCBhIGZ1bmN0aW9uJ3MgU0NDIGluIHRoZSBncmFwaC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBudWxsIGlmIHRoZSBmdW5jdGlvbiBoYXNuJ3QgYmVlbiBhc3NpZ25lZCBhbiBTQ0MgdmlhIHRoZSBSZWZTQ0MKKyAgLy8vIGl0ZXJhdG9yIHdhbGsuCisgIFNDQyAqbG9va3VwU0NDKE5vZGUgJk4pIGNvbnN0IHsgcmV0dXJuIFNDQ01hcC5sb29rdXAoJk4pOyB9CisKKyAgLy8vIExvb2t1cCBhIGZ1bmN0aW9uJ3MgUmVmU0NDIGluIHRoZSBncmFwaC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBudWxsIGlmIHRoZSBmdW5jdGlvbiBoYXNuJ3QgYmVlbiBhc3NpZ25lZCBhIFJlZlNDQyB2aWEgdGhlCisgIC8vLyBSZWZTQ0MgaXRlcmF0b3Igd2Fsay4KKyAgUmVmU0NDICpsb29rdXBSZWZTQ0MoTm9kZSAmTikgY29uc3QgeworICAgIGlmIChTQ0MgKkMgPSBsb29rdXBTQ0MoTikpCisgICAgICByZXR1cm4gJkMtPmdldE91dGVyUmVmU0NDKCk7CisKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBHZXQgYSBncmFwaCBub2RlIGZvciBhIGdpdmVuIGZ1bmN0aW9uLCBzY2FubmluZyBpdCB0byBwb3B1bGF0ZSB0aGUgZ3JhcGgKKyAgLy8vIGRhdGEgYXMgbmVjZXNzYXJ5LgorICBOb2RlICZnZXQoRnVuY3Rpb24gJkYpIHsKKyAgICBOb2RlIComTiA9IE5vZGVNYXBbJkZdOworICAgIGlmIChOKQorICAgICAgcmV0dXJuICpOOworCisgICAgcmV0dXJuIGluc2VydEludG8oRiwgTik7CisgIH0KKworICAvLy8gR2V0IHRoZSBzZXF1ZW5jZSBvZiBrbm93biBhbmQgZGVmaW5lZCBsaWJyYXJ5IGZ1bmN0aW9ucy4KKyAgLy8vCisgIC8vLyBUaGVzZSBmdW5jdGlvbnMsIGJlY2F1c2UgdGhleSBhcmUga25vd24gdG8gTExWTSwgY2FuIGhhdmUgY2FsbHMKKyAgLy8vIGludHJvZHVjZWQgb3V0IG9mIHRoaW4gYWlyIGZyb20gYXJiaXRyYXJ5IElSLgorICBBcnJheVJlZjxGdW5jdGlvbiAqPiBnZXRMaWJGdW5jdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIExpYkZ1bmN0aW9ucy5nZXRBcnJheVJlZigpOworICB9CisKKyAgLy8vIFRlc3Qgd2hldGhlciBhIGZ1bmN0aW9uIGlzIGEga25vd24gYW5kIGRlZmluZWQgbGlicmFyeSBmdW5jdGlvbiB0cmFja2VkIGJ5CisgIC8vLyB0aGUgY2FsbCBncmFwaC4KKyAgLy8vCisgIC8vLyBCZWNhdXNlIHRoZXNlIGZ1bmN0aW9ucyBhcmUga25vd24gdG8gTExWTSB0aGV5IGFyZSBzcGVjaWFsbHkgbW9kZWxlZCBpbgorICAvLy8gdGhlIGNhbGwgZ3JhcGggYW5kIGV2ZW4gd2hlbiBhbGwgSVItbGV2ZWwgcmVmZXJlbmNlcyBoYXZlIGJlZW4gcmVtb3ZlZAorICAvLy8gcmVtYWluIGFjdGl2ZSBhbmQgcmVhY2hhYmxlLgorICBib29sIGlzTGliRnVuY3Rpb24oRnVuY3Rpb24gJkYpIGNvbnN0IHsgcmV0dXJuIExpYkZ1bmN0aW9ucy5jb3VudCgmRik7IH0KKworICAvLy9AeworICAvLy8gXG5hbWUgUHJlLVNDQyBNdXRhdGlvbiBBUEkKKyAgLy8vCisgIC8vLyBUaGVzZSBtZXRob2RzIGFyZSBvbmx5IHZhbGlkIHRvIGNhbGwgcHJpb3IgdG8gZm9ybWluZyBhbnkgU0NDcyBmb3IgdGhpcworICAvLy8gY2FsbCBncmFwaC4gVGhleSBjYW4gYmUgdXNlZCB0byB1cGRhdGUgdGhlIGNvcmUgbm9kZS1ncmFwaCBkdXJpbmcKKyAgLy8vIGEgbm9kZS1iYXNlZCBpbm9yZGVyIHRyYXZlcnNhbCB0aGF0IHByZWNlZGVzIGFueSBTQ0MtYmFzZWQgdHJhdmVyc2FsLgorICAvLy8KKyAgLy8vIE9uY2UgeW91IGJlZ2luIG1hbmlwdWxhdGluZyBhIGNhbGwgZ3JhcGgncyBTQ0NzLCBtb3N0IG11dGF0aW9uIG9mIHRoZQorICAvLy8gZ3JhcGggbXVzdCBiZSBwZXJmb3JtZWQgdmlhIGEgUmVmU0NDIG1ldGhvZC4gVGhlcmUgYXJlIHNvbWUgZXhjZXB0aW9ucworICAvLy8gYmVsb3cuCisKKyAgLy8vIFVwZGF0ZSB0aGUgY2FsbCBncmFwaCBhZnRlciBpbnNlcnRpbmcgYSBuZXcgZWRnZS4KKyAgdm9pZCBpbnNlcnRFZGdlKE5vZGUgJlNvdXJjZU4sIE5vZGUgJlRhcmdldE4sIEVkZ2U6OktpbmQgRUspOworCisgIC8vLyBVcGRhdGUgdGhlIGNhbGwgZ3JhcGggYWZ0ZXIgaW5zZXJ0aW5nIGEgbmV3IGVkZ2UuCisgIHZvaWQgaW5zZXJ0RWRnZShGdW5jdGlvbiAmU291cmNlLCBGdW5jdGlvbiAmVGFyZ2V0LCBFZGdlOjpLaW5kIEVLKSB7CisgICAgcmV0dXJuIGluc2VydEVkZ2UoZ2V0KFNvdXJjZSksIGdldChUYXJnZXQpLCBFSyk7CisgIH0KKworICAvLy8gVXBkYXRlIHRoZSBjYWxsIGdyYXBoIGFmdGVyIGRlbGV0aW5nIGFuIGVkZ2UuCisgIHZvaWQgcmVtb3ZlRWRnZShOb2RlICZTb3VyY2VOLCBOb2RlICZUYXJnZXROKTsKKworICAvLy8gVXBkYXRlIHRoZSBjYWxsIGdyYXBoIGFmdGVyIGRlbGV0aW5nIGFuIGVkZ2UuCisgIHZvaWQgcmVtb3ZlRWRnZShGdW5jdGlvbiAmU291cmNlLCBGdW5jdGlvbiAmVGFyZ2V0KSB7CisgICAgcmV0dXJuIHJlbW92ZUVkZ2UoZ2V0KFNvdXJjZSksIGdldChUYXJnZXQpKTsKKyAgfQorCisgIC8vL0B9CisKKyAgLy8vQHsKKyAgLy8vIFxuYW1lIEdlbmVyYWwgTXV0YXRpb24gQVBJCisgIC8vLworICAvLy8gVGhlcmUgYXJlIGEgdmVyeSBsaW1pdGVkIHNldCBvZiBtdXRhdGlvbnMgYWxsb3dlZCBvbiB0aGUgZ3JhcGggYXMgYSB3aG9sZQorICAvLy8gb25jZSBTQ0NzIGhhdmUgc3RhcnRlZCB0byBiZSBmb3JtZWQuIFRoZXNlIHJvdXRpbmVzIGhhdmUgc3RyaWN0IGNvbnRyYWN0cworICAvLy8gYnV0IG1heSBiZSBjYWxsZWQgYXQgYW55IHBvaW50LgorCisgIC8vLyBSZW1vdmUgYSBkZWFkIGZ1bmN0aW9uIGZyb20gdGhlIGNhbGwgZ3JhcGggKHR5cGljYWxseSB0byBkZWxldGUgaXQpLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGUgZnVuY3Rpb24gbXVzdCBoYXZlIGFuIGVtcHR5IHVzZSBsaXN0LCBhbmQgdGhlIGNhbGwgZ3JhcGgKKyAgLy8vIG11c3QgYmUgdXAtdG8tZGF0ZSBwcmlvciB0byBjYWxsaW5nIHRoaXMuIFRoYXQgbWVhbnMgaXQgaXMgYnkgaXRzZWxmIGluCisgIC8vLyBhIG1heGltYWwgU0NDIHdoaWNoIGlzIGJ5IGl0c2VsZiBpbiBhIG1heGltYWwgUmVmU0NDLCBldGMuIE5vIHN0cnVjdHVyYWwKKyAgLy8vIGNoYW5nZXMgcmVzdWx0IGZyb20gY2FsbGluZyB0aGlzIHJvdXRpbmUgb3RoZXIgdGhhbiBwb3RlbnRpYWxseSByZW1vdmluZworICAvLy8gZW50cnkgcG9pbnRzIGludG8gdGhlIGNhbGwgZ3JhcGguCisgIC8vLworICAvLy8gSWYgU0NDIGZvcm1hdGlvbiBoYXMgYmVndW4sIHRoaXMgZnVuY3Rpb24gbXVzdCBub3QgYmUgcGFydCBvZiB0aGUgY3VycmVudAorICAvLy8gREZTIGluIG9yZGVyIHRvIGNhbGwgdGhpcyBzYWZlbHkuIFR5cGljYWxseSwgdGhlIGZ1bmN0aW9uIHdpbGwgaGF2ZSBiZWVuCisgIC8vLyBmdWxseSB2aXNpdGVkIGJ5IHRoZSBERlMgcHJpb3IgdG8gY2FsbGluZyB0aGlzIHJvdXRpbmUuCisgIHZvaWQgcmVtb3ZlRGVhZEZ1bmN0aW9uKEZ1bmN0aW9uICZGKTsKKworICAvLy9AfQorCisgIC8vL0B7CisgIC8vLyBcbmFtZSBTdGF0aWMgaGVscGVycyBmb3IgY29kZSBkb2luZyB1cGRhdGVzIHRvIHRoZSBjYWxsIGdyYXBoLgorICAvLy8KKyAgLy8vIFRoZXNlIGhlbHBlcnMgYXJlIHVzZWQgdG8gaW1wbGVtZW50IHBhcnRzIG9mIHRoZSBjYWxsIGdyYXBoIGJ1dCBhcmUgYWxzbworICAvLy8gdXNlZnVsIHRvIGNvZGUgZG9pbmcgdXBkYXRlcyBvciBvdGhlcndpc2Ugd2FudGluZyB0byB3YWxrIHRoZSBJUiBpbiB0aGUKKyAgLy8vIHNhbWUgcGF0dGVybnMgYXMgd2hlbiB3ZSBidWlsZCB0aGUgY2FsbCBncmFwaC4KKworICAvLy8gUmVjdXJzaXZlbHkgdmlzaXRzIHRoZSBkZWZpbmVkIGZ1bmN0aW9ucyB3aG9zZSBhZGRyZXNzIGlzIHJlYWNoYWJsZSBmcm9tCisgIC8vLyBldmVyeSBjb25zdGFudCBpbiB0aGUgXHAgV29ya2xpc3QuCisgIC8vLworICAvLy8gRG9lc24ndCByZWN1cnNlIHRocm91Z2ggYW55IGNvbnN0YW50cyBhbHJlYWR5IGluIHRoZSBccCBWaXNpdGVkIHNldCwgYW5kCisgIC8vLyB1cGRhdGVzIHRoYXQgc2V0IHdpdGggZXZlcnkgY29uc3RhbnQgdmlzaXRlZC4KKyAgLy8vCisgIC8vLyBGb3IgZWFjaCBkZWZpbmVkIGZ1bmN0aW9uLCBjYWxscyBccCBDYWxsYmFjayB3aXRoIHRoYXQgZnVuY3Rpb24uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDYWxsYmFja1Q+CisgIHN0YXRpYyB2b2lkIHZpc2l0UmVmZXJlbmNlcyhTbWFsbFZlY3RvckltcGw8Q29uc3RhbnQgKj4gJldvcmtsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXRJbXBsPENvbnN0YW50ICo+ICZWaXNpdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2tUIENhbGxiYWNrKSB7CisgICAgd2hpbGUgKCFXb3JrbGlzdC5lbXB0eSgpKSB7CisgICAgICBDb25zdGFudCAqQyA9IFdvcmtsaXN0LnBvcF9iYWNrX3ZhbCgpOworCisgICAgICBpZiAoRnVuY3Rpb24gKkYgPSBkeW5fY2FzdDxGdW5jdGlvbj4oQykpIHsKKyAgICAgICAgaWYgKCFGLT5pc0RlY2xhcmF0aW9uKCkpCisgICAgICAgICAgQ2FsbGJhY2soKkYpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgaWYgKEJsb2NrQWRkcmVzcyAqQkEgPSBkeW5fY2FzdDxCbG9ja0FkZHJlc3M+KEMpKSB7CisgICAgICAgIC8vIFRoZSBibG9ja2FkZHJlc3MgY29uc3RhbnQgZXhwcmVzc2lvbiBpcyBhIHdlaXJkIHNwZWNpYWwgY2FzZSwgd2UKKyAgICAgICAgLy8gY2FuJ3QgZ2VuZXJpY2FsbHkgd2FsayBpdHMgb3BlcmFuZHMgdGhlIHdheSB3ZSBkbyBmb3IgYWxsIG90aGVyCisgICAgICAgIC8vIGNvbnN0YW50cy4KKyAgICAgICAgaWYgKFZpc2l0ZWQuaW5zZXJ0KEJBLT5nZXRGdW5jdGlvbigpKS5zZWNvbmQpCisgICAgICAgICAgV29ya2xpc3QucHVzaF9iYWNrKEJBLT5nZXRGdW5jdGlvbigpKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGZvciAoVmFsdWUgKk9wIDogQy0+b3BlcmFuZF92YWx1ZXMoKSkKKyAgICAgICAgaWYgKFZpc2l0ZWQuaW5zZXJ0KGNhc3Q8Q29uc3RhbnQ+KE9wKSkuc2Vjb25kKQorICAgICAgICAgIFdvcmtsaXN0LnB1c2hfYmFjayhjYXN0PENvbnN0YW50PihPcCkpOworICAgIH0KKyAgfQorCisgIC8vL0B9CisKK3ByaXZhdGU6CisgIHVzaW5nIG5vZGVfc3RhY2tfaXRlcmF0b3IgPSBTbWFsbFZlY3RvckltcGw8Tm9kZSAqPjo6cmV2ZXJzZV9pdGVyYXRvcjsKKyAgdXNpbmcgbm9kZV9zdGFja19yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPG5vZGVfc3RhY2tfaXRlcmF0b3I+OworCisgIC8vLyBBbGxvY2F0b3IgdGhhdCBob2xkcyBhbGwgdGhlIGNhbGwgZ3JhcGggbm9kZXMuCisgIFNwZWNpZmljQnVtcFB0ckFsbG9jYXRvcjxOb2RlPiBCUEE7CisKKyAgLy8vIE1hcHMgZnVuY3Rpb24tPm5vZGUgZm9yIGZhc3QgbG9va3VwLgorICBEZW5zZU1hcDxjb25zdCBGdW5jdGlvbiAqLCBOb2RlICo+IE5vZGVNYXA7CisKKyAgLy8vIFRoZSBlbnRyeSBlZGdlcyBpbnRvIHRoZSBncmFwaC4KKyAgLy8vCisgIC8vLyBUaGVzZSBlZGdlcyBhcmUgZnJvbSAiZXh0ZXJuYWwiIHNvdXJjZXMuIFB1dCBhbm90aGVyIHdheSwgdGhleQorICAvLy8gZXNjYXBlIGF0IHRoZSBtb2R1bGUgc2NvcGUuCisgIEVkZ2VTZXF1ZW5jZSBFbnRyeUVkZ2VzOworCisgIC8vLyBBbGxvY2F0b3IgdGhhdCBob2xkcyBhbGwgdGhlIGNhbGwgZ3JhcGggU0NDcy4KKyAgU3BlY2lmaWNCdW1wUHRyQWxsb2NhdG9yPFNDQz4gU0NDQlBBOworCisgIC8vLyBNYXBzIEZ1bmN0aW9uIC0+IFNDQyBmb3IgZmFzdCBsb29rdXAuCisgIERlbnNlTWFwPE5vZGUgKiwgU0NDICo+IFNDQ01hcDsKKworICAvLy8gQWxsb2NhdG9yIHRoYXQgaG9sZHMgYWxsIHRoZSBjYWxsIGdyYXBoIFJlZlNDQ3MuCisgIFNwZWNpZmljQnVtcFB0ckFsbG9jYXRvcjxSZWZTQ0M+IFJlZlNDQ0JQQTsKKworICAvLy8gVGhlIHBvc3Qtb3JkZXIgc2VxdWVuY2Ugb2YgUmVmU0NDcy4KKyAgLy8vCisgIC8vLyBUaGlzIGxpc3QgaXMgbGF6aWx5IGZvcm1lZCB0aGUgZmlyc3QgdGltZSB3ZSB3YWxrIHRoZSBncmFwaC4KKyAgU21hbGxWZWN0b3I8UmVmU0NDICosIDE2PiBQb3N0T3JkZXJSZWZTQ0NzOworCisgIC8vLyBBIG1hcCBmcm9tIFJlZlNDQyB0byB0aGUgaW5kZXggZm9yIGl0IGluIHRoZSBwb3N0b3JkZXIgc2VxdWVuY2Ugb2YKKyAgLy8vIFJlZlNDQ3MuCisgIERlbnNlTWFwPFJlZlNDQyAqLCBpbnQ+IFJlZlNDQ0luZGljZXM7CisKKyAgLy8vIERlZmluZWQgZnVuY3Rpb25zIHRoYXQgYXJlIGFsc28ga25vd24gbGlicmFyeSBmdW5jdGlvbnMgd2hpY2ggdGhlCisgIC8vLyBvcHRpbWl6ZXIgY2FuIHJlYXNvbiBhYm91dCBhbmQgdGhlcmVmb3JlIG1pZ2h0IGludHJvZHVjZSBjYWxscyB0byBvdXQgb2YKKyAgLy8vIHRoaW4gYWlyLgorICBTbWFsbFNldFZlY3RvcjxGdW5jdGlvbiAqLCA0PiBMaWJGdW5jdGlvbnM7CisKKyAgLy8vIEhlbHBlciB0byBpbnNlcnQgYSBuZXcgZnVuY3Rpb24sIHdpdGggYW4gYWxyZWFkeSBsb29rZWQtdXAgZW50cnkgaW4KKyAgLy8vIHRoZSBOb2RlTWFwLgorICBOb2RlICZpbnNlcnRJbnRvKEZ1bmN0aW9uICZGLCBOb2RlIComTWFwcGVkTik7CisKKyAgLy8vIEhlbHBlciB0byB1cGRhdGUgcG9pbnRlcnMgYmFjayB0byB0aGUgZ3JhcGggb2JqZWN0IGR1cmluZyBtb3Zlcy4KKyAgdm9pZCB1cGRhdGVHcmFwaFB0cnMoKTsKKworICAvLy8gQWxsb2NhdGVzIGFuIFNDQyBhbmQgY29uc3RydWN0cyBpdCB1c2luZyB0aGUgZ3JhcGggYWxsb2NhdG9yLgorICAvLy8KKyAgLy8vIFRoZSBhcmd1bWVudHMgYXJlIGZvcndhcmRlZCB0byB0aGUgY29uc3RydWN0b3IuCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUcz4gU0NDICpjcmVhdGVTQ0MoVHMgJiYuLi4gQXJncykgeworICAgIHJldHVybiBuZXcgKFNDQ0JQQS5BbGxvY2F0ZSgpKSBTQ0Moc3RkOjpmb3J3YXJkPFRzPihBcmdzKS4uLik7CisgIH0KKworICAvLy8gQWxsb2NhdGVzIGEgUmVmU0NDIGFuZCBjb25zdHJ1Y3RzIGl0IHVzaW5nIHRoZSBncmFwaCBhbGxvY2F0b3IuCisgIC8vLworICAvLy8gVGhlIGFyZ3VtZW50cyBhcmUgZm9yd2FyZGVkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFRzPiBSZWZTQ0MgKmNyZWF0ZVJlZlNDQyhUcyAmJi4uLiBBcmdzKSB7CisgICAgcmV0dXJuIG5ldyAoUmVmU0NDQlBBLkFsbG9jYXRlKCkpIFJlZlNDQyhzdGQ6OmZvcndhcmQ8VHM+KEFyZ3MpLi4uKTsKKyAgfQorCisgIC8vLyBDb21tb24gbG9naWMgZm9yIGJ1aWxkaW5nIFNDQ3MgZnJvbSBhIHNlcXVlbmNlIG9mIHJvb3RzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYSB2ZXJ5IGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIGRlcHRoLWZpcnN0IHdhbGsgYW5kIFNDQworICAvLy8gZm9ybWF0aW9uIGFsZ29yaXRobS4gSXQgdXNlcyBhIGdlbmVyaWMgc2VxdWVuY2Ugb2Ygcm9vdHMgYW5kIGdlbmVyaWMKKyAgLy8vIGNhbGxiYWNrcyBmb3IgZWFjaCBzdGVwLiBUaGlzIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgdG8gaW1wbGVtZW50IGJvdGgKKyAgLy8vIHRoZSBSZWZTQ0MgZm9ybWF0aW9uIGFuZCBTQ0MgZm9ybWF0aW9uIHdpdGggc2hhcmVkIGxvZ2ljLgorICAvLy8KKyAgLy8vIEN1cnJlbnRseSB0aGlzIGlzIGEgcmVsYXRpdmVseSBuYWl2ZSBpbXBsZW1lbnRhdGlvbiBvZiBUYXJqYW4ncyBERlMKKyAgLy8vIGFsZ29yaXRobSB0byBmb3JtIHRoZSBTQ0NzLgorICAvLy8KKyAgLy8vIEZJWE1FOiBXZSBzaG91bGQgY29uc2lkZXIgbmV3ZXIgdmFyaWFudHMgc3VjaCBhcyBOdXV0aWxhLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUm9vdHNULCB0eXBlbmFtZSBHZXRCZWdpblQsIHR5cGVuYW1lIEdldEVuZFQsCisgICAgICAgICAgICB0eXBlbmFtZSBHZXROb2RlVCwgdHlwZW5hbWUgRm9ybVNDQ0NhbGxiYWNrVD4KKyAgc3RhdGljIHZvaWQgYnVpbGRHZW5lcmljU0NDcyhSb290c1QgJiZSb290cywgR2V0QmVnaW5UICYmR2V0QmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RW5kVCAmJkdldEVuZCwgR2V0Tm9kZVQgJiZHZXROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcm1TQ0NDYWxsYmFja1QgJiZGb3JtU0NDKTsKKworICAvLy8gQnVpbGQgdGhlIFNDQ3MgZm9yIGEgUmVmU0NDIG91dCBvZiBhIGxpc3Qgb2Ygbm9kZXMuCisgIHZvaWQgYnVpbGRTQ0NzKFJlZlNDQyAmUkMsIG5vZGVfc3RhY2tfcmFuZ2UgTm9kZXMpOworCisgIC8vLyBHZXQgdGhlIGluZGV4IG9mIGEgUmVmU0NDIHdpdGhpbiB0aGUgcG9zdG9yZGVyIHRyYXZlcnNhbC4KKyAgLy8vCisgIC8vLyBSZXF1aXJlcyB0aGF0IHRoaXMgUmVmU0NDIGlzIGEgdmFsaWQgb25lIGluIHRoZSAocGVyaGFwcyBwYXJ0aWFsKQorICAvLy8gcG9zdG9yZGVyIHRyYXZlcnNlZCBwYXJ0IG9mIHRoZSBncmFwaC4KKyAgaW50IGdldFJlZlNDQ0luZGV4KFJlZlNDQyAmUkMpIHsKKyAgICBhdXRvIEluZGV4SXQgPSBSZWZTQ0NJbmRpY2VzLmZpbmQoJlJDKTsKKyAgICBhc3NlcnQoSW5kZXhJdCAhPSBSZWZTQ0NJbmRpY2VzLmVuZCgpICYmICJSZWZTQ0MgZG9lc24ndCBoYXZlIGFuIGluZGV4ISIpOworICAgIGFzc2VydChQb3N0T3JkZXJSZWZTQ0NzW0luZGV4SXQtPnNlY29uZF0gPT0gJlJDICYmCisgICAgICAgICAgICJJbmRleCBkb2VzIG5vdCBwb2ludCBiYWNrIGF0IFJDISIpOworICAgIHJldHVybiBJbmRleEl0LT5zZWNvbmQ7CisgIH0KK307CisKK2lubGluZSBMYXp5Q2FsbEdyYXBoOjpFZGdlOjpFZGdlKCkgOiBWYWx1ZSgpIHt9CitpbmxpbmUgTGF6eUNhbGxHcmFwaDo6RWRnZTo6RWRnZShOb2RlICZOLCBLaW5kIEspIDogVmFsdWUoJk4sIEspIHt9CisKK2lubGluZSBMYXp5Q2FsbEdyYXBoOjpFZGdlOjpvcGVyYXRvciBib29sKCkgY29uc3QgeworICByZXR1cm4gVmFsdWUuZ2V0UG9pbnRlcigpICYmICFWYWx1ZS5nZXRQb2ludGVyKCktPmlzRGVhZCgpOworfQorCitpbmxpbmUgTGF6eUNhbGxHcmFwaDo6RWRnZTo6S2luZCBMYXp5Q2FsbEdyYXBoOjpFZGdlOjpnZXRLaW5kKCkgY29uc3QgeworICBhc3NlcnQoKnRoaXMgJiYgIlF1ZXJpZWQgYSBudWxsIGVkZ2UhIik7CisgIHJldHVybiBWYWx1ZS5nZXRJbnQoKTsKK30KKworaW5saW5lIGJvb2wgTGF6eUNhbGxHcmFwaDo6RWRnZTo6aXNDYWxsKCkgY29uc3QgeworICBhc3NlcnQoKnRoaXMgJiYgIlF1ZXJpZWQgYSBudWxsIGVkZ2UhIik7CisgIHJldHVybiBnZXRLaW5kKCkgPT0gQ2FsbDsKK30KKworaW5saW5lIExhenlDYWxsR3JhcGg6Ok5vZGUgJkxhenlDYWxsR3JhcGg6OkVkZ2U6OmdldE5vZGUoKSBjb25zdCB7CisgIGFzc2VydCgqdGhpcyAmJiAiUXVlcmllZCBhIG51bGwgZWRnZSEiKTsKKyAgcmV0dXJuICpWYWx1ZS5nZXRQb2ludGVyKCk7Cit9CisKK2lubGluZSBGdW5jdGlvbiAmTGF6eUNhbGxHcmFwaDo6RWRnZTo6Z2V0RnVuY3Rpb24oKSBjb25zdCB7CisgIGFzc2VydCgqdGhpcyAmJiAiUXVlcmllZCBhIG51bGwgZWRnZSEiKTsKKyAgcmV0dXJuIGdldE5vZGUoKS5nZXRGdW5jdGlvbigpOworfQorCisvLyBQcm92aWRlIEdyYXBoVHJhaXRzIHNwZWNpYWxpemF0aW9ucyBmb3IgY2FsbCBncmFwaHMuCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8TGF6eUNhbGxHcmFwaDo6Tm9kZSAqPiB7CisgIHVzaW5nIE5vZGVSZWYgPSBMYXp5Q2FsbEdyYXBoOjpOb2RlICo7CisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gTGF6eUNhbGxHcmFwaDo6RWRnZVNlcXVlbmNlOjppdGVyYXRvcjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoTm9kZVJlZiBOKSB7IHJldHVybiBOOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsgcmV0dXJuICgqTiktPmJlZ2luKCk7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlUmVmIE4pIHsgcmV0dXJuICgqTiktPmVuZCgpOyB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPExhenlDYWxsR3JhcGggKj4geworICB1c2luZyBOb2RlUmVmID0gTGF6eUNhbGxHcmFwaDo6Tm9kZSAqOworICB1c2luZyBDaGlsZEl0ZXJhdG9yVHlwZSA9IExhenlDYWxsR3JhcGg6OkVkZ2VTZXF1ZW5jZTo6aXRlcmF0b3I7CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKE5vZGVSZWYgTikgeyByZXR1cm4gTjsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7IHJldHVybiAoKk4pLT5iZWdpbigpOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7IHJldHVybiAoKk4pLT5lbmQoKTsgfQorfTsKKworLy8vIEFuIGFuYWx5c2lzIHBhc3Mgd2hpY2ggY29tcHV0ZXMgdGhlIGNhbGwgZ3JhcGggZm9yIGEgbW9kdWxlLgorY2xhc3MgTGF6eUNhbGxHcmFwaEFuYWx5c2lzIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPExhenlDYWxsR3JhcGhBbmFseXNpcz4geworICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48TGF6eUNhbGxHcmFwaEFuYWx5c2lzPjsKKworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCitwdWJsaWM6CisgIC8vLyBJbmZvcm0gZ2VuZXJpYyBjbGllbnRzIG9mIHRoZSByZXN1bHQgdHlwZS4KKyAgdXNpbmcgUmVzdWx0ID0gTGF6eUNhbGxHcmFwaDsKKworICAvLy8gQ29tcHV0ZSB0aGUgXGMgTGF6eUNhbGxHcmFwaCBmb3IgdGhlIG1vZHVsZSBcYyBNLgorICAvLy8KKyAgLy8vIFRoaXMganVzdCBidWlsZHMgdGhlIHNldCBvZiBlbnRyeSBwb2ludHMgdG8gdGhlIGNhbGwgZ3JhcGguIFRoZSByZXN0IGlzCisgIC8vLyBidWlsdCBsYXppbHkgYXMgaXQgaXMgd2Fsa2VkLgorICBMYXp5Q2FsbEdyYXBoIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pIHsKKyAgICByZXR1cm4gTGF6eUNhbGxHcmFwaChNLCBBTS5nZXRSZXN1bHQ8VGFyZ2V0TGlicmFyeUFuYWx5c2lzPihNKSk7CisgIH0KK307CisKKy8vLyBBIHBhc3Mgd2hpY2ggcHJpbnRzIHRoZSBjYWxsIGdyYXBoIHRvIGEgXGMgcmF3X29zdHJlYW0uCisvLy8KKy8vLyBUaGlzIGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIHRlc3RpbmcgdGhlIGFuYWx5c2lzLgorY2xhc3MgTGF6eUNhbGxHcmFwaFByaW50ZXJQYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxMYXp5Q2FsbEdyYXBoUHJpbnRlclBhc3M+IHsKKyAgcmF3X29zdHJlYW0gJk9TOworCitwdWJsaWM6CisgIGV4cGxpY2l0IExhenlDYWxsR3JhcGhQcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmT1MpOworCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIEEgcGFzcyB3aGljaCBwcmludHMgdGhlIGNhbGwgZ3JhcGggYXMgYSBET1QgZmlsZSB0byBhIFxjIHJhd19vc3RyZWFtLgorLy8vCisvLy8gVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsIGZvciB2aXN1YWxpemF0aW9uIHB1cnBvc2VzLgorY2xhc3MgTGF6eUNhbGxHcmFwaERPVFByaW50ZXJQYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxMYXp5Q2FsbEdyYXBoRE9UUHJpbnRlclBhc3M+IHsKKyAgcmF3X29zdHJlYW0gJk9TOworCitwdWJsaWM6CisgIGV4cGxpY2l0IExhenlDYWxsR3JhcGhET1RQcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmT1MpOworCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfTEFaWUNBTExHUkFQSF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xhenlWYWx1ZUluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTGF6eVZhbHVlSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYTViZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xhenlWYWx1ZUluZm8uaApAQCAtMCwwICsxLDE2NyBAQAorLy89PT0tIExhenlWYWx1ZUluZm8uaCAtIFZhbHVlIGNvbnN0cmFpbnQgYW5hbHlzaXMgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIGZvciBsYXp5IGNvbXB1dGF0aW9uIG9mIHZhbHVlIGNvbnN0cmFpbnQKKy8vIGluZm9ybWF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19MQVpZVkFMVUVJTkZPX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19MQVpZVkFMVUVJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBBc3N1bXB0aW9uQ2FjaGU7CisgIGNsYXNzIENvbnN0YW50OworICBjbGFzcyBDb25zdGFudFJhbmdlOworICBjbGFzcyBEYXRhTGF5b3V0OworICBjbGFzcyBEb21pbmF0b3JUcmVlOworICBjbGFzcyBJbnN0cnVjdGlvbjsKKyAgY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CisgIGNsYXNzIFZhbHVlOworCisvLy8gVGhpcyBwYXNzIGNvbXB1dGVzLCBjYWNoZXMsIGFuZCB2ZW5kcyBsYXp5IHZhbHVlIGNvbnN0cmFpbnQgaW5mb3JtYXRpb24uCitjbGFzcyBMYXp5VmFsdWVJbmZvIHsKKyAgZnJpZW5kIGNsYXNzIExhenlWYWx1ZUluZm9XcmFwcGVyUGFzczsKKyAgQXNzdW1wdGlvbkNhY2hlICpBQyA9IG51bGxwdHI7CisgIGNvbnN0IERhdGFMYXlvdXQgKkRMID0gbnVsbHB0cjsKKyAgY2xhc3MgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSA9IG51bGxwdHI7CisgIERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0cjsKKyAgdm9pZCAqUEltcGwgPSBudWxscHRyOworICBMYXp5VmFsdWVJbmZvKGNvbnN0IExhenlWYWx1ZUluZm8mKSA9IGRlbGV0ZTsKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTGF6eVZhbHVlSW5mbyYpID0gZGVsZXRlOworcHVibGljOgorICB+TGF6eVZhbHVlSW5mbygpOworICBMYXp5VmFsdWVJbmZvKCkge30KKyAgTGF6eVZhbHVlSW5mbyhBc3N1bXB0aW9uQ2FjaGUgKkFDXywgY29uc3QgRGF0YUxheW91dCAqRExfLCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJXywKKyAgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICpEVF8pCisgICAgICA6IEFDKEFDXyksIERMKERMXyksIFRMSShUTElfKSwgRFQoRFRfKSB7fQorICBMYXp5VmFsdWVJbmZvKExhenlWYWx1ZUluZm8gJiZBcmcpCisgICAgICA6IEFDKEFyZy5BQyksIERMKEFyZy5ETCksIFRMSShBcmcuVExJKSwgRFQoQXJnLkRUKSwgUEltcGwoQXJnLlBJbXBsKSB7CisgICAgQXJnLlBJbXBsID0gbnVsbHB0cjsKKyAgfQorICBMYXp5VmFsdWVJbmZvICZvcGVyYXRvcj0oTGF6eVZhbHVlSW5mbyAmJkFyZykgeworICAgIHJlbGVhc2VNZW1vcnkoKTsKKyAgICBBQyA9IEFyZy5BQzsKKyAgICBETCA9IEFyZy5ETDsKKyAgICBUTEkgPSBBcmcuVExJOworICAgIERUID0gQXJnLkRUOworICAgIFBJbXBsID0gQXJnLlBJbXBsOworICAgIEFyZy5QSW1wbCA9IG51bGxwdHI7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFRoaXMgaXMgdXNlZCB0byByZXR1cm4gdHJ1ZS9mYWxzZS9kdW5ubyByZXN1bHRzLgorICBlbnVtIFRyaXN0YXRlIHsKKyAgICBVbmtub3duID0gLTEsIEZhbHNlID0gMCwgVHJ1ZSA9IDEKKyAgfTsKKworICAvLyBQdWJsaWMgcXVlcnkgaW50ZXJmYWNlLgorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgc3BlY2lmaWVkIHZhbHVlIGNvbXBhcmlzb24gd2l0aCBhIGNvbnN0YW50IGlzIGtub3duCisgIC8vLyB0byBiZSB0cnVlIG9yIGZhbHNlIG9uIHRoZSBzcGVjaWZpZWQgQ0ZHIGVkZ2UuCisgIC8vLyBQcmVkIGlzIGEgQ21wSW5zdCBwcmVkaWNhdGUuCisgIFRyaXN0YXRlIGdldFByZWRpY2F0ZU9uRWRnZSh1bnNpZ25lZCBQcmVkLCBWYWx1ZSAqViwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpGcm9tQkIsIEJhc2ljQmxvY2sgKlRvQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqQ3h0SSA9IG51bGxwdHIpOworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgc3BlY2lmaWVkIHZhbHVlIGNvbXBhcmlzb24gd2l0aCBhIGNvbnN0YW50IGlzIGtub3duCisgIC8vLyB0byBiZSB0cnVlIG9yIGZhbHNlIGF0IHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24KKyAgLy8vIChmcm9tIGFuIGFzc3VtZSBpbnRyaW5zaWMpLiBQcmVkIGlzIGEgQ21wSW5zdCBwcmVkaWNhdGUuCisgIFRyaXN0YXRlIGdldFByZWRpY2F0ZUF0KHVuc2lnbmVkIFByZWQsIFZhbHVlICpWLCBDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkN4dEkpOworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGtub3duIHRvIGJlIGEKKyAgLy8vIGNvbnN0YW50IGF0IHRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCBibG9jay4gIFJldHVybiBudWxsIGlmIG5vdC4KKyAgQ29uc3RhbnQgKmdldENvbnN0YW50KFZhbHVlICpWLCBCYXNpY0Jsb2NrICpCQiwgSW5zdHJ1Y3Rpb24gKkN4dEkgPSBudWxscHRyKTsKKworICAvLy8gUmV0dXJuIHRoZSBDb25zdGFudFJhbmdlIGNvbnN0cmFpbnQgdGhhdCBpcyBrbm93biB0byBob2xkIGZvciB0aGUKKyAgLy8vIHNwZWNpZmllZCB2YWx1ZSBhdCB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2suIFRoaXMgbWF5IG9ubHkgYmUgY2FsbGVkCisgIC8vLyBvbiBpbnRlZ2VyLXR5cGVkIFZhbHVlcy4KKyAgQ29uc3RhbnRSYW5nZSBnZXRDb25zdGFudFJhbmdlKFZhbHVlICpWLCBCYXNpY0Jsb2NrICpCQiwgSW5zdHJ1Y3Rpb24gKkN4dEkgPSBudWxscHRyKTsKKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBrbm93biB0byBiZSBhCisgIC8vLyBjb25zdGFudCBvbiB0aGUgc3BlY2lmaWVkIGVkZ2UuICBSZXR1cm4gbnVsbCBpZiBub3QuCisgIENvbnN0YW50ICpnZXRDb25zdGFudE9uRWRnZShWYWx1ZSAqViwgQmFzaWNCbG9jayAqRnJvbUJCLCBCYXNpY0Jsb2NrICpUb0JCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkN4dEkgPSBudWxscHRyKTsKKworICAvLy8gUmV0dXJuIHRoZSBDb25zdGFudFJhZ2UgY29uc3RyYWludCB0aGF0IGlzIGtub3duIHRvIGhvbGQgZm9yIHRoZQorICAvLy8gc3BlY2lmaWVkIHZhbHVlIG9uIHRoZSBzcGVjaWZpZWQgZWRnZS4gVGhpcyBtYXkgYmUgb25seSBiZSBjYWxsZWQKKyAgLy8vIG9uIGludGVnZXItdHlwZWQgVmFsdWVzLgorICBDb25zdGFudFJhbmdlIGdldENvbnN0YW50UmFuZ2VPbkVkZ2UoVmFsdWUgKlYsIEJhc2ljQmxvY2sgKkZyb21CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKlRvQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqQ3h0SSA9IG51bGxwdHIpOworCisgIC8vLyBJbmZvcm0gdGhlIGFuYWx5c2lzIGNhY2hlIHRoYXQgd2UgaGF2ZSB0aHJlYWRlZCBhbiBlZGdlIGZyb20KKyAgLy8vIFByZWRCQiB0byBPbGRTdWNjIHRvIGJlIGZyb20gUHJlZEJCIHRvIE5ld1N1Y2MgaW5zdGVhZC4KKyAgdm9pZCB0aHJlYWRFZGdlKEJhc2ljQmxvY2sgKlByZWRCQiwgQmFzaWNCbG9jayAqT2xkU3VjYywgQmFzaWNCbG9jayAqTmV3U3VjYyk7CisKKyAgLy8vIEluZm9ybSB0aGUgYW5hbHlzaXMgY2FjaGUgdGhhdCB3ZSBoYXZlIGVyYXNlZCBhIGJsb2NrLgorICB2b2lkIGVyYXNlQmxvY2soQmFzaWNCbG9jayAqQkIpOworCisgIC8vLyBQcmludCB0aGUgXExhenlWYWx1ZUluZm8gQW5hbHlzaXMuCisgIC8vLyBXZSBwYXNzIGluIHRoZSBEVHJlZSB0aGF0IGlzIHJlcXVpcmVkIGZvciBpZGVudGlmeWluZyB3aGljaCBiYXNpYyBibG9ja3MKKyAgLy8vIHdlIGNhbiBzb2x2ZS9wcmludCBmb3IsIGluIHRoZSBMVklQcmludGVyLiBUaGUgRFQgaXMgb3B0aW9uYWwKKyAgLy8vIGluIExWSSwgc28gd2UgbmVlZCB0byBwYXNzIGl0IGhlcmUgYXMgYW4gYXJndW1lbnQuCisgIHZvaWQgcHJpbnRMVkkoRnVuY3Rpb24gJkYsIERvbWluYXRvclRyZWUgJkRUcmVlLCByYXdfb3N0cmVhbSAmT1MpOworCisgIC8vLyBEaXNhYmxlcyB1c2Ugb2YgdGhlIERvbWluYXRvclRyZWUgd2l0aGluIExWSS4KKyAgdm9pZCBkaXNhYmxlRFQoKTsKKworICAvLy8gRW5hYmxlcyB1c2Ugb2YgdGhlIERvbWluYXRvclRyZWUgd2l0aGluIExWSS4gRG9lcyBub3RoaW5nIGlmIHRoZSBjbGFzcworICAvLy8gaW5zdGFuY2Ugd2FzIGluaXRpYWxpemVkIHdpdGhvdXQgYSBEVCBwb2ludGVyLgorICB2b2lkIGVuYWJsZURUKCk7CisKKyAgLy8gRm9yIG9sZCBQTSBwYXNzLiBEZWxldGUgb25jZSBMYXp5VmFsdWVJbmZvV3JhcHBlclBhc3MgaXMgZ29uZS4KKyAgdm9pZCByZWxlYXNlTWVtb3J5KCk7CisKKyAgLy8vIEhhbmRsZSBpbnZhbGlkYXRpb24gZXZlbnRzIGluIHRoZSBuZXcgcGFzcyBtYW5hZ2VyLgorICBib29sIGludmFsaWRhdGUoRnVuY3Rpb24gJkYsIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzICZQQSwKKyAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyOjpJbnZhbGlkYXRvciAmSW52KTsKK307CisKKy8vLyBcYnJpZWYgQW5hbHlzaXMgdG8gY29tcHV0ZSBsYXp5IHZhbHVlIGluZm9ybWF0aW9uLgorY2xhc3MgTGF6eVZhbHVlQW5hbHlzaXMgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48TGF6eVZhbHVlQW5hbHlzaXM+IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBMYXp5VmFsdWVJbmZvIFJlc3VsdDsKKyAgUmVzdWx0IHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkZBTSk7CisKK3ByaXZhdGU6CisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7CisgIGZyaWVuZCBzdHJ1Y3QgQW5hbHlzaXNJbmZvTWl4aW48TGF6eVZhbHVlQW5hbHlzaXM+OworfTsKKworLy8vIFdyYXBwZXIgYXJvdW5kIExhenlWYWx1ZUluZm8uCitjbGFzcyBMYXp5VmFsdWVJbmZvV3JhcHBlclBhc3MgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgTGF6eVZhbHVlSW5mb1dyYXBwZXJQYXNzKGNvbnN0IExhenlWYWx1ZUluZm9XcmFwcGVyUGFzcyYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBMYXp5VmFsdWVJbmZvV3JhcHBlclBhc3MmKSA9IGRlbGV0ZTsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisgIExhenlWYWx1ZUluZm9XcmFwcGVyUGFzcygpIDogRnVuY3Rpb25QYXNzKElEKSB7CisgICAgaW5pdGlhbGl6ZUxhenlWYWx1ZUluZm9XcmFwcGVyUGFzc1Bhc3MoKlBhc3NSZWdpc3RyeTo6Z2V0UGFzc1JlZ2lzdHJ5KCkpOworICB9CisgIH5MYXp5VmFsdWVJbmZvV3JhcHBlclBhc3MoKSBvdmVycmlkZSB7CisgICAgYXNzZXJ0KCFJbmZvLlBJbXBsICYmICJyZWxlYXNlTWVtb3J5IG5vdCBjYWxsZWQiKTsKKyAgfQorCisgIExhenlWYWx1ZUluZm8gJmdldExWSSgpOworCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlOworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworcHJpdmF0ZToKKyAgTGF6eVZhbHVlSW5mbyBJbmZvOworfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xpbnQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTGludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjODhiMTMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xpbnQuaApAQCAtMCwwICsxLDQ5IEBACisvLz09PS0tIGxsdm0vQW5hbHlzaXMvTGludC5oIC0gTExWTSBJUiBMaW50IC0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGxpbnQgaW50ZXJmYWNlcyB0aGF0IGNhbiBiZSB1c2VkIGZvciBzb21lIHNhbml0eSBjaGVja2luZworLy8gb2YgaW5wdXQgdG8gdGhlIHN5c3RlbSwgYW5kIGZvciBjaGVja2luZyB0aGF0IHRyYW5zZm9ybWF0aW9ucworLy8gaGF2ZW4ndCBkb25lIHNvbWV0aGluZyBiYWQuIEluIGNvbnRyYXN0IHRvIHRoZSBWZXJpZmllciwgdGhlIExpbnQgY2hlY2tlcgorLy8gY2hlY2tzIGZvciB1bmRlZmluZWQgYmVoYXZpb3Igb3IgY29uc3RydWN0aW9ucyB3aXRoIGxpa2VseSB1bmludGVuZGVkCisvLyBiZWhhdmlvci4KKy8vCisvLyBUbyBzZWUgd2hhdCBzcGVjaWZpY2FsbHkgaXMgY2hlY2tlZCwgbG9vayBhdCBMaW50LmNwcAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19MSU5UX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19MSU5UX0gKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvblBhc3M7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBGdW5jdGlvbjsKKworLy8vIEBicmllZiBDcmVhdGUgYSBsaW50IHBhc3MuCisvLy8KKy8vLyBDaGVjayBhIG1vZHVsZSBvciBmdW5jdGlvbi4KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlTGludFBhc3MoKTsKKworLy8vIEBicmllZiBDaGVjayBhIG1vZHVsZS4KKy8vLworLy8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgZGVidWdnaW5nLCBiZWNhdXNlIGl0IHBsYXlzIGdhbWVzIHdpdGgKKy8vLyBQYXNzTWFuYWdlcnMgYW5kIHN0dWZmLgordm9pZCBsaW50TW9kdWxlKAorICBjb25zdCBNb2R1bGUgJk0gICAgLy8vPCBUaGUgbW9kdWxlIHRvIGJlIGNoZWNrZWQKKyk7CisKKy8vIGxpbnRGdW5jdGlvbiAtIENoZWNrIGEgZnVuY3Rpb24uCit2b2lkIGxpbnRGdW5jdGlvbigKKyAgY29uc3QgRnVuY3Rpb24gJkYgIC8vLzwgVGhlIGZ1bmN0aW9uIHRvIGJlIGNoZWNrZWQKKyk7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Mb2Fkcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Mb2Fkcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMTBjMjgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvYWRzLmgKQEAgLTAsMCArMSwxMzAgQEAKKy8vPT09LSBMb2Fkcy5oIC0gTG9jYWwgbG9hZCBhbmFseXNpcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHNpbXBsZSBsb2NhbCBhbmFseXNlcyBmb3IgbG9hZCBpbnN0cnVjdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0xPQURTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19MT0FEU19ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBEYXRhTGF5b3V0OworY2xhc3MgTUROb2RlOworCisvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbHdheXMgYSBkZXJlZmVyZW5jZWFibGUgcG9pbnRlci4gSWYgdGhlIGNvbnRleHQKKy8vLyBpbnN0cnVjdGlvbiBpcyBzcGVjaWZpZWQgcGVyZm9ybSBjb250ZXh0LXNlbnNpdGl2ZSBhbmFseXNpcyBhbmQgcmV0dXJuIHRydWUKKy8vLyBpZiB0aGUgcG9pbnRlciBpcyBkZXJlZmVyZW5jZWFibGUgYXQgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbi4KK2Jvb2wgaXNEZXJlZmVyZW5jZWFibGVQb2ludGVyKGNvbnN0IFZhbHVlICpWLCBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpDdHhJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0cik7CisKKy8vLyBSZXR1cm5zIHRydWUgaWYgViBpcyBhbHdheXMgYSBkZXJlZmVyZW5jZWFibGUgcG9pbnRlciB3aXRoIGFsaWdubWVudAorLy8vIGdyZWF0ZXIgb3IgZXF1YWwgdGhhbiByZXF1ZXN0ZWQuIElmIHRoZSBjb250ZXh0IGluc3RydWN0aW9uIGlzIHNwZWNpZmllZAorLy8vIHBlcmZvcm1zIGNvbnRleHQtc2Vuc2l0aXZlIGFuYWx5c2lzIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIHBvaW50ZXIgaXMKKy8vLyBkZXJlZmVyZW5jZWFibGUgYXQgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbi4KK2Jvb2wgaXNEZXJlZmVyZW5jZWFibGVBbmRBbGlnbmVkUG9pbnRlcihjb25zdCBWYWx1ZSAqViwgdW5zaWduZWQgQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkN0eEkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0cik7CisKKy8vLyBSZXR1cm5zIHRydWUgaWYgViBpcyBhbHdheXMgZGVyZWZlcmVuY2VhYmxlIGZvciBTaXplIGJ5dGUgd2l0aCBhbGlnbm1lbnQKKy8vLyBncmVhdGVyIG9yIGVxdWFsIHRoYW4gcmVxdWVzdGVkLiBJZiB0aGUgY29udGV4dCBpbnN0cnVjdGlvbiBpcyBzcGVjaWZpZWQKKy8vLyBwZXJmb3JtcyBjb250ZXh0LXNlbnNpdGl2ZSBhbmFseXNpcyBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZSBwb2ludGVyIGlzCisvLy8gZGVyZWZlcmVuY2VhYmxlIGF0IHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uCitib29sIGlzRGVyZWZlcmVuY2VhYmxlQW5kQWxpZ25lZFBvaW50ZXIoY29uc3QgVmFsdWUgKlYsIHVuc2lnbmVkIEFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFQSW50ICZTaXplLCBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqQ3R4SSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyKTsKKworLy8vIFJldHVybiB0cnVlIGlmIHdlIGtub3cgdGhhdCBleGVjdXRpbmcgYSBsb2FkIGZyb20gdGhpcyB2YWx1ZSBjYW5ub3QgdHJhcC4KKy8vLworLy8vIElmIERUIGFuZCBTY2FuRnJvbSBhcmUgc3BlY2lmaWVkIHRoaXMgbWV0aG9kIHBlcmZvcm1zIGNvbnRleHQtc2Vuc2l0aXZlCisvLy8gYW5hbHlzaXMgYW5kIHJldHVybnMgdHJ1ZSBpZiBpdCBpcyBzYWZlIHRvIGxvYWQgaW1tZWRpYXRlbHkgYmVmb3JlIFNjYW5Gcm9tLgorLy8vCisvLy8gSWYgaXQgaXMgbm90IG9idmlvdXNseSBzYWZlIHRvIGxvYWQgZnJvbSB0aGUgc3BlY2lmaWVkIHBvaW50ZXIsIHdlIGRvIGEKKy8vLyBxdWljayBsb2NhbCBzY2FuIG9mIHRoZSBiYXNpYyBibG9jayBjb250YWluaW5nIFNjYW5Gcm9tLCB0byBkZXRlcm1pbmUgaWYKKy8vLyB0aGUgYWRkcmVzcyBpcyBhbHJlYWR5IGFjY2Vzc2VkLgorYm9vbCBpc1NhZmVUb0xvYWRVbmNvbmRpdGlvbmFsbHkoVmFsdWUgKlYsIHVuc2lnbmVkIEFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqU2NhbkZyb20gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyKTsKKworLy8vIFRoZSBkZWZhdWx0IG51bWJlciBvZiBtYXhpbXVtIGluc3RydWN0aW9ucyB0byBzY2FuIGluIHRoZSBibG9jaywgdXNlZCBieQorLy8vIEZpbmRBdmFpbGFibGVMb2FkZWRWYWx1ZSgpLgorZXh0ZXJuIGNsOjpvcHQ8dW5zaWduZWQ+IERlZk1heEluc3RzVG9TY2FuOworCisvLy8gU2NhbiBiYWNrd2FyZHMgdG8gc2VlIGlmIHdlIGhhdmUgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBsb2FkIGF2YWlsYWJsZQorLy8vIGxvY2FsbHkgd2l0aGluIGEgc21hbGwgbnVtYmVyIG9mIGluc3RydWN0aW9ucy4KKy8vLworLy8vIFlvdSBjYW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gc2NhbiBhY3Jvc3MgbXVsdGlwbGUgYmxvY2tzOiBhZnRlciB5b3UgY2FsbAorLy8vIHRoaXMgZnVuY3Rpb24sIGlmIFNjYW5Gcm9tIHBvaW50cyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBibG9jaywgaXQncyBzYWZlCisvLy8gdG8gY29udGludWUgc2Nhbm5pbmcgdGhlIHByZWRlY2Vzc29ycy4KKy8vLworLy8vIE5vdGUgdGhhdCBwZXJmb3JtaW5nIGxvYWQgQ1NFIHJlcXVpcmVzIHNwZWNpYWwgY2FyZSB0byBtYWtlIHN1cmUgdGhlCisvLy8gbWV0YWRhdGEgaXMgc2V0IGFwcHJvcHJpYXRlbHkuICBJbiBwYXJ0aWN1bGFyLCBhbGlhc2luZyBtZXRhZGF0YSBuZWVkcworLy8vIHRvIGJlIG1lcmdlZC4gIChUaGlzIGRvZXNuJ3QgbWF0dGVyIGZvciBzdG9yZS10by1sb2FkIGZvcndhcmRpbmcgYmVjYXVzZQorLy8vIHRoZSBvbmx5IHJlbGV2YW50IGxvYWQgZ2V0cyBkZWxldGVkLikKKy8vLworLy8vIFxwYXJhbSBMb2FkIFRoZSBsb2FkIHdlIHdhbnQgdG8gcmVwbGFjZS4KKy8vLyBccGFyYW0gU2NhbkJCIFRoZSBiYXNpYyBibG9jayB0byBzY2FuLgorLy8vIFxwYXJhbSBbaW4sb3V0XSBTY2FuRnJvbSBUaGUgbG9jYXRpb24gdG8gc3RhcnQgc2Nhbm5pbmcgZnJvbS4gV2hlbiB0aGlzCisvLy8gZnVuY3Rpb24gcmV0dXJucywgaXQgcG9pbnRzIGF0IHRoZSBsYXN0IGluc3RydWN0aW9uIHNjYW5uZWQuCisvLy8gXHBhcmFtIE1heEluc3RzVG9TY2FuIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdG8gc2Nhbi4gSWYgdGhpcworLy8vIGlzIHplcm8sIHRoZSB3aG9sZSBibG9jayB3aWxsIGJlIHNjYW5uZWQuCisvLy8gXHBhcmFtIEFBIE9wdGlvbmFsIHBvaW50ZXIgdG8gYWxpYXMgYW5hbHlzaXMsIHRvIG1ha2UgdGhlIHNjYW4gbW9yZQorLy8vIHByZWNpc2UuCisvLy8gXHBhcmFtIFtvdXRdIElzTG9hZENTRSBXaGV0aGVyIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhIGxvYWQgZnJvbSB0aGUgc2FtZQorLy8vIGxvY2F0aW9uIGluIG1lbW9yeSwgYXMgb3Bwb3NlZCB0byB0aGUgdmFsdWUgb3BlcmFuZCBvZiBhIHN0b3JlLgorLy8vCisvLy8gXHJldHVybnMgVGhlIGZvdW5kIHZhbHVlLCBvciBudWxscHRyIGlmIG5vIHZhbHVlIGlzIGZvdW5kLgorVmFsdWUgKkZpbmRBdmFpbGFibGVMb2FkZWRWYWx1ZShMb2FkSW5zdCAqTG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqU2NhbkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciAmU2NhbkZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1heEluc3RzVG9TY2FuID0gRGVmTWF4SW5zdHNUb1NjYW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzQW5hbHlzaXMgKkFBID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqSXNMb2FkQ1NFID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKk51bVNjYW5lZEluc3QgPSBudWxscHRyKTsKKworLy8vIFNjYW4gYmFja3dhcmRzIHRvIHNlZSBpZiB3ZSBoYXZlIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gcG9pbnRlciBhdmFpbGFibGUKKy8vLyBsb2NhbGx5IHdpdGhpbiBhIHNtYWxsIG51bWJlciBvZiBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBZb3UgY2FuIHVzZSB0aGlzIGZ1bmN0aW9uIHRvIHNjYW4gYWNyb3NzIG11bHRpcGxlIGJsb2NrczogYWZ0ZXIgeW91IGNhbGwKKy8vLyB0aGlzIGZ1bmN0aW9uLCBpZiBTY2FuRnJvbSBwb2ludHMgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYmxvY2ssIGl0J3Mgc2FmZQorLy8vIHRvIGNvbnRpbnVlIHNjYW5uaW5nIHRoZSBwcmVkZWNlc3NvcnMuCisvLy8KKy8vLyBccGFyYW0gUHRyIFRoZSBwb2ludGVyIHdlIHdhbnQgdGhlIGxvYWQgYW5kIHN0b3JlIHRvIG9yaWdpbmF0ZSBmcm9tLgorLy8vIFxwYXJhbSBBY2Nlc3NUeSBUaGUgYWNjZXNzIHR5cGUgb2YgdGhlIHBvaW50ZXIuCisvLy8gXHBhcmFtIEF0TGVhc3RBdG9taWMgQXJlIHdlIGxvb2tpbmcgZm9yIGF0LWxlYXN0IGFuIGF0b21pYyBsb2FkL3N0b3JlID8gSW4KKy8vLyBjYXNlIGl0IGlzIGZhbHNlLCB3ZSBjYW4gcmV0dXJuIGFuIGF0b21pYyBvciBub24tYXRvbWljIGxvYWQgb3Igc3RvcmUuIEluCisvLy8gY2FzZSBpdCBpcyB0cnVlLCB3ZSBuZWVkIHRvIHJldHVybiBhbiBhdG9taWMgbG9hZCBvciBzdG9yZS4KKy8vLyBccGFyYW0gU2NhbkJCIFRoZSBiYXNpYyBibG9jayB0byBzY2FuLgorLy8vIFxwYXJhbSBbaW4sb3V0XSBTY2FuRnJvbSBUaGUgbG9jYXRpb24gdG8gc3RhcnQgc2Nhbm5pbmcgZnJvbS4gV2hlbiB0aGlzCisvLy8gZnVuY3Rpb24gcmV0dXJucywgaXQgcG9pbnRzIGF0IHRoZSBsYXN0IGluc3RydWN0aW9uIHNjYW5uZWQuCisvLy8gXHBhcmFtIE1heEluc3RzVG9TY2FuIFRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdG8gc2Nhbi4gSWYgdGhpcworLy8vIGlzIHplcm8sIHRoZSB3aG9sZSBibG9jayB3aWxsIGJlIHNjYW5uZWQuCisvLy8gXHBhcmFtIEFBIE9wdGlvbmFsIHBvaW50ZXIgdG8gYWxpYXMgYW5hbHlzaXMsIHRvIG1ha2UgdGhlIHNjYW4gbW9yZQorLy8vIHByZWNpc2UuCisvLy8gXHBhcmFtIFtvdXRdIElzTG9hZCBXaGV0aGVyIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhIGxvYWQgZnJvbSB0aGUgc2FtZQorLy8vIGxvY2F0aW9uIGluIG1lbW9yeSwgYXMgb3Bwb3NlZCB0byB0aGUgdmFsdWUgb3BlcmFuZCBvZiBhIHN0b3JlLgorLy8vCisvLy8gXHJldHVybnMgVGhlIGZvdW5kIHZhbHVlLCBvciBudWxscHRyIGlmIG5vIHZhbHVlIGlzIGZvdW5kLgorVmFsdWUgKkZpbmRBdmFpbGFibGVQdHJMb2FkU3RvcmUoVmFsdWUgKlB0ciwgVHlwZSAqQWNjZXNzVHksIGJvb2wgQXRMZWFzdEF0b21pYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKlNjYW5CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yICZTY2FuRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1heEluc3RzVG9TY2FuLCBBbGlhc0FuYWx5c2lzICpBQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKklzTG9hZCwgdW5zaWduZWQgKk51bVNjYW5lZEluc3QpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTG9vcEFjY2Vzc0FuYWx5c2lzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvb3BBY2Nlc3NBbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4MTU0YzgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvb3BBY2Nlc3NBbmFseXNpcy5oCkBAIC0wLDAgKzEsNzQ5IEBACisvLz09PS0gbGx2bS9BbmFseXNpcy9Mb29wQWNjZXNzQW5hbHlzaXMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpbnRlcmZhY2UgZm9yIHRoZSBsb29wIG1lbW9yeSBkZXBlbmRlbmNlIGZyYW1ld29yayB0aGF0CisvLyB3YXMgb3JpZ2luYWxseSBkZXZlbG9wZWQgZm9yIHRoZSBMb29wIFZlY3Rvcml6ZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0xPT1BBQ0NFU1NBTkFMWVNJU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfTE9PUEFDQ0VTU0FOQUxZU0lTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0VxdWl2YWxlbmNlQ2xhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU2V0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc1NldFRyYWNrZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BBbmFseXNpc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkV4cHJlc3Npb25zLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EaWFnbm9zdGljSW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBWYWx1ZTsKK2NsYXNzIERhdGFMYXlvdXQ7CitjbGFzcyBTY2FsYXJFdm9sdXRpb247CitjbGFzcyBMb29wOworY2xhc3MgU0NFVjsKK2NsYXNzIFNDRVZVbmlvblByZWRpY2F0ZTsKK2NsYXNzIExvb3BBY2Nlc3NJbmZvOworY2xhc3MgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlcjsKKworLy8vIFxicmllZiBDb2xsZWN0aW9uIG9mIHBhcmFtZXRlcnMgc2hhcmVkIGJlZXR3ZWVuIHRoZSBMb29wIFZlY3Rvcml6ZXIgYW5kIHRoZQorLy8vIExvb3AgQWNjZXNzIEFuYWx5c2lzLgorc3RydWN0IFZlY3Rvcml6ZXJQYXJhbXMgeworICAvLy8gXGJyaWVmIE1heGltdW0gU0lNRCB3aWR0aC4KKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE1heFZlY3RvcldpZHRoOworCisgIC8vLyBcYnJpZWYgVkYgYXMgb3ZlcnJpZGRlbiBieSB0aGUgdXNlci4KKyAgc3RhdGljIHVuc2lnbmVkIFZlY3Rvcml6YXRpb25GYWN0b3I7CisgIC8vLyBcYnJpZWYgSW50ZXJsZWF2ZSBmYWN0b3IgYXMgb3ZlcnJpZGRlbiBieSB0aGUgdXNlci4KKyAgc3RhdGljIHVuc2lnbmVkIFZlY3Rvcml6YXRpb25JbnRlcmxlYXZlOworICAvLy8gXGJyaWVmIFRydWUgaWYgZm9yY2UtdmVjdG9yLWludGVybGVhdmUgd2FzIHNwZWNpZmllZCBieSB0aGUgdXNlci4KKyAgc3RhdGljIGJvb2wgaXNJbnRlcmxlYXZlRm9yY2VkKCk7CisKKyAgLy8vIFxcYnJpZWYgV2hlbiBwZXJmb3JtaW5nIG1lbW9yeSBkaXNhbWJpZ3VhdGlvbiBjaGVja3MgYXQgcnVudGltZSBkbyBub3QKKyAgLy8vIG1ha2UgbW9yZSB0aGFuIHRoaXMgbnVtYmVyIG9mIGNvbXBhcmlzb25zLgorICBzdGF0aWMgdW5zaWduZWQgUnVudGltZU1lbW9yeUNoZWNrVGhyZXNob2xkOworfTsKKworLy8vIFxicmllZiBDaGVja3MgbWVtb3J5IGRlcGVuZGVuY2VzIGFtb25nIGFjY2Vzc2VzIHRvIHRoZSBzYW1lIHVuZGVybHlpbmcKKy8vLyBvYmplY3QgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUgdmVjdG9yaXphdGlvbiBpcyBsZWdhbCBvciBub3QgKGFuZCBhdAorLy8vIHdoaWNoIHZlY3Rvcml6YXRpb24gZmFjdG9yKS4KKy8vLworLy8vIE5vdGU6IFRoaXMgY2xhc3Mgd2lsbCBjb21wdXRlIGEgY29uc2VydmF0aXZlIGRlcGVuZGVuY2UgZm9yIGFjY2VzcyB0bworLy8vIGRpZmZlcmVudCB1bmRlcmx5aW5nIHBvaW50ZXJzLiBDbGllbnRzLCBzdWNoIGFzIHRoZSBsb29wIHZlY3Rvcml6ZXIsIHdpbGwKKy8vLyBzb21ldGltZXMgZGVhbCB0aGVzZSBwb3RlbnRpYWwgZGVwZW5kZW5jaWVzIGJ5IGVtaXR0aW5nIHJ1bnRpbWUgY2hlY2tzLgorLy8vCisvLy8gV2UgdXNlIHRoZSBTY2FsYXJFdm9sdXRpb24gZnJhbWV3b3JrIHRvIHN5bWJvbGljYWxseSBldmFsdXRhdGUgYWNjZXNzCisvLy8gZnVuY3Rpb25zIHBhaXJzLiBTaW5jZSB3ZSBjdXJyZW50bHkgZG9uJ3QgcmVzdHJ1Y3R1cmUgdGhlIGxvb3Agd2UgY2FuIHJlbHkKKy8vLyBvbiB0aGUgcHJvZ3JhbSBvcmRlciBvZiBtZW1vcnkgYWNjZXNzZXMgdG8gZGV0ZXJtaW5lIHRoZWlyIHNhZmV0eS4KKy8vLyBBdCB0aGUgbW9tZW50IHdlIHdpbGwgb25seSBkZWVtIGFjY2Vzc2VzIGFzIHNhZmUgZm9yOgorLy8vICAqIEEgbmVnYXRpdmUgY29uc3RhbnQgZGlzdGFuY2UgYXNzdW1pbmcgcHJvZ3JhbSBvcmRlci4KKy8vLworLy8vICAgICAgU2FmZTogdG1wID0gYVtpICsgMV07ICAgICBPUiAgICAgYVtpICsgMV0gPSB4OworLy8vICAgICAgICAgICAgYVtpXSA9IHRtcDsgICAgICAgICAgICAgICAgeSA9IGFbaV07CisvLy8KKy8vLyAgIFRoZSBsYXR0ZXIgY2FzZSBpcyBzYWZlIGJlY2F1c2UgbGF0ZXIgY2hlY2tzIGd1YXJhbnR1ZWUgdGhhdCB0aGVyZSBjYW4ndAorLy8vICAgYmUgYSBjeWNsZSB0aHJvdWdoIGEgcGhpIG5vZGUgKHRoYXQgaXMsIHdlIGNoZWNrIHRoYXQgIngiIGFuZCAieSIgaXMgbm90CisvLy8gICB0aGUgc2FtZSB2YXJpYWJsZTogYSBoZWFkZXIgcGhpIGNhbiBvbmx5IGJlIGFuIGluZHVjdGlvbiBvciBhIHJlZHVjdGlvbiwgYQorLy8vICAgcmVkdWN0aW9uIGNhbid0IGhhdmUgYSBtZW1vcnkgc2luaywgYW4gaW5kdWN0aW9uIGNhbid0IGhhdmUgYSBtZW1vcnkKKy8vLyAgIHNvdXJjZSkuIFRoaXMgaXMgaW1wb3J0YW50IGFuZCBtdXN0IG5vdCBiZSB2aW9sYXRlZCAob3Igd2UgaGF2ZSB0bworLy8vICAgcmVzb3J0IHRvIGNoZWNraW5nIGZvciBjeWNsZXMgdGhyb3VnaCBtZW1vcnkpLgorLy8vCisvLy8gICogQSBwb3NpdGl2ZSBjb25zdGFudCBkaXN0YW5jZSBhc3N1bWluZyBwcm9ncmFtIG9yZGVyIHRoYXQgaXMgYmlnZ2VyCisvLy8gICAgdGhhbiB0aGUgYmlnZ2VzdCBtZW1vcnkgYWNjZXNzLgorLy8vCisvLy8gICAgIHRtcCA9IGFbaV0gICAgICAgIE9SICAgICAgICAgICAgICBiW2ldID0geAorLy8vICAgICBhW2krMl0gPSB0bXAgICAgICAgICAgICAgICAgICAgICAgeSA9IGJbaSsyXTsKKy8vLworLy8vICAgICBTYWZlIGRpc3RhbmNlOiAyIHggc2l6ZW9mKGFbMF0pLCBhbmQgMiB4IHNpemVvZihiWzBdKSwgcmVzcGVjdGl2ZWx5LgorLy8vCisvLy8gICogWmVybyBkaXN0YW5jZXMgYW5kIGFsbCBhY2Nlc3NlcyBoYXZlIHRoZSBzYW1lIHNpemUuCisvLy8KK2NsYXNzIE1lbW9yeURlcENoZWNrZXIgeworcHVibGljOgorICB0eXBlZGVmIFBvaW50ZXJJbnRQYWlyPFZhbHVlICosIDEsIGJvb2w+IE1lbUFjY2Vzc0luZm87CisgIHR5cGVkZWYgU21hbGxWZWN0b3I8TWVtQWNjZXNzSW5mbywgOD4gTWVtQWNjZXNzSW5mb0xpc3Q7CisgIC8vLyBcYnJpZWYgU2V0IG9mIHBvdGVudGlhbCBkZXBlbmRlbnQgbWVtb3J5IGFjY2Vzc2VzLgorICB0eXBlZGVmIEVxdWl2YWxlbmNlQ2xhc3NlczxNZW1BY2Nlc3NJbmZvPiBEZXBDYW5kaWRhdGVzOworCisgIC8vLyBcYnJpZWYgRGVwZW5kZWNlIGJldHdlZW4gbWVtb3J5IGFjY2VzcyBpbnN0cnVjdGlvbnMuCisgIHN0cnVjdCBEZXBlbmRlbmNlIHsKKyAgICAvLy8gXGJyaWVmIFRoZSB0eXBlIG9mIHRoZSBkZXBlbmRlbmNlLgorICAgIGVudW0gRGVwVHlwZSB7CisgICAgICAvLyBObyBkZXBlbmRlbmNlLgorICAgICAgTm9EZXAsCisgICAgICAvLyBXZSBjb3VsZG4ndCBkZXRlcm1pbmUgdGhlIGRpcmVjdGlvbiBvciB0aGUgZGlzdGFuY2UuCisgICAgICBVbmtub3duLAorICAgICAgLy8gTGV4aWNhbGx5IGZvcndhcmQuCisgICAgICAvLworICAgICAgLy8gRklYTUU6IElmIHdlIG9ubHkgaGF2ZSBsb29wLWluZGVwZW5kZW50IGZvcndhcmQgZGVwZW5kZW5jZXMgKGUuZy4gYQorICAgICAgLy8gcmVhZCBhbmQgd3JpdGUgb2YgQVtpXSksIExBQSB3aWxsIGxvY2FsbHkgZGVlbSB0aGUgZGVwZW5kZW5jZSAic2FmZSIKKyAgICAgIC8vIHdpdGhvdXQgcXVlcnlpbmcgdGhlIE1lbW9yeURlcENoZWNrZXIuICBUaGVyZWZvcmUgd2UgY2FuIG1pc3MKKyAgICAgIC8vIGVudW1lcmF0aW5nIGxvb3AtaW5kZXBlbmRlbnQgZm9yd2FyZCBkZXBlbmRlbmNlcyBpbgorICAgICAgLy8gZ2V0RGVwZW5kZW5jZXMuICBOb3RlIHRoYXQgYXMgc29vbiBhcyB0aGVyZSBhcmUgZGlmZmVyZW50CisgICAgICAvLyBpbmRpY2VzIHVzZWQgdG8gYWNjZXNzIHRoZSBzYW1lIGFycmF5LCB0aGUgTWVtb3J5RGVwQ2hlY2tlciAqaXMqCisgICAgICAvLyBxdWVyaWVkIGFuZCB0aGUgZGVwZW5kZW5jZSBsaXN0IGlzIGNvbXBsZXRlLgorICAgICAgRm9yd2FyZCwKKyAgICAgIC8vIEZvcndhcmQsIGJ1dCBpZiB2ZWN0b3JpemVkLCBpcyBsaWtlbHkgdG8gcHJldmVudCBzdG9yZS10by1sb2FkCisgICAgICAvLyBmb3J3YXJkaW5nLgorICAgICAgRm9yd2FyZEJ1dFByZXZlbnRzRm9yd2FyZGluZywKKyAgICAgIC8vIExleGljYWxseSBiYWNrd2FyZC4KKyAgICAgIEJhY2t3YXJkLAorICAgICAgLy8gQmFja3dhcmQsIGJ1dCB0aGUgZGlzdGFuY2UgYWxsb3dzIGEgdmVjdG9yaXphdGlvbiBmYWN0b3Igb2YKKyAgICAgIC8vIE1heFNhZmVEZXBEaXN0Qnl0ZXMuCisgICAgICBCYWNrd2FyZFZlY3Rvcml6YWJsZSwKKyAgICAgIC8vIFNhbWUsIGJ1dCBtYXkgcHJldmVudCBzdG9yZS10by1sb2FkIGZvcndhcmRpbmcuCisgICAgICBCYWNrd2FyZFZlY3Rvcml6YWJsZUJ1dFByZXZlbnRzRm9yd2FyZGluZworICAgIH07CisKKyAgICAvLy8gXGJyaWVmIFN0cmluZyB2ZXJzaW9uIG9mIHRoZSB0eXBlcy4KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqRGVwTmFtZVtdOworCisgICAgLy8vIFxicmllZiBJbmRleCBvZiB0aGUgc291cmNlIG9mIHRoZSBkZXBlbmRlbmNlIGluIHRoZSBJbnN0TWFwIHZlY3Rvci4KKyAgICB1bnNpZ25lZCBTb3VyY2U7CisgICAgLy8vIFxicmllZiBJbmRleCBvZiB0aGUgZGVzdGluYXRpb24gb2YgdGhlIGRlcGVuZGVuY2UgaW4gdGhlIEluc3RNYXAgdmVjdG9yLgorICAgIHVuc2lnbmVkIERlc3RpbmF0aW9uOworICAgIC8vLyBcYnJpZWYgVGhlIHR5cGUgb2YgdGhlIGRlcGVuZGVuY2UuCisgICAgRGVwVHlwZSBUeXBlOworCisgICAgRGVwZW5kZW5jZSh1bnNpZ25lZCBTb3VyY2UsIHVuc2lnbmVkIERlc3RpbmF0aW9uLCBEZXBUeXBlIFR5cGUpCisgICAgICAgIDogU291cmNlKFNvdXJjZSksIERlc3RpbmF0aW9uKERlc3RpbmF0aW9uKSwgVHlwZShUeXBlKSB7fQorCisgICAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHNvdXJjZSBpbnN0cnVjdGlvbiBvZiB0aGUgZGVwZW5kZW5jZS4KKyAgICBJbnN0cnVjdGlvbiAqZ2V0U291cmNlKGNvbnN0IExvb3BBY2Nlc3NJbmZvICZMQUkpIGNvbnN0OworICAgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBkZXN0aW5hdGlvbiBpbnN0cnVjdGlvbiBvZiB0aGUgZGVwZW5kZW5jZS4KKyAgICBJbnN0cnVjdGlvbiAqZ2V0RGVzdGluYXRpb24oY29uc3QgTG9vcEFjY2Vzc0luZm8gJkxBSSkgY29uc3Q7CisKKyAgICAvLy8gXGJyaWVmIERlcGVuZGVuY2UgdHlwZXMgdGhhdCBkb24ndCBwcmV2ZW50IHZlY3Rvcml6YXRpb24uCisgICAgc3RhdGljIGJvb2wgaXNTYWZlRm9yVmVjdG9yaXphdGlvbihEZXBUeXBlIFR5cGUpOworCisgICAgLy8vIFxicmllZiBMZXhpY2FsbHkgZm9yd2FyZCBkZXBlbmRlbmNlLgorICAgIGJvb2wgaXNGb3J3YXJkKCkgY29uc3Q7CisgICAgLy8vIFxicmllZiBMZXhpY2FsbHkgYmFja3dhcmQgZGVwZW5kZW5jZS4KKyAgICBib29sIGlzQmFja3dhcmQoKSBjb25zdDsKKworICAgIC8vLyBcYnJpZWYgTWF5IGJlIGEgbGV4aWNhbGx5IGJhY2t3YXJkIGRlcGVuZGVuY2UgdHlwZSAoaW5jbHVkZXMgVW5rbm93bikuCisgICAgYm9vbCBpc1Bvc3NpYmx5QmFja3dhcmQoKSBjb25zdDsKKworICAgIC8vLyBcYnJpZWYgUHJpbnQgdGhlIGRlcGVuZGVuY2UuICBccCBJbnN0ciBpcyB1c2VkIHRvIG1hcCB0aGUgaW5zdHJ1Y3Rpb24KKyAgICAvLy8gaW5kaWNlcyB0byBpbnN0cnVjdGlvbnMuCisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIERlcHRoLAorICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPEluc3RydWN0aW9uICo+ICZJbnN0cnMpIGNvbnN0OworICB9OworCisgIE1lbW9yeURlcENoZWNrZXIoUHJlZGljYXRlZFNjYWxhckV2b2x1dGlvbiAmUFNFLCBjb25zdCBMb29wICpMKQorICAgICAgOiBQU0UoUFNFKSwgSW5uZXJtb3N0TG9vcChMKSwgQWNjZXNzSWR4KDApLCBNYXhTYWZlUmVnaXN0ZXJXaWR0aCgtMVUpLAorICAgICAgICBTaG91bGRSZXRyeVdpdGhSdW50aW1lQ2hlY2soZmFsc2UpLCBTYWZlRm9yVmVjdG9yaXphdGlvbih0cnVlKSwKKyAgICAgICAgUmVjb3JkRGVwZW5kZW5jZXModHJ1ZSkge30KKworICAvLy8gXGJyaWVmIFJlZ2lzdGVyIHRoZSBsb2NhdGlvbiAoaW5zdHJ1Y3Rpb25zIGFyZSBnaXZlbiBpbmNyZWFzaW5nIG51bWJlcnMpCisgIC8vLyBvZiBhIHdyaXRlIGFjY2Vzcy4KKyAgdm9pZCBhZGRBY2Nlc3MoU3RvcmVJbnN0ICpTSSkgeworICAgIFZhbHVlICpQdHIgPSBTSS0+Z2V0UG9pbnRlck9wZXJhbmQoKTsKKyAgICBBY2Nlc3Nlc1tNZW1BY2Nlc3NJbmZvKFB0ciwgdHJ1ZSldLnB1c2hfYmFjayhBY2Nlc3NJZHgpOworICAgIEluc3RNYXAucHVzaF9iYWNrKFNJKTsKKyAgICArK0FjY2Vzc0lkeDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVnaXN0ZXIgdGhlIGxvY2F0aW9uIChpbnN0cnVjdGlvbnMgYXJlIGdpdmVuIGluY3JlYXNpbmcgbnVtYmVycykKKyAgLy8vIG9mIGEgd3JpdGUgYWNjZXNzLgorICB2b2lkIGFkZEFjY2VzcyhMb2FkSW5zdCAqTEkpIHsKKyAgICBWYWx1ZSAqUHRyID0gTEktPmdldFBvaW50ZXJPcGVyYW5kKCk7CisgICAgQWNjZXNzZXNbTWVtQWNjZXNzSW5mbyhQdHIsIGZhbHNlKV0ucHVzaF9iYWNrKEFjY2Vzc0lkeCk7CisgICAgSW5zdE1hcC5wdXNoX2JhY2soTEkpOworICAgICsrQWNjZXNzSWR4OworICB9CisKKyAgLy8vIFxicmllZiBDaGVjayB3aGV0aGVyIHRoZSBkZXBlbmRlbmNpZXMgYmV0d2VlbiB0aGUgYWNjZXNzZXMgYXJlIHNhZmUuCisgIC8vLworICAvLy8gT25seSBjaGVja3Mgc2V0cyB3aXRoIGVsZW1lbnRzIGluIFxwIENoZWNrRGVwcy4KKyAgYm9vbCBhcmVEZXBzU2FmZShEZXBDYW5kaWRhdGVzICZBY2Nlc3NTZXRzLCBNZW1BY2Nlc3NJbmZvTGlzdCAmQ2hlY2tEZXBzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlVG9WYWx1ZU1hcCAmU3RyaWRlcyk7CisKKyAgLy8vIFxicmllZiBObyBtZW1vcnkgZGVwZW5kZW5jZSB3YXMgZW5jb3VudGVyZWQgdGhhdCB3b3VsZCBpbmhpYml0CisgIC8vLyB2ZWN0b3JpemF0aW9uLgorICBib29sIGlzU2FmZUZvclZlY3Rvcml6YXRpb24oKSBjb25zdCB7IHJldHVybiBTYWZlRm9yVmVjdG9yaXphdGlvbjsgfQorCisgIC8vLyBcYnJpZWYgVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIG9mIGEgdmVjdG9yIHJlZ2lzdGVyIHdlIGNhbiB2ZWN0b3JpemUKKyAgLy8vIHRoZSBhY2Nlc3NlcyBzYWZlbHkgd2l0aC4KKyAgdWludDY0X3QgZ2V0TWF4U2FmZURlcERpc3RCeXRlcygpIHsgcmV0dXJuIE1heFNhZmVEZXBEaXN0Qnl0ZXM7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHRoYXQgYXJlIHNhZmUgdG8gb3BlcmF0ZSBvbgorICAvLy8gc2ltdWx0YW5lb3VzbHksIG11bHRpcGxpZWQgYnkgdGhlIHNpemUgb2YgdGhlIGVsZW1lbnQgaW4gYml0cy4KKyAgdWludDY0X3QgZ2V0TWF4U2FmZVJlZ2lzdGVyV2lkdGgoKSBjb25zdCB7IHJldHVybiBNYXhTYWZlUmVnaXN0ZXJXaWR0aDsgfQorCisgIC8vLyBcYnJpZWYgSW4gc2FtZSBjYXNlcyB3aGVuIHRoZSBkZXBlbmRlbmN5IGNoZWNrIGZhaWxzIHdlIGNhbiBzdGlsbAorICAvLy8gdmVjdG9yaXplIHRoZSBsb29wIHdpdGggYSBkeW5hbWljIGFycmF5IGFjY2VzcyBjaGVjay4KKyAgYm9vbCBzaG91bGRSZXRyeVdpdGhSdW50aW1lQ2hlY2soKSB7IHJldHVybiBTaG91bGRSZXRyeVdpdGhSdW50aW1lQ2hlY2s7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG1lbW9yeSBkZXBlbmRlbmNlcy4gIElmIG51bGwgaXMgcmV0dXJuZWQgd2UgZXhjZWVkZWQKKyAgLy8vIHRoZSBNYXhEZXBlbmRlbmNlcyB0aHJlc2hvbGQgYW5kIHRoaXMgaW5mb3JtYXRpb24gaXMgbm90CisgIC8vLyBhdmFpbGFibGUuCisgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxEZXBlbmRlbmNlPiAqZ2V0RGVwZW5kZW5jZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIFJlY29yZERlcGVuZGVuY2VzID8gJkRlcGVuZGVuY2VzIDogbnVsbHB0cjsKKyAgfQorCisgIHZvaWQgY2xlYXJEZXBlbmRlbmNlcygpIHsgRGVwZW5kZW5jZXMuY2xlYXIoKTsgfQorCisgIC8vLyBcYnJpZWYgVGhlIHZlY3RvciBvZiBtZW1vcnkgYWNjZXNzIGluc3RydWN0aW9ucy4gIFRoZSBpbmRpY2VzIGFyZSB1c2VkIGFzCisgIC8vLyBpbnN0cnVjdGlvbiBpZGVudGlmaWVycyBpbiB0aGUgRGVwZW5kZW5jZSBjbGFzcy4KKyAgY29uc3QgU21hbGxWZWN0b3JJbXBsPEluc3RydWN0aW9uICo+ICZnZXRNZW1vcnlJbnN0cnVjdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIEluc3RNYXA7CisgIH0KKworICAvLy8gXGJyaWVmIEdlbmVyYXRlIGEgbWFwcGluZyBiZXR3ZWVuIHRoZSBtZW1vcnkgaW5zdHJ1Y3Rpb25zIGFuZCB0aGVpcgorICAvLy8gaW5kaWNlcyBhY2NvcmRpbmcgdG8gcHJvZ3JhbSBvcmRlci4KKyAgRGVuc2VNYXA8SW5zdHJ1Y3Rpb24gKiwgdW5zaWduZWQ+IGdlbmVyYXRlSW5zdHJ1Y3Rpb25PcmRlck1hcCgpIGNvbnN0IHsKKyAgICBEZW5zZU1hcDxJbnN0cnVjdGlvbiAqLCB1bnNpZ25lZD4gT3JkZXJNYXA7CisKKyAgICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJIDwgSW5zdE1hcC5zaXplKCk7ICsrSSkKKyAgICAgIE9yZGVyTWFwW0luc3RNYXBbSV1dID0gSTsKKworICAgIHJldHVybiBPcmRlck1hcDsKKyAgfQorCisgIC8vLyBcYnJpZWYgRmluZCB0aGUgc2V0IG9mIGluc3RydWN0aW9ucyB0aGF0IHJlYWQgb3Igd3JpdGUgdmlhIFxwIFB0ci4KKyAgU21hbGxWZWN0b3I8SW5zdHJ1Y3Rpb24gKiwgND4gZ2V0SW5zdHJ1Y3Rpb25zRm9yQWNjZXNzKFZhbHVlICpQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzV3JpdGUpIGNvbnN0OworCitwcml2YXRlOgorICAvLy8gQSB3cmFwcGVyIGFyb3VuZCBTY2FsYXJFdm9sdXRpb24sIHVzZWQgdG8gYWRkIHJ1bnRpbWUgU0NFViBjaGVja3MsIGFuZAorICAvLy8gYXBwbGllcyBkeW5hbWljIGtub3dsZWRnZSB0byBzaW1wbGlmeSBTQ0VWIGV4cHJlc3Npb25zIGFuZCBjb252ZXJ0IHRoZW0KKyAgLy8vIHRvIGEgbW9yZSB1c2FibGUgZm9ybS4gV2UgbmVlZCB0aGlzIGluIGNhc2UgYXNzdW1wdGlvbnMgYWJvdXQgU0NFVgorICAvLy8gZXhwcmVzc2lvbnMgbmVlZCB0byBiZSBtYWRlIGluIG9yZGVyIHRvIGF2b2lkIHVua25vd24gZGVwZW5kZW5jZXMuIEZvcgorICAvLy8gZXhhbXBsZSB3ZSBtaWdodCBhc3N1bWUgYSB1bml0IHN0cmlkZSBmb3IgYSBwb2ludGVyIGluIG9yZGVyIHRvIHByb3ZlCisgIC8vLyB0aGF0IGEgbWVtb3J5IGFjY2VzcyBpcyBzdHJpZGVkIGFuZCBkb2Vzbid0IHdyYXAuCisgIFByZWRpY2F0ZWRTY2FsYXJFdm9sdXRpb24gJlBTRTsKKyAgY29uc3QgTG9vcCAqSW5uZXJtb3N0TG9vcDsKKworICAvLy8gXGJyaWVmIE1hcHMgYWNjZXNzIGxvY2F0aW9ucyAocHRyLCByZWFkL3dyaXRlKSB0byBwcm9ncmFtIG9yZGVyLgorICBEZW5zZU1hcDxNZW1BY2Nlc3NJbmZvLCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gPiBBY2Nlc3NlczsKKworICAvLy8gXGJyaWVmIE1lbW9yeSBhY2Nlc3MgaW5zdHJ1Y3Rpb25zIGluIHByb2dyYW0gb3JkZXIuCisgIFNtYWxsVmVjdG9yPEluc3RydWN0aW9uICosIDE2PiBJbnN0TWFwOworCisgIC8vLyBcYnJpZWYgVGhlIHByb2dyYW0gb3JkZXIgaW5kZXggdG8gYmUgdXNlZCBmb3IgdGhlIG5leHQgaW5zdHJ1Y3Rpb24uCisgIHVuc2lnbmVkIEFjY2Vzc0lkeDsKKworICAvLyBXZSBjYW4gYWNjZXNzIHRoaXMgbWFueSBieXRlcyBpbiBwYXJhbGxlbCBzYWZlbHkuCisgIHVpbnQ2NF90IE1heFNhZmVEZXBEaXN0Qnl0ZXM7CisKKyAgLy8vIFxicmllZiBOdW1iZXIgb2YgZWxlbWVudHMgKGZyb20gY29uc2VjdXRpdmUgaXRlcmF0aW9ucykgdGhhdCBhcmUgc2FmZSB0bworICAvLy8gb3BlcmF0ZSBvbiBzaW11bHRhbmVvdXNseSwgbXVsdGlwbGllZCBieSB0aGUgc2l6ZSBvZiB0aGUgZWxlbWVudCBpbiBiaXRzLgorICAvLy8gVGhlIHNpemUgb2YgdGhlIGVsZW1lbnQgaXMgdGFrZW4gZnJvbSB0aGUgbWVtb3J5IGFjY2VzcyB0aGF0IGlzIG1vc3QKKyAgLy8vIHJlc3RyaWN0aXZlLgorICB1aW50NjRfdCBNYXhTYWZlUmVnaXN0ZXJXaWR0aDsKKworICAvLy8gXGJyaWVmIElmIHdlIHNlZSBhIG5vbi1jb25zdGFudCBkZXBlbmRlbmNlIGRpc3RhbmNlIHdlIGNhbiBzdGlsbCB0cnkgdG8KKyAgLy8vIHZlY3Rvcml6ZSB0aGlzIGxvb3Agd2l0aCBydW50aW1lIGNoZWNrcy4KKyAgYm9vbCBTaG91bGRSZXRyeVdpdGhSdW50aW1lQ2hlY2s7CisKKyAgLy8vIFxicmllZiBObyBtZW1vcnkgZGVwZW5kZW5jZSB3YXMgZW5jb3VudGVyZWQgdGhhdCB3b3VsZCBpbmhpYml0CisgIC8vLyB2ZWN0b3JpemF0aW9uLgorICBib29sIFNhZmVGb3JWZWN0b3JpemF0aW9uOworCisgIC8vLy8gXGJyaWVmIFRydWUgaWYgRGVwZW5kZW5jZXMgcmVmbGVjdHMgdGhlIGRlcGVuZGVuY2VzIGluIHRoZQorICAvLy8vIGxvb3AuICBJZiBmYWxzZSB3ZSBleGNlZWRlZCBNYXhEZXBlbmRlbmNlcyBhbmQKKyAgLy8vLyBEZXBlbmRlbmNlcyBpcyBpbnZhbGlkLgorICBib29sIFJlY29yZERlcGVuZGVuY2VzOworCisgIC8vLyBcYnJpZWYgTWVtb3J5IGRlcGVuZGVuY2VzIGNvbGxlY3RlZCBkdXJpbmcgdGhlIGFuYWx5c2lzLiAgT25seSB2YWxpZCBpZgorICAvLy8gUmVjb3JkRGVwZW5kZW5jZXMgaXMgdHJ1ZS4KKyAgU21hbGxWZWN0b3I8RGVwZW5kZW5jZSwgOD4gRGVwZW5kZW5jZXM7CisKKyAgLy8vIFxicmllZiBDaGVjayB3aGV0aGVyIHRoZXJlIGlzIGEgcGxhdXNpYmxlIGRlcGVuZGVuY2UgYmV0d2VlbiB0aGUgdHdvCisgIC8vLyBhY2Nlc3Nlcy4KKyAgLy8vCisgIC8vLyBBY2Nlc3MgXHAgQSBtdXN0IGhhcHBlbiBiZWZvcmUgXHAgQiBpbiBwcm9ncmFtIG9yZGVyLiBUaGUgdHdvIGluZGljZXMKKyAgLy8vIGlkZW50aWZ5IHRoZSBpbmRleCBpbnRvIHRoZSBwcm9ncmFtIG9yZGVyIG1hcC4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGNoZWNrcyAgd2hldGhlciB0aGVyZSBpcyBhIHBsYXVzaWJsZSBkZXBlbmRlbmNlIChvciB0aGUKKyAgLy8vIGFic2VuY2Ugb2Ygc3VjaCBjYW4ndCBiZSBwcm92ZWQpIGJldHdlZW4gdGhlIHR3byBhY2Nlc3Nlcy4gSWYgdGhlcmUgaXMgYQorICAvLy8gcGxhdXNpYmxlIGRlcGVuZGVuY2UgYnV0IHRoZSBkZXBlbmRlbmNlIGRpc3RhbmNlIGlzIGJpZ2dlciB0aGFuIG9uZQorICAvLy8gZWxlbWVudCBhY2Nlc3MgaXQgcmVjb3JkcyB0aGlzIGRpc3RhbmNlIGluIFxwIE1heFNhZmVEZXBEaXN0Qnl0ZXMgKGlmIHRoaXMKKyAgLy8vIGRpc3RhbmNlIGlzIHNtYWxsZXIgdGhhbiBhbnkgb3RoZXIgZGlzdGFuY2UgZW5jb3VudGVyZWQgc28gZmFyKS4KKyAgLy8vIE90aGVyd2lzZSwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgc2lnbmFsaW5nIGEgcG9zc2libGUgZGVwZW5kZW5jZS4KKyAgRGVwZW5kZW5jZTo6RGVwVHlwZSBpc0RlcGVuZGVudChjb25zdCBNZW1BY2Nlc3NJbmZvICZBLCB1bnNpZ25lZCBBSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbUFjY2Vzc0luZm8gJkIsIHVuc2lnbmVkIEJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWVUb1ZhbHVlTWFwICZTdHJpZGVzKTsKKworICAvLy8gXGJyaWVmIENoZWNrIHdoZXRoZXIgdGhlIGRhdGEgZGVwZW5kZW5jZSBjb3VsZCBwcmV2ZW50IHN0b3JlLWxvYWQKKyAgLy8vIGZvcndhcmRpbmcuCisgIC8vLworICAvLy8gXHJldHVybiBmYWxzZSBpZiB3ZSBzaG91bGRuJ3QgdmVjdG9yaXplIGF0IGFsbCBvciBhdm9pZCBsYXJnZXIKKyAgLy8vIHZlY3Rvcml6YXRpb24gZmFjdG9ycyBieSBsaW1pdGluZyBNYXhTYWZlRGVwRGlzdEJ5dGVzLgorICBib29sIGNvdWxkUHJldmVudFN0b3JlTG9hZEZvcndhcmQodWludDY0X3QgRGlzdGFuY2UsIHVpbnQ2NF90IFR5cGVCeXRlU2l6ZSk7Cit9OworCisvLy8gXGJyaWVmIEhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZW1vcnkgcnVudGltZSBsZWdhbGl0eSBjaGVja3MgdG8gdmVyaWZ5CisvLy8gdGhhdCBhIGdyb3VwIG9mIHBvaW50ZXJzIGRvIG5vdCBvdmVybGFwLgorY2xhc3MgUnVudGltZVBvaW50ZXJDaGVja2luZyB7CitwdWJsaWM6CisgIHN0cnVjdCBQb2ludGVySW5mbyB7CisgICAgLy8vIEhvbGRzIHRoZSBwb2ludGVyIHZhbHVlIHRoYXQgd2UgbmVlZCB0byBjaGVjay4KKyAgICBUcmFja2luZ1ZIPFZhbHVlPiBQb2ludGVyVmFsdWU7CisgICAgLy8vIEhvbGRzIHRoZSBzbWFsbGVzdCBieXRlIGFkZHJlc3MgYWNjZXNzZWQgYnkgdGhlIHBvaW50ZXIgdGhyb3VnaG91dCBhbGwKKyAgICAvLy8gaXRlcmF0aW9ucyBvZiB0aGUgbG9vcC4KKyAgICBjb25zdCBTQ0VWICpTdGFydDsKKyAgICAvLy8gSG9sZHMgdGhlIGxhcmdlc3QgYnl0ZSBhZGRyZXNzIGFjY2Vzc2VkIGJ5IHRoZSBwb2ludGVyIHRocm91Z2hvdXQgYWxsCisgICAgLy8vIGl0ZXJhdGlvbnMgb2YgdGhlIGxvb3AsIHBsdXMgMS4KKyAgICBjb25zdCBTQ0VWICpFbmQ7CisgICAgLy8vIEhvbGRzIHRoZSBpbmZvcm1hdGlvbiBpZiB0aGlzIHBvaW50ZXIgaXMgdXNlZCBmb3Igd3JpdGluZyB0byBtZW1vcnkuCisgICAgYm9vbCBJc1dyaXRlUHRyOworICAgIC8vLyBIb2xkcyB0aGUgaWQgb2YgdGhlIHNldCBvZiBwb2ludGVycyB0aGF0IGNvdWxkIGJlIGRlcGVuZGVudCBiZWNhdXNlIG9mIGEKKyAgICAvLy8gc2hhcmVkIHVuZGVybHlpbmcgb2JqZWN0LgorICAgIHVuc2lnbmVkIERlcGVuZGVuY3lTZXRJZDsKKyAgICAvLy8gSG9sZHMgdGhlIGlkIG9mIHRoZSBkaXNqb2ludCBhbGlhcyBzZXQgdG8gd2hpY2ggdGhpcyBwb2ludGVyIGJlbG9uZ3MuCisgICAgdW5zaWduZWQgQWxpYXNTZXRJZDsKKyAgICAvLy8gU0NFViBmb3IgdGhlIGFjY2Vzcy4KKyAgICBjb25zdCBTQ0VWICpFeHByOworCisgICAgUG9pbnRlckluZm8oVmFsdWUgKlBvaW50ZXJWYWx1ZSwgY29uc3QgU0NFViAqU3RhcnQsIGNvbnN0IFNDRVYgKkVuZCwKKyAgICAgICAgICAgICAgICBib29sIElzV3JpdGVQdHIsIHVuc2lnbmVkIERlcGVuZGVuY3lTZXRJZCwgdW5zaWduZWQgQWxpYXNTZXRJZCwKKyAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpFeHByKQorICAgICAgICA6IFBvaW50ZXJWYWx1ZShQb2ludGVyVmFsdWUpLCBTdGFydChTdGFydCksIEVuZChFbmQpLAorICAgICAgICAgIElzV3JpdGVQdHIoSXNXcml0ZVB0ciksIERlcGVuZGVuY3lTZXRJZChEZXBlbmRlbmN5U2V0SWQpLAorICAgICAgICAgIEFsaWFzU2V0SWQoQWxpYXNTZXRJZCksIEV4cHIoRXhwcikge30KKyAgfTsKKworICBSdW50aW1lUG9pbnRlckNoZWNraW5nKFNjYWxhckV2b2x1dGlvbiAqU0UpIDogTmVlZChmYWxzZSksIFNFKFNFKSB7fQorCisgIC8vLyBSZXNldCB0aGUgc3RhdGUgb2YgdGhlIHBvaW50ZXIgcnVudGltZSBpbmZvcm1hdGlvbi4KKyAgdm9pZCByZXNldCgpIHsKKyAgICBOZWVkID0gZmFsc2U7CisgICAgUG9pbnRlcnMuY2xlYXIoKTsKKyAgICBDaGVja3MuY2xlYXIoKTsKKyAgfQorCisgIC8vLyBJbnNlcnQgYSBwb2ludGVyIGFuZCBjYWxjdWxhdGUgdGhlIHN0YXJ0IGFuZCBlbmQgU0NFVnMuCisgIC8vLyBXZSBuZWVkIFxwIFBTRSBpbiBvcmRlciB0byBjb21wdXRlIHRoZSBTQ0VWIGV4cHJlc3Npb24gb2YgdGhlIHBvaW50ZXIKKyAgLy8vIGFjY29yZGluZyB0byB0aGUgYXNzdW1wdGlvbnMgdGhhdCB3ZSd2ZSBtYWRlIGR1cmluZyB0aGUgYW5hbHlzaXMuCisgIC8vLyBUaGUgbWV0aG9kIG1pZ2h0IGFsc28gdmVyc2lvbiB0aGUgcG9pbnRlciBzdHJpZGUgYWNjb3JkaW5nIHRvIFxwIFN0cmlkZXMsCisgIC8vLyBhbmQgYWRkIG5ldyBwcmVkaWNhdGVzIHRvIFxwIFBTRS4KKyAgdm9pZCBpbnNlcnQoTG9vcCAqTHAsIFZhbHVlICpQdHIsIGJvb2wgV3JpdGVQdHIsIHVuc2lnbmVkIERlcFNldElkLAorICAgICAgICAgICAgICB1bnNpZ25lZCBBU0lkLCBjb25zdCBWYWx1ZVRvVmFsdWVNYXAgJlN0cmlkZXMsCisgICAgICAgICAgICAgIFByZWRpY2F0ZWRTY2FsYXJFdm9sdXRpb24gJlBTRSk7CisKKyAgLy8vIFxicmllZiBObyBydW4tdGltZSBtZW1vcnkgY2hlY2tpbmcgaXMgbmVjZXNzYXJ5LgorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gUG9pbnRlcnMuZW1wdHkoKTsgfQorCisgIC8vLyBBIGdyb3VwaW5nIG9mIHBvaW50ZXJzLiBBIHNpbmdsZSBtZW1jaGVjayBpcyByZXF1aXJlZCBiZXR3ZWVuCisgIC8vLyB0d28gZ3JvdXBzLgorICBzdHJ1Y3QgQ2hlY2tpbmdQdHJHcm91cCB7CisgICAgLy8vIFxicmllZiBDcmVhdGUgYSBuZXcgcG9pbnRlciBjaGVja2luZyBncm91cCBjb250YWluaW5nIGEgc2luZ2xlCisgICAgLy8vIHBvaW50ZXIsIHdpdGggaW5kZXggXHAgSW5kZXggaW4gUnRDaGVjay4KKyAgICBDaGVja2luZ1B0ckdyb3VwKHVuc2lnbmVkIEluZGV4LCBSdW50aW1lUG9pbnRlckNoZWNraW5nICZSdENoZWNrKQorICAgICAgICA6IFJ0Q2hlY2soUnRDaGVjayksIEhpZ2goUnRDaGVjay5Qb2ludGVyc1tJbmRleF0uRW5kKSwKKyAgICAgICAgICBMb3coUnRDaGVjay5Qb2ludGVyc1tJbmRleF0uU3RhcnQpIHsKKyAgICAgIE1lbWJlcnMucHVzaF9iYWNrKEluZGV4KTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFRyaWVzIHRvIGFkZCB0aGUgcG9pbnRlciByZWNvcmRlZCBpbiBSdENoZWNrIGF0IGluZGV4CisgICAgLy8vIFxwIEluZGV4IHRvIHRoaXMgcG9pbnRlciBjaGVja2luZyBncm91cC4gV2UgY2FuIG9ubHkgYWRkIGEgcG9pbnRlcgorICAgIC8vLyB0byBhIGNoZWNraW5nIGdyb3VwIGlmIHdlIHdpbGwgc3RpbGwgYmUgYWJsZSB0byBnZXQKKyAgICAvLy8gdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgb2YgdGhlIGNoZWNrLiBSZXR1cm5zIHRydWUgaW4gY2FzZQorICAgIC8vLyBvZiBzdWNjZXNzLCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCBhZGRQb2ludGVyKHVuc2lnbmVkIEluZGV4KTsKKworICAgIC8vLyBDb25zdGl0dXRlcyB0aGUgY29udGV4dCBvZiB0aGlzIHBvaW50ZXIgY2hlY2tpbmcgZ3JvdXAuIEZvciBlYWNoCisgICAgLy8vIHBvaW50ZXIgdGhhdCBpcyBhIG1lbWJlciBvZiB0aGlzIGdyb3VwIHdlIHdpbGwgcmV0YWluIHRoZSBpbmRleAorICAgIC8vLyBhdCB3aGljaCBpdCBhcHBlYXJzIGluIFJ0Q2hlY2suCisgICAgUnVudGltZVBvaW50ZXJDaGVja2luZyAmUnRDaGVjazsKKyAgICAvLy8gVGhlIFNDRVYgZXhwcmVzc2lvbiB3aGljaCByZXByZXNlbnRzIHRoZSB1cHBlciBib3VuZCBvZiBhbGwgdGhlCisgICAgLy8vIHBvaW50ZXJzIGluIHRoaXMgZ3JvdXAuCisgICAgY29uc3QgU0NFViAqSGlnaDsKKyAgICAvLy8gVGhlIFNDRVYgZXhwcmVzc2lvbiB3aGljaCByZXByZXNlbnRzIHRoZSBsb3dlciBib3VuZCBvZiBhbGwgdGhlCisgICAgLy8vIHBvaW50ZXJzIGluIHRoaXMgZ3JvdXAuCisgICAgY29uc3QgU0NFViAqTG93OworICAgIC8vLyBJbmRpY2VzIG9mIGFsbCB0aGUgcG9pbnRlcnMgdGhhdCBjb25zdGl0dXRlIHRoaXMgZ3JvdXBpbmcuCisgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDI+IE1lbWJlcnM7CisgIH07CisKKyAgLy8vIFxicmllZiBBIG1lbWNoZWNrIHdoaWNoIG1hZGUgdXAgb2YgYSBwYWlyIG9mIGdyb3VwZWQgcG9pbnRlcnMuCisgIC8vLworICAvLy8gVGhlc2UgKmhhdmUqIHRvIGJlIGNvbnN0IGZvciBub3csIHNpbmNlIGNoZWNrcyBhcmUgZ2VuZXJhdGVkIGZyb20KKyAgLy8vIENoZWNraW5nUHRyR3JvdXBzIGluIExBSTo6YWRkUnVudGltZUNoZWNrcyB3aGljaCBpcyBhIGNvbnN0IG1lbWJlcgorICAvLy8gZnVuY3Rpb24uICBGSVhNRTogb25jZSBjaGVjay1nZW5lcmF0aW9uIGlzIG1vdmVkIGluc2lkZSB0aGlzIGNsYXNzIChhZnRlcgorICAvLy8gdGhlIFB0clBhcnRpdGlvbiBoYWNrIGlzIHJlbW92ZWQpLCB3ZSBjb3VsZCBkcm9wIGNvbnN0LgorICB0eXBlZGVmIHN0ZDo6cGFpcjxjb25zdCBDaGVja2luZ1B0ckdyb3VwICosIGNvbnN0IENoZWNraW5nUHRyR3JvdXAgKj4KKyAgICAgIFBvaW50ZXJDaGVjazsKKworICAvLy8gXGJyaWVmIEdlbmVyYXRlIHRoZSBjaGVja3MgYW5kIHN0b3JlIGl0LiAgVGhpcyBhbHNvIHBlcmZvcm1zIHRoZSBncm91cGluZworICAvLy8gb2YgcG9pbnRlcnMgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgbWVtY2hlY2tzIG5lY2Vzc2FyeS4KKyAgdm9pZCBnZW5lcmF0ZUNoZWNrcyhNZW1vcnlEZXBDaGVja2VyOjpEZXBDYW5kaWRhdGVzICZEZXBDYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIFVzZURlcGVuZGVuY2llcyk7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBjaGVja3MgdGhhdCBnZW5lcmF0ZUNoZWNrcyBjcmVhdGVkLgorICBjb25zdCBTbWFsbFZlY3RvcjxQb2ludGVyQ2hlY2ssIDQ+ICZnZXRDaGVja3MoKSBjb25zdCB7IHJldHVybiBDaGVja3M7IH0KKworICAvLy8gXGJyaWVmIERlY2lkZSBpZiB3ZSBuZWVkIHRvIGFkZCBhIGNoZWNrIGJldHdlZW4gdHdvIGdyb3VwcyBvZiBwb2ludGVycywKKyAgLy8vIGFjY29yZGluZyB0byBuZWVkc0NoZWNraW5nLgorICBib29sIG5lZWRzQ2hlY2tpbmcoY29uc3QgQ2hlY2tpbmdQdHJHcm91cCAmTSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENoZWNraW5nUHRyR3JvdXAgJk4pIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJ1bi10aW1lIGNoZWNrcyByZXF1aXJlZCBhY2NvcmRpbmcgdG8KKyAgLy8vIG5lZWRzQ2hlY2tpbmcuCisgIHVuc2lnbmVkIGdldE51bWJlck9mQ2hlY2tzKCkgY29uc3QgeyByZXR1cm4gQ2hlY2tzLnNpemUoKTsgfQorCisgIC8vLyBcYnJpZWYgUHJpbnQgdGhlIGxpc3QgcnVuLXRpbWUgbWVtb3J5IGNoZWNrcyBuZWNlc3NhcnkuCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBEZXB0aCA9IDApIGNvbnN0OworCisgIC8vLyBQcmludCBccCBDaGVja3MuCisgIHZvaWQgcHJpbnRDaGVja3MocmF3X29zdHJlYW0gJk9TLCBjb25zdCBTbWFsbFZlY3RvckltcGw8UG9pbnRlckNoZWNrPiAmQ2hlY2tzLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoID0gMCkgY29uc3Q7CisKKyAgLy8vIFRoaXMgZmxhZyBpbmRpY2F0ZXMgaWYgd2UgbmVlZCB0byBhZGQgdGhlIHJ1bnRpbWUgY2hlY2suCisgIGJvb2wgTmVlZDsKKworICAvLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIHBvaW50ZXJzIHRoYXQgbWF5IHJlcXVpcmUgY2hlY2tpbmcuCisgIFNtYWxsVmVjdG9yPFBvaW50ZXJJbmZvLCAyPiBQb2ludGVyczsKKworICAvLy8gSG9sZHMgYSBwYXJ0aXRpb25pbmcgb2YgcG9pbnRlcnMgaW50byAiY2hlY2sgZ3JvdXBzIi4KKyAgU21hbGxWZWN0b3I8Q2hlY2tpbmdQdHJHcm91cCwgMj4gQ2hlY2tpbmdHcm91cHM7CisKKyAgLy8vIFxicmllZiBDaGVjayBpZiBwb2ludGVycyBhcmUgaW4gdGhlIHNhbWUgcGFydGl0aW9uCisgIC8vLworICAvLy8gXHAgUHRyVG9QYXJ0aXRpb24gY29udGFpbnMgdGhlIHBhcnRpdGlvbiBudW1iZXIgZm9yIHBvaW50ZXJzICgtMSBpZiB0aGUKKyAgLy8vIHBvaW50ZXIgYmVsb25ncyB0byBtdWx0aXBsZSBwYXJ0aXRpb25zKS4KKyAgc3RhdGljIGJvb2wKKyAgYXJlUG9pbnRlcnNJblNhbWVQYXJ0aXRpb24oY29uc3QgU21hbGxWZWN0b3JJbXBsPGludD4gJlB0clRvUGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQdHJJZHgxLCB1bnNpZ25lZCBQdHJJZHgyKTsKKworICAvLy8gXGJyaWVmIERlY2lkZSB3aGV0aGVyIHdlIG5lZWQgdG8gaXNzdWUgYSBydW4tdGltZSBjaGVjayBmb3IgcG9pbnRlciBhdAorICAvLy8gaW5kZXggXHAgSSBhbmQgXHAgSiB0byBwcm92ZSB0aGVpciBpbmRlcGVuZGVuY2UuCisgIGJvb2wgbmVlZHNDaGVja2luZyh1bnNpZ25lZCBJLCB1bnNpZ25lZCBKKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiBQb2ludGVySW5mbyBmb3IgcG9pbnRlciBhdCBpbmRleCBccCBQdHJJZHguCisgIGNvbnN0IFBvaW50ZXJJbmZvICZnZXRQb2ludGVySW5mbyh1bnNpZ25lZCBQdHJJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gUG9pbnRlcnNbUHRySWR4XTsKKyAgfQorCitwcml2YXRlOgorICAvLy8gXGJyaWVmIEdyb3VwcyBwb2ludGVycyBzdWNoIHRoYXQgYSBzaW5nbGUgbWVtY2hlY2sgaXMgcmVxdWlyZWQKKyAgLy8vIGJldHdlZW4gdHdvIGRpZmZlcmVudCBncm91cHMuIFRoaXMgd2lsbCBjbGVhciB0aGUgQ2hlY2tpbmdHcm91cHMgdmVjdG9yCisgIC8vLyBhbmQgcmUtY29tcHV0ZSBpdC4gV2Ugd2lsbCBvbmx5IGdyb3VwIGRlcGVuZGVjaWVzIGlmIFxwIFVzZURlcGVuZGVuY2llcworICAvLy8gaXMgdHJ1ZSwgb3RoZXJ3aXNlIHdlIHdpbGwgY3JlYXRlIGEgc2VwYXJhdGUgZ3JvdXAgZm9yIGVhY2ggcG9pbnRlci4KKyAgdm9pZCBncm91cENoZWNrcyhNZW1vcnlEZXBDaGVja2VyOjpEZXBDYW5kaWRhdGVzICZEZXBDYW5kcywKKyAgICAgICAgICAgICAgICAgICBib29sIFVzZURlcGVuZGVuY2llcyk7CisKKyAgLy8vIEdlbmVyYXRlIHRoZSBjaGVja3MgYW5kIHJldHVybiB0aGVtLgorICBTbWFsbFZlY3RvcjxQb2ludGVyQ2hlY2ssIDQ+CisgIGdlbmVyYXRlQ2hlY2tzKCkgY29uc3Q7CisKKyAgLy8vIEhvbGRzIGEgcG9pbnRlciB0byB0aGUgU2NhbGFyRXZvbHV0aW9uIGFuYWx5c2lzLgorICBTY2FsYXJFdm9sdXRpb24gKlNFOworCisgIC8vLyBcYnJpZWYgU2V0IG9mIHJ1bi10aW1lIGNoZWNrcyByZXF1aXJlZCB0byBlc3RhYmxpc2ggaW5kZXBlbmRlbmNlIG9mCisgIC8vLyBvdGhlcndpc2UgbWF5LWFsaWFzaW5nIHBvaW50ZXJzIGluIHRoZSBsb29wLgorICBTbWFsbFZlY3RvcjxQb2ludGVyQ2hlY2ssIDQ+IENoZWNrczsKK307CisKKy8vLyBcYnJpZWYgRHJpdmUgdGhlIGFuYWx5c2lzIG9mIG1lbW9yeSBhY2Nlc3NlcyBpbiB0aGUgbG9vcAorLy8vCisvLy8gVGhpcyBjbGFzcyBpcyByZXNwb25zaWJsZSBmb3IgYW5hbHl6aW5nIHRoZSBtZW1vcnkgYWNjZXNzZXMgb2YgYSBsb29wLiAgSXQKKy8vLyBjb2xsZWN0cyB0aGUgYWNjZXNzZXMgYW5kIHRoZW4gaXRzIG1haW4gaGVscGVyIHRoZSBBY2Nlc3NBbmFseXNpcyBjbGFzcworLy8vIGZpbmRzIGFuZCBjYXRlZ29yaXplcyB0aGUgZGVwZW5kZW5jZXMgaW4gYnVpbGREZXBlbmRlbmNlU2V0cy4KKy8vLworLy8vIEZvciBtZW1vcnkgZGVwZW5kZW5jZXMgdGhhdCBjYW4gYmUgYW5hbHl6ZWQgYXQgY29tcGlsZSB0aW1lLCBpdCBkZXRlcm1pbmVzCisvLy8gd2hldGhlciB0aGUgZGVwZW5kZW5jZSBpcyBwYXJ0IG9mIGN5Y2xlIGluaGliaXRpbmcgdmVjdG9yaXphdGlvbi4gIFRoaXMgd29yaworLy8vIGlzIGRlbGVnYXRlZCB0byB0aGUgTWVtb3J5RGVwQ2hlY2tlciBjbGFzcy4KKy8vLworLy8vIEZvciBtZW1vcnkgZGVwZW5kZW5jZXMgdGhhdCBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBhdCBjb21waWxlIHRpbWUsIGl0CisvLy8gZ2VuZXJhdGVzIHJ1bi10aW1lIGNoZWNrcyB0byBwcm92ZSBpbmRlcGVuZGVuY2UuICBUaGlzIGlzIGRvbmUgYnkKKy8vLyBBY2Nlc3NBbmFseXNpczo6Y2FuQ2hlY2tQdHJBdFJUIGFuZCB0aGUgY2hlY2tzIGFyZSBtYWludGFpbmVkIGJ5IHRoZQorLy8vIFJ1bnRpbWVQb2ludGVyQ2hlY2sgY2xhc3MuCisvLy8KKy8vLyBJZiBwb2ludGVycyBjYW4gd3JhcCBvciBjYW4ndCBiZSBleHByZXNzZWQgYXMgYWZmaW5lIEFkZFJlYyBleHByZXNzaW9ucyBieQorLy8vIFNjYWxhckV2b2x1dGlvbiwgd2Ugd2lsbCBnZW5lcmF0ZSBydW4tdGltZSBjaGVja3MgYnkgZW1pdHRpbmcgYQorLy8vIFNDRVZVbmlvblByZWRpY2F0ZS4KKy8vLworLy8vIENoZWNrcyBmb3IgYm90aCBtZW1vcnkgZGVwZW5kZW5jZXMgYW5kIHRoZSBTQ0VWIHByZWRpY2F0ZXMgY29udGFpbmVkIGluIHRoZQorLy8vIFBTRSBtdXN0IGJlIGVtaXR0ZWQgaW4gb3JkZXIgZm9yIHRoZSByZXN1bHRzIG9mIHRoaXMgYW5hbHlzaXMgdG8gYmUgdmFsaWQuCitjbGFzcyBMb29wQWNjZXNzSW5mbyB7CitwdWJsaWM6CisgIExvb3BBY2Nlc3NJbmZvKExvb3AgKkwsIFNjYWxhckV2b2x1dGlvbiAqU0UsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEksCisgICAgICAgICAgICAgICAgIEFsaWFzQW5hbHlzaXMgKkFBLCBEb21pbmF0b3JUcmVlICpEVCwgTG9vcEluZm8gKkxJKTsKKworICAvLy8gUmV0dXJuIHRydWUgd2UgY2FuIGFuYWx5emUgdGhlIG1lbW9yeSBhY2Nlc3NlcyBpbiB0aGUgbG9vcCBhbmQgdGhlcmUgYXJlCisgIC8vLyBubyBtZW1vcnkgZGVwZW5kZW5jZSBjeWNsZXMuCisgIGJvb2wgY2FuVmVjdG9yaXplTWVtb3J5KCkgY29uc3QgeyByZXR1cm4gQ2FuVmVjTWVtOyB9CisKKyAgY29uc3QgUnVudGltZVBvaW50ZXJDaGVja2luZyAqZ2V0UnVudGltZVBvaW50ZXJDaGVja2luZygpIGNvbnN0IHsKKyAgICByZXR1cm4gUHRyUnRDaGVja2luZy5nZXQoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgTnVtYmVyIG9mIG1lbWNoZWNrcyByZXF1aXJlZCB0byBwcm92ZSBpbmRlcGVuZGVuY2Ugb2Ygb3RoZXJ3aXNlCisgIC8vLyBtYXktYWxpYXMgcG9pbnRlcnMuCisgIHVuc2lnbmVkIGdldE51bVJ1bnRpbWVQb2ludGVyQ2hlY2tzKCkgY29uc3QgeworICAgIHJldHVybiBQdHJSdENoZWNraW5nLT5nZXROdW1iZXJPZkNoZWNrcygpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBibG9jayBCQiBuZWVkcyB0byBiZSBwcmVkaWNhdGVkIGluIG9yZGVyIGZvciB0aGUgbG9vcAorICAvLy8gdG8gYmUgdmVjdG9yaXplZC4KKyAgc3RhdGljIGJvb2wgYmxvY2tOZWVkc1ByZWRpY2F0aW9uKEJhc2ljQmxvY2sgKkJCLCBMb29wICpUaGVMb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9taW5hdG9yVHJlZSAqRFQpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIFYgaXMgdW5pZm9ybSB3aXRoaW4gdGhlIGxvb3AuCisgIGJvb2wgaXNVbmlmb3JtKFZhbHVlICpWKSBjb25zdDsKKworICB1aW50NjRfdCBnZXRNYXhTYWZlRGVwRGlzdEJ5dGVzKCkgY29uc3QgeyByZXR1cm4gTWF4U2FmZURlcERpc3RCeXRlczsgfQorICB1bnNpZ25lZCBnZXROdW1TdG9yZXMoKSBjb25zdCB7IHJldHVybiBOdW1TdG9yZXM7IH0KKyAgdW5zaWduZWQgZ2V0TnVtTG9hZHMoKSBjb25zdCB7IHJldHVybiBOdW1Mb2Fkczt9CisKKyAgLy8vIFxicmllZiBBZGQgY29kZSB0aGF0IGNoZWNrcyBhdCBydW50aW1lIGlmIHRoZSBhY2Nlc3NlZCBhcnJheXMgb3ZlcmxhcC4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIGEgcGFpciBvZiBpbnN0cnVjdGlvbnMgd2hlcmUgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIGZpcnN0CisgIC8vLyBpbnN0cnVjdGlvbiBnZW5lcmF0ZWQgaW4gcG9zc2libHkgYSBzZXF1ZW5jZSBvZiBpbnN0cnVjdGlvbnMgYW5kIHRoZQorICAvLy8gc2Vjb25kIHZhbHVlIGlzIHRoZSBmaW5hbCBjb21wYXJhdG9yIHZhbHVlIG9yIE5VTEwgaWYgbm8gY2hlY2sgaXMgbmVlZGVkLgorICBzdGQ6OnBhaXI8SW5zdHJ1Y3Rpb24gKiwgSW5zdHJ1Y3Rpb24gKj4KKyAgYWRkUnVudGltZUNoZWNrcyhJbnN0cnVjdGlvbiAqTG9jKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdlbmVyZXRlIHRoZSBpbnN0cnVjdGlvbnMgZm9yIHRoZSBjaGVja3MgaW4gXHAgUG9pbnRlckNoZWNrcy4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIGEgcGFpciBvZiBpbnN0cnVjdGlvbnMgd2hlcmUgdGhlIGZpcnN0IGVsZW1lbnQgaXMgdGhlIGZpcnN0CisgIC8vLyBpbnN0cnVjdGlvbiBnZW5lcmF0ZWQgaW4gcG9zc2libHkgYSBzZXF1ZW5jZSBvZiBpbnN0cnVjdGlvbnMgYW5kIHRoZQorICAvLy8gc2Vjb25kIHZhbHVlIGlzIHRoZSBmaW5hbCBjb21wYXJhdG9yIHZhbHVlIG9yIE5VTEwgaWYgbm8gY2hlY2sgaXMgbmVlZGVkLgorICBzdGQ6OnBhaXI8SW5zdHJ1Y3Rpb24gKiwgSW5zdHJ1Y3Rpb24gKj4KKyAgYWRkUnVudGltZUNoZWNrcyhJbnN0cnVjdGlvbiAqTG9jLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxSdW50aW1lUG9pbnRlckNoZWNraW5nOjpQb2ludGVyQ2hlY2s+CisgICAgICAgICAgICAgICAgICAgICAgICZQb2ludGVyQ2hlY2tzKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFRoZSBkaWFnbm9zdGljcyByZXBvcnQgZ2VuZXJhdGVkIGZvciB0aGUgYW5hbHlzaXMuICBFLmcuIHdoeSB3ZQorICAvLy8gY291bGRuJ3QgYW5hbHl6ZSB0aGUgbG9vcC4KKyAgY29uc3QgT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXMgKmdldFJlcG9ydCgpIGNvbnN0IHsgcmV0dXJuIFJlcG9ydC5nZXQoKTsgfQorCisgIC8vLyBcYnJpZWYgdGhlIE1lbW9yeSBEZXBlbmRlbmNlIENoZWNrZXIgd2hpY2ggY2FuIGRldGVybWluZSB0aGUKKyAgLy8vIGxvb3AtaW5kZXBlbmRlbnQgYW5kIGxvb3AtY2FycmllZCBkZXBlbmRlbmNlcyBiZXR3ZWVuIG1lbW9yeSBhY2Nlc3Nlcy4KKyAgY29uc3QgTWVtb3J5RGVwQ2hlY2tlciAmZ2V0RGVwQ2hlY2tlcigpIGNvbnN0IHsgcmV0dXJuICpEZXBDaGVja2VyOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGxpc3Qgb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgdXNlIFxwIFB0ciB0byByZWFkIG9yIHdyaXRlCisgIC8vLyBtZW1vcnkuCisgIFNtYWxsVmVjdG9yPEluc3RydWN0aW9uICosIDQ+IGdldEluc3RydWN0aW9uc0ZvckFjY2VzcyhWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1dyaXRlKSBjb25zdCB7CisgICAgcmV0dXJuIERlcENoZWNrZXItPmdldEluc3RydWN0aW9uc0ZvckFjY2VzcyhQdHIsIGlzV3JpdGUpOworICB9CisKKyAgLy8vIFxicmllZiBJZiBhbiBhY2Nlc3MgaGFzIGEgc3ltYm9saWMgc3RyaWRlcywgdGhpcyBtYXBzIHRoZSBwb2ludGVyIHZhbHVlIHRvCisgIC8vLyB0aGUgc3RyaWRlIHN5bWJvbC4KKyAgY29uc3QgVmFsdWVUb1ZhbHVlTWFwICZnZXRTeW1ib2xpY1N0cmlkZXMoKSBjb25zdCB7IHJldHVybiBTeW1ib2xpY1N0cmlkZXM7IH0KKworICAvLy8gXGJyaWVmIFBvaW50ZXIgaGFzIGEgc3ltYm9saWMgc3RyaWRlLgorICBib29sIGhhc1N0cmlkZShWYWx1ZSAqVikgY29uc3QgeyByZXR1cm4gU3RyaWRlU2V0LmNvdW50KFYpOyB9CisKKyAgLy8vIFxicmllZiBQcmludCB0aGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lbW9yeSBhY2Nlc3NlcyBpbiB0aGUgbG9vcC4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIERlcHRoID0gMCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDaGVja3MgZXhpc3RlbmNlIG9mIHN0b3JlIHRvIGludmFyaWFudCBhZGRyZXNzIGluc2lkZSBsb29wLgorICAvLy8gSWYgdGhlIGxvb3AgaGFzIGFueSBzdG9yZSB0byBpbnZhcmlhbnQgYWRkcmVzcywgdGhlbiBpdCByZXR1cm5zIHRydWUsCisgIC8vLyBlbHNlIHJldHVybnMgZmFsc2UuCisgIGJvb2wgaGFzU3RvcmVUb0xvb3BJbnZhcmlhbnRBZGRyZXNzKCkgY29uc3QgeworICAgIHJldHVybiBTdG9yZVRvTG9vcEludmFyaWFudEFkZHJlc3M7CisgIH0KKworICAvLy8gVXNlZCB0byBhZGQgcnVudGltZSBTQ0VWIGNoZWNrcy4gU2ltcGxpZmllcyBTQ0VWIGV4cHJlc3Npb25zIGFuZCBjb252ZXJ0cworICAvLy8gdGhlbSB0byBhIG1vcmUgdXNhYmxlIGZvcm0uICBBbGwgU0NFViBleHByZXNzaW9ucyBkdXJpbmcgdGhlIGFuYWx5c2lzCisgIC8vLyBzaG91bGQgYmUgcmUtd3JpdHRlbiAoYW5kIHRoZXJlZm9yZSBzaW1wbGlmaWVkKSBhY2NvcmRpbmcgdG8gUFNFLgorICAvLy8gQSB1c2VyIG9mIExvb3BBY2Nlc3NBbmFseXNpcyB3aWxsIG5lZWQgdG8gZW1pdCB0aGUgcnVudGltZSBjaGVja3MKKyAgLy8vIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHByZWRpY2F0ZS4KKyAgY29uc3QgUHJlZGljYXRlZFNjYWxhckV2b2x1dGlvbiAmZ2V0UFNFKCkgY29uc3QgeyByZXR1cm4gKlBTRTsgfQorCitwcml2YXRlOgorICAvLy8gXGJyaWVmIEFuYWx5emUgdGhlIGxvb3AuCisgIHZvaWQgYW5hbHl6ZUxvb3AoQWxpYXNBbmFseXNpcyAqQUEsIExvb3BJbmZvICpMSSwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJLCBEb21pbmF0b3JUcmVlICpEVCk7CisKKyAgLy8vIFxicmllZiBDaGVjayBpZiB0aGUgc3RydWN0dXJlIG9mIHRoZSBsb29wIGFsbG93cyBpdCB0byBiZSBhbmFseXplZCBieSB0aGlzCisgIC8vLyBwYXNzLgorICBib29sIGNhbkFuYWx5emVMb29wKCk7CisKKyAgLy8vIFxicmllZiBTYXZlIHRoZSBhbmFseXNpcyByZW1hcmsuCisgIC8vLworICAvLy8gTEFBIGRvZXMgbm90IGRpcmVjdGx5IGVtaXRzIHRoZSByZW1hcmtzLiAgSW5zdGVhZCBpdCBzdG9yZXMgaXQgd2hpY2ggdGhlCisgIC8vLyBjbGllbnQgY2FuIHJldHJpZXZlIGFuZCBwcmVzZW50cyBhcyBpdHMgb3duIGFuYWx5c2lzCisgIC8vLyAoZS5nLiAtUnBhc3MtYW5hbHlzaXM9bG9vcC12ZWN0b3JpemUpLgorICBPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpcyAmcmVjb3JkQW5hbHlzaXMoU3RyaW5nUmVmIFJlbWFya05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zdHIgPSBudWxscHRyKTsKKworICAvLy8gXGJyaWVmIENvbGxlY3QgbWVtb3J5IGFjY2VzcyB3aXRoIGxvb3AgaW52YXJpYW50IHN0cmlkZXMuCisgIC8vLworICAvLy8gTG9va3MgZm9yIGFjY2Vzc2VzIGxpa2UgImFbaSAqIFN0cmlkZUFdIiB3aGVyZSAiU3RyaWRlQSIgaXMgbG9vcAorICAvLy8gaW52YXJpYW50LgorICB2b2lkIGNvbGxlY3RTdHJpZGVkQWNjZXNzKFZhbHVlICpMb2FkT3JTdG9yZUluc3QpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxQcmVkaWNhdGVkU2NhbGFyRXZvbHV0aW9uPiBQU0U7CisKKyAgLy8vIFdlIG5lZWQgdG8gY2hlY2sgdGhhdCBhbGwgb2YgdGhlIHBvaW50ZXJzIGluIHRoaXMgbGlzdCBhcmUgZGlzam9pbnQKKyAgLy8vIGF0IHJ1bnRpbWUuIFVzaW5nIHN0ZDo6dW5pcXVlX3B0ciB0byBtYWtlIHVzaW5nIG1vdmUgY3RvciBzaW1wbGVyLgorICBzdGQ6OnVuaXF1ZV9wdHI8UnVudGltZVBvaW50ZXJDaGVja2luZz4gUHRyUnRDaGVja2luZzsKKworICAvLy8gXGJyaWVmIHRoZSBNZW1vcnkgRGVwZW5kZW5jZSBDaGVja2VyIHdoaWNoIGNhbiBkZXRlcm1pbmUgdGhlCisgIC8vLyBsb29wLWluZGVwZW5kZW50IGFuZCBsb29wLWNhcnJpZWQgZGVwZW5kZW5jZXMgYmV0d2VlbiBtZW1vcnkgYWNjZXNzZXMuCisgIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlEZXBDaGVja2VyPiBEZXBDaGVja2VyOworCisgIExvb3AgKlRoZUxvb3A7CisKKyAgdW5zaWduZWQgTnVtTG9hZHM7CisgIHVuc2lnbmVkIE51bVN0b3JlczsKKworICB1aW50NjRfdCBNYXhTYWZlRGVwRGlzdEJ5dGVzOworCisgIC8vLyBcYnJpZWYgQ2FjaGUgdGhlIHJlc3VsdCBvZiBhbmFseXplTG9vcC4KKyAgYm9vbCBDYW5WZWNNZW07CisKKyAgLy8vIFxicmllZiBJbmRpY2F0b3IgZm9yIHN0b3JpbmcgdG8gdW5pZm9ybSBhZGRyZXNzZXMuCisgIC8vLyBJZiBhIGxvb3AgaGFzIHdyaXRlIHRvIGEgbG9vcCBpbnZhcmlhbnQgYWRkcmVzcyB0aGVuIGl0IHNob3VsZCBiZSB0cnVlLgorICBib29sIFN0b3JlVG9Mb29wSW52YXJpYW50QWRkcmVzczsKKworICAvLy8gXGJyaWVmIFRoZSBkaWFnbm9zdGljcyByZXBvcnQgZ2VuZXJhdGVkIGZvciB0aGUgYW5hbHlzaXMuICBFLmcuIHdoeSB3ZQorICAvLy8gY291bGRuJ3QgYW5hbHl6ZSB0aGUgbG9vcC4KKyAgc3RkOjp1bmlxdWVfcHRyPE9wdGltaXphdGlvblJlbWFya0FuYWx5c2lzPiBSZXBvcnQ7CisKKyAgLy8vIFxicmllZiBJZiBhbiBhY2Nlc3MgaGFzIGEgc3ltYm9saWMgc3RyaWRlcywgdGhpcyBtYXBzIHRoZSBwb2ludGVyIHZhbHVlIHRvCisgIC8vLyB0aGUgc3RyaWRlIHN5bWJvbC4KKyAgVmFsdWVUb1ZhbHVlTWFwIFN5bWJvbGljU3RyaWRlczsKKworICAvLy8gXGJyaWVmIFNldCBvZiBzeW1ib2xpYyBzdHJpZGVzIHZhbHVlcy4KKyAgU21hbGxQdHJTZXQ8VmFsdWUgKiwgOD4gU3RyaWRlU2V0OworfTsKKworVmFsdWUgKnN0cmlwSW50ZWdlckNhc3QoVmFsdWUgKlYpOworCisvLy8gXGJyaWVmIFJldHVybiB0aGUgU0NFViBjb3JyZXNwb25kaW5nIHRvIGEgcG9pbnRlciB3aXRoIHRoZSBzeW1ib2xpYyBzdHJpZGUKKy8vLyByZXBsYWNlZCB3aXRoIGNvbnN0YW50IG9uZSwgYXNzdW1pbmcgdGhlIFNDRVYgcHJlZGljYXRlIGFzc29jaWF0ZWQgd2l0aAorLy8vIFxwIFBTRSBpcyB0cnVlLgorLy8vCisvLy8gSWYgbmVjZXNzYXJ5IHRoaXMgbWV0aG9kIHdpbGwgdmVyc2lvbiB0aGUgc3RyaWRlIG9mIHRoZSBwb2ludGVyIGFjY29yZGluZworLy8vIHRvIFxwIFB0clRvU3RyaWRlIGFuZCB0aGVyZWZvcmUgYWRkIGZ1cnRoZXIgcHJlZGljYXRlcyB0byBccCBQU0UuCisvLy8KKy8vLyBJZiBccCBPcmlnUHRyIGlzIG5vdCBudWxsLCB1c2UgaXQgdG8gbG9vayB1cCB0aGUgc3RyaWRlIHZhbHVlIGluc3RlYWQgb2YgXHAKKy8vLyBQdHIuICBccCBQdHJUb1N0cmlkZSBwcm92aWRlcyB0aGUgbWFwcGluZyBiZXR3ZWVuIHRoZSBwb2ludGVyIHZhbHVlIGFuZCBpdHMKKy8vLyBzdHJpZGUgYXMgY29sbGVjdGVkIGJ5IExvb3BWZWN0b3JpemF0aW9uTGVnYWxpdHk6OmNvbGxlY3RTdHJpZGVkQWNjZXNzLgorY29uc3QgU0NFViAqcmVwbGFjZVN5bWJvbGljU3RyaWRlU0NFVihQcmVkaWNhdGVkU2NhbGFyRXZvbHV0aW9uICZQU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlVG9WYWx1ZU1hcCAmUHRyVG9TdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpQdHIsIFZhbHVlICpPcmlnUHRyID0gbnVsbHB0cik7CisKKy8vLyBcYnJpZWYgSWYgdGhlIHBvaW50ZXIgaGFzIGEgY29uc3RhbnQgc3RyaWRlIHJldHVybiBpdCBpbiB1bml0cyBvZiBpdHMKKy8vLyBlbGVtZW50IHNpemUuICBPdGhlcndpc2UgcmV0dXJuIHplcm8uCisvLy8KKy8vLyBFbnN1cmUgdGhhdCBpdCBkb2VzIG5vdCB3cmFwIGluIHRoZSBhZGRyZXNzIHNwYWNlLCBhc3N1bWluZyB0aGUgcHJlZGljYXRlCisvLy8gYXNzb2NpYXRlZCB3aXRoIFxwIFBTRSBpcyB0cnVlLgorLy8vCisvLy8gSWYgbmVjZXNzYXJ5IHRoaXMgbWV0aG9kIHdpbGwgdmVyc2lvbiB0aGUgc3RyaWRlIG9mIHRoZSBwb2ludGVyIGFjY29yZGluZworLy8vIHRvIFxwIFB0clRvU3RyaWRlIGFuZCB0aGVyZWZvcmUgYWRkIGZ1cnRoZXIgcHJlZGljYXRlcyB0byBccCBQU0UuCisvLy8gVGhlIFxwIEFzc3VtZSBwYXJhbWV0ZXIgaW5kaWNhdGVzIGlmIHdlIGFyZSBhbGxvd2VkIHRvIG1ha2UgYWRkaXRpb25hbAorLy8vIHJ1bi10aW1lIGFzc3VtcHRpb25zLgoraW50NjRfdCBnZXRQdHJTdHJpZGUoUHJlZGljYXRlZFNjYWxhckV2b2x1dGlvbiAmUFNFLCBWYWx1ZSAqUHRyLCBjb25zdCBMb29wICpMcCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlVG9WYWx1ZU1hcCAmU3RyaWRlc01hcCA9IFZhbHVlVG9WYWx1ZU1hcCgpLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBBc3N1bWUgPSBmYWxzZSwgYm9vbCBTaG91bGRDaGVja1dyYXAgPSB0cnVlKTsKKworLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIG1lbW9yeSBvcGVyYXRpb25zIFxwIEEgYW5kIFxwIEIgYXJlIGNvbnNlY3V0aXZlLgorLy8vIFRoaXMgaXMgYSBzaW1wbGUgQVBJIHRoYXQgZG9lcyBub3QgZGVwZW5kIG9uIHRoZSBhbmFseXNpcyBwYXNzLiAKK2Jvb2wgaXNDb25zZWN1dGl2ZUFjY2VzcyhWYWx1ZSAqQSwgVmFsdWUgKkIsIGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhckV2b2x1dGlvbiAmU0UsIGJvb2wgQ2hlY2tUeXBlID0gdHJ1ZSk7CisKKy8vLyBcYnJpZWYgVGhpcyBhbmFseXNpcyBwcm92aWRlcyBkZXBlbmRlbmNlIGluZm9ybWF0aW9uIGZvciB0aGUgbWVtb3J5IGFjY2Vzc2VzCisvLy8gb2YgYSBsb29wLgorLy8vCisvLy8gSXQgcnVucyB0aGUgYW5hbHlzaXMgZm9yIGEgbG9vcCBvbiBkZW1hbmQuICBUaGlzIGNhbiBiZSBpbml0aWF0ZWQgYnkKKy8vLyBxdWVyeWluZyB0aGUgbG9vcCBhY2Nlc3MgaW5mbyB2aWEgTEFBOjpnZXRJbmZvLiAgZ2V0SW5mbyByZXR1cm4gYQorLy8vIExvb3BBY2Nlc3NJbmZvIG9iamVjdC4gIFNlZSB0aGlzIGNsYXNzIGZvciB0aGUgc3BlY2lmaWNzIG9mIHdoYXQgaW5mb3JtYXRpb24KKy8vLyBpcyBwcm92aWRlZC4KK2NsYXNzIExvb3BBY2Nlc3NMZWdhY3lBbmFseXNpcyA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBMb29wQWNjZXNzTGVnYWN5QW5hbHlzaXMoKSA6IEZ1bmN0aW9uUGFzcyhJRCkgeworICAgIGluaXRpYWxpemVMb29wQWNjZXNzTGVnYWN5QW5hbHlzaXNQYXNzKCpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpKTsKKyAgfQorCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgb3ZlcnJpZGU7CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFF1ZXJ5IHRoZSByZXN1bHQgb2YgdGhlIGxvb3AgYWNjZXNzIGluZm9ybWF0aW9uIGZvciB0aGUgbG9vcCBccCBMLgorICAvLy8KKyAgLy8vIElmIHRoZXJlIGlzIG5vIGNhY2hlZCByZXN1bHQgYXZhaWxhYmxlIHJ1biB0aGUgYW5hbHlzaXMuCisgIGNvbnN0IExvb3BBY2Nlc3NJbmZvICZnZXRJbmZvKExvb3AgKkwpOworCisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlIHsKKyAgICAvLyBJbnZhbGlkYXRlIHRoZSBjYWNoZSB3aGVuIHRoZSBwYXNzIGlzIGZyZWVkLgorICAgIExvb3BBY2Nlc3NJbmZvTWFwLmNsZWFyKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFByaW50IHRoZSByZXN1bHQgb2YgdGhlIGFuYWx5c2lzIHdoZW4gaW52b2tlZCB3aXRoIC1hbmFseXplLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlICpNID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgVGhlIGNhY2hlLgorICBEZW5zZU1hcDxMb29wICosIHN0ZDo6dW5pcXVlX3B0cjxMb29wQWNjZXNzSW5mbz4+IExvb3BBY2Nlc3NJbmZvTWFwOworCisgIC8vIFRoZSB1c2VkIGFuYWx5c2lzIHBhc3Nlcy4KKyAgU2NhbGFyRXZvbHV0aW9uICpTRTsKKyAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSTsKKyAgQWxpYXNBbmFseXNpcyAqQUE7CisgIERvbWluYXRvclRyZWUgKkRUOworICBMb29wSW5mbyAqTEk7Cit9OworCisvLy8gXGJyaWVmIFRoaXMgYW5hbHlzaXMgcHJvdmlkZXMgZGVwZW5kZW5jZSBpbmZvcm1hdGlvbiBmb3IgdGhlIG1lbW9yeQorLy8vIGFjY2Vzc2VzIG9mIGEgbG9vcC4KKy8vLworLy8vIEl0IHJ1bnMgdGhlIGFuYWx5c2lzIGZvciBhIGxvb3Agb24gZGVtYW5kLiAgVGhpcyBjYW4gYmUgaW5pdGlhdGVkIGJ5CisvLy8gcXVlcnlpbmcgdGhlIGxvb3AgYWNjZXNzIGluZm8gdmlhIEFNLmdldFJlc3VsdDxMb29wQWNjZXNzQW5hbHlzaXM+LiAKKy8vLyBnZXRSZXN1bHQgcmV0dXJuIGEgTG9vcEFjY2Vzc0luZm8gb2JqZWN0LiAgU2VlIHRoaXMgY2xhc3MgZm9yIHRoZQorLy8vIHNwZWNpZmljcyBvZiB3aGF0IGluZm9ybWF0aW9uIGlzIHByb3ZpZGVkLgorY2xhc3MgTG9vcEFjY2Vzc0FuYWx5c2lzCisgICAgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48TG9vcEFjY2Vzc0FuYWx5c2lzPiB7CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxMb29wQWNjZXNzQW5hbHlzaXM+OworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCitwdWJsaWM6CisgIHR5cGVkZWYgTG9vcEFjY2Vzc0luZm8gUmVzdWx0OworCisgIFJlc3VsdCBydW4oTG9vcCAmTCwgTG9vcEFuYWx5c2lzTWFuYWdlciAmQU0sIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmQVIpOworfTsKKworaW5saW5lIEluc3RydWN0aW9uICpNZW1vcnlEZXBDaGVja2VyOjpEZXBlbmRlbmNlOjpnZXRTb3VyY2UoCisgICAgY29uc3QgTG9vcEFjY2Vzc0luZm8gJkxBSSkgY29uc3QgeworICByZXR1cm4gTEFJLmdldERlcENoZWNrZXIoKS5nZXRNZW1vcnlJbnN0cnVjdGlvbnMoKVtTb3VyY2VdOworfQorCitpbmxpbmUgSW5zdHJ1Y3Rpb24gKk1lbW9yeURlcENoZWNrZXI6OkRlcGVuZGVuY2U6OmdldERlc3RpbmF0aW9uKAorICAgIGNvbnN0IExvb3BBY2Nlc3NJbmZvICZMQUkpIGNvbnN0IHsKKyAgcmV0dXJuIExBSS5nZXREZXBDaGVja2VyKCkuZ2V0TWVtb3J5SW5zdHJ1Y3Rpb25zKClbRGVzdGluYXRpb25dOworfQorCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTG9vcEFuYWx5c2lzTWFuYWdlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Mb29wQW5hbHlzaXNNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE3ZWU5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTG9vcEFuYWx5c2lzTWFuYWdlci5oCkBAIC0wLDAgKzEsMTYwIEBACisvLz09PS0gTG9vcEFuYWx5c2lzTWFuYWdlci5oIC0gTG9vcCBhbmFseXNpcyBtYW5hZ2VtZW50IC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8KKy8vLyBUaGlzIGhlYWRlciBwcm92aWRlcyBjbGFzc2VzIGZvciBtYW5hZ2luZyBwZXItbG9vcCBhbmFseXNlcy4gVGhlc2UgYXJlCisvLy8gdHlwaWNhbGx5IHVzZWQgYXMgcGFydCBvZiBhIGxvb3AgcGFzcyBwaXBlbGluZSBvdmVyIHRoZSBsb29wIG5lc3RzIG9mCisvLy8gYSBmdW5jdGlvbi4KKy8vLworLy8vIExvb3AgYW5hbHlzZXMgYXJlIGFsbG93ZWQgdG8gbWFrZSBzb21lIHNpbXBsaWZ5aW5nIGFzc3VtcHRpb25zOgorLy8vIDEpIExvb3BzIGFyZSwgd2hlcmUgcG9zc2libGUsIGluIHNpbXBsaWZpZWQgZm9ybS4KKy8vLyAyKSBMb29wcyBhcmUgKmFsd2F5cyogaW4gTENTU0EgZm9ybS4KKy8vLyAzKSBBIGNvbGxlY3Rpb24gb2YgYW5hbHlzaXMgcmVzdWx0cyBhcmUgYXZhaWxhYmxlOgorLy8vICAgIC0gTG9vcEluZm8KKy8vLyAgICAtIERvbWluYXRvclRyZWUKKy8vLyAgICAtIFNjYWxhckV2b2x1dGlvbgorLy8vICAgIC0gQUFNYW5hZ2VyCisvLy8KKy8vLyBUaGUgcHJpbWFyeSBtZWNoYW5pc20gdG8gcHJvdmlkZSB0aGVzZSBpbnZhcmlhbnRzIGlzIHRoZSBsb29wIHBhc3MgbWFuYWdlciwKKy8vLyBidXQgdGhleSBjYW4gYWxzbyBiZSBtYW51YWxseSBwcm92aWRlZCBpbiBvcmRlciB0byByZWFzb24gYWJvdXQgYSBsb29wIGZyb20KKy8vLyBvdXRzaWRlIG9mIGEgZGVkaWNhdGVkIHBhc3MgbWFuYWdlci4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0xPT1BBTkFMWVNJU01BTkFHRVJfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0xPT1BBTkFMWVNJU01BTkFHRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvUG9zdE9yZGVySXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qcmlvcml0eVdvcmtsaXN0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9CYXNpY0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0dsb2JhbHNNb2RSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9NZW1vcnlTU0EuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvVGFyZ2V0TGlicmFyeUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1RhcmdldFRyYW5zZm9ybUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFRoZSBhZGFwdG9yIGZyb20gYSBmdW5jdGlvbiBwYXNzIHRvIGEgbG9vcCBwYXNzIGNvbXB1dGVzIHRoZXNlIGFuYWx5c2VzIGFuZAorLy8vIG1ha2VzIHRoZW0gYXZhaWxhYmxlIHRvIHRoZSBsb29wIHBhc3NlcyAiZm9yIGZyZWUiLiBFYWNoIGxvb3AgcGFzcyBpcworLy8vIGV4cGVjdGVkIGV4cGVjdGVkIHRvIHVwZGF0ZSB0aGVzZSBhbmFseXNlcyBpZiBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoZXkncmUKKy8vLyB2YWxpZCBhZnRlciBpdCBydW5zLgorc3RydWN0IExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyB7CisgIEFBUmVzdWx0cyAmQUE7CisgIEFzc3VtcHRpb25DYWNoZSAmQUM7CisgIERvbWluYXRvclRyZWUgJkRUOworICBMb29wSW5mbyAmTEk7CisgIFNjYWxhckV2b2x1dGlvbiAmU0U7CisgIFRhcmdldExpYnJhcnlJbmZvICZUTEk7CisgIFRhcmdldFRyYW5zZm9ybUluZm8gJlRUSTsKKyAgTWVtb3J5U1NBICpNU1NBOworfTsKKworLy8vIEVuYWJsZXMgbWVtb3J5IHNzYSBhcyBhIGRlcGVuZGVuY3kgZm9yIGxvb3AgcGFzc2VzLgorZXh0ZXJuIGNsOjpvcHQ8Ym9vbD4gRW5hYmxlTVNTQUxvb3BEZXBlbmRlbmN5OworCisvLy8gRXh0ZXJuIHRlbXBsYXRlIGRlY2xhcmF0aW9uIGZvciB0aGUgYW5hbHlzaXMgc2V0IGZvciB0aGlzIElSIHVuaXQuCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgQWxsQW5hbHlzZXNPbjxMb29wPjsKKworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIEFuYWx5c2lzTWFuYWdlcjxMb29wLCBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgJj47CisvLy8gXGJyaWVmIFRoZSBsb29wIGFuYWx5c2lzIG1hbmFnZXIuCisvLy8KKy8vLyBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBBbmFseXNpc01hbmFnZXIgdGVtcGxhdGUgZm9yIGRldGFpbAorLy8vIGRvY3VtZW50YXRpb24uIFRoaXMgdHlwZWRlZiBzZXJ2ZXMgYXMgYSBjb252ZW5pZW50IHdheSB0byByZWZlciB0byB0aGlzCisvLy8gY29uc3RydWN0IGluIHRoZSBhZGFwdG9ycyBhbmQgcHJveGllcyB1c2VkIHRvIGludGVncmF0ZSB0aGlzIGludG8gdGhlIGxhcmdlcgorLy8vIHBhc3MgbWFuYWdlciBpbmZyYXN0cnVjdHVyZS4KK3R5cGVkZWYgQW5hbHlzaXNNYW5hZ2VyPExvb3AsIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmPgorICAgIExvb3BBbmFseXNpc01hbmFnZXI7CisKKy8vLyBBIHByb3h5IGZyb20gYSBcYyBMb29wQW5hbHlzaXNNYW5hZ2VyIHRvIGEgXGMgRnVuY3Rpb24uCit0eXBlZGVmIElubmVyQW5hbHlzaXNNYW5hZ2VyUHJveHk8TG9vcEFuYWx5c2lzTWFuYWdlciwgRnVuY3Rpb24+CisgICAgTG9vcEFuYWx5c2lzTWFuYWdlckZ1bmN0aW9uUHJveHk7CisKKy8vLyBBIHNwZWNpYWxpemVkIHJlc3VsdCBmb3IgdGhlIFxjIExvb3BBbmFseXNpc01hbmFnZXJGdW5jdGlvblByb3h5IHdoaWNoCisvLy8gcmV0YWlucyBhIFxjIExvb3BJbmZvIHJlZmVyZW5jZS4KKy8vLworLy8vIFRoaXMgYWxsb3dzIGl0IHRvIGNvbGxlY3QgbG9vcCBvYmplY3RzIGZvciB3aGljaCBhbmFseXNpcyByZXN1bHRzIG1heSBiZQorLy8vIGNhY2hlZCBpbiB0aGUgXGMgTG9vcEFuYWx5c2lzTWFuYWdlci4KK3RlbXBsYXRlIDw+IGNsYXNzIExvb3BBbmFseXNpc01hbmFnZXJGdW5jdGlvblByb3h5OjpSZXN1bHQgeworcHVibGljOgorICBleHBsaWNpdCBSZXN1bHQoTG9vcEFuYWx5c2lzTWFuYWdlciAmSW5uZXJBTSwgTG9vcEluZm8gJkxJKQorICAgICAgOiBJbm5lckFNKCZJbm5lckFNKSwgTEkoJkxJKSB7fQorICBSZXN1bHQoUmVzdWx0ICYmQXJnKSA6IElubmVyQU0oc3RkOjptb3ZlKEFyZy5Jbm5lckFNKSksIExJKEFyZy5MSSkgeworICAgIC8vIFdlIGhhdmUgdG8gbnVsbCBvdXQgdGhlIGFuYWx5c2lzIG1hbmFnZXIgaW4gdGhlIG1vdmVkLWZyb20gc3RhdGUKKyAgICAvLyBiZWNhdXNlIHdlIGFyZSB0YWtpbmcgb3duZXJzaGlwIG9mIHRoZSByZXNwb25zaWJpbHR5IHRvIGNsZWFyIHRoZQorICAgIC8vIGFuYWx5c2lzIHN0YXRlLgorICAgIEFyZy5Jbm5lckFNID0gbnVsbHB0cjsKKyAgfQorICBSZXN1bHQgJm9wZXJhdG9yPShSZXN1bHQgJiZSSFMpIHsKKyAgICBJbm5lckFNID0gUkhTLklubmVyQU07CisgICAgTEkgPSBSSFMuTEk7CisgICAgLy8gV2UgaGF2ZSB0byBudWxsIG91dCB0aGUgYW5hbHlzaXMgbWFuYWdlciBpbiB0aGUgbW92ZWQtZnJvbSBzdGF0ZQorICAgIC8vIGJlY2F1c2Ugd2UgYXJlIHRha2luZyBvd25lcnNoaXAgb2YgdGhlIHJlc3BvbnNpYmlsdHkgdG8gY2xlYXIgdGhlCisgICAgLy8gYW5hbHlzaXMgc3RhdGUuCisgICAgUkhTLklubmVyQU0gPSBudWxscHRyOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICB+UmVzdWx0KCkgeworICAgIC8vIElubmVyQU0gaXMgY2xlYXJlZCBpbiBhIG1vdmVkIGZyb20gc3RhdGUgd2hlcmUgdGhlcmUgaXMgbm90aGluZyB0byBkby4KKyAgICBpZiAoIUlubmVyQU0pCisgICAgICByZXR1cm47CisKKyAgICAvLyBDbGVhciBvdXQgdGhlIGFuYWx5c2lzIG1hbmFnZXIgaWYgd2UncmUgYmVpbmcgZGVzdHJveWVkIC0tIGl0IG1lYW5zIHdlCisgICAgLy8gZGlkbid0IGV2ZW4gc2VlIGFuIGludmFsaWRhdGUgY2FsbCB3aGVuIHdlIGdvdCBpbnZhbGlkYXRlZC4KKyAgICBJbm5lckFNLT5jbGVhcigpOworICB9CisKKyAgLy8vIEFjY2Vzc29yIGZvciB0aGUgYW5hbHlzaXMgbWFuYWdlci4KKyAgTG9vcEFuYWx5c2lzTWFuYWdlciAmZ2V0TWFuYWdlcigpIHsgcmV0dXJuICpJbm5lckFNOyB9CisKKyAgLy8vIEhhbmRsZXIgZm9yIGludmFsaWRhdGlvbiBvZiB0aGUgcHJveHkgZm9yIGEgcGFydGljdWxhciBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBJZiB0aGUgcHJveHksIFxjIExvb3BJbmZvLCBhbmQgYXNzb2NpYXRlZCBhbmFseXNlcyBhcmUgcHJlc2VydmVkLCB0aGlzCisgIC8vLyB3aWxsIG1lcmVseSBmb3J3YXJkIHRoZSBpbnZhbGlkYXRpb24gZXZlbnQgdG8gYW55IGNhY2hlZCBsb29wIGFuYWx5c2lzCisgIC8vLyByZXN1bHRzIGZvciBsb29wcyB3aXRoaW4gdGhpcyBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBJZiB0aGUgbmVjZXNzYXJ5IGxvb3AgaW5mcmFzdHJ1Y3R1cmUgaXMgbm90IHByZXNlcnZlZCwgdGhpcyB3aWxsIGZvcmNpYmx5CisgIC8vLyBjbGVhciBhbGwgb2YgdGhlIGNhY2hlZCBhbmFseXNpcyByZXN1bHRzIHRoYXQgYXJlIGtleWVkIG9uIHRoZSBcYworICAvLy8gTG9vcEluZm8gZm9yIHRoaXMgZnVuY3Rpb24uCisgIGJvb2wgaW52YWxpZGF0ZShGdW5jdGlvbiAmRiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJlBBLAorICAgICAgICAgICAgICAgICAgRnVuY3Rpb25BbmFseXNpc01hbmFnZXI6OkludmFsaWRhdG9yICZJbnYpOworCitwcml2YXRlOgorICBMb29wQW5hbHlzaXNNYW5hZ2VyICpJbm5lckFNOworICBMb29wSW5mbyAqTEk7Cit9OworCisvLy8gUHJvdmlkZSBhIHNwZWNpYWxpemVkIHJ1biBtZXRob2QgZm9yIHRoZSBcYyBMb29wQW5hbHlzaXNNYW5hZ2VyRnVuY3Rpb25Qcm94eQorLy8vIHNvIGl0IGNhbiBwYXNzIHRoZSBcYyBMb29wSW5mbyB0byB0aGUgcmVzdWx0LgordGVtcGxhdGUgPD4KK0xvb3BBbmFseXNpc01hbmFnZXJGdW5jdGlvblByb3h5OjpSZXN1bHQKK0xvb3BBbmFseXNpc01hbmFnZXJGdW5jdGlvblByb3h5OjpydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7CisKKy8vIEVuc3VyZSB0aGUgXGMgTG9vcEFuYWx5c2lzTWFuYWdlckZ1bmN0aW9uUHJveHkgaXMgcHJvdmlkZWQgYXMgYW4gZXh0ZXJuCisvLyB0ZW1wbGF0ZS4KK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBJbm5lckFuYWx5c2lzTWFuYWdlclByb3h5PExvb3BBbmFseXNpc01hbmFnZXIsIEZ1bmN0aW9uPjsKKworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIE91dGVyQW5hbHlzaXNNYW5hZ2VyUHJveHk8RnVuY3Rpb25BbmFseXNpc01hbmFnZXIsIExvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgJj47CisvLy8gQSBwcm94eSBmcm9tIGEgXGMgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgdG8gYSBcYyBMb29wLgordHlwZWRlZiBPdXRlckFuYWx5c2lzTWFuYWdlclByb3h5PEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyLCBMb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmPgorICAgIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyTG9vcFByb3h5OworCisvLy8gUmV0dXJucyB0aGUgbWluaW11bSBzZXQgb2YgQW5hbHlzZXMgdGhhdCBhbGwgbG9vcCBwYXNzZXMgbXVzdCBwcmVzZXJ2ZS4KK1ByZXNlcnZlZEFuYWx5c2VzIGdldExvb3BQYXNzUHJlc2VydmVkQW5hbHlzZXMoKTsKK30KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfTE9PUEFOQUxZU0lTTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjhhZmMzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTG9vcEluZm8uaApAQCAtMCwwICsxLDk4OCBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvTG9vcEluZm8uaCAtIE5hdHVyYWwgTG9vcCBDYWxjdWxhdG9yIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgTG9vcEluZm8gY2xhc3MgdGhhdCBpcyB1c2VkIHRvIGlkZW50aWZ5IG5hdHVyYWwgbG9vcHMKKy8vIGFuZCBkZXRlcm1pbmUgdGhlIGxvb3AgZGVwdGggb2YgdmFyaW91cyBub2RlcyBvZiB0aGUgQ0ZHLiAgQSBuYXR1cmFsIGxvb3AKKy8vIGhhcyBleGFjdGx5IG9uZSBlbnRyeS1wb2ludCwgd2hpY2ggaXMgY2FsbGVkIHRoZSBoZWFkZXIuIE5vdGUgdGhhdCBuYXR1cmFsCisvLyBsb29wcyBtYXkgYWN0dWFsbHkgYmUgc2V2ZXJhbCBsb29wcyB0aGF0IHNoYXJlIHRoZSBzYW1lIGhlYWRlciBub2RlLgorLy8KKy8vIFRoaXMgYW5hbHlzaXMgY2FsY3VsYXRlcyB0aGUgbmVzdGluZyBzdHJ1Y3R1cmUgb2YgbG9vcHMgaW4gYSBmdW5jdGlvbi4gIEZvcgorLy8gZWFjaCBuYXR1cmFsIGxvb3AgaWRlbnRpZmllZCwgdGhpcyBhbmFseXNpcyBpZGVudGlmaWVzIG5hdHVyYWwgbG9vcHMKKy8vIGNvbnRhaW5lZCBlbnRpcmVseSB3aXRoaW4gdGhlIGxvb3AgYW5kIHRoZSBiYXNpYyBibG9ja3MgdGhlIG1ha2UgdXAgdGhlIGxvb3AuCisvLworLy8gSXQgY2FuIGNhbGN1bGF0ZSBvbiB0aGUgZmx5IHZhcmlvdXMgYml0cyBvZiBpbmZvcm1hdGlvbiwgZm9yIGV4YW1wbGU6CisvLworLy8gICogd2hldGhlciB0aGVyZSBpcyBhIHByZWhlYWRlciBmb3IgdGhlIGxvb3AKKy8vICAqIHRoZSBudW1iZXIgb2YgYmFjayBlZGdlcyB0byB0aGUgaGVhZGVyCisvLyAgKiB3aGV0aGVyIG9yIG5vdCBhIHBhcnRpY3VsYXIgYmxvY2sgYnJhbmNoZXMgb3V0IG9mIHRoZSBsb29wCisvLyAgKiB0aGUgc3VjY2Vzc29yIGJsb2NrcyBvZiB0aGUgbG9vcAorLy8gICogdGhlIGxvb3AgZGVwdGgKKy8vICAqIGV0Yy4uLgorLy8KKy8vIE5vdGUgdGhhdCB0aGlzIGFuYWx5c2lzIHNwZWNpZmljYWxseSBpZGVudGlmaWVzICpMb29wcyogbm90IGN5Y2xlcyBvciBTQ0NzCisvLyBpbiB0aGUgQ0ZHLiAgVGhlcmUgY2FuIGJlIHN0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnRzIGluIHRoZSBDRkcgd2hpY2gKKy8vIHRoaXMgYW5hbHlzaXMgd2lsbCBub3QgcmVjb2duaXplIGFuZCB0aGF0IHdpbGwgbm90IGJlIHJlcHJlc2VudGVkIGJ5IGEgTG9vcAorLy8gaW5zdGFuY2UuICBJbiBwYXJ0aWN1bGFyLCBhIExvb3AgbWlnaHQgYmUgaW5zaWRlIHN1Y2ggYSBub24tbG9vcCBTQ0MsIG9yIGEKKy8vIG5vbi1sb29wIFNDQyBtaWdodCBjb250YWluIGEgc3ViLVNDQyB3aGljaCBpcyBhIExvb3AuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0xPT1BJTkZPX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19MT09QSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DRkcuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBMb29wSW5mbzsKK2NsYXNzIExvb3A7CitjbGFzcyBNRE5vZGU7CitjbGFzcyBQSElOb2RlOworY2xhc3MgcmF3X29zdHJlYW07Cit0ZW1wbGF0ZSA8Y2xhc3MgTiwgYm9vbCBJc1Bvc3REb20+IGNsYXNzIERvbWluYXRvclRyZWVCYXNlOwordGVtcGxhdGUgPGNsYXNzIE4sIGNsYXNzIE0+IGNsYXNzIExvb3BJbmZvQmFzZTsKK3RlbXBsYXRlIDxjbGFzcyBOLCBjbGFzcyBNPiBjbGFzcyBMb29wQmFzZTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgdXNlZCB0byByZXByZXNlbnQgbG9vcHMgdGhhdCBhcmUgZGV0ZWN0ZWQgaW4gdGhlCisvLy8gZmxvdyBncmFwaC4KKy8vLwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+IGNsYXNzIExvb3BCYXNlIHsKKyAgTG9vcFQgKlBhcmVudExvb3A7CisgIC8vIExvb3BzIGNvbnRhaW5lZCBlbnRpcmVseSB3aXRoaW4gdGhpcyBvbmUuCisgIHN0ZDo6dmVjdG9yPExvb3BUICo+IFN1Ykxvb3BzOworCisgIC8vIFRoZSBsaXN0IG9mIGJsb2NrcyBpbiB0aGlzIGxvb3AuIEZpcnN0IGVudHJ5IGlzIHRoZSBoZWFkZXIgbm9kZS4KKyAgc3RkOjp2ZWN0b3I8QmxvY2tUICo+IEJsb2NrczsKKworICBTbWFsbFB0clNldDxjb25zdCBCbG9ja1QgKiwgOD4gRGVuc2VCbG9ja1NldDsKKworI2lmIExMVk1fRU5BQkxFX0FCSV9CUkVBS0lOR19DSEVDS1MKKyAgLy8vIEluZGljYXRvciB0aGF0IHRoaXMgbG9vcCBpcyBubyBsb25nZXIgYSB2YWxpZCBsb29wLgorICBib29sIElzSW52YWxpZCA9IGZhbHNlOworI2VuZGlmCisKKyAgTG9vcEJhc2UoY29uc3QgTG9vcEJhc2U8QmxvY2tULCBMb29wVD4gJikgPSBkZWxldGU7CisgIGNvbnN0IExvb3BCYXNlPEJsb2NrVCwgTG9vcFQ+ICYKKyAgb3BlcmF0b3I9KGNvbnN0IExvb3BCYXNlPEJsb2NrVCwgTG9vcFQ+ICYpID0gZGVsZXRlOworCitwdWJsaWM6CisgIC8vLyBSZXR1cm4gdGhlIG5lc3RpbmcgbGV2ZWwgb2YgdGhpcyBsb29wLiAgQW4gb3V0ZXItbW9zdCBsb29wIGhhcyBkZXB0aCAxLAorICAvLy8gZm9yIGNvbnNpc3RlbmN5IHdpdGggbG9vcCBkZXB0aCB2YWx1ZXMgdXNlZCBmb3IgYmFzaWMgYmxvY2tzLCB3aGVyZSBkZXB0aAorICAvLy8gMCBpcyB1c2VkIGZvciBibG9ja3Mgbm90IGluc2lkZSBhbnkgbG9vcHMuCisgIHVuc2lnbmVkIGdldExvb3BEZXB0aCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICAgIHVuc2lnbmVkIEQgPSAxOworICAgIGZvciAoY29uc3QgTG9vcFQgKkN1ckxvb3AgPSBQYXJlbnRMb29wOyBDdXJMb29wOworICAgICAgICAgQ3VyTG9vcCA9IEN1ckxvb3AtPlBhcmVudExvb3ApCisgICAgICArK0Q7CisgICAgcmV0dXJuIEQ7CisgIH0KKyAgQmxvY2tUICpnZXRIZWFkZXIoKSBjb25zdCB7IHJldHVybiBnZXRCbG9ja3MoKS5mcm9udCgpOyB9CisgIExvb3BUICpnZXRQYXJlbnRMb29wKCkgY29uc3QgeyByZXR1cm4gUGFyZW50TG9vcDsgfQorCisgIC8vLyBUaGlzIGlzIGEgcmF3IGludGVyZmFjZSBmb3IgYnlwYXNzaW5nIGFkZENoaWxkTG9vcC4KKyAgdm9pZCBzZXRQYXJlbnRMb29wKExvb3BUICpMKSB7CisgICAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyAgICBQYXJlbnRMb29wID0gTDsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGxvb3AgaXMgY29udGFpbmVkIHdpdGhpbiBpbiB0aGlzIGxvb3AuCisgIGJvb2wgY29udGFpbnMoY29uc3QgTG9vcFQgKkwpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICAgIGlmIChMID09IHRoaXMpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoIUwpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGNvbnRhaW5zKEwtPmdldFBhcmVudExvb3AoKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBiYXNpYyBibG9jayBpcyBpbiB0aGlzIGxvb3AuCisgIGJvb2wgY29udGFpbnMoY29uc3QgQmxvY2tUICpCQikgY29uc3QgeworICAgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgICAgcmV0dXJuIERlbnNlQmxvY2tTZXQuY291bnQoQkIpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gaXMgaW4gdGhpcyBsb29wLgorICB0ZW1wbGF0ZSA8Y2xhc3MgSW5zdFQ+IGJvb2wgY29udGFpbnMoY29uc3QgSW5zdFQgKkluc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gY29udGFpbnMoSW5zdC0+Z2V0UGFyZW50KCkpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgbG9vcHMgY29udGFpbmVkIGVudGlyZWx5IHdpdGhpbiB0aGlzIGxvb3AuCisgIGNvbnN0IHN0ZDo6dmVjdG9yPExvb3BUICo+ICZnZXRTdWJMb29wcygpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICAgIHJldHVybiBTdWJMb29wczsKKyAgfQorICBzdGQ6OnZlY3RvcjxMb29wVCAqPiAmZ2V0U3ViTG9vcHNWZWN0b3IoKSB7CisgICAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyAgICByZXR1cm4gU3ViTG9vcHM7CisgIH0KKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxMb29wVCAqPjo6Y29uc3RfaXRlcmF0b3IgaXRlcmF0b3I7CisgIHR5cGVkZWYKKyAgICAgIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPExvb3BUICo+Ojpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJldmVyc2VfaXRlcmF0b3I7CisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gZ2V0U3ViTG9vcHMoKS5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGdldFN1Ykxvb3BzKCkuZW5kKCk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7IHJldHVybiBnZXRTdWJMb29wcygpLnJiZWdpbigpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgcmV0dXJuIGdldFN1Ykxvb3BzKCkucmVuZCgpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBnZXRTdWJMb29wcygpLmVtcHR5KCk7IH0KKworICAvLy8gR2V0IGEgbGlzdCBvZiB0aGUgYmFzaWMgYmxvY2tzIHdoaWNoIG1ha2UgdXAgdGhpcyBsb29wLgorICBBcnJheVJlZjxCbG9ja1QgKj4gZ2V0QmxvY2tzKCkgY29uc3QgeworICAgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgICAgcmV0dXJuIEJsb2NrczsKKyAgfQorICB0eXBlZGVmIHR5cGVuYW1lIEFycmF5UmVmPEJsb2NrVCAqPjo6Y29uc3RfaXRlcmF0b3IgYmxvY2tfaXRlcmF0b3I7CisgIGJsb2NrX2l0ZXJhdG9yIGJsb2NrX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gZ2V0QmxvY2tzKCkuYmVnaW4oKTsgfQorICBibG9ja19pdGVyYXRvciBibG9ja19lbmQoKSBjb25zdCB7IHJldHVybiBnZXRCbG9ja3MoKS5lbmQoKTsgfQorICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8YmxvY2tfaXRlcmF0b3I+IGJsb2NrcygpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICAgIHJldHVybiBtYWtlX3JhbmdlKGJsb2NrX2JlZ2luKCksIGJsb2NrX2VuZCgpKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIG51bWJlciBvZiBibG9ja3MgaW4gdGhpcyBsb29wIGluIGNvbnN0YW50IHRpbWUuCisgIC8vLyBJbnZhbGlkYXRlIHRoZSBsb29wLCBpbmRpY2F0aW5nIHRoYXQgaXQgaXMgbm8gbG9uZ2VyIGEgbG9vcC4KKyAgdW5zaWduZWQgZ2V0TnVtQmxvY2tzKCkgY29uc3QgeworICAgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgICAgcmV0dXJuIEJsb2Nrcy5zaXplKCk7CisgIH0KKworICAvLy8gUmV0dXJuIGEgZGlyZWN0LCBtdXRhYmxlIGhhbmRsZSB0byB0aGUgYmxvY2tzIHZlY3RvciBzbyB0aGF0IHdlIGNhbgorICAvLy8gbXV0YXRlIGl0IGVmZmljaWVudGx5IHdpdGggdGVjaG5pcXVlcyBsaWtlIGBzdGQ6OnJlbW92ZWAuCisgIHN0ZDo6dmVjdG9yPEJsb2NrVCAqPiAmZ2V0QmxvY2tzVmVjdG9yKCkgeworICAgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgICAgcmV0dXJuIEJsb2NrczsKKyAgfQorICAvLy8gUmV0dXJuIGEgZGlyZWN0LCBtdXRhYmxlIGhhbmRsZSB0byB0aGUgYmxvY2tzIHNldCBzbyB0aGF0IHdlIGNhbgorICAvLy8gbXV0YXRlIGl0IGVmZmljaWVudGx5LgorICBTbWFsbFB0clNldEltcGw8Y29uc3QgQmxvY2tUICo+ICZnZXRCbG9ja3NTZXQoKSB7CisgICAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyAgICByZXR1cm4gRGVuc2VCbG9ja1NldDsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGxvb3AgaXMgbm8gbG9uZ2VyIHZhbGlkLiAgVGhlIG9ubHkgdmFsaWQgdXNlIG9mIHRoaXMKKyAgLy8vIGhlbHBlciBpcyAiYXNzZXJ0KEwuaXNJbnZhbGlkKCkpIiBvciBlcXVpdmFsZW50LCBzaW5jZSBJc0ludmFsaWQgaXMgc2V0IHRvCisgIC8vLyB0cnVlIGJ5IHRoZSBkZXN0cnVjdG9yLiAgSW4gb3RoZXIgd29yZHMsIGlmIHRoaXMgYWNjZXNzb3IgcmV0dXJucyB0cnVlLAorICAvLy8gdGhlIGNhbGxlciBoYXMgYWxyZWFkeSB0cmlnZ2VyZWQgVUIgYnkgY2FsbGluZyB0aGlzIGFjY2Vzc29yOyBhbmQgc28gaXQKKyAgLy8vIGNhbiBvbmx5IGJlIGNhbGxlZCBpbiBhIGNvbnRleHQgd2hlcmUgYSByZXR1cm4gdmFsdWUgb2YgdHJ1ZSBpbmRpY2F0ZXMgYQorICAvLy8gcHJvZ3JhbW1lciBlcnJvci4KKyAgYm9vbCBpc0ludmFsaWQoKSBjb25zdCB7CisjaWYgTExWTV9FTkFCTEVfQUJJX0JSRUFLSU5HX0NIRUNLUworICAgIHJldHVybiBJc0ludmFsaWQ7CisjZWxzZQorICAgIHJldHVybiBmYWxzZTsKKyNlbmRpZgorICB9CisKKyAgLy8vIFRydWUgaWYgdGVybWluYXRvciBpbiB0aGUgYmxvY2sgY2FuIGJyYW5jaCB0byBhbm90aGVyIGJsb2NrIHRoYXQgaXMKKyAgLy8vIG91dHNpZGUgb2YgdGhlIGN1cnJlbnQgbG9vcC4KKyAgYm9vbCBpc0xvb3BFeGl0aW5nKGNvbnN0IEJsb2NrVCAqQkIpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICAgIGZvciAoY29uc3QgYXV0byAmU3VjYyA6IGNoaWxkcmVuPGNvbnN0IEJsb2NrVCAqPihCQikpIHsKKyAgICAgIGlmICghY29udGFpbnMoU3VjYykpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIFxwIEJCIGlzIGEgbG9vcC1sYXRjaC4KKyAgLy8vIEEgbGF0Y2ggYmxvY2sgaXMgYSBibG9jayB0aGF0IGNvbnRhaW5zIGEgYnJhbmNoIGJhY2sgdG8gdGhlIGhlYWRlci4KKyAgLy8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGxhdGNoZXMgaW4gYSBsb29wCisgIC8vLyBiZWNhdXNlIFxmbiBnZXRMb29wTGF0Y2ggd2lsbCByZXR1cm4gbnVsbHB0ciBpbiB0aGF0IGNhc2UuCisgIGJvb2wgaXNMb29wTGF0Y2goY29uc3QgQmxvY2tUICpCQikgY29uc3QgeworICAgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgICAgYXNzZXJ0KGNvbnRhaW5zKEJCKSAmJiAiYmxvY2sgZG9lcyBub3QgYmVsb25nIHRvIHRoZSBsb29wIik7CisKKyAgICBCbG9ja1QgKkhlYWRlciA9IGdldEhlYWRlcigpOworICAgIGF1dG8gUHJlZEJlZ2luID0gR3JhcGhUcmFpdHM8SW52ZXJzZTxCbG9ja1QgKj4+OjpjaGlsZF9iZWdpbihIZWFkZXIpOworICAgIGF1dG8gUHJlZEVuZCA9IEdyYXBoVHJhaXRzPEludmVyc2U8QmxvY2tUICo+Pjo6Y2hpbGRfZW5kKEhlYWRlcik7CisgICAgcmV0dXJuIHN0ZDo6ZmluZChQcmVkQmVnaW4sIFByZWRFbmQsIEJCKSAhPSBQcmVkRW5kOworICB9CisKKyAgLy8vIENhbGN1bGF0ZSB0aGUgbnVtYmVyIG9mIGJhY2sgZWRnZXMgdG8gdGhlIGxvb3AgaGVhZGVyLgorICB1bnNpZ25lZCBnZXROdW1CYWNrRWRnZXMoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyAgICB1bnNpZ25lZCBOdW1CYWNrRWRnZXMgPSAwOworICAgIEJsb2NrVCAqSCA9IGdldEhlYWRlcigpOworCisgICAgZm9yIChjb25zdCBhdXRvIFByZWQgOiBjaGlsZHJlbjxJbnZlcnNlPEJsb2NrVCAqPj4oSCkpCisgICAgICBpZiAoY29udGFpbnMoUHJlZCkpCisgICAgICAgICsrTnVtQmFja0VkZ2VzOworCisgICAgcmV0dXJuIE51bUJhY2tFZGdlczsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBBUElzIGZvciBzaW1wbGUgYW5hbHlzaXMgb2YgdGhlIGxvb3AuCisgIC8vCisgIC8vIE5vdGUgdGhhdCBhbGwgb2YgdGhlc2UgbWV0aG9kcyBjYW4gZmFpbCBvbiBnZW5lcmFsIGxvb3BzIChpZSwgdGhlcmUgbWF5IG5vdAorICAvLyBiZSBhIHByZWhlYWRlciwgZXRjKS4gIEZvciBiZXN0IHN1Y2Nlc3MsIHRoZSBsb29wIHNpbXBsaWZpY2F0aW9uIGFuZAorICAvLyBpbmR1Y3Rpb24gdmFyaWFibGUgY2Fub25pY2FsaXphdGlvbiBwYXNzIHNob3VsZCBiZSB1c2VkIHRvIG5vcm1hbGl6ZSBsb29wcworICAvLyBmb3IgZWFzeSBhbmFseXNpcy4gIFRoZXNlIG1ldGhvZHMgYXNzdW1lIGNhbm9uaWNhbCBsb29wcy4KKworICAvLy8gUmV0dXJuIGFsbCBibG9ja3MgaW5zaWRlIHRoZSBsb29wIHRoYXQgaGF2ZSBzdWNjZXNzb3JzIG91dHNpZGUgb2YgdGhlCisgIC8vLyBsb29wLiBUaGVzZSBhcmUgdGhlIGJsb2NrcyBfaW5zaWRlIG9mIHRoZSBjdXJyZW50IGxvb3BfIHdoaWNoIGJyYW5jaCBvdXQuCisgIC8vLyBUaGUgcmV0dXJuZWQgbGlzdCBpcyBhbHdheXMgdW5pcXVlLgorICB2b2lkIGdldEV4aXRpbmdCbG9ja3MoU21hbGxWZWN0b3JJbXBsPEJsb2NrVCAqPiAmRXhpdGluZ0Jsb2NrcykgY29uc3Q7CisKKyAgLy8vIElmIGdldEV4aXRpbmdCbG9ja3Mgd291bGQgcmV0dXJuIGV4YWN0bHkgb25lIGJsb2NrLCByZXR1cm4gdGhhdCBibG9jay4KKyAgLy8vIE90aGVyd2lzZSByZXR1cm4gbnVsbC4KKyAgQmxvY2tUICpnZXRFeGl0aW5nQmxvY2soKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGFsbCBvZiB0aGUgc3VjY2Vzc29yIGJsb2NrcyBvZiB0aGlzIGxvb3AuIFRoZXNlIGFyZSB0aGUgYmxvY2tzCisgIC8vLyBfb3V0c2lkZSBvZiB0aGUgY3VycmVudCBsb29wXyB3aGljaCBhcmUgYnJhbmNoZWQgdG8uCisgIHZvaWQgZ2V0RXhpdEJsb2NrcyhTbWFsbFZlY3RvckltcGw8QmxvY2tUICo+ICZFeGl0QmxvY2tzKSBjb25zdDsKKworICAvLy8gSWYgZ2V0RXhpdEJsb2NrcyB3b3VsZCByZXR1cm4gZXhhY3RseSBvbmUgYmxvY2ssIHJldHVybiB0aGF0IGJsb2NrLgorICAvLy8gT3RoZXJ3aXNlIHJldHVybiBudWxsLgorICBCbG9ja1QgKmdldEV4aXRCbG9jaygpIGNvbnN0OworCisgIC8vLyBFZGdlIHR5cGUuCisgIHR5cGVkZWYgc3RkOjpwYWlyPGNvbnN0IEJsb2NrVCAqLCBjb25zdCBCbG9ja1QgKj4gRWRnZTsKKworICAvLy8gUmV0dXJuIGFsbCBwYWlycyBvZiAoX2luc2lkZV9ibG9ja18sX291dHNpZGVfYmxvY2tfKS4KKyAgdm9pZCBnZXRFeGl0RWRnZXMoU21hbGxWZWN0b3JJbXBsPEVkZ2U+ICZFeGl0RWRnZXMpIGNvbnN0OworCisgIC8vLyBJZiB0aGVyZSBpcyBhIHByZWhlYWRlciBmb3IgdGhpcyBsb29wLCByZXR1cm4gaXQuIEEgbG9vcCBoYXMgYSBwcmVoZWFkZXIKKyAgLy8vIGlmIHRoZXJlIGlzIG9ubHkgb25lIGVkZ2UgdG8gdGhlIGhlYWRlciBvZiB0aGUgbG9vcCBmcm9tIG91dHNpZGUgb2YgdGhlCisgIC8vLyBsb29wLiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGUgYmxvY2sgYnJhbmNoaW5nIHRvIHRoZSBoZWFkZXIgb2YgdGhlIGxvb3AKKyAgLy8vIGlzIHRoZSBwcmVoZWFkZXIgbm9kZS4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCByZXR1cm5zIG51bGwgaWYgdGhlcmUgaXMgbm8gcHJlaGVhZGVyIGZvciB0aGUgbG9vcC4KKyAgQmxvY2tUICpnZXRMb29wUHJlaGVhZGVyKCkgY29uc3Q7CisKKyAgLy8vIElmIHRoZSBnaXZlbiBsb29wJ3MgaGVhZGVyIGhhcyBleGFjdGx5IG9uZSB1bmlxdWUgcHJlZGVjZXNzb3Igb3V0c2lkZSB0aGUKKyAgLy8vIGxvb3AsIHJldHVybiBpdC4gT3RoZXJ3aXNlIHJldHVybiBudWxsLgorICAvLy8gIFRoaXMgaXMgbGVzcyBzdHJpY3QgdGhhdCB0aGUgbG9vcCAicHJlaGVhZGVyIiBjb25jZXB0LCB3aGljaCByZXF1aXJlcworICAvLy8gdGhlIHByZWRlY2Vzc29yIHRvIGhhdmUgZXhhY3RseSBvbmUgc3VjY2Vzc29yLgorICBCbG9ja1QgKmdldExvb3BQcmVkZWNlc3NvcigpIGNvbnN0OworCisgIC8vLyBJZiB0aGVyZSBpcyBhIHNpbmdsZSBsYXRjaCBibG9jayBmb3IgdGhpcyBsb29wLCByZXR1cm4gaXQuCisgIC8vLyBBIGxhdGNoIGJsb2NrIGlzIGEgYmxvY2sgdGhhdCBjb250YWlucyBhIGJyYW5jaCBiYWNrIHRvIHRoZSBoZWFkZXIuCisgIEJsb2NrVCAqZ2V0TG9vcExhdGNoKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiBhbGwgbG9vcCBsYXRjaCBibG9ja3Mgb2YgdGhpcyBsb29wLiBBIGxhdGNoIGJsb2NrIGlzIGEgYmxvY2sgdGhhdAorICAvLy8gY29udGFpbnMgYSBicmFuY2ggYmFjayB0byB0aGUgaGVhZGVyLgorICB2b2lkIGdldExvb3BMYXRjaGVzKFNtYWxsVmVjdG9ySW1wbDxCbG9ja1QgKj4gJkxvb3BMYXRjaGVzKSBjb25zdCB7CisgICAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyAgICBCbG9ja1QgKkggPSBnZXRIZWFkZXIoKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gUHJlZCA6IGNoaWxkcmVuPEludmVyc2U8QmxvY2tUICo+PihIKSkKKyAgICAgIGlmIChjb250YWlucyhQcmVkKSkKKyAgICAgICAgTG9vcExhdGNoZXMucHVzaF9iYWNrKFByZWQpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEFQSXMgZm9yIHVwZGF0aW5nIGxvb3AgaW5mb3JtYXRpb24gYWZ0ZXIgY2hhbmdpbmcgdGhlIENGRworICAvLworCisgIC8vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IG90aGVyIGFuYWx5c2VzIHRvIHVwZGF0ZSBsb29wIGluZm9ybWF0aW9uLgorICAvLy8gTmV3QkIgaXMgc2V0IHRvIGJlIGEgbmV3IG1lbWJlciBvZiB0aGUgY3VycmVudCBsb29wLgorICAvLy8gQmVjYXVzZSBvZiB0aGlzLCBpdCBpcyBhZGRlZCBhcyBhIG1lbWJlciBvZiBhbGwgcGFyZW50IGxvb3BzLCBhbmQgaXMgYWRkZWQKKyAgLy8vIHRvIHRoZSBzcGVjaWZpZWQgTG9vcEluZm8gb2JqZWN0IGFzIGJlaW5nIGluIHRoZSBjdXJyZW50IGJhc2ljIGJsb2NrLiAgSXQKKyAgLy8vIGlzIG5vdCB2YWxpZCB0byByZXBsYWNlIHRoZSBsb29wIGhlYWRlciB3aXRoIHRoaXMgbWV0aG9kLgorICB2b2lkIGFkZEJhc2ljQmxvY2tUb0xvb3AoQmxvY2tUICpOZXdCQiwgTG9vcEluZm9CYXNlPEJsb2NrVCwgTG9vcFQ+ICZMSSk7CisKKyAgLy8vIFRoaXMgaXMgdXNlZCB3aGVuIHNwbGl0dGluZyBsb29wcyB1cC4gSXQgcmVwbGFjZXMgdGhlIE9sZENoaWxkIGVudHJ5IGluCisgIC8vLyBvdXIgY2hpbGRyZW4gbGlzdCB3aXRoIE5ld0NoaWxkLCBhbmQgdXBkYXRlcyB0aGUgcGFyZW50IHBvaW50ZXIgb2YKKyAgLy8vIE9sZENoaWxkIHRvIGJlIG51bGwgYW5kIHRoZSBOZXdDaGlsZCB0byBiZSB0aGlzIGxvb3AuCisgIC8vLyBUaGlzIHVwZGF0ZXMgdGhlIGxvb3AgZGVwdGggb2YgdGhlIG5ldyBjaGlsZC4KKyAgdm9pZCByZXBsYWNlQ2hpbGRMb29wV2l0aChMb29wVCAqT2xkQ2hpbGQsIExvb3BUICpOZXdDaGlsZCk7CisKKyAgLy8vIEFkZCB0aGUgc3BlY2lmaWVkIGxvb3AgdG8gYmUgYSBjaGlsZCBvZiB0aGlzIGxvb3AuCisgIC8vLyBUaGlzIHVwZGF0ZXMgdGhlIGxvb3AgZGVwdGggb2YgdGhlIG5ldyBjaGlsZC4KKyAgdm9pZCBhZGRDaGlsZExvb3AoTG9vcFQgKk5ld0NoaWxkKSB7CisgICAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyAgICBhc3NlcnQoIU5ld0NoaWxkLT5QYXJlbnRMb29wICYmICJOZXdDaGlsZCBhbHJlYWR5IGhhcyBhIHBhcmVudCEiKTsKKyAgICBOZXdDaGlsZC0+UGFyZW50TG9vcCA9IHN0YXRpY19jYXN0PExvb3BUICo+KHRoaXMpOworICAgIFN1Ykxvb3BzLnB1c2hfYmFjayhOZXdDaGlsZCk7CisgIH0KKworICAvLy8gVGhpcyByZW1vdmVzIHRoZSBzcGVjaWZpZWQgY2hpbGQgZnJvbSBiZWluZyBhIHN1Ymxvb3Agb2YgdGhpcyBsb29wLiBUaGUKKyAgLy8vIGxvb3AgaXMgbm90IGRlbGV0ZWQsIGFzIGl0IHdpbGwgcHJlc3VtYWJseSBiZSBpbnNlcnRlZCBpbnRvIGFub3RoZXIgbG9vcC4KKyAgTG9vcFQgKnJlbW92ZUNoaWxkTG9vcChpdGVyYXRvciBJKSB7CisgICAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyAgICBhc3NlcnQoSSAhPSBTdWJMb29wcy5lbmQoKSAmJiAiQ2Fubm90IHJlbW92ZSBlbmQgaXRlcmF0b3IhIik7CisgICAgTG9vcFQgKkNoaWxkID0gKkk7CisgICAgYXNzZXJ0KENoaWxkLT5QYXJlbnRMb29wID09IHRoaXMgJiYgIkNoaWxkIGlzIG5vdCBhIGNoaWxkIG9mIHRoaXMgbG9vcCEiKTsKKyAgICBTdWJMb29wcy5lcmFzZShTdWJMb29wcy5iZWdpbigpICsgKEkgLSBiZWdpbigpKSk7CisgICAgQ2hpbGQtPlBhcmVudExvb3AgPSBudWxscHRyOworICAgIHJldHVybiBDaGlsZDsKKyAgfQorCisgIC8vLyBUaGlzIHJlbW92ZXMgdGhlIHNwZWNpZmllZCBjaGlsZCBmcm9tIGJlaW5nIGEgc3VibG9vcCBvZiB0aGlzIGxvb3AuIFRoZQorICAvLy8gbG9vcCBpcyBub3QgZGVsZXRlZCwgYXMgaXQgd2lsbCBwcmVzdW1hYmx5IGJlIGluc2VydGVkIGludG8gYW5vdGhlciBsb29wLgorICBMb29wVCAqcmVtb3ZlQ2hpbGRMb29wKExvb3BUICpDaGlsZCkgeworICAgIHJldHVybiByZW1vdmVDaGlsZExvb3AobGx2bTo6ZmluZCgqdGhpcywgQ2hpbGQpKTsKKyAgfQorCisgIC8vLyBUaGlzIGFkZHMgYSBiYXNpYyBibG9jayBkaXJlY3RseSB0byB0aGUgYmFzaWMgYmxvY2sgbGlzdC4KKyAgLy8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBjcmVhdGUgbmV3IGxvb3BzLiAgT3RoZXIKKyAgLy8vIHRyYW5zZm9ybWF0aW9ucyBzaG91bGQgdXNlIGFkZEJhc2ljQmxvY2tUb0xvb3AuCisgIHZvaWQgYWRkQmxvY2tFbnRyeShCbG9ja1QgKkJCKSB7CisgICAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyAgICBCbG9ja3MucHVzaF9iYWNrKEJCKTsKKyAgICBEZW5zZUJsb2NrU2V0Lmluc2VydChCQik7CisgIH0KKworICAvLy8gaW50ZXJmYWNlIHRvIHJldmVyc2UgQmxvY2tzW2Zyb20sIGVuZCBvZiBsb29wXSBpbiB0aGlzIGxvb3AKKyAgdm9pZCByZXZlcnNlQmxvY2sodW5zaWduZWQgZnJvbSkgeworICAgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgICAgc3RkOjpyZXZlcnNlKEJsb2Nrcy5iZWdpbigpICsgZnJvbSwgQmxvY2tzLmVuZCgpKTsKKyAgfQorCisgIC8vLyBpbnRlcmZhY2UgdG8gZG8gcmVzZXJ2ZSgpIGZvciBCbG9ja3MKKyAgdm9pZCByZXNlcnZlQmxvY2tzKHVuc2lnbmVkIHNpemUpIHsKKyAgICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICAgIEJsb2Nrcy5yZXNlcnZlKHNpemUpOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gbW92ZSBCQiAod2hpY2ggbXVzdCBiZSBwYXJ0IG9mIHRoaXMgbG9vcCkgdG8gYmUgdGhlCisgIC8vLyBsb29wIGhlYWRlciBvZiB0aGUgbG9vcCAodGhlIGJsb2NrIHRoYXQgZG9taW5hdGVzIGFsbCBvdGhlcnMpLgorICB2b2lkIG1vdmVUb0hlYWRlcihCbG9ja1QgKkJCKSB7CisgICAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyAgICBpZiAoQmxvY2tzWzBdID09IEJCKQorICAgICAgcmV0dXJuOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7OyArK2kpIHsKKyAgICAgIGFzc2VydChpICE9IEJsb2Nrcy5zaXplKCkgJiYgIkxvb3AgZG9lcyBub3QgY29udGFpbiBCQiEiKTsKKyAgICAgIGlmIChCbG9ja3NbaV0gPT0gQkIpIHsKKyAgICAgICAgQmxvY2tzW2ldID0gQmxvY2tzWzBdOworICAgICAgICBCbG9ja3NbMF0gPSBCQjsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vLyBUaGlzIHJlbW92ZXMgdGhlIHNwZWNpZmllZCBiYXNpYyBibG9jayBmcm9tIHRoZSBjdXJyZW50IGxvb3AsIHVwZGF0aW5nIHRoZQorICAvLy8gQmxvY2tzIGFzIGFwcHJvcHJpYXRlLiBUaGlzIGRvZXMgbm90IHVwZGF0ZSB0aGUgbWFwcGluZyBpbiB0aGUgTG9vcEluZm8KKyAgLy8vIGNsYXNzLgorICB2b2lkIHJlbW92ZUJsb2NrRnJvbUxvb3AoQmxvY2tUICpCQikgeworICAgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgICAgYXV0byBJID0gZmluZChCbG9ja3MsIEJCKTsKKyAgICBhc3NlcnQoSSAhPSBCbG9ja3MuZW5kKCkgJiYgIk4gaXMgbm90IGluIHRoaXMgbGlzdCEiKTsKKyAgICBCbG9ja3MuZXJhc2UoSSk7CisKKyAgICBEZW5zZUJsb2NrU2V0LmVyYXNlKEJCKTsKKyAgfQorCisgIC8vLyBWZXJpZnkgbG9vcCBzdHJ1Y3R1cmUKKyAgdm9pZCB2ZXJpZnlMb29wKCkgY29uc3Q7CisKKyAgLy8vIFZlcmlmeSBsb29wIHN0cnVjdHVyZSBvZiB0aGlzIGxvb3AgYW5kIGFsbCBuZXN0ZWQgbG9vcHMuCisgIHZvaWQgdmVyaWZ5TG9vcE5lc3QoRGVuc2VTZXQ8Y29uc3QgTG9vcFQgKj4gKkxvb3BzKSBjb25zdDsKKworICAvLy8gUHJpbnQgbG9vcCB3aXRoIGFsbCB0aGUgQkJzIGluc2lkZSBpdC4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIERlcHRoID0gMCwgYm9vbCBWZXJib3NlID0gZmFsc2UpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBMb29wSW5mb0Jhc2U8QmxvY2tULCBMb29wVD47CisKKyAgLy8vIFRoaXMgY3JlYXRlcyBhbiBlbXB0eSBsb29wLgorICBMb29wQmFzZSgpIDogUGFyZW50TG9vcChudWxscHRyKSB7fQorCisgIGV4cGxpY2l0IExvb3BCYXNlKEJsb2NrVCAqQkIpIDogUGFyZW50TG9vcChudWxscHRyKSB7CisgICAgQmxvY2tzLnB1c2hfYmFjayhCQik7CisgICAgRGVuc2VCbG9ja1NldC5pbnNlcnQoQkIpOworICB9CisKKyAgLy8gU2luY2UgbG9vcCBwYXNzZXMgbGlrZSBTQ0VWIGFyZSBhbGxvd2VkIHRvIGtleSBhbmFseXNpcyByZXN1bHRzIG9mZiBvZgorICAvLyBgTG9vcGAgcG9pbnRlcnMsIHdlIGNhbm5vdCByZS11c2UgcG9pbnRlcnMgd2l0aGluIGEgbG9vcCBwYXNzIG1hbmFnZXIuCisgIC8vIFRoaXMgbWVhbnMgbG9vcCBwYXNzZXMgc2hvdWxkIG5vdCBiZSBgZGVsZXRlYCBpbmcgYExvb3BgIG9iamVjdHMgZGlyZWN0bHkKKyAgLy8gKGFuZCByaXNrIGEgbGF0ZXIgYExvb3BgIGFsbG9jYXRpb24gcmUtdXNpbmcgdGhlIGFkZHJlc3Mgb2YgYSBwcmV2aW91cyBvbmUpCisgIC8vIGJ1dCBzaG91bGQgYmUgdXNpbmcgTG9vcEluZm86Om1hcmtBc1JlbW92ZWQsIHdoaWNoIGtlZXBzIGFyb3VuZCB0aGUgYExvb3BgCisgIC8vIHBvaW50ZXIgdGlsbCB0aGUgZW5kIG9mIHRoZSBsaWZldGltZSBvZiB0aGUgYExvb3BJbmZvYCBvYmplY3QuCisgIC8vCisgIC8vIFRvIG1ha2UgaXQgZWFzaWVyIHRvIGZvbGxvdyB0aGlzIHJ1bGUsIHdlIG1hcmsgdGhlIGRlc3RydWN0b3IgYXMKKyAgLy8gbm9uLXB1YmxpYy4KKyAgfkxvb3BCYXNlKCkgeworICAgIGZvciAoYXV0byAqU3ViTG9vcCA6IFN1Ykxvb3BzKQorICAgICAgU3ViTG9vcC0+fkxvb3BUKCk7CisKKyNpZiBMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTCisgICAgSXNJbnZhbGlkID0gdHJ1ZTsKKyNlbmRpZgorICAgIFN1Ykxvb3BzLmNsZWFyKCk7CisgICAgQmxvY2tzLmNsZWFyKCk7CisgICAgRGVuc2VCbG9ja1NldC5jbGVhcigpOworICAgIFBhcmVudExvb3AgPSBudWxscHRyOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBjbGFzcyBMb29wVD4KK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTG9vcEJhc2U8QmxvY2tULCBMb29wVD4gJkxvb3ApIHsKKyAgTG9vcC5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKworLy8gSW1wbGVtZW50YXRpb24gaW4gTG9vcEluZm9JbXBsLmgKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBMb29wQmFzZTxCYXNpY0Jsb2NrLCBMb29wPjsKKworLy8vIFJlcHJlc2VudHMgYSBzaW5nbGUgbG9vcCBpbiB0aGUgY29udHJvbCBmbG93IGdyYXBoLiAgTm90ZSB0aGF0IG5vdCBhbGwgU0NDcworLy8vIGluIHRoZSBDRkcgYXJlIG5lY2Vzc2FyaWx5IGxvb3BzLgorY2xhc3MgTG9vcCA6IHB1YmxpYyBMb29wQmFzZTxCYXNpY0Jsb2NrLCBMb29wPiB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQSByYW5nZSByZXByZXNlbnRpbmcgdGhlIHN0YXJ0IGFuZCBlbmQgbG9jYXRpb24gb2YgYSBsb29wLgorICBjbGFzcyBMb2NSYW5nZSB7CisgICAgRGVidWdMb2MgU3RhcnQ7CisgICAgRGVidWdMb2MgRW5kOworCisgIHB1YmxpYzoKKyAgICBMb2NSYW5nZSgpIHt9CisgICAgTG9jUmFuZ2UoRGVidWdMb2MgU3RhcnQpIDogU3RhcnQoc3RkOjptb3ZlKFN0YXJ0KSksIEVuZChzdGQ6Om1vdmUoU3RhcnQpKSB7fQorICAgIExvY1JhbmdlKERlYnVnTG9jIFN0YXJ0LCBEZWJ1Z0xvYyBFbmQpCisgICAgICAgIDogU3RhcnQoc3RkOjptb3ZlKFN0YXJ0KSksIEVuZChzdGQ6Om1vdmUoRW5kKSkge30KKworICAgIGNvbnN0IERlYnVnTG9jICZnZXRTdGFydCgpIGNvbnN0IHsgcmV0dXJuIFN0YXJ0OyB9CisgICAgY29uc3QgRGVidWdMb2MgJmdldEVuZCgpIGNvbnN0IHsgcmV0dXJuIEVuZDsgfQorCisgICAgLy8vIFxicmllZiBDaGVjayBmb3IgbnVsbC4KKyAgICAvLy8KKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gU3RhcnQgJiYgRW5kOyB9CisgIH07CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgbG9vcCBpbnZhcmlhbnQuCisgIGJvb2wgaXNMb29wSW52YXJpYW50KGNvbnN0IFZhbHVlICpWKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgYWxsIHRoZSBvcGVyYW5kcyBvZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIGFyZSBsb29wCisgIC8vLyBpbnZhcmlhbnQuCisgIGJvb2wgaGFzTG9vcEludmFyaWFudE9wZXJhbmRzKGNvbnN0IEluc3RydWN0aW9uICpJKSBjb25zdDsKKworICAvLy8gSWYgdGhlIGdpdmVuIHZhbHVlIGlzIGFuIGluc3RydWN0aW9uIGluc2lkZSBvZiB0aGUgbG9vcCBhbmQgaXQgY2FuIGJlCisgIC8vLyBob2lzdGVkLCBkbyBzbyB0byBtYWtlIGl0IHRyaXZpYWxseSBsb29wLWludmFyaWFudC4KKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBhZnRlciBhbnkgaG9pc3RpbmcgaXMgbG9vcCBpbnZhcmlhbnQuIFRoaXMKKyAgLy8vIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGFzIGEgc2xpZ2h0bHkgbW9yZSBhZ2dyZXNzaXZlIHJlcGxhY2VtZW50IGZvcgorICAvLy8gaXNMb29wSW52YXJpYW50LgorICAvLy8KKyAgLy8vIElmIEluc2VydFB0IGlzIHNwZWNpZmllZCwgaXQgaXMgdGhlIHBvaW50IHRvIGhvaXN0IGluc3RydWN0aW9ucyB0by4KKyAgLy8vIElmIG51bGwsIHRoZSB0ZXJtaW5hdG9yIG9mIHRoZSBsb29wIHByZWhlYWRlciBpcyB1c2VkLgorICBib29sIG1ha2VMb29wSW52YXJpYW50KFZhbHVlICpWLCBib29sICZDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRQdCA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBJZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gaXMgaW5zaWRlIG9mIHRoZSBsb29wIGFuZCBpdCBjYW4gYmUgaG9pc3RlZCwgZG8KKyAgLy8vIHNvIHRvIG1ha2UgaXQgdHJpdmlhbGx5IGxvb3AtaW52YXJpYW50LgorICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGFmdGVyIGFueSBob2lzdGluZyBpcyBsb29wIGludmFyaWFudC4gVGhpcworICAvLy8gZnVuY3Rpb24gY2FuIGJlIHVzZWQgYXMgYSBzbGlnaHRseSBtb3JlIGFnZ3Jlc3NpdmUgcmVwbGFjZW1lbnQgZm9yCisgIC8vLyBpc0xvb3BJbnZhcmlhbnQuCisgIC8vLworICAvLy8gSWYgSW5zZXJ0UHQgaXMgc3BlY2lmaWVkLCBpdCBpcyB0aGUgcG9pbnQgdG8gaG9pc3QgaW5zdHJ1Y3Rpb25zIHRvLgorICAvLy8gSWYgbnVsbCwgdGhlIHRlcm1pbmF0b3Igb2YgdGhlIGxvb3AgcHJlaGVhZGVyIGlzIHVzZWQuCisgIC8vLworICBib29sIG1ha2VMb29wSW52YXJpYW50KEluc3RydWN0aW9uICpJLCBib29sICZDaGFuZ2VkLAorICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRQdCA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBDaGVjayB0byBzZWUgaWYgdGhlIGxvb3AgaGFzIGEgY2Fub25pY2FsIGluZHVjdGlvbiB2YXJpYWJsZTogYW4gaW50ZWdlcgorICAvLy8gcmVjdXJyZW5jZSB0aGF0IHN0YXJ0cyBhdCAwIGFuZCBpbmNyZW1lbnRzIGJ5IG9uZSBlYWNoIHRpbWUgdGhyb3VnaCB0aGUKKyAgLy8vIGxvb3AuIElmIHNvLCByZXR1cm4gdGhlIHBoaSBub2RlIHRoYXQgY29ycmVzcG9uZHMgdG8gaXQuCisgIC8vLworICAvLy8gVGhlIEluZFZhclNpbXBsaWZ5IHBhc3MgdHJhbnNmb3JtcyBsb29wcyB0byBoYXZlIGEgY2Fub25pY2FsIGluZHVjdGlvbgorICAvLy8gdmFyaWFibGUuCisgIC8vLworICBQSElOb2RlICpnZXRDYW5vbmljYWxJbmR1Y3Rpb25WYXJpYWJsZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgTG9vcCBpcyBpbiBMQ1NTQSBmb3JtLgorICBib29sIGlzTENTU0FGb3JtKERvbWluYXRvclRyZWUgJkRUKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBMb29wIGFuZCBhbGwgaW5uZXIgc3VibG9vcHMgYXJlIGluIExDU1NBIGZvcm0uCisgIGJvb2wgaXNSZWN1cnNpdmVseUxDU1NBRm9ybShEb21pbmF0b3JUcmVlICZEVCwgY29uc3QgTG9vcEluZm8gJkxJKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIExvb3AgaXMgaW4gdGhlIGZvcm0gdGhhdCB0aGUgTG9vcFNpbXBsaWZ5IGZvcm0KKyAgLy8vIHRyYW5zZm9ybXMgbG9vcHMgdG8sIHdoaWNoIGlzIHNvbWV0aW1lcyBjYWxsZWQgbm9ybWFsIGZvcm0uCisgIGJvb2wgaXNMb29wU2ltcGxpZnlGb3JtKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBsb29wIGJvZHkgaXMgc2FmZSB0byBjbG9uZSBpbiBwcmFjdGljZS4KKyAgYm9vbCBpc1NhZmVUb0Nsb25lKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbG9vcCBpcyBhbm5vdGF0ZWQgcGFyYWxsZWwuCisgIC8vLworICAvLy8gQSBwYXJhbGxlbCBsb29wIGNhbiBiZSBhc3N1bWVkIHRvIG5vdCBjb250YWluIGFueSBkZXBlbmRlbmNpZXMgYmV0d2VlbgorICAvLy8gaXRlcmF0aW9ucyBieSB0aGUgY29tcGlsZXIuIFRoYXQgaXMsIGFueSBsb29wLWNhcnJpZWQgZGVwZW5kZW5jeSBjaGVja2luZworICAvLy8gY2FuIGJlIHNraXBwZWQgY29tcGxldGVseSB3aGVuIHBhcmFsbGVsaXppbmcgdGhlIGxvb3Agb24gdGhlIHRhcmdldAorICAvLy8gbWFjaGluZS4gVGh1cywgaWYgdGhlIHBhcmFsbGVsIGxvb3AgaW5mb3JtYXRpb24gb3JpZ2luYXRlcyBmcm9tIHRoZQorICAvLy8gcHJvZ3JhbW1lciwgZS5nLiB2aWEgdGhlIE9wZW5NUCBwYXJhbGxlbCBmb3IgcHJhZ21hLCBpdCBpcyB0aGUKKyAgLy8vIHByb2dyYW1tZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhlcmUgYXJlIG5vIGxvb3AtY2FycmllZAorICAvLy8gZGVwZW5kZW5jaWVzLiBUaGUgZmluYWwgZXhlY3V0aW9uIG9yZGVyIG9mIHRoZSBpbnN0cnVjdGlvbnMgYWNyb3NzCisgIC8vLyBpdGVyYXRpb25zIGlzIG5vdCBndWFyYW50ZWVkLCB0aHVzLCB0aGUgZW5kIHJlc3VsdCBtaWdodCBvciBtaWdodCBub3QKKyAgLy8vIGltcGxlbWVudCBhY3R1YWwgY29uY3VycmVudCBleGVjdXRpb24gb2YgaW5zdHJ1Y3Rpb25zIGFjcm9zcyBtdWx0aXBsZQorICAvLy8gaXRlcmF0aW9ucy4KKyAgYm9vbCBpc0Fubm90YXRlZFBhcmFsbGVsKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgbGx2bS5sb29wIGxvb3AgaWQgbWV0YWRhdGEgbm9kZSBmb3IgdGhpcyBsb29wIGlmIGl0IGlzIHByZXNlbnQuCisgIC8vLworICAvLy8gSWYgdGhpcyBsb29wIGNvbnRhaW5zIHRoZSBzYW1lIGxsdm0ubG9vcCBtZXRhZGF0YSBvbiBlYWNoIGJyYW5jaCB0byB0aGUKKyAgLy8vIGhlYWRlciB0aGVuIHRoZSBub2RlIGlzIHJldHVybmVkLiBJZiBhbnkgbGF0Y2ggaW5zdHJ1Y3Rpb24gZG9lcyBub3QKKyAgLy8vIGNvbnRhaW4gbGx2bS5sb29wIG9yIG9yIGlmIG11bHRpcGxlIGxhdGNoZXMgY29udGFpbiBkaWZmZXJlbnQgbm9kZXMgdGhlbgorICAvLy8gMCBpcyByZXR1cm5lZC4KKyAgTUROb2RlICpnZXRMb29wSUQoKSBjb25zdDsKKyAgLy8vIFNldCB0aGUgbGx2bS5sb29wIGxvb3AgaWQgbWV0YWRhdGEgZm9yIHRoaXMgbG9vcC4KKyAgLy8vCisgIC8vLyBUaGUgTG9vcElEIG1ldGFkYXRhIG5vZGUgd2lsbCBiZSBhZGRlZCB0byBlYWNoIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb24gaW4KKyAgLy8vIHRoZSBsb29wIHRoYXQgYnJhbmNoZXMgdG8gdGhlIGxvb3AgaGVhZGVyLgorICAvLy8KKyAgLy8vIFRoZSBMb29wSUQgbWV0YWRhdGEgbm9kZSBzaG91bGQgaGF2ZSBvbmUgb3IgbW9yZSBvcGVyYW5kcyBhbmQgdGhlIGZpcnN0CisgIC8vLyBvcGVyYW5kIHNob3VsZCBiZSB0aGUgbm9kZSBpdHNlbGYuCisgIHZvaWQgc2V0TG9vcElEKE1ETm9kZSAqTG9vcElEKSBjb25zdDsKKworICAvLy8gQWRkIGxsdm0ubG9vcC51bnJvbGwuZGlzYWJsZSB0byB0aGlzIGxvb3AncyBsb29wIGlkIG1ldGFkYXRhLgorICAvLy8KKyAgLy8vIFJlbW92ZSBleGlzdGluZyB1bnJvbGwgbWV0YWRhdGEgYW5kIGFkZCB1bnJvbGwgZGlzYWJsZSBtZXRhZGF0YSB0bworICAvLy8gaW5kaWNhdGUgdGhlIGxvb3AgaGFzIGFscmVhZHkgYmVlbiB1bnJvbGxlZC4gIFRoaXMgcHJldmVudHMgYSBsb29wCisgIC8vLyBmcm9tIGJlaW5nIHVucm9sbGVkIG1vcmUgdGhhbiBpcyBkaXJlY3RlZCBieSBhIHByYWdtYSBpZiB0aGUgbG9vcAorICAvLy8gdW5yb2xsaW5nIHBhc3MgaXMgcnVuIG1vcmUgdGhhbiBvbmNlICh3aGljaCBpdCBnZW5lcmFsbHkgaXMpLgorICB2b2lkIHNldExvb3BBbHJlYWR5VW5yb2xsZWQoKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgbm8gZXhpdCBibG9jayBmb3IgdGhlIGxvb3AgaGFzIGEgcHJlZGVjZXNzb3IgdGhhdCBpcworICAvLy8gb3V0c2lkZSB0aGUgbG9vcC4KKyAgYm9vbCBoYXNEZWRpY2F0ZWRFeGl0cygpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYWxsIHVuaXF1ZSBzdWNjZXNzb3IgYmxvY2tzIG9mIHRoaXMgbG9vcC4KKyAgLy8vIFRoZXNlIGFyZSB0aGUgYmxvY2tzIF9vdXRzaWRlIG9mIHRoZSBjdXJyZW50IGxvb3BfIHdoaWNoIGFyZSBicmFuY2hlZCB0by4KKyAgLy8vIFRoaXMgYXNzdW1lcyB0aGF0IGxvb3AgZXhpdHMgYXJlIGluIGNhbm9uaWNhbCBmb3JtLCBpLmUuIGFsbCBleGl0cyBhcmUKKyAgLy8vIGRlZGljYXRlZCBleGl0cy4KKyAgdm9pZCBnZXRVbmlxdWVFeGl0QmxvY2tzKFNtYWxsVmVjdG9ySW1wbDxCYXNpY0Jsb2NrICo+ICZFeGl0QmxvY2tzKSBjb25zdDsKKworICAvLy8gSWYgZ2V0VW5pcXVlRXhpdEJsb2NrcyB3b3VsZCByZXR1cm4gZXhhY3RseSBvbmUgYmxvY2ssIHJldHVybiB0aGF0IGJsb2NrLgorICAvLy8gT3RoZXJ3aXNlIHJldHVybiBudWxsLgorICBCYXNpY0Jsb2NrICpnZXRVbmlxdWVFeGl0QmxvY2soKSBjb25zdDsKKworICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgdm9pZCBkdW1wVmVyYm9zZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIGRlYnVnIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGlzIGxvb3AuCisgIC8vLyBUaGlzIGxvb2tzIGZvciBhIEJCIHRlcm1pbmF0aW5nIGluc3RydWN0aW9uIHdpdGggYSBrbm93biBkZWJ1ZworICAvLy8gbG9jYXRpb24gYnkgbG9va2luZyBhdCB0aGUgcHJlaGVhZGVyIGFuZCBoZWFkZXIgYmxvY2tzLiBJZiBpdAorICAvLy8gY2Fubm90IGZpbmQgYSB0ZXJtaW5hdGluZyBpbnN0cnVjdGlvbiB3aXRoIGxvY2F0aW9uIGluZm9ybWF0aW9uLAorICAvLy8gaXQgcmV0dXJucyBhbiB1bmtub3duIGxvY2F0aW9uLgorICBEZWJ1Z0xvYyBnZXRTdGFydExvYygpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIHNvdXJjZSBjb2RlIHNwYW4gb2YgdGhlIGxvb3AuCisgIExvY1JhbmdlIGdldExvY1JhbmdlKCkgY29uc3Q7CisKKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7CisgICAgaWYgKEJhc2ljQmxvY2sgKkhlYWRlciA9IGdldEhlYWRlcigpKQorICAgICAgaWYgKEhlYWRlci0+aGFzTmFtZSgpKQorICAgICAgICByZXR1cm4gSGVhZGVyLT5nZXROYW1lKCk7CisgICAgcmV0dXJuICI8dW5uYW1lZCBsb29wPiI7CisgIH0KKworcHJpdmF0ZToKKyAgTG9vcCgpID0gZGVmYXVsdDsKKworICBmcmllbmQgY2xhc3MgTG9vcEluZm9CYXNlPEJhc2ljQmxvY2ssIExvb3A+OworICBmcmllbmQgY2xhc3MgTG9vcEJhc2U8QmFzaWNCbG9jaywgTG9vcD47CisgIGV4cGxpY2l0IExvb3AoQmFzaWNCbG9jayAqQkIpIDogTG9vcEJhc2U8QmFzaWNCbG9jaywgTG9vcD4oQkIpIHt9CisgIH5Mb29wKCkgPSBkZWZhdWx0OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBUaGlzIGNsYXNzIGJ1aWxkcyBhbmQgY29udGFpbnMgYWxsIG9mIHRoZSB0b3AtbGV2ZWwgbG9vcAorLy8vIHN0cnVjdHVyZXMgaW4gdGhlIHNwZWNpZmllZCBmdW5jdGlvbi4KKy8vLworCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBjbGFzcyBMb29wVD4gY2xhc3MgTG9vcEluZm9CYXNlIHsKKyAgLy8gQkJNYXAgLSBNYXBwaW5nIG9mIGJhc2ljIGJsb2NrcyB0byB0aGUgaW5uZXIgbW9zdCBsb29wIHRoZXkgb2NjdXIgaW4KKyAgRGVuc2VNYXA8Y29uc3QgQmxvY2tUICosIExvb3BUICo+IEJCTWFwOworICBzdGQ6OnZlY3RvcjxMb29wVCAqPiBUb3BMZXZlbExvb3BzOworICBCdW1wUHRyQWxsb2NhdG9yIExvb3BBbGxvY2F0b3I7CisKKyAgZnJpZW5kIGNsYXNzIExvb3BCYXNlPEJsb2NrVCwgTG9vcFQ+OworICBmcmllbmQgY2xhc3MgTG9vcEluZm87CisKKyAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTG9vcEluZm9CYXNlICYpID0gZGVsZXRlOworICBMb29wSW5mb0Jhc2UoY29uc3QgTG9vcEluZm9CYXNlICYpID0gZGVsZXRlOworCitwdWJsaWM6CisgIExvb3BJbmZvQmFzZSgpIHt9CisgIH5Mb29wSW5mb0Jhc2UoKSB7IHJlbGVhc2VNZW1vcnkoKTsgfQorCisgIExvb3BJbmZvQmFzZShMb29wSW5mb0Jhc2UgJiZBcmcpCisgICAgICA6IEJCTWFwKHN0ZDo6bW92ZShBcmcuQkJNYXApKSwKKyAgICAgICAgVG9wTGV2ZWxMb29wcyhzdGQ6Om1vdmUoQXJnLlRvcExldmVsTG9vcHMpKSwKKyAgICAgICAgTG9vcEFsbG9jYXRvcihzdGQ6Om1vdmUoQXJnLkxvb3BBbGxvY2F0b3IpKSB7CisgICAgLy8gV2UgaGF2ZSB0byBjbGVhciB0aGUgYXJndW1lbnRzIHRvcCBsZXZlbCBsb29wcyBhcyB3ZSd2ZSB0YWtlbiBvd25lcnNoaXAuCisgICAgQXJnLlRvcExldmVsTG9vcHMuY2xlYXIoKTsKKyAgfQorICBMb29wSW5mb0Jhc2UgJm9wZXJhdG9yPShMb29wSW5mb0Jhc2UgJiZSSFMpIHsKKyAgICBCQk1hcCA9IHN0ZDo6bW92ZShSSFMuQkJNYXApOworCisgICAgZm9yIChhdXRvICpMIDogVG9wTGV2ZWxMb29wcykKKyAgICAgIEwtPn5Mb29wVCgpOworCisgICAgVG9wTGV2ZWxMb29wcyA9IHN0ZDo6bW92ZShSSFMuVG9wTGV2ZWxMb29wcyk7CisgICAgTG9vcEFsbG9jYXRvciA9IHN0ZDo6bW92ZShSSFMuTG9vcEFsbG9jYXRvcik7CisgICAgUkhTLlRvcExldmVsTG9vcHMuY2xlYXIoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSB7CisgICAgQkJNYXAuY2xlYXIoKTsKKworICAgIGZvciAoYXV0byAqTCA6IFRvcExldmVsTG9vcHMpCisgICAgICBMLT5+TG9vcFQoKTsKKyAgICBUb3BMZXZlbExvb3BzLmNsZWFyKCk7CisgICAgTG9vcEFsbG9jYXRvci5SZXNldCgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3NUeT4gTG9vcFQgKkFsbG9jYXRlTG9vcChBcmdzVHkgJiYuLi4gQXJncykgeworICAgIExvb3BUICpTdG9yYWdlID0gTG9vcEFsbG9jYXRvci5BbGxvY2F0ZTxMb29wVD4oKTsKKyAgICByZXR1cm4gbmV3IChTdG9yYWdlKSBMb29wVChzdGQ6OmZvcndhcmQ8QXJnc1R5PihBcmdzKS4uLik7CisgIH0KKworICAvLy8gaXRlcmF0b3IvYmVnaW4vZW5kIC0gVGhlIGludGVyZmFjZSB0byB0aGUgdG9wLWxldmVsIGxvb3BzIGluIHRoZSBjdXJyZW50CisgIC8vLyBmdW5jdGlvbi4KKyAgLy8vCisgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8TG9vcFQgKj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXJhdG9yOworICB0eXBlZGVmCisgICAgICB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxMb29wVCAqPjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZXZlcnNlX2l0ZXJhdG9yOworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFRvcExldmVsTG9vcHMuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBUb3BMZXZlbExvb3BzLmVuZCgpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gVG9wTGV2ZWxMb29wcy5yYmVnaW4oKTsgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IHJldHVybiBUb3BMZXZlbExvb3BzLnJlbmQoKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gVG9wTGV2ZWxMb29wcy5lbXB0eSgpOyB9CisKKyAgLy8vIFJldHVybiBhbGwgb2YgdGhlIGxvb3BzIGluIHRoZSBmdW5jdGlvbiBpbiBwcmVvcmRlciBhY3Jvc3MgdGhlIGxvb3AKKyAgLy8vIG5lc3RzLCB3aXRoIHNpYmxpbmdzIGluIGZvcndhcmQgcHJvZ3JhbSBvcmRlci4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgYmVjYXVzZSBsb29wcyBmb3JtIGEgZm9yZXN0IG9mIHRyZWVzLCBwcmVvcmRlciBpcyBlcXVpdmFsZW50IHRvCisgIC8vLyByZXZlcnNlIHBvc3RvcmRlci4KKyAgU21hbGxWZWN0b3I8TG9vcFQgKiwgND4gZ2V0TG9vcHNJblByZW9yZGVyKCk7CisKKyAgLy8vIFJldHVybiBhbGwgb2YgdGhlIGxvb3BzIGluIHRoZSBmdW5jdGlvbiBpbiBwcmVvcmRlciBhY3Jvc3MgdGhlIGxvb3AKKyAgLy8vIG5lc3RzLCB3aXRoIHNpYmxpbmdzIGluICpyZXZlcnNlKiBwcm9ncmFtIG9yZGVyLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBiZWNhdXNlIGxvb3BzIGZvcm0gYSBmb3Jlc3Qgb2YgdHJlZXMsIHByZW9yZGVyIGlzIGVxdWl2YWxlbnQgdG8KKyAgLy8vIHJldmVyc2UgcG9zdG9yZGVyLgorICAvLy8KKyAgLy8vIEFsc28gbm90ZSB0aGF0IHRoaXMgaXMgKm5vdCogYSByZXZlcnNlIHByZW9yZGVyLiBPbmx5IHRoZSBzaWJsaW5ncyBhcmUgaW4KKyAgLy8vIHJldmVyc2UgcHJvZ3JhbSBvcmRlci4KKyAgU21hbGxWZWN0b3I8TG9vcFQgKiwgND4gZ2V0TG9vcHNJblJldmVyc2VTaWJsaW5nUHJlb3JkZXIoKTsKKworICAvLy8gUmV0dXJuIHRoZSBpbm5lciBtb3N0IGxvb3AgdGhhdCBCQiBsaXZlcyBpbi4gSWYgYSBiYXNpYyBibG9jayBpcyBpbiBubworICAvLy8gbG9vcCAoZm9yIGV4YW1wbGUgdGhlIGVudHJ5IG5vZGUpLCBudWxsIGlzIHJldHVybmVkLgorICBMb29wVCAqZ2V0TG9vcEZvcihjb25zdCBCbG9ja1QgKkJCKSBjb25zdCB7IHJldHVybiBCQk1hcC5sb29rdXAoQkIpOyB9CisKKyAgLy8vIFNhbWUgYXMgZ2V0TG9vcEZvci4KKyAgY29uc3QgTG9vcFQgKm9wZXJhdG9yW10oY29uc3QgQmxvY2tUICpCQikgY29uc3QgeyByZXR1cm4gZ2V0TG9vcEZvcihCQik7IH0KKworICAvLy8gUmV0dXJuIHRoZSBsb29wIG5lc3RpbmcgbGV2ZWwgb2YgdGhlIHNwZWNpZmllZCBibG9jay4gQSBkZXB0aCBvZiAwIG1lYW5zCisgIC8vLyB0aGUgYmxvY2sgaXMgbm90IGluc2lkZSBhbnkgbG9vcC4KKyAgdW5zaWduZWQgZ2V0TG9vcERlcHRoKGNvbnN0IEJsb2NrVCAqQkIpIGNvbnN0IHsKKyAgICBjb25zdCBMb29wVCAqTCA9IGdldExvb3BGb3IoQkIpOworICAgIHJldHVybiBMID8gTC0+Z2V0TG9vcERlcHRoKCkgOiAwOworICB9CisKKyAgLy8gVHJ1ZSBpZiB0aGUgYmxvY2sgaXMgYSBsb29wIGhlYWRlciBub2RlCisgIGJvb2wgaXNMb29wSGVhZGVyKGNvbnN0IEJsb2NrVCAqQkIpIGNvbnN0IHsKKyAgICBjb25zdCBMb29wVCAqTCA9IGdldExvb3BGb3IoQkIpOworICAgIHJldHVybiBMICYmIEwtPmdldEhlYWRlcigpID09IEJCOworICB9CisKKyAgLy8vIFRoaXMgcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIHRvcC1sZXZlbCBsb29wIGZyb20gdGhpcyBsb29wIGluZm8gb2JqZWN0LgorICAvLy8gVGhlIGxvb3AgaXMgbm90IGRlbGV0ZWQsIGFzIGl0IHdpbGwgcHJlc3VtYWJseSBiZSBpbnNlcnRlZCBpbnRvCisgIC8vLyBhbm90aGVyIGxvb3AuCisgIExvb3BUICpyZW1vdmVMb29wKGl0ZXJhdG9yIEkpIHsKKyAgICBhc3NlcnQoSSAhPSBlbmQoKSAmJiAiQ2Fubm90IHJlbW92ZSBlbmQgaXRlcmF0b3IhIik7CisgICAgTG9vcFQgKkwgPSAqSTsKKyAgICBhc3NlcnQoIUwtPmdldFBhcmVudExvb3AoKSAmJiAiTm90IGEgdG9wLWxldmVsIGxvb3AhIik7CisgICAgVG9wTGV2ZWxMb29wcy5lcmFzZShUb3BMZXZlbExvb3BzLmJlZ2luKCkgKyAoSSAtIGJlZ2luKCkpKTsKKyAgICByZXR1cm4gTDsKKyAgfQorCisgIC8vLyBDaGFuZ2UgdGhlIHRvcC1sZXZlbCBsb29wIHRoYXQgY29udGFpbnMgQkIgdG8gdGhlIHNwZWNpZmllZCBsb29wLgorICAvLy8gVGhpcyBzaG91bGQgYmUgdXNlZCBieSB0cmFuc2Zvcm1hdGlvbnMgdGhhdCByZXN0cnVjdHVyZSB0aGUgbG9vcCBoaWVyYXJjaHkKKyAgLy8vIHRyZWUuCisgIHZvaWQgY2hhbmdlTG9vcEZvcihCbG9ja1QgKkJCLCBMb29wVCAqTCkgeworICAgIGlmICghTCkgeworICAgICAgQkJNYXAuZXJhc2UoQkIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBCQk1hcFtCQl0gPSBMOworICB9CisKKyAgLy8vIFJlcGxhY2UgdGhlIHNwZWNpZmllZCBsb29wIGluIHRoZSB0b3AtbGV2ZWwgbG9vcHMgbGlzdCB3aXRoIHRoZSBpbmRpY2F0ZWQKKyAgLy8vIGxvb3AuCisgIHZvaWQgY2hhbmdlVG9wTGV2ZWxMb29wKExvb3BUICpPbGRMb29wLCBMb29wVCAqTmV3TG9vcCkgeworICAgIGF1dG8gSSA9IGZpbmQoVG9wTGV2ZWxMb29wcywgT2xkTG9vcCk7CisgICAgYXNzZXJ0KEkgIT0gVG9wTGV2ZWxMb29wcy5lbmQoKSAmJiAiT2xkIGxvb3Agbm90IGF0IHRvcCBsZXZlbCEiKTsKKyAgICAqSSA9IE5ld0xvb3A7CisgICAgYXNzZXJ0KCFOZXdMb29wLT5QYXJlbnRMb29wICYmICFPbGRMb29wLT5QYXJlbnRMb29wICYmCisgICAgICAgICAgICJMb29wcyBhbHJlYWR5IGVtYmVkZGVkIGludG8gYSBzdWJsb29wISIpOworICB9CisKKyAgLy8vIFRoaXMgYWRkcyB0aGUgc3BlY2lmaWVkIGxvb3AgdG8gdGhlIGNvbGxlY3Rpb24gb2YgdG9wLWxldmVsIGxvb3BzLgorICB2b2lkIGFkZFRvcExldmVsTG9vcChMb29wVCAqTmV3KSB7CisgICAgYXNzZXJ0KCFOZXctPmdldFBhcmVudExvb3AoKSAmJiAiTG9vcCBhbHJlYWR5IGluIHN1Ymxvb3AhIik7CisgICAgVG9wTGV2ZWxMb29wcy5wdXNoX2JhY2soTmV3KTsKKyAgfQorCisgIC8vLyBUaGlzIG1ldGhvZCBjb21wbGV0ZWx5IHJlbW92ZXMgQkIgZnJvbSBhbGwgZGF0YSBzdHJ1Y3R1cmVzLAorICAvLy8gaW5jbHVkaW5nIGFsbCBvZiB0aGUgTG9vcCBvYmplY3RzIGl0IGlzIG5lc3RlZCBpbiBhbmQgb3VyIG1hcHBpbmcgZnJvbQorICAvLy8gQmFzaWNCbG9ja3MgdG8gbG9vcHMuCisgIHZvaWQgcmVtb3ZlQmxvY2soQmxvY2tUICpCQikgeworICAgIGF1dG8gSSA9IEJCTWFwLmZpbmQoQkIpOworICAgIGlmIChJICE9IEJCTWFwLmVuZCgpKSB7CisgICAgICBmb3IgKExvb3BUICpMID0gSS0+c2Vjb25kOyBMOyBMID0gTC0+Z2V0UGFyZW50TG9vcCgpKQorICAgICAgICBMLT5yZW1vdmVCbG9ja0Zyb21Mb29wKEJCKTsKKworICAgICAgQkJNYXAuZXJhc2UoSSk7CisgICAgfQorICB9CisKKyAgLy8gSW50ZXJuYWxzCisKKyAgc3RhdGljIGJvb2wgaXNOb3RBbHJlYWR5Q29udGFpbmVkSW4oY29uc3QgTG9vcFQgKlN1Ykxvb3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3BUICpQYXJlbnRMb29wKSB7CisgICAgaWYgKCFTdWJMb29wKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKFN1Ykxvb3AgPT0gUGFyZW50TG9vcCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gaXNOb3RBbHJlYWR5Q29udGFpbmVkSW4oU3ViTG9vcC0+Z2V0UGFyZW50TG9vcCgpLCBQYXJlbnRMb29wKTsKKyAgfQorCisgIC8vLyBDcmVhdGUgdGhlIGxvb3AgZm9yZXN0IHVzaW5nIGEgc3RhYmxlIGFsZ29yaXRobS4KKyAgdm9pZCBhbmFseXplKGNvbnN0IERvbWluYXRvclRyZWVCYXNlPEJsb2NrVCwgZmFsc2U+ICZEb21UcmVlKTsKKworICAvLyBEZWJ1Z2dpbmcKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIHZvaWQgdmVyaWZ5KGNvbnN0IERvbWluYXRvclRyZWVCYXNlPEJsb2NrVCwgZmFsc2U+ICZEb21UcmVlKSBjb25zdDsKKworICAvLy8gRGVzdHJveSBhIGxvb3AgdGhhdCBoYXMgYmVlbiByZW1vdmVkIGZyb20gdGhlIGBMb29wSW5mb2AgbmVzdC4KKyAgLy8vCisgIC8vLyBUaGlzIHJ1bnMgdGhlIGRlc3RydWN0b3Igb2YgdGhlIGxvb3Agb2JqZWN0IG1ha2luZyBpdCBpbnZhbGlkIHRvCisgIC8vLyByZWZlcmVuY2UgYWZ0ZXJ3YXJkLiBUaGUgbWVtb3J5IGlzIHJldGFpbmVkIHNvIHRoYXQgdGhlICpwb2ludGVyKiB0byB0aGUKKyAgLy8vIGxvb3AgcmVtYWlucyB2YWxpZC4KKyAgLy8vCisgIC8vLyBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciByZW1vdmluZyB0aGlzIGxvb3AgZnJvbSB0aGUgbG9vcCBuZXN0IGFuZAorICAvLy8gb3RoZXJ3aXNlIGRpc2Nvbm5lY3RpbmcgaXQgZnJvbSB0aGUgYnJvYWRlciBgTG9vcEluZm9gIGRhdGEgc3RydWN0dXJlcy4KKyAgLy8vIENhbGxlcnMgdGhhdCBkb24ndCBuYXR1cmFsbHkgaGFuZGxlIHRoaXMgdGhlbXNlbHZlcyBzaG91bGQgcHJvYmFibHkgY2FsbAorICAvLy8gYGVyYXNlJyBpbnN0ZWFkLgorICB2b2lkIGRlc3Ryb3koTG9vcFQgKkwpIHsKKyAgICBMLT5+TG9vcFQoKTsKKworICAgIC8vIFNpbmNlIExvb3BBbGxvY2F0b3IgaXMgYSBCdW1wUHRyQWxsb2NhdG9yLCB0aGlzIERlYWxsb2NhdGUgb25seSBwb2lzb25zCisgICAgLy8gXGMgTCwgYnV0IHRoZSBwb2ludGVyIHJlbWFpbnMgdmFsaWQgZm9yIG5vbi1kZXJlZmVyZW5jaW5nIHVzZXMuCisgICAgTG9vcEFsbG9jYXRvci5EZWFsbG9jYXRlKEwpOworICB9Cit9OworCisvLyBJbXBsZW1lbnRhdGlvbiBpbiBMb29wSW5mb0ltcGwuaAorZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIExvb3BJbmZvQmFzZTxCYXNpY0Jsb2NrLCBMb29wPjsKKworY2xhc3MgTG9vcEluZm8gOiBwdWJsaWMgTG9vcEluZm9CYXNlPEJhc2ljQmxvY2ssIExvb3A+IHsKKyAgdHlwZWRlZiBMb29wSW5mb0Jhc2U8QmFzaWNCbG9jaywgTG9vcD4gQmFzZVQ7CisKKyAgZnJpZW5kIGNsYXNzIExvb3BCYXNlPEJhc2ljQmxvY2ssIExvb3A+OworCisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IExvb3BJbmZvICYpID0gZGVsZXRlOworICBMb29wSW5mbyhjb25zdCBMb29wSW5mbyAmKSA9IGRlbGV0ZTsKKworcHVibGljOgorICBMb29wSW5mbygpIHt9CisgIGV4cGxpY2l0IExvb3BJbmZvKGNvbnN0IERvbWluYXRvclRyZWVCYXNlPEJhc2ljQmxvY2ssIGZhbHNlPiAmRG9tVHJlZSk7CisKKyAgTG9vcEluZm8oTG9vcEluZm8gJiZBcmcpIDogQmFzZVQoc3RkOjptb3ZlKHN0YXRpY19jYXN0PEJhc2VUICY+KEFyZykpKSB7fQorICBMb29wSW5mbyAmb3BlcmF0b3I9KExvb3BJbmZvICYmUkhTKSB7CisgICAgQmFzZVQ6Om9wZXJhdG9yPShzdGQ6Om1vdmUoc3RhdGljX2Nhc3Q8QmFzZVQgJj4oUkhTKSkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBIYW5kbGUgaW52YWxpZGF0aW9uIGV4cGxpY2l0bHkuCisgIGJvb2wgaW52YWxpZGF0ZShGdW5jdGlvbiAmRiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJlBBLAorICAgICAgICAgICAgICAgICAgRnVuY3Rpb25BbmFseXNpc01hbmFnZXI6OkludmFsaWRhdG9yICYpOworCisgIC8vIE1vc3Qgb2YgdGhlIHB1YmxpYyBpbnRlcmZhY2UgaXMgcHJvdmlkZWQgdmlhIExvb3BJbmZvQmFzZS4KKworICAvLy8gVXBkYXRlIExvb3BJbmZvIGFmdGVyIHJlbW92aW5nIHRoZSBsYXN0IGJhY2tlZGdlIGZyb20gYSBsb29wLiBUaGlzIHVwZGF0ZXMKKyAgLy8vIHRoZSBsb29wIGZvcmVzdCBhbmQgcGFyZW50IGxvb3BzIGZvciBlYWNoIGJsb2NrIHNvIHRoYXQgXGMgTCBpcyBubyBsb25nZXIKKyAgLy8vIHJlZmVyZW5jZWQsIGJ1dCBkb2VzIG5vdCBhY3R1YWxseSBkZWxldGUgXGMgTCBpbW1lZGlhdGVseS4gVGhlIHBvaW50ZXIKKyAgLy8vIHdpbGwgcmVtYWluIHZhbGlkIHVudGlsIHRoaXMgTG9vcEluZm8ncyBtZW1vcnkgaXMgcmVsZWFzZWQuCisgIHZvaWQgZXJhc2UoTG9vcCAqTCk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiByZXBsYWNpbmcgRnJvbSB3aXRoIFRvIGV2ZXJ5d2hlcmUgaXMgZ3VhcmFudGVlZCB0bworICAvLy8gcHJlc2VydmUgTENTU0EgZm9ybS4KKyAgYm9vbCByZXBsYWNlbWVudFByZXNlcnZlc0xDU1NBRm9ybShJbnN0cnVjdGlvbiAqRnJvbSwgVmFsdWUgKlRvKSB7CisgICAgLy8gUHJlc2VydmluZyBMQ1NTQSBmb3JtIGlzIG9ubHkgcHJvYmxlbWF0aWMgaWYgdGhlIHJlcGxhY2luZyB2YWx1ZSBpcyBhbgorICAgIC8vIGluc3RydWN0aW9uLgorICAgIEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFRvKTsKKyAgICBpZiAoIUkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyBJZiBib3RoIGluc3RydWN0aW9ucyBhcmUgZGVmaW5lZCBpbiB0aGUgc2FtZSBiYXNpYyBibG9jayB0aGVuIHJlcGxhY2VtZW50CisgICAgLy8gY2Fubm90IGJyZWFrIExDU1NBIGZvcm0uCisgICAgaWYgKEktPmdldFBhcmVudCgpID09IEZyb20tPmdldFBhcmVudCgpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gSWYgdGhlIGluc3RydWN0aW9uIGlzIG5vdCBkZWZpbmVkIGluIGEgbG9vcCB0aGVuIGl0IGNhbiBzYWZlbHkgcmVwbGFjZQorICAgIC8vIGFueXRoaW5nLgorICAgIExvb3AgKlRvTG9vcCA9IGdldExvb3BGb3IoSS0+Z2V0UGFyZW50KCkpOworICAgIGlmICghVG9Mb29wKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gSWYgdGhlIHJlcGxhY2luZyBpbnN0cnVjdGlvbiBpcyBkZWZpbmVkIGluIHRoZSBzYW1lIGxvb3AgYXMgdGhlIG9yaWdpbmFsCisgICAgLy8gaW5zdHJ1Y3Rpb24sIG9yIGluIGEgbG9vcCB0aGF0IGNvbnRhaW5zIGl0IGFzIGFuIGlubmVyIGxvb3AsIHRoZW4gdXNpbmcKKyAgICAvLyBpdCBhcyBhIHJlcGxhY2VtZW50IHdpbGwgbm90IGJyZWFrIExDU1NBIGZvcm0uCisgICAgcmV0dXJuIFRvTG9vcC0+Y29udGFpbnMoZ2V0TG9vcEZvcihGcm9tLT5nZXRQYXJlbnQoKSkpOworICB9CisKKyAgLy8vIENoZWNrcyBpZiBtb3ZpbmcgYSBzcGVjaWZpYyBpbnN0cnVjdGlvbiBjYW4gYnJlYWsgTENTU0EgaW4gYW55IGxvb3AuCisgIC8vLworICAvLy8gUmV0dXJuIHRydWUgaWYgbW92aW5nIFxwIEluc3QgdG8gYmVmb3JlIFxwIE5ld0xvYyB3aWxsIGJyZWFrIExDU1NBLAorICAvLy8gYXNzdW1pbmcgdGhhdCB0aGUgZnVuY3Rpb24gY29udGFpbmluZyBccCBJbnN0IGFuZCBccCBOZXdMb2MgaXMgY3VycmVudGx5CisgIC8vLyBpbiBMQ1NTQSBmb3JtLgorICBib29sIG1vdmVtZW50UHJlc2VydmVzTENTU0FGb3JtKEluc3RydWN0aW9uICpJbnN0LCBJbnN0cnVjdGlvbiAqTmV3TG9jKSB7CisgICAgYXNzZXJ0KEluc3QtPmdldEZ1bmN0aW9uKCkgPT0gTmV3TG9jLT5nZXRGdW5jdGlvbigpICYmCisgICAgICAgICAgICJDYW4ndCByZWFzb24gYWJvdXQgSVBPISIpOworCisgICAgYXV0byAqT2xkQkIgPSBJbnN0LT5nZXRQYXJlbnQoKTsKKyAgICBhdXRvICpOZXdCQiA9IE5ld0xvYy0+Z2V0UGFyZW50KCk7CisKKyAgICAvLyBNb3ZlbWVudCB3aXRoaW4gdGhlIHNhbWUgbG9vcCBkb2VzIG5vdCBicmVhayBMQ1NTQSAodGhlIGVxdWFsaXR5IGNoZWNrIGlzCisgICAgLy8gdG8gYXZvaWQgZG9pbmcgYSBoYXNodGFibGUgbG9va3VwIGluIGNhc2Ugb2YgaW50cmEtYmxvY2sgbW92ZW1lbnQpLgorICAgIGlmIChPbGRCQiA9PSBOZXdCQikKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgYXV0byAqT2xkTG9vcCA9IGdldExvb3BGb3IoT2xkQkIpOworICAgIGF1dG8gKk5ld0xvb3AgPSBnZXRMb29wRm9yKE5ld0JCKTsKKworICAgIGlmIChPbGRMb29wID09IE5ld0xvb3ApCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIENoZWNrIGlmIE91dGVyIGNvbnRhaW5zIElubmVyOyB3aXRoIHRoZSBudWxsIGxvb3AgY291bnRpbmcgYXMgdGhlCisgICAgLy8gIm91dGVybW9zdCIgbG9vcC4KKyAgICBhdXRvIENvbnRhaW5zID0gW10oY29uc3QgTG9vcCAqT3V0ZXIsIGNvbnN0IExvb3AgKklubmVyKSB7CisgICAgICByZXR1cm4gIU91dGVyIHx8IE91dGVyLT5jb250YWlucyhJbm5lcik7CisgICAgfTsKKworICAgIC8vIFRvIGNoZWNrIHRoYXQgdGhlIG1vdmVtZW50IG9mIEluc3QgdG8gYmVmb3JlIE5ld0xvYyBkb2VzIG5vdCBicmVhayBMQ1NTQSwKKyAgICAvLyB3ZSBuZWVkIHRvIGNoZWNrIHR3byBzZXRzIG9mIHVzZXMgZm9yIHBvc3NpYmxlIExDU1NBIHZpb2xhdGlvbnMgYXQKKyAgICAvLyBOZXdMb2M6IHRoZSB1c2VycyBvZiBOZXdJbnN0LCBhbmQgdGhlIG9wZXJhbmRzIG9mIE5ld0luc3QuCisKKyAgICAvLyBJZiB3ZSBrbm93IHdlJ3JlIGhvaXN0aW5nIEluc3Qgb3V0IG9mIGFuIGlubmVyIGxvb3AgdG8gYW4gb3V0ZXIgbG9vcCwKKyAgICAvLyB0aGVuIHRoZSB1c2VzICpvZiogSW5zdCBkb24ndCBuZWVkIHRvIGJlIGNoZWNrZWQuCisKKyAgICBpZiAoIUNvbnRhaW5zKE5ld0xvb3AsIE9sZExvb3ApKSB7CisgICAgICBmb3IgKFVzZSAmVSA6IEluc3QtPnVzZXMoKSkgeworICAgICAgICBhdXRvICpVSSA9IGNhc3Q8SW5zdHJ1Y3Rpb24+KFUuZ2V0VXNlcigpKTsKKyAgICAgICAgYXV0byAqVUJCID0gaXNhPFBISU5vZGU+KFVJKSA/IGNhc3Q8UEhJTm9kZT4oVUkpLT5nZXRJbmNvbWluZ0Jsb2NrKFUpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBVSS0+Z2V0UGFyZW50KCk7CisgICAgICAgIGlmIChVQkIgIT0gTmV3QkIgJiYgZ2V0TG9vcEZvcihVQkIpICE9IE5ld0xvb3ApCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKworICAgIC8vIElmIHdlIGtub3cgd2UncmUgc2lua2luZyBJbnN0IGZyb20gYW4gb3V0ZXIgbG9vcCBpbnRvIGFuIGlubmVyIGxvb3AsIHRoZW4KKyAgICAvLyB0aGUgKm9wZXJhbmRzKiBvZiBJbnN0IGRvbid0IG5lZWQgdG8gYmUgY2hlY2tlZC4KKworICAgIGlmICghQ29udGFpbnMoT2xkTG9vcCwgTmV3TG9vcCkpIHsKKyAgICAgIC8vIFNlZSBiZWxvdyBvbiB3aHkgd2UgY2FuJ3QgaGFuZGxlIHBoaSBub2RlcyBoZXJlLgorICAgICAgaWYgKGlzYTxQSElOb2RlPihJbnN0KSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBmb3IgKFVzZSAmVSA6IEluc3QtPm9wZXJhbmRzKCkpIHsKKyAgICAgICAgYXV0byAqRGVmSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihVLmdldCgpKTsKKyAgICAgICAgaWYgKCFEZWZJKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgICAvLyBUaGlzIHdvdWxkIG5lZWQgYWRqdXN0bWVudCBpZiB3ZSBhbGxvdyBJbnN0IHRvIGJlIGEgcGhpIG5vZGUgLS0gdGhlCisgICAgICAgIC8vIG5ldyB1c2UgYmxvY2sgd29uJ3Qgc2ltcGx5IGJlIE5ld0JCLgorCisgICAgICAgIGF1dG8gKkRlZkJsb2NrID0gRGVmSS0+Z2V0UGFyZW50KCk7CisgICAgICAgIGlmIChEZWZCbG9jayAhPSBOZXdCQiAmJiBnZXRMb29wRm9yKERlZkJsb2NrKSAhPSBOZXdMb29wKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKworLy8gQWxsb3cgY2xpZW50cyB0byB3YWxrIHRoZSBsaXN0IG9mIG5lc3RlZCBsb29wcy4uLgordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPGNvbnN0IExvb3AgKj4geworICB0eXBlZGVmIGNvbnN0IExvb3AgKk5vZGVSZWY7CisgIHR5cGVkZWYgTG9vcEluZm86Oml0ZXJhdG9yIENoaWxkSXRlcmF0b3JUeXBlOworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShjb25zdCBMb29wICpMKSB7IHJldHVybiBMOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPmJlZ2luKCk7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPmVuZCgpOyB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8TG9vcCAqPiB7CisgIHR5cGVkZWYgTG9vcCAqTm9kZVJlZjsKKyAgdHlwZWRlZiBMb29wSW5mbzo6aXRlcmF0b3IgQ2hpbGRJdGVyYXRvclR5cGU7CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKExvb3AgKkwpIHsgcmV0dXJuIEw7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+YmVnaW4oKTsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+ZW5kKCk7IH0KK307CisKKy8vLyBcYnJpZWYgQW5hbHlzaXMgcGFzcyB0aGF0IGV4cG9zZXMgdGhlIFxjIExvb3BJbmZvIGZvciBhIGZ1bmN0aW9uLgorY2xhc3MgTG9vcEFuYWx5c2lzIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPExvb3BBbmFseXNpcz4geworICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48TG9vcEFuYWx5c2lzPjsKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworcHVibGljOgorICB0eXBlZGVmIExvb3BJbmZvIFJlc3VsdDsKKworICBMb29wSW5mbyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gXGJyaWVmIFByaW50ZXIgcGFzcyBmb3IgdGhlIFxjIExvb3BBbmFseXNpcyByZXN1bHRzLgorY2xhc3MgTG9vcFByaW50ZXJQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48TG9vcFByaW50ZXJQYXNzPiB7CisgIHJhd19vc3RyZWFtICZPUzsKKworcHVibGljOgorICBleHBsaWNpdCBMb29wUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk9TKSA6IE9TKE9TKSB7fQorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gXGJyaWVmIFZlcmlmaWVyIHBhc3MgZm9yIHRoZSBcYyBMb29wQW5hbHlzaXMgcmVzdWx0cy4KK3N0cnVjdCBMb29wVmVyaWZpZXJQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48TG9vcFZlcmlmaWVyUGFzcz4geworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gXGJyaWVmIFRoZSBsZWdhY3kgcGFzcyBtYW5hZ2VyJ3MgYW5hbHlzaXMgcGFzcyB0byBjb21wdXRlIGxvb3AgaW5mb3JtYXRpb24uCitjbGFzcyBMb29wSW5mb1dyYXBwZXJQYXNzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgIExvb3BJbmZvIExJOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisKKyAgTG9vcEluZm9XcmFwcGVyUGFzcygpIDogRnVuY3Rpb25QYXNzKElEKSB7CisgICAgaW5pdGlhbGl6ZUxvb3BJbmZvV3JhcHBlclBhc3NQYXNzKCpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpKTsKKyAgfQorCisgIExvb3BJbmZvICZnZXRMb29wSW5mbygpIHsgcmV0dXJuIExJOyB9CisgIGNvbnN0IExvb3BJbmZvICZnZXRMb29wSW5mbygpIGNvbnN0IHsgcmV0dXJuIExJOyB9CisKKyAgLy8vIFxicmllZiBDYWxjdWxhdGUgdGhlIG5hdHVyYWwgbG9vcCBpbmZvcm1hdGlvbiBmb3IgYSBnaXZlbiBmdW5jdGlvbi4KKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSBvdmVycmlkZTsKKworICB2b2lkIHZlcmlmeUFuYWx5c2lzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGUgeyBMSS5yZWxlYXNlTWVtb3J5KCk7IH0KKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPLCBjb25zdCBNb2R1bGUgKk0gPSBudWxscHRyKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vIEZ1bmN0aW9uIHRvIHByaW50IGEgbG9vcCdzIGNvbnRlbnRzIGFzIExMVk0ncyB0ZXh0IElSIGFzc2VtYmx5Lgordm9pZCBwcmludExvb3AoTG9vcCAmTCwgcmF3X29zdHJlYW0gJk9TLCBjb25zdCBzdGQ6OnN0cmluZyAmQmFubmVyID0gIiIpOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTG9vcEluZm9JbXBsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvb3BJbmZvSW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYTE2YjUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvb3BJbmZvSW1wbC5oCkBAIC0wLDAgKzEsNjc3IEBACisvLz09PS0gbGx2bS9BbmFseXNpcy9Mb29wSW5mb0ltcGwuaCAtIE5hdHVyYWwgTG9vcCBDYWxjdWxhdG9yIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaXMgdGhlIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gb2YgTG9vcEluZm8gdXNlZCBmb3IgYm90aCBMb29wcyBhbmQKKy8vIE1hY2hpbmVMb29wcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfTE9PUElORk9JTVBMX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19MT09QSU5GT0lNUExfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVwdGhGaXJzdEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9zdE9yZGVySXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Eb21pbmF0b3JzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFQSXMgZm9yIHNpbXBsZSBhbmFseXNpcyBvZiB0aGUgbG9vcC4gU2VlIGhlYWRlciBub3Rlcy4KKworLy8vIGdldEV4aXRpbmdCbG9ja3MgLSBSZXR1cm4gYWxsIGJsb2NrcyBpbnNpZGUgdGhlIGxvb3AgdGhhdCBoYXZlIHN1Y2Nlc3NvcnMKKy8vLyBvdXRzaWRlIG9mIHRoZSBsb29wLiAgVGhlc2UgYXJlIHRoZSBibG9ja3MgX2luc2lkZSBvZiB0aGUgY3VycmVudCBsb29wXworLy8vIHdoaWNoIGJyYW5jaCBvdXQuICBUaGUgcmV0dXJuZWQgbGlzdCBpcyBhbHdheXMgdW5pcXVlLgorLy8vCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBjbGFzcyBMb29wVD4KK3ZvaWQgTG9vcEJhc2U8QmxvY2tULCBMb29wVD46OmdldEV4aXRpbmdCbG9ja3MoCisgICAgU21hbGxWZWN0b3JJbXBsPEJsb2NrVCAqPiAmRXhpdGluZ0Jsb2NrcykgY29uc3QgeworICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICBmb3IgKGNvbnN0IGF1dG8gQkIgOiBibG9ja3MoKSkKKyAgICBmb3IgKGNvbnN0IGF1dG8gJlN1Y2MgOiBjaGlsZHJlbjxCbG9ja1QgKj4oQkIpKQorICAgICAgaWYgKCFjb250YWlucyhTdWNjKSkgeworICAgICAgICAvLyBOb3QgaW4gY3VycmVudCBsb29wPyBJdCBtdXN0IGJlIGFuIGV4aXQgYmxvY2suCisgICAgICAgIEV4aXRpbmdCbG9ja3MucHVzaF9iYWNrKEJCKTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9Cit9CisKKy8vLyBnZXRFeGl0aW5nQmxvY2sgLSBJZiBnZXRFeGl0aW5nQmxvY2tzIHdvdWxkIHJldHVybiBleGFjdGx5IG9uZSBibG9jaywKKy8vLyByZXR1cm4gdGhhdCBibG9jay4gT3RoZXJ3aXNlIHJldHVybiBudWxsLgordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+CitCbG9ja1QgKkxvb3BCYXNlPEJsb2NrVCwgTG9vcFQ+OjpnZXRFeGl0aW5nQmxvY2soKSBjb25zdCB7CisgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgIFNtYWxsVmVjdG9yPEJsb2NrVCAqLCA4PiBFeGl0aW5nQmxvY2tzOworICBnZXRFeGl0aW5nQmxvY2tzKEV4aXRpbmdCbG9ja3MpOworICBpZiAoRXhpdGluZ0Jsb2Nrcy5zaXplKCkgPT0gMSkKKyAgICByZXR1cm4gRXhpdGluZ0Jsb2Nrc1swXTsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vLyBnZXRFeGl0QmxvY2tzIC0gUmV0dXJuIGFsbCBvZiB0aGUgc3VjY2Vzc29yIGJsb2NrcyBvZiB0aGlzIGxvb3AuICBUaGVzZQorLy8vIGFyZSB0aGUgYmxvY2tzIF9vdXRzaWRlIG9mIHRoZSBjdXJyZW50IGxvb3BfIHdoaWNoIGFyZSBicmFuY2hlZCB0by4KKy8vLwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+Cit2b2lkIExvb3BCYXNlPEJsb2NrVCwgTG9vcFQ+OjpnZXRFeGl0QmxvY2tzKAorICAgIFNtYWxsVmVjdG9ySW1wbDxCbG9ja1QgKj4gJkV4aXRCbG9ja3MpIGNvbnN0IHsKKyAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyAgZm9yIChjb25zdCBhdXRvIEJCIDogYmxvY2tzKCkpCisgICAgZm9yIChjb25zdCBhdXRvICZTdWNjIDogY2hpbGRyZW48QmxvY2tUICo+KEJCKSkKKyAgICAgIGlmICghY29udGFpbnMoU3VjYykpCisgICAgICAgIC8vIE5vdCBpbiBjdXJyZW50IGxvb3A/IEl0IG11c3QgYmUgYW4gZXhpdCBibG9jay4KKyAgICAgICAgRXhpdEJsb2Nrcy5wdXNoX2JhY2soU3VjYyk7Cit9CisKKy8vLyBnZXRFeGl0QmxvY2sgLSBJZiBnZXRFeGl0QmxvY2tzIHdvdWxkIHJldHVybiBleGFjdGx5IG9uZSBibG9jaywKKy8vLyByZXR1cm4gdGhhdCBibG9jay4gT3RoZXJ3aXNlIHJldHVybiBudWxsLgordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+CitCbG9ja1QgKkxvb3BCYXNlPEJsb2NrVCwgTG9vcFQ+OjpnZXRFeGl0QmxvY2soKSBjb25zdCB7CisgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgIFNtYWxsVmVjdG9yPEJsb2NrVCAqLCA4PiBFeGl0QmxvY2tzOworICBnZXRFeGl0QmxvY2tzKEV4aXRCbG9ja3MpOworICBpZiAoRXhpdEJsb2Nrcy5zaXplKCkgPT0gMSkKKyAgICByZXR1cm4gRXhpdEJsb2Nrc1swXTsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vLyBnZXRFeGl0RWRnZXMgLSBSZXR1cm4gYWxsIHBhaXJzIG9mIChfaW5zaWRlX2Jsb2NrXyxfb3V0c2lkZV9ibG9ja18pLgordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+Cit2b2lkIExvb3BCYXNlPEJsb2NrVCwgTG9vcFQ+OjpnZXRFeGl0RWRnZXMoCisgICAgU21hbGxWZWN0b3JJbXBsPEVkZ2U+ICZFeGl0RWRnZXMpIGNvbnN0IHsKKyAgYXNzZXJ0KCFpc0ludmFsaWQoKSAmJiAiTG9vcCBub3QgaW4gYSB2YWxpZCBzdGF0ZSEiKTsKKyAgZm9yIChjb25zdCBhdXRvIEJCIDogYmxvY2tzKCkpCisgICAgZm9yIChjb25zdCBhdXRvICZTdWNjIDogY2hpbGRyZW48QmxvY2tUICo+KEJCKSkKKyAgICAgIGlmICghY29udGFpbnMoU3VjYykpCisgICAgICAgIC8vIE5vdCBpbiBjdXJyZW50IGxvb3A/IEl0IG11c3QgYmUgYW4gZXhpdCBibG9jay4KKyAgICAgICAgRXhpdEVkZ2VzLmVtcGxhY2VfYmFjayhCQiwgU3VjYyk7Cit9CisKKy8vLyBnZXRMb29wUHJlaGVhZGVyIC0gSWYgdGhlcmUgaXMgYSBwcmVoZWFkZXIgZm9yIHRoaXMgbG9vcCwgcmV0dXJuIGl0LiAgQQorLy8vIGxvb3AgaGFzIGEgcHJlaGVhZGVyIGlmIHRoZXJlIGlzIG9ubHkgb25lIGVkZ2UgdG8gdGhlIGhlYWRlciBvZiB0aGUgbG9vcAorLy8vIGZyb20gb3V0c2lkZSBvZiB0aGUgbG9vcCBhbmQgaXQgaXMgbGVnYWwgdG8gaG9pc3QgaW5zdHJ1Y3Rpb25zIGludG8gdGhlCisvLy8gcHJlZGVjZXNzb3IuIElmIHRoaXMgaXMgdGhlIGNhc2UsIHRoZSBibG9jayBicmFuY2hpbmcgdG8gdGhlIGhlYWRlciBvZiB0aGUKKy8vLyBsb29wIGlzIHRoZSBwcmVoZWFkZXIgbm9kZS4KKy8vLworLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBubyBwcmVoZWFkZXIgZm9yIHRoZSBsb29wLgorLy8vCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBjbGFzcyBMb29wVD4KK0Jsb2NrVCAqTG9vcEJhc2U8QmxvY2tULCBMb29wVD46OmdldExvb3BQcmVoZWFkZXIoKSBjb25zdCB7CisgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgIC8vIEtlZXAgdHJhY2sgb2Ygbm9kZXMgb3V0c2lkZSB0aGUgbG9vcCBicmFuY2hpbmcgdG8gdGhlIGhlYWRlci4uLgorICBCbG9ja1QgKk91dCA9IGdldExvb3BQcmVkZWNlc3NvcigpOworICBpZiAoIU91dCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICAvLyBNYWtlIHN1cmUgd2UgYXJlIGFsbG93ZWQgdG8gaG9pc3QgaW5zdHJ1Y3Rpb25zIGludG8gdGhlIHByZWRlY2Vzc29yLgorICBpZiAoIU91dC0+aXNMZWdhbFRvSG9pc3RJbnRvKCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgLy8gTWFrZSBzdXJlIHRoZXJlIGlzIG9ubHkgb25lIGV4aXQgb3V0IG9mIHRoZSBwcmVoZWFkZXIuCisgIHR5cGVkZWYgR3JhcGhUcmFpdHM8QmxvY2tUICo+IEJsb2NrVHJhaXRzOworICB0eXBlbmFtZSBCbG9ja1RyYWl0czo6Q2hpbGRJdGVyYXRvclR5cGUgU0kgPSBCbG9ja1RyYWl0czo6Y2hpbGRfYmVnaW4oT3V0KTsKKyAgKytTSTsKKyAgaWYgKFNJICE9IEJsb2NrVHJhaXRzOjpjaGlsZF9lbmQoT3V0KSkKKyAgICByZXR1cm4gbnVsbHB0cjsgLy8gTXVsdGlwbGUgZXhpdHMgZnJvbSB0aGUgYmxvY2ssIG11c3Qgbm90IGJlIGEgcHJlaGVhZGVyLgorCisgIC8vIFRoZSBwcmVkZWNlc3NvciBoYXMgZXhhY3RseSBvbmUgc3VjY2Vzc29yLCBzbyBpdCBpcyBhIHByZWhlYWRlci4KKyAgcmV0dXJuIE91dDsKK30KKworLy8vIGdldExvb3BQcmVkZWNlc3NvciAtIElmIHRoZSBnaXZlbiBsb29wJ3MgaGVhZGVyIGhhcyBleGFjdGx5IG9uZSB1bmlxdWUKKy8vLyBwcmVkZWNlc3NvciBvdXRzaWRlIHRoZSBsb29wLCByZXR1cm4gaXQuIE90aGVyd2lzZSByZXR1cm4gbnVsbC4KKy8vLyBUaGlzIGlzIGxlc3Mgc3RyaWN0IHRoYXQgdGhlIGxvb3AgInByZWhlYWRlciIgY29uY2VwdCwgd2hpY2ggcmVxdWlyZXMKKy8vLyB0aGUgcHJlZGVjZXNzb3IgdG8gaGF2ZSBleGFjdGx5IG9uZSBzdWNjZXNzb3IuCisvLy8KK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGNsYXNzIExvb3BUPgorQmxvY2tUICpMb29wQmFzZTxCbG9ja1QsIExvb3BUPjo6Z2V0TG9vcFByZWRlY2Vzc29yKCkgY29uc3QgeworICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICAvLyBLZWVwIHRyYWNrIG9mIG5vZGVzIG91dHNpZGUgdGhlIGxvb3AgYnJhbmNoaW5nIHRvIHRoZSBoZWFkZXIuLi4KKyAgQmxvY2tUICpPdXQgPSBudWxscHRyOworCisgIC8vIExvb3Agb3ZlciB0aGUgcHJlZGVjZXNzb3JzIG9mIHRoZSBoZWFkZXIgbm9kZS4uLgorICBCbG9ja1QgKkhlYWRlciA9IGdldEhlYWRlcigpOworICBmb3IgKGNvbnN0IGF1dG8gUHJlZCA6IGNoaWxkcmVuPEludmVyc2U8QmxvY2tUICo+PihIZWFkZXIpKSB7CisgICAgaWYgKCFjb250YWlucyhQcmVkKSkgeyAvLyBJZiB0aGUgYmxvY2sgaXMgbm90IGluIHRoZSBsb29wLi4uCisgICAgICBpZiAoT3V0ICYmIE91dCAhPSBQcmVkKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsgLy8gTXVsdGlwbGUgcHJlZGVjZXNzb3JzIG91dHNpZGUgdGhlIGxvb3AKKyAgICAgIE91dCA9IFByZWQ7CisgICAgfQorICB9CisKKyAgLy8gTWFrZSBzdXJlIHRoZXJlIGlzIG9ubHkgb25lIGV4aXQgb3V0IG9mIHRoZSBwcmVoZWFkZXIuCisgIGFzc2VydChPdXQgJiYgIkhlYWRlciBvZiBsb29wIGhhcyBubyBwcmVkZWNlc3NvcnMgZnJvbSBvdXRzaWRlIGxvb3A/Iik7CisgIHJldHVybiBPdXQ7Cit9CisKKy8vLyBnZXRMb29wTGF0Y2ggLSBJZiB0aGVyZSBpcyBhIHNpbmdsZSBsYXRjaCBibG9jayBmb3IgdGhpcyBsb29wLCByZXR1cm4gaXQuCisvLy8gQSBsYXRjaCBibG9jayBpcyBhIGJsb2NrIHRoYXQgY29udGFpbnMgYSBicmFuY2ggYmFjayB0byB0aGUgaGVhZGVyLgordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+CitCbG9ja1QgKkxvb3BCYXNlPEJsb2NrVCwgTG9vcFQ+OjpnZXRMb29wTGF0Y2goKSBjb25zdCB7CisgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgIEJsb2NrVCAqSGVhZGVyID0gZ2V0SGVhZGVyKCk7CisgIEJsb2NrVCAqTGF0Y2ggPSBudWxscHRyOworICBmb3IgKGNvbnN0IGF1dG8gUHJlZCA6IGNoaWxkcmVuPEludmVyc2U8QmxvY2tUICo+PihIZWFkZXIpKSB7CisgICAgaWYgKGNvbnRhaW5zKFByZWQpKSB7CisgICAgICBpZiAoTGF0Y2gpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgTGF0Y2ggPSBQcmVkOworICAgIH0KKyAgfQorCisgIHJldHVybiBMYXRjaDsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFQSXMgZm9yIHVwZGF0aW5nIGxvb3AgaW5mb3JtYXRpb24gYWZ0ZXIgY2hhbmdpbmcgdGhlIENGRworLy8KKworLy8vIGFkZEJhc2ljQmxvY2tUb0xvb3AgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IG90aGVyIGFuYWx5c2VzIHRvIHVwZGF0ZSBsb29wCisvLy8gaW5mb3JtYXRpb24uICBOZXdCQiBpcyBzZXQgdG8gYmUgYSBuZXcgbWVtYmVyIG9mIHRoZSBjdXJyZW50IGxvb3AuCisvLy8gQmVjYXVzZSBvZiB0aGlzLCBpdCBpcyBhZGRlZCBhcyBhIG1lbWJlciBvZiBhbGwgcGFyZW50IGxvb3BzLCBhbmQgaXMgYWRkZWQKKy8vLyB0byB0aGUgc3BlY2lmaWVkIExvb3BJbmZvIG9iamVjdCBhcyBiZWluZyBpbiB0aGUgY3VycmVudCBiYXNpYyBibG9jay4gIEl0CisvLy8gaXMgbm90IHZhbGlkIHRvIHJlcGxhY2UgdGhlIGxvb3AgaGVhZGVyIHdpdGggdGhpcyBtZXRob2QuCisvLy8KK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGNsYXNzIExvb3BUPgordm9pZCBMb29wQmFzZTxCbG9ja1QsIExvb3BUPjo6YWRkQmFzaWNCbG9ja1RvTG9vcCgKKyAgICBCbG9ja1QgKk5ld0JCLCBMb29wSW5mb0Jhc2U8QmxvY2tULCBMb29wVD4gJkxJQikgeworICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworI2lmbmRlZiBOREVCVUcKKyAgaWYgKCFCbG9ja3MuZW1wdHkoKSkgeworICAgIGF1dG8gU2FtZUhlYWRlciA9IExJQltnZXRIZWFkZXIoKV07CisgICAgYXNzZXJ0KGNvbnRhaW5zKFNhbWVIZWFkZXIpICYmIGdldEhlYWRlcigpID09IFNhbWVIZWFkZXItPmdldEhlYWRlcigpICYmCisgICAgICAgICAgICJJbmNvcnJlY3QgTEkgc3BlY2lmaWVkIGZvciB0aGlzIGxvb3AhIik7CisgIH0KKyNlbmRpZgorICBhc3NlcnQoTmV3QkIgJiYgIkNhbm5vdCBhZGQgYSBudWxsIGJhc2ljIGJsb2NrIHRvIHRoZSBsb29wISIpOworICBhc3NlcnQoIUxJQltOZXdCQl0gJiYgIkJhc2ljQmxvY2sgYWxyZWFkeSBpbiB0aGUgbG9vcCEiKTsKKworICBMb29wVCAqTCA9IHN0YXRpY19jYXN0PExvb3BUICo+KHRoaXMpOworCisgIC8vIEFkZCB0aGUgbG9vcCBtYXBwaW5nIHRvIHRoZSBMb29wSW5mbyBvYmplY3QuLi4KKyAgTElCLkJCTWFwW05ld0JCXSA9IEw7CisKKyAgLy8gQWRkIHRoZSBiYXNpYyBibG9jayB0byB0aGlzIGxvb3AgYW5kIGFsbCBwYXJlbnQgbG9vcHMuLi4KKyAgd2hpbGUgKEwpIHsKKyAgICBMLT5hZGRCbG9ja0VudHJ5KE5ld0JCKTsKKyAgICBMID0gTC0+Z2V0UGFyZW50TG9vcCgpOworICB9Cit9CisKKy8vLyByZXBsYWNlQ2hpbGRMb29wV2l0aCAtIFRoaXMgaXMgdXNlZCB3aGVuIHNwbGl0dGluZyBsb29wcyB1cC4gIEl0IHJlcGxhY2VzCisvLy8gdGhlIE9sZENoaWxkIGVudHJ5IGluIG91ciBjaGlsZHJlbiBsaXN0IHdpdGggTmV3Q2hpbGQsIGFuZCB1cGRhdGVzIHRoZQorLy8vIHBhcmVudCBwb2ludGVyIG9mIE9sZENoaWxkIHRvIGJlIG51bGwgYW5kIHRoZSBOZXdDaGlsZCB0byBiZSB0aGlzIGxvb3AuCisvLy8gVGhpcyB1cGRhdGVzIHRoZSBsb29wIGRlcHRoIG9mIHRoZSBuZXcgY2hpbGQuCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBjbGFzcyBMb29wVD4KK3ZvaWQgTG9vcEJhc2U8QmxvY2tULCBMb29wVD46OnJlcGxhY2VDaGlsZExvb3BXaXRoKExvb3BUICpPbGRDaGlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BUICpOZXdDaGlsZCkgeworICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworICBhc3NlcnQoT2xkQ2hpbGQtPlBhcmVudExvb3AgPT0gdGhpcyAmJiAiVGhpcyBsb29wIGlzIGFscmVhZHkgYnJva2VuISIpOworICBhc3NlcnQoIU5ld0NoaWxkLT5QYXJlbnRMb29wICYmICJOZXdDaGlsZCBhbHJlYWR5IGhhcyBhIHBhcmVudCEiKTsKKyAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8TG9vcFQgKj46Oml0ZXJhdG9yIEkgPSBmaW5kKFN1Ykxvb3BzLCBPbGRDaGlsZCk7CisgIGFzc2VydChJICE9IFN1Ykxvb3BzLmVuZCgpICYmICJPbGRDaGlsZCBub3QgaW4gbG9vcCEiKTsKKyAgKkkgPSBOZXdDaGlsZDsKKyAgT2xkQ2hpbGQtPlBhcmVudExvb3AgPSBudWxscHRyOworICBOZXdDaGlsZC0+UGFyZW50TG9vcCA9IHN0YXRpY19jYXN0PExvb3BUICo+KHRoaXMpOworfQorCisvLy8gdmVyaWZ5TG9vcCAtIFZlcmlmeSBsb29wIHN0cnVjdHVyZQordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+Cit2b2lkIExvb3BCYXNlPEJsb2NrVCwgTG9vcFQ+Ojp2ZXJpZnlMb29wKCkgY29uc3QgeworICBhc3NlcnQoIWlzSW52YWxpZCgpICYmICJMb29wIG5vdCBpbiBhIHZhbGlkIHN0YXRlISIpOworI2lmbmRlZiBOREVCVUcKKyAgYXNzZXJ0KCFCbG9ja3MuZW1wdHkoKSAmJiAiTG9vcCBoZWFkZXIgaXMgbWlzc2luZyIpOworCisgIC8vIFNldHVwIGZvciB1c2luZyBhIGRlcHRoLWZpcnN0IGl0ZXJhdG9yIHRvIHZpc2l0IGV2ZXJ5IGJsb2NrIGluIHRoZSBsb29wLgorICBTbWFsbFZlY3RvcjxCbG9ja1QgKiwgOD4gRXhpdEJCczsKKyAgZ2V0RXhpdEJsb2NrcyhFeGl0QkJzKTsKKyAgZGZfaXRlcmF0b3JfZGVmYXVsdF9zZXQ8QmxvY2tUICo+IFZpc2l0U2V0OworICBWaXNpdFNldC5pbnNlcnQoRXhpdEJCcy5iZWdpbigpLCBFeGl0QkJzLmVuZCgpKTsKKyAgZGZfZXh0X2l0ZXJhdG9yPEJsb2NrVCAqLCBkZl9pdGVyYXRvcl9kZWZhdWx0X3NldDxCbG9ja1QgKj4+CisgICAgICBCSSA9IGRmX2V4dF9iZWdpbihnZXRIZWFkZXIoKSwgVmlzaXRTZXQpLAorICAgICAgQkUgPSBkZl9leHRfZW5kKGdldEhlYWRlcigpLCBWaXNpdFNldCk7CisKKyAgLy8gS2VlcCB0cmFjayBvZiB0aGUgQkJzIHZpc2l0ZWQuCisgIFNtYWxsUHRyU2V0PEJsb2NrVCAqLCA4PiBWaXNpdGVkQkJzOworCisgIC8vIENoZWNrIHRoZSBpbmRpdmlkdWFsIGJsb2Nrcy4KKyAgZm9yICg7IEJJICE9IEJFOyArK0JJKSB7CisgICAgQmxvY2tUICpCQiA9ICpCSTsKKworICAgIGFzc2VydChzdGQ6OmFueV9vZihHcmFwaFRyYWl0czxCbG9ja1QgKj46OmNoaWxkX2JlZ2luKEJCKSwKKyAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhUcmFpdHM8QmxvY2tUICo+OjpjaGlsZF9lbmQoQkIpLAorICAgICAgICAgICAgICAgICAgICAgICBbJl0oQmxvY2tUICpCKSB7IHJldHVybiBjb250YWlucyhCKTsgfSkgJiYKKyAgICAgICAgICAgIkxvb3AgYmxvY2sgaGFzIG5vIGluLWxvb3Agc3VjY2Vzc29ycyEiKTsKKworICAgIGFzc2VydChzdGQ6OmFueV9vZihHcmFwaFRyYWl0czxJbnZlcnNlPEJsb2NrVCAqPj46OmNoaWxkX2JlZ2luKEJCKSwKKyAgICAgICAgICAgICAgICAgICAgICAgR3JhcGhUcmFpdHM8SW52ZXJzZTxCbG9ja1QgKj4+OjpjaGlsZF9lbmQoQkIpLAorICAgICAgICAgICAgICAgICAgICAgICBbJl0oQmxvY2tUICpCKSB7IHJldHVybiBjb250YWlucyhCKTsgfSkgJiYKKyAgICAgICAgICAgIkxvb3AgYmxvY2sgaGFzIG5vIGluLWxvb3AgcHJlZGVjZXNzb3JzISIpOworCisgICAgU21hbGxWZWN0b3I8QmxvY2tUICosIDI+IE91dHNpZGVMb29wUHJlZHM7CisgICAgc3RkOjpmb3JfZWFjaChHcmFwaFRyYWl0czxJbnZlcnNlPEJsb2NrVCAqPj46OmNoaWxkX2JlZ2luKEJCKSwKKyAgICAgICAgICAgICAgICAgIEdyYXBoVHJhaXRzPEludmVyc2U8QmxvY2tUICo+Pjo6Y2hpbGRfZW5kKEJCKSwKKyAgICAgICAgICAgICAgICAgIFsmXShCbG9ja1QgKkIpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFjb250YWlucyhCKSkKKyAgICAgICAgICAgICAgICAgICAgICBPdXRzaWRlTG9vcFByZWRzLnB1c2hfYmFjayhCKTsKKyAgICAgICAgICAgICAgICAgIH0pOworCisgICAgaWYgKEJCID09IGdldEhlYWRlcigpKSB7CisgICAgICBhc3NlcnQoIU91dHNpZGVMb29wUHJlZHMuZW1wdHkoKSAmJiAiTG9vcCBpcyB1bnJlYWNoYWJsZSEiKTsKKyAgICB9IGVsc2UgaWYgKCFPdXRzaWRlTG9vcFByZWRzLmVtcHR5KCkpIHsKKyAgICAgIC8vIEEgbm9uLWhlYWRlciBsb29wIHNob3VsZG4ndCBiZSByZWFjaGFibGUgZnJvbSBvdXRzaWRlIHRoZSBsb29wLAorICAgICAgLy8gdGhvdWdoIGl0IGlzIHBlcm1pdHRlZCBpZiB0aGUgcHJlZGVjZXNzb3IgaXMgbm90IGl0c2VsZiBhY3R1YWxseQorICAgICAgLy8gcmVhY2hhYmxlLgorICAgICAgQmxvY2tUICpFbnRyeUJCID0gJkJCLT5nZXRQYXJlbnQoKS0+ZnJvbnQoKTsKKyAgICAgIGZvciAoQmxvY2tUICpDQiA6IGRlcHRoX2ZpcnN0KEVudHJ5QkIpKQorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gT3V0c2lkZUxvb3BQcmVkcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgICAgIGFzc2VydChDQiAhPSBPdXRzaWRlTG9vcFByZWRzW2ldICYmCisgICAgICAgICAgICAgICAgICJMb29wIGhhcyBtdWx0aXBsZSBlbnRyeSBwb2ludHMhIik7CisgICAgfQorICAgIGFzc2VydChCQiAhPSAmZ2V0SGVhZGVyKCktPmdldFBhcmVudCgpLT5mcm9udCgpICYmCisgICAgICAgICAgICJMb29wIGNvbnRhaW5zIGZ1bmN0aW9uIGVudHJ5IGJsb2NrISIpOworCisgICAgVmlzaXRlZEJCcy5pbnNlcnQoQkIpOworICB9CisKKyAgaWYgKFZpc2l0ZWRCQnMuc2l6ZSgpICE9IGdldE51bUJsb2NrcygpKSB7CisgICAgZGJncygpIDw8ICJUaGUgZm9sbG93aW5nIGJsb2NrcyBhcmUgdW5yZWFjaGFibGUgaW4gdGhlIGxvb3A6ICI7CisgICAgZm9yIChhdXRvIEJCIDogQmxvY2tzKSB7CisgICAgICBpZiAoIVZpc2l0ZWRCQnMuY291bnQoQkIpKSB7CisgICAgICAgIGRiZ3MoKSA8PCAqQkIgPDwgIlxuIjsKKyAgICAgIH0KKyAgICB9CisgICAgYXNzZXJ0KGZhbHNlICYmICJVbnJlYWNoYWJsZSBibG9jayBpbiBsb29wIik7CisgIH0KKworICAvLyBDaGVjayB0aGUgc3VibG9vcHMuCisgIGZvciAoaXRlcmF0b3IgSSA9IGJlZ2luKCksIEUgPSBlbmQoKTsgSSAhPSBFOyArK0kpCisgICAgLy8gRWFjaCBibG9jayBpbiBlYWNoIHN1Ymxvb3Agc2hvdWxkIGJlIGNvbnRhaW5lZCB3aXRoaW4gdGhpcyBsb29wLgorICAgIGZvciAoYmxvY2tfaXRlcmF0b3IgQkkgPSAoKkkpLT5ibG9ja19iZWdpbigpLCBCRSA9ICgqSSktPmJsb2NrX2VuZCgpOworICAgICAgICAgQkkgIT0gQkU7ICsrQkkpIHsKKyAgICAgIGFzc2VydChjb250YWlucygqQkkpICYmCisgICAgICAgICAgICAgIkxvb3AgZG9lcyBub3QgY29udGFpbiBhbGwgdGhlIGJsb2NrcyBvZiBhIHN1Ymxvb3AhIik7CisgICAgfQorCisgIC8vIENoZWNrIHRoZSBwYXJlbnQgbG9vcCBwb2ludGVyLgorICBpZiAoUGFyZW50TG9vcCkgeworICAgIGFzc2VydChpc19jb250YWluZWQoKlBhcmVudExvb3AsIHRoaXMpICYmCisgICAgICAgICAgICJMb29wIGlzIG5vdCBhIHN1Ymxvb3Agb2YgaXRzIHBhcmVudCEiKTsKKyAgfQorI2VuZGlmCit9CisKKy8vLyB2ZXJpZnlMb29wIC0gVmVyaWZ5IGxvb3Agc3RydWN0dXJlIG9mIHRoaXMgbG9vcCBhbmQgYWxsIG5lc3RlZCBsb29wcy4KK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGNsYXNzIExvb3BUPgordm9pZCBMb29wQmFzZTxCbG9ja1QsIExvb3BUPjo6dmVyaWZ5TG9vcE5lc3QoCisgICAgRGVuc2VTZXQ8Y29uc3QgTG9vcFQgKj4gKkxvb3BzKSBjb25zdCB7CisgIGFzc2VydCghaXNJbnZhbGlkKCkgJiYgIkxvb3Agbm90IGluIGEgdmFsaWQgc3RhdGUhIik7CisgIExvb3BzLT5pbnNlcnQoc3RhdGljX2Nhc3Q8Y29uc3QgTG9vcFQgKj4odGhpcykpOworICAvLyBWZXJpZnkgdGhpcyBsb29wLgorICB2ZXJpZnlMb29wKCk7CisgIC8vIFZlcmlmeSB0aGUgc3VibG9vcHMuCisgIGZvciAoaXRlcmF0b3IgSSA9IGJlZ2luKCksIEUgPSBlbmQoKTsgSSAhPSBFOyArK0kpCisgICAgKCpJKS0+dmVyaWZ5TG9vcE5lc3QoTG9vcHMpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBjbGFzcyBMb29wVD4KK3ZvaWQgTG9vcEJhc2U8QmxvY2tULCBMb29wVD46OnByaW50KHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgRGVwdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFZlcmJvc2UpIGNvbnN0IHsKKyAgT1MuaW5kZW50KERlcHRoICogMikgPDwgIkxvb3AgYXQgZGVwdGggIiA8PCBnZXRMb29wRGVwdGgoKSA8PCAiIGNvbnRhaW5pbmc6ICI7CisKKyAgQmxvY2tUICpIID0gZ2V0SGVhZGVyKCk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBnZXRCbG9ja3MoKS5zaXplKCk7ICsraSkgeworICAgIEJsb2NrVCAqQkIgPSBnZXRCbG9ja3MoKVtpXTsKKyAgICBpZiAoIVZlcmJvc2UpIHsKKyAgICAgIGlmIChpKQorICAgICAgICBPUyA8PCAiLCI7CisgICAgICBCQi0+cHJpbnRBc09wZXJhbmQoT1MsIGZhbHNlKTsKKyAgICB9IGVsc2UKKyAgICAgIE9TIDw8ICJcbiI7CisKKyAgICBpZiAoQkIgPT0gSCkKKyAgICAgIE9TIDw8ICI8aGVhZGVyPiI7CisgICAgaWYgKGlzTG9vcExhdGNoKEJCKSkKKyAgICAgIE9TIDw8ICI8bGF0Y2g+IjsKKyAgICBpZiAoaXNMb29wRXhpdGluZyhCQikpCisgICAgICBPUyA8PCAiPGV4aXRpbmc+IjsKKyAgICBpZiAoVmVyYm9zZSkKKyAgICAgIEJCLT5wcmludChPUyk7CisgIH0KKyAgT1MgPDwgIlxuIjsKKworICBmb3IgKGl0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKytJKQorICAgICgqSSktPnByaW50KE9TLCBEZXB0aCArIDIpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFN0YWJsZSBMb29wSW5mbyBBbmFseXNpcyAtIEJ1aWxkIGEgbG9vcCB0cmVlIHVzaW5nIHN0YWJsZSBpdGVyYXRvcnMgc28gdGhlCisvLy8gcmVzdWx0IGRvZXMgLyBub3QgZGVwZW5kIG9uIHVzZSBsaXN0IChibG9jayBwcmVkZWNlc3Nvcikgb3JkZXIuCisvLy8KKworLy8vIERpc2NvdmVyIGEgc3VibG9vcCB3aXRoIHRoZSBzcGVjaWZpZWQgYmFja2VkZ2VzIHN1Y2ggdGhhdDogQWxsIGJsb2NrcyB3aXRoaW4KKy8vLyB0aGlzIGxvb3AgYXJlIG1hcHBlZCB0byB0aGlzIGxvb3Agb3IgYSBzdWJsb29wLiBBbmQgYWxsIHN1Ymxvb3BzIHdpdGhpbiB0aGlzCisvLy8gbG9vcCBoYXZlIHRoZWlyIHBhcmVudCBsb29wIHNldCB0byB0aGlzIGxvb3Agb3IgYSBzdWJsb29wLgordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+CitzdGF0aWMgdm9pZCBkaXNjb3ZlckFuZE1hcFN1Ymxvb3AoTG9vcFQgKkwsIEFycmF5UmVmPEJsb2NrVCAqPiBCYWNrZWRnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcEluZm9CYXNlPEJsb2NrVCwgTG9vcFQ+ICpMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21UcmVlQmFzZTxCbG9ja1Q+ICZEb21UcmVlKSB7CisgIHR5cGVkZWYgR3JhcGhUcmFpdHM8SW52ZXJzZTxCbG9ja1QgKj4+IEludkJsb2NrVHJhaXRzOworCisgIHVuc2lnbmVkIE51bUJsb2NrcyA9IDA7CisgIHVuc2lnbmVkIE51bVN1Ymxvb3BzID0gMDsKKworICAvLyBQZXJmb3JtIGEgYmFja3dhcmQgQ0ZHIHRyYXZlcnNhbCB1c2luZyBhIHdvcmtsaXN0LgorICBzdGQ6OnZlY3RvcjxCbG9ja1QgKj4gUmV2ZXJzZUNGR1dvcmtsaXN0KEJhY2tlZGdlcy5iZWdpbigpLCBCYWNrZWRnZXMuZW5kKCkpOworICB3aGlsZSAoIVJldmVyc2VDRkdXb3JrbGlzdC5lbXB0eSgpKSB7CisgICAgQmxvY2tUICpQcmVkQkIgPSBSZXZlcnNlQ0ZHV29ya2xpc3QuYmFjaygpOworICAgIFJldmVyc2VDRkdXb3JrbGlzdC5wb3BfYmFjaygpOworCisgICAgTG9vcFQgKlN1Ymxvb3AgPSBMSS0+Z2V0TG9vcEZvcihQcmVkQkIpOworICAgIGlmICghU3VibG9vcCkgeworICAgICAgaWYgKCFEb21UcmVlLmlzUmVhY2hhYmxlRnJvbUVudHJ5KFByZWRCQikpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvLyBUaGlzIGlzIGFuIHVuZGlzY292ZXJlZCBibG9jay4gTWFwIGl0IHRvIHRoZSBjdXJyZW50IGxvb3AuCisgICAgICBMSS0+Y2hhbmdlTG9vcEZvcihQcmVkQkIsIEwpOworICAgICAgKytOdW1CbG9ja3M7CisgICAgICBpZiAoUHJlZEJCID09IEwtPmdldEhlYWRlcigpKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIC8vIFB1c2ggYWxsIGJsb2NrIHByZWRlY2Vzc29ycyBvbiB0aGUgd29ya2xpc3QuCisgICAgICBSZXZlcnNlQ0ZHV29ya2xpc3QuaW5zZXJ0KFJldmVyc2VDRkdXb3JrbGlzdC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52QmxvY2tUcmFpdHM6OmNoaWxkX2JlZ2luKFByZWRCQiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludkJsb2NrVHJhaXRzOjpjaGlsZF9lbmQoUHJlZEJCKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoaXMgaXMgYSBkaXNjb3ZlcmVkIGJsb2NrLiBGaW5kIGl0cyBvdXRlcm1vc3QgZGlzY292ZXJlZCBsb29wLgorICAgICAgd2hpbGUgKExvb3BUICpQYXJlbnQgPSBTdWJsb29wLT5nZXRQYXJlbnRMb29wKCkpCisgICAgICAgIFN1Ymxvb3AgPSBQYXJlbnQ7CisKKyAgICAgIC8vIElmIGl0IGlzIGFscmVhZHkgZGlzY292ZXJlZCB0byBiZSBhIHN1Ymxvb3Agb2YgdGhpcyBsb29wLCBjb250aW51ZS4KKyAgICAgIGlmIChTdWJsb29wID09IEwpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvLyBEaXNjb3ZlciBhIHN1Ymxvb3Agb2YgdGhpcyBsb29wLgorICAgICAgU3VibG9vcC0+c2V0UGFyZW50TG9vcChMKTsKKyAgICAgICsrTnVtU3VibG9vcHM7CisgICAgICBOdW1CbG9ja3MgKz0gU3VibG9vcC0+Z2V0QmxvY2tzVmVjdG9yKCkuY2FwYWNpdHkoKTsKKyAgICAgIFByZWRCQiA9IFN1Ymxvb3AtPmdldEhlYWRlcigpOworICAgICAgLy8gQ29udGludWUgdHJhdmVyc2FsIGFsb25nIHByZWRlY2Vzc29ycyB0aGF0IGFyZSBub3QgbG9vcC1iYWNrIGVkZ2VzIGZyb20KKyAgICAgIC8vIHdpdGhpbiB0aGlzIHN1Ymxvb3AgdHJlZSBpdHNlbGYuIE5vdGUgdGhhdCBhIHByZWRlY2Vzc29yIG1heSBkaXJlY3RseQorICAgICAgLy8gcmVhY2ggYW5vdGhlciBzdWJsb29wIHRoYXQgaXMgbm90IHlldCBkaXNjb3ZlcmVkIHRvIGJlIGEgc3VibG9vcCBvZgorICAgICAgLy8gdGhpcyBsb29wLCB3aGljaCB3ZSBtdXN0IHRyYXZlcnNlLgorICAgICAgZm9yIChjb25zdCBhdXRvIFByZWQgOiBjaGlsZHJlbjxJbnZlcnNlPEJsb2NrVCAqPj4oUHJlZEJCKSkgeworICAgICAgICBpZiAoTEktPmdldExvb3BGb3IoUHJlZCkgIT0gU3VibG9vcCkKKyAgICAgICAgICBSZXZlcnNlQ0ZHV29ya2xpc3QucHVzaF9iYWNrKFByZWQpOworICAgICAgfQorICAgIH0KKyAgfQorICBMLT5nZXRTdWJMb29wc1ZlY3RvcigpLnJlc2VydmUoTnVtU3VibG9vcHMpOworICBMLT5yZXNlcnZlQmxvY2tzKE51bUJsb2Nrcyk7Cit9CisKKy8vLyBQb3B1bGF0ZSBhbGwgbG9vcCBkYXRhIGluIGEgc3RhYmxlIG9yZGVyIGR1cmluZyBhIHNpbmdsZSBmb3J3YXJkIERGUy4KK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGNsYXNzIExvb3BUPiBjbGFzcyBQb3B1bGF0ZUxvb3BzREZTIHsKKyAgdHlwZWRlZiBHcmFwaFRyYWl0czxCbG9ja1QgKj4gQmxvY2tUcmFpdHM7CisgIHR5cGVkZWYgdHlwZW5hbWUgQmxvY2tUcmFpdHM6OkNoaWxkSXRlcmF0b3JUeXBlIFN1Y2NJdGVyVHk7CisKKyAgTG9vcEluZm9CYXNlPEJsb2NrVCwgTG9vcFQ+ICpMSTsKKworcHVibGljOgorICBQb3B1bGF0ZUxvb3BzREZTKExvb3BJbmZvQmFzZTxCbG9ja1QsIExvb3BUPiAqbGkpIDogTEkobGkpIHt9CisKKyAgdm9pZCB0cmF2ZXJzZShCbG9ja1QgKkVudHJ5QmxvY2spOworCitwcm90ZWN0ZWQ6CisgIHZvaWQgaW5zZXJ0SW50b0xvb3AoQmxvY2tUICpCbG9jayk7Cit9OworCisvLy8gVG9wLWxldmVsIGRyaXZlciBmb3IgdGhlIGZvcndhcmQgREZTIHdpdGhpbiB0aGUgbG9vcC4KK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGNsYXNzIExvb3BUPgordm9pZCBQb3B1bGF0ZUxvb3BzREZTPEJsb2NrVCwgTG9vcFQ+Ojp0cmF2ZXJzZShCbG9ja1QgKkVudHJ5QmxvY2spIHsKKyAgZm9yIChCbG9ja1QgKkJCIDogcG9zdF9vcmRlcihFbnRyeUJsb2NrKSkKKyAgICBpbnNlcnRJbnRvTG9vcChCQik7Cit9CisKKy8vLyBBZGQgYSBzaW5nbGUgQmxvY2sgdG8gaXRzIGFuY2VzdG9yIGxvb3BzIGluIFBvc3RPcmRlci4gSWYgdGhlIGJsb2NrIGlzIGEKKy8vLyBzdWJsb29wIGhlYWRlciwgYWRkIHRoZSBzdWJsb29wIHRvIGl0cyBwYXJlbnQgaW4gUG9zdE9yZGVyLCB0aGVuIHJldmVyc2UgdGhlCisvLy8gQmxvY2sgYW5kIFN1Ymxvb3AgdmVjdG9ycyBvZiB0aGUgbm93IGNvbXBsZXRlIHN1Ymxvb3AgdG8gYWNoaWV2ZSBSUE8uCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBjbGFzcyBMb29wVD4KK3ZvaWQgUG9wdWxhdGVMb29wc0RGUzxCbG9ja1QsIExvb3BUPjo6aW5zZXJ0SW50b0xvb3AoQmxvY2tUICpCbG9jaykgeworICBMb29wVCAqU3VibG9vcCA9IExJLT5nZXRMb29wRm9yKEJsb2NrKTsKKyAgaWYgKFN1Ymxvb3AgJiYgQmxvY2sgPT0gU3VibG9vcC0+Z2V0SGVhZGVyKCkpIHsKKyAgICAvLyBXZSByZWFjaCB0aGlzIHBvaW50IG9uY2UgcGVyIHN1Ymxvb3AgYWZ0ZXIgcHJvY2Vzc2luZyBhbGwgdGhlIGJsb2NrcyBpbgorICAgIC8vIHRoZSBzdWJsb29wLgorICAgIGlmIChTdWJsb29wLT5nZXRQYXJlbnRMb29wKCkpCisgICAgICBTdWJsb29wLT5nZXRQYXJlbnRMb29wKCktPmdldFN1Ykxvb3BzVmVjdG9yKCkucHVzaF9iYWNrKFN1Ymxvb3ApOworICAgIGVsc2UKKyAgICAgIExJLT5hZGRUb3BMZXZlbExvb3AoU3VibG9vcCk7CisKKyAgICAvLyBGb3IgY29udmVuaWVuY2UsIEJsb2NrcyBhbmQgU3VibG9vcHMgYXJlIGluc2VydGVkIGluIHBvc3RvcmRlci4gUmV2ZXJzZQorICAgIC8vIHRoZSBsaXN0cywgZXhjZXB0IGZvciB0aGUgbG9vcCBoZWFkZXIsIHdoaWNoIGlzIGFsd2F5cyBhdCB0aGUgYmVnaW5uaW5nLgorICAgIFN1Ymxvb3AtPnJldmVyc2VCbG9jaygxKTsKKyAgICBzdGQ6OnJldmVyc2UoU3VibG9vcC0+Z2V0U3ViTG9vcHNWZWN0b3IoKS5iZWdpbigpLAorICAgICAgICAgICAgICAgICBTdWJsb29wLT5nZXRTdWJMb29wc1ZlY3RvcigpLmVuZCgpKTsKKworICAgIFN1Ymxvb3AgPSBTdWJsb29wLT5nZXRQYXJlbnRMb29wKCk7CisgIH0KKyAgZm9yICg7IFN1Ymxvb3A7IFN1Ymxvb3AgPSBTdWJsb29wLT5nZXRQYXJlbnRMb29wKCkpCisgICAgU3VibG9vcC0+YWRkQmxvY2tFbnRyeShCbG9jayk7Cit9CisKKy8vLyBBbmFseXplIExvb3BJbmZvIGRpc2NvdmVycyBsb29wcyBkdXJpbmcgYSBwb3N0b3JkZXIgRG9taW5hdG9yVHJlZSB0cmF2ZXJzYWwKKy8vLyBpbnRlcmxlYXZlZCB3aXRoIGJhY2t3YXJkIENGRyB0cmF2ZXJzYWxzIHdpdGhpbiBlYWNoIHN1Ymxvb3AKKy8vLyAoZGlzY292ZXJBbmRNYXBTdWJsb29wKS4gVGhlIGJhY2t3YXJkIHRyYXZlcnNhbCBza2lwcyBpbm5lciBzdWJsb29wcywgc28KKy8vLyB0aGlzIHBhcnQgb2YgdGhlIGFsZ29yaXRobSBpcyBsaW5lYXIgaW4gdGhlIG51bWJlciBvZiBDRkcgZWRnZXMuIFN1Ymxvb3AgYW5kCisvLy8gQmxvY2sgdmVjdG9ycyBhcmUgdGhlbiBwb3B1bGF0ZWQgZHVyaW5nIGEgc2luZ2xlIGZvcndhcmQgQ0ZHIHRyYXZlcnNhbAorLy8vIChQb3B1bGF0ZUxvb3BERlMpLgorLy8vCisvLy8gRHVyaW5nIHRoZSB0d28gQ0ZHIHRyYXZlcnNhbHMgZWFjaCBibG9jayBpcyBzZWVuIHRocmVlIHRpbWVzOgorLy8vIDEpIERpc2NvdmVyZWQgYW5kIG1hcHBlZCBieSBhIHJldmVyc2UgQ0ZHIHRyYXZlcnNhbC4KKy8vLyAyKSBWaXNpdGVkIGR1cmluZyBhIGZvcndhcmQgREZTIENGRyB0cmF2ZXJzYWwuCisvLy8gMykgUmV2ZXJzZS1pbnNlcnRlZCBpbiB0aGUgbG9vcCBpbiBwb3N0b3JkZXIgZm9sbG93aW5nIGZvcndhcmQgREZTLgorLy8vCisvLy8gVGhlIEJsb2NrIHZlY3RvcnMgYXJlIGluY2x1c2l2ZSwgc28gc3RlcCAzIHJlcXVpcmVzIGxvb3AtZGVwdGggbnVtYmVyIG9mCisvLy8gaW5zZXJ0aW9ucyBwZXIgYmxvY2suCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBjbGFzcyBMb29wVD4KK3ZvaWQgTG9vcEluZm9CYXNlPEJsb2NrVCwgTG9vcFQ+OjphbmFseXplKGNvbnN0IERvbVRyZWVCYXNlPEJsb2NrVD4gJkRvbVRyZWUpIHsKKyAgLy8gUG9zdG9yZGVyIHRyYXZlcnNhbCBvZiB0aGUgZG9taW5hdG9yIHRyZWUuCisgIGNvbnN0IERvbVRyZWVOb2RlQmFzZTxCbG9ja1Q+ICpEb21Sb290ID0gRG9tVHJlZS5nZXRSb290Tm9kZSgpOworICBmb3IgKGF1dG8gRG9tTm9kZSA6IHBvc3Rfb3JkZXIoRG9tUm9vdCkpIHsKKworICAgIEJsb2NrVCAqSGVhZGVyID0gRG9tTm9kZS0+Z2V0QmxvY2soKTsKKyAgICBTbWFsbFZlY3RvcjxCbG9ja1QgKiwgND4gQmFja2VkZ2VzOworCisgICAgLy8gQ2hlY2sgZWFjaCBwcmVkZWNlc3NvciBvZiB0aGUgcG90ZW50aWFsIGxvb3AgaGVhZGVyLgorICAgIGZvciAoY29uc3QgYXV0byBCYWNrZWRnZSA6IGNoaWxkcmVuPEludmVyc2U8QmxvY2tUICo+PihIZWFkZXIpKSB7CisgICAgICAvLyBJZiBIZWFkZXIgZG9taW5hdGVzIHByZWRCQiwgdGhpcyBpcyBhIG5ldyBsb29wLiBDb2xsZWN0IHRoZSBiYWNrZWRnZXMuCisgICAgICBpZiAoRG9tVHJlZS5kb21pbmF0ZXMoSGVhZGVyLCBCYWNrZWRnZSkgJiYKKyAgICAgICAgICBEb21UcmVlLmlzUmVhY2hhYmxlRnJvbUVudHJ5KEJhY2tlZGdlKSkgeworICAgICAgICBCYWNrZWRnZXMucHVzaF9iYWNrKEJhY2tlZGdlKTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gUGVyZm9ybSBhIGJhY2t3YXJkIENGRyB0cmF2ZXJzYWwgdG8gZGlzY292ZXIgYW5kIG1hcCBibG9ja3MgaW4gdGhpcyBsb29wLgorICAgIGlmICghQmFja2VkZ2VzLmVtcHR5KCkpIHsKKyAgICAgIExvb3BUICpMID0gQWxsb2NhdGVMb29wKEhlYWRlcik7CisgICAgICBkaXNjb3ZlckFuZE1hcFN1Ymxvb3AoTCwgQXJyYXlSZWY8QmxvY2tUICo+KEJhY2tlZGdlcyksIHRoaXMsIERvbVRyZWUpOworICAgIH0KKyAgfQorICAvLyBQZXJmb3JtIGEgc2luZ2xlIGZvcndhcmQgQ0ZHIHRyYXZlcnNhbCB0byBwb3B1bGF0ZSBibG9jayBhbmQgc3VibG9vcAorICAvLyB2ZWN0b3JzIGZvciBhbGwgbG9vcHMuCisgIFBvcHVsYXRlTG9vcHNERlM8QmxvY2tULCBMb29wVD4gREZTKHRoaXMpOworICBERlMudHJhdmVyc2UoRG9tUm9vdC0+Z2V0QmxvY2soKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGNsYXNzIExvb3BUPgorU21hbGxWZWN0b3I8TG9vcFQgKiwgND4gTG9vcEluZm9CYXNlPEJsb2NrVCwgTG9vcFQ+OjpnZXRMb29wc0luUHJlb3JkZXIoKSB7CisgIFNtYWxsVmVjdG9yPExvb3BUICosIDQ+IFByZU9yZGVyTG9vcHMsIFByZU9yZGVyV29ya2xpc3Q7CisgIC8vIFRoZSBvdXRlci1tb3N0IGxvb3AgYWN0dWFsbHkgZ29lcyBpbnRvIHRoZSByZXN1bHQgaW4gdGhlIHNhbWUgcmVsYXRpdmUKKyAgLy8gb3JkZXIgYXMgd2Ugd2FsayBpdC4gQnV0IExvb3BJbmZvIHN0b3JlcyB0aGUgdG9wIGxldmVsIGxvb3BzIGluIHJldmVyc2UKKyAgLy8gcHJvZ3JhbSBvcmRlciBzbyBmb3IgaGVyZSB3ZSByZXZlcnNlIGl0IHRvIGdldCBmb3J3YXJkIHByb2dyYW0gb3JkZXIuCisgIC8vIEZJWE1FOiBJZiB3ZSBjaGFuZ2UgdGhlIG9yZGVyIG9mIExvb3BJbmZvIHdlIHdpbGwgd2FudCB0byByZW1vdmUgdGhlCisgIC8vIHJldmVyc2UgaGVyZS4KKyAgZm9yIChMb29wVCAqUm9vdEwgOiByZXZlcnNlKCp0aGlzKSkgeworICAgIGFzc2VydChQcmVPcmRlcldvcmtsaXN0LmVtcHR5KCkgJiYKKyAgICAgICAgICAgIk11c3Qgc3RhcnQgd2l0aCBhbiBlbXB0eSBwcmVvcmRlciB3YWxrIHdvcmtsaXN0LiIpOworICAgIFByZU9yZGVyV29ya2xpc3QucHVzaF9iYWNrKFJvb3RMKTsKKyAgICBkbyB7CisgICAgICBMb29wVCAqTCA9IFByZU9yZGVyV29ya2xpc3QucG9wX2JhY2tfdmFsKCk7CisgICAgICAvLyBTdWItbG9vcHMgYXJlIHN0b3JlZCBpbiBmb3J3YXJkIHByb2dyYW0gb3JkZXIsIGJ1dCB3aWxsIHByb2Nlc3MgdGhlCisgICAgICAvLyB3b3JrbGlzdCBiYWNrd2FyZHMgc28gYXBwZW5kIHRoZW0gaW4gcmV2ZXJzZSBvcmRlci4KKyAgICAgIFByZU9yZGVyV29ya2xpc3QuYXBwZW5kKEwtPnJiZWdpbigpLCBMLT5yZW5kKCkpOworICAgICAgUHJlT3JkZXJMb29wcy5wdXNoX2JhY2soTCk7CisgICAgfSB3aGlsZSAoIVByZU9yZGVyV29ya2xpc3QuZW1wdHkoKSk7CisgIH0KKworICByZXR1cm4gUHJlT3JkZXJMb29wczsKK30KKwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+CitTbWFsbFZlY3RvcjxMb29wVCAqLCA0PgorTG9vcEluZm9CYXNlPEJsb2NrVCwgTG9vcFQ+OjpnZXRMb29wc0luUmV2ZXJzZVNpYmxpbmdQcmVvcmRlcigpIHsKKyAgU21hbGxWZWN0b3I8TG9vcFQgKiwgND4gUHJlT3JkZXJMb29wcywgUHJlT3JkZXJXb3JrbGlzdDsKKyAgLy8gVGhlIG91dGVyLW1vc3QgbG9vcCBhY3R1YWxseSBnb2VzIGludG8gdGhlIHJlc3VsdCBpbiB0aGUgc2FtZSByZWxhdGl2ZQorICAvLyBvcmRlciBhcyB3ZSB3YWxrIGl0LiBMb29wSW5mbyBzdG9yZXMgdGhlIHRvcCBsZXZlbCBsb29wcyBpbiByZXZlcnNlCisgIC8vIHByb2dyYW0gb3JkZXIgc28gd2Ugd2FsayBpbiBvcmRlciBoZXJlLgorICAvLyBGSVhNRTogSWYgd2UgY2hhbmdlIHRoZSBvcmRlciBvZiBMb29wSW5mbyB3ZSB3aWxsIHdhbnQgdG8gYWRkIGEgcmV2ZXJzZQorICAvLyBoZXJlLgorICBmb3IgKExvb3BUICpSb290TCA6ICp0aGlzKSB7CisgICAgYXNzZXJ0KFByZU9yZGVyV29ya2xpc3QuZW1wdHkoKSAmJgorICAgICAgICAgICAiTXVzdCBzdGFydCB3aXRoIGFuIGVtcHR5IHByZW9yZGVyIHdhbGsgd29ya2xpc3QuIik7CisgICAgUHJlT3JkZXJXb3JrbGlzdC5wdXNoX2JhY2soUm9vdEwpOworICAgIGRvIHsKKyAgICAgIExvb3BUICpMID0gUHJlT3JkZXJXb3JrbGlzdC5wb3BfYmFja192YWwoKTsKKyAgICAgIC8vIFN1Yi1sb29wcyBhcmUgc3RvcmVkIGluIGZvcndhcmQgcHJvZ3JhbSBvcmRlciwgYnV0IHdpbGwgcHJvY2VzcyB0aGUKKyAgICAgIC8vIHdvcmtsaXN0IGJhY2t3YXJkcyBzbyB3ZSBjYW4ganVzdCBhcHBlbmQgdGhlbSBpbiBvcmRlci4KKyAgICAgIFByZU9yZGVyV29ya2xpc3QuYXBwZW5kKEwtPmJlZ2luKCksIEwtPmVuZCgpKTsKKyAgICAgIFByZU9yZGVyTG9vcHMucHVzaF9iYWNrKEwpOworICAgIH0gd2hpbGUgKCFQcmVPcmRlcldvcmtsaXN0LmVtcHR5KCkpOworICB9CisKKyAgcmV0dXJuIFByZU9yZGVyTG9vcHM7Cit9CisKKy8vIERlYnVnZ2luZwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+Cit2b2lkIExvb3BJbmZvQmFzZTxCbG9ja1QsIExvb3BUPjo6cHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBUb3BMZXZlbExvb3BzLnNpemUoKTsgKytpKQorICAgIFRvcExldmVsTG9vcHNbaV0tPnByaW50KE9TKTsKKyNpZiAwCisgIGZvciAoRGVuc2VNYXA8QmFzaWNCbG9jayosIExvb3BUKj46OmNvbnN0X2l0ZXJhdG9yIEkgPSBCQk1hcC5iZWdpbigpLAorICAgICAgICAgRSA9IEJCTWFwLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICBPUyA8PCAiQkIgJyIgPDwgSS0+Zmlyc3QtPmdldE5hbWUoKSA8PCAiJyBsZXZlbCA9ICIKKyAgICAgICA8PCBJLT5zZWNvbmQtPmdldExvb3BEZXB0aCgpIDw8ICJcbiI7CisjZW5kaWYKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Citib29sIGNvbXBhcmVWZWN0b3JzKHN0ZDo6dmVjdG9yPFQ+ICZCQjEsIHN0ZDo6dmVjdG9yPFQ+ICZCQjIpIHsKKyAgc3RkOjpzb3J0KEJCMS5iZWdpbigpLCBCQjEuZW5kKCkpOworICBzdGQ6OnNvcnQoQkIyLmJlZ2luKCksIEJCMi5lbmQoKSk7CisgIHJldHVybiBCQjEgPT0gQkIyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQmxvY2tULCBjbGFzcyBMb29wVD4KK3ZvaWQgYWRkSW5uZXJMb29wc1RvSGVhZGVyc01hcChEZW5zZU1hcDxCbG9ja1QgKiwgY29uc3QgTG9vcFQgKj4gJkxvb3BIZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3BJbmZvQmFzZTxCbG9ja1QsIExvb3BUPiAmTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcFQgJkwpIHsKKyAgTG9vcEhlYWRlcnNbTC5nZXRIZWFkZXIoKV0gPSAmTDsKKyAgZm9yIChMb29wVCAqU0wgOiBMKQorICAgIGFkZElubmVyTG9vcHNUb0hlYWRlcnNNYXAoTG9vcEhlYWRlcnMsIExJLCAqU0wpOworfQorCisjaWZuZGVmIE5ERUJVRwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVCwgY2xhc3MgTG9vcFQ+CitzdGF0aWMgdm9pZCBjb21wYXJlTG9vcHMoY29uc3QgTG9vcFQgKkwsIGNvbnN0IExvb3BUICpPdGhlckwsCisgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXA8QmxvY2tUICosIGNvbnN0IExvb3BUICo+ICZPdGhlckxvb3BIZWFkZXJzKSB7CisgIEJsb2NrVCAqSCA9IEwtPmdldEhlYWRlcigpOworICBCbG9ja1QgKk90aGVySCA9IE90aGVyTC0+Z2V0SGVhZGVyKCk7CisgIGFzc2VydChIID09IE90aGVySCAmJgorICAgICAgICAgIk1pc21hdGNoZWQgaGVhZGVycyBldmVuIHRob3VnaCBmb3VuZCBpbiB0aGUgc2FtZSBtYXAgZW50cnkhIik7CisKKyAgYXNzZXJ0KEwtPmdldExvb3BEZXB0aCgpID09IE90aGVyTC0+Z2V0TG9vcERlcHRoKCkgJiYKKyAgICAgICAgICJNaXNtYXRjaGVkIGxvb3AgZGVwdGghIik7CisgIGNvbnN0IExvb3BUICpQYXJlbnRMID0gTCwgKk90aGVyUGFyZW50TCA9IE90aGVyTDsKKyAgZG8geworICAgIGFzc2VydChQYXJlbnRMLT5nZXRIZWFkZXIoKSA9PSBPdGhlclBhcmVudEwtPmdldEhlYWRlcigpICYmCisgICAgICAgICAgICJNaXNtYXRjaGVkIHBhcmVudCBsb29wIGhlYWRlcnMhIik7CisgICAgUGFyZW50TCA9IFBhcmVudEwtPmdldFBhcmVudExvb3AoKTsKKyAgICBPdGhlclBhcmVudEwgPSBPdGhlclBhcmVudEwtPmdldFBhcmVudExvb3AoKTsKKyAgfSB3aGlsZSAoUGFyZW50TCk7CisKKyAgZm9yIChjb25zdCBMb29wVCAqU3ViTCA6ICpMKSB7CisgICAgQmxvY2tUICpTdWJIID0gU3ViTC0+Z2V0SGVhZGVyKCk7CisgICAgY29uc3QgTG9vcFQgKk90aGVyU3ViTCA9IE90aGVyTG9vcEhlYWRlcnMubG9va3VwKFN1YkgpOworICAgIGFzc2VydChPdGhlclN1YkwgJiYgIklubmVyIGxvb3AgaXMgbWlzc2luZyBpbiBjb21wdXRlZCBsb29wIGluZm8hIik7CisgICAgT3RoZXJMb29wSGVhZGVycy5lcmFzZShTdWJIKTsKKyAgICBjb21wYXJlTG9vcHMoU3ViTCwgT3RoZXJTdWJMLCBPdGhlckxvb3BIZWFkZXJzKTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPEJsb2NrVCAqPiBCQnMgPSBMLT5nZXRCbG9ja3MoKTsKKyAgc3RkOjp2ZWN0b3I8QmxvY2tUICo+IE90aGVyQkJzID0gT3RoZXJMLT5nZXRCbG9ja3MoKTsKKyAgYXNzZXJ0KGNvbXBhcmVWZWN0b3JzKEJCcywgT3RoZXJCQnMpICYmCisgICAgICAgICAiTWlzbWF0Y2hlZCBiYXNpYyBibG9ja3MgaW4gdGhlIGxvb3BzISIpOworfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBCbG9ja1QsIGNsYXNzIExvb3BUPgordm9pZCBMb29wSW5mb0Jhc2U8QmxvY2tULCBMb29wVD46OnZlcmlmeSgKKyAgICBjb25zdCBEb21UcmVlQmFzZTxCbG9ja1Q+ICZEb21UcmVlKSBjb25zdCB7CisgIERlbnNlU2V0PGNvbnN0IExvb3BUICo+IExvb3BzOworICBmb3IgKGl0ZXJhdG9yIEkgPSBiZWdpbigpLCBFID0gZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgYXNzZXJ0KCEoKkkpLT5nZXRQYXJlbnRMb29wKCkgJiYgIlRvcC1sZXZlbCBsb29wIGhhcyBhIHBhcmVudCEiKTsKKyAgICAoKkkpLT52ZXJpZnlMb29wTmVzdCgmTG9vcHMpOworICB9CisKKy8vIFZlcmlmeSB0aGF0IGJsb2NrcyBhcmUgbWFwcGVkIHRvIHZhbGlkIGxvb3BzLgorI2lmbmRlZiBOREVCVUcKKyAgZm9yIChhdXRvICZFbnRyeSA6IEJCTWFwKSB7CisgICAgY29uc3QgQmxvY2tUICpCQiA9IEVudHJ5LmZpcnN0OworICAgIExvb3BUICpMID0gRW50cnkuc2Vjb25kOworICAgIGFzc2VydChMb29wcy5jb3VudChMKSAmJiAib3JwaGFuZWQgbG9vcCIpOworICAgIGFzc2VydChMLT5jb250YWlucyhCQikgJiYgIm9ycGhhbmVkIGJsb2NrIik7CisgIH0KKworICAvLyBSZWNvbXB1dGUgTG9vcEluZm8gdG8gdmVyaWZ5IGxvb3BzIHN0cnVjdHVyZS4KKyAgTG9vcEluZm9CYXNlPEJsb2NrVCwgTG9vcFQ+IE90aGVyTEk7CisgIE90aGVyTEkuYW5hbHl6ZShEb21UcmVlKTsKKworICAvLyBCdWlsZCBhIG1hcCB3ZSBjYW4gdXNlIHRvIG1vdmUgZnJvbSBvdXIgTEkgdG8gdGhlIGNvbXB1dGVkIG9uZS4gVGhpcworICAvLyBhbGxvd3MgdXMgdG8gaWdub3JlIHRoZSBwYXJ0aWN1bGFyIG9yZGVyIGluIGFueSBsYXllciBvZiB0aGUgbG9vcCBmb3Jlc3QKKyAgLy8gd2hpbGUgc3RpbGwgY29tcGFyaW5nIHRoZSBzdHJ1Y3R1cmUuCisgIERlbnNlTWFwPEJsb2NrVCAqLCBjb25zdCBMb29wVCAqPiBPdGhlckxvb3BIZWFkZXJzOworICBmb3IgKExvb3BUICpMIDogT3RoZXJMSSkKKyAgICBhZGRJbm5lckxvb3BzVG9IZWFkZXJzTWFwKE90aGVyTG9vcEhlYWRlcnMsIE90aGVyTEksICpMKTsKKworICAvLyBXYWxrIHRoZSB0b3AgbGV2ZWwgbG9vcHMgYW5kIGVuc3VyZSB0aGVyZSBpcyBhIGNvcnJlc3BvbmRpbmcgdG9wLWxldmVsCisgIC8vIGxvb3AgaW4gdGhlIGNvbXB1dGVkIHZlcnNpb24gYW5kIHRoZW4gcmVjdXJzaXZlbHkgY29tcGFyZSB0aG9zZSBsb29wCisgIC8vIG5lc3RzLgorICBmb3IgKExvb3BUICpMIDogKnRoaXMpIHsKKyAgICBCbG9ja1QgKkhlYWRlciA9IEwtPmdldEhlYWRlcigpOworICAgIGNvbnN0IExvb3BUICpPdGhlckwgPSBPdGhlckxvb3BIZWFkZXJzLmxvb2t1cChIZWFkZXIpOworICAgIGFzc2VydChPdGhlckwgJiYgIlRvcCBsZXZlbCBsb29wIGlzIG1pc3NpbmcgaW4gY29tcHV0ZWQgbG9vcCBpbmZvISIpOworICAgIC8vIE5vdyB0aGF0IHdlJ3ZlIG1hdGNoZWQgdGhpcyBsb29wLCBlcmFzZSBpdHMgaGVhZGVyIGZyb20gdGhlIG1hcC4KKyAgICBPdGhlckxvb3BIZWFkZXJzLmVyYXNlKEhlYWRlcik7CisgICAgLy8gQW5kIHJlY3Vyc2l2ZWx5IGNvbXBhcmUgdGhlc2UgbG9vcHMuCisgICAgY29tcGFyZUxvb3BzKEwsIE90aGVyTCwgT3RoZXJMb29wSGVhZGVycyk7CisgIH0KKworICAvLyBBbnkgcmVtYWluaW5nIGVudHJpZXMgaW4gdGhlIG1hcCBhcmUgbG9vcHMgd2hpY2ggd2VyZSBmb3VuZCB3aGVuIGNvbXB1dGluZworICAvLyBhIGZyZXNoIExvb3BJbmZvIGJ1dCBub3QgcHJlc2VudCBpbiB0aGUgY3VycmVudCBvbmUuCisgIGlmICghT3RoZXJMb29wSGVhZGVycy5lbXB0eSgpKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZIZWFkZXJBbmRMb29wIDogT3RoZXJMb29wSGVhZGVycykKKyAgICAgIGRiZ3MoKSA8PCAiRm91bmQgbmV3IGxvb3A6ICIgPDwgKkhlYWRlckFuZExvb3Auc2Vjb25kIDw8ICJcbiI7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiRm91bmQgbmV3IGxvb3BzIHdoZW4gcmVjb21wdXRpbmcgTG9vcEluZm8hIik7CisgIH0KKyNlbmRpZgorfQorCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTG9vcEl0ZXJhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvb3BJdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxYzU0YjIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvb3BJdGVyYXRvci5oCkBAIC0wLDAgKzEsMjYwIEBACisvLz09PS0tLS0tLS0tLSBMb29wSXRlcmF0b3IuaCAtIEl0ZXJhdGUgb3ZlciBsb29wIGJsb2NrcyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGhpcyBmaWxlIGRlZmluZXMgaXRlcmF0b3JzIHRvIHZpc2l0IHRoZSBiYXNpYyBibG9ja3Mgd2l0aGluIGEgbG9vcC4KKy8vCisvLyBUaGVzZSBpdGVyYXRvcnMgY3VycmVudGx5IHZpc2l0IGJsb2NrcyB3aXRoaW4gc3VibG9vcHMgYXMgd2VsbC4KKy8vIFVuZm9ydHVuYXRlbHkgd2UgaGF2ZSBubyBlZmZpY2llbnQgd2F5IG9mIHN1bW1hcml6aW5nIGxvb3AgZXhpdHMgd2hpY2ggd291bGQKKy8vIGFsbG93IHNraXBwaW5nIHN1Ymxvb3BzIGR1cmluZyB0cmF2ZXJzYWwuCisvLworLy8gSWYgeW91IHdhbnQgdG8gdmlzaXQgYWxsIGJsb2NrcyBpbiBhIGxvb3AgYW5kIGRvbid0IG5lZWQgYW4gb3JkZXJlZCB0cmF2ZXJhbCwKKy8vIHVzZSBMb29wOjpibG9ja19iZWdpbigpIGluc3RlYWQuCisvLworLy8gVGhpcyBpcyBpbnRlbnRpb25hbGx5IGRlc2lnbmVkIHRvIHdvcmsgd2l0aCBpbGwtZm9ybWVkIGxvb3BzIGluIHdoaWNoIHRoZQorLy8gYmFja2VkZ2UgaGFzIGJlZW4gZGVsZXRlZC4gVGhlIG9ubHkgcHJlcmVxdWlzaXRlIGlzIHRoYXQgYWxsIGJsb2NrcworLy8gY29udGFpbmVkIHdpdGhpbiB0aGUgbG9vcCBhY2NvcmRpbmcgdG8gdGhlIG1vc3QgcmVjZW50IExvb3BJbmZvIGFuYWx5c2lzIGFyZQorLy8gcmVhY2hhYmxlIGZyb20gdGhlIGxvb3AgaGVhZGVyLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX0xPT1BJVEVSQVRPUl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfTE9PUElURVJBVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1Bvc3RPcmRlckl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExvb3BCbG9ja3NUcmF2ZXJzYWw7CisKKy8vIEEgdHJhaXRzIHR5cGUgdGhhdCBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGluIGdyYXBoIGFsZ29yaXRobXMuIFRoZSBncmFwaAorLy8gdHJhaXRzIHN0YXJ0cyBhdCB0aGUgbG9vcCBoZWFkZXIsIGFuZCB0cmF2ZXJzZXMgdGhlIEJhc2ljQmxvY2tzIHRoYXQgYXJlIGluCisvLyB0aGUgbG9vcCBib2R5LCBidXQgbm90IHRoZSBsb29wIGhlYWRlci4gU2luY2UgdGhlIGxvb3AgaGVhZGVyIGlzIHNraXBwZWQsCisvLyB0aGUgYmFjayBlZGdlcyBhcmUgZXhjbHVkZWQuCisvLworLy8gVE9ETzogRXhwbG9yZSB0aGUgcG9zc2liaWxpdHkgdG8gaW1wbGVtZW50IExvb3BCbG9ja3NUcmF2ZXJzYWwgaW4gdGVybXMgb2YKKy8vICAgICAgIExvb3BCb2R5VHJhaXRzLCBzbyB0aGF0IGluc2VydEVkZ2UgZG9lc24ndCBoYXZlIHRvIGJlIHNwZWNpYWxpemVkLgorc3RydWN0IExvb3BCb2R5VHJhaXRzIHsKKyAgdXNpbmcgTm9kZVJlZiA9IHN0ZDo6cGFpcjxjb25zdCBMb29wICosIEJhc2ljQmxvY2sgKj47CisKKyAgLy8gVGhpcyB3cmFwcyBhIGNvbnN0IExvb3AgKiBpbnRvIHRoZSBpdGVyYXRvciwgc28gd2Uga25vdyB3aGljaCBlZGdlcyB0bworICAvLyBmaWx0ZXIgb3V0LgorICBjbGFzcyBXcmFwcGVkU3VjY0l0ZXJhdG9yCisgICAgICA6IHB1YmxpYyBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U8CisgICAgICAgICAgICBXcmFwcGVkU3VjY0l0ZXJhdG9yLCBzdWNjX2l0ZXJhdG9yLAorICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8c3VjY19pdGVyYXRvcj46Oml0ZXJhdG9yX2NhdGVnb3J5LAorICAgICAgICAgICAgTm9kZVJlZiwgc3RkOjpwdHJkaWZmX3QsIE5vZGVSZWYgKiwgTm9kZVJlZj4geworICAgIHVzaW5nIEJhc2VUID0gaXRlcmF0b3JfYWRhcHRvcl9iYXNlPAorICAgICAgICBXcmFwcGVkU3VjY0l0ZXJhdG9yLCBzdWNjX2l0ZXJhdG9yLAorICAgICAgICB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxzdWNjX2l0ZXJhdG9yPjo6aXRlcmF0b3JfY2F0ZWdvcnksCisgICAgICAgIE5vZGVSZWYsIHN0ZDo6cHRyZGlmZl90LCBOb2RlUmVmICosIE5vZGVSZWY+OworCisgICAgY29uc3QgTG9vcCAqTDsKKworICBwdWJsaWM6CisgICAgV3JhcHBlZFN1Y2NJdGVyYXRvcihzdWNjX2l0ZXJhdG9yIEJlZ2luLCBjb25zdCBMb29wICpMKQorICAgICAgICA6IEJhc2VUKEJlZ2luKSwgTChMKSB7fQorCisgICAgTm9kZVJlZiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiB7TCwgKkl9OyB9CisgIH07CisKKyAgc3RydWN0IExvb3BCb2R5RmlsdGVyIHsKKyAgICBib29sIG9wZXJhdG9yKCkoTm9kZVJlZiBOKSBjb25zdCB7CisgICAgICBjb25zdCBMb29wICpMID0gTi5maXJzdDsKKyAgICAgIHJldHVybiBOLnNlY29uZCAhPSBMLT5nZXRIZWFkZXIoKSAmJiBMLT5jb250YWlucyhOLnNlY29uZCk7CisgICAgfQorICB9OworCisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0KKyAgICAgIGZpbHRlcl9pdGVyYXRvcjxXcmFwcGVkU3VjY0l0ZXJhdG9yLCBMb29wQm9keUZpbHRlcj47CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKGNvbnN0IExvb3AgJkcpIHsgcmV0dXJuIHsmRywgRy5nZXRIZWFkZXIoKX07IH0KKworICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOb2RlKSB7CisgICAgcmV0dXJuIG1ha2VfZmlsdGVyX3JhbmdlKG1ha2VfcmFuZ2U8V3JhcHBlZFN1Y2NJdGVyYXRvcj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3VjY19iZWdpbihOb2RlLnNlY29uZCksIE5vZGUuZmlyc3R9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N1Y2NfZW5kKE5vZGUuc2Vjb25kKSwgTm9kZS5maXJzdH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wQm9keUZpbHRlcnt9KQorICAgICAgICAuYmVnaW4oKTsKKyAgfQorCisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOb2RlKSB7CisgICAgcmV0dXJuIG1ha2VfZmlsdGVyX3JhbmdlKG1ha2VfcmFuZ2U8V3JhcHBlZFN1Y2NJdGVyYXRvcj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7c3VjY19iZWdpbihOb2RlLnNlY29uZCksIE5vZGUuZmlyc3R9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge3N1Y2NfZW5kKE5vZGUuc2Vjb25kKSwgTm9kZS5maXJzdH0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wQm9keUZpbHRlcnt9KQorICAgICAgICAuZW5kKCk7CisgIH0KK307CisKKy8vLyBTdG9yZSB0aGUgcmVzdWx0IG9mIGEgZGVwdGggZmlyc3Qgc2VhcmNoIHdpdGhpbiBiYXNpYyBibG9ja3MgY29udGFpbmVkIGJ5IGEKKy8vLyBzaW5nbGUgbG9vcC4KKy8vLworLy8vIFRPRE86IFRoaXMgY291bGQgYmUgZ2VuZXJhbGl6ZWQgZm9yIGFueSBDRkcgcmVnaW9uLCBvciB0aGUgZW50aXJlIENGRy4KK2NsYXNzIExvb3BCbG9ja3NERlMgeworcHVibGljOgorICAvLy8gUG9zdG9yZGVyIGxpc3QgaXRlcmF0b3JzLgorICB0eXBlZGVmIHN0ZDo6dmVjdG9yPEJhc2ljQmxvY2sqPjo6Y29uc3RfaXRlcmF0b3IgUE9JdGVyYXRvcjsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxCYXNpY0Jsb2NrKj46OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgUlBPSXRlcmF0b3I7CisKKyAgZnJpZW5kIGNsYXNzIExvb3BCbG9ja3NUcmF2ZXJzYWw7CisKK3ByaXZhdGU6CisgIExvb3AgKkw7CisKKyAgLy8vIE1hcCBlYWNoIGJsb2NrIHRvIGl0cyBwb3N0b3JkZXIgbnVtYmVyLiBBIGJsb2NrIGlzIG9ubHkgbWFwcGVkIGFmdGVyIGl0IGlzCisgIC8vLyBwcmVvcmRlciB2aXNpdGVkIGJ5IERGUy4gSXQncyBwb3N0b3JkZXIgbnVtYmVyIGlzIGluaXRpYWxseSB6ZXJvIGFuZCBzZXQKKyAgLy8vIHRvIG5vbnplcm8gYWZ0ZXIgaXQgaXMgZmluaXNoZWQgYnkgcG9zdG9yZGVyIHRyYXZlcnNhbC4KKyAgRGVuc2VNYXA8QmFzaWNCbG9jayosIHVuc2lnbmVkPiBQb3N0TnVtYmVyczsKKyAgc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayo+IFBvc3RCbG9ja3M7CisKK3B1YmxpYzoKKyAgTG9vcEJsb2Nrc0RGUyhMb29wICpDb250YWluZXIpIDoKKyAgICBMKENvbnRhaW5lciksIFBvc3ROdW1iZXJzKE5leHRQb3dlck9mMihDb250YWluZXItPmdldE51bUJsb2NrcygpKSkgeworICAgIFBvc3RCbG9ja3MucmVzZXJ2ZShDb250YWluZXItPmdldE51bUJsb2NrcygpKTsKKyAgfQorCisgIExvb3AgKmdldExvb3AoKSBjb25zdCB7IHJldHVybiBMOyB9CisKKyAgLy8vIFRyYXZlcnNlIHRoZSBsb29wIGJsb2NrcyBhbmQgc3RvcmUgdGhlIERGUyByZXN1bHQuCisgIHZvaWQgcGVyZm9ybShMb29wSW5mbyAqTEkpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBwb3N0b3JkZXIgbnVtYmVycyBhcmUgYXNzaWduZWQgdG8gYWxsIGxvb3AgYmxvY2tzLgorICBib29sIGlzQ29tcGxldGUoKSBjb25zdCB7IHJldHVybiBQb3N0QmxvY2tzLnNpemUoKSA9PSBMLT5nZXROdW1CbG9ja3MoKTsgfQorCisgIC8vLyBJdGVyYXRlIG92ZXIgdGhlIGNhY2hlZCBwb3N0b3JkZXIgYmxvY2tzLgorICBQT0l0ZXJhdG9yIGJlZ2luUG9zdG9yZGVyKCkgY29uc3QgeworICAgIGFzc2VydChpc0NvbXBsZXRlKCkgJiYgImJhZCBsb29wIERGUyIpOworICAgIHJldHVybiBQb3N0QmxvY2tzLmJlZ2luKCk7CisgIH0KKyAgUE9JdGVyYXRvciBlbmRQb3N0b3JkZXIoKSBjb25zdCB7IHJldHVybiBQb3N0QmxvY2tzLmVuZCgpOyB9CisKKyAgLy8vIFJldmVyc2UgaXRlcmF0ZSBvdmVyIHRoZSBjYWNoZWQgcG9zdG9yZGVyIGJsb2Nrcy4KKyAgUlBPSXRlcmF0b3IgYmVnaW5SUE8oKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQ29tcGxldGUoKSAmJiAiYmFkIGxvb3AgREZTIik7CisgICAgcmV0dXJuIFBvc3RCbG9ja3MucmJlZ2luKCk7CisgIH0KKyAgUlBPSXRlcmF0b3IgZW5kUlBPKCkgY29uc3QgeyByZXR1cm4gUG9zdEJsb2Nrcy5yZW5kKCk7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBibG9jayBoYXMgYmVlbiBwcmVvcmRlciB2aXNpdGVkLgorICBib29sIGhhc1ByZW9yZGVyKEJhc2ljQmxvY2sgKkJCKSBjb25zdCB7IHJldHVybiBQb3N0TnVtYmVycy5jb3VudChCQik7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBibG9jayBoYXMgYSBwb3N0b3JkZXIgbnVtYmVyLgorICBib29sIGhhc1Bvc3RvcmRlcihCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIERlbnNlTWFwPEJhc2ljQmxvY2sqLCB1bnNpZ25lZD46OmNvbnN0X2l0ZXJhdG9yIEkgPSBQb3N0TnVtYmVycy5maW5kKEJCKTsKKyAgICByZXR1cm4gSSAhPSBQb3N0TnVtYmVycy5lbmQoKSAmJiBJLT5zZWNvbmQ7CisgIH0KKworICAvLy8gR2V0IGEgYmxvY2sncyBwb3N0b3JkZXIgbnVtYmVyLgorICB1bnNpZ25lZCBnZXRQb3N0b3JkZXIoQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICBEZW5zZU1hcDxCYXNpY0Jsb2NrKiwgdW5zaWduZWQ+Ojpjb25zdF9pdGVyYXRvciBJID0gUG9zdE51bWJlcnMuZmluZChCQik7CisgICAgYXNzZXJ0KEkgIT0gUG9zdE51bWJlcnMuZW5kKCkgJiYgImJsb2NrIG5vdCB2aXNpdGVkIGJ5IERGUyIpOworICAgIGFzc2VydChJLT5zZWNvbmQgJiYgImJsb2NrIG5vdCBmaW5pc2hlZCBieSBERlMiKTsKKyAgICByZXR1cm4gSS0+c2Vjb25kOworICB9CisKKyAgLy8vIEdldCBhIGJsb2NrJ3MgcmV2ZXJzZSBwb3N0b3JkZXIgbnVtYmVyLgorICB1bnNpZ25lZCBnZXRSUE8oQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gMSArIFBvc3RCbG9ja3Muc2l6ZSgpIC0gZ2V0UG9zdG9yZGVyKEJCKTsKKyAgfQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgUG9zdE51bWJlcnMuY2xlYXIoKTsKKyAgICBQb3N0QmxvY2tzLmNsZWFyKCk7CisgIH0KK307CisKKy8vLyBXcmFwcGVyIGNsYXNzIHRvIExvb3BCbG9ja3NERlMgdGhhdCBwcm92aWRlcyBhIHN0YW5kYXJkIGJlZ2luKCkvZW5kKCkKKy8vLyBpbnRlcmZhY2UgZm9yIHRoZSBERlMgcmV2ZXJzZSBwb3N0LW9yZGVyIHRyYXZlcnNhbCBvZiBibG9ja3MgaW4gYSBsb29wIGJvZHkuCitjbGFzcyBMb29wQmxvY2tzUlBPIHsKK3ByaXZhdGU6CisgIExvb3BCbG9ja3NERlMgREZTOworCitwdWJsaWM6CisgIExvb3BCbG9ja3NSUE8oTG9vcCAqQ29udGFpbmVyKSA6IERGUyhDb250YWluZXIpIHt9CisKKyAgLy8vIFRyYXZlcnNlIHRoZSBsb29wIGJsb2NrcyBhbmQgc3RvcmUgdGhlIERGUyByZXN1bHQuCisgIHZvaWQgcGVyZm9ybShMb29wSW5mbyAqTEkpIHsKKyAgICBERlMucGVyZm9ybShMSSk7CisgIH0KKworICAvLy8gUmV2ZXJzZSBpdGVyYXRlIG92ZXIgdGhlIGNhY2hlZCBwb3N0b3JkZXIgYmxvY2tzLgorICBMb29wQmxvY2tzREZTOjpSUE9JdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIERGUy5iZWdpblJQTygpOyB9CisgIExvb3BCbG9ja3NERlM6OlJQT0l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIERGUy5lbmRSUE8oKTsgfQorfTsKKworLy8vIFNwZWNpYWxpemUgcG9faXRlcmF0b3Jfc3RvcmFnZSB0byByZWNvcmQgcG9zdG9yZGVyIG51bWJlcnMuCit0ZW1wbGF0ZTw+IGNsYXNzIHBvX2l0ZXJhdG9yX3N0b3JhZ2U8TG9vcEJsb2Nrc1RyYXZlcnNhbCwgdHJ1ZT4geworICBMb29wQmxvY2tzVHJhdmVyc2FsICZMQlQ7CitwdWJsaWM6CisgIHBvX2l0ZXJhdG9yX3N0b3JhZ2UoTG9vcEJsb2Nrc1RyYXZlcnNhbCAmbGJzKSA6IExCVChsYnMpIHt9CisgIC8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZGVmaW5lZCBiZWxvdy4KKyAgYm9vbCBpbnNlcnRFZGdlKE9wdGlvbmFsPEJhc2ljQmxvY2sgKj4gRnJvbSwgQmFzaWNCbG9jayAqVG8pOworICB2b2lkIGZpbmlzaFBvc3RvcmRlcihCYXNpY0Jsb2NrICpCQik7Cit9OworCisvLy8gVHJhdmVyc2UgdGhlIGJsb2NrcyBpbiBhIGxvb3AgdXNpbmcgYSBkZXB0aC1maXJzdCBzZWFyY2guCitjbGFzcyBMb29wQmxvY2tzVHJhdmVyc2FsIHsKK3B1YmxpYzoKKyAgLy8vIEdyYXBoIHRyYXZlcnNhbCBpdGVyYXRvci4KKyAgdHlwZWRlZiBwb19pdGVyYXRvcjxCYXNpY0Jsb2NrKiwgTG9vcEJsb2Nrc1RyYXZlcnNhbCwgdHJ1ZT4gUE9USXRlcmF0b3I7CisKK3ByaXZhdGU6CisgIExvb3BCbG9ja3NERlMgJkRGUzsKKyAgTG9vcEluZm8gKkxJOworCitwdWJsaWM6CisgIExvb3BCbG9ja3NUcmF2ZXJzYWwoTG9vcEJsb2Nrc0RGUyAmU3RvcmFnZSwgTG9vcEluZm8gKkxJbmZvKSA6CisgICAgREZTKFN0b3JhZ2UpLCBMSShMSW5mbykge30KKworICAvLy8gUG9zdG9yZGVyIHRyYXZlcnNhbCBvdmVyIHRoZSBncmFwaC4gVGhpcyBvbmx5IG5lZWRzIHRvIGJlIGRvbmUgb25jZS4KKyAgLy8vIHBvX2l0ZXJhdG9yICJhdXRvbWF0aWNhbGx5IiBjYWxscyBiYWNrIHRvIHZpc2l0UHJlb3JkZXIgYW5kCisgIC8vLyBmaW5pc2hQb3N0b3JkZXIgdG8gcmVjb3JkIHRoZSBERlMgcmVzdWx0LgorICBQT1RJdGVyYXRvciBiZWdpbigpIHsKKyAgICBhc3NlcnQoREZTLlBvc3RCbG9ja3MuZW1wdHkoKSAmJiAiTmVlZCBjbGVhciBERlMgcmVzdWx0IGJlZm9yZSB0cmF2ZXJzaW5nIik7CisgICAgYXNzZXJ0KERGUy5MLT5nZXROdW1CbG9ja3MoKSAmJiAicG9faXRlcmF0b3IgY2Fubm90IGhhbmRsZSBhbiBlbXB0eSBncmFwaCIpOworICAgIHJldHVybiBwb19leHRfYmVnaW4oREZTLkwtPmdldEhlYWRlcigpLCAqdGhpcyk7CisgIH0KKyAgUE9USXRlcmF0b3IgZW5kKCkgeworICAgIC8vIHBvX2V4dF9lbmQgaW50ZXJmYWNlIHJlcXVpcmVzIGEgYmFzaWMgYmxvY2ssIGJ1dCBpZ25vcmVzIGl0cyB2YWx1ZS4KKyAgICByZXR1cm4gcG9fZXh0X2VuZChERlMuTC0+Z2V0SGVhZGVyKCksICp0aGlzKTsKKyAgfQorCisgIC8vLyBDYWxsZWQgYnkgcG9faXRlcmF0b3IgdXBvbiByZWFjaGluZyBhIGJsb2NrIHZpYSBhIENGRyBlZGdlLiBJZiB0aGlzIGJsb2NrCisgIC8vLyBpcyBjb250YWluZWQgaW4gdGhlIGxvb3AgYW5kIGhhcyBub3QgYmVlbiB2aXNpdGVkLCB0aGVuIG1hcmsgaXQgcHJlb3JkZXIKKyAgLy8vIHZpc2l0ZWQgYW5kIHJldHVybiB0cnVlLgorICAvLy8KKyAgLy8vIFRPRE86IElmIGFueW9uZSBpcyBpbnRlcmVzdGVkLCB3ZSBjb3VsZCByZWNvcmQgcHJlb3JkZXIgbnVtYmVycyBoZXJlLgorICBib29sIHZpc2l0UHJlb3JkZXIoQmFzaWNCbG9jayAqQkIpIHsKKyAgICBpZiAoIURGUy5MLT5jb250YWlucyhMSS0+Z2V0TG9vcEZvcihCQikpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIERGUy5Qb3N0TnVtYmVycy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoQkIsIDApKS5zZWNvbmQ7CisgIH0KKworICAvLy8gQ2FsbGVkIGJ5IHBvX2l0ZXJhdG9yIGVhY2ggdGltZSBpdCBhZHZhbmNlcywgaW5kaWNhdGluZyBhIGJsb2NrJ3MKKyAgLy8vIHBvc3RvcmRlci4KKyAgdm9pZCBmaW5pc2hQb3N0b3JkZXIoQmFzaWNCbG9jayAqQkIpIHsKKyAgICBhc3NlcnQoREZTLlBvc3ROdW1iZXJzLmNvdW50KEJCKSAmJiAiTG9vcCBERlMgc2tpcHBlZCBwcmVvcmRlciIpOworICAgIERGUy5Qb3N0QmxvY2tzLnB1c2hfYmFjayhCQik7CisgICAgREZTLlBvc3ROdW1iZXJzW0JCXSA9IERGUy5Qb3N0QmxvY2tzLnNpemUoKTsKKyAgfQorfTsKKworaW5saW5lIGJvb2wgcG9faXRlcmF0b3Jfc3RvcmFnZTxMb29wQmxvY2tzVHJhdmVyc2FsLCB0cnVlPjo6aW5zZXJ0RWRnZSgKKyAgICBPcHRpb25hbDxCYXNpY0Jsb2NrICo+IEZyb20sIEJhc2ljQmxvY2sgKlRvKSB7CisgIHJldHVybiBMQlQudmlzaXRQcmVvcmRlcihUbyk7Cit9CisKK2lubGluZSB2b2lkIHBvX2l0ZXJhdG9yX3N0b3JhZ2U8TG9vcEJsb2Nrc1RyYXZlcnNhbCwgdHJ1ZT46OgorZmluaXNoUG9zdG9yZGVyKEJhc2ljQmxvY2sgKkJCKSB7CisgIExCVC5maW5pc2hQb3N0b3JkZXIoQkIpOworfQorCit9IC8vIEVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTG9vcFBhc3MuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTG9vcFBhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmNmZWNkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Mb29wUGFzcy5oCkBAIC0wLDAgKzEsMTc5IEBACisvLz09PS0gTG9vcFBhc3MuaCAtIExvb3BQYXNzIGNsYXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIExvb3BQYXNzIGNsYXNzLiBBbGwgbG9vcCBvcHRpbWl6YXRpb24KKy8vIGFuZCB0cmFuc2Zvcm1hdGlvbiBwYXNzZXMgYXJlIGRlcml2ZWQgZnJvbSBMb29wUGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfTE9PUFBBU1NfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0xPT1BQQVNTX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0xlZ2FjeVBhc3NNYW5hZ2Vycy5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgPGRlcXVlPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExQUGFzc01hbmFnZXI7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIFBNU3RhY2s7CisKK2NsYXNzIExvb3BQYXNzIDogcHVibGljIFBhc3MgeworcHVibGljOgorICBleHBsaWNpdCBMb29wUGFzcyhjaGFyICZwaWQpIDogUGFzcyhQVF9Mb29wLCBwaWQpIHt9CisKKyAgLy8vIGdldFByaW50ZXJQYXNzIC0gR2V0IGEgcGFzcyB0byBwcmludCB0aGUgZnVuY3Rpb24gY29ycmVzcG9uZGluZworICAvLy8gdG8gYSBMb29wLgorICBQYXNzICpjcmVhdGVQcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8gcnVuT25Mb29wIC0gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IHRoZSBzdWJjbGFzcyB0byBwZXJmb3JtCisgIC8vIHdoYXRldmVyIGFjdGlvbiBpcyBuZWNlc3NhcnkgZm9yIHRoZSBzcGVjaWZpZWQgTG9vcC4KKyAgdmlydHVhbCBib29sIHJ1bk9uTG9vcChMb29wICpMLCBMUFBhc3NNYW5hZ2VyICZMUE0pID0gMDsKKworICB1c2luZyBsbHZtOjpQYXNzOjpkb0luaXRpYWxpemF0aW9uOworICB1c2luZyBsbHZtOjpQYXNzOjpkb0ZpbmFsaXphdGlvbjsKKworICAvLyBJbml0aWFsaXphdGlvbiBhbmQgZmluYWxpemF0aW9uIGhvb2tzLgorICB2aXJ0dWFsIGJvb2wgZG9Jbml0aWFsaXphdGlvbihMb29wICpMLCBMUFBhc3NNYW5hZ2VyICZMUE0pIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBGaW5hbGl6YXRpb24gaG9vayBkb2VzIG5vdCBzdXBwbHkgTG9vcCBiZWNhdXNlIGF0IHRoaXMgdGltZQorICAvLyBsb29wIG5lc3QgaXMgY29tcGxldGVseSBkaWZmZXJlbnQuCisgIHZpcnR1YWwgYm9vbCBkb0ZpbmFsaXphdGlvbigpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8gQ2hlY2sgaWYgdGhpcyBwYXNzIGlzIHN1aXRhYmxlIGZvciB0aGUgY3VycmVudCBMUFBhc3NNYW5hZ2VyLCBpZgorICAvLyBhdmFpbGFibGUuIFRoaXMgcGFzcyBQIGlzIG5vdCBzdWl0YWJsZSBmb3IgYSBMUFBhc3NNYW5hZ2VyIGlmIFAKKyAgLy8gaXMgbm90IHByZXNlcnZpbmcgaGlnaGVyIGxldmVsIGFuYWx5c2lzIGluZm8gdXNlZCBieSBvdGhlcgorICAvLyBMUFBhc3NNYW5hZ2VyIHBhc3Nlcy4gSW4gc3VjaCBjYXNlLCBwb3AgTFBQYXNzTWFuYWdlciBmcm9tIHRoZQorICAvLyBzdGFjay4gVGhpcyB3aWxsIGZvcmNlIGFzc2lnblBhc3NNYW5hZ2VyKCkgdG8gY3JlYXRlIG5ldworICAvLyBMUFBhc3NNYW5nZXIgYXMgZXhwZWN0ZWQuCisgIHZvaWQgcHJlcGFyZVBhc3NNYW5hZ2VyKFBNU3RhY2sgJlBNUykgb3ZlcnJpZGU7CisKKyAgLy8vIEFzc2lnbiBwYXNzIG1hbmFnZXIgdG8gbWFuYWdlIHRoaXMgcGFzcworICB2b2lkIGFzc2lnblBhc3NNYW5hZ2VyKFBNU3RhY2sgJlBNUywgUGFzc01hbmFnZXJUeXBlIFBNVCkgb3ZlcnJpZGU7CisKKyAgLy8vICBSZXR1cm4gd2hhdCBraW5kIG9mIFBhc3MgTWFuYWdlciBjYW4gbWFuYWdlIHRoaXMgcGFzcy4KKyAgUGFzc01hbmFnZXJUeXBlIGdldFBvdGVudGlhbFBhc3NNYW5hZ2VyVHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUE1UX0xvb3BQYXNzTWFuYWdlcjsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gU2ltcGxlQW5hbHlzaXMgLSBQcm92aWRlcyBzaW1wbGUgaW50ZXJmYWNlIHRvIHVwZGF0ZSBhbmFseXNpcyBpbmZvCisgIC8vLyBtYWludGFpbmVkIGJ5IHZhcmlvdXMgcGFzc2VzLiBOb3RlLCBpZiByZXF1aXJlZCB0aGlzIGludGVyZmFjZSBjYW4KKyAgLy8vIGJlIGV4dHJhY3RlZCBpbnRvIGEgc2VwYXJhdGUgYWJzdHJhY3QgY2xhc3MgYnV0IGl0IHdvdWxkIHJlcXVpcmUKKyAgLy8vIGFkZGl0aW9uYWwgdXNlIG9mIG11bHRpcGxlIGluaGVyaXRhbmNlIGluIFBhc3MgY2xhc3MgaGllcmFyY2h5LCBzb21ldGhpbmcKKyAgLy8vIHdlIGFyZSB0cnlpbmcgdG8gYXZvaWQuCisKKyAgLy8vIEVhY2ggbG9vcCBwYXNzIGNhbiBvdmVycmlkZSB0aGVzZSBzaW1wbGUgYW5hbHlzaXMgaG9va3MgdG8gdXBkYXRlCisgIC8vLyBkZXNpcmVkIGFuYWx5c2lzIGluZm9ybWF0aW9uLgorICAvLy8gY2xvbmVCYXNpY0Jsb2NrQW5hbHlzaXMgLSBDbG9uZSBhbmFseXNpcyBpbmZvIGFzc29jaWF0ZWQgd2l0aCBiYXNpYyBibG9jay4KKyAgdmlydHVhbCB2b2lkIGNsb25lQmFzaWNCbG9ja0FuYWx5c2lzKEJhc2ljQmxvY2sgKkYsIEJhc2ljQmxvY2sgKlQsIExvb3AgKkwpIHt9CisKKyAgLy8vIGRlbGV0ZUFuYWx5c2lzVmFsdWUgLSBEZWxldGUgYW5hbHlzaXMgaW5mbyBhc3NvY2lhdGVkIHdpdGggdmFsdWUgVi4KKyAgdmlydHVhbCB2b2lkIGRlbGV0ZUFuYWx5c2lzVmFsdWUoVmFsdWUgKlYsIExvb3AgKkwpIHt9CisKKyAgLy8vIERlbGV0ZSBhbmFseXNpcyBpbmZvIGFzc29jaWF0ZWQgd2l0aCBMb29wIEwuCisgIC8vLyBDYWxsZWQgdG8gbm90aWZ5IGEgUGFzcyB0aGF0IGEgbG9vcCBoYXMgYmVlbiBkZWxldGVkIGFuZCBhbnkKKyAgLy8vIGFzc29jaWF0ZWQgYW5hbHlzaXMgdmFsdWVzIGNhbiBiZSBkZWxldGVkLgorICB2aXJ0dWFsIHZvaWQgZGVsZXRlQW5hbHlzaXNMb29wKExvb3AgKkwpIHt9CisKK3Byb3RlY3RlZDoKKyAgLy8vIE9wdGlvbmFsIHBhc3NlcyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gY2hlY2sgd2hldGhlciB0aGUgcGFzcyBzaG91bGQgYmUKKyAgLy8vIHNraXBwZWQuIFRoaXMgaXMgdGhlIGNhc2Ugd2hlbiBBdHRyaWJ1dGU6Ok9wdGltaXplTm9uZSBpcyBzZXQgb3Igd2hlbgorICAvLy8gb3B0aW1pemF0aW9uIGJpc2VjdCBpcyBvdmVyIHRoZSBsaW1pdC4KKyAgYm9vbCBza2lwTG9vcChjb25zdCBMb29wICpMKSBjb25zdDsKK307CisKK2NsYXNzIExQUGFzc01hbmFnZXIgOiBwdWJsaWMgRnVuY3Rpb25QYXNzLCBwdWJsaWMgUE1EYXRhTWFuYWdlciB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworICBleHBsaWNpdCBMUFBhc3NNYW5hZ2VyKCk7CisKKyAgLy8vIHJ1biAtIEV4ZWN1dGUgYWxsIG9mIHRoZSBwYXNzZXMgc2NoZWR1bGVkIGZvciBleGVjdXRpb24uICBLZWVwIHRyYWNrIG9mCisgIC8vLyB3aGV0aGVyIGFueSBvZiB0aGUgcGFzc2VzIG1vZGlmaWVzIHRoZSBtb2R1bGUsIGFuZCBpZiBzbywgcmV0dXJuIHRydWUuCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgb3ZlcnJpZGU7CisKKyAgLy8vIFBhc3MgTWFuYWdlciBpdHNlbGYgZG9lcyBub3QgaW52YWxpZGF0ZSBhbnkgYW5hbHlzaXMgaW5mby4KKyAgLy8gTFBQYXNzTWFuYWdlciBuZWVkcyBMb29wSW5mby4KKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkluZm8pIGNvbnN0IG92ZXJyaWRlOworCisgIFN0cmluZ1JlZiBnZXRQYXNzTmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJMb29wIFBhc3MgTWFuYWdlciI7IH0KKworICBQTURhdGFNYW5hZ2VyICpnZXRBc1BNRGF0YU1hbmFnZXIoKSBvdmVycmlkZSB7IHJldHVybiB0aGlzOyB9CisgIFBhc3MgKmdldEFzUGFzcygpIG92ZXJyaWRlIHsgcmV0dXJuIHRoaXM7IH0KKworICAvLy8gUHJpbnQgcGFzc2VzIG1hbmFnZWQgYnkgdGhpcyBtYW5hZ2VyCisgIHZvaWQgZHVtcFBhc3NTdHJ1Y3R1cmUodW5zaWduZWQgT2Zmc2V0KSBvdmVycmlkZTsKKworICBMb29wUGFzcyAqZ2V0Q29udGFpbmVkUGFzcyh1bnNpZ25lZCBOKSB7CisgICAgYXNzZXJ0KE4gPCBQYXNzVmVjdG9yLnNpemUoKSAmJiAiUGFzcyBudW1iZXIgb3V0IG9mIHJhbmdlISIpOworICAgIExvb3BQYXNzICpMUCA9IHN0YXRpY19jYXN0PExvb3BQYXNzICo+KFBhc3NWZWN0b3JbTl0pOworICAgIHJldHVybiBMUDsKKyAgfQorCisgIFBhc3NNYW5hZ2VyVHlwZSBnZXRQYXNzTWFuYWdlclR5cGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIFBNVF9Mb29wUGFzc01hbmFnZXI7CisgIH0KKworcHVibGljOgorICAvLyBBZGQgYSBuZXcgbG9vcCBpbnRvIHRoZSBsb29wIHF1ZXVlLgorICB2b2lkIGFkZExvb3AoTG9vcCAmTCk7CisKKyAgLy8gTWFyayBccCBMIGFzIGRlbGV0ZWQuCisgIHZvaWQgbWFya0xvb3BBc0RlbGV0ZWQoTG9vcCAmTCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBTaW1wbGVBbmFseXNpcyAtIFByb3ZpZGVzIHNpbXBsZSBpbnRlcmZhY2UgdG8gdXBkYXRlIGFuYWx5c2lzIGluZm8KKyAgLy8vIG1haW50YWluZWQgYnkgdmFyaW91cyBwYXNzZXMuIE5vdGUsIGlmIHJlcXVpcmVkIHRoaXMgaW50ZXJmYWNlIGNhbgorICAvLy8gYmUgZXh0cmFjdGVkIGludG8gYSBzZXBhcmF0ZSBhYnN0cmFjdCBjbGFzcyBidXQgaXQgd291bGQgcmVxdWlyZQorICAvLy8gYWRkaXRpb25hbCB1c2Ugb2YgbXVsdGlwbGUgaW5oZXJpdGFuY2UgaW4gUGFzcyBjbGFzcyBoaWVyYXJjaHksIHNvbWV0aGluZworICAvLy8gd2UgYXJlIHRyeWluZyB0byBhdm9pZC4KKworICAvLy8gY2xvbmVCYXNpY0Jsb2NrU2ltcGxlQW5hbHlzaXMgLSBJbnZva2UgY2xvbmVCYXNpY0Jsb2NrQW5hbHlzaXMgaG9vayBmb3IKKyAgLy8vIGFsbCBwYXNzZXMgdGhhdCBpbXBsZW1lbnQgc2ltcGxlIGFuYWx5c2lzIGludGVyZmFjZS4KKyAgdm9pZCBjbG9uZUJhc2ljQmxvY2tTaW1wbGVBbmFseXNpcyhCYXNpY0Jsb2NrICpGcm9tLCBCYXNpY0Jsb2NrICpUbywgTG9vcCAqTCk7CisKKyAgLy8vIGRlbGV0ZVNpbXBsZUFuYWx5c2lzVmFsdWUgLSBJbnZva2UgZGVsZXRlQW5hbHlzaXNWYWx1ZSBob29rIGZvciBhbGwgcGFzc2VzCisgIC8vLyB0aGF0IGltcGxlbWVudCBzaW1wbGUgYW5hbHlzaXMgaW50ZXJmYWNlLgorICB2b2lkIGRlbGV0ZVNpbXBsZUFuYWx5c2lzVmFsdWUoVmFsdWUgKlYsIExvb3AgKkwpOworCisgIC8vLyBJbnZva2UgZGVsZXRlQW5hbHlzaXNMb29wIGhvb2sgZm9yIGFsbCBwYXNzZXMgdGhhdCBpbXBsZW1lbnQgc2ltcGxlCisgIC8vLyBhbmFseXNpcyBpbnRlcmZhY2UuCisgIHZvaWQgZGVsZXRlU2ltcGxlQW5hbHlzaXNMb29wKExvb3AgKkwpOworCitwcml2YXRlOgorICBzdGQ6OmRlcXVlPExvb3AgKj4gTFE7CisgIExvb3BJbmZvICpMSTsKKyAgTG9vcCAqQ3VycmVudExvb3A7CisgIGJvb2wgQ3VycmVudExvb3BEZWxldGVkOworfTsKKworLy8gVGhpcyBwYXNzIGlzIHJlcXVpcmVkIGJ5IHRoZSBMQ1NTQSB0cmFuc2Zvcm1hdGlvbi4gSXQgaXMgdXNlZCBpbnNpZGUKKy8vIExQUGFzc01hbmFnZXIgdG8gY2hlY2sgaWYgY3VycmVudCBwYXNzIHByZXNlcnZlcyBMQ1NTQSBmb3JtLCBhbmQgaWYgaXQgZG9lcworLy8gcGFzcyBtYW5hZ2VyIGNhbGxzIGxjc3NhIHZlcmlmaWNhdGlvbiBmb3IgdGhlIGN1cnJlbnQgbG9vcC4KK3N0cnVjdCBMQ1NTQVZlcmlmaWNhdGlvblBhc3MgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgc3RhdGljIGNoYXIgSUQ7CisgIExDU1NBVmVyaWZpY2F0aW9uUGFzcygpIDogRnVuY3Rpb25QYXNzKElEKSB7CisgICAgaW5pdGlhbGl6ZUxDU1NBVmVyaWZpY2F0aW9uUGFzc1Bhc3MoKlBhc3NSZWdpc3RyeTo6Z2V0UGFzc1JlZ2lzdHJ5KCkpOworICB9CisKKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIEFVLnNldFByZXNlcnZlc0FsbCgpOworICB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTG9vcFVucm9sbEFuYWx5emVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvb3BVbnJvbGxBbmFseXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZjNlNWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL0xvb3BVbnJvbGxBbmFseXplci5oCkBAIC0wLDAgKzEsOTUgQEAKKy8vPT09LSBsbHZtL0FuYWx5c2lzL0xvb3BVbnJvbGxBbmFseXplci5oIC0gTG9vcCBVbnJvbGwgQW5hbHl6ZXItKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgVW5yb2xsZWRJbnN0QW5hbHl6ZXIgY2xhc3MuIEl0J3MgdXNlZCBmb3IgcHJlZGljdGluZworLy8gcG90ZW50aWFsIGVmZmVjdHMgdGhhdCBsb29wIHVucm9sbGluZyBtaWdodCBoYXZlLCBzdWNoIGFzIGVuYWJsaW5nIGNvbnN0YW50CisvLyBwcm9wYWdhdGlvbiBhbmQgb3RoZXIgb3B0aW1pemF0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfTE9PUFVOUk9MTEFOQUxZWkVSX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19MT09QVU5ST0xMQU5BTFlaRVJfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9JbnN0cnVjdGlvblNpbXBsaWZ5LmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25FeHByZXNzaW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdFZpc2l0b3IuaCIKKworLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGdldCBhbiBlc3RpbWF0ZSBvZiB0aGUgb3B0aW1pemF0aW9uIGVmZmVjdHMgdGhhdCB3ZQorLy8gY291bGQgZ2V0IGZyb20gY29tcGxldGUgbG9vcCB1bnJvbGxpbmcuIEl0IGNvbWVzIGZyb20gdGhlIGZhY3QgdGhhdCBzb21lCisvLyBsb2FkcyBtaWdodCBiZSByZXBsYWNlZCB3aXRoIGNvbmNyZXRlIGNvbnN0YW50IHZhbHVlcyBhbmQgdGhhdCBjb3VsZCB0cmlnZ2VyCisvLyBhIGNoYWluIG9mIGluc3RydWN0aW9uIHNpbXBsaWZpY2F0aW9ucy4KKy8vCisvLyBFLmcuIHdlIG1pZ2h0IGhhdmU6CisvLyAgIGludCBhW10gPSB7MCwgMSwgMH07CisvLyAgIHYgPSAwOworLy8gICBmb3IgKGkgPSAwOyBpIDwgMzsgaSArKykKKy8vICAgICB2ICs9IGJbaV0qYVtpXTsKKy8vIElmIHdlIGNvbXBsZXRlbHkgdW5yb2xsIHRoZSBsb29wLCB3ZSB3b3VsZCBnZXQ6CisvLyAgIHYgPSBiWzBdKmFbMF0gKyBiWzFdKmFbMV0gKyBiWzJdKmFbMl0KKy8vIFdoaWNoIHRoZW4gd2lsbCBiZSBzaW1wbGlmaWVkIHRvOgorLy8gICB2ID0gYlswXSogMCArIGJbMV0qIDEgKyBiWzJdKiAwCisvLyBBbmQgZmluYWxseToKKy8vICAgdiA9IGJbMV0KK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFVucm9sbGVkSW5zdEFuYWx5emVyIDogcHJpdmF0ZSBJbnN0VmlzaXRvcjxVbnJvbGxlZEluc3RBbmFseXplciwgYm9vbD4geworICB0eXBlZGVmIEluc3RWaXNpdG9yPFVucm9sbGVkSW5zdEFuYWx5emVyLCBib29sPiBCYXNlOworICBmcmllbmQgY2xhc3MgSW5zdFZpc2l0b3I8VW5yb2xsZWRJbnN0QW5hbHl6ZXIsIGJvb2w+OworICBzdHJ1Y3QgU2ltcGxpZmllZEFkZHJlc3MgeworICAgIFZhbHVlICpCYXNlID0gbnVsbHB0cjsKKyAgICBDb25zdGFudEludCAqT2Zmc2V0ID0gbnVsbHB0cjsKKyAgfTsKKworcHVibGljOgorICBVbnJvbGxlZEluc3RBbmFseXplcih1bnNpZ25lZCBJdGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPFZhbHVlICosIENvbnN0YW50ICo+ICZTaW1wbGlmaWVkVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gJlNFLCBjb25zdCBMb29wICpMKQorICAgICAgOiBTaW1wbGlmaWVkVmFsdWVzKFNpbXBsaWZpZWRWYWx1ZXMpLCBTRShTRSksIEwoTCkgeworICAgICAgSXRlcmF0aW9uTnVtYmVyID0gU0UuZ2V0Q29uc3RhbnQoQVBJbnQoNjQsIEl0ZXJhdGlvbikpOworICB9CisKKyAgLy8gQWxsb3cgYWNjZXNzIHRvIHRoZSBpbml0aWFsIHZpc2l0IG1ldGhvZC4KKyAgdXNpbmcgQmFzZTo6dmlzaXQ7CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgQSBjYWNoZSBvZiBwb2ludGVyIGJhc2VzIGFuZCBjb25zdGFudC1mb2xkZWQgb2Zmc2V0cyBjb3JyZXNwb25kaW5nCisgIC8vLyB0byBHRVAgKG9yIGRlcml2ZWQgZnJvbSBHRVApIGluc3RydWN0aW9ucy4KKyAgLy8vCisgIC8vLyBJbiBvcmRlciB0byBmaW5kIHRoZSBiYXNlIHBvaW50ZXIgb25lIG5lZWRzIHRvIHBlcmZvcm0gbm9uLXRyaXZpYWwKKyAgLy8vIHRyYXZlcnNhbCBvZiB0aGUgY29ycmVzcG9uZGluZyBTQ0VWIGV4cHJlc3Npb24sIHNvIGl0J3MgZ29vZCB0byBoYXZlIHRoZQorICAvLy8gcmVzdWx0cyBzYXZlZC4KKyAgRGVuc2VNYXA8VmFsdWUgKiwgU2ltcGxpZmllZEFkZHJlc3M+IFNpbXBsaWZpZWRBZGRyZXNzZXM7CisKKyAgLy8vIFxicmllZiBTQ0VWIGV4cHJlc3Npb24gY29ycmVzcG9uZGluZyB0byBudW1iZXIgb2YgY3VycmVudGx5IHNpbXVsYXRlZAorICAvLy8gaXRlcmF0aW9uLgorICBjb25zdCBTQ0VWICpJdGVyYXRpb25OdW1iZXI7CisKKyAgLy8vIFxicmllZiBBIFZhbHVlLT5Db25zdGFudCBtYXAgZm9yIGtlZXBpbmcgdmFsdWVzIHRoYXQgd2UgbWFuYWdlZCB0bworICAvLy8gY29uc3RhbnQtZm9sZCBvbiB0aGUgZ2l2ZW4gaXRlcmF0aW9uLgorICAvLy8KKyAgLy8vIFdoaWxlIHdlIHdhbGsgdGhlIGxvb3AgaW5zdHJ1Y3Rpb25zLCB3ZSBidWlsZCB1cCBhbmQgbWFpbnRhaW4gYSBtYXBwaW5nCisgIC8vLyBvZiBzaW1wbGlmaWVkIHZhbHVlcyBzcGVjaWZpYyB0byB0aGlzIGl0ZXJhdGlvbi4gIFRoZSBpZGVhIGlzIHRvIHByb3BhZ2F0ZQorICAvLy8gYW55IHNwZWNpYWwgaW5mb3JtYXRpb24gd2UgaGF2ZSBhYm91dCBsb2FkcyB0aGF0IGNhbiBiZSByZXBsYWNlZCB3aXRoCisgIC8vLyBjb25zdGFudHMgYWZ0ZXIgY29tcGxldGUgdW5yb2xsaW5nLCBhbmQgYWNjb3VudCBmb3IgbGlrZWx5IHNpbXBsaWZpY2F0aW9ucworICAvLy8gcG9zdC11bnJvbGxpbmcuCisgIERlbnNlTWFwPFZhbHVlICosIENvbnN0YW50ICo+ICZTaW1wbGlmaWVkVmFsdWVzOworCisgIFNjYWxhckV2b2x1dGlvbiAmU0U7CisgIGNvbnN0IExvb3AgKkw7CisKKyAgYm9vbCBzaW1wbGlmeUluc3RXaXRoU0NFVihJbnN0cnVjdGlvbiAqSSk7CisKKyAgYm9vbCB2aXNpdEluc3RydWN0aW9uKEluc3RydWN0aW9uICZJKSB7IHJldHVybiBzaW1wbGlmeUluc3RXaXRoU0NFVigmSSk7IH0KKyAgYm9vbCB2aXNpdEJpbmFyeU9wZXJhdG9yKEJpbmFyeU9wZXJhdG9yICZJKTsKKyAgYm9vbCB2aXNpdExvYWQoTG9hZEluc3QgJkkpOworICBib29sIHZpc2l0Q2FzdEluc3QoQ2FzdEluc3QgJkkpOworICBib29sIHZpc2l0Q21wSW5zdChDbXBJbnN0ICZJKTsKKyAgYm9vbCB2aXNpdFBISU5vZGUoUEhJTm9kZSAmUE4pOworfTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9NZW1vcnlCdWlsdGlucy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9NZW1vcnlCdWlsdGlucy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNTNlMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL01lbW9yeUJ1aWx0aW5zLmgKQEAgLTAsMCArMSwzMTMgQEAKKy8vPT0tIGxsdm0vQW5hbHlzaXMvTWVtb3J5QnVpbHRpbnMuaCAtIENhbGxzIHRvIG1lbW9yeSBidWlsdGlucyAtLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmYW1pbHkgb2YgZnVuY3Rpb25zIGlkZW50aWZpZXMgY2FsbHMgdG8gYnVpbHRpbiBmdW5jdGlvbnMgdGhhdCBhbGxvY2F0ZQorLy8gb3IgZnJlZSBtZW1vcnkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX01FTU9SWUJVSUxUSU5TX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19NRU1PUllCVUlMVElOU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1RhcmdldEZvbGRlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0lSQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdFZpc2l0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlSGFuZGxlLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFsbG9jYUluc3Q7CitjbGFzcyBBcmd1bWVudDsKK2NsYXNzIENhbGxJbnN0OworY2xhc3MgQ29uc3RhbnRJbnQ7CitjbGFzcyBDb25zdGFudFBvaW50ZXJOdWxsOworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIEV4dHJhY3RFbGVtZW50SW5zdDsKK2NsYXNzIEV4dHJhY3RWYWx1ZUluc3Q7CitjbGFzcyBHRVBPcGVyYXRvcjsKK2NsYXNzIEdsb2JhbEFsaWFzOworY2xhc3MgR2xvYmFsVmFyaWFibGU7CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIEludGVnZXJUeXBlOworY2xhc3MgSW50cmluc2ljSW5zdDsKK2NsYXNzIEludFRvUHRySW5zdDsKK2NsYXNzIExMVk1Db250ZXh0OworY2xhc3MgTG9hZEluc3Q7CitjbGFzcyBQSElOb2RlOworY2xhc3MgUG9pbnRlclR5cGU7CitjbGFzcyBTZWxlY3RJbnN0OworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CitjbGFzcyBUeXBlOworY2xhc3MgVW5kZWZWYWx1ZTsKK2NsYXNzIFZhbHVlOworCisvLy8gXGJyaWVmIFRlc3RzIGlmIGEgdmFsdWUgaXMgYSBjYWxsIG9yIGludm9rZSB0byBhIGxpYnJhcnkgZnVuY3Rpb24gdGhhdAorLy8vIGFsbG9jYXRlcyBvciByZWFsbG9jYXRlcyBtZW1vcnkgKGVpdGhlciBtYWxsb2MsIGNhbGxvYywgcmVhbGxvYywgb3Igc3RyZHVwCisvLy8gbGlrZSkuCitib29sIGlzQWxsb2NhdGlvbkZuKGNvbnN0IFZhbHVlICpWLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJLAorICAgICAgICAgICAgICAgICAgICBib29sIExvb2tUaHJvdWdoQml0Q2FzdCA9IGZhbHNlKTsKKworLy8vIFxicmllZiBUZXN0cyBpZiBhIHZhbHVlIGlzIGEgY2FsbCBvciBpbnZva2UgdG8gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYQorLy8vIE5vQWxpYXMgcG9pbnRlciAoaW5jbHVkaW5nIG1hbGxvYy9jYWxsb2MvcmVhbGxvYy9zdHJkdXAtbGlrZSBmdW5jdGlvbnMpLgorYm9vbCBpc05vQWxpYXNGbihjb25zdCBWYWx1ZSAqViwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSwKKyAgICAgICAgICAgICAgICAgYm9vbCBMb29rVGhyb3VnaEJpdENhc3QgPSBmYWxzZSk7CisKKy8vLyBcYnJpZWYgVGVzdHMgaWYgYSB2YWx1ZSBpcyBhIGNhbGwgb3IgaW52b2tlIHRvIGEgbGlicmFyeSBmdW5jdGlvbiB0aGF0CisvLy8gYWxsb2NhdGVzIHVuaW5pdGlhbGl6ZWQgbWVtb3J5IChzdWNoIGFzIG1hbGxvYykuCitib29sIGlzTWFsbG9jTGlrZUZuKGNvbnN0IFZhbHVlICpWLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJLAorICAgICAgICAgICAgICAgICAgICBib29sIExvb2tUaHJvdWdoQml0Q2FzdCA9IGZhbHNlKTsKKworLy8vIFxicmllZiBUZXN0cyBpZiBhIHZhbHVlIGlzIGEgY2FsbCBvciBpbnZva2UgdG8gYSBsaWJyYXJ5IGZ1bmN0aW9uIHRoYXQKKy8vLyBhbGxvY2F0ZXMgemVyby1maWxsZWQgbWVtb3J5IChzdWNoIGFzIGNhbGxvYykuCitib29sIGlzQ2FsbG9jTGlrZUZuKGNvbnN0IFZhbHVlICpWLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJLAorICAgICAgICAgICAgICAgICAgICBib29sIExvb2tUaHJvdWdoQml0Q2FzdCA9IGZhbHNlKTsKKworLy8vIFxicmllZiBUZXN0cyBpZiBhIHZhbHVlIGlzIGEgY2FsbCBvciBpbnZva2UgdG8gYSBsaWJyYXJ5IGZ1bmN0aW9uIHRoYXQKKy8vLyBhbGxvY2F0ZXMgbWVtb3J5IHNpbWlsYXIgdG8gbWFsbG9jIG9yIGNhbGxvYy4KK2Jvb2wgaXNNYWxsb2NPckNhbGxvY0xpa2VGbihjb25zdCBWYWx1ZSAqViwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIExvb2tUaHJvdWdoQml0Q2FzdCA9IGZhbHNlKTsKKworLy8vIFxicmllZiBUZXN0cyBpZiBhIHZhbHVlIGlzIGEgY2FsbCBvciBpbnZva2UgdG8gYSBsaWJyYXJ5IGZ1bmN0aW9uIHRoYXQKKy8vLyBhbGxvY2F0ZXMgbWVtb3J5IChlaXRoZXIgbWFsbG9jLCBjYWxsb2MsIG9yIHN0cmR1cCBsaWtlKS4KK2Jvb2wgaXNBbGxvY0xpa2VGbihjb25zdCBWYWx1ZSAqViwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSwKKyAgICAgICAgICAgICAgICAgICBib29sIExvb2tUaHJvdWdoQml0Q2FzdCA9IGZhbHNlKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBtYWxsb2MgQ2FsbCBVdGlsaXR5IEZ1bmN0aW9ucy4KKy8vCisKKy8vLyBleHRyYWN0TWFsbG9jQ2FsbCAtIFJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgQ2FsbEluc3QgaWYgdGhlIGluc3RydWN0aW9uCisvLy8gaXMgYSBtYWxsb2MgY2FsbC4gIFNpbmNlIENhbGxJbnN0OjpDcmVhdGVNYWxsb2MoKSBvbmx5IGNyZWF0ZXMgY2FsbHMsIHdlCisvLy8gaWdub3JlIEludm9rZUluc3QgaGVyZS4KK2NvbnN0IENhbGxJbnN0ICpleHRyYWN0TWFsbG9jQ2FsbChjb25zdCBWYWx1ZSAqSSwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSk7CitpbmxpbmUgQ2FsbEluc3QgKmV4dHJhY3RNYWxsb2NDYWxsKFZhbHVlICpJLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKSB7CisgIHJldHVybiBjb25zdF9jYXN0PENhbGxJbnN0Kj4oZXh0cmFjdE1hbGxvY0NhbGwoKGNvbnN0IFZhbHVlKilJLCBUTEkpKTsKK30KKworLy8vIGdldE1hbGxvY1R5cGUgLSBSZXR1cm5zIHRoZSBQb2ludGVyVHlwZSByZXN1bHRpbmcgZnJvbSB0aGUgbWFsbG9jIGNhbGwuCisvLy8gVGhlIFBvaW50ZXJUeXBlIGRlcGVuZHMgb24gdGhlIG51bWJlciBvZiBiaXRjYXN0IHVzZXMgb2YgdGhlIG1hbGxvYyBjYWxsOgorLy8vICAgMDogUG9pbnRlclR5cGUgaXMgdGhlIG1hbGxvYyBjYWxscycgcmV0dXJuIHR5cGUuCisvLy8gICAxOiBQb2ludGVyVHlwZSBpcyB0aGUgYml0Y2FzdCdzIHJlc3VsdCB0eXBlLgorLy8vICA+MTogVW5pcXVlIFBvaW50ZXJUeXBlIGNhbm5vdCBiZSBkZXRlcm1pbmVkLCByZXR1cm4gTlVMTC4KK1BvaW50ZXJUeXBlICpnZXRNYWxsb2NUeXBlKGNvbnN0IENhbGxJbnN0ICpDSSwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSk7CisKKy8vLyBnZXRNYWxsb2NBbGxvY2F0ZWRUeXBlIC0gUmV0dXJucyB0aGUgVHlwZSBhbGxvY2F0ZWQgYnkgbWFsbG9jIGNhbGwuCisvLy8gVGhlIFR5cGUgZGVwZW5kcyBvbiB0aGUgbnVtYmVyIG9mIGJpdGNhc3QgdXNlcyBvZiB0aGUgbWFsbG9jIGNhbGw6CisvLy8gICAwOiBQb2ludGVyVHlwZSBpcyB0aGUgbWFsbG9jIGNhbGxzJyByZXR1cm4gdHlwZS4KKy8vLyAgIDE6IFBvaW50ZXJUeXBlIGlzIHRoZSBiaXRjYXN0J3MgcmVzdWx0IHR5cGUuCisvLy8gID4xOiBVbmlxdWUgUG9pbnRlclR5cGUgY2Fubm90IGJlIGRldGVybWluZWQsIHJldHVybiBOVUxMLgorVHlwZSAqZ2V0TWFsbG9jQWxsb2NhdGVkVHlwZShjb25zdCBDYWxsSW5zdCAqQ0ksIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkpOworCisvLy8gZ2V0TWFsbG9jQXJyYXlTaXplIC0gUmV0dXJucyB0aGUgYXJyYXkgc2l6ZSBvZiBhIG1hbGxvYyBjYWxsLiAgSWYgdGhlCisvLy8gYXJndW1lbnQgcGFzc2VkIHRvIG1hbGxvYyBpcyBhIG11bHRpcGxlIG9mIHRoZSBzaXplIG9mIHRoZSBtYWxsb2NlZCB0eXBlLAorLy8vIHRoZW4gcmV0dXJuIHRoYXQgbXVsdGlwbGUuICBGb3Igbm9uLWFycmF5IG1hbGxvY3MsIHRoZSBtdWx0aXBsZSBpcworLy8vIGNvbnN0YW50IDEuICBPdGhlcndpc2UsIHJldHVybiBOVUxMIGZvciBtYWxsb2NzIHdob3NlIGFycmF5IHNpemUgY2Fubm90IGJlCisvLy8gZGV0ZXJtaW5lZC4KK1ZhbHVlICpnZXRNYWxsb2NBcnJheVNpemUoQ2FsbEluc3QgKkNJLCBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBMb29rVGhyb3VnaFNFeHQgPSBmYWxzZSk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgY2FsbG9jIENhbGwgVXRpbGl0eSBGdW5jdGlvbnMuCisvLworCisvLy8gZXh0cmFjdENhbGxvY0NhbGwgLSBSZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIENhbGxJbnN0IGlmIHRoZSBpbnN0cnVjdGlvbgorLy8vIGlzIGEgY2FsbG9jIGNhbGwuCitjb25zdCBDYWxsSW5zdCAqZXh0cmFjdENhbGxvY0NhbGwoY29uc3QgVmFsdWUgKkksIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkpOworaW5saW5lIENhbGxJbnN0ICpleHRyYWN0Q2FsbG9jQ2FsbChWYWx1ZSAqSSwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSkgeworICByZXR1cm4gY29uc3RfY2FzdDxDYWxsSW5zdCo+KGV4dHJhY3RDYWxsb2NDYWxsKChjb25zdCBWYWx1ZSopSSwgVExJKSk7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBmcmVlIENhbGwgVXRpbGl0eSBGdW5jdGlvbnMuCisvLworCisvLy8gaXNGcmVlQ2FsbCAtIFJldHVybnMgbm9uLW51bGwgaWYgdGhlIHZhbHVlIGlzIGEgY2FsbCB0byB0aGUgYnVpbHRpbiBmcmVlKCkKK2NvbnN0IENhbGxJbnN0ICppc0ZyZWVDYWxsKGNvbnN0IFZhbHVlICpJLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKTsKKworaW5saW5lIENhbGxJbnN0ICppc0ZyZWVDYWxsKFZhbHVlICpJLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKSB7CisgIHJldHVybiBjb25zdF9jYXN0PENhbGxJbnN0Kj4oaXNGcmVlQ2FsbCgoY29uc3QgVmFsdWUqKUksIFRMSSkpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIFV0aWxpdHkgZnVuY3Rpb25zIHRvIGNvbXB1dGUgc2l6ZSBvZiBvYmplY3RzLgorLy8KKworLy8vIFZhcmlvdXMgb3B0aW9ucyB0byBjb250cm9sIHRoZSBiZWhhdmlvciBvZiBnZXRPYmplY3RTaXplLgorc3RydWN0IE9iamVjdFNpemVPcHRzIHsKKyAgLy8vIENvbnRyb2xzIGhvdyB3ZSBoYW5kbGUgY29uZGl0aW9uYWwgc3RhdGVtZW50cyB3aXRoIHVua25vd24gY29uZGl0aW9ucy4KKyAgZW51bSBjbGFzcyBNb2RlIDogdWludDhfdCB7CisgICAgLy8vIEZhaWwgdG8gZXZhbHVhdGUgYW4gdW5rbm93biBjb25kaXRpb24uCisgICAgRXhhY3QsCisgICAgLy8vIEV2YWx1YXRlIGFsbCBicmFuY2hlcyBvZiBhbiB1bmtub3duIGNvbmRpdGlvbi4gSWYgYWxsIGV2YWx1YXRpb25zCisgICAgLy8vIHN1Y2NlZWQsIHBpY2sgdGhlIG1pbmltdW0gc2l6ZS4KKyAgICBNaW4sCisgICAgLy8vIFNhbWUgYXMgTWluLCBleGNlcHQgd2UgcGljayB0aGUgbWF4aW11bSBzaXplIG9mIGFsbCBvZiB0aGUgYnJhbmNoZXMuCisgICAgTWF4CisgIH07CisKKyAgLy8vIEhvdyB3ZSB3YW50IHRvIGV2YWx1YXRlIHRoaXMgb2JqZWN0J3Mgc2l6ZS4KKyAgTW9kZSBFdmFsTW9kZSA9IE1vZGU6OkV4YWN0OworICAvLy8gV2hldGhlciB0byByb3VuZCB0aGUgcmVzdWx0IHVwIHRvIHRoZSBhbGlnbm1lbnQgb2YgYWxsb2NhcywgYnl2YWwKKyAgLy8vIGFyZ3VtZW50cywgYW5kIGdsb2JhbCB2YXJpYWJsZXMuCisgIGJvb2wgUm91bmRUb0FsaWduID0gZmFsc2U7CisgIC8vLyBJZiB0aGlzIGlzIHRydWUsIG51bGwgcG9pbnRlcnMgaW4gYWRkcmVzcyBzcGFjZSAwIHdpbGwgYmUgdHJlYXRlZCBhcworICAvLy8gdGhvdWdoIHRoZXkgY2FuJ3QgYmUgZXZhbHVhdGVkLiBPdGhlcndpc2UsIG51bGwgaXMgYWx3YXlzIGNvbnNpZGVyZWQgdG8KKyAgLy8vIHBvaW50IHRvIGEgMCBieXRlIHJlZ2lvbiBvZiBtZW1vcnkuCisgIGJvb2wgTnVsbElzVW5rbm93blNpemUgPSBmYWxzZTsKK307CisKKy8vLyBcYnJpZWYgQ29tcHV0ZSB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0IHBvaW50ZWQgYnkgUHRyLiBSZXR1cm5zIHRydWUgYW5kIHRoZQorLy8vIG9iamVjdCBzaXplIGluIFNpemUgaWYgc3VjY2Vzc2Z1bCwgYW5kIGZhbHNlIG90aGVyd2lzZS4gSW4gdGhpcyBjb250ZXh0LCBieQorLy8vIG9iamVjdCB3ZSBtZWFuIHRoZSByZWdpb24gb2YgbWVtb3J5IHN0YXJ0aW5nIGF0IFB0ciB0byB0aGUgZW5kIG9mIHRoZQorLy8vIHVuZGVybHlpbmcgb2JqZWN0IHBvaW50ZWQgdG8gYnkgUHRyLgorYm9vbCBnZXRPYmplY3RTaXplKGNvbnN0IFZhbHVlICpQdHIsIHVpbnQ2NF90ICZTaXplLCBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJLCBPYmplY3RTaXplT3B0cyBPcHRzID0ge30pOworCisvLy8gVHJ5IHRvIHR1cm4gYSBjYWxsIHRvIEBsbHZtLm9iamVjdHNpemUgaW50byBhbiBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBnaXZlbgorLy8vIFR5cGUuIFJldHVybnMgbnVsbCBvbiBmYWlsdXJlLgorLy8vIElmIE11c3RTdWNjZWVkIGlzIHRydWUsIHRoaXMgZnVuY3Rpb24gd2lsbCBub3QgcmV0dXJuIG51bGwsIGFuZCBtYXkgcmV0dXJuCisvLy8gY29uc2VydmF0aXZlIHZhbHVlcyBnb3Zlcm5lZCBieSB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIHRoZSBjYWxsIHRvCisvLy8gb2JqZWN0c2l6ZS4KK0NvbnN0YW50SW50ICpsb3dlck9iamVjdFNpemVDYWxsKEludHJpbnNpY0luc3QgKk9iamVjdFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE11c3RTdWNjZWVkKTsKKwordXNpbmcgU2l6ZU9mZnNldFR5cGUgPSBzdGQ6OnBhaXI8QVBJbnQsIEFQSW50PjsKKworLy8vIFxicmllZiBFdmFsdWF0ZSB0aGUgc2l6ZSBhbmQgb2Zmc2V0IG9mIGFuIG9iamVjdCBwb2ludGVkIHRvIGJ5IGEgVmFsdWUqCisvLy8gc3RhdGljYWxseS4gRmFpbHMgaWYgc2l6ZSBvciBvZmZzZXQgYXJlIG5vdCBrbm93biBhdCBjb21waWxlIHRpbWUuCitjbGFzcyBPYmplY3RTaXplT2Zmc2V0VmlzaXRvcgorICA6IHB1YmxpYyBJbnN0VmlzaXRvcjxPYmplY3RTaXplT2Zmc2V0VmlzaXRvciwgU2l6ZU9mZnNldFR5cGU+IHsKKyAgY29uc3QgRGF0YUxheW91dCAmREw7CisgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEk7CisgIE9iamVjdFNpemVPcHRzIE9wdGlvbnM7CisgIHVuc2lnbmVkIEludFR5Qml0czsKKyAgQVBJbnQgWmVybzsKKyAgU21hbGxQdHJTZXQ8SW5zdHJ1Y3Rpb24gKiwgOD4gU2Vlbkluc3RzOworCisgIEFQSW50IGFsaWduKEFQSW50IFNpemUsIHVpbnQ2NF90IEFsaWduKTsKKworICBTaXplT2Zmc2V0VHlwZSB1bmtub3duKCkgeworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihBUEludCgpLCBBUEludCgpKTsKKyAgfQorCitwdWJsaWM6CisgIE9iamVjdFNpemVPZmZzZXRWaXNpdG9yKGNvbnN0IERhdGFMYXlvdXQgJkRMLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJLAorICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQ29udGV4dCAmQ29udGV4dCwgT2JqZWN0U2l6ZU9wdHMgT3B0aW9ucyA9IHt9KTsKKworICBTaXplT2Zmc2V0VHlwZSBjb21wdXRlKFZhbHVlICpWKTsKKworICBzdGF0aWMgYm9vbCBrbm93blNpemUoY29uc3QgU2l6ZU9mZnNldFR5cGUgJlNpemVPZmZzZXQpIHsKKyAgICByZXR1cm4gU2l6ZU9mZnNldC5maXJzdC5nZXRCaXRXaWR0aCgpID4gMTsKKyAgfQorCisgIHN0YXRpYyBib29sIGtub3duT2Zmc2V0KGNvbnN0IFNpemVPZmZzZXRUeXBlICZTaXplT2Zmc2V0KSB7CisgICAgcmV0dXJuIFNpemVPZmZzZXQuc2Vjb25kLmdldEJpdFdpZHRoKCkgPiAxOworICB9CisKKyAgc3RhdGljIGJvb2wgYm90aEtub3duKGNvbnN0IFNpemVPZmZzZXRUeXBlICZTaXplT2Zmc2V0KSB7CisgICAgcmV0dXJuIGtub3duU2l6ZShTaXplT2Zmc2V0KSAmJiBrbm93bk9mZnNldChTaXplT2Zmc2V0KTsKKyAgfQorCisgIC8vIFRoZXNlIGFyZSAicHJpdmF0ZSIsIGV4Y2VwdCB0aGV5IGNhbid0IGFjdHVhbGx5IGJlIG1hZGUgcHJpdmF0ZS4gT25seQorICAvLyBjb21wdXRlKCkgc2hvdWxkIGJlIHVzZWQgYnkgZXh0ZXJuYWwgdXNlcnMuCisgIFNpemVPZmZzZXRUeXBlIHZpc2l0QWxsb2NhSW5zdChBbGxvY2FJbnN0ICZJKTsKKyAgU2l6ZU9mZnNldFR5cGUgdmlzaXRBcmd1bWVudChBcmd1bWVudCAmQSk7CisgIFNpemVPZmZzZXRUeXBlIHZpc2l0Q2FsbFNpdGUoQ2FsbFNpdGUgQ1MpOworICBTaXplT2Zmc2V0VHlwZSB2aXNpdENvbnN0YW50UG9pbnRlck51bGwoQ29uc3RhbnRQb2ludGVyTnVsbCYpOworICBTaXplT2Zmc2V0VHlwZSB2aXNpdEV4dHJhY3RFbGVtZW50SW5zdChFeHRyYWN0RWxlbWVudEluc3QgJkkpOworICBTaXplT2Zmc2V0VHlwZSB2aXNpdEV4dHJhY3RWYWx1ZUluc3QoRXh0cmFjdFZhbHVlSW5zdCAmSSk7CisgIFNpemVPZmZzZXRUeXBlIHZpc2l0R0VQT3BlcmF0b3IoR0VQT3BlcmF0b3IgJkdFUCk7CisgIFNpemVPZmZzZXRUeXBlIHZpc2l0R2xvYmFsQWxpYXMoR2xvYmFsQWxpYXMgJkdBKTsKKyAgU2l6ZU9mZnNldFR5cGUgdmlzaXRHbG9iYWxWYXJpYWJsZShHbG9iYWxWYXJpYWJsZSAmR1YpOworICBTaXplT2Zmc2V0VHlwZSB2aXNpdEludFRvUHRySW5zdChJbnRUb1B0ckluc3QmKTsKKyAgU2l6ZU9mZnNldFR5cGUgdmlzaXRMb2FkSW5zdChMb2FkSW5zdCAmSSk7CisgIFNpemVPZmZzZXRUeXBlIHZpc2l0UEhJTm9kZShQSElOb2RlJik7CisgIFNpemVPZmZzZXRUeXBlIHZpc2l0U2VsZWN0SW5zdChTZWxlY3RJbnN0ICZJKTsKKyAgU2l6ZU9mZnNldFR5cGUgdmlzaXRVbmRlZlZhbHVlKFVuZGVmVmFsdWUmKTsKKyAgU2l6ZU9mZnNldFR5cGUgdmlzaXRJbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAmSSk7CisKK3ByaXZhdGU6CisgIGJvb2wgQ2hlY2tlZFpleHRPclRydW5jKEFQSW50ICZJKTsKK307CisKK3VzaW5nIFNpemVPZmZzZXRFdmFsVHlwZSA9IHN0ZDo6cGFpcjxWYWx1ZSAqLCBWYWx1ZSAqPjsKKworLy8vIFxicmllZiBFdmFsdWF0ZSB0aGUgc2l6ZSBhbmQgb2Zmc2V0IG9mIGFuIG9iamVjdCBwb2ludGVkIHRvIGJ5IGEgVmFsdWUqLgorLy8vIE1heSBjcmVhdGUgY29kZSB0byBjb21wdXRlIHRoZSByZXN1bHQgYXQgcnVuLXRpbWUuCitjbGFzcyBPYmplY3RTaXplT2Zmc2V0RXZhbHVhdG9yCisgIDogcHVibGljIEluc3RWaXNpdG9yPE9iamVjdFNpemVPZmZzZXRFdmFsdWF0b3IsIFNpemVPZmZzZXRFdmFsVHlwZT4geworICB1c2luZyBCdWlsZGVyVHkgPSBJUkJ1aWxkZXI8VGFyZ2V0Rm9sZGVyPjsKKyAgdXNpbmcgV2Vha0V2YWxUeXBlID0gc3RkOjpwYWlyPFdlYWtUcmFja2luZ1ZILCBXZWFrVHJhY2tpbmdWSD47CisgIHVzaW5nIENhY2hlTWFwVHkgPSBEZW5zZU1hcDxjb25zdCBWYWx1ZSAqLCBXZWFrRXZhbFR5cGU+OworICB1c2luZyBQdHJTZXRUeSA9IFNtYWxsUHRyU2V0PGNvbnN0IFZhbHVlICosIDg+OworCisgIGNvbnN0IERhdGFMYXlvdXQgJkRMOworICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJOworICBMTFZNQ29udGV4dCAmQ29udGV4dDsKKyAgQnVpbGRlclR5IEJ1aWxkZXI7CisgIEludGVnZXJUeXBlICpJbnRUeTsKKyAgVmFsdWUgKlplcm87CisgIENhY2hlTWFwVHkgQ2FjaGVNYXA7CisgIFB0clNldFR5IFNlZW5WYWxzOworICBib29sIFJvdW5kVG9BbGlnbjsKKworICBTaXplT2Zmc2V0RXZhbFR5cGUgdW5rbm93bigpIHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIobnVsbHB0ciwgbnVsbHB0cik7CisgIH0KKworICBTaXplT2Zmc2V0RXZhbFR5cGUgY29tcHV0ZV8oVmFsdWUgKlYpOworCitwdWJsaWM6CisgIE9iamVjdFNpemVPZmZzZXRFdmFsdWF0b3IoY29uc3QgRGF0YUxheW91dCAmREwsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUNvbnRleHQgJkNvbnRleHQsIGJvb2wgUm91bmRUb0FsaWduID0gZmFsc2UpOworCisgIFNpemVPZmZzZXRFdmFsVHlwZSBjb21wdXRlKFZhbHVlICpWKTsKKworICBib29sIGtub3duU2l6ZShTaXplT2Zmc2V0RXZhbFR5cGUgU2l6ZU9mZnNldCkgeworICAgIHJldHVybiBTaXplT2Zmc2V0LmZpcnN0OworICB9CisKKyAgYm9vbCBrbm93bk9mZnNldChTaXplT2Zmc2V0RXZhbFR5cGUgU2l6ZU9mZnNldCkgeworICAgIHJldHVybiBTaXplT2Zmc2V0LnNlY29uZDsKKyAgfQorCisgIGJvb2wgYW55S25vd24oU2l6ZU9mZnNldEV2YWxUeXBlIFNpemVPZmZzZXQpIHsKKyAgICByZXR1cm4ga25vd25TaXplKFNpemVPZmZzZXQpIHx8IGtub3duT2Zmc2V0KFNpemVPZmZzZXQpOworICB9CisKKyAgYm9vbCBib3RoS25vd24oU2l6ZU9mZnNldEV2YWxUeXBlIFNpemVPZmZzZXQpIHsKKyAgICByZXR1cm4ga25vd25TaXplKFNpemVPZmZzZXQpICYmIGtub3duT2Zmc2V0KFNpemVPZmZzZXQpOworICB9CisKKyAgLy8gVGhlIGluZGl2aWR1YWwgaW5zdHJ1Y3Rpb24gdmlzaXRvcnMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgcHJpdmF0ZS4KKyAgU2l6ZU9mZnNldEV2YWxUeXBlIHZpc2l0QWxsb2NhSW5zdChBbGxvY2FJbnN0ICZJKTsKKyAgU2l6ZU9mZnNldEV2YWxUeXBlIHZpc2l0Q2FsbFNpdGUoQ2FsbFNpdGUgQ1MpOworICBTaXplT2Zmc2V0RXZhbFR5cGUgdmlzaXRFeHRyYWN0RWxlbWVudEluc3QoRXh0cmFjdEVsZW1lbnRJbnN0ICZJKTsKKyAgU2l6ZU9mZnNldEV2YWxUeXBlIHZpc2l0RXh0cmFjdFZhbHVlSW5zdChFeHRyYWN0VmFsdWVJbnN0ICZJKTsKKyAgU2l6ZU9mZnNldEV2YWxUeXBlIHZpc2l0R0VQT3BlcmF0b3IoR0VQT3BlcmF0b3IgJkdFUCk7CisgIFNpemVPZmZzZXRFdmFsVHlwZSB2aXNpdEludFRvUHRySW5zdChJbnRUb1B0ckluc3QmKTsKKyAgU2l6ZU9mZnNldEV2YWxUeXBlIHZpc2l0TG9hZEluc3QoTG9hZEluc3QgJkkpOworICBTaXplT2Zmc2V0RXZhbFR5cGUgdmlzaXRQSElOb2RlKFBISU5vZGUgJlBISSk7CisgIFNpemVPZmZzZXRFdmFsVHlwZSB2aXNpdFNlbGVjdEluc3QoU2VsZWN0SW5zdCAmSSk7CisgIFNpemVPZmZzZXRFdmFsVHlwZSB2aXNpdEluc3RydWN0aW9uKEluc3RydWN0aW9uICZJKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX01FTU9SWUJVSUxUSU5TX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL01lbW9yeURlcGVuZGVuY2VBbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyOTc0NTIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL01lbW9yeURlcGVuZGVuY2VBbmFseXNpcy5oCkBAIC0wLDAgKzEsNTQwIEBACisvLz09PS0gbGx2bS9BbmFseXNpcy9NZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXMuaCAtIE1lbW9yeSBEZXBzIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBNZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXMgYW5hbHlzaXMgcGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfTUVNT1JZREVQRU5ERU5DRUFOQUxZU0lTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19NRU1PUllERVBFTkRFTkNFQU5BTFlTSVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJFbWJlZGRlZEludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlclN1bVR5cGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTWVtb3J5TG9jYXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0lSL01ldGFkYXRhLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvUHJlZEl0ZXJhdG9yQ2FjaGUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBc3N1bXB0aW9uQ2FjaGU7CitjbGFzcyBDYWxsU2l0ZTsKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgTG9hZEluc3Q7CitjbGFzcyBQSElUcmFuc0FkZHI7CitjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mbzsKK2NsYXNzIFZhbHVlOworCisvLy8gQSBtZW1vcnkgZGVwZW5kZW5jZSBxdWVyeSBjYW4gcmV0dXJuIG9uZSBvZiB0aHJlZSBkaWZmZXJlbnQgYW5zd2Vycy4KK2NsYXNzIE1lbURlcFJlc3VsdCB7CisgIGVudW0gRGVwVHlwZSB7CisgICAgLy8vIENsaWVudHMgb2YgTWVtRGVwIG5ldmVyIHNlZSB0aGlzLgorICAgIC8vLworICAgIC8vLyBFbnRyaWVzIHdpdGggdGhpcyBtYXJrZXIgb2NjdXIgaW4gYSBMb2NhbERlcHMgbWFwIG9yIE5vbkxvY2FsRGVwcyBtYXAKKyAgICAvLy8gd2hlbiB0aGUgaW5zdHJ1Y3Rpb24gdGhleSBwcmV2aW91c2x5IHJlZmVyZW5jZWQgd2FzIHJlbW92ZWQgZnJvbQorICAgIC8vLyBNZW1EZXAuICBJbiBlaXRoZXIgY2FzZSwgdGhlIGVudHJ5IG1heSBpbmNsdWRlIGFuIGluc3RydWN0aW9uIHBvaW50ZXIuCisgICAgLy8vIElmIHNvLCB0aGUgcG9pbnRlciBpcyBhbiBpbnN0cnVjdGlvbiBpbiB0aGUgYmxvY2sgd2hlcmUgc2Nhbm5pbmcgY2FuCisgICAgLy8vIHN0YXJ0IGZyb20sIHNhdmluZyBzb21lIHdvcmsuCisgICAgLy8vCisgICAgLy8vIEluIGEgZGVmYXVsdC1jb25zdHJ1Y3RlZCBNZW1EZXBSZXN1bHQgb2JqZWN0LCB0aGUgdHlwZSB3aWxsIGJlIEludmFsaWQKKyAgICAvLy8gYW5kIHRoZSBpbnN0cnVjdGlvbiBwb2ludGVyIHdpbGwgYmUgbnVsbC4KKyAgICBJbnZhbGlkID0gMCwKKworICAgIC8vLyBUaGlzIGlzIGEgZGVwZW5kZW5jZSBvbiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIHdoaWNoIGNsb2JiZXJzIHRoZQorICAgIC8vLyBkZXNpcmVkIHZhbHVlLiAgVGhlIHBvaW50ZXIgbWVtYmVyIG9mIHRoZSBNZW1EZXBSZXN1bHQgcGFpciBob2xkcyB0aGUKKyAgICAvLy8gaW5zdHJ1Y3Rpb24gdGhhdCBjbG9iYmVycyB0aGUgbWVtb3J5LiAgRm9yIGV4YW1wbGUsIHRoaXMgb2NjdXJzIHdoZW4gd2UKKyAgICAvLy8gc2VlIGEgbWF5LWFsaWFzZWQgc3RvcmUgdG8gdGhlIG1lbW9yeSBsb2NhdGlvbiB3ZSBjYXJlIGFib3V0LgorICAgIC8vLworICAgIC8vLyBUaGVyZSBhcmUgc2V2ZXJhbCBjYXNlcyB0aGF0IG1heSBiZSBpbnRlcmVzdGluZyBoZXJlOgorICAgIC8vLyAgIDEuIExvYWRzIGFyZSBjbG9iYmVyZWQgYnkgbWF5LWFsaWFzIHN0b3Jlcy4KKyAgICAvLy8gICAyLiBMb2FkcyBhcmUgY29uc2lkZXJlZCBjbG9iYmVyZWQgYnkgcGFydGlhbGx5LWFsaWFzZWQgbG9hZHMuICBUaGUKKyAgICAvLy8gICAgICBjbGllbnQgbWF5IGNob29zZSB0byBhbmFseXplIGRlZXBlciBpbnRvIHRoZXNlIGNhc2VzLgorICAgIENsb2JiZXIsCisKKyAgICAvLy8gVGhpcyBpcyBhIGRlcGVuZGVuY2Ugb24gdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiB3aGljaCBkZWZpbmVzIG9yCisgICAgLy8vIHByb2R1Y2VzIHRoZSBkZXNpcmVkIG1lbW9yeSBsb2NhdGlvbi4gIFRoZSBwb2ludGVyIG1lbWJlciBvZiB0aGUKKyAgICAvLy8gTWVtRGVwUmVzdWx0IHBhaXIgaG9sZHMgdGhlIGluc3RydWN0aW9uIHRoYXQgZGVmaW5lcyB0aGUgbWVtb3J5LgorICAgIC8vLworICAgIC8vLyBDYXNlcyBvZiBpbnRlcmVzdDoKKyAgICAvLy8gICAxLiBUaGlzIGNvdWxkIGJlIGEgbG9hZCBvciBzdG9yZSBmb3IgZGVwZW5kZW5jZSBxdWVyaWVzIG9uCisgICAgLy8vICAgICAgbG9hZC9zdG9yZS4gIFRoZSB2YWx1ZSBsb2FkZWQgb3Igc3RvcmVkIGlzIHRoZSBwcm9kdWNlZCB2YWx1ZS4KKyAgICAvLy8gICAgICBOb3RlIHRoYXQgdGhlIHBvaW50ZXIgb3BlcmFuZCBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhhdCBvZiB0aGUKKyAgICAvLy8gICAgICBxdWVyaWVkIHBvaW50ZXIgZHVlIHRvIG11c3QgYWxpYXNlcyBhbmQgcGhpIHRyYW5zbGF0aW9uLiBOb3RlCisgICAgLy8vICAgICAgdGhhdCB0aGUgZGVmIG1heSBub3QgYmUgdGhlIHNhbWUgdHlwZSBhcyB0aGUgcXVlcnksIHRoZSBwb2ludGVycworICAgIC8vLyAgICAgIG1heSBqdXN0IGJlIG11c3QgYWxpYXNlcy4KKyAgICAvLy8gICAyLiBGb3IgbG9hZHMgYW5kIHN0b3JlcywgdGhpcyBjb3VsZCBiZSBhbiBhbGxvY2F0aW9uIGluc3RydWN0aW9uLiBJbgorICAgIC8vLyAgICAgIHRoaXMgY2FzZSwgdGhlIGxvYWQgaXMgbG9hZGluZyBhbiB1bmRlZiB2YWx1ZSBvciBhIHN0b3JlIGlzIHRoZQorICAgIC8vLyAgICAgIGZpcnN0IHN0b3JlIHRvICh0aGF0IHBhcnQgb2YpIHRoZSBhbGxvY2F0aW9uLgorICAgIC8vLyAgIDMuIERlcGVuZGVuY2UgcXVlcmllcyBvbiBjYWxscyByZXR1cm4gRGVmIG9ubHkgd2hlbiB0aGV5IGFyZSByZWFkb25seQorICAgIC8vLyAgICAgIGNhbGxzIG9yIG1lbW9yeSB1c2UgaW50cmluc2ljcyB3aXRoIGlkZW50aWNhbCBjYWxsZWVzIGFuZCBubworICAgIC8vLyAgICAgIGludGVydmVuaW5nIGNsb2JiZXJzLiAgTm8gdmFsaWRhdGlvbiBpcyBkb25lIHRoYXQgdGhlIG9wZXJhbmRzIHRvCisgICAgLy8vICAgICAgdGhlIGNhbGxzIGFyZSB0aGUgc2FtZS4KKyAgICBEZWYsCisKKyAgICAvLy8gVGhpcyBtYXJrZXIgaW5kaWNhdGVzIHRoYXQgdGhlIHF1ZXJ5IGhhcyBubyBrbm93biBkZXBlbmRlbmN5IGluIHRoZQorICAgIC8vLyBzcGVjaWZpZWQgYmxvY2suCisgICAgLy8vCisgICAgLy8vIE1vcmUgZGV0YWlsZWQgc3RhdGUgaW5mbyBpcyBlbmNvZGVkIGluIHRoZSB1cHBlciBwYXJ0IG9mIHRoZSBwYWlyIChpLmUuCisgICAgLy8vIHRoZSBJbnN0cnVjdGlvbiopCisgICAgT3RoZXIKKyAgfTsKKworICAvLy8gSWYgRGVwVHlwZSBpcyAiT3RoZXIiLCB0aGUgdXBwZXIgcGFydCBvZiB0aGUgc3VtIHR5cGUgaXMgYW4gZW5jb2Rpbmcgb2YKKyAgLy8vIHRoZSBmb2xsb3dpbmcgbW9yZSBkZXRhaWxlZCB0eXBlIGluZm9ybWF0aW9uLgorICBlbnVtIE90aGVyVHlwZSB7CisgICAgLy8vIFRoaXMgbWFya2VyIGluZGljYXRlcyB0aGF0IHRoZSBxdWVyeSBoYXMgbm8gZGVwZW5kZW5jeSBpbiB0aGUgc3BlY2lmaWVkCisgICAgLy8vIGJsb2NrLgorICAgIC8vLworICAgIC8vLyBUbyBmaW5kIG91dCBtb3JlLCB0aGUgY2xpZW50IHNob3VsZCBxdWVyeSBvdGhlciBwcmVkZWNlc3NvciBibG9ja3MuCisgICAgTm9uTG9jYWwgPSAxLAorICAgIC8vLyBUaGlzIG1hcmtlciBpbmRpY2F0ZXMgdGhhdCB0aGUgcXVlcnkgaGFzIG5vIGRlcGVuZGVuY3kgaW4gdGhlIHNwZWNpZmllZAorICAgIC8vLyBmdW5jdGlvbi4KKyAgICBOb25GdW5jTG9jYWwsCisgICAgLy8vIFRoaXMgbWFya2VyIGluZGljYXRlcyB0aGF0IHRoZSBxdWVyeSBkZXBlbmRlbmN5IGlzIHVua25vd24uCisgICAgVW5rbm93bgorICB9OworCisgIHVzaW5nIFZhbHVlVHkgPSBQb2ludGVyU3VtVHlwZTwKKyAgICAgIERlcFR5cGUsIFBvaW50ZXJTdW1UeXBlTWVtYmVyPEludmFsaWQsIEluc3RydWN0aW9uICo+LAorICAgICAgUG9pbnRlclN1bVR5cGVNZW1iZXI8Q2xvYmJlciwgSW5zdHJ1Y3Rpb24gKj4sCisgICAgICBQb2ludGVyU3VtVHlwZU1lbWJlcjxEZWYsIEluc3RydWN0aW9uICo+LAorICAgICAgUG9pbnRlclN1bVR5cGVNZW1iZXI8T3RoZXIsIFBvaW50ZXJFbWJlZGRlZEludDxPdGhlclR5cGUsIDM+Pj47CisgIFZhbHVlVHkgVmFsdWU7CisKKyAgZXhwbGljaXQgTWVtRGVwUmVzdWx0KFZhbHVlVHkgVikgOiBWYWx1ZShWKSB7fQorCitwdWJsaWM6CisgIE1lbURlcFJlc3VsdCgpID0gZGVmYXVsdDsKKworICAvLy8gZ2V0IG1ldGhvZHM6IFRoZXNlIGFyZSBzdGF0aWMgY3RvciBtZXRob2RzIGZvciBjcmVhdGluZyB2YXJpb3VzCisgIC8vLyBNZW1EZXBSZXN1bHQga2luZHMuCisgIHN0YXRpYyBNZW1EZXBSZXN1bHQgZ2V0RGVmKEluc3RydWN0aW9uICpJbnN0KSB7CisgICAgYXNzZXJ0KEluc3QgJiYgIkRlZiByZXF1aXJlcyBpbnN0Iik7CisgICAgcmV0dXJuIE1lbURlcFJlc3VsdChWYWx1ZVR5OjpjcmVhdGU8RGVmPihJbnN0KSk7CisgIH0KKyAgc3RhdGljIE1lbURlcFJlc3VsdCBnZXRDbG9iYmVyKEluc3RydWN0aW9uICpJbnN0KSB7CisgICAgYXNzZXJ0KEluc3QgJiYgIkNsb2JiZXIgcmVxdWlyZXMgaW5zdCIpOworICAgIHJldHVybiBNZW1EZXBSZXN1bHQoVmFsdWVUeTo6Y3JlYXRlPENsb2JiZXI+KEluc3QpKTsKKyAgfQorICBzdGF0aWMgTWVtRGVwUmVzdWx0IGdldE5vbkxvY2FsKCkgeworICAgIHJldHVybiBNZW1EZXBSZXN1bHQoVmFsdWVUeTo6Y3JlYXRlPE90aGVyPihOb25Mb2NhbCkpOworICB9CisgIHN0YXRpYyBNZW1EZXBSZXN1bHQgZ2V0Tm9uRnVuY0xvY2FsKCkgeworICAgIHJldHVybiBNZW1EZXBSZXN1bHQoVmFsdWVUeTo6Y3JlYXRlPE90aGVyPihOb25GdW5jTG9jYWwpKTsKKyAgfQorICBzdGF0aWMgTWVtRGVwUmVzdWx0IGdldFVua25vd24oKSB7CisgICAgcmV0dXJuIE1lbURlcFJlc3VsdChWYWx1ZVR5OjpjcmVhdGU8T3RoZXI+KFVua25vd24pKTsKKyAgfQorCisgIC8vLyBUZXN0cyBpZiB0aGlzIE1lbURlcFJlc3VsdCByZXByZXNlbnRzIGEgcXVlcnkgdGhhdCBpcyBhbiBpbnN0cnVjdGlvbgorICAvLy8gY2xvYmJlciBkZXBlbmRlbmN5LgorICBib29sIGlzQ2xvYmJlcigpIGNvbnN0IHsgcmV0dXJuIFZhbHVlLmlzPENsb2JiZXI+KCk7IH0KKworICAvLy8gVGVzdHMgaWYgdGhpcyBNZW1EZXBSZXN1bHQgcmVwcmVzZW50cyBhIHF1ZXJ5IHRoYXQgaXMgYW4gaW5zdHJ1Y3Rpb24KKyAgLy8vIGRlZmluaXRpb24gZGVwZW5kZW5jeS4KKyAgYm9vbCBpc0RlZigpIGNvbnN0IHsgcmV0dXJuIFZhbHVlLmlzPERlZj4oKTsgfQorCisgIC8vLyBUZXN0cyBpZiB0aGlzIE1lbURlcFJlc3VsdCByZXByZXNlbnRzIGEgcXVlcnkgdGhhdCBpcyB0cmFuc3BhcmVudCB0byB0aGUKKyAgLy8vIHN0YXJ0IG9mIHRoZSBibG9jaywgYnV0IHdoZXJlIGEgbm9uLWxvY2FsIGhhc24ndCBiZWVuIGRvbmUuCisgIGJvb2wgaXNOb25Mb2NhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWUuaXM8T3RoZXI+KCkgJiYgVmFsdWUuY2FzdDxPdGhlcj4oKSA9PSBOb25Mb2NhbDsKKyAgfQorCisgIC8vLyBUZXN0cyBpZiB0aGlzIE1lbURlcFJlc3VsdCByZXByZXNlbnRzIGEgcXVlcnkgdGhhdCBpcyB0cmFuc3BhcmVudCB0byB0aGUKKyAgLy8vIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4KKyAgYm9vbCBpc05vbkZ1bmNMb2NhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWUuaXM8T3RoZXI+KCkgJiYgVmFsdWUuY2FzdDxPdGhlcj4oKSA9PSBOb25GdW5jTG9jYWw7CisgIH0KKworICAvLy8gVGVzdHMgaWYgdGhpcyBNZW1EZXBSZXN1bHQgcmVwcmVzZW50cyBhIHF1ZXJ5IHdoaWNoIGNhbm5vdCBhbmQvb3Igd2lsbAorICAvLy8gbm90IGJlIGNvbXB1dGVkLgorICBib29sIGlzVW5rbm93bigpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWUuaXM8T3RoZXI+KCkgJiYgVmFsdWUuY2FzdDxPdGhlcj4oKSA9PSBVbmtub3duOworICB9CisKKyAgLy8vIElmIHRoaXMgaXMgYSBub3JtYWwgZGVwZW5kZW5jeSwgcmV0dXJucyB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCBpcyBkZXBlbmRlZAorICAvLy8gb24uICBPdGhlcndpc2UsIHJldHVybnMgbnVsbC4KKyAgSW5zdHJ1Y3Rpb24gKmdldEluc3QoKSBjb25zdCB7CisgICAgc3dpdGNoIChWYWx1ZS5nZXRUYWcoKSkgeworICAgIGNhc2UgSW52YWxpZDoKKyAgICAgIHJldHVybiBWYWx1ZS5jYXN0PEludmFsaWQ+KCk7CisgICAgY2FzZSBDbG9iYmVyOgorICAgICAgcmV0dXJuIFZhbHVlLmNhc3Q8Q2xvYmJlcj4oKTsKKyAgICBjYXNlIERlZjoKKyAgICAgIHJldHVybiBWYWx1ZS5jYXN0PERlZj4oKTsKKyAgICBjYXNlIE90aGVyOgorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gZGlzY3JpbWluYW50ISIpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1lbURlcFJlc3VsdCAmTSkgY29uc3QgeyByZXR1cm4gVmFsdWUgPT0gTS5WYWx1ZTsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgTWVtRGVwUmVzdWx0ICZNKSBjb25zdCB7IHJldHVybiBWYWx1ZSAhPSBNLlZhbHVlOyB9CisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE1lbURlcFJlc3VsdCAmTSkgY29uc3QgeyByZXR1cm4gVmFsdWUgPCBNLlZhbHVlOyB9CisgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IE1lbURlcFJlc3VsdCAmTSkgY29uc3QgeyByZXR1cm4gVmFsdWUgPiBNLlZhbHVlOyB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBNZW1vcnlEZXBlbmRlbmNlUmVzdWx0czsKKworICAvLy8gVGVzdHMgaWYgdGhpcyBpcyBhIE1lbURlcFJlc3VsdCBpbiBpdHMgZGlydHkvaW52YWxpZC4gc3RhdGUuCisgIGJvb2wgaXNEaXJ0eSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlLmlzPEludmFsaWQ+KCk7IH0KKworICBzdGF0aWMgTWVtRGVwUmVzdWx0IGdldERpcnR5KEluc3RydWN0aW9uICpJbnN0KSB7CisgICAgcmV0dXJuIE1lbURlcFJlc3VsdChWYWx1ZVR5OjpjcmVhdGU8SW52YWxpZD4oSW5zdCkpOworICB9Cit9OworCisvLy8gVGhpcyBpcyBhbiBlbnRyeSBpbiB0aGUgTm9uTG9jYWxEZXBJbmZvIGNhY2hlLgorLy8vCisvLy8gRm9yIGVhY2ggQmFzaWNCbG9jayAodGhlIEJCIGVudHJ5KSBpdCBrZWVwcyBhIE1lbURlcFJlc3VsdC4KK2NsYXNzIE5vbkxvY2FsRGVwRW50cnkgeworICBCYXNpY0Jsb2NrICpCQjsKKyAgTWVtRGVwUmVzdWx0IFJlc3VsdDsKKworcHVibGljOgorICBOb25Mb2NhbERlcEVudHJ5KEJhc2ljQmxvY2sgKmJiLCBNZW1EZXBSZXN1bHQgcmVzdWx0KQorICAgICAgOiBCQihiYiksIFJlc3VsdChyZXN1bHQpIHt9CisKKyAgLy8gVGhpcyBpcyB1c2VkIGZvciBzZWFyY2hlcy4KKyAgTm9uTG9jYWxEZXBFbnRyeShCYXNpY0Jsb2NrICpiYikgOiBCQihiYikge30KKworICAvLyBCQiBpcyB0aGUgc29ydCBrZXksIGl0IGNhbid0IGJlIGNoYW5nZWQuCisgIEJhc2ljQmxvY2sgKmdldEJCKCkgY29uc3QgeyByZXR1cm4gQkI7IH0KKworICB2b2lkIHNldFJlc3VsdChjb25zdCBNZW1EZXBSZXN1bHQgJlIpIHsgUmVzdWx0ID0gUjsgfQorCisgIGNvbnN0IE1lbURlcFJlc3VsdCAmZ2V0UmVzdWx0KCkgY29uc3QgeyByZXR1cm4gUmVzdWx0OyB9CisKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgTm9uTG9jYWxEZXBFbnRyeSAmUkhTKSBjb25zdCB7IHJldHVybiBCQiA8IFJIUy5CQjsgfQorfTsKKworLy8vIFRoaXMgaXMgYSByZXN1bHQgZnJvbSBhIE5vbkxvY2FsIGRlcGVuZGVuY2UgcXVlcnkuCisvLy8KKy8vLyBGb3IgZWFjaCBCYXNpY0Jsb2NrICh0aGUgQkIgZW50cnkpIGl0IGtlZXBzIGEgTWVtRGVwUmVzdWx0IGFuZCB0aGUKKy8vLyAocG90ZW50aWFsbHkgcGhpIHRyYW5zbGF0ZWQpIGFkZHJlc3MgdGhhdCB3YXMgbGl2ZSBpbiB0aGUgYmxvY2suCitjbGFzcyBOb25Mb2NhbERlcFJlc3VsdCB7CisgIE5vbkxvY2FsRGVwRW50cnkgRW50cnk7CisgIFZhbHVlICpBZGRyZXNzOworCitwdWJsaWM6CisgIE5vbkxvY2FsRGVwUmVzdWx0KEJhc2ljQmxvY2sgKmJiLCBNZW1EZXBSZXN1bHQgcmVzdWx0LCBWYWx1ZSAqYWRkcmVzcykKKyAgICAgIDogRW50cnkoYmIsIHJlc3VsdCksIEFkZHJlc3MoYWRkcmVzcykge30KKworICAvLyBCQiBpcyB0aGUgc29ydCBrZXksIGl0IGNhbid0IGJlIGNoYW5nZWQuCisgIEJhc2ljQmxvY2sgKmdldEJCKCkgY29uc3QgeyByZXR1cm4gRW50cnkuZ2V0QkIoKTsgfQorCisgIHZvaWQgc2V0UmVzdWx0KGNvbnN0IE1lbURlcFJlc3VsdCAmUiwgVmFsdWUgKkFkZHIpIHsKKyAgICBFbnRyeS5zZXRSZXN1bHQoUik7CisgICAgQWRkcmVzcyA9IEFkZHI7CisgIH0KKworICBjb25zdCBNZW1EZXBSZXN1bHQgJmdldFJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuIEVudHJ5LmdldFJlc3VsdCgpOyB9CisKKyAgLy8vIFJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhpcyBwb2ludGVyIGluIHRoaXMgYmxvY2suCisgIC8vLworICAvLy8gVGhpcyBjYW4gYmUgZGlmZmVyZW50IHRoYW4gdGhlIGFkZHJlc3MgcXVlcmllZCBmb3IgdGhlIG5vbi1sb2NhbCByZXN1bHQKKyAgLy8vIGJlY2F1c2Ugb2YgcGhpIHRyYW5zbGF0aW9uLiAgVGhpcyByZXR1cm5zIG51bGwgaWYgdGhlIGFkZHJlc3Mgd2FzIG5vdAorICAvLy8gYXZhaWxhYmxlIGluIGEgYmxvY2sgKGkuZS4gYmVjYXVzZSBwaGkgdHJhbnNsYXRpb24gZmFpbGVkKSBvciBpZiB0aGlzIGlzCisgIC8vLyBhIGNhY2hlZCByZXN1bHQgYW5kIHRoYXQgYWRkcmVzcyB3YXMgZGVsZXRlZC4KKyAgLy8vCisgIC8vLyBUaGUgYWRkcmVzcyBpcyBhbHdheXMgbnVsbCBmb3IgYSBub24tbG9jYWwgJ2NhbGwnIGRlcGVuZGVuY2UuCisgIFZhbHVlICpnZXRBZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gQWRkcmVzczsgfQorfTsKKworLy8vIFByb3ZpZGVzIGEgbGF6eSwgY2FjaGluZyBpbnRlcmZhY2UgZm9yIG1ha2luZyBjb21tb24gbWVtb3J5IGFsaWFzaW5nCisvLy8gaW5mb3JtYXRpb24gcXVlcmllcywgYmFja2VkIGJ5IExMVk0ncyBhbGlhcyBhbmFseXNpcyBwYXNzZXMuCisvLy8KKy8vLyBUaGUgZGVwZW5kZW5jeSBpbmZvcm1hdGlvbiByZXR1cm5lZCBpcyBzb21ld2hhdCB1bnVzdWFsLCBidXQgaXMgcHJhZ21hdGljLgorLy8vIElmIHF1ZXJpZWQgYWJvdXQgYSBzdG9yZSBvciBjYWxsIHRoYXQgbWlnaHQgbW9kaWZ5IG1lbW9yeSwgdGhlIGFuYWx5c2lzCisvLy8gd2lsbCByZXR1cm4gdGhlIGluc3RydWN0aW9uW3NdIHRoYXQgbWF5IGVpdGhlciBsb2FkIGZyb20gdGhhdCBtZW1vcnkgb3IKKy8vLyBzdG9yZSB0byBpdC4gIElmIHF1ZXJpZWQgd2l0aCBhIGxvYWQgb3IgY2FsbCB0aGF0IGNhbiBuZXZlciBtb2RpZnkgbWVtb3J5LAorLy8vIHRoZSBhbmFseXNpcyB3aWxsIHJldHVybiBjYWxscyBhbmQgc3RvcmVzIHRoYXQgbWlnaHQgbW9kaWZ5IHRoZSBwb2ludGVyLAorLy8vIGJ1dCBnZW5lcmFsbHkgZG9lcyBub3QgcmV0dXJuIGxvYWRzIHVubGVzcyBhKSB0aGV5IGFyZSB2b2xhdGlsZSwgb3IKKy8vLyBiKSB0aGV5IGxvYWQgZnJvbSAqbXVzdC1hbGlhc2VkKiBwb2ludGVycy4gIFJldHVybmluZyBhIGRlcGVuZGVuY2Ugb24KKy8vLyBtdXN0LWFsaWFzJ2QgcG9pbnRlcnMgaW5zdGVhZCBvZiBhbGwgcG9pbnRlcnMgaW50ZXJhY3RzIHdlbGwgd2l0aCB0aGUKKy8vLyBpbnRlcm5hbCBjYWNoaW5nIG1lY2hhbmlzbS4KK2NsYXNzIE1lbW9yeURlcGVuZGVuY2VSZXN1bHRzIHsKKyAgLy8gQSBtYXAgZnJvbSBpbnN0cnVjdGlvbnMgdG8gdGhlaXIgZGVwZW5kZW5jeS4KKyAgdXNpbmcgTG9jYWxEZXBNYXBUeXBlID0gRGVuc2VNYXA8SW5zdHJ1Y3Rpb24gKiwgTWVtRGVwUmVzdWx0PjsKKyAgTG9jYWxEZXBNYXBUeXBlIExvY2FsRGVwczsKKworcHVibGljOgorICB1c2luZyBOb25Mb2NhbERlcEluZm8gPSBzdGQ6OnZlY3RvcjxOb25Mb2NhbERlcEVudHJ5PjsKKworcHJpdmF0ZToKKyAgLy8vIEEgcGFpcjxWYWx1ZSosIGJvb2w+IHdoZXJlIHRoZSBib29sIGlzIHRydWUgaWYgdGhlIGRlcGVuZGVuY2UgaXMgYSByZWFkCisgIC8vLyBvbmx5IGRlcGVuZGVuY2UsIGZhbHNlIGlmIHJlYWQvd3JpdGUuCisgIHVzaW5nIFZhbHVlSXNMb2FkUGFpciA9IFBvaW50ZXJJbnRQYWlyPGNvbnN0IFZhbHVlICosIDEsIGJvb2w+OworCisgIC8vLyBUaGlzIHBhaXIgaXMgdXNlZCB3aGVuIGNhY2hpbmcgaW5mb3JtYXRpb24gZm9yIGEgYmxvY2suCisgIC8vLworICAvLy8gSWYgdGhlIHBvaW50ZXIgaXMgbnVsbCwgdGhlIGNhY2hlIHZhbHVlIGlzIG5vdCBhIGZ1bGwgcXVlcnkgdGhhdCBzdGFydHMKKyAgLy8vIGF0IHRoZSBzcGVjaWZpZWQgYmxvY2suICBJZiBub24tbnVsbCwgdGhlIGJvb2wgaW5kaWNhdGVzIHdoZXRoZXIgb3Igbm90CisgIC8vLyB0aGUgY29udGVudHMgb2YgdGhlIGJsb2NrIHdhcyBza2lwcGVkLgorICB1c2luZyBCQlNraXBGaXJzdEJsb2NrUGFpciA9IFBvaW50ZXJJbnRQYWlyPEJhc2ljQmxvY2sgKiwgMSwgYm9vbD47CisKKyAgLy8vIFRoaXMgcmVjb3JkIGlzIHRoZSBpbmZvcm1hdGlvbiBrZXB0IGZvciBlYWNoICh2YWx1ZSwgaXMgbG9hZCkgcGFpci4KKyAgc3RydWN0IE5vbkxvY2FsUG9pbnRlckluZm8geworICAgIC8vLyBUaGUgcGFpciBvZiB0aGUgYmxvY2sgYW5kIHRoZSBza2lwLWZpcnN0LWJsb2NrIGZsYWcuCisgICAgQkJTa2lwRmlyc3RCbG9ja1BhaXIgUGFpcjsKKyAgICAvLy8gVGhlIHJlc3VsdHMgb2YgdGhlIHF1ZXJ5IGZvciBlYWNoIHJlbGV2YW50IGJsb2NrLgorICAgIE5vbkxvY2FsRGVwSW5mbyBOb25Mb2NhbERlcHM7CisgICAgLy8vIFRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIGRlcmVmZXJlbmNlcyBvZiB0aGUgcG9pbnRlci4KKyAgICAvLy8KKyAgICAvLy8gTWF5IGJlIFVua25vd25TaXplIGlmIHRoZSBzaXplcyBhcmUgdW5rbm93bi4KKyAgICB1aW50NjRfdCBTaXplID0gTWVtb3J5TG9jYXRpb246OlVua25vd25TaXplOworICAgIC8vLyBUaGUgQUEgdGFncyBhc3NvY2lhdGVkIHdpdGggZGVyZWZlcmVuY2VzIG9mIHRoZSBwb2ludGVyLgorICAgIC8vLworICAgIC8vLyBUaGUgbWVtYmVycyBtYXkgYmUgbnVsbCBpZiB0aGVyZSBhcmUgbm8gdGFncyBvciBjb25mbGljdGluZyB0YWdzLgorICAgIEFBTUROb2RlcyBBQVRhZ3M7CisKKyAgICBOb25Mb2NhbFBvaW50ZXJJbmZvKCkgPSBkZWZhdWx0OworICB9OworCisgIC8vLyBDYWNoZSBzdG9yaW5nIHNpbmdsZSBub25sb2NhbCBkZWYgZm9yIHRoZSBpbnN0cnVjdGlvbi4KKyAgLy8vIEl0IGlzIHNldCB3aGVuIG5vbmxvY2FsIGRlZiB3b3VsZCBiZSBmb3VuZCBpbiBmdW5jdGlvbiByZXR1cm5pbmcgb25seQorICAvLy8gbG9jYWwgZGVwZW5kZW5jaWVzLgorICBEZW5zZU1hcDxJbnN0cnVjdGlvbiAqLCBOb25Mb2NhbERlcFJlc3VsdD4gTm9uTG9jYWxEZWZzQ2FjaGU7CisKKyAgLy8vIFRoaXMgbWFwIHN0b3JlcyB0aGUgY2FjaGVkIHJlc3VsdHMgb2YgZG9pbmcgYSBwb2ludGVyIGxvb2t1cCBhdCB0aGUKKyAgLy8vIGJvdHRvbSBvZiBhIGJsb2NrLgorICAvLy8KKyAgLy8vIFRoZSBrZXkgb2YgdGhpcyBtYXAgaXMgdGhlIHBvaW50ZXIraXNsb2FkIGJpdCwgdGhlIHZhbHVlIGlzIGEgbGlzdCBvZgorICAvLy8gPGJiLT5yZXN1bHQ+IG1hcHBpbmdzLgorICB1c2luZyBDYWNoZWROb25Mb2NhbFBvaW50ZXJJbmZvID0KKyAgICAgIERlbnNlTWFwPFZhbHVlSXNMb2FkUGFpciwgTm9uTG9jYWxQb2ludGVySW5mbz47CisgIENhY2hlZE5vbkxvY2FsUG9pbnRlckluZm8gTm9uTG9jYWxQb2ludGVyRGVwczsKKworICAvLyBBIG1hcCBmcm9tIGluc3RydWN0aW9ucyB0byB0aGVpciBub24tbG9jYWwgcG9pbnRlciBkZXBlbmRlbmNpZXMuCisgIHVzaW5nIFJldmVyc2VOb25Mb2NhbFB0ckRlcFR5ID0KKyAgICAgIERlbnNlTWFwPEluc3RydWN0aW9uICosIFNtYWxsUHRyU2V0PFZhbHVlSXNMb2FkUGFpciwgND4+OworICBSZXZlcnNlTm9uTG9jYWxQdHJEZXBUeSBSZXZlcnNlTm9uTG9jYWxQdHJEZXBzOworCisgIC8vLyBUaGlzIGlzIHRoZSBpbnN0cnVjdGlvbiB3ZSBrZWVwIGZvciBlYWNoIGNhY2hlZCBhY2Nlc3MgdGhhdCB3ZSBoYXZlIGZvcgorICAvLy8gYW4gaW5zdHJ1Y3Rpb24uCisgIC8vLworICAvLy8gVGhlIHBvaW50ZXIgaXMgYW4gb3duaW5nIHBvaW50ZXIgYW5kIHRoZSBib29sIGluZGljYXRlcyB3aGV0aGVyIHdlIGhhdmUKKyAgLy8vIGFueSBkaXJ0eSBiaXRzIGluIHRoZSBzZXQuCisgIHVzaW5nIFBlckluc3ROTEluZm8gPSBzdGQ6OnBhaXI8Tm9uTG9jYWxEZXBJbmZvLCBib29sPjsKKworICAvLyBBIG1hcCBmcm9tIGluc3RydWN0aW9ucyB0byB0aGVpciBub24tbG9jYWwgZGVwZW5kZW5jaWVzLgorICB1c2luZyBOb25Mb2NhbERlcE1hcFR5cGUgPSBEZW5zZU1hcDxJbnN0cnVjdGlvbiAqLCBQZXJJbnN0TkxJbmZvPjsKKworICBOb25Mb2NhbERlcE1hcFR5cGUgTm9uTG9jYWxEZXBzOworCisgIC8vIEEgcmV2ZXJzZSBtYXBwaW5nIGZyb20gZGVwZW5kZW5jaWVzIHRvIHRoZSBkZXBlbmRlZXMuICBUaGlzIGlzCisgIC8vIHVzZWQgd2hlbiByZW1vdmluZyBpbnN0cnVjdGlvbnMgdG8ga2VlcCB0aGUgY2FjaGUgY29oZXJlbnQuCisgIHVzaW5nIFJldmVyc2VEZXBNYXBUeXBlID0KKyAgICAgIERlbnNlTWFwPEluc3RydWN0aW9uICosIFNtYWxsUHRyU2V0PEluc3RydWN0aW9uICosIDQ+PjsKKyAgUmV2ZXJzZURlcE1hcFR5cGUgUmV2ZXJzZUxvY2FsRGVwczsKKworICAvLyBBIHJldmVyc2UgbWFwcGluZyBmcm9tIGRlcGVuZGVuY2llcyB0byB0aGUgbm9uLWxvY2FsIGRlcGVuZGVlcy4KKyAgUmV2ZXJzZURlcE1hcFR5cGUgUmV2ZXJzZU5vbkxvY2FsRGVwczsKKworICAvLy8gQ3VycmVudCBBQSBpbXBsZW1lbnRhdGlvbiwganVzdCBhIGNhY2hlLgorICBBbGlhc0FuYWx5c2lzICZBQTsKKyAgQXNzdW1wdGlvbkNhY2hlICZBQzsKKyAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gJlRMSTsKKyAgRG9taW5hdG9yVHJlZSAmRFQ7CisgIFByZWRJdGVyYXRvckNhY2hlIFByZWRDYWNoZTsKKworcHVibGljOgorICBNZW1vcnlEZXBlbmRlbmNlUmVzdWx0cyhBbGlhc0FuYWx5c2lzICZBQSwgQXNzdW1wdGlvbkNhY2hlICZBQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gJlRMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRG9taW5hdG9yVHJlZSAmRFQpCisgICAgICA6IEFBKEFBKSwgQUMoQUMpLCBUTEkoVExJKSwgRFQoRFQpIHt9CisKKyAgLy8vIEhhbmRsZSBpbnZhbGlkYXRpb24gaW4gdGhlIG5ldyBQTS4KKyAgYm9vbCBpbnZhbGlkYXRlKEZ1bmN0aW9uICZGLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmUEEsCisgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlcjo6SW52YWxpZGF0b3IgJkludik7CisKKyAgLy8vIFNvbWUgbWV0aG9kcyBsaW1pdCB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyB0aGV5IHdpbGwgZXhhbWluZS4KKyAgLy8vIFRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBtZXRob2QgaXMgdGhlIGRlZmF1bHQgbGltaXQgdGhhdCB3aWxsIGJlCisgIC8vLyB1c2VkIGlmIG5vIGxpbWl0IGlzIGV4cGxpY2l0bHkgcGFzc2VkIGluLgorICB1bnNpZ25lZCBnZXREZWZhdWx0QmxvY2tTY2FuTGltaXQoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgaW5zdHJ1Y3Rpb24gb24gd2hpY2ggYSBtZW1vcnkgb3BlcmF0aW9uIGRlcGVuZHMuCisgIC8vLworICAvLy8gU2VlIHRoZSBjbGFzcyBjb21tZW50IGZvciBtb3JlIGRldGFpbHMuIEl0IGlzIGlsbGVnYWwgdG8gY2FsbCB0aGlzIG9uCisgIC8vLyBub24tbWVtb3J5IGluc3RydWN0aW9ucy4KKyAgTWVtRGVwUmVzdWx0IGdldERlcGVuZGVuY3koSW5zdHJ1Y3Rpb24gKlF1ZXJ5SW5zdCk7CisKKyAgLy8vIFBlcmZvcm0gYSBmdWxsIGRlcGVuZGVuY3kgcXVlcnkgZm9yIHRoZSBzcGVjaWZpZWQgY2FsbCwgcmV0dXJuaW5nIHRoZSBzZXQKKyAgLy8vIG9mIGJsb2NrcyB0aGF0IHRoZSB2YWx1ZSBpcyBwb3RlbnRpYWxseSBsaXZlIGFjcm9zcy4KKyAgLy8vCisgIC8vLyBUaGUgcmV0dXJuZWQgc2V0IG9mIHJlc3VsdHMgd2lsbCBpbmNsdWRlIGEgIk5vbkxvY2FsIiByZXN1bHQgZm9yIGFsbAorICAvLy8gYmxvY2tzIHdoZXJlIHRoZSB2YWx1ZSBpcyBsaXZlIGFjcm9zcy4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoZSBpbnN0cnVjdGlvbiByZXR1cm5zIGEgIk5vbkxvY2FsIiBkZXBlbmRlbmN5CisgIC8vLyB3aXRoaW4gaXRzIG93biBibG9jay4KKyAgLy8vCisgIC8vLyBUaGlzIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYW4gaW50ZXJuYWwgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBtYXkgYmUKKyAgLy8vIGludmFsaWRhdGVkIG9uIHRoZSBuZXh0IG5vbi1sb2NhbCBxdWVyeSBvciB3aGVuIGFuIGluc3RydWN0aW9uIGlzCisgIC8vLyByZW1vdmVkLiAgQ2xpZW50cyBtdXN0IGNvcHkgdGhpcyBkYXRhIGlmIHRoZXkgd2FudCBpdCBhcm91bmQgbG9uZ2VyIHRoYW4KKyAgLy8vIHRoYXQuCisgIGNvbnN0IE5vbkxvY2FsRGVwSW5mbyAmZ2V0Tm9uTG9jYWxDYWxsRGVwZW5kZW5jeShDYWxsU2l0ZSBRdWVyeUNTKTsKKworICAvLy8gUGVyZm9ybSBhIGZ1bGwgZGVwZW5kZW5jeSBxdWVyeSBmb3IgYW4gYWNjZXNzIHRvIHRoZSBRdWVyeUluc3QncworICAvLy8gc3BlY2lmaWVkIG1lbW9yeSBsb2NhdGlvbiwgcmV0dXJuaW5nIHRoZSBzZXQgb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgZWl0aGVyCisgIC8vLyBkZWZpbmUgb3IgY2xvYmJlciB0aGUgdmFsdWUuCisgIC8vLworICAvLy8gV2FybmluZzogRm9yIGEgdm9sYXRpbGUgcXVlcnkgaW5zdHJ1Y3Rpb24sIHRoZSBkZXBlbmRlbmNpZXMgd2lsbCBiZQorICAvLy8gYWNjdXJhdGUsIGFuZCB0aHVzIHVzYWJsZSBmb3IgcmVvcmRlcmluZywgYnV0IGl0IGlzIG5ldmVyIGxlZ2FsIHRvCisgIC8vLyByZW1vdmUgdGhlIHF1ZXJ5IGluc3RydWN0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhlIHBvaW50ZXIgaGFzIGEgIk5vbkxvY2FsIiBkZXBlbmRlbmN5IHdpdGhpbgorICAvLy8gUXVlcnlJbnN0J3MgcGFyZW50IGJhc2ljIGJsb2NrLgorICB2b2lkIGdldE5vbkxvY2FsUG9pbnRlckRlcGVuZGVuY3koSW5zdHJ1Y3Rpb24gKlF1ZXJ5SW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxOb25Mb2NhbERlcFJlc3VsdD4gJlJlc3VsdCk7CisKKyAgLy8vIFJlbW92ZXMgYW4gaW5zdHJ1Y3Rpb24gZnJvbSB0aGUgZGVwZW5kZW5jZSBhbmFseXNpcywgdXBkYXRpbmcgdGhlCisgIC8vLyBkZXBlbmRlbmNlIG9mIGluc3RydWN0aW9ucyB0aGF0IHByZXZpb3VzbHkgZGVwZW5kZWQgb24gaXQuCisgIHZvaWQgcmVtb3ZlSW5zdHJ1Y3Rpb24oSW5zdHJ1Y3Rpb24gKkluc3RUb1JlbW92ZSk7CisKKyAgLy8vIEludmFsaWRhdGVzIGNhY2hlZCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3BlY2lmaWVkIHBvaW50ZXIsIGJlY2F1c2UgaXQKKyAgLy8vIG1heSBiZSB0b28gY29uc2VydmF0aXZlIGluIG1lbWRlcC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGFuIG9wdGlvbmFsIGNhbGwgdGhhdCBjYW4gYmUgdXNlZCB3aGVuIHRoZSBjbGllbnQgZGV0ZWN0cyBhbgorICAvLy8gZXF1aXZhbGVuY2UgYmV0d2VlbiB0aGUgcG9pbnRlciBhbmQgc29tZSBvdGhlciB2YWx1ZSBhbmQgcmVwbGFjZXMgdGhlCisgIC8vLyBvdGhlciB2YWx1ZSB3aXRoIHB0ci4gVGhpcyBjYW4gbWFrZSBQdHIgYXZhaWxhYmxlIGluIG1vcmUgcGxhY2VzIHRoYXQKKyAgLy8vIGNhY2hlZCBpbmZvIGRvZXMgbm90IG5lY2Vzc2FyaWx5IGtlZXAuCisgIHZvaWQgaW52YWxpZGF0ZUNhY2hlZFBvaW50ZXJJbmZvKFZhbHVlICpQdHIpOworCisgIC8vLyBDbGVhcnMgdGhlIFByZWRJdGVyYXRvckNhY2hlIGluZm8uCisgIC8vLworICAvLy8gVGhpcyBuZWVkcyB0byBiZSBkb25lIHdoZW4gdGhlIENGRyBjaGFuZ2VzLCBlLmcuLCBkdWUgdG8gc3BsaXR0aW5nCisgIC8vLyBjcml0aWNhbCBlZGdlcy4KKyAgdm9pZCBpbnZhbGlkYXRlQ2FjaGVkUHJlZGVjZXNzb3JzKCk7CisKKyAgLy8vIFJldHVybnMgdGhlIGluc3RydWN0aW9uIG9uIHdoaWNoIGEgbWVtb3J5IGxvY2F0aW9uIGRlcGVuZHMuCisgIC8vLworICAvLy8gSWYgaXNMb2FkIGlzIHRydWUsIHRoaXMgcm91dGluZSBpZ25vcmVzIG1heS1hbGlhc2VzIHdpdGggcmVhZC1vbmx5CisgIC8vLyBvcGVyYXRpb25zLiAgSWYgaXNMb2FkIGlzIGZhbHNlLCB0aGlzIHJvdXRpbmUgaWdub3JlcyBtYXktYWxpYXNlcworICAvLy8gd2l0aCByZWFkcyBmcm9tIHJlYWQtb25seSBsb2NhdGlvbnMuIElmIHBvc3NpYmxlLCBwYXNzIHRoZSBxdWVyeQorICAvLy8gaW5zdHJ1Y3Rpb24gYXMgd2VsbDsgdGhpcyBmdW5jdGlvbiBtYXkgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhlIG1ldGFkYXRhCisgIC8vLyBhbm5vdGF0ZWQgdG8gdGhlIHF1ZXJ5IGluc3RydWN0aW9uIHRvIHJlZmluZSB0aGUgcmVzdWx0LiBccCBMaW1pdAorICAvLy8gY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdGhhdCB3aWxsIGJlCisgIC8vLyBleGFtaW5lZCB0byBmaW5kIHRoZSBwb2ludGVyIGRlcGVuZGVuY3kuIE9uIHJldHVybiwgaXQgd2lsbCBiZSBzZXQgdG8KKyAgLy8vIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIGxlZnQgdG8gZXhhbWluZS4gSWYgYSBudWxsIHBvaW50ZXIgaXMgcGFzc2VkCisgIC8vLyBpbiwgdGhlIGxpbWl0IHdpbGwgZGVmYXVsdCB0byB0aGUgdmFsdWUgb2YgLW1lbWRlcC1ibG9jay1zY2FuLWxpbWl0LgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGlzIGFuIHVuY2FjaGVkIHF1ZXJ5LCBhbmQgdGh1cyBtYXkgYmUgaW5lZmZpY2llbnQuCisgIE1lbURlcFJlc3VsdCBnZXRQb2ludGVyRGVwZW5kZW5jeUZyb20oY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvYywgYm9vbCBpc0xvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgU2Nhbkl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpRdWVyeUluc3QgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpMaW1pdCA9IG51bGxwdHIpOworCisgIE1lbURlcFJlc3VsdCBnZXRTaW1wbGVQb2ludGVyRGVwZW5kZW5jeUZyb20oY29uc3QgTWVtb3J5TG9jYXRpb24gJk1lbUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzTG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBTY2FuSXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKlF1ZXJ5SW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqTGltaXQgPSBudWxscHRyKTsKKworICAvLy8gVGhpcyBhbmFseXNpcyBsb29rcyBmb3Igb3RoZXIgbG9hZHMgYW5kIHN0b3JlcyB3aXRoIGludmFyaWFudC5ncm91cAorICAvLy8gbWV0YWRhdGEgYW5kIHRoZSBzYW1lIHBvaW50ZXIgb3BlcmFuZC4gUmV0dXJucyBVbmtub3duIGlmIGl0IGRvZXMgbm90CisgIC8vLyBmaW5kIGFueXRoaW5nLCBhbmQgRGVmIGlmIGl0IGNhbiBiZSBhc3N1bWVkIHRoYXQgMiBpbnN0cnVjdGlvbnMgbG9hZCBvcgorICAvLy8gc3RvcmUgdGhlIHNhbWUgdmFsdWUgYW5kIE5vbkxvY2FsIHdoaWNoIGluZGljYXRlIHRoYXQgbm9uLWxvY2FsIERlZiB3YXMKKyAgLy8vIGZvdW5kLCB3aGljaCBjYW4gYmUgcmV0cmlldmVkIGJ5IGNhbGxpbmcgZ2V0Tm9uTG9jYWxQb2ludGVyRGVwZW5kZW5jeQorICAvLy8gd2l0aCB0aGUgc2FtZSBxdWVyaWVkIGluc3RydWN0aW9uLgorICBNZW1EZXBSZXN1bHQgZ2V0SW52YXJpYW50R3JvdXBQb2ludGVyRGVwZW5kZW5jeShMb2FkSW5zdCAqTEksIEJhc2ljQmxvY2sgKkJCKTsKKworICAvLy8gTG9va3MgYXQgYSBtZW1vcnkgbG9jYXRpb24gZm9yIGEgbG9hZCAoc3BlY2lmaWVkIGJ5IE1lbUxvY0Jhc2UsIE9mZnMsIGFuZAorICAvLy8gU2l6ZSkgYW5kIGNvbXBhcmVzIGl0IGFnYWluc3QgYSBsb2FkLgorICAvLy8KKyAgLy8vIElmIHRoZSBzcGVjaWZpZWQgbG9hZCBjb3VsZCBiZSBzYWZlbHkgd2lkZW5lZCB0byBhIGxhcmdlciBpbnRlZ2VyIGxvYWQKKyAgLy8vIHRoYXQgaXMgMSkgc3RpbGwgZWZmaWNpZW50LCAyKSBzYWZlIGZvciB0aGUgdGFyZ2V0LCBhbmQgMykgd291bGQgcHJvdmlkZQorICAvLy8gdGhlIHNwZWNpZmllZCBtZW1vcnkgbG9jYXRpb24gdmFsdWUsIHRoZW4gdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBzaXplCisgIC8vLyBpbiBieXRlcyBvZiB0aGUgbG9hZCB3aWR0aCB0byB1c2UuICBJZiBub3QsIHRoaXMgcmV0dXJucyB6ZXJvLgorICBzdGF0aWMgdW5zaWduZWQgZ2V0TG9hZExvYWRDbG9iYmVyRnVsbFdpZHRoU2l6ZShjb25zdCBWYWx1ZSAqTWVtTG9jQmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBNZW1Mb2NPZmZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNZW1Mb2NTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2FkSW5zdCAqTEkpOworCisgIC8vLyBSZWxlYXNlIG1lbW9yeSBpbiBjYWNoZXMuCisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpOworCitwcml2YXRlOgorICBNZW1EZXBSZXN1bHQgZ2V0Q2FsbFNpdGVEZXBlbmRlbmN5RnJvbShDYWxsU2l0ZSBDLCBib29sIGlzUmVhZE9ubHlDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBTY2FuSXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkJCKTsKKyAgYm9vbCBnZXROb25Mb2NhbFBvaW50ZXJEZXBGcm9tQkIoSW5zdHJ1Y3Rpb24gKlF1ZXJ5SW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUEhJVHJhbnNBZGRyICZQb2ludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jLCBib29sIGlzTG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxOb25Mb2NhbERlcFJlc3VsdD4gJlJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXA8QmFzaWNCbG9jayAqLCBWYWx1ZSAqPiAmVmlzaXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTa2lwRmlyc3RCbG9jayA9IGZhbHNlKTsKKyAgTWVtRGVwUmVzdWx0IEdldE5vbkxvY2FsSW5mb0ZvckJsb2NrKEluc3RydWN0aW9uICpRdWVyeUluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jLCBib29sIGlzTG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkJCLCBOb25Mb2NhbERlcEluZm8gKkNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtU29ydGVkRW50cmllcyk7CisKKyAgdm9pZCBSZW1vdmVDYWNoZWROb25Mb2NhbFBvaW50ZXJEZXBlbmRlbmNpZXMoVmFsdWVJc0xvYWRQYWlyIFApOworCisgIHZvaWQgdmVyaWZ5UmVtb3ZlZChJbnN0cnVjdGlvbiAqSW5zdCkgY29uc3Q7Cit9OworCisvLy8gQW4gYW5hbHlzaXMgdGhhdCBwcm9kdWNlcyBcYyBNZW1vcnlEZXBlbmRlbmNlUmVzdWx0cyBmb3IgYSBmdW5jdGlvbi4KKy8vLworLy8vIFRoaXMgaXMgZXNzZW50aWFsbHkgYSBuby1vcCBiZWNhdXNlIHRoZSByZXN1bHRzIGFyZSBjb21wdXRlZCBlbnRpcmVseQorLy8vIGxhemlseS4KK2NsYXNzIE1lbW9yeURlcGVuZGVuY2VBbmFseXNpcworICAgIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPE1lbW9yeURlcGVuZGVuY2VBbmFseXNpcz4geworICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48TWVtb3J5RGVwZW5kZW5jZUFuYWx5c2lzPjsKKworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCitwdWJsaWM6CisgIHVzaW5nIFJlc3VsdCA9IE1lbW9yeURlcGVuZGVuY2VSZXN1bHRzOworCisgIE1lbW9yeURlcGVuZGVuY2VSZXN1bHRzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBBIHdyYXBwZXIgYW5hbHlzaXMgcGFzcyBmb3IgdGhlIGxlZ2FjeSBwYXNzIG1hbmFnZXIgdGhhdCBleHBvc2VzIGEgXGMKKy8vLyBNZW1vcnlEZXBuZWRlbmNlUmVzdWx0cyBpbnN0YW5jZS4KK2NsYXNzIE1lbW9yeURlcGVuZGVuY2VXcmFwcGVyUGFzcyA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICBPcHRpb25hbDxNZW1vcnlEZXBlbmRlbmNlUmVzdWx0cz4gTWVtRGVwOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIE1lbW9yeURlcGVuZGVuY2VXcmFwcGVyUGFzcygpOworICB+TWVtb3J5RGVwZW5kZW5jZVdyYXBwZXJQYXNzKCkgb3ZlcnJpZGU7CisKKyAgLy8vIFBhc3MgSW1wbGVtZW50YXRpb24gc3R1ZmYuICBUaGlzIGRvZXNuJ3QgZG8gYW55IGFuYWx5c2lzIGVhZ2VybHkuCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmKSBvdmVycmlkZTsKKworICAvLy8gQ2xlYW4gdXAgbWVtb3J5IGluIGJldHdlZW4gcnVucworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZTsKKworICAvLy8gRG9lcyBub3QgbW9kaWZ5IGFueXRoaW5nLiAgSXQgdXNlcyBWYWx1ZSBOdW1iZXJpbmcgYW5kIEFsaWFzIEFuYWx5c2lzLgorICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworCisgIE1lbW9yeURlcGVuZGVuY2VSZXN1bHRzICZnZXRNZW1EZXAoKSB7IHJldHVybiAqTWVtRGVwOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19NRU1PUllERVBFTkRFTkNFQU5BTFlTSVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9NZW1vcnlMb2NhdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9NZW1vcnlMb2NhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMDgwNzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL01lbW9yeUxvY2F0aW9uLmgKQEAgLTAsMCArMSwxNDkgQEAKKy8vPT09LSBNZW1vcnlMb2NhdGlvbi5oIC0gTWVtb3J5IGxvY2F0aW9uIGRlc2NyaXB0aW9ucyAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgcHJvdmlkZXMgdXRpbGl0eSBhbmFseXNpcyBvYmplY3RzIGRlc2NyaWJpbmcgbWVtb3J5IGxvY2F0aW9ucy4KKy8vLyBUaGVzZSBhcmUgdXNlZCBib3RoIGJ5IHRoZSBBbGlhcyBBbmFseXNpcyBpbmZyYXN0cnVjdHVyZSBhbmQgbW9yZQorLy8vIHNwZWNpYWxpemVkIG1lbW9yeSBhbmFseXNpcyBsYXllcnMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19NRU1PUllMT0NBVElPTl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfTUVNT1JZTE9DQVRJT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9NZXRhZGF0YS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExvYWRJbnN0OworY2xhc3MgU3RvcmVJbnN0OworY2xhc3MgTWVtVHJhbnNmZXJJbnN0OworY2xhc3MgTWVtSW50cmluc2ljOworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CisKKy8vLyBSZXByZXNlbnRhdGlvbiBmb3IgYSBzcGVjaWZpYyBtZW1vcnkgbG9jYXRpb24uCisvLy8KKy8vLyBUaGlzIGFic3RyYWN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBhIHNwZWNpZmljIGxvY2F0aW9uIGluIG1lbW9yeS4KKy8vLyBUaGUgZ29hbCBvZiB0aGUgbG9jYXRpb24gaXMgdG8gcmVwcmVzZW50IGVub3VnaCBpbmZvcm1hdGlvbiB0byBkZXNjcmliZQorLy8vIGFic3RyYWN0IGFsaWFzaW5nLCBtb2RpZmljYXRpb24sIGFuZCByZWZlcmVuY2UgYmVoYXZpb3JzIG9mIHdoYXRldmVyCisvLy8gdmFsdWUocykgYXJlIHN0b3JlZCBpbiBtZW1vcnkgYXQgdGhlIHBhcnRpY3VsYXIgbG9jYXRpb24uCisvLy8KKy8vLyBUaGUgcHJpbWFyeSB1c2VyIG9mIHRoaXMgaW50ZXJmYWNlIGlzIExMVk0ncyBBbGlhcyBBbmFseXNpcywgYnV0IG90aGVyCisvLy8gbWVtb3J5IGFuYWx5c2VzIHN1Y2ggYXMgTWVtb3J5RGVwZW5kZW5jZSBjYW4gdXNlIGl0IGFzIHdlbGwuCitjbGFzcyBNZW1vcnlMb2NhdGlvbiB7CitwdWJsaWM6CisgIC8vLyBVbmtub3duU2l6ZSAtIFRoaXMgaXMgYSBzcGVjaWFsIHZhbHVlIHdoaWNoIGNhbiBiZSB1c2VkIHdpdGggdGhlCisgIC8vLyBzaXplIGFyZ3VtZW50cyBpbiBhbGlhcyBxdWVyaWVzIHRvIGluZGljYXRlIHRoYXQgdGhlIGNhbGxlciBkb2VzIG5vdAorICAvLy8ga25vdyB0aGUgc2l6ZXMgb2YgdGhlIHBvdGVudGlhbCBtZW1vcnkgcmVmZXJlbmNlcy4KKyAgZW51bSA6IHVpbnQ2NF90IHsgVW5rbm93blNpemUgPSB+VUlOVDY0X0MoMCkgfTsKKworICAvLy8gVGhlIGFkZHJlc3Mgb2YgdGhlIHN0YXJ0IG9mIHRoZSBsb2NhdGlvbi4KKyAgY29uc3QgVmFsdWUgKlB0cjsKKworICAvLy8gVGhlIG1heGltdW0gc2l6ZSBvZiB0aGUgbG9jYXRpb24sIGluIGFkZHJlc3MtdW5pdHMsIG9yCisgIC8vLyBVbmtub3duU2l6ZSBpZiB0aGUgc2l6ZSBpcyBub3Qga25vd24uCisgIC8vLworICAvLy8gTm90ZSB0aGF0IGFuIHVua25vd24gc2l6ZSBkb2VzIG5vdCBtZWFuIHRoZSBwb2ludGVyIGFsaWFzZXMgdGhlIGVudGlyZQorICAvLy8gdmlydHVhbCBhZGRyZXNzIHNwYWNlLCBiZWNhdXNlIHRoZXJlIGFyZSByZXN0cmljdGlvbnMgb24gc3RlcHBpbmcgb3V0IG9mCisgIC8vLyBvbmUgb2JqZWN0IGFuZCBpbnRvIGFub3RoZXIuIFNlZQorICAvLy8gaHR0cDovL2xsdm0ub3JnL2RvY3MvTGFuZ1JlZi5odG1sI3BvaW50ZXJhbGlhc2luZworICB1aW50NjRfdCBTaXplOworCisgIC8vLyBUaGUgbWV0YWRhdGEgbm9kZXMgd2hpY2ggZGVzY3JpYmVzIHRoZSBhbGlhc2luZyBvZiB0aGUgbG9jYXRpb24gKGVhY2gKKyAgLy8vIG1lbWJlciBpcyBudWxsIGlmIHRoYXQga2luZCBvZiBpbmZvcm1hdGlvbiBpcyB1bmF2YWlsYWJsZSkuCisgIEFBTUROb2RlcyBBQVRhZ3M7CisKKyAgLy8vIFJldHVybiBhIGxvY2F0aW9uIHdpdGggaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lbW9yeSByZWZlcmVuY2UgYnkgdGhlIGdpdmVuCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgc3RhdGljIE1lbW9yeUxvY2F0aW9uIGdldChjb25zdCBMb2FkSW5zdCAqTEkpOworICBzdGF0aWMgTWVtb3J5TG9jYXRpb24gZ2V0KGNvbnN0IFN0b3JlSW5zdCAqU0kpOworICBzdGF0aWMgTWVtb3J5TG9jYXRpb24gZ2V0KGNvbnN0IFZBQXJnSW5zdCAqVkkpOworICBzdGF0aWMgTWVtb3J5TG9jYXRpb24gZ2V0KGNvbnN0IEF0b21pY0NtcFhjaGdJbnN0ICpDWEkpOworICBzdGF0aWMgTWVtb3J5TG9jYXRpb24gZ2V0KGNvbnN0IEF0b21pY1JNV0luc3QgKlJNV0kpOworICBzdGF0aWMgTWVtb3J5TG9jYXRpb24gZ2V0KGNvbnN0IEluc3RydWN0aW9uICpJbnN0KSB7CisgICAgcmV0dXJuICpNZW1vcnlMb2NhdGlvbjo6Z2V0T3JOb25lKEluc3QpOworICB9CisgIHN0YXRpYyBPcHRpb25hbDxNZW1vcnlMb2NhdGlvbj4gZ2V0T3JOb25lKGNvbnN0IEluc3RydWN0aW9uICpJbnN0KSB7CisgICAgc3dpdGNoIChJbnN0LT5nZXRPcGNvZGUoKSkgeworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkxvYWQ6CisgICAgICByZXR1cm4gZ2V0KGNhc3Q8TG9hZEluc3Q+KEluc3QpKTsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpTdG9yZToKKyAgICAgIHJldHVybiBnZXQoY2FzdDxTdG9yZUluc3Q+KEluc3QpKTsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpWQUFyZzoKKyAgICAgIHJldHVybiBnZXQoY2FzdDxWQUFyZ0luc3Q+KEluc3QpKTsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpBdG9taWNDbXBYY2hnOgorICAgICAgcmV0dXJuIGdldChjYXN0PEF0b21pY0NtcFhjaGdJbnN0PihJbnN0KSk7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6QXRvbWljUk1XOgorICAgICAgcmV0dXJuIGdldChjYXN0PEF0b21pY1JNV0luc3Q+KEluc3QpKTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIE5vbmU7CisgICAgfQorICB9CisKKyAgLy8vIFJldHVybiBhIGxvY2F0aW9uIHJlcHJlc2VudGluZyB0aGUgc291cmNlIG9mIGEgbWVtb3J5IHRyYW5zZmVyLgorICBzdGF0aWMgTWVtb3J5TG9jYXRpb24gZ2V0Rm9yU291cmNlKGNvbnN0IE1lbVRyYW5zZmVySW5zdCAqTVRJKTsKKworICAvLy8gUmV0dXJuIGEgbG9jYXRpb24gcmVwcmVzZW50aW5nIHRoZSBkZXN0aW5hdGlvbiBvZiBhIG1lbW9yeSBzZXQgb3IKKyAgLy8vIHRyYW5zZmVyLgorICBzdGF0aWMgTWVtb3J5TG9jYXRpb24gZ2V0Rm9yRGVzdChjb25zdCBNZW1JbnRyaW5zaWMgKk1JKTsKKworICAvLy8gUmV0dXJuIGEgbG9jYXRpb24gcmVwcmVzZW50aW5nIGEgcGFydGljdWxhciBhcmd1bWVudCBvZiBhIGNhbGwuCisgIHN0YXRpYyBNZW1vcnlMb2NhdGlvbiBnZXRGb3JBcmd1bWVudChJbW11dGFibGVDYWxsU2l0ZSBDUywgdW5zaWduZWQgQXJnSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gJlRMSSk7CisKKyAgZXhwbGljaXQgTWVtb3J5TG9jYXRpb24oY29uc3QgVmFsdWUgKlB0ciA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUgPSBVbmtub3duU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQUFNRE5vZGVzICZBQVRhZ3MgPSBBQU1ETm9kZXMoKSkKKyAgICAgIDogUHRyKFB0ciksIFNpemUoU2l6ZSksIEFBVGFncyhBQVRhZ3MpIHt9CisKKyAgTWVtb3J5TG9jYXRpb24gZ2V0V2l0aE5ld1B0cihjb25zdCBWYWx1ZSAqTmV3UHRyKSBjb25zdCB7CisgICAgTWVtb3J5TG9jYXRpb24gQ29weSgqdGhpcyk7CisgICAgQ29weS5QdHIgPSBOZXdQdHI7CisgICAgcmV0dXJuIENvcHk7CisgIH0KKworICBNZW1vcnlMb2NhdGlvbiBnZXRXaXRoTmV3U2l6ZSh1aW50NjRfdCBOZXdTaXplKSBjb25zdCB7CisgICAgTWVtb3J5TG9jYXRpb24gQ29weSgqdGhpcyk7CisgICAgQ29weS5TaXplID0gTmV3U2l6ZTsKKyAgICByZXR1cm4gQ29weTsKKyAgfQorCisgIE1lbW9yeUxvY2F0aW9uIGdldFdpdGhvdXRBQVRhZ3MoKSBjb25zdCB7CisgICAgTWVtb3J5TG9jYXRpb24gQ29weSgqdGhpcyk7CisgICAgQ29weS5BQVRhZ3MgPSBBQU1ETm9kZXMoKTsKKyAgICByZXR1cm4gQ29weTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNZW1vcnlMb2NhdGlvbiAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gUHRyID09IE90aGVyLlB0ciAmJiBTaXplID09IE90aGVyLlNpemUgJiYgQUFUYWdzID09IE90aGVyLkFBVGFnczsKKyAgfQorfTsKKworLy8gU3BlY2lhbGl6ZSBEZW5zZU1hcEluZm8gZm9yIE1lbW9yeUxvY2F0aW9uLgordGVtcGxhdGUgPD4gc3RydWN0IERlbnNlTWFwSW5mbzxNZW1vcnlMb2NhdGlvbj4geworICBzdGF0aWMgaW5saW5lIE1lbW9yeUxvY2F0aW9uIGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiBNZW1vcnlMb2NhdGlvbihEZW5zZU1hcEluZm88Y29uc3QgVmFsdWUgKj46OmdldEVtcHR5S2V5KCksIDApOworICB9CisgIHN0YXRpYyBpbmxpbmUgTWVtb3J5TG9jYXRpb24gZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiBNZW1vcnlMb2NhdGlvbihEZW5zZU1hcEluZm88Y29uc3QgVmFsdWUgKj46OmdldFRvbWJzdG9uZUtleSgpLCAwKTsKKyAgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IE1lbW9yeUxvY2F0aW9uICZWYWwpIHsKKyAgICByZXR1cm4gRGVuc2VNYXBJbmZvPGNvbnN0IFZhbHVlICo+OjpnZXRIYXNoVmFsdWUoVmFsLlB0cikgXgorICAgICAgICAgICBEZW5zZU1hcEluZm88dWludDY0X3Q+OjpnZXRIYXNoVmFsdWUoVmFsLlNpemUpIF4KKyAgICAgICAgICAgRGVuc2VNYXBJbmZvPEFBTUROb2Rlcz46OmdldEhhc2hWYWx1ZShWYWwuQUFUYWdzKTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMSFMsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL01lbW9yeVNTQS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9NZW1vcnlTU0EuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODk5ODkwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9NZW1vcnlTU0EuaApAQCAtMCwwICsxLDEyMzAgQEAKKy8vPT09LSBNZW1vcnlTU0EuaCAtIEJ1aWxkIE1lbW9yeSBTU0EgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIFRoaXMgZmlsZSBleHBvc2VzIGFuIGludGVyZmFjZSB0byBidWlsZGluZy91c2luZyBtZW1vcnkgU1NBIHRvCisvLy8gd2FsayBtZW1vcnkgaW5zdHJ1Y3Rpb25zIHVzaW5nIGEgdXNlL2RlZiBncmFwaC4KKy8vLworLy8vIE1lbW9yeSBTU0EgY2xhc3MgYnVpbGRzIGFuIFNTQSBmb3JtIHRoYXQgbGlua3MgdG9nZXRoZXIgbWVtb3J5IGFjY2VzcworLy8vIGluc3RydWN0aW9ucyBzdWNoIGFzIGxvYWRzLCBzdG9yZXMsIGF0b21pY3MsIGFuZCBjYWxscy4gQWRkaXRpb25hbGx5LCBpdAorLy8vIGRvZXMgYSB0cml2aWFsIGZvcm0gb2YgImhlYXAgdmVyc2lvbmluZyIgRXZlcnkgdGltZSB0aGUgbWVtb3J5IHN0YXRlIGNoYW5nZXMKKy8vLyBpbiB0aGUgcHJvZ3JhbSwgd2UgZ2VuZXJhdGUgYSBuZXcgaGVhcCB2ZXJzaW9uLiBJdCBnZW5lcmF0ZXMKKy8vLyBNZW1vcnlEZWYvVXNlcy9QaGlzIHRoYXQgYXJlIG92ZXJsYXllZCBvbiB0b3Agb2YgdGhlIGV4aXN0aW5nIGluc3RydWN0aW9ucy4KKy8vLworLy8vIEFzIGEgdHJpdmlhbCBleGFtcGxlLAorLy8vIGRlZmluZSBpMzIgQG1haW4oKSAjMCB7CisvLy8gZW50cnk6CisvLy8gICAlY2FsbCA9IGNhbGwgbm9hbGlhcyBpOCogQF9abndtKGk2NCA0KSAjMgorLy8vICAgJTAgPSBiaXRjYXN0IGk4KiAlY2FsbCB0byBpMzIqCisvLy8gICAlY2FsbDEgPSBjYWxsIG5vYWxpYXMgaTgqIEBfWm53bShpNjQgNCkgIzIKKy8vLyAgICUxID0gYml0Y2FzdCBpOCogJWNhbGwxIHRvIGkzMioKKy8vLyAgIHN0b3JlIGkzMiA1LCBpMzIqICUwLCBhbGlnbiA0CisvLy8gICBzdG9yZSBpMzIgNywgaTMyKiAlMSwgYWxpZ24gNAorLy8vICAgJTIgPSBsb2FkIGkzMiogJTAsIGFsaWduIDQKKy8vLyAgICUzID0gbG9hZCBpMzIqICUxLCBhbGlnbiA0CisvLy8gICAlYWRkID0gYWRkIG5zdyBpMzIgJTIsICUzCisvLy8gICByZXQgaTMyICVhZGQKKy8vLyB9CisvLy8KKy8vLyBXaWxsIGJlY29tZQorLy8vIGRlZmluZSBpMzIgQG1haW4oKSAjMCB7CisvLy8gZW50cnk6CisvLy8gICA7IDEgPSBNZW1vcnlEZWYoMCkKKy8vLyAgICVjYWxsID0gY2FsbCBub2FsaWFzIGk4KiBAX1pud20oaTY0IDQpICMzCisvLy8gICAlMiA9IGJpdGNhc3QgaTgqICVjYWxsIHRvIGkzMioKKy8vLyAgIDsgMiA9IE1lbW9yeURlZigxKQorLy8vICAgJWNhbGwxID0gY2FsbCBub2FsaWFzIGk4KiBAX1pud20oaTY0IDQpICMzCisvLy8gICAlNCA9IGJpdGNhc3QgaTgqICVjYWxsMSB0byBpMzIqCisvLy8gICA7IDMgPSBNZW1vcnlEZWYoMikKKy8vLyAgIHN0b3JlIGkzMiA1LCBpMzIqICUyLCBhbGlnbiA0CisvLy8gICA7IDQgPSBNZW1vcnlEZWYoMykKKy8vLyAgIHN0b3JlIGkzMiA3LCBpMzIqICU0LCBhbGlnbiA0CisvLy8gICA7IE1lbW9yeVVzZSgzKQorLy8vICAgJTcgPSBsb2FkIGkzMiogJTIsIGFsaWduIDQKKy8vLyAgIDsgTWVtb3J5VXNlKDQpCisvLy8gICAlOCA9IGxvYWQgaTMyKiAlNCwgYWxpZ24gNAorLy8vICAgJWFkZCA9IGFkZCBuc3cgaTMyICU3LCAlOAorLy8vICAgcmV0IGkzMiAlYWRkCisvLy8gfQorLy8vCisvLy8gR2l2ZW4gdGhpcyBmb3JtLCBhbGwgdGhlIHN0b3JlcyB0aGF0IGNvdWxkIGV2ZXIgZWZmZWN0IHRoZSBsb2FkIGF0ICU4IGNhbiBiZQorLy8vIGdvdHRlbiBieSB1c2luZyB0aGUgTWVtb3J5VXNlIGFzc29jaWF0ZWQgd2l0aCBpdCwgYW5kIHdhbGtpbmcgZnJvbSB1c2UgdG8KKy8vLyBkZWYgdW50aWwgeW91IGhpdCB0aGUgdG9wIG9mIHRoZSBmdW5jdGlvbi4KKy8vLworLy8vIEVhY2ggZGVmIGFsc28gaGFzIGEgbGlzdCBvZiB1c2VycyBhc3NvY2lhdGVkIHdpdGggaXQsIHNvIHlvdSBjYW4gd2FsayBmcm9tCisvLy8gYm90aCBkZWYgdG8gdXNlcnMsIGFuZCB1c2VycyB0byBkZWZzLiBOb3RlIHRoYXQgd2UgZGlzYW1iaWd1YXRlIE1lbW9yeVVzZXMsCisvLy8gYnV0IG5vdCB0aGUgUkhTIG9mIE1lbW9yeURlZnMuIFlvdSBjYW4gc2VlIHRoaXMgYWJvdmUgYXQgJTcsIHdoaWNoIHdvdWxkCisvLy8gb3RoZXJ3aXNlIGJlIGEgTWVtb3J5VXNlKDQpLiBCZWluZyBkaXNhbWJpZ3VhdGVkIG1lYW5zIHRoYXQgZm9yIGEgZ2l2ZW4KKy8vLyBzdG9yZSwgYWxsIHRoZSBNZW1vcnlVc2VzIG9uIGl0cyB1c2UgbGlzdHMgYXJlIG1heS1hbGlhc2VzIG9mIHRoYXQgc3RvcmUKKy8vLyAoYnV0IHRoZSBNZW1vcnlEZWZzIG9uIGl0cyB1c2UgbGlzdCBtYXkgbm90IGJlKS4KKy8vLworLy8vIE1lbW9yeURlZnMgYXJlIG5vdCBkaXNhbWJpZ3VhdGVkIGJlY2F1c2UgaXQgd291bGQgcmVxdWlyZSBtdWx0aXBsZSByZWFjaGluZworLy8vIGRlZmluaXRpb25zLCB3aGljaCB3b3VsZCByZXF1aXJlIG11bHRpcGxlIHBoaXMsIGFuZCBtdWx0aXBsZSBtZW1vcnlhY2Nlc3NlcworLy8vIHBlciBpbnN0cnVjdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfTUVNT1JZU1NBX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19NRU1PUllTU0FfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvc2ltcGxlX2lsaXN0LmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9NZW1vcnlMb2NhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvUEhJVHJhbnNBZGRyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZXJpdmVkVXNlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Vc2UuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1VzZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZUhhbmRsZS5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgTWVtb3J5QWNjZXNzOworY2xhc3MgTWVtb3J5U1NBV2Fsa2VyOworY2xhc3MgTExWTUNvbnRleHQ7CitjbGFzcyByYXdfb3N0cmVhbTsKKworbmFtZXNwYWNlIE1TU0FIZWxwZXJzIHsKKworc3RydWN0IEFsbEFjY2Vzc1RhZyB7fTsKK3N0cnVjdCBEZWZzT25seVRhZyB7fTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIE1TU0FIZWxwZXJzCisKK2VudW0gOiB1bnNpZ25lZCB7CisgIC8vIFVzZWQgdG8gc2lnbmlmeSB3aGF0IHRoZSBkZWZhdWx0IGludmFsaWQgSUQgaXMgZm9yIE1lbW9yeUFjY2VzcydzCisgIC8vIGdldElEKCkKKyAgSU5WQUxJRF9NRU1PUllBQ0NFU1NfSUQgPSAtMVUKK307CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBtZW1vcnlhY2Nlc3NfZGVmX2l0ZXJhdG9yX2Jhc2U7Cit1c2luZyBtZW1vcnlhY2Nlc3NfZGVmX2l0ZXJhdG9yID0gbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvcl9iYXNlPE1lbW9yeUFjY2Vzcz47Cit1c2luZyBjb25zdF9tZW1vcnlhY2Nlc3NfZGVmX2l0ZXJhdG9yID0KKyAgICBtZW1vcnlhY2Nlc3NfZGVmX2l0ZXJhdG9yX2Jhc2U8Y29uc3QgTWVtb3J5QWNjZXNzPjsKKworLy8gXGJyaWVmIFRoZSBiYXNlIGZvciBhbGwgbWVtb3J5IGFjY2Vzc2VzLiBBbGwgbWVtb3J5IGFjY2Vzc2VzIGluIGEgYmxvY2sgYXJlCisvLyBsaW5rZWQgdG9nZXRoZXIgdXNpbmcgYW4gaW50cnVzaXZlIGxpc3QuCitjbGFzcyBNZW1vcnlBY2Nlc3MKKyAgICA6IHB1YmxpYyBEZXJpdmVkVXNlciwKKyAgICAgIHB1YmxpYyBpbGlzdF9ub2RlPE1lbW9yeUFjY2VzcywgaWxpc3RfdGFnPE1TU0FIZWxwZXJzOjpBbGxBY2Nlc3NUYWc+PiwKKyAgICAgIHB1YmxpYyBpbGlzdF9ub2RlPE1lbW9yeUFjY2VzcywgaWxpc3RfdGFnPE1TU0FIZWxwZXJzOjpEZWZzT25seVRhZz4+IHsKK3B1YmxpYzoKKyAgdXNpbmcgQWxsQWNjZXNzVHlwZSA9CisgICAgICBpbGlzdF9ub2RlPE1lbW9yeUFjY2VzcywgaWxpc3RfdGFnPE1TU0FIZWxwZXJzOjpBbGxBY2Nlc3NUYWc+PjsKKyAgdXNpbmcgRGVmc09ubHlUeXBlID0KKyAgICAgIGlsaXN0X25vZGU8TWVtb3J5QWNjZXNzLCBpbGlzdF90YWc8TVNTQUhlbHBlcnM6OkRlZnNPbmx5VGFnPj47CisKKyAgTWVtb3J5QWNjZXNzKGNvbnN0IE1lbW9yeUFjY2VzcyAmKSA9IGRlbGV0ZTsKKyAgTWVtb3J5QWNjZXNzICZvcGVyYXRvcj0oY29uc3QgTWVtb3J5QWNjZXNzICYpID0gZGVsZXRlOworCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QpID0gZGVsZXRlOworCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQKKyAgLy8gZHluX2Nhc3QKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHVuc2lnbmVkIElEID0gVi0+Z2V0VmFsdWVJRCgpOworICAgIHJldHVybiBJRCA9PSBNZW1vcnlVc2VWYWwgfHwgSUQgPT0gTWVtb3J5UGhpVmFsIHx8IElEID09IE1lbW9yeURlZlZhbDsKKyAgfQorCisgIEJhc2ljQmxvY2sgKmdldEJsb2NrKCkgY29uc3QgeyByZXR1cm4gQmxvY2s7IH0KKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVGhlIHVzZXIgaXRlcmF0b3JzIGZvciBhIG1lbW9yeSBhY2Nlc3MKKyAgdXNpbmcgaXRlcmF0b3IgPSB1c2VyX2l0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IGNvbnN0X3VzZXJfaXRlcmF0b3I7CisKKyAgLy8vIFxicmllZiBUaGlzIGl0ZXJhdG9yIHdhbGtzIG92ZXIgYWxsIG9mIHRoZSBkZWZzIGluIGEgZ2l2ZW4KKyAgLy8vIE1lbW9yeUFjY2Vzcy4gRm9yIE1lbW9yeVBoaSBub2RlcywgdGhpcyB3YWxrcyBhcmd1bWVudHMuIEZvcgorICAvLy8gTWVtb3J5VXNlL01lbW9yeURlZiwgdGhpcyB3YWxrcyB0aGUgZGVmaW5pbmcgYWNjZXNzLgorICBtZW1vcnlhY2Nlc3NfZGVmX2l0ZXJhdG9yIGRlZnNfYmVnaW4oKTsKKyAgY29uc3RfbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvciBkZWZzX2JlZ2luKCkgY29uc3Q7CisgIG1lbW9yeWFjY2Vzc19kZWZfaXRlcmF0b3IgZGVmc19lbmQoKTsKKyAgY29uc3RfbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvciBkZWZzX2VuZCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBpdGVyYXRvcnMgZm9yIHRoZSBhbGwgYWNjZXNzIGxpc3QgYW5kIHRoZSBkZWZzIG9ubHkgbGlzdAorICAvLy8gV2UgZGVmYXVsdCB0byB0aGUgYWxsIGFjY2VzcyBsaXN0LgorICBBbGxBY2Nlc3NUeXBlOjpzZWxmX2l0ZXJhdG9yIGdldEl0ZXJhdG9yKCkgeworICAgIHJldHVybiB0aGlzLT5BbGxBY2Nlc3NUeXBlOjpnZXRJdGVyYXRvcigpOworICB9CisgIEFsbEFjY2Vzc1R5cGU6OmNvbnN0X3NlbGZfaXRlcmF0b3IgZ2V0SXRlcmF0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPkFsbEFjY2Vzc1R5cGU6OmdldEl0ZXJhdG9yKCk7CisgIH0KKyAgQWxsQWNjZXNzVHlwZTo6cmV2ZXJzZV9zZWxmX2l0ZXJhdG9yIGdldFJldmVyc2VJdGVyYXRvcigpIHsKKyAgICByZXR1cm4gdGhpcy0+QWxsQWNjZXNzVHlwZTo6Z2V0UmV2ZXJzZUl0ZXJhdG9yKCk7CisgIH0KKyAgQWxsQWNjZXNzVHlwZTo6Y29uc3RfcmV2ZXJzZV9zZWxmX2l0ZXJhdG9yIGdldFJldmVyc2VJdGVyYXRvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+QWxsQWNjZXNzVHlwZTo6Z2V0UmV2ZXJzZUl0ZXJhdG9yKCk7CisgIH0KKyAgRGVmc09ubHlUeXBlOjpzZWxmX2l0ZXJhdG9yIGdldERlZnNJdGVyYXRvcigpIHsKKyAgICByZXR1cm4gdGhpcy0+RGVmc09ubHlUeXBlOjpnZXRJdGVyYXRvcigpOworICB9CisgIERlZnNPbmx5VHlwZTo6Y29uc3Rfc2VsZl9pdGVyYXRvciBnZXREZWZzSXRlcmF0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPkRlZnNPbmx5VHlwZTo6Z2V0SXRlcmF0b3IoKTsKKyAgfQorICBEZWZzT25seVR5cGU6OnJldmVyc2Vfc2VsZl9pdGVyYXRvciBnZXRSZXZlcnNlRGVmc0l0ZXJhdG9yKCkgeworICAgIHJldHVybiB0aGlzLT5EZWZzT25seVR5cGU6OmdldFJldmVyc2VJdGVyYXRvcigpOworICB9CisgIERlZnNPbmx5VHlwZTo6Y29uc3RfcmV2ZXJzZV9zZWxmX2l0ZXJhdG9yIGdldFJldmVyc2VEZWZzSXRlcmF0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIHRoaXMtPkRlZnNPbmx5VHlwZTo6Z2V0UmV2ZXJzZUl0ZXJhdG9yKCk7CisgIH0KKworcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgTWVtb3J5RGVmOworICBmcmllbmQgY2xhc3MgTWVtb3J5UGhpOworICBmcmllbmQgY2xhc3MgTWVtb3J5U1NBOworICBmcmllbmQgY2xhc3MgTWVtb3J5VXNlOworICBmcmllbmQgY2xhc3MgTWVtb3J5VXNlT3JEZWY7CisKKyAgLy8vIFxicmllZiBVc2VkIGJ5IE1lbW9yeVNTQSB0byBjaGFuZ2UgdGhlIGJsb2NrIG9mIGEgTWVtb3J5QWNjZXNzIHdoZW4gaXQgaXMKKyAgLy8vIG1vdmVkLgorICB2b2lkIHNldEJsb2NrKEJhc2ljQmxvY2sgKkJCKSB7IEJsb2NrID0gQkI7IH0KKworICAvLy8gXGJyaWVmIFVzZWQgZm9yIGRlYnVnZ2luZyBhbmQgdHJhY2tpbmcgdGhpbmdzIGFib3V0IE1lbW9yeUFjY2Vzc2VzLgorICAvLy8gR3VhcmFudGVlZCB1bmlxdWUgYW1vbmcgTWVtb3J5QWNjZXNzZXMsIG5vIGd1YXJhbnRlZXMgb3RoZXJ3aXNlLgorICBpbmxpbmUgdW5zaWduZWQgZ2V0SUQoKSBjb25zdDsKKworICBNZW1vcnlBY2Nlc3MoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIFZ0eSwgRGVsZXRlVmFsdWVUeSBEZWxldGVWYWx1ZSwKKyAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkJCLCB1bnNpZ25lZCBOdW1PcGVyYW5kcykKKyAgICAgIDogRGVyaXZlZFVzZXIoVHlwZTo6Z2V0Vm9pZFR5KEMpLCBWdHksIG51bGxwdHIsIE51bU9wZXJhbmRzLCBEZWxldGVWYWx1ZSksCisgICAgICAgIEJsb2NrKEJCKSB7fQorCisgIC8vIFVzZSBkZWxldGVWYWx1ZSgpIHRvIGRlbGV0ZSBhIGdlbmVyaWMgTWVtb3J5QWNjZXNzLgorICB+TWVtb3J5QWNjZXNzKCkgPSBkZWZhdWx0OworCitwcml2YXRlOgorICBCYXNpY0Jsb2NrICpCbG9jazsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgaWxpc3RfYWxsb2NfdHJhaXRzPE1lbW9yeUFjY2Vzcz4geworICBzdGF0aWMgdm9pZCBkZWxldGVOb2RlKE1lbW9yeUFjY2VzcyAqTUEpIHsgTUEtPmRlbGV0ZVZhbHVlKCk7IH0KK307CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1lbW9yeUFjY2VzcyAmTUEpIHsKKyAgTUEucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKKy8vLyBcYnJpZWYgQ2xhc3MgdGhhdCBoYXMgdGhlIGNvbW1vbiBtZXRob2RzICsgZmllbGRzIG9mIG1lbW9yeSB1c2VzL2RlZnMuIEl0J3MKKy8vLyBhIGxpdHRsZSBhd2t3YXJkIHRvIGhhdmUsIGJ1dCB0aGVyZSBhcmUgbWFueSBjYXNlcyB3aGVyZSB3ZSB3YW50IGVpdGhlciBhCisvLy8gdXNlIG9yIGRlZiwgYW5kIHRoZXJlIGFyZSBtYW55IGNhc2VzIHdoZXJlIHVzZXMgYXJlIG5lZWRlZCAoZGVmcyBhcmVuJ3QKKy8vLyBhY2NlcHRhYmxlKSwgYW5kIHZpY2UtdmVyc2EuCisvLy8KKy8vLyBUaGlzIGNsYXNzIHNob3VsZCBuZXZlciBiZSBpbnN0YW50aWF0ZWQgZGlyZWN0bHk7IG1ha2UgYSBNZW1vcnlVc2Ugb3IKKy8vLyBNZW1vcnlEZWYgaW5zdGVhZC4KK2NsYXNzIE1lbW9yeVVzZU9yRGVmIDogcHVibGljIE1lbW9yeUFjY2VzcyB7CitwdWJsaWM6CisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QpID0gZGVsZXRlOworCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoTWVtb3J5QWNjZXNzKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgaW5zdHJ1Y3Rpb24gdGhhdCB0aGlzIE1lbW9yeVVzZSByZXByZXNlbnRzLgorICBJbnN0cnVjdGlvbiAqZ2V0TWVtb3J5SW5zdCgpIGNvbnN0IHsgcmV0dXJuIE1lbW9yeUluc3RydWN0aW9uOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGFjY2VzcyB0aGF0IHByb2R1Y2VzIHRoZSBtZW1vcnkgc3RhdGUgdXNlZCBieSB0aGlzIFVzZS4KKyAgTWVtb3J5QWNjZXNzICpnZXREZWZpbmluZ0FjY2VzcygpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMCk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpNQSkgeworICAgIHJldHVybiBNQS0+Z2V0VmFsdWVJRCgpID09IE1lbW9yeVVzZVZhbCB8fCBNQS0+Z2V0VmFsdWVJRCgpID09IE1lbW9yeURlZlZhbDsKKyAgfQorCisgIC8vIFNhZGx5LCB0aGVzZSBoYXZlIHRvIGJlIHB1YmxpYyBiZWNhdXNlIHRoZXkgYXJlIG5lZWRlZCBpbiBzb21lIG9mIHRoZQorICAvLyBpdGVyYXRvcnMuCisgIGlubGluZSBib29sIGlzT3B0aW1pemVkKCkgY29uc3Q7CisgIGlubGluZSBNZW1vcnlBY2Nlc3MgKmdldE9wdGltaXplZCgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBzZXRPcHRpbWl6ZWQoTWVtb3J5QWNjZXNzICopOworCisgIC8vIFJldHJpZXZlIEFsaWFzUmVzdWx0IHR5cGUgb2YgdGhlIG9wdGltaXplZCBhY2Nlc3MuIElkZWFsbHkgdGhpcyB3b3VsZCBiZQorICAvLyByZXR1cm5lZCBieSB0aGUgY2FjaGluZyB3YWxrZXIgYW5kIG1heSBnbyBhd2F5IGluIHRoZSBmdXR1cmUuCisgIE9wdGlvbmFsPEFsaWFzUmVzdWx0PiBnZXRPcHRpbWl6ZWRBY2Nlc3NUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBPcHRpbWl6ZWRBY2Nlc3NBbGlhczsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVzZXQgdGhlIElEIG9mIHdoYXQgdGhpcyBNZW1vcnlVc2Ugd2FzIG9wdGltaXplZCB0bywgY2F1c2luZyBpdCB0bworICAvLy8gYmUgcmV3YWxrZWQgYnkgdGhlIHdhbGtlciBpZiBuZWNlc3NhcnkuCisgIC8vLyBUaGlzIHJlYWxseSBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGVzdHMuCisgIGlubGluZSB2b2lkIHJlc2V0T3B0aW1pemVkKCk7CisKK3Byb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIE1lbW9yeVNTQTsKKyAgZnJpZW5kIGNsYXNzIE1lbW9yeVNTQVVwZGF0ZXI7CisKKyAgTWVtb3J5VXNlT3JEZWYoTExWTUNvbnRleHQgJkMsIE1lbW9yeUFjY2VzcyAqRE1BLCB1bnNpZ25lZCBWdHksCisgICAgICAgICAgICAgICAgIERlbGV0ZVZhbHVlVHkgRGVsZXRlVmFsdWUsIEluc3RydWN0aW9uICpNSSwgQmFzaWNCbG9jayAqQkIpCisgICAgICA6IE1lbW9yeUFjY2VzcyhDLCBWdHksIERlbGV0ZVZhbHVlLCBCQiwgMSksIE1lbW9yeUluc3RydWN0aW9uKE1JKSwKKyAgICAgICAgT3B0aW1pemVkQWNjZXNzQWxpYXMoTWF5QWxpYXMpIHsKKyAgICBzZXREZWZpbmluZ0FjY2VzcyhETUEpOworICB9CisKKyAgLy8gVXNlIGRlbGV0ZVZhbHVlKCkgdG8gZGVsZXRlIGEgZ2VuZXJpYyBNZW1vcnlVc2VPckRlZi4KKyAgfk1lbW9yeVVzZU9yRGVmKCkgPSBkZWZhdWx0OworCisgIHZvaWQgc2V0T3B0aW1pemVkQWNjZXNzVHlwZShPcHRpb25hbDxBbGlhc1Jlc3VsdD4gQVIpIHsKKyAgICBPcHRpbWl6ZWRBY2Nlc3NBbGlhcyA9IEFSOworICB9CisKKyAgdm9pZCBzZXREZWZpbmluZ0FjY2VzcyhNZW1vcnlBY2Nlc3MgKkRNQSwgYm9vbCBPcHRpbWl6ZWQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxBbGlhc1Jlc3VsdD4gQVIgPSBNYXlBbGlhcykgeworICAgIGlmICghT3B0aW1pemVkKSB7CisgICAgICBzZXRPcGVyYW5kKDAsIERNQSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHNldE9wdGltaXplZChETUEpOworICAgIHNldE9wdGltaXplZEFjY2Vzc1R5cGUoQVIpOworICB9CisKK3ByaXZhdGU6CisgIEluc3RydWN0aW9uICpNZW1vcnlJbnN0cnVjdGlvbjsKKyAgT3B0aW9uYWw8QWxpYXNSZXN1bHQ+IE9wdGltaXplZEFjY2Vzc0FsaWFzOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPE1lbW9yeVVzZU9yRGVmPgorICAgIDogcHVibGljIEZpeGVkTnVtT3BlcmFuZFRyYWl0czxNZW1vcnlVc2VPckRlZiwgMT4ge307CitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoTWVtb3J5VXNlT3JEZWYsIE1lbW9yeUFjY2VzcykKKworLy8vIFxicmllZiBSZXByZXNlbnRzIHJlYWQtb25seSBhY2Nlc3NlcyB0byBtZW1vcnkKKy8vLworLy8vIEluIHBhcnRpY3VsYXIsIHRoZSBzZXQgb2YgSW5zdHJ1Y3Rpb25zIHRoYXQgd2lsbCBiZSByZXByZXNlbnRlZCBieQorLy8vIE1lbW9yeVVzZSdzIGlzIGV4YWN0bHkgdGhlIHNldCBvZiBJbnN0cnVjdGlvbnMgZm9yIHdoaWNoCisvLy8gQWxpYXNBbmFseXNpczo6Z2V0TW9kUmVmSW5mbyByZXR1cm5zICJSZWYiLgorY2xhc3MgTWVtb3J5VXNlIGZpbmFsIDogcHVibGljIE1lbW9yeVVzZU9yRGVmIHsKK3B1YmxpYzoKKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhNZW1vcnlBY2Nlc3MpOworCisgIE1lbW9yeVVzZShMTFZNQ29udGV4dCAmQywgTWVtb3J5QWNjZXNzICpETUEsIEluc3RydWN0aW9uICpNSSwgQmFzaWNCbG9jayAqQkIpCisgICAgICA6IE1lbW9yeVVzZU9yRGVmKEMsIERNQSwgTWVtb3J5VXNlVmFsLCBkZWxldGVNZSwgTUksIEJCKSB7fQorCisgIC8vIGFsbG9jYXRlIHNwYWNlIGZvciBleGFjdGx5IG9uZSBvcGVyYW5kCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeyByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDEpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqTUEpIHsKKyAgICByZXR1cm4gTUEtPmdldFZhbHVlSUQoKSA9PSBNZW1vcnlVc2VWYWw7CisgIH0KKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgdm9pZCBzZXRPcHRpbWl6ZWQoTWVtb3J5QWNjZXNzICpETUEpIHsKKyAgICBPcHRpbWl6ZWRJRCA9IERNQS0+Z2V0SUQoKTsKKyAgICBzZXRPcGVyYW5kKDAsIERNQSk7CisgIH0KKworICBib29sIGlzT3B0aW1pemVkKCkgY29uc3QgeworICAgIHJldHVybiBnZXREZWZpbmluZ0FjY2VzcygpICYmIE9wdGltaXplZElEID09IGdldERlZmluaW5nQWNjZXNzKCktPmdldElEKCk7CisgIH0KKworICBNZW1vcnlBY2Nlc3MgKmdldE9wdGltaXplZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RGVmaW5pbmdBY2Nlc3MoKTsKKyAgfQorCisgIHZvaWQgcmVzZXRPcHRpbWl6ZWQoKSB7CisgICAgT3B0aW1pemVkSUQgPSBJTlZBTElEX01FTU9SWUFDQ0VTU19JRDsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBNZW1vcnlTU0E7CisKK3ByaXZhdGU6CisgIHN0YXRpYyB2b2lkIGRlbGV0ZU1lKERlcml2ZWRVc2VyICpTZWxmKTsKKworICB1bnNpZ25lZCBPcHRpbWl6ZWRJRCA9IElOVkFMSURfTUVNT1JZQUNDRVNTX0lEOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPE1lbW9yeVVzZT4gOiBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPE1lbW9yeVVzZSwgMT4ge307CitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoTWVtb3J5VXNlLCBNZW1vcnlBY2Nlc3MpCisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIHJlYWQtd3JpdGUgYWNjZXNzIHRvIG1lbW9yeSwgd2hldGhlciBpdCBpcyBhIG11c3QtYWxpYXMsCisvLy8gb3IgYSBtYXktYWxpYXMuCisvLy8KKy8vLyBJbiBwYXJ0aWN1bGFyLCB0aGUgc2V0IG9mIEluc3RydWN0aW9ucyB0aGF0IHdpbGwgYmUgcmVwcmVzZW50ZWQgYnkKKy8vLyBNZW1vcnlEZWYncyBpcyBleGFjdGx5IHRoZSBzZXQgb2YgSW5zdHJ1Y3Rpb25zIGZvciB3aGljaAorLy8vIEFsaWFzQW5hbHlzaXM6OmdldE1vZFJlZkluZm8gcmV0dXJucyAiTW9kIiBvciAiTW9kUmVmIi4KKy8vLyBOb3RlIHRoYXQsIGluIG9yZGVyIHRvIHByb3ZpZGUgZGVmLWRlZiBjaGFpbnMsIGFsbCBkZWZzIGFsc28gaGF2ZSBhIHVzZQorLy8vIGFzc29jaWF0ZWQgd2l0aCB0aGVtLiBUaGlzIHVzZSBwb2ludHMgdG8gdGhlIG5lYXJlc3QgcmVhY2hpbmcKKy8vLyBNZW1vcnlEZWYvTWVtb3J5UGhpLgorY2xhc3MgTWVtb3J5RGVmIGZpbmFsIDogcHVibGljIE1lbW9yeVVzZU9yRGVmIHsKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIE1lbW9yeVNTQTsKKworICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKE1lbW9yeUFjY2Vzcyk7CisKKyAgTWVtb3J5RGVmKExMVk1Db250ZXh0ICZDLCBNZW1vcnlBY2Nlc3MgKkRNQSwgSW5zdHJ1Y3Rpb24gKk1JLCBCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgIHVuc2lnbmVkIFZlcikKKyAgICAgIDogTWVtb3J5VXNlT3JEZWYoQywgRE1BLCBNZW1vcnlEZWZWYWwsIGRlbGV0ZU1lLCBNSSwgQkIpLCBJRChWZXIpIHt9CisKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgb25lIG9wZXJhbmQKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSB7IHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMSk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpNQSkgeworICAgIHJldHVybiBNQS0+Z2V0VmFsdWVJRCgpID09IE1lbW9yeURlZlZhbDsKKyAgfQorCisgIHZvaWQgc2V0T3B0aW1pemVkKE1lbW9yeUFjY2VzcyAqTUEpIHsKKyAgICBPcHRpbWl6ZWQgPSBNQTsKKyAgICBPcHRpbWl6ZWRJRCA9IGdldERlZmluaW5nQWNjZXNzKCktPmdldElEKCk7CisgIH0KKworICBNZW1vcnlBY2Nlc3MgKmdldE9wdGltaXplZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPE1lbW9yeUFjY2Vzcz4oT3B0aW1pemVkKTsKKyAgfQorCisgIGJvb2wgaXNPcHRpbWl6ZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wdGltaXplZCgpICYmIGdldERlZmluaW5nQWNjZXNzKCkgJiYKKyAgICAgICAgICAgT3B0aW1pemVkSUQgPT0gZ2V0RGVmaW5pbmdBY2Nlc3MoKS0+Z2V0SUQoKTsKKyAgfQorCisgIHZvaWQgcmVzZXRPcHRpbWl6ZWQoKSB7CisgICAgT3B0aW1pemVkSUQgPSBJTlZBTElEX01FTU9SWUFDQ0VTU19JRDsKKyAgfQorCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICB1bnNpZ25lZCBnZXRJRCgpIGNvbnN0IHsgcmV0dXJuIElEOyB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyB2b2lkIGRlbGV0ZU1lKERlcml2ZWRVc2VyICpTZWxmKTsKKworICBjb25zdCB1bnNpZ25lZCBJRDsKKyAgdW5zaWduZWQgT3B0aW1pemVkSUQgPSBJTlZBTElEX01FTU9SWUFDQ0VTU19JRDsKKyAgV2Vha1ZIIE9wdGltaXplZDsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxNZW1vcnlEZWY+IDogcHVibGljIEZpeGVkTnVtT3BlcmFuZFRyYWl0czxNZW1vcnlEZWYsIDE+IHt9OworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKE1lbW9yeURlZiwgTWVtb3J5QWNjZXNzKQorCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgcGhpIG5vZGVzIGZvciBtZW1vcnkgYWNjZXNzZXMuCisvLy8KKy8vLyBUaGVzZSBoYXZlIHRoZSBzYW1lIHNlbWFudGljIGFzIHJlZ3VsYXIgcGhpIG5vZGVzLCB3aXRoIHRoZSBleGNlcHRpb24gdGhhdAorLy8vIG9ubHkgb25lIHBoaSB3aWxsIGV2ZXIgZXhpc3QgaW4gYSBnaXZlbiBiYXNpYyBibG9jay4KKy8vLyBHdWFyYW50ZWVpbmcgb25lIHBoaSBwZXIgYmxvY2sgbWVhbnMgZ3VhcmFudGVlaW5nIHRoZXJlIGlzIG9ubHkgZXZlciBvbmUKKy8vLyB2YWxpZCByZWFjaGluZyBNZW1vcnlEZWYvTWVtb3J5UEhJIGFsb25nIGVhY2ggcGF0aCB0byB0aGUgcGhpIG5vZGUuCisvLy8gVGhpcyBpcyBlbnN1cmVkIGJ5IG5vdCBhbGxvd2luZyBkaXNhbWJpZ3VhdGlvbiBvZiB0aGUgUkhTIG9mIGEgTWVtb3J5RGVmIG9yCisvLy8gYSBNZW1vcnlQaGkncyBvcGVyYW5kcy4KKy8vLyBUaGF0IGlzLCBnaXZlbgorLy8vIGlmIChhKSB7CisvLy8gICBzdG9yZSAlYQorLy8vICAgc3RvcmUgJWIKKy8vLyB9CisvLy8gaXQgKm11c3QqIGJlIHRyYW5zZm9ybWVkIGludG8KKy8vLyBpZiAoYSkgeworLy8vICAgIDEgPSBNZW1vcnlEZWYobGl2ZU9uRW50cnkpCisvLy8gICAgc3RvcmUgJWEKKy8vLyAgICAyID0gTWVtb3J5RGVmKDEpCisvLy8gICAgc3RvcmUgJWIKKy8vLyB9CisvLy8gYW5kICpub3QqCisvLy8gaWYgKGEpIHsKKy8vLyAgICAxID0gTWVtb3J5RGVmKGxpdmVPbkVudHJ5KQorLy8vICAgIHN0b3JlICVhCisvLy8gICAgMiA9IE1lbW9yeURlZihsaXZlT25FbnRyeSkKKy8vLyAgICBzdG9yZSAlYgorLy8vIH0KKy8vLyBldmVuIGlmIHRoZSB0d28gc3RvcmVzIGRvIG5vdCBjb25mbGljdC4gT3RoZXJ3aXNlLCBib3RoIDEgYW5kIDIgcmVhY2ggdGhlCisvLy8gZW5kIG9mIHRoZSBicmFuY2gsIGFuZCBpZiB0aGVyZSBhcmUgbm90IHR3byBwaGkgbm9kZXMsIG9uZSB3aWxsIGJlCisvLy8gZGlzY29ubmVjdGVkIGNvbXBsZXRlbHkgZnJvbSB0aGUgU1NBIGdyYXBoIGJlbG93IHRoYXQgcG9pbnQuCisvLy8gQmVjYXVzZSBNZW1vcnlVc2UncyBkbyBub3QgZ2VuZXJhdGUgbmV3IGRlZmluaXRpb25zLCB0aGV5IGRvIG5vdCBoYXZlIHRoaXMKKy8vLyBpc3N1ZS4KK2NsYXNzIE1lbW9yeVBoaSBmaW5hbCA6IHB1YmxpYyBNZW1vcnlBY2Nlc3MgeworICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSB6ZXJvIG9wZXJhbmRzCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeyByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMpOyB9CisKK3B1YmxpYzoKKyAgLy8vIFByb3ZpZGUgZmFzdCBvcGVyYW5kIGFjY2Vzc29ycworICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKE1lbW9yeUFjY2Vzcyk7CisKKyAgTWVtb3J5UGhpKExMVk1Db250ZXh0ICZDLCBCYXNpY0Jsb2NrICpCQiwgdW5zaWduZWQgVmVyLCB1bnNpZ25lZCBOdW1QcmVkcyA9IDApCisgICAgICA6IE1lbW9yeUFjY2VzcyhDLCBNZW1vcnlQaGlWYWwsIGRlbGV0ZU1lLCBCQiwgMCksIElEKFZlciksCisgICAgICAgIFJlc2VydmVkU3BhY2UoTnVtUHJlZHMpIHsKKyAgICBhbGxvY0h1bmdvZmZVc2VzKFJlc2VydmVkU3BhY2UpOworICB9CisKKyAgLy8gQmxvY2sgaXRlcmF0b3IgaW50ZXJmYWNlLiBUaGlzIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbGlzdCBvZiBpbmNvbWluZworICAvLyBiYXNpYyBibG9ja3MsIHdoaWNoIHBhcmFsbGVscyB0aGUgbGlzdCBvZiBpbmNvbWluZyB2YWx1ZXMuCisgIHVzaW5nIGJsb2NrX2l0ZXJhdG9yID0gQmFzaWNCbG9jayAqKjsKKyAgdXNpbmcgY29uc3RfYmxvY2tfaXRlcmF0b3IgPSBCYXNpY0Jsb2NrICpjb25zdCAqOworCisgIGJsb2NrX2l0ZXJhdG9yIGJsb2NrX2JlZ2luKCkgeworICAgIGF1dG8gKlJlZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8VXNlOjpVc2VyUmVmICo+KG9wX2JlZ2luKCkgKyBSZXNlcnZlZFNwYWNlKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxibG9ja19pdGVyYXRvcj4oUmVmICsgMSk7CisgIH0KKworICBjb25zdF9ibG9ja19pdGVyYXRvciBibG9ja19iZWdpbigpIGNvbnN0IHsKKyAgICBjb25zdCBhdXRvICpSZWYgPQorICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFVzZTo6VXNlclJlZiAqPihvcF9iZWdpbigpICsgUmVzZXJ2ZWRTcGFjZSk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3RfYmxvY2tfaXRlcmF0b3I+KFJlZiArIDEpOworICB9CisKKyAgYmxvY2tfaXRlcmF0b3IgYmxvY2tfZW5kKCkgeyByZXR1cm4gYmxvY2tfYmVnaW4oKSArIGdldE51bU9wZXJhbmRzKCk7IH0KKworICBjb25zdF9ibG9ja19pdGVyYXRvciBibG9ja19lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGJsb2NrX2JlZ2luKCkgKyBnZXROdW1PcGVyYW5kcygpOworICB9CisKKyAgaXRlcmF0b3JfcmFuZ2U8YmxvY2tfaXRlcmF0b3I+IGJsb2NrcygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShibG9ja19iZWdpbigpLCBibG9ja19lbmQoKSk7CisgIH0KKworICBpdGVyYXRvcl9yYW5nZTxjb25zdF9ibG9ja19pdGVyYXRvcj4gYmxvY2tzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGJsb2NrX2JlZ2luKCksIGJsb2NrX2VuZCgpKTsKKyAgfQorCisgIG9wX3JhbmdlIGluY29taW5nX3ZhbHVlcygpIHsgcmV0dXJuIG9wZXJhbmRzKCk7IH0KKworICBjb25zdF9vcF9yYW5nZSBpbmNvbWluZ192YWx1ZXMoKSBjb25zdCB7IHJldHVybiBvcGVyYW5kcygpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBpbmNvbWluZyBlZGdlcworICB1bnNpZ25lZCBnZXROdW1JbmNvbWluZ1ZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIGdldE51bU9wZXJhbmRzKCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiBpbmNvbWluZyB2YWx1ZSBudW1iZXIgeAorICBNZW1vcnlBY2Nlc3MgKmdldEluY29taW5nVmFsdWUodW5zaWduZWQgSSkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZChJKTsgfQorICB2b2lkIHNldEluY29taW5nVmFsdWUodW5zaWduZWQgSSwgTWVtb3J5QWNjZXNzICpWKSB7CisgICAgYXNzZXJ0KFYgJiYgIlBISSBub2RlIGdvdCBhIG51bGwgdmFsdWUhIik7CisgICAgc2V0T3BlcmFuZChJLCBWKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRPcGVyYW5kTnVtRm9ySW5jb21pbmdWYWx1ZSh1bnNpZ25lZCBJKSB7IHJldHVybiBJOyB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRJbmNvbWluZ1ZhbHVlTnVtRm9yT3BlcmFuZCh1bnNpZ25lZCBJKSB7IHJldHVybiBJOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gaW5jb21pbmcgYmFzaWMgYmxvY2sgbnVtYmVyIEBwIGkuCisgIEJhc2ljQmxvY2sgKmdldEluY29taW5nQmxvY2sodW5zaWduZWQgSSkgY29uc3QgeyByZXR1cm4gYmxvY2tfYmVnaW4oKVtJXTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGluY29taW5nIGJhc2ljIGJsb2NrIGNvcnJlc3BvbmRpbmcKKyAgLy8vIHRvIGFuIG9wZXJhbmQgb2YgdGhlIFBISS4KKyAgQmFzaWNCbG9jayAqZ2V0SW5jb21pbmdCbG9jayhjb25zdCBVc2UgJlUpIGNvbnN0IHsKKyAgICBhc3NlcnQodGhpcyA9PSBVLmdldFVzZXIoKSAmJiAiSXRlcmF0b3IgZG9lc24ndCBwb2ludCB0byBQSEkncyBVc2VzPyIpOworICAgIHJldHVybiBnZXRJbmNvbWluZ0Jsb2NrKHVuc2lnbmVkKCZVIC0gb3BfYmVnaW4oKSkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gaW5jb21pbmcgYmFzaWMgYmxvY2sgY29ycmVzcG9uZGluZworICAvLy8gdG8gdmFsdWUgdXNlIGl0ZXJhdG9yLgorICBCYXNpY0Jsb2NrICpnZXRJbmNvbWluZ0Jsb2NrKE1lbW9yeUFjY2Vzczo6Y29uc3RfdXNlcl9pdGVyYXRvciBJKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEluY29taW5nQmxvY2soSS5nZXRVc2UoKSk7CisgIH0KKworICB2b2lkIHNldEluY29taW5nQmxvY2sodW5zaWduZWQgSSwgQmFzaWNCbG9jayAqQkIpIHsKKyAgICBhc3NlcnQoQkIgJiYgIlBISSBub2RlIGdvdCBhIG51bGwgYmFzaWMgYmxvY2shIik7CisgICAgYmxvY2tfYmVnaW4oKVtJXSA9IEJCOworICB9CisKKyAgLy8vIFxicmllZiBBZGQgYW4gaW5jb21pbmcgdmFsdWUgdG8gdGhlIGVuZCBvZiB0aGUgUEhJIGxpc3QKKyAgdm9pZCBhZGRJbmNvbWluZyhNZW1vcnlBY2Nlc3MgKlYsIEJhc2ljQmxvY2sgKkJCKSB7CisgICAgaWYgKGdldE51bU9wZXJhbmRzKCkgPT0gUmVzZXJ2ZWRTcGFjZSkKKyAgICAgIGdyb3dPcGVyYW5kcygpOyAvLyBHZXQgbW9yZSBzcGFjZSEKKyAgICAvLyBJbml0aWFsaXplIHNvbWUgbmV3IG9wZXJhbmRzLgorICAgIHNldE51bUh1bmdPZmZVc2VPcGVyYW5kcyhnZXROdW1PcGVyYW5kcygpICsgMSk7CisgICAgc2V0SW5jb21pbmdWYWx1ZShnZXROdW1PcGVyYW5kcygpIC0gMSwgVik7CisgICAgc2V0SW5jb21pbmdCbG9jayhnZXROdW1PcGVyYW5kcygpIC0gMSwgQkIpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGZpcnN0IGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgYmFzaWMKKyAgLy8vIGJsb2NrIGluIHRoZSB2YWx1ZSBsaXN0IGZvciB0aGlzIFBISS4gIFJldHVybnMgLTEgaWYgbm8gaW5zdGFuY2UuCisgIGludCBnZXRCYXNpY0Jsb2NrSW5kZXgoY29uc3QgQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIEkgPSAwLCBFID0gZ2V0TnVtT3BlcmFuZHMoKTsgSSAhPSBFOyArK0kpCisgICAgICBpZiAoYmxvY2tfYmVnaW4oKVtJXSA9PSBCQikKKyAgICAgICAgcmV0dXJuIEk7CisgICAgcmV0dXJuIC0xOworICB9CisKKyAgVmFsdWUgKmdldEluY29taW5nVmFsdWVGb3JCbG9jayhjb25zdCBCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIGludCBJZHggPSBnZXRCYXNpY0Jsb2NrSW5kZXgoQkIpOworICAgIGFzc2VydChJZHggPj0gMCAmJiAiSW52YWxpZCBiYXNpYyBibG9jayBhcmd1bWVudCEiKTsKKyAgICByZXR1cm4gZ2V0SW5jb21pbmdWYWx1ZShJZHgpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gTWVtb3J5UGhpVmFsOworICB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIHVuc2lnbmVkIGdldElEKCkgY29uc3QgeyByZXR1cm4gSUQ7IH0KKworcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgTWVtb3J5U1NBOworCisgIC8vLyBcYnJpZWYgdGhpcyBpcyBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gdGhlIGdlbmVyaWMKKyAgLy8vIFVzZXI6OmFsbG9jSHVuZ29mZlVzZXMsIGJlY2F1c2Ugd2UgaGF2ZSB0byBhbGxvY2F0ZSBVc2VzIGZvciB0aGUgaW5jb21pbmcKKyAgLy8vIHZhbHVlcyBhbmQgcG9pbnRlcnMgdG8gdGhlIGluY29taW5nIGJsb2NrcywgYWxsIGluIG9uZSBhbGxvY2F0aW9uLgorICB2b2lkIGFsbG9jSHVuZ29mZlVzZXModW5zaWduZWQgTikgeworICAgIFVzZXI6OmFsbG9jSHVuZ29mZlVzZXMoTiwgLyogSXNQaGkgKi8gdHJ1ZSk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8gRm9yIGRlYnVnZ2luZyBvbmx5CisgIGNvbnN0IHVuc2lnbmVkIElEOworICB1bnNpZ25lZCBSZXNlcnZlZFNwYWNlOworCisgIC8vLyBcYnJpZWYgVGhpcyBncm93cyB0aGUgb3BlcmFuZCBsaXN0IGluIHJlc3BvbnNlIHRvIGEgcHVzaF9iYWNrIHN0eWxlIG9mCisgIC8vLyBvcGVyYXRpb24uICBUaGlzIGdyb3dzIHRoZSBudW1iZXIgb2Ygb3BzIGJ5IDEuNSB0aW1lcy4KKyAgdm9pZCBncm93T3BlcmFuZHMoKSB7CisgICAgdW5zaWduZWQgRSA9IGdldE51bU9wZXJhbmRzKCk7CisgICAgLy8gMiBvcCBQSEkgbm9kZXMgYXJlIFZFUlkgY29tbW9uLCBzbyByZXNlcnZlIGF0IGxlYXN0IGVub3VnaCBmb3IgdGhhdC4KKyAgICBSZXNlcnZlZFNwYWNlID0gc3RkOjptYXgoRSArIEUgLyAyLCAydSk7CisgICAgZ3Jvd0h1bmdvZmZVc2VzKFJlc2VydmVkU3BhY2UsIC8qIElzUGhpICovIHRydWUpOworICB9CisKKyAgc3RhdGljIHZvaWQgZGVsZXRlTWUoRGVyaXZlZFVzZXIgKlNlbGYpOworfTsKKworaW5saW5lIHVuc2lnbmVkIE1lbW9yeUFjY2Vzczo6Z2V0SUQoKSBjb25zdCB7CisgIGFzc2VydCgoaXNhPE1lbW9yeURlZj4odGhpcykgfHwgaXNhPE1lbW9yeVBoaT4odGhpcykpICYmCisgICAgICAgICAib25seSBtZW1vcnkgZGVmcyBhbmQgcGhpcyBoYXZlIGlkcyIpOworICBpZiAoY29uc3QgYXV0byAqTUQgPSBkeW5fY2FzdDxNZW1vcnlEZWY+KHRoaXMpKQorICAgIHJldHVybiBNRC0+Z2V0SUQoKTsKKyAgcmV0dXJuIGNhc3Q8TWVtb3J5UGhpPih0aGlzKS0+Z2V0SUQoKTsKK30KKworaW5saW5lIGJvb2wgTWVtb3J5VXNlT3JEZWY6OmlzT3B0aW1pemVkKCkgY29uc3QgeworICBpZiAoY29uc3QgYXV0byAqTUQgPSBkeW5fY2FzdDxNZW1vcnlEZWY+KHRoaXMpKQorICAgIHJldHVybiBNRC0+aXNPcHRpbWl6ZWQoKTsKKyAgcmV0dXJuIGNhc3Q8TWVtb3J5VXNlPih0aGlzKS0+aXNPcHRpbWl6ZWQoKTsKK30KKworaW5saW5lIE1lbW9yeUFjY2VzcyAqTWVtb3J5VXNlT3JEZWY6OmdldE9wdGltaXplZCgpIGNvbnN0IHsKKyAgaWYgKGNvbnN0IGF1dG8gKk1EID0gZHluX2Nhc3Q8TWVtb3J5RGVmPih0aGlzKSkKKyAgICByZXR1cm4gTUQtPmdldE9wdGltaXplZCgpOworICByZXR1cm4gY2FzdDxNZW1vcnlVc2U+KHRoaXMpLT5nZXRPcHRpbWl6ZWQoKTsKK30KKworaW5saW5lIHZvaWQgTWVtb3J5VXNlT3JEZWY6OnNldE9wdGltaXplZChNZW1vcnlBY2Nlc3MgKk1BKSB7CisgIGlmIChhdXRvICpNRCA9IGR5bl9jYXN0PE1lbW9yeURlZj4odGhpcykpCisgICAgTUQtPnNldE9wdGltaXplZChNQSk7CisgIGVsc2UKKyAgICBjYXN0PE1lbW9yeVVzZT4odGhpcyktPnNldE9wdGltaXplZChNQSk7Cit9CisKK2lubGluZSB2b2lkIE1lbW9yeVVzZU9yRGVmOjpyZXNldE9wdGltaXplZCgpIHsKKyAgaWYgKGF1dG8gKk1EID0gZHluX2Nhc3Q8TWVtb3J5RGVmPih0aGlzKSkKKyAgICBNRC0+cmVzZXRPcHRpbWl6ZWQoKTsKKyAgZWxzZQorICAgIGNhc3Q8TWVtb3J5VXNlPih0aGlzKS0+cmVzZXRPcHRpbWl6ZWQoKTsKK30KKwordGVtcGxhdGUgPD4gc3RydWN0IE9wZXJhbmRUcmFpdHM8TWVtb3J5UGhpPiA6IHB1YmxpYyBIdW5nb2ZmT3BlcmFuZFRyYWl0czwyPiB7fTsKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhNZW1vcnlQaGksIE1lbW9yeUFjY2VzcykKKworLy8vIFxicmllZiBFbmNhcHN1bGF0ZXMgTWVtb3J5U1NBLCBpbmNsdWRpbmcgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIG1lbW9yeQorLy8vIGFjY2Vzc2VzLgorY2xhc3MgTWVtb3J5U1NBIHsKK3B1YmxpYzoKKyAgTWVtb3J5U1NBKEZ1bmN0aW9uICYsIEFsaWFzQW5hbHlzaXMgKiwgRG9taW5hdG9yVHJlZSAqKTsKKyAgfk1lbW9yeVNTQSgpOworCisgIE1lbW9yeVNTQVdhbGtlciAqZ2V0V2Fsa2VyKCk7CisKKyAgLy8vIFxicmllZiBHaXZlbiBhIG1lbW9yeSBNb2QvUmVmJ2luZyBpbnN0cnVjdGlvbiwgZ2V0IHRoZSBNZW1vcnlTU0EKKyAgLy8vIGFjY2VzcyBhc3NvY2lhdGVkIHdpdGggaXQuIElmIHBhc3NlZCBhIGJhc2ljIGJsb2NrIGdldHMgdGhlIG1lbW9yeSBwaGkKKyAgLy8vIG5vZGUgdGhhdCBleGlzdHMgZm9yIHRoYXQgYmxvY2ssIGlmIHRoZXJlIGlzIG9uZS4gT3RoZXJ3aXNlLCB0aGlzIHdpbGwgZ2V0CisgIC8vLyBhIE1lbW9yeVVzZU9yRGVmLgorICBNZW1vcnlVc2VPckRlZiAqZ2V0TWVtb3J5QWNjZXNzKGNvbnN0IEluc3RydWN0aW9uICopIGNvbnN0OworICBNZW1vcnlQaGkgKmdldE1lbW9yeUFjY2Vzcyhjb25zdCBCYXNpY0Jsb2NrICpCQikgY29uc3Q7CisKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBccCBNQSByZXByZXNlbnRzIHRoZSBsaXZlIG9uIGVudHJ5IHZhbHVlCisgIC8vLworICAvLy8gTG9hZHMgYW5kIHN0b3JlcyBmcm9tIHBvaW50ZXIgYXJndW1lbnRzIGFuZCBvdGhlciBnbG9iYWwgdmFsdWVzIG1heSBiZQorICAvLy8gZGVmaW5lZCBieSBtZW1vcnkgb3BlcmF0aW9ucyB0aGF0IGRvIG5vdCBvY2N1ciBpbiB0aGUgY3VycmVudCBmdW5jdGlvbiwgc28KKyAgLy8vIHRoZXkgbWF5IGJlIGxpdmUgb24gZW50cnkgdG8gdGhlIGZ1bmN0aW9uLiBNZW1vcnlTU0EgcmVwcmVzZW50cyBzdWNoCisgIC8vLyBtZW1vcnkgc3RhdGUgYnkgdGhlIGxpdmUgb24gZW50cnkgZGVmaW5pdGlvbiwgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBvY2N1cgorICAvLy8gYmVmb3JlIGFueSBvdGhlciBtZW1vcnkgYWNjZXNzIGluIHRoZSBmdW5jdGlvbi4KKyAgaW5saW5lIGJvb2wgaXNMaXZlT25FbnRyeURlZihjb25zdCBNZW1vcnlBY2Nlc3MgKk1BKSBjb25zdCB7CisgICAgcmV0dXJuIE1BID09IExpdmVPbkVudHJ5RGVmLmdldCgpOworICB9CisKKyAgaW5saW5lIE1lbW9yeUFjY2VzcyAqZ2V0TGl2ZU9uRW50cnlEZWYoKSBjb25zdCB7CisgICAgcmV0dXJuIExpdmVPbkVudHJ5RGVmLmdldCgpOworICB9CisKKyAgLy8gU2FkbHksIGlwbGlzdHMsIGJ5IGRlZmF1bHQsIG93bnMgYW5kIGRlbGV0ZXMgcG9pbnRlcnMgYWRkZWQgdG8gdGhlCisgIC8vIGxpc3QuIEl0J3Mgbm90IGN1cnJlbnRseSBwb3NzaWJsZSB0byBoYXZlIHR3byBpcGxpc3RzIGZvciB0aGUgc2FtZSB0eXBlLAorICAvLyB3aGVyZSBvbmUgb3ducyB0aGUgcG9pbnRlcnMsIGFuZCBvbmUgZG9lcyBub3QuIFRoaXMgaXMgYmVjYXVzZSB0aGUgdHJhaXRzCisgIC8vIGFyZSBwZXItdHlwZSwgbm90IHBlci10YWcuICBJZiB0aGlzIGV2ZXIgY2hhbmdlcywgd2Ugc2hvdWxkIG1ha2UgdGhlCisgIC8vIERlZkxpc3QgYW4gaXBsaXN0LgorICB1c2luZyBBY2Nlc3NMaXN0ID0gaXBsaXN0PE1lbW9yeUFjY2VzcywgaWxpc3RfdGFnPE1TU0FIZWxwZXJzOjpBbGxBY2Nlc3NUYWc+PjsKKyAgdXNpbmcgRGVmc0xpc3QgPQorICAgICAgc2ltcGxlX2lsaXN0PE1lbW9yeUFjY2VzcywgaWxpc3RfdGFnPE1TU0FIZWxwZXJzOjpEZWZzT25seVRhZz4+OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBsaXN0IG9mIE1lbW9yeUFjY2VzcydzIGZvciBhIGdpdmVuIGJhc2ljIGJsb2NrLgorICAvLy8KKyAgLy8vIFRoaXMgbGlzdCBpcyBub3QgbW9kaWZpYWJsZSBieSB0aGUgdXNlci4KKyAgY29uc3QgQWNjZXNzTGlzdCAqZ2V0QmxvY2tBY2Nlc3Nlcyhjb25zdCBCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIHJldHVybiBnZXRXcml0YWJsZUJsb2NrQWNjZXNzZXMoQkIpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGxpc3Qgb2YgTWVtb3J5RGVmJ3MgYW5kIE1lbW9yeVBoaSdzIGZvciBhIGdpdmVuIGJhc2ljCisgIC8vLyBibG9jay4KKyAgLy8vCisgIC8vLyBUaGlzIGxpc3QgaXMgbm90IG1vZGlmaWFibGUgYnkgdGhlIHVzZXIuCisgIGNvbnN0IERlZnNMaXN0ICpnZXRCbG9ja0RlZnMoY29uc3QgQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0V3JpdGFibGVCbG9ja0RlZnMoQkIpOworICB9CisKKyAgLy8vIFxicmllZiBHaXZlbiB0d28gbWVtb3J5IGFjY2Vzc2VzIGluIHRoZSBzYW1lIGJhc2ljIGJsb2NrLCBkZXRlcm1pbmUKKyAgLy8vIHdoZXRoZXIgTWVtb3J5QWNjZXNzIFxwIEEgZG9taW5hdGVzIE1lbW9yeUFjY2VzcyBccCBCLgorICBib29sIGxvY2FsbHlEb21pbmF0ZXMoY29uc3QgTWVtb3J5QWNjZXNzICpBLCBjb25zdCBNZW1vcnlBY2Nlc3MgKkIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2l2ZW4gdHdvIG1lbW9yeSBhY2Nlc3NlcyBpbiBwb3RlbnRpYWxseSBkaWZmZXJlbnQgYmxvY2tzLAorICAvLy8gZGV0ZXJtaW5lIHdoZXRoZXIgTWVtb3J5QWNjZXNzIFxwIEEgZG9taW5hdGVzIE1lbW9yeUFjY2VzcyBccCBCLgorICBib29sIGRvbWluYXRlcyhjb25zdCBNZW1vcnlBY2Nlc3MgKkEsIGNvbnN0IE1lbW9yeUFjY2VzcyAqQikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHaXZlbiBhIE1lbW9yeUFjY2VzcyBhbmQgYSBVc2UsIGRldGVybWluZSB3aGV0aGVyIE1lbW9yeUFjY2VzcyBccCBBCisgIC8vLyBkb21pbmF0ZXMgVXNlIFxwIEIuCisgIGJvb2wgZG9taW5hdGVzKGNvbnN0IE1lbW9yeUFjY2VzcyAqQSwgY29uc3QgVXNlICZCKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFZlcmlmeSB0aGF0IE1lbW9yeVNTQSBpcyBzZWxmIGNvbnNpc3RlbnQgKElFIGRlZmluaXRpb25zIGRvbWluYXRlCisgIC8vLyBhbGwgdXNlcywgdXNlcyBhcHBlYXIgaW4gdGhlIHJpZ2h0IHBsYWNlcykuICBUaGlzIGlzIHVzZWQgYnkgdW5pdCB0ZXN0cy4KKyAgdm9pZCB2ZXJpZnlNZW1vcnlTU0EoKSBjb25zdDsKKworICAvLy8gVXNlZCBpbiB2YXJpb3VzIGluc2VydGlvbiBmdW5jdGlvbnMgdG8gc3BlY2lmeSB3aGV0aGVyIHdlIGFyZSB0YWxraW5nCisgIC8vLyBhYm91dCB0aGUgYmVnaW5uaW5nIG9yIGVuZCBvZiBhIGJsb2NrLgorICBlbnVtIEluc2VydGlvblBsYWNlIHsgQmVnaW5uaW5nLCBFbmQgfTsKKworcHJvdGVjdGVkOgorICAvLyBVc2VkIGJ5IE1lbW9yeSBTU0EgYW5ub3RhdGVyLCBkdW1wZXJzLCBhbmQgd3JhcHBlciBwYXNzCisgIGZyaWVuZCBjbGFzcyBNZW1vcnlTU0FBbm5vdGF0ZWRXcml0ZXI7CisgIGZyaWVuZCBjbGFzcyBNZW1vcnlTU0FQcmludGVyTGVnYWN5UGFzczsKKyAgZnJpZW5kIGNsYXNzIE1lbW9yeVNTQVVwZGF0ZXI7CisKKyAgdm9pZCB2ZXJpZnlEZWZVc2VzKEZ1bmN0aW9uICZGKSBjb25zdDsKKyAgdm9pZCB2ZXJpZnlEb21pbmF0aW9uKEZ1bmN0aW9uICZGKSBjb25zdDsKKyAgdm9pZCB2ZXJpZnlPcmRlcmluZyhGdW5jdGlvbiAmRikgY29uc3Q7CisKKyAgLy8gVGhpcyBpcyB1c2VkIGJ5IHRoZSB1c2Ugb3B0aW1pemVyIGFuZCB1cGRhdGVyLgorICBBY2Nlc3NMaXN0ICpnZXRXcml0YWJsZUJsb2NrQWNjZXNzZXMoY29uc3QgQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICBhdXRvIEl0ID0gUGVyQmxvY2tBY2Nlc3Nlcy5maW5kKEJCKTsKKyAgICByZXR1cm4gSXQgPT0gUGVyQmxvY2tBY2Nlc3Nlcy5lbmQoKSA/IG51bGxwdHIgOiBJdC0+c2Vjb25kLmdldCgpOworICB9CisKKyAgLy8gVGhpcyBpcyB1c2VkIGJ5IHRoZSB1c2Ugb3B0aW1pemVyIGFuZCB1cGRhdGVyLgorICBEZWZzTGlzdCAqZ2V0V3JpdGFibGVCbG9ja0RlZnMoY29uc3QgQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICBhdXRvIEl0ID0gUGVyQmxvY2tEZWZzLmZpbmQoQkIpOworICAgIHJldHVybiBJdCA9PSBQZXJCbG9ja0RlZnMuZW5kKCkgPyBudWxscHRyIDogSXQtPnNlY29uZC5nZXQoKTsKKyAgfQorCisgIC8vIFRoZXNlIGlzIHVzZWQgYnkgdGhlIHVwZGF0ZXIgdG8gcGVyZm9ybSB2YXJpb3VzIGludGVybmFsIE1lbW9yeVNTQQorICAvLyBtYWNoaW5zYXRpb25zLiAgVGhleSBkbyBub3QgYWx3YXlzIGxlYXZlIHRoZSBJUiBpbiBhIGNvcnJlY3Qgc3RhdGUsIGFuZAorICAvLyByZWxpZXMgb24gdGhlIHVwZGF0ZXIgdG8gZml4dXAgd2hhdCBpdCBicmVha3MsIHNvIGl0IGlzIG5vdCBwdWJsaWMuCisKKyAgdm9pZCBtb3ZlVG8oTWVtb3J5VXNlT3JEZWYgKldoYXQsIEJhc2ljQmxvY2sgKkJCLCBBY2Nlc3NMaXN0OjppdGVyYXRvciBXaGVyZSk7CisgIHZvaWQgbW92ZVRvKE1lbW9yeVVzZU9yRGVmICpXaGF0LCBCYXNpY0Jsb2NrICpCQiwgSW5zZXJ0aW9uUGxhY2UgUG9pbnQpOworCisgIC8vIFJlbmFtZSB0aGUgZG9taW5hdG9yIHRyZWUgYnJhbmNoIHJvb3RlZCBhdCBCQi4KKyAgdm9pZCByZW5hbWVQYXNzKEJhc2ljQmxvY2sgKkJCLCBNZW1vcnlBY2Nlc3MgKkluY29taW5nVmFsLAorICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXRJbXBsPEJhc2ljQmxvY2sgKj4gJlZpc2l0ZWQpIHsKKyAgICByZW5hbWVQYXNzKERULT5nZXROb2RlKEJCKSwgSW5jb21pbmdWYWwsIFZpc2l0ZWQsIHRydWUsIHRydWUpOworICB9CisKKyAgdm9pZCByZW1vdmVGcm9tTG9va3VwcyhNZW1vcnlBY2Nlc3MgKik7CisgIHZvaWQgcmVtb3ZlRnJvbUxpc3RzKE1lbW9yeUFjY2VzcyAqLCBib29sIFNob3VsZERlbGV0ZSA9IHRydWUpOworICB2b2lkIGluc2VydEludG9MaXN0c0ZvckJsb2NrKE1lbW9yeUFjY2VzcyAqLCBjb25zdCBCYXNpY0Jsb2NrICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0aW9uUGxhY2UpOworICB2b2lkIGluc2VydEludG9MaXN0c0JlZm9yZShNZW1vcnlBY2Nlc3MgKiwgY29uc3QgQmFzaWNCbG9jayAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBY2Nlc3NMaXN0OjppdGVyYXRvcik7CisgIE1lbW9yeVVzZU9yRGVmICpjcmVhdGVEZWZpbmVkQWNjZXNzKEluc3RydWN0aW9uICosIE1lbW9yeUFjY2VzcyAqKTsKKworcHJpdmF0ZToKKyAgY2xhc3MgQ2FjaGluZ1dhbGtlcjsKKyAgY2xhc3MgT3B0aW1pemVVc2VzOworCisgIENhY2hpbmdXYWxrZXIgKmdldFdhbGtlckltcGwoKTsKKyAgdm9pZCBidWlsZE1lbW9yeVNTQSgpOworICB2b2lkIG9wdGltaXplVXNlcygpOworCisgIHZvaWQgdmVyaWZ5VXNlSW5EZWZzKE1lbW9yeUFjY2VzcyAqLCBNZW1vcnlBY2Nlc3MgKikgY29uc3Q7CisKKyAgdXNpbmcgQWNjZXNzTWFwID0gRGVuc2VNYXA8Y29uc3QgQmFzaWNCbG9jayAqLCBzdGQ6OnVuaXF1ZV9wdHI8QWNjZXNzTGlzdD4+OworICB1c2luZyBEZWZzTWFwID0gRGVuc2VNYXA8Y29uc3QgQmFzaWNCbG9jayAqLCBzdGQ6OnVuaXF1ZV9wdHI8RGVmc0xpc3Q+PjsKKworICB2b2lkCisgIGRldGVybWluZUluc2VydGlvblBvaW50KGNvbnN0IFNtYWxsUHRyU2V0SW1wbDxCYXNpY0Jsb2NrICo+ICZEZWZpbmluZ0Jsb2Nrcyk7CisgIHZvaWQgbWFya1VucmVhY2hhYmxlQXNMaXZlT25FbnRyeShCYXNpY0Jsb2NrICpCQik7CisgIGJvb2wgZG9taW5hdGVzVXNlKGNvbnN0IE1lbW9yeUFjY2VzcyAqLCBjb25zdCBNZW1vcnlBY2Nlc3MgKikgY29uc3Q7CisgIE1lbW9yeVBoaSAqY3JlYXRlTWVtb3J5UGhpKEJhc2ljQmxvY2sgKkJCKTsKKyAgTWVtb3J5VXNlT3JEZWYgKmNyZWF0ZU5ld0FjY2VzcyhJbnN0cnVjdGlvbiAqKTsKKyAgTWVtb3J5QWNjZXNzICpmaW5kRG9taW5hdGluZ0RlZihCYXNpY0Jsb2NrICosIGVudW0gSW5zZXJ0aW9uUGxhY2UpOworICB2b2lkIHBsYWNlUEhJTm9kZXMoY29uc3QgU21hbGxQdHJTZXRJbXBsPEJhc2ljQmxvY2sgKj4gJiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlbnNlTWFwPGNvbnN0IEJhc2ljQmxvY2sgKiwgdW5zaWduZWQgaW50PiAmKTsKKyAgTWVtb3J5QWNjZXNzICpyZW5hbWVCbG9jayhCYXNpY0Jsb2NrICosIE1lbW9yeUFjY2VzcyAqLCBib29sKTsKKyAgdm9pZCByZW5hbWVTdWNjZXNzb3JQaGlzKEJhc2ljQmxvY2sgKiwgTWVtb3J5QWNjZXNzICosIGJvb2wpOworICB2b2lkIHJlbmFtZVBhc3MoRG9tVHJlZU5vZGUgKiwgTWVtb3J5QWNjZXNzICpJbmNvbWluZ1ZhbCwKKyAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0SW1wbDxCYXNpY0Jsb2NrICo+ICZWaXNpdGVkLAorICAgICAgICAgICAgICAgICAgYm9vbCBTa2lwVmlzaXRlZCA9IGZhbHNlLCBib29sIFJlbmFtZUFsbFVzZXMgPSBmYWxzZSk7CisgIEFjY2Vzc0xpc3QgKmdldE9yQ3JlYXRlQWNjZXNzTGlzdChjb25zdCBCYXNpY0Jsb2NrICopOworICBEZWZzTGlzdCAqZ2V0T3JDcmVhdGVEZWZzTGlzdChjb25zdCBCYXNpY0Jsb2NrICopOworICB2b2lkIHJlbnVtYmVyQmxvY2soY29uc3QgQmFzaWNCbG9jayAqKSBjb25zdDsKKyAgQWxpYXNBbmFseXNpcyAqQUE7CisgIERvbWluYXRvclRyZWUgKkRUOworICBGdW5jdGlvbiAmRjsKKworICAvLyBNZW1vcnkgU1NBIG1hcHBpbmdzCisgIERlbnNlTWFwPGNvbnN0IFZhbHVlICosIE1lbW9yeUFjY2VzcyAqPiBWYWx1ZVRvTWVtb3J5QWNjZXNzOworCisgIC8vIFRoZXNlIHR3byBtYXBwaW5ncyBjb250YWluIHRoZSBtYWluIGJsb2NrIHRvIGFjY2Vzcy9kZWYgbWFwcGluZ3MgZm9yCisgIC8vIE1lbW9yeVNTQS4gVGhlIGxpc3QgY29udGFpbmVkIGluIFBlckJsb2NrQWNjZXNzZXMgcmVhbGx5IG93bnMgYWxsIHRoZQorICAvLyBNZW1vcnlBY2Nlc3Nlcy4KKyAgLy8gQm90aCBtYXBzIG1haW50YWluIHRoZSBpbnZhcmlhbnQgdGhhdCBpZiBhIGJsb2NrIGlzIGZvdW5kIGluIHRoZW0sIHRoZQorICAvLyBjb3JyZXNwb25kaW5nIGxpc3QgaXMgbm90IGVtcHR5LCBhbmQgaWYgYSBibG9jayBpcyBub3QgZm91bmQgaW4gdGhlbSwgdGhlCisgIC8vIGNvcnJlc3BvbmRpbmcgbGlzdCBpcyBlbXB0eS4KKyAgQWNjZXNzTWFwIFBlckJsb2NrQWNjZXNzZXM7CisgIERlZnNNYXAgUGVyQmxvY2tEZWZzOworICBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QWNjZXNzLCBWYWx1ZURlbGV0ZXI+IExpdmVPbkVudHJ5RGVmOworCisgIC8vIERvbWluYXRpb24gbWFwcGluZ3MKKyAgLy8gTm90ZSB0aGF0IHRoZSBudW1iZXJpbmcgaXMgbG9jYWwgdG8gYSBibG9jaywgZXZlbiB0aG91Z2ggdGhlIG1hcCBpcworICAvLyBnbG9iYWwuCisgIG11dGFibGUgU21hbGxQdHJTZXQ8Y29uc3QgQmFzaWNCbG9jayAqLCAxNj4gQmxvY2tOdW1iZXJpbmdWYWxpZDsKKyAgbXV0YWJsZSBEZW5zZU1hcDxjb25zdCBNZW1vcnlBY2Nlc3MgKiwgdW5zaWduZWQgbG9uZz4gQmxvY2tOdW1iZXJpbmc7CisKKyAgLy8gTWVtb3J5IFNTQSBidWlsZGluZyBpbmZvCisgIHN0ZDo6dW5pcXVlX3B0cjxDYWNoaW5nV2Fsa2VyPiBXYWxrZXI7CisgIHVuc2lnbmVkIE5leHRJRDsKK307CisKKy8vIEludGVybmFsIE1lbW9yeVNTQSB1dGlscywgZm9yIHVzZSBieSBNZW1vcnlTU0EgY2xhc3NlcyBhbmQgd2Fsa2VycworY2xhc3MgTWVtb3J5U1NBVXRpbCB7Citwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBHVk5Ib2lzdDsKKyAgZnJpZW5kIGNsYXNzIE1lbW9yeVNTQVdhbGtlcjsKKworICAvLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgdXNlZCBieSBuZXcgcGFzc2VzLgorICBzdGF0aWMgYm9vbCBkZWZDbG9iYmVyc1VzZU9yRGVmKE1lbW9yeURlZiAqTUQsIGNvbnN0IE1lbW9yeVVzZU9yRGVmICpNVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlhc0FuYWx5c2lzICZBQSk7Cit9OworCisvLyBUaGlzIHBhc3MgZG9lcyBlYWdlciBidWlsZGluZyBhbmQgdGhlbiBwcmludGluZyBvZiBNZW1vcnlTU0EuIEl0IGlzIHVzZWQgYnkKKy8vIHRoZSB0ZXN0cyB0byBiZSBhYmxlIHRvIGJ1aWxkLCBkdW1wLCBhbmQgdmVyaWZ5IE1lbW9yeSBTU0EuCitjbGFzcyBNZW1vcnlTU0FQcmludGVyTGVnYWN5UGFzcyA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworcHVibGljOgorICBNZW1vcnlTU0FQcmludGVyTGVnYWN5UGFzcygpOworCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmKSBvdmVycmlkZTsKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKworICBzdGF0aWMgY2hhciBJRDsKK307CisKKy8vLyBBbiBhbmFseXNpcyB0aGF0IHByb2R1Y2VzIFxjIE1lbW9yeVNTQSBmb3IgYSBmdW5jdGlvbi4KKy8vLworY2xhc3MgTWVtb3J5U1NBQW5hbHlzaXMgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48TWVtb3J5U1NBQW5hbHlzaXM+IHsKKyAgZnJpZW5kIEFuYWx5c2lzSW5mb01peGluPE1lbW9yeVNTQUFuYWx5c2lzPjsKKworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCitwdWJsaWM6CisgIC8vIFdyYXAgTWVtb3J5U1NBIHJlc3VsdCB0byBlbnN1cmUgYWRkcmVzcyBzdGFiaWxpdHkgb2YgaW50ZXJuYWwgTWVtb3J5U1NBCisgIC8vIHBvaW50ZXJzIGFmdGVyIGNvbnN0cnVjdGlvbi4gIFVzZSBhIHdyYXBwZXIgY2xhc3MgaW5zdGVhZCBvZiBwbGFpbgorICAvLyB1bmlxdWVfcHRyPE1lbW9yeVNTQT4gdG8gYXZvaWQgYnVpbGQgYnJlYWthZ2Ugb24gTVNWQy4KKyAgc3RydWN0IFJlc3VsdCB7CisgICAgUmVzdWx0KHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlTU0E+ICYmTVNTQSkgOiBNU1NBKHN0ZDo6bW92ZShNU1NBKSkge30KKworICAgIE1lbW9yeVNTQSAmZ2V0TVNTQSgpIHsgcmV0dXJuICpNU1NBLmdldCgpOyB9CisKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5U1NBPiBNU1NBOworICB9OworCisgIFJlc3VsdCBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gXGJyaWVmIFByaW50ZXIgcGFzcyBmb3IgXGMgTWVtb3J5U1NBLgorY2xhc3MgTWVtb3J5U1NBUHJpbnRlclBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxNZW1vcnlTU0FQcmludGVyUGFzcz4geworICByYXdfb3N0cmVhbSAmT1M7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgTWVtb3J5U1NBUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk9TKSA6IE9TKE9TKSB7fQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBcYnJpZWYgVmVyaWZpZXIgcGFzcyBmb3IgXGMgTWVtb3J5U1NBLgorc3RydWN0IE1lbW9yeVNTQVZlcmlmaWVyUGFzcyA6IFBhc3NJbmZvTWl4aW48TWVtb3J5U1NBVmVyaWZpZXJQYXNzPiB7CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBcYnJpZWYgTGVnYWN5IGFuYWx5c2lzIHBhc3Mgd2hpY2ggY29tcHV0ZXMgXGMgTWVtb3J5U1NBLgorY2xhc3MgTWVtb3J5U1NBV3JhcHBlclBhc3MgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKK3B1YmxpYzoKKyAgTWVtb3J5U1NBV3JhcHBlclBhc3MoKTsKKworICBzdGF0aWMgY2hhciBJRDsKKworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJikgb3ZlcnJpZGU7CisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlOworICBNZW1vcnlTU0EgJmdldE1TU0EoKSB7IHJldHVybiAqTVNTQTsgfQorICBjb25zdCBNZW1vcnlTU0EgJmdldE1TU0EoKSBjb25zdCB7IHJldHVybiAqTVNTQTsgfQorCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCB2ZXJpZnlBbmFseXNpcygpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlICpNID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlTU0E+IE1TU0E7Cit9OworCisvLy8gXGJyaWVmIFRoaXMgaXMgdGhlIGdlbmVyaWMgd2Fsa2VyIGludGVyZmFjZSBmb3Igd2Fsa2VycyBvZiBNZW1vcnlTU0EuCisvLy8gV2Fsa2VycyBhcmUgdXNlZCB0byBiZSBhYmxlIHRvIGZ1cnRoZXIgZGlzYW1iaWd1YXRlIHRoZSBkZWYtdXNlIGNoYWlucworLy8vIE1lbW9yeVNTQSBnaXZlcyB5b3UsIG9yIG90aGVyd2lzZSBwcm9kdWNlIGJldHRlciBpbmZvIHRoYW4gTWVtb3J5U1NBIGdpdmVzCisvLy8geW91LgorLy8vIEluIHBhcnRpY3VsYXIsIHdoaWxlIHRoZSBkZWYtdXNlIGNoYWlucyBwcm92aWRlIGJhc2ljIGluZm9ybWF0aW9uLCBhbmQgYXJlCisvLy8gZ3VhcmFudGVlZCB0byBnaXZlLCBmb3IgZXhhbXBsZSwgdGhlIG5lYXJlc3QgbWF5LWFsaWFzaW5nIE1lbW9yeURlZiBmb3IgYQorLy8vIE1lbW9yeVVzZSBhcyBBbGlhc0FuYWx5c2lzIGNvbnNpZGVycyBpdCwgYSB1c2VyIG1hbnQgd2FudCBiZXR0ZXIgb3Igb3RoZXIKKy8vLyBpbmZvcm1hdGlvbi4gSW4gcGFydGljdWxhciwgdGhleSBtYXkgd2FudCB0byB1c2UgU0NFViBpbmZvIHRvIGZ1cnRoZXIKKy8vLyBkaXNhbWJpZ3VhdGUgbWVtb3J5IGFjY2Vzc2VzLCBvciB0aGV5IG1heSB3YW50IHRoZSBuZWFyZXN0IGRvbWluYXRpbmcKKy8vLyBtYXktYWxpYXNpbmcgTWVtb3J5RGVmIGZvciBhIGNhbGwgb3IgYSBzdG9yZS4gVGhpcyBBUEkgZW5hYmxlcyBhCisvLy8gc3RhbmRhcmRpemVkIGludGVyZmFjZSB0byBnZXR0aW5nIGFuZCB1c2luZyB0aGF0IGluZm8uCitjbGFzcyBNZW1vcnlTU0FXYWxrZXIgeworcHVibGljOgorICBNZW1vcnlTU0FXYWxrZXIoTWVtb3J5U1NBICopOworICB2aXJ0dWFsIH5NZW1vcnlTU0FXYWxrZXIoKSA9IGRlZmF1bHQ7CisKKyAgdXNpbmcgTWVtb3J5QWNjZXNzU2V0ID0gU21hbGxWZWN0b3I8TWVtb3J5QWNjZXNzICosIDg+OworCisgIC8vLyBcYnJpZWYgR2l2ZW4gYSBtZW1vcnkgTW9kL1JlZi9Nb2RSZWYnaW5nIGluc3RydWN0aW9uLCBjYWxsaW5nIHRoaXMKKyAgLy8vIHdpbGwgZ2l2ZSB5b3UgdGhlIG5lYXJlc3QgZG9taW5hdGluZyBNZW1vcnlBY2Nlc3MgdGhhdCBNb2QncyB0aGUgbG9jYXRpb24KKyAgLy8vIHRoZSBpbnN0cnVjdGlvbiBhY2Nlc3NlcyAoYnkgc2tpcHBpbmcgYW55IGRlZiB3aGljaCBBQSBjYW4gcHJvdmUgZG9lcyBub3QKKyAgLy8vIGFsaWFzIHRoZSBsb2NhdGlvbihzKSBhY2Nlc3NlZCBieSB0aGUgaW5zdHJ1Y3Rpb24gZ2l2ZW4pLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIHdpbGwgcmV0dXJuIGEgc2luZ2xlIGFjY2VzcywgYW5kIGl0IG11c3QgZG9taW5hdGUgdGhlCisgIC8vLyBJbnN0cnVjdGlvbiwgc28gaWYgYW4gb3BlcmFuZCBvZiBhIE1lbW9yeVBoaSBub2RlIE1vZCdzIHRoZSBpbnN0cnVjdGlvbiwKKyAgLy8vIHRoaXMgd2lsbCByZXR1cm4gdGhlIE1lbW9yeVBoaSwgbm90IHRoZSBvcGVyYW5kLiBUaGlzIG1lYW5zIHRoYXQKKyAgLy8vIGdpdmVuOgorICAvLy8gaWYgKGEpIHsKKyAgLy8vICAgMSA9IE1lbW9yeURlZihsaXZlT25FbnRyeSkKKyAgLy8vICAgc3RvcmUgJWEKKyAgLy8vIH0gZWxzZSB7CisgIC8vLyAgIDIgPSBNZW1vcnlEZWYobGl2ZU9uRW50cnkpCisgIC8vLyAgIHN0b3JlICViCisgIC8vLyB9CisgIC8vLyAzID0gTWVtb3J5UGhpKDIsIDEpCisgIC8vLyBNZW1vcnlVc2UoMykKKyAgLy8vIGxvYWQgJWEKKyAgLy8vCisgIC8vLyBjYWxsaW5nIHRoaXMgQVBJIG9uIGxvYWQoJWEpIHdpbGwgcmV0dXJuIHRoZSBNZW1vcnlQaGksIG5vdCB0aGUgTWVtb3J5RGVmCisgIC8vLyBpbiB0aGUgaWYgKGEpIGJyYW5jaC4KKyAgTWVtb3J5QWNjZXNzICpnZXRDbG9iYmVyaW5nTWVtb3J5QWNjZXNzKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgTWVtb3J5QWNjZXNzICpNQSA9IE1TU0EtPmdldE1lbW9yeUFjY2VzcyhJKTsKKyAgICBhc3NlcnQoTUEgJiYgIkhhbmRlZCBhbiBpbnN0cnVjdGlvbiB0aGF0IE1lbW9yeVNTQSBkb2Vzbid0IHJlY29nbml6ZT8iKTsKKyAgICByZXR1cm4gZ2V0Q2xvYmJlcmluZ01lbW9yeUFjY2VzcyhNQSk7CisgIH0KKworICAvLy8gRG9lcyB0aGUgc2FtZSB0aGluZyBhcyBnZXRDbG9iYmVyaW5nTWVtb3J5QWNjZXNzKGNvbnN0IEluc3RydWN0aW9uICpJKSwKKyAgLy8vIGJ1dCB0YWtlcyBhIE1lbW9yeUFjY2VzcyBpbnN0ZWFkIG9mIGFuIEluc3RydWN0aW9uLgorICB2aXJ0dWFsIE1lbW9yeUFjY2VzcyAqZ2V0Q2xvYmJlcmluZ01lbW9yeUFjY2VzcyhNZW1vcnlBY2Nlc3MgKikgPSAwOworCisgIC8vLyBcYnJpZWYgR2l2ZW4gYSBwb3RlbnRpYWxseSBjbG9iYmVyaW5nIG1lbW9yeSBhY2Nlc3MgYW5kIGEgbmV3IGxvY2F0aW9uLAorICAvLy8gY2FsbGluZyB0aGlzIHdpbGwgZ2l2ZSB5b3UgdGhlIG5lYXJlc3QgZG9taW5hdGluZyBjbG9iYmVyaW5nIE1lbW9yeUFjY2VzcworICAvLy8gKGJ5IHNraXBwaW5nIG5vbi1hbGlhc2luZyBkZWYgbGlua3MpLgorICAvLy8KKyAgLy8vIFRoaXMgdmVyc2lvbiBvZiB0aGUgZnVuY3Rpb24gaXMgbWFpbmx5IHVzZWQgdG8gZGlzYW1iaWd1YXRlIHBoaSB0cmFuc2xhdGVkCisgIC8vLyBwb2ludGVycywgd2hlcmUgdGhlIHZhbHVlIG9mIGEgcG9pbnRlciBtYXkgaGF2ZSBjaGFuZ2VkIGZyb20gdGhlIGluaXRpYWwKKyAgLy8vIG1lbW9yeSBhY2Nlc3MuIE5vdGUgdGhhdCB0aGlzIGV4cGVjdHMgdG8gYmUgaGFuZGVkIGVpdGhlciBhIE1lbW9yeVVzZSwKKyAgLy8vIG9yIGFuIGFscmVhZHkgcG90ZW50aWFsbHkgY2xvYmJlcmluZyBhY2Nlc3MuIFVubGlrZSB0aGUgYWJvdmUgQVBJLCBpZgorICAvLy8gZ2l2ZW4gYSBNZW1vcnlEZWYgdGhhdCBjbG9iYmVycyB0aGUgcG9pbnRlciBhcyB0aGUgc3RhcnRpbmcgYWNjZXNzLCBpdAorICAvLy8gd2lsbCByZXR1cm4gdGhhdCBNZW1vcnlEZWYsIHdoZXJlYXMgdGhlIGFib3ZlIHdvdWxkIHJldHVybiB0aGUgY2xvYmJlcgorICAvLy8gc3RhcnRpbmcgZnJvbSB0aGUgdXNlIHNpZGUgb2YgIHRoZSBtZW1vcnkgZGVmLgorICB2aXJ0dWFsIE1lbW9yeUFjY2VzcyAqZ2V0Q2xvYmJlcmluZ01lbW9yeUFjY2VzcyhNZW1vcnlBY2Nlc3MgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtb3J5TG9jYXRpb24gJikgPSAwOworCisgIC8vLyBcYnJpZWYgR2l2ZW4gYSBtZW1vcnkgYWNjZXNzLCBpbnZhbGlkYXRlIGFueXRoaW5nIHRoaXMgd2Fsa2VyIGtub3dzIGFib3V0CisgIC8vLyB0aGF0IGFjY2Vzcy4KKyAgLy8vIFRoaXMgQVBJIGlzIHVzZWQgYnkgd2Fsa2VycyB0aGF0IHN0b3JlIGluZm9ybWF0aW9uIHRvIHBlcmZvcm0gYmFzaWMgY2FjaGUKKyAgLy8vIGludmFsaWRhdGlvbi4gIFRoaXMgd2lsbCBiZSBjYWxsZWQgYnkgTWVtb3J5U1NBIGF0IGFwcHJvcHJpYXRlIHRpbWVzIGZvcgorICAvLy8gdGhlIHdhbGtlciBpdCB1c2VzIG9yIHJldHVybnMuCisgIHZpcnR1YWwgdm9pZCBpbnZhbGlkYXRlSW5mbyhNZW1vcnlBY2Nlc3MgKikge30KKworICB2aXJ0dWFsIHZvaWQgdmVyaWZ5KGNvbnN0IE1lbW9yeVNTQSAqTVNTQSkgeyBhc3NlcnQoTVNTQSA9PSB0aGlzLT5NU1NBKTsgfQorCitwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBNZW1vcnlTU0E7IC8vIEZvciB1cGRhdGluZyBNU1NBIHBvaW50ZXIgaW4gTWVtb3J5U1NBIG1vdmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29uc3RydWN0b3IuCisgIE1lbW9yeVNTQSAqTVNTQTsKK307CisKKy8vLyBcYnJpZWYgQSBNZW1vcnlTU0FXYWxrZXIgdGhhdCBkb2VzIG5vIGFsaWFzIHF1ZXJpZXMsIG9yIGFueXRoaW5nIGVsc2UuIEl0CisvLy8gc2ltcGx5IHJldHVybnMgdGhlIGxpbmtzIGFzIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCBieSB0aGUgYnVpbGRlci4KK2NsYXNzIERvTm90aGluZ01lbW9yeVNTQVdhbGtlciBmaW5hbCA6IHB1YmxpYyBNZW1vcnlTU0FXYWxrZXIgeworcHVibGljOgorICAvLyBLZWVwIHRoZSBvdmVycmlkZXMgYmVsb3cgZnJvbSBoaWRpbmcgdGhlIEluc3RydWN0aW9uIG92ZXJsb2FkIG9mCisgIC8vIGdldENsb2JiZXJpbmdNZW1vcnlBY2Nlc3MuCisgIHVzaW5nIE1lbW9yeVNTQVdhbGtlcjo6Z2V0Q2xvYmJlcmluZ01lbW9yeUFjY2VzczsKKworICBNZW1vcnlBY2Nlc3MgKmdldENsb2JiZXJpbmdNZW1vcnlBY2Nlc3MoTWVtb3J5QWNjZXNzICopIG92ZXJyaWRlOworICBNZW1vcnlBY2Nlc3MgKmdldENsb2JiZXJpbmdNZW1vcnlBY2Nlc3MoTWVtb3J5QWNjZXNzICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1vcnlMb2NhdGlvbiAmKSBvdmVycmlkZTsKK307CisKK3VzaW5nIE1lbW9yeUFjY2Vzc1BhaXIgPSBzdGQ6OnBhaXI8TWVtb3J5QWNjZXNzICosIE1lbW9yeUxvY2F0aW9uPjsKK3VzaW5nIENvbnN0TWVtb3J5QWNjZXNzUGFpciA9IHN0ZDo6cGFpcjxjb25zdCBNZW1vcnlBY2Nlc3MgKiwgTWVtb3J5TG9jYXRpb24+OworCisvLy8gXGJyaWVmIEl0ZXJhdG9yIGJhc2UgY2xhc3MgdXNlZCB0byBpbXBsZW1lbnQgY29uc3QgYW5kIG5vbi1jb25zdCBpdGVyYXRvcnMKKy8vLyBvdmVyIHRoZSBkZWZpbmluZyBhY2Nlc3NlcyBvZiBhIE1lbW9yeUFjY2Vzcy4KK3RlbXBsYXRlIDxjbGFzcyBUPgorY2xhc3MgbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvcl9iYXNlCisgICAgOiBwdWJsaWMgaXRlcmF0b3JfZmFjYWRlX2Jhc2U8bWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvcl9iYXNlPFQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIFQsIHB0cmRpZmZfdCwgVCAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgKj4geworICB1c2luZyBCYXNlVCA9IHR5cGVuYW1lIG1lbW9yeWFjY2Vzc19kZWZfaXRlcmF0b3JfYmFzZTo6aXRlcmF0b3JfZmFjYWRlX2Jhc2U7CisKK3B1YmxpYzoKKyAgbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvcl9iYXNlKFQgKlN0YXJ0KSA6IEFjY2VzcyhTdGFydCkge30KKyAgbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvcl9iYXNlKCkgPSBkZWZhdWx0OworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBtZW1vcnlhY2Nlc3NfZGVmX2l0ZXJhdG9yX2Jhc2UgJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIEFjY2VzcyA9PSBPdGhlci5BY2Nlc3MgJiYgKCFBY2Nlc3MgfHwgQXJnTm8gPT0gT3RoZXIuQXJnTm8pOworICB9CisKKyAgLy8gVGhpcyBpcyBhIGJpdCB1Z2x5LCBidXQgZm9yIE1lbW9yeVBISSdzLCB1bmxpa2UgUEhJTm9kZXMsIHlvdSBjYW4ndCBnZXQgdGhlCisgIC8vIGJsb2NrIGZyb20gdGhlIG9wZXJhbmQgaW4gY29uc3RhbnQgdGltZSAoSW4gYSBQSElOb2RlLCB0aGUgdXNlbGlzdCBoYXMKKyAgLy8gYm90aCwgc28gaXQncyBqdXN0IHN1YnRyYWN0aW9uKS4gV2UgcHJvdmlkZSBpdCBhcyBwYXJ0IG9mIHRoZQorICAvLyBpdGVyYXRvciB0byBhdm9pZCBjYWxsZXJzIGhhdmluZyB0byBsaW5lYXIgd2FsayB0byBnZXQgdGhlIGJsb2NrLgorICAvLyBJZiB0aGUgb3BlcmF0aW9uIGJlY29tZXMgY29uc3RhbnQgdGltZSBvbiBNZW1vcnlQSEkncywgdGhpcyBiaXQgb2YKKyAgLy8gYWJzdHJhY3Rpb24gYnJlYWtpbmcgc2hvdWxkIGJlIHJlbW92ZWQuCisgIEJhc2ljQmxvY2sgKmdldFBoaUFyZ0Jsb2NrKCkgY29uc3QgeworICAgIE1lbW9yeVBoaSAqTVAgPSBkeW5fY2FzdDxNZW1vcnlQaGk+KEFjY2Vzcyk7CisgICAgYXNzZXJ0KE1QICYmICJUcmllZCB0byBnZXQgcGhpIGFyZyBibG9jayB3aGVuIG5vdCBpdGVyYXRpbmcgb3ZlciBhIFBISSIpOworICAgIHJldHVybiBNUC0+Z2V0SW5jb21pbmdCbG9jayhBcmdObyk7CisgIH0KKworICB0eXBlbmFtZSBCYXNlVDo6aXRlcmF0b3I6OnBvaW50ZXIgb3BlcmF0b3IqKCkgY29uc3QgeworICAgIGFzc2VydChBY2Nlc3MgJiYgIlRyaWVkIHRvIGFjY2VzcyBwYXN0IHRoZSBlbmQgb2Ygb3VyIGl0ZXJhdG9yIik7CisgICAgLy8gR28gdG8gdGhlIGZpcnN0IGFyZ3VtZW50IGZvciBwaGlzLCBhbmQgdGhlIGRlZmluaW5nIGFjY2VzcyBmb3IgZXZlcnl0aGluZworICAgIC8vIGVsc2UuCisgICAgaWYgKE1lbW9yeVBoaSAqTVAgPSBkeW5fY2FzdDxNZW1vcnlQaGk+KEFjY2VzcykpCisgICAgICByZXR1cm4gTVAtPmdldEluY29taW5nVmFsdWUoQXJnTm8pOworICAgIHJldHVybiBjYXN0PE1lbW9yeVVzZU9yRGVmPihBY2Nlc3MpLT5nZXREZWZpbmluZ0FjY2VzcygpOworICB9CisKKyAgdXNpbmcgQmFzZVQ6Om9wZXJhdG9yKys7CisgIG1lbW9yeWFjY2Vzc19kZWZfaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgYXNzZXJ0KEFjY2VzcyAmJiAiSGl0IGVuZCBvZiBpdGVyYXRvciIpOworICAgIGlmIChNZW1vcnlQaGkgKk1QID0gZHluX2Nhc3Q8TWVtb3J5UGhpPihBY2Nlc3MpKSB7CisgICAgICBpZiAoKytBcmdObyA+PSBNUC0+Z2V0TnVtSW5jb21pbmdWYWx1ZXMoKSkgeworICAgICAgICBBcmdObyA9IDA7CisgICAgICAgIEFjY2VzcyA9IG51bGxwdHI7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIEFjY2VzcyA9IG51bGxwdHI7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCitwcml2YXRlOgorICBUICpBY2Nlc3MgPSBudWxscHRyOworICB1bnNpZ25lZCBBcmdObyA9IDA7Cit9OworCitpbmxpbmUgbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvciBNZW1vcnlBY2Nlc3M6OmRlZnNfYmVnaW4oKSB7CisgIHJldHVybiBtZW1vcnlhY2Nlc3NfZGVmX2l0ZXJhdG9yKHRoaXMpOworfQorCitpbmxpbmUgY29uc3RfbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvciBNZW1vcnlBY2Nlc3M6OmRlZnNfYmVnaW4oKSBjb25zdCB7CisgIHJldHVybiBjb25zdF9tZW1vcnlhY2Nlc3NfZGVmX2l0ZXJhdG9yKHRoaXMpOworfQorCitpbmxpbmUgbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvciBNZW1vcnlBY2Nlc3M6OmRlZnNfZW5kKCkgeworICByZXR1cm4gbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvcigpOworfQorCitpbmxpbmUgY29uc3RfbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvciBNZW1vcnlBY2Nlc3M6OmRlZnNfZW5kKCkgY29uc3QgeworICByZXR1cm4gY29uc3RfbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvcigpOworfQorCisvLy8gXGJyaWVmIEdyYXBoVHJhaXRzIGZvciBhIE1lbW9yeUFjY2Vzcywgd2hpY2ggd2Fsa3MgZGVmcyBpbiB0aGUgbm9ybWFsIGNhc2UsCisvLy8gYW5kIHVzZXMgaW4gdGhlIGludmVyc2UgY2FzZS4KK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxNZW1vcnlBY2Nlc3MgKj4geworICB1c2luZyBOb2RlUmVmID0gTWVtb3J5QWNjZXNzICo7CisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvcjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoTm9kZVJlZiBOKSB7IHJldHVybiBOOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPmRlZnNfYmVnaW4oKTsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+ZGVmc19lbmQoKTsgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPEludmVyc2U8TWVtb3J5QWNjZXNzICo+PiB7CisgIHVzaW5nIE5vZGVSZWYgPSBNZW1vcnlBY2Nlc3MgKjsKKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSBNZW1vcnlBY2Nlc3M6Oml0ZXJhdG9yOworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShOb2RlUmVmIE4pIHsgcmV0dXJuIE47IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+dXNlcl9iZWdpbigpOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7IHJldHVybiBOLT51c2VyX2VuZCgpOyB9Cit9OworCisvLy8gXGJyaWVmIFByb3ZpZGUgYW4gaXRlcmF0b3IgdGhhdCB3YWxrcyBkZWZzLCBnaXZpbmcgYm90aCB0aGUgbWVtb3J5IGFjY2VzcywKKy8vLyBhbmQgdGhlIGN1cnJlbnQgcG9pbnRlciBsb2NhdGlvbiwgdXBkYXRpbmcgdGhlIHBvaW50ZXIgbG9jYXRpb24gYXMgaXQKKy8vLyBjaGFuZ2VzIGR1ZSB0byBwaGkgbm9kZSB0cmFuc2xhdGlvbi4KKy8vLworLy8vIFRoaXMgaXRlcmF0b3IsIHdoaWxlIHNvbWV3aGF0IHNwZWNpYWxpemVkLCBpcyB3aGF0IG1vc3QgY2xpZW50cyBhY3R1YWxseQorLy8vIHdhbnQgd2hlbiB3YWxraW5nIHVwd2FyZHMgdGhyb3VnaCBNZW1vcnlTU0EgZGVmIGNoYWlucy4gSXQgdGFrZXMgYSBwYWlyIG9mCisvLy8gPE1lbW9yeUFjY2VzcyxNZW1vcnlMb2NhdGlvbj4sIGFuZCB3YWxrcyBkZWZzLCBwcm9wZXJseSB0cmFuc2xhdGluZyB0aGUKKy8vLyBtZW1vcnkgbG9jYXRpb24gdGhyb3VnaCBwaGkgbm9kZXMgZm9yIHRoZSB1c2VyLgorY2xhc3MgdXB3YXJkX2RlZnNfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcl9mYWNhZGVfYmFzZTx1cHdhcmRfZGVmc19pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lbW9yeUFjY2Vzc1BhaXI+IHsKKyAgdXNpbmcgQmFzZVQgPSB1cHdhcmRfZGVmc19pdGVyYXRvcjo6aXRlcmF0b3JfZmFjYWRlX2Jhc2U7CisKK3B1YmxpYzoKKyAgdXB3YXJkX2RlZnNfaXRlcmF0b3IoY29uc3QgTWVtb3J5QWNjZXNzUGFpciAmSW5mbykKKyAgICAgIDogRGVmSXRlcmF0b3IoSW5mby5maXJzdCksIExvY2F0aW9uKEluZm8uc2Vjb25kKSwKKyAgICAgICAgT3JpZ2luYWxBY2Nlc3MoSW5mby5maXJzdCkgeworICAgIEN1cnJlbnRQYWlyLmZpcnN0ID0gbnVsbHB0cjsKKworICAgIFdhbGtpbmdQaGkgPSBJbmZvLmZpcnN0ICYmIGlzYTxNZW1vcnlQaGk+KEluZm8uZmlyc3QpOworICAgIGZpbGxJbkN1cnJlbnRQYWlyKCk7CisgIH0KKworICB1cHdhcmRfZGVmc19pdGVyYXRvcigpIHsgQ3VycmVudFBhaXIuZmlyc3QgPSBudWxscHRyOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHVwd2FyZF9kZWZzX2l0ZXJhdG9yICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBEZWZJdGVyYXRvciA9PSBPdGhlci5EZWZJdGVyYXRvcjsKKyAgfQorCisgIEJhc2VUOjppdGVyYXRvcjo6cmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICBhc3NlcnQoRGVmSXRlcmF0b3IgIT0gT3JpZ2luYWxBY2Nlc3MtPmRlZnNfZW5kKCkgJiYKKyAgICAgICAgICAgIlRyaWVkIHRvIGFjY2VzcyBwYXN0IHRoZSBlbmQgb2Ygb3VyIGl0ZXJhdG9yIik7CisgICAgcmV0dXJuIEN1cnJlbnRQYWlyOworICB9CisKKyAgdXNpbmcgQmFzZVQ6Om9wZXJhdG9yKys7CisgIHVwd2FyZF9kZWZzX2l0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgIGFzc2VydChEZWZJdGVyYXRvciAhPSBPcmlnaW5hbEFjY2Vzcy0+ZGVmc19lbmQoKSAmJgorICAgICAgICAgICAiVHJpZWQgdG8gYWNjZXNzIHBhc3QgdGhlIGVuZCBvZiB0aGUgaXRlcmF0b3IiKTsKKyAgICArK0RlZkl0ZXJhdG9yOworICAgIGlmIChEZWZJdGVyYXRvciAhPSBPcmlnaW5hbEFjY2Vzcy0+ZGVmc19lbmQoKSkKKyAgICAgIGZpbGxJbkN1cnJlbnRQYWlyKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQmFzaWNCbG9jayAqZ2V0UGhpQXJnQmxvY2soKSBjb25zdCB7IHJldHVybiBEZWZJdGVyYXRvci5nZXRQaGlBcmdCbG9jaygpOyB9CisKK3ByaXZhdGU6CisgIHZvaWQgZmlsbEluQ3VycmVudFBhaXIoKSB7CisgICAgQ3VycmVudFBhaXIuZmlyc3QgPSAqRGVmSXRlcmF0b3I7CisgICAgaWYgKFdhbGtpbmdQaGkgJiYgTG9jYXRpb24uUHRyKSB7CisgICAgICBQSElUcmFuc0FkZHIgVHJhbnNsYXRvcigKKyAgICAgICAgICBjb25zdF9jYXN0PFZhbHVlICo+KExvY2F0aW9uLlB0ciksCisgICAgICAgICAgT3JpZ2luYWxBY2Nlc3MtPmdldEJsb2NrKCktPmdldE1vZHVsZSgpLT5nZXREYXRhTGF5b3V0KCksIG51bGxwdHIpOworICAgICAgaWYgKCFUcmFuc2xhdG9yLlBISVRyYW5zbGF0ZVZhbHVlKE9yaWdpbmFsQWNjZXNzLT5nZXRCbG9jaygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZkl0ZXJhdG9yLmdldFBoaUFyZ0Jsb2NrKCksIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKQorICAgICAgICBpZiAoVHJhbnNsYXRvci5nZXRBZGRyKCkgIT0gTG9jYXRpb24uUHRyKSB7CisgICAgICAgICAgQ3VycmVudFBhaXIuc2Vjb25kID0gTG9jYXRpb24uZ2V0V2l0aE5ld1B0cihUcmFuc2xhdG9yLmdldEFkZHIoKSk7CisgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIEN1cnJlbnRQYWlyLnNlY29uZCA9IExvY2F0aW9uOworICB9CisKKyAgTWVtb3J5QWNjZXNzUGFpciBDdXJyZW50UGFpcjsKKyAgbWVtb3J5YWNjZXNzX2RlZl9pdGVyYXRvciBEZWZJdGVyYXRvcjsKKyAgTWVtb3J5TG9jYXRpb24gTG9jYXRpb247CisgIE1lbW9yeUFjY2VzcyAqT3JpZ2luYWxBY2Nlc3MgPSBudWxscHRyOworICBib29sIFdhbGtpbmdQaGkgPSBmYWxzZTsKK307CisKK2lubGluZSB1cHdhcmRfZGVmc19pdGVyYXRvciB1cHdhcmRfZGVmc19iZWdpbihjb25zdCBNZW1vcnlBY2Nlc3NQYWlyICZQYWlyKSB7CisgIHJldHVybiB1cHdhcmRfZGVmc19pdGVyYXRvcihQYWlyKTsKK30KKworaW5saW5lIHVwd2FyZF9kZWZzX2l0ZXJhdG9yIHVwd2FyZF9kZWZzX2VuZCgpIHsgcmV0dXJuIHVwd2FyZF9kZWZzX2l0ZXJhdG9yKCk7IH0KKworaW5saW5lIGl0ZXJhdG9yX3JhbmdlPHVwd2FyZF9kZWZzX2l0ZXJhdG9yPgordXB3YXJkX2RlZnMoY29uc3QgTWVtb3J5QWNjZXNzUGFpciAmUGFpcikgeworICByZXR1cm4gbWFrZV9yYW5nZSh1cHdhcmRfZGVmc19iZWdpbihQYWlyKSwgdXB3YXJkX2RlZnNfZW5kKCkpOworfQorCisvLy8gV2Fsa3MgdGhlIGRlZmluaW5nIGFjY2Vzc2VzIG9mIE1lbW9yeURlZnMuIFN0b3BzIGFmdGVyIHdlIGhpdCBzb21ldGhpbmcgdGhhdAorLy8vIGhhcyBubyBkZWZpbmluZyB1c2UgKGUuZy4gYSBNZW1vcnlQaGkgb3IgbGl2ZU9uRW50cnkpLiBOb3RlIHRoYXQsIHdoZW4KKy8vLyBjb21wYXJpbmcgYWdhaW5zdCBhIG51bGwgZGVmX2NoYWluX2l0ZXJhdG9yLCB0aGlzIHdpbGwgY29tcGFyZSBlcXVhbCBvbmx5CisvLy8gYWZ0ZXIgd2Fsa2luZyBzYWlkIFBoaS9saXZlT25FbnRyeS4KKy8vLworLy8vIFRoZSBVc2VPcHRpbWl6ZWRDaGFpbiBmbGFnIHNwZWNpZmllcyB3aGV0aGVyIHRvIHdhbGsgdGhlIGNsb2JiZXJpbmcKKy8vLyBhY2Nlc3MgY2hhaW4sIG9yIGFsbCB0aGUgYWNjZXNzZXMuCisvLy8KKy8vLyBOb3JtYWxseSwgTWVtb3J5RGVmIGFyZSBhbGwganVzdCBkZWYvdXNlIGxpbmtlZCB0b2dldGhlciwgc28gYSBkZWZfY2hhaW4gb24KKy8vLyBhIE1lbW9yeURlZiB3aWxsIHdhbGsgYWxsIE1lbW9yeURlZnMgYWJvdmUgaXQgaW4gdGhlIHByb2dyYW0gdW50aWwgaXQgaGl0cworLy8vIGEgcGhpIG5vZGUuICBUaGUgb3B0aW1pemVkIGNoYWluIHdhbGtzIHRoZSBjbG9iYmVyaW5nIGFjY2VzcyBvZiBhIHN0b3JlLgorLy8vIFNvIGlmIHlvdSBhcmUganVzdCB0cnlpbmcgdG8gZmluZCwgZ2l2ZW4gYSBzdG9yZSwgd2hhdCB0aGUgbmV4dAorLy8vIHRoaW5nIHRoYXQgd291bGQgY2xvYmJlciB0aGUgc2FtZSBtZW1vcnkgaXMsIHlvdSB3YW50IHRoZSBvcHRpbWl6ZWQgY2hhaW4uCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgYm9vbCBVc2VPcHRpbWl6ZWRDaGFpbiA9IGZhbHNlPgorc3RydWN0IGRlZl9jaGFpbl9pdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yX2ZhY2FkZV9iYXNlPGRlZl9jaGFpbl9pdGVyYXRvcjxULCBVc2VPcHRpbWl6ZWRDaGFpbj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgTWVtb3J5QWNjZXNzICo+IHsKKyAgZGVmX2NoYWluX2l0ZXJhdG9yKCkgOiBNQShudWxscHRyKSB7fQorICBkZWZfY2hhaW5faXRlcmF0b3IoVCBNQSkgOiBNQShNQSkge30KKworICBUIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIE1BOyB9CisKKyAgZGVmX2NoYWluX2l0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgIC8vIE4uQi4gbGl2ZU9uRW50cnkgaGFzIGEgbnVsbCBkZWZpbmluZyBhY2Nlc3MuCisgICAgaWYgKGF1dG8gKk1VRCA9IGR5bl9jYXN0PE1lbW9yeVVzZU9yRGVmPihNQSkpIHsKKyAgICAgIGlmIChVc2VPcHRpbWl6ZWRDaGFpbiAmJiBNVUQtPmlzT3B0aW1pemVkKCkpCisgICAgICAgIE1BID0gTVVELT5nZXRPcHRpbWl6ZWQoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgTUEgPSBNVUQtPmdldERlZmluaW5nQWNjZXNzKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIE1BID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgZGVmX2NoYWluX2l0ZXJhdG9yICZPKSBjb25zdCB7IHJldHVybiBNQSA9PSBPLk1BOyB9CisKK3ByaXZhdGU6CisgIFQgTUE7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBpdGVyYXRvcl9yYW5nZTxkZWZfY2hhaW5faXRlcmF0b3I8VD4+CitkZWZfY2hhaW4oVCBNQSwgTWVtb3J5QWNjZXNzICpVcFRvID0gbnVsbHB0cikgeworI2lmZGVmIEVYUEVOU0lWRV9DSEVDS1MKKyAgYXNzZXJ0KCghVXBUbyB8fCBmaW5kKGRlZl9jaGFpbihNQSksIFVwVG8pICE9IGRlZl9jaGFpbl9pdGVyYXRvcjxUPigpKSAmJgorICAgICAgICAgIlVwVG8gaXNuJ3QgaW4gdGhlIGRlZiBjaGFpbiEiKTsKKyNlbmRpZgorICByZXR1cm4gbWFrZV9yYW5nZShkZWZfY2hhaW5faXRlcmF0b3I8VD4oTUEpLCBkZWZfY2hhaW5faXRlcmF0b3I8VD4oVXBUbykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2lubGluZSBpdGVyYXRvcl9yYW5nZTxkZWZfY2hhaW5faXRlcmF0b3I8VCwgdHJ1ZT4+IG9wdGltaXplZF9kZWZfY2hhaW4oVCBNQSkgeworICByZXR1cm4gbWFrZV9yYW5nZShkZWZfY2hhaW5faXRlcmF0b3I8VCwgdHJ1ZT4oTUEpLAorICAgICAgICAgICAgICAgICAgICBkZWZfY2hhaW5faXRlcmF0b3I8VCwgdHJ1ZT4obnVsbHB0cikpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19NRU1PUllTU0FfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9NZW1vcnlTU0FVcGRhdGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL01lbW9yeVNTQVVwZGF0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjRlZjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9NZW1vcnlTU0FVcGRhdGVyLmgKQEAgLTAsMCArMSwxNTggQEAKKy8vPT09LSBNZW1vcnlTU0FVcGRhdGVyLmggLSBNZW1vcnkgU1NBIFVwZGF0ZXItLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gXGZpbGUKKy8vIFxicmllZiBBbiBhdXRvbWF0aWMgdXBkYXRlciBmb3IgTWVtb3J5U1NBIHRoYXQgaGFuZGxlcyBhcmJpdHJhcnkgaW5zZXJ0aW9uLAorLy8gZGVsZXRpb24sIGFuZCBtb3Zlcy4gIEl0IHBlcmZvcm1zIHBoaSBpbnNlcnRpb24gd2hlcmUgbmVjZXNzYXJ5LCBhbmQKKy8vIGF1dG9tYXRpY2FsbHkgdXBkYXRlcyB0aGUgTWVtb3J5U1NBIElSIHRvIGJlIGNvcnJlY3QuCisvLyBXaGlsZSB1cGRhdGluZyBsb2FkcyBvciByZW1vdmluZyBpbnN0cnVjdGlvbnMgaXMgb2Z0ZW4gZWFzeSBlbm91Z2ggdG8gbm90CisvLyBuZWVkIHRoaXMsIHVwZGF0aW5nIHN0b3JlcyBzaG91bGQgZ2VuZXJhbGx5IG5vdCBiZSBhdHRlbXBlZCBvdXRzaWRlIHRoaXMKKy8vIEFQSS4KKy8vCisvLyBCYXNpYyBBUEkgdXNhZ2U6CisvLyBDcmVhdGUgdGhlIG1lbW9yeSBhY2Nlc3MgeW91IHdhbnQgZm9yIHRoZSBpbnN0cnVjdGlvbiAodGhpcyBpcyBtYWlubHkgc28KKy8vIHdlIGtub3cgd2hlcmUgaXQgaXMsIHdpdGhvdXQgaGF2aW5nIHRvIGR1cGxpY2F0ZSB0aGUgZW50aXJlIHNldCBvZiBjcmVhdGUKKy8vIGZ1bmN0aW9ucyBNZW1vcnlTU0Egc3VwcG9ydHMpLgorLy8gQ2FsbCBpbnNlcnREZWYgb3IgaW5zZXJ0VXNlIGRlcGVuZGluZyBvbiB3aGV0aGVyIGl0J3MgYSBNZW1vcnlVc2Ugb3IgYQorLy8gTWVtb3J5RGVmLgorLy8gVGhhdCdzIGl0LgorLy8KKy8vIEZvciBtb3ZpbmcsIGZpcnN0LCBtb3ZlIHRoZSBpbnN0cnVjdGlvbiBpdHNlbGYgdXNpbmcgdGhlIG5vcm1hbCBTU0EKKy8vIGluc3RydWN0aW9uIG1vdmluZyBBUEksIHRoZW4ganVzdCBjYWxsIG1vdmVCZWZvcmUsIG1vdmVBZnRlcixvciBtb3ZlVG8gd2l0aAorLy8gdGhlIHJpZ2h0IGFyZ3VtZW50cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfTUVNT1JZU1NBVVBEQVRFUl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfTUVNT1JZU1NBVVBEQVRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9NZW1vcnlTU0EuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvT3BlcmFuZFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVXNlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Vc2VyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIE1lbW9yeUFjY2VzczsKK2NsYXNzIExMVk1Db250ZXh0OworY2xhc3MgcmF3X29zdHJlYW07CisKK2NsYXNzIE1lbW9yeVNTQVVwZGF0ZXIgeworcHJpdmF0ZToKKyAgTWVtb3J5U1NBICpNU1NBOworICBTbWFsbFZlY3RvcjxNZW1vcnlQaGkgKiwgOD4gSW5zZXJ0ZWRQSElzOworICBTbWFsbFB0clNldDxCYXNpY0Jsb2NrICosIDg+IFZpc2l0ZWRCbG9ja3M7CisKK3B1YmxpYzoKKyAgTWVtb3J5U1NBVXBkYXRlcihNZW1vcnlTU0EgKk1TU0EpIDogTVNTQShNU1NBKSB7fQorICAvLy8gSW5zZXJ0IGEgZGVmaW5pdGlvbiBpbnRvIHRoZSBNZW1vcnlTU0EgSVIuICBSZW5hbWVVc2VzIHdpbGwgcmVuYW1lIGFueSB1c2UKKyAgLy8vIGJlbG93IHRoZSBuZXcgZGVmIGJsb2NrIChhbmQgYW55IGluc2VydGVkIHBoaXMpLiAgUmVuYW1lVXNlcyBzaG91bGQgYmUgc2V0CisgIC8vLyB0byB0cnVlIGlmIHRoZSBkZWZpbml0aW9uIG1heSBjYXVzZSBuZXcgYWxpYXNlcyBmb3IgbG9hZHMgYmVsb3cgaXQuICBUaGlzCisgIC8vLyBpcyBub3QgdGhlIGNhc2UgZm9yIGhvaXN0aW5nIG9yIHNpbmtpbmcgb3Igb3RoZXIgZm9ybXMgb2YgY29kZSAqbW92ZW1lbnQqLgorICAvLy8gSXQgKmlzKiB0aGUgY2FzZSBmb3Igc3RyYWlnaHQgY29kZSBpbnNlcnRpb24uCisgIC8vLyBGb3IgZXhhbXBsZToKKyAgLy8vIHN0b3JlIGEKKyAgLy8vIGlmIChmb28pIHsgfQorICAvLy8gbG9hZCBhCisgIC8vLworICAvLy8gTW92aW5nIHRoZSBzdG9yZSBpbnRvIHRoZSBpZiBibG9jaywgYW5kIGNhbGxpbmcgaW5zZXJ0RGVmLCBkb2VzIG5vdAorICAvLy8gcmVxdWlyZSBSZW5hbWVVc2VzLgorICAvLy8gSG93ZXZlciwgY2hhbmdpbmcgaXQgdG86CisgIC8vLyBzdG9yZSBhCisgIC8vLyBpZiAoZm9vKSB7IHN0b3JlIGIgfQorICAvLy8gbG9hZCBhCisgIC8vLyBXaGVyZSBhIG1heWFsaWFzIGIsICpkb2VzKiByZXF1aXJlIFJlbmFtZVVzZXMgYmUgc2V0IHRvIHRydWUuCisgIHZvaWQgaW5zZXJ0RGVmKE1lbW9yeURlZiAqRGVmLCBib29sIFJlbmFtZVVzZXMgPSBmYWxzZSk7CisgIHZvaWQgaW5zZXJ0VXNlKE1lbW9yeVVzZSAqVXNlKTsKKyAgdm9pZCBtb3ZlQmVmb3JlKE1lbW9yeVVzZU9yRGVmICpXaGF0LCBNZW1vcnlVc2VPckRlZiAqV2hlcmUpOworICB2b2lkIG1vdmVBZnRlcihNZW1vcnlVc2VPckRlZiAqV2hhdCwgTWVtb3J5VXNlT3JEZWYgKldoZXJlKTsKKyAgdm9pZCBtb3ZlVG9QbGFjZShNZW1vcnlVc2VPckRlZiAqV2hhdCwgQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgTWVtb3J5U1NBOjpJbnNlcnRpb25QbGFjZSBXaGVyZSk7CisKKyAgLy8gVGhlIGJlbG93IGFyZSB1dGlsaXR5IGZ1bmN0aW9ucy4gT3RoZXIgdGhhbiBjcmVhdGlvbiBvZiBhY2Nlc3NlcyB0byBwYXNzCisgIC8vIHRvIGluc2VydERlZiwgYW5kIHJlbW92ZUFjY2VzcyB0byByZW1vdmUgYWNjZXNzZXMsIHlvdSBzaG91bGQgZ2VuZXJhbGx5CisgIC8vIG5vdCBhdHRlbXB0IHRvIHVwZGF0ZSBtZW1vcnlzc2EgeW91cnNlbGYuIEl0IGlzIHZlcnkgbm9uLXRyaXZpYWwgdG8gZ2V0CisgIC8vIHRoZSBlZGdlIGNhc2VzIHJpZ2h0LCBhbmQgdGhlIGFib3ZlIGNhbGxzIGFscmVhZHkgb3BlcmF0ZSBpbiBuZWFyLW9wdGltYWwKKyAgLy8gdGltZSBib3VuZHMuCisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBNZW1vcnlBY2Nlc3MgaW4gTWVtb3J5U1NBIGF0IGEgc3BlY2lmaWVkIHBvaW50IGluIGEgYmxvY2ssCisgIC8vLyB3aXRoIGEgc3BlY2lmaWVkIGNsb2JiZXJpbmcgZGVmaW5pdGlvbi4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIHRoZSBuZXcgTWVtb3J5QWNjZXNzLgorICAvLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSBtZW1vcnkgaW5zdHJ1Y3Rpb24gaXMgY3JlYXRlZCB0aGF0IGlzIGJlaW5nCisgIC8vLyB1c2VkIHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgbWVtb3J5IGluc3RydWN0aW9uLiBJdCB3aWxsICpub3QqIGNyZWF0ZSBQSEkKKyAgLy8vIG5vZGVzLCBvciB2ZXJpZnkgdGhlIGNsb2JiZXJpbmcgZGVmaW5pdGlvbi4gVGhlIGluc2VydGlvbiBwbGFjZSBpcyB1c2VkCisgIC8vLyBzb2xlbHkgdG8gZGV0ZXJtaW5lIHdoZXJlIGluIHRoZSBtZW1vcnlzc2EgYWNjZXNzIGxpc3RzIHRoZSBpbnN0cnVjdGlvbgorICAvLy8gd2lsbCBiZSBwbGFjZWQuIFRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8ga2VlcCBvcmRlcmluZyB0aGUgc2FtZSBhcworICAvLy8gaW5zdHJ1Y3Rpb25zLgorICAvLy8gSXQgd2lsbCByZXR1cm4gdGhlIG5ldyBNZW1vcnlBY2Nlc3MuCisgIC8vLyBOb3RlOiBJZiBhIE1lbW9yeUFjY2VzcyBhbHJlYWR5IGV4aXN0cyBmb3IgSSwgdGhpcyBmdW5jdGlvbiB3aWxsIG1ha2UgaXQKKyAgLy8vIGluYWNjZXNzaWJsZSBhbmQgaXQgKm11c3QqIGhhdmUgcmVtb3ZlTWVtb3J5QWNjZXNzIGNhbGxlZCBvbiBpdC4KKyAgTWVtb3J5QWNjZXNzICpjcmVhdGVNZW1vcnlBY2Nlc3NJbkJCKEluc3RydWN0aW9uICpJLCBNZW1vcnlBY2Nlc3MgKkRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbW9yeVNTQTo6SW5zZXJ0aW9uUGxhY2UgUG9pbnQpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgTWVtb3J5QWNjZXNzIGluIE1lbW9yeVNTQSBiZWZvcmUgb3IgYWZ0ZXIgYW4gZXhpc3RpbmcKKyAgLy8vIE1lbW9yeUFjY2Vzcy4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIHRoZSBuZXcgTWVtb3J5QWNjZXNzLgorICAvLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSBtZW1vcnkgaW5zdHJ1Y3Rpb24gaXMgY3JlYXRlZCB0aGF0IGlzIGJlaW5nCisgIC8vLyB1c2VkIHRvIHJlcGxhY2UgYW4gZXhpc3RpbmcgbWVtb3J5IGluc3RydWN0aW9uLiBJdCB3aWxsICpub3QqIGNyZWF0ZSBQSEkKKyAgLy8vIG5vZGVzLCBvciB2ZXJpZnkgdGhlIGNsb2JiZXJpbmcgZGVmaW5pdGlvbi4KKyAgLy8vCisgIC8vLyBOb3RlOiBJZiBhIE1lbW9yeUFjY2VzcyBhbHJlYWR5IGV4aXN0cyBmb3IgSSwgdGhpcyBmdW5jdGlvbiB3aWxsIG1ha2UgaXQKKyAgLy8vIGluYWNjZXNzaWJsZSBhbmQgaXQgKm11c3QqIGhhdmUgcmVtb3ZlTWVtb3J5QWNjZXNzIGNhbGxlZCBvbiBpdC4KKyAgTWVtb3J5VXNlT3JEZWYgKmNyZWF0ZU1lbW9yeUFjY2Vzc0JlZm9yZShJbnN0cnVjdGlvbiAqSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1vcnlBY2Nlc3MgKkRlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5VXNlT3JEZWYgKkluc2VydFB0KTsKKyAgTWVtb3J5VXNlT3JEZWYgKmNyZWF0ZU1lbW9yeUFjY2Vzc0FmdGVyKEluc3RydWN0aW9uICpJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5QWNjZXNzICpEZWZpbml0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5QWNjZXNzICpJbnNlcnRQdCk7CisKKyAgLy8vIFxicmllZiBSZW1vdmUgYSBNZW1vcnlBY2Nlc3MgZnJvbSBNZW1vcnlTU0EsIGluY2x1ZGluZyB1cGRhdGluZyBhbGwKKyAgLy8vIGRlZmluaXRpb25zIGFuZCB1c2VzLgorICAvLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSBtZW1vcnkgaW5zdHJ1Y3Rpb24gdGhhdCBoYXMgYSBNZW1vcnlBY2Nlc3MKKyAgLy8vIGFzc29jaWF0ZWQgd2l0aCBpdCBpcyBlcmFzZWQgZnJvbSB0aGUgcHJvZ3JhbS4gIEZvciBleGFtcGxlLCBpZiBhIHN0b3JlIG9yCisgIC8vLyBsb2FkIGlzIHNpbXBseSBlcmFzZWQgKG5vdCByZXBsYWNlZCksIHJlbW92ZU1lbW9yeUFjY2VzcyBzaG91bGQgYmUgY2FsbGVkCisgIC8vLyBvbiB0aGUgTWVtb3J5QWNjZXNzIGZvciB0aGF0IHN0b3JlL2xvYWQuCisgIHZvaWQgcmVtb3ZlTWVtb3J5QWNjZXNzKE1lbW9yeUFjY2VzcyAqKTsKKworcHJpdmF0ZToKKyAgLy8gTW92ZSBXaGF0IGJlZm9yZSBXaGVyZSBpbiB0aGUgTWVtb3J5U1NBIElSLgorICB0ZW1wbGF0ZSA8Y2xhc3MgV2hlcmVUeXBlPgorICB2b2lkIG1vdmVUbyhNZW1vcnlVc2VPckRlZiAqV2hhdCwgQmFzaWNCbG9jayAqQkIsIFdoZXJlVHlwZSBXaGVyZSk7CisgIE1lbW9yeUFjY2VzcyAqZ2V0UHJldmlvdXNEZWYoTWVtb3J5QWNjZXNzICopOworICBNZW1vcnlBY2Nlc3MgKmdldFByZXZpb3VzRGVmSW5CbG9jayhNZW1vcnlBY2Nlc3MgKik7CisgIE1lbW9yeUFjY2VzcyAqCisgIGdldFByZXZpb3VzRGVmRnJvbUVuZChCYXNpY0Jsb2NrICosCisgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxCYXNpY0Jsb2NrICosIFRyYWNraW5nVkg8TWVtb3J5QWNjZXNzPj4gJik7CisgIE1lbW9yeUFjY2VzcyAqCisgIGdldFByZXZpb3VzRGVmUmVjdXJzaXZlKEJhc2ljQmxvY2sgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXA8QmFzaWNCbG9jayAqLCBUcmFja2luZ1ZIPE1lbW9yeUFjY2Vzcz4+ICYpOworICBNZW1vcnlBY2Nlc3MgKnJlY3Vyc2VQaGkoTWVtb3J5QWNjZXNzICpQaGkpOworICB0ZW1wbGF0ZSA8Y2xhc3MgUmFuZ2VUeXBlPgorICBNZW1vcnlBY2Nlc3MgKnRyeVJlbW92ZVRyaXZpYWxQaGkoTWVtb3J5UGhpICpQaGksIFJhbmdlVHlwZSAmT3BlcmFuZHMpOworICB2b2lkIGZpeHVwRGVmcyhjb25zdCBTbWFsbFZlY3RvckltcGw8TWVtb3J5QWNjZXNzICo+ICYpOworfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX01FTU9SWVNTQVVQREFURVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Nb2R1bGVTdW1tYXJ5QW5hbHlzaXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTW9kdWxlU3VtbWFyeUFuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmNzg1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTW9kdWxlU3VtbWFyeUFuYWx5c2lzLmgKQEAgLTAsMCArMSw4MSBAQAorLy89PT0tIE1vZHVsZVN1bW1hcnlBbmFseXNpcy5oIC0gTW9kdWxlIHN1bW1hcnkgaW5kZXggYnVpbGRlciAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIFRoaXMgaXMgdGhlIGludGVyZmFjZSB0byBidWlsZCBhIE1vZHVsZVN1bW1hcnlJbmRleCBmb3IgYSBtb2R1bGUuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19NT0RVTEVTVU1NQVJZQU5BTFlTSVNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX01PRFVMRVNVTU1BUllBTkFMWVNJU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlU3VtbWFyeUluZGV4LmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmxvY2tGcmVxdWVuY3lJbmZvOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBNb2R1bGU7CitjbGFzcyBQcm9maWxlU3VtbWFyeUluZm87CisKKy8vLyBEaXJlY3QgZnVuY3Rpb24gdG8gY29tcHV0ZSBhIFxjIE1vZHVsZVN1bW1hcnlJbmRleCBmcm9tIGEgZ2l2ZW4gbW9kdWxlLgorLy8vCisvLy8gSWYgb3BlcmF0aW5nIHdpdGhpbiBhIHBhc3MgbWFuYWdlciB3aGljaCBoYXMgZGVmaW5lZCB3YXlzIHRvIGNvbXB1dGUgdGhlIFxjCisvLy8gQmxvY2tGcmVxdWVuY3lJbmZvIGZvciBhIGdpdmVuIGZ1bmN0aW9uLCB0aGF0IGNhbiBiZSBwcm92aWRlZCB2aWEKKy8vLyBhIHN0ZDo6ZnVuY3Rpb24gY2FsbGJhY2suIE90aGVyd2lzZSwgdGhpcyByb3V0aW5lIHdpbGwgbWFudWFsbHkgY29uc3RydWN0CisvLy8gdGhhdCBpbmZvcm1hdGlvbi4KK01vZHVsZVN1bW1hcnlJbmRleCBidWlsZE1vZHVsZVN1bW1hcnlJbmRleCgKKyAgICBjb25zdCBNb2R1bGUgJk0sCisgICAgc3RkOjpmdW5jdGlvbjxCbG9ja0ZyZXF1ZW5jeUluZm8gKihjb25zdCBGdW5jdGlvbiAmRik+IEdldEJGSUNhbGxiYWNrLAorICAgIFByb2ZpbGVTdW1tYXJ5SW5mbyAqUFNJKTsKKworLy8vIEFuYWx5c2lzIHBhc3MgdG8gcHJvdmlkZSB0aGUgTW9kdWxlU3VtbWFyeUluZGV4IG9iamVjdC4KK2NsYXNzIE1vZHVsZVN1bW1hcnlJbmRleEFuYWx5c2lzCisgICAgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48TW9kdWxlU3VtbWFyeUluZGV4QW5hbHlzaXM+IHsKKyAgZnJpZW5kIEFuYWx5c2lzSW5mb01peGluPE1vZHVsZVN1bW1hcnlJbmRleEFuYWx5c2lzPjsKKworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCitwdWJsaWM6CisgIHVzaW5nIFJlc3VsdCA9IE1vZHVsZVN1bW1hcnlJbmRleDsKKworICBSZXN1bHQgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gTGVnYWN5IHdyYXBwZXIgcGFzcyB0byBwcm92aWRlIHRoZSBNb2R1bGVTdW1tYXJ5SW5kZXggb2JqZWN0LgorY2xhc3MgTW9kdWxlU3VtbWFyeUluZGV4V3JhcHBlclBhc3MgOiBwdWJsaWMgTW9kdWxlUGFzcyB7CisgIE9wdGlvbmFsPE1vZHVsZVN1bW1hcnlJbmRleD4gSW5kZXg7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgTW9kdWxlU3VtbWFyeUluZGV4V3JhcHBlclBhc3MoKTsKKworICAvLy8gR2V0IHRoZSBpbmRleCBidWlsdCBieSBwYXNzCisgIE1vZHVsZVN1bW1hcnlJbmRleCAmZ2V0SW5kZXgoKSB7IHJldHVybiAqSW5kZXg7IH0KKyAgY29uc3QgTW9kdWxlU3VtbWFyeUluZGV4ICZnZXRJbmRleCgpIGNvbnN0IHsgcmV0dXJuICpJbmRleDsgfQorCisgIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICZNKSBvdmVycmlkZTsKKyAgYm9vbCBkb0ZpbmFsaXphdGlvbihNb2R1bGUgJk0pIG92ZXJyaWRlOworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gY3JlYXRlTW9kdWxlU3VtbWFyeUluZGV4V3JhcHBlclBhc3MgLSBUaGlzIHBhc3MgYnVpbGRzIGEgTW9kdWxlU3VtbWFyeUluZGV4CisvLyBvYmplY3QgZm9yIHRoZSBtb2R1bGUsIHRvIGJlIHdyaXR0ZW4gdG8gYml0Y29kZSBvciBMTFZNIGFzc2VtYmx5LgorLy8KK01vZHVsZVBhc3MgKmNyZWF0ZU1vZHVsZVN1bW1hcnlJbmRleFdyYXBwZXJQYXNzKCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX01PRFVMRVNVTU1BUllBTkFMWVNJU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL011c3RFeGVjdXRlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL011c3RFeGVjdXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI0OGJiNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvTXVzdEV4ZWN1dGUuaApAQCAtMCwwICsxLDY0IEBACisvLz09PS0gTXVzdEV4ZWN1dGUuaCAtIElzIGFuIGluc3RydWN0aW9uIGtub3duIHRvIGV4ZWN1dGUtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gQ29udGFpbnMgYSBjb2xsZWN0aW9uIG9mIHJvdXRpbmVzIGZvciBkZXRlcm1pbmluZyBpZiBhIGdpdmVuIGluc3RydWN0aW9uIGlzCisvLy8gZ3VhcmFudGVlZCB0byBleGVjdXRlIGlmIGEgZ2l2ZW4gcG9pbnQgaW4gY29udHJvbCBmbG93IGlzIHJlYWNoZWQuICBUaGUgbW9zdAorLy8vIGNvbW1vbiBleGFtcGxlIGlzIGFuIGluc3RydWN0aW9uIHdpdGhpbiBhIGxvb3AgYmVpbmcgcHJvdmFibHkgZXhlY3V0ZWQgaWYgd2UKKy8vLyBicmFuY2ggdG8gdGhlIGhlYWRlciBvZiBpdCdzIGNvbnRhaW5pbmcgbG9vcC4gIAorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfTVVTVEVYRUNVVEVfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX01VU1RFWEVDVVRFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9FSFBlcnNvbmFsaXRpZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgRG9taW5hdG9yVHJlZTsKK2NsYXNzIExvb3A7CisKKy8vLyBcYnJpZWYgQ2FwdHVyZXMgbG9vcCBzYWZldHkgaW5mb3JtYXRpb24uCisvLy8gSXQga2VlcCBpbmZvcm1hdGlvbiBmb3IgbG9vcCAmIGl0cyBoZWFkZXIgbWF5IHRocm93IGV4Y2VwdGlvbiBvciBvdGhlcndpc2UKKy8vLyBleGl0IGFibm9ybWFseSBvbiBhbnkgaXRlcmF0aW9uIG9mIHRoZSBsb29wIHdoaWNoIG1pZ2h0IGFjdHVhbGx5IGV4ZWN1dGUKKy8vLyBhdCBydW50aW1lLiAgVGhlIHByaW1hcnkgd2F5IHRvIGNvbnN1bWUgdGhpcyBpbmZyb21hdGlvbiBpcyB2aWEKKy8vLyBpc0d1YXJhbnRlZWRUb0V4ZWN1dGUgYmVsb3csIGJ1dCBzb21lIGNhbGxlcnMgYmFpbG91dCBvciBmYWxsYmFjayB0bworLy8vIGFsdGVybmF0ZSByZWFzb25pbmcgaWYgYSBsb29wIGNvbnRhaW5zIGFueSBpbXBsaWNpdCBjb250cm9sIGZsb3cuCitzdHJ1Y3QgTG9vcFNhZmV0eUluZm8geworICBib29sIE1heVRocm93ID0gZmFsc2U7ICAgICAgIC8vIFRoZSBjdXJyZW50IGxvb3AgY29udGFpbnMgYW4gaW5zdHJ1Y3Rpb24gd2hpY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXkgdGhyb3cuCisgIGJvb2wgSGVhZGVyTWF5VGhyb3cgPSBmYWxzZTsgLy8gU2FtZSBhcyBwcmV2aW91cywgYnV0IHNwZWNpZmljIHRvIGxvb3AgaGVhZGVyCisgIC8vIFVzZWQgdG8gdXBkYXRlIGZ1bmNsZXQgYnVuZGxlIG9wZXJhbmRzLgorICBEZW5zZU1hcDxCYXNpY0Jsb2NrICosIENvbG9yVmVjdG9yPiBCbG9ja0NvbG9yczsKKworICBMb29wU2FmZXR5SW5mbygpID0gZGVmYXVsdDsKK307CisKKy8vLyBcYnJpZWYgQ29tcHV0ZXMgc2FmZXR5IGluZm9ybWF0aW9uIGZvciBhIGxvb3AgY2hlY2tzIGxvb3AgYm9keSAmIGhlYWRlciBmb3IKKy8vLyB0aGUgcG9zc2liaWxpdHkgb2YgbWF5IHRocm93IGV4Y2VwdGlvbiwgaXQgdGFrZXMgTG9vcFNhZmV0eUluZm8gYW5kIGxvb3AgYXMKKy8vLyBhcmd1bWVudC4gVXBkYXRlcyBzYWZldHkgaW5mb3JtYXRpb24gaW4gTG9vcFNhZmV0eUluZm8gYXJndW1lbnQuCisvLy8gTm90ZTogVGhpcyBpcyBkZWZpbmVkIHRvIGNsZWFyIGFuZCByZWluaXRpYWxpemUgYW4gYWxyZWFkeSBpbml0aWFsaXplZAorLy8vIExvb3BTYWZldHlJbmZvLiAgU29tZSBjYWxsZXJzIHJlbHkgb24gdGhpcyBmYWN0Lgordm9pZCBjb21wdXRlTG9vcFNhZmV0eUluZm8oTG9vcFNhZmV0eUluZm8gKiwgTG9vcCAqKTsKKworLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaW4gYSBsb29wIGlzIGd1YXJhbnRlZWQgdG8gZXhlY3V0ZSBhdCBsZWFzdAorLy8vIG9uY2UgKHVuZGVyIHRoZSBhc3N1bXB0aW9uIHRoYXQgdGhlIGxvb3AgaXMgZW50ZXJlZCkuCitib29sIGlzR3VhcmFudGVlZFRvRXhlY3V0ZShjb25zdCBJbnN0cnVjdGlvbiAmSW5zdCwgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpDdXJMb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcFNhZmV0eUluZm8gKlNhZmV0eUluZm8pOworICAKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL09iakNBUkNBbGlhc0FuYWx5c2lzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL09iakNBUkNBbGlhc0FuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI1MjRmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvT2JqQ0FSQ0FsaWFzQW5hbHlzaXMuaApAQCAtMCwwICsxLDk3IEBACisvLz09PS0gT2JqQ0FSQ0FsaWFzQW5hbHlzaXMuaCAtIE9iakMgQVJDIEFsaWFzIEFuYWx5c2lzIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIGRlY2xhcmVzIGEgc2ltcGxlIEFSQy1hd2FyZSBBbGlhc0FuYWx5c2lzIHVzaW5nIHNwZWNpYWwga25vd2xlZGdlCisvLy8gb2YgT2JqZWN0aXZlIEMgdG8gZW5oYW5jZSBvdGhlciBvcHRpbWl6YXRpb24gcGFzc2VzIHdoaWNoIHJlbHkgb24gdGhlIEFsaWFzCisvLy8gQW5hbHlzaXMgaW5mcmFzdHJ1Y3R1cmUuCisvLy8KKy8vLyBXQVJOSU5HOiBUaGlzIGZpbGUga25vd3MgYWJvdXQgY2VydGFpbiBsaWJyYXJ5IGZ1bmN0aW9ucy4gSXQgcmVjb2duaXplcyB0aGVtCisvLy8gYnkgbmFtZSwgYW5kIGhhcmR3aXJlcyBrbm93bGVkZ2Ugb2YgdGhlaXIgc2VtYW50aWNzLgorLy8vCisvLy8gV0FSTklORzogVGhpcyBmaWxlIGtub3dzIGFib3V0IGhvdyBjZXJ0YWluIE9iamVjdGl2ZS1DIGxpYnJhcnkgZnVuY3Rpb25zIGFyZQorLy8vIHVzZWQuIE5haXZlIExMVk0gSVIgdHJhbnNmb3JtYXRpb25zIHdoaWNoIHdvdWxkIG90aGVyd2lzZSBiZQorLy8vIGJlaGF2aW9yLXByZXNlcnZpbmcgbWF5IGJyZWFrIHRoZXNlIGFzc3VtcHRpb25zLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfT0JKQ0FSQ0FMSUFTQU5BTFlTSVNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX09CSkNBUkNBTElBU0FOQUxZU0lTX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb2JqY2FyYyB7CisKKy8vLyBcYnJpZWYgVGhpcyBpcyBhIHNpbXBsZSBhbGlhcyBhbmFseXNpcyBpbXBsZW1lbnRhdGlvbiB0aGF0IHVzZXMga25vd2xlZGdlCisvLy8gb2YgQVJDIGNvbnN0cnVjdHMgdG8gYW5zd2VyIHF1ZXJpZXMuCisvLy8KKy8vLyBUT0RPOiBUaGlzIGNsYXNzIGNvdWxkIGJlIGdlbmVyYWxpemVkIHRvIGtub3cgYWJvdXQgb3RoZXIgT2JqQy1zcGVjaWZpYworLy8vIHRyaWNrcy4gU3VjaCBhcyBrbm93aW5nIHRoYXQgaXZhcnMgaW4gdGhlIG5vbi1mcmFnaWxlIEFCSSBhcmUgbm9uLWFsaWFzaW5nCisvLy8gZXZlbiB0aG91Z2ggdGhlaXIgb2Zmc2V0cyBhcmUgZHluYW1pYy4KK2NsYXNzIE9iakNBUkNBQVJlc3VsdCA6IHB1YmxpYyBBQVJlc3VsdEJhc2U8T2JqQ0FSQ0FBUmVzdWx0PiB7CisgIGZyaWVuZCBBQVJlc3VsdEJhc2U8T2JqQ0FSQ0FBUmVzdWx0PjsKKworICBjb25zdCBEYXRhTGF5b3V0ICZETDsKKworcHVibGljOgorICBleHBsaWNpdCBPYmpDQVJDQUFSZXN1bHQoY29uc3QgRGF0YUxheW91dCAmREwpIDogQUFSZXN1bHRCYXNlKCksIERMKERMKSB7fQorICBPYmpDQVJDQUFSZXN1bHQoT2JqQ0FSQ0FBUmVzdWx0ICYmQXJnKQorICAgICAgOiBBQVJlc3VsdEJhc2Uoc3RkOjptb3ZlKEFyZykpLCBETChBcmcuREwpIHt9CisKKyAgLy8vIEhhbmRsZSBpbnZhbGlkYXRpb24gZXZlbnRzIGZyb20gdGhlIG5ldyBwYXNzIG1hbmFnZXIuCisgIC8vLworICAvLy8gQnkgZGVmaW5pdGlvbiwgdGhpcyByZXN1bHQgaXMgc3RhdGVsZXNzIGFuZCBzbyByZW1haW5zIHZhbGlkLgorICBib29sIGludmFsaWRhdGUoRnVuY3Rpb24gJiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJiwKKyAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyOjpJbnZhbGlkYXRvciAmKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgQWxpYXNSZXN1bHQgYWxpYXMoY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvY0EsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2NCKTsKKyAgYm9vbCBwb2ludHNUb0NvbnN0YW50TWVtb3J5KGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MsIGJvb2wgT3JMb2NhbCk7CisKKyAgdXNpbmcgQUFSZXN1bHRCYXNlOjpnZXRNb2RSZWZCZWhhdmlvcjsKKyAgRnVuY3Rpb25Nb2RSZWZCZWhhdmlvciBnZXRNb2RSZWZCZWhhdmlvcihjb25zdCBGdW5jdGlvbiAqRik7CisKKyAgdXNpbmcgQUFSZXN1bHRCYXNlOjpnZXRNb2RSZWZJbmZvOworICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MpOworfTsKKworLy8vIEFuYWx5c2lzIHBhc3MgcHJvdmlkaW5nIGEgbmV2ZXItaW52YWxpZGF0ZWQgYWxpYXMgYW5hbHlzaXMgcmVzdWx0LgorY2xhc3MgT2JqQ0FSQ0FBIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPE9iakNBUkNBQT4geworICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48T2JqQ0FSQ0FBPjsKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworcHVibGljOgorICB0eXBlZGVmIE9iakNBUkNBQVJlc3VsdCBSZXN1bHQ7CisKKyAgT2JqQ0FSQ0FBUmVzdWx0IHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBMZWdhY3kgd3JhcHBlciBwYXNzIHRvIHByb3ZpZGUgdGhlIE9iakNBUkNBQVJlc3VsdCBvYmplY3QuCitjbGFzcyBPYmpDQVJDQUFXcmFwcGVyUGFzcyA6IHB1YmxpYyBJbW11dGFibGVQYXNzIHsKKyAgc3RkOjp1bmlxdWVfcHRyPE9iakNBUkNBQVJlc3VsdD4gUmVzdWx0OworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIE9iakNBUkNBQVdyYXBwZXJQYXNzKCk7CisKKyAgT2JqQ0FSQ0FBUmVzdWx0ICZnZXRSZXN1bHQoKSB7IHJldHVybiAqUmVzdWx0OyB9CisgIGNvbnN0IE9iakNBUkNBQVJlc3VsdCAmZ2V0UmVzdWx0KCkgY29uc3QgeyByZXR1cm4gKlJlc3VsdDsgfQorCisgIGJvb2wgZG9Jbml0aWFsaXphdGlvbihNb2R1bGUgJk0pIG92ZXJyaWRlOworICBib29sIGRvRmluYWxpemF0aW9uKE1vZHVsZSAmTSkgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCit9IC8vIG5hbWVzcGFjZSBvYmpjYXJjCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9PYmpDQVJDQW5hbHlzaXNVdGlscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9PYmpDQVJDQW5hbHlzaXNVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5NjU3M2YKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL09iakNBUkNBbmFseXNpc1V0aWxzLmgKQEAgLTAsMCArMSwyOTggQEAKKy8vPT09LSBPYmpDQVJDQW5hbHlzaXNVdGlscy5oIC0gT2JqQyBBUkMgQW5hbHlzaXMgVXRpbGl0aWVzIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgZGVmaW5lcyBjb21tb24gYW5hbHlzaXMgdXRpbGl0aWVzIHVzZWQgYnkgdGhlIE9iakMgQVJDIE9wdGltaXplci4KKy8vLyBBUkMgc3RhbmRzIGZvciBBdXRvbWF0aWMgUmVmZXJlbmNlIENvdW50aW5nIGFuZCBpcyBhIHN5c3RlbSBmb3IgbWFuYWdpbmcKKy8vLyByZWZlcmVuY2UgY291bnRzIGZvciBvYmplY3RzIGluIE9iamVjdGl2ZSBDLgorLy8vCisvLy8gV0FSTklORzogVGhpcyBmaWxlIGtub3dzIGFib3V0IGNlcnRhaW4gbGlicmFyeSBmdW5jdGlvbnMuIEl0IHJlY29nbml6ZXMgdGhlbQorLy8vIGJ5IG5hbWUsIGFuZCBoYXJkd2lyZXMga25vd2xlZGdlIG9mIHRoZWlyIHNlbWFudGljcy4KKy8vLworLy8vIFdBUk5JTkc6IFRoaXMgZmlsZSBrbm93cyBhYm91dCBob3cgY2VydGFpbiBPYmplY3RpdmUtQyBsaWJyYXJ5IGZ1bmN0aW9ucyBhcmUKKy8vLyB1c2VkLiBOYWl2ZSBMTFZNIElSIHRyYW5zZm9ybWF0aW9ucyB3aGljaCB3b3VsZCBvdGhlcndpc2UgYmUKKy8vLyBiZWhhdmlvci1wcmVzZXJ2aW5nIG1heSBicmVhayB0aGVzZSBhc3N1bXB0aW9ucy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0xJQl9BTkFMWVNJU19PQkpDQVJDQU5BTFlTSVNVVElMU19ICisjZGVmaW5lIExMVk1fTElCX0FOQUxZU0lTX09CSkNBUkNBTkFMWVNJU1VUSUxTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU3dpdGNoLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9PYmpDQVJDSW5zdEtpbmQuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvVmFsdWVUcmFja2luZy5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIHJhd19vc3RyZWFtOworfQorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb2JqY2FyYyB7CisKKy8vLyBcYnJpZWYgQSBoYW5keSBvcHRpb24gdG8gZW5hYmxlL2Rpc2FibGUgYWxsIEFSQyBPcHRpbWl6YXRpb25zLgorZXh0ZXJuIGJvb2wgRW5hYmxlQVJDT3B0czsKKworLy8vIFxicmllZiBUZXN0IGlmIHRoZSBnaXZlbiBtb2R1bGUgbG9va3MgaW50ZXJlc3RpbmcgdG8gcnVuIEFSQyBvcHRpbWl6YXRpb24KKy8vLyBvbi4KK2lubGluZSBib29sIE1vZHVsZUhhc0FSQyhjb25zdCBNb2R1bGUgJk0pIHsKKyAgcmV0dXJuCisgICAgTS5nZXROYW1lZFZhbHVlKCJvYmpjX3JldGFpbiIpIHx8CisgICAgTS5nZXROYW1lZFZhbHVlKCJvYmpjX3JlbGVhc2UiKSB8fAorICAgIE0uZ2V0TmFtZWRWYWx1ZSgib2JqY19hdXRvcmVsZWFzZSIpIHx8CisgICAgTS5nZXROYW1lZFZhbHVlKCJvYmpjX3JldGFpbkF1dG9yZWxlYXNlZFJldHVyblZhbHVlIikgfHwKKyAgICBNLmdldE5hbWVkVmFsdWUoIm9iamNfdW5zYWZlQ2xhaW1BdXRvcmVsZWFzZWRSZXR1cm5WYWx1ZSIpIHx8CisgICAgTS5nZXROYW1lZFZhbHVlKCJvYmpjX3JldGFpbkJsb2NrIikgfHwKKyAgICBNLmdldE5hbWVkVmFsdWUoIm9iamNfYXV0b3JlbGVhc2VSZXR1cm5WYWx1ZSIpIHx8CisgICAgTS5nZXROYW1lZFZhbHVlKCJvYmpjX2F1dG9yZWxlYXNlUG9vbFB1c2giKSB8fAorICAgIE0uZ2V0TmFtZWRWYWx1ZSgib2JqY19sb2FkV2Vha1JldGFpbmVkIikgfHwKKyAgICBNLmdldE5hbWVkVmFsdWUoIm9iamNfbG9hZFdlYWsiKSB8fAorICAgIE0uZ2V0TmFtZWRWYWx1ZSgib2JqY19kZXN0cm95V2VhayIpIHx8CisgICAgTS5nZXROYW1lZFZhbHVlKCJvYmpjX3N0b3JlV2VhayIpIHx8CisgICAgTS5nZXROYW1lZFZhbHVlKCJvYmpjX2luaXRXZWFrIikgfHwKKyAgICBNLmdldE5hbWVkVmFsdWUoIm9iamNfbW92ZVdlYWsiKSB8fAorICAgIE0uZ2V0TmFtZWRWYWx1ZSgib2JqY19jb3B5V2VhayIpIHx8CisgICAgTS5nZXROYW1lZFZhbHVlKCJvYmpjX3JldGFpbmVkT2JqZWN0IikgfHwKKyAgICBNLmdldE5hbWVkVmFsdWUoIm9iamNfdW5yZXRhaW5lZE9iamVjdCIpIHx8CisgICAgTS5nZXROYW1lZFZhbHVlKCJvYmpjX3VucmV0YWluZWRQb2ludGVyIikgfHwKKyAgICBNLmdldE5hbWVkVmFsdWUoImNsYW5nLmFyYy51c2UiKTsKK30KKworLy8vIFxicmllZiBUaGlzIGlzIGEgd3JhcHBlciBhcm91bmQgZ2V0VW5kZXJseWluZ09iamVjdCB3aGljaCBhbHNvIGtub3dzIGhvdyB0bworLy8vIGxvb2sgdGhyb3VnaCBvYmpjX3JldGFpbiBhbmQgb2JqY19hdXRvcmVsZWFzZSBjYWxscywgd2hpY2ggd2Uga25vdyB0byByZXR1cm4KKy8vLyB0aGVpciBhcmd1bWVudCB2ZXJiYXRpbS4KK2lubGluZSBjb25zdCBWYWx1ZSAqR2V0VW5kZXJseWluZ09iakNQdHIoY29uc3QgVmFsdWUgKlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCkgeworICBmb3IgKDs7KSB7CisgICAgViA9IEdldFVuZGVybHlpbmdPYmplY3QoViwgREwpOworICAgIGlmICghSXNGb3J3YXJkaW5nKEdldEJhc2ljQVJDSW5zdEtpbmQoVikpKQorICAgICAgYnJlYWs7CisgICAgViA9IGNhc3Q8Q2FsbEluc3Q+KFYpLT5nZXRBcmdPcGVyYW5kKDApOworICB9CisKKyAgcmV0dXJuIFY7Cit9CisKKy8vLyBBIHdyYXBwZXIgZm9yIEdldFVuZGVybHlpbmdPYmpDUHRyIHVzZWQgZm9yIHJlc3VsdHMgbWVtb2l6YXRpb24uCitpbmxpbmUgY29uc3QgVmFsdWUgKgorR2V0VW5kZXJseWluZ09iakNQdHJDYWNoZWQoY29uc3QgVmFsdWUgKlYsIGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXA8Y29uc3QgVmFsdWUgKiwgY29uc3QgVmFsdWUgKj4gJkNhY2hlKSB7CisgIGlmIChhdXRvIEluQ2FjaGUgPSBDYWNoZS5sb29rdXAoVikpCisgICAgcmV0dXJuIEluQ2FjaGU7CisKKyAgcmV0dXJuIENhY2hlW1ZdID0gR2V0VW5kZXJseWluZ09iakNQdHIoViwgREwpOworfQorCisvLy8gVGhlIFJDSWRlbnRpdHkgcm9vdCBvZiBhIHZhbHVlIFxwIFYgaXMgYSBkb21pbmF0aW5nIHZhbHVlIFUgZm9yIHdoaWNoCisvLy8gcmV0YWluaW5nIG9yIHJlbGVhc2luZyBVIGlzIGVxdWl2YWxlbnQgdG8gcmV0YWluaW5nIG9yIHJlbGVhc2luZyBWLiBJbiBvdGhlcgorLy8vIHdvcmRzLCBBUkMgb3BlcmF0aW9ucyBvbiBccCBWIGFyZSBlcXVpdmFsZW50IHRvIEFSQyBvcGVyYXRpb25zIG9uIFxwIFUuCisvLy8KKy8vLyBXZSB1c2UgdGhpcyBpbiB0aGUgQVJDIG9wdGltaXplciB0byBtYWtlIGl0IGVhc2llciB0byBtYXRjaCB1cCBBUkMKKy8vLyBvcGVyYXRpb25zIGJ5IGFsd2F5cyBtYXBwaW5nIEFSQyBvcGVyYXRpb25zIHRvIFJDSWRlbnRpdHlSb290cyBpbnN0ZWFkIG9mCisvLy8gcG9pbnRlcnMgdGhlbXNlbHZlcy4KKy8vLworLy8vIFRoZSB0d28gd2F5cyB0aGF0IHdlIHNlZSBSQ0lkZW50aWNhbCB2YWx1ZXMgaW4gT2JqQyBhcmUgdmlhOgorLy8vCisvLy8gICAxLiBQb2ludGVyQ2FzdHMKKy8vLyAgIDIuIEZvcndhcmRpbmcgQ2FsbHMgdGhhdCByZXR1cm4gdGhlaXIgYXJndW1lbnQgdmVyYmF0aW0uCisvLy8KKy8vLyBUaHVzIHRoaXMgZnVuY3Rpb24gc3RyaXBzIG9mZiBwb2ludGVyIGNhc3RzIGFuZCBmb3J3YXJkaW5nIGNhbGxzLiAqTk9URSoKKy8vLyBUaGlzIGltcGxpZXMgdGhhdCB0d28gUkNJZGVudGljYWwgdmFsdWVzIG11c3QgYWxpYXMuCitpbmxpbmUgY29uc3QgVmFsdWUgKkdldFJDSWRlbnRpdHlSb290KGNvbnN0IFZhbHVlICpWKSB7CisgIGZvciAoOzspIHsKKyAgICBWID0gVi0+c3RyaXBQb2ludGVyQ2FzdHMoKTsKKyAgICBpZiAoIUlzRm9yd2FyZGluZyhHZXRCYXNpY0FSQ0luc3RLaW5kKFYpKSkKKyAgICAgIGJyZWFrOworICAgIFYgPSBjYXN0PENhbGxJbnN0PihWKS0+Z2V0QXJnT3BlcmFuZCgwKTsKKyAgfQorICByZXR1cm4gVjsKK30KKworLy8vIEhlbHBlciB3aGljaCBjYWxscyBjb25zdCBWYWx1ZSAqR2V0UkNJZGVudGl0eVJvb3QoY29uc3QgVmFsdWUgKlYpIGFuZCBqdXN0CisvLy8gY2FzdHMgYXdheSB0aGUgY29uc3Qgb2YgdGhlIHJlc3VsdC4gRm9yIGRvY3VtZW50YXRpb24gYWJvdXQgd2hhdCBhbgorLy8vIFJDSWRlbnRpdHlSb290IChhbmQgYnkgZXh0ZW5zaW9uIEdldFJDSWRlbnRpdHlSb290IGlzKSBsb29rIGF0IHRoYXQKKy8vLyBmdW5jdGlvbi4KK2lubGluZSBWYWx1ZSAqR2V0UkNJZGVudGl0eVJvb3QoVmFsdWUgKlYpIHsKKyAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUgKj4oR2V0UkNJZGVudGl0eVJvb3QoKGNvbnN0IFZhbHVlICopVikpOworfQorCisvLy8gXGJyaWVmIEFzc3VtaW5nIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiBpcyBvbmUgb2YgdGhlIHNwZWNpYWwgY2FsbHMgc3VjaCBhcworLy8vIG9iamNfcmV0YWluIG9yIG9iamNfcmVsZWFzZSwgcmV0dXJuIHRoZSBSQ0lkZW50aXR5IHJvb3Qgb2YgdGhlIGFyZ3VtZW50IG9mCisvLy8gdGhlIGNhbGwuCitpbmxpbmUgVmFsdWUgKkdldEFyZ1JDSWRlbnRpdHlSb290KFZhbHVlICpJbnN0KSB7CisgIHJldHVybiBHZXRSQ0lkZW50aXR5Um9vdChjYXN0PENhbGxJbnN0PihJbnN0KS0+Z2V0QXJnT3BlcmFuZCgwKSk7Cit9CisKK2lubGluZSBib29sIElzTnVsbE9yVW5kZWYoY29uc3QgVmFsdWUgKlYpIHsKKyAgcmV0dXJuIGlzYTxDb25zdGFudFBvaW50ZXJOdWxsPihWKSB8fCBpc2E8VW5kZWZWYWx1ZT4oVik7Cit9CisKK2lubGluZSBib29sIElzTm9vcEluc3RydWN0aW9uKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgIHJldHVybiBpc2E8Qml0Q2FzdEluc3Q+KEkpIHx8CisgICAgKGlzYTxHZXRFbGVtZW50UHRySW5zdD4oSSkgJiYKKyAgICAgY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oSSktPmhhc0FsbFplcm9JbmRpY2VzKCkpOworfQorCisvLy8gXGJyaWVmIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgcG9zc2libGUgYSByZXRhaW5hYmxlIG9iamVjdCBwb2ludGVyLgoraW5saW5lIGJvb2wgSXNQb3RlbnRpYWxSZXRhaW5hYmxlT2JqUHRyKGNvbnN0IFZhbHVlICpPcCkgeworICAvLyBQb2ludGVycyB0byBzdGF0aWMgb3Igc3RhY2sgc3RvcmFnZSBhcmUgbm90IHZhbGlkIHJldGFpbmFibGUgb2JqZWN0CisgIC8vIHBvaW50ZXJzLgorICBpZiAoaXNhPENvbnN0YW50PihPcCkgfHwgaXNhPEFsbG9jYUluc3Q+KE9wKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIC8vIFNwZWNpYWwgYXJndW1lbnRzIGNhbiBub3QgYmUgYSB2YWxpZCByZXRhaW5hYmxlIG9iamVjdCBwb2ludGVyLgorICBpZiAoY29uc3QgQXJndW1lbnQgKkFyZyA9IGR5bl9jYXN0PEFyZ3VtZW50PihPcCkpCisgICAgaWYgKEFyZy0+aGFzQnlWYWxBdHRyKCkgfHwKKyAgICAgICAgQXJnLT5oYXNJbkFsbG9jYUF0dHIoKSB8fAorICAgICAgICBBcmctPmhhc05lc3RBdHRyKCkgfHwKKyAgICAgICAgQXJnLT5oYXNTdHJ1Y3RSZXRBdHRyKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIC8vIE9ubHkgY29uc2lkZXIgdmFsdWVzIHdpdGggcG9pbnRlciB0eXBlcy4KKyAgLy8KKyAgLy8gSXQgc2VlbWVzIGludHVpdGl2ZSB0byBleGNsdWRlIGZ1bmN0aW9uIHBvaW50ZXIgdHlwZXMgYXMgd2VsbCwgc2luY2UKKyAgLy8gZnVuY3Rpb25zIGFyZSBuZXZlciByZXRhaW5hYmxlIG9iamVjdCBwb2ludGVycywgaG93ZXZlciBjbGFuZyBvY2Nhc2lvbmFsbHkKKyAgLy8gYml0Y2FzdHMgcmV0YWluYWJsZSBvYmplY3QgcG9pbnRlcnMgdG8gZnVuY3Rpb24tcG9pbnRlciB0eXBlIHRlbXBvcmFyaWx5LgorICBQb2ludGVyVHlwZSAqVHkgPSBkeW5fY2FzdDxQb2ludGVyVHlwZT4oT3AtPmdldFR5cGUoKSk7CisgIGlmICghVHkpCisgICAgcmV0dXJuIGZhbHNlOworICAvLyBDb25zZXJ2YXRpdmVseSBhc3N1bWUgYW55dGhpbmcgZWxzZSBpcyBhIHBvdGVudGlhbCByZXRhaW5hYmxlIG9iamVjdAorICAvLyBwb2ludGVyLgorICByZXR1cm4gdHJ1ZTsKK30KKworaW5saW5lIGJvb2wgSXNQb3RlbnRpYWxSZXRhaW5hYmxlT2JqUHRyKGNvbnN0IFZhbHVlICpPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNBbmFseXNpcyAmQUEpIHsKKyAgLy8gRmlyc3QgbWFrZSB0aGUgcnVkaW1lbnRhcnkgY2hlY2suCisgIGlmICghSXNQb3RlbnRpYWxSZXRhaW5hYmxlT2JqUHRyKE9wKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gT2JqZWN0cyBpbiBjb25zdGFudCBtZW1vcnkgYXJlIG5vdCByZWZlcmVuY2UtY291bnRlZC4KKyAgaWYgKEFBLnBvaW50c1RvQ29uc3RhbnRNZW1vcnkoT3ApKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBQb2ludGVycyBpbiBjb25zdGFudCBtZW1vcnkgYXJlIG5vdCBwb2ludGluZyB0byByZWZlcmVuY2UtY291bnRlZCBvYmplY3RzLgorICBpZiAoY29uc3QgTG9hZEluc3QgKkxJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KE9wKSkKKyAgICBpZiAoQUEucG9pbnRzVG9Db25zdGFudE1lbW9yeShMSS0+Z2V0UG9pbnRlck9wZXJhbmQoKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gT3RoZXJ3aXNlIGFzc3VtZSB0aGUgd29yc3QuCisgIHJldHVybiB0cnVlOworfQorCisvLy8gXGJyaWVmIEhlbHBlciBmb3IgR2V0QVJDSW5zdEtpbmQuIERldGVybWluZXMgd2hhdCBraW5kIG9mIGNvbnN0cnVjdCBDUworLy8vIGlzLgoraW5saW5lIEFSQ0luc3RLaW5kIEdldENhbGxTaXRlQ2xhc3MoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MpIHsKKyAgZm9yIChJbW11dGFibGVDYWxsU2l0ZTo6YXJnX2l0ZXJhdG9yIEkgPSBDUy5hcmdfYmVnaW4oKSwgRSA9IENTLmFyZ19lbmQoKTsKKyAgICAgICBJICE9IEU7ICsrSSkKKyAgICBpZiAoSXNQb3RlbnRpYWxSZXRhaW5hYmxlT2JqUHRyKCpJKSkKKyAgICAgIHJldHVybiBDUy5vbmx5UmVhZHNNZW1vcnkoKSA/IEFSQ0luc3RLaW5kOjpVc2VyIDogQVJDSW5zdEtpbmQ6OkNhbGxPclVzZXI7CisKKyAgcmV0dXJuIENTLm9ubHlSZWFkc01lbW9yeSgpID8gQVJDSW5zdEtpbmQ6Ok5vbmUgOiBBUkNJbnN0S2luZDo6Q2FsbDsKK30KKworLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHZhbHVlIHJlZmVycyB0byBhIGRpc3RpbmN0IGFuZCBpZGVudGlmaWFibGUKKy8vLyBvYmplY3QuCisvLy8KKy8vLyBUaGlzIGlzIHNpbWlsYXIgdG8gQWxpYXNBbmFseXNpcydzIGlzSWRlbnRpZmllZE9iamVjdCwgZXhjZXB0IHRoYXQgaXQgdXNlcworLy8vIHNwZWNpYWwga25vd2xlZGdlIG9mIE9iakMgY29udmVudGlvbnMuCitpbmxpbmUgYm9vbCBJc09iakNJZGVudGlmaWVkT2JqZWN0KGNvbnN0IFZhbHVlICpWKSB7CisgIC8vIEFzc3VtZSB0aGF0IGNhbGwgcmVzdWx0cyBhbmQgYXJndW1lbnRzIGhhdmUgdGhlaXIgb3duICJwcm92ZW5hbmNlIi4KKyAgLy8gQ29uc3RhbnRzIChpbmNsdWRpbmcgR2xvYmFsVmFyaWFibGVzKSBhbmQgQWxsb2NhcyBhcmUgbmV2ZXIKKyAgLy8gcmVmZXJlbmNlLWNvdW50ZWQuCisgIGlmIChpc2E8Q2FsbEluc3Q+KFYpIHx8IGlzYTxJbnZva2VJbnN0PihWKSB8fAorICAgICAgaXNhPEFyZ3VtZW50PihWKSB8fCBpc2E8Q29uc3RhbnQ+KFYpIHx8CisgICAgICBpc2E8QWxsb2NhSW5zdD4oVikpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKGNvbnN0IExvYWRJbnN0ICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PihWKSkgeworICAgIGNvbnN0IFZhbHVlICpQb2ludGVyID0KKyAgICAgIEdldFJDSWRlbnRpdHlSb290KExJLT5nZXRQb2ludGVyT3BlcmFuZCgpKTsKKyAgICBpZiAoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFyaWFibGU+KFBvaW50ZXIpKSB7CisgICAgICAvLyBBIGNvbnN0YW50IHBvaW50ZXIgY2FuJ3QgYmUgcG9pbnRpbmcgdG8gYW4gb2JqZWN0IG9uIHRoZSBoZWFwLiBJdCBtYXkKKyAgICAgIC8vIGJlIHJlZmVyZW5jZS1jb3VudGVkLCBidXQgaXQgd29uJ3QgYmUgZGVsZXRlZC4KKyAgICAgIGlmIChHVi0+aXNDb25zdGFudCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIFN0cmluZ1JlZiBOYW1lID0gR1YtPmdldE5hbWUoKTsKKyAgICAgIC8vIFRoZXNlIHNwZWNpYWwgdmFyaWFibGVzIGFyZSBrbm93biB0byBob2xkIHZhbHVlcyB3aGljaCBhcmUgbm90CisgICAgICAvLyByZWZlcmVuY2UtY291bnRlZCBwb2ludGVycy4KKyAgICAgIGlmIChOYW1lLnN0YXJ0c3dpdGgoIlwwMWxfb2JqY19tc2dTZW5kX2ZpeHVwXyIpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgU3RyaW5nUmVmIFNlY3Rpb24gPSBHVi0+Z2V0U2VjdGlvbigpOworICAgICAgaWYgKFNlY3Rpb24uZmluZCgiX19tZXNzYWdlX3JlZnMiKSAhPSBTdHJpbmdSZWY6Om5wb3MgfHwKKyAgICAgICAgICBTZWN0aW9uLmZpbmQoIl9fb2JqY19jbGFzc3JlZnMiKSAhPSBTdHJpbmdSZWY6Om5wb3MgfHwKKyAgICAgICAgICBTZWN0aW9uLmZpbmQoIl9fb2JqY19zdXBlcnJlZnMiKSAhPSBTdHJpbmdSZWY6Om5wb3MgfHwKKyAgICAgICAgICBTZWN0aW9uLmZpbmQoIl9fb2JqY19tZXRobmFtZSIpICE9IFN0cmluZ1JlZjo6bnBvcyB8fAorICAgICAgICAgIFNlY3Rpb24uZmluZCgiX19jc3RyaW5nIikgIT0gU3RyaW5nUmVmOjpucG9zKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK2VudW0gY2xhc3MgQVJDTURLaW5kSUQgeworICBJbXByZWNpc2VSZWxlYXNlLAorICBDb3B5T25Fc2NhcGUsCisgIE5vT2JqQ0FSQ0V4Y2VwdGlvbnMsCit9OworCisvLy8gQSBjYWNoZSBvZiBNREtpbmRzIHVzZWQgYnkgdmFyaW91cyBBUkMgb3B0aW1pemF0aW9ucy4KK2NsYXNzIEFSQ01ES2luZENhY2hlIHsKKyAgTW9kdWxlICpNOworCisgIC8vLyBUaGUgTWV0YWRhdGEgS2luZCBmb3IgY2xhbmcuaW1wcmVjaXNlX3JlbGVhc2UgbWV0YWRhdGEuCisgIGxsdm06Ok9wdGlvbmFsPHVuc2lnbmVkPiBJbXByZWNpc2VSZWxlYXNlTURLaW5kOworCisgIC8vLyBUaGUgTWV0YWRhdGEgS2luZCBmb3IgY2xhbmcuYXJjLmNvcHlfb25fZXNjYXBlIG1ldGFkYXRhLgorICBsbHZtOjpPcHRpb25hbDx1bnNpZ25lZD4gQ29weU9uRXNjYXBlTURLaW5kOworCisgIC8vLyBUaGUgTWV0YWRhdGEgS2luZCBmb3IgY2xhbmcuYXJjLm5vX29iamNfYXJjX2V4Y2VwdGlvbnMgbWV0YWRhdGEuCisgIGxsdm06Ok9wdGlvbmFsPHVuc2lnbmVkPiBOb09iakNBUkNFeGNlcHRpb25zTURLaW5kOworCitwdWJsaWM6CisgIHZvaWQgaW5pdChNb2R1bGUgKk1vZCkgeworICAgIE0gPSBNb2Q7CisgICAgSW1wcmVjaXNlUmVsZWFzZU1ES2luZCA9IE5vbmVUeXBlOjpOb25lOworICAgIENvcHlPbkVzY2FwZU1ES2luZCA9IE5vbmVUeXBlOjpOb25lOworICAgIE5vT2JqQ0FSQ0V4Y2VwdGlvbnNNREtpbmQgPSBOb25lVHlwZTo6Tm9uZTsKKyAgfQorCisgIHVuc2lnbmVkIGdldChBUkNNREtpbmRJRCBJRCkgeworICAgIHN3aXRjaCAoSUQpIHsKKyAgICBjYXNlIEFSQ01ES2luZElEOjpJbXByZWNpc2VSZWxlYXNlOgorICAgICAgaWYgKCFJbXByZWNpc2VSZWxlYXNlTURLaW5kKQorICAgICAgICBJbXByZWNpc2VSZWxlYXNlTURLaW5kID0KKyAgICAgICAgICAgIE0tPmdldENvbnRleHQoKS5nZXRNREtpbmRJRCgiY2xhbmcuaW1wcmVjaXNlX3JlbGVhc2UiKTsKKyAgICAgIHJldHVybiAqSW1wcmVjaXNlUmVsZWFzZU1ES2luZDsKKyAgICBjYXNlIEFSQ01ES2luZElEOjpDb3B5T25Fc2NhcGU6CisgICAgICBpZiAoIUNvcHlPbkVzY2FwZU1ES2luZCkKKyAgICAgICAgQ29weU9uRXNjYXBlTURLaW5kID0KKyAgICAgICAgICAgIE0tPmdldENvbnRleHQoKS5nZXRNREtpbmRJRCgiY2xhbmcuYXJjLmNvcHlfb25fZXNjYXBlIik7CisgICAgICByZXR1cm4gKkNvcHlPbkVzY2FwZU1ES2luZDsKKyAgICBjYXNlIEFSQ01ES2luZElEOjpOb09iakNBUkNFeGNlcHRpb25zOgorICAgICAgaWYgKCFOb09iakNBUkNFeGNlcHRpb25zTURLaW5kKQorICAgICAgICBOb09iakNBUkNFeGNlcHRpb25zTURLaW5kID0KKyAgICAgICAgICAgIE0tPmdldENvbnRleHQoKS5nZXRNREtpbmRJRCgiY2xhbmcuYXJjLm5vX29iamNfYXJjX2V4Y2VwdGlvbnMiKTsKKyAgICAgIHJldHVybiAqTm9PYmpDQVJDRXhjZXB0aW9uc01ES2luZDsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiQ292ZXJlZCBzd2l0Y2ggaXNuJ3QgY292ZXJlZD8hIik7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvYmpjYXJjCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvT2JqQ0FSQ0luc3RLaW5kLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL09iakNBUkNJbnN0S2luZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZmYwMzUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL09iakNBUkNJbnN0S2luZC5oCkBAIC0wLDAgKzEsMTI0IEBACisvLz09PS0gT2JqQ0FSQ0luc3RLaW5kLmggLSBBUkMgaW5zdHJ1Y3Rpb24gZXF1aXZhbGVuY2UgY2xhc3NlcyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfT0JKQ0FSQ0lOU1RLSU5EX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19PQkpDQVJDSU5TVEtJTkRfSAorCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBvYmpjYXJjIHsKKworLy8vIFxlbnVtIEFSQ0luc3RLaW5kCisvLy8KKy8vLyBcYnJpZWYgRXF1aXZhbGVuY2UgY2xhc3NlcyBvZiBpbnN0cnVjdGlvbnMgaW4gdGhlIEFSQyBNb2RlbC4KKy8vLworLy8vIFNpbmNlIHdlIGRvIG5vdCBoYXZlICJpbnN0cnVjdGlvbnMiIHRvIHJlcHJlc2VudCBBUkMgY29uY2VwdHMgaW4gTExWTSBJUiwKKy8vLyB3ZSBpbnN0ZWFkIG9wZXJhdGUgb24gZXF1aXZhbGVuY2UgY2xhc3NlcyBvZiBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBUT0RPOiBUaGlzIHNob3VsZCBiZSBzcGxpdCBpbnRvIHR3byBlbnVtczogYSBydW50aW1lIGVudHJ5IHBvaW50IGVudW0KKy8vLyAocG9zc2libHkgdW5pdGVkIHdpdGggdGhlIEFSQ1J1bnRpbWVFbnRyeXBvaW50IGNsYXNzKSBhbmQgYW4gZW51bSB0aGF0IGRlYWxzCisvLy8gd2l0aCBlZmZlY3RzIG9mIGluc3RydWN0aW9ucyBpbiB0aGUgQVJDIG1vZGVsICh3aGljaCB3b3VsZCBoYW5kbGUgdGhlIG5vdGlvbgorLy8vIG9mIGEgVXNlciBvciBDYWxsT3JVc2VyKS4KK2VudW0gY2xhc3MgQVJDSW5zdEtpbmQgeworICBSZXRhaW4sICAgICAgICAgICAgICAgICAgIC8vLzwgb2JqY19yZXRhaW4KKyAgUmV0YWluUlYsICAgICAgICAgICAgICAgICAvLy88IG9iamNfcmV0YWluQXV0b3JlbGVhc2VkUmV0dXJuVmFsdWUKKyAgQ2xhaW1SViwgICAgICAgICAgICAgICAgICAvLy88IG9iamNfdW5zYWZlQ2xhaW1BdXRvcmVsZWFzZWRSZXR1cm5WYWx1ZQorICBSZXRhaW5CbG9jaywgICAgICAgICAgICAgIC8vLzwgb2JqY19yZXRhaW5CbG9jaworICBSZWxlYXNlLCAgICAgICAgICAgICAgICAgIC8vLzwgb2JqY19yZWxlYXNlCisgIEF1dG9yZWxlYXNlLCAgICAgICAgICAgICAgLy8vPCBvYmpjX2F1dG9yZWxlYXNlCisgIEF1dG9yZWxlYXNlUlYsICAgICAgICAgICAgLy8vPCBvYmpjX2F1dG9yZWxlYXNlUmV0dXJuVmFsdWUKKyAgQXV0b3JlbGVhc2Vwb29sUHVzaCwgICAgICAvLy88IG9iamNfYXV0b3JlbGVhc2VQb29sUHVzaAorICBBdXRvcmVsZWFzZXBvb2xQb3AsICAgICAgIC8vLzwgb2JqY19hdXRvcmVsZWFzZVBvb2xQb3AKKyAgTm9vcENhc3QsICAgICAgICAgICAgICAgICAvLy88IG9iamNfcmV0YWluZWRPYmplY3QsIGV0Yy4KKyAgRnVzZWRSZXRhaW5BdXRvcmVsZWFzZSwgICAvLy88IG9iamNfcmV0YWluQXV0b3JlbGVhc2UKKyAgRnVzZWRSZXRhaW5BdXRvcmVsZWFzZVJWLCAvLy88IG9iamNfcmV0YWluQXV0b3JlbGVhc2VSZXR1cm5WYWx1ZQorICBMb2FkV2Vha1JldGFpbmVkLCAgICAgICAgIC8vLzwgb2JqY19sb2FkV2Vha1JldGFpbmVkIChwcmltaXRpdmUpCisgIFN0b3JlV2VhaywgICAgICAgICAgICAgICAgLy8vPCBvYmpjX3N0b3JlV2VhayAocHJpbWl0aXZlKQorICBJbml0V2VhaywgICAgICAgICAgICAgICAgIC8vLzwgb2JqY19pbml0V2VhayAoZGVyaXZlZCkKKyAgTG9hZFdlYWssICAgICAgICAgICAgICAgICAvLy88IG9iamNfbG9hZFdlYWsgKGRlcml2ZWQpCisgIE1vdmVXZWFrLCAgICAgICAgICAgICAgICAgLy8vPCBvYmpjX21vdmVXZWFrIChkZXJpdmVkKQorICBDb3B5V2VhaywgICAgICAgICAgICAgICAgIC8vLzwgb2JqY19jb3B5V2VhayAoZGVyaXZlZCkKKyAgRGVzdHJveVdlYWssICAgICAgICAgICAgICAvLy88IG9iamNfZGVzdHJveVdlYWsgKGRlcml2ZWQpCisgIFN0b3JlU3Ryb25nLCAgICAgICAgICAgICAgLy8vPCBvYmpjX3N0b3JlU3Ryb25nIChkZXJpdmVkKQorICBJbnRyaW5zaWNVc2VyLCAgICAgICAgICAgIC8vLzwgY2xhbmcuYXJjLnVzZQorICBDYWxsT3JVc2VyLCAgICAgICAgICAgICAgIC8vLzwgY291bGQgY2FsbCBvYmpjX3JlbGVhc2UgYW5kL29yICJ1c2UiIHBvaW50ZXJzCisgIENhbGwsICAgICAgICAgICAgICAgICAgICAgLy8vPCBjb3VsZCBjYWxsIG9iamNfcmVsZWFzZQorICBVc2VyLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgY291bGQgInVzZSIgYSBwb2ludGVyCisgIE5vbmUgICAgICAgICAgICAgICAgICAgICAgLy8vPCBhbnl0aGluZyB0aGF0IGlzIGluZXJ0IGZyb20gYW4gQVJDIHBlcnNwZWN0aXZlLgorfTsKKworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBBUkNJbnN0S2luZCBDbGFzcyk7CisKKy8vLyBcYnJpZWYgVGVzdCBpZiB0aGUgZ2l2ZW4gY2xhc3MgaXMgYSBraW5kIG9mIHVzZXIuCitib29sIElzVXNlcihBUkNJbnN0S2luZCBDbGFzcyk7CisKKy8vLyBcYnJpZWYgVGVzdCBpZiB0aGUgZ2l2ZW4gY2xhc3MgaXMgb2JqY19yZXRhaW4gb3IgZXF1aXZhbGVudC4KK2Jvb2wgSXNSZXRhaW4oQVJDSW5zdEtpbmQgQ2xhc3MpOworCisvLy8gXGJyaWVmIFRlc3QgaWYgdGhlIGdpdmVuIGNsYXNzIGlzIG9iamNfYXV0b3JlbGVhc2Ugb3IgZXF1aXZhbGVudC4KK2Jvb2wgSXNBdXRvcmVsZWFzZShBUkNJbnN0S2luZCBDbGFzcyk7CisKKy8vLyBcYnJpZWYgVGVzdCBpZiB0aGUgZ2l2ZW4gY2xhc3MgcmVwcmVzZW50cyBpbnN0cnVjdGlvbnMgd2hpY2ggcmV0dXJuIHRoZWlyCisvLy8gYXJndW1lbnQgdmVyYmF0aW0uCitib29sIElzRm9yd2FyZGluZyhBUkNJbnN0S2luZCBDbGFzcyk7CisKKy8vLyBcYnJpZWYgVGVzdCBpZiB0aGUgZ2l2ZW4gY2xhc3MgcmVwcmVzZW50cyBpbnN0cnVjdGlvbnMgd2hpY2ggZG8gbm90aGluZyBpZgorLy8vIHBhc3NlZCBhIG51bGwgcG9pbnRlci4KK2Jvb2wgSXNOb29wT25OdWxsKEFSQ0luc3RLaW5kIENsYXNzKTsKKworLy8vIFxicmllZiBUZXN0IGlmIHRoZSBnaXZlbiBjbGFzcyByZXByZXNlbnRzIGluc3RydWN0aW9ucyB3aGljaCBhcmUgYWx3YXlzIHNhZmUKKy8vLyB0byBtYXJrIHdpdGggdGhlICJ0YWlsIiBrZXl3b3JkLgorYm9vbCBJc0Fsd2F5c1RhaWwoQVJDSW5zdEtpbmQgQ2xhc3MpOworCisvLy8gXGJyaWVmIFRlc3QgaWYgdGhlIGdpdmVuIGNsYXNzIHJlcHJlc2VudHMgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFyZSBuZXZlciBzYWZlCisvLy8gdG8gbWFyayB3aXRoIHRoZSAidGFpbCIga2V5d29yZC4KK2Jvb2wgSXNOZXZlclRhaWwoQVJDSW5zdEtpbmQgQ2xhc3MpOworCisvLy8gXGJyaWVmIFRlc3QgaWYgdGhlIGdpdmVuIGNsYXNzIHJlcHJlc2VudHMgaW5zdHJ1Y3Rpb25zIHdoaWNoIGFyZSBhbHdheXMgc2FmZQorLy8vIHRvIG1hcmsgd2l0aCB0aGUgbm91bndpbmQgYXR0cmlidXRlLgorYm9vbCBJc05vVGhyb3coQVJDSW5zdEtpbmQgQ2xhc3MpOworCisvLy8gVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiBjYW4gYXV0b3JlbGVhc2UgYW55IHBvaW50ZXIgb3IgY2F1c2UgYW4KKy8vLyBhdXRvcmVsZWFzZXBvb2wgcG9wLgorYm9vbCBDYW5JbnRlcnJ1cHRSVihBUkNJbnN0S2luZCBDbGFzcyk7CisKKy8vLyBcYnJpZWYgRGV0ZXJtaW5lIGlmIEYgaXMgb25lIG9mIHRoZSBzcGVjaWFsIGtub3duIEZ1bmN0aW9ucy4gIElmIGl0IGlzbid0LAorLy8vIHJldHVybiBBUkNJbnN0S2luZDo6Q2FsbE9yVXNlci4KK0FSQ0luc3RLaW5kIEdldEZ1bmN0aW9uQ2xhc3MoY29uc3QgRnVuY3Rpb24gKkYpOworCisvLy8gXGJyaWVmIERldGVybWluZSB3aGljaCBvYmpjIHJ1bnRpbWUgY2FsbCBpbnN0cnVjdGlvbiBjbGFzcyBWIGJlbG9uZ3MgdG8uCisvLy8KKy8vLyBUaGlzIGlzIHNpbWlsYXIgdG8gR2V0QVJDSW5zdEtpbmQgZXhjZXB0IHRoYXQgaXQgb25seSBkZXRlY3RzIG9iamMKKy8vLyBydW50aW1lIGNhbGxzLiBUaGlzIGFsbG93cyBpdCB0byBiZSBmYXN0ZXIuCisvLy8KK2lubGluZSBBUkNJbnN0S2luZCBHZXRCYXNpY0FSQ0luc3RLaW5kKGNvbnN0IFZhbHVlICpWKSB7CisgIGlmIChjb25zdCBDYWxsSW5zdCAqQ0kgPSBkeW5fY2FzdDxDYWxsSW5zdD4oVikpIHsKKyAgICBpZiAoY29uc3QgRnVuY3Rpb24gKkYgPSBDSS0+Z2V0Q2FsbGVkRnVuY3Rpb24oKSkKKyAgICAgIHJldHVybiBHZXRGdW5jdGlvbkNsYXNzKEYpOworICAgIC8vIE90aGVyd2lzZSwgYmUgY29uc2VydmF0aXZlLgorICAgIHJldHVybiBBUkNJbnN0S2luZDo6Q2FsbE9yVXNlcjsKKyAgfQorCisgIC8vIE90aGVyd2lzZSwgYmUgY29uc2VydmF0aXZlLgorICByZXR1cm4gaXNhPEludm9rZUluc3Q+KFYpID8gQVJDSW5zdEtpbmQ6OkNhbGxPclVzZXIgOiBBUkNJbnN0S2luZDo6VXNlcjsKK30KKworLy8vIE1hcCBWIHRvIGl0cyBBUkNJbnN0S2luZCBlcXVpdmFsZW5jZSBjbGFzcy4KK0FSQ0luc3RLaW5kIEdldEFSQ0luc3RLaW5kKGNvbnN0IFZhbHVlICpWKTsKKworLy8vIFJldHVybnMgZmFsc2UgaWYgY29uc2VydmF0aXZlbHkgd2UgY2FuIHByb3ZlIHRoYXQgYW55IGluc3RydWN0aW9uIG1hcHBlZCB0bworLy8vIHRoaXMga2luZCBjYW4gbm90IGRlY3JlbWVudCByZWYgY291bnRzLiBSZXR1cm5zIHRydWUgb3RoZXJ3aXNlLgorYm9vbCBDYW5EZWNyZW1lbnRSZWZDb3VudChBUkNJbnN0S2luZCBLaW5kKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9iamNhcmMKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9PcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL09wdGltaXphdGlvblJlbWFya0VtaXR0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmYzMmFjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9PcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyLmgKQEAgLTAsMCArMSwxNjggQEAKKy8vPT09LSBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyLmggLSBPcHRpbWl6YXRpb24gRGlhZ25vc3RpYyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gT3B0aW1pemF0aW9uIGRpYWdub3N0aWMgaW50ZXJmYWNlcy4gIEl0J3MgcGFja2FnZWQgYXMgYW4gYW5hbHlzaXMgcGFzcyBzbworLy8gdGhhdCBieSB1c2luZyB0aGlzIHNlcnZpY2UgcGFzc2VzIGJlY29tZSBkZXBlbmRlbnQgb24gQkZJIGFzIHdlbGwuICBCRkkgaXMKKy8vIHVzZWQgdG8gY29tcHV0ZSB0aGUgImhvdG5lc3MiIG9mIHRoZSBkaWFnbm9zdGljIG1lc3NhZ2UuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfT1BUSU1JWkFUSU9ORElBR05PU1RJQ0lORk9fSAorI2RlZmluZSBMTFZNX0lSX09QVElNSVpBVElPTkRJQUdOT1NUSUNJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9CbG9ja0ZyZXF1ZW5jeUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RpYWdub3N0aWNJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgRGVidWdMb2M7CitjbGFzcyBMb29wOworY2xhc3MgUGFzczsKK2NsYXNzIFR3aW5lOworY2xhc3MgVmFsdWU7CisKKy8vLyBUaGUgb3B0aW1pemF0aW9uIGRpYWdub3N0aWMgaW50ZXJmYWNlLgorLy8vCisvLy8gSXQgYWxsb3dzIHJlcG9ydGluZyB3aGVuIG9wdGltaXphdGlvbnMgYXJlIHBlcmZvcm1lZCBhbmQgd2hlbiB0aGV5IGFyZSBub3QKKy8vLyBhbG9uZyB3aXRoIHRoZSByZWFzb25zIGZvciBpdC4gIEhvdG5lc3MgaW5mb3JtYXRpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmcKKy8vLyBjb2RlIHJlZ2lvbiBjYW4gYmUgaW5jbHVkZWQgaW4gdGhlIHJlbWFyayBpZiBEaWFnbm9zdGljc0hvdG5lc3NSZXF1ZXN0ZWQgaXMKKy8vLyBlbmFibGVkIGluIHRoZSBMTFZNIGNvbnRleHQuCitjbGFzcyBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyIHsKK3B1YmxpYzoKKyAgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlcihjb25zdCBGdW5jdGlvbiAqRiwgQmxvY2tGcmVxdWVuY3lJbmZvICpCRkkpCisgICAgICA6IEYoRiksIEJGSShCRkkpIHt9CisKKyAgLy8vIFxicmllZiBUaGlzIHZhcmlhbnQgY2FuIGJlIHVzZWQgdG8gZ2VuZXJhdGUgT1JFIG9uIGRlbWFuZCAod2l0aG91dCB0aGUKKyAgLy8vIGFuYWx5c2lzIHBhc3MpLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGN0b3IgaGFzIGEgdmVyeSBkaWZmZXJlbnQgY29zdCBkZXBlbmRpbmcgb24gd2hldGhlcgorICAvLy8gRi0+Z2V0Q29udGV4dCgpLmdldERpYWdub3N0aWNzSG90bmVzc1JlcXVlc3RlZCgpIGlzIG9uIG9yIG5vdC4gIElmIGl0J3Mgb2ZmCisgIC8vLyB0aGUgb3BlcmF0aW9uIGlzIGZyZWUuCisgIC8vLworICAvLy8gV2hlcmVhcyBpZiBEaWFnbm9zdGljc0hvdG5lc3NSZXF1ZXN0ZWQgaXMgb24sIGl0IGlzIGZhaXJseSBleHBlbnNpdmUKKyAgLy8vIG9wZXJhdGlvbiBzaW5jZSBCRkkgYW5kIGFsbCBpdHMgcmVxdWlyZWQgYW5hbHlzZXMgYXJlIGNvbXB1dGVkLiAgVGhpcyBpcworICAvLy8gZm9yIGV4YW1wbGUgdXNlZnVsIGZvciBDR1NDQyBwYXNzZXMgdGhhdCBjYW4ndCB1c2UgZnVuY3Rpb24gYW5hbHlzZXMKKyAgLy8vIHBhc3NlcyBpbiB0aGUgb2xkIFBNLgorICBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyKGNvbnN0IEZ1bmN0aW9uICpGKTsKKworICBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyKE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgJiZBcmcpCisgICAgICA6IEYoQXJnLkYpLCBCRkkoQXJnLkJGSSkge30KKworICBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyICZvcGVyYXRvcj0oT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciAmJlJIUykgeworICAgIEYgPSBSSFMuRjsKKyAgICBCRkkgPSBSSFMuQkZJOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBIYW5kbGUgaW52YWxpZGF0aW9uIGV2ZW50cyBpbiB0aGUgbmV3IHBhc3MgbWFuYWdlci4KKyAgYm9vbCBpbnZhbGlkYXRlKEZ1bmN0aW9uICZGLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmUEEsCisgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlcjo6SW52YWxpZGF0b3IgJkludik7CisKKyAgLy8vIFxicmllZiBPdXRwdXQgdGhlIHJlbWFyayB2aWEgdGhlIGRpYWdub3N0aWMgaGFuZGxlciBhbmQgdG8gdGhlCisgIC8vLyBvcHRpbWl6YXRpb24gcmVjb3JkIGZpbGUuCisgIHZvaWQgZW1pdChEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2UgJk9wdERpYWcpOworCisgIC8vLyBcYnJpZWYgVGFrZSBhIGxhbWJkYSB0aGF0IHJldHVybnMgYSByZW1hcmsgd2hpY2ggd2lsbCBiZSBlbWl0dGVkLiAgU2Vjb25kCisgIC8vLyBhcmd1bWVudCBpcyBvbmx5IHVzZWQgdG8gcmVzdHJpY3QgdGhpcyB0byBmdW5jdGlvbnMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIGVtaXQoVCBSZW1hcmtCdWlsZGVyLCBkZWNsdHlwZShSZW1hcmtCdWlsZGVyKCkpICogPSBudWxscHRyKSB7CisgICAgLy8gQXZvaWQgYnVpbGRpbmcgdGhlIHJlbWFyayB1bmxlc3Mgd2Uga25vdyB0aGVyZSBhcmUgYXQgbGVhc3QgKnNvbWUqCisgICAgLy8gcmVtYXJrcyBlbmFibGVkLiBXZSBjYW4ndCBjdXJyZW50bHkgY2hlY2sgd2hldGhlciByZW1hcmtzIGFyZSByZXF1ZXN0ZWQKKyAgICAvLyBmb3IgdGhlIGNhbGxpbmcgcGFzcyBzaW5jZSB0aGF0IHJlcXVpcmVzIGFjdHVhbGx5IGJ1aWxkaW5nIHRoZSByZW1hcmsuCisKKyAgICBpZiAoRi0+Z2V0Q29udGV4dCgpLmdldERpYWdub3N0aWNzT3V0cHV0RmlsZSgpIHx8CisgICAgICAgIEYtPmdldENvbnRleHQoKS5nZXREaWFnSGFuZGxlclB0cigpLT5pc0FueVJlbWFya0VuYWJsZWQoKSkgeworICAgICAgYXV0byBSID0gUmVtYXJrQnVpbGRlcigpOworICAgICAgZW1pdCgoRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlICYpUik7CisgICAgfQorICB9CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHdlIGFsbG93IGZvciBleHRyYSBjb21waWxlLXRpbWUgYnVkZ2V0IHRvIHBlcmZvcm0gbW9yZQorICAvLy8gYW5hbHlzaXMgdG8gcHJvZHVjZSBmZXdlciBmYWxzZSBwb3NpdGl2ZXMuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VmdWwgd2hlbiByZXBvcnRpbmcgbWlzc2VkIG9wdGltaXphdGlvbnMuICBJbiB0aGlzIGNhc2Ugd2UgY2FuCisgIC8vLyB1c2UgdGhlIGV4dHJhIGFuYWx5c2lzICgxKSB0byBmaWx0ZXIgdHJpdmlhbCBmYWxzZSBwb3NpdGl2ZXMgb3IgKDIpIHRvCisgIC8vLyBwcm92aWRlIG1vcmUgY29udGV4dCBzbyB0aGF0IG5vbi10cml2aWFsIGZhbHNlIHBvc2l0aXZlcyBjYW4gYmUgcXVpY2tseQorICAvLy8gZGV0ZWN0ZWQgYnkgdGhlIHVzZXIuCisgIGJvb2wgYWxsb3dFeHRyYUFuYWx5c2lzKFN0cmluZ1JlZiBQYXNzTmFtZSkgY29uc3QgeworICAgIHJldHVybiAoRi0+Z2V0Q29udGV4dCgpLmdldERpYWdub3N0aWNzT3V0cHV0RmlsZSgpIHx8CisgICAgICAgICAgICBGLT5nZXRDb250ZXh0KCkuZ2V0RGlhZ0hhbmRsZXJQdHIoKS0+aXNBbnlSZW1hcmtFbmFibGVkKFBhc3NOYW1lKSk7CisgIH0KKworcHJpdmF0ZToKKyAgY29uc3QgRnVuY3Rpb24gKkY7CisKKyAgQmxvY2tGcmVxdWVuY3lJbmZvICpCRkk7CisKKyAgLy8vIElmIHdlIGdlbmVyYXRlIEJGSSBvbiBkZW1hbmQsIHdlIG5lZWQgdG8gZnJlZSBpdCB3aGVuIE9SRSBpcyBmcmVlZC4KKyAgc3RkOjp1bmlxdWVfcHRyPEJsb2NrRnJlcXVlbmN5SW5mbz4gT3duZWRCRkk7CisKKyAgLy8vIENvbXB1dGUgaG90bmVzcyBmcm9tIElSIHZhbHVlIChjdXJyZW50bHkgYXNzdW1lZCB0byBiZSBhIGJsb2NrKSBpZiBQR08gaXMKKyAgLy8vIGF2YWlsYWJsZS4KKyAgT3B0aW9uYWw8dWludDY0X3Q+IGNvbXB1dGVIb3RuZXNzKGNvbnN0IFZhbHVlICpWKTsKKworICAvLy8gU2ltaWxhciBidXQgdXNlIHZhbHVlIGZyb20gXHAgT3B0RGlhZyBhbmQgdXBkYXRlIGhvdG5lc3MgdGhlcmUuCisgIHZvaWQgY29tcHV0ZUhvdG5lc3MoRGlhZ25vc3RpY0luZm9JUk9wdGltaXphdGlvbiAmT3B0RGlhZyk7CisKKyAgLy8vIFxicmllZiBPbmx5IGFsbG93IHZlcmJvc2UgbWVzc2FnZXMgaWYgd2Uga25vdyB3ZSdyZSBmaWx0ZXJpbmcgYnkgaG90bmVzcworICAvLy8gKEJGSSBpcyBvbmx5IHNldCBpbiB0aGlzIGNhc2UpLgorICBib29sIHNob3VsZEVtaXRWZXJib3NlKCkgeyByZXR1cm4gQkZJICE9IG51bGxwdHI7IH0KKworICBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyKGNvbnN0IE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgJikgPSBkZWxldGU7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgJikgPSBkZWxldGU7Cit9OworCisvLy8gXGJyaWVmIEFkZCBhIHNtYWxsIG5hbWVzcGFjZSB0byBhdm9pZCBuYW1lIGNsYXNoZXMgd2l0aCB0aGUgY2xhc3NlcyB1c2VkIGluCisvLy8gdGhlIHN0cmVhbWluZyBpbnRlcmZhY2UuICBXZSB3YW50IHRoZXNlIHRvIGJlIHNob3J0IGZvciBiZXR0ZXIKKy8vLyB3cml0ZS9yZWFkYWJpbGl0eS4KK25hbWVzcGFjZSBvcmUgewordXNpbmcgTlYgPSBEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2U6OkFyZ3VtZW50OwordXNpbmcgc2V0SXNWZXJib3NlID0gRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlOjpzZXRJc1ZlcmJvc2U7Cit1c2luZyBzZXRFeHRyYUFyZ3MgPSBEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2U6OnNldEV4dHJhQXJnczsKK30KKworLy8vIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgbGVnYWN5IGFuYWx5c2lzIHBhc3MKKy8vLworLy8vIE5vdGUgdGhhdCB0aGlzIHBhc3Mgc2hvdWxkbid0IGdlbmVyYWxseSBiZSBtYXJrZWQgYXMgcHJlc2VydmVkIGJ5IG90aGVyCisvLy8gcGFzc2VzLiAgSXQncyBob2xkaW5nIG9udG8gQkZJLCBzbyBpZiB0aGUgcGFzcyBkb2VzIG5vdCBwcmVzZXJ2ZSBCRkksIEJGSQorLy8vIGNvdWxkIGJlIGZyZWVkLgorY2xhc3MgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlcldyYXBwZXJQYXNzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgIHN0ZDo6dW5pcXVlX3B0cjxPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyPiBPUkU7CisKK3B1YmxpYzoKKyAgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlcldyYXBwZXJQYXNzKCk7CisKKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSBvdmVycmlkZTsKKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworCisgIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgJmdldE9SRSgpIHsKKyAgICBhc3NlcnQoT1JFICYmICJwYXNzIG5vdCBydW4geWV0Iik7CisgICAgcmV0dXJuICpPUkU7CisgIH0KKworICBzdGF0aWMgY2hhciBJRDsKK307CisKK2NsYXNzIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXJBbmFseXNpcworICAgIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXJBbmFseXNpcz4geworICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48T3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlckFuYWx5c2lzPjsKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIFByb3ZpZGUgdGhlIHJlc3VsdCB0eXBlZGVmIGZvciB0aGlzIGFuYWx5c2lzIHBhc3MuCisgIHR5cGVkZWYgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciBSZXN1bHQ7CisKKyAgLy8vIFxicmllZiBSdW4gdGhlIGFuYWx5c2lzIHBhc3Mgb3ZlciBhIGZ1bmN0aW9uIGFuZCBwcm9kdWNlIEJGSS4KKyAgUmVzdWx0IHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307Cit9CisjZW5kaWYgLy8gTExWTV9JUl9PUFRJTUlaQVRJT05ESUFHTk9TVElDSU5GT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL09yZGVyZWRCYXNpY0Jsb2NrLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL09yZGVyZWRCYXNpY0Jsb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmU3MTZhZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvT3JkZXJlZEJhc2ljQmxvY2suaApAQCAtMCwwICsxLDY3IEBACisvLz09PS0gbGx2bS9BbmFseXNpcy9PcmRlcmVkQmFzaWNCbG9jay5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLSAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIE9yZGVyZWRCYXNpY0Jsb2NrIGNsYXNzLiBPcmRlcmVkQmFzaWNCbG9jayBtYWludGFpbnMKKy8vIGFuIGludGVyZmFjZSB3aGVyZSBjbGllbnRzIGNhbiBxdWVyeSBpZiBvbmUgaW5zdHJ1Y3Rpb24gY29tZXMgYmVmb3JlIGFub3RoZXIKKy8vIGluIGEgQmFzaWNCbG9jay4gU2luY2UgQmFzaWNCbG9jayBjdXJyZW50bHkgbGFja3MgYSByZWxpYWJsZSB3YXkgdG8gcXVlcnkKKy8vIHJlbGF0aXZlIHBvc2l0aW9uIGJldHdlZW4gaW5zdHJ1Y3Rpb25zIG9uZSBjYW4gdXNlIE9yZGVyZWRCYXNpY0Jsb2NrIHRvIGRvCisvLyBzdWNoIHF1ZXJpZXMuIE9yZGVyZWRCYXNpY0Jsb2NrIGlzIGxhemlseSBidWlsdCBvbiBhIHNvdXJjZSBCYXNpY0Jsb2NrIGFuZAorLy8gbWFpbnRhaW5zIGFuIGludGVybmFsIEluc3RydWN0aW9uIC0+IFBvc2l0aW9uIG1hcC4gQSBPcmRlcmVkQmFzaWNCbG9jaworLy8gaW5zdGFuY2Ugc2hvdWxkIGJlIGRpc2NhcmRlZCB3aGVuZXZlciB0aGUgc291cmNlIEJhc2ljQmxvY2sgY2hhbmdlcy4KKy8vCisvLyBJdCdzIGN1cnJlbnRseSB1c2VkIGJ5IHRoZSBDYXB0dXJlVHJhY2tlciBpbiBvcmRlciB0byBmaW5kIHJlbGF0aXZlCisvLyBwb3NpdGlvbnMgb2YgYSBwYWlyIG9mIGluc3RydWN0aW9ucyBpbnNpZGUgYSBCYXNpY0Jsb2NrLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19PUkRFUkVEQkFTSUNCTE9DS19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfT1JERVJFREJBU0lDQkxPQ0tfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Jhc2ljQmxvY2suaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIEJhc2ljQmxvY2s7CisKK2NsYXNzIE9yZGVyZWRCYXNpY0Jsb2NrIHsKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgTWFwIGEgaW5zdHJ1Y3Rpb24gdG8gaXRzIHBvc2l0aW9uIGluIGEgQmFzaWNCbG9jay4KKyAgU21hbGxEZW5zZU1hcDxjb25zdCBJbnN0cnVjdGlvbiAqLCB1bnNpZ25lZCwgMzI+IE51bWJlcmVkSW5zdHM7CisKKyAgLy8vIFxicmllZiBLZWVwIHRyYWNrIG9mIGxhc3QgaW5zdHJ1Y3Rpb24gaW5zZXJ0ZWQgaW50byBccCBOdW1iZXJlZEluc3RzLgorICAvLy8gSXQgc3BlZWRzIHVwIHF1ZXJpZXMgZm9yIHVuY2FjaGVkIGluc3RydWN0aW9ucyBieSBwcm92aWRpbmcgYSBzdGFydCBwb2ludAorICAvLy8gZm9yIG5ldyBxdWVyaWVzIGluIE9yZGVyZWRCYXNpY0Jsb2NrOjpjb21lc0JlZm9yZS4KKyAgQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgTGFzdEluc3RGb3VuZDsKKworICAvLy8gXGJyaWVmIFRoZSBwb3NpdGlvbi9udW1iZXIgdG8gdGFnIHRoZSBuZXh0IGluc3RydWN0aW9uIHRvIGJlIGZvdW5kLgorICB1bnNpZ25lZCBOZXh0SW5zdFBvczsKKworICAvLy8gXGJyaWVmIFRoZSBzb3VyY2UgQmFzaWNCbG9jayB0byBtYXAuCisgIGNvbnN0IEJhc2ljQmxvY2sgKkJCOworCisgIC8vLyBcYnJpZWYgR2l2ZW4gbm8gY2FjaGVkIHJlc3VsdHMsIGZpbmQgaWYgXHAgQSBjb21lcyBiZWZvcmUgXHAgQiBpbiBccCBCQi4KKyAgLy8vIENhY2hlIGFuZCBudW1iZXIgb3V0IGluc3RydWN0aW9uIHdoaWxlIHdhbGtpbmcgXHAgQkIuCisgIGJvb2wgY29tZXNCZWZvcmUoY29uc3QgSW5zdHJ1Y3Rpb24gKkEsIGNvbnN0IEluc3RydWN0aW9uICpCKTsKKworcHVibGljOgorICBPcmRlcmVkQmFzaWNCbG9jayhjb25zdCBCYXNpY0Jsb2NrICpCYXNpY0IpOworCisgIC8vLyBcYnJpZWYgRmluZCBvdXQgd2hldGhlciBccCBBIGRvbWluYXRlcyBccCBCLCBtZWFuaW5nIHdoZXRoZXIgXHAgQQorICAvLy8gY29tZXMgYmVmb3JlIFxwIEIgaW4gXHAgQkIuIFRoaXMgaXMgYSBzaW1wbGlmaWNhdGlvbiB0aGF0IGNvbnNpZGVycworICAvLy8gY2FjaGVkIGluc3RydWN0aW9uIHBvc2l0aW9ucyBhbmQgaWdub3JlcyBvdGhlciBiYXNpYyBibG9ja3MsIGJlaW5nCisgIC8vLyBvbmx5IHJlbGV2YW50IHRvIGNvbXBhcmUgcmVsYXRpdmUgaW5zdHJ1Y3Rpb25zIHBvc2l0aW9ucyBpbnNpZGUgXHAgQkIuCisgIC8vLyBSZXR1cm5zIGZhbHNlIGZvciBBID09IEIuCisgIGJvb2wgZG9taW5hdGVzKGNvbnN0IEluc3RydWN0aW9uICpBLCBjb25zdCBJbnN0cnVjdGlvbiAqQik7Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUEhJVHJhbnNBZGRyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1BISVRyYW5zQWRkci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYwZjM0ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1BISVRyYW5zQWRkci5oCkBAIC0wLDAgKzEsMTI3IEBACisvLz09PS0gUEhJVHJhbnNBZGRyLmggLSBQSEkgVHJhbnNsYXRpb24gZm9yIEFkZHJlc3NlcyAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgUEhJVHJhbnNBZGRyIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19QSElUUkFOU0FERFJfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1BISVRSQU5TQUREUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBBc3N1bXB0aW9uQ2FjaGU7CisgIGNsYXNzIERvbWluYXRvclRyZWU7CisgIGNsYXNzIERhdGFMYXlvdXQ7CisgIGNsYXNzIFRhcmdldExpYnJhcnlJbmZvOworCisvLy8gUEhJVHJhbnNBZGRyIC0gQW4gYWRkcmVzcyB2YWx1ZSB3aGljaCB0cmFja3MgYW5kIGhhbmRsZXMgcGhpIHRyYW5zbGF0aW9uLgorLy8vIEFzIHdlIHdhbGsgInVwIiB0aGUgQ0ZHIHRocm91Z2ggcHJlZGVjZXNzb3JzLCB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHRoZQorLy8vIGFkZHJlc3Mgd2UncmUgdHJhY2tpbmcgaXMga2VwdCB1cCB0byBkYXRlLiAgRm9yIGV4YW1wbGUsIGlmIHdlJ3JlIGFuYWx5emluZworLy8vIGFuIGFkZHJlc3Mgb2YgIiZBW2ldIiBhbmQgd2FsayB0aHJvdWdoIHRoZSBkZWZpbml0aW9uIG9mICdpJyB3aGljaCBpcyBhIFBISQorLy8vIG5vZGUsIHdlICptdXN0KiBwaGkgdHJhbnNsYXRlIGkgdG8gZ2V0ICImQVtqXSIgb3IgZWxzZSB3ZSB3aWxsIGFuYWx5emUgYW4KKy8vLyBpbmNvcnJlY3QgcG9pbnRlciBpbiB0aGUgcHJlZGVjZXNzb3IgYmxvY2suCisvLy8KKy8vLyBUaGlzIGlzIGRlc2lnbmVkIHRvIGJlIGEgcmVsYXRpdmVseSBzbWFsbCBvYmplY3QgdGhhdCBsaXZlcyBvbiB0aGUgc3RhY2sgYW5kCisvLy8gaXMgY29weWFibGUuCisvLy8KK2NsYXNzIFBISVRyYW5zQWRkciB7CisgIC8vLyBBZGRyIC0gVGhlIGFjdHVhbCBhZGRyZXNzIHdlJ3JlIGFuYWx5emluZy4KKyAgVmFsdWUgKkFkZHI7CisKKyAgLy8vIFRoZSBEYXRhTGF5b3V0IHdlIGFyZSBwbGF5aW5nIHdpdGguCisgIGNvbnN0IERhdGFMYXlvdXQgJkRMOworCisgIC8vLyBUTEkgLSBUaGUgdGFyZ2V0IGxpYnJhcnkgaW5mbyBpZiBrbm93biwgb3RoZXJ3aXNlIG51bGwuCisgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEk7CisKKyAgLy8vIEEgY2FjaGUgb2YgQGxsdm0uYXNzdW1lIGNhbGxzIHVzZWQgYnkgU2ltcGxpZnlJbnN0cnVjdGlvbi4KKyAgQXNzdW1wdGlvbkNhY2hlICpBQzsKKworICAvLy8gSW5zdElucHV0cyAtIFRoZSBpbnB1dHMgZm9yIG91ciBzeW1ib2xpYyBhZGRyZXNzLgorICBTbWFsbFZlY3RvcjxJbnN0cnVjdGlvbiosIDQ+IEluc3RJbnB1dHM7CisKK3B1YmxpYzoKKyAgUEhJVHJhbnNBZGRyKFZhbHVlICphZGRyLCBjb25zdCBEYXRhTGF5b3V0ICZETCwgQXNzdW1wdGlvbkNhY2hlICpBQykKKyAgICAgIDogQWRkcihhZGRyKSwgREwoREwpLCBUTEkobnVsbHB0ciksIEFDKEFDKSB7CisgICAgLy8gSWYgdGhlIGFkZHJlc3MgaXMgYW4gaW5zdHJ1Y3Rpb24sIHRoZSB3aG9sZSB0aGluZyBpcyBjb25zaWRlcmVkIGFuIGlucHV0LgorICAgIGlmIChJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihBZGRyKSkKKyAgICAgIEluc3RJbnB1dHMucHVzaF9iYWNrKEkpOworICB9CisKKyAgVmFsdWUgKmdldEFkZHIoKSBjb25zdCB7IHJldHVybiBBZGRyOyB9CisKKyAgLy8vIE5lZWRzUEhJVHJhbnNsYXRpb25Gcm9tQmxvY2sgLSBSZXR1cm4gdHJ1ZSBpZiBtb3ZpbmcgZnJvbSB0aGUgc3BlY2lmaWVkCisgIC8vLyBCYXNpY0Jsb2NrIHRvIGl0cyBwcmVkZWNlc3NvcnMgcmVxdWlyZXMgUEhJIHRyYW5zbGF0aW9uLgorICBib29sIE5lZWRzUEhJVHJhbnNsYXRpb25Gcm9tQmxvY2soQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICAvLyBXZSBkbyBuZWVkIHRyYW5zbGF0aW9uIGlmIG9uZSBvZiBvdXIgaW5wdXQgaW5zdHJ1Y3Rpb25zIGlzIGRlZmluZWQgaW4KKyAgICAvLyB0aGlzIGJsb2NrLgorICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBJbnN0SW5wdXRzLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoSW5zdElucHV0c1tpXS0+Z2V0UGFyZW50KCkgPT0gQkIpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBJc1BvdGVudGlhbGx5UEhJVHJhbnNsYXRhYmxlIC0gSWYgdGhpcyBuZWVkcyBQSEkgdHJhbnNsYXRpb24sIHJldHVybiB0cnVlCisgIC8vLyBpZiB3ZSBoYXZlIHNvbWUgaG9wZSBvZiBkb2luZyBpdC4gIFRoaXMgc2hvdWxkIGJlIHVzZWQgYXMgYSBmaWx0ZXIgdG8KKyAgLy8vIGF2b2lkIGNhbGxpbmcgUEhJVHJhbnNsYXRlVmFsdWUgaW4gaG9wZWxlc3Mgc2l0dWF0aW9ucy4KKyAgYm9vbCBJc1BvdGVudGlhbGx5UEhJVHJhbnNsYXRhYmxlKCkgY29uc3Q7CisKKyAgLy8vIFBISVRyYW5zbGF0ZVZhbHVlIC0gUEhJIHRyYW5zbGF0ZSB0aGUgY3VycmVudCBhZGRyZXNzIHVwIHRoZSBDRkcgZnJvbQorICAvLy8gQ3VyQkIgdG8gUHJlZCwgdXBkYXRpbmcgb3VyIHN0YXRlIHRvIHJlZmxlY3QgYW55IG5lZWRlZCBjaGFuZ2VzLiAgSWYKKyAgLy8vICdNdXN0RG9taW5hdGUnIGlzIHRydWUsIHRoZSB0cmFuc2xhdGVkIHZhbHVlIG11c3QgZG9taW5hdGUKKyAgLy8vIFByZWRCQi4gIFRoaXMgcmV0dXJucyB0cnVlIG9uIGZhaWx1cmUgYW5kIHNldHMgQWRkciB0byBudWxsLgorICBib29sIFBISVRyYW5zbGF0ZVZhbHVlKEJhc2ljQmxvY2sgKkN1ckJCLCBCYXNpY0Jsb2NrICpQcmVkQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQsIGJvb2wgTXVzdERvbWluYXRlKTsKKworICAvLy8gUEhJVHJhbnNsYXRlV2l0aEluc2VydGlvbiAtIFBISSB0cmFuc2xhdGUgdGhpcyB2YWx1ZSBpbnRvIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHByZWRlY2Vzc29yIGJsb2NrLCBpbnNlcnRpbmcgYSBjb21wdXRhdGlvbiBvZiB0aGUgdmFsdWUgaWYgaXQgaXMKKyAgLy8vIHVuYXZhaWxhYmxlLgorICAvLy8KKyAgLy8vIEFsbCBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9ucyBhcmUgYWRkZWQgdG8gdGhlIE5ld0luc3RzIGxpc3QuICBUaGlzCisgIC8vLyByZXR1cm5zIG51bGwgb24gZmFpbHVyZS4KKyAgLy8vCisgIFZhbHVlICpQSElUcmFuc2xhdGVXaXRoSW5zZXJ0aW9uKEJhc2ljQmxvY2sgKkN1ckJCLCBCYXNpY0Jsb2NrICpQcmVkQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgJkRULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8SW5zdHJ1Y3Rpb24gKj4gJk5ld0luc3RzKTsKKworICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLy8gVmVyaWZ5IC0gQ2hlY2sgaW50ZXJuYWwgY29uc2lzdGVuY3kgb2YgdGhpcyBkYXRhIHN0cnVjdHVyZS4gIElmIHRoZQorICAvLy8gc3RydWN0dXJlIGlzIHZhbGlkLCBpdCByZXR1cm5zIHRydWUuICBJZiBpbnZhbGlkLCBpdCBwcmludHMgZXJyb3JzIGFuZAorICAvLy8gcmV0dXJucyBmYWxzZS4KKyAgYm9vbCBWZXJpZnkoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgVmFsdWUgKlBISVRyYW5zbGF0ZVN1YkV4cHIoVmFsdWUgKlYsIEJhc2ljQmxvY2sgKkN1ckJCLCBCYXNpY0Jsb2NrICpQcmVkQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUKTsKKworICAvLy8gSW5zZXJ0UEhJVHJhbnNsYXRlZFN1YkV4cHIgLSBJbnNlcnQgYSBjb21wdXRhdGlvbiBvZiB0aGUgUEhJIHRyYW5zbGF0ZWQKKyAgLy8vIHZlcnNpb24gb2YgJ1YnIGZvciB0aGUgZWRnZSBQcmVkQkItPkN1ckJCIGludG8gdGhlIGVuZCBvZiB0aGUgUHJlZEJCCisgIC8vLyBibG9jay4gIEFsbCBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9ucyBhcmUgYWRkZWQgdG8gdGhlIE5ld0luc3RzIGxpc3QuCisgIC8vLyBUaGlzIHJldHVybnMgbnVsbCBvbiBmYWlsdXJlLgorICAvLy8KKyAgVmFsdWUgKkluc2VydFBISVRyYW5zbGF0ZWRTdWJFeHByKFZhbHVlICpJblZhbCwgQmFzaWNCbG9jayAqQ3VyQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpQcmVkQkIsIGNvbnN0IERvbWluYXRvclRyZWUgJkRULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEluc3RydWN0aW9uICo+ICZOZXdJbnN0cyk7CisKKyAgLy8vIEFkZEFzSW5wdXQgLSBJZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGlzIGFuIGluc3RydWN0aW9uLCBhZGQgaXQgYXMgYW4gaW5wdXQuCisgIFZhbHVlICpBZGRBc0lucHV0KFZhbHVlICpWKSB7CisgICAgLy8gSWYgViBpcyBhbiBpbnN0cnVjdGlvbiwgaXQgaXMgbm93IGFuIGlucHV0LgorICAgIGlmIChJbnN0cnVjdGlvbiAqVkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4oVikpCisgICAgICBJbnN0SW5wdXRzLnB1c2hfYmFjayhWSSk7CisgICAgcmV0dXJuIFY7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9QYXNzZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUGFzc2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDliMjhhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUGFzc2VzLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8vPT09LS0gbGx2bS9BbmFseXNpcy9QYXNzZXMuaCAtIENvbnN0cnVjdG9ycyBmb3IgYW5hbHlzZXMgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHByb3RvdHlwZXMgZm9yIGFjY2Vzc29yIGZ1bmN0aW9ucyB0aGF0IGV4cG9zZSBwYXNzZXMKKy8vIGluIHRoZSBhbmFseXNpcyBsaWJyYXJpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1BBU1NFU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfUEFTU0VTX0gKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBGdW5jdGlvblBhc3M7CisgIGNsYXNzIEltbXV0YWJsZVBhc3M7CisgIGNsYXNzIExvb3BQYXNzOworICBjbGFzcyBNb2R1bGVQYXNzOworICBjbGFzcyBQYXNzOworICBjbGFzcyBQYXNzSW5mbzsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8KKyAgLy8gY3JlYXRlT2JqQ0FSQ0FBV3JhcHBlclBhc3MgLSBUaGlzIHBhc3MgaW1wbGVtZW50cyBPYmpDLUFSQy1iYXNlZAorICAvLyBhbGlhcyBhbmFseXNpcy4KKyAgLy8KKyAgSW1tdXRhYmxlUGFzcyAqY3JlYXRlT2JqQ0FSQ0FBV3JhcHBlclBhc3MoKTsKKworICBGdW5jdGlvblBhc3MgKmNyZWF0ZVBBRXZhbFBhc3MoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8KKyAgLy8vIGNyZWF0ZUxhenlWYWx1ZUluZm9QYXNzIC0gVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZSBMYXp5VmFsdWVJbmZvCisgIC8vLyBwYXNzLgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZUxhenlWYWx1ZUluZm9QYXNzKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIGNyZWF0ZURlcGVuZGVuY2VBbmFseXNpc1dyYXBwZXJQYXNzIC0gVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZQorICAvLyBEZXBlbmRlbmNlQW5hbHlzaXNXcmFwcGVyIHBhc3MuCisgIC8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlRGVwZW5kZW5jZUFuYWx5c2lzV3JhcHBlclBhc3MoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8KKyAgLy8gY3JlYXRlQ29zdE1vZGVsQW5hbHlzaXNQYXNzIC0gVGhpcyBjcmVhdGVzIGFuIGluc3RhbmNlIG9mIHRoZQorICAvLyBDb3N0TW9kZWxBbmFseXNpcyBwYXNzLgorICAvLworICBGdW5jdGlvblBhc3MgKmNyZWF0ZUNvc3RNb2RlbEFuYWx5c2lzUGFzcygpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLworICAvLyBjcmVhdGVEZWxpbmVhcml6YXRpb25QYXNzIC0gVGhpcyBwYXNzIGltcGxlbWVudHMgYXR0ZW1wdHMgdG8gcmVzdG9yZQorICAvLyBtdWx0aWRpbWVuc2lvbmFsIGFycmF5IGluZGljZXMgZnJvbSBsaW5lYXJpemVkIGV4cHJlc3Npb25zLgorICAvLworICBGdW5jdGlvblBhc3MgKmNyZWF0ZURlbGluZWFyaXphdGlvblBhc3MoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8KKyAgLy8gY3JlYXRlRGl2ZXJnZW5jZUFuYWx5c2lzUGFzcyAtIFRoaXMgcGFzcyBkZXRlcm1pbmVzIHdoaWNoIGJyYW5jaGVzIGluIGEgR1BVCisgIC8vIHByb2dyYW0gYXJlIGRpdmVyZ2VudC4KKyAgLy8KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVEaXZlcmdlbmNlQW5hbHlzaXNQYXNzKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIE1pbm9yIHBhc3MgcHJvdG90eXBlcywgYWxsb3dpbmcgdXMgdG8gZXhwb3NlIHRoZW0gdGhyb3VnaCBidWdwb2ludCBhbmQKKyAgLy8gYW5hbHl6ZS4KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVJbnN0Q291bnRQYXNzKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIGNyZWF0ZVJlZ2lvbkluZm9QYXNzIC0gVGhpcyBwYXNzIGZpbmRzIGFsbCBzaW5nbGUgZW50cnkgc2luZ2xlIGV4aXQgcmVnaW9ucworICAvLyBpbiBhIGZ1bmN0aW9uIGFuZCBidWlsZHMgdGhlIHJlZ2lvbiBoaWVyYXJjaHkuCisgIC8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlUmVnaW9uSW5mb1Bhc3MoKTsKKworICAvLyBQcmludCBtb2R1bGUtbGV2ZWwgZGVidWcgaW5mbyBtZXRhZGF0YSBpbiBodW1hbi1yZWFkYWJsZSBmb3JtLgorICBNb2R1bGVQYXNzICpjcmVhdGVNb2R1bGVEZWJ1Z0luZm9QcmludGVyUGFzcygpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLworICAvLyBjcmVhdGVNZW1EZXBQcmludGVyIC0gVGhpcyBwYXNzIGV4aGF1c3RpdmVseSBjb2xsZWN0cyBhbGwgbWVtZGVwCisgIC8vIGluZm9ybWF0aW9uIGFuZCBwcmludHMgaXQgd2l0aCAtYW5hbHl6ZS4KKyAgLy8KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVNZW1EZXBQcmludGVyKCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vCisgIC8vIGNyZWF0ZU1lbURlcmVmUHJpbnRlciAtIFRoaXMgcGFzcyBjb2xsZWN0cyBtZW1vcnkgZGVyZWZlcmVuY2VhYmlsaXR5CisgIC8vIGluZm9ybWF0aW9uIGFuZCBwcmludHMgaXQgd2l0aCAtYW5hbHl6ZS4KKyAgLy8KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVNZW1EZXJlZlByaW50ZXIoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8KKyAgLy8gY3JlYXRlTXVzdEV4ZWN1dGVQcmludGVyIC0gVGhpcyBwYXNzIGNvbGxlY3RzIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoCisgIC8vIGluc3RydWN0aW9ucyB3aXRoaW4gYSBsb29wIGFyZSBndWFyYW50ZWVkIHRvIGV4ZWN1dGUgaWYgdGhlIGxvb3AgaGVhZGVyIGlzCisgIC8vIGVudGVyZWQgYW5kIHByaW50cyBpdCB3aXRoIC1hbmFseXplLgorICAvLworICBGdW5jdGlvblBhc3MgKmNyZWF0ZU11c3RFeGVjdXRlUHJpbnRlcigpOworCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Qb3N0RG9taW5hdG9ycy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9Qb3N0RG9taW5hdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOGM0ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1Bvc3REb21pbmF0b3JzLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8vPS0gbGx2bS9BbmFseXNpcy9Qb3N0RG9taW5hdG9ycy5oIC0gUG9zdCBEb21pbmF0b3IgQ2FsY3VsYXRpb24gLS0qLSBDKysgLSotPS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGV4cG9zZXMgaW50ZXJmYWNlcyB0byBwb3N0IGRvbWluYW5jZSBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfUE9TVERPTUlOQVRPUlNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1BPU1RET01JTkFUT1JTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlcHRoRmlyc3RJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gUG9zdERvbWluYXRvclRyZWUgQ2xhc3MgLSBDb25jcmV0ZSBzdWJjbGFzcyBvZiBEb21pbmF0b3JUcmVlIHRoYXQgaXMgdXNlZCB0bworLy8vIGNvbXB1dGUgdGhlIHBvc3QtZG9taW5hdG9yIHRyZWUuCitjbGFzcyBQb3N0RG9taW5hdG9yVHJlZSA6IHB1YmxpYyBQb3N0RG9tVHJlZUJhc2U8QmFzaWNCbG9jaz4geworcHVibGljOgorICB1c2luZyBCYXNlID0gUG9zdERvbVRyZWVCYXNlPEJhc2ljQmxvY2s+OworCisgIC8vLyBIYW5kbGUgaW52YWxpZGF0aW9uIGV4cGxpY2l0bHkuCisgIGJvb2wgaW52YWxpZGF0ZShGdW5jdGlvbiAmRiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJlBBLAorICAgICAgICAgICAgICAgICAgRnVuY3Rpb25BbmFseXNpc01hbmFnZXI6OkludmFsaWRhdG9yICYpOworfTsKKworLy8vIFxicmllZiBBbmFseXNpcyBwYXNzIHdoaWNoIGNvbXB1dGVzIGEgXGMgUG9zdERvbWluYXRvclRyZWUuCitjbGFzcyBQb3N0RG9taW5hdG9yVHJlZUFuYWx5c2lzCisgICAgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48UG9zdERvbWluYXRvclRyZWVBbmFseXNpcz4geworICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48UG9zdERvbWluYXRvclRyZWVBbmFseXNpcz47CisKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIFByb3ZpZGUgdGhlIHJlc3VsdCB0eXBlIGZvciB0aGlzIGFuYWx5c2lzIHBhc3MuCisgIHVzaW5nIFJlc3VsdCA9IFBvc3REb21pbmF0b3JUcmVlOworCisgIC8vLyBcYnJpZWYgUnVuIHRoZSBhbmFseXNpcyBwYXNzIG92ZXIgYSBmdW5jdGlvbiBhbmQgcHJvZHVjZSBhIHBvc3QgZG9taW5hdG9yCisgIC8vLyAgICAgICAgdHJlZS4KKyAgUG9zdERvbWluYXRvclRyZWUgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmKTsKK307CisKKy8vLyBcYnJpZWYgUHJpbnRlciBwYXNzIGZvciB0aGUgXGMgUG9zdERvbWluYXRvclRyZWUuCitjbGFzcyBQb3N0RG9taW5hdG9yVHJlZVByaW50ZXJQYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxQb3N0RG9taW5hdG9yVHJlZVByaW50ZXJQYXNzPiB7CisgIHJhd19vc3RyZWFtICZPUzsKKworcHVibGljOgorICBleHBsaWNpdCBQb3N0RG9taW5hdG9yVHJlZVByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPUyk7CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworc3RydWN0IFBvc3REb21pbmF0b3JUcmVlV3JhcHBlclBhc3MgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKworICBQb3N0RG9taW5hdG9yVHJlZSBEVDsKKworICBQb3N0RG9taW5hdG9yVHJlZVdyYXBwZXJQYXNzKCkgOiBGdW5jdGlvblBhc3MoSUQpIHsKKyAgICBpbml0aWFsaXplUG9zdERvbWluYXRvclRyZWVXcmFwcGVyUGFzc1Bhc3MoKlBhc3NSZWdpc3RyeTo6Z2V0UGFzc1JlZ2lzdHJ5KCkpOworICB9CisKKyAgUG9zdERvbWluYXRvclRyZWUgJmdldFBvc3REb21UcmVlKCkgeyByZXR1cm4gRFQ7IH0KKyAgY29uc3QgUG9zdERvbWluYXRvclRyZWUgJmdldFBvc3REb21UcmVlKCkgY29uc3QgeyByZXR1cm4gRFQ7IH0KKworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworCisgIHZvaWQgdmVyaWZ5QW5hbHlzaXMoKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgfQorCisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlIHsKKyAgICBEVC5yZWxlYXNlTWVtb3J5KCk7CisgIH0KKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlKikgY29uc3Qgb3ZlcnJpZGU7Cit9OworCitGdW5jdGlvblBhc3MqIGNyZWF0ZVBvc3REb21UcmVlKCk7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxQb3N0RG9taW5hdG9yVHJlZSo+CisgIDogcHVibGljIEdyYXBoVHJhaXRzPERvbVRyZWVOb2RlKj4geworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoUG9zdERvbWluYXRvclRyZWUgKkRUKSB7CisgICAgcmV0dXJuIERULT5nZXRSb290Tm9kZSgpOworICB9CisKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2JlZ2luKFBvc3REb21pbmF0b3JUcmVlICpOKSB7CisgICAgaWYgKGdldEVudHJ5Tm9kZShOKSkKKyAgICAgIHJldHVybiBkZl9iZWdpbihnZXRFbnRyeU5vZGUoTikpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBkZl9lbmQoZ2V0RW50cnlOb2RlKE4pKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoUG9zdERvbWluYXRvclRyZWUgKk4pIHsKKyAgICByZXR1cm4gZGZfZW5kKGdldEVudHJ5Tm9kZShOKSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX1BPU1RET01JTkFUT1JTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUHJvZmlsZVN1bW1hcnlJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1Byb2ZpbGVTdW1tYXJ5SW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MzAzMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1Byb2ZpbGVTdW1tYXJ5SW5mby5oCkBAIC0wLDAgKzEsMTY3IEBACisvLz09PS0gbGx2bS9BbmFseXNpcy9Qcm9maWxlU3VtbWFyeUluZm8uaCAtIHByb2ZpbGUgc3VtbWFyeSAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgYSBwYXNzIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIHByb2ZpbGUgc3VtbWFyeQorLy8gaW5mb3JtYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1BST0ZJTEVfU1VNTUFSWV9JTkZPX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19QUk9GSUxFX1NVTU1BUllfSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Qcm9maWxlU3VtbWFyeS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBCbG9ja0ZyZXF1ZW5jeUluZm87CitjbGFzcyBDYWxsU2l0ZTsKK2NsYXNzIFByb2ZpbGVTdW1tYXJ5OworLy8vIFxicmllZiBBbmFseXNpcyBwcm92aWRpbmcgcHJvZmlsZSBpbmZvcm1hdGlvbi4KKy8vLworLy8vIFRoaXMgaXMgYW4gaW1tdXRhYmxlIGFuYWx5c2lzIHBhc3MgdGhhdCBwcm92aWRlcyBhYmlsaXR5IHRvIHF1ZXJ5IGdsb2JhbAorLy8vIChwcm9ncmFtLWxldmVsKSBwcm9maWxlIGluZm9ybWF0aW9uLiBUaGUgbWFpbiBBUElzIGFyZSBpc0hvdENvdW50IGFuZAorLy8vIGlzQ29sZENvdW50IHRoYXQgdGVsbHMgd2hldGhlciBhIGdpdmVuIHByb2ZpbGUgY291bnQgaXMgY29uc2lkZXJlZCBob3QvY29sZAorLy8vIGJhc2VkIG9uIHRoZSBwcm9maWxlIHN1bW1hcnkuIFRoaXMgYWxzbyBwcm92aWRlcyBjb252ZW5pZW5jZSBtZXRob2RzIHRvCisvLy8gY2hlY2sgd2hldGhlciBhIGZ1bmN0aW9uIGlzIGhvdCBvciBjb2xkLgorCisvLyBGSVhNRTogUHJvdmlkZSBjb252ZW5pZW5jZSBtZXRob2RzIHRvIGRldGVybWluZSBob3RuZXNzL2NvbGRuZXNzIG9mIG90aGVyIElSCisvLyB1bml0cy4gVGhpcyB3b3VsZCByZXF1aXJlIG1ha2luZyB0aGlzIGRlcGVuZCBvbiBCRkkuCitjbGFzcyBQcm9maWxlU3VtbWFyeUluZm8geworcHJpdmF0ZToKKyAgTW9kdWxlICZNOworICBzdGQ6OnVuaXF1ZV9wdHI8UHJvZmlsZVN1bW1hcnk+IFN1bW1hcnk7CisgIGJvb2wgY29tcHV0ZVN1bW1hcnkoKTsKKyAgdm9pZCBjb21wdXRlVGhyZXNob2xkcygpOworICAvLyBDb3VudCB0aHJlc2hvbGRzIHRvIGFuc3dlciBpc0hvdENvdW50IGFuZCBpc0NvbGRDb3VudCBxdWVyaWVzLgorICBPcHRpb25hbDx1aW50NjRfdD4gSG90Q291bnRUaHJlc2hvbGQsIENvbGRDb3VudFRocmVzaG9sZDsKKyAgLy8gVHJ1ZSBpZiB0aGUgd29ya2luZyBzZXQgc2l6ZSBvZiB0aGUgY29kZSBpcyBjb25zaWRlcmVkIGh1Z2UsCisgIC8vIGJlY2F1c2UgdGhlIG51bWJlciBvZiBwcm9maWxlIGNvdW50cyByZXF1aXJlZCB0byByZWFjaCB0aGUgaG90CisgIC8vIHBlcmNlbnRpbGUgaXMgYWJvdmUgYSBodWdlIHRocmVzaG9sZC4KKyAgT3B0aW9uYWw8Ym9vbD4gSGFzSHVnZVdvcmtpbmdTZXRTaXplOworCitwdWJsaWM6CisgIFByb2ZpbGVTdW1tYXJ5SW5mbyhNb2R1bGUgJk0pIDogTShNKSB7fQorICBQcm9maWxlU3VtbWFyeUluZm8oUHJvZmlsZVN1bW1hcnlJbmZvICYmQXJnKQorICAgICAgOiBNKEFyZy5NKSwgU3VtbWFyeShzdGQ6Om1vdmUoQXJnLlN1bW1hcnkpKSB7fQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHByb2ZpbGUgc3VtbWFyeSBpcyBhdmFpbGFibGUuCisgIGJvb2wgaGFzUHJvZmlsZVN1bW1hcnkoKSB7IHJldHVybiBjb21wdXRlU3VtbWFyeSgpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgbW9kdWxlIFxjIE0gaGFzIHNhbXBsZSBwcm9maWxlLgorICBib29sIGhhc1NhbXBsZVByb2ZpbGUoKSB7CisgICAgcmV0dXJuIGhhc1Byb2ZpbGVTdW1tYXJ5KCkgJiYKKyAgICAgICAgICAgU3VtbWFyeS0+Z2V0S2luZCgpID09IFByb2ZpbGVTdW1tYXJ5OjpQU0tfU2FtcGxlOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgbW9kdWxlIFxjIE0gaGFzIGluc3RydW1lbnRhdGlvbiBwcm9maWxlLgorICBib29sIGhhc0luc3RydW1lbnRhdGlvblByb2ZpbGUoKSB7CisgICAgcmV0dXJuIGhhc1Byb2ZpbGVTdW1tYXJ5KCkgJiYKKyAgICAgICAgICAgU3VtbWFyeS0+Z2V0S2luZCgpID09IFByb2ZpbGVTdW1tYXJ5OjpQU0tfSW5zdHI7CisgIH0KKworICAvLy8gSGFuZGxlIHRoZSBpbnZhbGlkYXRpb24gb2YgdGhpcyBpbmZvcm1hdGlvbi4KKyAgLy8vCisgIC8vLyBXaGVuIHVzZWQgYXMgYSByZXN1bHQgb2YgXGMgUHJvZmlsZVN1bW1hcnlBbmFseXNpcyB0aGlzIG1ldGhvZCB3aWxsIGJlCisgIC8vLyBjYWxsZWQgd2hlbiB0aGUgbW9kdWxlIHRoaXMgd2FzIGNvbXB1dGVkIGZvciBjaGFuZ2VzLiBTaW5jZSBwcm9maWxlCisgIC8vLyBzdW1tYXJ5IGlzIGltbXV0YWJsZSBhZnRlciBpdCBpcyBhbm5vdGF0ZWQgb24gdGhlIG1vZHVsZSwgd2UgcmV0dXJuIGZhbHNlCisgIC8vLyBoZXJlLgorICBib29sIGludmFsaWRhdGUoTW9kdWxlICYsIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzICYsCisgICAgICAgICAgICAgICAgICBNb2R1bGVBbmFseXNpc01hbmFnZXI6OkludmFsaWRhdG9yICYpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgcHJvZmlsZSBjb3VudCBmb3IgXHAgQ2FsbEluc3QuCisgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRQcm9maWxlQ291bnQoY29uc3QgSW5zdHJ1Y3Rpb24gKkNhbGxJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrRnJlcXVlbmN5SW5mbyAqQkZJKTsKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgd29ya2luZyBzZXQgc2l6ZSBvZiB0aGUgY29kZSBpcyBjb25zaWRlcmVkIGh1Z2UuCisgIGJvb2wgaGFzSHVnZVdvcmtpbmdTZXRTaXplKCk7CisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIFxwIEYgaGFzIGhvdCBmdW5jdGlvbiBlbnRyeS4KKyAgYm9vbCBpc0Z1bmN0aW9uRW50cnlIb3QoY29uc3QgRnVuY3Rpb24gKkYpOworICAvLy8gUmV0dXJucyB0cnVlIGlmIFxwIEYgY29udGFpbnMgaG90IGNvZGUuCisgIGJvb2wgaXNGdW5jdGlvbkhvdEluQ2FsbEdyYXBoKGNvbnN0IEZ1bmN0aW9uICpGLCBCbG9ja0ZyZXF1ZW5jeUluZm8gJkJGSSk7CisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIFxwIEYgaGFzIGNvbGQgZnVuY3Rpb24gZW50cnkuCisgIGJvb2wgaXNGdW5jdGlvbkVudHJ5Q29sZChjb25zdCBGdW5jdGlvbiAqRik7CisgIC8vLyBSZXR1cm5zIHRydWUgaWYgXHAgRiBjb250YWlucyBvbmx5IGNvbGQgY29kZS4KKyAgYm9vbCBpc0Z1bmN0aW9uQ29sZEluQ2FsbEdyYXBoKGNvbnN0IEZ1bmN0aW9uICpGLCBCbG9ja0ZyZXF1ZW5jeUluZm8gJkJGSSk7CisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIFxwIEYgaXMgYSBob3QgZnVuY3Rpb24uCisgIGJvb2wgaXNIb3RDb3VudCh1aW50NjRfdCBDKTsKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgY291bnQgXHAgQyBpcyBjb25zaWRlcmVkIGNvbGQuCisgIGJvb2wgaXNDb2xkQ291bnQodWludDY0X3QgQyk7CisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIEJhc2ljQmxvY2sgXHAgQiBpcyBjb25zaWRlcmVkIGhvdC4KKyAgYm9vbCBpc0hvdEJCKGNvbnN0IEJhc2ljQmxvY2sgKkIsIEJsb2NrRnJlcXVlbmN5SW5mbyAqQkZJKTsKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgQmFzaWNCbG9jayBccCBCIGlzIGNvbnNpZGVyZWQgY29sZC4KKyAgYm9vbCBpc0NvbGRCQihjb25zdCBCYXNpY0Jsb2NrICpCLCBCbG9ja0ZyZXF1ZW5jeUluZm8gKkJGSSk7CisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIENhbGxTaXRlIFxwIENTIGlzIGNvbnNpZGVyZWQgaG90LgorICBib29sIGlzSG90Q2FsbFNpdGUoY29uc3QgQ2FsbFNpdGUgJkNTLCBCbG9ja0ZyZXF1ZW5jeUluZm8gKkJGSSk7CisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIENhbGxzaXRlIFxwIENTIGlzIGNvbnNpZGVyZWQgY29sZC4KKyAgYm9vbCBpc0NvbGRDYWxsU2l0ZShjb25zdCBDYWxsU2l0ZSAmQ1MsIEJsb2NrRnJlcXVlbmN5SW5mbyAqQkZJKTsKKyAgLy8vIFxicmllZiBSZXR1cm5zIEhvdENvdW50VGhyZXNob2xkIGlmIHNldC4KKyAgdWludDY0X3QgZ2V0SG90Q291bnRUaHJlc2hvbGQoKSB7CisgICAgcmV0dXJuIEhvdENvdW50VGhyZXNob2xkID8gSG90Q291bnRUaHJlc2hvbGQuZ2V0VmFsdWUoKSA6IDA7CisgIH0KKyAgLy8vIFxicmllZiBSZXR1cm5zIENvbGRDb3VudFRocmVzaG9sZCBpZiBzZXQuCisgIHVpbnQ2NF90IGdldENvbGRDb3VudFRocmVzaG9sZCgpIHsKKyAgICByZXR1cm4gQ29sZENvdW50VGhyZXNob2xkID8gQ29sZENvdW50VGhyZXNob2xkLmdldFZhbHVlKCkgOiAwOworICB9Cit9OworCisvLy8gQW4gYW5hbHlzaXMgcGFzcyBiYXNlZCBvbiBsZWdhY3kgcGFzcyBtYW5hZ2VyIHRvIGRlbGl2ZXIgUHJvZmlsZVN1bW1hcnlJbmZvLgorY2xhc3MgUHJvZmlsZVN1bW1hcnlJbmZvV3JhcHBlclBhc3MgOiBwdWJsaWMgSW1tdXRhYmxlUGFzcyB7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcm9maWxlU3VtbWFyeUluZm8+IFBTSTsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKyAgUHJvZmlsZVN1bW1hcnlJbmZvV3JhcHBlclBhc3MoKTsKKworICBQcm9maWxlU3VtbWFyeUluZm8gKmdldFBTSSgpIHsKKyAgICByZXR1cm4gJipQU0k7CisgIH0KKworICBib29sIGRvSW5pdGlhbGl6YXRpb24oTW9kdWxlICZNKSBvdmVycmlkZTsKKyAgYm9vbCBkb0ZpbmFsaXphdGlvbihNb2R1bGUgJk0pIG92ZXJyaWRlOworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgfQorfTsKKworLy8vIEFuIGFuYWx5c2lzIHBhc3MgYmFzZWQgb24gdGhlIG5ldyBQTSB0byBkZWxpdmVyIFByb2ZpbGVTdW1tYXJ5SW5mby4KK2NsYXNzIFByb2ZpbGVTdW1tYXJ5QW5hbHlzaXMKKyAgICA6IHB1YmxpYyBBbmFseXNpc0luZm9NaXhpbjxQcm9maWxlU3VtbWFyeUFuYWx5c2lzPiB7CitwdWJsaWM6CisgIHR5cGVkZWYgUHJvZmlsZVN1bW1hcnlJbmZvIFJlc3VsdDsKKworICBSZXN1bHQgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICYpOworCitwcml2YXRlOgorICBmcmllbmQgQW5hbHlzaXNJbmZvTWl4aW48UHJvZmlsZVN1bW1hcnlBbmFseXNpcz47CisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7Cit9OworCisvLy8gXGJyaWVmIFByaW50ZXIgcGFzcyB0aGF0IHVzZXMgXGMgUHJvZmlsZVN1bW1hcnlBbmFseXNpcy4KK2NsYXNzIFByb2ZpbGVTdW1tYXJ5UHJpbnRlclBhc3MKKyAgICA6IHB1YmxpYyBQYXNzSW5mb01peGluPFByb2ZpbGVTdW1tYXJ5UHJpbnRlclBhc3M+IHsKKyAgcmF3X29zdHJlYW0gJk9TOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFByb2ZpbGVTdW1tYXJ5UHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk9TKSA6IE9TKE9TKSB7fQorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9QdHJVc2VWaXNpdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1B0clVzZVZpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTM0YWE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9QdHJVc2VWaXNpdG9yLmgKQEAgLTAsMCArMSwzMDMgQEAKKy8vPT09LSBQdHJVc2VWaXNpdG9yLmggLSBJbnN0VmlzaXRvcnMgb3ZlciBhIHBvaW50ZXJzIHVzZXMgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIHByb3ZpZGVzIGEgY29sbGVjdGlvbiBvZiB2aXNpdG9ycyB3aGljaCB3YWxrIHRoZSAoaW5zdHJ1Y3Rpb24pCisvLy8gdXNlcyBvZiBhIHBvaW50ZXIuIFRoZXNlIHZpc2l0b3JzIGFsbCBwcm92aWRlIHRoZSBzYW1lIGVzc2VudGlhbCBiZWhhdmlvcgorLy8vIGFzIGFuIEluc3RWaXNpdG9yIHdpdGggc2ltaWxhciB0ZW1wbGF0ZS1iYXNlZCBmbGV4aWJpbGl0eSBhbmQKKy8vLyBpbXBsZW1lbnRhdGlvbiBzdHJhdGVnaWVzLgorLy8vCisvLy8gVGhlc2UgY2FuIGJlIHVzZWQsIGZvciBleGFtcGxlLCB0byBxdWlja2x5IGFuYWx5emUgdGhlIHVzZXMgb2YgYW4gYWxsb2NhLAorLy8vIGdsb2JhbCB2YXJpYWJsZSwgb3IgZnVuY3Rpb24gYXJndW1lbnQuCisvLy8KKy8vLyBGSVhNRTogUHJvdmlkZSBhIHZhcmlhbnQgd2hpY2ggZG9lc24ndCB0cmFjayBvZmZzZXRzIGFuZCBpcyBjaGVhcGVyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19QVFJVU0VWSVNJVE9SX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19QVFJVU0VWSVNJVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FQSW50LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGF0YUxheW91dC5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0VmlzaXRvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVXNlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Vc2VyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgZGV0YWlsIHsKKworLy8vIFxicmllZiBJbXBsZW1lbnRhdGlvbiBvZiBub24tZGVwZW5kZW50IGZ1bmN0aW9uYWxpdHkgZm9yIFxjIFB0clVzZVZpc2l0b3IuCisvLy8KKy8vLyBTZWUgXGMgUHRyVXNlVmlzaXRvciBmb3IgdGhlIHB1YmxpYyBpbnRlcmZhY2UgYW5kIGRldGFpbGVkIGNvbW1lbnRzIGFib3V0CisvLy8gdXNhZ2UuIFRoaXMgY2xhc3MgaXMganVzdCBhIGhlbHBlciBiYXNlIGNsYXNzIHdoaWNoIGlzIG5vdCB0ZW1wbGF0ZWQgYW5kCisvLy8gY29udGFpbnMgYWxsIGNvbW1vbiBjb2RlIHRvIGJlIHNoYXJlZCBiZXR3ZWVuIGRpZmZlcmVudCBpbnN0YW50aWF0aW9ucyBvZgorLy8vIFB0clVzZVZpc2l0b3IuCitjbGFzcyBQdHJVc2VWaXNpdG9yQmFzZSB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgVGhpcyBjbGFzcyBwcm92aWRlcyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcmVzdWx0IG9mIGEgdmlzaXQuCisgIC8vLworICAvLy8gQWZ0ZXIgd2Fsa2luZyBhbGwgdGhlIHVzZXJzIChyZWN1cnNpdmVseSkgb2YgYSBwb2ludGVyLCB0aGUgYmFzaWMKKyAgLy8vIGluZnJhc3RydWN0dXJlIHJlY29yZHMgc29tZSBjb21tb25seSB1c2VmdWwgaW5mb3JtYXRpb24gc3VjaCBhcyBlc2NhcGUKKyAgLy8vIGFuYWx5c2lzIGFuZCB3aGV0aGVyIHRoZSB2aXNpdCBjb21wbGV0ZWQgb3IgYWJvcnRlZCBlYXJseS4KKyAgY2xhc3MgUHRySW5mbyB7CisgIHB1YmxpYzoKKyAgICBQdHJJbmZvKCkgOiBBYm9ydGVkSW5mbyhudWxscHRyLCBmYWxzZSksIEVzY2FwZWRJbmZvKG51bGxwdHIsIGZhbHNlKSB7fQorCisgICAgLy8vIFxicmllZiBSZXNldCB0aGUgcG9pbnRlciBpbmZvLCBjbGVhcmluZyBhbGwgc3RhdGUuCisgICAgdm9pZCByZXNldCgpIHsKKyAgICAgIEFib3J0ZWRJbmZvLnNldFBvaW50ZXIobnVsbHB0cik7CisgICAgICBBYm9ydGVkSW5mby5zZXRJbnQoZmFsc2UpOworICAgICAgRXNjYXBlZEluZm8uc2V0UG9pbnRlcihudWxscHRyKTsKKyAgICAgIEVzY2FwZWRJbmZvLnNldEludChmYWxzZSk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBEaWQgd2UgYWJvcnQgdGhlIHZpc2l0IGVhcmx5PworICAgIGJvb2wgaXNBYm9ydGVkKCkgY29uc3QgeyByZXR1cm4gQWJvcnRlZEluZm8uZ2V0SW50KCk7IH0KKworICAgIC8vLyBcYnJpZWYgSXMgdGhlIHBvaW50ZXIgZXNjYXBlZCBhdCBzb21lIHBvaW50PworICAgIGJvb2wgaXNFc2NhcGVkKCkgY29uc3QgeyByZXR1cm4gRXNjYXBlZEluZm8uZ2V0SW50KCk7IH0KKworICAgIC8vLyBcYnJpZWYgR2V0IHRoZSBpbnN0cnVjdGlvbiBjYXVzaW5nIHRoZSB2aXNpdCB0byBhYm9ydC4KKyAgICAvLy8gXHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBpbnN0cnVjdGlvbiBjYXVzaW5nIHRoZSBhYm9ydCBpZiBvbmUgaXMKKyAgICAvLy8gYXZhaWxhYmxlOyBvdGhlcndpc2UgcmV0dXJucyBudWxsLgorICAgIEluc3RydWN0aW9uICpnZXRBYm9ydGluZ0luc3QoKSBjb25zdCB7IHJldHVybiBBYm9ydGVkSW5mby5nZXRQb2ludGVyKCk7IH0KKworICAgIC8vLyBcYnJpZWYgR2V0IHRoZSBpbnN0cnVjdGlvbiBjYXVzaW5nIHRoZSBwb2ludGVyIHRvIGVzY2FwZS4KKyAgICAvLy8gXHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBpbnN0cnVjdGlvbiB3aGljaCBlc2NhcGVzIHRoZSBwb2ludGVyIGlmIG9uZQorICAgIC8vLyBpcyBhdmFpbGFibGU7IG90aGVyd2lzZSByZXR1cm5zIG51bGwuCisgICAgSW5zdHJ1Y3Rpb24gKmdldEVzY2FwaW5nSW5zdCgpIGNvbnN0IHsgcmV0dXJuIEVzY2FwZWRJbmZvLmdldFBvaW50ZXIoKTsgfQorCisgICAgLy8vIFxicmllZiBNYXJrIHRoZSB2aXNpdCBhcyBhYm9ydGVkLiBJbnRlbmRlZCBmb3IgdXNlIGluIGEgdm9pZCByZXR1cm4uCisgICAgLy8vIFxwYXJhbSBJIFRoZSBpbnN0cnVjdGlvbiB3aGljaCBjYXVzZWQgdGhlIHZpc2l0IHRvIGFib3J0LCBpZiBhdmFpbGFibGUuCisgICAgdm9pZCBzZXRBYm9ydGVkKEluc3RydWN0aW9uICpJID0gbnVsbHB0cikgeworICAgICAgQWJvcnRlZEluZm8uc2V0SW50KHRydWUpOworICAgICAgQWJvcnRlZEluZm8uc2V0UG9pbnRlcihJKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIE1hcmsgdGhlIHBvaW50ZXIgYXMgZXNjYXBlZC4gSW50ZW5kZWQgZm9yIHVzZSBpbiBhIHZvaWQgcmV0dXJuLgorICAgIC8vLyBccGFyYW0gSSBUaGUgaW5zdHJ1Y3Rpb24gd2hpY2ggZXNjYXBlcyB0aGUgcG9pbnRlciwgaWYgYXZhaWxhYmxlLgorICAgIHZvaWQgc2V0RXNjYXBlZChJbnN0cnVjdGlvbiAqSSA9IG51bGxwdHIpIHsKKyAgICAgIEVzY2FwZWRJbmZvLnNldEludCh0cnVlKTsKKyAgICAgIEVzY2FwZWRJbmZvLnNldFBvaW50ZXIoSSk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBNYXJrIHRoZSBwb2ludGVyIGFzIGVzY2FwZWQsIGFuZCB0aGUgdmlzaXQgYXMgYWJvcnRlZC4gSW50ZW5kZWQKKyAgICAvLy8gZm9yIHVzZSBpbiBhIHZvaWQgcmV0dXJuLgorICAgIC8vLyBccGFyYW0gSSBUaGUgaW5zdHJ1Y3Rpb24gd2hpY2ggYm90aCBlc2NhcGVzIHRoZSBwb2ludGVyIGFuZCBhYm9ydHMgdGhlCisgICAgLy8vIHZpc2l0LCBpZiBhdmFpbGFibGUuCisgICAgdm9pZCBzZXRFc2NhcGVkQW5kQWJvcnRlZChJbnN0cnVjdGlvbiAqSSA9IG51bGxwdHIpIHsKKyAgICAgIHNldEVzY2FwZWQoSSk7CisgICAgICBzZXRBYm9ydGVkKEkpOworICAgIH0KKworICBwcml2YXRlOgorICAgIFBvaW50ZXJJbnRQYWlyPEluc3RydWN0aW9uICosIDEsIGJvb2w+IEFib3J0ZWRJbmZvLCBFc2NhcGVkSW5mbzsKKyAgfTsKKworcHJvdGVjdGVkOgorICBjb25zdCBEYXRhTGF5b3V0ICZETDsKKworICAvLy8gXG5hbWUgVmlzaXRhdGlvbiBpbmZyYXN0cnVjdHVyZQorICAvLy8gQHsKKworICAvLy8gXGJyaWVmIFRoZSBpbmZvIGNvbGxlY3RlZCBhYm91dCB0aGUgcG9pbnRlciBiZWluZyB2aXNpdGVkIHRodXMgZmFyLgorICBQdHJJbmZvIFBJOworCisgIC8vLyBcYnJpZWYgQSBzdHJ1Y3Qgb2YgdGhlIGRhdGEgbmVlZGVkIHRvIHZpc2l0IGEgcGFydGljdWxhciB1c2UuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIHRvIG1haW50YWluIGEgd29ya2xpc3QgZm8gdG8tdmlzaXQgdXNlcy4gVGhpcyBpcyB1c2VkIHRvCisgIC8vLyBtYWtlIHRoZSB2aXNpdCBiZSBpdGVyYXRpdmUgcmF0aGVyIHRoYW4gcmVjdXJzaXZlLgorICBzdHJ1Y3QgVXNlVG9WaXNpdCB7CisgICAgdXNpbmcgVXNlQW5kSXNPZmZzZXRLbm93blBhaXIgPSBQb2ludGVySW50UGFpcjxVc2UgKiwgMSwgYm9vbD47CisKKyAgICBVc2VBbmRJc09mZnNldEtub3duUGFpciBVc2VBbmRJc09mZnNldEtub3duOworICAgIEFQSW50IE9mZnNldDsKKyAgfTsKKworICAvLy8gXGJyaWVmIFRoZSB3b3JrbGlzdCBvZiB0by12aXNpdCB1c2VzLgorICBTbWFsbFZlY3RvcjxVc2VUb1Zpc2l0LCA4PiBXb3JrbGlzdDsKKworICAvLy8gXGJyaWVmIEEgc2V0IG9mIHZpc2l0ZWQgdXNlcyB0byBicmVhayBjeWNsZXMgaW4gdW5yZWFjaGFibGUgY29kZS4KKyAgU21hbGxQdHJTZXQ8VXNlICosIDg+IFZpc2l0ZWRVc2VzOworCisgIC8vLyBAfQorCisgIC8vLyBcbmFtZSBQZXItdmlzaXQgc3RhdGUKKyAgLy8vIFRoaXMgc3RhdGUgaXMgcmVzZXQgZm9yIGVhY2ggaW5zdHJ1Y3Rpb24gdmlzaXRlZC4KKyAgLy8vIEB7CisKKyAgLy8vIFxicmllZiBUaGUgdXNlIGN1cnJlbnRseSBiZWluZyB2aXNpdGVkLgorICBVc2UgKlU7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHdlIGhhdmUgYSBrbm93biBjb25zdGFudCBvZmZzZXQgZm9yIHRoZSB1c2UgY3VycmVudGx5CisgIC8vLyBiZWluZyB2aXNpdGVkLgorICBib29sIElzT2Zmc2V0S25vd247CisKKyAgLy8vIFxicmllZiBUaGUgY29uc3RhbnQgb2Zmc2V0IG9mIHRoZSB1c2UgaWYgdGhhdCBpcyBrbm93bi4KKyAgQVBJbnQgT2Zmc2V0OworCisgIC8vLyBAfQorCisgIC8vLyBOb3RlIHRoYXQgdGhlIGNvbnN0cnVjdG9yIGlzIHByb3RlY3RlZCBiZWNhdXNlIHRoaXMgY2xhc3MgbXVzdCBiZSBhIGJhc2UKKyAgLy8vIGNsYXNzLCB3ZSBjYW4ndCBjcmVhdGUgaW5zdGFuY2VzIGRpcmVjdGx5IG9mIHRoaXMgY2xhc3MuCisgIFB0clVzZVZpc2l0b3JCYXNlKGNvbnN0IERhdGFMYXlvdXQgJkRMKSA6IERMKERMKSB7fQorCisgIC8vLyBcYnJpZWYgRW5xdWV1ZSB0aGUgdXNlcnMgb2YgdGhpcyBpbnN0cnVjdGlvbiBpbiB0aGUgdmlzaXQgd29ya2xpc3QuCisgIC8vLworICAvLy8gVGhpcyB3aWxsIHZpc2l0IHRoZSB1c2VycyB3aXRoIHRoZSBzYW1lIG9mZnNldCBvZiB0aGUgY3VycmVudCB2aXNpdAorICAvLy8gKGluY2x1ZGluZyBhbiB1bmtub3duIG9mZnNldCBpZiB0aGF0IGlzIHRoZSBjdXJyZW50IHN0YXRlKS4KKyAgdm9pZCBlbnF1ZXVlVXNlcnMoSW5zdHJ1Y3Rpb24gJkkpOworCisgIC8vLyBcYnJpZWYgV2FsayB0aGUgb3BlcmFuZHMgb2YgYSBHRVAgYW5kIGFkanVzdCB0aGUgb2Zmc2V0IGFzIGFwcHJvcHJpYXRlLgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSBkb2VzIHRoZSBoZWF2eSBsaWZ0aW5nIG9mIHRoZSBwb2ludGVyIHdhbGsgYnkgY29tcHV0aW5nCisgIC8vLyBvZmZzZXRzIGFuZCBsb29raW5nIHRocm91Z2ggR0VQcy4KKyAgYm9vbCBhZGp1c3RPZmZzZXRGb3JHRVAoR2V0RWxlbWVudFB0ckluc3QgJkdFUEkpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAorCisvLy8gXGJyaWVmIEEgYmFzZSBjbGFzcyBmb3IgdmlzaXRvcnMgb3ZlciB0aGUgdXNlcyBvZiBhIHBvaW50ZXIgdmFsdWUuCisvLy8KKy8vLyBPbmNlIGNvbnN0cnVjdGVkLCBhIHVzZXIgY2FuIGNhbGwgXGMgdmlzaXQgb24gYSBwb2ludGVyIHZhbHVlLCBhbmQgdGhpcworLy8vIHdpbGwgd2FsayBpdHMgdXNlcyBhbmQgdmlzaXQgZWFjaCBpbnN0cnVjdGlvbiB1c2luZyBhbiBJbnN0VmlzaXRvci4gSXQgYWxzbworLy8vIHByb3ZpZGVzIHZpc2l0IG1ldGhvZHMgd2hpY2ggd2lsbCByZWN1cnNlIHRocm91Z2ggYW55IHBvaW50ZXItdG8tcG9pbnRlcgorLy8vIHRyYW5zZm9ybWF0aW9ucyBzdWNoIGFzIEdFUHMgYW5kIGJpdGNhc3RzLgorLy8vCisvLy8gRHVyaW5nIHRoZSB2aXNpdCwgdGhlIGN1cnJlbnQgVXNlKiBiZWluZyB2aXNpdGVkIGlzIGF2YWlsYWJsZSB0byB0aGUKKy8vLyBzdWJjbGFzcywgYXMgd2VsbCBhcyB0aGUgY3VycmVudCBvZmZzZXQgZnJvbSB0aGUgb3JpZ2luYWwgYmFzZSBwb2ludGVyIGlmCisvLy8ga25vd24uCisvLy8KKy8vLyBUaGUgcmVjdXJzaXZlIHZpc2l0IG9mIHVzZXMgaXMgYWNjb21wbGlzaGVkIHdpdGggYSB3b3JrbGlzdCwgc28gdGhlIG9ubHkKKy8vLyBvcmRlcmluZyBndWFyYW50ZWUgaXMgdGhhdCBhbiBpbnN0cnVjdGlvbiBpcyB2aXNpdGVkIGJlZm9yZSBhbnkgdXNlcyBvZiBpdAorLy8vIGFyZSB2aXNpdGVkLiBOb3RlIHRoYXQgdGhpcyBkb2VzICpub3QqIG1lYW4gYmVmb3JlIGFueSBvZiBpdHMgdXNlcnMgYXJlCisvLy8gdmlzaXRlZCEgVGhpcyBpcyBiZWNhdXNlIHVzZXJzIGNhbiBiZSB2aXNpdGVkIG11bHRpcGxlIHRpbWVzIGR1ZSB0bworLy8vIG11bHRpcGxlLCBkaWZmZXJlbnQgdXNlcyBvZiBwb2ludGVycyBkZXJpdmVkIGZyb20gdGhlIHNhbWUgYmFzZS4KKy8vLworLy8vIEEgcGFydGljdWxhciBVc2Ugd2lsbCBvbmx5IGJlIHZpc2l0ZWQgb25jZSwgYnV0IGEgVXNlciBtYXkgYmUgdmlzaXRlZAorLy8vIG11bHRpcGxlIHRpbWVzLCBvbmNlIHBlciBVc2UuIFRoaXMgdmlzaXRzIG1heSBub3RhYmx5IGhhdmUgZGlmZmVyZW50CisvLy8gb2Zmc2V0cy4KKy8vLworLy8vIEFsbCB2aXNpdCBtZXRob2RzIG9uIHRoZSB1bmRlcmx5aW5nIEluc3RWaXNpdG9yIHJldHVybiBhIGJvb2xlYW4uIFRoaXMKKy8vLyByZXR1cm4gc2hvcnQtY2lyY3VpdHMgdGhlIHZpc2l0LCBzdG9wcGluZyBpdCBpbW1lZGlhdGVseS4KKy8vLworLy8vIEZJWE1FOiBHZW5lcmFsaXplIHRoaXMgZm9yIGFsbCB2YWx1ZXMgcmF0aGVyIHRoYW4ganVzdCBpbnN0cnVjdGlvbnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZFQ+CitjbGFzcyBQdHJVc2VWaXNpdG9yIDogcHJvdGVjdGVkIEluc3RWaXNpdG9yPERlcml2ZWRUPiwKKyAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgZGV0YWlsOjpQdHJVc2VWaXNpdG9yQmFzZSB7CisgIGZyaWVuZCBjbGFzcyBJbnN0VmlzaXRvcjxEZXJpdmVkVD47CisKKyAgdXNpbmcgQmFzZSA9IEluc3RWaXNpdG9yPERlcml2ZWRUPjsKKworcHVibGljOgorICBQdHJVc2VWaXNpdG9yKGNvbnN0IERhdGFMYXlvdXQgJkRMKSA6IFB0clVzZVZpc2l0b3JCYXNlKERMKSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2Jhc2Vfb2Y8UHRyVXNlVmlzaXRvciwgRGVyaXZlZFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJNdXN0IHBhc3MgdGhlIGRlcml2ZWQgdHlwZSB0byB0aGlzIHRlbXBsYXRlISIpOworICB9CisKKyAgLy8vIFxicmllZiBSZWN1cnNpdmVseSB2aXNpdCB0aGUgdXNlcyBvZiB0aGUgZ2l2ZW4gcG9pbnRlci4KKyAgLy8vIFxyZXR1cm5zIEFuIGluZm8gc3RydWN0IGFib3V0IHRoZSBwb2ludGVyLiBTZWUgXGMgUHRySW5mbyBmb3IgZGV0YWlscy4KKyAgUHRySW5mbyB2aXNpdFB0cihJbnN0cnVjdGlvbiAmSSkgeworICAgIC8vIFRoaXMgbXVzdCBiZSBhIHBvaW50ZXIgdHlwZS4gR2V0IGFuIGludGVnZXIgdHlwZSBzdWl0YWJsZSB0byBob2xkCisgICAgLy8gb2Zmc2V0cyBvbiB0aGlzIHBvaW50ZXIuCisgICAgLy8gRklYTUU6IFN1cHBvcnQgYSB2ZWN0b3Igb2YgcG9pbnRlcnMuCisgICAgYXNzZXJ0KEkuZ2V0VHlwZSgpLT5pc1BvaW50ZXJUeSgpKTsKKyAgICBJbnRlZ2VyVHlwZSAqSW50UHRyVHkgPSBjYXN0PEludGVnZXJUeXBlPihETC5nZXRJbnRQdHJUeXBlKEkuZ2V0VHlwZSgpKSk7CisgICAgSXNPZmZzZXRLbm93biA9IHRydWU7CisgICAgT2Zmc2V0ID0gQVBJbnQoSW50UHRyVHktPmdldEJpdFdpZHRoKCksIDApOworICAgIFBJLnJlc2V0KCk7CisKKyAgICAvLyBFbnF1ZXVlIHRoZSB1c2VzIG9mIHRoaXMgcG9pbnRlci4KKyAgICBlbnF1ZXVlVXNlcnMoSSk7CisKKyAgICAvLyBWaXNpdCBhbGwgdGhlIHVzZXMgb2ZmIHRoZSB3b3JrbGlzdCB1bnRpbCBpdCBpcyBlbXB0eS4KKyAgICB3aGlsZSAoIVdvcmtsaXN0LmVtcHR5KCkpIHsKKyAgICAgIFVzZVRvVmlzaXQgVG9WaXNpdCA9IFdvcmtsaXN0LnBvcF9iYWNrX3ZhbCgpOworICAgICAgVSA9IFRvVmlzaXQuVXNlQW5kSXNPZmZzZXRLbm93bi5nZXRQb2ludGVyKCk7CisgICAgICBJc09mZnNldEtub3duID0gVG9WaXNpdC5Vc2VBbmRJc09mZnNldEtub3duLmdldEludCgpOworICAgICAgaWYgKElzT2Zmc2V0S25vd24pCisgICAgICAgIE9mZnNldCA9IHN0ZDo6bW92ZShUb1Zpc2l0Lk9mZnNldCk7CisKKyAgICAgIEluc3RydWN0aW9uICpJID0gY2FzdDxJbnN0cnVjdGlvbj4oVS0+Z2V0VXNlcigpKTsKKyAgICAgIHN0YXRpY19jYXN0PERlcml2ZWRUKj4odGhpcyktPnZpc2l0KEkpOworICAgICAgaWYgKFBJLmlzQWJvcnRlZCgpKQorICAgICAgICBicmVhazsKKyAgICB9CisgICAgcmV0dXJuIFBJOworICB9CisKK3Byb3RlY3RlZDoKKyAgdm9pZCB2aXNpdFN0b3JlSW5zdChTdG9yZUluc3QgJlNJKSB7CisgICAgaWYgKFNJLmdldFZhbHVlT3BlcmFuZCgpID09IFUtPmdldCgpKQorICAgICAgUEkuc2V0RXNjYXBlZCgmU0kpOworICB9CisKKyAgdm9pZCB2aXNpdEJpdENhc3RJbnN0KEJpdENhc3RJbnN0ICZCQykgeworICAgIGVucXVldWVVc2VycyhCQyk7CisgIH0KKworICB2b2lkIHZpc2l0UHRyVG9JbnRJbnN0KFB0clRvSW50SW5zdCAmSSkgeworICAgIFBJLnNldEVzY2FwZWQoJkkpOworICB9CisKKyAgdm9pZCB2aXNpdEdldEVsZW1lbnRQdHJJbnN0KEdldEVsZW1lbnRQdHJJbnN0ICZHRVBJKSB7CisgICAgaWYgKEdFUEkudXNlX2VtcHR5KCkpCisgICAgICByZXR1cm47CisKKyAgICAvLyBJZiB3ZSBjYW4ndCB3YWxrIHRoZSBHRVAsIGNsZWFyIHRoZSBvZmZzZXQuCisgICAgaWYgKCFhZGp1c3RPZmZzZXRGb3JHRVAoR0VQSSkpIHsKKyAgICAgIElzT2Zmc2V0S25vd24gPSBmYWxzZTsKKyAgICAgIE9mZnNldCA9IEFQSW50KCk7CisgICAgfQorCisgICAgLy8gRW5xdWV1ZSB0aGUgdXNlcnMgbm93IHRoYXQgdGhlIG9mZnNldCBoYXMgYmVlbiBhZGp1c3RlZC4KKyAgICBlbnF1ZXVlVXNlcnMoR0VQSSk7CisgIH0KKworICAvLyBOby1vcCBpbnRyaW5zaWNzIHdoaWNoIHdlIGtub3cgZG9uJ3QgZXNjYXBlIHRoZSBwb2ludGVyIHRvIGxvZ2ljIGluCisgIC8vIHNvbWUgb3RoZXIgZnVuY3Rpb24uCisgIHZvaWQgdmlzaXREYmdJbmZvSW50cmluc2ljKERiZ0luZm9JbnRyaW5zaWMgJkkpIHt9CisgIHZvaWQgdmlzaXRNZW1JbnRyaW5zaWMoTWVtSW50cmluc2ljICZJKSB7fQorICB2b2lkIHZpc2l0SW50cmluc2ljSW5zdChJbnRyaW5zaWNJbnN0ICZJSSkgeworICAgIHN3aXRjaCAoSUkuZ2V0SW50cmluc2ljSUQoKSkgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gQmFzZTo6dmlzaXRJbnRyaW5zaWNJbnN0KElJKTsKKworICAgIGNhc2UgSW50cmluc2ljOjpsaWZldGltZV9zdGFydDoKKyAgICBjYXNlIEludHJpbnNpYzo6bGlmZXRpbWVfZW5kOgorICAgICAgcmV0dXJuOyAvLyBOby1vcCBpbnRyaW5zaWNzLgorICAgIH0KKyAgfQorCisgIC8vIEdlbmVyaWNhbGx5LCBhcmd1bWVudHMgdG8gY2FsbHMgYW5kIGludm9rZXMgZXNjYXBlIHRoZSBwb2ludGVyIHRvIHNvbWUKKyAgLy8gb3RoZXIgZnVuY3Rpb24uIE1hcmsgdGhhdC4KKyAgdm9pZCB2aXNpdENhbGxTaXRlKENhbGxTaXRlIENTKSB7CisgICAgUEkuc2V0RXNjYXBlZChDUy5nZXRJbnN0cnVjdGlvbigpKTsKKyAgICBCYXNlOjp2aXNpdENhbGxTaXRlKENTKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfUFRSVVNFVklTSVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1JlZ2lvbkluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUmVnaW9uSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZjY0ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1JlZ2lvbkluZm8uaApAQCAtMCwwICsxLDEwMzIgQEAKKy8vPT09LSBSZWdpb25JbmZvLmggLSBTRVNFIHJlZ2lvbiBhbmFseXNpcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ2FsY3VsYXRlIGEgcHJvZ3JhbSBzdHJ1Y3R1cmUgdHJlZSBidWlsdCBvdXQgb2Ygc2luZ2xlIGVudHJ5IHNpbmdsZSBleGl0CisvLyByZWdpb25zLgorLy8gVGhlIGJhc2ljIGlkZWFzIGFyZSB0YWtlbiBmcm9tICJUaGUgUHJvZ3JhbSBTdHJ1Y3R1cmUgVHJlZSAtIFJpY2hhcmQgSm9obnNvbiwKKy8vIERhdmlkIFBlYXJzb24sIEtlc2hhdiBQaW5nYWxpIC0gMTk5NCIsIGhvd2V2ZXIgZW5yaWNoZWQgd2l0aCBpZGVhcyBmcm9tICJUaGUKKy8vIFJlZmluZWQgUHJvY2VzcyBTdHJ1Y3R1cmUgVHJlZSAtIEp1c3NpIFZhbmhhdGFsbywgSGFnZW4gVm9lbHllciwgSmFuYQorLy8gS29laGxlciAtIDIwMDkiLgorLy8gVGhlIGFsZ29yaXRobSB0byBjYWxjdWxhdGUgdGhlc2UgZGF0YSBzdHJ1Y3R1cmVzIGhvd2V2ZXIgaXMgY29tcGxldGVseQorLy8gZGlmZmVyZW50LCBhcyBpdCB0YWtlcyBhZHZhbnRhZ2Ugb2YgZXhpc3RpbmcgaW5mb3JtYXRpb24gYWxyZWFkeSBhdmFpbGFibGUKKy8vIGluIChQb3N0KWRvbWluYWNlIHRyZWUgYW5kIGRvbWluYW5jZSBmcm9udGllciBwYXNzZXMuIFRoaXMgbGVhZHMgdG8gYSBzaW1wbGVyCisvLyBhbmQgaW4gcHJhY3RpY2UgaG9wZWZ1bGx5IGJldHRlciBwZXJmb3JtaW5nIGFsZ29yaXRobS4gVGhlIHJ1bnRpbWUgb2YgdGhlCisvLyBhbGdvcml0aG1zIGRlc2NyaWJlZCBpbiB0aGUgcGFwZXJzIGFib3ZlIGFyZSBib3RoIGxpbmVhciBpbiBncmFwaCBzaXplLAorLy8gTyhWK0UpLCB3aGVyZWFzIHRoaXMgYWxnb3JpdGhtIGlzIG5vdCwgYXMgdGhlIGRvbWluYW5jZSBmcm9udGllciBpbmZvcm1hdGlvbgorLy8gaXRzZWxmIGlzIG5vdCwgYnV0IGluIHByYWN0aWNlIHJ1bnRpbWUgc2VlbXMgdG8gYmUgaW4gdGhlIG9yZGVyIG9mIG1hZ25pdHVkZQorLy8gb2YgZG9taW5hbmNlIHRyZWUgY2FsY3VsYXRpb24uCisvLworLy8gV0FSTklORzogTExWTSBpcyBnZW5lcmFsbHkgdmVyeSBjb25jZXJuZWQgYWJvdXQgY29tcGlsZSB0aW1lIHN1Y2ggdGhhdAorLy8gICAgICAgICAgdGhlIHVzZSBvZiBhZGRpdGlvbmFsIGFuYWx5c2lzIHBhc3NlcyBpbiB0aGUgZGVmYXVsdAorLy8gICAgICAgICAgb3B0aW1pemF0aW9uIHNlcXVlbmNlIGlzIGF2b2lkZWQgYXMgbXVjaCBhcyBwb3NzaWJsZS4KKy8vICAgICAgICAgIFNwZWNpZmljYWxseSwgaWYgeW91IGRvIG5vdCBuZWVkIHRoZSBSZWdpb25JbmZvLCBidXQgZG9taW5hbmNlCisvLyAgICAgICAgICBpbmZvcm1hdGlvbiBjb3VsZCBiZSBzdWZmaWNpZW50IHBsZWFzZSBiYXNlIHlvdXIgd29yayBvbmx5IG9uCisvLyAgICAgICAgICB0aGUgZG9taW5hdG9yIHRyZWUuIE1vc3QgcGFzc2VzIG1haW50YWluIGl0LCBzdWNoIHRoYXQgdXNpbmcKKy8vICAgICAgICAgIGl0IGhhcyBvZnRlbiBuZWFyIHplcm8gY29zdC4gSW4gY29udHJhc3QgUmVnaW9uSW5mbyBpcyBieQorLy8gICAgICAgICAgZGVmYXVsdCBub3QgYXZhaWxhYmxlLCBpcyBub3QgbWFpbnRhaW5lZCBieSBleGlzdGluZworLy8gICAgICAgICAgdHJhbnNmb3JtYXRpb25zIGFuZCB0aGVyZSBpcyBubyBpbnRlbnRpb24gdG8gZG8gc28uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1JFR0lPTklORk9fSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1JFR0lPTklORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZXB0aEZpcnN0SXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBEb21pbmFuY2VGcm9udGllcjsKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBMb29wOworY2xhc3MgTG9vcEluZm87CitjbGFzcyBQb3N0RG9taW5hdG9yVHJlZTsKK2NsYXNzIFJlZ2lvbjsKK3RlbXBsYXRlIDxjbGFzcyBSZWdpb25Ucj4gY2xhc3MgUmVnaW9uQmFzZTsKK2NsYXNzIFJlZ2lvbkluZm87Cit0ZW1wbGF0ZSA8Y2xhc3MgUmVnaW9uVHI+IGNsYXNzIFJlZ2lvbkluZm9CYXNlOworY2xhc3MgUmVnaW9uTm9kZTsKKworLy8gQ2xhc3MgdG8gYmUgc3BlY2lhbGl6ZWQgZm9yIGRpZmZlcmVudCB1c2VycyBvZiBSZWdpb25JbmZvCisvLyAoaS5lLiBCYXNpY0Jsb2NrcyBvciBNYWNoaW5lQmFzaWNCbG9ja3MpLiBUaGlzIGlzIG9ubHkgdG8gYXZvaWQgbmVlZGluZyB0bworLy8gcGFzcyBhcm91bmQgYW4gdW5yZWFzb25hYmxlIG51bWJlciBvZiB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLgordGVtcGxhdGUgPGNsYXNzIEZ1bmNUXz4KK3N0cnVjdCBSZWdpb25UcmFpdHMgeworICAvLyBGdW5jVAorICAvLyBCbG9ja1QKKyAgLy8gUmVnaW9uVAorICAvLyBSZWdpb25Ob2RlVAorICAvLyBSZWdpb25JbmZvVAorICB1c2luZyBCcm9rZW5UID0gdHlwZW5hbWUgRnVuY1RfOjpVbmtub3duUmVnaW9uVHlwZUVycm9yOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBSZWdpb25UcmFpdHM8RnVuY3Rpb24+IHsKKyAgdXNpbmcgRnVuY1QgPSBGdW5jdGlvbjsKKyAgdXNpbmcgQmxvY2tUID0gQmFzaWNCbG9jazsKKyAgdXNpbmcgUmVnaW9uVCA9IFJlZ2lvbjsKKyAgdXNpbmcgUmVnaW9uTm9kZVQgPSBSZWdpb25Ob2RlOworICB1c2luZyBSZWdpb25JbmZvVCA9IFJlZ2lvbkluZm87CisgIHVzaW5nIERvbVRyZWVUID0gRG9taW5hdG9yVHJlZTsKKyAgdXNpbmcgRG9tVHJlZU5vZGVUID0gRG9tVHJlZU5vZGU7CisgIHVzaW5nIERvbUZyb250aWVyVCA9IERvbWluYW5jZUZyb250aWVyOworICB1c2luZyBQb3N0RG9tVHJlZVQgPSBQb3N0RG9taW5hdG9yVHJlZTsKKyAgdXNpbmcgSW5zdFQgPSBJbnN0cnVjdGlvbjsKKyAgdXNpbmcgTG9vcFQgPSBMb29wOworICB1c2luZyBMb29wSW5mb1QgPSBMb29wSW5mbzsKKworICBzdGF0aWMgdW5zaWduZWQgZ2V0TnVtU3VjY2Vzc29ycyhCYXNpY0Jsb2NrICpCQikgeworICAgIHJldHVybiBCQi0+Z2V0VGVybWluYXRvcigpLT5nZXROdW1TdWNjZXNzb3JzKCk7CisgIH0KK307CisKKy8vLyBAYnJpZWYgTWFya2VyIGNsYXNzIHRvIGl0ZXJhdGUgb3ZlciB0aGUgZWxlbWVudHMgb2YgYSBSZWdpb24gaW4gZmxhdCBtb2RlLgorLy8vCisvLy8gVGhlIGNsYXNzIGlzIHVzZWQgdG8gZWl0aGVyIGl0ZXJhdGUgaW4gRmxhdCBtb2RlIG9yIGJ5IG5vdCB1c2luZyBpdCB0byBub3QKKy8vLyBpdGVyYXRlIGluIEZsYXQgbW9kZS4gIER1cmluZyBhIEZsYXQgbW9kZSBpdGVyYXRpb24gYWxsIFJlZ2lvbnMgYXJlIGVudGVyZWQKKy8vLyBhbmQgdGhlIGl0ZXJhdGlvbiByZXR1cm5zIGV2ZXJ5IEJhc2ljQmxvY2suICBJZiB0aGUgRmxhdCBtb2RlIGlzIG5vdAorLy8vIHNlbGVjdGVkIGZvciBTdWJSZWdpb25zIGp1c3Qgb25lIFJlZ2lvbk5vZGUgY29udGFpbmluZyB0aGUgc3VicmVnaW9uIGlzCisvLy8gcmV0dXJuZWQuCit0ZW1wbGF0ZSA8Y2xhc3MgR3JhcGhUeXBlPgorY2xhc3MgRmxhdEl0IHt9OworCisvLy8gQGJyaWVmIEEgUmVnaW9uTm9kZSByZXByZXNlbnRzIGEgc3VicmVnaW9uIG9yIGEgQmFzaWNCbG9jayB0aGF0IGlzIHBhcnQgb2YgYQorLy8vIFJlZ2lvbi4KK3RlbXBsYXRlIDxjbGFzcyBUcj4KK2NsYXNzIFJlZ2lvbk5vZGVCYXNlIHsKKyAgZnJpZW5kIGNsYXNzIFJlZ2lvbkJhc2U8VHI+OworCitwdWJsaWM6CisgIHVzaW5nIEJsb2NrVCA9IHR5cGVuYW1lIFRyOjpCbG9ja1Q7CisgIHVzaW5nIFJlZ2lvblQgPSB0eXBlbmFtZSBUcjo6UmVnaW9uVDsKKworcHJpdmF0ZToKKyAgLy8vIFRoaXMgaXMgdGhlIGVudHJ5IGJhc2ljIGJsb2NrIHRoYXQgc3RhcnRzIHRoaXMgcmVnaW9uIG5vZGUuICBJZiB0aGlzIGlzIGEKKyAgLy8vIEJhc2ljQmxvY2sgUmVnaW9uTm9kZSwgdGhlbiBlbnRyeSBpcyBqdXN0IHRoZSBiYXNpYyBibG9jaywgdGhhdCB0aGlzCisgIC8vLyBSZWdpb25Ob2RlIHJlcHJlc2VudHMuICBPdGhlcndpc2UgaXQgaXMgdGhlIGVudHJ5IG9mIHRoaXMgKFN1YilSZWdpb25Ob2RlLgorICAvLy8KKyAgLy8vIEluIHRoZSBCQnRvUmVnaW9uTm9kZSBtYXAgb2YgdGhlIHBhcmVudCBvZiB0aGlzIG5vZGUsIEJCIHdpbGwgYWx3YXlzIG1hcAorICAvLy8gdG8gdGhpcyBub2RlIG5vIG1hdHRlciB3aGljaCBraW5kIG9mIG5vZGUgdGhpcyBvbmUgaXMuCisgIC8vLworICAvLy8gVGhlIG5vZGUgY2FuIGhvbGQgZWl0aGVyIGEgUmVnaW9uIG9yIGEgQmFzaWNCbG9jay4KKyAgLy8vIFVzZSBvbmUgYml0IHRvIHNhdmUsIGlmIHRoaXMgUmVnaW9uTm9kZSBpcyBhIHN1YnJlZ2lvbiBvciBCYXNpY0Jsb2NrCisgIC8vLyBSZWdpb25Ob2RlLgorICBQb2ludGVySW50UGFpcjxCbG9ja1QgKiwgMSwgYm9vbD4gZW50cnk7CisKKyAgLy8vIEBicmllZiBUaGUgcGFyZW50IFJlZ2lvbiBvZiB0aGlzIFJlZ2lvbk5vZGUuCisgIC8vLyBAc2VlIGdldFBhcmVudCgpCisgIFJlZ2lvblQgKnBhcmVudDsKKworcHJvdGVjdGVkOgorICAvLy8gQGJyaWVmIENyZWF0ZSBhIFJlZ2lvbk5vZGUuCisgIC8vLworICAvLy8gQHBhcmFtIFBhcmVudCAgICAgIFRoZSBwYXJlbnQgb2YgdGhpcyBSZWdpb25Ob2RlLgorICAvLy8gQHBhcmFtIEVudHJ5ICAgICAgIFRoZSBlbnRyeSBCYXNpY0Jsb2NrIG9mIHRoZSBSZWdpb25Ob2RlLiAgSWYgdGhpcworICAvLy8gICAgICAgICAgICAgICAgICAgIFJlZ2lvbk5vZGUgcmVwcmVzZW50cyBhIEJhc2ljQmxvY2ssIHRoaXMgaXMgdGhlCisgIC8vLyAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayBpdHNlbGYuICBJZiBpdCByZXByZXNlbnRzIGEgc3VicmVnaW9uLCB0aGlzCisgIC8vLyAgICAgICAgICAgICAgICAgICAgaXMgdGhlIGVudHJ5IEJhc2ljQmxvY2sgb2YgdGhlIHN1YnJlZ2lvbi4KKyAgLy8vIEBwYXJhbSBpc1N1YlJlZ2lvbiBJZiB0aGlzIFJlZ2lvbk5vZGUgcmVwcmVzZW50cyBhIFN1YlJlZ2lvbi4KKyAgaW5saW5lIFJlZ2lvbk5vZGVCYXNlKFJlZ2lvblQgKlBhcmVudCwgQmxvY2tUICpFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdWJSZWdpb24gPSBmYWxzZSkKKyAgICAgIDogZW50cnkoRW50cnksIGlzU3ViUmVnaW9uKSwgcGFyZW50KFBhcmVudCkge30KKworcHVibGljOgorICBSZWdpb25Ob2RlQmFzZShjb25zdCBSZWdpb25Ob2RlQmFzZSAmKSA9IGRlbGV0ZTsKKyAgUmVnaW9uTm9kZUJhc2UgJm9wZXJhdG9yPShjb25zdCBSZWdpb25Ob2RlQmFzZSAmKSA9IGRlbGV0ZTsKKworICAvLy8gQGJyaWVmIEdldCB0aGUgcGFyZW50IFJlZ2lvbiBvZiB0aGlzIFJlZ2lvbk5vZGUuCisgIC8vLworICAvLy8gVGhlIHBhcmVudCBSZWdpb24gaXMgdGhlIFJlZ2lvbiB0aGlzIFJlZ2lvbk5vZGUgYmVsb25ncyB0by4gSWYgZm9yCisgIC8vLyBleGFtcGxlIGEgQmFzaWNCbG9jayBpcyBlbGVtZW50IG9mIHR3byBSZWdpb25zLCB0aGVyZSBleGlzdCB0d28KKyAgLy8vIFJlZ2lvbk5vZGVzIGZvciB0aGlzIEJhc2ljQmxvY2suIEVhY2ggd2l0aCB0aGUgZ2V0UGFyZW50KCkgZnVuY3Rpb24KKyAgLy8vIHBvaW50aW5nIHRvIHRoZSBSZWdpb24gdGhpcyBSZWdpb25Ob2RlIGJlbG9uZ3MgdG8uCisgIC8vLworICAvLy8gQHJldHVybiBHZXQgdGhlIHBhcmVudCBSZWdpb24gb2YgdGhpcyBSZWdpb25Ob2RlLgorICBpbmxpbmUgUmVnaW9uVCAqZ2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4gcGFyZW50OyB9CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIGVudHJ5IEJhc2ljQmxvY2sgb2YgdGhpcyBSZWdpb25Ob2RlLgorICAvLy8KKyAgLy8vIElmIHRoaXMgUmVnaW9uTm9kZSByZXByZXNlbnRzIGEgQmFzaWNCbG9jayB0aGlzIGlzIGp1c3QgdGhlIEJhc2ljQmxvY2sKKyAgLy8vIGl0c2VsZiwgb3RoZXJ3aXNlIHdlIHJldHVybiB0aGUgZW50cnkgQmFzaWNCbG9jayBvZiB0aGUgU3VicmVnaW9uCisgIC8vLworICAvLy8gQHJldHVybiBUaGUgZW50cnkgQmFzaWNCbG9jayBvZiB0aGlzIFJlZ2lvbk5vZGUuCisgIGlubGluZSBCbG9ja1QgKmdldEVudHJ5KCkgY29uc3QgeyByZXR1cm4gZW50cnkuZ2V0UG9pbnRlcigpOyB9CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIGNvbnRlbnQgb2YgdGhpcyBSZWdpb25Ob2RlLgorICAvLy8KKyAgLy8vIFRoaXMgY2FuIGJlIGVpdGhlciBhIEJhc2ljQmxvY2sgb3IgYSBzdWJyZWdpb24uIEJlZm9yZSBjYWxsaW5nIGdldE5vZGVBcygpCisgIC8vLyBjaGVjayB0aGUgdHlwZSBvZiB0aGUgY29udGVudCB3aXRoIHRoZSBpc1N1YlJlZ2lvbigpIGZ1bmN0aW9uIGNhbGwuCisgIC8vLworICAvLy8gQHJldHVybiBUaGUgY29udGVudCBvZiB0aGlzIFJlZ2lvbk5vZGUuCisgIHRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgVCAqZ2V0Tm9kZUFzKCkgY29uc3Q7CisKKyAgLy8vIEBicmllZiBJcyB0aGlzIFJlZ2lvbk5vZGUgYSBzdWJyZWdpb24/CisgIC8vLworICAvLy8gQHJldHVybiBUcnVlIGlmIGl0IGNvbnRhaW5zIGEgc3VicmVnaW9uLiBGYWxzZSBpZiBpdCBjb250YWlucyBhCisgIC8vLyAgICAgICAgIEJhc2ljQmxvY2suCisgIGlubGluZSBib29sIGlzU3ViUmVnaW9uKCkgY29uc3QgeyByZXR1cm4gZW50cnkuZ2V0SW50KCk7IH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQGJyaWVmIEEgc2luZ2xlIGVudHJ5IHNpbmdsZSBleGl0IFJlZ2lvbi4KKy8vLworLy8vIEEgUmVnaW9uIGlzIGEgY29ubmVjdGVkIHN1YmdyYXBoIG9mIGEgY29udHJvbCBmbG93IGdyYXBoIHRoYXQgaGFzIGV4YWN0bHkKKy8vLyB0d28gY29ubmVjdGlvbnMgdG8gdGhlIHJlbWFpbmluZyBncmFwaC4gSXQgY2FuIGJlIHVzZWQgdG8gYW5hbHl6ZSBvcgorLy8vIG9wdGltaXplIHBhcnRzIG9mIHRoZSBjb250cm9sIGZsb3cgZ3JhcGguCisvLy8KKy8vLyBBIDxlbT4gc2ltcGxlIFJlZ2lvbiA8L2VtPiBpcyBjb25uZWN0ZWQgdG8gdGhlIHJlbWFpbmluZyBncmFwaCBieSBqdXN0IHR3bworLy8vIGVkZ2VzLiBPbmUgZWRnZSBlbnRlcmluZyB0aGUgUmVnaW9uIGFuZCBhbm90aGVyIG9uZSBsZWF2aW5nIHRoZSBSZWdpb24uCisvLy8KKy8vLyBBbiA8ZW0+IGV4dGVuZGVkIFJlZ2lvbiA8L2VtPiAob3IganVzdCBSZWdpb24pIGlzIGEgc3ViZ3JhcGggdGhhdCBjYW4gYmUKKy8vLyB0cmFuc2Zvcm0gaW50byBhIHNpbXBsZSBSZWdpb24uIFRoZSB0cmFuc2Zvcm1hdGlvbiBpcyBkb25lIGJ5IGFkZGluZworLy8vIEJhc2ljQmxvY2tzIHRoYXQgbWVyZ2Ugc2V2ZXJhbCBlbnRyeSBvciBleGl0IGVkZ2VzIHNvIHRoYXQgYWZ0ZXIgdGhlIG1lcmdlCisvLy8ganVzdCBvbmUgZW50cnkgYW5kIG9uZSBleGl0IGVkZ2UgZXhpc3RzLgorLy8vCisvLy8gVGhlIFxlIEVudHJ5IG9mIGEgUmVnaW9uIGlzIHRoZSBmaXJzdCBCYXNpY0Jsb2NrIHRoYXQgaXMgcGFzc2VkIGFmdGVyCisvLy8gZW50ZXJpbmcgdGhlIFJlZ2lvbi4gSXQgaXMgYW4gZWxlbWVudCBvZiB0aGUgUmVnaW9uLiBUaGUgZW50cnkgQmFzaWNCbG9jaworLy8vIGRvbWluYXRlcyBhbGwgQmFzaWNCbG9ja3MgaW4gdGhlIFJlZ2lvbi4KKy8vLworLy8vIFRoZSBcZSBFeGl0IG9mIGEgUmVnaW9uIGlzIHRoZSBmaXJzdCBCYXNpY0Jsb2NrIHRoYXQgaXMgcGFzc2VkIGFmdGVyCisvLy8gbGVhdmluZyB0aGUgUmVnaW9uLiBJdCBpcyBub3QgYW4gZWxlbWVudCBvZiB0aGUgUmVnaW9uLiBUaGUgZXhpdCBCYXNpY0Jsb2NrLAorLy8vIHBvc3Rkb21pbmF0ZXMgYWxsIEJhc2ljQmxvY2tzIGluIHRoZSBSZWdpb24uCisvLy8KKy8vLyBBIDxlbT4gY2Fub25pY2FsIFJlZ2lvbiA8L2VtPiBjYW5ub3QgYmUgY29uc3RydWN0ZWQgYnkgY29tYmluaW5nIHNtYWxsZXIKKy8vLyBSZWdpb25zLgorLy8vCisvLy8gUmVnaW9uIEEgaXMgdGhlIFxlIHBhcmVudCBvZiBSZWdpb24gQiwgaWYgQiBpcyBjb21wbGV0ZWx5IGNvbnRhaW5lZCBpbiBBLgorLy8vCisvLy8gVHdvIGNhbm9uaWNhbCBSZWdpb25zIGVpdGhlciBkbyBub3QgaW50ZXJzZWN0IGF0IGFsbCBvciBvbmUgaXMKKy8vLyB0aGUgcGFyZW50IG9mIHRoZSBvdGhlci4KKy8vLworLy8vIFRoZSA8ZW0+IFByb2dyYW0gU3RydWN0dXJlIFRyZWU8L2VtPiBpcyBhIGdyYXBoIChWLCBFKSB3aGVyZSBWIGlzIHRoZSBzZXQgb2YKKy8vLyBSZWdpb25zIGluIHRoZSBjb250cm9sIGZsb3cgZ3JhcGggYW5kIEUgaXMgdGhlIFxlIHBhcmVudCByZWxhdGlvbiBvZiB0aGVzZQorLy8vIFJlZ2lvbnMuCisvLy8KKy8vLyBFeGFtcGxlOgorLy8vCisvLy8gXHZlcmJhdGltCisvLy8gQSBzaW1wbGUgY29udHJvbCBmbG93IGdyYXBoLCB0aGF0IGNvbnRhaW5zIHR3byByZWdpb25zLgorLy8vCisvLy8gICAgICAgIDEKKy8vLyAgICAgICAvIHwKKy8vLyAgICAgIDIgICB8CisvLy8gICAgIC8gXCAgIDMKKy8vLyAgICA0ICAgNSAgfAorLy8vICAgIHwgICB8ICB8CisvLy8gICAgNiAgIDcgIDgKKy8vLyAgICAgXCAgfCAvCisvLy8gICAgICBcIHwvICAgICAgIFJlZ2lvbiBBOiAxIC0+IDkgezEsMiwzLDQsNSw2LDcsOH0KKy8vLyAgICAgICAgOSAgICAgICAgUmVnaW9uIEI6IDIgLT4gOSB7Miw0LDUsNiw3fQorLy8vIFxlbmR2ZXJiYXRpbQorLy8vCisvLy8gWW91IGNhbiBvYnRhaW4gbW9yZSBleGFtcGxlcyBieSBlaXRoZXIgY2FsbGluZworLy8vCisvLy8gPHR0PiAib3B0IC1yZWdpb25zIC1hbmFseXplIGFueXByb2dyYW0ubGwiIDwvdHQ+CisvLy8gb3IKKy8vLyA8dHQ+ICJvcHQgLXZpZXctcmVnaW9ucy1vbmx5IGFueXByb2dyYW0ubGwiIDwvdHQ+CisvLy8KKy8vLyBvbiBhbnkgTExWTSBmaWxlIHlvdSBhcmUgaW50ZXJlc3RlZCBpbi4KKy8vLworLy8vIFRoZSBmaXJzdCBjYWxsIHJldHVybnMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwcm9ncmFtIHN0cnVjdHVyZQorLy8vIHRyZWUsIHRoZSBzZWNvbmQgb25lIGNyZWF0ZXMgYSBncmFwaGljYWwgcmVwcmVzZW50YXRpb24gdXNpbmcgZ3JhcGh2aXouCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+CitjbGFzcyBSZWdpb25CYXNlIDogcHVibGljIFJlZ2lvbk5vZGVCYXNlPFRyPiB7CisgIGZyaWVuZCBjbGFzcyBSZWdpb25JbmZvQmFzZTxUcj47CisKKyAgdXNpbmcgRnVuY1QgPSB0eXBlbmFtZSBUcjo6RnVuY1Q7CisgIHVzaW5nIEJsb2NrVCA9IHR5cGVuYW1lIFRyOjpCbG9ja1Q7CisgIHVzaW5nIFJlZ2lvbkluZm9UID0gdHlwZW5hbWUgVHI6OlJlZ2lvbkluZm9UOworICB1c2luZyBSZWdpb25UID0gdHlwZW5hbWUgVHI6OlJlZ2lvblQ7CisgIHVzaW5nIFJlZ2lvbk5vZGVUID0gdHlwZW5hbWUgVHI6OlJlZ2lvbk5vZGVUOworICB1c2luZyBEb21UcmVlVCA9IHR5cGVuYW1lIFRyOjpEb21UcmVlVDsKKyAgdXNpbmcgTG9vcFQgPSB0eXBlbmFtZSBUcjo6TG9vcFQ7CisgIHVzaW5nIExvb3BJbmZvVCA9IHR5cGVuYW1lIFRyOjpMb29wSW5mb1Q7CisgIHVzaW5nIEluc3RUID0gdHlwZW5hbWUgVHI6Okluc3RUOworCisgIHVzaW5nIEJsb2NrVHJhaXRzID0gR3JhcGhUcmFpdHM8QmxvY2tUICo+OworICB1c2luZyBJbnZCbG9ja1RyYWl0cyA9IEdyYXBoVHJhaXRzPEludmVyc2U8QmxvY2tUICo+PjsKKyAgdXNpbmcgU3VjY0l0ZXJUeSA9IHR5cGVuYW1lIEJsb2NrVHJhaXRzOjpDaGlsZEl0ZXJhdG9yVHlwZTsKKyAgdXNpbmcgUHJlZEl0ZXJUeSA9IHR5cGVuYW1lIEludkJsb2NrVHJhaXRzOjpDaGlsZEl0ZXJhdG9yVHlwZTsKKworICAvLyBJbmZvcm1hdGlvbiBuZWNlc3NhcnkgdG8gbWFuYWdlIHRoaXMgUmVnaW9uLgorICBSZWdpb25JbmZvVCAqUkk7CisgIERvbVRyZWVUICpEVDsKKworICAvLyBUaGUgZXhpdCBCYXNpY0Jsb2NrIG9mIHRoaXMgcmVnaW9uLgorICAvLyAoVGhlIGVudHJ5IEJhc2ljQmxvY2sgaXMgcGFydCBvZiBSZWdpb25Ob2RlKQorICBCbG9ja1QgKmV4aXQ7CisKKyAgdXNpbmcgUmVnaW9uU2V0ID0gc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFJlZ2lvblQ+PjsKKworICAvLyBUaGUgc3VicmVnaW9ucyBvZiB0aGlzIHJlZ2lvbi4KKyAgUmVnaW9uU2V0IGNoaWxkcmVuOworCisgIHVzaW5nIEJCTm9kZU1hcFQgPSBzdGQ6Om1hcDxCbG9ja1QgKiwgc3RkOjp1bmlxdWVfcHRyPFJlZ2lvbk5vZGVUPj47CisKKyAgLy8gU2F2ZSB0aGUgQmFzaWNCbG9jayBSZWdpb25Ob2RlcyB0aGF0IGFyZSBlbGVtZW50IG9mIHRoaXMgUmVnaW9uLgorICBtdXRhYmxlIEJCTm9kZU1hcFQgQkJOb2RlTWFwOworCisgIC8vLyBDaGVjayBpZiBhIEJCIGlzIGluIHRoaXMgUmVnaW9uLiBUaGlzIGNoZWNrIGFsc28gd29ya3MKKyAgLy8vIGlmIHRoZSByZWdpb24gaXMgaW5jb3JyZWN0bHkgYnVpbHQuIChFWFBFTlNJVkUhKQorICB2b2lkIHZlcmlmeUJCSW5SZWdpb24oQmxvY2tUICpCQikgY29uc3Q7CisKKyAgLy8vIFdhbGsgb3ZlciBhbGwgdGhlIEJCcyBvZiB0aGUgcmVnaW9uIHN0YXJ0aW5nIGZyb20gQkIgYW5kCisgIC8vLyB2ZXJpZnkgdGhhdCBhbGwgcmVhY2hhYmxlIGJhc2ljIGJsb2NrcyBhcmUgZWxlbWVudHMgb2YgdGhlIHJlZ2lvbi4KKyAgLy8vIChFWFBFTlNJVkUhKQorICB2b2lkIHZlcmlmeVdhbGsoQmxvY2tUICpCQiwgc3RkOjpzZXQ8QmxvY2tUICo+ICp2aXNpdGVkQkIpIGNvbnN0OworCisgIC8vLyBWZXJpZnkgaWYgdGhlIHJlZ2lvbiBhbmQgaXRzIGNoaWxkcmVuIGFyZSB2YWxpZCByZWdpb25zIChFWFBFTlNJVkUhKQorICB2b2lkIHZlcmlmeVJlZ2lvbk5lc3QoKSBjb25zdDsKKworcHVibGljOgorICAvLy8gQGJyaWVmIENyZWF0ZSBhIG5ldyByZWdpb24uCisgIC8vLworICAvLy8gQHBhcmFtIEVudHJ5ICBUaGUgZW50cnkgYmFzaWMgYmxvY2sgb2YgdGhlIHJlZ2lvbi4KKyAgLy8vIEBwYXJhbSBFeGl0ICAgVGhlIGV4aXQgYmFzaWMgYmxvY2sgb2YgdGhlIHJlZ2lvbi4KKyAgLy8vIEBwYXJhbSBSSSAgICAgVGhlIHJlZ2lvbiBpbmZvIG9iamVjdCB0aGF0IGlzIG1hbmFnaW5nIHRoaXMgcmVnaW9uLgorICAvLy8gQHBhcmFtIERUICAgICBUaGUgZG9taW5hdG9yIHRyZWUgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgIC8vLyBAcGFyYW0gUGFyZW50IFRoZSBzdXJyb3VuZGluZyByZWdpb24gb3IgTlVMTCBpZiB0aGlzIGlzIGEgdG9wIGxldmVsCisgIC8vLyAgICAgICAgICAgICAgIHJlZ2lvbi4KKyAgUmVnaW9uQmFzZShCbG9ja1QgKkVudHJ5LCBCbG9ja1QgKkV4aXQsIFJlZ2lvbkluZm9UICpSSSwgRG9tVHJlZVQgKkRULAorICAgICAgICAgICAgIFJlZ2lvblQgKlBhcmVudCA9IG51bGxwdHIpOworCisgIFJlZ2lvbkJhc2UoY29uc3QgUmVnaW9uQmFzZSAmKSA9IGRlbGV0ZTsKKyAgUmVnaW9uQmFzZSAmb3BlcmF0b3I9KGNvbnN0IFJlZ2lvbkJhc2UgJikgPSBkZWxldGU7CisKKyAgLy8vIERlbGV0ZSB0aGUgUmVnaW9uIGFuZCBhbGwgaXRzIHN1YnJlZ2lvbnMuCisgIH5SZWdpb25CYXNlKCk7CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIGVudHJ5IEJhc2ljQmxvY2sgb2YgdGhlIFJlZ2lvbi4KKyAgLy8vIEByZXR1cm4gVGhlIGVudHJ5IEJhc2ljQmxvY2sgb2YgdGhlIHJlZ2lvbi4KKyAgQmxvY2tUICpnZXRFbnRyeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVnaW9uTm9kZUJhc2U8VHI+OjpnZXRFbnRyeSgpOworICB9CisKKyAgLy8vIEBicmllZiBSZXBsYWNlIHRoZSBlbnRyeSBiYXNpYyBibG9jayBvZiB0aGUgcmVnaW9uIHdpdGggdGhlIG5ldyBiYXNpYworICAvLy8gICAgICAgIGJsb2NrLgorICAvLy8KKyAgLy8vIEBwYXJhbSBCQiAgVGhlIG5ldyBlbnRyeSBiYXNpYyBibG9jayBvZiB0aGUgcmVnaW9uLgorICB2b2lkIHJlcGxhY2VFbnRyeShCbG9ja1QgKkJCKTsKKworICAvLy8gQGJyaWVmIFJlcGxhY2UgdGhlIGV4aXQgYmFzaWMgYmxvY2sgb2YgdGhlIHJlZ2lvbiB3aXRoIHRoZSBuZXcgYmFzaWMKKyAgLy8vICAgICAgICBibG9jay4KKyAgLy8vCisgIC8vLyBAcGFyYW0gQkIgIFRoZSBuZXcgZXhpdCBiYXNpYyBibG9jayBvZiB0aGUgcmVnaW9uLgorICB2b2lkIHJlcGxhY2VFeGl0KEJsb2NrVCAqQkIpOworCisgIC8vLyBAYnJpZWYgUmVjdXJzaXZlbHkgcmVwbGFjZSB0aGUgZW50cnkgYmFzaWMgYmxvY2sgb2YgdGhlIHJlZ2lvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJlcGxhY2VzIHRoZSBlbnRyeSBiYXNpYyBibG9jayB3aXRoIGEgbmV3IGJhc2ljIGJsb2NrLiBJdAorICAvLy8gYWxzbyB1cGRhdGVzIGFsbCBjaGlsZCByZWdpb25zIHRoYXQgaGF2ZSB0aGUgc2FtZSBlbnRyeSBiYXNpYyBibG9jayBhcworICAvLy8gdGhpcyByZWdpb24uCisgIC8vLworICAvLy8gQHBhcmFtIE5ld0VudHJ5IFRoZSBuZXcgZW50cnkgYmFzaWMgYmxvY2suCisgIHZvaWQgcmVwbGFjZUVudHJ5UmVjdXJzaXZlKEJsb2NrVCAqTmV3RW50cnkpOworCisgIC8vLyBAYnJpZWYgUmVjdXJzaXZlbHkgcmVwbGFjZSB0aGUgZXhpdCBiYXNpYyBibG9jayBvZiB0aGUgcmVnaW9uLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gcmVwbGFjZXMgdGhlIGV4aXQgYmFzaWMgYmxvY2sgd2l0aCBhIG5ldyBiYXNpYyBibG9jay4gSXQKKyAgLy8vIGFsc28gdXBkYXRlcyBhbGwgY2hpbGQgcmVnaW9ucyB0aGF0IGhhdmUgdGhlIHNhbWUgZXhpdCBiYXNpYyBibG9jayBhcworICAvLy8gdGhpcyByZWdpb24uCisgIC8vLworICAvLy8gQHBhcmFtIE5ld0V4aXQgVGhlIG5ldyBleGl0IGJhc2ljIGJsb2NrLgorICB2b2lkIHJlcGxhY2VFeGl0UmVjdXJzaXZlKEJsb2NrVCAqTmV3RXhpdCk7CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIGV4aXQgQmFzaWNCbG9jayBvZiB0aGUgUmVnaW9uLgorICAvLy8gQHJldHVybiBUaGUgZXhpdCBCYXNpY0Jsb2NrIG9mIHRoZSBSZWdpb24sIE5VTEwgaWYgdGhpcyBpcyB0aGUgVG9wTGV2ZWwKKyAgLy8vICAgICAgICAgUmVnaW9uLgorICBCbG9ja1QgKmdldEV4aXQoKSBjb25zdCB7IHJldHVybiBleGl0OyB9CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIHBhcmVudCBvZiB0aGUgUmVnaW9uLgorICAvLy8gQHJldHVybiBUaGUgcGFyZW50IG9mIHRoZSBSZWdpb24gb3IgTlVMTCBpZiB0aGlzIGlzIGEgdG9wIGxldmVsCisgIC8vLyAgICAgICAgIFJlZ2lvbi4KKyAgUmVnaW9uVCAqZ2V0UGFyZW50KCkgY29uc3QgeworICAgIHJldHVybiBSZWdpb25Ob2RlQmFzZTxUcj46OmdldFBhcmVudCgpOworICB9CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIFJlZ2lvbk5vZGUgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IFJlZ2lvbi4KKyAgLy8vIEByZXR1cm4gVGhlIFJlZ2lvbk5vZGUgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IFJlZ2lvbi4KKyAgUmVnaW9uTm9kZVQgKmdldE5vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8UmVnaW9uTm9kZVQgKj4oCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUmVnaW9uTm9kZVQgKj4odGhpcykpOworICB9CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIG5lc3RpbmcgbGV2ZWwgb2YgdGhpcyBSZWdpb24uCisgIC8vLworICAvLy8gQW4gdG9wbGV2ZWwgUmVnaW9uIGhhcyBkZXB0aCAwLgorICAvLy8KKyAgLy8vIEByZXR1cm4gVGhlIGRlcHRoIG9mIHRoZSByZWdpb24uCisgIHVuc2lnbmVkIGdldERlcHRoKCkgY29uc3Q7CisKKyAgLy8vIEBicmllZiBDaGVjayBpZiBhIFJlZ2lvbiBpcyB0aGUgVG9wTGV2ZWwgcmVnaW9uLgorICAvLy8KKyAgLy8vIFRoZSB0b3BsZXZlbCByZWdpb24gcmVwcmVzZW50cyB0aGUgd2hvbGUgZnVuY3Rpb24uCisgIGJvb2wgaXNUb3BMZXZlbFJlZ2lvbigpIGNvbnN0IHsgcmV0dXJuIGV4aXQgPT0gbnVsbHB0cjsgfQorCisgIC8vLyBAYnJpZWYgUmV0dXJuIGEgbmV3IChub24tY2Fub25pY2FsKSByZWdpb24sIHRoYXQgaXMgb2J0YWluZWQgYnkgam9pbmluZworICAvLy8gICAgICAgIHRoaXMgcmVnaW9uIHdpdGggaXRzIHByZWRlY2Vzc29ycy4KKyAgLy8vCisgIC8vLyBAcmV0dXJuIEEgcmVnaW9uIGFsc28gc3RhcnRpbmcgYXQgZ2V0RW50cnkoKSwgYnV0IHJlYWNoaW5nIHRvIHRoZSBuZXh0CisgIC8vLyAgICAgICAgIGJhc2ljIGJsb2NrIHRoYXQgZm9ybXMgd2l0aCBnZXRFbnRyeSgpIGEgKG5vbi1jYW5vbmljYWwpIHJlZ2lvbi4KKyAgLy8vICAgICAgICAgTlVMTCBpZiBzdWNoIGEgYmFzaWMgYmxvY2sgZG9lcyBub3QgZXhpc3QuCisgIFJlZ2lvblQgKmdldEV4cGFuZGVkUmVnaW9uKCkgY29uc3Q7CisKKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIGZpcnN0IGJsb2NrIG9mIHRoaXMgcmVnaW9uJ3Mgc2luZ2xlIGVudHJ5IGVkZ2UsCisgIC8vLyAgICAgICAgaWYgZXhpc3RpbmcuCisgIC8vLworICAvLy8gQHJldHVybiBUaGUgQmFzaWNCbG9jayBzdGFydGluZyB0aGlzIHJlZ2lvbidzIHNpbmdsZSBlbnRyeSBlZGdlLAorICAvLy8gICAgICAgICBlbHNlIE5VTEwuCisgIEJsb2NrVCAqZ2V0RW50ZXJpbmdCbG9jaygpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBmaXJzdCBibG9jayBvZiB0aGlzIHJlZ2lvbidzIHNpbmdsZSBleGl0IGVkZ2UsCisgIC8vLyAgICAgICAgaWYgZXhpc3RpbmcuCisgIC8vLworICAvLy8gQHJldHVybiBUaGUgQmFzaWNCbG9jayBzdGFydGluZyB0aGlzIHJlZ2lvbidzIHNpbmdsZSBleGl0IGVkZ2UsCisgIC8vLyAgICAgICAgIGVsc2UgTlVMTC4KKyAgQmxvY2tUICpnZXRFeGl0aW5nQmxvY2soKSBjb25zdDsKKworICAvLy8gQGJyaWVmIENvbGxlY3QgYWxsIGJsb2NrcyBvZiB0aGlzIHJlZ2lvbidzIHNpbmdsZSBleGl0IGVkZ2UsIGlmIGV4aXN0aW5nLgorICAvLy8KKyAgLy8vIEByZXR1cm4gVHJ1ZSBpZiB0aGlzIHJlZ2lvbiBjb250YWlucyBhbGwgdGhlIHByZWRlY2Vzc29ycyBvZiB0aGUgZXhpdC4KKyAgYm9vbCBnZXRFeGl0aW5nQmxvY2tzKFNtYWxsVmVjdG9ySW1wbDxCbG9ja1QgKj4gJkV4aXRpbmdzKSBjb25zdDsKKworICAvLy8gQGJyaWVmIElzIHRoaXMgYSBzaW1wbGUgcmVnaW9uPworICAvLy8KKyAgLy8vIEEgcmVnaW9uIGlzIHNpbXBsZSBpZiBpdCBoYXMgZXhhY3RseSBvbmUgZXhpdCBhbmQgb25lIGVudHJ5IGVkZ2UuCisgIC8vLworICAvLy8gQHJldHVybiBUcnVlIGlmIHRoZSBSZWdpb24gaXMgc2ltcGxlLgorICBib29sIGlzU2ltcGxlKCkgY29uc3Q7CisKKyAgLy8vIEBicmllZiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBSZWdpb24uCisgIC8vLyBAcmV0dXJuIFRoZSBOYW1lIG9mIHRoZSBSZWdpb24uCisgIHN0ZDo6c3RyaW5nIGdldE5hbWVTdHIoKSBjb25zdDsKKworICAvLy8gQGJyaWVmIFJldHVybiB0aGUgUmVnaW9uSW5mbyBvYmplY3QsIHRoYXQgYmVsb25ncyB0byB0aGlzIFJlZ2lvbi4KKyAgUmVnaW9uSW5mb1QgKmdldFJlZ2lvbkluZm8oKSBjb25zdCB7IHJldHVybiBSSTsgfQorCisgIC8vLyBQcmludFN0eWxlIC0gUHJpbnQgcmVnaW9uIGluIGRpZmZlcmVuY2Ugd2F5cy4KKyAgZW51bSBQcmludFN0eWxlIHsgUHJpbnROb25lLCBQcmludEJCLCBQcmludFJOIH07CisKKyAgLy8vIEBicmllZiBQcmludCB0aGUgcmVnaW9uLgorICAvLy8KKyAgLy8vIEBwYXJhbSBPUyBUaGUgb3V0cHV0IHN0cmVhbSB0aGUgUmVnaW9uIGlzIHByaW50ZWQgdG8uCisgIC8vLyBAcGFyYW0gcHJpbnRUcmVlIFByaW50IGFsc28gdGhlIHRyZWUgb2Ygc3VicmVnaW9ucy4KKyAgLy8vIEBwYXJhbSBsZXZlbCBUaGUgaW5kZW50YXRpb24gbGV2ZWwgdXNlZCBmb3IgcHJpbnRpbmcuCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBib29sIHByaW50VHJlZSA9IHRydWUsIHVuc2lnbmVkIGxldmVsID0gMCwKKyAgICAgICAgICAgICBQcmludFN0eWxlIFN0eWxlID0gUHJpbnROb25lKSBjb25zdDsKKworI2lmICFkZWZpbmVkKE5ERUJVRykgfHwgZGVmaW5lZChMTFZNX0VOQUJMRV9EVU1QKQorICAvLy8gQGJyaWVmIFByaW50IHRoZSByZWdpb24gdG8gc3RkZXJyLgorICB2b2lkIGR1bXAoKSBjb25zdDsKKyNlbmRpZgorCisgIC8vLyBAYnJpZWYgQ2hlY2sgaWYgdGhlIHJlZ2lvbiBjb250YWlucyBhIEJhc2ljQmxvY2suCisgIC8vLworICAvLy8gQHBhcmFtIEJCIFRoZSBCYXNpY0Jsb2NrIHRoYXQgbWlnaHQgYmUgY29udGFpbmVkIGluIHRoaXMgUmVnaW9uLgorICAvLy8gQHJldHVybiBUcnVlIGlmIHRoZSBibG9jayBpcyBjb250YWluZWQgaW4gdGhlIHJlZ2lvbiBvdGhlcndpc2UgZmFsc2UuCisgIGJvb2wgY29udGFpbnMoY29uc3QgQmxvY2tUICpCQikgY29uc3Q7CisKKyAgLy8vIEBicmllZiBDaGVjayBpZiB0aGUgcmVnaW9uIGNvbnRhaW5zIGFub3RoZXIgcmVnaW9uLgorICAvLy8KKyAgLy8vIEBwYXJhbSBTdWJSZWdpb24gVGhlIHJlZ2lvbiB0aGF0IG1pZ2h0IGJlIGNvbnRhaW5lZCBpbiB0aGlzIFJlZ2lvbi4KKyAgLy8vIEByZXR1cm4gVHJ1ZSBpZiBTdWJSZWdpb24gaXMgY29udGFpbmVkIGluIHRoZSByZWdpb24gb3RoZXJ3aXNlIGZhbHNlLgorICBib29sIGNvbnRhaW5zKGNvbnN0IFJlZ2lvblQgKlN1YlJlZ2lvbikgY29uc3QgeworICAgIC8vIFRvcGxldmVsIFJlZ2lvbi4KKyAgICBpZiAoIWdldEV4aXQoKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGNvbnRhaW5zKFN1YlJlZ2lvbi0+Z2V0RW50cnkoKSkgJiYKKyAgICAgICAgICAgKGNvbnRhaW5zKFN1YlJlZ2lvbi0+Z2V0RXhpdCgpKSB8fAorICAgICAgICAgICAgU3ViUmVnaW9uLT5nZXRFeGl0KCkgPT0gZ2V0RXhpdCgpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgQ2hlY2sgaWYgdGhlIHJlZ2lvbiBjb250YWlucyBhbiBJbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBAcGFyYW0gSW5zdCBUaGUgSW5zdHJ1Y3Rpb24gdGhhdCBtaWdodCBiZSBjb250YWluZWQgaW4gdGhpcyByZWdpb24uCisgIC8vLyBAcmV0dXJuIFRydWUgaWYgdGhlIEluc3RydWN0aW9uIGlzIGNvbnRhaW5lZCBpbiB0aGUgcmVnaW9uIG90aGVyd2lzZQorICAvLy8gZmFsc2UuCisgIGJvb2wgY29udGFpbnMoY29uc3QgSW5zdFQgKkluc3QpIGNvbnN0IHsgcmV0dXJuIGNvbnRhaW5zKEluc3QtPmdldFBhcmVudCgpKTsgfQorCisgIC8vLyBAYnJpZWYgQ2hlY2sgaWYgdGhlIHJlZ2lvbiBjb250YWlucyBhIGxvb3AuCisgIC8vLworICAvLy8gQHBhcmFtIEwgVGhlIGxvb3AgdGhhdCBtaWdodCBiZSBjb250YWluZWQgaW4gdGhpcyByZWdpb24uCisgIC8vLyBAcmV0dXJuIFRydWUgaWYgdGhlIGxvb3AgaXMgY29udGFpbmVkIGluIHRoZSByZWdpb24gb3RoZXJ3aXNlIGZhbHNlLgorICAvLy8gICAgICAgICBJbiBjYXNlIGEgTlVMTCBwb2ludGVyIGlzIHBhc3NlZCB0byB0aGlzIGZ1bmN0aW9uIHRoZSByZXN1bHQKKyAgLy8vICAgICAgICAgaXMgZmFsc2UsIGV4Y2VwdCBmb3IgdGhlIHJlZ2lvbiB0aGF0IGRlc2NyaWJlcyB0aGUgd2hvbGUgZnVuY3Rpb24uCisgIC8vLyAgICAgICAgIEluIHRoYXQgY2FzZSB0cnVlIGlzIHJldHVybmVkLgorICBib29sIGNvbnRhaW5zKGNvbnN0IExvb3BUICpMKSBjb25zdDsKKworICAvLy8gQGJyaWVmIEdldCB0aGUgb3V0ZXJtb3N0IGxvb3AgaW4gdGhlIHJlZ2lvbiB0aGF0IGNvbnRhaW5zIGEgbG9vcC4KKyAgLy8vCisgIC8vLyBGaW5kIGZvciBhIExvb3AgTCB0aGUgb3V0ZXJtb3N0IGxvb3AgT3V0ZXJMIHRoYXQgaXMgYSBwYXJlbnQgbG9vcCBvZiBMCisgIC8vLyBhbmQgaXMgaXRzZWxmIGNvbnRhaW5lZCBpbiB0aGUgcmVnaW9uLgorICAvLy8KKyAgLy8vIEBwYXJhbSBMIFRoZSBsb29wIHRoZSBsb29rdXAgaXMgc3RhcnRlZC4KKyAgLy8vIEByZXR1cm4gVGhlIG91dGVybW9zdCBsb29wIGluIHRoZSByZWdpb24sIE5VTEwgaWYgc3VjaCBhIGxvb3AgZG9lcyBub3QKKyAgLy8vICAgICAgICAgZXhpc3Qgb3IgaWYgdGhlIHJlZ2lvbiBkZXNjcmliZXMgdGhlIHdob2xlIGZ1bmN0aW9uLgorICBMb29wVCAqb3V0ZXJtb3N0TG9vcEluUmVnaW9uKExvb3BUICpMKSBjb25zdDsKKworICAvLy8gQGJyaWVmIEdldCB0aGUgb3V0ZXJtb3N0IGxvb3AgaW4gdGhlIHJlZ2lvbiB0aGF0IGNvbnRhaW5zIGEgYmFzaWMgYmxvY2suCisgIC8vLworICAvLy8gRmluZCBmb3IgYSBiYXNpYyBibG9jayBCQiB0aGUgb3V0ZXJtb3N0IGxvb3AgTCB0aGF0IGNvbnRhaW5zIEJCIGFuZCBpcworICAvLy8gaXRzZWxmIGNvbnRhaW5lZCBpbiB0aGUgcmVnaW9uLgorICAvLy8KKyAgLy8vIEBwYXJhbSBMSSBBIHBvaW50ZXIgdG8gYSBMb29wSW5mbyBhbmFseXNpcy4KKyAgLy8vIEBwYXJhbSBCQiBUaGUgYmFzaWMgYmxvY2sgc3Vycm91bmRlZCBieSB0aGUgbG9vcC4KKyAgLy8vIEByZXR1cm4gVGhlIG91dGVybW9zdCBsb29wIGluIHRoZSByZWdpb24sIE5VTEwgaWYgc3VjaCBhIGxvb3AgZG9lcyBub3QKKyAgLy8vICAgICAgICAgZXhpc3Qgb3IgaWYgdGhlIHJlZ2lvbiBkZXNjcmliZXMgdGhlIHdob2xlIGZ1bmN0aW9uLgorICBMb29wVCAqb3V0ZXJtb3N0TG9vcEluUmVnaW9uKExvb3BJbmZvVCAqTEksIEJsb2NrVCAqQkIpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBzdWJyZWdpb24gdGhhdCBzdGFydHMgYXQgYSBCYXNpY0Jsb2NrCisgIC8vLworICAvLy8gQHBhcmFtIEJCIFRoZSBCYXNpY0Jsb2NrIHRoZSBzdWJyZWdpb24gc2hvdWxkIHN0YXJ0LgorICAvLy8gQHJldHVybiBUaGUgU3VicmVnaW9uIGlmIGF2YWlsYWJsZSwgb3RoZXJ3aXNlIE5VTEwuCisgIFJlZ2lvblQgKmdldFN1YlJlZ2lvbk5vZGUoQmxvY2tUICpCQikgY29uc3Q7CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIFJlZ2lvbk5vZGUgZm9yIGEgQmFzaWNCbG9jaworICAvLy8KKyAgLy8vIEBwYXJhbSBCQiBUaGUgQmFzaWNCbG9jayBhdCB3aGljaCB0aGUgUmVnaW9uTm9kZSBzaG91bGQgc3RhcnQuCisgIC8vLyBAcmV0dXJuIElmIGF2YWlsYWJsZSwgdGhlIFJlZ2lvbk5vZGUgdGhhdCByZXByZXNlbnRzIHRoZSBzdWJyZWdpb24KKyAgLy8vICAgICAgICAgc3RhcnRpbmcgYXQgQkIuIElmIG5vIHN1YnJlZ2lvbiBzdGFydHMgYXQgQkIsIHRoZSBSZWdpb25Ob2RlCisgIC8vLyAgICAgICAgIHJlcHJlc2VudGluZyBCQi4KKyAgUmVnaW9uTm9kZVQgKmdldE5vZGUoQmxvY2tUICpCQikgY29uc3Q7CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIEJhc2ljQmxvY2sgUmVnaW9uTm9kZSBmb3IgYSBCYXNpY0Jsb2NrCisgIC8vLworICAvLy8gQHBhcmFtIEJCIFRoZSBCYXNpY0Jsb2NrIGZvciB3aGljaCB0aGUgUmVnaW9uTm9kZSBpcyByZXF1ZXN0ZWQuCisgIC8vLyBAcmV0dXJuIFRoZSBSZWdpb25Ob2RlIHJlcHJlc2VudGluZyB0aGUgQkIuCisgIFJlZ2lvbk5vZGVUICpnZXRCQk5vZGUoQmxvY2tUICpCQikgY29uc3Q7CisKKyAgLy8vIEBicmllZiBBZGQgYSBuZXcgc3VicmVnaW9uIHRvIHRoaXMgUmVnaW9uLgorICAvLy8KKyAgLy8vIEBwYXJhbSBTdWJSZWdpb24gVGhlIG5ldyBzdWJyZWdpb24gdGhhdCB3aWxsIGJlIGFkZGVkLgorICAvLy8gQHBhcmFtIG1vdmVDaGlsZHJlbiBNb3ZlIHRoZSBjaGlsZHJlbiBvZiB0aGlzIHJlZ2lvbiwgdGhhdCBhcmUgYWxzbworICAvLy8gICAgICAgICAgICAgICAgICAgICBjb250YWluZWQgaW4gU3ViUmVnaW9uIGludG8gU3ViUmVnaW9uLgorICB2b2lkIGFkZFN1YlJlZ2lvbihSZWdpb25UICpTdWJSZWdpb24sIGJvb2wgbW92ZUNoaWxkcmVuID0gZmFsc2UpOworCisgIC8vLyBAYnJpZWYgUmVtb3ZlIGEgc3VicmVnaW9uIGZyb20gdGhpcyBSZWdpb24uCisgIC8vLworICAvLy8gVGhlIHN1YnJlZ2lvbiBpcyBub3QgZGVsZXRlZCwgYXMgaXQgd2lsbCBwcm9iYWJseSBiZSBpbnNlcnRlZCBpbnRvIGFub3RoZXIKKyAgLy8vIHJlZ2lvbi4KKyAgLy8vIEBwYXJhbSBTdWJSZWdpb24gVGhlIFN1YlJlZ2lvbiB0aGF0IHdpbGwgYmUgcmVtb3ZlZC4KKyAgUmVnaW9uVCAqcmVtb3ZlU3ViUmVnaW9uKFJlZ2lvblQgKlN1YlJlZ2lvbik7CisKKyAgLy8vIEBicmllZiBNb3ZlIGFsbCBkaXJlY3QgY2hpbGQgbm9kZXMgb2YgdGhpcyBSZWdpb24gdG8gYW5vdGhlciBSZWdpb24uCisgIC8vLworICAvLy8gQHBhcmFtIFRvIFRoZSBSZWdpb24gdGhlIGNoaWxkIG5vZGVzIHdpbGwgYmUgdHJhbnNmZXJyZWQgdG8uCisgIHZvaWQgdHJhbnNmZXJDaGlsZHJlblRvKFJlZ2lvblQgKlRvKTsKKworICAvLy8gQGJyaWVmIFZlcmlmeSBpZiB0aGUgcmVnaW9uIGlzIGEgY29ycmVjdCByZWdpb24uCisgIC8vLworICAvLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIGNvcnJlY3RseSBidWlsZCBSZWdpb24uIFRoaXMgaXMgYW4gZXhwZW5zaXZlIGNoZWNrLCBhcworICAvLy8gdGhlIGNvbXBsZXRlIENGRyBvZiB0aGUgUmVnaW9uIHdpbGwgYmUgd2Fsa2VkLgorICB2b2lkIHZlcmlmeVJlZ2lvbigpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgQ2xlYXIgdGhlIGNhY2hlIGZvciBCQiBSZWdpb25Ob2Rlcy4KKyAgLy8vCisgIC8vLyBBZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gdGhlIEJhc2ljQmxvY2sgUmVnaW9uTm9kZXMgd2lsbCBiZSBzdG9yZWQgYXQKKyAgLy8vIGRpZmZlcmVudCBtZW1vcnkgbG9jYXRpb25zLiBSZWdpb25Ob2RlcyBvYnRhaW5lZCBiZWZvcmUgdGhpcyBmdW5jdGlvbiBpcworICAvLy8gY2FsbGVkIGFyZSB0aGVyZWZvcmUgbm90IGNvbXBhcmFibGUgdG8gUmVnaW9uTm9kZXMgYWJ0YWluZWQgYWZ0ZXJ3b3Jkcy4KKyAgdm9pZCBjbGVhck5vZGVDYWNoZSgpOworCisgIC8vLyBAbmFtZSBTdWJyZWdpb24gSXRlcmF0b3JzCisgIC8vLworICAvLy8gVGhlc2UgaXRlcmF0b3JzIGl0ZXJhdG9yIG92ZXIgYWxsIHN1YnJlZ2lvbnMgb2YgdGhpcyBSZWdpb24uCisgIC8vQHsKKyAgdXNpbmcgaXRlcmF0b3IgPSB0eXBlbmFtZSBSZWdpb25TZXQ6Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IHR5cGVuYW1lIFJlZ2lvblNldDo6Y29uc3RfaXRlcmF0b3I7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBjaGlsZHJlbi5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGNoaWxkcmVuLmVuZCgpOyB9CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBjaGlsZHJlbi5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGNoaWxkcmVuLmVuZCgpOyB9CisgIC8vQH0KKworICAvLy8gQG5hbWUgQmFzaWNCbG9jayBJdGVyYXRvcnMKKyAgLy8vCisgIC8vLyBUaGVzZSBpdGVyYXRvcnMgaXRlcmF0ZSBvdmVyIGFsbCBCYXNpY0Jsb2NrcyB0aGF0IGFyZSBjb250YWluZWQgaW4gdGhpcworICAvLy8gUmVnaW9uLiBUaGUgaXRlcmF0b3IgYWxzbyBpdGVyYXRlcyBvdmVyIEJhc2ljQmxvY2tzIHRoYXQgYXJlIGVsZW1lbnRzIG9mCisgIC8vLyBhIHN1YnJlZ2lvbiBvZiB0aGlzIFJlZ2lvbi4gSXQgaXMgdGhlcmVmb3JlIGNhbGxlZCBhIGZsYXQgaXRlcmF0b3IuCisgIC8vQHsKKyAgdGVtcGxhdGUgPGJvb2wgSXNDb25zdD4KKyAgY2xhc3MgYmxvY2tfaXRlcmF0b3Jfd3JhcHBlcgorICAgICAgOiBwdWJsaWMgZGZfaXRlcmF0b3I8CisgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPElzQ29uc3QsIGNvbnN0IEJsb2NrVCwgQmxvY2tUPjo6dHlwZSAqPiB7CisgICAgdXNpbmcgc3VwZXIgPQorICAgICAgICBkZl9pdGVyYXRvcjwKKyAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8SXNDb25zdCwgY29uc3QgQmxvY2tULCBCbG9ja1Q+Ojp0eXBlICo+OworCisgIHB1YmxpYzoKKyAgICB1c2luZyBTZWxmID0gYmxvY2tfaXRlcmF0b3Jfd3JhcHBlcjxJc0NvbnN0PjsKKyAgICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgc3VwZXI6OnZhbHVlX3R5cGU7CisKKyAgICAvLyBDb25zdHJ1Y3QgdGhlIGJlZ2luIGl0ZXJhdG9yLgorICAgIGJsb2NrX2l0ZXJhdG9yX3dyYXBwZXIodmFsdWVfdHlwZSBFbnRyeSwgdmFsdWVfdHlwZSBFeGl0KQorICAgICAgICA6IHN1cGVyKGRmX2JlZ2luKEVudHJ5KSkgeworICAgICAgLy8gTWFyayB0aGUgZXhpdCBvZiB0aGUgcmVnaW9uIGFzIHZpc2l0ZWQsIHNvIHRoYXQgdGhlIGNoaWxkcmVuIG9mIHRoZQorICAgICAgLy8gZXhpdCBhbmQgdGhlIGV4aXQgaXRzZWxmLCBpLmUuIHRoZSBibG9jayBvdXRzaWRlIHRoZSByZWdpb24gd2lsbCBuZXZlcgorICAgICAgLy8gYmUgdmlzaXRlZC4KKyAgICAgIHN1cGVyOjpWaXNpdGVkLmluc2VydChFeGl0KTsKKyAgICB9CisKKyAgICAvLyBDb25zdHJ1Y3QgdGhlIGVuZCBpdGVyYXRvci4KKyAgICBibG9ja19pdGVyYXRvcl93cmFwcGVyKCkgOiBzdXBlcihkZl9lbmQ8dmFsdWVfdHlwZT4oKEJsb2NrVCAqKW51bGxwdHIpKSB7fQorCisgICAgLyppbXBsaWNpdCovIGJsb2NrX2l0ZXJhdG9yX3dyYXBwZXIoc3VwZXIgSSkgOiBzdXBlcihJKSB7fQorCisgICAgLy8gRklYTUU6IEV2ZW4gYSBjb25zdF9pdGVyYXRvciByZXR1cm5zIGEgbm9uLWNvbnN0IEJhc2ljQmxvY2sgcG9pbnRlci4KKyAgICAvLyAgICAgICAgVGhpcyB3YXMgaW50cm9kdWNlZCBmb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHksIGJ1dCBzaG91bGQKKyAgICAvLyAgICAgICAgYmUgcmVtb3ZlZCBhcyBzb29uIGFzIGFsbCB1c2VycyBhcmUgZml4ZWQuCisgICAgQmxvY2tUICpvcGVyYXRvciooKSBjb25zdCB7CisgICAgICByZXR1cm4gY29uc3RfY2FzdDxCbG9ja1QgKj4oc3VwZXI6Om9wZXJhdG9yKigpKTsKKyAgICB9CisgIH07CisKKyAgdXNpbmcgYmxvY2tfaXRlcmF0b3IgPSBibG9ja19pdGVyYXRvcl93cmFwcGVyPGZhbHNlPjsKKyAgdXNpbmcgY29uc3RfYmxvY2tfaXRlcmF0b3IgPSBibG9ja19pdGVyYXRvcl93cmFwcGVyPHRydWU+OworCisgIGJsb2NrX2l0ZXJhdG9yIGJsb2NrX2JlZ2luKCkgeyByZXR1cm4gYmxvY2tfaXRlcmF0b3IoZ2V0RW50cnkoKSwgZ2V0RXhpdCgpKTsgfQorCisgIGJsb2NrX2l0ZXJhdG9yIGJsb2NrX2VuZCgpIHsgcmV0dXJuIGJsb2NrX2l0ZXJhdG9yKCk7IH0KKworICBjb25zdF9ibG9ja19pdGVyYXRvciBibG9ja19iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfYmxvY2tfaXRlcmF0b3IoZ2V0RW50cnkoKSwgZ2V0RXhpdCgpKTsKKyAgfQorICBjb25zdF9ibG9ja19pdGVyYXRvciBibG9ja19lbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9ibG9ja19pdGVyYXRvcigpOyB9CisKKyAgdXNpbmcgYmxvY2tfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxibG9ja19pdGVyYXRvcj47CisgIHVzaW5nIGNvbnN0X2Jsb2NrX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8Y29uc3RfYmxvY2tfaXRlcmF0b3I+OworCisgIC8vLyBAYnJpZWYgUmV0dXJucyBhIHJhbmdlIHZpZXcgb2YgdGhlIGJhc2ljIGJsb2NrcyBpbiB0aGUgcmVnaW9uLgorICBpbmxpbmUgYmxvY2tfcmFuZ2UgYmxvY2tzKCkgeworICAgIHJldHVybiBibG9ja19yYW5nZShibG9ja19iZWdpbigpLCBibG9ja19lbmQoKSk7CisgIH0KKworICAvLy8gQGJyaWVmIFJldHVybnMgYSByYW5nZSB2aWV3IG9mIHRoZSBiYXNpYyBibG9ja3MgaW4gdGhlIHJlZ2lvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHRoZSAnY29uc3QnIHZlcnNpb24gb2YgdGhlIHJhbmdlIHZpZXcuCisgIGlubGluZSBjb25zdF9ibG9ja19yYW5nZSBibG9ja3MoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Jsb2NrX3JhbmdlKGJsb2NrX2JlZ2luKCksIGJsb2NrX2VuZCgpKTsKKyAgfQorICAvL0B9CisKKyAgLy8vIEBuYW1lIEVsZW1lbnQgSXRlcmF0b3JzCisgIC8vLworICAvLy8gVGhlc2UgaXRlcmF0b3JzIGl0ZXJhdGUgb3ZlciBhbGwgQmFzaWNCbG9jayBhbmQgc3VicmVnaW9uIFJlZ2lvbk5vZGVzIHRoYXQKKyAgLy8vIGFyZSBkaXJlY3QgY2hpbGRyZW4gb2YgdGhpcyBSZWdpb24uIEl0IGRvZXMgbm90IGl0ZXJhdGUgb3ZlciBhbnkKKyAgLy8vIFJlZ2lvbk5vZGVzIHRoYXQgYXJlIGFsc28gZWxlbWVudCBvZiBhIHN1YnJlZ2lvbiBvZiB0aGlzIFJlZ2lvbi4KKyAgLy9AeworICB1c2luZyBlbGVtZW50X2l0ZXJhdG9yID0KKyAgICAgIGRmX2l0ZXJhdG9yPFJlZ2lvbk5vZGVUICosIGRmX2l0ZXJhdG9yX2RlZmF1bHRfc2V0PFJlZ2lvbk5vZGVUICo+LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgIEdyYXBoVHJhaXRzPFJlZ2lvbk5vZGVUICo+PjsKKworICB1c2luZyBjb25zdF9lbGVtZW50X2l0ZXJhdG9yID0KKyAgICAgIGRmX2l0ZXJhdG9yPGNvbnN0IFJlZ2lvbk5vZGVUICosCisgICAgICAgICAgICAgICAgICBkZl9pdGVyYXRvcl9kZWZhdWx0X3NldDxjb25zdCBSZWdpb25Ob2RlVCAqPiwgZmFsc2UsCisgICAgICAgICAgICAgICAgICBHcmFwaFRyYWl0czxjb25zdCBSZWdpb25Ob2RlVCAqPj47CisKKyAgZWxlbWVudF9pdGVyYXRvciBlbGVtZW50X2JlZ2luKCk7CisgIGVsZW1lbnRfaXRlcmF0b3IgZWxlbWVudF9lbmQoKTsKKyAgaXRlcmF0b3JfcmFuZ2U8ZWxlbWVudF9pdGVyYXRvcj4gZWxlbWVudHMoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoZWxlbWVudF9iZWdpbigpLCBlbGVtZW50X2VuZCgpKTsKKyAgfQorCisgIGNvbnN0X2VsZW1lbnRfaXRlcmF0b3IgZWxlbWVudF9iZWdpbigpIGNvbnN0OworICBjb25zdF9lbGVtZW50X2l0ZXJhdG9yIGVsZW1lbnRfZW5kKCkgY29uc3Q7CisgIGl0ZXJhdG9yX3JhbmdlPGNvbnN0X2VsZW1lbnRfaXRlcmF0b3I+IGVsZW1lbnRzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGVsZW1lbnRfYmVnaW4oKSwgZWxlbWVudF9lbmQoKSk7CisgIH0KKyAgLy9AfQorfTsKKworLy8vIFByaW50IGEgUmVnaW9uTm9kZS4KK3RlbXBsYXRlIDxjbGFzcyBUcj4KK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFJlZ2lvbk5vZGVCYXNlPFRyPiAmTm9kZSk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQGJyaWVmIEFuYWx5c2lzIHRoYXQgZGV0ZWN0cyBhbGwgY2Fub25pY2FsIFJlZ2lvbnMuCisvLy8KKy8vLyBUaGUgUmVnaW9uSW5mbyBwYXNzIGRldGVjdHMgYWxsIGNhbm9uaWNhbCByZWdpb25zIGluIGEgZnVuY3Rpb24uIFRoZSBSZWdpb25zCisvLy8gYXJlIGNvbm5lY3RlZCB1c2luZyB0aGUgcGFyZW50IHJlbGF0aW9uLiBUaGlzIGJ1aWxkcyBhIFByb2dyYW0gU3RydWN0dXJlCisvLy8gVHJlZS4KK3RlbXBsYXRlIDxjbGFzcyBUcj4KK2NsYXNzIFJlZ2lvbkluZm9CYXNlIHsKKyAgZnJpZW5kIGNsYXNzIFJlZ2lvbkluZm87CisgIGZyaWVuZCBjbGFzcyBNYWNoaW5lUmVnaW9uSW5mbzsKKworICB1c2luZyBCbG9ja1QgPSB0eXBlbmFtZSBUcjo6QmxvY2tUOworICB1c2luZyBGdW5jVCA9IHR5cGVuYW1lIFRyOjpGdW5jVDsKKyAgdXNpbmcgUmVnaW9uVCA9IHR5cGVuYW1lIFRyOjpSZWdpb25UOworICB1c2luZyBSZWdpb25JbmZvVCA9IHR5cGVuYW1lIFRyOjpSZWdpb25JbmZvVDsKKyAgdXNpbmcgRG9tVHJlZVQgPSB0eXBlbmFtZSBUcjo6RG9tVHJlZVQ7CisgIHVzaW5nIERvbVRyZWVOb2RlVCA9IHR5cGVuYW1lIFRyOjpEb21UcmVlTm9kZVQ7CisgIHVzaW5nIFBvc3REb21UcmVlVCA9IHR5cGVuYW1lIFRyOjpQb3N0RG9tVHJlZVQ7CisgIHVzaW5nIERvbUZyb250aWVyVCA9IHR5cGVuYW1lIFRyOjpEb21Gcm9udGllclQ7CisgIHVzaW5nIEJsb2NrVHJhaXRzID0gR3JhcGhUcmFpdHM8QmxvY2tUICo+OworICB1c2luZyBJbnZCbG9ja1RyYWl0cyA9IEdyYXBoVHJhaXRzPEludmVyc2U8QmxvY2tUICo+PjsKKyAgdXNpbmcgU3VjY0l0ZXJUeSA9IHR5cGVuYW1lIEJsb2NrVHJhaXRzOjpDaGlsZEl0ZXJhdG9yVHlwZTsKKyAgdXNpbmcgUHJlZEl0ZXJUeSA9IHR5cGVuYW1lIEludkJsb2NrVHJhaXRzOjpDaGlsZEl0ZXJhdG9yVHlwZTsKKworICB1c2luZyBCQnRvQkJNYXAgPSBEZW5zZU1hcDxCbG9ja1QgKiwgQmxvY2tUICo+OworICB1c2luZyBCQnRvUmVnaW9uTWFwID0gRGVuc2VNYXA8QmxvY2tUICosIFJlZ2lvblQgKj47CisKKyAgUmVnaW9uSW5mb0Jhc2UoKTsKKworICBSZWdpb25JbmZvQmFzZShSZWdpb25JbmZvQmFzZSAmJkFyZykKKyAgICA6IERUKHN0ZDo6bW92ZShBcmcuRFQpKSwgUERUKHN0ZDo6bW92ZShBcmcuUERUKSksIERGKHN0ZDo6bW92ZShBcmcuREYpKSwKKyAgICAgIFRvcExldmVsUmVnaW9uKHN0ZDo6bW92ZShBcmcuVG9wTGV2ZWxSZWdpb24pKSwKKyAgICAgIEJCdG9SZWdpb24oc3RkOjptb3ZlKEFyZy5CQnRvUmVnaW9uKSkgeworICAgIEFyZy53aXBlKCk7CisgIH0KKworICBSZWdpb25JbmZvQmFzZSAmb3BlcmF0b3I9KFJlZ2lvbkluZm9CYXNlICYmUkhTKSB7CisgICAgRFQgPSBzdGQ6Om1vdmUoUkhTLkRUKTsKKyAgICBQRFQgPSBzdGQ6Om1vdmUoUkhTLlBEVCk7CisgICAgREYgPSBzdGQ6Om1vdmUoUkhTLkRGKTsKKyAgICBUb3BMZXZlbFJlZ2lvbiA9IHN0ZDo6bW92ZShSSFMuVG9wTGV2ZWxSZWdpb24pOworICAgIEJCdG9SZWdpb24gPSBzdGQ6Om1vdmUoUkhTLkJCdG9SZWdpb24pOworICAgIFJIUy53aXBlKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmlydHVhbCB+UmVnaW9uSW5mb0Jhc2UoKTsKKworICBEb21UcmVlVCAqRFQ7CisgIFBvc3REb21UcmVlVCAqUERUOworICBEb21Gcm9udGllclQgKkRGOworCisgIC8vLyBUaGUgdG9wIGxldmVsIHJlZ2lvbi4KKyAgUmVnaW9uVCAqVG9wTGV2ZWxSZWdpb24gPSBudWxscHRyOworCisgIC8vLyBNYXAgZXZlcnkgQkIgdG8gdGhlIHNtYWxsZXN0IHJlZ2lvbiwgdGhhdCBjb250YWlucyBCQi4KKyAgQkJ0b1JlZ2lvbk1hcCBCQnRvUmVnaW9uOworCitwcm90ZWN0ZWQ6CisgIC8vLyBcYnJpZWYgVXBkYXRlIHJlZmVuY2VzIHRvIGEgUmVnaW9uSW5mb1QgaGVsZCBieSB0aGUgUmVnaW9uVCBtYW5hZ2VkIGhlcmUKKyAgLy8vCisgIC8vLyBUaGlzIGlzIGEgcG9zdC1tb3ZlIGhlbHBlci4gUmVnaW9ucyBob2xkIHJlZmVyZW5jZXMgdG8gdGhlIG93bmluZworICAvLy8gUmVnaW9uSW5mbyBvYmplY3QuIEFmdGVyIGEgbW92ZSB0aGVzZSBuZWVkIHRvIGJlIGZpeGVkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUaGVSZWdpb25UPgorICB2b2lkIHVwZGF0ZVJlZ2lvblRyZWUoUmVnaW9uSW5mb1QgJlJJLCBUaGVSZWdpb25UICpSKSB7CisgICAgaWYgKCFSKQorICAgICAgcmV0dXJuOworICAgIFItPlJJID0gJlJJOworICAgIGZvciAoYXV0byAmU3ViUiA6ICpSKQorICAgICAgdXBkYXRlUmVnaW9uVHJlZShSSSwgU3ViUi5nZXQoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBXaXBlIHRoaXMgcmVnaW9uIHRyZWUncyBzdGF0ZSB3aXRob3V0IHJlbGVhc2luZyBhbnkgcmVzb3VyY2VzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgZXNzZW50aWFsbHkgYSBwb3N0LW1vdmUgaGVscGVyIG9ubHkuIEl0IGxlYXZlcyB0aGUgb2JqZWN0IGluIGFuCisgIC8vLyBhc3NpZ25hYmxlIGFuZCBkZXN0cm95YWJsZSBzdGF0ZSwgYnV0IG90aGVyd2lzZSBpbnZhbGlkLgorICB2b2lkIHdpcGUoKSB7CisgICAgRFQgPSBudWxscHRyOworICAgIFBEVCA9IG51bGxwdHI7CisgICAgREYgPSBudWxscHRyOworICAgIFRvcExldmVsUmVnaW9uID0gbnVsbHB0cjsKKyAgICBCQnRvUmVnaW9uLmNsZWFyKCk7CisgIH0KKworICAvLyBDaGVjayB3aGV0aGVyIHRoZSBlbnRyaWVzIG9mIEJCdG9SZWdpb24gZm9yIHRoZSBCQnMgb2YgcmVnaW9uCisgIC8vIFNSIGFyZSBjb3JyZWN0LiBUcmlnZ2VycyBhbiBhc3NlcnRpb24gaWYgbm90LiBDYWxscyBpdHNlbGYgcmVjdXJzaXZlbHkgZm9yCisgIC8vIHN1YnJlZ2lvbnMuCisgIHZvaWQgdmVyaWZ5QkJNYXAoY29uc3QgUmVnaW9uVCAqU1IpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBCQiBpcyBpbiB0aGUgZG9taW5hbmNlIGZyb250aWVyIG9mCisgIC8vIGVudHJ5LCBiZWNhdXNlIGl0IHdhcyBpbmhlcml0ZWQgZnJvbSBleGl0LiBJbiB0aGUgb3RoZXIgY2FzZSB0aGVyZSBpcyBhbgorICAvLyBlZGdlIGdvaW5nIGZyb20gZW50cnkgdG8gQkIgd2l0aG91dCBwYXNzaW5nIGV4aXQuCisgIGJvb2wgaXNDb21tb25Eb21Gcm9udGllcihCbG9ja1QgKkJCLCBCbG9ja1QgKmVudHJ5LCBCbG9ja1QgKmV4aXQpIGNvbnN0OworCisgIC8vIENoZWNrIGlmIGVudHJ5IGFuZCBleGl0IHN1cnJvdW5kIGEgdmFsaWQgcmVnaW9uLCBiYXNlZCBvbgorICAvLyBkb21pbmFuY2UgdHJlZSBhbmQgZG9taW5hbmNlIGZyb250aWVyLgorICBib29sIGlzUmVnaW9uKEJsb2NrVCAqZW50cnksIEJsb2NrVCAqZXhpdCkgY29uc3Q7CisKKyAgLy8gU2F2ZXMgYSBzaG9ydGN1dCBwb2ludGluZyBmcm9tIGVudHJ5IHRvIGV4aXQuCisgIC8vIFRoaXMgZnVuY3Rpb24gbWF5IGV4dGVuZCB0aGlzIHNob3J0Y3V0IGlmIHBvc3NpYmxlLgorICB2b2lkIGluc2VydFNob3J0Q3V0KEJsb2NrVCAqZW50cnksIEJsb2NrVCAqZXhpdCwgQkJ0b0JCTWFwICpTaG9ydEN1dCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0aGUgbmV4dCBCQiB0aGF0IHBvc3Rkb21pbmF0ZXMgTiwgd2hpbGUgc2tpcHBpbmcKKyAgLy8gYWxsIHBvc3QgZG9taW5hdG9ycyB0aGF0IGNhbm5vdCBmaW5pc2ggYSBjYW5vbmljYWwgcmVnaW9uLgorICBEb21UcmVlTm9kZVQgKmdldE5leHRQb3N0RG9tKERvbVRyZWVOb2RlVCAqTiwgQkJ0b0JCTWFwICpTaG9ydEN1dCkgY29uc3Q7CisKKyAgLy8gQSByZWdpb24gaXMgdHJpdmlhbCwgaWYgaXQgY29udGFpbnMgb25seSBvbmUgQkIuCisgIGJvb2wgaXNUcml2aWFsUmVnaW9uKEJsb2NrVCAqZW50cnksIEJsb2NrVCAqZXhpdCkgY29uc3Q7CisKKyAgLy8gQ3JlYXRlcyBhIHNpbmdsZSBlbnRyeSBzaW5nbGUgZXhpdCByZWdpb24uCisgIFJlZ2lvblQgKmNyZWF0ZVJlZ2lvbihCbG9ja1QgKmVudHJ5LCBCbG9ja1QgKmV4aXQpOworCisgIC8vIERldGVjdCBhbGwgcmVnaW9ucyBzdGFydGluZyB3aXRoIGJiICdlbnRyeScuCisgIHZvaWQgZmluZFJlZ2lvbnNXaXRoRW50cnkoQmxvY2tUICplbnRyeSwgQkJ0b0JCTWFwICpTaG9ydEN1dCk7CisKKyAgLy8gRGV0ZWN0cyByZWdpb25zIGluIEYuCisgIHZvaWQgc2NhbkZvclJlZ2lvbnMoRnVuY1QgJkYsIEJCdG9CQk1hcCAqU2hvcnRDdXQpOworCisgIC8vIEdldCB0aGUgdG9wIG1vc3QgcGFyZW50IHdpdGggdGhlIHNhbWUgZW50cnkgYmxvY2suCisgIFJlZ2lvblQgKmdldFRvcE1vc3RQYXJlbnQoUmVnaW9uVCAqcmVnaW9uKTsKKworICAvLyBCdWlsZCB0aGUgcmVnaW9uIGhpZXJhcmNoeSBhZnRlciBhbGwgcmVnaW9uIGRldGVjdGVkLgorICB2b2lkIGJ1aWxkUmVnaW9uc1RyZWUoRG9tVHJlZU5vZGVUICpOLCBSZWdpb25UICpyZWdpb24pOworCisgIC8vIFVwZGF0ZSBzdGF0aXN0aWMgYWJvdXQgY3JlYXRlZCByZWdpb25zLgorICB2aXJ0dWFsIHZvaWQgdXBkYXRlU3RhdGlzdGljcyhSZWdpb25UICpSKSA9IDA7CisKKyAgLy8gRGV0ZWN0IGFsbCByZWdpb25zIGluIGZ1bmN0aW9uIGFuZCBidWlsZCB0aGUgcmVnaW9uIHRyZWUuCisgIHZvaWQgY2FsY3VsYXRlKEZ1bmNUICZGKTsKKworcHVibGljOgorICBSZWdpb25JbmZvQmFzZShjb25zdCBSZWdpb25JbmZvQmFzZSAmKSA9IGRlbGV0ZTsKKyAgUmVnaW9uSW5mb0Jhc2UgJm9wZXJhdG9yPShjb25zdCBSZWdpb25JbmZvQmFzZSAmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgYm9vbCBWZXJpZnlSZWdpb25JbmZvOworICBzdGF0aWMgdHlwZW5hbWUgUmVnaW9uVDo6UHJpbnRTdHlsZSBwcmludFN0eWxlOworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyNpZiAhZGVmaW5lZChOREVCVUcpIHx8IGRlZmluZWQoTExWTV9FTkFCTEVfRFVNUCkKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisjZW5kaWYKKworICB2b2lkIHJlbGVhc2VNZW1vcnkoKTsKKworICAvLy8gQGJyaWVmIEdldCB0aGUgc21hbGxlc3QgcmVnaW9uIHRoYXQgY29udGFpbnMgYSBCYXNpY0Jsb2NrLgorICAvLy8KKyAgLy8vIEBwYXJhbSBCQiBUaGUgYmFzaWMgYmxvY2suCisgIC8vLyBAcmV0dXJuIFRoZSBzbWFsbGVzdCByZWdpb24sIHRoYXQgY29udGFpbnMgQkIgb3IgTlVMTCwgaWYgdGhlcmUgaXMgbm8KKyAgLy8vIHJlZ2lvbiBjb250YWluaW5nIEJCLgorICBSZWdpb25UICpnZXRSZWdpb25Gb3IoQmxvY2tUICpCQikgY29uc3Q7CisKKyAgLy8vIEBicmllZiAgU2V0IHRoZSBzbWFsbGVzdCByZWdpb24gdGhhdCBzdXJyb3VuZHMgYSBiYXNpYyBibG9jay4KKyAgLy8vCisgIC8vLyBAcGFyYW0gQkIgVGhlIGJhc2ljIGJsb2NrIHN1cnJvdW5kZWQgYnkgYSByZWdpb24uCisgIC8vLyBAcGFyYW0gUiBUaGUgc21hbGxlc3QgcmVnaW9uIHRoYXQgc3Vycm91bmRzIEJCLgorICB2b2lkIHNldFJlZ2lvbkZvcihCbG9ja1QgKkJCLCBSZWdpb25UICpSKTsKKworICAvLy8gQGJyaWVmIEEgc2hvcnRjdXQgZm9yIGdldFJlZ2lvbkZvcigpLgorICAvLy8KKyAgLy8vIEBwYXJhbSBCQiBUaGUgYmFzaWMgYmxvY2suCisgIC8vLyBAcmV0dXJuIFRoZSBzbWFsbGVzdCByZWdpb24sIHRoYXQgY29udGFpbnMgQkIgb3IgTlVMTCwgaWYgdGhlcmUgaXMgbm8KKyAgLy8vIHJlZ2lvbiBjb250YWluaW5nIEJCLgorICBSZWdpb25UICpvcGVyYXRvcltdKEJsb2NrVCAqQkIpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBleGl0IG9mIHRoZSBtYXhpbWFsIHJlZmluZWQgcmVnaW9uLCB0aGF0IHN0YXJ0cyBhdCBhCisgIC8vLyBCYXNpY0Jsb2NrLgorICAvLy8KKyAgLy8vIEBwYXJhbSBCQiBUaGUgQmFzaWNCbG9jayB0aGUgcmVmaW5lZCByZWdpb24gc3RhcnRzLgorICBCbG9ja1QgKmdldE1heFJlZ2lvbkV4aXQoQmxvY2tUICpCQikgY29uc3Q7CisKKyAgLy8vIEBicmllZiBGaW5kIHRoZSBzbWFsbGVzdCByZWdpb24gdGhhdCBjb250YWlucyB0d28gcmVnaW9ucy4KKyAgLy8vCisgIC8vLyBAcGFyYW0gQSBUaGUgZmlyc3QgcmVnaW9uLgorICAvLy8gQHBhcmFtIEIgVGhlIHNlY29uZCByZWdpb24uCisgIC8vLyBAcmV0dXJuIFRoZSBzbWFsbGVzdCByZWdpb24gY29udGFpbmluZyBBIGFuZCBCLgorICBSZWdpb25UICpnZXRDb21tb25SZWdpb24oUmVnaW9uVCAqQSwgUmVnaW9uVCAqQikgY29uc3Q7CisKKyAgLy8vIEBicmllZiBGaW5kIHRoZSBzbWFsbGVzdCByZWdpb24gdGhhdCBjb250YWlucyB0d28gYmFzaWMgYmxvY2tzLgorICAvLy8KKyAgLy8vIEBwYXJhbSBBIFRoZSBmaXJzdCBiYXNpYyBibG9jay4KKyAgLy8vIEBwYXJhbSBCIFRoZSBzZWNvbmQgYmFzaWMgYmxvY2suCisgIC8vLyBAcmV0dXJuIFRoZSBzbWFsbGVzdCByZWdpb24gdGhhdCBjb250YWlucyBBIGFuZCBCLgorICBSZWdpb25UICpnZXRDb21tb25SZWdpb24oQmxvY2tUICpBLCBCbG9ja1QgKkIpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0Q29tbW9uUmVnaW9uKGdldFJlZ2lvbkZvcihBKSwgZ2V0UmVnaW9uRm9yKEIpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRmluZCB0aGUgc21hbGxlc3QgcmVnaW9uIHRoYXQgY29udGFpbnMgYSBzZXQgb2YgcmVnaW9ucy4KKyAgLy8vCisgIC8vLyBAcGFyYW0gUmVnaW9ucyBBIHZlY3RvciBvZiByZWdpb25zLgorICAvLy8gQHJldHVybiBUaGUgc21hbGxlc3QgcmVnaW9uIHRoYXQgY29udGFpbnMgYWxsIHJlZ2lvbnMgaW4gUmVnaW9ucy4KKyAgUmVnaW9uVCAqZ2V0Q29tbW9uUmVnaW9uKFNtYWxsVmVjdG9ySW1wbDxSZWdpb25UICo+ICZSZWdpb25zKSBjb25zdDsKKworICAvLy8gQGJyaWVmIEZpbmQgdGhlIHNtYWxsZXN0IHJlZ2lvbiB0aGF0IGNvbnRhaW5zIGEgc2V0IG9mIGJhc2ljIGJsb2Nrcy4KKyAgLy8vCisgIC8vLyBAcGFyYW0gQkJzIEEgdmVjdG9yIG9mIGJhc2ljIGJsb2Nrcy4KKyAgLy8vIEByZXR1cm4gVGhlIHNtYWxsZXN0IHJlZ2lvbiB0aGF0IGNvbnRhaW5zIGFsbCBiYXNpYyBibG9ja3MgaW4gQkJTLgorICBSZWdpb25UICpnZXRDb21tb25SZWdpb24oU21hbGxWZWN0b3JJbXBsPEJsb2NrVCAqPiAmQkJzKSBjb25zdDsKKworICBSZWdpb25UICpnZXRUb3BMZXZlbFJlZ2lvbigpIGNvbnN0IHsgcmV0dXJuIFRvcExldmVsUmVnaW9uOyB9CisKKyAgLy8vIEBicmllZiBDbGVhciB0aGUgTm9kZSBDYWNoZSBmb3IgYWxsIFJlZ2lvbnMuCisgIC8vLworICAvLy8gQHNlZSBSZWdpb246OmNsZWFyTm9kZUNhY2hlKCkKKyAgdm9pZCBjbGVhck5vZGVDYWNoZSgpIHsKKyAgICBpZiAoVG9wTGV2ZWxSZWdpb24pCisgICAgICBUb3BMZXZlbFJlZ2lvbi0+Y2xlYXJOb2RlQ2FjaGUoKTsKKyAgfQorCisgIHZvaWQgdmVyaWZ5QW5hbHlzaXMoKSBjb25zdDsKK307CisKK2NsYXNzIFJlZ2lvbjsKKworY2xhc3MgUmVnaW9uTm9kZSA6IHB1YmxpYyBSZWdpb25Ob2RlQmFzZTxSZWdpb25UcmFpdHM8RnVuY3Rpb24+PiB7CitwdWJsaWM6CisgIGlubGluZSBSZWdpb25Ob2RlKFJlZ2lvbiAqUGFyZW50LCBCYXNpY0Jsb2NrICpFbnRyeSwgYm9vbCBpc1N1YlJlZ2lvbiA9IGZhbHNlKQorICAgICAgOiBSZWdpb25Ob2RlQmFzZTxSZWdpb25UcmFpdHM8RnVuY3Rpb24+PihQYXJlbnQsIEVudHJ5LCBpc1N1YlJlZ2lvbikge30KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgUmVnaW9uICZSTikgY29uc3QgeworICAgIHJldHVybiB0aGlzID09IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUmVnaW9uTm9kZSAqPigmUk4pOworICB9Cit9OworCitjbGFzcyBSZWdpb24gOiBwdWJsaWMgUmVnaW9uQmFzZTxSZWdpb25UcmFpdHM8RnVuY3Rpb24+PiB7CitwdWJsaWM6CisgIFJlZ2lvbihCYXNpY0Jsb2NrICpFbnRyeSwgQmFzaWNCbG9jayAqRXhpdCwgUmVnaW9uSW5mbyAqUkksIERvbWluYXRvclRyZWUgKkRULAorICAgICAgICAgUmVnaW9uICpQYXJlbnQgPSBudWxscHRyKTsKKyAgflJlZ2lvbigpOworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZWdpb25Ob2RlICZSTikgY29uc3QgeworICAgIHJldHVybiAmUk4gPT0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBSZWdpb25Ob2RlICo+KHRoaXMpOworICB9Cit9OworCitjbGFzcyBSZWdpb25JbmZvIDogcHVibGljIFJlZ2lvbkluZm9CYXNlPFJlZ2lvblRyYWl0czxGdW5jdGlvbj4+IHsKK3B1YmxpYzoKKyAgdXNpbmcgQmFzZSA9IFJlZ2lvbkluZm9CYXNlPFJlZ2lvblRyYWl0czxGdW5jdGlvbj4+OworCisgIGV4cGxpY2l0IFJlZ2lvbkluZm8oKTsKKworICBSZWdpb25JbmZvKFJlZ2lvbkluZm8gJiZBcmcpIDogQmFzZShzdGQ6Om1vdmUoc3RhdGljX2Nhc3Q8QmFzZSAmPihBcmcpKSkgeworICAgIHVwZGF0ZVJlZ2lvblRyZWUoKnRoaXMsIFRvcExldmVsUmVnaW9uKTsKKyAgfQorCisgIFJlZ2lvbkluZm8gJm9wZXJhdG9yPShSZWdpb25JbmZvICYmUkhTKSB7CisgICAgQmFzZTo6b3BlcmF0b3I9KHN0ZDo6bW92ZShzdGF0aWNfY2FzdDxCYXNlICY+KFJIUykpKTsKKyAgICB1cGRhdGVSZWdpb25UcmVlKCp0aGlzLCBUb3BMZXZlbFJlZ2lvbik7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgflJlZ2lvbkluZm8oKSBvdmVycmlkZTsKKworICAvLy8gSGFuZGxlIGludmFsaWRhdGlvbiBleHBsaWNpdGx5LgorICBib29sIGludmFsaWRhdGUoRnVuY3Rpb24gJkYsIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzICZQQSwKKyAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyOjpJbnZhbGlkYXRvciAmKTsKKworICAvLyB1cGRhdGVTdGF0aXN0aWNzIC0gVXBkYXRlIHN0YXRpc3RpYyBhYm91dCBjcmVhdGVkIHJlZ2lvbnMuCisgIHZvaWQgdXBkYXRlU3RhdGlzdGljcyhSZWdpb24gKlIpIGZpbmFsOworCisgIHZvaWQgcmVjYWxjdWxhdGUoRnVuY3Rpb24gJkYsIERvbWluYXRvclRyZWUgKkRULCBQb3N0RG9taW5hdG9yVHJlZSAqUERULAorICAgICAgICAgICAgICAgICAgIERvbWluYW5jZUZyb250aWVyICpERik7CisKKyNpZm5kZWYgTkRFQlVHCisgIC8vLyBAYnJpZWYgT3BlbnMgYSB2aWV3ZXIgdG8gc2hvdyB0aGUgR3JhcGhWaXogdmlzdWFsaXphdGlvbiBvZiB0aGUgcmVnaW9ucy4KKyAgLy8vCisgIC8vLyBVc2VmdWwgZHVyaW5nIGRlYnVnZ2luZyBhcyBhbiBhbHRlcm5hdGl2ZSB0byBkdW1wKCkuCisgIHZvaWQgdmlldygpOworCisgIC8vLyBAYnJpZWYgT3BlbnMgYSB2aWV3ZXIgdG8gc2hvdyB0aGUgR3JhcGhWaXogdmlzdWFsaXphdGlvbiBvZiB0aGlzIHJlZ2lvbgorICAvLy8gd2l0aG91dCBpbnN0cnVjdGlvbnMgaW4gdGhlIEJhc2ljQmxvY2tzLgorICAvLy8KKyAgLy8vIFVzZWZ1bCBkdXJpbmcgZGVidWdnaW5nIGFzIGFuIGFsdGVybmF0aXZlIHRvIGR1bXAoKS4KKyAgdm9pZCB2aWV3T25seSgpOworI2VuZGlmCit9OworCitjbGFzcyBSZWdpb25JbmZvUGFzcyA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICBSZWdpb25JbmZvIFJJOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIGV4cGxpY2l0IFJlZ2lvbkluZm9QYXNzKCk7CisgIH5SZWdpb25JbmZvUGFzcygpIG92ZXJyaWRlOworCisgIFJlZ2lvbkluZm8gJmdldFJlZ2lvbkluZm8oKSB7IHJldHVybiBSSTsgfQorCisgIGNvbnN0IFJlZ2lvbkluZm8gJmdldFJlZ2lvbkluZm8oKSBjb25zdCB7IHJldHVybiBSSTsgfQorCisgIC8vLyBAbmFtZSBGdW5jdGlvblBhc3MgaW50ZXJmYWNlCisgIC8vQHsKKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSBvdmVycmlkZTsKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGU7CisgIHZvaWQgdmVyaWZ5QW5hbHlzaXMoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSAqKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisgIC8vQH0KK307CisKKy8vLyBcYnJpZWYgQW5hbHlzaXMgcGFzcyB0aGF0IGV4cG9zZXMgdGhlIFxjIFJlZ2lvbkluZm8gZm9yIGEgZnVuY3Rpb24uCitjbGFzcyBSZWdpb25JbmZvQW5hbHlzaXMgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48UmVnaW9uSW5mb0FuYWx5c2lzPiB7CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxSZWdpb25JbmZvQW5hbHlzaXM+OworCisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7CisKK3B1YmxpYzoKKyAgdXNpbmcgUmVzdWx0ID0gUmVnaW9uSW5mbzsKKworICBSZWdpb25JbmZvIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBcYnJpZWYgUHJpbnRlciBwYXNzIGZvciB0aGUgXGMgUmVnaW9uSW5mby4KK2NsYXNzIFJlZ2lvbkluZm9QcmludGVyUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPFJlZ2lvbkluZm9QcmludGVyUGFzcz4geworICByYXdfb3N0cmVhbSAmT1M7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgUmVnaW9uSW5mb1ByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPUyk7CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIFxicmllZiBWZXJpZmllciBwYXNzIGZvciB0aGUgXGMgUmVnaW9uSW5mby4KK3N0cnVjdCBSZWdpb25JbmZvVmVyaWZpZXJQYXNzIDogUGFzc0luZm9NaXhpbjxSZWdpb25JbmZvVmVyaWZpZXJQYXNzPiB7CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKK3RlbXBsYXRlIDw+Cit0ZW1wbGF0ZSA8PgoraW5saW5lIEJhc2ljQmxvY2sgKgorUmVnaW9uTm9kZUJhc2U8UmVnaW9uVHJhaXRzPEZ1bmN0aW9uPj46OmdldE5vZGVBczxCYXNpY0Jsb2NrPigpIGNvbnN0IHsKKyAgYXNzZXJ0KCFpc1N1YlJlZ2lvbigpICYmICJUaGlzIGlzIG5vdCBhIEJhc2ljQmxvY2sgUmVnaW9uTm9kZSEiKTsKKyAgcmV0dXJuIGdldEVudHJ5KCk7Cit9CisKK3RlbXBsYXRlIDw+Cit0ZW1wbGF0ZSA8PgoraW5saW5lIFJlZ2lvbiAqCitSZWdpb25Ob2RlQmFzZTxSZWdpb25UcmFpdHM8RnVuY3Rpb24+Pjo6Z2V0Tm9kZUFzPFJlZ2lvbj4oKSBjb25zdCB7CisgIGFzc2VydChpc1N1YlJlZ2lvbigpICYmICJUaGlzIGlzIG5vdCBhIHN1YnJlZ2lvbiBSZWdpb25Ob2RlISIpOworICBhdXRvIFVuY29uc3QgPSBjb25zdF9jYXN0PFJlZ2lvbk5vZGVCYXNlPFJlZ2lvblRyYWl0czxGdW5jdGlvbj4+ICo+KHRoaXMpOworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxSZWdpb24gKj4oVW5jb25zdCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVnaW9uTm9kZUJhc2U8VHI+ICZOb2RlKSB7CisgIHVzaW5nIEJsb2NrVCA9IHR5cGVuYW1lIFRyOjpCbG9ja1Q7CisgIHVzaW5nIFJlZ2lvblQgPSB0eXBlbmFtZSBUcjo6UmVnaW9uVDsKKworICBpZiAoTm9kZS5pc1N1YlJlZ2lvbigpKQorICAgIHJldHVybiBPUyA8PCBOb2RlLnRlbXBsYXRlIGdldE5vZGVBczxSZWdpb25UPigpLT5nZXROYW1lU3RyKCk7CisgIGVsc2UKKyAgICByZXR1cm4gT1MgPDwgTm9kZS50ZW1wbGF0ZSBnZXROb2RlQXM8QmxvY2tUPigpLT5nZXROYW1lKCk7Cit9CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBSZWdpb25CYXNlPFJlZ2lvblRyYWl0czxGdW5jdGlvbj4+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIFJlZ2lvbk5vZGVCYXNlPFJlZ2lvblRyYWl0czxGdW5jdGlvbj4+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIFJlZ2lvbkluZm9CYXNlPFJlZ2lvblRyYWl0czxGdW5jdGlvbj4+OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19SRUdJT05JTkZPX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUmVnaW9uSW5mb0ltcGwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUmVnaW9uSW5mb0ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjZiYWFjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9SZWdpb25JbmZvSW1wbC5oCkBAIC0wLDAgKzEsOTMxIEBACisvLz09PS0gUmVnaW9uSW5mb0ltcGwuaCAtIFNFU0UgcmVnaW9uIGRldGVjdGlvbiBhbmFseXNpcyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRGV0ZWN0cyBzaW5nbGUgZW50cnkgc2luZ2xlIGV4aXQgcmVnaW9ucyBpbiB0aGUgY29udHJvbCBmbG93IGdyYXBoLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1JFR0lPTklORk9JTVBMX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19SRUdJT05JTkZPSU1QTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1Bvc3RPcmRlckl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRG9taW5hbmNlRnJvbnRpZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Qb3N0RG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvUmVnaW9uSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvUmVnaW9uSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2RlZmluZSBERUJVR19UWVBFICJyZWdpb24iCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBSZWdpb25CYXNlIEltcGxlbWVudGF0aW9uCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+CitSZWdpb25CYXNlPFRyPjo6UmVnaW9uQmFzZShCbG9ja1QgKkVudHJ5LCBCbG9ja1QgKkV4aXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBUcjo6UmVnaW9uSW5mb1QgKlJJbmZvLCBEb21UcmVlVCAqZHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpb25UICpQYXJlbnQpCisgICAgOiBSZWdpb25Ob2RlQmFzZTxUcj4oUGFyZW50LCBFbnRyeSwgMSksIFJJKFJJbmZvKSwgRFQoZHQpLCBleGl0KEV4aXQpIHt9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK1JlZ2lvbkJhc2U8VHI+Ojp+UmVnaW9uQmFzZSgpIHsKKyAgLy8gT25seSBjbGVhbiB0aGUgY2FjaGUgZm9yIHRoaXMgUmVnaW9uLiBDYWNoZXMgb2YgY2hpbGQgUmVnaW9ucyB3aWxsIGJlCisgIC8vIGNsZWFuZWQgd2hlbiB0aGUgY2hpbGQgUmVnaW9ucyBhcmUgZGVsZXRlZC4KKyAgQkJOb2RlTWFwLmNsZWFyKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3ZvaWQgUmVnaW9uQmFzZTxUcj46OnJlcGxhY2VFbnRyeShCbG9ja1QgKkJCKSB7CisgIHRoaXMtPmVudHJ5LnNldFBvaW50ZXIoQkIpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit2b2lkIFJlZ2lvbkJhc2U8VHI+OjpyZXBsYWNlRXhpdChCbG9ja1QgKkJCKSB7CisgIGFzc2VydChleGl0ICYmICJObyBleGl0IHRvIHJlcGxhY2UhIik7CisgIGV4aXQgPSBCQjsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordm9pZCBSZWdpb25CYXNlPFRyPjo6cmVwbGFjZUVudHJ5UmVjdXJzaXZlKEJsb2NrVCAqTmV3RW50cnkpIHsKKyAgc3RkOjp2ZWN0b3I8UmVnaW9uVCAqPiBSZWdpb25RdWV1ZTsKKyAgQmxvY2tUICpPbGRFbnRyeSA9IGdldEVudHJ5KCk7CisKKyAgUmVnaW9uUXVldWUucHVzaF9iYWNrKHN0YXRpY19jYXN0PFJlZ2lvblQgKj4odGhpcykpOworICB3aGlsZSAoIVJlZ2lvblF1ZXVlLmVtcHR5KCkpIHsKKyAgICBSZWdpb25UICpSID0gUmVnaW9uUXVldWUuYmFjaygpOworICAgIFJlZ2lvblF1ZXVlLnBvcF9iYWNrKCk7CisKKyAgICBSLT5yZXBsYWNlRW50cnkoTmV3RW50cnkpOworICAgIGZvciAoc3RkOjp1bmlxdWVfcHRyPFJlZ2lvblQ+ICZDaGlsZCA6ICpSKSB7CisgICAgICBpZiAoQ2hpbGQtPmdldEVudHJ5KCkgPT0gT2xkRW50cnkpCisgICAgICAgIFJlZ2lvblF1ZXVlLnB1c2hfYmFjayhDaGlsZC5nZXQoKSk7CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3ZvaWQgUmVnaW9uQmFzZTxUcj46OnJlcGxhY2VFeGl0UmVjdXJzaXZlKEJsb2NrVCAqTmV3RXhpdCkgeworICBzdGQ6OnZlY3RvcjxSZWdpb25UICo+IFJlZ2lvblF1ZXVlOworICBCbG9ja1QgKk9sZEV4aXQgPSBnZXRFeGl0KCk7CisKKyAgUmVnaW9uUXVldWUucHVzaF9iYWNrKHN0YXRpY19jYXN0PFJlZ2lvblQgKj4odGhpcykpOworICB3aGlsZSAoIVJlZ2lvblF1ZXVlLmVtcHR5KCkpIHsKKyAgICBSZWdpb25UICpSID0gUmVnaW9uUXVldWUuYmFjaygpOworICAgIFJlZ2lvblF1ZXVlLnBvcF9iYWNrKCk7CisKKyAgICBSLT5yZXBsYWNlRXhpdChOZXdFeGl0KTsKKyAgICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxSZWdpb25UPiAmQ2hpbGQgOiAqUikgeworICAgICAgaWYgKENoaWxkLT5nZXRFeGl0KCkgPT0gT2xkRXhpdCkKKyAgICAgICAgUmVnaW9uUXVldWUucHVzaF9iYWNrKENoaWxkLmdldCgpKTsKKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgorYm9vbCBSZWdpb25CYXNlPFRyPjo6Y29udGFpbnMoY29uc3QgQmxvY2tUICpCKSBjb25zdCB7CisgIEJsb2NrVCAqQkIgPSBjb25zdF9jYXN0PEJsb2NrVCAqPihCKTsKKworICBpZiAoIURULT5nZXROb2RlKEJCKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgQmxvY2tUICplbnRyeSA9IGdldEVudHJ5KCksICpleGl0ID0gZ2V0RXhpdCgpOworCisgIC8vIFRvcGxldmVsIHJlZ2lvbi4KKyAgaWYgKCFleGl0KQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiAoRFQtPmRvbWluYXRlcyhlbnRyeSwgQkIpICYmCisgICAgICAgICAgIShEVC0+ZG9taW5hdGVzKGV4aXQsIEJCKSAmJiBEVC0+ZG9taW5hdGVzKGVudHJ5LCBleGl0KSkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Citib29sIFJlZ2lvbkJhc2U8VHI+Ojpjb250YWlucyhjb25zdCBMb29wVCAqTCkgY29uc3QgeworICAvLyBCQnMgdGhhdCBhcmUgbm90IHBhcnQgb2YgYW55IGxvb3AgYXJlIGVsZW1lbnQgb2YgdGhlIExvb3AKKyAgLy8gZGVzY3JpYmVkIGJ5IHRoZSBOVUxMIHBvaW50ZXIuIFRoaXMgbG9vcCBpcyBub3QgcGFydCBvZiBhbnkgcmVnaW9uLAorICAvLyBleGNlcHQgaWYgdGhlIHJlZ2lvbiBkZXNjcmliZXMgdGhlIHdob2xlIGZ1bmN0aW9uLgorICBpZiAoIUwpCisgICAgcmV0dXJuIGdldEV4aXQoKSA9PSBudWxscHRyOworCisgIGlmICghY29udGFpbnMoTC0+Z2V0SGVhZGVyKCkpKQorICAgIHJldHVybiBmYWxzZTsKKworICBTbWFsbFZlY3RvcjxCbG9ja1QgKiwgOD4gRXhpdGluZ0Jsb2NrczsKKyAgTC0+Z2V0RXhpdGluZ0Jsb2NrcyhFeGl0aW5nQmxvY2tzKTsKKworICBmb3IgKEJsb2NrVCAqQkIgOiBFeGl0aW5nQmxvY2tzKSB7CisgICAgaWYgKCFjb250YWlucyhCQikpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordHlwZW5hbWUgVHI6Okxvb3BUICpSZWdpb25CYXNlPFRyPjo6b3V0ZXJtb3N0TG9vcEluUmVnaW9uKExvb3BUICpMKSBjb25zdCB7CisgIGlmICghY29udGFpbnMoTCkpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgd2hpbGUgKEwgJiYgY29udGFpbnMoTC0+Z2V0UGFyZW50TG9vcCgpKSkgeworICAgIEwgPSBMLT5nZXRQYXJlbnRMb29wKCk7CisgIH0KKworICByZXR1cm4gTDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordHlwZW5hbWUgVHI6Okxvb3BUICpSZWdpb25CYXNlPFRyPjo6b3V0ZXJtb3N0TG9vcEluUmVnaW9uKExvb3BJbmZvVCAqTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tUICpCQikgY29uc3QgeworICBhc3NlcnQoTEkgJiYgQkIgJiYgIkxJIGFuZCBCQiBjYW5ub3QgYmUgbnVsbCEiKTsKKyAgTG9vcFQgKkwgPSBMSS0+Z2V0TG9vcEZvcihCQik7CisgIHJldHVybiBvdXRlcm1vc3RMb29wSW5SZWdpb24oTCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3R5cGVuYW1lIFJlZ2lvbkJhc2U8VHI+OjpCbG9ja1QgKlJlZ2lvbkJhc2U8VHI+OjpnZXRFbnRlcmluZ0Jsb2NrKCkgY29uc3QgeworICBCbG9ja1QgKmVudHJ5ID0gZ2V0RW50cnkoKTsKKyAgQmxvY2tUICplbnRlcmluZ0Jsb2NrID0gbnVsbHB0cjsKKworICBmb3IgKEJsb2NrVCAqUHJlZCA6IG1ha2VfcmFuZ2UoSW52QmxvY2tUcmFpdHM6OmNoaWxkX2JlZ2luKGVudHJ5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludkJsb2NrVHJhaXRzOjpjaGlsZF9lbmQoZW50cnkpKSkgeworICAgIGlmIChEVC0+Z2V0Tm9kZShQcmVkKSAmJiAhY29udGFpbnMoUHJlZCkpIHsKKyAgICAgIGlmIChlbnRlcmluZ0Jsb2NrKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgICAgZW50ZXJpbmdCbG9jayA9IFByZWQ7CisgICAgfQorICB9CisKKyAgcmV0dXJuIGVudGVyaW5nQmxvY2s7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK2Jvb2wgUmVnaW9uQmFzZTxUcj46OmdldEV4aXRpbmdCbG9ja3MoCisgICAgU21hbGxWZWN0b3JJbXBsPEJsb2NrVCAqPiAmRXhpdGluZ3MpIGNvbnN0IHsKKyAgYm9vbCBDb3ZlckFsbCA9IHRydWU7CisKKyAgaWYgKCFleGl0KQorICAgIHJldHVybiBDb3ZlckFsbDsKKworICBmb3IgKFByZWRJdGVyVHkgUEkgPSBJbnZCbG9ja1RyYWl0czo6Y2hpbGRfYmVnaW4oZXhpdCksCisgICAgICAgICAgICAgICAgICBQRSA9IEludkJsb2NrVHJhaXRzOjpjaGlsZF9lbmQoZXhpdCk7CisgICAgICAgUEkgIT0gUEU7ICsrUEkpIHsKKyAgICBCbG9ja1QgKlByZWQgPSAqUEk7CisgICAgaWYgKGNvbnRhaW5zKFByZWQpKSB7CisgICAgICBFeGl0aW5ncy5wdXNoX2JhY2soUHJlZCk7CisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICBDb3ZlckFsbCA9IGZhbHNlOworICB9CisKKyAgcmV0dXJuIENvdmVyQWxsOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit0eXBlbmFtZSBSZWdpb25CYXNlPFRyPjo6QmxvY2tUICpSZWdpb25CYXNlPFRyPjo6Z2V0RXhpdGluZ0Jsb2NrKCkgY29uc3QgeworICBCbG9ja1QgKmV4aXQgPSBnZXRFeGl0KCk7CisgIEJsb2NrVCAqZXhpdGluZ0Jsb2NrID0gbnVsbHB0cjsKKworICBpZiAoIWV4aXQpCisgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgZm9yIChCbG9ja1QgKlByZWQgOiBtYWtlX3JhbmdlKEludkJsb2NrVHJhaXRzOjpjaGlsZF9iZWdpbihleGl0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludkJsb2NrVHJhaXRzOjpjaGlsZF9lbmQoZXhpdCkpKSB7CisgICAgaWYgKGNvbnRhaW5zKFByZWQpKSB7CisgICAgICBpZiAoZXhpdGluZ0Jsb2NrKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgICAgZXhpdGluZ0Jsb2NrID0gUHJlZDsKKyAgICB9CisgIH0KKworICByZXR1cm4gZXhpdGluZ0Jsb2NrOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Citib29sIFJlZ2lvbkJhc2U8VHI+Ojppc1NpbXBsZSgpIGNvbnN0IHsKKyAgcmV0dXJuICFpc1RvcExldmVsUmVnaW9uKCkgJiYgZ2V0RW50ZXJpbmdCbG9jaygpICYmIGdldEV4aXRpbmdCbG9jaygpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+CitzdGQ6OnN0cmluZyBSZWdpb25CYXNlPFRyPjo6Z2V0TmFtZVN0cigpIGNvbnN0IHsKKyAgc3RkOjpzdHJpbmcgZXhpdE5hbWU7CisgIHN0ZDo6c3RyaW5nIGVudHJ5TmFtZTsKKworICBpZiAoZ2V0RW50cnkoKS0+Z2V0TmFtZSgpLmVtcHR5KCkpIHsKKyAgICByYXdfc3RyaW5nX29zdHJlYW0gT1MoZW50cnlOYW1lKTsKKworICAgIGdldEVudHJ5KCktPnByaW50QXNPcGVyYW5kKE9TLCBmYWxzZSk7CisgIH0gZWxzZQorICAgIGVudHJ5TmFtZSA9IGdldEVudHJ5KCktPmdldE5hbWUoKTsKKworICBpZiAoZ2V0RXhpdCgpKSB7CisgICAgaWYgKGdldEV4aXQoKS0+Z2V0TmFtZSgpLmVtcHR5KCkpIHsKKyAgICAgIHJhd19zdHJpbmdfb3N0cmVhbSBPUyhleGl0TmFtZSk7CisKKyAgICAgIGdldEV4aXQoKS0+cHJpbnRBc09wZXJhbmQoT1MsIGZhbHNlKTsKKyAgICB9IGVsc2UKKyAgICAgIGV4aXROYW1lID0gZ2V0RXhpdCgpLT5nZXROYW1lKCk7CisgIH0gZWxzZQorICAgIGV4aXROYW1lID0gIjxGdW5jdGlvbiBSZXR1cm4+IjsKKworICByZXR1cm4gZW50cnlOYW1lICsgIiA9PiAiICsgZXhpdE5hbWU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3ZvaWQgUmVnaW9uQmFzZTxUcj46OnZlcmlmeUJCSW5SZWdpb24oQmxvY2tUICpCQikgY29uc3QgeworICBpZiAoIWNvbnRhaW5zKEJCKSkKKyAgICByZXBvcnRfZmF0YWxfZXJyb3IoIkJyb2tlbiByZWdpb24gZm91bmQ6IGVudW1lcmF0ZWQgQkIgbm90IGluIHJlZ2lvbiEiKTsKKworICBCbG9ja1QgKmVudHJ5ID0gZ2V0RW50cnkoKSwgKmV4aXQgPSBnZXRFeGl0KCk7CisKKyAgZm9yIChCbG9ja1QgKlN1Y2MgOgorICAgICAgIG1ha2VfcmFuZ2UoQmxvY2tUcmFpdHM6OmNoaWxkX2JlZ2luKEJCKSwgQmxvY2tUcmFpdHM6OmNoaWxkX2VuZChCQikpKSB7CisgICAgaWYgKCFjb250YWlucyhTdWNjKSAmJiBleGl0ICE9IFN1Y2MpCisgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoIkJyb2tlbiByZWdpb24gZm91bmQ6IGVkZ2VzIGxlYXZpbmcgdGhlIHJlZ2lvbiBtdXN0IGdvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAidG8gdGhlIGV4aXQgbm9kZSEiKTsKKyAgfQorCisgIGlmIChlbnRyeSAhPSBCQikgeworICAgIGZvciAoQmxvY2tUICpQcmVkIDogbWFrZV9yYW5nZShJbnZCbG9ja1RyYWl0czo6Y2hpbGRfYmVnaW4oQkIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZCbG9ja1RyYWl0czo6Y2hpbGRfZW5kKEJCKSkpIHsKKyAgICAgIGlmICghY29udGFpbnMoUHJlZCkpCisgICAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiQnJva2VuIHJlZ2lvbiBmb3VuZDogZWRnZXMgZW50ZXJpbmcgdGhlIHJlZ2lvbiBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbyB0byB0aGUgZW50cnkgbm9kZSEiKTsKKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordm9pZCBSZWdpb25CYXNlPFRyPjo6dmVyaWZ5V2FsayhCbG9ja1QgKkJCLCBzdGQ6OnNldDxCbG9ja1QgKj4gKnZpc2l0ZWQpIGNvbnN0IHsKKyAgQmxvY2tUICpleGl0ID0gZ2V0RXhpdCgpOworCisgIHZpc2l0ZWQtPmluc2VydChCQik7CisKKyAgdmVyaWZ5QkJJblJlZ2lvbihCQik7CisKKyAgZm9yIChCbG9ja1QgKlN1Y2MgOgorICAgICAgIG1ha2VfcmFuZ2UoQmxvY2tUcmFpdHM6OmNoaWxkX2JlZ2luKEJCKSwgQmxvY2tUcmFpdHM6OmNoaWxkX2VuZChCQikpKSB7CisgICAgaWYgKFN1Y2MgIT0gZXhpdCAmJiB2aXNpdGVkLT5maW5kKFN1Y2MpID09IHZpc2l0ZWQtPmVuZCgpKQorICAgICAgdmVyaWZ5V2FsayhTdWNjLCB2aXNpdGVkKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit2b2lkIFJlZ2lvbkJhc2U8VHI+Ojp2ZXJpZnlSZWdpb24oKSBjb25zdCB7CisgIC8vIE9ubHkgZG8gdmVyaWZpY2F0aW9uIHdoZW4gdXNlciB3YW50cyB0bywgb3RoZXJ3aXNlIHRoaXMgZXhwZW5zaXZlIGNoZWNrCisgIC8vIHdpbGwgYmUgaW52b2tlZCBieSBQTURhdGFNYW5hZ2VyOjp2ZXJpZnlQcmVzZXJ2ZWRBbmFseXNpcyB3aGVuCisgIC8vIGEgcmVnaW9ucGFzcyAobWFya2VkIFByZXNlcnZlZEFsbCkgZmluaXNoLgorICBpZiAoIVJlZ2lvbkluZm9CYXNlPFRyPjo6VmVyaWZ5UmVnaW9uSW5mbykKKyAgICByZXR1cm47CisKKyAgc3RkOjpzZXQ8QmxvY2tUICo+IHZpc2l0ZWQ7CisgIHZlcmlmeVdhbGsoZ2V0RW50cnkoKSwgJnZpc2l0ZWQpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit2b2lkIFJlZ2lvbkJhc2U8VHI+Ojp2ZXJpZnlSZWdpb25OZXN0KCkgY29uc3QgeworICBmb3IgKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxSZWdpb25UPiAmUiA6ICp0aGlzKQorICAgIFItPnZlcmlmeVJlZ2lvbk5lc3QoKTsKKworICB2ZXJpZnlSZWdpb24oKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordHlwZW5hbWUgUmVnaW9uQmFzZTxUcj46OmVsZW1lbnRfaXRlcmF0b3IgUmVnaW9uQmFzZTxUcj46OmVsZW1lbnRfYmVnaW4oKSB7CisgIHJldHVybiBHcmFwaFRyYWl0czxSZWdpb25UICo+Ojpub2Rlc19iZWdpbihzdGF0aWNfY2FzdDxSZWdpb25UICo+KHRoaXMpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordHlwZW5hbWUgUmVnaW9uQmFzZTxUcj46OmVsZW1lbnRfaXRlcmF0b3IgUmVnaW9uQmFzZTxUcj46OmVsZW1lbnRfZW5kKCkgeworICByZXR1cm4gR3JhcGhUcmFpdHM8UmVnaW9uVCAqPjo6bm9kZXNfZW5kKHN0YXRpY19jYXN0PFJlZ2lvblQgKj4odGhpcykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit0eXBlbmFtZSBSZWdpb25CYXNlPFRyPjo6Y29uc3RfZWxlbWVudF9pdGVyYXRvcgorUmVnaW9uQmFzZTxUcj46OmVsZW1lbnRfYmVnaW4oKSBjb25zdCB7CisgIHJldHVybiBHcmFwaFRyYWl0czxjb25zdCBSZWdpb25UICo+Ojpub2Rlc19iZWdpbigKKyAgICAgIHN0YXRpY19jYXN0PGNvbnN0IFJlZ2lvblQgKj4odGhpcykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit0eXBlbmFtZSBSZWdpb25CYXNlPFRyPjo6Y29uc3RfZWxlbWVudF9pdGVyYXRvcgorUmVnaW9uQmFzZTxUcj46OmVsZW1lbnRfZW5kKCkgY29uc3QgeworICByZXR1cm4gR3JhcGhUcmFpdHM8Y29uc3QgUmVnaW9uVCAqPjo6bm9kZXNfZW5kKAorICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgUmVnaW9uVCAqPih0aGlzKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3R5cGVuYW1lIFRyOjpSZWdpb25UICpSZWdpb25CYXNlPFRyPjo6Z2V0U3ViUmVnaW9uTm9kZShCbG9ja1QgKkJCKSBjb25zdCB7CisgIHVzaW5nIFJlZ2lvblQgPSB0eXBlbmFtZSBUcjo6UmVnaW9uVDsKKworICBSZWdpb25UICpSID0gUkktPmdldFJlZ2lvbkZvcihCQik7CisKKyAgaWYgKCFSIHx8IFIgPT0gdGhpcykKKyAgICByZXR1cm4gbnVsbHB0cjsKKworICAvLyBJZiB3ZSBwYXNzIHRoZSBCQiBvdXQgb2YgdGhpcyByZWdpb24sIHRoYXQgbWVhbnMgb3VyIGNvZGUgaXMgYnJva2VuLgorICBhc3NlcnQoY29udGFpbnMoUikgJiYgIkJCIG5vdCBpbiBjdXJyZW50IHJlZ2lvbiEiKTsKKworICB3aGlsZSAoY29udGFpbnMoUi0+Z2V0UGFyZW50KCkpICYmIFItPmdldFBhcmVudCgpICE9IHRoaXMpCisgICAgUiA9IFItPmdldFBhcmVudCgpOworCisgIGlmIChSLT5nZXRFbnRyeSgpICE9IEJCKQorICAgIHJldHVybiBudWxscHRyOworCisgIHJldHVybiBSOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit0eXBlbmFtZSBUcjo6UmVnaW9uTm9kZVQgKlJlZ2lvbkJhc2U8VHI+OjpnZXRCQk5vZGUoQmxvY2tUICpCQikgY29uc3QgeworICBhc3NlcnQoY29udGFpbnMoQkIpICYmICJDYW4gZ2V0IEJCIG5vZGUgb3V0IG9mIHRoaXMgcmVnaW9uISIpOworCisgIHR5cGVuYW1lIEJCTm9kZU1hcFQ6OmNvbnN0X2l0ZXJhdG9yIGF0ID0gQkJOb2RlTWFwLmZpbmQoQkIpOworCisgIGlmIChhdCA9PSBCQk5vZGVNYXAuZW5kKCkpIHsKKyAgICBhdXRvIERlY29uc3QgPSBjb25zdF9jYXN0PFJlZ2lvbkJhc2U8VHI+ICo+KHRoaXMpOworICAgIHR5cGVuYW1lIEJCTm9kZU1hcFQ6OnZhbHVlX3R5cGUgViA9IHsKKyAgICAgICAgQkIsCisgICAgICAgIGxsdm06Om1ha2VfdW5pcXVlPFJlZ2lvbk5vZGVUPihzdGF0aWNfY2FzdDxSZWdpb25UICo+KERlY29uc3QpLCBCQil9OworICAgIGF0ID0gQkJOb2RlTWFwLmluc2VydChzdGQ6Om1vdmUoVikpLmZpcnN0OworICB9CisgIHJldHVybiBhdC0+c2Vjb25kLmdldCgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit0eXBlbmFtZSBUcjo6UmVnaW9uTm9kZVQgKlJlZ2lvbkJhc2U8VHI+OjpnZXROb2RlKEJsb2NrVCAqQkIpIGNvbnN0IHsKKyAgYXNzZXJ0KGNvbnRhaW5zKEJCKSAmJiAiQ2FuIGdldCBCQiBub2RlIG91dCBvZiB0aGlzIHJlZ2lvbiEiKTsKKyAgaWYgKFJlZ2lvblQgKkNoaWxkID0gZ2V0U3ViUmVnaW9uTm9kZShCQikpCisgICAgcmV0dXJuIENoaWxkLT5nZXROb2RlKCk7CisKKyAgcmV0dXJuIGdldEJCTm9kZShCQik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3ZvaWQgUmVnaW9uQmFzZTxUcj46OnRyYW5zZmVyQ2hpbGRyZW5UbyhSZWdpb25UICpUbykgeworICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxSZWdpb25UPiAmUiA6ICp0aGlzKSB7CisgICAgUi0+cGFyZW50ID0gVG87CisgICAgVG8tPmNoaWxkcmVuLnB1c2hfYmFjayhzdGQ6Om1vdmUoUikpOworICB9CisgIGNoaWxkcmVuLmNsZWFyKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3ZvaWQgUmVnaW9uQmFzZTxUcj46OmFkZFN1YlJlZ2lvbihSZWdpb25UICpTdWJSZWdpb24sIGJvb2wgbW92ZUNoaWxkcmVuKSB7CisgIGFzc2VydCghU3ViUmVnaW9uLT5wYXJlbnQgJiYgIlN1YlJlZ2lvbiBhbHJlYWR5IGhhcyBhIHBhcmVudCEiKTsKKyAgYXNzZXJ0KGxsdm06OmZpbmRfaWYoKnRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgIFsmXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8UmVnaW9uVD4gJlIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUi5nZXQoKSA9PSBTdWJSZWdpb247CisgICAgICAgICAgICAgICAgICAgICAgIH0pID09IGNoaWxkcmVuLmVuZCgpICYmCisgICAgICAgICAiU3VicmVnaW9uIGFscmVhZHkgZXhpc3RzISIpOworCisgIFN1YlJlZ2lvbi0+cGFyZW50ID0gc3RhdGljX2Nhc3Q8UmVnaW9uVCAqPih0aGlzKTsKKyAgY2hpbGRyZW4ucHVzaF9iYWNrKHN0ZDo6dW5pcXVlX3B0cjxSZWdpb25UPihTdWJSZWdpb24pKTsKKworICBpZiAoIW1vdmVDaGlsZHJlbikKKyAgICByZXR1cm47CisKKyAgYXNzZXJ0KFN1YlJlZ2lvbi0+Y2hpbGRyZW4uZW1wdHkoKSAmJgorICAgICAgICAgIlN1YlJlZ2lvbnMgdGhhdCBjb250YWluIGNoaWxkcmVuIGFyZSBub3Qgc3VwcG9ydGVkIik7CisKKyAgZm9yIChSZWdpb25Ob2RlVCAqRWxlbWVudCA6IGVsZW1lbnRzKCkpIHsKKyAgICBpZiAoIUVsZW1lbnQtPmlzU3ViUmVnaW9uKCkpIHsKKyAgICAgIEJsb2NrVCAqQkIgPSBFbGVtZW50LT50ZW1wbGF0ZSBnZXROb2RlQXM8QmxvY2tUPigpOworCisgICAgICBpZiAoU3ViUmVnaW9uLT5jb250YWlucyhCQikpCisgICAgICAgIFJJLT5zZXRSZWdpb25Gb3IoQkIsIFN1YlJlZ2lvbik7CisgICAgfQorICB9CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFJlZ2lvblQ+PiBLZWVwOworICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxSZWdpb25UPiAmUiA6ICp0aGlzKSB7CisgICAgaWYgKFN1YlJlZ2lvbi0+Y29udGFpbnMoUi5nZXQoKSkgJiYgUi5nZXQoKSAhPSBTdWJSZWdpb24pIHsKKyAgICAgIFItPnBhcmVudCA9IFN1YlJlZ2lvbjsKKyAgICAgIFN1YlJlZ2lvbi0+Y2hpbGRyZW4ucHVzaF9iYWNrKHN0ZDo6bW92ZShSKSk7CisgICAgfSBlbHNlCisgICAgICBLZWVwLnB1c2hfYmFjayhzdGQ6Om1vdmUoUikpOworICB9CisKKyAgY2hpbGRyZW4uY2xlYXIoKTsKKyAgY2hpbGRyZW4uaW5zZXJ0KAorICAgICAgY2hpbGRyZW4uYmVnaW4oKSwKKyAgICAgIHN0ZDo6bW92ZV9pdGVyYXRvcjx0eXBlbmFtZSBSZWdpb25TZXQ6Oml0ZXJhdG9yPihLZWVwLmJlZ2luKCkpLAorICAgICAgc3RkOjptb3ZlX2l0ZXJhdG9yPHR5cGVuYW1lIFJlZ2lvblNldDo6aXRlcmF0b3I+KEtlZXAuZW5kKCkpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordHlwZW5hbWUgVHI6OlJlZ2lvblQgKlJlZ2lvbkJhc2U8VHI+OjpyZW1vdmVTdWJSZWdpb24oUmVnaW9uVCAqQ2hpbGQpIHsKKyAgYXNzZXJ0KENoaWxkLT5wYXJlbnQgPT0gdGhpcyAmJiAiQ2hpbGQgaXMgbm90IGEgY2hpbGQgb2YgdGhpcyByZWdpb24hIik7CisgIENoaWxkLT5wYXJlbnQgPSBudWxscHRyOworICB0eXBlbmFtZSBSZWdpb25TZXQ6Oml0ZXJhdG9yIEkgPQorICAgICAgbGx2bTo6ZmluZF9pZihjaGlsZHJlbiwgWyZdKGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxSZWdpb25UPiAmUikgeworICAgICAgICByZXR1cm4gUi5nZXQoKSA9PSBDaGlsZDsKKyAgICAgIH0pOworICBhc3NlcnQoSSAhPSBjaGlsZHJlbi5lbmQoKSAmJiAiUmVnaW9uIGRvZXMgbm90IGV4aXQuIFVuYWJsZSB0byByZW1vdmUuIik7CisgIGNoaWxkcmVuLmVyYXNlKGNoaWxkcmVuLmJlZ2luKCkgKyAoSSAtIGJlZ2luKCkpKTsKKyAgcmV0dXJuIENoaWxkOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit1bnNpZ25lZCBSZWdpb25CYXNlPFRyPjo6Z2V0RGVwdGgoKSBjb25zdCB7CisgIHVuc2lnbmVkIERlcHRoID0gMDsKKworICBmb3IgKFJlZ2lvblQgKlIgPSBnZXRQYXJlbnQoKTsgUiAhPSBudWxscHRyOyBSID0gUi0+Z2V0UGFyZW50KCkpCisgICAgKytEZXB0aDsKKworICByZXR1cm4gRGVwdGg7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3R5cGVuYW1lIFRyOjpSZWdpb25UICpSZWdpb25CYXNlPFRyPjo6Z2V0RXhwYW5kZWRSZWdpb24oKSBjb25zdCB7CisgIHVuc2lnbmVkIE51bVN1Y2Nlc3NvcnMgPSBUcjo6Z2V0TnVtU3VjY2Vzc29ycyhleGl0KTsKKworICBpZiAoTnVtU3VjY2Vzc29ycyA9PSAwKQorICAgIHJldHVybiBudWxscHRyOworCisgIFJlZ2lvblQgKlIgPSBSSS0+Z2V0UmVnaW9uRm9yKGV4aXQpOworCisgIGlmIChSLT5nZXRFbnRyeSgpICE9IGV4aXQpIHsKKyAgICBmb3IgKEJsb2NrVCAqUHJlZCA6IG1ha2VfcmFuZ2UoSW52QmxvY2tUcmFpdHM6OmNoaWxkX2JlZ2luKGdldEV4aXQoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludkJsb2NrVHJhaXRzOjpjaGlsZF9lbmQoZ2V0RXhpdCgpKSkpCisgICAgICBpZiAoIWNvbnRhaW5zKFByZWQpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBpZiAoVHI6OmdldE51bVN1Y2Nlc3NvcnMoZXhpdCkgPT0gMSkKKyAgICAgIHJldHVybiBuZXcgUmVnaW9uVChnZXRFbnRyeSgpLCAqQmxvY2tUcmFpdHM6OmNoaWxkX2JlZ2luKGV4aXQpLCBSSSwgRFQpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgd2hpbGUgKFItPmdldFBhcmVudCgpICYmIFItPmdldFBhcmVudCgpLT5nZXRFbnRyeSgpID09IGV4aXQpCisgICAgUiA9IFItPmdldFBhcmVudCgpOworCisgIGZvciAoQmxvY2tUICpQcmVkIDogbWFrZV9yYW5nZShJbnZCbG9ja1RyYWl0czo6Y2hpbGRfYmVnaW4oZ2V0RXhpdCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludkJsb2NrVHJhaXRzOjpjaGlsZF9lbmQoZ2V0RXhpdCgpKSkpIHsKKyAgICBpZiAoIShjb250YWlucyhQcmVkKSB8fCBSLT5jb250YWlucyhQcmVkKSkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHJldHVybiBuZXcgUmVnaW9uVChnZXRFbnRyeSgpLCBSLT5nZXRFeGl0KCksIFJJLCBEVCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3ZvaWQgUmVnaW9uQmFzZTxUcj46OnByaW50KHJhd19vc3RyZWFtICZPUywgYm9vbCBwcmludF90cmVlLCB1bnNpZ25lZCBsZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50U3R5bGUgU3R5bGUpIGNvbnN0IHsKKyAgaWYgKHByaW50X3RyZWUpCisgICAgT1MuaW5kZW50KGxldmVsICogMikgPDwgJ1snIDw8IGxldmVsIDw8ICJdICIgPDwgZ2V0TmFtZVN0cigpOworICBlbHNlCisgICAgT1MuaW5kZW50KGxldmVsICogMikgPDwgZ2V0TmFtZVN0cigpOworCisgIE9TIDw8ICdcbic7CisKKyAgaWYgKFN0eWxlICE9IFByaW50Tm9uZSkgeworICAgIE9TLmluZGVudChsZXZlbCAqIDIpIDw8ICJ7XG4iOworICAgIE9TLmluZGVudChsZXZlbCAqIDIgKyAyKTsKKworICAgIGlmIChTdHlsZSA9PSBQcmludEJCKSB7CisgICAgICBmb3IgKGNvbnN0IGF1dG8gKkJCIDogYmxvY2tzKCkpCisgICAgICAgIE9TIDw8IEJCLT5nZXROYW1lKCkgPDwgIiwgIjsgLy8gVE9ETzogcmVtb3ZlIHRoZSBsYXN0ICIsIgorICAgIH0gZWxzZSBpZiAoU3R5bGUgPT0gUHJpbnRSTikgeworICAgICAgZm9yIChjb25zdCBSZWdpb25Ob2RlVCAqRWxlbWVudCA6IGVsZW1lbnRzKCkpIHsKKyAgICAgICAgT1MgPDwgKkVsZW1lbnQgPDwgIiwgIjsgLy8gVE9ETzogcmVtb3ZlIHRoZSBsYXN0ICIsCisgICAgICB9CisgICAgfQorCisgICAgT1MgPDwgJ1xuJzsKKyAgfQorCisgIGlmIChwcmludF90cmVlKSB7CisgICAgZm9yIChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8UmVnaW9uVD4gJlIgOiAqdGhpcykKKyAgICAgIFItPnByaW50KE9TLCBwcmludF90cmVlLCBsZXZlbCArIDEsIFN0eWxlKTsKKyAgfQorCisgIGlmIChTdHlsZSAhPSBQcmludE5vbmUpCisgICAgT1MuaW5kZW50KGxldmVsICogMikgPDwgIn0gXG4iOworfQorCisjaWYgIWRlZmluZWQoTkRFQlVHKSB8fCBkZWZpbmVkKExMVk1fRU5BQkxFX0RVTVApCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit2b2lkIFJlZ2lvbkJhc2U8VHI+OjpkdW1wKCkgY29uc3QgeworICBwcmludChkYmdzKCksIHRydWUsIGdldERlcHRoKCksIFJlZ2lvbkluZm9CYXNlPFRyPjo6cHJpbnRTdHlsZSk7Cit9CisjZW5kaWYKKwordGVtcGxhdGUgPGNsYXNzIFRyPgordm9pZCBSZWdpb25CYXNlPFRyPjo6Y2xlYXJOb2RlQ2FjaGUoKSB7CisgIEJCTm9kZU1hcC5jbGVhcigpOworICBmb3IgKHN0ZDo6dW5pcXVlX3B0cjxSZWdpb25UPiAmUiA6ICp0aGlzKQorICAgIFItPmNsZWFyTm9kZUNhY2hlKCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBSZWdpb25JbmZvQmFzZSBpbXBsZW1lbnRhdGlvbgorLy8KKwordGVtcGxhdGUgPGNsYXNzIFRyPgorUmVnaW9uSW5mb0Jhc2U8VHI+OjpSZWdpb25JbmZvQmFzZSgpID0gZGVmYXVsdDsKKwordGVtcGxhdGUgPGNsYXNzIFRyPgorUmVnaW9uSW5mb0Jhc2U8VHI+Ojp+UmVnaW9uSW5mb0Jhc2UoKSB7CisgIHJlbGVhc2VNZW1vcnkoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordm9pZCBSZWdpb25JbmZvQmFzZTxUcj46OnZlcmlmeUJCTWFwKGNvbnN0IFJlZ2lvblQgKlIpIGNvbnN0IHsKKyAgYXNzZXJ0KFIgJiYgIlJlIG11c3QgYmUgbm9uLW51bGwiKTsKKyAgZm9yIChjb25zdCB0eXBlbmFtZSBUcjo6UmVnaW9uTm9kZVQgKkVsZW1lbnQgOiBSLT5lbGVtZW50cygpKSB7CisgICAgaWYgKEVsZW1lbnQtPmlzU3ViUmVnaW9uKCkpIHsKKyAgICAgIGNvbnN0IFJlZ2lvblQgKlNSID0gRWxlbWVudC0+dGVtcGxhdGUgZ2V0Tm9kZUFzPFJlZ2lvblQ+KCk7CisgICAgICB2ZXJpZnlCQk1hcChTUik7CisgICAgfSBlbHNlIHsKKyAgICAgIEJsb2NrVCAqQkIgPSBFbGVtZW50LT50ZW1wbGF0ZSBnZXROb2RlQXM8QmxvY2tUPigpOworICAgICAgaWYgKGdldFJlZ2lvbkZvcihCQikgIT0gUikKKyAgICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJCQiBtYXAgZG9lcyBub3QgbWF0Y2ggcmVnaW9uIG5lc3RpbmciKTsKKyAgICB9CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgorYm9vbCBSZWdpb25JbmZvQmFzZTxUcj46OmlzQ29tbW9uRG9tRnJvbnRpZXIoQmxvY2tUICpCQiwgQmxvY2tUICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsb2NrVCAqZXhpdCkgY29uc3QgeworICBmb3IgKEJsb2NrVCAqUCA6IG1ha2VfcmFuZ2UoSW52QmxvY2tUcmFpdHM6OmNoaWxkX2JlZ2luKEJCKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludkJsb2NrVHJhaXRzOjpjaGlsZF9lbmQoQkIpKSkgeworICAgIGlmIChEVC0+ZG9taW5hdGVzKGVudHJ5LCBQKSAmJiAhRFQtPmRvbWluYXRlcyhleGl0LCBQKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Citib29sIFJlZ2lvbkluZm9CYXNlPFRyPjo6aXNSZWdpb24oQmxvY2tUICplbnRyeSwgQmxvY2tUICpleGl0KSBjb25zdCB7CisgIGFzc2VydChlbnRyeSAmJiBleGl0ICYmICJlbnRyeSBhbmQgZXhpdCBtdXN0IG5vdCBiZSBudWxsISIpOworCisgIHVzaW5nIERTVCA9IHR5cGVuYW1lIERvbUZyb250aWVyVDo6RG9tU2V0VHlwZTsKKworICBEU1QgKmVudHJ5U3VjY3MgPSAmREYtPmZpbmQoZW50cnkpLT5zZWNvbmQ7CisKKyAgLy8gRXhpdCBpcyB0aGUgaGVhZGVyIG9mIGEgbG9vcCB0aGF0IGNvbnRhaW5zIHRoZSBlbnRyeS4gSW4gdGhpcyBjYXNlLAorICAvLyB0aGUgZG9taW5hbmNlIGZyb250aWVyIG11c3Qgb25seSBjb250YWluIHRoZSBleGl0LgorICBpZiAoIURULT5kb21pbmF0ZXMoZW50cnksIGV4aXQpKSB7CisgICAgZm9yICh0eXBlbmFtZSBEU1Q6Oml0ZXJhdG9yIFNJID0gZW50cnlTdWNjcy0+YmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0UgPSBlbnRyeVN1Y2NzLT5lbmQoKTsKKyAgICAgICAgIFNJICE9IFNFOyArK1NJKSB7CisgICAgICBpZiAoKlNJICE9IGV4aXQgJiYgKlNJICE9IGVudHJ5KQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBEU1QgKmV4aXRTdWNjcyA9ICZERi0+ZmluZChleGl0KS0+c2Vjb25kOworCisgIC8vIERvIG5vdCBhbGxvdyBlZGdlcyBsZWF2aW5nIHRoZSByZWdpb24uCisgIGZvciAoQmxvY2tUICpTdWNjIDogKmVudHJ5U3VjY3MpIHsKKyAgICBpZiAoU3VjYyA9PSBleGl0IHx8IFN1Y2MgPT0gZW50cnkpCisgICAgICBjb250aW51ZTsKKyAgICBpZiAoZXhpdFN1Y2NzLT5maW5kKFN1Y2MpID09IGV4aXRTdWNjcy0+ZW5kKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKCFpc0NvbW1vbkRvbUZyb250aWVyKFN1Y2MsIGVudHJ5LCBleGl0KSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIERvIG5vdCBhbGxvdyBlZGdlcyBwb2ludGluZyBpbnRvIHRoZSByZWdpb24uCisgIGZvciAoQmxvY2tUICpTdWNjIDogKmV4aXRTdWNjcykgeworICAgIGlmIChEVC0+cHJvcGVybHlEb21pbmF0ZXMoZW50cnksIFN1Y2MpICYmIFN1Y2MgIT0gZXhpdCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit2b2lkIFJlZ2lvbkluZm9CYXNlPFRyPjo6aW5zZXJ0U2hvcnRDdXQoQmxvY2tUICplbnRyeSwgQmxvY2tUICpleGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCdG9CQk1hcCAqU2hvcnRDdXQpIGNvbnN0IHsKKyAgYXNzZXJ0KGVudHJ5ICYmIGV4aXQgJiYgImVudHJ5IGFuZCBleGl0IG11c3Qgbm90IGJlIG51bGwhIik7CisKKyAgdHlwZW5hbWUgQkJ0b0JCTWFwOjppdGVyYXRvciBlID0gU2hvcnRDdXQtPmZpbmQoZXhpdCk7CisKKyAgaWYgKGUgPT0gU2hvcnRDdXQtPmVuZCgpKQorICAgIC8vIE5vIGZ1cnRoZXIgcmVnaW9uIGF0IGV4aXQgYXZhaWxhYmxlLgorICAgICgqU2hvcnRDdXQpW2VudHJ5XSA9IGV4aXQ7CisgIGVsc2UgeworICAgIC8vIFdlIGZvdW5kIGEgcmVnaW9uIGUgdGhhdCBzdGFydHMgYXQgZXhpdC4gVGhlcmVmb3JlIChlbnRyeSwgZS0+c2Vjb25kKQorICAgIC8vIGlzIGFsc28gYSByZWdpb24sIHRoYXQgaXMgbGFyZ2VyIHRoYW4gKGVudHJ5LCBleGl0KS4gSW5zZXJ0IHRoZQorICAgIC8vIGxhcmdlciBvbmUuCisgICAgQmxvY2tUICpCQiA9IGUtPnNlY29uZDsKKyAgICAoKlNob3J0Q3V0KVtlbnRyeV0gPSBCQjsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit0eXBlbmFtZSBUcjo6RG9tVHJlZU5vZGVUICoKK1JlZ2lvbkluZm9CYXNlPFRyPjo6Z2V0TmV4dFBvc3REb20oRG9tVHJlZU5vZGVUICpOLCBCQnRvQkJNYXAgKlNob3J0Q3V0KSBjb25zdCB7CisgIHR5cGVuYW1lIEJCdG9CQk1hcDo6aXRlcmF0b3IgZSA9IFNob3J0Q3V0LT5maW5kKE4tPmdldEJsb2NrKCkpOworCisgIGlmIChlID09IFNob3J0Q3V0LT5lbmQoKSkKKyAgICByZXR1cm4gTi0+Z2V0SURvbSgpOworCisgIHJldHVybiBQRFQtPmdldE5vZGUoZS0+c2Vjb25kKS0+Z2V0SURvbSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Citib29sIFJlZ2lvbkluZm9CYXNlPFRyPjo6aXNUcml2aWFsUmVnaW9uKEJsb2NrVCAqZW50cnksIEJsb2NrVCAqZXhpdCkgY29uc3QgeworICBhc3NlcnQoZW50cnkgJiYgZXhpdCAmJiAiZW50cnkgYW5kIGV4aXQgbXVzdCBub3QgYmUgbnVsbCEiKTsKKworICB1bnNpZ25lZCBudW1fc3VjY2Vzc29ycyA9CisgICAgICBCbG9ja1RyYWl0czo6Y2hpbGRfZW5kKGVudHJ5KSAtIEJsb2NrVHJhaXRzOjpjaGlsZF9iZWdpbihlbnRyeSk7CisKKyAgaWYgKG51bV9zdWNjZXNzb3JzIDw9IDEgJiYgZXhpdCA9PSAqKEJsb2NrVHJhaXRzOjpjaGlsZF9iZWdpbihlbnRyeSkpKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordHlwZW5hbWUgVHI6OlJlZ2lvblQgKlJlZ2lvbkluZm9CYXNlPFRyPjo6Y3JlYXRlUmVnaW9uKEJsb2NrVCAqZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tUICpleGl0KSB7CisgIGFzc2VydChlbnRyeSAmJiBleGl0ICYmICJlbnRyeSBhbmQgZXhpdCBtdXN0IG5vdCBiZSBudWxsISIpOworCisgIGlmIChpc1RyaXZpYWxSZWdpb24oZW50cnksIGV4aXQpKQorICAgIHJldHVybiBudWxscHRyOworCisgIFJlZ2lvblQgKnJlZ2lvbiA9CisgICAgICBuZXcgUmVnaW9uVChlbnRyeSwgZXhpdCwgc3RhdGljX2Nhc3Q8UmVnaW9uSW5mb1QgKj4odGhpcyksIERUKTsKKyAgQkJ0b1JlZ2lvbi5pbnNlcnQoe2VudHJ5LCByZWdpb259KTsKKworI2lmZGVmIEVYUEVOU0lWRV9DSEVDS1MKKyAgcmVnaW9uLT52ZXJpZnlSZWdpb24oKTsKKyNlbHNlCisgIERFQlVHKHJlZ2lvbi0+dmVyaWZ5UmVnaW9uKCkpOworI2VuZGlmCisKKyAgdXBkYXRlU3RhdGlzdGljcyhyZWdpb24pOworICByZXR1cm4gcmVnaW9uOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit2b2lkIFJlZ2lvbkluZm9CYXNlPFRyPjo6ZmluZFJlZ2lvbnNXaXRoRW50cnkoQmxvY2tUICplbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCQnRvQkJNYXAgKlNob3J0Q3V0KSB7CisgIGFzc2VydChlbnRyeSk7CisKKyAgRG9tVHJlZU5vZGVUICpOID0gUERULT5nZXROb2RlKGVudHJ5KTsKKyAgaWYgKCFOKQorICAgIHJldHVybjsKKworICBSZWdpb25UICpsYXN0UmVnaW9uID0gbnVsbHB0cjsKKyAgQmxvY2tUICpsYXN0RXhpdCA9IGVudHJ5OworCisgIC8vIEFzIG9ubHkgYSBCYXNpY0Jsb2NrIHRoYXQgcG9zdGRvbWluYXRlcyBlbnRyeSBjYW4gZmluaXNoIGEgcmVnaW9uLCB3YWxrIHRoZQorICAvLyBwb3N0IGRvbWluYW5jZSB0cmVlIHVwd2FyZHMuCisgIHdoaWxlICgoTiA9IGdldE5leHRQb3N0RG9tKE4sIFNob3J0Q3V0KSkpIHsKKyAgICBCbG9ja1QgKmV4aXQgPSBOLT5nZXRCbG9jaygpOworCisgICAgaWYgKCFleGl0KQorICAgICAgYnJlYWs7CisKKyAgICBpZiAoaXNSZWdpb24oZW50cnksIGV4aXQpKSB7CisgICAgICBSZWdpb25UICpuZXdSZWdpb24gPSBjcmVhdGVSZWdpb24oZW50cnksIGV4aXQpOworCisgICAgICBpZiAobGFzdFJlZ2lvbikKKyAgICAgICAgbmV3UmVnaW9uLT5hZGRTdWJSZWdpb24obGFzdFJlZ2lvbik7CisKKyAgICAgIGxhc3RSZWdpb24gPSBuZXdSZWdpb247CisgICAgICBsYXN0RXhpdCA9IGV4aXQ7CisgICAgfQorCisgICAgLy8gVGhpcyBjYW4gbmV2ZXIgYmUgYSByZWdpb24sIHNvIHN0b3AgdGhlIHNlYXJjaC4KKyAgICBpZiAoIURULT5kb21pbmF0ZXMoZW50cnksIGV4aXQpKQorICAgICAgYnJlYWs7CisgIH0KKworICAvLyBUcmllZCB0byBjcmVhdGUgcmVnaW9ucyBmcm9tIGVudHJ5IHRvIGxhc3RFeGl0LiAgTmV4dCB0aW1lIHRha2UgYQorICAvLyBzaG9ydGN1dCBmcm9tIGVudHJ5IHRvIGxhc3RFeGl0LgorICBpZiAobGFzdEV4aXQgIT0gZW50cnkpCisgICAgaW5zZXJ0U2hvcnRDdXQoZW50cnksIGxhc3RFeGl0LCBTaG9ydEN1dCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3ZvaWQgUmVnaW9uSW5mb0Jhc2U8VHI+OjpzY2FuRm9yUmVnaW9ucyhGdW5jVCAmRiwgQkJ0b0JCTWFwICpTaG9ydEN1dCkgeworICB1c2luZyBGdW5jUHRyVCA9IHR5cGVuYW1lIHN0ZDo6YWRkX3BvaW50ZXI8RnVuY1Q+Ojp0eXBlOworCisgIEJsb2NrVCAqZW50cnkgPSBHcmFwaFRyYWl0czxGdW5jUHRyVD46OmdldEVudHJ5Tm9kZSgmRik7CisgIERvbVRyZWVOb2RlVCAqTiA9IERULT5nZXROb2RlKGVudHJ5KTsKKworICAvLyBJdGVyYXRlIG92ZXIgdGhlIGRvbWluYW5jZSB0cmVlIGluIHBvc3Qgb3JkZXIgdG8gc3RhcnQgd2l0aCB0aGUgc21hbGwKKyAgLy8gcmVnaW9ucyBmcm9tIHRoZSBib3R0b20gb2YgdGhlIGRvbWluYW5jZSB0cmVlLiAgSWYgdGhlIHNtYWxsIHJlZ2lvbnMgYXJlCisgIC8vIGRldGVjdGVkIGZpcnN0LCBkZXRlY3Rpb24gb2YgYmlnZ2VyIHJlZ2lvbnMgaXMgZmFzdGVyLCBhcyB3ZSBjYW4ganVtcAorICAvLyBvdmVyIHRoZSBzbWFsbCByZWdpb25zLgorICBmb3IgKGF1dG8gRG9tTm9kZSA6IHBvc3Rfb3JkZXIoTikpCisgICAgZmluZFJlZ2lvbnNXaXRoRW50cnkoRG9tTm9kZS0+Z2V0QmxvY2soKSwgU2hvcnRDdXQpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit0eXBlbmFtZSBUcjo6UmVnaW9uVCAqUmVnaW9uSW5mb0Jhc2U8VHI+OjpnZXRUb3BNb3N0UGFyZW50KFJlZ2lvblQgKnJlZ2lvbikgeworICB3aGlsZSAocmVnaW9uLT5nZXRQYXJlbnQoKSkKKyAgICByZWdpb24gPSByZWdpb24tPmdldFBhcmVudCgpOworCisgIHJldHVybiByZWdpb247Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3ZvaWQgUmVnaW9uSW5mb0Jhc2U8VHI+OjpidWlsZFJlZ2lvbnNUcmVlKERvbVRyZWVOb2RlVCAqTiwgUmVnaW9uVCAqcmVnaW9uKSB7CisgIEJsb2NrVCAqQkIgPSBOLT5nZXRCbG9jaygpOworCisgIC8vIFBhc3NlZCByZWdpb24gZXhpdAorICB3aGlsZSAoQkIgPT0gcmVnaW9uLT5nZXRFeGl0KCkpCisgICAgcmVnaW9uID0gcmVnaW9uLT5nZXRQYXJlbnQoKTsKKworICB0eXBlbmFtZSBCQnRvUmVnaW9uTWFwOjppdGVyYXRvciBpdCA9IEJCdG9SZWdpb24uZmluZChCQik7CisKKyAgLy8gVGhpcyBiYXNpYyBibG9jayBpcyBhIHN0YXJ0IGJsb2NrIG9mIGEgcmVnaW9uLiBJdCBpcyBhbHJlYWR5IGluIHRoZQorICAvLyBCQnRvUmVnaW9uIHJlbGF0aW9uLiBPbmx5IHRoZSBjaGlsZCBiYXNpYyBibG9ja3MgaGF2ZSB0byBiZSB1cGRhdGVkLgorICBpZiAoaXQgIT0gQkJ0b1JlZ2lvbi5lbmQoKSkgeworICAgIFJlZ2lvblQgKm5ld1JlZ2lvbiA9IGl0LT5zZWNvbmQ7CisgICAgcmVnaW9uLT5hZGRTdWJSZWdpb24oZ2V0VG9wTW9zdFBhcmVudChuZXdSZWdpb24pKTsKKyAgICByZWdpb24gPSBuZXdSZWdpb247CisgIH0gZWxzZSB7CisgICAgQkJ0b1JlZ2lvbltCQl0gPSByZWdpb247CisgIH0KKworICBmb3IgKERvbVRyZWVOb2RlQmFzZTxCbG9ja1Q+ICpDIDogKk4pIHsKKyAgICBidWlsZFJlZ2lvbnNUcmVlKEMsIHJlZ2lvbik7CisgIH0KK30KKworI2lmZGVmIEVYUEVOU0lWRV9DSEVDS1MKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK2Jvb2wgUmVnaW9uSW5mb0Jhc2U8VHI+OjpWZXJpZnlSZWdpb25JbmZvID0gdHJ1ZTsKKyNlbHNlCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Citib29sIFJlZ2lvbkluZm9CYXNlPFRyPjo6VmVyaWZ5UmVnaW9uSW5mbyA9IGZhbHNlOworI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3R5cGVuYW1lIFRyOjpSZWdpb25UOjpQcmludFN0eWxlIFJlZ2lvbkluZm9CYXNlPFRyPjo6cHJpbnRTdHlsZSA9CisgICAgUmVnaW9uQmFzZTxUcj46OlByaW50Tm9uZTsKKwordGVtcGxhdGUgPGNsYXNzIFRyPgordm9pZCBSZWdpb25JbmZvQmFzZTxUcj46OnByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICBPUyA8PCAiUmVnaW9uIHRyZWU6XG4iOworICBUb3BMZXZlbFJlZ2lvbi0+cHJpbnQoT1MsIHRydWUsIDAsIHByaW50U3R5bGUpOworICBPUyA8PCAiRW5kIHJlZ2lvbiB0cmVlXG4iOworfQorCisjaWYgIWRlZmluZWQoTkRFQlVHKSB8fCBkZWZpbmVkKExMVk1fRU5BQkxFX0RVTVApCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit2b2lkIFJlZ2lvbkluZm9CYXNlPFRyPjo6ZHVtcCgpIGNvbnN0IHsgcHJpbnQoZGJncygpKTsgfQorI2VuZGlmCisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3ZvaWQgUmVnaW9uSW5mb0Jhc2U8VHI+OjpyZWxlYXNlTWVtb3J5KCkgeworICBCQnRvUmVnaW9uLmNsZWFyKCk7CisgIGlmIChUb3BMZXZlbFJlZ2lvbikKKyAgICBkZWxldGUgVG9wTGV2ZWxSZWdpb247CisgIFRvcExldmVsUmVnaW9uID0gbnVsbHB0cjsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordm9pZCBSZWdpb25JbmZvQmFzZTxUcj46OnZlcmlmeUFuYWx5c2lzKCkgY29uc3QgeworICAvLyBEbyBvbmx5IHZlcmlmeSByZWdpb25zIGlmIGV4cGxpY2l0ZWx5IGFjdGl2YXRlZCB1c2luZyBFWFBFTlNJVkVfQ0hFQ0tTIG9yCisgIC8vIC12ZXJpZnktcmVnaW9uLWluZm8KKyAgaWYgKCFSZWdpb25JbmZvQmFzZTxUcj46OlZlcmlmeVJlZ2lvbkluZm8pCisgICAgcmV0dXJuOworCisgIFRvcExldmVsUmVnaW9uLT52ZXJpZnlSZWdpb25OZXN0KCk7CisKKyAgdmVyaWZ5QkJNYXAoVG9wTGV2ZWxSZWdpb24pOworfQorCisvLyBSZWdpb24gcGFzcyBtYW5hZ2VyIHN1cHBvcnQuCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit0eXBlbmFtZSBUcjo6UmVnaW9uVCAqUmVnaW9uSW5mb0Jhc2U8VHI+OjpnZXRSZWdpb25Gb3IoQmxvY2tUICpCQikgY29uc3QgeworICB0eXBlbmFtZSBCQnRvUmVnaW9uTWFwOjpjb25zdF9pdGVyYXRvciBJID0gQkJ0b1JlZ2lvbi5maW5kKEJCKTsKKyAgcmV0dXJuIEkgIT0gQkJ0b1JlZ2lvbi5lbmQoKSA/IEktPnNlY29uZCA6IG51bGxwdHI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3ZvaWQgUmVnaW9uSW5mb0Jhc2U8VHI+OjpzZXRSZWdpb25Gb3IoQmxvY2tUICpCQiwgUmVnaW9uVCAqUikgeworICBCQnRvUmVnaW9uW0JCXSA9IFI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3R5cGVuYW1lIFRyOjpSZWdpb25UICpSZWdpb25JbmZvQmFzZTxUcj46Om9wZXJhdG9yW10oQmxvY2tUICpCQikgY29uc3QgeworICByZXR1cm4gZ2V0UmVnaW9uRm9yKEJCKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordHlwZW5hbWUgUmVnaW9uSW5mb0Jhc2U8VHI+OjpCbG9ja1QgKgorUmVnaW9uSW5mb0Jhc2U8VHI+OjpnZXRNYXhSZWdpb25FeGl0KEJsb2NrVCAqQkIpIGNvbnN0IHsKKyAgQmxvY2tUICpFeGl0ID0gbnVsbHB0cjsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIC8vIEdldCBsYXJnZXN0IHJlZ2lvbiB0aGF0IHN0YXJ0cyBhdCBCQi4KKyAgICBSZWdpb25UICpSID0gZ2V0UmVnaW9uRm9yKEJCKTsKKyAgICB3aGlsZSAoUiAmJiBSLT5nZXRQYXJlbnQoKSAmJiBSLT5nZXRQYXJlbnQoKS0+Z2V0RW50cnkoKSA9PSBCQikKKyAgICAgIFIgPSBSLT5nZXRQYXJlbnQoKTsKKworICAgIC8vIEdldCB0aGUgc2luZ2xlIGV4aXQgb2YgQkIuCisgICAgaWYgKFIgJiYgUi0+Z2V0RW50cnkoKSA9PSBCQikKKyAgICAgIEV4aXQgPSBSLT5nZXRFeGl0KCk7CisgICAgZWxzZSBpZiAoKytCbG9ja1RyYWl0czo6Y2hpbGRfYmVnaW4oQkIpID09IEJsb2NrVHJhaXRzOjpjaGlsZF9lbmQoQkIpKQorICAgICAgRXhpdCA9ICpCbG9ja1RyYWl0czo6Y2hpbGRfYmVnaW4oQkIpOworICAgIGVsc2UgLy8gTm8gc2luZ2xlIGV4aXQgZXhpc3RzLgorICAgICAgcmV0dXJuIEV4aXQ7CisKKyAgICAvLyBHZXQgbGFyZ2VzdCByZWdpb24gdGhhdCBzdGFydHMgYXQgRXhpdC4KKyAgICBSZWdpb25UICpFeGl0UiA9IGdldFJlZ2lvbkZvcihFeGl0KTsKKyAgICB3aGlsZSAoRXhpdFIgJiYgRXhpdFItPmdldFBhcmVudCgpICYmCisgICAgICAgICAgIEV4aXRSLT5nZXRQYXJlbnQoKS0+Z2V0RW50cnkoKSA9PSBFeGl0KQorICAgICAgRXhpdFIgPSBFeGl0Ui0+Z2V0UGFyZW50KCk7CisKKyAgICBmb3IgKEJsb2NrVCAqUHJlZCA6IG1ha2VfcmFuZ2UoSW52QmxvY2tUcmFpdHM6OmNoaWxkX2JlZ2luKEV4aXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZCbG9ja1RyYWl0czo6Y2hpbGRfZW5kKEV4aXQpKSkgeworICAgICAgaWYgKCFSLT5jb250YWlucyhQcmVkKSAmJiAhRXhpdFItPmNvbnRhaW5zKFByZWQpKQorICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICAvLyBUaGlzIHN0b3BzIGluZmluaXRlIGN5Y2xlcy4KKyAgICBpZiAoRFQtPmRvbWluYXRlcyhFeGl0LCBCQikpCisgICAgICBicmVhazsKKworICAgIEJCID0gRXhpdDsKKyAgfQorCisgIHJldHVybiBFeGl0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit0eXBlbmFtZSBUcjo6UmVnaW9uVCAqUmVnaW9uSW5mb0Jhc2U8VHI+OjpnZXRDb21tb25SZWdpb24oUmVnaW9uVCAqQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpb25UICpCKSBjb25zdCB7CisgIGFzc2VydChBICYmIEIgJiYgIk9uZSBvZiB0aGUgUmVnaW9ucyBpcyBOVUxMIik7CisKKyAgaWYgKEEtPmNvbnRhaW5zKEIpKQorICAgIHJldHVybiBBOworCisgIHdoaWxlICghQi0+Y29udGFpbnMoQSkpCisgICAgQiA9IEItPmdldFBhcmVudCgpOworCisgIHJldHVybiBCOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgVHI+Cit0eXBlbmFtZSBUcjo6UmVnaW9uVCAqCitSZWdpb25JbmZvQmFzZTxUcj46OmdldENvbW1vblJlZ2lvbihTbWFsbFZlY3RvckltcGw8UmVnaW9uVCAqPiAmUmVnaW9ucykgY29uc3QgeworICBSZWdpb25UICpyZXQgPSBSZWdpb25zLmJhY2soKTsKKyAgUmVnaW9ucy5wb3BfYmFjaygpOworCisgIGZvciAoUmVnaW9uVCAqUiA6IFJlZ2lvbnMpCisgICAgcmV0ID0gZ2V0Q29tbW9uUmVnaW9uKHJldCwgUik7CisKKyAgcmV0dXJuIHJldDsKK30KKwordGVtcGxhdGUgPGNsYXNzIFRyPgordHlwZW5hbWUgVHI6OlJlZ2lvblQgKgorUmVnaW9uSW5mb0Jhc2U8VHI+OjpnZXRDb21tb25SZWdpb24oU21hbGxWZWN0b3JJbXBsPEJsb2NrVCAqPiAmQkJzKSBjb25zdCB7CisgIFJlZ2lvblQgKnJldCA9IGdldFJlZ2lvbkZvcihCQnMuYmFjaygpKTsKKyAgQkJzLnBvcF9iYWNrKCk7CisKKyAgZm9yIChCbG9ja1QgKkJCIDogQkJzKQorICAgIHJldCA9IGdldENvbW1vblJlZ2lvbihyZXQsIGdldFJlZ2lvbkZvcihCQikpOworCisgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBUcj4KK3ZvaWQgUmVnaW9uSW5mb0Jhc2U8VHI+OjpjYWxjdWxhdGUoRnVuY1QgJkYpIHsKKyAgdXNpbmcgRnVuY1B0clQgPSB0eXBlbmFtZSBzdGQ6OmFkZF9wb2ludGVyPEZ1bmNUPjo6dHlwZTsKKworICAvLyBTaG9ydEN1dCBhIGZ1bmN0aW9uIHdoZXJlIGZvciBldmVyeSBCQiB0aGUgZXhpdCBvZiB0aGUgbGFyZ2VzdCByZWdpb24KKyAgLy8gc3RhcnRpbmcgd2l0aCBCQiBpcyBzdG9yZWQuIFRoZXNlIHJlZ2lvbnMgY2FuIGJlIHRocmVhdGVkIGFzIHNpbmdsZSBCQlMuCisgIC8vIFRoaXMgaW1wcm92ZXMgcGVyZm9ybWFuY2Ugb24gbGluZWFyIENGR3MuCisgIEJCdG9CQk1hcCBTaG9ydEN1dDsKKworICBzY2FuRm9yUmVnaW9ucyhGLCAmU2hvcnRDdXQpOworICBCbG9ja1QgKkJCID0gR3JhcGhUcmFpdHM8RnVuY1B0clQ+OjpnZXRFbnRyeU5vZGUoJkYpOworICBidWlsZFJlZ2lvbnNUcmVlKERULT5nZXROb2RlKEJCKSwgVG9wTGV2ZWxSZWdpb24pOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjdW5kZWYgREVCVUdfVFlQRQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19SRUdJT05JTkZPSU1QTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1JlZ2lvbkl0ZXJhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1JlZ2lvbkl0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY4MjNjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvUmVnaW9uSXRlcmF0b3IuaApAQCAtMCwwICsxLDM2MCBAQAorLy89PT0tIFJlZ2lvbkl0ZXJhdG9yLmggLSBJdGVyYXRvcnMgdG8gaXRlcmF0YXRlIG92ZXIgUmVnaW9ucyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBpdGVyYXRvcnMgdG8gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cyBvZiBhIFJlZ2lvbi4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19SRUdJT05JVEVSQVRPUl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfUkVHSU9OSVRFUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVwdGhGaXJzdEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvUmVnaW9uSW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ0ZHLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCYXNpY0Jsb2NrOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEBicmllZiBIaWVyYXJjaGljYWwgUmVnaW9uTm9kZSBzdWNjZXNzb3IgaXRlcmF0b3IuCisvLy8KKy8vLyBUaGlzIGl0ZXJhdG9yIGl0ZXJhdGVzIG92ZXIgYWxsIHN1Y2Nlc3NvcnMgb2YgYSBSZWdpb25Ob2RlLgorLy8vCisvLy8gRm9yIGEgQmFzaWNCbG9jayBSZWdpb25Ob2RlIGl0IHNraXBzIGFsbCBCYXNpY0Jsb2NrcyB0aGF0IGFyZSBub3QgcGFydCBvZgorLy8vIHRoZSBwYXJlbnQgUmVnaW9uLiAgRnVydGhlcm1vcmUgZm9yIEJhc2ljQmxvY2tzIHRoYXQgc3RhcnQgYSBzdWJyZWdpb24sIGEKKy8vLyBSZWdpb25Ob2RlIHJlcHJlc2VudGluZyB0aGUgc3VicmVnaW9uIGlzIHJldHVybmVkLgorLy8vCisvLy8gRm9yIGEgc3VicmVnaW9uIFJlZ2lvbk5vZGUgdGhlcmUgaXMganVzdCBvbmUgc3VjY2Vzc29yLiBUaGUgUmVnaW9uTm9kZQorLy8vIHJlcHJlc2VudGluZyB0aGUgZXhpdCBvZiB0aGUgc3VicmVnaW9uLgordGVtcGxhdGUgPGNsYXNzIE5vZGVSZWYsIGNsYXNzIEJsb2NrVCwgY2xhc3MgUmVnaW9uVD4KK2NsYXNzIFJOU3VjY0l0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBOb2RlUmVmPiB7CisgIHVzaW5nIHN1cGVyID0gc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBOb2RlUmVmPjsKKyAgdXNpbmcgQmxvY2tUcmFpdHMgPSBHcmFwaFRyYWl0czxCbG9ja1QgKj47CisgIHVzaW5nIFN1Y2NJdGVyVHkgPSB0eXBlbmFtZSBCbG9ja1RyYWl0czo6Q2hpbGRJdGVyYXRvclR5cGU7CisKKyAgLy8gVGhlIGl0ZXJhdG9yIHdvcmtzIGluIHR3byBtb2RlcywgYmIgbW9kZSBvciByZWdpb24gbW9kZS4KKyAgZW51bSBJdE1vZGUgeworICAgIC8vIEluIEJCIG1vZGUgaXQgcmV0dXJucyBhbGwgc3VjY2Vzc29ycyBvZiB0aGlzIEJhc2ljQmxvY2sgYXMgaXRzCisgICAgLy8gc3VjY2Vzc29ycy4KKyAgICBJdEJCLAorICAgIC8vIEluIHJlZ2lvbiBtb2RlIHRoZXJlIGlzIG9ubHkgb25lIHN1Y2Nlc3NvciwgdGhhdHMgdGhlIHJlZ2lvbm5vZGUgbWFwcGluZworICAgIC8vIHRvIHRoZSBleGl0IGJsb2NrIG9mIHRoZSByZWdpb25ub2RlCisgICAgSXRSZ0JlZ2luLCAvLyBBdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSByZWdpb25ub2RlIHN1Y2Nlc3Nvci4KKyAgICBJdFJnRW5kICAgIC8vIEF0IHRoZSBlbmQgb2YgdGhlIHJlZ2lvbm5vZGUgc3VjY2Vzc29yLgorICB9OworCisgIHN0YXRpY19hc3NlcnQoc3RkOjppc19wb2ludGVyPE5vZGVSZWY+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAiRklYTUU6IEN1cnJlbnRseSBSTlN1Y2NJdGVyYXRvciBvbmx5IHN1cHBvcnRzIE5vZGVSZWYgYXMgIgorICAgICAgICAgICAgICAgICJwb2ludGVycyBkdWUgdG8gdGhlIHVzZSBvZiBwb2ludGVyLXNwZWNpZmljIGRhdGEgc3RydWN0dXJlcyAiCisgICAgICAgICAgICAgICAgIihlLmcuIFBvaW50ZXJJbnRQYWlyIGFuZCBTbWFsbFB0clNldCkgaW50ZXJuYWxseS4gR2VuZXJhbGl6ZSAiCisgICAgICAgICAgICAgICAgIml0IHRvIHN1cHBvcnQgbm9uLXBvaW50ZXIgdHlwZXMiKTsKKworICAvLyBVc2UgdHdvIGJpdCB0byByZXByZXNlbnQgdGhlIG1vZGUgaXRlcmF0b3IuCisgIFBvaW50ZXJJbnRQYWlyPE5vZGVSZWYsIDIsIEl0TW9kZT4gTm9kZTsKKworICAvLyBUaGUgYmxvY2sgc3VjY2Vzc29yIGl0ZXJhdG9yLgorICBTdWNjSXRlclR5IEJJdG9yOworCisgIC8vIGFkdmFuY2VSZWdpb25TdWNjIC0gQSByZWdpb24gbm9kZSBoYXMgb25seSBvbmUgc3VjY2Vzc29yLiBJdCByZWFjaGVzIGVuZAorICAvLyBvbmNlIHdlIGFkdmFuY2UgaXQuCisgIHZvaWQgYWR2YW5jZVJlZ2lvblN1Y2MoKSB7CisgICAgYXNzZXJ0KE5vZGUuZ2V0SW50KCkgPT0gSXRSZ0JlZ2luICYmICJDYW5ub3QgYWR2YW5jZSByZWdpb24gc3VjY2Vzc29yISIpOworICAgIE5vZGUuc2V0SW50KEl0UmdFbmQpOworICB9CisKKyAgTm9kZVJlZiBnZXROb2RlKCkgY29uc3QgeyByZXR1cm4gTm9kZS5nZXRQb2ludGVyKCk7IH0KKworICAvLyBpc1JlZ2lvbk1vZGUgLSBJcyB0aGUgY3VycmVudCBpdGVyYXRvciBpbiByZWdpb24gbW9kZT8KKyAgYm9vbCBpc1JlZ2lvbk1vZGUoKSBjb25zdCB7IHJldHVybiBOb2RlLmdldEludCgpICE9IEl0QkI7IH0KKworICAvLyBHZXQgdGhlIGltbWVkaWF0ZSBzdWNjZXNzb3IuIFRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBhIEJhc2ljIEJsb2NrCisgIC8vIFJlZ2lvbk5vZGUgb3IgYSBzdWJyZWdpb24gUmVnaW9uTm9kZS4KKyAgTm9kZVJlZiBnZXRJU3VjYyhCbG9ja1QgKkJCKSBjb25zdCB7CisgICAgTm9kZVJlZiBzdWNjOworICAgIHN1Y2MgPSBnZXROb2RlKCktPmdldFBhcmVudCgpLT5nZXROb2RlKEJCKTsKKyAgICBhc3NlcnQoc3VjYyAmJiAiQkIgbm90IGluIFJlZ2lvbiBvciBlbnRlcmVkIHN1YnJlZ2lvbiEiKTsKKyAgICByZXR1cm4gc3VjYzsKKyAgfQorCisgIC8vIGdldFJlZ2lvblN1Y2MgLSBSZXR1cm4gdGhlIHN1Y2Nlc3NvciBiYXNpYyBibG9jayBvZiBhIFN1YlJlZ2lvbiBSZWdpb25Ob2RlLgorICBpbmxpbmUgQmxvY2tUKiBnZXRSZWdpb25TdWNjKCkgY29uc3QgeworICAgIGFzc2VydChOb2RlLmdldEludCgpID09IEl0UmdCZWdpbiAmJiAiQ2Fubm90IGdldCB0aGUgcmVnaW9uIHN1Y2Nlc3NvciEiKTsKKyAgICByZXR1cm4gZ2V0Tm9kZSgpLT50ZW1wbGF0ZSBnZXROb2RlQXM8UmVnaW9uVD4oKS0+Z2V0RXhpdCgpOworICB9CisKKyAgLy8gaXNFeGl0IC0gSXMgdGhpcyB0aGUgZXhpdCBCQiBvZiB0aGUgUmVnaW9uPworICBpbmxpbmUgYm9vbCBpc0V4aXQoQmxvY2tUKiBCQikgY29uc3QgeworICAgIHJldHVybiBnZXROb2RlKCktPmdldFBhcmVudCgpLT5nZXRFeGl0KCkgPT0gQkI7CisgIH0KKworcHVibGljOgorICB1c2luZyBTZWxmID0gUk5TdWNjSXRlcmF0b3I8Tm9kZVJlZiwgQmxvY2tULCBSZWdpb25UPjsKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IHR5cGVuYW1lIHN1cGVyOjp2YWx1ZV90eXBlOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGJlZ2luIGl0ZXJhdG9yIG9mIGEgUmVnaW9uTm9kZS4KKyAgaW5saW5lIFJOU3VjY0l0ZXJhdG9yKE5vZGVSZWYgbm9kZSkKKyAgICAgIDogTm9kZShub2RlLCBub2RlLT5pc1N1YlJlZ2lvbigpID8gSXRSZ0JlZ2luIDogSXRCQiksCisgICAgICAgIEJJdG9yKEJsb2NrVHJhaXRzOjpjaGlsZF9iZWdpbihub2RlLT5nZXRFbnRyeSgpKSkgeworICAgIC8vIFNraXAgdGhlIGV4aXQgYmxvY2sKKyAgICBpZiAoIWlzUmVnaW9uTW9kZSgpKQorICAgICAgd2hpbGUgKEJsb2NrVHJhaXRzOjpjaGlsZF9lbmQobm9kZS0+Z2V0RW50cnkoKSkgIT0gQkl0b3IgJiYgaXNFeGl0KCpCSXRvcikpCisgICAgICAgICsrQkl0b3I7CisKKyAgICBpZiAoaXNSZWdpb25Nb2RlKCkgJiYgaXNFeGl0KGdldFJlZ2lvblN1Y2MoKSkpCisgICAgICBhZHZhbmNlUmVnaW9uU3VjYygpOworICB9CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYW4gZW5kIGl0ZXJhdG9yLgorICBpbmxpbmUgUk5TdWNjSXRlcmF0b3IoTm9kZVJlZiBub2RlLCBib29sKQorICAgICAgOiBOb2RlKG5vZGUsIG5vZGUtPmlzU3ViUmVnaW9uKCkgPyBJdFJnRW5kIDogSXRCQiksCisgICAgICAgIEJJdG9yKEJsb2NrVHJhaXRzOjpjaGlsZF9lbmQobm9kZS0+Z2V0RW50cnkoKSkpIHt9CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTZWxmJiB4KSBjb25zdCB7CisgICAgYXNzZXJ0KGlzUmVnaW9uTW9kZSgpID09IHguaXNSZWdpb25Nb2RlKCkgJiYgIkJyb2tlbiBpdGVyYXRvciEiKTsKKyAgICBpZiAoaXNSZWdpb25Nb2RlKCkpCisgICAgICByZXR1cm4gTm9kZS5nZXRJbnQoKSA9PSB4Lk5vZGUuZ2V0SW50KCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIEJJdG9yID09IHguQkl0b3I7CisgIH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNlbGYmIHgpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KHgpOyB9CisKKyAgaW5saW5lIHZhbHVlX3R5cGUgb3BlcmF0b3IqKCkgY29uc3QgeworICAgIEJsb2NrVCAqQkIgPSBpc1JlZ2lvbk1vZGUoKSA/IGdldFJlZ2lvblN1Y2MoKSA6ICpCSXRvcjsKKyAgICBhc3NlcnQoIWlzRXhpdChCQikgJiYgIkl0ZXJhdG9yIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gZ2V0SVN1Y2MoQkIpOworICB9CisKKyAgaW5saW5lIFNlbGYmIG9wZXJhdG9yKysoKSB7CisgICAgaWYoaXNSZWdpb25Nb2RlKCkpIHsKKyAgICAgIC8vIFRoZSBSZWdpb24gb25seSBoYXMgMSBzdWNjZXNzb3IuCisgICAgICBhZHZhbmNlUmVnaW9uU3VjYygpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBTa2lwIHRoZSBleGl0LgorICAgICAgZG8KKyAgICAgICAgKytCSXRvcjsKKyAgICAgIHdoaWxlIChCSXRvciAhPSBCbG9ja1RyYWl0czo6Y2hpbGRfZW5kKGdldE5vZGUoKS0+Z2V0RW50cnkoKSkKKyAgICAgICAgICAmJiBpc0V4aXQoKkJJdG9yKSk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBTZWxmIG9wZXJhdG9yKysoaW50KSB7CisgICAgU2VsZiB0bXAgPSAqdGhpczsKKyAgICArKyp0aGlzOworICAgIHJldHVybiB0bXA7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQGJyaWVmIEZsYXQgUmVnaW9uTm9kZSBpdGVyYXRvci4KKy8vLworLy8vIFRoZSBGbGF0IFJlZ2lvbiBpdGVyYXRvciB3aWxsIGl0ZXJhdGUgb3ZlciBhbGwgQmFzaWNCbG9jayBSZWdpb25Ob2RlcyB0aGF0CisvLy8gYXJlIGNvbnRhaW5lZCBpbiB0aGUgUmVnaW9uIGFuZCBpdHMgc3VicmVnaW9ucy4gVGhpcyBpcyBjbG9zZSB0byBhIHZpcnR1YWwKKy8vLyBjb250cm9sIGZsb3cgZ3JhcGggb2YgdGhlIFJlZ2lvbi4KK3RlbXBsYXRlIDxjbGFzcyBOb2RlUmVmLCBjbGFzcyBCbG9ja1QsIGNsYXNzIFJlZ2lvblQ+CitjbGFzcyBSTlN1Y2NJdGVyYXRvcjxGbGF0SXQ8Tm9kZVJlZj4sIEJsb2NrVCwgUmVnaW9uVD4KKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIE5vZGVSZWY+IHsKKyAgdXNpbmcgc3VwZXIgPSBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIE5vZGVSZWY+OworICB1c2luZyBCbG9ja1RyYWl0cyA9IEdyYXBoVHJhaXRzPEJsb2NrVCAqPjsKKyAgdXNpbmcgU3VjY0l0ZXJUeSA9IHR5cGVuYW1lIEJsb2NrVHJhaXRzOjpDaGlsZEl0ZXJhdG9yVHlwZTsKKworICBOb2RlUmVmIE5vZGU7CisgIFN1Y2NJdGVyVHkgSXRvcjsKKworcHVibGljOgorICB1c2luZyBTZWxmID0gUk5TdWNjSXRlcmF0b3I8RmxhdEl0PE5vZGVSZWY+LCBCbG9ja1QsIFJlZ2lvblQ+OworICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgc3VwZXI6OnZhbHVlX3R5cGU7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgdGhlIGl0ZXJhdG9yIGZyb20gYSBSZWdpb25Ob2RlLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGUgaW5jb21pbmcgbm9kZSBtdXN0IGJlIGEgYmIgbm9kZSwgb3RoZXJ3aXNlIGl0IHdpbGwgdHJpZ2dlcgorICAvLy8gYW4gYXNzZXJ0aW9uIHdoZW4gd2UgdHJ5IHRvIGdldCBhIEJhc2ljQmxvY2suCisgIGlubGluZSBSTlN1Y2NJdGVyYXRvcihOb2RlUmVmIG5vZGUpCisgICAgICA6IE5vZGUobm9kZSksIEl0b3IoQmxvY2tUcmFpdHM6OmNoaWxkX2JlZ2luKG5vZGUtPmdldEVudHJ5KCkpKSB7CisgICAgYXNzZXJ0KCFOb2RlLT5pc1N1YlJlZ2lvbigpICYmCisgICAgICAgICAgICJTdWJyZWdpb24gbm9kZSBub3QgYWxsb3dlZCBpbiBmbGF0IGl0ZXJhdGluZyBtb2RlISIpOworICAgIGFzc2VydChOb2RlLT5nZXRQYXJlbnQoKSAmJiAiQSBCQiBub2RlIG11c3QgaGF2ZSBhIHBhcmVudCEiKTsKKworICAgIC8vIFNraXAgdGhlIGV4aXQgYmxvY2sgb2YgdGhlIGl0ZXJhdGluZyByZWdpb24uCisgICAgd2hpbGUgKEJsb2NrVHJhaXRzOjpjaGlsZF9lbmQoTm9kZS0+Z2V0RW50cnkoKSkgIT0gSXRvciAmJgorICAgICAgICAgICBOb2RlLT5nZXRQYXJlbnQoKS0+Z2V0RXhpdCgpID09ICpJdG9yKQorICAgICAgKytJdG9yOworICB9CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYW4gZW5kIGl0ZXJhdG9yCisgIGlubGluZSBSTlN1Y2NJdGVyYXRvcihOb2RlUmVmIG5vZGUsIGJvb2wpCisgICAgICA6IE5vZGUobm9kZSksIEl0b3IoQmxvY2tUcmFpdHM6OmNoaWxkX2VuZChub2RlLT5nZXRFbnRyeSgpKSkgeworICAgIGFzc2VydCghTm9kZS0+aXNTdWJSZWdpb24oKSAmJgorICAgICAgICAgICAiU3VicmVnaW9uIG5vZGUgbm90IGFsbG93ZWQgaW4gZmxhdCBpdGVyYXRpbmcgbW9kZSEiKTsKKyAgfQorCisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgU2VsZiYgeCkgY29uc3QgeworICAgIGFzc2VydChOb2RlLT5nZXRQYXJlbnQoKSA9PSB4Lk5vZGUtPmdldFBhcmVudCgpCisgICAgICAgICAgICYmICJDYW5ub3QgY29tcGFyZSBpdGVyYXRvcnMgb2YgZGlmZmVyZW50IHJlZ2lvbnMhIik7CisKKyAgICByZXR1cm4gSXRvciA9PSB4Lkl0b3IgJiYgTm9kZSA9PSB4Lk5vZGU7CisgIH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNlbGYmIHgpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KHgpOyB9CisKKyAgaW5saW5lIHZhbHVlX3R5cGUgb3BlcmF0b3IqKCkgY29uc3QgeworICAgIEJsb2NrVCAqQkIgPSAqSXRvcjsKKworICAgIC8vIEdldCB0aGUgaXRlcmF0aW5nIHJlZ2lvbi4KKyAgICBSZWdpb25UICpQYXJlbnQgPSBOb2RlLT5nZXRQYXJlbnQoKTsKKworICAgIC8vIFRoZSBvbmx5IGNhc2UgdGhhdCB0aGUgc3VjY2Vzc29yIHJlYWNoZXMgb3V0IG9mIHRoZSByZWdpb24gaXMgaXQgcmVhY2hlcworICAgIC8vIHRoZSBleGl0IG9mIHRoZSByZWdpb24uCisgICAgYXNzZXJ0KFBhcmVudC0+Z2V0RXhpdCgpICE9IEJCICYmICJpdGVyYXRvciBvdXQgb2YgcmFuZ2UhIik7CisKKyAgICByZXR1cm4gUGFyZW50LT5nZXRCQk5vZGUoQkIpOworICB9CisKKyAgaW5saW5lIFNlbGYmIG9wZXJhdG9yKysoKSB7CisgICAgLy8gU2tpcCB0aGUgZXhpdCBibG9jayBvZiB0aGUgaXRlcmF0aW5nIHJlZ2lvbi4KKyAgICBkbworICAgICAgKytJdG9yOworICAgIHdoaWxlIChJdG9yICE9IHN1Y2NfZW5kKE5vZGUtPmdldEVudHJ5KCkpCisgICAgICAgICYmIE5vZGUtPmdldFBhcmVudCgpLT5nZXRFeGl0KCkgPT0gKkl0b3IpOworCisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIFNlbGYgb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBTZWxmIHRtcCA9ICp0aGlzOworICAgICsrKnRoaXM7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIE5vZGVSZWYsIGNsYXNzIEJsb2NrVCwgY2xhc3MgUmVnaW9uVD4KK2lubGluZSBSTlN1Y2NJdGVyYXRvcjxOb2RlUmVmLCBCbG9ja1QsIFJlZ2lvblQ+IHN1Y2NfYmVnaW4oTm9kZVJlZiBOb2RlKSB7CisgIHJldHVybiBSTlN1Y2NJdGVyYXRvcjxOb2RlUmVmLCBCbG9ja1QsIFJlZ2lvblQ+KE5vZGUpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgTm9kZVJlZiwgY2xhc3MgQmxvY2tULCBjbGFzcyBSZWdpb25UPgoraW5saW5lIFJOU3VjY0l0ZXJhdG9yPE5vZGVSZWYsIEJsb2NrVCwgUmVnaW9uVD4gc3VjY19lbmQoTm9kZVJlZiBOb2RlKSB7CisgIHJldHVybiBSTlN1Y2NJdGVyYXRvcjxOb2RlUmVmLCBCbG9ja1QsIFJlZ2lvblQ+KE5vZGUsIHRydWUpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFJlZ2lvbk5vZGUgR3JhcGhUcmFpdHMgc3BlY2lhbGl6YXRpb24gc28gdGhlIGJicyBpbiB0aGUgcmVnaW9uIGNhbiBiZQorLy8gaXRlcmF0ZSBieSBnZW5lcmljIGdyYXBoIGl0ZXJhdG9ycy4KKy8vCisvLyBOb2RlVCBjYW4gZWl0aGVyIGJlIHJlZ2lvbiBub2RlIG9yIGNvbnN0IHJlZ2lvbiBub2RlLCBvdGhlcndpc2UgY2hpbGRfYmVnaW4KKy8vIGFuZCBjaGlsZF9lbmQgZmFpbC4KKworI2RlZmluZSBSZWdpb25Ob2RlR3JhcGhUcmFpdHMoTm9kZVQsIEJsb2NrVCwgUmVnaW9uVCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPE5vZGVUICo+IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdXNpbmcgTm9kZVJlZiA9IE5vZGVUICo7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gUk5TdWNjSXRlcmF0b3I8Tm9kZVJlZiwgQmxvY2tULCBSZWdpb25UPjsgICAgICAgIFwKKyAgICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoTm9kZVJlZiBOKSB7IHJldHVybiBOOyB9ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIFJOU3VjY0l0ZXJhdG9yPE5vZGVSZWYsIEJsb2NrVCwgUmVnaW9uVD4oTik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIFJOU3VjY0l0ZXJhdG9yPE5vZGVSZWYsIEJsb2NrVCwgUmVnaW9uVD4oTiwgdHJ1ZSk7ICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8RmxhdEl0PE5vZGVUICo+PiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1c2luZyBOb2RlUmVmID0gTm9kZVQgKjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBSTlN1Y2NJdGVyYXRvcjxGbGF0SXQ8Tm9kZVJlZj4sIEJsb2NrVCwgUmVnaW9uVD47ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoTm9kZVJlZiBOKSB7IHJldHVybiBOOyB9ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIFJOU3VjY0l0ZXJhdG9yPEZsYXRJdDxOb2RlUmVmPiwgQmxvY2tULCBSZWdpb25UPihOKTsgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGlubGluZSBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgcmV0dXJuIFJOU3VjY0l0ZXJhdG9yPEZsYXRJdDxOb2RlUmVmPiwgQmxvY2tULCBSZWdpb25UPihOLCB0cnVlKTsgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBSZWdpb25HcmFwaFRyYWl0cyhSZWdpb25ULCBOb2RlVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPFJlZ2lvblQgKj4gOiBwdWJsaWMgR3JhcGhUcmFpdHM8Tm9kZVQgKj4geyAgICBcCisgICAgdXNpbmcgbm9kZXNfaXRlcmF0b3IgPSBkZl9pdGVyYXRvcjxOb2RlUmVmPjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShSZWdpb25UICpSKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBSLT5nZXROb2RlKFItPmdldEVudHJ5KCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihSZWdpb25UICpSKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBub2Rlc19pdGVyYXRvcjo6YmVnaW4oZ2V0RW50cnlOb2RlKFIpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoUmVnaW9uVCAqUikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJldHVybiBub2Rlc19pdGVyYXRvcjo6ZW5kKGdldEVudHJ5Tm9kZShSKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0cnVjdCBHcmFwaFRyYWl0czxGbGF0SXQ8UmVnaW9uVCAqPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiBwdWJsaWMgR3JhcGhUcmFpdHM8RmxhdEl0PE5vZGVUICo+PiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1c2luZyBub2Rlc19pdGVyYXRvciA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGRmX2l0ZXJhdG9yPE5vZGVSZWYsIGRmX2l0ZXJhdG9yX2RlZmF1bHRfc2V0PE5vZGVSZWY+LCBmYWxzZSwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBHcmFwaFRyYWl0czxGbGF0SXQ8Tm9kZVJlZj4+PjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoUmVnaW9uVCAqUikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gUi0+Z2V0QkJOb2RlKFItPmdldEVudHJ5KCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfYmVnaW4oUmVnaW9uVCAqUikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3I6OmJlZ2luKGdldEVudHJ5Tm9kZShSKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kKFJlZ2lvblQgKlIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3I6OmVuZChnZXRFbnRyeU5vZGUoUikpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCitSZWdpb25Ob2RlR3JhcGhUcmFpdHMoUmVnaW9uTm9kZSwgQmFzaWNCbG9jaywgUmVnaW9uKTsKK1JlZ2lvbk5vZGVHcmFwaFRyYWl0cyhjb25zdCBSZWdpb25Ob2RlLCBCYXNpY0Jsb2NrLCBSZWdpb24pOworCitSZWdpb25HcmFwaFRyYWl0cyhSZWdpb24sIFJlZ2lvbk5vZGUpOworUmVnaW9uR3JhcGhUcmFpdHMoY29uc3QgUmVnaW9uLCBjb25zdCBSZWdpb25Ob2RlKTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPFJlZ2lvbkluZm8qPgorICA6IHB1YmxpYyBHcmFwaFRyYWl0czxGbGF0SXQ8UmVnaW9uTm9kZSo+PiB7CisgIHVzaW5nIG5vZGVzX2l0ZXJhdG9yID0KKyAgICAgIGRmX2l0ZXJhdG9yPE5vZGVSZWYsIGRmX2l0ZXJhdG9yX2RlZmF1bHRfc2V0PE5vZGVSZWY+LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgIEdyYXBoVHJhaXRzPEZsYXRJdDxOb2RlUmVmPj4+OworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShSZWdpb25JbmZvICpSSSkgeworICAgIHJldHVybiBHcmFwaFRyYWl0czxGbGF0SXQ8UmVnaW9uKj4+OjpnZXRFbnRyeU5vZGUoUkktPmdldFRvcExldmVsUmVnaW9uKCkpOworICB9CisKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2JlZ2luKFJlZ2lvbkluZm8qIFJJKSB7CisgICAgcmV0dXJuIG5vZGVzX2l0ZXJhdG9yOjpiZWdpbihnZXRFbnRyeU5vZGUoUkkpKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoUmVnaW9uSW5mbyAqUkkpIHsKKyAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3I6OmVuZChnZXRFbnRyeU5vZGUoUkkpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPFJlZ2lvbkluZm9QYXNzKj4KKyAgOiBwdWJsaWMgR3JhcGhUcmFpdHM8UmVnaW9uSW5mbyAqPiB7CisgIHVzaW5nIG5vZGVzX2l0ZXJhdG9yID0KKyAgICAgIGRmX2l0ZXJhdG9yPE5vZGVSZWYsIGRmX2l0ZXJhdG9yX2RlZmF1bHRfc2V0PE5vZGVSZWY+LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgIEdyYXBoVHJhaXRzPEZsYXRJdDxOb2RlUmVmPj4+OworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShSZWdpb25JbmZvUGFzcyAqUkkpIHsKKyAgICByZXR1cm4gR3JhcGhUcmFpdHM8UmVnaW9uSW5mbyo+OjpnZXRFbnRyeU5vZGUoJlJJLT5nZXRSZWdpb25JbmZvKCkpOworICB9CisKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2JlZ2luKFJlZ2lvbkluZm9QYXNzKiBSSSkgeworICAgIHJldHVybiBHcmFwaFRyYWl0czxSZWdpb25JbmZvKj46Om5vZGVzX2JlZ2luKCZSSS0+Z2V0UmVnaW9uSW5mbygpKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoUmVnaW9uSW5mb1Bhc3MgKlJJKSB7CisgICAgcmV0dXJuIEdyYXBoVHJhaXRzPFJlZ2lvbkluZm8qPjo6bm9kZXNfZW5kKCZSSS0+Z2V0UmVnaW9uSW5mbygpKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfUkVHSU9OSVRFUkFUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9SZWdpb25QYXNzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1JlZ2lvblBhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTViMzYyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9SZWdpb25QYXNzLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8vPT09LSBSZWdpb25QYXNzLmggLSBSZWdpb25QYXNzIGNsYXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFJlZ2lvblBhc3MgY2xhc3MuIEFsbCByZWdpb24gYmFzZWQgYW5hbHlzaXMsCisvLyBvcHRpbWl6YXRpb24gYW5kIHRyYW5zZm9ybWF0aW9uIHBhc3NlcyBhcmUgZGVyaXZlZCBmcm9tIFJlZ2lvblBhc3MuCisvLyBUaGlzIGNsYXNzIGlzIGltcGxlbWVudGVkIGZvbGxvd2luZyB0aGUgc29tZSBpZGVhcyBvZiB0aGUgTG9vcFBhc3MuaCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfUkVHSU9OUEFTU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfUkVHSU9OUEFTU19ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1JlZ2lvbkluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9MZWdhY3lQYXNzTWFuYWdlcnMuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlIDxkZXF1ZT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBSR1Bhc3NNYW5hZ2VyOworY2xhc3MgRnVuY3Rpb247CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQGJyaWVmIEEgcGFzcyB0aGF0IHJ1bnMgb24gZWFjaCBSZWdpb24gaW4gYSBmdW5jdGlvbi4KKy8vLworLy8vIFJlZ2lvblBhc3MgaXMgbWFuYWdlZCBieSBSR1Bhc3NNYW5hZ2VyLgorY2xhc3MgUmVnaW9uUGFzcyA6IHB1YmxpYyBQYXNzIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgUmVnaW9uUGFzcyhjaGFyICZwaWQpIDogUGFzcyhQVF9SZWdpb24sIHBpZCkge30KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIEBuYW1lIFRvIGJlIGltcGxlbWVudGVkIGJ5IGV2ZXJ5IFJlZ2lvblBhc3MKKyAgLy8vCisgIC8vQHsKKyAgLy8vIEBicmllZiBSdW4gdGhlIHBhc3Mgb24gYSBzcGVjaWZpYyBSZWdpb24KKyAgLy8vCisgIC8vLyBBY2Nlc3NpbmcgcmVnaW9ucyBub3QgY29udGFpbmVkIGluIHRoZSBjdXJyZW50IHJlZ2lvbiBpcyBub3QgYWxsb3dlZC4KKyAgLy8vCisgIC8vLyBAcGFyYW0gUiBUaGUgcmVnaW9uIHRoaXMgcGFzcyBpcyBydW4gb24uCisgIC8vLyBAcGFyYW0gUkdNIFRoZSBSZWdpb25QYXNzTWFuYWdlciB0aGF0IG1hbmFnZXMgdGhpcyBQYXNzLgorICAvLy8KKyAgLy8vIEByZXR1cm4gVHJ1ZSBpZiB0aGUgcGFzcyBtb2RpZmllcyB0aGlzIFJlZ2lvbi4KKyAgdmlydHVhbCBib29sIHJ1bk9uUmVnaW9uKFJlZ2lvbiAqUiwgUkdQYXNzTWFuYWdlciAmUkdNKSA9IDA7CisKKyAgLy8vIEBicmllZiBHZXQgYSBwYXNzIHRvIHByaW50IHRoZSBMTFZNIElSIGluIHRoZSByZWdpb24uCisgIC8vLworICAvLy8gQHBhcmFtIE8gICAgICBUaGUgb3V0cHV0IHN0cmVhbSB0byBwcmludCB0aGUgUmVnaW9uLgorICAvLy8gQHBhcmFtIEJhbm5lciBUaGUgYmFubmVyIHRvIHNlcGFyYXRlIGRpZmZlcmVudCBwcmludGVkIHBhc3Nlcy4KKyAgLy8vCisgIC8vLyBAcmV0dXJuIFRoZSBwYXNzIHRvIHByaW50IHRoZSBMTFZNIElSIGluIHRoZSByZWdpb24uCisgIFBhc3MgKmNyZWF0ZVByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQmFubmVyKSBjb25zdCBvdmVycmlkZTsKKworICB1c2luZyBsbHZtOjpQYXNzOjpkb0luaXRpYWxpemF0aW9uOworICB1c2luZyBsbHZtOjpQYXNzOjpkb0ZpbmFsaXphdGlvbjsKKworICB2aXJ0dWFsIGJvb2wgZG9Jbml0aWFsaXphdGlvbihSZWdpb24gKlIsIFJHUGFzc01hbmFnZXIgJlJHTSkgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBib29sIGRvRmluYWxpemF0aW9uKCkgeyByZXR1cm4gZmFsc2U7IH0KKyAgLy9AfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gQG5hbWUgUGFzc01hbmFnZXIgQVBJCisgIC8vLworICAvL0B7CisgIHZvaWQgcHJlcGFyZVBhc3NNYW5hZ2VyKFBNU3RhY2sgJlBNUykgb3ZlcnJpZGU7CisKKyAgdm9pZCBhc3NpZ25QYXNzTWFuYWdlcihQTVN0YWNrICZQTVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgUGFzc01hbmFnZXJUeXBlIFBNVCA9IFBNVF9SZWdpb25QYXNzTWFuYWdlcikgb3ZlcnJpZGU7CisKKyAgUGFzc01hbmFnZXJUeXBlIGdldFBvdGVudGlhbFBhc3NNYW5hZ2VyVHlwZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUE1UX1JlZ2lvblBhc3NNYW5hZ2VyOworICB9CisgIC8vQH0KKworcHJvdGVjdGVkOgorICAvLy8gT3B0aW9uYWwgcGFzc2VzIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBjaGVjayB3aGV0aGVyIHRoZSBwYXNzIHNob3VsZCBiZQorICAvLy8gc2tpcHBlZC4gVGhpcyBpcyB0aGUgY2FzZSB3aGVuIG9wdGltaXphdGlvbiBiaXNlY3QgaXMgb3ZlciB0aGUgbGltaXQuCisgIGJvb2wgc2tpcFJlZ2lvbihSZWdpb24gJlIpIGNvbnN0OworfTsKKworLy8vIEBicmllZiBUaGUgcGFzcyBtYW5hZ2VyIHRvIHNjaGVkdWxlIFJlZ2lvblBhc3Nlcy4KK2NsYXNzIFJHUGFzc01hbmFnZXIgOiBwdWJsaWMgRnVuY3Rpb25QYXNzLCBwdWJsaWMgUE1EYXRhTWFuYWdlciB7CisgIHN0ZDo6ZGVxdWU8UmVnaW9uKj4gUlE7CisgIGJvb2wgc2tpcFRoaXNSZWdpb247CisgIGJvb2wgcmVkb1RoaXNSZWdpb247CisgIFJlZ2lvbkluZm8gKlJJOworICBSZWdpb24gKkN1cnJlbnRSZWdpb247CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisgIGV4cGxpY2l0IFJHUGFzc01hbmFnZXIoKTsKKworICAvLy8gQGJyaWVmIEV4ZWN1dGUgYWxsIG9mIHRoZSBwYXNzZXMgc2NoZWR1bGVkIGZvciBleGVjdXRpb24uCisgIC8vLworICAvLy8gQHJldHVybiBUcnVlIGlmIGFueSBvZiB0aGUgcGFzc2VzIG1vZGlmaWVzIHRoZSBmdW5jdGlvbi4KKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSBvdmVycmlkZTsKKworICAvLy8gUGFzcyBNYW5hZ2VyIGl0c2VsZiBkb2VzIG5vdCBpbnZhbGlkYXRlIGFueSBhbmFseXNpcyBpbmZvLgorICAvLy8gUkdQYXNzTWFuYWdlciBuZWVkcyBSZWdpb25JbmZvLgorICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmSW5mbykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgU3RyaW5nUmVmIGdldFBhc3NOYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIlJlZ2lvbiBQYXNzIE1hbmFnZXIiOyB9CisKKyAgUE1EYXRhTWFuYWdlciAqZ2V0QXNQTURhdGFNYW5hZ2VyKCkgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQorICBQYXNzICpnZXRBc1Bhc3MoKSBvdmVycmlkZSB7IHJldHVybiB0aGlzOyB9CisKKyAgLy8vIEBicmllZiBQcmludCBwYXNzZXMgbWFuYWdlZCBieSB0aGlzIG1hbmFnZXIuCisgIHZvaWQgZHVtcFBhc3NTdHJ1Y3R1cmUodW5zaWduZWQgT2Zmc2V0KSBvdmVycmlkZTsKKworICAvLy8gQGJyaWVmIEdldCBwYXNzZXMgY29udGFpbmVkIGJ5IHRoaXMgbWFuYWdlci4KKyAgUGFzcyAqZ2V0Q29udGFpbmVkUGFzcyh1bnNpZ25lZCBOKSB7CisgICAgYXNzZXJ0KE4gPCBQYXNzVmVjdG9yLnNpemUoKSAmJiAiUGFzcyBudW1iZXIgb3V0IG9mIHJhbmdlISIpOworICAgIFBhc3MgKkZQID0gc3RhdGljX2Nhc3Q8UGFzcyAqPihQYXNzVmVjdG9yW05dKTsKKyAgICByZXR1cm4gRlA7CisgIH0KKworICBQYXNzTWFuYWdlclR5cGUgZ2V0UGFzc01hbmFnZXJUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBQTVRfUmVnaW9uUGFzc01hbmFnZXI7CisgIH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9SZWdpb25QcmludGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1JlZ2lvblByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZjAwMzVjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9SZWdpb25QcmludGVyLmgKQEAgLTAsMCArMSw3MSBAQAorLy89PT0tLSBSZWdpb25QcmludGVyLmggLSBSZWdpb24gcHJpbnRlciBleHRlcm5hbCBpbnRlcmZhY2UgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBleHRlcm5hbCBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgY2FsbGVkIHRvIGV4cGxpY2l0bHkKKy8vIGluc3RhbnRpYXRlIHRoZSByZWdpb24gcHJpbnRlci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfUkVHSU9OUFJJTlRFUl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfUkVHSU9OUFJJTlRFUl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgRnVuY3Rpb25QYXNzOworICBjbGFzcyBGdW5jdGlvbjsKKyAgY2xhc3MgUmVnaW9uSW5mbzsKKworICBGdW5jdGlvblBhc3MgKmNyZWF0ZVJlZ2lvblZpZXdlclBhc3MoKTsKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVSZWdpb25Pbmx5Vmlld2VyUGFzcygpOworICBGdW5jdGlvblBhc3MgKmNyZWF0ZVJlZ2lvblByaW50ZXJQYXNzKCk7CisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlUmVnaW9uT25seVByaW50ZXJQYXNzKCk7CisKKyNpZm5kZWYgTkRFQlVHCisgIC8vLyBAYnJpZWYgT3BlbiBhIHZpZXdlciB0byBkaXNwbGF5IHRoZSBHcmFwaFZpeiB2aXp1YWxpemF0aW9uIG9mIHRoZSBhbmFseXNpcworICAvLy8gcmVzdWx0LgorICAvLy8KKyAgLy8vIFByYWN0aWNhbCB0byBjYWxsIGluIHRoZSBkZWJ1Z2dlci4KKyAgLy8vIEluY2x1ZGVzIHRoZSBpbnN0cnVjdGlvbnMgaW4gZWFjaCBCYXNpY0Jsb2NrLgorICAvLy8KKyAgLy8vIEBwYXJhbSBSSSBUaGUgYW5hbHlzaXMgdG8gZGlzcGxheS4KKyAgdm9pZCB2aWV3UmVnaW9uKGxsdm06OlJlZ2lvbkluZm8gKlJJKTsKKworICAvLy8gQGJyaWVmIEFuYWx5emUgdGhlIHJlZ2lvbnMgb2YgYSBmdW5jdGlvbiBhbmQgb3BlbiBpdHMgR3JhcGhWaXoKKyAgLy8vIHZpc3VhbGl6YXRpb24gaW4gYSB2aWV3ZXIuCisgIC8vLworICAvLy8gVXNlZnVsIHRvIGNhbGwgaW4gdGhlIGRlYnVnZ2VyLgorICAvLy8gSW5jbHVkZXMgdGhlIGluc3RydWN0aW9ucyBpbiBlYWNoIEJhc2ljQmxvY2suCisgIC8vLyBUaGUgcmVzdWx0IG9mIGEgbmV3IGFuYWx5c2lzIG1heSBkaWZmZXIgZnJvbSB0aGUgUmVnaW9uSW5mbyB0aGUgcGFzcworICAvLy8gbWFuYWdlciBjdXJyZW50bHkgaG9sZHMuCisgIC8vLworICAvLy8gQHBhcmFtIEYgRnVuY3Rpb24gdG8gYW5hbHl6ZS4KKyAgdm9pZCB2aWV3UmVnaW9uKGNvbnN0IGxsdm06OkZ1bmN0aW9uICpGKTsKKworICAvLy8gQGJyaWVmIE9wZW4gYSB2aWV3ZXIgdG8gZGlzcGxheSB0aGUgR3JhcGhWaXogdml6dWFsaXphdGlvbiBvZiB0aGUgYW5hbHlzaXMKKyAgLy8vIHJlc3VsdC4KKyAgLy8vCisgIC8vLyBVc2VmdWwgdG8gY2FsbCBpbiB0aGUgZGVidWdnZXIuCisgIC8vLyBTaG93cyBvbmx5IHRoZSBCYXNpY0Jsb2NrIG5hbWVzIHdpdGhvdXQgdGhlaXIgaW5zdHJ1Y3Rpb25zLgorICAvLy8KKyAgLy8vIEBwYXJhbSBSSSBUaGUgYW5hbHlzaXMgdG8gZGlzcGxheS4KKyAgdm9pZCB2aWV3UmVnaW9uT25seShsbHZtOjpSZWdpb25JbmZvICpSSSk7CisKKyAgLy8vIEBicmllZiBBbmFseXplIHRoZSByZWdpb25zIG9mIGEgZnVuY3Rpb24gYW5kIG9wZW4gaXRzIEdyYXBoVml6CisgIC8vLyB2aXN1YWxpemF0aW9uIGluIGEgdmlld2VyLgorICAvLy8KKyAgLy8vIFVzZWZ1bCB0byBjYWxsIGluIHRoZSBkZWJ1Z2dlci4KKyAgLy8vIFNob3dzIG9ubHkgdGhlIEJhc2ljQmxvY2sgbmFtZXMgd2l0aG91dCB0aGVpciBpbnN0cnVjdGlvbnMuCisgIC8vLyBUaGUgcmVzdWx0IG9mIGEgbmV3IGFuYWx5c2lzIG1heSBkaWZmZXIgZnJvbSB0aGUgUmVnaW9uSW5mbyB0aGUgcGFzcworICAvLy8gbWFuYWdlciBjdXJyZW50bHkgaG9sZHMuCisgIC8vLworICAvLy8gQHBhcmFtIEYgRnVuY3Rpb24gdG8gYW5hbHl6ZS4KKyAgdm9pZCB2aWV3UmVnaW9uT25seShjb25zdCBsbHZtOjpGdW5jdGlvbiAqRik7CisjZW5kaWYKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E0M2I4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uLmgKQEAgLTAsMCArMSwxOTgwIEBACisvLz09PS0gbGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb24uaCAtIFNjYWxhciBFdm9sdXRpb24gLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoZSBTY2FsYXJFdm9sdXRpb24gY2xhc3MgaXMgYW4gTExWTSBwYXNzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGFuYWx5emUgYW5kCisvLyBjYXRlZ29yaXplIHNjYWxhciBleHByZXNzaW9ucyBpbiBsb29wcy4gIEl0IHNwZWNpYWxpemVzIGluIHJlY29nbml6aW5nCisvLyBnZW5lcmFsIGluZHVjdGlvbiB2YXJpYWJsZXMsIHJlcHJlc2VudGluZyB0aGVtIHdpdGggdGhlIGFic3RyYWN0IGFuZCBvcGFxdWUKKy8vIFNDRVYgY2xhc3MuICBHaXZlbiB0aGlzIGFuYWx5c2lzLCB0cmlwIGNvdW50cyBvZiBsb29wcyBhbmQgb3RoZXIgaW1wb3J0YW50CisvLyBwcm9wZXJ0aWVzIGNhbiBiZSBvYnRhaW5lZC4KKy8vCisvLyBUaGlzIGFuYWx5c2lzIGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIGluZHVjdGlvbiB2YXJpYWJsZSBzdWJzdGl0dXRpb24gYW5kCisvLyBzdHJlbmd0aCByZWR1Y3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1NDQUxBUkVWT0xVVElPTl9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfU0NBTEFSRVZPTFVUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FQSW50LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ZvbGRpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9IYXNoaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudFJhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JUi9PcGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlSGFuZGxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQXNzdW1wdGlvbkNhY2hlOworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIENvbnN0YW50OworY2xhc3MgQ29uc3RhbnRJbnQ7CitjbGFzcyBEYXRhTGF5b3V0OworY2xhc3MgRG9taW5hdG9yVHJlZTsKK2NsYXNzIEdFUE9wZXJhdG9yOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworY2xhc3MgU0NFVkFkZFJlY0V4cHI7CitjbGFzcyBTQ0VWVW5rbm93bjsKK2NsYXNzIFN0cnVjdFR5cGU7CitjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mbzsKK2NsYXNzIFR5cGU7CitjbGFzcyBWYWx1ZTsKKworLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBhbmFseXplZCBleHByZXNzaW9uIGluIHRoZSBwcm9ncmFtLiAgVGhlc2UgYXJlCisvLy8gb3BhcXVlIG9iamVjdHMgdGhhdCB0aGUgY2xpZW50IGlzIG5vdCBhbGxvd2VkIHRvIGRvIG11Y2ggd2l0aCBkaXJlY3RseS4KKy8vLworY2xhc3MgU0NFViA6IHB1YmxpYyBGb2xkaW5nU2V0Tm9kZSB7CisgIGZyaWVuZCBzdHJ1Y3QgRm9sZGluZ1NldFRyYWl0PFNDRVY+OworCisgIC8vLyBBIHJlZmVyZW5jZSB0byBhbiBJbnRlcm5lZCBGb2xkaW5nU2V0Tm9kZUlEIGZvciB0aGlzIG5vZGUuICBUaGUKKyAgLy8vIFNjYWxhckV2b2x1dGlvbidzIEJ1bXBQdHJBbGxvY2F0b3IgaG9sZHMgdGhlIGRhdGEuCisgIEZvbGRpbmdTZXROb2RlSURSZWYgRmFzdElEOworCisgIC8vIFRoZSBTQ0VWIGJhc2VjbGFzcyB0aGlzIG5vZGUgY29ycmVzcG9uZHMgdG8KKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgU0NFVlR5cGU7CisKK3Byb3RlY3RlZDoKKyAgLy8vIFRoaXMgZmllbGQgaXMgaW5pdGlhbGl6ZWQgdG8gemVybyBhbmQgbWF5IGJlIHVzZWQgaW4gc3ViY2xhc3NlcyB0byBzdG9yZQorICAvLy8gbWlzY2VsbGFuZW91cyBpbmZvcm1hdGlvbi4KKyAgdW5zaWduZWQgc2hvcnQgU3ViY2xhc3NEYXRhID0gMDsKKworcHVibGljOgorICAvLy8gTm9XcmFwRmxhZ3MgYXJlIGJpdGZpZWxkIGluZGljZXMgaW50byBTdWJjbGFzc0RhdGEuCisgIC8vLworICAvLy8gQWRkIGFuZCBNdWwgZXhwcmVzc2lvbnMgbWF5IGhhdmUgbm8tdW5zaWduZWQtd3JhcCA8TlVXPiBvcgorICAvLy8gbm8tc2lnbmVkLXdyYXAgPE5TVz4gcHJvcGVydGllcywgd2hpY2ggYXJlIGRlcml2ZWQgZnJvbSB0aGUgSVIKKyAgLy8vIG9wZXJhdG9yLiBOU1cgaXMgYSBtaXNub21lciB0aGF0IHdlIHVzZSB0byBtZWFuIG5vIHNpZ25lZCBvdmVyZmxvdyBvcgorICAvLy8gdW5kZXJmbG93LgorICAvLy8KKyAgLy8vIEFkZFJlYyBleHByZXNzaW9ucyBtYXkgaGF2ZSBhIG5vLXNlbGYtd3JhcGFyb3VuZCA8Tlc+IHByb3BlcnR5IGlmLCBpbgorICAvLy8gdGhlIGludGVnZXIgZG9tYWluLCBhYnMoc3RlcCkgKiBtYXgtaXRlcmF0aW9uKGxvb3ApIDw9CisgIC8vLyB1bnNpZ25lZC1tYXgoYml0d2lkdGgpLiAgVGhpcyBtZWFucyB0aGF0IHRoZSByZWN1cnJlbmNlIHdpbGwgbmV2ZXIgcmVhY2gKKyAgLy8vIGl0cyBzdGFydCB2YWx1ZSBpZiB0aGUgc3RlcCBpcyBub24temVyby4gIENvbXB1dGluZyB0aGUgc2FtZSB2YWx1ZSBvbgorICAvLy8gZWFjaCBpdGVyYXRpb24gaXMgbm90IGNvbnNpZGVyZWQgd3JhcHBpbmcsIGFuZCByZWN1cnJlbmNlcyB3aXRoIHN0ZXAgPSAwCisgIC8vLyBhcmUgdHJpdmlhbGx5IDxOVz4uICA8Tlc+IGlzIGluZGVwZW5kZW50IG9mIHRoZSBzaWduIG9mIHN0ZXAgYW5kIHRoZQorICAvLy8gdmFsdWUgdGhlIGFkZCByZWN1cnJlbmNlIHN0YXJ0cyB3aXRoLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBOVVcgYW5kIE5TVyBhcmUgYWxzbyB2YWxpZCBwcm9wZXJ0aWVzIG9mIGEgcmVjdXJyZW5jZSwgYW5kCisgIC8vLyBlaXRoZXIgaW1wbGllcyBOVy4gRm9yIGNvbnZlbmllbmNlLCBOVyB3aWxsIGJlIHNldCBmb3IgYSByZWN1cnJlbmNlCisgIC8vLyB3aGVuZXZlciBlaXRoZXIgTlVXIG9yIE5TVyBhcmUgc2V0LgorICBlbnVtIE5vV3JhcEZsYWdzIHsKKyAgICBGbGFnQW55V3JhcCA9IDAsICAgIC8vIE5vIGd1YXJhbnRlZS4KKyAgICBGbGFnTlcgPSAoMSA8PCAwKSwgIC8vIE5vIHNlbGYtd3JhcC4KKyAgICBGbGFnTlVXID0gKDEgPDwgMSksIC8vIE5vIHVuc2lnbmVkIHdyYXAuCisgICAgRmxhZ05TVyA9ICgxIDw8IDIpLCAvLyBObyBzaWduZWQgd3JhcC4KKyAgICBOb1dyYXBNYXNrID0gKDEgPDwgMykgLSAxCisgIH07CisKKyAgZXhwbGljaXQgU0NFVihjb25zdCBGb2xkaW5nU2V0Tm9kZUlEUmVmIElELCB1bnNpZ25lZCBTQ0VWVHkpCisgICAgICA6IEZhc3RJRChJRCksIFNDRVZUeXBlKFNDRVZUeSkge30KKyAgU0NFVihjb25zdCBTQ0VWICYpID0gZGVsZXRlOworICBTQ0VWICZvcGVyYXRvcj0oY29uc3QgU0NFViAmKSA9IGRlbGV0ZTsKKworICB1bnNpZ25lZCBnZXRTQ0VWVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFNDRVZUeXBlOyB9CisKKyAgLy8vIFJldHVybiB0aGUgTExWTSB0eXBlIG9mIHRoaXMgU0NFViBleHByZXNzaW9uLgorICBUeXBlICpnZXRUeXBlKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBleHByZXNzaW9uIGlzIGEgY29uc3RhbnQgemVyby4KKyAgYm9vbCBpc1plcm8oKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGV4cHJlc3Npb24gaXMgYSBjb25zdGFudCBvbmUuCisgIGJvb2wgaXNPbmUoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGV4cHJlc3Npb24gaXMgYSBjb25zdGFudCBhbGwtb25lcyB2YWx1ZS4KKyAgYm9vbCBpc0FsbE9uZXNWYWx1ZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHNjZXYgaXMgbmVnYXRlZCwgYnV0IG5vdCBhIGNvbnN0YW50LgorICBib29sIGlzTm9uQ29uc3RhbnROZWdhdGl2ZSgpIGNvbnN0OworCisgIC8vLyBQcmludCBvdXQgdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgc2NhbGFyIHRvIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHN0cmVhbS4gIFRoaXMgc2hvdWxkIHJlYWxseSBvbmx5IGJlIHVzZWQgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIC8vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGZvciBkZWJ1Z2dpbmcuCisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworLy8gU3BlY2lhbGl6ZSBGb2xkaW5nU2V0VHJhaXQgZm9yIFNDRVYgdG8gYXZvaWQgbmVlZGluZyB0byBjb21wdXRlCisvLyB0ZW1wb3JhcnkgRm9sZGluZ1NldE5vZGVJRCB2YWx1ZXMuCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRm9sZGluZ1NldFRyYWl0PFNDRVY+IDogRGVmYXVsdEZvbGRpbmdTZXRUcmFpdDxTQ0VWPiB7CisgIHN0YXRpYyB2b2lkIFByb2ZpbGUoY29uc3QgU0NFViAmWCwgRm9sZGluZ1NldE5vZGVJRCAmSUQpIHsgSUQgPSBYLkZhc3RJRDsgfQorCisgIHN0YXRpYyBib29sIEVxdWFscyhjb25zdCBTQ0VWICZYLCBjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZJRCwgdW5zaWduZWQgSURIYXNoLAorICAgICAgICAgICAgICAgICAgICAgRm9sZGluZ1NldE5vZGVJRCAmVGVtcElEKSB7CisgICAgcmV0dXJuIElEID09IFguRmFzdElEOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIENvbXB1dGVIYXNoKGNvbnN0IFNDRVYgJlgsIEZvbGRpbmdTZXROb2RlSUQgJlRlbXBJRCkgeworICAgIHJldHVybiBYLkZhc3RJRC5Db21wdXRlSGFzaCgpOworICB9Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBTQ0VWICZTKSB7CisgIFMucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKKy8vLyBBbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyByZXR1cm5lZCBieSBxdWVyaWVzIHRoYXQgY291bGQgbm90IGJlIGFuc3dlcmVkLgorLy8vIEZvciBleGFtcGxlLCBpZiB5b3UgYXNrIGZvciB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgb2YgYSBsaW5rZWQtbGlzdAorLy8vIHRyYXZlcnNhbCBsb29wLCB5b3Ugd2lsbCBnZXQgb25lIG9mIHRoZXNlLiAgTm9uZSBvZiB0aGUgc3RhbmRhcmQgU0NFVgorLy8vIG9wZXJhdGlvbnMgYXJlIHZhbGlkIG9uIHRoaXMgY2xhc3MsIGl0IGlzIGp1c3QgYSBtYXJrZXIuCitzdHJ1Y3QgU0NFVkNvdWxkTm90Q29tcHV0ZSA6IHB1YmxpYyBTQ0VWIHsKKyAgU0NFVkNvdWxkTm90Q29tcHV0ZSgpOworCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVYgKlMpOworfTsKKworLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBhc3N1bXB0aW9uIG1hZGUgdXNpbmcgU0NFViBleHByZXNzaW9ucyB3aGljaCBjYW4KKy8vLyBiZSBjaGVja2VkIGF0IHJ1bi10aW1lLgorY2xhc3MgU0NFVlByZWRpY2F0ZSA6IHB1YmxpYyBGb2xkaW5nU2V0Tm9kZSB7CisgIGZyaWVuZCBzdHJ1Y3QgRm9sZGluZ1NldFRyYWl0PFNDRVZQcmVkaWNhdGU+OworCisgIC8vLyBBIHJlZmVyZW5jZSB0byBhbiBJbnRlcm5lZCBGb2xkaW5nU2V0Tm9kZUlEIGZvciB0aGlzIG5vZGUuICBUaGUKKyAgLy8vIFNjYWxhckV2b2x1dGlvbidzIEJ1bXBQdHJBbGxvY2F0b3IgaG9sZHMgdGhlIGRhdGEuCisgIEZvbGRpbmdTZXROb2RlSURSZWYgRmFzdElEOworCitwdWJsaWM6CisgIGVudW0gU0NFVlByZWRpY2F0ZUtpbmQgeyBQX1VuaW9uLCBQX0VxdWFsLCBQX1dyYXAgfTsKKworcHJvdGVjdGVkOgorICBTQ0VWUHJlZGljYXRlS2luZCBLaW5kOworICB+U0NFVlByZWRpY2F0ZSgpID0gZGVmYXVsdDsKKyAgU0NFVlByZWRpY2F0ZShjb25zdCBTQ0VWUHJlZGljYXRlICYpID0gZGVmYXVsdDsKKyAgU0NFVlByZWRpY2F0ZSAmb3BlcmF0b3I9KGNvbnN0IFNDRVZQcmVkaWNhdGUgJikgPSBkZWZhdWx0OworCitwdWJsaWM6CisgIFNDRVZQcmVkaWNhdGUoY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBJRCwgU0NFVlByZWRpY2F0ZUtpbmQgS2luZCk7CisKKyAgU0NFVlByZWRpY2F0ZUtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICAvLy8gUmV0dXJucyB0aGUgZXN0aW1hdGVkIGNvbXBsZXhpdHkgb2YgdGhpcyBwcmVkaWNhdGUuICBUaGlzIGlzIHJvdWdobHkKKyAgLy8vIG1lYXN1cmVkIGluIHRoZSBudW1iZXIgb2YgcnVuLXRpbWUgY2hlY2tzIHJlcXVpcmVkLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldENvbXBsZXhpdHkoKSBjb25zdCB7IHJldHVybiAxOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgcHJlZGljYXRlIGlzIGFsd2F5cyB0cnVlLiBUaGlzIG1lYW5zIHRoYXQgbm8KKyAgLy8vIGFzc3VtcHRpb25zIHdlcmUgbWFkZSBhbmQgbm90aGluZyBuZWVkcyB0byBiZSBjaGVja2VkIGF0IHJ1bi10aW1lLgorICB2aXJ0dWFsIGJvb2wgaXNBbHdheXNUcnVlKCkgY29uc3QgPSAwOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBwcmVkaWNhdGUgaW1wbGllcyBccCBOLgorICB2aXJ0dWFsIGJvb2wgaW1wbGllcyhjb25zdCBTQ0VWUHJlZGljYXRlICpOKSBjb25zdCA9IDA7CisKKyAgLy8vIFByaW50cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBwcmVkaWNhdGUgd2l0aCBhbiBpbmRlbnRhdGlvbiBvZgorICAvLy8gXHAgRGVwdGguCisgIHZpcnR1YWwgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIHVuc2lnbmVkIERlcHRoID0gMCkgY29uc3QgPSAwOworCisgIC8vLyBSZXR1cm5zIHRoZSBTQ0VWIHRvIHdoaWNoIHRoaXMgcHJlZGljYXRlIGFwcGxpZXMsIG9yIG51bGxwdHIgaWYgdGhpcyBpcworICAvLy8gYSBTQ0VWVW5pb25QcmVkaWNhdGUuCisgIHZpcnR1YWwgY29uc3QgU0NFViAqZ2V0RXhwcigpIGNvbnN0ID0gMDsKK307CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFNDRVZQcmVkaWNhdGUgJlApIHsKKyAgUC5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKworLy8gU3BlY2lhbGl6ZSBGb2xkaW5nU2V0VHJhaXQgZm9yIFNDRVZQcmVkaWNhdGUgdG8gYXZvaWQgbmVlZGluZyB0byBjb21wdXRlCisvLyB0ZW1wb3JhcnkgRm9sZGluZ1NldE5vZGVJRCB2YWx1ZXMuCit0ZW1wbGF0ZSA8Pgorc3RydWN0IEZvbGRpbmdTZXRUcmFpdDxTQ0VWUHJlZGljYXRlPiA6IERlZmF1bHRGb2xkaW5nU2V0VHJhaXQ8U0NFVlByZWRpY2F0ZT4geworICBzdGF0aWMgdm9pZCBQcm9maWxlKGNvbnN0IFNDRVZQcmVkaWNhdGUgJlgsIEZvbGRpbmdTZXROb2RlSUQgJklEKSB7CisgICAgSUQgPSBYLkZhc3RJRDsKKyAgfQorCisgIHN0YXRpYyBib29sIEVxdWFscyhjb25zdCBTQ0VWUHJlZGljYXRlICZYLCBjb25zdCBGb2xkaW5nU2V0Tm9kZUlEICZJRCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIElESGFzaCwgRm9sZGluZ1NldE5vZGVJRCAmVGVtcElEKSB7CisgICAgcmV0dXJuIElEID09IFguRmFzdElEOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIENvbXB1dGVIYXNoKGNvbnN0IFNDRVZQcmVkaWNhdGUgJlgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb2xkaW5nU2V0Tm9kZUlEICZUZW1wSUQpIHsKKyAgICByZXR1cm4gWC5GYXN0SUQuQ29tcHV0ZUhhc2goKTsKKyAgfQorfTsKKworLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBhc3N1bXB0aW9uIHRoYXQgdHdvIFNDRVYgZXhwcmVzc2lvbnMgYXJlIGVxdWFsLAorLy8vIGFuZCB0aGlzIGNhbiBiZSBjaGVja2VkIGF0IHJ1bi10aW1lLgorY2xhc3MgU0NFVkVxdWFsUHJlZGljYXRlIGZpbmFsIDogcHVibGljIFNDRVZQcmVkaWNhdGUgeworICAvLy8gV2UgYXNzdW1lIHRoYXQgTEhTID09IFJIUy4KKyAgY29uc3QgU0NFViAqTEhTOworICBjb25zdCBTQ0VWICpSSFM7CisKK3B1YmxpYzoKKyAgU0NFVkVxdWFsUHJlZGljYXRlKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsIGNvbnN0IFNDRVYgKkxIUywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlJIUyk7CisKKyAgLy8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTQ0VWUHJlZGljYXRlIGludGVyZmFjZQorICBib29sIGltcGxpZXMoY29uc3QgU0NFVlByZWRpY2F0ZSAqTikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBEZXB0aCA9IDApIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzQWx3YXlzVHJ1ZSgpIGNvbnN0IG92ZXJyaWRlOworICBjb25zdCBTQ0VWICpnZXRFeHByKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIFJldHVybnMgdGhlIGxlZnQgaGFuZCBzaWRlIG9mIHRoZSBlcXVhbGl0eS4KKyAgY29uc3QgU0NFViAqZ2V0TEhTKCkgY29uc3QgeyByZXR1cm4gTEhTOyB9CisKKyAgLy8vIFJldHVybnMgdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgZXF1YWxpdHkuCisgIGNvbnN0IFNDRVYgKmdldFJIUygpIGNvbnN0IHsgcmV0dXJuIFJIUzsgfQorCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVZQcmVkaWNhdGUgKlApIHsKKyAgICByZXR1cm4gUC0+Z2V0S2luZCgpID09IFBfRXF1YWw7CisgIH0KK307CisKKy8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gYXNzdW1wdGlvbiBtYWRlIG9uIGFuIEFkZFJlYyBleHByZXNzaW9uLiBHaXZlbiBhbgorLy8vIGFmZmluZSBBZGRSZWMgZXhwcmVzc2lvbiB7YSwrLGJ9LCB3ZSBhc3N1bWUgdGhhdCBpdCBoYXMgdGhlIG5zc3cgb3IgbnVzdworLy8vIGZsYWdzIChkZWZpbmVkIGJlbG93KSBpbiB0aGUgZmlyc3QgWCBpdGVyYXRpb25zIG9mIHRoZSBsb29wLCB3aGVyZSBYIGlzIGEKKy8vLyBTQ0VWIGV4cHJlc3Npb24gcmV0dXJuZWQgYnkgZ2V0UHJlZGljYXRlZEJhY2tlZGdlVGFrZW5Db3VudCkuCisvLy8KKy8vLyBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBpbXBseSB0aGF0IFggaXMgZXF1YWwgdG8gdGhlIGJhY2tlZGdlIHRha2VuCisvLy8gY291bnQuIFRoaXMgbWVhbnMgdGhhdCBpZiB3ZSBoYXZlIGEgbnVzdyBwcmVkaWNhdGUgZm9yIGkzMiB7MCwrLDF9IHdpdGggYQorLy8vIHByZWRpY2F0ZWQgYmFja2VkZ2UgdGFrZW4gY291bnQgb2YgWCwgd2Ugb25seSBndWFyYW50ZWUgdGhhdCB7MCwrLDF9IGhhcworLy8vIG51c3cgaW4gdGhlIGZpcnN0IFggaXRlcmF0aW9ucy4gezAsKywxfSBtYXkgc3RpbGwgd3JhcCBpbiB0aGUgbG9vcCBpZiB3ZQorLy8vIGhhdmUgbW9yZSB0aGFuIFggaXRlcmF0aW9ucy4KK2NsYXNzIFNDRVZXcmFwUHJlZGljYXRlIGZpbmFsIDogcHVibGljIFNDRVZQcmVkaWNhdGUgeworcHVibGljOgorICAvLy8gU2ltaWxhciB0byBTQ0VWOjpOb1dyYXBGbGFncywgYnV0IHdpdGggc2xpZ2h0bHkgZGlmZmVyZW50IHNlbWFudGljcworICAvLy8gZm9yIEZsYWdOVVNXLiBUaGUgaW5jcmVtZW50IGlzIGNvbnNpZGVyZWQgdG8gYmUgc2lnbmVkLCBhbmQgYSArIGIKKyAgLy8vICh3aGVyZSBiIGlzIHRoZSBpbmNyZW1lbnQpIGlzIGNvbnNpZGVyZWQgdG8gd3JhcCBpZjoKKyAgLy8vICAgIHpleHQoYSArIGIpICE9IHpleHQoYSkgKyBzZXh0KGIpCisgIC8vLworICAvLy8gSWYgU2lnbmVkIGlzIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhbiBuLWJpdCB0dXBsZSBhbmQgbWFwcyB0byB0aGUKKyAgLy8vIGludGVnZXIgZG9tYWluIGFzIHRoZSB0dXBsZXMgdmFsdWUgaW50ZXJwcmV0ZWQgYXMgdHdvcyBjb21wbGVtZW50LAorICAvLy8gYW5kIFVuc2lnbmVkIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBhbiBuLWJpdCB0dXBsZSBhbmQgbWFwcyB0byB0aGUKKyAgLy8vIGludGVnZXIgZG9tYWluIGFzIGFzIHRoZSBiYXNlIHR3byB2YWx1ZSBvZiBpbnB1dCB0dXBsZSwgdGhlbiBhICsgYgorICAvLy8gaGFzIEluY3JlbWVudE5VU1cgaWZmOgorICAvLy8KKyAgLy8vIDAgPD0gVW5zaWduZWQoYSkgKyBTaWduZWQoYikgPCAyXm4KKyAgLy8vCisgIC8vLyBUaGUgSW5jcmVtZW50TlNTVyBmbGFnIGhhcyBpZGVudGljYWwgc2VtYW50aWNzIHdpdGggU0NFVjo6RmxhZ05TVy4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhlIEluY3JlbWVudE5VU1cgZmxhZyBpcyBub3QgY29tbXV0YXRpdmU6IGlmIGJhc2UgKyBpbmMKKyAgLy8vIGhhcyBJbmNyZW1lbnROVVNXLCB0aGVuIGluYyArIGJhc2UgZG9lc24ndCBuZWNjZXNzYXJpbHkgaGF2ZSB0aGlzCisgIC8vLyBwcm9wZXJ0eS4gVGhlIHJlYXNvbiBmb3IgdGhpcyBpcyB0aGF0IHRoaXMgaXMgdXNlZCBmb3Igc2lnbi96ZXJvCisgIC8vLyBleHRlbmRpbmcgYWZmaW5lIEFkZFJlYyBTQ0VWIGV4cHJlc3Npb25zIHdoZW4gYSBTQ0VWV3JhcFByZWRpY2F0ZSBpcworICAvLy8gYXNzdW1lZC4gQSB7YmFzZSwrLGluY30gZXhwcmVzc2lvbiBpcyBhbHJlYWR5IG5vbi1jb21tdXRhdGl2ZSB3aXRoCisgIC8vLyByZWdhcmRzIHRvIGJhc2UgYW5kIGluYywgc2luY2UgaXQgaXMgaW50ZXJwcmV0ZWQgYXM6CisgIC8vLyAgICAgKCgoYmFzZSArIGluYykgKyBpbmMpICsgaW5jKSAuLi4KKyAgZW51bSBJbmNyZW1lbnRXcmFwRmxhZ3MgeworICAgIEluY3JlbWVudEFueVdyYXAgPSAwLCAgICAgLy8gTm8gZ3VhcmFudGVlLgorICAgIEluY3JlbWVudE5VU1cgPSAoMSA8PCAwKSwgLy8gTm8gdW5zaWduZWQgd2l0aCBzaWduZWQgaW5jcmVtZW50IHdyYXAuCisgICAgSW5jcmVtZW50TlNTVyA9ICgxIDw8IDEpLCAvLyBObyBzaWduZWQgd2l0aCBzaWduZWQgaW5jcmVtZW50IHdyYXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChlcXVpdmFsZW50IHdpdGggU0NFVjo6TlNXKQorICAgIEluY3JlbWVudE5vV3JhcE1hc2sgPSAoMSA8PCAyKSAtIDEKKyAgfTsKKworICAvLy8gQ29udmVuaWVudCBJbmNyZW1lbnRXcmFwRmxhZ3MgbWFuaXB1bGF0aW9uIG1ldGhvZHMuCisgIExMVk1fTk9ESVNDQVJEIHN0YXRpYyBTQ0VWV3JhcFByZWRpY2F0ZTo6SW5jcmVtZW50V3JhcEZsYWdzCisgIGNsZWFyRmxhZ3MoU0NFVldyYXBQcmVkaWNhdGU6OkluY3JlbWVudFdyYXBGbGFncyBGbGFncywKKyAgICAgICAgICAgICBTQ0VWV3JhcFByZWRpY2F0ZTo6SW5jcmVtZW50V3JhcEZsYWdzIE9mZkZsYWdzKSB7CisgICAgYXNzZXJ0KChGbGFncyAmIEluY3JlbWVudE5vV3JhcE1hc2spID09IEZsYWdzICYmICJJbnZhbGlkIGZsYWdzIHZhbHVlISIpOworICAgIGFzc2VydCgoT2ZmRmxhZ3MgJiBJbmNyZW1lbnROb1dyYXBNYXNrKSA9PSBPZmZGbGFncyAmJgorICAgICAgICAgICAiSW52YWxpZCBmbGFncyB2YWx1ZSEiKTsKKyAgICByZXR1cm4gKFNDRVZXcmFwUHJlZGljYXRlOjpJbmNyZW1lbnRXcmFwRmxhZ3MpKEZsYWdzICYgfk9mZkZsYWdzKTsKKyAgfQorCisgIExMVk1fTk9ESVNDQVJEIHN0YXRpYyBTQ0VWV3JhcFByZWRpY2F0ZTo6SW5jcmVtZW50V3JhcEZsYWdzCisgIG1hc2tGbGFncyhTQ0VWV3JhcFByZWRpY2F0ZTo6SW5jcmVtZW50V3JhcEZsYWdzIEZsYWdzLCBpbnQgTWFzaykgeworICAgIGFzc2VydCgoRmxhZ3MgJiBJbmNyZW1lbnROb1dyYXBNYXNrKSA9PSBGbGFncyAmJiAiSW52YWxpZCBmbGFncyB2YWx1ZSEiKTsKKyAgICBhc3NlcnQoKE1hc2sgJiBJbmNyZW1lbnROb1dyYXBNYXNrKSA9PSBNYXNrICYmICJJbnZhbGlkIG1hc2sgdmFsdWUhIik7CisKKyAgICByZXR1cm4gKFNDRVZXcmFwUHJlZGljYXRlOjpJbmNyZW1lbnRXcmFwRmxhZ3MpKEZsYWdzICYgTWFzayk7CisgIH0KKworICBMTFZNX05PRElTQ0FSRCBzdGF0aWMgU0NFVldyYXBQcmVkaWNhdGU6OkluY3JlbWVudFdyYXBGbGFncworICBzZXRGbGFncyhTQ0VWV3JhcFByZWRpY2F0ZTo6SW5jcmVtZW50V3JhcEZsYWdzIEZsYWdzLAorICAgICAgICAgICBTQ0VWV3JhcFByZWRpY2F0ZTo6SW5jcmVtZW50V3JhcEZsYWdzIE9uRmxhZ3MpIHsKKyAgICBhc3NlcnQoKEZsYWdzICYgSW5jcmVtZW50Tm9XcmFwTWFzaykgPT0gRmxhZ3MgJiYgIkludmFsaWQgZmxhZ3MgdmFsdWUhIik7CisgICAgYXNzZXJ0KChPbkZsYWdzICYgSW5jcmVtZW50Tm9XcmFwTWFzaykgPT0gT25GbGFncyAmJgorICAgICAgICAgICAiSW52YWxpZCBmbGFncyB2YWx1ZSEiKTsKKworICAgIHJldHVybiAoU0NFVldyYXBQcmVkaWNhdGU6OkluY3JlbWVudFdyYXBGbGFncykoRmxhZ3MgfCBPbkZsYWdzKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBzZXQgb2YgU0NFVldyYXBQcmVkaWNhdGUgbm8gd3JhcCBmbGFncyBpbXBsaWVkIGJ5IGEKKyAgLy8vIFNDRVZBZGRSZWNFeHByLgorICBMTFZNX05PRElTQ0FSRCBzdGF0aWMgU0NFVldyYXBQcmVkaWNhdGU6OkluY3JlbWVudFdyYXBGbGFncworICBnZXRJbXBsaWVkRmxhZ3MoY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFSLCBTY2FsYXJFdm9sdXRpb24gJlNFKTsKKworcHJpdmF0ZToKKyAgY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFSOworICBJbmNyZW1lbnRXcmFwRmxhZ3MgRmxhZ3M7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgU0NFVldyYXBQcmVkaWNhdGUoY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmNyZW1lbnRXcmFwRmxhZ3MgRmxhZ3MpOworCisgIC8vLyBSZXR1cm5zIHRoZSBzZXQgYXNzdW1lZCBubyBvdmVyZmxvdyBmbGFncy4KKyAgSW5jcmVtZW50V3JhcEZsYWdzIGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gRmxhZ3M7IH0KKworICAvLy8gSW1wbGVtZW50YXRpb24gb2YgdGhlIFNDRVZQcmVkaWNhdGUgaW50ZXJmYWNlCisgIGNvbnN0IFNDRVYgKmdldEV4cHIoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpbXBsaWVzKGNvbnN0IFNDRVZQcmVkaWNhdGUgKk4pIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgRGVwdGggPSAwKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0Fsd2F5c1RydWUoKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWUHJlZGljYXRlICpQKSB7CisgICAgcmV0dXJuIFAtPmdldEtpbmQoKSA9PSBQX1dyYXA7CisgIH0KK307CisKKy8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBjb21wb3NpdGlvbiBvZiBvdGhlciBTQ0VWIHByZWRpY2F0ZXMsIGFuZCBpcyB0aGUKKy8vLyBjbGFzcyB0aGF0IG1vc3QgY2xpZW50cyB3aWxsIGludGVyYWN0IHdpdGguICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYQorLy8vIGxvZ2ljYWwgIkFORCIgb2YgYWxsIHRoZSBwcmVkaWNhdGVzIGluIHRoZSB1bmlvbi4KKy8vLworLy8vIE5CISBVbmxpa2Ugb3RoZXIgU0NFVlByZWRpY2F0ZSBzdWItY2xhc3NlcyB0aGlzIGNsYXNzIGRvZXMgbm90IGxpdmUgaW4gdGhlCisvLy8gU2NhbGFyRXZvbHV0aW9uOjpQcmVkcyBmb2xkaW5nIHNldC4gIFRoaXMgaXMgd2h5IHRoZSBcYyBhZGQgZnVuY3Rpb24gaXMgc291bmQuCitjbGFzcyBTQ0VWVW5pb25QcmVkaWNhdGUgZmluYWwgOiBwdWJsaWMgU0NFVlByZWRpY2F0ZSB7Citwcml2YXRlOgorICB1c2luZyBQcmVkaWNhdGVNYXAgPQorICAgICAgRGVuc2VNYXA8Y29uc3QgU0NFViAqLCBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWUHJlZGljYXRlICosIDQ+PjsKKworICAvLy8gVmVjdG9yIHdpdGggcmVmZXJlbmNlcyB0byBhbGwgcHJlZGljYXRlcyBpbiB0aGlzIHVuaW9uLgorICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWUHJlZGljYXRlICosIDE2PiBQcmVkczsKKworICAvLy8gTWFwcyBTQ0VWcyB0byBwcmVkaWNhdGVzIGZvciBxdWljayBsb29rLXVwcy4KKyAgUHJlZGljYXRlTWFwIFNDRVZUb1ByZWRzOworCitwdWJsaWM6CisgIFNDRVZVbmlvblByZWRpY2F0ZSgpOworCisgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxjb25zdCBTQ0VWUHJlZGljYXRlICo+ICZnZXRQcmVkaWNhdGVzKCkgY29uc3QgeworICAgIHJldHVybiBQcmVkczsKKyAgfQorCisgIC8vLyBBZGRzIGEgcHJlZGljYXRlIHRvIHRoaXMgdW5pb24uCisgIHZvaWQgYWRkKGNvbnN0IFNDRVZQcmVkaWNhdGUgKk4pOworCisgIC8vLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgdmVjdG9yIGNvbnRhaW5pbmcgYWxsIHByZWRpY2F0ZXMgd2hpY2ggYXBwbHkgdG8KKyAgLy8vIFxwIEV4cHIuCisgIEFycmF5UmVmPGNvbnN0IFNDRVZQcmVkaWNhdGUgKj4gZ2V0UHJlZGljYXRlc0ZvckV4cHIoY29uc3QgU0NFViAqRXhwcik7CisKKyAgLy8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBTQ0VWUHJlZGljYXRlIGludGVyZmFjZQorICBib29sIGlzQWx3YXlzVHJ1ZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGltcGxpZXMoY29uc3QgU0NFVlByZWRpY2F0ZSAqTikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBEZXB0aCkgY29uc3Qgb3ZlcnJpZGU7CisgIGNvbnN0IFNDRVYgKmdldEV4cHIoKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gV2UgZXN0aW1hdGUgdGhlIGNvbXBsZXhpdHkgb2YgYSB1bmlvbiBwcmVkaWNhdGUgYXMgdGhlIHNpemUgbnVtYmVyIG9mCisgIC8vLyBwcmVkaWNhdGVzIGluIHRoZSB1bmlvbi4KKyAgdW5zaWduZWQgZ2V0Q29tcGxleGl0eSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIFByZWRzLnNpemUoKTsgfQorCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVZQcmVkaWNhdGUgKlApIHsKKyAgICByZXR1cm4gUC0+Z2V0S2luZCgpID09IFBfVW5pb247CisgIH0KK307CisKK3N0cnVjdCBFeGl0TGltaXRRdWVyeSB7CisgIEV4aXRMaW1pdFF1ZXJ5KGNvbnN0IExvb3AgKkwsIEJhc2ljQmxvY2sgKkV4aXRpbmdCbG9jaywgYm9vbCBBbGxvd1ByZWRpY2F0ZXMpCisgICAgICA6IEwoTCksIEV4aXRpbmdCbG9jayhFeGl0aW5nQmxvY2spLCBBbGxvd1ByZWRpY2F0ZXMoQWxsb3dQcmVkaWNhdGVzKSB7fQorCisgIGNvbnN0IExvb3AgKkw7CisgIEJhc2ljQmxvY2sgKkV4aXRpbmdCbG9jazsKKyAgYm9vbCBBbGxvd1ByZWRpY2F0ZXM7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPEV4aXRMaW1pdFF1ZXJ5PiB7CisgIHN0YXRpYyBpbmxpbmUgRXhpdExpbWl0UXVlcnkgZ2V0RW1wdHlLZXkoKSB7CisgICAgcmV0dXJuIEV4aXRMaW1pdFF1ZXJ5KG51bGxwdHIsIG51bGxwdHIsIHRydWUpOworICB9CisKKyAgc3RhdGljIGlubGluZSBFeGl0TGltaXRRdWVyeSBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgcmV0dXJuIEV4aXRMaW1pdFF1ZXJ5KG51bGxwdHIsIG51bGxwdHIsIGZhbHNlKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoRXhpdExpbWl0UXVlcnkgVmFsKSB7CisgICAgcmV0dXJuIGhhc2hfY29tYmluZShoYXNoX2NvbWJpbmUoVmFsLkwsIFZhbC5FeGl0aW5nQmxvY2spLAorICAgICAgICAgICAgICAgICAgICAgICAgVmFsLkFsbG93UHJlZGljYXRlcyk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKEV4aXRMaW1pdFF1ZXJ5IExIUywgRXhpdExpbWl0UXVlcnkgUkhTKSB7CisgICAgcmV0dXJuIExIUy5MID09IFJIUy5MICYmIExIUy5FeGl0aW5nQmxvY2sgPT0gUkhTLkV4aXRpbmdCbG9jayAmJgorICAgICAgICAgICBMSFMuQWxsb3dQcmVkaWNhdGVzID09IFJIUy5BbGxvd1ByZWRpY2F0ZXM7CisgIH0KK307CisKKy8vLyBUaGUgbWFpbiBzY2FsYXIgZXZvbHV0aW9uIGRyaXZlci4gQmVjYXVzZSBjbGllbnQgY29kZSAoaW50ZW50aW9uYWxseSkKKy8vLyBjYW4ndCBkbyBtdWNoIHdpdGggdGhlIFNDRVYgb2JqZWN0cyBkaXJlY3RseSwgdGhleSBtdXN0IGFzayB0aGlzIGNsYXNzCisvLy8gZm9yIHNlcnZpY2VzLgorY2xhc3MgU2NhbGFyRXZvbHV0aW9uIHsKK3B1YmxpYzoKKyAgLy8vIEFuIGVudW0gZGVzY3JpYmluZyB0aGUgcmVsYXRpb25zaGlwIGJldHdlZW4gYSBTQ0VWIGFuZCBhIGxvb3AuCisgIGVudW0gTG9vcERpc3Bvc2l0aW9uIHsKKyAgICBMb29wVmFyaWFudCwgICAvLy88IFRoZSBTQ0VWIGlzIGxvb3AtdmFyaWFudCAodW5rbm93bikuCisgICAgTG9vcEludmFyaWFudCwgLy8vPCBUaGUgU0NFViBpcyBsb29wLWludmFyaWFudC4KKyAgICBMb29wQ29tcHV0YWJsZSAvLy88IFRoZSBTQ0VWIHZhcmllcyBwcmVkaWN0YWJseSB3aXRoIHRoZSBsb29wLgorICB9OworCisgIC8vLyBBbiBlbnVtIGRlc2NyaWJpbmcgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGEgU0NFViBhbmQgYSBiYXNpYyBibG9jay4KKyAgZW51bSBCbG9ja0Rpc3Bvc2l0aW9uIHsKKyAgICBEb2VzTm90RG9taW5hdGVCbG9jaywgIC8vLzwgVGhlIFNDRVYgZG9lcyBub3QgZG9taW5hdGUgdGhlIGJsb2NrLgorICAgIERvbWluYXRlc0Jsb2NrLCAgICAgICAgLy8vPCBUaGUgU0NFViBkb21pbmF0ZXMgdGhlIGJsb2NrLgorICAgIFByb3Blcmx5RG9taW5hdGVzQmxvY2sgLy8vPCBUaGUgU0NFViBwcm9wZXJseSBkb21pbmF0ZXMgdGhlIGJsb2NrLgorICB9OworCisgIC8vLyBDb252ZW5pZW50IE5vV3JhcEZsYWdzIG1hbmlwdWxhdGlvbiB0aGF0IGhpZGVzIGVudW0gY2FzdHMgYW5kIGlzCisgIC8vLyB2aXNpYmxlIGluIHRoZSBTY2FsYXJFdm9sdXRpb24gbmFtZSBzcGFjZS4KKyAgTExWTV9OT0RJU0NBUkQgc3RhdGljIFNDRVY6Ok5vV3JhcEZsYWdzIG1hc2tGbGFncyhTQ0VWOjpOb1dyYXBGbGFncyBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgTWFzaykgeworICAgIHJldHVybiAoU0NFVjo6Tm9XcmFwRmxhZ3MpKEZsYWdzICYgTWFzayk7CisgIH0KKyAgTExWTV9OT0RJU0NBUkQgc3RhdGljIFNDRVY6Ok5vV3JhcEZsYWdzIHNldEZsYWdzKFNDRVY6Ok5vV3JhcEZsYWdzIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NFVjo6Tm9XcmFwRmxhZ3MgT25GbGFncykgeworICAgIHJldHVybiAoU0NFVjo6Tm9XcmFwRmxhZ3MpKEZsYWdzIHwgT25GbGFncyk7CisgIH0KKyAgTExWTV9OT0RJU0NBUkQgc3RhdGljIFNDRVY6Ok5vV3JhcEZsYWdzCisgIGNsZWFyRmxhZ3MoU0NFVjo6Tm9XcmFwRmxhZ3MgRmxhZ3MsIFNDRVY6Ok5vV3JhcEZsYWdzIE9mZkZsYWdzKSB7CisgICAgcmV0dXJuIChTQ0VWOjpOb1dyYXBGbGFncykoRmxhZ3MgJiB+T2ZmRmxhZ3MpOworICB9CisKKyAgU2NhbGFyRXZvbHV0aW9uKEZ1bmN0aW9uICZGLCBUYXJnZXRMaWJyYXJ5SW5mbyAmVExJLCBBc3N1bXB0aW9uQ2FjaGUgJkFDLAorICAgICAgICAgICAgICAgICAgRG9taW5hdG9yVHJlZSAmRFQsIExvb3BJbmZvICZMSSk7CisgIFNjYWxhckV2b2x1dGlvbihTY2FsYXJFdm9sdXRpb24gJiZBcmcpOworICB+U2NhbGFyRXZvbHV0aW9uKCk7CisKKyAgTExWTUNvbnRleHQgJmdldENvbnRleHQoKSBjb25zdCB7IHJldHVybiBGLmdldENvbnRleHQoKTsgfQorCisgIC8vLyBUZXN0IGlmIHZhbHVlcyBvZiB0aGUgZ2l2ZW4gdHlwZSBhcmUgYW5hbHl6YWJsZSB3aXRoaW4gdGhlIFNDRVYKKyAgLy8vIGZyYW1ld29yay4gVGhpcyBwcmltYXJpbHkgaW5jbHVkZXMgaW50ZWdlciB0eXBlcywgYW5kIGl0IGNhbiBvcHRpb25hbGx5CisgIC8vLyBpbmNsdWRlIHBvaW50ZXIgdHlwZXMgaWYgdGhlIFNjYWxhckV2b2x1dGlvbiBjbGFzcyBoYXMgYWNjZXNzIHRvCisgIC8vLyB0YXJnZXQtc3BlY2lmaWMgaW5mb3JtYXRpb24uCisgIGJvb2wgaXNTQ0VWYWJsZShUeXBlICpUeSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgc2l6ZSBpbiBiaXRzIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSwgZm9yIHdoaWNoIGlzU0NFVmFibGUgbXVzdAorICAvLy8gcmV0dXJuIHRydWUuCisgIHVpbnQ2NF90IGdldFR5cGVTaXplSW5CaXRzKFR5cGUgKlR5KSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgdHlwZSB3aXRoIHRoZSBzYW1lIGJpdHdpZHRoIGFzIHRoZSBnaXZlbiB0eXBlIGFuZCB3aGljaAorICAvLy8gcmVwcmVzZW50cyBob3cgU0NFViB3aWxsIHRyZWF0IHRoZSBnaXZlbiB0eXBlLCBmb3Igd2hpY2ggaXNTQ0VWYWJsZSBtdXN0CisgIC8vLyByZXR1cm4gdHJ1ZS4gRm9yIHBvaW50ZXIgdHlwZXMsIHRoaXMgaXMgdGhlIHBvaW50ZXItc2l6ZWQgaW50ZWdlciB0eXBlLgorICBUeXBlICpnZXRFZmZlY3RpdmVTQ0VWVHlwZShUeXBlICpUeSkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyBhIHdpZGVyIHR5cGUgYW1vbmcge1R5MSwgVHkyfS4KKyAgVHlwZSAqZ2V0V2lkZXJUeXBlKFR5cGUgKlR5MSwgVHlwZSAqVHkyKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIFNDRVYgaXMgYSBzY0FkZFJlY0V4cHIgb3IgaXQgY29udGFpbnMKKyAgLy8vIHNjQWRkUmVjRXhwci4gVGhlIHJlc3VsdCB3aWxsIGJlIGNhY2hlZCBpbiBIYXNSZWNNYXAuCisgIGJvb2wgY29udGFpbnNBZGRSZWN1cnJlbmNlKGNvbnN0IFNDRVYgKlMpOworCisgIC8vLyBFcmFzZSBWYWx1ZSBmcm9tIFZhbHVlRXhwck1hcCBhbmQgRXhwclZhbHVlTWFwLgorICB2b2lkIGVyYXNlVmFsdWVGcm9tTWFwKFZhbHVlICpWKTsKKworICAvLy8gUmV0dXJuIGEgU0NFViBleHByZXNzaW9uIGZvciB0aGUgZnVsbCBnZW5lcmFsaXR5IG9mIHRoZSBzcGVjaWZpZWQKKyAgLy8vIGV4cHJlc3Npb24uCisgIGNvbnN0IFNDRVYgKmdldFNDRVYoVmFsdWUgKlYpOworCisgIGNvbnN0IFNDRVYgKmdldENvbnN0YW50KENvbnN0YW50SW50ICpWKTsKKyAgY29uc3QgU0NFViAqZ2V0Q29uc3RhbnQoY29uc3QgQVBJbnQgJlZhbCk7CisgIGNvbnN0IFNDRVYgKmdldENvbnN0YW50KFR5cGUgKlR5LCB1aW50NjRfdCBWLCBib29sIGlzU2lnbmVkID0gZmFsc2UpOworICBjb25zdCBTQ0VWICpnZXRUcnVuY2F0ZUV4cHIoY29uc3QgU0NFViAqT3AsIFR5cGUgKlR5KTsKKyAgY29uc3QgU0NFViAqZ2V0WmVyb0V4dGVuZEV4cHIoY29uc3QgU0NFViAqT3AsIFR5cGUgKlR5LCB1bnNpZ25lZCBEZXB0aCA9IDApOworICBjb25zdCBTQ0VWICpnZXRTaWduRXh0ZW5kRXhwcihjb25zdCBTQ0VWICpPcCwgVHlwZSAqVHksIHVuc2lnbmVkIERlcHRoID0gMCk7CisgIGNvbnN0IFNDRVYgKmdldEFueUV4dGVuZEV4cHIoY29uc3QgU0NFViAqT3AsIFR5cGUgKlR5KTsKKyAgY29uc3QgU0NFViAqZ2V0QWRkRXhwcihTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPiAmT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNDRVY6Ok5vV3JhcEZsYWdzIEZsYWdzID0gU0NFVjo6RmxhZ0FueVdyYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwKTsKKyAgY29uc3QgU0NFViAqZ2V0QWRkRXhwcihjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTQ0VWOjpOb1dyYXBGbGFncyBGbGFncyA9IFNDRVY6OkZsYWdBbnlXcmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoID0gMCkgeworICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgMj4gT3BzID0ge0xIUywgUkhTfTsKKyAgICByZXR1cm4gZ2V0QWRkRXhwcihPcHMsIEZsYWdzLCBEZXB0aCk7CisgIH0KKyAgY29uc3QgU0NFViAqZ2V0QWRkRXhwcihjb25zdCBTQ0VWICpPcDAsIGNvbnN0IFNDRVYgKk9wMSwgY29uc3QgU0NFViAqT3AyLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNDRVY6Ok5vV3JhcEZsYWdzIEZsYWdzID0gU0NFVjo6RmxhZ0FueVdyYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwKSB7CisgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCAzPiBPcHMgPSB7T3AwLCBPcDEsIE9wMn07CisgICAgcmV0dXJuIGdldEFkZEV4cHIoT3BzLCBGbGFncywgRGVwdGgpOworICB9CisgIGNvbnN0IFNDRVYgKmdldE11bEV4cHIoU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj4gJk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTQ0VWOjpOb1dyYXBGbGFncyBGbGFncyA9IFNDRVY6OkZsYWdBbnlXcmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoID0gMCk7CisgIGNvbnN0IFNDRVYgKmdldE11bEV4cHIoY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0NFVjo6Tm9XcmFwRmxhZ3MgRmxhZ3MgPSBTQ0VWOjpGbGFnQW55V3JhcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDApIHsKKyAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDI+IE9wcyA9IHtMSFMsIFJIU307CisgICAgcmV0dXJuIGdldE11bEV4cHIoT3BzLCBGbGFncywgRGVwdGgpOworICB9CisgIGNvbnN0IFNDRVYgKmdldE11bEV4cHIoY29uc3QgU0NFViAqT3AwLCBjb25zdCBTQ0VWICpPcDEsIGNvbnN0IFNDRVYgKk9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTQ0VWOjpOb1dyYXBGbGFncyBGbGFncyA9IFNDRVY6OkZsYWdBbnlXcmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoID0gMCkgeworICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgMz4gT3BzID0ge09wMCwgT3AxLCBPcDJ9OworICAgIHJldHVybiBnZXRNdWxFeHByKE9wcywgRmxhZ3MsIERlcHRoKTsKKyAgfQorICBjb25zdCBTQ0VWICpnZXRVRGl2RXhwcihjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUyk7CisgIGNvbnN0IFNDRVYgKmdldFVEaXZFeGFjdEV4cHIoY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMpOworICBjb25zdCBTQ0VWICpnZXRVUmVtRXhwcihjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUyk7CisgIGNvbnN0IFNDRVYgKmdldEFkZFJlY0V4cHIoY29uc3QgU0NFViAqU3RhcnQsIGNvbnN0IFNDRVYgKlN0ZXAsIGNvbnN0IExvb3AgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NFVjo6Tm9XcmFwRmxhZ3MgRmxhZ3MpOworICBjb25zdCBTQ0VWICpnZXRBZGRSZWNFeHByKFNtYWxsVmVjdG9ySW1wbDxjb25zdCBTQ0VWICo+ICZPcGVyYW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpMLCBTQ0VWOjpOb1dyYXBGbGFncyBGbGFncyk7CisgIGNvbnN0IFNDRVYgKmdldEFkZFJlY0V4cHIoY29uc3QgU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj4gJk9wZXJhbmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKkwsIFNDRVY6Ok5vV3JhcEZsYWdzIEZsYWdzKSB7CisgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCA0PiBOZXdPcChPcGVyYW5kcy5iZWdpbigpLCBPcGVyYW5kcy5lbmQoKSk7CisgICAgcmV0dXJuIGdldEFkZFJlY0V4cHIoTmV3T3AsIEwsIEZsYWdzKTsKKyAgfQorCisgIC8vLyBDaGVja3MgaWYgXHAgU3ltYm9saWNQSEkgY2FuIGJlIHJld3JpdHRlbiBhcyBhbiBBZGRSZWNFeHByIHVuZGVyIHNvbWUKKyAgLy8vIFByZWRpY2F0ZXMuIElmIHN1Y2Nlc3NmdWwgcmV0dXJuIHRoZXNlIDxBZGRSZWNFeHByLCBQcmVkaWNhdGVzPjsKKyAgLy8vIFRoZSBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBiZSBjYWxsZWQgZnJvbSBQU0NFViAodGhlIGNhbGxlciB3aWxsIGRlY2lkZQorICAvLy8gd2hldGhlciB0byBhY3R1YWxseSBhZGQgdGhlIHByZWRpY2F0ZXMgYW5kIGNhcnJ5IG91dCB0aGUgcmV3cml0ZXMpLgorICBPcHRpb25hbDxzdGQ6OnBhaXI8Y29uc3QgU0NFViAqLCBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWUHJlZGljYXRlICosIDM+Pj4KKyAgY3JlYXRlQWRkUmVjRnJvbVBISVdpdGhDYXN0cyhjb25zdCBTQ0VWVW5rbm93biAqU3ltYm9saWNQSEkpOworCisgIC8vLyBSZXR1cm5zIGFuIGV4cHJlc3Npb24gZm9yIGEgR0VQCisgIC8vLworICAvLy8gXHAgR0VQIFRoZSBHRVAuIFRoZSBpbmRpY2VzIGNvbnRhaW5lZCBpbiB0aGUgR0VQIGl0c2VsZiBhcmUgaWdub3JlZCwKKyAgLy8vIGluc3RlYWQgd2UgdXNlIEluZGV4RXhwcnMuCisgIC8vLyBccCBJbmRleEV4cHJzIFRoZSBleHByZXNzaW9ucyBmb3IgdGhlIGluZGljZXMuCisgIGNvbnN0IFNDRVYgKmdldEdFUEV4cHIoR0VQT3BlcmF0b3IgKkdFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPiAmSW5kZXhFeHBycyk7CisgIGNvbnN0IFNDRVYgKmdldFNNYXhFeHByKGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTKTsKKyAgY29uc3QgU0NFViAqZ2V0U01heEV4cHIoU21hbGxWZWN0b3JJbXBsPGNvbnN0IFNDRVYgKj4gJk9wZXJhbmRzKTsKKyAgY29uc3QgU0NFViAqZ2V0VU1heEV4cHIoY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMpOworICBjb25zdCBTQ0VWICpnZXRVTWF4RXhwcihTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPiAmT3BlcmFuZHMpOworICBjb25zdCBTQ0VWICpnZXRTTWluRXhwcihjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUyk7CisgIGNvbnN0IFNDRVYgKmdldFVNaW5FeHByKGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTKTsKKyAgY29uc3QgU0NFViAqZ2V0VW5rbm93bihWYWx1ZSAqVik7CisgIGNvbnN0IFNDRVYgKmdldENvdWxkTm90Q29tcHV0ZSgpOworCisgIC8vLyBSZXR1cm4gYSBTQ0VWIGZvciB0aGUgY29uc3RhbnQgMCBvZiBhIHNwZWNpZmljIHR5cGUuCisgIGNvbnN0IFNDRVYgKmdldFplcm8oVHlwZSAqVHkpIHsgcmV0dXJuIGdldENvbnN0YW50KFR5LCAwKTsgfQorCisgIC8vLyBSZXR1cm4gYSBTQ0VWIGZvciB0aGUgY29uc3RhbnQgMSBvZiBhIHNwZWNpZmljIHR5cGUuCisgIGNvbnN0IFNDRVYgKmdldE9uZShUeXBlICpUeSkgeyByZXR1cm4gZ2V0Q29uc3RhbnQoVHksIDEpOyB9CisKKyAgLy8vIFJldHVybiBhbiBleHByZXNzaW9uIGZvciBzaXplb2YgQWxsb2NUeSB0aGF0IGlzIHR5cGUgSW50VHkKKyAgY29uc3QgU0NFViAqZ2V0U2l6ZU9mRXhwcihUeXBlICpJbnRUeSwgVHlwZSAqQWxsb2NUeSk7CisKKyAgLy8vIFJldHVybiBhbiBleHByZXNzaW9uIGZvciBvZmZzZXRvZiBvbiB0aGUgZ2l2ZW4gZmllbGQgd2l0aCB0eXBlIEludFR5CisgIGNvbnN0IFNDRVYgKmdldE9mZnNldE9mRXhwcihUeXBlICpJbnRUeSwgU3RydWN0VHlwZSAqU1R5LCB1bnNpZ25lZCBGaWVsZE5vKTsKKworICAvLy8gUmV0dXJuIHRoZSBTQ0VWIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIC1WLgorICBjb25zdCBTQ0VWICpnZXROZWdhdGl2ZVNDRVYoY29uc3QgU0NFViAqViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDRVY6Ok5vV3JhcEZsYWdzIEZsYWdzID0gU0NFVjo6RmxhZ0FueVdyYXApOworCisgIC8vLyBSZXR1cm4gdGhlIFNDRVYgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gflYuCisgIGNvbnN0IFNDRVYgKmdldE5vdFNDRVYoY29uc3QgU0NFViAqVik7CisKKyAgLy8vIFJldHVybiBMSFMtUkhTLiAgTWludXMgaXMgcmVwcmVzZW50ZWQgaW4gU0NFViBhcyBBK0IqLTEuCisgIGNvbnN0IFNDRVYgKmdldE1pbnVzU0NFVihjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDRVY6Ok5vV3JhcEZsYWdzIEZsYWdzID0gU0NFVjo6RmxhZ0FueVdyYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDApOworCisgIC8vLyBSZXR1cm4gYSBTQ0VWIGNvcnJlc3BvbmRpbmcgdG8gYSBjb252ZXJzaW9uIG9mIHRoZSBpbnB1dCB2YWx1ZSB0byB0aGUKKyAgLy8vIHNwZWNpZmllZCB0eXBlLiAgSWYgdGhlIHR5cGUgbXVzdCBiZSBleHRlbmRlZCwgaXQgaXMgemVybyBleHRlbmRlZC4KKyAgY29uc3QgU0NFViAqZ2V0VHJ1bmNhdGVPclplcm9FeHRlbmQoY29uc3QgU0NFViAqViwgVHlwZSAqVHkpOworCisgIC8vLyBSZXR1cm4gYSBTQ0VWIGNvcnJlc3BvbmRpbmcgdG8gYSBjb252ZXJzaW9uIG9mIHRoZSBpbnB1dCB2YWx1ZSB0byB0aGUKKyAgLy8vIHNwZWNpZmllZCB0eXBlLiAgSWYgdGhlIHR5cGUgbXVzdCBiZSBleHRlbmRlZCwgaXQgaXMgc2lnbiBleHRlbmRlZC4KKyAgY29uc3QgU0NFViAqZ2V0VHJ1bmNhdGVPclNpZ25FeHRlbmQoY29uc3QgU0NFViAqViwgVHlwZSAqVHkpOworCisgIC8vLyBSZXR1cm4gYSBTQ0VWIGNvcnJlc3BvbmRpbmcgdG8gYSBjb252ZXJzaW9uIG9mIHRoZSBpbnB1dCB2YWx1ZSB0byB0aGUKKyAgLy8vIHNwZWNpZmllZCB0eXBlLiAgSWYgdGhlIHR5cGUgbXVzdCBiZSBleHRlbmRlZCwgaXQgaXMgemVybyBleHRlbmRlZC4gIFRoZQorICAvLy8gY29udmVyc2lvbiBtdXN0IG5vdCBiZSBuYXJyb3dpbmcuCisgIGNvbnN0IFNDRVYgKmdldE5vb3BPclplcm9FeHRlbmQoY29uc3QgU0NFViAqViwgVHlwZSAqVHkpOworCisgIC8vLyBSZXR1cm4gYSBTQ0VWIGNvcnJlc3BvbmRpbmcgdG8gYSBjb252ZXJzaW9uIG9mIHRoZSBpbnB1dCB2YWx1ZSB0byB0aGUKKyAgLy8vIHNwZWNpZmllZCB0eXBlLiAgSWYgdGhlIHR5cGUgbXVzdCBiZSBleHRlbmRlZCwgaXQgaXMgc2lnbiBleHRlbmRlZC4gIFRoZQorICAvLy8gY29udmVyc2lvbiBtdXN0IG5vdCBiZSBuYXJyb3dpbmcuCisgIGNvbnN0IFNDRVYgKmdldE5vb3BPclNpZ25FeHRlbmQoY29uc3QgU0NFViAqViwgVHlwZSAqVHkpOworCisgIC8vLyBSZXR1cm4gYSBTQ0VWIGNvcnJlc3BvbmRpbmcgdG8gYSBjb252ZXJzaW9uIG9mIHRoZSBpbnB1dCB2YWx1ZSB0byB0aGUKKyAgLy8vIHNwZWNpZmllZCB0eXBlLiBJZiB0aGUgdHlwZSBtdXN0IGJlIGV4dGVuZGVkLCBpdCBpcyBleHRlbmRlZCB3aXRoCisgIC8vLyB1bnNwZWNpZmllZCBiaXRzLiBUaGUgY29udmVyc2lvbiBtdXN0IG5vdCBiZSBuYXJyb3dpbmcuCisgIGNvbnN0IFNDRVYgKmdldE5vb3BPckFueUV4dGVuZChjb25zdCBTQ0VWICpWLCBUeXBlICpUeSk7CisKKyAgLy8vIFJldHVybiBhIFNDRVYgY29ycmVzcG9uZGluZyB0byBhIGNvbnZlcnNpb24gb2YgdGhlIGlucHV0IHZhbHVlIHRvIHRoZQorICAvLy8gc3BlY2lmaWVkIHR5cGUuICBUaGUgY29udmVyc2lvbiBtdXN0IG5vdCBiZSB3aWRlbmluZy4KKyAgY29uc3QgU0NFViAqZ2V0VHJ1bmNhdGVPck5vb3AoY29uc3QgU0NFViAqViwgVHlwZSAqVHkpOworCisgIC8vLyBQcm9tb3RlIHRoZSBvcGVyYW5kcyB0byB0aGUgd2lkZXIgb2YgdGhlIHR5cGVzIHVzaW5nIHplcm8tZXh0ZW5zaW9uLCBhbmQKKyAgLy8vIHRoZW4gcGVyZm9ybSBhIHVtYXggb3BlcmF0aW9uIHdpdGggdGhlbS4KKyAgY29uc3QgU0NFViAqZ2V0VU1heEZyb21NaXNtYXRjaGVkVHlwZXMoY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMpOworCisgIC8vLyBQcm9tb3RlIHRoZSBvcGVyYW5kcyB0byB0aGUgd2lkZXIgb2YgdGhlIHR5cGVzIHVzaW5nIHplcm8tZXh0ZW5zaW9uLCBhbmQKKyAgLy8vIHRoZW4gcGVyZm9ybSBhIHVtaW4gb3BlcmF0aW9uIHdpdGggdGhlbS4KKyAgY29uc3QgU0NFViAqZ2V0VU1pbkZyb21NaXNtYXRjaGVkVHlwZXMoY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMpOworCisgIC8vLyBUcmFuc2l0aXZlbHkgZm9sbG93IHRoZSBjaGFpbiBvZiBwb2ludGVyLXR5cGUgb3BlcmFuZHMgdW50aWwgcmVhY2hpbmcgYQorICAvLy8gU0NFViB0aGF0IGRvZXMgbm90IGhhdmUgYSBzaW5nbGUgcG9pbnRlciBvcGVyYW5kLiBUaGlzIHJldHVybnMgYQorICAvLy8gU0NFVlVua25vd24gcG9pbnRlciBmb3Igd2VsbC1mb3JtZWQgcG9pbnRlci10eXBlIGV4cHJlc3Npb25zLCBidXQgY29ybmVyCisgIC8vLyBjYXNlcyBkbyBleGlzdC4KKyAgY29uc3QgU0NFViAqZ2V0UG9pbnRlckJhc2UoY29uc3QgU0NFViAqVik7CisKKyAgLy8vIFJldHVybiBhIFNDRVYgZXhwcmVzc2lvbiBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZSBhdCB0aGUgc3BlY2lmaWVkIHNjb3BlCisgIC8vLyBpbiB0aGUgcHJvZ3JhbS4gIFRoZSBMIHZhbHVlIHNwZWNpZmllcyBhIGxvb3AgbmVzdCB0byBldmFsdWF0ZSB0aGUKKyAgLy8vIGV4cHJlc3Npb24gYXQsIHdoZXJlIG51bGwgaXMgdGhlIHRvcC1sZXZlbCBvciBhIHNwZWNpZmllZCBsb29wIGlzCisgIC8vLyBpbW1lZGlhdGVseSBpbnNpZGUgb2YgdGhlIGxvb3AuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY29tcHV0ZSB0aGUgZXhpdCB2YWx1ZSBmb3IgYSB2YXJpYWJsZSBkZWZpbmVkCisgIC8vLyBpbiBhIGxvb3AgYnkgcXVlcnlpbmcgd2hhdCB0aGUgdmFsdWUgd2lsbCBob2xkIGluIHRoZSBwYXJlbnQgbG9vcC4KKyAgLy8vCisgIC8vLyBJbiB0aGUgY2FzZSB0aGF0IGEgcmVsZXZhbnQgbG9vcCBleGl0IHZhbHVlIGNhbm5vdCBiZSBjb21wdXRlZCwgdGhlCisgIC8vLyBvcmlnaW5hbCB2YWx1ZSBWIGlzIHJldHVybmVkLgorICBjb25zdCBTQ0VWICpnZXRTQ0VWQXRTY29wZShjb25zdCBTQ0VWICpTLCBjb25zdCBMb29wICpMKTsKKworICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHdoaWNoIGRvZXMgZ2V0U0NFVkF0U2NvcGUoZ2V0U0NFVihWKSwgTCkuCisgIGNvbnN0IFNDRVYgKmdldFNDRVZBdFNjb3BlKFZhbHVlICpWLCBjb25zdCBMb29wICpMKTsKKworICAvLy8gVGVzdCB3aGV0aGVyIGVudHJ5IHRvIHRoZSBsb29wIGlzIHByb3RlY3RlZCBieSBhIGNvbmRpdGlvbmFsIGJldHdlZW4gTEhTCisgIC8vLyBhbmQgUkhTLiAgVGhpcyBpcyB1c2VkIHRvIGhlbHAgYXZvaWQgbWF4IGV4cHJlc3Npb25zIGluIGxvb3AgdHJpcAorICAvLy8gY291bnRzLCBhbmQgdG8gZWxpbWluYXRlIGNhc3RzLgorICBib29sIGlzTG9vcEVudHJ5R3VhcmRlZEJ5Q29uZChjb25zdCBMb29wICpMLCBJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTKTsKKworICAvLy8gVGVzdCB3aGV0aGVyIHRoZSBiYWNrZWRnZSBvZiB0aGUgbG9vcCBpcyBwcm90ZWN0ZWQgYnkgYSBjb25kaXRpb25hbAorICAvLy8gYmV0d2VlbiBMSFMgYW5kIFJIUy4gIFRoaXMgaXMgdXNlZCB0byBlbGltaW5hdGUgY2FzdHMuCisgIGJvb2wgaXNMb29wQmFja2VkZ2VHdWFyZGVkQnlDb25kKGNvbnN0IExvb3AgKkwsIElDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMpOworCisgIC8vLyBSZXR1cm5zIHRoZSBtYXhpbXVtIHRyaXAgY291bnQgb2YgdGhlIGxvb3AgaWYgaXQgaXMgYSBzaW5nbGUtZXhpdAorICAvLy8gbG9vcCBhbmQgd2UgY2FuIGNvbXB1dGUgYSBzbWFsbCBtYXhpbXVtIGZvciB0aGF0IGxvb3AuCisgIC8vLworICAvLy8gSW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgdGhlIFxjIGdldFNtYWxsQ29uc3RhbnRUcmlwQ291bnQgb3ZlcmxvYWQgd2l0aAorICAvLy8gdGhlIHNpbmdsZSBleGl0aW5nIGJsb2NrIHBhc3NlZCB0byBpdC4gU2VlIHRoYXQgcm91dGluZSBmb3IgZGV0YWlscy4KKyAgdW5zaWduZWQgZ2V0U21hbGxDb25zdGFudFRyaXBDb3VudChjb25zdCBMb29wICpMKTsKKworICAvLy8gUmV0dXJucyB0aGUgbWF4aW11bSB0cmlwIGNvdW50IG9mIHRoaXMgbG9vcCBhcyBhIG5vcm1hbCB1bnNpZ25lZAorICAvLy8gdmFsdWUuIFJldHVybnMgMCBpZiB0aGUgdHJpcCBjb3VudCBpcyB1bmtub3duIG9yIG5vdCBjb25zdGFudC4gVGhpcworICAvLy8gInRyaXAgY291bnQiIGFzc3VtZXMgdGhhdCBjb250cm9sIGV4aXRzIHZpYSBFeGl0aW5nQmxvY2suIE1vcmUKKyAgLy8vIHByZWNpc2VseSwgaXQgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGF0IGNvbnRyb2wgbWF5IHJlYWNoIEV4aXRpbmdCbG9jaworICAvLy8gYmVmb3JlIHRha2luZyB0aGUgYnJhbmNoLiBGb3IgbG9vcHMgd2l0aCBtdWx0aXBsZSBleGl0cywgaXQgbWF5IG5vdCBiZQorICAvLy8gdGhlIG51bWJlciB0aW1lcyB0aGF0IHRoZSBsb29wIGhlYWRlciBleGVjdXRlcyBpZiB0aGUgbG9vcCBleGl0cworICAvLy8gcHJlbWF0dXJlbHkgdmlhIGFub3RoZXIgYnJhbmNoLgorICB1bnNpZ25lZCBnZXRTbWFsbENvbnN0YW50VHJpcENvdW50KGNvbnN0IExvb3AgKkwsIEJhc2ljQmxvY2sgKkV4aXRpbmdCbG9jayk7CisKKyAgLy8vIFJldHVybnMgdGhlIHVwcGVyIGJvdW5kIG9mIHRoZSBsb29wIHRyaXAgY291bnQgYXMgYSBub3JtYWwgdW5zaWduZWQKKyAgLy8vIHZhbHVlLgorICAvLy8gUmV0dXJucyAwIGlmIHRoZSB0cmlwIGNvdW50IGlzIHVua25vd24gb3Igbm90IGNvbnN0YW50LgorICB1bnNpZ25lZCBnZXRTbWFsbENvbnN0YW50TWF4VHJpcENvdW50KGNvbnN0IExvb3AgKkwpOworCisgIC8vLyBSZXR1cm5zIHRoZSBsYXJnZXN0IGNvbnN0YW50IGRpdmlzb3Igb2YgdGhlIHRyaXAgY291bnQgb2YgdGhlCisgIC8vLyBsb29wIGlmIGl0IGlzIGEgc2luZ2xlLWV4aXQgbG9vcCBhbmQgd2UgY2FuIGNvbXB1dGUgYSBzbWFsbCBtYXhpbXVtIGZvcgorICAvLy8gdGhhdCBsb29wLgorICAvLy8KKyAgLy8vIEltcGxlbWVudGVkIGluIHRlcm1zIG9mIHRoZSBcYyBnZXRTbWFsbENvbnN0YW50VHJpcE11bHRpcGxlIG92ZXJsb2FkIHdpdGgKKyAgLy8vIHRoZSBzaW5nbGUgZXhpdGluZyBibG9jayBwYXNzZWQgdG8gaXQuIFNlZSB0aGF0IHJvdXRpbmUgZm9yIGRldGFpbHMuCisgIHVuc2lnbmVkIGdldFNtYWxsQ29uc3RhbnRUcmlwTXVsdGlwbGUoY29uc3QgTG9vcCAqTCk7CisKKyAgLy8vIFJldHVybnMgdGhlIGxhcmdlc3QgY29uc3RhbnQgZGl2aXNvciBvZiB0aGUgdHJpcCBjb3VudCBvZiB0aGlzIGxvb3AgYXMgYQorICAvLy8gbm9ybWFsIHVuc2lnbmVkIHZhbHVlLCBpZiBwb3NzaWJsZS4gVGhpcyBtZWFucyB0aGF0IHRoZSBhY3R1YWwgdHJpcAorICAvLy8gY291bnQgaXMgYWx3YXlzIGEgbXVsdGlwbGUgb2YgdGhlIHJldHVybmVkIHZhbHVlIChkb24ndCBmb3JnZXQgdGhlIHRyaXAKKyAgLy8vIGNvdW50IGNvdWxkIHZlcnkgd2VsbCBiZSB6ZXJvIGFzIHdlbGwhKS4gQXMgZXhwbGFpbmVkIGluIHRoZSBjb21tZW50cworICAvLy8gZm9yIGdldFNtYWxsQ29uc3RhbnRUcmlwQ291bnQsIHRoaXMgYXNzdW1lcyB0aGF0IGNvbnRyb2wgZXhpdHMgdGhlIGxvb3AKKyAgLy8vIHZpYSBFeGl0aW5nQmxvY2suCisgIHVuc2lnbmVkIGdldFNtYWxsQ29uc3RhbnRUcmlwTXVsdGlwbGUoY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpFeGl0aW5nQmxvY2spOworCisgIC8vLyBHZXQgdGhlIGV4cHJlc3Npb24gZm9yIHRoZSBudW1iZXIgb2YgbG9vcCBpdGVyYXRpb25zIGZvciB3aGljaCB0aGlzIGxvb3AKKyAgLy8vIGlzIGd1YXJhbnRlZWQgbm90IHRvIGV4aXQgdmlhIEV4aXRpbmdCbG9jay4gT3RoZXJ3aXNlIHJldHVybgorICAvLy8gU0NFVkNvdWxkTm90Q29tcHV0ZS4KKyAgY29uc3QgU0NFViAqZ2V0RXhpdENvdW50KGNvbnN0IExvb3AgKkwsIEJhc2ljQmxvY2sgKkV4aXRpbmdCbG9jayk7CisKKyAgLy8vIElmIHRoZSBzcGVjaWZpZWQgbG9vcCBoYXMgYSBwcmVkaWN0YWJsZSBiYWNrZWRnZS10YWtlbiBjb3VudCwgcmV0dXJuIGl0LAorICAvLy8gb3RoZXJ3aXNlIHJldHVybiBhIFNDRVZDb3VsZE5vdENvbXB1dGUgb2JqZWN0LiBUaGUgYmFja2VkZ2UtdGFrZW4gY291bnQgaXMKKyAgLy8vIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGxvb3AgaGVhZGVyIHdpbGwgYmUgYnJhbmNoZWQgdG8gZnJvbSB3aXRoaW4gdGhlCisgIC8vLyBsb29wLCBhc3N1bWluZyB0aGVyZSBhcmUgbm8gYWJub3JtYWwgZXhpc3RzIGxpa2UgZXhjZXB0aW9uIHRocm93cy4gVGhpcyBpcworICAvLy8gb25lIGxlc3MgdGhhbiB0aGUgdHJpcCBjb3VudCBvZiB0aGUgbG9vcCwgc2luY2UgaXQgZG9lc24ndCBjb3VudCB0aGUgZmlyc3QKKyAgLy8vIGl0ZXJhdGlvbiwgd2hlbiB0aGUgaGVhZGVyIGlzIGJyYW5jaGVkIHRvIGZyb20gb3V0c2lkZSB0aGUgbG9vcC4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgaXQgaXMgbm90IHZhbGlkIHRvIGNhbGwgdGhpcyBtZXRob2Qgb24gYSBsb29wIHdpdGhvdXQgYQorICAvLy8gbG9vcC1pbnZhcmlhbnQgYmFja2VkZ2UtdGFrZW4gY291bnQgKHNlZQorICAvLy8gaGFzTG9vcEludmFyaWFudEJhY2tlZGdlVGFrZW5Db3VudCkuCisgIGNvbnN0IFNDRVYgKmdldEJhY2tlZGdlVGFrZW5Db3VudChjb25zdCBMb29wICpMKTsKKworICAvLy8gU2ltaWxhciB0byBnZXRCYWNrZWRnZVRha2VuQ291bnQsIGV4Y2VwdCBpdCB3aWxsIGFkZCBhIHNldCBvZgorICAvLy8gU0NFViBwcmVkaWNhdGVzIHRvIFByZWRpY2F0ZXMgdGhhdCBhcmUgcmVxdWlyZWQgdG8gYmUgdHJ1ZSBpbiBvcmRlciBmb3IKKyAgLy8vIHRoZSBhbnN3ZXIgdG8gYmUgY29ycmVjdC4gUHJlZGljYXRlcyBjYW4gYmUgY2hlY2tlZCB3aXRoIHJ1bi10aW1lCisgIC8vLyBjaGVja3MgYW5kIGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gbG9vcCB2ZXJzaW9uaW5nLgorICBjb25zdCBTQ0VWICpnZXRQcmVkaWNhdGVkQmFja2VkZ2VUYWtlbkNvdW50KGNvbnN0IExvb3AgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NFVlVuaW9uUHJlZGljYXRlICZQcmVkaWNhdGVzKTsKKworICAvLy8gV2hlbiBzdWNjZXNzZnVsLCB0aGlzIHJldHVybnMgYSBTQ0VWQ29uc3RhbnQgdGhhdCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwKKyAgLy8vIHRvIChpLmUuIGEgImNvbnNlcnZhdGl2ZSBvdmVyLWFwcHJveGltYXRpb24iKSBvZiB0aGUgdmFsdWUgcmV0dXJlbmQgYnkKKyAgLy8vIGdldEJhY2tlZGdlVGFrZW5Db3VudC4gIElmIHN1Y2ggYSB2YWx1ZSBjYW5ub3QgYmUgY29tcHV0ZWQsIGl0IHJldHVybnMgdGhlCisgIC8vLyBTQ0VWQ291bGROb3RDb21wdXRlIG9iamVjdC4KKyAgY29uc3QgU0NFViAqZ2V0TWF4QmFja2VkZ2VUYWtlbkNvdW50KGNvbnN0IExvb3AgKkwpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgYmFja2VkZ2UgdGFrZW4gY291bnQgaXMgZWl0aGVyIHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICAvLy8gZ2V0TWF4QmFja2VkZ2VUYWtlbkNvdW50IG9yIHplcm8uCisgIGJvb2wgaXNCYWNrZWRnZVRha2VuQ291bnRNYXhPclplcm8oY29uc3QgTG9vcCAqTCk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbG9vcCBoYXMgYW4gYW5hbHl6YWJsZSBsb29wLWludmFyaWFudAorICAvLy8gYmFja2VkZ2UtdGFrZW4gY291bnQuCisgIGJvb2wgaGFzTG9vcEludmFyaWFudEJhY2tlZGdlVGFrZW5Db3VudChjb25zdCBMb29wICpMKTsKKworICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgY2xpZW50IHdoZW4gaXQgaGFzIGNoYW5nZWQgYSBsb29wIGluCisgIC8vLyBhIHdheSB0aGF0IG1heSBlZmZlY3QgU2NhbGFyRXZvbHV0aW9uJ3MgYWJpbGl0eSB0byBjb21wdXRlIGEgdHJpcCBjb3VudCwKKyAgLy8vIG9yIGlmIHRoZSBsb29wIGlzIGRlbGV0ZWQuICBUaGlzIGNhbGwgaXMgcG90ZW50aWFsbHkgZXhwZW5zaXZlIGZvciBsYXJnZQorICAvLy8gbG9vcCBib2RpZXMuCisgIHZvaWQgZm9yZ2V0TG9vcChjb25zdCBMb29wICpMKTsKKworICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgY2xpZW50IHdoZW4gaXQgaGFzIGNoYW5nZWQgYSB2YWx1ZQorICAvLy8gaW4gYSB3YXkgdGhhdCBtYXkgZWZmZWN0IGl0cyB2YWx1ZSwgb3Igd2hpY2ggbWF5IGRpc2Nvbm5lY3QgaXQgZnJvbSBhCisgIC8vLyBkZWYtdXNlIGNoYWluIGxpbmtpbmcgaXQgdG8gYSBsb29wLgorICB2b2lkIGZvcmdldFZhbHVlKFZhbHVlICpWKTsKKworICAvLy8gQ2FsbGVkIHdoZW4gdGhlIGNsaWVudCBoYXMgY2hhbmdlZCB0aGUgZGlzcG9zaXRpb24gb2YgdmFsdWVzIGluCisgIC8vLyB0aGlzIGxvb3AuCisgIC8vLworICAvLy8gV2UgZG9uJ3QgaGF2ZSBhIHdheSB0byBpbnZhbGlkYXRlIHBlci1sb29wIGRpc3Bvc2l0aW9ucy4gQ2xlYXIgYW5kCisgIC8vLyByZWNvbXB1dGUgaXMgc2ltcGxlci4KKyAgdm9pZCBmb3JnZXRMb29wRGlzcG9zaXRpb25zKGNvbnN0IExvb3AgKkwpIHsgTG9vcERpc3Bvc2l0aW9ucy5jbGVhcigpOyB9CisKKyAgLy8vIERldGVybWluZSB0aGUgbWluaW11bSBudW1iZXIgb2YgemVybyBiaXRzIHRoYXQgUyBpcyBndWFyYW50ZWVkIHRvIGVuZCBpbgorICAvLy8gKGF0IGV2ZXJ5IGxvb3AgaXRlcmF0aW9uKS4gIEl0IGlzLCBhdCB0aGUgc2FtZSB0aW1lLCB0aGUgbWluaW11bSBudW1iZXIKKyAgLy8vIG9mIHRpbWVzIFMgaXMgZGl2aXNpYmxlIGJ5IDIuICBGb3IgZXhhbXBsZSwgZ2l2ZW4gezQsKyw4fSBpdCByZXR1cm5zIDIuCisgIC8vLyBJZiBTIGlzIGd1YXJhbnRlZWQgdG8gYmUgMCwgaXQgcmV0dXJucyB0aGUgYml0d2lkdGggb2YgUy4KKyAgdWludDMyX3QgR2V0TWluVHJhaWxpbmdaZXJvcyhjb25zdCBTQ0VWICpTKTsKKworICAvLy8gRGV0ZXJtaW5lIHRoZSB1bnNpZ25lZCByYW5nZSBmb3IgYSBwYXJ0aWN1bGFyIFNDRVYuCisgIC8vLyBOT1RFOiBUaGlzIHJldHVybnMgYSBjb3B5IG9mIHRoZSByZWZlcmVuY2UgcmV0dXJuZWQgYnkgZ2V0UmFuZ2VSZWYuCisgIENvbnN0YW50UmFuZ2UgZ2V0VW5zaWduZWRSYW5nZShjb25zdCBTQ0VWICpTKSB7CisgICAgcmV0dXJuIGdldFJhbmdlUmVmKFMsIEhJTlRfUkFOR0VfVU5TSUdORUQpOworICB9CisKKyAgLy8vIERldGVybWluZSB0aGUgbWluIG9mIHRoZSB1bnNpZ25lZCByYW5nZSBmb3IgYSBwYXJ0aWN1bGFyIFNDRVYuCisgIEFQSW50IGdldFVuc2lnbmVkUmFuZ2VNaW4oY29uc3QgU0NFViAqUykgeworICAgIHJldHVybiBnZXRSYW5nZVJlZihTLCBISU5UX1JBTkdFX1VOU0lHTkVEKS5nZXRVbnNpZ25lZE1pbigpOworICB9CisKKyAgLy8vIERldGVybWluZSB0aGUgbWF4IG9mIHRoZSB1bnNpZ25lZCByYW5nZSBmb3IgYSBwYXJ0aWN1bGFyIFNDRVYuCisgIEFQSW50IGdldFVuc2lnbmVkUmFuZ2VNYXgoY29uc3QgU0NFViAqUykgeworICAgIHJldHVybiBnZXRSYW5nZVJlZihTLCBISU5UX1JBTkdFX1VOU0lHTkVEKS5nZXRVbnNpZ25lZE1heCgpOworICB9CisKKyAgLy8vIERldGVybWluZSB0aGUgc2lnbmVkIHJhbmdlIGZvciBhIHBhcnRpY3VsYXIgU0NFVi4KKyAgLy8vIE5PVEU6IFRoaXMgcmV0dXJucyBhIGNvcHkgb2YgdGhlIHJlZmVyZW5jZSByZXR1cm5lZCBieSBnZXRSYW5nZVJlZi4KKyAgQ29uc3RhbnRSYW5nZSBnZXRTaWduZWRSYW5nZShjb25zdCBTQ0VWICpTKSB7CisgICAgcmV0dXJuIGdldFJhbmdlUmVmKFMsIEhJTlRfUkFOR0VfU0lHTkVEKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgdGhlIG1pbiBvZiB0aGUgc2lnbmVkIHJhbmdlIGZvciBhIHBhcnRpY3VsYXIgU0NFVi4KKyAgQVBJbnQgZ2V0U2lnbmVkUmFuZ2VNaW4oY29uc3QgU0NFViAqUykgeworICAgIHJldHVybiBnZXRSYW5nZVJlZihTLCBISU5UX1JBTkdFX1NJR05FRCkuZ2V0U2lnbmVkTWluKCk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHRoZSBtYXggb2YgdGhlIHNpZ25lZCByYW5nZSBmb3IgYSBwYXJ0aWN1bGFyIFNDRVYuCisgIEFQSW50IGdldFNpZ25lZFJhbmdlTWF4KGNvbnN0IFNDRVYgKlMpIHsKKyAgICByZXR1cm4gZ2V0UmFuZ2VSZWYoUywgSElOVF9SQU5HRV9TSUdORUQpLmdldFNpZ25lZE1heCgpOworICB9CisKKyAgLy8vIFRlc3QgaWYgdGhlIGdpdmVuIGV4cHJlc3Npb24gaXMga25vd24gdG8gYmUgbmVnYXRpdmUuCisgIGJvb2wgaXNLbm93bk5lZ2F0aXZlKGNvbnN0IFNDRVYgKlMpOworCisgIC8vLyBUZXN0IGlmIHRoZSBnaXZlbiBleHByZXNzaW9uIGlzIGtub3duIHRvIGJlIHBvc2l0aXZlLgorICBib29sIGlzS25vd25Qb3NpdGl2ZShjb25zdCBTQ0VWICpTKTsKKworICAvLy8gVGVzdCBpZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBpcyBrbm93biB0byBiZSBub24tbmVnYXRpdmUuCisgIGJvb2wgaXNLbm93bk5vbk5lZ2F0aXZlKGNvbnN0IFNDRVYgKlMpOworCisgIC8vLyBUZXN0IGlmIHRoZSBnaXZlbiBleHByZXNzaW9uIGlzIGtub3duIHRvIGJlIG5vbi1wb3NpdGl2ZS4KKyAgYm9vbCBpc0tub3duTm9uUG9zaXRpdmUoY29uc3QgU0NFViAqUyk7CisKKyAgLy8vIFRlc3QgaWYgdGhlIGdpdmVuIGV4cHJlc3Npb24gaXMga25vd24gdG8gYmUgbm9uLXplcm8uCisgIGJvb2wgaXNLbm93bk5vblplcm8oY29uc3QgU0NFViAqUyk7CisKKyAgLy8vIFNwbGl0cyBTQ0VWIGV4cHJlc3Npb24gXHAgUyBpbnRvIHR3byBTQ0VWcy4gT25lIG9mIHRoZW0gaXMgb2J0YWluZWQgZnJvbQorICAvLy8gXHAgUyBieSBzdWJzdGl0dXRpb24gb2YgYWxsIEFkZFJlYyBzdWItZXhwcmVzc2lvbiByZWxhdGVkIHRvIGxvb3AgXHAgTAorICAvLy8gd2l0aCBpbml0aWFsIHZhbHVlIG9mIHRoYXQgU0NFVi4gVGhlIHNlY29uZCBpcyBvYnRhaW5lZCBmcm9tIFxwIFMgYnkKKyAgLy8vIHN1YnN0aXR1dGlvbiBvZiBhbGwgQWRkUmVjIHN1Yi1leHByZXNzaW9ucyByZWxhdGVkIHRvIGxvb3AgXHAgTCB3aXRoIHBvc3QKKyAgLy8vIGluY3JlbWVudCBvZiB0aGlzIEFkZFJlYyBpbiB0aGUgbG9vcCBccCBMLiBJbiBib3RoIGNhc2VzIGFsbCBvdGhlciBBZGRSZWMKKyAgLy8vIHN1Yi1leHByZXNzaW9ucyAobm90IHJlbGF0ZWQgdG8gXHAgTCkgcmVtYWluIHRoZSBzYW1lLgorICAvLy8gSWYgdGhlIFxwIFMgY29udGFpbnMgbm9uLWludmFyaWFudCB1bmtub3duIFNDRVYgdGhlIGZ1bmN0aW9uIHJldHVybnMKKyAgLy8vIENvdWxkTm90Q29tcHV0ZSBTQ0VWIGluIGJvdGggdmFsdWVzIG9mIHN0ZDo6cGFpci4KKyAgLy8vIEZvciBleGFtcGxlLCBmb3IgU0NFViBTPXswLCArLCAxfTxMMT4gKyB7MCwgKywgMX08TDI+IGFuZCBsb29wIEw9TDEKKyAgLy8vIHRoZSBmdW5jdGlvbiByZXR1cm5zIHBhaXI6CisgIC8vLyBmaXJzdCA9IHswLCArLCAxfTxMMj4KKyAgLy8vIHNlY29uZCA9IHsxLCArLCAxfTxMMT4gKyB7MCwgKywgMX08TDI+CisgIC8vLyBXZSBjYW4gc2VlIHRoYXQgZm9yIHRoZSBmaXJzdCBBZGRSZWMgc3ViLWV4cHJlc3Npb24gaXQgd2FzIHJlcGxhY2VkIHdpdGgKKyAgLy8vIDAgKGluaXRpYWwgdmFsdWUpIGZvciB0aGUgZmlyc3QgZWxlbWVudCBhbmQgdG8gezEsICssIDF9PEwxPiAocG9zdAorICAvLy8gaW5jcmVtZW50IHZhbHVlKSBmb3IgdGhlIHNlY29uZCBvbmUuIEluIGJvdGggY2FzZXMgQWRkUmVjIGV4cHJlc3Npb24KKyAgLy8vIHJlbGF0ZWQgdG8gTDIgcmVtYWlucyB0aGUgc2FtZS4KKyAgc3RkOjpwYWlyPGNvbnN0IFNDRVYgKiwgY29uc3QgU0NFViAqPiBTcGxpdEludG9Jbml0QW5kUG9zdEluYyhjb25zdCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlMpOworCisgIC8vLyBXZSdkIGxpa2UgdG8gY2hlY2sgdGhlIHByZWRpY2F0ZSBvbiBldmVyeSBpdGVyYXRpb24gb2YgdGhlIG1vc3QgZG9taW5hdGVkCisgIC8vLyBsb29wIGJldHdlZW4gbG9vcHMgdXNlZCBpbiBMSFMgYW5kIFJIUy4KKyAgLy8vIFRvIGRvIHRoaXMgd2UgdXNlIHRoZSBmb2xsb3dpbmcgbGlzdCBvZiBzdGVwczoKKyAgLy8vIDEuIENvbGxlY3Qgc2V0IFMgYWxsIGxvb3BzIG9uIHdoaWNoIGVpdGhlciBMSFMgb3IgUkhTIGRlcGVuZC4KKyAgLy8vIDIuIElmIFMgaXMgbm9uLWVtcHR5CisgIC8vLyBhLiBMZXQgUEQgYmUgdGhlIGVsZW1lbnQgb2YgUyB3aGljaCBpcyBkb21pbmF0ZWQgYnkgYWxsIG90aGVyIGVsZW1lbnRzLgorICAvLy8gYi4gTGV0IEUoTEhTKSBiZSB2YWx1ZSBvZiBMSFMgb24gZW50cnkgb2YgUEQuCisgIC8vLyAgICBUbyBnZXQgRShMSFMpLCB3ZSBzaG91bGQganVzdCB0YWtlIExIUyBhbmQgcmVwbGFjZSBhbGwgQWRkUmVjcyB0aGF0IGFyZQorICAvLy8gICAgYXR0YWNoZWQgdG8gUEQgb24gd2l0aCB0aGVpciBlbnRyeSB2YWx1ZXMuCisgIC8vLyAgICBEZWZpbmUgRShSSFMpIGluIHRoZSBzYW1lIHdheS4KKyAgLy8vIGMuIExldCBCKExIUykgYmUgdmFsdWUgb2YgTCBvbiBiYWNrZWRnZSBvZiBQRC4KKyAgLy8vICAgIFRvIGdldCBCKExIUyksIHdlIHNob3VsZCBqdXN0IHRha2UgTEhTIGFuZCByZXBsYWNlIGFsbCBBZGRSZWNzIHRoYXQgYXJlCisgIC8vLyAgICBhdHRhY2hlZCB0byBQRCBvbiB3aXRoIHRoZWlyIGJhY2tlZGdlIHZhbHVlcy4KKyAgLy8vICAgIERlZmluZSBCKFJIUykgaW4gdGhlIHNhbWUgd2F5LgorICAvLy8gZC4gTm90ZSB0aGF0IEUoTEhTKSBhbmQgRShSSFMpIGFyZSBhdXRvbWF0aWNhbGx5IGF2YWlsYWJsZSBvbiBlbnRyeSBvZiBQRCwKKyAgLy8vICAgIHNvIHdlIGNhbiBhc3NlcnQgb24gdGhhdC4KKyAgLy8vIGUuIFJldHVybiB0cnVlIGlmIGlzTG9vcEVudHJ5R3VhcmRlZEJ5Q29uZChQcmVkLCBFKExIUyksIEUoUkhTKSkgJiYKKyAgLy8vICAgICAgICAgICAgICAgICAgIGlzTG9vcEJhY2tlZGdlR3VhcmRlZEJ5Q29uZChQcmVkLCBCKExIUyksIEIoUkhTKSkKKyAgYm9vbCBpc0tub3duVmlhSW5kdWN0aW9uKElDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCwgY29uc3QgU0NFViAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqUkhTKTsKKworICAvLy8gVGVzdCBpZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBpcyBrbm93biB0byBzYXRpc2Z5IHRoZSBjb25kaXRpb24gZGVzY3JpYmVkCisgIC8vLyBieSBQcmVkLCBMSFMsIGFuZCBSSFMuCisgIGJvb2wgaXNLbm93blByZWRpY2F0ZShJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsIGNvbnN0IFNDRVYgKkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlJIUyk7CisKKyAgLy8vIFRlc3QgaWYgdGhlIGNvbmRpdGlvbiBkZXNjcmliZWQgYnkgUHJlZCwgTEhTLCBSSFMgaXMga25vd24gdG8gYmUgdHJ1ZSBvbgorICAvLy8gZXZlcnkgaXRlcmF0aW9uIG9mIHRoZSBsb29wIG9mIHRoZSByZWN1cnJlbmN5IExIUy4KKyAgYm9vbCBpc0tub3duT25FdmVyeUl0ZXJhdGlvbihJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFVkFkZFJlY0V4cHIgKkxIUywgY29uc3QgU0NFViAqUkhTKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYsIGZvciBhbGwgbG9vcCBpbnZhcmlhbnQgWCwgdGhlIHByZWRpY2F0ZSAiTEhTIGBQcmVkYCBYIgorICAvLy8gaXMgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nIG9yIGRlY3JlYXNpbmcuICBJbiB0aGUgZm9ybWVyIGNhc2Ugc2V0CisgIC8vLyBgSW5jcmVhc2luZ2AgdG8gdHJ1ZSBhbmQgaW4gdGhlIGxhdHRlciBjYXNlIHNldCBgSW5jcmVhc2luZ2AgdG8gZmFsc2UuCisgIC8vLworICAvLy8gQSBwcmVkaWNhdGUgaXMgc2FpZCB0byBiZSBtb25vdG9uaWNhbGx5IGluY3JlYXNpbmcgaWYgbWF5IGdvIGZyb20gYmVpbmcKKyAgLy8vIGZhbHNlIHRvIGJlaW5nIHRydWUgYXMgdGhlIGxvb3AgaXRlcmF0ZXMsIGJ1dCBuZXZlciB0aGUgb3RoZXIgd2F5CisgIC8vLyBhcm91bmQuICBBIHByZWRpY2F0ZSBpcyBzYWlkIHRvIGJlIG1vbm90b25pY2FsbHkgZGVjcmVhc2luZyBpZiBtYXkgZ28KKyAgLy8vIGZyb20gYmVpbmcgdHJ1ZSB0byBiZWluZyBmYWxzZSBhcyB0aGUgbG9vcCBpdGVyYXRlcywgYnV0IG5ldmVyIHRoZSBvdGhlcgorICAvLy8gd2F5IGFyb3VuZC4KKyAgYm9vbCBpc01vbm90b25pY1ByZWRpY2F0ZShjb25zdCBTQ0VWQWRkUmVjRXhwciAqTEhTLCBJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmSW5jcmVhc2luZyk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSByZXN1bHQgb2YgdGhlIHByZWRpY2F0ZSBMSFMgYFByZWRgIFJIUyBpcyBsb29wCisgIC8vLyBpbnZhcmlhbnQgd2l0aCByZXNwZWN0IHRvIEwuICBTZXQgSW52YXJpYW50UHJlZCwgSW52YXJpYW50TEhTIGFuZAorICAvLy8gSW52YXJpYW50TEhTIHNvIHRoYXQgSW52YXJpYW50TEhTIGBJbnZhcmlhbnRQcmVkYCBJbnZhcmlhbnRSSFMgaXMgdGhlCisgIC8vLyBsb29wIGludmFyaWFudCBmb3JtIG9mIExIUyBgUHJlZGAgUkhTLgorICBib29sIGlzTG9vcEludmFyaWFudFByZWRpY2F0ZShJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsIGNvbnN0IFNDRVYgKkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqUkhTLCBjb25zdCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ21wSW5zdDo6UHJlZGljYXRlICZJbnZhcmlhbnRQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWIComSW52YXJpYW50TEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWIComSW52YXJpYW50UkhTKTsKKworICAvLy8gU2ltcGxpZnkgTEhTIGFuZCBSSFMgaW4gYSBjb21wYXJpc29uIHdpdGggcHJlZGljYXRlIFByZWQuIFJldHVybiB0cnVlCisgIC8vLyBpZmYgYW55IGNoYW5nZXMgd2VyZSBtYWRlLiBJZiB0aGUgb3BlcmFuZHMgYXJlIHByb3ZhYmx5IGVxdWFsIG9yCisgIC8vLyB1bmVxdWFsLCBMSFMgYW5kIFJIUyBhcmUgc2V0IHRvIHRoZSBzYW1lIHZhbHVlIGFuZCBQcmVkIGlzIHNldCB0byBlaXRoZXIKKyAgLy8vIElDTVBfRVEgb3IgSUNNUF9ORS4KKyAgYm9vbCBTaW1wbGlmeUlDbXBPcGVyYW5kcyhJQ21wSW5zdDo6UHJlZGljYXRlICZQcmVkLCBjb25zdCBTQ0VWIComTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKiZSSFMsIHVuc2lnbmVkIERlcHRoID0gMCk7CisKKyAgLy8vIFJldHVybiB0aGUgImRpc3Bvc2l0aW9uIiBvZiB0aGUgZ2l2ZW4gU0NFViB3aXRoIHJlc3BlY3QgdG8gdGhlIGdpdmVuCisgIC8vLyBsb29wLgorICBMb29wRGlzcG9zaXRpb24gZ2V0TG9vcERpc3Bvc2l0aW9uKGNvbnN0IFNDRVYgKlMsIGNvbnN0IExvb3AgKkwpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIFNDRVYgaXMgdW5jaGFuZ2luZyBpbiB0aGUKKyAgLy8vIHNwZWNpZmllZCBsb29wLgorICBib29sIGlzTG9vcEludmFyaWFudChjb25zdCBTQ0VWICpTLCBjb25zdCBMb29wICpMKTsKKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBTQ0VWIGNhbiBiZSBldmFsdWF0ZWQgYXQgbG9vcCdzIGVudHJ5LiBJdCBpcyB0cnVlIGlmIGl0CisgIC8vLyBkb2Vzbid0IGRlcGVuZCBvbiBhIFNDRVZVbmtub3duIG9mIGFuIGluc3RydWN0aW9uIHdoaWNoIGlzIGRvbWluYXRlZCBieQorICAvLy8gdGhlIGhlYWRlciBvZiBsb29wIEwuCisgIGJvb2wgaXNBdmFpbGFibGVBdExvb3BFbnRyeShjb25zdCBTQ0VWICpTLCBjb25zdCBMb29wICpMKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIFNDRVYgY2hhbmdlcyB2YWx1ZSBpbiBhIGtub3duIHdheSBpbiB0aGUKKyAgLy8vIHNwZWNpZmllZCBsb29wLiAgVGhpcyBwcm9wZXJ0eSBiZWluZyB0cnVlIGltcGxpZXMgdGhhdCB0aGUgdmFsdWUgaXMKKyAgLy8vIHZhcmlhbnQgaW4gdGhlIGxvb3AgQU5EIHRoYXQgd2UgY2FuIGVtaXQgYW4gZXhwcmVzc2lvbiB0byBjb21wdXRlIHRoZQorICAvLy8gdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24gYXQgYW55IHBhcnRpY3VsYXIgbG9vcCBpdGVyYXRpb24uCisgIGJvb2wgaGFzQ29tcHV0YWJsZUxvb3BFdm9sdXRpb24oY29uc3QgU0NFViAqUywgY29uc3QgTG9vcCAqTCk7CisKKyAgLy8vIFJldHVybiB0aGUgImRpc3Bvc2l0aW9uIiBvZiB0aGUgZ2l2ZW4gU0NFViB3aXRoIHJlc3BlY3QgdG8gdGhlIGdpdmVuCisgIC8vLyBibG9jay4KKyAgQmxvY2tEaXNwb3NpdGlvbiBnZXRCbG9ja0Rpc3Bvc2l0aW9uKGNvbnN0IFNDRVYgKlMsIGNvbnN0IEJhc2ljQmxvY2sgKkJCKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgZWxlbWVudHMgdGhhdCBtYWtlcyB1cCB0aGUgZ2l2ZW4gU0NFViBkb21pbmF0ZSB0aGUKKyAgLy8vIHNwZWNpZmllZCBiYXNpYyBibG9jay4KKyAgYm9vbCBkb21pbmF0ZXMoY29uc3QgU0NFViAqUywgY29uc3QgQmFzaWNCbG9jayAqQkIpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBlbGVtZW50cyB0aGF0IG1ha2VzIHVwIHRoZSBnaXZlbiBTQ0VWIHByb3Blcmx5IGRvbWluYXRlCisgIC8vLyB0aGUgc3BlY2lmaWVkIGJhc2ljIGJsb2NrLgorICBib29sIHByb3Blcmx5RG9taW5hdGVzKGNvbnN0IFNDRVYgKlMsIGNvbnN0IEJhc2ljQmxvY2sgKkJCKTsKKworICAvLy8gVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBTQ0VWIGhhcyBPcCBhcyBhIGRpcmVjdCBvciBpbmRpcmVjdCBvcGVyYW5kLgorICBib29sIGhhc09wZXJhbmQoY29uc3QgU0NFViAqUywgY29uc3QgU0NFViAqT3ApIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIHNpemUgb2YgYW4gZWxlbWVudCByZWFkIG9yIHdyaXR0ZW4gYnkgSW5zdC4KKyAgY29uc3QgU0NFViAqZ2V0RWxlbWVudFNpemUoSW5zdHJ1Y3Rpb24gKkluc3QpOworCisgIC8vLyBDb21wdXRlIHRoZSBhcnJheSBkaW1lbnNpb25zIFNpemVzIGZyb20gdGhlIHNldCBvZiBUZXJtcyBleHRyYWN0ZWQgZnJvbQorICAvLy8gdGhlIG1lbW9yeSBhY2Nlc3MgZnVuY3Rpb24gb2YgdGhpcyBTQ0VWQWRkUmVjRXhwciAoc2Vjb25kIHN0ZXAgb2YKKyAgLy8vIGRlbGluZWFyaXphdGlvbikuCisgIHZvaWQgZmluZEFycmF5RGltZW5zaW9ucyhTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPiAmVGVybXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPiAmU2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpFbGVtZW50U2l6ZSk7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIHZlcmlmeSgpIGNvbnN0OworICBib29sIGludmFsaWRhdGUoRnVuY3Rpb24gJkYsIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzICZQQSwKKyAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyOjpJbnZhbGlkYXRvciAmSW52KTsKKworICAvLy8gQ29sbGVjdCBwYXJhbWV0cmljIHRlcm1zIG9jY3VycmluZyBpbiBzdGVwIGV4cHJlc3Npb25zIChmaXJzdCBzdGVwIG9mCisgIC8vLyBkZWxpbmVhcml6YXRpb24pLgorICB2b2lkIGNvbGxlY3RQYXJhbWV0cmljVGVybXMoY29uc3QgU0NFViAqRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjb25zdCBTQ0VWICo+ICZUZXJtcyk7CisKKyAgLy8vIFJldHVybiBpbiBTdWJzY3JpcHRzIHRoZSBhY2Nlc3MgZnVuY3Rpb25zIGZvciBlYWNoIGRpbWVuc2lvbiBpbiBTaXplcworICAvLy8gKHRoaXJkIHN0ZXAgb2YgZGVsaW5lYXJpemF0aW9uKS4KKyAgdm9pZCBjb21wdXRlQWNjZXNzRnVuY3Rpb25zKGNvbnN0IFNDRVYgKkV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPiAmU3Vic2NyaXB0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjb25zdCBTQ0VWICo+ICZTaXplcyk7CisKKyAgLy8vIFNwbGl0IHRoaXMgU0NFVkFkZFJlY0V4cHIgaW50byB0d28gdmVjdG9ycyBvZiBTQ0VWcyByZXByZXNlbnRpbmcgdGhlCisgIC8vLyBzdWJzY3JpcHRzIGFuZCBzaXplcyBvZiBhbiBhcnJheSBhY2Nlc3MuCisgIC8vLworICAvLy8gVGhlIGRlbGluZWFyaXphdGlvbiBpcyBhIDMgc3RlcCBwcm9jZXNzOiB0aGUgZmlyc3QgdHdvIHN0ZXBzIGNvbXB1dGUgdGhlCisgIC8vLyBzaXplcyBvZiBlYWNoIHN1YnNjcmlwdCBhbmQgdGhlIHRoaXJkIHN0ZXAgY29tcHV0ZXMgdGhlIGFjY2VzcyBmdW5jdGlvbnMKKyAgLy8vIGZvciB0aGUgZGVsaW5lYXJpemVkIGFycmF5OgorICAvLy8KKyAgLy8vIDEuIEZpbmQgdGhlIHRlcm1zIGluIHRoZSBzdGVwIGZ1bmN0aW9ucworICAvLy8gMi4gQ29tcHV0ZSB0aGUgYXJyYXkgc2l6ZQorICAvLy8gMy4gQ29tcHV0ZSB0aGUgYWNjZXNzIGZ1bmN0aW9uOiBkaXZpZGUgdGhlIFNDRVYgYnkgdGhlIGFycmF5IHNpemUKKyAgLy8vICAgIHN0YXJ0aW5nIHdpdGggdGhlIGlubmVybW9zdCBkaW1lbnNpb25zIGZvdW5kIGluIHN0ZXAgMi4gVGhlIFF1b3RpZW50CisgIC8vLyAgICBpcyB0aGUgU0NFViB0byBiZSBkaXZpZGVkIGluIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIHJlY3Vyc2lvbi4gVGhlCisgIC8vLyAgICBSZW1haW5kZXIgaXMgdGhlIHN1YnNjcmlwdCBvZiB0aGUgaW5uZXJtb3N0IGRpbWVuc2lvbi4gTG9vcCBvdmVyIGFsbAorICAvLy8gICAgYXJyYXkgZGltZW5zaW9ucyBjb21wdXRlZCBpbiBzdGVwIDIuCisgIC8vLworICAvLy8gVG8gY29tcHV0ZSBhIHVuaWZvcm0gYXJyYXkgc2l6ZSBmb3Igc2V2ZXJhbCBtZW1vcnkgYWNjZXNzZXMgdG8gdGhlIHNhbWUKKyAgLy8vIG9iamVjdCwgb25lIGNhbiBjb2xsZWN0IGluIHN0ZXAgMSBhbGwgdGhlIHN0ZXAgdGVybXMgZm9yIGFsbCB0aGUgbWVtb3J5CisgIC8vLyBhY2Nlc3NlcywgYW5kIGNvbXB1dGUgaW4gc3RlcCAyIGEgdW5pcXVlIGFycmF5IHNoYXBlLiBUaGlzIGd1YXJhbnRlZXMKKyAgLy8vIHRoYXQgdGhlIGFycmF5IHNoYXBlIHdpbGwgYmUgdGhlIHNhbWUgYWNyb3NzIGFsbCBtZW1vcnkgYWNjZXNzZXMuCisgIC8vLworICAvLy8gRklYTUU6IFdlIGNvdWxkIGRlcml2ZSB0aGUgcmVzdWx0IG9mIHN0ZXBzIDEgYW5kIDIgZnJvbSBhIGRlc2NyaXB0aW9uIG9mCisgIC8vLyB0aGUgYXJyYXkgc2hhcGUgZ2l2ZW4gaW4gbWV0YWRhdGEuCisgIC8vLworICAvLy8gRXhhbXBsZToKKyAgLy8vCisgIC8vLyBBW11bbl1bbV0KKyAgLy8vCisgIC8vLyBmb3IgaQorICAvLy8gICBmb3IgagorICAvLy8gICAgIGZvciBrCisgIC8vLyAgICAgICBBW2ora11bMmldWzVpXSA9CisgIC8vLworICAvLy8gVGhlIGluaXRpYWwgU0NFVjoKKyAgLy8vCisgIC8vLyBBW3t7ezAsKywyKm0rNX1faSwgKywgbiptfV9qLCArLCBuKm19X2tdCisgIC8vLworICAvLy8gMS4gRmluZCB0aGUgZGlmZmVyZW50IHRlcm1zIGluIHRoZSBzdGVwIGZ1bmN0aW9uczoKKyAgLy8vIC0+IFsyKm0sIDUsIG4qbSwgbiptXQorICAvLy8KKyAgLy8vIDIuIENvbXB1dGUgdGhlIGFycmF5IHNpemU6IHNvcnQgYW5kIHVuaXF1ZSB0aGVtCisgIC8vLyAtPiBbbiptLCAyKm0sIDVdCisgIC8vLyBmaW5kIHRoZSBHQ0Qgb2YgYWxsIHRoZSB0ZXJtcyA9IDEKKyAgLy8vIGRpdmlkZSBieSB0aGUgR0NEIGFuZCBlcmFzZSBjb25zdGFudCB0ZXJtcworICAvLy8gLT4gW24qbSwgMiptXQorICAvLy8gR0NEID0gbQorICAvLy8gZGl2aWRlIGJ5IEdDRCAtPiBbbiwgMl0KKyAgLy8vIHJlbW92ZSBjb25zdGFudCB0ZXJtcworICAvLy8gLT4gW25dCisgIC8vLyBzaXplIG9mIHRoZSBhcnJheSBpcyBBW3Vua25vd25dW25dW21dCisgIC8vLworICAvLy8gMy4gQ29tcHV0ZSB0aGUgYWNjZXNzIGZ1bmN0aW9uCisgIC8vLyBhLiBEaXZpZGUge3t7MCwrLDIqbSs1fV9pLCArLCBuKm19X2osICssIG4qbX1fayBieSB0aGUgaW5uZXJtb3N0IHNpemUgbQorICAvLy8gUXVvdGllbnQ6IHt7ezAsKywyfV9pLCArLCBufV9qLCArLCBufV9rCisgIC8vLyBSZW1haW5kZXI6IHt7ezAsKyw1fV9pLCArLCAwfV9qLCArLCAwfV9rCisgIC8vLyBUaGUgcmVtYWluZGVyIGlzIHRoZSBzdWJzY3JpcHQgb2YgdGhlIGlubmVybW9zdCBhcnJheSBkaW1lbnNpb246IFs1aV0uCisgIC8vLworICAvLy8gYi4gRGl2aWRlIFF1b3RpZW50OiB7e3swLCssMn1faSwgKywgbn1faiwgKywgbn1fayBieSBuZXh0IG91dGVyIHNpemUgbgorICAvLy8gUXVvdGllbnQ6IHt7ezAsKywwfV9pLCArLCAxfV9qLCArLCAxfV9rCisgIC8vLyBSZW1haW5kZXI6IHt7ezAsKywyfV9pLCArLCAwfV9qLCArLCAwfV9rCisgIC8vLyBUaGUgUmVtYWluZGVyIGlzIHRoZSBzdWJzY3JpcHQgb2YgdGhlIG5leHQgYXJyYXkgZGltZW5zaW9uOiBbMmldLgorICAvLy8KKyAgLy8vIFRoZSBzdWJzY3JpcHQgb2YgdGhlIG91dGVybW9zdCBkaW1lbnNpb24gaXMgdGhlIFF1b3RpZW50OiBbaitrXS4KKyAgLy8vCisgIC8vLyBPdmVyYWxsLCB3ZSBoYXZlOiBBW11bbl1bbV0sIGFuZCB0aGUgYWNjZXNzIGZ1bmN0aW9uOiBBW2ora11bMmldWzVpXS4KKyAgdm9pZCBkZWxpbmVhcml6ZShjb25zdCBTQ0VWICpFeHByLCBTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPiAmU3Vic2NyaXB0cywKKyAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPiAmU2l6ZXMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRWxlbWVudFNpemUpOworCisgIC8vLyBSZXR1cm4gdGhlIERhdGFMYXlvdXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBtb2R1bGUgdGhpcyBTQ0VWIGluc3RhbmNlIGlzCisgIC8vLyBvcGVyYXRpbmcgb24uCisgIGNvbnN0IERhdGFMYXlvdXQgJmdldERhdGFMYXlvdXQoKSBjb25zdCB7CisgICAgcmV0dXJuIEYuZ2V0UGFyZW50KCktPmdldERhdGFMYXlvdXQoKTsKKyAgfQorCisgIGNvbnN0IFNDRVZQcmVkaWNhdGUgKmdldEVxdWFsUHJlZGljYXRlKGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTKTsKKworICBjb25zdCBTQ0VWUHJlZGljYXRlICoKKyAgZ2V0V3JhcFByZWRpY2F0ZShjb25zdCBTQ0VWQWRkUmVjRXhwciAqQVIsCisgICAgICAgICAgICAgICAgICAgU0NFVldyYXBQcmVkaWNhdGU6OkluY3JlbWVudFdyYXBGbGFncyBBZGRlZEZsYWdzKTsKKworICAvLy8gUmUtd3JpdGVzIHRoZSBTQ0VWIGFjY29yZGluZyB0byB0aGUgUHJlZGljYXRlcyBpbiBccCBBLgorICBjb25zdCBTQ0VWICpyZXdyaXRlVXNpbmdQcmVkaWNhdGUoY29uc3QgU0NFViAqUywgY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNDRVZVbmlvblByZWRpY2F0ZSAmQSk7CisgIC8vLyBUcmllcyB0byBjb252ZXJ0IHRoZSBccCBTIGV4cHJlc3Npb24gdG8gYW4gQWRkUmVjIGV4cHJlc3Npb24sCisgIC8vLyBhZGRpbmcgYWRkaXRpb25hbCBwcmVkaWNhdGVzIHRvIFxwIFByZWRzIGFzIHJlcXVpcmVkLgorICBjb25zdCBTQ0VWQWRkUmVjRXhwciAqY29udmVydFNDRVZUb0FkZFJlY1dpdGhQcmVkaWNhdGVzKAorICAgICAgY29uc3QgU0NFViAqUywgY29uc3QgTG9vcCAqTCwKKyAgICAgIFNtYWxsUHRyU2V0SW1wbDxjb25zdCBTQ0VWUHJlZGljYXRlICo+ICZQcmVkcyk7CisKK3ByaXZhdGU6CisgIC8vLyBBIENhbGxiYWNrVkggdG8gYXJyYW5nZSBmb3IgU2NhbGFyRXZvbHV0aW9uIHRvIGJlIG5vdGlmaWVkIHdoZW5ldmVyIGEKKyAgLy8vIFZhbHVlIGlzIGRlbGV0ZWQuCisgIGNsYXNzIFNDRVZDYWxsYmFja1ZIIGZpbmFsIDogcHVibGljIENhbGxiYWNrVkggeworICAgIFNjYWxhckV2b2x1dGlvbiAqU0U7CisKKyAgICB2b2lkIGRlbGV0ZWQoKSBvdmVycmlkZTsKKyAgICB2b2lkIGFsbFVzZXNSZXBsYWNlZFdpdGgoVmFsdWUgKk5ldykgb3ZlcnJpZGU7CisKKyAgcHVibGljOgorICAgIFNDRVZDYWxsYmFja1ZIKFZhbHVlICpWLCBTY2FsYXJFdm9sdXRpb24gKlNFID0gbnVsbHB0cik7CisgIH07CisKKyAgZnJpZW5kIGNsYXNzIFNDRVZDYWxsYmFja1ZIOworICBmcmllbmQgY2xhc3MgU0NFVkV4cGFuZGVyOworICBmcmllbmQgY2xhc3MgU0NFVlVua25vd247CisKKyAgLy8vIFRoZSBmdW5jdGlvbiB3ZSBhcmUgYW5hbHl6aW5nLgorICBGdW5jdGlvbiAmRjsKKworICAvLy8gRG9lcyB0aGUgbW9kdWxlIGhhdmUgYW55IGNhbGxzIHRvIHRoZSBsbHZtLmV4cGVyaW1lbnRhbC5ndWFyZCBpbnRyaW5zaWMKKyAgLy8vIGF0IGFsbD8gIElmIHRoaXMgaXMgZmFsc2UsIHdlIGF2b2lkIGRvaW5nIHdvcmsgdGhhdCB3aWxsIG9ubHkgaGVscCBpZgorICAvLy8gdGhhcmUgYXJlIGd1YXJkcyBwcmVzZW50IGluIHRoZSBJUi4KKyAgYm9vbCBIYXNHdWFyZHM7CisKKyAgLy8vIFRoZSB0YXJnZXQgbGlicmFyeSBpbmZvcm1hdGlvbiBmb3IgdGhlIHRhcmdldCB3ZSBhcmUgdGFyZ2V0aW5nLgorICBUYXJnZXRMaWJyYXJ5SW5mbyAmVExJOworCisgIC8vLyBUaGUgdHJhY2tlciBmb3IgQGxsdm0uYXNzdW1lIGludHJpbnNpY3MgaW4gdGhpcyBmdW5jdGlvbi4KKyAgQXNzdW1wdGlvbkNhY2hlICZBQzsKKworICAvLy8gVGhlIGRvbWluYXRvciB0cmVlLgorICBEb21pbmF0b3JUcmVlICZEVDsKKworICAvLy8gVGhlIGxvb3AgaW5mb3JtYXRpb24gZm9yIHRoZSBmdW5jdGlvbiB3ZSBhcmUgY3VycmVudGx5IGFuYWx5emluZy4KKyAgTG9vcEluZm8gJkxJOworCisgIC8vLyBUaGlzIFNDRVYgaXMgdXNlZCB0byByZXByZXNlbnQgdW5rbm93biB0cmlwIGNvdW50cyBhbmQgdGhpbmdzLgorICBzdGQ6OnVuaXF1ZV9wdHI8U0NFVkNvdWxkTm90Q29tcHV0ZT4gQ291bGROb3RDb21wdXRlOworCisgIC8vLyBUaGUgdHlwZSBmb3IgSGFzUmVjTWFwLgorICB1c2luZyBIYXNSZWNNYXBUeXBlID0gRGVuc2VNYXA8Y29uc3QgU0NFViAqLCBib29sPjsKKworICAvLy8gVGhpcyBpcyBhIGNhY2hlIHRvIHJlY29yZCB3aGV0aGVyIGEgU0NFViBjb250YWlucyBhbnkgc2NBZGRSZWNFeHByLgorICBIYXNSZWNNYXBUeXBlIEhhc1JlY01hcDsKKworICAvLy8gVGhlIHR5cGUgZm9yIEV4cHJWYWx1ZU1hcC4KKyAgdXNpbmcgVmFsdWVPZmZzZXRQYWlyID0gc3RkOjpwYWlyPFZhbHVlICosIENvbnN0YW50SW50ICo+OworICB1c2luZyBFeHByVmFsdWVNYXBUeXBlID0gRGVuc2VNYXA8Y29uc3QgU0NFViAqLCBTZXRWZWN0b3I8VmFsdWVPZmZzZXRQYWlyPj47CisKKyAgLy8vIEV4cHJWYWx1ZU1hcCAtLSBUaGlzIG1hcCByZWNvcmRzIHRoZSBvcmlnaW5hbCB2YWx1ZXMgZnJvbSB3aGljaAorICAvLy8gdGhlIFNDRVYgZXhwciBpcyBnZW5lcmF0ZWQgZnJvbS4KKyAgLy8vCisgIC8vLyBXZSB3YW50IHRvIHJlcHJlc2VudCB0aGUgbWFwcGluZyBhcyBTQ0VWIC0+IFZhbHVlT2Zmc2V0UGFpciBpbnN0ZWFkCisgIC8vLyBvZiBTQ0VWIC0+IFZhbHVlOgorICAvLy8gU3VwcG9zZSB3ZSBrbm93IFMxIGV4cGFuZHMgdG8gVjEsIGFuZAorICAvLy8gIFMxID0gUzIgKyBDX2EKKyAgLy8vICBTMyA9IFMyICsgQ19iCisgIC8vLyB3aGVyZSBDX2EgYW5kIENfYiBhcmUgZGlmZmVyZW50IFNDRVZDb25zdGFudHMuIFRoZW4gd2UnZCBsaWtlIHRvCisgIC8vLyBleHBhbmQgUzMgYXMgVjEgLSBDX2EgKyBDX2IgaW5zdGVhZCBvZiBleHBhbmRpbmcgUzIgbGl0ZXJhbGx5LgorICAvLy8gSXQgaXMgaGVscGZ1bCB3aGVuIFMyIGlzIGEgY29tcGxleCBTQ0VWIGV4cHIuCisgIC8vLworICAvLy8gSW4gb3JkZXIgdG8gZG8gdGhhdCwgd2UgcmVwcmVzZW50IEV4cHJWYWx1ZU1hcCBhcyBhIG1hcHBpbmcgZnJvbQorICAvLy8gU0NFViB0byBWYWx1ZU9mZnNldFBhaXIuIFdlIHdpbGwgc2F2ZSBib3RoIFMxLT57VjEsIDB9IGFuZAorICAvLy8gUzItPntWMSwgQ19hfSBpbnRvIHRoZSBtYXAgd2hlbiB3ZSBjcmVhdGUgU0NFViBmb3IgVjEuIFdoZW4gUzMKKyAgLy8vIGlzIGV4cGFuZGVkLCBpdCB3aWxsIGZpcnN0IGV4cGFuZCBTMiB0byBWMSAtIENfYSBiZWNhdXNlIG9mCisgIC8vLyBTMi0+e1YxLCBDX2F9IGluIHRoZSBtYXAsIHRoZW4gZXhwYW5kIFMzIHRvIFYxIC0gQ19hICsgQ19iLgorICAvLy8KKyAgLy8vIE5vdGU6IFMtPntWLCBPZmZzZXR9IGluIHRoZSBFeHByVmFsdWVNYXAgbWVhbnMgUyBjYW4gYmUgZXhwYW5kZWQKKyAgLy8vIHRvIFYgLSBPZmZzZXQuCisgIEV4cHJWYWx1ZU1hcFR5cGUgRXhwclZhbHVlTWFwOworCisgIC8vLyBUaGUgdHlwZSBmb3IgVmFsdWVFeHByTWFwLgorICB1c2luZyBWYWx1ZUV4cHJNYXBUeXBlID0KKyAgICAgIERlbnNlTWFwPFNDRVZDYWxsYmFja1ZILCBjb25zdCBTQ0VWICosIERlbnNlTWFwSW5mbzxWYWx1ZSAqPj47CisKKyAgLy8vIFRoaXMgaXMgYSBjYWNoZSBvZiB0aGUgdmFsdWVzIHdlIGhhdmUgYW5hbHl6ZWQgc28gZmFyLgorICBWYWx1ZUV4cHJNYXBUeXBlIFZhbHVlRXhwck1hcDsKKworICAvLy8gTWFyayBwcmVkaWNhdGUgdmFsdWVzIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQgYnkgaXNJbXBsaWVkQ29uZC4KKyAgU21hbGxQdHJTZXQ8VmFsdWUgKiwgNj4gUGVuZGluZ0xvb3BQcmVkaWNhdGVzOworCisgIC8vLyBNYXJrIFNDRVZVbmtub3duIFBoaXMgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCBieSBnZXRSYW5nZVJlZi4KKyAgU21hbGxQdHJTZXQ8Y29uc3QgUEhJTm9kZSAqLCA2PiBQZW5kaW5nUGhpUmFuZ2VzOworCisgIC8vLyBTZXQgdG8gdHJ1ZSBieSBpc0xvb3BCYWNrZWRnZUd1YXJkZWRCeUNvbmQgd2hlbiB3ZSdyZSB3YWxraW5nIHRoZSBzZXQgb2YKKyAgLy8vIGNvbmRpdGlvbnMgZG9taW5hdGluZyB0aGUgYmFja2VkZ2Ugb2YgYSBsb29wLgorICBib29sIFdhbGtpbmdCRURvbWluYXRpbmdDb25kcyA9IGZhbHNlOworCisgIC8vLyBTZXQgdG8gdHJ1ZSBieSBpc0tub3duUHJlZGljYXRlVmlhU3BsaXR0aW5nIHdoZW4gd2UncmUgdHJ5aW5nIHRvIHByb3ZlIGEKKyAgLy8vIHByZWRpY2F0ZSBieSBzcGxpdHRpbmcgaXQgaW50byBhIHNldCBvZiBpbmRlcGVuZGVudCBwcmVkaWNhdGVzLgorICBib29sIFByb3ZpbmdTcGxpdFByZWRpY2F0ZSA9IGZhbHNlOworCisgIC8vLyBNZW1vaXplZCB2YWx1ZXMgZm9yIHRoZSBHZXRNaW5UcmFpbGluZ1plcm9zCisgIERlbnNlTWFwPGNvbnN0IFNDRVYgKiwgdWludDMyX3Q+IE1pblRyYWlsaW5nWmVyb3NDYWNoZTsKKworICAvLy8gUmV0dXJuIHRoZSBWYWx1ZSBzZXQgZnJvbSB3aGljaCB0aGUgU0NFViBleHByIGlzIGdlbmVyYXRlZC4KKyAgU2V0VmVjdG9yPFZhbHVlT2Zmc2V0UGFpcj4gKmdldFNDRVZWYWx1ZXMoY29uc3QgU0NFViAqUyk7CisKKyAgLy8vIFByaXZhdGUgaGVscGVyIG1ldGhvZCBmb3IgdGhlIEdldE1pblRyYWlsaW5nWmVyb3MgbWV0aG9kCisgIHVpbnQzMl90IEdldE1pblRyYWlsaW5nWmVyb3NJbXBsKGNvbnN0IFNDRVYgKlMpOworCisgIC8vLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbnVtYmVyIG9mIGxvb3AgaXRlcmF0aW9ucyBmb3Igd2hpY2ggYSBsb29wIGV4aXQncworICAvLy8gYnJhbmNoIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gdGhlIG5vdC10YWtlbiBwYXRoLiAgVGhpcyBpcyBhIHRlbXBvcmFyeQorICAvLy8gcGFpciBvZiBleGFjdCBhbmQgbWF4IGV4cHJlc3Npb25zIHRoYXQgYXJlIGV2ZW50dWFsbHkgc3VtbWFyaXplZCBpbgorICAvLy8gRXhpdE5vdFRha2VuSW5mbyBhbmQgQmFja2VkZ2VUYWtlbkluZm8uCisgIHN0cnVjdCBFeGl0TGltaXQgeworICAgIGNvbnN0IFNDRVYgKkV4YWN0Tm90VGFrZW47IC8vIFRoZSBleGl0IGlzIG5vdCB0YWtlbiBleGFjdGx5IHRoaXMgbWFueSB0aW1lcworICAgIGNvbnN0IFNDRVYgKk1heE5vdFRha2VuOyAvLyBUaGUgZXhpdCBpcyBub3QgdGFrZW4gYXQgbW9zdCB0aGlzIG1hbnkgdGltZXMKKworICAgIC8vIE5vdCB0YWtlbiBlaXRoZXIgZXhhY3RseSBNYXhOb3RUYWtlbiBvciB6ZXJvIHRpbWVzCisgICAgYm9vbCBNYXhPclplcm8gPSBmYWxzZTsKKworICAgIC8vLyBBIHNldCBvZiBwcmVkaWNhdGUgZ3VhcmRzIGZvciB0aGlzIEV4aXRMaW1pdC4gVGhlIHJlc3VsdCBpcyBvbmx5IHZhbGlkCisgICAgLy8vIGlmIGFsbCBvZiB0aGUgcHJlZGljYXRlcyBpbiBcYyBQcmVkaWNhdGVzIGV2YWx1YXRlIHRvICd0cnVlJyBhdAorICAgIC8vLyBydW4tdGltZS4KKyAgICBTbWFsbFB0clNldDxjb25zdCBTQ0VWUHJlZGljYXRlICosIDQ+IFByZWRpY2F0ZXM7CisKKyAgICB2b2lkIGFkZFByZWRpY2F0ZShjb25zdCBTQ0VWUHJlZGljYXRlICpQKSB7CisgICAgICBhc3NlcnQoIWlzYTxTQ0VWVW5pb25QcmVkaWNhdGU+KFApICYmICJPbmx5IGFkZCBsZWFmIHByZWRpY2F0ZXMgaGVyZSEiKTsKKyAgICAgIFByZWRpY2F0ZXMuaW5zZXJ0KFApOworICAgIH0KKworICAgIC8qaW1wbGljaXQqLyBFeGl0TGltaXQoY29uc3QgU0NFViAqRSk7CisKKyAgICBFeGl0TGltaXQoCisgICAgICAgIGNvbnN0IFNDRVYgKkUsIGNvbnN0IFNDRVYgKk0sIGJvb2wgTWF4T3JaZXJvLAorICAgICAgICBBcnJheVJlZjxjb25zdCBTbWFsbFB0clNldEltcGw8Y29uc3QgU0NFVlByZWRpY2F0ZSAqPiAqPiBQcmVkU2V0TGlzdCk7CisKKyAgICBFeGl0TGltaXQoY29uc3QgU0NFViAqRSwgY29uc3QgU0NFViAqTSwgYm9vbCBNYXhPclplcm8sCisgICAgICAgICAgICAgIGNvbnN0IFNtYWxsUHRyU2V0SW1wbDxjb25zdCBTQ0VWUHJlZGljYXRlICo+ICZQcmVkU2V0KTsKKworICAgIEV4aXRMaW1pdChjb25zdCBTQ0VWICpFLCBjb25zdCBTQ0VWICpNLCBib29sIE1heE9yWmVybyk7CisKKyAgICAvLy8gVGVzdCB3aGV0aGVyIHRoaXMgRXhpdExpbWl0IGNvbnRhaW5zIGFueSBjb21wdXRlZCBpbmZvcm1hdGlvbiwgb3IKKyAgICAvLy8gd2hldGhlciBpdCdzIGFsbCBTQ0VWQ291bGROb3RDb21wdXRlIHZhbHVlcy4KKyAgICBib29sIGhhc0FueUluZm8oKSBjb25zdCB7CisgICAgICByZXR1cm4gIWlzYTxTQ0VWQ291bGROb3RDb21wdXRlPihFeGFjdE5vdFRha2VuKSB8fAorICAgICAgICAgICAgICFpc2E8U0NFVkNvdWxkTm90Q29tcHV0ZT4oTWF4Tm90VGFrZW4pOworICAgIH0KKworICAgIGJvb2wgaGFzT3BlcmFuZChjb25zdCBTQ0VWICpTKSBjb25zdDsKKworICAgIC8vLyBUZXN0IHdoZXRoZXIgdGhpcyBFeGl0TGltaXQgY29udGFpbnMgYWxsIGluZm9ybWF0aW9uLgorICAgIGJvb2wgaGFzRnVsbEluZm8oKSBjb25zdCB7CisgICAgICByZXR1cm4gIWlzYTxTQ0VWQ291bGROb3RDb21wdXRlPihFeGFjdE5vdFRha2VuKTsKKyAgICB9CisgIH07CisKKyAgLy8vIEluZm9ybWF0aW9uIGFib3V0IHRoZSBudW1iZXIgb2YgdGltZXMgYSBwYXJ0aWN1bGFyIGxvb3AgZXhpdCBtYXkgYmUKKyAgLy8vIHJlYWNoZWQgYmVmb3JlIGV4aXRpbmcgdGhlIGxvb3AuCisgIHN0cnVjdCBFeGl0Tm90VGFrZW5JbmZvIHsKKyAgICBQb2lzb25pbmdWSDxCYXNpY0Jsb2NrPiBFeGl0aW5nQmxvY2s7CisgICAgY29uc3QgU0NFViAqRXhhY3ROb3RUYWtlbjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8U0NFVlVuaW9uUHJlZGljYXRlPiBQcmVkaWNhdGU7CisKKyAgICBleHBsaWNpdCBFeGl0Tm90VGFrZW5JbmZvKFBvaXNvbmluZ1ZIPEJhc2ljQmxvY2s+IEV4aXRpbmdCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkV4YWN0Tm90VGFrZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U0NFVlVuaW9uUHJlZGljYXRlPiBQcmVkaWNhdGUpCisgICAgICAgIDogRXhpdGluZ0Jsb2NrKEV4aXRpbmdCbG9jayksIEV4YWN0Tm90VGFrZW4oRXhhY3ROb3RUYWtlbiksCisgICAgICAgICAgUHJlZGljYXRlKHN0ZDo6bW92ZShQcmVkaWNhdGUpKSB7fQorCisgICAgYm9vbCBoYXNBbHdheXNUcnVlUHJlZGljYXRlKCkgY29uc3QgeworICAgICAgcmV0dXJuICFQcmVkaWNhdGUgfHwgUHJlZGljYXRlLT5pc0Fsd2F5c1RydWUoKTsKKyAgICB9CisgIH07CisKKyAgLy8vIEluZm9ybWF0aW9uIGFib3V0IHRoZSBiYWNrZWRnZS10YWtlbiBjb3VudCBvZiBhIGxvb3AuIFRoaXMgY3VycmVudGx5CisgIC8vLyBpbmNsdWRlcyBhbiBleGFjdCBjb3VudCBhbmQgYSBtYXhpbXVtIGNvdW50LgorICAvLy8KKyAgY2xhc3MgQmFja2VkZ2VUYWtlbkluZm8geworICAgIC8vLyBBIGxpc3Qgb2YgY29tcHV0YWJsZSBleGl0cyBhbmQgdGhlaXIgbm90LXRha2VuIGNvdW50cy4gIExvb3BzIGFsbW9zdAorICAgIC8vLyBuZXZlciBoYXZlIG1vcmUgdGhhbiBvbmUgY29tcHV0YWJsZSBleGl0LgorICAgIFNtYWxsVmVjdG9yPEV4aXROb3RUYWtlbkluZm8sIDE+IEV4aXROb3RUYWtlbjsKKworICAgIC8vLyBUaGUgcG9pbnRlciBwYXJ0IG9mIFxjIE1heEFuZENvbXBsZXRlIGlzIGFuIGV4cHJlc3Npb24gaW5kaWNhdGluZyB0aGUKKyAgICAvLy8gbGVhc3QgbWF4aW11bSBiYWNrZWRnZS10YWtlbiBjb3VudCBvZiB0aGUgbG9vcCB0aGF0IGlzIGtub3duLCBvciBhCisgICAgLy8vIFNDRVZDb3VsZE5vdENvbXB1dGUuIFRoaXMgZXhwcmVzc2lvbiBpcyBvbmx5IHZhbGlkIGlmIHRoZSBwcmVkaWNhdGVzCisgICAgLy8vIGFzc29jaWF0ZWQgd2l0aCBhbGwgbG9vcCBleGl0cyBhcmUgdHJ1ZS4KKyAgICAvLy8KKyAgICAvLy8gVGhlIGludGVnZXIgcGFydCBvZiBcYyBNYXhBbmRDb21wbGV0ZSBpcyBhIGJvb2xlYW4gaW5kaWNhdGluZyBpZiBcYworICAgIC8vLyBFeGl0Tm90VGFrZW4gaGFzIGFuIGVsZW1lbnQgZm9yIGV2ZXJ5IGV4aXRpbmcgYmxvY2sgaW4gdGhlIGxvb3AuCisgICAgUG9pbnRlckludFBhaXI8Y29uc3QgU0NFViAqLCAxPiBNYXhBbmRDb21wbGV0ZTsKKworICAgIC8vLyBUcnVlIGlmZiB0aGUgYmFja2VkZ2UgaXMgdGFrZW4gZWl0aGVyIGV4YWN0bHkgTWF4IG9yIHplcm8gdGltZXMuCisgICAgYm9vbCBNYXhPclplcm8gPSBmYWxzZTsKKworICAgIC8vLyBcbmFtZSBIZWxwZXIgcHJvamVjdGlvbiBmdW5jdGlvbnMgb24gXGMgTWF4QW5kQ29tcGxldGUuCisgICAgLy8vIEB7CisgICAgYm9vbCBpc0NvbXBsZXRlKCkgY29uc3QgeyByZXR1cm4gTWF4QW5kQ29tcGxldGUuZ2V0SW50KCk7IH0KKyAgICBjb25zdCBTQ0VWICpnZXRNYXgoKSBjb25zdCB7IHJldHVybiBNYXhBbmRDb21wbGV0ZS5nZXRQb2ludGVyKCk7IH0KKyAgICAvLy8gQH0KKworICBwdWJsaWM6CisgICAgQmFja2VkZ2VUYWtlbkluZm8oKSA6IE1heEFuZENvbXBsZXRlKG51bGxwdHIsIDApIHt9CisgICAgQmFja2VkZ2VUYWtlbkluZm8oQmFja2VkZ2VUYWtlbkluZm8gJiYpID0gZGVmYXVsdDsKKyAgICBCYWNrZWRnZVRha2VuSW5mbyAmb3BlcmF0b3I9KEJhY2tlZGdlVGFrZW5JbmZvICYmKSA9IGRlZmF1bHQ7CisKKyAgICB1c2luZyBFZGdlRXhpdEluZm8gPSBzdGQ6OnBhaXI8QmFzaWNCbG9jayAqLCBFeGl0TGltaXQ+OworCisgICAgLy8vIEluaXRpYWxpemUgQmFja2VkZ2VUYWtlbkluZm8gZnJvbSBhIGxpc3Qgb2YgZXhhY3QgZXhpdCBjb3VudHMuCisgICAgQmFja2VkZ2VUYWtlbkluZm8oU21hbGxWZWN0b3JJbXBsPEVkZ2VFeGl0SW5mbz4gJiZFeGl0Q291bnRzLCBib29sIENvbXBsZXRlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKk1heENvdW50LCBib29sIE1heE9yWmVybyk7CisKKyAgICAvLy8gVGVzdCB3aGV0aGVyIHRoaXMgQmFja2VkZ2VUYWtlbkluZm8gY29udGFpbnMgYW55IGNvbXB1dGVkIGluZm9ybWF0aW9uLAorICAgIC8vLyBvciB3aGV0aGVyIGl0J3MgYWxsIFNDRVZDb3VsZE5vdENvbXB1dGUgdmFsdWVzLgorICAgIGJvb2wgaGFzQW55SW5mbygpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhRXhpdE5vdFRha2VuLmVtcHR5KCkgfHwgIWlzYTxTQ0VWQ291bGROb3RDb21wdXRlPihnZXRNYXgoKSk7CisgICAgfQorCisgICAgLy8vIFRlc3Qgd2hldGhlciB0aGlzIEJhY2tlZGdlVGFrZW5JbmZvIGNvbnRhaW5zIGNvbXBsZXRlIGluZm9ybWF0aW9uLgorICAgIGJvb2wgaGFzRnVsbEluZm8oKSBjb25zdCB7IHJldHVybiBpc0NvbXBsZXRlKCk7IH0KKworICAgIC8vLyBSZXR1cm4gYW4gZXhwcmVzc2lvbiBpbmRpY2F0aW5nIHRoZSBleGFjdCAqYmFja2VkZ2UtdGFrZW4qCisgICAgLy8vIGNvdW50IG9mIHRoZSBsb29wIGlmIGl0IGlzIGtub3duIG9yIFNDRVZDb3VsZE5vdENvbXB1dGUKKyAgICAvLy8gb3RoZXJ3aXNlLiAgSWYgZXhlY3V0aW9uIG1ha2VzIGl0IHRvIHRoZSBiYWNrZWRnZSBvbiBldmVyeQorICAgIC8vLyBpdGVyYXRpb24gKGkuZS4gdGhlcmUgYXJlIG5vIGFibm9ybWFsIGV4aXN0cyBsaWtlIGV4Y2VwdGlvbgorICAgIC8vLyB0aHJvd3MgYW5kIHRocmVhZCBleGl0cykgdGhlbiB0aGlzIGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlCisgICAgLy8vIGxvb3AgaGVhZGVyIHdpbGwgZXhlY3V0ZSBtaW51cyBvbmUuCisgICAgLy8vCisgICAgLy8vIElmIHRoZSBTQ0VWIHByZWRpY2F0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFuc3dlciBjYW4gYmUgZGlmZmVyZW50CisgICAgLy8vIGZyb20gQWx3YXlzVHJ1ZSwgd2UgbXVzdCBhZGQgYSAobm9uIG51bGwpIFByZWRpY2F0ZXMgYXJndW1lbnQuCisgICAgLy8vIFRoZSBTQ0VWIHByZWRpY2F0ZSBhc3NvY2lhdGVkIHdpdGggdGhlIGFuc3dlciB3aWxsIGJlIGFkZGVkIHRvCisgICAgLy8vIFByZWRpY2F0ZXMuIEEgcnVuLXRpbWUgY2hlY2sgbmVlZHMgdG8gYmUgZW1pdHRlZCBmb3IgdGhlIFNDRVYKKyAgICAvLy8gcHJlZGljYXRlIGluIG9yZGVyIGZvciB0aGUgYW5zd2VyIHRvIGJlIHZhbGlkLgorICAgIC8vLworICAgIC8vLyBOb3RlIHRoYXQgd2Ugc2hvdWxkIGFsd2F5cyBrbm93IGlmIHdlIG5lZWQgdG8gcGFzcyBhIHByZWRpY2F0ZQorICAgIC8vLyBhcmd1bWVudCBvciBub3QgZnJvbSB0aGUgd2F5IHRoZSBFeGl0Q291bnRzIHZlY3RvciB3YXMgY29tcHV0ZWQuCisgICAgLy8vIElmIHdlIGFsbG93ZWQgU0NFViBwcmVkaWNhdGVzIHRvIGJlIGdlbmVyYXRlZCB3aGVuIHBvcHVsYXRpbmcgdGhpcworICAgIC8vLyB2ZWN0b3IsIHRoaXMgaW5mb3JtYXRpb24gY2FuIGNvbnRhaW4gdGhlbSBhbmQgdGhlcmVmb3JlIGEKKyAgICAvLy8gU0NFVlByZWRpY2F0ZSBhcmd1bWVudCBzaG91bGQgYmUgYWRkZWQgdG8gZ2V0RXhhY3QuCisgICAgY29uc3QgU0NFViAqZ2V0RXhhY3QoY29uc3QgTG9vcCAqTCwgU2NhbGFyRXZvbHV0aW9uICpTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTQ0VWVW5pb25QcmVkaWNhdGUgKlByZWRpY2F0ZXMgPSBudWxscHRyKSBjb25zdDsKKworICAgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGxvb3AgZXhpdCBtYXkgZmFsbCB0aHJvdWdoIHRvIHRoZSBiYWNrCisgICAgLy8vIGVkZ2UsIG9yIFNDRVZDb3VsZE5vdENvbXB1dGUuIFRoZSBsb29wIGlzIGd1YXJhbnRlZWQgbm90IHRvIGV4aXQgdmlhCisgICAgLy8vIHRoaXMgYmxvY2sgYmVmb3JlIHRoaXMgbnVtYmVyIG9mIGl0ZXJhdGlvbnMsIGJ1dCBtYXkgZXhpdCB2aWEgYW5vdGhlcgorICAgIC8vLyBibG9jay4KKyAgICBjb25zdCBTQ0VWICpnZXRFeGFjdChCYXNpY0Jsb2NrICpFeGl0aW5nQmxvY2ssIFNjYWxhckV2b2x1dGlvbiAqU0UpIGNvbnN0OworCisgICAgLy8vIEdldCB0aGUgbWF4IGJhY2tlZGdlIHRha2VuIGNvdW50IGZvciB0aGUgbG9vcC4KKyAgICBjb25zdCBTQ0VWICpnZXRNYXgoU2NhbGFyRXZvbHV0aW9uICpTRSkgY29uc3Q7CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIG51bWJlciBvZiB0aW1lcyB0aGlzIGJhY2tlZGdlIGlzIHRha2VuIGlzIGVpdGhlciB0aGUKKyAgICAvLy8gdmFsdWUgcmV0dXJuZWQgYnkgZ2V0TWF4IG9yIHplcm8uCisgICAgYm9vbCBpc01heE9yWmVybyhTY2FsYXJFdm9sdXRpb24gKlNFKSBjb25zdDsKKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhbnkgYmFja2VkZ2UgdGFrZW4gY291bnQgZXhwcmVzc2lvbnMgcmVmZXIgdG8gdGhlIGdpdmVuCisgICAgLy8vIHN1YmV4cHJlc3Npb24uCisgICAgYm9vbCBoYXNPcGVyYW5kKGNvbnN0IFNDRVYgKlMsIFNjYWxhckV2b2x1dGlvbiAqU0UpIGNvbnN0OworCisgICAgLy8vIEludmFsaWRhdGUgdGhpcyByZXN1bHQgYW5kIGZyZWUgYXNzb2NpYXRlZCBtZW1vcnkuCisgICAgdm9pZCBjbGVhcigpOworICB9OworCisgIC8vLyBDYWNoZSB0aGUgYmFja2VkZ2UtdGFrZW4gY291bnQgb2YgdGhlIGxvb3BzIGZvciB0aGlzIGZ1bmN0aW9uIGFzIHRoZXkKKyAgLy8vIGFyZSBjb21wdXRlZC4KKyAgRGVuc2VNYXA8Y29uc3QgTG9vcCAqLCBCYWNrZWRnZVRha2VuSW5mbz4gQmFja2VkZ2VUYWtlbkNvdW50czsKKworICAvLy8gQ2FjaGUgdGhlIHByZWRpY2F0ZWQgYmFja2VkZ2UtdGFrZW4gY291bnQgb2YgdGhlIGxvb3BzIGZvciB0aGlzCisgIC8vLyBmdW5jdGlvbiBhcyB0aGV5IGFyZSBjb21wdXRlZC4KKyAgRGVuc2VNYXA8Y29uc3QgTG9vcCAqLCBCYWNrZWRnZVRha2VuSW5mbz4gUHJlZGljYXRlZEJhY2tlZGdlVGFrZW5Db3VudHM7CisKKyAgLy8vIFRoaXMgbWFwIGNvbnRhaW5zIGVudHJpZXMgZm9yIGFsbCBvZiB0aGUgUEhJIGluc3RydWN0aW9ucyB0aGF0IHdlCisgIC8vLyBhdHRlbXB0IHRvIGNvbXB1dGUgY29uc3RhbnQgZXZvbHV0aW9ucyBmb3IuICBUaGlzIGFsbG93cyB1cyB0byBhdm9pZAorICAvLy8gcG90ZW50aWFsbHkgZXhwZW5zaXZlIHJlY29tcHV0YXRpb24gb2YgdGhlc2UgcHJvcGVydGllcy4gIEFuIGluc3RydWN0aW9uCisgIC8vLyBtYXBzIHRvIG51bGwgaWYgd2UgYXJlIHVuYWJsZSB0byBjb21wdXRlIGl0cyBleGl0IHZhbHVlLgorICBEZW5zZU1hcDxQSElOb2RlICosIENvbnN0YW50ICo+IENvbnN0YW50RXZvbHV0aW9uTG9vcEV4aXRWYWx1ZTsKKworICAvLy8gVGhpcyBtYXAgY29udGFpbnMgZW50cmllcyBmb3IgYWxsIHRoZSBleHByZXNzaW9ucyB0aGF0IHdlIGF0dGVtcHQgdG8KKyAgLy8vIGNvbXB1dGUgZ2V0U0NFVkF0U2NvcGUgaW5mb3JtYXRpb24gZm9yLCB3aGljaCBjYW4gYmUgZXhwZW5zaXZlIGluCisgIC8vLyBleHRyZW1lIGNhc2VzLgorICBEZW5zZU1hcDxjb25zdCBTQ0VWICosIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxjb25zdCBMb29wICosIGNvbnN0IFNDRVYgKj4sIDI+PgorICAgICAgVmFsdWVzQXRTY29wZXM7CisKKyAgLy8vIE1lbW9pemVkIGNvbXB1dGVMb29wRGlzcG9zaXRpb24gcmVzdWx0cy4KKyAgRGVuc2VNYXA8Y29uc3QgU0NFViAqLAorICAgICAgICAgICBTbWFsbFZlY3RvcjxQb2ludGVySW50UGFpcjxjb25zdCBMb29wICosIDIsIExvb3BEaXNwb3NpdGlvbj4sIDI+PgorICAgICAgTG9vcERpc3Bvc2l0aW9uczsKKworICBzdHJ1Y3QgTG9vcFByb3BlcnRpZXMgeworICAgIC8vLyBTZXQgdG8gdHJ1ZSBpZiB0aGUgbG9vcCBjb250YWlucyBubyBpbnN0cnVjdGlvbiB0aGF0IGNhbiBoYXZlIHNpZGUKKyAgICAvLy8gZWZmZWN0cyAoaS5lLiB2aWEgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLCB2b2xhdGlsZSBvciBhdG9taWMgYWNjZXNzKS4KKyAgICBib29sIEhhc05vQWJub3JtYWxFeGl0czsKKworICAgIC8vLyBTZXQgdG8gdHJ1ZSBpZiB0aGUgbG9vcCBjb250YWlucyBubyBpbnN0cnVjdGlvbiB0aGF0IGNhbiBhYm5vcm1hbGx5IGV4aXQKKyAgICAvLy8gdGhlIGxvb3AgKGkuZS4gdmlhIHRocm93aW5nIGFuIGV4Y2VwdGlvbiwgYnkgdGVybWluYXRpbmcgdGhlIHRocmVhZAorICAgIC8vLyBjbGVhbmx5IG9yIGJ5IGluZmluaXRlIGxvb3BpbmcgaW4gYSBjYWxsZWQgZnVuY3Rpb24pLiAgU3RyaWN0bHkKKyAgICAvLy8gc3BlYWtpbmcsIHRoZSBsYXN0IG9uZSBpcyBub3QgbGVhdmluZyB0aGUgbG9vcCwgYnV0IGlzIGlkZW50aWNhbCB0bworICAgIC8vLyBsZWF2aW5nIHRoZSBsb29wIGZvciByZWFzb25pbmcgYWJvdXQgdW5kZWZpbmVkIGJlaGF2aW9yLgorICAgIGJvb2wgSGFzTm9TaWRlRWZmZWN0czsKKyAgfTsKKworICAvLy8gQ2FjaGUgZm9yIFxjIGdldExvb3BQcm9wZXJ0aWVzLgorICBEZW5zZU1hcDxjb25zdCBMb29wICosIExvb3BQcm9wZXJ0aWVzPiBMb29wUHJvcGVydGllc0NhY2hlOworCisgIC8vLyBSZXR1cm4gYSBcYyBMb29wUHJvcGVydGllcyBpbnN0YW5jZSBmb3IgXHAgTCwgY3JlYXRpbmcgb25lIGlmIG5lY2Vzc2FyeS4KKyAgTG9vcFByb3BlcnRpZXMgZ2V0TG9vcFByb3BlcnRpZXMoY29uc3QgTG9vcCAqTCk7CisKKyAgYm9vbCBsb29wSGFzTm9TaWRlRWZmZWN0cyhjb25zdCBMb29wICpMKSB7CisgICAgcmV0dXJuIGdldExvb3BQcm9wZXJ0aWVzKEwpLkhhc05vU2lkZUVmZmVjdHM7CisgIH0KKworICBib29sIGxvb3BIYXNOb0Fibm9ybWFsRXhpdHMoY29uc3QgTG9vcCAqTCkgeworICAgIHJldHVybiBnZXRMb29wUHJvcGVydGllcyhMKS5IYXNOb0Fibm9ybWFsRXhpdHM7CisgIH0KKworICAvLy8gQ29tcHV0ZSBhIExvb3BEaXNwb3NpdGlvbiB2YWx1ZS4KKyAgTG9vcERpc3Bvc2l0aW9uIGNvbXB1dGVMb29wRGlzcG9zaXRpb24oY29uc3QgU0NFViAqUywgY29uc3QgTG9vcCAqTCk7CisKKyAgLy8vIE1lbW9pemVkIGNvbXB1dGVCbG9ja0Rpc3Bvc2l0aW9uIHJlc3VsdHMuCisgIERlbnNlTWFwPAorICAgICAgY29uc3QgU0NFViAqLAorICAgICAgU21hbGxWZWN0b3I8UG9pbnRlckludFBhaXI8Y29uc3QgQmFzaWNCbG9jayAqLCAyLCBCbG9ja0Rpc3Bvc2l0aW9uPiwgMj4+CisgICAgICBCbG9ja0Rpc3Bvc2l0aW9uczsKKworICAvLy8gQ29tcHV0ZSBhIEJsb2NrRGlzcG9zaXRpb24gdmFsdWUuCisgIEJsb2NrRGlzcG9zaXRpb24gY29tcHV0ZUJsb2NrRGlzcG9zaXRpb24oY29uc3QgU0NFViAqUywgY29uc3QgQmFzaWNCbG9jayAqQkIpOworCisgIC8vLyBNZW1vaXplZCByZXN1bHRzIGZyb20gZ2V0UmFuZ2UKKyAgRGVuc2VNYXA8Y29uc3QgU0NFViAqLCBDb25zdGFudFJhbmdlPiBVbnNpZ25lZFJhbmdlczsKKworICAvLy8gTWVtb2l6ZWQgcmVzdWx0cyBmcm9tIGdldFJhbmdlCisgIERlbnNlTWFwPGNvbnN0IFNDRVYgKiwgQ29uc3RhbnRSYW5nZT4gU2lnbmVkUmFuZ2VzOworCisgIC8vLyBVc2VkIHRvIHBhcmFtZXRlcml6ZSBnZXRSYW5nZQorICBlbnVtIFJhbmdlU2lnbkhpbnQgeyBISU5UX1JBTkdFX1VOU0lHTkVELCBISU5UX1JBTkdFX1NJR05FRCB9OworCisgIC8vLyBTZXQgdGhlIG1lbW9pemVkIHJhbmdlIGZvciB0aGUgZ2l2ZW4gU0NFVi4KKyAgY29uc3QgQ29uc3RhbnRSYW5nZSAmc2V0UmFuZ2UoY29uc3QgU0NFViAqUywgUmFuZ2VTaWduSGludCBIaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudFJhbmdlIENSKSB7CisgICAgRGVuc2VNYXA8Y29uc3QgU0NFViAqLCBDb25zdGFudFJhbmdlPiAmQ2FjaGUgPQorICAgICAgICBIaW50ID09IEhJTlRfUkFOR0VfVU5TSUdORUQgPyBVbnNpZ25lZFJhbmdlcyA6IFNpZ25lZFJhbmdlczsKKworICAgIGF1dG8gUGFpciA9IENhY2hlLnRyeV9lbXBsYWNlKFMsIHN0ZDo6bW92ZShDUikpOworICAgIGlmICghUGFpci5zZWNvbmQpCisgICAgICBQYWlyLmZpcnN0LT5zZWNvbmQgPSBzdGQ6Om1vdmUoQ1IpOworICAgIHJldHVybiBQYWlyLmZpcnN0LT5zZWNvbmQ7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHRoZSByYW5nZSBmb3IgYSBwYXJ0aWN1bGFyIFNDRVYuCisgIC8vLyBOT1RFOiBUaGlzIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYW4gZW50cnkgaW4gYSBjYWNoZS4gSXQgbXVzdCBiZQorICAvLy8gY29waWVkIGlmIGl0cyBuZWVkZWQgZm9yIGxvbmdlci4KKyAgY29uc3QgQ29uc3RhbnRSYW5nZSAmZ2V0UmFuZ2VSZWYoY29uc3QgU0NFViAqUywgUmFuZ2VTaWduSGludCBIaW50KTsKKworICAvLy8gRGV0ZXJtaW5lcyB0aGUgcmFuZ2UgZm9yIHRoZSBhZmZpbmUgU0NFVkFkZFJlY0V4cHIge1xwIFN0YXJ0LCssXHAgU3RvcH0uCisgIC8vLyBIZWxwZXIgZm9yIFxjIGdldFJhbmdlLgorICBDb25zdGFudFJhbmdlIGdldFJhbmdlRm9yQWZmaW5lQVIoY29uc3QgU0NFViAqU3RhcnQsIGNvbnN0IFNDRVYgKlN0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpNYXhCRUNvdW50LCB1bnNpZ25lZCBCaXRXaWR0aCk7CisKKyAgLy8vIFRyeSB0byBjb21wdXRlIGEgcmFuZ2UgZm9yIHRoZSBhZmZpbmUgU0NFVkFkZFJlY0V4cHIge1xwIFN0YXJ0LCssXHAKKyAgLy8vIFN0b3B9IGJ5ICJmYWN0b3Jpbmcgb3V0IiBhIHRlcm5hcnkgZXhwcmVzc2lvbiBmcm9tIHRoZSBhZGQgcmVjdXJyZW5jZS4KKyAgLy8vIEhlbHBlciBjYWxsZWQgYnkgXGMgZ2V0UmFuZ2UuCisgIENvbnN0YW50UmFuZ2UgZ2V0UmFuZ2VWaWFGYWN0b3JpbmcoY29uc3QgU0NFViAqU3RhcnQsIGNvbnN0IFNDRVYgKlN0b3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqTWF4QkVDb3VudCwgdW5zaWduZWQgQml0V2lkdGgpOworCisgIC8vLyBXZSBrbm93IHRoYXQgdGhlcmUgaXMgbm8gU0NFViBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZS4gIEFuYWx5emUgdGhlCisgIC8vLyBleHByZXNzaW9uLgorICBjb25zdCBTQ0VWICpjcmVhdGVTQ0VWKFZhbHVlICpWKTsKKworICAvLy8gUHJvdmlkZSB0aGUgc3BlY2lhbCBoYW5kbGluZyB3ZSBuZWVkIHRvIGFuYWx5emUgUEhJIFNDRVZzLgorICBjb25zdCBTQ0VWICpjcmVhdGVOb2RlRm9yUEhJKFBISU5vZGUgKlBOKTsKKworICAvLy8gSGVscGVyIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIGNyZWF0ZU5vZGVGb3JQSEkuCisgIGNvbnN0IFNDRVYgKmNyZWF0ZUFkZFJlY0Zyb21QSEkoUEhJTm9kZSAqUE4pOworCisgIC8vLyBBIGhlbHBlciBmdW5jdGlvbiBmb3IgY3JlYXRlQWRkUmVjRnJvbVBISSB0byBoYW5kbGUgc2ltcGxlIGNhc2VzLgorICBjb25zdCBTQ0VWICpjcmVhdGVTaW1wbGVBZmZpbmVBZGRSZWMoUEhJTm9kZSAqUE4sIFZhbHVlICpCRVZhbHVlViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKlN0YXJ0VmFsdWVWKTsKKworICAvLy8gSGVscGVyIGZ1bmN0aW9uIGNhbGxlZCBmcm9tIGNyZWF0ZU5vZGVGb3JQSEkuCisgIGNvbnN0IFNDRVYgKmNyZWF0ZU5vZGVGcm9tU2VsZWN0TGlrZVBISShQSElOb2RlICpQTik7CisKKyAgLy8vIFByb3ZpZGUgc3BlY2lhbCBoYW5kbGluZyBmb3IgYSBzZWxlY3QtbGlrZSBpbnN0cnVjdGlvbiAoY3VycmVudGx5IHRoaXMKKyAgLy8vIGlzIGVpdGhlciBhIHNlbGVjdCBpbnN0cnVjdGlvbiBvciBhIHBoaSBub2RlKS4gIFxwIEkgaXMgdGhlIGluc3RydWN0aW9uCisgIC8vLyBiZWluZyBwcm9jZXNzZWQsIGFuZCBpdCBpcyBhc3N1bWVkIGVxdWl2YWxlbnQgdG8gIkNvbmQgPyBUcnVlVmFsIDoKKyAgLy8vIEZhbHNlVmFsIi4KKyAgY29uc3QgU0NFViAqY3JlYXRlTm9kZUZvclNlbGVjdE9yUEhJKEluc3RydWN0aW9uICpJLCBWYWx1ZSAqQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpUcnVlVmFsLCBWYWx1ZSAqRmFsc2VWYWwpOworCisgIC8vLyBQcm92aWRlIHRoZSBzcGVjaWFsIGhhbmRsaW5nIHdlIG5lZWQgdG8gYW5hbHl6ZSBHRVAgU0NFVnMuCisgIGNvbnN0IFNDRVYgKmNyZWF0ZU5vZGVGb3JHRVAoR0VQT3BlcmF0b3IgKkdFUCk7CisKKyAgLy8vIEltcGxlbWVudGF0aW9uIGNvZGUgZm9yIGdldFNDRVZBdFNjb3BlOyBjYWxsZWQgYXQgbW9zdCBvbmNlIGZvciBlYWNoCisgIC8vLyBTQ0VWK0xvb3AgcGFpci4KKyAgY29uc3QgU0NFViAqY29tcHV0ZVNDRVZBdFNjb3BlKGNvbnN0IFNDRVYgKlMsIGNvbnN0IExvb3AgKkwpOworCisgIC8vLyBUaGlzIGxvb2tzIHVwIGNvbXB1dGVkIFNDRVYgdmFsdWVzIGZvciBhbGwgaW5zdHJ1Y3Rpb25zIHRoYXQgZGVwZW5kIG9uCisgIC8vLyB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gYW5kIHJlbW92ZXMgdGhlbSBmcm9tIHRoZSBWYWx1ZUV4cHJNYXAgbWFwIGlmIHRoZXkKKyAgLy8vIHJlZmVyZW5jZSBTeW1OYW1lLiBUaGlzIGlzIHVzZWQgZHVyaW5nIFBISSByZXNvbHV0aW9uLgorICB2b2lkIGZvcmdldFN5bWJvbGljTmFtZShJbnN0cnVjdGlvbiAqSSwgY29uc3QgU0NFViAqU3ltTmFtZSk7CisKKyAgLy8vIFJldHVybiB0aGUgQmFja2VkZ2VUYWtlbkluZm8gZm9yIHRoZSBnaXZlbiBsb29wLCBsYXppbHkgY29tcHV0aW5nIG5ldworICAvLy8gdmFsdWVzIGlmIHRoZSBsb29wIGhhc24ndCBiZWVuIGFuYWx5emVkIHlldC4gVGhlIHJldHVybmVkIHJlc3VsdCBpcworICAvLy8gZ3VhcmFudGVlZCBub3QgdG8gYmUgcHJlZGljYXRlZC4KKyAgY29uc3QgQmFja2VkZ2VUYWtlbkluZm8gJmdldEJhY2tlZGdlVGFrZW5JbmZvKGNvbnN0IExvb3AgKkwpOworCisgIC8vLyBTaW1pbGFyIHRvIGdldEJhY2tlZGdlVGFrZW5JbmZvLCBidXQgd2lsbCBhZGQgcHJlZGljYXRlcyBhcyByZXF1aXJlZAorICAvLy8gd2l0aCB0aGUgcHVycG9zZSBvZiByZXR1cm5pbmcgY29tcGxldGUgaW5mb3JtYXRpb24uCisgIGNvbnN0IEJhY2tlZGdlVGFrZW5JbmZvICZnZXRQcmVkaWNhdGVkQmFja2VkZ2VUYWtlbkluZm8oY29uc3QgTG9vcCAqTCk7CisKKyAgLy8vIENvbXB1dGUgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgc3BlY2lmaWVkIGxvb3Agd2lsbCBpdGVyYXRlLgorICAvLy8gSWYgQWxsb3dQcmVkaWNhdGVzIGlzIHNldCwgd2Ugd2lsbCBjcmVhdGUgbmV3IFNDRVYgcHJlZGljYXRlcyBhcworICAvLy8gbmVjZXNzYXJ5IGluIG9yZGVyIHRvIHJldHVybiBhbiBleGFjdCBhbnN3ZXIuCisgIEJhY2tlZGdlVGFrZW5JbmZvIGNvbXB1dGVCYWNrZWRnZVRha2VuQ291bnQoY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93UHJlZGljYXRlcyA9IGZhbHNlKTsKKworICAvLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBiYWNrZWRnZSBvZiB0aGUgc3BlY2lmaWVkIGxvb3Agd2lsbAorICAvLy8gZXhlY3V0ZSBpZiBpdCBleGl0cyB2aWEgdGhlIHNwZWNpZmllZCBibG9jay4gSWYgQWxsb3dQcmVkaWNhdGVzIGlzIHNldCwKKyAgLy8vIHRoaXMgY2FsbCB3aWxsIHRyeSB0byB1c2UgYSBtaW5pbWFsIHNldCBvZiBTQ0VWIHByZWRpY2F0ZXMgaW4gb3JkZXIgdG8KKyAgLy8vIHJldHVybiBhbiBleGFjdCBhbnN3ZXIuCisgIEV4aXRMaW1pdCBjb21wdXRlRXhpdExpbWl0KGNvbnN0IExvb3AgKkwsIEJhc2ljQmxvY2sgKkV4aXRpbmdCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd1ByZWRpY2F0ZXMgPSBmYWxzZSk7CisKKyAgLy8vIENvbXB1dGUgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYmFja2VkZ2Ugb2YgdGhlIHNwZWNpZmllZCBsb29wIHdpbGwKKyAgLy8vIGV4ZWN1dGUgaWYgaXRzIGV4aXQgY29uZGl0aW9uIHdlcmUgYSBjb25kaXRpb25hbCBicmFuY2ggb2YgRXhpdENvbmQuCisgIC8vLworICAvLy8gXHAgQ29udHJvbHNFeGl0IGlzIHRydWUgaWYgRXhpdENvbmQgZGlyZWN0bHkgY29udHJvbHMgdGhlIGV4aXQKKyAgLy8vIGJyYW5jaC4gSW4gdGhpcyBjYXNlLCB3ZSBjYW4gYXNzdW1lIHRoYXQgdGhlIGxvb3AgZXhpdHMgb25seSBpZiB0aGUKKyAgLy8vIGNvbmRpdGlvbiBpcyB0cnVlIGFuZCBjYW4gaW5mZXIgdGhhdCBmYWlsaW5nIHRvIG1lZXQgdGhlIGNvbmRpdGlvbiBwcmlvcgorICAvLy8gdG8gaW50ZWdlciB3cmFwYXJvdW5kIHJlc3VsdHMgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLgorICAvLy8KKyAgLy8vIElmIFxwIEFsbG93UHJlZGljYXRlcyBpcyBzZXQsIHRoaXMgY2FsbCB3aWxsIHRyeSB0byB1c2UgYSBtaW5pbWFsIHNldCBvZgorICAvLy8gU0NFViBwcmVkaWNhdGVzIGluIG9yZGVyIHRvIHJldHVybiBhbiBleGFjdCBhbnN3ZXIuCisgIEV4aXRMaW1pdCBjb21wdXRlRXhpdExpbWl0RnJvbUNvbmQoY29uc3QgTG9vcCAqTCwgVmFsdWUgKkV4aXRDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXhpdElmVHJ1ZSwgYm9vbCBDb250cm9sc0V4aXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd1ByZWRpY2F0ZXMgPSBmYWxzZSk7CisKKyAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgY29tcHV0ZUV4aXRMaW1pdEZyb21Db25kIHRvIGF2b2lkIGV4cG9uZW50aWFsIHRpbWUKKyAgLy8gY29tcGxleGl0eS4KKworICBjbGFzcyBFeGl0TGltaXRDYWNoZSB7CisgICAgLy8gSXQgbWF5IGxvb2sgbGlrZSB3ZSBuZWVkIGtleSBvbiB0aGUgd2hvbGUgKEwsIEV4aXRJZlRydWUsIENvbnRyb2xzRXhpdCwKKyAgICAvLyBBbGxvd1ByZWRpY2F0ZXMpIHR1cGxlLCBidXQgcmVjdXJzaXZlIGNhbGxzIHRvCisgICAgLy8gY29tcHV0ZUV4aXRMaW1pdEZyb21Db25kQ2FjaGVkIGZyb20gY29tcHV0ZUV4aXRMaW1pdEZyb21Db25kSW1wbCBvbmx5CisgICAgLy8gdmFyeSB0aGUgaW4gXGMgRXhpdENvbmQgYW5kIFxjIENvbnRyb2xzRXhpdCBwYXJhbWV0ZXJzLiAgV2UgcmVtZW1iZXIgdGhlCisgICAgLy8gaW5pdGlhbCB2YWx1ZXMgb2YgdGhlIG90aGVyIHZhbHVlcyB0byBhc3NlcnQgb3VyIGFzc3VtcHRpb24uCisgICAgU21hbGxEZW5zZU1hcDxQb2ludGVySW50UGFpcjxWYWx1ZSAqLCAxPiwgRXhpdExpbWl0PiBUcmlwQ291bnRNYXA7CisKKyAgICBjb25zdCBMb29wICpMOworICAgIGJvb2wgRXhpdElmVHJ1ZTsKKyAgICBib29sIEFsbG93UHJlZGljYXRlczsKKworICBwdWJsaWM6CisgICAgRXhpdExpbWl0Q2FjaGUoY29uc3QgTG9vcCAqTCwgYm9vbCBFeGl0SWZUcnVlLCBib29sIEFsbG93UHJlZGljYXRlcykKKyAgICAgICAgOiBMKEwpLCBFeGl0SWZUcnVlKEV4aXRJZlRydWUpLCBBbGxvd1ByZWRpY2F0ZXMoQWxsb3dQcmVkaWNhdGVzKSB7fQorCisgICAgT3B0aW9uYWw8RXhpdExpbWl0PiBmaW5kKGNvbnN0IExvb3AgKkwsIFZhbHVlICpFeGl0Q29uZCwgYm9vbCBFeGl0SWZUcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbnRyb2xzRXhpdCwgYm9vbCBBbGxvd1ByZWRpY2F0ZXMpOworCisgICAgdm9pZCBpbnNlcnQoY29uc3QgTG9vcCAqTCwgVmFsdWUgKkV4aXRDb25kLCBib29sIEV4aXRJZlRydWUsCisgICAgICAgICAgICAgICAgYm9vbCBDb250cm9sc0V4aXQsIGJvb2wgQWxsb3dQcmVkaWNhdGVzLCBjb25zdCBFeGl0TGltaXQgJkVMKTsKKyAgfTsKKworICB1c2luZyBFeGl0TGltaXRDYWNoZVR5ID0gRXhpdExpbWl0Q2FjaGU7CisKKyAgRXhpdExpbWl0IGNvbXB1dGVFeGl0TGltaXRGcm9tQ29uZENhY2hlZChFeGl0TGltaXRDYWNoZVR5ICZDYWNoZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpMLCBWYWx1ZSAqRXhpdENvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeGl0SWZUcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ29udHJvbHNFeGl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dQcmVkaWNhdGVzKTsKKyAgRXhpdExpbWl0IGNvbXB1dGVFeGl0TGltaXRGcm9tQ29uZEltcGwoRXhpdExpbWl0Q2FjaGVUeSAmQ2FjaGUsIGNvbnN0IExvb3AgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpFeGl0Q29uZCwgYm9vbCBFeGl0SWZUcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbnRyb2xzRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd1ByZWRpY2F0ZXMpOworCisgIC8vLyBDb21wdXRlIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGJhY2tlZGdlIG9mIHRoZSBzcGVjaWZpZWQgbG9vcCB3aWxsCisgIC8vLyBleGVjdXRlIGlmIGl0cyBleGl0IGNvbmRpdGlvbiB3ZXJlIGEgY29uZGl0aW9uYWwgYnJhbmNoIG9mIHRoZSBJQ21wSW5zdAorICAvLy8gRXhpdENvbmQgYW5kIEV4aXRJZlRydWUuIElmIEFsbG93UHJlZGljYXRlcyBpcyBzZXQsIHRoaXMgY2FsbCB3aWxsIHRyeQorICAvLy8gdG8gdXNlIGEgbWluaW1hbCBzZXQgb2YgU0NFViBwcmVkaWNhdGVzIGluIG9yZGVyIHRvIHJldHVybiBhbiBleGFjdAorICAvLy8gYW5zd2VyLgorICBFeGl0TGltaXQgY29tcHV0ZUV4aXRMaW1pdEZyb21JQ21wKGNvbnN0IExvb3AgKkwsIElDbXBJbnN0ICpFeGl0Q29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEV4aXRJZlRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1N1YkV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd1ByZWRpY2F0ZXMgPSBmYWxzZSk7CisKKyAgLy8vIENvbXB1dGUgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgYmFja2VkZ2Ugb2YgdGhlIHNwZWNpZmllZCBsb29wIHdpbGwKKyAgLy8vIGV4ZWN1dGUgaWYgaXRzIGV4aXQgY29uZGl0aW9uIHdlcmUgYSBzd2l0Y2ggd2l0aCBhIHNpbmdsZSBleGl0aW5nIGNhc2UKKyAgLy8vIHRvIEV4aXRpbmdCQi4KKyAgRXhpdExpbWl0IGNvbXB1dGVFeGl0TGltaXRGcm9tU2luZ2xlRXhpdFN3aXRjaChjb25zdCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN3aXRjaEluc3QgKlN3aXRjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpFeGl0aW5nQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1N1YkV4cHIpOworCisgIC8vLyBHaXZlbiBhbiBleGl0IGNvbmRpdGlvbiBvZiAnaWNtcCBvcCBsb2FkIFgsIGNzdCcsIHRyeSB0byBzZWUgaWYgd2UgY2FuCisgIC8vLyBjb21wdXRlIHRoZSBiYWNrZWRnZS10YWtlbiBjb3VudC4KKyAgRXhpdExpbWl0IGNvbXB1dGVMb2FkQ29uc3RhbnRDb21wYXJlRXhpdExpbWl0KExvYWRJbnN0ICpMSSwgQ29uc3RhbnQgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ21wSW5zdDo6UHJlZGljYXRlIHApOworCisgIC8vLyBDb21wdXRlIHRoZSBleGl0IGxpbWl0IG9mIGEgbG9vcCB0aGF0IGlzIGNvbnRyb2xsZWQgYnkgYQorICAvLy8gIihJViA+PiAxKSAhPSAwIiB0eXBlIGNvbXBhcmlzb24uICBXZSBjYW5ub3QgY29tcHV0ZSB0aGUgZXhhY3QgdHJpcAorICAvLy8gY291bnQgaW4gdGhlc2UgY2FzZXMgKHNpbmNlIFNDRVYgaGFzIG5vIHdheSBvZiBleHByZXNzaW5nIHRoZW0pLCBidXQgd2UKKyAgLy8vIGNhbiBzdGlsbCBzb21ldGltZXMgY29tcHV0ZSBhbiB1cHBlciBib3VuZC4KKyAgLy8vCisgIC8vLyBSZXR1cm4gYW4gRXhpdExpbWl0IGZvciBhIGxvb3Agd2hvc2UgYmFja2VkZ2UgaXMgZ3VhcmRlZCBieSBgTEhTIFByZWQKKyAgLy8vIFJIU2AuCisgIEV4aXRMaW1pdCBjb21wdXRlU2hpZnRDb21wYXJlRXhpdExpbWl0KFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IExvb3AgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCk7CisKKyAgLy8vIElmIHRoZSBsb29wIGlzIGtub3duIHRvIGV4ZWN1dGUgYSBjb25zdGFudCBudW1iZXIgb2YgdGltZXMgKHRoZQorICAvLy8gY29uZGl0aW9uIGV2b2x2ZXMgb25seSBmcm9tIGNvbnN0YW50cyksIHRyeSB0byBldmFsdWF0ZSBhIGZldyBpdGVyYXRpb25zCisgIC8vLyBvZiB0aGUgbG9vcCB1bnRpbCB3ZSBnZXQgdGhlIGV4aXQgY29uZGl0aW9uIGdldHMgYSB2YWx1ZSBvZiBFeGl0V2hlbgorICAvLy8gKHRydWUgb3IgZmFsc2UpLiAgSWYgd2UgY2Fubm90IGV2YWx1YXRlIHRoZSBleGl0IGNvdW50IG9mIHRoZSBsb29wLAorICAvLy8gcmV0dXJuIENvdWxkTm90Q29tcHV0ZS4KKyAgY29uc3QgU0NFViAqY29tcHV0ZUV4aXRDb3VudEV4aGF1c3RpdmVseShjb25zdCBMb29wICpMLCBWYWx1ZSAqQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEV4aXRXaGVuKTsKKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgdGltZXMgYW4gZXhpdCBjb25kaXRpb24gY29tcGFyaW5nIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHZhbHVlIHRvIHplcm8gd2lsbCBleGVjdXRlLiAgSWYgbm90IGNvbXB1dGFibGUsIHJldHVybiBDb3VsZE5vdENvbXB1dGUuCisgIC8vLyBJZiBBbGxvd1ByZWRpY2F0ZXMgaXMgc2V0LCB0aGlzIGNhbGwgd2lsbCB0cnkgdG8gdXNlIGEgbWluaW1hbCBzZXQgb2YKKyAgLy8vIFNDRVYgcHJlZGljYXRlcyBpbiBvcmRlciB0byByZXR1cm4gYW4gZXhhY3QgYW5zd2VyLgorICBFeGl0TGltaXQgaG93RmFyVG9aZXJvKGNvbnN0IFNDRVYgKlYsIGNvbnN0IExvb3AgKkwsIGJvb2wgSXNTdWJFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dQcmVkaWNhdGVzID0gZmFsc2UpOworCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyBhbiBleGl0IGNvbmRpdGlvbiBjaGVja2luZyB0aGUgc3BlY2lmaWVkCisgIC8vLyB2YWx1ZSBmb3Igbm9uemVybyB3aWxsIGV4ZWN1dGUuICBJZiBub3QgY29tcHV0YWJsZSwgcmV0dXJuCisgIC8vLyBDb3VsZE5vdENvbXB1dGUuCisgIEV4aXRMaW1pdCBob3dGYXJUb05vblplcm8oY29uc3QgU0NFViAqViwgY29uc3QgTG9vcCAqTCk7CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIGFuIGV4aXQgY29uZGl0aW9uIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZAorICAvLy8gbGVzcy10aGFuIGNvbXBhcmlzb24gd2lsbCBleGVjdXRlLiAgSWYgbm90IGNvbXB1dGFibGUsIHJldHVybgorICAvLy8gQ291bGROb3RDb21wdXRlLgorICAvLy8KKyAgLy8vIFxwIGlzU2lnbmVkIHNwZWNpZmllcyB3aGV0aGVyIHRoZSBsZXNzLXRoYW4gaXMgc2lnbmVkLgorICAvLy8KKyAgLy8vIFxwIENvbnRyb2xzRXhpdCBpcyB0cnVlIHdoZW4gdGhlIExIUyA8IFJIUyBjb25kaXRpb24gZGlyZWN0bHkgY29udHJvbHMKKyAgLy8vIHRoZSBicmFuY2ggKGxvb3BzIGV4aXRzIG9ubHkgaWYgY29uZGl0aW9uIGlzIHRydWUpLiBJbiB0aGlzIGNhc2UsIHdlIGNhbgorICAvLy8gdXNlIE5vV3JhcEZsYWdzIHRvIHNraXAgb3ZlcmZsb3cgY2hlY2tzLgorICAvLy8KKyAgLy8vIElmIFxwIEFsbG93UHJlZGljYXRlcyBpcyBzZXQsIHRoaXMgY2FsbCB3aWxsIHRyeSB0byB1c2UgYSBtaW5pbWFsIHNldCBvZgorICAvLy8gU0NFViBwcmVkaWNhdGVzIGluIG9yZGVyIHRvIHJldHVybiBhbiBleGFjdCBhbnN3ZXIuCisgIEV4aXRMaW1pdCBob3dNYW55TGVzc1RoYW5zKGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTLCBjb25zdCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU2lnbmVkLCBib29sIENvbnRyb2xzRXhpdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd1ByZWRpY2F0ZXMgPSBmYWxzZSk7CisKKyAgRXhpdExpbWl0IGhvd01hbnlHcmVhdGVyVGhhbnMoY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMsIGNvbnN0IExvb3AgKkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTaWduZWQsIGJvb2wgSXNTdWJFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsbG93UHJlZGljYXRlcyA9IGZhbHNlKTsKKworICAvLy8gUmV0dXJuIGEgcHJlZGVjZXNzb3Igb2YgQkIgKHdoaWNoIG1heSBub3QgYmUgYW4gaW1tZWRpYXRlIHByZWRlY2Vzc29yKQorICAvLy8gd2hpY2ggaGFzIGV4YWN0bHkgb25lIHN1Y2Nlc3NvciBmcm9tIHdoaWNoIEJCIGlzIHJlYWNoYWJsZSwgb3IgbnVsbCBpZgorICAvLy8gbm8gc3VjaCBibG9jayBpcyBmb3VuZC4KKyAgc3RkOjpwYWlyPEJhc2ljQmxvY2sgKiwgQmFzaWNCbG9jayAqPgorICBnZXRQcmVkZWNlc3NvcldpdGhVbmlxdWVTdWNjZXNzb3JGb3JCQihCYXNpY0Jsb2NrICpCQik7CisKKyAgLy8vIFRlc3Qgd2hldGhlciB0aGUgY29uZGl0aW9uIGRlc2NyaWJlZCBieSBQcmVkLCBMSFMsIGFuZCBSSFMgaXMgdHJ1ZQorICAvLy8gd2hlbmV2ZXIgdGhlIGdpdmVuIEZvdW5kQ29uZFZhbHVlIHZhbHVlIGV2YWx1YXRlcyB0byB0cnVlLgorICBib29sIGlzSW1wbGllZENvbmQoSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLCBjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpGb3VuZENvbmRWYWx1ZSwgYm9vbCBJbnZlcnNlKTsKKworICAvLy8gVGVzdCB3aGV0aGVyIHRoZSBjb25kaXRpb24gZGVzY3JpYmVkIGJ5IFByZWQsIExIUywgYW5kIFJIUyBpcyB0cnVlCisgIC8vLyB3aGVuZXZlciB0aGUgY29uZGl0aW9uIGRlc2NyaWJlZCBieSBGb3VuZFByZWQsIEZvdW5kTEhTLCBGb3VuZFJIUyBpcworICAvLy8gdHJ1ZS4KKyAgYm9vbCBpc0ltcGxpZWRDb25kKElDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCwgY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMsCisgICAgICAgICAgICAgICAgICAgICBJQ21wSW5zdDo6UHJlZGljYXRlIEZvdW5kUHJlZCwgY29uc3QgU0NFViAqRm91bmRMSFMsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpGb3VuZFJIUyk7CisKKyAgLy8vIFRlc3Qgd2hldGhlciB0aGUgY29uZGl0aW9uIGRlc2NyaWJlZCBieSBQcmVkLCBMSFMsIGFuZCBSSFMgaXMgdHJ1ZQorICAvLy8gd2hlbmV2ZXIgdGhlIGNvbmRpdGlvbiBkZXNjcmliZWQgYnkgUHJlZCwgRm91bmRMSFMsIGFuZCBGb3VuZFJIUyBpcworICAvLy8gdHJ1ZS4KKyAgYm9vbCBpc0ltcGxpZWRDb25kT3BlcmFuZHMoSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLCBjb25zdCBTQ0VWICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlJIUywgY29uc3QgU0NFViAqRm91bmRMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkZvdW5kUkhTKTsKKworICAvLy8gVGVzdCB3aGV0aGVyIHRoZSBjb25kaXRpb24gZGVzY3JpYmVkIGJ5IFByZWQsIExIUywgYW5kIFJIUyBpcyB0cnVlCisgIC8vLyB3aGVuZXZlciB0aGUgY29uZGl0aW9uIGRlc2NyaWJlZCBieSBQcmVkLCBGb3VuZExIUywgYW5kIEZvdW5kUkhTIGlzCisgIC8vLyB0cnVlLiBIZXJlIExIUyBpcyBhbiBvcGVyYXRpb24gdGhhdCBpbmNsdWRlcyBGb3VuZExIUyBhcyBvbmUgb2YgaXRzCisgIC8vLyBhcmd1bWVudHMuCisgIGJvb2wgaXNJbXBsaWVkVmlhT3BlcmF0aW9ucyhJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkZvdW5kTEhTLCBjb25zdCBTQ0VWICpGb3VuZFJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoID0gMCk7CisKKyAgLy8vIFRlc3Qgd2hldGhlciB0aGUgY29uZGl0aW9uIGRlc2NyaWJlZCBieSBQcmVkLCBMSFMsIGFuZCBSSFMgaXMgdHJ1ZS4KKyAgLy8vIFVzZSBvbmx5IHNpbXBsZSBub24tcmVjdXJzaXZlIHR5cGVzIG9mIGNoZWNrcywgc3VjaCBhcyByYW5nZSBhbmFseXNpcyBldGMuCisgIGJvb2wgaXNLbm93blZpYU5vblJlY3Vyc2l2ZVJlYXNvbmluZyhJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUyk7CisKKyAgLy8vIFRlc3Qgd2hldGhlciB0aGUgY29uZGl0aW9uIGRlc2NyaWJlZCBieSBQcmVkLCBMSFMsIGFuZCBSSFMgaXMgdHJ1ZQorICAvLy8gd2hlbmV2ZXIgdGhlIGNvbmRpdGlvbiBkZXNjcmliZWQgYnkgUHJlZCwgRm91bmRMSFMsIGFuZCBGb3VuZFJIUyBpcworICAvLy8gdHJ1ZS4KKyAgYm9vbCBpc0ltcGxpZWRDb25kT3BlcmFuZHNIZWxwZXIoSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLCBjb25zdCBTQ0VWICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlJIUywgY29uc3QgU0NFViAqRm91bmRMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkZvdW5kUkhTKTsKKworICAvLy8gVGVzdCB3aGV0aGVyIHRoZSBjb25kaXRpb24gZGVzY3JpYmVkIGJ5IFByZWQsIExIUywgYW5kIFJIUyBpcyB0cnVlCisgIC8vLyB3aGVuZXZlciB0aGUgY29uZGl0aW9uIGRlc2NyaWJlZCBieSBQcmVkLCBGb3VuZExIUywgYW5kIEZvdW5kUkhTIGlzCisgIC8vLyB0cnVlLiAgVXRpbGl0eSBmdW5jdGlvbiB1c2VkIGJ5IGlzSW1wbGllZENvbmRPcGVyYW5kcy4gIFRyaWVzIHRvIGdldAorICAvLy8gY2FzZXMgbGlrZSAiWCBgc2d0YCAwID0+IFggLSAxIGBzZ3RgIC0xIi4KKyAgYm9vbCBpc0ltcGxpZWRDb25kT3BlcmFuZHNWaWFSYW5nZXMoSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLCBjb25zdCBTQ0VWICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlJIUywgY29uc3QgU0NFViAqRm91bmRMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkZvdW5kUkhTKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGNvbmRpdGlvbiBkZW5vdGVkIGJ5IFxwIExIUyBccCBQcmVkIFxwIFJIUyBpcyBpbXBsaWVkCisgIC8vLyBieSBhIGNhbGwgdG8gXGMgQGxsdm0uZXhwZXJpbWVudGFsLmd1YXJkIGluIFxwIEJCLgorICBib29sIGlzSW1wbGllZFZpYUd1YXJkKEJhc2ljQmxvY2sgKkJCLCBJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqTEhTLCBjb25zdCBTQ0VWICpSSFMpOworCisgIC8vLyBUZXN0IHdoZXRoZXIgdGhlIGNvbmRpdGlvbiBkZXNjcmliZWQgYnkgUHJlZCwgTEhTLCBhbmQgUkhTIGlzIHRydWUKKyAgLy8vIHdoZW5ldmVyIHRoZSBjb25kaXRpb24gZGVzY3JpYmVkIGJ5IFByZWQsIEZvdW5kTEhTLCBhbmQgRm91bmRSSFMgaXMKKyAgLy8vIHRydWUuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIHRyaWVzIHRvIHJ1bGUgb3V0IGNlcnRhaW4ga2luZHMgb2YgaW50ZWdlciBvdmVyZmxvdywgYW5kCisgIC8vLyB0aGVuIHRyaWVzIHRvIHJlYXNvbiBhYm91dCBhcml0aG1ldGljIHByb3BlcnRpZXMgb2YgdGhlIHByZWRpY2F0ZXMuCisgIGJvb2wgaXNJbXBsaWVkQ29uZE9wZXJhbmRzVmlhTm9PdmVyZmxvdyhJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkZvdW5kTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRm91bmRSSFMpOworCisgIC8vLyBJZiB3ZSBrbm93IHRoYXQgdGhlIHNwZWNpZmllZCBQaGkgaXMgaW4gdGhlIGhlYWRlciBvZiBpdHMgY29udGFpbmluZworICAvLy8gbG9vcCwgd2Uga25vdyB0aGUgbG9vcCBleGVjdXRlcyBhIGNvbnN0YW50IG51bWJlciBvZiB0aW1lcywgYW5kIHRoZSBQSEkKKyAgLy8vIG5vZGUgaXMganVzdCBhIHJlY3VycmVuY2UgaW52b2x2aW5nIGNvbnN0YW50cywgZm9sZCBpdC4KKyAgQ29uc3RhbnQgKmdldENvbnN0YW50RXZvbHV0aW9uTG9vcEV4aXRWYWx1ZShQSElOb2RlICpQTiwgY29uc3QgQVBJbnQgJkJFcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpMKTsKKworICAvLy8gVGVzdCBpZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBpcyBrbm93biB0byBzYXRpc2Z5IHRoZSBjb25kaXRpb24gZGVzY3JpYmVkCisgIC8vLyBieSBQcmVkIGFuZCB0aGUga25vd24gY29uc3RhbnQgcmFuZ2VzIG9mIExIUyBhbmQgUkhTLgorICBib29sIGlzS25vd25QcmVkaWNhdGVWaWFDb25zdGFudFJhbmdlcyhJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKkxIUywgY29uc3QgU0NFViAqUkhTKTsKKworICAvLy8gVHJ5IHRvIHByb3ZlIHRoZSBjb25kaXRpb24gZGVzY3JpYmVkIGJ5ICJMSFMgUHJlZCBSSFMiIGJ5IHJ1bGluZyBvdXQKKyAgLy8vIGludGVnZXIgb3ZlcmZsb3cuCisgIC8vLworICAvLy8gRm9yIGluc3RhbmNlLCB0aGlzIHdpbGwgcmV0dXJuIHRydWUgZm9yICJBIHM8IChBICsgQyk8bnN3PiIgaWYgQyBpcworICAvLy8gcG9zaXRpdmUuCisgIGJvb2wgaXNLbm93blByZWRpY2F0ZVZpYU5vT3ZlcmZsb3coSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLCBjb25zdCBTQ0VWICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqUkhTKTsKKworICAvLy8gVHJ5IHRvIHNwbGl0IFByZWQgTEhTIFJIUyBpbnRvIGxvZ2ljYWwgY29uanVuY3Rpb25zIChhbmQncykgYW5kIHRyeSB0bworICAvLy8gcHJvdmUgdGhlbSBpbmRpdmlkdWFsbHkuCisgIGJvb2wgaXNLbm93blByZWRpY2F0ZVZpYVNwbGl0dGluZyhJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsIGNvbnN0IFNDRVYgKkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlJIUyk7CisKKyAgLy8vIFRyeSB0byBtYXRjaCB0aGUgRXhwciBhcyAiKEwgKyBSKTxGbGFncz4iLgorICBib29sIHNwbGl0QmluYXJ5QWRkKGNvbnN0IFNDRVYgKkV4cHIsIGNvbnN0IFNDRVYgKiZMLCBjb25zdCBTQ0VWIComUiwKKyAgICAgICAgICAgICAgICAgICAgICBTQ0VWOjpOb1dyYXBGbGFncyAmRmxhZ3MpOworCisgIC8vLyBDb21wdXRlIFxwIExIUyAtIFxwIFJIUyBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGFuIEFQSW50IGlmIGl0IGlzIGEKKyAgLy8vIGNvbnN0YW50LCBhbmQgTm9uZSBpZiBpdCBpc24ndC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGludGVuZGVkIHRvIGJlIGEgY2hlYXBlciB2ZXJzaW9uIG9mIGdldE1pbnVzU0NFVi4gIFdlIGNhbiBiZQorICAvLy8gZnJ1Z2FsIGhlcmUgc2luY2Ugd2UganVzdCBiYWlsIG91dCBvZiBhY3R1YWxseSBjb25zdHJ1Y3RpbmcgYW5kCisgIC8vLyBjYW5vbmljYWxpemluZyBhbiBleHByZXNzaW9uIGluIHRoZSBjYXNlcyB3aGVyZSB0aGUgcmVzdWx0IGlzbid0IGdvaW5nCisgIC8vLyB0byBiZSBhIGNvbnN0YW50LgorICBPcHRpb25hbDxBUEludD4gY29tcHV0ZUNvbnN0YW50RGlmZmVyZW5jZShjb25zdCBTQ0VWICpMSFMsIGNvbnN0IFNDRVYgKlJIUyk7CisKKyAgLy8vIERyb3AgbWVtb2l6ZWQgaW5mb3JtYXRpb24gY29tcHV0ZWQgZm9yIFMuCisgIHZvaWQgZm9yZ2V0TWVtb2l6ZWRSZXN1bHRzKGNvbnN0IFNDRVYgKlMpOworCisgIC8vLyBSZXR1cm4gYW4gZXhpc3RpbmcgU0NFViBmb3IgViBpZiB0aGVyZSBpcyBvbmUsIG90aGVyd2lzZSByZXR1cm4gbnVsbHB0ci4KKyAgY29uc3QgU0NFViAqZ2V0RXhpc3RpbmdTQ0VWKFZhbHVlICpWKTsKKworICAvLy8gUmV0dXJuIGZhbHNlIGlmZiBnaXZlbiBTQ0VWIGNvbnRhaW5zIGEgU0NFVlVua25vd24gd2l0aCBOVUxMIHZhbHVlLQorICAvLy8gcG9pbnRlci4KKyAgYm9vbCBjaGVja1ZhbGlkaXR5KGNvbnN0IFNDRVYgKlMpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBgRXh0ZW5kT3BUeWAoe2BTdGFydGAsKyxgU3RlcGB9KSBjYW4gYmUgcHJvdmVkIHRvIGJlCisgIC8vLyBlcXVhbCB0byB7YEV4dGVuZE9wVHlgKGBTdGFydGApLCssYEV4dGVuZE9wVHlgKGBTdGVwYCl9LiAgVGhpcyBpcworICAvLy8gZXF1aXZhbGVudCB0byBwcm92aW5nIG5vIHNpZ25lZCAocmVzcC4gdW5zaWduZWQpIHdyYXAgaW4KKyAgLy8vIHtgU3RhcnRgLCssYFN0ZXBgfSBpZiBgRXh0ZW5kT3BUeWAgaXMgYFNDRVZTaWduRXh0ZW5kRXhwcmAKKyAgLy8vIChyZXNwLiBgU0NFVlplcm9FeHRlbmRFeHByYCkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBFeHRlbmRPcFR5PgorICBib29sIHByb3ZlTm9XcmFwQnlWYXJ5aW5nU3RhcnQoY29uc3QgU0NFViAqU3RhcnQsIGNvbnN0IFNDRVYgKlN0ZXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb29wICpMKTsKKworICAvLy8gVHJ5IHRvIHByb3ZlIE5TVyBvciBOVVcgb24gXHAgQVIgcmVseWluZyBvbiBDb25zdGFudFJhbmdlIG1hbmlwdWxhdGlvbi4KKyAgU0NFVjo6Tm9XcmFwRmxhZ3MgcHJvdmVOb1dyYXBWaWFDb25zdGFudFJhbmdlcyhjb25zdCBTQ0VWQWRkUmVjRXhwciAqQVIpOworCisgIGJvb2wgaXNNb25vdG9uaWNQcmVkaWNhdGVJbXBsKGNvbnN0IFNDRVZBZGRSZWNFeHByICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCwgYm9vbCAmSW5jcmVhc2luZyk7CisKKyAgLy8vIFJldHVybiBTQ0VWIG5vLXdyYXAgZmxhZ3MgdGhhdCBjYW4gYmUgcHJvdmVuIGJhc2VkIG9uIHJlYXNvbmluZyBhYm91dAorICAvLy8gaG93IHBvaXNvbiBwcm9kdWNlZCBmcm9tIG5vLXdyYXAgZmxhZ3Mgb24gdGhpcyB2YWx1ZSAoZS5nLiBhIG51dyBhZGQpCisgIC8vLyB3b3VsZCB0cmlnZ2VyIHVuZGVmaW5lZCBiZWhhdmlvciBvbiBvdmVyZmxvdy4KKyAgU0NFVjo6Tm9XcmFwRmxhZ3MgZ2V0Tm9XcmFwRmxhZ3NGcm9tVUIoY29uc3QgVmFsdWUgKlYpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgU0NFViBjb3JyZXNwb25kaW5nIHRvIFxwIEkgaXMgbmV2ZXIgcG9pc29uLiAgUHJvdmluZworICAvLy8gdGhpcyBpcyBtb3JlIGNvbXBsZXggdGhhbiBwcm92aW5nIHRoYXQganVzdCBccCBJIGlzIG5ldmVyIHBvaXNvbiwgc2luY2UKKyAgLy8vIFNDRVYgY29tbW9ucyBleHByZXNzaW9ucyBhY3Jvc3MgY29udHJvbCBmbG93LCBhbmQgeW91IGNhbiBoYXZlIGNhc2VzCisgIC8vLyBsaWtlOgorICAvLy8KKyAgLy8vICAgaWR4MCA9IGEgKyBiOworICAvLy8gICBwdHJbaWR4MF0gPSAxMDA7CisgIC8vLyAgIGlmICg8Y29uZGl0aW9uPikgeworICAvLy8gICAgIGlkeDEgPSBhICtuc3cgYjsKKyAgLy8vICAgICBwdHJbaWR4MV0gPSAyMDA7CisgIC8vLyAgIH0KKyAgLy8vCisgIC8vLyB3aGVyZSB0aGUgU0NFViBleHByZXNzaW9uICgrIGEgYikgaXMgZ3VhcmFudGVlZCB0byBub3QgYmUgcG9pc29uIChhbmQKKyAgLy8vIGhlbmNlIG5vdCBzaWduLW92ZXJmbG93KSBvbmx5IGlmICI8Y29uZGl0aW9uPiIgaXMgdHJ1ZS4gIFNpbmNlIGJvdGgKKyAgLy8vIGBpZHgwYCBhbmQgYGlkeDFgIHdpbGwgYmUgbWFwcGVkIHRvIHRoZSBzYW1lIFNDRVYgZXhwcmVzc2lvbiwgKCsgYSBiKSwKKyAgLy8vIGl0IGlzIG5vdCBva2F5IHRvIGFubm90YXRlICgrIGEgYikgd2l0aCA8bnN3PiBpbiB0aGUgYWJvdmUgZXhhbXBsZS4KKyAgYm9vbCBpc1NDRVZFeHByTmV2ZXJQb2lzb24oY29uc3QgSW5zdHJ1Y3Rpb24gKkkpOworCisgIC8vLyBUaGlzIGlzIGxpa2UgXGMgaXNTQ0VWRXhwck5ldmVyUG9pc29uIGJ1dCBpdCBzcGVjaWZpY2FsbHkgd29ya3MgZm9yCisgIC8vLyBpbnN0cnVjdGlvbnMgdGhhdCB3aWxsIGdldCBtYXBwZWQgdG8gU0NFViBhZGQgcmVjdXJyZW5jZXMuICBSZXR1cm4gdHJ1ZQorICAvLy8gaWYgXHAgSSB3aWxsIG5ldmVyIGdlbmVyYXRlIHBvaXNvbiB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IFxwIEkgaXMgYW4KKyAgLy8vIGFkZCByZWN1cnJlbmNlIG9uIHRoZSBsb29wIFxwIEwuCisgIGJvb2wgaXNBZGRSZWNOZXZlclBvaXNvbihjb25zdCBJbnN0cnVjdGlvbiAqSSwgY29uc3QgTG9vcCAqTCk7CisKKyAgLy8vIFNpbWlsYXIgdG8gY3JlYXRlQWRkUmVjRnJvbVBISSwgYnV0IHdpdGggdGhlIGFkZGl0aW9uYWwgZmxleGliaWxpdHkgb2YKKyAgLy8vIHN1Z2dlc3RpbmcgcnVudGltZSBvdmVyZmxvdyBjaGVja3MgaW4gY2FzZSBjYXN0cyBhcmUgZW5jb3VudGVyZWQuCisgIC8vLyBJZiBzdWNjZXNzZnVsLCB0aGUgYW5hbHlzaXMgcmVjb3JkcyB0aGF0IGZvciB0aGlzIGxvb3AsIFxwIFN5bWJvbGljUEhJLAorICAvLy8gd2hpY2ggaXMgdGhlIFVua25vd25TQ0VWIGN1cnJlbnRseSByZXByZXNlbnRpbmcgdGhlIFBISSwgY2FuIGJlIHJld3JpdHRlbgorICAvLy8gaW50byBhbiBBZGRSZWMsIGFzc3VtaW5nIHNvbWUgcHJlZGljYXRlczsgVGhlIGZ1bmN0aW9uIHRoZW4gcmV0dXJucyB0aGUKKyAgLy8vIEFkZFJlYyBhbmQgdGhlIHByZWRpY2F0ZXMgYXMgYSBwYWlyLCBhbmQgY2FjaGVzIHRoaXMgcGFpciBpbgorICAvLy8gUHJlZGljYXRlZFNDRVZSZXdyaXRlcy4KKyAgLy8vIElmIHRoZSBhbmFseXNpcyBpcyBub3Qgc3VjY2Vzc2Z1bCwgYSBtYXBwaW5nIGZyb20gdGhlIFxwIFN5bWJvbGljUEhJIHRvCisgIC8vLyBpdHNlbGYgKHdpdGggbm8gcHJlZGljYXRlcykgaXMgcmVjb3JkZWQsIGFuZCBhIG51bGxwdHIgd2l0aCBhbiBlbXB0eQorICAvLy8gcHJlZGljYXRlcyB2ZWN0b3IgaXMgcmV0dXJuZWQgYXMgYSBwYWlyLgorICBPcHRpb25hbDxzdGQ6OnBhaXI8Y29uc3QgU0NFViAqLCBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWUHJlZGljYXRlICosIDM+Pj4KKyAgY3JlYXRlQWRkUmVjRnJvbVBISVdpdGhDYXN0c0ltcGwoY29uc3QgU0NFVlVua25vd24gKlN5bWJvbGljUEhJKTsKKworICAvLy8gQ29tcHV0ZSB0aGUgYmFja2VkZ2UgdGFrZW4gY291bnQga25vd2luZyB0aGUgaW50ZXJ2YWwgZGlmZmVyZW5jZSwgdGhlCisgIC8vLyBzdHJpZGUgYW5kIHByZXNlbmNlIG9mIHRoZSBlcXVhbGl0eSBpbiB0aGUgY29tcGFyaXNvbi4KKyAgY29uc3QgU0NFViAqY29tcHV0ZUJFQ291bnQoY29uc3QgU0NFViAqRGVsdGEsIGNvbnN0IFNDRVYgKlN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFcXVhbGl0eSk7CisKKyAgLy8vIENvbXB1dGUgdGhlIG1heGltdW0gYmFja2VkZ2UgY291bnQgYmFzZWQgb24gdGhlIHJhbmdlIG9mIHZhbHVlcworICAvLy8gcGVybWl0dGVkIGJ5IFN0YXJ0LCBFbmQsIGFuZCBTdHJpZGUuIFRoaXMgaXMgZm9yIGxvb3BzIG9mIHRoZSBmb3JtCisgIC8vLyB7U3RhcnQsICssIFN0cmlkZX0gTFQgRW5kLgorICAvLy8KKyAgLy8vIFByZWNvbmRpdGlvbjogdGhlIGluZHVjdGlvbiB2YXJpYWJsZSBpcyBrbm93biB0byBiZSBwb3NpdGl2ZS4gIFdlICpkb24ndCoKKyAgLy8vIGFzc2VydCB0aGVzZSBwcmVjb25kaXRpb25zIHNvIHBsZWFzZSBiZSBjYXJlZnVsLgorICBjb25zdCBTQ0VWICpjb21wdXRlTWF4QkVDb3VudEZvckxUKGNvbnN0IFNDRVYgKlN0YXJ0LCBjb25zdCBTQ0VWICpTdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqRW5kLCB1bnNpZ25lZCBCaXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzU2lnbmVkKTsKKworICAvLy8gVmVyaWZ5IGlmIGFuIGxpbmVhciBJViB3aXRoIHBvc2l0aXZlIHN0cmlkZSBjYW4gb3ZlcmZsb3cgd2hlbiBpbiBhCisgIC8vLyBsZXNzLXRoYW4gY29tcGFyaXNvbiwga25vd2luZyB0aGUgaW52YXJpYW50IHRlcm0gb2YgdGhlIGNvbXBhcmlzb24sCisgIC8vLyB0aGUgc3RyaWRlIGFuZCB0aGUga25vd2xlZGdlIG9mIE5TVy9OVVcgZmxhZ3Mgb24gdGhlIHJlY3VycmVuY2UuCisgIGJvb2wgZG9lc0lWT3ZlcmZsb3dPbkxUKGNvbnN0IFNDRVYgKlJIUywgY29uc3QgU0NFViAqU3RyaWRlLCBib29sIElzU2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE5vV3JhcCk7CisKKyAgLy8vIFZlcmlmeSBpZiBhbiBsaW5lYXIgSVYgd2l0aCBuZWdhdGl2ZSBzdHJpZGUgY2FuIG92ZXJmbG93IHdoZW4gaW4gYQorICAvLy8gZ3JlYXRlci10aGFuIGNvbXBhcmlzb24sIGtub3dpbmcgdGhlIGludmFyaWFudCB0ZXJtIG9mIHRoZSBjb21wYXJpc29uLAorICAvLy8gdGhlIHN0cmlkZSBhbmQgdGhlIGtub3dsZWRnZSBvZiBOU1cvTlVXIGZsYWdzIG9uIHRoZSByZWN1cnJlbmNlLgorICBib29sIGRvZXNJVk92ZXJmbG93T25HVChjb25zdCBTQ0VWICpSSFMsIGNvbnN0IFNDRVYgKlN0cmlkZSwgYm9vbCBJc1NpZ25lZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb1dyYXApOworCisgIC8vLyBHZXQgYWRkIGV4cHIgYWxyZWFkeSBjcmVhdGVkIG9yIGNyZWF0ZSBhIG5ldyBvbmUuCisgIGNvbnN0IFNDRVYgKmdldE9yQ3JlYXRlQWRkRXhwcihTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPiAmT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NFVjo6Tm9XcmFwRmxhZ3MgRmxhZ3MpOworCisgIC8vLyBHZXQgbXVsIGV4cHIgYWxyZWFkeSBjcmVhdGVkIG9yIGNyZWF0ZSBhIG5ldyBvbmUuCisgIGNvbnN0IFNDRVYgKmdldE9yQ3JlYXRlTXVsRXhwcihTbWFsbFZlY3RvckltcGw8Y29uc3QgU0NFViAqPiAmT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0NFVjo6Tm9XcmFwRmxhZ3MgRmxhZ3MpOworCisgIC8vLyBGaW5kIGFsbCBvZiB0aGUgbG9vcHMgdHJhbnNpdGl2ZWx5IHVzZWQgaW4gXHAgUywgYW5kIGZpbGwgXHAgTG9vcHNVc2VkLgorICAvLy8gQSBsb29wIGlzIGNvbnNpZGVyZWQgInVzZWQiIGJ5IGFuIGV4cHJlc3Npb24gaWYgaXQgY29udGFpbnMKKyAgLy8vIGFuIGFkZCByZWMgb24gc2FpZCBsb29wLgorICB2b2lkIGdldFVzZWRMb29wcyhjb25zdCBTQ0VWICpTLCBTbWFsbFB0clNldEltcGw8Y29uc3QgTG9vcCAqPiAmTG9vcHNVc2VkKTsKKworICAvLy8gRmluZCBhbGwgb2YgdGhlIGxvb3BzIHRyYW5zaXRpdmVseSB1c2VkIGluIFxwIFMsIGFuZCB1cGRhdGUgXGMgTG9vcFVzZXJzCisgIC8vLyBhY2NvcmRpbmdseS4KKyAgdm9pZCBhZGRUb0xvb3BVc2VMaXN0cyhjb25zdCBTQ0VWICpTKTsKKworICBGb2xkaW5nU2V0PFNDRVY+IFVuaXF1ZVNDRVZzOworICBGb2xkaW5nU2V0PFNDRVZQcmVkaWNhdGU+IFVuaXF1ZVByZWRzOworICBCdW1wUHRyQWxsb2NhdG9yIFNDRVZBbGxvY2F0b3I7CisKKyAgLy8vIFRoaXMgbWFwcyBsb29wcyB0byBhIGxpc3Qgb2YgU0NFViBleHByZXNzaW9ucyB0aGF0ICh0cmFuc2l0aXZlbHkpIHVzZSBzYWlkCisgIC8vLyBsb29wLgorICBEZW5zZU1hcDxjb25zdCBMb29wICosIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgND4+IExvb3BVc2VyczsKKworICAvLy8gQ2FjaGUgdGVudGF0aXZlIG1hcHBpbmdzIGZyb20gVW5rbm93blNDRVZzIGluIGEgTG9vcCwgdG8gYSBTQ0VWIGV4cHJlc3Npb24KKyAgLy8vIHRoZXkgY2FuIGJlIHJld3JpdHRlbiBpbnRvIHVuZGVyIGNlcnRhaW4gcHJlZGljYXRlcy4KKyAgRGVuc2VNYXA8c3RkOjpwYWlyPGNvbnN0IFNDRVZVbmtub3duICosIGNvbnN0IExvb3AgKj4sCisgICAgICAgICAgIHN0ZDo6cGFpcjxjb25zdCBTQ0VWICosIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVZQcmVkaWNhdGUgKiwgMz4+PgorICAgICAgUHJlZGljYXRlZFNDRVZSZXdyaXRlczsKKworICAvLy8gVGhlIGhlYWQgb2YgYSBsaW5rZWQgbGlzdCBvZiBhbGwgU0NFVlVua25vd24gdmFsdWVzIHRoYXQgaGF2ZSBiZWVuCisgIC8vLyBhbGxvY2F0ZWQuIFRoaXMgaXMgdXNlZCBieSByZWxlYXNlTWVtb3J5IHRvIGxvY2F0ZSB0aGVtIGFsbCBhbmQgY2FsbAorICAvLy8gdGhlaXIgZGVzdHJ1Y3RvcnMuCisgIFNDRVZVbmtub3duICpGaXJzdFVua25vd24gPSBudWxscHRyOworfTsKKworLy8vIEFuYWx5c2lzIHBhc3MgdGhhdCBleHBvc2VzIHRoZSBcYyBTY2FsYXJFdm9sdXRpb24gZm9yIGEgZnVuY3Rpb24uCitjbGFzcyBTY2FsYXJFdm9sdXRpb25BbmFseXNpcworICAgIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPFNjYWxhckV2b2x1dGlvbkFuYWx5c2lzPiB7CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxTY2FsYXJFdm9sdXRpb25BbmFseXNpcz47CisKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworcHVibGljOgorICB1c2luZyBSZXN1bHQgPSBTY2FsYXJFdm9sdXRpb247CisKKyAgU2NhbGFyRXZvbHV0aW9uIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBQcmludGVyIHBhc3MgZm9yIHRoZSBcYyBTY2FsYXJFdm9sdXRpb25BbmFseXNpcyByZXN1bHRzLgorY2xhc3MgU2NhbGFyRXZvbHV0aW9uUHJpbnRlclBhc3MKKyAgICA6IHB1YmxpYyBQYXNzSW5mb01peGluPFNjYWxhckV2b2x1dGlvblByaW50ZXJQYXNzPiB7CisgIHJhd19vc3RyZWFtICZPUzsKKworcHVibGljOgorICBleHBsaWNpdCBTY2FsYXJFdm9sdXRpb25QcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmT1MpIDogT1MoT1MpIHt9CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworY2xhc3MgU2NhbGFyRXZvbHV0aW9uV3JhcHBlclBhc3MgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgc3RkOjp1bmlxdWVfcHRyPFNjYWxhckV2b2x1dGlvbj4gU0U7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgU2NhbGFyRXZvbHV0aW9uV3JhcHBlclBhc3MoKTsKKworICBTY2FsYXJFdm9sdXRpb24gJmdldFNFKCkgeyByZXR1cm4gKlNFOyB9CisgIGNvbnN0IFNjYWxhckV2b2x1dGlvbiAmZ2V0U0UoKSBjb25zdCB7IHJldHVybiAqU0U7IH0KKworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZTsKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSAqID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgdmVyaWZ5QW5hbHlzaXMoKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vLyBBbiBpbnRlcmZhY2UgbGF5ZXIgd2l0aCBTQ0VWIHVzZWQgdG8gbWFuYWdlIGhvdyB3ZSBzZWUgU0NFViBleHByZXNzaW9ucworLy8vIGZvciB2YWx1ZXMgaW4gdGhlIGNvbnRleHQgb2YgZXhpc3RpbmcgcHJlZGljYXRlcy4gV2UgY2FuIGFkZCBuZXcKKy8vLyBwcmVkaWNhdGVzLCBidXQgd2UgY2Fubm90IHJlbW92ZSB0aGVtLgorLy8vCisvLy8gVGhpcyBsYXllciBoYXMgbXVsdGlwbGUgcHVycG9zZXM6CisvLy8gICAtIHByb3ZpZGVzIGEgc2ltcGxlIGludGVyZmFjZSBmb3IgU0NFViB2ZXJzaW9uaW5nLgorLy8vICAgLSBndWFyYW50ZWVzIHRoYXQgdGhlIG9yZGVyIG9mIHRyYW5zZm9ybWF0aW9ucyBhcHBsaWVkIG9uIGEgU0NFVgorLy8vICAgICBleHByZXNzaW9uIGZvciBhIHNpbmdsZSBWYWx1ZSBpcyBjb25zaXN0ZW50IGFjcm9zcyB0d28gZGlmZmVyZW50CisvLy8gICAgIGdldFNDRVYgY2FsbHMuIFRoaXMgbWVhbnMgdGhhdCwgZm9yIGV4YW1wbGUsIG9uY2Ugd2UndmUgb2J0YWluZWQKKy8vLyAgICAgYW4gQWRkUmVjIGV4cHJlc3Npb24gZm9yIGEgY2VydGFpbiB2YWx1ZSB0aHJvdWdoIGV4cHJlc3Npb24KKy8vLyAgICAgcmV3cml0aW5nLCB3ZSB3aWxsIGNvbnRpbnVlIHRvIGdldCBhbiBBZGRSZWMgZXhwcmVzc2lvbiBmb3IgdGhhdAorLy8vICAgICBWYWx1ZS4KKy8vLyAgIC0gbG93ZXJzIHRoZSBudW1iZXIgb2YgZXhwcmVzc2lvbiByZXdyaXRlcy4KK2NsYXNzIFByZWRpY2F0ZWRTY2FsYXJFdm9sdXRpb24geworcHVibGljOgorICBQcmVkaWNhdGVkU2NhbGFyRXZvbHV0aW9uKFNjYWxhckV2b2x1dGlvbiAmU0UsIExvb3AgJkwpOworCisgIGNvbnN0IFNDRVZVbmlvblByZWRpY2F0ZSAmZ2V0VW5pb25QcmVkaWNhdGUoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgU0NFViBleHByZXNzaW9uIG9mIFYsIGluIHRoZSBjb250ZXh0IG9mIHRoZSBjdXJyZW50IFNDRVYKKyAgLy8vIHByZWRpY2F0ZS4gIFRoZSBvcmRlciBvZiB0cmFuc2Zvcm1hdGlvbnMgYXBwbGllZCBvbiB0aGUgZXhwcmVzc2lvbiBvZiBWCisgIC8vLyByZXR1cm5lZCBieSBTY2FsYXJFdm9sdXRpb24gaXMgZ3VhcmFudGVlZCB0byBiZSBwcmVzZXJ2ZWQsIGV2ZW4gd2hlbgorICAvLy8gYWRkaW5nIG5ldyBwcmVkaWNhdGVzLgorICBjb25zdCBTQ0VWICpnZXRTQ0VWKFZhbHVlICpWKTsKKworICAvLy8gR2V0IHRoZSAocHJlZGljYXRlZCkgYmFja2VkZ2UgY291bnQgZm9yIHRoZSBhbmFseXplZCBsb29wLgorICBjb25zdCBTQ0VWICpnZXRCYWNrZWRnZVRha2VuQ291bnQoKTsKKworICAvLy8gQWRkcyBhIG5ldyBwcmVkaWNhdGUuCisgIHZvaWQgYWRkUHJlZGljYXRlKGNvbnN0IFNDRVZQcmVkaWNhdGUgJlByZWQpOworCisgIC8vLyBBdHRlbXB0cyB0byBwcm9kdWNlIGFuIEFkZFJlY0V4cHIgZm9yIFYgYnkgYWRkaW5nIGFkZGl0aW9uYWwgU0NFVgorICAvLy8gcHJlZGljYXRlcy4gSWYgd2UgY2FuJ3QgdHJhbnNmb3JtIHRoZSBleHByZXNzaW9uIGludG8gYW4gQWRkUmVjRXhwciB3ZQorICAvLy8gcmV0dXJuIG51bGxwdHIgYW5kIG5vdCBhZGQgYWRkaXRpb25hbCBTQ0VWIHByZWRpY2F0ZXMgdG8gdGhlIGN1cnJlbnQKKyAgLy8vIGNvbnRleHQuCisgIGNvbnN0IFNDRVZBZGRSZWNFeHByICpnZXRBc0FkZFJlYyhWYWx1ZSAqVik7CisKKyAgLy8vIFByb3ZlcyB0aGF0IFYgZG9lc24ndCBvdmVyZmxvdyBieSBhZGRpbmcgU0NFViBwcmVkaWNhdGUuCisgIHZvaWQgc2V0Tm9PdmVyZmxvdyhWYWx1ZSAqViwgU0NFVldyYXBQcmVkaWNhdGU6OkluY3JlbWVudFdyYXBGbGFncyBGbGFncyk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB3ZSd2ZSBwcm92ZWQgdGhhdCBWIGRvZXNuJ3Qgd3JhcCBieSBtZWFucyBvZiBhIFNDRVYKKyAgLy8vIHByZWRpY2F0ZS4KKyAgYm9vbCBoYXNOb092ZXJmbG93KFZhbHVlICpWLCBTQ0VWV3JhcFByZWRpY2F0ZTo6SW5jcmVtZW50V3JhcEZsYWdzIEZsYWdzKTsKKworICAvLy8gUmV0dXJucyB0aGUgU2NhbGFyRXZvbHV0aW9uIGFuYWx5c2lzIHVzZWQuCisgIFNjYWxhckV2b2x1dGlvbiAqZ2V0U0UoKSBjb25zdCB7IHJldHVybiAmU0U7IH0KKworICAvLy8gV2UgbmVlZCB0byBleHBsaWNpdGx5IGRlZmluZSB0aGUgY29weSBjb25zdHJ1Y3RvciBiZWNhdXNlIG9mIEZsYWdzTWFwLgorICBQcmVkaWNhdGVkU2NhbGFyRXZvbHV0aW9uKGNvbnN0IFByZWRpY2F0ZWRTY2FsYXJFdm9sdXRpb24gJik7CisKKyAgLy8vIFByaW50IHRoZSBTQ0VWIG1hcHBpbmdzIGRvbmUgYnkgdGhlIFByZWRpY2F0ZWQgU2NhbGFyIEV2b2x1dGlvbi4KKyAgLy8vIFRoZSBwcmludGVkIHRleHQgaXMgaW5kZW50ZWQgYnkgXHAgRGVwdGguCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBEZXB0aCkgY29uc3Q7CisKKyAgLy8vIENoZWNrIGlmIFxwIEFSMSBhbmQgXHAgQVIyIGFyZSBlcXVhbCwgd2hpbGUgdGFraW5nIGludG8gYWNjb3VudAorICAvLy8gRXF1YWwgcHJlZGljYXRlcyBpbiBQcmVkcy4KKyAgYm9vbCBhcmVBZGRSZWNzRXF1YWxXaXRoUHJlZHMoY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFSMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFSMikgY29uc3Q7CisKK3ByaXZhdGU6CisgIC8vLyBJbmNyZW1lbnRzIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgcHJlZGljYXRlLiAgVGhpcyBuZWVkcyB0byBiZSBjYWxsZWQKKyAgLy8vIGV2ZXJ5IHRpbWUgdGhlIFNDRVYgcHJlZGljYXRlIGNoYW5nZXMuCisgIHZvaWQgdXBkYXRlR2VuZXJhdGlvbigpOworCisgIC8vLyBIb2xkcyBhIFNDRVYgYW5kIHRoZSB2ZXJzaW9uIG51bWJlciBvZiB0aGUgU0NFViBwcmVkaWNhdGUgdXNlZCB0bworICAvLy8gcGVyZm9ybSB0aGUgcmV3cml0ZSBvZiB0aGUgZXhwcmVzc2lvbi4KKyAgdXNpbmcgUmV3cml0ZUVudHJ5ID0gc3RkOjpwYWlyPHVuc2lnbmVkLCBjb25zdCBTQ0VWICo+OworCisgIC8vLyBNYXBzIGEgU0NFViB0byB0aGUgcmV3cml0ZSByZXN1bHQgb2YgdGhhdCBTQ0VWIGF0IGEgY2VydGFpbiB2ZXJzaW9uCisgIC8vLyBudW1iZXIuIElmIHRoaXMgbnVtYmVyIGRvZXNuJ3QgbWF0Y2ggdGhlIGN1cnJlbnQgR2VuZXJhdGlvbiwgd2Ugd2lsbAorICAvLy8gbmVlZCB0byBkbyBhIHJld3JpdGUuIFRvIHByZXNlcnZlIHRoZSB0cmFuc2Zvcm1hdGlvbiBvcmRlciBvZiBwcmV2aW91cworICAvLy8gcmV3cml0ZXMsIHdlIHdpbGwgcmV3cml0ZSB0aGUgcHJldmlvdXMgcmVzdWx0IGluc3RlYWQgb2YgdGhlIG9yaWdpbmFsCisgIC8vLyBTQ0VWLgorICBEZW5zZU1hcDxjb25zdCBTQ0VWICosIFJld3JpdGVFbnRyeT4gUmV3cml0ZU1hcDsKKworICAvLy8gUmVjb3JkcyB3aGF0IE5vV3JhcCBmbGFncyB3ZSd2ZSBhZGRlZCB0byBhIFZhbHVlICouCisgIFZhbHVlTWFwPFZhbHVlICosIFNDRVZXcmFwUHJlZGljYXRlOjpJbmNyZW1lbnRXcmFwRmxhZ3M+IEZsYWdzTWFwOworCisgIC8vLyBUaGUgU2NhbGFyRXZvbHV0aW9uIGFuYWx5c2lzLgorICBTY2FsYXJFdm9sdXRpb24gJlNFOworCisgIC8vLyBUaGUgYW5hbHl6ZWQgTG9vcC4KKyAgY29uc3QgTG9vcCAmTDsKKworICAvLy8gVGhlIFNDRVZQcmVkaWNhdGUgdGhhdCBmb3JtcyBvdXIgY29udGV4dC4gV2Ugd2lsbCByZXdyaXRlIGFsbAorICAvLy8gZXhwcmVzc2lvbnMgYXNzdW1pbmcgdGhhdCB0aGlzIHByZWRpY2F0ZSB0cnVlLgorICBTQ0VWVW5pb25QcmVkaWNhdGUgUHJlZHM7CisKKyAgLy8vIE1hcmtzIHRoZSB2ZXJzaW9uIG9mIHRoZSBTQ0VWIHByZWRpY2F0ZSB1c2VkLiBXaGVuIHJld3JpdGluZyBhIFNDRVYKKyAgLy8vIGV4cHJlc3Npb24gd2UgbWFyayBpdCB3aXRoIHRoZSB2ZXJzaW9uIG9mIHRoZSBwcmVkaWNhdGUuIFdlIHVzZSB0aGlzIHRvCisgIC8vLyBmaWd1cmUgb3V0IGlmIHRoZSBwcmVkaWNhdGUgaGFzIGNoYW5nZWQgZnJvbSB0aGUgbGFzdCByZXdyaXRlIG9mIHRoZQorICAvLy8gU0NFVi4gSWYgc28sIHdlIG5lZWQgdG8gcGVyZm9ybSBhIG5ldyByZXdyaXRlLgorICB1bnNpZ25lZCBHZW5lcmF0aW9uID0gMDsKKworICAvLy8gVGhlIGJhY2tlZGdlIHRha2VuIGNvdW50LgorICBjb25zdCBTQ0VWICpCYWNrZWRnZUNvdW50ID0gbnVsbHB0cjsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0FOQUxZU0lTX1NDQUxBUkVWT0xVVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkFsaWFzQW5hbHlzaXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uQWxpYXNBbmFseXNpcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyOWJlNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkFsaWFzQW5hbHlzaXMuaApAQCAtMCwwICsxLDcyIEBACisvLz09PS0gU2NhbGFyRXZvbHV0aW9uQWxpYXNBbmFseXNpcy5oIC0gU0NFVi1iYXNlZCBBQSAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gVGhpcyBpcyB0aGUgaW50ZXJmYWNlIGZvciBhIFNDRVYtYmFzZWQgYWxpYXMgYW5hbHlzaXMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19TQ0FMQVJFVk9MVVRJT05BTElBU0FOQUxZU0lTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19TQ0FMQVJFVk9MVVRJT05BTElBU0FOQUxZU0lTX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uRXhwcmVzc2lvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQSBzaW1wbGUgYWxpYXMgYW5hbHlzaXMgaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIFNjYWxhckV2b2x1dGlvbiB0byBhbnN3ZXIKKy8vLyBxdWVyaWVzLgorY2xhc3MgU0NFVkFBUmVzdWx0IDogcHVibGljIEFBUmVzdWx0QmFzZTxTQ0VWQUFSZXN1bHQ+IHsKKyAgU2NhbGFyRXZvbHV0aW9uICZTRTsKKworcHVibGljOgorICBleHBsaWNpdCBTQ0VWQUFSZXN1bHQoU2NhbGFyRXZvbHV0aW9uICZTRSkgOiBBQVJlc3VsdEJhc2UoKSwgU0UoU0UpIHt9CisgIFNDRVZBQVJlc3VsdChTQ0VWQUFSZXN1bHQgJiZBcmcpIDogQUFSZXN1bHRCYXNlKHN0ZDo6bW92ZShBcmcpKSwgU0UoQXJnLlNFKSB7fQorCisgIEFsaWFzUmVzdWx0IGFsaWFzKGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2NBLCBjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jQik7CisKK3ByaXZhdGU6CisgIFZhbHVlICpHZXRCYXNlVmFsdWUoY29uc3QgU0NFViAqUyk7Cit9OworCisvLy8gQW5hbHlzaXMgcGFzcyBwcm92aWRpbmcgYSBuZXZlci1pbnZhbGlkYXRlZCBhbGlhcyBhbmFseXNpcyByZXN1bHQuCitjbGFzcyBTQ0VWQUEgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48U0NFVkFBPiB7CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxTQ0VWQUE+OworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCitwdWJsaWM6CisgIHR5cGVkZWYgU0NFVkFBUmVzdWx0IFJlc3VsdDsKKworICBTQ0VWQUFSZXN1bHQgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIExlZ2FjeSB3cmFwcGVyIHBhc3MgdG8gcHJvdmlkZSB0aGUgU0NFVkFBUmVzdWx0IG9iamVjdC4KK2NsYXNzIFNDRVZBQVdyYXBwZXJQYXNzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CisgIHN0ZDo6dW5pcXVlX3B0cjxTQ0VWQUFSZXN1bHQ+IFJlc3VsdDsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBTQ0VWQUFXcmFwcGVyUGFzcygpOworCisgIFNDRVZBQVJlc3VsdCAmZ2V0UmVzdWx0KCkgeyByZXR1cm4gKlJlc3VsdDsgfQorICBjb25zdCBTQ0VWQUFSZXN1bHQgJmdldFJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuICpSZXN1bHQ7IH0KKworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vIENyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgXGMgU0NFVkFBV3JhcHBlclBhc3MuCitGdW5jdGlvblBhc3MgKmNyZWF0ZVNDRVZBQVdyYXBwZXJQYXNzKCk7CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkV4cGFuZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkV4cGFuZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2RmMDRlOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uRXhwYW5kZXIuaApAQCAtMCwwICsxLDM5NyBAQAorLy89PT0tLS0tIGxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uRXhwYW5kZXIuaCAtIFNDRVYgRXhwcnMgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgY2xhc3NlcyB1c2VkIHRvIGdlbmVyYXRlIGNvZGUgZnJvbSBzY2FsYXIgZXhwcmVzc2lvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1NDQUxBUkVWT0xVVElPTkVYUEFOREVSX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19TQ0FMQVJFVk9MVVRJT05FWFBBTkRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkV4cHJlc3Npb25zLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25Ob3JtYWxpemF0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9UYXJnZXRGb2xkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0lSQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVIYW5kbGUuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBUYXJnZXRUcmFuc2Zvcm1JbmZvOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gZXhwcmVzc2lvbiBpcyBzYWZlIHRvIGV4cGFuZCBpbiB0aGUgc2Vuc2UgdGhhdAorICAvLy8gYWxsIG1hdGVyaWFsaXplZCB2YWx1ZXMgYXJlIHNhZmUgdG8gc3BlY3VsYXRlIGFueXdoZXJlIHRoZWlyIG9wZXJhbmRzIGFyZQorICAvLy8gZGVmaW5lZC4KKyAgYm9vbCBpc1NhZmVUb0V4cGFuZChjb25zdCBTQ0VWICpTLCBTY2FsYXJFdm9sdXRpb24gJlNFKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGV4cHJlc3Npb24gaXMgc2FmZSB0byBleHBhbmQgaW4gdGhlIHNlbnNlIHRoYXQKKyAgLy8vIGFsbCBtYXRlcmlhbGl6ZWQgdmFsdWVzIGFyZSBkZWZpbmVkIGFuZCBzYWZlIHRvIHNwZWN1bGF0ZSBhdCB0aGUgc3BlY2lmaWVkCisgIC8vLyBsb2NhdGlvbiBhbmQgdGhlaXIgb3BlcmFuZHMgYXJlIGRlZmluZWQgYXQgdGhpcyBsb2NhdGlvbi4KKyAgYm9vbCBpc1NhZmVUb0V4cGFuZEF0KGNvbnN0IFNDRVYgKlMsIGNvbnN0IEluc3RydWN0aW9uICpJbnNlcnRpb25Qb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhckV2b2x1dGlvbiAmU0UpOworCisgIC8vLyBUaGlzIGNsYXNzIHVzZXMgaW5mb3JtYXRpb24gYWJvdXQgYW5hbHl6ZSBzY2FsYXJzIHRvIHJld3JpdGUgZXhwcmVzc2lvbnMKKyAgLy8vIGluIGNhbm9uaWNhbCBmb3JtLgorICAvLy8KKyAgLy8vIENsaWVudHMgc2hvdWxkIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdoZW4gcmV3cml0aW5nIGlzIG5lZWRlZCwKKyAgLy8vIGFuZCBkZXN0cm95IGl0IHdoZW4gZmluaXNoZWQgdG8gYWxsb3cgdGhlIHJlbGVhc2Ugb2YgdGhlIGFzc29jaWF0ZWQKKyAgLy8vIG1lbW9yeS4KKyAgY2xhc3MgU0NFVkV4cGFuZGVyIDogcHVibGljIFNDRVZWaXNpdG9yPFNDRVZFeHBhbmRlciwgVmFsdWUqPiB7CisgICAgU2NhbGFyRXZvbHV0aW9uICZTRTsKKyAgICBjb25zdCBEYXRhTGF5b3V0ICZETDsKKworICAgIC8vIE5ldyBpbnN0cnVjdGlvbnMgcmVjZWl2ZSBhIG5hbWUgdG8gaWRlbnRpZnkgdGhlbSB3aXRoIHRoZSBjdXJyZW50IHBhc3MuCisgICAgY29uc3QgY2hhciogSVZOYW1lOworCisgICAgLy8gSW5zZXJ0ZWRFeHByZXNzaW9ucyBjYWNoZXMgVmFsdWVzIGZvciByZXVzZSwgc28gbXVzdCB0cmFjayBSQVVXLgorICAgIERlbnNlTWFwPHN0ZDo6cGFpcjxjb25zdCBTQ0VWICosIEluc3RydWN0aW9uICo+LCBUcmFja2luZ1ZIPFZhbHVlPj4KKyAgICAgICAgSW5zZXJ0ZWRFeHByZXNzaW9uczsKKworICAgIC8vIEluc2VydGVkVmFsdWVzIG9ubHkgZmxhZ3MgaW5zZXJ0ZWQgaW5zdHJ1Y3Rpb25zIHNvIG5lZWRzIG5vIFJBVVcuCisgICAgRGVuc2VTZXQ8QXNzZXJ0aW5nVkg8VmFsdWU+PiBJbnNlcnRlZFZhbHVlczsKKyAgICBEZW5zZVNldDxBc3NlcnRpbmdWSDxWYWx1ZT4+IEluc2VydGVkUG9zdEluY1ZhbHVlczsKKworICAgIC8vLyBBIG1lbW9pemF0aW9uIG9mIHRoZSAicmVsZXZhbnQiIGxvb3AgZm9yIGEgZ2l2ZW4gU0NFVi4KKyAgICBEZW5zZU1hcDxjb25zdCBTQ0VWICosIGNvbnN0IExvb3AgKj4gUmVsZXZhbnRMb29wczsKKworICAgIC8vLyBBZGRyZWNzIHJlZmVycmluZyB0byBhbnkgb2YgdGhlIGdpdmVuIGxvb3BzIGFyZSBleHBhbmRlZCBpbiBwb3N0LWluYworICAgIC8vLyBtb2RlLiBGb3IgZXhhbXBsZSwgZXhwYW5kaW5nIHsxLCssMX08TD4gaW4gcG9zdC1pbmMgbW9kZSByZXR1cm5zIHRoZSBhZGQKKyAgICAvLy8gaW5zdHJ1Y3Rpb24gdGhhdCBhZGRzIG9uZSB0byB0aGUgcGhpIGZvciB7MCwrLDF9PEw+LCBhcyBvcHBvc2VkIHRvIGEgbmV3CisgICAgLy8vIHBoaSBzdGFydGluZyBhdCAxLiBUaGlzIGlzIG9ubHkgc3VwcG9ydGVkIGluIG5vbi1jYW5vbmljYWwgbW9kZS4KKyAgICBQb3N0SW5jTG9vcFNldCBQb3N0SW5jTG9vcHM7CisKKyAgICAvLy8gV2hlbiB0aGlzIGlzIG5vbi1udWxsLCBhZGRyZWNzIGV4cGFuZGVkIGluIHRoZSBsb29wIGl0IGluZGljYXRlcyBzaG91bGQKKyAgICAvLy8gYmUgaW5zZXJ0ZWQgd2l0aCBpbmNyZW1lbnRzIGF0IElWSW5jSW5zZXJ0UG9zLgorICAgIGNvbnN0IExvb3AgKklWSW5jSW5zZXJ0TG9vcDsKKworICAgIC8vLyBXaGVuIGV4cGFuZGluZyBhZGRyZWNzIGluIHRoZSBJVkluY0luc2VydExvb3AgbG9vcCwgaW5zZXJ0IHRoZSBJVgorICAgIC8vLyBpbmNyZW1lbnQgYXQgdGhpcyBwb3NpdGlvbi4KKyAgICBJbnN0cnVjdGlvbiAqSVZJbmNJbnNlcnRQb3M7CisKKyAgICAvLy8gUGhpcyB0aGF0IGNvbXBsZXRlIGFuIElWIGNoYWluLiBSZXVzZQorICAgIERlbnNlU2V0PEFzc2VydGluZ1ZIPFBISU5vZGU+PiBDaGFpbmVkUGhpczsKKworICAgIC8vLyBXaGVuIHRydWUsIGV4cHJlc3Npb25zIGFyZSBleHBhbmRlZCBpbiAiY2Fub25pY2FsIiBmb3JtLiBJbiBwYXJ0aWN1bGFyLAorICAgIC8vLyBhZGRyZWNzIGFyZSBleHBhbmRlZCBhcyBhcml0aG1ldGljIGJhc2VkIG9uIGEgY2Fub25pY2FsIGluZHVjdGlvbgorICAgIC8vLyB2YXJpYWJsZS4gV2hlbiBmYWxzZSwgZXhwcmVzc2lvbiBhcmUgZXhwYW5kZWQgaW4gYSBtb3JlIGxpdGVyYWwgZm9ybS4KKyAgICBib29sIENhbm9uaWNhbE1vZGU7CisKKyAgICAvLy8gV2hlbiBpbnZva2VkIGZyb20gTFNSLCB0aGUgZXhwYW5kZXIgaXMgaW4gInN0cmVuZ3RoIHJlZHVjdGlvbiIgbW9kZS4gVGhlCisgICAgLy8vIG9ubHkgZGlmZmVyZW5jZSBpcyB0aGF0IHBoaSdzIGFyZSBvbmx5IHJldXNlZCBpZiB0aGV5IGFyZSBhbHJlYWR5IGluCisgICAgLy8vICJleHBhbmRlZCIgZm9ybS4KKyAgICBib29sIExTUk1vZGU7CisKKyAgICB0eXBlZGVmIElSQnVpbGRlcjxUYXJnZXRGb2xkZXI+IEJ1aWxkZXJUeXBlOworICAgIEJ1aWxkZXJUeXBlIEJ1aWxkZXI7CisKKyAgICAvLyBSQUlJIG9iamVjdCB0aGF0IHN0b3JlcyB0aGUgY3VycmVudCBpbnNlcnRpb24gcG9pbnQgYW5kIHJlc3RvcmVzIGl0IHdoZW4KKyAgICAvLyB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZC4gVGhpcyBpbmNsdWRlcyB0aGUgZGVidWcgbG9jYXRpb24uICBEdXBsaWNhdGVkCisgICAgLy8gZnJvbSBJbnNlcnRQb2ludEd1YXJkIHRvIGFkZCBTZXRJbnNlcnRQb2ludCgpIHdoaWNoIGlzIHVzZWQgdG8gdXBkYXRlZAorICAgIC8vIEluc2VydFBvaW50R3VhcmRzIHN0YWNrIHdoZW4gaW5zZXJ0IHBvaW50cyBhcmUgbW92ZWQgZHVyaW5nIFNDRVYKKyAgICAvLyBleHBhbnNpb24uCisgICAgY2xhc3MgU0NFVkluc2VydFBvaW50R3VhcmQgeworICAgICAgSVJCdWlsZGVyQmFzZSAmQnVpbGRlcjsKKyAgICAgIEFzc2VydGluZ1ZIPEJhc2ljQmxvY2s+IEJsb2NrOworICAgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgUG9pbnQ7CisgICAgICBEZWJ1Z0xvYyBEYmdMb2M7CisgICAgICBTQ0VWRXhwYW5kZXIgKlNFOworCisgICAgICBTQ0VWSW5zZXJ0UG9pbnRHdWFyZChjb25zdCBTQ0VWSW5zZXJ0UG9pbnRHdWFyZCAmKSA9IGRlbGV0ZTsKKyAgICAgIFNDRVZJbnNlcnRQb2ludEd1YXJkICZvcGVyYXRvcj0oY29uc3QgU0NFVkluc2VydFBvaW50R3VhcmQgJikgPSBkZWxldGU7CisKKyAgICBwdWJsaWM6CisgICAgICBTQ0VWSW5zZXJ0UG9pbnRHdWFyZChJUkJ1aWxkZXJCYXNlICZCLCBTQ0VWRXhwYW5kZXIgKlNFKQorICAgICAgICAgIDogQnVpbGRlcihCKSwgQmxvY2soQi5HZXRJbnNlcnRCbG9jaygpKSwgUG9pbnQoQi5HZXRJbnNlcnRQb2ludCgpKSwKKyAgICAgICAgICAgIERiZ0xvYyhCLmdldEN1cnJlbnREZWJ1Z0xvY2F0aW9uKCkpLCBTRShTRSkgeworICAgICAgICBTRS0+SW5zZXJ0UG9pbnRHdWFyZHMucHVzaF9iYWNrKHRoaXMpOworICAgICAgfQorCisgICAgICB+U0NFVkluc2VydFBvaW50R3VhcmQoKSB7CisgICAgICAgIC8vIFRoZXNlIGd1YXJkcyBzaG91bGQgYWx3YXlzIGNyZWF0ZWQvZGVzdHJveWVkIGluIEZJRk8gb3JkZXIgc2luY2UgdGhleQorICAgICAgICAvLyBhcmUgdXNlZCB0byBndWFyZCBsZXhpY2FsbHkgc2NvcGVkIGJsb2NrcyBvZiBjb2RlIGluCisgICAgICAgIC8vIFNjYWxhckV2b2x1dGlvbkV4cGFuZGVyLgorICAgICAgICBhc3NlcnQoU0UtPkluc2VydFBvaW50R3VhcmRzLmJhY2soKSA9PSB0aGlzKTsKKyAgICAgICAgU0UtPkluc2VydFBvaW50R3VhcmRzLnBvcF9iYWNrKCk7CisgICAgICAgIEJ1aWxkZXIucmVzdG9yZUlQKElSQnVpbGRlckJhc2U6Okluc2VydFBvaW50KEJsb2NrLCBQb2ludCkpOworICAgICAgICBCdWlsZGVyLlNldEN1cnJlbnREZWJ1Z0xvY2F0aW9uKERiZ0xvYyk7CisgICAgICB9CisKKyAgICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEdldEluc2VydFBvaW50KCkgY29uc3QgeyByZXR1cm4gUG9pbnQ7IH0KKyAgICAgIHZvaWQgU2V0SW5zZXJ0UG9pbnQoQmFzaWNCbG9jazo6aXRlcmF0b3IgSSkgeyBQb2ludCA9IEk7IH0KKyAgICB9OworCisgICAgLy8vIFN0YWNrIG9mIHBvaW50ZXJzIHRvIHNhdmVkIGluc2VydCBwb2ludHMsIHVzZWQgdG8ga2VlcCBpbnNlcnQgcG9pbnRzCisgICAgLy8vIGNvbnNpc3RlbnQgd2hlbiBpbnN0cnVjdGlvbnMgYXJlIG1vdmVkLgorICAgIFNtYWxsVmVjdG9yPFNDRVZJbnNlcnRQb2ludEd1YXJkICosIDg+IEluc2VydFBvaW50R3VhcmRzOworCisjaWZuZGVmIE5ERUJVRworICAgIGNvbnN0IGNoYXIgKkRlYnVnVHlwZTsKKyNlbmRpZgorCisgICAgZnJpZW5kIHN0cnVjdCBTQ0VWVmlzaXRvcjxTQ0VWRXhwYW5kZXIsIFZhbHVlKj47CisKKyAgcHVibGljOgorICAgIC8vLyBDb25zdHJ1Y3QgYSBTQ0VWRXhwYW5kZXIgaW4gImNhbm9uaWNhbCIgbW9kZS4KKyAgICBleHBsaWNpdCBTQ0VWRXhwYW5kZXIoU2NhbGFyRXZvbHV0aW9uICZzZSwgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpCisgICAgICAgIDogU0Uoc2UpLCBETChETCksIElWTmFtZShuYW1lKSwgSVZJbmNJbnNlcnRMb29wKG51bGxwdHIpLAorICAgICAgICAgIElWSW5jSW5zZXJ0UG9zKG51bGxwdHIpLCBDYW5vbmljYWxNb2RlKHRydWUpLCBMU1JNb2RlKGZhbHNlKSwKKyAgICAgICAgICBCdWlsZGVyKHNlLmdldENvbnRleHQoKSwgVGFyZ2V0Rm9sZGVyKERMKSkgeworI2lmbmRlZiBOREVCVUcKKyAgICAgIERlYnVnVHlwZSA9ICIiOworI2VuZGlmCisgICAgfQorCisgICAgflNDRVZFeHBhbmRlcigpIHsKKyAgICAgIC8vIE1ha2Ugc3VyZSB0aGUgaW5zZXJ0IHBvaW50IGd1YXJkIHN0YWNrIGlzIGNvbnNpc3RlbnQuCisgICAgICBhc3NlcnQoSW5zZXJ0UG9pbnRHdWFyZHMuZW1wdHkoKSk7CisgICAgfQorCisjaWZuZGVmIE5ERUJVRworICAgIHZvaWQgc2V0RGVidWdUeXBlKGNvbnN0IGNoYXIqIHMpIHsgRGVidWdUeXBlID0gczsgfQorI2VuZGlmCisKKyAgICAvLy8gRXJhc2UgdGhlIGNvbnRlbnRzIG9mIHRoZSBJbnNlcnRlZEV4cHJlc3Npb25zIG1hcCBzbyB0aGF0IHVzZXJzIHRyeWluZworICAgIC8vLyB0byBleHBhbmQgdGhlIHNhbWUgZXhwcmVzc2lvbiBpbnRvIG11bHRpcGxlIEJhc2ljQmxvY2tzIG9yIGRpZmZlcmVudAorICAgIC8vLyBwbGFjZXMgd2l0aGluIHRoZSBzYW1lIEJhc2ljQmxvY2sgY2FuIGRvIHNvLgorICAgIHZvaWQgY2xlYXIoKSB7CisgICAgICBJbnNlcnRlZEV4cHJlc3Npb25zLmNsZWFyKCk7CisgICAgICBJbnNlcnRlZFZhbHVlcy5jbGVhcigpOworICAgICAgSW5zZXJ0ZWRQb3N0SW5jVmFsdWVzLmNsZWFyKCk7CisgICAgICBDaGFpbmVkUGhpcy5jbGVhcigpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBmb3IgZXhwcmVzc2lvbnMgdGhhdCBtYXkgaW5jdXIgbm9uLXRyaXZpYWwgY29zdCB0byBldmFsdWF0ZQorICAgIC8vLyBhdCBydW50aW1lLgorICAgIC8vLworICAgIC8vLyBBdCBpcyBhbiBvcHRpb25hbCBwYXJhbWV0ZXIgd2hpY2ggc3BlY2lmaWVzIHBvaW50IGluIGNvZGUgd2hlcmUgdXNlciBpcworICAgIC8vLyBnb2luZyB0byBleHBhbmQgdGhpcyBleHByZXNzaW9uLiBTb21ldGltZXMgdGhpcyBrbm93bGVkZ2UgY2FuIGxlYWQgdG8gYQorICAgIC8vLyBtb3JlIGFjY3VyYXRlIGNvc3QgZXN0aW1hdGlvbi4KKyAgICBib29sIGlzSGlnaENvc3RFeHBhbnNpb24oY29uc3QgU0NFViAqRXhwciwgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkF0ID0gbnVsbHB0cikgeworICAgICAgU21hbGxQdHJTZXQ8Y29uc3QgU0NFViAqLCA4PiBQcm9jZXNzZWQ7CisgICAgICByZXR1cm4gaXNIaWdoQ29zdEV4cGFuc2lvbkhlbHBlcihFeHByLCBMLCBBdCwgUHJvY2Vzc2VkKTsKKyAgICB9CisKKyAgICAvLy8gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgY2Fub25pY2FsIGluZHVjdGlvbiB2YXJpYWJsZSBvZiB0aGUgc3BlY2lmaWVkCisgICAgLy8vIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQgbG9vcCAoaW5zZXJ0aW5nIG9uZSBpZiB0aGVyZSBpcyBub25lKS4gIEEKKyAgICAvLy8gY2Fub25pY2FsIGluZHVjdGlvbiB2YXJpYWJsZSBzdGFydHMgYXQgemVybyBhbmQgc3RlcHMgYnkgb25lIG9uIGVhY2gKKyAgICAvLy8gaXRlcmF0aW9uLgorICAgIFBISU5vZGUgKmdldE9ySW5zZXJ0Q2Fub25pY2FsSW5kdWN0aW9uVmFyaWFibGUoY29uc3QgTG9vcCAqTCwgVHlwZSAqVHkpOworCisgICAgLy8vIFJldHVybiB0aGUgaW5kdWN0aW9uIHZhcmlhYmxlIGluY3JlbWVudCdzIElWIG9wZXJhbmQuCisgICAgSW5zdHJ1Y3Rpb24gKmdldElWSW5jT3BlcmFuZChJbnN0cnVjdGlvbiAqSW5jViwgSW5zdHJ1Y3Rpb24gKkluc2VydFBvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWxsb3dTY2FsZSk7CisKKyAgICAvLy8gVXRpbGl0eSBmb3IgaG9pc3RpbmcgYW4gSVYgaW5jcmVtZW50LgorICAgIGJvb2wgaG9pc3RJVkluYyhJbnN0cnVjdGlvbiAqSW5jViwgSW5zdHJ1Y3Rpb24gKkluc2VydFBvcyk7CisKKyAgICAvLy8gcmVwbGFjZSBjb25ncnVlbnQgcGhpcyB3aXRoIHRoZWlyIG1vc3QgY2Fub25pY2FsIHJlcHJlc2VudGF0aXZlLiBSZXR1cm4KKyAgICAvLy8gdGhlIG51bWJlciBvZiBwaGlzIGVsaW1pbmF0ZWQuCisgICAgdW5zaWduZWQgcmVwbGFjZUNvbmdydWVudElWcyhMb29wICpMLCBjb25zdCBEb21pbmF0b3JUcmVlICpEVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxXZWFrVHJhY2tpbmdWSD4gJkRlYWRJbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFRyYW5zZm9ybUluZm8gKlRUSSA9IG51bGxwdHIpOworCisgICAgLy8vIEluc2VydCBjb2RlIHRvIGRpcmVjdGx5IGNvbXB1dGUgdGhlIHNwZWNpZmllZCBTQ0VWIGV4cHJlc3Npb24gaW50byB0aGUKKyAgICAvLy8gcHJvZ3JhbS4gIFRoZSBpbnNlcnRlZCBjb2RlIGlzIGluc2VydGVkIGludG8gdGhlIHNwZWNpZmllZCBibG9jay4KKyAgICBWYWx1ZSAqZXhwYW5kQ29kZUZvcihjb25zdCBTQ0VWICpTSCwgVHlwZSAqVHksIEluc3RydWN0aW9uICpJKTsKKworICAgIC8vLyBJbnNlcnQgY29kZSB0byBkaXJlY3RseSBjb21wdXRlIHRoZSBzcGVjaWZpZWQgU0NFViBleHByZXNzaW9uIGludG8gdGhlCisgICAgLy8vIHByb2dyYW0uICBUaGUgaW5zZXJ0ZWQgY29kZSBpcyBpbnNlcnRlZCBpbnRvIHRoZSBTQ0VWRXhwYW5kZXIncyBjdXJyZW50CisgICAgLy8vIGluc2VydGlvbiBwb2ludC4gSWYgYSB0eXBlIGlzIHNwZWNpZmllZCwgdGhlIHJlc3VsdCB3aWxsIGJlIGV4cGFuZGVkIHRvCisgICAgLy8vIGhhdmUgdGhhdCB0eXBlLCB3aXRoIGEgY2FzdCBpZiBuZWNlc3NhcnkuCisgICAgVmFsdWUgKmV4cGFuZENvZGVGb3IoY29uc3QgU0NFViAqU0gsIFR5cGUgKlR5ID0gbnVsbHB0cik7CisKKworICAgIC8vLyBHZW5lcmF0ZXMgYSBjb2RlIHNlcXVlbmNlIHRoYXQgZXZhbHVhdGVzIHRoaXMgcHJlZGljYXRlLiAgVGhlIGluc2VydGVkCisgICAgLy8vIGluc3RydWN0aW9ucyB3aWxsIGJlIGF0IHBvc2l0aW9uIFxwIExvYy4gIFRoZSByZXN1bHQgd2lsbCBiZSBvZiB0eXBlIGkxCisgICAgLy8vIGFuZCB3aWxsIGhhdmUgYSB2YWx1ZSBvZiAwIHdoZW4gdGhlIHByZWRpY2F0ZSBpcyBmYWxzZSBhbmQgMSBvdGhlcndpc2UuCisgICAgVmFsdWUgKmV4cGFuZENvZGVGb3JQcmVkaWNhdGUoY29uc3QgU0NFVlByZWRpY2F0ZSAqUHJlZCwgSW5zdHJ1Y3Rpb24gKkxvYyk7CisKKyAgICAvLy8gQSBzcGVjaWFsaXplZCB2YXJpYW50IG9mIGV4cGFuZENvZGVGb3JQcmVkaWNhdGUsIGhhbmRsaW5nIHRoZSBjYXNlIHdoZW4KKyAgICAvLy8gd2UgYXJlIGV4cGFuZGluZyBjb2RlIGZvciBhIFNDRVZFcXVhbFByZWRpY2F0ZS4KKyAgICBWYWx1ZSAqZXhwYW5kRXF1YWxQcmVkaWNhdGUoY29uc3QgU0NFVkVxdWFsUHJlZGljYXRlICpQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqTG9jKTsKKworICAgIC8vLyBHZW5lcmF0ZXMgY29kZSB0aGF0IGV2YWx1YXRlcyBpZiB0aGUgXHAgQVIgZXhwcmVzc2lvbiB3aWxsIG92ZXJmbG93LgorICAgIFZhbHVlICpnZW5lcmF0ZU92ZXJmbG93Q2hlY2soY29uc3QgU0NFVkFkZFJlY0V4cHIgKkFSLCBJbnN0cnVjdGlvbiAqTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaWduZWQpOworCisgICAgLy8vIEEgc3BlY2lhbGl6ZWQgdmFyaWFudCBvZiBleHBhbmRDb2RlRm9yUHJlZGljYXRlLCBoYW5kbGluZyB0aGUgY2FzZSB3aGVuCisgICAgLy8vIHdlIGFyZSBleHBhbmRpbmcgY29kZSBmb3IgYSBTQ0VWV3JhcFByZWRpY2F0ZS4KKyAgICBWYWx1ZSAqZXhwYW5kV3JhcFByZWRpY2F0ZShjb25zdCBTQ0VWV3JhcFByZWRpY2F0ZSAqUCwgSW5zdHJ1Y3Rpb24gKkxvYyk7CisKKyAgICAvLy8gQSBzcGVjaWFsaXplZCB2YXJpYW50IG9mIGV4cGFuZENvZGVGb3JQcmVkaWNhdGUsIGhhbmRsaW5nIHRoZSBjYXNlIHdoZW4KKyAgICAvLy8gd2UgYXJlIGV4cGFuZGluZyBjb2RlIGZvciBhIFNDRVZVbmlvblByZWRpY2F0ZS4KKyAgICBWYWx1ZSAqZXhwYW5kVW5pb25QcmVkaWNhdGUoY29uc3QgU0NFVlVuaW9uUHJlZGljYXRlICpQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqTG9jKTsKKworICAgIC8vLyBTZXQgdGhlIGN1cnJlbnQgSVYgaW5jcmVtZW50IGxvb3AgYW5kIHBvc2l0aW9uLgorICAgIHZvaWQgc2V0SVZJbmNJbnNlcnRQb3MoY29uc3QgTG9vcCAqTCwgSW5zdHJ1Y3Rpb24gKlBvcykgeworICAgICAgYXNzZXJ0KCFDYW5vbmljYWxNb2RlICYmCisgICAgICAgICAgICAgIklWIGluY3JlbWVudCBwb3NpdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gQ2Fub25pY2FsTW9kZSIpOworICAgICAgSVZJbmNJbnNlcnRMb29wID0gTDsKKyAgICAgIElWSW5jSW5zZXJ0UG9zID0gUG9zOworICAgIH0KKworICAgIC8vLyBFbmFibGUgcG9zdC1pbmMgZXhwYW5zaW9uIGZvciBhZGRyZWNzIHJlZmVycmluZyB0byB0aGUgZ2l2ZW4KKyAgICAvLy8gbG9vcHMuIFBvc3QtaW5jIGV4cGFuc2lvbiBpcyBvbmx5IHN1cHBvcnRlZCBpbiBub24tY2Fub25pY2FsIG1vZGUuCisgICAgdm9pZCBzZXRQb3N0SW5jKGNvbnN0IFBvc3RJbmNMb29wU2V0ICZMKSB7CisgICAgICBhc3NlcnQoIUNhbm9uaWNhbE1vZGUgJiYKKyAgICAgICAgICAgICAiUG9zdC1pbmMgZXhwYW5zaW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gQ2Fub25pY2FsTW9kZSIpOworICAgICAgUG9zdEluY0xvb3BzID0gTDsKKyAgICB9CisKKyAgICAvLy8gRGlzYWJsZSBhbGwgcG9zdC1pbmMgZXhwYW5zaW9uLgorICAgIHZvaWQgY2xlYXJQb3N0SW5jKCkgeworICAgICAgUG9zdEluY0xvb3BzLmNsZWFyKCk7CisKKyAgICAgIC8vIFdoZW4gd2UgY2hhbmdlIHRoZSBwb3N0LWluYyBsb29wIHNldCwgY2FjaGVkIGV4cGFuc2lvbnMgbWF5IG5vCisgICAgICAvLyBsb25nZXIgYmUgdmFsaWQuCisgICAgICBJbnNlcnRlZFBvc3RJbmNWYWx1ZXMuY2xlYXIoKTsKKyAgICB9CisKKyAgICAvLy8gRGlzYWJsZSB0aGUgYmVoYXZpb3Igb2YgZXhwYW5kaW5nIGV4cHJlc3Npb25zIGluIGNhbm9uaWNhbCBmb3JtIHJhdGhlcgorICAgIC8vLyB0aGFuIGluIGEgbW9yZSBsaXRlcmFsIGZvcm0uIE5vbi1jYW5vbmljYWwgbW9kZSBpcyB1c2VmdWwgZm9yIGxhdGUKKyAgICAvLy8gb3B0aW1pemF0aW9uIHBhc3Nlcy4KKyAgICB2b2lkIGRpc2FibGVDYW5vbmljYWxNb2RlKCkgeyBDYW5vbmljYWxNb2RlID0gZmFsc2U7IH0KKworICAgIHZvaWQgZW5hYmxlTFNSTW9kZSgpIHsgTFNSTW9kZSA9IHRydWU7IH0KKworICAgIC8vLyBTZXQgdGhlIGN1cnJlbnQgaW5zZXJ0aW9uIHBvaW50LiBUaGlzIGlzIHVzZWZ1bCBpZiBtdWx0aXBsZSBjYWxscyB0bworICAgIC8vLyBleHBhbmRDb2RlRm9yKCkgYXJlIGdvaW5nIHRvIGJlIG1hZGUgd2l0aCB0aGUgc2FtZSBpbnNlcnQgcG9pbnQgYW5kIHRoZQorICAgIC8vLyBpbnNlcnQgcG9pbnQgbWF5IGJlIG1vdmVkIGR1cmluZyBvbmUgb2YgdGhlIGV4cGFuc2lvbnMgKGUuZy4gaWYgdGhlCisgICAgLy8vIGluc2VydCBwb2ludCBpcyBub3QgYSBibG9jayB0ZXJtaW5hdG9yKS4KKyAgICB2b2lkIHNldEluc2VydFBvaW50KEluc3RydWN0aW9uICpJUCkgeworICAgICAgYXNzZXJ0KElQKTsKKyAgICAgIEJ1aWxkZXIuU2V0SW5zZXJ0UG9pbnQoSVApOworICAgIH0KKworICAgIC8vLyBDbGVhciB0aGUgY3VycmVudCBpbnNlcnRpb24gcG9pbnQuIFRoaXMgaXMgdXNlZnVsIGlmIHRoZSBpbnN0cnVjdGlvbgorICAgIC8vLyB0aGF0IGhhZCBiZWVuIHNlcnZpbmcgYXMgdGhlIGluc2VydGlvbiBwb2ludCBtYXkgaGF2ZSBiZWVuIGRlbGV0ZWQuCisgICAgdm9pZCBjbGVhckluc2VydFBvaW50KCkgeworICAgICAgQnVpbGRlci5DbGVhckluc2VydGlvblBvaW50KCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gd2FzIGluc2VydGVkIGJ5IHRoZSBjb2RlCisgICAgLy8vIHJld3JpdGVyLiAgSWYgc28sIHRoZSBjbGllbnQgc2hvdWxkIG5vdCBtb2RpZnkgdGhlIGluc3RydWN0aW9uLgorICAgIGJvb2wgaXNJbnNlcnRlZEluc3RydWN0aW9uKEluc3RydWN0aW9uICpJKSBjb25zdCB7CisgICAgICByZXR1cm4gSW5zZXJ0ZWRWYWx1ZXMuY291bnQoSSkgfHwgSW5zZXJ0ZWRQb3N0SW5jVmFsdWVzLmNvdW50KEkpOworICAgIH0KKworICAgIHZvaWQgc2V0Q2hhaW5lZFBoaShQSElOb2RlICpQTikgeyBDaGFpbmVkUGhpcy5pbnNlcnQoUE4pOyB9CisKKyAgICAvLy8gVHJ5IHRvIGZpbmQgZXhpc3RpbmcgTExWTSBJUiB2YWx1ZSBmb3IgUyBhdmFpbGFibGUgYXQgdGhlIHBvaW50IEF0LgorICAgIFZhbHVlICpnZXRFeGFjdEV4aXN0aW5nRXhwYW5zaW9uKGNvbnN0IFNDRVYgKlMsIGNvbnN0IEluc3RydWN0aW9uICpBdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wICpMKTsKKworICAgIC8vLyBUcnkgdG8gZmluZCB0aGUgVmFsdWVPZmZzZXRQYWlyIGZvciBTLiBUaGUgZnVuY3Rpb24gaXMgbWFpbmx5IHVzZWQgdG8KKyAgICAvLy8gY2hlY2sgd2hldGhlciBTIGNhbiBiZSBleHBhbmRlZCBjaGVhcGx5LiAgSWYgdGhpcyByZXR1cm5zIGEgbm9uLU5vbmUKKyAgICAvLy8gdmFsdWUsIHdlIGtub3cgd2UgY2FuIGNvZGVnZW4gdGhlIGBWYWx1ZU9mZnNldFBhaXJgIGludG8gYSBzdWl0YWJsZQorICAgIC8vLyBleHBhbnNpb24gaWRlbnRpY2FsIHdpdGggUyBzbyB0aGF0IFMgY2FuIGJlIGV4cGFuZGVkIGNoZWFwbHkuCisgICAgLy8vCisgICAgLy8vIEwgaXMgYSBoaW50IHdoaWNoIHRlbGxzIGluIHdoaWNoIGxvb3AgdG8gbG9vayBmb3IgdGhlIHN1aXRhYmxlIHZhbHVlLgorICAgIC8vLyBPbiBzdWNjZXNzIHJldHVybiB2YWx1ZSB3aGljaCBpcyBlcXVpdmFsZW50IHRvIHRoZSBleHBhbmRlZCBTIGF0IHBvaW50CisgICAgLy8vIEF0LiBSZXR1cm4gbnVsbHB0ciBpZiB2YWx1ZSB3YXMgbm90IGZvdW5kLgorICAgIC8vLworICAgIC8vLyBOb3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGFuIGV4aGF1c3RpdmUgc2VhcmNoLiBJLmUgaWYgaXQKKyAgICAvLy8gZGlkbid0IGZpbmQgYW55IHZhbHVlIGl0IGRvZXMgbm90IG1lYW4gdGhhdCB0aGVyZSBpcyBubyBzdWNoIHZhbHVlLgorICAgIC8vLworICAgIE9wdGlvbmFsPFNjYWxhckV2b2x1dGlvbjo6VmFsdWVPZmZzZXRQYWlyPgorICAgIGdldFJlbGF0ZWRFeGlzdGluZ0V4cGFuc2lvbihjb25zdCBTQ0VWICpTLCBjb25zdCBJbnN0cnVjdGlvbiAqQXQsIExvb3AgKkwpOworCisgIHByaXZhdGU6CisgICAgTExWTUNvbnRleHQgJmdldENvbnRleHQoKSBjb25zdCB7IHJldHVybiBTRS5nZXRDb250ZXh0KCk7IH0KKworICAgIC8vLyBSZWN1cnNpdmUgaGVscGVyIGZ1bmN0aW9uIGZvciBpc0hpZ2hDb3N0RXhwYW5zaW9uLgorICAgIGJvb2wgaXNIaWdoQ29zdEV4cGFuc2lvbkhlbHBlcihjb25zdCBTQ0VWICpTLCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqQXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0SW1wbDxjb25zdCBTQ0VWICo+ICZQcm9jZXNzZWQpOworCisgICAgLy8vIEluc2VydCB0aGUgc3BlY2lmaWVkIGJpbmFyeSBvcGVyYXRvciwgZG9pbmcgYSBzbWFsbCBhbW91bnQgb2Ygd29yayB0bworICAgIC8vLyBhdm9pZCBpbnNlcnRpbmcgYW4gb2J2aW91c2x5IHJlZHVuZGFudCBvcGVyYXRpb24uCisgICAgVmFsdWUgKkluc2VydEJpbm9wKEluc3RydWN0aW9uOjpCaW5hcnlPcHMgT3Bjb2RlLCBWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKTsKKworICAgIC8vLyBBcnJhbmdlIGZvciB0aGVyZSB0byBiZSBhIGNhc3Qgb2YgViB0byBUeSBhdCBJUCwgcmV1c2luZyBhbiBleGlzdGluZworICAgIC8vLyBjYXN0IGlmIGEgc3VpdGFibGUgb25lIGV4aXN0cywgbW92aW5nIGFuIGV4aXN0aW5nIGNhc3QgaWYgYSBzdWl0YWJsZSBvbmUKKyAgICAvLy8gZXhpc3RzIGJ1dCBpc24ndCBpbiB0aGUgcmlnaHQgcGxhY2UsIG9yIG9yIGNyZWF0aW5nIGEgbmV3IG9uZS4KKyAgICBWYWx1ZSAqUmV1c2VPckNyZWF0ZUNhc3QoVmFsdWUgKlYsIFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbjo6Q2FzdE9wcyBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgSVApOworCisgICAgLy8vIEluc2VydCBhIGNhc3Qgb2YgViB0byB0aGUgc3BlY2lmaWVkIHR5cGUsIHdoaWNoIG11c3QgYmUgcG9zc2libGUgd2l0aCBhCisgICAgLy8vIG5vb3AgY2FzdCwgZG9pbmcgd2hhdCB3ZSBjYW4gdG8gc2hhcmUgdGhlIGNhc3RzLgorICAgIFZhbHVlICpJbnNlcnROb29wQ2FzdE9mVG8oVmFsdWUgKlYsIFR5cGUgKlR5KTsKKworICAgIC8vLyBFeHBhbmQgYSBTQ0VWQWRkRXhwciB3aXRoIGEgcG9pbnRlciB0eXBlIGludG8gYSBHRVAgaW5zdGVhZCBvZiB1c2luZworICAgIC8vLyBwdHJ0b2ludCthcml0aG1ldGljK2ludHRvcHRyLgorICAgIFZhbHVlICpleHBhbmRBZGRUb0dFUChjb25zdCBTQ0VWICpjb25zdCAqb3BfYmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKmNvbnN0ICpvcF9lbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJUeXBlICpQVHksIFR5cGUgKlR5LCBWYWx1ZSAqVik7CisKKyAgICAvLy8gRmluZCBhIHByZXZpb3VzIFZhbHVlIGluIEV4cHJWYWx1ZU1hcCBmb3IgZXhwYW5kLgorICAgIFNjYWxhckV2b2x1dGlvbjo6VmFsdWVPZmZzZXRQYWlyCisgICAgRmluZFZhbHVlSW5FeHByVmFsdWVNYXAoY29uc3QgU0NFViAqUywgY29uc3QgSW5zdHJ1Y3Rpb24gKkluc2VydFB0KTsKKworICAgIFZhbHVlICpleHBhbmQoY29uc3QgU0NFViAqUyk7CisKKyAgICAvLy8gRGV0ZXJtaW5lIHRoZSBtb3N0ICJyZWxldmFudCIgbG9vcCBmb3IgdGhlIGdpdmVuIFNDRVYuCisgICAgY29uc3QgTG9vcCAqZ2V0UmVsZXZhbnRMb29wKGNvbnN0IFNDRVYgKik7CisKKyAgICBWYWx1ZSAqdmlzaXRDb25zdGFudChjb25zdCBTQ0VWQ29uc3RhbnQgKlMpIHsKKyAgICAgIHJldHVybiBTLT5nZXRWYWx1ZSgpOworICAgIH0KKworICAgIFZhbHVlICp2aXNpdFRydW5jYXRlRXhwcihjb25zdCBTQ0VWVHJ1bmNhdGVFeHByICpTKTsKKworICAgIFZhbHVlICp2aXNpdFplcm9FeHRlbmRFeHByKGNvbnN0IFNDRVZaZXJvRXh0ZW5kRXhwciAqUyk7CisKKyAgICBWYWx1ZSAqdmlzaXRTaWduRXh0ZW5kRXhwcihjb25zdCBTQ0VWU2lnbkV4dGVuZEV4cHIgKlMpOworCisgICAgVmFsdWUgKnZpc2l0QWRkRXhwcihjb25zdCBTQ0VWQWRkRXhwciAqUyk7CisKKyAgICBWYWx1ZSAqdmlzaXRNdWxFeHByKGNvbnN0IFNDRVZNdWxFeHByICpTKTsKKworICAgIFZhbHVlICp2aXNpdFVEaXZFeHByKGNvbnN0IFNDRVZVRGl2RXhwciAqUyk7CisKKyAgICBWYWx1ZSAqdmlzaXRBZGRSZWNFeHByKGNvbnN0IFNDRVZBZGRSZWNFeHByICpTKTsKKworICAgIFZhbHVlICp2aXNpdFNNYXhFeHByKGNvbnN0IFNDRVZTTWF4RXhwciAqUyk7CisKKyAgICBWYWx1ZSAqdmlzaXRVTWF4RXhwcihjb25zdCBTQ0VWVU1heEV4cHIgKlMpOworCisgICAgVmFsdWUgKnZpc2l0VW5rbm93bihjb25zdCBTQ0VWVW5rbm93biAqUykgeworICAgICAgcmV0dXJuIFMtPmdldFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCByZW1lbWJlckluc3RydWN0aW9uKFZhbHVlICpJKTsKKworICAgIGJvb2wgaXNOb3JtYWxBZGRSZWNFeHByUEhJKFBISU5vZGUgKlBOLCBJbnN0cnVjdGlvbiAqSW5jViwgY29uc3QgTG9vcCAqTCk7CisKKyAgICBib29sIGlzRXhwYW5kZWRBZGRSZWNFeHByUEhJKFBISU5vZGUgKlBOLCBJbnN0cnVjdGlvbiAqSW5jViwgY29uc3QgTG9vcCAqTCk7CisKKyAgICBWYWx1ZSAqZXhwYW5kQWRkUmVjRXhwckxpdGVyYWxseShjb25zdCBTQ0VWQWRkUmVjRXhwciAqKTsKKyAgICBQSElOb2RlICpnZXRBZGRSZWNFeHByUEhJTGl0ZXJhbGx5KGNvbnN0IFNDRVZBZGRSZWNFeHByICpOb3JtYWxpemVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKkV4cGFuZFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqSW50VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlIComVHJ1bmNUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJkludmVydFN0ZXApOworICAgIFZhbHVlICpleHBhbmRJVkluYyhQSElOb2RlICpQTiwgVmFsdWUgKlN0ZXBWLCBjb25zdCBMb29wICpMLAorICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpFeHBhbmRUeSwgVHlwZSAqSW50VHksIGJvb2wgdXNlU3VidHJhY3QpOworCisgICAgdm9pZCBob2lzdEJlZm9yZVBvcyhEb21pbmF0b3JUcmVlICpEVCwgSW5zdHJ1Y3Rpb24gKkluc3RUb0hvaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKlBvcywgUEhJTm9kZSAqTG9vcFBoaSk7CisKKyAgICB2b2lkIGZpeHVwSW5zZXJ0UG9pbnRzKEluc3RydWN0aW9uICpJKTsKKyAgfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkV4cHJlc3Npb25zLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkV4cHJlc3Npb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJlNzYwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uRXhwcmVzc2lvbnMuaApAQCAtMCwwICsxLDc2MiBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uRXhwcmVzc2lvbnMuaCAtIFNDRVYgRXhwcnMgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgY2xhc3NlcyB1c2VkIHRvIHJlcHJlc2VudCBhbmQgYnVpbGQgc2NhbGFyIGV4cHJlc3Npb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19TQ0FMQVJFVk9MVVRJT05FWFBSRVNTSU9OU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfU0NBTEFSRVZPTFVUSU9ORVhQUkVTU0lPTlNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlSGFuZGxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBUEludDsKK2NsYXNzIENvbnN0YW50OworY2xhc3MgQ29uc3RhbnRSYW5nZTsKK2NsYXNzIExvb3A7CitjbGFzcyBUeXBlOworCisgIGVudW0gU0NFVlR5cGVzIHsKKyAgICAvLyBUaGVzZSBzaG91bGQgYmUgb3JkZXJlZCBpbiB0ZXJtcyBvZiBpbmNyZWFzaW5nIGNvbXBsZXhpdHkgdG8gbWFrZSB0aGUKKyAgICAvLyBmb2xkZXJzIHNpbXBsZXIuCisgICAgc2NDb25zdGFudCwgc2NUcnVuY2F0ZSwgc2NaZXJvRXh0ZW5kLCBzY1NpZ25FeHRlbmQsIHNjQWRkRXhwciwgc2NNdWxFeHByLAorICAgIHNjVURpdkV4cHIsIHNjQWRkUmVjRXhwciwgc2NVTWF4RXhwciwgc2NTTWF4RXhwciwKKyAgICBzY1Vua25vd24sIHNjQ291bGROb3RDb21wdXRlCisgIH07CisKKyAgLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNvbnN0YW50IGludGVnZXIgdmFsdWUuCisgIGNsYXNzIFNDRVZDb25zdGFudCA6IHB1YmxpYyBTQ0VWIHsKKyAgICBmcmllbmQgY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworCisgICAgQ29uc3RhbnRJbnQgKlY7CisKKyAgICBTQ0VWQ29uc3RhbnQoY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBJRCwgQ29uc3RhbnRJbnQgKnYpIDoKKyAgICAgIFNDRVYoSUQsIHNjQ29uc3RhbnQpLCBWKHYpIHt9CisKKyAgcHVibGljOgorICAgIENvbnN0YW50SW50ICpnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFY7IH0KKyAgICBjb25zdCBBUEludCAmZ2V0QVBJbnQoKSBjb25zdCB7IHJldHVybiBnZXRWYWx1ZSgpLT5nZXRWYWx1ZSgpOyB9CisKKyAgICBUeXBlICpnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gVi0+Z2V0VHlwZSgpOyB9CisKKyAgICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVYgKlMpIHsKKyAgICAgIHJldHVybiBTLT5nZXRTQ0VWVHlwZSgpID09IHNjQ29uc3RhbnQ7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciB1bmFyeSBjYXN0IG9wZXJhdG9yIGNsYXNzZXMuCisgIGNsYXNzIFNDRVZDYXN0RXhwciA6IHB1YmxpYyBTQ0VWIHsKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IFNDRVYgKk9wOworICAgIFR5cGUgKlR5OworCisgICAgU0NFVkNhc3RFeHByKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNDRVZUeSwgY29uc3QgU0NFViAqb3AsIFR5cGUgKnR5KTsKKworICBwdWJsaWM6CisgICAgY29uc3QgU0NFViAqZ2V0T3BlcmFuZCgpIGNvbnN0IHsgcmV0dXJuIE9wOyB9CisgICAgVHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5OyB9CisKKyAgICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVYgKlMpIHsKKyAgICAgIHJldHVybiBTLT5nZXRTQ0VWVHlwZSgpID09IHNjVHJ1bmNhdGUgfHwKKyAgICAgICAgICAgICBTLT5nZXRTQ0VWVHlwZSgpID09IHNjWmVyb0V4dGVuZCB8fAorICAgICAgICAgICAgIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NTaWduRXh0ZW5kOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgdHJ1bmNhdGlvbiBvZiBhbiBpbnRlZ2VyIHZhbHVlIHRvIGEKKyAgLy8vIHNtYWxsZXIgaW50ZWdlciB2YWx1ZS4KKyAgY2xhc3MgU0NFVlRydW5jYXRlRXhwciA6IHB1YmxpYyBTQ0VWQ2FzdEV4cHIgeworICAgIGZyaWVuZCBjbGFzcyBTY2FsYXJFdm9sdXRpb247CisKKyAgICBTQ0VWVHJ1bmNhdGVFeHByKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpvcCwgVHlwZSAqdHkpOworCisgIHB1YmxpYzoKKyAgICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVYgKlMpIHsKKyAgICAgIHJldHVybiBTLT5nZXRTQ0VWVHlwZSgpID09IHNjVHJ1bmNhdGU7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSB6ZXJvIGV4dGVuc2lvbiBvZiBhIHNtYWxsIGludGVnZXIgdmFsdWUKKyAgLy8vIHRvIGEgbGFyZ2VyIGludGVnZXIgdmFsdWUuCisgIGNsYXNzIFNDRVZaZXJvRXh0ZW5kRXhwciA6IHB1YmxpYyBTQ0VWQ2FzdEV4cHIgeworICAgIGZyaWVuZCBjbGFzcyBTY2FsYXJFdm9sdXRpb247CisKKyAgICBTQ0VWWmVyb0V4dGVuZEV4cHIoY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqb3AsIFR5cGUgKnR5KTsKKworICBwdWJsaWM6CisgICAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWICpTKSB7CisgICAgICByZXR1cm4gUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY1plcm9FeHRlbmQ7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzaWduIGV4dGVuc2lvbiBvZiBhIHNtYWxsIGludGVnZXIgdmFsdWUKKyAgLy8vIHRvIGEgbGFyZ2VyIGludGVnZXIgdmFsdWUuCisgIGNsYXNzIFNDRVZTaWduRXh0ZW5kRXhwciA6IHB1YmxpYyBTQ0VWQ2FzdEV4cHIgeworICAgIGZyaWVuZCBjbGFzcyBTY2FsYXJFdm9sdXRpb247CisKKyAgICBTQ0VWU2lnbkV4dGVuZEV4cHIoY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqb3AsIFR5cGUgKnR5KTsKKworICBwdWJsaWM6CisgICAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWICpTKSB7CisgICAgICByZXR1cm4gUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY1NpZ25FeHRlbmQ7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIG5vZGUgaXMgYSBiYXNlIGNsYXNzIHByb3ZpZGluZyBjb21tb24gZnVuY3Rpb25hbGl0eSBmb3IKKyAgLy8vIG4nYXJ5IG9wZXJhdG9ycy4KKyAgY2xhc3MgU0NFVk5BcnlFeHByIDogcHVibGljIFNDRVYgeworICBwcm90ZWN0ZWQ6CisgICAgLy8gU2luY2UgU0NFVnMgYXJlIGltbXV0YWJsZSwgU2NhbGFyRXZvbHV0aW9uIGFsbG9jYXRlcyBvcGVyYW5kCisgICAgLy8gYXJyYXlzIHdpdGggaXRzIFNDRVZBbGxvY2F0b3IsIHNvIHRoaXMgY2xhc3MganVzdCBuZWVkcyBhIHNpbXBsZQorICAgIC8vIHBvaW50ZXIgcmF0aGVyIHRoYW4gYSBtb3JlIGVsYWJvcmF0ZSB2ZWN0b3ItbGlrZSBkYXRhIHN0cnVjdHVyZS4KKyAgICAvLyBUaGlzIGFsc28gYXZvaWRzIHRoZSBuZWVkIGZvciBhIG5vbi10cml2aWFsIGRlc3RydWN0b3IuCisgICAgY29uc3QgU0NFViAqY29uc3QgKk9wZXJhbmRzOworICAgIHNpemVfdCBOdW1PcGVyYW5kczsKKworICAgIFNDRVZOQXJ5RXhwcihjb25zdCBGb2xkaW5nU2V0Tm9kZUlEUmVmIElELAorICAgICAgICAgICAgICAgICBlbnVtIFNDRVZUeXBlcyBULCBjb25zdCBTQ0VWICpjb25zdCAqTywgc2l6ZV90IE4pCisgICAgICA6IFNDRVYoSUQsIFQpLCBPcGVyYW5kcyhPKSwgTnVtT3BlcmFuZHMoTikge30KKworICBwdWJsaWM6CisgICAgc2l6ZV90IGdldE51bU9wZXJhbmRzKCkgY29uc3QgeyByZXR1cm4gTnVtT3BlcmFuZHM7IH0KKworICAgIGNvbnN0IFNDRVYgKmdldE9wZXJhbmQodW5zaWduZWQgaSkgY29uc3QgeworICAgICAgYXNzZXJ0KGkgPCBOdW1PcGVyYW5kcyAmJiAiT3BlcmFuZCBpbmRleCBvdXQgb2YgcmFuZ2UhIik7CisgICAgICByZXR1cm4gT3BlcmFuZHNbaV07CisgICAgfQorCisgICAgdXNpbmcgb3BfaXRlcmF0b3IgPSBjb25zdCBTQ0VWICpjb25zdCAqOworICAgIHVzaW5nIG9wX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8b3BfaXRlcmF0b3I+OworCisgICAgb3BfaXRlcmF0b3Igb3BfYmVnaW4oKSBjb25zdCB7IHJldHVybiBPcGVyYW5kczsgfQorICAgIG9wX2l0ZXJhdG9yIG9wX2VuZCgpIGNvbnN0IHsgcmV0dXJuIE9wZXJhbmRzICsgTnVtT3BlcmFuZHM7IH0KKyAgICBvcF9yYW5nZSBvcGVyYW5kcygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBtYWtlX3JhbmdlKG9wX2JlZ2luKCksIG9wX2VuZCgpKTsKKyAgICB9CisKKyAgICBUeXBlICpnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpOyB9CisKKyAgICBOb1dyYXBGbGFncyBnZXROb1dyYXBGbGFncyhOb1dyYXBGbGFncyBNYXNrID0gTm9XcmFwTWFzaykgY29uc3QgeworICAgICAgcmV0dXJuIChOb1dyYXBGbGFncykoU3ViY2xhc3NEYXRhICYgTWFzayk7CisgICAgfQorCisgICAgYm9vbCBoYXNOb1Vuc2lnbmVkV3JhcCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXROb1dyYXBGbGFncyhGbGFnTlVXKSAhPSBGbGFnQW55V3JhcDsKKyAgICB9CisKKyAgICBib29sIGhhc05vU2lnbmVkV3JhcCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXROb1dyYXBGbGFncyhGbGFnTlNXKSAhPSBGbGFnQW55V3JhcDsKKyAgICB9CisKKyAgICBib29sIGhhc05vU2VsZldyYXAoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0Tm9XcmFwRmxhZ3MoRmxhZ05XKSAhPSBGbGFnQW55V3JhcDsKKyAgICB9CisKKyAgICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVYgKlMpIHsKKyAgICAgIHJldHVybiBTLT5nZXRTQ0VWVHlwZSgpID09IHNjQWRkRXhwciB8fAorICAgICAgICAgICAgIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NNdWxFeHByIHx8CisgICAgICAgICAgICAgUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY1NNYXhFeHByIHx8CisgICAgICAgICAgICAgUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY1VNYXhFeHByIHx8CisgICAgICAgICAgICAgUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY0FkZFJlY0V4cHI7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIG5vZGUgaXMgdGhlIGJhc2UgY2xhc3MgZm9yIG4nYXJ5IGNvbW11dGF0aXZlIG9wZXJhdG9ycy4KKyAgY2xhc3MgU0NFVkNvbW11dGF0aXZlRXhwciA6IHB1YmxpYyBTQ0VWTkFyeUV4cHIgeworICBwcm90ZWN0ZWQ6CisgICAgU0NFVkNvbW11dGF0aXZlRXhwcihjb25zdCBGb2xkaW5nU2V0Tm9kZUlEUmVmIElELAorICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBTQ0VWVHlwZXMgVCwgY29uc3QgU0NFViAqY29uc3QgKk8sIHNpemVfdCBOKQorICAgICAgOiBTQ0VWTkFyeUV4cHIoSUQsIFQsIE8sIE4pIHt9CisKKyAgcHVibGljOgorICAgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0NFViAqUykgeworICAgICAgcmV0dXJuIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NBZGRFeHByIHx8CisgICAgICAgICAgICAgUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY011bEV4cHIgfHwKKyAgICAgICAgICAgICBTLT5nZXRTQ0VWVHlwZSgpID09IHNjU01heEV4cHIgfHwKKyAgICAgICAgICAgICBTLT5nZXRTQ0VWVHlwZSgpID09IHNjVU1heEV4cHI7CisgICAgfQorCisgICAgLy8vIFNldCBmbGFncyBmb3IgYSBub24tcmVjdXJyZW5jZSB3aXRob3V0IGNsZWFyaW5nIHByZXZpb3VzbHkgc2V0IGZsYWdzLgorICAgIHZvaWQgc2V0Tm9XcmFwRmxhZ3MoTm9XcmFwRmxhZ3MgRmxhZ3MpIHsKKyAgICAgIFN1YmNsYXNzRGF0YSB8PSBGbGFnczsKKyAgICB9CisgIH07CisKKyAgLy8vIFRoaXMgbm9kZSByZXByZXNlbnRzIGFuIGFkZGl0aW9uIG9mIHNvbWUgbnVtYmVyIG9mIFNDRVZzLgorICBjbGFzcyBTQ0VWQWRkRXhwciA6IHB1YmxpYyBTQ0VWQ29tbXV0YXRpdmVFeHByIHsKKyAgICBmcmllbmQgY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworCisgICAgU0NFVkFkZEV4cHIoY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBJRCwKKyAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpjb25zdCAqTywgc2l6ZV90IE4pCisgICAgICA6IFNDRVZDb21tdXRhdGl2ZUV4cHIoSUQsIHNjQWRkRXhwciwgTywgTikge30KKworICBwdWJsaWM6CisgICAgVHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsKKyAgICAgIC8vIFVzZSB0aGUgdHlwZSBvZiB0aGUgbGFzdCBvcGVyYW5kLCB3aGljaCBpcyBsaWtlbHkgdG8gYmUgYSBwb2ludGVyCisgICAgICAvLyB0eXBlLCBpZiB0aGVyZSBpcyBvbmUuIFRoaXMgZG9lc24ndCB1c3VhbGx5IG1hdHRlciwgYnV0IGl0IGNhbiBoZWxwCisgICAgICAvLyByZWR1Y2UgY2FzdHMgd2hlbiB0aGUgZXhwcmVzc2lvbnMgYXJlIGV4cGFuZGVkLgorICAgICAgcmV0dXJuIGdldE9wZXJhbmQoZ2V0TnVtT3BlcmFuZHMoKSAtIDEpLT5nZXRUeXBlKCk7CisgICAgfQorCisgICAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWICpTKSB7CisgICAgICByZXR1cm4gUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY0FkZEV4cHI7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIG5vZGUgcmVwcmVzZW50cyBtdWx0aXBsaWNhdGlvbiBvZiBzb21lIG51bWJlciBvZiBTQ0VWcy4KKyAgY2xhc3MgU0NFVk11bEV4cHIgOiBwdWJsaWMgU0NFVkNvbW11dGF0aXZlRXhwciB7CisgICAgZnJpZW5kIGNsYXNzIFNjYWxhckV2b2x1dGlvbjsKKworICAgIFNDRVZNdWxFeHByKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsCisgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqY29uc3QgKk8sIHNpemVfdCBOKQorICAgICAgOiBTQ0VWQ29tbXV0YXRpdmVFeHByKElELCBzY011bEV4cHIsIE8sIE4pIHt9CisKKyAgcHVibGljOgorICAgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0NFViAqUykgeworICAgICAgcmV0dXJuIFMtPmdldFNDRVZUeXBlKCkgPT0gc2NNdWxFeHByOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgYmluYXJ5IHVuc2lnbmVkIGRpdmlzaW9uIG9wZXJhdGlvbi4KKyAgY2xhc3MgU0NFVlVEaXZFeHByIDogcHVibGljIFNDRVYgeworICAgIGZyaWVuZCBjbGFzcyBTY2FsYXJFdm9sdXRpb247CisKKyAgICBjb25zdCBTQ0VWICpMSFM7CisgICAgY29uc3QgU0NFViAqUkhTOworCisgICAgU0NFVlVEaXZFeHByKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsIGNvbnN0IFNDRVYgKmxocywgY29uc3QgU0NFViAqcmhzKQorICAgICAgOiBTQ0VWKElELCBzY1VEaXZFeHByKSwgTEhTKGxocyksIFJIUyhyaHMpIHt9CisKKyAgcHVibGljOgorICAgIGNvbnN0IFNDRVYgKmdldExIUygpIGNvbnN0IHsgcmV0dXJuIExIUzsgfQorICAgIGNvbnN0IFNDRVYgKmdldFJIUygpIGNvbnN0IHsgcmV0dXJuIFJIUzsgfQorCisgICAgVHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsKKyAgICAgIC8vIEluIG1vc3QgY2FzZXMgdGhlIHR5cGVzIG9mIExIUyBhbmQgUkhTIHdpbGwgYmUgdGhlIHNhbWUsIGJ1dCBpbiBzb21lCisgICAgICAvLyBjcmF6eSBjYXNlcyBvbmUgb3IgdGhlIG90aGVyIG1heSBiZSBhIHBvaW50ZXIuIFNjYWxhckV2b2x1dGlvbiBkb2Vzbid0CisgICAgICAvLyBkZXBlbmQgb24gdGhlIHR5cGUgZm9yIGNvcnJlY3RuZXNzLCBidXQgaGFuZGxpbmcgdHlwZXMgY2FyZWZ1bGx5IGNhbgorICAgICAgLy8gYXZvaWQgZXh0cmEgY2FzdHMgaW4gdGhlIFNDRVZFeHBhbmRlci4gVGhlIExIUyBpcyBtb3JlIGxpa2VseSB0byBiZQorICAgICAgLy8gYSBwb2ludGVyIHR5cGUgdGhhbiB0aGUgUkhTLCBzbyB1c2UgdGhlIFJIUycgdHlwZSBoZXJlLgorICAgICAgcmV0dXJuIGdldFJIUygpLT5nZXRUeXBlKCk7CisgICAgfQorCisgICAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWICpTKSB7CisgICAgICByZXR1cm4gUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY1VEaXZFeHByOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBub2RlIHJlcHJlc2VudHMgYSBwb2x5bm9taWFsIHJlY3VycmVuY2Ugb24gdGhlIHRyaXAgY291bnQKKyAgLy8vIG9mIHRoZSBzcGVjaWZpZWQgbG9vcC4gIFRoaXMgaXMgdGhlIHByaW1hcnkgZm9jdXMgb2YgdGhlCisgIC8vLyBTY2FsYXJFdm9sdXRpb24gZnJhbWV3b3JrOyBhbGwgdGhlIG90aGVyIFNDRVYgc3ViY2xhc3NlcyBhcmUKKyAgLy8vIG1vc3RseSBqdXN0IHN1cHBvcnRpbmcgaW5mcmFzdHJ1Y3R1cmUgdG8gYWxsb3cgU0NFVkFkZFJlY0V4cHIKKyAgLy8vIGV4cHJlc3Npb25zIHRvIGJlIGNyZWF0ZWQgYW5kIGFuYWx5emVkLgorICAvLy8KKyAgLy8vIEFsbCBvcGVyYW5kcyBvZiBhbiBBZGRSZWMgYXJlIHJlcXVpcmVkIHRvIGJlIGxvb3AgaW52YXJpYW50LgorICAvLy8KKyAgY2xhc3MgU0NFVkFkZFJlY0V4cHIgOiBwdWJsaWMgU0NFVk5BcnlFeHByIHsKKyAgICBmcmllbmQgY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworCisgICAgY29uc3QgTG9vcCAqTDsKKworICAgIFNDRVZBZGRSZWNFeHByKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqY29uc3QgKk8sIHNpemVfdCBOLCBjb25zdCBMb29wICpsKQorICAgICAgOiBTQ0VWTkFyeUV4cHIoSUQsIHNjQWRkUmVjRXhwciwgTywgTiksIEwobCkge30KKworICBwdWJsaWM6CisgICAgY29uc3QgU0NFViAqZ2V0U3RhcnQoKSBjb25zdCB7IHJldHVybiBPcGVyYW5kc1swXTsgfQorICAgIGNvbnN0IExvb3AgKmdldExvb3AoKSBjb25zdCB7IHJldHVybiBMOyB9CisKKyAgICAvLy8gQ29uc3RydWN0cyBhbmQgcmV0dXJucyB0aGUgcmVjdXJyZW5jZSBpbmRpY2F0aW5nIGhvdyBtdWNoIHRoaXMKKyAgICAvLy8gZXhwcmVzc2lvbiBzdGVwcyBieS4gIElmIHRoaXMgaXMgYSBwb2x5bm9taWFsIG9mIGRlZ3JlZSBOLCBpdAorICAgIC8vLyByZXR1cm5zIGEgY2hyZWMgb2YgZGVncmVlIE4tMS4gIFdlIGNhbm5vdCBkZXRlcm1pbmUgd2hldGhlcgorICAgIC8vLyB0aGUgc3RlcCByZWN1cnJlbmNlIGhhcyBzZWxmLXdyYXBhcm91bmQuCisgICAgY29uc3QgU0NFViAqZ2V0U3RlcFJlY3VycmVuY2UoU2NhbGFyRXZvbHV0aW9uICZTRSkgY29uc3QgeworICAgICAgaWYgKGlzQWZmaW5lKCkpIHJldHVybiBnZXRPcGVyYW5kKDEpOworICAgICAgcmV0dXJuIFNFLmdldEFkZFJlY0V4cHIoU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCAzPihvcF9iZWdpbigpKzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wX2VuZCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldExvb3AoKSwgRmxhZ0FueVdyYXApOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBBICsgQip4IHdoZXJlIEEKKyAgICAvLy8gYW5kIEIgYXJlIGxvb3AgaW52YXJpYW50IHZhbHVlcy4KKyAgICBib29sIGlzQWZmaW5lKCkgY29uc3QgeworICAgICAgLy8gV2Uga25vdyB0aGF0IHRoZSBzdGFydCB2YWx1ZSBpcyBpbnZhcmlhbnQuICBUaGlzIGV4cHJlc3Npb24gaXMgdGh1cworICAgICAgLy8gYWZmaW5lIGlmZiB0aGUgc3RlcCBpcyBhbHNvIGludmFyaWFudC4KKyAgICAgIHJldHVybiBnZXROdW1PcGVyYW5kcygpID09IDI7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgcmVwcmVzZW50cyBhbiBleHByZXNzaW9uIEEgKyBCKnggKyBDKnheMgorICAgIC8vLyB3aGVyZSBBLCBCIGFuZCBDIGFyZSBsb29wIGludmFyaWFudCB2YWx1ZXMuICBUaGlzIGNvcnJlc3BvbmRzCisgICAgLy8vIHRvIGFuIGFkZHJlYyBvZiB0aGUgZm9ybSB7TCwrLE0sKyxOfQorICAgIGJvb2wgaXNRdWFkcmF0aWMoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKSA9PSAzOworICAgIH0KKworICAgIC8vLyBTZXQgZmxhZ3MgZm9yIGEgcmVjdXJyZW5jZSB3aXRob3V0IGNsZWFyaW5nIGFueSBwcmV2aW91c2x5IHNldCBmbGFncy4KKyAgICAvLy8gRm9yIEFkZFJlYywgZWl0aGVyIE5VVyBvciBOU1cgaW1wbGllcyBOVy4gS2VlcCB0cmFjayBvZiB0aGlzIGZhY3QgaGVyZQorICAgIC8vLyB0byBtYWtlIGl0IGVhc2llciB0byBwcm9wYWdhdGUgZmxhZ3MuCisgICAgdm9pZCBzZXROb1dyYXBGbGFncyhOb1dyYXBGbGFncyBGbGFncykgeworICAgICAgaWYgKEZsYWdzICYgKEZsYWdOVVcgfCBGbGFnTlNXKSkKKyAgICAgICAgRmxhZ3MgPSBTY2FsYXJFdm9sdXRpb246OnNldEZsYWdzKEZsYWdzLCBGbGFnTlcpOworICAgICAgU3ViY2xhc3NEYXRhIHw9IEZsYWdzOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoaXMgY2hhaW4gb2YgcmVjdXJyZW5jZXMgYXQgdGhlIHNwZWNpZmllZAorICAgIC8vLyBpdGVyYXRpb24gbnVtYmVyLgorICAgIGNvbnN0IFNDRVYgKmV2YWx1YXRlQXRJdGVyYXRpb24oY29uc3QgU0NFViAqSXQsIFNjYWxhckV2b2x1dGlvbiAmU0UpIGNvbnN0OworCisgICAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGl0ZXJhdGlvbnMgb2YgdGhpcyBsb29wIHRoYXQgcHJvZHVjZQorICAgIC8vLyB2YWx1ZXMgaW4gdGhlIHNwZWNpZmllZCBjb25zdGFudCByYW5nZS4gIEFub3RoZXIgd2F5IG9mCisgICAgLy8vIGxvb2tpbmcgYXQgdGhpcyBpcyB0aGF0IGl0IHJldHVybnMgdGhlIGZpcnN0IGl0ZXJhdGlvbiBudW1iZXIKKyAgICAvLy8gd2hlcmUgdGhlIHZhbHVlIGlzIG5vdCBpbiB0aGUgY29uZGl0aW9uLCB0aHVzIGNvbXB1dGluZyB0aGUKKyAgICAvLy8gZXhpdCBjb3VudC4gIElmIHRoZSBpdGVyYXRpb24gY291bnQgY2FuJ3QgYmUgY29tcHV0ZWQsIGFuCisgICAgLy8vIGluc3RhbmNlIG9mIFNDRVZDb3VsZE5vdENvbXB1dGUgaXMgcmV0dXJuZWQuCisgICAgY29uc3QgU0NFViAqZ2V0TnVtSXRlcmF0aW9uc0luUmFuZ2UoY29uc3QgQ29uc3RhbnRSYW5nZSAmUmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyRXZvbHV0aW9uICZTRSkgY29uc3Q7CisKKyAgICAvLy8gUmV0dXJuIGFuIGV4cHJlc3Npb24gcmVwcmVzZW50aW5nIHRoZSB2YWx1ZSBvZiB0aGlzIGV4cHJlc3Npb24KKyAgICAvLy8gb25lIGl0ZXJhdGlvbiBvZiB0aGUgbG9vcCBhaGVhZC4KKyAgICBjb25zdCBTQ0VWQWRkUmVjRXhwciAqZ2V0UG9zdEluY0V4cHIoU2NhbGFyRXZvbHV0aW9uICZTRSkgY29uc3Q7CisKKyAgICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVYgKlMpIHsKKyAgICAgIHJldHVybiBTLT5nZXRTQ0VWVHlwZSgpID09IHNjQWRkUmVjRXhwcjsKKyAgICB9CisgIH07CisKKyAgLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHNpZ25lZCBtYXhpbXVtIHNlbGVjdGlvbi4KKyAgY2xhc3MgU0NFVlNNYXhFeHByIDogcHVibGljIFNDRVZDb21tdXRhdGl2ZUV4cHIgeworICAgIGZyaWVuZCBjbGFzcyBTY2FsYXJFdm9sdXRpb247CisKKyAgICBTQ0VWU01heEV4cHIoY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBJRCwKKyAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqY29uc3QgKk8sIHNpemVfdCBOKQorICAgICAgOiBTQ0VWQ29tbXV0YXRpdmVFeHByKElELCBzY1NNYXhFeHByLCBPLCBOKSB7CisgICAgICAvLyBNYXggbmV2ZXIgb3ZlcmZsb3dzLgorICAgICAgc2V0Tm9XcmFwRmxhZ3MoKE5vV3JhcEZsYWdzKShGbGFnTlVXIHwgRmxhZ05TVykpOworICAgIH0KKworICBwdWJsaWM6CisgICAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWICpTKSB7CisgICAgICByZXR1cm4gUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY1NNYXhFeHByOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGFuIHVuc2lnbmVkIG1heGltdW0gc2VsZWN0aW9uLgorICBjbGFzcyBTQ0VWVU1heEV4cHIgOiBwdWJsaWMgU0NFVkNvbW11dGF0aXZlRXhwciB7CisgICAgZnJpZW5kIGNsYXNzIFNjYWxhckV2b2x1dGlvbjsKKworICAgIFNDRVZVTWF4RXhwcihjb25zdCBGb2xkaW5nU2V0Tm9kZUlEUmVmIElELAorICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpjb25zdCAqTywgc2l6ZV90IE4pCisgICAgICA6IFNDRVZDb21tdXRhdGl2ZUV4cHIoSUQsIHNjVU1heEV4cHIsIE8sIE4pIHsKKyAgICAgIC8vIE1heCBuZXZlciBvdmVyZmxvd3MuCisgICAgICBzZXROb1dyYXBGbGFncygoTm9XcmFwRmxhZ3MpKEZsYWdOVVcgfCBGbGFnTlNXKSk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNDRVYgKlMpIHsKKyAgICAgIHJldHVybiBTLT5nZXRTQ0VWVHlwZSgpID09IHNjVU1heEV4cHI7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIG1lYW5zIHRoYXQgd2UgYXJlIGRlYWxpbmcgd2l0aCBhbiBlbnRpcmVseSB1bmtub3duIFNDRVYKKyAgLy8vIHZhbHVlLCBhbmQgb25seSByZXByZXNlbnQgaXQgYXMgaXRzIExMVk0gVmFsdWUuICBUaGlzIGlzIHRoZQorICAvLy8gImJvdHRvbSIgdmFsdWUgZm9yIHRoZSBhbmFseXNpcy4KKyAgY2xhc3MgU0NFVlVua25vd24gZmluYWwgOiBwdWJsaWMgU0NFViwgcHJpdmF0ZSBDYWxsYmFja1ZIIHsKKyAgICBmcmllbmQgY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworCisgICAgLy8vIFRoZSBwYXJlbnQgU2NhbGFyRXZvbHV0aW9uIHZhbHVlLiBUaGlzIGlzIHVzZWQgdG8gdXBkYXRlIHRoZQorICAgIC8vLyBwYXJlbnQncyBtYXBzIHdoZW4gdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCBhIFNDRVZVbmtub3duIGlzCisgICAgLy8vIGRlbGV0ZWQgb3IgUkFVVydkLgorICAgIFNjYWxhckV2b2x1dGlvbiAqU0U7CisKKyAgICAvLy8gVGhlIG5leHQgcG9pbnRlciBpbiB0aGUgbGlua2VkIGxpc3Qgb2YgYWxsIFNDRVZVbmtub3duCisgICAgLy8vIGluc3RhbmNlcyBvd25lZCBieSBhIFNjYWxhckV2b2x1dGlvbi4KKyAgICBTQ0VWVW5rbm93biAqTmV4dDsKKworICAgIFNDRVZVbmtub3duKGNvbnN0IEZvbGRpbmdTZXROb2RlSURSZWYgSUQsIFZhbHVlICpWLAorICAgICAgICAgICAgICAgIFNjYWxhckV2b2x1dGlvbiAqc2UsIFNDRVZVbmtub3duICpuZXh0KSA6CisgICAgICBTQ0VWKElELCBzY1Vua25vd24pLCBDYWxsYmFja1ZIKFYpLCBTRShzZSksIE5leHQobmV4dCkge30KKworICAgIC8vIEltcGxlbWVudCBDYWxsYmFja1ZILgorICAgIHZvaWQgZGVsZXRlZCgpIG92ZXJyaWRlOworICAgIHZvaWQgYWxsVXNlc1JlcGxhY2VkV2l0aChWYWx1ZSAqTmV3KSBvdmVycmlkZTsKKworICBwdWJsaWM6CisgICAgVmFsdWUgKmdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gZ2V0VmFsUHRyKCk7IH0KKworICAgIC8vLyBAeworICAgIC8vLyBUZXN0IHdoZXRoZXIgdGhpcyBpcyBhIHNwZWNpYWwgY29uc3RhbnQgcmVwcmVzZW50aW5nIGEgdHlwZQorICAgIC8vLyBzaXplLCBhbGlnbm1lbnQsIG9yIGZpZWxkIG9mZnNldCBpbiBhIHRhcmdldC1pbmRlcGVuZGVudAorICAgIC8vLyBtYW5uZXIsIGFuZCBoYXNuJ3QgaGFwcGVuZWQgdG8gaGF2ZSBiZWVuIGZvbGRlZCB3aXRoIG90aGVyCisgICAgLy8vIG9wZXJhdGlvbnMgaW50byBzb21ldGhpbmcgdW5yZWNvZ25pemFibGUuIFRoaXMgaXMgbWFpbmx5IG9ubHkKKyAgICAvLy8gdXNlZnVsIGZvciBwcmV0dHktcHJpbnRpbmcgYW5kIG90aGVyIHNpdHVhdGlvbnMgd2hlcmUgaXQgaXNuJ3QKKyAgICAvLy8gYWJzb2x1dGVseSByZXF1aXJlZCBmb3IgdGhlc2UgdG8gc3VjY2VlZC4KKyAgICBib29sIGlzU2l6ZU9mKFR5cGUgKiZBbGxvY1R5KSBjb25zdDsKKyAgICBib29sIGlzQWxpZ25PZihUeXBlIComQWxsb2NUeSkgY29uc3Q7CisgICAgYm9vbCBpc09mZnNldE9mKFR5cGUgKiZTVHksIENvbnN0YW50IComRmllbGRObykgY29uc3Q7CisgICAgLy8vIEB9CisKKyAgICBUeXBlICpnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gZ2V0VmFsUHRyKCktPmdldFR5cGUoKTsgfQorCisgICAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTQ0VWICpTKSB7CisgICAgICByZXR1cm4gUy0+Z2V0U0NFVlR5cGUoKSA9PSBzY1Vua25vd247CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIGNsYXNzIGRlZmluZXMgYSBzaW1wbGUgdmlzaXRvciBjbGFzcyB0aGF0IG1heSBiZSB1c2VkIGZvcgorICAvLy8gdmFyaW91cyBTQ0VWIGFuYWx5c2lzIHB1cnBvc2VzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBTQywgdHlwZW5hbWUgUmV0VmFsPXZvaWQ+CisgIHN0cnVjdCBTQ0VWVmlzaXRvciB7CisgICAgUmV0VmFsIHZpc2l0KGNvbnN0IFNDRVYgKlMpIHsKKyAgICAgIHN3aXRjaCAoUy0+Z2V0U0NFVlR5cGUoKSkgeworICAgICAgY2FzZSBzY0NvbnN0YW50OgorICAgICAgICByZXR1cm4gKChTQyopdGhpcyktPnZpc2l0Q29uc3RhbnQoKGNvbnN0IFNDRVZDb25zdGFudCopUyk7CisgICAgICBjYXNlIHNjVHJ1bmNhdGU6CisgICAgICAgIHJldHVybiAoKFNDKil0aGlzKS0+dmlzaXRUcnVuY2F0ZUV4cHIoKGNvbnN0IFNDRVZUcnVuY2F0ZUV4cHIqKVMpOworICAgICAgY2FzZSBzY1plcm9FeHRlbmQ6CisgICAgICAgIHJldHVybiAoKFNDKil0aGlzKS0+dmlzaXRaZXJvRXh0ZW5kRXhwcigoY29uc3QgU0NFVlplcm9FeHRlbmRFeHByKilTKTsKKyAgICAgIGNhc2Ugc2NTaWduRXh0ZW5kOgorICAgICAgICByZXR1cm4gKChTQyopdGhpcyktPnZpc2l0U2lnbkV4dGVuZEV4cHIoKGNvbnN0IFNDRVZTaWduRXh0ZW5kRXhwciopUyk7CisgICAgICBjYXNlIHNjQWRkRXhwcjoKKyAgICAgICAgcmV0dXJuICgoU0MqKXRoaXMpLT52aXNpdEFkZEV4cHIoKGNvbnN0IFNDRVZBZGRFeHByKilTKTsKKyAgICAgIGNhc2Ugc2NNdWxFeHByOgorICAgICAgICByZXR1cm4gKChTQyopdGhpcyktPnZpc2l0TXVsRXhwcigoY29uc3QgU0NFVk11bEV4cHIqKVMpOworICAgICAgY2FzZSBzY1VEaXZFeHByOgorICAgICAgICByZXR1cm4gKChTQyopdGhpcyktPnZpc2l0VURpdkV4cHIoKGNvbnN0IFNDRVZVRGl2RXhwciopUyk7CisgICAgICBjYXNlIHNjQWRkUmVjRXhwcjoKKyAgICAgICAgcmV0dXJuICgoU0MqKXRoaXMpLT52aXNpdEFkZFJlY0V4cHIoKGNvbnN0IFNDRVZBZGRSZWNFeHByKilTKTsKKyAgICAgIGNhc2Ugc2NTTWF4RXhwcjoKKyAgICAgICAgcmV0dXJuICgoU0MqKXRoaXMpLT52aXNpdFNNYXhFeHByKChjb25zdCBTQ0VWU01heEV4cHIqKVMpOworICAgICAgY2FzZSBzY1VNYXhFeHByOgorICAgICAgICByZXR1cm4gKChTQyopdGhpcyktPnZpc2l0VU1heEV4cHIoKGNvbnN0IFNDRVZVTWF4RXhwciopUyk7CisgICAgICBjYXNlIHNjVW5rbm93bjoKKyAgICAgICAgcmV0dXJuICgoU0MqKXRoaXMpLT52aXNpdFVua25vd24oKGNvbnN0IFNDRVZVbmtub3duKilTKTsKKyAgICAgIGNhc2Ugc2NDb3VsZE5vdENvbXB1dGU6CisgICAgICAgIHJldHVybiAoKFNDKil0aGlzKS0+dmlzaXRDb3VsZE5vdENvbXB1dGUoKGNvbnN0IFNDRVZDb3VsZE5vdENvbXB1dGUqKVMpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBTQ0VWIHR5cGUhIik7CisgICAgICB9CisgICAgfQorCisgICAgUmV0VmFsIHZpc2l0Q291bGROb3RDb21wdXRlKGNvbnN0IFNDRVZDb3VsZE5vdENvbXB1dGUgKlMpIHsKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgdXNlIG9mIFNDRVZDb3VsZE5vdENvbXB1dGUhIik7CisgICAgfQorICB9OworCisgIC8vLyBWaXNpdCBhbGwgbm9kZXMgaW4gdGhlIGV4cHJlc3Npb24gdHJlZSB1c2luZyB3b3JrbGlzdCB0cmF2ZXJzYWwuCisgIC8vLworICAvLy8gVmlzaXRvciBpbXBsZW1lbnRzOgorICAvLy8gICAvLyByZXR1cm4gdHJ1ZSB0byBmb2xsb3cgdGhpcyBub2RlLgorICAvLy8gICBib29sIGZvbGxvdyhjb25zdCBTQ0VWICpTKTsKKyAgLy8vICAgLy8gcmV0dXJuIHRydWUgdG8gdGVybWluYXRlIHRoZSBzZWFyY2guCisgIC8vLyAgIGJvb2wgaXNEb25lKCk7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFNWPgorICBjbGFzcyBTQ0VWVHJhdmVyc2FsIHsKKyAgICBTViAmVmlzaXRvcjsKKyAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDg+IFdvcmtsaXN0OworICAgIFNtYWxsUHRyU2V0PGNvbnN0IFNDRVYgKiwgOD4gVmlzaXRlZDsKKworICAgIHZvaWQgcHVzaChjb25zdCBTQ0VWICpTKSB7CisgICAgICBpZiAoVmlzaXRlZC5pbnNlcnQoUykuc2Vjb25kICYmIFZpc2l0b3IuZm9sbG93KFMpKQorICAgICAgICBXb3JrbGlzdC5wdXNoX2JhY2soUyk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICBTQ0VWVHJhdmVyc2FsKFNWJiBWKTogVmlzaXRvcihWKSB7fQorCisgICAgdm9pZCB2aXNpdEFsbChjb25zdCBTQ0VWICpSb290KSB7CisgICAgICBwdXNoKFJvb3QpOworICAgICAgd2hpbGUgKCFXb3JrbGlzdC5lbXB0eSgpICYmICFWaXNpdG9yLmlzRG9uZSgpKSB7CisgICAgICAgIGNvbnN0IFNDRVYgKlMgPSBXb3JrbGlzdC5wb3BfYmFja192YWwoKTsKKworICAgICAgICBzd2l0Y2ggKFMtPmdldFNDRVZUeXBlKCkpIHsKKyAgICAgICAgY2FzZSBzY0NvbnN0YW50OgorICAgICAgICBjYXNlIHNjVW5rbm93bjoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBzY1RydW5jYXRlOgorICAgICAgICBjYXNlIHNjWmVyb0V4dGVuZDoKKyAgICAgICAgY2FzZSBzY1NpZ25FeHRlbmQ6CisgICAgICAgICAgcHVzaChjYXN0PFNDRVZDYXN0RXhwcj4oUyktPmdldE9wZXJhbmQoKSk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2Ugc2NBZGRFeHByOgorICAgICAgICBjYXNlIHNjTXVsRXhwcjoKKyAgICAgICAgY2FzZSBzY1NNYXhFeHByOgorICAgICAgICBjYXNlIHNjVU1heEV4cHI6CisgICAgICAgIGNhc2Ugc2NBZGRSZWNFeHByOgorICAgICAgICAgIGZvciAoY29uc3QgYXV0byAqT3AgOiBjYXN0PFNDRVZOQXJ5RXhwcj4oUyktPm9wZXJhbmRzKCkpCisgICAgICAgICAgICBwdXNoKE9wKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBzY1VEaXZFeHByOiB7CisgICAgICAgICAgY29uc3QgU0NFVlVEaXZFeHByICpVRGl2ID0gY2FzdDxTQ0VWVURpdkV4cHI+KFMpOworICAgICAgICAgIHB1c2goVURpdi0+Z2V0TEhTKCkpOworICAgICAgICAgIHB1c2goVURpdi0+Z2V0UkhTKCkpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2Ugc2NDb3VsZE5vdENvbXB1dGU6CisgICAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiQXR0ZW1wdCB0byB1c2UgYSBTQ0VWQ291bGROb3RDb21wdXRlIG9iamVjdCEiKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIFNDRVYga2luZCEiKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfTsKKworICAvLy8gVXNlIFNDRVZUcmF2ZXJzYWwgdG8gdmlzaXQgYWxsIG5vZGVzIGluIHRoZSBnaXZlbiBleHByZXNzaW9uIHRyZWUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFNWPgorICB2b2lkIHZpc2l0QWxsKGNvbnN0IFNDRVYgKlJvb3QsIFNWJiBWaXNpdG9yKSB7CisgICAgU0NFVlRyYXZlcnNhbDxTVj4gVChWaXNpdG9yKTsKKyAgICBULnZpc2l0QWxsKFJvb3QpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGFueSBub2RlIGluIFxwIFJvb3Qgc2F0aXNmaWVzIHRoZSBwcmVkaWNhdGUgXHAgUHJlZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFByZWRUeT4KKyAgYm9vbCBTQ0VWRXhwckNvbnRhaW5zKGNvbnN0IFNDRVYgKlJvb3QsIFByZWRUeSBQcmVkKSB7CisgICAgc3RydWN0IEZpbmRDbG9zdXJlIHsKKyAgICAgIGJvb2wgRm91bmQgPSBmYWxzZTsKKyAgICAgIFByZWRUeSBQcmVkOworCisgICAgICBGaW5kQ2xvc3VyZShQcmVkVHkgUHJlZCkgOiBQcmVkKFByZWQpIHt9CisKKyAgICAgIGJvb2wgZm9sbG93KGNvbnN0IFNDRVYgKlMpIHsKKyAgICAgICAgaWYgKCFQcmVkKFMpKQorICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAgIEZvdW5kID0gdHJ1ZTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorCisgICAgICBib29sIGlzRG9uZSgpIGNvbnN0IHsgcmV0dXJuIEZvdW5kOyB9CisgICAgfTsKKworICAgIEZpbmRDbG9zdXJlIEZDKFByZWQpOworICAgIHZpc2l0QWxsKFJvb3QsIEZDKTsKKyAgICByZXR1cm4gRkMuRm91bmQ7CisgIH0KKworICAvLy8gVGhpcyB2aXNpdG9yIHJlY3Vyc2l2ZWx5IHZpc2l0cyBhIFNDRVYgZXhwcmVzc2lvbiBhbmQgcmUtd3JpdGVzIGl0LgorICAvLy8gVGhlIHJlc3VsdCBmcm9tIGVhY2ggdmlzaXQgaXMgY2FjaGVkLCBzbyBpdCB3aWxsIHJldHVybiB0aGUgc2FtZQorICAvLy8gU0NFViBmb3IgdGhlIHNhbWUgaW5wdXQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFNDPgorICBjbGFzcyBTQ0VWUmV3cml0ZVZpc2l0b3IgOiBwdWJsaWMgU0NFVlZpc2l0b3I8U0MsIGNvbnN0IFNDRVYgKj4geworICBwcm90ZWN0ZWQ6CisgICAgU2NhbGFyRXZvbHV0aW9uICZTRTsKKyAgICAvLyBNZW1vaXplIHRoZSByZXN1bHQgb2YgZWFjaCB2aXNpdCBzbyB0aGF0IHdlIG9ubHkgY29tcHV0ZSBvbmNlIGZvcgorICAgIC8vIHRoZSBzYW1lIGlucHV0IFNDRVYuIFRoaXMgaXMgdG8gYXZvaWQgcmVkdW5kYW50IGNvbXB1dGF0aW9ucyB3aGVuCisgICAgLy8gYSBTQ0VWIGlzIHJlZmVyZW5jZWQgYnkgbXVsdGlwbGUgU0NFVnMuIFdpdGhvdXQgbWVtb2l6YXRpb24sIHRoaXMKKyAgICAvLyB2aXNpdCBhbGdvcml0aG0gd291bGQgaGF2ZSBleHBvbmVudGlhbCB0aW1lIGNvbXBsZXhpdHkgaW4gdGhlIHdvcnN0CisgICAgLy8gY2FzZSwgY2F1c2luZyB0aGUgY29tcGlsZXIgdG8gaGFuZyBvbiBjZXJ0YWluIHRlc3RzLgorICAgIERlbnNlTWFwPGNvbnN0IFNDRVYgKiwgY29uc3QgU0NFViAqPiBSZXdyaXRlUmVzdWx0czsKKworICBwdWJsaWM6CisgICAgU0NFVlJld3JpdGVWaXNpdG9yKFNjYWxhckV2b2x1dGlvbiAmU0UpIDogU0UoU0UpIHt9CisKKyAgICBjb25zdCBTQ0VWICp2aXNpdChjb25zdCBTQ0VWICpTKSB7CisgICAgICBhdXRvIEl0ID0gUmV3cml0ZVJlc3VsdHMuZmluZChTKTsKKyAgICAgIGlmIChJdCAhPSBSZXdyaXRlUmVzdWx0cy5lbmQoKSkKKyAgICAgICAgcmV0dXJuIEl0LT5zZWNvbmQ7CisgICAgICBhdXRvKiBWaXNpdGVkID0gU0NFVlZpc2l0b3I8U0MsIGNvbnN0IFNDRVYgKj46OnZpc2l0KFMpOworICAgICAgYXV0byBSZXN1bHQgPSBSZXdyaXRlUmVzdWx0cy50cnlfZW1wbGFjZShTLCBWaXNpdGVkKTsKKyAgICAgIGFzc2VydChSZXN1bHQuc2Vjb25kICYmICJTaG91bGQgaW5zZXJ0IGEgbmV3IGVudHJ5Iik7CisgICAgICByZXR1cm4gUmVzdWx0LmZpcnN0LT5zZWNvbmQ7CisgICAgfQorCisgICAgY29uc3QgU0NFViAqdmlzaXRDb25zdGFudChjb25zdCBTQ0VWQ29uc3RhbnQgKkNvbnN0YW50KSB7CisgICAgICByZXR1cm4gQ29uc3RhbnQ7CisgICAgfQorCisgICAgY29uc3QgU0NFViAqdmlzaXRUcnVuY2F0ZUV4cHIoY29uc3QgU0NFVlRydW5jYXRlRXhwciAqRXhwcikgeworICAgICAgY29uc3QgU0NFViAqT3BlcmFuZCA9ICgoU0MqKXRoaXMpLT52aXNpdChFeHByLT5nZXRPcGVyYW5kKCkpOworICAgICAgcmV0dXJuIE9wZXJhbmQgPT0gRXhwci0+Z2V0T3BlcmFuZCgpCisgICAgICAgICAgICAgICAgID8gRXhwcgorICAgICAgICAgICAgICAgICA6IFNFLmdldFRydW5jYXRlRXhwcihPcGVyYW5kLCBFeHByLT5nZXRUeXBlKCkpOworICAgIH0KKworICAgIGNvbnN0IFNDRVYgKnZpc2l0WmVyb0V4dGVuZEV4cHIoY29uc3QgU0NFVlplcm9FeHRlbmRFeHByICpFeHByKSB7CisgICAgICBjb25zdCBTQ0VWICpPcGVyYW5kID0gKChTQyopdGhpcyktPnZpc2l0KEV4cHItPmdldE9wZXJhbmQoKSk7CisgICAgICByZXR1cm4gT3BlcmFuZCA9PSBFeHByLT5nZXRPcGVyYW5kKCkKKyAgICAgICAgICAgICAgICAgPyBFeHByCisgICAgICAgICAgICAgICAgIDogU0UuZ2V0WmVyb0V4dGVuZEV4cHIoT3BlcmFuZCwgRXhwci0+Z2V0VHlwZSgpKTsKKyAgICB9CisKKyAgICBjb25zdCBTQ0VWICp2aXNpdFNpZ25FeHRlbmRFeHByKGNvbnN0IFNDRVZTaWduRXh0ZW5kRXhwciAqRXhwcikgeworICAgICAgY29uc3QgU0NFViAqT3BlcmFuZCA9ICgoU0MqKXRoaXMpLT52aXNpdChFeHByLT5nZXRPcGVyYW5kKCkpOworICAgICAgcmV0dXJuIE9wZXJhbmQgPT0gRXhwci0+Z2V0T3BlcmFuZCgpCisgICAgICAgICAgICAgICAgID8gRXhwcgorICAgICAgICAgICAgICAgICA6IFNFLmdldFNpZ25FeHRlbmRFeHByKE9wZXJhbmQsIEV4cHItPmdldFR5cGUoKSk7CisgICAgfQorCisgICAgY29uc3QgU0NFViAqdmlzaXRBZGRFeHByKGNvbnN0IFNDRVZBZGRFeHByICpFeHByKSB7CisgICAgICBTbWFsbFZlY3Rvcjxjb25zdCBTQ0VWICosIDI+IE9wZXJhbmRzOworICAgICAgYm9vbCBDaGFuZ2VkID0gZmFsc2U7CisgICAgICBmb3IgKGF1dG8gKk9wIDogRXhwci0+b3BlcmFuZHMoKSkgeworICAgICAgICBPcGVyYW5kcy5wdXNoX2JhY2soKChTQyopdGhpcyktPnZpc2l0KE9wKSk7CisgICAgICAgIENoYW5nZWQgfD0gT3AgIT0gT3BlcmFuZHMuYmFjaygpOworICAgICAgfQorICAgICAgcmV0dXJuICFDaGFuZ2VkID8gRXhwciA6IFNFLmdldEFkZEV4cHIoT3BlcmFuZHMpOworICAgIH0KKworICAgIGNvbnN0IFNDRVYgKnZpc2l0TXVsRXhwcihjb25zdCBTQ0VWTXVsRXhwciAqRXhwcikgeworICAgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCAyPiBPcGVyYW5kczsKKyAgICAgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICAgICAgZm9yIChhdXRvICpPcCA6IEV4cHItPm9wZXJhbmRzKCkpIHsKKyAgICAgICAgT3BlcmFuZHMucHVzaF9iYWNrKCgoU0MqKXRoaXMpLT52aXNpdChPcCkpOworICAgICAgICBDaGFuZ2VkIHw9IE9wICE9IE9wZXJhbmRzLmJhY2soKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAhQ2hhbmdlZCA/IEV4cHIgOiBTRS5nZXRNdWxFeHByKE9wZXJhbmRzKTsKKyAgICB9CisKKyAgICBjb25zdCBTQ0VWICp2aXNpdFVEaXZFeHByKGNvbnN0IFNDRVZVRGl2RXhwciAqRXhwcikgeworICAgICAgYXV0byAqTEhTID0gKChTQyAqKXRoaXMpLT52aXNpdChFeHByLT5nZXRMSFMoKSk7CisgICAgICBhdXRvICpSSFMgPSAoKFNDICopdGhpcyktPnZpc2l0KEV4cHItPmdldFJIUygpKTsKKyAgICAgIGJvb2wgQ2hhbmdlZCA9IExIUyAhPSBFeHByLT5nZXRMSFMoKSB8fCBSSFMgIT0gRXhwci0+Z2V0UkhTKCk7CisgICAgICByZXR1cm4gIUNoYW5nZWQgPyBFeHByIDogU0UuZ2V0VURpdkV4cHIoTEhTLCBSSFMpOworICAgIH0KKworICAgIGNvbnN0IFNDRVYgKnZpc2l0QWRkUmVjRXhwcihjb25zdCBTQ0VWQWRkUmVjRXhwciAqRXhwcikgeworICAgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCAyPiBPcGVyYW5kczsKKyAgICAgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICAgICAgZm9yIChhdXRvICpPcCA6IEV4cHItPm9wZXJhbmRzKCkpIHsKKyAgICAgICAgT3BlcmFuZHMucHVzaF9iYWNrKCgoU0MqKXRoaXMpLT52aXNpdChPcCkpOworICAgICAgICBDaGFuZ2VkIHw9IE9wICE9IE9wZXJhbmRzLmJhY2soKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAhQ2hhbmdlZCA/IEV4cHIKKyAgICAgICAgICAgICAgICAgICAgICA6IFNFLmdldEFkZFJlY0V4cHIoT3BlcmFuZHMsIEV4cHItPmdldExvb3AoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwci0+Z2V0Tm9XcmFwRmxhZ3MoKSk7CisgICAgfQorCisgICAgY29uc3QgU0NFViAqdmlzaXRTTWF4RXhwcihjb25zdCBTQ0VWU01heEV4cHIgKkV4cHIpIHsKKyAgICAgIFNtYWxsVmVjdG9yPGNvbnN0IFNDRVYgKiwgMj4gT3BlcmFuZHM7CisgICAgICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgICAgIGZvciAoYXV0byAqT3AgOiBFeHByLT5vcGVyYW5kcygpKSB7CisgICAgICAgIE9wZXJhbmRzLnB1c2hfYmFjaygoKFNDICopdGhpcyktPnZpc2l0KE9wKSk7CisgICAgICAgIENoYW5nZWQgfD0gT3AgIT0gT3BlcmFuZHMuYmFjaygpOworICAgICAgfQorICAgICAgcmV0dXJuICFDaGFuZ2VkID8gRXhwciA6IFNFLmdldFNNYXhFeHByKE9wZXJhbmRzKTsKKyAgICB9CisKKyAgICBjb25zdCBTQ0VWICp2aXNpdFVNYXhFeHByKGNvbnN0IFNDRVZVTWF4RXhwciAqRXhwcikgeworICAgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCAyPiBPcGVyYW5kczsKKyAgICAgIGJvb2wgQ2hhbmdlZCA9IGZhbHNlOworICAgICAgZm9yIChhdXRvICpPcCA6IEV4cHItPm9wZXJhbmRzKCkpIHsKKyAgICAgICAgT3BlcmFuZHMucHVzaF9iYWNrKCgoU0MqKXRoaXMpLT52aXNpdChPcCkpOworICAgICAgICBDaGFuZ2VkIHw9IE9wICE9IE9wZXJhbmRzLmJhY2soKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiAhQ2hhbmdlZCA/IEV4cHIgOiBTRS5nZXRVTWF4RXhwcihPcGVyYW5kcyk7CisgICAgfQorCisgICAgY29uc3QgU0NFViAqdmlzaXRVbmtub3duKGNvbnN0IFNDRVZVbmtub3duICpFeHByKSB7CisgICAgICByZXR1cm4gRXhwcjsKKyAgICB9CisKKyAgICBjb25zdCBTQ0VWICp2aXNpdENvdWxkTm90Q29tcHV0ZShjb25zdCBTQ0VWQ291bGROb3RDb21wdXRlICpFeHByKSB7CisgICAgICByZXR1cm4gRXhwcjsKKyAgICB9CisgIH07CisKKyAgdXNpbmcgVmFsdWVUb1ZhbHVlTWFwID0gRGVuc2VNYXA8Y29uc3QgVmFsdWUgKiwgVmFsdWUgKj47CisKKyAgLy8vIFRoZSBTQ0VWUGFyYW1ldGVyUmV3cml0ZXIgdGFrZXMgYSBzY2FsYXIgZXZvbHV0aW9uIGV4cHJlc3Npb24gYW5kIHVwZGF0ZXMKKyAgLy8vIHRoZSBTQ0VWVW5rbm93biBjb21wb25lbnRzIGZvbGxvd2luZyB0aGUgTWFwIChWYWx1ZSAtPiBWYWx1ZSkuCisgIGNsYXNzIFNDRVZQYXJhbWV0ZXJSZXdyaXRlciA6IHB1YmxpYyBTQ0VWUmV3cml0ZVZpc2l0b3I8U0NFVlBhcmFtZXRlclJld3JpdGVyPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgU0NFViAqcmV3cml0ZShjb25zdCBTQ0VWICpTY2V2LCBTY2FsYXJFdm9sdXRpb24gJlNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlVG9WYWx1ZU1hcCAmTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW50ZXJwcmV0Q29uc3RzID0gZmFsc2UpIHsKKyAgICAgIFNDRVZQYXJhbWV0ZXJSZXdyaXRlciBSZXdyaXRlcihTRSwgTWFwLCBJbnRlcnByZXRDb25zdHMpOworICAgICAgcmV0dXJuIFJld3JpdGVyLnZpc2l0KFNjZXYpOworICAgIH0KKworICAgIFNDRVZQYXJhbWV0ZXJSZXdyaXRlcihTY2FsYXJFdm9sdXRpb24gJlNFLCBWYWx1ZVRvVmFsdWVNYXAgJk0sIGJvb2wgQykKKyAgICAgIDogU0NFVlJld3JpdGVWaXNpdG9yKFNFKSwgTWFwKE0pLCBJbnRlcnByZXRDb25zdHMoQykge30KKworICAgIGNvbnN0IFNDRVYgKnZpc2l0VW5rbm93bihjb25zdCBTQ0VWVW5rbm93biAqRXhwcikgeworICAgICAgVmFsdWUgKlYgPSBFeHByLT5nZXRWYWx1ZSgpOworICAgICAgaWYgKE1hcC5jb3VudChWKSkgeworICAgICAgICBWYWx1ZSAqTlYgPSBNYXBbVl07CisgICAgICAgIGlmIChJbnRlcnByZXRDb25zdHMgJiYgaXNhPENvbnN0YW50SW50PihOVikpCisgICAgICAgICAgcmV0dXJuIFNFLmdldENvbnN0YW50KGNhc3Q8Q29uc3RhbnRJbnQ+KE5WKSk7CisgICAgICAgIHJldHVybiBTRS5nZXRVbmtub3duKE5WKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBFeHByOworICAgIH0KKworICBwcml2YXRlOgorICAgIFZhbHVlVG9WYWx1ZU1hcCAmTWFwOworICAgIGJvb2wgSW50ZXJwcmV0Q29uc3RzOworICB9OworCisgIHVzaW5nIExvb3BUb1NjZXZNYXBUID0gRGVuc2VNYXA8Y29uc3QgTG9vcCAqLCBjb25zdCBTQ0VWICo+OworCisgIC8vLyBUaGUgU0NFVkxvb3BBZGRSZWNSZXdyaXRlciB0YWtlcyBhIHNjYWxhciBldm9sdXRpb24gZXhwcmVzc2lvbiBhbmQgYXBwbGllcworICAvLy8gdGhlIE1hcCAoTG9vcCAtPiBTQ0VWKSB0byBhbGwgQWRkUmVjRXhwcnMuCisgIGNsYXNzIFNDRVZMb29wQWRkUmVjUmV3cml0ZXIKKyAgICAgIDogcHVibGljIFNDRVZSZXdyaXRlVmlzaXRvcjxTQ0VWTG9vcEFkZFJlY1Jld3JpdGVyPiB7CisgIHB1YmxpYzoKKyAgICBTQ0VWTG9vcEFkZFJlY1Jld3JpdGVyKFNjYWxhckV2b2x1dGlvbiAmU0UsIExvb3BUb1NjZXZNYXBUICZNKQorICAgICAgICA6IFNDRVZSZXdyaXRlVmlzaXRvcihTRSksIE1hcChNKSB7fQorCisgICAgc3RhdGljIGNvbnN0IFNDRVYgKnJld3JpdGUoY29uc3QgU0NFViAqU2NldiwgTG9vcFRvU2Nldk1hcFQgJk1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gJlNFKSB7CisgICAgICBTQ0VWTG9vcEFkZFJlY1Jld3JpdGVyIFJld3JpdGVyKFNFLCBNYXApOworICAgICAgcmV0dXJuIFJld3JpdGVyLnZpc2l0KFNjZXYpOworICAgIH0KKworICAgIGNvbnN0IFNDRVYgKnZpc2l0QWRkUmVjRXhwcihjb25zdCBTQ0VWQWRkUmVjRXhwciAqRXhwcikgeworICAgICAgU21hbGxWZWN0b3I8Y29uc3QgU0NFViAqLCAyPiBPcGVyYW5kczsKKyAgICAgIGZvciAoY29uc3QgU0NFViAqT3AgOiBFeHByLT5vcGVyYW5kcygpKQorICAgICAgICBPcGVyYW5kcy5wdXNoX2JhY2sodmlzaXQoT3ApKTsKKworICAgICAgY29uc3QgTG9vcCAqTCA9IEV4cHItPmdldExvb3AoKTsKKyAgICAgIGNvbnN0IFNDRVYgKlJlcyA9IFNFLmdldEFkZFJlY0V4cHIoT3BlcmFuZHMsIEwsIEV4cHItPmdldE5vV3JhcEZsYWdzKCkpOworCisgICAgICBpZiAoMCA9PSBNYXAuY291bnQoTCkpCisgICAgICAgIHJldHVybiBSZXM7CisKKyAgICAgIGNvbnN0IFNDRVZBZGRSZWNFeHByICpSZWMgPSBjYXN0PFNDRVZBZGRSZWNFeHByPihSZXMpOworICAgICAgcmV0dXJuIFJlYy0+ZXZhbHVhdGVBdEl0ZXJhdGlvbihNYXBbTF0sIFNFKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBMb29wVG9TY2V2TWFwVCAmTWFwOworICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19TQ0FMQVJFVk9MVVRJT05FWFBSRVNTSU9OU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbk5vcm1hbGl6YXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uTm9ybWFsaXphdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYzkyMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbk5vcm1hbGl6YXRpb24uaApAQCAtMCwwICsxLDY5IEBACisvLz09PS0gbGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25Ob3JtYWxpemF0aW9uLmggLSBTZWUgYmVsb3cgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHV0aWxpdGllcyBmb3Igd29ya2luZyB3aXRoICJub3JtYWxpemVkIiBTY2FsYXJFdm9sdXRpb24KKy8vIGV4cHJlc3Npb25zLgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZXhhbXBsZSBpbGx1c3RyYXRlcyBwb3N0LWluY3JlbWVudCB1c2VzIGFuZCBob3cgbm9ybWFsaXplZAorLy8gZXhwcmVzc2lvbnMgaGVscC4KKy8vCisvLyAgIGZvciAoaT0wOyBpIT1uOyArK2kpIHsKKy8vICAgICAuLi4KKy8vICAgfQorLy8gICB1c2UoaSk7CisvLworLy8gV2hpbGUgdGhlIGV4cHJlc3Npb24gZm9yIG1vc3QgdXNlcyBvZiBpIGluc2lkZSB0aGUgbG9vcCBpcyB7MCwrLDF9PCVMPiwgdGhlCisvLyBleHByZXNzaW9uIGZvciB0aGUgdXNlIG9mIGkgb3V0c2lkZSB0aGUgbG9vcCBpcyB7MSwrLDF9PCVMPiwgc2luY2UgaSBpcworLy8gaW5jcmVtZW50ZWQgYXQgdGhlIGVuZCBvZiB0aGUgbG9vcCBib2R5LiBUaGlzIGlzIGluY29udmVpZW50LCBzaW5jZSBpdAorLy8gc3VnZ2VzdHMgdGhhdCB3ZSBuZWVkIHR3byBkaWZmZXJlbnQgaW5kdWN0aW9uIHZhcmlhYmxlcywgb25lIHRoYXQgc3RhcnRzCisvLyBhdCAwIGFuZCBvbmUgdGhhdCBzdGFydHMgYXQgMS4gV2UnZCBwcmVmZXIgdG8gYmUgYWJsZSB0byB0aGluayBvZiB0aGVzZSBhcworLy8gdGhlIHNhbWUgaW5kdWN0aW9uIHZhcmlhYmxlLCB3aXRoIHVzZXMgaW5zaWRlIHRoZSBsb29wIHVzaW5nIHRoZQorLy8gInByZS1pbmNyZW1lbnRlZCIgdmFsdWUsIGFuZCB1c2VzIGFmdGVyIHRoZSBsb29wIHVzaW5nIHRoZQorLy8gInBvc3QtaW5jcmVtZW50ZWQiIHZhbHVlLgorLy8KKy8vIEV4cHJlc3Npb25zIGZvciBwb3N0LWluY3JlbWVudGVkIHVzZXMgYXJlIHJlcHJlc2VudGVkIGFzIGFuIGV4cHJlc3Npb24KKy8vIHBhaXJlZCB3aXRoIGEgc2V0IG9mIGxvb3BzIGZvciB3aGljaCB0aGUgZXhwcmVzc2lvbiBpcyBpbiAicG9zdC1pbmNyZW1lbnQiCisvLyBtb2RlICh0aGVyZSBtYXkgYmUgbXVsdGlwbGUgbG9vcHMpLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19TQ0FMQVJFVk9MVVRJT05OT1JNQUxJWkFUSU9OX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19TQ0FMQVJFVk9MVVRJT05OT1JNQUxJWkFUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25FeHByZXNzaW9ucy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExvb3A7CitjbGFzcyBTY2FsYXJFdm9sdXRpb247CitjbGFzcyBTQ0VWOworCit0eXBlZGVmIFNtYWxsUHRyU2V0PGNvbnN0IExvb3AgKiwgMj4gUG9zdEluY0xvb3BTZXQ7CisKK3R5cGVkZWYgZnVuY3Rpb25fcmVmPGJvb2woY29uc3QgU0NFVkFkZFJlY0V4cHIgKik+IE5vcm1hbGl6ZVByZWRUeTsKKworLy8vIE5vcm1hbGl6ZSBccCBTIHRvIGJlIHBvc3QtaW5jcmVtZW50IGZvciBhbGwgbG9vcHMgcHJlc2VudCBpbiBccAorLy8vIExvb3BzLgorY29uc3QgU0NFViAqbm9ybWFsaXplRm9yUG9zdEluY1VzZShjb25zdCBTQ0VWICpTLCBjb25zdCBQb3N0SW5jTG9vcFNldCAmTG9vcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhckV2b2x1dGlvbiAmU0UpOworCisvLy8gTm9ybWFsaXplIFxwIFMgZm9yIGFsbCBhZGQgcmVjdXJyZW5jZSBzdWItZXhwcmVzc2lvbnMgZm9yIHdoaWNoIFxwCisvLy8gUHJlZCByZXR1cm5zIHRydWUuCitjb25zdCBTQ0VWICpub3JtYWxpemVGb3JQb3N0SW5jVXNlSWYoY29uc3QgU0NFViAqUywgTm9ybWFsaXplUHJlZFR5IFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyRXZvbHV0aW9uICZTRSk7CisKKy8vLyBEZW5vcm1hbGl6ZSBccCBTIHRvIGJlIHBvc3QtaW5jcmVtZW50IGZvciBhbGwgbG9vcHMgcHJlc2VudCBpbiBccAorLy8vIExvb3BzLgorY29uc3QgU0NFViAqZGVub3JtYWxpemVGb3JQb3N0SW5jVXNlKGNvbnN0IFNDRVYgKlMsIGNvbnN0IFBvc3RJbmNMb29wU2V0ICZMb29wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gJlNFKTsKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1Njb3BlZE5vQWxpYXNBQS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9TY29wZWROb0FsaWFzQUEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDg5NjhlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9TY29wZWROb0FsaWFzQUEuaApAQCAtMCwwICsxLDg5IEBACisvLz09PS0gU2NvcGVkTm9BbGlhc0FBLmggLSBTY29wZWQgTm8tQWxpYXMgQWxpYXMgQW5hbHlzaXMgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFRoaXMgaXMgdGhlIGludGVyZmFjZSBmb3IgYSBtZXRhZGF0YS1iYXNlZCBzY29wZWQgbm8tYWxpYXMgYW5hbHlzaXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1NDT1BFRE5PQUxJQVNBQV9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfU0NPUEVETk9BTElBU0FBX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgTUROb2RlOworY2xhc3MgTWVtb3J5TG9jYXRpb247CisKKy8vLyBBIHNpbXBsZSBBQSByZXN1bHQgd2hpY2ggdXNlcyBzY29wZWQtbm9hbGlhcyBtZXRhZGF0YSB0byBhbnN3ZXIgcXVlcmllcy4KK2NsYXNzIFNjb3BlZE5vQWxpYXNBQVJlc3VsdCA6IHB1YmxpYyBBQVJlc3VsdEJhc2U8U2NvcGVkTm9BbGlhc0FBUmVzdWx0PiB7CisgIGZyaWVuZCBBQVJlc3VsdEJhc2U8U2NvcGVkTm9BbGlhc0FBUmVzdWx0PjsKKworcHVibGljOgorICAvLy8gSGFuZGxlIGludmFsaWRhdGlvbiBldmVudHMgZnJvbSB0aGUgbmV3IHBhc3MgbWFuYWdlci4KKyAgLy8vCisgIC8vLyBCeSBkZWZpbml0aW9uLCB0aGlzIHJlc3VsdCBpcyBzdGF0ZWxlc3MgYW5kIHNvIHJlbWFpbnMgdmFsaWQuCisgIGJvb2wgaW52YWxpZGF0ZShGdW5jdGlvbiAmLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmLAorICAgICAgICAgICAgICAgICAgRnVuY3Rpb25BbmFseXNpc01hbmFnZXI6OkludmFsaWRhdG9yICYpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBBbGlhc1Jlc3VsdCBhbGlhcyhjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jQSwgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvY0IpOworICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MpOworICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MxLCBJbW11dGFibGVDYWxsU2l0ZSBDUzIpOworCitwcml2YXRlOgorICBib29sIG1heUFsaWFzSW5TY29wZXMoY29uc3QgTUROb2RlICpTY29wZXMsIGNvbnN0IE1ETm9kZSAqTm9BbGlhcykgY29uc3Q7Cit9OworCisvLy8gQW5hbHlzaXMgcGFzcyBwcm92aWRpbmcgYSBuZXZlci1pbnZhbGlkYXRlZCBhbGlhcyBhbmFseXNpcyByZXN1bHQuCitjbGFzcyBTY29wZWROb0FsaWFzQUEgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48U2NvcGVkTm9BbGlhc0FBPiB7CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxTY29wZWROb0FsaWFzQUE+OworCisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7CisKK3B1YmxpYzoKKyAgdXNpbmcgUmVzdWx0ID0gU2NvcGVkTm9BbGlhc0FBUmVzdWx0OworCisgIFNjb3BlZE5vQWxpYXNBQVJlc3VsdCBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gTGVnYWN5IHdyYXBwZXIgcGFzcyB0byBwcm92aWRlIHRoZSBTY29wZWROb0FsaWFzQUFSZXN1bHQgb2JqZWN0LgorY2xhc3MgU2NvcGVkTm9BbGlhc0FBV3JhcHBlclBhc3MgOiBwdWJsaWMgSW1tdXRhYmxlUGFzcyB7CisgIHN0ZDo6dW5pcXVlX3B0cjxTY29wZWROb0FsaWFzQUFSZXN1bHQ+IFJlc3VsdDsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBTY29wZWROb0FsaWFzQUFXcmFwcGVyUGFzcygpOworCisgIFNjb3BlZE5vQWxpYXNBQVJlc3VsdCAmZ2V0UmVzdWx0KCkgeyByZXR1cm4gKlJlc3VsdDsgfQorICBjb25zdCBTY29wZWROb0FsaWFzQUFSZXN1bHQgJmdldFJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuICpSZXN1bHQ7IH0KKworICBib29sIGRvSW5pdGlhbGl6YXRpb24oTW9kdWxlICZNKSBvdmVycmlkZTsKKyAgYm9vbCBkb0ZpbmFsaXphdGlvbihNb2R1bGUgJk0pIG92ZXJyaWRlOworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gY3JlYXRlU2NvcGVkTm9BbGlhc0FBV3JhcHBlclBhc3MgLSBUaGlzIHBhc3MgaW1wbGVtZW50cyBtZXRhZGF0YS1iYXNlZAorLy8gc2NvcGVkIG5vYWxpYXMgYW5hbHlzaXMuCisvLworSW1tdXRhYmxlUGFzcyAqY3JlYXRlU2NvcGVkTm9BbGlhc0FBV3JhcHBlclBhc3MoKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfU0NPUEVETk9BTElBU0FBX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvU3BhcnNlUHJvcGFnYXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvU3BhcnNlUHJvcGFnYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjhkZjAzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9TcGFyc2VQcm9wYWdhdGlvbi5oCkBAIC0wLDAgKzEsNTMwIEBACisvLz09PS0gU3BhcnNlUHJvcGFnYXRpb24uaCAtIFNwYXJzZSBDb25kaXRpb25hbCBQcm9wZXJ0eSBQcm9wYWdhdGlvbiAtLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGFuIGFic3RyYWN0IHNwYXJzZSBjb25kaXRpb25hbCBwcm9wYWdhdGlvbiBhbGdvcml0aG0sCisvLyBtb2RlbGVkIGFmdGVyIFNDQ1AsIGJ1dCB3aXRoIGEgY3VzdG9taXphYmxlIGxhdHRpY2UgZnVuY3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1NQQVJTRVBST1BBR0FUSU9OX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19TUEFSU0VQUk9QQUdBVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgPHNldD4KKworI2RlZmluZSBERUJVR19UWVBFICJzcGFyc2Vwcm9wIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBIHRlbXBsYXRlIGZvciB0cmFuc2xhdGluZyBiZXR3ZWVuIExMVk0gVmFsdWVzIGFuZCBMYXR0aWNlS2V5cy4gQ2xpZW50cyBtdXN0CisvLy8gcHJvdmlkZSBhIHNwZWNpYWxpemF0aW9uIG9mIExhdHRpY2VLZXlJbmZvIGZvciB0aGVpciBMYXR0aWNlS2V5IHR5cGUuCit0ZW1wbGF0ZSA8Y2xhc3MgTGF0dGljZUtleT4gc3RydWN0IExhdHRpY2VLZXlJbmZvIHsKKyAgLy8gc3RhdGljIGlubGluZSBWYWx1ZSAqZ2V0VmFsdWVGcm9tTGF0dGljZUtleShMYXR0aWNlS2V5IEtleSk7CisgIC8vIHN0YXRpYyBpbmxpbmUgTGF0dGljZUtleSBnZXRMYXR0aWNlS2V5RnJvbVZhbHVlKFZhbHVlICpWKTsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBMYXR0aWNlS2V5LCBjbGFzcyBMYXR0aWNlVmFsLAorICAgICAgICAgIGNsYXNzIEtleUluZm8gPSBMYXR0aWNlS2V5SW5mbzxMYXR0aWNlS2V5Pj4KK2NsYXNzIFNwYXJzZVNvbHZlcjsKKworLy8vIEFic3RyYWN0TGF0dGljZUZ1bmN0aW9uIC0gVGhpcyBjbGFzcyBpcyBpbXBsZW1lbnRlZCBieSB0aGUgZGF0YWZsb3cgaW5zdGFuY2UKKy8vLyB0byBzcGVjaWZ5IHdoYXQgdGhlIGxhdHRpY2UgdmFsdWVzIGFyZSBhbmQgaG93IHRoZXkgaGFuZGxlIG1lcmdlcyBldGMuICBUaGlzCisvLy8gZ2l2ZXMgdGhlIGNsaWVudCB0aGUgcG93ZXIgdG8gY29tcHV0ZSBsYXR0aWNlIHZhbHVlcyBmcm9tIGluc3RydWN0aW9ucywKKy8vLyBjb25zdGFudHMsIGV0Yy4gIFRoZSBjdXJyZW50IHJlcXVpcmVtZW50IGlzIHRoYXQgbGF0dGljZSB2YWx1ZXMgbXVzdCBiZQorLy8vIGNvcHlhYmxlLiAgQXQgdGhlIG1vbWVudCwgbm90aGluZyB0cmllcyB0byBhdm9pZCBjb3B5aW5nLiAgQWRkaXRpb25hbGx5LAorLy8vIGxhdHRpY2Uga2V5cyBtdXN0IGJlIGFibGUgdG8gYmUgdXNlZCBhcyBrZXlzIG9mIGEgbWFwcGluZyBkYXRhIHN0cnVjdHVyZS4KKy8vLyBJbnRlcm5hbGx5LCB0aGUgZ2VuZXJpYyBzb2x2ZXIgY3VycmVudGx5IHVzZXMgYSBEZW5zZU1hcCB0byBtYXAgbGF0dGljZSBrZXlzCisvLy8gdG8gbGF0dGljZSB2YWx1ZXMuICBJZiB0aGUgbGF0dGljZSBrZXkgaXMgYSBub24tc3RhbmRhcmQgdHlwZSwgYQorLy8vIHNwZWNpYWxpemF0aW9uIG9mIERlbnNlTWFwSW5mbyBtdXN0IGJlIHByb3ZpZGVkLgordGVtcGxhdGUgPGNsYXNzIExhdHRpY2VLZXksIGNsYXNzIExhdHRpY2VWYWw+IGNsYXNzIEFic3RyYWN0TGF0dGljZUZ1bmN0aW9uIHsKK3ByaXZhdGU6CisgIExhdHRpY2VWYWwgVW5kZWZWYWwsIE92ZXJkZWZpbmVkVmFsLCBVbnRyYWNrZWRWYWw7CisKK3B1YmxpYzoKKyAgQWJzdHJhY3RMYXR0aWNlRnVuY3Rpb24oTGF0dGljZVZhbCB1bmRlZlZhbCwgTGF0dGljZVZhbCBvdmVyZGVmaW5lZFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTGF0dGljZVZhbCB1bnRyYWNrZWRWYWwpIHsKKyAgICBVbmRlZlZhbCA9IHVuZGVmVmFsOworICAgIE92ZXJkZWZpbmVkVmFsID0gb3ZlcmRlZmluZWRWYWw7CisgICAgVW50cmFja2VkVmFsID0gdW50cmFja2VkVmFsOworICB9CisKKyAgdmlydHVhbCB+QWJzdHJhY3RMYXR0aWNlRnVuY3Rpb24oKSA9IGRlZmF1bHQ7CisKKyAgTGF0dGljZVZhbCBnZXRVbmRlZlZhbCgpICAgICAgIGNvbnN0IHsgcmV0dXJuIFVuZGVmVmFsOyB9CisgIExhdHRpY2VWYWwgZ2V0T3ZlcmRlZmluZWRWYWwoKSBjb25zdCB7IHJldHVybiBPdmVyZGVmaW5lZFZhbDsgfQorICBMYXR0aWNlVmFsIGdldFVudHJhY2tlZFZhbCgpICAgY29uc3QgeyByZXR1cm4gVW50cmFja2VkVmFsOyB9CisKKyAgLy8vIElzVW50cmFja2VkVmFsdWUgLSBJZiB0aGUgc3BlY2lmaWVkIExhdHRpY2VLZXkgaXMgb2J2aW91c2x5IHVuaW50ZXJlc3RpbmcKKyAgLy8vIHRvIHRoZSBhbmFseXNpcyAoaS5lLiwgaXQgd291bGQgYWx3YXlzIHJldHVybiBVbnRyYWNrZWRWYWwpLCB0aGlzCisgIC8vLyBmdW5jdGlvbiBjYW4gcmV0dXJuIHRydWUgdG8gYXZvaWQgcG9pbnRsZXNzIHdvcmsuCisgIHZpcnR1YWwgYm9vbCBJc1VudHJhY2tlZFZhbHVlKExhdHRpY2VLZXkgS2V5KSB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBDb21wdXRlTGF0dGljZVZhbCAtIENvbXB1dGUgYW5kIHJldHVybiBhIExhdHRpY2VWYWwgY29ycmVzcG9uZGluZyB0byB0aGUKKyAgLy8vIGdpdmVuIExhdHRpY2VLZXkuCisgIHZpcnR1YWwgTGF0dGljZVZhbCBDb21wdXRlTGF0dGljZVZhbChMYXR0aWNlS2V5IEtleSkgeworICAgIHJldHVybiBnZXRPdmVyZGVmaW5lZFZhbCgpOworICB9CisKKyAgLy8vIElzU3BlY2lhbENhc2VkUEhJIC0gR2l2ZW4gYSBQSEkgbm9kZSwgZGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBQSEkgbm9kZSBpcworICAvLy8gb25lIHRoYXQgdGhlIHdlIHdhbnQgdG8gaGFuZGxlIHRocm91Z2ggQ29tcHV0ZUluc3RydWN0aW9uU3RhdGUuCisgIHZpcnR1YWwgYm9vbCBJc1NwZWNpYWxDYXNlZFBISShQSElOb2RlICpQTikgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gTWVyZ2VWYWx1ZXMgLSBDb21wdXRlIGFuZCByZXR1cm4gdGhlIG1lcmdlIG9mIHRoZSB0d28gc3BlY2lmaWVkIGxhdHRpY2UKKyAgLy8vIHZhbHVlcy4gIE1lcmdpbmcgc2hvdWxkIG9ubHkgbW92ZSBvbmUgZGlyZWN0aW9uIGRvd24gdGhlIGxhdHRpY2UgdG8KKyAgLy8vIGd1YXJhbnRlZSBjb252ZXJnZW5jZSAodG93YXJkIG92ZXJkZWZpbmVkKS4KKyAgdmlydHVhbCBMYXR0aWNlVmFsIE1lcmdlVmFsdWVzKExhdHRpY2VWYWwgWCwgTGF0dGljZVZhbCBZKSB7CisgICAgcmV0dXJuIGdldE92ZXJkZWZpbmVkVmFsKCk7IC8vIGFsd2F5cyBzYWZlLCBuZXZlciB1c2VmdWwuCisgIH0KKworICAvLy8gQ29tcHV0ZUluc3RydWN0aW9uU3RhdGUgLSBDb21wdXRlIHRoZSBMYXR0aWNlS2V5cyB0aGF0IGNoYW5nZSBhcyBhIHJlc3VsdAorICAvLy8gb2YgZXhlY3V0aW5nIGluc3RydWN0aW9uIFxwIEkuIFRoZWlyIGFzc29jaWF0ZWQgTGF0dGljZVZhbHMgYXJlIHN0b3JlIGluCisgIC8vLyBccCBDaGFuZ2VkVmFsdWVzLgorICB2aXJ0dWFsIHZvaWQKKyAgQ29tcHV0ZUluc3RydWN0aW9uU3RhdGUoSW5zdHJ1Y3Rpb24gJkksCisgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPExhdHRpY2VLZXksIExhdHRpY2VWYWw+ICZDaGFuZ2VkVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFyc2VTb2x2ZXI8TGF0dGljZUtleSwgTGF0dGljZVZhbD4gJlNTKSA9IDA7CisKKyAgLy8vIFByaW50TGF0dGljZVZhbCAtIFJlbmRlciB0aGUgZ2l2ZW4gTGF0dGljZVZhbCB0byB0aGUgc3BlY2lmaWVkIHN0cmVhbS4KKyAgdmlydHVhbCB2b2lkIFByaW50TGF0dGljZVZhbChMYXR0aWNlVmFsIExWLCByYXdfb3N0cmVhbSAmT1MpOworCisgIC8vLyBQcmludExhdHRpY2VLZXkgLSBSZW5kZXIgdGhlIGdpdmVuIExhdHRpY2VLZXkgdG8gdGhlIHNwZWNpZmllZCBzdHJlYW0uCisgIHZpcnR1YWwgdm9pZCBQcmludExhdHRpY2VLZXkoTGF0dGljZUtleSBLZXksIHJhd19vc3RyZWFtICZPUyk7CisKKyAgLy8vIEdldFZhbHVlRnJvbUxhdHRpY2VWYWwgLSBJZiB0aGUgZ2l2ZW4gTGF0dGljZVZhbCBpcyByZXByZXNlbnRhYmxlIGFzIGFuCisgIC8vLyBMTFZNIHZhbHVlLCByZXR1cm4gaXQ7IG90aGVyd2lzZSwgcmV0dXJuIG51bGxwdHIuIElmIGEgdHlwZSBpcyBnaXZlbiwgdGhlCisgIC8vLyByZXR1cm5lZCB2YWx1ZSBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZS4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHRoZQorICAvLy8gZ2VuZXJpYyBzb2x2ZXIgaW4gYXR0ZW1wdGluZyB0byByZXNvbHZlIGJyYW5jaCBhbmQgc3dpdGNoIGNvbmRpdGlvbnMuCisgIHZpcnR1YWwgVmFsdWUgKkdldFZhbHVlRnJvbUxhdHRpY2VWYWwoTGF0dGljZVZhbCBMViwgVHlwZSAqVHkgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KK307CisKKy8vLyBTcGFyc2VTb2x2ZXIgLSBUaGlzIGNsYXNzIGlzIGEgZ2VuZXJhbCBwdXJwb3NlIHNvbHZlciBmb3IgU3BhcnNlIENvbmRpdGlvbmFsCisvLy8gUHJvcGFnYXRpb24gd2l0aCBhIHByb2dyYW1tYWJsZSBsYXR0aWNlIGZ1bmN0aW9uLgordGVtcGxhdGUgPGNsYXNzIExhdHRpY2VLZXksIGNsYXNzIExhdHRpY2VWYWwsIGNsYXNzIEtleUluZm8+CitjbGFzcyBTcGFyc2VTb2x2ZXIgeworCisgIC8vLyBMYXR0aWNlRnVuYyAtIFRoaXMgaXMgdGhlIG9iamVjdCB0aGF0IGtub3dzIHRoZSBsYXR0aWNlIGFuZCBob3cgdG8KKyAgLy8vIGNvbXB1dGUgdHJhbnNmZXIgZnVuY3Rpb25zLgorICBBYnN0cmFjdExhdHRpY2VGdW5jdGlvbjxMYXR0aWNlS2V5LCBMYXR0aWNlVmFsPiAqTGF0dGljZUZ1bmM7CisKKyAgLy8vIFZhbHVlU3RhdGUgLSBIb2xkcyB0aGUgTGF0dGljZVZhbHMgYXNzb2NpYXRlZCB3aXRoIExhdHRpY2VLZXlzLgorICBEZW5zZU1hcDxMYXR0aWNlS2V5LCBMYXR0aWNlVmFsPiBWYWx1ZVN0YXRlOworCisgIC8vLyBCQkV4ZWN1dGFibGUgLSBIb2xkcyB0aGUgYmFzaWMgYmxvY2tzIHRoYXQgYXJlIGV4ZWN1dGFibGUuCisgIFNtYWxsUHRyU2V0PEJhc2ljQmxvY2sgKiwgMTY+IEJCRXhlY3V0YWJsZTsKKworICAvLy8gVmFsdWVXb3JrTGlzdCAtIEhvbGRzIHZhbHVlcyB0aGF0IHNob3VsZCBiZSBwcm9jZXNzZWQuCisgIFNtYWxsVmVjdG9yPFZhbHVlICosIDY0PiBWYWx1ZVdvcmtMaXN0OworCisgIC8vLyBCQldvcmtMaXN0IC0gSG9sZHMgYmFzaWMgYmxvY2tzIHRoYXQgc2hvdWxkIGJlIHByb2Nlc3NlZC4KKyAgU21hbGxWZWN0b3I8QmFzaWNCbG9jayAqLCA2ND4gQkJXb3JrTGlzdDsKKworICB1c2luZyBFZGdlID0gc3RkOjpwYWlyPEJhc2ljQmxvY2sgKiwgQmFzaWNCbG9jayAqPjsKKworICAvLy8gS25vd25GZWFzaWJsZUVkZ2VzIC0gRW50cmllcyBpbiB0aGlzIHNldCBhcmUgZWRnZXMgd2hpY2ggaGF2ZSBhbHJlYWR5IGhhZAorICAvLy8gUEhJIG5vZGVzIHJldHJpZ2dlcmVkLgorICBzdGQ6OnNldDxFZGdlPiBLbm93bkZlYXNpYmxlRWRnZXM7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgU3BhcnNlU29sdmVyKAorICAgICAgQWJzdHJhY3RMYXR0aWNlRnVuY3Rpb248TGF0dGljZUtleSwgTGF0dGljZVZhbD4gKkxhdHRpY2UpCisgICAgICA6IExhdHRpY2VGdW5jKExhdHRpY2UpIHt9CisgIFNwYXJzZVNvbHZlcihjb25zdCBTcGFyc2VTb2x2ZXIgJikgPSBkZWxldGU7CisgIFNwYXJzZVNvbHZlciAmb3BlcmF0b3I9KGNvbnN0IFNwYXJzZVNvbHZlciAmKSA9IGRlbGV0ZTsKKworICAvLy8gU29sdmUgLSBTb2x2ZSBmb3IgY29uc3RhbnRzIGFuZCBleGVjdXRhYmxlIGJsb2Nrcy4KKyAgdm9pZCBTb2x2ZSgpOworCisgIHZvaWQgUHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLy8gZ2V0RXhpc3RpbmdWYWx1ZVN0YXRlIC0gUmV0dXJuIHRoZSBMYXR0aWNlVmFsIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAvLy8gZ2l2ZW4gdmFsdWUgZnJvbSB0aGUgVmFsdWVTdGF0ZSBtYXAuIElmIHRoZSB2YWx1ZSBpcyBub3QgaW4gdGhlIG1hcCwKKyAgLy8vIFVudHJhY2tlZFZhbCBpcyByZXR1cm5lZCwgdW5saWtlIHRoZSBnZXRWYWx1ZVN0YXRlIG1ldGhvZC4KKyAgTGF0dGljZVZhbCBnZXRFeGlzdGluZ1ZhbHVlU3RhdGUoTGF0dGljZUtleSBLZXkpIGNvbnN0IHsKKyAgICBhdXRvIEkgPSBWYWx1ZVN0YXRlLmZpbmQoS2V5KTsKKyAgICByZXR1cm4gSSAhPSBWYWx1ZVN0YXRlLmVuZCgpID8gSS0+c2Vjb25kIDogTGF0dGljZUZ1bmMtPmdldFVudHJhY2tlZFZhbCgpOworICB9CisKKyAgLy8vIGdldFZhbHVlU3RhdGUgLSBSZXR1cm4gdGhlIExhdHRpY2VWYWwgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuCisgIC8vLyB2YWx1ZSBmcm9tIHRoZSBWYWx1ZVN0YXRlIG1hcC4gSWYgdGhlIHZhbHVlIGlzIG5vdCBpbiB0aGUgbWFwLCBpdHMgc3RhdGUKKyAgLy8vIGlzIGluaXRpYWxpemVkLgorICBMYXR0aWNlVmFsIGdldFZhbHVlU3RhdGUoTGF0dGljZUtleSBLZXkpOworCisgIC8vLyBpc0VkZ2VGZWFzaWJsZSAtIFJldHVybiB0cnVlIGlmIHRoZSBjb250cm9sIGZsb3cgZWRnZSBmcm9tIHRoZSAnRnJvbScKKyAgLy8vIGJhc2ljIGJsb2NrIHRvIHRoZSAnVG8nIGJhc2ljIGJsb2NrIGlzIGN1cnJlbnRseSBmZWFzaWJsZS4gIElmCisgIC8vLyBBZ2dyZXNzaXZlVW5kZWYgaXMgdHJ1ZSwgdGhlbiB0aGlzIHRyZWF0cyB2YWx1ZXMgd2l0aCB1bmtub3duIGxhdHRpY2UKKyAgLy8vIHZhbHVlcyBhcyB1bmRlZmluZWQuICBUaGlzIGlzIGdlbmVyYWxseSBvbmx5IHVzZWZ1bCB3aGVuIHNvbHZpbmcgdGhlCisgIC8vLyBsYXR0aWNlLCBub3Qgd2hlbiBxdWVyeWluZyBpdC4KKyAgYm9vbCBpc0VkZ2VGZWFzaWJsZShCYXNpY0Jsb2NrICpGcm9tLCBCYXNpY0Jsb2NrICpUbywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIEFnZ3Jlc3NpdmVVbmRlZiA9IGZhbHNlKTsKKworICAvLy8gaXNCbG9ja0V4ZWN1dGFibGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IGtub3duIGZlYXNpYmxlCisgIC8vLyBlZGdlcyBpbnRvIHRoZSBiYXNpYyBibG9jay4gIFRoaXMgaXMgZ2VuZXJhbGx5IG9ubHkgdXNlZnVsIHdoZW4KKyAgLy8vIHF1ZXJ5aW5nIHRoZSBsYXR0aWNlLgorICBib29sIGlzQmxvY2tFeGVjdXRhYmxlKEJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgcmV0dXJuIEJCRXhlY3V0YWJsZS5jb3VudChCQik7CisgIH0KKworICAvLy8gTWFya0Jsb2NrRXhlY3V0YWJsZSAtIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGJ5IGNsaWVudHMgdG8gbWFyayBhbGwgb2YKKyAgLy8vIHRoZSBibG9ja3MgdGhhdCBhcmUga25vd24gdG8gYmUgaW50cmluc2ljYWxseSBsaXZlIGluIHRoZSBwcm9jZXNzZWQgdW5pdC4KKyAgdm9pZCBNYXJrQmxvY2tFeGVjdXRhYmxlKEJhc2ljQmxvY2sgKkJCKTsKKworcHJpdmF0ZToKKyAgLy8vIFVwZGF0ZVN0YXRlIC0gV2hlbiB0aGUgc3RhdGUgb2Ygc29tZSBMYXR0aWNlS2V5IGlzIHBvdGVudGlhbGx5IHVwZGF0ZWQgdG8KKyAgLy8vIHRoZSBnaXZlbiBMYXR0aWNlVmFsLCB0aGlzIGZ1bmN0aW9uIG5vdGljZXMgYW5kIGFkZHMgdGhlIExMVk0gdmFsdWUKKyAgLy8vIGNvcnJlc3BvbmRpbmcgdGhlIGtleSB0byB0aGUgd29yayBsaXN0LCBpZiBuZWVkZWQuCisgIHZvaWQgVXBkYXRlU3RhdGUoTGF0dGljZUtleSBLZXksIExhdHRpY2VWYWwgTFYpOworCisgIC8vLyBtYXJrRWRnZUV4ZWN1dGFibGUgLSBNYXJrIGEgYmFzaWMgYmxvY2sgYXMgZXhlY3V0YWJsZSwgYWRkaW5nIGl0IHRvIHRoZSBCQgorICAvLy8gd29yayBsaXN0IGlmIGl0IGlzIG5vdCBhbHJlYWR5IGV4ZWN1dGFibGUuCisgIHZvaWQgbWFya0VkZ2VFeGVjdXRhYmxlKEJhc2ljQmxvY2sgKlNvdXJjZSwgQmFzaWNCbG9jayAqRGVzdCk7CisKKyAgLy8vIGdldEZlYXNpYmxlU3VjY2Vzc29ycyAtIFJldHVybiBhIHZlY3RvciBvZiBib29sZWFucyB0byBpbmRpY2F0ZSB3aGljaAorICAvLy8gc3VjY2Vzc29ycyBhcmUgcmVhY2hhYmxlIGZyb20gYSBnaXZlbiB0ZXJtaW5hdG9yIGluc3RydWN0aW9uLgorICB2b2lkIGdldEZlYXNpYmxlU3VjY2Vzc29ycyhUZXJtaW5hdG9ySW5zdCAmVEksIFNtYWxsVmVjdG9ySW1wbDxib29sPiAmU3VjY3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWdncmVzc2l2ZVVuZGVmKTsKKworICB2b2lkIHZpc2l0SW5zdChJbnN0cnVjdGlvbiAmSSk7CisgIHZvaWQgdmlzaXRQSElOb2RlKFBISU5vZGUgJkkpOworICB2b2lkIHZpc2l0VGVybWluYXRvckluc3QoVGVybWluYXRvckluc3QgJlRJKTsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgIEFic3RyYWN0TGF0dGljZUZ1bmN0aW9uIEltcGxlbWVudGF0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit0ZW1wbGF0ZSA8Y2xhc3MgTGF0dGljZUtleSwgY2xhc3MgTGF0dGljZVZhbD4KK3ZvaWQgQWJzdHJhY3RMYXR0aWNlRnVuY3Rpb248TGF0dGljZUtleSwgTGF0dGljZVZhbD46OlByaW50TGF0dGljZVZhbCgKKyAgICBMYXR0aWNlVmFsIFYsIHJhd19vc3RyZWFtICZPUykgeworICBpZiAoViA9PSBVbmRlZlZhbCkKKyAgICBPUyA8PCAidW5kZWZpbmVkIjsKKyAgZWxzZSBpZiAoViA9PSBPdmVyZGVmaW5lZFZhbCkKKyAgICBPUyA8PCAib3ZlcmRlZmluZWQiOworICBlbHNlIGlmIChWID09IFVudHJhY2tlZFZhbCkKKyAgICBPUyA8PCAidW50cmFja2VkIjsKKyAgZWxzZQorICAgIE9TIDw8ICJ1bmtub3duIGxhdHRpY2UgdmFsdWUiOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgTGF0dGljZUtleSwgY2xhc3MgTGF0dGljZVZhbD4KK3ZvaWQgQWJzdHJhY3RMYXR0aWNlRnVuY3Rpb248TGF0dGljZUtleSwgTGF0dGljZVZhbD46OlByaW50TGF0dGljZUtleSgKKyAgICBMYXR0aWNlS2V5IEtleSwgcmF3X29zdHJlYW0gJk9TKSB7CisgIE9TIDw8ICJ1bmtub3duIGxhdHRpY2Uga2V5IjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBTcGFyc2VTb2x2ZXIgSW1wbGVtZW50YXRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3RlbXBsYXRlIDxjbGFzcyBMYXR0aWNlS2V5LCBjbGFzcyBMYXR0aWNlVmFsLCBjbGFzcyBLZXlJbmZvPgorTGF0dGljZVZhbAorU3BhcnNlU29sdmVyPExhdHRpY2VLZXksIExhdHRpY2VWYWwsIEtleUluZm8+OjpnZXRWYWx1ZVN0YXRlKExhdHRpY2VLZXkgS2V5KSB7CisgIGF1dG8gSSA9IFZhbHVlU3RhdGUuZmluZChLZXkpOworICBpZiAoSSAhPSBWYWx1ZVN0YXRlLmVuZCgpKQorICAgIHJldHVybiBJLT5zZWNvbmQ7IC8vIENvbW1vbiBjYXNlLCBpbiB0aGUgbWFwCisKKyAgaWYgKExhdHRpY2VGdW5jLT5Jc1VudHJhY2tlZFZhbHVlKEtleSkpCisgICAgcmV0dXJuIExhdHRpY2VGdW5jLT5nZXRVbnRyYWNrZWRWYWwoKTsKKyAgTGF0dGljZVZhbCBMViA9IExhdHRpY2VGdW5jLT5Db21wdXRlTGF0dGljZVZhbChLZXkpOworCisgIC8vIElmIHRoaXMgdmFsdWUgaXMgdW50cmFja2VkLCBkb24ndCBhZGQgaXQgdG8gdGhlIG1hcC4KKyAgaWYgKExWID09IExhdHRpY2VGdW5jLT5nZXRVbnRyYWNrZWRWYWwoKSkKKyAgICByZXR1cm4gTFY7CisgIHJldHVybiBWYWx1ZVN0YXRlW0tleV0gPSBMVjsKK30KKwordGVtcGxhdGUgPGNsYXNzIExhdHRpY2VLZXksIGNsYXNzIExhdHRpY2VWYWwsIGNsYXNzIEtleUluZm8+Cit2b2lkIFNwYXJzZVNvbHZlcjxMYXR0aWNlS2V5LCBMYXR0aWNlVmFsLCBLZXlJbmZvPjo6VXBkYXRlU3RhdGUoTGF0dGljZUtleSBLZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGF0dGljZVZhbCBMVikgeworICBhdXRvIEkgPSBWYWx1ZVN0YXRlLmZpbmQoS2V5KTsKKyAgaWYgKEkgIT0gVmFsdWVTdGF0ZS5lbmQoKSAmJiBJLT5zZWNvbmQgPT0gTFYpCisgICAgcmV0dXJuOyAvLyBObyBjaGFuZ2UuCisKKyAgLy8gVXBkYXRlIHRoZSBzdGF0ZSBvZiB0aGUgZ2l2ZW4gTGF0dGljZUtleSBhbmQgYWRkIGl0cyBjb3JyZXNwb25kaW5nIExMVk0KKyAgLy8gdmFsdWUgdG8gdGhlIHdvcmsgbGlzdC4KKyAgVmFsdWVTdGF0ZVtLZXldID0gTFY7CisgIGlmIChWYWx1ZSAqViA9IEtleUluZm86OmdldFZhbHVlRnJvbUxhdHRpY2VLZXkoS2V5KSkKKyAgICBWYWx1ZVdvcmtMaXN0LnB1c2hfYmFjayhWKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIExhdHRpY2VLZXksIGNsYXNzIExhdHRpY2VWYWwsIGNsYXNzIEtleUluZm8+Cit2b2lkIFNwYXJzZVNvbHZlcjxMYXR0aWNlS2V5LCBMYXR0aWNlVmFsLCBLZXlJbmZvPjo6TWFya0Jsb2NrRXhlY3V0YWJsZSgKKyAgICBCYXNpY0Jsb2NrICpCQikgeworICBpZiAoIUJCRXhlY3V0YWJsZS5pbnNlcnQoQkIpLnNlY29uZCkKKyAgICByZXR1cm47CisgIERFQlVHKGRiZ3MoKSA8PCAiTWFya2luZyBCbG9jayBFeGVjdXRhYmxlOiAiIDw8IEJCLT5nZXROYW1lKCkgPDwgIlxuIik7CisgIEJCV29ya0xpc3QucHVzaF9iYWNrKEJCKTsgLy8gQWRkIHRoZSBibG9jayB0byB0aGUgd29yayBsaXN0IQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgTGF0dGljZUtleSwgY2xhc3MgTGF0dGljZVZhbCwgY2xhc3MgS2V5SW5mbz4KK3ZvaWQgU3BhcnNlU29sdmVyPExhdHRpY2VLZXksIExhdHRpY2VWYWwsIEtleUluZm8+OjptYXJrRWRnZUV4ZWN1dGFibGUoCisgICAgQmFzaWNCbG9jayAqU291cmNlLCBCYXNpY0Jsb2NrICpEZXN0KSB7CisgIGlmICghS25vd25GZWFzaWJsZUVkZ2VzLmluc2VydChFZGdlKFNvdXJjZSwgRGVzdCkpLnNlY29uZCkKKyAgICByZXR1cm47IC8vIFRoaXMgZWRnZSBpcyBhbHJlYWR5IGtub3duIHRvIGJlIGV4ZWN1dGFibGUhCisKKyAgREVCVUcoZGJncygpIDw8ICJNYXJraW5nIEVkZ2UgRXhlY3V0YWJsZTogIiA8PCBTb3VyY2UtPmdldE5hbWUoKSA8PCAiIC0+ICIKKyAgICAgICAgICAgICAgIDw8IERlc3QtPmdldE5hbWUoKSA8PCAiXG4iKTsKKworICBpZiAoQkJFeGVjdXRhYmxlLmNvdW50KERlc3QpKSB7CisgICAgLy8gVGhlIGRlc3RpbmF0aW9uIGlzIGFscmVhZHkgZXhlY3V0YWJsZSwgYnV0IHdlIGp1c3QgbWFkZSBhbiBlZGdlCisgICAgLy8gZmVhc2libGUgdGhhdCB3YXNuJ3QgYmVmb3JlLiAgUmV2aXNpdCB0aGUgUEhJIG5vZGVzIGluIHRoZSBibG9jaworICAgIC8vIGJlY2F1c2UgdGhleSBoYXZlIHBvdGVudGlhbGx5IG5ldyBvcGVyYW5kcy4KKyAgICBmb3IgKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBEZXN0LT5iZWdpbigpOyBpc2E8UEhJTm9kZT4oSSk7ICsrSSkKKyAgICAgIHZpc2l0UEhJTm9kZSgqY2FzdDxQSElOb2RlPihJKSk7CisgIH0gZWxzZSB7CisgICAgTWFya0Jsb2NrRXhlY3V0YWJsZShEZXN0KTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgTGF0dGljZUtleSwgY2xhc3MgTGF0dGljZVZhbCwgY2xhc3MgS2V5SW5mbz4KK3ZvaWQgU3BhcnNlU29sdmVyPExhdHRpY2VLZXksIExhdHRpY2VWYWwsIEtleUluZm8+OjpnZXRGZWFzaWJsZVN1Y2Nlc3NvcnMoCisgICAgVGVybWluYXRvckluc3QgJlRJLCBTbWFsbFZlY3RvckltcGw8Ym9vbD4gJlN1Y2NzLCBib29sIEFnZ3Jlc3NpdmVVbmRlZikgeworICBTdWNjcy5yZXNpemUoVEkuZ2V0TnVtU3VjY2Vzc29ycygpKTsKKyAgaWYgKFRJLmdldE51bVN1Y2Nlc3NvcnMoKSA9PSAwKQorICAgIHJldHVybjsKKworICBpZiAoQnJhbmNoSW5zdCAqQkkgPSBkeW5fY2FzdDxCcmFuY2hJbnN0PigmVEkpKSB7CisgICAgaWYgKEJJLT5pc1VuY29uZGl0aW9uYWwoKSkgeworICAgICAgU3VjY3NbMF0gPSB0cnVlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIExhdHRpY2VWYWwgQkNWYWx1ZTsKKyAgICBpZiAoQWdncmVzc2l2ZVVuZGVmKQorICAgICAgQkNWYWx1ZSA9CisgICAgICAgICAgZ2V0VmFsdWVTdGF0ZShLZXlJbmZvOjpnZXRMYXR0aWNlS2V5RnJvbVZhbHVlKEJJLT5nZXRDb25kaXRpb24oKSkpOworICAgIGVsc2UKKyAgICAgIEJDVmFsdWUgPSBnZXRFeGlzdGluZ1ZhbHVlU3RhdGUoCisgICAgICAgICAgS2V5SW5mbzo6Z2V0TGF0dGljZUtleUZyb21WYWx1ZShCSS0+Z2V0Q29uZGl0aW9uKCkpKTsKKworICAgIGlmIChCQ1ZhbHVlID09IExhdHRpY2VGdW5jLT5nZXRPdmVyZGVmaW5lZFZhbCgpIHx8CisgICAgICAgIEJDVmFsdWUgPT0gTGF0dGljZUZ1bmMtPmdldFVudHJhY2tlZFZhbCgpKSB7CisgICAgICAvLyBPdmVyZGVmaW5lZCBjb25kaXRpb24gdmFyaWFibGVzIGNhbiBicmFuY2ggZWl0aGVyIHdheS4KKyAgICAgIFN1Y2NzWzBdID0gU3VjY3NbMV0gPSB0cnVlOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIElmIHVuZGVmaW5lZCwgbmVpdGhlciBpcyBmZWFzaWJsZSB5ZXQuCisgICAgaWYgKEJDVmFsdWUgPT0gTGF0dGljZUZ1bmMtPmdldFVuZGVmVmFsKCkpCisgICAgICByZXR1cm47CisKKyAgICBDb25zdGFudCAqQyA9CisgICAgICAgIGR5bl9jYXN0X29yX251bGw8Q29uc3RhbnQ+KExhdHRpY2VGdW5jLT5HZXRWYWx1ZUZyb21MYXR0aWNlVmFsKAorICAgICAgICAgICAgQkNWYWx1ZSwgQkktPmdldENvbmRpdGlvbigpLT5nZXRUeXBlKCkpKTsKKyAgICBpZiAoIUMgfHwgIWlzYTxDb25zdGFudEludD4oQykpIHsKKyAgICAgIC8vIE5vbi1jb25zdGFudCB2YWx1ZXMgY2FuIGdvIGVpdGhlciB3YXkuCisgICAgICBTdWNjc1swXSA9IFN1Y2NzWzFdID0gdHJ1ZTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBDb25zdGFudCBjb25kaXRpb24gdmFyaWFibGVzIG1lYW4gdGhlIGJyYW5jaCBjYW4gb25seSBnbyBhIHNpbmdsZSB3YXkKKyAgICBTdWNjc1tDLT5pc051bGxWYWx1ZSgpXSA9IHRydWU7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKFRJLmlzRXhjZXB0aW9uYWwoKSkgeworICAgIFN1Y2NzLmFzc2lnbihTdWNjcy5zaXplKCksIHRydWUpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChpc2E8SW5kaXJlY3RCckluc3Q+KFRJKSkgeworICAgIFN1Y2NzLmFzc2lnbihTdWNjcy5zaXplKCksIHRydWUpOworICAgIHJldHVybjsKKyAgfQorCisgIFN3aXRjaEluc3QgJlNJID0gY2FzdDxTd2l0Y2hJbnN0PihUSSk7CisgIExhdHRpY2VWYWwgU0NWYWx1ZTsKKyAgaWYgKEFnZ3Jlc3NpdmVVbmRlZikKKyAgICBTQ1ZhbHVlID0gZ2V0VmFsdWVTdGF0ZShLZXlJbmZvOjpnZXRMYXR0aWNlS2V5RnJvbVZhbHVlKFNJLmdldENvbmRpdGlvbigpKSk7CisgIGVsc2UKKyAgICBTQ1ZhbHVlID0gZ2V0RXhpc3RpbmdWYWx1ZVN0YXRlKAorICAgICAgICBLZXlJbmZvOjpnZXRMYXR0aWNlS2V5RnJvbVZhbHVlKFNJLmdldENvbmRpdGlvbigpKSk7CisKKyAgaWYgKFNDVmFsdWUgPT0gTGF0dGljZUZ1bmMtPmdldE92ZXJkZWZpbmVkVmFsKCkgfHwKKyAgICAgIFNDVmFsdWUgPT0gTGF0dGljZUZ1bmMtPmdldFVudHJhY2tlZFZhbCgpKSB7CisgICAgLy8gQWxsIGRlc3RpbmF0aW9ucyBhcmUgZXhlY3V0YWJsZSEKKyAgICBTdWNjcy5hc3NpZ24oVEkuZ2V0TnVtU3VjY2Vzc29ycygpLCB0cnVlKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBJZiB1bmRlZmluZWQsIG5laXRoZXIgaXMgZmVhc2libGUgeWV0LgorICBpZiAoU0NWYWx1ZSA9PSBMYXR0aWNlRnVuYy0+Z2V0VW5kZWZWYWwoKSkKKyAgICByZXR1cm47CisKKyAgQ29uc3RhbnQgKkMgPSBkeW5fY2FzdF9vcl9udWxsPENvbnN0YW50PihMYXR0aWNlRnVuYy0+R2V0VmFsdWVGcm9tTGF0dGljZVZhbCgKKyAgICAgIFNDVmFsdWUsIFNJLmdldENvbmRpdGlvbigpLT5nZXRUeXBlKCkpKTsKKyAgaWYgKCFDIHx8ICFpc2E8Q29uc3RhbnRJbnQ+KEMpKSB7CisgICAgLy8gQWxsIGRlc3RpbmF0aW9ucyBhcmUgZXhlY3V0YWJsZSEKKyAgICBTdWNjcy5hc3NpZ24oVEkuZ2V0TnVtU3VjY2Vzc29ycygpLCB0cnVlKTsKKyAgICByZXR1cm47CisgIH0KKyAgU3dpdGNoSW5zdDo6Q2FzZUhhbmRsZSBDYXNlID0gKlNJLmZpbmRDYXNlVmFsdWUoY2FzdDxDb25zdGFudEludD4oQykpOworICBTdWNjc1tDYXNlLmdldFN1Y2Nlc3NvckluZGV4KCldID0gdHJ1ZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIExhdHRpY2VLZXksIGNsYXNzIExhdHRpY2VWYWwsIGNsYXNzIEtleUluZm8+Citib29sIFNwYXJzZVNvbHZlcjxMYXR0aWNlS2V5LCBMYXR0aWNlVmFsLCBLZXlJbmZvPjo6aXNFZGdlRmVhc2libGUoCisgICAgQmFzaWNCbG9jayAqRnJvbSwgQmFzaWNCbG9jayAqVG8sIGJvb2wgQWdncmVzc2l2ZVVuZGVmKSB7CisgIFNtYWxsVmVjdG9yPGJvb2wsIDE2PiBTdWNjRmVhc2libGU7CisgIFRlcm1pbmF0b3JJbnN0ICpUSSA9IEZyb20tPmdldFRlcm1pbmF0b3IoKTsKKyAgZ2V0RmVhc2libGVTdWNjZXNzb3JzKCpUSSwgU3VjY0ZlYXNpYmxlLCBBZ2dyZXNzaXZlVW5kZWYpOworCisgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBUSS0+Z2V0TnVtU3VjY2Vzc29ycygpOyBpICE9IGU7ICsraSkKKyAgICBpZiAoVEktPmdldFN1Y2Nlc3NvcihpKSA9PSBUbyAmJiBTdWNjRmVhc2libGVbaV0pCisgICAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBMYXR0aWNlS2V5LCBjbGFzcyBMYXR0aWNlVmFsLCBjbGFzcyBLZXlJbmZvPgordm9pZCBTcGFyc2VTb2x2ZXI8TGF0dGljZUtleSwgTGF0dGljZVZhbCwgS2V5SW5mbz46OnZpc2l0VGVybWluYXRvckluc3QoCisgICAgVGVybWluYXRvckluc3QgJlRJKSB7CisgIFNtYWxsVmVjdG9yPGJvb2wsIDE2PiBTdWNjRmVhc2libGU7CisgIGdldEZlYXNpYmxlU3VjY2Vzc29ycyhUSSwgU3VjY0ZlYXNpYmxlLCB0cnVlKTsKKworICBCYXNpY0Jsb2NrICpCQiA9IFRJLmdldFBhcmVudCgpOworCisgIC8vIE1hcmsgYWxsIGZlYXNpYmxlIHN1Y2Nlc3NvcnMgZXhlY3V0YWJsZS4uLgorICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gU3VjY0ZlYXNpYmxlLnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKFN1Y2NGZWFzaWJsZVtpXSkKKyAgICAgIG1hcmtFZGdlRXhlY3V0YWJsZShCQiwgVEkuZ2V0U3VjY2Vzc29yKGkpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIExhdHRpY2VLZXksIGNsYXNzIExhdHRpY2VWYWwsIGNsYXNzIEtleUluZm8+Cit2b2lkIFNwYXJzZVNvbHZlcjxMYXR0aWNlS2V5LCBMYXR0aWNlVmFsLCBLZXlJbmZvPjo6dmlzaXRQSElOb2RlKFBISU5vZGUgJlBOKSB7CisgIC8vIFRoZSBsYXR0aWNlIGZ1bmN0aW9uIG1heSBzdG9yZSBtb3JlIGluZm9ybWF0aW9uIG9uIGEgUEhJTm9kZSB0aGFuIGNvdWxkIGJlCisgIC8vIGNvbXB1dGVkIGZyb20gaXRzIGluY29taW5nIHZhbHVlcy4gIEZvciBleGFtcGxlLCBTU0kgZm9ybSBzdG9yZXMgaXRzIHNpZ21hCisgIC8vIGZ1bmN0aW9ucyBhcyBQSElOb2RlcyB3aXRoIGEgc2luZ2xlIGluY29taW5nIHZhbHVlLgorICBpZiAoTGF0dGljZUZ1bmMtPklzU3BlY2lhbENhc2VkUEhJKCZQTikpIHsKKyAgICBEZW5zZU1hcDxMYXR0aWNlS2V5LCBMYXR0aWNlVmFsPiBDaGFuZ2VkVmFsdWVzOworICAgIExhdHRpY2VGdW5jLT5Db21wdXRlSW5zdHJ1Y3Rpb25TdGF0ZShQTiwgQ2hhbmdlZFZhbHVlcywgKnRoaXMpOworICAgIGZvciAoYXV0byAmQ2hhbmdlZFZhbHVlIDogQ2hhbmdlZFZhbHVlcykKKyAgICAgIGlmIChDaGFuZ2VkVmFsdWUuc2Vjb25kICE9IExhdHRpY2VGdW5jLT5nZXRVbnRyYWNrZWRWYWwoKSkKKyAgICAgICAgVXBkYXRlU3RhdGUoQ2hhbmdlZFZhbHVlLmZpcnN0LCBDaGFuZ2VkVmFsdWUuc2Vjb25kKTsKKyAgICByZXR1cm47CisgIH0KKworICBMYXR0aWNlS2V5IEtleSA9IEtleUluZm86OmdldExhdHRpY2VLZXlGcm9tVmFsdWUoJlBOKTsKKyAgTGF0dGljZVZhbCBQTklWID0gZ2V0VmFsdWVTdGF0ZShLZXkpOworICBMYXR0aWNlVmFsIE92ZXJkZWZpbmVkID0gTGF0dGljZUZ1bmMtPmdldE92ZXJkZWZpbmVkVmFsKCk7CisKKyAgLy8gSWYgdGhpcyB2YWx1ZSBpcyBhbHJlYWR5IG92ZXJkZWZpbmVkIChjb21tb24pIGp1c3QgcmV0dXJuLgorICBpZiAoUE5JViA9PSBPdmVyZGVmaW5lZCB8fCBQTklWID09IExhdHRpY2VGdW5jLT5nZXRVbnRyYWNrZWRWYWwoKSkKKyAgICByZXR1cm47IC8vIFF1aWNrIGV4aXQKKworICAvLyBTdXBlci1leHRyYS1oaWdoLWRlZ3JlZSBQSEkgbm9kZXMgYXJlIHVubGlrZWx5IHRvIGV2ZXIgYmUgaW50ZXJlc3RpbmcsCisgIC8vIGFuZCBzbG93IHVzIGRvd24gYSBsb3QuICBKdXN0IG1hcmsgdGhlbSBvdmVyZGVmaW5lZC4KKyAgaWYgKFBOLmdldE51bUluY29taW5nVmFsdWVzKCkgPiA2NCkgeworICAgIFVwZGF0ZVN0YXRlKEtleSwgT3ZlcmRlZmluZWQpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIExvb2sgYXQgYWxsIG9mIHRoZSBleGVjdXRhYmxlIG9wZXJhbmRzIG9mIHRoZSBQSEkgbm9kZS4gIElmIGFueSBvZiB0aGVtCisgIC8vIGFyZSBvdmVyZGVmaW5lZCwgdGhlIFBISSBiZWNvbWVzIG92ZXJkZWZpbmVkIGFzIHdlbGwuICBPdGhlcndpc2UsIGFzayB0aGUKKyAgLy8gdHJhbnNmZXIgZnVuY3Rpb24gdG8gZ2l2ZSB1cyB0aGUgbWVyZ2Ugb2YgdGhlIGluY29taW5nIHZhbHVlcy4KKyAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFBOLmdldE51bUluY29taW5nVmFsdWVzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgLy8gSWYgdGhlIGVkZ2UgaXMgbm90IHlldCBrbm93biB0byBiZSBmZWFzaWJsZSwgaXQgZG9lc24ndCBpbXBhY3QgdGhlIFBISS4KKyAgICBpZiAoIWlzRWRnZUZlYXNpYmxlKFBOLmdldEluY29taW5nQmxvY2soaSksIFBOLmdldFBhcmVudCgpLCB0cnVlKSkKKyAgICAgIGNvbnRpbnVlOworCisgICAgLy8gTWVyZ2UgaW4gdGhpcyB2YWx1ZS4KKyAgICBMYXR0aWNlVmFsIE9wVmFsID0KKyAgICAgICAgZ2V0VmFsdWVTdGF0ZShLZXlJbmZvOjpnZXRMYXR0aWNlS2V5RnJvbVZhbHVlKFBOLmdldEluY29taW5nVmFsdWUoaSkpKTsKKyAgICBpZiAoT3BWYWwgIT0gUE5JVikKKyAgICAgIFBOSVYgPSBMYXR0aWNlRnVuYy0+TWVyZ2VWYWx1ZXMoUE5JViwgT3BWYWwpOworCisgICAgaWYgKFBOSVYgPT0gT3ZlcmRlZmluZWQpCisgICAgICBicmVhazsgLy8gUmVzdCBvZiBpbnB1dCB2YWx1ZXMgZG9uJ3QgbWF0dGVyLgorICB9CisKKyAgLy8gVXBkYXRlIHRoZSBQSEkgd2l0aCB0aGUgY29tcHV0ZSB2YWx1ZSwgd2hpY2ggaXMgdGhlIG1lcmdlIG9mIHRoZSBpbnB1dHMuCisgIFVwZGF0ZVN0YXRlKEtleSwgUE5JVik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBMYXR0aWNlS2V5LCBjbGFzcyBMYXR0aWNlVmFsLCBjbGFzcyBLZXlJbmZvPgordm9pZCBTcGFyc2VTb2x2ZXI8TGF0dGljZUtleSwgTGF0dGljZVZhbCwgS2V5SW5mbz46OnZpc2l0SW5zdChJbnN0cnVjdGlvbiAmSSkgeworICAvLyBQSElzIGFyZSBoYW5kbGVkIGJ5IHRoZSBwcm9wYWdhdGlvbiBsb2dpYywgdGhleSBhcmUgbmV2ZXIgcGFzc2VkIGludG8gdGhlCisgIC8vIHRyYW5zZmVyIGZ1bmN0aW9ucy4KKyAgaWYgKFBISU5vZGUgKlBOID0gZHluX2Nhc3Q8UEhJTm9kZT4oJkkpKQorICAgIHJldHVybiB2aXNpdFBISU5vZGUoKlBOKTsKKworICAvLyBPdGhlcndpc2UsIGFzayB0aGUgdHJhbnNmZXIgZnVuY3Rpb24gd2hhdCB0aGUgcmVzdWx0IGlzLiAgSWYgdGhpcyBpcworICAvLyBzb21ldGhpbmcgdGhhdCB3ZSBjYXJlIGFib3V0LCByZW1lbWJlciBpdC4KKyAgRGVuc2VNYXA8TGF0dGljZUtleSwgTGF0dGljZVZhbD4gQ2hhbmdlZFZhbHVlczsKKyAgTGF0dGljZUZ1bmMtPkNvbXB1dGVJbnN0cnVjdGlvblN0YXRlKEksIENoYW5nZWRWYWx1ZXMsICp0aGlzKTsKKyAgZm9yIChhdXRvICZDaGFuZ2VkVmFsdWUgOiBDaGFuZ2VkVmFsdWVzKQorICAgIGlmIChDaGFuZ2VkVmFsdWUuc2Vjb25kICE9IExhdHRpY2VGdW5jLT5nZXRVbnRyYWNrZWRWYWwoKSkKKyAgICAgIFVwZGF0ZVN0YXRlKENoYW5nZWRWYWx1ZS5maXJzdCwgQ2hhbmdlZFZhbHVlLnNlY29uZCk7CisKKyAgaWYgKFRlcm1pbmF0b3JJbnN0ICpUSSA9IGR5bl9jYXN0PFRlcm1pbmF0b3JJbnN0PigmSSkpCisgICAgdmlzaXRUZXJtaW5hdG9ySW5zdCgqVEkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgTGF0dGljZUtleSwgY2xhc3MgTGF0dGljZVZhbCwgY2xhc3MgS2V5SW5mbz4KK3ZvaWQgU3BhcnNlU29sdmVyPExhdHRpY2VLZXksIExhdHRpY2VWYWwsIEtleUluZm8+OjpTb2x2ZSgpIHsKKyAgLy8gUHJvY2VzcyB0aGUgd29yayBsaXN0cyB1bnRpbCB0aGV5IGFyZSBlbXB0eSEKKyAgd2hpbGUgKCFCQldvcmtMaXN0LmVtcHR5KCkgfHwgIVZhbHVlV29ya0xpc3QuZW1wdHkoKSkgeworICAgIC8vIFByb2Nlc3MgdGhlIHZhbHVlIHdvcmsgbGlzdC4KKyAgICB3aGlsZSAoIVZhbHVlV29ya0xpc3QuZW1wdHkoKSkgeworICAgICAgVmFsdWUgKlYgPSBWYWx1ZVdvcmtMaXN0LmJhY2soKTsKKyAgICAgIFZhbHVlV29ya0xpc3QucG9wX2JhY2soKTsKKworICAgICAgREVCVUcoZGJncygpIDw8ICJcblBvcHBlZCBvZmYgVi1XTDogIiA8PCAqViA8PCAiXG4iKTsKKworICAgICAgLy8gIlYiIGdvdCBpbnRvIHRoZSB3b3JrIGxpc3QgYmVjYXVzZSBpdCBtYWRlIGEgdHJhbnNpdGlvbi4gU2VlIGlmIGFueQorICAgICAgLy8gdXNlcnMgYXJlIGJvdGggbGl2ZSBhbmQgaW4gbmVlZCBvZiB1cGRhdGluZy4KKyAgICAgIGZvciAoVXNlciAqVSA6IFYtPnVzZXJzKCkpCisgICAgICAgIGlmIChJbnN0cnVjdGlvbiAqSW5zdCA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihVKSkKKyAgICAgICAgICBpZiAoQkJFeGVjdXRhYmxlLmNvdW50KEluc3QtPmdldFBhcmVudCgpKSkgLy8gSW5zdCBpcyBleGVjdXRhYmxlPworICAgICAgICAgICAgdmlzaXRJbnN0KCpJbnN0KTsKKyAgICB9CisKKyAgICAvLyBQcm9jZXNzIHRoZSBiYXNpYyBibG9jayB3b3JrIGxpc3QuCisgICAgd2hpbGUgKCFCQldvcmtMaXN0LmVtcHR5KCkpIHsKKyAgICAgIEJhc2ljQmxvY2sgKkJCID0gQkJXb3JrTGlzdC5iYWNrKCk7CisgICAgICBCQldvcmtMaXN0LnBvcF9iYWNrKCk7CisKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXG5Qb3BwZWQgb2ZmIEJCV0w6ICIgPDwgKkJCKTsKKworICAgICAgLy8gTm90aWZ5IGFsbCBpbnN0cnVjdGlvbnMgaW4gdGhpcyBiYXNpYyBibG9jayB0aGF0IHRoZXkgYXJlIG5ld2x5CisgICAgICAvLyBleGVjdXRhYmxlLgorICAgICAgZm9yIChJbnN0cnVjdGlvbiAmSSA6ICpCQikKKyAgICAgICAgdmlzaXRJbnN0KEkpOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgTGF0dGljZUtleSwgY2xhc3MgTGF0dGljZVZhbCwgY2xhc3MgS2V5SW5mbz4KK3ZvaWQgU3BhcnNlU29sdmVyPExhdHRpY2VLZXksIExhdHRpY2VWYWwsIEtleUluZm8+OjpQcmludCgKKyAgICByYXdfb3N0cmVhbSAmT1MpIGNvbnN0IHsKKyAgaWYgKFZhbHVlU3RhdGUuZW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgTGF0dGljZUtleSBLZXk7CisgIExhdHRpY2VWYWwgTFY7CisKKyAgT1MgPDwgIlZhbHVlU3RhdGU6XG4iOworICBmb3IgKGF1dG8gJkVudHJ5IDogVmFsdWVTdGF0ZSkgeworICAgIHN0ZDo6dGllKEtleSwgTFYpID0gRW50cnk7CisgICAgaWYgKExWID09IExhdHRpY2VGdW5jLT5nZXRVbnRyYWNrZWRWYWwoKSkKKyAgICAgIGNvbnRpbnVlOworICAgIE9TIDw8ICJcdCI7CisgICAgTGF0dGljZUZ1bmMtPlByaW50TGF0dGljZVZhbChMViwgT1MpOworICAgIE9TIDw8ICI6ICI7CisgICAgTGF0dGljZUZ1bmMtPlByaW50TGF0dGljZUtleShLZXksIE9TKTsKKyAgICBPUyA8PCAiXG4iOworICB9Cit9Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjdW5kZWYgREVCVUdfVFlQRQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19TUEFSU0VQUk9QQUdBVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1N5bnRoZXRpY0NvdW50c1V0aWxzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1N5bnRoZXRpY0NvdW50c1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmNGEwMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvU3ludGhldGljQ291bnRzVXRpbHMuaApAQCAtMCwwICsxLDUyIEBACisvLz09PS0gU3ludGhldGljQ291bnRzVXRpbHMuaCAtIHV0aWxpdGllcyBmb3IgY291bnQgcHJvcGFnYXRpb24tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHV0aWxpdGllcyBmb3Igc3ludGhldGljIGNvdW50cyBwcm9wYWdhdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfU1lOVEhFVElDX0NPVU5UU19VVElMU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfU1lOVEhFVElDX0NPVU5UU19VVElMU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0NhbGxHcmFwaC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TY2FsZWROdW1iZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBDYWxsR3JhcGg7CitjbGFzcyBGdW5jdGlvbjsKKworLy8vIENsYXNzIHdpdGggbWV0aG9kcyB0byBwcm9wYWdhdGUgc3ludGhldGljIGVudHJ5IGNvdW50cy4KKy8vLworLy8vIFRoaXMgY2xhc3MgaXMgdGVtcGxhdGVkIG9uIHRoZSB0eXBlIG9mIHRoZSBjYWxsIGdyYXBoIGFuZCBkZXNpZ25lZCB0byB3b3JrCisvLy8gd2l0aCB0aGUgdHJhZGl0aW9uYWwgcGVyLW1vZHVsZSBjYWxsZ3JhcGggYW5kIHRoZSBzdW1tYXJ5IGNhbGxncmFwaHMgdXNlZCBpbgorLy8vIFRoaW5MVE8uIFRoaXMgY29udGFpbnMgb25seSBzdGF0aWMgbWV0aG9kcyBhbmQgYWxpYXMgdGVtcGxhdGVzLgordGVtcGxhdGUgPHR5cGVuYW1lIENhbGxHcmFwaFR5cGU+IGNsYXNzIFN5bnRoZXRpY0NvdW50c1V0aWxzIHsKK3B1YmxpYzoKKyAgdXNpbmcgU2NhbGVkNjQgPSBTY2FsZWROdW1iZXI8dWludDY0X3Q+OworICB1c2luZyBDR1QgPSBHcmFwaFRyYWl0czxDYWxsR3JhcGhUeXBlPjsKKyAgdXNpbmcgTm9kZVJlZiA9IHR5cGVuYW1lIENHVDo6Tm9kZVJlZjsKKyAgdXNpbmcgRWRnZVJlZiA9IHR5cGVuYW1lIENHVDo6RWRnZVJlZjsKKyAgdXNpbmcgU2NjVHkgPSBzdGQ6OnZlY3RvcjxOb2RlUmVmPjsKKworICB1c2luZyBHZXRSZWxCQkZyZXFUeSA9IGZ1bmN0aW9uX3JlZjxPcHRpb25hbDxTY2FsZWQ2ND4oRWRnZVJlZik+OworICB1c2luZyBHZXRDb3VudFR5ID0gZnVuY3Rpb25fcmVmPHVpbnQ2NF90KE5vZGVSZWYpPjsKKyAgdXNpbmcgQWRkQ291bnRUeSA9IGZ1bmN0aW9uX3JlZjx2b2lkKE5vZGVSZWYsIHVpbnQ2NF90KT47CisKKyAgc3RhdGljIHZvaWQgcHJvcGFnYXRlKGNvbnN0IENhbGxHcmFwaFR5cGUgJkNHLCBHZXRSZWxCQkZyZXFUeSBHZXRSZWxCQkZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRDb3VudFR5IEdldENvdW50LCBBZGRDb3VudFR5IEFkZENvdW50KTsKKworcHJpdmF0ZToKKyAgc3RhdGljIHZvaWQgcHJvcGFnYXRlRnJvbVNDQyhjb25zdCBTY2NUeSAmU0NDLCBHZXRSZWxCQkZyZXFUeSBHZXRSZWxCQkZyZXEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0Q291bnRUeSBHZXRDb3VudCwgQWRkQ291bnRUeSBBZGRDb3VudCk7Cit9OworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVGFyZ2V0Rm9sZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1RhcmdldEZvbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNzVkMzcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1RhcmdldEZvbGRlci5oCkBAIC0wLDAgKzEsMjY5IEBACisvLz09PT0tIFRhcmdldEZvbGRlci5oIC0gQ29uc3RhbnQgZm9sZGluZyBoZWxwZXIgLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBUYXJnZXRGb2xkZXIgY2xhc3MsIGEgaGVscGVyIGZvciBJUkJ1aWxkZXIuCisvLyBJdCBwcm92aWRlcyBJUkJ1aWxkZXIgd2l0aCBhIHNldCBvZiBtZXRob2RzIGZvciBjcmVhdGluZyBjb25zdGFudHMgd2l0aAorLy8gdGFyZ2V0IGRlcGVuZGVudCBmb2xkaW5nLCBpbiBhZGRpdGlvbiB0byB0aGUgc2FtZSB0YXJnZXQtaW5kZXBlbmRlbnQKKy8vIGZvbGRpbmcgdGhhdCB0aGUgQ29uc3RhbnRGb2xkZXIgY2xhc3MgcHJvdmlkZXMuICBGb3IgZ2VuZXJhbCBjb25zdGFudAorLy8gY3JlYXRpb24gYW5kIGZvbGRpbmcsIHVzZSBDb25zdGFudEV4cHIgYW5kIHRoZSByb3V0aW5lcyBpbgorLy8gbGx2bS9BbmFseXNpcy9Db25zdGFudEZvbGRpbmcuaC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfVEFSR0VURk9MREVSX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19UQVJHRVRGT0xERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0NvbnN0YW50Rm9sZGluZy5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0clR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRGF0YUxheW91dDsKKworLy8vIFRhcmdldEZvbGRlciAtIENyZWF0ZSBjb25zdGFudHMgd2l0aCB0YXJnZXQgZGVwZW5kZW50IGZvbGRpbmcuCitjbGFzcyBUYXJnZXRGb2xkZXIgeworICBjb25zdCBEYXRhTGF5b3V0ICZETDsKKworICAvLy8gRm9sZCAtIEZvbGQgdGhlIGNvbnN0YW50IHVzaW5nIHRhcmdldCBzcGVjaWZpYyBpbmZvcm1hdGlvbi4KKyAgQ29uc3RhbnQgKkZvbGQoQ29uc3RhbnQgKkMpIGNvbnN0IHsKKyAgICBpZiAoQ29uc3RhbnQgKkNGID0gQ29uc3RhbnRGb2xkQ29uc3RhbnQoQywgREwpKQorICAgICAgcmV0dXJuIENGOworICAgIHJldHVybiBDOworICB9CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgVGFyZ2V0Rm9sZGVyKGNvbnN0IERhdGFMYXlvdXQgJkRMKSA6IERMKERMKSB7fQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBCaW5hcnkgT3BlcmF0b3JzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIENvbnN0YW50ICpDcmVhdGVBZGQoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVyA9IGZhbHNlLCBib29sIEhhc05TVyA9IGZhbHNlKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRBZGQoTEhTLCBSSFMsIEhhc05VVywgSGFzTlNXKSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUZBZGQoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0RkFkZChMSFMsIFJIUykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVTdWIoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVyA9IGZhbHNlLCBib29sIEhhc05TVyA9IGZhbHNlKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRTdWIoTEhTLCBSSFMsIEhhc05VVywgSGFzTlNXKSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUZTdWIoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0RlN1YihMSFMsIFJIUykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVNdWwoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVyA9IGZhbHNlLCBib29sIEhhc05TVyA9IGZhbHNlKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRNdWwoTEhTLCBSSFMsIEhhc05VVywgSGFzTlNXKSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUZNdWwoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0Rk11bChMSFMsIFJIUykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVVRGl2KENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMsIGJvb2wgaXNFeGFjdCA9IGZhbHNlKWNvbnN0eworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0VURpdihMSFMsIFJIUywgaXNFeGFjdCkpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVTRGl2KENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMsIGJvb2wgaXNFeGFjdCA9IGZhbHNlKWNvbnN0eworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0U0RpdihMSFMsIFJIUywgaXNFeGFjdCkpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVGRGl2KENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEZEaXYoTEhTLCBSSFMpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlVVJlbShDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRVUmVtKExIUywgUkhTKSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZVNSZW0oQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0U1JlbShMSFMsIFJIUykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVGUmVtKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEZSZW0oTEhTLCBSSFMpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlU2hsKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNOVVcgPSBmYWxzZSwgYm9vbCBIYXNOU1cgPSBmYWxzZSkgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0U2hsKExIUywgUkhTLCBIYXNOVVcsIEhhc05TVykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVMU2hyKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMsIGJvb2wgaXNFeGFjdCA9IGZhbHNlKWNvbnN0eworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0TFNocihMSFMsIFJIUywgaXNFeGFjdCkpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVBU2hyKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMsIGJvb2wgaXNFeGFjdCA9IGZhbHNlKWNvbnN0eworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0QVNocihMSFMsIFJIUywgaXNFeGFjdCkpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVBbmQoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0QW5kKExIUywgUkhTKSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZU9yKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldE9yKExIUywgUkhTKSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZVhvcihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRYb3IoTEhTLCBSSFMpKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVCaW5PcChJbnN0cnVjdGlvbjo6QmluYXJ5T3BzIE9wYywKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldChPcGMsIExIUywgUkhTKSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gVW5hcnkgT3BlcmF0b3JzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIENvbnN0YW50ICpDcmVhdGVOZWcoQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNOVVcgPSBmYWxzZSwgYm9vbCBIYXNOU1cgPSBmYWxzZSkgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0TmVnKEMsIEhhc05VVywgSGFzTlNXKSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUZOZWcoQ29uc3RhbnQgKkMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEZOZWcoQykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVOb3QoQ29uc3RhbnQgKkMpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldE5vdChDKSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTWVtb3J5IEluc3RydWN0aW9ucworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBDb25zdGFudCAqQ3JlYXRlR2V0RWxlbWVudFB0cihUeXBlICpUeSwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENvbnN0YW50ICo+IElkeExpc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEdldEVsZW1lbnRQdHIoVHksIEMsIElkeExpc3QpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlR2V0RWxlbWVudFB0cihUeXBlICpUeSwgQ29uc3RhbnQgKkMsIENvbnN0YW50ICpJZHgpIGNvbnN0IHsKKyAgICAvLyBUaGlzIGZvcm0gb2YgdGhlIGZ1bmN0aW9uIG9ubHkgZXhpc3RzIHRvIGF2b2lkIGFtYmlndW91cyBvdmVybG9hZAorICAgIC8vIHdhcm5pbmdzIGFib3V0IHdoZXRoZXIgdG8gY29udmVydCBJZHggdG8gQXJyYXlSZWY8Q29uc3RhbnQgKj4gb3IKKyAgICAvLyBBcnJheVJlZjxWYWx1ZSAqPi4KKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEdldEVsZW1lbnRQdHIoVHksIEMsIElkeCkpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVHZXRFbGVtZW50UHRyKFR5cGUgKlR5LCBDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gSWR4TGlzdCkgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0R2V0RWxlbWVudFB0cihUeSwgQywgSWR4TGlzdCkpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUluQm91bmRzR2V0RWxlbWVudFB0cihUeXBlICpUeSwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q29uc3RhbnQgKj4gSWR4TGlzdCkgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0SW5Cb3VuZHNHZXRFbGVtZW50UHRyKFR5LCBDLCBJZHhMaXN0KSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZUluQm91bmRzR2V0RWxlbWVudFB0cihUeXBlICpUeSwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKklkeCkgY29uc3QgeworICAgIC8vIFRoaXMgZm9ybSBvZiB0aGUgZnVuY3Rpb24gb25seSBleGlzdHMgdG8gYXZvaWQgYW1iaWd1b3VzIG92ZXJsb2FkCisgICAgLy8gd2FybmluZ3MgYWJvdXQgd2hldGhlciB0byBjb252ZXJ0IElkeCB0byBBcnJheVJlZjxDb25zdGFudCAqPiBvcgorICAgIC8vIEFycmF5UmVmPFZhbHVlICo+LgorICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0SW5Cb3VuZHNHZXRFbGVtZW50UHRyKFR5LCBDLCBJZHgpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlSW5Cb3VuZHNHZXRFbGVtZW50UHRyKFR5cGUgKlR5LCBDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBJZHhMaXN0KSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRJbkJvdW5kc0dldEVsZW1lbnRQdHIoVHksIEMsIElkeExpc3QpKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDYXN0L0NvbnZlcnNpb24gT3BlcmF0b3JzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIENvbnN0YW50ICpDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpDYXN0T3BzIE9wLCBDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgaWYgKEMtPmdldFR5cGUoKSA9PSBEZXN0VHkpCisgICAgICByZXR1cm4gQzsgLy8gYXZvaWQgY2FsbGluZyBGb2xkCisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRDYXN0KE9wLCBDLCBEZXN0VHkpKTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlSW50Q2FzdChDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU2lnbmVkKSBjb25zdCB7CisgICAgaWYgKEMtPmdldFR5cGUoKSA9PSBEZXN0VHkpCisgICAgICByZXR1cm4gQzsgLy8gYXZvaWQgY2FsbGluZyBGb2xkCisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRJbnRlZ2VyQ2FzdChDLCBEZXN0VHksIGlzU2lnbmVkKSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZVBvaW50ZXJDYXN0KENvbnN0YW50ICpDLCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICBpZiAoQy0+Z2V0VHlwZSgpID09IERlc3RUeSkKKyAgICAgIHJldHVybiBDOyAvLyBhdm9pZCBjYWxsaW5nIEZvbGQKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldFBvaW50ZXJDYXN0KEMsIERlc3RUeSkpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVGUENhc3QoQ29uc3RhbnQgKkMsIFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIGlmIChDLT5nZXRUeXBlKCkgPT0gRGVzdFR5KQorICAgICAgcmV0dXJuIEM7IC8vIGF2b2lkIGNhbGxpbmcgRm9sZAorICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0RlBDYXN0KEMsIERlc3RUeSkpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVCaXRDYXN0KENvbnN0YW50ICpDLCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6Qml0Q2FzdCwgQywgRGVzdFR5KTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlSW50VG9QdHIoQ29uc3RhbnQgKkMsIFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpJbnRUb1B0ciwgQywgRGVzdFR5KTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlUHRyVG9JbnQoQ29uc3RhbnQgKkMsIFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpQdHJUb0ludCwgQywgRGVzdFR5KTsKKyAgfQorICBDb25zdGFudCAqQ3JlYXRlWkV4dE9yQml0Q2FzdChDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgaWYgKEMtPmdldFR5cGUoKSA9PSBEZXN0VHkpCisgICAgICByZXR1cm4gQzsgLy8gYXZvaWQgY2FsbGluZyBGb2xkCisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRaRXh0T3JCaXRDYXN0KEMsIERlc3RUeSkpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVTRXh0T3JCaXRDYXN0KENvbnN0YW50ICpDLCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICBpZiAoQy0+Z2V0VHlwZSgpID09IERlc3RUeSkKKyAgICAgIHJldHVybiBDOyAvLyBhdm9pZCBjYWxsaW5nIEZvbGQKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldFNFeHRPckJpdENhc3QoQywgRGVzdFR5KSk7CisgIH0KKyAgQ29uc3RhbnQgKkNyZWF0ZVRydW5jT3JCaXRDYXN0KENvbnN0YW50ICpDLCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICBpZiAoQy0+Z2V0VHlwZSgpID09IERlc3RUeSkKKyAgICAgIHJldHVybiBDOyAvLyBhdm9pZCBjYWxsaW5nIEZvbGQKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldFRydW5jT3JCaXRDYXN0KEMsIERlc3RUeSkpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZVBvaW50ZXJCaXRDYXN0T3JBZGRyU3BhY2VDYXN0KENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgaWYgKEMtPmdldFR5cGUoKSA9PSBEZXN0VHkpCisgICAgICByZXR1cm4gQzsgLy8gYXZvaWQgY2FsbGluZyBGb2xkCisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRQb2ludGVyQml0Q2FzdE9yQWRkclNwYWNlQ2FzdChDLCBEZXN0VHkpKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDb21wYXJlIEluc3RydWN0aW9ucworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBDb25zdGFudCAqQ3JlYXRlSUNtcChDbXBJbnN0OjpQcmVkaWNhdGUgUCwgQ29uc3RhbnQgKkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0Q29tcGFyZShQLCBMSFMsIFJIUykpOworICB9CisgIENvbnN0YW50ICpDcmVhdGVGQ21wKENtcEluc3Q6OlByZWRpY2F0ZSBQLCBDb25zdGFudCAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRDb21wYXJlKFAsIExIUywgUkhTKSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gT3RoZXIgSW5zdHJ1Y3Rpb25zCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIENvbnN0YW50ICpDcmVhdGVTZWxlY3QoQ29uc3RhbnQgKkMsIENvbnN0YW50ICpUcnVlLCBDb25zdGFudCAqRmFsc2UpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldFNlbGVjdChDLCBUcnVlLCBGYWxzZSkpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUV4dHJhY3RFbGVtZW50KENvbnN0YW50ICpWZWMsIENvbnN0YW50ICpJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9sZChDb25zdGFudEV4cHI6OmdldEV4dHJhY3RFbGVtZW50KFZlYywgSWR4KSk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlSW5zZXJ0RWxlbWVudChDb25zdGFudCAqVmVjLCBDb25zdGFudCAqTmV3RWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIEZvbGQoQ29uc3RhbnRFeHByOjpnZXRJbnNlcnRFbGVtZW50KFZlYywgTmV3RWx0LCBJZHgpKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVTaHVmZmxlVmVjdG9yKENvbnN0YW50ICpWMSwgQ29uc3RhbnQgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqTWFzaykgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0U2h1ZmZsZVZlY3RvcihWMSwgVjIsIE1hc2spKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVFeHRyYWN0VmFsdWUoQ29uc3RhbnQgKkFnZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gSWR4TGlzdCkgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0RXh0cmFjdFZhbHVlKEFnZywgSWR4TGlzdCkpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUluc2VydFZhbHVlKENvbnN0YW50ICpBZ2csIENvbnN0YW50ICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gSWR4TGlzdCkgY29uc3QgeworICAgIHJldHVybiBGb2xkKENvbnN0YW50RXhwcjo6Z2V0SW5zZXJ0VmFsdWUoQWdnLCBWYWwsIElkeExpc3QpKTsKKyAgfQorfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVGFyZ2V0TGlicmFyeUluZm8uZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9UYXJnZXRMaWJyYXJ5SW5mby5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ2MWVkOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVGFyZ2V0TGlicmFyeUluZm8uZGVmCkBAIC0wLDAgKzEsMTI2NCBAQAorLy89PT0tLSBUYXJnZXRMaWJyYXJ5SW5mby5kZWYgLSBMaWJyYXJ5IGluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gVGhpcyAuZGVmIGZpbGUgd2lsbCBlaXRoZXIgZmlsbCBpbiB0aGUgZW51bSBkZWZpbml0aW9uIG9yIGZpbGwgaW4gdGhlCisvLyBzdHJpbmcgcmVwcmVzZW50YXRpb24gYXJyYXkgZGVmaW5pdGlvbiBmb3IgVGFyZ2V0TGlicmFyeUluZm8uCisvLyBXaGljaCBpcyBkZWZpbmVkIGRlcGVuZHMgb24gd2hldGhlciBUTElfREVGSU5FX0VOVU0gaXMgZGVmaW5lZCBvcgorLy8gVExJX0RFRklORV9TVFJJTkcgaXMgZGVmaW5lZC4gT25seSBvbmUgc2hvdWxkIGJlIGRlZmluZWQgYXQgYSB0aW1lLgorCisjaWYgIShkZWZpbmVkKFRMSV9ERUZJTkVfRU5VTSkgfHwgZGVmaW5lZChUTElfREVGSU5FX1NUUklORykpCisjZXJyb3IgIk11c3QgZGVmaW5lIFRMSV9ERUZJTkVfRU5VTSBvciBUTElfREVGSU5FX1NUUklORyBmb3IgVExJIC5kZWYuIgorI2VsaWYgZGVmaW5lZChUTElfREVGSU5FX0VOVU0pICYmIGRlZmluZWQoVExJX0RFRklORV9TVFJJTkcpCisjZXJyb3IgIkNhbiBvbmx5IGRlZmluZSBvbmUgb2YgVExJX0RFRklORV9FTlVNIG9yIFRMSV9ERUZJTkVfU1RSSU5HIGF0IGEgdGltZS4iCisjZWxzZQorLy8gT25lIG9mIFRMSV9ERUZJTkVfRU5VTS9TVFJJTkcgYXJlIGRlZmluZWQuCisKKyNpZiBkZWZpbmVkKFRMSV9ERUZJTkVfRU5VTSkKKyNkZWZpbmUgVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGVudW1fdmFyaWFudCkgTGliRnVuY18jI2VudW1fdmFyaWFudCwKKyNkZWZpbmUgVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoc3RyaW5nX3JlcHIpCisjZWxzZQorI2RlZmluZSBUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZW51bV92YXJpYW50KQorI2RlZmluZSBUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTChzdHJpbmdfcmVwcikgc3RyaW5nX3JlcHIsCisjZW5kaWYKKworLy8vIHZvaWQgKm5ldyh1bnNpZ25lZCBpbnQpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1zdmNfbmV3X2ludCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCI/PzJAWUFQQVhJQFoiKQorCisvLy8gdm9pZCAqbmV3KHVuc2lnbmVkIGludCwgbm90aHJvdyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobXN2Y19uZXdfaW50X25vdGhyb3cpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiPz8yQFlBUEFYSUFCVW5vdGhyb3dfdEBzdGRAQEBaIikKKworLy8vIHZvaWQgKm5ldyh1bnNpZ25lZCBsb25nIGxvbmcpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1zdmNfbmV3X2xvbmdsb25nKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIj8/MkBZQVBFQVhfS0BaIikKKworLy8vIHZvaWQgKm5ldyh1bnNpZ25lZCBsb25nIGxvbmcsIG5vdGhyb3cpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1zdmNfbmV3X2xvbmdsb25nX25vdGhyb3cpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiPz8yQFlBUEVBWF9LQUVCVW5vdGhyb3dfdEBzdGRAQEBaIikKKworLy8vIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtc3ZjX2RlbGV0ZV9wdHIzMikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCI/PzNAWUFYUEFYQFoiKQorCisvLy8gdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCosIG5vdGhyb3cpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1zdmNfZGVsZXRlX3B0cjMyX25vdGhyb3cpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiPz8zQFlBWFBBWEFCVW5vdGhyb3dfdEBzdGRAQEBaIikKKworLy8vIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqLCB1bnNpZ25lZCBpbnQpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1zdmNfZGVsZXRlX3B0cjMyX2ludCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCI/PzNAWUFYUEFYSUBaIikKKworLy8vIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtc3ZjX2RlbGV0ZV9wdHI2NCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCI/PzNAWUFYUEVBWEBaIikKKworLy8vIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqLCBub3Rocm93KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtc3ZjX2RlbGV0ZV9wdHI2NF9ub3Rocm93KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIj8/M0BZQVhQRUFYQUVCVW5vdGhyb3dfdEBzdGRAQEBaIikKKworLy8vIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqLCB1bnNpZ25lZCBsb25nIGxvbmcpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1zdmNfZGVsZXRlX3B0cjY0X2xvbmdsb25nKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIj8/M0BZQVhQRUFYX0tAWiIpCisKKy8vLyB2b2lkICpuZXdbXSh1bnNpZ25lZCBpbnQpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1zdmNfbmV3X2FycmF5X2ludCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCI/P19VQFlBUEFYSUBaIikKKworLy8vIHZvaWQgKm5ld1tdKHVuc2lnbmVkIGludCwgbm90aHJvdyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobXN2Y19uZXdfYXJyYXlfaW50X25vdGhyb3cpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiPz9fVUBZQVBBWElBQlVub3Rocm93X3RAc3RkQEBAWiIpCisKKy8vLyB2b2lkICpuZXdbXSh1bnNpZ25lZCBsb25nIGxvbmcpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1zdmNfbmV3X2FycmF5X2xvbmdsb25nKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIj8/X1VAWUFQRUFYX0tAWiIpCisKKy8vLyB2b2lkICpuZXdbXSh1bnNpZ25lZCBsb25nIGxvbmcsIG5vdGhyb3cpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1zdmNfbmV3X2FycmF5X2xvbmdsb25nX25vdGhyb3cpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiPz9fVUBZQVBFQVhfS0FFQlVub3Rocm93X3RAc3RkQEBAWiIpCisKKy8vLyB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtc3ZjX2RlbGV0ZV9hcnJheV9wdHIzMikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCI/P19WQFlBWFBBWEBaIikKKworLy8vIHZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCosIG5vdGhyb3cpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1zdmNfZGVsZXRlX2FycmF5X3B0cjMyX25vdGhyb3cpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiPz9fVkBZQVhQQVhBQlVub3Rocm93X3RAc3RkQEBAWiIpCisKKy8vLyB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqLCB1bnNpZ25lZCBpbnQpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1zdmNfZGVsZXRlX2FycmF5X3B0cjMyX2ludCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCI/P19WQFlBWFBBWElAWiIpCisKKy8vLyB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtc3ZjX2RlbGV0ZV9hcnJheV9wdHI2NCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCI/P19WQFlBWFBFQVhAWiIpCisKKy8vLyB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqLCBub3Rocm93KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtc3ZjX2RlbGV0ZV9hcnJheV9wdHI2NF9ub3Rocm93KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIj8/X1ZAWUFYUEVBWEFFQlVub3Rocm93X3RAc3RkQEBAWiIpCisKKy8vLyB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqLCB1bnNpZ25lZCBsb25nIGxvbmcpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1zdmNfZGVsZXRlX2FycmF5X3B0cjY0X2xvbmdsb25nKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIj8/X1ZAWUFYUEVBWF9LQFoiKQorCisvLy8gaW50IF9JT19nZXRjKF9JT19GSUxFICogX19mcCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodW5kZXJfSU9fZ2V0YykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfSU9fZ2V0YyIpCisvLy8gaW50IF9JT19wdXRjKGludCBfX2MsIF9JT19GSUxFICogX19mcCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodW5kZXJfSU9fcHV0YykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfSU9fcHV0YyIpCisvLy8gdm9pZCBvcGVyYXRvciBkZWxldGVbXSh2b2lkKik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoWmRhUHYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX1pkYVB2IikKKy8vLyB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqLCBub3Rocm93KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChaZGFQdlJLU3Q5bm90aHJvd190KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9aZGFQdlJLU3Q5bm90aHJvd190IikKKy8vLyB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqLCB1bnNpZ25lZCBpbnQpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKFpkYVB2aikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfWmRhUHZqIikKKy8vLyB2b2lkIG9wZXJhdG9yIGRlbGV0ZVtdKHZvaWQqLCB1bnNpZ25lZCBsb25nKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChaZGFQdm0pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX1pkYVB2bSIpCisvLy8gdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCopOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKFpkbFB2KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9aZGxQdiIpCisvLy8gdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCosIG5vdGhyb3cpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKFpkbFB2UktTdDlub3Rocm93X3QpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX1pkbFB2UktTdDlub3Rocm93X3QiKQorLy8vIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqLCB1bnNpZ25lZCBpbnQpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKFpkbFB2aikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfWmRsUHZqIikKKy8vLyB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiwgdW5zaWduZWQgbG9uZyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoWmRsUHZtKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9aZGxQdm0iKQorLy8vIHZvaWQgKm5ld1tdKHVuc2lnbmVkIGludCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoWm5haikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfWm5haiIpCisvLy8gdm9pZCAqbmV3W10odW5zaWduZWQgaW50LCBub3Rocm93KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChabmFqUktTdDlub3Rocm93X3QpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX1puYWpSS1N0OW5vdGhyb3dfdCIpCisvLy8gdm9pZCAqbmV3W10odW5zaWduZWQgbG9uZyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoWm5hbSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfWm5hbSIpCisvLy8gdm9pZCAqbmV3W10odW5zaWduZWQgbG9uZywgbm90aHJvdyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoWm5hbVJLU3Q5bm90aHJvd190KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9abmFtUktTdDlub3Rocm93X3QiKQorLy8vIHZvaWQgKm5ldyh1bnNpZ25lZCBpbnQpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKFpud2opCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX1pud2oiKQorLy8vIHZvaWQgKm5ldyh1bnNpZ25lZCBpbnQsIG5vdGhyb3cpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKFpud2pSS1N0OW5vdGhyb3dfdCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfWm53alJLU3Q5bm90aHJvd190IikKKy8vLyB2b2lkICpuZXcodW5zaWduZWQgbG9uZyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoWm53bSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfWm53bSIpCisvLy8gdm9pZCAqbmV3KHVuc2lnbmVkIGxvbmcsIG5vdGhyb3cpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKFpud21SS1N0OW5vdGhyb3dfdCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfWm53bVJLU3Q5bm90aHJvd190IikKKy8vLyBkb3VibGUgX19hY29zX2Zpbml0ZShkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYWNvc19maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19hY29zX2Zpbml0ZSIpCisvLy8gZmxvYXQgX19hY29zZl9maW5pdGUoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYWNvc2ZfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fYWNvc2ZfZmluaXRlIikKKy8vLyBkb3VibGUgX19hY29zaF9maW5pdGUoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGFjb3NoX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2Fjb3NoX2Zpbml0ZSIpCisvLy8gZmxvYXQgX19hY29zaGZfZmluaXRlKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGFjb3NoZl9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19hY29zaGZfZmluaXRlIikKKy8vLyBsb25nIGRvdWJsZSBfX2Fjb3NobF9maW5pdGUobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYWNvc2hsX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2Fjb3NobF9maW5pdGUiKQorLy8vIGxvbmcgZG91YmxlIF9fYWNvc2xfZmluaXRlKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGFjb3NsX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2Fjb3NsX2Zpbml0ZSIpCisvLy8gZG91YmxlIF9fYXNpbl9maW5pdGUoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGFzaW5fZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fYXNpbl9maW5pdGUiKQorLy8vIGZsb2F0IF9fYXNpbmZfZmluaXRlKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGFzaW5mX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2FzaW5mX2Zpbml0ZSIpCisvLy8gbG9uZyBkb3VibGUgX19hc2lubF9maW5pdGUobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYXNpbmxfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fYXNpbmxfZmluaXRlIikKKy8vLyBkb3VibGUgYXRhbjJfZmluaXRlKGRvdWJsZSB5LCBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYXRhbjJfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fYXRhbjJfZmluaXRlIikKKy8vLyBmbG9hdCBhdGFuMmZfZmluaXRlKGZsb2F0IHksIGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGF0YW4yZl9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19hdGFuMmZfZmluaXRlIikKKy8vLyBsb25nIGRvdWJsZSBhdGFuMmxfZmluaXRlKGxvbmcgZG91YmxlIHksIGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGF0YW4ybF9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19hdGFuMmxfZmluaXRlIikKKy8vLyBkb3VibGUgX19hdGFuaF9maW5pdGUoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGF0YW5oX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2F0YW5oX2Zpbml0ZSIpCisvLy8gZmxvYXQgX19hdGFuaGZfZmluaXRlKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGF0YW5oZl9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19hdGFuaGZfZmluaXRlIikKKy8vLyBsb25nIGRvdWJsZSBfX2F0YW5obF9maW5pdGUobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYXRhbmhsX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2F0YW5obF9maW5pdGUiKQorLy8vIGRvdWJsZSBfX2Nvc2hfZmluaXRlKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjb3NoX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2Nvc2hfZmluaXRlIikKKy8vLyBmbG9hdCBfX2Nvc2hmX2Zpbml0ZShmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjb3NoZl9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19jb3NoZl9maW5pdGUiKQorLy8vIGxvbmcgZG91YmxlIF9fY29zaGxfZmluaXRlKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGNvc2hsX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2Nvc2hsX2Zpbml0ZSIpCisvLy8gZG91YmxlIF9fY29zcGkoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGNvc3BpKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fY29zcGkiKQorLy8vIGZsb2F0IF9fY29zcGlmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGNvc3BpZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2Nvc3BpZiIpCisvLy8gaW50IF9fY3hhX2F0ZXhpdCh2b2lkICgqZikodm9pZCAqKSwgdm9pZCAqcCwgdm9pZCAqZCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoY3hhX2F0ZXhpdCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2N4YV9hdGV4aXQiKQorLy8vIHZvaWQgX19jeGFfZ3VhcmRfYWJvcnQoZ3VhcmRfdCAqZ3VhcmQpOworLy8vIGd1YXJkX3QgaXMgaW50NjRfdCBpbiBJdGFuaXVtIEFCSSBvciBpbnQzMl90IG9uIEFSTSBlYWJpLgorVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGN4YV9ndWFyZF9hYm9ydCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX2N4YV9ndWFyZF9hYm9ydCIpCisvLy8gaW50IF9fY3hhX2d1YXJkX2FjcXVpcmUoZ3VhcmRfdCAqZ3VhcmQpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGN4YV9ndWFyZF9hY3F1aXJlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fY3hhX2d1YXJkX2FjcXVpcmUiKQorLy8vIHZvaWQgX19jeGFfZ3VhcmRfcmVsZWFzZShndWFyZF90ICpndWFyZCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoY3hhX2d1YXJkX3JlbGVhc2UpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19jeGFfZ3VhcmRfcmVsZWFzZSIpCisvLy8gZG91YmxlIF9fZXhwMTBfZmluaXRlKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChleHAxMF9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19leHAxMF9maW5pdGUiKQorLy8vIGZsb2F0IF9fZXhwMTBmX2Zpbml0ZShmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChleHAxMGZfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fZXhwMTBmX2Zpbml0ZSIpCisvLy8gbG9uZyBkb3VibGUgX19leHAxMGxfZmluaXRlKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGV4cDEwbF9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19leHAxMGxfZmluaXRlIikKKy8vLyBkb3VibGUgX19leHAyX2Zpbml0ZShkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZXhwMl9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19leHAyX2Zpbml0ZSIpCisvLy8gZmxvYXQgX19leHAyZl9maW5pdGUoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZXhwMmZfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fZXhwMmZfZmluaXRlIikKKy8vLyBsb25nIGRvdWJsZSBfX2V4cDJsX2Zpbml0ZShsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChleHAybF9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19leHAybF9maW5pdGUiKQorLy8vIGRvdWJsZSBfX2V4cF9maW5pdGUoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGV4cF9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19leHBfZmluaXRlIikKKy8vLyBmbG9hdCBfX2V4cGZfZmluaXRlKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGV4cGZfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fZXhwZl9maW5pdGUiKQorLy8vIGxvbmcgZG91YmxlIF9fZXhwbF9maW5pdGUobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZXhwbF9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19leHBsX2Zpbml0ZSIpCisvLy8gaW50IF9faXNvYzk5X3NjYW5mIChjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChkdW5kZXJfaXNvYzk5X3NjYW5mKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9faXNvYzk5X3NjYW5mIikKKy8vLyBpbnQgX19pc29jOTlfc3NjYW5mKGNvbnN0IGNoYXIgKnMsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQorVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGR1bmRlcl9pc29jOTlfc3NjYW5mKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9faXNvYzk5X3NzY2FuZiIpCisvLy8gZG91YmxlIF9fbG9nMTBfZmluaXRlKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsb2cxMF9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19sb2cxMF9maW5pdGUiKQorLy8vIGZsb2F0IF9fbG9nMTBmX2Zpbml0ZShmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsb2cxMGZfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fbG9nMTBmX2Zpbml0ZSIpCisvLy8gbG9uZyBkb3VibGUgX19sb2cxMGxfZmluaXRlKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGxvZzEwbF9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19sb2cxMGxfZmluaXRlIikKKy8vLyBkb3VibGUgX19sb2cyX2Zpbml0ZShkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobG9nMl9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19sb2cyX2Zpbml0ZSIpCisvLy8gZmxvYXQgX19sb2cyZl9maW5pdGUoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobG9nMmZfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fbG9nMmZfZmluaXRlIikKKy8vLyBsb25nIGRvdWJsZSBfX2xvZzJsX2Zpbml0ZShsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsb2cybF9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19sb2cybF9maW5pdGUiKQorLy8vIGRvdWJsZSBfX2xvZ19maW5pdGUoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGxvZ19maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19sb2dfZmluaXRlIikKKy8vLyBmbG9hdCBfX2xvZ2ZfZmluaXRlKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGxvZ2ZfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fbG9nZl9maW5pdGUiKQorLy8vIGxvbmcgZG91YmxlIF9fbG9nbF9maW5pdGUobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobG9nbF9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19sb2dsX2Zpbml0ZSIpCisvLy8gdm9pZCAqX19tZW1jcHlfY2hrKHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IG4sIHNpemVfdCBzMXNpemUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1lbWNweV9jaGspCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19tZW1jcHlfY2hrIikKKy8vLyB2b2lkICpfX21lbW1vdmVfY2hrKHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IG4sIHNpemVfdCBzMXNpemUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1lbW1vdmVfY2hrKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fbWVtbW92ZV9jaGsiKQorLy8vIHZvaWQgKl9fbWVtc2V0X2Noayh2b2lkICpzLCBjaGFyIHYsIHNpemVfdCBuLCBzaXplX3QgczFzaXplKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtZW1zZXRfY2hrKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fbWVtc2V0X2NoayIpCisKKy8vIGludCBfX252dm1fcmVmbGVjdChjb25zdCBjaGFyICopCitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobnZ2bV9yZWZsZWN0KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fbnZ2bV9yZWZsZWN0IikKKy8vLyBkb3VibGUgX19wb3dfZmluaXRlKGRvdWJsZSB4LCBkb3VibGUgeSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocG93X2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX3Bvd19maW5pdGUiKQorLy8vIGZsb2F0IF9wb3dmX2Zpbml0ZShmbG9hdCB4LCBmbG9hdCB5KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChwb3dmX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX3Bvd2ZfZmluaXRlIikKKy8vLyBsb25nIGRvdWJsZSBfX3Bvd2xfZmluaXRlKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHBvd2xfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fcG93bF9maW5pdGUiKQorLy8vIGRvdWJsZSBfX3NpbmNvc3BpX3N0cmV0KGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzaW5jb3NwaV9zdHJldCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX3NpbmNvc3BpX3N0cmV0IikKKy8vLyBmbG9hdCBfX3NpbmNvc3BpZl9zdHJldChmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzaW5jb3NwaWZfc3RyZXQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19zaW5jb3NwaWZfc3RyZXQiKQorLy8vIGRvdWJsZSBfX3NpbmhfZmluaXRlKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzaW5oX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX3NpbmhfZmluaXRlIikKKy8vLyBmbG9hdCBfc2luaGZfZmluaXRlKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHNpbmhmX2Zpbml0ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX3NpbmhmX2Zpbml0ZSIpCisvLy8gbG9uZyBkb3VibGUgX19zaW5obF9maW5pdGUobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc2luaGxfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fc2luaGxfZmluaXRlIikKKy8vLyBkb3VibGUgX19zaW5waShkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc2lucGkpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19zaW5waSIpCisvLy8gZmxvYXQgX19zaW5waWYoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc2lucGlmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fc2lucGlmIikKKy8vLyBkb3VibGUgX19zcXJ0X2Zpbml0ZShkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3FydF9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19zcXJ0X2Zpbml0ZSIpCisvLy8gZmxvYXQgX19zcXJ0X2Zpbml0ZShmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzcXJ0Zl9maW5pdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19zcXJ0Zl9maW5pdGUiKQorLy8vIGxvbmcgZG91YmxlIF9fc3FydF9maW5pdGUobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3FydGxfZmluaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fc3FydGxfZmluaXRlIikKKy8vLyBjaGFyICpfX3N0cGNweV9jaGsoY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3QgczFzaXplKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHBjcHlfY2hrKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fc3RwY3B5X2NoayIpCisvLy8gY2hhciAqX19zdHBuY3B5X2NoayhjaGFyICpzMSwgY29uc3QgY2hhciAqczIsIHNpemVfdCBuLCBzaXplX3QgczFzaXplKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHBuY3B5X2NoaykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX3N0cG5jcHlfY2hrIikKKy8vLyBjaGFyICpfX3N0cmNweV9jaGsoY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3QgczFzaXplKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHJjcHlfY2hrKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIl9fc3RyY3B5X2NoayIpCisvLy8gY2hhciAqIF9fc3RyZHVwKGNvbnN0IGNoYXIgKnMpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGR1bmRlcl9zdHJkdXApCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19zdHJkdXAiKQorLy8vIGNoYXIgKl9fc3RybmNweV9jaGsoY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3Qgbiwgc2l6ZV90IHMxc2l6ZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RybmNweV9jaGspCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiX19zdHJuY3B5X2NoayIpCisvLy8gY2hhciAqX19zdHJuZHVwKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBuKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChkdW5kZXJfc3RybmR1cCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX3N0cm5kdXAiKQorLy8vIGNoYXIgKiBfX3N0cnRva19yKGNoYXIgKnMsIGNvbnN0IGNoYXIgKmRlbGltLCBjaGFyICoqc2F2ZV9wdHIpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGR1bmRlcl9zdHJ0b2tfcikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJfX3N0cnRva19yIikKKy8vLyBpbnQgYWJzKGludCBqKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhYnMpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiYWJzIikKKy8vLyBpbnQgYWNjZXNzKGNvbnN0IGNoYXIgKnBhdGgsIGludCBhbW9kZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYWNjZXNzKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImFjY2VzcyIpCisvLy8gZG91YmxlIGFjb3MoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGFjb3MpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiYWNvcyIpCisvLy8gZmxvYXQgYWNvc2YoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYWNvc2YpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiYWNvc2YiKQorLy8vIGRvdWJsZSBhY29zaChkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYWNvc2gpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiYWNvc2giKQorLy8vIGZsb2F0IGFjb3NoZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhY29zaGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiYWNvc2hmIikKKy8vLyBsb25nIGRvdWJsZSBhY29zaGwobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYWNvc2hsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImFjb3NobCIpCisvLy8gbG9uZyBkb3VibGUgYWNvc2wobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYWNvc2wpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiYWNvc2wiKQorLy8vIGRvdWJsZSBhc2luKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhc2luKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImFzaW4iKQorLy8vIGZsb2F0IGFzaW5mKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGFzaW5mKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImFzaW5mIikKKy8vLyBkb3VibGUgYXNpbmgoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGFzaW5oKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImFzaW5oIikKKy8vLyBmbG9hdCBhc2luaGYoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYXNpbmhmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImFzaW5oZiIpCisvLy8gbG9uZyBkb3VibGUgYXNpbmhsKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGFzaW5obCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJhc2luaGwiKQorLy8vIGxvbmcgZG91YmxlIGFzaW5sKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGFzaW5sKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImFzaW5sIikKKy8vLyBkb3VibGUgYXRhbihkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYXRhbikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJhdGFuIikKKy8vLyBkb3VibGUgYXRhbjIoZG91YmxlIHksIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhdGFuMikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJhdGFuMiIpCisvLy8gZmxvYXQgYXRhbjJmKGZsb2F0IHksIGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGF0YW4yZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJhdGFuMmYiKQorLy8vIGxvbmcgZG91YmxlIGF0YW4ybChsb25nIGRvdWJsZSB5LCBsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhdGFuMmwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiYXRhbjJsIikKKy8vLyBmbG9hdCBhdGFuZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhdGFuZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJhdGFuZiIpCisvLy8gZG91YmxlIGF0YW5oKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhdGFuaCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJhdGFuaCIpCisvLy8gZmxvYXQgYXRhbmhmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGF0YW5oZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJhdGFuaGYiKQorLy8vIGxvbmcgZG91YmxlIGF0YW5obChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhdGFuaGwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiYXRhbmhsIikKKy8vLyBsb25nIGRvdWJsZSBhdGFubChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhdGFubCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJhdGFubCIpCisvLy8gZG91YmxlIGF0b2YoY29uc3QgY2hhciAqc3RyKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhdG9mKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImF0b2YiKQorLy8vIGludCBhdG9pKGNvbnN0IGNoYXIgKnN0cik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYXRvaSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJhdG9pIikKKy8vLyBsb25nIGF0b2woY29uc3QgY2hhciAqc3RyKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhdG9sKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImF0b2wiKQorLy8vIGxvbmcgbG9uZyBhdG9sbChjb25zdCBjaGFyICpucHRyKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChhdG9sbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJhdG9sbCIpCisvLy8gaW50IGJjbXAoY29uc3Qgdm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyLCBzaXplX3Qgbik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoYmNtcCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJiY21wIikKKy8vLyB2b2lkIGJjb3B5KGNvbnN0IHZvaWQgKnMxLCB2b2lkICpzMiwgc2l6ZV90IG4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGJjb3B5KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImJjb3B5IikKKy8vLyB2b2lkIGJ6ZXJvKHZvaWQgKnMsIHNpemVfdCBuKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChiemVybykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJiemVybyIpCisvLy8gZG91YmxlIGNhYnMoZG91YmxlIGNvbXBsZXggeikKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjYWJzKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImNhYnMiKQorLy8vIGZsb2F0IGNhYnMoZmxvYXQgY29tcGxleCB6KQorVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGNhYnNmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImNhYnNmIikKKy8vLyBsb25nIGRvdWJsZSBjYWJzKGxvbmcgZG91YmxlIGNvbXBsZXggeikKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjYWJzbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJjYWJzbCIpCisvLy8gdm9pZCAqY2FsbG9jKHNpemVfdCBjb3VudCwgc2l6ZV90IHNpemUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGNhbGxvYykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJjYWxsb2MiKQorLy8vIGRvdWJsZSBjYnJ0KGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjYnJ0KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImNicnQiKQorLy8vIGZsb2F0IGNicnRmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGNicnRmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImNicnRmIikKKy8vLyBsb25nIGRvdWJsZSBjYnJ0bChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjYnJ0bCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJjYnJ0bCIpCisvLy8gZG91YmxlIGNlaWwoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGNlaWwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiY2VpbCIpCisvLy8gZmxvYXQgY2VpbGYoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoY2VpbGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiY2VpbGYiKQorLy8vIGxvbmcgZG91YmxlIGNlaWxsKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGNlaWxsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImNlaWxsIikKKy8vLyBpbnQgY2htb2QoY29uc3QgY2hhciAqcGF0aCwgbW9kZV90IG1vZGUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGNobW9kKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImNobW9kIikKKy8vLyBpbnQgY2hvd24oY29uc3QgY2hhciAqcGF0aCwgdWlkX3Qgb3duZXIsIGdpZF90IGdyb3VwKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjaG93bikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJjaG93biIpCisvLy8gdm9pZCBjbGVhcmVycihGSUxFICpzdHJlYW0pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGNsZWFyZXJyKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImNsZWFyZXJyIikKKy8vLyBpbnQgY2xvc2VkaXIoRElSICpkaXJwKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjbG9zZWRpcikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJjbG9zZWRpciIpCisvLy8gZG91YmxlIGNvcHlzaWduKGRvdWJsZSB4LCBkb3VibGUgeSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoY29weXNpZ24pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiY29weXNpZ24iKQorLy8vIGZsb2F0IGNvcHlzaWduZihmbG9hdCB4LCBmbG9hdCB5KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjb3B5c2lnbmYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiY29weXNpZ25mIikKKy8vLyBsb25nIGRvdWJsZSBjb3B5c2lnbmwobG9uZyBkb3VibGUgeCwgbG9uZyBkb3VibGUgeSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoY29weXNpZ25sKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImNvcHlzaWdubCIpCisvLy8gZG91YmxlIGNvcyhkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoY29zKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImNvcyIpCisvLy8gZmxvYXQgY29zZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjb3NmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImNvc2YiKQorLy8vIGRvdWJsZSBjb3NoKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjb3NoKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImNvc2giKQorLy8vIGZsb2F0IGNvc2hmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGNvc2hmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImNvc2hmIikKKy8vLyBsb25nIGRvdWJsZSBjb3NobChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjb3NobCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJjb3NobCIpCisvLy8gbG9uZyBkb3VibGUgY29zbChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChjb3NsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImNvc2wiKQorLy8vIGNoYXIgKmN0ZXJtaWQoY2hhciAqcyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoY3Rlcm1pZCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJjdGVybWlkIikKKy8vLyBkb3VibGUgZXhwKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChleHApCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZXhwIikKKy8vLyBkb3VibGUgZXhwMTAoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGV4cDEwKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImV4cDEwIikKKy8vLyBmbG9hdCBleHAxMGYoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZXhwMTBmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImV4cDEwZiIpCisvLy8gbG9uZyBkb3VibGUgZXhwMTBsKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGV4cDEwbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJleHAxMGwiKQorLy8vIGRvdWJsZSBleHAyKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChleHAyKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImV4cDIiKQorLy8vIGZsb2F0IGV4cDJmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGV4cDJmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImV4cDJmIikKKy8vLyBsb25nIGRvdWJsZSBleHAybChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChleHAybCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJleHAybCIpCisvLy8gZmxvYXQgZXhwZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChleHBmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImV4cGYiKQorLy8vIGxvbmcgZG91YmxlIGV4cGwobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZXhwbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJleHBsIikKKy8vLyBkb3VibGUgZXhwbTEoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGV4cG0xKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImV4cG0xIikKKy8vLyBmbG9hdCBleHBtMWYoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZXhwbTFmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImV4cG0xZiIpCisvLy8gbG9uZyBkb3VibGUgZXhwbTFsKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGV4cG0xbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJleHBtMWwiKQorLy8vIGRvdWJsZSBmYWJzKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmYWJzKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZhYnMiKQorLy8vIGZsb2F0IGZhYnNmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZhYnNmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZhYnNmIikKKy8vLyBsb25nIGRvdWJsZSBmYWJzbChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmYWJzbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmYWJzbCIpCisvLy8gaW50IGZjbG9zZShGSUxFICpzdHJlYW0pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZjbG9zZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmY2xvc2UiKQorLy8vIEZJTEUgKmZkb3BlbihpbnQgZmlsZGVzLCBjb25zdCBjaGFyICptb2RlKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmZG9wZW4pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZmRvcGVuIikKKy8vLyBpbnQgZmVvZihGSUxFICpzdHJlYW0pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZlb2YpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZmVvZiIpCisvLy8gaW50IGZlcnJvcihGSUxFICpzdHJlYW0pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZlcnJvcikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmZXJyb3IiKQorLy8vIGludCBmZmx1c2goRklMRSAqc3RyZWFtKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmZmx1c2gpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZmZsdXNoIikKKy8vLyBpbnQgZmZzKGludCBpKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmZnMpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZmZzIikKKy8vLyBpbnQgZmZzbChsb25nIGludCBpKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmZnNsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZmc2wiKQorLy8vIGludCBmZnNsbChsb25nIGxvbmcgaW50IGkpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZmc2xsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZmc2xsIikKKy8vLyBpbnQgZmdldGMoRklMRSAqc3RyZWFtKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmZ2V0YykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmZ2V0YyIpCisvLy8gaW50IGZnZXRwb3MoRklMRSAqc3RyZWFtLCBmcG9zX3QgKnBvcyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZmdldHBvcykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmZ2V0cG9zIikKKy8vLyBjaGFyICpmZ2V0cyhjaGFyICpzLCBpbnQgbiwgRklMRSAqc3RyZWFtKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmZ2V0cykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmZ2V0cyIpCisvLy8gaW50IGZpbGVubyhGSUxFICpzdHJlYW0pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZpbGVubykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmaWxlbm8iKQorLy8vIGludCBmaXByaW50ZihGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmaXByaW50ZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmaXByaW50ZiIpCisvLy8gdm9pZCBmbG9ja2ZpbGUoRklMRSAqZmlsZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZmxvY2tmaWxlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZsb2NrZmlsZSIpCisvLy8gZG91YmxlIGZsb29yKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmbG9vcikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmbG9vciIpCisvLy8gZmxvYXQgZmxvb3JmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZsb29yZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmbG9vcmYiKQorLy8vIGxvbmcgZG91YmxlIGZsb29ybChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmbG9vcmwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZmxvb3JsIikKKy8vLyBpbnQgZmxzKGludCBpKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmbHMpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZmxzIikKKy8vLyBpbnQgZmxzbChsb25nIGludCBpKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmbHNsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZsc2wiKQorLy8vIGludCBmbHNsbChsb25nIGxvbmcgaW50IGkpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZsc2xsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZsc2xsIikKKy8vLyBkb3VibGUgZm1heChkb3VibGUgeCwgZG91YmxlIHkpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZtYXgpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZm1heCIpCisvLy8gZmxvYXQgZm1heGYoZmxvYXQgeCwgZmxvYXQgeSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZm1heGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZm1heGYiKQorLy8vIGxvbmcgZG91YmxlIGZtYXhsKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZtYXhsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZtYXhsIikKKy8vLyBkb3VibGUgZm1pbihkb3VibGUgeCwgZG91YmxlIHkpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZtaW4pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZm1pbiIpCisvLy8gZmxvYXQgZm1pbmYoZmxvYXQgeCwgZmxvYXQgeSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZm1pbmYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZm1pbmYiKQorLy8vIGxvbmcgZG91YmxlIGZtaW5sKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZtaW5sKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZtaW5sIikKKy8vLyBkb3VibGUgZm1vZChkb3VibGUgeCwgZG91YmxlIHkpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZtb2QpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZm1vZCIpCisvLy8gZmxvYXQgZm1vZGYoZmxvYXQgeCwgZmxvYXQgeSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZm1vZGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZm1vZGYiKQorLy8vIGxvbmcgZG91YmxlIGZtb2RsKGxvbmcgZG91YmxlIHgsIGxvbmcgZG91YmxlIHkpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZtb2RsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZtb2RsIikKKy8vLyBGSUxFICpmb3Blbihjb25zdCBjaGFyICpmaWxlbmFtZSwgY29uc3QgY2hhciAqbW9kZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZm9wZW4pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZm9wZW4iKQorLy8vIEZJTEUgKmZvcGVuNjQoY29uc3QgY2hhciAqZmlsZW5hbWUsIGNvbnN0IGNoYXIgKm9wZW50eXBlKQorVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZvcGVuNjQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZm9wZW42NCIpCisvLy8gaW50IGZwcmludGYoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZnByaW50ZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmcHJpbnRmIikKKy8vLyBpbnQgZnB1dGMoaW50IGMsIEZJTEUgKnN0cmVhbSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZnB1dGMpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZnB1dGMiKQorLy8vIGludCBmcHV0cyhjb25zdCBjaGFyICpzLCBGSUxFICpzdHJlYW0pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZwdXRzKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZwdXRzIikKKy8vLyBzaXplX3QgZnJlYWQodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSwgc2l6ZV90IG5pdGVtcywgRklMRSAqc3RyZWFtKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmcmVhZCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmcmVhZCIpCisvLy8gdm9pZCBmcmVlKHZvaWQgKnB0cik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZnJlZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmcmVlIikKKy8vLyBkb3VibGUgZnJleHAoZG91YmxlIG51bSwgaW50ICpleHApOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZyZXhwKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZyZXhwIikKKy8vLyBmbG9hdCBmcmV4cGYoZmxvYXQgbnVtLCBpbnQgKmV4cCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZnJleHBmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZyZXhwZiIpCisvLy8gbG9uZyBkb3VibGUgZnJleHBsKGxvbmcgZG91YmxlIG51bSwgaW50ICpleHApOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZyZXhwbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmcmV4cGwiKQorLy8vIGludCBmc2NhbmYoRklMRSAqc3RyZWFtLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLiApOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZzY2FuZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmc2NhbmYiKQorLy8vIGludCBmc2VlayhGSUxFICpzdHJlYW0sIGxvbmcgb2Zmc2V0LCBpbnQgd2hlbmNlKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmc2VlaykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmc2VlayIpCisvLy8gaW50IGZzZWVrbyhGSUxFICpzdHJlYW0sIG9mZl90IG9mZnNldCwgaW50IHdoZW5jZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZnNlZWtvKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZzZWVrbyIpCisvLy8gaW50IGZzZWVrbzY0KEZJTEUgKnN0cmVhbSwgb2ZmNjRfdCBvZmZzZXQsIGludCB3aGVuY2UpCitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZnNlZWtvNjQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZnNlZWtvNjQiKQorLy8vIGludCBmc2V0cG9zKEZJTEUgKnN0cmVhbSwgY29uc3QgZnBvc190ICpwb3MpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZzZXRwb3MpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZnNldHBvcyIpCisvLy8gaW50IGZzdGF0KGludCBmaWxkZXMsIHN0cnVjdCBzdGF0ICpidWYpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZzdGF0KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZzdGF0IikKKy8vLyBpbnQgZnN0YXQ2NChpbnQgZmlsZWRlcywgc3RydWN0IHN0YXQ2NCAqYnVmKQorVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZzdGF0NjQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZnN0YXQ2NCIpCisvLy8gaW50IGZzdGF0dmZzKGludCBmaWxkZXMsIHN0cnVjdCBzdGF0dmZzICpidWYpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZzdGF0dmZzKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZzdGF0dmZzIikKKy8vLyBpbnQgZnN0YXR2ZnM2NChpbnQgZmlsZGVzLCBzdHJ1Y3Qgc3RhdHZmczY0ICpidWYpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZzdGF0dmZzNjQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZnN0YXR2ZnM2NCIpCisvLy8gbG9uZyBmdGVsbChGSUxFICpzdHJlYW0pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZ0ZWxsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZ0ZWxsIikKKy8vLyBvZmZfdCBmdGVsbG8oRklMRSAqc3RyZWFtKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmdGVsbG8pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZnRlbGxvIikKKy8vLyBvZmY2NF90IGZ0ZWxsbzY0KEZJTEUgKnN0cmVhbSkKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmdGVsbG82NCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJmdGVsbG82NCIpCisvLy8gaW50IGZ0cnlsb2NrZmlsZShGSUxFICpmaWxlKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChmdHJ5bG9ja2ZpbGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZnRyeWxvY2tmaWxlIikKKy8vLyB2b2lkIGZ1bmxvY2tmaWxlKEZJTEUgKmZpbGUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGZ1bmxvY2tmaWxlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZ1bmxvY2tmaWxlIikKKy8vLyBzaXplX3QgZndyaXRlKGNvbnN0IHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsIHNpemVfdCBuaXRlbXMsIEZJTEUgKnN0cmVhbSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZndyaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImZ3cml0ZSIpCisvLy8gaW50IGdldGMoRklMRSAqc3RyZWFtKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChnZXRjKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImdldGMiKQorLy8vIGludCBnZXRjX3VubG9ja2VkKEZJTEUgKnN0cmVhbSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZ2V0Y191bmxvY2tlZCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJnZXRjX3VubG9ja2VkIikKKy8vLyBpbnQgZ2V0Y2hhcih2b2lkKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChnZXRjaGFyKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImdldGNoYXIiKQorLy8vIGNoYXIgKmdldGVudihjb25zdCBjaGFyICpuYW1lKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChnZXRlbnYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiZ2V0ZW52IikKKy8vLyBpbnQgZ2V0aXRpbWVyKGludCB3aGljaCwgc3RydWN0IGl0aW1lcnZhbCAqdmFsdWUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGdldGl0aW1lcikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJnZXRpdGltZXIiKQorLy8vIGludCBnZXRsb2dpbl9yKGNoYXIgKm5hbWUsIHNpemVfdCBuYW1lc2l6ZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoZ2V0bG9naW5fcikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJnZXRsb2dpbl9yIikKKy8vLyBzdHJ1Y3QgcGFzc3dkICpnZXRwd25hbShjb25zdCBjaGFyICpuYW1lKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChnZXRwd25hbSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJnZXRwd25hbSIpCisvLy8gY2hhciAqZ2V0cyhjaGFyICpzKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChnZXRzKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImdldHMiKQorLy8vIGludCBnZXR0aW1lb2ZkYXkoc3RydWN0IHRpbWV2YWwgKnRwLCB2b2lkICp0enApOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGdldHRpbWVvZmRheSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJnZXR0aW1lb2ZkYXkiKQorLy8vIHVpbnQzMl90IGh0b25sKHVpbnQzMl90IGhvc3Rsb25nKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChodG9ubCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJodG9ubCIpCisvLy8gdWludDE2X3QgaHRvbnModWludDE2X3QgaG9zdHNob3J0KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChodG9ucykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJodG9ucyIpCisvLy8gaW50IGlwcmludGYoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGlwcmludGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiaXByaW50ZiIpCisvLy8gaW50IGlzYXNjaWkoaW50IGMpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGlzYXNjaWkpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiaXNhc2NpaSIpCisvLy8gaW50IGlzZGlnaXQoaW50IGMpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGlzZGlnaXQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgiaXNkaWdpdCIpCisvLy8gbG9uZyBpbnQgbGFicyhsb25nIGludCBqKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsYWJzKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImxhYnMiKQorLy8vIGludCBsY2hvd24oY29uc3QgY2hhciAqcGF0aCwgdWlkX3Qgb3duZXIsIGdpZF90IGdyb3VwKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsY2hvd24pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibGNob3duIikKKy8vLyBkb3VibGUgbGRleHAoZG91YmxlIHgsIGludCBuKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsZGV4cCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJsZGV4cCIpCisvLy8gZmxvYXQgbGRleHBmKGZsb2F0IHgsIGludCBuKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsZGV4cGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibGRleHBmIikKKy8vLyBsb25nIGRvdWJsZSBsZGV4cGwobG9uZyBkb3VibGUgeCwgaW50IG4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGxkZXhwbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJsZGV4cGwiKQorLy8vIGxvbmcgbG9uZyBpbnQgbGxhYnMobG9uZyBsb25nIGludCBqKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsbGFicykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJsbGFicyIpCisvLy8gZG91YmxlIGxvZyhkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobG9nKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImxvZyIpCisvLy8gZG91YmxlIGxvZzEwKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsb2cxMCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJsb2cxMCIpCisvLy8gZmxvYXQgbG9nMTBmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGxvZzEwZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJsb2cxMGYiKQorLy8vIGxvbmcgZG91YmxlIGxvZzEwbChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsb2cxMGwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibG9nMTBsIikKKy8vLyBkb3VibGUgbG9nMXAoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGxvZzFwKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImxvZzFwIikKKy8vLyBmbG9hdCBsb2cxcGYoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobG9nMXBmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImxvZzFwZiIpCisvLy8gbG9uZyBkb3VibGUgbG9nMXBsKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGxvZzFwbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJsb2cxcGwiKQorLy8vIGRvdWJsZSBsb2cyKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsb2cyKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImxvZzIiKQorLy8vIGZsb2F0IGxvZzJmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGxvZzJmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImxvZzJmIikKKy8vLyBkb3VibGUgbG9uZyBkb3VibGUgbG9nMmwobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobG9nMmwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibG9nMmwiKQorLy8vIGRvdWJsZSBsb2diKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsb2diKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImxvZ2IiKQorLy8vIGZsb2F0IGxvZ2JmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKGxvZ2JmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImxvZ2JmIikKKy8vLyBsb25nIGRvdWJsZSBsb2dibChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsb2dibCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJsb2dibCIpCisvLy8gZmxvYXQgbG9nZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChsb2dmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoImxvZ2YiKQorLy8vIGxvbmcgZG91YmxlIGxvZ2wobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobG9nbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJsb2dsIikKKy8vLyBpbnQgbHN0YXQoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHN0YXQgKmJ1Zik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobHN0YXQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibHN0YXQiKQorLy8vIGludCBsc3RhdDY0KGNvbnN0IGNoYXIgKnBhdGgsIHN0cnVjdCBzdGF0NjQgKmJ1Zik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobHN0YXQ2NCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJsc3RhdDY0IikKKy8vLyB2b2lkICptYWxsb2Moc2l6ZV90IHNpemUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1hbGxvYykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJtYWxsb2MiKQorLy8vIHZvaWQgKm1lbWFsaWduKHNpemVfdCBib3VuZGFyeSwgc2l6ZV90IHNpemUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1lbWFsaWduKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIm1lbWFsaWduIikKKy8vLyB2b2lkICptZW1jY3B5KHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgaW50IGMsIHNpemVfdCBuKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtZW1jY3B5KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIm1lbWNjcHkiKQorLy8vIHZvaWQgKm1lbWNocihjb25zdCB2b2lkICpzLCBpbnQgYywgc2l6ZV90IG4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1lbWNocikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJtZW1jaHIiKQorLy8vIGludCBtZW1jbXAoY29uc3Qgdm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyLCBzaXplX3Qgbik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobWVtY21wKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIm1lbWNtcCIpCisvLy8gdm9pZCAqbWVtY3B5KHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IG4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1lbWNweSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJtZW1jcHkiKQorLy8vIHZvaWQgKm1lbW1vdmUodm9pZCAqczEsIGNvbnN0IHZvaWQgKnMyLCBzaXplX3Qgbik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobWVtbW92ZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJtZW1tb3ZlIikKKy8vLyB2b2lkICptZW1wY3B5KHZvaWQgKnMxLCBjb25zdCB2b2lkICpzMiwgc2l6ZV90IG4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1lbXBjcHkpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibWVtcGNweSIpCisvLyB2b2lkICptZW1yY2hyKGNvbnN0IHZvaWQgKnMsIGludCBjLCBzaXplX3Qgbik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobWVtcmNocikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJtZW1yY2hyIikKKy8vLyB2b2lkICptZW1zZXQodm9pZCAqYiwgaW50IGMsIHNpemVfdCBsZW4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1lbXNldCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJtZW1zZXQiKQorLy8vIHZvaWQgbWVtc2V0X3BhdHRlcm4xNih2b2lkICpiLCBjb25zdCB2b2lkICpwYXR0ZXJuMTYsIHNpemVfdCBsZW4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1lbXNldF9wYXR0ZXJuMTYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibWVtc2V0X3BhdHRlcm4xNiIpCisvLy8gaW50IG1rZGlyKGNvbnN0IGNoYXIgKnBhdGgsIG1vZGVfdCBtb2RlKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChta2RpcikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJta2RpciIpCisvLy8gdGltZV90IG1rdGltZShzdHJ1Y3QgdG0gKnRpbWVwdHIpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1rdGltZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJta3RpbWUiKQorLy8vIGRvdWJsZSBtb2RmKGRvdWJsZSB4LCBkb3VibGUgKmlwdHIpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG1vZGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibW9kZiIpCisvLy8gZmxvYXQgbW9kZmYoZmxvYXQsIGZsb2F0ICppcHRyKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtb2RmZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJtb2RmZiIpCisvLy8gbG9uZyBkb3VibGUgbW9kZmwobG9uZyBkb3VibGUgdmFsdWUsIGxvbmcgZG91YmxlICppcHRyKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChtb2RmbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJtb2RmbCIpCisKKy8vLyBkb3VibGUgbmVhcmJ5aW50KGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChuZWFyYnlpbnQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibmVhcmJ5aW50IikKKy8vLyBmbG9hdCBuZWFyYnlpbnRmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG5lYXJieWludGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibmVhcmJ5aW50ZiIpCisvLy8gbG9uZyBkb3VibGUgbmVhcmJ5aW50bChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChuZWFyYnlpbnRsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIm5lYXJieWludGwiKQorLy8vIHVpbnQzMl90IG50b2hsKHVpbnQzMl90IG5ldGxvbmcpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG50b2hsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIm50b2hsIikKKy8vLyB1aW50MTZfdCBudG9ocyh1aW50MTZfdCBuZXRzaG9ydCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwobnRvaHMpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgibnRvaHMiKQorLy8vIGludCBvcGVuKGNvbnN0IGNoYXIgKnBhdGgsIGludCBvZmxhZywgLi4uICk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwob3BlbikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJvcGVuIikKKy8vLyBpbnQgb3BlbjY0KGNvbnN0IGNoYXIgKmZpbGVuYW1lLCBpbnQgZmxhZ3NbLCBtb2RlX3QgbW9kZV0pCitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwob3BlbjY0KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIm9wZW42NCIpCisvLy8gRElSICpvcGVuZGlyKGNvbnN0IGNoYXIgKmRpcm5hbWUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKG9wZW5kaXIpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgib3BlbmRpciIpCisvLy8gaW50IHBjbG9zZShGSUxFICpzdHJlYW0pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHBjbG9zZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJwY2xvc2UiKQorLy8vIHZvaWQgcGVycm9yKGNvbnN0IGNoYXIgKnMpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHBlcnJvcikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJwZXJyb3IiKQorLy8vIEZJTEUgKnBvcGVuKGNvbnN0IGNoYXIgKmNvbW1hbmQsIGNvbnN0IGNoYXIgKm1vZGUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHBvcGVuKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInBvcGVuIikKKy8vLyBpbnQgcG9zaXhfbWVtYWxpZ24odm9pZCAqKm1lbXB0ciwgc2l6ZV90IGFsaWdubWVudCwgc2l6ZV90IHNpemUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHBvc2l4X21lbWFsaWduKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInBvc2l4X21lbWFsaWduIikKKy8vLyBkb3VibGUgcG93KGRvdWJsZSB4LCBkb3VibGUgeSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocG93KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInBvdyIpCisvLy8gZmxvYXQgcG93ZihmbG9hdCB4LCBmbG9hdCB5KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChwb3dmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInBvd2YiKQorLy8vIGxvbmcgZG91YmxlIHBvd2wobG9uZyBkb3VibGUgeCwgbG9uZyBkb3VibGUgeSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocG93bCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJwb3dsIikKKy8vLyBzc2l6ZV90IHByZWFkKGludCBmaWxkZXMsIHZvaWQgKmJ1Ziwgc2l6ZV90IG5ieXRlLCBvZmZfdCBvZmZzZXQpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHByZWFkKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInByZWFkIikKKy8vLyBpbnQgcHJpbnRmKGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChwcmludGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgicHJpbnRmIikKKy8vLyBpbnQgcHV0YyhpbnQgYywgRklMRSAqc3RyZWFtKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChwdXRjKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInB1dGMiKQorLy8vIGludCBwdXRjaGFyKGludCBjKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChwdXRjaGFyKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInB1dGNoYXIiKQorLy8vIGludCBwdXRzKGNvbnN0IGNoYXIgKnMpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHB1dHMpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgicHV0cyIpCisvLy8gc3NpemVfdCBwd3JpdGUoaW50IGZpbGRlcywgY29uc3Qgdm9pZCAqYnVmLCBzaXplX3QgbmJ5dGUsIG9mZl90IG9mZnNldCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocHdyaXRlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInB3cml0ZSIpCisvLy8gdm9pZCBxc29ydCh2b2lkICpiYXNlLCBzaXplX3QgbmVsLCBzaXplX3Qgd2lkdGgsCisvLy8gICAgICAgICAgICBpbnQgKCpjb21wYXIpKGNvbnN0IHZvaWQgKiwgY29uc3Qgdm9pZCAqKSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocXNvcnQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgicXNvcnQiKQorLy8vIHNzaXplX3QgcmVhZChpbnQgZmlsZGVzLCB2b2lkICpidWYsIHNpemVfdCBuYnl0ZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocmVhZCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJyZWFkIikKKy8vLyBzc2l6ZV90IHJlYWRsaW5rKGNvbnN0IGNoYXIgKnBhdGgsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZnNpemUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHJlYWRsaW5rKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInJlYWRsaW5rIikKKy8vLyB2b2lkICpyZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IHNpemUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHJlYWxsb2MpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgicmVhbGxvYyIpCisvLy8gdm9pZCAqcmVhbGxvY2Yodm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocmVhbGxvY2YpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgicmVhbGxvY2YiKQorLy8vIGNoYXIgKnJlYWxwYXRoKGNvbnN0IGNoYXIgKmZpbGVfbmFtZSwgY2hhciAqcmVzb2x2ZWRfbmFtZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocmVhbHBhdGgpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgicmVhbHBhdGgiKQorLy8vIGludCByZW1vdmUoY29uc3QgY2hhciAqcGF0aCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocmVtb3ZlKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInJlbW92ZSIpCisvLy8gaW50IHJlbmFtZShjb25zdCBjaGFyICpvbGQsIGNvbnN0IGNoYXIgKm5ldyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocmVuYW1lKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInJlbmFtZSIpCisvLy8gdm9pZCByZXdpbmQoRklMRSAqc3RyZWFtKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChyZXdpbmQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgicmV3aW5kIikKKy8vLyBkb3VibGUgcmludChkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocmludCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJyaW50IikKKy8vLyBmbG9hdCByaW50ZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChyaW50ZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJyaW50ZiIpCisvLy8gbG9uZyBkb3VibGUgcmludGwobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwocmludGwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgicmludGwiKQorLy8vIGludCBybWRpcihjb25zdCBjaGFyICpwYXRoKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChybWRpcikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJybWRpciIpCisvLy8gZG91YmxlIHJvdW5kKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChyb3VuZCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJyb3VuZCIpCisvLy8gZmxvYXQgcm91bmRmKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHJvdW5kZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJyb3VuZGYiKQorLy8vIGxvbmcgZG91YmxlIHJvdW5kbChsb25nIGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChyb3VuZGwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgicm91bmRsIikKKy8vLyBpbnQgc2NhbmYoY29uc3QgY2hhciAqcmVzdHJpY3QgZm9ybWF0LCAuLi4gKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzY2FuZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzY2FuZiIpCisvLy8gdm9pZCBzZXRidWYoRklMRSAqc3RyZWFtLCBjaGFyICpidWYpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHNldGJ1ZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzZXRidWYiKQorLy8vIGludCBzZXRpdGltZXIoaW50IHdoaWNoLCBjb25zdCBzdHJ1Y3QgaXRpbWVydmFsICp2YWx1ZSwKKy8vLyAgICAgICAgICAgICAgIHN0cnVjdCBpdGltZXJ2YWwgKm92YWx1ZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc2V0aXRpbWVyKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInNldGl0aW1lciIpCisvLy8gaW50IHNldHZidWYoRklMRSAqc3RyZWFtLCBjaGFyICpidWYsIGludCB0eXBlLCBzaXplX3Qgc2l6ZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc2V0dmJ1ZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzZXR2YnVmIikKKy8vLyBkb3VibGUgc2luKGRvdWJsZSB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzaW4pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic2luIikKKy8vLyBmbG9hdCBzaW5mKGZsb2F0IHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHNpbmYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic2luZiIpCisvLy8gZG91YmxlIHNpbmgoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHNpbmgpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic2luaCIpCisvLy8gZmxvYXQgc2luaGYoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc2luaGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic2luaGYiKQorLy8vIGxvbmcgZG91YmxlIHNpbmhsKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHNpbmhsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInNpbmhsIikKKy8vLyBsb25nIGRvdWJsZSBzaW5sKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHNpbmwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic2lubCIpCisvLy8gaW50IHNpcHJpbnRmKGNoYXIgKnN0ciwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHNpcHJpbnRmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInNpcHJpbnRmIikKKy8vLyBpbnQgc25wcmludGYoY2hhciAqcywgc2l6ZV90IG4sIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzbnByaW50ZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzbnByaW50ZiIpCisvLy8gaW50IHNwcmludGYoY2hhciAqc3RyLCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3ByaW50ZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzcHJpbnRmIikKKy8vLyBkb3VibGUgc3FydChkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3FydCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzcXJ0IikKKy8vLyBmbG9hdCBzcXJ0ZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzcXJ0ZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzcXJ0ZiIpCisvLy8gbG9uZyBkb3VibGUgc3FydGwobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3FydGwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3FydGwiKQorLy8vIGludCBzc2NhbmYoY29uc3QgY2hhciAqcywgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4gKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzc2NhbmYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3NjYW5mIikKKy8vLyBpbnQgc3RhdChjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RhdCAqYnVmKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdGF0KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInN0YXQiKQorLy8vIGludCBzdGF0NjQoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHN0YXQ2NCAqYnVmKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdGF0NjQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RhdDY0IikKKy8vLyBpbnQgc3RhdHZmcyhjb25zdCBjaGFyICpwYXRoLCBzdHJ1Y3Qgc3RhdHZmcyAqYnVmKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdGF0dmZzKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInN0YXR2ZnMiKQorLy8vIGludCBzdGF0dmZzNjQoY29uc3QgY2hhciAqcGF0aCwgc3RydWN0IHN0YXR2ZnM2NCAqYnVmKQorVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0YXR2ZnM2NCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdGF0dmZzNjQiKQorLy8vIGNoYXIgKnN0cGNweShjaGFyICpzMSwgY29uc3QgY2hhciAqczIpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cGNweSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHBjcHkiKQorLy8vIGNoYXIgKnN0cG5jcHkoY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3Qgbik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RwbmNweSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHBuY3B5IikKKy8vLyBpbnQgc3RyY2FzZWNtcChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cmNhc2VjbXApCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RyY2FzZWNtcCIpCisvLy8gY2hhciAqc3RyY2F0KGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RyY2F0KQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInN0cmNhdCIpCisvLy8gY2hhciAqc3RyY2hyKGNvbnN0IGNoYXIgKnMsIGludCBjKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHJjaHIpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RyY2hyIikKKy8vLyBpbnQgc3RyY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RyY21wKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInN0cmNtcCIpCisvLy8gaW50IHN0cmNvbGwoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHJjb2xsKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInN0cmNvbGwiKQorLy8vIGNoYXIgKnN0cmNweShjaGFyICpzMSwgY29uc3QgY2hhciAqczIpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cmNweSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHJjcHkiKQorLy8vIHNpemVfdCBzdHJjc3BuKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RyY3NwbikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHJjc3BuIikKKy8vLyBjaGFyICpzdHJkdXAoY29uc3QgY2hhciAqczEpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cmR1cCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHJkdXAiKQorLy8vIHNpemVfdCBzdHJsZW4oY29uc3QgY2hhciAqcyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RybGVuKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInN0cmxlbiIpCisvLy8gaW50IHN0cm5jYXNlY21wKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IG4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cm5jYXNlY21wKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInN0cm5jYXNlY21wIikKKy8vLyBjaGFyICpzdHJuY2F0KGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IG4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cm5jYXQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RybmNhdCIpCisvLy8gaW50IHN0cm5jbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3Qgbik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RybmNtcCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHJuY21wIikKKy8vLyBjaGFyICpzdHJuY3B5KGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMiwgc2l6ZV90IG4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cm5jcHkpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RybmNweSIpCisvLy8gY2hhciAqc3RybmR1cChjb25zdCBjaGFyICpzMSwgc2l6ZV90IG4pOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cm5kdXApCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RybmR1cCIpCisvLy8gc2l6ZV90IHN0cm5sZW4oY29uc3QgY2hhciAqcywgc2l6ZV90IG1heGxlbik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RybmxlbikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHJubGVuIikKKy8vLyBjaGFyICpzdHJwYnJrKGNvbnN0IGNoYXIgKnMxLCBjb25zdCBjaGFyICpzMik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RycGJyaykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHJwYnJrIikKKy8vLyBjaGFyICpzdHJyY2hyKGNvbnN0IGNoYXIgKnMsIGludCBjKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHJyY2hyKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInN0cnJjaHIiKQorLy8vIHNpemVfdCBzdHJzcG4oY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHJzcG4pCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3Ryc3BuIikKKy8vLyBjaGFyICpzdHJzdHIoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHJzdHIpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3Ryc3RyIikKKy8vLyBkb3VibGUgc3RydG9kKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cnRvZCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHJ0b2QiKQorLy8vIGZsb2F0IHN0cnRvZihjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHJ0b2YpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RydG9mIikKKy8vIGNoYXIgKnN0cnRvayhjaGFyICpzMSwgY29uc3QgY2hhciAqczIpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cnRvaykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHJ0b2siKQorLy8gY2hhciAqc3RydG9rX3IoY2hhciAqcywgY29uc3QgY2hhciAqc2VwLCBjaGFyICoqbGFzdHMpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cnRva19yKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInN0cnRva19yIikKKy8vLyBsb25nIGludCBzdHJ0b2woY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwgaW50IGJhc2UpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cnRvbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHJ0b2wiKQorLy8vIGxvbmcgZG91YmxlIHN0cnRvbGQoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0cik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RydG9sZCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHJ0b2xkIikKKy8vLyBsb25nIGxvbmcgaW50IHN0cnRvbGwoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwgaW50IGJhc2UpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN0cnRvbGwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgic3RydG9sbCIpCisvLy8gdW5zaWduZWQgbG9uZyBpbnQgc3RydG91bChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RydG91bCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHJ0b3VsIikKKy8vLyB1bnNpZ25lZCBsb25nIGxvbmcgaW50IHN0cnRvdWxsKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTChzdHJ0b3VsbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHJ0b3VsbCIpCisvLy8gc2l6ZV90IHN0cnhmcm0oY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3Qgbik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwoc3RyeGZybSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzdHJ4ZnJtIikKKy8vLyBpbnQgc3lzdGVtKGNvbnN0IGNoYXIgKmNvbW1hbmQpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHN5c3RlbSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJzeXN0ZW0iKQorLy8vIGRvdWJsZSB0YW4oZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHRhbikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJ0YW4iKQorLy8vIGZsb2F0IHRhbmYoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodGFuZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJ0YW5mIikKKy8vLyBkb3VibGUgdGFuaChkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodGFuaCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJ0YW5oIikKKy8vLyBmbG9hdCB0YW5oZihmbG9hdCB4KTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTCh0YW5oZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJ0YW5oZiIpCisvLy8gbG9uZyBkb3VibGUgdGFuaGwobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodGFuaGwpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidGFuaGwiKQorLy8vIGxvbmcgZG91YmxlIHRhbmwobG9uZyBkb3VibGUgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodGFubCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJ0YW5sIikKKy8vLyBjbG9ja190IHRpbWVzKHN0cnVjdCB0bXMgKmJ1ZmZlcik7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodGltZXMpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidGltZXMiKQorLy8vIEZJTEUgKnRtcGZpbGUodm9pZCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodG1wZmlsZSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJ0bXBmaWxlIikKKy8vLyBGSUxFICp0bXBmaWxlNjQodm9pZCkKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTCh0bXBmaWxlNjQpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidG1wZmlsZTY0IikKKy8vLyBpbnQgdG9hc2NpaShpbnQgYyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodG9hc2NpaSkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJ0b2FzY2lpIikKKy8vLyBkb3VibGUgdHJ1bmMoZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHRydW5jKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInRydW5jIikKKy8vLyBmbG9hdCB0cnVuY2YoZmxvYXQgeCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodHJ1bmNmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInRydW5jZiIpCisvLy8gbG9uZyBkb3VibGUgdHJ1bmNsKGxvbmcgZG91YmxlIHgpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHRydW5jbCkKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJ0cnVuY2wiKQorLy8vIGludCB1bmFtZShzdHJ1Y3QgdXRzbmFtZSAqbmFtZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodW5hbWUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidW5hbWUiKQorLy8vIGludCB1bmdldGMoaW50IGMsIEZJTEUgKnN0cmVhbSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodW5nZXRjKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInVuZ2V0YyIpCisvLy8gaW50IHVubGluayhjb25zdCBjaGFyICpwYXRoKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTCh1bmxpbmspCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidW5saW5rIikKKy8vLyBpbnQgdW5zZXRlbnYoY29uc3QgY2hhciAqbmFtZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodW5zZXRlbnYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidW5zZXRlbnYiKQorLy8vIGludCB1dGltZShjb25zdCBjaGFyICpwYXRoLCBjb25zdCBzdHJ1Y3QgdXRpbWJ1ZiAqdGltZXMpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHV0aW1lKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInV0aW1lIikKKy8vLyBpbnQgdXRpbWVzKGNvbnN0IGNoYXIgKnBhdGgsIGNvbnN0IHN0cnVjdCB0aW1ldmFsIHRpbWVzWzJdKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTCh1dGltZXMpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidXRpbWVzIikKKy8vLyB2b2lkICp2YWxsb2Moc2l6ZV90IHNpemUpOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHZhbGxvYykKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJ2YWxsb2MiKQorLy8vIGludCB2ZnByaW50ZihGSUxFICpzdHJlYW0sIGNvbnN0IGNoYXIgKmZvcm1hdCwgdmFfbGlzdCBhcCk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodmZwcmludGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidmZwcmludGYiKQorLy8vIGludCB2ZnNjYW5mKEZJTEUgKnN0cmVhbSwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFyZyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwodmZzY2FuZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJ2ZnNjYW5mIikKKy8vLyBpbnQgdnByaW50Zihjb25zdCBjaGFyICpyZXN0cmljdCBmb3JtYXQsIHZhX2xpc3QgYXApOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHZwcmludGYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidnByaW50ZiIpCisvLy8gaW50IHZzY2FuZihjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJnKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTCh2c2NhbmYpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgidnNjYW5mIikKKy8vLyBpbnQgdnNucHJpbnRmKGNoYXIgKnMsIHNpemVfdCBuLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHZzbnByaW50ZikKK1RMSV9ERUZJTkVfU1RSSU5HX0lOVEVSTkFMKCJ2c25wcmludGYiKQorLy8vIGludCB2c3ByaW50ZihjaGFyICpzLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXApOworVExJX0RFRklORV9FTlVNX0lOVEVSTkFMKHZzcHJpbnRmKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInZzcHJpbnRmIikKKy8vLyBpbnQgdnNzY2FuZihjb25zdCBjaGFyICpzLCBjb25zdCBjaGFyICpmb3JtYXQsIHZhX2xpc3QgYXJnKTsKK1RMSV9ERUZJTkVfRU5VTV9JTlRFUk5BTCh2c3NjYW5mKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoInZzc2NhbmYiKQorLy8vIHNpemVfdCB3Y3NsZW4gKGNvbnN0IHdjaGFyX3QqIHdjcyk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwod2NzbGVuKQorVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwoIndjc2xlbiIpCisvLy8gc3NpemVfdCB3cml0ZShpbnQgZmlsZGVzLCBjb25zdCB2b2lkICpidWYsIHNpemVfdCBuYnl0ZSk7CitUTElfREVGSU5FX0VOVU1fSU5URVJOQUwod3JpdGUpCitUTElfREVGSU5FX1NUUklOR19JTlRFUk5BTCgid3JpdGUiKQorCisjdW5kZWYgVExJX0RFRklORV9FTlVNX0lOVEVSTkFMCisjdW5kZWYgVExJX0RFRklORV9TVFJJTkdfSU5URVJOQUwKKyNlbmRpZiAgLy8gT25lIG9mIFRMSV9ERUZJTkVfRU5VTS9TVFJJTkcgYXJlIGRlZmluZWQuCisKKyN1bmRlZiBUTElfREVGSU5FX0VOVU0KKyN1bmRlZiBUTElfREVGSU5FX1NUUklORwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9UYXJnZXRMaWJyYXJ5SW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9UYXJnZXRMaWJyYXJ5SW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZmU4MzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1RhcmdldExpYnJhcnlJbmZvLmgKQEAgLTAsMCArMSwzOTQgQEAKKy8vPT09LS0gVGFyZ2V0TGlicmFyeUluZm8uaCAtIExpYnJhcnkgaW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19UQVJHRVRMSUJSQVJZSU5GT19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfVEFSR0VUTElCUkFSWUlORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1RyaXBsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheVJlZjsKKworLy8vIERlc2NyaWJlcyBhIHBvc3NpYmxlIHZlY3Rvcml6YXRpb24gb2YgYSBmdW5jdGlvbi4KKy8vLyBGdW5jdGlvbiAnVmVjdG9yRm5OYW1lJyBpcyBlcXVpdmFsZW50IHRvICdTY2FsYXJGbk5hbWUnIHZlY3Rvcml6ZWQKKy8vLyBieSBhIGZhY3RvciAnVmVjdG9yaXphdGlvbkZhY3RvcicuCitzdHJ1Y3QgVmVjRGVzYyB7CisgIFN0cmluZ1JlZiBTY2FsYXJGbk5hbWU7CisgIFN0cmluZ1JlZiBWZWN0b3JGbk5hbWU7CisgIHVuc2lnbmVkIFZlY3Rvcml6YXRpb25GYWN0b3I7Cit9OworCisgIGVudW0gTGliRnVuYyB7CisjZGVmaW5lIFRMSV9ERUZJTkVfRU5VTQorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvVGFyZ2V0TGlicmFyeUluZm8uZGVmIgorCisgICAgTnVtTGliRnVuY3MKKyAgfTsKKworLy8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSB0YXJnZXQgbGlicmFyeSBpbmZvcm1hdGlvbi4KKy8vLworLy8vIFRoaXMgY2xhc3MgY29uc3RydWN0cyB0YWJsZXMgdGhhdCBob2xkIHRoZSB0YXJnZXQgbGlicmFyeSBpbmZvcm1hdGlvbiBhbmQKKy8vLyBtYWtlIGl0IGF2YWlsYWJsZS4gSG93ZXZlciwgaXQgaXMgc29tZXdoYXQgZXhwZW5zaXZlIHRvIGNvbXB1dGUgYW5kIG9ubHkKKy8vLyBkZXBlbmRzIG9uIHRoZSB0cmlwbGUuIFNvIHVzZXJzIHR5cGljYWxseSBpbnRlcmFjdCB3aXRoIHRoZSBcYworLy8vIFRhcmdldExpYnJhcnlJbmZvIHdyYXBwZXIgYmVsb3cuCitjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mb0ltcGwgeworICBmcmllbmQgY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CisKKyAgdW5zaWduZWQgY2hhciBBdmFpbGFibGVBcnJheVsoTnVtTGliRnVuY3MrMykvNF07CisgIGxsdm06OkRlbnNlTWFwPHVuc2lnbmVkLCBzdGQ6OnN0cmluZz4gQ3VzdG9tTmFtZXM7CisgIHN0YXRpYyBTdHJpbmdSZWYgY29uc3QgU3RhbmRhcmROYW1lc1tOdW1MaWJGdW5jc107CisgIGJvb2wgU2hvdWxkRXh0STMyUGFyYW0sIFNob3VsZEV4dEkzMlJldHVybiwgU2hvdWxkU2lnbkV4dEkzMlBhcmFtOworCisgIGVudW0gQXZhaWxhYmlsaXR5U3RhdGUgeworICAgIFN0YW5kYXJkTmFtZSA9IDMsIC8vIChtZW1zZXQgdG8gYWxsIG9uZXMpCisgICAgQ3VzdG9tTmFtZSA9IDEsCisgICAgVW5hdmFpbGFibGUgPSAwICAvLyAobWVtc2V0IHRvIGFsbCB6ZXJvcykKKyAgfTsKKyAgdm9pZCBzZXRTdGF0ZShMaWJGdW5jIEYsIEF2YWlsYWJpbGl0eVN0YXRlIFN0YXRlKSB7CisgICAgQXZhaWxhYmxlQXJyYXlbRi80XSAmPSB+KDMgPDwgMiooRiYzKSk7CisgICAgQXZhaWxhYmxlQXJyYXlbRi80XSB8PSBTdGF0ZSA8PCAyKihGJjMpOworICB9CisgIEF2YWlsYWJpbGl0eVN0YXRlIGdldFN0YXRlKExpYkZ1bmMgRikgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxBdmFpbGFiaWxpdHlTdGF0ZT4oKEF2YWlsYWJsZUFycmF5W0YvNF0gPj4gMiooRiYzKSkgJiAzKTsKKyAgfQorCisgIC8vLyBWZWN0b3JpemF0aW9uIGRlc2NyaXB0b3JzIC0gc29ydGVkIGJ5IFNjYWxhckZuTmFtZS4KKyAgc3RkOjp2ZWN0b3I8VmVjRGVzYz4gVmVjdG9yRGVzY3M7CisgIC8vLyBTY2FsYXJpemF0aW9uIGRlc2NyaXB0b3JzIC0gc2FtZSBjb250ZW50IGFzIFZlY3RvckRlc2NzIGJ1dCBzb3J0ZWQgYmFzZWQKKyAgLy8vIG9uIFZlY3RvckZuTmFtZSByYXRoZXIgdGhhbiBTY2FsYXJGbk5hbWUuCisgIHN0ZDo6dmVjdG9yPFZlY0Rlc2M+IFNjYWxhckRlc2NzOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gdHlwZSBGVHkgaXMgdmFsaWQgZm9yIHRoZSBsaWJyYXJ5IGZ1bmN0aW9uCisgIC8vLyBGLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGlzIGF2YWlsYWJsZS4KKyAgYm9vbCBpc1ZhbGlkUHJvdG9Gb3JMaWJGdW5jKGNvbnN0IEZ1bmN0aW9uVHlwZSAmRlR5LCBMaWJGdW5jIEYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICpETCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIExpc3Qgb2Yga25vd24gdmVjdG9yLWZ1bmN0aW9ucyBsaWJyYXJpZXMuCisgIC8vLworICAvLy8gVGhlIHZlY3Rvci1mdW5jdGlvbnMgbGlicmFyeSBkZWZpbmVzLCB3aGljaCBmdW5jdGlvbnMgYXJlIHZlY3Rvcml6YWJsZQorICAvLy8gYW5kIHdpdGggd2hpY2ggZmFjdG9yLiBUaGUgbGlicmFyeSBjYW4gYmUgc3BlY2lmaWVkIGJ5IGVpdGhlciBmcm9udGVuZCwKKyAgLy8vIG9yIGEgY29tbWFuZGxpbmUgb3B0aW9uLCBhbmQgdGhlbiB1c2VkIGJ5CisgIC8vLyBhZGRWZWN0b3JpemFibGVGdW5jdGlvbnNGcm9tVmVjTGliIGZvciBmaWxsaW5nIHVwIHRoZSB0YWJsZXMgb2YKKyAgLy8vIHZlY3Rvcml6YWJsZSBmdW5jdGlvbnMuCisgIGVudW0gVmVjdG9yTGlicmFyeSB7CisgICAgTm9MaWJyYXJ5LCAgLy8gRG9uJ3QgdXNlIGFueSB2ZWN0b3IgbGlicmFyeS4KKyAgICBBY2NlbGVyYXRlLCAvLyBVc2UgQWNjZWxlcmF0ZSBmcmFtZXdvcmsuCisgICAgU1ZNTCAgICAgICAgLy8gSW50ZWwgc2hvcnQgdmVjdG9yIG1hdGggbGlicmFyeS4KKyAgfTsKKworICBUYXJnZXRMaWJyYXJ5SW5mb0ltcGwoKTsKKyAgZXhwbGljaXQgVGFyZ2V0TGlicmFyeUluZm9JbXBsKGNvbnN0IFRyaXBsZSAmVCk7CisKKyAgLy8gUHJvdmlkZSB2YWx1ZSBzZW1hbnRpY3MuCisgIFRhcmdldExpYnJhcnlJbmZvSW1wbChjb25zdCBUYXJnZXRMaWJyYXJ5SW5mb0ltcGwgJlRMSSk7CisgIFRhcmdldExpYnJhcnlJbmZvSW1wbChUYXJnZXRMaWJyYXJ5SW5mb0ltcGwgJiZUTEkpOworICBUYXJnZXRMaWJyYXJ5SW5mb0ltcGwgJm9wZXJhdG9yPShjb25zdCBUYXJnZXRMaWJyYXJ5SW5mb0ltcGwgJlRMSSk7CisgIFRhcmdldExpYnJhcnlJbmZvSW1wbCAmb3BlcmF0b3I9KFRhcmdldExpYnJhcnlJbmZvSW1wbCAmJlRMSSk7CisKKyAgLy8vIFNlYXJjaGVzIGZvciBhIHBhcnRpY3VsYXIgZnVuY3Rpb24gbmFtZS4KKyAgLy8vCisgIC8vLyBJZiBpdCBpcyBvbmUgb2YgdGhlIGtub3duIGxpYnJhcnkgZnVuY3Rpb25zLCByZXR1cm4gdHJ1ZSBhbmQgc2V0IEYgdG8gdGhlCisgIC8vLyBjb3JyZXNwb25kaW5nIHZhbHVlLgorICBib29sIGdldExpYkZ1bmMoU3RyaW5nUmVmIGZ1bmNOYW1lLCBMaWJGdW5jICZGKSBjb25zdDsKKworICAvLy8gU2VhcmNoZXMgZm9yIGEgcGFydGljdWxhciBmdW5jdGlvbiBuYW1lLCBhbHNvIGNoZWNraW5nIHRoYXQgaXRzIHR5cGUgaXMKKyAgLy8vIHZhbGlkIGZvciB0aGUgbGlicmFyeSBmdW5jdGlvbiBtYXRjaGluZyB0aGF0IG5hbWUuCisgIC8vLworICAvLy8gSWYgaXQgaXMgb25lIG9mIHRoZSBrbm93biBsaWJyYXJ5IGZ1bmN0aW9ucywgcmV0dXJuIHRydWUgYW5kIHNldCBGIHRvIHRoZQorICAvLy8gY29ycmVzcG9uZGluZyB2YWx1ZS4KKyAgYm9vbCBnZXRMaWJGdW5jKGNvbnN0IEZ1bmN0aW9uICZGRGVjbCwgTGliRnVuYyAmRikgY29uc3Q7CisKKyAgLy8vIEZvcmNlcyBhIGZ1bmN0aW9uIHRvIGJlIG1hcmtlZCBhcyB1bmF2YWlsYWJsZS4KKyAgdm9pZCBzZXRVbmF2YWlsYWJsZShMaWJGdW5jIEYpIHsKKyAgICBzZXRTdGF0ZShGLCBVbmF2YWlsYWJsZSk7CisgIH0KKworICAvLy8gRm9yY2VzIGEgZnVuY3Rpb24gdG8gYmUgbWFya2VkIGFzIGF2YWlsYWJsZS4KKyAgdm9pZCBzZXRBdmFpbGFibGUoTGliRnVuYyBGKSB7CisgICAgc2V0U3RhdGUoRiwgU3RhbmRhcmROYW1lKTsKKyAgfQorCisgIC8vLyBGb3JjZXMgYSBmdW5jdGlvbiB0byBiZSBtYXJrZWQgYXMgYXZhaWxhYmxlIGFuZCBwcm92aWRlIGFuIGFsdGVybmF0ZSBuYW1lCisgIC8vLyB0aGF0IG11c3QgYmUgdXNlZC4KKyAgdm9pZCBzZXRBdmFpbGFibGVXaXRoTmFtZShMaWJGdW5jIEYsIFN0cmluZ1JlZiBOYW1lKSB7CisgICAgaWYgKFN0YW5kYXJkTmFtZXNbRl0gIT0gTmFtZSkgeworICAgICAgc2V0U3RhdGUoRiwgQ3VzdG9tTmFtZSk7CisgICAgICBDdXN0b21OYW1lc1tGXSA9IE5hbWU7CisgICAgICBhc3NlcnQoQ3VzdG9tTmFtZXMuZmluZChGKSAhPSBDdXN0b21OYW1lcy5lbmQoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHNldFN0YXRlKEYsIFN0YW5kYXJkTmFtZSk7CisgICAgfQorICB9CisKKyAgLy8vIERpc2FibGVzIGFsbCBidWlsdGlucy4KKyAgLy8vCisgIC8vLyBUaGlzIGNhbiBiZSB1c2VkIGZvciBvcHRpb25zIGxpa2UgLWZuby1idWlsdGluLgorICB2b2lkIGRpc2FibGVBbGxGdW5jdGlvbnMoKTsKKworICAvLy8gQWRkIGEgc2V0IG9mIHNjYWxhciAtPiB2ZWN0b3IgbWFwcGluZ3MsIHF1ZXJ5YWJsZSB2aWEKKyAgLy8vIGdldFZlY3Rvcml6ZWRGdW5jdGlvbiBhbmQgZ2V0U2NhbGFyaXplZEZ1bmN0aW9uLgorICB2b2lkIGFkZFZlY3Rvcml6YWJsZUZ1bmN0aW9ucyhBcnJheVJlZjxWZWNEZXNjPiBGbnMpOworCisgIC8vLyBDYWxscyBhZGRWZWN0b3JpemFibGVGdW5jdGlvbnMgd2l0aCBhIGtub3duIHByZXNldCBvZiBmdW5jdGlvbnMgZm9yIHRoZQorICAvLy8gZ2l2ZW4gdmVjdG9yIGxpYnJhcnkuCisgIHZvaWQgYWRkVmVjdG9yaXphYmxlRnVuY3Rpb25zRnJvbVZlY0xpYihlbnVtIFZlY3RvckxpYnJhcnkgVmVjTGliKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGZ1bmN0aW9uIEYgaGFzIGEgdmVjdG9yIGVxdWl2YWxlbnQgd2l0aCB2ZWN0b3JpemF0aW9uCisgIC8vLyBmYWN0b3IgVkYuCisgIGJvb2wgaXNGdW5jdGlvblZlY3Rvcml6YWJsZShTdHJpbmdSZWYgRiwgdW5zaWduZWQgVkYpIGNvbnN0IHsKKyAgICByZXR1cm4gIWdldFZlY3Rvcml6ZWRGdW5jdGlvbihGLCBWRikuZW1wdHkoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gRiBoYXMgYSB2ZWN0b3IgZXF1aXZhbGVudCB3aXRoIGFueQorICAvLy8gdmVjdG9yaXphdGlvbiBmYWN0b3IuCisgIGJvb2wgaXNGdW5jdGlvblZlY3Rvcml6YWJsZShTdHJpbmdSZWYgRikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgZXF1aXZhbGVudCBvZiBGLCB2ZWN0b3JpemVkIHdpdGggZmFjdG9yIFZGLiBJZiBubworICAvLy8gc3VjaCBtYXBwaW5nIGV4aXN0cywgcmV0dXJuIHRoZSBlbXB0eSBzdHJpbmcuCisgIFN0cmluZ1JlZiBnZXRWZWN0b3JpemVkRnVuY3Rpb24oU3RyaW5nUmVmIEYsIHVuc2lnbmVkIFZGKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGZ1bmN0aW9uIEYgaGFzIGEgc2NhbGFyIGVxdWl2YWxlbnQsIGFuZCBzZXQgVkYgdG8gYmUKKyAgLy8vIHRoZSB2ZWN0b3JpemF0aW9uIGZhY3Rvci4KKyAgYm9vbCBpc0Z1bmN0aW9uU2NhbGFyaXphYmxlKFN0cmluZ1JlZiBGLCB1bnNpZ25lZCAmVkYpIGNvbnN0IHsKKyAgICByZXR1cm4gIWdldFNjYWxhcml6ZWRGdW5jdGlvbihGLCBWRikuZW1wdHkoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGVxdWl2YWxlbnQgb2YgRiwgc2NhbGFyaXplZC4gSWYgbm8gc3VjaCBtYXBwaW5nCisgIC8vLyBleGlzdHMsIHJldHVybiB0aGUgZW1wdHkgc3RyaW5nLgorICAvLy8KKyAgLy8vIFNldCBWRiB0byB0aGUgdmVjdG9yaXphdGlvbiBmYWN0b3IuCisgIFN0cmluZ1JlZiBnZXRTY2FsYXJpemVkRnVuY3Rpb24oU3RyaW5nUmVmIEYsIHVuc2lnbmVkICZWRikgY29uc3Q7CisKKyAgLy8vIFNldCB0byB0cnVlIGlmZiBpMzIgcGFyYW1ldGVycyB0byBsaWJyYXJ5IGZ1bmN0aW9ucyBzaG91bGQgaGF2ZSBzaWduZXh0CisgIC8vLyBvciB6ZXJvZXh0IGF0dHJpYnV0ZXMgaWYgdGhleSBjb3JyZXNwb25kIHRvIEMtbGV2ZWwgaW50IG9yIHVuc2lnbmVkIGludCwKKyAgLy8vIHJlc3BlY3RpdmVseS4KKyAgdm9pZCBzZXRTaG91bGRFeHRJMzJQYXJhbShib29sIFZhbCkgeworICAgIFNob3VsZEV4dEkzMlBhcmFtID0gVmFsOworICB9CisKKyAgLy8vIFNldCB0byB0cnVlIGlmZiBpMzIgcmVzdWx0cyBmcm9tIGxpYnJhcnkgZnVuY3Rpb25zIHNob3VsZCBoYXZlIHNpZ25leHQKKyAgLy8vIG9yIHplcm9leHQgYXR0cmlidXRlcyBpZiB0aGV5IGNvcnJlc3BvbmQgdG8gQy1sZXZlbCBpbnQgb3IgdW5zaWduZWQgaW50LAorICAvLy8gcmVzcGVjdGl2ZWx5LgorICB2b2lkIHNldFNob3VsZEV4dEkzMlJldHVybihib29sIFZhbCkgeworICAgIFNob3VsZEV4dEkzMlJldHVybiA9IFZhbDsKKyAgfQorCisgIC8vLyBTZXQgdG8gdHJ1ZSBpZmYgaTMyIHBhcmFtZXRlcnMgdG8gbGlicmFyeSBmdW5jdGlvbnMgc2hvdWxkIGhhdmUgc2lnbmV4dAorICAvLy8gYXR0cmlidXRlIGlmIHRoZXkgY29ycmVzcG9uZCB0byBDLWxldmVsIGludCBvciB1bnNpZ25lZCBpbnQuCisgIHZvaWQgc2V0U2hvdWxkU2lnbkV4dEkzMlBhcmFtKGJvb2wgVmFsKSB7CisgICAgU2hvdWxkU2lnbkV4dEkzMlBhcmFtID0gVmFsOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHdjaGFyX3QgdHlwZSBpbiBieXRlcyBvciAwIGlmIHRoZSBzaXplIGlzIHVua25vd24uCisgIC8vLyBUaGlzIHF1ZXJpZXMgdGhlICd3Y2hhcl9zaXplJyBtZXRhZGF0YS4KKyAgdW5zaWduZWQgZ2V0V0NoYXJTaXplKGNvbnN0IE1vZHVsZSAmTSkgY29uc3Q7Cit9OworCisvLy8gUHJvdmlkZXMgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCBsaWJyYXJ5IGZ1bmN0aW9ucyBhcmUgYXZhaWxhYmxlIGZvcgorLy8vIHRoZSBjdXJyZW50IHRhcmdldC4KKy8vLworLy8vIFRoaXMgYm90aCBhbGxvd3Mgb3B0aW1pemF0aW9ucyB0byBoYW5kbGUgdGhlbSBzcGVjaWFsbHkgYW5kIGZyb250ZW5kcyB0bworLy8vIGRpc2FibGUgc3VjaCBvcHRpbWl6YXRpb25zIHRocm91Z2ggLWZuby1idWlsdGluIGV0Yy4KK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvIHsKKyAgZnJpZW5kIGNsYXNzIFRhcmdldExpYnJhcnlBbmFseXNpczsKKyAgZnJpZW5kIGNsYXNzIFRhcmdldExpYnJhcnlJbmZvV3JhcHBlclBhc3M7CisKKyAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm9JbXBsICpJbXBsOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFRhcmdldExpYnJhcnlJbmZvKGNvbnN0IFRhcmdldExpYnJhcnlJbmZvSW1wbCAmSW1wbCkgOiBJbXBsKCZJbXBsKSB7fQorCisgIC8vIFByb3ZpZGUgdmFsdWUgc2VtYW50aWNzLgorICBUYXJnZXRMaWJyYXJ5SW5mbyhjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAmVExJKSA6IEltcGwoVExJLkltcGwpIHt9CisgIFRhcmdldExpYnJhcnlJbmZvKFRhcmdldExpYnJhcnlJbmZvICYmVExJKSA6IEltcGwoVExJLkltcGwpIHt9CisgIFRhcmdldExpYnJhcnlJbmZvICZvcGVyYXRvcj0oY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gJlRMSSkgeworICAgIEltcGwgPSBUTEkuSW1wbDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgVGFyZ2V0TGlicmFyeUluZm8gJm9wZXJhdG9yPShUYXJnZXRMaWJyYXJ5SW5mbyAmJlRMSSkgeworICAgIEltcGwgPSBUTEkuSW1wbDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gU2VhcmNoZXMgZm9yIGEgcGFydGljdWxhciBmdW5jdGlvbiBuYW1lLgorICAvLy8KKyAgLy8vIElmIGl0IGlzIG9uZSBvZiB0aGUga25vd24gbGlicmFyeSBmdW5jdGlvbnMsIHJldHVybiB0cnVlIGFuZCBzZXQgRiB0byB0aGUKKyAgLy8vIGNvcnJlc3BvbmRpbmcgdmFsdWUuCisgIGJvb2wgZ2V0TGliRnVuYyhTdHJpbmdSZWYgZnVuY05hbWUsIExpYkZ1bmMgJkYpIGNvbnN0IHsKKyAgICByZXR1cm4gSW1wbC0+Z2V0TGliRnVuYyhmdW5jTmFtZSwgRik7CisgIH0KKworICBib29sIGdldExpYkZ1bmMoY29uc3QgRnVuY3Rpb24gJkZEZWNsLCBMaWJGdW5jICZGKSBjb25zdCB7CisgICAgcmV0dXJuIEltcGwtPmdldExpYkZ1bmMoRkRlY2wsIEYpOworICB9CisKKyAgLy8vIElmIGEgY2FsbHNpdGUgZG9lcyBub3QgaGF2ZSB0aGUgJ25vYnVpbHRpbicgYXR0cmlidXRlLCByZXR1cm4gaWYgdGhlCisgIC8vLyBjYWxsZWQgZnVuY3Rpb24gaXMgYSBrbm93biBsaWJyYXJ5IGZ1bmN0aW9uIGFuZCBzZXQgRiB0byB0aGF0IGZ1bmN0aW9uLgorICBib29sIGdldExpYkZ1bmMoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsIExpYkZ1bmMgJkYpIGNvbnN0IHsKKyAgICByZXR1cm4gIUNTLmlzTm9CdWlsdGluKCkgJiYgQ1MuZ2V0Q2FsbGVkRnVuY3Rpb24oKSAmJgorICAgICAgICAgICBnZXRMaWJGdW5jKCooQ1MuZ2V0Q2FsbGVkRnVuY3Rpb24oKSksIEYpOworICB9CisKKyAgLy8vIFRlc3RzIHdoZXRoZXIgYSBsaWJyYXJ5IGZ1bmN0aW9uIGlzIGF2YWlsYWJsZS4KKyAgYm9vbCBoYXMoTGliRnVuYyBGKSBjb25zdCB7CisgICAgcmV0dXJuIEltcGwtPmdldFN0YXRlKEYpICE9IFRhcmdldExpYnJhcnlJbmZvSW1wbDo6VW5hdmFpbGFibGU7CisgIH0KKyAgYm9vbCBpc0Z1bmN0aW9uVmVjdG9yaXphYmxlKFN0cmluZ1JlZiBGLCB1bnNpZ25lZCBWRikgY29uc3QgeworICAgIHJldHVybiBJbXBsLT5pc0Z1bmN0aW9uVmVjdG9yaXphYmxlKEYsIFZGKTsKKyAgfQorICBib29sIGlzRnVuY3Rpb25WZWN0b3JpemFibGUoU3RyaW5nUmVmIEYpIGNvbnN0IHsKKyAgICByZXR1cm4gSW1wbC0+aXNGdW5jdGlvblZlY3Rvcml6YWJsZShGKTsKKyAgfQorICBTdHJpbmdSZWYgZ2V0VmVjdG9yaXplZEZ1bmN0aW9uKFN0cmluZ1JlZiBGLCB1bnNpZ25lZCBWRikgY29uc3QgeworICAgIHJldHVybiBJbXBsLT5nZXRWZWN0b3JpemVkRnVuY3Rpb24oRiwgVkYpOworICB9CisKKyAgLy8vIFRlc3RzIGlmIHRoZSBmdW5jdGlvbiBpcyBib3RoIGF2YWlsYWJsZSBhbmQgYSBjYW5kaWRhdGUgZm9yIG9wdGltaXplZCBjb2RlCisgIC8vLyBnZW5lcmF0aW9uLgorICBib29sIGhhc09wdGltaXplZENvZGVHZW4oTGliRnVuYyBGKSBjb25zdCB7CisgICAgaWYgKEltcGwtPmdldFN0YXRlKEYpID09IFRhcmdldExpYnJhcnlJbmZvSW1wbDo6VW5hdmFpbGFibGUpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgc3dpdGNoIChGKSB7CisgICAgZGVmYXVsdDogYnJlYWs7CisgICAgY2FzZSBMaWJGdW5jX2NvcHlzaWduOiAgICAgY2FzZSBMaWJGdW5jX2NvcHlzaWduZjogIGNhc2UgTGliRnVuY19jb3B5c2lnbmw6CisgICAgY2FzZSBMaWJGdW5jX2ZhYnM6ICAgICAgICAgY2FzZSBMaWJGdW5jX2ZhYnNmOiAgICAgIGNhc2UgTGliRnVuY19mYWJzbDoKKyAgICBjYXNlIExpYkZ1bmNfc2luOiAgICAgICAgICBjYXNlIExpYkZ1bmNfc2luZjogICAgICAgY2FzZSBMaWJGdW5jX3Npbmw6CisgICAgY2FzZSBMaWJGdW5jX2NvczogICAgICAgICAgY2FzZSBMaWJGdW5jX2Nvc2Y6ICAgICAgIGNhc2UgTGliRnVuY19jb3NsOgorICAgIGNhc2UgTGliRnVuY19zcXJ0OiAgICAgICAgIGNhc2UgTGliRnVuY19zcXJ0ZjogICAgICBjYXNlIExpYkZ1bmNfc3FydGw6CisgICAgY2FzZSBMaWJGdW5jX3NxcnRfZmluaXRlOiAgY2FzZSBMaWJGdW5jX3NxcnRmX2Zpbml0ZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgTGliRnVuY19zcXJ0bF9maW5pdGU6CisgICAgY2FzZSBMaWJGdW5jX2ZtYXg6ICAgICAgICAgY2FzZSBMaWJGdW5jX2ZtYXhmOiAgICAgIGNhc2UgTGliRnVuY19mbWF4bDoKKyAgICBjYXNlIExpYkZ1bmNfZm1pbjogICAgICAgICBjYXNlIExpYkZ1bmNfZm1pbmY6ICAgICAgY2FzZSBMaWJGdW5jX2ZtaW5sOgorICAgIGNhc2UgTGliRnVuY19mbG9vcjogICAgICAgIGNhc2UgTGliRnVuY19mbG9vcmY6ICAgICBjYXNlIExpYkZ1bmNfZmxvb3JsOgorICAgIGNhc2UgTGliRnVuY19uZWFyYnlpbnQ6ICAgIGNhc2UgTGliRnVuY19uZWFyYnlpbnRmOiBjYXNlIExpYkZ1bmNfbmVhcmJ5aW50bDoKKyAgICBjYXNlIExpYkZ1bmNfY2VpbDogICAgICAgICBjYXNlIExpYkZ1bmNfY2VpbGY6ICAgICAgY2FzZSBMaWJGdW5jX2NlaWxsOgorICAgIGNhc2UgTGliRnVuY19yaW50OiAgICAgICAgIGNhc2UgTGliRnVuY19yaW50ZjogICAgICBjYXNlIExpYkZ1bmNfcmludGw6CisgICAgY2FzZSBMaWJGdW5jX3JvdW5kOiAgICAgICAgY2FzZSBMaWJGdW5jX3JvdW5kZjogICAgIGNhc2UgTGliRnVuY19yb3VuZGw6CisgICAgY2FzZSBMaWJGdW5jX3RydW5jOiAgICAgICAgY2FzZSBMaWJGdW5jX3RydW5jZjogICAgIGNhc2UgTGliRnVuY190cnVuY2w6CisgICAgY2FzZSBMaWJGdW5jX2xvZzI6ICAgICAgICAgY2FzZSBMaWJGdW5jX2xvZzJmOiAgICAgIGNhc2UgTGliRnVuY19sb2cybDoKKyAgICBjYXNlIExpYkZ1bmNfZXhwMjogICAgICAgICBjYXNlIExpYkZ1bmNfZXhwMmY6ICAgICAgY2FzZSBMaWJGdW5jX2V4cDJsOgorICAgIGNhc2UgTGliRnVuY19tZW1jbXA6ICAgICAgIGNhc2UgTGliRnVuY19zdHJjbXA6ICAgICBjYXNlIExpYkZ1bmNfc3RyY3B5OgorICAgIGNhc2UgTGliRnVuY19zdHBjcHk6ICAgICAgIGNhc2UgTGliRnVuY19zdHJsZW46ICAgICBjYXNlIExpYkZ1bmNfc3RybmxlbjoKKyAgICBjYXNlIExpYkZ1bmNfbWVtY2hyOiAgICAgICBjYXNlIExpYkZ1bmNfbWVtcGNweToKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBTdHJpbmdSZWYgZ2V0TmFtZShMaWJGdW5jIEYpIGNvbnN0IHsKKyAgICBhdXRvIFN0YXRlID0gSW1wbC0+Z2V0U3RhdGUoRik7CisgICAgaWYgKFN0YXRlID09IFRhcmdldExpYnJhcnlJbmZvSW1wbDo6VW5hdmFpbGFibGUpCisgICAgICByZXR1cm4gU3RyaW5nUmVmKCk7CisgICAgaWYgKFN0YXRlID09IFRhcmdldExpYnJhcnlJbmZvSW1wbDo6U3RhbmRhcmROYW1lKQorICAgICAgcmV0dXJuIEltcGwtPlN0YW5kYXJkTmFtZXNbRl07CisgICAgYXNzZXJ0KFN0YXRlID09IFRhcmdldExpYnJhcnlJbmZvSW1wbDo6Q3VzdG9tTmFtZSk7CisgICAgcmV0dXJuIEltcGwtPkN1c3RvbU5hbWVzLmZpbmQoRiktPnNlY29uZDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGV4dGVuc2lvbiBhdHRyaWJ1dGUga2luZCB0byBiZSB1c2VkIGZvciBpMzIgcGFyYW1ldGVycworICAvLy8gY29ycmVzcG9uZGluZyB0byBDLWxldmVsIGludCBvciB1bnNpZ25lZCBpbnQuICBNYXkgYmUgemVyb2V4dCwgc2lnbmV4dCwKKyAgLy8vIG9yIG5vbmUuCisgIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0RXh0QXR0ckZvckkzMlBhcmFtKGJvb2wgU2lnbmVkID0gdHJ1ZSkgY29uc3QgeworICAgIGlmIChJbXBsLT5TaG91bGRFeHRJMzJQYXJhbSkKKyAgICAgIHJldHVybiBTaWduZWQgPyBBdHRyaWJ1dGU6OlNFeHQgOiBBdHRyaWJ1dGU6OlpFeHQ7CisgICAgaWYgKEltcGwtPlNob3VsZFNpZ25FeHRJMzJQYXJhbSkKKyAgICAgIHJldHVybiBBdHRyaWJ1dGU6OlNFeHQ7CisgICAgcmV0dXJuIEF0dHJpYnV0ZTo6Tm9uZTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGV4dGVuc2lvbiBhdHRyaWJ1dGUga2luZCB0byBiZSB1c2VkIGZvciBpMzIgcmV0dXJuIHZhbHVlcworICAvLy8gY29ycmVzcG9uZGluZyB0byBDLWxldmVsIGludCBvciB1bnNpZ25lZCBpbnQuICBNYXkgYmUgemVyb2V4dCwgc2lnbmV4dCwKKyAgLy8vIG9yIG5vbmUuCisgIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0RXh0QXR0ckZvckkzMlJldHVybihib29sIFNpZ25lZCA9IHRydWUpIGNvbnN0IHsKKyAgICBpZiAoSW1wbC0+U2hvdWxkRXh0STMyUmV0dXJuKQorICAgICAgcmV0dXJuIFNpZ25lZCA/IEF0dHJpYnV0ZTo6U0V4dCA6IEF0dHJpYnV0ZTo6WkV4dDsKKyAgICByZXR1cm4gQXR0cmlidXRlOjpOb25lOworICB9CisKKyAgLy8vIFxjb3B5ZG9jIFRhcmdldExpYnJhcnlJbmZvSW1wbDo6Z2V0V0NoYXJTaXplKCkKKyAgdW5zaWduZWQgZ2V0V0NoYXJTaXplKGNvbnN0IE1vZHVsZSAmTSkgY29uc3QgeworICAgIHJldHVybiBJbXBsLT5nZXRXQ2hhclNpemUoTSk7CisgIH0KKworICAvLy8gSGFuZGxlIGludmFsaWRhdGlvbiBmcm9tIHRoZSBwYXNzIG1hbmFnZXIuCisgIC8vLworICAvLy8gSWYgd2UgdHJ5IHRvIGludmFsaWRhdGUgdGhpcyBpbmZvLCBqdXN0IHJldHVybiBmYWxzZS4gSXQgY2Fubm90IGJlY29tZQorICAvLy8gaW52YWxpZCBldmVuIGlmIHRoZSBtb2R1bGUgb3IgZnVuY3Rpb24gY2hhbmdlcy4KKyAgYm9vbCBpbnZhbGlkYXRlKE1vZHVsZSAmLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmLAorICAgICAgICAgICAgICAgICAgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyOjpJbnZhbGlkYXRvciAmKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGJvb2wgaW52YWxpZGF0ZShGdW5jdGlvbiAmLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmLAorICAgICAgICAgICAgICAgICAgRnVuY3Rpb25BbmFseXNpc01hbmFnZXI6OkludmFsaWRhdG9yICYpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8vLyBBbmFseXNpcyBwYXNzIHByb3ZpZGluZyB0aGUgXGMgVGFyZ2V0TGlicmFyeUluZm8uCisvLy8KKy8vLyBOb3RlIHRoYXQgdGhpcyBwYXNzJ3MgcmVzdWx0IGNhbm5vdCBiZSBpbnZhbGlkYXRlZCwgaXQgaXMgaW1tdXRhYmxlIGZvciB0aGUKKy8vLyBsaWZlIG9mIHRoZSBtb2R1bGUuCitjbGFzcyBUYXJnZXRMaWJyYXJ5QW5hbHlzaXMgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48VGFyZ2V0TGlicmFyeUFuYWx5c2lzPiB7CitwdWJsaWM6CisgIHR5cGVkZWYgVGFyZ2V0TGlicmFyeUluZm8gUmVzdWx0OworCisgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdCB0aGUgbGlicmFyeSBhbmFseXNpcy4KKyAgLy8vCisgIC8vLyBUaGlzIHdpbGwgdXNlIHRoZSBtb2R1bGUncyB0cmlwbGUgdG8gY29uc3RydWN0IHRoZSBsaWJyYXJ5IGluZm8gZm9yIHRoYXQKKyAgLy8vIG1vZHVsZS4KKyAgVGFyZ2V0TGlicmFyeUFuYWx5c2lzKCkge30KKworICAvLy8gQ29uc3RydWN0IGEgbGlicmFyeSBhbmFseXNpcyB3aXRoIHByZXNldCBpbmZvLgorICAvLy8KKyAgLy8vIFRoaXMgd2lsbCBkaXJlY3RseSBjb3B5IHRoZSBwcmVzZXQgaW5mbyBpbnRvIHRoZSByZXN1bHQgd2l0aG91dAorICAvLy8gY29uc3VsdGluZyB0aGUgbW9kdWxlJ3MgdHJpcGxlLgorICBUYXJnZXRMaWJyYXJ5QW5hbHlzaXMoVGFyZ2V0TGlicmFyeUluZm9JbXBsIFByZXNldEluZm9JbXBsKQorICAgICAgOiBQcmVzZXRJbmZvSW1wbChzdGQ6Om1vdmUoUHJlc2V0SW5mb0ltcGwpKSB7fQorCisgIFRhcmdldExpYnJhcnlJbmZvIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmKTsKKyAgVGFyZ2V0TGlicmFyeUluZm8gcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmKTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIEFuYWx5c2lzSW5mb01peGluPFRhcmdldExpYnJhcnlBbmFseXNpcz47CisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7CisKKyAgT3B0aW9uYWw8VGFyZ2V0TGlicmFyeUluZm9JbXBsPiBQcmVzZXRJbmZvSW1wbDsKKworICBTdHJpbmdNYXA8c3RkOjp1bmlxdWVfcHRyPFRhcmdldExpYnJhcnlJbmZvSW1wbD4+IEltcGxzOworCisgIFRhcmdldExpYnJhcnlJbmZvSW1wbCAmbG9va3VwSW5mb0ltcGwoY29uc3QgVHJpcGxlICZUKTsKK307CisKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvV3JhcHBlclBhc3MgOiBwdWJsaWMgSW1tdXRhYmxlUGFzcyB7CisgIFRhcmdldExpYnJhcnlJbmZvSW1wbCBUTElJbXBsOworICBUYXJnZXRMaWJyYXJ5SW5mbyBUTEk7CisKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworICBUYXJnZXRMaWJyYXJ5SW5mb1dyYXBwZXJQYXNzKCk7CisgIGV4cGxpY2l0IFRhcmdldExpYnJhcnlJbmZvV3JhcHBlclBhc3MoY29uc3QgVHJpcGxlICZUKTsKKyAgZXhwbGljaXQgVGFyZ2V0TGlicmFyeUluZm9XcmFwcGVyUGFzcyhjb25zdCBUYXJnZXRMaWJyYXJ5SW5mb0ltcGwgJlRMSSk7CisKKyAgVGFyZ2V0TGlicmFyeUluZm8gJmdldFRMSSgpIHsgcmV0dXJuIFRMSTsgfQorICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAmZ2V0VExJKCkgY29uc3QgeyByZXR1cm4gVExJOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVGFyZ2V0VHJhbnNmb3JtSW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9UYXJnZXRUcmFuc2Zvcm1JbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU5YzY2MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVGFyZ2V0VHJhbnNmb3JtSW5mby5oCkBAIC0wLDAgKzEsMTY2MiBAQAorLy89PT0tIFRhcmdldFRyYW5zZm9ybUluZm8uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIFRoaXMgcGFzcyBleHBvc2VzIGNvZGVnZW4gaW5mb3JtYXRpb24gdG8gSVItbGV2ZWwgcGFzc2VzLiBFdmVyeQorLy8vIHRyYW5zZm9ybWF0aW9uIHRoYXQgdXNlcyBjb2RlZ2VuIGluZm9ybWF0aW9uIGlzIGJyb2tlbiBpbnRvIHRocmVlIHBhcnRzOgorLy8vIDEuIFRoZSBJUi1sZXZlbCBhbmFseXNpcyBwYXNzLgorLy8vIDIuIFRoZSBJUi1sZXZlbCB0cmFuc2Zvcm1hdGlvbiBpbnRlcmZhY2Ugd2hpY2ggcHJvdmlkZXMgdGhlIG5lZWRlZAorLy8vICAgIGluZm9ybWF0aW9uLgorLy8vIDMuIENvZGVnZW4tbGV2ZWwgaW1wbGVtZW50YXRpb24gd2hpY2ggdXNlcyB0YXJnZXQtc3BlY2lmaWMgaG9va3MuCisvLy8KKy8vLyBUaGlzIGZpbGUgZGVmaW5lcyAjMiwgd2hpY2ggaXMgdGhlIGludGVyZmFjZSB0aGF0IElSLWxldmVsIHRyYW5zZm9ybWF0aW9ucworLy8vIHVzZSBmb3IgcXVlcnlpbmcgdGhlIGNvZGVnZW4uCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19UQVJHRVRUUkFOU0ZPUk1JTkZPX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19UQVJHRVRUUkFOU0ZPUk1JTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9JUi9PcGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQXRvbWljT3JkZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgSW50cmluc2ljIHsKK2VudW0gSUQgOiB1bnNpZ25lZDsKK30KKworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBHbG9iYWxWYWx1ZTsKK2NsYXNzIEludHJpbnNpY0luc3Q7CitjbGFzcyBMb2FkSW5zdDsKK2NsYXNzIExvb3A7CitjbGFzcyBTQ0VWOworY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworY2xhc3MgU3RvcmVJbnN0OworY2xhc3MgU3dpdGNoSW5zdDsKK2NsYXNzIFR5cGU7CitjbGFzcyBVc2VyOworY2xhc3MgVmFsdWU7CisKKy8vLyBcYnJpZWYgSW5mb3JtYXRpb24gYWJvdXQgYSBsb2FkL3N0b3JlIGludHJpbnNpYyBkZWZpbmVkIGJ5IHRoZSB0YXJnZXQuCitzdHJ1Y3QgTWVtSW50cmluc2ljSW5mbyB7CisgIC8vLyBUaGlzIGlzIHRoZSBwb2ludGVyIHRoYXQgdGhlIGludHJpbnNpYyBpcyBsb2FkaW5nIGZyb20gb3Igc3RvcmluZyB0by4KKyAgLy8vIElmIHRoaXMgaXMgbm9uLW51bGwsIHRoZW4gYW5hbHlzaXMvb3B0aW1pemF0aW9uIHBhc3NlcyBjYW4gYXNzdW1lIHRoYXQKKyAgLy8vIHRoaXMgaW50cmluc2ljIGlzIGZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIGEgbG9hZC9zdG9yZSBmcm9tIHRoaXMKKyAgLy8vIHBvaW50ZXIuCisgIFZhbHVlICpQdHJWYWwgPSBudWxscHRyOworCisgIC8vIE9yZGVyaW5nIGZvciBhdG9taWMgb3BlcmF0aW9ucy4KKyAgQXRvbWljT3JkZXJpbmcgT3JkZXJpbmcgPSBBdG9taWNPcmRlcmluZzo6Tm90QXRvbWljOworCisgIC8vIFNhbWUgSWQgaXMgc2V0IGJ5IHRoZSB0YXJnZXQgZm9yIGNvcnJlc3BvbmRpbmcgbG9hZC9zdG9yZSBpbnRyaW5zaWNzLgorICB1bnNpZ25lZCBzaG9ydCBNYXRjaGluZ0lkID0gMDsKKworICBib29sIFJlYWRNZW0gPSBmYWxzZTsKKyAgYm9vbCBXcml0ZU1lbSA9IGZhbHNlOworICBib29sIElzVm9sYXRpbGUgPSBmYWxzZTsKKworICBib29sIGlzVW5vcmRlcmVkKCkgY29uc3QgeworICAgIHJldHVybiAoT3JkZXJpbmcgPT0gQXRvbWljT3JkZXJpbmc6Ok5vdEF0b21pYyB8fAorICAgICAgICAgICAgT3JkZXJpbmcgPT0gQXRvbWljT3JkZXJpbmc6OlVub3JkZXJlZCkgJiYgIUlzVm9sYXRpbGU7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyBwYXNzIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgY29kZWdlbiBpbnRlcmZhY2VzIHRoYXQgYXJlIG5lZWRlZAorLy8vIGZvciBJUi1sZXZlbCB0cmFuc2Zvcm1hdGlvbnMuCitjbGFzcyBUYXJnZXRUcmFuc2Zvcm1JbmZvIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBUVEkgb2JqZWN0IHVzaW5nIGEgdHlwZSBpbXBsZW1lbnRpbmcgdGhlIFxjIENvbmNlcHQKKyAgLy8vIEFQSSBiZWxvdy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgYnkgdGFyZ2V0cyB0byBjb25zdHJ1Y3QgYSBUVEkgd3JhcHBpbmcgdGhlaXIgdGFyZ2V0LXNwZWNpZmljCisgIC8vLyBpbXBsZW1lbnRhaW9uIHRoYXQgZW5jb2RlcyBhcHByb3ByaWF0ZSBjb3N0cyBmb3IgdGhlaXIgdGFyZ2V0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVGFyZ2V0VHJhbnNmb3JtSW5mbyhUIEltcGwpOworCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgYmFzZWxpbmUgVFRJIG9iamVjdCB1c2luZyBhIG1pbmltYWwgaW1wbGVtZW50YXRpb24gb2YKKyAgLy8vIHRoZSBcYyBDb25jZXB0IEFQSSBiZWxvdy4KKyAgLy8vCisgIC8vLyBUaGUgVFRJIGltcGxlbWVudGF0aW9uIHdpbGwgcmVmbGVjdCB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIERhdGFMYXlvdXQKKyAgLy8vIHByb3ZpZGVkIGlmIG5vbi1udWxsLgorICBleHBsaWNpdCBUYXJnZXRUcmFuc2Zvcm1JbmZvKGNvbnN0IERhdGFMYXlvdXQgJkRMKTsKKworICAvLyBQcm92aWRlIG1vdmUgc2VtYW50aWNzLgorICBUYXJnZXRUcmFuc2Zvcm1JbmZvKFRhcmdldFRyYW5zZm9ybUluZm8gJiZBcmcpOworICBUYXJnZXRUcmFuc2Zvcm1JbmZvICZvcGVyYXRvcj0oVGFyZ2V0VHJhbnNmb3JtSW5mbyAmJlJIUyk7CisKKyAgLy8gV2UgbmVlZCB0byBkZWZpbmUgdGhlIGRlc3RydWN0b3Igb3V0LW9mLWxpbmUgdG8gZGVmaW5lIG91ciBzdWItY2xhc3NlcworICAvLyBvdXQtb2YtbGluZS4KKyAgflRhcmdldFRyYW5zZm9ybUluZm8oKTsKKworICAvLy8gXGJyaWVmIEhhbmRsZSB0aGUgaW52YWxpZGF0aW9uIG9mIHRoaXMgaW5mb3JtYXRpb24uCisgIC8vLworICAvLy8gV2hlbiB1c2VkIGFzIGEgcmVzdWx0IG9mIFxjIFRhcmdldElSQW5hbHlzaXMgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQKKyAgLy8vIHdoZW4gdGhlIGZ1bmN0aW9uIHRoaXMgd2FzIGNvbXB1dGVkIGZvciBjaGFuZ2VzLiBXaGVuIGl0IHJldHVybnMgZmFsc2UsCisgIC8vLyB0aGUgaW5mb3JtYXRpb24gaXMgcHJlc2VydmVkIGFjcm9zcyB0aG9zZSBjaGFuZ2VzLgorICBib29sIGludmFsaWRhdGUoRnVuY3Rpb24gJiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJiwKKyAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyOjpJbnZhbGlkYXRvciAmKSB7CisgICAgLy8gRklYTUU6IFdlIHNob3VsZCBwcm9iYWJseSBpbiBzb21lIHdheSBlbnN1cmUgdGhhdCB0aGUgc3VidGFyZ2V0CisgICAgLy8gaW5mb3JtYXRpb24gZm9yIGEgZnVuY3Rpb24gaGFzbid0IGNoYW5nZWQuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxuYW1lIEdlbmVyaWMgVGFyZ2V0IEluZm9ybWF0aW9uCisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgVGhlIGtpbmQgb2YgY29zdCBtb2RlbC4KKyAgLy8vCisgIC8vLyBUaGVyZSBhcmUgc2V2ZXJhbCBkaWZmZXJlbnQgY29zdCBtb2RlbHMgdGhhdCBjYW4gYmUgY3VzdG9taXplZCBieSB0aGUKKyAgLy8vIHRhcmdldC4gVGhlIG5vcm1hbGl6YXRpb24gb2YgZWFjaCBjb3N0IG1vZGVsIG1heSBiZSB0YXJnZXQgc3BlY2lmaWMuCisgIGVudW0gVGFyZ2V0Q29zdEtpbmQgeworICAgIFRDS19SZWNpcFRocm91Z2hwdXQsIC8vLzwgUmVjaXByb2NhbCB0aHJvdWdocHV0LgorICAgIFRDS19MYXRlbmN5LCAgICAgICAgIC8vLzwgVGhlIGxhdGVuY3kgb2YgaW5zdHJ1Y3Rpb24uCisgICAgVENLX0NvZGVTaXplICAgICAgICAgLy8vPCBJbnN0cnVjdGlvbiBjb2RlIHNpemUuCisgIH07CisKKyAgLy8vIFxicmllZiBRdWVyeSB0aGUgY29zdCBvZiBhIHNwZWNpZmllZCBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBDbGllbnRzIHNob3VsZCB1c2UgdGhpcyBpbnRlcmZhY2UgdG8gcXVlcnkgdGhlIGNvc3Qgb2YgYW4gZXhpc3RpbmcKKyAgLy8vIGluc3RydWN0aW9uLiBUaGUgaW5zdHJ1Y3Rpb24gbXVzdCBoYXZlIGEgdmFsaWQgcGFyZW50IChiYXNpYyBibG9jaykuCisgIC8vLworICAvLy8gTm90ZSwgdGhpcyBtZXRob2QgZG9lcyBub3QgY2FjaGUgdGhlIGNvc3QgY2FsY3VsYXRpb24gYW5kIGl0CisgIC8vLyBjYW4gYmUgZXhwZW5zaXZlIGluIHNvbWUgY2FzZXMuCisgIGludCBnZXRJbnN0cnVjdGlvbkNvc3QoY29uc3QgSW5zdHJ1Y3Rpb24gKkksIGVudW0gVGFyZ2V0Q29zdEtpbmQga2luZCkgY29uc3QgeworICAgIHN3aXRjaCAoa2luZCl7CisgICAgY2FzZSBUQ0tfUmVjaXBUaHJvdWdocHV0OgorICAgICAgcmV0dXJuIGdldEluc3RydWN0aW9uVGhyb3VnaHB1dChJKTsKKworICAgIGNhc2UgVENLX0xhdGVuY3k6CisgICAgICByZXR1cm4gZ2V0SW5zdHJ1Y3Rpb25MYXRlbmN5KEkpOworCisgICAgY2FzZSBUQ0tfQ29kZVNpemU6CisgICAgICByZXR1cm4gZ2V0VXNlckNvc3QoSSk7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gaW5zdHJ1Y3Rpb24gY29zdCBraW5kIik7CisgIH0KKworICAvLy8gXGJyaWVmIFVuZGVybHlpbmcgY29uc3RhbnRzIGZvciAnY29zdCcgdmFsdWVzIGluIHRoaXMgaW50ZXJmYWNlLgorICAvLy8KKyAgLy8vIE1hbnkgQVBJcyBpbiB0aGlzIGludGVyZmFjZSByZXR1cm4gYSBjb3N0LiBUaGlzIGVudW0gZGVmaW5lcyB0aGUKKyAgLy8vIGZ1bmRhbWVudGFsIHZhbHVlcyB0aGF0IHNob3VsZCBiZSB1c2VkIHRvIGludGVycHJldCAoYW5kIHByb2R1Y2UpIHRob3NlCisgIC8vLyBjb3N0cy4gVGhlIGNvc3RzIGFyZSByZXR1cm5lZCBhcyBhbiBpbnQgcmF0aGVyIHRoYW4gYSBtZW1iZXIgb2YgdGhpcworICAvLy8gZW51bWVyYXRpb24gYmVjYXVzZSBpdCBpcyBleHBlY3RlZCB0aGF0IHRoZSBjb3N0IG9mIG9uZSBJUiBpbnN0cnVjdGlvbgorICAvLy8gbWF5IGhhdmUgYSBtdWx0aXBsaWNhdGl2ZSBmYWN0b3IgdG8gaXQgb3Igb3RoZXJ3aXNlIHdvbid0IGZpdCBkaXJlY3RseQorICAvLy8gaW50byB0aGUgZW51bS4gTW9yZW92ZXIsIGl0IGlzIGNvbW1vbiB0byBzdW0gb3IgYXZlcmFnZSBjb3N0cyB3aGljaCB3b3JrcworICAvLy8gYmV0dGVyIGFzIHNpbXBsZSBpbnRlZ3JhbCB2YWx1ZXMuIFRodXMgdGhpcyBlbnVtIG9ubHkgcHJvdmlkZXMgY29uc3RhbnRzLgorICAvLy8gQWxzbyBub3RlIHRoYXQgdGhlIHJldHVybmVkIGNvc3RzIGFyZSBzaWduZWQgaW50ZWdlcnMgdG8gbWFrZSBpdCBuYXR1cmFsCisgIC8vLyB0byBhZGQsIHN1YnRyYWN0LCBhbmQgdGVzdCB3aXRoIHplcm8gKGEgY29tbW9uIGJvdW5kYXJ5IGNvbmRpdGlvbikuIEl0IGlzCisgIC8vLyBub3QgZXhwZWN0ZWQgdGhhdCAyXjMyIGlzIGEgcmVhbGlzdGljIGNvc3QgdG8gYmUgbW9kZWxpbmcgYXQgYW55IHBvaW50LgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGVzZSBjb3N0cyBzaG91bGQgdXN1YWxseSByZWZsZWN0IHRoZSBpbnRlcnNlY3Rpb24gb2YgY29kZS1zaXplCisgIC8vLyBjb3N0IGFuZCBleGVjdXRpb24gY29zdC4gQSBmcmVlIGluc3RydWN0aW9uIGlzIHR5cGljYWxseSBvbmUgdGhhdCBmb2xkcworICAvLy8gaW50byBhbm90aGVyIGluc3RydWN0aW9uLiBGb3IgZXhhbXBsZSwgcmVnLXRvLXJlZyBtb3ZlcyBjYW4gb2Z0ZW4gYmUKKyAgLy8vIHNraXBwZWQgYnkgcmVuYW1pbmcgdGhlIHJlZ2lzdGVycyBpbiB0aGUgQ1BVLCBidXQgdGhleSBzdGlsbCBhcmUgZW5jb2RlZAorICAvLy8gYW5kIHRodXMgd291bGRuJ3QgYmUgY29uc2lkZXJlZCAnZnJlZScgaGVyZS4KKyAgZW51bSBUYXJnZXRDb3N0Q29uc3RhbnRzIHsKKyAgICBUQ0NfRnJlZSA9IDAsICAgICAvLy88IEV4cGVjdGVkIHRvIGZvbGQgYXdheSBpbiBsb3dlcmluZy4KKyAgICBUQ0NfQmFzaWMgPSAxLCAgICAvLy88IFRoZSBjb3N0IG9mIGEgdHlwaWNhbCAnYWRkJyBpbnN0cnVjdGlvbi4KKyAgICBUQ0NfRXhwZW5zaXZlID0gNCAvLy88IFRoZSBjb3N0IG9mIGEgJ2RpdicgaW5zdHJ1Y3Rpb24gb24geDg2LgorICB9OworCisgIC8vLyBcYnJpZWYgRXN0aW1hdGUgdGhlIGNvc3Qgb2YgYSBzcGVjaWZpYyBvcGVyYXRpb24gd2hlbiBsb3dlcmVkLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGlzIGRlc2lnbmVkIHRvIHdvcmsgb24gYW4gYXJiaXRyYXJ5IHN5bnRoZXRpYyBvcGNvZGUsIGFuZAorICAvLy8gdGh1cyB3b3JrIGZvciBoeXBvdGhldGljYWwgcXVlcmllcyBiZWZvcmUgYW4gaW5zdHJ1Y3Rpb24gaGFzIGV2ZW4gYmVlbgorICAvLy8gZm9ybWVkLiBIb3dldmVyLCB0aGlzIGRvZXMgKm5vdCogd29yayBmb3IgR0VQcywgYW5kIG11c3Qgbm90IGJlIGNhbGxlZAorICAvLy8gZm9yIGEgR0VQIGluc3RydWN0aW9uLiBJbnN0ZWFkLCB1c2UgdGhlIGRlZGljYXRlZCBnZXRHRVBDb3N0IGludGVyZmFjZSBhcworICAvLy8gYW5hbHl6aW5nIGEgR0VQJ3MgY29zdCByZXF1aXJlZCBtb3JlIGluZm9ybWF0aW9uLgorICAvLy8KKyAgLy8vIFR5cGljYWxseSBvbmx5IHRoZSByZXN1bHQgdHlwZSBpcyByZXF1aXJlZCwgYW5kIHRoZSBvcGVyYW5kIHR5cGUgY2FuIGJlCisgIC8vLyBvbWl0dGVkLiBIb3dldmVyLCBpZiB0aGUgb3Bjb2RlIGlzIG9uZSBvZiB0aGUgY2FzdCBpbnN0cnVjdGlvbnMsIHRoZQorICAvLy8gb3BlcmFuZCB0eXBlIGlzIHJlcXVpcmVkLgorICAvLy8KKyAgLy8vIFRoZSByZXR1cm5lZCBjb3N0IGlzIGRlZmluZWQgaW4gdGVybXMgb2YgXGMgVGFyZ2V0Q29zdENvbnN0YW50cywgc2VlIGl0cworICAvLy8gY29tbWVudHMgZm9yIGEgZGV0YWlsZWQgZXhwbGFuYXRpb24gb2YgdGhlIGNvc3QgdmFsdWVzLgorICBpbnQgZ2V0T3BlcmF0aW9uQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlR5LCBUeXBlICpPcFR5ID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBFc3RpbWF0ZSB0aGUgY29zdCBvZiBhIEdFUCBvcGVyYXRpb24gd2hlbiBsb3dlcmVkLgorICAvLy8KKyAgLy8vIFRoZSBjb250cmFjdCBmb3IgdGhpcyBmdW5jdGlvbiBpcyB0aGUgc2FtZSBhcyBcYyBnZXRPcGVyYXRpb25Db3N0IGV4Y2VwdAorICAvLy8gdGhhdCBpdCBzdXBwb3J0cyBhbiBpbnRlcmZhY2UgdGhhdCBwcm92aWRlcyBleHRyYSBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0bworICAvLy8gdGhlIEdFUCBvcGVyYXRpb24uCisgIGludCBnZXRHRVBDb3N0KFR5cGUgKlBvaW50ZWVUeXBlLCBjb25zdCBWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBWYWx1ZSAqPiBPcGVyYW5kcykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBFc3RpbWF0ZSB0aGUgY29zdCBvZiBhIEVYVCBvcGVyYXRpb24gd2hlbiBsb3dlcmVkLgorICAvLy8KKyAgLy8vIFRoZSBjb250cmFjdCBmb3IgdGhpcyBmdW5jdGlvbiBpcyB0aGUgc2FtZSBhcyBcYyBnZXRPcGVyYXRpb25Db3N0IGV4Y2VwdAorICAvLy8gdGhhdCBpdCBzdXBwb3J0cyBhbiBpbnRlcmZhY2UgdGhhdCBwcm92aWRlcyBleHRyYSBpbmZvcm1hdGlvbiBzcGVjaWZpYyB0bworICAvLy8gdGhlIEVYVCBvcGVyYXRpb24uCisgIGludCBnZXRFeHRDb3N0KGNvbnN0IEluc3RydWN0aW9uICpJLCBjb25zdCBWYWx1ZSAqU3JjKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEVzdGltYXRlIHRoZSBjb3N0IG9mIGEgZnVuY3Rpb24gY2FsbCB3aGVuIGxvd2VyZWQuCisgIC8vLworICAvLy8gVGhlIGNvbnRyYWN0IGZvciB0aGlzIGlzIHRoZSBzYW1lIGFzIFxjIGdldE9wZXJhdGlvbkNvc3QgZXhjZXB0IHRoYXQgaXQKKyAgLy8vIHN1cHBvcnRzIGFuIGludGVyZmFjZSB0aGF0IHByb3ZpZGVzIGV4dHJhIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGNhbGwKKyAgLy8vIGluc3RydWN0aW9ucy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHRoZSBtb3N0IGJhc2ljIHF1ZXJ5IGZvciBlc3RpbWF0aW5nIGNhbGwgY29zdDogaXQgb25seSBrbm93cyB0aGUKKyAgLy8vIGZ1bmN0aW9uIHR5cGUgYW5kIChwb3RlbnRpYWxseSkgdGhlIG51bWJlciBvZiBhcmd1bWVudHMgYXQgdGhlIGNhbGwgc2l0ZS4KKyAgLy8vIFRoZSBsYXR0ZXIgaXMgb25seSBpbnRlcmVzdGluZyBmb3IgdmFyYXJncyBmdW5jdGlvbiB0eXBlcy4KKyAgaW50IGdldENhbGxDb3N0KEZ1bmN0aW9uVHlwZSAqRlR5LCBpbnQgTnVtQXJncyA9IC0xKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEVzdGltYXRlIHRoZSBjb3N0IG9mIGNhbGxpbmcgYSBzcGVjaWZpYyBmdW5jdGlvbiB3aGVuIGxvd2VyZWQuCisgIC8vLworICAvLy8gVGhpcyBvdmVybG9hZCBhZGRzIHRoZSBhYmlsaXR5IHRvIHJlYXNvbiBhYm91dCB0aGUgcGFydGljdWxhciBmdW5jdGlvbgorICAvLy8gYmVpbmcgY2FsbGVkIGluIHRoZSBldmVudCBpdCBpcyBhIGxpYnJhcnkgY2FsbCB3aXRoIHNwZWNpYWwgbG93ZXJpbmcuCisgIGludCBnZXRDYWxsQ29zdChjb25zdCBGdW5jdGlvbiAqRiwgaW50IE51bUFyZ3MgPSAtMSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBFc3RpbWF0ZSB0aGUgY29zdCBvZiBjYWxsaW5nIGEgc3BlY2lmaWMgZnVuY3Rpb24gd2hlbiBsb3dlcmVkLgorICAvLy8KKyAgLy8vIFRoaXMgb3ZlcmxvYWQgYWxsb3dzIHNwZWNpZnlpbmcgYSBzZXQgb2YgY2FuZGlkYXRlIGFyZ3VtZW50IHZhbHVlcy4KKyAgaW50IGdldENhbGxDb3N0KGNvbnN0IEZ1bmN0aW9uICpGLCBBcnJheVJlZjxjb25zdCBWYWx1ZSAqPiBBcmd1bWVudHMpIGNvbnN0OworCisgIC8vLyBccmV0dXJucyBBIHZhbHVlIGJ5IHdoaWNoIG91ciBpbmxpbmluZyB0aHJlc2hvbGQgc2hvdWxkIGJlIG11bHRpcGxpZWQuCisgIC8vLyBUaGlzIGlzIHByaW1hcmlseSB1c2VkIHRvIGJ1bXAgdXAgdGhlIGlubGluaW5nIHRocmVzaG9sZCB3aG9sZXNhbGUgb24KKyAgLy8vIHRhcmdldHMgd2hlcmUgY2FsbHMgYXJlIHVudXN1YWxseSBleHBlbnNpdmUuCisgIC8vLworICAvLy8gVE9ETzogVGhpcyBpcyBhIHJhdGhlciBibHVudCBpbnN0cnVtZW50LiAgUGVyaGFwcyBhbHRlcmluZyB0aGUgY29zdHMgb2YKKyAgLy8vIGluZGl2aWR1YWwgY2xhc3NlcyBvZiBpbnN0cnVjdGlvbnMgd291bGQgYmUgYmV0dGVyLgorICB1bnNpZ25lZCBnZXRJbmxpbmluZ1RocmVzaG9sZE11bHRpcGxpZXIoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEVzdGltYXRlIHRoZSBjb3N0IG9mIGFuIGludHJpbnNpYyB3aGVuIGxvd2VyZWQuCisgIC8vLworICAvLy8gTWlycm9ycyB0aGUgXGMgZ2V0Q2FsbENvc3QgbWV0aG9kIGJ1dCB1c2VzIGFuIGludHJpbnNpYyBpZGVudGlmaWVyLgorICBpbnQgZ2V0SW50cmluc2ljQ29zdChJbnRyaW5zaWM6OklEIElJRCwgVHlwZSAqUmV0VHksCisgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFR5cGUgKj4gUGFyYW1UeXMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRXN0aW1hdGUgdGhlIGNvc3Qgb2YgYW4gaW50cmluc2ljIHdoZW4gbG93ZXJlZC4KKyAgLy8vCisgIC8vLyBNaXJyb3JzIHRoZSBcYyBnZXRDYWxsQ29zdCBtZXRob2QgYnV0IHVzZXMgYW4gaW50cmluc2ljIGlkZW50aWZpZXIuCisgIGludCBnZXRJbnRyaW5zaWNDb3N0KEludHJpbnNpYzo6SUQgSUlELCBUeXBlICpSZXRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gQXJndW1lbnRzKSBjb25zdDsKKworICAvLy8gXHJldHVybiBUaGUgZXN0aW1hdGVkIG51bWJlciBvZiBjYXNlIGNsdXN0ZXJzIHdoZW4gbG93ZXJpbmcgXHAgJ1NJJy4KKyAgLy8vIFxwIEpUU2l6ZSBTZXQgYSBqdW1wIHRhYmxlIHNpemUgb25seSB3aGVuIFxwIFNJIGlzIHN1aXRhYmxlIGZvciBhIGp1bXAKKyAgLy8vIHRhYmxlLgorICB1bnNpZ25lZCBnZXRFc3RpbWF0ZWROdW1iZXJPZkNhc2VDbHVzdGVycyhjb25zdCBTd2l0Y2hJbnN0ICZTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkpUU2l6ZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBFc3RpbWF0ZSB0aGUgY29zdCBvZiBhIGdpdmVuIElSIHVzZXIgd2hlbiBsb3dlcmVkLgorICAvLy8KKyAgLy8vIFRoaXMgY2FuIGVzdGltYXRlIHRoZSBjb3N0IG9mIGVpdGhlciBhIENvbnN0YW50RXhwciBvciBJbnN0cnVjdGlvbiB3aGVuCisgIC8vLyBsb3dlcmVkLiBJdCBoYXMgdHdvIHByaW1hcnkgYWR2YW50YWdlcyBvdmVyIHRoZSBcYyBnZXRPcGVyYXRpb25Db3N0IGFuZAorICAvLy8gXGMgZ2V0R0VQQ29zdCBhYm92ZSwgYW5kIG9uZSBzaWduaWZpY2FudCBkaXNhZHZhbnRhZ2U6IGl0IGNhbiBvbmx5IGJlCisgIC8vLyB1c2VkIHdoZW4gdGhlIElSIGNvbnN0cnVjdCBoYXMgYWxyZWFkeSBiZWVuIGZvcm1lZC4KKyAgLy8vCisgIC8vLyBUaGUgYWR2YW50YWdlcyBhcmUgdGhhdCBpdCBjYW4gaW5zcGVjdCB0aGUgU1NBIHVzZSBncmFwaCB0byByZWFzb24gbW9yZQorICAvLy8gYWNjdXJhdGVseSBhYm91dCB0aGUgY29zdC4gRm9yIGV4YW1wbGUsIGFsbC1jb25zdGFudC1HRVBzIGNhbiBvZnRlbiBiZQorICAvLy8gZm9sZGVkIGludG8gYSBsb2FkIG9yIG90aGVyIGluc3RydWN0aW9uLCBidXQgaWYgdGhleSBhcmUgdXNlZCBpbiBzb21lCisgIC8vLyBvdGhlciBjb250ZXh0IHRoZXkgbWF5IG5vdCBiZSBmb2xkZWQuIFRoaXMgcm91dGluZSBjYW4gZGlzdGluZ3Vpc2ggc3VjaAorICAvLy8gY2FzZXMuCisgIC8vLworICAvLy8gXHAgT3BlcmFuZHMgaXMgYSBsaXN0IG9mIG9wZXJhbmRzIHdoaWNoIGNhbiBiZSBhIHJlc3VsdCBvZiB0cmFuc2Zvcm1hdGlvbnMKKyAgLy8vIG9mIHRoZSBjdXJyZW50IG9wZXJhbmRzLiBUaGUgbnVtYmVyIG9mIHRoZSBvcGVyYW5kcyBvbiB0aGUgbGlzdCBtdXN0IGVxdWFsCisgIC8vLyB0byB0aGUgbnVtYmVyIG9mIHRoZSBjdXJyZW50IG9wZXJhbmRzIHRoZSBJUiB1c2VyIGhhcy4gVGhlaXIgb3JkZXIgb24gdGhlCisgIC8vLyBsaXN0IG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIG9yZGVyIG9mIHRoZSBjdXJyZW50IG9wZXJhbmRzIHRoZSBJUiB1c2VyCisgIC8vLyBoYXMuCisgIC8vLworICAvLy8gVGhlIHJldHVybmVkIGNvc3QgaXMgZGVmaW5lZCBpbiB0ZXJtcyBvZiBcYyBUYXJnZXRDb3N0Q29uc3RhbnRzLCBzZWUgaXRzCisgIC8vLyBjb21tZW50cyBmb3IgYSBkZXRhaWxlZCBleHBsYW5hdGlvbiBvZiB0aGUgY29zdCB2YWx1ZXMuCisgIGludCBnZXRVc2VyQ29zdChjb25zdCBVc2VyICpVLCBBcnJheVJlZjxjb25zdCBWYWx1ZSAqPiBPcGVyYW5kcykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIHdoaWNoIGNhbGxzIHRoZSB0d28tYXJndW1lbnQgZ2V0VXNlckNvc3QKKyAgLy8vIHdpdGggXHAgT3BlcmFuZHMgd2hpY2ggYXJlIHRoZSBjdXJyZW50IG9wZXJhbmRzIFUgaGFzLgorICBpbnQgZ2V0VXNlckNvc3QoY29uc3QgVXNlciAqVSkgY29uc3QgeworICAgIFNtYWxsVmVjdG9yPGNvbnN0IFZhbHVlICosIDQ+IE9wZXJhbmRzKFUtPnZhbHVlX29wX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVS0+dmFsdWVfb3BfZW5kKCkpOworICAgIHJldHVybiBnZXRVc2VyQ29zdChVLCBPcGVyYW5kcyk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIGJyYW5jaCBkaXZlcmdlbmNlIGV4aXN0cy4KKyAgLy8vCisgIC8vLyBCcmFuY2ggZGl2ZXJnZW5jZSBoYXMgYSBzaWduaWZpY2FudGx5IG5lZ2F0aXZlIGltcGFjdCBvbiBHUFUgcGVyZm9ybWFuY2UKKyAgLy8vIHdoZW4gdGhyZWFkcyBpbiB0aGUgc2FtZSB3YXZlZnJvbnQgdGFrZSBkaWZmZXJlbnQgcGF0aHMgZHVlIHRvIGNvbmRpdGlvbmFsCisgIC8vLyBicmFuY2hlcy4KKyAgYm9vbCBoYXNCcmFuY2hEaXZlcmdlbmNlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHdoZXRoZXIgViBpcyBhIHNvdXJjZSBvZiBkaXZlcmdlbmNlLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gcHJvdmlkZXMgdGhlIHRhcmdldC1kZXBlbmRlbnQgaW5mb3JtYXRpb24gZm9yCisgIC8vLyB0aGUgdGFyZ2V0LWluZGVwZW5kZW50IERpdmVyZ2VuY2VBbmFseXNpcy4gRGl2ZXJnZW5jZUFuYWx5c2lzIGZpcnN0CisgIC8vLyBidWlsZHMgdGhlIGRlcGVuZGVuY3kgZ3JhcGgsIGFuZCB0aGVuIHJ1bnMgdGhlIHJlYWNoYWJpbGl0eSBhbGdvcml0aG0KKyAgLy8vIHN0YXJ0aW5nIHdpdGggdGhlIHNvdXJjZXMgb2YgZGl2ZXJnZW5jZS4KKyAgYm9vbCBpc1NvdXJjZU9mRGl2ZXJnZW5jZShjb25zdCBWYWx1ZSAqVikgY29uc3Q7CisKKyAgLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBmb3IgdGhlIHRhcmdldCBzcGVjaWZpYworICAvLyBzZXQgb2Ygb3BlcmF0aW9ucyB3aGljaCBwcm9kdWNlIHVuaWZvcm0gcmVzdWx0CisgIC8vIGV2ZW4gdGFraW5nIG5vbi11bmZvcm0gYXJndW1lbnRzCisgIGJvb2wgaXNBbHdheXNVbmlmb3JtKGNvbnN0IFZhbHVlICpWKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgYWRkcmVzcyBzcGFjZSBJRCBmb3IgYSB0YXJnZXQncyAnZmxhdCcgYWRkcmVzcyBzcGFjZS4gTm90ZQorICAvLy8gdGhpcyBpcyBub3QgbmVjZXNzYXJpbHkgdGhlIHNhbWUgYXMgYWRkcnNwYWNlKDApLCB3aGljaCBMTFZNIHNvbWV0aW1lcworICAvLy8gcmVmZXJzIHRvIGFzIHRoZSBnZW5lcmljIGFkZHJlc3Mgc3BhY2UuIFRoZSBmbGF0IGFkZHJlc3Mgc3BhY2UgaXMgYQorICAvLy8gZ2VuZXJpYyBhZGRyZXNzIHNwYWNlIHRoYXQgY2FuIGJlIHVzZWQgYWNjZXNzIG11bHRpcGxlIHNlZ21lbnRzIG9mIG1lbW9yeQorICAvLy8gd2l0aCBkaWZmZXJlbnQgYWRkcmVzcyBzcGFjZXMuIEFjY2VzcyBvZiBhIG1lbW9yeSBsb2NhdGlvbiB0aHJvdWdoIGEKKyAgLy8vIHBvaW50ZXIgd2l0aCB0aGlzIGFkZHJlc3Mgc3BhY2UgaXMgZXhwZWN0ZWQgdG8gYmUgbGVnYWwgYnV0IHNsb3dlcgorICAvLy8gY29tcGFyZWQgdG8gdGhlIHNhbWUgbWVtb3J5IGxvY2F0aW9uIGFjY2Vzc2VkIHRocm91Z2ggYSBwb2ludGVyIHdpdGggYQorICAvLy8gZGlmZmVyZW50IGFkZHJlc3Mgc3BhY2UuCisgIC8vCisgIC8vLyBUaGlzIGlzIGZvciB0YXJnZXRzIHdpdGggZGlmZmVyZW50IHBvaW50ZXIgcmVwcmVzZW50YXRpb25zIHdoaWNoIGNhbgorICAvLy8gYmUgY29udmVydGVkIHdpdGggdGhlIGFkZHJzcGFjZWNhc3QgaW5zdHJ1Y3Rpb24uIElmIGEgcG9pbnRlciBpcyBjb252ZXJ0ZWQKKyAgLy8vIHRvIHRoaXMgYWRkcmVzcyBzcGFjZSwgb3B0aW1pemF0aW9ucyBzaG91bGQgYXR0ZW1wdCB0byByZXBsYWNlIHRoZSBhY2Nlc3MKKyAgLy8vIHdpdGggdGhlIHNvdXJjZSBhZGRyZXNzIHNwYWNlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIH4wdSBpZiB0aGUgdGFyZ2V0IGRvZXMgbm90IGhhdmUgc3VjaCBhIGZsYXQgYWRkcmVzcyBzcGFjZSB0bworICAvLy8gb3B0aW1pemUgYXdheS4KKyAgdW5zaWduZWQgZ2V0RmxhdEFkZHJlc3NTcGFjZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVGVzdCB3aGV0aGVyIGNhbGxzIHRvIGEgZnVuY3Rpb24gbG93ZXIgdG8gYWN0dWFsIHByb2dyYW0gZnVuY3Rpb24KKyAgLy8vIGNhbGxzLgorICAvLy8KKyAgLy8vIFRoZSBpZGVhIGlzIHRvIHRlc3Qgd2hldGhlciB0aGUgcHJvZ3JhbSBpcyBsaWtlbHkgdG8gcmVxdWlyZSBhICdjYWxsJworICAvLy8gaW5zdHJ1Y3Rpb24gb3IgZXF1aXZhbGVudCBpbiBvcmRlciB0byBjYWxsIHRoZSBnaXZlbiBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBGSVhNRTogSXQncyBub3QgY2xlYXIgdGhhdCB0aGlzIGlzIGEgZ29vZCBvciB1c2VmdWwgcXVlcnkgQVBJLiBDbGllbnQncworICAvLy8gc2hvdWxkIHByb2JhYmx5IG1vdmUgdG8gc2ltcGxlciBjb3N0IG1ldHJpY3MgdXNpbmcgdGhlIGFib3ZlLgorICAvLy8gQWx0ZXJuYXRpdmVseSwgd2UgY291bGQgc3BsaXQgdGhlIGNvc3QgaW50ZXJmYWNlIGludG8gZGlzdGluY3QgY29kZS1zaXplCisgIC8vLyBhbmQgZXhlY3V0aW9uLXNwZWVkIGNvc3RzLiBUaGlzIHdvdWxkIGFsbG93IG1vZGVsbGluZyB0aGUgY29yZSBvZiB0aGlzCisgIC8vLyBxdWVyeSBtb3JlIGFjY3VyYXRlbHkgYXMgYSBjYWxsIGlzIGEgc2luZ2xlIHNtYWxsIGluc3RydWN0aW9uLCBidXQKKyAgLy8vIGluY3VycyBzaWduaWZpY2FudCBleGVjdXRpb24gY29zdC4KKyAgYm9vbCBpc0xvd2VyZWRUb0NhbGwoY29uc3QgRnVuY3Rpb24gKkYpIGNvbnN0OworCisgIHN0cnVjdCBMU1JDb3N0IHsKKyAgICAvLy8gVE9ETzogU29tZSBvZiB0aGVzZSBjb3VsZCBiZSBtZXJnZWQuIEFsc28sIGEgbGV4aWNhbCBvcmRlcmluZworICAgIC8vLyBpc24ndCBhbHdheXMgb3B0aW1hbC4KKyAgICB1bnNpZ25lZCBJbnNuczsKKyAgICB1bnNpZ25lZCBOdW1SZWdzOworICAgIHVuc2lnbmVkIEFkZFJlY0Nvc3Q7CisgICAgdW5zaWduZWQgTnVtSVZNdWxzOworICAgIHVuc2lnbmVkIE51bUJhc2VBZGRzOworICAgIHVuc2lnbmVkIEltbUNvc3Q7CisgICAgdW5zaWduZWQgU2V0dXBDb3N0OworICAgIHVuc2lnbmVkIFNjYWxlQ29zdDsKKyAgfTsKKworICAvLy8gUGFyYW1ldGVycyB0aGF0IGNvbnRyb2wgdGhlIGdlbmVyaWMgbG9vcCB1bnJvbGxpbmcgdHJhbnNmb3JtYXRpb24uCisgIHN0cnVjdCBVbnJvbGxpbmdQcmVmZXJlbmNlcyB7CisgICAgLy8vIFRoZSBjb3N0IHRocmVzaG9sZCBmb3IgdGhlIHVucm9sbGVkIGxvb3AuIFNob3VsZCBiZSByZWxhdGl2ZSB0byB0aGUKKyAgICAvLy8gZ2V0VXNlckNvc3QgdmFsdWVzIHJldHVybmVkIGJ5IHRoaXMgQVBJLCBhbmQgdGhlIGV4cGVjdGF0aW9uIGlzIHRoYXQKKyAgICAvLy8gdGhlIHVucm9sbGVkIGxvb3AncyBpbnN0cnVjdGlvbnMgd2hlbiBydW4gdGhyb3VnaCB0aGF0IGludGVyZmFjZSBzaG91bGQKKyAgICAvLy8gbm90IGV4Y2VlZCB0aGlzIGNvc3QuIEhvd2V2ZXIsIHRoaXMgaXMgb25seSBhbiBlc3RpbWF0ZS4gQWxzbywgc3BlY2lmaWMKKyAgICAvLy8gbG9vcHMgbWF5IGJlIHVucm9sbGVkIGV2ZW4gd2l0aCBhIGNvc3QgYWJvdmUgdGhpcyB0aHJlc2hvbGQgaWYgZGVlbWVkCisgICAgLy8vIHByb2ZpdGFibGUuIFNldCB0aGlzIHRvIFVJTlRfTUFYIHRvIGRpc2FibGUgdGhlIGxvb3AgYm9keSBjb3N0CisgICAgLy8vIHJlc3RyaWN0aW9uLgorICAgIHVuc2lnbmVkIFRocmVzaG9sZDsKKyAgICAvLy8gSWYgY29tcGxldGUgdW5yb2xsaW5nIHdpbGwgcmVkdWNlIHRoZSBjb3N0IG9mIHRoZSBsb29wLCB3ZSB3aWxsIGJvb3N0CisgICAgLy8vIHRoZSBUaHJlc2hvbGQgYnkgYSBjZXJ0YWluIHBlcmNlbnQgdG8gYWxsb3cgbW9yZSBhZ2dyZXNzaXZlIGNvbXBsZXRlCisgICAgLy8vIHVucm9sbGluZy4gVGhpcyB2YWx1ZSBwcm92aWRlcyB0aGUgbWF4aW11bSBib29zdCBwZXJjZW50YWdlIHRoYXQgd2UKKyAgICAvLy8gY2FuIGFwcGx5IHRvIFRocmVzaG9sZCAoVGhlIHZhbHVlIHNob3VsZCBiZSBubyBsZXNzIHRoYW4gMTAwKS4KKyAgICAvLy8gQm9vc3RlZFRocmVzaG9sZCA9IFRocmVzaG9sZCAqIG1pbihSb2xsZWRDb3N0IC8gVW5yb2xsZWRDb3N0LAorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1heFBlcmNlbnRUaHJlc2hvbGRCb29zdCAvIDEwMCkKKyAgICAvLy8gRS5nLiBpZiBjb21wbGV0ZSB1bnJvbGxpbmcgcmVkdWNlcyB0aGUgbG9vcCBleGVjdXRpb24gdGltZSBieSA1MCUKKyAgICAvLy8gdGhlbiB3ZSBib29zdCB0aGUgdGhyZXNob2xkIGJ5IHRoZSBmYWN0b3Igb2YgMnguIElmIHVucm9sbGluZyBpcyBub3QKKyAgICAvLy8gZXhwZWN0ZWQgdG8gcmVkdWNlIHRoZSBydW5uaW5nIHRpbWUsIHRoZW4gd2UgZG8gbm90IGluY3JlYXNlIHRoZQorICAgIC8vLyB0aHJlc2hvbGQuCisgICAgdW5zaWduZWQgTWF4UGVyY2VudFRocmVzaG9sZEJvb3N0OworICAgIC8vLyBUaGUgY29zdCB0aHJlc2hvbGQgZm9yIHRoZSB1bnJvbGxlZCBsb29wIHdoZW4gb3B0aW1pemluZyBmb3Igc2l6ZSAoc2V0CisgICAgLy8vIHRvIFVJTlRfTUFYIHRvIGRpc2FibGUpLgorICAgIHVuc2lnbmVkIE9wdFNpemVUaHJlc2hvbGQ7CisgICAgLy8vIFRoZSBjb3N0IHRocmVzaG9sZCBmb3IgdGhlIHVucm9sbGVkIGxvb3AsIGxpa2UgVGhyZXNob2xkLCBidXQgdXNlZAorICAgIC8vLyBmb3IgcGFydGlhbC9ydW50aW1lIHVucm9sbGluZyAoc2V0IHRvIFVJTlRfTUFYIHRvIGRpc2FibGUpLgorICAgIHVuc2lnbmVkIFBhcnRpYWxUaHJlc2hvbGQ7CisgICAgLy8vIFRoZSBjb3N0IHRocmVzaG9sZCBmb3IgdGhlIHVucm9sbGVkIGxvb3Agd2hlbiBvcHRpbWl6aW5nIGZvciBzaXplLCBsaWtlCisgICAgLy8vIE9wdFNpemVUaHJlc2hvbGQsIGJ1dCB1c2VkIGZvciBwYXJ0aWFsL3J1bnRpbWUgdW5yb2xsaW5nIChzZXQgdG8KKyAgICAvLy8gVUlOVF9NQVggdG8gZGlzYWJsZSkuCisgICAgdW5zaWduZWQgUGFydGlhbE9wdFNpemVUaHJlc2hvbGQ7CisgICAgLy8vIEEgZm9yY2VkIHVucm9sbGluZyBmYWN0b3IgKHRoZSBudW1iZXIgb2YgY29uY2F0ZW5hdGVkIGJvZGllcyBvZiB0aGUKKyAgICAvLy8gb3JpZ2luYWwgbG9vcCBpbiB0aGUgdW5yb2xsZWQgbG9vcCBib2R5KS4gV2hlbiBzZXQgdG8gMCwgdGhlIHVucm9sbGluZworICAgIC8vLyB0cmFuc2Zvcm1hdGlvbiB3aWxsIHNlbGVjdCBhbiB1bnJvbGxpbmcgZmFjdG9yIGJhc2VkIG9uIHRoZSBjdXJyZW50IGNvc3QKKyAgICAvLy8gdGhyZXNob2xkIGFuZCBvdGhlciBmYWN0b3JzLgorICAgIHVuc2lnbmVkIENvdW50OworICAgIC8vLyBBIGZvcmNlZCBwZWVsaW5nIGZhY3RvciAodGhlIG51bWJlciBvZiBib2RpZWQgb2YgdGhlIG9yaWdpbmFsIGxvb3AKKyAgICAvLy8gdGhhdCBzaG91bGQgYmUgcGVlbGVkIG9mZiBiZWZvcmUgdGhlIGxvb3AgYm9keSkuIFdoZW4gc2V0IHRvIDAsIHRoZQorICAgIC8vLyB1bnJvbGxpbmcgdHJhbnNmb3JtYXRpb24gd2lsbCBzZWxlY3QgYSBwZWVsaW5nIGZhY3RvciBiYXNlZCBvbiBwcm9maWxlCisgICAgLy8vIGluZm9ybWF0aW9uIGFuZCBvdGhlciBmYWN0b3JzLgorICAgIHVuc2lnbmVkIFBlZWxDb3VudDsKKyAgICAvLy8gRGVmYXVsdCB1bnJvbGwgY291bnQgZm9yIGxvb3BzIHdpdGggcnVuLXRpbWUgdHJpcCBjb3VudC4KKyAgICB1bnNpZ25lZCBEZWZhdWx0VW5yb2xsUnVudGltZUNvdW50OworICAgIC8vIFNldCB0aGUgbWF4aW11bSB1bnJvbGxpbmcgZmFjdG9yLiBUaGUgdW5yb2xsaW5nIGZhY3RvciBtYXkgYmUgc2VsZWN0ZWQKKyAgICAvLyB1c2luZyB0aGUgYXBwcm9wcmlhdGUgY29zdCB0aHJlc2hvbGQsIGJ1dCBtYXkgbm90IGV4Y2VlZCB0aGlzIG51bWJlcgorICAgIC8vIChzZXQgdG8gVUlOVF9NQVggdG8gZGlzYWJsZSkuIFRoaXMgZG9lcyBub3QgYXBwbHkgaW4gY2FzZXMgd2hlcmUgdGhlCisgICAgLy8gbG9vcCBpcyBiZWluZyBmdWxseSB1bnJvbGxlZC4KKyAgICB1bnNpZ25lZCBNYXhDb3VudDsKKyAgICAvLy8gU2V0IHRoZSBtYXhpbXVtIHVucm9sbGluZyBmYWN0b3IgZm9yIGZ1bGwgdW5yb2xsaW5nLiBMaWtlIE1heENvdW50LCBidXQKKyAgICAvLy8gYXBwbGllcyBldmVuIGlmIGZ1bGwgdW5yb2xsaW5nIGlzIHNlbGVjdGVkLiBUaGlzIGFsbG93cyBhIHRhcmdldCB0byBmYWxsCisgICAgLy8vIGJhY2sgdG8gUGFydGlhbCB1bnJvbGxpbmcgaWYgZnVsbCB1bnJvbGxpbmcgaXMgYWJvdmUgRnVsbFVucm9sbE1heENvdW50LgorICAgIHVuc2lnbmVkIEZ1bGxVbnJvbGxNYXhDb3VudDsKKyAgICAvLyBSZXByZXNlbnRzIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgb3B0aW1pemVkIHdoZW4gImJhY2sgZWRnZSIKKyAgICAvLyBiZWNvbWVzICJmYWxsIHRocm91Z2giIGluIHVucm9sbGVkIGxvb3AuCisgICAgLy8gRm9yIG5vdyB3ZSBjb3VudCBhIGNvbmRpdGlvbmFsIGJyYW5jaCBvbiBhIGJhY2tlZGdlIGFuZCBhIGNvbXBhcmlzb24KKyAgICAvLyBmZWVkaW5nIGl0LgorICAgIHVuc2lnbmVkIEJFSW5zbnM7CisgICAgLy8vIEFsbG93IHBhcnRpYWwgdW5yb2xsaW5nICh1bnJvbGxpbmcgb2YgbG9vcHMgdG8gZXhwYW5kIHRoZSBzaXplIG9mIHRoZQorICAgIC8vLyBsb29wIGJvZHksIG5vdCBvbmx5IHRvIGVsaW1pbmF0ZSBzbWFsbCBjb25zdGFudC10cmlwLWNvdW50IGxvb3BzKS4KKyAgICBib29sIFBhcnRpYWw7CisgICAgLy8vIEFsbG93IHJ1bnRpbWUgdW5yb2xsaW5nICh1bnJvbGxpbmcgb2YgbG9vcHMgdG8gZXhwYW5kIHRoZSBzaXplIG9mIHRoZQorICAgIC8vLyBsb29wIGJvZHkgZXZlbiB3aGVuIHRoZSBudW1iZXIgb2YgbG9vcCBpdGVyYXRpb25zIGlzIG5vdCBrbm93biBhdAorICAgIC8vLyBjb21waWxlIHRpbWUpLgorICAgIGJvb2wgUnVudGltZTsKKyAgICAvLy8gQWxsb3cgZ2VuZXJhdGlvbiBvZiBhIGxvb3AgcmVtYWluZGVyIChleHRyYSBpdGVyYXRpb25zIGFmdGVyIHVucm9sbCkuCisgICAgYm9vbCBBbGxvd1JlbWFpbmRlcjsKKyAgICAvLy8gQWxsb3cgZW1pdHRpbmcgZXhwZW5zaXZlIGluc3RydWN0aW9ucyAoc3VjaCBhcyBkaXZpc2lvbnMpIHdoZW4gY29tcHV0aW5nCisgICAgLy8vIHRoZSB0cmlwIGNvdW50IG9mIGEgbG9vcCBmb3IgcnVudGltZSB1bnJvbGxpbmcuCisgICAgYm9vbCBBbGxvd0V4cGVuc2l2ZVRyaXBDb3VudDsKKyAgICAvLy8gQXBwbHkgbG9vcCB1bnJvbGwgb24gYW55IGtpbmQgb2YgbG9vcAorICAgIC8vLyAobWFpbmx5IHRvIGxvb3BzIHRoYXQgZmFpbCBydW50aW1lIHVucm9sbGluZykuCisgICAgYm9vbCBGb3JjZTsKKyAgICAvLy8gQWxsb3cgdXNpbmcgdHJpcCBjb3VudCB1cHBlciBib3VuZCB0byB1bnJvbGwgbG9vcHMuCisgICAgYm9vbCBVcHBlckJvdW5kOworICAgIC8vLyBBbGxvdyBwZWVsaW5nIG9mZiBsb29wIGl0ZXJhdGlvbnMgZm9yIGxvb3BzIHdpdGggbG93IGR5bmFtaWMgdHJpcGNvdW50LgorICAgIGJvb2wgQWxsb3dQZWVsaW5nOworICAgIC8vLyBBbGxvdyB1bnJvbGxpbmcgb2YgYWxsIHRoZSBpdGVyYXRpb25zIG9mIHRoZSBydW50aW1lIGxvb3AgcmVtYWluZGVyLgorICAgIGJvb2wgVW5yb2xsUmVtYWluZGVyOworICB9OworCisgIC8vLyBcYnJpZWYgR2V0IHRhcmdldC1jdXN0b21pemVkIHByZWZlcmVuY2VzIGZvciB0aGUgZ2VuZXJpYyBsb29wIHVucm9sbGluZworICAvLy8gdHJhbnNmb3JtYXRpb24uIFRoZSBjYWxsZXIgd2lsbCBpbml0aWFsaXplIFVQIHdpdGggdGhlIGN1cnJlbnQKKyAgLy8vIHRhcmdldC1pbmRlcGVuZGVudCBkZWZhdWx0cy4KKyAgdm9pZCBnZXRVbnJvbGxpbmdQcmVmZXJlbmNlcyhMb29wICpMLCBTY2FsYXJFdm9sdXRpb24gJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJvbGxpbmdQcmVmZXJlbmNlcyAmVVApIGNvbnN0OworCisgIC8vLyBAfQorCisgIC8vLyBcbmFtZSBTY2FsYXIgVGFyZ2V0IEluZm9ybWF0aW9uCisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgRmxhZ3MgaW5kaWNhdGluZyB0aGUga2luZCBvZiBzdXBwb3J0IGZvciBwb3B1bGF0aW9uIGNvdW50LgorICAvLy8KKyAgLy8vIENvbXBhcmVkIHRvIHRoZSBTVyBpbXBsZW1lbnRhdGlvbiwgSFcgc3VwcG9ydCBpcyBzdXBwb3NlZCB0bworICAvLy8gc2lnbmlmaWNhbnRseSBib29zdCB0aGUgcGVyZm9ybWFuY2Ugd2hlbiB0aGUgcG9wdWxhdGlvbiBpcyBkZW5zZSwgYW5kIGl0CisgIC8vLyBtYXkgb3IgbWF5IG5vdCBkZWdyYWRlIHBlcmZvcm1hbmNlIGlmIHRoZSBwb3B1bGF0aW9uIGlzIHNwYXJzZS4gQSBIVworICAvLy8gc3VwcG9ydCBpcyBjb25zaWRlcmVkIGFzICJGYXN0IiBpZiBpdCBjYW4gb3V0cGVyZm9ybSwgb3IgaXMgb24gYSBwYXIKKyAgLy8vIHdpdGgsIFNXIGltcGxlbWVudGF0aW9uIHdoZW4gdGhlIHBvcHVsYXRpb24gaXMgc3BhcnNlOyBvdGhlcndpc2UsIGl0IGlzCisgIC8vLyBjb25zaWRlcmVkIGFzICJTbG93Ii4KKyAgZW51bSBQb3BjbnRTdXBwb3J0S2luZCB7IFBTS19Tb2Z0d2FyZSwgUFNLX1Nsb3dIYXJkd2FyZSwgUFNLX0Zhc3RIYXJkd2FyZSB9OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBpbW1lZGlhdGUgaXMgbGVnYWwgYWRkIGltbWVkaWF0ZSwgdGhhdAorICAvLy8gaXMgdGhlIHRhcmdldCBoYXMgYWRkIGluc3RydWN0aW9ucyB3aGljaCBjYW4gYWRkIGEgcmVnaXN0ZXIgd2l0aCB0aGUKKyAgLy8vIGltbWVkaWF0ZSB3aXRob3V0IGhhdmluZyB0byBtYXRlcmlhbGl6ZSB0aGUgaW1tZWRpYXRlIGludG8gYSByZWdpc3Rlci4KKyAgYm9vbCBpc0xlZ2FsQWRkSW1tZWRpYXRlKGludDY0X3QgSW1tKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW1tZWRpYXRlIGlzIGxlZ2FsIGljbXAgaW1tZWRpYXRlLAorICAvLy8gdGhhdCBpcyB0aGUgdGFyZ2V0IGhhcyBpY21wIGluc3RydWN0aW9ucyB3aGljaCBjYW4gY29tcGFyZSBhIHJlZ2lzdGVyCisgIC8vLyBhZ2FpbnN0IHRoZSBpbW1lZGlhdGUgd2l0aG91dCBoYXZpbmcgdG8gbWF0ZXJpYWxpemUgdGhlIGltbWVkaWF0ZSBpbnRvIGEKKyAgLy8vIHJlZ2lzdGVyLgorICBib29sIGlzTGVnYWxJQ21wSW1tZWRpYXRlKGludDY0X3QgSW1tKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBhZGRyZXNzaW5nIG1vZGUgcmVwcmVzZW50ZWQgYnkgQU0gaXMgbGVnYWwgZm9yCisgIC8vLyB0aGlzIHRhcmdldCwgZm9yIGEgbG9hZC9zdG9yZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCisgIC8vLyBUaGUgdHlwZSBtYXkgYmUgVm9pZFR5LCBpbiB3aGljaCBjYXNlIG9ubHkgcmV0dXJuIHRydWUgaWYgdGhlIGFkZHJlc3NpbmcKKyAgLy8vIG1vZGUgaXMgbGVnYWwgZm9yIGEgbG9hZC9zdG9yZSBvZiBhbnkgbGVnYWwgdHlwZS4KKyAgLy8vIElmIHRhcmdldCByZXR1cm5zIHRydWUgaW4gTFNSV2l0aEluc3RyUXVlcmllcygpLCBJIG1heSBiZSB2YWxpZC4KKyAgLy8vIFRPRE86IEhhbmRsZSBwcmUvcG9zdGluYyBhcyB3ZWxsLgorICBib29sIGlzTGVnYWxBZGRyZXNzaW5nTW9kZShUeXBlICpUeSwgR2xvYmFsVmFsdWUgKkJhc2VHViwgaW50NjRfdCBCYXNlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc0Jhc2VSZWcsIGludDY0X3QgU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBMU1IgY29zdCBvZiBDMSBpcyBsb3dlciB0aGFuIEMxLgorICBib29sIGlzTFNSQ29zdExlc3MoVGFyZ2V0VHJhbnNmb3JtSW5mbzo6TFNSQ29zdCAmQzEsCisgICAgICAgICAgICAgICAgICAgICBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpMU1JDb3N0ICZDMikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgY2FuIGZ1c2UgYSBjb21wYXJlIGFuZCBicmFuY2guCisgIC8vLyBMb29wLXN0cmVuZ3RoLXJlZHVjdGlvbiAoTFNSKSB1c2VzIHRoYXQga25vd2xlZGdlIHRvIGFkanVzdCBpdHMgY29zdAorICAvLy8gY2FsY3VsYXRpb24gZm9yIHRoZSBpbnN0cnVjdGlvbnMgaW4gYSBsb29wLgorICBib29sIGNhbk1hY3JvRnVzZUNtcCgpIGNvbnN0OworCisgIC8vLyBccmV0dXJuIFRydWUgaXMgTFNSIHNob3VsZCBtYWtlIGVmZm9ydHMgdG8gY3JlYXRlL3ByZXNlcnZlIHBvc3QtaW5jCisgIC8vLyBhZGRyZXNzaW5nIG1vZGUgZXhwcmVzc2lvbnMuCisgIGJvb2wgc2hvdWxkRmF2b3JQb3N0SW5jKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IHN1cHBvcnRzIG1hc2tlZCBsb2FkL3N0b3JlCisgIC8vLyBBVlgyIGFuZCBBVlgtNTEyIHRhcmdldHMgYWxsb3cgbWFza3MgZm9yIGNvbnNlY3V0aXZlIGxvYWQgYW5kIHN0b3JlCisgIGJvb2wgaXNMZWdhbE1hc2tlZFN0b3JlKFR5cGUgKkRhdGFUeXBlKSBjb25zdDsKKyAgYm9vbCBpc0xlZ2FsTWFza2VkTG9hZChUeXBlICpEYXRhVHlwZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IHN1cHBvcnRzIG1hc2tlZCBnYXRoZXIvc2NhdHRlcgorICAvLy8gQVZYLTUxMiBmdWxseSBzdXBwb3J0cyBnYXRoZXIgYW5kIHNjYXR0ZXIgZm9yIHZlY3RvcnMgd2l0aCAzMiBhbmQgNjQKKyAgLy8vIGJpdHMgc2NhbGFyIHR5cGUuCisgIGJvb2wgaXNMZWdhbE1hc2tlZFNjYXR0ZXIoVHlwZSAqRGF0YVR5cGUpIGNvbnN0OworICBib29sIGlzTGVnYWxNYXNrZWRHYXRoZXIoVHlwZSAqRGF0YVR5cGUpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IGhhcyBhIHVuaWZpZWQgb3BlcmF0aW9uIHRvIGNhbGN1bGF0ZSBkaXZpc2lvbgorICAvLy8gYW5kIHJlbWFpbmRlci4gSWYgc28sIHRoZSBhZGRpdGlvbmFsIGltcGxpY2l0IG11bHRpcGxpY2F0aW9uIGFuZAorICAvLy8gc3VidHJhY3Rpb24gcmVxdWlyZWQgdG8gY2FsY3VsYXRlIGEgcmVtYWluZGVyIGZyb20gZGl2aXNpb24gYXJlIGZyZWUuIFRoaXMKKyAgLy8vIGNhbiBlbmFibGUgbW9yZSBhZ2dyZXNzaXZlIHRyYW5zZm9ybWF0aW9ucyBmb3IgZGl2aXNpb24gYW5kIHJlbWFpbmRlciB0aGFuCisgIC8vLyB3b3VsZCB0eXBpY2FsbHkgYmUgYWxsb3dlZCB1c2luZyB0aHJvdWdocHV0IG9yIHNpemUgY29zdCBtb2RlbHMuCisgIGJvb2wgaGFzRGl2UmVtT3AoVHlwZSAqRGF0YVR5cGUsIGJvb2wgSXNTaWduZWQpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gKGFzc3VtZWQgdG8gYmUgYSBtZW1vcnkgYWNjZXNzCisgIC8vLyBpbnN0cnVjdGlvbikgaGFzIGEgdm9sYXRpbGUgdmFyaWFudC4gSWYgdGhhdCdzIHRoZSBjYXNlIHRoZW4gd2UgY2FuIGF2b2lkCisgIC8vLyBhZGRyc3BhY2VjYXN0IHRvIGdlbmVyaWMgQVMgZm9yIHZvbGF0aWxlIGxvYWRzL3N0b3Jlcy4gRGVmYXVsdAorICAvLy8gaW1wbGVtZW50YXRpb24gcmV0dXJucyBmYWxzZSwgd2hpY2ggcHJldmVudHMgYWRkcmVzcyBzcGFjZSBpbmZlcmVuY2UgZm9yCisgIC8vLyB2b2xhdGlsZSBsb2Fkcy9zdG9yZXMuCisgIGJvb2wgaGFzVm9sYXRpbGVWYXJpYW50KEluc3RydWN0aW9uICpJLCB1bnNpZ25lZCBBZGRyU3BhY2UpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0YXJnZXQgZG9lc24ndCBtaW5kIGFkZHJlc3NlcyBpbiB2ZWN0b3JzLgorICBib29sIHByZWZlcnNWZWN0b3JpemVkQWRkcmVzc2luZygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBjb3N0IG9mIHRoZSBzY2FsaW5nIGZhY3RvciB1c2VkIGluIHRoZSBhZGRyZXNzaW5nCisgIC8vLyBtb2RlIHJlcHJlc2VudGVkIGJ5IEFNIGZvciB0aGlzIHRhcmdldCwgZm9yIGEgbG9hZC9zdG9yZQorICAvLy8gb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorICAvLy8gSWYgdGhlIEFNIGlzIHN1cHBvcnRlZCwgdGhlIHJldHVybiB2YWx1ZSBtdXN0IGJlID49IDAuCisgIC8vLyBJZiB0aGUgQU0gaXMgbm90IHN1cHBvcnRlZCwgaXQgcmV0dXJucyBhIG5lZ2F0aXZlIHZhbHVlLgorICAvLy8gVE9ETzogSGFuZGxlIHByZS9wb3N0aW5jIGFzIHdlbGwuCisgIGludCBnZXRTY2FsaW5nRmFjdG9yQ29zdChUeXBlICpUeSwgR2xvYmFsVmFsdWUgKkJhc2VHViwgaW50NjRfdCBCYXNlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNCYXNlUmVnLCBpbnQ2NF90IFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkclNwYWNlID0gMCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgbG9vcCBzdHJlbmd0aCByZWR1Y2UgcGFzcyBzaG91bGQgbWFrZQorICAvLy8gSW5zdHJ1Y3Rpb24qIGJhc2VkIFRUSSBxdWVyaWVzIHRvIGlzTGVnYWxBZGRyZXNzaW5nTW9kZSgpLiBUaGlzIGlzCisgIC8vLyBuZWVkZWQgb24gU3lzdGVtWiwgd2hlcmUgZS5nLiBhIG1lbWNweSBjYW4gb25seSBoYXZlIGEgMTIgYml0IHVuc2lnbmVkCisgIC8vLyBpbW1lZGlhdGUgb2Zmc2V0IGFuZCBubyBpbmRleCByZWdpc3Rlci4KKyAgYm9vbCBMU1JXaXRoSW5zdHJRdWVyaWVzKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBpdCdzIGZyZWUgdG8gdHJ1bmNhdGUgYSB2YWx1ZSBvZiB0eXBlIFR5MSB0byB0eXBlCisgIC8vLyBUeTIuIGUuZy4gT24geDg2IGl0J3MgZnJlZSB0byB0cnVuY2F0ZSBhIGkzMiB2YWx1ZSBpbiByZWdpc3RlciBFQVggdG8gaTE2CisgIC8vLyBieSByZWZlcmVuY2luZyBpdHMgc3ViLXJlZ2lzdGVyIEFYLgorICBib29sIGlzVHJ1bmNhdGVGcmVlKFR5cGUgKlR5MSwgVHlwZSAqVHkyKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIGl0IGlzIHByb2ZpdGFibGUgdG8gaG9pc3QgaW5zdHJ1Y3Rpb24gaW4gdGhlCisgIC8vLyB0aGVuL2Vsc2UgdG8gYmVmb3JlIGlmLgorICBib29sIGlzUHJvZml0YWJsZVRvSG9pc3QoSW5zdHJ1Y3Rpb24gKkkpIGNvbnN0OworCisgIGJvb2wgdXNlQUEoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgdHlwZSBpcyBsZWdhbC4KKyAgYm9vbCBpc1R5cGVMZWdhbChUeXBlICpUeSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSB0YXJnZXQncyBqbXBfYnVmIGFsaWdubWVudCBpbiBieXRlcy4KKyAgdW5zaWduZWQgZ2V0SnVtcEJ1ZkFsaWdubWVudCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgdGFyZ2V0J3Mgam1wX2J1ZiBzaXplIGluIGJ5dGVzLgorICB1bnNpZ25lZCBnZXRKdW1wQnVmU2l6ZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgc3dpdGNoZXMgc2hvdWxkIGJlIHR1cm5lZCBpbnRvIGxvb2t1cCB0YWJsZXMgZm9yIHRoZQorICAvLy8gdGFyZ2V0LgorICBib29sIHNob3VsZEJ1aWxkTG9va3VwVGFibGVzKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBzd2l0Y2hlcyBzaG91bGQgYmUgdHVybmVkIGludG8gbG9va3VwIHRhYmxlcworICAvLy8gY29udGFpbmluZyB0aGlzIGNvbnN0YW50IHZhbHVlIGZvciB0aGUgdGFyZ2V0LgorICBib29sIHNob3VsZEJ1aWxkTG9va3VwVGFibGVzRm9yQ29uc3RhbnQoQ29uc3RhbnQgKkMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGlucHV0IGZ1bmN0aW9uIHdoaWNoIGlzIGNvbGQgYXQgYWxsIGNhbGwgc2l0ZXMsCisgIC8vLyAgc2hvdWxkIHVzZSBjb2xkY2MgY2FsbGluZyBjb252ZW50aW9uLgorICBib29sIHVzZUNvbGRDQ0ZvckNvbGRDYWxsKEZ1bmN0aW9uICZGKSBjb25zdDsKKworICB1bnNpZ25lZCBnZXRTY2FsYXJpemF0aW9uT3ZlcmhlYWQoVHlwZSAqVHksIGJvb2wgSW5zZXJ0LCBib29sIEV4dHJhY3QpIGNvbnN0OworCisgIHVuc2lnbmVkIGdldE9wZXJhbmRzU2NhbGFyaXphdGlvbk92ZXJoZWFkKEFycmF5UmVmPGNvbnN0IFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZGKSBjb25zdDsKKworICAvLy8gSWYgdGFyZ2V0IGhhcyBlZmZpY2llbnQgdmVjdG9yIGVsZW1lbnQgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMsIGl0IGNhbgorICAvLy8gcmV0dXJuIHRydWUgaGVyZSBzbyB0aGF0IGluc2VydGlvbi9leHRyYWN0aW9uIGNvc3RzIGFyZSBub3QgYWRkZWQgdG8KKyAgLy8vIHRoZSBzY2FsYXJpemF0aW9uIGNvc3Qgb2YgYSBsb2FkL3N0b3JlLgorICBib29sIHN1cHBvcnRzRWZmaWNpZW50VmVjdG9yRWxlbWVudExvYWRTdG9yZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRG9uJ3QgcmVzdHJpY3QgaW50ZXJsZWF2ZWQgdW5yb2xsaW5nIHRvIHNtYWxsIGxvb3BzLgorICBib29sIGVuYWJsZUFnZ3Jlc3NpdmVJbnRlcmxlYXZpbmcoYm9vbCBMb29wSGFzUmVkdWN0aW9ucykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJZiBub3QgbnVsbHB0ciwgZW5hYmxlIGlubGluZSBleHBhbnNpb24gb2YgbWVtY21wLiBJc1plcm9DbXAgaXMKKyAgLy8vIHRydWUgaWYgdGhpcyBpcyB0aGUgZXhwYW5zaW9uIG9mIG1lbWNtcChwMSwgcDIsIHMpID09IDAuCisgIHN0cnVjdCBNZW1DbXBFeHBhbnNpb25PcHRpb25zIHsKKyAgICAvLyBUaGUgbGlzdCBvZiBhdmFpbGFibGUgbG9hZCBzaXplcyAoaW4gYnl0ZXMpLCBzb3J0ZWQgaW4gZGVjcmVhc2luZyBvcmRlci4KKyAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgOD4gTG9hZFNpemVzOworICB9OworICBjb25zdCBNZW1DbXBFeHBhbnNpb25PcHRpb25zICplbmFibGVNZW1DbXBFeHBhbnNpb24oYm9vbCBJc1plcm9DbXApIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRW5hYmxlIG1hdGNoaW5nIG9mIGludGVybGVhdmVkIGFjY2VzcyBncm91cHMuCisgIGJvb2wgZW5hYmxlSW50ZXJsZWF2ZWRBY2Nlc3NWZWN0b3JpemF0aW9uKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJbmRpY2F0ZSB0aGF0IGl0IGlzIHBvdGVudGlhbGx5IHVuc2FmZSB0byBhdXRvbWF0aWNhbGx5IHZlY3Rvcml6ZQorICAvLy8gZmxvYXRpbmctcG9pbnQgb3BlcmF0aW9ucyBiZWNhdXNlIHRoZSBzZW1hbnRpY3Mgb2YgdmVjdG9yIGFuZCBzY2FsYXIKKyAgLy8vIGZsb2F0aW5nLXBvaW50IHNlbWFudGljcyBtYXkgZGlmZmVyLiBGb3IgZXhhbXBsZSwgQVJNIE5FT04gdjcgU0lNRCBtYXRoCisgIC8vLyBkb2VzIG5vdCBzdXBwb3J0IElFRUUtNzU0IGRlbm9ybWFsIG51bWJlcnMsIHdoaWxlIGRlcGVuZGluZyBvbiB0aGUKKyAgLy8vIHBsYXRmb3JtLCBzY2FsYXIgZmxvYXRpbmctcG9pbnQgbWF0aCBkb2VzLgorICAvLy8gVGhpcyBhcHBsaWVzIHRvIGZsb2F0aW5nLXBvaW50IG1hdGggb3BlcmF0aW9ucyBhbmQgY2FsbHMsIG5vdCBtZW1vcnkKKyAgLy8vIG9wZXJhdGlvbnMsIHNodWZmbGVzLCBvciBjYXN0cy4KKyAgYm9vbCBpc0ZQVmVjdG9yaXphdGlvblBvdGVudGlhbGx5VW5zYWZlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgaWYgdGhlIHRhcmdldCBzdXBwb3J0cyB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzLgorICBib29sIGFsbG93c01pc2FsaWduZWRNZW1vcnlBY2Nlc3NlcyhMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQml0V2lkdGgsIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKkZhc3QgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiBoYXJkd2FyZSBzdXBwb3J0IGZvciBwb3B1bGF0aW9uIGNvdW50LgorICBQb3BjbnRTdXBwb3J0S2luZCBnZXRQb3BjbnRTdXBwb3J0KHVuc2lnbmVkIEludFR5V2lkdGhJbkJpdCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgaGFyZHdhcmUgaGFzIGEgZmFzdCBzcXVhcmUtcm9vdCBpbnN0cnVjdGlvbi4KKyAgYm9vbCBoYXZlRmFzdFNxcnQoVHlwZSAqVHkpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBmYXN0ZXIgdG8gY2hlY2sgaWYgYSBmbG9hdGluZy1wb2ludCB2YWx1ZSBpcyBOYU4KKyAgLy8vIChvciBub3QtTmFOKSB2ZXJzdXMgYSBjb21wYXJpc29uIGFnYWluc3QgYSBjb25zdGFudCBGUCB6ZXJvIHZhbHVlLgorICAvLy8gVGFyZ2V0cyBzaG91bGQgb3ZlcnJpZGUgdGhpcyBpZiBtYXRlcmlhbGl6aW5nIGEgMC4wIGZvciBjb21wYXJpc29uIGlzCisgIC8vLyBnZW5lcmFsbHkgYXMgY2hlYXAgYXMgY2hlY2tpbmcgZm9yIG9yZGVyZWQvdW5vcmRlcmVkLgorICBib29sIGlzRkNtcE9yZENoZWFwZXJUaGFuRkNtcFplcm8oVHlwZSAqVHkpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBleHBlY3RlZCBjb3N0IG9mIHN1cHBvcnRpbmcgdGhlIGZsb2F0aW5nIHBvaW50IG9wZXJhdGlvbgorICAvLy8gb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorICBpbnQgZ2V0RlBPcENvc3QoVHlwZSAqVHkpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBleHBlY3RlZCBjb3N0IG9mIG1hdGVyaWFsaXppbmcgZm9yIHRoZSBnaXZlbiBpbnRlZ2VyCisgIC8vLyBpbW1lZGlhdGUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorICBpbnQgZ2V0SW50SW1tQ29zdChjb25zdCBBUEludCAmSW1tLCBUeXBlICpUeSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGV4cGVjdGVkIGNvc3Qgb2YgbWF0ZXJpYWxpemF0aW9uIGZvciB0aGUgZ2l2ZW4gaW50ZWdlcgorICAvLy8gaW1tZWRpYXRlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBmb3IgYSBnaXZlbiBpbnN0cnVjdGlvbi4gVGhlIGNvc3QgY2FuIGJlCisgIC8vLyB6ZXJvIGlmIHRoZSBpbW1lZGlhdGUgY2FuIGJlIGZvbGRlZCBpbnRvIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uCisgIGludCBnZXRJbnRJbW1Db3N0KHVuc2lnbmVkIE9wYywgdW5zaWduZWQgSWR4LCBjb25zdCBBUEludCAmSW1tLAorICAgICAgICAgICAgICAgICAgICBUeXBlICpUeSkgY29uc3Q7CisgIGludCBnZXRJbnRJbW1Db3N0KEludHJpbnNpYzo6SUQgSUlELCB1bnNpZ25lZCBJZHgsIGNvbnN0IEFQSW50ICZJbW0sCisgICAgICAgICAgICAgICAgICAgIFR5cGUgKlR5KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZXhwZWN0ZWQgY29zdCBmb3IgdGhlIGdpdmVuIGludGVnZXIgd2hlbiBvcHRpbWlzaW5nCisgIC8vLyBmb3Igc2l6ZS4gVGhpcyBpcyBkaWZmZXJlbnQgdGhhbiB0aGUgb3RoZXIgaW50ZWdlciBpbW1lZGlhdGUgY29zdAorICAvLy8gZnVuY3Rpb25zIGluIHRoYXQgaXQgaXMgc3VidGFyZ2V0IGFnbm9zdGljLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSBlLmcuCisgIC8vLyB0YXJnZXQgb25lIElTQSBzdWNoIGFzIEFhcmNoMzIgYnV0IHNtYWxsZXIgZW5jb2RpbmdzIGNvdWxkIGJlIHBvc3NpYmxlCisgIC8vLyB3aXRoIGFub3RoZXIgc3VjaCBhcyBUaHVtYi4gVGhpcyByZXR1cm4gdmFsdWUgaXMgdXNlZCBhcyBhIHBlbmFsdHkgd2hlbgorICAvLy8gdGhlIHRvdGFsIGNvc3RzIGZvciBhIGNvbnN0YW50IGlzIGNhbGN1bGF0ZWQgKHRoZSBiaWdnZXIgdGhlIGNvc3QsIHRoZQorICAvLy8gbW9yZSBiZW5lZmljaWFsIGNvbnN0YW50IGhvaXN0aW5nIGlzKS4KKyAgaW50IGdldEludEltbUNvZGVTaXplQ29zdCh1bnNpZ25lZCBPcGMsIHVuc2lnbmVkIElkeCwgY29uc3QgQVBJbnQgJkltbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpUeSkgY29uc3Q7CisgIC8vLyBAfQorCisgIC8vLyBcbmFtZSBWZWN0b3IgVGFyZ2V0IEluZm9ybWF0aW9uCisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgVGhlIHZhcmlvdXMga2luZHMgb2Ygc2h1ZmZsZSBwYXR0ZXJucyBmb3IgdmVjdG9yIHF1ZXJpZXMuCisgIGVudW0gU2h1ZmZsZUtpbmQgeworICAgIFNLX0Jyb2FkY2FzdCwgICAgICAgLy8vPCBCcm9hZGNhc3QgZWxlbWVudCAwIHRvIGFsbCBvdGhlciBlbGVtZW50cy4KKyAgICBTS19SZXZlcnNlLCAgICAgICAgIC8vLzwgUmV2ZXJzZSB0aGUgb3JkZXIgb2YgdGhlIHZlY3Rvci4KKyAgICBTS19BbHRlcm5hdGUsICAgICAgIC8vLzwgQ2hvb3NlIGFsdGVybmF0ZSBlbGVtZW50cyBmcm9tIHZlY3Rvci4KKyAgICBTS19JbnNlcnRTdWJ2ZWN0b3IsIC8vLzwgSW5zZXJ0U3VidmVjdG9yLiBJbmRleCBpbmRpY2F0ZXMgc3RhcnQgb2Zmc2V0LgorICAgIFNLX0V4dHJhY3RTdWJ2ZWN0b3IsLy8vPCBFeHRyYWN0U3VidmVjdG9yIEluZGV4IGluZGljYXRlcyBzdGFydCBvZmZzZXQuCisgICAgU0tfUGVybXV0ZVR3b1NyYywgICAvLy88IE1lcmdlIGVsZW1lbnRzIGZyb20gdHdvIHNvdXJjZSB2ZWN0b3JzIGludG8gb25lCisgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHdpdGggYW55IHNodWZmbGUgbWFzay4KKyAgICBTS19QZXJtdXRlU2luZ2xlU3JjIC8vLzwgU2h1ZmZsZSBlbGVtZW50cyBvZiBzaW5nbGUgc291cmNlIHZlY3RvciB3aXRoIGFueQorICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBzaHVmZmxlIG1hc2suCisgIH07CisKKyAgLy8vIFxicmllZiBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IGFuIG9wZXJhbmQncyBwb3NzaWJsZSB2YWx1ZXMuCisgIGVudW0gT3BlcmFuZFZhbHVlS2luZCB7CisgICAgT0tfQW55VmFsdWUsICAgICAgICAgICAgICAgLy8gT3BlcmFuZCBjYW4gaGF2ZSBhbnkgdmFsdWUuCisgICAgT0tfVW5pZm9ybVZhbHVlLCAgICAgICAgICAgLy8gT3BlcmFuZCBpcyB1bmlmb3JtIChzcGxhdCBvZiBhIHZhbHVlKS4KKyAgICBPS19Vbmlmb3JtQ29uc3RhbnRWYWx1ZSwgICAvLyBPcGVyYW5kIGlzIHVuaWZvcm0gY29uc3RhbnQuCisgICAgT0tfTm9uVW5pZm9ybUNvbnN0YW50VmFsdWUgLy8gT3BlcmFuZCBpcyBhIG5vbiB1bmlmb3JtIGNvbnN0YW50IHZhbHVlLgorICB9OworCisgIC8vLyBcYnJpZWYgQWRkaXRpb25hbCBwcm9wZXJ0aWVzIG9mIGFuIG9wZXJhbmQncyB2YWx1ZXMuCisgIGVudW0gT3BlcmFuZFZhbHVlUHJvcGVydGllcyB7IE9QX05vbmUgPSAwLCBPUF9Qb3dlck9mMiA9IDEgfTsKKworICAvLy8gXHJldHVybiBUaGUgbnVtYmVyIG9mIHNjYWxhciBvciB2ZWN0b3IgcmVnaXN0ZXJzIHRoYXQgdGhlIHRhcmdldCBoYXMuCisgIC8vLyBJZiAnVmVjdG9ycycgaXMgdHJ1ZSwgaXQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHZlY3RvciByZWdpc3RlcnMuIElmIGl0IGlzCisgIC8vLyBzZXQgdG8gZmFsc2UsIGl0IHJldHVybnMgdGhlIG51bWJlciBvZiBzY2FsYXIgcmVnaXN0ZXJzLgorICB1bnNpZ25lZCBnZXROdW1iZXJPZlJlZ2lzdGVycyhib29sIFZlY3RvcikgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm4gVGhlIHdpZHRoIG9mIHRoZSBsYXJnZXN0IHNjYWxhciBvciB2ZWN0b3IgcmVnaXN0ZXIgdHlwZS4KKyAgdW5zaWduZWQgZ2V0UmVnaXN0ZXJCaXRXaWR0aChib29sIFZlY3RvcikgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm4gVGhlIHdpZHRoIG9mIHRoZSBzbWFsbGVzdCB2ZWN0b3IgcmVnaXN0ZXIgdHlwZS4KKyAgdW5zaWduZWQgZ2V0TWluVmVjdG9yUmVnaXN0ZXJCaXRXaWR0aCgpIGNvbnN0OworCisgIC8vLyBccmV0dXJuIFRydWUgaWYgdGhlIHZlY3Rvcml6YXRpb24gZmFjdG9yIHNob3VsZCBiZSBjaG9zZW4gdG8KKyAgLy8vIG1ha2UgdGhlIHZlY3RvciBvZiB0aGUgc21hbGxlc3QgZWxlbWVudCB0eXBlIG1hdGNoIHRoZSBzaXplIG9mIGEKKyAgLy8vIHZlY3RvciByZWdpc3Rlci4gRm9yIHdpZGVyIGVsZW1lbnQgdHlwZXMsIHRoaXMgY291bGQgcmVzdWx0IGluCisgIC8vLyBjcmVhdGluZyB2ZWN0b3JzIHRoYXQgc3BhbiBtdWx0aXBsZSB2ZWN0b3IgcmVnaXN0ZXJzLgorICAvLy8gSWYgZmFsc2UsIHRoZSB2ZWN0b3JpemF0aW9uIGZhY3RvciB3aWxsIGJlIGNob3NlbiBiYXNlZCBvbiB0aGUKKyAgLy8vIHNpemUgb2YgdGhlIHdpZGVzdCBlbGVtZW50IHR5cGUuCisgIGJvb2wgc2hvdWxkTWF4aW1pemVWZWN0b3JCYW5kd2lkdGgoYm9vbCBPcHRTaXplKSBjb25zdDsKKworICAvLy8gXHJldHVybiBUcnVlIGlmIGl0IHNob3VsZCBiZSBjb25zaWRlcmVkIGZvciBhZGRyZXNzIHR5cGUgcHJvbW90aW9uLgorICAvLy8gXHAgQWxsb3dQcm9tb3Rpb25XaXRob3V0Q29tbW9uSGVhZGVyIFNldCB0cnVlIGlmIHByb21vdGluZyBccCBJIGlzCisgIC8vLyBwcm9maXRhYmxlIHdpdGhvdXQgZmluZGluZyBvdGhlciBleHRlbnNpb25zIGZlZCBieSB0aGUgc2FtZSBpbnB1dC4KKyAgYm9vbCBzaG91bGRDb25zaWRlckFkZHJlc3NUeXBlUHJvbW90aW9uKAorICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gJkksIGJvb2wgJkFsbG93UHJvbW90aW9uV2l0aG91dENvbW1vbkhlYWRlcikgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm4gVGhlIHNpemUgb2YgYSBjYWNoZSBsaW5lIGluIGJ5dGVzLgorICB1bnNpZ25lZCBnZXRDYWNoZUxpbmVTaXplKCkgY29uc3Q7CisKKyAgLy8vIFRoZSBwb3NzaWJsZSBjYWNoZSBsZXZlbHMKKyAgZW51bSBjbGFzcyBDYWNoZUxldmVsIHsKKyAgICBMMUQsICAgLy8gVGhlIEwxIGRhdGEgY2FjaGUKKyAgICBMMkQsICAgLy8gVGhlIEwyIGRhdGEgY2FjaGUKKworICAgIC8vIFdlIGN1cnJlbnRseSBkbyBub3QgbW9kZWwgTDMgY2FjaGVzLCBhcyB0aGVpciBzaXplcyBkaWZmZXIgd2lkZWx5IGJldHdlZW4KKyAgICAvLyBtaWNyb2FyY2hpdGVjdHVyZXMuIEFsc28sIHdlIGN1cnJlbnRseSBkbyBub3QgaGF2ZSBhIHVzZSBmb3IgTDMgY2FjaGUKKyAgICAvLyBzaXplIG1vZGVsaW5nIHlldC4KKyAgfTsKKworICAvLy8gXHJldHVybiBUaGUgc2l6ZSBvZiB0aGUgY2FjaGUgbGV2ZWwgaW4gYnl0ZXMsIGlmIGF2YWlsYWJsZS4KKyAgbGx2bTo6T3B0aW9uYWw8dW5zaWduZWQ+IGdldENhY2hlU2l6ZShDYWNoZUxldmVsIExldmVsKSBjb25zdDsKKworICAvLy8gXHJldHVybiBUaGUgYXNzb2NpYXRpdml0eSBvZiB0aGUgY2FjaGUgbGV2ZWwsIGlmIGF2YWlsYWJsZS4KKyAgbGx2bTo6T3B0aW9uYWw8dW5zaWduZWQ+IGdldENhY2hlQXNzb2NpYXRpdml0eShDYWNoZUxldmVsIExldmVsKSBjb25zdDsKKworICAvLy8gXHJldHVybiBIb3cgbXVjaCBiZWZvcmUgYSBsb2FkIHdlIHNob3VsZCBwbGFjZSB0aGUgcHJlZmV0Y2ggaW5zdHJ1Y3Rpb24uCisgIC8vLyBUaGlzIGlzIGN1cnJlbnRseSBtZWFzdXJlZCBpbiBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zLgorICB1bnNpZ25lZCBnZXRQcmVmZXRjaERpc3RhbmNlKCkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm4gU29tZSBIVyBwcmVmZXRjaGVycyBjYW4gaGFuZGxlIGFjY2Vzc2VzIHVwIHRvIGEgY2VydGFpbiBjb25zdGFudAorICAvLy8gc3RyaWRlLiAgVGhpcyBpcyB0aGUgbWluaW11bSBzdHJpZGUgaW4gYnl0ZXMgd2hlcmUgaXQgbWFrZXMgc2Vuc2UgdG8gc3RhcnQKKyAgLy8vIGFkZGluZyBTVyBwcmVmZXRjaGVzLiAgVGhlIGRlZmF1bHQgaXMgMSwgaS5lLiBwcmVmZXRjaCB3aXRoIGFueSBzdHJpZGUuCisgIHVuc2lnbmVkIGdldE1pblByZWZldGNoU3RyaWRlKCkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm4gVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZXJhdGlvbnMgdG8gcHJlZmV0Y2ggYWhlYWQuICBJZiB0aGUKKyAgLy8vIHJlcXVpcmVkIG51bWJlciBvZiBpdGVyYXRpb25zIGlzIG1vcmUgdGhhbiB0aGlzIG51bWJlciwgbm8gcHJlZmV0Y2hpbmcgaXMKKyAgLy8vIHBlcmZvcm1lZC4KKyAgdW5zaWduZWQgZ2V0TWF4UHJlZmV0Y2hJdGVyYXRpb25zQWhlYWQoKSBjb25zdDsKKworICAvLy8gXHJldHVybiBUaGUgbWF4aW11bSBpbnRlcmxlYXZlIGZhY3RvciB0aGF0IGFueSB0cmFuc2Zvcm0gc2hvdWxkIHRyeSB0bworICAvLy8gcGVyZm9ybSBmb3IgdGhpcyB0YXJnZXQuIFRoaXMgbnVtYmVyIGRlcGVuZHMgb24gdGhlIGxldmVsIG9mIHBhcmFsbGVsaXNtCisgIC8vLyBhbmQgdGhlIG51bWJlciBvZiBleGVjdXRpb24gdW5pdHMgaW4gdGhlIENQVS4KKyAgdW5zaWduZWQgZ2V0TWF4SW50ZXJsZWF2ZUZhY3Rvcih1bnNpZ25lZCBWRikgY29uc3Q7CisKKyAgLy8vIFRoaXMgaXMgYW4gYXBwcm94aW1hdGlvbiBvZiByZWNpcHJvY2FsIHRocm91Z2hwdXQgb2YgYSBtYXRoL2xvZ2ljIG9wLgorICAvLy8gQSBoaWdoZXIgY29zdCBpbmRpY2F0ZXMgbGVzcyBleHBlY3RlZCB0aHJvdWdocHV0LgorICAvLy8gRnJvbSBBZ25lciBGb2cncyBndWlkZXMsIHJlY2lwcm9jYWwgdGhyb3VnaHB1dCBpcyAidGhlIGF2ZXJhZ2UgbnVtYmVyIG9mCisgIC8vLyBjbG9jayBjeWNsZXMgcGVyIGluc3RydWN0aW9uIHdoZW4gdGhlIGluc3RydWN0aW9ucyBhcmUgbm90IHBhcnQgb2YgYQorICAvLy8gbGltaXRpbmcgZGVwZW5kZW5jeSBjaGFpbi4iCisgIC8vLyBUaGVyZWZvcmUsIGNvc3RzIHNob3VsZCBiZSBzY2FsZWQgdG8gYWNjb3VudCBmb3IgbXVsdGlwbGUgZXhlY3V0aW9uIHVuaXRzCisgIC8vLyBvbiB0aGUgdGFyZ2V0IHRoYXQgY2FuIHByb2Nlc3MgdGhpcyB0eXBlIG9mIGluc3RydWN0aW9uLiBGb3IgZXhhbXBsZSwgaWYKKyAgLy8vIHRoZXJlIGFyZSA1IHNjYWxhciBpbnRlZ2VyIHVuaXRzIGFuZCAyIHZlY3RvciBpbnRlZ2VyIHVuaXRzIHRoYXQgY2FuCisgIC8vLyBjYWxjdWxhdGUgYW4gJ2FkZCcgaW4gYSBzaW5nbGUgY3ljbGUsIHRoaXMgbW9kZWwgc2hvdWxkIGluZGljYXRlIHRoYXQgdGhlCisgIC8vLyBjb3N0IG9mIHRoZSB2ZWN0b3IgYWRkIGluc3RydWN0aW9uIGlzIDIuNSB0aW1lcyB0aGUgY29zdCBvZiB0aGUgc2NhbGFyCisgIC8vLyBhZGQgaW5zdHJ1Y3Rpb24uCisgIC8vLyBccCBBcmdzIGlzIGFuIG9wdGlvbmFsIGFyZ3VtZW50IHdoaWNoIGhvbGRzIHRoZSBpbnN0cnVjdGlvbiBvcGVyYW5kcworICAvLy8gdmFsdWVzIHNvIHRoZSBUVEkgY2FuIGFuYWx5emUgdGhvc2UgdmFsdWVzIHNlYXJjaGluZyBmb3Igc3BlY2lhbAorICAvLy8gY2FzZXMgb3Igb3B0aW1pemF0aW9ucyBiYXNlZCBvbiB0aG9zZSB2YWx1ZXMuCisgIGludCBnZXRBcml0aG1ldGljSW5zdHJDb3N0KAorICAgICAgdW5zaWduZWQgT3Bjb2RlLCBUeXBlICpUeSwgT3BlcmFuZFZhbHVlS2luZCBPcGQxSW5mbyA9IE9LX0FueVZhbHVlLAorICAgICAgT3BlcmFuZFZhbHVlS2luZCBPcGQySW5mbyA9IE9LX0FueVZhbHVlLAorICAgICAgT3BlcmFuZFZhbHVlUHJvcGVydGllcyBPcGQxUHJvcEluZm8gPSBPUF9Ob25lLAorICAgICAgT3BlcmFuZFZhbHVlUHJvcGVydGllcyBPcGQyUHJvcEluZm8gPSBPUF9Ob25lLAorICAgICAgQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gQXJncyA9IEFycmF5UmVmPGNvbnN0IFZhbHVlICo+KCkpIGNvbnN0OworCisgIC8vLyBccmV0dXJuIFRoZSBjb3N0IG9mIGEgc2h1ZmZsZSBpbnN0cnVjdGlvbiBvZiBraW5kIEtpbmQgYW5kIG9mIHR5cGUgVHAuCisgIC8vLyBUaGUgaW5kZXggYW5kIHN1YnR5cGUgcGFyYW1ldGVycyBhcmUgdXNlZCBieSB0aGUgc3VidmVjdG9yIGluc2VydGlvbiBhbmQKKyAgLy8vIGV4dHJhY3Rpb24gc2h1ZmZsZSBraW5kcy4KKyAgaW50IGdldFNodWZmbGVDb3N0KFNodWZmbGVLaW5kIEtpbmQsIFR5cGUgKlRwLCBpbnQgSW5kZXggPSAwLAorICAgICAgICAgICAgICAgICAgICAgVHlwZSAqU3ViVHAgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gXHJldHVybiBUaGUgZXhwZWN0ZWQgY29zdCBvZiBjYXN0IGluc3RydWN0aW9ucywgc3VjaCBhcyBiaXRjYXN0LCB0cnVuYywKKyAgLy8vIHpleHQsIGV0Yy4gSWYgdGhlcmUgaXMgYW4gZXhpc3RpbmcgaW5zdHJ1Y3Rpb24gdGhhdCBob2xkcyBPcGNvZGUsIGl0CisgIC8vLyBtYXkgYmUgcGFzc2VkIGluIHRoZSAnSScgcGFyYW1ldGVyLgorICBpbnQgZ2V0Q2FzdEluc3RyQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKkRzdCwgVHlwZSAqU3JjLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqSSA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBccmV0dXJuIFRoZSBleHBlY3RlZCBjb3N0IG9mIGEgc2lnbi0gb3IgemVyby1leHRlbmRlZCB2ZWN0b3IgZXh0cmFjdC4gVXNlCisgIC8vLyAtMSB0byBpbmRpY2F0ZSB0aGF0IHRoZXJlIGlzIG5vIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbmRleCB2YWx1ZS4KKyAgaW50IGdldEV4dHJhY3RXaXRoRXh0ZW5kQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKkRzdCwgVmVjdG9yVHlwZSAqVmVjVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5kZXggPSAtMSkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm4gVGhlIGV4cGVjdGVkIGNvc3Qgb2YgY29udHJvbC1mbG93IHJlbGF0ZWQgaW5zdHJ1Y3Rpb25zIHN1Y2ggYXMKKyAgLy8vIFBoaSwgUmV0LCBCci4KKyAgaW50IGdldENGSW5zdHJDb3N0KHVuc2lnbmVkIE9wY29kZSkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm5zIFRoZSBleHBlY3RlZCBjb3N0IG9mIGNvbXBhcmUgYW5kIHNlbGVjdCBpbnN0cnVjdGlvbnMuIElmIHRoZXJlCisgIC8vLyBpcyBhbiBleGlzdGluZyBpbnN0cnVjdGlvbiB0aGF0IGhvbGRzIE9wY29kZSwgaXQgbWF5IGJlIHBhc3NlZCBpbiB0aGUKKyAgLy8vICdJJyBwYXJhbWV0ZXIuCisgIGludCBnZXRDbXBTZWxJbnN0ckNvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpWYWxUeSwKKyAgICAgICAgICAgICAgICAgVHlwZSAqQ29uZFR5ID0gbnVsbHB0ciwgY29uc3QgSW5zdHJ1Y3Rpb24gKkkgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gXHJldHVybiBUaGUgZXhwZWN0ZWQgY29zdCBvZiB2ZWN0b3IgSW5zZXJ0IGFuZCBFeHRyYWN0LgorICAvLy8gVXNlIC0xIHRvIGluZGljYXRlIHRoYXQgdGhlcmUgaXMgbm8gaW5mb3JtYXRpb24gb24gdGhlIGluZGV4IHZhbHVlLgorICBpbnQgZ2V0VmVjdG9ySW5zdHJDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVmFsLCB1bnNpZ25lZCBJbmRleCA9IC0xKSBjb25zdDsKKworICAvLy8gXHJldHVybiBUaGUgY29zdCBvZiBMb2FkIGFuZCBTdG9yZSBpbnN0cnVjdGlvbnMuCisgIGludCBnZXRNZW1vcnlPcENvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpTcmMsIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyZXNzU3BhY2UsIGNvbnN0IEluc3RydWN0aW9uICpJID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm4gVGhlIGNvc3Qgb2YgbWFza2VkIExvYWQgYW5kIFN0b3JlIGluc3RydWN0aW9ucy4KKyAgaW50IGdldE1hc2tlZE1lbW9yeU9wQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlNyYywgdW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm4gVGhlIGNvc3Qgb2YgR2F0aGVyIG9yIFNjYXR0ZXIgb3BlcmF0aW9uCisgIC8vLyBccCBPcGNvZGUgLSBpcyBhIHR5cGUgb2YgbWVtb3J5IGFjY2VzcyBMb2FkIG9yIFN0b3JlCisgIC8vLyBccCBEYXRhVHkgLSBhIHZlY3RvciB0eXBlIG9mIHRoZSBkYXRhIHRvIGJlIGxvYWRlZCBvciBzdG9yZWQKKyAgLy8vIFxwIFB0ciAtIHBvaW50ZXIgW29yIHZlY3RvciBvZiBwb2ludGVyc10gLSBhZGRyZXNzW2VzXSBpbiBtZW1vcnkKKyAgLy8vIFxwIFZhcmlhYmxlTWFzayAtIHRydWUgd2hlbiB0aGUgbWVtb3J5IGFjY2VzcyBpcyBwcmVkaWNhdGVkIHdpdGggYSBtYXNrCisgIC8vLyAgICAgICAgICAgICAgICAgICB0aGF0IGlzIG5vdCBhIGNvbXBpbGUtdGltZSBjb25zdGFudAorICAvLy8gXHAgQWxpZ25tZW50IC0gYWxpZ25tZW50IG9mIHNpbmdsZSBlbGVtZW50CisgIGludCBnZXRHYXRoZXJTY2F0dGVyT3BDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqRGF0YVR5LCBWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFZhcmlhYmxlTWFzaywgdW5zaWduZWQgQWxpZ25tZW50KSBjb25zdDsKKworICAvLy8gXHJldHVybiBUaGUgY29zdCBvZiB0aGUgaW50ZXJsZWF2ZWQgbWVtb3J5IG9wZXJhdGlvbi4KKyAgLy8vIFxwIE9wY29kZSBpcyB0aGUgbWVtb3J5IG9wZXJhdGlvbiBjb2RlCisgIC8vLyBccCBWZWNUeSBpcyB0aGUgdmVjdG9yIHR5cGUgb2YgdGhlIGludGVybGVhdmVkIGFjY2Vzcy4KKyAgLy8vIFxwIEZhY3RvciBpcyB0aGUgaW50ZXJsZWF2ZSBmYWN0b3IKKyAgLy8vIFxwIEluZGljZXMgaXMgdGhlIGluZGljZXMgZm9yIGludGVybGVhdmVkIGxvYWQgbWVtYmVycyAoYXMgaW50ZXJsZWF2ZWQKKyAgLy8vICAgIGxvYWQgYWxsb3dzIGdhcHMpCisgIC8vLyBccCBBbGlnbm1lbnQgaXMgdGhlIGFsaWdubWVudCBvZiB0aGUgbWVtb3J5IG9wZXJhdGlvbgorICAvLy8gXHAgQWRkcmVzc1NwYWNlIGlzIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIHBvaW50ZXIuCisgIGludCBnZXRJbnRlcmxlYXZlZE1lbW9yeU9wQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlZlY1R5LCB1bnNpZ25lZCBGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gSW5kaWNlcywgdW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkcmVzc1NwYWNlKSBjb25zdDsKKworICAvLy8gXGJyaWVmIENhbGN1bGF0ZSB0aGUgY29zdCBvZiBwZXJmb3JtaW5nIGEgdmVjdG9yIHJlZHVjdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHRoZSBjb3N0IG9mIHJlZHVjaW5nIHRoZSB2ZWN0b3IgdmFsdWUgb2YgdHlwZSBccCBUeSB0byBhIHNjYWxhcgorICAvLy8gdmFsdWUgdXNpbmcgdGhlIG9wZXJhdGlvbiBkZW5vdGVkIGJ5IFxwIE9wY29kZS4gVGhlIGZvcm0gb2YgdGhlIHJlZHVjdGlvbgorICAvLy8gY2FuIGVpdGhlciBiZSBhIHBhaXJ3aXNlIHJlZHVjdGlvbiBvciBhIHJlZHVjdGlvbiB0aGF0IHNwbGl0cyB0aGUgdmVjdG9yCisgIC8vLyBhdCBldmVyeSByZWR1Y3Rpb24gbGV2ZWwuCisgIC8vLworICAvLy8gUGFpcndpc2U6CisgIC8vLyAgKHYwLCB2MSwgdjIsIHYzKQorICAvLy8gICgodjArdjEpLCAodjIrdjMpLCB1bmRlZiwgdW5kZWYpCisgIC8vLyBTcGxpdDoKKyAgLy8vICAodjAsIHYxLCB2MiwgdjMpCisgIC8vLyAgKCh2MCt2MiksICh2MSt2MyksIHVuZGVmLCB1bmRlZikKKyAgaW50IGdldEFyaXRobWV0aWNSZWR1Y3Rpb25Db3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzUGFpcndpc2VGb3JtKSBjb25zdDsKKyAgaW50IGdldE1pbk1heFJlZHVjdGlvbkNvc3QoVHlwZSAqVHksIFR5cGUgKkNvbmRUeSwgYm9vbCBJc1BhaXJ3aXNlRm9ybSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1Vuc2lnbmVkKSBjb25zdDsKKworICAvLy8gXHJldHVybnMgVGhlIGNvc3Qgb2YgSW50cmluc2ljIGluc3RydWN0aW9ucy4gQW5hbHlzZXMgdGhlIHJlYWwgYXJndW1lbnRzLgorICAvLy8gVGhyZWUgY2FzZXMgYXJlIGhhbmRsZWQ6IDEuIHNjYWxhciBpbnN0cnVjdGlvbiAyLiB2ZWN0b3IgaW5zdHJ1Y3Rpb24KKyAgLy8vIDMuIHNjYWxhciBpbnN0cnVjdGlvbiB3aGljaCBpcyB0byBiZSB2ZWN0b3JpemVkIHdpdGggVkYuCisgIGludCBnZXRJbnRyaW5zaWNJbnN0ckNvc3QoSW50cmluc2ljOjpJRCBJRCwgVHlwZSAqUmV0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywgRmFzdE1hdGhGbGFncyBGTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVkYgPSAxKSBjb25zdDsKKworICAvLy8gXHJldHVybnMgVGhlIGNvc3Qgb2YgSW50cmluc2ljIGluc3RydWN0aW9ucy4gVHlwZXMgYW5hbHlzaXMgb25seS4KKyAgLy8vIElmIFNjYWxhcml6YXRpb25Db3N0UGFzc2VkIGlzIFVJTlRfTUFYLCB0aGUgY29zdCBvZiBzY2FsYXJpemluZyB0aGUKKyAgLy8vIGFyZ3VtZW50cyBhbmQgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGNvbXB1dGVkIGJhc2VkIG9uIHR5cGVzLgorICBpbnQgZ2V0SW50cmluc2ljSW5zdHJDb3N0KEludHJpbnNpYzo6SUQgSUQsIFR5cGUgKlJldFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFR5cGUgKj4gVHlzLCBGYXN0TWF0aEZsYWdzIEZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTY2FsYXJpemF0aW9uQ29zdFBhc3NlZCA9IFVJTlRfTUFYKSBjb25zdDsKKworICAvLy8gXHJldHVybnMgVGhlIGNvc3Qgb2YgQ2FsbCBpbnN0cnVjdGlvbnMuCisgIGludCBnZXRDYWxsSW5zdHJDb3N0KEZ1bmN0aW9uICpGLCBUeXBlICpSZXRUeSwgQXJyYXlSZWY8VHlwZSAqPiBUeXMpIGNvbnN0OworCisgIC8vLyBccmV0dXJucyBUaGUgbnVtYmVyIG9mIHBpZWNlcyBpbnRvIHdoaWNoIHRoZSBwcm92aWRlZCB0eXBlIG11c3QgYmUKKyAgLy8vIHNwbGl0IGR1cmluZyBsZWdhbGl6YXRpb24uIFplcm8gaXMgcmV0dXJuZWQgd2hlbiB0aGUgYW5zd2VyIGlzIHVua25vd24uCisgIHVuc2lnbmVkIGdldE51bWJlck9mUGFydHMoVHlwZSAqVHApIGNvbnN0OworCisgIC8vLyBccmV0dXJucyBUaGUgY29zdCBvZiB0aGUgYWRkcmVzcyBjb21wdXRhdGlvbi4gRm9yIG1vc3QgdGFyZ2V0cyB0aGlzIGNhbiBiZQorICAvLy8gbWVyZ2VkIGludG8gdGhlIGluc3RydWN0aW9uIGluZGV4aW5nIG1vZGUuIFNvbWUgdGFyZ2V0cyBtaWdodCB3YW50IHRvCisgIC8vLyBkaXN0aW5ndWlzaCBiZXR3ZWVuIGFkZHJlc3MgY29tcHV0YXRpb24gZm9yIG1lbW9yeSBvcGVyYXRpb25zIG9uIHZlY3RvcgorICAvLy8gdHlwZXMgYW5kIHNjYWxhciB0eXBlcy4gU3VjaCB0YXJnZXRzIHNob3VsZCBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uLgorICAvLy8gVGhlICdTRScgcGFyYW1ldGVyIGhvbGRzIHBvaW50ZXIgZm9yIHRoZSBzY2FsYXIgZXZvbHV0aW9uIG9iamVjdCB3aGljaAorICAvLy8gaXMgdXNlZCBpbiBvcmRlciB0byBnZXQgdGhlIFB0ciBzdGVwIHZhbHVlIGluIGNhc2Ugb2YgY29uc3RhbnQgc3RyaWRlLgorICAvLy8gVGhlICdQdHInIHBhcmFtZXRlciBob2xkcyBTQ0VWIG9mIHRoZSBhY2Nlc3MgcG9pbnRlci4KKyAgaW50IGdldEFkZHJlc3NDb21wdXRhdGlvbkNvc3QoVHlwZSAqVHksIFNjYWxhckV2b2x1dGlvbiAqU0UgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpQdHIgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gXHJldHVybnMgVGhlIGNvc3QsIGlmIGFueSwgb2Yga2VlcGluZyB2YWx1ZXMgb2YgdGhlIGdpdmVuIHR5cGVzIGFsaXZlCisgIC8vLyBvdmVyIGEgY2FsbHNpdGUuCisgIC8vLworICAvLy8gU29tZSB0eXBlcyBtYXkgcmVxdWlyZSB0aGUgdXNlIG9mIHJlZ2lzdGVyIGNsYXNzZXMgdGhhdCBkbyBub3QgaGF2ZQorICAvLy8gYW55IGNhbGxlZS1zYXZlZCByZWdpc3RlcnMsIHNvIHdvdWxkIHJlcXVpcmUgYSBzcGlsbCBhbmQgZmlsbC4KKyAgdW5zaWduZWQgZ2V0Q29zdE9mS2VlcGluZ0xpdmVPdmVyQ2FsbChBcnJheVJlZjxUeXBlICo+IFR5cykgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm5zIFRydWUgaWYgdGhlIGludHJpbnNpYyBpcyBhIHN1cHBvcnRlZCBtZW1vcnkgaW50cmluc2ljLiAgSW5mbworICAvLy8gd2lsbCBjb250YWluIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gLSB3aGV0aGVyIHRoZSBpbnRyaW5zaWMgbWF5IHdyaXRlCisgIC8vLyBvciByZWFkIHRvIG1lbW9yeSwgdm9sYXRpbGl0eSBhbmQgdGhlIHBvaW50ZXIuICBJbmZvIGlzIHVuZGVmaW5lZAorICAvLy8gaWYgZmFsc2UgaXMgcmV0dXJuZWQuCisgIGJvb2wgZ2V0VGd0TWVtSW50cmluc2ljKEludHJpbnNpY0luc3QgKkluc3QsIE1lbUludHJpbnNpY0luZm8gJkluZm8pIGNvbnN0OworCisgIC8vLyBccmV0dXJucyBUaGUgbWF4aW11bSBlbGVtZW50IHNpemUsIGluIGJ5dGVzLCBmb3IgYW4gZWxlbWVudAorICAvLy8gdW5vcmRlcmVkLWF0b21pYyBtZW1vcnkgaW50cmluc2ljLgorICB1bnNpZ25lZCBnZXRBdG9taWNNZW1JbnRyaW5zaWNNYXhFbGVtZW50U2l6ZSgpIGNvbnN0OworCisgIC8vLyBccmV0dXJucyBBIHZhbHVlIHdoaWNoIGlzIHRoZSByZXN1bHQgb2YgdGhlIGdpdmVuIG1lbW9yeSBpbnRyaW5zaWMuICBOZXcKKyAgLy8vIGluc3RydWN0aW9ucyBtYXkgYmUgY3JlYXRlZCB0byBleHRyYWN0IHRoZSByZXN1bHQgZnJvbSB0aGUgZ2l2ZW4gaW50cmluc2ljCisgIC8vLyBtZW1vcnkgb3BlcmF0aW9uLiAgUmV0dXJucyBudWxscHRyIGlmIHRoZSB0YXJnZXQgY2Fubm90IGNyZWF0ZSBhIHJlc3VsdAorICAvLy8gZnJvbSB0aGUgZ2l2ZW4gaW50cmluc2ljLgorICBWYWx1ZSAqZ2V0T3JDcmVhdGVSZXN1bHRGcm9tTWVtSW50cmluc2ljKEludHJpbnNpY0luc3QgKkluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqRXhwZWN0ZWRUeXBlKSBjb25zdDsKKworICAvLy8gXHJldHVybnMgVGhlIHR5cGUgdG8gdXNlIGluIGEgbG9vcCBleHBhbnNpb24gb2YgYSBtZW1jcHkgY2FsbC4KKyAgVHlwZSAqZ2V0TWVtY3B5TG9vcExvd2VyaW5nVHlwZShMTFZNQ29udGV4dCAmQ29udGV4dCwgVmFsdWUgKkxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNBbGlnbiwgdW5zaWduZWQgRGVzdEFsaWduKSBjb25zdDsKKworICAvLy8gXHBhcmFtW291dF0gT3BzT3V0IFRoZSBvcGVyYW5kIHR5cGVzIHRvIGNvcHkgUmVtYWluaW5nQnl0ZXMgb2YgbWVtb3J5LgorICAvLy8gXHBhcmFtIFJlbWFpbmluZ0J5dGVzIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gY29weS4KKyAgLy8vCisgIC8vLyBDYWxjdWxhdGVzIHRoZSBvcGVyYW5kIHR5cGVzIHRvIHVzZSB3aGVuIGNvcHlpbmcgXHAgUmVtYWluaW5nQnl0ZXMgb2YKKyAgLy8vIG1lbW9yeSwgd2hlcmUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiBhbGlnbm1lbnRzIGFyZSBccCBTcmNBbGlnbiBhbmQKKyAgLy8vIFxwIERlc3RBbGlnbiByZXNwZWN0aXZlbHkuCisgIHZvaWQgZ2V0TWVtY3B5TG9vcFJlc2lkdWFsTG93ZXJpbmdUeXBlKFNtYWxsVmVjdG9ySW1wbDxUeXBlICo+ICZPcHNPdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZW1haW5pbmdCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RBbGlnbikgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm5zIFRydWUgaWYgdGhlIHR3byBmdW5jdGlvbnMgaGF2ZSBjb21wYXRpYmxlIGF0dHJpYnV0ZXMgZm9yIGlubGluaW5nCisgIC8vLyBwdXJwb3Nlcy4KKyAgYm9vbCBhcmVJbmxpbmVDb21wYXRpYmxlKGNvbnN0IEZ1bmN0aW9uICpDYWxsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbiAqQ2FsbGVlKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFRoZSB0eXBlIG9mIGxvYWQvc3RvcmUgaW5kZXhpbmcuCisgIGVudW0gTWVtSW5kZXhlZE1vZGUgeworICAgIE1JTV9VbmluZGV4ZWQsICAvLy88IE5vIGluZGV4aW5nLgorICAgIE1JTV9QcmVJbmMsICAgICAvLy88IFByZS1pbmNyZW1lbnRpbmcuCisgICAgTUlNX1ByZURlYywgICAgIC8vLzwgUHJlLWRlY3JlbWVudGluZy4KKyAgICBNSU1fUG9zdEluYywgICAgLy8vPCBQb3N0LWluY3JlbWVudGluZy4KKyAgICBNSU1fUG9zdERlYyAgICAgLy8vPCBQb3N0LWRlY3JlbWVudGluZy4KKyAgfTsKKworICAvLy8gXHJldHVybnMgVHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluZGV4ZWQgbG9hZCBmb3IgdGhlIGdpdmVuIHR5cGUgaXMgbGVnYWwuCisgIGJvb2wgaXNJbmRleGVkTG9hZExlZ2FsKGVudW0gTWVtSW5kZXhlZE1vZGUgTW9kZSwgVHlwZSAqVHkpIGNvbnN0OworCisgIC8vLyBccmV0dXJucyBUcnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5kZXhlZCBzdG9yZSBmb3IgdGhlIGdpdmVuIHR5cGUgaXMgbGVnYWwuCisgIGJvb2wgaXNJbmRleGVkU3RvcmVMZWdhbChlbnVtIE1lbUluZGV4ZWRNb2RlIE1vZGUsIFR5cGUgKlR5KSBjb25zdDsKKworICAvLy8gXHJldHVybnMgVGhlIGJpdHdpZHRoIG9mIHRoZSBsYXJnZXN0IHZlY3RvciB0eXBlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8KKyAgLy8vIGxvYWQvc3RvcmUgaW4gdGhlIGdpdmVuIGFkZHJlc3Mgc3BhY2UuCisgIHVuc2lnbmVkIGdldExvYWRTdG9yZVZlY1JlZ0JpdFdpZHRoKHVuc2lnbmVkIEFkZHJTcGFjZSkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm5zIFRydWUgaWYgdGhlIGxvYWQgaW5zdHJ1Y3Rpb24gaXMgbGVnYWwgdG8gdmVjdG9yaXplLgorICBib29sIGlzTGVnYWxUb1ZlY3Rvcml6ZUxvYWQoTG9hZEluc3QgKkxJKSBjb25zdDsKKworICAvLy8gXHJldHVybnMgVHJ1ZSBpZiB0aGUgc3RvcmUgaW5zdHJ1Y3Rpb24gaXMgbGVnYWwgdG8gdmVjdG9yaXplLgorICBib29sIGlzTGVnYWxUb1ZlY3Rvcml6ZVN0b3JlKFN0b3JlSW5zdCAqU0kpIGNvbnN0OworCisgIC8vLyBccmV0dXJucyBUcnVlIGlmIGl0IGlzIGxlZ2FsIHRvIHZlY3Rvcml6ZSB0aGUgZ2l2ZW4gbG9hZCBjaGFpbi4KKyAgYm9vbCBpc0xlZ2FsVG9WZWN0b3JpemVMb2FkQ2hhaW4odW5zaWduZWQgQ2hhaW5TaXplSW5CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyU3BhY2UpIGNvbnN0OworCisgIC8vLyBccmV0dXJucyBUcnVlIGlmIGl0IGlzIGxlZ2FsIHRvIHZlY3Rvcml6ZSB0aGUgZ2l2ZW4gc3RvcmUgY2hhaW4uCisgIGJvb2wgaXNMZWdhbFRvVmVjdG9yaXplU3RvcmVDaGFpbih1bnNpZ25lZCBDaGFpblNpemVJbkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkclNwYWNlKSBjb25zdDsKKworICAvLy8gXHJldHVybnMgVGhlIG5ldyB2ZWN0b3IgZmFjdG9yIHZhbHVlIGlmIHRoZSB0YXJnZXQgZG9lc24ndCBzdXBwb3J0IFxwCisgIC8vLyBTaXplSW5CeXRlcyBsb2FkcyBvciBoYXMgYSBiZXR0ZXIgdmVjdG9yIGZhY3Rvci4KKyAgdW5zaWduZWQgZ2V0TG9hZFZlY3RvckZhY3Rvcih1bnNpZ25lZCBWRiwgdW5zaWduZWQgTG9hZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ2hhaW5TaXplSW5CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JUeXBlICpWZWNUeSkgY29uc3Q7CisKKyAgLy8vIFxyZXR1cm5zIFRoZSBuZXcgdmVjdG9yIGZhY3RvciB2YWx1ZSBpZiB0aGUgdGFyZ2V0IGRvZXNuJ3Qgc3VwcG9ydCBccAorICAvLy8gU2l6ZUluQnl0ZXMgc3RvcmVzIG9yIGhhcyBhIGJldHRlciB2ZWN0b3IgZmFjdG9yLgorICB1bnNpZ25lZCBnZXRTdG9yZVZlY3RvckZhY3Rvcih1bnNpZ25lZCBWRiwgdW5zaWduZWQgU3RvcmVTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDaGFpblNpemVJbkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JUeXBlICpWZWNUeSkgY29uc3Q7CisKKyAgLy8vIEZsYWdzIGRlc2NyaWJpbmcgdGhlIGtpbmQgb2YgdmVjdG9yIHJlZHVjdGlvbi4KKyAgc3RydWN0IFJlZHVjdGlvbkZsYWdzIHsKKyAgICBSZWR1Y3Rpb25GbGFncygpIDogSXNNYXhPcChmYWxzZSksIElzU2lnbmVkKGZhbHNlKSwgTm9OYU4oZmFsc2UpIHt9CisgICAgYm9vbCBJc01heE9wOyAgLy8vPCBJZiB0aGUgb3AgYSBtaW4vbWF4IGtpbmQsIHRydWUgaWYgaXQncyBhIG1heCBvcGVyYXRpb24uCisgICAgYm9vbCBJc1NpZ25lZDsgLy8vPCBXaGV0aGVyIHRoZSBvcGVyYXRpb24gaXMgYSBzaWduZWQgaW50IHJlZHVjdGlvbi4KKyAgICBib29sIE5vTmFOOyAgICAvLy88IElmIG9wIGlzIGFuIGZwIG1pbi9tYXgsIHdoZXRoZXIgTmFOcyBtYXkgYmUgcHJlc2VudC4KKyAgfTsKKworICAvLy8gXHJldHVybnMgVHJ1ZSBpZiB0aGUgdGFyZ2V0IHdhbnRzIHRvIGhhbmRsZSB0aGUgZ2l2ZW4gcmVkdWN0aW9uIGlkaW9tIGluCisgIC8vLyB0aGUgaW50cmluc2ljcyBmb3JtIGluc3RlYWQgb2YgdGhlIHNodWZmbGUgZm9ybS4KKyAgYm9vbCB1c2VSZWR1Y3Rpb25JbnRyaW5zaWModW5zaWduZWQgT3Bjb2RlLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVkdWN0aW9uRmxhZ3MgRmxhZ3MpIGNvbnN0OworCisgIC8vLyBccmV0dXJucyBUcnVlIGlmIHRoZSB0YXJnZXQgd2FudHMgdG8gZXhwYW5kIHRoZSBnaXZlbiByZWR1Y3Rpb24gaW50cmluc2ljCisgIC8vLyBpbnRvIGEgc2h1ZmZsZSBzZXF1ZW5jZS4KKyAgYm9vbCBzaG91bGRFeHBhbmRSZWR1Y3Rpb24oY29uc3QgSW50cmluc2ljSW5zdCAqSUkpIGNvbnN0OworICAvLy8gQH0KKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBFc3RpbWF0ZSB0aGUgbGF0ZW5jeSBvZiBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uCisgIC8vLyBSZXR1cm5zIDEgYXMgdGhlIGRlZmF1bHQgdmFsdWUuCisgIGludCBnZXRJbnN0cnVjdGlvbkxhdGVuY3koY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgZXhwZWN0ZWQgdGhyb3VnaHB1dCBjb3N0IG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgLy8vIFJldHVybnMgLTEgaWYgdGhlIGNvc3QgaXMgdW5rbm93bi4KKyAgaW50IGdldEluc3RydWN0aW9uVGhyb3VnaHB1dChjb25zdCBJbnN0cnVjdGlvbiAqSSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyB1c2VkIHRvIHR5cGUgZXJhc2Ugc3BlY2lmaWMgVFRJCisgIC8vLyBpbXBsZW1lbnRhdGlvbnMuCisgIGNsYXNzIENvbmNlcHQ7CisKKyAgLy8vIFxicmllZiBUaGUgdGVtcGxhdGUgbW9kZWwgZm9yIHRoZSBiYXNlIGNsYXNzIHdoaWNoIHdyYXBzIGEgY29uY3JldGUKKyAgLy8vIGltcGxlbWVudGF0aW9uIGluIGEgdHlwZSBlcmFzZWQgaW50ZXJmYWNlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgTW9kZWw7CisKKyAgc3RkOjp1bmlxdWVfcHRyPENvbmNlcHQ+IFRUSUltcGw7Cit9OworCitjbGFzcyBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpDb25jZXB0IHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+Q29uY2VwdCgpID0gMDsKKyAgdmlydHVhbCBjb25zdCBEYXRhTGF5b3V0ICZnZXREYXRhTGF5b3V0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGludCBnZXRPcGVyYXRpb25Db3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVHksIFR5cGUgKk9wVHkpID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0R0VQQ29zdChUeXBlICpQb2ludGVlVHlwZSwgY29uc3QgVmFsdWUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBWYWx1ZSAqPiBPcGVyYW5kcykgPSAwOworICB2aXJ0dWFsIGludCBnZXRFeHRDb3N0KGNvbnN0IEluc3RydWN0aW9uICpJLCBjb25zdCBWYWx1ZSAqU3JjKSA9IDA7CisgIHZpcnR1YWwgaW50IGdldENhbGxDb3N0KEZ1bmN0aW9uVHlwZSAqRlR5LCBpbnQgTnVtQXJncykgPSAwOworICB2aXJ0dWFsIGludCBnZXRDYWxsQ29zdChjb25zdCBGdW5jdGlvbiAqRiwgaW50IE51bUFyZ3MpID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0Q2FsbENvc3QoY29uc3QgRnVuY3Rpb24gKkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IFZhbHVlICo+IEFyZ3VtZW50cykgPSAwOworICB2aXJ0dWFsIHVuc2lnbmVkIGdldElubGluaW5nVGhyZXNob2xkTXVsdGlwbGllcigpID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0SW50cmluc2ljQ29zdChJbnRyaW5zaWM6OklEIElJRCwgVHlwZSAqUmV0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VHlwZSAqPiBQYXJhbVR5cykgPSAwOworICB2aXJ0dWFsIGludCBnZXRJbnRyaW5zaWNDb3N0KEludHJpbnNpYzo6SUQgSUlELCBUeXBlICpSZXRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBWYWx1ZSAqPiBBcmd1bWVudHMpID0gMDsKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRFc3RpbWF0ZWROdW1iZXJPZkNhc2VDbHVzdGVycyhjb25zdCBTd2l0Y2hJbnN0ICZTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmSlRTaXplKSA9IDA7CisgIHZpcnR1YWwgaW50CisgIGdldFVzZXJDb3N0KGNvbnN0IFVzZXIgKlUsIEFycmF5UmVmPGNvbnN0IFZhbHVlICo+IE9wZXJhbmRzKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNCcmFuY2hEaXZlcmdlbmNlKCkgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNTb3VyY2VPZkRpdmVyZ2VuY2UoY29uc3QgVmFsdWUgKlYpID0gMDsKKyAgdmlydHVhbCBib29sIGlzQWx3YXlzVW5pZm9ybShjb25zdCBWYWx1ZSAqVikgPSAwOworICB2aXJ0dWFsIHVuc2lnbmVkIGdldEZsYXRBZGRyZXNzU3BhY2UoKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0xvd2VyZWRUb0NhbGwoY29uc3QgRnVuY3Rpb24gKkYpID0gMDsKKyAgdmlydHVhbCB2b2lkIGdldFVucm9sbGluZ1ByZWZlcmVuY2VzKExvb3AgKkwsIFNjYWxhckV2b2x1dGlvbiAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yb2xsaW5nUHJlZmVyZW5jZXMgJlVQKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0xlZ2FsQWRkSW1tZWRpYXRlKGludDY0X3QgSW1tKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0xlZ2FsSUNtcEltbWVkaWF0ZShpbnQ2NF90IEltbSkgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNMZWdhbEFkZHJlc3NpbmdNb2RlKFR5cGUgKlR5LCBHbG9iYWxWYWx1ZSAqQmFzZUdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgQmFzZU9mZnNldCwgYm9vbCBIYXNCYXNlUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkclNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0xTUkNvc3RMZXNzKFRhcmdldFRyYW5zZm9ybUluZm86OkxTUkNvc3QgJkMxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpMU1JDb3N0ICZDMikgPSAwOworICB2aXJ0dWFsIGJvb2wgY2FuTWFjcm9GdXNlQ21wKCkgPSAwOworICB2aXJ0dWFsIGJvb2wgc2hvdWxkRmF2b3JQb3N0SW5jKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNMZWdhbE1hc2tlZFN0b3JlKFR5cGUgKkRhdGFUeXBlKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0xlZ2FsTWFza2VkTG9hZChUeXBlICpEYXRhVHlwZSkgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNMZWdhbE1hc2tlZFNjYXR0ZXIoVHlwZSAqRGF0YVR5cGUpID0gMDsKKyAgdmlydHVhbCBib29sIGlzTGVnYWxNYXNrZWRHYXRoZXIoVHlwZSAqRGF0YVR5cGUpID0gMDsKKyAgdmlydHVhbCBib29sIGhhc0RpdlJlbU9wKFR5cGUgKkRhdGFUeXBlLCBib29sIElzU2lnbmVkKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNWb2xhdGlsZVZhcmlhbnQoSW5zdHJ1Y3Rpb24gKkksIHVuc2lnbmVkIEFkZHJTcGFjZSkgPSAwOworICB2aXJ0dWFsIGJvb2wgcHJlZmVyc1ZlY3Rvcml6ZWRBZGRyZXNzaW5nKCkgPSAwOworICB2aXJ0dWFsIGludCBnZXRTY2FsaW5nRmFjdG9yQ29zdChUeXBlICpUeSwgR2xvYmFsVmFsdWUgKkJhc2VHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBCYXNlT2Zmc2V0LCBib29sIEhhc0Jhc2VSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgU2NhbGUsIHVuc2lnbmVkIEFkZHJTcGFjZSkgPSAwOworICB2aXJ0dWFsIGJvb2wgTFNSV2l0aEluc3RyUXVlcmllcygpID0gMDsKKyAgdmlydHVhbCBib29sIGlzVHJ1bmNhdGVGcmVlKFR5cGUgKlR5MSwgVHlwZSAqVHkyKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1Byb2ZpdGFibGVUb0hvaXN0KEluc3RydWN0aW9uICpJKSA9IDA7CisgIHZpcnR1YWwgYm9vbCB1c2VBQSgpID0gMDsKKyAgdmlydHVhbCBib29sIGlzVHlwZUxlZ2FsKFR5cGUgKlR5KSA9IDA7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SnVtcEJ1ZkFsaWdubWVudCgpID0gMDsKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRKdW1wQnVmU2l6ZSgpID0gMDsKKyAgdmlydHVhbCBib29sIHNob3VsZEJ1aWxkTG9va3VwVGFibGVzKCkgPSAwOworICB2aXJ0dWFsIGJvb2wgc2hvdWxkQnVpbGRMb29rdXBUYWJsZXNGb3JDb25zdGFudChDb25zdGFudCAqQykgPSAwOworICB2aXJ0dWFsIGJvb2wgdXNlQ29sZENDRm9yQ29sZENhbGwoRnVuY3Rpb24gJkYpID0gMDsKKyAgdmlydHVhbCB1bnNpZ25lZAorICBnZXRTY2FsYXJpemF0aW9uT3ZlcmhlYWQoVHlwZSAqVHksIGJvb2wgSW5zZXJ0LCBib29sIEV4dHJhY3QpID0gMDsKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRPcGVyYW5kc1NjYWxhcml6YXRpb25PdmVyaGVhZChBcnJheVJlZjxjb25zdCBWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZGKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBzdXBwb3J0c0VmZmljaWVudFZlY3RvckVsZW1lbnRMb2FkU3RvcmUoKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBlbmFibGVBZ2dyZXNzaXZlSW50ZXJsZWF2aW5nKGJvb2wgTG9vcEhhc1JlZHVjdGlvbnMpID0gMDsKKyAgdmlydHVhbCBjb25zdCBNZW1DbXBFeHBhbnNpb25PcHRpb25zICplbmFibGVNZW1DbXBFeHBhbnNpb24oCisgICAgICBib29sIElzWmVyb0NtcCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgZW5hYmxlSW50ZXJsZWF2ZWRBY2Nlc3NWZWN0b3JpemF0aW9uKCkgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNGUFZlY3Rvcml6YXRpb25Qb3RlbnRpYWxseVVuc2FmZSgpID0gMDsKKyAgdmlydHVhbCBib29sIGFsbG93c01pc2FsaWduZWRNZW1vcnlBY2Nlc3NlcyhMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCaXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyZXNzU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKkZhc3QpID0gMDsKKyAgdmlydHVhbCBQb3BjbnRTdXBwb3J0S2luZCBnZXRQb3BjbnRTdXBwb3J0KHVuc2lnbmVkIEludFR5V2lkdGhJbkJpdCkgPSAwOworICB2aXJ0dWFsIGJvb2wgaGF2ZUZhc3RTcXJ0KFR5cGUgKlR5KSA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0ZDbXBPcmRDaGVhcGVyVGhhbkZDbXBaZXJvKFR5cGUgKlR5KSA9IDA7CisgIHZpcnR1YWwgaW50IGdldEZQT3BDb3N0KFR5cGUgKlR5KSA9IDA7CisgIHZpcnR1YWwgaW50IGdldEludEltbUNvZGVTaXplQ29zdCh1bnNpZ25lZCBPcGMsIHVuc2lnbmVkIElkeCwgY29uc3QgQVBJbnQgJkltbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKlR5KSA9IDA7CisgIHZpcnR1YWwgaW50IGdldEludEltbUNvc3QoY29uc3QgQVBJbnQgJkltbSwgVHlwZSAqVHkpID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0SW50SW1tQ29zdCh1bnNpZ25lZCBPcGMsIHVuc2lnbmVkIElkeCwgY29uc3QgQVBJbnQgJkltbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpUeSkgPSAwOworICB2aXJ0dWFsIGludCBnZXRJbnRJbW1Db3N0KEludHJpbnNpYzo6SUQgSUlELCB1bnNpZ25lZCBJZHgsIGNvbnN0IEFQSW50ICZJbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqVHkpID0gMDsKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXROdW1iZXJPZlJlZ2lzdGVycyhib29sIFZlY3RvcikgPSAwOworICB2aXJ0dWFsIHVuc2lnbmVkIGdldFJlZ2lzdGVyQml0V2lkdGgoYm9vbCBWZWN0b3IpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRNaW5WZWN0b3JSZWdpc3RlckJpdFdpZHRoKCkgPSAwOworICB2aXJ0dWFsIGJvb2wgc2hvdWxkTWF4aW1pemVWZWN0b3JCYW5kd2lkdGgoYm9vbCBPcHRTaXplKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBzaG91bGRDb25zaWRlckFkZHJlc3NUeXBlUHJvbW90aW9uKAorICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gJkksIGJvb2wgJkFsbG93UHJvbW90aW9uV2l0aG91dENvbW1vbkhlYWRlcikgPSAwOworICB2aXJ0dWFsIHVuc2lnbmVkIGdldENhY2hlTGluZVNpemUoKSA9IDA7CisgIHZpcnR1YWwgbGx2bTo6T3B0aW9uYWw8dW5zaWduZWQ+IGdldENhY2hlU2l6ZShDYWNoZUxldmVsIExldmVsKSA9IDA7CisgIHZpcnR1YWwgbGx2bTo6T3B0aW9uYWw8dW5zaWduZWQ+IGdldENhY2hlQXNzb2NpYXRpdml0eShDYWNoZUxldmVsIExldmVsKSA9IDA7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0UHJlZmV0Y2hEaXN0YW5jZSgpID0gMDsKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRNaW5QcmVmZXRjaFN0cmlkZSgpID0gMDsKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRNYXhQcmVmZXRjaEl0ZXJhdGlvbnNBaGVhZCgpID0gMDsKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRNYXhJbnRlcmxlYXZlRmFjdG9yKHVuc2lnbmVkIFZGKSA9IDA7CisgIHZpcnR1YWwgdW5zaWduZWQKKyAgZ2V0QXJpdGhtZXRpY0luc3RyQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlR5LCBPcGVyYW5kVmFsdWVLaW5kIE9wZDFJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhbmRWYWx1ZUtpbmQgT3BkMkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFuZFZhbHVlUHJvcGVydGllcyBPcGQxUHJvcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFuZFZhbHVlUHJvcGVydGllcyBPcGQyUHJvcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gQXJncykgPSAwOworICB2aXJ0dWFsIGludCBnZXRTaHVmZmxlQ29zdChTaHVmZmxlS2luZCBLaW5kLCBUeXBlICpUcCwgaW50IEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpTdWJUcCkgPSAwOworICB2aXJ0dWFsIGludCBnZXRDYXN0SW5zdHJDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqRHN0LCBUeXBlICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkkpID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0RXh0cmFjdFdpdGhFeHRlbmRDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yVHlwZSAqVmVjVHksIHVuc2lnbmVkIEluZGV4KSA9IDA7CisgIHZpcnR1YWwgaW50IGdldENGSW5zdHJDb3N0KHVuc2lnbmVkIE9wY29kZSkgPSAwOworICB2aXJ0dWFsIGludCBnZXRDbXBTZWxJbnN0ckNvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpWYWxUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqQ29uZFR5LCBjb25zdCBJbnN0cnVjdGlvbiAqSSkgPSAwOworICB2aXJ0dWFsIGludCBnZXRWZWN0b3JJbnN0ckNvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRleCkgPSAwOworICB2aXJ0dWFsIGludCBnZXRNZW1vcnlPcENvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpTcmMsIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSwgY29uc3QgSW5zdHJ1Y3Rpb24gKkkpID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0TWFza2VkTWVtb3J5T3BDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkcmVzc1NwYWNlKSA9IDA7CisgIHZpcnR1YWwgaW50IGdldEdhdGhlclNjYXR0ZXJPcENvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpEYXRhVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKlB0ciwgYm9vbCBWYXJpYWJsZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50KSA9IDA7CisgIHZpcnR1YWwgaW50IGdldEludGVybGVhdmVkTWVtb3J5T3BDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVmVjVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkcmVzc1NwYWNlKSA9IDA7CisgIHZpcnR1YWwgaW50IGdldEFyaXRobWV0aWNSZWR1Y3Rpb25Db3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNQYWlyd2lzZUZvcm0pID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0TWluTWF4UmVkdWN0aW9uQ29zdChUeXBlICpUeSwgVHlwZSAqQ29uZFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNQYWlyd2lzZUZvcm0sIGJvb2wgSXNVbnNpZ25lZCkgPSAwOworICB2aXJ0dWFsIGludCBnZXRJbnRyaW5zaWNJbnN0ckNvc3QoSW50cmluc2ljOjpJRCBJRCwgVHlwZSAqUmV0VHksCisgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VHlwZSAqPiBUeXMsIEZhc3RNYXRoRmxhZ3MgRk1GLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNjYWxhcml6YXRpb25Db3N0UGFzc2VkKSA9IDA7CisgIHZpcnR1YWwgaW50IGdldEludHJpbnNpY0luc3RyQ29zdChJbnRyaW5zaWM6OklEIElELCBUeXBlICpSZXRUeSwKKyAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsIEZhc3RNYXRoRmxhZ3MgRk1GLCB1bnNpZ25lZCBWRikgPSAwOworICB2aXJ0dWFsIGludCBnZXRDYWxsSW5zdHJDb3N0KEZ1bmN0aW9uICpGLCBUeXBlICpSZXRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUeXBlICo+IFR5cykgPSAwOworICB2aXJ0dWFsIHVuc2lnbmVkIGdldE51bWJlck9mUGFydHMoVHlwZSAqVHApID0gMDsKKyAgdmlydHVhbCBpbnQgZ2V0QWRkcmVzc0NvbXB1dGF0aW9uQ29zdChUeXBlICpUeSwgU2NhbGFyRXZvbHV0aW9uICpTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpQdHIpID0gMDsKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRDb3N0T2ZLZWVwaW5nTGl2ZU92ZXJDYWxsKEFycmF5UmVmPFR5cGUgKj4gVHlzKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBnZXRUZ3RNZW1JbnRyaW5zaWMoSW50cmluc2ljSW5zdCAqSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1JbnRyaW5zaWNJbmZvICZJbmZvKSA9IDA7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0QXRvbWljTWVtSW50cmluc2ljTWF4RWxlbWVudFNpemUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgVmFsdWUgKmdldE9yQ3JlYXRlUmVzdWx0RnJvbU1lbUludHJpbnNpYyhJbnRyaW5zaWNJbnN0ICpJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqRXhwZWN0ZWRUeXBlKSA9IDA7CisgIHZpcnR1YWwgVHlwZSAqZ2V0TWVtY3B5TG9vcExvd2VyaW5nVHlwZShMTFZNQ29udGV4dCAmQ29udGV4dCwgVmFsdWUgKkxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY0FsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdEFsaWduKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBnZXRNZW1jcHlMb29wUmVzaWR1YWxMb3dlcmluZ1R5cGUoCisgICAgICBTbWFsbFZlY3RvckltcGw8VHlwZSAqPiAmT3BzT3V0LCBMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgIHVuc2lnbmVkIFJlbWFpbmluZ0J5dGVzLCB1bnNpZ25lZCBTcmNBbGlnbiwgdW5zaWduZWQgRGVzdEFsaWduKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBhcmVJbmxpbmVDb21wYXRpYmxlKGNvbnN0IEZ1bmN0aW9uICpDYWxsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uICpDYWxsZWUpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzSW5kZXhlZExvYWRMZWdhbChNZW1JbmRleGVkTW9kZSBNb2RlLCBUeXBlICpUeSkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNJbmRleGVkU3RvcmVMZWdhbChNZW1JbmRleGVkTW9kZSBNb2RlLFR5cGUgKlR5KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TG9hZFN0b3JlVmVjUmVnQml0V2lkdGgodW5zaWduZWQgQWRkclNwYWNlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0xlZ2FsVG9WZWN0b3JpemVMb2FkKExvYWRJbnN0ICpMSSkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNMZWdhbFRvVmVjdG9yaXplU3RvcmUoU3RvcmVJbnN0ICpTSSkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNMZWdhbFRvVmVjdG9yaXplTG9hZENoYWluKHVuc2lnbmVkIENoYWluU2l6ZUluQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNMZWdhbFRvVmVjdG9yaXplU3RvcmVDaGFpbih1bnNpZ25lZCBDaGFpblNpemVJbkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVuc2lnbmVkIGdldExvYWRWZWN0b3JGYWN0b3IodW5zaWduZWQgVkYsIHVuc2lnbmVkIExvYWRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ2hhaW5TaXplSW5CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvclR5cGUgKlZlY1R5KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0U3RvcmVWZWN0b3JGYWN0b3IodW5zaWduZWQgVkYsIHVuc2lnbmVkIFN0b3JlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDaGFpblNpemVJbkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvclR5cGUgKlZlY1R5KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCB1c2VSZWR1Y3Rpb25JbnRyaW5zaWModW5zaWduZWQgT3Bjb2RlLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWR1Y3Rpb25GbGFncykgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgc2hvdWxkRXhwYW5kUmVkdWN0aW9uKGNvbnN0IEludHJpbnNpY0luc3QgKklJKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50IGdldEluc3RydWN0aW9uTGF0ZW5jeShjb25zdCBJbnN0cnVjdGlvbiAqSSkgPSAwOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpNb2RlbCBmaW5hbCA6IHB1YmxpYyBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpDb25jZXB0IHsKKyAgVCBJbXBsOworCitwdWJsaWM6CisgIE1vZGVsKFQgSW1wbCkgOiBJbXBsKHN0ZDo6bW92ZShJbXBsKSkge30KKyAgfk1vZGVsKCkgb3ZlcnJpZGUge30KKworICBjb25zdCBEYXRhTGF5b3V0ICZnZXREYXRhTGF5b3V0KCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldERhdGFMYXlvdXQoKTsKKyAgfQorCisgIGludCBnZXRPcGVyYXRpb25Db3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVHksIFR5cGUgKk9wVHkpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRPcGVyYXRpb25Db3N0KE9wY29kZSwgVHksIE9wVHkpOworICB9CisgIGludCBnZXRHRVBDb3N0KFR5cGUgKlBvaW50ZWVUeXBlLCBjb25zdCBWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBWYWx1ZSAqPiBPcGVyYW5kcykgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldEdFUENvc3QoUG9pbnRlZVR5cGUsIFB0ciwgT3BlcmFuZHMpOworICB9CisgIGludCBnZXRFeHRDb3N0KGNvbnN0IEluc3RydWN0aW9uICpJLCBjb25zdCBWYWx1ZSAqU3JjKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0RXh0Q29zdChJLCBTcmMpOworICB9CisgIGludCBnZXRDYWxsQ29zdChGdW5jdGlvblR5cGUgKkZUeSwgaW50IE51bUFyZ3MpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRDYWxsQ29zdChGVHksIE51bUFyZ3MpOworICB9CisgIGludCBnZXRDYWxsQ29zdChjb25zdCBGdW5jdGlvbiAqRiwgaW50IE51bUFyZ3MpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRDYWxsQ29zdChGLCBOdW1BcmdzKTsKKyAgfQorICBpbnQgZ2V0Q2FsbENvc3QoY29uc3QgRnVuY3Rpb24gKkYsCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBWYWx1ZSAqPiBBcmd1bWVudHMpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRDYWxsQ29zdChGLCBBcmd1bWVudHMpOworICB9CisgIHVuc2lnbmVkIGdldElubGluaW5nVGhyZXNob2xkTXVsdGlwbGllcigpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRJbmxpbmluZ1RocmVzaG9sZE11bHRpcGxpZXIoKTsKKyAgfQorICBpbnQgZ2V0SW50cmluc2ljQ29zdChJbnRyaW5zaWM6OklEIElJRCwgVHlwZSAqUmV0VHksCisgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFR5cGUgKj4gUGFyYW1UeXMpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRJbnRyaW5zaWNDb3N0KElJRCwgUmV0VHksIFBhcmFtVHlzKTsKKyAgfQorICBpbnQgZ2V0SW50cmluc2ljQ29zdChJbnRyaW5zaWM6OklEIElJRCwgVHlwZSAqUmV0VHksCisgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IFZhbHVlICo+IEFyZ3VtZW50cykgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldEludHJpbnNpY0Nvc3QoSUlELCBSZXRUeSwgQXJndW1lbnRzKTsKKyAgfQorICBpbnQgZ2V0VXNlckNvc3QoY29uc3QgVXNlciAqVSwgQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gT3BlcmFuZHMpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRVc2VyQ29zdChVLCBPcGVyYW5kcyk7CisgIH0KKyAgYm9vbCBoYXNCcmFuY2hEaXZlcmdlbmNlKCkgb3ZlcnJpZGUgeyByZXR1cm4gSW1wbC5oYXNCcmFuY2hEaXZlcmdlbmNlKCk7IH0KKyAgYm9vbCBpc1NvdXJjZU9mRGl2ZXJnZW5jZShjb25zdCBWYWx1ZSAqVikgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmlzU291cmNlT2ZEaXZlcmdlbmNlKFYpOworICB9CisKKyAgYm9vbCBpc0Fsd2F5c1VuaWZvcm0oY29uc3QgVmFsdWUgKlYpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5pc0Fsd2F5c1VuaWZvcm0oVik7CisgIH0KKworICB1bnNpZ25lZCBnZXRGbGF0QWRkcmVzc1NwYWNlKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldEZsYXRBZGRyZXNzU3BhY2UoKTsKKyAgfQorCisgIGJvb2wgaXNMb3dlcmVkVG9DYWxsKGNvbnN0IEZ1bmN0aW9uICpGKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuaXNMb3dlcmVkVG9DYWxsKEYpOworICB9CisgIHZvaWQgZ2V0VW5yb2xsaW5nUHJlZmVyZW5jZXMoTG9vcCAqTCwgU2NhbGFyRXZvbHV0aW9uICZTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnJvbGxpbmdQcmVmZXJlbmNlcyAmVVApIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRVbnJvbGxpbmdQcmVmZXJlbmNlcyhMLCBTRSwgVVApOworICB9CisgIGJvb2wgaXNMZWdhbEFkZEltbWVkaWF0ZShpbnQ2NF90IEltbSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmlzTGVnYWxBZGRJbW1lZGlhdGUoSW1tKTsKKyAgfQorICBib29sIGlzTGVnYWxJQ21wSW1tZWRpYXRlKGludDY0X3QgSW1tKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuaXNMZWdhbElDbXBJbW1lZGlhdGUoSW1tKTsKKyAgfQorICBib29sIGlzTGVnYWxBZGRyZXNzaW5nTW9kZShUeXBlICpUeSwgR2xvYmFsVmFsdWUgKkJhc2VHViwgaW50NjRfdCBCYXNlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc0Jhc2VSZWcsIGludDY0X3QgU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkkpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5pc0xlZ2FsQWRkcmVzc2luZ01vZGUoVHksIEJhc2VHViwgQmFzZU9mZnNldCwgSGFzQmFzZVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGUsIEFkZHJTcGFjZSwgSSk7CisgIH0KKyAgYm9vbCBpc0xTUkNvc3RMZXNzKFRhcmdldFRyYW5zZm9ybUluZm86OkxTUkNvc3QgJkMxLAorICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0VHJhbnNmb3JtSW5mbzo6TFNSQ29zdCAmQzIpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5pc0xTUkNvc3RMZXNzKEMxLCBDMik7CisgIH0KKyAgYm9vbCBjYW5NYWNyb0Z1c2VDbXAoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuY2FuTWFjcm9GdXNlQ21wKCk7CisgIH0KKyAgYm9vbCBzaG91bGRGYXZvclBvc3RJbmMoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuc2hvdWxkRmF2b3JQb3N0SW5jKCk7CisgIH0KKyAgYm9vbCBpc0xlZ2FsTWFza2VkU3RvcmUoVHlwZSAqRGF0YVR5cGUpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5pc0xlZ2FsTWFza2VkU3RvcmUoRGF0YVR5cGUpOworICB9CisgIGJvb2wgaXNMZWdhbE1hc2tlZExvYWQoVHlwZSAqRGF0YVR5cGUpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5pc0xlZ2FsTWFza2VkTG9hZChEYXRhVHlwZSk7CisgIH0KKyAgYm9vbCBpc0xlZ2FsTWFza2VkU2NhdHRlcihUeXBlICpEYXRhVHlwZSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmlzTGVnYWxNYXNrZWRTY2F0dGVyKERhdGFUeXBlKTsKKyAgfQorICBib29sIGlzTGVnYWxNYXNrZWRHYXRoZXIoVHlwZSAqRGF0YVR5cGUpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5pc0xlZ2FsTWFza2VkR2F0aGVyKERhdGFUeXBlKTsKKyAgfQorICBib29sIGhhc0RpdlJlbU9wKFR5cGUgKkRhdGFUeXBlLCBib29sIElzU2lnbmVkKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuaGFzRGl2UmVtT3AoRGF0YVR5cGUsIElzU2lnbmVkKTsKKyAgfQorICBib29sIGhhc1ZvbGF0aWxlVmFyaWFudChJbnN0cnVjdGlvbiAqSSwgdW5zaWduZWQgQWRkclNwYWNlKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuaGFzVm9sYXRpbGVWYXJpYW50KEksIEFkZHJTcGFjZSk7CisgIH0KKyAgYm9vbCBwcmVmZXJzVmVjdG9yaXplZEFkZHJlc3NpbmcoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwucHJlZmVyc1ZlY3Rvcml6ZWRBZGRyZXNzaW5nKCk7CisgIH0KKyAgaW50IGdldFNjYWxpbmdGYWN0b3JDb3N0KFR5cGUgKlR5LCBHbG9iYWxWYWx1ZSAqQmFzZUdWLCBpbnQ2NF90IEJhc2VPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc0Jhc2VSZWcsIGludDY0X3QgU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyU3BhY2UpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRTY2FsaW5nRmFjdG9yQ29zdChUeSwgQmFzZUdWLCBCYXNlT2Zmc2V0LCBIYXNCYXNlUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxlLCBBZGRyU3BhY2UpOworICB9CisgIGJvb2wgTFNSV2l0aEluc3RyUXVlcmllcygpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5MU1JXaXRoSW5zdHJRdWVyaWVzKCk7CisgIH0KKyAgYm9vbCBpc1RydW5jYXRlRnJlZShUeXBlICpUeTEsIFR5cGUgKlR5Mikgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmlzVHJ1bmNhdGVGcmVlKFR5MSwgVHkyKTsKKyAgfQorICBib29sIGlzUHJvZml0YWJsZVRvSG9pc3QoSW5zdHJ1Y3Rpb24gKkkpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5pc1Byb2ZpdGFibGVUb0hvaXN0KEkpOworICB9CisgIGJvb2wgdXNlQUEoKSBvdmVycmlkZSB7IHJldHVybiBJbXBsLnVzZUFBKCk7IH0KKyAgYm9vbCBpc1R5cGVMZWdhbChUeXBlICpUeSkgb3ZlcnJpZGUgeyByZXR1cm4gSW1wbC5pc1R5cGVMZWdhbChUeSk7IH0KKyAgdW5zaWduZWQgZ2V0SnVtcEJ1ZkFsaWdubWVudCgpIG92ZXJyaWRlIHsgcmV0dXJuIEltcGwuZ2V0SnVtcEJ1ZkFsaWdubWVudCgpOyB9CisgIHVuc2lnbmVkIGdldEp1bXBCdWZTaXplKCkgb3ZlcnJpZGUgeyByZXR1cm4gSW1wbC5nZXRKdW1wQnVmU2l6ZSgpOyB9CisgIGJvb2wgc2hvdWxkQnVpbGRMb29rdXBUYWJsZXMoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuc2hvdWxkQnVpbGRMb29rdXBUYWJsZXMoKTsKKyAgfQorICBib29sIHNob3VsZEJ1aWxkTG9va3VwVGFibGVzRm9yQ29uc3RhbnQoQ29uc3RhbnQgKkMpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5zaG91bGRCdWlsZExvb2t1cFRhYmxlc0ZvckNvbnN0YW50KEMpOworICB9CisgIGJvb2wgdXNlQ29sZENDRm9yQ29sZENhbGwoRnVuY3Rpb24gJkYpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC51c2VDb2xkQ0NGb3JDb2xkQ2FsbChGKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFNjYWxhcml6YXRpb25PdmVyaGVhZChUeXBlICpUeSwgYm9vbCBJbnNlcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEV4dHJhY3QpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRTY2FsYXJpemF0aW9uT3ZlcmhlYWQoVHksIEluc2VydCwgRXh0cmFjdCk7CisgIH0KKyAgdW5zaWduZWQgZ2V0T3BlcmFuZHNTY2FsYXJpemF0aW9uT3ZlcmhlYWQoQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVkYpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRPcGVyYW5kc1NjYWxhcml6YXRpb25PdmVyaGVhZChBcmdzLCBWRik7CisgIH0KKworICBib29sIHN1cHBvcnRzRWZmaWNpZW50VmVjdG9yRWxlbWVudExvYWRTdG9yZSgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5zdXBwb3J0c0VmZmljaWVudFZlY3RvckVsZW1lbnRMb2FkU3RvcmUoKTsKKyAgfQorCisgIGJvb2wgZW5hYmxlQWdncmVzc2l2ZUludGVybGVhdmluZyhib29sIExvb3BIYXNSZWR1Y3Rpb25zKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZW5hYmxlQWdncmVzc2l2ZUludGVybGVhdmluZyhMb29wSGFzUmVkdWN0aW9ucyk7CisgIH0KKyAgY29uc3QgTWVtQ21wRXhwYW5zaW9uT3B0aW9ucyAqZW5hYmxlTWVtQ21wRXhwYW5zaW9uKAorICAgICAgYm9vbCBJc1plcm9DbXApIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5lbmFibGVNZW1DbXBFeHBhbnNpb24oSXNaZXJvQ21wKTsKKyAgfQorICBib29sIGVuYWJsZUludGVybGVhdmVkQWNjZXNzVmVjdG9yaXphdGlvbigpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5lbmFibGVJbnRlcmxlYXZlZEFjY2Vzc1ZlY3Rvcml6YXRpb24oKTsKKyAgfQorICBib29sIGlzRlBWZWN0b3JpemF0aW9uUG90ZW50aWFsbHlVbnNhZmUoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuaXNGUFZlY3Rvcml6YXRpb25Qb3RlbnRpYWxseVVuc2FmZSgpOworICB9CisgIGJvb2wgYWxsb3dzTWlzYWxpZ25lZE1lbW9yeUFjY2Vzc2VzKExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCaXRXaWR0aCwgdW5zaWduZWQgQWRkcmVzc1NwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQsIGJvb2wgKkZhc3QpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5hbGxvd3NNaXNhbGlnbmVkTWVtb3J5QWNjZXNzZXMoQ29udGV4dCwgQml0V2lkdGgsIEFkZHJlc3NTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpZ25tZW50LCBGYXN0KTsKKyAgfQorICBQb3BjbnRTdXBwb3J0S2luZCBnZXRQb3BjbnRTdXBwb3J0KHVuc2lnbmVkIEludFR5V2lkdGhJbkJpdCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldFBvcGNudFN1cHBvcnQoSW50VHlXaWR0aEluQml0KTsKKyAgfQorICBib29sIGhhdmVGYXN0U3FydChUeXBlICpUeSkgb3ZlcnJpZGUgeyByZXR1cm4gSW1wbC5oYXZlRmFzdFNxcnQoVHkpOyB9CisKKyAgYm9vbCBpc0ZDbXBPcmRDaGVhcGVyVGhhbkZDbXBaZXJvKFR5cGUgKlR5KSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuaXNGQ21wT3JkQ2hlYXBlclRoYW5GQ21wWmVybyhUeSk7CisgIH0KKworICBpbnQgZ2V0RlBPcENvc3QoVHlwZSAqVHkpIG92ZXJyaWRlIHsgcmV0dXJuIEltcGwuZ2V0RlBPcENvc3QoVHkpOyB9CisKKyAgaW50IGdldEludEltbUNvZGVTaXplQ29zdCh1bnNpZ25lZCBPcGMsIHVuc2lnbmVkIElkeCwgY29uc3QgQVBJbnQgJkltbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpUeSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldEludEltbUNvZGVTaXplQ29zdChPcGMsIElkeCwgSW1tLCBUeSk7CisgIH0KKyAgaW50IGdldEludEltbUNvc3QoY29uc3QgQVBJbnQgJkltbSwgVHlwZSAqVHkpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRJbnRJbW1Db3N0KEltbSwgVHkpOworICB9CisgIGludCBnZXRJbnRJbW1Db3N0KHVuc2lnbmVkIE9wYywgdW5zaWduZWQgSWR4LCBjb25zdCBBUEludCAmSW1tLAorICAgICAgICAgICAgICAgICAgICBUeXBlICpUeSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldEludEltbUNvc3QoT3BjLCBJZHgsIEltbSwgVHkpOworICB9CisgIGludCBnZXRJbnRJbW1Db3N0KEludHJpbnNpYzo6SUQgSUlELCB1bnNpZ25lZCBJZHgsIGNvbnN0IEFQSW50ICZJbW0sCisgICAgICAgICAgICAgICAgICAgIFR5cGUgKlR5KSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0SW50SW1tQ29zdChJSUQsIElkeCwgSW1tLCBUeSk7CisgIH0KKyAgdW5zaWduZWQgZ2V0TnVtYmVyT2ZSZWdpc3RlcnMoYm9vbCBWZWN0b3IpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXROdW1iZXJPZlJlZ2lzdGVycyhWZWN0b3IpOworICB9CisgIHVuc2lnbmVkIGdldFJlZ2lzdGVyQml0V2lkdGgoYm9vbCBWZWN0b3IpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRSZWdpc3RlckJpdFdpZHRoKFZlY3Rvcik7CisgIH0KKyAgdW5zaWduZWQgZ2V0TWluVmVjdG9yUmVnaXN0ZXJCaXRXaWR0aCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRNaW5WZWN0b3JSZWdpc3RlckJpdFdpZHRoKCk7CisgIH0KKyAgYm9vbCBzaG91bGRNYXhpbWl6ZVZlY3RvckJhbmR3aWR0aChib29sIE9wdFNpemUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5zaG91bGRNYXhpbWl6ZVZlY3RvckJhbmR3aWR0aChPcHRTaXplKTsKKyAgfQorICBib29sIHNob3VsZENvbnNpZGVyQWRkcmVzc1R5cGVQcm9tb3Rpb24oCisgICAgICBjb25zdCBJbnN0cnVjdGlvbiAmSSwgYm9vbCAmQWxsb3dQcm9tb3Rpb25XaXRob3V0Q29tbW9uSGVhZGVyKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuc2hvdWxkQ29uc2lkZXJBZGRyZXNzVHlwZVByb21vdGlvbigKKyAgICAgICAgSSwgQWxsb3dQcm9tb3Rpb25XaXRob3V0Q29tbW9uSGVhZGVyKTsKKyAgfQorICB1bnNpZ25lZCBnZXRDYWNoZUxpbmVTaXplKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldENhY2hlTGluZVNpemUoKTsKKyAgfQorICBsbHZtOjpPcHRpb25hbDx1bnNpZ25lZD4gZ2V0Q2FjaGVTaXplKENhY2hlTGV2ZWwgTGV2ZWwpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRDYWNoZVNpemUoTGV2ZWwpOworICB9CisgIGxsdm06Ok9wdGlvbmFsPHVuc2lnbmVkPiBnZXRDYWNoZUFzc29jaWF0aXZpdHkoQ2FjaGVMZXZlbCBMZXZlbCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldENhY2hlQXNzb2NpYXRpdml0eShMZXZlbCk7CisgIH0KKyAgdW5zaWduZWQgZ2V0UHJlZmV0Y2hEaXN0YW5jZSgpIG92ZXJyaWRlIHsgcmV0dXJuIEltcGwuZ2V0UHJlZmV0Y2hEaXN0YW5jZSgpOyB9CisgIHVuc2lnbmVkIGdldE1pblByZWZldGNoU3RyaWRlKCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldE1pblByZWZldGNoU3RyaWRlKCk7CisgIH0KKyAgdW5zaWduZWQgZ2V0TWF4UHJlZmV0Y2hJdGVyYXRpb25zQWhlYWQoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0TWF4UHJlZmV0Y2hJdGVyYXRpb25zQWhlYWQoKTsKKyAgfQorICB1bnNpZ25lZCBnZXRNYXhJbnRlcmxlYXZlRmFjdG9yKHVuc2lnbmVkIFZGKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0TWF4SW50ZXJsZWF2ZUZhY3RvcihWRik7CisgIH0KKyAgdW5zaWduZWQgZ2V0RXN0aW1hdGVkTnVtYmVyT2ZDYXNlQ2x1c3RlcnMoY29uc3QgU3dpdGNoSW5zdCAmU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZKVFNpemUpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRFc3RpbWF0ZWROdW1iZXJPZkNhc2VDbHVzdGVycyhTSSwgSlRTaXplKTsKKyAgfQorICB1bnNpZ25lZAorICBnZXRBcml0aG1ldGljSW5zdHJDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVHksIE9wZXJhbmRWYWx1ZUtpbmQgT3BkMUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFuZFZhbHVlS2luZCBPcGQySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYW5kVmFsdWVQcm9wZXJ0aWVzIE9wZDFQcm9wSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYW5kVmFsdWVQcm9wZXJ0aWVzIE9wZDJQcm9wSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBWYWx1ZSAqPiBBcmdzKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0QXJpdGhtZXRpY0luc3RyQ29zdChPcGNvZGUsIFR5LCBPcGQxSW5mbywgT3BkMkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGQxUHJvcEluZm8sIE9wZDJQcm9wSW5mbywgQXJncyk7CisgIH0KKyAgaW50IGdldFNodWZmbGVDb3N0KFNodWZmbGVLaW5kIEtpbmQsIFR5cGUgKlRwLCBpbnQgSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICBUeXBlICpTdWJUcCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldFNodWZmbGVDb3N0KEtpbmQsIFRwLCBJbmRleCwgU3ViVHApOworICB9CisgIGludCBnZXRDYXN0SW5zdHJDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqRHN0LCBUeXBlICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpJKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0Q2FzdEluc3RyQ29zdChPcGNvZGUsIERzdCwgU3JjLCBJKTsKKyAgfQorICBpbnQgZ2V0RXh0cmFjdFdpdGhFeHRlbmRDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqRHN0LCBWZWN0b3JUeXBlICpWZWNUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRleCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldEV4dHJhY3RXaXRoRXh0ZW5kQ29zdChPcGNvZGUsIERzdCwgVmVjVHksIEluZGV4KTsKKyAgfQorICBpbnQgZ2V0Q0ZJbnN0ckNvc3QodW5zaWduZWQgT3Bjb2RlKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0Q0ZJbnN0ckNvc3QoT3Bjb2RlKTsKKyAgfQorICBpbnQgZ2V0Q21wU2VsSW5zdHJDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVmFsVHksIFR5cGUgKkNvbmRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqSSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldENtcFNlbEluc3RyQ29zdChPcGNvZGUsIFZhbFR5LCBDb25kVHksIEkpOworICB9CisgIGludCBnZXRWZWN0b3JJbnN0ckNvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpWYWwsIHVuc2lnbmVkIEluZGV4KSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0VmVjdG9ySW5zdHJDb3N0KE9wY29kZSwgVmFsLCBJbmRleCk7CisgIH0KKyAgaW50IGdldE1lbW9yeU9wQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlNyYywgdW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSwgY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRNZW1vcnlPcENvc3QoT3Bjb2RlLCBTcmMsIEFsaWdubWVudCwgQWRkcmVzc1NwYWNlLCBJKTsKKyAgfQorICBpbnQgZ2V0TWFza2VkTWVtb3J5T3BDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqU3JjLCB1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkcmVzc1NwYWNlKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0TWFza2VkTWVtb3J5T3BDb3N0KE9wY29kZSwgU3JjLCBBbGlnbm1lbnQsIEFkZHJlc3NTcGFjZSk7CisgIH0KKyAgaW50IGdldEdhdGhlclNjYXR0ZXJPcENvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpEYXRhVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpQdHIsIGJvb2wgVmFyaWFibGVNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRHYXRoZXJTY2F0dGVyT3BDb3N0KE9wY29kZSwgRGF0YVR5LCBQdHIsIFZhcmlhYmxlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWdubWVudCk7CisgIH0KKyAgaW50IGdldEludGVybGVhdmVkTWVtb3J5T3BDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVmVjVHksIHVuc2lnbmVkIEZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJbmRpY2VzLCB1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyZXNzU3BhY2UpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRJbnRlcmxlYXZlZE1lbW9yeU9wQ29zdChPcGNvZGUsIFZlY1R5LCBGYWN0b3IsIEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpZ25tZW50LCBBZGRyZXNzU3BhY2UpOworICB9CisgIGludCBnZXRBcml0aG1ldGljUmVkdWN0aW9uQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1BhaXJ3aXNlRm9ybSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldEFyaXRobWV0aWNSZWR1Y3Rpb25Db3N0KE9wY29kZSwgVHksIElzUGFpcndpc2VGb3JtKTsKKyAgfQorICBpbnQgZ2V0TWluTWF4UmVkdWN0aW9uQ29zdChUeXBlICpUeSwgVHlwZSAqQ29uZFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzUGFpcndpc2VGb3JtLCBib29sIElzVW5zaWduZWQpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRNaW5NYXhSZWR1Y3Rpb25Db3N0KFR5LCBDb25kVHksIElzUGFpcndpc2VGb3JtLCBJc1Vuc2lnbmVkKTsKKyAgIH0KKyAgaW50IGdldEludHJpbnNpY0luc3RyQ29zdChJbnRyaW5zaWM6OklEIElELCBUeXBlICpSZXRUeSwgQXJyYXlSZWY8VHlwZSAqPiBUeXMsCisgICAgICAgICAgICAgICBGYXN0TWF0aEZsYWdzIEZNRiwgdW5zaWduZWQgU2NhbGFyaXphdGlvbkNvc3RQYXNzZWQpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRJbnRyaW5zaWNJbnN0ckNvc3QoSUQsIFJldFR5LCBUeXMsIEZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyaXphdGlvbkNvc3RQYXNzZWQpOworICB9CisgIGludCBnZXRJbnRyaW5zaWNJbnN0ckNvc3QoSW50cmluc2ljOjpJRCBJRCwgVHlwZSAqUmV0VHksCisgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywgRmFzdE1hdGhGbGFncyBGTUYsIHVuc2lnbmVkIFZGKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0SW50cmluc2ljSW5zdHJDb3N0KElELCBSZXRUeSwgQXJncywgRk1GLCBWRik7CisgIH0KKyAgaW50IGdldENhbGxJbnN0ckNvc3QoRnVuY3Rpb24gKkYsIFR5cGUgKlJldFR5LAorICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUeXBlICo+IFR5cykgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldENhbGxJbnN0ckNvc3QoRiwgUmV0VHksIFR5cyk7CisgIH0KKyAgdW5zaWduZWQgZ2V0TnVtYmVyT2ZQYXJ0cyhUeXBlICpUcCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldE51bWJlck9mUGFydHMoVHApOworICB9CisgIGludCBnZXRBZGRyZXNzQ29tcHV0YXRpb25Db3N0KFR5cGUgKlR5LCBTY2FsYXJFdm9sdXRpb24gKlNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWICpQdHIpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRBZGRyZXNzQ29tcHV0YXRpb25Db3N0KFR5LCBTRSwgUHRyKTsKKyAgfQorICB1bnNpZ25lZCBnZXRDb3N0T2ZLZWVwaW5nTGl2ZU92ZXJDYWxsKEFycmF5UmVmPFR5cGUgKj4gVHlzKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0Q29zdE9mS2VlcGluZ0xpdmVPdmVyQ2FsbChUeXMpOworICB9CisgIGJvb2wgZ2V0VGd0TWVtSW50cmluc2ljKEludHJpbnNpY0luc3QgKkluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lbUludHJpbnNpY0luZm8gJkluZm8pIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRUZ3RNZW1JbnRyaW5zaWMoSW5zdCwgSW5mbyk7CisgIH0KKyAgdW5zaWduZWQgZ2V0QXRvbWljTWVtSW50cmluc2ljTWF4RWxlbWVudFNpemUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0QXRvbWljTWVtSW50cmluc2ljTWF4RWxlbWVudFNpemUoKTsKKyAgfQorICBWYWx1ZSAqZ2V0T3JDcmVhdGVSZXN1bHRGcm9tTWVtSW50cmluc2ljKEludHJpbnNpY0luc3QgKkluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqRXhwZWN0ZWRUeXBlKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0T3JDcmVhdGVSZXN1bHRGcm9tTWVtSW50cmluc2ljKEluc3QsIEV4cGVjdGVkVHlwZSk7CisgIH0KKyAgVHlwZSAqZ2V0TWVtY3B5TG9vcExvd2VyaW5nVHlwZShMTFZNQ29udGV4dCAmQ29udGV4dCwgVmFsdWUgKkxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0QWxpZ24pIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRNZW1jcHlMb29wTG93ZXJpbmdUeXBlKENvbnRleHQsIExlbmd0aCwgU3JjQWxpZ24sIERlc3RBbGlnbik7CisgIH0KKyAgdm9pZCBnZXRNZW1jcHlMb29wUmVzaWR1YWxMb3dlcmluZ1R5cGUoU21hbGxWZWN0b3JJbXBsPFR5cGUgKj4gJk9wc091dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlbWFpbmluZ0J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdEFsaWduKSBjb25zdCBvdmVycmlkZSB7CisgICAgSW1wbC5nZXRNZW1jcHlMb29wUmVzaWR1YWxMb3dlcmluZ1R5cGUoT3BzT3V0LCBDb250ZXh0LCBSZW1haW5pbmdCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcmNBbGlnbiwgRGVzdEFsaWduKTsKKyAgfQorICBib29sIGFyZUlubGluZUNvbXBhdGlibGUoY29uc3QgRnVuY3Rpb24gKkNhbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uICpDYWxsZWUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5hcmVJbmxpbmVDb21wYXRpYmxlKENhbGxlciwgQ2FsbGVlKTsKKyAgfQorICBib29sIGlzSW5kZXhlZExvYWRMZWdhbChNZW1JbmRleGVkTW9kZSBNb2RlLCBUeXBlICpUeSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmlzSW5kZXhlZExvYWRMZWdhbChNb2RlLCBUeSwgZ2V0RGF0YUxheW91dCgpKTsKKyAgfQorICBib29sIGlzSW5kZXhlZFN0b3JlTGVnYWwoTWVtSW5kZXhlZE1vZGUgTW9kZSwgVHlwZSAqVHkpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5pc0luZGV4ZWRTdG9yZUxlZ2FsKE1vZGUsIFR5LCBnZXREYXRhTGF5b3V0KCkpOworICB9CisgIHVuc2lnbmVkIGdldExvYWRTdG9yZVZlY1JlZ0JpdFdpZHRoKHVuc2lnbmVkIEFkZHJTcGFjZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldExvYWRTdG9yZVZlY1JlZ0JpdFdpZHRoKEFkZHJTcGFjZSk7CisgIH0KKyAgYm9vbCBpc0xlZ2FsVG9WZWN0b3JpemVMb2FkKExvYWRJbnN0ICpMSSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmlzTGVnYWxUb1ZlY3Rvcml6ZUxvYWQoTEkpOworICB9CisgIGJvb2wgaXNMZWdhbFRvVmVjdG9yaXplU3RvcmUoU3RvcmVJbnN0ICpTSSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmlzTGVnYWxUb1ZlY3Rvcml6ZVN0b3JlKFNJKTsKKyAgfQorICBib29sIGlzTGVnYWxUb1ZlY3Rvcml6ZUxvYWRDaGFpbih1bnNpZ25lZCBDaGFpblNpemVJbkJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmlzTGVnYWxUb1ZlY3Rvcml6ZUxvYWRDaGFpbihDaGFpblNpemVJbkJ5dGVzLCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJTcGFjZSk7CisgIH0KKyAgYm9vbCBpc0xlZ2FsVG9WZWN0b3JpemVTdG9yZUNoYWluKHVuc2lnbmVkIENoYWluU2l6ZUluQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyU3BhY2UpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5pc0xlZ2FsVG9WZWN0b3JpemVTdG9yZUNoYWluKENoYWluU2l6ZUluQnl0ZXMsIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJTcGFjZSk7CisgIH0KKyAgdW5zaWduZWQgZ2V0TG9hZFZlY3RvckZhY3Rvcih1bnNpZ25lZCBWRiwgdW5zaWduZWQgTG9hZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ2hhaW5TaXplSW5CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JUeXBlICpWZWNUeSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldExvYWRWZWN0b3JGYWN0b3IoVkYsIExvYWRTaXplLCBDaGFpblNpemVJbkJ5dGVzLCBWZWNUeSk7CisgIH0KKyAgdW5zaWduZWQgZ2V0U3RvcmVWZWN0b3JGYWN0b3IodW5zaWduZWQgVkYsIHVuc2lnbmVkIFN0b3JlU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ2hhaW5TaXplSW5CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yVHlwZSAqVmVjVHkpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5nZXRTdG9yZVZlY3RvckZhY3RvcihWRiwgU3RvcmVTaXplLCBDaGFpblNpemVJbkJ5dGVzLCBWZWNUeSk7CisgIH0KKyAgYm9vbCB1c2VSZWR1Y3Rpb25JbnRyaW5zaWModW5zaWduZWQgT3Bjb2RlLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVkdWN0aW9uRmxhZ3MgRmxhZ3MpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC51c2VSZWR1Y3Rpb25JbnRyaW5zaWMoT3Bjb2RlLCBUeSwgRmxhZ3MpOworICB9CisgIGJvb2wgc2hvdWxkRXhwYW5kUmVkdWN0aW9uKGNvbnN0IEludHJpbnNpY0luc3QgKklJKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuc2hvdWxkRXhwYW5kUmVkdWN0aW9uKElJKTsKKyAgfQorICBpbnQgZ2V0SW5zdHJ1Y3Rpb25MYXRlbmN5KGNvbnN0IEluc3RydWN0aW9uICpJKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwuZ2V0SW5zdHJ1Y3Rpb25MYXRlbmN5KEkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK1RhcmdldFRyYW5zZm9ybUluZm86OlRhcmdldFRyYW5zZm9ybUluZm8oVCBJbXBsKQorICAgIDogVFRJSW1wbChuZXcgTW9kZWw8VD4oSW1wbCkpIHt9CisKKy8vLyBcYnJpZWYgQW5hbHlzaXMgcGFzcyBwcm92aWRpbmcgdGhlIFxjIFRhcmdldFRyYW5zZm9ybUluZm8uCisvLy8KKy8vLyBUaGUgY29yZSBpZGVhIG9mIHRoZSBUYXJnZXRJUkFuYWx5c2lzIGlzIHRvIGV4cG9zZSBhbiBpbnRlcmZhY2UgdGhyb3VnaAorLy8vIHdoaWNoIExMVk0gdGFyZ2V0cyBjYW4gYW5hbHl6ZSBhbmQgcHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbWlkZGxlCisvLy8gZW5kJ3MgdGFyZ2V0LWluZGVwZW5kZW50IElSLiBUaGlzIHN1cHBvcnRzIHVzZSBjYXNlcyBzdWNoIGFzIHRhcmdldC1hd2FyZQorLy8vIGNvc3QgbW9kZWxpbmcgb2YgSVIgY29uc3RydWN0cy4KKy8vLworLy8vIFRoaXMgaXMgYSBmdW5jdGlvbiBhbmFseXNpcyBiZWNhdXNlIG11Y2ggb2YgdGhlIGNvc3QgbW9kZWxpbmcgZm9yIHRhcmdldHMKKy8vLyBpcyBkb25lIGluIGEgc3VidGFyZ2V0IHNwZWNpZmljIHdheSBhbmQgTExWTSBzdXBwb3J0cyBjb21waWxpbmcgZGlmZmVyZW50CisvLy8gZnVuY3Rpb25zIHRhcmdldGluZyBkaWZmZXJlbnQgc3VidGFyZ2V0cyBpbiBvcmRlciB0byBzdXBwb3J0IHJ1bnRpbWUKKy8vLyBkaXNwYXRjaCBhY2NvcmRpbmcgdG8gdGhlIG9ic2VydmVkIHN1YnRhcmdldC4KK2NsYXNzIFRhcmdldElSQW5hbHlzaXMgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48VGFyZ2V0SVJBbmFseXNpcz4geworcHVibGljOgorICB0eXBlZGVmIFRhcmdldFRyYW5zZm9ybUluZm8gUmVzdWx0OworCisgIC8vLyBcYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3QgYSB0YXJnZXQgSVIgYW5hbHlzaXMuCisgIC8vLworICAvLy8gVGhpcyB3aWxsIHVzZSB0aGUgbW9kdWxlJ3MgZGF0YWxheW91dCB0byBjb25zdHJ1Y3QgYSBiYXNlbGluZQorICAvLy8gY29uc2VydmF0aXZlIFRUSSByZXN1bHQuCisgIFRhcmdldElSQW5hbHlzaXMoKTsKKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBJUiBhbmFseXNpcyBwYXNzIGFyb3VuZCBhIHRhcmdldC1wcm92aWRlIGNhbGxiYWNrLgorICAvLy8KKyAgLy8vIFRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCB3aXRoIGEgcGFydGljdWxhciBmdW5jdGlvbiBmb3Igd2hpY2ggdGhlIFRUSQorICAvLy8gaXMgbmVlZGVkIGFuZCBtdXN0IHJldHVybiBhIFRUSSBvYmplY3QgZm9yIHRoYXQgZnVuY3Rpb24uCisgIFRhcmdldElSQW5hbHlzaXMoc3RkOjpmdW5jdGlvbjxSZXN1bHQoY29uc3QgRnVuY3Rpb24gJik+IFRUSUNhbGxiYWNrKTsKKworICAvLyBWYWx1ZSBzZW1hbnRpY3MuIFdlIHNwZWxsIG91dCB0aGUgY29uc3RydWN0b3JzIGZvciBNU1ZDLgorICBUYXJnZXRJUkFuYWx5c2lzKGNvbnN0IFRhcmdldElSQW5hbHlzaXMgJkFyZykKKyAgICAgIDogVFRJQ2FsbGJhY2soQXJnLlRUSUNhbGxiYWNrKSB7fQorICBUYXJnZXRJUkFuYWx5c2lzKFRhcmdldElSQW5hbHlzaXMgJiZBcmcpCisgICAgICA6IFRUSUNhbGxiYWNrKHN0ZDo6bW92ZShBcmcuVFRJQ2FsbGJhY2spKSB7fQorICBUYXJnZXRJUkFuYWx5c2lzICZvcGVyYXRvcj0oY29uc3QgVGFyZ2V0SVJBbmFseXNpcyAmUkhTKSB7CisgICAgVFRJQ2FsbGJhY2sgPSBSSFMuVFRJQ2FsbGJhY2s7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIFRhcmdldElSQW5hbHlzaXMgJm9wZXJhdG9yPShUYXJnZXRJUkFuYWx5c2lzICYmUkhTKSB7CisgICAgVFRJQ2FsbGJhY2sgPSBzdGQ6Om1vdmUoUkhTLlRUSUNhbGxiYWNrKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBSZXN1bHQgcnVuKGNvbnN0IEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmKTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIEFuYWx5c2lzSW5mb01peGluPFRhcmdldElSQW5hbHlzaXM+OworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCisgIC8vLyBcYnJpZWYgVGhlIGNhbGxiYWNrIHVzZWQgdG8gcHJvZHVjZSBhIHJlc3VsdC4KKyAgLy8vCisgIC8vLyBXZSB1c2UgYSBjb21wbGV0ZWx5IG9wYXF1ZSBjYWxsYmFjayBzbyB0aGF0IHRhcmdldHMgY2FuIHByb3ZpZGUgd2hhdGV2ZXIKKyAgLy8vIG1lY2hhbmlzbSB0aGV5IGRlc2lyZSBmb3IgY29uc3RydWN0aW5nIHRoZSBUVEkgZm9yIGEgZ2l2ZW4gZnVuY3Rpb24uCisgIC8vLworICAvLy8gRklYTUU6IFNob3VsZCB3ZSByZWFsbHkgdXNlIHN0ZDo6ZnVuY3Rpb24/IEl0J3MgcmVsYXRpdmVseSBpbmVmZmljaWVudC4KKyAgLy8vIEl0IG1pZ2h0IGJlIHBvc3NpYmxlIHRvIGFycmFuZ2UgZm9yIGV2ZW4gc3RhdGVmdWwgY2FsbGJhY2tzIHRvIG91dGxpdmUKKyAgLy8vIHRoZSBhbmFseXNpcyBhbmQgdGh1cyB1c2UgYSBmdW5jdGlvbl9yZWYgd2hpY2ggd291bGQgYmUgbGlnaHRlciB3ZWlnaHQuCisgIC8vLyBUaGlzIG1heSBhbHNvIGJlIGxlc3MgZXJyb3IgcHJvbmUgYXMgdGhlIGNhbGxiYWNrIGlzIGxpa2VseSB0byByZWZlcmVuY2UKKyAgLy8vIHRoZSBleHRlcm5hbCBUYXJnZXRNYWNoaW5lLCBhbmQgdGhhdCByZWZlcmVuY2UgbmVlZHMgdG8gbmV2ZXIgZGFuZ2xlLgorICBzdGQ6OmZ1bmN0aW9uPFJlc3VsdChjb25zdCBGdW5jdGlvbiAmKT4gVFRJQ2FsbGJhY2s7CisKKyAgLy8vIFxicmllZiBIZWxwZXIgZnVuY3Rpb24gdXNlZCBhcyB0aGUgY2FsbGJhY2sgaW4gdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCisgIHN0YXRpYyBSZXN1bHQgZ2V0RGVmYXVsdFRUSShjb25zdCBGdW5jdGlvbiAmRik7Cit9OworCisvLy8gXGJyaWVmIFdyYXBwZXIgcGFzcyBmb3IgVGFyZ2V0VHJhbnNmb3JtSW5mby4KKy8vLworLy8vIFRoaXMgcGFzcyBjYW4gYmUgY29uc3RydWN0ZWQgZnJvbSBhIFRUSSBvYmplY3Qgd2hpY2ggaXQgc3RvcmVzIGludGVybmFsbHkKKy8vLyBhbmQgaXMgcXVlcmllZCBieSBwYXNzZXMuCitjbGFzcyBUYXJnZXRUcmFuc2Zvcm1JbmZvV3JhcHBlclBhc3MgOiBwdWJsaWMgSW1tdXRhYmxlUGFzcyB7CisgIFRhcmdldElSQW5hbHlzaXMgVElSQTsKKyAgT3B0aW9uYWw8VGFyZ2V0VHJhbnNmb3JtSW5mbz4gVFRJOworCisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICAvLy8gXGJyaWVmIFdlIG11c3QgcHJvdmlkZSBhIGRlZmF1bHQgY29uc3RydWN0b3IgZm9yIHRoZSBwYXNzIGJ1dCBpdCBzaG91bGQKKyAgLy8vIG5ldmVyIGJlIHVzZWQuCisgIC8vLworICAvLy8gVXNlIHRoZSBjb25zdHJ1Y3RvciBiZWxvdyBvciBjYWxsIG9uZSBvZiB0aGUgY3JlYXRpb24gcm91dGluZXMuCisgIFRhcmdldFRyYW5zZm9ybUluZm9XcmFwcGVyUGFzcygpOworCisgIGV4cGxpY2l0IFRhcmdldFRyYW5zZm9ybUluZm9XcmFwcGVyUGFzcyhUYXJnZXRJUkFuYWx5c2lzIFRJUkEpOworCisgIFRhcmdldFRyYW5zZm9ybUluZm8gJmdldFRUSShjb25zdCBGdW5jdGlvbiAmRik7Cit9OworCisvLy8gXGJyaWVmIENyZWF0ZSBhbiBhbmFseXNpcyBwYXNzIHdyYXBwZXIgYXJvdW5kIGEgVFRJIG9iamVjdC4KKy8vLworLy8vIFRoaXMgYW5hbHlzaXMgcGFzcyBqdXN0IGhvbGRzIHRoZSBUVEkgaW5zdGFuY2UgYW5kIG1ha2VzIGl0IGF2YWlsYWJsZSB0bworLy8vIGNsaWVudHMuCitJbW11dGFibGVQYXNzICpjcmVhdGVUYXJnZXRUcmFuc2Zvcm1JbmZvV3JhcHBlclBhc3MoVGFyZ2V0SVJBbmFseXNpcyBUSVJBKTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1RhcmdldFRyYW5zZm9ybUluZm9JbXBsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1RhcmdldFRyYW5zZm9ybUluZm9JbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGY0Zjg1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVGFyZ2V0VHJhbnNmb3JtSW5mb0ltcGwuaApAQCAtMCwwICsxLDg1MCBAQAorLy89PT0tIFRhcmdldFRyYW5zZm9ybUluZm9JbXBsLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIFRoaXMgZmlsZSBwcm92aWRlcyBoZWxwZXJzIGZvciB0aGUgaW1wbGVtZW50YXRpb24gb2YKKy8vLyBhIFRhcmdldFRyYW5zZm9ybUluZm8tY29uZm9ybWluZyBjbGFzcy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1RBUkdFVFRSQU5TRk9STUlORk9JTVBMX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19UQVJHRVRUUkFOU0ZPUk1JTkZPSU1QTF9ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkV4cHJlc3Npb25zLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9UYXJnZXRUcmFuc2Zvcm1JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9WZWN0b3JVdGlscy5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RhdGFMYXlvdXQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9HZXRFbGVtZW50UHRyVHlwZUl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9PcGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvVHlwZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBcYnJpZWYgQmFzZSBjbGFzcyBmb3IgdXNlIGFzIGEgbWl4LWluIHRoYXQgYWlkcyBpbXBsZW1lbnRpbmcKKy8vLyBhIFRhcmdldFRyYW5zZm9ybUluZm8tY29tcGF0aWJsZSBjbGFzcy4KK2NsYXNzIFRhcmdldFRyYW5zZm9ybUluZm9JbXBsQmFzZSB7Citwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgVGFyZ2V0VHJhbnNmb3JtSW5mbyBUVEk7CisKKyAgY29uc3QgRGF0YUxheW91dCAmREw7CisKKyAgZXhwbGljaXQgVGFyZ2V0VHJhbnNmb3JtSW5mb0ltcGxCYXNlKGNvbnN0IERhdGFMYXlvdXQgJkRMKSA6IERMKERMKSB7fQorCitwdWJsaWM6CisgIC8vIFByb3ZpZGUgdmFsdWUgc2VtYW50aWNzLiBNU1ZDIHJlcXVpcmVzIHRoYXQgd2Ugc3BlbGwgYWxsIG9mIHRoZXNlIG91dC4KKyAgVGFyZ2V0VHJhbnNmb3JtSW5mb0ltcGxCYXNlKGNvbnN0IFRhcmdldFRyYW5zZm9ybUluZm9JbXBsQmFzZSAmQXJnKQorICAgICAgOiBETChBcmcuREwpIHt9CisgIFRhcmdldFRyYW5zZm9ybUluZm9JbXBsQmFzZShUYXJnZXRUcmFuc2Zvcm1JbmZvSW1wbEJhc2UgJiZBcmcpIDogREwoQXJnLkRMKSB7fQorCisgIGNvbnN0IERhdGFMYXlvdXQgJmdldERhdGFMYXlvdXQoKSBjb25zdCB7IHJldHVybiBETDsgfQorCisgIHVuc2lnbmVkIGdldE9wZXJhdGlvbkNvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpUeSwgVHlwZSAqT3BUeSkgeworICAgIHN3aXRjaCAoT3Bjb2RlKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIC8vIEJ5IGRlZmF1bHQsIGp1c3QgY2xhc3NpZnkgZXZlcnl0aGluZyBhcyAnYmFzaWMnLgorICAgICAgcmV0dXJuIFRUSTo6VENDX0Jhc2ljOworCisgICAgY2FzZSBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cjoKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVzZSBnZXRHRVBDb3N0IGZvciBHRVAgb3BlcmF0aW9ucyEiKTsKKworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkJpdENhc3Q6CisgICAgICBhc3NlcnQoT3BUeSAmJiAiQ2FzdCBpbnN0cnVjdGlvbnMgbXVzdCBwcm92aWRlIHRoZSBvcGVyYW5kIHR5cGUiKTsKKyAgICAgIGlmIChUeSA9PSBPcFR5IHx8IChUeS0+aXNQb2ludGVyVHkoKSAmJiBPcFR5LT5pc1BvaW50ZXJUeSgpKSkKKyAgICAgICAgLy8gSWRlbnRpdHkgYW5kIHBvaW50ZXItdG8tcG9pbnRlciBjYXN0cyBhcmUgZnJlZS4KKyAgICAgICAgcmV0dXJuIFRUSTo6VENDX0ZyZWU7CisKKyAgICAgIC8vIE90aGVyd2lzZSwgdGhlIGRlZmF1bHQgYmFzaWMgY29zdCBpcyB1c2VkLgorICAgICAgcmV0dXJuIFRUSTo6VENDX0Jhc2ljOworCisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RkRpdjoKKyAgICBjYXNlIEluc3RydWN0aW9uOjpGUmVtOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNEaXY6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6U1JlbToKKyAgICBjYXNlIEluc3RydWN0aW9uOjpVRGl2OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlVSZW06CisgICAgICByZXR1cm4gVFRJOjpUQ0NfRXhwZW5zaXZlOworCisgICAgY2FzZSBJbnN0cnVjdGlvbjo6SW50VG9QdHI6IHsKKyAgICAgIC8vIEFuIGludHRvcHRyIGNhc3QgaXMgZnJlZSBzbyBsb25nIGFzIHRoZSBpbnB1dCBpcyBhIGxlZ2FsIGludGVnZXIgdHlwZQorICAgICAgLy8gd2hpY2ggZG9lc24ndCBjb250YWluIHZhbHVlcyBvdXRzaWRlIHRoZSByYW5nZSBvZiBhIHBvaW50ZXIuCisgICAgICB1bnNpZ25lZCBPcFNpemUgPSBPcFR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgICAgICBpZiAoREwuaXNMZWdhbEludGVnZXIoT3BTaXplKSAmJgorICAgICAgICAgIE9wU2l6ZSA8PSBETC5nZXRQb2ludGVyVHlwZVNpemVJbkJpdHMoVHkpKQorICAgICAgICByZXR1cm4gVFRJOjpUQ0NfRnJlZTsKKworICAgICAgLy8gT3RoZXJ3aXNlIGl0J3Mgbm90IGEgbm8tb3AuCisgICAgICByZXR1cm4gVFRJOjpUQ0NfQmFzaWM7CisgICAgfQorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlB0clRvSW50OiB7CisgICAgICAvLyBBIHB0cnRvaW50IGNhc3QgaXMgZnJlZSBzbyBsb25nIGFzIHRoZSByZXN1bHQgaXMgbGFyZ2UgZW5vdWdoIHRvIHN0b3JlCisgICAgICAvLyB0aGUgcG9pbnRlciwgYW5kIGEgbGVnYWwgaW50ZWdlciB0eXBlLgorICAgICAgdW5zaWduZWQgRGVzdFNpemUgPSBUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpOworICAgICAgaWYgKERMLmlzTGVnYWxJbnRlZ2VyKERlc3RTaXplKSAmJgorICAgICAgICAgIERlc3RTaXplID49IERMLmdldFBvaW50ZXJUeXBlU2l6ZUluQml0cyhPcFR5KSkKKyAgICAgICAgcmV0dXJuIFRUSTo6VENDX0ZyZWU7CisKKyAgICAgIC8vIE90aGVyd2lzZSBpdCdzIG5vdCBhIG5vLW9wLgorICAgICAgcmV0dXJuIFRUSTo6VENDX0Jhc2ljOworICAgIH0KKyAgICBjYXNlIEluc3RydWN0aW9uOjpUcnVuYzoKKyAgICAgIC8vIHRydW5jIHRvIGEgbmF0aXZlIHR5cGUgaXMgZnJlZSAoYXNzdW1pbmcgdGhlIHRhcmdldCBoYXMgY29tcGFyZSBhbmQKKyAgICAgIC8vIHNoaWZ0LXJpZ2h0IG9mIHRoZSBzYW1lIHdpZHRoKS4KKyAgICAgIGlmIChETC5pc0xlZ2FsSW50ZWdlcihETC5nZXRUeXBlU2l6ZUluQml0cyhUeSkpKQorICAgICAgICByZXR1cm4gVFRJOjpUQ0NfRnJlZTsKKworICAgICAgcmV0dXJuIFRUSTo6VENDX0Jhc2ljOworICAgIH0KKyAgfQorCisgIGludCBnZXRHRVBDb3N0KFR5cGUgKlBvaW50ZWVUeXBlLCBjb25zdCBWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBWYWx1ZSAqPiBPcGVyYW5kcykgeworICAgIC8vIEluIHRoZSBiYXNpYyBtb2RlbCwgd2UganVzdCBhc3N1bWUgdGhhdCBhbGwtY29uc3RhbnQgR0VQcyB3aWxsIGJlIGZvbGRlZAorICAgIC8vIGludG8gdGhlaXIgdXNlcyB2aWEgYWRkcmVzc2luZyBtb2Rlcy4KKyAgICBmb3IgKHVuc2lnbmVkIElkeCA9IDAsIFNpemUgPSBPcGVyYW5kcy5zaXplKCk7IElkeCAhPSBTaXplOyArK0lkeCkKKyAgICAgIGlmICghaXNhPENvbnN0YW50PihPcGVyYW5kc1tJZHhdKSkKKyAgICAgICAgcmV0dXJuIFRUSTo6VENDX0Jhc2ljOworCisgICAgcmV0dXJuIFRUSTo6VENDX0ZyZWU7CisgIH0KKworICB1bnNpZ25lZCBnZXRFc3RpbWF0ZWROdW1iZXJPZkNhc2VDbHVzdGVycyhjb25zdCBTd2l0Y2hJbnN0ICZTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkpUU2l6ZSkgeworICAgIEpUU2l6ZSA9IDA7CisgICAgcmV0dXJuIFNJLmdldE51bUNhc2VzKCk7CisgIH0KKworICBpbnQgZ2V0RXh0Q29zdChjb25zdCBJbnN0cnVjdGlvbiAqSSwgY29uc3QgVmFsdWUgKlNyYykgeworICAgIHJldHVybiBUVEk6OlRDQ19CYXNpYzsKKyAgfQorCisgIHVuc2lnbmVkIGdldENhbGxDb3N0KEZ1bmN0aW9uVHlwZSAqRlR5LCBpbnQgTnVtQXJncykgeworICAgIGFzc2VydChGVHkgJiYgIkZ1bmN0aW9uVHlwZSBtdXN0IGJlIHByb3ZpZGVkIHRvIHRoaXMgcm91dGluZS4iKTsKKworICAgIC8vIFRoZSB0YXJnZXQtaW5kZXBlbmRlbnQgaW1wbGVtZW50YXRpb24ganVzdCBtZWFzdXJlcyB0aGUgc2l6ZSBvZiB0aGUKKyAgICAvLyBmdW5jdGlvbiBieSBhcHByb3hpbWF0aW5nIHRoYXQgZWFjaCBhcmd1bWVudCB3aWxsIHRha2Ugb24gYXZlcmFnZSBvbmUKKyAgICAvLyBpbnN0cnVjdGlvbiB0byBwcmVwYXJlLgorCisgICAgaWYgKE51bUFyZ3MgPCAwKQorICAgICAgLy8gU2V0IHRoZSBhcmd1bWVudCBudW1iZXIgdG8gdGhlIG51bWJlciBvZiBleHBsaWNpdCBhcmd1bWVudHMgaW4gdGhlCisgICAgICAvLyBmdW5jdGlvbi4KKyAgICAgIE51bUFyZ3MgPSBGVHktPmdldE51bVBhcmFtcygpOworCisgICAgcmV0dXJuIFRUSTo6VENDX0Jhc2ljICogKE51bUFyZ3MgKyAxKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldElubGluaW5nVGhyZXNob2xkTXVsdGlwbGllcigpIHsgcmV0dXJuIDE7IH0KKworICB1bnNpZ25lZCBnZXRJbnRyaW5zaWNDb3N0KEludHJpbnNpYzo6SUQgSUlELCBUeXBlICpSZXRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUeXBlICo+IFBhcmFtVHlzKSB7CisgICAgc3dpdGNoIChJSUQpIHsKKyAgICBkZWZhdWx0OgorICAgICAgLy8gSW50cmluc2ljcyByYXJlbHkgKGlmIGV2ZXIpIGhhdmUgbm9ybWFsIGFyZ3VtZW50IHNldHVwIGNvbnN0cmFpbnRzLgorICAgICAgLy8gTW9kZWwgdGhlbSBhcyBoYXZpbmcgYSBiYXNpYyBpbnN0cnVjdGlvbiBjb3N0LgorICAgICAgLy8gRklYTUU6IFRoaXMgaXMgd3JvbmcgZm9yIGxpYmMgaW50cmluc2ljcy4KKyAgICAgIHJldHVybiBUVEk6OlRDQ19CYXNpYzsKKworICAgIGNhc2UgSW50cmluc2ljOjphbm5vdGF0aW9uOgorICAgIGNhc2UgSW50cmluc2ljOjphc3N1bWU6CisgICAgY2FzZSBJbnRyaW5zaWM6OnNpZGVlZmZlY3Q6CisgICAgY2FzZSBJbnRyaW5zaWM6OmRiZ19kZWNsYXJlOgorICAgIGNhc2UgSW50cmluc2ljOjpkYmdfdmFsdWU6CisgICAgY2FzZSBJbnRyaW5zaWM6OmludmFyaWFudF9zdGFydDoKKyAgICBjYXNlIEludHJpbnNpYzo6aW52YXJpYW50X2VuZDoKKyAgICBjYXNlIEludHJpbnNpYzo6bGlmZXRpbWVfc3RhcnQ6CisgICAgY2FzZSBJbnRyaW5zaWM6OmxpZmV0aW1lX2VuZDoKKyAgICBjYXNlIEludHJpbnNpYzo6b2JqZWN0c2l6ZToKKyAgICBjYXNlIEludHJpbnNpYzo6cHRyX2Fubm90YXRpb246CisgICAgY2FzZSBJbnRyaW5zaWM6OnZhcl9hbm5vdGF0aW9uOgorICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfZ2NfcmVzdWx0OgorICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfZ2NfcmVsb2NhdGU6CisgICAgY2FzZSBJbnRyaW5zaWM6OmNvcm9fYWxsb2M6CisgICAgY2FzZSBJbnRyaW5zaWM6OmNvcm9fYmVnaW46CisgICAgY2FzZSBJbnRyaW5zaWM6OmNvcm9fZnJlZToKKyAgICBjYXNlIEludHJpbnNpYzo6Y29yb19lbmQ6CisgICAgY2FzZSBJbnRyaW5zaWM6OmNvcm9fZnJhbWU6CisgICAgY2FzZSBJbnRyaW5zaWM6OmNvcm9fc2l6ZToKKyAgICBjYXNlIEludHJpbnNpYzo6Y29yb19zdXNwZW5kOgorICAgIGNhc2UgSW50cmluc2ljOjpjb3JvX3BhcmFtOgorICAgIGNhc2UgSW50cmluc2ljOjpjb3JvX3N1YmZuX2FkZHI6CisgICAgICAvLyBUaGVzZSBpbnRyaW5zaWNzIGRvbid0IGFjdHVhbGx5IHJlcHJlc2VudCBjb2RlIGFmdGVyIGxvd2VyaW5nLgorICAgICAgcmV0dXJuIFRUSTo6VENDX0ZyZWU7CisgICAgfQorICB9CisKKyAgYm9vbCBoYXNCcmFuY2hEaXZlcmdlbmNlKCkgeyByZXR1cm4gZmFsc2U7IH0KKworICBib29sIGlzU291cmNlT2ZEaXZlcmdlbmNlKGNvbnN0IFZhbHVlICpWKSB7IHJldHVybiBmYWxzZTsgfQorCisgIGJvb2wgaXNBbHdheXNVbmlmb3JtKGNvbnN0IFZhbHVlICpWKSB7IHJldHVybiBmYWxzZTsgfQorCisgIHVuc2lnbmVkIGdldEZsYXRBZGRyZXNzU3BhY2UgKCkgeworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGJvb2wgaXNMb3dlcmVkVG9DYWxsKGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgICAgYXNzZXJ0KEYgJiYgIkEgY29uY3JldGUgZnVuY3Rpb24gbXVzdCBiZSBwcm92aWRlZCB0byB0aGlzIHJvdXRpbmUuIik7CisKKyAgICAvLyBGSVhNRTogVGhlc2Ugc2hvdWxkIGFsbW9zdCBjZXJ0YWlubHkgbm90IGJlIGhhbmRsZWQgaGVyZSwgYW5kIGluc3RlYWQKKyAgICAvLyBoYW5kbGVkIHdpdGggdGhlIGhlbHAgb2YgVExJIG9yIHRoZSB0YXJnZXQgaXRzZWxmLiBUaGlzIHdhcyBsYXJnZWx5CisgICAgLy8gcG9ydGVkIGZyb20gZXhpc3RpbmcgYW5hbHlzaXMgaGV1cmlzdGljcyBoZXJlIHNvIHRoYXQgc3VjaCByZWZhY3RvcmluZ3MKKyAgICAvLyBjYW4gdGFrZSBwbGFjZSBpbiB0aGUgZnV0dXJlLgorCisgICAgaWYgKEYtPmlzSW50cmluc2ljKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoRi0+aGFzTG9jYWxMaW5rYWdlKCkgfHwgIUYtPmhhc05hbWUoKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgU3RyaW5nUmVmIE5hbWUgPSBGLT5nZXROYW1lKCk7CisKKyAgICAvLyBUaGVzZSB3aWxsIGFsbCBsaWtlbHkgbG93ZXIgdG8gYSBzaW5nbGUgc2VsZWN0aW9uIERBRyBub2RlLgorICAgIGlmIChOYW1lID09ICJjb3B5c2lnbiIgfHwgTmFtZSA9PSAiY29weXNpZ25mIiB8fCBOYW1lID09ICJjb3B5c2lnbmwiIHx8CisgICAgICAgIE5hbWUgPT0gImZhYnMiIHx8IE5hbWUgPT0gImZhYnNmIiB8fCBOYW1lID09ICJmYWJzbCIgfHwgTmFtZSA9PSAic2luIiB8fAorICAgICAgICBOYW1lID09ICJmbWluIiB8fCBOYW1lID09ICJmbWluZiIgfHwgTmFtZSA9PSAiZm1pbmwiIHx8CisgICAgICAgIE5hbWUgPT0gImZtYXgiIHx8IE5hbWUgPT0gImZtYXhmIiB8fCBOYW1lID09ICJmbWF4bCIgfHwKKyAgICAgICAgTmFtZSA9PSAic2luZiIgfHwgTmFtZSA9PSAic2lubCIgfHwgTmFtZSA9PSAiY29zIiB8fCBOYW1lID09ICJjb3NmIiB8fAorICAgICAgICBOYW1lID09ICJjb3NsIiB8fCBOYW1lID09ICJzcXJ0IiB8fCBOYW1lID09ICJzcXJ0ZiIgfHwgTmFtZSA9PSAic3FydGwiKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gVGhlc2UgYXJlIGFsbCBsaWtlbHkgdG8gYmUgb3B0aW1pemVkIGludG8gc29tZXRoaW5nIHNtYWxsZXIuCisgICAgaWYgKE5hbWUgPT0gInBvdyIgfHwgTmFtZSA9PSAicG93ZiIgfHwgTmFtZSA9PSAicG93bCIgfHwgTmFtZSA9PSAiZXhwMiIgfHwKKyAgICAgICAgTmFtZSA9PSAiZXhwMmwiIHx8IE5hbWUgPT0gImV4cDJmIiB8fCBOYW1lID09ICJmbG9vciIgfHwKKyAgICAgICAgTmFtZSA9PSAiZmxvb3JmIiB8fCBOYW1lID09ICJjZWlsIiB8fCBOYW1lID09ICJyb3VuZCIgfHwKKyAgICAgICAgTmFtZSA9PSAiZmZzIiB8fCBOYW1lID09ICJmZnNsIiB8fCBOYW1lID09ICJhYnMiIHx8IE5hbWUgPT0gImxhYnMiIHx8CisgICAgICAgIE5hbWUgPT0gImxsYWJzIikKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdm9pZCBnZXRVbnJvbGxpbmdQcmVmZXJlbmNlcyhMb29wICosIFNjYWxhckV2b2x1dGlvbiAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUSTo6VW5yb2xsaW5nUHJlZmVyZW5jZXMgJikge30KKworICBib29sIGlzTGVnYWxBZGRJbW1lZGlhdGUoaW50NjRfdCBJbW0pIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgYm9vbCBpc0xlZ2FsSUNtcEltbWVkaWF0ZShpbnQ2NF90IEltbSkgeyByZXR1cm4gZmFsc2U7IH0KKworICBib29sIGlzTGVnYWxBZGRyZXNzaW5nTW9kZShUeXBlICpUeSwgR2xvYmFsVmFsdWUgKkJhc2VHViwgaW50NjRfdCBCYXNlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc0Jhc2VSZWcsIGludDY0X3QgU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZSwgSW5zdHJ1Y3Rpb24gKkkgPSBudWxscHRyKSB7CisgICAgLy8gR3Vlc3MgdGhhdCBvbmx5IHJlZyBhbmQgcmVnK3JlZyBhZGRyZXNzaW5nIGlzIGFsbG93ZWQuIFRoaXMgaGV1cmlzdGljIGlzCisgICAgLy8gdGFrZW4gZnJvbSB0aGUgaW1wbGVtZW50YXRpb24gb2YgTFNSLgorICAgIHJldHVybiAhQmFzZUdWICYmIEJhc2VPZmZzZXQgPT0gMCAmJiAoU2NhbGUgPT0gMCB8fCBTY2FsZSA9PSAxKTsKKyAgfQorCisgIGJvb2wgaXNMU1JDb3N0TGVzcyhUVEk6OkxTUkNvc3QgJkMxLCBUVEk6OkxTUkNvc3QgJkMyKSB7CisgICAgcmV0dXJuIHN0ZDo6dGllKEMxLk51bVJlZ3MsIEMxLkFkZFJlY0Nvc3QsIEMxLk51bUlWTXVscywgQzEuTnVtQmFzZUFkZHMsCisgICAgICAgICAgICAgICAgICAgIEMxLlNjYWxlQ29zdCwgQzEuSW1tQ29zdCwgQzEuU2V0dXBDb3N0KSA8CisgICAgICAgICAgIHN0ZDo6dGllKEMyLk51bVJlZ3MsIEMyLkFkZFJlY0Nvc3QsIEMyLk51bUlWTXVscywgQzIuTnVtQmFzZUFkZHMsCisgICAgICAgICAgICAgICAgICAgIEMyLlNjYWxlQ29zdCwgQzIuSW1tQ29zdCwgQzIuU2V0dXBDb3N0KTsKKyAgfQorCisgIGJvb2wgY2FuTWFjcm9GdXNlQ21wKCkgeyByZXR1cm4gZmFsc2U7IH0KKworICBib29sIHNob3VsZEZhdm9yUG9zdEluYygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgYm9vbCBpc0xlZ2FsTWFza2VkU3RvcmUoVHlwZSAqRGF0YVR5cGUpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgYm9vbCBpc0xlZ2FsTWFza2VkTG9hZChUeXBlICpEYXRhVHlwZSkgeyByZXR1cm4gZmFsc2U7IH0KKworICBib29sIGlzTGVnYWxNYXNrZWRTY2F0dGVyKFR5cGUgKkRhdGFUeXBlKSB7IHJldHVybiBmYWxzZTsgfQorCisgIGJvb2wgaXNMZWdhbE1hc2tlZEdhdGhlcihUeXBlICpEYXRhVHlwZSkgeyByZXR1cm4gZmFsc2U7IH0KKworICBib29sIGhhc0RpdlJlbU9wKFR5cGUgKkRhdGFUeXBlLCBib29sIElzU2lnbmVkKSB7IHJldHVybiBmYWxzZTsgfQorCisgIGJvb2wgaGFzVm9sYXRpbGVWYXJpYW50KEluc3RydWN0aW9uICpJLCB1bnNpZ25lZCBBZGRyU3BhY2UpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgYm9vbCBwcmVmZXJzVmVjdG9yaXplZEFkZHJlc3NpbmcoKSB7IHJldHVybiB0cnVlOyB9CisKKyAgaW50IGdldFNjYWxpbmdGYWN0b3JDb3N0KFR5cGUgKlR5LCBHbG9iYWxWYWx1ZSAqQmFzZUdWLCBpbnQ2NF90IEJhc2VPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc0Jhc2VSZWcsIGludDY0X3QgU2NhbGUsIHVuc2lnbmVkIEFkZHJTcGFjZSkgeworICAgIC8vIEd1ZXNzIHRoYXQgYWxsIGxlZ2FsIGFkZHJlc3NpbmcgbW9kZSBhcmUgZnJlZS4KKyAgICBpZiAoaXNMZWdhbEFkZHJlc3NpbmdNb2RlKFR5LCBCYXNlR1YsIEJhc2VPZmZzZXQsIEhhc0Jhc2VSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsZSwgQWRkclNwYWNlKSkKKyAgICAgIHJldHVybiAwOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIGJvb2wgTFNSV2l0aEluc3RyUXVlcmllcygpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgYm9vbCBpc1RydW5jYXRlRnJlZShUeXBlICpUeTEsIFR5cGUgKlR5MikgeyByZXR1cm4gZmFsc2U7IH0KKworICBib29sIGlzUHJvZml0YWJsZVRvSG9pc3QoSW5zdHJ1Y3Rpb24gKkkpIHsgcmV0dXJuIHRydWU7IH0KKworICBib29sIHVzZUFBKCkgeyByZXR1cm4gZmFsc2U7IH0KKworICBib29sIGlzVHlwZUxlZ2FsKFR5cGUgKlR5KSB7IHJldHVybiBmYWxzZTsgfQorCisgIHVuc2lnbmVkIGdldEp1bXBCdWZBbGlnbm1lbnQoKSB7IHJldHVybiAwOyB9CisKKyAgdW5zaWduZWQgZ2V0SnVtcEJ1ZlNpemUoKSB7IHJldHVybiAwOyB9CisKKyAgYm9vbCBzaG91bGRCdWlsZExvb2t1cFRhYmxlcygpIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCBzaG91bGRCdWlsZExvb2t1cFRhYmxlc0ZvckNvbnN0YW50KENvbnN0YW50ICpDKSB7IHJldHVybiB0cnVlOyB9CisKKyAgYm9vbCB1c2VDb2xkQ0NGb3JDb2xkQ2FsbChGdW5jdGlvbiAmRikgeyByZXR1cm4gZmFsc2U7IH0KKworICB1bnNpZ25lZCBnZXRTY2FsYXJpemF0aW9uT3ZlcmhlYWQoVHlwZSAqVHksIGJvb2wgSW5zZXJ0LCBib29sIEV4dHJhY3QpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHVuc2lnbmVkIGdldE9wZXJhbmRzU2NhbGFyaXphdGlvbk92ZXJoZWFkKEFycmF5UmVmPGNvbnN0IFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZGKSB7IHJldHVybiAwOyB9CisKKyAgYm9vbCBzdXBwb3J0c0VmZmljaWVudFZlY3RvckVsZW1lbnRMb2FkU3RvcmUoKSB7IHJldHVybiBmYWxzZTsgfQorCisgIGJvb2wgZW5hYmxlQWdncmVzc2l2ZUludGVybGVhdmluZyhib29sIExvb3BIYXNSZWR1Y3Rpb25zKSB7IHJldHVybiBmYWxzZTsgfQorCisgIGNvbnN0IFRUSTo6TWVtQ21wRXhwYW5zaW9uT3B0aW9ucyAqZW5hYmxlTWVtQ21wRXhwYW5zaW9uKAorICAgICAgYm9vbCBJc1plcm9DbXApIGNvbnN0IHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGJvb2wgZW5hYmxlSW50ZXJsZWF2ZWRBY2Nlc3NWZWN0b3JpemF0aW9uKCkgeyByZXR1cm4gZmFsc2U7IH0KKworICBib29sIGlzRlBWZWN0b3JpemF0aW9uUG90ZW50aWFsbHlVbnNhZmUoKSB7IHJldHVybiBmYWxzZTsgfQorCisgIGJvb2wgYWxsb3dzTWlzYWxpZ25lZE1lbW9yeUFjY2Vzc2VzKExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCaXRXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkcmVzc1NwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKkZhc3QpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgVFRJOjpQb3BjbnRTdXBwb3J0S2luZCBnZXRQb3BjbnRTdXBwb3J0KHVuc2lnbmVkIEludFR5V2lkdGhJbkJpdCkgeworICAgIHJldHVybiBUVEk6OlBTS19Tb2Z0d2FyZTsKKyAgfQorCisgIGJvb2wgaGF2ZUZhc3RTcXJ0KFR5cGUgKlR5KSB7IHJldHVybiBmYWxzZTsgfQorCisgIGJvb2wgaXNGQ21wT3JkQ2hlYXBlclRoYW5GQ21wWmVybyhUeXBlICpUeSkgeyByZXR1cm4gdHJ1ZTsgfQorICAKKyAgdW5zaWduZWQgZ2V0RlBPcENvc3QoVHlwZSAqVHkpIHsgcmV0dXJuIFRhcmdldFRyYW5zZm9ybUluZm86OlRDQ19CYXNpYzsgfQorCisgIGludCBnZXRJbnRJbW1Db2RlU2l6ZUNvc3QodW5zaWduZWQgT3Bjb2RlLCB1bnNpZ25lZCBJZHgsIGNvbnN0IEFQSW50ICZJbW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqVHkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHVuc2lnbmVkIGdldEludEltbUNvc3QoY29uc3QgQVBJbnQgJkltbSwgVHlwZSAqVHkpIHsgcmV0dXJuIFRUSTo6VENDX0Jhc2ljOyB9CisKKyAgdW5zaWduZWQgZ2V0SW50SW1tQ29zdCh1bnNpZ25lZCBPcGNvZGUsIHVuc2lnbmVkIElkeCwgY29uc3QgQVBJbnQgJkltbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpUeSkgeworICAgIHJldHVybiBUVEk6OlRDQ19GcmVlOworICB9CisKKyAgdW5zaWduZWQgZ2V0SW50SW1tQ29zdChJbnRyaW5zaWM6OklEIElJRCwgdW5zaWduZWQgSWR4LCBjb25zdCBBUEludCAmSW1tLAorICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKlR5KSB7CisgICAgcmV0dXJuIFRUSTo6VENDX0ZyZWU7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1iZXJPZlJlZ2lzdGVycyhib29sIFZlY3RvcikgeyByZXR1cm4gODsgfQorCisgIHVuc2lnbmVkIGdldFJlZ2lzdGVyQml0V2lkdGgoYm9vbCBWZWN0b3IpIGNvbnN0IHsgcmV0dXJuIDMyOyB9CisKKyAgdW5zaWduZWQgZ2V0TWluVmVjdG9yUmVnaXN0ZXJCaXRXaWR0aCgpIHsgcmV0dXJuIDEyODsgfQorCisgIGJvb2wgc2hvdWxkTWF4aW1pemVWZWN0b3JCYW5kd2lkdGgoYm9vbCBPcHRTaXplKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIGJvb2wKKyAgc2hvdWxkQ29uc2lkZXJBZGRyZXNzVHlwZVByb21vdGlvbihjb25zdCBJbnN0cnVjdGlvbiAmSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICZBbGxvd1Byb21vdGlvbldpdGhvdXRDb21tb25IZWFkZXIpIHsKKyAgICBBbGxvd1Byb21vdGlvbldpdGhvdXRDb21tb25IZWFkZXIgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB1bnNpZ25lZCBnZXRDYWNoZUxpbmVTaXplKCkgeyByZXR1cm4gMDsgfQorCisgIGxsdm06Ok9wdGlvbmFsPHVuc2lnbmVkPiBnZXRDYWNoZVNpemUoVGFyZ2V0VHJhbnNmb3JtSW5mbzo6Q2FjaGVMZXZlbCBMZXZlbCkgeworICAgIHN3aXRjaCAoTGV2ZWwpIHsKKyAgICBjYXNlIFRhcmdldFRyYW5zZm9ybUluZm86OkNhY2hlTGV2ZWw6OkwxRDoKKyAgICAgIExMVk1fRkFMTFRIUk9VR0g7CisgICAgY2FzZSBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpDYWNoZUxldmVsOjpMMkQ6CisgICAgICByZXR1cm4gbGx2bTo6T3B0aW9uYWw8dW5zaWduZWQ+KCk7CisgICAgfQorCisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpDYWNoZUxldmVsIik7CisgIH0KKworICBsbHZtOjpPcHRpb25hbDx1bnNpZ25lZD4gZ2V0Q2FjaGVBc3NvY2lhdGl2aXR5KAorICAgIFRhcmdldFRyYW5zZm9ybUluZm86OkNhY2hlTGV2ZWwgTGV2ZWwpIHsKKyAgICBzd2l0Y2ggKExldmVsKSB7CisgICAgY2FzZSBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpDYWNoZUxldmVsOjpMMUQ6CisgICAgICBMTFZNX0ZBTExUSFJPVUdIOworICAgIGNhc2UgVGFyZ2V0VHJhbnNmb3JtSW5mbzo6Q2FjaGVMZXZlbDo6TDJEOgorICAgICAgcmV0dXJuIGxsdm06Ok9wdGlvbmFsPHVuc2lnbmVkPigpOworICAgIH0KKworICAgIGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gVGFyZ2V0VHJhbnNmb3JtSW5mbzo6Q2FjaGVMZXZlbCIpOworICB9CisKKyAgdW5zaWduZWQgZ2V0UHJlZmV0Y2hEaXN0YW5jZSgpIHsgcmV0dXJuIDA7IH0KKworICB1bnNpZ25lZCBnZXRNaW5QcmVmZXRjaFN0cmlkZSgpIHsgcmV0dXJuIDE7IH0KKworICB1bnNpZ25lZCBnZXRNYXhQcmVmZXRjaEl0ZXJhdGlvbnNBaGVhZCgpIHsgcmV0dXJuIFVJTlRfTUFYOyB9CisKKyAgdW5zaWduZWQgZ2V0TWF4SW50ZXJsZWF2ZUZhY3Rvcih1bnNpZ25lZCBWRikgeyByZXR1cm4gMTsgfQorCisgIHVuc2lnbmVkIGdldEFyaXRobWV0aWNJbnN0ckNvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUVEk6Ok9wZXJhbmRWYWx1ZUtpbmQgT3BkMUluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRJOjpPcGVyYW5kVmFsdWVLaW5kIE9wZDJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUSTo6T3BlcmFuZFZhbHVlUHJvcGVydGllcyBPcGQxUHJvcEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRJOjpPcGVyYW5kVmFsdWVQcm9wZXJ0aWVzIE9wZDJQcm9wSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBWYWx1ZSAqPiBBcmdzKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICB1bnNpZ25lZCBnZXRTaHVmZmxlQ29zdChUVEk6OlNodWZmbGVLaW5kIEtpbmQsIFR5cGUgKlR5LCBpbnQgSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKlN1YlRwKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICB1bnNpZ25lZCBnZXRDYXN0SW5zdHJDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqRHN0LCBUeXBlICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsgcmV0dXJuIDE7IH0KKworICB1bnNpZ25lZCBnZXRFeHRyYWN0V2l0aEV4dGVuZENvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JUeXBlICpWZWNUeSwgdW5zaWduZWQgSW5kZXgpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHVuc2lnbmVkIGdldENGSW5zdHJDb3N0KHVuc2lnbmVkIE9wY29kZSkgeyByZXR1cm4gMTsgfQorCisgIHVuc2lnbmVkIGdldENtcFNlbEluc3RyQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlZhbFR5LCBUeXBlICpDb25kVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiAxOworICB9CisKKyAgdW5zaWduZWQgZ2V0VmVjdG9ySW5zdHJDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVmFsLCB1bnNpZ25lZCBJbmRleCkgeworICAgIHJldHVybiAxOworICB9CisKKyAgdW5zaWduZWQgZ2V0TWVtb3J5T3BDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqU3JjLCB1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyZXNzU3BhY2UsIGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICB1bnNpZ25lZCBnZXRNYXNrZWRNZW1vcnlPcENvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpTcmMsIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSkgeworICAgIHJldHVybiAxOworICB9CisKKyAgdW5zaWduZWQgZ2V0R2F0aGVyU2NhdHRlck9wQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKkRhdGFUeSwgVmFsdWUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFZhcmlhYmxlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQpIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHVuc2lnbmVkIGdldEludGVybGVhdmVkTWVtb3J5T3BDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVmVjVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZhY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkcmVzc1NwYWNlKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICB1bnNpZ25lZCBnZXRJbnRyaW5zaWNJbnN0ckNvc3QoSW50cmluc2ljOjpJRCBJRCwgVHlwZSAqUmV0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUeXBlICo+IFR5cywgRmFzdE1hdGhGbGFncyBGTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTY2FsYXJpemF0aW9uQ29zdFBhc3NlZCkgeworICAgIHJldHVybiAxOworICB9CisgIHVuc2lnbmVkIGdldEludHJpbnNpY0luc3RyQ29zdChJbnRyaW5zaWM6OklEIElELCBUeXBlICpSZXRUeSwKKyAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsIEZhc3RNYXRoRmxhZ3MgRk1GLCB1bnNpZ25lZCBWRikgeworICAgIHJldHVybiAxOworICB9CisKKyAgdW5zaWduZWQgZ2V0Q2FsbEluc3RyQ29zdChGdW5jdGlvbiAqRiwgVHlwZSAqUmV0VHksIEFycmF5UmVmPFR5cGUgKj4gVHlzKSB7CisgICAgcmV0dXJuIDE7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1iZXJPZlBhcnRzKFR5cGUgKlRwKSB7IHJldHVybiAwOyB9CisKKyAgdW5zaWduZWQgZ2V0QWRkcmVzc0NvbXB1dGF0aW9uQ29zdChUeXBlICpUcCwgU2NhbGFyRXZvbHV0aW9uICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB1bnNpZ25lZCBnZXRBcml0aG1ldGljUmVkdWN0aW9uQ29zdCh1bnNpZ25lZCwgVHlwZSAqLCBib29sKSB7IHJldHVybiAxOyB9CisKKyAgdW5zaWduZWQgZ2V0TWluTWF4UmVkdWN0aW9uQ29zdChUeXBlICosIFR5cGUgKiwgYm9vbCwgYm9vbCkgeyByZXR1cm4gMTsgfQorCisgIHVuc2lnbmVkIGdldENvc3RPZktlZXBpbmdMaXZlT3ZlckNhbGwoQXJyYXlSZWY8VHlwZSAqPiBUeXMpIHsgcmV0dXJuIDA7IH0KKworICBib29sIGdldFRndE1lbUludHJpbnNpYyhJbnRyaW5zaWNJbnN0ICpJbnN0LCBNZW1JbnRyaW5zaWNJbmZvICZJbmZvKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdW5zaWduZWQgZ2V0QXRvbWljTWVtSW50cmluc2ljTWF4RWxlbWVudFNpemUoKSBjb25zdCB7CisgICAgLy8gTm90ZSBmb3Igb3ZlcnJpZGVzOiBZb3UgbXVzdCBlbnN1cmUgZm9yIGFsbCBlbGVtZW50IHVub3JkZXJlZC1hdG9taWMKKyAgICAvLyBtZW1vcnkgaW50cmluc2ljcyB0aGF0IGFsbCBwb3dlci1vZi0yIGVsZW1lbnQgc2l6ZXMgdXAgdG8sIGFuZAorICAgIC8vIGluY2x1ZGluZywgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGlzIG1ldGhvZCBoYXZlIGEgY29ycmVzcG9uZGluZworICAgIC8vIHJ1bnRpbWUgbGliIGNhbGwuIFRoZXNlIHJ1bnRpbWUgbGliIGNhbGwgZGVmaW5pdGlvbnMgY2FuIGJlIGZvdW5kCisgICAgLy8gaW4gUnVudGltZUxpYmNhbGxzLmgKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIFZhbHVlICpnZXRPckNyZWF0ZVJlc3VsdEZyb21NZW1JbnRyaW5zaWMoSW50cmluc2ljSW5zdCAqSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpFeHBlY3RlZFR5cGUpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIFR5cGUgKmdldE1lbWNweUxvb3BMb3dlcmluZ1R5cGUoTExWTUNvbnRleHQgJkNvbnRleHQsIFZhbHVlICpMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjQWxpZ24sIHVuc2lnbmVkIERlc3RBbGlnbikgY29uc3QgeworICAgIHJldHVybiBUeXBlOjpnZXRJbnQ4VHkoQ29udGV4dCk7CisgIH0KKworICB2b2lkIGdldE1lbWNweUxvb3BSZXNpZHVhbExvd2VyaW5nVHlwZShTbWFsbFZlY3RvckltcGw8VHlwZSAqPiAmT3BzT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVtYWluaW5nQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY0FsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0QWxpZ24pIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IFJlbWFpbmluZ0J5dGVzOyArK2kpCisgICAgICBPcHNPdXQucHVzaF9iYWNrKFR5cGU6OmdldEludDhUeShDb250ZXh0KSk7CisgIH0KKworICBib29sIGFyZUlubGluZUNvbXBhdGlibGUoY29uc3QgRnVuY3Rpb24gKkNhbGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uICpDYWxsZWUpIGNvbnN0IHsKKyAgICByZXR1cm4gKENhbGxlci0+Z2V0Rm5BdHRyaWJ1dGUoInRhcmdldC1jcHUiKSA9PQorICAgICAgICAgICAgQ2FsbGVlLT5nZXRGbkF0dHJpYnV0ZSgidGFyZ2V0LWNwdSIpKSAmJgorICAgICAgICAgICAoQ2FsbGVyLT5nZXRGbkF0dHJpYnV0ZSgidGFyZ2V0LWZlYXR1cmVzIikgPT0KKyAgICAgICAgICAgIENhbGxlZS0+Z2V0Rm5BdHRyaWJ1dGUoInRhcmdldC1mZWF0dXJlcyIpKTsKKyAgfQorCisgIGJvb2wgaXNJbmRleGVkTG9hZExlZ2FsKFRUSTo6TWVtSW5kZXhlZE1vZGUgTW9kZSwgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBpc0luZGV4ZWRTdG9yZUxlZ2FsKFRUSTo6TWVtSW5kZXhlZE1vZGUgTW9kZSwgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHVuc2lnbmVkIGdldExvYWRTdG9yZVZlY1JlZ0JpdFdpZHRoKHVuc2lnbmVkIEFkZHJTcGFjZSkgY29uc3QgeyByZXR1cm4gMTI4OyB9CisKKyAgYm9vbCBpc0xlZ2FsVG9WZWN0b3JpemVMb2FkKExvYWRJbnN0ICpMSSkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIGJvb2wgaXNMZWdhbFRvVmVjdG9yaXplU3RvcmUoU3RvcmVJbnN0ICpTSSkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIGJvb2wgaXNMZWdhbFRvVmVjdG9yaXplTG9hZENoYWluKHVuc2lnbmVkIENoYWluU2l6ZUluQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkclNwYWNlKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIGlzTGVnYWxUb1ZlY3Rvcml6ZVN0b3JlQ2hhaW4odW5zaWduZWQgQ2hhaW5TaXplSW5CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJTcGFjZSkgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdW5zaWduZWQgZ2V0TG9hZFZlY3RvckZhY3Rvcih1bnNpZ25lZCBWRiwgdW5zaWduZWQgTG9hZFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ2hhaW5TaXplSW5CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZWN0b3JUeXBlICpWZWNUeSkgY29uc3QgeworICAgIHJldHVybiBWRjsKKyAgfQorCisgIHVuc2lnbmVkIGdldFN0b3JlVmVjdG9yRmFjdG9yKHVuc2lnbmVkIFZGLCB1bnNpZ25lZCBTdG9yZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENoYWluU2l6ZUluQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlY3RvclR5cGUgKlZlY1R5KSBjb25zdCB7CisgICAgcmV0dXJuIFZGOworICB9CisKKyAgYm9vbCB1c2VSZWR1Y3Rpb25JbnRyaW5zaWModW5zaWduZWQgT3Bjb2RlLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFRJOjpSZWR1Y3Rpb25GbGFncyBGbGFncykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgc2hvdWxkRXhwYW5kUmVkdWN0aW9uKGNvbnN0IEludHJpbnNpY0luc3QgKklJKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworcHJvdGVjdGVkOgorICAvLyBPYnRhaW4gdGhlIG1pbmltdW0gcmVxdWlyZWQgc2l6ZSB0byBob2xkIHRoZSB2YWx1ZSAod2l0aG91dCB0aGUgc2lnbikKKyAgLy8gSW4gY2FzZSBvZiBhIHZlY3RvciBpdCByZXR1cm5zIHRoZSBtaW4gcmVxdWlyZWQgc2l6ZSBmb3Igb25lIGVsZW1lbnQuCisgIHVuc2lnbmVkIG1pblJlcXVpcmVkRWxlbWVudFNpemUoY29uc3QgVmFsdWUqIFZhbCwgYm9vbCAmaXNTaWduZWQpIHsKKyAgICBpZiAoaXNhPENvbnN0YW50RGF0YVZlY3Rvcj4oVmFsKSB8fCBpc2E8Q29uc3RhbnRWZWN0b3I+KFZhbCkpIHsKKyAgICAgIGNvbnN0IGF1dG8qIFZlY3RvclZhbHVlID0gY2FzdDxDb25zdGFudD4oVmFsKTsKKworICAgICAgLy8gSW4gY2FzZSBvZiBhIHZlY3RvciBuZWVkIHRvIHBpY2sgdGhlIG1heCBiZXR3ZWVuIHRoZSBtaW4KKyAgICAgIC8vIHJlcXVpcmVkIHNpemUgZm9yIGVhY2ggZWxlbWVudAorICAgICAgYXV0byAqVlQgPSBjYXN0PFZlY3RvclR5cGU+KFZhbC0+Z2V0VHlwZSgpKTsKKworICAgICAgLy8gQXNzdW1lIHVuc2lnbmVkIGVsZW1lbnRzCisgICAgICBpc1NpZ25lZCA9IGZhbHNlOworCisgICAgICAvLyBUaGUgbWF4IHJlcXVpcmVkIHNpemUgaXMgdGhlIHRvdGFsIHZlY3RvciB3aWR0aCBkaXZpZGVkIGJ5IG51bQorICAgICAgLy8gb2YgZWxlbWVudHMgaW4gdGhlIHZlY3RvcgorICAgICAgdW5zaWduZWQgTWF4UmVxdWlyZWRTaXplID0gVlQtPmdldEJpdFdpZHRoKCkgLyBWVC0+Z2V0TnVtRWxlbWVudHMoKTsKKworICAgICAgdW5zaWduZWQgTWluUmVxdWlyZWRTaXplID0gMDsKKyAgICAgIGZvcih1bnNpZ25lZCBpID0gMCwgZSA9IFZULT5nZXROdW1FbGVtZW50cygpOyBpIDwgZTsgKytpKSB7CisgICAgICAgIGlmIChhdXRvKiBJbnRFbGVtZW50ID0KKyAgICAgICAgICAgICAgZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFZlY3RvclZhbHVlLT5nZXRBZ2dyZWdhdGVFbGVtZW50KGkpKSkgeworICAgICAgICAgIGJvb2wgc2lnbmVkRWxlbWVudCA9IEludEVsZW1lbnQtPmdldFZhbHVlKCkuaXNOZWdhdGl2ZSgpOworICAgICAgICAgIC8vIEdldCB0aGUgZWxlbWVudCBtaW4gcmVxdWlyZWQgc2l6ZS4KKyAgICAgICAgICB1bnNpZ25lZCBFbGVtZW50TWluUmVxdWlyZWRTaXplID0KKyAgICAgICAgICAgIEludEVsZW1lbnQtPmdldFZhbHVlKCkuZ2V0TWluU2lnbmVkQml0cygpIC0gMTsKKyAgICAgICAgICAvLyBJbiBjYXNlIG9uZSBlbGVtZW50IGlzIHNpZ25lZCB0aGVuIGFsbCB0aGUgdmVjdG9yIGlzIHNpZ25lZC4KKyAgICAgICAgICBpc1NpZ25lZCB8PSBzaWduZWRFbGVtZW50OworICAgICAgICAgIC8vIFNhdmUgdGhlIG1heCByZXF1aXJlZCBiaXQgc2l6ZSBiZXR3ZWVuIGFsbCB0aGUgZWxlbWVudHMuCisgICAgICAgICAgTWluUmVxdWlyZWRTaXplID0gc3RkOjptYXgoTWluUmVxdWlyZWRTaXplLCBFbGVtZW50TWluUmVxdWlyZWRTaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAvLyBub3QgYW4gaW50IGNvbnN0YW50IGVsZW1lbnQKKyAgICAgICAgICByZXR1cm4gTWF4UmVxdWlyZWRTaXplOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gTWluUmVxdWlyZWRTaXplOworICAgIH0KKworICAgIGlmIChjb25zdCBhdXRvKiBDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihWYWwpKSB7CisgICAgICBpc1NpZ25lZCA9IENJLT5nZXRWYWx1ZSgpLmlzTmVnYXRpdmUoKTsKKyAgICAgIHJldHVybiBDSS0+Z2V0VmFsdWUoKS5nZXRNaW5TaWduZWRCaXRzKCkgLSAxOworICAgIH0KKworICAgIGlmIChjb25zdCBhdXRvKiBDYXN0ID0gZHluX2Nhc3Q8U0V4dEluc3Q+KFZhbCkpIHsKKyAgICAgIGlzU2lnbmVkID0gdHJ1ZTsKKyAgICAgIHJldHVybiBDYXN0LT5nZXRTcmNUeSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCkgLSAxOworICAgIH0KKworICAgIGlmIChjb25zdCBhdXRvKiBDYXN0ID0gZHluX2Nhc3Q8WkV4dEluc3Q+KFZhbCkpIHsKKyAgICAgIGlzU2lnbmVkID0gZmFsc2U7CisgICAgICByZXR1cm4gQ2FzdC0+Z2V0U3JjVHkoKS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpOworICAgIH0KKworICAgIGlzU2lnbmVkID0gZmFsc2U7CisgICAgcmV0dXJuIFZhbC0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgIH0KKworICBib29sIGlzU3RyaWRlZEFjY2Vzcyhjb25zdCBTQ0VWICpQdHIpIHsKKyAgICByZXR1cm4gUHRyICYmIGlzYTxTQ0VWQWRkUmVjRXhwcj4oUHRyKTsKKyAgfQorCisgIGNvbnN0IFNDRVZDb25zdGFudCAqZ2V0Q29uc3RhbnRTdHJpZGVTdGVwKFNjYWxhckV2b2x1dGlvbiAqU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNDRVYgKlB0cikgeworICAgIGlmICghaXNTdHJpZGVkQWNjZXNzKFB0cikpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICBjb25zdCBTQ0VWQWRkUmVjRXhwciAqQWRkUmVjID0gY2FzdDxTQ0VWQWRkUmVjRXhwcj4oUHRyKTsKKyAgICByZXR1cm4gZHluX2Nhc3Q8U0NFVkNvbnN0YW50PihBZGRSZWMtPmdldFN0ZXBSZWN1cnJlbmNlKCpTRSkpOworICB9CisKKyAgYm9vbCBpc0NvbnN0YW50U3RyaWRlZEFjY2Vzc0xlc3NUaGFuKFNjYWxhckV2b2x1dGlvbiAqU0UsIGNvbnN0IFNDRVYgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgTWVyZ2VEaXN0YW5jZSkgeworICAgIGNvbnN0IFNDRVZDb25zdGFudCAqU3RlcCA9IGdldENvbnN0YW50U3RyaWRlU3RlcChTRSwgUHRyKTsKKyAgICBpZiAoIVN0ZXApCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgQVBJbnQgU3RyaWRlVmFsID0gU3RlcC0+Z2V0QVBJbnQoKTsKKyAgICBpZiAoU3RyaWRlVmFsLmdldEJpdFdpZHRoKCkgPiA2NCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBGSVhNRTogTmVlZCB0byB0YWtlIGFic29sdXRlIHZhbHVlIGZvciBuZWdhdGl2ZSBzdHJpZGUgY2FzZS4KKyAgICByZXR1cm4gU3RyaWRlVmFsLmdldFNFeHRWYWx1ZSgpIDwgTWVyZ2VEaXN0YW5jZTsKKyAgfQorfTsKKworLy8vIFxicmllZiBDUlRQIGJhc2UgY2xhc3MgZm9yIHVzZSBhcyBhIG1peC1pbiB0aGF0IGFpZHMgaW1wbGVtZW50aW5nCisvLy8gYSBUYXJnZXRUcmFuc2Zvcm1JbmZvLWNvbXBhdGlibGUgY2xhc3MuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFRhcmdldFRyYW5zZm9ybUluZm9JbXBsQ1JUUEJhc2UgOiBwdWJsaWMgVGFyZ2V0VHJhbnNmb3JtSW5mb0ltcGxCYXNlIHsKK3ByaXZhdGU6CisgIHR5cGVkZWYgVGFyZ2V0VHJhbnNmb3JtSW5mb0ltcGxCYXNlIEJhc2VUOworCitwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IFRhcmdldFRyYW5zZm9ybUluZm9JbXBsQ1JUUEJhc2UoY29uc3QgRGF0YUxheW91dCAmREwpIDogQmFzZVQoREwpIHt9CisKK3B1YmxpYzoKKyAgdXNpbmcgQmFzZVQ6OmdldENhbGxDb3N0OworCisgIHVuc2lnbmVkIGdldENhbGxDb3N0KGNvbnN0IEZ1bmN0aW9uICpGLCBpbnQgTnVtQXJncykgeworICAgIGFzc2VydChGICYmICJBIGNvbmNyZXRlIGZ1bmN0aW9uIG11c3QgYmUgcHJvdmlkZWQgdG8gdGhpcyByb3V0aW5lLiIpOworCisgICAgaWYgKE51bUFyZ3MgPCAwKQorICAgICAgLy8gU2V0IHRoZSBhcmd1bWVudCBudW1iZXIgdG8gdGhlIG51bWJlciBvZiBleHBsaWNpdCBhcmd1bWVudHMgaW4gdGhlCisgICAgICAvLyBmdW5jdGlvbi4KKyAgICAgIE51bUFyZ3MgPSBGLT5hcmdfc2l6ZSgpOworCisgICAgaWYgKEludHJpbnNpYzo6SUQgSUlEID0gRi0+Z2V0SW50cmluc2ljSUQoKSkgeworICAgICAgRnVuY3Rpb25UeXBlICpGVHkgPSBGLT5nZXRGdW5jdGlvblR5cGUoKTsKKyAgICAgIFNtYWxsVmVjdG9yPFR5cGUgKiwgOD4gUGFyYW1UeXMoRlR5LT5wYXJhbV9iZWdpbigpLCBGVHktPnBhcmFtX2VuZCgpKTsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KHRoaXMpCisgICAgICAgICAgLT5nZXRJbnRyaW5zaWNDb3N0KElJRCwgRlR5LT5nZXRSZXR1cm5UeXBlKCksIFBhcmFtVHlzKTsKKyAgICB9CisKKyAgICBpZiAoIXN0YXRpY19jYXN0PFQgKj4odGhpcyktPmlzTG93ZXJlZFRvQ2FsbChGKSkKKyAgICAgIHJldHVybiBUVEk6OlRDQ19CYXNpYzsgLy8gR2l2ZSBhIGJhc2ljIGNvc3QgaWYgaXQgd2lsbCBiZSBsb3dlcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRpcmVjdGx5LgorCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmdldENhbGxDb3N0KEYtPmdldEZ1bmN0aW9uVHlwZSgpLCBOdW1BcmdzKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldENhbGxDb3N0KGNvbnN0IEZ1bmN0aW9uICpGLCBBcnJheVJlZjxjb25zdCBWYWx1ZSAqPiBBcmd1bWVudHMpIHsKKyAgICAvLyBTaW1wbHkgZGVsZWdhdGUgdG8gZ2VuZXJpYyBoYW5kbGluZyBvZiB0aGUgY2FsbC4KKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHVzZSBpbnN0c2ltcGxpZnkgb3Igc29tZXRoaW5nIGVsc2UgdG8gY2F0Y2ggY2FsbHMgd2hpY2gKKyAgICAvLyB3aWxsIGNvbnN0YW50IGZvbGQgd2l0aCB0aGVzZSBhcmd1bWVudHMuCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmdldENhbGxDb3N0KEYsIEFyZ3VtZW50cy5zaXplKCkpOworICB9CisKKyAgdXNpbmcgQmFzZVQ6OmdldEdFUENvc3Q7CisKKyAgaW50IGdldEdFUENvc3QoVHlwZSAqUG9pbnRlZVR5cGUsIGNvbnN0IFZhbHVlICpQdHIsCisgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IFZhbHVlICo+IE9wZXJhbmRzKSB7CisgICAgY29uc3QgR2xvYmFsVmFsdWUgKkJhc2VHViA9IG51bGxwdHI7CisgICAgaWYgKFB0ciAhPSBudWxscHRyKSB7CisgICAgICAvLyBUT0RPOiB3aWxsIHJlbW92ZSB0aGlzIHdoZW4gcG9pbnRlcnMgaGF2ZSBhbiBvcGFxdWUgdHlwZS4KKyAgICAgIGFzc2VydChQdHItPmdldFR5cGUoKS0+Z2V0U2NhbGFyVHlwZSgpLT5nZXRQb2ludGVyRWxlbWVudFR5cGUoKSA9PQorICAgICAgICAgICAgICAgICBQb2ludGVlVHlwZSAmJgorICAgICAgICAgICAgICJleHBsaWNpdCBwb2ludGVlIHR5cGUgZG9lc24ndCBtYXRjaCBvcGVyYW5kJ3MgcG9pbnRlZSB0eXBlIik7CisgICAgICBCYXNlR1YgPSBkeW5fY2FzdDxHbG9iYWxWYWx1ZT4oUHRyLT5zdHJpcFBvaW50ZXJDYXN0cygpKTsKKyAgICB9CisgICAgYm9vbCBIYXNCYXNlUmVnID0gKEJhc2VHViA9PSBudWxscHRyKTsKKworICAgIGF1dG8gUHRyU2l6ZUJpdHMgPSBETC5nZXRQb2ludGVyVHlwZVNpemVJbkJpdHMoUHRyLT5nZXRUeXBlKCkpOworICAgIEFQSW50IEJhc2VPZmZzZXQoUHRyU2l6ZUJpdHMsIDApOworICAgIGludDY0X3QgU2NhbGUgPSAwOworCisgICAgYXV0byBHVEkgPSBnZXBfdHlwZV9iZWdpbihQb2ludGVlVHlwZSwgT3BlcmFuZHMpOworICAgIFR5cGUgKlRhcmdldFR5cGUgPSBudWxscHRyOworCisgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBHRVAgaW5zdHJ1Y3Rpb24gaGFzIGEgc2luZ2xlIG9wZXJhbmQsCisgICAgLy8gdGhlIGJhc2lzLCB0aGVyZWZvcmUgVGFyZ2V0VHlwZSBpcyBhIG51bGxwdHIuCisgICAgaWYgKE9wZXJhbmRzLmVtcHR5KCkpCisgICAgICByZXR1cm4gIUJhc2VHViA/IFRUSTo6VENDX0ZyZWUgOiBUVEk6OlRDQ19CYXNpYzsKKworICAgIGZvciAoYXV0byBJID0gT3BlcmFuZHMuYmVnaW4oKTsgSSAhPSBPcGVyYW5kcy5lbmQoKTsgKytJLCArK0dUSSkgeworICAgICAgVGFyZ2V0VHlwZSA9IEdUSS5nZXRJbmRleGVkVHlwZSgpOworICAgICAgLy8gV2UgYXNzdW1lIHRoYXQgdGhlIGNvc3Qgb2YgU2NhbGFyIEdFUCB3aXRoIGNvbnN0YW50IGluZGV4IGFuZCB0aGUKKyAgICAgIC8vIGNvc3Qgb2YgVmVjdG9yIEdFUCB3aXRoIHNwbGF0IGNvbnN0YW50IGluZGV4IGFyZSB0aGUgc2FtZS4KKyAgICAgIGNvbnN0IENvbnN0YW50SW50ICpDb25zdElkeCA9IGR5bl9jYXN0PENvbnN0YW50SW50PigqSSk7CisgICAgICBpZiAoIUNvbnN0SWR4KQorICAgICAgICBpZiAoYXV0byBTcGxhdCA9IGdldFNwbGF0VmFsdWUoKkkpKQorICAgICAgICAgIENvbnN0SWR4ID0gZHluX2Nhc3Q8Q29uc3RhbnRJbnQ+KFNwbGF0KTsKKyAgICAgIGlmIChTdHJ1Y3RUeXBlICpTVHkgPSBHVEkuZ2V0U3RydWN0VHlwZU9yTnVsbCgpKSB7CisgICAgICAgIC8vIEZvciBzdHJ1Y3R1cmVzIHRoZSBpbmRleCBpcyBhbHdheXMgc3BsYXQgb3Igc2NhbGFyIGNvbnN0YW50CisgICAgICAgIGFzc2VydChDb25zdElkeCAmJiAiVW5leHBlY3RlZCBHRVAgaW5kZXgiKTsKKyAgICAgICAgdWludDY0X3QgRmllbGQgPSBDb25zdElkeC0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICAgIEJhc2VPZmZzZXQgKz0gREwuZ2V0U3RydWN0TGF5b3V0KFNUeSktPmdldEVsZW1lbnRPZmZzZXQoRmllbGQpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaW50NjRfdCBFbGVtZW50U2l6ZSA9IERMLmdldFR5cGVBbGxvY1NpemUoR1RJLmdldEluZGV4ZWRUeXBlKCkpOworICAgICAgICBpZiAoQ29uc3RJZHgpIHsKKyAgICAgICAgICBCYXNlT2Zmc2V0ICs9CisgICAgICAgICAgICAgIENvbnN0SWR4LT5nZXRWYWx1ZSgpLnNleHRPclRydW5jKFB0clNpemVCaXRzKSAqIEVsZW1lbnRTaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIE5lZWRzIHNjYWxlIHJlZ2lzdGVyLgorICAgICAgICAgIGlmIChTY2FsZSAhPSAwKQorICAgICAgICAgICAgLy8gTm8gYWRkcmVzc2luZyBtb2RlIHRha2VzIHR3byBzY2FsZSByZWdpc3RlcnMuCisgICAgICAgICAgICByZXR1cm4gVFRJOjpUQ0NfQmFzaWM7CisgICAgICAgICAgU2NhbGUgPSBFbGVtZW50U2l6ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIC8vIEFzc3VtZXMgdGhlIGFkZHJlc3Mgc3BhY2UgaXMgMCB3aGVuIFB0ciBpcyBudWxscHRyLgorICAgIHVuc2lnbmVkIEFTID0KKyAgICAgICAgKFB0ciA9PSBudWxscHRyID8gMCA6IFB0ci0+Z2V0VHlwZSgpLT5nZXRQb2ludGVyQWRkcmVzc1NwYWNlKCkpOworCisgICAgaWYgKHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmlzTGVnYWxBZGRyZXNzaW5nTW9kZSgKKyAgICAgICAgICAgIFRhcmdldFR5cGUsIGNvbnN0X2Nhc3Q8R2xvYmFsVmFsdWUgKj4oQmFzZUdWKSwKKyAgICAgICAgICAgIEJhc2VPZmZzZXQuc2V4dE9yVHJ1bmMoNjQpLmdldFNFeHRWYWx1ZSgpLCBIYXNCYXNlUmVnLCBTY2FsZSwgQVMpKQorICAgICAgcmV0dXJuIFRUSTo6VENDX0ZyZWU7CisgICAgcmV0dXJuIFRUSTo6VENDX0Jhc2ljOworICB9CisKKyAgdXNpbmcgQmFzZVQ6OmdldEludHJpbnNpY0Nvc3Q7CisKKyAgdW5zaWduZWQgZ2V0SW50cmluc2ljQ29zdChJbnRyaW5zaWM6OklEIElJRCwgVHlwZSAqUmV0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gQXJndW1lbnRzKSB7CisgICAgLy8gRGVsZWdhdGUgdG8gdGhlIGdlbmVyaWMgaW50cmluc2ljIGhhbmRsaW5nIGNvZGUuIFRoaXMgbW9zdGx5IHByb3ZpZGVzIGFuCisgICAgLy8gb3Bwb3J0dW5pdHkgZm9yIHRhcmdldHMgdG8gKGZvciBleGFtcGxlKSBzcGVjaWFsIGNhc2UgdGhlIGNvc3Qgb2YKKyAgICAvLyBjZXJ0YWluIGludHJpbnNpY3MgYmFzZWQgb24gY29uc3RhbnRzIHVzZWQgYXMgYXJndW1lbnRzLgorICAgIFNtYWxsVmVjdG9yPFR5cGUgKiwgOD4gUGFyYW1UeXM7CisgICAgUGFyYW1UeXMucmVzZXJ2ZShBcmd1bWVudHMuc2l6ZSgpKTsKKyAgICBmb3IgKHVuc2lnbmVkIElkeCA9IDAsIFNpemUgPSBBcmd1bWVudHMuc2l6ZSgpOyBJZHggIT0gU2l6ZTsgKytJZHgpCisgICAgICBQYXJhbVR5cy5wdXNoX2JhY2soQXJndW1lbnRzW0lkeF0tPmdldFR5cGUoKSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmdldEludHJpbnNpY0Nvc3QoSUlELCBSZXRUeSwgUGFyYW1UeXMpOworICB9CisKKyAgdW5zaWduZWQgZ2V0VXNlckNvc3QoY29uc3QgVXNlciAqVSwgQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gT3BlcmFuZHMpIHsKKyAgICBpZiAoaXNhPFBISU5vZGU+KFUpKQorICAgICAgcmV0dXJuIFRUSTo6VENDX0ZyZWU7IC8vIE1vZGVsIGFsbCBQSEkgbm9kZXMgYXMgZnJlZS4KKworICAgIC8vIFN0YXRpYyBhbGxvY2EgZG9lc24ndCBnZW5lcmF0ZSB0YXJnZXQgaW5zdHJ1Y3Rpb25zLgorICAgIGlmIChhdXRvICpBID0gZHluX2Nhc3Q8QWxsb2NhSW5zdD4oVSkpCisgICAgICBpZiAoQS0+aXNTdGF0aWNBbGxvY2EoKSkKKyAgICAgICAgcmV0dXJuIFRUSTo6VENDX0ZyZWU7CisKKyAgICBpZiAoY29uc3QgR0VQT3BlcmF0b3IgKkdFUCA9IGR5bl9jYXN0PEdFUE9wZXJhdG9yPihVKSkgeworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmdldEdFUENvc3QoR0VQLT5nZXRTb3VyY2VFbGVtZW50VHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0VQLT5nZXRQb2ludGVyT3BlcmFuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFuZHMuZHJvcF9mcm9udCgpKTsKKyAgICB9CisKKyAgICBpZiAoYXV0byBDUyA9IEltbXV0YWJsZUNhbGxTaXRlKFUpKSB7CisgICAgICBjb25zdCBGdW5jdGlvbiAqRiA9IENTLmdldENhbGxlZEZ1bmN0aW9uKCk7CisgICAgICBpZiAoIUYpIHsKKyAgICAgICAgLy8gSnVzdCB1c2UgdGhlIGNhbGxlZCB2YWx1ZSB0eXBlLgorICAgICAgICBUeXBlICpGVHkgPSBDUy5nZXRDYWxsZWRWYWx1ZSgpLT5nZXRUeXBlKCktPmdldFBvaW50ZXJFbGVtZW50VHlwZSgpOworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKQorICAgICAgICAgICAgLT5nZXRDYWxsQ29zdChjYXN0PEZ1bmN0aW9uVHlwZT4oRlR5KSwgQ1MuYXJnX3NpemUoKSk7CisgICAgICB9CisKKyAgICAgIFNtYWxsVmVjdG9yPGNvbnN0IFZhbHVlICosIDg+IEFyZ3VtZW50cyhDUy5hcmdfYmVnaW4oKSwgQ1MuYXJnX2VuZCgpKTsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXRDYWxsQ29zdChGLCBBcmd1bWVudHMpOworICAgIH0KKworICAgIGlmIChjb25zdCBDYXN0SW5zdCAqQ0kgPSBkeW5fY2FzdDxDYXN0SW5zdD4oVSkpIHsKKyAgICAgIC8vIFJlc3VsdCBvZiBhIGNtcCBpbnN0cnVjdGlvbiBpcyBvZnRlbiBleHRlbmRlZCAodG8gYmUgdXNlZCBieSBvdGhlcgorICAgICAgLy8gY21wIGluc3RydWN0aW9ucywgbG9naWNhbCBvciByZXR1cm4gaW5zdHJ1Y3Rpb25zKS4gVGhlc2UgYXJlIHVzdWFsbHkKKyAgICAgIC8vIG5vcCBvbiBtb3N0IHNhbmUgdGFyZ2V0cy4KKyAgICAgIGlmIChpc2E8Q21wSW5zdD4oQ0ktPmdldE9wZXJhbmQoMCkpKQorICAgICAgICByZXR1cm4gVFRJOjpUQ0NfRnJlZTsKKyAgICAgIGlmIChpc2E8U0V4dEluc3Q+KENJKSB8fCBpc2E8WkV4dEluc3Q+KENJKSB8fCBpc2E8RlBFeHRJbnN0PihDSSkpCisgICAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXRFeHRDb3N0KENJLCBPcGVyYW5kcy5iYWNrKCkpOworICAgIH0KKworICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXRPcGVyYXRpb25Db3N0KAorICAgICAgICBPcGVyYXRvcjo6Z2V0T3Bjb2RlKFUpLCBVLT5nZXRUeXBlKCksCisgICAgICAgIFUtPmdldE51bU9wZXJhbmRzKCkgPT0gMSA/IFUtPmdldE9wZXJhbmQoMCktPmdldFR5cGUoKSA6IG51bGxwdHIpOworICB9CisKKyAgaW50IGdldEluc3RydWN0aW9uTGF0ZW5jeShjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIFNtYWxsVmVjdG9yPGNvbnN0IFZhbHVlICosIDQ+IE9wZXJhbmRzKEktPnZhbHVlX29wX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSS0+dmFsdWVfb3BfZW5kKCkpOworICAgIGlmIChnZXRVc2VyQ29zdChJLCBPcGVyYW5kcykgPT0gVFRJOjpUQ0NfRnJlZSkKKyAgICAgIHJldHVybiAwOworCisgICAgaWYgKGlzYTxMb2FkSW5zdD4oSSkpCisgICAgICByZXR1cm4gNDsKKworICAgIFR5cGUgKkRzdFR5ID0gSS0+Z2V0VHlwZSgpOworCisgICAgLy8gVXN1YWxseSBhbiBpbnRyaW5zaWMgaXMgYSBzaW1wbGUgaW5zdHJ1Y3Rpb24uCisgICAgLy8gQSByZWFsIGZ1bmN0aW9uIGNhbGwgaXMgbXVjaCBzbG93ZXIuCisgICAgaWYgKGF1dG8gKkNJID0gZHluX2Nhc3Q8Q2FsbEluc3Q+KEkpKSB7CisgICAgICBjb25zdCBGdW5jdGlvbiAqRiA9IENJLT5nZXRDYWxsZWRGdW5jdGlvbigpOworICAgICAgaWYgKCFGIHx8IHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmlzTG93ZXJlZFRvQ2FsbChGKSkKKyAgICAgICAgcmV0dXJuIDQwOworICAgICAgLy8gU29tZSBpbnRyaW5zaWNzIHJldHVybiBhIHZhbHVlIGFuZCBhIGZsYWcsIHdlIHVzZSB0aGUgdmFsdWUgdHlwZQorICAgICAgLy8gdG8gZGVjaWRlIGl0cyBsYXRlbmN5LgorICAgICAgaWYgKFN0cnVjdFR5cGUqIFN0cnVjdFR5ID0gZHluX2Nhc3Q8U3RydWN0VHlwZT4oRHN0VHkpKQorICAgICAgICBEc3RUeSA9IFN0cnVjdFR5LT5nZXRFbGVtZW50VHlwZSgwKTsKKyAgICAgIC8vIEZhbGwgdGhyb3VnaCB0byBzaW1wbGUgaW5zdHJ1Y3Rpb25zLgorICAgIH0KKworICAgIGlmIChWZWN0b3JUeXBlICpWZWN0b3JUeSA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KERzdFR5KSkKKyAgICAgIERzdFR5ID0gVmVjdG9yVHktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgaWYgKERzdFR5LT5pc0Zsb2F0aW5nUG9pbnRUeSgpKQorICAgICAgcmV0dXJuIDM7CisKKyAgICByZXR1cm4gMTsKKyAgfQorfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1RyYWNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1RyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1ZDM4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVHJhY2UuaApAQCAtMCwwICsxLDExMiBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvVHJhY2UuaCAtIFJlcHJlc2VudCBvbmUgdHJhY2Ugb2YgTExWTSBjb2RlIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBzaW5nbGUgdHJhY2Ugb2YgTExWTSBiYXNpYyBibG9ja3MuICBBIHRyYWNlIGlzIGEKKy8vIHNpbmdsZSBlbnRyeSwgbXVsdGlwbGUgZXhpdCwgcmVnaW9uIG9mIGNvZGUgdGhhdCBpcyBvZnRlbiBob3QuICBUcmFjZS1iYXNlZAorLy8gb3B0aW1pemF0aW9ucyB0cmVhdCB0cmFjZXMgYWxtb3N0IGxpa2UgdGhleSBhcmUgYSBsYXJnZSwgc3RyYW5nZSwgYmFzaWMKKy8vIGJsb2NrOiBiZWNhdXNlIHRoZSB0cmFjZSBwYXRoIGlzIGFzc3VtZWQgdG8gYmUgaG90LCBvcHRpbWl6YXRpb25zIGZvciB0aGUKKy8vIGZhbGwtdGhyb3VnaCBwYXRoIGFyZSBtYWRlIGF0IHRoZSBleHBlbnNlIG9mIHRoZSBub24tZmFsbC10aHJvdWdoIHBhdGhzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19UUkFDRV9ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfVFJBQ0VfSAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgTW9kdWxlOworY2xhc3MgcmF3X29zdHJlYW07CisKK2NsYXNzIFRyYWNlIHsKKyAgdXNpbmcgQmFzaWNCbG9ja0xpc3RUeXBlID0gc3RkOjp2ZWN0b3I8QmFzaWNCbG9jayAqPjsKKworICBCYXNpY0Jsb2NrTGlzdFR5cGUgQmFzaWNCbG9ja3M7CisKK3B1YmxpYzoKKyAgLy8vIFRyYWNlIGN0b3IgLSBNYWtlIGEgbmV3IHRyYWNlIGZyb20gYSB2ZWN0b3Igb2YgYmFzaWMgYmxvY2tzLAorICAvLy8gcmVzaWRpbmcgaW4gdGhlIGZ1bmN0aW9uIHdoaWNoIGlzIHRoZSBwYXJlbnQgb2YgdGhlIGZpcnN0CisgIC8vLyBiYXNpYyBibG9jayBpbiB0aGUgdmVjdG9yLgorICBUcmFjZShjb25zdCBzdGQ6OnZlY3RvcjxCYXNpY0Jsb2NrICo+ICZ2QkIpIDogQmFzaWNCbG9ja3MgKHZCQikge30KKworICAvLy8gZ2V0RW50cnlCYXNpY0Jsb2NrIC0gUmV0dXJuIHRoZSBlbnRyeSBiYXNpYyBibG9jayAoZmlyc3QgYmxvY2spCisgIC8vLyBvZiB0aGUgdHJhY2UuCisgIEJhc2ljQmxvY2sgKmdldEVudHJ5QmFzaWNCbG9jayAoKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2Nrc1swXTsgfQorCisgIC8vLyBvcGVyYXRvcltdL2dldEJsb2NrIC0gUmV0dXJuIGJhc2ljIGJsb2NrIE4gaW4gdGhlIHRyYWNlLgorICBCYXNpY0Jsb2NrICpvcGVyYXRvcltdKHVuc2lnbmVkIGkpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzW2ldOyB9CisgIEJhc2ljQmxvY2sgKmdldEJsb2NrKHVuc2lnbmVkIGkpICAgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3NbaV07IH0KKworICAvLy8gZ2V0RnVuY3Rpb24gLSBSZXR1cm4gdGhpcyB0cmFjZSdzIHBhcmVudCBmdW5jdGlvbi4KKyAgRnVuY3Rpb24gKmdldEZ1bmN0aW9uICgpIGNvbnN0OworCisgIC8vLyBnZXRNb2R1bGUgLSBSZXR1cm4gdGhpcyBNb2R1bGUgdGhhdCBjb250YWlucyB0aGlzIHRyYWNlJ3MgcGFyZW50CisgIC8vLyBmdW5jdGlvbi4KKyAgTW9kdWxlICpnZXRNb2R1bGUgKCkgY29uc3Q7CisKKyAgLy8vIGdldEJsb2NrSW5kZXggLSBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgYmFzaWMgYmxvY2sgaW4gdGhlCisgIC8vLyB0cmFjZSwgb3IgLTEgaWYgaXQgaXMgbm90IGluIHRoZSB0cmFjZS4KKyAgaW50IGdldEJsb2NrSW5kZXgoY29uc3QgQmFzaWNCbG9jayAqWCkgY29uc3QgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBCYXNpY0Jsb2Nrcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKEJhc2ljQmxvY2tzW2ldID09IFgpCisgICAgICAgIHJldHVybiBpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vLyBjb250YWlucyAtIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRyYWNlIGNvbnRhaW5zIHRoZSBnaXZlbiBiYXNpYworICAvLy8gYmxvY2suCisgIGJvb2wgY29udGFpbnMoY29uc3QgQmFzaWNCbG9jayAqWCkgY29uc3QgeworICAgIHJldHVybiBnZXRCbG9ja0luZGV4KFgpICE9IC0xOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBCMSBvY2N1cnMgYmVmb3JlIEIyIGluIHRoZSB0cmFjZSwgb3IgaWYgaXQgaXMgdGhlIHNhbWUKKyAgLy8vIGJsb2NrIGFzIEIyLi4gIEJvdGggYmxvY2tzIG11c3QgYmUgaW4gdGhlIHRyYWNlLgorICBib29sIGRvbWluYXRlcyhjb25zdCBCYXNpY0Jsb2NrICpCMSwgY29uc3QgQmFzaWNCbG9jayAqQjIpIGNvbnN0IHsKKyAgICBpbnQgQjFJZHggPSBnZXRCbG9ja0luZGV4KEIxKSwgQjJJZHggPSBnZXRCbG9ja0luZGV4KEIyKTsKKyAgICBhc3NlcnQoQjFJZHggIT0gLTEgJiYgQjJJZHggIT0gLTEgJiYgIkJsb2NrIGlzIG5vdCBpbiB0aGUgdHJhY2UhIik7CisgICAgcmV0dXJuIEIxSWR4IDw9IEIySWR4OworICB9CisKKyAgLy8gQmFzaWNCbG9jayBpdGVyYXRvcnMuLi4KKyAgdXNpbmcgaXRlcmF0b3IgPSBCYXNpY0Jsb2NrTGlzdFR5cGU6Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IEJhc2ljQmxvY2tMaXN0VHlwZTo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIHJldmVyc2VfaXRlcmF0b3IgPSBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+OworICB1c2luZyBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yID0gc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPjsKKworICBpdGVyYXRvciAgICAgICAgICAgICAgICBiZWdpbigpICAgICAgIHsgcmV0dXJuIEJhc2ljQmxvY2tzLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgICAgICAgICAgYmVnaW4oKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2Nrcy5iZWdpbigpOyB9CisgIGl0ZXJhdG9yICAgICAgICAgICAgICAgIGVuZCAgKCkgICAgICAgeyByZXR1cm4gQmFzaWNCbG9ja3MuZW5kKCk7ICAgfQorICBjb25zdF9pdGVyYXRvciAgICAgICAgICBlbmQgICgpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLmVuZCgpOyAgIH0KKworICByZXZlcnNlX2l0ZXJhdG9yICAgICAgIHJiZWdpbigpICAgICAgIHsgcmV0dXJuIEJhc2ljQmxvY2tzLnJiZWdpbigpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3MucmJlZ2luKCk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciAgICAgICByZW5kICAoKSAgICAgICB7IHJldHVybiBCYXNpY0Jsb2Nrcy5yZW5kKCk7ICAgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQgICgpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLnJlbmQoKTsgICB9CisKKyAgdW5zaWduZWQgICAgICAgICAgICAgICAgIHNpemUoKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2Nrcy5zaXplKCk7IH0KKyAgYm9vbCAgICAgICAgICAgICAgICAgICAgZW1wdHkoKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2Nrcy5lbXB0eSgpOyB9CisKKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgcSkgICAgICAgICAgICAgICB7IHJldHVybiBCYXNpY0Jsb2Nrcy5lcmFzZSAocSk7IH0KKyAgaXRlcmF0b3IgZXJhc2UoaXRlcmF0b3IgcTEsIGl0ZXJhdG9yIHEyKSB7IHJldHVybiBCYXNpY0Jsb2Nrcy5lcmFzZSAocTEsIHEyKTsgfQorCisgIC8vLyBwcmludCAtIFdyaXRlIHRyYWNlIHRvIG91dHB1dCBzdHJlYW0uCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8pIGNvbnN0OworCisgIC8vLyBkdW1wIC0gRGVidWdnZXIgY29udmVuaWVuY2UgbWV0aG9kOyB3cml0ZXMgdHJhY2UgdG8gc3RhbmRhcmQgZXJyb3IKKyAgLy8vIG91dHB1dCBzdHJlYW0uCisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfVFJBQ0VfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9UeXBlQmFzZWRBbGlhc0FuYWx5c2lzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1R5cGVCYXNlZEFsaWFzQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZmNmZGIzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9UeXBlQmFzZWRBbGlhc0FuYWx5c2lzLmgKQEAgLTAsMCArMSw5NCBAQAorLy89PT0tIFR5cGVCYXNlZEFsaWFzQW5hbHlzaXMuaCAtIFR5cGUtQmFzZWQgQWxpYXMgQW5hbHlzaXMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGlzIHRoZSBpbnRlcmZhY2UgZm9yIGEgbWV0YWRhdGEtYmFzZWQgVEJBQS4gU2VlIHRoZSBzb3VyY2UgZmlsZSBmb3IKKy8vLyBkZXRhaWxzIG9uIHRoZSBhbGdvcml0aG0uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1RZUEVCQVNFREFMSUFTQU5BTFlTSVNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1RZUEVCQVNFREFMSUFTQU5BTFlTSVNfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBNRE5vZGU7CitjbGFzcyBNZW1vcnlMb2NhdGlvbjsKKworLy8vIEEgc2ltcGxlIEFBIHJlc3VsdCB0aGF0IHVzZXMgVEJBQSBtZXRhZGF0YSB0byBhbnN3ZXIgcXVlcmllcy4KK2NsYXNzIFR5cGVCYXNlZEFBUmVzdWx0IDogcHVibGljIEFBUmVzdWx0QmFzZTxUeXBlQmFzZWRBQVJlc3VsdD4geworICBmcmllbmQgQUFSZXN1bHRCYXNlPFR5cGVCYXNlZEFBUmVzdWx0PjsKKworcHVibGljOgorICAvLy8gSGFuZGxlIGludmFsaWRhdGlvbiBldmVudHMgZnJvbSB0aGUgbmV3IHBhc3MgbWFuYWdlci4KKyAgLy8vCisgIC8vLyBCeSBkZWZpbml0aW9uLCB0aGlzIHJlc3VsdCBpcyBzdGF0ZWxlc3MgYW5kIHNvIHJlbWFpbnMgdmFsaWQuCisgIGJvb2wgaW52YWxpZGF0ZShGdW5jdGlvbiAmLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmLAorICAgICAgICAgICAgICAgICAgRnVuY3Rpb25BbmFseXNpc01hbmFnZXI6OkludmFsaWRhdG9yICYpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBBbGlhc1Jlc3VsdCBhbGlhcyhjb25zdCBNZW1vcnlMb2NhdGlvbiAmTG9jQSwgY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvY0IpOworICBib29sIHBvaW50c1RvQ29uc3RhbnRNZW1vcnkoY29uc3QgTWVtb3J5TG9jYXRpb24gJkxvYywgYm9vbCBPckxvY2FsKTsKKyAgRnVuY3Rpb25Nb2RSZWZCZWhhdmlvciBnZXRNb2RSZWZCZWhhdmlvcihJbW11dGFibGVDYWxsU2l0ZSBDUyk7CisgIEZ1bmN0aW9uTW9kUmVmQmVoYXZpb3IgZ2V0TW9kUmVmQmVoYXZpb3IoY29uc3QgRnVuY3Rpb24gKkYpOworICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsIGNvbnN0IE1lbW9yeUxvY2F0aW9uICZMb2MpOworICBNb2RSZWZJbmZvIGdldE1vZFJlZkluZm8oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MxLCBJbW11dGFibGVDYWxsU2l0ZSBDUzIpOworCitwcml2YXRlOgorICBib29sIEFsaWFzZXMoY29uc3QgTUROb2RlICpBLCBjb25zdCBNRE5vZGUgKkIpIGNvbnN0OworICBib29sIFBhdGhBbGlhc2VzKGNvbnN0IE1ETm9kZSAqQSwgY29uc3QgTUROb2RlICpCKSBjb25zdDsKK307CisKKy8vLyBBbmFseXNpcyBwYXNzIHByb3ZpZGluZyBhIG5ldmVyLWludmFsaWRhdGVkIGFsaWFzIGFuYWx5c2lzIHJlc3VsdC4KK2NsYXNzIFR5cGVCYXNlZEFBIDogcHVibGljIEFuYWx5c2lzSW5mb01peGluPFR5cGVCYXNlZEFBPiB7CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxUeXBlQmFzZWRBQT47CisKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworcHVibGljOgorICB1c2luZyBSZXN1bHQgPSBUeXBlQmFzZWRBQVJlc3VsdDsKKworICBUeXBlQmFzZWRBQVJlc3VsdCBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gTGVnYWN5IHdyYXBwZXIgcGFzcyB0byBwcm92aWRlIHRoZSBUeXBlQmFzZWRBQVJlc3VsdCBvYmplY3QuCitjbGFzcyBUeXBlQmFzZWRBQVdyYXBwZXJQYXNzIDogcHVibGljIEltbXV0YWJsZVBhc3MgeworICBzdGQ6OnVuaXF1ZV9wdHI8VHlwZUJhc2VkQUFSZXN1bHQ+IFJlc3VsdDsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBUeXBlQmFzZWRBQVdyYXBwZXJQYXNzKCk7CisKKyAgVHlwZUJhc2VkQUFSZXN1bHQgJmdldFJlc3VsdCgpIHsgcmV0dXJuICpSZXN1bHQ7IH0KKyAgY29uc3QgVHlwZUJhc2VkQUFSZXN1bHQgJmdldFJlc3VsdCgpIGNvbnN0IHsgcmV0dXJuICpSZXN1bHQ7IH0KKworICBib29sIGRvSW5pdGlhbGl6YXRpb24oTW9kdWxlICZNKSBvdmVycmlkZTsKKyAgYm9vbCBkb0ZpbmFsaXphdGlvbihNb2R1bGUgJk0pIG92ZXJyaWRlOworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gY3JlYXRlVHlwZUJhc2VkQUFXcmFwcGVyUGFzcyAtIFRoaXMgcGFzcyBpbXBsZW1lbnRzIG1ldGFkYXRhLWJhc2VkCisvLyB0eXBlLWJhc2VkIGFsaWFzIGFuYWx5c2lzLgorLy8KK0ltbXV0YWJsZVBhc3MgKmNyZWF0ZVR5cGVCYXNlZEFBV3JhcHBlclBhc3MoKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfVFlQRUJBU0VEQUxJQVNBTkFMWVNJU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1R5cGVNZXRhZGF0YVV0aWxzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1R5cGVNZXRhZGF0YVV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIyZTE1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVHlwZU1ldGFkYXRhVXRpbHMuaApAQCAtMCwwICsxLDUzIEBACisvLz09PS0gVHlwZU1ldGFkYXRhVXRpbHMuaCAtIFV0aWxpdGllcyByZWxhdGVkIHRvIHR5cGUgbWV0YWRhdGEgLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBmdW5jdGlvbnMgdGhhdCBtYWtlIGl0IGVhc2llciB0byBtYW5pcHVsYXRlIHR5cGUgbWV0YWRhdGEKKy8vIGZvciBkZXZpcnR1YWxpemF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19UWVBFTUVUQURBVEFVVElMU19ICisjZGVmaW5lIExMVk1fQU5BTFlTSVNfVFlQRU1FVEFEQVRBVVRJTFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFRoZSB0eXBlIG9mIENGSSBqdW1wdGFibGUgbmVlZGVkIGZvciBhIGZ1bmN0aW9uLgorZW51bSBDZmlGdW5jdGlvbkxpbmthZ2UgeworICBDRkxfRGVmaW5pdGlvbiA9IDAsCisgIENGTF9EZWNsYXJhdGlvbiA9IDEsCisgIENGTF9XZWFrRGVjbGFyYXRpb24gPSAyCit9OworCisvLy8gQSBjYWxsIHNpdGUgdGhhdCBjb3VsZCBiZSBkZXZpcnR1YWxpemVkLgorc3RydWN0IERldmlydENhbGxTaXRlIHsKKyAgLy8vIFRoZSBvZmZzZXQgZnJvbSB0aGUgYWRkcmVzcyBwb2ludCB0byB0aGUgdmlydHVhbCBmdW5jdGlvbi4KKyAgdWludDY0X3QgT2Zmc2V0OworICAvLy8gVGhlIGNhbGwgc2l0ZSBpdHNlbGYuCisgIENhbGxTaXRlIENTOworfTsKKworLy8vIEdpdmVuIGEgY2FsbCB0byB0aGUgaW50cmluc2ljIEBsbHZtLnR5cGUudGVzdCwgZmluZCBhbGwgZGV2aXJ0dWFsaXphYmxlCisvLy8gY2FsbCBzaXRlcyBiYXNlZCBvbiB0aGUgY2FsbCBhbmQgcmV0dXJuIHRoZW0gaW4gRGV2aXJ0Q2FsbHMuCit2b2lkIGZpbmREZXZpcnR1YWxpemFibGVDYWxsc0ZvclR5cGVUZXN0KAorICAgIFNtYWxsVmVjdG9ySW1wbDxEZXZpcnRDYWxsU2l0ZT4gJkRldmlydENhbGxzLAorICAgIFNtYWxsVmVjdG9ySW1wbDxDYWxsSW5zdCAqPiAmQXNzdW1lcywgY29uc3QgQ2FsbEluc3QgKkNJKTsKKworLy8vIEdpdmVuIGEgY2FsbCB0byB0aGUgaW50cmluc2ljIEBsbHZtLnR5cGUuY2hlY2tlZC5sb2FkLCBmaW5kIGFsbAorLy8vIGRldmlydHVhbGl6YWJsZSBjYWxsIHNpdGVzIGJhc2VkIG9uIHRoZSBjYWxsIGFuZCByZXR1cm4gdGhlbSBpbiBEZXZpcnRDYWxscy4KK3ZvaWQgZmluZERldmlydHVhbGl6YWJsZUNhbGxzRm9yVHlwZUNoZWNrZWRMb2FkKAorICAgIFNtYWxsVmVjdG9ySW1wbDxEZXZpcnRDYWxsU2l0ZT4gJkRldmlydENhbGxzLAorICAgIFNtYWxsVmVjdG9ySW1wbDxJbnN0cnVjdGlvbiAqPiAmTG9hZGVkUHRycywKKyAgICBTbWFsbFZlY3RvckltcGw8SW5zdHJ1Y3Rpb24gKj4gJlByZWRzLCBib29sICZIYXNOb25DYWxsVXNlcywKKyAgICBjb25zdCBDYWxsSW5zdCAqQ0kpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVXRpbHMvTG9jYWwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVXRpbHMvTG9jYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmE2NTRkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9VdGlscy9Mb2NhbC5oCkBAIC0wLDAgKzEsNTA3IEBACisvLz09PS0gTG9jYWwuaCAtIEZ1bmN0aW9ucyB0byBwZXJmb3JtIGxvY2FsIHRyYW5zZm9ybWF0aW9ucyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmFtaWx5IG9mIGZ1bmN0aW9ucyBwZXJmb3JtIHZhcmlvdXMgbG9jYWwgdHJhbnNmb3JtYXRpb25zIHRvIHRoZQorLy8gcHJvZ3JhbS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfVVRJTFNfTE9DQUxfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1VUSUxTX0xPQ0FMX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1RpbnlQdHJWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudC5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EYXRhTGF5b3V0LmgiCisjaW5jbHVkZSAibGx2bS9JUi9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9HZXRFbGVtZW50UHRyVHlwZUl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9PcGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVXNlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFsbG9jYUluc3Q7CitjbGFzcyBBc3N1bXB0aW9uQ2FjaGU7CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgQnJhbmNoSW5zdDsKK2NsYXNzIENhbGxJbnN0OworY2xhc3MgRGJnSW5mb0ludHJpbnNpYzsKK2NsYXNzIERiZ1ZhbHVlSW5zdDsKK2NsYXNzIERJQnVpbGRlcjsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBMYXp5VmFsdWVJbmZvOworY2xhc3MgTG9hZEluc3Q7CitjbGFzcyBNRE5vZGU7CitjbGFzcyBQSElOb2RlOworY2xhc3MgU3RvcmVJbnN0OworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CitjbGFzcyBUYXJnZXRUcmFuc2Zvcm1JbmZvOworCisvLy8gQSBzZXQgb2YgcGFyYW1ldGVycyB1c2VkIHRvIGNvbnRyb2wgdGhlIHRyYW5zZm9ybXMgaW4gdGhlIFNpbXBsaWZ5Q0ZHIHBhc3MuCisvLy8gT3B0aW9ucyBtYXkgY2hhbmdlIGRlcGVuZGluZyBvbiB0aGUgcG9zaXRpb24gaW4gdGhlIG9wdGltaXphdGlvbiBwaXBlbGluZS4KKy8vLyBGb3IgZXhhbXBsZSwgY2Fub25pY2FsIGZvcm0gdGhhdCBpbmNsdWRlcyBzd2l0Y2hlcyBhbmQgYnJhbmNoZXMgbWF5IGxhdGVyIGJlCisvLy8gcmVwbGFjZWQgYnkgbG9va3VwIHRhYmxlcyBhbmQgc2VsZWN0cy4KK3N0cnVjdCBTaW1wbGlmeUNGR09wdGlvbnMgeworICBpbnQgQm9udXNJbnN0VGhyZXNob2xkOworICBib29sIEZvcndhcmRTd2l0Y2hDb25kVG9QaGk7CisgIGJvb2wgQ29udmVydFN3aXRjaFRvTG9va3VwVGFibGU7CisgIGJvb2wgTmVlZENhbm9uaWNhbExvb3A7CisgIGJvb2wgU2lua0NvbW1vbkluc3RzOworICBBc3N1bXB0aW9uQ2FjaGUgKkFDOworCisgIFNpbXBsaWZ5Q0ZHT3B0aW9ucyh1bnNpZ25lZCBCb251c1RocmVzaG9sZCA9IDEsCisgICAgICAgICAgICAgICAgICAgICBib29sIEZvcndhcmRTd2l0Y2hDb25kID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICBib29sIFN3aXRjaFRvTG9va3VwID0gZmFsc2UsIGJvb2wgQ2Fub25pY2FsTG9vcHMgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaW5rQ29tbW9uID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICBBc3N1bXB0aW9uQ2FjaGUgKkFzc3VtcENhY2hlID0gbnVsbHB0cikKKyAgICAgIDogQm9udXNJbnN0VGhyZXNob2xkKEJvbnVzVGhyZXNob2xkKSwKKyAgICAgICAgRm9yd2FyZFN3aXRjaENvbmRUb1BoaShGb3J3YXJkU3dpdGNoQ29uZCksCisgICAgICAgIENvbnZlcnRTd2l0Y2hUb0xvb2t1cFRhYmxlKFN3aXRjaFRvTG9va3VwKSwKKyAgICAgICAgTmVlZENhbm9uaWNhbExvb3AoQ2Fub25pY2FsTG9vcHMpLAorICAgICAgICBTaW5rQ29tbW9uSW5zdHMoU2lua0NvbW1vbiksCisgICAgICAgIEFDKEFzc3VtcENhY2hlKSB7fQorCisgIC8vIFN1cHBvcnQgJ2J1aWxkZXInIHBhdHRlcm4gdG8gc2V0IG1lbWJlcnMgYnkgbmFtZSBhdCBjb25zdHJ1Y3Rpb24gdGltZS4KKyAgU2ltcGxpZnlDRkdPcHRpb25zICZib251c0luc3RUaHJlc2hvbGQoaW50IEkpIHsKKyAgICBCb251c0luc3RUaHJlc2hvbGQgPSBJOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBTaW1wbGlmeUNGR09wdGlvbnMgJmZvcndhcmRTd2l0Y2hDb25kVG9QaGkoYm9vbCBCKSB7CisgICAgRm9yd2FyZFN3aXRjaENvbmRUb1BoaSA9IEI7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIFNpbXBsaWZ5Q0ZHT3B0aW9ucyAmY29udmVydFN3aXRjaFRvTG9va3VwVGFibGUoYm9vbCBCKSB7CisgICAgQ29udmVydFN3aXRjaFRvTG9va3VwVGFibGUgPSBCOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBTaW1wbGlmeUNGR09wdGlvbnMgJm5lZWRDYW5vbmljYWxMb29wcyhib29sIEIpIHsKKyAgICBOZWVkQ2Fub25pY2FsTG9vcCA9IEI7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIFNpbXBsaWZ5Q0ZHT3B0aW9ucyAmc2lua0NvbW1vbkluc3RzKGJvb2wgQikgeworICAgIFNpbmtDb21tb25JbnN0cyA9IEI7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIFNpbXBsaWZ5Q0ZHT3B0aW9ucyAmc2V0QXNzdW1wdGlvbkNhY2hlKEFzc3VtcHRpb25DYWNoZSAqQ2FjaGUpIHsKKyAgICBBQyA9IENhY2hlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBMb2NhbCBjb25zdGFudCBwcm9wYWdhdGlvbi4KKy8vCisKKy8vLyBJZiBhIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb24gaXMgcHJlZGljYXRlZCBvbiBhIGNvbnN0YW50IHZhbHVlLCBjb252ZXJ0IGl0CisvLy8gaW50byBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCB0byB0aGUgY29uc3RhbnQgZGVzdGluYXRpb24uCisvLy8gVGhpcyBpcyBhIG5vbnRyaXZpYWwgb3BlcmF0aW9uIGJlY2F1c2UgdGhlIHN1Y2Nlc3NvcnMgb2YgdGhpcyBiYXNpYyBibG9jaworLy8vIG11c3QgaGF2ZSB0aGVpciBQSEkgbm9kZXMgdXBkYXRlZC4KKy8vLyBBbHNvIGNhbGxzIFJlY3Vyc2l2ZWx5RGVsZXRlVHJpdmlhbGx5RGVhZEluc3RydWN0aW9ucygpIG9uIGFueSBicmFuY2gvc3dpdGNoCisvLy8gY29uZGl0aW9ucyBhbmQgaW5kaXJlY3RiciBhZGRyZXNzZXMgdGhpcyBtaWdodCBtYWtlIGRlYWQgaWYKKy8vLyBEZWxldGVEZWFkQ29uZGl0aW9ucyBpcyB0cnVlLgorYm9vbCBDb25zdGFudEZvbGRUZXJtaW5hdG9yKEJhc2ljQmxvY2sgKkJCLCBib29sIERlbGV0ZURlYWRDb25kaXRpb25zID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWREb21pbmFuY2UgKkREVCA9IG51bGxwdHIpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIExvY2FsIGRlYWQgY29kZSBlbGltaW5hdGlvbi4KKy8vCisKKy8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpbnN0cnVjdGlvbiBpcyBub3QgdXNlZCwgYW5kIHRoZQorLy8vIGluc3RydWN0aW9uIGhhcyBubyBzaWRlIGVmZmVjdHMuCitib29sIGlzSW5zdHJ1Y3Rpb25Ucml2aWFsbHlEZWFkKEluc3RydWN0aW9uICpJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJID0gbnVsbHB0cik7CisKKy8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzdWx0IHByb2R1Y2VkIGJ5IHRoZSBpbnN0cnVjdGlvbiB3b3VsZCBoYXZlIG5vIHNpZGUKKy8vLyBlZmZlY3RzIGlmIGl0IHdhcyBub3QgdXNlZC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGNoZWNraW5nIHdoZXRoZXIKKy8vLyBpc0luc3RydWN0aW9uVHJpdmlhbGx5RGVhZCB3b3VsZCBiZSB0cnVlIGlmIHRoZSB1c2UgY291bnQgd2FzIDAuCitib29sIHdvdWxkSW5zdHJ1Y3Rpb25CZVRyaXZpYWxseURlYWQoSW5zdHJ1Y3Rpb24gKkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSA9IG51bGxwdHIpOworCisvLy8gSWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhIHRyaXZpYWxseSBkZWFkIGluc3RydWN0aW9uLCBkZWxldGUgaXQuCisvLy8gSWYgdGhhdCBtYWtlcyBhbnkgb2YgaXRzIG9wZXJhbmRzIHRyaXZpYWxseSBkZWFkLCBkZWxldGUgdGhlbSB0b28sCisvLy8gcmVjdXJzaXZlbHkuIFJldHVybiB0cnVlIGlmIGFueSBpbnN0cnVjdGlvbnMgd2VyZSBkZWxldGVkLgorYm9vbCBSZWN1cnNpdmVseURlbGV0ZVRyaXZpYWxseURlYWRJbnN0cnVjdGlvbnMoVmFsdWUgKlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSA9IG51bGxwdHIpOworCisvLy8gSWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBhbiBlZmZlY3RpdmVseSBkZWFkIFBISSBub2RlLCBkdWUgdG8gYmVpbmcgYQorLy8vIGRlZi11c2UgY2hhaW4gb2Ygc2luZ2xlLXVzZSBub2RlcyB0aGF0IGVpdGhlciBmb3JtcyBhIGN5Y2xlIG9yIGlzIHRlcm1pbmF0ZWQKKy8vLyBieSBhIHRyaXZpYWxseSBkZWFkIGluc3RydWN0aW9uLCBkZWxldGUgaXQuIElmIHRoYXQgbWFrZXMgYW55IG9mIGl0cworLy8vIG9wZXJhbmRzIHRyaXZpYWxseSBkZWFkLCBkZWxldGUgdGhlbSB0b28sIHJlY3Vyc2l2ZWx5LiBSZXR1cm4gdHJ1ZSBpZiBhCisvLy8gY2hhbmdlIHdhcyBtYWRlLgorYm9vbCBSZWN1cnNpdmVseURlbGV0ZURlYWRQSElOb2RlKFBISU5vZGUgKlBOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkgPSBudWxscHRyKTsKKworLy8vIFNjYW4gdGhlIHNwZWNpZmllZCBiYXNpYyBibG9jayBhbmQgdHJ5IHRvIHNpbXBsaWZ5IGFueSBpbnN0cnVjdGlvbnMgaW4gaXQKKy8vLyBhbmQgcmVjdXJzaXZlbHkgZGVsZXRlIGRlYWQgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgaXQgY2hhbmdlZCB0aGUgY29kZSwgbm90ZSB0aGF0IGl0IGNhbiBkZWxldGUKKy8vLyBpbnN0cnVjdGlvbnMgaW4gb3RoZXIgYmxvY2tzIGFzIHdlbGwgaW4gdGhpcyBibG9jay4KK2Jvb2wgU2ltcGxpZnlJbnN0cnVjdGlvbnNJbkJsb2NrKEJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSA9IG51bGxwdHIpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIENvbnRyb2wgRmxvdyBHcmFwaCBSZXN0cnVjdHVyaW5nLgorLy8KKworLy8vIExpa2UgQmFzaWNCbG9jazo6cmVtb3ZlUHJlZGVjZXNzb3IsIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIHdlJ3JlIGFib3V0CisvLy8gdG8gZGVsZXRlIFByZWQgYXMgYSBwcmVkZWNlc3NvciBvZiBCQi4gSWYgQkIgY29udGFpbnMgYW55IFBISSBub2RlcywgdGhpcworLy8vIGRyb3BzIHRoZSBlbnRyaWVzIGluIHRoZSBQSEkgbm9kZXMgZm9yIFByZWQuCisvLy8KKy8vLyBVbmxpa2UgdGhlIHJlbW92ZVByZWRlY2Vzc29yIG1ldGhvZCwgdGhpcyBhdHRlbXB0cyB0byBzaW1wbGlmeSB1c2VzIG9mIFBISQorLy8vIG5vZGVzIHRoYXQgY29sbGFwc2UgaW50byBpZGVudGl0eSB2YWx1ZXMuICBGb3IgZXhhbXBsZSwgaWYgd2UgaGF2ZToKKy8vLyAgIHggPSBwaGkoMSwgMCwgMCwgMCkKKy8vLyAgIHkgPSBhbmQgeCwgegorLy8vCisvLy8gLi4gYW5kIGRlbGV0ZSB0aGUgcHJlZGVjZXNzb3IgY29ycmVzcG9uZGluZyB0byB0aGUgJzEnLCB0aGlzIHdpbGwgYXR0ZW1wdCB0bworLy8vIHJlY3Vyc2l2ZWx5IGZvbGQgdGhlICdhbmQnIHRvIDAuCit2b2lkIFJlbW92ZVByZWRlY2Vzc29yQW5kU2ltcGxpZnkoQmFzaWNCbG9jayAqQkIsIEJhc2ljQmxvY2sgKlByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWREb21pbmFuY2UgKkREVCA9IG51bGxwdHIpOworCisvLy8gQkIgaXMgYSBibG9jayB3aXRoIG9uZSBwcmVkZWNlc3NvciBhbmQgaXRzIHByZWRlY2Vzc29yIGlzIGtub3duIHRvIGhhdmUgb25lCisvLy8gc3VjY2Vzc29yIChCQiEpLiBFbGltaW5hdGUgdGhlIGVkZ2UgYmV0d2VlbiB0aGVtLCBtb3ZpbmcgdGhlIGluc3RydWN0aW9ucyBpbgorLy8vIHRoZSBwcmVkZWNlc3NvciBpbnRvIEJCLiBUaGlzIGRlbGV0ZXMgdGhlIHByZWRlY2Vzc29yIGJsb2NrLgordm9pZCBNZXJnZUJhc2ljQmxvY2tJbnRvT25seVByZWQoQmFzaWNCbG9jayAqQkIsIERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmVycmVkRG9taW5hbmNlICpERFQgPSBudWxscHRyKTsKKworLy8vIEJCIGlzIGtub3duIHRvIGNvbnRhaW4gYW4gdW5jb25kaXRpb25hbCBicmFuY2gsIGFuZCBjb250YWlucyBubyBpbnN0cnVjdGlvbnMKKy8vLyBvdGhlciB0aGFuIFBISSBub2RlcywgcG90ZW50aWFsIGRlYnVnIGludHJpbnNpY3MgYW5kIHRoZSBicmFuY2guIElmCisvLy8gcG9zc2libGUsIGVsaW1pbmF0ZSBCQiBieSByZXdyaXRpbmcgYWxsIHRoZSBwcmVkZWNlc3NvcnMgdG8gYnJhbmNoIHRvIHRoZQorLy8vIHN1Y2Nlc3NvciBibG9jayBhbmQgcmV0dXJuIHRydWUuIElmIHdlIGNhbid0IHRyYW5zZm9ybSwgcmV0dXJuIGZhbHNlLgorYm9vbCBUcnlUb1NpbXBsaWZ5VW5jb25kQnJhbmNoRnJvbUVtcHR5QmxvY2soQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZlcnJlZERvbWluYW5jZSAqRERUID0gbnVsbHB0cik7CisKKy8vLyBDaGVjayBmb3IgYW5kIGVsaW1pbmF0ZSBkdXBsaWNhdGUgUEhJIG5vZGVzIGluIHRoaXMgYmxvY2suIFRoaXMgZG9lc24ndCB0cnkKKy8vLyB0byBiZSBjbGV2ZXIgYWJvdXQgUEhJIG5vZGVzIHdoaWNoIGRpZmZlciBvbmx5IGluIHRoZSBvcmRlciBvZiB0aGUgaW5jb21pbmcKKy8vLyB2YWx1ZXMsIGJ1dCBpbnN0Y29tYmluZSBvcmRlcnMgdGhlbSBzbyBpdCB1c3VhbGx5IHdvbid0IG1hdHRlci4KK2Jvb2wgRWxpbWluYXRlRHVwbGljYXRlUEhJTm9kZXMoQmFzaWNCbG9jayAqQkIpOworCisvLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGRvIHNpbXBsaWZpY2F0aW9uIG9mIGEgQ0ZHLiAgRm9yIGV4YW1wbGUsIGl0CisvLy8gYWRqdXN0cyBicmFuY2hlcyB0byBicmFuY2hlcyB0byBlbGltaW5hdGUgdGhlIGV4dHJhIGhvcCwgaXQgZWxpbWluYXRlcworLy8vIHVucmVhY2hhYmxlIGJhc2ljIGJsb2NrcywgYW5kIGRvZXMgb3RoZXIgcGVlcGhvbGUgb3B0aW1pemF0aW9uIG9mIHRoZSBDRkcuCisvLy8gSXQgcmV0dXJucyB0cnVlIGlmIGEgbW9kaWZpY2F0aW9uIHdhcyBtYWRlLCBwb3NzaWJseSBkZWxldGluZyB0aGUgYmFzaWMKKy8vLyBibG9jayB0aGF0IHdhcyBwb2ludGVkIHRvLiBMb29wSGVhZGVycyBpcyBhbiBvcHRpb25hbCBpbnB1dCBwYXJhbWV0ZXIKKy8vLyBwcm92aWRpbmcgdGhlIHNldCBvZiBsb29wIGhlYWRlcnMgdGhhdCBTaW1wbGlmeUNGRyBzaG91bGQgbm90IGVsaW1pbmF0ZS4KK2Jvb2wgc2ltcGxpZnlDRkcoQmFzaWNCbG9jayAqQkIsIGNvbnN0IFRhcmdldFRyYW5zZm9ybUluZm8gJlRUSSwKKyAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxpZnlDRkdPcHRpb25zICZPcHRpb25zID0ge30sCisgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0SW1wbDxCYXNpY0Jsb2NrICo+ICpMb29wSGVhZGVycyA9IG51bGxwdHIpOworCisvLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGZsYXR0ZW4gYSBDRkcuIEZvciBleGFtcGxlLCBpdCB1c2VzIHBhcmFsbGVsLWFuZAorLy8vIGFuZCBwYXJhbGxlbC1vciBtb2RlIHRvIGNvbGxhcHNlIGlmLWNvbmRpdGlvbnMgYW5kIG1lcmdlIGlmLXJlZ2lvbnMgd2l0aAorLy8vIGlkZW50aWNhbCBzdGF0ZW1lbnRzLgorYm9vbCBGbGF0dGVuQ0ZHKEJhc2ljQmxvY2sgKkJCLCBBbGlhc0FuYWx5c2lzICpBQSA9IG51bGxwdHIpOworCisvLy8gSWYgdGhpcyBiYXNpYyBibG9jayBpcyBPTkxZIGEgc2V0Y2MgYW5kIGEgYnJhbmNoLCBhbmQgaWYgYSBwcmVkZWNlc3NvcgorLy8vIGJyYW5jaGVzIHRvIHVzIGFuZCBvbmUgb2Ygb3VyIHN1Y2Nlc3NvcnMsIGZvbGQgdGhlIHNldGNjIGludG8gdGhlCisvLy8gcHJlZGVjZXNzb3IgYW5kIHVzZSBsb2dpY2FsIG9wZXJhdGlvbnMgdG8gcGljayB0aGUgcmlnaHQgZGVzdGluYXRpb24uCitib29sIEZvbGRCcmFuY2hUb0NvbW1vbkRlc3QoQnJhbmNoSW5zdCAqQkksIHVuc2lnbmVkIEJvbnVzSW5zdFRocmVzaG9sZCA9IDEpOworCisvLy8gVGhpcyBmdW5jdGlvbiB0YWtlcyBhIHZpcnR1YWwgcmVnaXN0ZXIgY29tcHV0ZWQgYnkgYW4gSW5zdHJ1Y3Rpb24gYW5kCisvLy8gcmVwbGFjZXMgaXQgd2l0aCBhIHNsb3QgaW4gdGhlIHN0YWNrIGZyYW1lLCBhbGxvY2F0ZWQgdmlhIGFsbG9jYS4KKy8vLyBUaGlzIGFsbG93cyB0aGUgQ0ZHIHRvIGJlIGNoYW5nZWQgYXJvdW5kIHdpdGhvdXQgZmVhciBvZiBpbnZhbGlkYXRpbmcgdGhlCisvLy8gU1NBIGluZm9ybWF0aW9uIGZvciB0aGUgdmFsdWUuIEl0IHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIGFsbG9jYSBpbnNlcnRlZAorLy8vIHRvIGNyZWF0ZSBhIHN0YWNrIHNsb3QgZm9yIFguCitBbGxvY2FJbnN0ICpEZW1vdGVSZWdUb1N0YWNrKEluc3RydWN0aW9uICZYLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFZvbGF0aWxlTG9hZHMgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkFsbG9jYVBvaW50ID0gbnVsbHB0cik7CisKKy8vLyBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgdmlydHVhbCByZWdpc3RlciBjb21wdXRlZCBieSBhIHBoaSBub2RlIGFuZCByZXBsYWNlcworLy8vIGl0IHdpdGggYSBzbG90IGluIHRoZSBzdGFjayBmcmFtZSwgYWxsb2NhdGVkIHZpYSBhbGxvY2EuIFRoZSBwaGkgbm9kZSBpcworLy8vIGRlbGV0ZWQgYW5kIGl0IHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIGFsbG9jYSBpbnNlcnRlZC4KK0FsbG9jYUluc3QgKkRlbW90ZVBISVRvU3RhY2soUEhJTm9kZSAqUCwgSW5zdHJ1Y3Rpb24gKkFsbG9jYVBvaW50ID0gbnVsbHB0cik7CisKKy8vLyBUcnkgdG8gZW5zdXJlIHRoYXQgdGhlIGFsaWdubWVudCBvZiBccCBWIGlzIGF0IGxlYXN0IFxwIFByZWZBbGlnbiBieXRlcy4gSWYKKy8vLyB0aGUgb3duaW5nIG9iamVjdCBjYW4gYmUgbW9kaWZpZWQgYW5kIGhhcyBhbiBhbGlnbm1lbnQgbGVzcyB0aGFuIFxwCisvLy8gUHJlZkFsaWduLCBpdCB3aWxsIGJlIGluY3JlYXNlZCBhbmQgXHAgUHJlZkFsaWduIHJldHVybmVkLiBJZiB0aGUgYWxpZ25tZW50CisvLy8gY2Fubm90IGJlIGluY3JlYXNlZCwgdGhlIGtub3duIGFsaWdubWVudCBvZiB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuCisvLy8KKy8vLyBJdCBpcyBub3QgYWx3YXlzIHBvc3NpYmxlIHRvIG1vZGlmeSB0aGUgYWxpZ25tZW50IG9mIHRoZSB1bmRlcmx5aW5nIG9iamVjdCwKKy8vLyBzbyBpZiBhbGlnbm1lbnQgaXMgaW1wb3J0YW50LCBhIG1vcmUgcmVsaWFibGUgYXBwcm9hY2ggaXMgdG8gc2ltcGx5IGFsaWduCisvLy8gYWxsIGdsb2JhbCB2YXJpYWJsZXMgYW5kIGFsbG9jYXRpb24gaW5zdHJ1Y3Rpb25zIHRvIHRoZWlyIHByZWZlcnJlZAorLy8vIGFsaWdubWVudCBmcm9tIHRoZSBiZWdpbm5pbmcuCit1bnNpZ25lZCBnZXRPckVuZm9yY2VLbm93bkFsaWdubWVudChWYWx1ZSAqViwgdW5zaWduZWQgUHJlZkFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqQ3h0SSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3N1bXB0aW9uQ2FjaGUgKkFDID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0cik7CisKKy8vLyBUcnkgdG8gaW5mZXIgYW4gYWxpZ25tZW50IGZvciB0aGUgc3BlY2lmaWVkIHBvaW50ZXIuCitpbmxpbmUgdW5zaWduZWQgZ2V0S25vd25BbGlnbm1lbnQoVmFsdWUgKlYsIGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpDeHRJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3N1bXB0aW9uQ2FjaGUgKkFDID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIpIHsKKyAgcmV0dXJuIGdldE9yRW5mb3JjZUtub3duQWxpZ25tZW50KFYsIDAsIERMLCBDeHRJLCBBQywgRFQpOworfQorCisvLy8gR2l2ZW4gYSBnZXRlbGVtZW50cHRyIGluc3RydWN0aW9uL2NvbnN0YW50ZXhwciwgZW1pdCB0aGUgY29kZSBuZWNlc3NhcnkgdG8KKy8vLyBjb21wdXRlIHRoZSBvZmZzZXQgZnJvbSB0aGUgYmFzZSBwb2ludGVyICh3aXRob3V0IGFkZGluZyBpbiB0aGUgYmFzZQorLy8vIHBvaW50ZXIpLiBSZXR1cm4gdGhlIHJlc3VsdCBhcyBhIHNpZ25lZCBpbnRlZ2VyIG9mIGludHB0ciBzaXplLgorLy8vIFdoZW4gTm9Bc3N1bXB0aW9ucyBpcyB0cnVlLCBubyBhc3N1bXB0aW9ucyBhYm91dCBpbmRleCBjb21wdXRhdGlvbiBub3QKKy8vLyBvdmVyZmxvd2luZyBpcyBtYWRlLgordGVtcGxhdGUgPHR5cGVuYW1lIElSQnVpbGRlclR5PgorVmFsdWUgKkVtaXRHRVBPZmZzZXQoSVJCdWlsZGVyVHkgKkJ1aWxkZXIsIGNvbnN0IERhdGFMYXlvdXQgJkRMLCBVc2VyICpHRVAsCisgICAgICAgICAgICAgICAgICAgICBib29sIE5vQXNzdW1wdGlvbnMgPSBmYWxzZSkgeworICBHRVBPcGVyYXRvciAqR0VQT3AgPSBjYXN0PEdFUE9wZXJhdG9yPihHRVApOworICBUeXBlICpJbnRQdHJUeSA9IERMLmdldEludFB0clR5cGUoR0VQLT5nZXRUeXBlKCkpOworICBWYWx1ZSAqUmVzdWx0ID0gQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShJbnRQdHJUeSk7CisKKyAgLy8gSWYgdGhlIEdFUCBpcyBpbmJvdW5kcywgd2Uga25vdyB0aGF0IG5vbmUgb2YgdGhlIGFkZHJlc3Npbmcgb3BlcmF0aW9ucyB3aWxsCisgIC8vIG92ZXJmbG93IGluIGFuIHVuc2lnbmVkIHNlbnNlLgorICBib29sIGlzSW5Cb3VuZHMgPSBHRVBPcC0+aXNJbkJvdW5kcygpICYmICFOb0Fzc3VtcHRpb25zOworCisgIC8vIEJ1aWxkIGEgbWFzayBmb3IgaGlnaCBvcmRlciBiaXRzLgorICB1bnNpZ25lZCBJbnRQdHJXaWR0aCA9IEludFB0clR5LT5nZXRTY2FsYXJUeXBlKCktPmdldEludGVnZXJCaXRXaWR0aCgpOworICB1aW50NjRfdCBQdHJTaXplTWFzayA9CisgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQ2NF90Pjo6bWF4KCkgPj4gKDY0IC0gSW50UHRyV2lkdGgpOworCisgIGdlcF90eXBlX2l0ZXJhdG9yIEdUSSA9IGdlcF90eXBlX2JlZ2luKEdFUCk7CisgIGZvciAoVXNlcjo6b3BfaXRlcmF0b3IgaSA9IEdFUC0+b3BfYmVnaW4oKSArIDEsIGUgPSBHRVAtPm9wX2VuZCgpOyBpICE9IGU7CisgICAgICAgKytpLCArK0dUSSkgeworICAgIFZhbHVlICpPcCA9ICppOworICAgIHVpbnQ2NF90IFNpemUgPSBETC5nZXRUeXBlQWxsb2NTaXplKEdUSS5nZXRJbmRleGVkVHlwZSgpKSAmIFB0clNpemVNYXNrOworICAgIGlmIChDb25zdGFudCAqT3BDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KE9wKSkgeworICAgICAgaWYgKE9wQy0+aXNaZXJvVmFsdWUoKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIEhhbmRsZSBhIHN0cnVjdCBpbmRleCwgd2hpY2ggYWRkcyBpdHMgZmllbGQgb2Zmc2V0IHRvIHRoZSBwb2ludGVyLgorICAgICAgaWYgKFN0cnVjdFR5cGUgKlNUeSA9IEdUSS5nZXRTdHJ1Y3RUeXBlT3JOdWxsKCkpIHsKKyAgICAgICAgaWYgKE9wQy0+Z2V0VHlwZSgpLT5pc1ZlY3RvclR5KCkpCisgICAgICAgICAgT3BDID0gT3BDLT5nZXRTcGxhdFZhbHVlKCk7CisKKyAgICAgICAgdWludDY0X3QgT3BWYWx1ZSA9IGNhc3Q8Q29uc3RhbnRJbnQ+KE9wQyktPmdldFpFeHRWYWx1ZSgpOworICAgICAgICBTaXplID0gREwuZ2V0U3RydWN0TGF5b3V0KFNUeSktPmdldEVsZW1lbnRPZmZzZXQoT3BWYWx1ZSk7CisKKyAgICAgICAgaWYgKFNpemUpCisgICAgICAgICAgUmVzdWx0ID0gQnVpbGRlci0+Q3JlYXRlQWRkKFJlc3VsdCwgQ29uc3RhbnRJbnQ6OmdldChJbnRQdHJUeSwgU2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdFUC0+Z2V0TmFtZSgpKyIub2ZmcyIpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgQ29uc3RhbnQgKlNjYWxlID0gQ29uc3RhbnRJbnQ6OmdldChJbnRQdHJUeSwgU2l6ZSk7CisgICAgICBDb25zdGFudCAqT0MgPSBDb25zdGFudEV4cHI6OmdldEludGVnZXJDYXN0KE9wQywgSW50UHRyVHksIHRydWUgLypTRXh0Ki8pOworICAgICAgU2NhbGUgPSBDb25zdGFudEV4cHI6OmdldE11bChPQywgU2NhbGUsIGlzSW5Cb3VuZHMvKk5VVyovKTsKKyAgICAgIC8vIEVtaXQgYW4gYWRkIGluc3RydWN0aW9uLgorICAgICAgUmVzdWx0ID0gQnVpbGRlci0+Q3JlYXRlQWRkKFJlc3VsdCwgU2NhbGUsIEdFUC0+Z2V0TmFtZSgpKyIub2ZmcyIpOworICAgICAgY29udGludWU7CisgICAgfQorICAgIC8vIENvbnZlcnQgdG8gY29ycmVjdCB0eXBlLgorICAgIGlmIChPcC0+Z2V0VHlwZSgpICE9IEludFB0clR5KQorICAgICAgT3AgPSBCdWlsZGVyLT5DcmVhdGVJbnRDYXN0KE9wLCBJbnRQdHJUeSwgdHJ1ZSwgT3AtPmdldE5hbWUoKSsiLmMiKTsKKyAgICBpZiAoU2l6ZSAhPSAxKSB7CisgICAgICAvLyBXZSdsbCBsZXQgaW5zdGNvbWJpbmUobXVsKSBjb252ZXJ0IHRoaXMgdG8gYSBzaGwgaWYgcG9zc2libGUuCisgICAgICBPcCA9IEJ1aWxkZXItPkNyZWF0ZU11bChPcCwgQ29uc3RhbnRJbnQ6OmdldChJbnRQdHJUeSwgU2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHRVAtPmdldE5hbWUoKSsiLmlkeCIsIGlzSW5Cb3VuZHMgLypOVVcqLyk7CisgICAgfQorCisgICAgLy8gRW1pdCBhbiBhZGQgaW5zdHJ1Y3Rpb24uCisgICAgUmVzdWx0ID0gQnVpbGRlci0+Q3JlYXRlQWRkKE9wLCBSZXN1bHQsIEdFUC0+Z2V0TmFtZSgpKyIub2ZmcyIpOworICB9CisgIHJldHVybiBSZXN1bHQ7Cit9CisKKy8vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gIERiZyBJbnRyaW5zaWMgdXRpbGl0aWVzCisvLy8KKworLy8vIEluc2VydHMgYSBsbHZtLmRiZy52YWx1ZSBpbnRyaW5zaWMgYmVmb3JlIGEgc3RvcmUgdG8gYW4gYWxsb2NhJ2QgdmFsdWUKKy8vLyB0aGF0IGhhcyBhbiBhc3NvY2lhdGVkIGxsdm0uZGJnLmRlY2xhcmUgb3IgbGx2bS5kYmcuYWRkciBpbnRyaW5zaWMuCit2b2lkIENvbnZlcnREZWJ1Z0RlY2xhcmVUb0RlYnVnVmFsdWUoRGJnSW5mb0ludHJpbnNpYyAqRElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JlSW5zdCAqU0ksIERJQnVpbGRlciAmQnVpbGRlcik7CisKKy8vLyBJbnNlcnRzIGEgbGx2bS5kYmcudmFsdWUgaW50cmluc2ljIGJlZm9yZSBhIGxvYWQgb2YgYW4gYWxsb2NhJ2QgdmFsdWUKKy8vLyB0aGF0IGhhcyBhbiBhc3NvY2lhdGVkIGxsdm0uZGJnLmRlY2xhcmUgb3IgbGx2bS5kYmcuYWRkciBpbnRyaW5zaWMuCit2b2lkIENvbnZlcnREZWJ1Z0RlY2xhcmVUb0RlYnVnVmFsdWUoRGJnSW5mb0ludHJpbnNpYyAqRElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvYWRJbnN0ICpMSSwgRElCdWlsZGVyICZCdWlsZGVyKTsKKworLy8vIEluc2VydHMgYSBsbHZtLmRiZy52YWx1ZSBpbnRyaW5zaWMgYWZ0ZXIgYSBwaGkgdGhhdCBoYXMgYW4gYXNzb2NpYXRlZAorLy8vIGxsdm0uZGJnLmRlY2xhcmUgb3IgbGx2bS5kYmcuYWRkciBpbnRyaW5zaWMuCit2b2lkIENvbnZlcnREZWJ1Z0RlY2xhcmVUb0RlYnVnVmFsdWUoRGJnSW5mb0ludHJpbnNpYyAqRElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBISU5vZGUgKkxJLCBESUJ1aWxkZXIgJkJ1aWxkZXIpOworCisvLy8gTG93ZXJzIGxsdm0uZGJnLmRlY2xhcmUgaW50cmluc2ljcyBpbnRvIGFwcHJvcHJpYXRlIHNldCBvZgorLy8vIGxsdm0uZGJnLnZhbHVlIGludHJpbnNpY3MuCitib29sIExvd2VyRGJnRGVjbGFyZShGdW5jdGlvbiAmRik7CisKKy8vLyBQcm9wYWdhdGUgZGJnLnZhbHVlIGludHJpbnNpY3MgdGhyb3VnaCB0aGUgbmV3bHkgaW5zZXJ0ZWQgUEhJcy4KK3ZvaWQgaW5zZXJ0RGVidWdWYWx1ZXNGb3JQSElzKEJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFBISU5vZGUgKj4gJkluc2VydGVkUEhJcyk7CisKKy8vLyBGaW5kcyBhbGwgaW50cmluc2ljcyBkZWNsYXJpbmcgbG9jYWwgdmFyaWFibGVzIGFzIGxpdmluZyBpbiB0aGUgbWVtb3J5IHRoYXQKKy8vLyAnVicgcG9pbnRzIHRvLiBUaGlzIG1heSBpbmNsdWRlIGEgbWl4IG9mIGRiZy5kZWNsYXJlIGFuZAorLy8vIGRiZy5hZGRyIGludHJpbnNpY3MuCitUaW55UHRyVmVjdG9yPERiZ0luZm9JbnRyaW5zaWMgKj4gRmluZERiZ0FkZHJVc2VzKFZhbHVlICpWKTsKKworLy8vIEZpbmRzIHRoZSBsbHZtLmRiZy52YWx1ZSBpbnRyaW5zaWNzIGRlc2NyaWJpbmcgYSB2YWx1ZS4KK3ZvaWQgZmluZERiZ1ZhbHVlcyhTbWFsbFZlY3RvckltcGw8RGJnVmFsdWVJbnN0ICo+ICZEYmdWYWx1ZXMsIFZhbHVlICpWKTsKKworLy8vIEZpbmRzIHRoZSBkZWJ1ZyBpbmZvIGludHJpbnNpY3MgZGVzY3JpYmluZyBhIHZhbHVlLgordm9pZCBmaW5kRGJnVXNlcnMoU21hbGxWZWN0b3JJbXBsPERiZ0luZm9JbnRyaW5zaWMgKj4gJkRiZ0luc3RzLCBWYWx1ZSAqVik7CisKKy8vLyBSZXBsYWNlcyBsbHZtLmRiZy5kZWNsYXJlIGluc3RydWN0aW9uIHdoZW4gdGhlIGFkZHJlc3MgaXQKKy8vLyBkZXNjcmliZXMgaXMgcmVwbGFjZWQgd2l0aCBhIG5ldyB2YWx1ZS4gSWYgRGVyZWYgaXMgdHJ1ZSwgYW4KKy8vLyBhZGRpdGlvbmFsIERXX09QX2RlcmVmIGlzIHByZXBlbmRlZCB0byB0aGUgZXhwcmVzc2lvbi4gSWYgT2Zmc2V0CisvLy8gaXMgbm9uLXplcm8sIGEgY29uc3RhbnQgZGlzcGxhY2VtZW50IGlzIGFkZGVkIHRvIHRoZSBleHByZXNzaW9uCisvLy8gKGJldHdlZW4gdGhlIG9wdGlvbmFsIERlcmVmIG9wZXJhdGlvbnMpLiBPZmZzZXQgY2FuIGJlIG5lZ2F0aXZlLgorYm9vbCByZXBsYWNlRGJnRGVjbGFyZShWYWx1ZSAqQWRkcmVzcywgVmFsdWUgKk5ld0FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUsIERJQnVpbGRlciAmQnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEZXJlZkJlZm9yZSwgaW50IE9mZnNldCwgYm9vbCBEZXJlZkFmdGVyKTsKKworLy8vIFJlcGxhY2VzIGxsdm0uZGJnLmRlY2xhcmUgaW5zdHJ1Y3Rpb24gd2hlbiB0aGUgYWxsb2NhIGl0IGRlc2NyaWJlcworLy8vIGlzIHJlcGxhY2VkIHdpdGggYSBuZXcgdmFsdWUuIElmIERlcmVmIGlzIHRydWUsIGFuIGFkZGl0aW9uYWwKKy8vLyBEV19PUF9kZXJlZiBpcyBwcmVwZW5kZWQgdG8gdGhlIGV4cHJlc3Npb24uIElmIE9mZnNldCBpcyBub24temVybywKKy8vLyBhIGNvbnN0YW50IGRpc3BsYWNlbWVudCBpcyBhZGRlZCB0byB0aGUgZXhwcmVzc2lvbiAoYmV0d2VlbiB0aGUKKy8vLyBvcHRpb25hbCBEZXJlZiBvcGVyYXRpb25zKS4gT2Zmc2V0IGNhbiBiZSBuZWdhdGl2ZS4gVGhlIG5ldworLy8vIGxsdm0uZGJnLmRlY2xhcmUgaXMgaW5zZXJ0ZWQgaW1tZWRpYXRlbHkgYmVmb3JlIEFJLgorYm9vbCByZXBsYWNlRGJnRGVjbGFyZUZvckFsbG9jYShBbGxvY2FJbnN0ICpBSSwgVmFsdWUgKk5ld0FsbG9jYUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJQnVpbGRlciAmQnVpbGRlciwgYm9vbCBEZXJlZkJlZm9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE9mZnNldCwgYm9vbCBEZXJlZkFmdGVyKTsKKworLy8vIFJlcGxhY2VzIG11bHRpcGxlIGxsdm0uZGJnLnZhbHVlIGluc3RydWN0aW9ucyB3aGVuIHRoZSBhbGxvY2EgaXQgZGVzY3JpYmVzCisvLy8gaXMgcmVwbGFjZWQgd2l0aCBhIG5ldyB2YWx1ZS4gSWYgT2Zmc2V0IGlzIG5vbi16ZXJvLCBhIGNvbnN0YW50IGRpc3BsYWNlbWVudAorLy8vIGlzIGFkZGVkIHRvIHRoZSBleHByZXNzaW9uIChhZnRlciB0aGUgbWFuZGF0b3J5IERlcmVmKS4gT2Zmc2V0IGNhbiBiZQorLy8vIG5lZ2F0aXZlLiBOZXcgbGx2bS5kYmcudmFsdWUgaW5zdHJ1Y3Rpb25zIGFyZSBpbnNlcnRlZCBhdCB0aGUgbG9jYXRpb25zIG9mCisvLy8gdGhlIGluc3RydWN0aW9ucyB0aGV5IHJlcGxhY2UuCit2b2lkIHJlcGxhY2VEYmdWYWx1ZUZvckFsbG9jYShBbGxvY2FJbnN0ICpBSSwgVmFsdWUgKk5ld0FsbG9jYUFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUJ1aWxkZXIgJkJ1aWxkZXIsIGludCBPZmZzZXQgPSAwKTsKKworLy8vIEFzc3VtaW5nIHRoZSBpbnN0cnVjdGlvbiBccCBJIGlzIGdvaW5nIHRvIGJlIGRlbGV0ZWQsIGF0dGVtcHQgdG8gc2FsdmFnZSBhbnkKKy8vLyBkYmcudmFsdWUgaW50cmluc2ljcyByZWZlcnJpbmcgdG8gXHAgSSBieSByZXdyaXRpbmcgaXRzIGVmZmVjdCBpbnRvIGEKKy8vLyBESUV4cHJlc3Npb24uCit2b2lkIHNhbHZhZ2VEZWJ1Z0luZm8oSW5zdHJ1Y3Rpb24gJkkpOworCisvLy8gUmVtb3ZlIGFsbCBpbnN0cnVjdGlvbnMgZnJvbSBhIGJhc2ljIGJsb2NrIG90aGVyIHRoYW4gaXQncyB0ZXJtaW5hdG9yCisvLy8gYW5kIGFueSBwcmVzZW50IEVIIHBhZCBpbnN0cnVjdGlvbnMuCit1bnNpZ25lZCByZW1vdmVBbGxOb25UZXJtaW5hdG9yQW5kRUhQYWRJbnN0cnVjdGlvbnMoQmFzaWNCbG9jayAqQkIpOworCisvLy8gSW5zZXJ0IGFuIHVucmVhY2hhYmxlIGluc3RydWN0aW9uIGJlZm9yZSB0aGUgc3BlY2lmaWVkCisvLy8gaW5zdHJ1Y3Rpb24sIG1ha2luZyBpdCBhbmQgdGhlIHJlc3Qgb2YgdGhlIGNvZGUgaW4gdGhlIGJsb2NrIGRlYWQuCit1bnNpZ25lZCBjaGFuZ2VUb1VucmVhY2hhYmxlKEluc3RydWN0aW9uICpJLCBib29sIFVzZUxMVk1UcmFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFByZXNlcnZlTENTU0EgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVmZXJyZWREb21pbmFuY2UgKkREVCA9IG51bGxwdHIpOworCisvLy8gQ29udmVydCB0aGUgQ2FsbEluc3QgdG8gSW52b2tlSW5zdCB3aXRoIHRoZSBzcGVjaWZpZWQgdW53aW5kIGVkZ2UgYmFzaWMKKy8vLyBibG9jay4gIFRoaXMgYWxzbyBzcGxpdHMgdGhlIGJhc2ljIGJsb2NrIHdoZXJlIENJIGlzIGxvY2F0ZWQsIGJlY2F1c2UKKy8vLyBJbnZva2VJbnN0IGlzIGEgdGVybWluYXRvciBpbnN0cnVjdGlvbi4gIFJldHVybnMgdGhlIG5ld2x5IHNwbGl0IGJhc2ljCisvLy8gYmxvY2suCitCYXNpY0Jsb2NrICpjaGFuZ2VUb0ludm9rZUFuZFNwbGl0QmFzaWNCbG9jayhDYWxsSW5zdCAqQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpVbndpbmRFZGdlKTsKKworLy8vIFJlcGxhY2UgJ0JCJ3MgdGVybWluYXRvciB3aXRoIG9uZSB0aGF0IGRvZXMgbm90IGhhdmUgYW4gdW53aW5kIHN1Y2Nlc3NvcgorLy8vIGJsb2NrLiBSZXdyaXRlcyBgaW52b2tlYCB0byBgY2FsbGAsIGV0Yy4gVXBkYXRlcyBhbnkgUEhJcyBpbiB1bndpbmQKKy8vLyBzdWNjZXNzb3IuCisvLy8KKy8vLyBccGFyYW0gQkIgIEJsb2NrIHdob3NlIHRlcm1pbmF0b3Igd2lsbCBiZSByZXBsYWNlZC4gIEl0cyB0ZXJtaW5hdG9yIG11c3QKKy8vLyAgICAgICAgICAgIGhhdmUgYW4gdW53aW5kIHN1Y2Nlc3Nvci4KK3ZvaWQgcmVtb3ZlVW53aW5kRWRnZShCYXNpY0Jsb2NrICpCQiwgRGVmZXJyZWREb21pbmFuY2UgKkREVCA9IG51bGxwdHIpOworCisvLy8gUmVtb3ZlIGFsbCBibG9ja3MgdGhhdCBjYW4gbm90IGJlIHJlYWNoZWQgZnJvbSB0aGUgZnVuY3Rpb24ncyBlbnRyeS4KKy8vLworLy8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgYmFzaWMgYmxvY2sgd2FzIHJlbW92ZWQuCitib29sIHJlbW92ZVVucmVhY2hhYmxlQmxvY2tzKEZ1bmN0aW9uICZGLCBMYXp5VmFsdWVJbmZvICpMVkkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZWZlcnJlZERvbWluYW5jZSAqRERUID0gbnVsbHB0cik7CisKKy8vLyBDb21iaW5lIHRoZSBtZXRhZGF0YSBvZiB0d28gaW5zdHJ1Y3Rpb25zIHNvIHRoYXQgSyBjYW4gcmVwbGFjZSBKCisvLy8KKy8vLyBNZXRhZGF0YSBub3QgbGlzdGVkIGFzIGtub3duIHZpYSBLbm93bklEcyBpcyByZW1vdmVkCit2b2lkIGNvbWJpbmVNZXRhZGF0YShJbnN0cnVjdGlvbiAqSywgY29uc3QgSW5zdHJ1Y3Rpb24gKkosIEFycmF5UmVmPHVuc2lnbmVkPiBLbm93bklEcyk7CisKKy8vLyBDb21iaW5lIHRoZSBtZXRhZGF0YSBvZiB0d28gaW5zdHJ1Y3Rpb25zIHNvIHRoYXQgSyBjYW4gcmVwbGFjZSBKLiBUaGlzCisvLy8gc3BlY2lmaWNhbGx5IGhhbmRsZXMgdGhlIGNhc2Ugb2YgQ1NFLWxpa2UgdHJhbnNmb3JtYXRpb25zLgorLy8vCisvLy8gVW5rbm93biBtZXRhZGF0YSBpcyByZW1vdmVkLgordm9pZCBjb21iaW5lTWV0YWRhdGFGb3JDU0UoSW5zdHJ1Y3Rpb24gKkssIGNvbnN0IEluc3RydWN0aW9uICpKKTsKKworLy8gUmVwbGFjZSBlYWNoIHVzZSBvZiAnRnJvbScgd2l0aCAnVG8nLCBpZiB0aGF0IHVzZSBkb2VzIG5vdCBiZWxvbmcgdG8gYmFzaWMKKy8vIGJsb2NrIHdoZXJlICdGcm9tJyBpcyBkZWZpbmVkLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgcmVwbGFjZW1lbnRzIG1hZGUuCit1bnNpZ25lZCByZXBsYWNlTm9uTG9jYWxVc2VzV2l0aChJbnN0cnVjdGlvbiAqRnJvbSwgVmFsdWUgKlRvKTsKKworLy8vIFJlcGxhY2UgZWFjaCB1c2Ugb2YgJ0Zyb20nIHdpdGggJ1RvJyBpZiB0aGF0IHVzZSBpcyBkb21pbmF0ZWQgYnkKKy8vLyB0aGUgZ2l2ZW4gZWRnZS4gIFJldHVybnMgdGhlIG51bWJlciBvZiByZXBsYWNlbWVudHMgbWFkZS4KK3Vuc2lnbmVkIHJlcGxhY2VEb21pbmF0ZWRVc2VzV2l0aChWYWx1ZSAqRnJvbSwgVmFsdWUgKlRvLCBEb21pbmF0b3JUcmVlICZEVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYXNpY0Jsb2NrRWRnZSAmRWRnZSk7CisvLy8gUmVwbGFjZSBlYWNoIHVzZSBvZiAnRnJvbScgd2l0aCAnVG8nIGlmIHRoYXQgdXNlIGlzIGRvbWluYXRlZCBieQorLy8vIHRoZSBlbmQgb2YgdGhlIGdpdmVuIEJhc2ljQmxvY2suIFJldHVybnMgdGhlIG51bWJlciBvZiByZXBsYWNlbWVudHMgbWFkZS4KK3Vuc2lnbmVkIHJlcGxhY2VEb21pbmF0ZWRVc2VzV2l0aChWYWx1ZSAqRnJvbSwgVmFsdWUgKlRvLCBEb21pbmF0b3JUcmVlICZEVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYXNpY0Jsb2NrICpCQik7CisKKy8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgQ2FsbFNpdGUgQ1MgY2FsbHMgYSBnYyBsZWFmIGZ1bmN0aW9uLgorLy8vCisvLy8gQSBsZWFmIGZ1bmN0aW9uIGlzIGEgZnVuY3Rpb24gdGhhdCBkb2VzIG5vdCBzYWZlcG9pbnQgdGhlIHRocmVhZCBkdXJpbmcgaXRzCisvLy8gZXhlY3V0aW9uLiAgRHVyaW5nIGEgY2FsbCBvciBpbnZva2UgdG8gc3VjaCBhIGZ1bmN0aW9uLCB0aGUgY2FsbGVycyBzdGFjaworLy8vIGRvZXMgbm90IGhhdmUgdG8gYmUgbWFkZSBwYXJzZWFibGUuCisvLy8KKy8vLyBNb3N0IHBhc3NlcyBjYW4gYW5kIHNob3VsZCBpZ25vcmUgdGhpcyBpbmZvcm1hdGlvbiwgYW5kIGl0IGlzIG9ubHkgdXNlZAorLy8vIGR1cmluZyBsb3dlcmluZyBieSB0aGUgR0MgaW5mcmFzdHJ1Y3R1cmUuCitib29sIGNhbGxzR0NMZWFmRnVuY3Rpb24oSW1tdXRhYmxlQ2FsbFNpdGUgQ1MsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICZUTEkpOworCisvLy8gQ29weSBhIG5vbm51bGwgbWV0YWRhdGEgbm9kZSB0byBhIG5ldyBsb2FkIGluc3RydWN0aW9uLgorLy8vCisvLy8gVGhpcyBoYW5kbGVzIG1hcHBpbmcgaXQgdG8gcmFuZ2UgbWV0YWRhdGEgaWYgdGhlIG5ldyBsb2FkIGlzIGFuIGludGVnZXIKKy8vLyBsb2FkIGluc3RlYWQgb2YgYSBwb2ludGVyIGxvYWQuCit2b2lkIGNvcHlOb25udWxsTWV0YWRhdGEoY29uc3QgTG9hZEluc3QgJk9sZExJLCBNRE5vZGUgKk4sIExvYWRJbnN0ICZOZXdMSSk7CisKKy8vLyBDb3B5IGEgcmFuZ2UgbWV0YWRhdGEgbm9kZSB0byBhIG5ldyBsb2FkIGluc3RydWN0aW9uLgorLy8vCisvLy8gVGhpcyBoYW5kbGVzIG1hcHBpbmcgaXQgdG8gbm9ubnVsbCBtZXRhZGF0YSBpZiB0aGUgbmV3IGxvYWQgaXMgYSBwb2ludGVyCisvLy8gbG9hZCBpbnN0ZWFkIG9mIGFuIGludGVnZXIgbG9hZCBhbmQgdGhlIHJhbmdlIGRvZXNuJ3QgY292ZXIgbnVsbC4KK3ZvaWQgY29weVJhbmdlTWV0YWRhdGEoY29uc3QgRGF0YUxheW91dCAmREwsIGNvbnN0IExvYWRJbnN0ICZPbGRMSSwgTUROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICBMb2FkSW5zdCAmTmV3TEkpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIEludHJpbnNpYyBwYXR0ZXJuIG1hdGNoaW5nCisvLworCisvLy8gVHJ5IHRvIG1hdGNoIGEgYnN3YXAgb3IgYml0cmV2ZXJzZSBpZGlvbS4KKy8vLworLy8vIElmIGFuIGlkaW9tIGlzIG1hdGNoZWQsIGFuIGludHJpbnNpYyBjYWxsIGlzIGluc2VydGVkIGJlZm9yZSBcYyBJLiBBbnkgYWRkZWQKKy8vLyBpbnN0cnVjdGlvbnMgYXJlIHJldHVybmVkIGluIFxjIEluc2VydGVkSW5zdHMuIFRoZXkgd2lsbCBhbGwgaGF2ZSBiZWVuIGFkZGVkCisvLy8gdG8gYSBiYXNpYyBibG9jay4KKy8vLworLy8vIEEgYml0cmV2ZXJzZSBpZGlvbSBub3JtYWxseSByZXF1aXJlcyBhcm91bmQgMipCVyBub2RlcyB0byBiZSBzZWFyY2hlZCAod2hlcmUKKy8vLyBCVyBpcyB0aGUgYml0d2lkdGggb2YgdGhlIGludGVnZXIgdHlwZSkuIEEgYnN3YXAgaWRpb20gcmVxdWlyZXMgYW55d2hlcmUgdXAKKy8vLyB0byBCVyAvIDQgbm9kZXMgdG8gYmUgc2VhcmNoZWQsIHNvIGlzIHNpZ25pZmljYW50bHkgZmFzdGVyLgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUgb24gYSBzdWNjZXNzZnVsIG1hdGNoIG9yIGZhbHNlIG90aGVyd2lzZS4KK2Jvb2wgcmVjb2duaXplQlN3YXBPckJpdFJldmVyc2VJZGlvbSgKKyAgICBJbnN0cnVjdGlvbiAqSSwgYm9vbCBNYXRjaEJTd2FwcywgYm9vbCBNYXRjaEJpdFJldmVyc2FscywKKyAgICBTbWFsbFZlY3RvckltcGw8SW5zdHJ1Y3Rpb24gKj4gJkluc2VydGVkSW5zdHMpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIFNhbml0aXplciB1dGlsaXRpZXMKKy8vCisKKy8vLyBHaXZlbiBhIENhbGxJbnN0LCBjaGVjayBpZiBpdCBjYWxscyBhIHN0cmluZyBmdW5jdGlvbiBrbm93biB0byBDb2RlR2VuLAorLy8vIGFuZCBtYXJrIGl0IHdpdGggTm9CdWlsdGluIGlmIHNvLiAgVG8gYmUgdXNlZCBieSBzYW5pdGl6ZXJzIHRoYXQgaW50ZW5kCisvLy8gdG8gaW50ZXJjZXB0IHN0cmluZyBmdW5jdGlvbnMgYW5kIHdhbnQgdG8gYXZvaWQgY29udmVydGluZyB0aGVtIHRvIHRhcmdldAorLy8vIHNwZWNpZmljIGluc3RydWN0aW9ucy4KK3ZvaWQgbWF5YmVNYXJrU2FuaXRpemVyTGlicmFyeUNhbGxOb0J1aWx0aW4oQ2FsbEluc3QgKkNJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBUcmFuc2Zvcm0gcHJlZGljYXRlcworLy8KKworLy8vIEdpdmVuIGFuIGluc3RydWN0aW9uLCBpcyBpdCBsZWdhbCB0byBzZXQgb3BlcmFuZCBPcElkeCB0byBhIG5vbi1jb25zdGFudAorLy8vIHZhbHVlPworYm9vbCBjYW5SZXBsYWNlT3BlcmFuZFdpdGhWYXJpYWJsZShjb25zdCBJbnN0cnVjdGlvbiAqSSwgdW5zaWduZWQgT3BJZHgpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0xPQ0FMX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVmFsdWVMYXR0aWNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1ZhbHVlTGF0dGljZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NDNmZDEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1ZhbHVlTGF0dGljZS5oCkBAIC0wLDAgKzEsMzIxIEBACisvLz09PS0gVmFsdWVMYXR0aWNlLmggLSBWYWx1ZSBjb25zdHJhaW50IGFuYWx5c2lzIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfVkFMVUVMQVRUSUNFX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19WQUxVRUxBVFRJQ0VfSAorCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudFJhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudHMuaCIKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVMYXR0aWNlRWxlbWVudAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBsYXR0aWNlIHZhbHVlcyBmb3IgY29uc3RhbnRzLgorLy8vCisvLy8gRklYTUU6IFRoaXMgaXMgYmFzaWNhbGx5IGp1c3QgZm9yIGJyaW5ndXAsIHRoaXMgY2FuIGJlIG1hZGUgYSBsb3QgbW9yZSByaWNoCisvLy8gaW4gdGhlIGZ1dHVyZS4KKy8vLworCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBWYWx1ZUxhdHRpY2VFbGVtZW50IHsKKyAgZW51bSBWYWx1ZUxhdHRpY2VFbGVtZW50VHkgeworICAgIC8vLyBUaGlzIFZhbHVlIGhhcyBubyBrbm93biB2YWx1ZSB5ZXQuICBBcyBhIHJlc3VsdCwgdGhpcyBpbXBsaWVzIHRoZQorICAgIC8vLyBwcm9kdWNpbmcgaW5zdHJ1Y3Rpb24gaXMgZGVhZC4gIENhdXRpb246IFdlIHVzZSB0aGlzIGFzIHRoZSBzdGFydGluZworICAgIC8vLyBzdGF0ZSBpbiBvdXIgbG9jYWwgbWVldCBydWxlcy4gIEluIHRoaXMgdXNhZ2UsIGl0J3MgdGFrZW4gdG8gbWVhbgorICAgIC8vLyAibm90aGluZyBrbm93biB5ZXQiLgorICAgIHVuZGVmaW5lZCwKKworICAgIC8vLyBUaGlzIFZhbHVlIGhhcyBhIHNwZWNpZmljIGNvbnN0YW50IHZhbHVlLiAgKEZvciBjb25zdGFudCBpbnRlZ2VycywKKyAgICAvLy8gY29uc3RhbnRyYW5nZSBpcyB1c2VkIGluc3RlYWQuICBJbnRlZ2VyIHR5cGVkIGNvbnN0YW50ZXhwcnMgY2FuIGFwcGVhcgorICAgIC8vLyBhcyBjb25zdGFudC4pCisgICAgY29uc3RhbnQsCisKKyAgICAvLy8gVGhpcyBWYWx1ZSBpcyBrbm93biB0byBub3QgaGF2ZSB0aGUgc3BlY2lmaWVkIHZhbHVlLiAgKEZvciBjb25zdGFudAorICAgIC8vLyBpbnRlZ2VycywgY29uc3RhbnRyYW5nZSBpcyB1c2VkIGluc3RlYWQuICBBcyBhYm92ZSwgaW50ZWdlciB0eXBlZAorICAgIC8vLyBjb25zdGFudGV4cHJzIGNhbiBhcHBlYXIgaGVyZS4pCisgICAgbm90Y29uc3RhbnQsCisKKyAgICAvLy8gVGhlIFZhbHVlIGZhbGxzIHdpdGhpbiB0aGlzIHJhbmdlLiAoVXNlZCBvbmx5IGZvciBpbnRlZ2VyIHR5cGVkIHZhbHVlcy4pCisgICAgY29uc3RhbnRyYW5nZSwKKworICAgIC8vLyBXZSBjYW4gbm90IHByZWNpc2VseSBtb2RlbCB0aGUgZHluYW1pYyB2YWx1ZXMgdGhpcyB2YWx1ZSBtaWdodCB0YWtlLgorICAgIG92ZXJkZWZpbmVkCisgIH07CisKKyAgVmFsdWVMYXR0aWNlRWxlbWVudFR5IFRhZzsKKworICAvLy8gVGhlIHVuaW9uIGVpdGhlciBzdG9yZXMgYSBwb2ludGVyIHRvIGEgY29uc3RhbnQgb3IgYSBjb25zdGFudCByYW5nZSwKKyAgLy8vIGFzc29jaWF0ZWQgdG8gdGhlIGxhdHRpY2UgZWxlbWVudC4gV2UgaGF2ZSB0byBlbnN1cmUgdGhhdCBSYW5nZSBpcworICAvLy8gaW5pdGlhbGl6ZWQgb3IgZGVzdHJveWVkIHdoZW4gY2hhbmdpbmcgc3RhdGUgdG8gb3IgZnJvbSBjb25zdGFudHJhbmdlLgorICB1bmlvbiB7CisgICAgQ29uc3RhbnQgKkNvbnN0VmFsOworICAgIENvbnN0YW50UmFuZ2UgUmFuZ2U7CisgIH07CisKK3B1YmxpYzoKKyAgLy8gQ29uc3QgYW5kIFJhbmdlIGFyZSBpbml0aWFsaXplZCBvbi1kZW1hbmQuCisgIFZhbHVlTGF0dGljZUVsZW1lbnQoKSA6IFRhZyh1bmRlZmluZWQpIHt9CisKKyAgLy8vIEN1c3RvbSBkZXN0cnVjdG9yIHRvIGVuc3VyZSBSYW5nZSBpcyBwcm9wZXJseSBkZXN0cm95ZWQsIHdoZW4gdGhlIG9iamVjdAorICAvLy8gaXMgZGVhbGxvY2F0ZWQuCisgIH5WYWx1ZUxhdHRpY2VFbGVtZW50KCkgeworICAgIHN3aXRjaCAoVGFnKSB7CisgICAgY2FzZSBvdmVyZGVmaW5lZDoKKyAgICBjYXNlIHVuZGVmaW5lZDoKKyAgICBjYXNlIGNvbnN0YW50OgorICAgIGNhc2Ugbm90Y29uc3RhbnQ6CisgICAgICBicmVhazsKKyAgICBjYXNlIGNvbnN0YW50cmFuZ2U6CisgICAgICBSYW5nZS5+Q29uc3RhbnRSYW5nZSgpOworICAgICAgYnJlYWs7CisgICAgfTsKKyAgfQorCisgIC8vLyBDdXN0b20gY29weSBjb25zdHJ1Y3RvciwgdG8gZW5zdXJlIFJhbmdlIGdldHMgaW5pdGlhbGl6ZWQgd2hlbgorICAvLy8gY29weWluZyBhIGNvbnN0YW50IHJhbmdlIGxhdHRpY2UgZWxlbWVudC4KKyAgVmFsdWVMYXR0aWNlRWxlbWVudChjb25zdCBWYWx1ZUxhdHRpY2VFbGVtZW50ICZPdGhlcikgOiBUYWcodW5kZWZpbmVkKSB7CisgICAgKnRoaXMgPSBPdGhlcjsKKyAgfQorCisgIC8vLyBDdXN0b20gYXNzaWdubWVudCBvcGVyYXRvciwgdG8gZW5zdXJlIFJhbmdlIGdldHMgaW5pdGlhbGl6ZWQgd2hlbgorICAvLy8gYXNzaWduaW5nIGEgY29uc3RhbnQgcmFuZ2UgbGF0dGljZSBlbGVtZW50LgorICBWYWx1ZUxhdHRpY2VFbGVtZW50ICZvcGVyYXRvcj0oY29uc3QgVmFsdWVMYXR0aWNlRWxlbWVudCAmT3RoZXIpIHsKKyAgICAvLyBJZiB3ZSBjaGFuZ2UgdGhlIHN0YXRlIG9mIHRoaXMgZnJvbSBjb25zdGFudCByYW5nZSB0byBub24gY29uc3RhbnQgcmFuZ2UsCisgICAgLy8gZGVzdHJveSBSYW5nZS4KKyAgICBpZiAoaXNDb25zdGFudFJhbmdlKCkgJiYgIU90aGVyLmlzQ29uc3RhbnRSYW5nZSgpKQorICAgICAgUmFuZ2UufkNvbnN0YW50UmFuZ2UoKTsKKworICAgIC8vIElmIHdlIGNoYW5nZSB0aGUgc3RhdGUgb2YgdGhpcyBmcm9tIGEgdmFsaWQgQ29uc3RWYWwgdG8gYW5vdGhlciBhIHN0YXRlCisgICAgLy8gd2l0aG91dCBhIHZhbGlkIENvbnN0VmFsLCB6ZXJvIHRoZSBwb2ludGVyLgorICAgIGlmICgoaXNDb25zdGFudCgpIHx8IGlzTm90Q29uc3RhbnQoKSkgJiYgIU90aGVyLmlzQ29uc3RhbnQoKSAmJgorICAgICAgICAhT3RoZXIuaXNOb3RDb25zdGFudCgpKQorICAgICAgQ29uc3RWYWwgPSBudWxscHRyOworCisgICAgc3dpdGNoIChPdGhlci5UYWcpIHsKKyAgICBjYXNlIGNvbnN0YW50cmFuZ2U6CisgICAgICBpZiAoIWlzQ29uc3RhbnRSYW5nZSgpKQorICAgICAgICBuZXcgKCZSYW5nZSkgQ29uc3RhbnRSYW5nZShPdGhlci5SYW5nZSk7CisgICAgICBlbHNlCisgICAgICAgIFJhbmdlID0gT3RoZXIuUmFuZ2U7CisgICAgICBicmVhazsKKyAgICBjYXNlIGNvbnN0YW50OgorICAgIGNhc2Ugbm90Y29uc3RhbnQ6CisgICAgICBDb25zdFZhbCA9IE90aGVyLkNvbnN0VmFsOworICAgICAgYnJlYWs7CisgICAgY2FzZSBvdmVyZGVmaW5lZDoKKyAgICBjYXNlIHVuZGVmaW5lZDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBUYWcgPSBPdGhlci5UYWc7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgc3RhdGljIFZhbHVlTGF0dGljZUVsZW1lbnQgZ2V0KENvbnN0YW50ICpDKSB7CisgICAgVmFsdWVMYXR0aWNlRWxlbWVudCBSZXM7CisgICAgaWYgKCFpc2E8VW5kZWZWYWx1ZT4oQykpCisgICAgICBSZXMubWFya0NvbnN0YW50KEMpOworICAgIHJldHVybiBSZXM7CisgIH0KKyAgc3RhdGljIFZhbHVlTGF0dGljZUVsZW1lbnQgZ2V0Tm90KENvbnN0YW50ICpDKSB7CisgICAgVmFsdWVMYXR0aWNlRWxlbWVudCBSZXM7CisgICAgaWYgKCFpc2E8VW5kZWZWYWx1ZT4oQykpCisgICAgICBSZXMubWFya05vdENvbnN0YW50KEMpOworICAgIHJldHVybiBSZXM7CisgIH0KKyAgc3RhdGljIFZhbHVlTGF0dGljZUVsZW1lbnQgZ2V0UmFuZ2UoQ29uc3RhbnRSYW5nZSBDUikgeworICAgIFZhbHVlTGF0dGljZUVsZW1lbnQgUmVzOworICAgIFJlcy5tYXJrQ29uc3RhbnRSYW5nZShzdGQ6Om1vdmUoQ1IpKTsKKyAgICByZXR1cm4gUmVzOworICB9CisgIHN0YXRpYyBWYWx1ZUxhdHRpY2VFbGVtZW50IGdldE92ZXJkZWZpbmVkKCkgeworICAgIFZhbHVlTGF0dGljZUVsZW1lbnQgUmVzOworICAgIFJlcy5tYXJrT3ZlcmRlZmluZWQoKTsKKyAgICByZXR1cm4gUmVzOworICB9CisKKyAgYm9vbCBpc1VuZGVmaW5lZCgpIGNvbnN0IHsgcmV0dXJuIFRhZyA9PSB1bmRlZmluZWQ7IH0KKyAgYm9vbCBpc0NvbnN0YW50KCkgY29uc3QgeyByZXR1cm4gVGFnID09IGNvbnN0YW50OyB9CisgIGJvb2wgaXNOb3RDb25zdGFudCgpIGNvbnN0IHsgcmV0dXJuIFRhZyA9PSBub3Rjb25zdGFudDsgfQorICBib29sIGlzQ29uc3RhbnRSYW5nZSgpIGNvbnN0IHsgcmV0dXJuIFRhZyA9PSBjb25zdGFudHJhbmdlOyB9CisgIGJvb2wgaXNPdmVyZGVmaW5lZCgpIGNvbnN0IHsgcmV0dXJuIFRhZyA9PSBvdmVyZGVmaW5lZDsgfQorCisgIENvbnN0YW50ICpnZXRDb25zdGFudCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNDb25zdGFudCgpICYmICJDYW5ub3QgZ2V0IHRoZSBjb25zdGFudCBvZiBhIG5vbi1jb25zdGFudCEiKTsKKyAgICByZXR1cm4gQ29uc3RWYWw7CisgIH0KKworICBDb25zdGFudCAqZ2V0Tm90Q29uc3RhbnQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzTm90Q29uc3RhbnQoKSAmJiAiQ2Fubm90IGdldCB0aGUgY29uc3RhbnQgb2YgYSBub24tbm90Y29uc3RhbnQhIik7CisgICAgcmV0dXJuIENvbnN0VmFsOworICB9CisKKyAgY29uc3QgQ29uc3RhbnRSYW5nZSAmZ2V0Q29uc3RhbnRSYW5nZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNDb25zdGFudFJhbmdlKCkgJiYKKyAgICAgICAgICAgIkNhbm5vdCBnZXQgdGhlIGNvbnN0YW50LXJhbmdlIG9mIGEgbm9uLWNvbnN0YW50LXJhbmdlISIpOworICAgIHJldHVybiBSYW5nZTsKKyAgfQorCisgIE9wdGlvbmFsPEFQSW50PiBhc0NvbnN0YW50SW50ZWdlcigpIGNvbnN0IHsKKyAgICBpZiAoaXNDb25zdGFudCgpICYmIGlzYTxDb25zdGFudEludD4oZ2V0Q29uc3RhbnQoKSkpIHsKKyAgICAgIHJldHVybiBjYXN0PENvbnN0YW50SW50PihnZXRDb25zdGFudCgpKS0+Z2V0VmFsdWUoKTsKKyAgICB9IGVsc2UgaWYgKGlzQ29uc3RhbnRSYW5nZSgpICYmIGdldENvbnN0YW50UmFuZ2UoKS5pc1NpbmdsZUVsZW1lbnQoKSkgeworICAgICAgcmV0dXJuICpnZXRDb25zdGFudFJhbmdlKCkuZ2V0U2luZ2xlRWxlbWVudCgpOworICAgIH0KKyAgICByZXR1cm4gTm9uZTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIG1hcmtPdmVyZGVmaW5lZCgpIHsKKyAgICBpZiAoaXNPdmVyZGVmaW5lZCgpKQorICAgICAgcmV0dXJuOworICAgIGlmIChpc0NvbnN0YW50KCkgfHwgaXNOb3RDb25zdGFudCgpKQorICAgICAgQ29uc3RWYWwgPSBudWxscHRyOworICAgIGlmIChpc0NvbnN0YW50UmFuZ2UoKSkKKyAgICAgIFJhbmdlLn5Db25zdGFudFJhbmdlKCk7CisgICAgVGFnID0gb3ZlcmRlZmluZWQ7CisgIH0KKworICB2b2lkIG1hcmtDb25zdGFudChDb25zdGFudCAqVikgeworICAgIGFzc2VydChWICYmICJNYXJraW5nIGNvbnN0YW50IHdpdGggTlVMTCIpOworICAgIGlmIChDb25zdGFudEludCAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVikpIHsKKyAgICAgIG1hcmtDb25zdGFudFJhbmdlKENvbnN0YW50UmFuZ2UoQ0ktPmdldFZhbHVlKCkpKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKGlzYTxVbmRlZlZhbHVlPihWKSkKKyAgICAgIHJldHVybjsKKworICAgIGFzc2VydCgoIWlzQ29uc3RhbnQoKSB8fCBnZXRDb25zdGFudCgpID09IFYpICYmCisgICAgICAgICAgICJNYXJraW5nIGNvbnN0YW50IHdpdGggZGlmZmVyZW50IHZhbHVlIik7CisgICAgYXNzZXJ0KGlzVW5kZWZpbmVkKCkpOworICAgIFRhZyA9IGNvbnN0YW50OworICAgIENvbnN0VmFsID0gVjsKKyAgfQorCisgIHZvaWQgbWFya05vdENvbnN0YW50KENvbnN0YW50ICpWKSB7CisgICAgYXNzZXJ0KFYgJiYgIk1hcmtpbmcgY29uc3RhbnQgd2l0aCBOVUxMIik7CisgICAgaWYgKENvbnN0YW50SW50ICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihWKSkgeworICAgICAgbWFya0NvbnN0YW50UmFuZ2UoQ29uc3RhbnRSYW5nZShDSS0+Z2V0VmFsdWUoKSArIDEsIENJLT5nZXRWYWx1ZSgpKSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChpc2E8VW5kZWZWYWx1ZT4oVikpCisgICAgICByZXR1cm47CisKKyAgICBhc3NlcnQoKCFpc0NvbnN0YW50KCkgfHwgZ2V0Q29uc3RhbnQoKSAhPSBWKSAmJgorICAgICAgICAgICAiTWFya2luZyBjb25zdGFudCAhY29uc3RhbnQgd2l0aCBzYW1lIHZhbHVlIik7CisgICAgYXNzZXJ0KCghaXNOb3RDb25zdGFudCgpIHx8IGdldE5vdENvbnN0YW50KCkgPT0gVikgJiYKKyAgICAgICAgICAgIk1hcmtpbmcgIWNvbnN0YW50IHdpdGggZGlmZmVyZW50IHZhbHVlIik7CisgICAgYXNzZXJ0KGlzVW5kZWZpbmVkKCkgfHwgaXNDb25zdGFudCgpKTsKKyAgICBUYWcgPSBub3Rjb25zdGFudDsKKyAgICBDb25zdFZhbCA9IFY7CisgIH0KKworICB2b2lkIG1hcmtDb25zdGFudFJhbmdlKENvbnN0YW50UmFuZ2UgTmV3UikgeworICAgIGlmIChpc0NvbnN0YW50UmFuZ2UoKSkgeworICAgICAgaWYgKE5ld1IuaXNFbXB0eVNldCgpKQorICAgICAgICBtYXJrT3ZlcmRlZmluZWQoKTsKKyAgICAgIGVsc2UgeworICAgICAgICBSYW5nZSA9IHN0ZDo6bW92ZShOZXdSKTsKKyAgICAgIH0KKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhc3NlcnQoaXNVbmRlZmluZWQoKSk7CisgICAgaWYgKE5ld1IuaXNFbXB0eVNldCgpKQorICAgICAgbWFya092ZXJkZWZpbmVkKCk7CisgICAgZWxzZSB7CisgICAgICBUYWcgPSBjb25zdGFudHJhbmdlOworICAgICAgbmV3ICgmUmFuZ2UpIENvbnN0YW50UmFuZ2Uoc3RkOjptb3ZlKE5ld1IpKTsKKyAgICB9CisgIH0KKworcHVibGljOgorICAvLy8gVXBkYXRlcyB0aGlzIG9iamVjdCB0byBhcHByb3hpbWF0ZSBib3RoIHRoaXMgb2JqZWN0IGFuZCBSSFMuIFJldHVybnMKKyAgLy8vIHRydWUgaWYgdGhpcyBvYmplY3QgaGFzIGJlZW4gY2hhbmdlZC4KKyAgYm9vbCBtZXJnZUluKGNvbnN0IFZhbHVlTGF0dGljZUVsZW1lbnQgJlJIUywgY29uc3QgRGF0YUxheW91dCAmREwpIHsKKyAgICBpZiAoUkhTLmlzVW5kZWZpbmVkKCkgfHwgaXNPdmVyZGVmaW5lZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChSSFMuaXNPdmVyZGVmaW5lZCgpKSB7CisgICAgICBtYXJrT3ZlcmRlZmluZWQoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmIChpc1VuZGVmaW5lZCgpKSB7CisgICAgICAqdGhpcyA9IFJIUzsKKyAgICAgIHJldHVybiAhUkhTLmlzVW5kZWZpbmVkKCk7CisgICAgfQorCisgICAgaWYgKGlzQ29uc3RhbnQoKSkgeworICAgICAgaWYgKFJIUy5pc0NvbnN0YW50KCkgJiYgZ2V0Q29uc3RhbnQoKSA9PSBSSFMuZ2V0Q29uc3RhbnQoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgbWFya092ZXJkZWZpbmVkKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoaXNOb3RDb25zdGFudCgpKSB7CisgICAgICBpZiAoUkhTLmlzTm90Q29uc3RhbnQoKSAmJiBnZXROb3RDb25zdGFudCgpID09IFJIUy5nZXROb3RDb25zdGFudCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBtYXJrT3ZlcmRlZmluZWQoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGFzc2VydChpc0NvbnN0YW50UmFuZ2UoKSAmJiAiTmV3IFZhbHVlTGF0dGljZSB0eXBlPyIpOworICAgIGlmICghUkhTLmlzQ29uc3RhbnRSYW5nZSgpKSB7CisgICAgICAvLyBXZSBjYW4gZ2V0IGhlcmUgaWYgd2UndmUgZW5jb3VudGVyZWQgYSBjb25zdGFudGV4cHIgb2YgaW50ZWdlciB0eXBlCisgICAgICAvLyBhbmQgbWVyZ2UgaXQgd2l0aCBhIGNvbnN0YW50cmFuZ2UuCisgICAgICBtYXJrT3ZlcmRlZmluZWQoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBDb25zdGFudFJhbmdlIE5ld1IgPSBnZXRDb25zdGFudFJhbmdlKCkudW5pb25XaXRoKFJIUy5nZXRDb25zdGFudFJhbmdlKCkpOworICAgIGlmIChOZXdSLmlzRnVsbFNldCgpKQorICAgICAgbWFya092ZXJkZWZpbmVkKCk7CisgICAgZWxzZQorICAgICAgbWFya0NvbnN0YW50UmFuZ2Uoc3RkOjptb3ZlKE5ld1IpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIENvbnN0YW50SW50ICpnZXRDb25zdGFudEludCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNDb25zdGFudCgpICYmIGlzYTxDb25zdGFudEludD4oZ2V0Q29uc3RhbnQoKSkgJiYKKyAgICAgICAgICAgIk5vIGludGVnZXIgY29uc3RhbnQiKTsKKyAgICByZXR1cm4gY2FzdDxDb25zdGFudEludD4oZ2V0Q29uc3RhbnQoKSk7CisgIH0KKworICAvLy8gQ29tcGFyZXMgdGhpcyBzeW1ib2xpYyB2YWx1ZSB3aXRoIE90aGVyIHVzaW5nIFByZWQgYW5kIHJldHVybnMgZWl0aGVyCisgIC8vLyB0cnVlLCBmYWxzZSBvciB1bmRlZiBjb25zdGFudHMsIG9yIG51bGxwdHIgaWYgdGhlIGNvbXBhcmlzb24gY2Fubm90IGJlCisgIC8vLyBldmFsdWF0ZWQuCisgIENvbnN0YW50ICpnZXRDb21wYXJlKENtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWVMYXR0aWNlRWxlbWVudCAmT3RoZXIpIGNvbnN0IHsKKyAgICBpZiAoaXNVbmRlZmluZWQoKSB8fCBPdGhlci5pc1VuZGVmaW5lZCgpKQorICAgICAgcmV0dXJuIFVuZGVmVmFsdWU6OmdldChUeSk7CisKKyAgICBpZiAoaXNDb25zdGFudCgpICYmIE90aGVyLmlzQ29uc3RhbnQoKSkKKyAgICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldENvbXBhcmUoUHJlZCwgZ2V0Q29uc3RhbnQoKSwgT3RoZXIuZ2V0Q29uc3RhbnQoKSk7CisKKyAgICAvLyBJbnRlZ2VyIGNvbnN0YW50cyBhcmUgcmVwcmVzZW50ZWQgYXMgQ29uc3RhbnRSYW5nZXMgd2l0aCBzaW5nbGUKKyAgICAvLyBlbGVtZW50cy4KKyAgICBpZiAoIWlzQ29uc3RhbnRSYW5nZSgpIHx8ICFPdGhlci5pc0NvbnN0YW50UmFuZ2UoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgY29uc3QgYXV0byAmQ1IgPSBnZXRDb25zdGFudFJhbmdlKCk7CisgICAgY29uc3QgYXV0byAmT3RoZXJDUiA9IE90aGVyLmdldENvbnN0YW50UmFuZ2UoKTsKKyAgICBpZiAoQ29uc3RhbnRSYW5nZTo6bWFrZVNhdGlzZnlpbmdJQ21wUmVnaW9uKFByZWQsIE90aGVyQ1IpLmNvbnRhaW5zKENSKSkKKyAgICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0VHJ1ZShUeSk7CisgICAgaWYgKENvbnN0YW50UmFuZ2U6Om1ha2VTYXRpc2Z5aW5nSUNtcFJlZ2lvbigKKyAgICAgICAgICAgIENtcEluc3Q6OmdldEludmVyc2VQcmVkaWNhdGUoUHJlZCksIE90aGVyQ1IpCisgICAgICAgICAgICAuY29udGFpbnMoQ1IpKQorICAgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXRGYWxzZShUeSk7CisKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorfTsKKworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBWYWx1ZUxhdHRpY2VFbGVtZW50ICZWYWwpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1ZhbHVlTGF0dGljZVV0aWxzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1ZhbHVlTGF0dGljZVV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDIwNzI2NwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVmFsdWVMYXR0aWNlVXRpbHMuaApAQCAtMCwwICsxLDQxIEBACisvLz09PS0tIFZhbHVlTGF0dGljZVV0aWxzLmggLSBVdGlscyBmb3Igc29sdmluZyBsYXR0aWNlcyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBjb21tb24gZnVuY3Rpb25zIHVzZWZ1bCBmb3IgcGVyZm9ybWluZyBkYXRhLWZsb3cgYW5hbHlzZXMKKy8vIHRoYXQgcHJvcGFnYXRlIHZhbHVlcyBhY3Jvc3MgZnVuY3Rpb24gYm91bmRhcmllcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfVkFMVUVMQVRUSUNFVVRJTFNfSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX1ZBTFVFTEFUVElDRVVUSUxTX0gKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEdsb2JhbFZhcmlhYmxlOworCisvLy8gRGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZXMgb2YgdGhlIGdpdmVuIGZ1bmN0aW9uJ3MgYXJndW1lbnRzIGNhbiBiZSB0cmFja2VkCisvLy8gaW50ZXJwcm9jZWR1cmFsbHkuIFRoZSB2YWx1ZSBvZiBhbiBhcmd1bWVudCBjYW4gYmUgdHJhY2tlZCBpZiB0aGUgZnVuY3Rpb24KKy8vLyBoYXMgbG9jYWwgbGlua2FnZSBhbmQgaXRzIGFkZHJlc3MgaXMgbm90IHRha2VuLgorYm9vbCBjYW5UcmFja0FyZ3VtZW50c0ludGVycHJvY2VkdXJhbGx5KEZ1bmN0aW9uICpGKTsKKworLy8vIERldGVybWluZSBpZiB0aGUgdmFsdWVzIG9mIHRoZSBnaXZlbiBmdW5jdGlvbidzIHJldHVybnMgY2FuIGJlIHRyYWNrZWQKKy8vLyBpbnRlcnByb2NlZHVyYWxseS4gUmV0dXJuIHZhbHVlcyBjYW4gYmUgdHJhY2tlZCBpZiB0aGUgZnVuY3Rpb24gaGFzIGFuCisvLy8gZXhhY3QgZGVmaW5pdGlvbiBhbmQgaXQgZG9lc24ndCBoYXZlIHRoZSAibmFrZWQiIGF0dHJpYnV0ZS4gTmFrZWQgZnVuY3Rpb25zCisvLy8gbWF5IGNvbnRhaW4gYXNzZW1ibHkgY29kZSB0aGF0IHJldHVybnMgdW50cmFja2FibGUgdmFsdWVzLgorYm9vbCBjYW5UcmFja1JldHVybnNJbnRlcnByb2NlZHVyYWxseShGdW5jdGlvbiAqRik7CisKKy8vLyBEZXRlcm1pbmUgaWYgdGhlIHZhbHVlIG1haW50YWluZWQgaW4gdGhlIGdpdmVuIGdsb2JhbCB2YXJpYWJsZSBjYW4gYmUKKy8vLyB0cmFja2VkIGludGVycHJvY2VkdXJhbGx5LiBBIHZhbHVlIGNhbiBiZSB0cmFja2VkIGlmIHRoZSBnbG9iYWwgdmFyaWFibGUKKy8vLyBoYXMgbG9jYWwgbGlua2FnZSBhbmQgaXMgb25seSB1c2VkIGJ5IG5vbi12b2xhdGlsZSBsb2FkcyBhbmQgc3RvcmVzLgorYm9vbCBjYW5UcmFja0dsb2JhbFZhcmlhYmxlSW50ZXJwcm9jZWR1cmFsbHkoR2xvYmFsVmFyaWFibGUgKkdWKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQU5BTFlTSVNfVkFMVUVMQVRUSUNFVVRJTFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9WYWx1ZVRyYWNraW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FuYWx5c2lzL1ZhbHVlVHJhY2tpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZWQ5NWRmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9WYWx1ZVRyYWNraW5nLmgKQEAgLTAsMCArMSw1NTkgQEAKKy8vPT09LSBsbHZtL0FuYWx5c2lzL1ZhbHVlVHJhY2tpbmcuaCAtIFdhbGsgY29tcHV0YXRpb25zIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHJvdXRpbmVzIHRoYXQgaGVscCBhbmFseXplIHByb3BlcnRpZXMgdGhhdCBjaGFpbnMgb2YKKy8vIGNvbXB1dGF0aW9ucyBoYXZlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9BTkFMWVNJU19WQUxVRVRSQUNLSU5HX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19WQUxVRVRSQUNLSU5HX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFkZE9wZXJhdG9yOworY2xhc3MgQVBJbnQ7CitjbGFzcyBBc3N1bXB0aW9uQ2FjaGU7CitjbGFzcyBEYXRhTGF5b3V0OworY2xhc3MgRG9taW5hdG9yVHJlZTsKK2NsYXNzIEdFUE9wZXJhdG9yOworY2xhc3MgSW50cmluc2ljSW5zdDsKK3N0cnVjdCBLbm93bkJpdHM7CitjbGFzcyBMb29wOworY2xhc3MgTG9vcEluZm87CitjbGFzcyBNRE5vZGU7CitjbGFzcyBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyOworY2xhc3MgU3RyaW5nUmVmOworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CitjbGFzcyBWYWx1ZTsKKworICAvLy8gRGV0ZXJtaW5lIHdoaWNoIGJpdHMgb2YgViBhcmUga25vd24gdG8gYmUgZWl0aGVyIHplcm8gb3Igb25lIGFuZCByZXR1cm4KKyAgLy8vIHRoZW0gaW4gdGhlIEtub3duWmVyby9Lbm93bk9uZSBiaXQgc2V0cy4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlZmluZWQgb24gdmFsdWVzIHdpdGggaW50ZWdlciB0eXBlLCB2YWx1ZXMgd2l0aCBwb2ludGVyCisgIC8vLyB0eXBlLCBhbmQgdmVjdG9ycyBvZiBpbnRlZ2Vycy4gIEluIHRoZSBjYXNlCisgIC8vLyB3aGVyZSBWIGlzIGEgdmVjdG9yLCB0aGUga25vd24gemVybyBhbmQga25vd24gb25lIHZhbHVlcyBhcmUgdGhlCisgIC8vLyBzYW1lIHdpZHRoIGFzIHRoZSB2ZWN0b3IgZWxlbWVudCwgYW5kIHRoZSBiaXQgaXMgc2V0IG9ubHkgaWYgaXQgaXMgdHJ1ZQorICAvLy8gZm9yIGFsbCBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHZlY3Rvci4KKyAgdm9pZCBjb21wdXRlS25vd25CaXRzKGNvbnN0IFZhbHVlICpWLCBLbm93bkJpdHMgJktub3duLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwsIHVuc2lnbmVkIERlcHRoID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFzc3VtcHRpb25DYWNoZSAqQUMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkN4dEkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciAqT1JFID0gbnVsbHB0cik7CisKKyAgLy8vIFJldHVybnMgdGhlIGtub3duIGJpdHMgcmF0aGVyIHRoYW4gcGFzc2luZyBieSByZWZlcmVuY2UuCisgIEtub3duQml0cyBjb21wdXRlS25vd25CaXRzKGNvbnN0IFZhbHVlICpWLCBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwLCBBc3N1bXB0aW9uQ2FjaGUgKkFDID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkN4dEkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgKk9SRSA9IG51bGxwdHIpOworCisgIC8vLyBDb21wdXRlIGtub3duIGJpdHMgZnJvbSB0aGUgcmFuZ2UgbWV0YWRhdGEuCisgIC8vLyBccCBLbm93blplcm8gdGhlIHNldCBvZiBiaXRzIHRoYXQgYXJlIGtub3duIHRvIGJlIHplcm8KKyAgLy8vIFxwIEtub3duT25lIHRoZSBzZXQgb2YgYml0cyB0aGF0IGFyZSBrbm93biB0byBiZSBvbmUKKyAgdm9pZCBjb21wdXRlS25vd25CaXRzRnJvbVJhbmdlTWV0YWRhdGEoY29uc3QgTUROb2RlICZSYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duQml0cyAmS25vd24pOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBMSFMgYW5kIFJIUyBoYXZlIG5vIGNvbW1vbiBiaXRzIHNldC4KKyAgYm9vbCBoYXZlTm9Db21tb25CaXRzU2V0KGNvbnN0IFZhbHVlICpMSFMsIGNvbnN0IFZhbHVlICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc3VtcHRpb25DYWNoZSAqQUMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkN4dEkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGtub3duIHRvIGhhdmUgZXhhY3RseSBvbmUgYml0IHNldCB3aGVuCisgIC8vLyBkZWZpbmVkLiBGb3IgdmVjdG9ycyByZXR1cm4gdHJ1ZSBpZiBldmVyeSBlbGVtZW50IGlzIGtub3duIHRvIGJlIGEgcG93ZXIKKyAgLy8vIG9mIHR3byB3aGVuIGRlZmluZWQuIFN1cHBvcnRzIHZhbHVlcyB3aXRoIGludGVnZXIgb3IgcG9pbnRlciB0eXBlIGFuZAorICAvLy8gdmVjdG9ycyBvZiBpbnRlZ2Vycy4gSWYgJ09yWmVybycgaXMgc2V0LCB0aGVuIHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbgorICAvLy8gdmFsdWUgaXMgZWl0aGVyIGEgcG93ZXIgb2YgdHdvIG9yIHplcm8uCisgIGJvb2wgaXNLbm93blRvQmVBUG93ZXJPZlR3byhjb25zdCBWYWx1ZSAqViwgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9yWmVybyA9IGZhbHNlLCB1bnNpZ25lZCBEZXB0aCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3N1bXB0aW9uQ2FjaGUgKkFDID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpDeHRJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0cik7CisKKyAgYm9vbCBpc09ubHlVc2VkSW5aZXJvRXF1YWxpdHlDb21wYXJpc29uKGNvbnN0IEluc3RydWN0aW9uICpDeHRJKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGtub3duIHRvIGJlIG5vbi16ZXJvIHdoZW4gZGVmaW5lZC4gRm9yCisgIC8vLyB2ZWN0b3JzLCByZXR1cm4gdHJ1ZSBpZiBldmVyeSBlbGVtZW50IGlzIGtub3duIHRvIGJlIG5vbi16ZXJvIHdoZW4KKyAgLy8vIGRlZmluZWQuIEZvciBwb2ludGVycywgaWYgdGhlIGNvbnRleHQgaW5zdHJ1Y3Rpb24gYW5kIGRvbWluYXRvciB0cmVlIGFyZQorICAvLy8gc3BlY2lmaWVkLCBwZXJmb3JtIGNvbnRleHQtc2Vuc2l0aXZlIGFuYWx5c2lzIGFuZCByZXR1cm4gdHJ1ZSBpZiB0aGUKKyAgLy8vIHBvaW50ZXIgY291bGRuJ3QgcG9zc2libHkgYmUgbnVsbCBhdCB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLgorICAvLy8gU3VwcG9ydHMgdmFsdWVzIHdpdGggaW50ZWdlciBvciBwb2ludGVyIHR5cGUgYW5kIHZlY3RvcnMgb2YgaW50ZWdlcnMuCisgIGJvb2wgaXNLbm93bk5vblplcm8oY29uc3QgVmFsdWUgKlYsIGNvbnN0IERhdGFMYXlvdXQgJkRMLCB1bnNpZ25lZCBEZXB0aCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgQXNzdW1wdGlvbkNhY2hlICpBQyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkN4dEkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0cik7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZSB2YWx1ZSBpcyBrbm93biB0byBiZSBub24tbmVnYXRpdmUuCisgIGJvb2wgaXNLbm93bk5vbk5lZ2F0aXZlKGNvbnN0IFZhbHVlICpWLCBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBc3N1bXB0aW9uQ2FjaGUgKkFDID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkN4dEkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGtub3duIGJlIHBvc2l0aXZlIChpLmUuIG5vbi1uZWdhdGl2ZQorICAvLy8gYW5kIG5vbi16ZXJvKS4KKyAgYm9vbCBpc0tub3duUG9zaXRpdmUoY29uc3QgVmFsdWUgKlYsIGNvbnN0IERhdGFMYXlvdXQgJkRMLCB1bnNpZ25lZCBEZXB0aCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgIEFzc3VtcHRpb25DYWNoZSAqQUMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqQ3h0SSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0cik7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMga25vd24gYmUgbmVnYXRpdmUgKGkuZS4gbm9uLXBvc2l0aXZlCisgIC8vLyBhbmQgbm9uLXplcm8pLgorICBib29sIGlzS25vd25OZWdhdGl2ZShjb25zdCBWYWx1ZSAqViwgY29uc3QgRGF0YUxheW91dCAmREwsIHVuc2lnbmVkIERlcHRoID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgQXNzdW1wdGlvbkNhY2hlICpBQyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpDeHRJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHZhbHVlcyBhcmUga25vd24gdG8gYmUgbm9uLWVxdWFsIHdoZW4gZGVmaW5lZC4KKyAgLy8vIFN1cHBvcnRzIHNjYWxhciBpbnRlZ2VyIHR5cGVzIG9ubHkuCisgIGJvb2wgaXNLbm93bk5vbkVxdWFsKGNvbnN0IFZhbHVlICpWMSwgY29uc3QgVmFsdWUgKlYyLCBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICBBc3N1bXB0aW9uQ2FjaGUgKkFDID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqQ3h0SSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgJ1YgJiBNYXNrJyBpcyBrbm93biB0byBiZSB6ZXJvLiBXZSB1c2UgdGhpcyBwcmVkaWNhdGUgdG8KKyAgLy8vIHNpbXBsaWZ5IG9wZXJhdGlvbnMgZG93bnN0cmVhbS4gTWFzayBpcyBrbm93biB0byBiZSB6ZXJvIGZvciBiaXRzIHRoYXQgVgorICAvLy8gY2Fubm90IGhhdmUuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBpcyBkZWZpbmVkIG9uIHZhbHVlcyB3aXRoIGludGVnZXIgdHlwZSwgdmFsdWVzIHdpdGggcG9pbnRlcgorICAvLy8gdHlwZSwgYW5kIHZlY3RvcnMgb2YgaW50ZWdlcnMuICBJbiB0aGUgY2FzZQorICAvLy8gd2hlcmUgViBpcyBhIHZlY3RvciwgdGhlIG1hc2ssIGtub3duIHplcm8sIGFuZCBrbm93biBvbmUgdmFsdWVzIGFyZSB0aGUKKyAgLy8vIHNhbWUgd2lkdGggYXMgdGhlIHZlY3RvciBlbGVtZW50LCBhbmQgdGhlIGJpdCBpcyBzZXQgb25seSBpZiBpdCBpcyB0cnVlCisgIC8vLyBmb3IgYWxsIG9mIHRoZSBlbGVtZW50cyBpbiB0aGUgdmVjdG9yLgorICBib29sIE1hc2tlZFZhbHVlSXNaZXJvKGNvbnN0IFZhbHVlICpWLCBjb25zdCBBUEludCAmTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDAsIEFzc3VtcHRpb25DYWNoZSAqQUMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpDeHRJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIpOworCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgc2lnbiBiaXQgb2YgdGhlIHJlZ2lzdGVyIGlzIHJlcGxpY2F0ZWQgaW50bworICAvLy8gdGhlIG90aGVyIGJpdHMuIFdlIGtub3cgdGhhdCBhdCBsZWFzdCAxIGJpdCBpcyBhbHdheXMgZXF1YWwgdG8gdGhlIHNpZ24KKyAgLy8vIGJpdCAoaXRzZWxmKSwgYnV0IG90aGVyIGNhc2VzIGNhbiBnaXZlIHVzIGluZm9ybWF0aW9uLiBGb3IgZXhhbXBsZSwKKyAgLy8vIGltbWVkaWF0ZWx5IGFmdGVyIGFuICJhc2hyIFgsIDIiLCB3ZSBrbm93IHRoYXQgdGhlIHRvcCAzIGJpdHMgYXJlIGFsbAorICAvLy8gZXF1YWwgdG8gZWFjaCBvdGhlciwgc28gd2UgcmV0dXJuIDMuIEZvciB2ZWN0b3JzLCByZXR1cm4gdGhlIG51bWJlciBvZgorICAvLy8gc2lnbiBiaXRzIGZvciB0aGUgdmVjdG9yIGVsZW1lbnQgd2l0aCB0aGUgbWluaW51bSBudW1iZXIgb2Yga25vd24gc2lnbgorICAvLy8gYml0cy4KKyAgdW5zaWduZWQgQ29tcHV0ZU51bVNpZ25CaXRzKGNvbnN0IFZhbHVlICpPcCwgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDAsIEFzc3VtcHRpb25DYWNoZSAqQUMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkN4dEkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyKTsKKworICAvLy8gVGhpcyBmdW5jdGlvbiBjb21wdXRlcyB0aGUgaW50ZWdlciBtdWx0aXBsZSBvZiBCYXNlIHRoYXQgZXF1YWxzIFYuIElmCisgIC8vLyBzdWNjZXNzZnVsLCBpdCByZXR1cm5zIHRydWUgYW5kIHJldHVybnMgdGhlIG11bHRpcGxlIGluIE11bHRpcGxlLiBJZgorICAvLy8gdW5zdWNjZXNzZnVsLCBpdCByZXR1cm5zIGZhbHNlLiBBbHNvLCBpZiBWIGNhbiBiZSBzaW1wbGlmaWVkIHRvIGFuCisgIC8vLyBpbnRlZ2VyLCB0aGVuIHRoZSBzaW1wbGlmaWVkIFYgaXMgcmV0dXJuZWQgaW4gVmFsLiBMb29rIHRocm91Z2ggc2V4dCBvbmx5CisgIC8vLyBpZiBMb29rVGhyb3VnaFNFeHQ9dHJ1ZS4KKyAgYm9vbCBDb21wdXRlTXVsdGlwbGUoVmFsdWUgKlYsIHVuc2lnbmVkIEJhc2UsIFZhbHVlIComTXVsdGlwbGUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTG9va1Rocm91Z2hTRXh0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoID0gMCk7CisKKyAgLy8vIE1hcCBhIGNhbGwgaW5zdHJ1Y3Rpb24gdG8gYW4gaW50cmluc2ljIElELiAgTGliY2FsbHMgd2hpY2ggaGF2ZSBlcXVpdmFsZW50CisgIC8vLyBpbnRyaW5zaWNzIGFyZSB0cmVhdGVkIGFzLWlmIHRoZXkgd2VyZSBpbnRyaW5zaWNzLgorICBJbnRyaW5zaWM6OklEIGdldEludHJpbnNpY0ZvckNhbGxTaXRlKEltbXV0YWJsZUNhbGxTaXRlIElDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgd2UgY2FuIHByb3ZlIHRoYXQgdGhlIHNwZWNpZmllZCBGUCB2YWx1ZSBpcyBuZXZlciBlcXVhbCB0bworICAvLy8gLTAuMC4KKyAgYm9vbCBDYW5ub3RCZU5lZ2F0aXZlWmVybyhjb25zdCBWYWx1ZSAqViwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDApOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB3ZSBjYW4gcHJvdmUgdGhhdCB0aGUgc3BlY2lmaWVkIEZQIHZhbHVlIGlzIGVpdGhlciBOYU4gb3IKKyAgLy8vIG5ldmVyIGxlc3MgdGhhbiAtMC4wLgorICAvLy8KKyAgLy8vICAgICAgTmFOIC0tPiB0cnVlCisgIC8vLyAgICAgICArMCAtLT4gdHJ1ZQorICAvLy8gICAgICAgLTAgLS0+IHRydWUKKyAgLy8vICAgeCA+ICswIC0tPiB0cnVlCisgIC8vLyAgIHggPCAtMCAtLT4gZmFsc2UKKyAgYm9vbCBDYW5ub3RCZU9yZGVyZWRMZXNzVGhhblplcm8oY29uc3QgVmFsdWUgKlYsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmxvYXRpbmctcG9pbnQgc2NhbGFyIHZhbHVlIGlzIG5vdCBhIE5hTiBvciBpZiB0aGUKKyAgLy8vIGZsb2F0aW5nLXBvaW50IHZlY3RvciB2YWx1ZSBoYXMgbm8gTmFOIGVsZW1lbnRzLiBSZXR1cm4gZmFsc2UgaWYgYSB2YWx1ZQorICAvLy8gY291bGQgZXZlciBiZSBOYU4uCisgIGJvb2wgaXNLbm93bk5ldmVyTmFOKGNvbnN0IFZhbHVlICpWKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgd2UgY2FuIHByb3ZlIHRoYXQgdGhlIHNwZWNpZmllZCBGUCB2YWx1ZSdzIHNpZ24gYml0IGlzIDAuCisgIC8vLworICAvLy8gICAgICBOYU4gLS0+IHRydWUvZmFsc2UgKGRlcGVuZGluZyBvbiB0aGUgTmFOJ3Mgc2lnbiBiaXQpCisgIC8vLyAgICAgICArMCAtLT4gdHJ1ZQorICAvLy8gICAgICAgLTAgLS0+IGZhbHNlCisgIC8vLyAgIHggPiArMCAtLT4gdHJ1ZQorICAvLy8gICB4IDwgLTAgLS0+IGZhbHNlCisgIGJvb2wgU2lnbkJpdE11c3RCZVplcm8oY29uc3QgVmFsdWUgKlYsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkpOworCisgIC8vLyBJZiB0aGUgc3BlY2lmaWVkIHZhbHVlIGNhbiBiZSBzZXQgYnkgcmVwZWF0aW5nIHRoZSBzYW1lIGJ5dGUgaW4gbWVtb3J5LAorICAvLy8gcmV0dXJuIHRoZSBpOCB2YWx1ZSB0aGF0IGl0IGlzIHJlcHJlc2VudGVkIHdpdGguIFRoaXMgaXMgdHJ1ZSBmb3IgYWxsIGk4CisgIC8vLyB2YWx1ZXMgb2J2aW91c2x5LCBidXQgaXMgYWxzbyB0cnVlIGZvciBpMzIgMCwgaTMyIC0xLCBpMTYgMHhGMEYwLCBkb3VibGUKKyAgLy8vIDAuMCBldGMuIElmIHRoZSB2YWx1ZSBjYW4ndCBiZSBoYW5kbGVkIHdpdGggYSByZXBlYXRlZCBieXRlIHN0b3JlIChlLmcuCisgIC8vLyBpMTYgMHgxMjM0KSwgcmV0dXJuIG51bGwuCisgIFZhbHVlICppc0J5dGV3aXNlVmFsdWUoVmFsdWUgKlYpOworCisgIC8vLyBHaXZlbiBhbiBhZ2dyZWdyYXRlIGFuZCBhbiBzZXF1ZW5jZSBvZiBpbmRpY2VzLCBzZWUgaWYgdGhlIHNjYWxhciB2YWx1ZQorICAvLy8gaW5kZXhlZCBpcyBhbHJlYWR5IGFyb3VuZCBhcyBhIHJlZ2lzdGVyLCBmb3IgZXhhbXBsZSBpZiBpdCB3ZXJlIGluc2VydGVkCisgIC8vLyBkaXJlY3RseSBpbnRvIHRoZSBhZ2dyZWdyYXRlLgorICAvLy8KKyAgLy8vIElmIEluc2VydEJlZm9yZSBpcyBub3QgbnVsbCwgdGhpcyBmdW5jdGlvbiB3aWxsIGR1cGxpY2F0ZSAobW9kaWZpZWQpCisgIC8vLyBpbnNlcnR2YWx1ZXMgd2hlbiBhIHBhcnQgb2YgYSBuZXN0ZWQgc3RydWN0IGlzIGV4dHJhY3RlZC4KKyAgVmFsdWUgKkZpbmRJbnNlcnRlZFZhbHVlKFZhbHVlICpWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IGlkeF9yYW5nZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKworICAvLy8gQW5hbHl6ZSB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgdG8gc2VlIGlmIGl0IGNhbiBiZSBleHByZXNzZWQgYXMgYSBiYXNlCisgIC8vLyBwb2ludGVyIHBsdXMgYSBjb25zdGFudCBvZmZzZXQuIFJldHVybiB0aGUgYmFzZSBhbmQgb2Zmc2V0IHRvIHRoZSBjYWxsZXIuCisgIFZhbHVlICpHZXRQb2ludGVyQmFzZVdpdGhDb25zdGFudE9mZnNldChWYWx1ZSAqUHRyLCBpbnQ2NF90ICZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCk7CisgIGlubGluZSBjb25zdCBWYWx1ZSAqR2V0UG9pbnRlckJhc2VXaXRoQ29uc3RhbnRPZmZzZXQoY29uc3QgVmFsdWUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwpIHsKKyAgICByZXR1cm4gR2V0UG9pbnRlckJhc2VXaXRoQ29uc3RhbnRPZmZzZXQoY29uc3RfY2FzdDxWYWx1ZSAqPihQdHIpLCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERMKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIEdFUCBpcyBiYXNlZCBvbiBhIHBvaW50ZXIgdG8gYSBzdHJpbmcgKGFycmF5IG9mCisgIC8vIFxwIENoYXJTaXplIGludGVnZXJzKSBhbmQgaXMgaW5kZXhpbmcgaW50byB0aGlzIHN0cmluZy4KKyAgYm9vbCBpc0dFUEJhc2VkT25Qb2ludGVyVG9TdHJpbmcoY29uc3QgR0VQT3BlcmF0b3IgKkdFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ2hhclNpemUgPSA4KTsKKworICAvLy8gUmVwcmVzZW50cyBvZmZzZXQrbGVuZ3RoIGludG8gYSBDb25zdGFudERhdGFBcnJheS4KKyAgc3RydWN0IENvbnN0YW50RGF0YUFycmF5U2xpY2UgeworICAgIC8vLyBDb25zdGFudERhdGFBcnJheSBwb2ludGVyLiBudWxscHRyIGluZGljYXRlcyBhIHplcm9pbml0aWFsaXplciAoYSB2YWxpZAorICAgIC8vLyBpbml0aWFsaXplciwgaXQganVzdCBkb2Vzbid0IGZpdCB0aGUgQ29uc3RhbnREYXRhQXJyYXkgaW50ZXJmYWNlKS4KKyAgICBjb25zdCBDb25zdGFudERhdGFBcnJheSAqQXJyYXk7CisKKyAgICAvLy8gU2xpY2Ugc3RhcnRzIGF0IHRoaXMgT2Zmc2V0LgorICAgIHVpbnQ2NF90IE9mZnNldDsKKworICAgIC8vLyBMZW5ndGggb2YgdGhlIHNsaWNlLgorICAgIHVpbnQ2NF90IExlbmd0aDsKKworICAgIC8vLyBNb3ZlcyB0aGUgT2Zmc2V0IGFuZCBhZGp1c3RzIExlbmd0aCBhY2NvcmRpbmdseS4KKyAgICB2b2lkIG1vdmUodWludDY0X3QgRGVsdGEpIHsKKyAgICAgIGFzc2VydChEZWx0YSA8IExlbmd0aCk7CisgICAgICBPZmZzZXQgKz0gRGVsdGE7CisgICAgICBMZW5ndGggLT0gRGVsdGE7CisgICAgfQorCisgICAgLy8vIENvbnZlbmllbmNlIGFjY2Vzc29yIGZvciBlbGVtZW50cyBpbiB0aGUgc2xpY2UuCisgICAgdWludDY0X3Qgb3BlcmF0b3JbXSh1bnNpZ25lZCBJKSBjb25zdCB7CisgICAgICByZXR1cm4gQXJyYXk9PW51bGxwdHIgPyAwIDogQXJyYXktPmdldEVsZW1lbnRBc0ludGVnZXIoSSArIE9mZnNldCk7CisgICAgfQorICB9OworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHZhbHVlIFxwIFYgaXMgYSBwb2ludGVyIGludG8gYSBDb25zdGFudERhdGFBcnJheS4KKyAgLy8vIElmIHN1Y2Nlc3NmdWwgXHAgU2xpY2Ugd2lsbCBwb2ludCB0byBhIENvbnN0YW50RGF0YUFycmF5IGluZm8gb2JqZWN0CisgIC8vLyB3aXRoIGFuIGFwcHJvcHJpYXRlIG9mZnNldC4KKyAgYm9vbCBnZXRDb25zdGFudERhdGFBcnJheUluZm8oY29uc3QgVmFsdWUgKlYsIENvbnN0YW50RGF0YUFycmF5U2xpY2UgJlNsaWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFbGVtZW50U2l6ZSwgdWludDY0X3QgT2Zmc2V0ID0gMCk7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gY29tcHV0ZXMgdGhlIGxlbmd0aCBvZiBhIG51bGwtdGVybWluYXRlZCBDIHN0cmluZyBwb2ludGVkIHRvCisgIC8vLyBieSBWLiBJZiBzdWNjZXNzZnVsLCBpdCByZXR1cm5zIHRydWUgYW5kIHJldHVybnMgdGhlIHN0cmluZyBpbiBTdHIuIElmCisgIC8vLyB1bnN1Y2Nlc3NmdWwsIGl0IHJldHVybnMgZmFsc2UuIFRoaXMgZG9lcyBub3QgaW5jbHVkZSB0aGUgdHJhaWxpbmcgbnVsbAorICAvLy8gY2hhcmFjdGVyIGJ5IGRlZmF1bHQuIElmIFRyaW1BdE51bCBpcyBzZXQgdG8gZmFsc2UsIHRoZW4gdGhpcyByZXR1cm5zIGFueQorICAvLy8gdHJhaWxpbmcgbnVsbCBjaGFyYWN0ZXJzIGFzIHdlbGwgYXMgYW55IG90aGVyIGNoYXJhY3RlcnMgdGhhdCBjb21lIGFmdGVyCisgIC8vLyBpdC4KKyAgYm9vbCBnZXRDb25zdGFudFN0cmluZ0luZm8oY29uc3QgVmFsdWUgKlYsIFN0cmluZ1JlZiAmU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXQgPSAwLCBib29sIFRyaW1BdE51bCA9IHRydWUpOworCisgIC8vLyBJZiB3ZSBjYW4gY29tcHV0ZSB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgcG9pbnRlZCB0byBieSB0aGUgc3BlY2lmaWVkCisgIC8vLyBwb2ludGVyLCByZXR1cm4gJ2xlbisxJy4gIElmIHdlIGNhbid0LCByZXR1cm4gMC4KKyAgdWludDY0X3QgR2V0U3RyaW5nTGVuZ3RoKGNvbnN0IFZhbHVlICpWLCB1bnNpZ25lZCBDaGFyU2l6ZSA9IDgpOworCisgIC8vLyBUaGlzIG1ldGhvZCBzdHJpcHMgb2ZmIGFueSBHRVAgYWRkcmVzcyBhZGp1c3RtZW50cyBhbmQgcG9pbnRlciBjYXN0cyBmcm9tCisgIC8vLyB0aGUgc3BlY2lmaWVkIHZhbHVlLCByZXR1cm5pbmcgdGhlIG9yaWdpbmFsIG9iamVjdCBiZWluZyBhZGRyZXNzZWQuIE5vdGUKKyAgLy8vIHRoYXQgdGhlIHJldHVybmVkIHZhbHVlIGhhcyBwb2ludGVyIHR5cGUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBkb2VzLiBJZgorICAvLy8gdGhlIE1heExvb2t1cCB2YWx1ZSBpcyBub24temVybywgaXQgbGltaXRzIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHRvCisgIC8vLyBiZSBzdHJpcHBlZCBvZmYuCisgIFZhbHVlICpHZXRVbmRlcmx5aW5nT2JqZWN0KFZhbHVlICpWLCBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF4TG9va3VwID0gNik7CisgIGlubGluZSBjb25zdCBWYWx1ZSAqR2V0VW5kZXJseWluZ09iamVjdChjb25zdCBWYWx1ZSAqViwgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNYXhMb29rdXAgPSA2KSB7CisgICAgcmV0dXJuIEdldFVuZGVybHlpbmdPYmplY3QoY29uc3RfY2FzdDxWYWx1ZSAqPihWKSwgREwsIE1heExvb2t1cCk7CisgIH0KKworICAvLy8gXGJyaWVmIFRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8gR2V0VW5kZXJseWluZ09iamVjdCBleGNlcHQgdGhhdCBpdCBjYW4KKyAgLy8vIGxvb2sgdGhyb3VnaCBwaGkgYW5kIHNlbGVjdCBpbnN0cnVjdGlvbnMgYW5kIHJldHVybiBtdWx0aXBsZSBvYmplY3RzLgorICAvLy8KKyAgLy8vIElmIExvb3BJbmZvIGlzIHBhc3NlZCwgbG9vcCBwaGlzIGFyZSBmdXJ0aGVyIGFuYWx5emVkLiAgSWYgYSBwb2ludGVyCisgIC8vLyBhY2Nlc3NlcyBkaWZmZXJlbnQgb2JqZWN0cyBpbiBlYWNoIGl0ZXJhdGlvbiwgd2UgZG9uJ3QgbG9vayB0aHJvdWdoIHRoZQorICAvLy8gcGhpIG5vZGUuIEUuZy4gY29uc2lkZXIgdGhpcyBsb29wIG5lc3Q6CisgIC8vLworICAvLy8gICBpbnQgKipBOworICAvLy8gICBmb3IgKGkpCisgIC8vLyAgICAgZm9yIChqKSB7CisgIC8vLyAgICAgICAgQVtpXVtqXSA9IEFbaS0xXVtqXSAqIEJbal0KKyAgLy8vICAgICB9CisgIC8vLworICAvLy8gVGhpcyBpcyB0cmFuc2Zvcm1lZCBieSBMb2FkLVBSRSB0byBzdGFzaCBhd2F5IEFbaV0gZm9yIHRoZSBuZXh0IGl0ZXJhdGlvbgorICAvLy8gb2YgdGhlIG91dGVyIGxvb3A6CisgIC8vLworICAvLy8gICBDdXJyID0gQVswXTsgICAgICAgICAgLy8gUHJldl8wCisgIC8vLyAgIGZvciAoaTogMS4uTikgeworICAvLy8gICAgIFByZXYgPSBDdXJyOyAgICAgICAgLy8gUHJldiA9IFBISSAoUHJldl8wLCBDdXJyKQorICAvLy8gICAgIEN1cnIgPSBBW2ldOworICAvLy8gICAgIGZvciAoajogMC4uTikgeworICAvLy8gICAgICAgIEN1cnJbal0gPSBQcmV2W2pdICogQltqXQorICAvLy8gICAgIH0KKyAgLy8vICAgfQorICAvLy8KKyAgLy8vIFNpbmNlIEFbaV0gYW5kIEFbaS0xXSBhcmUgaW5kZXBlbmRlbnQgcG9pbnRlcnMsIGdldFVuZGVybHlpbmdPYmplY3RzCisgIC8vLyBzaG91bGQgbm90IGFzc3VtZSB0aGF0IEN1cnIgYW5kIFByZXYgc2hhcmUgdGhlIHNhbWUgdW5kZXJseWluZyBvYmplY3QgdGh1cworICAvLy8gaXQgc2hvdWxkbid0IGxvb2sgdGhyb3VnaCB0aGUgcGhpIGFib3ZlLgorICB2b2lkIEdldFVuZGVybHlpbmdPYmplY3RzKFZhbHVlICpWLCBTbWFsbFZlY3RvckltcGw8VmFsdWUgKj4gJk9iamVjdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwsIExvb3BJbmZvICpMSSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF4TG9va3VwID0gNik7CisKKyAgLy8vIFRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZCBHZXRVbmRlcmx5aW5nT2JqZWN0cyBhbmQgYWRkcyBzdXBwb3J0IGZvciBiYXNpYworICAvLy8gcHRydG9pbnQrYXJpdGhtZXRpYytpbnR0b3B0ciBzZXF1ZW5jZXMuCisgIGJvb2wgZ2V0VW5kZXJseWluZ09iamVjdHNGb3JDb2RlR2VuKGNvbnN0IFZhbHVlICpWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxWYWx1ZSAqPiAmT2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBvbmx5IHVzZXJzIG9mIHRoaXMgcG9pbnRlciBhcmUgbGlmZXRpbWUgbWFya2Vycy4KKyAgYm9vbCBvbmx5VXNlZEJ5TGlmZXRpbWVNYXJrZXJzKGNvbnN0IFZhbHVlICpWKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGRvZXMgbm90IGhhdmUgYW55IGVmZmVjdHMgYmVzaWRlcworICAvLy8gY2FsY3VsYXRpbmcgdGhlIHJlc3VsdCBhbmQgZG9lcyBub3QgaGF2ZSB1bmRlZmluZWQgYmVoYXZpb3IuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgbmV2ZXIgcmV0dXJucyB0cnVlIGZvciBhbiBpbnN0cnVjdGlvbiB0aGF0IHJldHVybnMgdHJ1ZSBmb3IKKyAgLy8vIG1heUhhdmVTaWRlRWZmZWN0czsgaG93ZXZlciwgdGhpcyBtZXRob2QgYWxzbyBkb2VzIHNvbWUgb3RoZXIgY2hlY2tzIGluCisgIC8vLyBhZGRpdGlvbi4gSXQgY2hlY2tzIGZvciB1bmRlZmluZWQgYmVoYXZpb3IsIGxpa2UgZGl2aWRpbmcgYnkgemVybyBvcgorICAvLy8gbG9hZGluZyBmcm9tIGFuIGludmFsaWQgcG9pbnRlciAoYnV0IG5vdCBmb3IgdW5kZWZpbmVkIHJlc3VsdHMsIGxpa2UgYQorICAvLy8gc2hpZnQgd2l0aCBhIHNoaWZ0IGFtb3VudCBsYXJnZXIgdGhhbiB0aGUgd2lkdGggb2YgdGhlIHJlc3VsdCkuIEl0IGNoZWNrcworICAvLy8gZm9yIG1hbGxvYyBhbmQgYWxsb2NhIGJlY2F1c2Ugc3BlY3VsYXRpdmVseSBleGVjdXRpbmcgdGhlbSBtaWdodCBjYXVzZSBhCisgIC8vLyBtZW1vcnkgbGVhay4gSXQgYWxzbyByZXR1cm5zIGZhbHNlIGZvciBpbnN0cnVjdGlvbnMgcmVsYXRlZCB0byBjb250cm9sCisgIC8vLyBmbG93LCBzcGVjaWZpY2FsbHkgdGVybWluYXRvcnMgYW5kIFBISSBub2Rlcy4KKyAgLy8vCisgIC8vLyBJZiB0aGUgQ3R4SSBpcyBzcGVjaWZpZWQgdGhpcyBtZXRob2QgcGVyZm9ybXMgY29udGV4dC1zZW5zaXRpdmUgYW5hbHlzaXMKKyAgLy8vIGFuZCByZXR1cm5zIHRydWUgaWYgaXQgaXMgc2FmZSB0byBleGVjdXRlIHRoZSBpbnN0cnVjdGlvbiBpbW1lZGlhdGVseQorICAvLy8gYmVmb3JlIHRoZSBDdHhJLgorICAvLy8KKyAgLy8vIElmIHRoZSBDdHhJIGlzIE5PVCBzcGVjaWZpZWQgdGhpcyBtZXRob2Qgb25seSBsb29rcyBhdCB0aGUgaW5zdHJ1Y3Rpb24KKyAgLy8vIGl0c2VsZiBhbmQgaXRzIG9wZXJhbmRzLCBzbyBpZiB0aGlzIG1ldGhvZCByZXR1cm5zIHRydWUsIGl0IGlzIHNhZmUgdG8KKyAgLy8vIG1vdmUgdGhlIGluc3RydWN0aW9uIGFzIGxvbmcgYXMgdGhlIGNvcnJlY3QgZG9taW5hbmNlIHJlbGF0aW9uc2hpcHMgZm9yCisgIC8vLyB0aGUgb3BlcmFuZHMgYW5kIHVzZXJzIGhvbGQuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgY2FuIHJldHVybiB0cnVlIGZvciBpbnN0cnVjdGlvbnMgdGhhdCByZWFkIG1lbW9yeTsKKyAgLy8vIGZvciBzdWNoIGluc3RydWN0aW9ucywgbW92aW5nIHRoZW0gbWF5IGNoYW5nZSB0aGUgcmVzdWx0aW5nIHZhbHVlLgorICBib29sIGlzU2FmZVRvU3BlY3VsYXRpdmVseUV4ZWN1dGUoY29uc3QgVmFsdWUgKlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqQ3R4SSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHJlc3VsdCBvciBlZmZlY3RzIG9mIHRoZSBnaXZlbiBpbnN0cnVjdGlvbnMgXHAgSQorICAvLy8gZGVwZW5kIG9uIG9yIGluZmx1ZW5jZSBnbG9iYWwgbWVtb3J5LgorICAvLy8gTWVtb3J5IGRlcGVuZGVuY2UgYXJpc2VzIGZvciBleGFtcGxlIGlmIHRoZSBpbnN0cnVjdGlvbiByZWFkcyBmcm9tCisgIC8vLyBtZW1vcnkgb3IgbWF5IHByb2R1Y2UgZWZmZWN0cyBvciB1bmRlZmluZWQgYmVoYXZpb3VyLiBNZW1vcnkgZGVwZW5kZW50CisgIC8vLyBpbnN0cnVjdGlvbnMgZ2VuZXJhbGx5IGNhbm5vdCBiZSByZW9yZGVyZCB3aXRoIHJlc3BlY3QgdG8gb3RoZXIgbWVtb3J5CisgIC8vLyBkZXBlbmRlbnQgaW5zdHJ1Y3Rpb25zIG9yIG1vdmVkIGludG8gbm9uLWRvbWluYXRlZCBiYXNpYyBibG9ja3MuCisgIC8vLyBJbnN0cnVjdGlvbnMgd2hpY2gganVzdCBjb21wdXRlIGEgdmFsdWUgYmFzZWQgb24gdGhlIHZhbHVlcyBvZiB0aGVpcgorICAvLy8gb3BlcmFuZHMgYXJlIG5vdCBtZW1vcnkgZGVwZW5kZW50LgorICBib29sIG1heUJlTWVtb3J5RGVwZW5kZW50KGNvbnN0IEluc3RydWN0aW9uICZJKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgaXQgaXMgYW4gaW50cmluc2ljIHRoYXQgY2Fubm90IGJlIHNwZWN1bGF0ZWQgYnV0IGFsc28KKyAgLy8vIGNhbm5vdCB0cmFwLgorICBib29sIGlzQXNzdW1lTGlrZUludHJpbnNpYyhjb25zdCBJbnN0cnVjdGlvbiAqSSk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGl0IGlzIHZhbGlkIHRvIHVzZSB0aGUgYXNzdW1wdGlvbnMgcHJvdmlkZWQgYnkgYW4KKyAgLy8vIGFzc3VtZSBpbnRyaW5zaWMsIEksIGF0IHRoZSBwb2ludCBpbiB0aGUgY29udHJvbC1mbG93IGlkZW50aWZpZWQgYnkgdGhlCisgIC8vLyBjb250ZXh0IGluc3RydWN0aW9uLCBDeHRJLgorICBib29sIGlzVmFsaWRBc3N1bWVGb3JDb250ZXh0KGNvbnN0IEluc3RydWN0aW9uICpJLCBjb25zdCBJbnN0cnVjdGlvbiAqQ3h0SSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIpOworCisgIGVudW0gY2xhc3MgT3ZlcmZsb3dSZXN1bHQgeyBBbHdheXNPdmVyZmxvd3MsIE1heU92ZXJmbG93LCBOZXZlck92ZXJmbG93cyB9OworCisgIE92ZXJmbG93UmVzdWx0IGNvbXB1dGVPdmVyZmxvd0ZvclVuc2lnbmVkTXVsKGNvbnN0IFZhbHVlICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3N1bXB0aW9uQ2FjaGUgKkFDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqQ3h0SSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQpOworICBPdmVyZmxvd1Jlc3VsdCBjb21wdXRlT3ZlcmZsb3dGb3JVbnNpZ25lZEFkZChjb25zdCBWYWx1ZSAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzdW1wdGlvbkNhY2hlICpBQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkN4dEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbWluYXRvclRyZWUgKkRUKTsKKyAgT3ZlcmZsb3dSZXN1bHQgY29tcHV0ZU92ZXJmbG93Rm9yU2lnbmVkQWRkKGNvbnN0IFZhbHVlICpMSFMsIGNvbnN0IFZhbHVlICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc3VtcHRpb25DYWNoZSAqQUMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkN4dEkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyKTsKKyAgLy8vIFRoaXMgdmVyc2lvbiBhbHNvIGxldmVyYWdlcyB0aGUgc2lnbiBiaXQgb2YgQWRkIGlmIGtub3duLgorICBPdmVyZmxvd1Jlc3VsdCBjb21wdXRlT3ZlcmZsb3dGb3JTaWduZWRBZGQoY29uc3QgQWRkT3BlcmF0b3IgKkFkZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNzdW1wdGlvbkNhY2hlICpBQyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqQ3h0SSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGFyaXRobWV0aWMgcGFydCBvZiB0aGUgXHAgSUkgJ3MgcmVzdWx0IGlzCisgIC8vLyB1c2VkIG9ubHkgYWxvbmcgdGhlIHBhdGhzIGNvbnRyb2wgZGVwZW5kZW50IG9uIHRoZSBjb21wdXRhdGlvbgorICAvLy8gbm90IG92ZXJmbG93aW5nLCBccCBJSSBiZWluZyBhbiA8b3A+LndpdGgub3ZlcmZsb3cgaW50cmluc2ljLgorICBib29sIGlzT3ZlcmZsb3dJbnRyaW5zaWNOb1dyYXAoY29uc3QgSW50cmluc2ljSW5zdCAqSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21pbmF0b3JUcmVlICZEVCk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgZnVuY3Rpb24gY2FuIHByb3ZlIHRoYXQgdGhlIGluc3RydWN0aW9uIEkgd2lsbAorICAvLy8gYWx3YXlzIHRyYW5zZmVyIGV4ZWN1dGlvbiB0byBvbmUgb2YgaXRzIHN1Y2Nlc3NvcnMgKGluY2x1ZGluZyB0aGUgbmV4dAorICAvLy8gaW5zdHJ1Y3Rpb24gdGhhdCBmb2xsb3dzIHdpdGhpbiBhIGJhc2ljIGJsb2NrKS4gRS5nLiB0aGlzIGlzIG5vdAorICAvLy8gZ3VhcmFudGVlZCBmb3IgZnVuY3Rpb24gY2FsbHMgdGhhdCBjb3VsZCBsb29wIGluZmluaXRlbHkuCisgIC8vLworICAvLy8gSW4gb3RoZXIgd29yZHMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgbWF5CisgIC8vLyB0cmFuc2ZlciBleGVjdXRpb24gb3IgZmFpbCB0byB0cmFuc2ZlciBleGVjdXRpb24gaW4gYSB3YXkgdGhhdCBpcyBub3QKKyAgLy8vIGNhcHR1cmVkIGluIHRoZSBDRkcgbm9yIGluIHRoZSBzZXF1ZW5jZSBvZiBpbnN0cnVjdGlvbnMgd2l0aGluIGEgYmFzaWMKKyAgLy8vIGJsb2NrLgorICAvLy8KKyAgLy8vIFVuZGVmaW5lZCBiZWhhdmlvciBpcyBhc3N1bWVkIG5vdCB0byBoYXBwZW4sIHNvIGUuZy4gZGl2aXNpb24gaXMKKyAgLy8vIGd1YXJhbnRlZWQgdG8gdHJhbnNmZXIgZXhlY3V0aW9uIHRvIHRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb24gZXZlbgorICAvLy8gdGhvdWdoIGRpdmlzaW9uIGJ5IHplcm8gbWlnaHQgY2F1c2UgdW5kZWZpbmVkIGJlaGF2aW9yLgorICBib29sIGlzR3VhcmFudGVlZFRvVHJhbnNmZXJFeGVjdXRpb25Ub1N1Y2Nlc3Nvcihjb25zdCBJbnN0cnVjdGlvbiAqSSk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGJsb2NrIGRvZXMgbm90IGNvbnRhaW4gYSBwb3RlbnRpYWwgaW1wbGljaXQgZXhpdC4KKyAgLy8vIFRoaXMgaXMgZXF1aXZlbGVudCB0byBzYXlpbmcgdGhhdCBhbGwgaW5zdHJ1Y3Rpb25zIHdpdGhpbiB0aGUgYmFzaWMgYmxvY2sKKyAgLy8vIGFyZSBndWFyYW50ZWVkIHRvIHRyYW5zZmVyIGV4ZWN1dGlvbiB0byB0aGVpciBzdWNjZXNzb3Igd2l0aGluIHRoZSBiYXNpYworICAvLy8gYmxvY2suIFRoaXMgaGFzIHRoZSBzYW1lIGFzc3VtcHRpb25zIHcuci50LiB1bmRlZmluZWQgYmVoYXZpb3IgYXMgdGhlCisgIC8vLyBpbnN0cnVjdGlvbiB2YXJpYW50IG9mIHRoaXMgZnVuY3Rpb24uIAorICBib29sIGlzR3VhcmFudGVlZFRvVHJhbnNmZXJFeGVjdXRpb25Ub1N1Y2Nlc3Nvcihjb25zdCBCYXNpY0Jsb2NrICpCQik7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgZnVuY3Rpb24gY2FuIHByb3ZlIHRoYXQgdGhlIGluc3RydWN0aW9uIEkKKyAgLy8vIGlzIGV4ZWN1dGVkIGZvciBldmVyeSBpdGVyYXRpb24gb2YgdGhlIGxvb3AgTC4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBjdXJyZW50bHkgb25seSBjb25zaWRlcnMgdGhlIGxvb3AgaGVhZGVyLgorICBib29sIGlzR3VhcmFudGVlZFRvRXhlY3V0ZUZvckV2ZXJ5SXRlcmF0aW9uKGNvbnN0IEluc3RydWN0aW9uICpJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKkwpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIGNhbiBwcm92ZSB0aGF0IEkgaXMgZ3VhcmFudGVlZCB0byB5aWVsZAorICAvLy8gZnVsbC1wb2lzb24gKGFsbCBiaXRzIHBvaXNvbikgaWYgYXQgbGVhc3Qgb25lIG9mIGl0cyBvcGVyYW5kcyBhcmUKKyAgLy8vIGZ1bGwtcG9pc29uIChhbGwgYml0cyBwb2lzb24pLgorICAvLy8KKyAgLy8vIFRoZSBleGFjdCBydWxlcyBmb3IgaG93IHBvaXNvbiBwcm9wYWdhdGVzIHRocm91Z2ggaW5zdHJ1Y3Rpb25zIGhhdmUKKyAgLy8vIG5vdCBiZWVuIHNldHRsZWQgYXMgb2YgMjAxNS0wNy0xMCwgc28gdGhpcyBmdW5jdGlvbiBpcyBjb25zZXJ2YXRpdmUKKyAgLy8vIGFuZCBvbmx5IGNvbnNpZGVycyBwb2lzb24gdG8gYmUgcHJvcGFnYXRlZCBpbiB1bmNvbnRyb3ZlcnNpYWwKKyAgLy8vIGNhc2VzLiBUaGVyZSBpcyBubyBhdHRlbXB0IHRvIHRyYWNrIHZhbHVlcyB0aGF0IG1heSBiZSBvbmx5IHBhcnRpYWxseQorICAvLy8gcG9pc29uLgorICBib29sIHByb3BhZ2F0ZXNGdWxsUG9pc29uKGNvbnN0IEluc3RydWN0aW9uICpJKTsKKworICAvLy8gUmV0dXJuIGVpdGhlciBudWxscHRyIG9yIGFuIG9wZXJhbmQgb2YgSSBzdWNoIHRoYXQgSSB3aWxsIHRyaWdnZXIKKyAgLy8vIHVuZGVmaW5lZCBiZWhhdmlvciBpZiBJIGlzIGV4ZWN1dGVkIGFuZCB0aGF0IG9wZXJhbmQgaGFzIGEgZnVsbC1wb2lzb24KKyAgLy8vIHZhbHVlIChhbGwgYml0cyBwb2lzb24pLgorICBjb25zdCBWYWx1ZSAqZ2V0R3VhcmFudGVlZE5vbkZ1bGxQb2lzb25PcChjb25zdCBJbnN0cnVjdGlvbiAqSSk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgZnVuY3Rpb24gY2FuIHByb3ZlIHRoYXQgaWYgUG9pc29uSSBpcyBleGVjdXRlZAorICAvLy8gYW5kIHlpZWxkcyBhIGZ1bGwtcG9pc29uIHZhbHVlIChhbGwgYml0cyBwb2lzb24pLCB0aGVuIHRoYXQgd2lsbAorICAvLy8gdHJpZ2dlciB1bmRlZmluZWQgYmVoYXZpb3IuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgY3VycmVudGx5IG9ubHkgY29uc2lkZXJzIHRoZSBiYXNpYyBibG9jayB0aGF0IGlzCisgIC8vLyB0aGUgcGFyZW50IG9mIEkuCisgIGJvb2wgcHJvZ3JhbVVuZGVmaW5lZElmRnVsbFBvaXNvbihjb25zdCBJbnN0cnVjdGlvbiAqUG9pc29uSSk7CisKKyAgLy8vIFxicmllZiBTcGVjaWZpYyBwYXR0ZXJucyBvZiBzZWxlY3QgaW5zdHJ1Y3Rpb25zIHdlIGNhbiBtYXRjaC4KKyAgZW51bSBTZWxlY3RQYXR0ZXJuRmxhdm9yIHsKKyAgICBTUEZfVU5LTk9XTiA9IDAsCisgICAgU1BGX1NNSU4sICAgICAgICAgICAgICAgICAgIC8vLyBTaWduZWQgbWluaW11bQorICAgIFNQRl9VTUlOLCAgICAgICAgICAgICAgICAgICAvLy8gVW5zaWduZWQgbWluaW11bQorICAgIFNQRl9TTUFYLCAgICAgICAgICAgICAgICAgICAvLy8gU2lnbmVkIG1heGltdW0KKyAgICBTUEZfVU1BWCwgICAgICAgICAgICAgICAgICAgLy8vIFVuc2lnbmVkIG1heGltdW0KKyAgICBTUEZfRk1JTk5VTSwgICAgICAgICAgICAgICAgLy8vIEZsb2F0aW5nIHBvaW50IG1pbm51bQorICAgIFNQRl9GTUFYTlVNLCAgICAgICAgICAgICAgICAvLy8gRmxvYXRpbmcgcG9pbnQgbWF4bnVtCisgICAgU1BGX0FCUywgICAgICAgICAgICAgICAgICAgIC8vLyBBYnNvbHV0ZSB2YWx1ZQorICAgIFNQRl9OQUJTICAgICAgICAgICAgICAgICAgICAvLy8gTmVnYXRlZCBhYnNvbHV0ZSB2YWx1ZQorICB9OworCisgIC8vLyBcYnJpZWYgQmVoYXZpb3Igd2hlbiBhIGZsb2F0aW5nIHBvaW50IG1pbi9tYXggaXMgZ2l2ZW4gb25lIE5hTiBhbmQgb25lCisgIC8vLyBub24tTmFOIGFzIGlucHV0LgorICBlbnVtIFNlbGVjdFBhdHRlcm5OYU5CZWhhdmlvciB7CisgICAgU1BOQl9OQSA9IDAsICAgICAgICAgICAgICAgIC8vLyBOYU4gYmVoYXZpb3Igbm90IGFwcGxpY2FibGUuCisgICAgU1BOQl9SRVRVUk5TX05BTiwgICAgICAgICAgIC8vLyBHaXZlbiBvbmUgTmFOIGlucHV0LCByZXR1cm5zIHRoZSBOYU4uCisgICAgU1BOQl9SRVRVUk5TX09USEVSLCAgICAgICAgIC8vLyBHaXZlbiBvbmUgTmFOIGlucHV0LCByZXR1cm5zIHRoZSBub24tTmFOLgorICAgIFNQTkJfUkVUVVJOU19BTlkgICAgICAgICAgICAvLy8gR2l2ZW4gb25lIE5hTiBpbnB1dCwgY2FuIHJldHVybiBlaXRoZXIgKG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBpdCBoYXMgYmVlbiBkZXRlcm1pbmVkIHRoYXQgbm8gb3BlcmFuZHMgY2FuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBiZSBOYU4pLgorICB9OworCisgIHN0cnVjdCBTZWxlY3RQYXR0ZXJuUmVzdWx0IHsKKyAgICBTZWxlY3RQYXR0ZXJuRmxhdm9yIEZsYXZvcjsKKyAgICBTZWxlY3RQYXR0ZXJuTmFOQmVoYXZpb3IgTmFOQmVoYXZpb3I7IC8vLyBPbmx5IGFwcGxpY2FibGUgaWYgRmxhdm9yIGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gU1BGX0ZNSU5OVU0gb3IgU1BGX0ZNQVhOVU0uCisgICAgYm9vbCBPcmRlcmVkOyAgICAgICAgICAgICAgIC8vLyBXaGVuIGltcGxlbWVudGluZyB0aGlzIG1pbi9tYXggcGF0dGVybiBhcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gZmNtcDsgc2VsZWN0LCBkb2VzIHRoZSBmY21wIGhhdmUgdG8gYmUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vIG9yZGVyZWQ/CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgXHAgU1BGIGlzIGEgbWluIG9yIGEgbWF4IHBhdHRlcm4uCisgICAgc3RhdGljIGJvb2wgaXNNaW5Pck1heChTZWxlY3RQYXR0ZXJuRmxhdm9yIFNQRikgeworICAgICAgcmV0dXJuIFNQRiAhPSBTUEZfVU5LTk9XTiAmJiBTUEYgIT0gU1BGX0FCUyAmJiBTUEYgIT0gU1BGX05BQlM7CisgICAgfQorICB9OworCisgIC8vLyBQYXR0ZXJuIG1hdGNoIGludGVnZXIgW1NVXU1JTiwgW1NVXU1BWCBhbmQgQUJTIGlkaW9tcywgcmV0dXJuaW5nIHRoZSBraW5kCisgIC8vLyBhbmQgcHJvdmlkaW5nIHRoZSBvdXQgcGFyYW1ldGVyIHJlc3VsdHMgaWYgd2Ugc3VjY2Vzc2Z1bGx5IG1hdGNoLgorICAvLy8KKyAgLy8vIElmIENhc3RPcCBpcyBub3QgbnVsbHB0ciwgYWxzbyBtYXRjaCBNSU4vTUFYIGlkaW9tcyB3aGVyZSB0aGUgdHlwZSBkb2VzCisgIC8vLyBub3QgbWF0Y2ggdGhhdCBvZiB0aGUgb3JpZ2luYWwgc2VsZWN0LiBJZiB0aGlzIGlzIHRoZSBjYXNlLCB0aGUgY2FzdAorICAvLy8gb3BlcmF0aW9uIChvbmUgb2YgVHJ1bmMsU0V4dCxaZXh0KSB0aGF0IG11c3QgYmUgZG9uZSB0byB0cmFuc2Zvcm0gdGhlCisgIC8vLyB0eXBlIG9mIExIUyBhbmQgUkhTIGludG8gdGhlIHR5cGUgb2YgViBpcyByZXR1cm5lZCBpbiBDYXN0T3AuCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGU6CisgIC8vLyAgICUxID0gaWNtcCBzbHQgaTMyICVhLCBpMzIgNAorICAvLy8gICAlMiA9IHNleHQgaTMyICVhIHRvIGk2NAorICAvLy8gICAlMyA9IHNlbGVjdCBpMSAlMSwgaTY0ICUyLCBpNjQgNAorICAvLy8KKyAgLy8vIC0+IExIUyA9ICVhLCBSSFMgPSBpMzIgNCwgKkNhc3RPcCA9IEluc3RydWN0aW9uOjpTRXh0CisgIC8vLworICBTZWxlY3RQYXR0ZXJuUmVzdWx0IG1hdGNoU2VsZWN0UGF0dGVybihWYWx1ZSAqViwgVmFsdWUgKiZMSFMsIFZhbHVlIComUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbjo6Q2FzdE9wcyAqQ2FzdE9wID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwKTsKKyAgaW5saW5lIFNlbGVjdFBhdHRlcm5SZXN1bHQKKyAgbWF0Y2hTZWxlY3RQYXR0ZXJuKGNvbnN0IFZhbHVlICpWLCBjb25zdCBWYWx1ZSAqJkxIUywgY29uc3QgVmFsdWUgKiZSSFMsCisgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbjo6Q2FzdE9wcyAqQ2FzdE9wID0gbnVsbHB0cikgeworICAgIFZhbHVlICpMID0gY29uc3RfY2FzdDxWYWx1ZSo+KExIUyk7CisgICAgVmFsdWUgKlIgPSBjb25zdF9jYXN0PFZhbHVlKj4oUkhTKTsKKyAgICBhdXRvIFJlc3VsdCA9IG1hdGNoU2VsZWN0UGF0dGVybihjb25zdF9jYXN0PFZhbHVlKj4oViksIEwsIFIpOworICAgIExIUyA9IEw7CisgICAgUkhTID0gUjsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgLy8vIFJldHVybiB0aGUgY2Fub25pY2FsIGNvbXBhcmlzb24gcHJlZGljYXRlIGZvciB0aGUgc3BlY2lmaWVkCisgIC8vLyBtaW5pbXVtL21heGltdW0gZmxhdm9yLgorICBDbXBJbnN0OjpQcmVkaWNhdGUgZ2V0TWluTWF4UHJlZChTZWxlY3RQYXR0ZXJuRmxhdm9yIFNQRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPcmRlcmVkID0gZmFsc2UpOworCisgIC8vLyBSZXR1cm4gdGhlIGludmVyc2UgbWluaW11bS9tYXhpbXVtIGZsYXZvciBvZiB0aGUgc3BlY2lmaWVkIGZsYXZvci4KKyAgLy8vIEZvciBleGFtcGxlLCBzaWduZWQgbWluaW11bSBpcyB0aGUgaW52ZXJzZSBvZiBzaWduZWQgbWF4aW11bS4KKyAgU2VsZWN0UGF0dGVybkZsYXZvciBnZXRJbnZlcnNlTWluTWF4Rmxhdm9yKFNlbGVjdFBhdHRlcm5GbGF2b3IgU1BGKTsKKworICAvLy8gUmV0dXJuIHRoZSBjYW5vbmljYWwgaW52ZXJzZSBjb21wYXJpc29uIHByZWRpY2F0ZSBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gbWluaW11bS9tYXhpbXVtIGZsYXZvci4KKyAgQ21wSW5zdDo6UHJlZGljYXRlIGdldEludmVyc2VNaW5NYXhQcmVkKFNlbGVjdFBhdHRlcm5GbGF2b3IgU1BGKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgUkhTIGlzIGtub3duIHRvIGJlIGltcGxpZWQgdHJ1ZSBieSBMSFMuICBSZXR1cm4gZmFsc2UgaWYKKyAgLy8vIFJIUyBpcyBrbm93biB0byBiZSBpbXBsaWVkIGZhbHNlIGJ5IExIUy4gIE90aGVyd2lzZSwgcmV0dXJuIE5vbmUgaWYgbm8KKyAgLy8vIGltcGxpY2F0aW9uIGNhbiBiZSBtYWRlLgorICAvLy8gQSAmIEIgbXVzdCBiZSBpMSAoYm9vbGVhbikgdmFsdWVzIG9yIGEgdmVjdG9yIG9mIHN1Y2ggdmFsdWVzLiBOb3RlIHRoYXQKKyAgLy8vIHRoZSB0cnV0aCB0YWJsZSBmb3IgaW1wbGljYXRpb24gaXMgdGhlIHNhbWUgYXMgPD11IG9uIGkxIHZhbHVlcyAoYnV0IG5vdAorICAvLy8gPD1zISkuICBUaGUgdHJ1dGggdGFibGUgZm9yIGJvdGggaXM6CisgIC8vLyAgICB8IFQgfCBGIChCKQorICAvLy8gIFQgfCBUIHwgRgorICAvLy8gIEYgfCBUIHwgVAorICAvLy8gKEEpCisgIE9wdGlvbmFsPGJvb2w+IGlzSW1wbGllZENvbmRpdGlvbihjb25zdCBWYWx1ZSAqTEhTLCBjb25zdCBWYWx1ZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwsIGJvb2wgTEhTSXNUcnVlID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoID0gMCk7Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9BTkFMWVNJU19WQUxVRVRSQUNLSU5HX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVmVjdG9yVXRpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQW5hbHlzaXMvVmVjdG9yVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzE1ZTg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9BbmFseXNpcy9WZWN0b3JVdGlscy5oCkBAIC0wLDAgKzEsMTgxIEBACisvLz09PS0gbGx2bS9BbmFseXNpcy9WZWN0b3JVdGlscy5oIC0gVmVjdG9yIHV0aWxpdGllcyAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHNvbWUgdmVjdG9yaXplciB1dGlsaXRpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FOQUxZU0lTX1ZFQ1RPUlVUSUxTX0gKKyNkZWZpbmUgTExWTV9BTkFMWVNJU19WRUNUT1JVVElMU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9NYXBWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1RhcmdldExpYnJhcnlJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JUkJ1aWxkZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7CitjbGFzcyBEZW1hbmRlZEJpdHM7CitjbGFzcyBHZXRFbGVtZW50UHRySW5zdDsKK2NsYXNzIExvb3A7CitjbGFzcyBTY2FsYXJFdm9sdXRpb247CitjbGFzcyBUYXJnZXRUcmFuc2Zvcm1JbmZvOworY2xhc3MgVHlwZTsKK2NsYXNzIFZhbHVlOworCituYW1lc3BhY2UgSW50cmluc2ljIHsKK2VudW0gSUQgOiB1bnNpZ25lZDsKK30KKworLy8vIFxicmllZiBJZGVudGlmeSBpZiB0aGUgaW50cmluc2ljIGlzIHRyaXZpYWxseSB2ZWN0b3JpemFibGUuCisvLy8gVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSBpbnRyaW5zaWMncyBhcmd1bWVudCB0eXBlcyBhcmUgYWxsCisvLy8gc2NhbGFycyBmb3IgdGhlIHNjYWxhciBmb3JtIG9mIHRoZSBpbnRyaW5zaWMgYW5kIGFsbCB2ZWN0b3JzIGZvcgorLy8vIHRoZSB2ZWN0b3IgZm9ybSBvZiB0aGUgaW50cmluc2ljLgorYm9vbCBpc1RyaXZpYWxseVZlY3Rvcml6YWJsZShJbnRyaW5zaWM6OklEIElEKTsKKworLy8vIFxicmllZiBJZGVudGlmaWVzIGlmIHRoZSBpbnRyaW5zaWMgaGFzIGEgc2NhbGFyIG9wZXJhbmQuIEl0IGNoZWNrcyBmb3IKKy8vLyBjdGx6LGN0dHogYW5kIHBvd2kgc3BlY2lhbCBpbnRyaW5zaWNzIHdob3NlIGFyZ3VtZW50IGlzIHNjYWxhci4KK2Jvb2wgaGFzVmVjdG9ySW5zdHJpbnNpY1NjYWxhck9wZChJbnRyaW5zaWM6OklEIElELCB1bnNpZ25lZCBTY2FsYXJPcGRJZHgpOworCisvLy8gXGJyaWVmIFJldHVybnMgaW50cmluc2ljIElEIGZvciBjYWxsLgorLy8vIEZvciB0aGUgaW5wdXQgY2FsbCBpbnN0cnVjdGlvbiBpdCBmaW5kcyBtYXBwaW5nIGludHJpbnNpYyBhbmQgcmV0dXJucworLy8vIGl0cyBpbnRyaW5zaWMgSUQsIGluIGNhc2UgaXQgZG9lcyBub3QgZm91bmQgaXQgcmV0dXJuIG5vdF9pbnRyaW5zaWMuCitJbnRyaW5zaWM6OklEIGdldFZlY3RvckludHJpbnNpY0lERm9yQ2FsbChjb25zdCBDYWxsSW5zdCAqQ0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKTsKKworLy8vIFxicmllZiBGaW5kIHRoZSBvcGVyYW5kIG9mIHRoZSBHRVAgdGhhdCBzaG91bGQgYmUgY2hlY2tlZCBmb3IgY29uc2VjdXRpdmUKKy8vLyBzdG9yZXMuIFRoaXMgaWdub3JlcyB0cmFpbGluZyBpbmRpY2VzIHRoYXQgaGF2ZSBubyBlZmZlY3Qgb24gdGhlIGZpbmFsCisvLy8gcG9pbnRlci4KK3Vuc2lnbmVkIGdldEdFUEluZHVjdGlvbk9wZXJhbmQoY29uc3QgR2V0RWxlbWVudFB0ckluc3QgKkdlcCk7CisKKy8vLyBcYnJpZWYgSWYgdGhlIGFyZ3VtZW50IGlzIGEgR0VQLCB0aGVuIHJldHVybnMgdGhlIG9wZXJhbmQgaWRlbnRpZmllZCBieQorLy8vIGdldEdFUEluZHVjdGlvbk9wZXJhbmQuIEhvd2V2ZXIsIGlmIHRoZXJlIGlzIHNvbWUgb3RoZXIgbm9uLWxvb3AtaW52YXJpYW50CisvLy8gb3BlcmFuZCwgaXQgcmV0dXJucyB0aGF0IGluc3RlYWQuCitWYWx1ZSAqc3RyaXBHZXRFbGVtZW50UHRyKFZhbHVlICpQdHIsIFNjYWxhckV2b2x1dGlvbiAqU0UsIExvb3AgKkxwKTsKKworLy8vIFxicmllZiBJZiBhIHZhbHVlIGhhcyBvbmx5IG9uZSB1c2VyIHRoYXQgaXMgYSBDYXN0SW5zdCwgcmV0dXJuIGl0LgorVmFsdWUgKmdldFVuaXF1ZUNhc3RVc2UoVmFsdWUgKlB0ciwgTG9vcCAqTHAsIFR5cGUgKlR5KTsKKworLy8vIFxicmllZiBHZXQgdGhlIHN0cmlkZSBvZiBhIHBvaW50ZXIgYWNjZXNzIGluIGEgbG9vcC4gTG9va3MgZm9yIHN5bWJvbGljCisvLy8gc3RyaWRlcyAiYVtpKnN0cmlkZV0iLiBSZXR1cm5zIHRoZSBzeW1ib2xpYyBzdHJpZGUsIG9yIG51bGwgb3RoZXJ3aXNlLgorVmFsdWUgKmdldFN0cmlkZUZyb21Qb2ludGVyKFZhbHVlICpQdHIsIFNjYWxhckV2b2x1dGlvbiAqU0UsIExvb3AgKkxwKTsKKworLy8vIFxicmllZiBHaXZlbiBhIHZlY3RvciBhbmQgYW4gZWxlbWVudCBudW1iZXIsIHNlZSBpZiB0aGUgc2NhbGFyIHZhbHVlIGlzCisvLy8gYWxyZWFkeSBhcm91bmQgYXMgYSByZWdpc3RlciwgZm9yIGV4YW1wbGUgaWYgaXQgd2VyZSBpbnNlcnRlZCB0aGVuIGV4dHJhY3RlZAorLy8vIGZyb20gdGhlIHZlY3Rvci4KK1ZhbHVlICpmaW5kU2NhbGFyRWxlbWVudChWYWx1ZSAqViwgdW5zaWduZWQgRWx0Tm8pOworCisvLy8gXGJyaWVmIEdldCBzcGxhdCB2YWx1ZSBpZiB0aGUgaW5wdXQgaXMgYSBzcGxhdCB2ZWN0b3Igb3IgcmV0dXJuIG51bGxwdHIuCisvLy8gVGhlIHZhbHVlIG1heSBiZSBleHRyYWN0ZWQgZnJvbSBhIHNwbGF0IGNvbnN0YW50cyB2ZWN0b3Igb3IgZnJvbQorLy8vIGEgc2VxdWVuY2Ugb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgYnJvYWRjYXN0IGEgc2luZ2xlIHZhbHVlIGludG8gYSB2ZWN0b3IuCitjb25zdCBWYWx1ZSAqZ2V0U3BsYXRWYWx1ZShjb25zdCBWYWx1ZSAqVik7CisKKy8vLyBcYnJpZWYgQ29tcHV0ZSBhIG1hcCBvZiBpbnRlZ2VyIGluc3RydWN0aW9ucyB0byB0aGVpciBtaW5pbXVtIGxlZ2FsIHR5cGUKKy8vLyBzaXplLgorLy8vCisvLy8gQyBzZW1hbnRpY3MgZm9yY2Ugc3ViLWludC1zaXplZCB2YWx1ZXMgKGUuZy4gaTgsIGkxNikgdG8gYmUgcHJvbW90ZWQgdG8gaW50CisvLy8gdHlwZSAoZS5nLiBpMzIpIHdoZW5ldmVyIGFyaXRobWV0aWMgaXMgcGVyZm9ybWVkIG9uIHRoZW0uCisvLy8KKy8vLyBGb3IgdGFyZ2V0cyB3aXRoIG5hdGl2ZSBpOCBvciBpMTYgb3BlcmF0aW9ucywgdXN1YWxseSBJbnN0Q29tYmluZSBjYW4gc2hyaW5rCisvLy8gdGhlIGFyaXRobWV0aWMgdHlwZSBkb3duIGFnYWluLiBIb3dldmVyIEluc3RDb21iaW5lIHJlZnVzZXMgdG8gY3JlYXRlCisvLy8gaWxsZWdhbCB0eXBlcywgc28gZm9yIHRhcmdldHMgd2l0aG91dCBpOCBvciBpMTYgcmVnaXN0ZXJzLCB0aGUgbGVuZ3RoZW5pbmcKKy8vLyBhbmQgc2hyaW5raW5nIHJlbWFpbnMuCisvLy8KKy8vLyBNb3N0IFNJTUQgSVNBcyAoZS5nLiBORU9OKSBob3dldmVyIHN1cHBvcnQgdmVjdG9ycyBvZiBpOCBvciBpMTYgZXZlbiB3aGVuCisvLy8gdGhlaXIgc2NhbGFyIGVxdWl2YWxlbnRzIGRvIG5vdCwgc28gZHVyaW5nIHZlY3Rvcml6YXRpb24gaXQgaXMgaW1wb3J0YW50IHRvCisvLy8gcmVtb3ZlIHRoZXNlIGxlbmd0aGVucyBhbmQgdHJ1bmNhdGVzIHdoZW4gZGVjaWRpbmcgdGhlIHByb2ZpdGFiaWxpdHkgb2YKKy8vLyB2ZWN0b3JpemF0aW9uLgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiBhbmFseXplcyB0aGUgZ2l2ZW4gcmFuZ2Ugb2YgaW5zdHJ1Y3Rpb25zIGFuZCBkZXRlcm1pbmVzIHRoZQorLy8vIG1pbmltdW0gdHlwZSBzaXplIGVhY2ggY2FuIGJlIGNvbnZlcnRlZCB0by4gSXQgYXR0ZW1wdHMgdG8gcmVtb3ZlIG9yCisvLy8gbWluaW1pemUgdHlwZSBzaXplIGNoYW5nZXMgYWNyb3NzIGVhY2ggZGVmLXVzZSBjaGFpbiwgc28gZm9yIGV4YW1wbGUgaW4gdGhlCisvLy8gZm9sbG93aW5nIGNvZGU6CisvLy8KKy8vLyAgICUxID0gbG9hZCBpOCwgaTgqCisvLy8gICAlMiA9IGFkZCBpOCAlMSwgMgorLy8vICAgJTMgPSBsb2FkIGkxNiwgaTE2KgorLy8vICAgJTQgPSB6ZXh0IGk4ICUyIHRvIGkzMgorLy8vICAgJTUgPSB6ZXh0IGkxNiAlMyB0byBpMzIKKy8vLyAgICU2ID0gYWRkIGkzMiAlNCwgJTUKKy8vLyAgICU3ID0gdHJ1bmMgaTMyICU2IHRvIGkxNgorLy8vCisvLy8gSW5zdHJ1Y3Rpb24gJTYgbXVzdCBiZSBkb25lIGF0IGxlYXN0IGluIGkxNiwgc28gY29tcHV0ZU1pbmltdW1WYWx1ZVNpemVzCisvLy8gd2lsbCByZXR1cm46IHslMTogMTYsICUyOiAxNiwgJTM6IDE2LCAlNDogMTYsICU1OiAxNiwgJTY6IDE2LCAlNzogMTZ9LgorLy8vCisvLy8gSWYgdGhlIG9wdGlvbmFsIFRhcmdldFRyYW5zZm9ybUluZm8gaXMgcHJvdmlkZWQsIHRoaXMgZnVuY3Rpb24gdHJpZXMgaGFyZGVyCisvLy8gdG8gZG8gbGVzcyB3b3JrIGJ5IG9ubHkgbG9va2luZyBhdCBpbGxlZ2FsIHR5cGVzLgorTWFwVmVjdG9yPEluc3RydWN0aW9uKiwgdWludDY0X3Q+Citjb21wdXRlTWluaW11bVZhbHVlU2l6ZXMoQXJyYXlSZWY8QmFzaWNCbG9jayo+IEJsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBEZW1hbmRlZEJpdHMgJkRCLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFRyYW5zZm9ybUluZm8gKlRUST1udWxscHRyKTsKKworLy8vIFNwZWNpZmljYWxseSwgbGV0IEtpbmRzID0gW01EX3RiYWEsIE1EX2FsaWFzX3Njb3BlLCBNRF9ub2FsaWFzLCBNRF9mcG1hdGgsCisvLy8gTURfbm9udGVtcG9yYWxdLiAgRm9yIEsgaW4gS2luZHMsIHdlIGdldCB0aGUgTUROb2RlIGZvciBLIGZyb20gZWFjaCBvZiB0aGUKKy8vLyBlbGVtZW50cyBvZiBWTCwgY29tcHV0ZSB0aGVpciAiaW50ZXJzZWN0aW9uIiAoaS5lLiwgdGhlIG1vc3QgZ2VuZXJpYworLy8vIG1ldGFkYXRhIHZhbHVlIHRoYXQgY292ZXJzIGFsbCBvZiB0aGUgaW5kaXZpZHVhbCB2YWx1ZXMpLCBhbmQgc2V0IEkncworLy8vIG1ldGFkYXRhIGZvciBNIGVxdWFsIHRvIHRoZSBpbnRlcnNlY3Rpb24gdmFsdWUuCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIGFsd2F5cyBzZXRzIGEgKHBvc3NpYmx5IG51bGwpIHZhbHVlIGZvciBlYWNoIEsgaW4gS2luZHMuCitJbnN0cnVjdGlvbiAqcHJvcGFnYXRlTWV0YWRhdGEoSW5zdHJ1Y3Rpb24gKkksIEFycmF5UmVmPFZhbHVlICo+IFZMKTsKKworLy8vIFxicmllZiBDcmVhdGUgYW4gaW50ZXJsZWF2ZSBzaHVmZmxlIG1hc2suCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBzaHVmZmxlIG1hc2sgZm9yIGludGVybGVhdmluZyBccCBOdW1WZWNzIHZlY3RvcnMgb2YKKy8vLyB2ZWN0b3JpemF0aW9uIGZhY3RvciBccCBWRiBpbnRvIGEgc2luZ2xlIHdpZGUgdmVjdG9yLiBUaGUgbWFzayBpcyBvZiB0aGUKKy8vLyBmb3JtOgorLy8vCisvLy8gICA8MCwgVkYsIFZGICogMiwgLi4uLCBWRiAqIChOdW1WZWNzIC0gMSksIDEsIFZGICsgMSwgVkYgKiAyICsgMSwgLi4uPgorLy8vCisvLy8gRm9yIGV4YW1wbGUsIHRoZSBtYXNrIGZvciBWRiA9IDQgYW5kIE51bVZlY3MgPSAyIGlzOgorLy8vCisvLy8gICA8MCwgNCwgMSwgNSwgMiwgNiwgMywgNz4uCitDb25zdGFudCAqY3JlYXRlSW50ZXJsZWF2ZU1hc2soSVJCdWlsZGVyPD4gJkJ1aWxkZXIsIHVuc2lnbmVkIFZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVZlY3MpOworCisvLy8gXGJyaWVmIENyZWF0ZSBhIHN0cmlkZSBzaHVmZmxlIG1hc2suCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBzaHVmZmxlIG1hc2sgd2hvc2UgZWxlbWVudHMgYmVnaW4gYXQgXHAgU3RhcnQgYW5kCisvLy8gYXJlIGluY3JlbWVudGVkIGJ5IFxwIFN0cmlkZS4gVGhlIG1hc2sgY2FuIGJlIHVzZWQgdG8gZGVpbnRlcmxlYXZlIGFuCisvLy8gaW50ZXJsZWF2ZWQgdmVjdG9yIGludG8gc2VwYXJhdGUgdmVjdG9ycyBvZiB2ZWN0b3JpemF0aW9uIGZhY3RvciBccCBWRi4gVGhlCisvLy8gbWFzayBpcyBvZiB0aGUgZm9ybToKKy8vLworLy8vICAgPFN0YXJ0LCBTdGFydCArIFN0cmlkZSwgLi4uLCBTdGFydCArIFN0cmlkZSAqIChWRiAtIDEpPgorLy8vCisvLy8gRm9yIGV4YW1wbGUsIHRoZSBtYXNrIGZvciBTdGFydCA9IDAsIFN0cmlkZSA9IDIsIGFuZCBWRiA9IDQgaXM6CisvLy8KKy8vLyAgIDwwLCAyLCA0LCA2PgorQ29uc3RhbnQgKmNyZWF0ZVN0cmlkZU1hc2soSVJCdWlsZGVyPD4gJkJ1aWxkZXIsIHVuc2lnbmVkIFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3RyaWRlLCB1bnNpZ25lZCBWRik7CisKKy8vLyBcYnJpZWYgQ3JlYXRlIGEgc2VxdWVudGlhbCBzaHVmZmxlIG1hc2suCisvLy8KKy8vLyBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgc2h1ZmZsZSBtYXNrIHdob3NlIGVsZW1lbnRzIGFyZSBzZXF1ZW50aWFsIGFuZCBiZWdpbgorLy8vIGF0IFxwIFN0YXJ0LiAgVGhlIG1hc2sgY29udGFpbnMgXHAgTnVtSW50cyBpbnRlZ2VycyBhbmQgaXMgcGFkZGVkIHdpdGggXHAKKy8vLyBOdW1VbmRlZnMgdW5kZWYgdmFsdWVzLiBUaGUgbWFzayBpcyBvZiB0aGUgZm9ybToKKy8vLworLy8vICAgPFN0YXJ0LCBTdGFydCArIDEsIC4uLiBTdGFydCArIE51bUludHMgLSAxLCB1bmRlZl8xLCAuLi4gdW5kZWZfTnVtVW5kZWZzPgorLy8vCisvLy8gRm9yIGV4YW1wbGUsIHRoZSBtYXNrIGZvciBTdGFydCA9IDAsIE51bUluc3RzID0gNCwgYW5kIE51bVVuZGVmcyA9IDQgaXM6CisvLy8KKy8vLyAgIDwwLCAxLCAyLCAzLCB1bmRlZiwgdW5kZWYsIHVuZGVmLCB1bmRlZj4KK0NvbnN0YW50ICpjcmVhdGVTZXF1ZW50aWFsTWFzayhJUkJ1aWxkZXI8PiAmQnVpbGRlciwgdW5zaWduZWQgU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtSW50cywgdW5zaWduZWQgTnVtVW5kZWZzKTsKKworLy8vIFxicmllZiBDb25jYXRlbmF0ZSBhIGxpc3Qgb2YgdmVjdG9ycy4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzIGNvZGUgdGhhdCBjb25jYXRlbmF0ZSB0aGUgdmVjdG9ycyBpbiBccCBWZWNzIGludG8gYQorLy8vIHNpbmdsZSBsYXJnZSB2ZWN0b3IuIFRoZSBudW1iZXIgb2YgdmVjdG9ycyBzaG91bGQgYmUgZ3JlYXRlciB0aGFuIG9uZSwgYW5kCisvLy8gdGhlaXIgZWxlbWVudCB0eXBlcyBzaG91bGQgYmUgdGhlIHNhbWUuIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlCisvLy8gdmVjdG9ycyBzaG91bGQgYWxzbyBiZSB0aGUgc2FtZTsgaG93ZXZlciwgaWYgdGhlIGxhc3QgdmVjdG9yIGhhcyBmZXdlcgorLy8vIGVsZW1lbnRzLCBpdCB3aWxsIGJlIHBhZGRlZCB3aXRoIHVuZGVmcy4KK1ZhbHVlICpjb25jYXRlbmF0ZVZlY3RvcnMoSVJCdWlsZGVyPD4gJkJ1aWxkZXIsIEFycmF5UmVmPFZhbHVlICo+IFZlY3MpOworCit9IC8vIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Bc21QYXJzZXIvUGFyc2VyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FzbVBhcnNlci9QYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTIyMTAxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Bc21QYXJzZXIvUGFyc2VyLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8vPT09LS0gUGFyc2VyLmggLSBQYXJzZXIgZm9yIExMVk0gSVIgdGV4dCBhc3NlbWJseSBmaWxlcyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoZXNlIGNsYXNzZXMgYXJlIGltcGxlbWVudGVkIGJ5IHRoZSBsaWIvQXNtUGFyc2VyIGxpYnJhcnkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0FTTVBBUlNFUl9QQVJTRVJfSAorI2RlZmluZSBMTFZNX0FTTVBBUlNFUl9QQVJTRVJfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIENvbnN0YW50OworY2xhc3MgTExWTUNvbnRleHQ7CitjbGFzcyBNb2R1bGU7CitzdHJ1Y3QgU2xvdE1hcHBpbmc7CitjbGFzcyBTTURpYWdub3N0aWM7CitjbGFzcyBUeXBlOworCisvLy8gVGhpcyBmdW5jdGlvbiBpcyB0aGUgbWFpbiBpbnRlcmZhY2UgdG8gdGhlIExMVk0gQXNzZW1ibHkgUGFyc2VyLiBJdCBwYXJzZXMKKy8vLyBhbiBBU0NJSSBmaWxlIHRoYXQgKHByZXN1bWFibHkpIGNvbnRhaW5zIExMVk0gQXNzZW1ibHkgY29kZS4gSXQgcmV0dXJucyBhCisvLy8gTW9kdWxlIChpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24pIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZmVhdHVyZXMuIE5vdGUKKy8vLyB0aGF0IHRoaXMgZG9lcyBub3QgdmVyaWZ5IHRoYXQgdGhlIGdlbmVyYXRlZCBNb2R1bGUgaXMgdmFsaWQsIHNvIHlvdSBzaG91bGQKKy8vLyBydW4gdGhlIHZlcmlmaWVyIGFmdGVyIHBhcnNpbmcgdGhlIGZpbGUgdG8gY2hlY2sgdGhhdCBpdCBpcyBva2F5LgorLy8vIFxicmllZiBQYXJzZSBMTFZNIEFzc2VtYmx5IGZyb20gYSBmaWxlCisvLy8gXHBhcmFtIEZpbGVuYW1lIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHBhcnNlCisvLy8gXHBhcmFtIEVycm9yIEVycm9yIHJlc3VsdCBpbmZvLgorLy8vIFxwYXJhbSBDb250ZXh0IENvbnRleHQgaW4gd2hpY2ggdG8gYWxsb2NhdGUgZ2xvYmFscyBpbmZvLgorLy8vIFxwYXJhbSBTbG90cyBUaGUgb3B0aW9uYWwgc2xvdCBtYXBwaW5nIHRoYXQgd2lsbCBiZSBpbml0aWFsaXplZCBkdXJpbmcKKy8vLyAgICAgICAgICAgICAgcGFyc2luZy4KKy8vLyBccGFyYW0gVXBncmFkZURlYnVnSW5mbyBSdW4gVXBncmFkZURlYnVnSW5mbywgd2hpY2ggcnVucyB0aGUgVmVyaWZpZXIuCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyBvcHRpb24gc2hvdWxkIG9ubHkgYmUgc2V0IHRvIGZhbHNlIGJ5IGxsdm0tYXMKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgdXNlIGluc2lkZSB0aGUgTExWTSB0ZXN0dWl0ZSEKKy8vLyBccGFyYW0gRGF0YUxheW91dFN0cmluZyBPdmVycmlkZSBkYXRhbGF5b3V0IGluIHRoZSBsbHZtIGFzc2VtYmx5Lgorc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4KK3BhcnNlQXNzZW1ibHlGaWxlKFN0cmluZ1JlZiBGaWxlbmFtZSwgU01EaWFnbm9zdGljICZFcnJvciwgTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICBTbG90TWFwcGluZyAqU2xvdHMgPSBudWxscHRyLCBib29sIFVwZ3JhZGVEZWJ1Z0luZm8gPSB0cnVlLAorICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERhdGFMYXlvdXRTdHJpbmcgPSAiIik7CisKKy8vLyBUaGUgZnVuY3Rpb24gaXMgYSBzZWNvbmRhcnkgaW50ZXJmYWNlIHRvIHRoZSBMTFZNIEFzc2VtYmx5IFBhcnNlci4gSXQgcGFyc2VzCisvLy8gYW4gQVNDSUkgc3RyaW5nIHRoYXQgKHByZXN1bWFibHkpIGNvbnRhaW5zIExMVk0gQXNzZW1ibHkgY29kZS4gSXQgcmV0dXJucyBhCisvLy8gTW9kdWxlIChpbnRlcm1lZGlhdGUgcmVwcmVzZW50YXRpb24pIHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZmVhdHVyZXMuIE5vdGUKKy8vLyB0aGF0IHRoaXMgZG9lcyBub3QgdmVyaWZ5IHRoYXQgdGhlIGdlbmVyYXRlZCBNb2R1bGUgaXMgdmFsaWQsIHNvIHlvdSBzaG91bGQKKy8vLyBydW4gdGhlIHZlcmlmaWVyIGFmdGVyIHBhcnNpbmcgdGhlIGZpbGUgdG8gY2hlY2sgdGhhdCBpdCBpcyBva2F5LgorLy8vIFxicmllZiBQYXJzZSBMTFZNIEFzc2VtYmx5IGZyb20gYSBzdHJpbmcKKy8vLyBccGFyYW0gQXNtU3RyaW5nIFRoZSBzdHJpbmcgY29udGFpbmluZyBhc3NlbWJseQorLy8vIFxwYXJhbSBFcnJvciBFcnJvciByZXN1bHQgaW5mby4KKy8vLyBccGFyYW0gQ29udGV4dCBDb250ZXh0IGluIHdoaWNoIHRvIGFsbG9jYXRlIGdsb2JhbHMgaW5mby4KKy8vLyBccGFyYW0gU2xvdHMgVGhlIG9wdGlvbmFsIHNsb3QgbWFwcGluZyB0aGF0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgZHVyaW5nCisvLy8gICAgICAgICAgICAgIHBhcnNpbmcuCisvLy8gXHBhcmFtIFVwZ3JhZGVEZWJ1Z0luZm8gUnVuIFVwZ3JhZGVEZWJ1Z0luZm8sIHdoaWNoIHJ1bnMgdGhlIFZlcmlmaWVyLgorLy8vICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIHNob3VsZCBvbmx5IGJlIHNldCB0byBmYWxzZSBieSBsbHZtLWFzCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHVzZSBpbnNpZGUgdGhlIExMVk0gdGVzdHVpdGUhCisvLy8gXHBhcmFtIERhdGFMYXlvdXRTdHJpbmcgT3ZlcnJpZGUgZGF0YWxheW91dCBpbiB0aGUgbGx2bSBhc3NlbWJseS4KK3N0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IHBhcnNlQXNzZW1ibHlTdHJpbmcoU3RyaW5nUmVmIEFzbVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01EaWFnbm9zdGljICZFcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNsb3RNYXBwaW5nICpTbG90cyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVXBncmFkZURlYnVnSW5mbyA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEYXRhTGF5b3V0U3RyaW5nID0gIiIpOworCisvLy8gcGFyc2VBc3NlbWJseUZpbGUgYW5kIHBhcnNlQXNzZW1ibHlTdHJpbmcgYXJlIHdyYXBwZXJzIGFyb3VuZCB0aGlzIGZ1bmN0aW9uLgorLy8vIFxicmllZiBQYXJzZSBMTFZNIEFzc2VtYmx5IGZyb20gYSBNZW1vcnlCdWZmZXIuCisvLy8gXHBhcmFtIEYgVGhlIE1lbW9yeUJ1ZmZlciBjb250YWluaW5nIGFzc2VtYmx5CisvLy8gXHBhcmFtIEVyciBFcnJvciByZXN1bHQgaW5mby4KKy8vLyBccGFyYW0gU2xvdHMgVGhlIG9wdGlvbmFsIHNsb3QgbWFwcGluZyB0aGF0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgZHVyaW5nCisvLy8gICAgICAgICAgICAgIHBhcnNpbmcuCisvLy8gXHBhcmFtIFVwZ3JhZGVEZWJ1Z0luZm8gUnVuIFVwZ3JhZGVEZWJ1Z0luZm8sIHdoaWNoIHJ1bnMgdGhlIFZlcmlmaWVyLgorLy8vICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIHNob3VsZCBvbmx5IGJlIHNldCB0byBmYWxzZSBieSBsbHZtLWFzCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHVzZSBpbnNpZGUgdGhlIExMVk0gdGVzdHVpdGUhCisvLy8gXHBhcmFtIERhdGFMYXlvdXRTdHJpbmcgT3ZlcnJpZGUgZGF0YWxheW91dCBpbiB0aGUgbGx2bSBhc3NlbWJseS4KK3N0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IHBhcnNlQXNzZW1ibHkoTWVtb3J5QnVmZmVyUmVmIEYsIFNNRGlhZ25vc3RpYyAmRXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2xvdE1hcHBpbmcgKlNsb3RzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVcGdyYWRlRGVidWdJbmZvID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERhdGFMYXlvdXRTdHJpbmcgPSAiIik7CisKKy8vLyBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBsb3ctbGV2ZWwgaW50ZXJmYWNlIHRvIHRoZSBMTFZNIEFzc2VtYmx5IFBhcnNlci4KKy8vLyBUaGlzIGlzIGtlcHQgYXMgYW4gaW5kZXBlbmRlbnQgZnVuY3Rpb24gaW5zdGVhZCBvZiBiZWluZyBpbmxpbmVkIGludG8KKy8vLyBwYXJzZUFzc2VtYmx5IGZvciB0aGUgY29udmVuaWVuY2Ugb2YgaW50ZXJhY3RpdmUgdXNlcnMgdGhhdCB3YW50IHRvIGFkZAorLy8vIHJlY2VudGx5IHBhcnNlZCBiaXRzIHRvIGFuIGV4aXN0aW5nIG1vZHVsZS4KKy8vLworLy8vIFxwYXJhbSBGIFRoZSBNZW1vcnlCdWZmZXIgY29udGFpbmluZyBhc3NlbWJseQorLy8vIFxwYXJhbSBNIFRoZSBtb2R1bGUgdG8gYWRkIGRhdGEgdG8uCisvLy8gXHBhcmFtIEVyciBFcnJvciByZXN1bHQgaW5mby4KKy8vLyBccGFyYW0gU2xvdHMgVGhlIG9wdGlvbmFsIHNsb3QgbWFwcGluZyB0aGF0IHdpbGwgYmUgaW5pdGlhbGl6ZWQgZHVyaW5nCisvLy8gICAgICAgICAgICAgIHBhcnNpbmcuCisvLy8gXHJldHVybiB0cnVlIG9uIGVycm9yLgorLy8vIFxwYXJhbSBVcGdyYWRlRGVidWdJbmZvIFJ1biBVcGdyYWRlRGVidWdJbmZvLCB3aGljaCBydW5zIHRoZSBWZXJpZmllci4KKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSBzZXQgdG8gZmFsc2UgYnkgbGx2bS1hcworLy8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB1c2UgaW5zaWRlIHRoZSBMTFZNIHRlc3R1aXRlIQorLy8vIFxwYXJhbSBEYXRhTGF5b3V0U3RyaW5nIE92ZXJyaWRlIGRhdGFsYXlvdXQgaW4gdGhlIGxsdm0gYXNzZW1ibHkuCitib29sIHBhcnNlQXNzZW1ibHlJbnRvKE1lbW9yeUJ1ZmZlclJlZiBGLCBNb2R1bGUgJk0sIFNNRGlhZ25vc3RpYyAmRXJyLAorICAgICAgICAgICAgICAgICAgICAgICBTbG90TWFwcGluZyAqU2xvdHMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIFVwZ3JhZGVEZWJ1Z0luZm8gPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRGF0YUxheW91dFN0cmluZyA9ICIiKTsKKworLy8vIFBhcnNlIGEgdHlwZSBhbmQgYSBjb25zdGFudCB2YWx1ZSBpbiB0aGUgZ2l2ZW4gc3RyaW5nLgorLy8vCisvLy8gVGhlIGNvbnN0YW50IHZhbHVlIGNhbiBiZSBhbnkgTExWTSBjb25zdGFudCwgaW5jbHVkaW5nIGEgY29uc3RhbnQKKy8vLyBleHByZXNzaW9uLgorLy8vCisvLy8gXHBhcmFtIFNsb3RzIFRoZSBvcHRpb25hbCBzbG90IG1hcHBpbmcgdGhhdCB3aWxsIHJlc3RvcmUgdGhlIHBhcnNpbmcgc3RhdGUKKy8vLyBvZiB0aGUgbW9kdWxlLgorLy8vIFxyZXR1cm4gbnVsbCBvbiBlcnJvci4KK0NvbnN0YW50ICpwYXJzZUNvbnN0YW50VmFsdWUoU3RyaW5nUmVmIEFzbSwgU01EaWFnbm9zdGljICZFcnIsIGNvbnN0IE1vZHVsZSAmTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2xvdE1hcHBpbmcgKlNsb3RzID0gbnVsbHB0cik7CisKKy8vLyBQYXJzZSBhIHR5cGUgaW4gdGhlIGdpdmVuIHN0cmluZy4KKy8vLworLy8vIFxwYXJhbSBTbG90cyBUaGUgb3B0aW9uYWwgc2xvdCBtYXBwaW5nIHRoYXQgd2lsbCByZXN0b3JlIHRoZSBwYXJzaW5nIHN0YXRlCisvLy8gb2YgdGhlIG1vZHVsZS4KKy8vLyBccmV0dXJuIG51bGwgb24gZXJyb3IuCitUeXBlICpwYXJzZVR5cGUoU3RyaW5nUmVmIEFzbSwgU01EaWFnbm9zdGljICZFcnIsIGNvbnN0IE1vZHVsZSAmTSwKKyAgICAgICAgICAgICAgICBjb25zdCBTbG90TWFwcGluZyAqU2xvdHMgPSBudWxscHRyKTsKKworLy8vIFBhcnNlIGEgc3RyaW5nIFxwIEFzbSB0aGF0IHN0YXJ0cyB3aXRoIGEgdHlwZS4KKy8vLyBccCBSZWFkW291dF0gZ2l2ZXMgdGhlIG51bWJlciBvZiBjaGFyYWN0ZXJzIHRoYXQgaGF2ZSBiZWVuIHJlYWQgdG8gcGFyc2UKKy8vLyB0aGUgdHlwZSBpbiBccCBBc20uCisvLy8KKy8vLyBccGFyYW0gU2xvdHMgVGhlIG9wdGlvbmFsIHNsb3QgbWFwcGluZyB0aGF0IHdpbGwgcmVzdG9yZSB0aGUgcGFyc2luZyBzdGF0ZQorLy8vIG9mIHRoZSBtb2R1bGUuCisvLy8gXHJldHVybiBudWxsIG9uIGVycm9yLgorVHlwZSAqcGFyc2VUeXBlQXRCZWdpbm5pbmcoU3RyaW5nUmVmIEFzbSwgdW5zaWduZWQgJlJlYWQsIFNNRGlhZ25vc3RpYyAmRXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTW9kdWxlICZNLCBjb25zdCBTbG90TWFwcGluZyAqU2xvdHMgPSBudWxscHRyKTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0FzbVBhcnNlci9TbG90TWFwcGluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Bc21QYXJzZXIvU2xvdE1hcHBpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDdlOGZjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Bc21QYXJzZXIvU2xvdE1hcHBpbmcuaApAQCAtMCwwICsxLDQyIEBACisvLz09PS0tIFNsb3RNYXBwaW5nLmggLSBTbG90IG51bWJlciBtYXBwaW5nIGZvciB1bm5hbWVkIHZhbHVlcyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIFNsb3RNYXBwaW5nIHN0cnVjdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQVNNUEFSU0VSX1NMT1RNQVBQSU5HX0gKKyNkZWZpbmUgTExWTV9BU01QQVJTRVJfU0xPVE1BUFBJTkdfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9JUi9UcmFja2luZ01EUmVmLmgiCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBHbG9iYWxWYWx1ZTsKK2NsYXNzIFR5cGU7CisKKy8vLyBUaGlzIHN0cnVjdCBjb250YWlucyB0aGUgbWFwcGluZ3MgZnJvbSB0aGUgc2xvdCBudW1iZXJzIHRvIHVubmFtZWQgbWV0YWRhdGEKKy8vLyBub2RlcywgZ2xvYmFsIHZhbHVlcyBhbmQgdHlwZXMuIEl0IGFsc28gY29udGFpbnMgdGhlIG1hcHBpbmcgZm9yIHRoZSBuYW1lZAorLy8vIHR5cGVzLgorLy8vIEl0IGNhbiBiZSB1c2VkIHRvIHNhdmUgdGhlIHBhcnNpbmcgc3RhdGUgb2YgYW4gTExWTSBJUiBtb2R1bGUgc28gdGhhdCB0aGUKKy8vLyB0ZXh0dWFsIHJlZmVyZW5jZXMgdG8gdGhlIHZhbHVlcyBpbiB0aGUgbW9kdWxlIGNhbiBiZSBwYXJzZWQgb3V0c2lkZSBvZiB0aGUKKy8vLyBtb2R1bGUncyBzb3VyY2UuCitzdHJ1Y3QgU2xvdE1hcHBpbmcgeworICBzdGQ6OnZlY3RvcjxHbG9iYWxWYWx1ZSAqPiBHbG9iYWxWYWx1ZXM7CisgIHN0ZDo6bWFwPHVuc2lnbmVkLCBUcmFja2luZ01ETm9kZVJlZj4gTWV0YWRhdGFOb2RlczsKKyAgU3RyaW5nTWFwPFR5cGUgKj4gTmFtZWRUeXBlczsKKyAgc3RkOjptYXA8dW5zaWduZWQsIFR5cGUgKj4gVHlwZXM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0NPRkYuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0NPRkYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDcyNmFhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvQ09GRi5oCkBAIC0wLDAgKzEsNzI3IEBACisvLz09PS0tIGxsdm0vQmluYXJ5Rm9ybWF0L0NPRkYuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBhbiBkZWZpbml0aW9ucyB1c2VkIGluIFdpbmRvd3MgQ09GRiBGaWxlcy4KKy8vCisvLyBTdHJ1Y3R1cmVzIGFuZCBlbnVtcyBkZWZpbmVkIHdpdGhpbiB0aGlzIGZpbGUgd2hlcmUgY3JlYXRlZCB1c2luZworLy8gaW5mb3JtYXRpb24gZnJvbSBNaWNyb3NvZnQncyBwdWJsaWNseSBhdmFpbGFibGUgUEUvQ09GRiBmb3JtYXQgZG9jdW1lbnQ6CisvLworLy8gTWljcm9zb2Z0IFBvcnRhYmxlIEV4ZWN1dGFibGUgYW5kIENvbW1vbiBPYmplY3QgRmlsZSBGb3JtYXQgU3BlY2lmaWNhdGlvbgorLy8gUmV2aXNpb24gOC4xIC0gRmVicnVhcnkgMTUsIDIwMDgKKy8vCisvLyBBcyBvZiA1LzIvMjAxMCwgaG9zdGVkIGJ5IE1pY3Jvc29mdCBhdDoKKy8vIGh0dHA6Ly93d3cubWljcm9zb2Z0LmNvbS93aGRjL3N5c3RlbS9wbGF0Zm9ybS9maXJtd2FyZS9wZWNvZmYubXNweAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9CSU5BUllGT1JNQVRfQ09GRl9ICisjZGVmaW5lIExMVk1fQklOQVJZRk9STUFUX0NPRkZfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIENPRkYgeworCisvLyBUaGUgbWF4aW11bSBudW1iZXIgb2Ygc2VjdGlvbnMgdGhhdCBhIENPRkYgb2JqZWN0IGNhbiBoYXZlIChpbmNsdXNpdmUpLgorY29uc3QgaW50MzJfdCBNYXhOdW1iZXJPZlNlY3Rpb25zMTYgPSA2NTI3OTsKKworLy8gVGhlIFBFIHNpZ25hdHVyZSBieXRlcyB0aGF0IGZvbGxvd3MgdGhlIERPUyBzdHViIGhlYWRlci4KK3N0YXRpYyBjb25zdCBjaGFyIFBFTWFnaWNbXSA9IHsnUCcsICdFJywgJ1wwJywgJ1wwJ307CisKK3N0YXRpYyBjb25zdCBjaGFyIEJpZ09iak1hZ2ljW10gPSB7CisgICAgJ1x4YzcnLCAnXHhhMScsICdceGJhJywgJ1x4ZDEnLCAnXHhlZScsICdceGJhJywgJ1x4YTknLCAnXHg0YicsCisgICAgJ1x4YWYnLCAnXHgyMCcsICdceGZhJywgJ1x4ZjYnLCAnXHg2YScsICdceGE0JywgJ1x4ZGMnLCAnXHhiOCcsCit9OworCitzdGF0aWMgY29uc3QgY2hhciBDbEdsT2JqTWFnaWNbXSA9IHsKKyAgICAnXHgzOCcsICdceGZlJywgJ1x4YjMnLCAnXHgwYycsICdceGE1JywgJ1x4ZDknLCAnXHhhYicsICdceDRkJywKKyAgICAnXHhhYycsICdceDliJywgJ1x4ZDYnLCAnXHhiNicsICdceDIyJywgJ1x4MjYnLCAnXHg1MycsICdceGMyJywKK307CisKKy8vIFRoZSBzaWduYXR1cmUgYnl0ZXMgdGhhdCBzdGFydCBhIC5yZXMgZmlsZS4KK3N0YXRpYyBjb25zdCBjaGFyIFdpblJlc01hZ2ljW10gPSB7CisgICAgJ1x4MDAnLCAnXHgwMCcsICdceDAwJywgJ1x4MDAnLCAnXHgyMCcsICdceDAwJywgJ1x4MDAnLCAnXHgwMCcsCisgICAgJ1x4ZmYnLCAnXHhmZicsICdceDAwJywgJ1x4MDAnLCAnXHhmZicsICdceGZmJywgJ1x4MDAnLCAnXHgwMCcsCit9OworCisvLyBTaXplcyBpbiBieXRlcyBvZiB2YXJpb3VzIHRoaW5ncyBpbiB0aGUgQ09GRiBmb3JtYXQuCitlbnVtIHsKKyAgSGVhZGVyMTZTaXplID0gMjAsCisgIEhlYWRlcjMyU2l6ZSA9IDU2LAorICBOYW1lU2l6ZSA9IDgsCisgIFN5bWJvbDE2U2l6ZSA9IDE4LAorICBTeW1ib2wzMlNpemUgPSAyMCwKKyAgU2VjdGlvblNpemUgPSA0MCwKKyAgUmVsb2NhdGlvblNpemUgPSAxMAorfTsKKworc3RydWN0IGhlYWRlciB7CisgIHVpbnQxNl90IE1hY2hpbmU7CisgIGludDMyX3QgTnVtYmVyT2ZTZWN0aW9uczsKKyAgdWludDMyX3QgVGltZURhdGVTdGFtcDsKKyAgdWludDMyX3QgUG9pbnRlclRvU3ltYm9sVGFibGU7CisgIHVpbnQzMl90IE51bWJlck9mU3ltYm9sczsKKyAgdWludDE2X3QgU2l6ZU9mT3B0aW9uYWxIZWFkZXI7CisgIHVpbnQxNl90IENoYXJhY3RlcmlzdGljczsKK307CisKK3N0cnVjdCBCaWdPYmpIZWFkZXIgeworICBlbnVtIDogdWludDE2X3QgeyBNaW5CaWdPYmplY3RWZXJzaW9uID0gMiB9OworCisgIHVpbnQxNl90IFNpZzE7IC8vLzwgTXVzdCBiZSBJTUFHRV9GSUxFX01BQ0hJTkVfVU5LTk9XTiAoMCkuCisgIHVpbnQxNl90IFNpZzI7IC8vLzwgTXVzdCBiZSAweEZGRkYuCisgIHVpbnQxNl90IFZlcnNpb247CisgIHVpbnQxNl90IE1hY2hpbmU7CisgIHVpbnQzMl90IFRpbWVEYXRlU3RhbXA7CisgIHVpbnQ4X3QgVVVJRFsxNl07CisgIHVpbnQzMl90IHVudXNlZDE7CisgIHVpbnQzMl90IHVudXNlZDI7CisgIHVpbnQzMl90IHVudXNlZDM7CisgIHVpbnQzMl90IHVudXNlZDQ7CisgIHVpbnQzMl90IE51bWJlck9mU2VjdGlvbnM7CisgIHVpbnQzMl90IFBvaW50ZXJUb1N5bWJvbFRhYmxlOworICB1aW50MzJfdCBOdW1iZXJPZlN5bWJvbHM7Cit9OworCitlbnVtIE1hY2hpbmVUeXBlcyA6IHVuc2lnbmVkIHsKKyAgTVRfSW52YWxpZCA9IDB4ZmZmZiwKKworICBJTUFHRV9GSUxFX01BQ0hJTkVfVU5LTk9XTiA9IDB4MCwKKyAgSU1BR0VfRklMRV9NQUNISU5FX0FNMzMgPSAweDFEMywKKyAgSU1BR0VfRklMRV9NQUNISU5FX0FNRDY0ID0gMHg4NjY0LAorICBJTUFHRV9GSUxFX01BQ0hJTkVfQVJNID0gMHgxQzAsCisgIElNQUdFX0ZJTEVfTUFDSElORV9BUk1OVCA9IDB4MUM0LAorICBJTUFHRV9GSUxFX01BQ0hJTkVfQVJNNjQgPSAweEFBNjQsCisgIElNQUdFX0ZJTEVfTUFDSElORV9FQkMgPSAweEVCQywKKyAgSU1BR0VfRklMRV9NQUNISU5FX0kzODYgPSAweDE0QywKKyAgSU1BR0VfRklMRV9NQUNISU5FX0lBNjQgPSAweDIwMCwKKyAgSU1BR0VfRklMRV9NQUNISU5FX00zMlIgPSAweDkwNDEsCisgIElNQUdFX0ZJTEVfTUFDSElORV9NSVBTMTYgPSAweDI2NiwKKyAgSU1BR0VfRklMRV9NQUNISU5FX01JUFNGUFUgPSAweDM2NiwKKyAgSU1BR0VfRklMRV9NQUNISU5FX01JUFNGUFUxNiA9IDB4NDY2LAorICBJTUFHRV9GSUxFX01BQ0hJTkVfUE9XRVJQQyA9IDB4MUYwLAorICBJTUFHRV9GSUxFX01BQ0hJTkVfUE9XRVJQQ0ZQID0gMHgxRjEsCisgIElNQUdFX0ZJTEVfTUFDSElORV9SNDAwMCA9IDB4MTY2LAorICBJTUFHRV9GSUxFX01BQ0hJTkVfUklTQ1YzMiA9IDB4NTAzMiwKKyAgSU1BR0VfRklMRV9NQUNISU5FX1JJU0NWNjQgPSAweDUwNjQsCisgIElNQUdFX0ZJTEVfTUFDSElORV9SSVNDVjEyOCA9IDB4NTEyOCwKKyAgSU1BR0VfRklMRV9NQUNISU5FX1NIMyA9IDB4MUEyLAorICBJTUFHRV9GSUxFX01BQ0hJTkVfU0gzRFNQID0gMHgxQTMsCisgIElNQUdFX0ZJTEVfTUFDSElORV9TSDQgPSAweDFBNiwKKyAgSU1BR0VfRklMRV9NQUNISU5FX1NINSA9IDB4MUE4LAorICBJTUFHRV9GSUxFX01BQ0hJTkVfVEhVTUIgPSAweDFDMiwKKyAgSU1BR0VfRklMRV9NQUNISU5FX1dDRU1JUFNWMiA9IDB4MTY5Cit9OworCitlbnVtIENoYXJhY3RlcmlzdGljcyA6IHVuc2lnbmVkIHsKKyAgQ19JbnZhbGlkID0gMCwKKworICAvLy8gVGhlIGZpbGUgZG9lcyBub3QgY29udGFpbiBiYXNlIHJlbG9jYXRpb25zIGFuZCBtdXN0IGJlIGxvYWRlZCBhdCBpdHMKKyAgLy8vIHByZWZlcnJlZCBiYXNlLiBJZiB0aGlzIGNhbm5vdCBiZSBkb25lLCB0aGUgbG9hZGVyIHdpbGwgZXJyb3IuCisgIElNQUdFX0ZJTEVfUkVMT0NTX1NUUklQUEVEID0gMHgwMDAxLAorICAvLy8gVGhlIGZpbGUgaXMgdmFsaWQgYW5kIGNhbiBiZSBydW4uCisgIElNQUdFX0ZJTEVfRVhFQ1VUQUJMRV9JTUFHRSA9IDB4MDAwMiwKKyAgLy8vIENPRkYgbGluZSBudW1iZXJzIGhhdmUgYmVlbiBzdHJpcHBlZC4gVGhpcyBpcyBkZXByZWNhdGVkIGFuZCBzaG91bGQgYmUKKyAgLy8vIDAuCisgIElNQUdFX0ZJTEVfTElORV9OVU1TX1NUUklQUEVEID0gMHgwMDA0LAorICAvLy8gQ09GRiBzeW1ib2wgdGFibGUgZW50cmllcyBmb3IgbG9jYWwgc3ltYm9scyBoYXZlIGJlZW4gcmVtb3ZlZC4gVGhpcyBpcworICAvLy8gZGVwcmVjYXRlZCBhbmQgc2hvdWxkIGJlIDAuCisgIElNQUdFX0ZJTEVfTE9DQUxfU1lNU19TVFJJUFBFRCA9IDB4MDAwOCwKKyAgLy8vIEFnZ3Jlc3NpdmVseSB0cmltIHdvcmtpbmcgc2V0LiBUaGlzIGlzIGRlcHJlY2F0ZWQgYW5kIG11c3QgYmUgMC4KKyAgSU1BR0VfRklMRV9BR0dSRVNTSVZFX1dTX1RSSU0gPSAweDAwMTAsCisgIC8vLyBJbWFnZSBjYW4gaGFuZGxlID4gMkdpQiBhZGRyZXNzZXMuCisgIElNQUdFX0ZJTEVfTEFSR0VfQUREUkVTU19BV0FSRSA9IDB4MDAyMCwKKyAgLy8vIExpdHRsZSBlbmRpYW46IHRoZSBMU0IgcHJlY2VkZXMgdGhlIE1TQiBpbiBtZW1vcnkuIFRoaXMgaXMgZGVwcmVjYXRlZAorICAvLy8gYW5kIHNob3VsZCBiZSAwLgorICBJTUFHRV9GSUxFX0JZVEVTX1JFVkVSU0VEX0xPID0gMHgwMDgwLAorICAvLy8gTWFjaGluZSBpcyBiYXNlZCBvbiBhIDMyYml0IHdvcmQgYXJjaGl0ZWN0dXJlLgorICBJTUFHRV9GSUxFXzMyQklUX01BQ0hJTkUgPSAweDAxMDAsCisgIC8vLyBEZWJ1Z2dpbmcgaW5mbyBoYXMgYmVlbiByZW1vdmVkLgorICBJTUFHRV9GSUxFX0RFQlVHX1NUUklQUEVEID0gMHgwMjAwLAorICAvLy8gSWYgdGhlIGltYWdlIGlzIG9uIHJlbW92YWJsZSBtZWRpYSwgZnVsbHkgbG9hZCBpdCBhbmQgY29weSBpdCB0byBzd2FwLgorICBJTUFHRV9GSUxFX1JFTU9WQUJMRV9SVU5fRlJPTV9TV0FQID0gMHgwNDAwLAorICAvLy8gSWYgdGhlIGltYWdlIGlzIG9uIG5ldHdvcmsgbWVkaWEsIGZ1bGx5IGxvYWQgaXQgYW5kIGNvcHkgaXQgdG8gc3dhcC4KKyAgSU1BR0VfRklMRV9ORVRfUlVOX0ZST01fU1dBUCA9IDB4MDgwMCwKKyAgLy8vIFRoZSBpbWFnZSBmaWxlIGlzIGEgc3lzdGVtIGZpbGUsIG5vdCBhIHVzZXIgcHJvZ3JhbS4KKyAgSU1BR0VfRklMRV9TWVNURU0gPSAweDEwMDAsCisgIC8vLyBUaGUgaW1hZ2UgZmlsZSBpcyBhIERMTC4KKyAgSU1BR0VfRklMRV9ETEwgPSAweDIwMDAsCisgIC8vLyBUaGlzIGZpbGUgc2hvdWxkIG9ubHkgYmUgcnVuIG9uIGEgdW5pcHJvY2Vzc29yIG1hY2hpbmUuCisgIElNQUdFX0ZJTEVfVVBfU1lTVEVNX09OTFkgPSAweDQwMDAsCisgIC8vLyBCaWcgZW5kaWFuOiB0aGUgTVNCIHByZWNlZGVzIHRoZSBMU0IgaW4gbWVtb3J5LiBUaGlzIGlzIGRlcHJlY2F0ZWQKKyAgLy8vIGFuZCBzaG91bGQgYmUgMC4KKyAgSU1BR0VfRklMRV9CWVRFU19SRVZFUlNFRF9ISSA9IDB4ODAwMAorfTsKKworZW51bSBSZXNvdXJjZVR5cGVJRCA6IHVuc2lnbmVkIHsKKyAgUklEX0N1cnNvciA9IDEsCisgIFJJRF9CaXRtYXAgPSAyLAorICBSSURfSWNvbiA9IDMsCisgIFJJRF9NZW51ID0gNCwKKyAgUklEX0RpYWxvZyA9IDUsCisgIFJJRF9TdHJpbmcgPSA2LAorICBSSURfRm9udERpciA9IDcsCisgIFJJRF9Gb250ID0gOCwKKyAgUklEX0FjY2VsZXJhdG9yID0gOSwKKyAgUklEX1JDRGF0YSA9IDEwLAorICBSSURfTWVzc2FnZVRhYmxlID0gMTEsCisgIFJJRF9Hcm91cF9DdXJzb3IgPSAxMiwKKyAgUklEX0dyb3VwX0ljb24gPSAxNCwKKyAgUklEX1ZlcnNpb24gPSAxNiwKKyAgUklEX0RMR0luY2x1ZGUgPSAxNywKKyAgUklEX1BsdWdQbGF5ID0gMTksCisgIFJJRF9WWEQgPSAyMCwKKyAgUklEX0FuaUN1cnNvciA9IDIxLAorICBSSURfQW5pSWNvbiA9IDIyLAorICBSSURfSFRNTCA9IDIzLAorICBSSURfTWFuaWZlc3QgPSAyNCwKK307CisKK3N0cnVjdCBzeW1ib2wgeworICBjaGFyIE5hbWVbTmFtZVNpemVdOworICB1aW50MzJfdCBWYWx1ZTsKKyAgaW50MzJfdCBTZWN0aW9uTnVtYmVyOworICB1aW50MTZfdCBUeXBlOworICB1aW50OF90IFN0b3JhZ2VDbGFzczsKKyAgdWludDhfdCBOdW1iZXJPZkF1eFN5bWJvbHM7Cit9OworCitlbnVtIFN5bWJvbFNlY3Rpb25OdW1iZXIgOiBpbnQzMl90IHsKKyAgSU1BR0VfU1lNX0RFQlVHID0gLTIsCisgIElNQUdFX1NZTV9BQlNPTFVURSA9IC0xLAorICBJTUFHRV9TWU1fVU5ERUZJTkVEID0gMAorfTsKKworLy8vIFN0b3JhZ2UgY2xhc3MgdGVsbHMgd2hlcmUgYW5kIHdoYXQgdGhlIHN5bWJvbCByZXByZXNlbnRzCitlbnVtIFN5bWJvbFN0b3JhZ2VDbGFzcyB7CisgIFNTQ19JbnZhbGlkID0gMHhmZiwKKworICBJTUFHRV9TWU1fQ0xBU1NfRU5EX09GX0ZVTkNUSU9OID0gLTEsICAvLy88IFBoeXNpY2FsIGVuZCBvZiBmdW5jdGlvbgorICBJTUFHRV9TWU1fQ0xBU1NfTlVMTCA9IDAsICAgICAgICAgICAgICAvLy88IE5vIHN5bWJvbAorICBJTUFHRV9TWU1fQ0xBU1NfQVVUT01BVElDID0gMSwgICAgICAgICAvLy88IFN0YWNrIHZhcmlhYmxlCisgIElNQUdFX1NZTV9DTEFTU19FWFRFUk5BTCA9IDIsICAgICAgICAgIC8vLzwgRXh0ZXJuYWwgc3ltYm9sCisgIElNQUdFX1NZTV9DTEFTU19TVEFUSUMgPSAzLCAgICAgICAgICAgIC8vLzwgU3RhdGljCisgIElNQUdFX1NZTV9DTEFTU19SRUdJU1RFUiA9IDQsICAgICAgICAgIC8vLzwgUmVnaXN0ZXIgdmFyaWFibGUKKyAgSU1BR0VfU1lNX0NMQVNTX0VYVEVSTkFMX0RFRiA9IDUsICAgICAgLy8vPCBFeHRlcm5hbCBkZWZpbml0aW9uCisgIElNQUdFX1NZTV9DTEFTU19MQUJFTCA9IDYsICAgICAgICAgICAgIC8vLzwgTGFiZWwKKyAgSU1BR0VfU1lNX0NMQVNTX1VOREVGSU5FRF9MQUJFTCA9IDcsICAgLy8vPCBVbmRlZmluZWQgbGFiZWwKKyAgSU1BR0VfU1lNX0NMQVNTX01FTUJFUl9PRl9TVFJVQ1QgPSA4LCAgLy8vPCBNZW1iZXIgb2Ygc3RydWN0dXJlCisgIElNQUdFX1NZTV9DTEFTU19BUkdVTUVOVCA9IDksICAgICAgICAgIC8vLzwgRnVuY3Rpb24gYXJndW1lbnQKKyAgSU1BR0VfU1lNX0NMQVNTX1NUUlVDVF9UQUcgPSAxMCwgICAgICAgLy8vPCBTdHJ1Y3R1cmUgdGFnCisgIElNQUdFX1NZTV9DTEFTU19NRU1CRVJfT0ZfVU5JT04gPSAxMSwgIC8vLzwgTWVtYmVyIG9mIHVuaW9uCisgIElNQUdFX1NZTV9DTEFTU19VTklPTl9UQUcgPSAxMiwgICAgICAgIC8vLzwgVW5pb24gdGFnCisgIElNQUdFX1NZTV9DTEFTU19UWVBFX0RFRklOSVRJT04gPSAxMywgIC8vLzwgVHlwZSBkZWZpbml0aW9uCisgIElNQUdFX1NZTV9DTEFTU19VTkRFRklORURfU1RBVElDID0gMTQsIC8vLzwgVW5kZWZpbmVkIHN0YXRpYworICBJTUFHRV9TWU1fQ0xBU1NfRU5VTV9UQUcgPSAxNSwgICAgICAgICAvLy88IEVudW1lcmF0aW9uIHRhZworICBJTUFHRV9TWU1fQ0xBU1NfTUVNQkVSX09GX0VOVU0gPSAxNiwgICAvLy88IE1lbWJlciBvZiBlbnVtZXJhdGlvbgorICBJTUFHRV9TWU1fQ0xBU1NfUkVHSVNURVJfUEFSQU0gPSAxNywgICAvLy88IFJlZ2lzdGVyIHBhcmFtZXRlcgorICBJTUFHRV9TWU1fQ0xBU1NfQklUX0ZJRUxEID0gMTgsICAgICAgICAvLy88IEJpdCBmaWVsZAorICAvLy8gIi5iYiIgb3IgIi5lYiIgLSBiZWdpbm5pbmcgb3IgZW5kIG9mIGJsb2NrCisgIElNQUdFX1NZTV9DTEFTU19CTE9DSyA9IDEwMCwKKyAgLy8vICIuYmYiIG9yICIuZWYiIC0gYmVnaW5uaW5nIG9yIGVuZCBvZiBmdW5jdGlvbgorICBJTUFHRV9TWU1fQ0xBU1NfRlVOQ1RJT04gPSAxMDEsCisgIElNQUdFX1NZTV9DTEFTU19FTkRfT0ZfU1RSVUNUID0gMTAyLCAvLy88IEVuZCBvZiBzdHJ1Y3R1cmUKKyAgSU1BR0VfU1lNX0NMQVNTX0ZJTEUgPSAxMDMsICAgICAgICAgIC8vLzwgRmlsZSBuYW1lCisgIC8vLyBMaW5lIG51bWJlciwgcmVmb3JtYXR0ZWQgYXMgc3ltYm9sCisgIElNQUdFX1NZTV9DTEFTU19TRUNUSU9OID0gMTA0LAorICBJTUFHRV9TWU1fQ0xBU1NfV0VBS19FWFRFUk5BTCA9IDEwNSwgLy8vPCBEdXBsaWNhdGUgdGFnCisgIC8vLyBFeHRlcm5hbCBzeW1ib2wgaW4gZG1lcnQgcHVibGljIGxpYgorICBJTUFHRV9TWU1fQ0xBU1NfQ0xSX1RPS0VOID0gMTA3Cit9OworCitlbnVtIFN5bWJvbEJhc2VUeXBlIDogdW5zaWduZWQgeworICBJTUFHRV9TWU1fVFlQRV9OVUxMID0gMCwgICAvLy88IE5vIHR5cGUgaW5mb3JtYXRpb24gb3IgdW5rbm93biBiYXNlIHR5cGUuCisgIElNQUdFX1NZTV9UWVBFX1ZPSUQgPSAxLCAgIC8vLzwgVXNlZCB3aXRoIHZvaWQgcG9pbnRlcnMgYW5kIGZ1bmN0aW9ucy4KKyAgSU1BR0VfU1lNX1RZUEVfQ0hBUiA9IDIsICAgLy8vPCBBIGNoYXJhY3RlciAoc2lnbmVkIGJ5dGUpLgorICBJTUFHRV9TWU1fVFlQRV9TSE9SVCA9IDMsICAvLy88IEEgMi1ieXRlIHNpZ25lZCBpbnRlZ2VyLgorICBJTUFHRV9TWU1fVFlQRV9JTlQgPSA0LCAgICAvLy88IEEgbmF0dXJhbCBpbnRlZ2VyIHR5cGUgb24gdGhlIHRhcmdldC4KKyAgSU1BR0VfU1lNX1RZUEVfTE9ORyA9IDUsICAgLy8vPCBBIDQtYnl0ZSBzaWduZWQgaW50ZWdlci4KKyAgSU1BR0VfU1lNX1RZUEVfRkxPQVQgPSA2LCAgLy8vPCBBIDQtYnl0ZSBmbG9hdGluZy1wb2ludCBudW1iZXIuCisgIElNQUdFX1NZTV9UWVBFX0RPVUJMRSA9IDcsIC8vLzwgQW4gOC1ieXRlIGZsb2F0aW5nLXBvaW50IG51bWJlci4KKyAgSU1BR0VfU1lNX1RZUEVfU1RSVUNUID0gOCwgLy8vPCBBIHN0cnVjdHVyZS4KKyAgSU1BR0VfU1lNX1RZUEVfVU5JT04gPSA5LCAgLy8vPCBBbiB1bmlvbi4KKyAgSU1BR0VfU1lNX1RZUEVfRU5VTSA9IDEwLCAgLy8vPCBBbiBlbnVtZXJhdGVkIHR5cGUuCisgIElNQUdFX1NZTV9UWVBFX01PRSA9IDExLCAgIC8vLzwgQSBtZW1iZXIgb2YgZW51bWVyYXRpb24gKGEgc3BlY2lmaWMgdmFsdWUpLgorICBJTUFHRV9TWU1fVFlQRV9CWVRFID0gMTIsICAvLy88IEEgYnl0ZTsgdW5zaWduZWQgMS1ieXRlIGludGVnZXIuCisgIElNQUdFX1NZTV9UWVBFX1dPUkQgPSAxMywgIC8vLzwgQSB3b3JkOyB1bnNpZ25lZCAyLWJ5dGUgaW50ZWdlci4KKyAgSU1BR0VfU1lNX1RZUEVfVUlOVCA9IDE0LCAgLy8vPCBBbiB1bnNpZ25lZCBpbnRlZ2VyIG9mIG5hdHVyYWwgc2l6ZS4KKyAgSU1BR0VfU1lNX1RZUEVfRFdPUkQgPSAxNSAgLy8vPCBBbiB1bnNpZ25lZCA0LWJ5dGUgaW50ZWdlci4KK307CisKK2VudW0gU3ltYm9sQ29tcGxleFR5cGUgOiB1bnNpZ25lZCB7CisgIElNQUdFX1NZTV9EVFlQRV9OVUxMID0gMCwgICAgIC8vLzwgTm8gY29tcGxleCB0eXBlOyBzaW1wbGUgc2NhbGFyIHZhcmlhYmxlLgorICBJTUFHRV9TWU1fRFRZUEVfUE9JTlRFUiA9IDEsICAvLy88IEEgcG9pbnRlciB0byBiYXNlIHR5cGUuCisgIElNQUdFX1NZTV9EVFlQRV9GVU5DVElPTiA9IDIsIC8vLzwgQSBmdW5jdGlvbiB0aGF0IHJldHVybnMgYSBiYXNlIHR5cGUuCisgIElNQUdFX1NZTV9EVFlQRV9BUlJBWSA9IDMsICAgIC8vLzwgQW4gYXJyYXkgb2YgYmFzZSB0eXBlLgorCisgIC8vLyBUeXBlIGlzIGZvcm1lZCBhcyAoYmFzZSArIChkZXJpdmVkIDw8IFNDVF9DT01QTEVYX1RZUEVfU0hJRlQpKQorICBTQ1RfQ09NUExFWF9UWVBFX1NISUZUID0gNAorfTsKKworZW51bSBBdXhTeW1ib2xUeXBlIHsgSU1BR0VfQVVYX1NZTUJPTF9UWVBFX1RPS0VOX0RFRiA9IDEgfTsKKworc3RydWN0IHNlY3Rpb24geworICBjaGFyIE5hbWVbTmFtZVNpemVdOworICB1aW50MzJfdCBWaXJ0dWFsU2l6ZTsKKyAgdWludDMyX3QgVmlydHVhbEFkZHJlc3M7CisgIHVpbnQzMl90IFNpemVPZlJhd0RhdGE7CisgIHVpbnQzMl90IFBvaW50ZXJUb1Jhd0RhdGE7CisgIHVpbnQzMl90IFBvaW50ZXJUb1JlbG9jYXRpb25zOworICB1aW50MzJfdCBQb2ludGVyVG9MaW5lTnVtYmVyczsKKyAgdWludDE2X3QgTnVtYmVyT2ZSZWxvY2F0aW9uczsKKyAgdWludDE2X3QgTnVtYmVyT2ZMaW5lTnVtYmVyczsKKyAgdWludDMyX3QgQ2hhcmFjdGVyaXN0aWNzOworfTsKKworZW51bSBTZWN0aW9uQ2hhcmFjdGVyaXN0aWNzIDogdWludDMyX3QgeworICBTQ19JbnZhbGlkID0gMHhmZmZmZmZmZiwKKworICBJTUFHRV9TQ05fVFlQRV9OT0xPQUQgPSAweDAwMDAwMDAyLAorICBJTUFHRV9TQ05fVFlQRV9OT19QQUQgPSAweDAwMDAwMDA4LAorICBJTUFHRV9TQ05fQ05UX0NPREUgPSAweDAwMDAwMDIwLAorICBJTUFHRV9TQ05fQ05UX0lOSVRJQUxJWkVEX0RBVEEgPSAweDAwMDAwMDQwLAorICBJTUFHRV9TQ05fQ05UX1VOSU5JVElBTElaRURfREFUQSA9IDB4MDAwMDAwODAsCisgIElNQUdFX1NDTl9MTktfT1RIRVIgPSAweDAwMDAwMTAwLAorICBJTUFHRV9TQ05fTE5LX0lORk8gPSAweDAwMDAwMjAwLAorICBJTUFHRV9TQ05fTE5LX1JFTU9WRSA9IDB4MDAwMDA4MDAsCisgIElNQUdFX1NDTl9MTktfQ09NREFUID0gMHgwMDAwMTAwMCwKKyAgSU1BR0VfU0NOX0dQUkVMID0gMHgwMDAwODAwMCwKKyAgSU1BR0VfU0NOX01FTV9QVVJHRUFCTEUgPSAweDAwMDIwMDAwLAorICBJTUFHRV9TQ05fTUVNXzE2QklUID0gMHgwMDAyMDAwMCwKKyAgSU1BR0VfU0NOX01FTV9MT0NLRUQgPSAweDAwMDQwMDAwLAorICBJTUFHRV9TQ05fTUVNX1BSRUxPQUQgPSAweDAwMDgwMDAwLAorICBJTUFHRV9TQ05fQUxJR05fMUJZVEVTID0gMHgwMDEwMDAwMCwKKyAgSU1BR0VfU0NOX0FMSUdOXzJCWVRFUyA9IDB4MDAyMDAwMDAsCisgIElNQUdFX1NDTl9BTElHTl80QllURVMgPSAweDAwMzAwMDAwLAorICBJTUFHRV9TQ05fQUxJR05fOEJZVEVTID0gMHgwMDQwMDAwMCwKKyAgSU1BR0VfU0NOX0FMSUdOXzE2QllURVMgPSAweDAwNTAwMDAwLAorICBJTUFHRV9TQ05fQUxJR05fMzJCWVRFUyA9IDB4MDA2MDAwMDAsCisgIElNQUdFX1NDTl9BTElHTl82NEJZVEVTID0gMHgwMDcwMDAwMCwKKyAgSU1BR0VfU0NOX0FMSUdOXzEyOEJZVEVTID0gMHgwMDgwMDAwMCwKKyAgSU1BR0VfU0NOX0FMSUdOXzI1NkJZVEVTID0gMHgwMDkwMDAwMCwKKyAgSU1BR0VfU0NOX0FMSUdOXzUxMkJZVEVTID0gMHgwMEEwMDAwMCwKKyAgSU1BR0VfU0NOX0FMSUdOXzEwMjRCWVRFUyA9IDB4MDBCMDAwMDAsCisgIElNQUdFX1NDTl9BTElHTl8yMDQ4QllURVMgPSAweDAwQzAwMDAwLAorICBJTUFHRV9TQ05fQUxJR05fNDA5NkJZVEVTID0gMHgwMEQwMDAwMCwKKyAgSU1BR0VfU0NOX0FMSUdOXzgxOTJCWVRFUyA9IDB4MDBFMDAwMDAsCisgIElNQUdFX1NDTl9MTktfTlJFTE9DX09WRkwgPSAweDAxMDAwMDAwLAorICBJTUFHRV9TQ05fTUVNX0RJU0NBUkRBQkxFID0gMHgwMjAwMDAwMCwKKyAgSU1BR0VfU0NOX01FTV9OT1RfQ0FDSEVEID0gMHgwNDAwMDAwMCwKKyAgSU1BR0VfU0NOX01FTV9OT1RfUEFHRUQgPSAweDA4MDAwMDAwLAorICBJTUFHRV9TQ05fTUVNX1NIQVJFRCA9IDB4MTAwMDAwMDAsCisgIElNQUdFX1NDTl9NRU1fRVhFQ1VURSA9IDB4MjAwMDAwMDAsCisgIElNQUdFX1NDTl9NRU1fUkVBRCA9IDB4NDAwMDAwMDAsCisgIElNQUdFX1NDTl9NRU1fV1JJVEUgPSAweDgwMDAwMDAwCit9OworCitzdHJ1Y3QgcmVsb2NhdGlvbiB7CisgIHVpbnQzMl90IFZpcnR1YWxBZGRyZXNzOworICB1aW50MzJfdCBTeW1ib2xUYWJsZUluZGV4OworICB1aW50MTZfdCBUeXBlOworfTsKKworZW51bSBSZWxvY2F0aW9uVHlwZUkzODYgOiB1bnNpZ25lZCB7CisgIElNQUdFX1JFTF9JMzg2X0FCU09MVVRFID0gMHgwMDAwLAorICBJTUFHRV9SRUxfSTM4Nl9ESVIxNiA9IDB4MDAwMSwKKyAgSU1BR0VfUkVMX0kzODZfUkVMMTYgPSAweDAwMDIsCisgIElNQUdFX1JFTF9JMzg2X0RJUjMyID0gMHgwMDA2LAorICBJTUFHRV9SRUxfSTM4Nl9ESVIzMk5CID0gMHgwMDA3LAorICBJTUFHRV9SRUxfSTM4Nl9TRUcxMiA9IDB4MDAwOSwKKyAgSU1BR0VfUkVMX0kzODZfU0VDVElPTiA9IDB4MDAwQSwKKyAgSU1BR0VfUkVMX0kzODZfU0VDUkVMID0gMHgwMDBCLAorICBJTUFHRV9SRUxfSTM4Nl9UT0tFTiA9IDB4MDAwQywKKyAgSU1BR0VfUkVMX0kzODZfU0VDUkVMNyA9IDB4MDAwRCwKKyAgSU1BR0VfUkVMX0kzODZfUkVMMzIgPSAweDAwMTQKK307CisKK2VudW0gUmVsb2NhdGlvblR5cGVBTUQ2NCA6IHVuc2lnbmVkIHsKKyAgSU1BR0VfUkVMX0FNRDY0X0FCU09MVVRFID0gMHgwMDAwLAorICBJTUFHRV9SRUxfQU1ENjRfQUREUjY0ID0gMHgwMDAxLAorICBJTUFHRV9SRUxfQU1ENjRfQUREUjMyID0gMHgwMDAyLAorICBJTUFHRV9SRUxfQU1ENjRfQUREUjMyTkIgPSAweDAwMDMsCisgIElNQUdFX1JFTF9BTUQ2NF9SRUwzMiA9IDB4MDAwNCwKKyAgSU1BR0VfUkVMX0FNRDY0X1JFTDMyXzEgPSAweDAwMDUsCisgIElNQUdFX1JFTF9BTUQ2NF9SRUwzMl8yID0gMHgwMDA2LAorICBJTUFHRV9SRUxfQU1ENjRfUkVMMzJfMyA9IDB4MDAwNywKKyAgSU1BR0VfUkVMX0FNRDY0X1JFTDMyXzQgPSAweDAwMDgsCisgIElNQUdFX1JFTF9BTUQ2NF9SRUwzMl81ID0gMHgwMDA5LAorICBJTUFHRV9SRUxfQU1ENjRfU0VDVElPTiA9IDB4MDAwQSwKKyAgSU1BR0VfUkVMX0FNRDY0X1NFQ1JFTCA9IDB4MDAwQiwKKyAgSU1BR0VfUkVMX0FNRDY0X1NFQ1JFTDcgPSAweDAwMEMsCisgIElNQUdFX1JFTF9BTUQ2NF9UT0tFTiA9IDB4MDAwRCwKKyAgSU1BR0VfUkVMX0FNRDY0X1NSRUwzMiA9IDB4MDAwRSwKKyAgSU1BR0VfUkVMX0FNRDY0X1BBSVIgPSAweDAwMEYsCisgIElNQUdFX1JFTF9BTUQ2NF9TU1BBTjMyID0gMHgwMDEwCit9OworCitlbnVtIFJlbG9jYXRpb25UeXBlc0FSTSA6IHVuc2lnbmVkIHsKKyAgSU1BR0VfUkVMX0FSTV9BQlNPTFVURSA9IDB4MDAwMCwKKyAgSU1BR0VfUkVMX0FSTV9BRERSMzIgPSAweDAwMDEsCisgIElNQUdFX1JFTF9BUk1fQUREUjMyTkIgPSAweDAwMDIsCisgIElNQUdFX1JFTF9BUk1fQlJBTkNIMjQgPSAweDAwMDMsCisgIElNQUdFX1JFTF9BUk1fQlJBTkNIMTEgPSAweDAwMDQsCisgIElNQUdFX1JFTF9BUk1fVE9LRU4gPSAweDAwMDUsCisgIElNQUdFX1JFTF9BUk1fQkxYMjQgPSAweDAwMDgsCisgIElNQUdFX1JFTF9BUk1fQkxYMTEgPSAweDAwMDksCisgIElNQUdFX1JFTF9BUk1fU0VDVElPTiA9IDB4MDAwRSwKKyAgSU1BR0VfUkVMX0FSTV9TRUNSRUwgPSAweDAwMEYsCisgIElNQUdFX1JFTF9BUk1fTU9WMzJBID0gMHgwMDEwLAorICBJTUFHRV9SRUxfQVJNX01PVjMyVCA9IDB4MDAxMSwKKyAgSU1BR0VfUkVMX0FSTV9CUkFOQ0gyMFQgPSAweDAwMTIsCisgIElNQUdFX1JFTF9BUk1fQlJBTkNIMjRUID0gMHgwMDE0LAorICBJTUFHRV9SRUxfQVJNX0JMWDIzVCA9IDB4MDAxNQorfTsKKworZW51bSBSZWxvY2F0aW9uVHlwZXNBUk02NCA6IHVuc2lnbmVkIHsKKyAgSU1BR0VfUkVMX0FSTTY0X0FCU09MVVRFID0gMHgwMDAwLAorICBJTUFHRV9SRUxfQVJNNjRfQUREUjMyID0gMHgwMDAxLAorICBJTUFHRV9SRUxfQVJNNjRfQUREUjMyTkIgPSAweDAwMDIsCisgIElNQUdFX1JFTF9BUk02NF9CUkFOQ0gyNiA9IDB4MDAwMywKKyAgSU1BR0VfUkVMX0FSTTY0X1BBR0VCQVNFX1JFTDIxID0gMHgwMDA0LAorICBJTUFHRV9SRUxfQVJNNjRfUkVMMjEgPSAweDAwMDUsCisgIElNQUdFX1JFTF9BUk02NF9QQUdFT0ZGU0VUXzEyQSA9IDB4MDAwNiwKKyAgSU1BR0VfUkVMX0FSTTY0X1BBR0VPRkZTRVRfMTJMID0gMHgwMDA3LAorICBJTUFHRV9SRUxfQVJNNjRfU0VDUkVMID0gMHgwMDA4LAorICBJTUFHRV9SRUxfQVJNNjRfU0VDUkVMX0xPVzEyQSA9IDB4MDAwOSwKKyAgSU1BR0VfUkVMX0FSTTY0X1NFQ1JFTF9ISUdIMTJBID0gMHgwMDBBLAorICBJTUFHRV9SRUxfQVJNNjRfU0VDUkVMX0xPVzEyTCA9IDB4MDAwQiwKKyAgSU1BR0VfUkVMX0FSTTY0X1RPS0VOID0gMHgwMDBDLAorICBJTUFHRV9SRUxfQVJNNjRfU0VDVElPTiA9IDB4MDAwRCwKKyAgSU1BR0VfUkVMX0FSTTY0X0FERFI2NCA9IDB4MDAwRSwKKyAgSU1BR0VfUkVMX0FSTTY0X0JSQU5DSDE5ID0gMHgwMDBGLAorICBJTUFHRV9SRUxfQVJNNjRfQlJBTkNIMTQgPSAweDAwMTAsCit9OworCitlbnVtIENPTURBVFR5cGUgOiB1bnNpZ25lZCB7CisgIElNQUdFX0NPTURBVF9TRUxFQ1RfTk9EVVBMSUNBVEVTID0gMSwKKyAgSU1BR0VfQ09NREFUX1NFTEVDVF9BTlksCisgIElNQUdFX0NPTURBVF9TRUxFQ1RfU0FNRV9TSVpFLAorICBJTUFHRV9DT01EQVRfU0VMRUNUX0VYQUNUX01BVENILAorICBJTUFHRV9DT01EQVRfU0VMRUNUX0FTU09DSUFUSVZFLAorICBJTUFHRV9DT01EQVRfU0VMRUNUX0xBUkdFU1QsCisgIElNQUdFX0NPTURBVF9TRUxFQ1RfTkVXRVNUCit9OworCisvLyBBdXhpbGlhcnkgU3ltYm9sIEZvcm1hdHMKK3N0cnVjdCBBdXhpbGlhcnlGdW5jdGlvbkRlZmluaXRpb24geworICB1aW50MzJfdCBUYWdJbmRleDsKKyAgdWludDMyX3QgVG90YWxTaXplOworICB1aW50MzJfdCBQb2ludGVyVG9MaW5lbnVtYmVyOworICB1aW50MzJfdCBQb2ludGVyVG9OZXh0RnVuY3Rpb247CisgIGNoYXIgdW51c2VkWzJdOworfTsKKworc3RydWN0IEF1eGlsaWFyeWJmQW5kZWZTeW1ib2wgeworICB1aW50OF90IHVudXNlZDFbNF07CisgIHVpbnQxNl90IExpbmVudW1iZXI7CisgIHVpbnQ4X3QgdW51c2VkMls2XTsKKyAgdWludDMyX3QgUG9pbnRlclRvTmV4dEZ1bmN0aW9uOworICB1aW50OF90IHVudXNlZDNbMl07Cit9OworCitzdHJ1Y3QgQXV4aWxpYXJ5V2Vha0V4dGVybmFsIHsKKyAgdWludDMyX3QgVGFnSW5kZXg7CisgIHVpbnQzMl90IENoYXJhY3RlcmlzdGljczsKKyAgdWludDhfdCB1bnVzZWRbMTBdOworfTsKKworZW51bSBXZWFrRXh0ZXJuYWxDaGFyYWN0ZXJpc3RpY3MgOiB1bnNpZ25lZCB7CisgIElNQUdFX1dFQUtfRVhURVJOX1NFQVJDSF9OT0xJQlJBUlkgPSAxLAorICBJTUFHRV9XRUFLX0VYVEVSTl9TRUFSQ0hfTElCUkFSWSA9IDIsCisgIElNQUdFX1dFQUtfRVhURVJOX1NFQVJDSF9BTElBUyA9IDMKK307CisKK3N0cnVjdCBBdXhpbGlhcnlTZWN0aW9uRGVmaW5pdGlvbiB7CisgIHVpbnQzMl90IExlbmd0aDsKKyAgdWludDE2X3QgTnVtYmVyT2ZSZWxvY2F0aW9uczsKKyAgdWludDE2X3QgTnVtYmVyT2ZMaW5lbnVtYmVyczsKKyAgdWludDMyX3QgQ2hlY2tTdW07CisgIHVpbnQzMl90IE51bWJlcjsKKyAgdWludDhfdCBTZWxlY3Rpb247CisgIGNoYXIgdW51c2VkOworfTsKKworc3RydWN0IEF1eGlsaWFyeUNMUlRva2VuIHsKKyAgdWludDhfdCBBdXhUeXBlOworICB1aW50OF90IHVudXNlZDE7CisgIHVpbnQzMl90IFN5bWJvbFRhYmxlSW5kZXg7CisgIGNoYXIgdW51c2VkMlsxMl07Cit9OworCit1bmlvbiBBdXhpbGlhcnkgeworICBBdXhpbGlhcnlGdW5jdGlvbkRlZmluaXRpb24gRnVuY3Rpb25EZWZpbml0aW9uOworICBBdXhpbGlhcnliZkFuZGVmU3ltYm9sIGJmQW5kZWZTeW1ib2w7CisgIEF1eGlsaWFyeVdlYWtFeHRlcm5hbCBXZWFrRXh0ZXJuYWw7CisgIEF1eGlsaWFyeVNlY3Rpb25EZWZpbml0aW9uIFNlY3Rpb25EZWZpbml0aW9uOworfTsKKworLy8vIEBicmllZiBUaGUgSW1wb3J0IERpcmVjdG9yeSBUYWJsZS4KKy8vLworLy8vIFRoZXJlIGlzIGEgc2luZ2xlIGFycmF5IG9mIHRoZXNlIGFuZCBvbmUgZW50cnkgcGVyIGltcG9ydGVkIERMTC4KK3N0cnVjdCBJbXBvcnREaXJlY3RvcnlUYWJsZUVudHJ5IHsKKyAgdWludDMyX3QgSW1wb3J0TG9va3VwVGFibGVSVkE7CisgIHVpbnQzMl90IFRpbWVEYXRlU3RhbXA7CisgIHVpbnQzMl90IEZvcndhcmRlckNoYWluOworICB1aW50MzJfdCBOYW1lUlZBOworICB1aW50MzJfdCBJbXBvcnRBZGRyZXNzVGFibGVSVkE7Cit9OworCisvLy8gQGJyaWVmIFRoZSBQRTMyIEltcG9ydCBMb29rdXAgVGFibGUuCisvLy8KKy8vLyBUaGVyZSBpcyBhbiBhcnJheSBvZiB0aGVzZSBmb3IgZWFjaCBpbXBvcnRlZCBETEwuIEl0IHJlcHJlc2VudHMgZWl0aGVyCisvLy8gdGhlIG9yZGluYWwgdG8gaW1wb3J0IGZyb20gdGhlIHRhcmdldCBETEwsIG9yIGEgbmFtZSB0byBsb29rdXAgYW5kIGltcG9ydAorLy8vIGZyb20gdGhlIHRhcmdldCBETEwuCisvLy8KKy8vLyBUaGlzIGFsc28gaGFwcGVucyB0byBiZSB0aGUgc2FtZSBmb3JtYXQgdXNlZCBieSB0aGUgSW1wb3J0IEFkZHJlc3MgVGFibGUKKy8vLyB3aGVuIGl0IGlzIGluaXRpYWxseSB3cml0dGVuIG91dCB0byB0aGUgaW1hZ2UuCitzdHJ1Y3QgSW1wb3J0TG9va3VwVGFibGVFbnRyeTMyIHsKKyAgdWludDMyX3QgZGF0YTsKKworICAvLy8gQGJyaWVmIElzIHRoaXMgZW50cnkgc3BlY2lmaWVkIGJ5IG9yZGluYWwsIG9yIG5hbWU/CisgIGJvb2wgaXNPcmRpbmFsKCkgY29uc3QgeyByZXR1cm4gZGF0YSAmIDB4ODAwMDAwMDA7IH0KKworICAvLy8gQGJyaWVmIEdldCB0aGUgb3JkaW5hbCB2YWx1ZSBvZiB0aGlzIGVudHJ5LiBpc09yZGluYWwgbXVzdCBiZSB0cnVlLgorICB1aW50MTZfdCBnZXRPcmRpbmFsKCkgY29uc3QgeworICAgIGFzc2VydChpc09yZGluYWwoKSAmJiAiSUxUIGVudHJ5IGlzIG5vdCBhbiBvcmRpbmFsISIpOworICAgIHJldHVybiBkYXRhICYgMHhGRkZGOworICB9CisKKyAgLy8vIEBicmllZiBTZXQgdGhlIG9yZGluYWwgdmFsdWUgYW5kIHNldCBpc09yZGluYWwgdG8gdHJ1ZS4KKyAgdm9pZCBzZXRPcmRpbmFsKHVpbnQxNl90IG8pIHsKKyAgICBkYXRhID0gbzsKKyAgICBkYXRhIHw9IDB4ODAwMDAwMDA7CisgIH0KKworICAvLy8gQGJyaWVmIEdldCB0aGUgSGludC9OYW1lIGVudHJ5IFJWQS4gaXNPcmRpbmFsIG11c3QgYmUgZmFsc2UuCisgIHVpbnQzMl90IGdldEhpbnROYW1lUlZBKCkgY29uc3QgeworICAgIGFzc2VydCghaXNPcmRpbmFsKCkgJiYgIklMVCBlbnRyeSBpcyBub3QgYSBIaW50L05hbWUgUlZBISIpOworICAgIHJldHVybiBkYXRhOworICB9CisKKyAgLy8vIEBicmllZiBTZXQgdGhlIEhpbnQvTmFtZSBlbnRyeSBSVkEgYW5kIHNldCBpc09yZGluYWwgdG8gZmFsc2UuCisgIHZvaWQgc2V0SGludE5hbWVSVkEodWludDMyX3QgcnZhKSB7IGRhdGEgPSBydmE7IH0KK307CisKKy8vLyBAYnJpZWYgVGhlIERPUyBjb21wYXRpYmxlIGhlYWRlciBhdCB0aGUgZnJvbnQgb2YgYWxsIFBFcy4KK3N0cnVjdCBET1NIZWFkZXIgeworICB1aW50MTZfdCBNYWdpYzsKKyAgdWludDE2X3QgVXNlZEJ5dGVzSW5UaGVMYXN0UGFnZTsKKyAgdWludDE2X3QgRmlsZVNpemVJblBhZ2VzOworICB1aW50MTZfdCBOdW1iZXJPZlJlbG9jYXRpb25JdGVtczsKKyAgdWludDE2X3QgSGVhZGVyU2l6ZUluUGFyYWdyYXBoczsKKyAgdWludDE2X3QgTWluaW11bUV4dHJhUGFyYWdyYXBoczsKKyAgdWludDE2X3QgTWF4aW11bUV4dHJhUGFyYWdyYXBoczsKKyAgdWludDE2X3QgSW5pdGlhbFJlbGF0aXZlU1M7CisgIHVpbnQxNl90IEluaXRpYWxTUDsKKyAgdWludDE2X3QgQ2hlY2tzdW07CisgIHVpbnQxNl90IEluaXRpYWxJUDsKKyAgdWludDE2X3QgSW5pdGlhbFJlbGF0aXZlQ1M7CisgIHVpbnQxNl90IEFkZHJlc3NPZlJlbG9jYXRpb25UYWJsZTsKKyAgdWludDE2X3QgT3ZlcmxheU51bWJlcjsKKyAgdWludDE2X3QgUmVzZXJ2ZWRbNF07CisgIHVpbnQxNl90IE9FTWlkOworICB1aW50MTZfdCBPRU1pbmZvOworICB1aW50MTZfdCBSZXNlcnZlZDJbMTBdOworICB1aW50MzJfdCBBZGRyZXNzT2ZOZXdFeGVIZWFkZXI7Cit9OworCitzdHJ1Y3QgUEUzMkhlYWRlciB7CisgIGVudW0geyBQRTMyID0gMHgxMGIsIFBFMzJfUExVUyA9IDB4MjBiIH07CisKKyAgdWludDE2X3QgTWFnaWM7CisgIHVpbnQ4X3QgTWFqb3JMaW5rZXJWZXJzaW9uOworICB1aW50OF90IE1pbm9yTGlua2VyVmVyc2lvbjsKKyAgdWludDMyX3QgU2l6ZU9mQ29kZTsKKyAgdWludDMyX3QgU2l6ZU9mSW5pdGlhbGl6ZWREYXRhOworICB1aW50MzJfdCBTaXplT2ZVbmluaXRpYWxpemVkRGF0YTsKKyAgdWludDMyX3QgQWRkcmVzc09mRW50cnlQb2ludDsgLy8gUlZBCisgIHVpbnQzMl90IEJhc2VPZkNvZGU7ICAgICAgICAgIC8vIFJWQQorICB1aW50MzJfdCBCYXNlT2ZEYXRhOyAgICAgICAgICAvLyBSVkEKKyAgdWludDMyX3QgSW1hZ2VCYXNlOworICB1aW50MzJfdCBTZWN0aW9uQWxpZ25tZW50OworICB1aW50MzJfdCBGaWxlQWxpZ25tZW50OworICB1aW50MTZfdCBNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb247CisgIHVpbnQxNl90IE1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsKKyAgdWludDE2X3QgTWFqb3JJbWFnZVZlcnNpb247CisgIHVpbnQxNl90IE1pbm9ySW1hZ2VWZXJzaW9uOworICB1aW50MTZfdCBNYWpvclN1YnN5c3RlbVZlcnNpb247CisgIHVpbnQxNl90IE1pbm9yU3Vic3lzdGVtVmVyc2lvbjsKKyAgdWludDMyX3QgV2luMzJWZXJzaW9uVmFsdWU7CisgIHVpbnQzMl90IFNpemVPZkltYWdlOworICB1aW50MzJfdCBTaXplT2ZIZWFkZXJzOworICB1aW50MzJfdCBDaGVja1N1bTsKKyAgdWludDE2X3QgU3Vic3lzdGVtOworICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgRGxsQ2hhcmFjdGVyaXN0aWNzIHRvIG1hdGNoIHRoZSBDT0ZGIHNwZWMuCisgIHVpbnQxNl90IERMTENoYXJhY3RlcmlzdGljczsKKyAgdWludDMyX3QgU2l6ZU9mU3RhY2tSZXNlcnZlOworICB1aW50MzJfdCBTaXplT2ZTdGFja0NvbW1pdDsKKyAgdWludDMyX3QgU2l6ZU9mSGVhcFJlc2VydmU7CisgIHVpbnQzMl90IFNpemVPZkhlYXBDb21taXQ7CisgIHVpbnQzMl90IExvYWRlckZsYWdzOworICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgTnVtYmVyT2ZSdmFBbmRTaXplcyB0byBtYXRjaCB0aGUgQ09GRiBzcGVjLgorICB1aW50MzJfdCBOdW1iZXJPZlJ2YUFuZFNpemU7Cit9OworCitzdHJ1Y3QgRGF0YURpcmVjdG9yeSB7CisgIHVpbnQzMl90IFJlbGF0aXZlVmlydHVhbEFkZHJlc3M7CisgIHVpbnQzMl90IFNpemU7Cit9OworCitlbnVtIERhdGFEaXJlY3RvcnlJbmRleCA6IHVuc2lnbmVkIHsKKyAgRVhQT1JUX1RBQkxFID0gMCwKKyAgSU1QT1JUX1RBQkxFLAorICBSRVNPVVJDRV9UQUJMRSwKKyAgRVhDRVBUSU9OX1RBQkxFLAorICBDRVJUSUZJQ0FURV9UQUJMRSwKKyAgQkFTRV9SRUxPQ0FUSU9OX1RBQkxFLAorICBERUJVR19ESVJFQ1RPUlksCisgIEFSQ0hJVEVDVFVSRSwKKyAgR0xPQkFMX1BUUiwKKyAgVExTX1RBQkxFLAorICBMT0FEX0NPTkZJR19UQUJMRSwKKyAgQk9VTkRfSU1QT1JULAorICBJQVQsCisgIERFTEFZX0lNUE9SVF9ERVNDUklQVE9SLAorICBDTFJfUlVOVElNRV9IRUFERVIsCisKKyAgTlVNX0RBVEFfRElSRUNUT1JJRVMKK307CisKK2VudW0gV2luZG93c1N1YnN5c3RlbSA6IHVuc2lnbmVkIHsKKyAgSU1BR0VfU1VCU1lTVEVNX1VOS05PV04gPSAwLCAvLy88IEFuIHVua25vd24gc3Vic3lzdGVtLgorICBJTUFHRV9TVUJTWVNURU1fTkFUSVZFID0gMSwgIC8vLzwgRGV2aWNlIGRyaXZlcnMgYW5kIG5hdGl2ZSBXaW5kb3dzIHByb2Nlc3NlcworICBJTUFHRV9TVUJTWVNURU1fV0lORE9XU19HVUkgPSAyLCAgICAgIC8vLzwgVGhlIFdpbmRvd3MgR1VJIHN1YnN5c3RlbS4KKyAgSU1BR0VfU1VCU1lTVEVNX1dJTkRPV1NfQ1VJID0gMywgICAgICAvLy88IFRoZSBXaW5kb3dzIGNoYXJhY3RlciBzdWJzeXN0ZW0uCisgIElNQUdFX1NVQlNZU1RFTV9PUzJfQ1VJID0gNSwgICAgICAgICAgLy8vPCBUaGUgT1MvMiBjaGFyYWN0ZXIgc3Vic3l0ZW0uCisgIElNQUdFX1NVQlNZU1RFTV9QT1NJWF9DVUkgPSA3LCAgICAgICAgLy8vPCBUaGUgUE9TSVggY2hhcmFjdGVyIHN1YnN5c3RlbS4KKyAgSU1BR0VfU1VCU1lTVEVNX05BVElWRV9XSU5ET1dTID0gOCwgICAvLy88IE5hdGl2ZSBXaW5kb3dzIDl4IGRyaXZlci4KKyAgSU1BR0VfU1VCU1lTVEVNX1dJTkRPV1NfQ0VfR1VJID0gOSwgICAvLy88IFdpbmRvd3MgQ0UuCisgIElNQUdFX1NVQlNZU1RFTV9FRklfQVBQTElDQVRJT04gPSAxMCwgLy8vPCBBbiBFRkkgYXBwbGljYXRpb24uCisgIElNQUdFX1NVQlNZU1RFTV9FRklfQk9PVF9TRVJWSUNFX0RSSVZFUiA9IDExLCAvLy88IEFuIEVGSSBkcml2ZXIgd2l0aCBib290CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy8gIHNlcnZpY2VzLgorICBJTUFHRV9TVUJTWVNURU1fRUZJX1JVTlRJTUVfRFJJVkVSID0gMTIsICAgICAgLy8vPCBBbiBFRkkgZHJpdmVyIHdpdGggcnVuLXRpbWUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyAgc2VydmljZXMuCisgIElNQUdFX1NVQlNZU1RFTV9FRklfUk9NID0gMTMsICAgICAgICAgICAgICAgICAvLy88IEFuIEVGSSBST00gaW1hZ2UuCisgIElNQUdFX1NVQlNZU1RFTV9YQk9YID0gMTQsICAgICAgICAgICAgICAgICAgICAvLy88IFhCT1guCisgIElNQUdFX1NVQlNZU1RFTV9XSU5ET1dTX0JPT1RfQVBQTElDQVRJT04gPSAxNiAvLy88IEEgQkNEIGFwcGxpY2F0aW9uLgorfTsKKworZW51bSBETExDaGFyYWN0ZXJpc3RpY3MgOiB1bnNpZ25lZCB7CisgIC8vLyBBU0xSIHdpdGggNjQgYml0IGFkZHJlc3Mgc3BhY2UuCisgIElNQUdFX0RMTF9DSEFSQUNURVJJU1RJQ1NfSElHSF9FTlRST1BZX1ZBID0gMHgwMDIwLAorICAvLy8gRExMIGNhbiBiZSByZWxvY2F0ZWQgYXQgbG9hZCB0aW1lLgorICBJTUFHRV9ETExfQ0hBUkFDVEVSSVNUSUNTX0RZTkFNSUNfQkFTRSA9IDB4MDA0MCwKKyAgLy8vIENvZGUgaW50ZWdyaXR5IGNoZWNrcyBhcmUgZW5mb3JjZWQuCisgIElNQUdFX0RMTF9DSEFSQUNURVJJU1RJQ1NfRk9SQ0VfSU5URUdSSVRZID0gMHgwMDgwLAorICAvLy88IEltYWdlIGlzIE5YIGNvbXBhdGlibGUuCisgIElNQUdFX0RMTF9DSEFSQUNURVJJU1RJQ1NfTlhfQ09NUEFUID0gMHgwMTAwLAorICAvLy8gSXNvbGF0aW9uIGF3YXJlLCBidXQgZG8gbm90IGlzb2xhdGUgdGhlIGltYWdlLgorICBJTUFHRV9ETExfQ0hBUkFDVEVSSVNUSUNTX05PX0lTT0xBVElPTiA9IDB4MDIwMCwKKyAgLy8vIERvZXMgbm90IHVzZSBzdHJ1Y3R1cmVkIGV4Y2VwdGlvbiBoYW5kbGluZyAoU0VIKS4gTm8gU0VIIGhhbmRsZXIgbWF5IGJlCisgIC8vLyBjYWxsZWQgaW4gdGhpcyBpbWFnZS4KKyAgSU1BR0VfRExMX0NIQVJBQ1RFUklTVElDU19OT19TRUggPSAweDA0MDAsCisgIC8vLyBEbyBub3QgYmluZCB0aGUgaW1hZ2UuCisgIElNQUdFX0RMTF9DSEFSQUNURVJJU1RJQ1NfTk9fQklORCA9IDB4MDgwMCwKKyAgLy8vPCBJbWFnZSBzaG91bGQgZXhlY3V0ZSBpbiBhbiBBcHBDb250YWluZXIuCisgIElNQUdFX0RMTF9DSEFSQUNURVJJU1RJQ1NfQVBQQ09OVEFJTkVSID0gMHgxMDAwLAorICAvLy88IEEgV0RNIGRyaXZlci4KKyAgSU1BR0VfRExMX0NIQVJBQ1RFUklTVElDU19XRE1fRFJJVkVSID0gMHgyMDAwLAorICAvLy88IEltYWdlIHN1cHBvcnRzIENvbnRyb2wgRmxvdyBHdWFyZC4KKyAgSU1BR0VfRExMX0NIQVJBQ1RFUklTVElDU19HVUFSRF9DRiA9IDB4NDAwMCwKKyAgLy8vIFRlcm1pbmFsIFNlcnZlciBhd2FyZS4KKyAgSU1BR0VfRExMX0NIQVJBQ1RFUklTVElDU19URVJNSU5BTF9TRVJWRVJfQVdBUkUgPSAweDgwMDAKK307CisKK2VudW0gRGVidWdUeXBlIDogdW5zaWduZWQgeworICBJTUFHRV9ERUJVR19UWVBFX1VOS05PV04gPSAwLAorICBJTUFHRV9ERUJVR19UWVBFX0NPRkYgPSAxLAorICBJTUFHRV9ERUJVR19UWVBFX0NPREVWSUVXID0gMiwKKyAgSU1BR0VfREVCVUdfVFlQRV9GUE8gPSAzLAorICBJTUFHRV9ERUJVR19UWVBFX01JU0MgPSA0LAorICBJTUFHRV9ERUJVR19UWVBFX0VYQ0VQVElPTiA9IDUsCisgIElNQUdFX0RFQlVHX1RZUEVfRklYVVAgPSA2LAorICBJTUFHRV9ERUJVR19UWVBFX09NQVBfVE9fU1JDID0gNywKKyAgSU1BR0VfREVCVUdfVFlQRV9PTUFQX0ZST01fU1JDID0gOCwKKyAgSU1BR0VfREVCVUdfVFlQRV9CT1JMQU5EID0gOSwKKyAgSU1BR0VfREVCVUdfVFlQRV9SRVNFUlZFRDEwID0gMTAsCisgIElNQUdFX0RFQlVHX1RZUEVfQ0xTSUQgPSAxMSwKKyAgSU1BR0VfREVCVUdfVFlQRV9WQ19GRUFUVVJFID0gMTIsCisgIElNQUdFX0RFQlVHX1RZUEVfUE9HTyA9IDEzLAorICBJTUFHRV9ERUJVR19UWVBFX0lMVENHID0gMTQsCisgIElNQUdFX0RFQlVHX1RZUEVfTVBYID0gMTUsCisgIElNQUdFX0RFQlVHX1RZUEVfUkVQUk8gPSAxNiwKK307CisKK2VudW0gQmFzZVJlbG9jYXRpb25UeXBlIDogdW5zaWduZWQgeworICBJTUFHRV9SRUxfQkFTRURfQUJTT0xVVEUgPSAwLAorICBJTUFHRV9SRUxfQkFTRURfSElHSCA9IDEsCisgIElNQUdFX1JFTF9CQVNFRF9MT1cgPSAyLAorICBJTUFHRV9SRUxfQkFTRURfSElHSExPVyA9IDMsCisgIElNQUdFX1JFTF9CQVNFRF9ISUdIQURKID0gNCwKKyAgSU1BR0VfUkVMX0JBU0VEX01JUFNfSk1QQUREUiA9IDUsCisgIElNQUdFX1JFTF9CQVNFRF9BUk1fTU9WMzJBID0gNSwKKyAgSU1BR0VfUkVMX0JBU0VEX0FSTV9NT1YzMlQgPSA3LAorICBJTUFHRV9SRUxfQkFTRURfTUlQU19KTVBBRERSMTYgPSA5LAorICBJTUFHRV9SRUxfQkFTRURfRElSNjQgPSAxMAorfTsKKworZW51bSBJbXBvcnRUeXBlIDogdW5zaWduZWQgeworICBJTVBPUlRfQ09ERSA9IDAsCisgIElNUE9SVF9EQVRBID0gMSwKKyAgSU1QT1JUX0NPTlNUID0gMgorfTsKKworZW51bSBJbXBvcnROYW1lVHlwZSA6IHVuc2lnbmVkIHsKKyAgLy8vIEltcG9ydCBpcyBieSBvcmRpbmFsLiBUaGlzIGluZGljYXRlcyB0aGF0IHRoZSB2YWx1ZSBpbiB0aGUgT3JkaW5hbC9IaW50CisgIC8vLyBmaWVsZCBvZiB0aGUgaW1wb3J0IGhlYWRlciBpcyB0aGUgaW1wb3J0J3Mgb3JkaW5hbC4gSWYgdGhpcyBjb25zdGFudCBpcworICAvLy8gbm90IHNwZWNpZmllZCwgdGhlbiB0aGUgT3JkaW5hbC9IaW50IGZpZWxkIHNob3VsZCBhbHdheXMgYmUgaW50ZXJwcmV0ZWQKKyAgLy8vIGFzIHRoZSBpbXBvcnQncyBoaW50LgorICBJTVBPUlRfT1JESU5BTCA9IDAsCisgIC8vLyBUaGUgaW1wb3J0IG5hbWUgaXMgaWRlbnRpY2FsIHRvIHRoZSBwdWJsaWMgc3ltYm9sIG5hbWUKKyAgSU1QT1JUX05BTUUgPSAxLAorICAvLy8gVGhlIGltcG9ydCBuYW1lIGlzIHRoZSBwdWJsaWMgc3ltYm9sIG5hbWUsIGJ1dCBza2lwcGluZyB0aGUgbGVhZGluZyA/LAorICAvLy8gQCwgb3Igb3B0aW9uYWxseSBfLgorICBJTVBPUlRfTkFNRV9OT1BSRUZJWCA9IDIsCisgIC8vLyBUaGUgaW1wb3J0IG5hbWUgaXMgdGhlIHB1YmxpYyBzeW1ib2wgbmFtZSwgYnV0IHNraXBwaW5nIHRoZSBsZWFkaW5nID8sCisgIC8vLyBALCBvciBvcHRpb25hbGx5IF8sIGFuZCB0cnVuY2F0aW5nIGF0IHRoZSBmaXJzdCBALgorICBJTVBPUlRfTkFNRV9VTkRFQ09SQVRFID0gMworfTsKKworc3RydWN0IEltcG9ydEhlYWRlciB7CisgIHVpbnQxNl90IFNpZzE7IC8vLzwgTXVzdCBiZSBJTUFHRV9GSUxFX01BQ0hJTkVfVU5LTk9XTiAoMCkuCisgIHVpbnQxNl90IFNpZzI7IC8vLzwgTXVzdCBiZSAweEZGRkYuCisgIHVpbnQxNl90IFZlcnNpb247CisgIHVpbnQxNl90IE1hY2hpbmU7CisgIHVpbnQzMl90IFRpbWVEYXRlU3RhbXA7CisgIHVpbnQzMl90IFNpemVPZkRhdGE7CisgIHVpbnQxNl90IE9yZGluYWxIaW50OworICB1aW50MTZfdCBUeXBlSW5mbzsKKworICBJbXBvcnRUeXBlIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxJbXBvcnRUeXBlPihUeXBlSW5mbyAmIDB4Myk7IH0KKworICBJbXBvcnROYW1lVHlwZSBnZXROYW1lVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SW1wb3J0TmFtZVR5cGU+KChUeXBlSW5mbyAmIDB4MUMpID4+IDIpOworICB9Cit9OworCitlbnVtIENvZGVWaWV3SWRlbnRpZmllcnMgeworICBERUJVR19TRUNUSU9OX01BR0lDID0gMHg0LAorICBERUJVR19IQVNIRVNfU0VDVElPTl9NQUdJQyA9IDB4MTMzQzlDNQorfTsKKworaW5saW5lIGJvb2wgaXNSZXNlcnZlZFNlY3Rpb25OdW1iZXIoaW50MzJfdCBTZWN0aW9uTnVtYmVyKSB7CisgIHJldHVybiBTZWN0aW9uTnVtYmVyIDw9IDA7Cit9CisKK30gLy8gRW5kIG5hbWVzcGFjZSBDT0ZGLgorfSAvLyBFbmQgbmFtZXNwYWNlIGxsdm0uCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZTI1OTYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5kZWYKQEAgLTAsMCArMSw5MTAgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvRHdhcmYuZGVmIC0gRHdhcmYgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTWFjcm9zIGZvciBydW5uaW5nIHRocm91Z2ggRHdhcmYgZW51bWVyYXRvcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gVE9ETzogQWRkIG90aGVyIERXLWJhc2VkIG1hY3Jvcy4KKyNpZiAhKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVmaW5lZCBIQU5ETEVfRFdfVEFHIHx8IGRlZmluZWQgSEFORExFX0RXX0FUIHx8IGRlZmluZWQgSEFORExFX0RXX0ZPUk0gfHwgXAorICAgIGRlZmluZWQgSEFORExFX0RXX09QIHx8IGRlZmluZWQgSEFORExFX0RXX0xBTkcgfHwgZGVmaW5lZCBIQU5ETEVfRFdfQVRFIHx8IFwKKyAgICBkZWZpbmVkIEhBTkRMRV9EV19WSVJUVUFMSVRZIHx8IGRlZmluZWQgSEFORExFX0RXX0RFRkFVTFRFRCB8fCAgICAgICAgICAgICBcCisgICAgZGVmaW5lZCBIQU5ETEVfRFdfQ0MgfHwgZGVmaW5lZCBIQU5ETEVfRFdfTE5TIHx8IGRlZmluZWQgSEFORExFX0RXX0xORSB8fCAgXAorICAgIGRlZmluZWQgSEFORExFX0RXX0xOQ1QgfHwgZGVmaW5lZCBIQU5ETEVfRFdfTUFDUk8gfHwgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkZWZpbmVkIEhBTkRMRV9EV19STEUgfHwgZGVmaW5lZCBIQU5ETEVfRFdfQ0ZBIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZGVmaW5lZCBIQU5ETEVfRFdfQVBQTEVfUFJPUEVSVFkgfHwgZGVmaW5lZCBIQU5ETEVfRFdfVVQgfHwgICAgICAgICAgICAgICAgXAorICAgIGRlZmluZWQgSEFORExFX0RXQVJGX1NFQ1RJT04gfHwgZGVmaW5lZCBIQU5ETEVfRFdfSURYKQorI2Vycm9yICJNaXNzaW5nIG1hY3JvIGRlZmluaXRpb24gb2YgSEFORExFX0RXKiIKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9EV19UQUcKKyNkZWZpbmUgSEFORExFX0RXX1RBRyhJRCwgTkFNRSwgVkVSU0lPTiwgVkVORE9SKQorI2VuZGlmCisKKyNpZm5kZWYgSEFORExFX0RXX0FUCisjZGVmaW5lIEhBTkRMRV9EV19BVChJRCwgTkFNRSwgVkVSU0lPTiwgVkVORE9SKQorI2VuZGlmCisKKyNpZm5kZWYgSEFORExFX0RXX0ZPUk0KKyNkZWZpbmUgSEFORExFX0RXX0ZPUk0oSUQsIE5BTUUsIFZFUlNJT04sIFZFTkRPUikKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9EV19PUAorI2RlZmluZSBIQU5ETEVfRFdfT1AoSUQsIE5BTUUsIFZFUlNJT04sIFZFTkRPUikKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9EV19MQU5HCisjZGVmaW5lIEhBTkRMRV9EV19MQU5HKElELCBOQU1FLCBWRVJTSU9OLCBWRU5ET1IpCisjZW5kaWYKKworI2lmbmRlZiBIQU5ETEVfRFdfQVRFCisjZGVmaW5lIEhBTkRMRV9EV19BVEUoSUQsIE5BTUUsIFZFUlNJT04sIFZFTkRPUikKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9EV19WSVJUVUFMSVRZCisjZGVmaW5lIEhBTkRMRV9EV19WSVJUVUFMSVRZKElELCBOQU1FKQorI2VuZGlmCisKKyNpZm5kZWYgSEFORExFX0RXX0RFRkFVTFRFRAorI2RlZmluZSBIQU5ETEVfRFdfREVGQVVMVEVEKElELCBOQU1FKQorI2VuZGlmCisKKyNpZm5kZWYgSEFORExFX0RXX0NDCisjZGVmaW5lIEhBTkRMRV9EV19DQyhJRCwgTkFNRSkKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9EV19MTlMKKyNkZWZpbmUgSEFORExFX0RXX0xOUyhJRCwgTkFNRSkKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9EV19MTkUKKyNkZWZpbmUgSEFORExFX0RXX0xORShJRCwgTkFNRSkKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9EV19MTkNUCisjZGVmaW5lIEhBTkRMRV9EV19MTkNUKElELCBOQU1FKQorI2VuZGlmCisKKyNpZm5kZWYgSEFORExFX0RXX01BQ1JPCisjZGVmaW5lIEhBTkRMRV9EV19NQUNSTyhJRCwgTkFNRSkKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9EV19STEUKKyNkZWZpbmUgSEFORExFX0RXX1JMRShJRCwgTkFNRSkKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9EV19DRkEKKyNkZWZpbmUgSEFORExFX0RXX0NGQShJRCwgTkFNRSkKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9EV19BUFBMRV9QUk9QRVJUWQorI2RlZmluZSBIQU5ETEVfRFdfQVBQTEVfUFJPUEVSVFkoSUQsIE5BTUUpCisjZW5kaWYKKworI2lmbmRlZiBIQU5ETEVfRFdfVVQKKyNkZWZpbmUgSEFORExFX0RXX1VUKElELCBOQU1FKQorI2VuZGlmCisKKyNpZm5kZWYgSEFORExFX0RXQVJGX1NFQ1RJT04KKyNkZWZpbmUgSEFORExFX0RXQVJGX1NFQ1RJT04oRU5VTV9OQU1FLCBFTEZfTkFNRSwgQ01ETElORV9OQU1FKQorI2VuZGlmCisKKyNpZm5kZWYgSEFORExFX0RXX0lEWAorI2RlZmluZSBIQU5ETEVfRFdfSURYKElELCBOQU1FKQorI2VuZGlmCisKK0hBTkRMRV9EV19UQUcoMHgwMDAwLCBudWxsLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDAxLCBhcnJheV90eXBlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDAyLCBjbGFzc190eXBlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDAzLCBlbnRyeV9wb2ludCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAwNCwgZW51bWVyYXRpb25fdHlwZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAwNSwgZm9ybWFsX3BhcmFtZXRlciwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAwOCwgaW1wb3J0ZWRfZGVjbGFyYXRpb24sIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMGEsIGxhYmVsLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDBiLCBsZXhpY2FsX2Jsb2NrLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDBkLCBtZW1iZXIsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMGYsIHBvaW50ZXJfdHlwZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAxMCwgcmVmZXJlbmNlX3R5cGUsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMTEsIGNvbXBpbGVfdW5pdCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAxMiwgc3RyaW5nX3R5cGUsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMTMsIHN0cnVjdHVyZV90eXBlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDE1LCBzdWJyb3V0aW5lX3R5cGUsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMTYsIHR5cGVkZWYsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMTcsIHVuaW9uX3R5cGUsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMTgsIHVuc3BlY2lmaWVkX3BhcmFtZXRlcnMsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMTksIHZhcmlhbnQsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMWEsIGNvbW1vbl9ibG9jaywgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAxYiwgY29tbW9uX2luY2x1c2lvbiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAxYywgaW5oZXJpdGFuY2UsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMWQsIGlubGluZWRfc3Vicm91dGluZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAxZSwgbW9kdWxlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDFmLCBwdHJfdG9fbWVtYmVyX3R5cGUsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMjAsIHNldF90eXBlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDIxLCBzdWJyYW5nZV90eXBlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDIyLCB3aXRoX3N0bXQsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMjMsIGFjY2Vzc19kZWNsYXJhdGlvbiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAyNCwgYmFzZV90eXBlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDI1LCBjYXRjaF9ibG9jaywgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAyNiwgY29uc3RfdHlwZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAyNywgY29uc3RhbnQsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMjgsIGVudW1lcmF0b3IsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMjksIGZpbGVfdHlwZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAyYSwgZnJpZW5kLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDJiLCBuYW1lbGlzdCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAyYywgbmFtZWxpc3RfaXRlbSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAyZCwgcGFja2VkX3R5cGUsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMmUsIHN1YnByb2dyYW0sIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMmYsIHRlbXBsYXRlX3R5cGVfcGFyYW1ldGVyLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDMwLCB0ZW1wbGF0ZV92YWx1ZV9wYXJhbWV0ZXIsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMzEsIHRocm93bl90eXBlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDMyLCB0cnlfYmxvY2ssIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMzMsIHZhcmlhbnRfcGFydCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAzNCwgdmFyaWFibGUsIDIsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMzUsIHZvbGF0aWxlX3R5cGUsIDIsIERXQVJGKQorLy8gTmV3IGluIERXQVJGIHYzOgorSEFORExFX0RXX1RBRygweDAwMzYsIGR3YXJmX3Byb2NlZHVyZSwgMywgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAzNywgcmVzdHJpY3RfdHlwZSwgMywgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAzOCwgaW50ZXJmYWNlX3R5cGUsIDMsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwMzksIG5hbWVzcGFjZSwgMywgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDAzYSwgaW1wb3J0ZWRfbW9kdWxlLCAzLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDNiLCB1bnNwZWNpZmllZF90eXBlLCAzLCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDNjLCBwYXJ0aWFsX3VuaXQsIDMsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwM2QsIGltcG9ydGVkX3VuaXQsIDMsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwM2YsIGNvbmRpdGlvbiwgMywgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDA0MCwgc2hhcmVkX3R5cGUsIDMsIERXQVJGKQorLy8gTmV3IGluIERXQVJGIHY0OgorSEFORExFX0RXX1RBRygweDAwNDEsIHR5cGVfdW5pdCwgNCwgRFdBUkYpCitIQU5ETEVfRFdfVEFHKDB4MDA0MiwgcnZhbHVlX3JlZmVyZW5jZV90eXBlLCA0LCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDQzLCB0ZW1wbGF0ZV9hbGlhcywgNCwgRFdBUkYpCisvLyBOZXcgaW4gRFdBUkYgdjU6CitIQU5ETEVfRFdfVEFHKDB4MDA0NCwgY29hcnJheV90eXBlLCA1LCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDQ1LCBnZW5lcmljX3N1YnJhbmdlLCA1LCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDQ2LCBkeW5hbWljX3R5cGUsIDUsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwNDcsIGF0b21pY190eXBlLCA1LCBEV0FSRikKK0hBTkRMRV9EV19UQUcoMHgwMDQ4LCBjYWxsX3NpdGUsIDUsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwNDksIGNhbGxfc2l0ZV9wYXJhbWV0ZXIsIDUsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwNGEsIHNrZWxldG9uX3VuaXQsIDUsIERXQVJGKQorSEFORExFX0RXX1RBRygweDAwNGIsIGltbXV0YWJsZV90eXBlLCA1LCBEV0FSRikKKy8vIFZlbmRvciBleHRlbnNpb25zOgorSEFORExFX0RXX1RBRygweDQwODEsIE1JUFNfbG9vcCwgMCwgTUlQUykKK0hBTkRMRV9EV19UQUcoMHg0MTAxLCBmb3JtYXRfbGFiZWwsIDAsIEdOVSkKK0hBTkRMRV9EV19UQUcoMHg0MTAyLCBmdW5jdGlvbl90ZW1wbGF0ZSwgMCwgR05VKQorSEFORExFX0RXX1RBRygweDQxMDMsIGNsYXNzX3RlbXBsYXRlLCAwLCBHTlUpCitIQU5ETEVfRFdfVEFHKDB4NDEwNiwgR05VX3RlbXBsYXRlX3RlbXBsYXRlX3BhcmFtLCAwLCBHTlUpCitIQU5ETEVfRFdfVEFHKDB4NDEwNywgR05VX3RlbXBsYXRlX3BhcmFtZXRlcl9wYWNrLCAwLCBHTlUpCitIQU5ETEVfRFdfVEFHKDB4NDEwOCwgR05VX2Zvcm1hbF9wYXJhbWV0ZXJfcGFjaywgMCwgR05VKQorSEFORExFX0RXX1RBRygweDQxMDksIEdOVV9jYWxsX3NpdGUsIDAsIEdOVSkKK0hBTkRMRV9EV19UQUcoMHg0MTBhLCBHTlVfY2FsbF9zaXRlX3BhcmFtZXRlciwgMCwgR05VKQorSEFORExFX0RXX1RBRygweDQyMDAsIEFQUExFX3Byb3BlcnR5LCAwLCBBUFBMRSkKK0hBTkRMRV9EV19UQUcoMHhiMDAwLCBCT1JMQU5EX3Byb3BlcnR5LCAwLCBCT1JMQU5EKQorSEFORExFX0RXX1RBRygweGIwMDEsIEJPUkxBTkRfRGVscGhpX3N0cmluZywgMCwgQk9STEFORCkKK0hBTkRMRV9EV19UQUcoMHhiMDAyLCBCT1JMQU5EX0RlbHBoaV9keW5hbWljX2FycmF5LCAwLCBCT1JMQU5EKQorSEFORExFX0RXX1RBRygweGIwMDMsIEJPUkxBTkRfRGVscGhpX3NldCwgMCwgQk9STEFORCkKK0hBTkRMRV9EV19UQUcoMHhiMDA0LCBCT1JMQU5EX0RlbHBoaV92YXJpYW50LCAwLCBCT1JMQU5EKQorCisvLyBBdHRyaWJ1dGVzLgorSEFORExFX0RXX0FUKDB4MDEsIHNpYmxpbmcsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MDIsIGxvY2F0aW9uLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDAzLCBuYW1lLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDA5LCBvcmRlcmluZywgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgwYiwgYnl0ZV9zaXplLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDBjLCBiaXRfb2Zmc2V0LCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDBkLCBiaXRfc2l6ZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgxMCwgc3RtdF9saXN0LCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDExLCBsb3dfcGMsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MTIsIGhpZ2hfcGMsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MTMsIGxhbmd1YWdlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDE1LCBkaXNjciwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgxNiwgZGlzY3JfdmFsdWUsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MTcsIHZpc2liaWxpdHksIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MTgsIGltcG9ydCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgxOSwgc3RyaW5nX2xlbmd0aCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgxYSwgY29tbW9uX3JlZmVyZW5jZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgxYiwgY29tcF9kaXIsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MWMsIGNvbnN0X3ZhbHVlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDFkLCBjb250YWluaW5nX3R5cGUsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MWUsIGRlZmF1bHRfdmFsdWUsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MjAsIGlubGluZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgyMSwgaXNfb3B0aW9uYWwsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MjIsIGxvd2VyX2JvdW5kLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDI1LCBwcm9kdWNlciwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgyNywgcHJvdG90eXBlZCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgyYSwgcmV0dXJuX2FkZHIsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MmMsIHN0YXJ0X3Njb3BlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDJlLCBiaXRfc3RyaWRlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDJmLCB1cHBlcl9ib3VuZCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgzMSwgYWJzdHJhY3Rfb3JpZ2luLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDMyLCBhY2Nlc3NpYmlsaXR5LCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDMzLCBhZGRyZXNzX2NsYXNzLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDM0LCBhcnRpZmljaWFsLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDM1LCBiYXNlX3R5cGVzLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDM2LCBjYWxsaW5nX2NvbnZlbnRpb24sIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4MzcsIGNvdW50LCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDM4LCBkYXRhX21lbWJlcl9sb2NhdGlvbiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgzOSwgZGVjbF9jb2x1bW4sIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4M2EsIGRlY2xfZmlsZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgzYiwgZGVjbF9saW5lLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDNjLCBkZWNsYXJhdGlvbiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgzZCwgZGlzY3JfbGlzdCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHgzZSwgZW5jb2RpbmcsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4M2YsIGV4dGVybmFsLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDQwLCBmcmFtZV9iYXNlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDQxLCBmcmllbmQsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NDIsIGlkZW50aWZpZXJfY2FzZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg0MywgbWFjcm9faW5mbywgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg0NCwgbmFtZWxpc3RfaXRlbSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg0NSwgcHJpb3JpdHksIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NDYsIHNlZ21lbnQsIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NDcsIHNwZWNpZmljYXRpb24sIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NDgsIHN0YXRpY19saW5rLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDQ5LCB0eXBlLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDRhLCB1c2VfbG9jYXRpb24sIDIsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NGIsIHZhcmlhYmxlX3BhcmFtZXRlciwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg0YywgdmlydHVhbGl0eSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg0ZCwgdnRhYmxlX2VsZW1fbG9jYXRpb24sIDIsIERXQVJGKQorLy8gTmV3IGluIERXQVJGIHYzOgorSEFORExFX0RXX0FUKDB4NGUsIGFsbG9jYXRlZCwgMywgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg0ZiwgYXNzb2NpYXRlZCwgMywgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg1MCwgZGF0YV9sb2NhdGlvbiwgMywgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg1MSwgYnl0ZV9zdHJpZGUsIDMsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NTIsIGVudHJ5X3BjLCAzLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDUzLCB1c2VfVVRGOCwgMywgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg1NCwgZXh0ZW5zaW9uLCAzLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDU1LCByYW5nZXMsIDMsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NTYsIHRyYW1wb2xpbmUsIDMsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NTcsIGNhbGxfY29sdW1uLCAzLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDU4LCBjYWxsX2ZpbGUsIDMsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NTksIGNhbGxfbGluZSwgMywgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg1YSwgZGVzY3JpcHRpb24sIDMsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NWIsIGJpbmFyeV9zY2FsZSwgMywgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg1YywgZGVjaW1hbF9zY2FsZSwgMywgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg1ZCwgc21hbGwsIDMsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NWUsIGRlY2ltYWxfc2lnbiwgMywgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg1ZiwgZGlnaXRfY291bnQsIDMsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NjAsIHBpY3R1cmVfc3RyaW5nLCAzLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDYxLCBtdXRhYmxlLCAzLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDYyLCB0aHJlYWRzX3NjYWxlZCwgMywgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg2MywgZXhwbGljaXQsIDMsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NjQsIG9iamVjdF9wb2ludGVyLCAzLCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDY1LCBlbmRpYW5pdHksIDMsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NjYsIGVsZW1lbnRhbCwgMywgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg2NywgcHVyZSwgMywgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg2OCwgcmVjdXJzaXZlLCAzLCBEV0FSRikKKy8vIE5ldyBpbiBEV0FSRiB2NDoKK0hBTkRMRV9EV19BVCgweDY5LCBzaWduYXR1cmUsIDQsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NmEsIG1haW5fc3VicHJvZ3JhbSwgNCwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg2YiwgZGF0YV9iaXRfb2Zmc2V0LCA0LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDZjLCBjb25zdF9leHByLCA0LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDZkLCBlbnVtX2NsYXNzLCA0LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDZlLCBsaW5rYWdlX25hbWUsIDQsIERXQVJGKQorLy8gTmV3IGluIERXQVJGIHY1OgorSEFORExFX0RXX0FUKDB4NmYsIHN0cmluZ19sZW5ndGhfYml0X3NpemUsIDUsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NzAsIHN0cmluZ19sZW5ndGhfYnl0ZV9zaXplLCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDcxLCByYW5rLCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDcyLCBzdHJfb2Zmc2V0c19iYXNlLCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDczLCBhZGRyX2Jhc2UsIDUsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NzQsIHJuZ2xpc3RzX2Jhc2UsIDUsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NzUsIGR3b19pZCwgMCwgRFdBUkYpIC8vLzwgUmV0cmFjdGVkIGZyb20gRFdBUkYgdjUuCitIQU5ETEVfRFdfQVQoMHg3NiwgZHdvX25hbWUsIDUsIERXQVJGKQorSEFORExFX0RXX0FUKDB4NzcsIHJlZmVyZW5jZSwgNSwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg3OCwgcnZhbHVlX3JlZmVyZW5jZSwgNSwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg3OSwgbWFjcm9zLCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDdhLCBjYWxsX2FsbF9jYWxscywgNSwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg3YiwgY2FsbF9hbGxfc291cmNlX2NhbGxzLCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDdjLCBjYWxsX2FsbF90YWlsX2NhbGxzLCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDdkLCBjYWxsX3JldHVybl9wYywgNSwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg3ZSwgY2FsbF92YWx1ZSwgNSwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg3ZiwgY2FsbF9vcmlnaW4sIDUsIERXQVJGKQorSEFORExFX0RXX0FUKDB4ODAsIGNhbGxfcGFyYW1ldGVyLCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDgxLCBjYWxsX3BjLCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDgyLCBjYWxsX3RhaWxfY2FsbCwgNSwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg4MywgY2FsbF90YXJnZXQsIDUsIERXQVJGKQorSEFORExFX0RXX0FUKDB4ODQsIGNhbGxfdGFyZ2V0X2Nsb2JiZXJlZCwgNSwgRFdBUkYpCitIQU5ETEVfRFdfQVQoMHg4NSwgY2FsbF9kYXRhX2xvY2F0aW9uLCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDg2LCBjYWxsX2RhdGFfdmFsdWUsIDUsIERXQVJGKQorSEFORExFX0RXX0FUKDB4ODcsIG5vcmV0dXJuLCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDg4LCBhbGlnbm1lbnQsIDUsIERXQVJGKQorSEFORExFX0RXX0FUKDB4ODksIGV4cG9ydF9zeW1ib2xzLCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDhhLCBkZWxldGVkLCA1LCBEV0FSRikKK0hBTkRMRV9EV19BVCgweDhiLCBkZWZhdWx0ZWQsIDUsIERXQVJGKQorSEFORExFX0RXX0FUKDB4OGMsIGxvY2xpc3RzX2Jhc2UsIDUsIERXQVJGKQorLy8gVmVuZG9yIGV4dGVuc2lvbnM6CitIQU5ETEVfRFdfQVQoMHgyMDAyLCBNSVBTX2xvb3BfYmVnaW4sIDAsIE1JUFMpCitIQU5ETEVfRFdfQVQoMHgyMDAzLCBNSVBTX3RhaWxfbG9vcF9iZWdpbiwgMCwgTUlQUykKK0hBTkRMRV9EV19BVCgweDIwMDQsIE1JUFNfZXBpbG9nX2JlZ2luLCAwLCBNSVBTKQorSEFORExFX0RXX0FUKDB4MjAwNSwgTUlQU19sb29wX3Vucm9sbF9mYWN0b3IsIDAsIE1JUFMpCitIQU5ETEVfRFdfQVQoMHgyMDA2LCBNSVBTX3NvZnR3YXJlX3BpcGVsaW5lX2RlcHRoLCAwLCBNSVBTKQorSEFORExFX0RXX0FUKDB4MjAwNywgTUlQU19saW5rYWdlX25hbWUsIDAsIE1JUFMpCitIQU5ETEVfRFdfQVQoMHgyMDA4LCBNSVBTX3N0cmlkZSwgMCwgTUlQUykKK0hBTkRMRV9EV19BVCgweDIwMDksIE1JUFNfYWJzdHJhY3RfbmFtZSwgMCwgTUlQUykKK0hBTkRMRV9EV19BVCgweDIwMGEsIE1JUFNfY2xvbmVfb3JpZ2luLCAwLCBNSVBTKQorSEFORExFX0RXX0FUKDB4MjAwYiwgTUlQU19oYXNfaW5saW5lcywgMCwgTUlQUykKK0hBTkRMRV9EV19BVCgweDIwMGMsIE1JUFNfc3RyaWRlX2J5dGUsIDAsIE1JUFMpCitIQU5ETEVfRFdfQVQoMHgyMDBkLCBNSVBTX3N0cmlkZV9lbGVtLCAwLCBNSVBTKQorSEFORExFX0RXX0FUKDB4MjAwZSwgTUlQU19wdHJfZG9wZXR5cGUsIDAsIE1JUFMpCitIQU5ETEVfRFdfQVQoMHgyMDBmLCBNSVBTX2FsbG9jYXRhYmxlX2RvcGV0eXBlLCAwLCBNSVBTKQorSEFORExFX0RXX0FUKDB4MjAxMCwgTUlQU19hc3N1bWVkX3NoYXBlX2RvcGV0eXBlLCAwLCBNSVBTKQorLy8gVGhpcyBvbmUgYXBwZWFycyB0byBoYXZlIG9ubHkgYmVlbiBpbXBsZW1lbnRlZCBieSBPcGVuNjQgZm9yCisvLyBmb3J0cmFuIGFuZCBtYXkgY29uZmxpY3Qgd2l0aCBvdGhlciBleHRlbnNpb25zLgorSEFORExFX0RXX0FUKDB4MjAxMSwgTUlQU19hc3N1bWVkX3NpemUsIDAsIE1JUFMpCisvLyBHTlUgZXh0ZW5zaW9ucworSEFORExFX0RXX0FUKDB4MjEwMSwgc2ZfbmFtZXMsIDAsIEdOVSkKK0hBTkRMRV9EV19BVCgweDIxMDIsIHNyY19pbmZvLCAwLCBHTlUpCitIQU5ETEVfRFdfQVQoMHgyMTAzLCBtYWNfaW5mbywgMCwgR05VKQorSEFORExFX0RXX0FUKDB4MjEwNCwgc3JjX2Nvb3JkcywgMCwgR05VKQorSEFORExFX0RXX0FUKDB4MjEwNSwgYm9keV9iZWdpbiwgMCwgR05VKQorSEFORExFX0RXX0FUKDB4MjEwNiwgYm9keV9lbmQsIDAsIEdOVSkKK0hBTkRMRV9EV19BVCgweDIxMDcsIEdOVV92ZWN0b3IsIDAsIEdOVSkKK0hBTkRMRV9EV19BVCgweDIxMTAsIEdOVV90ZW1wbGF0ZV9uYW1lLCAwLCBHTlUpCitIQU5ETEVfRFdfQVQoMHgyMTBmLCBHTlVfb2RyX3NpZ25hdHVyZSwgMCwgR05VKQorSEFORExFX0RXX0FUKDB4MjExMSwgR05VX2NhbGxfc2l0ZV92YWx1ZSwgMCwgR05VKQorSEFORExFX0RXX0FUKDB4MjExNywgR05VX2FsbF9jYWxsX3NpdGVzLCAwLCBHTlUpCitIQU5ETEVfRFdfQVQoMHgyMTE5LCBHTlVfbWFjcm9zLCAwLCBHTlUpCisvLyBFeHRlbnNpb25zIGZvciBGaXNzaW9uIHByb3Bvc2FsLgorSEFORExFX0RXX0FUKDB4MjEzMCwgR05VX2R3b19uYW1lLCAwLCBHTlUpCitIQU5ETEVfRFdfQVQoMHgyMTMxLCBHTlVfZHdvX2lkLCAwLCBHTlUpCitIQU5ETEVfRFdfQVQoMHgyMTMyLCBHTlVfcmFuZ2VzX2Jhc2UsIDAsIEdOVSkKK0hBTkRMRV9EV19BVCgweDIxMzMsIEdOVV9hZGRyX2Jhc2UsIDAsIEdOVSkKK0hBTkRMRV9EV19BVCgweDIxMzQsIEdOVV9wdWJuYW1lcywgMCwgR05VKQorSEFORExFX0RXX0FUKDB4MjEzNSwgR05VX3B1YnR5cGVzLCAwLCBHTlUpCitIQU5ETEVfRFdfQVQoMHgyMTM2LCBHTlVfZGlzY3JpbWluYXRvciwgMCwgR05VKQorLy8gQm9ybGFuZCBleHRlbnNpb25zLgorSEFORExFX0RXX0FUKDB4M2IxMSwgQk9STEFORF9wcm9wZXJ0eV9yZWFkLCAwLCBCT1JMQU5EKQorSEFORExFX0RXX0FUKDB4M2IxMiwgQk9STEFORF9wcm9wZXJ0eV93cml0ZSwgMCwgQk9STEFORCkKK0hBTkRMRV9EV19BVCgweDNiMTMsIEJPUkxBTkRfcHJvcGVydHlfaW1wbGVtZW50cywgMCwgQk9STEFORCkKK0hBTkRMRV9EV19BVCgweDNiMTQsIEJPUkxBTkRfcHJvcGVydHlfaW5kZXgsIDAsIEJPUkxBTkQpCitIQU5ETEVfRFdfQVQoMHgzYjE1LCBCT1JMQU5EX3Byb3BlcnR5X2RlZmF1bHQsIDAsIEJPUkxBTkQpCitIQU5ETEVfRFdfQVQoMHgzYjIwLCBCT1JMQU5EX0RlbHBoaV91bml0LCAwLCBCT1JMQU5EKQorSEFORExFX0RXX0FUKDB4M2IyMSwgQk9STEFORF9EZWxwaGlfY2xhc3MsIDAsIEJPUkxBTkQpCitIQU5ETEVfRFdfQVQoMHgzYjIyLCBCT1JMQU5EX0RlbHBoaV9yZWNvcmQsIDAsIEJPUkxBTkQpCitIQU5ETEVfRFdfQVQoMHgzYjIzLCBCT1JMQU5EX0RlbHBoaV9tZXRhY2xhc3MsIDAsIEJPUkxBTkQpCitIQU5ETEVfRFdfQVQoMHgzYjI0LCBCT1JMQU5EX0RlbHBoaV9jb25zdHJ1Y3RvciwgMCwgQk9STEFORCkKK0hBTkRMRV9EV19BVCgweDNiMjUsIEJPUkxBTkRfRGVscGhpX2Rlc3RydWN0b3IsIDAsIEJPUkxBTkQpCitIQU5ETEVfRFdfQVQoMHgzYjI2LCBCT1JMQU5EX0RlbHBoaV9hbm9ueW1vdXNfbWV0aG9kLCAwLCBCT1JMQU5EKQorSEFORExFX0RXX0FUKDB4M2IyNywgQk9STEFORF9EZWxwaGlfaW50ZXJmYWNlLCAwLCBCT1JMQU5EKQorSEFORExFX0RXX0FUKDB4M2IyOCwgQk9STEFORF9EZWxwaGlfQUJJLCAwLCBCT1JMQU5EKQorSEFORExFX0RXX0FUKDB4M2IyOSwgQk9STEFORF9EZWxwaGlfcmV0dXJuLCAwLCBCT1JMQU5EKQorSEFORExFX0RXX0FUKDB4M2IzMCwgQk9STEFORF9EZWxwaGlfZnJhbWVwdHIsIDAsIEJPUkxBTkQpCitIQU5ETEVfRFdfQVQoMHgzYjMxLCBCT1JMQU5EX2Nsb3N1cmUsIDAsIEJPUkxBTkQpCisvLyBMTFZNIHByb2plY3QgZXh0ZW5zaW9ucy4KK0hBTkRMRV9EV19BVCgweDNlMDAsIExMVk1faW5jbHVkZV9wYXRoLCAwLCBMTFZNKQorSEFORExFX0RXX0FUKDB4M2UwMSwgTExWTV9jb25maWdfbWFjcm9zLCAwLCBMTFZNKQorSEFORExFX0RXX0FUKDB4M2UwMiwgTExWTV9pc3lzcm9vdCwgMCwgTExWTSkKKy8vIEFwcGxlIGV4dGVuc2lvbnMuCitIQU5ETEVfRFdfQVQoMHgzZmUxLCBBUFBMRV9vcHRpbWl6ZWQsIDAsIEFQUExFKQorSEFORExFX0RXX0FUKDB4M2ZlMiwgQVBQTEVfZmxhZ3MsIDAsIEFQUExFKQorSEFORExFX0RXX0FUKDB4M2ZlMywgQVBQTEVfaXNhLCAwLCBBUFBMRSkKK0hBTkRMRV9EV19BVCgweDNmZTQsIEFQUExFX2Jsb2NrLCAwLCBBUFBMRSkKK0hBTkRMRV9EV19BVCgweDNmZTUsIEFQUExFX21ham9yX3J1bnRpbWVfdmVycywgMCwgQVBQTEUpCitIQU5ETEVfRFdfQVQoMHgzZmU2LCBBUFBMRV9ydW50aW1lX2NsYXNzLCAwLCBBUFBMRSkKK0hBTkRMRV9EV19BVCgweDNmZTcsIEFQUExFX29taXRfZnJhbWVfcHRyLCAwLCBBUFBMRSkKK0hBTkRMRV9EV19BVCgweDNmZTgsIEFQUExFX3Byb3BlcnR5X25hbWUsIDAsIEFQUExFKQorSEFORExFX0RXX0FUKDB4M2ZlOSwgQVBQTEVfcHJvcGVydHlfZ2V0dGVyLCAwLCBBUFBMRSkKK0hBTkRMRV9EV19BVCgweDNmZWEsIEFQUExFX3Byb3BlcnR5X3NldHRlciwgMCwgQVBQTEUpCitIQU5ETEVfRFdfQVQoMHgzZmViLCBBUFBMRV9wcm9wZXJ0eV9hdHRyaWJ1dGUsIDAsIEFQUExFKQorSEFORExFX0RXX0FUKDB4M2ZlYywgQVBQTEVfb2JqY19jb21wbGV0ZV90eXBlLCAwLCBBUFBMRSkKK0hBTkRMRV9EV19BVCgweDNmZWQsIEFQUExFX3Byb3BlcnR5LCAwLCBBUFBMRSkKKworLy8gQXR0cmlidXRlIGZvcm0gZW5jb2RpbmdzLgorSEFORExFX0RXX0ZPUk0oMHgwMSwgYWRkciwgMiwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDAzLCBibG9jazIsIDIsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgwNCwgYmxvY2s0LCAyLCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MDUsIGRhdGEyLCAyLCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MDYsIGRhdGE0LCAyLCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MDcsIGRhdGE4LCAyLCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MDgsIHN0cmluZywgMiwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDA5LCBibG9jaywgMiwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDBhLCBibG9jazEsIDIsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgwYiwgZGF0YTEsIDIsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgwYywgZmxhZywgMiwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDBkLCBzZGF0YSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDBlLCBzdHJwLCAyLCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MGYsIHVkYXRhLCAyLCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MTAsIHJlZl9hZGRyLCAyLCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MTEsIHJlZjEsIDIsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgxMiwgcmVmMiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDEzLCByZWY0LCAyLCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MTQsIHJlZjgsIDIsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgxNSwgcmVmX3VkYXRhLCAyLCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MTYsIGluZGlyZWN0LCAyLCBEV0FSRikKKy8vIE5ldyBpbiBEV0FSRiB2NDoKK0hBTkRMRV9EV19GT1JNKDB4MTcsIHNlY19vZmZzZXQsIDQsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgxOCwgZXhwcmxvYywgNCwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDE5LCBmbGFnX3ByZXNlbnQsIDQsIERXQVJGKQorLy8gVGhpcyB3YXMgZGVmaW5lZCBvdXQgb2Ygc2VxdWVuY2UuCitIQU5ETEVfRFdfRk9STSgweDIwLCByZWZfc2lnOCwgNCwgRFdBUkYpCisvLyBOZXcgaW4gRFdBUkYgdjU6CitIQU5ETEVfRFdfRk9STSgweDFhLCBzdHJ4LCA1LCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MWIsIGFkZHJ4LCA1LCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MWMsIHJlZl9zdXA0LCA1LCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MWQsIHN0cnBfc3VwLCA1LCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MWUsIGRhdGExNiwgNSwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDFmLCBsaW5lX3N0cnAsIDUsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgyMSwgaW1wbGljaXRfY29uc3QsIDUsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgyMiwgbG9jbGlzdHgsIDUsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgyMywgcm5nbGlzdHgsIDUsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgyNCwgcmVmX3N1cDgsIDUsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgyNSwgc3RyeDEsIDUsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgyNiwgc3RyeDIsIDUsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgyNywgc3RyeDMsIDUsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgyOCwgc3RyeDQsIDUsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgyOSwgYWRkcngxLCA1LCBEV0FSRikKK0hBTkRMRV9EV19GT1JNKDB4MmEsIGFkZHJ4MiwgNSwgRFdBUkYpCitIQU5ETEVfRFdfRk9STSgweDJiLCBhZGRyeDMsIDUsIERXQVJGKQorSEFORExFX0RXX0ZPUk0oMHgyYywgYWRkcng0LCA1LCBEV0FSRikKKy8vIEV4dGVuc2lvbnMgZm9yIEZpc3Npb24gcHJvcG9zYWwKK0hBTkRMRV9EV19GT1JNKDB4MWYwMSwgR05VX2FkZHJfaW5kZXgsIDAsIEdOVSkKK0hBTkRMRV9EV19GT1JNKDB4MWYwMiwgR05VX3N0cl9pbmRleCwgMCwgR05VKQorLy8gQWx0ZXJuYXRlIGRlYnVnIHNlY3Rpb25zIHByb3Bvc2FsIChvdXRwdXQgb2YgImR3eiIgdG9vbCkuCitIQU5ETEVfRFdfRk9STSgweDFmMjAsIEdOVV9yZWZfYWx0LCAwLCBHTlUpCitIQU5ETEVfRFdfRk9STSgweDFmMjEsIEdOVV9zdHJwX2FsdCwgMCwgR05VKQorCisvLyBEV0FSRiBFeHByZXNzaW9uIG9wZXJhdG9ycy4KK0hBTkRMRV9EV19PUCgweDAzLCBhZGRyLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDA2LCBkZXJlZiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgwOCwgY29uc3QxdSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgwOSwgY29uc3QxcywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgwYSwgY29uc3QydSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgwYiwgY29uc3QycywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgwYywgY29uc3Q0dSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgwZCwgY29uc3Q0cywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgwZSwgY29uc3Q4dSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgwZiwgY29uc3Q4cywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgxMCwgY29uc3R1LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDExLCBjb25zdHMsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MTIsIGR1cCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgxMywgZHJvcCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgxNCwgb3ZlciwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgxNSwgcGljaywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgxNiwgc3dhcCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgxNywgcm90LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDE4LCB4ZGVyZWYsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MTksIGFicywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgxYSwgYW5kLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDFiLCBkaXYsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MWMsIG1pbnVzLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDFkLCBtb2QsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MWUsIG11bCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgxZiwgbmVnLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDIwLCBub3QsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MjEsIG9yLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDIyLCBwbHVzLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDIzLCBwbHVzX3Vjb25zdCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgyNCwgc2hsLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDI1LCBzaHIsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MjYsIHNocmEsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MjcsIHhvciwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgyOCwgYnJhLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDI5LCBlcSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgyYSwgZ2UsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MmIsIGd0LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDJjLCBsZSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgyZCwgbHQsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4MmUsIG5lLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDJmLCBza2lwLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDMwLCBsaXQwLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDMxLCBsaXQxLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDMyLCBsaXQyLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDMzLCBsaXQzLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDM0LCBsaXQ0LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDM1LCBsaXQ1LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDM2LCBsaXQ2LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDM3LCBsaXQ3LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDM4LCBsaXQ4LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDM5LCBsaXQ5LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDNhLCBsaXQxMCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgzYiwgbGl0MTEsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4M2MsIGxpdDEyLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDNkLCBsaXQxMywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHgzZSwgbGl0MTQsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4M2YsIGxpdDE1LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDQwLCBsaXQxNiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg0MSwgbGl0MTcsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NDIsIGxpdDE4LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDQzLCBsaXQxOSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg0NCwgbGl0MjAsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NDUsIGxpdDIxLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDQ2LCBsaXQyMiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg0NywgbGl0MjMsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NDgsIGxpdDI0LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDQ5LCBsaXQyNSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg0YSwgbGl0MjYsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NGIsIGxpdDI3LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDRjLCBsaXQyOCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg0ZCwgbGl0MjksIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NGUsIGxpdDMwLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDRmLCBsaXQzMSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg1MCwgcmVnMCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg1MSwgcmVnMSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg1MiwgcmVnMiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg1MywgcmVnMywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg1NCwgcmVnNCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg1NSwgcmVnNSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg1NiwgcmVnNiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg1NywgcmVnNywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg1OCwgcmVnOCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg1OSwgcmVnOSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg1YSwgcmVnMTAsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NWIsIHJlZzExLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDVjLCByZWcxMiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg1ZCwgcmVnMTMsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NWUsIHJlZzE0LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDVmLCByZWcxNSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg2MCwgcmVnMTYsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NjEsIHJlZzE3LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDYyLCByZWcxOCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg2MywgcmVnMTksIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NjQsIHJlZzIwLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDY1LCByZWcyMSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg2NiwgcmVnMjIsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NjcsIHJlZzIzLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDY4LCByZWcyNCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg2OSwgcmVnMjUsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NmEsIHJlZzI2LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDZiLCByZWcyNywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg2YywgcmVnMjgsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NmQsIHJlZzI5LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDZlLCByZWczMCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg2ZiwgcmVnMzEsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NzAsIGJyZWcwLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDcxLCBicmVnMSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg3MiwgYnJlZzIsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NzMsIGJyZWczLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDc0LCBicmVnNCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg3NSwgYnJlZzUsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NzYsIGJyZWc2LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDc3LCBicmVnNywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg3OCwgYnJlZzgsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4NzksIGJyZWc5LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDdhLCBicmVnMTAsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4N2IsIGJyZWcxMSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg3YywgYnJlZzEyLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDdkLCBicmVnMTMsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4N2UsIGJyZWcxNCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg3ZiwgYnJlZzE1LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDgwLCBicmVnMTYsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4ODEsIGJyZWcxNywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg4MiwgYnJlZzE4LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDgzLCBicmVnMTksIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4ODQsIGJyZWcyMCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg4NSwgYnJlZzIxLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDg2LCBicmVnMjIsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4ODcsIGJyZWcyMywgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg4OCwgYnJlZzI0LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDg5LCBicmVnMjUsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4OGEsIGJyZWcyNiwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg4YiwgYnJlZzI3LCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDhjLCBicmVnMjgsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4OGQsIGJyZWcyOSwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg4ZSwgYnJlZzMwLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDhmLCBicmVnMzEsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4OTAsIHJlZ3gsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4OTEsIGZicmVnLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDkyLCBicmVneCwgMiwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg5MywgcGllY2UsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4OTQsIGRlcmVmX3NpemUsIDIsIERXQVJGKQorSEFORExFX0RXX09QKDB4OTUsIHhkZXJlZl9zaXplLCAyLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDk2LCBub3AsIDIsIERXQVJGKQorLy8gTmV3IGluIERXQVJGIHYzOgorSEFORExFX0RXX09QKDB4OTcsIHB1c2hfb2JqZWN0X2FkZHJlc3MsIDMsIERXQVJGKQorSEFORExFX0RXX09QKDB4OTgsIGNhbGwyLCAzLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDk5LCBjYWxsNCwgMywgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHg5YSwgY2FsbF9yZWYsIDMsIERXQVJGKQorSEFORExFX0RXX09QKDB4OWIsIGZvcm1fdGxzX2FkZHJlc3MsIDMsIERXQVJGKQorSEFORExFX0RXX09QKDB4OWMsIGNhbGxfZnJhbWVfY2ZhLCAzLCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDlkLCBiaXRfcGllY2UsIDMsIERXQVJGKQorLy8gTmV3IGluIERXQVJGIHY0OgorSEFORExFX0RXX09QKDB4OWUsIGltcGxpY2l0X3ZhbHVlLCA0LCBEV0FSRikKK0hBTkRMRV9EV19PUCgweDlmLCBzdGFja192YWx1ZSwgNCwgRFdBUkYpCisvLyBOZXcgaW4gRFdBUkYgdjU6CitIQU5ETEVfRFdfT1AoMHhhMCwgaW1wbGljaXRfcG9pbnRlciwgNSwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHhhMSwgYWRkcngsIDUsIERXQVJGKQorSEFORExFX0RXX09QKDB4YTIsIGNvbnN0eCwgNSwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHhhMywgZW50cnlfdmFsdWUsIDUsIERXQVJGKQorSEFORExFX0RXX09QKDB4YTQsIGNvbnN0X3R5cGUsIDUsIERXQVJGKQorSEFORExFX0RXX09QKDB4YTUsIHJlZ3ZhbF90eXBlLCA1LCBEV0FSRikKK0hBTkRMRV9EV19PUCgweGE2LCBkZXJlZl90eXBlLCA1LCBEV0FSRikKK0hBTkRMRV9EV19PUCgweGE3LCB4ZGVyZWZfdHlwZSwgNSwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHhhOCwgY29udmVydCwgNSwgRFdBUkYpCitIQU5ETEVfRFdfT1AoMHhhOSwgcmVpbnRlcnByZXQsIDUsIERXQVJGKQorLy8gVmVuZG9yIGV4dGVuc2lvbnM6CisvLyBFeHRlbnNpb25zIGZvciBHTlUtc3R5bGUgdGhyZWFkLWxvY2FsIHN0b3JhZ2UuCitIQU5ETEVfRFdfT1AoMHhlMCwgR05VX3B1c2hfdGxzX2FkZHJlc3MsIDAsIEdOVSkKKy8vIEV4dGVuc2lvbnMgZm9yIEZpc3Npb24gcHJvcG9zYWwuCitIQU5ETEVfRFdfT1AoMHhmYiwgR05VX2FkZHJfaW5kZXgsIDAsIEdOVSkKK0hBTkRMRV9EV19PUCgweGZjLCBHTlVfY29uc3RfaW5kZXgsIDAsIEdOVSkKKworLy8gRFdBUkYgbGFuZ3VhZ2VzLgorSEFORExFX0RXX0xBTkcoMHgwMDAxLCBDODksIDIsIERXQVJGKQorSEFORExFX0RXX0xBTkcoMHgwMDAyLCBDLCAyLCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAwMywgQWRhODMsIDIsIERXQVJGKQorSEFORExFX0RXX0xBTkcoMHgwMDA0LCBDX3BsdXNfcGx1cywgMiwgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMDUsIENvYm9sNzQsIDIsIERXQVJGKQorSEFORExFX0RXX0xBTkcoMHgwMDA2LCBDb2JvbDg1LCAyLCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAwNywgRm9ydHJhbjc3LCAyLCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAwOCwgRm9ydHJhbjkwLCAyLCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAwOSwgUGFzY2FsODMsIDIsIERXQVJGKQorSEFORExFX0RXX0xBTkcoMHgwMDBhLCBNb2R1bGEyLCAyLCBEV0FSRikKKy8vIE5ldyBpbiBEV0FSRiB2MzoKK0hBTkRMRV9EV19MQU5HKDB4MDAwYiwgSmF2YSwgMywgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMGMsIEM5OSwgMywgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMGQsIEFkYTk1LCAzLCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAwZSwgRm9ydHJhbjk1LCAzLCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAwZiwgUExJLCAzLCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAxMCwgT2JqQywgMywgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMTEsIE9iakNfcGx1c19wbHVzLCAzLCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAxMiwgVVBDLCAzLCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAxMywgRCwgMywgRFdBUkYpCisvLyBOZXcgaW4gRFdBUkYgdjQ6CitIQU5ETEVfRFdfTEFORygweDAwMTQsIFB5dGhvbiwgNCwgRFdBUkYpCisvLyBOZXcgaW4gRFdBUkYgdjU6CitIQU5ETEVfRFdfTEFORygweDAwMTUsIE9wZW5DTCwgNSwgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMTYsIEdvLCA1LCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAxNywgTW9kdWxhMywgNSwgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMTgsIEhhc2tlbGwsIDUsIERXQVJGKQorSEFORExFX0RXX0xBTkcoMHgwMDE5LCBDX3BsdXNfcGx1c18wMywgNSwgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMWEsIENfcGx1c19wbHVzXzExLCA1LCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAxYiwgT0NhbWwsIDUsIERXQVJGKQorSEFORExFX0RXX0xBTkcoMHgwMDFjLCBSdXN0LCA1LCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAxZCwgQzExLCA1LCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAxZSwgU3dpZnQsIDUsIERXQVJGKQorSEFORExFX0RXX0xBTkcoMHgwMDFmLCBKdWxpYSwgNSwgRFdBUkYpCitIQU5ETEVfRFdfTEFORygweDAwMjAsIER5bGFuLCA1LCBEV0FSRikKK0hBTkRMRV9EV19MQU5HKDB4MDAyMSwgQ19wbHVzX3BsdXNfMTQsIDUsIERXQVJGKQorSEFORExFX0RXX0xBTkcoMHgwMDIyLCBGb3J0cmFuMDMsIDUsIERXQVJGKQorSEFORExFX0RXX0xBTkcoMHgwMDIzLCBGb3J0cmFuMDgsIDUsIERXQVJGKQorSEFORExFX0RXX0xBTkcoMHgwMDI0LCBSZW5kZXJTY3JpcHQsIDUsIERXQVJGKQorSEFORExFX0RXX0xBTkcoMHgwMDI1LCBCTElTUywgNSwgRFdBUkYpCisvLyBWZW5kb3IgZXh0ZW5zaW9uczoKK0hBTkRMRV9EV19MQU5HKDB4ODAwMSwgTWlwc19Bc3NlbWJsZXIsIDAsIE1JUFMpCitIQU5ETEVfRFdfTEFORygweDhlNTcsIEdPT0dMRV9SZW5kZXJTY3JpcHQsIDAsIEdPT0dMRSkKK0hBTkRMRV9EV19MQU5HKDB4YjAwMCwgQk9STEFORF9EZWxwaGksIDAsIEJPUkxBTkQpCisKKy8vIERXQVJGIGF0dHJpYnV0ZSB0eXBlIGVuY29kaW5ncy4KK0hBTkRMRV9EV19BVEUoMHgwMSwgYWRkcmVzcywgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVRFKDB4MDIsIGJvb2xlYW4sIDIsIERXQVJGKQorSEFORExFX0RXX0FURSgweDAzLCBjb21wbGV4X2Zsb2F0LCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVEUoMHgwNCwgZmxvYXQsIDIsIERXQVJGKQorSEFORExFX0RXX0FURSgweDA1LCBzaWduZWQsIDIsIERXQVJGKQorSEFORExFX0RXX0FURSgweDA2LCBzaWduZWRfY2hhciwgMiwgRFdBUkYpCitIQU5ETEVfRFdfQVRFKDB4MDcsIHVuc2lnbmVkLCAyLCBEV0FSRikKK0hBTkRMRV9EV19BVEUoMHgwOCwgdW5zaWduZWRfY2hhciwgMiwgRFdBUkYpCisvLyBOZXcgaW4gRFdBUkYgdjM6CitIQU5ETEVfRFdfQVRFKDB4MDksIGltYWdpbmFyeV9mbG9hdCwgMywgRFdBUkYpCitIQU5ETEVfRFdfQVRFKDB4MGEsIHBhY2tlZF9kZWNpbWFsLCAzLCBEV0FSRikKK0hBTkRMRV9EV19BVEUoMHgwYiwgbnVtZXJpY19zdHJpbmcsIDMsIERXQVJGKQorSEFORExFX0RXX0FURSgweDBjLCBlZGl0ZWQsIDMsIERXQVJGKQorSEFORExFX0RXX0FURSgweDBkLCBzaWduZWRfZml4ZWQsIDMsIERXQVJGKQorSEFORExFX0RXX0FURSgweDBlLCB1bnNpZ25lZF9maXhlZCwgMywgRFdBUkYpCitIQU5ETEVfRFdfQVRFKDB4MGYsIGRlY2ltYWxfZmxvYXQsIDMsIERXQVJGKQorLy8gTmV3IGluIERXQVJGIHY0OgorSEFORExFX0RXX0FURSgweDEwLCBVVEYsIDQsIERXQVJGKQorLy8gTmV3IGluIERXQVJGIHY1OgorSEFORExFX0RXX0FURSgweDExLCBVQ1MsIDUsIERXQVJGKQorSEFORExFX0RXX0FURSgweDEyLCBBU0NJSSwgNSwgRFdBUkYpCisKKy8vIERXQVJGIHZpcnR1YWxpdHkgY29kZXMuCitIQU5ETEVfRFdfVklSVFVBTElUWSgweDAwLCBub25lKQorSEFORExFX0RXX1ZJUlRVQUxJVFkoMHgwMSwgdmlydHVhbCkKK0hBTkRMRV9EV19WSVJUVUFMSVRZKDB4MDIsIHB1cmVfdmlydHVhbCkKKworLy8gRFdBUkYgdjUgRGVmYXVsdGVkIE1lbWJlciBFbmNvZGluZ3MuCitIQU5ETEVfRFdfREVGQVVMVEVEKDB4MDAsIG5vKQorSEFORExFX0RXX0RFRkFVTFRFRCgweDAxLCBpbl9jbGFzcykKK0hBTkRMRV9EV19ERUZBVUxURUQoMHgwMiwgb3V0X29mX2NsYXNzKQorCisvLyBEV0FSRiBjYWxsaW5nIGNvbnZlbnRpb24gY29kZXMuCitIQU5ETEVfRFdfQ0MoMHgwMSwgbm9ybWFsKQorSEFORExFX0RXX0NDKDB4MDIsIHByb2dyYW0pCitIQU5ETEVfRFdfQ0MoMHgwMywgbm9jYWxsKQorLy8gTmV3IGluIERXQVJGIHY1OgorSEFORExFX0RXX0NDKDB4MDQsIHBhc3NfYnlfcmVmZXJlbmNlKQorSEFORExFX0RXX0NDKDB4MDUsIHBhc3NfYnlfdmFsdWUpCisvLyBWZW5kb3IgZXh0ZW5zaW9uczoKK0hBTkRMRV9EV19DQygweDQwLCBHTlVfcmVuZXNhc19zaCkKK0hBTkRMRV9EV19DQygweDQxLCBHTlVfYm9ybGFuZF9mYXN0Y2FsbF9pMzg2KQorSEFORExFX0RXX0NDKDB4YjAsIEJPUkxBTkRfc2FmZWNhbGwpCitIQU5ETEVfRFdfQ0MoMHhiMSwgQk9STEFORF9zdGRjYWxsKQorSEFORExFX0RXX0NDKDB4YjIsIEJPUkxBTkRfcGFzY2FsKQorSEFORExFX0RXX0NDKDB4YjMsIEJPUkxBTkRfbXNmYXN0Y2FsbCkKK0hBTkRMRV9EV19DQygweGI0LCBCT1JMQU5EX21zcmV0dXJuKQorSEFORExFX0RXX0NDKDB4YjUsIEJPUkxBTkRfdGhpc2NhbGwpCitIQU5ETEVfRFdfQ0MoMHhiNiwgQk9STEFORF9mYXN0Y2FsbCkKK0hBTkRMRV9EV19DQygweGMwLCBMTFZNX3ZlY3RvcmNhbGwpCitIQU5ETEVfRFdfQ0MoMHhjMSwgTExWTV9XaW42NCkKK0hBTkRMRV9EV19DQygweGMyLCBMTFZNX1g4Nl82NFN5c1YpCitIQU5ETEVfRFdfQ0MoMHhjMywgTExWTV9BQVBDUykKK0hBTkRMRV9EV19DQygweGM0LCBMTFZNX0FBUENTX1ZGUCkKK0hBTkRMRV9EV19DQygweGM1LCBMTFZNX0ludGVsT2NsQmljYykKK0hBTkRMRV9EV19DQygweGM2LCBMTFZNX1NwaXJGdW5jdGlvbikKK0hBTkRMRV9EV19DQygweGM3LCBMTFZNX09wZW5DTEtlcm5lbCkKK0hBTkRMRV9EV19DQygweGM4LCBMTFZNX1N3aWZ0KQorSEFORExFX0RXX0NDKDB4YzksIExMVk1fUHJlc2VydmVNb3N0KQorSEFORExFX0RXX0NDKDB4Y2EsIExMVk1fUHJlc2VydmVBbGwpCitIQU5ETEVfRFdfQ0MoMHhjYiwgTExWTV9YODZSZWdDYWxsKQorLy8gRnJvbSBHQ0Mgc291cmNlIGNvZGUgKGluY2x1ZGUvZHdhcmYyLmgpOiBUaGlzIERXX0NDXyB2YWx1ZSBpcyBub3QgY3VycmVudGx5CisvLyBnZW5lcmF0ZWQgYnkgYW55IHRvb2xjaGFpbi4gIEl0IGlzIHVzZWQgaW50ZXJuYWxseSB0byBHREIgdG8gaW5kaWNhdGUgT3BlbkNMIEMKKy8vIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYmVlbiBjb21waWxlZCB3aXRoIHRoZSBJQk0gWEwgQyBmb3IgT3BlbkNMIGNvbXBpbGVyIGFuZCB1c2UKKy8vIGEgbm9uLXBsYXRmb3JtIGNhbGxpbmcgY29udmVudGlvbiBmb3IgcGFzc2luZyBPcGVuQ0wgQyB2ZWN0b3IgdHlwZXMuCitIQU5ETEVfRFdfQ0MoMHhmZiwgR0RCX0lCTV9PcGVuQ0wpCisKKy8vIExpbmUgTnVtYmVyIEV4dGVuZGVkIE9wY29kZSBFbmNvZGluZ3MKK0hBTkRMRV9EV19MTkUoMHgwMSwgZW5kX3NlcXVlbmNlKQorSEFORExFX0RXX0xORSgweDAyLCBzZXRfYWRkcmVzcykKK0hBTkRMRV9EV19MTkUoMHgwMywgZGVmaW5lX2ZpbGUpCisvLyBOZXcgaW4gRFdBUkYgdjQ6CitIQU5ETEVfRFdfTE5FKDB4MDQsIHNldF9kaXNjcmltaW5hdG9yKQorCisvLyBMaW5lIE51bWJlciBTdGFuZGFyZCBPcGNvZGUgRW5jb2RpbmdzLgorSEFORExFX0RXX0xOUygweDAwLCBleHRlbmRlZF9vcCkKK0hBTkRMRV9EV19MTlMoMHgwMSwgY29weSkKK0hBTkRMRV9EV19MTlMoMHgwMiwgYWR2YW5jZV9wYykKK0hBTkRMRV9EV19MTlMoMHgwMywgYWR2YW5jZV9saW5lKQorSEFORExFX0RXX0xOUygweDA0LCBzZXRfZmlsZSkKK0hBTkRMRV9EV19MTlMoMHgwNSwgc2V0X2NvbHVtbikKK0hBTkRMRV9EV19MTlMoMHgwNiwgbmVnYXRlX3N0bXQpCitIQU5ETEVfRFdfTE5TKDB4MDcsIHNldF9iYXNpY19ibG9jaykKK0hBTkRMRV9EV19MTlMoMHgwOCwgY29uc3RfYWRkX3BjKQorSEFORExFX0RXX0xOUygweDA5LCBmaXhlZF9hZHZhbmNlX3BjKQorLy8gTmV3IGluIERXQVJGIHYzOgorSEFORExFX0RXX0xOUygweDBhLCBzZXRfcHJvbG9ndWVfZW5kKQorSEFORExFX0RXX0xOUygweDBiLCBzZXRfZXBpbG9ndWVfYmVnaW4pCitIQU5ETEVfRFdfTE5TKDB4MGMsIHNldF9pc2EpCisKKy8vIERXQVJGIHY1IExpbmUgbnVtYmVyIGhlYWRlciBlbnRyeSBmb3JtYXQuCitIQU5ETEVfRFdfTE5DVCgweDAxLCBwYXRoKQorSEFORExFX0RXX0xOQ1QoMHgwMiwgZGlyZWN0b3J5X2luZGV4KQorSEFORExFX0RXX0xOQ1QoMHgwMywgdGltZXN0YW1wKQorSEFORExFX0RXX0xOQ1QoMHgwNCwgc2l6ZSkKK0hBTkRMRV9EV19MTkNUKDB4MDUsIE1ENSkKKy8vIEEgdmVuZG9yIGV4dGVuc2lvbiB1bnRpbCBodHRwOi8vZHdhcmZzdGQub3JnL1Nob3dJc3N1ZS5waHA/aXNzdWU9MTgwMjAxLjEgaXMKKy8vIGFjY2VwdGVkIGFuZCBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbmV4dCBEV0FSRiBzdGFuZGFyZC4KK0hBTkRMRV9EV19MTkNUKDB4MjAwMSwgTExWTV9zb3VyY2UpCisKKy8vIERXQVJGIHY1IE1hY3JvIGluZm9ybWF0aW9uLgorSEFORExFX0RXX01BQ1JPKDB4MDEsIGRlZmluZSkKK0hBTkRMRV9EV19NQUNSTygweDAyLCB1bmRlZikKK0hBTkRMRV9EV19NQUNSTygweDAzLCBzdGFydF9maWxlKQorSEFORExFX0RXX01BQ1JPKDB4MDQsIGVuZF9maWxlKQorSEFORExFX0RXX01BQ1JPKDB4MDUsIGRlZmluZV9zdHJwKQorSEFORExFX0RXX01BQ1JPKDB4MDYsIHVuZGVmX3N0cnApCitIQU5ETEVfRFdfTUFDUk8oMHgwNywgaW1wb3J0KQorSEFORExFX0RXX01BQ1JPKDB4MDgsIGRlZmluZV9zdXApCitIQU5ETEVfRFdfTUFDUk8oMHgwOSwgdW5kZWZfc3VwKQorSEFORExFX0RXX01BQ1JPKDB4MGEsIGltcG9ydF9zdXApCitIQU5ETEVfRFdfTUFDUk8oMHgwYiwgZGVmaW5lX3N0cngpCitIQU5ETEVfRFdfTUFDUk8oMHgwYywgdW5kZWZfc3RyeCkKKworLy8gRFdBUkYgdjUgUmFuZ2UgTGlzdCBFbnRyeSBlbmNvZGluZyB2YWx1ZXMuCitIQU5ETEVfRFdfUkxFKDB4MDAsIGVuZF9vZl9saXN0KQorSEFORExFX0RXX1JMRSgweDAxLCBiYXNlX2FkZHJlc3N4KQorSEFORExFX0RXX1JMRSgweDAyLCBzdGFydHhfZW5keCkKK0hBTkRMRV9EV19STEUoMHgwMywgc3RhcnR4X2xlbmd0aCkKK0hBTkRMRV9EV19STEUoMHgwNCwgb2Zmc2V0X3BhaXIpCitIQU5ETEVfRFdfUkxFKDB4MDUsIGJhc2VfYWRkcmVzcykKK0hBTkRMRV9EV19STEUoMHgwNiwgc3RhcnRfZW5kKQorSEFORExFX0RXX1JMRSgweDA3LCBzdGFydF9sZW5ndGgpCisKKy8vIENhbGwgZnJhbWUgaW5zdHJ1Y3Rpb24gZW5jb2RpbmdzLgorSEFORExFX0RXX0NGQSgweDAwLCBub3ApCitIQU5ETEVfRFdfQ0ZBKDB4NDAsIGFkdmFuY2VfbG9jKQorSEFORExFX0RXX0NGQSgweDgwLCBvZmZzZXQpCitIQU5ETEVfRFdfQ0ZBKDB4YzAsIHJlc3RvcmUpCitIQU5ETEVfRFdfQ0ZBKDB4MDEsIHNldF9sb2MpCitIQU5ETEVfRFdfQ0ZBKDB4MDIsIGFkdmFuY2VfbG9jMSkKK0hBTkRMRV9EV19DRkEoMHgwMywgYWR2YW5jZV9sb2MyKQorSEFORExFX0RXX0NGQSgweDA0LCBhZHZhbmNlX2xvYzQpCitIQU5ETEVfRFdfQ0ZBKDB4MDUsIG9mZnNldF9leHRlbmRlZCkKK0hBTkRMRV9EV19DRkEoMHgwNiwgcmVzdG9yZV9leHRlbmRlZCkKK0hBTkRMRV9EV19DRkEoMHgwNywgdW5kZWZpbmVkKQorSEFORExFX0RXX0NGQSgweDA4LCBzYW1lX3ZhbHVlKQorSEFORExFX0RXX0NGQSgweDA5LCByZWdpc3RlcikKK0hBTkRMRV9EV19DRkEoMHgwYSwgcmVtZW1iZXJfc3RhdGUpCitIQU5ETEVfRFdfQ0ZBKDB4MGIsIHJlc3RvcmVfc3RhdGUpCitIQU5ETEVfRFdfQ0ZBKDB4MGMsIGRlZl9jZmEpCitIQU5ETEVfRFdfQ0ZBKDB4MGQsIGRlZl9jZmFfcmVnaXN0ZXIpCitIQU5ETEVfRFdfQ0ZBKDB4MGUsIGRlZl9jZmFfb2Zmc2V0KQorLy8gTmV3IGluIERXQVJGIHYzOgorSEFORExFX0RXX0NGQSgweDBmLCBkZWZfY2ZhX2V4cHJlc3Npb24pCitIQU5ETEVfRFdfQ0ZBKDB4MTAsIGV4cHJlc3Npb24pCitIQU5ETEVfRFdfQ0ZBKDB4MTEsIG9mZnNldF9leHRlbmRlZF9zZikKK0hBTkRMRV9EV19DRkEoMHgxMiwgZGVmX2NmYV9zZikKK0hBTkRMRV9EV19DRkEoMHgxMywgZGVmX2NmYV9vZmZzZXRfc2YpCitIQU5ETEVfRFdfQ0ZBKDB4MTQsIHZhbF9vZmZzZXQpCitIQU5ETEVfRFdfQ0ZBKDB4MTUsIHZhbF9vZmZzZXRfc2YpCitIQU5ETEVfRFdfQ0ZBKDB4MTYsIHZhbF9leHByZXNzaW9uKQorLy8gVmVuZG9yIGV4dGVuc2lvbnM6CitIQU5ETEVfRFdfQ0ZBKDB4MWQsIE1JUFNfYWR2YW5jZV9sb2M4KQorSEFORExFX0RXX0NGQSgweDJkLCBHTlVfd2luZG93X3NhdmUpCitIQU5ETEVfRFdfQ0ZBKDB4MmUsIEdOVV9hcmdzX3NpemUpCisKKy8vIEFwcGxlIE9iamVjdGl2ZS1DIFByb3BlcnR5IEF0dHJpYnV0ZXMuCisvLyBLZWVwIHRoaXMgbGlzdCBpbiBzeW5jIHdpdGggY2xhbmcncyBEZWNsU3BlYy5oIE9iakNQcm9wZXJ0eUF0dHJpYnV0ZUtpbmQhCitIQU5ETEVfRFdfQVBQTEVfUFJPUEVSVFkoMHgwMSwgcmVhZG9ubHkpCitIQU5ETEVfRFdfQVBQTEVfUFJPUEVSVFkoMHgwMiwgZ2V0dGVyKQorSEFORExFX0RXX0FQUExFX1BST1BFUlRZKDB4MDQsIGFzc2lnbikKK0hBTkRMRV9EV19BUFBMRV9QUk9QRVJUWSgweDA4LCByZWFkd3JpdGUpCitIQU5ETEVfRFdfQVBQTEVfUFJPUEVSVFkoMHgxMCwgcmV0YWluKQorSEFORExFX0RXX0FQUExFX1BST1BFUlRZKDB4MjAsIGNvcHkpCitIQU5ETEVfRFdfQVBQTEVfUFJPUEVSVFkoMHg0MCwgbm9uYXRvbWljKQorSEFORExFX0RXX0FQUExFX1BST1BFUlRZKDB4ODAsIHNldHRlcikKK0hBTkRMRV9EV19BUFBMRV9QUk9QRVJUWSgweDEwMCwgYXRvbWljKQorSEFORExFX0RXX0FQUExFX1BST1BFUlRZKDB4MjAwLCB3ZWFrKQorSEFORExFX0RXX0FQUExFX1BST1BFUlRZKDB4NDAwLCBzdHJvbmcpCitIQU5ETEVfRFdfQVBQTEVfUFJPUEVSVFkoMHg4MDAsIHVuc2FmZV91bnJldGFpbmVkKQorSEFORExFX0RXX0FQUExFX1BST1BFUlRZKDB4MTAwMCwgbnVsbGFiaWxpdHkpCitIQU5ETEVfRFdfQVBQTEVfUFJPUEVSVFkoMHgyMDAwLCBudWxsX3Jlc2V0dGFibGUpCitIQU5ETEVfRFdfQVBQTEVfUFJPUEVSVFkoMHg0MDAwLCBjbGFzcykKKworLy8gRFdBUkYgdjUgVW5pdCBUeXBlcy4KK0hBTkRMRV9EV19VVCgweDAxLCBjb21waWxlKQorSEFORExFX0RXX1VUKDB4MDIsIHR5cGUpCitIQU5ETEVfRFdfVVQoMHgwMywgcGFydGlhbCkKK0hBTkRMRV9EV19VVCgweDA0LCBza2VsZXRvbikKK0hBTkRMRV9EV19VVCgweDA1LCBzcGxpdF9jb21waWxlKQorSEFORExFX0RXX1VUKDB4MDYsIHNwbGl0X3R5cGUpCisKKy8vIERXQVJGIHNlY3Rpb24gdHlwZXMuIChlbnVtIG5hbWUsIEVMRiBuYW1lLCBFTEYgRFdPIG5hbWUsIGNtZGxpbmUgbmFtZSkKKy8vIE5vdGUgdGhhdCB0aGVzZSBJRHMgZG9uJ3QgbWVhbiBhbnl0aGluZy4KKy8vIFRPRE86IEFkZCBNYWNoLU8gYW5kIENPRkYgbmFtZXMuCisvLyBPZmZpY2lhbCBEV0FSRiBzZWN0aW9ucy4KK0hBTkRMRV9EV0FSRl9TRUNUSU9OKERlYnVnQWJicmV2LCAiLmRlYnVnX2FiYnJldiIsICJkZWJ1Zy1hYmJyZXYiKQorSEFORExFX0RXQVJGX1NFQ1RJT04oRGVidWdBcmFuZ2VzLCAiLmRlYnVnX2FyYW5nZXMiLCAiZGVidWctYXJhbmdlcyIpCitIQU5ETEVfRFdBUkZfU0VDVElPTihEZWJ1Z0luZm8sICIuZGVidWdfaW5mbyIsICJkZWJ1Zy1pbmZvIikKK0hBTkRMRV9EV0FSRl9TRUNUSU9OKERlYnVnVHlwZXMsICIuZGVidWdfdHlwZXMiLCAiZGVidWctdHlwZXMiKQorSEFORExFX0RXQVJGX1NFQ1RJT04oRGVidWdMaW5lLCAiLmRlYnVnX2xpbmUiLCAiZGVidWctbGluZSIpCitIQU5ETEVfRFdBUkZfU0VDVElPTihEZWJ1Z0xpbmVTdHIsICIuZGVidWdfbGluZV9zdHIiLCAiZGVidWctbGluZS1zdHIiKQorSEFORExFX0RXQVJGX1NFQ1RJT04oRGVidWdMb2MsICIuZGVidWdfbG9jIiwgImRlYnVnLWxvYyIpCitIQU5ETEVfRFdBUkZfU0VDVElPTihEZWJ1Z0ZyYW1lLCAiLmRlYnVnX2ZyYW1lIiwgImRlYnVnLWZyYW1lIikKK0hBTkRMRV9EV0FSRl9TRUNUSU9OKERlYnVnTWFjcm8sICIuZGVidWdfbWFjcm8iLCAiZGVidWctbWFjcm8iKQorSEFORExFX0RXQVJGX1NFQ1RJT04oRGVidWdOYW1lcywgIi5kZWJ1Z19uYW1lcyIsICJkZWJ1Zy1uYW1lcyIpCitIQU5ETEVfRFdBUkZfU0VDVElPTihEZWJ1Z1B1Ym5hbWVzLCAiLmRlYnVnX3B1Ym5hbWVzIiwgImRlYnVnLXB1Ym5hbWVzIikKK0hBTkRMRV9EV0FSRl9TRUNUSU9OKERlYnVnUHVidHlwZXMsICIuZGVidWdfcHVidHlwZXMiLCAiZGVidWctcHVidHlwZXMiKQorSEFORExFX0RXQVJGX1NFQ1RJT04oRGVidWdHbnVQdWJuYW1lcywgIi5kZWJ1Z19nbnVfcHVibmFtZXMiLCAiZGVidWctZ251LXB1Ym5hbWVzIikKK0hBTkRMRV9EV0FSRl9TRUNUSU9OKERlYnVnR251UHVidHlwZXMsICIuZGVidWdfZ251X3B1YnR5cGVzIiwgImRlYnVnLWdudS1wdWJ0eXBlcyIpCitIQU5ETEVfRFdBUkZfU0VDVElPTihEZWJ1Z1JhbmdlcywgIi5kZWJ1Z19yYW5nZXMiLCAiZGVidWctcmFuZ2VzIikKK0hBTkRMRV9EV0FSRl9TRUNUSU9OKERlYnVnUm5nbGlzdHMsICIuZGVidWdfcm5nbGlzdHMiLCAiZGVidWctcm5nbGlzdHMiKQorSEFORExFX0RXQVJGX1NFQ1RJT04oRGVidWdTdHIsICIuZGVidWdfc3RyIiwgImRlYnVnLXN0ciIpCitIQU5ETEVfRFdBUkZfU0VDVElPTihEZWJ1Z1N0ck9mZnNldHMsICIuZGVidWdfc3RyX29mZnNldHMiLCAiZGVidWctc3RyLW9mZnNldHMiKQorSEFORExFX0RXQVJGX1NFQ1RJT04oRGVidWdDVUluZGV4LCAiLmRlYnVnX2N1X2luZGV4IiwgImRlYnVnLWN1LWluZGV4IikKK0hBTkRMRV9EV0FSRl9TRUNUSU9OKERlYnVnVFVJbmRleCwgIi5kZWJ1Z190dV9pbmRleCIsICJkZWJ1Zy10dS1pbmRleCIpCisvLyBWZW5kb3IgZXh0ZW5zaW9ucy4KK0hBTkRMRV9EV0FSRl9TRUNUSU9OKEFwcGxlTmFtZXMsICIuYXBwbGVfbmFtZXMiLCAiYXBwbGUtbmFtZXMiKQorSEFORExFX0RXQVJGX1NFQ1RJT04oQXBwbGVUeXBlcywgIi5hcHBsZV90eXBlcyIsICJhcHBsZS10eXBlcyIpCitIQU5ETEVfRFdBUkZfU0VDVElPTihBcHBsZU5hbWVzcGFjZXMsICIuYXBwbGVfbmFtZXNwYWNlcyIsICJhcHBsZS1uYW1lc3BhY2VzIikKK0hBTkRMRV9EV0FSRl9TRUNUSU9OKEFwcGxlT2JqQywgIi5hcHBsZV9vYmpjIiwgImFwcGxlLW9iamMiKQorSEFORExFX0RXQVJGX1NFQ1RJT04oR2RiSW5kZXgsICIuZ2RiX2luZGV4IiwgImdkYi1pbmRleCIpCisKK0hBTkRMRV9EV19JRFgoMHgwMSwgY29tcGlsZV91bml0KQorSEFORExFX0RXX0lEWCgweDAyLCB0eXBlX3VuaXQpCitIQU5ETEVfRFdfSURYKDB4MDMsIGRpZV9vZmZzZXQpCitIQU5ETEVfRFdfSURYKDB4MDQsIHBhcmVudCkKK0hBTkRMRV9EV19JRFgoMHgwNSwgdHlwZV9oYXNoKQorCisKKyN1bmRlZiBIQU5ETEVfRFdfVEFHCisjdW5kZWYgSEFORExFX0RXX0FUCisjdW5kZWYgSEFORExFX0RXX0ZPUk0KKyN1bmRlZiBIQU5ETEVfRFdfT1AKKyN1bmRlZiBIQU5ETEVfRFdfTEFORworI3VuZGVmIEhBTkRMRV9EV19BVEUKKyN1bmRlZiBIQU5ETEVfRFdfVklSVFVBTElUWQorI3VuZGVmIEhBTkRMRV9EV19ERUZBVUxURUQKKyN1bmRlZiBIQU5ETEVfRFdfQ0MKKyN1bmRlZiBIQU5ETEVfRFdfTE5TCisjdW5kZWYgSEFORExFX0RXX0xORQorI3VuZGVmIEhBTkRMRV9EV19MTkNUCisjdW5kZWYgSEFORExFX0RXX01BQ1JPCisjdW5kZWYgSEFORExFX0RXX1JMRQorI3VuZGVmIEhBTkRMRV9EV19DRkEKKyN1bmRlZiBIQU5ETEVfRFdfQVBQTEVfUFJPUEVSVFkKKyN1bmRlZiBIQU5ETEVfRFdfVVQKKyN1bmRlZiBIQU5ETEVfRFdBUkZfU0VDVElPTgorI3VuZGVmIEhBTkRMRV9EV19JRFgKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1NzI0YTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5oCkBAIC0wLDAgKzEsNjIwIEBACisvLz09PS0tIGxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmggLS0tRHdhcmYgQ29uc3RhbnRzLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFRoaXMgZmlsZSBjb250YWlucyBjb25zdGFudHMgdXNlZCBmb3IgaW1wbGVtZW50aW5nIER3YXJmCisvLy8gZGVidWcgc3VwcG9ydC4KKy8vLworLy8vIEZvciBkZXRhaWxzIG9uIHRoZSBEd2FyZiBzcGVjZmljYXRpb24gc2VlIHRoZSBsYXRlc3QgRFdBUkYgRGVidWdnaW5nCisvLy8gSW5mb3JtYXRpb24gRm9ybWF0IHN0YW5kYXJkIGRvY3VtZW50IG9uIGh0dHA6Ly93d3cuZHdhcmZzdGQub3JnLiBUaGlzCisvLy8gZmlsZSBvZnRlbiBpbmNsdWRlcyBzdXBwb3J0IGZvciBub24tcmVsZWFzZWQgc3RhbmRhcmQgZmVhdHVyZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0JJTkFSWUZPUk1BVF9EV0FSRl9ICisjZGVmaW5lIExMVk1fQklOQVJZRk9STUFUX0RXQVJGX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXRWYXJpYWRpY0RldGFpbHMuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgU3RyaW5nUmVmOworCituYW1lc3BhY2UgZHdhcmYgeworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRFdBUkYgY29uc3RhbnRzIGFzIGdsZWFuZWQgZnJvbSB0aGUgRFdBUkYgRGVidWdnaW5nIEluZm9ybWF0aW9uIEZvcm1hdCBWLjUKKy8vIHJlZmVyZW5jZSBtYW51YWwgaHR0cDovL3d3dy5kd2FyZnN0ZC5vcmcvLgorLy8KKworLy8gRG8gbm90IG1peCB0aGUgZm9sbG93aW5nIHR3byBlbnVtZXJhdGlvbnMgc2V0cy4gIERXX1RBR19pbnZhbGlkIGNoYW5nZXMgdGhlCisvLyBlbnVtZXJhdGlvbiBiYXNlIHR5cGUuCisKK2VudW0gTExWTUNvbnN0YW50cyA6IHVpbnQzMl90IHsKKyAgLy8gTExWTSBtb2NrIHRhZ3MgKHNlZSBhbHNvIGxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZikuCisgIERXX1RBR19pbnZhbGlkID0gfjBVLCAgICAgICAgLy8gVGFnIGZvciBpbnZhbGlkIHJlc3VsdHMuCisgIERXX1ZJUlRVQUxJVFlfaW52YWxpZCA9IH4wVSwgLy8gVmlydHVhbGl0eSBmb3IgaW52YWxpZCByZXN1bHRzLgorICBEV19NQUNJTkZPX2ludmFsaWQgPSB+MFUsICAgIC8vIE1hY2luZm8gdHlwZSBmb3IgaW52YWxpZCByZXN1bHRzLgorCisgIC8vIE90aGVyIGNvbnN0YW50cy4KKyAgRFdBUkZfVkVSU0lPTiA9IDQsICAgICAgIC8vIERlZmF1bHQgZHdhcmYgdmVyc2lvbiB3ZSBvdXRwdXQuCisgIERXX1BVQlRZUEVTX1ZFUlNJT04gPSAyLCAvLyBTZWN0aW9uIHZlcnNpb24gbnVtYmVyIGZvciAuZGVidWdfcHVidHlwZXMuCisgIERXX1BVQk5BTUVTX1ZFUlNJT04gPSAyLCAvLyBTZWN0aW9uIHZlcnNpb24gbnVtYmVyIGZvciAuZGVidWdfcHVibmFtZXMuCisgIERXX0FSQU5HRVNfVkVSU0lPTiA9IDIsICAvLyBTZWN0aW9uIHZlcnNpb24gbnVtYmVyIGZvciAuZGVidWdfYXJhbmdlcy4KKyAgLy8gSWRlbnRpZmllcnMgd2UgdXNlIHRvIGRpc3Rpbmd1aXNoIHZlbmRvciBleHRlbnNpb25zLgorICBEV0FSRl9WRU5ET1JfRFdBUkYgPSAwLCAvLyBEZWZpbmVkIGluIHYyIG9yIGxhdGVyIG9mIHRoZSBEV0FSRiBzdGFuZGFyZC4KKyAgRFdBUkZfVkVORE9SX0FQUExFID0gMSwKKyAgRFdBUkZfVkVORE9SX0JPUkxBTkQgPSAyLAorICBEV0FSRl9WRU5ET1JfR05VID0gMywKKyAgRFdBUkZfVkVORE9SX0dPT0dMRSA9IDQsCisgIERXQVJGX1ZFTkRPUl9MTFZNID0gNSwKKyAgRFdBUkZfVkVORE9SX01JUFMgPSA2Cit9OworCisvLy8gQ29uc3RhbnRzIHRoYXQgZGVmaW5lIHRoZSBEV0FSRiBmb3JtYXQgYXMgMzIgb3IgNjQgYml0LgorZW51bSBEd2FyZkZvcm1hdCA6IHVpbnQ4X3QgeyBEV0FSRjMyLCBEV0FSRjY0IH07CisKKy8vLyBTcGVjaWFsIElEIHZhbHVlcyB0aGF0IGRpc3Rpbmd1aXNoIGEgQ0lFIGZyb20gYSBGREUgaW4gRFdBUkYgQ0ZJLgorLy8vIE5vdCBpbnNpZGUgYW4gZW51bSBiZWNhdXNlIGEgNjQtYml0IHZhbHVlIGlzIG5lZWRlZC4KKy8vLyBAeworY29uc3QgdWludDMyX3QgRFdfQ0lFX0lEID0gVUlOVDMyX01BWDsKK2NvbnN0IHVpbnQ2NF90IERXNjRfQ0lFX0lEID0gVUlOVDY0X01BWDsKKy8vLyBAfQorCisvLy8gSWRlbnRpZmllciBvZiBhbiBpbnZhbGlkIERJRSBvZmZzZXQgaW4gdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24uCitjb25zdCB1aW50MzJfdCBEV19JTlZBTElEX09GRlNFVCA9IFVJTlQzMl9NQVg7CisKK2VudW0gVGFnIDogdWludDE2X3QgeworI2RlZmluZSBIQU5ETEVfRFdfVEFHKElELCBOQU1FLCBWRVJTSU9OLCBWRU5ET1IpIERXX1RBR18jI05BTUUgPSBJRCwKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5kZWYiCisgIERXX1RBR19sb191c2VyID0gMHg0MDgwLAorICBEV19UQUdfaGlfdXNlciA9IDB4ZmZmZiwKKyAgRFdfVEFHX3VzZXJfYmFzZSA9IDB4MTAwMCAvLy88IFJlY29tbWVuZGVkIGJhc2UgZm9yIHVzZXIgdGFncy4KK307CisKK2lubGluZSBib29sIGlzVHlwZShUYWcgVCkgeworICBzd2l0Y2ggKFQpIHsKKyAgY2FzZSBEV19UQUdfYXJyYXlfdHlwZToKKyAgY2FzZSBEV19UQUdfY2xhc3NfdHlwZToKKyAgY2FzZSBEV19UQUdfaW50ZXJmYWNlX3R5cGU6CisgIGNhc2UgRFdfVEFHX2VudW1lcmF0aW9uX3R5cGU6CisgIGNhc2UgRFdfVEFHX3BvaW50ZXJfdHlwZToKKyAgY2FzZSBEV19UQUdfcmVmZXJlbmNlX3R5cGU6CisgIGNhc2UgRFdfVEFHX3J2YWx1ZV9yZWZlcmVuY2VfdHlwZToKKyAgY2FzZSBEV19UQUdfc3RyaW5nX3R5cGU6CisgIGNhc2UgRFdfVEFHX3N0cnVjdHVyZV90eXBlOgorICBjYXNlIERXX1RBR19zdWJyb3V0aW5lX3R5cGU6CisgIGNhc2UgRFdfVEFHX3VuaW9uX3R5cGU6CisgIGNhc2UgRFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZToKKyAgY2FzZSBEV19UQUdfc2V0X3R5cGU6CisgIGNhc2UgRFdfVEFHX3N1YnJhbmdlX3R5cGU6CisgIGNhc2UgRFdfVEFHX2Jhc2VfdHlwZToKKyAgY2FzZSBEV19UQUdfY29uc3RfdHlwZToKKyAgY2FzZSBEV19UQUdfZmlsZV90eXBlOgorICBjYXNlIERXX1RBR19wYWNrZWRfdHlwZToKKyAgY2FzZSBEV19UQUdfdm9sYXRpbGVfdHlwZToKKyAgY2FzZSBEV19UQUdfdHlwZWRlZjoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgZGVmYXVsdDoKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLy8vIEF0dHJpYnV0ZXMuCitlbnVtIEF0dHJpYnV0ZSA6IHVpbnQxNl90IHsKKyNkZWZpbmUgSEFORExFX0RXX0FUKElELCBOQU1FLCBWRVJTSU9OLCBWRU5ET1IpIERXX0FUXyMjTkFNRSA9IElELAorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZiIKKyAgRFdfQVRfbG9fdXNlciA9IDB4MjAwMCwKKyAgRFdfQVRfaGlfdXNlciA9IDB4M2ZmZiwKK307CisKK2VudW0gRm9ybSA6IHVpbnQxNl90IHsKKyNkZWZpbmUgSEFORExFX0RXX0ZPUk0oSUQsIE5BTUUsIFZFUlNJT04sIFZFTkRPUikgRFdfRk9STV8jI05BTUUgPSBJRCwKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5kZWYiCisgIERXX0ZPUk1fbG9fdXNlciA9IDB4MWYwMCwgLy8vPCBOb3Qgc3BlY2lmaWVkIGJ5IERXQVJGLgorfTsKKworZW51bSBMb2NhdGlvbkF0b20geworI2RlZmluZSBIQU5ETEVfRFdfT1AoSUQsIE5BTUUsIFZFUlNJT04sIFZFTkRPUikgRFdfT1BfIyNOQU1FID0gSUQsCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuZGVmIgorICBEV19PUF9sb191c2VyID0gMHhlMCwKKyAgRFdfT1BfaGlfdXNlciA9IDB4ZmYsCisgIERXX09QX0xMVk1fZnJhZ21lbnQgPSAweDEwMDAgLy8vPCBPbmx5IHVzZWQgaW4gTExWTSBtZXRhZGF0YS4KK307CisKK2VudW0gVHlwZUtpbmQgOiB1aW50OF90IHsKKyNkZWZpbmUgSEFORExFX0RXX0FURShJRCwgTkFNRSwgVkVSU0lPTiwgVkVORE9SKSBEV19BVEVfIyNOQU1FID0gSUQsCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuZGVmIgorICBEV19BVEVfbG9fdXNlciA9IDB4ODAsCisgIERXX0FURV9oaV91c2VyID0gMHhmZgorfTsKKworZW51bSBEZWNpbWFsU2lnbkVuY29kaW5nIHsKKyAgLy8gRGVjaW1hbCBzaWduIGF0dHJpYnV0ZSB2YWx1ZXMKKyAgRFdfRFNfdW5zaWduZWQgPSAweDAxLAorICBEV19EU19sZWFkaW5nX292ZXJwdW5jaCA9IDB4MDIsCisgIERXX0RTX3RyYWlsaW5nX292ZXJwdW5jaCA9IDB4MDMsCisgIERXX0RTX2xlYWRpbmdfc2VwYXJhdGUgPSAweDA0LAorICBEV19EU190cmFpbGluZ19zZXBhcmF0ZSA9IDB4MDUKK307CisKK2VudW0gRW5kaWFuaXR5RW5jb2RpbmcgeworICAvLyBFbmRpYW5pdHkgYXR0cmlidXRlIHZhbHVlcworICBEV19FTkRfZGVmYXVsdCA9IDB4MDAsCisgIERXX0VORF9iaWcgPSAweDAxLAorICBEV19FTkRfbGl0dGxlID0gMHgwMiwKKyAgRFdfRU5EX2xvX3VzZXIgPSAweDQwLAorICBEV19FTkRfaGlfdXNlciA9IDB4ZmYKK307CisKK2VudW0gQWNjZXNzQXR0cmlidXRlIHsKKyAgLy8gQWNjZXNzaWJpbGl0eSBjb2RlcworICBEV19BQ0NFU1NfcHVibGljID0gMHgwMSwKKyAgRFdfQUNDRVNTX3Byb3RlY3RlZCA9IDB4MDIsCisgIERXX0FDQ0VTU19wcml2YXRlID0gMHgwMworfTsKKworZW51bSBWaXNpYmlsaXR5QXR0cmlidXRlIHsKKyAgLy8gVmlzaWJpbGl0eSBjb2RlcworICBEV19WSVNfbG9jYWwgPSAweDAxLAorICBEV19WSVNfZXhwb3J0ZWQgPSAweDAyLAorICBEV19WSVNfcXVhbGlmaWVkID0gMHgwMworfTsKKworZW51bSBWaXJ0dWFsaXR5QXR0cmlidXRlIHsKKyNkZWZpbmUgSEFORExFX0RXX1ZJUlRVQUxJVFkoSUQsIE5BTUUpIERXX1ZJUlRVQUxJVFlfIyNOQU1FID0gSUQsCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuZGVmIgorICBEV19WSVJUVUFMSVRZX21heCA9IDB4MDIKK307CisKK2VudW0gRGVmYXVsdGVkTWVtYmVyQXR0cmlidXRlIHsKKyNkZWZpbmUgSEFORExFX0RXX0RFRkFVTFRFRChJRCwgTkFNRSkgRFdfREVGQVVMVEVEXyMjTkFNRSA9IElELAorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZiIKKyAgRFdfREVGQVVMVEVEX21heCA9IDB4MDIKK307CisKK2VudW0gU291cmNlTGFuZ3VhZ2UgeworI2RlZmluZSBIQU5ETEVfRFdfTEFORyhJRCwgTkFNRSwgVkVSU0lPTiwgVkVORE9SKSBEV19MQU5HXyMjTkFNRSA9IElELAorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZiIKKyAgRFdfTEFOR19sb191c2VyID0gMHg4MDAwLAorICBEV19MQU5HX2hpX3VzZXIgPSAweGZmZmYKK307CisKK2VudW0gQ2FzZVNlbnNpdGl2aXR5IHsKKyAgLy8gSWRlbnRpZmllciBjYXNlIGNvZGVzCisgIERXX0lEX2Nhc2Vfc2Vuc2l0aXZlID0gMHgwMCwKKyAgRFdfSURfdXBfY2FzZSA9IDB4MDEsCisgIERXX0lEX2Rvd25fY2FzZSA9IDB4MDIsCisgIERXX0lEX2Nhc2VfaW5zZW5zaXRpdmUgPSAweDAzCit9OworCitlbnVtIENhbGxpbmdDb252ZW50aW9uIHsKKy8vIENhbGxpbmcgY29udmVudGlvbiBjb2RlcworI2RlZmluZSBIQU5ETEVfRFdfQ0MoSUQsIE5BTUUpIERXX0NDXyMjTkFNRSA9IElELAorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZiIKKyAgRFdfQ0NfbG9fdXNlciA9IDB4NDAsCisgIERXX0NDX2hpX3VzZXIgPSAweGZmCit9OworCitlbnVtIElubGluZUF0dHJpYnV0ZSB7CisgIC8vIElubGluZSBjb2RlcworICBEV19JTkxfbm90X2lubGluZWQgPSAweDAwLAorICBEV19JTkxfaW5saW5lZCA9IDB4MDEsCisgIERXX0lOTF9kZWNsYXJlZF9ub3RfaW5saW5lZCA9IDB4MDIsCisgIERXX0lOTF9kZWNsYXJlZF9pbmxpbmVkID0gMHgwMworfTsKKworZW51bSBBcnJheURpbWVuc2lvbk9yZGVyaW5nIHsKKyAgLy8gQXJyYXkgb3JkZXJpbmcKKyAgRFdfT1JEX3Jvd19tYWpvciA9IDB4MDAsCisgIERXX09SRF9jb2xfbWFqb3IgPSAweDAxCit9OworCitlbnVtIERpc2NyaW1pbmFudExpc3QgeworICAvLyBEaXNjcmltaW5hbnQgZGVzY3JpcHRvciB2YWx1ZXMKKyAgRFdfRFNDX2xhYmVsID0gMHgwMCwKKyAgRFdfRFNDX3JhbmdlID0gMHgwMQorfTsKKworLy8vIExpbmUgTnVtYmVyIFN0YW5kYXJkIE9wY29kZSBFbmNvZGluZ3MuCitlbnVtIExpbmVOdW1iZXJPcHMgOiB1aW50OF90IHsKKyNkZWZpbmUgSEFORExFX0RXX0xOUyhJRCwgTkFNRSkgRFdfTE5TXyMjTkFNRSA9IElELAorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZiIKK307CisKKy8vLyBMaW5lIE51bWJlciBFeHRlbmRlZCBPcGNvZGUgRW5jb2RpbmdzLgorZW51bSBMaW5lTnVtYmVyRXh0ZW5kZWRPcHMgeworI2RlZmluZSBIQU5ETEVfRFdfTE5FKElELCBOQU1FKSBEV19MTkVfIyNOQU1FID0gSUQsCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuZGVmIgorICBEV19MTkVfbG9fdXNlciA9IDB4ODAsCisgIERXX0xORV9oaV91c2VyID0gMHhmZgorfTsKKworZW51bSBMaW5lTnVtYmVyRW50cnlGb3JtYXQgeworI2RlZmluZSBIQU5ETEVfRFdfTE5DVChJRCwgTkFNRSkgRFdfTE5DVF8jI05BTUUgPSBJRCwKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5kZWYiCisgIERXX0xOQ1RfbG9fdXNlciA9IDB4MjAwMCwKKyAgRFdfTE5DVF9oaV91c2VyID0gMHgzZmZmLAorfTsKKworZW51bSBNYWNpbmZvUmVjb3JkVHlwZSB7CisgIC8vIE1hY2luZm8gVHlwZSBFbmNvZGluZ3MKKyAgRFdfTUFDSU5GT19kZWZpbmUgPSAweDAxLAorICBEV19NQUNJTkZPX3VuZGVmID0gMHgwMiwKKyAgRFdfTUFDSU5GT19zdGFydF9maWxlID0gMHgwMywKKyAgRFdfTUFDSU5GT19lbmRfZmlsZSA9IDB4MDQsCisgIERXX01BQ0lORk9fdmVuZG9yX2V4dCA9IDB4ZmYKK307CisKKy8vLyBEV0FSRiB2NSBtYWNybyBpbmZvcm1hdGlvbiBlbnRyeSB0eXBlIGVuY29kaW5ncy4KK2VudW0gTWFjcm9FbnRyeVR5cGUgeworI2RlZmluZSBIQU5ETEVfRFdfTUFDUk8oSUQsIE5BTUUpIERXX01BQ1JPXyMjTkFNRSA9IElELAorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZiIKKyAgRFdfTUFDUk9fbG9fdXNlciA9IDB4ZTAsCisgIERXX01BQ1JPX2hpX3VzZXIgPSAweGZmCit9OworCisvLy8gRFdBUkYgdjUgcmFuZ2UgbGlzdCBlbnRyeSBlbmNvZGluZyB2YWx1ZXMuCitlbnVtIFJhbmdlTGlzdEVudHJpZXMgeworI2RlZmluZSBIQU5ETEVfRFdfUkxFKElELCBOQU1FKSBEV19STEVfIyNOQU1FID0gSUQsCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuZGVmIgorfTsKKworLy8vIENhbGwgZnJhbWUgaW5zdHJ1Y3Rpb24gZW5jb2RpbmdzLgorZW51bSBDYWxsRnJhbWVJbmZvIHsKKyNkZWZpbmUgSEFORExFX0RXX0NGQShJRCwgTkFNRSkgRFdfQ0ZBXyMjTkFNRSA9IElELAorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZiIKKyAgRFdfQ0ZBX2V4dGVuZGVkID0gMHgwMCwKKworICBEV19DRkFfbG9fdXNlciA9IDB4MWMsCisgIERXX0NGQV9oaV91c2VyID0gMHgzZgorfTsKKworZW51bSBDb25zdGFudHMgeworICAvLyBDaGlsZHJlbiBmbGFnCisgIERXX0NISUxEUkVOX25vID0gMHgwMCwKKyAgRFdfQ0hJTERSRU5feWVzID0gMHgwMSwKKworICBEV19FSF9QRV9hYnNwdHIgPSAweDAwLAorICBEV19FSF9QRV9vbWl0ID0gMHhmZiwKKyAgRFdfRUhfUEVfdWxlYjEyOCA9IDB4MDEsCisgIERXX0VIX1BFX3VkYXRhMiA9IDB4MDIsCisgIERXX0VIX1BFX3VkYXRhNCA9IDB4MDMsCisgIERXX0VIX1BFX3VkYXRhOCA9IDB4MDQsCisgIERXX0VIX1BFX3NsZWIxMjggPSAweDA5LAorICBEV19FSF9QRV9zZGF0YTIgPSAweDBBLAorICBEV19FSF9QRV9zZGF0YTQgPSAweDBCLAorICBEV19FSF9QRV9zZGF0YTggPSAweDBDLAorICBEV19FSF9QRV9zaWduZWQgPSAweDA4LAorICBEV19FSF9QRV9wY3JlbCA9IDB4MTAsCisgIERXX0VIX1BFX3RleHRyZWwgPSAweDIwLAorICBEV19FSF9QRV9kYXRhcmVsID0gMHgzMCwKKyAgRFdfRUhfUEVfZnVuY3JlbCA9IDB4NDAsCisgIERXX0VIX1BFX2FsaWduZWQgPSAweDUwLAorICBEV19FSF9QRV9pbmRpcmVjdCA9IDB4ODAKK307CisKKy8vLyBDb25zdGFudHMgZm9yIGxvY2F0aW9uIGxpc3RzIGluIERXQVJGIHY1LgorZW51bSBMb2NhdGlvbkxpc3RFbnRyeSA6IHVuc2lnbmVkIGNoYXIgeworICBEV19MTEVfZW5kX29mX2xpc3QgPSAweDAwLAorICBEV19MTEVfYmFzZV9hZGRyZXNzeCA9IDB4MDEsCisgIERXX0xMRV9zdGFydHhfZW5keCA9IDB4MDIsCisgIERXX0xMRV9zdGFydHhfbGVuZ3RoID0gMHgwMywKKyAgRFdfTExFX29mZnNldF9wYWlyID0gMHgwNCwKKyAgRFdfTExFX2RlZmF1bHRfbG9jYXRpb24gPSAweDA1LAorICBEV19MTEVfYmFzZV9hZGRyZXNzID0gMHgwNiwKKyAgRFdfTExFX3N0YXJ0X2VuZCA9IDB4MDcsCisgIERXX0xMRV9zdGFydF9sZW5ndGggPSAweDA4Cit9OworCisvLy8gQ29uc3RhbnRzIGZvciB0aGUgRFdfQVBQTEVfUFJPUEVSVFlfYXR0cmlidXRlcyBhdHRyaWJ1dGUuCisvLy8gS2VlcCB0aGlzIGxpc3QgaW4gc3luYyB3aXRoIGNsYW5nJ3MgRGVjbFNwZWMuaCBPYmpDUHJvcGVydHlBdHRyaWJ1dGVLaW5kIQorZW51bSBBcHBsZVByb3BlcnR5QXR0cmlidXRlcyB7CisjZGVmaW5lIEhBTkRMRV9EV19BUFBMRV9QUk9QRVJUWShJRCwgTkFNRSkgRFdfQVBQTEVfUFJPUEVSVFlfIyNOQU1FID0gSUQsCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuZGVmIgorfTsKKworLy8vIENvbnN0YW50cyBmb3IgdW5pdCB0eXBlcyBpbiBEV0FSRiB2NS4KK2VudW0gVW5pdFR5cGUgOiB1bnNpZ25lZCBjaGFyIHsKKyNkZWZpbmUgSEFORExFX0RXX1VUKElELCBOQU1FKSBEV19VVF8jI05BTUUgPSBJRCwKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5kZWYiCisgIERXX1VUX2xvX3VzZXIgPSAweDgwLAorICBEV19VVF9oaV91c2VyID0gMHhmZgorfTsKKworZW51bSBJbmRleCB7CisjZGVmaW5lIEhBTkRMRV9EV19JRFgoSUQsIE5BTUUpIERXX0lEWF8jI05BTUUgPSBJRCwKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5kZWYiCisgIERXX0lEWF9sb191c2VyID0gMHgyMDAwLAorICBEV19JRFhfaGlfdXNlciA9IDB4M2ZmZgorfTsKKworaW5saW5lIGJvb2wgaXNVbml0VHlwZSh1aW50OF90IFVuaXRUeXBlKSB7CisgIHN3aXRjaCAoVW5pdFR5cGUpIHsKKyAgY2FzZSBEV19VVF9jb21waWxlOgorICBjYXNlIERXX1VUX3R5cGU6CisgIGNhc2UgRFdfVVRfcGFydGlhbDoKKyAgY2FzZSBEV19VVF9za2VsZXRvbjoKKyAgY2FzZSBEV19VVF9zcGxpdF9jb21waWxlOgorICBjYXNlIERXX1VUX3NwbGl0X3R5cGU6CisgICAgcmV0dXJuIHRydWU7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2lubGluZSBib29sIGlzVW5pdFR5cGUoZHdhcmY6OlRhZyBUKSB7CisgIHN3aXRjaCAoVCkgeworICBjYXNlIERXX1RBR19jb21waWxlX3VuaXQ6CisgIGNhc2UgRFdfVEFHX3R5cGVfdW5pdDoKKyAgY2FzZSBEV19UQUdfcGFydGlhbF91bml0OgorICBjYXNlIERXX1RBR19za2VsZXRvbl91bml0OgorICAgIHJldHVybiB0cnVlOworICBkZWZhdWx0OgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCisvLyBDb25zdGFudHMgZm9yIHRoZSBEV0FSRiB2NSBBY2NlbGVyYXRvciBUYWJsZSBQcm9wb3NhbAorZW51bSBBY2NlbGVyYXRvclRhYmxlIHsKKyAgLy8gRGF0YSBsYXlvdXQgZGVzY3JpcHRvcnMuCisgIERXX0FUT01fbnVsbCA9IDB1LCAgICAgICAvLy8gIE1hcmtlciBhcyB0aGUgZW5kIG9mIGEgbGlzdCBvZiBhdG9tcy4KKyAgRFdfQVRPTV9kaWVfb2Zmc2V0ID0gMXUsIC8vIERJRSBvZmZzZXQgaW4gdGhlIGRlYnVnX2luZm8gc2VjdGlvbi4KKyAgRFdfQVRPTV9jdV9vZmZzZXQgPSAydSwgLy8gT2Zmc2V0IG9mIHRoZSBjb21waWxlIHVuaXQgaGVhZGVyIHRoYXQgY29udGFpbnMgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGl0ZW0gaW4gcXVlc3Rpb24uCisgIERXX0FUT01fZGllX3RhZyA9IDN1LCAgIC8vIEEgdGFnIGVudHJ5LgorICBEV19BVE9NX3R5cGVfZmxhZ3MgPSA0dSwgLy8gU2V0IG9mIGZsYWdzIGZvciBhIHR5cGUuCisKKyAgRFdfQVRPTV90eXBlX3R5cGVfZmxhZ3MgPSA1dSwgLy8gRHN5bXV0aWwgdHlwZSBleHRlbnNpb24uCisgIERXX0FUT01fcXVhbF9uYW1lX2hhc2ggPSA2dSwgIC8vIERzeW11dGlsIHF1YWxpZmllZCBoYXNoIGV4dGVuc2lvbi4KKworICAvLyBEV19BVE9NX3R5cGVfZmxhZ3MgdmFsdWVzLgorCisgIC8vIEFsd2F5cyBzZXQgZm9yIEMrKywgb25seSBzZXQgZm9yIE9iakMgaWYgdGhpcyBpcyB0aGUgQGltcGxlbWVudGF0aW9uIGZvciBhCisgIC8vIGNsYXNzLgorICBEV19GTEFHX3R5cGVfaW1wbGVtZW50YXRpb24gPSAydSwKKworICAvLyBIYXNoIGZ1bmN0aW9ucy4KKworICAvLyBEYW5pZWwgSi4gQmVybnN0ZWluIGhhc2guCisgIERXX2hhc2hfZnVuY3Rpb25fZGpiID0gMHUKK307CisKKy8vIENvbnN0YW50cyBmb3IgdGhlIEdOVSBwdWJuYW1lcy9wdWJ0eXBlcyBleHRlbnNpb25zIHN1cHBvcnRpbmcgZ2RiIGluZGV4LgorZW51bSBHREJJbmRleEVudHJ5S2luZCB7CisgIEdJRUtfTk9ORSwKKyAgR0lFS19UWVBFLAorICBHSUVLX1ZBUklBQkxFLAorICBHSUVLX0ZVTkNUSU9OLAorICBHSUVLX09USEVSLAorICBHSUVLX1VOVVNFRDUsCisgIEdJRUtfVU5VU0VENiwKKyAgR0lFS19VTlVTRUQ3Cit9OworCitlbnVtIEdEQkluZGV4RW50cnlMaW5rYWdlIHsgR0lFTF9FWFRFUk5BTCwgR0lFTF9TVEFUSUMgfTsKKworLy8vIFxkZWZncm91cCBEd2FyZkNvbnN0YW50c0R1bXBpbmcgRHdhcmYgY29uc3RhbnRzIGR1bXBpbmcgZnVuY3Rpb25zCisvLy8KKy8vLyBBbGwgdGhlc2UgZnVuY3Rpb25zIG1hcCB0aGVpciBhcmd1bWVudCdzIHZhbHVlIGJhY2sgdG8gdGhlCisvLy8gY29ycmVzcG9uZGluZyBlbnVtZXJhdG9yIG5hbWUgb3IgcmV0dXJuIGFuIGVtcHR5IFN0cmluZ1JlZiBpZiB0aGUgdmFsdWUKKy8vLyBpc24ndCBrbm93bi4KKy8vLworLy8vIEB7CitTdHJpbmdSZWYgVGFnU3RyaW5nKHVuc2lnbmVkIFRhZyk7CitTdHJpbmdSZWYgQ2hpbGRyZW5TdHJpbmcodW5zaWduZWQgQ2hpbGRyZW4pOworU3RyaW5nUmVmIEF0dHJpYnV0ZVN0cmluZyh1bnNpZ25lZCBBdHRyaWJ1dGUpOworU3RyaW5nUmVmIEZvcm1FbmNvZGluZ1N0cmluZyh1bnNpZ25lZCBFbmNvZGluZyk7CitTdHJpbmdSZWYgT3BlcmF0aW9uRW5jb2RpbmdTdHJpbmcodW5zaWduZWQgRW5jb2RpbmcpOworU3RyaW5nUmVmIEF0dHJpYnV0ZUVuY29kaW5nU3RyaW5nKHVuc2lnbmVkIEVuY29kaW5nKTsKK1N0cmluZ1JlZiBEZWNpbWFsU2lnblN0cmluZyh1bnNpZ25lZCBTaWduKTsKK1N0cmluZ1JlZiBFbmRpYW5pdHlTdHJpbmcodW5zaWduZWQgRW5kaWFuKTsKK1N0cmluZ1JlZiBBY2Nlc3NpYmlsaXR5U3RyaW5nKHVuc2lnbmVkIEFjY2Vzcyk7CitTdHJpbmdSZWYgVmlzaWJpbGl0eVN0cmluZyh1bnNpZ25lZCBWaXNpYmlsaXR5KTsKK1N0cmluZ1JlZiBWaXJ0dWFsaXR5U3RyaW5nKHVuc2lnbmVkIFZpcnR1YWxpdHkpOworU3RyaW5nUmVmIExhbmd1YWdlU3RyaW5nKHVuc2lnbmVkIExhbmd1YWdlKTsKK1N0cmluZ1JlZiBDYXNlU3RyaW5nKHVuc2lnbmVkIENhc2UpOworU3RyaW5nUmVmIENvbnZlbnRpb25TdHJpbmcodW5zaWduZWQgQ29udmVudGlvbik7CitTdHJpbmdSZWYgSW5saW5lQ29kZVN0cmluZyh1bnNpZ25lZCBDb2RlKTsKK1N0cmluZ1JlZiBBcnJheU9yZGVyU3RyaW5nKHVuc2lnbmVkIE9yZGVyKTsKK1N0cmluZ1JlZiBMTlN0YW5kYXJkU3RyaW5nKHVuc2lnbmVkIFN0YW5kYXJkKTsKK1N0cmluZ1JlZiBMTkV4dGVuZGVkU3RyaW5nKHVuc2lnbmVkIEVuY29kaW5nKTsKK1N0cmluZ1JlZiBNYWNpbmZvU3RyaW5nKHVuc2lnbmVkIEVuY29kaW5nKTsKK1N0cmluZ1JlZiBSYW5nZUxpc3RFbmNvZGluZ1N0cmluZyh1bnNpZ25lZCBFbmNvZGluZyk7CitTdHJpbmdSZWYgQ2FsbEZyYW1lU3RyaW5nKHVuc2lnbmVkIEVuY29kaW5nKTsKK1N0cmluZ1JlZiBBcHBsZVByb3BlcnR5U3RyaW5nKHVuc2lnbmVkKTsKK1N0cmluZ1JlZiBVbml0VHlwZVN0cmluZyh1bnNpZ25lZCk7CitTdHJpbmdSZWYgQXRvbVR5cGVTdHJpbmcodW5zaWduZWQgQXRvbSk7CitTdHJpbmdSZWYgR0RCSW5kZXhFbnRyeUtpbmRTdHJpbmcoR0RCSW5kZXhFbnRyeUtpbmQgS2luZCk7CitTdHJpbmdSZWYgR0RCSW5kZXhFbnRyeUxpbmthZ2VTdHJpbmcoR0RCSW5kZXhFbnRyeUxpbmthZ2UgTGlua2FnZSk7CitTdHJpbmdSZWYgSW5kZXhTdHJpbmcodW5zaWduZWQgSWR4KTsKKy8vLyBAfQorCisvLy8gXGRlZmdyb3VwIER3YXJmQ29uc3RhbnRzUGFyc2luZyBEd2FyZiBjb25zdGFudHMgcGFyc2luZyBmdW5jdGlvbnMKKy8vLworLy8vIFRoZXNlIGZ1bmN0aW9ucyBtYXAgdGhlaXIgc3RyaW5ncyBiYWNrIHRvIHRoZSBjb3JyZXNwb25kaW5nIGVudW1lcmF0aW9uCisvLy8gdmFsdWUgb3IgcmV0dXJuIDAgaWYgdGhlcmUgaXMgbm9uZSwgZXhjZXB0IGZvciB0aGVzZSBleGNlcHRpb25zOgorLy8vCisvLy8gXGxpIFxhIGdldFRhZygpIHJldHVybnMgXGEgRFdfVEFHX2ludmFsaWQgb24gaW52YWxpZCBpbnB1dC4KKy8vLyBcbGkgXGEgZ2V0VmlydHVhbGl0eSgpIHJldHVybnMgXGEgRFdfVklSVFVBTElUWV9pbnZhbGlkIG9uIGludmFsaWQgaW5wdXQuCisvLy8gXGxpIFxhIGdldE1hY2luZm8oKSByZXR1cm5zIFxhIERXX01BQ0lORk9faW52YWxpZCBvbiBpbnZhbGlkIGlucHV0LgorLy8vCisvLy8gQHsKK3Vuc2lnbmVkIGdldFRhZyhTdHJpbmdSZWYgVGFnU3RyaW5nKTsKK3Vuc2lnbmVkIGdldE9wZXJhdGlvbkVuY29kaW5nKFN0cmluZ1JlZiBPcGVyYXRpb25FbmNvZGluZ1N0cmluZyk7Cit1bnNpZ25lZCBnZXRWaXJ0dWFsaXR5KFN0cmluZ1JlZiBWaXJ0dWFsaXR5U3RyaW5nKTsKK3Vuc2lnbmVkIGdldExhbmd1YWdlKFN0cmluZ1JlZiBMYW5ndWFnZVN0cmluZyk7Cit1bnNpZ25lZCBnZXRDYWxsaW5nQ29udmVudGlvbihTdHJpbmdSZWYgTGFuZ3VhZ2VTdHJpbmcpOwordW5zaWduZWQgZ2V0QXR0cmlidXRlRW5jb2RpbmcoU3RyaW5nUmVmIEVuY29kaW5nU3RyaW5nKTsKK3Vuc2lnbmVkIGdldE1hY2luZm8oU3RyaW5nUmVmIE1hY2luZm9TdHJpbmcpOworLy8vIEB9CisKKy8vLyBcZGVmZ3JvdXAgRHdhcmZDb25zdGFudHNWZXJzaW9uaW5nIER3YXJmIHZlcnNpb24gZm9yIGNvbnN0YW50cworLy8vCisvLy8gRm9yIGNvbnN0YW50cyBkZWZpbmVkIGJ5IERXQVJGLCByZXR1cm5zIHRoZSBEV0FSRiB2ZXJzaW9uIHdoZW4gdGhlIGNvbnN0YW50CisvLy8gd2FzIGZpcnN0IGRlZmluZWQuIEZvciB2ZW5kb3IgZXh0ZW5zaW9ucywgaWYgdGhlcmUgaXMgYSB2ZXJzaW9uLXJlbGF0ZWQKKy8vLyBwb2xpY3kgZm9yIHdoZW4gdG8gZW1pdCBpdCwgcmV0dXJucyBhIHZlcnNpb24gbnVtYmVyIGZvciB0aGF0IHBvbGljeS4KKy8vLyBPdGhlcndpc2UgcmV0dXJucyAwLgorLy8vCisvLy8gQHsKK3Vuc2lnbmVkIFRhZ1ZlcnNpb24oVGFnIFQpOwordW5zaWduZWQgQXR0cmlidXRlVmVyc2lvbihBdHRyaWJ1dGUgQSk7Cit1bnNpZ25lZCBGb3JtVmVyc2lvbihGb3JtIEYpOwordW5zaWduZWQgT3BlcmF0aW9uVmVyc2lvbihMb2NhdGlvbkF0b20gTyk7Cit1bnNpZ25lZCBBdHRyaWJ1dGVFbmNvZGluZ1ZlcnNpb24oVHlwZUtpbmQgRSk7Cit1bnNpZ25lZCBMYW5ndWFnZVZlcnNpb24oU291cmNlTGFuZ3VhZ2UgTCk7CisvLy8gQH0KKworLy8vIFxkZWZncm91cCBEd2FyZkNvbnN0YW50c1ZlbmRvciBEd2FyZiAidmVuZG9yIiBmb3IgY29uc3RhbnRzCisvLy8KKy8vLyBUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIGFuIGlkZW50aWZpZXIgZGVzY3JpYmluZyAid2hvIiBkZWZpbmVkIHRoZSBjb25zdGFudCwKKy8vLyBlaXRoZXIgdGhlIERXQVJGIHN0YW5kYXJkIGl0c2VsZiBvciB0aGUgdmVuZG9yIHdobyBkZWZpbmVkIHRoZSBleHRlbnNpb24uCisvLy8KKy8vLyBAewordW5zaWduZWQgVGFnVmVuZG9yKFRhZyBUKTsKK3Vuc2lnbmVkIEF0dHJpYnV0ZVZlbmRvcihBdHRyaWJ1dGUgQSk7Cit1bnNpZ25lZCBGb3JtVmVuZG9yKEZvcm0gRik7Cit1bnNpZ25lZCBPcGVyYXRpb25WZW5kb3IoTG9jYXRpb25BdG9tIE8pOwordW5zaWduZWQgQXR0cmlidXRlRW5jb2RpbmdWZW5kb3IoVHlwZUtpbmQgRSk7Cit1bnNpZ25lZCBMYW5ndWFnZVZlbmRvcihTb3VyY2VMYW5ndWFnZSBMKTsKKy8vLyBAfQorCisvLy8gQSBoZWxwZXIgc3RydWN0IHByb3ZpZGluZyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgYnl0ZSBzaXplIG9mIERXX0ZPUk0KKy8vLyB2YWx1ZXMgdGhhdCB2YXJ5IGluIHNpemUgZGVwZW5kaW5nIG9uIHRoZSBEV0FSRiB2ZXJzaW9uLCBhZGRyZXNzIGJ5dGUKKy8vLyBzaXplLCBvciBEV0FSRjMyL0RXQVJGNjQuCitzdHJ1Y3QgRm9ybVBhcmFtcyB7CisgIHVpbnQxNl90IFZlcnNpb247CisgIHVpbnQ4X3QgQWRkclNpemU7CisgIER3YXJmRm9ybWF0IEZvcm1hdDsKKworICAvLy8gVGhlIGRlZmluaXRpb24gb2YgdGhlIHNpemUgb2YgZm9ybSBEV19GT1JNX3JlZl9hZGRyIGRlcGVuZHMgb24gdGhlCisgIC8vLyB2ZXJzaW9uLiBJbiBEV0FSRiB2MiBpdCdzIHRoZSBzaXplIG9mIGFuIGFkZHJlc3M7IGFmdGVyIHRoYXQsIGl0J3MgdGhlCisgIC8vLyBzaXplIG9mIGEgcmVmZXJlbmNlLgorICB1aW50OF90IGdldFJlZkFkZHJCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgICBpZiAoVmVyc2lvbiA9PSAyKQorICAgICAgcmV0dXJuIEFkZHJTaXplOworICAgIHJldHVybiBnZXREd2FyZk9mZnNldEJ5dGVTaXplKCk7CisgIH0KKworICAvLy8gVGhlIHNpemUgb2YgYSByZWZlcmVuY2UgaXMgZGV0ZXJtaW5lZCBieSB0aGUgRFdBUkYgMzIvNjQtYml0IGZvcm1hdC4KKyAgdWludDhfdCBnZXREd2FyZk9mZnNldEJ5dGVTaXplKCkgY29uc3QgeworICAgIHN3aXRjaCAoRm9ybWF0KSB7CisgICAgY2FzZSBEd2FyZkZvcm1hdDo6RFdBUkYzMjoKKyAgICAgIHJldHVybiA0OworICAgIGNhc2UgRHdhcmZGb3JtYXQ6OkRXQVJGNjQ6CisgICAgICByZXR1cm4gODsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBGb3JtYXQgdmFsdWUiKTsKKyAgfQorCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBWZXJzaW9uICYmIEFkZHJTaXplOyB9Cit9OworCisvLy8gR2V0IHRoZSBmaXhlZCBieXRlIHNpemUgZm9yIGEgZ2l2ZW4gZm9ybS4KKy8vLworLy8vIElmIHRoZSBmb3JtIGhhcyBhIGZpeGVkIGJ5dGUgc2l6ZSwgdGhlbiBhbiBPcHRpb25hbCB3aXRoIGEgdmFsdWUgd2lsbCBiZQorLy8vIHJldHVybmVkLiBJZiB0aGUgZm9ybSBpcyBhbHdheXMgZW5jb2RlZCB1c2luZyBhIHZhcmlhYmxlIGxlbmd0aCBzdG9yYWdlCisvLy8gZm9ybWF0IChVTEVCIG9yIFNMRUIgbnVtYmVycyBvciBibG9ja3MpIHRoZW4gTm9uZSB3aWxsIGJlIHJldHVybmVkLgorLy8vCisvLy8gXHBhcmFtIEZvcm0gRFdBUkYgZm9ybSB0byBnZXQgdGhlIGZpeGVkIGJ5dGUgc2l6ZSBmb3IuCisvLy8gXHBhcmFtIFBhcmFtcyBEV0FSRiBwYXJhbWV0ZXJzIHRvIGhlbHAgaW50ZXJwcmV0IGZvcm1zLgorLy8vIFxyZXR1cm5zIE9wdGlvbmFsPHVpbnQ4X3Q+IHZhbHVlIHdpdGggdGhlIGZpeGVkIGJ5dGUgc2l6ZSBvciBOb25lIGlmCisvLy8gXHAgRm9ybSBkb2Vzbid0IGhhdmUgYSBmaXhlZCBieXRlIHNpemUuCitPcHRpb25hbDx1aW50OF90PiBnZXRGaXhlZEZvcm1CeXRlU2l6ZShkd2FyZjo6Rm9ybSBGb3JtLCBGb3JtUGFyYW1zIFBhcmFtcyk7CisKKy8vLyBUZWxscyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgZm9ybSBpcyBkZWZpbmVkIGluIHRoZSBzcGVjaWZpZWQgdmVyc2lvbiwKKy8vLyBvciBpcyBhbiBleHRlbnNpb24gaWYgZXh0ZW5zaW9ucyBhcmUgYWxsb3dlZC4KK2Jvb2wgaXNWYWxpZEZvcm1Gb3JWZXJzaW9uKEZvcm0gRiwgdW5zaWduZWQgVmVyc2lvbiwgYm9vbCBFeHRlbnNpb25zT2sgPSB0cnVlKTsKKworLy8vIFJldHVybnMgdGhlIHN5bWJvbGljIHN0cmluZyByZXByZXNlbnRpbmcgVmFsIHdoZW4gdXNlZCBhcyBhIHZhbHVlCisvLy8gZm9yIGF0dHJpYnV0ZSBBdHRyLgorU3RyaW5nUmVmIEF0dHJpYnV0ZVZhbHVlU3RyaW5nKHVpbnQxNl90IEF0dHIsIHVuc2lnbmVkIFZhbCk7CisKKy8vLyBEZXNjcmliZXMgYW4gZW50cnkgb2YgdGhlIHZhcmlvdXMgZ251X3B1YiogZGVidWcgc2VjdGlvbnMuCisvLy8KKy8vLyBUaGUgZ251X3B1Yioga2luZCBsb29rcyBsaWtlOgorLy8vCisvLy8gMC0zICByZXNlcnZlZAorLy8vIDQtNiAgc3ltYm9sIGtpbmQKKy8vLyA3ICAgIDAgPT0gZ2xvYmFsLCAxID09IHN0YXRpYworLy8vCisvLy8gQSBnZGJfaW5kZXggZGVzY3JpcHRvciBpbmNsdWRlcyB0aGUgYWJvdmUga2luZCwgc2hpZnRlZCAyNCBiaXRzIHVwIHdpdGggdGhlCisvLy8gb2Zmc2V0IG9mIHRoZSBjdSB3aXRoaW4gdGhlIGRlYnVnX2luZm8gc2VjdGlvbiBzdG9yZWQgaW4gdGhvc2UgMjQgYml0cy4KK3N0cnVjdCBQdWJJbmRleEVudHJ5RGVzY3JpcHRvciB7CisgIEdEQkluZGV4RW50cnlLaW5kIEtpbmQ7CisgIEdEQkluZGV4RW50cnlMaW5rYWdlIExpbmthZ2U7CisgIFB1YkluZGV4RW50cnlEZXNjcmlwdG9yKEdEQkluZGV4RW50cnlLaW5kIEtpbmQsIEdEQkluZGV4RW50cnlMaW5rYWdlIExpbmthZ2UpCisgICAgICA6IEtpbmQoS2luZCksIExpbmthZ2UoTGlua2FnZSkge30KKyAgLyogaW1wbGljaXQgKi8gUHViSW5kZXhFbnRyeURlc2NyaXB0b3IoR0RCSW5kZXhFbnRyeUtpbmQgS2luZCkKKyAgICAgIDogS2luZChLaW5kKSwgTGlua2FnZShHSUVMX0VYVEVSTkFMKSB7fQorICBleHBsaWNpdCBQdWJJbmRleEVudHJ5RGVzY3JpcHRvcih1aW50OF90IFZhbHVlKQorICAgICAgOiBLaW5kKAorICAgICAgICAgICAgc3RhdGljX2Nhc3Q8R0RCSW5kZXhFbnRyeUtpbmQ+KChWYWx1ZSAmIEtJTkRfTUFTSykgPj4gS0lORF9PRkZTRVQpKSwKKyAgICAgICAgTGlua2FnZShzdGF0aWNfY2FzdDxHREJJbmRleEVudHJ5TGlua2FnZT4oKFZhbHVlICYgTElOS0FHRV9NQVNLKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSU5LQUdFX09GRlNFVCkpIHt9CisgIHVpbnQ4X3QgdG9CaXRzKCkgY29uc3QgeworICAgIHJldHVybiBLaW5kIDw8IEtJTkRfT0ZGU0VUIHwgTGlua2FnZSA8PCBMSU5LQUdFX09GRlNFVDsKKyAgfQorCitwcml2YXRlOgorICBlbnVtIHsKKyAgICBLSU5EX09GRlNFVCA9IDQsCisgICAgS0lORF9NQVNLID0gNyA8PCBLSU5EX09GRlNFVCwKKyAgICBMSU5LQUdFX09GRlNFVCA9IDcsCisgICAgTElOS0FHRV9NQVNLID0gMSA8PCBMSU5LQUdFX09GRlNFVAorICB9OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEVudW0+IHN0cnVjdCBFbnVtVHJhaXRzIDogcHVibGljIHN0ZDo6ZmFsc2VfdHlwZSB7fTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEVudW1UcmFpdHM8QXR0cmlidXRlPiA6IHB1YmxpYyBzdGQ6OnRydWVfdHlwZSB7CisgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBUeXBlWzNdID0gIkFUIjsKKyAgc3RhdGljIGNvbnN0ZXhwciBTdHJpbmdSZWYgKCpTdHJpbmdGbikodW5zaWduZWQpID0gJkF0dHJpYnV0ZVN0cmluZzsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBFbnVtVHJhaXRzPEZvcm0+IDogcHVibGljIHN0ZDo6dHJ1ZV90eXBlIHsKKyAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIFR5cGVbNV0gPSAiRk9STSI7CisgIHN0YXRpYyBjb25zdGV4cHIgU3RyaW5nUmVmICgqU3RyaW5nRm4pKHVuc2lnbmVkKSA9ICZGb3JtRW5jb2RpbmdTdHJpbmc7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRW51bVRyYWl0czxJbmRleD4gOiBwdWJsaWMgc3RkOjp0cnVlX3R5cGUgeworICBzdGF0aWMgY29uc3RleHByIGNoYXIgVHlwZVs0XSA9ICJJRFgiOworICBzdGF0aWMgY29uc3RleHByIFN0cmluZ1JlZiAoKlN0cmluZ0ZuKSh1bnNpZ25lZCkgPSAmSW5kZXhTdHJpbmc7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRW51bVRyYWl0czxUYWc+IDogcHVibGljIHN0ZDo6dHJ1ZV90eXBlIHsKKyAgc3RhdGljIGNvbnN0ZXhwciBjaGFyIFR5cGVbNF0gPSAiVEFHIjsKKyAgc3RhdGljIGNvbnN0ZXhwciBTdHJpbmdSZWYgKCpTdHJpbmdGbikodW5zaWduZWQpID0gJlRhZ1N0cmluZzsKK307Cit9IC8vIEVuZCBvZiBuYW1lc3BhY2UgZHdhcmYKKworLy8vIER3YXJmIGNvbnN0YW50cyBmb3JtYXRfcHJvdmlkZXIKKy8vLworLy8vIFNwZWNpYWxpemF0aW9uIG9mIHRoZSBmb3JtYXRfcHJvdmlkZXIgdGVtcGxhdGUgZm9yIGR3YXJmIGVudW1zLiBVbmxpa2UgdGhlCisvLy8gZHVtcGluZyBmdW5jdGlvbnMgYWJvdmUsIHRoZXNlIGZvcm1hdCB1bmtub3duIGVudW1lcmF0b3IgdmFsdWVzIGFzCisvLy8gRFdfVFlQRV91bmtub3duXzEyMzQgKGUuZy4gRFdfVEFHX3Vua25vd25fZmZmZikuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRW51bT4KK3N0cnVjdCBmb3JtYXRfcHJvdmlkZXI8CisgICAgRW51bSwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8ZHdhcmY6OkVudW1UcmFpdHM8RW51bT46OnZhbHVlPjo6dHlwZT4geworICBzdGF0aWMgdm9pZCBmb3JtYXQoY29uc3QgRW51bSAmRSwgcmF3X29zdHJlYW0gJk9TLCBTdHJpbmdSZWYgU3R5bGUpIHsKKyAgICBTdHJpbmdSZWYgU3RyID0gZHdhcmY6OkVudW1UcmFpdHM8RW51bT46OlN0cmluZ0ZuKEUpOworICAgIGlmIChTdHIuZW1wdHkoKSkgeworICAgICAgT1MgPDwgIkRXXyIgPDwgZHdhcmY6OkVudW1UcmFpdHM8RW51bT46OlR5cGUgPDwgIl91bmtub3duXyIKKyAgICAgICAgIDw8IGxsdm06OmZvcm1hdCgiJXgiLCBFKTsKKyAgICB9IGVsc2UKKyAgICAgIE9TIDw8IFN0cjsKKyAgfQorfTsKK30gLy8gRW5kIG9mIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRHluYW1pY1RhZ3MuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRHluYW1pY1RhZ3MuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzOWYzOGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9EeW5hbWljVGFncy5kZWYKQEAgLTAsMCArMSwxODcgQEAKKyNpZm5kZWYgRFlOQU1JQ19UQUcKKyNlcnJvciAiRFlOQU1JQ19UQUcgbXVzdCBiZSBkZWZpbmVkIgorI2VuZGlmCisKKy8vIEFkZCBzZXBhcmF0ZSBtYWNyb3MgZm9yIHRoZSBhcmNoaXRlY3R1cmUgc3BlY2lmaWMgdGFncyBhbmQgdGhlIG1hcmtlcnMKKy8vIHN1Y2ggYXMgRFRfSElPUywgZXRjLiB0byBhbGxvdyB1c2luZyB0aGlzIGZpbGUgdG8gaW4gb3RoZXIgY29udGV4dHMuCisvLyBGb3IgZXhhbXBsZSB3ZSBjYW4gdXNlIGl0IHRvIGdlbmVyYXRlIGEgc3RyaW5naWZpY2F0aW9uIHN3aXRjaCBzdGF0ZW1lbnQuCisKKyNpZm5kZWYgSEVYQUdPTl9EWU5BTUlDX1RBRworI2RlZmluZSBIRVhBR09OX0RZTkFNSUNfVEFHKG5hbWUsIHZhbHVlKSBEWU5BTUlDX1RBRyhuYW1lLCB2YWx1ZSkKKyNkZWZpbmUgSEVYQUdPTl9EWU5BTUlDX1RBR19ERUZJTkVECisjZW5kaWYKKworI2lmbmRlZiBNSVBTX0RZTkFNSUNfVEFHCisjZGVmaW5lIE1JUFNfRFlOQU1JQ19UQUcobmFtZSwgdmFsdWUpIERZTkFNSUNfVEFHKG5hbWUsIHZhbHVlKQorI2RlZmluZSBNSVBTX0RZTkFNSUNfVEFHX0RFRklORUQKKyNlbmRpZgorCisjaWZuZGVmIERZTkFNSUNfVEFHX01BUktFUgorI2RlZmluZSBEWU5BTUlDX1RBR19NQVJLRVIobmFtZSwgdmFsdWUpIERZTkFNSUNfVEFHKG5hbWUsIHZhbHVlKQorI2RlZmluZSBEWU5BTUlDX1RBR19NQVJLRVJfREVGSU5FRAorI2VuZGlmCisKK0RZTkFNSUNfVEFHKE5VTEwsIDApICAgICAgICAvLyBNYXJrcyBlbmQgb2YgZHluYW1pYyBhcnJheS4KK0RZTkFNSUNfVEFHKE5FRURFRCwgMSkgICAgICAvLyBTdHJpbmcgdGFibGUgb2Zmc2V0IG9mIG5lZWRlZCBsaWJyYXJ5LgorRFlOQU1JQ19UQUcoUExUUkVMU1osIDIpICAgIC8vIFNpemUgb2YgcmVsb2NhdGlvbiBlbnRyaWVzIGluIFBMVC4KK0RZTkFNSUNfVEFHKFBMVEdPVCwgMykgICAgICAvLyBBZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCBsaW5rYWdlIHRhYmxlLgorRFlOQU1JQ19UQUcoSEFTSCwgNCkgICAgICAgIC8vIEFkZHJlc3Mgb2Ygc3ltYm9saWMgaGFzaCB0YWJsZS4KK0RZTkFNSUNfVEFHKFNUUlRBQiwgNSkgICAgICAvLyBBZGRyZXNzIG9mIGR5bmFtaWMgc3RyaW5nIHRhYmxlLgorRFlOQU1JQ19UQUcoU1lNVEFCLCA2KSAgICAgIC8vIEFkZHJlc3Mgb2YgZHluYW1pYyBzeW1ib2wgdGFibGUuCitEWU5BTUlDX1RBRyhSRUxBLCA3KSAgICAgICAgLy8gQWRkcmVzcyBvZiByZWxvY2F0aW9uIHRhYmxlIChSZWxhIGVudHJpZXMpLgorRFlOQU1JQ19UQUcoUkVMQVNaLCA4KSAgICAgIC8vIFNpemUgb2YgUmVsYSByZWxvY2F0aW9uIHRhYmxlLgorRFlOQU1JQ19UQUcoUkVMQUVOVCwgOSkgICAgIC8vIFNpemUgb2YgYSBSZWxhIHJlbG9jYXRpb24gZW50cnkuCitEWU5BTUlDX1RBRyhTVFJTWiwgMTApICAgICAgLy8gVG90YWwgc2l6ZSBvZiB0aGUgc3RyaW5nIHRhYmxlLgorRFlOQU1JQ19UQUcoU1lNRU5ULCAxMSkgICAgIC8vIFNpemUgb2YgYSBzeW1ib2wgdGFibGUgZW50cnkuCitEWU5BTUlDX1RBRyhJTklULCAxMikgICAgICAgLy8gQWRkcmVzcyBvZiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbi4KK0RZTkFNSUNfVEFHKEZJTkksIDEzKSAgICAgICAvLyBBZGRyZXNzIG9mIHRlcm1pbmF0aW9uIGZ1bmN0aW9uLgorRFlOQU1JQ19UQUcoU09OQU1FLCAxNCkgICAgIC8vIFN0cmluZyB0YWJsZSBvZmZzZXQgb2YgYSBzaGFyZWQgb2JqZWN0cyBuYW1lLgorRFlOQU1JQ19UQUcoUlBBVEgsIDE1KSAgICAgIC8vIFN0cmluZyB0YWJsZSBvZmZzZXQgb2YgbGlicmFyeSBzZWFyY2ggcGF0aC4KK0RZTkFNSUNfVEFHKFNZTUJPTElDLCAxNikgICAvLyBDaGFuZ2VzIHN5bWJvbCByZXNvbHV0aW9uIGFsZ29yaXRobS4KK0RZTkFNSUNfVEFHKFJFTCwgMTcpICAgICAgICAvLyBBZGRyZXNzIG9mIHJlbG9jYXRpb24gdGFibGUgKFJlbCBlbnRyaWVzKS4KK0RZTkFNSUNfVEFHKFJFTFNaLCAxOCkgICAgICAvLyBTaXplIG9mIFJlbCByZWxvY2F0aW9uIHRhYmxlLgorRFlOQU1JQ19UQUcoUkVMRU5ULCAxOSkgICAgIC8vIFNpemUgb2YgYSBSZWwgcmVsb2NhdGlvbiBlbnRyeS4KK0RZTkFNSUNfVEFHKFBMVFJFTCwgMjApICAgICAvLyBUeXBlIG9mIHJlbG9jYXRpb24gZW50cnkgdXNlZCBmb3IgbGlua2luZy4KK0RZTkFNSUNfVEFHKERFQlVHLCAyMSkgICAgICAvLyBSZXNlcnZlZCBmb3IgZGVidWdnZXIuCitEWU5BTUlDX1RBRyhURVhUUkVMLCAyMikgICAgLy8gUmVsb2NhdGlvbnMgZXhpc3QgZm9yIG5vbi13cml0YWJsZSBzZWdtZW50cy4KK0RZTkFNSUNfVEFHKEpNUFJFTCwgMjMpICAgICAvLyBBZGRyZXNzIG9mIHJlbG9jYXRpb25zIGFzc29jaWF0ZWQgd2l0aCBQTFQuCitEWU5BTUlDX1RBRyhCSU5EX05PVywgMjQpICAgLy8gUHJvY2VzcyBhbGwgcmVsb2NhdGlvbnMgYmVmb3JlIGV4ZWN1dGlvbi4KK0RZTkFNSUNfVEFHKElOSVRfQVJSQVksIDI1KSAvLyBQb2ludGVyIHRvIGFycmF5IG9mIGluaXRpYWxpemF0aW9uIGZ1bmN0aW9ucy4KK0RZTkFNSUNfVEFHKEZJTklfQVJSQVksIDI2KSAvLyBQb2ludGVyIHRvIGFycmF5IG9mIHRlcm1pbmF0aW9uIGZ1bmN0aW9ucy4KK0RZTkFNSUNfVEFHKElOSVRfQVJSQVlTWiwgMjcpIC8vIFNpemUgb2YgRFRfSU5JVF9BUlJBWS4KK0RZTkFNSUNfVEFHKEZJTklfQVJSQVlTWiwgMjgpIC8vIFNpemUgb2YgRFRfRklOSV9BUlJBWS4KK0RZTkFNSUNfVEFHKFJVTlBBVEgsIDI5KSAgICAgIC8vIFN0cmluZyB0YWJsZSBvZmZzZXQgb2YgbGliIHNlYXJjaCBwYXRoLgorRFlOQU1JQ19UQUcoRkxBR1MsIDMwKSAgICAgICAgLy8gRmxhZ3MuCitEWU5BTUlDX1RBR19NQVJLRVIoRU5DT0RJTkcsIDMyKSAvLyBWYWx1ZXMgZnJvbSBoZXJlIHRvIERUX0xPT1MgZm9sbG93IHRoZSBydWxlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgZF91biB1bmlvbi4KKworRFlOQU1JQ19UQUcoUFJFSU5JVF9BUlJBWSwgMzIpICAgLy8gUG9pbnRlciB0byBhcnJheSBvZiBwcmVpbml0IGZ1bmN0aW9ucy4KK0RZTkFNSUNfVEFHKFBSRUlOSVRfQVJSQVlTWiwgMzMpIC8vIFNpemUgb2YgdGhlIERUX1BSRUlOSVRfQVJSQVkgYXJyYXkuCisKK0RZTkFNSUNfVEFHX01BUktFUihMT09TLCAweDYwMDAwMDAwKSAgIC8vIFN0YXJ0IG9mIGVudmlyb25tZW50IHNwZWNpZmljIHRhZ3MuCitEWU5BTUlDX1RBR19NQVJLRVIoSElPUywgMHg2RkZGRkZGRikgICAvLyBFbmQgb2YgZW52aXJvbm1lbnQgc3BlY2lmaWMgdGFncy4KK0RZTkFNSUNfVEFHX01BUktFUihMT1BST0MsIDB4NzAwMDAwMDApIC8vIFN0YXJ0IG9mIHByb2Nlc3NvciBzcGVjaWZpYyB0YWdzLgorRFlOQU1JQ19UQUdfTUFSS0VSKEhJUFJPQywgMHg3RkZGRkZGRikgLy8gRW5kIG9mIHByb2Nlc3NvciBzcGVjaWZpYyB0YWdzLgorCisvLyBBbmRyb2lkIHBhY2tlZCByZWxvY2F0aW9uIHNlY3Rpb24gdGFncy4KKy8vIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2Jpb25pYy8rLzZmMTJiZmVjZTVkY2MwMTMyNWUwYWJiYTU2YTQ2YjFiY2Y5OTFjNjkvdG9vbHMvcmVsb2NhdGlvbl9wYWNrZXIvc3JjL2VsZl9maWxlLmNjIzMxCitEWU5BTUlDX1RBRyhBTkRST0lEX1JFTCwgMHg2MDAwMDAwRikKK0RZTkFNSUNfVEFHKEFORFJPSURfUkVMU1osIDB4NjAwMDAwMTApCitEWU5BTUlDX1RBRyhBTkRST0lEX1JFTEEsIDB4NjAwMDAwMTEpCitEWU5BTUlDX1RBRyhBTkRST0lEX1JFTEFTWiwgMHg2MDAwMDAxMikKKworRFlOQU1JQ19UQUcoR05VX0hBU0gsIDB4NkZGRkZFRjUpICAgIC8vIFJlZmVyZW5jZSB0byB0aGUgR05VIGhhc2ggdGFibGUuCitEWU5BTUlDX1RBRyhUTFNERVNDX1BMVCwgMHg2RkZGRkVGNikgLy8gTG9jYXRpb24gb2YgUExUIGVudHJ5IGZvciBUTFMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXNjcmlwdG9yIHJlc29sdmVyIGNhbGxzLgorRFlOQU1JQ19UQUcoVExTREVTQ19HT1QsIDB4NkZGRkZFRjcpIC8vIExvY2F0aW9uIG9mIEdPVCBlbnRyeSB1c2VkIGJ5IFRMUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaXB0b3IgcmVzb2x2ZXIgUExUIGVudHJ5LgorRFlOQU1JQ19UQUcoUkVMQUNPVU5ULCAweDZGRkZGRkY5KSAgIC8vIEVMRjMyX1JlbGEgY291bnQuCitEWU5BTUlDX1RBRyhSRUxDT1VOVCwgMHg2RkZGRkZGQSkgICAgLy8gRUxGMzJfUmVsIGNvdW50LgorCitEWU5BTUlDX1RBRyhGTEFHU18xLCAwWDZGRkZGRkZCKSAvLyBGbGFnc18xLgorCitEWU5BTUlDX1RBRyhWRVJTWU0sIDB4NkZGRkZGRjApICAgICAvLyBUaGUgYWRkcmVzcyBvZiAuZ251LnZlcnNpb24gc2VjdGlvbi4KK0RZTkFNSUNfVEFHKFZFUkRFRiwgMFg2RkZGRkZGQykgICAgIC8vIFRoZSBhZGRyZXNzIG9mIHRoZSB2ZXJzaW9uIGRlZmluaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlLgorRFlOQU1JQ19UQUcoVkVSREVGTlVNLCAwWDZGRkZGRkZEKSAgLy8gVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIERUX1ZFUkRFRi4KK0RZTkFNSUNfVEFHKFZFUk5FRUQsIDBYNkZGRkZGRkUpICAgIC8vIFRoZSBhZGRyZXNzIG9mIHRoZSB2ZXJzaW9uIGRlcGVuZGVuY3kKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlLgorRFlOQU1JQ19UQUcoVkVSTkVFRE5VTSwgMFg2RkZGRkZGRikgLy8gVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIERUX1ZFUk5FRUQuCisKKy8vIEhleGFnb24gc3BlY2lmaWMgZHluYW1pYyB0YWJsZSBlbnRyaWVzCitIRVhBR09OX0RZTkFNSUNfVEFHKEhFWEFHT05fU1lNU1osIDB4NzAwMDAwMDApCitIRVhBR09OX0RZTkFNSUNfVEFHKEhFWEFHT05fVkVSLCAweDcwMDAwMDAxKQorSEVYQUdPTl9EWU5BTUlDX1RBRyhIRVhBR09OX1BMVCwgMHg3MDAwMDAwMikKKworLy8gTWlwcyBzcGVjaWZpYyBkeW5hbWljIHRhYmxlIGVudHJ5IHRhZ3MuCisKK01JUFNfRFlOQU1JQ19UQUcoTUlQU19STERfVkVSU0lPTiwgMHg3MDAwMDAwMSkgIC8vIDMyIGJpdCB2ZXJzaW9uIG51bWJlciBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJ1bnRpbWUgbGlua2VyIGludGVyZmFjZS4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19USU1FX1NUQU1QLCAweDcwMDAwMDAyKSAgIC8vIFRpbWUgc3RhbXAuCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfSUNIRUNLU1VNLCAweDcwMDAwMDAzKSAgICAvLyBDaGVja3N1bSBvZiBleHRlcm5hbCBzdHJpbmdzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgY29tbW9uIHNpemVzLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX0lWRVJTSU9OLCAweDcwMDAwMDA0KSAgICAgLy8gSW5kZXggb2YgdmVyc2lvbiBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHN0cmluZyB0YWJsZS4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19GTEFHUywgMHg3MDAwMDAwNSkgICAgICAgIC8vIDMyIGJpdHMgb2YgZmxhZ3MuCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfQkFTRV9BRERSRVNTLCAweDcwMDAwMDA2KSAvLyBCYXNlIGFkZHJlc3Mgb2YgdGhlIHNlZ21lbnQuCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfTVNZTSwgMHg3MDAwMDAwNykgICAgICAgICAvLyBBZGRyZXNzIG9mIC5tc3ltIHNlY3Rpb24uCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfQ09ORkxJQ1QsIDB4NzAwMDAwMDgpICAgICAvLyBBZGRyZXNzIG9mIC5jb25mbGljdCBzZWN0aW9uLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX0xJQkxJU1QsIDB4NzAwMDAwMDkpICAgICAgLy8gQWRkcmVzcyBvZiAubGlibGlzdCBzZWN0aW9uLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX0xPQ0FMX0dPVE5PLCAweDcwMDAwMDBhKSAgLy8gTnVtYmVyIG9mIGxvY2FsIGdsb2JhbCBvZmZzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhYmxlIGVudHJpZXMuCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfQ09ORkxJQ1ROTywgMHg3MDAwMDAwYikgICAvLyBOdW1iZXIgb2YgZW50cmllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gdGhlIC5jb25mbGljdCBzZWN0aW9uLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX0xJQkxJU1ROTywgMHg3MDAwMDAxMCkgICAgLy8gTnVtYmVyIG9mIGVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSAubGlibGlzdCBzZWN0aW9uLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX1NZTVRBQk5PLCAweDcwMDAwMDExKSAgICAgLy8gTnVtYmVyIG9mIGVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSAuZHluc3ltIHNlY3Rpb24uCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfVU5SRUZFWFROTywgMHg3MDAwMDAxMikgICAvLyBJbmRleCBvZiBmaXJzdCBleHRlcm5hbCBkeW5hbWljCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzeW1ib2wgbm90IHJlZmVyZW5jZWQgbG9jYWxseS4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19HT1RTWU0sIDB4NzAwMDAwMTMpICAgICAgIC8vIEluZGV4IG9mIGZpcnN0IGR5bmFtaWMgc3ltYm9sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbiBnbG9iYWwgb2Zmc2V0IHRhYmxlLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX0hJUEFHRU5PLCAweDcwMDAwMDE0KSAgICAgLy8gTnVtYmVyIG9mIHBhZ2UgdGFibGUgZW50cmllcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gZ2xvYmFsIG9mZnNldCB0YWJsZS4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19STERfTUFQLCAweDcwMDAwMDE2KSAgICAgIC8vIEFkZHJlc3Mgb2YgcnVuIHRpbWUgbG9hZGVyIG1hcAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlZCBmb3IgZGVidWdnaW5nLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX0RFTFRBX0NMQVNTLCAweDcwMDAwMDE3KSAgICAvLyBEZWx0YSBDKysgY2xhc3MgZGVmaW5pdGlvbi4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19ERUxUQV9DTEFTU19OTywgMHg3MDAwMDAxOCkgLy8gTnVtYmVyIG9mIGVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gRFRfTUlQU19ERUxUQV9DTEFTUy4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19ERUxUQV9JTlNUQU5DRSwgMHg3MDAwMDAxOSkgLy8gRGVsdGEgQysrIGNsYXNzIGluc3RhbmNlcy4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19ERUxUQV9JTlNUQU5DRV9OTywgMHg3MDAwMDAxQSkgLy8gTnVtYmVyIG9mIGVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gRFRfTUlQU19ERUxUQV9JTlNUQU5DRS4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19ERUxUQV9SRUxPQywgMHg3MDAwMDAxQikgICAgICAgLy8gRGVsdGEgcmVsb2NhdGlvbnMuCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfREVMVEFfUkVMT0NfTk8sIDB4NzAwMDAwMUMpICAgIC8vIE51bWJlciBvZiBlbnRyaWVzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIERUX01JUFNfREVMVEFfUkVMT0MuCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfREVMVEFfU1lNLCAweDcwMDAwMDFEKSAgICAgICAgIC8vIERlbHRhIHN5bWJvbHMgdGhhdCBEZWx0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZWxvY2F0aW9ucyByZWZlciB0by4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19ERUxUQV9TWU1fTk8sIDB4NzAwMDAwMUUpICAgICAgLy8gTnVtYmVyIG9mIGVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gRFRfTUlQU19ERUxUQV9TWU0uCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfREVMVEFfQ0xBU1NTWU0sIDB4NzAwMDAwMjApICAgIC8vIERlbHRhIHN5bWJvbHMgdGhhdCBob2xkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNsYXNzIGRlY2xhcmF0aW9ucy4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19ERUxUQV9DTEFTU1NZTV9OTywgMHg3MDAwMDAyMSkgLy8gTnVtYmVyIG9mIGVudHJpZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW4gRFRfTUlQU19ERUxUQV9DTEFTU1NZTS4KKworTUlQU19EWU5BTUlDX1RBRyhNSVBTX0NYWF9GTEFHUywgMHg3MDAwMDAyMikgICAgICAgICAvLyBGbGFncyBpbmRpY2F0aW5nIGluZm9ybWF0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFib3V0IEMrKyBmbGF2b3IuCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfUElYSUVfSU5JVCwgMHg3MDAwMDAyMykgICAgICAgIC8vIFBpeGllIGluZm9ybWF0aW9uLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX1NZTUJPTF9MSUIsIDB4NzAwMDAwMjQpICAgICAgICAvLyBBZGRyZXNzIG9mIC5NSVBTLnN5bWxpYgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX0xPQ0FMUEFHRV9HT1RJRFgsIDB4NzAwMDAwMjUpICAvLyBUaGUgR09UIGluZGV4IG9mIHRoZSBmaXJzdCBQVEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGEgc2VnbWVudAorTUlQU19EWU5BTUlDX1RBRyhNSVBTX0xPQ0FMX0dPVElEWCwgMHg3MDAwMDAyNikgICAgICAvLyBUaGUgR09UIGluZGV4IG9mIHRoZSBmaXJzdCBQVEUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGEgbG9jYWwgc3ltYm9sCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfSElEREVOX0dPVElEWCwgMHg3MDAwMDAyNykgICAgIC8vIFRoZSBHT1QgaW5kZXggb2YgdGhlIGZpcnN0IFBURQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYSBoaWRkZW4gc3ltYm9sCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfUFJPVEVDVEVEX0dPVElEWCwgMHg3MDAwMDAyOCkgIC8vIFRoZSBHT1QgaW5kZXggb2YgdGhlIGZpcnN0IFBURQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgYSBwcm90ZWN0ZWQgc3ltYm9sCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfT1BUSU9OUywgMHg3MDAwMDAyOSkgICAgICAgICAgICAgICAvLyBBZGRyZXNzIG9mIGAuTUlQUy5vcHRpb25zJy4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19JTlRFUkZBQ0UsIDB4NzAwMDAwMkEpICAgICAgICAgICAgIC8vIEFkZHJlc3Mgb2YgYC5pbnRlcmZhY2UnLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX0RZTlNUUl9BTElHTiwgMHg3MDAwMDAyQikgICAgICAgICAgLy8gVW5rbm93bi4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19JTlRFUkZBQ0VfU0laRSwgMHg3MDAwMDAyQykgICAgICAgIC8vIFNpemUgb2YgdGhlIC5pbnRlcmZhY2Ugc2VjdGlvbi4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19STERfVEVYVF9SRVNPTFZFX0FERFIsIDB4NzAwMDAwMkQpIC8vIFNpemUgb2YgcmxkX3RleHRfcmVzb2x2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZnVuY3Rpb24gc3RvcmVkIGluIHRoZSBHT1QuCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfUEVSRl9TVUZGSVgsIDB4NzAwMDAwMkUpICAvLyBEZWZhdWx0IHN1ZmZpeCBvZiBEU08gdG8gYmUgYWRkZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHJsZCBvbiBkbG9wZW4oKSBjYWxscy4KK01JUFNfRFlOQU1JQ19UQUcoTUlQU19DT01QQUNUX1NJWkUsIDB4NzAwMDAwMkYpIC8vIFNpemUgb2YgY29tcGFjdCByZWxvY2F0aW9uCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWN0aW9uIChPMzIpLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX0dQX1ZBTFVFLCAweDcwMDAwMDMwKSAgICAgLy8gR1AgdmFsdWUgZm9yIGF1eGlsaWFyeSBHT1RzLgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX0FVWF9EWU5BTUlDLCAweDcwMDAwMDMxKSAgLy8gQWRkcmVzcyBvZiBhdXhpbGlhcnkgLmR5bmFtaWMuCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfUExUR09ULCAweDcwMDAwMDMyKSAgICAgICAvLyBBZGRyZXNzIG9mIHRoZSBiYXNlIG9mIHRoZSBQTFRHT1QuCitNSVBTX0RZTkFNSUNfVEFHKE1JUFNfUldQTFQsIDB4NzAwMDAwMzQpICAgICAgICAvLyBQb2ludHMgdG8gdGhlIGJhc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIGEgd3JpdGFibGUgUExULgorTUlQU19EWU5BTUlDX1RBRyhNSVBTX1JMRF9NQVBfUkVMLCAweDcwMDAwMDM1KSAgLy8gUmVsYXRpdmUgb2Zmc2V0IG9mIHJ1biB0aW1lIGxvYWRlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFwLCB1c2VkIGZvciBkZWJ1Z2dpbmcuCisKKy8vIFN1biBtYWNoaW5lLWluZGVwZW5kZW50IGV4dGVuc2lvbnMuCitEWU5BTUlDX1RBRyhBVVhJTElBUlksIDB4N0ZGRkZGRkQpIC8vIFNoYXJlZCBvYmplY3QgdG8gbG9hZCBiZWZvcmUgc2VsZgorRFlOQU1JQ19UQUcoRklMVEVSLCAweDdGRkZGRkZGKSAgICAvLyBTaGFyZWQgb2JqZWN0IHRvIGdldCB2YWx1ZXMgZnJvbQorCisKKyNpZmRlZiBEWU5BTUlDX1RBR19NQVJLRVJfREVGSU5FRAorI3VuZGVmIERZTkFNSUNfVEFHX01BUktFUgorI2VuZGlmCisjaWZkZWYgTUlQU19EWU5BTUlDX1RBR19ERUZJTkVECisjdW5kZWYgTUlQU19EWU5BTUlDX1RBRworI2VuZGlmCisjaWZkZWYgSEVYQUdPTl9EWU5BTUlDX1RBR19ERUZJTkVECisjdW5kZWYgSEVYQUdPTl9EWU5BTUlDX1RBRworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEYuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NTFlNTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEYuaApAQCAtMCwwICsxLDEzNzQgQEAKKy8vPT09LSBsbHZtL0JpbmFyeUZvcm1hdC9FTEYuaCAtIEVMRiBjb25zdGFudHMgYW5kIHN0cnVjdHVyZXMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgY29udGFpbnMgY29tbW9uLCBub24tcHJvY2Vzc29yLXNwZWNpZmljIGRhdGEgc3RydWN0dXJlcyBhbmQKKy8vIGNvbnN0YW50cyBmb3IgdGhlIEVMRiBmaWxlIGZvcm1hdC4KKy8vCisvLyBUaGUgZGV0YWlscyBvZiB0aGUgRUxGMzIgYml0cyBpbiB0aGlzIGZpbGUgYXJlIGxhcmdlbHkgYmFzZWQgb24gdGhlIFRvb2wKKy8vIEludGVyZmFjZSBTdGFuZGFyZCAoVElTKSBFeGVjdXRhYmxlIGFuZCBMaW5raW5nIEZvcm1hdCAoRUxGKSBTcGVjaWZpY2F0aW9uCisvLyBWZXJzaW9uIDEuMiwgTWF5IDE5OTUuIFRoZSBFTEY2NCBzdHVmZiBpcyBiYXNlZCBvbiBFTEYtNjQgT2JqZWN0IEZpbGUgRm9ybWF0CisvLyBWZXJzaW9uIDEuNSwgRHJhZnQgMiwgTWF5IDE5OTggYXMgd2VsbCBhcyBPcGVuQlNEIGhlYWRlciBmaWxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQklOQVJZRk9STUFUX0VMRl9ICisjZGVmaW5lIExMVk1fQklOQVJZRk9STUFUX0VMRl9ICisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBFTEYgeworCit1c2luZyBFbGYzMl9BZGRyID0gdWludDMyX3Q7IC8vIFByb2dyYW0gYWRkcmVzcwordXNpbmcgRWxmMzJfT2ZmID0gdWludDMyX3Q7ICAvLyBGaWxlIG9mZnNldAordXNpbmcgRWxmMzJfSGFsZiA9IHVpbnQxNl90OwordXNpbmcgRWxmMzJfV29yZCA9IHVpbnQzMl90OwordXNpbmcgRWxmMzJfU3dvcmQgPSBpbnQzMl90OworCit1c2luZyBFbGY2NF9BZGRyID0gdWludDY0X3Q7Cit1c2luZyBFbGY2NF9PZmYgPSB1aW50NjRfdDsKK3VzaW5nIEVsZjY0X0hhbGYgPSB1aW50MTZfdDsKK3VzaW5nIEVsZjY0X1dvcmQgPSB1aW50MzJfdDsKK3VzaW5nIEVsZjY0X1N3b3JkID0gaW50MzJfdDsKK3VzaW5nIEVsZjY0X1h3b3JkID0gdWludDY0X3Q7Cit1c2luZyBFbGY2NF9TeHdvcmQgPSBpbnQ2NF90OworCisvLyBPYmplY3QgZmlsZSBtYWdpYyBzdHJpbmcuCitzdGF0aWMgY29uc3QgY2hhciBFbGZNYWdpY1tdID0gezB4N2YsICdFJywgJ0wnLCAnRicsICdcMCd9OworCisvLyBlX2lkZW50IHNpemUgYW5kIGluZGljZXMuCitlbnVtIHsKKyAgRUlfTUFHMCA9IDAsICAgICAgIC8vIEZpbGUgaWRlbnRpZmljYXRpb24gaW5kZXguCisgIEVJX01BRzEgPSAxLCAgICAgICAvLyBGaWxlIGlkZW50aWZpY2F0aW9uIGluZGV4LgorICBFSV9NQUcyID0gMiwgICAgICAgLy8gRmlsZSBpZGVudGlmaWNhdGlvbiBpbmRleC4KKyAgRUlfTUFHMyA9IDMsICAgICAgIC8vIEZpbGUgaWRlbnRpZmljYXRpb24gaW5kZXguCisgIEVJX0NMQVNTID0gNCwgICAgICAvLyBGaWxlIGNsYXNzLgorICBFSV9EQVRBID0gNSwgICAgICAgLy8gRGF0YSBlbmNvZGluZy4KKyAgRUlfVkVSU0lPTiA9IDYsICAgIC8vIEZpbGUgdmVyc2lvbi4KKyAgRUlfT1NBQkkgPSA3LCAgICAgIC8vIE9TL0FCSSBpZGVudGlmaWNhdGlvbi4KKyAgRUlfQUJJVkVSU0lPTiA9IDgsIC8vIEFCSSB2ZXJzaW9uLgorICBFSV9QQUQgPSA5LCAgICAgICAgLy8gU3RhcnQgb2YgcGFkZGluZyBieXRlcy4KKyAgRUlfTklERU5UID0gMTYgICAgIC8vIE51bWJlciBvZiBieXRlcyBpbiBlX2lkZW50LgorfTsKKworc3RydWN0IEVsZjMyX0VoZHIgeworICB1bnNpZ25lZCBjaGFyIGVfaWRlbnRbRUlfTklERU5UXTsgLy8gRUxGIElkZW50aWZpY2F0aW9uIGJ5dGVzCisgIEVsZjMyX0hhbGYgZV90eXBlOyAgICAgICAgICAgICAgICAvLyBUeXBlIG9mIGZpbGUgKHNlZSBFVF8qIGJlbG93KQorICBFbGYzMl9IYWxmIGVfbWFjaGluZTsgICAvLyBSZXF1aXJlZCBhcmNoaXRlY3R1cmUgZm9yIHRoaXMgZmlsZSAoc2VlIEVNXyopCisgIEVsZjMyX1dvcmQgZV92ZXJzaW9uOyAgIC8vIE11c3QgYmUgZXF1YWwgdG8gMQorICBFbGYzMl9BZGRyIGVfZW50cnk7ICAgICAvLyBBZGRyZXNzIHRvIGp1bXAgdG8gaW4gb3JkZXIgdG8gc3RhcnQgcHJvZ3JhbQorICBFbGYzMl9PZmYgZV9waG9mZjsgICAgICAvLyBQcm9ncmFtIGhlYWRlciB0YWJsZSdzIGZpbGUgb2Zmc2V0LCBpbiBieXRlcworICBFbGYzMl9PZmYgZV9zaG9mZjsgICAgICAvLyBTZWN0aW9uIGhlYWRlciB0YWJsZSdzIGZpbGUgb2Zmc2V0LCBpbiBieXRlcworICBFbGYzMl9Xb3JkIGVfZmxhZ3M7ICAgICAvLyBQcm9jZXNzb3Itc3BlY2lmaWMgZmxhZ3MKKyAgRWxmMzJfSGFsZiBlX2Voc2l6ZTsgICAgLy8gU2l6ZSBvZiBFTEYgaGVhZGVyLCBpbiBieXRlcworICBFbGYzMl9IYWxmIGVfcGhlbnRzaXplOyAvLyBTaXplIG9mIGFuIGVudHJ5IGluIHRoZSBwcm9ncmFtIGhlYWRlciB0YWJsZQorICBFbGYzMl9IYWxmIGVfcGhudW07ICAgICAvLyBOdW1iZXIgb2YgZW50cmllcyBpbiB0aGUgcHJvZ3JhbSBoZWFkZXIgdGFibGUKKyAgRWxmMzJfSGFsZiBlX3NoZW50c2l6ZTsgLy8gU2l6ZSBvZiBhbiBlbnRyeSBpbiB0aGUgc2VjdGlvbiBoZWFkZXIgdGFibGUKKyAgRWxmMzJfSGFsZiBlX3NobnVtOyAgICAgLy8gTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlCisgIEVsZjMyX0hhbGYgZV9zaHN0cm5keDsgIC8vIFNlY3QgaGRyIHRhYmxlIGluZGV4IG9mIHNlY3QgbmFtZSBzdHJpbmcgdGFibGUKKworICBib29sIGNoZWNrTWFnaWMoKSBjb25zdCB7CisgICAgcmV0dXJuIChtZW1jbXAoZV9pZGVudCwgRWxmTWFnaWMsIHN0cmxlbihFbGZNYWdpYykpKSA9PSAwOworICB9CisKKyAgdW5zaWduZWQgY2hhciBnZXRGaWxlQ2xhc3MoKSBjb25zdCB7IHJldHVybiBlX2lkZW50W0VJX0NMQVNTXTsgfQorICB1bnNpZ25lZCBjaGFyIGdldERhdGFFbmNvZGluZygpIGNvbnN0IHsgcmV0dXJuIGVfaWRlbnRbRUlfREFUQV07IH0KK307CisKKy8vIDY0LWJpdCBFTEYgaGVhZGVyLiBGaWVsZHMgYXJlIHRoZSBzYW1lIGFzIGZvciBFTEYzMiwgYnV0IHdpdGggZGlmZmVyZW50CisvLyB0eXBlcyAoc2VlIGFib3ZlKS4KK3N0cnVjdCBFbGY2NF9FaGRyIHsKKyAgdW5zaWduZWQgY2hhciBlX2lkZW50W0VJX05JREVOVF07CisgIEVsZjY0X0hhbGYgZV90eXBlOworICBFbGY2NF9IYWxmIGVfbWFjaGluZTsKKyAgRWxmNjRfV29yZCBlX3ZlcnNpb247CisgIEVsZjY0X0FkZHIgZV9lbnRyeTsKKyAgRWxmNjRfT2ZmIGVfcGhvZmY7CisgIEVsZjY0X09mZiBlX3Nob2ZmOworICBFbGY2NF9Xb3JkIGVfZmxhZ3M7CisgIEVsZjY0X0hhbGYgZV9laHNpemU7CisgIEVsZjY0X0hhbGYgZV9waGVudHNpemU7CisgIEVsZjY0X0hhbGYgZV9waG51bTsKKyAgRWxmNjRfSGFsZiBlX3NoZW50c2l6ZTsKKyAgRWxmNjRfSGFsZiBlX3NobnVtOworICBFbGY2NF9IYWxmIGVfc2hzdHJuZHg7CisKKyAgYm9vbCBjaGVja01hZ2ljKCkgY29uc3QgeworICAgIHJldHVybiAobWVtY21wKGVfaWRlbnQsIEVsZk1hZ2ljLCBzdHJsZW4oRWxmTWFnaWMpKSkgPT0gMDsKKyAgfQorCisgIHVuc2lnbmVkIGNoYXIgZ2V0RmlsZUNsYXNzKCkgY29uc3QgeyByZXR1cm4gZV9pZGVudFtFSV9DTEFTU107IH0KKyAgdW5zaWduZWQgY2hhciBnZXREYXRhRW5jb2RpbmcoKSBjb25zdCB7IHJldHVybiBlX2lkZW50W0VJX0RBVEFdOyB9Cit9OworCisvLyBGaWxlIHR5cGVzCitlbnVtIHsKKyAgRVRfTk9ORSA9IDAsICAgICAgICAvLyBObyBmaWxlIHR5cGUKKyAgRVRfUkVMID0gMSwgICAgICAgICAvLyBSZWxvY2F0YWJsZSBmaWxlCisgIEVUX0VYRUMgPSAyLCAgICAgICAgLy8gRXhlY3V0YWJsZSBmaWxlCisgIEVUX0RZTiA9IDMsICAgICAgICAgLy8gU2hhcmVkIG9iamVjdCBmaWxlCisgIEVUX0NPUkUgPSA0LCAgICAgICAgLy8gQ29yZSBmaWxlCisgIEVUX0xPUFJPQyA9IDB4ZmYwMCwgLy8gQmVnaW5uaW5nIG9mIHByb2Nlc3Nvci1zcGVjaWZpYyBjb2RlcworICBFVF9ISVBST0MgPSAweGZmZmYgIC8vIFByb2Nlc3Nvci1zcGVjaWZpYworfTsKKworLy8gVmVyc2lvbmluZworZW51bSB7IEVWX05PTkUgPSAwLCBFVl9DVVJSRU5UID0gMSB9OworCisvLyBNYWNoaW5lIGFyY2hpdGVjdHVyZXMKKy8vIFNlZSBjdXJyZW50IHJlZ2lzdGVyZWQgRUxGIG1hY2hpbmUgYXJjaGl0ZWN0dXJlcyBhdDoKKy8vICAgIGh0dHA6Ly93d3cudXhzZ2xvYmFsLmNvbS9kZXZlbG9wZXJzL2dhYmkvbGF0ZXN0L2NoNC5laGVhZGVyLmh0bWwKK2VudW0geworICBFTV9OT05FID0gMCwgICAgICAgICAgIC8vIE5vIG1hY2hpbmUKKyAgRU1fTTMyID0gMSwgICAgICAgICAgICAvLyBBVCZUIFdFIDMyMTAwCisgIEVNX1NQQVJDID0gMiwgICAgICAgICAgLy8gU1BBUkMKKyAgRU1fMzg2ID0gMywgICAgICAgICAgICAvLyBJbnRlbCAzODYKKyAgRU1fNjhLID0gNCwgICAgICAgICAgICAvLyBNb3Rvcm9sYSA2ODAwMAorICBFTV84OEsgPSA1LCAgICAgICAgICAgIC8vIE1vdG9yb2xhIDg4MDAwCisgIEVNX0lBTUNVID0gNiwgICAgICAgICAgLy8gSW50ZWwgTUNVCisgIEVNXzg2MCA9IDcsICAgICAgICAgICAgLy8gSW50ZWwgODA4NjAKKyAgRU1fTUlQUyA9IDgsICAgICAgICAgICAvLyBNSVBTIFIzMDAwCisgIEVNX1MzNzAgPSA5LCAgICAgICAgICAgLy8gSUJNIFN5c3RlbS8zNzAKKyAgRU1fTUlQU19SUzNfTEUgPSAxMCwgICAvLyBNSVBTIFJTMzAwMCBMaXR0bGUtZW5kaWFuCisgIEVNX1BBUklTQyA9IDE1LCAgICAgICAgLy8gSGV3bGV0dC1QYWNrYXJkIFBBLVJJU0MKKyAgRU1fVlBQNTAwID0gMTcsICAgICAgICAvLyBGdWppdHN1IFZQUDUwMAorICBFTV9TUEFSQzMyUExVUyA9IDE4LCAgIC8vIEVuaGFuY2VkIGluc3RydWN0aW9uIHNldCBTUEFSQworICBFTV85NjAgPSAxOSwgICAgICAgICAgIC8vIEludGVsIDgwOTYwCisgIEVNX1BQQyA9IDIwLCAgICAgICAgICAgLy8gUG93ZXJQQworICBFTV9QUEM2NCA9IDIxLCAgICAgICAgIC8vIFBvd2VyUEM2NAorICBFTV9TMzkwID0gMjIsICAgICAgICAgIC8vIElCTSBTeXN0ZW0vMzkwCisgIEVNX1NQVSA9IDIzLCAgICAgICAgICAgLy8gSUJNIFNQVS9TUEMKKyAgRU1fVjgwMCA9IDM2LCAgICAgICAgICAvLyBORUMgVjgwMAorICBFTV9GUjIwID0gMzcsICAgICAgICAgIC8vIEZ1aml0c3UgRlIyMAorICBFTV9SSDMyID0gMzgsICAgICAgICAgIC8vIFRSVyBSSC0zMgorICBFTV9SQ0UgPSAzOSwgICAgICAgICAgIC8vIE1vdG9yb2xhIFJDRQorICBFTV9BUk0gPSA0MCwgICAgICAgICAgIC8vIEFSTQorICBFTV9BTFBIQSA9IDQxLCAgICAgICAgIC8vIERFQyBBbHBoYQorICBFTV9TSCA9IDQyLCAgICAgICAgICAgIC8vIEhpdGFjaGkgU0gKKyAgRU1fU1BBUkNWOSA9IDQzLCAgICAgICAvLyBTUEFSQyBWOQorICBFTV9UUklDT1JFID0gNDQsICAgICAgIC8vIFNpZW1lbnMgVHJpQ29yZQorICBFTV9BUkMgPSA0NSwgICAgICAgICAgIC8vIEFyZ29uYXV0IFJJU0MgQ29yZQorICBFTV9IOF8zMDAgPSA0NiwgICAgICAgIC8vIEhpdGFjaGkgSDgvMzAwCisgIEVNX0g4XzMwMEggPSA0NywgICAgICAgLy8gSGl0YWNoaSBIOC8zMDBICisgIEVNX0g4UyA9IDQ4LCAgICAgICAgICAgLy8gSGl0YWNoaSBIOFMKKyAgRU1fSDhfNTAwID0gNDksICAgICAgICAvLyBIaXRhY2hpIEg4LzUwMAorICBFTV9JQV82NCA9IDUwLCAgICAgICAgIC8vIEludGVsIElBLTY0IHByb2Nlc3NvciBhcmNoaXRlY3R1cmUKKyAgRU1fTUlQU19YID0gNTEsICAgICAgICAvLyBTdGFuZm9yZCBNSVBTLVgKKyAgRU1fQ09MREZJUkUgPSA1MiwgICAgICAvLyBNb3Rvcm9sYSBDb2xkRmlyZQorICBFTV82OEhDMTIgPSA1MywgICAgICAgIC8vIE1vdG9yb2xhIE02OEhDMTIKKyAgRU1fTU1BID0gNTQsICAgICAgICAgICAvLyBGdWppdHN1IE1NQSBNdWx0aW1lZGlhIEFjY2VsZXJhdG9yCisgIEVNX1BDUCA9IDU1LCAgICAgICAgICAgLy8gU2llbWVucyBQQ1AKKyAgRU1fTkNQVSA9IDU2LCAgICAgICAgICAvLyBTb255IG5DUFUgZW1iZWRkZWQgUklTQyBwcm9jZXNzb3IKKyAgRU1fTkRSMSA9IDU3LCAgICAgICAgICAvLyBEZW5zbyBORFIxIG1pY3JvcHJvY2Vzc29yCisgIEVNX1NUQVJDT1JFID0gNTgsICAgICAgLy8gTW90b3JvbGEgU3RhcipDb3JlIHByb2Nlc3NvcgorICBFTV9NRTE2ID0gNTksICAgICAgICAgIC8vIFRveW90YSBNRTE2IHByb2Nlc3NvcgorICBFTV9TVDEwMCA9IDYwLCAgICAgICAgIC8vIFNUTWljcm9lbGVjdHJvbmljcyBTVDEwMCBwcm9jZXNzb3IKKyAgRU1fVElOWUogPSA2MSwgICAgICAgICAvLyBBZHZhbmNlZCBMb2dpYyBDb3JwLiBUaW55SiBlbWJlZGRlZCBwcm9jZXNzb3IgZmFtaWx5CisgIEVNX1g4Nl82NCA9IDYyLCAgICAgICAgLy8gQU1EIHg4Ni02NCBhcmNoaXRlY3R1cmUKKyAgRU1fUERTUCA9IDYzLCAgICAgICAgICAvLyBTb255IERTUCBQcm9jZXNzb3IKKyAgRU1fUERQMTAgPSA2NCwgICAgICAgICAvLyBEaWdpdGFsIEVxdWlwbWVudCBDb3JwLiBQRFAtMTAKKyAgRU1fUERQMTEgPSA2NSwgICAgICAgICAvLyBEaWdpdGFsIEVxdWlwbWVudCBDb3JwLiBQRFAtMTEKKyAgRU1fRlg2NiA9IDY2LCAgICAgICAgICAvLyBTaWVtZW5zIEZYNjYgbWljcm9jb250cm9sbGVyCisgIEVNX1NUOVBMVVMgPSA2NywgICAgICAgLy8gU1RNaWNyb2VsZWN0cm9uaWNzIFNUOSsgOC8xNiBiaXQgbWljcm9jb250cm9sbGVyCisgIEVNX1NUNyA9IDY4LCAgICAgICAgICAgLy8gU1RNaWNyb2VsZWN0cm9uaWNzIFNUNyA4LWJpdCBtaWNyb2NvbnRyb2xsZXIKKyAgRU1fNjhIQzE2ID0gNjksICAgICAgICAvLyBNb3Rvcm9sYSBNQzY4SEMxNiBNaWNyb2NvbnRyb2xsZXIKKyAgRU1fNjhIQzExID0gNzAsICAgICAgICAvLyBNb3Rvcm9sYSBNQzY4SEMxMSBNaWNyb2NvbnRyb2xsZXIKKyAgRU1fNjhIQzA4ID0gNzEsICAgICAgICAvLyBNb3Rvcm9sYSBNQzY4SEMwOCBNaWNyb2NvbnRyb2xsZXIKKyAgRU1fNjhIQzA1ID0gNzIsICAgICAgICAvLyBNb3Rvcm9sYSBNQzY4SEMwNSBNaWNyb2NvbnRyb2xsZXIKKyAgRU1fU1ZYID0gNzMsICAgICAgICAgICAvLyBTaWxpY29uIEdyYXBoaWNzIFNWeAorICBFTV9TVDE5ID0gNzQsICAgICAgICAgIC8vIFNUTWljcm9lbGVjdHJvbmljcyBTVDE5IDgtYml0IG1pY3JvY29udHJvbGxlcgorICBFTV9WQVggPSA3NSwgICAgICAgICAgIC8vIERpZ2l0YWwgVkFYCisgIEVNX0NSSVMgPSA3NiwgICAgICAgICAgLy8gQXhpcyBDb21tdW5pY2F0aW9ucyAzMi1iaXQgZW1iZWRkZWQgcHJvY2Vzc29yCisgIEVNX0pBVkVMSU4gPSA3NywgICAgICAgLy8gSW5maW5lb24gVGVjaG5vbG9naWVzIDMyLWJpdCBlbWJlZGRlZCBwcm9jZXNzb3IKKyAgRU1fRklSRVBBVEggPSA3OCwgICAgICAvLyBFbGVtZW50IDE0IDY0LWJpdCBEU1AgUHJvY2Vzc29yCisgIEVNX1pTUCA9IDc5LCAgICAgICAgICAgLy8gTFNJIExvZ2ljIDE2LWJpdCBEU1AgUHJvY2Vzc29yCisgIEVNX01NSVggPSA4MCwgICAgICAgICAgLy8gRG9uYWxkIEtudXRoJ3MgZWR1Y2F0aW9uYWwgNjQtYml0IHByb2Nlc3NvcgorICBFTV9IVUFOWSA9IDgxLCAgICAgICAgIC8vIEhhcnZhcmQgVW5pdmVyc2l0eSBtYWNoaW5lLWluZGVwZW5kZW50IG9iamVjdCBmaWxlcworICBFTV9QUklTTSA9IDgyLCAgICAgICAgIC8vIFNpVGVyYSBQcmlzbQorICBFTV9BVlIgPSA4MywgICAgICAgICAgIC8vIEF0bWVsIEFWUiA4LWJpdCBtaWNyb2NvbnRyb2xsZXIKKyAgRU1fRlIzMCA9IDg0LCAgICAgICAgICAvLyBGdWppdHN1IEZSMzAKKyAgRU1fRDEwViA9IDg1LCAgICAgICAgICAvLyBNaXRzdWJpc2hpIEQxMFYKKyAgRU1fRDMwViA9IDg2LCAgICAgICAgICAvLyBNaXRzdWJpc2hpIEQzMFYKKyAgRU1fVjg1MCA9IDg3LCAgICAgICAgICAvLyBORUMgdjg1MAorICBFTV9NMzJSID0gODgsICAgICAgICAgIC8vIE1pdHN1YmlzaGkgTTMyUgorICBFTV9NTjEwMzAwID0gODksICAgICAgIC8vIE1hdHN1c2hpdGEgTU4xMDMwMAorICBFTV9NTjEwMjAwID0gOTAsICAgICAgIC8vIE1hdHN1c2hpdGEgTU4xMDIwMAorICBFTV9QSiA9IDkxLCAgICAgICAgICAgIC8vIHBpY29KYXZhCisgIEVNX09QRU5SSVNDID0gOTIsICAgICAgLy8gT3BlblJJU0MgMzItYml0IGVtYmVkZGVkIHByb2Nlc3NvcgorICBFTV9BUkNfQ09NUEFDVCA9IDkzLCAgIC8vIEFSQyBJbnRlcm5hdGlvbmFsIEFSQ29tcGFjdCBwcm9jZXNzb3IgKG9sZAorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNwZWxsaW5nL3N5bm9ueW06IEVNX0FSQ19BNSkKKyAgRU1fWFRFTlNBID0gOTQsICAgICAgICAvLyBUZW5zaWxpY2EgWHRlbnNhIEFyY2hpdGVjdHVyZQorICBFTV9WSURFT0NPUkUgPSA5NSwgICAgIC8vIEFscGhhbW9zYWljIFZpZGVvQ29yZSBwcm9jZXNzb3IKKyAgRU1fVE1NX0dQUCA9IDk2LCAgICAgICAvLyBUaG9tcHNvbiBNdWx0aW1lZGlhIEdlbmVyYWwgUHVycG9zZSBQcm9jZXNzb3IKKyAgRU1fTlMzMksgPSA5NywgICAgICAgICAvLyBOYXRpb25hbCBTZW1pY29uZHVjdG9yIDMyMDAwIHNlcmllcworICBFTV9UUEMgPSA5OCwgICAgICAgICAgIC8vIFRlbm9yIE5ldHdvcmsgVFBDIHByb2Nlc3NvcgorICBFTV9TTlAxSyA9IDk5LCAgICAgICAgIC8vIFRyZWJpYSBTTlAgMTAwMCBwcm9jZXNzb3IKKyAgRU1fU1QyMDAgPSAxMDAsICAgICAgICAvLyBTVE1pY3JvZWxlY3Ryb25pY3MgKHd3dy5zdC5jb20pIFNUMjAwCisgIEVNX0lQMksgPSAxMDEsICAgICAgICAgLy8gVWJpY29tIElQMnh4eCBtaWNyb2NvbnRyb2xsZXIgZmFtaWx5CisgIEVNX01BWCA9IDEwMiwgICAgICAgICAgLy8gTUFYIFByb2Nlc3NvcgorICBFTV9DUiA9IDEwMywgICAgICAgICAgIC8vIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgQ29tcGFjdFJJU0MgbWljcm9wcm9jZXNzb3IKKyAgRU1fRjJNQzE2ID0gMTA0LCAgICAgICAvLyBGdWppdHN1IEYyTUMxNgorICBFTV9NU1A0MzAgPSAxMDUsICAgICAgIC8vIFRleGFzIEluc3RydW1lbnRzIGVtYmVkZGVkIG1pY3JvY29udHJvbGxlciBtc3A0MzAKKyAgRU1fQkxBQ0tGSU4gPSAxMDYsICAgICAvLyBBbmFsb2cgRGV2aWNlcyBCbGFja2ZpbiAoRFNQKSBwcm9jZXNzb3IKKyAgRU1fU0VfQzMzID0gMTA3LCAgICAgICAvLyBTMUMzMyBGYW1pbHkgb2YgU2Vpa28gRXBzb24gcHJvY2Vzc29ycworICBFTV9TRVAgPSAxMDgsICAgICAgICAgIC8vIFNoYXJwIGVtYmVkZGVkIG1pY3JvcHJvY2Vzc29yCisgIEVNX0FSQ0EgPSAxMDksICAgICAgICAgLy8gQXJjYSBSSVNDIE1pY3JvcHJvY2Vzc29yCisgIEVNX1VOSUNPUkUgPSAxMTAsICAgICAgLy8gTWljcm9wcm9jZXNzb3Igc2VyaWVzIGZyb20gUEtVLVVuaXR5IEx0ZC4gYW5kIE1QUkMKKyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBQZWtpbmcgVW5pdmVyc2l0eQorICBFTV9FWENFU1MgPSAxMTEsICAgICAgIC8vIGVYY2VzczogMTYvMzIvNjQtYml0IGNvbmZpZ3VyYWJsZSBlbWJlZGRlZCBDUFUKKyAgRU1fRFhQID0gMTEyLCAgICAgICAgICAvLyBJY2VyYSBTZW1pY29uZHVjdG9yIEluYy4gRGVlcCBFeGVjdXRpb24gUHJvY2Vzc29yCisgIEVNX0FMVEVSQV9OSU9TMiA9IDExMywgLy8gQWx0ZXJhIE5pb3MgSUkgc29mdC1jb3JlIHByb2Nlc3NvcgorICBFTV9DUlggPSAxMTQsICAgICAgICAgIC8vIE5hdGlvbmFsIFNlbWljb25kdWN0b3IgQ29tcGFjdFJJU0MgQ1JYCisgIEVNX1hHQVRFID0gMTE1LCAgICAgICAgLy8gTW90b3JvbGEgWEdBVEUgZW1iZWRkZWQgcHJvY2Vzc29yCisgIEVNX0MxNjYgPSAxMTYsICAgICAgICAgLy8gSW5maW5lb24gQzE2eC9YQzE2eCBwcm9jZXNzb3IKKyAgRU1fTTE2QyA9IDExNywgICAgICAgICAvLyBSZW5lc2FzIE0xNkMgc2VyaWVzIG1pY3JvcHJvY2Vzc29ycworICBFTV9EU1BJQzMwRiA9IDExOCwgICAgIC8vIE1pY3JvY2hpcCBUZWNobm9sb2d5IGRzUElDMzBGIERpZ2l0YWwgU2lnbmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udHJvbGxlcgorICBFTV9DRSA9IDExOSwgICAgICAgICAgIC8vIEZyZWVzY2FsZSBDb21tdW5pY2F0aW9uIEVuZ2luZSBSSVNDIGNvcmUKKyAgRU1fTTMyQyA9IDEyMCwgICAgICAgICAvLyBSZW5lc2FzIE0zMkMgc2VyaWVzIG1pY3JvcHJvY2Vzc29ycworICBFTV9UU0szMDAwID0gMTMxLCAgICAgIC8vIEFsdGl1bSBUU0szMDAwIGNvcmUKKyAgRU1fUlMwOCA9IDEzMiwgICAgICAgICAvLyBGcmVlc2NhbGUgUlMwOCBlbWJlZGRlZCBwcm9jZXNzb3IKKyAgRU1fU0hBUkMgPSAxMzMsICAgICAgICAvLyBBbmFsb2cgRGV2aWNlcyBTSEFSQyBmYW1pbHkgb2YgMzItYml0IERTUAorICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NvcnMKKyAgRU1fRUNPRzIgPSAxMzQsICAgICAgICAvLyBDeWFuIFRlY2hub2xvZ3kgZUNPRzIgbWljcm9wcm9jZXNzb3IKKyAgRU1fU0NPUkU3ID0gMTM1LCAgICAgICAvLyBTdW5wbHVzIFMrY29yZTcgUklTQyBwcm9jZXNzb3IKKyAgRU1fRFNQMjQgPSAxMzYsICAgICAgICAvLyBOZXcgSmFwYW4gUmFkaW8gKE5KUikgMjQtYml0IERTUCBQcm9jZXNzb3IKKyAgRU1fVklERU9DT1JFMyA9IDEzNywgICAvLyBCcm9hZGNvbSBWaWRlb0NvcmUgSUlJIHByb2Nlc3NvcgorICBFTV9MQVRUSUNFTUlDTzMyID0gMTM4LCAvLyBSSVNDIHByb2Nlc3NvciBmb3IgTGF0dGljZSBGUEdBIGFyY2hpdGVjdHVyZQorICBFTV9TRV9DMTcgPSAxMzksICAgICAgICAvLyBTZWlrbyBFcHNvbiBDMTcgZmFtaWx5CisgIEVNX1RJX0M2MDAwID0gMTQwLCAgICAgIC8vIFRoZSBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDNjAwMCBEU1AgZmFtaWx5CisgIEVNX1RJX0MyMDAwID0gMTQxLCAgICAgIC8vIFRoZSBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDMjAwMCBEU1AgZmFtaWx5CisgIEVNX1RJX0M1NTAwID0gMTQyLCAgICAgIC8vIFRoZSBUZXhhcyBJbnN0cnVtZW50cyBUTVMzMjBDNTV4IERTUCBmYW1pbHkKKyAgRU1fTU1EU1BfUExVUyA9IDE2MCwgICAgLy8gU1RNaWNyb2VsZWN0cm9uaWNzIDY0Yml0IFZMSVcgRGF0YSBTaWduYWwgUHJvY2Vzc29yCisgIEVNX0NZUFJFU1NfTThDID0gMTYxLCAgIC8vIEN5cHJlc3MgTThDIG1pY3JvcHJvY2Vzc29yCisgIEVNX1IzMkMgPSAxNjIsICAgICAgICAgIC8vIFJlbmVzYXMgUjMyQyBzZXJpZXMgbWljcm9wcm9jZXNzb3JzCisgIEVNX1RSSU1FRElBID0gMTYzLCAgICAgIC8vIE5YUCBTZW1pY29uZHVjdG9ycyBUcmlNZWRpYSBhcmNoaXRlY3R1cmUgZmFtaWx5CisgIEVNX0hFWEFHT04gPSAxNjQsICAgICAgIC8vIFF1YWxjb21tIEhleGFnb24gcHJvY2Vzc29yCisgIEVNXzgwNTEgPSAxNjUsICAgICAgICAgIC8vIEludGVsIDgwNTEgYW5kIHZhcmlhbnRzCisgIEVNX1NUWFA3WCA9IDE2NiwgICAgICAgIC8vIFNUTWljcm9lbGVjdHJvbmljcyBTVHhQN3ggZmFtaWx5IG9mIGNvbmZpZ3VyYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmQgZXh0ZW5zaWJsZSBSSVNDIHByb2Nlc3NvcnMKKyAgRU1fTkRTMzIgPSAxNjcsICAgICAgICAgLy8gQW5kZXMgVGVjaG5vbG9neSBjb21wYWN0IGNvZGUgc2l6ZSBlbWJlZGRlZCBSSVNDCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHByb2Nlc3NvciBmYW1pbHkKKyAgRU1fRUNPRzEgPSAxNjgsICAgICAgICAgLy8gQ3lhbiBUZWNobm9sb2d5IGVDT0cxWCBmYW1pbHkKKyAgRU1fRUNPRzFYID0gMTY4LCAgICAgICAgLy8gQ3lhbiBUZWNobm9sb2d5IGVDT0cxWCBmYW1pbHkKKyAgRU1fTUFYUTMwID0gMTY5LCAgICAgICAgLy8gRGFsbGFzIFNlbWljb25kdWN0b3IgTUFYUTMwIENvcmUgTWljcm8tY29udHJvbGxlcnMKKyAgRU1fWElNTzE2ID0gMTcwLCAgICAgICAgLy8gTmV3IEphcGFuIFJhZGlvIChOSlIpIDE2LWJpdCBEU1AgUHJvY2Vzc29yCisgIEVNX01BTklLID0gMTcxLCAgICAgICAgIC8vIE0yMDAwIFJlY29uZmlndXJhYmxlIFJJU0MgTWljcm9wcm9jZXNzb3IKKyAgRU1fQ1JBWU5WMiA9IDE3MiwgICAgICAgLy8gQ3JheSBJbmMuIE5WMiB2ZWN0b3IgYXJjaGl0ZWN0dXJlCisgIEVNX1JYID0gMTczLCAgICAgICAgICAgIC8vIFJlbmVzYXMgUlggZmFtaWx5CisgIEVNX01FVEFHID0gMTc0LCAgICAgICAgIC8vIEltYWdpbmF0aW9uIFRlY2hub2xvZ2llcyBNRVRBIHByb2Nlc3NvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmNoaXRlY3R1cmUKKyAgRU1fTUNTVF9FTEJSVVMgPSAxNzUsICAgLy8gTUNTVCBFbGJydXMgZ2VuZXJhbCBwdXJwb3NlIGhhcmR3YXJlIGFyY2hpdGVjdHVyZQorICBFTV9FQ09HMTYgPSAxNzYsICAgICAgICAvLyBDeWFuIFRlY2hub2xvZ3kgZUNPRzE2IGZhbWlseQorICBFTV9DUjE2ID0gMTc3LCAgICAgICAgICAvLyBOYXRpb25hbCBTZW1pY29uZHVjdG9yIENvbXBhY3RSSVNDIENSMTYgMTYtYml0CisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1pY3JvcHJvY2Vzc29yCisgIEVNX0VUUFUgPSAxNzgsICAgICAgICAgIC8vIEZyZWVzY2FsZSBFeHRlbmRlZCBUaW1lIFByb2Nlc3NpbmcgVW5pdAorICBFTV9TTEU5WCA9IDE3OSwgICAgICAgICAvLyBJbmZpbmVvbiBUZWNobm9sb2dpZXMgU0xFOVggY29yZQorICBFTV9MMTBNID0gMTgwLCAgICAgICAgICAvLyBJbnRlbCBMMTBNCisgIEVNX0sxME0gPSAxODEsICAgICAgICAgIC8vIEludGVsIEsxME0KKyAgRU1fQUFSQ0g2NCA9IDE4MywgICAgICAgLy8gQVJNIEFBcmNoNjQKKyAgRU1fQVZSMzIgPSAxODUsICAgICAgICAgLy8gQXRtZWwgQ29ycG9yYXRpb24gMzItYml0IG1pY3JvcHJvY2Vzc29yIGZhbWlseQorICBFTV9TVE04ID0gMTg2LCAgICAgICAgICAvLyBTVE1pY3JvZWxldHJvbmljcyBTVE04IDgtYml0IG1pY3JvY29udHJvbGxlcgorICBFTV9USUxFNjQgPSAxODcsICAgICAgICAvLyBUaWxlcmEgVElMRTY0IG11bHRpY29yZSBhcmNoaXRlY3R1cmUgZmFtaWx5CisgIEVNX1RJTEVQUk8gPSAxODgsICAgICAgIC8vIFRpbGVyYSBUSUxFUHJvIG11bHRpY29yZSBhcmNoaXRlY3R1cmUgZmFtaWx5CisgIEVNX0NVREEgPSAxOTAsICAgICAgICAgIC8vIE5WSURJQSBDVURBIGFyY2hpdGVjdHVyZQorICBFTV9USUxFR1ggPSAxOTEsICAgICAgICAvLyBUaWxlcmEgVElMRS1HeCBtdWx0aWNvcmUgYXJjaGl0ZWN0dXJlIGZhbWlseQorICBFTV9DTE9VRFNISUVMRCA9IDE5MiwgICAvLyBDbG91ZFNoaWVsZCBhcmNoaXRlY3R1cmUgZmFtaWx5CisgIEVNX0NPUkVBXzFTVCA9IDE5MywgICAgIC8vIEtJUE8tS0FJU1QgQ29yZS1BIDFzdCBnZW5lcmF0aW9uIHByb2Nlc3NvciBmYW1pbHkKKyAgRU1fQ09SRUFfMk5EID0gMTk0LCAgICAgLy8gS0lQTy1LQUlTVCBDb3JlLUEgMm5kIGdlbmVyYXRpb24gcHJvY2Vzc29yIGZhbWlseQorICBFTV9BUkNfQ09NUEFDVDIgPSAxOTUsICAvLyBTeW5vcHN5cyBBUkNvbXBhY3QgVjIKKyAgRU1fT1BFTjggPSAxOTYsICAgICAgICAgLy8gT3BlbjggOC1iaXQgUklTQyBzb2Z0IHByb2Nlc3NvciBjb3JlCisgIEVNX1JMNzggPSAxOTcsICAgICAgICAgIC8vIFJlbmVzYXMgUkw3OCBmYW1pbHkKKyAgRU1fVklERU9DT1JFNSA9IDE5OCwgICAgLy8gQnJvYWRjb20gVmlkZW9Db3JlIFYgcHJvY2Vzc29yCisgIEVNXzc4S09SID0gMTk5LCAgICAgICAgIC8vIFJlbmVzYXMgNzhLT1IgZmFtaWx5CisgIEVNXzU2ODAwRVggPSAyMDAsICAgICAgIC8vIEZyZWVzY2FsZSA1NjgwMEVYIERpZ2l0YWwgU2lnbmFsIENvbnRyb2xsZXIgKERTQykKKyAgRU1fQkExID0gMjAxLCAgICAgICAgICAgLy8gQmV5b25kIEJBMSBDUFUgYXJjaGl0ZWN0dXJlCisgIEVNX0JBMiA9IDIwMiwgICAgICAgICAgIC8vIEJleW9uZCBCQTIgQ1BVIGFyY2hpdGVjdHVyZQorICBFTV9YQ09SRSA9IDIwMywgICAgICAgICAvLyBYTU9TIHhDT1JFIHByb2Nlc3NvciBmYW1pbHkKKyAgRU1fTUNIUF9QSUMgPSAyMDQsICAgICAgLy8gTWljcm9jaGlwIDgtYml0IFBJQyhyKSBmYW1pbHkKKyAgRU1fSU5URUwyMDUgPSAyMDUsICAgICAgLy8gUmVzZXJ2ZWQgYnkgSW50ZWwKKyAgRU1fSU5URUwyMDYgPSAyMDYsICAgICAgLy8gUmVzZXJ2ZWQgYnkgSW50ZWwKKyAgRU1fSU5URUwyMDcgPSAyMDcsICAgICAgLy8gUmVzZXJ2ZWQgYnkgSW50ZWwKKyAgRU1fSU5URUwyMDggPSAyMDgsICAgICAgLy8gUmVzZXJ2ZWQgYnkgSW50ZWwKKyAgRU1fSU5URUwyMDkgPSAyMDksICAgICAgLy8gUmVzZXJ2ZWQgYnkgSW50ZWwKKyAgRU1fS00zMiA9IDIxMCwgICAgICAgICAgLy8gS00yMTEgS00zMiAzMi1iaXQgcHJvY2Vzc29yCisgIEVNX0tNWDMyID0gMjExLCAgICAgICAgIC8vIEtNMjExIEtNWDMyIDMyLWJpdCBwcm9jZXNzb3IKKyAgRU1fS01YMTYgPSAyMTIsICAgICAgICAgLy8gS00yMTEgS01YMTYgMTYtYml0IHByb2Nlc3NvcgorICBFTV9LTVg4ID0gMjEzLCAgICAgICAgICAvLyBLTTIxMSBLTVg4IDgtYml0IHByb2Nlc3NvcgorICBFTV9LVkFSQyA9IDIxNCwgICAgICAgICAvLyBLTTIxMSBLVkFSQyBwcm9jZXNzb3IKKyAgRU1fQ0RQID0gMjE1LCAgICAgICAgICAgLy8gUGFuZXZlIENEUCBhcmNoaXRlY3R1cmUgZmFtaWx5CisgIEVNX0NPR0UgPSAyMTYsICAgICAgICAgIC8vIENvZ25pdGl2ZSBTbWFydCBNZW1vcnkgUHJvY2Vzc29yCisgIEVNX0NPT0wgPSAyMTcsICAgICAgICAgIC8vIGlDZWxlcm8gQ29vbEVuZ2luZQorICBFTV9OT1JDID0gMjE4LCAgICAgICAgICAvLyBOYW5vcmFkaW8gT3B0aW1pemVkIFJJU0MKKyAgRU1fQ1NSX0tBTElNQkEgPSAyMTksICAgLy8gQ1NSIEthbGltYmEgYXJjaGl0ZWN0dXJlIGZhbWlseQorICBFTV9BTURHUFUgPSAyMjQsICAgICAgICAvLyBBTUQgR1BVIGFyY2hpdGVjdHVyZQorICBFTV9SSVNDViA9IDI0MywgICAgICAgICAvLyBSSVNDLVYKKyAgRU1fTEFOQUkgPSAyNDQsICAgICAgICAgLy8gTGFuYWkgMzItYml0IHByb2Nlc3NvcgorICBFTV9CUEYgPSAyNDcsICAgICAgICAgICAvLyBMaW51eCBrZXJuZWwgYnBmIHZpcnR1YWwgbWFjaGluZQorCisgIC8vIEEgcmVxdWVzdCBoYXMgYmVlbiBtYWRlIHRvIHRoZSBtYWludGFpbmVyIG9mIHRoZSBvZmZpY2lhbCByZWdpc3RyeSBmb3IKKyAgLy8gc3VjaCBudW1iZXJzIGZvciBhbiBvZmZpY2lhbCB2YWx1ZSBmb3IgV2ViQXNzZW1ibHkuIEFzIHNvb24gYXMgb25lIGlzCisgIC8vIGFsbG9jYXRlZCwgdGhpcyBlbnVtIHdpbGwgYmUgdXBkYXRlZCB0byB1c2UgaXQuCisgIEVNX1dFQkFTU0VNQkxZID0gMHg0MTU3LCAvLyBXZWJBc3NlbWJseSBhcmNoaXRlY3R1cmUKK307CisKKy8vIE9iamVjdCBmaWxlIGNsYXNzZXMuCitlbnVtIHsKKyAgRUxGQ0xBU1NOT05FID0gMCwKKyAgRUxGQ0xBU1MzMiA9IDEsIC8vIDMyLWJpdCBvYmplY3QgZmlsZQorICBFTEZDTEFTUzY0ID0gMiAgLy8gNjQtYml0IG9iamVjdCBmaWxlCit9OworCisvLyBPYmplY3QgZmlsZSBieXRlIG9yZGVyaW5ncy4KK2VudW0geworICBFTEZEQVRBTk9ORSA9IDAsIC8vIEludmFsaWQgZGF0YSBlbmNvZGluZy4KKyAgRUxGREFUQTJMU0IgPSAxLCAvLyBMaXR0bGUtZW5kaWFuIG9iamVjdCBmaWxlCisgIEVMRkRBVEEyTVNCID0gMiAgLy8gQmlnLWVuZGlhbiBvYmplY3QgZmlsZQorfTsKKworLy8gT1MgQUJJIGlkZW50aWZpY2F0aW9uLgorZW51bSB7CisgIEVMRk9TQUJJX05PTkUgPSAwLCAgICAgICAgICAgLy8gVU5JWCBTeXN0ZW0gViBBQkkKKyAgRUxGT1NBQklfSFBVWCA9IDEsICAgICAgICAgICAvLyBIUC1VWCBvcGVyYXRpbmcgc3lzdGVtCisgIEVMRk9TQUJJX05FVEJTRCA9IDIsICAgICAgICAgLy8gTmV0QlNECisgIEVMRk9TQUJJX0dOVSA9IDMsICAgICAgICAgICAgLy8gR05VL0xpbnV4CisgIEVMRk9TQUJJX0xJTlVYID0gMywgICAgICAgICAgLy8gSGlzdG9yaWNhbCBhbGlhcyBmb3IgRUxGT1NBQklfR05VLgorICBFTEZPU0FCSV9IVVJEID0gNCwgICAgICAgICAgIC8vIEdOVS9IdXJkCisgIEVMRk9TQUJJX1NPTEFSSVMgPSA2LCAgICAgICAgLy8gU29sYXJpcworICBFTEZPU0FCSV9BSVggPSA3LCAgICAgICAgICAgIC8vIEFJWAorICBFTEZPU0FCSV9JUklYID0gOCwgICAgICAgICAgIC8vIElSSVgKKyAgRUxGT1NBQklfRlJFRUJTRCA9IDksICAgICAgICAvLyBGcmVlQlNECisgIEVMRk9TQUJJX1RSVTY0ID0gMTAsICAgICAgICAgLy8gVFJVNjQgVU5JWAorICBFTEZPU0FCSV9NT0RFU1RPID0gMTEsICAgICAgIC8vIE5vdmVsbCBNb2Rlc3RvCisgIEVMRk9TQUJJX09QRU5CU0QgPSAxMiwgICAgICAgLy8gT3BlbkJTRAorICBFTEZPU0FCSV9PUEVOVk1TID0gMTMsICAgICAgIC8vIE9wZW5WTVMKKyAgRUxGT1NBQklfTlNLID0gMTQsICAgICAgICAgICAvLyBIZXdsZXR0LVBhY2thcmQgTm9uLVN0b3AgS2VybmVsCisgIEVMRk9TQUJJX0FST1MgPSAxNSwgICAgICAgICAgLy8gQVJPUworICBFTEZPU0FCSV9GRU5JWE9TID0gMTYsICAgICAgIC8vIEZlbml4T1MKKyAgRUxGT1NBQklfQ0xPVURBQkkgPSAxNywgICAgICAvLyBOdXhpIENsb3VkQUJJCisgIEVMRk9TQUJJX0ZJUlNUX0FSQ0ggPSA2NCwgICAgLy8gRmlyc3QgYXJjaGl0ZWN0dXJlLXNwZWNpZmljIE9TIEFCSQorICBFTEZPU0FCSV9BTURHUFVfSFNBID0gNjQsICAgIC8vIEFNRCBIU0EgcnVudGltZQorICBFTEZPU0FCSV9BTURHUFVfUEFMID0gNjUsICAgIC8vIEFNRCBQQUwgcnVudGltZQorICBFTEZPU0FCSV9BTURHUFVfTUVTQTNEID0gNjYsIC8vIEFNRCBHQ04gR1BVcyAoR0ZYNispIGZvciBNRVNBIHJ1bnRpbWUKKyAgRUxGT1NBQklfQVJNID0gOTcsICAgICAgICAgICAvLyBBUk0KKyAgRUxGT1NBQklfQzYwMDBfRUxGQUJJID0gNjQsICAvLyBCYXJlLW1ldGFsIFRNUzMyMEM2MDAwCisgIEVMRk9TQUJJX0M2MDAwX0xJTlVYID0gNjUsICAgLy8gTGludXggVE1TMzIwQzYwMDAKKyAgRUxGT1NBQklfU1RBTkRBTE9ORSA9IDI1NSwgICAvLyBTdGFuZGFsb25lIChlbWJlZGRlZCkgYXBwbGljYXRpb24KKyAgRUxGT1NBQklfTEFTVF9BUkNIID0gMjU1ICAgICAvLyBMYXN0IEFyY2hpdGVjdHVyZS1zcGVjaWZpYyBPUyBBQkkKK307CisKKyNkZWZpbmUgRUxGX1JFTE9DKG5hbWUsIHZhbHVlKSBuYW1lID0gdmFsdWUsCisKKy8vIFg4Nl82NCByZWxvY2F0aW9ucy4KK2VudW0geworI2luY2x1ZGUgIkVMRlJlbG9jcy94ODZfNjQuZGVmIgorfTsKKworLy8gaTM4NiByZWxvY2F0aW9ucy4KK2VudW0geworI2luY2x1ZGUgIkVMRlJlbG9jcy9pMzg2LmRlZiIKK307CisKKy8vIEVMRiBSZWxvY2F0aW9uIHR5cGVzIGZvciBQUEMzMgorZW51bSB7CisjaW5jbHVkZSAiRUxGUmVsb2NzL1Bvd2VyUEMuZGVmIgorfTsKKworLy8gU3BlY2lmaWMgZV9mbGFncyBmb3IgUFBDNjQKK2VudW0geworICAvLyBlX2ZsYWdzIGJpdHMgc3BlY2lmeWluZyBBQkk6CisgIC8vIDEgZm9yIG9yaWdpbmFsIEFCSSB1c2luZyBmdW5jdGlvbiBkZXNjcmlwdG9ycywKKyAgLy8gMiBmb3IgcmV2aXNlZCBBQkkgd2l0aG91dCBmdW5jdGlvbiBkZXNjcmlwdG9ycywKKyAgLy8gMCBmb3IgdW5zcGVjaWZpZWQgb3Igbm90IHVzaW5nIGFueSBmZWF0dXJlcyBhZmZlY3RlZCBieSB0aGUgZGlmZmVyZW5jZXMuCisgIEVGX1BQQzY0X0FCSSA9IDMKK307CisKKy8vIFNwZWNpYWwgdmFsdWVzIGZvciB0aGUgc3Rfb3RoZXIgZmllbGQgaW4gdGhlIHN5bWJvbCB0YWJsZSBlbnRyeSBmb3IgUFBDNjQuCitlbnVtIHsKKyAgU1RPX1BQQzY0X0xPQ0FMX0JJVCA9IDUsCisgIFNUT19QUEM2NF9MT0NBTF9NQVNLID0gKDcgPDwgU1RPX1BQQzY0X0xPQ0FMX0JJVCkKK307CitzdGF0aWMgaW5saW5lIGludDY0X3QgZGVjb2RlUFBDNjRMb2NhbEVudHJ5T2Zmc2V0KHVuc2lnbmVkIE90aGVyKSB7CisgIHVuc2lnbmVkIFZhbCA9IChPdGhlciAmIFNUT19QUEM2NF9MT0NBTF9NQVNLKSA+PiBTVE9fUFBDNjRfTE9DQUxfQklUOworICByZXR1cm4gKCgxIDw8IFZhbCkgPj4gMikgPDwgMjsKK30KK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgZW5jb2RlUFBDNjRMb2NhbEVudHJ5T2Zmc2V0KGludDY0X3QgT2Zmc2V0KSB7CisgIHVuc2lnbmVkIFZhbCA9CisgICAgICAoT2Zmc2V0ID49IDQgKiA0ID8gKE9mZnNldCA+PSA4ICogNCA/IChPZmZzZXQgPj0gMTYgKiA0ID8gNiA6IDUpIDogNCkKKyAgICAgICAgICAgICAgICAgICAgICAgOiAoT2Zmc2V0ID49IDIgKiA0ID8gMyA6IChPZmZzZXQgPj0gMSAqIDQgPyAyIDogMCkpKTsKKyAgcmV0dXJuIFZhbCA8PCBTVE9fUFBDNjRfTE9DQUxfQklUOworfQorCisvLyBFTEYgUmVsb2NhdGlvbiB0eXBlcyBmb3IgUFBDNjQKK2VudW0geworI2luY2x1ZGUgIkVMRlJlbG9jcy9Qb3dlclBDNjQuZGVmIgorfTsKKworLy8gRUxGIFJlbG9jYXRpb24gdHlwZXMgZm9yIEFBcmNoNjQKK2VudW0geworI2luY2x1ZGUgIkVMRlJlbG9jcy9BQXJjaDY0LmRlZiIKK307CisKKy8vIEFSTSBTcGVjaWZpYyBlX2ZsYWdzCitlbnVtIDogdW5zaWduZWQgeworICBFRl9BUk1fU09GVF9GTE9BVCA9IDB4MDAwMDAyMDBVLAorICBFRl9BUk1fVkZQX0ZMT0FUID0gMHgwMDAwMDQwMFUsCisgIEVGX0FSTV9FQUJJX1VOS05PV04gPSAweDAwMDAwMDAwVSwKKyAgRUZfQVJNX0VBQklfVkVSMSA9IDB4MDEwMDAwMDBVLAorICBFRl9BUk1fRUFCSV9WRVIyID0gMHgwMjAwMDAwMFUsCisgIEVGX0FSTV9FQUJJX1ZFUjMgPSAweDAzMDAwMDAwVSwKKyAgRUZfQVJNX0VBQklfVkVSNCA9IDB4MDQwMDAwMDBVLAorICBFRl9BUk1fRUFCSV9WRVI1ID0gMHgwNTAwMDAwMFUsCisgIEVGX0FSTV9FQUJJTUFTSyA9IDB4RkYwMDAwMDBVCit9OworCisvLyBFTEYgUmVsb2NhdGlvbiB0eXBlcyBmb3IgQVJNCitlbnVtIHsKKyNpbmNsdWRlICJFTEZSZWxvY3MvQVJNLmRlZiIKK307CisKKy8vIEFSQyBTcGVjaWZpYyBlX2ZsYWdzCitlbnVtIDogdW5zaWduZWQgeworICBFRl9BUkNfTUFDSF9NU0sgPSAweDAwMDAwMGZmLAorICBFRl9BUkNfT1NBQklfTVNLID0gMHgwMDAwMGYwMCwKKyAgRV9BUkNfTUFDSF9BUkM2MDAgPSAweDAwMDAwMDAyLAorICBFX0FSQ19NQUNIX0FSQzYwMSA9IDB4MDAwMDAwMDQsCisgIEVfQVJDX01BQ0hfQVJDNzAwID0gMHgwMDAwMDAwMywKKyAgRUZfQVJDX0NQVV9BUkNWMkVNID0gMHgwMDAwMDAwNSwKKyAgRUZfQVJDX0NQVV9BUkNWMkhTID0gMHgwMDAwMDAwNiwKKyAgRV9BUkNfT1NBQklfT1JJRyA9IDB4MDAwMDAwMDAsCisgIEVfQVJDX09TQUJJX1YyID0gMHgwMDAwMDIwMCwKKyAgRV9BUkNfT1NBQklfVjMgPSAweDAwMDAwMzAwLAorICBFX0FSQ19PU0FCSV9WNCA9IDB4MDAwMDA0MDAsCisgIEVGX0FSQ19QSUMgPSAweDAwMDAwMTAwCit9OworCisvLyBFTEYgUmVsb2NhdGlvbiB0eXBlcyBmb3IgQVJDCitlbnVtIHsKKyNpbmNsdWRlICJFTEZSZWxvY3MvQVJDLmRlZiIKK307CisKKy8vIEFWUiBzcGVjaWZpYyBlX2ZsYWdzCitlbnVtIDogdW5zaWduZWQgeworICBFRl9BVlJfQVJDSF9BVlIxID0gMSwKKyAgRUZfQVZSX0FSQ0hfQVZSMiA9IDIsCisgIEVGX0FWUl9BUkNIX0FWUjI1ID0gMjUsCisgIEVGX0FWUl9BUkNIX0FWUjMgPSAzLAorICBFRl9BVlJfQVJDSF9BVlIzMSA9IDMxLAorICBFRl9BVlJfQVJDSF9BVlIzNSA9IDM1LAorICBFRl9BVlJfQVJDSF9BVlI0ID0gNCwKKyAgRUZfQVZSX0FSQ0hfQVZSNSA9IDUsCisgIEVGX0FWUl9BUkNIX0FWUjUxID0gNTEsCisgIEVGX0FWUl9BUkNIX0FWUjYgPSA2LAorICBFRl9BVlJfQVJDSF9BVlJUSU5ZID0gMTAwLAorICBFRl9BVlJfQVJDSF9YTUVHQTEgPSAxMDEsCisgIEVGX0FWUl9BUkNIX1hNRUdBMiA9IDEwMiwKKyAgRUZfQVZSX0FSQ0hfWE1FR0EzID0gMTAzLAorICBFRl9BVlJfQVJDSF9YTUVHQTQgPSAxMDQsCisgIEVGX0FWUl9BUkNIX1hNRUdBNSA9IDEwNSwKKyAgRUZfQVZSX0FSQ0hfWE1FR0E2ID0gMTA2LAorICBFRl9BVlJfQVJDSF9YTUVHQTcgPSAxMDcKK307CisKKy8vIEVMRiBSZWxvY2F0aW9uIHR5cGVzIGZvciBBVlIKK2VudW0geworI2luY2x1ZGUgIkVMRlJlbG9jcy9BVlIuZGVmIgorfTsKKworLy8gTWlwcyBTcGVjaWZpYyBlX2ZsYWdzCitlbnVtIDogdW5zaWduZWQgeworICBFRl9NSVBTX05PUkVPUkRFUiA9IDB4MDAwMDAwMDEsIC8vIERvbid0IHJlb3JkZXIgaW5zdHJ1Y3Rpb25zCisgIEVGX01JUFNfUElDID0gMHgwMDAwMDAwMiwgICAgICAgLy8gUG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZQorICBFRl9NSVBTX0NQSUMgPSAweDAwMDAwMDA0LCAgICAgIC8vIENhbGwgb2JqZWN0IHdpdGggUG9zaXRpb24gaW5kZXBlbmRlbnQgY29kZQorICBFRl9NSVBTX0FCSTIgPSAweDAwMDAwMDIwLCAgICAgIC8vIEZpbGUgdXNlcyBOMzIgQUJJCisgIEVGX01JUFNfMzJCSVRNT0RFID0gMHgwMDAwMDEwMCwgLy8gQ29kZSBjb21waWxlZCBmb3IgYSA2NC1iaXQgbWFjaGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIDMyLWJpdCBtb2RlCisgIEVGX01JUFNfRlA2NCA9IDB4MDAwMDAyMDAsICAgICAgLy8gQ29kZSBjb21waWxlZCBmb3IgYSAzMi1iaXQgbWFjaGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB1c2VzIDY0LWJpdCBGUCByZWdpc3RlcnMKKyAgRUZfTUlQU19OQU4yMDA4ID0gMHgwMDAwMDQwMCwgICAvLyBVc2VzIElFRSA3NTQtMjAwOCBOYU4gZW5jb2RpbmcKKworICAvLyBBQkkgZmxhZ3MKKyAgRUZfTUlQU19BQklfTzMyID0gMHgwMDAwMTAwMCwgLy8gVGhpcyBmaWxlIGZvbGxvd3MgdGhlIGZpcnN0IE1JUFMgMzIgYml0IEFCSQorICBFRl9NSVBTX0FCSV9PNjQgPSAweDAwMDAyMDAwLCAvLyBPMzIgQUJJIGV4dGVuZGVkIGZvciA2NC1iaXQgYXJjaGl0ZWN0dXJlLgorICBFRl9NSVBTX0FCSV9FQUJJMzIgPSAweDAwMDAzMDAwLCAvLyBFQUJJIGluIDMyIGJpdCBtb2RlLgorICBFRl9NSVBTX0FCSV9FQUJJNjQgPSAweDAwMDA0MDAwLCAvLyBFQUJJIGluIDY0IGJpdCBtb2RlLgorICBFRl9NSVBTX0FCSSA9IDB4MDAwMGYwMDAsICAgICAgICAvLyBNYXNrIGZvciBzZWxlY3RpbmcgRUZfTUlQU19BQklfIHZhcmlhbnQuCisKKyAgLy8gTUlQUyBtYWNoaW5lIHZhcmlhbnQKKyAgRUZfTUlQU19NQUNIX05PTkUgPSAweDAwMDAwMDAwLCAgICAvLyBBIHN0YW5kYXJkIE1JUFMgaW1wbGVtZW50YXRpb24uCisgIEVGX01JUFNfTUFDSF8zOTAwID0gMHgwMDgxMDAwMCwgICAgLy8gVG9zaGliYSBSMzkwMAorICBFRl9NSVBTX01BQ0hfNDAxMCA9IDB4MDA4MjAwMDAsICAgIC8vIExTSSBSNDAxMAorICBFRl9NSVBTX01BQ0hfNDEwMCA9IDB4MDA4MzAwMDAsICAgIC8vIE5FQyBWUjQxMDAKKyAgRUZfTUlQU19NQUNIXzQ2NTAgPSAweDAwODUwMDAwLCAgICAvLyBNSVBTIFI0NjUwCisgIEVGX01JUFNfTUFDSF80MTIwID0gMHgwMDg3MDAwMCwgICAgLy8gTkVDIFZSNDEyMAorICBFRl9NSVBTX01BQ0hfNDExMSA9IDB4MDA4ODAwMDAsICAgIC8vIE5FQyBWUjQxMTEvVlI0MTgxCisgIEVGX01JUFNfTUFDSF9TQjEgPSAweDAwOGEwMDAwLCAgICAgLy8gQnJvYWRjb20gU0ItMQorICBFRl9NSVBTX01BQ0hfT0NURU9OID0gMHgwMDhiMDAwMCwgIC8vIENhdml1bSBOZXR3b3JrcyBPY3Rlb24KKyAgRUZfTUlQU19NQUNIX1hMUiA9IDB4MDA4YzAwMDAsICAgICAvLyBSTUkgWGxyCisgIEVGX01JUFNfTUFDSF9PQ1RFT04yID0gMHgwMDhkMDAwMCwgLy8gQ2F2aXVtIE5ldHdvcmtzIE9jdGVvbjIKKyAgRUZfTUlQU19NQUNIX09DVEVPTjMgPSAweDAwOGUwMDAwLCAvLyBDYXZpdW0gTmV0d29ya3MgT2N0ZW9uMworICBFRl9NSVBTX01BQ0hfNTQwMCA9IDB4MDA5MTAwMDAsICAgIC8vIE5FQyBWUjU0MDAKKyAgRUZfTUlQU19NQUNIXzU5MDAgPSAweDAwOTIwMDAwLCAgICAvLyBNSVBTIFI1OTAwCisgIEVGX01JUFNfTUFDSF81NTAwID0gMHgwMDk4MDAwMCwgICAgLy8gTkVDIFZSNTUwMAorICBFRl9NSVBTX01BQ0hfOTAwMCA9IDB4MDA5OTAwMDAsICAgIC8vIFVua25vd24KKyAgRUZfTUlQU19NQUNIX0xTMkUgPSAweDAwYTAwMDAwLCAgICAvLyBTVCBNaWNyb2VsZWN0cm9uaWNzIExvb25nc29uIDJFCisgIEVGX01JUFNfTUFDSF9MUzJGID0gMHgwMGExMDAwMCwgICAgLy8gU1QgTWljcm9lbGVjdHJvbmljcyBMb29uZ3NvbiAyRgorICBFRl9NSVBTX01BQ0hfTFMzQSA9IDB4MDBhMjAwMDAsICAgIC8vIExvb25nc29uIDNBCisgIEVGX01JUFNfTUFDSCA9IDB4MDBmZjAwMDAsICAgICAgICAgLy8gRUZfTUlQU19NQUNIX3h4eCBzZWxlY3Rpb24gbWFzaworCisgIC8vIEFSQ0hfQVNFCisgIEVGX01JUFNfTUlDUk9NSVBTID0gMHgwMjAwMDAwMCwgICAgIC8vIG1pY3JvTUlQUworICBFRl9NSVBTX0FSQ0hfQVNFX00xNiA9IDB4MDQwMDAwMDAsICAvLyBIYXMgTWlwcy0xNiBJU0EgZXh0ZW5zaW9ucworICBFRl9NSVBTX0FSQ0hfQVNFX01ETVggPSAweDA4MDAwMDAwLCAvLyBIYXMgTURNWCBtdWx0aW1lZGlhIGV4dGVuc2lvbnMKKyAgRUZfTUlQU19BUkNIX0FTRSA9IDB4MGYwMDAwMDAsICAgICAgLy8gTWFzayBmb3IgRUZfTUlQU19BUkNIX0FTRV94eHggZmxhZ3MKKworICAvLyBBUkNICisgIEVGX01JUFNfQVJDSF8xID0gMHgwMDAwMDAwMCwgICAgLy8gTUlQUzEgaW5zdHJ1Y3Rpb24gc2V0CisgIEVGX01JUFNfQVJDSF8yID0gMHgxMDAwMDAwMCwgICAgLy8gTUlQUzIgaW5zdHJ1Y3Rpb24gc2V0CisgIEVGX01JUFNfQVJDSF8zID0gMHgyMDAwMDAwMCwgICAgLy8gTUlQUzMgaW5zdHJ1Y3Rpb24gc2V0CisgIEVGX01JUFNfQVJDSF80ID0gMHgzMDAwMDAwMCwgICAgLy8gTUlQUzQgaW5zdHJ1Y3Rpb24gc2V0CisgIEVGX01JUFNfQVJDSF81ID0gMHg0MDAwMDAwMCwgICAgLy8gTUlQUzUgaW5zdHJ1Y3Rpb24gc2V0CisgIEVGX01JUFNfQVJDSF8zMiA9IDB4NTAwMDAwMDAsICAgLy8gTUlQUzMyIGluc3RydWN0aW9uIHNldCBwZXIgbGludXggbm90IGVsZi5oCisgIEVGX01JUFNfQVJDSF82NCA9IDB4NjAwMDAwMDAsICAgLy8gTUlQUzY0IGluc3RydWN0aW9uIHNldCBwZXIgbGludXggbm90IGVsZi5oCisgIEVGX01JUFNfQVJDSF8zMlIyID0gMHg3MDAwMDAwMCwgLy8gbWlwczMycjIsIG1pcHMzMnIzLCBtaXBzMzJyNQorICBFRl9NSVBTX0FSQ0hfNjRSMiA9IDB4ODAwMDAwMDAsIC8vIG1pcHM2NHIyLCBtaXBzNjRyMywgbWlwczY0cjUKKyAgRUZfTUlQU19BUkNIXzMyUjYgPSAweDkwMDAwMDAwLCAvLyBtaXBzMzJyNgorICBFRl9NSVBTX0FSQ0hfNjRSNiA9IDB4YTAwMDAwMDAsIC8vIG1pcHM2NHI2CisgIEVGX01JUFNfQVJDSCA9IDB4ZjAwMDAwMDAgICAgICAgLy8gTWFzayBmb3IgYXBwbHlpbmcgRUZfTUlQU19BUkNIXyB2YXJpYW50Cit9OworCisvLyBFTEYgUmVsb2NhdGlvbiB0eXBlcyBmb3IgTWlwcworZW51bSB7CisjaW5jbHVkZSAiRUxGUmVsb2NzL01pcHMuZGVmIgorfTsKKworLy8gU3BlY2lhbCB2YWx1ZXMgZm9yIHRoZSBzdF9vdGhlciBmaWVsZCBpbiB0aGUgc3ltYm9sIHRhYmxlIGVudHJ5IGZvciBNSVBTLgorZW51bSB7CisgIFNUT19NSVBTX09QVElPTkFMID0gMHgwNCwgIC8vIFN5bWJvbCB3aG9zZSBkZWZpbml0aW9uIGlzIG9wdGlvbmFsCisgIFNUT19NSVBTX1BMVCA9IDB4MDgsICAgICAgIC8vIFBMVCBlbnRyeSByZWxhdGVkIGR5bmFtaWMgdGFibGUgcmVjb3JkCisgIFNUT19NSVBTX1BJQyA9IDB4MjAsICAgICAgIC8vIFBJQyBmdW5jIGluIGFuIG9iamVjdCBtaXhlcyBQSUMvbm9uLVBJQworICBTVE9fTUlQU19NSUNST01JUFMgPSAweDgwLCAvLyBNSVBTIFNwZWNpZmljIElTQSBmb3IgTWljcm9NaXBzCisgIFNUT19NSVBTX01JUFMxNiA9IDB4ZjAgICAgIC8vIE1JUFMgU3BlY2lmaWMgSVNBIGZvciBNaXBzMTYKK307CisKKy8vIC5NSVBTLm9wdGlvbnMgc2VjdGlvbiBkZXNjcmlwdG9yIGtpbmRzCitlbnVtIHsKKyAgT0RLX05VTEwgPSAwLCAgICAgICAvLyBVbmRlZmluZWQKKyAgT0RLX1JFR0lORk8gPSAxLCAgICAvLyBSZWdpc3RlciB1c2FnZSBpbmZvcm1hdGlvbgorICBPREtfRVhDRVBUSU9OUyA9IDIsIC8vIEV4Y2VwdGlvbiBwcm9jZXNzaW5nIG9wdGlvbnMKKyAgT0RLX1BBRCA9IDMsICAgICAgICAvLyBTZWN0aW9uIHBhZGRpbmcgb3B0aW9ucworICBPREtfSFdQQVRDSCA9IDQsICAgIC8vIEhhcmR3YXJlIHBhdGNoZXMgYXBwbGllZAorICBPREtfRklMTCA9IDUsICAgICAgIC8vIExpbmtlciBmaWxsIHZhbHVlCisgIE9ES19UQUdTID0gNiwgICAgICAgLy8gU3BhY2UgZm9yIHRvb2wgaWRlbnRpZmljYXRpb24KKyAgT0RLX0hXQU5EID0gNywgICAgICAvLyBIYXJkd2FyZSBBTkQgcGF0Y2hlcyBhcHBsaWVkCisgIE9ES19IV09SID0gOCwgICAgICAgLy8gSGFyZHdhcmUgT1IgcGF0Y2hlcyBhcHBsaWVkCisgIE9ES19HUF9HUk9VUCA9IDksICAgLy8gR1AgZ3JvdXAgdG8gdXNlIGZvciB0ZXh0L2RhdGEgc2VjdGlvbnMKKyAgT0RLX0lERU5UID0gMTAsICAgICAvLyBJRCBpbmZvcm1hdGlvbgorICBPREtfUEFHRVNJWkUgPSAxMSAgIC8vIFBhZ2Ugc2l6ZSBpbmZvcm1hdGlvbgorfTsKKworLy8gSGV4YWdvbi1zcGVjaWZpYyBlX2ZsYWdzCitlbnVtIHsKKyAgLy8gT2JqZWN0IHByb2Nlc3NvciB2ZXJzaW9uIGZsYWdzLCBiaXRzWzExOjBdCisgIEVGX0hFWEFHT05fTUFDSF9WMiA9IDB4MDAwMDAwMDEsICAvLyBIZXhhZ29uIFYyCisgIEVGX0hFWEFHT05fTUFDSF9WMyA9IDB4MDAwMDAwMDIsICAvLyBIZXhhZ29uIFYzCisgIEVGX0hFWEFHT05fTUFDSF9WNCA9IDB4MDAwMDAwMDMsICAvLyBIZXhhZ29uIFY0CisgIEVGX0hFWEFHT05fTUFDSF9WNSA9IDB4MDAwMDAwMDQsICAvLyBIZXhhZ29uIFY1CisgIEVGX0hFWEFHT05fTUFDSF9WNTUgPSAweDAwMDAwMDA1LCAvLyBIZXhhZ29uIFY1NQorICBFRl9IRVhBR09OX01BQ0hfVjYwID0gMHgwMDAwMDA2MCwgLy8gSGV4YWdvbiBWNjAKKyAgRUZfSEVYQUdPTl9NQUNIX1Y2MiA9IDB4MDAwMDAwNjIsIC8vIEhleGFnb24gVjYyCisgIEVGX0hFWEFHT05fTUFDSF9WNjUgPSAweDAwMDAwMDY1LCAvLyBIZXhhZ29uIFY2NQorCisgIC8vIEhpZ2hlc3QgSVNBIHZlcnNpb24gZmxhZ3MKKyAgRUZfSEVYQUdPTl9JU0FfTUFDSCA9IDB4MDAwMDAwMDAsIC8vIFNhbWUgYXMgc3BlY2lmaWVkIGluIGJpdHNbMTE6MF0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mIGVfZmxhZ3MKKyAgRUZfSEVYQUdPTl9JU0FfVjIgPSAweDAwMDAwMDEwLCAgIC8vIEhleGFnb24gVjIgSVNBCisgIEVGX0hFWEFHT05fSVNBX1YzID0gMHgwMDAwMDAyMCwgICAvLyBIZXhhZ29uIFYzIElTQQorICBFRl9IRVhBR09OX0lTQV9WNCA9IDB4MDAwMDAwMzAsICAgLy8gSGV4YWdvbiBWNCBJU0EKKyAgRUZfSEVYQUdPTl9JU0FfVjUgPSAweDAwMDAwMDQwLCAgIC8vIEhleGFnb24gVjUgSVNBCisgIEVGX0hFWEFHT05fSVNBX1Y1NSA9IDB4MDAwMDAwNTAsICAvLyBIZXhhZ29uIFY1NSBJU0EKKyAgRUZfSEVYQUdPTl9JU0FfVjYwID0gMHgwMDAwMDA2MCwgIC8vIEhleGFnb24gVjYwIElTQQorICBFRl9IRVhBR09OX0lTQV9WNjIgPSAweDAwMDAwMDYyLCAgLy8gSGV4YWdvbiBWNjIgSVNBCisgIEVGX0hFWEFHT05fSVNBX1Y2NSA9IDB4MDAwMDAwNjUsICAvLyBIZXhhZ29uIFY2NSBJU0EKK307CisKKy8vIEhleGFnb24tc3BlY2lmaWMgc2VjdGlvbiBpbmRleGVzIGZvciBjb21tb24gc21hbGwgZGF0YQorZW51bSB7CisgIFNITl9IRVhBR09OX1NDT01NT04gPSAweGZmMDAsICAgLy8gT3RoZXIgYWNjZXNzIHNpemVzCisgIFNITl9IRVhBR09OX1NDT01NT05fMSA9IDB4ZmYwMSwgLy8gQnl0ZS1zaXplZCBhY2Nlc3MKKyAgU0hOX0hFWEFHT05fU0NPTU1PTl8yID0gMHhmZjAyLCAvLyBIYWxmLXdvcmQtc2l6ZWQgYWNjZXNzCisgIFNITl9IRVhBR09OX1NDT01NT05fNCA9IDB4ZmYwMywgLy8gV29yZC1zaXplZCBhY2Nlc3MKKyAgU0hOX0hFWEFHT05fU0NPTU1PTl84ID0gMHhmZjA0ICAvLyBEb3VibGUtd29yZC1zaXplIGFjY2VzcworfTsKKworLy8gRUxGIFJlbG9jYXRpb24gdHlwZXMgZm9yIEhleGFnb24KK2VudW0geworI2luY2x1ZGUgIkVMRlJlbG9jcy9IZXhhZ29uLmRlZiIKK307CisKKy8vIEVMRiBSZWxvY2F0aW9uIHR5cGUgZm9yIExhbmFpLgorZW51bSB7CisjaW5jbHVkZSAiRUxGUmVsb2NzL0xhbmFpLmRlZiIKK307CisKKy8vIFJJU0NWIFNwZWNpZmljIGVfZmxhZ3MKK2VudW0gOiB1bnNpZ25lZCB7CisgIEVGX1JJU0NWX1JWQyA9IDB4MDAwMSwKKyAgRUZfUklTQ1ZfRkxPQVRfQUJJID0gMHgwMDA2LAorICBFRl9SSVNDVl9GTE9BVF9BQklfU09GVCA9IDB4MDAwMCwKKyAgRUZfUklTQ1ZfRkxPQVRfQUJJX1NJTkdMRSA9IDB4MDAwMiwKKyAgRUZfUklTQ1ZfRkxPQVRfQUJJX0RPVUJMRSA9IDB4MDAwNCwKKyAgRUZfUklTQ1ZfRkxPQVRfQUJJX1FVQUQgPSAweDAwMDYsCisgIEVGX1JJU0NWX1JWRSA9IDB4MDAwOAorfTsKKworLy8gRUxGIFJlbG9jYXRpb24gdHlwZXMgZm9yIFJJU0MtVgorZW51bSB7CisjaW5jbHVkZSAiRUxGUmVsb2NzL1JJU0NWLmRlZiIKK307CisKKy8vIEVMRiBSZWxvY2F0aW9uIHR5cGVzIGZvciBTMzkwL3pTZXJpZXMKK2VudW0geworI2luY2x1ZGUgIkVMRlJlbG9jcy9TeXN0ZW1aLmRlZiIKK307CisKKy8vIEVMRiBSZWxvY2F0aW9uIHR5cGUgZm9yIFNwYXJjLgorZW51bSB7CisjaW5jbHVkZSAiRUxGUmVsb2NzL1NwYXJjLmRlZiIKK307CisKKy8vIEVMRiBSZWxvY2F0aW9uIHR5cGVzIGZvciBXZWJBc3NlbWJseQorZW51bSB7CisjaW5jbHVkZSAiRUxGUmVsb2NzL1dlYkFzc2VtYmx5LmRlZiIKK307CisKKy8vIEFNREdQVSBzcGVjaWZpYyBlX2ZsYWdzLgorZW51bSA6IHVuc2lnbmVkIHsKKyAgLy8gUHJvY2Vzc29yIHNlbGVjdGlvbiBtYXNrIGZvciBFRl9BTURHUFVfTUFDSF8qIHZhbHVlcy4KKyAgRUZfQU1ER1BVX01BQ0ggPSAweDBmZiwKKworICAvLyBOb3Qgc3BlY2lmaWVkIHByb2Nlc3Nvci4KKyAgRUZfQU1ER1BVX01BQ0hfTk9ORSA9IDB4MDAwLAorCisgIC8vIFI2MDAtYmFzZWQgcHJvY2Vzc29ycy4KKyAgRUZfQU1ER1BVX01BQ0hfUjYwMF9GSVJTVCA9IDB4MDAxLAorICBFRl9BTURHUFVfTUFDSF9SNjAwX0xBU1QgPSAweDAxMCwKKyAgLy8gUmFkZW9uIEhEIDIwMDAvMzAwMCBTZXJpZXMgKFI2MDApLgorICBFRl9BTURHUFVfTUFDSF9SNjAwX1I2MDAgPSAweDAwMSwKKyAgRUZfQU1ER1BVX01BQ0hfUjYwMF9SNjMwID0gMHgwMDIsCisgIEVGX0FNREdQVV9NQUNIX1I2MDBfUlM4ODAgPSAweDAwMywKKyAgRUZfQU1ER1BVX01BQ0hfUjYwMF9SVjY3MCA9IDB4MDA0LAorICAvLyBSYWRlb24gSEQgNDAwMCBTZXJpZXMgKFI3MDApLgorICBFRl9BTURHUFVfTUFDSF9SNjAwX1JWNzEwID0gMHgwMDUsCisgIEVGX0FNREdQVV9NQUNIX1I2MDBfUlY3MzAgPSAweDAwNiwKKyAgRUZfQU1ER1BVX01BQ0hfUjYwMF9SVjc3MCA9IDB4MDA3LAorICAvLyBSYWRlb24gSEQgNTAwMCBTZXJpZXMgKEV2ZXJncmVlbikuCisgIEVGX0FNREdQVV9NQUNIX1I2MDBfQ0VEQVIgPSAweDAwOCwKKyAgRUZfQU1ER1BVX01BQ0hfUjYwMF9DWVBSRVNTID0gMHgwMDksCisgIEVGX0FNREdQVV9NQUNIX1I2MDBfSlVOSVBFUiA9IDB4MDBhLAorICBFRl9BTURHUFVfTUFDSF9SNjAwX1JFRFdPT0QgPSAweDAwYiwKKyAgRUZfQU1ER1BVX01BQ0hfUjYwMF9TVU1PID0gMHgwMGMsCisgIC8vIFJhZGVvbiBIRCA2MDAwIFNlcmllcyAoTm9ydGhlcm4gSXNsYW5kcykuCisgIEVGX0FNREdQVV9NQUNIX1I2MDBfQkFSVFMgPSAweDAwZCwKKyAgRUZfQU1ER1BVX01BQ0hfUjYwMF9DQUlDT1MgPSAweDAwZSwKKyAgRUZfQU1ER1BVX01BQ0hfUjYwMF9DQVlNQU4gPSAweDAwZiwKKyAgRUZfQU1ER1BVX01BQ0hfUjYwMF9UVVJLUyA9IDB4MDEwLAorCisgIC8vIFJlc2VydmVkIGZvciBSNjAwLWJhc2VkIHByb2Nlc3NvcnMuCisgIEVGX0FNREdQVV9NQUNIX1I2MDBfUkVTRVJWRURfRklSU1QgPSAweDAxMSwKKyAgRUZfQU1ER1BVX01BQ0hfUjYwMF9SRVNFUlZFRF9MQVNUID0gMHgwMWYsCisKKyAgLy8gQU1ER0NOLWJhc2VkIHByb2Nlc3NvcnMuCisgIEVGX0FNREdQVV9NQUNIX0FNREdDTl9GSVJTVCA9IDB4MDIwLAorICBFRl9BTURHUFVfTUFDSF9BTURHQ05fTEFTVCA9IDB4MDJkLAorICAvLyBBTURHQ04gR0ZYNi4KKyAgRUZfQU1ER1BVX01BQ0hfQU1ER0NOX0dGWDYwMCA9IDB4MDIwLAorICBFRl9BTURHUFVfTUFDSF9BTURHQ05fR0ZYNjAxID0gMHgwMjEsCisgIC8vIEFNREdDTiBHRlg3LgorICBFRl9BTURHUFVfTUFDSF9BTURHQ05fR0ZYNzAwID0gMHgwMjIsCisgIEVGX0FNREdQVV9NQUNIX0FNREdDTl9HRlg3MDEgPSAweDAyMywKKyAgRUZfQU1ER1BVX01BQ0hfQU1ER0NOX0dGWDcwMiA9IDB4MDI0LAorICBFRl9BTURHUFVfTUFDSF9BTURHQ05fR0ZYNzAzID0gMHgwMjUsCisgIEVGX0FNREdQVV9NQUNIX0FNREdDTl9HRlg3MDQgPSAweDAyNiwKKyAgLy8gQU1ER0NOIEdGWDguCisgIEVGX0FNREdQVV9NQUNIX0FNREdDTl9HRlg4MDEgPSAweDAyOCwKKyAgRUZfQU1ER1BVX01BQ0hfQU1ER0NOX0dGWDgwMiA9IDB4MDI5LAorICBFRl9BTURHUFVfTUFDSF9BTURHQ05fR0ZYODAzID0gMHgwMmEsCisgIEVGX0FNREdQVV9NQUNIX0FNREdDTl9HRlg4MTAgPSAweDAyYiwKKyAgLy8gQU1ER0NOIEdGWDkuCisgIEVGX0FNREdQVV9NQUNIX0FNREdDTl9HRlg5MDAgPSAweDAyYywKKyAgRUZfQU1ER1BVX01BQ0hfQU1ER0NOX0dGWDkwMiA9IDB4MDJkLAorCisgIC8vIFJlc2VydmVkIGZvciBBTURHQ04tYmFzZWQgcHJvY2Vzc29ycy4KKyAgRUZfQU1ER1BVX01BQ0hfQU1ER0NOX1JFU0VSVkVEMCA9IDB4MDI3LAorICBFRl9BTURHUFVfTUFDSF9BTURHQ05fUkVTRVJWRUQxID0gMHgwMmUsCisgIEVGX0FNREdQVV9NQUNIX0FNREdDTl9SRVNFUlZFRDIgPSAweDAyZiwKKyAgRUZfQU1ER1BVX01BQ0hfQU1ER0NOX1JFU0VSVkVEMyA9IDB4MDMwLAorCisgIC8vIEluZGljYXRlcyBpZiB0aGUgeG5hY2sgdGFyZ2V0IGZlYXR1cmUgaXMgZW5hYmxlZCBmb3IgYWxsIGNvZGUgY29udGFpbmVkIGluCisgIC8vIHRoZSBvYmplY3QuCisgIEVGX0FNREdQVV9YTkFDSyA9IDB4MTAwLAorfTsKKworLy8gRUxGIFJlbG9jYXRpb24gdHlwZXMgZm9yIEFNREdQVQorZW51bSB7CisjaW5jbHVkZSAiRUxGUmVsb2NzL0FNREdQVS5kZWYiCit9OworCisvLyBFTEYgUmVsb2NhdGlvbiB0eXBlcyBmb3IgQlBGCitlbnVtIHsKKyNpbmNsdWRlICJFTEZSZWxvY3MvQlBGLmRlZiIKK307CisKKyN1bmRlZiBFTEZfUkVMT0MKKworLy8gU2VjdGlvbiBoZWFkZXIuCitzdHJ1Y3QgRWxmMzJfU2hkciB7CisgIEVsZjMyX1dvcmQgc2hfbmFtZTsgICAgICAvLyBTZWN0aW9uIG5hbWUgKGluZGV4IGludG8gc3RyaW5nIHRhYmxlKQorICBFbGYzMl9Xb3JkIHNoX3R5cGU7ICAgICAgLy8gU2VjdGlvbiB0eXBlIChTSFRfKikKKyAgRWxmMzJfV29yZCBzaF9mbGFnczsgICAgIC8vIFNlY3Rpb24gZmxhZ3MgKFNIRl8qKQorICBFbGYzMl9BZGRyIHNoX2FkZHI7ICAgICAgLy8gQWRkcmVzcyB3aGVyZSBzZWN0aW9uIGlzIHRvIGJlIGxvYWRlZAorICBFbGYzMl9PZmYgc2hfb2Zmc2V0OyAgICAgLy8gRmlsZSBvZmZzZXQgb2Ygc2VjdGlvbiBkYXRhLCBpbiBieXRlcworICBFbGYzMl9Xb3JkIHNoX3NpemU7ICAgICAgLy8gU2l6ZSBvZiBzZWN0aW9uLCBpbiBieXRlcworICBFbGYzMl9Xb3JkIHNoX2xpbms7ICAgICAgLy8gU2VjdGlvbiB0eXBlLXNwZWNpZmljIGhlYWRlciB0YWJsZSBpbmRleCBsaW5rCisgIEVsZjMyX1dvcmQgc2hfaW5mbzsgICAgICAvLyBTZWN0aW9uIHR5cGUtc3BlY2lmaWMgZXh0cmEgaW5mb3JtYXRpb24KKyAgRWxmMzJfV29yZCBzaF9hZGRyYWxpZ247IC8vIFNlY3Rpb24gYWRkcmVzcyBhbGlnbm1lbnQKKyAgRWxmMzJfV29yZCBzaF9lbnRzaXplOyAgIC8vIFNpemUgb2YgcmVjb3JkcyBjb250YWluZWQgd2l0aGluIHRoZSBzZWN0aW9uCit9OworCisvLyBTZWN0aW9uIGhlYWRlciBmb3IgRUxGNjQgLSBzYW1lIGZpZWxkcyBhcyBFTEYzMiwgZGlmZmVyZW50IHR5cGVzLgorc3RydWN0IEVsZjY0X1NoZHIgeworICBFbGY2NF9Xb3JkIHNoX25hbWU7CisgIEVsZjY0X1dvcmQgc2hfdHlwZTsKKyAgRWxmNjRfWHdvcmQgc2hfZmxhZ3M7CisgIEVsZjY0X0FkZHIgc2hfYWRkcjsKKyAgRWxmNjRfT2ZmIHNoX29mZnNldDsKKyAgRWxmNjRfWHdvcmQgc2hfc2l6ZTsKKyAgRWxmNjRfV29yZCBzaF9saW5rOworICBFbGY2NF9Xb3JkIHNoX2luZm87CisgIEVsZjY0X1h3b3JkIHNoX2FkZHJhbGlnbjsKKyAgRWxmNjRfWHdvcmQgc2hfZW50c2l6ZTsKK307CisKKy8vIFNwZWNpYWwgc2VjdGlvbiBpbmRpY2VzLgorZW51bSB7CisgIFNITl9VTkRFRiA9IDAsICAgICAgICAgIC8vIFVuZGVmaW5lZCwgbWlzc2luZywgaXJyZWxldmFudCwgb3IgbWVhbmluZ2xlc3MKKyAgU0hOX0xPUkVTRVJWRSA9IDB4ZmYwMCwgLy8gTG93ZXN0IHJlc2VydmVkIGluZGV4CisgIFNITl9MT1BST0MgPSAweGZmMDAsICAgIC8vIExvd2VzdCBwcm9jZXNzb3Itc3BlY2lmaWMgaW5kZXgKKyAgU0hOX0hJUFJPQyA9IDB4ZmYxZiwgICAgLy8gSGlnaGVzdCBwcm9jZXNzb3Itc3BlY2lmaWMgaW5kZXgKKyAgU0hOX0xPT1MgPSAweGZmMjAsICAgICAgLy8gTG93ZXN0IG9wZXJhdGluZyBzeXN0ZW0tc3BlY2lmaWMgaW5kZXgKKyAgU0hOX0hJT1MgPSAweGZmM2YsICAgICAgLy8gSGlnaGVzdCBvcGVyYXRpbmcgc3lzdGVtLXNwZWNpZmljIGluZGV4CisgIFNITl9BQlMgPSAweGZmZjEsICAgICAgIC8vIFN5bWJvbCBoYXMgYWJzb2x1dGUgdmFsdWU7IGRvZXMgbm90IG5lZWQgcmVsb2NhdGlvbgorICBTSE5fQ09NTU9OID0gMHhmZmYyLCAgICAvLyBGT1JUUkFOIENPTU1PTiBvciBDIGV4dGVybmFsIGdsb2JhbCB2YXJpYWJsZXMKKyAgU0hOX1hJTkRFWCA9IDB4ZmZmZiwgICAgLy8gTWFyayB0aGF0IHRoZSBpbmRleCBpcyA+PSBTSE5fTE9SRVNFUlZFCisgIFNITl9ISVJFU0VSVkUgPSAweGZmZmYgIC8vIEhpZ2hlc3QgcmVzZXJ2ZWQgaW5kZXgKK307CisKKy8vIFNlY3Rpb24gdHlwZXMuCitlbnVtIDogdW5zaWduZWQgeworICBTSFRfTlVMTCA9IDAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIGFzc29jaWF0ZWQgc2VjdGlvbiAoaW5hY3RpdmUgZW50cnkpLgorICBTSFRfUFJPR0JJVFMgPSAxLCAgICAgICAgICAgICAgICAgICAgIC8vIFByb2dyYW0tZGVmaW5lZCBjb250ZW50cy4KKyAgU0hUX1NZTVRBQiA9IDIsICAgICAgICAgICAgICAgICAgICAgICAvLyBTeW1ib2wgdGFibGUuCisgIFNIVF9TVFJUQUIgPSAzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gU3RyaW5nIHRhYmxlLgorICBTSFRfUkVMQSA9IDQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlbG9jYXRpb24gZW50cmllczsgZXhwbGljaXQgYWRkZW5kcy4KKyAgU0hUX0hBU0ggPSA1LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBTeW1ib2wgaGFzaCB0YWJsZS4KKyAgU0hUX0RZTkFNSUMgPSA2LCAgICAgICAgICAgICAgICAgICAgICAvLyBJbmZvcm1hdGlvbiBmb3IgZHluYW1pYyBsaW5raW5nLgorICBTSFRfTk9URSA9IDcsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEluZm9ybWF0aW9uIGFib3V0IHRoZSBmaWxlLgorICBTSFRfTk9CSVRTID0gOCwgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgb2NjdXBpZXMgbm8gc3BhY2UgaW4gdGhlIGZpbGUuCisgIFNIVF9SRUwgPSA5LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVsb2NhdGlvbiBlbnRyaWVzOyBubyBleHBsaWNpdCBhZGRlbmRzLgorICBTSFRfU0hMSUIgPSAxMCwgICAgICAgICAgICAgICAgICAgICAgIC8vIFJlc2VydmVkLgorICBTSFRfRFlOU1lNID0gMTEsICAgICAgICAgICAgICAgICAgICAgIC8vIFN5bWJvbCB0YWJsZS4KKyAgU0hUX0lOSVRfQVJSQVkgPSAxNCwgICAgICAgICAgICAgICAgICAvLyBQb2ludGVycyB0byBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMuCisgIFNIVF9GSU5JX0FSUkFZID0gMTUsICAgICAgICAgICAgICAgICAgLy8gUG9pbnRlcnMgdG8gdGVybWluYXRpb24gZnVuY3Rpb25zLgorICBTSFRfUFJFSU5JVF9BUlJBWSA9IDE2LCAgICAgICAgICAgICAgIC8vIFBvaW50ZXJzIHRvIHByZS1pbml0IGZ1bmN0aW9ucy4KKyAgU0hUX0dST1VQID0gMTcsICAgICAgICAgICAgICAgICAgICAgICAvLyBTZWN0aW9uIGdyb3VwLgorICBTSFRfU1lNVEFCX1NITkRYID0gMTgsICAgICAgICAgICAgICAgIC8vIEluZGljZXMgZm9yIFNITl9YSU5ERVggZW50cmllcy4KKyAgU0hUX0xPT1MgPSAweDYwMDAwMDAwLCAgICAgICAgICAgICAgICAvLyBMb3dlc3Qgb3BlcmF0aW5nIHN5c3RlbS1zcGVjaWZpYyB0eXBlLgorICAvLyBBbmRyb2lkIHBhY2tlZCByZWxvY2F0aW9uIHNlY3Rpb24gdHlwZXMuCisgIC8vIGh0dHBzOi8vYW5kcm9pZC5nb29nbGVzb3VyY2UuY29tL3BsYXRmb3JtL2Jpb25pYy8rLzZmMTJiZmVjZTVkY2MwMTMyNWUwYWJiYTU2YTQ2YjFiY2Y5OTFjNjkvdG9vbHMvcmVsb2NhdGlvbl9wYWNrZXIvc3JjL2VsZl9maWxlLmNjIzM3CisgIFNIVF9BTkRST0lEX1JFTCA9IDB4NjAwMDAwMDEsCisgIFNIVF9BTkRST0lEX1JFTEEgPSAweDYwMDAwMDAyLAorICBTSFRfTExWTV9PRFJUQUIgPSAweDZmZmY0YzAwLCAgICAgICAgIC8vIExMVk0gT0RSIHRhYmxlLgorICBTSFRfTExWTV9MSU5LRVJfT1BUSU9OUyA9IDB4NmZmZjRjMDEsIC8vIExMVk0gTGlua2VyIE9wdGlvbnMuCisgIFNIVF9HTlVfQVRUUklCVVRFUyA9IDB4NmZmZmZmZjUsICAgICAgLy8gT2JqZWN0IGF0dHJpYnV0ZXMuCisgIFNIVF9HTlVfSEFTSCA9IDB4NmZmZmZmZjYsICAgICAgICAgICAgLy8gR05VLXN0eWxlIGhhc2ggdGFibGUuCisgIFNIVF9HTlVfdmVyZGVmID0gMHg2ZmZmZmZmZCwgICAgICAgICAgLy8gR05VIHZlcnNpb24gZGVmaW5pdGlvbnMuCisgIFNIVF9HTlVfdmVybmVlZCA9IDB4NmZmZmZmZmUsICAgICAgICAgLy8gR05VIHZlcnNpb24gcmVmZXJlbmNlcy4KKyAgU0hUX0dOVV92ZXJzeW0gPSAweDZmZmZmZmZmLCAgICAgICAgICAvLyBHTlUgc3ltYm9sIHZlcnNpb25zIHRhYmxlLgorICBTSFRfSElPUyA9IDB4NmZmZmZmZmYsICAgICAgICAgICAgICAgIC8vIEhpZ2hlc3Qgb3BlcmF0aW5nIHN5c3RlbS1zcGVjaWZpYyB0eXBlLgorICBTSFRfTE9QUk9DID0gMHg3MDAwMDAwMCwgICAgICAgICAgICAgIC8vIExvd2VzdCBwcm9jZXNzb3IgYXJjaC1zcGVjaWZpYyB0eXBlLgorICAvLyBGaXhtZTogQWxsIHRoaXMgaXMgZHVwbGljYXRlZCBpbiBNQ1NlY3Rpb25FTEYuIFdoeT8/CisgIC8vIEV4Y2VwdGlvbiBJbmRleCB0YWJsZQorICBTSFRfQVJNX0VYSURYID0gMHg3MDAwMDAwMVUsCisgIC8vIEJQQUJJIERMTCBkeW5hbWljIGxpbmtpbmcgcHJlLWVtcHRpb24gbWFwCisgIFNIVF9BUk1fUFJFRU1QVE1BUCA9IDB4NzAwMDAwMDJVLAorICAvLyAgT2JqZWN0IGZpbGUgY29tcGF0aWJpbGl0eSBhdHRyaWJ1dGVzCisgIFNIVF9BUk1fQVRUUklCVVRFUyA9IDB4NzAwMDAwMDNVLAorICBTSFRfQVJNX0RFQlVHT1ZFUkxBWSA9IDB4NzAwMDAwMDRVLAorICBTSFRfQVJNX09WRVJMQVlTRUNUSU9OID0gMHg3MDAwMDAwNVUsCisgIFNIVF9IRVhfT1JERVJFRCA9IDB4NzAwMDAwMDAsICAgICAgICAgLy8gTGluayBlZGl0b3IgaXMgdG8gc29ydCB0aGUgZW50cmllcyBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgc2VjdGlvbiBiYXNlZCBvbiB0aGVpciBzaXplcworICBTSFRfWDg2XzY0X1VOV0lORCA9IDB4NzAwMDAwMDEsICAgICAgIC8vIFVud2luZCBpbmZvcm1hdGlvbgorCisgIFNIVF9NSVBTX1JFR0lORk8gPSAweDcwMDAwMDA2LCAgICAgICAgLy8gUmVnaXN0ZXIgdXNhZ2UgaW5mb3JtYXRpb24KKyAgU0hUX01JUFNfT1BUSU9OUyA9IDB4NzAwMDAwMGQsICAgICAgICAvLyBHZW5lcmFsIG9wdGlvbnMKKyAgU0hUX01JUFNfRFdBUkYgPSAweDcwMDAwMDFlLCAgICAgICAgICAvLyBEV0FSRiBkZWJ1Z2dpbmcgc2VjdGlvbi4KKyAgU0hUX01JUFNfQUJJRkxBR1MgPSAweDcwMDAwMDJhLCAgICAgICAvLyBBQkkgaW5mb3JtYXRpb24uCisKKyAgU0hUX0hJUFJPQyA9IDB4N2ZmZmZmZmYsICAgICAgICAgICAgICAvLyBIaWdoZXN0IHByb2Nlc3NvciBhcmNoLXNwZWNpZmljIHR5cGUuCisgIFNIVF9MT1VTRVIgPSAweDgwMDAwMDAwLCAgICAgICAgICAgICAgLy8gTG93ZXN0IHR5cGUgcmVzZXJ2ZWQgZm9yIGFwcGxpY2F0aW9ucy4KKyAgU0hUX0hJVVNFUiA9IDB4ZmZmZmZmZmYgICAgICAgICAgICAgICAvLyBIaWdoZXN0IHR5cGUgcmVzZXJ2ZWQgZm9yIGFwcGxpY2F0aW9ucy4KK307CisKKy8vIFNlY3Rpb24gZmxhZ3MuCitlbnVtIDogdW5zaWduZWQgeworICAvLyBTZWN0aW9uIGRhdGEgc2hvdWxkIGJlIHdyaXRhYmxlIGR1cmluZyBleGVjdXRpb24uCisgIFNIRl9XUklURSA9IDB4MSwKKworICAvLyBTZWN0aW9uIG9jY3VwaWVzIG1lbW9yeSBkdXJpbmcgcHJvZ3JhbSBleGVjdXRpb24uCisgIFNIRl9BTExPQyA9IDB4MiwKKworICAvLyBTZWN0aW9uIGNvbnRhaW5zIGV4ZWN1dGFibGUgbWFjaGluZSBpbnN0cnVjdGlvbnMuCisgIFNIRl9FWEVDSU5TVFIgPSAweDQsCisKKyAgLy8gVGhlIGRhdGEgaW4gdGhpcyBzZWN0aW9uIG1heSBiZSBtZXJnZWQuCisgIFNIRl9NRVJHRSA9IDB4MTAsCisKKyAgLy8gVGhlIGRhdGEgaW4gdGhpcyBzZWN0aW9uIGlzIG51bGwtdGVybWluYXRlZCBzdHJpbmdzLgorICBTSEZfU1RSSU5HUyA9IDB4MjAsCisKKyAgLy8gQSBmaWVsZCBpbiB0aGlzIHNlY3Rpb24gaG9sZHMgYSBzZWN0aW9uIGhlYWRlciB0YWJsZSBpbmRleC4KKyAgU0hGX0lORk9fTElOSyA9IDB4NDBVLAorCisgIC8vIEFkZHMgc3BlY2lhbCBvcmRlcmluZyByZXF1aXJlbWVudHMgZm9yIGxpbmsgZWRpdG9ycy4KKyAgU0hGX0xJTktfT1JERVIgPSAweDgwVSwKKworICAvLyBUaGlzIHNlY3Rpb24gcmVxdWlyZXMgc3BlY2lhbCBPUy1zcGVjaWZpYyBwcm9jZXNzaW5nIHRvIGF2b2lkIGluY29ycmVjdAorICAvLyBiZWhhdmlvci4KKyAgU0hGX09TX05PTkNPTkZPUk1JTkcgPSAweDEwMFUsCisKKyAgLy8gVGhpcyBzZWN0aW9uIGlzIGEgbWVtYmVyIG9mIGEgc2VjdGlvbiBncm91cC4KKyAgU0hGX0dST1VQID0gMHgyMDBVLAorCisgIC8vIFRoaXMgc2VjdGlvbiBob2xkcyBUaHJlYWQtTG9jYWwgU3RvcmFnZS4KKyAgU0hGX1RMUyA9IDB4NDAwVSwKKworICAvLyBJZGVudGlmaWVzIGEgc2VjdGlvbiBjb250YWluaW5nIGNvbXByZXNzZWQgZGF0YS4KKyAgU0hGX0NPTVBSRVNTRUQgPSAweDgwMFUsCisKKyAgLy8gVGhpcyBzZWN0aW9uIGlzIGV4Y2x1ZGVkIGZyb20gdGhlIGZpbmFsIGV4ZWN1dGFibGUgb3Igc2hhcmVkIGxpYnJhcnkuCisgIFNIRl9FWENMVURFID0gMHg4MDAwMDAwMFUsCisKKyAgLy8gU3RhcnQgb2YgdGFyZ2V0LXNwZWNpZmljIGZsYWdzLgorCisgIFNIRl9NQVNLT1MgPSAweDBmZjAwMDAwLAorCisgIC8vIEJpdHMgaW5kaWNhdGluZyBwcm9jZXNzb3Itc3BlY2lmaWMgZmxhZ3MuCisgIFNIRl9NQVNLUFJPQyA9IDB4ZjAwMDAwMDAsCisKKyAgLy8vIEFsbCBzZWN0aW9ucyB3aXRoIHRoZSAiZCIgZmxhZyBhcmUgZ3JvdXBlZCB0b2dldGhlciBieSB0aGUgbGlua2VyIHRvIGZvcm0KKyAgLy8vIHRoZSBkYXRhIHNlY3Rpb24gYW5kIHRoZSBkcCByZWdpc3RlciBpcyBzZXQgdG8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uIGJ5CisgIC8vLyB0aGUgYm9vdCBjb2RlLgorICBYQ09SRV9TSEZfRFBfU0VDVElPTiA9IDB4MTAwMDAwMDAsCisKKyAgLy8vIEFsbCBzZWN0aW9ucyB3aXRoIHRoZSAiYyIgZmxhZyBhcmUgZ3JvdXBlZCB0b2dldGhlciBieSB0aGUgbGlua2VyIHRvIGZvcm0KKyAgLy8vIHRoZSBjb25zdGFudCBwb29sIGFuZCB0aGUgY3AgcmVnaXN0ZXIgaXMgc2V0IHRvIHRoZSBzdGFydCBvZiB0aGUgY29uc3RhbnQKKyAgLy8vIHBvb2wgYnkgdGhlIGJvb3QgY29kZS4KKyAgWENPUkVfU0hGX0NQX1NFQ1RJT04gPSAweDIwMDAwMDAwLAorCisgIC8vIElmIGFuIG9iamVjdCBmaWxlIHNlY3Rpb24gZG9lcyBub3QgaGF2ZSB0aGlzIGZsYWcgc2V0LCB0aGVuIGl0IG1heSBub3QgaG9sZAorICAvLyBtb3JlIHRoYW4gMkdCIGFuZCBjYW4gYmUgZnJlZWx5IHJlZmVycmVkIHRvIGluIG9iamVjdHMgdXNpbmcgc21hbGxlciBjb2RlCisgIC8vIG1vZGVscy4gT3RoZXJ3aXNlLCBvbmx5IG9iamVjdHMgdXNpbmcgbGFyZ2VyIGNvZGUgbW9kZWxzIGNhbiByZWZlciB0byB0aGVtLgorICAvLyBGb3IgZXhhbXBsZSwgYSBtZWRpdW0gY29kZSBtb2RlbCBvYmplY3QgY2FuIHJlZmVyIHRvIGRhdGEgaW4gYSBzZWN0aW9uIHRoYXQKKyAgLy8gc2V0cyB0aGlzIGZsYWcgYmVzaWRlcyBiZWluZyBhYmxlIHRvIHJlZmVyIHRvIGRhdGEgaW4gYSBzZWN0aW9uIHRoYXQgZG9lcworICAvLyBub3Qgc2V0IGl0OyBsaWtld2lzZSwgYSBzbWFsbCBjb2RlIG1vZGVsIG9iamVjdCBjYW4gcmVmZXIgb25seSB0byBjb2RlIGluIGEKKyAgLy8gc2VjdGlvbiB0aGF0IGRvZXMgbm90IHNldCB0aGlzIGZsYWcuCisgIFNIRl9YODZfNjRfTEFSR0UgPSAweDEwMDAwMDAwLAorCisgIC8vIEFsbCBzZWN0aW9ucyB3aXRoIHRoZSBHUFJFTCBmbGFnIGFyZSBncm91cGVkIGludG8gYSBnbG9iYWwgZGF0YSBhcmVhCisgIC8vIGZvciBmYXN0ZXIgYWNjZXNzZXMKKyAgU0hGX0hFWF9HUFJFTCA9IDB4MTAwMDAwMDAsCisKKyAgLy8gU2VjdGlvbiBjb250YWlucyB0ZXh0L2RhdGEgd2hpY2ggbWF5IGJlIHJlcGxpY2F0ZWQgaW4gb3RoZXIgc2VjdGlvbnMuCisgIC8vIExpbmtlciBtdXN0IHJldGFpbiBvbmx5IG9uZSBjb3B5LgorICBTSEZfTUlQU19OT0RVUEVTID0gMHgwMTAwMDAwMCwKKworICAvLyBMaW5rZXIgbXVzdCBnZW5lcmF0ZSBpbXBsaWNpdCBoaWRkZW4gd2VhayBuYW1lcy4KKyAgU0hGX01JUFNfTkFNRVMgPSAweDAyMDAwMDAwLAorCisgIC8vIFNlY3Rpb24gZGF0YSBsb2NhbCB0byBwcm9jZXNzLgorICBTSEZfTUlQU19MT0NBTCA9IDB4MDQwMDAwMDAsCisKKyAgLy8gRG8gbm90IHN0cmlwIHRoaXMgc2VjdGlvbi4KKyAgU0hGX01JUFNfTk9TVFJJUCA9IDB4MDgwMDAwMDAsCisKKyAgLy8gU2VjdGlvbiBtdXN0IGJlIHBhcnQgb2YgZ2xvYmFsIGRhdGEgYXJlYS4KKyAgU0hGX01JUFNfR1BSRUwgPSAweDEwMDAwMDAwLAorCisgIC8vIFRoaXMgc2VjdGlvbiBzaG91bGQgYmUgbWVyZ2VkLgorICBTSEZfTUlQU19NRVJHRSA9IDB4MjAwMDAwMDAsCisKKyAgLy8gQWRkcmVzcyBzaXplIHRvIGJlIGluZmVycmVkIGZyb20gc2VjdGlvbiBlbnRyeSBzaXplLgorICBTSEZfTUlQU19BRERSID0gMHg0MDAwMDAwMCwKKworICAvLyBTZWN0aW9uIGRhdGEgaXMgc3RyaW5nIGRhdGEgYnkgZGVmYXVsdC4KKyAgU0hGX01JUFNfU1RSSU5HID0gMHg4MDAwMDAwMCwKKworICAvLyBNYWtlIGNvZGUgc2VjdGlvbiB1bnJlYWRhYmxlIHdoZW4gaW4gZXhlY3V0ZS1vbmx5IG1vZGUKKyAgU0hGX0FSTV9QVVJFQ09ERSA9IDB4MjAwMDAwMDAKK307CisKKy8vIFNlY3Rpb24gR3JvdXAgRmxhZ3MKK2VudW0gOiB1bnNpZ25lZCB7CisgIEdSUF9DT01EQVQgPSAweDEsCisgIEdSUF9NQVNLT1MgPSAweDBmZjAwMDAwLAorICBHUlBfTUFTS1BST0MgPSAweGYwMDAwMDAwCit9OworCisvLyBTeW1ib2wgdGFibGUgZW50cmllcyBmb3IgRUxGMzIuCitzdHJ1Y3QgRWxmMzJfU3ltIHsKKyAgRWxmMzJfV29yZCBzdF9uYW1lOyAgICAgLy8gU3ltYm9sIG5hbWUgKGluZGV4IGludG8gc3RyaW5nIHRhYmxlKQorICBFbGYzMl9BZGRyIHN0X3ZhbHVlOyAgICAvLyBWYWx1ZSBvciBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3ltYm9sCisgIEVsZjMyX1dvcmQgc3Rfc2l6ZTsgICAgIC8vIFNpemUgb2YgdGhlIHN5bWJvbAorICB1bnNpZ25lZCBjaGFyIHN0X2luZm87ICAvLyBTeW1ib2wncyB0eXBlIGFuZCBiaW5kaW5nIGF0dHJpYnV0ZXMKKyAgdW5zaWduZWQgY2hhciBzdF9vdGhlcjsgLy8gTXVzdCBiZSB6ZXJvOyByZXNlcnZlZAorICBFbGYzMl9IYWxmIHN0X3NobmR4OyAgICAvLyBXaGljaCBzZWN0aW9uIChoZWFkZXIgdGFibGUgaW5kZXgpIGl0J3MgZGVmaW5lZCBpbgorCisgIC8vIFRoZXNlIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgY29ycmVzcG9uZCB0byB0aGUgRUxGMzJfU1RfQklORCwKKyAgLy8gRUxGMzJfU1RfVFlQRSwgYW5kIEVMRjMyX1NUX0lORk8gbWFjcm9zIGRlZmluZWQgaW4gdGhlIEVMRiBzcGVjaWZpY2F0aW9uOgorICB1bnNpZ25lZCBjaGFyIGdldEJpbmRpbmcoKSBjb25zdCB7IHJldHVybiBzdF9pbmZvID4+IDQ7IH0KKyAgdW5zaWduZWQgY2hhciBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gc3RfaW5mbyAmIDB4MGY7IH0KKyAgdm9pZCBzZXRCaW5kaW5nKHVuc2lnbmVkIGNoYXIgYikgeyBzZXRCaW5kaW5nQW5kVHlwZShiLCBnZXRUeXBlKCkpOyB9CisgIHZvaWQgc2V0VHlwZSh1bnNpZ25lZCBjaGFyIHQpIHsgc2V0QmluZGluZ0FuZFR5cGUoZ2V0QmluZGluZygpLCB0KTsgfQorICB2b2lkIHNldEJpbmRpbmdBbmRUeXBlKHVuc2lnbmVkIGNoYXIgYiwgdW5zaWduZWQgY2hhciB0KSB7CisgICAgc3RfaW5mbyA9IChiIDw8IDQpICsgKHQgJiAweDBmKTsKKyAgfQorfTsKKworLy8gU3ltYm9sIHRhYmxlIGVudHJpZXMgZm9yIEVMRjY0Lgorc3RydWN0IEVsZjY0X1N5bSB7CisgIEVsZjY0X1dvcmQgc3RfbmFtZTsgICAgIC8vIFN5bWJvbCBuYW1lIChpbmRleCBpbnRvIHN0cmluZyB0YWJsZSkKKyAgdW5zaWduZWQgY2hhciBzdF9pbmZvOyAgLy8gU3ltYm9sJ3MgdHlwZSBhbmQgYmluZGluZyBhdHRyaWJ1dGVzCisgIHVuc2lnbmVkIGNoYXIgc3Rfb3RoZXI7IC8vIE11c3QgYmUgemVybzsgcmVzZXJ2ZWQKKyAgRWxmNjRfSGFsZiBzdF9zaG5keDsgICAgLy8gV2hpY2ggc2VjdGlvbiAoaGVhZGVyIHRibCBpbmRleCkgaXQncyBkZWZpbmVkIGluCisgIEVsZjY0X0FkZHIgc3RfdmFsdWU7ICAgIC8vIFZhbHVlIG9yIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBzeW1ib2wKKyAgRWxmNjRfWHdvcmQgc3Rfc2l6ZTsgICAgLy8gU2l6ZSBvZiB0aGUgc3ltYm9sCisKKyAgLy8gVGhlc2UgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyBhcmUgaWRlbnRpY2FsIHRvIHRob3NlIGRlZmluZWQgZm9yIEVMRjMyCisgIC8vIHN5bWJvbCB0YWJsZSBlbnRyaWVzLgorICB1bnNpZ25lZCBjaGFyIGdldEJpbmRpbmcoKSBjb25zdCB7IHJldHVybiBzdF9pbmZvID4+IDQ7IH0KKyAgdW5zaWduZWQgY2hhciBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gc3RfaW5mbyAmIDB4MGY7IH0KKyAgdm9pZCBzZXRCaW5kaW5nKHVuc2lnbmVkIGNoYXIgYikgeyBzZXRCaW5kaW5nQW5kVHlwZShiLCBnZXRUeXBlKCkpOyB9CisgIHZvaWQgc2V0VHlwZSh1bnNpZ25lZCBjaGFyIHQpIHsgc2V0QmluZGluZ0FuZFR5cGUoZ2V0QmluZGluZygpLCB0KTsgfQorICB2b2lkIHNldEJpbmRpbmdBbmRUeXBlKHVuc2lnbmVkIGNoYXIgYiwgdW5zaWduZWQgY2hhciB0KSB7CisgICAgc3RfaW5mbyA9IChiIDw8IDQpICsgKHQgJiAweDBmKTsKKyAgfQorfTsKKworLy8gVGhlIHNpemUgKGluIGJ5dGVzKSBvZiBzeW1ib2wgdGFibGUgZW50cmllcy4KK2VudW0geworICBTWU1FTlRSWV9TSVpFMzIgPSAxNiwgLy8gMzItYml0IHN5bWJvbCBlbnRyeSBzaXplCisgIFNZTUVOVFJZX1NJWkU2NCA9IDI0ICAvLyA2NC1iaXQgc3ltYm9sIGVudHJ5IHNpemUuCit9OworCisvLyBTeW1ib2wgYmluZGluZ3MuCitlbnVtIHsKKyAgU1RCX0xPQ0FMID0gMCwgIC8vIExvY2FsIHN5bWJvbCwgbm90IHZpc2libGUgb3V0c2lkZSBvYmogZmlsZSBjb250YWluaW5nIGRlZgorICBTVEJfR0xPQkFMID0gMSwgLy8gR2xvYmFsIHN5bWJvbCwgdmlzaWJsZSB0byBhbGwgb2JqZWN0IGZpbGVzIGJlaW5nIGNvbWJpbmVkCisgIFNUQl9XRUFLID0gMiwgICAvLyBXZWFrIHN5bWJvbCwgbGlrZSBnbG9iYWwgYnV0IGxvd2VyLXByZWNlZGVuY2UKKyAgU1RCX0dOVV9VTklRVUUgPSAxMCwKKyAgU1RCX0xPT1MgPSAxMCwgICAvLyBMb3dlc3Qgb3BlcmF0aW5nIHN5c3RlbS1zcGVjaWZpYyBiaW5kaW5nIHR5cGUKKyAgU1RCX0hJT1MgPSAxMiwgICAvLyBIaWdoZXN0IG9wZXJhdGluZyBzeXN0ZW0tc3BlY2lmaWMgYmluZGluZyB0eXBlCisgIFNUQl9MT1BST0MgPSAxMywgLy8gTG93ZXN0IHByb2Nlc3Nvci1zcGVjaWZpYyBiaW5kaW5nIHR5cGUKKyAgU1RCX0hJUFJPQyA9IDE1ICAvLyBIaWdoZXN0IHByb2Nlc3Nvci1zcGVjaWZpYyBiaW5kaW5nIHR5cGUKK307CisKKy8vIFN5bWJvbCB0eXBlcy4KK2VudW0geworICBTVFRfTk9UWVBFID0gMCwgICAgIC8vIFN5bWJvbCdzIHR5cGUgaXMgbm90IHNwZWNpZmllZAorICBTVFRfT0JKRUNUID0gMSwgICAgIC8vIFN5bWJvbCBpcyBhIGRhdGEgb2JqZWN0ICh2YXJpYWJsZSwgYXJyYXksIGV0Yy4pCisgIFNUVF9GVU5DID0gMiwgICAgICAgLy8gU3ltYm9sIGlzIGV4ZWN1dGFibGUgY29kZSAoZnVuY3Rpb24sIGV0Yy4pCisgIFNUVF9TRUNUSU9OID0gMywgICAgLy8gU3ltYm9sIHJlZmVycyB0byBhIHNlY3Rpb24KKyAgU1RUX0ZJTEUgPSA0LCAgICAgICAvLyBMb2NhbCwgYWJzb2x1dGUgc3ltYm9sIHRoYXQgcmVmZXJzIHRvIGEgZmlsZQorICBTVFRfQ09NTU9OID0gNSwgICAgIC8vIEFuIHVuaW5pdGlhbGl6ZWQgY29tbW9uIGJsb2NrCisgIFNUVF9UTFMgPSA2LCAgICAgICAgLy8gVGhyZWFkIGxvY2FsIGRhdGEgb2JqZWN0CisgIFNUVF9HTlVfSUZVTkMgPSAxMCwgLy8gR05VIGluZGlyZWN0IGZ1bmN0aW9uCisgIFNUVF9MT09TID0gMTAsICAgICAgLy8gTG93ZXN0IG9wZXJhdGluZyBzeXN0ZW0tc3BlY2lmaWMgc3ltYm9sIHR5cGUKKyAgU1RUX0hJT1MgPSAxMiwgICAgICAvLyBIaWdoZXN0IG9wZXJhdGluZyBzeXN0ZW0tc3BlY2lmaWMgc3ltYm9sIHR5cGUKKyAgU1RUX0xPUFJPQyA9IDEzLCAgICAvLyBMb3dlc3QgcHJvY2Vzc29yLXNwZWNpZmljIHN5bWJvbCB0eXBlCisgIFNUVF9ISVBST0MgPSAxNSwgICAgLy8gSGlnaGVzdCBwcm9jZXNzb3Itc3BlY2lmaWMgc3ltYm9sIHR5cGUKKworICAvLyBBTURHUFUgc3ltYm9sIHR5cGVzCisgIFNUVF9BTURHUFVfSFNBX0tFUk5FTCA9IDEwCit9OworCitlbnVtIHsKKyAgU1RWX0RFRkFVTFQgPSAwLCAgLy8gVmlzaWJpbGl0eSBpcyBzcGVjaWZpZWQgYnkgYmluZGluZyB0eXBlCisgIFNUVl9JTlRFUk5BTCA9IDEsIC8vIERlZmluZWQgYnkgcHJvY2Vzc29yIHN1cHBsZW1lbnRzCisgIFNUVl9ISURERU4gPSAyLCAgIC8vIE5vdCB2aXNpYmxlIHRvIG90aGVyIGNvbXBvbmVudHMKKyAgU1RWX1BST1RFQ1RFRCA9IDMgLy8gVmlzaWJsZSBpbiBvdGhlciBjb21wb25lbnRzIGJ1dCBub3QgcHJlZW1wdGFibGUKK307CisKKy8vIFN5bWJvbCBudW1iZXIuCitlbnVtIHsgU1ROX1VOREVGID0gMCB9OworCisvLyBTcGVjaWFsIHJlbG9jYXRpb24gc3ltYm9scyB1c2VkIGluIHRoZSBNSVBTNjQgRUxGIHJlbG9jYXRpb24gZW50cmllcworZW51bSB7CisgIFJTU19VTkRFRiA9IDAsIC8vIE5vbmUKKyAgUlNTX0dQID0gMSwgICAgLy8gVmFsdWUgb2YgZ3AKKyAgUlNTX0dQMCA9IDIsICAgLy8gVmFsdWUgb2YgZ3AgdXNlZCB0byBjcmVhdGUgb2JqZWN0IGJlaW5nIHJlbG9jYXRlZAorICBSU1NfTE9DID0gMyAgICAvLyBBZGRyZXNzIG9mIGxvY2F0aW9uIGJlaW5nIHJlbG9jYXRlZAorfTsKKworLy8gUmVsb2NhdGlvbiBlbnRyeSwgd2l0aG91dCBleHBsaWNpdCBhZGRlbmQuCitzdHJ1Y3QgRWxmMzJfUmVsIHsKKyAgRWxmMzJfQWRkciByX29mZnNldDsgLy8gTG9jYXRpb24gKGZpbGUgYnl0ZSBvZmZzZXQsIG9yIHByb2dyYW0gdmlydHVhbCBhZGRyKQorICBFbGYzMl9Xb3JkIHJfaW5mbzsgICAvLyBTeW1ib2wgdGFibGUgaW5kZXggYW5kIHR5cGUgb2YgcmVsb2NhdGlvbiB0byBhcHBseQorCisgIC8vIFRoZXNlIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgY29ycmVzcG9uZCB0byB0aGUgRUxGMzJfUl9TWU0sIEVMRjMyX1JfVFlQRSwKKyAgLy8gYW5kIEVMRjMyX1JfSU5GTyBtYWNyb3MgZGVmaW5lZCBpbiB0aGUgRUxGIHNwZWNpZmljYXRpb246CisgIEVsZjMyX1dvcmQgZ2V0U3ltYm9sKCkgY29uc3QgeyByZXR1cm4gKHJfaW5mbyA+PiA4KTsgfQorICB1bnNpZ25lZCBjaGFyIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiAodW5zaWduZWQgY2hhcikocl9pbmZvICYgMHgwZmYpOyB9CisgIHZvaWQgc2V0U3ltYm9sKEVsZjMyX1dvcmQgcykgeyBzZXRTeW1ib2xBbmRUeXBlKHMsIGdldFR5cGUoKSk7IH0KKyAgdm9pZCBzZXRUeXBlKHVuc2lnbmVkIGNoYXIgdCkgeyBzZXRTeW1ib2xBbmRUeXBlKGdldFN5bWJvbCgpLCB0KTsgfQorICB2b2lkIHNldFN5bWJvbEFuZFR5cGUoRWxmMzJfV29yZCBzLCB1bnNpZ25lZCBjaGFyIHQpIHsKKyAgICByX2luZm8gPSAocyA8PCA4KSArIHQ7CisgIH0KK307CisKKy8vIFJlbG9jYXRpb24gZW50cnkgd2l0aCBleHBsaWNpdCBhZGRlbmQuCitzdHJ1Y3QgRWxmMzJfUmVsYSB7CisgIEVsZjMyX0FkZHIgcl9vZmZzZXQ7ICAvLyBMb2NhdGlvbiAoZmlsZSBieXRlIG9mZnNldCwgb3IgcHJvZ3JhbSB2aXJ0dWFsIGFkZHIpCisgIEVsZjMyX1dvcmQgcl9pbmZvOyAgICAvLyBTeW1ib2wgdGFibGUgaW5kZXggYW5kIHR5cGUgb2YgcmVsb2NhdGlvbiB0byBhcHBseQorICBFbGYzMl9Td29yZCByX2FkZGVuZDsgLy8gQ29tcHV0ZSB2YWx1ZSBmb3IgcmVsb2NhdGFibGUgZmllbGQgYnkgYWRkaW5nIHRoaXMKKworICAvLyBUaGVzZSBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzIGNvcnJlc3BvbmQgdG8gdGhlIEVMRjMyX1JfU1lNLCBFTEYzMl9SX1RZUEUsCisgIC8vIGFuZCBFTEYzMl9SX0lORk8gbWFjcm9zIGRlZmluZWQgaW4gdGhlIEVMRiBzcGVjaWZpY2F0aW9uOgorICBFbGYzMl9Xb3JkIGdldFN5bWJvbCgpIGNvbnN0IHsgcmV0dXJuIChyX2luZm8gPj4gOCk7IH0KKyAgdW5zaWduZWQgY2hhciBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gKHVuc2lnbmVkIGNoYXIpKHJfaW5mbyAmIDB4MGZmKTsgfQorICB2b2lkIHNldFN5bWJvbChFbGYzMl9Xb3JkIHMpIHsgc2V0U3ltYm9sQW5kVHlwZShzLCBnZXRUeXBlKCkpOyB9CisgIHZvaWQgc2V0VHlwZSh1bnNpZ25lZCBjaGFyIHQpIHsgc2V0U3ltYm9sQW5kVHlwZShnZXRTeW1ib2woKSwgdCk7IH0KKyAgdm9pZCBzZXRTeW1ib2xBbmRUeXBlKEVsZjMyX1dvcmQgcywgdW5zaWduZWQgY2hhciB0KSB7CisgICAgcl9pbmZvID0gKHMgPDwgOCkgKyB0OworICB9Cit9OworCisvLyBSZWxvY2F0aW9uIGVudHJ5LCB3aXRob3V0IGV4cGxpY2l0IGFkZGVuZC4KK3N0cnVjdCBFbGY2NF9SZWwgeworICBFbGY2NF9BZGRyIHJfb2Zmc2V0OyAvLyBMb2NhdGlvbiAoZmlsZSBieXRlIG9mZnNldCwgb3IgcHJvZ3JhbSB2aXJ0dWFsIGFkZHIpLgorICBFbGY2NF9Yd29yZCByX2luZm87ICAvLyBTeW1ib2wgdGFibGUgaW5kZXggYW5kIHR5cGUgb2YgcmVsb2NhdGlvbiB0byBhcHBseS4KKworICAvLyBUaGVzZSBhY2Nlc3NvcnMgYW5kIG11dGF0b3JzIGNvcnJlc3BvbmQgdG8gdGhlIEVMRjY0X1JfU1lNLCBFTEY2NF9SX1RZUEUsCisgIC8vIGFuZCBFTEY2NF9SX0lORk8gbWFjcm9zIGRlZmluZWQgaW4gdGhlIEVMRiBzcGVjaWZpY2F0aW9uOgorICBFbGY2NF9Xb3JkIGdldFN5bWJvbCgpIGNvbnN0IHsgcmV0dXJuIChyX2luZm8gPj4gMzIpOyB9CisgIEVsZjY0X1dvcmQgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIChFbGY2NF9Xb3JkKShyX2luZm8gJiAweGZmZmZmZmZmTCk7IH0KKyAgdm9pZCBzZXRTeW1ib2woRWxmNjRfV29yZCBzKSB7IHNldFN5bWJvbEFuZFR5cGUocywgZ2V0VHlwZSgpKTsgfQorICB2b2lkIHNldFR5cGUoRWxmNjRfV29yZCB0KSB7IHNldFN5bWJvbEFuZFR5cGUoZ2V0U3ltYm9sKCksIHQpOyB9CisgIHZvaWQgc2V0U3ltYm9sQW5kVHlwZShFbGY2NF9Xb3JkIHMsIEVsZjY0X1dvcmQgdCkgeworICAgIHJfaW5mbyA9ICgoRWxmNjRfWHdvcmQpcyA8PCAzMikgKyAodCAmIDB4ZmZmZmZmZmZMKTsKKyAgfQorfTsKKworLy8gUmVsb2NhdGlvbiBlbnRyeSB3aXRoIGV4cGxpY2l0IGFkZGVuZC4KK3N0cnVjdCBFbGY2NF9SZWxhIHsKKyAgRWxmNjRfQWRkciByX29mZnNldDsgLy8gTG9jYXRpb24gKGZpbGUgYnl0ZSBvZmZzZXQsIG9yIHByb2dyYW0gdmlydHVhbCBhZGRyKS4KKyAgRWxmNjRfWHdvcmQgcl9pbmZvOyAgLy8gU3ltYm9sIHRhYmxlIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gdG8gYXBwbHkuCisgIEVsZjY0X1N4d29yZCByX2FkZGVuZDsgLy8gQ29tcHV0ZSB2YWx1ZSBmb3IgcmVsb2NhdGFibGUgZmllbGQgYnkgYWRkaW5nIHRoaXMuCisKKyAgLy8gVGhlc2UgYWNjZXNzb3JzIGFuZCBtdXRhdG9ycyBjb3JyZXNwb25kIHRvIHRoZSBFTEY2NF9SX1NZTSwgRUxGNjRfUl9UWVBFLAorICAvLyBhbmQgRUxGNjRfUl9JTkZPIG1hY3JvcyBkZWZpbmVkIGluIHRoZSBFTEYgc3BlY2lmaWNhdGlvbjoKKyAgRWxmNjRfV29yZCBnZXRTeW1ib2woKSBjb25zdCB7IHJldHVybiAocl9pbmZvID4+IDMyKTsgfQorICBFbGY2NF9Xb3JkIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiAoRWxmNjRfV29yZCkocl9pbmZvICYgMHhmZmZmZmZmZkwpOyB9CisgIHZvaWQgc2V0U3ltYm9sKEVsZjY0X1dvcmQgcykgeyBzZXRTeW1ib2xBbmRUeXBlKHMsIGdldFR5cGUoKSk7IH0KKyAgdm9pZCBzZXRUeXBlKEVsZjY0X1dvcmQgdCkgeyBzZXRTeW1ib2xBbmRUeXBlKGdldFN5bWJvbCgpLCB0KTsgfQorICB2b2lkIHNldFN5bWJvbEFuZFR5cGUoRWxmNjRfV29yZCBzLCBFbGY2NF9Xb3JkIHQpIHsKKyAgICByX2luZm8gPSAoKEVsZjY0X1h3b3JkKXMgPDwgMzIpICsgKHQgJiAweGZmZmZmZmZmTCk7CisgIH0KK307CisKKy8vIFByb2dyYW0gaGVhZGVyIGZvciBFTEYzMi4KK3N0cnVjdCBFbGYzMl9QaGRyIHsKKyAgRWxmMzJfV29yZCBwX3R5cGU7ICAgLy8gVHlwZSBvZiBzZWdtZW50CisgIEVsZjMyX09mZiBwX29mZnNldDsgIC8vIEZpbGUgb2Zmc2V0IHdoZXJlIHNlZ21lbnQgaXMgbG9jYXRlZCwgaW4gYnl0ZXMKKyAgRWxmMzJfQWRkciBwX3ZhZGRyOyAgLy8gVmlydHVhbCBhZGRyZXNzIG9mIGJlZ2lubmluZyBvZiBzZWdtZW50CisgIEVsZjMyX0FkZHIgcF9wYWRkcjsgIC8vIFBoeXNpY2FsIGFkZHJlc3Mgb2YgYmVnaW5uaW5nIG9mIHNlZ21lbnQgKE9TLXNwZWNpZmljKQorICBFbGYzMl9Xb3JkIHBfZmlsZXN6OyAvLyBOdW0uIG9mIGJ5dGVzIGluIGZpbGUgaW1hZ2Ugb2Ygc2VnbWVudCAobWF5IGJlIHplcm8pCisgIEVsZjMyX1dvcmQgcF9tZW1zejsgIC8vIE51bS4gb2YgYnl0ZXMgaW4gbWVtIGltYWdlIG9mIHNlZ21lbnQgKG1heSBiZSB6ZXJvKQorICBFbGYzMl9Xb3JkIHBfZmxhZ3M7ICAvLyBTZWdtZW50IGZsYWdzCisgIEVsZjMyX1dvcmQgcF9hbGlnbjsgIC8vIFNlZ21lbnQgYWxpZ25tZW50IGNvbnN0cmFpbnQKK307CisKKy8vIFByb2dyYW0gaGVhZGVyIGZvciBFTEY2NC4KK3N0cnVjdCBFbGY2NF9QaGRyIHsKKyAgRWxmNjRfV29yZCBwX3R5cGU7ICAgIC8vIFR5cGUgb2Ygc2VnbWVudAorICBFbGY2NF9Xb3JkIHBfZmxhZ3M7ICAgLy8gU2VnbWVudCBmbGFncworICBFbGY2NF9PZmYgcF9vZmZzZXQ7ICAgLy8gRmlsZSBvZmZzZXQgd2hlcmUgc2VnbWVudCBpcyBsb2NhdGVkLCBpbiBieXRlcworICBFbGY2NF9BZGRyIHBfdmFkZHI7ICAgLy8gVmlydHVhbCBhZGRyZXNzIG9mIGJlZ2lubmluZyBvZiBzZWdtZW50CisgIEVsZjY0X0FkZHIgcF9wYWRkcjsgICAvLyBQaHlzaWNhbCBhZGRyIG9mIGJlZ2lubmluZyBvZiBzZWdtZW50IChPUy1zcGVjaWZpYykKKyAgRWxmNjRfWHdvcmQgcF9maWxlc3o7IC8vIE51bS4gb2YgYnl0ZXMgaW4gZmlsZSBpbWFnZSBvZiBzZWdtZW50IChtYXkgYmUgemVybykKKyAgRWxmNjRfWHdvcmQgcF9tZW1zejsgIC8vIE51bS4gb2YgYnl0ZXMgaW4gbWVtIGltYWdlIG9mIHNlZ21lbnQgKG1heSBiZSB6ZXJvKQorICBFbGY2NF9Yd29yZCBwX2FsaWduOyAgLy8gU2VnbWVudCBhbGlnbm1lbnQgY29uc3RyYWludAorfTsKKworLy8gU2VnbWVudCB0eXBlcy4KK2VudW0geworICBQVF9OVUxMID0gMCwgICAgICAgICAgICAvLyBVbnVzZWQgc2VnbWVudC4KKyAgUFRfTE9BRCA9IDEsICAgICAgICAgICAgLy8gTG9hZGFibGUgc2VnbWVudC4KKyAgUFRfRFlOQU1JQyA9IDIsICAgICAgICAgLy8gRHluYW1pYyBsaW5raW5nIGluZm9ybWF0aW9uLgorICBQVF9JTlRFUlAgPSAzLCAgICAgICAgICAvLyBJbnRlcnByZXRlciBwYXRobmFtZS4KKyAgUFRfTk9URSA9IDQsICAgICAgICAgICAgLy8gQXV4aWxpYXJ5IGluZm9ybWF0aW9uLgorICBQVF9TSExJQiA9IDUsICAgICAgICAgICAvLyBSZXNlcnZlZC4KKyAgUFRfUEhEUiA9IDYsICAgICAgICAgICAgLy8gVGhlIHByb2dyYW0gaGVhZGVyIHRhYmxlIGl0c2VsZi4KKyAgUFRfVExTID0gNywgICAgICAgICAgICAgLy8gVGhlIHRocmVhZC1sb2NhbCBzdG9yYWdlIHRlbXBsYXRlLgorICBQVF9MT09TID0gMHg2MDAwMDAwMCwgICAvLyBMb3dlc3Qgb3BlcmF0aW5nIHN5c3RlbS1zcGVjaWZpYyBwdCBlbnRyeSB0eXBlLgorICBQVF9ISU9TID0gMHg2ZmZmZmZmZiwgICAvLyBIaWdoZXN0IG9wZXJhdGluZyBzeXN0ZW0tc3BlY2lmaWMgcHQgZW50cnkgdHlwZS4KKyAgUFRfTE9QUk9DID0gMHg3MDAwMDAwMCwgLy8gTG93ZXN0IHByb2Nlc3Nvci1zcGVjaWZpYyBwcm9ncmFtIGhkciBlbnRyeSB0eXBlLgorICBQVF9ISVBST0MgPSAweDdmZmZmZmZmLCAvLyBIaWdoZXN0IHByb2Nlc3Nvci1zcGVjaWZpYyBwcm9ncmFtIGhkciBlbnRyeSB0eXBlLgorCisgIC8vIHg4Ni02NCBwcm9ncmFtIGhlYWRlciB0eXBlcy4KKyAgLy8gVGhlc2UgYWxsIGNvbnRhaW4gc3RhY2sgdW53aW5kIHRhYmxlcy4KKyAgUFRfR05VX0VIX0ZSQU1FID0gMHg2NDc0ZTU1MCwKKyAgUFRfU1VOV19FSF9GUkFNRSA9IDB4NjQ3NGU1NTAsCisgIFBUX1NVTldfVU5XSU5EID0gMHg2NDY0ZTU1MCwKKworICBQVF9HTlVfU1RBQ0sgPSAweDY0NzRlNTUxLCAvLyBJbmRpY2F0ZXMgc3RhY2sgZXhlY3V0YWJpbGl0eS4KKyAgUFRfR05VX1JFTFJPID0gMHg2NDc0ZTU1MiwgLy8gUmVhZC1vbmx5IGFmdGVyIHJlbG9jYXRpb24uCisKKyAgUFRfT1BFTkJTRF9SQU5ET01JWkUgPSAweDY1YTNkYmU2LCAvLyBGaWxsIHdpdGggcmFuZG9tIGRhdGEuCisgIFBUX09QRU5CU0RfV1hORUVERUQgPSAweDY1YTNkYmU3LCAgLy8gUHJvZ3JhbSBkb2VzIFdeWCB2aW9sYXRpb25zLgorICBQVF9PUEVOQlNEX0JPT1REQVRBID0gMHg2NWE0MWJlNiwgIC8vIFNlY3Rpb24gZm9yIGJvb3QgYXJndW1lbnRzLgorCisgIC8vIEFSTSBwcm9ncmFtIGhlYWRlciB0eXBlcy4KKyAgUFRfQVJNX0FSQ0hFWFQgPSAweDcwMDAwMDAwLCAvLyBQbGF0Zm9ybSBhcmNoaXRlY3R1cmUgY29tcGF0aWJpbGl0eSBpbmZvCisgIC8vIFRoZXNlIGFsbCBjb250YWluIHN0YWNrIHVud2luZCB0YWJsZXMuCisgIFBUX0FSTV9FWElEWCA9IDB4NzAwMDAwMDEsCisgIFBUX0FSTV9VTldJTkQgPSAweDcwMDAwMDAxLAorCisgIC8vIE1JUFMgcHJvZ3JhbSBoZWFkZXIgdHlwZXMuCisgIFBUX01JUFNfUkVHSU5GTyA9IDB4NzAwMDAwMDAsICAvLyBSZWdpc3RlciB1c2FnZSBpbmZvcm1hdGlvbi4KKyAgUFRfTUlQU19SVFBST0MgPSAweDcwMDAwMDAxLCAgIC8vIFJ1bnRpbWUgcHJvY2VkdXJlIHRhYmxlLgorICBQVF9NSVBTX09QVElPTlMgPSAweDcwMDAwMDAyLCAgLy8gT3B0aW9ucyBzZWdtZW50LgorICBQVF9NSVBTX0FCSUZMQUdTID0gMHg3MDAwMDAwMywgLy8gQWJpZmxhZ3Mgc2VnbWVudC4KKworICAvLyBXZWJBc3NlbWJseSBwcm9ncmFtIGhlYWRlciB0eXBlcy4KKyAgUFRfV0VCQVNTRU1CTFlfRlVOQ1RJT05TID0gUFRfTE9QUk9DICsgMCwgLy8gRnVuY3Rpb24gZGVmaW5pdGlvbnMuCit9OworCisvLyBTZWdtZW50IGZsYWcgYml0cy4KK2VudW0gOiB1bnNpZ25lZCB7CisgIFBGX1ggPSAxLCAgICAgICAgICAgICAgICAvLyBFeGVjdXRlCisgIFBGX1cgPSAyLCAgICAgICAgICAgICAgICAvLyBXcml0ZQorICBQRl9SID0gNCwgICAgICAgICAgICAgICAgLy8gUmVhZAorICBQRl9NQVNLT1MgPSAweDBmZjAwMDAwLCAgLy8gQml0cyBmb3Igb3BlcmF0aW5nIHN5c3RlbS1zcGVjaWZpYyBzZW1hbnRpY3MuCisgIFBGX01BU0tQUk9DID0gMHhmMDAwMDAwMCAvLyBCaXRzIGZvciBwcm9jZXNzb3Itc3BlY2lmaWMgc2VtYW50aWNzLgorfTsKKworLy8gRHluYW1pYyB0YWJsZSBlbnRyeSBmb3IgRUxGMzIuCitzdHJ1Y3QgRWxmMzJfRHluIHsKKyAgRWxmMzJfU3dvcmQgZF90YWc7IC8vIFR5cGUgb2YgZHluYW1pYyB0YWJsZSBlbnRyeS4KKyAgdW5pb24geworICAgIEVsZjMyX1dvcmQgZF92YWw7IC8vIEludGVnZXIgdmFsdWUgb2YgZW50cnkuCisgICAgRWxmMzJfQWRkciBkX3B0cjsgLy8gUG9pbnRlciB2YWx1ZSBvZiBlbnRyeS4KKyAgfSBkX3VuOworfTsKKworLy8gRHluYW1pYyB0YWJsZSBlbnRyeSBmb3IgRUxGNjQuCitzdHJ1Y3QgRWxmNjRfRHluIHsKKyAgRWxmNjRfU3h3b3JkIGRfdGFnOyAvLyBUeXBlIG9mIGR5bmFtaWMgdGFibGUgZW50cnkuCisgIHVuaW9uIHsKKyAgICBFbGY2NF9Yd29yZCBkX3ZhbDsgLy8gSW50ZWdlciB2YWx1ZSBvZiBlbnRyeS4KKyAgICBFbGY2NF9BZGRyIGRfcHRyOyAgLy8gUG9pbnRlciB2YWx1ZSBvZiBlbnRyeS4KKyAgfSBkX3VuOworfTsKKworLy8gRHluYW1pYyB0YWJsZSBlbnRyeSB0YWdzLgorZW51bSB7CisjZGVmaW5lIERZTkFNSUNfVEFHKG5hbWUsIHZhbHVlKSBEVF8jI25hbWUgPSB2YWx1ZSwKKyNpbmNsdWRlICJEeW5hbWljVGFncy5kZWYiCisjdW5kZWYgRFlOQU1JQ19UQUcKK307CisKKy8vIERUX0ZMQUdTIHZhbHVlcy4KK2VudW0geworICBERl9PUklHSU4gPSAweDAxLCAgICAvLyBUaGUgb2JqZWN0IG1heSByZWZlcmVuY2UgJE9SSUdJTi4KKyAgREZfU1lNQk9MSUMgPSAweDAyLCAgLy8gU2VhcmNoIHRoZSBzaGFyZWQgbGliIGJlZm9yZSBzZWFyY2hpbmcgdGhlIGV4ZS4KKyAgREZfVEVYVFJFTCA9IDB4MDQsICAgLy8gUmVsb2NhdGlvbnMgbWF5IG1vZGlmeSBhIG5vbi13cml0YWJsZSBzZWdtZW50LgorICBERl9CSU5EX05PVyA9IDB4MDgsICAvLyBQcm9jZXNzIGFsbCByZWxvY2F0aW9ucyBvbiBsb2FkLgorICBERl9TVEFUSUNfVExTID0gMHgxMCAvLyBSZWplY3QgYXR0ZW1wdHMgdG8gbG9hZCBkeW5hbWljYWxseS4KK307CisKKy8vIFN0YXRlIGZsYWdzIHNlbGVjdGFibGUgaW4gdGhlIGBkX3VuLmRfdmFsJyBlbGVtZW50IG9mIHRoZSBEVF9GTEFHU18xIGVudHJ5LgorZW51bSB7CisgIERGXzFfTk9XID0gMHgwMDAwMDAwMSwgICAgICAgLy8gU2V0IFJUTERfTk9XIGZvciB0aGlzIG9iamVjdC4KKyAgREZfMV9HTE9CQUwgPSAweDAwMDAwMDAyLCAgICAvLyBTZXQgUlRMRF9HTE9CQUwgZm9yIHRoaXMgb2JqZWN0LgorICBERl8xX0dST1VQID0gMHgwMDAwMDAwNCwgICAgIC8vIFNldCBSVExEX0dST1VQIGZvciB0aGlzIG9iamVjdC4KKyAgREZfMV9OT0RFTEVURSA9IDB4MDAwMDAwMDgsICAvLyBTZXQgUlRMRF9OT0RFTEVURSBmb3IgdGhpcyBvYmplY3QuCisgIERGXzFfTE9BREZMVFIgPSAweDAwMDAwMDEwLCAgLy8gVHJpZ2dlciBmaWx0ZWUgbG9hZGluZyBhdCBydW50aW1lLgorICBERl8xX0lOSVRGSVJTVCA9IDB4MDAwMDAwMjAsIC8vIFNldCBSVExEX0lOSVRGSVJTVCBmb3IgdGhpcyBvYmplY3QuCisgIERGXzFfTk9PUEVOID0gMHgwMDAwMDA0MCwgICAgLy8gU2V0IFJUTERfTk9PUEVOIGZvciB0aGlzIG9iamVjdC4KKyAgREZfMV9PUklHSU4gPSAweDAwMDAwMDgwLCAgICAvLyAkT1JJR0lOIG11c3QgYmUgaGFuZGxlZC4KKyAgREZfMV9ESVJFQ1QgPSAweDAwMDAwMTAwLCAgICAvLyBEaXJlY3QgYmluZGluZyBlbmFibGVkLgorICBERl8xX1RSQU5TID0gMHgwMDAwMDIwMCwKKyAgREZfMV9JTlRFUlBPU0UgPSAweDAwMDAwNDAwLCAgLy8gT2JqZWN0IGlzIHVzZWQgdG8gaW50ZXJwb3NlLgorICBERl8xX05PREVGTElCID0gMHgwMDAwMDgwMCwgICAvLyBJZ25vcmUgZGVmYXVsdCBsaWIgc2VhcmNoIHBhdGguCisgIERGXzFfTk9EVU1QID0gMHgwMDAwMTAwMCwgICAgIC8vIE9iamVjdCBjYW4ndCBiZSBkbGR1bXAnZWQuCisgIERGXzFfQ09ORkFMVCA9IDB4MDAwMDIwMDAsICAgIC8vIENvbmZpZ3VyYXRpb24gYWx0ZXJuYXRpdmUgY3JlYXRlZC4KKyAgREZfMV9FTkRGSUxURUUgPSAweDAwMDA0MDAwLCAgLy8gRmlsdGVlIHRlcm1pbmF0ZXMgZmlsdGVycyBzZWFyY2guCisgIERGXzFfRElTUFJFTERORSA9IDB4MDAwMDgwMDAsIC8vIERpc3AgcmVsb2MgYXBwbGllZCBhdCBidWlsZCB0aW1lLgorICBERl8xX0RJU1BSRUxQTkQgPSAweDAwMDEwMDAwLCAvLyBEaXNwIHJlbG9jIGFwcGxpZWQgYXQgcnVuLXRpbWUuCisgIERGXzFfTk9ESVJFQ1QgPSAweDAwMDIwMDAwLCAgIC8vIE9iamVjdCBoYXMgbm8tZGlyZWN0IGJpbmRpbmcuCisgIERGXzFfSUdOTVVMREVGID0gMHgwMDA0MDAwMCwKKyAgREZfMV9OT0tTWU1TID0gMHgwMDA4MDAwMCwKKyAgREZfMV9OT0hEUiA9IDB4MDAxMDAwMDAsCisgIERGXzFfRURJVEVEID0gMHgwMDIwMDAwMCwgLy8gT2JqZWN0IGlzIG1vZGlmaWVkIGFmdGVyIGJ1aWx0LgorICBERl8xX05PUkVMT0MgPSAweDAwNDAwMDAwLAorICBERl8xX1NZTUlOVFBPU0UgPSAweDAwODAwMDAwLCAvLyBPYmplY3QgaGFzIGluZGl2aWR1YWwgaW50ZXJwb3NlcnMuCisgIERGXzFfR0xPQkFVRElUID0gMHgwMTAwMDAwMCwgIC8vIEdsb2JhbCBhdWRpdGluZyByZXF1aXJlZC4KKyAgREZfMV9TSU5HTEVUT04gPSAweDAyMDAwMDAwICAgLy8gU2luZ2xldG9uIHN5bWJvbHMgYXJlIHVzZWQuCit9OworCisvLyBEVF9NSVBTX0ZMQUdTIHZhbHVlcy4KK2VudW0geworICBSSEZfTk9ORSA9IDB4MDAwMDAwMDAsICAgICAgICAgICAgICAgICAgIC8vIE5vIGZsYWdzLgorICBSSEZfUVVJQ0tTVEFSVCA9IDB4MDAwMDAwMDEsICAgICAgICAgICAgIC8vIFVzZXMgc2hvcnRjdXQgcG9pbnRlcnMuCisgIFJIRl9OT1RQT1QgPSAweDAwMDAwMDAyLCAgICAgICAgICAgICAgICAgLy8gSGFzaCBzaXplIGlzIG5vdCBhIHBvd2VyIG9mIHR3by4KKyAgUkhTX05PX0xJQlJBUllfUkVQTEFDRU1FTlQgPSAweDAwMDAwMDA0LCAvLyBJZ25vcmUgTERfTElCUkFSWV9QQVRILgorICBSSEZfTk9fTU9WRSA9IDB4MDAwMDAwMDgsICAgICAgICAgICAgICAgIC8vIERTTyBhZGRyZXNzIG1heSBub3QgYmUgcmVsb2NhdGVkLgorICBSSEZfU0dJX09OTFkgPSAweDAwMDAwMDEwLCAgICAgICAgICAgICAgIC8vIFNHSSBzcGVjaWZpYyBmZWF0dXJlcy4KKyAgUkhGX0dVQVJBTlRFRV9JTklUID0gMHgwMDAwMDAyMCwgICAgICAgICAvLyBHdWFyYW50ZWUgdGhhdCAuaW5pdCB3aWxsIGZpbmlzaAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGV4ZWN1dGluZyBiZWZvcmUgYW55IG5vbi1pbml0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29kZSBpbiBEU08gaXMgY2FsbGVkLgorICBSSEZfREVMVEFfQ19QTFVTX1BMVVMgPSAweDAwMDAwMDQwLCAgICAgIC8vIENvbnRhaW5zIERlbHRhIEMrKyBjb2RlLgorICBSSEZfR1VBUkFOVEVFX1NUQVJUX0lOSVQgPSAweDAwMDAwMDgwLCAgIC8vIEd1YXJhbnRlZSB0aGF0IC5pbml0IHdpbGwgc3RhcnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBleGVjdXRpbmcgYmVmb3JlIGFueSBub24taW5pdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvZGUgaW4gRFNPIGlzIGNhbGxlZC4KKyAgUkhGX1BJWElFID0gMHgwMDAwMDEwMCwgICAgICAgICAgICAgICAgICAvLyBHZW5lcmF0ZWQgYnkgcGl4aWUuCisgIFJIRl9ERUZBVUxUX0RFTEFZX0xPQUQgPSAweDAwMDAwMjAwLCAgICAgLy8gRGVsYXktbG9hZCBEU08gYnkgZGVmYXVsdC4KKyAgUkhGX1JFUVVJQ0tTVEFSVCA9IDB4MDAwMDA0MDAsICAgICAgICAgICAvLyBPYmplY3QgbWF5IGJlIHJlcXVpY2tzdGFydGVkCisgIFJIRl9SRVFVSUNLU1RBUlRFRCA9IDB4MDAwMDA4MDAsICAgICAgICAgLy8gT2JqZWN0IGhhcyBiZWVuIHJlcXVpY2tzdGFydGVkCisgIFJIRl9DT1JEID0gMHgwMDAwMTAwMCwgICAgICAgICAgICAgICAgICAgLy8gR2VuZXJhdGVkIGJ5IGNvcmQuCisgIFJIRl9OT19VTlJFU19VTkRFRiA9IDB4MDAwMDIwMDAsICAgICAgICAgLy8gT2JqZWN0IGNvbnRhaW5zIG5vIHVucmVzb2x2ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmRlZiBzeW1ib2xzLgorICBSSEZfUkxEX09SREVSX1NBRkUgPSAweDAwMDA0MDAwICAgICAgICAgIC8vIFN5bWJvbCB0YWJsZSBpcyBpbiBhIHNhZmUgb3JkZXIuCit9OworCisvLyBFbGZYWF9WZXJEZWYgc3RydWN0dXJlIHZlcnNpb24gKEdOVSB2ZXJzaW9uaW5nKQorZW51bSB7IFZFUl9ERUZfTk9ORSA9IDAsIFZFUl9ERUZfQ1VSUkVOVCA9IDEgfTsKKworLy8gVmVyRGVmIEZsYWdzIChFbGZYWF9WZXJEZWY6OnZkX2ZsYWdzKQorZW51bSB7IFZFUl9GTEdfQkFTRSA9IDB4MSwgVkVSX0ZMR19XRUFLID0gMHgyLCBWRVJfRkxHX0lORk8gPSAweDQgfTsKKworLy8gU3BlY2lhbCBjb25zdGFudHMgZm9yIHRoZSB2ZXJzaW9uIHRhYmxlLiAoU0hUX0dOVV92ZXJzeW0vLmdudS52ZXJzaW9uKQorZW51bSB7CisgIFZFUl9ORFhfTE9DQUwgPSAwLCAgICAgICAvLyBVbnZlcnNpb25lZCBsb2NhbCBzeW1ib2wKKyAgVkVSX05EWF9HTE9CQUwgPSAxLCAgICAgIC8vIFVudmVyc2lvbmVkIGdsb2JhbCBzeW1ib2wKKyAgVkVSU1lNX1ZFUlNJT04gPSAweDdmZmYsIC8vIFZlcnNpb24gSW5kZXggbWFzaworICBWRVJTWU1fSElEREVOID0gMHg4MDAwICAgLy8gSGlkZGVuIGJpdCAobm9uLWRlZmF1bHQgdmVyc2lvbikKK307CisKKy8vIEVsZlhYX1Zlck5lZWQgc3RydWN0dXJlIHZlcnNpb24gKEdOVSB2ZXJzaW9uaW5nKQorZW51bSB7IFZFUl9ORUVEX05PTkUgPSAwLCBWRVJfTkVFRF9DVVJSRU5UID0gMSB9OworCisvLyBTSFRfTk9URSBzZWN0aW9uIHR5cGVzCitlbnVtIHsKKyAgTlRfRlJFRUJTRF9USFJNSVNDID0gNywKKyAgTlRfRlJFRUJTRF9QUk9DU1RBVF9QUk9DID0gOCwKKyAgTlRfRlJFRUJTRF9QUk9DU1RBVF9GSUxFUyA9IDksCisgIE5UX0ZSRUVCU0RfUFJPQ1NUQVRfVk1NQVAgPSAxMCwKKyAgTlRfRlJFRUJTRF9QUk9DU1RBVF9HUk9VUFMgPSAxMSwKKyAgTlRfRlJFRUJTRF9QUk9DU1RBVF9VTUFTSyA9IDEyLAorICBOVF9GUkVFQlNEX1BST0NTVEFUX1JMSU1JVCA9IDEzLAorICBOVF9GUkVFQlNEX1BST0NTVEFUX09TUkVMID0gMTQsCisgIE5UX0ZSRUVCU0RfUFJPQ1NUQVRfUFNTVFJJTkdTID0gMTUsCisgIE5UX0ZSRUVCU0RfUFJPQ1NUQVRfQVVYViA9IDE2LAorfTsKKworZW51bSB7CisgIE5UX0dOVV9BQklfVEFHID0gMSwKKyAgTlRfR05VX0hXQ0FQID0gMiwKKyAgTlRfR05VX0JVSUxEX0lEID0gMywKKyAgTlRfR05VX0dPTERfVkVSU0lPTiA9IDQsCisgIE5UX0dOVV9QUk9QRVJUWV9UWVBFXzAgPSA1LAorfTsKKworLy8gUHJvcGVydHkgdHlwZXMgdXNlZCBpbiBHTlVfUFJPUEVSVFlfVFlQRV8wIG5vdGVzLgorZW51bSB7CisgIEdOVV9QUk9QRVJUWV9TVEFDS19TSVpFID0gMSwKKyAgR05VX1BST1BFUlRZX05PX0NPUFlfT05fUFJPVEVDVEVEID0gMiwKK307CisKKy8vIEFNREdQVSBzcGVjaWZpYyBub3Rlcy4KK2VudW0geworICAvLyBOb3RlIHR5cGVzIHdpdGggdmFsdWVzIGJldHdlZW4gMCBhbmQgOSAoaW5jbHVzaXZlKSBhcmUgcmVzZXJ2ZWQuCisgIE5UX0FNRF9BTURHUFVfSFNBX01FVEFEQVRBID0gMTAsCisgIE5UX0FNRF9BTURHUFVfSVNBID0gMTEsCisgIE5UX0FNRF9BTURHUFVfUEFMX01FVEFEQVRBID0gMTIKK307CisKK2VudW0geworICBHTlVfQUJJX1RBR19MSU5VWCA9IDAsCisgIEdOVV9BQklfVEFHX0hVUkQgPSAxLAorICBHTlVfQUJJX1RBR19TT0xBUklTID0gMiwKKyAgR05VX0FCSV9UQUdfRlJFRUJTRCA9IDMsCisgIEdOVV9BQklfVEFHX05FVEJTRCA9IDQsCisgIEdOVV9BQklfVEFHX1NZTExBQkxFID0gNSwKKyAgR05VX0FCSV9UQUdfTkFDTCA9IDYsCit9OworCisvLyBBbmRyb2lkIHBhY2tlZCByZWxvY2F0aW9uIGdyb3VwIGZsYWdzLgorZW51bSB7CisgIFJFTE9DQVRJT05fR1JPVVBFRF9CWV9JTkZPX0ZMQUcgPSAxLAorICBSRUxPQ0FUSU9OX0dST1VQRURfQllfT0ZGU0VUX0RFTFRBX0ZMQUcgPSAyLAorICBSRUxPQ0FUSU9OX0dST1VQRURfQllfQURERU5EX0ZMQUcgPSA0LAorICBSRUxPQ0FUSU9OX0dST1VQX0hBU19BRERFTkRfRkxBRyA9IDgsCit9OworCisvLyBDb21wcmVzc2VkIHNlY3Rpb24gaGVhZGVyIGZvciBFTEYzMi4KK3N0cnVjdCBFbGYzMl9DaGRyIHsKKyAgRWxmMzJfV29yZCBjaF90eXBlOworICBFbGYzMl9Xb3JkIGNoX3NpemU7CisgIEVsZjMyX1dvcmQgY2hfYWRkcmFsaWduOworfTsKKworLy8gQ29tcHJlc3NlZCBzZWN0aW9uIGhlYWRlciBmb3IgRUxGNjQuCitzdHJ1Y3QgRWxmNjRfQ2hkciB7CisgIEVsZjY0X1dvcmQgY2hfdHlwZTsKKyAgRWxmNjRfV29yZCBjaF9yZXNlcnZlZDsKKyAgRWxmNjRfWHdvcmQgY2hfc2l6ZTsKKyAgRWxmNjRfWHdvcmQgY2hfYWRkcmFsaWduOworfTsKKworLy8gTm9kZSBoZWFkZXIgZm9yIEVMRjMyLgorc3RydWN0IEVsZjMyX05oZHIgeworICBFbGYzMl9Xb3JkIG5fbmFtZXN6OworICBFbGYzMl9Xb3JkIG5fZGVzY3N6OworICBFbGYzMl9Xb3JkIG5fdHlwZTsKK307CisKKy8vIE5vZGUgaGVhZGVyIGZvciBFTEY2NC4KK3N0cnVjdCBFbGY2NF9OaGRyIHsKKyAgRWxmNjRfV29yZCBuX25hbWVzejsKKyAgRWxmNjRfV29yZCBuX2Rlc2NzejsKKyAgRWxmNjRfV29yZCBuX3R5cGU7Cit9OworCisvLyBMZWdhbCB2YWx1ZXMgZm9yIGNoX3R5cGUgZmllbGQgb2YgY29tcHJlc3NlZCBzZWN0aW9uIGhlYWRlci4KK2VudW0geworICBFTEZDT01QUkVTU19aTElCID0gMSwgICAgICAgICAgICAvLyBaTElCL0RFRkxBVEUgYWxnb3JpdGhtLgorICBFTEZDT01QUkVTU19MT09TID0gMHg2MDAwMDAwMCwgICAvLyBTdGFydCBvZiBPUy1zcGVjaWZpYy4KKyAgRUxGQ09NUFJFU1NfSElPUyA9IDB4NmZmZmZmZmYsICAgLy8gRW5kIG9mIE9TLXNwZWNpZmljLgorICBFTEZDT01QUkVTU19MT1BST0MgPSAweDcwMDAwMDAwLCAvLyBTdGFydCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMuCisgIEVMRkNPTVBSRVNTX0hJUFJPQyA9IDB4N2ZmZmZmZmYgIC8vIEVuZCBvZiBwcm9jZXNzb3Itc3BlY2lmaWMuCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRUxGCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9CSU5BUllGT1JNQVRfRUxGX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9BQXJjaDY0LmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9BQXJjaDY0LmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWZjZDdkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL0FBcmNoNjQuZGVmCkBAIC0wLDAgKzEsMjE4IEBACisKKyNpZm5kZWYgRUxGX1JFTE9DCisjZXJyb3IgIkVMRl9SRUxPQyBtdXN0IGJlIGRlZmluZWQiCisjZW5kaWYKKworLy8gQmFzZWQgb24gQUJJIHJlbGVhc2UgMS4xLWJldGEsIGRhdGVkIDYgTm92ZW1iZXIgMjAxMy4gTkI6IFRoZSBjb3ZlciBwYWdlIG9mCisvLyB0aGlzIGRvY3VtZW50LCBJSEkwMDU2Q19iZXRhX2FhZWxmNjQucGRmLCBvbiBpbmZvY2VudGVyLmFybS5jb20sIHN0aWxsCisvLyBsYWJlbHMgdGhpcyBhcyByZWxlYXNlIDEuMC4KK0VMRl9SRUxPQyhSX0FBUkNINjRfTk9ORSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApCitFTEZfUkVMT0MoUl9BQVJDSDY0X0FCUzY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTAxKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9BQlMzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwMikKK0VMRl9SRUxPQyhSX0FBUkNINjRfQUJTMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDMpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1BSRUw2NCwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTA0KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QUkVMMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAweDEwNSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUFJFTDE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMDYpCitFTEZfUkVMT0MoUl9BQVJDSDY0X01PVldfVUFCU19HMCwgICAgICAgICAgICAgICAgICAgIDB4MTA3KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9NT1ZXX1VBQlNfRzBfTkMsICAgICAgICAgICAgICAgICAweDEwOCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfTU9WV19VQUJTX0cxLCAgICAgICAgICAgICAgICAgICAgMHgxMDkpCitFTEZfUkVMT0MoUl9BQVJDSDY0X01PVldfVUFCU19HMV9OQywgICAgICAgICAgICAgICAgIDB4MTBhKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9NT1ZXX1VBQlNfRzIsICAgICAgICAgICAgICAgICAgICAweDEwYikKK0VMRl9SRUxPQyhSX0FBUkNINjRfTU9WV19VQUJTX0cyX05DLCAgICAgICAgICAgICAgICAgMHgxMGMpCitFTEZfUkVMT0MoUl9BQVJDSDY0X01PVldfVUFCU19HMywgICAgICAgICAgICAgICAgICAgIDB4MTBkKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9NT1ZXX1NBQlNfRzAsICAgICAgICAgICAgICAgICAgICAweDEwZSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfTU9WV19TQUJTX0cxLCAgICAgICAgICAgICAgICAgICAgMHgxMGYpCitFTEZfUkVMT0MoUl9BQVJDSDY0X01PVldfU0FCU19HMiwgICAgICAgICAgICAgICAgICAgIDB4MTEwKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9MRF9QUkVMX0xPMTksICAgICAgICAgICAgICAgICAgICAweDExMSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfQURSX1BSRUxfTE8yMSwgICAgICAgICAgICAgICAgICAgMHgxMTIpCitFTEZfUkVMT0MoUl9BQVJDSDY0X0FEUl9QUkVMX1BHX0hJMjEsICAgICAgICAgICAgICAgIDB4MTEzKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9BRFJfUFJFTF9QR19ISTIxX05DLCAgICAgICAgICAgICAweDExNCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfQUREX0FCU19MTzEyX05DLCAgICAgICAgICAgICAgICAgMHgxMTUpCitFTEZfUkVMT0MoUl9BQVJDSDY0X0xEU1Q4X0FCU19MTzEyX05DLCAgICAgICAgICAgICAgIDB4MTE2KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UU1RCUjE0LCAgICAgICAgICAgICAgICAgICAgICAgICAweDExNykKK0VMRl9SRUxPQyhSX0FBUkNINjRfQ09OREJSMTksICAgICAgICAgICAgICAgICAgICAgICAgMHgxMTgpCitFTEZfUkVMT0MoUl9BQVJDSDY0X0pVTVAyNiwgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTFhKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9DQUxMMjYsICAgICAgICAgICAgICAgICAgICAgICAgICAweDExYikKK0VMRl9SRUxPQyhSX0FBUkNINjRfTERTVDE2X0FCU19MTzEyX05DLCAgICAgICAgICAgICAgMHgxMWMpCitFTEZfUkVMT0MoUl9BQVJDSDY0X0xEU1QzMl9BQlNfTE8xMl9OQywgICAgICAgICAgICAgIDB4MTFkKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9MRFNUNjRfQUJTX0xPMTJfTkMsICAgICAgICAgICAgICAweDExZSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfTU9WV19QUkVMX0cwLCAgICAgICAgICAgICAgICAgICAgMHgxMWYpCitFTEZfUkVMT0MoUl9BQVJDSDY0X01PVldfUFJFTF9HMF9OQywgICAgICAgICAgICAgICAgIDB4MTIwKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9NT1ZXX1BSRUxfRzEsICAgICAgICAgICAgICAgICAgICAweDEyMSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfTU9WV19QUkVMX0cxX05DLCAgICAgICAgICAgICAgICAgMHgxMjIpCitFTEZfUkVMT0MoUl9BQVJDSDY0X01PVldfUFJFTF9HMiwgICAgICAgICAgICAgICAgICAgIDB4MTIzKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9NT1ZXX1BSRUxfRzJfTkMsICAgICAgICAgICAgICAgICAweDEyNCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfTU9WV19QUkVMX0czLCAgICAgICAgICAgICAgICAgICAgMHgxMjUpCitFTEZfUkVMT0MoUl9BQVJDSDY0X0xEU1QxMjhfQUJTX0xPMTJfTkMsICAgICAgICAgICAgIDB4MTJiKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9NT1ZXX0dPVE9GRl9HMCwgICAgICAgICAgICAgICAgICAweDEyYykKK0VMRl9SRUxPQyhSX0FBUkNINjRfTU9WV19HT1RPRkZfRzBfTkMsICAgICAgICAgICAgICAgMHgxMmQpCitFTEZfUkVMT0MoUl9BQVJDSDY0X01PVldfR09UT0ZGX0cxLCAgICAgICAgICAgICAgICAgIDB4MTJlKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9NT1ZXX0dPVE9GRl9HMV9OQywgICAgICAgICAgICAgICAweDEyZikKK0VMRl9SRUxPQyhSX0FBUkNINjRfTU9WV19HT1RPRkZfRzIsICAgICAgICAgICAgICAgICAgMHgxMzApCitFTEZfUkVMT0MoUl9BQVJDSDY0X01PVldfR09UT0ZGX0cyX05DLCAgICAgICAgICAgICAgIDB4MTMxKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9NT1ZXX0dPVE9GRl9HMywgICAgICAgICAgICAgICAgICAweDEzMikKK0VMRl9SRUxPQyhSX0FBUkNINjRfR09UUkVMNjQsICAgICAgICAgICAgICAgICAgICAgICAgMHgxMzMpCitFTEZfUkVMT0MoUl9BQVJDSDY0X0dPVFJFTDMyLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MTM0KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9HT1RfTERfUFJFTDE5LCAgICAgICAgICAgICAgICAgICAweDEzNSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfTEQ2NF9HT1RPRkZfTE8xNSwgICAgICAgICAgICAgICAgMHgxMzYpCitFTEZfUkVMT0MoUl9BQVJDSDY0X0FEUl9HT1RfUEFHRSwgICAgICAgICAgICAgICAgICAgIDB4MTM3KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9MRDY0X0dPVF9MTzEyX05DLCAgICAgICAgICAgICAgICAweDEzOCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfTEQ2NF9HT1RQQUdFX0xPMTUsICAgICAgICAgICAgICAgMHgxMzkpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0dEX0FEUl9QUkVMMjEsICAgICAgICAgICAgICAgIDB4MjAwKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNHRF9BRFJfUEFHRTIxLCAgICAgICAgICAgICAgICAweDIwMSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTR0RfQUREX0xPMTJfTkMsICAgICAgICAgICAgICAgMHgyMDIpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0dEX01PVldfRzEsICAgICAgICAgICAgICAgICAgIDB4MjAzKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNHRF9NT1ZXX0cwX05DLCAgICAgICAgICAgICAgICAweDIwNCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTERfQURSX1BSRUwyMSwgICAgICAgICAgICAgICAgMHgyMDUpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xEX0FEUl9QQUdFMjEsICAgICAgICAgICAgICAgIDB4MjA2KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRF9BRERfTE8xMl9OQywgICAgICAgICAgICAgICAweDIwNykKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTERfTU9WV19HMSwgICAgICAgICAgICAgICAgICAgMHgyMDgpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xEX01PVldfRzBfTkMsICAgICAgICAgICAgICAgIDB4MjA5KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRF9MRF9QUkVMMTksICAgICAgICAgICAgICAgICAweDIwYSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTERfTU9WV19EVFBSRUxfRzIsICAgICAgICAgICAgMHgyMGIpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xEX01PVldfRFRQUkVMX0cxLCAgICAgICAgICAgIDB4MjBjKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRF9NT1ZXX0RUUFJFTF9HMV9OQywgICAgICAgICAweDIwZCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTERfTU9WV19EVFBSRUxfRzAsICAgICAgICAgICAgMHgyMGUpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xEX01PVldfRFRQUkVMX0cwX05DLCAgICAgICAgIDB4MjBmKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRF9BRERfRFRQUkVMX0hJMTIsICAgICAgICAgICAweDIxMCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTERfQUREX0RUUFJFTF9MTzEyLCAgICAgICAgICAgMHgyMTEpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xEX0FERF9EVFBSRUxfTE8xMl9OQywgICAgICAgIDB4MjEyKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRF9MRFNUOF9EVFBSRUxfTE8xMiwgICAgICAgICAweDIxMykKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTERfTERTVDhfRFRQUkVMX0xPMTJfTkMsICAgICAgMHgyMTQpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xEX0xEU1QxNl9EVFBSRUxfTE8xMiwgICAgICAgIDB4MjE1KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRF9MRFNUMTZfRFRQUkVMX0xPMTJfTkMsICAgICAweDIxNikKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTERfTERTVDMyX0RUUFJFTF9MTzEyLCAgICAgICAgMHgyMTcpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xEX0xEU1QzMl9EVFBSRUxfTE8xMl9OQywgICAgIDB4MjE4KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRF9MRFNUNjRfRFRQUkVMX0xPMTIsICAgICAgICAweDIxOSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTERfTERTVDY0X0RUUFJFTF9MTzEyX05DLCAgICAgMHgyMWEpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0lFX01PVldfR09UVFBSRUxfRzEsICAgICAgICAgIDB4MjFiKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNJRV9NT1ZXX0dPVFRQUkVMX0cwX05DLCAgICAgICAweDIxYykKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTSUVfQURSX0dPVFRQUkVMX1BBR0UyMSwgICAgICAgMHgyMWQpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0lFX0xENjRfR09UVFBSRUxfTE8xMl9OQywgICAgIDB4MjFlKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNJRV9MRF9HT1RUUFJFTF9QUkVMMTksICAgICAgICAweDIxZikKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTEVfTU9WV19UUFJFTF9HMiwgICAgICAgICAgICAgMHgyMjApCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xFX01PVldfVFBSRUxfRzEsICAgICAgICAgICAgIDB4MjIxKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRV9NT1ZXX1RQUkVMX0cxX05DLCAgICAgICAgICAweDIyMikKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTEVfTU9WV19UUFJFTF9HMCwgICAgICAgICAgICAgMHgyMjMpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xFX01PVldfVFBSRUxfRzBfTkMsICAgICAgICAgIDB4MjI0KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRV9BRERfVFBSRUxfSEkxMiwgICAgICAgICAgICAweDIyNSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTEVfQUREX1RQUkVMX0xPMTIsICAgICAgICAgICAgMHgyMjYpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xFX0FERF9UUFJFTF9MTzEyX05DLCAgICAgICAgIDB4MjI3KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRV9MRFNUOF9UUFJFTF9MTzEyLCAgICAgICAgICAweDIyOCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTEVfTERTVDhfVFBSRUxfTE8xMl9OQywgICAgICAgMHgyMjkpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xFX0xEU1QxNl9UUFJFTF9MTzEyLCAgICAgICAgIDB4MjJhKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRV9MRFNUMTZfVFBSRUxfTE8xMl9OQywgICAgICAweDIyYikKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTEVfTERTVDMyX1RQUkVMX0xPMTIsICAgICAgICAgMHgyMmMpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xFX0xEU1QzMl9UUFJFTF9MTzEyX05DLCAgICAgIDB4MjJkKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRV9MRFNUNjRfVFBSRUxfTE8xMiwgICAgICAgICAweDIyZSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTEVfTERTVDY0X1RQUkVMX0xPMTJfTkMsICAgICAgMHgyMmYpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0RFU0NfTERfUFJFTDE5LCAgICAgICAgICAgICAgIDB4MjMwKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNERVNDX0FEUl9QUkVMMjEsICAgICAgICAgICAgICAweDIzMSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTREVTQ19BRFJfUEFHRTIxLCAgICAgICAgICAgICAgMHgyMzIpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0RFU0NfTEQ2NF9MTzEyLCAgICAgICAgICAgICAgIDB4MjMzKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNERVNDX0FERF9MTzEyLCAgICAgICAgICAgICAgICAweDIzNCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTREVTQ19PRkZfRzEsICAgICAgICAgICAgICAgICAgMHgyMzUpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0RFU0NfT0ZGX0cwX05DLCAgICAgICAgICAgICAgIDB4MjM2KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNERVNDX0xEUiwgICAgICAgICAgICAgICAgICAgICAweDIzNykKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTREVTQ19BREQsICAgICAgICAgICAgICAgICAgICAgMHgyMzgpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0RFU0NfQ0FMTCwgICAgICAgICAgICAgICAgICAgIDB4MjM5KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRV9MRFNUMTI4X1RQUkVMX0xPMTIsICAgICAgICAweDIzYSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTTEVfTERTVDEyOF9UUFJFTF9MTzEyX05DLCAgICAgMHgyM2IpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0xEX0xEU1QxMjhfRFRQUkVMX0xPMTIsICAgICAgIDB4MjNjKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNMRF9MRFNUMTI4X0RUUFJFTF9MTzEyX05DLCAgICAweDIzZCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfQ09QWSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDApCitFTEZfUkVMT0MoUl9BQVJDSDY0X0dMT0JfREFULCAgICAgICAgICAgICAgICAgICAgICAgIDB4NDAxKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9KVU1QX1NMT1QsICAgICAgICAgICAgICAgICAgICAgICAweDQwMikKK0VMRl9SRUxPQyhSX0FBUkNINjRfUkVMQVRJVkUsICAgICAgICAgICAgICAgICAgICAgICAgMHg0MDMpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU19EVFBSRUw2NCwgICAgICAgICAgICAgICAgICAgIDB4NDA0KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9UTFNfRFRQTU9ENjQsICAgICAgICAgICAgICAgICAgICAweDQwNSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfVExTX1RQUkVMNjQsICAgICAgICAgICAgICAgICAgICAgMHg0MDYpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1RMU0RFU0MsICAgICAgICAgICAgICAgICAgICAgICAgIDB4NDA3KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9JUkVMQVRJVkUsICAgICAgICAgICAgICAgICAgICAgICAweDQwOCkKKworLy8gRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfTk9ORSwgICAgICAgICAgICAgICAgICAgICAgICAgMCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX0FCUzMyLCAgICAgICAgICAgICAgICAgICAgICAgMHgwMDEpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9BQlMxNiwgICAgICAgICAgICAgICAgICAgICAgIDB4MDAyKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfUFJFTDMyLCAgICAgICAgICAgICAgICAgICAgICAweDAwMykKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1BSRUwxNiwgICAgICAgICAgICAgICAgICAgICAgMHgwMDQpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9NT1ZXX1VBQlNfRzAsICAgICAgICAgICAgICAgIDB4MDA1KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfTU9WV19VQUJTX0cwX05DLCAgICAgICAgICAgICAweDAwNikKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX01PVldfVUFCU19HMSwgICAgICAgICAgICAgICAgMHgwMDcpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9NT1ZXX1NBQlNfRzAsICAgICAgICAgICAgICAgIDB4MDA4KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfTERfUFJFTF9MTzE5LCAgICAgICAgICAgICAgICAweDAwOSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX0FEUl9QUkVMX0xPMjEsICAgICAgICAgICAgICAgMHgwMGEpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9BRFJfUFJFTF9QR19ISTIxLCAgICAgICAgICAgIDB4MDBiKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfQUREX0FCU19MTzEyX05DLCAgICAgICAgICAgICAweDAwYykKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX0xEU1Q4X0FCU19MTzEyX05DLCAgICAgICAgICAgMHgwMGQpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9MRFNUMTZfQUJTX0xPMTJfTkMsICAgICAgICAgIDB4MDBlKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfTERTVDMyX0FCU19MTzEyX05DLCAgICAgICAgICAweDAwZikKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX0xEU1Q2NF9BQlNfTE8xMl9OQywgICAgICAgICAgMHgwMTApCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9MRFNUMTI4X0FCU19MTzEyX05DLCAgICAgICAgIDB4MDExKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVFNUQlIxNCwgICAgICAgICAgICAgICAgICAgICAweDAxMikKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX0NPTkRCUjE5LCAgICAgICAgICAgICAgICAgICAgMHgwMTMpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9KVU1QMjYsICAgICAgICAgICAgICAgICAgICAgIDB4MDE0KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfQ0FMTDI2LCAgICAgICAgICAgICAgICAgICAgICAweDAxNSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX01PVldfUFJFTF9HMCwgICAgICAgICAgICAgICAgMHgwMTYpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9NT1ZXX1BSRUxfRzBfTkMsICAgICAgICAgICAgIDB4MDE3KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfTU9WV19QUkVMX0cxLCAgICAgICAgICAgICAgICAweDAxOCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX0dPVF9MRF9QUkVMMTksICAgICAgICAgICAgICAgMHgwMTkpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9BRFJfR09UX1BBR0UsICAgICAgICAgICAgICAgIDB4MDFhKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfTEQzMl9HT1RfTE8xMl9OQywgICAgICAgICAgICAweDAxYikKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX0xEMzJfR09UUEFHRV9MTzE0LCAgICAgICAgICAgMHgwMWMpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNHRF9BRFJfUFJFTDIxLCAgICAgICAgICAgIDB4MDUwKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTR0RfQURSX1BBR0UyMSwgICAgICAgICAgICAweDA1MSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0dEX0FERF9MTzEyX05DLCAgICAgICAgICAgMHgwNTIpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRF9BRFJfUFJFTDIxLCAgICAgICAgICAgIDB4MDUzKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTERfQURSX1BBR0UyMSwgICAgICAgICAgICAweDA1NCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xEX0FERF9MTzEyX05DLCAgICAgICAgICAgMHgwNTUpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRF9MRF9QUkVMMTksICAgICAgICAgICAgIDB4MDU2KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTERfTU9WV19EVFBSRUxfRzEsICAgICAgICAweDA1NykKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xEX01PVldfRFRQUkVMX0cwLCAgICAgICAgMHgwNTgpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRF9NT1ZXX0RUUFJFTF9HMF9OQywgICAgIDB4MDU5KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTERfQUREX0RUUFJFTF9ISTEyLCAgICAgICAweDA1YSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xEX0FERF9EVFBSRUxfTE8xMiwgICAgICAgMHgwNWIpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRF9BRERfRFRQUkVMX0xPMTJfTkMsICAgIDB4MDVjKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTERfTERTVDhfRFRQUkVMX0xPMTIsICAgICAweDA1ZCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xEX0xEU1Q4X0RUUFJFTF9MTzEyX05DLCAgMHgwNWUpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRF9MRFNUMTZfRFRQUkVMX0xPMTIsICAgIDB4MDVmKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTERfTERTVDE2X0RUUFJFTF9MTzEyX05DLCAweDA2MCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xEX0xEU1QzMl9EVFBSRUxfTE8xMiwgICAgMHgwNjEpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRF9MRFNUMzJfRFRQUkVMX0xPMTJfTkMsIDB4MDYyKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTERfTERTVDY0X0RUUFJFTF9MTzEyLCAgICAweDA2MykKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xEX0xEU1Q2NF9EVFBSRUxfTE8xMl9OQywgMHgwNjQpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRF9MRFNUMTI4X0RUUFJFTF9MTzEyLCAgIDB4MDY1KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTERfTERTVDEyOF9EVFBSRUxfTE8xMl9OQywweDA2NikKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0lFX0FEUl9HT1RUUFJFTF9QQUdFMjEsICAgMHgwNjcpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNJRV9MRDMyX0dPVFRQUkVMX0xPMTJfTkMsIDB4MDY4KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTSUVfTERfR09UVFBSRUxfUFJFTDE5LCAgICAweDA2OSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xFX01PVldfVFBSRUxfRzEsICAgICAgICAgMHgwNmEpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRV9NT1ZXX1RQUkVMX0cwLCAgICAgICAgIDB4MDZiKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTEVfTU9WV19UUFJFTF9HMF9OQywgICAgICAweDA2YykKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xFX0FERF9UUFJFTF9ISTEyLCAgICAgICAgMHgwNmQpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRV9BRERfVFBSRUxfTE8xMiwgICAgICAgIDB4MDZlKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTEVfQUREX1RQUkVMX0xPMTJfTkMsICAgICAweDA2ZikKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xFX0xEU1Q4X1RQUkVMX0xPMTIsICAgICAgMHgwNzApCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRV9MRFNUOF9UUFJFTF9MTzEyX05DLCAgIDB4MDcxKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTEVfTERTVDE2X1RQUkVMX0xPMTIsICAgICAweDA3MikKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xFX0xEU1QxNl9UUFJFTF9MTzEyX05DLCAgMHgwNzMpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRV9MRFNUMzJfVFBSRUxfTE8xMiwgICAgIDB4MDc0KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTEVfTERTVDMyX1RQUkVMX0xPMTJfTkMsICAweDA3NSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xFX0xEU1Q2NF9UUFJFTF9MTzEyLCAgICAgMHgwNzYpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNMRV9MRFNUNjRfVFBSRUxfTE8xMl9OQywgIDB4MDc3KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTTEVfTERTVDEyOF9UUFJFTF9MTzEyLCAgICAweDA3OCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0xFX0xEU1QxMjhfVFBSRUxfTE8xMl9OQywgMHgwNzkpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNERVNDX0xEX1BSRUwxOSwgICAgICAgICAgIDB4MDdhKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTREVTQ19BRFJfUFJFTDIxLCAgICAgICAgICAweDA3YikKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0RFU0NfQURSX1BBR0UyMSwgICAgICAgICAgMHgwN2MpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNERVNDX0xEMzJfTE8xMiwgICAgICAgICAgIDB4MDdkKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTREVTQ19BRERfTE8xMiwgICAgICAgICAgICAweDA3ZSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU0RFU0NfQ0FMTCwgICAgICAgICAgICAgICAgMHgwN2YpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9DT1BZLCAgICAgICAgICAgICAgICAgICAgICAgIDB4MGI0KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfR0xPQl9EQVQsICAgICAgICAgICAgICAgICAgICAweDBiNSkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX0pVTVBfU0xPVCwgICAgICAgICAgICAgICAgICAgMHgwYjYpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9SRUxBVElWRSwgICAgICAgICAgICAgICAgICAgIDB4MGI3KQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTX0RUUFJFTCwgICAgICAgICAgICAgICAgICAweDBiOCkKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX1RMU19EVFBNT0QsICAgICAgICAgICAgICAgICAgMHgwYjkpCitFTEZfUkVMT0MoUl9BQVJDSDY0X1AzMl9UTFNfVFBSRUwsICAgICAgICAgICAgICAgICAgIDB4MGJhKQorRUxGX1JFTE9DKFJfQUFSQ0g2NF9QMzJfVExTREVTQywgICAgICAgICAgICAgICAgICAgICAweDBiYikKK0VMRl9SRUxPQyhSX0FBUkNINjRfUDMyX0lSRUxBVElWRSwgICAgICAgICAgICAgICAgICAgMHgwYmMpCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvQU1ER1BVLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9BTURHUFUuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAwYjE5YzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvQU1ER1BVLmRlZgpAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIEVMRl9SRUxPQworI2Vycm9yICJFTEZfUkVMT0MgbXVzdCBiZSBkZWZpbmVkIgorI2VuZGlmCisKK0VMRl9SRUxPQyhSX0FNREdQVV9OT05FLCAgICAgICAgICAgMCkKK0VMRl9SRUxPQyhSX0FNREdQVV9BQlMzMl9MTywgICAgICAgMSkKK0VMRl9SRUxPQyhSX0FNREdQVV9BQlMzMl9ISSwgICAgICAgMikKK0VMRl9SRUxPQyhSX0FNREdQVV9BQlM2NCwgICAgICAgICAgMykKK0VMRl9SRUxPQyhSX0FNREdQVV9SRUwzMiwgICAgICAgICAgNCkKK0VMRl9SRUxPQyhSX0FNREdQVV9SRUw2NCwgICAgICAgICAgNSkKK0VMRl9SRUxPQyhSX0FNREdQVV9BQlMzMiwgICAgICAgICAgNikKK0VMRl9SRUxPQyhSX0FNREdQVV9HT1RQQ1JFTCwgICAgICAgNykKK0VMRl9SRUxPQyhSX0FNREdQVV9HT1RQQ1JFTDMyX0xPLCAgOCkKK0VMRl9SRUxPQyhSX0FNREdQVV9HT1RQQ1JFTDMyX0hJLCAgOSkKK0VMRl9SRUxPQyhSX0FNREdQVV9SRUwzMl9MTywgICAgICAxMCkKK0VMRl9SRUxPQyhSX0FNREdQVV9SRUwzMl9ISSwgICAgICAxMSkKK0VMRl9SRUxPQyhSX0FNREdQVV9SRUxBVElWRTY0LCAgICAxMykKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9BUkMuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL0FSQy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTY5MWZiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9BUkMuZGVmCkBAIC0wLDAgKzEsNzQgQEAKKworI2lmbmRlZiBFTEZfUkVMT0MKKyNlcnJvciAiRUxGX1JFTE9DIG11c3QgYmUgZGVmaW5lZCIKKyNlbmRpZgorCitFTEZfUkVMT0MoUl9BUkNfTk9ORSwgICAgICAgICAgICAgICAgICAwKQorRUxGX1JFTE9DKFJfQVJDXzgsICAgICAgICAgICAgICAgICAgICAgMSkKK0VMRl9SRUxPQyhSX0FSQ18xNiwgICAgICAgICAgICAgICAgICAgIDIpCitFTEZfUkVMT0MoUl9BUkNfMjQsICAgICAgICAgICAgICAgICAgICAzKQorRUxGX1JFTE9DKFJfQVJDXzMyLCAgICAgICAgICAgICAgICAgICAgNCkKK0VMRl9SRUxPQyhSX0FSQ19OOCwgICAgICAgICAgICAgICAgICAgIDgpCitFTEZfUkVMT0MoUl9BUkNfTjE2LCAgICAgICAgICAgICAgICAgICA5KQorRUxGX1JFTE9DKFJfQVJDX04yNCwgICAgICAgICAgICAgICAgICAxMCkKK0VMRl9SRUxPQyhSX0FSQ19OMzIsICAgICAgICAgICAgICAgICAgMTEpCitFTEZfUkVMT0MoUl9BUkNfU0RBLCAgICAgICAgICAgICAgICAgIDEyKQorRUxGX1JFTE9DKFJfQVJDX1NFQ1RPRkYsICAgICAgICAgICAgICAxMykKK0VMRl9SRUxPQyhSX0FSQ19TMjFIX1BDUkVMLCAgICAgICAgICAgMTQpCitFTEZfUkVMT0MoUl9BUkNfUzIxV19QQ1JFTCwgICAgICAgICAgIDE1KQorRUxGX1JFTE9DKFJfQVJDX1MyNUhfUENSRUwsICAgICAgICAgICAxNikKK0VMRl9SRUxPQyhSX0FSQ19TMjVXX1BDUkVMLCAgICAgICAgICAgMTcpCitFTEZfUkVMT0MoUl9BUkNfU0RBMzIsICAgICAgICAgICAgICAgIDE4KQorRUxGX1JFTE9DKFJfQVJDX1NEQV9MRFNULCAgICAgICAgICAgICAxOSkKK0VMRl9SRUxPQyhSX0FSQ19TREFfTERTVDEsICAgICAgICAgICAgMjApCitFTEZfUkVMT0MoUl9BUkNfU0RBX0xEU1QyLCAgICAgICAgICAgIDIxKQorRUxGX1JFTE9DKFJfQVJDX1NEQTE2X0xELCAgICAgICAgICAgICAyMikKK0VMRl9SRUxPQyhSX0FSQ19TREExNl9MRDEsICAgICAgICAgICAgMjMpCitFTEZfUkVMT0MoUl9BUkNfU0RBMTZfTEQyLCAgICAgICAgICAgIDI0KQorRUxGX1JFTE9DKFJfQVJDX1MxM19QQ1JFTCwgICAgICAgICAgICAyNSkKK0VMRl9SRUxPQyhSX0FSQ19XLCAgICAgICAgICAgICAgICAgICAgMjYpCitFTEZfUkVMT0MoUl9BUkNfMzJfTUUsICAgICAgICAgICAgICAgIDI3KQorRUxGX1JFTE9DKFJfQVJDXzMyX01FX1MsICAgICAgICAgICAgIDEwNSkKK0VMRl9SRUxPQyhSX0FSQ19OMzJfTUUsICAgICAgICAgICAgICAgMjgpCitFTEZfUkVMT0MoUl9BUkNfU0VDVE9GRl9NRSwgICAgICAgICAgIDI5KQorRUxGX1JFTE9DKFJfQVJDX1NEQTMyX01FLCAgICAgICAgICAgICAzMCkKK0VMRl9SRUxPQyhSX0FSQ19XX01FLCAgICAgICAgICAgICAgICAgMzEpCitFTEZfUkVMT0MoUl9BQ19TRUNUT0ZGX1U4LCAgICAgICAgICAgIDM1KQorRUxGX1JFTE9DKFJfQUNfU0VDVE9GRl9VOF8xLCAgICAgICAgICAzNikKK0VMRl9SRUxPQyhSX0FDX1NFQ1RPRkZfVThfMiwgICAgICAgICAgMzcpCitFTEZfUkVMT0MoUl9BQ19TRUNUT0ZGX1M5LCAgICAgICAgICAgIDM4KQorRUxGX1JFTE9DKFJfQUNfU0VDVE9GRl9TOV8xLCAgICAgICAgICAzOSkKK0VMRl9SRUxPQyhSX0FDX1NFQ1RPRkZfUzlfMiwgICAgICAgICAgNDApCitFTEZfUkVMT0MoUl9BUkNfU0VDVE9GRl9NRV8xLCAgICAgICAgIDQxKQorRUxGX1JFTE9DKFJfQVJDX1NFQ1RPRkZfTUVfMiwgICAgICAgICA0MikKK0VMRl9SRUxPQyhSX0FSQ19TRUNUT0ZGXzEsICAgICAgICAgICAgNDMpCitFTEZfUkVMT0MoUl9BUkNfU0VDVE9GRl8yLCAgICAgICAgICAgIDQ0KQorRUxGX1JFTE9DKFJfQVJDX1NEQV8xMiwgICAgICAgICAgICAgICA0NSkKK0VMRl9SRUxPQyhSX0FSQ19TREExNl9TVDIsICAgICAgICAgICAgNDgpCitFTEZfUkVMT0MoUl9BUkNfMzJfUENSRUwsICAgICAgICAgICAgIDQ5KQorRUxGX1JFTE9DKFJfQVJDX1BDMzIsICAgICAgICAgICAgICAgICA1MCkKK0VMRl9SRUxPQyhSX0FSQ19HT1QzMiwgICAgICAgICAgICAgICAgNTkpCitFTEZfUkVMT0MoUl9BUkNfR09UUEMzMiwgICAgICAgICAgICAgIDUxKQorRUxGX1JFTE9DKFJfQVJDX1BMVDMyLCAgICAgICAgICAgICAgICA1MikKK0VMRl9SRUxPQyhSX0FSQ19DT1BZLCAgICAgICAgICAgICAgICAgNTMpCitFTEZfUkVMT0MoUl9BUkNfR0xPQl9EQVQsICAgICAgICAgICAgIDU0KQorRUxGX1JFTE9DKFJfQVJDX0pNUF9TTE9ULCAgICAgICAgICAgICA1NSkKK0VMRl9SRUxPQyhSX0FSQ19SRUxBVElWRSwgICAgICAgICAgICAgNTYpCitFTEZfUkVMT0MoUl9BUkNfR09UT0ZGLCAgICAgICAgICAgICAgIDU3KQorRUxGX1JFTE9DKFJfQVJDX0dPVFBDLCAgICAgICAgICAgICAgICA1OCkKK0VMRl9SRUxPQyhSX0FSQ19TMjFXX1BDUkVMX1BMVCwgICAgICAgNjApCitFTEZfUkVMT0MoUl9BUkNfUzI1SF9QQ1JFTF9QTFQsICAgICAgIDYxKQorRUxGX1JFTE9DKFJfQVJDX0pMSV9TRUNUT0ZGLCAgICAgICAgICA2MykKK0VMRl9SRUxPQyhSX0FSQ19UTFNfRFRQTU9ELCAgICAgICAgICAgNjYpCitFTEZfUkVMT0MoUl9BUkNfVExTX1RQT0ZGLCAgICAgICAgICAgIDY4KQorRUxGX1JFTE9DKFJfQVJDX1RMU19HRF9HT1QsICAgICAgICAgICA2OSkKK0VMRl9SRUxPQyhSX0FSQ19UTFNfR0RfTEQsICAgICAgICAgICAgNzApCitFTEZfUkVMT0MoUl9BUkNfVExTX0dEX0NBTEwsICAgICAgICAgIDcxKQorRUxGX1JFTE9DKFJfQVJDX1RMU19JRV9HT1QsICAgICAgICAgICA3MikKK0VMRl9SRUxPQyhSX0FSQ19UTFNfRFRQT0ZGLCAgICAgICAgICAgNjcpCitFTEZfUkVMT0MoUl9BUkNfVExTX0RUUE9GRl9TOSwgICAgICAgIDczKQorRUxGX1JFTE9DKFJfQVJDX1RMU19MRV9TOSwgICAgICAgICAgICA3NCkKK0VMRl9SRUxPQyhSX0FSQ19UTFNfTEVfMzIsICAgICAgICAgICAgNzUpCitFTEZfUkVMT0MoUl9BUkNfUzI1V19QQ1JFTF9QTFQsICAgICAgIDc2KQorRUxGX1JFTE9DKFJfQVJDX1MyMUhfUENSRUxfUExULCAgICAgICA3NykKK0VMRl9SRUxPQyhSX0FSQ19OUFNfQ01FTTE2LCAgICAgICAgICAgNzgpCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvQVJNLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9BUk0uZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczMGZjNWIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvQVJNLmRlZgpAQCAtMCwwICsxLDEzOCBAQAorCisjaWZuZGVmIEVMRl9SRUxPQworI2Vycm9yICJFTEZfUkVMT0MgbXVzdCBiZSBkZWZpbmVkIgorI2VuZGlmCisKKy8vIE1lZXRzIDIuMDkgQUJJIFNwZWNzLgorRUxGX1JFTE9DKFJfQVJNX05PTkUsICAgICAgICAgICAgICAgICAgIDB4MDApCitFTEZfUkVMT0MoUl9BUk1fUEMyNCwgICAgICAgICAgICAgICAgICAgMHgwMSkKK0VMRl9SRUxPQyhSX0FSTV9BQlMzMiwgICAgICAgICAgICAgICAgICAweDAyKQorRUxGX1JFTE9DKFJfQVJNX1JFTDMyLCAgICAgICAgICAgICAgICAgIDB4MDMpCitFTEZfUkVMT0MoUl9BUk1fTERSX1BDX0cwLCAgICAgICAgICAgICAgMHgwNCkKK0VMRl9SRUxPQyhSX0FSTV9BQlMxNiwgICAgICAgICAgICAgICAgICAweDA1KQorRUxGX1JFTE9DKFJfQVJNX0FCUzEyLCAgICAgICAgICAgICAgICAgIDB4MDYpCitFTEZfUkVMT0MoUl9BUk1fVEhNX0FCUzUsICAgICAgICAgICAgICAgMHgwNykKK0VMRl9SRUxPQyhSX0FSTV9BQlM4LCAgICAgICAgICAgICAgICAgICAweDA4KQorRUxGX1JFTE9DKFJfQVJNX1NCUkVMMzIsICAgICAgICAgICAgICAgIDB4MDkpCitFTEZfUkVMT0MoUl9BUk1fVEhNX0NBTEwsICAgICAgICAgICAgICAgMHgwYSkKK0VMRl9SRUxPQyhSX0FSTV9USE1fUEM4LCAgICAgICAgICAgICAgICAweDBiKQorRUxGX1JFTE9DKFJfQVJNX0JSRUxfQURKLCAgICAgICAgICAgICAgIDB4MGMpCitFTEZfUkVMT0MoUl9BUk1fVExTX0RFU0MsICAgICAgICAgICAgICAgMHgwZCkKK0VMRl9SRUxPQyhSX0FSTV9USE1fU1dJOCwgICAgICAgICAgICAgICAweDBlKQorRUxGX1JFTE9DKFJfQVJNX1hQQzI1LCAgICAgICAgICAgICAgICAgIDB4MGYpCitFTEZfUkVMT0MoUl9BUk1fVEhNX1hQQzIyLCAgICAgICAgICAgICAgMHgxMCkKK0VMRl9SRUxPQyhSX0FSTV9UTFNfRFRQTU9EMzIsICAgICAgICAgICAweDExKQorRUxGX1JFTE9DKFJfQVJNX1RMU19EVFBPRkYzMiwgICAgICAgICAgIDB4MTIpCitFTEZfUkVMT0MoUl9BUk1fVExTX1RQT0ZGMzIsICAgICAgICAgICAgMHgxMykKK0VMRl9SRUxPQyhSX0FSTV9DT1BZLCAgICAgICAgICAgICAgICAgICAweDE0KQorRUxGX1JFTE9DKFJfQVJNX0dMT0JfREFULCAgICAgICAgICAgICAgIDB4MTUpCitFTEZfUkVMT0MoUl9BUk1fSlVNUF9TTE9ULCAgICAgICAgICAgICAgMHgxNikKK0VMRl9SRUxPQyhSX0FSTV9SRUxBVElWRSwgICAgICAgICAgICAgICAweDE3KQorRUxGX1JFTE9DKFJfQVJNX0dPVE9GRjMyLCAgICAgICAgICAgICAgIDB4MTgpCitFTEZfUkVMT0MoUl9BUk1fQkFTRV9QUkVMLCAgICAgICAgICAgICAgMHgxOSkKK0VMRl9SRUxPQyhSX0FSTV9HT1RfQlJFTCwgICAgICAgICAgICAgICAweDFhKQorRUxGX1JFTE9DKFJfQVJNX1BMVDMyLCAgICAgICAgICAgICAgICAgIDB4MWIpCitFTEZfUkVMT0MoUl9BUk1fQ0FMTCwgICAgICAgICAgICAgICAgICAgMHgxYykKK0VMRl9SRUxPQyhSX0FSTV9KVU1QMjQsICAgICAgICAgICAgICAgICAweDFkKQorRUxGX1JFTE9DKFJfQVJNX1RITV9KVU1QMjQsICAgICAgICAgICAgIDB4MWUpCitFTEZfUkVMT0MoUl9BUk1fQkFTRV9BQlMsICAgICAgICAgICAgICAgMHgxZikKK0VMRl9SRUxPQyhSX0FSTV9BTFVfUENSRUxfN18wLCAgICAgICAgICAweDIwKQorRUxGX1JFTE9DKFJfQVJNX0FMVV9QQ1JFTF8xNV84LCAgICAgICAgIDB4MjEpCitFTEZfUkVMT0MoUl9BUk1fQUxVX1BDUkVMXzIzXzE1LCAgICAgICAgMHgyMikKK0VMRl9SRUxPQyhSX0FSTV9MRFJfU0JSRUxfMTFfMF9OQywgICAgICAweDIzKQorRUxGX1JFTE9DKFJfQVJNX0FMVV9TQlJFTF8xOV8xMl9OQywgICAgIDB4MjQpCitFTEZfUkVMT0MoUl9BUk1fQUxVX1NCUkVMXzI3XzIwX0NLLCAgICAgMHgyNSkKK0VMRl9SRUxPQyhSX0FSTV9UQVJHRVQxLCAgICAgICAgICAgICAgICAweDI2KQorRUxGX1JFTE9DKFJfQVJNX1NCUkVMMzEsICAgICAgICAgICAgICAgIDB4MjcpCitFTEZfUkVMT0MoUl9BUk1fVjRCWCwgICAgICAgICAgICAgICAgICAgMHgyOCkKK0VMRl9SRUxPQyhSX0FSTV9UQVJHRVQyLCAgICAgICAgICAgICAgICAweDI5KQorRUxGX1JFTE9DKFJfQVJNX1BSRUwzMSwgICAgICAgICAgICAgICAgIDB4MmEpCitFTEZfUkVMT0MoUl9BUk1fTU9WV19BQlNfTkMsICAgICAgICAgICAgMHgyYikKK0VMRl9SRUxPQyhSX0FSTV9NT1ZUX0FCUywgICAgICAgICAgICAgICAweDJjKQorRUxGX1JFTE9DKFJfQVJNX01PVldfUFJFTF9OQywgICAgICAgICAgIDB4MmQpCitFTEZfUkVMT0MoUl9BUk1fTU9WVF9QUkVMLCAgICAgICAgICAgICAgMHgyZSkKK0VMRl9SRUxPQyhSX0FSTV9USE1fTU9WV19BQlNfTkMsICAgICAgICAweDJmKQorRUxGX1JFTE9DKFJfQVJNX1RITV9NT1ZUX0FCUywgICAgICAgICAgIDB4MzApCitFTEZfUkVMT0MoUl9BUk1fVEhNX01PVldfUFJFTF9OQywgICAgICAgMHgzMSkKK0VMRl9SRUxPQyhSX0FSTV9USE1fTU9WVF9QUkVMLCAgICAgICAgICAweDMyKQorRUxGX1JFTE9DKFJfQVJNX1RITV9KVU1QMTksICAgICAgICAgICAgIDB4MzMpCitFTEZfUkVMT0MoUl9BUk1fVEhNX0pVTVA2LCAgICAgICAgICAgICAgMHgzNCkKK0VMRl9SRUxPQyhSX0FSTV9USE1fQUxVX1BSRUxfMTFfMCwgICAgICAweDM1KQorRUxGX1JFTE9DKFJfQVJNX1RITV9QQzEyLCAgICAgICAgICAgICAgIDB4MzYpCitFTEZfUkVMT0MoUl9BUk1fQUJTMzJfTk9JLCAgICAgICAgICAgICAgMHgzNykKK0VMRl9SRUxPQyhSX0FSTV9SRUwzMl9OT0ksICAgICAgICAgICAgICAweDM4KQorRUxGX1JFTE9DKFJfQVJNX0FMVV9QQ19HMF9OQywgICAgICAgICAgIDB4MzkpCitFTEZfUkVMT0MoUl9BUk1fQUxVX1BDX0cwLCAgICAgICAgICAgICAgMHgzYSkKK0VMRl9SRUxPQyhSX0FSTV9BTFVfUENfRzFfTkMsICAgICAgICAgICAweDNiKQorRUxGX1JFTE9DKFJfQVJNX0FMVV9QQ19HMSwgICAgICAgICAgICAgIDB4M2MpCitFTEZfUkVMT0MoUl9BUk1fQUxVX1BDX0cyLCAgICAgICAgICAgICAgMHgzZCkKK0VMRl9SRUxPQyhSX0FSTV9MRFJfUENfRzEsICAgICAgICAgICAgICAweDNlKQorRUxGX1JFTE9DKFJfQVJNX0xEUl9QQ19HMiwgICAgICAgICAgICAgIDB4M2YpCitFTEZfUkVMT0MoUl9BUk1fTERSU19QQ19HMCwgICAgICAgICAgICAgMHg0MCkKK0VMRl9SRUxPQyhSX0FSTV9MRFJTX1BDX0cxLCAgICAgICAgICAgICAweDQxKQorRUxGX1JFTE9DKFJfQVJNX0xEUlNfUENfRzIsICAgICAgICAgICAgIDB4NDIpCitFTEZfUkVMT0MoUl9BUk1fTERDX1BDX0cwLCAgICAgICAgICAgICAgMHg0MykKK0VMRl9SRUxPQyhSX0FSTV9MRENfUENfRzEsICAgICAgICAgICAgICAweDQ0KQorRUxGX1JFTE9DKFJfQVJNX0xEQ19QQ19HMiwgICAgICAgICAgICAgIDB4NDUpCitFTEZfUkVMT0MoUl9BUk1fQUxVX1NCX0cwX05DLCAgICAgICAgICAgMHg0NikKK0VMRl9SRUxPQyhSX0FSTV9BTFVfU0JfRzAsICAgICAgICAgICAgICAweDQ3KQorRUxGX1JFTE9DKFJfQVJNX0FMVV9TQl9HMV9OQywgICAgICAgICAgIDB4NDgpCitFTEZfUkVMT0MoUl9BUk1fQUxVX1NCX0cxLCAgICAgICAgICAgICAgMHg0OSkKK0VMRl9SRUxPQyhSX0FSTV9BTFVfU0JfRzIsICAgICAgICAgICAgICAweDRhKQorRUxGX1JFTE9DKFJfQVJNX0xEUl9TQl9HMCwgICAgICAgICAgICAgIDB4NGIpCitFTEZfUkVMT0MoUl9BUk1fTERSX1NCX0cxLCAgICAgICAgICAgICAgMHg0YykKK0VMRl9SRUxPQyhSX0FSTV9MRFJfU0JfRzIsICAgICAgICAgICAgICAweDRkKQorRUxGX1JFTE9DKFJfQVJNX0xEUlNfU0JfRzAsICAgICAgICAgICAgIDB4NGUpCitFTEZfUkVMT0MoUl9BUk1fTERSU19TQl9HMSwgICAgICAgICAgICAgMHg0ZikKK0VMRl9SRUxPQyhSX0FSTV9MRFJTX1NCX0cyLCAgICAgICAgICAgICAweDUwKQorRUxGX1JFTE9DKFJfQVJNX0xEQ19TQl9HMCwgICAgICAgICAgICAgIDB4NTEpCitFTEZfUkVMT0MoUl9BUk1fTERDX1NCX0cxLCAgICAgICAgICAgICAgMHg1MikKK0VMRl9SRUxPQyhSX0FSTV9MRENfU0JfRzIsICAgICAgICAgICAgICAweDUzKQorRUxGX1JFTE9DKFJfQVJNX01PVldfQlJFTF9OQywgICAgICAgICAgIDB4NTQpCitFTEZfUkVMT0MoUl9BUk1fTU9WVF9CUkVMLCAgICAgICAgICAgICAgMHg1NSkKK0VMRl9SRUxPQyhSX0FSTV9NT1ZXX0JSRUwsICAgICAgICAgICAgICAweDU2KQorRUxGX1JFTE9DKFJfQVJNX1RITV9NT1ZXX0JSRUxfTkMsICAgICAgIDB4NTcpCitFTEZfUkVMT0MoUl9BUk1fVEhNX01PVlRfQlJFTCwgICAgICAgICAgMHg1OCkKK0VMRl9SRUxPQyhSX0FSTV9USE1fTU9WV19CUkVMLCAgICAgICAgICAweDU5KQorRUxGX1JFTE9DKFJfQVJNX1RMU19HT1RERVNDLCAgICAgICAgICAgIDB4NWEpCitFTEZfUkVMT0MoUl9BUk1fVExTX0NBTEwsICAgICAgICAgICAgICAgMHg1YikKK0VMRl9SRUxPQyhSX0FSTV9UTFNfREVTQ1NFUSwgICAgICAgICAgICAweDVjKQorRUxGX1JFTE9DKFJfQVJNX1RITV9UTFNfQ0FMTCwgICAgICAgICAgIDB4NWQpCitFTEZfUkVMT0MoUl9BUk1fUExUMzJfQUJTLCAgICAgICAgICAgICAgMHg1ZSkKK0VMRl9SRUxPQyhSX0FSTV9HT1RfQUJTLCAgICAgICAgICAgICAgICAweDVmKQorRUxGX1JFTE9DKFJfQVJNX0dPVF9QUkVMLCAgICAgICAgICAgICAgIDB4NjApCitFTEZfUkVMT0MoUl9BUk1fR09UX0JSRUwxMiwgICAgICAgICAgICAgMHg2MSkKK0VMRl9SRUxPQyhSX0FSTV9HT1RPRkYxMiwgICAgICAgICAgICAgICAweDYyKQorRUxGX1JFTE9DKFJfQVJNX0dPVFJFTEFYLCAgICAgICAgICAgICAgIDB4NjMpCitFTEZfUkVMT0MoUl9BUk1fR05VX1ZURU5UUlksICAgICAgICAgICAgMHg2NCkKK0VMRl9SRUxPQyhSX0FSTV9HTlVfVlRJTkhFUklULCAgICAgICAgICAweDY1KQorRUxGX1JFTE9DKFJfQVJNX1RITV9KVU1QMTEsICAgICAgICAgICAgIDB4NjYpCitFTEZfUkVMT0MoUl9BUk1fVEhNX0pVTVA4LCAgICAgICAgICAgICAgMHg2NykKK0VMRl9SRUxPQyhSX0FSTV9UTFNfR0QzMiwgICAgICAgICAgICAgICAweDY4KQorRUxGX1JFTE9DKFJfQVJNX1RMU19MRE0zMiwgICAgICAgICAgICAgIDB4NjkpCitFTEZfUkVMT0MoUl9BUk1fVExTX0xETzMyLCAgICAgICAgICAgICAgMHg2YSkKK0VMRl9SRUxPQyhSX0FSTV9UTFNfSUUzMiwgICAgICAgICAgICAgICAweDZiKQorRUxGX1JFTE9DKFJfQVJNX1RMU19MRTMyLCAgICAgICAgICAgICAgIDB4NmMpCitFTEZfUkVMT0MoUl9BUk1fVExTX0xETzEyLCAgICAgICAgICAgICAgMHg2ZCkKK0VMRl9SRUxPQyhSX0FSTV9UTFNfTEUxMiwgICAgICAgICAgICAgICAweDZlKQorRUxGX1JFTE9DKFJfQVJNX1RMU19JRTEyR1AsICAgICAgICAgICAgIDB4NmYpCitFTEZfUkVMT0MoUl9BUk1fUFJJVkFURV8wLCAgICAgICAgICAgICAgMHg3MCkKK0VMRl9SRUxPQyhSX0FSTV9QUklWQVRFXzEsICAgICAgICAgICAgICAweDcxKQorRUxGX1JFTE9DKFJfQVJNX1BSSVZBVEVfMiwgICAgICAgICAgICAgIDB4NzIpCitFTEZfUkVMT0MoUl9BUk1fUFJJVkFURV8zLCAgICAgICAgICAgICAgMHg3MykKK0VMRl9SRUxPQyhSX0FSTV9QUklWQVRFXzQsICAgICAgICAgICAgICAweDc0KQorRUxGX1JFTE9DKFJfQVJNX1BSSVZBVEVfNSwgICAgICAgICAgICAgIDB4NzUpCitFTEZfUkVMT0MoUl9BUk1fUFJJVkFURV82LCAgICAgICAgICAgICAgMHg3NikKK0VMRl9SRUxPQyhSX0FSTV9QUklWQVRFXzcsICAgICAgICAgICAgICAweDc3KQorRUxGX1JFTE9DKFJfQVJNX1BSSVZBVEVfOCwgICAgICAgICAgICAgIDB4NzgpCitFTEZfUkVMT0MoUl9BUk1fUFJJVkFURV85LCAgICAgICAgICAgICAgMHg3OSkKK0VMRl9SRUxPQyhSX0FSTV9QUklWQVRFXzEwLCAgICAgICAgICAgICAweDdhKQorRUxGX1JFTE9DKFJfQVJNX1BSSVZBVEVfMTEsICAgICAgICAgICAgIDB4N2IpCitFTEZfUkVMT0MoUl9BUk1fUFJJVkFURV8xMiwgICAgICAgICAgICAgMHg3YykKK0VMRl9SRUxPQyhSX0FSTV9QUklWQVRFXzEzLCAgICAgICAgICAgICAweDdkKQorRUxGX1JFTE9DKFJfQVJNX1BSSVZBVEVfMTQsICAgICAgICAgICAgIDB4N2UpCitFTEZfUkVMT0MoUl9BUk1fUFJJVkFURV8xNSwgICAgICAgICAgICAgMHg3ZikKK0VMRl9SRUxPQyhSX0FSTV9NRV9UT08sICAgICAgICAgICAgICAgICAweDgwKQorRUxGX1JFTE9DKFJfQVJNX1RITV9UTFNfREVTQ1NFUTE2LCAgICAgIDB4ODEpCitFTEZfUkVMT0MoUl9BUk1fVEhNX1RMU19ERVNDU0VRMzIsICAgICAgMHg4MikKK0VMRl9SRUxPQyhSX0FSTV9JUkVMQVRJVkUsICAgICAgICAgICAgICAweGEwKQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL0FWUi5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvQVZSLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTZmYzYwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL0FWUi5kZWYKQEAgLTAsMCArMSw0MSBAQAorCisjaWZuZGVmIEVMRl9SRUxPQworI2Vycm9yICJFTEZfUkVMT0MgbXVzdCBiZSBkZWZpbmVkIgorI2VuZGlmCisKK0VMRl9SRUxPQyhSX0FWUl9OT05FLCAgICAgICAgICAgICAgICAgIDApCitFTEZfUkVMT0MoUl9BVlJfMzIsICAgICAgICAgICAgICAgICAgICAxKQorRUxGX1JFTE9DKFJfQVZSXzdfUENSRUwsICAgICAgICAgICAgICAgMikKK0VMRl9SRUxPQyhSX0FWUl8xM19QQ1JFTCwgICAgICAgICAgICAgIDMpCitFTEZfUkVMT0MoUl9BVlJfMTYsICAgICAgICAgICAgICAgICAgICA0KQorRUxGX1JFTE9DKFJfQVZSXzE2X1BNLCAgICAgICAgICAgICAgICAgNSkKK0VMRl9SRUxPQyhSX0FWUl9MTzhfTERJLCAgICAgICAgICAgICAgIDYpCitFTEZfUkVMT0MoUl9BVlJfSEk4X0xESSwgICAgICAgICAgICAgICA3KQorRUxGX1JFTE9DKFJfQVZSX0hIOF9MREksICAgICAgICAgICAgICAgOCkKK0VMRl9SRUxPQyhSX0FWUl9MTzhfTERJX05FRywgICAgICAgICAgIDkpCitFTEZfUkVMT0MoUl9BVlJfSEk4X0xESV9ORUcsICAgICAgICAgIDEwKQorRUxGX1JFTE9DKFJfQVZSX0hIOF9MRElfTkVHLCAgICAgICAgICAxMSkKK0VMRl9SRUxPQyhSX0FWUl9MTzhfTERJX1BNLCAgICAgICAgICAgMTIpCitFTEZfUkVMT0MoUl9BVlJfSEk4X0xESV9QTSwgICAgICAgICAgIDEzKQorRUxGX1JFTE9DKFJfQVZSX0hIOF9MRElfUE0sICAgICAgICAgICAxNCkKK0VMRl9SRUxPQyhSX0FWUl9MTzhfTERJX1BNX05FRywgICAgICAgMTUpCitFTEZfUkVMT0MoUl9BVlJfSEk4X0xESV9QTV9ORUcsICAgICAgIDE2KQorRUxGX1JFTE9DKFJfQVZSX0hIOF9MRElfUE1fTkVHLCAgICAgICAxNykKK0VMRl9SRUxPQyhSX0FWUl9DQUxMLCAgICAgICAgICAgICAgICAgMTgpCitFTEZfUkVMT0MoUl9BVlJfTERJLCAgICAgICAgICAgICAgICAgIDE5KQorRUxGX1JFTE9DKFJfQVZSXzYsICAgICAgICAgICAgICAgICAgICAyMCkKK0VMRl9SRUxPQyhSX0FWUl82X0FESVcsICAgICAgICAgICAgICAgMjEpCitFTEZfUkVMT0MoUl9BVlJfTVM4X0xESSwgICAgICAgICAgICAgIDIyKQorRUxGX1JFTE9DKFJfQVZSX01TOF9MRElfTkVHLCAgICAgICAgICAyMykKK0VMRl9SRUxPQyhSX0FWUl9MTzhfTERJX0dTLCAgICAgICAgICAgMjQpCitFTEZfUkVMT0MoUl9BVlJfSEk4X0xESV9HUywgICAgICAgICAgIDI1KQorRUxGX1JFTE9DKFJfQVZSXzgsICAgICAgICAgICAgICAgICAgICAyNikKK0VMRl9SRUxPQyhSX0FWUl84X0xPOCwgICAgICAgICAgICAgICAgMjcpCitFTEZfUkVMT0MoUl9BVlJfOF9ISTgsICAgICAgICAgICAgICAgIDI4KQorRUxGX1JFTE9DKFJfQVZSXzhfSExPOCwgICAgICAgICAgICAgICAyOSkKK0VMRl9SRUxPQyhSX0FWUl9ESUZGOCwgICAgICAgICAgICAgICAgMzApCitFTEZfUkVMT0MoUl9BVlJfRElGRjE2LCAgICAgICAgICAgICAgIDMxKQorRUxGX1JFTE9DKFJfQVZSX0RJRkYzMiwgICAgICAgICAgICAgICAzMikKK0VMRl9SRUxPQyhSX0FWUl9MRFNfU1RTXzE2LCAgICAgICAgICAgMzMpCitFTEZfUkVMT0MoUl9BVlJfUE9SVDYsICAgICAgICAgICAgICAgIDM0KQorRUxGX1JFTE9DKFJfQVZSX1BPUlQ1LCAgICAgICAgICAgICAgICAzNSkKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9CUEYuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL0JQRi5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRkN2Y3MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9CUEYuZGVmCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBFTEZfUkVMT0MKKyNlcnJvciAiRUxGX1JFTE9DIG11c3QgYmUgZGVmaW5lZCIKKyNlbmRpZgorCisvLyBObyByZWxvY2F0aW9uCitFTEZfUkVMT0MoUl9CUEZfTk9ORSwgICAgICAgIDApCitFTEZfUkVMT0MoUl9CUEZfNjRfNjQsICAgICAgIDEpCitFTEZfUkVMT0MoUl9CUEZfNjRfMzIsICAgICAgMTApCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvSGV4YWdvbi5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvSGV4YWdvbi5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTAyMWUyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9IZXhhZ29uLmRlZgpAQCAtMCwwICsxLDEwNiBAQAorCisjaWZuZGVmIEVMRl9SRUxPQworI2Vycm9yICJFTEZfUkVMT0MgbXVzdCBiZSBkZWZpbmVkIgorI2VuZGlmCisKKy8vIFJlbGVhc2UgNSBBQkkKK0VMRl9SRUxPQyhSX0hFWF9OT05FLCAgICAgICAgICAgICAgICAwKQorRUxGX1JFTE9DKFJfSEVYX0IyMl9QQ1JFTCwgICAgICAgICAgIDEpCitFTEZfUkVMT0MoUl9IRVhfQjE1X1BDUkVMLCAgICAgICAgICAgMikKK0VMRl9SRUxPQyhSX0hFWF9CN19QQ1JFTCwgICAgICAgICAgICAzKQorRUxGX1JFTE9DKFJfSEVYX0xPMTYsICAgICAgICAgICAgICAgIDQpCitFTEZfUkVMT0MoUl9IRVhfSEkxNiwgICAgICAgICAgICAgICAgNSkKK0VMRl9SRUxPQyhSX0hFWF8zMiwgICAgICAgICAgICAgICAgICA2KQorRUxGX1JFTE9DKFJfSEVYXzE2LCAgICAgICAgICAgICAgICAgIDcpCitFTEZfUkVMT0MoUl9IRVhfOCwgICAgICAgICAgICAgICAgICAgOCkKK0VMRl9SRUxPQyhSX0hFWF9HUFJFTDE2XzAsICAgICAgICAgICA5KQorRUxGX1JFTE9DKFJfSEVYX0dQUkVMMTZfMSwgICAgICAgICAgIDEwKQorRUxGX1JFTE9DKFJfSEVYX0dQUkVMMTZfMiwgICAgICAgICAgIDExKQorRUxGX1JFTE9DKFJfSEVYX0dQUkVMMTZfMywgICAgICAgICAgIDEyKQorRUxGX1JFTE9DKFJfSEVYX0hMMTYsICAgICAgICAgICAgICAgIDEzKQorRUxGX1JFTE9DKFJfSEVYX0IxM19QQ1JFTCwgICAgICAgICAgIDE0KQorRUxGX1JFTE9DKFJfSEVYX0I5X1BDUkVMLCAgICAgICAgICAgIDE1KQorRUxGX1JFTE9DKFJfSEVYX0IzMl9QQ1JFTF9YLCAgICAgICAgIDE2KQorRUxGX1JFTE9DKFJfSEVYXzMyXzZfWCwgICAgICAgICAgICAgIDE3KQorRUxGX1JFTE9DKFJfSEVYX0IyMl9QQ1JFTF9YLCAgICAgICAgIDE4KQorRUxGX1JFTE9DKFJfSEVYX0IxNV9QQ1JFTF9YLCAgICAgICAgIDE5KQorRUxGX1JFTE9DKFJfSEVYX0IxM19QQ1JFTF9YLCAgICAgICAgIDIwKQorRUxGX1JFTE9DKFJfSEVYX0I5X1BDUkVMX1gsICAgICAgICAgIDIxKQorRUxGX1JFTE9DKFJfSEVYX0I3X1BDUkVMX1gsICAgICAgICAgIDIyKQorRUxGX1JFTE9DKFJfSEVYXzE2X1gsICAgICAgICAgICAgICAgIDIzKQorRUxGX1JFTE9DKFJfSEVYXzEyX1gsICAgICAgICAgICAgICAgIDI0KQorRUxGX1JFTE9DKFJfSEVYXzExX1gsICAgICAgICAgICAgICAgIDI1KQorRUxGX1JFTE9DKFJfSEVYXzEwX1gsICAgICAgICAgICAgICAgIDI2KQorRUxGX1JFTE9DKFJfSEVYXzlfWCwgICAgICAgICAgICAgICAgIDI3KQorRUxGX1JFTE9DKFJfSEVYXzhfWCwgICAgICAgICAgICAgICAgIDI4KQorRUxGX1JFTE9DKFJfSEVYXzdfWCwgICAgICAgICAgICAgICAgIDI5KQorRUxGX1JFTE9DKFJfSEVYXzZfWCwgICAgICAgICAgICAgICAgIDMwKQorRUxGX1JFTE9DKFJfSEVYXzMyX1BDUkVMLCAgICAgICAgICAgIDMxKQorRUxGX1JFTE9DKFJfSEVYX0NPUFksICAgICAgICAgICAgICAgIDMyKQorRUxGX1JFTE9DKFJfSEVYX0dMT0JfREFULCAgICAgICAgICAgIDMzKQorRUxGX1JFTE9DKFJfSEVYX0pNUF9TTE9ULCAgICAgICAgICAgIDM0KQorRUxGX1JFTE9DKFJfSEVYX1JFTEFUSVZFLCAgICAgICAgICAgIDM1KQorRUxGX1JFTE9DKFJfSEVYX1BMVF9CMjJfUENSRUwsICAgICAgIDM2KQorRUxGX1JFTE9DKFJfSEVYX0dPVFJFTF9MTzE2LCAgICAgICAgIDM3KQorRUxGX1JFTE9DKFJfSEVYX0dPVFJFTF9ISTE2LCAgICAgICAgIDM4KQorRUxGX1JFTE9DKFJfSEVYX0dPVFJFTF8zMiwgICAgICAgICAgIDM5KQorRUxGX1JFTE9DKFJfSEVYX0dPVF9MTzE2LCAgICAgICAgICAgIDQwKQorRUxGX1JFTE9DKFJfSEVYX0dPVF9ISTE2LCAgICAgICAgICAgIDQxKQorRUxGX1JFTE9DKFJfSEVYX0dPVF8zMiwgICAgICAgICAgICAgIDQyKQorRUxGX1JFTE9DKFJfSEVYX0dPVF8xNiwgICAgICAgICAgICAgIDQzKQorRUxGX1JFTE9DKFJfSEVYX0RUUE1PRF8zMiwgICAgICAgICAgIDQ0KQorRUxGX1JFTE9DKFJfSEVYX0RUUFJFTF9MTzE2LCAgICAgICAgIDQ1KQorRUxGX1JFTE9DKFJfSEVYX0RUUFJFTF9ISTE2LCAgICAgICAgIDQ2KQorRUxGX1JFTE9DKFJfSEVYX0RUUFJFTF8zMiwgICAgICAgICAgIDQ3KQorRUxGX1JFTE9DKFJfSEVYX0RUUFJFTF8xNiwgICAgICAgICAgIDQ4KQorRUxGX1JFTE9DKFJfSEVYX0dEX1BMVF9CMjJfUENSRUwsICAgIDQ5KQorRUxGX1JFTE9DKFJfSEVYX0dEX0dPVF9MTzE2LCAgICAgICAgIDUwKQorRUxGX1JFTE9DKFJfSEVYX0dEX0dPVF9ISTE2LCAgICAgICAgIDUxKQorRUxGX1JFTE9DKFJfSEVYX0dEX0dPVF8zMiwgICAgICAgICAgIDUyKQorRUxGX1JFTE9DKFJfSEVYX0dEX0dPVF8xNiwgICAgICAgICAgIDUzKQorRUxGX1JFTE9DKFJfSEVYX0lFX0xPMTYsICAgICAgICAgICAgIDU0KQorRUxGX1JFTE9DKFJfSEVYX0lFX0hJMTYsICAgICAgICAgICAgIDU1KQorRUxGX1JFTE9DKFJfSEVYX0lFXzMyLCAgICAgICAgICAgICAgIDU2KQorRUxGX1JFTE9DKFJfSEVYX0lFX0dPVF9MTzE2LCAgICAgICAgIDU3KQorRUxGX1JFTE9DKFJfSEVYX0lFX0dPVF9ISTE2LCAgICAgICAgIDU4KQorRUxGX1JFTE9DKFJfSEVYX0lFX0dPVF8zMiwgICAgICAgICAgIDU5KQorRUxGX1JFTE9DKFJfSEVYX0lFX0dPVF8xNiwgICAgICAgICAgIDYwKQorRUxGX1JFTE9DKFJfSEVYX1RQUkVMX0xPMTYsICAgICAgICAgIDYxKQorRUxGX1JFTE9DKFJfSEVYX1RQUkVMX0hJMTYsICAgICAgICAgIDYyKQorRUxGX1JFTE9DKFJfSEVYX1RQUkVMXzMyLCAgICAgICAgICAgIDYzKQorRUxGX1JFTE9DKFJfSEVYX1RQUkVMXzE2LCAgICAgICAgICAgIDY0KQorRUxGX1JFTE9DKFJfSEVYXzZfUENSRUxfWCwgICAgICAgICAgIDY1KQorRUxGX1JFTE9DKFJfSEVYX0dPVFJFTF8zMl82X1gsICAgICAgIDY2KQorRUxGX1JFTE9DKFJfSEVYX0dPVFJFTF8xNl9YLCAgICAgICAgIDY3KQorRUxGX1JFTE9DKFJfSEVYX0dPVFJFTF8xMV9YLCAgICAgICAgIDY4KQorRUxGX1JFTE9DKFJfSEVYX0dPVF8zMl82X1gsICAgICAgICAgIDY5KQorRUxGX1JFTE9DKFJfSEVYX0dPVF8xNl9YLCAgICAgICAgICAgIDcwKQorRUxGX1JFTE9DKFJfSEVYX0dPVF8xMV9YLCAgICAgICAgICAgIDcxKQorRUxGX1JFTE9DKFJfSEVYX0RUUFJFTF8zMl82X1gsICAgICAgIDcyKQorRUxGX1JFTE9DKFJfSEVYX0RUUFJFTF8xNl9YLCAgICAgICAgIDczKQorRUxGX1JFTE9DKFJfSEVYX0RUUFJFTF8xMV9YLCAgICAgICAgIDc0KQorRUxGX1JFTE9DKFJfSEVYX0dEX0dPVF8zMl82X1gsICAgICAgIDc1KQorRUxGX1JFTE9DKFJfSEVYX0dEX0dPVF8xNl9YLCAgICAgICAgIDc2KQorRUxGX1JFTE9DKFJfSEVYX0dEX0dPVF8xMV9YLCAgICAgICAgIDc3KQorRUxGX1JFTE9DKFJfSEVYX0lFXzMyXzZfWCwgICAgICAgICAgIDc4KQorRUxGX1JFTE9DKFJfSEVYX0lFXzE2X1gsICAgICAgICAgICAgIDc5KQorRUxGX1JFTE9DKFJfSEVYX0lFX0dPVF8zMl82X1gsICAgICAgIDgwKQorRUxGX1JFTE9DKFJfSEVYX0lFX0dPVF8xNl9YLCAgICAgICAgIDgxKQorRUxGX1JFTE9DKFJfSEVYX0lFX0dPVF8xMV9YLCAgICAgICAgIDgyKQorRUxGX1JFTE9DKFJfSEVYX1RQUkVMXzMyXzZfWCwgICAgICAgIDgzKQorRUxGX1JFTE9DKFJfSEVYX1RQUkVMXzE2X1gsICAgICAgICAgIDg0KQorRUxGX1JFTE9DKFJfSEVYX1RQUkVMXzExX1gsICAgICAgICAgIDg1KQorRUxGX1JFTE9DKFJfSEVYX0xEX1BMVF9CMjJfUENSRUwsICAgIDg2KQorRUxGX1JFTE9DKFJfSEVYX0xEX0dPVF9MTzE2LCAgICAgICAgIDg3KQorRUxGX1JFTE9DKFJfSEVYX0xEX0dPVF9ISTE2LCAgICAgICAgIDg4KQorRUxGX1JFTE9DKFJfSEVYX0xEX0dPVF8zMiwgICAgICAgICAgIDg5KQorRUxGX1JFTE9DKFJfSEVYX0xEX0dPVF8xNiwgICAgICAgICAgIDkwKQorRUxGX1JFTE9DKFJfSEVYX0xEX0dPVF8zMl82X1gsICAgICAgIDkxKQorRUxGX1JFTE9DKFJfSEVYX0xEX0dPVF8xNl9YLCAgICAgICAgIDkyKQorRUxGX1JFTE9DKFJfSEVYX0xEX0dPVF8xMV9YLCAgICAgICAgIDkzKQorRUxGX1JFTE9DKFJfSEVYXzIzX1JFRywgICAgICAgICAgICAgIDk0KQorRUxGX1JFTE9DKFJfSEVYX0dEX1BMVF9CMjJfUENSRUxfWCwgIDk1KQorRUxGX1JFTE9DKFJfSEVYX0dEX1BMVF9CMzJfUENSRUxfWCwgIDk2KQorRUxGX1JFTE9DKFJfSEVYX0xEX1BMVF9CMjJfUENSRUxfWCwgIDk3KQorRUxGX1JFTE9DKFJfSEVYX0xEX1BMVF9CMzJfUENSRUxfWCwgIDk4KQorRUxGX1JFTE9DKFJfSEVYXzI3X1JFRywgICAgICAgICAgICAgIDk5KQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL0xhbmFpLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9MYW5haS5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzdlY2IwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9MYW5haS5kZWYKQEAgLTAsMCArMSwxOSBAQAorCisjaWZuZGVmIEVMRl9SRUxPQworI2Vycm9yICJFTEZfUkVMT0MgbXVzdCBiZSBkZWZpbmVkIgorI2VuZGlmCisKKy8vIE5vIHJlbG9jYXRpb24KK0VMRl9SRUxPQyhSX0xBTkFJX05PTkUsICAgICAgICAwKQorLy8gMjEtYml0IHN5bWJvbCByZWxvY2F0aW9uCitFTEZfUkVMT0MoUl9MQU5BSV8yMSwgICAgICAgICAgMSkKKy8vIDIxLWJpdCBzeW1ib2wgcmVsb2NhdGlvbiB3aXRoIGxhc3QgdHdvIGJpdHMgbWFza2VkIHRvIDAKK0VMRl9SRUxPQyhSX0xBTkFJXzIxX0YsICAgICAgICAyKQorLy8gMjUtYml0IGJyYW5jaCB0YXJnZXRzCitFTEZfUkVMT0MoUl9MQU5BSV8yNSwgICAgICAgICAgMykKKy8vIEdlbmVyYWwgMzItYml0IHJlbG9jYXRpb24KK0VMRl9SRUxPQyhSX0xBTkFJXzMyLCAgICAgICAgICA0KQorLy8gVXBwZXIgMTYtYml0cyBvZiBhIHN5bWJvbGljIHJlbG9jYXRpb24KK0VMRl9SRUxPQyhSX0xBTkFJX0hJMTYsICAgICAgICA1KQorLy8gTG93ZXIgMTYtYml0cyBvZiBhIHN5bWJvbGljIHJlbG9jYXRpb24KK0VMRl9SRUxPQyhSX0xBTkFJX0xPMTYsICAgICAgICA2KQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL01pcHMuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL01pcHMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjMDA4OGQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvTWlwcy5kZWYKQEAgLTAsMCArMSwxMTcgQEAKKworI2lmbmRlZiBFTEZfUkVMT0MKKyNlcnJvciAiRUxGX1JFTE9DIG11c3QgYmUgZGVmaW5lZCIKKyNlbmRpZgorCitFTEZfUkVMT0MoUl9NSVBTX05PTkUsICAgICAgICAgICAgICAgIDApCitFTEZfUkVMT0MoUl9NSVBTXzE2LCAgICAgICAgICAgICAgICAgIDEpCitFTEZfUkVMT0MoUl9NSVBTXzMyLCAgICAgICAgICAgICAgICAgIDIpCitFTEZfUkVMT0MoUl9NSVBTX1JFTDMyLCAgICAgICAgICAgICAgIDMpCitFTEZfUkVMT0MoUl9NSVBTXzI2LCAgICAgICAgICAgICAgICAgIDQpCitFTEZfUkVMT0MoUl9NSVBTX0hJMTYsICAgICAgICAgICAgICAgIDUpCitFTEZfUkVMT0MoUl9NSVBTX0xPMTYsICAgICAgICAgICAgICAgIDYpCitFTEZfUkVMT0MoUl9NSVBTX0dQUkVMMTYsICAgICAgICAgICAgIDcpCitFTEZfUkVMT0MoUl9NSVBTX0xJVEVSQUwsICAgICAgICAgICAgIDgpCitFTEZfUkVMT0MoUl9NSVBTX0dPVDE2LCAgICAgICAgICAgICAgIDkpCitFTEZfUkVMT0MoUl9NSVBTX1BDMTYsICAgICAgICAgICAgICAgMTApCitFTEZfUkVMT0MoUl9NSVBTX0NBTEwxNiwgICAgICAgICAgICAgMTEpCitFTEZfUkVMT0MoUl9NSVBTX0dQUkVMMzIsICAgICAgICAgICAgMTIpCitFTEZfUkVMT0MoUl9NSVBTX1VOVVNFRDEsICAgICAgICAgICAgMTMpCitFTEZfUkVMT0MoUl9NSVBTX1VOVVNFRDIsICAgICAgICAgICAgMTQpCitFTEZfUkVMT0MoUl9NSVBTX1VOVVNFRDMsICAgICAgICAgICAgMTUpCitFTEZfUkVMT0MoUl9NSVBTX1NISUZUNSwgICAgICAgICAgICAgMTYpCitFTEZfUkVMT0MoUl9NSVBTX1NISUZUNiwgICAgICAgICAgICAgMTcpCitFTEZfUkVMT0MoUl9NSVBTXzY0LCAgICAgICAgICAgICAgICAgMTgpCitFTEZfUkVMT0MoUl9NSVBTX0dPVF9ESVNQLCAgICAgICAgICAgMTkpCitFTEZfUkVMT0MoUl9NSVBTX0dPVF9QQUdFLCAgICAgICAgICAgMjApCitFTEZfUkVMT0MoUl9NSVBTX0dPVF9PRlNULCAgICAgICAgICAgMjEpCitFTEZfUkVMT0MoUl9NSVBTX0dPVF9ISTE2LCAgICAgICAgICAgMjIpCitFTEZfUkVMT0MoUl9NSVBTX0dPVF9MTzE2LCAgICAgICAgICAgMjMpCitFTEZfUkVMT0MoUl9NSVBTX1NVQiwgICAgICAgICAgICAgICAgMjQpCitFTEZfUkVMT0MoUl9NSVBTX0lOU0VSVF9BLCAgICAgICAgICAgMjUpCitFTEZfUkVMT0MoUl9NSVBTX0lOU0VSVF9CLCAgICAgICAgICAgMjYpCitFTEZfUkVMT0MoUl9NSVBTX0RFTEVURSwgICAgICAgICAgICAgMjcpCitFTEZfUkVMT0MoUl9NSVBTX0hJR0hFUiwgICAgICAgICAgICAgMjgpCitFTEZfUkVMT0MoUl9NSVBTX0hJR0hFU1QsICAgICAgICAgICAgMjkpCitFTEZfUkVMT0MoUl9NSVBTX0NBTExfSEkxNiwgICAgICAgICAgMzApCitFTEZfUkVMT0MoUl9NSVBTX0NBTExfTE8xNiwgICAgICAgICAgMzEpCitFTEZfUkVMT0MoUl9NSVBTX1NDTl9ESVNQLCAgICAgICAgICAgMzIpCitFTEZfUkVMT0MoUl9NSVBTX1JFTDE2LCAgICAgICAgICAgICAgMzMpCitFTEZfUkVMT0MoUl9NSVBTX0FERF9JTU1FRElBVEUsICAgICAgMzQpCitFTEZfUkVMT0MoUl9NSVBTX1BKVU1QLCAgICAgICAgICAgICAgMzUpCitFTEZfUkVMT0MoUl9NSVBTX1JFTEdPVCwgICAgICAgICAgICAgMzYpCitFTEZfUkVMT0MoUl9NSVBTX0pBTFIsICAgICAgICAgICAgICAgMzcpCitFTEZfUkVMT0MoUl9NSVBTX1RMU19EVFBNT0QzMiwgICAgICAgMzgpCitFTEZfUkVMT0MoUl9NSVBTX1RMU19EVFBSRUwzMiwgICAgICAgMzkpCitFTEZfUkVMT0MoUl9NSVBTX1RMU19EVFBNT0Q2NCwgICAgICAgNDApCitFTEZfUkVMT0MoUl9NSVBTX1RMU19EVFBSRUw2NCwgICAgICAgNDEpCitFTEZfUkVMT0MoUl9NSVBTX1RMU19HRCwgICAgICAgICAgICAgNDIpCitFTEZfUkVMT0MoUl9NSVBTX1RMU19MRE0sICAgICAgICAgICAgNDMpCitFTEZfUkVMT0MoUl9NSVBTX1RMU19EVFBSRUxfSEkxNiwgICAgNDQpCitFTEZfUkVMT0MoUl9NSVBTX1RMU19EVFBSRUxfTE8xNiwgICAgNDUpCitFTEZfUkVMT0MoUl9NSVBTX1RMU19HT1RUUFJFTCwgICAgICAgNDYpCitFTEZfUkVMT0MoUl9NSVBTX1RMU19UUFJFTDMyLCAgICAgICAgNDcpCitFTEZfUkVMT0MoUl9NSVBTX1RMU19UUFJFTDY0LCAgICAgICAgNDgpCitFTEZfUkVMT0MoUl9NSVBTX1RMU19UUFJFTF9ISTE2LCAgICAgNDkpCitFTEZfUkVMT0MoUl9NSVBTX1RMU19UUFJFTF9MTzE2LCAgICAgNTApCitFTEZfUkVMT0MoUl9NSVBTX0dMT0JfREFULCAgICAgICAgICAgNTEpCitFTEZfUkVMT0MoUl9NSVBTX1BDMjFfUzIsICAgICAgICAgICAgNjApCitFTEZfUkVMT0MoUl9NSVBTX1BDMjZfUzIsICAgICAgICAgICAgNjEpCitFTEZfUkVMT0MoUl9NSVBTX1BDMThfUzMsICAgICAgICAgICAgNjIpCitFTEZfUkVMT0MoUl9NSVBTX1BDMTlfUzIsICAgICAgICAgICAgNjMpCitFTEZfUkVMT0MoUl9NSVBTX1BDSEkxNiwgICAgICAgICAgICAgNjQpCitFTEZfUkVMT0MoUl9NSVBTX1BDTE8xNiwgICAgICAgICAgICAgNjUpCitFTEZfUkVMT0MoUl9NSVBTMTZfMjYsICAgICAgICAgICAgICAgMTAwKQorRUxGX1JFTE9DKFJfTUlQUzE2X0dQUkVMLCAgICAgICAgICAgIDEwMSkKK0VMRl9SRUxPQyhSX01JUFMxNl9HT1QxNiwgICAgICAgICAgICAxMDIpCitFTEZfUkVMT0MoUl9NSVBTMTZfQ0FMTDE2LCAgICAgICAgICAgMTAzKQorRUxGX1JFTE9DKFJfTUlQUzE2X0hJMTYsICAgICAgICAgICAgIDEwNCkKK0VMRl9SRUxPQyhSX01JUFMxNl9MTzE2LCAgICAgICAgICAgICAxMDUpCitFTEZfUkVMT0MoUl9NSVBTMTZfVExTX0dELCAgICAgICAgICAgMTA2KQorRUxGX1JFTE9DKFJfTUlQUzE2X1RMU19MRE0sICAgICAgICAgIDEwNykKK0VMRl9SRUxPQyhSX01JUFMxNl9UTFNfRFRQUkVMX0hJMTYsICAxMDgpCitFTEZfUkVMT0MoUl9NSVBTMTZfVExTX0RUUFJFTF9MTzE2LCAgMTA5KQorRUxGX1JFTE9DKFJfTUlQUzE2X1RMU19HT1RUUFJFTCwgICAgIDExMCkKK0VMRl9SRUxPQyhSX01JUFMxNl9UTFNfVFBSRUxfSEkxNiwgICAxMTEpCitFTEZfUkVMT0MoUl9NSVBTMTZfVExTX1RQUkVMX0xPMTYsICAgMTEyKQorRUxGX1JFTE9DKFJfTUlQU19DT1BZLCAgICAgICAgICAgICAgIDEyNikKK0VMRl9SRUxPQyhSX01JUFNfSlVNUF9TTE9ULCAgICAgICAgICAxMjcpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfMjZfUzEsICAgICAgICAgMTMzKQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX0hJMTYsICAgICAgICAgIDEzNCkKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19MTzE2LCAgICAgICAgICAxMzUpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfR1BSRUwxNiwgICAgICAgMTM2KQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX0xJVEVSQUwsICAgICAgIDEzNykKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19HT1QxNiwgICAgICAgICAxMzgpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfUEM3X1MxLCAgICAgICAgMTM5KQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX1BDMTBfUzEsICAgICAgIDE0MCkKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19QQzE2X1MxLCAgICAgICAxNDEpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfQ0FMTDE2LCAgICAgICAgMTQyKQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX0dPVF9ESVNQLCAgICAgIDE0NSkKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19HT1RfUEFHRSwgICAgICAxNDYpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfR09UX09GU1QsICAgICAgMTQ3KQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX0dPVF9ISTE2LCAgICAgIDE0OCkKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19HT1RfTE8xNiwgICAgICAxNDkpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfU1VCLCAgICAgICAgICAgMTUwKQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX0hJR0hFUiwgICAgICAgIDE1MSkKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19ISUdIRVNULCAgICAgICAxNTIpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfQ0FMTF9ISTE2LCAgICAgMTUzKQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX0NBTExfTE8xNiwgICAgIDE1NCkKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19TQ05fRElTUCwgICAgICAxNTUpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfSkFMUiwgICAgICAgICAgMTU2KQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX0hJMF9MTzE2LCAgICAgIDE1NykKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19UTFNfR0QsICAgICAgICAgICAxNjIpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfVExTX0xETSwgICAgICAgICAgMTYzKQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX1RMU19EVFBSRUxfSEkxNiwgIDE2NCkKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19UTFNfRFRQUkVMX0xPMTYsICAxNjUpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfVExTX0dPVFRQUkVMLCAgICAgMTY2KQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX1RMU19UUFJFTF9ISTE2LCAgIDE2OSkKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19UTFNfVFBSRUxfTE8xNiwgICAxNzApCitFTEZfUkVMT0MoUl9NSUNST01JUFNfR1BSRUw3X1MyLCAgICAgICAgMTcyKQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX1BDMjNfUzIsICAgICAgICAgIDE3MykKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19QQzIxX1MxLCAgICAgICAgICAxNzQpCitFTEZfUkVMT0MoUl9NSUNST01JUFNfUEMyNl9TMSwgICAgICAgICAgMTc1KQorRUxGX1JFTE9DKFJfTUlDUk9NSVBTX1BDMThfUzMsICAgICAgICAgIDE3NikKK0VMRl9SRUxPQyhSX01JQ1JPTUlQU19QQzE5X1MyLCAgICAgICAgICAxNzcpCitFTEZfUkVMT0MoUl9NSVBTX05VTSwgICAgICAgICAgICAgICAgMjE4KQorRUxGX1JFTE9DKFJfTUlQU19QQzMyLCAgICAgICAgICAgICAgIDI0OCkKK0VMRl9SRUxPQyhSX01JUFNfRUgsICAgICAgICAgICAgICAgICAyNDkpCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvUG93ZXJQQy5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvUG93ZXJQQy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTRmOGVlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9Qb3dlclBDLmRlZgpAQCAtMCwwICsxLDEyMyBAQAorCisjaWZuZGVmIEVMRl9SRUxPQworI2Vycm9yICJFTEZfUkVMT0MgbXVzdCBiZSBkZWZpbmVkIgorI2VuZGlmCisKKy8vIGdsaWJjJ3MgUG93ZXJQQyBhc20vc2lnY29udGV4dC5oLCB3aGVuIGNvbXBpbGluZyBmb3IgUFBDNjQsIGhhcyB0aGUKKy8vIHVuZm9ydHVuYXRlIGJlaGF2aW9yIG9mIGluY2x1ZGluZyBhc20vZWxmLmgsIHdoaWNoIGRlZmluZXMgUl9QUENfTk9ORSwgZXRjLgorLy8gdG8gdGhlaXIgY29ycmVzcG9uZGluZyBpbnRlZ2VyIHZhbHVlcy4gQXMgYSByZXN1bHQsIHdlIG5lZWQgdG8gdW5kZWYgdGhlbQorLy8gaGVyZSBiZWZvcmUgY29udGludWluZy4KKworI3VuZGVmIFJfUFBDX05PTkUKKyN1bmRlZiBSX1BQQ19BRERSMzIKKyN1bmRlZiBSX1BQQ19BRERSMjQKKyN1bmRlZiBSX1BQQ19BRERSMTYKKyN1bmRlZiBSX1BQQ19BRERSMTZfTE8KKyN1bmRlZiBSX1BQQ19BRERSMTZfSEkKKyN1bmRlZiBSX1BQQ19BRERSMTZfSEEKKyN1bmRlZiBSX1BQQ19BRERSMTQKKyN1bmRlZiBSX1BQQ19BRERSMTRfQlJUQUtFTgorI3VuZGVmIFJfUFBDX0FERFIxNF9CUk5UQUtFTgorI3VuZGVmIFJfUFBDX1JFTDI0CisjdW5kZWYgUl9QUENfUkVMMTQKKyN1bmRlZiBSX1BQQ19SRUwxNF9CUlRBS0VOCisjdW5kZWYgUl9QUENfUkVMMTRfQlJOVEFLRU4KKyN1bmRlZiBSX1BQQ19HT1QxNgorI3VuZGVmIFJfUFBDX0dPVDE2X0xPCisjdW5kZWYgUl9QUENfR09UMTZfSEkKKyN1bmRlZiBSX1BQQ19HT1QxNl9IQQorI3VuZGVmIFJfUFBDX1BMVFJFTDI0CisjdW5kZWYgUl9QUENfSk1QX1NMT1QKKyN1bmRlZiBSX1BQQ19MT0NBTDI0UEMKKyN1bmRlZiBSX1BQQ19SRUwzMgorI3VuZGVmIFJfUFBDX1RMUworI3VuZGVmIFJfUFBDX0RUUE1PRDMyCisjdW5kZWYgUl9QUENfVFBSRUwxNgorI3VuZGVmIFJfUFBDX1RQUkVMMTZfTE8KKyN1bmRlZiBSX1BQQ19UUFJFTDE2X0hJCisjdW5kZWYgUl9QUENfVFBSRUwxNl9IQQorI3VuZGVmIFJfUFBDX1RQUkVMMzIKKyN1bmRlZiBSX1BQQ19EVFBSRUwxNgorI3VuZGVmIFJfUFBDX0RUUFJFTDE2X0xPCisjdW5kZWYgUl9QUENfRFRQUkVMMTZfSEkKKyN1bmRlZiBSX1BQQ19EVFBSRUwxNl9IQQorI3VuZGVmIFJfUFBDX0RUUFJFTDMyCisjdW5kZWYgUl9QUENfR09UX1RMU0dEMTYKKyN1bmRlZiBSX1BQQ19HT1RfVExTR0QxNl9MTworI3VuZGVmIFJfUFBDX0dPVF9UTFNHRDE2X0hJCisjdW5kZWYgUl9QUENfR09UX1RMU0dEMTZfSEEKKyN1bmRlZiBSX1BQQ19HT1RfVExTTEQxNgorI3VuZGVmIFJfUFBDX0dPVF9UTFNMRDE2X0xPCisjdW5kZWYgUl9QUENfR09UX1RMU0xEMTZfSEkKKyN1bmRlZiBSX1BQQ19HT1RfVExTTEQxNl9IQQorI3VuZGVmIFJfUFBDX0dPVF9UUFJFTDE2CisjdW5kZWYgUl9QUENfR09UX1RQUkVMMTZfTE8KKyN1bmRlZiBSX1BQQ19HT1RfVFBSRUwxNl9ISQorI3VuZGVmIFJfUFBDX0dPVF9UUFJFTDE2X0hBCisjdW5kZWYgUl9QUENfR09UX0RUUFJFTDE2CisjdW5kZWYgUl9QUENfR09UX0RUUFJFTDE2X0xPCisjdW5kZWYgUl9QUENfR09UX0RUUFJFTDE2X0hJCisjdW5kZWYgUl9QUENfR09UX0RUUFJFTDE2X0hBCisjdW5kZWYgUl9QUENfVExTR0QKKyN1bmRlZiBSX1BQQ19UTFNMRAorI3VuZGVmIFJfUFBDX1JFTDE2CisjdW5kZWYgUl9QUENfUkVMMTZfTE8KKyN1bmRlZiBSX1BQQ19SRUwxNl9ISQorI3VuZGVmIFJfUFBDX1JFTDE2X0hBCisKK0VMRl9SRUxPQyhSX1BQQ19OT05FLCAgICAgICAgICAgICAgICAgICAwKSAgICAgIC8qIE5vIHJlbG9jYXRpb24uICovCitFTEZfUkVMT0MoUl9QUENfQUREUjMyLCAgICAgICAgICAgICAgICAgMSkKK0VMRl9SRUxPQyhSX1BQQ19BRERSMjQsICAgICAgICAgICAgICAgICAyKQorRUxGX1JFTE9DKFJfUFBDX0FERFIxNiwgICAgICAgICAgICAgICAgIDMpCitFTEZfUkVMT0MoUl9QUENfQUREUjE2X0xPLCAgICAgICAgICAgICAgNCkKK0VMRl9SRUxPQyhSX1BQQ19BRERSMTZfSEksICAgICAgICAgICAgICA1KQorRUxGX1JFTE9DKFJfUFBDX0FERFIxNl9IQSwgICAgICAgICAgICAgIDYpCitFTEZfUkVMT0MoUl9QUENfQUREUjE0LCAgICAgICAgICAgICAgICAgNykKK0VMRl9SRUxPQyhSX1BQQ19BRERSMTRfQlJUQUtFTiwgICAgICAgICA4KQorRUxGX1JFTE9DKFJfUFBDX0FERFIxNF9CUk5UQUtFTiwgICAgICAgIDkpCitFTEZfUkVMT0MoUl9QUENfUkVMMjQsICAgICAgICAgICAgICAgICAgMTApCitFTEZfUkVMT0MoUl9QUENfUkVMMTQsICAgICAgICAgICAgICAgICAgMTEpCitFTEZfUkVMT0MoUl9QUENfUkVMMTRfQlJUQUtFTiwgICAgICAgICAgMTIpCitFTEZfUkVMT0MoUl9QUENfUkVMMTRfQlJOVEFLRU4sICAgICAgICAgMTMpCitFTEZfUkVMT0MoUl9QUENfR09UMTYsICAgICAgICAgICAgICAgICAgMTQpCitFTEZfUkVMT0MoUl9QUENfR09UMTZfTE8sICAgICAgICAgICAgICAgMTUpCitFTEZfUkVMT0MoUl9QUENfR09UMTZfSEksICAgICAgICAgICAgICAgMTYpCitFTEZfUkVMT0MoUl9QUENfR09UMTZfSEEsICAgICAgICAgICAgICAgMTcpCitFTEZfUkVMT0MoUl9QUENfUExUUkVMMjQsICAgICAgICAgICAgICAgMTgpCitFTEZfUkVMT0MoUl9QUENfSk1QX1NMT1QsICAgICAgICAgICAgICAgMjEpCitFTEZfUkVMT0MoUl9QUENfTE9DQUwyNFBDLCAgICAgICAgICAgICAgMjMpCitFTEZfUkVMT0MoUl9QUENfUkVMMzIsICAgICAgICAgICAgICAgICAgMjYpCitFTEZfUkVMT0MoUl9QUENfVExTLCAgICAgICAgICAgICAgICAgICAgNjcpCitFTEZfUkVMT0MoUl9QUENfRFRQTU9EMzIsICAgICAgICAgICAgICAgNjgpCitFTEZfUkVMT0MoUl9QUENfVFBSRUwxNiwgICAgICAgICAgICAgICAgNjkpCitFTEZfUkVMT0MoUl9QUENfVFBSRUwxNl9MTywgICAgICAgICAgICAgNzApCitFTEZfUkVMT0MoUl9QUENfVFBSRUwxNl9ISSwgICAgICAgICAgICAgNzEpCitFTEZfUkVMT0MoUl9QUENfVFBSRUwxNl9IQSwgICAgICAgICAgICAgNzIpCitFTEZfUkVMT0MoUl9QUENfVFBSRUwzMiwgICAgICAgICAgICAgICAgNzMpCitFTEZfUkVMT0MoUl9QUENfRFRQUkVMMTYsICAgICAgICAgICAgICAgNzQpCitFTEZfUkVMT0MoUl9QUENfRFRQUkVMMTZfTE8sICAgICAgICAgICAgNzUpCitFTEZfUkVMT0MoUl9QUENfRFRQUkVMMTZfSEksICAgICAgICAgICAgNzYpCitFTEZfUkVMT0MoUl9QUENfRFRQUkVMMTZfSEEsICAgICAgICAgICAgNzcpCitFTEZfUkVMT0MoUl9QUENfRFRQUkVMMzIsICAgICAgICAgICAgICAgNzgpCitFTEZfUkVMT0MoUl9QUENfR09UX1RMU0dEMTYsICAgICAgICAgICAgNzkpCitFTEZfUkVMT0MoUl9QUENfR09UX1RMU0dEMTZfTE8sICAgICAgICAgODApCitFTEZfUkVMT0MoUl9QUENfR09UX1RMU0dEMTZfSEksICAgICAgICAgODEpCitFTEZfUkVMT0MoUl9QUENfR09UX1RMU0dEMTZfSEEsICAgICAgICAgODIpCitFTEZfUkVMT0MoUl9QUENfR09UX1RMU0xEMTYsICAgICAgICAgICAgODMpCitFTEZfUkVMT0MoUl9QUENfR09UX1RMU0xEMTZfTE8sICAgICAgICAgODQpCitFTEZfUkVMT0MoUl9QUENfR09UX1RMU0xEMTZfSEksICAgICAgICAgODUpCitFTEZfUkVMT0MoUl9QUENfR09UX1RMU0xEMTZfSEEsICAgICAgICAgODYpCitFTEZfUkVMT0MoUl9QUENfR09UX1RQUkVMMTYsICAgICAgICAgICAgODcpCitFTEZfUkVMT0MoUl9QUENfR09UX1RQUkVMMTZfTE8sICAgICAgICAgODgpCitFTEZfUkVMT0MoUl9QUENfR09UX1RQUkVMMTZfSEksICAgICAgICAgODkpCitFTEZfUkVMT0MoUl9QUENfR09UX1RQUkVMMTZfSEEsICAgICAgICAgOTApCitFTEZfUkVMT0MoUl9QUENfR09UX0RUUFJFTDE2LCAgICAgICAgICAgOTEpCitFTEZfUkVMT0MoUl9QUENfR09UX0RUUFJFTDE2X0xPLCAgICAgICAgOTIpCitFTEZfUkVMT0MoUl9QUENfR09UX0RUUFJFTDE2X0hJLCAgICAgICAgOTMpCitFTEZfUkVMT0MoUl9QUENfR09UX0RUUFJFTDE2X0hBLCAgICAgICAgOTQpCitFTEZfUkVMT0MoUl9QUENfVExTR0QsICAgICAgICAgICAgICAgICAgOTUpCitFTEZfUkVMT0MoUl9QUENfVExTTEQsICAgICAgICAgICAgICAgICAgOTYpCitFTEZfUkVMT0MoUl9QUENfUkVMMTYsICAgICAgICAgICAgICAgICAgMjQ5KQorRUxGX1JFTE9DKFJfUFBDX1JFTDE2X0xPLCAgICAgICAgICAgICAgIDI1MCkKK0VMRl9SRUxPQyhSX1BQQ19SRUwxNl9ISSwgICAgICAgICAgICAgICAyNTEpCitFTEZfUkVMT0MoUl9QUENfUkVMMTZfSEEsICAgICAgICAgICAgICAgMjUyKQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL1Bvd2VyUEM2NC5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvUG93ZXJQQzY0LmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTQ3YzVhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL1Bvd2VyUEM2NC5kZWYKQEAgLTAsMCArMSwxODEgQEAKKworI2lmbmRlZiBFTEZfUkVMT0MKKyNlcnJvciAiRUxGX1JFTE9DIG11c3QgYmUgZGVmaW5lZCIKKyNlbmRpZgorCisvLyBnbGliYydzIFBvd2VyUEMgYXNtL3NpZ2NvbnRleHQuaCwgd2hlbiBjb21waWxpbmcgZm9yIFBQQzY0LCBoYXMgdGhlCisvLyB1bmZvcnR1bmF0ZSBiZWhhdmlvciBvZiBpbmNsdWRpbmcgYXNtL2VsZi5oLCB3aGljaCBkZWZpbmVzIFJfUFBDX05PTkUsIGV0Yy4KKy8vIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgaW50ZWdlciB2YWx1ZXMuIEFzIGEgcmVzdWx0LCB3ZSBuZWVkIHRvIHVuZGVmIHRoZW0KKy8vIGhlcmUgYmVmb3JlIGNvbnRpbnVpbmcuCisKKyN1bmRlZiBSX1BQQzY0X05PTkUKKyN1bmRlZiBSX1BQQzY0X0FERFIzMgorI3VuZGVmIFJfUFBDNjRfQUREUjI0CisjdW5kZWYgUl9QUEM2NF9BRERSMTYKKyN1bmRlZiBSX1BQQzY0X0FERFIxNl9MTworI3VuZGVmIFJfUFBDNjRfQUREUjE2X0hJCisjdW5kZWYgUl9QUEM2NF9BRERSMTZfSEEKKyN1bmRlZiBSX1BQQzY0X0FERFIxNAorI3VuZGVmIFJfUFBDNjRfQUREUjE0X0JSVEFLRU4KKyN1bmRlZiBSX1BQQzY0X0FERFIxNF9CUk5UQUtFTgorI3VuZGVmIFJfUFBDNjRfUkVMMjQKKyN1bmRlZiBSX1BQQzY0X1JFTDE0CisjdW5kZWYgUl9QUEM2NF9SRUwxNF9CUlRBS0VOCisjdW5kZWYgUl9QUEM2NF9SRUwxNF9CUk5UQUtFTgorI3VuZGVmIFJfUFBDNjRfR09UMTYKKyN1bmRlZiBSX1BQQzY0X0dPVDE2X0xPCisjdW5kZWYgUl9QUEM2NF9HT1QxNl9ISQorI3VuZGVmIFJfUFBDNjRfR09UMTZfSEEKKyN1bmRlZiBSX1BQQzY0X0dMT0JfREFUCisjdW5kZWYgUl9QUEM2NF9KTVBfU0xPVAorI3VuZGVmIFJfUFBDNjRfUkVMQVRJVkUKKyN1bmRlZiBSX1BQQzY0X1JFTDMyCisjdW5kZWYgUl9QUEM2NF9BRERSNjQKKyN1bmRlZiBSX1BQQzY0X0FERFIxNl9ISUdIRVIKKyN1bmRlZiBSX1BQQzY0X0FERFIxNl9ISUdIRVJBCisjdW5kZWYgUl9QUEM2NF9BRERSMTZfSElHSEVTVAorI3VuZGVmIFJfUFBDNjRfQUREUjE2X0hJR0hFU1RBCisjdW5kZWYgUl9QUEM2NF9SRUw2NAorI3VuZGVmIFJfUFBDNjRfVE9DMTYKKyN1bmRlZiBSX1BQQzY0X1RPQzE2X0xPCisjdW5kZWYgUl9QUEM2NF9UT0MxNl9ISQorI3VuZGVmIFJfUFBDNjRfVE9DMTZfSEEKKyN1bmRlZiBSX1BQQzY0X1RPQworI3VuZGVmIFJfUFBDNjRfQUREUjE2X0RTCisjdW5kZWYgUl9QUEM2NF9BRERSMTZfTE9fRFMKKyN1bmRlZiBSX1BQQzY0X0dPVDE2X0RTCisjdW5kZWYgUl9QUEM2NF9HT1QxNl9MT19EUworI3VuZGVmIFJfUFBDNjRfVE9DMTZfRFMKKyN1bmRlZiBSX1BQQzY0X1RPQzE2X0xPX0RTCisjdW5kZWYgUl9QUEM2NF9UTFMKKyN1bmRlZiBSX1BQQzY0X0RUUE1PRDY0CisjdW5kZWYgUl9QUEM2NF9UUFJFTDE2CisjdW5kZWYgUl9QUEM2NF9UUFJFTDE2X0xPCisjdW5kZWYgUl9QUEM2NF9UUFJFTDE2X0hJCisjdW5kZWYgUl9QUEM2NF9UUFJFTDE2X0hBCisjdW5kZWYgUl9QUEM2NF9UUFJFTDY0CisjdW5kZWYgUl9QUEM2NF9EVFBSRUwxNgorI3VuZGVmIFJfUFBDNjRfRFRQUkVMMTZfTE8KKyN1bmRlZiBSX1BQQzY0X0RUUFJFTDE2X0hJCisjdW5kZWYgUl9QUEM2NF9EVFBSRUwxNl9IQQorI3VuZGVmIFJfUFBDNjRfRFRQUkVMNjQKKyN1bmRlZiBSX1BQQzY0X0dPVF9UTFNHRDE2CisjdW5kZWYgUl9QUEM2NF9HT1RfVExTR0QxNl9MTworI3VuZGVmIFJfUFBDNjRfR09UX1RMU0dEMTZfSEkKKyN1bmRlZiBSX1BQQzY0X0dPVF9UTFNHRDE2X0hBCisjdW5kZWYgUl9QUEM2NF9HT1RfVExTTEQxNgorI3VuZGVmIFJfUFBDNjRfR09UX1RMU0xEMTZfTE8KKyN1bmRlZiBSX1BQQzY0X0dPVF9UTFNMRDE2X0hJCisjdW5kZWYgUl9QUEM2NF9HT1RfVExTTEQxNl9IQQorI3VuZGVmIFJfUFBDNjRfR09UX1RQUkVMMTZfRFMKKyN1bmRlZiBSX1BQQzY0X0dPVF9UUFJFTDE2X0xPX0RTCisjdW5kZWYgUl9QUEM2NF9HT1RfVFBSRUwxNl9ISQorI3VuZGVmIFJfUFBDNjRfR09UX1RQUkVMMTZfSEEKKyN1bmRlZiBSX1BQQzY0X0dPVF9EVFBSRUwxNl9EUworI3VuZGVmIFJfUFBDNjRfR09UX0RUUFJFTDE2X0xPX0RTCisjdW5kZWYgUl9QUEM2NF9HT1RfRFRQUkVMMTZfSEkKKyN1bmRlZiBSX1BQQzY0X0dPVF9EVFBSRUwxNl9IQQorI3VuZGVmIFJfUFBDNjRfVFBSRUwxNl9EUworI3VuZGVmIFJfUFBDNjRfVFBSRUwxNl9MT19EUworI3VuZGVmIFJfUFBDNjRfVFBSRUwxNl9ISUdIRVIKKyN1bmRlZiBSX1BQQzY0X1RQUkVMMTZfSElHSEVSQQorI3VuZGVmIFJfUFBDNjRfVFBSRUwxNl9ISUdIRVNUCisjdW5kZWYgUl9QUEM2NF9UUFJFTDE2X0hJR0hFU1RBCisjdW5kZWYgUl9QUEM2NF9EVFBSRUwxNl9EUworI3VuZGVmIFJfUFBDNjRfRFRQUkVMMTZfTE9fRFMKKyN1bmRlZiBSX1BQQzY0X0RUUFJFTDE2X0hJR0hFUgorI3VuZGVmIFJfUFBDNjRfRFRQUkVMMTZfSElHSEVSQQorI3VuZGVmIFJfUFBDNjRfRFRQUkVMMTZfSElHSEVTVAorI3VuZGVmIFJfUFBDNjRfRFRQUkVMMTZfSElHSEVTVEEKKyN1bmRlZiBSX1BQQzY0X1RMU0dECisjdW5kZWYgUl9QUEM2NF9UTFNMRAorI3VuZGVmIFJfUFBDNjRfUkVMMTYKKyN1bmRlZiBSX1BQQzY0X1JFTDE2X0xPCisjdW5kZWYgUl9QUEM2NF9SRUwxNl9ISQorI3VuZGVmIFJfUFBDNjRfUkVMMTZfSEEKKworRUxGX1JFTE9DKFJfUFBDNjRfTk9ORSwgICAgICAgICAgICAgICAgIDApCitFTEZfUkVMT0MoUl9QUEM2NF9BRERSMzIsICAgICAgICAgICAgICAgMSkKK0VMRl9SRUxPQyhSX1BQQzY0X0FERFIyNCwgICAgICAgICAgICAgICAyKQorRUxGX1JFTE9DKFJfUFBDNjRfQUREUjE2LCAgICAgICAgICAgICAgIDMpCitFTEZfUkVMT0MoUl9QUEM2NF9BRERSMTZfTE8sICAgICAgICAgICAgNCkKK0VMRl9SRUxPQyhSX1BQQzY0X0FERFIxNl9ISSwgICAgICAgICAgICA1KQorRUxGX1JFTE9DKFJfUFBDNjRfQUREUjE2X0hBLCAgICAgICAgICAgIDYpCitFTEZfUkVMT0MoUl9QUEM2NF9BRERSMTQsICAgICAgICAgICAgICAgNykKK0VMRl9SRUxPQyhSX1BQQzY0X0FERFIxNF9CUlRBS0VOLCAgICAgICA4KQorRUxGX1JFTE9DKFJfUFBDNjRfQUREUjE0X0JSTlRBS0VOLCAgICAgIDkpCitFTEZfUkVMT0MoUl9QUEM2NF9SRUwyNCwgICAgICAgICAgICAgICAgMTApCitFTEZfUkVMT0MoUl9QUEM2NF9SRUwxNCwgICAgICAgICAgICAgICAgMTEpCitFTEZfUkVMT0MoUl9QUEM2NF9SRUwxNF9CUlRBS0VOLCAgICAgICAgMTIpCitFTEZfUkVMT0MoUl9QUEM2NF9SRUwxNF9CUk5UQUtFTiwgICAgICAgMTMpCitFTEZfUkVMT0MoUl9QUEM2NF9HT1QxNiwgICAgICAgICAgICAgICAgMTQpCitFTEZfUkVMT0MoUl9QUEM2NF9HT1QxNl9MTywgICAgICAgICAgICAgMTUpCitFTEZfUkVMT0MoUl9QUEM2NF9HT1QxNl9ISSwgICAgICAgICAgICAgMTYpCitFTEZfUkVMT0MoUl9QUEM2NF9HT1QxNl9IQSwgICAgICAgICAgICAgMTcpCitFTEZfUkVMT0MoUl9QUEM2NF9HTE9CX0RBVCwgICAgICAgICAgICAgMjApCitFTEZfUkVMT0MoUl9QUEM2NF9KTVBfU0xPVCwgICAgICAgICAgICAgMjEpCitFTEZfUkVMT0MoUl9QUEM2NF9SRUxBVElWRSwgICAgICAgICAgICAgMjIpCitFTEZfUkVMT0MoUl9QUEM2NF9SRUwzMiwgICAgICAgICAgICAgICAgMjYpCitFTEZfUkVMT0MoUl9QUEM2NF9BRERSNjQsICAgICAgICAgICAgICAgMzgpCitFTEZfUkVMT0MoUl9QUEM2NF9BRERSMTZfSElHSEVSLCAgICAgICAgMzkpCitFTEZfUkVMT0MoUl9QUEM2NF9BRERSMTZfSElHSEVSQSwgICAgICAgNDApCitFTEZfUkVMT0MoUl9QUEM2NF9BRERSMTZfSElHSEVTVCwgICAgICAgNDEpCitFTEZfUkVMT0MoUl9QUEM2NF9BRERSMTZfSElHSEVTVEEsICAgICAgNDIpCitFTEZfUkVMT0MoUl9QUEM2NF9SRUw2NCwgICAgICAgICAgICAgICAgNDQpCitFTEZfUkVMT0MoUl9QUEM2NF9UT0MxNiwgICAgICAgICAgICAgICAgNDcpCitFTEZfUkVMT0MoUl9QUEM2NF9UT0MxNl9MTywgICAgICAgICAgICAgNDgpCitFTEZfUkVMT0MoUl9QUEM2NF9UT0MxNl9ISSwgICAgICAgICAgICAgNDkpCitFTEZfUkVMT0MoUl9QUEM2NF9UT0MxNl9IQSwgICAgICAgICAgICAgNTApCitFTEZfUkVMT0MoUl9QUEM2NF9UT0MsICAgICAgICAgICAgICAgICAgNTEpCitFTEZfUkVMT0MoUl9QUEM2NF9BRERSMTZfRFMsICAgICAgICAgICAgNTYpCitFTEZfUkVMT0MoUl9QUEM2NF9BRERSMTZfTE9fRFMsICAgICAgICAgNTcpCitFTEZfUkVMT0MoUl9QUEM2NF9HT1QxNl9EUywgICAgICAgICAgICAgNTgpCitFTEZfUkVMT0MoUl9QUEM2NF9HT1QxNl9MT19EUywgICAgICAgICAgNTkpCitFTEZfUkVMT0MoUl9QUEM2NF9UT0MxNl9EUywgICAgICAgICAgICAgNjMpCitFTEZfUkVMT0MoUl9QUEM2NF9UT0MxNl9MT19EUywgICAgICAgICAgNjQpCitFTEZfUkVMT0MoUl9QUEM2NF9UTFMsICAgICAgICAgICAgICAgICAgNjcpCitFTEZfUkVMT0MoUl9QUEM2NF9EVFBNT0Q2NCwgICAgICAgICAgICAgNjgpCitFTEZfUkVMT0MoUl9QUEM2NF9UUFJFTDE2LCAgICAgICAgICAgICAgNjkpCitFTEZfUkVMT0MoUl9QUEM2NF9UUFJFTDE2X0xPLCAgICAgICAgICAgNzApCitFTEZfUkVMT0MoUl9QUEM2NF9UUFJFTDE2X0hJLCAgICAgICAgICAgNzEpCitFTEZfUkVMT0MoUl9QUEM2NF9UUFJFTDE2X0hBLCAgICAgICAgICAgNzIpCitFTEZfUkVMT0MoUl9QUEM2NF9UUFJFTDY0LCAgICAgICAgICAgICAgNzMpCitFTEZfUkVMT0MoUl9QUEM2NF9EVFBSRUwxNiwgICAgICAgICAgICAgNzQpCitFTEZfUkVMT0MoUl9QUEM2NF9EVFBSRUwxNl9MTywgICAgICAgICAgNzUpCitFTEZfUkVMT0MoUl9QUEM2NF9EVFBSRUwxNl9ISSwgICAgICAgICAgNzYpCitFTEZfUkVMT0MoUl9QUEM2NF9EVFBSRUwxNl9IQSwgICAgICAgICAgNzcpCitFTEZfUkVMT0MoUl9QUEM2NF9EVFBSRUw2NCwgICAgICAgICAgICAgNzgpCitFTEZfUkVMT0MoUl9QUEM2NF9HT1RfVExTR0QxNiwgICAgICAgICAgNzkpCitFTEZfUkVMT0MoUl9QUEM2NF9HT1RfVExTR0QxNl9MTywgICAgICAgODApCitFTEZfUkVMT0MoUl9QUEM2NF9HT1RfVExTR0QxNl9ISSwgICAgICAgODEpCitFTEZfUkVMT0MoUl9QUEM2NF9HT1RfVExTR0QxNl9IQSwgICAgICAgODIpCitFTEZfUkVMT0MoUl9QUEM2NF9HT1RfVExTTEQxNiwgICAgICAgICAgODMpCitFTEZfUkVMT0MoUl9QUEM2NF9HT1RfVExTTEQxNl9MTywgICAgICAgODQpCitFTEZfUkVMT0MoUl9QUEM2NF9HT1RfVExTTEQxNl9ISSwgICAgICAgODUpCitFTEZfUkVMT0MoUl9QUEM2NF9HT1RfVExTTEQxNl9IQSwgICAgICAgODYpCitFTEZfUkVMT0MoUl9QUEM2NF9HT1RfVFBSRUwxNl9EUywgICAgICAgODcpCitFTEZfUkVMT0MoUl9QUEM2NF9HT1RfVFBSRUwxNl9MT19EUywgICAgODgpCitFTEZfUkVMT0MoUl9QUEM2NF9HT1RfVFBSRUwxNl9ISSwgICAgICAgODkpCitFTEZfUkVMT0MoUl9QUEM2NF9HT1RfVFBSRUwxNl9IQSwgICAgICAgOTApCitFTEZfUkVMT0MoUl9QUEM2NF9HT1RfRFRQUkVMMTZfRFMsICAgICAgOTEpCitFTEZfUkVMT0MoUl9QUEM2NF9HT1RfRFRQUkVMMTZfTE9fRFMsICAgOTIpCitFTEZfUkVMT0MoUl9QUEM2NF9HT1RfRFRQUkVMMTZfSEksICAgICAgOTMpCitFTEZfUkVMT0MoUl9QUEM2NF9HT1RfRFRQUkVMMTZfSEEsICAgICAgOTQpCitFTEZfUkVMT0MoUl9QUEM2NF9UUFJFTDE2X0RTLCAgICAgICAgICAgOTUpCitFTEZfUkVMT0MoUl9QUEM2NF9UUFJFTDE2X0xPX0RTLCAgICAgICAgOTYpCitFTEZfUkVMT0MoUl9QUEM2NF9UUFJFTDE2X0hJR0hFUiwgICAgICAgOTcpCitFTEZfUkVMT0MoUl9QUEM2NF9UUFJFTDE2X0hJR0hFUkEsICAgICAgOTgpCitFTEZfUkVMT0MoUl9QUEM2NF9UUFJFTDE2X0hJR0hFU1QsICAgICAgOTkpCitFTEZfUkVMT0MoUl9QUEM2NF9UUFJFTDE2X0hJR0hFU1RBLCAgICAgMTAwKQorRUxGX1JFTE9DKFJfUFBDNjRfRFRQUkVMMTZfRFMsICAgICAgICAgIDEwMSkKK0VMRl9SRUxPQyhSX1BQQzY0X0RUUFJFTDE2X0xPX0RTLCAgICAgICAxMDIpCitFTEZfUkVMT0MoUl9QUEM2NF9EVFBSRUwxNl9ISUdIRVIsICAgICAgMTAzKQorRUxGX1JFTE9DKFJfUFBDNjRfRFRQUkVMMTZfSElHSEVSQSwgICAgIDEwNCkKK0VMRl9SRUxPQyhSX1BQQzY0X0RUUFJFTDE2X0hJR0hFU1QsICAgICAxMDUpCitFTEZfUkVMT0MoUl9QUEM2NF9EVFBSRUwxNl9ISUdIRVNUQSwgICAgMTA2KQorRUxGX1JFTE9DKFJfUFBDNjRfVExTR0QsICAgICAgICAgICAgICAgIDEwNykKK0VMRl9SRUxPQyhSX1BQQzY0X1RMU0xELCAgICAgICAgICAgICAgICAxMDgpCitFTEZfUkVMT0MoUl9QUEM2NF9SRUwxNiwgICAgICAgICAgICAgICAgMjQ5KQorRUxGX1JFTE9DKFJfUFBDNjRfUkVMMTZfTE8sICAgICAgICAgICAgIDI1MCkKK0VMRl9SRUxPQyhSX1BQQzY0X1JFTDE2X0hJLCAgICAgICAgICAgICAyNTEpCitFTEZfUkVMT0MoUl9QUEM2NF9SRUwxNl9IQSwgICAgICAgICAgICAgMjUyKQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL1JJU0NWLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9SSVNDVi5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNjNGMwZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9SSVNDVi5kZWYKQEAgLTAsMCArMSw1OSBAQAorCisjaWZuZGVmIEVMRl9SRUxPQworI2Vycm9yICJFTEZfUkVMT0MgbXVzdCBiZSBkZWZpbmVkIgorI2VuZGlmCisKK0VMRl9SRUxPQyhSX1JJU0NWX05PTkUsICAgICAgICAgICAgICAgMCkKK0VMRl9SRUxPQyhSX1JJU0NWXzMyLCAgICAgICAgICAgICAgICAgMSkKK0VMRl9SRUxPQyhSX1JJU0NWXzY0LCAgICAgICAgICAgICAgICAgMikKK0VMRl9SRUxPQyhSX1JJU0NWX1JFTEFUSVZFLCAgICAgICAgICAgMykKK0VMRl9SRUxPQyhSX1JJU0NWX0NPUFksICAgICAgICAgICAgICAgNCkKK0VMRl9SRUxPQyhSX1JJU0NWX0pVTVBfU0xPVCwgICAgICAgICAgNSkKK0VMRl9SRUxPQyhSX1JJU0NWX1RMU19EVFBNT0QzMiwgICAgICAgNikKK0VMRl9SRUxPQyhSX1JJU0NWX1RMU19EVFBNT0Q2NCwgICAgICAgNykKK0VMRl9SRUxPQyhSX1JJU0NWX1RMU19EVFBSRUwzMiwgICAgICAgOCkKK0VMRl9SRUxPQyhSX1JJU0NWX1RMU19EVFBSRUw2NCwgICAgICAgOSkKK0VMRl9SRUxPQyhSX1JJU0NWX1RMU19UUFJFTDMyLCAgICAgICAxMCkKK0VMRl9SRUxPQyhSX1JJU0NWX1RMU19UUFJFTDY0LCAgICAgICAxMSkKK0VMRl9SRUxPQyhSX1JJU0NWX0JSQU5DSCwgICAgICAgICAgICAxNikKK0VMRl9SRUxPQyhSX1JJU0NWX0pBTCwgICAgICAgICAgICAgICAxNykKK0VMRl9SRUxPQyhSX1JJU0NWX0NBTEwsICAgICAgICAgICAgICAxOCkKK0VMRl9SRUxPQyhSX1JJU0NWX0NBTExfUExULCAgICAgICAgICAxOSkKK0VMRl9SRUxPQyhSX1JJU0NWX0dPVF9ISTIwLCAgICAgICAgICAyMCkKK0VMRl9SRUxPQyhSX1JJU0NWX1RMU19HT1RfSEkyMCwgICAgICAyMSkKK0VMRl9SRUxPQyhSX1JJU0NWX1RMU19HRF9ISTIwLCAgICAgICAyMikKK0VMRl9SRUxPQyhSX1JJU0NWX1BDUkVMX0hJMjAsICAgICAgICAyMykKK0VMRl9SRUxPQyhSX1JJU0NWX1BDUkVMX0xPMTJfSSwgICAgICAyNCkKK0VMRl9SRUxPQyhSX1JJU0NWX1BDUkVMX0xPMTJfUywgICAgICAyNSkKK0VMRl9SRUxPQyhSX1JJU0NWX0hJMjAsICAgICAgICAgICAgICAyNikKK0VMRl9SRUxPQyhSX1JJU0NWX0xPMTJfSSwgICAgICAgICAgICAyNykKK0VMRl9SRUxPQyhSX1JJU0NWX0xPMTJfUywgICAgICAgICAgICAyOCkKK0VMRl9SRUxPQyhSX1JJU0NWX1RQUkVMX0hJMjAsICAgICAgICAyOSkKK0VMRl9SRUxPQyhSX1JJU0NWX1RQUkVMX0xPMTJfSSwgICAgICAzMCkKK0VMRl9SRUxPQyhSX1JJU0NWX1RQUkVMX0xPMTJfUywgICAgICAzMSkKK0VMRl9SRUxPQyhSX1JJU0NWX1RQUkVMX0FERCwgICAgICAgICAzMikKK0VMRl9SRUxPQyhSX1JJU0NWX0FERDgsICAgICAgICAgICAgICAzMykKK0VMRl9SRUxPQyhSX1JJU0NWX0FERDE2LCAgICAgICAgICAgICAzNCkKK0VMRl9SRUxPQyhSX1JJU0NWX0FERDMyLCAgICAgICAgICAgICAzNSkKK0VMRl9SRUxPQyhSX1JJU0NWX0FERDY0LCAgICAgICAgICAgICAzNikKK0VMRl9SRUxPQyhSX1JJU0NWX1NVQjgsICAgICAgICAgICAgICAzNykKK0VMRl9SRUxPQyhSX1JJU0NWX1NVQjE2LCAgICAgICAgICAgICAzOCkKK0VMRl9SRUxPQyhSX1JJU0NWX1NVQjMyLCAgICAgICAgICAgICAzOSkKK0VMRl9SRUxPQyhSX1JJU0NWX1NVQjY0LCAgICAgICAgICAgICA0MCkKK0VMRl9SRUxPQyhSX1JJU0NWX0dOVV9WVElOSEVSSVQsICAgICA0MSkKK0VMRl9SRUxPQyhSX1JJU0NWX0dOVV9WVEVOVFJZLCAgICAgICA0MikKK0VMRl9SRUxPQyhSX1JJU0NWX0FMSUdOLCAgICAgICAgICAgICA0MykKK0VMRl9SRUxPQyhSX1JJU0NWX1JWQ19CUkFOQ0gsICAgICAgICA0NCkKK0VMRl9SRUxPQyhSX1JJU0NWX1JWQ19KVU1QLCAgICAgICAgICA0NSkKK0VMRl9SRUxPQyhSX1JJU0NWX1JWQ19MVUksICAgICAgICAgICA0NikKK0VMRl9SRUxPQyhSX1JJU0NWX0dQUkVMX0ksICAgICAgICAgICA0NykKK0VMRl9SRUxPQyhSX1JJU0NWX0dQUkVMX1MsICAgICAgICAgICA0OCkKK0VMRl9SRUxPQyhSX1JJU0NWX1RQUkVMX0ksICAgICAgICAgICA0OSkKK0VMRl9SRUxPQyhSX1JJU0NWX1RQUkVMX1MsICAgICAgICAgICA1MCkKK0VMRl9SRUxPQyhSX1JJU0NWX1JFTEFYLCAgICAgICAgICAgICA1MSkKK0VMRl9SRUxPQyhSX1JJU0NWX1NVQjYsICAgICAgICAgICAgICA1MikKK0VMRl9SRUxPQyhSX1JJU0NWX1NFVDYsICAgICAgICAgICAgICA1MykKK0VMRl9SRUxPQyhSX1JJU0NWX1NFVDgsICAgICAgICAgICAgICA1NCkKK0VMRl9SRUxPQyhSX1JJU0NWX1NFVDE2LCAgICAgICAgICAgICA1NSkKK0VMRl9SRUxPQyhSX1JJU0NWX1NFVDMyLCAgICAgICAgICAgICA1NikKK0VMRl9SRUxPQyhSX1JJU0NWXzMyX1BDUkVMLCAgICAgICAgICA1NykKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9TcGFyYy5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvU3BhcmMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlMDFhNGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvU3BhcmMuZGVmCkBAIC0wLDAgKzEsODkgQEAKKworI2lmbmRlZiBFTEZfUkVMT0MKKyNlcnJvciAiRUxGX1JFTE9DIG11c3QgYmUgZGVmaW5lZCIKKyNlbmRpZgorCitFTEZfUkVMT0MoUl9TUEFSQ19OT05FLCAgICAgICAgIDApCitFTEZfUkVMT0MoUl9TUEFSQ184LCAgICAgICAgICAgIDEpCitFTEZfUkVMT0MoUl9TUEFSQ18xNiwgICAgICAgICAgIDIpCitFTEZfUkVMT0MoUl9TUEFSQ18zMiwgICAgICAgICAgIDMpCitFTEZfUkVMT0MoUl9TUEFSQ19ESVNQOCwgICAgICAgIDQpCitFTEZfUkVMT0MoUl9TUEFSQ19ESVNQMTYsICAgICAgIDUpCitFTEZfUkVMT0MoUl9TUEFSQ19ESVNQMzIsICAgICAgIDYpCitFTEZfUkVMT0MoUl9TUEFSQ19XRElTUDMwLCAgICAgIDcpCitFTEZfUkVMT0MoUl9TUEFSQ19XRElTUDIyLCAgICAgIDgpCitFTEZfUkVMT0MoUl9TUEFSQ19ISTIyLCAgICAgICAgIDkpCitFTEZfUkVMT0MoUl9TUEFSQ18yMiwgICAgICAgICAgIDEwKQorRUxGX1JFTE9DKFJfU1BBUkNfMTMsICAgICAgICAgICAxMSkKK0VMRl9SRUxPQyhSX1NQQVJDX0xPMTAsICAgICAgICAgMTIpCitFTEZfUkVMT0MoUl9TUEFSQ19HT1QxMCwgICAgICAgIDEzKQorRUxGX1JFTE9DKFJfU1BBUkNfR09UMTMsICAgICAgICAxNCkKK0VMRl9SRUxPQyhSX1NQQVJDX0dPVDIyLCAgICAgICAgMTUpCitFTEZfUkVMT0MoUl9TUEFSQ19QQzEwLCAgICAgICAgIDE2KQorRUxGX1JFTE9DKFJfU1BBUkNfUEMyMiwgICAgICAgICAxNykKK0VMRl9SRUxPQyhSX1NQQVJDX1dQTFQzMCwgICAgICAgMTgpCitFTEZfUkVMT0MoUl9TUEFSQ19DT1BZLCAgICAgICAgIDE5KQorRUxGX1JFTE9DKFJfU1BBUkNfR0xPQl9EQVQsICAgICAyMCkKK0VMRl9SRUxPQyhSX1NQQVJDX0pNUF9TTE9ULCAgICAgMjEpCitFTEZfUkVMT0MoUl9TUEFSQ19SRUxBVElWRSwgICAgIDIyKQorRUxGX1JFTE9DKFJfU1BBUkNfVUEzMiwgICAgICAgICAyMykKK0VMRl9SRUxPQyhSX1NQQVJDX1BMVDMyLCAgICAgICAgMjQpCitFTEZfUkVMT0MoUl9TUEFSQ19ISVBMVDIyLCAgICAgIDI1KQorRUxGX1JFTE9DKFJfU1BBUkNfTE9QTFQxMCwgICAgICAyNikKK0VMRl9SRUxPQyhSX1NQQVJDX1BDUExUMzIsICAgICAgMjcpCitFTEZfUkVMT0MoUl9TUEFSQ19QQ1BMVDIyLCAgICAgIDI4KQorRUxGX1JFTE9DKFJfU1BBUkNfUENQTFQxMCwgICAgICAyOSkKK0VMRl9SRUxPQyhSX1NQQVJDXzEwLCAgICAgICAgICAgMzApCitFTEZfUkVMT0MoUl9TUEFSQ18xMSwgICAgICAgICAgIDMxKQorRUxGX1JFTE9DKFJfU1BBUkNfNjQsICAgICAgICAgICAzMikKK0VMRl9SRUxPQyhSX1NQQVJDX09MTzEwLCAgICAgICAgMzMpCitFTEZfUkVMT0MoUl9TUEFSQ19ISDIyLCAgICAgICAgIDM0KQorRUxGX1JFTE9DKFJfU1BBUkNfSE0xMCwgICAgICAgICAzNSkKK0VMRl9SRUxPQyhSX1NQQVJDX0xNMjIsICAgICAgICAgMzYpCitFTEZfUkVMT0MoUl9TUEFSQ19QQ19ISDIyLCAgICAgIDM3KQorRUxGX1JFTE9DKFJfU1BBUkNfUENfSE0xMCwgICAgICAzOCkKK0VMRl9SRUxPQyhSX1NQQVJDX1BDX0xNMjIsICAgICAgMzkpCitFTEZfUkVMT0MoUl9TUEFSQ19XRElTUDE2LCAgICAgIDQwKQorRUxGX1JFTE9DKFJfU1BBUkNfV0RJU1AxOSwgICAgICA0MSkKK0VMRl9SRUxPQyhSX1NQQVJDXzcsICAgICAgICAgICAgNDMpCitFTEZfUkVMT0MoUl9TUEFSQ181LCAgICAgICAgICAgIDQ0KQorRUxGX1JFTE9DKFJfU1BBUkNfNiwgICAgICAgICAgICA0NSkKK0VMRl9SRUxPQyhSX1NQQVJDX0RJU1A2NCwgICAgICAgNDYpCitFTEZfUkVMT0MoUl9TUEFSQ19QTFQ2NCwgICAgICAgIDQ3KQorRUxGX1JFTE9DKFJfU1BBUkNfSElYMjIsICAgICAgICA0OCkKK0VMRl9SRUxPQyhSX1NQQVJDX0xPWDEwLCAgICAgICAgNDkpCitFTEZfUkVMT0MoUl9TUEFSQ19INDQsICAgICAgICAgIDUwKQorRUxGX1JFTE9DKFJfU1BBUkNfTTQ0LCAgICAgICAgICA1MSkKK0VMRl9SRUxPQyhSX1NQQVJDX0w0NCwgICAgICAgICAgNTIpCitFTEZfUkVMT0MoUl9TUEFSQ19SRUdJU1RFUiwgICAgIDUzKQorRUxGX1JFTE9DKFJfU1BBUkNfVUE2NCwgICAgICAgICA1NCkKK0VMRl9SRUxPQyhSX1NQQVJDX1VBMTYsICAgICAgICAgNTUpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfR0RfSEkyMiwgICAgNTYpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfR0RfTE8xMCwgICAgNTcpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfR0RfQURELCAgICAgNTgpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfR0RfQ0FMTCwgICAgNTkpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfTERNX0hJMjIsICAgNjApCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfTERNX0xPMTAsICAgNjEpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfTERNX0FERCwgICAgNjIpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfTERNX0NBTEwsICAgNjMpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfTERPX0hJWDIyLCAgNjQpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfTERPX0xPWDEwLCAgNjUpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfTERPX0FERCwgICAgNjYpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfSUVfSEkyMiwgICAgNjcpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfSUVfTE8xMCwgICAgNjgpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfSUVfTEQsICAgICAgNjkpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfSUVfTERYLCAgICAgNzApCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfSUVfQURELCAgICAgNzEpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfTEVfSElYMjIsICAgNzIpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfTEVfTE9YMTAsICAgNzMpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfRFRQTU9EMzIsICAgNzQpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfRFRQTU9ENjQsICAgNzUpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfRFRQT0ZGMzIsICAgNzYpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfRFRQT0ZGNjQsICAgNzcpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfVFBPRkYzMiwgICAgNzgpCitFTEZfUkVMT0MoUl9TUEFSQ19UTFNfVFBPRkY2NCwgICAgNzkpCitFTEZfUkVMT0MoUl9TUEFSQ19HT1REQVRBX0hJWDIyLCAgODApCitFTEZfUkVMT0MoUl9TUEFSQ19HT1REQVRBX0xPWDEwLCAgODEpCitFTEZfUkVMT0MoUl9TUEFSQ19HT1REQVRBX09QX0hJWDIyLCAgODIpCitFTEZfUkVMT0MoUl9TUEFSQ19HT1REQVRBX09QX0xPWDEwLCAgODMpCitFTEZfUkVMT0MoUl9TUEFSQ19HT1REQVRBX09QLCAgICAgODQpCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvU3lzdGVtWi5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvU3lzdGVtWi5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZjMGI3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9TeXN0ZW1aLmRlZgpAQCAtMCwwICsxLDcxIEBACisKKyNpZm5kZWYgRUxGX1JFTE9DCisjZXJyb3IgIkVMRl9SRUxPQyBtdXN0IGJlIGRlZmluZWQiCisjZW5kaWYKKworRUxGX1JFTE9DKFJfMzkwX05PTkUsICAgICAgICAgIDApCitFTEZfUkVMT0MoUl8zOTBfOCwgICAgICAgICAgICAgMSkKK0VMRl9SRUxPQyhSXzM5MF8xMiwgICAgICAgICAgICAyKQorRUxGX1JFTE9DKFJfMzkwXzE2LCAgICAgICAgICAgIDMpCitFTEZfUkVMT0MoUl8zOTBfMzIsICAgICAgICAgICAgNCkKK0VMRl9SRUxPQyhSXzM5MF9QQzMyLCAgICAgICAgICA1KQorRUxGX1JFTE9DKFJfMzkwX0dPVDEyLCAgICAgICAgIDYpCitFTEZfUkVMT0MoUl8zOTBfR09UMzIsICAgICAgICAgNykKK0VMRl9SRUxPQyhSXzM5MF9QTFQzMiwgICAgICAgICA4KQorRUxGX1JFTE9DKFJfMzkwX0NPUFksICAgICAgICAgIDkpCitFTEZfUkVMT0MoUl8zOTBfR0xPQl9EQVQsICAgICAxMCkKK0VMRl9SRUxPQyhSXzM5MF9KTVBfU0xPVCwgICAgIDExKQorRUxGX1JFTE9DKFJfMzkwX1JFTEFUSVZFLCAgICAgMTIpCitFTEZfUkVMT0MoUl8zOTBfR09UT0ZGLCAgICAgICAxMykKK0VMRl9SRUxPQyhSXzM5MF9HT1RQQywgICAgICAgIDE0KQorRUxGX1JFTE9DKFJfMzkwX0dPVDE2LCAgICAgICAgMTUpCitFTEZfUkVMT0MoUl8zOTBfUEMxNiwgICAgICAgICAxNikKK0VMRl9SRUxPQyhSXzM5MF9QQzE2REJMLCAgICAgIDE3KQorRUxGX1JFTE9DKFJfMzkwX1BMVDE2REJMLCAgICAgMTgpCitFTEZfUkVMT0MoUl8zOTBfUEMzMkRCTCwgICAgICAxOSkKK0VMRl9SRUxPQyhSXzM5MF9QTFQzMkRCTCwgICAgIDIwKQorRUxGX1JFTE9DKFJfMzkwX0dPVFBDREJMLCAgICAgMjEpCitFTEZfUkVMT0MoUl8zOTBfNjQsICAgICAgICAgICAyMikKK0VMRl9SRUxPQyhSXzM5MF9QQzY0LCAgICAgICAgIDIzKQorRUxGX1JFTE9DKFJfMzkwX0dPVDY0LCAgICAgICAgMjQpCitFTEZfUkVMT0MoUl8zOTBfUExUNjQsICAgICAgICAyNSkKK0VMRl9SRUxPQyhSXzM5MF9HT1RFTlQsICAgICAgIDI2KQorRUxGX1JFTE9DKFJfMzkwX0dPVE9GRjE2LCAgICAgMjcpCitFTEZfUkVMT0MoUl8zOTBfR09UT0ZGNjQsICAgICAyOCkKK0VMRl9SRUxPQyhSXzM5MF9HT1RQTFQxMiwgICAgIDI5KQorRUxGX1JFTE9DKFJfMzkwX0dPVFBMVDE2LCAgICAgMzApCitFTEZfUkVMT0MoUl8zOTBfR09UUExUMzIsICAgICAzMSkKK0VMRl9SRUxPQyhSXzM5MF9HT1RQTFQ2NCwgICAgIDMyKQorRUxGX1JFTE9DKFJfMzkwX0dPVFBMVEVOVCwgICAgMzMpCitFTEZfUkVMT0MoUl8zOTBfUExUT0ZGMTYsICAgICAzNCkKK0VMRl9SRUxPQyhSXzM5MF9QTFRPRkYzMiwgICAgIDM1KQorRUxGX1JFTE9DKFJfMzkwX1BMVE9GRjY0LCAgICAgMzYpCitFTEZfUkVMT0MoUl8zOTBfVExTX0xPQUQsICAgICAzNykKK0VMRl9SRUxPQyhSXzM5MF9UTFNfR0RDQUxMLCAgIDM4KQorRUxGX1JFTE9DKFJfMzkwX1RMU19MRENBTEwsICAgMzkpCitFTEZfUkVMT0MoUl8zOTBfVExTX0dEMzIsICAgICA0MCkKK0VMRl9SRUxPQyhSXzM5MF9UTFNfR0Q2NCwgICAgIDQxKQorRUxGX1JFTE9DKFJfMzkwX1RMU19HT1RJRTEyLCAgNDIpCitFTEZfUkVMT0MoUl8zOTBfVExTX0dPVElFMzIsICA0MykKK0VMRl9SRUxPQyhSXzM5MF9UTFNfR09USUU2NCwgIDQ0KQorRUxGX1JFTE9DKFJfMzkwX1RMU19MRE0zMiwgICAgNDUpCitFTEZfUkVMT0MoUl8zOTBfVExTX0xETTY0LCAgICA0NikKK0VMRl9SRUxPQyhSXzM5MF9UTFNfSUUzMiwgICAgIDQ3KQorRUxGX1JFTE9DKFJfMzkwX1RMU19JRTY0LCAgICAgNDgpCitFTEZfUkVMT0MoUl8zOTBfVExTX0lFRU5ULCAgICA0OSkKK0VMRl9SRUxPQyhSXzM5MF9UTFNfTEUzMiwgICAgIDUwKQorRUxGX1JFTE9DKFJfMzkwX1RMU19MRTY0LCAgICAgNTEpCitFTEZfUkVMT0MoUl8zOTBfVExTX0xETzMyLCAgICA1MikKK0VMRl9SRUxPQyhSXzM5MF9UTFNfTERPNjQsICAgIDUzKQorRUxGX1JFTE9DKFJfMzkwX1RMU19EVFBNT0QsICAgNTQpCitFTEZfUkVMT0MoUl8zOTBfVExTX0RUUE9GRiwgICA1NSkKK0VMRl9SRUxPQyhSXzM5MF9UTFNfVFBPRkYsICAgIDU2KQorRUxGX1JFTE9DKFJfMzkwXzIwLCAgICAgICAgICAgNTcpCitFTEZfUkVMT0MoUl8zOTBfR09UMjAsICAgICAgICA1OCkKK0VMRl9SRUxPQyhSXzM5MF9HT1RQTFQyMCwgICAgIDU5KQorRUxGX1JFTE9DKFJfMzkwX1RMU19HT1RJRTIwLCAgNjApCitFTEZfUkVMT0MoUl8zOTBfSVJFTEFUSVZFLCAgICA2MSkKK0VMRl9SRUxPQyhSXzM5MF9QQzEyREJMLCAgICAgIDYyKQorRUxGX1JFTE9DKFJfMzkwX1BMVDEyREJMLCAgICAgNjMpCitFTEZfUkVMT0MoUl8zOTBfUEMyNERCTCwgICAgICA2NCkKK0VMRl9SRUxPQyhSXzM5MF9QTFQyNERCTCwgICAgIDY1KQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL1dlYkFzc2VtYmx5LmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9XZWJBc3NlbWJseS5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWEzNDM0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy9XZWJBc3NlbWJseS5kZWYKQEAgLTAsMCArMSw4IEBACisKKyNpZm5kZWYgRUxGX1JFTE9DCisjZXJyb3IgIkVMRl9SRUxPQyBtdXN0IGJlIGRlZmluZWQiCisjZW5kaWYKKworRUxGX1JFTE9DKFJfV0VCQVNTRU1CTFlfTk9ORSwgICAgICAgICAgMCkKK0VMRl9SRUxPQyhSX1dFQkFTU0VNQkxZX0RBVEEsICAgICAgICAgIDEpCitFTEZfUkVMT0MoUl9XRUJBU1NFTUJMWV9GVU5DVElPTiwgICAgICAyKQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL2kzODYuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL2kzODYuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMjhjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9FTEZSZWxvY3MvaTM4Ni5kZWYKQEAgLTAsMCArMSw0NyBAQAorCisjaWZuZGVmIEVMRl9SRUxPQworI2Vycm9yICJFTEZfUkVMT0MgbXVzdCBiZSBkZWZpbmVkIgorI2VuZGlmCisKKy8vIFRPRE86IHRoaXMgaXMganVzdCBhIHN1YnNldAorRUxGX1JFTE9DKFJfMzg2X05PTkUsICAgICAgICAgICAwKQorRUxGX1JFTE9DKFJfMzg2XzMyLCAgICAgICAgICAgICAxKQorRUxGX1JFTE9DKFJfMzg2X1BDMzIsICAgICAgICAgICAyKQorRUxGX1JFTE9DKFJfMzg2X0dPVDMyLCAgICAgICAgICAzKQorRUxGX1JFTE9DKFJfMzg2X1BMVDMyLCAgICAgICAgICA0KQorRUxGX1JFTE9DKFJfMzg2X0NPUFksICAgICAgICAgICA1KQorRUxGX1JFTE9DKFJfMzg2X0dMT0JfREFULCAgICAgICA2KQorRUxGX1JFTE9DKFJfMzg2X0pVTVBfU0xPVCwgICAgICA3KQorRUxGX1JFTE9DKFJfMzg2X1JFTEFUSVZFLCAgICAgICA4KQorRUxGX1JFTE9DKFJfMzg2X0dPVE9GRiwgICAgICAgICA5KQorRUxGX1JFTE9DKFJfMzg2X0dPVFBDLCAgICAgICAgICAxMCkKK0VMRl9SRUxPQyhSXzM4Nl8zMlBMVCwgICAgICAgICAgMTEpCitFTEZfUkVMT0MoUl8zODZfVExTX1RQT0ZGLCAgICAgIDE0KQorRUxGX1JFTE9DKFJfMzg2X1RMU19JRSwgICAgICAgICAxNSkKK0VMRl9SRUxPQyhSXzM4Nl9UTFNfR09USUUsICAgICAgMTYpCitFTEZfUkVMT0MoUl8zODZfVExTX0xFLCAgICAgICAgIDE3KQorRUxGX1JFTE9DKFJfMzg2X1RMU19HRCwgICAgICAgICAxOCkKK0VMRl9SRUxPQyhSXzM4Nl9UTFNfTERNLCAgICAgICAgMTkpCitFTEZfUkVMT0MoUl8zODZfMTYsICAgICAgICAgICAgIDIwKQorRUxGX1JFTE9DKFJfMzg2X1BDMTYsICAgICAgICAgICAyMSkKK0VMRl9SRUxPQyhSXzM4Nl84LCAgICAgICAgICAgICAgMjIpCitFTEZfUkVMT0MoUl8zODZfUEM4LCAgICAgICAgICAgIDIzKQorRUxGX1JFTE9DKFJfMzg2X1RMU19HRF8zMiwgICAgICAyNCkKK0VMRl9SRUxPQyhSXzM4Nl9UTFNfR0RfUFVTSCwgICAgMjUpCitFTEZfUkVMT0MoUl8zODZfVExTX0dEX0NBTEwsICAgIDI2KQorRUxGX1JFTE9DKFJfMzg2X1RMU19HRF9QT1AsICAgICAyNykKK0VMRl9SRUxPQyhSXzM4Nl9UTFNfTERNXzMyLCAgICAgMjgpCitFTEZfUkVMT0MoUl8zODZfVExTX0xETV9QVVNILCAgIDI5KQorRUxGX1JFTE9DKFJfMzg2X1RMU19MRE1fQ0FMTCwgICAzMCkKK0VMRl9SRUxPQyhSXzM4Nl9UTFNfTERNX1BPUCwgICAgMzEpCitFTEZfUkVMT0MoUl8zODZfVExTX0xET18zMiwgICAgIDMyKQorRUxGX1JFTE9DKFJfMzg2X1RMU19JRV8zMiwgICAgICAzMykKK0VMRl9SRUxPQyhSXzM4Nl9UTFNfTEVfMzIsICAgICAgMzQpCitFTEZfUkVMT0MoUl8zODZfVExTX0RUUE1PRDMyLCAgIDM1KQorRUxGX1JFTE9DKFJfMzg2X1RMU19EVFBPRkYzMiwgICAzNikKK0VMRl9SRUxPQyhSXzM4Nl9UTFNfVFBPRkYzMiwgICAgMzcpCitFTEZfUkVMT0MoUl8zODZfVExTX0dPVERFU0MsICAgIDM5KQorRUxGX1JFTE9DKFJfMzg2X1RMU19ERVNDX0NBTEwsICA0MCkKK0VMRl9SRUxPQyhSXzM4Nl9UTFNfREVTQywgICAgICAgNDEpCitFTEZfUkVMT0MoUl8zODZfSVJFTEFUSVZFLCAgICAgIDQyKQorRUxGX1JFTE9DKFJfMzg2X0dPVDMyWCwgICAgICAgICA0MykKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy94ODZfNjQuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvRUxGUmVsb2NzL3g4Nl82NC5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThmZGNmOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L0VMRlJlbG9jcy94ODZfNjQuZGVmCkBAIC0wLDAgKzEsNDUgQEAKKworI2lmbmRlZiBFTEZfUkVMT0MKKyNlcnJvciAiRUxGX1JFTE9DIG11c3QgYmUgZGVmaW5lZCIKKyNlbmRpZgorCitFTEZfUkVMT0MoUl9YODZfNjRfTk9ORSwgICAgICAgIDApCitFTEZfUkVMT0MoUl9YODZfNjRfNjQsICAgICAgICAgIDEpCitFTEZfUkVMT0MoUl9YODZfNjRfUEMzMiwgICAgICAgIDIpCitFTEZfUkVMT0MoUl9YODZfNjRfR09UMzIsICAgICAgIDMpCitFTEZfUkVMT0MoUl9YODZfNjRfUExUMzIsICAgICAgIDQpCitFTEZfUkVMT0MoUl9YODZfNjRfQ09QWSwgICAgICAgIDUpCitFTEZfUkVMT0MoUl9YODZfNjRfR0xPQl9EQVQsICAgIDYpCitFTEZfUkVMT0MoUl9YODZfNjRfSlVNUF9TTE9ULCAgIDcpCitFTEZfUkVMT0MoUl9YODZfNjRfUkVMQVRJVkUsICAgIDgpCitFTEZfUkVMT0MoUl9YODZfNjRfR09UUENSRUwsICAgIDkpCitFTEZfUkVMT0MoUl9YODZfNjRfMzIsICAgICAgICAgIDEwKQorRUxGX1JFTE9DKFJfWDg2XzY0XzMyUywgICAgICAgICAxMSkKK0VMRl9SRUxPQyhSX1g4Nl82NF8xNiwgICAgICAgICAgMTIpCitFTEZfUkVMT0MoUl9YODZfNjRfUEMxNiwgICAgICAgIDEzKQorRUxGX1JFTE9DKFJfWDg2XzY0XzgsICAgICAgICAgICAxNCkKK0VMRl9SRUxPQyhSX1g4Nl82NF9QQzgsICAgICAgICAgMTUpCitFTEZfUkVMT0MoUl9YODZfNjRfRFRQTU9ENjQsICAgIDE2KQorRUxGX1JFTE9DKFJfWDg2XzY0X0RUUE9GRjY0LCAgICAxNykKK0VMRl9SRUxPQyhSX1g4Nl82NF9UUE9GRjY0LCAgICAgMTgpCitFTEZfUkVMT0MoUl9YODZfNjRfVExTR0QsICAgICAgIDE5KQorRUxGX1JFTE9DKFJfWDg2XzY0X1RMU0xELCAgICAgICAyMCkKK0VMRl9SRUxPQyhSX1g4Nl82NF9EVFBPRkYzMiwgICAgMjEpCitFTEZfUkVMT0MoUl9YODZfNjRfR09UVFBPRkYsICAgIDIyKQorRUxGX1JFTE9DKFJfWDg2XzY0X1RQT0ZGMzIsICAgICAyMykKK0VMRl9SRUxPQyhSX1g4Nl82NF9QQzY0LCAgICAgICAgMjQpCitFTEZfUkVMT0MoUl9YODZfNjRfR09UT0ZGNjQsICAgIDI1KQorRUxGX1JFTE9DKFJfWDg2XzY0X0dPVFBDMzIsICAgICAyNikKK0VMRl9SRUxPQyhSX1g4Nl82NF9HT1Q2NCwgICAgICAgMjcpCitFTEZfUkVMT0MoUl9YODZfNjRfR09UUENSRUw2NCwgIDI4KQorRUxGX1JFTE9DKFJfWDg2XzY0X0dPVFBDNjQsICAgICAyOSkKK0VMRl9SRUxPQyhSX1g4Nl82NF9HT1RQTFQ2NCwgICAgMzApCitFTEZfUkVMT0MoUl9YODZfNjRfUExUT0ZGNjQsICAgIDMxKQorRUxGX1JFTE9DKFJfWDg2XzY0X1NJWkUzMiwgICAgICAzMikKK0VMRl9SRUxPQyhSX1g4Nl82NF9TSVpFNjQsICAgICAgMzMpCitFTEZfUkVMT0MoUl9YODZfNjRfR09UUEMzMl9UTFNERVNDLCAgMzQpCitFTEZfUkVMT0MoUl9YODZfNjRfVExTREVTQ19DQUxMLCAgICAgMzUpCitFTEZfUkVMT0MoUl9YODZfNjRfVExTREVTQywgICAgIDM2KQorRUxGX1JFTE9DKFJfWDg2XzY0X0lSRUxBVElWRSwgICAzNykKK0VMRl9SRUxPQyhSX1g4Nl82NF9HT1RQQ1JFTFgsICAgNDEpCitFTEZfUkVMT0MoUl9YODZfNjRfUkVYX0dPVFBDUkVMWCwgICAgNDIpCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9NYWNoTy5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9NYWNoTy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVkZTQ4ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L01hY2hPLmRlZgpAQCAtMCwwICsxLDEyMCBAQAorLy8sLCwtLSBsbHZtL1N1cHBvcnQvTWFjaE8uZGVmIC0gVGhlIE1hY2hPIGZpbGUgZGVmaW5pdGlvbnMgLS0tLS0qLSBDKysgLSotLCwsLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy8sLCwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLCwsLy8KKy8vCisvLyBEZWZpbml0aW9ucyBmb3IgTWFjaE8gZmlsZXMKKy8vCisvLywsLC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0sLCwvLworCisjaWZkZWYgSEFORExFX0xPQURfQ09NTUFORAorCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX1NFR01FTlQsIDB4MDAwMDAwMDF1LCBzZWdtZW50X2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX1NZTVRBQiwgMHgwMDAwMDAwMnUsIHN5bXRhYl9jb21tYW5kKQorLy8gTENfU1lNU0VHIGlzIG9ic29sZXRlIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgorSEFORExFX0xPQURfQ09NTUFORChMQ19TWU1TRUcsIDB4MDAwMDAwMDN1LCBzeW1zZWdfY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfVEhSRUFELCAweDAwMDAwMDA0dSwgdGhyZWFkX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX1VOSVhUSFJFQUQsIDB4MDAwMDAwMDV1LCB0aHJlYWRfY29tbWFuZCkKKy8vIExDX0xPQURGVk1MSUIgaXMgb2Jzb2xldGUgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX0xPQURGVk1MSUIsIDB4MDAwMDAwMDZ1LCBmdm1saWJfY29tbWFuZCkKKy8vIExDX0lERlZNTElCIGlzIG9ic29sZXRlIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgorSEFORExFX0xPQURfQ09NTUFORChMQ19JREZWTUxJQiwgMHgwMDAwMDAwN3UsIGZ2bWxpYl9jb21tYW5kKQorLy8gTENfSURFTlQgaXMgb2Jzb2xldGUgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX0lERU5ULCAweDAwMDAwMDA4dSwgaWRlbnRfY29tbWFuZCkKKy8vIExDX0ZWTUZJTEUgaXMgb2Jzb2xldGUgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX0ZWTUZJTEUsIDB4MDAwMDAwMDl1LCBmdm1maWxlX2NvbW1hbmQpCisvLyBMQ19QUkVQQUdFIGlzIG9ic29sZXRlIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgorSEFORExFX0xPQURfQ09NTUFORChMQ19QUkVQQUdFLCAweDAwMDAwMDBBdSwgbG9hZF9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19EWVNZTVRBQiwgMHgwMDAwMDAwQnUsIGR5c3ltdGFiX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX0xPQURfRFlMSUIsIDB4MDAwMDAwMEN1LCBkeWxpYl9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19JRF9EWUxJQiwgMHgwMDAwMDAwRHUsIGR5bGliX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX0xPQURfRFlMSU5LRVIsIDB4MDAwMDAwMEV1LCBkeWxpbmtlcl9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19JRF9EWUxJTktFUiwgMHgwMDAwMDAwRnUsIGR5bGlua2VyX2NvbW1hbmQpCisvLyBMQ19QUkVCT1VORF9EWUxJQiBpcyBvYnNvbGV0ZSBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfUFJFQk9VTkRfRFlMSUIsIDB4MDAwMDAwMTB1LCBwcmVib3VuZF9keWxpYl9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19ST1VUSU5FUywgMHgwMDAwMDAxMXUsIHJvdXRpbmVzX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX1NVQl9GUkFNRVdPUkssIDB4MDAwMDAwMTJ1LCBzdWJfZnJhbWV3b3JrX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX1NVQl9VTUJSRUxMQSwgMHgwMDAwMDAxM3UsIHN1Yl91bWJyZWxsYV9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19TVUJfQ0xJRU5ULCAweDAwMDAwMDE0dSwgc3ViX2NsaWVudF9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19TVUJfTElCUkFSWSwgMHgwMDAwMDAxNXUsIHN1Yl9saWJyYXJ5X2NvbW1hbmQpCisvLyBMQ19UV09MRVZFTF9ISU5UUyBpcyBvYnNvbGV0ZSBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfVFdPTEVWRUxfSElOVFMsIDB4MDAwMDAwMTZ1LCB0d29sZXZlbF9oaW50c19jb21tYW5kKQorLy8gTENfUFJFQklORF9DS1NVTSBpcyBvYnNvbGV0ZSBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfUFJFQklORF9DS1NVTSwgMHgwMDAwMDAxN3UsIHByZWJpbmRfY2tzdW1fY29tbWFuZCkKKy8vIExDX0xPQURfV0VBS19EWUxJQiBpcyBvYnNvbGV0ZSBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfTE9BRF9XRUFLX0RZTElCLCAweDgwMDAwMDE4dSwgZHlsaWJfY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfU0VHTUVOVF82NCwgMHgwMDAwMDAxOXUsIHNlZ21lbnRfY29tbWFuZF82NCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfUk9VVElORVNfNjQsIDB4MDAwMDAwMUF1LCByb3V0aW5lc19jb21tYW5kXzY0KQorSEFORExFX0xPQURfQ09NTUFORChMQ19VVUlELCAweDAwMDAwMDFCdSwgdXVpZF9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19SUEFUSCwgMHg4MDAwMDAxQ3UsIHJwYXRoX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX0NPREVfU0lHTkFUVVJFLCAweDAwMDAwMDFEdSwgbGlua2VkaXRfZGF0YV9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19TRUdNRU5UX1NQTElUX0lORk8sIDB4MDAwMDAwMUV1LCBsaW5rZWRpdF9kYXRhX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX1JFRVhQT1JUX0RZTElCLCAweDgwMDAwMDFGdSwgZHlsaWJfY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfTEFaWV9MT0FEX0RZTElCLCAweDAwMDAwMDIwdSwgZHlsaWJfY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfRU5DUllQVElPTl9JTkZPLCAweDAwMDAwMDIxdSwgZW5jcnlwdGlvbl9pbmZvX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX0RZTERfSU5GTywgMHgwMDAwMDAyMnUsIGR5bGRfaW5mb19jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19EWUxEX0lORk9fT05MWSwgMHg4MDAwMDAyMnUsIGR5bGRfaW5mb19jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19MT0FEX1VQV0FSRF9EWUxJQiwgMHg4MDAwMDAyM3UsIGR5bGliX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX1ZFUlNJT05fTUlOX01BQ09TWCwgMHgwMDAwMDAyNHUsIHZlcnNpb25fbWluX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX1ZFUlNJT05fTUlOX0lQSE9ORU9TLCAweDAwMDAwMDI1dSwgdmVyc2lvbl9taW5fY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfRlVOQ1RJT05fU1RBUlRTLCAweDAwMDAwMDI2dSwgbGlua2VkaXRfZGF0YV9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19EWUxEX0VOVklST05NRU5ULCAweDAwMDAwMDI3dSwgZHlsaW5rZXJfY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfTUFJTiwgMHg4MDAwMDAyOHUsIGVudHJ5X3BvaW50X2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX0RBVEFfSU5fQ09ERSwgMHgwMDAwMDAyOXUsIGxpbmtlZGl0X2RhdGFfY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfU09VUkNFX1ZFUlNJT04sIDB4MDAwMDAwMkF1LCBzb3VyY2VfdmVyc2lvbl9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19EWUxJQl9DT0RFX1NJR05fRFJTLCAweDAwMDAwMDJCdSwgbGlua2VkaXRfZGF0YV9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19FTkNSWVBUSU9OX0lORk9fNjQsIDB4MDAwMDAwMkN1LAorICAgICAgICAgICAgICAgICAgICBlbmNyeXB0aW9uX2luZm9fY29tbWFuZF82NCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfTElOS0VSX09QVElPTiwgMHgwMDAwMDAyRHUsIGxpbmtlcl9vcHRpb25fY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfTElOS0VSX09QVElNSVpBVElPTl9ISU5ULCAweDAwMDAwMDJFdSwgbGlua2VkaXRfZGF0YV9jb21tYW5kKQorSEFORExFX0xPQURfQ09NTUFORChMQ19WRVJTSU9OX01JTl9UVk9TLCAweDAwMDAwMDJGdSwgdmVyc2lvbl9taW5fY29tbWFuZCkKK0hBTkRMRV9MT0FEX0NPTU1BTkQoTENfVkVSU0lPTl9NSU5fV0FUQ0hPUywgMHgwMDAwMDAzMHUsIHZlcnNpb25fbWluX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX05PVEUsIDB4MDAwMDAwMzF1LCBub3RlX2NvbW1hbmQpCitIQU5ETEVfTE9BRF9DT01NQU5EKExDX0JVSUxEX1ZFUlNJT04sIDB4MDAwMDAwMzJ1LCBidWlsZF92ZXJzaW9uX2NvbW1hbmQpCisKKyNlbmRpZgorCisjaWZkZWYgTE9BRF9DT01NQU5EX1NUUlVDVAorCitMT0FEX0NPTU1BTkRfU1RSVUNUKGR5bGRfaW5mb19jb21tYW5kKQorTE9BRF9DT01NQU5EX1NUUlVDVChkeWxpYl9jb21tYW5kKQorTE9BRF9DT01NQU5EX1NUUlVDVChkeWxpbmtlcl9jb21tYW5kKQorTE9BRF9DT01NQU5EX1NUUlVDVChkeXN5bXRhYl9jb21tYW5kKQorTE9BRF9DT01NQU5EX1NUUlVDVChlbmNyeXB0aW9uX2luZm9fY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1QoZW5jcnlwdGlvbl9pbmZvX2NvbW1hbmRfNjQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKGVudHJ5X3BvaW50X2NvbW1hbmQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKGZ2bWZpbGVfY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1QoZnZtbGliX2NvbW1hbmQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKGlkZW50X2NvbW1hbmQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKGxpbmtlZGl0X2RhdGFfY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1QobGlua2VyX29wdGlvbl9jb21tYW5kKQorTE9BRF9DT01NQU5EX1NUUlVDVChsb2FkX2NvbW1hbmQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKHByZWJpbmRfY2tzdW1fY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1QocHJlYm91bmRfZHlsaWJfY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1Qocm91dGluZXNfY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1Qocm91dGluZXNfY29tbWFuZF82NCkKK0xPQURfQ09NTUFORF9TVFJVQ1QocnBhdGhfY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1Qoc2VnbWVudF9jb21tYW5kKQorTE9BRF9DT01NQU5EX1NUUlVDVChzZWdtZW50X2NvbW1hbmRfNjQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKHNvdXJjZV92ZXJzaW9uX2NvbW1hbmQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKHN1Yl9jbGllbnRfY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1Qoc3ViX2ZyYW1ld29ya19jb21tYW5kKQorTE9BRF9DT01NQU5EX1NUUlVDVChzdWJfbGlicmFyeV9jb21tYW5kKQorTE9BRF9DT01NQU5EX1NUUlVDVChzdWJfdW1icmVsbGFfY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1Qoc3ltc2VnX2NvbW1hbmQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKHN5bXRhYl9jb21tYW5kKQorTE9BRF9DT01NQU5EX1NUUlVDVCh0aHJlYWRfY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1QodHdvbGV2ZWxfaGludHNfY29tbWFuZCkKK0xPQURfQ09NTUFORF9TVFJVQ1QodXVpZF9jb21tYW5kKQorTE9BRF9DT01NQU5EX1NUUlVDVCh2ZXJzaW9uX21pbl9jb21tYW5kKQorTE9BRF9DT01NQU5EX1NUUlVDVChub3RlX2NvbW1hbmQpCitMT0FEX0NPTU1BTkRfU1RSVUNUKGJ1aWxkX3ZlcnNpb25fY29tbWFuZCkKKworI2VuZGlmCisKKyN1bmRlZiBIQU5ETEVfTE9BRF9DT01NQU5ECisjdW5kZWYgTE9BRF9DT01NQU5EX1NUUlVDVApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvTWFjaE8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L01hY2hPLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYwZmJlMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L01hY2hPLmgKQEAgLTAsMCArMSwxOTgzIEBACisvLz09PS0tIGxsdm0vQmluYXJ5Rm9ybWF0L01hY2hPLmggLSBUaGUgTWFjaE8gZmlsZSBmb3JtYXQgLS0tLS0tLSotIEMrKy8tKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIG1hbmlmZXN0IGNvbnN0YW50cyBmb3IgdGhlIE1hY2hPIG9iamVjdCBmaWxlIGZvcm1hdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQklOQVJZRk9STUFUX01BQ0hPX0gKKyNkZWZpbmUgTExWTV9CSU5BUllGT1JNQVRfTUFDSE9fSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Ib3N0LmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBNYWNoTyB7CisvLyBFbnVtcyBmcm9tIDxtYWNoLW8vbG9hZGVyLmg+CitlbnVtIDogdWludDMyX3QgeworICAvLyBDb25zdGFudHMgZm9yIHRoZSAibWFnaWMiIGZpZWxkIGluIGxsdm06Ok1hY2hPOjptYWNoX2hlYWRlciBhbmQKKyAgLy8gbGx2bTo6TWFjaE86Om1hY2hfaGVhZGVyXzY0CisgIE1IX01BR0lDID0gMHhGRUVERkFDRXUsCisgIE1IX0NJR0FNID0gMHhDRUZBRURGRXUsCisgIE1IX01BR0lDXzY0ID0gMHhGRUVERkFDRnUsCisgIE1IX0NJR0FNXzY0ID0gMHhDRkZBRURGRXUsCisgIEZBVF9NQUdJQyA9IDB4Q0FGRUJBQkV1LAorICBGQVRfQ0lHQU0gPSAweEJFQkFGRUNBdSwKKyAgRkFUX01BR0lDXzY0ID0gMHhDQUZFQkFCRnUsCisgIEZBVF9DSUdBTV82NCA9IDB4QkZCQUZFQ0F1Cit9OworCitlbnVtIEhlYWRlckZpbGVUeXBlIHsKKyAgLy8gQ29uc3RhbnRzIGZvciB0aGUgImZpbGV0eXBlIiBmaWVsZCBpbiBsbHZtOjpNYWNoTzo6bWFjaF9oZWFkZXIgYW5kCisgIC8vIGxsdm06Ok1hY2hPOjptYWNoX2hlYWRlcl82NAorICBNSF9PQkpFQ1QgPSAweDF1LAorICBNSF9FWEVDVVRFID0gMHgydSwKKyAgTUhfRlZNTElCID0gMHgzdSwKKyAgTUhfQ09SRSA9IDB4NHUsCisgIE1IX1BSRUxPQUQgPSAweDV1LAorICBNSF9EWUxJQiA9IDB4NnUsCisgIE1IX0RZTElOS0VSID0gMHg3dSwKKyAgTUhfQlVORExFID0gMHg4dSwKKyAgTUhfRFlMSUJfU1RVQiA9IDB4OXUsCisgIE1IX0RTWU0gPSAweEF1LAorICBNSF9LRVhUX0JVTkRMRSA9IDB4QnUKK307CisKK2VudW0geworICAvLyBDb25zdGFudCBiaXRzIGZvciB0aGUgImZsYWdzIiBmaWVsZCBpbiBsbHZtOjpNYWNoTzo6bWFjaF9oZWFkZXIgYW5kCisgIC8vIGxsdm06Ok1hY2hPOjptYWNoX2hlYWRlcl82NAorICBNSF9OT1VOREVGUyA9IDB4MDAwMDAwMDF1LAorICBNSF9JTkNSTElOSyA9IDB4MDAwMDAwMDJ1LAorICBNSF9EWUxETElOSyA9IDB4MDAwMDAwMDR1LAorICBNSF9CSU5EQVRMT0FEID0gMHgwMDAwMDAwOHUsCisgIE1IX1BSRUJPVU5EID0gMHgwMDAwMDAxMHUsCisgIE1IX1NQTElUX1NFR1MgPSAweDAwMDAwMDIwdSwKKyAgTUhfTEFaWV9JTklUID0gMHgwMDAwMDA0MHUsCisgIE1IX1RXT0xFVkVMID0gMHgwMDAwMDA4MHUsCisgIE1IX0ZPUkNFX0ZMQVQgPSAweDAwMDAwMTAwdSwKKyAgTUhfTk9NVUxUSURFRlMgPSAweDAwMDAwMjAwdSwKKyAgTUhfTk9GSVhQUkVCSU5ESU5HID0gMHgwMDAwMDQwMHUsCisgIE1IX1BSRUJJTkRBQkxFID0gMHgwMDAwMDgwMHUsCisgIE1IX0FMTE1PRFNCT1VORCA9IDB4MDAwMDEwMDB1LAorICBNSF9TVUJTRUNUSU9OU19WSUFfU1lNQk9MUyA9IDB4MDAwMDIwMDB1LAorICBNSF9DQU5PTklDQUwgPSAweDAwMDA0MDAwdSwKKyAgTUhfV0VBS19ERUZJTkVTID0gMHgwMDAwODAwMHUsCisgIE1IX0JJTkRTX1RPX1dFQUsgPSAweDAwMDEwMDAwdSwKKyAgTUhfQUxMT1dfU1RBQ0tfRVhFQ1VUSU9OID0gMHgwMDAyMDAwMHUsCisgIE1IX1JPT1RfU0FGRSA9IDB4MDAwNDAwMDB1LAorICBNSF9TRVRVSURfU0FGRSA9IDB4MDAwODAwMDB1LAorICBNSF9OT19SRUVYUE9SVEVEX0RZTElCUyA9IDB4MDAxMDAwMDB1LAorICBNSF9QSUUgPSAweDAwMjAwMDAwdSwKKyAgTUhfREVBRF9TVFJJUFBBQkxFX0RZTElCID0gMHgwMDQwMDAwMHUsCisgIE1IX0hBU19UTFZfREVTQ1JJUFRPUlMgPSAweDAwODAwMDAwdSwKKyAgTUhfTk9fSEVBUF9FWEVDVVRJT04gPSAweDAxMDAwMDAwdSwKKyAgTUhfQVBQX0VYVEVOU0lPTl9TQUZFID0gMHgwMjAwMDAwMHUsCisgIE1IX05MSVNUX09VVE9GU1lOQ19XSVRIX0RZTERJTkZPID0gMHgwNDAwMDAwMHUKK307CisKK2VudW0gOiB1aW50MzJfdCB7CisgIC8vIEZsYWdzIGZvciB0aGUgImNtZCIgZmllbGQgaW4gbGx2bTo6TWFjaE86OmxvYWRfY29tbWFuZAorICBMQ19SRVFfRFlMRCA9IDB4ODAwMDAwMDB1Cit9OworCisjZGVmaW5lIEhBTkRMRV9MT0FEX0NPTU1BTkQoTENOYW1lLCBMQ1ZhbHVlLCBMQ1N0cnVjdCkgTENOYW1lID0gTENWYWx1ZSwKKworZW51bSBMb2FkQ29tbWFuZFR5cGUgOiB1aW50MzJfdCB7CisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvTWFjaE8uZGVmIgorfTsKKworI3VuZGVmIEhBTkRMRV9MT0FEX0NPTU1BTkQKKworZW51bSA6IHVpbnQzMl90IHsKKyAgLy8gQ29uc3RhbnQgYml0cyBmb3IgdGhlICJmbGFncyIgZmllbGQgaW4gbGx2bTo6TWFjaE86OnNlZ21lbnRfY29tbWFuZAorICBTR19ISUdIVk0gPSAweDF1LAorICBTR19GVk1MSUIgPSAweDJ1LAorICBTR19OT1JFTE9DID0gMHg0dSwKKyAgU0dfUFJPVEVDVEVEX1ZFUlNJT05fMSA9IDB4OHUsCisKKyAgLy8gQ29uc3RhbnQgbWFza3MgZm9yIHRoZSAiZmxhZ3MiIGZpZWxkIGluIGxsdm06Ok1hY2hPOjpzZWN0aW9uIGFuZAorICAvLyBsbHZtOjpNYWNoTzo6c2VjdGlvbl82NAorICBTRUNUSU9OX1RZUEUgPSAweDAwMDAwMGZmdSwgICAgICAgICAgIC8vIFNFQ1RJT05fVFlQRQorICBTRUNUSU9OX0FUVFJJQlVURVMgPSAweGZmZmZmZjAwdSwgICAgIC8vIFNFQ1RJT05fQVRUUklCVVRFUworICBTRUNUSU9OX0FUVFJJQlVURVNfVVNSID0gMHhmZjAwMDAwMHUsIC8vIFNFQ1RJT05fQVRUUklCVVRFU19VU1IKKyAgU0VDVElPTl9BVFRSSUJVVEVTX1NZUyA9IDB4MDBmZmZmMDB1ICAvLyBTRUNUSU9OX0FUVFJJQlVURVNfU1lTCit9OworCisvLy8gVGhlc2UgYXJlIHRoZSBzZWN0aW9uIHR5cGUgYW5kIGF0dHJpYnV0ZXMgZmllbGRzLiAgQSBNYWNoTyBzZWN0aW9uIGNhbgorLy8vIGhhdmUgb25seSBvbmUgVHlwZSwgYnV0IGNhbiBoYXZlIGFueSBvZiB0aGUgYXR0cmlidXRlcyBzcGVjaWZpZWQuCitlbnVtIFNlY3Rpb25UeXBlIDogdWludDMyX3QgeworICAvLyBDb25zdGFudCBtYXNrcyBmb3IgdGhlICJmbGFnc1s3OjBdIiBmaWVsZCBpbiBsbHZtOjpNYWNoTzo6c2VjdGlvbiBhbmQKKyAgLy8gbGx2bTo6TWFjaE86OnNlY3Rpb25fNjQgKG1hc2sgImZsYWdzIiB3aXRoIFNFQ1RJT05fVFlQRSkKKworICAvLy8gU19SRUdVTEFSIC0gUmVndWxhciBzZWN0aW9uLgorICBTX1JFR1VMQVIgPSAweDAwdSwKKyAgLy8vIFNfWkVST0ZJTEwgLSBaZXJvIGZpbGwgb24gZGVtYW5kIHNlY3Rpb24uCisgIFNfWkVST0ZJTEwgPSAweDAxdSwKKyAgLy8vIFNfQ1NUUklOR19MSVRFUkFMUyAtIFNlY3Rpb24gd2l0aCBsaXRlcmFsIEMgc3RyaW5ncy4KKyAgU19DU1RSSU5HX0xJVEVSQUxTID0gMHgwMnUsCisgIC8vLyBTXzRCWVRFX0xJVEVSQUxTIC0gU2VjdGlvbiB3aXRoIDQgYnl0ZSBsaXRlcmFscy4KKyAgU180QllURV9MSVRFUkFMUyA9IDB4MDN1LAorICAvLy8gU184QllURV9MSVRFUkFMUyAtIFNlY3Rpb24gd2l0aCA4IGJ5dGUgbGl0ZXJhbHMuCisgIFNfOEJZVEVfTElURVJBTFMgPSAweDA0dSwKKyAgLy8vIFNfTElURVJBTF9QT0lOVEVSUyAtIFNlY3Rpb24gd2l0aCBwb2ludGVycyB0byBsaXRlcmFscy4KKyAgU19MSVRFUkFMX1BPSU5URVJTID0gMHgwNXUsCisgIC8vLyBTX05PTl9MQVpZX1NZTUJPTF9QT0lOVEVSUyAtIFNlY3Rpb24gd2l0aCBub24tbGF6eSBzeW1ib2wgcG9pbnRlcnMuCisgIFNfTk9OX0xBWllfU1lNQk9MX1BPSU5URVJTID0gMHgwNnUsCisgIC8vLyBTX0xBWllfU1lNQk9MX1BPSU5URVJTIC0gU2VjdGlvbiB3aXRoIGxhenkgc3ltYm9sIHBvaW50ZXJzLgorICBTX0xBWllfU1lNQk9MX1BPSU5URVJTID0gMHgwN3UsCisgIC8vLyBTX1NZTUJPTF9TVFVCUyAtIFNlY3Rpb24gd2l0aCBzeW1ib2wgc3R1YnMsIGJ5dGUgc2l6ZSBvZiBzdHViIGluCisgIC8vLyB0aGUgUmVzZXJ2ZWQyIGZpZWxkLgorICBTX1NZTUJPTF9TVFVCUyA9IDB4MDh1LAorICAvLy8gU19NT0RfSU5JVF9GVU5DX1BPSU5URVJTIC0gU2VjdGlvbiB3aXRoIG9ubHkgZnVuY3Rpb24gcG9pbnRlcnMgZm9yCisgIC8vLyBpbml0aWFsaXphdGlvbi4KKyAgU19NT0RfSU5JVF9GVU5DX1BPSU5URVJTID0gMHgwOXUsCisgIC8vLyBTX01PRF9URVJNX0ZVTkNfUE9JTlRFUlMgLSBTZWN0aW9uIHdpdGggb25seSBmdW5jdGlvbiBwb2ludGVycyBmb3IKKyAgLy8vIHRlcm1pbmF0aW9uLgorICBTX01PRF9URVJNX0ZVTkNfUE9JTlRFUlMgPSAweDBhdSwKKyAgLy8vIFNfQ09BTEVTQ0VEIC0gU2VjdGlvbiBjb250YWlucyBzeW1ib2xzIHRoYXQgYXJlIHRvIGJlIGNvYWxlc2NlZC4KKyAgU19DT0FMRVNDRUQgPSAweDBidSwKKyAgLy8vIFNfR0JfWkVST0ZJTEwgLSBaZXJvIGZpbGwgb24gZGVtYW5kIHNlY3Rpb24gKHRoYXQgY2FuIGJlIGxhcmdlciB0aGFuIDQKKyAgLy8vIGdpZ2FieXRlcykuCisgIFNfR0JfWkVST0ZJTEwgPSAweDBjdSwKKyAgLy8vIFNfSU5URVJQT1NJTkcgLSBTZWN0aW9uIHdpdGggb25seSBwYWlycyBvZiBmdW5jdGlvbiBwb2ludGVycyBmb3IKKyAgLy8vIGludGVycG9zaW5nLgorICBTX0lOVEVSUE9TSU5HID0gMHgwZHUsCisgIC8vLyBTXzE2QllURV9MSVRFUkFMUyAtIFNlY3Rpb24gd2l0aCBvbmx5IDE2IGJ5dGUgbGl0ZXJhbHMuCisgIFNfMTZCWVRFX0xJVEVSQUxTID0gMHgwZXUsCisgIC8vLyBTX0RUUkFDRV9ET0YgLSBTZWN0aW9uIGNvbnRhaW5zIERUcmFjZSBPYmplY3QgRm9ybWF0LgorICBTX0RUUkFDRV9ET0YgPSAweDBmdSwKKyAgLy8vIFNfTEFaWV9EWUxJQl9TWU1CT0xfUE9JTlRFUlMgLSBTZWN0aW9uIHdpdGggbGF6eSBzeW1ib2wgcG9pbnRlcnMgdG8KKyAgLy8vIGxhenkgbG9hZGVkIGR5bGlicy4KKyAgU19MQVpZX0RZTElCX1NZTUJPTF9QT0lOVEVSUyA9IDB4MTB1LAorICAvLy8gU19USFJFQURfTE9DQUxfUkVHVUxBUiAtIFRocmVhZCBsb2NhbCBkYXRhIHNlY3Rpb24uCisgIFNfVEhSRUFEX0xPQ0FMX1JFR1VMQVIgPSAweDExdSwKKyAgLy8vIFNfVEhSRUFEX0xPQ0FMX1pFUk9GSUxMIC0gVGhyZWFkIGxvY2FsIHplcm9maWxsIHNlY3Rpb24uCisgIFNfVEhSRUFEX0xPQ0FMX1pFUk9GSUxMID0gMHgxMnUsCisgIC8vLyBTX1RIUkVBRF9MT0NBTF9WQVJJQUJMRVMgLSBTZWN0aW9uIHdpdGggdGhyZWFkIGxvY2FsIHZhcmlhYmxlCisgIC8vLyBzdHJ1Y3R1cmUgZGF0YS4KKyAgU19USFJFQURfTE9DQUxfVkFSSUFCTEVTID0gMHgxM3UsCisgIC8vLyBTX1RIUkVBRF9MT0NBTF9WQVJJQUJMRV9QT0lOVEVSUyAtIFNlY3Rpb24gd2l0aCBwb2ludGVycyB0byB0aHJlYWQKKyAgLy8vIGxvY2FsIHN0cnVjdHVyZXMuCisgIFNfVEhSRUFEX0xPQ0FMX1ZBUklBQkxFX1BPSU5URVJTID0gMHgxNHUsCisgIC8vLyBTX1RIUkVBRF9MT0NBTF9JTklUX0ZVTkNUSU9OX1BPSU5URVJTIC0gU2VjdGlvbiB3aXRoIHRocmVhZCBsb2NhbAorICAvLy8gdmFyaWFibGUgaW5pdGlhbGl6YXRpb24gcG9pbnRlcnMgdG8gZnVuY3Rpb25zLgorICBTX1RIUkVBRF9MT0NBTF9JTklUX0ZVTkNUSU9OX1BPSU5URVJTID0gMHgxNXUsCisKKyAgTEFTVF9LTk9XTl9TRUNUSU9OX1RZUEUgPSBTX1RIUkVBRF9MT0NBTF9JTklUX0ZVTkNUSU9OX1BPSU5URVJTCit9OworCitlbnVtIDogdWludDMyX3QgeworICAvLyBDb25zdGFudCBtYXNrcyBmb3IgdGhlICJmbGFnc1szMToyNF0iIGZpZWxkIGluIGxsdm06Ok1hY2hPOjpzZWN0aW9uIGFuZAorICAvLyBsbHZtOjpNYWNoTzo6c2VjdGlvbl82NCAobWFzayAiZmxhZ3MiIHdpdGggU0VDVElPTl9BVFRSSUJVVEVTX1VTUikKKworICAvLy8gU19BVFRSX1BVUkVfSU5TVFJVQ1RJT05TIC0gU2VjdGlvbiBjb250YWlucyBvbmx5IHRydWUgbWFjaGluZQorICAvLy8gaW5zdHJ1Y3Rpb25zLgorICBTX0FUVFJfUFVSRV9JTlNUUlVDVElPTlMgPSAweDgwMDAwMDAwdSwKKyAgLy8vIFNfQVRUUl9OT19UT0MgLSBTZWN0aW9uIGNvbnRhaW5zIGNvYWxlc2NlZCBzeW1ib2xzIHRoYXQgYXJlIG5vdCB0byBiZQorICAvLy8gaW4gYSByYW5saWIgdGFibGUgb2YgY29udGVudHMuCisgIFNfQVRUUl9OT19UT0MgPSAweDQwMDAwMDAwdSwKKyAgLy8vIFNfQVRUUl9TVFJJUF9TVEFUSUNfU1lNUyAtIE9rIHRvIHN0cmlwIHN0YXRpYyBzeW1ib2xzIGluIHRoaXMgc2VjdGlvbgorICAvLy8gaW4gZmlsZXMgd2l0aCB0aGUgTVlfRFlMRExJTksgZmxhZy4KKyAgU19BVFRSX1NUUklQX1NUQVRJQ19TWU1TID0gMHgyMDAwMDAwMHUsCisgIC8vLyBTX0FUVFJfTk9fREVBRF9TVFJJUCAtIE5vIGRlYWQgc3RyaXBwaW5nLgorICBTX0FUVFJfTk9fREVBRF9TVFJJUCA9IDB4MTAwMDAwMDB1LAorICAvLy8gU19BVFRSX0xJVkVfU1VQUE9SVCAtIEJsb2NrcyBhcmUgbGl2ZSBpZiB0aGV5IHJlZmVyZW5jZSBsaXZlIGJsb2Nrcy4KKyAgU19BVFRSX0xJVkVfU1VQUE9SVCA9IDB4MDgwMDAwMDB1LAorICAvLy8gU19BVFRSX1NFTEZfTU9ESUZZSU5HX0NPREUgLSBVc2VkIHdpdGggaTM4NiBjb2RlIHN0dWJzIHdyaXR0ZW4gb24gYnkKKyAgLy8vIGR5bGQuCisgIFNfQVRUUl9TRUxGX01PRElGWUlOR19DT0RFID0gMHgwNDAwMDAwMHUsCisgIC8vLyBTX0FUVFJfREVCVUcgLSBBIGRlYnVnIHNlY3Rpb24uCisgIFNfQVRUUl9ERUJVRyA9IDB4MDIwMDAwMDB1LAorCisgIC8vIENvbnN0YW50IG1hc2tzIGZvciB0aGUgImZsYWdzWzIzOjhdIiBmaWVsZCBpbiBsbHZtOjpNYWNoTzo6c2VjdGlvbiBhbmQKKyAgLy8gbGx2bTo6TWFjaE86OnNlY3Rpb25fNjQgKG1hc2sgImZsYWdzIiB3aXRoIFNFQ1RJT05fQVRUUklCVVRFU19TWVMpCisKKyAgLy8vIFNfQVRUUl9TT01FX0lOU1RSVUNUSU9OUyAtIFNlY3Rpb24gY29udGFpbnMgc29tZSBtYWNoaW5lIGluc3RydWN0aW9ucy4KKyAgU19BVFRSX1NPTUVfSU5TVFJVQ1RJT05TID0gMHgwMDAwMDQwMHUsCisgIC8vLyBTX0FUVFJfRVhUX1JFTE9DIC0gU2VjdGlvbiBoYXMgZXh0ZXJuYWwgcmVsb2NhdGlvbiBlbnRyaWVzLgorICBTX0FUVFJfRVhUX1JFTE9DID0gMHgwMDAwMDIwMHUsCisgIC8vLyBTX0FUVFJfTE9DX1JFTE9DIC0gU2VjdGlvbiBoYXMgbG9jYWwgcmVsb2NhdGlvbiBlbnRyaWVzLgorICBTX0FUVFJfTE9DX1JFTE9DID0gMHgwMDAwMDEwMHUsCisKKyAgLy8gQ29uc3RhbnQgbWFza3MgZm9yIHRoZSB2YWx1ZSBvZiBhbiBpbmRpcmVjdCBzeW1ib2wgaW4gYW4gaW5kaXJlY3QKKyAgLy8gc3ltYm9sIHRhYmxlCisgIElORElSRUNUX1NZTUJPTF9MT0NBTCA9IDB4ODAwMDAwMDB1LAorICBJTkRJUkVDVF9TWU1CT0xfQUJTID0gMHg0MDAwMDAwMHUKK307CisKK2VudW0gRGF0YVJlZ2lvblR5cGUgeworICAvLyBDb25zdGFudHMgZm9yIHRoZSAia2luZCIgZmllbGQgaW4gYSBkYXRhX2luX2NvZGVfZW50cnkgc3RydWN0dXJlCisgIERJQ0VfS0lORF9EQVRBID0gMXUsCisgIERJQ0VfS0lORF9KVU1QX1RBQkxFOCA9IDJ1LAorICBESUNFX0tJTkRfSlVNUF9UQUJMRTE2ID0gM3UsCisgIERJQ0VfS0lORF9KVU1QX1RBQkxFMzIgPSA0dSwKKyAgRElDRV9LSU5EX0FCU19KVU1QX1RBQkxFMzIgPSA1dQorfTsKKworZW51bSBSZWJhc2VUeXBlIHsKKyAgUkVCQVNFX1RZUEVfUE9JTlRFUiA9IDF1LAorICBSRUJBU0VfVFlQRV9URVhUX0FCU09MVVRFMzIgPSAydSwKKyAgUkVCQVNFX1RZUEVfVEVYVF9QQ1JFTDMyID0gM3UKK307CisKK2VudW0geyBSRUJBU0VfT1BDT0RFX01BU0sgPSAweEYwdSwgUkVCQVNFX0lNTUVESUFURV9NQVNLID0gMHgwRnUgfTsKKworZW51bSBSZWJhc2VPcGNvZGUgeworICBSRUJBU0VfT1BDT0RFX0RPTkUgPSAweDAwdSwKKyAgUkVCQVNFX09QQ09ERV9TRVRfVFlQRV9JTU0gPSAweDEwdSwKKyAgUkVCQVNFX09QQ09ERV9TRVRfU0VHTUVOVF9BTkRfT0ZGU0VUX1VMRUIgPSAweDIwdSwKKyAgUkVCQVNFX09QQ09ERV9BRERfQUREUl9VTEVCID0gMHgzMHUsCisgIFJFQkFTRV9PUENPREVfQUREX0FERFJfSU1NX1NDQUxFRCA9IDB4NDB1LAorICBSRUJBU0VfT1BDT0RFX0RPX1JFQkFTRV9JTU1fVElNRVMgPSAweDUwdSwKKyAgUkVCQVNFX09QQ09ERV9ET19SRUJBU0VfVUxFQl9USU1FUyA9IDB4NjB1LAorICBSRUJBU0VfT1BDT0RFX0RPX1JFQkFTRV9BRERfQUREUl9VTEVCID0gMHg3MHUsCisgIFJFQkFTRV9PUENPREVfRE9fUkVCQVNFX1VMRUJfVElNRVNfU0tJUFBJTkdfVUxFQiA9IDB4ODB1Cit9OworCitlbnVtIEJpbmRUeXBlIHsKKyAgQklORF9UWVBFX1BPSU5URVIgPSAxdSwKKyAgQklORF9UWVBFX1RFWFRfQUJTT0xVVEUzMiA9IDJ1LAorICBCSU5EX1RZUEVfVEVYVF9QQ1JFTDMyID0gM3UKK307CisKK2VudW0gQmluZFNwZWNpYWxEeWxpYiB7CisgIEJJTkRfU1BFQ0lBTF9EWUxJQl9TRUxGID0gMCwKKyAgQklORF9TUEVDSUFMX0RZTElCX01BSU5fRVhFQ1VUQUJMRSA9IC0xLAorICBCSU5EX1NQRUNJQUxfRFlMSUJfRkxBVF9MT09LVVAgPSAtMgorfTsKKworZW51bSB7CisgIEJJTkRfU1lNQk9MX0ZMQUdTX1dFQUtfSU1QT1JUID0gMHgxdSwKKyAgQklORF9TWU1CT0xfRkxBR1NfTk9OX1dFQUtfREVGSU5JVElPTiA9IDB4OHUsCisKKyAgQklORF9PUENPREVfTUFTSyA9IDB4RjB1LAorICBCSU5EX0lNTUVESUFURV9NQVNLID0gMHgwRnUKK307CisKK2VudW0gQmluZE9wY29kZSB7CisgIEJJTkRfT1BDT0RFX0RPTkUgPSAweDAwdSwKKyAgQklORF9PUENPREVfU0VUX0RZTElCX09SRElOQUxfSU1NID0gMHgxMHUsCisgIEJJTkRfT1BDT0RFX1NFVF9EWUxJQl9PUkRJTkFMX1VMRUIgPSAweDIwdSwKKyAgQklORF9PUENPREVfU0VUX0RZTElCX1NQRUNJQUxfSU1NID0gMHgzMHUsCisgIEJJTkRfT1BDT0RFX1NFVF9TWU1CT0xfVFJBSUxJTkdfRkxBR1NfSU1NID0gMHg0MHUsCisgIEJJTkRfT1BDT0RFX1NFVF9UWVBFX0lNTSA9IDB4NTB1LAorICBCSU5EX09QQ09ERV9TRVRfQURERU5EX1NMRUIgPSAweDYwdSwKKyAgQklORF9PUENPREVfU0VUX1NFR01FTlRfQU5EX09GRlNFVF9VTEVCID0gMHg3MHUsCisgIEJJTkRfT1BDT0RFX0FERF9BRERSX1VMRUIgPSAweDgwdSwKKyAgQklORF9PUENPREVfRE9fQklORCA9IDB4OTB1LAorICBCSU5EX09QQ09ERV9ET19CSU5EX0FERF9BRERSX1VMRUIgPSAweEEwdSwKKyAgQklORF9PUENPREVfRE9fQklORF9BRERfQUREUl9JTU1fU0NBTEVEID0gMHhCMHUsCisgIEJJTkRfT1BDT0RFX0RPX0JJTkRfVUxFQl9USU1FU19TS0lQUElOR19VTEVCID0gMHhDMHUKK307CisKK2VudW0geworICBFWFBPUlRfU1lNQk9MX0ZMQUdTX0tJTkRfTUFTSyA9IDB4MDN1LAorICBFWFBPUlRfU1lNQk9MX0ZMQUdTX1dFQUtfREVGSU5JVElPTiA9IDB4MDR1LAorICBFWFBPUlRfU1lNQk9MX0ZMQUdTX1JFRVhQT1JUID0gMHgwOHUsCisgIEVYUE9SVF9TWU1CT0xfRkxBR1NfU1RVQl9BTkRfUkVTT0xWRVIgPSAweDEwdQorfTsKKworZW51bSBFeHBvcnRTeW1ib2xLaW5kIHsKKyAgRVhQT1JUX1NZTUJPTF9GTEFHU19LSU5EX1JFR1VMQVIgPSAweDAwdSwKKyAgRVhQT1JUX1NZTUJPTF9GTEFHU19LSU5EX1RIUkVBRF9MT0NBTCA9IDB4MDF1LAorICBFWFBPUlRfU1lNQk9MX0ZMQUdTX0tJTkRfQUJTT0xVVEUgPSAweDAydQorfTsKKworZW51bSB7CisgIC8vIENvbnN0YW50IG1hc2tzIGZvciB0aGUgIm5fdHlwZSIgZmllbGQgaW4gbGx2bTo6TWFjaE86Om5saXN0IGFuZAorICAvLyBsbHZtOjpNYWNoTzo6bmxpc3RfNjQKKyAgTl9TVEFCID0gMHhlMCwKKyAgTl9QRVhUID0gMHgxMCwKKyAgTl9UWVBFID0gMHgwZSwKKyAgTl9FWFQgPSAweDAxCit9OworCitlbnVtIE5MaXN0VHlwZSA6IHVpbnQ4X3QgeworICAvLyBDb25zdGFudHMgZm9yIHRoZSAibl90eXBlICYgTl9UWVBFIiBsbHZtOjpNYWNoTzo6bmxpc3QgYW5kCisgIC8vIGxsdm06Ok1hY2hPOjpubGlzdF82NAorICBOX1VOREYgPSAweDB1LAorICBOX0FCUyA9IDB4MnUsCisgIE5fU0VDVCA9IDB4ZXUsCisgIE5fUEJVRCA9IDB4Y3UsCisgIE5fSU5EUiA9IDB4YXUKK307CisKK2VudW0gU2VjdGlvbk9yZGluYWwgeworICAvLyBDb25zdGFudHMgZm9yIHRoZSAibl9zZWN0IiBmaWVsZCBpbiBsbHZtOjpNYWNoTzo6bmxpc3QgYW5kCisgIC8vIGxsdm06Ok1hY2hPOjpubGlzdF82NAorICBOT19TRUNUID0gMHUsCisgIE1BWF9TRUNUID0gMHhmZnUKK307CisKK2VudW0geworICAvLyBDb25zdGFudCBtYXNrcyBmb3IgdGhlICJuX2Rlc2MiIGZpZWxkIGluIGxsdm06Ok1hY2hPOjpubGlzdCBhbmQKKyAgLy8gbGx2bTo6TWFjaE86Om5saXN0XzY0CisgIC8vIFRoZSBsb3cgMyBiaXRzIGFyZSB0aGUgZm9yIHRoZSBSRUZFUkVOQ0VfVFlQRS4KKyAgUkVGRVJFTkNFX1RZUEUgPSAweDcsCisgIFJFRkVSRU5DRV9GTEFHX1VOREVGSU5FRF9OT05fTEFaWSA9IDAsCisgIFJFRkVSRU5DRV9GTEFHX1VOREVGSU5FRF9MQVpZID0gMSwKKyAgUkVGRVJFTkNFX0ZMQUdfREVGSU5FRCA9IDIsCisgIFJFRkVSRU5DRV9GTEFHX1BSSVZBVEVfREVGSU5FRCA9IDMsCisgIFJFRkVSRU5DRV9GTEFHX1BSSVZBVEVfVU5ERUZJTkVEX05PTl9MQVpZID0gNCwKKyAgUkVGRVJFTkNFX0ZMQUdfUFJJVkFURV9VTkRFRklORURfTEFaWSA9IDUsCisgIC8vIEZsYWcgYml0cyAoc29tZSBvdmVybGFwIHdpdGggdGhlIGxpYnJhcnkgb3JkaW5hbCBiaXRzKS4KKyAgTl9BUk1fVEhVTUJfREVGID0gMHgwMDA4dSwKKyAgUkVGRVJFTkNFRF9EWU5BTUlDQUxMWSA9IDB4MDAxMHUsCisgIE5fTk9fREVBRF9TVFJJUCA9IDB4MDAyMHUsCisgIE5fV0VBS19SRUYgPSAweDAwNDB1LAorICBOX1dFQUtfREVGID0gMHgwMDgwdSwKKyAgTl9TWU1CT0xfUkVTT0xWRVIgPSAweDAxMDB1LAorICBOX0FMVF9FTlRSWSA9IDB4MDIwMHUsCisgIC8vIEZvciB1bmRlZmluZWQgc3ltYm9scyBjb21pbmcgZnJvbSBsaWJyYXJpZXMsIHNlZSBHRVRfTElCUkFSWV9PUkRJTkFMKCkKKyAgLy8gYXMgdGhlc2UgYXJlIGluIHRoZSB0b3AgOCBiaXRzLgorICBTRUxGX0xJQlJBUllfT1JESU5BTCA9IDB4MCwKKyAgTUFYX0xJQlJBUllfT1JESU5BTCA9IDB4ZmQsCisgIERZTkFNSUNfTE9PS1VQX09SRElOQUwgPSAweGZlLAorICBFWEVDVVRBQkxFX09SRElOQUwgPSAweGZmCit9OworCitlbnVtIFN0YWJUeXBlIHsKKyAgLy8gQ29uc3RhbnQgdmFsdWVzIGZvciB0aGUgIm5fdHlwZSIgZmllbGQgaW4gbGx2bTo6TWFjaE86Om5saXN0IGFuZAorICAvLyBsbHZtOjpNYWNoTzo6bmxpc3RfNjQgd2hlbiAiKG5fdHlwZSAmIE5fU1RBQikgIT0gMCIKKyAgTl9HU1lNID0gMHgyMHUsCisgIE5fRk5BTUUgPSAweDIydSwKKyAgTl9GVU4gPSAweDI0dSwKKyAgTl9TVFNZTSA9IDB4MjZ1LAorICBOX0xDU1lNID0gMHgyOHUsCisgIE5fQk5TWU0gPSAweDJFdSwKKyAgTl9QQyA9IDB4MzB1LAorICBOX0FTVCA9IDB4MzJ1LAorICBOX09QVCA9IDB4M0N1LAorICBOX1JTWU0gPSAweDQwdSwKKyAgTl9TTElORSA9IDB4NDR1LAorICBOX0VOU1lNID0gMHg0RXUsCisgIE5fU1NZTSA9IDB4NjB1LAorICBOX1NPID0gMHg2NHUsCisgIE5fT1NPID0gMHg2NnUsCisgIE5fTFNZTSA9IDB4ODB1LAorICBOX0JJTkNMID0gMHg4MnUsCisgIE5fU09MID0gMHg4NHUsCisgIE5fUEFSQU1TID0gMHg4NnUsCisgIE5fVkVSU0lPTiA9IDB4ODh1LAorICBOX09MRVZFTCA9IDB4OEF1LAorICBOX1BTWU0gPSAweEEwdSwKKyAgTl9FSU5DTCA9IDB4QTJ1LAorICBOX0VOVFJZID0gMHhBNHUsCisgIE5fTEJSQUMgPSAweEMwdSwKKyAgTl9FWENMID0gMHhDMnUsCisgIE5fUkJSQUMgPSAweEUwdSwKKyAgTl9CQ09NTSA9IDB4RTJ1LAorICBOX0VDT01NID0gMHhFNHUsCisgIE5fRUNPTUwgPSAweEU4dSwKKyAgTl9MRU5HID0gMHhGRXUKK307CisKK2VudW0gOiB1aW50MzJfdCB7CisgIC8vIENvbnN0YW50IHZhbHVlcyBmb3IgdGhlIHJfc3ltYm9sbnVtIGZpZWxkIGluIGFuCisgIC8vIGxsdm06Ok1hY2hPOjpyZWxvY2F0aW9uX2luZm8gc3RydWN0dXJlIHdoZW4gcl9leHRlcm4gaXMgMC4KKyAgUl9BQlMgPSAwLAorCisgIC8vIENvbnN0YW50IGJpdHMgZm9yIHRoZSByX2FkZHJlc3MgZmllbGQgaW4gYW4KKyAgLy8gbGx2bTo6TWFjaE86OnJlbG9jYXRpb25faW5mbyBzdHJ1Y3R1cmUuCisgIFJfU0NBVFRFUkVEID0gMHg4MDAwMDAwMAorfTsKKworZW51bSBSZWxvY2F0aW9uSW5mb1R5cGUgeworICAvLyBDb25zdGFudCB2YWx1ZXMgZm9yIHRoZSByX3R5cGUgZmllbGQgaW4gYW4KKyAgLy8gbGx2bTo6TWFjaE86OnJlbG9jYXRpb25faW5mbyBvciBsbHZtOjpNYWNoTzo6c2NhdHRlcmVkX3JlbG9jYXRpb25faW5mbworICAvLyBzdHJ1Y3R1cmUuCisgIEdFTkVSSUNfUkVMT0NfVkFOSUxMQSA9IDAsCisgIEdFTkVSSUNfUkVMT0NfUEFJUiA9IDEsCisgIEdFTkVSSUNfUkVMT0NfU0VDVERJRkYgPSAyLAorICBHRU5FUklDX1JFTE9DX1BCX0xBX1BUUiA9IDMsCisgIEdFTkVSSUNfUkVMT0NfTE9DQUxfU0VDVERJRkYgPSA0LAorICBHRU5FUklDX1JFTE9DX1RMViA9IDUsCisKKyAgLy8gQ29uc3RhbnQgdmFsdWVzIGZvciB0aGUgcl90eXBlIGZpZWxkIGluIGEgUG93ZXJQQyBhcmNoaXRlY3R1cmUKKyAgLy8gbGx2bTo6TWFjaE86OnJlbG9jYXRpb25faW5mbyBvciBsbHZtOjpNYWNoTzo6c2NhdHRlcmVkX3JlbG9jYXRpb25faW5mbworICAvLyBzdHJ1Y3R1cmUuCisgIFBQQ19SRUxPQ19WQU5JTExBID0gR0VORVJJQ19SRUxPQ19WQU5JTExBLAorICBQUENfUkVMT0NfUEFJUiA9IEdFTkVSSUNfUkVMT0NfUEFJUiwKKyAgUFBDX1JFTE9DX0JSMTQgPSAyLAorICBQUENfUkVMT0NfQlIyNCA9IDMsCisgIFBQQ19SRUxPQ19ISTE2ID0gNCwKKyAgUFBDX1JFTE9DX0xPMTYgPSA1LAorICBQUENfUkVMT0NfSEExNiA9IDYsCisgIFBQQ19SRUxPQ19MTzE0ID0gNywKKyAgUFBDX1JFTE9DX1NFQ1RESUZGID0gOCwKKyAgUFBDX1JFTE9DX1BCX0xBX1BUUiA9IDksCisgIFBQQ19SRUxPQ19ISTE2X1NFQ1RESUZGID0gMTAsCisgIFBQQ19SRUxPQ19MTzE2X1NFQ1RESUZGID0gMTEsCisgIFBQQ19SRUxPQ19IQTE2X1NFQ1RESUZGID0gMTIsCisgIFBQQ19SRUxPQ19KQlNSID0gMTMsCisgIFBQQ19SRUxPQ19MTzE0X1NFQ1RESUZGID0gMTQsCisgIFBQQ19SRUxPQ19MT0NBTF9TRUNURElGRiA9IDE1LAorCisgIC8vIENvbnN0YW50IHZhbHVlcyBmb3IgdGhlIHJfdHlwZSBmaWVsZCBpbiBhbiBBUk0gYXJjaGl0ZWN0dXJlCisgIC8vIGxsdm06Ok1hY2hPOjpyZWxvY2F0aW9uX2luZm8gb3IgbGx2bTo6TWFjaE86OnNjYXR0ZXJlZF9yZWxvY2F0aW9uX2luZm8KKyAgLy8gc3RydWN0dXJlLgorICBBUk1fUkVMT0NfVkFOSUxMQSA9IEdFTkVSSUNfUkVMT0NfVkFOSUxMQSwKKyAgQVJNX1JFTE9DX1BBSVIgPSBHRU5FUklDX1JFTE9DX1BBSVIsCisgIEFSTV9SRUxPQ19TRUNURElGRiA9IEdFTkVSSUNfUkVMT0NfU0VDVERJRkYsCisgIEFSTV9SRUxPQ19MT0NBTF9TRUNURElGRiA9IDMsCisgIEFSTV9SRUxPQ19QQl9MQV9QVFIgPSA0LAorICBBUk1fUkVMT0NfQlIyNCA9IDUsCisgIEFSTV9USFVNQl9SRUxPQ19CUjIyID0gNiwKKyAgQVJNX1RIVU1CXzMyQklUX0JSQU5DSCA9IDcsIC8vIG9ic29sZXRlCisgIEFSTV9SRUxPQ19IQUxGID0gOCwKKyAgQVJNX1JFTE9DX0hBTEZfU0VDVERJRkYgPSA5LAorCisgIC8vIENvbnN0YW50IHZhbHVlcyBmb3IgdGhlIHJfdHlwZSBmaWVsZCBpbiBhbiBBUk02NCBhcmNoaXRlY3R1cmUKKyAgLy8gbGx2bTo6TWFjaE86OnJlbG9jYXRpb25faW5mbyBvciBsbHZtOjpNYWNoTzo6c2NhdHRlcmVkX3JlbG9jYXRpb25faW5mbworICAvLyBzdHJ1Y3R1cmUuCisKKyAgLy8gRm9yIHBvaW50ZXJzLgorICBBUk02NF9SRUxPQ19VTlNJR05FRCA9IDAsCisgIC8vIE11c3QgYmUgZm9sbG93ZWQgYnkgYW4gQVJNNjRfUkVMT0NfVU5TSUdORUQKKyAgQVJNNjRfUkVMT0NfU1VCVFJBQ1RPUiA9IDEsCisgIC8vIEEgQi9CTCBpbnN0cnVjdGlvbiB3aXRoIDI2LWJpdCBkaXNwbGFjZW1lbnQuCisgIEFSTTY0X1JFTE9DX0JSQU5DSDI2ID0gMiwKKyAgLy8gUEMtcmVsIGRpc3RhbmNlIHRvIHBhZ2Ugb2YgdGFyZ2V0LgorICBBUk02NF9SRUxPQ19QQUdFMjEgPSAzLAorICAvLyBPZmZzZXQgd2l0aGluIHBhZ2UsIHNjYWxlZCBieSByX2xlbmd0aC4KKyAgQVJNNjRfUkVMT0NfUEFHRU9GRjEyID0gNCwKKyAgLy8gUEMtcmVsIGRpc3RhbmNlIHRvIHBhZ2Ugb2YgR09UIHNsb3QuCisgIEFSTTY0X1JFTE9DX0dPVF9MT0FEX1BBR0UyMSA9IDUsCisgIC8vIE9mZnNldCB3aXRoaW4gcGFnZSBvZiBHT1Qgc2xvdCwgc2NhbGVkIGJ5IHJfbGVuZ3RoLgorICBBUk02NF9SRUxPQ19HT1RfTE9BRF9QQUdFT0ZGMTIgPSA2LAorICAvLyBGb3IgcG9pbnRlcnMgdG8gR09UIHNsb3RzLgorICBBUk02NF9SRUxPQ19QT0lOVEVSX1RPX0dPVCA9IDcsCisgIC8vIFBDLXJlbCBkaXN0YW5jZSB0byBwYWdlIG9mIFRMVlAgc2xvdC4KKyAgQVJNNjRfUkVMT0NfVExWUF9MT0FEX1BBR0UyMSA9IDgsCisgIC8vIE9mZnNldCB3aXRoaW4gcGFnZSBvZiBUTFZQIHNsb3QsIHNjYWxlZCBieSByX2xlbmd0aC4KKyAgQVJNNjRfUkVMT0NfVExWUF9MT0FEX1BBR0VPRkYxMiA9IDksCisgIC8vIE11c3QgYmUgZm9sbG93ZWQgYnkgQVJNNjRfUkVMT0NfUEFHRTIxIG9yIEFSTTY0X1JFTE9DX1BBR0VPRkYxMi4KKyAgQVJNNjRfUkVMT0NfQURERU5EID0gMTAsCisKKyAgLy8gQ29uc3RhbnQgdmFsdWVzIGZvciB0aGUgcl90eXBlIGZpZWxkIGluIGFuIHg4Nl82NCBhcmNoaXRlY3R1cmUKKyAgLy8gbGx2bTo6TWFjaE86OnJlbG9jYXRpb25faW5mbyBvciBsbHZtOjpNYWNoTzo6c2NhdHRlcmVkX3JlbG9jYXRpb25faW5mbworICAvLyBzdHJ1Y3R1cmUKKyAgWDg2XzY0X1JFTE9DX1VOU0lHTkVEID0gMCwKKyAgWDg2XzY0X1JFTE9DX1NJR05FRCA9IDEsCisgIFg4Nl82NF9SRUxPQ19CUkFOQ0ggPSAyLAorICBYODZfNjRfUkVMT0NfR09UX0xPQUQgPSAzLAorICBYODZfNjRfUkVMT0NfR09UID0gNCwKKyAgWDg2XzY0X1JFTE9DX1NVQlRSQUNUT1IgPSA1LAorICBYODZfNjRfUkVMT0NfU0lHTkVEXzEgPSA2LAorICBYODZfNjRfUkVMT0NfU0lHTkVEXzIgPSA3LAorICBYODZfNjRfUkVMT0NfU0lHTkVEXzQgPSA4LAorICBYODZfNjRfUkVMT0NfVExWID0gOQorfTsKKworLy8gVmFsdWVzIGZvciBzZWdtZW50X2NvbW1hbmQuaW5pdHByb3QuCisvLyBGcm9tIDxtYWNoL3ZtX3Byb3QuaD4KK2VudW0geyBWTV9QUk9UX1JFQUQgPSAweDEsIFZNX1BST1RfV1JJVEUgPSAweDIsIFZNX1BST1RfRVhFQ1VURSA9IDB4NCB9OworCisvLyBWYWx1ZXMgZm9yIHBsYXRmb3JtIGZpZWxkIGluIGJ1aWxkX3ZlcnNpb25fY29tbWFuZC4KK2VudW0gUGxhdGZvcm1UeXBlIHsKKyAgUExBVEZPUk1fTUFDT1MgPSAxLAorICBQTEFURk9STV9JT1MgPSAyLAorICBQTEFURk9STV9UVk9TID0gMywKKyAgUExBVEZPUk1fV0FUQ0hPUyA9IDQsCisgIFBMQVRGT1JNX0JSSURHRU9TID0gNQorfTsKKworLy8gVmFsdWVzIGZvciB0b29scyBlbnVtIGluIGJ1aWxkX3Rvb2xfdmVyc2lvbi4KK2VudW0geyBUT09MX0NMQU5HID0gMSwgVE9PTF9TV0lGVCA9IDIsIFRPT0xfTEQgPSAzIH07CisKKy8vIFN0cnVjdHMgZnJvbSA8bWFjaC1vL2xvYWRlci5oPgorCitzdHJ1Y3QgbWFjaF9oZWFkZXIgeworICB1aW50MzJfdCBtYWdpYzsKKyAgdWludDMyX3QgY3B1dHlwZTsKKyAgdWludDMyX3QgY3B1c3VidHlwZTsKKyAgdWludDMyX3QgZmlsZXR5cGU7CisgIHVpbnQzMl90IG5jbWRzOworICB1aW50MzJfdCBzaXplb2ZjbWRzOworICB1aW50MzJfdCBmbGFnczsKK307CisKK3N0cnVjdCBtYWNoX2hlYWRlcl82NCB7CisgIHVpbnQzMl90IG1hZ2ljOworICB1aW50MzJfdCBjcHV0eXBlOworICB1aW50MzJfdCBjcHVzdWJ0eXBlOworICB1aW50MzJfdCBmaWxldHlwZTsKKyAgdWludDMyX3QgbmNtZHM7CisgIHVpbnQzMl90IHNpemVvZmNtZHM7CisgIHVpbnQzMl90IGZsYWdzOworICB1aW50MzJfdCByZXNlcnZlZDsKK307CisKK3N0cnVjdCBsb2FkX2NvbW1hbmQgeworICB1aW50MzJfdCBjbWQ7CisgIHVpbnQzMl90IGNtZHNpemU7Cit9OworCitzdHJ1Y3Qgc2VnbWVudF9jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworICBjaGFyIHNlZ25hbWVbMTZdOworICB1aW50MzJfdCB2bWFkZHI7CisgIHVpbnQzMl90IHZtc2l6ZTsKKyAgdWludDMyX3QgZmlsZW9mZjsKKyAgdWludDMyX3QgZmlsZXNpemU7CisgIHVpbnQzMl90IG1heHByb3Q7CisgIHVpbnQzMl90IGluaXRwcm90OworICB1aW50MzJfdCBuc2VjdHM7CisgIHVpbnQzMl90IGZsYWdzOworfTsKKworc3RydWN0IHNlZ21lbnRfY29tbWFuZF82NCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgY2hhciBzZWduYW1lWzE2XTsKKyAgdWludDY0X3Qgdm1hZGRyOworICB1aW50NjRfdCB2bXNpemU7CisgIHVpbnQ2NF90IGZpbGVvZmY7CisgIHVpbnQ2NF90IGZpbGVzaXplOworICB1aW50MzJfdCBtYXhwcm90OworICB1aW50MzJfdCBpbml0cHJvdDsKKyAgdWludDMyX3QgbnNlY3RzOworICB1aW50MzJfdCBmbGFnczsKK307CisKK3N0cnVjdCBzZWN0aW9uIHsKKyAgY2hhciBzZWN0bmFtZVsxNl07CisgIGNoYXIgc2VnbmFtZVsxNl07CisgIHVpbnQzMl90IGFkZHI7CisgIHVpbnQzMl90IHNpemU7CisgIHVpbnQzMl90IG9mZnNldDsKKyAgdWludDMyX3QgYWxpZ247CisgIHVpbnQzMl90IHJlbG9mZjsKKyAgdWludDMyX3QgbnJlbG9jOworICB1aW50MzJfdCBmbGFnczsKKyAgdWludDMyX3QgcmVzZXJ2ZWQxOworICB1aW50MzJfdCByZXNlcnZlZDI7Cit9OworCitzdHJ1Y3Qgc2VjdGlvbl82NCB7CisgIGNoYXIgc2VjdG5hbWVbMTZdOworICBjaGFyIHNlZ25hbWVbMTZdOworICB1aW50NjRfdCBhZGRyOworICB1aW50NjRfdCBzaXplOworICB1aW50MzJfdCBvZmZzZXQ7CisgIHVpbnQzMl90IGFsaWduOworICB1aW50MzJfdCByZWxvZmY7CisgIHVpbnQzMl90IG5yZWxvYzsKKyAgdWludDMyX3QgZmxhZ3M7CisgIHVpbnQzMl90IHJlc2VydmVkMTsKKyAgdWludDMyX3QgcmVzZXJ2ZWQyOworICB1aW50MzJfdCByZXNlcnZlZDM7Cit9OworCitzdHJ1Y3QgZnZtbGliIHsKKyAgdWludDMyX3QgbmFtZTsKKyAgdWludDMyX3QgbWlub3JfdmVyc2lvbjsKKyAgdWludDMyX3QgaGVhZGVyX2FkZHI7Cit9OworCisvLyBUaGUgZnZtbGliX2NvbW1hbmQgaXMgb2Jzb2xldGUgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCitzdHJ1Y3QgZnZtbGliX2NvbW1hbmQgeworICB1aW50MzJfdCBjbWQ7CisgIHVpbnQzMl90IGNtZHNpemU7CisgIHN0cnVjdCBmdm1saWIgZnZtbGliOworfTsKKworc3RydWN0IGR5bGliIHsKKyAgdWludDMyX3QgbmFtZTsKKyAgdWludDMyX3QgdGltZXN0YW1wOworICB1aW50MzJfdCBjdXJyZW50X3ZlcnNpb247CisgIHVpbnQzMl90IGNvbXBhdGliaWxpdHlfdmVyc2lvbjsKK307CisKK3N0cnVjdCBkeWxpYl9jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworICBzdHJ1Y3QgZHlsaWIgZHlsaWI7Cit9OworCitzdHJ1Y3Qgc3ViX2ZyYW1ld29ya19jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworICB1aW50MzJfdCB1bWJyZWxsYTsKK307CisKK3N0cnVjdCBzdWJfY2xpZW50X2NvbW1hbmQgeworICB1aW50MzJfdCBjbWQ7CisgIHVpbnQzMl90IGNtZHNpemU7CisgIHVpbnQzMl90IGNsaWVudDsKK307CisKK3N0cnVjdCBzdWJfdW1icmVsbGFfY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgdWludDMyX3Qgc3ViX3VtYnJlbGxhOworfTsKKworc3RydWN0IHN1Yl9saWJyYXJ5X2NvbW1hbmQgeworICB1aW50MzJfdCBjbWQ7CisgIHVpbnQzMl90IGNtZHNpemU7CisgIHVpbnQzMl90IHN1Yl9saWJyYXJ5OworfTsKKworLy8gVGhlIHByZWJvdW5kX2R5bGliX2NvbW1hbmQgaXMgb2Jzb2xldGUgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCitzdHJ1Y3QgcHJlYm91bmRfZHlsaWJfY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgdWludDMyX3QgbmFtZTsKKyAgdWludDMyX3Qgbm1vZHVsZXM7CisgIHVpbnQzMl90IGxpbmtlZF9tb2R1bGVzOworfTsKKworc3RydWN0IGR5bGlua2VyX2NvbW1hbmQgeworICB1aW50MzJfdCBjbWQ7CisgIHVpbnQzMl90IGNtZHNpemU7CisgIHVpbnQzMl90IG5hbWU7Cit9OworCitzdHJ1Y3QgdGhyZWFkX2NvbW1hbmQgeworICB1aW50MzJfdCBjbWQ7CisgIHVpbnQzMl90IGNtZHNpemU7Cit9OworCitzdHJ1Y3Qgcm91dGluZXNfY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgdWludDMyX3QgaW5pdF9hZGRyZXNzOworICB1aW50MzJfdCBpbml0X21vZHVsZTsKKyAgdWludDMyX3QgcmVzZXJ2ZWQxOworICB1aW50MzJfdCByZXNlcnZlZDI7CisgIHVpbnQzMl90IHJlc2VydmVkMzsKKyAgdWludDMyX3QgcmVzZXJ2ZWQ0OworICB1aW50MzJfdCByZXNlcnZlZDU7CisgIHVpbnQzMl90IHJlc2VydmVkNjsKK307CisKK3N0cnVjdCByb3V0aW5lc19jb21tYW5kXzY0IHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworICB1aW50NjRfdCBpbml0X2FkZHJlc3M7CisgIHVpbnQ2NF90IGluaXRfbW9kdWxlOworICB1aW50NjRfdCByZXNlcnZlZDE7CisgIHVpbnQ2NF90IHJlc2VydmVkMjsKKyAgdWludDY0X3QgcmVzZXJ2ZWQzOworICB1aW50NjRfdCByZXNlcnZlZDQ7CisgIHVpbnQ2NF90IHJlc2VydmVkNTsKKyAgdWludDY0X3QgcmVzZXJ2ZWQ2OworfTsKKworc3RydWN0IHN5bXRhYl9jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworICB1aW50MzJfdCBzeW1vZmY7CisgIHVpbnQzMl90IG5zeW1zOworICB1aW50MzJfdCBzdHJvZmY7CisgIHVpbnQzMl90IHN0cnNpemU7Cit9OworCitzdHJ1Y3QgZHlzeW10YWJfY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgdWludDMyX3QgaWxvY2Fsc3ltOworICB1aW50MzJfdCBubG9jYWxzeW07CisgIHVpbnQzMl90IGlleHRkZWZzeW07CisgIHVpbnQzMl90IG5leHRkZWZzeW07CisgIHVpbnQzMl90IGl1bmRlZnN5bTsKKyAgdWludDMyX3QgbnVuZGVmc3ltOworICB1aW50MzJfdCB0b2NvZmY7CisgIHVpbnQzMl90IG50b2M7CisgIHVpbnQzMl90IG1vZHRhYm9mZjsKKyAgdWludDMyX3Qgbm1vZHRhYjsKKyAgdWludDMyX3QgZXh0cmVmc3ltb2ZmOworICB1aW50MzJfdCBuZXh0cmVmc3ltczsKKyAgdWludDMyX3QgaW5kaXJlY3RzeW1vZmY7CisgIHVpbnQzMl90IG5pbmRpcmVjdHN5bXM7CisgIHVpbnQzMl90IGV4dHJlbG9mZjsKKyAgdWludDMyX3QgbmV4dHJlbDsKKyAgdWludDMyX3QgbG9jcmVsb2ZmOworICB1aW50MzJfdCBubG9jcmVsOworfTsKKworc3RydWN0IGR5bGliX3RhYmxlX29mX2NvbnRlbnRzIHsKKyAgdWludDMyX3Qgc3ltYm9sX2luZGV4OworICB1aW50MzJfdCBtb2R1bGVfaW5kZXg7Cit9OworCitzdHJ1Y3QgZHlsaWJfbW9kdWxlIHsKKyAgdWludDMyX3QgbW9kdWxlX25hbWU7CisgIHVpbnQzMl90IGlleHRkZWZzeW07CisgIHVpbnQzMl90IG5leHRkZWZzeW07CisgIHVpbnQzMl90IGlyZWZzeW07CisgIHVpbnQzMl90IG5yZWZzeW07CisgIHVpbnQzMl90IGlsb2NhbHN5bTsKKyAgdWludDMyX3QgbmxvY2Fsc3ltOworICB1aW50MzJfdCBpZXh0cmVsOworICB1aW50MzJfdCBuZXh0cmVsOworICB1aW50MzJfdCBpaW5pdF9pdGVybTsKKyAgdWludDMyX3QgbmluaXRfbnRlcm07CisgIHVpbnQzMl90IG9iamNfbW9kdWxlX2luZm9fYWRkcjsKKyAgdWludDMyX3Qgb2JqY19tb2R1bGVfaW5mb19zaXplOworfTsKKworc3RydWN0IGR5bGliX21vZHVsZV82NCB7CisgIHVpbnQzMl90IG1vZHVsZV9uYW1lOworICB1aW50MzJfdCBpZXh0ZGVmc3ltOworICB1aW50MzJfdCBuZXh0ZGVmc3ltOworICB1aW50MzJfdCBpcmVmc3ltOworICB1aW50MzJfdCBucmVmc3ltOworICB1aW50MzJfdCBpbG9jYWxzeW07CisgIHVpbnQzMl90IG5sb2NhbHN5bTsKKyAgdWludDMyX3QgaWV4dHJlbDsKKyAgdWludDMyX3QgbmV4dHJlbDsKKyAgdWludDMyX3QgaWluaXRfaXRlcm07CisgIHVpbnQzMl90IG5pbml0X250ZXJtOworICB1aW50MzJfdCBvYmpjX21vZHVsZV9pbmZvX3NpemU7CisgIHVpbnQ2NF90IG9iamNfbW9kdWxlX2luZm9fYWRkcjsKK307CisKK3N0cnVjdCBkeWxpYl9yZWZlcmVuY2UgeworICB1aW50MzJfdCBpc3ltIDogMjQsIGZsYWdzIDogODsKK307CisKKy8vIFRoZSB0d29sZXZlbF9oaW50c19jb21tYW5kIGlzIG9ic29sZXRlIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgorc3RydWN0IHR3b2xldmVsX2hpbnRzX2NvbW1hbmQgeworICB1aW50MzJfdCBjbWQ7CisgIHVpbnQzMl90IGNtZHNpemU7CisgIHVpbnQzMl90IG9mZnNldDsKKyAgdWludDMyX3QgbmhpbnRzOworfTsKKworLy8gVGhlIHR3b2xldmVsX2hpbnRzX2NvbW1hbmQgaXMgb2Jzb2xldGUgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCitzdHJ1Y3QgdHdvbGV2ZWxfaGludCB7CisgIHVpbnQzMl90IGlzdWJfaW1hZ2UgOiA4LCBpdG9jIDogMjQ7Cit9OworCisvLyBUaGUgcHJlYmluZF9ja3N1bV9jb21tYW5kIGlzIG9ic29sZXRlIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgorc3RydWN0IHByZWJpbmRfY2tzdW1fY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgdWludDMyX3QgY2tzdW07Cit9OworCitzdHJ1Y3QgdXVpZF9jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworICB1aW50OF90IHV1aWRbMTZdOworfTsKKworc3RydWN0IHJwYXRoX2NvbW1hbmQgeworICB1aW50MzJfdCBjbWQ7CisgIHVpbnQzMl90IGNtZHNpemU7CisgIHVpbnQzMl90IHBhdGg7Cit9OworCitzdHJ1Y3QgbGlua2VkaXRfZGF0YV9jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworICB1aW50MzJfdCBkYXRhb2ZmOworICB1aW50MzJfdCBkYXRhc2l6ZTsKK307CisKK3N0cnVjdCBkYXRhX2luX2NvZGVfZW50cnkgeworICB1aW50MzJfdCBvZmZzZXQ7CisgIHVpbnQxNl90IGxlbmd0aDsKKyAgdWludDE2X3Qga2luZDsKK307CisKK3N0cnVjdCBzb3VyY2VfdmVyc2lvbl9jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworICB1aW50NjRfdCB2ZXJzaW9uOworfTsKKworc3RydWN0IGVuY3J5cHRpb25faW5mb19jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworICB1aW50MzJfdCBjcnlwdG9mZjsKKyAgdWludDMyX3QgY3J5cHRzaXplOworICB1aW50MzJfdCBjcnlwdGlkOworfTsKKworc3RydWN0IGVuY3J5cHRpb25faW5mb19jb21tYW5kXzY0IHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworICB1aW50MzJfdCBjcnlwdG9mZjsKKyAgdWludDMyX3QgY3J5cHRzaXplOworICB1aW50MzJfdCBjcnlwdGlkOworICB1aW50MzJfdCBwYWQ7Cit9OworCitzdHJ1Y3QgdmVyc2lvbl9taW5fY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsgICAgIC8vIExDX1ZFUlNJT05fTUlOX01BQ09TWCBvcgorICAgICAgICAgICAgICAgICAgICAvLyBMQ19WRVJTSU9OX01JTl9JUEhPTkVPUworICB1aW50MzJfdCBjbWRzaXplOyAvLyBzaXplb2Yoc3RydWN0IHZlcnNpb25fbWluX2NvbW1hbmQpCisgIHVpbnQzMl90IHZlcnNpb247IC8vIFguWS5aIGlzIGVuY29kZWQgaW4gbmliYmxlcyB4eHh4Lnl5Lnp6CisgIHVpbnQzMl90IHNkazsgICAgIC8vIFguWS5aIGlzIGVuY29kZWQgaW4gbmliYmxlcyB4eHh4Lnl5Lnp6Cit9OworCitzdHJ1Y3Qgbm90ZV9jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOyAgICAgICAgLy8gTENfTk9URQorICB1aW50MzJfdCBjbWRzaXplOyAgICAvLyBzaXplb2Yoc3RydWN0IG5vdGVfY29tbWFuZCkKKyAgY2hhciBkYXRhX293bmVyWzE2XTsgLy8gb3duZXIgbmFtZSBmb3IgdGhpcyBMQ19OT1RFCisgIHVpbnQ2NF90IG9mZnNldDsgICAgIC8vIGZpbGUgb2Zmc2V0IG9mIHRoaXMgZGF0YQorICB1aW50NjRfdCBzaXplOyAgICAgICAvLyBsZW5ndGggb2YgZGF0YSByZWdpb24KK307CisKK3N0cnVjdCBidWlsZF90b29sX3ZlcnNpb24geworICB1aW50MzJfdCB0b29sOyAgICAvLyBlbnVtIGZvciB0aGUgdG9vbAorICB1aW50MzJfdCB2ZXJzaW9uOyAvLyB2ZXJzaW9uIG9mIHRoZSB0b29sCit9OworCitzdHJ1Y3QgYnVpbGRfdmVyc2lvbl9jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOyAgICAgIC8vIExDX0JVSUxEX1ZFUlNJT04KKyAgdWludDMyX3QgY21kc2l6ZTsgIC8vIHNpemVvZihzdHJ1Y3QgYnVpbGRfdmVyc2lvbl9jb21tYW5kKSArCisgICAgICAgICAgICAgICAgICAgICAvLyBudG9vbHMgKiBzaXplb2Yoc3RydWN0IGJ1aWxkX3Rvb2xfdmVyc2lvbikKKyAgdWludDMyX3QgcGxhdGZvcm07IC8vIHBsYXRmb3JtCisgIHVpbnQzMl90IG1pbm9zOyAgICAvLyBYLlkuWiBpcyBlbmNvZGVkIGluIG5pYmJsZXMgeHh4eC55eS56egorICB1aW50MzJfdCBzZGs7ICAgICAgLy8gWC5ZLlogaXMgZW5jb2RlZCBpbiBuaWJibGVzIHh4eHgueXkuenoKKyAgdWludDMyX3QgbnRvb2xzOyAgIC8vIG51bWJlciBvZiB0b29sIGVudHJpZXMgZm9sbG93aW5nIHRoaXMKK307CisKK3N0cnVjdCBkeWxkX2luZm9fY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgdWludDMyX3QgcmViYXNlX29mZjsKKyAgdWludDMyX3QgcmViYXNlX3NpemU7CisgIHVpbnQzMl90IGJpbmRfb2ZmOworICB1aW50MzJfdCBiaW5kX3NpemU7CisgIHVpbnQzMl90IHdlYWtfYmluZF9vZmY7CisgIHVpbnQzMl90IHdlYWtfYmluZF9zaXplOworICB1aW50MzJfdCBsYXp5X2JpbmRfb2ZmOworICB1aW50MzJfdCBsYXp5X2JpbmRfc2l6ZTsKKyAgdWludDMyX3QgZXhwb3J0X29mZjsKKyAgdWludDMyX3QgZXhwb3J0X3NpemU7Cit9OworCitzdHJ1Y3QgbGlua2VyX29wdGlvbl9jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworICB1aW50MzJfdCBjb3VudDsKK307CisKKy8vIFRoZSBzeW1zZWdfY29tbWFuZCBpcyBvYnNvbGV0ZSBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KK3N0cnVjdCBzeW1zZWdfY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKKyAgdWludDMyX3Qgb2Zmc2V0OworICB1aW50MzJfdCBzaXplOworfTsKKworLy8gVGhlIGlkZW50X2NvbW1hbmQgaXMgb2Jzb2xldGUgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCitzdHJ1Y3QgaWRlbnRfY29tbWFuZCB7CisgIHVpbnQzMl90IGNtZDsKKyAgdWludDMyX3QgY21kc2l6ZTsKK307CisKKy8vIFRoZSBmdm1maWxlX2NvbW1hbmQgaXMgb2Jzb2xldGUgYW5kIG5vIGxvbmdlciBzdXBwb3J0ZWQuCitzdHJ1Y3QgZnZtZmlsZV9jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworICB1aW50MzJfdCBuYW1lOworICB1aW50MzJfdCBoZWFkZXJfYWRkcjsKK307CisKK3N0cnVjdCB0bHZfZGVzY3JpcHRvcl8zMiB7CisgIHVpbnQzMl90IHRodW5rOworICB1aW50MzJfdCBrZXk7CisgIHVpbnQzMl90IG9mZnNldDsKK307CisKK3N0cnVjdCB0bHZfZGVzY3JpcHRvcl82NCB7CisgIHVpbnQ2NF90IHRodW5rOworICB1aW50NjRfdCBrZXk7CisgIHVpbnQ2NF90IG9mZnNldDsKK307CisKK3N0cnVjdCB0bHZfZGVzY3JpcHRvciB7CisgIHVpbnRwdHJfdCB0aHVuazsKKyAgdWludHB0cl90IGtleTsKKyAgdWludHB0cl90IG9mZnNldDsKK307CisKK3N0cnVjdCBlbnRyeV9wb2ludF9jb21tYW5kIHsKKyAgdWludDMyX3QgY21kOworICB1aW50MzJfdCBjbWRzaXplOworICB1aW50NjRfdCBlbnRyeW9mZjsKKyAgdWludDY0X3Qgc3RhY2tzaXplOworfTsKKworLy8gU3RydWN0cyBmcm9tIDxtYWNoLW8vZmF0Lmg+CitzdHJ1Y3QgZmF0X2hlYWRlciB7CisgIHVpbnQzMl90IG1hZ2ljOworICB1aW50MzJfdCBuZmF0X2FyY2g7Cit9OworCitzdHJ1Y3QgZmF0X2FyY2ggeworICB1aW50MzJfdCBjcHV0eXBlOworICB1aW50MzJfdCBjcHVzdWJ0eXBlOworICB1aW50MzJfdCBvZmZzZXQ7CisgIHVpbnQzMl90IHNpemU7CisgIHVpbnQzMl90IGFsaWduOworfTsKKworc3RydWN0IGZhdF9hcmNoXzY0IHsKKyAgdWludDMyX3QgY3B1dHlwZTsKKyAgdWludDMyX3QgY3B1c3VidHlwZTsKKyAgdWludDY0X3Qgb2Zmc2V0OworICB1aW50NjRfdCBzaXplOworICB1aW50MzJfdCBhbGlnbjsKKyAgdWludDMyX3QgcmVzZXJ2ZWQ7Cit9OworCisvLyBTdHJ1Y3RzIGZyb20gPG1hY2gtby9yZWxvYy5oPgorc3RydWN0IHJlbG9jYXRpb25faW5mbyB7CisgIGludDMyX3Qgcl9hZGRyZXNzOworICB1aW50MzJfdCByX3N5bWJvbG51bSA6IDI0LCByX3BjcmVsIDogMSwgcl9sZW5ndGggOiAyLCByX2V4dGVybiA6IDEsCisgICAgICByX3R5cGUgOiA0OworfTsKKworc3RydWN0IHNjYXR0ZXJlZF9yZWxvY2F0aW9uX2luZm8geworI2lmIGRlZmluZWQoQllURV9PUkRFUikgJiYgZGVmaW5lZChCSUdfRU5ESUFOKSAmJiAoQllURV9PUkRFUiA9PSBCSUdfRU5ESUFOKQorICB1aW50MzJfdCByX3NjYXR0ZXJlZCA6IDEsIHJfcGNyZWwgOiAxLCByX2xlbmd0aCA6IDIsIHJfdHlwZSA6IDQsCisgICAgICByX2FkZHJlc3MgOiAyNDsKKyNlbHNlCisgIHVpbnQzMl90IHJfYWRkcmVzcyA6IDI0LCByX3R5cGUgOiA0LCByX2xlbmd0aCA6IDIsIHJfcGNyZWwgOiAxLAorICAgICAgcl9zY2F0dGVyZWQgOiAxOworI2VuZGlmCisgIGludDMyX3Qgcl92YWx1ZTsKK307CisKKy8vIFN0cnVjdHMgTk9UIGZyb20gPG1hY2gtby9yZWxvYy5oPiwgYnV0IHRoYXQgbWFrZSBMTFZNJ3MgbGlmZSBlYXNpZXIKK3N0cnVjdCBhbnlfcmVsb2NhdGlvbl9pbmZvIHsKKyAgdWludDMyX3Qgcl93b3JkMCwgcl93b3JkMTsKK307CisKKy8vIFN0cnVjdHMgZnJvbSA8bWFjaC1vL25saXN0Lmg+CitzdHJ1Y3Qgbmxpc3RfYmFzZSB7CisgIHVpbnQzMl90IG5fc3RyeDsKKyAgdWludDhfdCBuX3R5cGU7CisgIHVpbnQ4X3Qgbl9zZWN0OworICB1aW50MTZfdCBuX2Rlc2M7Cit9OworCitzdHJ1Y3Qgbmxpc3QgeworICB1aW50MzJfdCBuX3N0cng7CisgIHVpbnQ4X3Qgbl90eXBlOworICB1aW50OF90IG5fc2VjdDsKKyAgaW50MTZfdCBuX2Rlc2M7CisgIHVpbnQzMl90IG5fdmFsdWU7Cit9OworCitzdHJ1Y3Qgbmxpc3RfNjQgeworICB1aW50MzJfdCBuX3N0cng7CisgIHVpbnQ4X3Qgbl90eXBlOworICB1aW50OF90IG5fc2VjdDsKKyAgdWludDE2X3Qgbl9kZXNjOworICB1aW50NjRfdCBuX3ZhbHVlOworfTsKKworLy8gQnl0ZSBvcmRlciBzd2FwcGluZyBmdW5jdGlvbnMgZm9yIE1hY2hPIHN0cnVjdHMKKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChmYXRfaGVhZGVyICZtaCkgeworICBzeXM6OnN3YXBCeXRlT3JkZXIobWgubWFnaWMpOworICBzeXM6OnN3YXBCeXRlT3JkZXIobWgubmZhdF9hcmNoKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChmYXRfYXJjaCAmbWgpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKG1oLmNwdXR5cGUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIobWguY3B1c3VidHlwZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihtaC5vZmZzZXQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIobWguc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihtaC5hbGlnbik7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QoZmF0X2FyY2hfNjQgJm1oKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihtaC5jcHV0eXBlKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKG1oLmNwdXN1YnR5cGUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIobWgub2Zmc2V0KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKG1oLnNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIobWguYWxpZ24pOworICBzeXM6OnN3YXBCeXRlT3JkZXIobWgucmVzZXJ2ZWQpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KG1hY2hfaGVhZGVyICZtaCkgeworICBzeXM6OnN3YXBCeXRlT3JkZXIobWgubWFnaWMpOworICBzeXM6OnN3YXBCeXRlT3JkZXIobWguY3B1dHlwZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihtaC5jcHVzdWJ0eXBlKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKG1oLmZpbGV0eXBlKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKG1oLm5jbWRzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKG1oLnNpemVvZmNtZHMpOworICBzeXM6OnN3YXBCeXRlT3JkZXIobWguZmxhZ3MpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KG1hY2hfaGVhZGVyXzY0ICZIKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihILm1hZ2ljKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEguY3B1dHlwZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihILmNwdXN1YnR5cGUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoSC5maWxldHlwZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihILm5jbWRzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEguc2l6ZW9mY21kcyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihILmZsYWdzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEgucmVzZXJ2ZWQpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KGxvYWRfY29tbWFuZCAmbGMpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGxjLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihsYy5jbWRzaXplKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChzeW10YWJfY29tbWFuZCAmbGMpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGxjLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihsYy5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGxjLnN5bW9mZik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihsYy5uc3ltcyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihsYy5zdHJvZmYpOworICBzeXM6OnN3YXBCeXRlT3JkZXIobGMuc3Ryc2l6ZSk7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3Qoc2VnbWVudF9jb21tYW5kXzY0ICZzZWcpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlZy5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VnLmNtZHNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VnLnZtYWRkcik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWcudm1zaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlZy5maWxlb2ZmKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlZy5maWxlc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWcubWF4cHJvdCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWcuaW5pdHByb3QpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VnLm5zZWN0cyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWcuZmxhZ3MpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHNlZ21lbnRfY29tbWFuZCAmc2VnKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWcuY21kKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlZy5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlZy52bWFkZHIpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VnLnZtc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWcuZmlsZW9mZik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWcuZmlsZXNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VnLm1heHByb3QpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VnLmluaXRwcm90KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlZy5uc2VjdHMpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VnLmZsYWdzKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChzZWN0aW9uXzY0ICZzZWN0KSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWN0LmFkZHIpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VjdC5zaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlY3Qub2Zmc2V0KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlY3QuYWxpZ24pOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VjdC5yZWxvZmYpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VjdC5ucmVsb2MpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VjdC5mbGFncyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWN0LnJlc2VydmVkMSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWN0LnJlc2VydmVkMik7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3Qoc2VjdGlvbiAmc2VjdCkgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VjdC5hZGRyKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlY3Quc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWN0Lm9mZnNldCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzZWN0LmFsaWduKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlY3QucmVsb2ZmKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlY3QubnJlbG9jKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHNlY3QuZmxhZ3MpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VjdC5yZXNlcnZlZDEpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc2VjdC5yZXNlcnZlZDIpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KGR5bGRfaW5mb19jb21tYW5kICZpbmZvKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihpbmZvLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihpbmZvLmNtZHNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoaW5mby5yZWJhc2Vfb2ZmKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGluZm8ucmViYXNlX3NpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoaW5mby5iaW5kX29mZik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihpbmZvLmJpbmRfc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihpbmZvLndlYWtfYmluZF9vZmYpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoaW5mby53ZWFrX2JpbmRfc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihpbmZvLmxhenlfYmluZF9vZmYpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoaW5mby5sYXp5X2JpbmRfc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihpbmZvLmV4cG9ydF9vZmYpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoaW5mby5leHBvcnRfc2l6ZSk7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QoZHlsaWJfY29tbWFuZCAmZCkgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoZC5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZC5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGQuZHlsaWIubmFtZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkLmR5bGliLnRpbWVzdGFtcCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkLmR5bGliLmN1cnJlbnRfdmVyc2lvbik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkLmR5bGliLmNvbXBhdGliaWxpdHlfdmVyc2lvbik7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3Qoc3ViX2ZyYW1ld29ya19jb21tYW5kICZzKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzLmNtZHNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIocy51bWJyZWxsYSk7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3Qoc3ViX3VtYnJlbGxhX2NvbW1hbmQgJnMpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHMuY21kKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHMuY21kc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzLnN1Yl91bWJyZWxsYSk7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3Qoc3ViX2xpYnJhcnlfY29tbWFuZCAmcykgeworICBzeXM6OnN3YXBCeXRlT3JkZXIocy5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIocy5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHMuc3ViX2xpYnJhcnkpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHN1Yl9jbGllbnRfY29tbWFuZCAmcykgeworICBzeXM6OnN3YXBCeXRlT3JkZXIocy5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIocy5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHMuY2xpZW50KTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChyb3V0aW5lc19jb21tYW5kICZyKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihyLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihyLmNtZHNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5pbml0X2FkZHJlc3MpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5pbml0X21vZHVsZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihyLnJlc2VydmVkMSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihyLnJlc2VydmVkMik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihyLnJlc2VydmVkMyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihyLnJlc2VydmVkNCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihyLnJlc2VydmVkNSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihyLnJlc2VydmVkNik7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3Qocm91dGluZXNfY29tbWFuZF82NCAmcikgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHIuaW5pdF9hZGRyZXNzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHIuaW5pdF9tb2R1bGUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5yZXNlcnZlZDEpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5yZXNlcnZlZDIpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5yZXNlcnZlZDMpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5yZXNlcnZlZDQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5yZXNlcnZlZDUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5yZXNlcnZlZDYpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHRocmVhZF9jb21tYW5kICZ0KSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih0LmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih0LmNtZHNpemUpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KGR5bGlua2VyX2NvbW1hbmQgJmQpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGQuY21kKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGQuY21kc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkLm5hbWUpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHV1aWRfY29tbWFuZCAmdSkgeworICBzeXM6OnN3YXBCeXRlT3JkZXIodS5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIodS5jbWRzaXplKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChycGF0aF9jb21tYW5kICZyKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihyLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihyLmNtZHNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoci5wYXRoKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChzb3VyY2VfdmVyc2lvbl9jb21tYW5kICZzKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzLmNtZHNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIocy52ZXJzaW9uKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChlbnRyeV9wb2ludF9jb21tYW5kICZlKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihlLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihlLmNtZHNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZS5lbnRyeW9mZik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihlLnN0YWNrc2l6ZSk7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QoZW5jcnlwdGlvbl9pbmZvX2NvbW1hbmQgJmUpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGUuY21kKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGUuY21kc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihlLmNyeXB0b2ZmKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGUuY3J5cHRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGUuY3J5cHRpZCk7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QoZW5jcnlwdGlvbl9pbmZvX2NvbW1hbmRfNjQgJmUpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGUuY21kKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGUuY21kc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihlLmNyeXB0b2ZmKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGUuY3J5cHRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGUuY3J5cHRpZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihlLnBhZCk7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QoZHlzeW10YWJfY29tbWFuZCAmZHN0KSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkc3QuY21kKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGRzdC5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGRzdC5pbG9jYWxzeW0pOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZHN0Lm5sb2NhbHN5bSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkc3QuaWV4dGRlZnN5bSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkc3QubmV4dGRlZnN5bSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkc3QuaXVuZGVmc3ltKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGRzdC5udW5kZWZzeW0pOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZHN0LnRvY29mZik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkc3QubnRvYyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkc3QubW9kdGFib2ZmKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGRzdC5ubW9kdGFiKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGRzdC5leHRyZWZzeW1vZmYpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZHN0Lm5leHRyZWZzeW1zKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGRzdC5pbmRpcmVjdHN5bW9mZik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkc3QubmluZGlyZWN0c3ltcyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihkc3QuZXh0cmVsb2ZmKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGRzdC5uZXh0cmVsKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKGRzdC5sb2NyZWxvZmYpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoZHN0Lm5sb2NyZWwpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KGFueV9yZWxvY2F0aW9uX2luZm8gJnJlbG9jKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihyZWxvYy5yX3dvcmQwKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHJlbG9jLnJfd29yZDEpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KG5saXN0X2Jhc2UgJlMpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKFMubl9zdHJ4KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKFMubl9kZXNjKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChubGlzdCAmc3ltKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzeW0ubl9zdHJ4KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHN5bS5uX2Rlc2MpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc3ltLm5fdmFsdWUpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KG5saXN0XzY0ICZzeW0pIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHN5bS5uX3N0cngpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoc3ltLm5fZGVzYyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihzeW0ubl92YWx1ZSk7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QobGlua2VkaXRfZGF0YV9jb21tYW5kICZDKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLmNtZHNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5kYXRhb2ZmKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuZGF0YXNpemUpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KGxpbmtlcl9vcHRpb25fY29tbWFuZCAmQykgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuY291bnQpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHZlcnNpb25fbWluX2NvbW1hbmQgJkMpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuY21kKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuY21kc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLnZlcnNpb24pOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5zZGspOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KG5vdGVfY29tbWFuZCAmQykgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMub2Zmc2V0KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuc2l6ZSk7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QoYnVpbGRfdmVyc2lvbl9jb21tYW5kICZDKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLmNtZHNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5wbGF0Zm9ybSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLm1pbm9zKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuc2RrKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMubnRvb2xzKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChidWlsZF90b29sX3ZlcnNpb24gJkMpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMudG9vbCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLnZlcnNpb24pOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KGRhdGFfaW5fY29kZV9lbnRyeSAmQykgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5vZmZzZXQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5sZW5ndGgpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5raW5kKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdCh1aW50MzJfdCAmQykgeyBzeXM6OnN3YXBCeXRlT3JkZXIoQyk7IH0KKworLy8gVGhlIHByZWJpbmRfY2tzdW1fY29tbWFuZCBpcyBvYnNvbGV0ZSBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QocHJlYmluZF9ja3N1bV9jb21tYW5kICZDKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLmNtZHNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5ja3N1bSk7Cit9CisKKy8vIFRoZSB0d29sZXZlbF9oaW50c19jb21tYW5kIGlzIG9ic29sZXRlIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgoraW5saW5lIHZvaWQgc3dhcFN0cnVjdCh0d29sZXZlbF9oaW50c19jb21tYW5kICZDKSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLmNtZCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLmNtZHNpemUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5vZmZzZXQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5uaGludHMpOworfQorCisvLyBUaGUgcHJlYm91bmRfZHlsaWJfY29tbWFuZCBpcyBvYnNvbGV0ZSBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QocHJlYm91bmRfZHlsaWJfY29tbWFuZCAmQykgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5jbWRzaXplKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMubmFtZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLm5tb2R1bGVzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMubGlua2VkX21vZHVsZXMpOworfQorCisvLyBUaGUgZnZtZmlsZV9jb21tYW5kIGlzIG9ic29sZXRlIGFuZCBubyBsb25nZXIgc3VwcG9ydGVkLgoraW5saW5lIHZvaWQgc3dhcFN0cnVjdChmdm1maWxlX2NvbW1hbmQgJkMpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuY21kKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuY21kc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLm5hbWUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5oZWFkZXJfYWRkcik7Cit9CisKKy8vIFRoZSBzeW1zZWdfY29tbWFuZCBpcyBvYnNvbGV0ZSBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3Qoc3ltc2VnX2NvbW1hbmQgJkMpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuY21kKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuY21kc2l6ZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLm9mZnNldCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLnNpemUpOworfQorCisvLyBUaGUgaWRlbnRfY29tbWFuZCBpcyBvYnNvbGV0ZSBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QoaWRlbnRfY29tbWFuZCAmQykgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5jbWQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5jbWRzaXplKTsKK30KKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChmdm1saWIgJkMpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMubmFtZSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcihDLm1pbm9yX3ZlcnNpb24pOworICBzeXM6OnN3YXBCeXRlT3JkZXIoQy5oZWFkZXJfYWRkcik7Cit9CisKKy8vIFRoZSBmdm1saWJfY29tbWFuZCBpcyBvYnNvbGV0ZSBhbmQgbm8gbG9uZ2VyIHN1cHBvcnRlZC4KK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QoZnZtbGliX2NvbW1hbmQgJkMpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuY21kKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKEMuY21kc2l6ZSk7CisgIHN3YXBTdHJ1Y3QoQy5mdm1saWIpOworfQorCisvLyBHZXQvU2V0IGZ1bmN0aW9ucyBmcm9tIDxtYWNoLW8vbmxpc3QuaD4KKworaW5saW5lIHVpbnQxNl90IEdFVF9MSUJSQVJZX09SRElOQUwodWludDE2X3Qgbl9kZXNjKSB7CisgIHJldHVybiAoKChuX2Rlc2MpID4+IDh1KSAmIDB4ZmZ1KTsKK30KKworaW5saW5lIHZvaWQgU0VUX0xJQlJBUllfT1JESU5BTCh1aW50MTZfdCAmbl9kZXNjLCB1aW50OF90IG9yZGluYWwpIHsKKyAgbl9kZXNjID0gKCgobl9kZXNjKSYweDAwZmYpIHwgKCgob3JkaW5hbCkmMHhmZikgPDwgOCkpOworfQorCitpbmxpbmUgdWludDhfdCBHRVRfQ09NTV9BTElHTih1aW50MTZfdCBuX2Rlc2MpIHsKKyAgcmV0dXJuIChuX2Rlc2MgPj4gOHUpICYgMHgwZnU7Cit9CisKK2lubGluZSB2b2lkIFNFVF9DT01NX0FMSUdOKHVpbnQxNl90ICZuX2Rlc2MsIHVpbnQ4X3QgYWxpZ24pIHsKKyAgbl9kZXNjID0gKChuX2Rlc2MgJiAweGYwZmZ1KSB8ICgoYWxpZ24gJiAweDBmdSkgPDwgOHUpKTsKK30KKworLy8gRW51bXMgZnJvbSA8bWFjaC9tYWNoaW5lLmg+CitlbnVtIDogdWludDMyX3QgeworICAvLyBDYXBhYmlsaXR5IGJpdHMgdXNlZCBpbiB0aGUgZGVmaW5pdGlvbiBvZiBjcHVfdHlwZS4KKyAgQ1BVX0FSQ0hfTUFTSyA9IDB4ZmYwMDAwMDAsIC8vIE1hc2sgZm9yIGFyY2hpdGVjdHVyZSBiaXRzCisgIENQVV9BUkNIX0FCSTY0ID0gMHgwMTAwMDAwMCAvLyA2NCBiaXQgQUJJCit9OworCisvLyBDb25zdGFudHMgZm9yIHRoZSBjcHV0eXBlIGZpZWxkLgorZW51bSBDUFVUeXBlIHsKKyAgQ1BVX1RZUEVfQU5ZID0gLTEsCisgIENQVV9UWVBFX1g4NiA9IDcsCisgIENQVV9UWVBFX0kzODYgPSBDUFVfVFlQRV9YODYsCisgIENQVV9UWVBFX1g4Nl82NCA9IENQVV9UWVBFX1g4NiB8IENQVV9BUkNIX0FCSTY0LAorICAvKiBDUFVfVFlQRV9NSVBTICAgICAgPSA4LCAqLworICBDUFVfVFlQRV9NQzk4MDAwID0gMTAsIC8vIE9sZCBNb3Rvcm9sYSBQb3dlclBDCisgIENQVV9UWVBFX0FSTSA9IDEyLAorICBDUFVfVFlQRV9BUk02NCA9IENQVV9UWVBFX0FSTSB8IENQVV9BUkNIX0FCSTY0LAorICBDUFVfVFlQRV9TUEFSQyA9IDE0LAorICBDUFVfVFlQRV9QT1dFUlBDID0gMTgsCisgIENQVV9UWVBFX1BPV0VSUEM2NCA9IENQVV9UWVBFX1BPV0VSUEMgfCBDUFVfQVJDSF9BQkk2NAorfTsKKworZW51bSA6IHVpbnQzMl90IHsKKyAgLy8gQ2FwYWJpbGl0eSBiaXRzIHVzZWQgaW4gdGhlIGRlZmluaXRpb24gb2YgY3B1c3VidHlwZS4KKyAgQ1BVX1NVQlRZUEVfTUFTSyA9IDB4ZmYwMDAwMDAsICAvLyBNYXNrIGZvciBhcmNoaXRlY3R1cmUgYml0cworICBDUFVfU1VCVFlQRV9MSUI2NCA9IDB4ODAwMDAwMDAsIC8vIDY0IGJpdCBsaWJyYXJpZXMKKworICAvLyBTcGVjaWFsIENQVSBzdWJ0eXBlIGNvbnN0YW50cy4KKyAgQ1BVX1NVQlRZUEVfTVVMVElQTEUgPSB+MHUKK307CisKKy8vIENvbnN0YW50cyBmb3IgdGhlIGNwdXN1YnR5cGUgZmllbGQuCitlbnVtIENQVVN1YlR5cGVYODYgeworICBDUFVfU1VCVFlQRV9JMzg2X0FMTCA9IDMsCisgIENQVV9TVUJUWVBFXzM4NiA9IDMsCisgIENQVV9TVUJUWVBFXzQ4NiA9IDQsCisgIENQVV9TVUJUWVBFXzQ4NlNYID0gMHg4NCwKKyAgQ1BVX1NVQlRZUEVfNTg2ID0gNSwKKyAgQ1BVX1NVQlRZUEVfUEVOVCA9IENQVV9TVUJUWVBFXzU4NiwKKyAgQ1BVX1NVQlRZUEVfUEVOVFBSTyA9IDB4MTYsCisgIENQVV9TVUJUWVBFX1BFTlRJSV9NMyA9IDB4MzYsCisgIENQVV9TVUJUWVBFX1BFTlRJSV9NNSA9IDB4NTYsCisgIENQVV9TVUJUWVBFX0NFTEVST04gPSAweDY3LAorICBDUFVfU1VCVFlQRV9DRUxFUk9OX01PQklMRSA9IDB4NzcsCisgIENQVV9TVUJUWVBFX1BFTlRJVU1fMyA9IDB4MDgsCisgIENQVV9TVUJUWVBFX1BFTlRJVU1fM19NID0gMHgxOCwKKyAgQ1BVX1NVQlRZUEVfUEVOVElVTV8zX1hFT04gPSAweDI4LAorICBDUFVfU1VCVFlQRV9QRU5USVVNX00gPSAweDA5LAorICBDUFVfU1VCVFlQRV9QRU5USVVNXzQgPSAweDBhLAorICBDUFVfU1VCVFlQRV9QRU5USVVNXzRfTSA9IDB4MWEsCisgIENQVV9TVUJUWVBFX0lUQU5JVU0gPSAweDBiLAorICBDUFVfU1VCVFlQRV9JVEFOSVVNXzIgPSAweDFiLAorICBDUFVfU1VCVFlQRV9YRU9OID0gMHgwYywKKyAgQ1BVX1NVQlRZUEVfWEVPTl9NUCA9IDB4MWMsCisKKyAgQ1BVX1NVQlRZUEVfWDg2X0FMTCA9IDMsCisgIENQVV9TVUJUWVBFX1g4Nl82NF9BTEwgPSAzLAorICBDUFVfU1VCVFlQRV9YODZfQVJDSDEgPSA0LAorICBDUFVfU1VCVFlQRV9YODZfNjRfSCA9IDgKK307CitpbmxpbmUgaW50IENQVV9TVUJUWVBFX0lOVEVMKGludCBGYW1pbHksIGludCBNb2RlbCkgeworICByZXR1cm4gRmFtaWx5IHwgKE1vZGVsIDw8IDQpOworfQoraW5saW5lIGludCBDUFVfU1VCVFlQRV9JTlRFTF9GQU1JTFkoQ1BVU3ViVHlwZVg4NiBTVCkgeworICByZXR1cm4gKChpbnQpU1QpICYgMHgwZjsKK30KK2lubGluZSBpbnQgQ1BVX1NVQlRZUEVfSU5URUxfTU9ERUwoQ1BVU3ViVHlwZVg4NiBTVCkgeyByZXR1cm4gKChpbnQpU1QpID4+IDQ7IH0KK2VudW0geyBDUFVfU1VCVFlQRV9JTlRFTF9GQU1JTFlfTUFYID0gMTUsIENQVV9TVUJUWVBFX0lOVEVMX01PREVMX0FMTCA9IDAgfTsKKworZW51bSBDUFVTdWJUeXBlQVJNIHsKKyAgQ1BVX1NVQlRZUEVfQVJNX0FMTCA9IDAsCisgIENQVV9TVUJUWVBFX0FSTV9WNFQgPSA1LAorICBDUFVfU1VCVFlQRV9BUk1fVjYgPSA2LAorICBDUFVfU1VCVFlQRV9BUk1fVjUgPSA3LAorICBDUFVfU1VCVFlQRV9BUk1fVjVURUogPSA3LAorICBDUFVfU1VCVFlQRV9BUk1fWFNDQUxFID0gOCwKKyAgQ1BVX1NVQlRZUEVfQVJNX1Y3ID0gOSwKKyAgLy8gIHVudXNlZCAgQVJNX1Y3RiAgICAgPSAxMCwKKyAgQ1BVX1NVQlRZUEVfQVJNX1Y3UyA9IDExLAorICBDUFVfU1VCVFlQRV9BUk1fVjdLID0gMTIsCisgIENQVV9TVUJUWVBFX0FSTV9WNk0gPSAxNCwKKyAgQ1BVX1NVQlRZUEVfQVJNX1Y3TSA9IDE1LAorICBDUFVfU1VCVFlQRV9BUk1fVjdFTSA9IDE2Cit9OworCitlbnVtIENQVVN1YlR5cGVBUk02NCB7IENQVV9TVUJUWVBFX0FSTTY0X0FMTCA9IDAgfTsKKworZW51bSBDUFVTdWJUeXBlU1BBUkMgeyBDUFVfU1VCVFlQRV9TUEFSQ19BTEwgPSAwIH07CisKK2VudW0gQ1BVU3ViVHlwZVBvd2VyUEMgeworICBDUFVfU1VCVFlQRV9QT1dFUlBDX0FMTCA9IDAsCisgIENQVV9TVUJUWVBFX1BPV0VSUENfNjAxID0gMSwKKyAgQ1BVX1NVQlRZUEVfUE9XRVJQQ182MDIgPSAyLAorICBDUFVfU1VCVFlQRV9QT1dFUlBDXzYwMyA9IDMsCisgIENQVV9TVUJUWVBFX1BPV0VSUENfNjAzZSA9IDQsCisgIENQVV9TVUJUWVBFX1BPV0VSUENfNjAzZXYgPSA1LAorICBDUFVfU1VCVFlQRV9QT1dFUlBDXzYwNCA9IDYsCisgIENQVV9TVUJUWVBFX1BPV0VSUENfNjA0ZSA9IDcsCisgIENQVV9TVUJUWVBFX1BPV0VSUENfNjIwID0gOCwKKyAgQ1BVX1NVQlRZUEVfUE9XRVJQQ183NTAgPSA5LAorICBDUFVfU1VCVFlQRV9QT1dFUlBDXzc0MDAgPSAxMCwKKyAgQ1BVX1NVQlRZUEVfUE9XRVJQQ183NDUwID0gMTEsCisgIENQVV9TVUJUWVBFX1BPV0VSUENfOTcwID0gMTAwLAorCisgIENQVV9TVUJUWVBFX01DOTgwMDAwX0FMTCA9IENQVV9TVUJUWVBFX1BPV0VSUENfQUxMLAorICBDUFVfU1VCVFlQRV9NQzk4NjAxID0gQ1BVX1NVQlRZUEVfUE9XRVJQQ182MDEKK307CisKK3N0cnVjdCB4ODZfdGhyZWFkX3N0YXRlMzJfdCB7CisgIHVpbnQzMl90IGVheDsKKyAgdWludDMyX3QgZWJ4OworICB1aW50MzJfdCBlY3g7CisgIHVpbnQzMl90IGVkeDsKKyAgdWludDMyX3QgZWRpOworICB1aW50MzJfdCBlc2k7CisgIHVpbnQzMl90IGVicDsKKyAgdWludDMyX3QgZXNwOworICB1aW50MzJfdCBzczsKKyAgdWludDMyX3QgZWZsYWdzOworICB1aW50MzJfdCBlaXA7CisgIHVpbnQzMl90IGNzOworICB1aW50MzJfdCBkczsKKyAgdWludDMyX3QgZXM7CisgIHVpbnQzMl90IGZzOworICB1aW50MzJfdCBnczsKK307CisKK3N0cnVjdCB4ODZfdGhyZWFkX3N0YXRlNjRfdCB7CisgIHVpbnQ2NF90IHJheDsKKyAgdWludDY0X3QgcmJ4OworICB1aW50NjRfdCByY3g7CisgIHVpbnQ2NF90IHJkeDsKKyAgdWludDY0X3QgcmRpOworICB1aW50NjRfdCByc2k7CisgIHVpbnQ2NF90IHJicDsKKyAgdWludDY0X3QgcnNwOworICB1aW50NjRfdCByODsKKyAgdWludDY0X3Qgcjk7CisgIHVpbnQ2NF90IHIxMDsKKyAgdWludDY0X3QgcjExOworICB1aW50NjRfdCByMTI7CisgIHVpbnQ2NF90IHIxMzsKKyAgdWludDY0X3QgcjE0OworICB1aW50NjRfdCByMTU7CisgIHVpbnQ2NF90IHJpcDsKKyAgdWludDY0X3QgcmZsYWdzOworICB1aW50NjRfdCBjczsKKyAgdWludDY0X3QgZnM7CisgIHVpbnQ2NF90IGdzOworfTsKKworZW51bSB4ODZfZnBfY29udHJvbF9wcmVjaXMgeworICB4ODZfRlBfUFJFQ18yNEIgPSAwLAorICB4ODZfRlBfUFJFQ181M0IgPSAyLAorICB4ODZfRlBfUFJFQ182NEIgPSAzCit9OworCitlbnVtIHg4Nl9mcF9jb250cm9sX3JjIHsKKyAgeDg2X0ZQX1JORF9ORUFSID0gMCwKKyAgeDg2X0ZQX1JORF9ET1dOID0gMSwKKyAgeDg2X0ZQX1JORF9VUCA9IDIsCisgIHg4Nl9GUF9DSE9QID0gMworfTsKKworc3RydWN0IGZwX2NvbnRyb2xfdCB7CisgIHVuc2lnbmVkIHNob3J0IGludmFsaWQgOiAxLCBkZW5vcm0gOiAxLCB6ZGl2IDogMSwgb3ZyZmwgOiAxLCB1bmRmbCA6IDEsCisgICAgICBwcmVjaXMgOiAxLCA6IDIsIHBjIDogMiwgcmMgOiAyLCA6IDEsIDogMzsKK307CisKK3N0cnVjdCBmcF9zdGF0dXNfdCB7CisgIHVuc2lnbmVkIHNob3J0IGludmFsaWQgOiAxLCBkZW5vcm0gOiAxLCB6ZGl2IDogMSwgb3ZyZmwgOiAxLCB1bmRmbCA6IDEsCisgICAgICBwcmVjaXMgOiAxLCBzdGtmbHQgOiAxLCBlcnJzdW1tIDogMSwgYzAgOiAxLCBjMSA6IDEsIGMyIDogMSwgdG9zIDogMywKKyAgICAgIGMzIDogMSwgYnVzeSA6IDE7Cit9OworCitzdHJ1Y3QgbW1zdF9yZWdfdCB7CisgIGNoYXIgbW1zdF9yZWdbMTBdOworICBjaGFyIG1tc3RfcnNydls2XTsKK307CisKK3N0cnVjdCB4bW1fcmVnX3QgeworICBjaGFyIHhtbV9yZWdbMTZdOworfTsKKworc3RydWN0IHg4Nl9mbG9hdF9zdGF0ZTY0X3QgeworICBpbnQzMl90IGZwdV9yZXNlcnZlZFsyXTsKKyAgZnBfY29udHJvbF90IGZwdV9mY3c7CisgIGZwX3N0YXR1c190IGZwdV9mc3c7CisgIHVpbnQ4X3QgZnB1X2Z0dzsKKyAgdWludDhfdCBmcHVfcnNydjE7CisgIHVpbnQxNl90IGZwdV9mb3A7CisgIHVpbnQzMl90IGZwdV9pcDsKKyAgdWludDE2X3QgZnB1X2NzOworICB1aW50MTZfdCBmcHVfcnNydjI7CisgIHVpbnQzMl90IGZwdV9kcDsKKyAgdWludDE2X3QgZnB1X2RzOworICB1aW50MTZfdCBmcHVfcnNydjM7CisgIHVpbnQzMl90IGZwdV9teGNzcjsKKyAgdWludDMyX3QgZnB1X214Y3NybWFzazsKKyAgbW1zdF9yZWdfdCBmcHVfc3RtbTA7CisgIG1tc3RfcmVnX3QgZnB1X3N0bW0xOworICBtbXN0X3JlZ190IGZwdV9zdG1tMjsKKyAgbW1zdF9yZWdfdCBmcHVfc3RtbTM7CisgIG1tc3RfcmVnX3QgZnB1X3N0bW00OworICBtbXN0X3JlZ190IGZwdV9zdG1tNTsKKyAgbW1zdF9yZWdfdCBmcHVfc3RtbTY7CisgIG1tc3RfcmVnX3QgZnB1X3N0bW03OworICB4bW1fcmVnX3QgZnB1X3htbTA7CisgIHhtbV9yZWdfdCBmcHVfeG1tMTsKKyAgeG1tX3JlZ190IGZwdV94bW0yOworICB4bW1fcmVnX3QgZnB1X3htbTM7CisgIHhtbV9yZWdfdCBmcHVfeG1tNDsKKyAgeG1tX3JlZ190IGZwdV94bW01OworICB4bW1fcmVnX3QgZnB1X3htbTY7CisgIHhtbV9yZWdfdCBmcHVfeG1tNzsKKyAgeG1tX3JlZ190IGZwdV94bW04OworICB4bW1fcmVnX3QgZnB1X3htbTk7CisgIHhtbV9yZWdfdCBmcHVfeG1tMTA7CisgIHhtbV9yZWdfdCBmcHVfeG1tMTE7CisgIHhtbV9yZWdfdCBmcHVfeG1tMTI7CisgIHhtbV9yZWdfdCBmcHVfeG1tMTM7CisgIHhtbV9yZWdfdCBmcHVfeG1tMTQ7CisgIHhtbV9yZWdfdCBmcHVfeG1tMTU7CisgIGNoYXIgZnB1X3JzcnY0WzYgKiAxNl07CisgIHVpbnQzMl90IGZwdV9yZXNlcnZlZDE7Cit9OworCitzdHJ1Y3QgeDg2X2V4Y2VwdGlvbl9zdGF0ZTY0X3QgeworICB1aW50MTZfdCB0cmFwbm87CisgIHVpbnQxNl90IGNwdTsKKyAgdWludDMyX3QgZXJyOworICB1aW50NjRfdCBmYXVsdHZhZGRyOworfTsKKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdCh4ODZfdGhyZWFkX3N0YXRlMzJfdCAmeCkgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5lYXgpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5lYngpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5lY3gpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5lZHgpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5lZGkpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5lc2kpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5lYnApOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5lc3ApOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5zcyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmVmbGFncyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmVpcCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmNzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZHMpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5lcyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmZzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZ3MpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHg4Nl90aHJlYWRfc3RhdGU2NF90ICZ4KSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnJheCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnJieCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnJjeCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnJkeCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnJkaSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnJzaSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnJicCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnJzcCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnI4KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjkpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yMTApOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yMTEpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yMTIpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yMTMpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yMTQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yMTUpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yaXApOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yZmxhZ3MpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5jcyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmZzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZ3MpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHg4Nl9mbG9hdF9zdGF0ZTY0X3QgJngpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZnB1X3Jlc2VydmVkWzBdKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZnB1X3Jlc2VydmVkWzFdKTsKKyAgLy8gVE9ETyBzd2FwOiBmcF9jb250cm9sX3QgZnB1X2ZjdzsKKyAgLy8gVE9ETyBzd2FwOiBmcF9zdGF0dXNfdCBmcHVfZnN3OworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5mcHVfZm9wKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZnB1X2lwKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZnB1X2NzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZnB1X3JzcnYyKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZnB1X2RwKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZnB1X2RzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZnB1X3JzcnYzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZnB1X214Y3NyKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZnB1X214Y3NybWFzayk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmZwdV9yZXNlcnZlZDEpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHg4Nl9leGNlcHRpb25fc3RhdGU2NF90ICZ4KSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnRyYXBubyk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmNwdSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmVycik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmZhdWx0dmFkZHIpOworfQorCitzdHJ1Y3QgeDg2X3N0YXRlX2hkcl90IHsKKyAgdWludDMyX3QgZmxhdm9yOworICB1aW50MzJfdCBjb3VudDsKK307CisKK3N0cnVjdCB4ODZfdGhyZWFkX3N0YXRlX3QgeworICB4ODZfc3RhdGVfaGRyX3QgdHNoOworICB1bmlvbiB7CisgICAgeDg2X3RocmVhZF9zdGF0ZTY0X3QgdHM2NDsKKyAgICB4ODZfdGhyZWFkX3N0YXRlMzJfdCB0czMyOworICB9IHV0czsKK307CisKK3N0cnVjdCB4ODZfZmxvYXRfc3RhdGVfdCB7CisgIHg4Nl9zdGF0ZV9oZHJfdCBmc2g7CisgIHVuaW9uIHsKKyAgICB4ODZfZmxvYXRfc3RhdGU2NF90IGZzNjQ7CisgIH0gdWZzOworfTsKKworc3RydWN0IHg4Nl9leGNlcHRpb25fc3RhdGVfdCB7CisgIHg4Nl9zdGF0ZV9oZHJfdCBlc2g7CisgIHVuaW9uIHsKKyAgICB4ODZfZXhjZXB0aW9uX3N0YXRlNjRfdCBlczY0OworICB9IHVlczsKK307CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QoeDg2X3N0YXRlX2hkcl90ICZ4KSB7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmZsYXZvcik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmNvdW50KTsKK30KKworZW51bSBYODZUaHJlYWRGbGF2b3JzIHsKKyAgeDg2X1RIUkVBRF9TVEFURTMyID0gMSwKKyAgeDg2X0ZMT0FUX1NUQVRFMzIgPSAyLAorICB4ODZfRVhDRVBUSU9OX1NUQVRFMzIgPSAzLAorICB4ODZfVEhSRUFEX1NUQVRFNjQgPSA0LAorICB4ODZfRkxPQVRfU1RBVEU2NCA9IDUsCisgIHg4Nl9FWENFUFRJT05fU1RBVEU2NCA9IDYsCisgIHg4Nl9USFJFQURfU1RBVEUgPSA3LAorICB4ODZfRkxPQVRfU1RBVEUgPSA4LAorICB4ODZfRVhDRVBUSU9OX1NUQVRFID0gOSwKKyAgeDg2X0RFQlVHX1NUQVRFMzIgPSAxMCwKKyAgeDg2X0RFQlVHX1NUQVRFNjQgPSAxMSwKKyAgeDg2X0RFQlVHX1NUQVRFID0gMTIKK307CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QoeDg2X3RocmVhZF9zdGF0ZV90ICZ4KSB7CisgIHN3YXBTdHJ1Y3QoeC50c2gpOworICBpZiAoeC50c2guZmxhdm9yID09IHg4Nl9USFJFQURfU1RBVEU2NCkKKyAgICBzd2FwU3RydWN0KHgudXRzLnRzNjQpOworfQorCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHg4Nl9mbG9hdF9zdGF0ZV90ICZ4KSB7CisgIHN3YXBTdHJ1Y3QoeC5mc2gpOworICBpZiAoeC5mc2guZmxhdm9yID09IHg4Nl9GTE9BVF9TVEFURTY0KQorICAgIHN3YXBTdHJ1Y3QoeC51ZnMuZnM2NCk7Cit9CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QoeDg2X2V4Y2VwdGlvbl9zdGF0ZV90ICZ4KSB7CisgIHN3YXBTdHJ1Y3QoeC5lc2gpOworICBpZiAoeC5lc2guZmxhdm9yID09IHg4Nl9FWENFUFRJT05fU1RBVEU2NCkKKyAgICBzd2FwU3RydWN0KHgudWVzLmVzNjQpOworfQorCitjb25zdCB1aW50MzJfdCB4ODZfVEhSRUFEX1NUQVRFMzJfQ09VTlQgPQorICAgIHNpemVvZih4ODZfdGhyZWFkX3N0YXRlMzJfdCkgLyBzaXplb2YodWludDMyX3QpOworCitjb25zdCB1aW50MzJfdCB4ODZfVEhSRUFEX1NUQVRFNjRfQ09VTlQgPQorICAgIHNpemVvZih4ODZfdGhyZWFkX3N0YXRlNjRfdCkgLyBzaXplb2YodWludDMyX3QpOworY29uc3QgdWludDMyX3QgeDg2X0ZMT0FUX1NUQVRFNjRfQ09VTlQgPQorICAgIHNpemVvZih4ODZfZmxvYXRfc3RhdGU2NF90KSAvIHNpemVvZih1aW50MzJfdCk7Citjb25zdCB1aW50MzJfdCB4ODZfRVhDRVBUSU9OX1NUQVRFNjRfQ09VTlQgPQorICAgIHNpemVvZih4ODZfZXhjZXB0aW9uX3N0YXRlNjRfdCkgLyBzaXplb2YodWludDMyX3QpOworCitjb25zdCB1aW50MzJfdCB4ODZfVEhSRUFEX1NUQVRFX0NPVU5UID0KKyAgICBzaXplb2YoeDg2X3RocmVhZF9zdGF0ZV90KSAvIHNpemVvZih1aW50MzJfdCk7Citjb25zdCB1aW50MzJfdCB4ODZfRkxPQVRfU1RBVEVfQ09VTlQgPQorICAgIHNpemVvZih4ODZfZmxvYXRfc3RhdGVfdCkgLyBzaXplb2YodWludDMyX3QpOworY29uc3QgdWludDMyX3QgeDg2X0VYQ0VQVElPTl9TVEFURV9DT1VOVCA9CisgICAgc2l6ZW9mKHg4Nl9leGNlcHRpb25fc3RhdGVfdCkgLyBzaXplb2YodWludDMyX3QpOworCitzdHJ1Y3QgYXJtX3RocmVhZF9zdGF0ZTMyX3QgeworICB1aW50MzJfdCByWzEzXTsKKyAgdWludDMyX3Qgc3A7CisgIHVpbnQzMl90IGxyOworICB1aW50MzJfdCBwYzsKKyAgdWludDMyX3QgY3BzcjsKK307CisKK2lubGluZSB2b2lkIHN3YXBTdHJ1Y3QoYXJtX3RocmVhZF9zdGF0ZTMyX3QgJngpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMzsgaSsrKQorICAgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnJbaV0pOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5zcCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmxyKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucGMpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5jcHNyKTsKK30KKworc3RydWN0IGFybV90aHJlYWRfc3RhdGU2NF90IHsKKyAgdWludDY0X3QgeFsyOV07CisgIHVpbnQ2NF90IGZwOworICB1aW50NjRfdCBscjsKKyAgdWludDY0X3Qgc3A7CisgIHVpbnQ2NF90IHBjOworICB1aW50MzJfdCBjcHNyOworICB1aW50MzJfdCBwYWQ7Cit9OworCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KGFybV90aHJlYWRfc3RhdGU2NF90ICZ4KSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjk7IGkrKykKKyAgICBzeXM6OnN3YXBCeXRlT3JkZXIoeC54W2ldKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZnApOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5scik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnNwKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucGMpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5jcHNyKTsKK30KKworc3RydWN0IGFybV9zdGF0ZV9oZHJfdCB7CisgIHVpbnQzMl90IGZsYXZvcjsKKyAgdWludDMyX3QgY291bnQ7Cit9OworCitzdHJ1Y3QgYXJtX3RocmVhZF9zdGF0ZV90IHsKKyAgYXJtX3N0YXRlX2hkcl90IHRzaDsKKyAgdW5pb24geworICAgIGFybV90aHJlYWRfc3RhdGUzMl90IHRzMzI7CisgIH0gdXRzOworfTsKKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChhcm1fc3RhdGVfaGRyX3QgJngpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZmxhdm9yKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguY291bnQpOworfQorCitlbnVtIEFSTVRocmVhZEZsYXZvcnMgeworICBBUk1fVEhSRUFEX1NUQVRFID0gMSwKKyAgQVJNX1ZGUF9TVEFURSA9IDIsCisgIEFSTV9FWENFUFRJT05fU1RBVEUgPSAzLAorICBBUk1fREVCVUdfU1RBVEUgPSA0LAorICBBUk5fVEhSRUFEX1NUQVRFX05PTkUgPSA1LAorICBBUk1fVEhSRUFEX1NUQVRFNjQgPSA2LAorICBBUk1fRVhDRVBUSU9OX1NUQVRFNjQgPSA3Cit9OworCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KGFybV90aHJlYWRfc3RhdGVfdCAmeCkgeworICBzd2FwU3RydWN0KHgudHNoKTsKKyAgaWYgKHgudHNoLmZsYXZvciA9PSBBUk1fVEhSRUFEX1NUQVRFKQorICAgIHN3YXBTdHJ1Y3QoeC51dHMudHMzMik7Cit9CisKK2NvbnN0IHVpbnQzMl90IEFSTV9USFJFQURfU1RBVEVfQ09VTlQgPQorICAgIHNpemVvZihhcm1fdGhyZWFkX3N0YXRlMzJfdCkgLyBzaXplb2YodWludDMyX3QpOworCitjb25zdCB1aW50MzJfdCBBUk1fVEhSRUFEX1NUQVRFNjRfQ09VTlQgPQorICAgIHNpemVvZihhcm1fdGhyZWFkX3N0YXRlNjRfdCkgLyBzaXplb2YodWludDMyX3QpOworCitzdHJ1Y3QgcHBjX3RocmVhZF9zdGF0ZTMyX3QgeworICB1aW50MzJfdCBzcnIwOworICB1aW50MzJfdCBzcnIxOworICB1aW50MzJfdCByMDsKKyAgdWludDMyX3QgcjE7CisgIHVpbnQzMl90IHIyOworICB1aW50MzJfdCByMzsKKyAgdWludDMyX3QgcjQ7CisgIHVpbnQzMl90IHI1OworICB1aW50MzJfdCByNjsKKyAgdWludDMyX3Qgcjc7CisgIHVpbnQzMl90IHI4OworICB1aW50MzJfdCByOTsKKyAgdWludDMyX3QgcjEwOworICB1aW50MzJfdCByMTE7CisgIHVpbnQzMl90IHIxMjsKKyAgdWludDMyX3QgcjEzOworICB1aW50MzJfdCByMTQ7CisgIHVpbnQzMl90IHIxNTsKKyAgdWludDMyX3QgcjE2OworICB1aW50MzJfdCByMTc7CisgIHVpbnQzMl90IHIxODsKKyAgdWludDMyX3QgcjE5OworICB1aW50MzJfdCByMjA7CisgIHVpbnQzMl90IHIyMTsKKyAgdWludDMyX3QgcjIyOworICB1aW50MzJfdCByMjM7CisgIHVpbnQzMl90IHIyNDsKKyAgdWludDMyX3QgcjI1OworICB1aW50MzJfdCByMjY7CisgIHVpbnQzMl90IHIyNzsKKyAgdWludDMyX3QgcjI4OworICB1aW50MzJfdCByMjk7CisgIHVpbnQzMl90IHIzMDsKKyAgdWludDMyX3QgcjMxOworICB1aW50MzJfdCBjdDsKKyAgdWludDMyX3QgeGVyOworICB1aW50MzJfdCBscjsKKyAgdWludDMyX3QgY3RyOworICB1aW50MzJfdCBtcTsKKyAgdWludDMyX3QgdnJzYXZlOworfTsKKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChwcGNfdGhyZWFkX3N0YXRlMzJfdCAmeCkgeworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5zcnIwKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguc3JyMSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIwKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjEpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yMik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnIzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjQpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yNSk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnI2KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjcpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5yOCk7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LnI5KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjEwKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjExKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjEyKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjEzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjE0KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjE1KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjE2KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjE3KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjE4KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjE5KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjIwKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjIxKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjIyKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjIzKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjI0KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjI1KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjI2KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjI3KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjI4KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjI5KTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjMwKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgucjMxKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguY3QpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC54ZXIpOworICBzeXM6OnN3YXBCeXRlT3JkZXIoeC5scik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4LmN0cik7CisgIHN5czo6c3dhcEJ5dGVPcmRlcih4Lm1xKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHgudnJzYXZlKTsKK30KKworc3RydWN0IHBwY19zdGF0ZV9oZHJfdCB7CisgIHVpbnQzMl90IGZsYXZvcjsKKyAgdWludDMyX3QgY291bnQ7Cit9OworCitzdHJ1Y3QgcHBjX3RocmVhZF9zdGF0ZV90IHsKKyAgcHBjX3N0YXRlX2hkcl90IHRzaDsKKyAgdW5pb24geworICAgIHBwY190aHJlYWRfc3RhdGUzMl90IHRzMzI7CisgIH0gdXRzOworfTsKKworaW5saW5lIHZvaWQgc3dhcFN0cnVjdChwcGNfc3RhdGVfaGRyX3QgJngpIHsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguZmxhdm9yKTsKKyAgc3lzOjpzd2FwQnl0ZU9yZGVyKHguY291bnQpOworfQorCitlbnVtIFBQQ1RocmVhZEZsYXZvcnMgeworICBQUENfVEhSRUFEX1NUQVRFID0gMSwKKyAgUFBDX0ZMT0FUX1NUQVRFID0gMiwKKyAgUFBDX0VYQ0VQVElPTl9TVEFURSA9IDMsCisgIFBQQ19WRUNUT1JfU1RBVEUgPSA0LAorICBQUENfVEhSRUFEX1NUQVRFNjQgPSA1LAorICBQUENfRVhDRVBUSU9OX1NUQVRFNjQgPSA2LAorICBQUENfVEhSRUFEX1NUQVRFX05PTkUgPSA3Cit9OworCitpbmxpbmUgdm9pZCBzd2FwU3RydWN0KHBwY190aHJlYWRfc3RhdGVfdCAmeCkgeworICBzd2FwU3RydWN0KHgudHNoKTsKKyAgaWYgKHgudHNoLmZsYXZvciA9PSBQUENfVEhSRUFEX1NUQVRFKQorICAgIHN3YXBTdHJ1Y3QoeC51dHMudHMzMik7Cit9CisKK2NvbnN0IHVpbnQzMl90IFBQQ19USFJFQURfU1RBVEVfQ09VTlQgPQorICAgIHNpemVvZihwcGNfdGhyZWFkX3N0YXRlMzJfdCkgLyBzaXplb2YodWludDMyX3QpOworCisvLyBEZWZpbmUgYSB1bmlvbiBvZiBhbGwgbG9hZCBjb21tYW5kIHN0cnVjdHMKKyNkZWZpbmUgTE9BRF9DT01NQU5EX1NUUlVDVChMQ1N0cnVjdCkgTENTdHJ1Y3QgTENTdHJ1Y3QjI19kYXRhOworCit1bmlvbiBtYWNob19sb2FkX2NvbW1hbmQgeworI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L01hY2hPLmRlZiIKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBNYWNoTworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9NYWdpYy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvTWFnaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWM4MjZlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvTWFnaWMuaApAQCAtMCwwICsxLDc0IEBACisvLz09PS0gbGx2bS9CaW5hcnlGb3JtYXQvTWFnaWMuaCAtIEZpbGUgbWFnaWMgaWRlbnRpZmljYXRpb24gLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQklOQVJZRk9STUFUX01BR0lDX0gKKyNkZWZpbmUgTExWTV9CSU5BUllGT1JNQVRfTUFHSUNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKworI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKworbmFtZXNwYWNlIGxsdm0geworLy8vIGZpbGVfbWFnaWMgLSBBbiAiZW51bSBjbGFzcyIgZW51bWVyYXRpb24gb2YgZmlsZSB0eXBlcyBiYXNlZCBvbiBtYWdpYyAodGhlCisvLy8gZmlyc3QgTiBieXRlcyBvZiB0aGUgZmlsZSkuCitzdHJ1Y3QgZmlsZV9tYWdpYyB7CisgIGVudW0gSW1wbCB7CisgICAgdW5rbm93biA9IDAsICAgICAgIC8vLzwgVW5yZWNvZ25pemVkIGZpbGUKKyAgICBiaXRjb2RlLCAgICAgICAgICAgLy8vPCBCaXRjb2RlIGZpbGUKKyAgICBhcmNoaXZlLCAgICAgICAgICAgLy8vPCBhciBzdHlsZSBhcmNoaXZlIGZpbGUKKyAgICBlbGYsICAgICAgICAgICAgICAgLy8vPCBFTEYgVW5rbm93biB0eXBlCisgICAgZWxmX3JlbG9jYXRhYmxlLCAgIC8vLzwgRUxGIFJlbG9jYXRhYmxlIG9iamVjdCBmaWxlCisgICAgZWxmX2V4ZWN1dGFibGUsICAgIC8vLzwgRUxGIEV4ZWN1dGFibGUgaW1hZ2UKKyAgICBlbGZfc2hhcmVkX29iamVjdCwgLy8vPCBFTEYgZHluYW1pY2FsbHkgbGlua2VkIHNoYXJlZCBsaWIKKyAgICBlbGZfY29yZSwgICAgICAgICAgLy8vPCBFTEYgY29yZSBpbWFnZQorICAgIG1hY2hvX29iamVjdCwgICAgICAvLy88IE1hY2gtTyBPYmplY3QgZmlsZQorICAgIG1hY2hvX2V4ZWN1dGFibGUsICAvLy88IE1hY2gtTyBFeGVjdXRhYmxlCisgICAgbWFjaG9fZml4ZWRfdmlydHVhbF9tZW1vcnlfc2hhcmVkX2xpYiwgICAgLy8vPCBNYWNoLU8gU2hhcmVkIExpYiwgRlZNCisgICAgbWFjaG9fY29yZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBNYWNoLU8gQ29yZSBGaWxlCisgICAgbWFjaG9fcHJlbG9hZF9leGVjdXRhYmxlLCAgICAgICAgICAgICAgICAgLy8vPCBNYWNoLU8gUHJlbG9hZGVkIEV4ZWN1dGFibGUKKyAgICBtYWNob19keW5hbWljYWxseV9saW5rZWRfc2hhcmVkX2xpYiwgICAgICAvLy88IE1hY2gtTyBkeW5saW5rZWQgc2hhcmVkIGxpYgorICAgIG1hY2hvX2R5bmFtaWNfbGlua2VyLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIE1hY2gtTyBkeW5hbWljIGxpbmtlcgorICAgIG1hY2hvX2J1bmRsZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTWFjaC1PIEJ1bmRsZSBmaWxlCisgICAgbWFjaG9fZHluYW1pY2FsbHlfbGlua2VkX3NoYXJlZF9saWJfc3R1YiwgLy8vPCBNYWNoLU8gU2hhcmVkIGxpYiBzdHViCisgICAgbWFjaG9fZHN5bV9jb21wYW5pb24sICAgICAgICAgICAgICAgICAgICAgLy8vPCBNYWNoLU8gZFNZTSBjb21wYW5pb24gZmlsZQorICAgIG1hY2hvX2tleHRfYnVuZGxlLCAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgTWFjaC1PIGtleHQgYnVuZGxlIGZpbGUKKyAgICBtYWNob191bml2ZXJzYWxfYmluYXJ5LCAgICAgICAgICAgICAgICAgICAvLy88IE1hY2gtTyB1bml2ZXJzYWwgYmluYXJ5CisgICAgY29mZl9jbF9nbF9vYmplY3QsICAgLy8vPCBNaWNyb3NvZnQgY2wuZXhlJ3MgaW50ZXJtZWRpYXRlIGNvZGUgZmlsZQorICAgIGNvZmZfb2JqZWN0LCAgICAgICAgIC8vLzwgQ09GRiBvYmplY3QgZmlsZQorICAgIGNvZmZfaW1wb3J0X2xpYnJhcnksIC8vLzwgQ09GRiBpbXBvcnQgbGlicmFyeQorICAgIHBlY29mZl9leGVjdXRhYmxlLCAgIC8vLzwgUEVDT0ZGIGV4ZWN1dGFibGUgZmlsZQorICAgIHdpbmRvd3NfcmVzb3VyY2UsICAgIC8vLzwgV2luZG93cyBjb21waWxlZCByZXNvdXJjZSBmaWxlICgucmVzKQorICAgIHdhc21fb2JqZWN0LCAgICAgICAgIC8vLzwgV2ViQXNzZW1ibHkgT2JqZWN0IGZpbGUKKyAgICBwZGIsICAgICAgICAgICAgICAgICAvLy88IFdpbmRvd3MgUERCIGRlYnVnIGluZm8gZmlsZQorICB9OworCisgIGJvb2wgaXNfb2JqZWN0KCkgY29uc3QgeyByZXR1cm4gViAhPSB1bmtub3duOyB9CisKKyAgZmlsZV9tYWdpYygpID0gZGVmYXVsdDsKKyAgZmlsZV9tYWdpYyhJbXBsIFYpIDogVihWKSB7fQorICBvcGVyYXRvciBJbXBsKCkgY29uc3QgeyByZXR1cm4gVjsgfQorCitwcml2YXRlOgorICBJbXBsIFYgPSB1bmtub3duOworfTsKKworLy8vIEBicmllZiBJZGVudGlmeSB0aGUgdHlwZSBvZiBhIGJpbmFyeSBmaWxlIGJhc2VkIG9uIGhvdyBtYWdpY2FsIGl0IGlzLgorZmlsZV9tYWdpYyBpZGVudGlmeV9tYWdpYyhTdHJpbmdSZWYgbWFnaWMpOworCisvLy8gQGJyaWVmIEdldCBhbmQgaWRlbnRpZnkgXGEgcGF0aCdzIHR5cGUgYmFzZWQgb24gaXRzIGNvbnRlbnQuCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEBwYXJhbSByZXN1bHQgU2V0IHRvIHRoZSB0eXBlIG9mIGZpbGUsIG9yIGZpbGVfbWFnaWM6OnVua25vd24uCisvLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiByZXN1bHQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNldCwgb3RoZXJ3aXNlIGEKKy8vLyAgICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvcl9jb2RlLgorc3RkOjplcnJvcl9jb2RlIGlkZW50aWZ5X21hZ2ljKGNvbnN0IFR3aW5lICZwYXRoLCBmaWxlX21hZ2ljICZyZXN1bHQpOworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L1dhc20uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQmluYXJ5Rm9ybWF0L1dhc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWIyMTdmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvV2FzbS5oCkBAIC0wLDAgKzEsMjkwIEBACisvLz09PS0gV2FzbS5oIC0gV2FzbSBvYmplY3QgZmlsZSBmb3JtYXQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIG1hbmlmZXN0IGNvbnN0YW50cyBmb3IgdGhlIHdhc20gb2JqZWN0IGZpbGUgZm9ybWF0LgorLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vV2ViQXNzZW1ibHkvZGVzaWduL2Jsb2IvbWFzdGVyL0JpbmFyeUVuY29kaW5nLm1kCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0JJTkFSWUZPUk1BVF9XQVNNX0gKKyNkZWZpbmUgTExWTV9CSU5BUllGT1JNQVRfV0FTTV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugd2FzbSB7CisKKy8vIE9iamVjdCBmaWxlIG1hZ2ljIHN0cmluZy4KK2NvbnN0IGNoYXIgV2FzbU1hZ2ljW10gPSB7J1wwJywgJ2EnLCAncycsICdtJ307CisvLyBXYXNtIGJpbmFyeSBmb3JtYXQgdmVyc2lvbgorY29uc3QgdWludDMyX3QgV2FzbVZlcnNpb24gPSAweDE7CisvLyBXYXNtIHVzZXMgYSA2NGsgcGFnZSBzaXplCitjb25zdCB1aW50MzJfdCBXYXNtUGFnZVNpemUgPSA2NTUzNjsKKworc3RydWN0IFdhc21PYmplY3RIZWFkZXIgeworICBTdHJpbmdSZWYgTWFnaWM7CisgIHVpbnQzMl90IFZlcnNpb247Cit9OworCitzdHJ1Y3QgV2FzbVNpZ25hdHVyZSB7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFBhcmFtVHlwZXM7CisgIHVpbnQ4X3QgUmV0dXJuVHlwZTsKK307CisKK3N0cnVjdCBXYXNtRXhwb3J0IHsKKyAgU3RyaW5nUmVmIE5hbWU7CisgIHVpbnQ4X3QgS2luZDsKKyAgdWludDMyX3QgSW5kZXg7Cit9OworCitzdHJ1Y3QgV2FzbUxpbWl0cyB7CisgIHVpbnQ4X3QgRmxhZ3M7CisgIHVpbnQzMl90IEluaXRpYWw7CisgIHVpbnQzMl90IE1heGltdW07Cit9OworCitzdHJ1Y3QgV2FzbVRhYmxlIHsKKyAgdWludDhfdCBFbGVtVHlwZTsKKyAgV2FzbUxpbWl0cyBMaW1pdHM7Cit9OworCitzdHJ1Y3QgV2FzbUluaXRFeHByIHsKKyAgdWludDhfdCBPcGNvZGU7CisgIHVuaW9uIHsKKyAgICBpbnQzMl90IEludDMyOworICAgIGludDY0X3QgSW50NjQ7CisgICAgaW50MzJfdCBGbG9hdDMyOworICAgIGludDY0X3QgRmxvYXQ2NDsKKyAgICB1aW50MzJfdCBHbG9iYWw7CisgIH0gVmFsdWU7Cit9OworCitzdHJ1Y3QgV2FzbUdsb2JhbFR5cGUgeworICB1aW50OF90IFR5cGU7CisgIGJvb2wgTXV0YWJsZTsKK307CisKK3N0cnVjdCBXYXNtR2xvYmFsIHsKKyAgdWludDMyX3QgSW5kZXg7CisgIFdhc21HbG9iYWxUeXBlIFR5cGU7CisgIFdhc21Jbml0RXhwciBJbml0RXhwcjsKKyAgU3RyaW5nUmVmIE5hbWU7IC8vIGZyb20gdGhlICJsaW5raW5nIiBvciAibmFtZXMiIHNlY3Rpb24KK307CisKK3N0cnVjdCBXYXNtSW1wb3J0IHsKKyAgU3RyaW5nUmVmIE1vZHVsZTsKKyAgU3RyaW5nUmVmIEZpZWxkOworICB1aW50OF90IEtpbmQ7CisgIHVuaW9uIHsKKyAgICB1aW50MzJfdCBTaWdJbmRleDsKKyAgICBXYXNtR2xvYmFsVHlwZSBHbG9iYWw7CisgICAgV2FzbVRhYmxlIFRhYmxlOworICAgIFdhc21MaW1pdHMgTWVtb3J5OworICB9OworfTsKKworc3RydWN0IFdhc21Mb2NhbERlY2wgeworICB1aW50OF90IFR5cGU7CisgIHVpbnQzMl90IENvdW50OworfTsKKworc3RydWN0IFdhc21GdW5jdGlvbiB7CisgIHVpbnQzMl90IEluZGV4OworICBzdGQ6OnZlY3RvcjxXYXNtTG9jYWxEZWNsPiBMb2NhbHM7CisgIEFycmF5UmVmPHVpbnQ4X3Q+IEJvZHk7CisgIHVpbnQzMl90IENvZGVTZWN0aW9uT2Zmc2V0OworICB1aW50MzJfdCBTaXplOworICBTdHJpbmdSZWYgTmFtZTsgLy8gZnJvbSB0aGUgImxpbmtpbmciIG9yICJuYW1lcyIgc2VjdGlvbgorICB1aW50MzJfdCBDb21kYXQ7IC8vIGZyb20gdGhlICJjb21kYXQgaW5mbyIgc2VjdGlvbgorfTsKKworc3RydWN0IFdhc21EYXRhU2VnbWVudCB7CisgIHVpbnQzMl90IE1lbW9yeUluZGV4OworICBXYXNtSW5pdEV4cHIgT2Zmc2V0OworICBBcnJheVJlZjx1aW50OF90PiBDb250ZW50OworICBTdHJpbmdSZWYgTmFtZTsKKyAgdWludDMyX3QgQWxpZ25tZW50OworICB1aW50MzJfdCBGbGFnczsKKyAgdWludDMyX3QgQ29tZGF0OyAvLyBmcm9tIHRoZSAiY29tZGF0IGluZm8iIHNlY3Rpb24KK307CisKK3N0cnVjdCBXYXNtRWxlbVNlZ21lbnQgeworICB1aW50MzJfdCBUYWJsZUluZGV4OworICBXYXNtSW5pdEV4cHIgT2Zmc2V0OworICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gRnVuY3Rpb25zOworfTsKKworLy8gUmVwcmVzZW50cyB0aGUgbG9jYXRpb24gb2YgYSBXYXNtIGRhdGEgc3ltYm9sIHdpdGhpbiBhIFdhc21EYXRhU2VnbWVudCwgYXMKKy8vIHRoZSBpbmRleCBvZiB0aGUgc2VnbWVudCwgYW5kIHRoZSBvZmZzZXQgYW5kIHNpemUgd2l0aGluIHRoZSBzZWdtZW50Lgorc3RydWN0IFdhc21EYXRhUmVmZXJlbmNlIHsKKyAgdWludDMyX3QgU2VnbWVudDsKKyAgdWludDMyX3QgT2Zmc2V0OworICB1aW50MzJfdCBTaXplOworfTsKKworc3RydWN0IFdhc21SZWxvY2F0aW9uIHsKKyAgdWludDhfdCBUeXBlOyAgICAvLyBUaGUgdHlwZSBvZiB0aGUgcmVsb2NhdGlvbi4KKyAgdWludDMyX3QgSW5kZXg7ICAvLyBJbmRleCBpbnRvIGVpdGhlciBzeW1ib2wgb3IgdHlwZSBpbmRleCBzcGFjZS4KKyAgdWludDY0X3QgT2Zmc2V0OyAvLyBPZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHNlY3Rpb24uCisgIGludDY0X3QgQWRkZW5kOyAgLy8gQSB2YWx1ZSB0byBhZGQgdG8gdGhlIHN5bWJvbC4KK307CisKK3N0cnVjdCBXYXNtSW5pdEZ1bmMgeworICB1aW50MzJfdCBQcmlvcml0eTsKKyAgdWludDMyX3QgU3ltYm9sOworfTsKKworc3RydWN0IFdhc21TeW1ib2xJbmZvIHsKKyAgU3RyaW5nUmVmIE5hbWU7CisgIHVpbnQ4X3QgS2luZDsKKyAgdWludDMyX3QgRmxhZ3M7CisgIHVuaW9uIHsKKyAgICAvLyBGb3IgZnVuY3Rpb24gb3IgZ2xvYmFsIHN5bWJvbHMsIHRoZSBpbmRleCBpbiBmdW5jdGlvbiBvZiBnbG9iYWwgaW5kZXgKKyAgICAvLyBzcGFjZS4KKyAgICB1aW50MzJfdCBFbGVtZW50SW5kZXg7CisgICAgLy8gRm9yIGEgZGF0YSBzeW1ib2xzLCB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YSByZWxhdGl2ZSB0byBzZWdtZW50LgorICAgIFdhc21EYXRhUmVmZXJlbmNlIERhdGFSZWY7CisgIH07Cit9OworCitzdHJ1Y3QgV2FzbUZ1bmN0aW9uTmFtZSB7CisgIHVpbnQzMl90IEluZGV4OworICBTdHJpbmdSZWYgTmFtZTsKK307CisKK3N0cnVjdCBXYXNtTGlua2luZ0RhdGEgeworICBzdGQ6OnZlY3RvcjxXYXNtSW5pdEZ1bmM+IEluaXRGdW5jdGlvbnM7CisgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gQ29tZGF0czsKKyAgc3RkOjp2ZWN0b3I8V2FzbVN5bWJvbEluZm8+IFN5bWJvbFRhYmxlOworfTsKKworZW51bSA6IHVuc2lnbmVkIHsKKyAgV0FTTV9TRUNfQ1VTVE9NID0gMCwgICAvLyBDdXN0b20gLyBVc2VyLWRlZmluZWQgc2VjdGlvbgorICBXQVNNX1NFQ19UWVBFID0gMSwgICAgIC8vIEZ1bmN0aW9uIHNpZ25hdHVyZSBkZWNsYXJhdGlvbnMKKyAgV0FTTV9TRUNfSU1QT1JUID0gMiwgICAvLyBJbXBvcnQgZGVjbGFyYXRpb25zCisgIFdBU01fU0VDX0ZVTkNUSU9OID0gMywgLy8gRnVuY3Rpb24gZGVjbGFyYXRpb25zCisgIFdBU01fU0VDX1RBQkxFID0gNCwgICAgLy8gSW5kaXJlY3QgZnVuY3Rpb24gdGFibGUgYW5kIG90aGVyIHRhYmxlcworICBXQVNNX1NFQ19NRU1PUlkgPSA1LCAgIC8vIE1lbW9yeSBhdHRyaWJ1dGVzCisgIFdBU01fU0VDX0dMT0JBTCA9IDYsICAgLy8gR2xvYmFsIGRlY2xhcmF0aW9ucworICBXQVNNX1NFQ19FWFBPUlQgPSA3LCAgIC8vIEV4cG9ydHMKKyAgV0FTTV9TRUNfU1RBUlQgPSA4LCAgICAvLyBTdGFydCBmdW5jdGlvbiBkZWNsYXJhdGlvbgorICBXQVNNX1NFQ19FTEVNID0gOSwgICAgIC8vIEVsZW1lbnRzIHNlY3Rpb24KKyAgV0FTTV9TRUNfQ09ERSA9IDEwLCAgICAvLyBGdW5jdGlvbiBib2RpZXMgKGNvZGUpCisgIFdBU01fU0VDX0RBVEEgPSAxMSAgICAgLy8gRGF0YSBzZWdtZW50cworfTsKKworLy8gVHlwZSBpbW1lZGlhdGUgZW5jb2RpbmdzIHVzZWQgaW4gdmFyaW91cyBjb250ZXh0cy4KK2VudW0gOiB1bnNpZ25lZCB7CisgIFdBU01fVFlQRV9JMzIgPSAweDdGLAorICBXQVNNX1RZUEVfSTY0ID0gMHg3RSwKKyAgV0FTTV9UWVBFX0YzMiA9IDB4N0QsCisgIFdBU01fVFlQRV9GNjQgPSAweDdDLAorICBXQVNNX1RZUEVfQU5ZRlVOQyA9IDB4NzAsCisgIFdBU01fVFlQRV9FWENFUFRfUkVGID0gMHg2OCwKKyAgV0FTTV9UWVBFX0ZVTkMgPSAweDYwLAorICBXQVNNX1RZUEVfTk9SRVNVTFQgPSAweDQwLCAvLyBmb3IgYmxvY2tzIHdpdGggbm8gcmVzdWx0IHZhbHVlcworfTsKKworLy8gS2luZHMgb2YgZXh0ZXJuYWxzIChmb3IgaW1wb3J0cyBhbmQgZXhwb3J0cykuCitlbnVtIDogdW5zaWduZWQgeworICBXQVNNX0VYVEVSTkFMX0ZVTkNUSU9OID0gMHgwLAorICBXQVNNX0VYVEVSTkFMX1RBQkxFID0gMHgxLAorICBXQVNNX0VYVEVSTkFMX01FTU9SWSA9IDB4MiwKKyAgV0FTTV9FWFRFUk5BTF9HTE9CQUwgPSAweDMsCit9OworCisvLyBPcGNvZGVzIHVzZWQgaW4gaW5pdGlhbGl6ZXIgZXhwcmVzc2lvbnMuCitlbnVtIDogdW5zaWduZWQgeworICBXQVNNX09QQ09ERV9FTkQgPSAweDBiLAorICBXQVNNX09QQ09ERV9HRVRfR0xPQkFMID0gMHgyMywKKyAgV0FTTV9PUENPREVfSTMyX0NPTlNUID0gMHg0MSwKKyAgV0FTTV9PUENPREVfSTY0X0NPTlNUID0gMHg0MiwKKyAgV0FTTV9PUENPREVfRjMyX0NPTlNUID0gMHg0MywKKyAgV0FTTV9PUENPREVfRjY0X0NPTlNUID0gMHg0NCwKK307CisKK2VudW0gOiB1bnNpZ25lZCB7CisgIFdBU01fTElNSVRTX0ZMQUdfSEFTX01BWCA9IDB4MSwKK307CisKKy8vIFN1YnNldCBvZiB0eXBlcyB0aGF0IGEgdmFsdWUgY2FuIGhhdmUKK2VudW0gY2xhc3MgVmFsVHlwZSB7CisgIEkzMiA9IFdBU01fVFlQRV9JMzIsCisgIEk2NCA9IFdBU01fVFlQRV9JNjQsCisgIEYzMiA9IFdBU01fVFlQRV9GMzIsCisgIEY2NCA9IFdBU01fVFlQRV9GNjQsCisgIEVYQ0VQVF9SRUYgPSBXQVNNX1RZUEVfRVhDRVBUX1JFRiwKK307CisKKy8vIEtpbmQgY29kZXMgdXNlZCBpbiB0aGUgY3VzdG9tICJuYW1lIiBzZWN0aW9uCitlbnVtIDogdW5zaWduZWQgeworICBXQVNNX05BTUVTX0ZVTkNUSU9OID0gMHgxLAorICBXQVNNX05BTUVTX0xPQ0FMICAgID0gMHgyLAorfTsKKworLy8gS2luZCBjb2RlcyB1c2VkIGluIHRoZSBjdXN0b20gImxpbmtpbmciIHNlY3Rpb24KK2VudW0gOiB1bnNpZ25lZCB7CisgIFdBU01fU0VHTUVOVF9JTkZPICAgPSAweDUsCisgIFdBU01fSU5JVF9GVU5DUyAgICAgPSAweDYsCisgIFdBU01fQ09NREFUX0lORk8gICAgPSAweDcsCisgIFdBU01fU1lNQk9MX1RBQkxFICAgPSAweDgsCit9OworCisvLyBLaW5kIGNvZGVzIHVzZWQgaW4gdGhlIGN1c3RvbSAibGlua2luZyIgc2VjdGlvbiBpbiB0aGUgV0FTTV9DT01EQVRfSU5GTworZW51bSA6IHVuc2lnbmVkIHsKKyAgV0FTTV9DT01EQVRfREFUQSAgICAgICAgPSAweDAsCisgIFdBU01fQ09NREFUX0ZVTkNUSU9OICAgID0gMHgxLAorfTsKKworLy8gS2luZCBjb2RlcyB1c2VkIGluIHRoZSBjdXN0b20gImxpbmtpbmciIHNlY3Rpb24gaW4gdGhlIFdBU01fU1lNQk9MX1RBQkxFCitlbnVtIFdhc21TeW1ib2xUeXBlIDogdW5zaWduZWQgeworICBXQVNNX1NZTUJPTF9UWVBFX0ZVTkNUSU9OID0gMHgwLAorICBXQVNNX1NZTUJPTF9UWVBFX0RBVEEgICAgID0gMHgxLAorICBXQVNNX1NZTUJPTF9UWVBFX0dMT0JBTCAgID0gMHgyLAorfTsKKworY29uc3QgdW5zaWduZWQgV0FTTV9TWU1CT0xfQklORElOR19NQVNLICAgICAgID0gMHgzOworY29uc3QgdW5zaWduZWQgV0FTTV9TWU1CT0xfVklTSUJJTElUWV9NQVNLICAgID0gMHhjOworCitjb25zdCB1bnNpZ25lZCBXQVNNX1NZTUJPTF9CSU5ESU5HX0dMT0JBTCAgICAgPSAweDA7Citjb25zdCB1bnNpZ25lZCBXQVNNX1NZTUJPTF9CSU5ESU5HX1dFQUsgICAgICAgPSAweDE7Citjb25zdCB1bnNpZ25lZCBXQVNNX1NZTUJPTF9CSU5ESU5HX0xPQ0FMICAgICAgPSAweDI7Citjb25zdCB1bnNpZ25lZCBXQVNNX1NZTUJPTF9WSVNJQklMSVRZX0RFRkFVTFQgPSAweDA7Citjb25zdCB1bnNpZ25lZCBXQVNNX1NZTUJPTF9WSVNJQklMSVRZX0hJRERFTiAgPSAweDQ7Citjb25zdCB1bnNpZ25lZCBXQVNNX1NZTUJPTF9VTkRFRklORUQgICAgICAgICAgPSAweDEwOworCisjZGVmaW5lIFdBU01fUkVMT0MobmFtZSwgdmFsdWUpIG5hbWUgPSB2YWx1ZSwKKworZW51bSA6IHVuc2lnbmVkIHsKKyNpbmNsdWRlICJXYXNtUmVsb2NzLmRlZiIKK307CisKKyN1bmRlZiBXQVNNX1JFTE9DCisKKy8vIFVzZWZ1bCBjb21wYXJpc29uIG9wZXJhdG9ycworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBXYXNtU2lnbmF0dXJlICZMSFMsIGNvbnN0IFdhc21TaWduYXR1cmUgJlJIUykgeworICByZXR1cm4gTEhTLlJldHVyblR5cGUgPT0gUkhTLlJldHVyblR5cGUgJiYgTEhTLlBhcmFtVHlwZXMgPT0gUkhTLlBhcmFtVHlwZXM7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgV2FzbVNpZ25hdHVyZSAmTEhTLCBjb25zdCBXYXNtU2lnbmF0dXJlICZSSFMpIHsKKyAgcmV0dXJuICEoTEhTID09IFJIUyk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgV2FzbUdsb2JhbFR5cGUgJkxIUywgY29uc3QgV2FzbUdsb2JhbFR5cGUgJlJIUykgeworICByZXR1cm4gTEhTLlR5cGUgPT0gUkhTLlR5cGUgJiYgTEhTLk11dGFibGUgPT0gUkhTLk11dGFibGU7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgV2FzbUdsb2JhbFR5cGUgJkxIUywgY29uc3QgV2FzbUdsb2JhbFR5cGUgJlJIUykgeworICByZXR1cm4gIShMSFMgPT0gUkhTKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIHdhc20KK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvV2FzbVJlbG9jcy5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpbmFyeUZvcm1hdC9XYXNtUmVsb2NzLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNmYwZTQyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaW5hcnlGb3JtYXQvV2FzbVJlbG9jcy5kZWYKQEAgLTAsMCArMSwxMyBAQAorCisjaWZuZGVmIFdBU01fUkVMT0MKKyNlcnJvciAiV0FTTV9SRUxPQyBtdXN0IGJlIGRlZmluZWQiCisjZW5kaWYKKworV0FTTV9SRUxPQyhSX1dFQkFTU0VNQkxZX0ZVTkNUSU9OX0lOREVYX0xFQiwgICAwKQorV0FTTV9SRUxPQyhSX1dFQkFTU0VNQkxZX1RBQkxFX0lOREVYX1NMRUIsICAgICAxKQorV0FTTV9SRUxPQyhSX1dFQkFTU0VNQkxZX1RBQkxFX0lOREVYX0kzMiwgICAgICAyKQorV0FTTV9SRUxPQyhSX1dFQkFTU0VNQkxZX01FTU9SWV9BRERSX0xFQiwgICAgICAzKQorV0FTTV9SRUxPQyhSX1dFQkFTU0VNQkxZX01FTU9SWV9BRERSX1NMRUIsICAgICA0KQorV0FTTV9SRUxPQyhSX1dFQkFTU0VNQkxZX01FTU9SWV9BRERSX0kzMiwgICAgICA1KQorV0FTTV9SRUxPQyhSX1dFQkFTU0VNQkxZX1RZUEVfSU5ERVhfTEVCLCAgICAgICA2KQorV0FTTV9SRUxPQyhSX1dFQkFTU0VNQkxZX0dMT0JBTF9JTkRFWF9MRUIsICAgICA3KQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0JpdENvZGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpdGNvZGUvQml0Q29kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjIxZTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0JpdENvZGVzLmgKQEAgLTAsMCArMSwxODUgQEAKKy8vPT09LSBCaXRDb2Rlcy5oIC0gRW51bSB2YWx1ZXMgZm9yIHRoZSBiaXRjb2RlIGZvcm1hdCAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgQml0Y29kZSBlbnVtIHZhbHVlcy4KKy8vCisvLyBUaGUgZW51bSB2YWx1ZXMgZGVmaW5lZCBpbiB0aGlzIGZpbGUgc2hvdWxkIGJlIGNvbnNpZGVyZWQgcGVybWFuZW50LiAgSWYKKy8vIG5ldyBmZWF0dXJlcyBhcmUgYWRkZWQsIHRoZXkgc2hvdWxkIGhhdmUgdmFsdWVzIGFkZGVkIGF0IHRoZSBlbmQgb2YgdGhlCisvLyByZXNwZWN0aXZlIGxpc3RzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9CSVRDT0RFX0JJVENPREVTX0gKKyNkZWZpbmUgTExWTV9CSVRDT0RFX0JJVENPREVTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworLy8vIE9mZnNldHMgb2YgdGhlIDMyLWJpdCBmaWVsZHMgb2YgYml0Y29kZSB3cmFwcGVyIGhlYWRlci4KK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBCV0hfTWFnaWNGaWVsZCA9IDAgKiA0Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIEJXSF9WZXJzaW9uRmllbGQgPSAxICogNDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBCV0hfT2Zmc2V0RmllbGQgPSAyICogNDsKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBCV0hfU2l6ZUZpZWxkID0gMyAqIDQ7CitzdGF0aWMgY29uc3QgdW5zaWduZWQgQldIX0NQVVR5cGVGaWVsZCA9IDQgKiA0Oworc3RhdGljIGNvbnN0IHVuc2lnbmVkIEJXSF9IZWFkZXJTaXplID0gNSAqIDQ7CisKK25hbWVzcGFjZSBiaXRjIHsKKyAgZW51bSBTdGFuZGFyZFdpZHRocyB7CisgICAgQmxvY2tJRFdpZHRoICAgPSA4LCAgLy8gV2UgdXNlIFZCUi04IGZvciBibG9jayBJRHMuCisgICAgQ29kZUxlbldpZHRoICAgPSA0LCAgLy8gQ29kZWxlbiBhcmUgVkJSLTQuCisgICAgQmxvY2tTaXplV2lkdGggPSAzMiAgLy8gQmxvY2tTaXplIHVwIHRvIDJeMzIgMzItYml0IHdvcmRzID0gMTZHQiBwZXIgYmxvY2suCisgIH07CisKKyAgLy8gVGhlIHN0YW5kYXJkIGFiYnJldiBuYW1lc3BhY2UgYWx3YXlzIGhhcyBhIHdheSB0byBleGl0IGEgYmxvY2ssIGVudGVyIGEKKyAgLy8gbmVzdGVkIGJsb2NrLCBkZWZpbmUgYWJicmV2cywgYW5kIGRlZmluZSBhbiB1bmFiYnJldmlhdGVkIHJlY29yZC4KKyAgZW51bSBGaXhlZEFiYnJldklEcyB7CisgICAgRU5EX0JMT0NLID0gMCwgIC8vIE11c3QgYmUgemVybyB0byBndWFyYW50ZWUgdGVybWluYXRpb24gZm9yIGJyb2tlbiBiaXRjb2RlLgorICAgIEVOVEVSX1NVQkJMT0NLID0gMSwKKworICAgIC8vLyBERUZJTkVfQUJCUkVWIC0gRGVmaW5lcyBhbiBhYmJyZXYgZm9yIHRoZSBjdXJyZW50IGJsb2NrLiAgSXQgY29uc2lzdHMKKyAgICAvLy8gb2YgYSB2YnI1IGZvciAjIG9wZXJhbmQgaW5mb3MuICBFYWNoIG9wZXJhbmQgaW5mbyBpcyBlbWl0dGVkIHdpdGggYQorICAgIC8vLyBzaW5nbGUgYml0IHRvIGluZGljYXRlIGlmIGl0IGlzIGEgbGl0ZXJhbCBlbmNvZGluZy4gIElmIHNvLCB0aGUgdmFsdWUgaXMKKyAgICAvLy8gZW1pdHRlZCB3aXRoIGEgdmJyOC4gIElmIG5vdCwgdGhlIGVuY29kaW5nIGlzIGVtaXR0ZWQgYXMgMyBiaXRzIGZvbGxvd2VkCisgICAgLy8vIGJ5IHRoZSBpbmZvIHZhbHVlIGFzIGEgdmJyNSBpZiBuZWVkZWQuCisgICAgREVGSU5FX0FCQlJFViA9IDIsCisKKyAgICAvLyBVTkFCQlJFVl9SRUNPUkRzIGFyZSBlbWl0dGVkIHdpdGggYSB2YnI2IGZvciB0aGUgcmVjb3JkIGNvZGUsIGZvbGxvd2VkIGJ5CisgICAgLy8gYSB2YnI2IGZvciB0aGUgIyBvcGVyYW5kcywgZm9sbG93ZWQgYnkgdmJyNidzIGZvciBlYWNoIG9wZXJhbmQuCisgICAgVU5BQkJSRVZfUkVDT1JEID0gMywKKworICAgIC8vIFRoaXMgaXMgbm90IGEgY29kZSwgdGhpcyBpcyBhIG1hcmtlciBmb3IgdGhlIGZpcnN0IGFiYnJldiBhc3NpZ25tZW50LgorICAgIEZJUlNUX0FQUExJQ0FUSU9OX0FCQlJFViA9IDQKKyAgfTsKKworICAvLy8gU3RhbmRhcmRCbG9ja0lEcyAtIEFsbCBiaXRjb2RlIGZpbGVzIGNhbiBvcHRpb25hbGx5IGluY2x1ZGUgYSBCTE9DS0lORk8KKyAgLy8vIGJsb2NrLCB3aGljaCBjb250YWlucyBtZXRhZGF0YSBhYm91dCBvdGhlciBibG9ja3MgaW4gdGhlIGZpbGUuCisgIGVudW0gU3RhbmRhcmRCbG9ja0lEcyB7CisgICAgLy8vIEJMT0NLSU5GT19CTE9DSyBpcyB1c2VkIHRvIGRlZmluZSBtZXRhZGF0YSBhYm91dCBibG9ja3MsIGZvciBleGFtcGxlLAorICAgIC8vLyBzdGFuZGFyZCBhYmJyZXZzIHRoYXQgc2hvdWxkIGJlIGF2YWlsYWJsZSB0byBhbGwgYmxvY2tzIG9mIGEgc3BlY2lmaWVkCisgICAgLy8vIElELgorICAgIEJMT0NLSU5GT19CTE9DS19JRCA9IDAsCisKKyAgICAvLyBCbG9jayBJRHMgMS03IGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIGV4cGFuc2lvbi4KKyAgICBGSVJTVF9BUFBMSUNBVElPTl9CTE9DS0lEID0gOAorICB9OworCisgIC8vLyBCbG9ja0luZm9Db2RlcyAtIFRoZSBibG9ja2luZm8gYmxvY2sgY29udGFpbnMgbWV0YWRhdGEgYWJvdXQgdXNlci1kZWZpbmVkCisgIC8vLyBibG9ja3MuCisgIGVudW0gQmxvY2tJbmZvQ29kZXMgeworICAgIC8vIERFRklORV9BQkJSRVYgaGFzIG1hZ2ljIHNlbWFudGljcyBoZXJlLCBhcHBseWluZyB0byB0aGUgY3VycmVudCBTRVRCSUQnZAorICAgIC8vIGJsb2NrLCBpbnN0ZWFkIG9mIHRoZSBCbG9ja0luZm8gYmxvY2suCisKKyAgICBCTE9DS0lORk9fQ09ERV9TRVRCSUQgICAgICAgID0gMSwgLy8gU0VUQklEOiBbYmxvY2tpZCNdCisgICAgQkxPQ0tJTkZPX0NPREVfQkxPQ0tOQU1FICAgICA9IDIsIC8vIEJMT0NLTkFNRTogW25hbWVdCisgICAgQkxPQ0tJTkZPX0NPREVfU0VUUkVDT1JETkFNRSA9IDMgIC8vIEJMT0NLSU5GT19DT0RFX1NFVFJFQ09SRE5BTUU6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbaWQsIG5hbWVdCisgIH07CisKK30gLy8gRW5kIGJpdGMgbmFtZXNwYWNlCisKKy8vLyBCaXRDb2RlQWJicmV2T3AgLSBUaGlzIGRlc2NyaWJlcyBvbmUgb3IgbW9yZSBvcGVyYW5kcyBpbiBhbiBhYmJyZXZpYXRpb24uCisvLy8gVGhpcyBpcyBhY3R1YWxseSBhIHVuaW9uIG9mIHR3byBkaWZmZXJlbnQgdGhpbmdzOgorLy8vICAgMS4gSXQgY291bGQgYmUgYSBsaXRlcmFsIGludGVnZXIgdmFsdWUgKCJ0aGUgb3BlcmFuZCBpcyBhbHdheXMgMTciKS4KKy8vLyAgIDIuIEl0IGNvdWxkIGJlIGFuIGVuY29kaW5nIHNwZWNpZmljYXRpb24gKCJ0aGlzIG9wZXJhbmQgZW5jb2RlZCBsaWtlIHNvIikuCisvLy8KK2NsYXNzIEJpdENvZGVBYmJyZXZPcCB7CisgIHVpbnQ2NF90IFZhbDsgICAgICAgICAgIC8vIEEgbGl0ZXJhbCB2YWx1ZSBvciBkYXRhIGZvciBhbiBlbmNvZGluZy4KKyAgYm9vbCBJc0xpdGVyYWwgOiAxOyAgICAgLy8gSW5kaWNhdGUgd2hldGhlciB0aGlzIGlzIGEgbGl0ZXJhbCB2YWx1ZSBvciBub3QuCisgIHVuc2lnbmVkIEVuYyAgIDogMzsgICAgIC8vIFRoZSBlbmNvZGluZyB0byB1c2UuCitwdWJsaWM6CisgIGVudW0gRW5jb2RpbmcgeworICAgIEZpeGVkID0gMSwgIC8vIEEgZml4ZWQgd2lkdGggZmllbGQsIFZhbCBzcGVjaWZpZXMgbnVtYmVyIG9mIGJpdHMuCisgICAgVkJSICAgPSAyLCAgLy8gQSBWQlIgZmllbGQgd2hlcmUgVmFsIHNwZWNpZmllcyB0aGUgd2lkdGggb2YgZWFjaCBjaHVuay4KKyAgICBBcnJheSA9IDMsICAvLyBBIHNlcXVlbmNlIG9mIGZpZWxkcywgbmV4dCBmaWVsZCBzcGVjaWVzIGVsdCBlbmNvZGluZy4KKyAgICBDaGFyNiA9IDQsICAvLyBBIDYtYml0IGZpeGVkIGZpZWxkIHdoaWNoIG1hcHMgdG8gW2EtekEtWjAtOS5fXS4KKyAgICBCbG9iICA9IDUgICAvLyAzMi1iaXQgYWxpZ25lZCBhcnJheSBvZiA4LWJpdCBjaGFyYWN0ZXJzLgorICB9OworCisgIGV4cGxpY2l0IEJpdENvZGVBYmJyZXZPcCh1aW50NjRfdCBWKSA6ICBWYWwoViksIElzTGl0ZXJhbCh0cnVlKSB7fQorICBleHBsaWNpdCBCaXRDb2RlQWJicmV2T3AoRW5jb2RpbmcgRSwgdWludDY0X3QgRGF0YSA9IDApCisgICAgOiBWYWwoRGF0YSksIElzTGl0ZXJhbChmYWxzZSksIEVuYyhFKSB7fQorCisgIGJvb2wgaXNMaXRlcmFsKCkgY29uc3QgIHsgcmV0dXJuIElzTGl0ZXJhbDsgfQorICBib29sIGlzRW5jb2RpbmcoKSBjb25zdCB7IHJldHVybiAhSXNMaXRlcmFsOyB9CisKKyAgLy8gQWNjZXNzb3JzIGZvciBsaXRlcmFscy4KKyAgdWludDY0X3QgZ2V0TGl0ZXJhbFZhbHVlKCkgY29uc3QgeyBhc3NlcnQoaXNMaXRlcmFsKCkpOyByZXR1cm4gVmFsOyB9CisKKyAgLy8gQWNjZXNzb3JzIGZvciBlbmNvZGluZyBpbmZvLgorICBFbmNvZGluZyBnZXRFbmNvZGluZygpIGNvbnN0IHsgYXNzZXJ0KGlzRW5jb2RpbmcoKSk7IHJldHVybiAoRW5jb2RpbmcpRW5jOyB9CisgIHVpbnQ2NF90IGdldEVuY29kaW5nRGF0YSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNFbmNvZGluZygpICYmIGhhc0VuY29kaW5nRGF0YSgpKTsKKyAgICByZXR1cm4gVmFsOworICB9CisKKyAgYm9vbCBoYXNFbmNvZGluZ0RhdGEoKSBjb25zdCB7IHJldHVybiBoYXNFbmNvZGluZ0RhdGEoZ2V0RW5jb2RpbmcoKSk7IH0KKyAgc3RhdGljIGJvb2wgaGFzRW5jb2RpbmdEYXRhKEVuY29kaW5nIEUpIHsKKyAgICBzd2l0Y2ggKEUpIHsKKyAgICBjYXNlIEZpeGVkOgorICAgIGNhc2UgVkJSOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgY2FzZSBBcnJheToKKyAgICBjYXNlIENoYXI2OgorICAgIGNhc2UgQmxvYjoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJJbnZhbGlkIGVuY29kaW5nIik7CisgIH0KKworICAvLy8gaXNDaGFyNiAtIFJldHVybiB0cnVlIGlmIHRoaXMgY2hhcmFjdGVyIGlzIGxlZ2FsIGluIHRoZSBDaGFyNiBlbmNvZGluZy4KKyAgc3RhdGljIGJvb2wgaXNDaGFyNihjaGFyIEMpIHsKKyAgICBpZiAoQyA+PSAnYScgJiYgQyA8PSAneicpIHJldHVybiB0cnVlOworICAgIGlmIChDID49ICdBJyAmJiBDIDw9ICdaJykgcmV0dXJuIHRydWU7CisgICAgaWYgKEMgPj0gJzAnICYmIEMgPD0gJzknKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoQyA9PSAnLicgfHwgQyA9PSAnXycpIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBzdGF0aWMgdW5zaWduZWQgRW5jb2RlQ2hhcjYoY2hhciBDKSB7CisgICAgaWYgKEMgPj0gJ2EnICYmIEMgPD0gJ3onKSByZXR1cm4gQy0nYSc7CisgICAgaWYgKEMgPj0gJ0EnICYmIEMgPD0gJ1onKSByZXR1cm4gQy0nQScrMjY7CisgICAgaWYgKEMgPj0gJzAnICYmIEMgPD0gJzknKSByZXR1cm4gQy0nMCcrMjYrMjY7CisgICAgaWYgKEMgPT0gJy4nKSAgICAgICAgICAgICByZXR1cm4gNjI7CisgICAgaWYgKEMgPT0gJ18nKSAgICAgICAgICAgICByZXR1cm4gNjM7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiTm90IGEgdmFsdWUgQ2hhcjYgY2hhcmFjdGVyISIpOworICB9CisKKyAgc3RhdGljIGNoYXIgRGVjb2RlQ2hhcjYodW5zaWduZWQgVikgeworICAgIGFzc2VydCgoViAmIH42MykgPT0gMCAmJiAiTm90IGEgQ2hhcjYgZW5jb2RlZCBjaGFyYWN0ZXIhIik7CisgICAgcmV0dXJuICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ekFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaMDEyMzQ1Njc4OS5fIgorICAgICAgICBbVl07CisgIH0KKworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlzUG9kTGlrZTxCaXRDb2RlQWJicmV2T3A+IHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWU9dHJ1ZTsgfTsKKworLy8vIEJpdENvZGVBYmJyZXYgLSBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gYWJicmV2aWF0aW9uIHJlY29yZC4gIEFuCisvLy8gYWJicmV2aWF0aW9uIGFsbG93cyBhIGNvbXBsZXggcmVjb3JkIHRoYXQgaGFzIHJlZHVuZGFuY3kgdG8gYmUgc3RvcmVkIGluIGEKKy8vLyBzcGVjaWFsaXplZCBmb3JtYXQgaW5zdGVhZCBvZiB0aGUgZnVsbHktZ2VuZXJhbCwgZnVsbHktdmJyLCBmb3JtYXQuCitjbGFzcyBCaXRDb2RlQWJicmV2IHsKKyAgU21hbGxWZWN0b3I8Qml0Q29kZUFiYnJldk9wLCAzMj4gT3BlcmFuZExpc3Q7CisKK3B1YmxpYzoKKyAgdW5zaWduZWQgZ2V0TnVtT3BlcmFuZEluZm9zKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oT3BlcmFuZExpc3Quc2l6ZSgpKTsKKyAgfQorICBjb25zdCBCaXRDb2RlQWJicmV2T3AgJmdldE9wZXJhbmRJbmZvKHVuc2lnbmVkIE4pIGNvbnN0IHsKKyAgICByZXR1cm4gT3BlcmFuZExpc3RbTl07CisgIH0KKworICB2b2lkIEFkZChjb25zdCBCaXRDb2RlQWJicmV2T3AgJk9wSW5mbykgeworICAgIE9wZXJhbmRMaXN0LnB1c2hfYmFjayhPcEluZm8pOworICB9Cit9OworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpdGNvZGUvQml0Y29kZVJlYWRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0JpdGNvZGVSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZThiZGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0JpdGNvZGVSZWFkZXIuaApAQCAtMCwwICsxLDI3MiBAQAorLy89PT0tIGxsdm0vQml0Y29kZS9CaXRjb2RlUmVhZGVyLmggLSBCaXRjb2RlIHJlYWRlciAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGhlYWRlciBkZWZpbmVzIGludGVyZmFjZXMgdG8gcmVhZCBMTFZNIGJpdGNvZGUgZmlsZXMvc3RyZWFtcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQklUQ09ERV9CSVRDT0RFUkVBREVSX0gKKyNkZWZpbmUgTExWTV9CSVRDT0RFX0JJVENPREVSRUFERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0JpdGNvZGUvQml0Q29kZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZVN1bW1hcnlJbmRleC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JPci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorI2luY2x1ZGUgPHZlY3Rvcj4KK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTExWTUNvbnRleHQ7CitjbGFzcyBNb2R1bGU7CisKKyAgLy8gVGhlc2UgZnVuY3Rpb25zIGFyZSBmb3IgY29udmVydGluZyBFeHBlY3RlZC9FcnJvciB2YWx1ZXMgdG8KKyAgLy8gRXJyb3JPci9zdGQ6OmVycm9yX2NvZGUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBsZWdhY3kgY2xpZW50cy4gRklYTUU6CisgIC8vIFJlbW92ZSB0aGVzZSBmdW5jdGlvbnMgb25jZSBubyBsb25nZXIgbmVlZGVkIGJ5IHRoZSBDIGFuZCBsaWJMVE8gQVBJcy4KKworICBzdGQ6OmVycm9yX2NvZGUgZXJyb3JUb0Vycm9yQ29kZUFuZEVtaXRFcnJvcnMoTExWTUNvbnRleHQgJkN0eCwgRXJyb3IgRXJyKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgRXJyb3JPcjxUPiBleHBlY3RlZFRvRXJyb3JPckFuZEVtaXRFcnJvcnMoTExWTUNvbnRleHQgJkN0eCwgRXhwZWN0ZWQ8VD4gVmFsKSB7CisgICAgaWYgKCFWYWwpCisgICAgICByZXR1cm4gZXJyb3JUb0Vycm9yQ29kZUFuZEVtaXRFcnJvcnMoQ3R4LCBWYWwudGFrZUVycm9yKCkpOworICAgIHJldHVybiBzdGQ6Om1vdmUoKlZhbCk7CisgIH0KKworICBzdHJ1Y3QgQml0Y29kZUZpbGVDb250ZW50czsKKworICAvLy8gQmFzaWMgaW5mb3JtYXRpb24gZXh0cmFjdGVkIGZyb20gYSBiaXRjb2RlIG1vZHVsZSB0byBiZSB1c2VkIGZvciBMVE8uCisgIHN0cnVjdCBCaXRjb2RlTFRPSW5mbyB7CisgICAgYm9vbCBJc1RoaW5MVE87CisgICAgYm9vbCBIYXNTdW1tYXJ5OworICB9OworCisgIC8vLyBSZXByZXNlbnRzIGEgbW9kdWxlIGluIGEgYml0Y29kZSBmaWxlLgorICBjbGFzcyBCaXRjb2RlTW9kdWxlIHsKKyAgICAvLyBUaGlzIGNvdmVycyB0aGUgaWRlbnRpZmljYXRpb24gKGlmIHByZXNlbnQpIGFuZCBtb2R1bGUgYmxvY2tzLgorICAgIEFycmF5UmVmPHVpbnQ4X3Q+IEJ1ZmZlcjsKKyAgICBTdHJpbmdSZWYgTW9kdWxlSWRlbnRpZmllcjsKKworICAgIC8vIFRoZSBzdHJpbmcgdGFibGUgdXNlZCB0byBpbnRlcnByZXQgdGhpcyBtb2R1bGUuCisgICAgU3RyaW5nUmVmIFN0cnRhYjsKKworICAgIC8vIFRoZSBiaXRzdHJlYW0gbG9jYXRpb24gb2YgdGhlIElERU5USUZJQ0FUSU9OX0JMT0NLLgorICAgIHVpbnQ2NF90IElkZW50aWZpY2F0aW9uQml0OworCisgICAgLy8gVGhlIGJpdHN0cmVhbSBsb2NhdGlvbiBvZiB0aGlzIG1vZHVsZSdzIE1PRFVMRV9CTE9DSy4KKyAgICB1aW50NjRfdCBNb2R1bGVCaXQ7CisKKyAgICBCaXRjb2RlTW9kdWxlKEFycmF5UmVmPHVpbnQ4X3Q+IEJ1ZmZlciwgU3RyaW5nUmVmIE1vZHVsZUlkZW50aWZpZXIsCisgICAgICAgICAgICAgICAgICB1aW50NjRfdCBJZGVudGlmaWNhdGlvbkJpdCwgdWludDY0X3QgTW9kdWxlQml0KQorICAgICAgICA6IEJ1ZmZlcihCdWZmZXIpLCBNb2R1bGVJZGVudGlmaWVyKE1vZHVsZUlkZW50aWZpZXIpLAorICAgICAgICAgIElkZW50aWZpY2F0aW9uQml0KElkZW50aWZpY2F0aW9uQml0KSwgTW9kdWxlQml0KE1vZHVsZUJpdCkge30KKworICAgIC8vIENhbGxzIHRoZSBjdG9yLgorICAgIGZyaWVuZCBFeHBlY3RlZDxCaXRjb2RlRmlsZUNvbnRlbnRzPgorICAgIGdldEJpdGNvZGVGaWxlQ29udGVudHMoTWVtb3J5QnVmZmVyUmVmIEJ1ZmZlcik7CisKKyAgICBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPj4gZ2V0TW9kdWxlSW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE1hdGVyaWFsaXplQWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkTGF6eUxvYWRNZXRhZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzSW1wb3J0aW5nKTsKKworICBwdWJsaWM6CisgICAgU3RyaW5nUmVmIGdldEJ1ZmZlcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTdHJpbmdSZWYoKGNvbnN0IGNoYXIgKilCdWZmZXIuYmVnaW4oKSwgQnVmZmVyLnNpemUoKSk7CisgICAgfQorCisgICAgU3RyaW5nUmVmIGdldFN0cnRhYigpIGNvbnN0IHsgcmV0dXJuIFN0cnRhYjsgfQorCisgICAgU3RyaW5nUmVmIGdldE1vZHVsZUlkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBNb2R1bGVJZGVudGlmaWVyOyB9CisKKyAgICAvLy8gUmVhZCB0aGUgYml0Y29kZSBtb2R1bGUgYW5kIHByZXBhcmUgZm9yIGxhenkgZGVzZXJpYWxpemF0aW9uIG9mIGZ1bmN0aW9uCisgICAgLy8vIGJvZGllcy4gSWYgU2hvdWxkTGF6eUxvYWRNZXRhZGF0YSBpcyB0cnVlLCBsYXppbHkgbG9hZCBtZXRhZGF0YSBhcyB3ZWxsLgorICAgIC8vLyBJZiBJc0ltcG9ydGluZyBpcyB0cnVlLCB0aGlzIG1vZHVsZSBpcyBiZWluZyBwYXJzZWQgZm9yIFRoaW5MVE8KKyAgICAvLy8gaW1wb3J0aW5nIGludG8gYW5vdGhlciBtb2R1bGUuCisgICAgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4+IGdldExhenlNb2R1bGUoTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRMYXp5TG9hZE1ldGFkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNJbXBvcnRpbmcpOworCisgICAgLy8vIFJlYWQgdGhlIGVudGlyZSBiaXRjb2RlIG1vZHVsZSBhbmQgcmV0dXJuIGl0LgorICAgIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+PiBwYXJzZU1vZHVsZShMTFZNQ29udGV4dCAmQ29udGV4dCk7CisKKyAgICAvLy8gUmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgbW9kdWxlIHRvIGJlIHVzZWQgZm9yIExUTzogd2hldGhlciB0bworICAgIC8vLyBjb21waWxlIHdpdGggVGhpbkxUTywgYW5kIHdoZXRoZXIgaXQgaGFzIGEgc3VtbWFyeS4KKyAgICBFeHBlY3RlZDxCaXRjb2RlTFRPSW5mbz4gZ2V0TFRPSW5mbygpOworCisgICAgLy8vIFBhcnNlIHRoZSBzcGVjaWZpZWQgYml0Y29kZSBidWZmZXIsIHJldHVybmluZyB0aGUgbW9kdWxlIHN1bW1hcnkgaW5kZXguCisgICAgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPE1vZHVsZVN1bW1hcnlJbmRleD4+IGdldFN1bW1hcnkoKTsKKworICAgIC8vLyBQYXJzZSB0aGUgc3BlY2lmaWVkIGJpdGNvZGUgYnVmZmVyIGFuZCBtZXJnZSBpdHMgbW9kdWxlIHN1bW1hcnkgaW5kZXgKKyAgICAvLy8gaW50byBDb21iaW5lZEluZGV4LgorICAgIEVycm9yIHJlYWRTdW1tYXJ5KE1vZHVsZVN1bW1hcnlJbmRleCAmQ29tYmluZWRJbmRleCwgU3RyaW5nUmVmIE1vZHVsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgTW9kdWxlSWQpOworICB9OworCisgIHN0cnVjdCBCaXRjb2RlRmlsZUNvbnRlbnRzIHsKKyAgICBzdGQ6OnZlY3RvcjxCaXRjb2RlTW9kdWxlPiBNb2RzOworICAgIFN0cmluZ1JlZiBTeW10YWIsIFN0cnRhYkZvclN5bXRhYjsKKyAgfTsKKworICAvLy8gUmV0dXJucyB0aGUgY29udGVudHMgb2YgYSBiaXRjb2RlIGZpbGUuIFRoaXMgaW5jbHVkZXMgdGhlIHJhdyBjb250ZW50cyBvZgorICAvLy8gdGhlIHN5bWJvbCB0YWJsZSBlbWJlZGRlZCBpbiB0aGUgYml0Y29kZSBmaWxlLiBDbGllbnRzIHdoaWNoIHJlcXVpcmUgYQorICAvLy8gc3ltYm9sIHRhYmxlIHNob3VsZCBwcmVmZXIgdG8gdXNlIGlyc3ltdGFiOjpyZWFkIGluc3RlYWQgb2YgdGhpcyBmdW5jdGlvbgorICAvLy8gYmVjYXVzZSBpdCBjcmVhdGVzIGEgcmVhZGVyIGZvciB0aGUgaXJzeW10YWIgYW5kIGhhbmRsZXMgdXBncmFkaW5nIGJpdGNvZGUKKyAgLy8vIGZpbGVzIHdpdGhvdXQgYSBzeW1ib2wgdGFibGUgb3Igd2l0aCBhbiBvbGQgc3ltYm9sIHRhYmxlLgorICBFeHBlY3RlZDxCaXRjb2RlRmlsZUNvbnRlbnRzPiBnZXRCaXRjb2RlRmlsZUNvbnRlbnRzKE1lbW9yeUJ1ZmZlclJlZiBCdWZmZXIpOworCisgIC8vLyBSZXR1cm5zIGEgbGlzdCBvZiBtb2R1bGVzIGluIHRoZSBzcGVjaWZpZWQgYml0Y29kZSBidWZmZXIuCisgIEV4cGVjdGVkPHN0ZDo6dmVjdG9yPEJpdGNvZGVNb2R1bGU+PgorICBnZXRCaXRjb2RlTW9kdWxlTGlzdChNZW1vcnlCdWZmZXJSZWYgQnVmZmVyKTsKKworICAvLy8gUmVhZCB0aGUgaGVhZGVyIG9mIHRoZSBzcGVjaWZpZWQgYml0Y29kZSBidWZmZXIgYW5kIHByZXBhcmUgZm9yIGxhenkKKyAgLy8vIGRlc2VyaWFsaXphdGlvbiBvZiBmdW5jdGlvbiBib2RpZXMuIElmIFNob3VsZExhenlMb2FkTWV0YWRhdGEgaXMgdHJ1ZSwKKyAgLy8vIGxhemlseSBsb2FkIG1ldGFkYXRhIGFzIHdlbGwuIElmIElzSW1wb3J0aW5nIGlzIHRydWUsIHRoaXMgbW9kdWxlIGlzCisgIC8vLyBiZWluZyBwYXJzZWQgZm9yIFRoaW5MVE8gaW1wb3J0aW5nIGludG8gYW5vdGhlciBtb2R1bGUuCisgIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+PgorICBnZXRMYXp5Qml0Y29kZU1vZHVsZShNZW1vcnlCdWZmZXJSZWYgQnVmZmVyLCBMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRMYXp5TG9hZE1ldGFkYXRhID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNJbXBvcnRpbmcgPSBmYWxzZSk7CisKKyAgLy8vIExpa2UgZ2V0TGF6eUJpdGNvZGVNb2R1bGUsIGV4Y2VwdCB0aGF0IHRoZSBtb2R1bGUgdGFrZXMgb3duZXJzaGlwIG9mCisgIC8vLyB0aGUgbWVtb3J5IGJ1ZmZlciBpZiBzdWNjZXNzZnVsLiBJZiBzdWNjZXNzZnVsLCB0aGlzIG1vdmVzIEJ1ZmZlci4gT24KKyAgLy8vIGVycm9yLCB0aGlzICpkb2VzIG5vdCogbW92ZSBCdWZmZXIuIElmIElzSW1wb3J0aW5nIGlzIHRydWUsIHRoaXMgbW9kdWxlIGlzCisgIC8vLyBiZWluZyBwYXJzZWQgZm9yIFRoaW5MVE8gaW1wb3J0aW5nIGludG8gYW5vdGhlciBtb2R1bGUuCisgIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+PiBnZXRPd25pbmdMYXp5Qml0Y29kZU1vZHVsZSgKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+ICYmQnVmZmVyLCBMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgIGJvb2wgU2hvdWxkTGF6eUxvYWRNZXRhZGF0YSA9IGZhbHNlLCBib29sIElzSW1wb3J0aW5nID0gZmFsc2UpOworCisgIC8vLyBSZWFkIHRoZSBoZWFkZXIgb2YgdGhlIHNwZWNpZmllZCBiaXRjb2RlIGJ1ZmZlciBhbmQgZXh0cmFjdCBqdXN0IHRoZQorICAvLy8gdHJpcGxlIGluZm9ybWF0aW9uLiBJZiBzdWNjZXNzZnVsLCB0aGlzIHJldHVybnMgYSBzdHJpbmcuIE9uIGVycm9yLCB0aGlzCisgIC8vLyByZXR1cm5zICIiLgorICBFeHBlY3RlZDxzdGQ6OnN0cmluZz4gZ2V0Qml0Y29kZVRhcmdldFRyaXBsZShNZW1vcnlCdWZmZXJSZWYgQnVmZmVyKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgXHAgQnVmZmVyIGNvbnRhaW5zIGEgYml0Y29kZSBmaWxlIHdpdGggT2JqQyBjb2RlIChjYXRlZ29yeQorICAvLy8gb3IgY2xhc3MpIGluIGl0LgorICBFeHBlY3RlZDxib29sPiBpc0JpdGNvZGVDb250YWluaW5nT2JqQ0NhdGVnb3J5KE1lbW9yeUJ1ZmZlclJlZiBCdWZmZXIpOworCisgIC8vLyBSZWFkIHRoZSBoZWFkZXIgb2YgdGhlIHNwZWNpZmllZCBiaXRjb2RlIGJ1ZmZlciBhbmQgZXh0cmFjdCBqdXN0IHRoZQorICAvLy8gcHJvZHVjZXIgc3RyaW5nIGluZm9ybWF0aW9uLiBJZiBzdWNjZXNzZnVsLCB0aGlzIHJldHVybnMgYSBzdHJpbmcuIE9uCisgIC8vLyBlcnJvciwgdGhpcyByZXR1cm5zICIiLgorICBFeHBlY3RlZDxzdGQ6OnN0cmluZz4gZ2V0Qml0Y29kZVByb2R1Y2VyU3RyaW5nKE1lbW9yeUJ1ZmZlclJlZiBCdWZmZXIpOworCisgIC8vLyBSZWFkIHRoZSBzcGVjaWZpZWQgYml0Y29kZSBmaWxlLCByZXR1cm5pbmcgdGhlIG1vZHVsZS4KKyAgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4+IHBhcnNlQml0Y29kZUZpbGUoTWVtb3J5QnVmZmVyUmVmIEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUNvbnRleHQgJkNvbnRleHQpOworCisgIC8vLyBSZXR1cm5zIExUTyBpbmZvcm1hdGlvbiBmb3IgdGhlIHNwZWNpZmllZCBiaXRjb2RlIGZpbGUuCisgIEV4cGVjdGVkPEJpdGNvZGVMVE9JbmZvPiBnZXRCaXRjb2RlTFRPSW5mbyhNZW1vcnlCdWZmZXJSZWYgQnVmZmVyKTsKKworICAvLy8gUGFyc2UgdGhlIHNwZWNpZmllZCBiaXRjb2RlIGJ1ZmZlciwgcmV0dXJuaW5nIHRoZSBtb2R1bGUgc3VtbWFyeSBpbmRleC4KKyAgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPE1vZHVsZVN1bW1hcnlJbmRleD4+CisgIGdldE1vZHVsZVN1bW1hcnlJbmRleChNZW1vcnlCdWZmZXJSZWYgQnVmZmVyKTsKKworICAvLy8gUGFyc2UgdGhlIHNwZWNpZmllZCBiaXRjb2RlIGJ1ZmZlciBhbmQgbWVyZ2UgdGhlIGluZGV4IGludG8gQ29tYmluZWRJbmRleC4KKyAgRXJyb3IgcmVhZE1vZHVsZVN1bW1hcnlJbmRleChNZW1vcnlCdWZmZXJSZWYgQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZVN1bW1hcnlJbmRleCAmQ29tYmluZWRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBNb2R1bGVJZCk7CisKKyAgLy8vIFBhcnNlIHRoZSBtb2R1bGUgc3VtbWFyeSBpbmRleCBvdXQgb2YgYW4gSVIgZmlsZSBhbmQgcmV0dXJuIHRoZSBtb2R1bGUKKyAgLy8vIHN1bW1hcnkgaW5kZXggb2JqZWN0IGlmIGZvdW5kLCBvciBhbiBlbXB0eSBzdW1tYXJ5IGlmIG5vdC4gSWYgUGF0aCByZWZlcnMKKyAgLy8vIHRvIGFuIGVtcHR5IGZpbGUgYW5kIElnbm9yZUVtcHR5VGhpbkxUT0luZGV4RmlsZSBpcyB0cnVlLCB0aGVuCisgIC8vLyB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIG51bGxwdHIuCisgIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGVTdW1tYXJ5SW5kZXg+PgorICBnZXRNb2R1bGVTdW1tYXJ5SW5kZXhGb3JGaWxlKFN0cmluZ1JlZiBQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSWdub3JlRW1wdHlUaGluTFRPSW5kZXhGaWxlID0gZmFsc2UpOworCisgIC8vLyBpc0JpdGNvZGVXcmFwcGVyIC0gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGJ5dGVzIGFyZSB0aGUgbWFnaWMgYnl0ZXMKKyAgLy8vIGZvciBhbiBMTFZNIElSIGJpdGNvZGUgd3JhcHBlci4KKyAgaW5saW5lIGJvb2wgaXNCaXRjb2RlV3JhcHBlcihjb25zdCB1bnNpZ25lZCBjaGFyICpCdWZQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqQnVmRW5kKSB7CisgICAgLy8gU2VlIGlmIHlvdSBjYW4gZmluZCB0aGUgaGlkZGVuIG1lc3NhZ2UgaW4gdGhlIG1hZ2ljIGJ5dGVzIDotKS4KKyAgICAvLyAoSGludDogaXQncyBhIGxpdHRsZS1lbmRpYW4gZW5jb2RpbmcuKQorICAgIHJldHVybiBCdWZQdHIgIT0gQnVmRW5kICYmCisgICAgICAgICAgIEJ1ZlB0clswXSA9PSAweERFICYmCisgICAgICAgICAgIEJ1ZlB0clsxXSA9PSAweEMwICYmCisgICAgICAgICAgIEJ1ZlB0clsyXSA9PSAweDE3ICYmCisgICAgICAgICAgIEJ1ZlB0clszXSA9PSAweDBCOworICB9CisKKyAgLy8vIGlzUmF3Qml0Y29kZSAtIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBieXRlcyBhcmUgdGhlIG1hZ2ljIGJ5dGVzIGZvcgorICAvLy8gcmF3IExMVk0gSVIgYml0Y29kZSAod2l0aG91dCBhIHdyYXBwZXIpLgorICBpbmxpbmUgYm9vbCBpc1Jhd0JpdGNvZGUoY29uc3QgdW5zaWduZWQgY2hhciAqQnVmUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqQnVmRW5kKSB7CisgICAgLy8gVGhlc2UgYnl0ZXMgc29ydCBvZiBoYXZlIGEgaGlkZGVuIG1lc3NhZ2UsIGJ1dCBpdCdzIG5vdCBpbgorICAgIC8vIGxpdHRsZS1lbmRpYW4gdGhpcyB0aW1lLCBhbmQgaXQncyBhIGxpdHRsZSByZWR1bmRhbnQuCisgICAgcmV0dXJuIEJ1ZlB0ciAhPSBCdWZFbmQgJiYKKyAgICAgICAgICAgQnVmUHRyWzBdID09ICdCJyAmJgorICAgICAgICAgICBCdWZQdHJbMV0gPT0gJ0MnICYmCisgICAgICAgICAgIEJ1ZlB0clsyXSA9PSAweGMwICYmCisgICAgICAgICAgIEJ1ZlB0clszXSA9PSAweGRlOworICB9CisKKyAgLy8vIGlzQml0Y29kZSAtIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBieXRlcyBhcmUgdGhlIG1hZ2ljIGJ5dGVzIGZvcgorICAvLy8gTExWTSBJUiBiaXRjb2RlLCBlaXRoZXIgd2l0aCBvciB3aXRob3V0IGEgd3JhcHBlci4KKyAgaW5saW5lIGJvb2wgaXNCaXRjb2RlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKkJ1ZlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKkJ1ZkVuZCkgeworICAgIHJldHVybiBpc0JpdGNvZGVXcmFwcGVyKEJ1ZlB0ciwgQnVmRW5kKSB8fAorICAgICAgICAgICBpc1Jhd0JpdGNvZGUoQnVmUHRyLCBCdWZFbmQpOworICB9CisKKyAgLy8vIFNraXBCaXRjb2RlV3JhcHBlckhlYWRlciAtIFNvbWUgc3lzdGVtcyB3cmFwIGJjIGZpbGVzIHdpdGggYSBzcGVjaWFsCisgIC8vLyBoZWFkZXIgZm9yIHBhZGRpbmcgb3Igb3RoZXIgcmVhc29ucy4gIFRoZSBmb3JtYXQgb2YgdGhpcyBoZWFkZXIgaXM6CisgIC8vLworICAvLy8gc3RydWN0IGJjX2hlYWRlciB7CisgIC8vLyAgIHVpbnQzMl90IE1hZ2ljOyAgICAgICAgIC8vIDB4MEIxN0MwREUKKyAgLy8vICAgdWludDMyX3QgVmVyc2lvbjsgICAgICAgLy8gVmVyc2lvbiwgY3VycmVudGx5IGFsd2F5cyAwLgorICAvLy8gICB1aW50MzJfdCBCaXRjb2RlT2Zmc2V0OyAvLyBPZmZzZXQgdG8gdHJhZGl0aW9uYWwgYml0Y29kZSBmaWxlLgorICAvLy8gICB1aW50MzJfdCBCaXRjb2RlU2l6ZTsgICAvLyBTaXplIG9mIHRyYWRpdGlvbmFsIGJpdGNvZGUgZmlsZS4KKyAgLy8vICAgLi4uIHBvdGVudGlhbGx5IG90aGVyIGd1bmsgLi4uCisgIC8vLyB9OworICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2UgZmluZCBhIGZpbGUgd2l0aCBhIG1hdGNoaW5nIG1hZ2ljIG51bWJlci4KKyAgLy8vIEluIHRoaXMgY2FzZSwgc2tpcCBkb3duIHRvIHRoZSBzdWJzZWN0aW9uIG9mIHRoZSBmaWxlIHRoYXQgaXMgYWN0dWFsbHkgYQorICAvLy8gQkMgZmlsZS4KKyAgLy8vIElmICdWZXJpZnlCdWZmZXJTaXplJyBpcyB0cnVlLCBjaGVjayB0aGF0IHRoZSBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvCisgIC8vLyBjb250YWluIHRoZSB3aG9sZSBiaXRjb2RlIGZpbGUuCisgIGlubGluZSBib29sIFNraXBCaXRjb2RlV3JhcHBlckhlYWRlcihjb25zdCB1bnNpZ25lZCBjaGFyIComQnVmUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqJkJ1ZkVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVmVyaWZ5QnVmZmVyU2l6ZSkgeworICAgIC8vIE11c3QgY29udGFpbiB0aGUgb2Zmc2V0IGFuZCBzaXplIGZpZWxkIQorICAgIGlmICh1bnNpZ25lZChCdWZFbmQgLSBCdWZQdHIpIDwgQldIX1NpemVGaWVsZCArIDQpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHVuc2lnbmVkIE9mZnNldCA9IHN1cHBvcnQ6OmVuZGlhbjo6cmVhZDMybGUoJkJ1ZlB0cltCV0hfT2Zmc2V0RmllbGRdKTsKKyAgICB1bnNpZ25lZCBTaXplID0gc3VwcG9ydDo6ZW5kaWFuOjpyZWFkMzJsZSgmQnVmUHRyW0JXSF9TaXplRmllbGRdKTsKKyAgICB1aW50NjRfdCBCaXRjb2RlT2Zmc2V0RW5kID0gKHVpbnQ2NF90KU9mZnNldCArICh1aW50NjRfdClTaXplOworCisgICAgLy8gVmVyaWZ5IHRoYXQgT2Zmc2V0K1NpemUgZml0cyBpbiB0aGUgZmlsZS4KKyAgICBpZiAoVmVyaWZ5QnVmZmVyU2l6ZSAmJiBCaXRjb2RlT2Zmc2V0RW5kID4gdWludDY0X3QoQnVmRW5kLUJ1ZlB0cikpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBCdWZQdHIgKz0gT2Zmc2V0OworICAgIEJ1ZkVuZCA9IEJ1ZlB0citTaXplOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6ZXJyb3JfY2F0ZWdvcnkgJkJpdGNvZGVFcnJvckNhdGVnb3J5KCk7CisgIGVudW0gY2xhc3MgQml0Y29kZUVycm9yIHsgQ29ycnVwdGVkQml0Y29kZSA9IDEgfTsKKyAgaW5saW5lIHN0ZDo6ZXJyb3JfY29kZSBtYWtlX2Vycm9yX2NvZGUoQml0Y29kZUVycm9yIEUpIHsKKyAgICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKHN0YXRpY19jYXN0PGludD4oRSksIEJpdGNvZGVFcnJvckNhdGVnb3J5KCkpOworICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKK25hbWVzcGFjZSBzdGQgeworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNfZXJyb3JfY29kZV9lbnVtPGxsdm06OkJpdGNvZGVFcnJvcj4gOiBzdGQ6OnRydWVfdHlwZSB7fTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHN0ZAorCisjZW5kaWYgLy8gTExWTV9CSVRDT0RFX0JJVENPREVSRUFERVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0JpdGNvZGVXcml0ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQml0Y29kZS9CaXRjb2RlV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmEzMjI5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQml0Y29kZS9CaXRjb2RlV3JpdGVyLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8vPT09LSBsbHZtL0JpdGNvZGUvQml0Y29kZVdyaXRlci5oIC0gQml0Y29kZSB3cml0ZXJzIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyBpbnRlcmZhY2VzIHRvIHdyaXRlIExMVk0gYml0Y29kZSBmaWxlcy9zdHJlYW1zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9CSVRDT0RFX0JJVENPREVXUklURVJfSAorI2RlZmluZSBMTFZNX0JJVENPREVfQklUQ09ERVdSSVRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZVN1bW1hcnlJbmRleC5oIgorI2luY2x1ZGUgImxsdm0vTUMvU3RyaW5nVGFibGVCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCaXRzdHJlYW1Xcml0ZXI7CitjbGFzcyBNb2R1bGU7CitjbGFzcyByYXdfb3N0cmVhbTsKKworICBjbGFzcyBCaXRjb2RlV3JpdGVyIHsKKyAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJkJ1ZmZlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Qml0c3RyZWFtV3JpdGVyPiBTdHJlYW07CisKKyAgICBTdHJpbmdUYWJsZUJ1aWxkZXIgU3RydGFiQnVpbGRlcntTdHJpbmdUYWJsZUJ1aWxkZXI6OlJBV307CisKKyAgICAvLyBPd25zIGFueSBzdHJpbmdzIGNyZWF0ZWQgYnkgdGhlIGlyc3ltdGFiIHdyaXRlciB1bnRpbCB3ZSBjcmVhdGUgdGhlCisgICAgLy8gc3RyaW5nIHRhYmxlLgorICAgIEJ1bXBQdHJBbGxvY2F0b3IgQWxsb2M7CisKKyAgICBib29sIFdyb3RlU3RydGFiID0gZmFsc2UsIFdyb3RlU3ltdGFiID0gZmFsc2U7CisKKyAgICB2b2lkIHdyaXRlQmxvYih1bnNpZ25lZCBCbG9jaywgdW5zaWduZWQgUmVjb3JkLCBTdHJpbmdSZWYgQmxvYik7CisKKyAgICBzdGQ6OnZlY3RvcjxNb2R1bGUgKj4gTW9kczsKKworICBwdWJsaWM6CisgICAgLy8vIENyZWF0ZSBhIEJpdGNvZGVXcml0ZXIgdGhhdCB3cml0ZXMgdG8gQnVmZmVyLgorICAgIEJpdGNvZGVXcml0ZXIoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZCdWZmZXIpOworCisgICAgfkJpdGNvZGVXcml0ZXIoKTsKKworICAgIC8vLyBBdHRlbXB0IHRvIHdyaXRlIGEgc3ltYm9sIHRhYmxlIHRvIHRoZSBiaXRjb2RlIGZpbGUuIFRoaXMgbXVzdCBiZSBjYWxsZWQKKyAgICAvLy8gYXQgbW9zdCBvbmNlIGFmdGVyIGFsbCBtb2R1bGVzIGhhdmUgYmVlbiB3cml0dGVuLgorICAgIC8vLworICAgIC8vLyBBIHJlYWRlciBkb2VzIG5vdCByZXF1aXJlIGEgc3ltYm9sIHRhYmxlIHRvIGludGVycHJldCBhIGJpdGNvZGUgZmlsZTsKKyAgICAvLy8gdGhlIHN5bWJvbCB0YWJsZSBpcyBuZWVkZWQgb25seSB0byBpbXByb3ZlIGxpbmstdGltZSBwZXJmb3JtYW5jZS4gU28KKyAgICAvLy8gdGhpcyBmdW5jdGlvbiBtYXkgZGVjaWRlIG5vdCB0byB3cml0ZSBhIHN5bWJvbCB0YWJsZS4gSXQgbWF5IHNvIGRlY2lkZQorICAgIC8vLyBpZiwgZm9yIGV4YW1wbGUsIHRoZSB0YXJnZXQgaXMgdW5yZWdpc3RlcmVkIG9yIHRoZSBJUiBpcyBtYWxmb3JtZWQuCisgICAgdm9pZCB3cml0ZVN5bXRhYigpOworCisgICAgLy8vIFdyaXRlIHRoZSBiaXRjb2RlIGZpbGUncyBzdHJpbmcgdGFibGUuIFRoaXMgbXVzdCBiZSBjYWxsZWQgZXhhY3RseSBvbmNlCisgICAgLy8vIGFmdGVyIGFsbCBtb2R1bGVzIGFuZCB0aGUgb3B0aW9uYWwgc3ltYm9sIHRhYmxlIGhhdmUgYmVlbiB3cml0dGVuLgorICAgIHZvaWQgd3JpdGVTdHJ0YWIoKTsKKworICAgIC8vLyBDb3B5IHRoZSBzdHJpbmcgdGFibGUgZm9yIGFub3RoZXIgbW9kdWxlIGludG8gdGhpcyBiaXRjb2RlIGZpbGUuIFRoaXMKKyAgICAvLy8gc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBjb3B5aW5nIHRoZSBtb2R1bGUgaXRzZWxmIGludG8gdGhlIGJpdGNvZGUgZmlsZS4KKyAgICB2b2lkIGNvcHlTdHJ0YWIoU3RyaW5nUmVmIFN0cnRhYik7CisKKyAgICAvLy8gV3JpdGUgdGhlIHNwZWNpZmllZCBtb2R1bGUgdG8gdGhlIGJ1ZmZlciBzcGVjaWZpZWQgYXQgY29uc3RydWN0aW9uIHRpbWUuCisgICAgLy8vCisgICAgLy8vIElmIFxjIFNob3VsZFByZXNlcnZlVXNlTGlzdE9yZGVyLCBlbmNvZGUgdGhlIHVzZS1saXN0IG9yZGVyIGZvciBlYWNoIFxhCisgICAgLy8vIFZhbHVlIGluIFxjIE0uICBUaGVzZSB3aWxsIGJlIHJlY29uc3RydWN0ZWQgZXhhY3RseSB3aGVuIFxhIE0gaXMKKyAgICAvLy8gZGVzZXJpYWxpemVkLgorICAgIC8vLworICAgIC8vLyBJZiBcYyBJbmRleCBpcyBzdXBwbGllZCwgdGhlIGJpdGNvZGUgd2lsbCBjb250YWluIHRoZSBzdW1tYXJ5IGluZGV4CisgICAgLy8vIChjdXJyZW50bHkgZm9yIHVzZSBpbiBUaGluTFRPIG9wdGltaXphdGlvbikuCisgICAgLy8vCisgICAgLy8vIFxwIEdlbmVyYXRlSGFzaCBlbmFibGVzIGhhc2hpbmcgdGhlIE1vZHVsZSBhbmQgaW5jbHVkaW5nIHRoZSBoYXNoIGluIHRoZQorICAgIC8vLyBiaXRjb2RlIChjdXJyZW50bHkgZm9yIHVzZSBpbiBUaGluTFRPIGluY3JlbWVudGFsIGJ1aWxkKS4KKyAgICAvLy8KKyAgICAvLy8gSWYgXHAgTW9kSGFzaCBpcyBub24tbnVsbCwgd2hlbiBHZW5lcmF0ZUhhc2ggaXMgdHJ1ZSwgdGhlIHJlc3VsdGluZworICAgIC8vLyBoYXNoIGlzIHdyaXR0ZW4gaW50byBNb2RIYXNoLiBXaGVuIEdlbmVyYXRlSGFzaCBpcyBmYWxzZSwgdGhhdCB2YWx1ZQorICAgIC8vLyBpcyB1c2VkIGFzIHRoZSBoYXNoIGluc3RlYWQgb2YgY29tcHV0aW5nIGZyb20gdGhlIGdlbmVyYXRlZCBiaXRjb2RlLgorICAgIC8vLyBDYW4gYmUgdXNlZCB0byBwcm9kdWNlIHRoZSBzYW1lIG1vZHVsZSBoYXNoIGZvciBhIG1pbmltaXplZCBiaXRjb2RlCisgICAgLy8vIHVzZWQganVzdCBmb3IgdGhlIHRoaW4gbGluayBhcyBpbiB0aGUgcmVndWxhciBmdWxsIGJpdGNvZGUgdGhhdCB3aWxsCisgICAgLy8vIGJlIHVzZWQgaW4gdGhlIGJhY2tlbmQuCisgICAgdm9pZCB3cml0ZU1vZHVsZShjb25zdCBNb2R1bGUgJk0sIGJvb2wgU2hvdWxkUHJlc2VydmVVc2VMaXN0T3JkZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZVN1bW1hcnlJbmRleCAqSW5kZXggPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBHZW5lcmF0ZUhhc2ggPSBmYWxzZSwgTW9kdWxlSGFzaCAqTW9kSGFzaCA9IG51bGxwdHIpOworCisgICAgLy8vIFdyaXRlIHRoZSBzcGVjaWZpZWQgdGhpbiBsaW5rIGJpdGNvZGUgZmlsZSAoaS5lLiwgdGhlIG1pbmltaXplZCBiaXRjb2RlCisgICAgLy8vIGZpbGUpIHRvIHRoZSBidWZmZXIgc3BlY2lmaWVkIGF0IGNvbnN0cnVjdGlvbiB0aW1lLiBUaGUgdGhpbiBsaW5rCisgICAgLy8vIGJpdGNvZGUgZmlsZSBpcyB1c2VkIGZvciB0aGluIGxpbmssIGFuZCBpdCBvbmx5IGNvbnRhaW5zIHRoZSBuZWNlc3NhcnkKKyAgICAvLy8gaW5mb3JtYXRpb24gZm9yIHRoaW4gbGluay4KKyAgICAvLy8KKyAgICAvLy8gTW9kSGFzaCBpcyBmb3IgdXNlIGluIFRoaW5MVE8gaW5jcmVtZW50YWwgYnVpbGQsIGdlbmVyYXRlZCB3aGlsZSB0aGUKKyAgICAvLy8gSVIgYml0Y29kZSBmaWxlIHdyaXRpbmcuCisgICAgdm9pZCB3cml0ZVRoaW5MaW5rQml0Y29kZShjb25zdCBNb2R1bGUgJk0sIGNvbnN0IE1vZHVsZVN1bW1hcnlJbmRleCAmSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGVIYXNoICZNb2RIYXNoKTsKKworICAgIHZvaWQgd3JpdGVJbmRleCgKKyAgICAgICAgY29uc3QgTW9kdWxlU3VtbWFyeUluZGV4ICpJbmRleCwKKyAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEdWU3VtbWFyeU1hcFR5PiAqTW9kdWxlVG9TdW1tYXJpZXNGb3JJbmRleCk7CisgIH07CisKKyAgLy8vIFxicmllZiBXcml0ZSB0aGUgc3BlY2lmaWVkIG1vZHVsZSB0byB0aGUgc3BlY2lmaWVkIHJhdyBvdXRwdXQgc3RyZWFtLgorICAvLy8KKyAgLy8vIEZvciBzdHJlYW1zIHdoZXJlIGl0IG1hdHRlcnMsIHRoZSBnaXZlbiBzdHJlYW0gc2hvdWxkIGJlIGluICJiaW5hcnkiCisgIC8vLyBtb2RlLgorICAvLy8KKyAgLy8vIElmIFxjIFNob3VsZFByZXNlcnZlVXNlTGlzdE9yZGVyLCBlbmNvZGUgdGhlIHVzZS1saXN0IG9yZGVyIGZvciBlYWNoIFxhCisgIC8vLyBWYWx1ZSBpbiBcYyBNLiAgVGhlc2Ugd2lsbCBiZSByZWNvbnN0cnVjdGVkIGV4YWN0bHkgd2hlbiBcYSBNIGlzCisgIC8vLyBkZXNlcmlhbGl6ZWQuCisgIC8vLworICAvLy8gSWYgXGMgSW5kZXggaXMgc3VwcGxpZWQsIHRoZSBiaXRjb2RlIHdpbGwgY29udGFpbiB0aGUgc3VtbWFyeSBpbmRleAorICAvLy8gKGN1cnJlbnRseSBmb3IgdXNlIGluIFRoaW5MVE8gb3B0aW1pemF0aW9uKS4KKyAgLy8vCisgIC8vLyBccCBHZW5lcmF0ZUhhc2ggZW5hYmxlcyBoYXNoaW5nIHRoZSBNb2R1bGUgYW5kIGluY2x1ZGluZyB0aGUgaGFzaCBpbiB0aGUKKyAgLy8vIGJpdGNvZGUgKGN1cnJlbnRseSBmb3IgdXNlIGluIFRoaW5MVE8gaW5jcmVtZW50YWwgYnVpbGQpLgorICAvLy8KKyAgLy8vIElmIFxwIE1vZEhhc2ggaXMgbm9uLW51bGwsIHdoZW4gR2VuZXJhdGVIYXNoIGlzIHRydWUsIHRoZSByZXN1bHRpbmcKKyAgLy8vIGhhc2ggaXMgd3JpdHRlbiBpbnRvIE1vZEhhc2guIFdoZW4gR2VuZXJhdGVIYXNoIGlzIGZhbHNlLCB0aGF0IHZhbHVlCisgIC8vLyBpcyB1c2VkIGFzIHRoZSBoYXNoIGluc3RlYWQgb2YgY29tcHV0aW5nIGZyb20gdGhlIGdlbmVyYXRlZCBiaXRjb2RlLgorICAvLy8gQ2FuIGJlIHVzZWQgdG8gcHJvZHVjZSB0aGUgc2FtZSBtb2R1bGUgaGFzaCBmb3IgYSBtaW5pbWl6ZWQgYml0Y29kZQorICAvLy8gdXNlZCBqdXN0IGZvciB0aGUgdGhpbiBsaW5rIGFzIGluIHRoZSByZWd1bGFyIGZ1bGwgYml0Y29kZSB0aGF0IHdpbGwKKyAgLy8vIGJlIHVzZWQgaW4gdGhlIGJhY2tlbmQuCisgIHZvaWQgV3JpdGVCaXRjb2RlVG9GaWxlKGNvbnN0IE1vZHVsZSAmTSwgcmF3X29zdHJlYW0gJk91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRQcmVzZXJ2ZVVzZUxpc3RPcmRlciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGVTdW1tYXJ5SW5kZXggKkluZGV4ID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBHZW5lcmF0ZUhhc2ggPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlSGFzaCAqTW9kSGFzaCA9IG51bGxwdHIpOworCisgIC8vLyBXcml0ZSB0aGUgc3BlY2lmaWVkIHRoaW4gbGluayBiaXRjb2RlIGZpbGUgKGkuZS4sIHRoZSBtaW5pbWl6ZWQgYml0Y29kZQorICAvLy8gZmlsZSkgdG8gdGhlIGdpdmVuIHJhdyBvdXRwdXQgc3RyZWFtLCB3aGVyZSBpdCB3aWxsIGJlIHdyaXR0ZW4gaW4gYSBuZXcKKyAgLy8vIGJpdGNvZGUgYmxvY2suIFRoZSB0aGluIGxpbmsgYml0Y29kZSBmaWxlIGlzIHVzZWQgZm9yIHRoaW4gbGluaywgYW5kIGl0CisgIC8vLyBvbmx5IGNvbnRhaW5zIHRoZSBuZWNlc3NhcnkgaW5mb3JtYXRpb24gZm9yIHRoaW4gbGluay4KKyAgLy8vCisgIC8vLyBNb2RIYXNoIGlzIGZvciB1c2UgaW4gVGhpbkxUTyBpbmNyZW1lbnRhbCBidWlsZCwgZ2VuZXJhdGVkIHdoaWxlIHRoZSBJUgorICAvLy8gYml0Y29kZSBmaWxlIHdyaXRpbmcuCisgIHZvaWQgV3JpdGVUaGluTGlua0JpdGNvZGVUb0ZpbGUoY29uc3QgTW9kdWxlICZNLCByYXdfb3N0cmVhbSAmT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZVN1bW1hcnlJbmRleCAmSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTW9kdWxlSGFzaCAmTW9kSGFzaCk7CisKKyAgLy8vIFdyaXRlIHRoZSBzcGVjaWZpZWQgbW9kdWxlIHN1bW1hcnkgaW5kZXggdG8gdGhlIGdpdmVuIHJhdyBvdXRwdXQgc3RyZWFtLAorICAvLy8gd2hlcmUgaXQgd2lsbCBiZSB3cml0dGVuIGluIGEgbmV3IGJpdGNvZGUgYmxvY2suIFRoaXMgaXMgdXNlZCB3aGVuCisgIC8vLyB3cml0aW5nIHRoZSBjb21iaW5lZCBpbmRleCBmaWxlIGZvciBUaGluTFRPLiBXaGVuIHdyaXRpbmcgYSBzdWJzZXQgb2YgdGhlCisgIC8vLyBpbmRleCBmb3IgYSBkaXN0cmlidXRlZCBiYWNrZW5kLCBwcm92aWRlIHRoZSBccCBNb2R1bGVUb1N1bW1hcmllc0ZvckluZGV4CisgIC8vLyBtYXAuCisgIHZvaWQgV3JpdGVJbmRleFRvRmlsZShjb25zdCBNb2R1bGVTdW1tYXJ5SW5kZXggJkluZGV4LCByYXdfb3N0cmVhbSAmT3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEdWU3VtbWFyeU1hcFR5PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpNb2R1bGVUb1N1bW1hcmllc0ZvckluZGV4ID0gbnVsbHB0cik7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0JJVENPREVfQklUQ09ERVdSSVRFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpdGNvZGUvQml0Y29kZVdyaXRlclBhc3MuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQml0Y29kZS9CaXRjb2RlV3JpdGVyUGFzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhYzZmYmEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpdGNvZGUvQml0Y29kZVdyaXRlclBhc3MuaApAQCAtMCwwICsxLDc1IEBACisvLz09PS0tIEJpdGNvZGVXcml0ZXJQYXNzLmggLSBCaXRjb2RlIHdyaXRpbmcgcGFzcyAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8KKy8vLyBUaGlzIGZpbGUgcHJvdmlkZXMgYSBiaXRjb2RlIHdyaXRpbmcgcGFzcy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0JJVENPREVfQklUQ09ERVdSSVRFUlBBU1NfSAorI2RlZmluZSBMTFZNX0JJVENPREVfQklUQ09ERVdSSVRFUlBBU1NfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBNb2R1bGVQYXNzOworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vLyBcYnJpZWYgQ3JlYXRlIGFuZCByZXR1cm4gYSBwYXNzIHRoYXQgd3JpdGVzIHRoZSBtb2R1bGUgdG8gdGhlIHNwZWNpZmllZAorLy8vIG9zdHJlYW0uIE5vdGUgdGhhdCB0aGlzIHBhc3MgaXMgZGVzaWduZWQgZm9yIHVzZSB3aXRoIHRoZSBsZWdhY3kgcGFzcworLy8vIG1hbmFnZXIuCisvLy8KKy8vLyBJZiBcYyBTaG91bGRQcmVzZXJ2ZVVzZUxpc3RPcmRlciwgZW5jb2RlIHVzZS1saXN0IG9yZGVyIHNvIGl0IGNhbiBiZQorLy8vIHJlcHJvZHVjZWQgd2hlbiBkZXNlcmlhbGl6ZWQuCisvLy8KKy8vLyBJZiBcYyBFbWl0U3VtbWFyeUluZGV4LCBlbWl0IHRoZSBzdW1tYXJ5IGluZGV4IChjdXJyZW50bHkgZm9yIHVzZSBpbiBUaGluTFRPCisvLy8gb3B0aW1pemF0aW9uKS4KKy8vLworLy8vIElmIFxjIEVtaXRNb2R1bGVIYXNoLCBjb21wdXRlIGFuZCBlbWl0IHRoZSBtb2R1bGUgaGFzaCBpbiB0aGUgYml0Y29kZQorLy8vIChjdXJyZW50bHkgZm9yIHVzZSBpbiBUaGluTFRPIGluY3JlbWVudGFsIGJ1aWxkKS4KK01vZHVsZVBhc3MgKmNyZWF0ZUJpdGNvZGVXcml0ZXJQYXNzKHJhd19vc3RyZWFtICZTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZFByZXNlcnZlVXNlTGlzdE9yZGVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEVtaXRTdW1tYXJ5SW5kZXggPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRW1pdE1vZHVsZUhhc2ggPSBmYWxzZSk7CisKKy8vLyBcYnJpZWYgUGFzcyBmb3Igd3JpdGluZyBhIG1vZHVsZSBvZiBJUiBvdXQgdG8gYSBiaXRjb2RlIGZpbGUuCisvLy8KKy8vLyBOb3RlIHRoYXQgdGhpcyBpcyBpbnRlbmRlZCBmb3IgdXNlIHdpdGggdGhlIG5ldyBwYXNzIG1hbmFnZXIuIFRvIGNvbnN0cnVjdAorLy8vIGEgcGFzcyBmb3IgdGhlIGxlZ2FjeSBwYXNzIG1hbmFnZXIsIHVzZSB0aGUgZnVuY3Rpb24gYWJvdmUuCitjbGFzcyBCaXRjb2RlV3JpdGVyUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPEJpdGNvZGVXcml0ZXJQYXNzPiB7CisgIHJhd19vc3RyZWFtICZPUzsKKyAgYm9vbCBTaG91bGRQcmVzZXJ2ZVVzZUxpc3RPcmRlcjsKKyAgYm9vbCBFbWl0U3VtbWFyeUluZGV4OworICBib29sIEVtaXRNb2R1bGVIYXNoOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgYml0Y29kZSB3cml0ZXIgcGFzcyBhcm91bmQgYSBwYXJ0aWN1bGFyIG91dHB1dCBzdHJlYW0uCisgIC8vLworICAvLy8gSWYgXGMgU2hvdWxkUHJlc2VydmVVc2VMaXN0T3JkZXIsIGVuY29kZSB1c2UtbGlzdCBvcmRlciBzbyBpdCBjYW4gYmUKKyAgLy8vIHJlcHJvZHVjZWQgd2hlbiBkZXNlcmlhbGl6ZWQuCisgIC8vLworICAvLy8gSWYgXGMgRW1pdFN1bW1hcnlJbmRleCwgZW1pdCB0aGUgc3VtbWFyeSBpbmRleCAoY3VycmVudGx5CisgIC8vLyBmb3IgdXNlIGluIFRoaW5MVE8gb3B0aW1pemF0aW9uKS4KKyAgZXhwbGljaXQgQml0Y29kZVdyaXRlclBhc3MocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZFByZXNlcnZlVXNlTGlzdE9yZGVyID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRW1pdFN1bW1hcnlJbmRleCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEVtaXRNb2R1bGVIYXNoID0gZmFsc2UpCisgICAgICA6IE9TKE9TKSwgU2hvdWxkUHJlc2VydmVVc2VMaXN0T3JkZXIoU2hvdWxkUHJlc2VydmVVc2VMaXN0T3JkZXIpLAorICBFbWl0U3VtbWFyeUluZGV4KEVtaXRTdW1tYXJ5SW5kZXgpLCBFbWl0TW9kdWxlSGFzaChFbWl0TW9kdWxlSGFzaCkge30KKworICAvLy8gXGJyaWVmIFJ1biB0aGUgYml0Y29kZSB3cml0ZXIgcGFzcywgYW5kIG91dHB1dCB0aGUgbW9kdWxlIHRvIHRoZSBzZWxlY3RlZAorICAvLy8gb3V0cHV0IHN0cmVhbS4KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICYpOworfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQml0Y29kZS9CaXRzdHJlYW1SZWFkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQml0Y29kZS9CaXRzdHJlYW1SZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNDg0ZmEyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0JpdHN0cmVhbVJlYWRlci5oCkBAIC0wLDAgKzEsNTA2IEBACisvLz09PS0gQml0c3RyZWFtUmVhZGVyLmggLSBMb3ctbGV2ZWwgYml0c3RyZWFtIHJlYWRlciBpbnRlcmZhY2UgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIGRlZmluZXMgdGhlIEJpdHN0cmVhbVJlYWRlciBjbGFzcy4gIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8KKy8vIHJlYWQgYW4gYXJiaXRyYXJ5IGJpdHN0cmVhbSwgcmVnYXJkbGVzcyBvZiBpdHMgY29udGVudHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0JJVENPREVfQklUU1RSRUFNUkVBREVSX0gKKyNkZWZpbmUgTExWTV9CSVRDT0RFX0JJVFNUUkVBTVJFQURFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9CaXRjb2RlL0JpdENvZGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gVGhpcyBjbGFzcyBtYWludGFpbnMgdGhlIGFiYnJldmlhdGlvbnMgcmVhZCBmcm9tIGEgYmxvY2sgaW5mbyBibG9jay4KK2NsYXNzIEJpdHN0cmVhbUJsb2NrSW5mbyB7CitwdWJsaWM6CisgIC8vLyBUaGlzIGNvbnRhaW5zIGluZm9ybWF0aW9uIGVtaXR0ZWQgdG8gQkxPQ0tJTkZPX0JMT0NLIGJsb2Nrcy4gVGhlc2UKKyAgLy8vIGRlc2NyaWJlIGFiYnJldmlhdGlvbnMgdGhhdCBhbGwgYmxvY2tzIG9mIHRoZSBzcGVjaWZpZWQgSUQgaW5oZXJpdC4KKyAgc3RydWN0IEJsb2NrSW5mbyB7CisgICAgdW5zaWduZWQgQmxvY2tJRDsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Qml0Q29kZUFiYnJldj4+IEFiYnJldnM7CisgICAgc3RkOjpzdHJpbmcgTmFtZTsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIHN0ZDo6c3RyaW5nPj4gUmVjb3JkTmFtZXM7CisgIH07CisKK3ByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPEJsb2NrSW5mbz4gQmxvY2tJbmZvUmVjb3JkczsKKworcHVibGljOgorICAvLy8gSWYgdGhlcmUgaXMgYmxvY2sgaW5mbyBmb3IgdGhlIHNwZWNpZmllZCBJRCwgcmV0dXJuIGl0LCBvdGhlcndpc2UgcmV0dXJuCisgIC8vLyBudWxsLgorICBjb25zdCBCbG9ja0luZm8gKmdldEJsb2NrSW5mbyh1bnNpZ25lZCBCbG9ja0lEKSBjb25zdCB7CisgICAgLy8gQ29tbW9uIGNhc2UsIHRoZSBtb3N0IHJlY2VudCBlbnRyeSBtYXRjaGVzIEJsb2NrSUQuCisgICAgaWYgKCFCbG9ja0luZm9SZWNvcmRzLmVtcHR5KCkgJiYgQmxvY2tJbmZvUmVjb3Jkcy5iYWNrKCkuQmxvY2tJRCA9PSBCbG9ja0lEKQorICAgICAgcmV0dXJuICZCbG9ja0luZm9SZWNvcmRzLmJhY2soKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oQmxvY2tJbmZvUmVjb3Jkcy5zaXplKCkpOworICAgICAgICAgaSAhPSBlOyArK2kpCisgICAgICBpZiAoQmxvY2tJbmZvUmVjb3Jkc1tpXS5CbG9ja0lEID09IEJsb2NrSUQpCisgICAgICAgIHJldHVybiAmQmxvY2tJbmZvUmVjb3Jkc1tpXTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIEJsb2NrSW5mbyAmZ2V0T3JDcmVhdGVCbG9ja0luZm8odW5zaWduZWQgQmxvY2tJRCkgeworICAgIGlmIChjb25zdCBCbG9ja0luZm8gKkJJID0gZ2V0QmxvY2tJbmZvKEJsb2NrSUQpKQorICAgICAgcmV0dXJuICpjb25zdF9jYXN0PEJsb2NrSW5mbyo+KEJJKTsKKworICAgIC8vIE90aGVyd2lzZSwgYWRkIGEgbmV3IHJlY29yZC4KKyAgICBCbG9ja0luZm9SZWNvcmRzLmVtcGxhY2VfYmFjaygpOworICAgIEJsb2NrSW5mb1JlY29yZHMuYmFjaygpLkJsb2NrSUQgPSBCbG9ja0lEOworICAgIHJldHVybiBCbG9ja0luZm9SZWNvcmRzLmJhY2soKTsKKyAgfQorfTsKKworLy8vIFRoaXMgcmVwcmVzZW50cyBhIHBvc2l0aW9uIHdpdGhpbiBhIGJpdHN0cmVhbS4gVGhlcmUgbWF5IGJlIG11bHRpcGxlCisvLy8gaW5kZXBlbmRlbnQgY3Vyc29ycyByZWFkaW5nIHdpdGhpbiBvbmUgYml0c3RyZWFtLCBlYWNoIG1haW50YWluaW5nIHRoZWlyCisvLy8gb3duIGxvY2FsIHN0YXRlLgorY2xhc3MgU2ltcGxlQml0c3RyZWFtQ3Vyc29yIHsKKyAgQXJyYXlSZWY8dWludDhfdD4gQml0Y29kZUJ5dGVzOworICBzaXplX3QgTmV4dENoYXIgPSAwOworCitwdWJsaWM6CisgIC8vLyBUaGlzIGlzIHRoZSBjdXJyZW50IGRhdGEgd2UgaGF2ZSBwdWxsZWQgZnJvbSB0aGUgc3RyZWFtIGJ1dCBoYXZlIG5vdAorICAvLy8gcmV0dXJuZWQgdG8gdGhlIGNsaWVudC4gVGhpcyBpcyBzcGVjaWZpY2FsbHkgYW5kIGludGVudGlvbmFsbHkgZGVmaW5lZCB0bworICAvLy8gZm9sbG93IHRoZSB3b3JkIHNpemUgb2YgdGhlIGhvc3QgbWFjaGluZSBmb3IgZWZmaWNpZW5jeS4gV2UgdXNlIHdvcmRfdCBpbgorICAvLy8gcGxhY2VzIHRoYXQgYXJlIGF3YXJlIG9mIHRoaXMgdG8gbWFrZSBpdCBwZXJmZWN0bHkgZXhwbGljaXQgd2hhdCBpcyBnb2luZworICAvLy8gb24uCisgIHVzaW5nIHdvcmRfdCA9IHNpemVfdDsKKworcHJpdmF0ZToKKyAgd29yZF90IEN1cldvcmQgPSAwOworCisgIC8vLyBUaGlzIGlzIHRoZSBudW1iZXIgb2YgYml0cyBpbiBDdXJXb3JkIHRoYXQgYXJlIHZhbGlkLiBUaGlzIGlzIGFsd2F5cyBmcm9tCisgIC8vLyBbMC4uLmJpdHNfb2Yoc2l6ZV90KS0xXSBpbmNsdXNpdmUuCisgIHVuc2lnbmVkIEJpdHNJbkN1cldvcmQgPSAwOworCitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBzaXplX3QgTWF4Q2h1bmtTaXplID0gc2l6ZW9mKHdvcmRfdCkgKiA4OworCisgIFNpbXBsZUJpdHN0cmVhbUN1cnNvcigpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgU2ltcGxlQml0c3RyZWFtQ3Vyc29yKEFycmF5UmVmPHVpbnQ4X3Q+IEJpdGNvZGVCeXRlcykKKyAgICAgIDogQml0Y29kZUJ5dGVzKEJpdGNvZGVCeXRlcykge30KKyAgZXhwbGljaXQgU2ltcGxlQml0c3RyZWFtQ3Vyc29yKFN0cmluZ1JlZiBCaXRjb2RlQnl0ZXMpCisgICAgICA6IEJpdGNvZGVCeXRlcyhyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oQml0Y29kZUJ5dGVzLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICBCaXRjb2RlQnl0ZXMuc2l6ZSgpKSB7fQorICBleHBsaWNpdCBTaW1wbGVCaXRzdHJlYW1DdXJzb3IoTWVtb3J5QnVmZmVyUmVmIEJpdGNvZGVCeXRlcykKKyAgICAgIDogU2ltcGxlQml0c3RyZWFtQ3Vyc29yKEJpdGNvZGVCeXRlcy5nZXRCdWZmZXIoKSkge30KKworICBib29sIGNhblNraXBUb1BvcyhzaXplX3QgcG9zKSBjb25zdCB7CisgICAgLy8gcG9zIGNhbiBiZSBza2lwcGVkIHRvIGlmIGl0IGlzIGEgdmFsaWQgYWRkcmVzcyBvciBvbmUgYnl0ZSBwYXN0IHRoZSBlbmQuCisgICAgcmV0dXJuIHBvcyA8PSBCaXRjb2RlQnl0ZXMuc2l6ZSgpOworICB9CisKKyAgYm9vbCBBdEVuZE9mU3RyZWFtKCkgeworICAgIHJldHVybiBCaXRzSW5DdXJXb3JkID09IDAgJiYgQml0Y29kZUJ5dGVzLnNpemUoKSA8PSBOZXh0Q2hhcjsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGJpdCAjIG9mIHRoZSBiaXQgd2UgYXJlIHJlYWRpbmcuCisgIHVpbnQ2NF90IEdldEN1cnJlbnRCaXRObygpIGNvbnN0IHsKKyAgICByZXR1cm4gTmV4dENoYXIqQ0hBUl9CSVQgLSBCaXRzSW5DdXJXb3JkOworICB9CisKKyAgLy8gUmV0dXJuIHRoZSBieXRlICMgb2YgdGhlIGN1cnJlbnQgYml0LgorICB1aW50NjRfdCBnZXRDdXJyZW50Qnl0ZU5vKCkgY29uc3QgeyByZXR1cm4gR2V0Q3VycmVudEJpdE5vKCkgLyA4OyB9CisKKyAgQXJyYXlSZWY8dWludDhfdD4gZ2V0Qml0Y29kZUJ5dGVzKCkgY29uc3QgeyByZXR1cm4gQml0Y29kZUJ5dGVzOyB9CisKKyAgLy8vIFJlc2V0IHRoZSBzdHJlYW0gdG8gdGhlIHNwZWNpZmllZCBiaXQgbnVtYmVyLgorICB2b2lkIEp1bXBUb0JpdCh1aW50NjRfdCBCaXRObykgeworICAgIHNpemVfdCBCeXRlTm8gPSBzaXplX3QoQml0Tm8vOCkgJiB+KHNpemVvZih3b3JkX3QpLTEpOworICAgIHVuc2lnbmVkIFdvcmRCaXRObyA9IHVuc2lnbmVkKEJpdE5vICYgKHNpemVvZih3b3JkX3QpKjgtMSkpOworICAgIGFzc2VydChjYW5Ta2lwVG9Qb3MoQnl0ZU5vKSAmJiAiSW52YWxpZCBsb2NhdGlvbiIpOworCisgICAgLy8gTW92ZSB0aGUgY3Vyc29yIHRvIHRoZSByaWdodCB3b3JkLgorICAgIE5leHRDaGFyID0gQnl0ZU5vOworICAgIEJpdHNJbkN1cldvcmQgPSAwOworCisgICAgLy8gU2tpcCBvdmVyIGFueSBiaXRzIHRoYXQgYXJlIGFscmVhZHkgY29uc3VtZWQuCisgICAgaWYgKFdvcmRCaXRObykKKyAgICAgIFJlYWQoV29yZEJpdE5vKTsKKyAgfQorCisgIC8vLyBHZXQgYSBwb2ludGVyIGludG8gdGhlIGJpdHN0cmVhbSBhdCB0aGUgc3BlY2lmaWVkIGJ5dGUgb2Zmc2V0LgorICBjb25zdCB1aW50OF90ICpnZXRQb2ludGVyVG9CeXRlKHVpbnQ2NF90IEJ5dGVObywgdWludDY0X3QgTnVtQnl0ZXMpIHsKKyAgICByZXR1cm4gQml0Y29kZUJ5dGVzLmRhdGEoKSArIEJ5dGVObzsKKyAgfQorCisgIC8vLyBHZXQgYSBwb2ludGVyIGludG8gdGhlIGJpdHN0cmVhbSBhdCB0aGUgc3BlY2lmaWVkIGJpdCBvZmZzZXQuCisgIC8vLworICAvLy8gVGhlIGJpdCBvZmZzZXQgbXVzdCBiZSBvbiBhIGJ5dGUgYm91bmRhcnkuCisgIGNvbnN0IHVpbnQ4X3QgKmdldFBvaW50ZXJUb0JpdCh1aW50NjRfdCBCaXRObywgdWludDY0X3QgTnVtQnl0ZXMpIHsKKyAgICBhc3NlcnQoIShCaXRObyAlIDgpICYmICJFeHBlY3RlZCBiaXQgb24gYnl0ZSBib3VuZGFyeSIpOworICAgIHJldHVybiBnZXRQb2ludGVyVG9CeXRlKEJpdE5vIC8gOCwgTnVtQnl0ZXMpOworICB9CisKKyAgdm9pZCBmaWxsQ3VyV29yZCgpIHsKKyAgICBpZiAoTmV4dENoYXIgPj0gQml0Y29kZUJ5dGVzLnNpemUoKSkKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiVW5leHBlY3RlZCBlbmQgb2YgZmlsZSIpOworCisgICAgLy8gUmVhZCB0aGUgbmV4dCB3b3JkIGZyb20gdGhlIHN0cmVhbS4KKyAgICBjb25zdCB1aW50OF90ICpOZXh0Q2hhclB0ciA9IEJpdGNvZGVCeXRlcy5kYXRhKCkgKyBOZXh0Q2hhcjsKKyAgICB1bnNpZ25lZCBCeXRlc1JlYWQ7CisgICAgaWYgKEJpdGNvZGVCeXRlcy5zaXplKCkgPj0gTmV4dENoYXIgKyBzaXplb2Yod29yZF90KSkgeworICAgICAgQnl0ZXNSZWFkID0gc2l6ZW9mKHdvcmRfdCk7CisgICAgICBDdXJXb3JkID0KKyAgICAgICAgICBzdXBwb3J0OjplbmRpYW46OnJlYWQ8d29yZF90LCBzdXBwb3J0OjpsaXR0bGUsIHN1cHBvcnQ6OnVuYWxpZ25lZD4oCisgICAgICAgICAgICAgIE5leHRDaGFyUHRyKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gU2hvcnQgcmVhZC4KKyAgICAgIEJ5dGVzUmVhZCA9IEJpdGNvZGVCeXRlcy5zaXplKCkgLSBOZXh0Q2hhcjsKKyAgICAgIEN1cldvcmQgPSAwOworICAgICAgZm9yICh1bnNpZ25lZCBCID0gMDsgQiAhPSBCeXRlc1JlYWQ7ICsrQikKKyAgICAgICAgQ3VyV29yZCB8PSB1aW50NjRfdChOZXh0Q2hhclB0cltCXSkgPDwgKEIgKiA4KTsKKyAgICB9CisgICAgTmV4dENoYXIgKz0gQnl0ZXNSZWFkOworICAgIEJpdHNJbkN1cldvcmQgPSBCeXRlc1JlYWQgKiA4OworICB9CisKKyAgd29yZF90IFJlYWQodW5zaWduZWQgTnVtQml0cykgeworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBCaXRzSW5Xb3JkID0gTWF4Q2h1bmtTaXplOworCisgICAgYXNzZXJ0KE51bUJpdHMgJiYgTnVtQml0cyA8PSBCaXRzSW5Xb3JkICYmCisgICAgICAgICAgICJDYW5ub3QgcmV0dXJuIHplcm8gb3IgbW9yZSB0aGFuIEJpdHNJbldvcmQgYml0cyEiKTsKKworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBNYXNrID0gc2l6ZW9mKHdvcmRfdCkgPiA0ID8gMHgzZiA6IDB4MWY7CisKKyAgICAvLyBJZiB0aGUgZmllbGQgaXMgZnVsbHkgY29udGFpbmVkIGJ5IEN1cldvcmQsIHJldHVybiBpdCBxdWlja2x5LgorICAgIGlmIChCaXRzSW5DdXJXb3JkID49IE51bUJpdHMpIHsKKyAgICAgIHdvcmRfdCBSID0gQ3VyV29yZCAmICh+d29yZF90KDApID4+IChCaXRzSW5Xb3JkIC0gTnVtQml0cykpOworCisgICAgICAvLyBVc2UgYSBtYXNrIHRvIGF2b2lkIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICAgIEN1cldvcmQgPj49IChOdW1CaXRzICYgTWFzayk7CisKKyAgICAgIEJpdHNJbkN1cldvcmQgLT0gTnVtQml0czsKKyAgICAgIHJldHVybiBSOworICAgIH0KKworICAgIHdvcmRfdCBSID0gQml0c0luQ3VyV29yZCA/IEN1cldvcmQgOiAwOworICAgIHVuc2lnbmVkIEJpdHNMZWZ0ID0gTnVtQml0cyAtIEJpdHNJbkN1cldvcmQ7CisKKyAgICBmaWxsQ3VyV29yZCgpOworCisgICAgLy8gSWYgd2UgcnVuIG91dCBvZiBkYXRhLCBhYm9ydC4KKyAgICBpZiAoQml0c0xlZnQgPiBCaXRzSW5DdXJXb3JkKQorICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJVbmV4cGVjdGVkIGVuZCBvZiBmaWxlIik7CisKKyAgICB3b3JkX3QgUjIgPSBDdXJXb3JkICYgKH53b3JkX3QoMCkgPj4gKEJpdHNJbldvcmQgLSBCaXRzTGVmdCkpOworCisgICAgLy8gVXNlIGEgbWFzayB0byBhdm9pZCB1bmRlZmluZWQgYmVoYXZpb3IuCisgICAgQ3VyV29yZCA+Pj0gKEJpdHNMZWZ0ICYgTWFzayk7CisKKyAgICBCaXRzSW5DdXJXb3JkIC09IEJpdHNMZWZ0OworCisgICAgUiB8PSBSMiA8PCAoTnVtQml0cyAtIEJpdHNMZWZ0KTsKKworICAgIHJldHVybiBSOworICB9CisKKyAgdWludDMyX3QgUmVhZFZCUih1bnNpZ25lZCBOdW1CaXRzKSB7CisgICAgdWludDMyX3QgUGllY2UgPSBSZWFkKE51bUJpdHMpOworICAgIGlmICgoUGllY2UgJiAoMVUgPDwgKE51bUJpdHMtMSkpKSA9PSAwKQorICAgICAgcmV0dXJuIFBpZWNlOworCisgICAgdWludDMyX3QgUmVzdWx0ID0gMDsKKyAgICB1bnNpZ25lZCBOZXh0Qml0ID0gMDsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgUmVzdWx0IHw9IChQaWVjZSAmICgoMVUgPDwgKE51bUJpdHMtMSkpLTEpKSA8PCBOZXh0Qml0OworCisgICAgICBpZiAoKFBpZWNlICYgKDFVIDw8IChOdW1CaXRzLTEpKSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIFJlc3VsdDsKKworICAgICAgTmV4dEJpdCArPSBOdW1CaXRzLTE7CisgICAgICBQaWVjZSA9IFJlYWQoTnVtQml0cyk7CisgICAgfQorICB9CisKKyAgLy8gUmVhZCBhIFZCUiB0aGF0IG1heSBoYXZlIGEgdmFsdWUgdXAgdG8gNjQtYml0cyBpbiBzaXplLiBUaGUgY2h1bmsgc2l6ZSBvZgorICAvLyB0aGUgVkJSIG11c3Qgc3RpbGwgYmUgPD0gMzIgYml0cyB0aG91Z2guCisgIHVpbnQ2NF90IFJlYWRWQlI2NCh1bnNpZ25lZCBOdW1CaXRzKSB7CisgICAgdWludDMyX3QgUGllY2UgPSBSZWFkKE51bUJpdHMpOworICAgIGlmICgoUGllY2UgJiAoMVUgPDwgKE51bUJpdHMtMSkpKSA9PSAwKQorICAgICAgcmV0dXJuIHVpbnQ2NF90KFBpZWNlKTsKKworICAgIHVpbnQ2NF90IFJlc3VsdCA9IDA7CisgICAgdW5zaWduZWQgTmV4dEJpdCA9IDA7CisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIFJlc3VsdCB8PSB1aW50NjRfdChQaWVjZSAmICgoMVUgPDwgKE51bUJpdHMtMSkpLTEpKSA8PCBOZXh0Qml0OworCisgICAgICBpZiAoKFBpZWNlICYgKDFVIDw8IChOdW1CaXRzLTEpKSkgPT0gMCkKKyAgICAgICAgcmV0dXJuIFJlc3VsdDsKKworICAgICAgTmV4dEJpdCArPSBOdW1CaXRzLTE7CisgICAgICBQaWVjZSA9IFJlYWQoTnVtQml0cyk7CisgICAgfQorICB9CisKKyAgdm9pZCBTa2lwVG9Gb3VyQnl0ZUJvdW5kYXJ5KCkgeworICAgIC8vIElmIHdvcmRfdCBpcyA2NC1iaXRzIGFuZCBpZiB3ZSd2ZSByZWFkIGxlc3MgdGhhbiAzMiBiaXRzLCBqdXN0IGR1bXAKKyAgICAvLyB0aGUgYml0cyB3ZSBoYXZlIHVwIHRvIHRoZSBuZXh0IDMyLWJpdCBib3VuZGFyeS4KKyAgICBpZiAoc2l6ZW9mKHdvcmRfdCkgPiA0ICYmCisgICAgICAgIEJpdHNJbkN1cldvcmQgPj0gMzIpIHsKKyAgICAgIEN1cldvcmQgPj49IEJpdHNJbkN1cldvcmQtMzI7CisgICAgICBCaXRzSW5DdXJXb3JkID0gMzI7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgQml0c0luQ3VyV29yZCA9IDA7CisgIH0KKworICAvLy8gU2tpcCB0byB0aGUgZW5kIG9mIHRoZSBmaWxlLgorICB2b2lkIHNraXBUb0VuZCgpIHsgTmV4dENoYXIgPSBCaXRjb2RlQnl0ZXMuc2l6ZSgpOyB9Cit9OworCisvLy8gV2hlbiBhZHZhbmNpbmcgdGhyb3VnaCBhIGJpdHN0cmVhbSBjdXJzb3IsIGVhY2ggYWR2YW5jZSBjYW4gZGlzY292ZXIgYSBmZXcKKy8vLyBkaWZmZXJlbnQga2luZHMgb2YgZW50cmllczoKK3N0cnVjdCBCaXRzdHJlYW1FbnRyeSB7CisgIGVudW0geworICAgIEVycm9yLCAgICAvLyBNYWxmb3JtZWQgYml0Y29kZSB3YXMgZm91bmQuCisgICAgRW5kQmxvY2ssIC8vIFdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBibG9jaywgKG9yIHRoZSBlbmQgb2YgdGhlCisgICAgICAgICAgICAgIC8vIGZpbGUsIHdoaWNoIGlzIHRyZWF0ZWQgbGlrZSBhIHNlcmllcyBvZiBFbmRCbG9jayByZWNvcmRzLgorICAgIFN1YkJsb2NrLCAvLyBUaGlzIGlzIHRoZSBzdGFydCBvZiBhIG5ldyBzdWJibG9jayBvZiBhIHNwZWNpZmljIElELgorICAgIFJlY29yZCAgICAvLyBUaGlzIGlzIGEgcmVjb3JkIHdpdGggYSBzcGVjaWZpYyBBYmJyZXZJRC4KKyAgfSBLaW5kOworCisgIHVuc2lnbmVkIElEOworCisgIHN0YXRpYyBCaXRzdHJlYW1FbnRyeSBnZXRFcnJvcigpIHsKKyAgICBCaXRzdHJlYW1FbnRyeSBFOyBFLktpbmQgPSBFcnJvcjsgcmV0dXJuIEU7CisgIH0KKworICBzdGF0aWMgQml0c3RyZWFtRW50cnkgZ2V0RW5kQmxvY2soKSB7CisgICAgQml0c3RyZWFtRW50cnkgRTsgRS5LaW5kID0gRW5kQmxvY2s7IHJldHVybiBFOworICB9CisKKyAgc3RhdGljIEJpdHN0cmVhbUVudHJ5IGdldFN1YkJsb2NrKHVuc2lnbmVkIElEKSB7CisgICAgQml0c3RyZWFtRW50cnkgRTsgRS5LaW5kID0gU3ViQmxvY2s7IEUuSUQgPSBJRDsgcmV0dXJuIEU7CisgIH0KKworICBzdGF0aWMgQml0c3RyZWFtRW50cnkgZ2V0UmVjb3JkKHVuc2lnbmVkIEFiYnJldklEKSB7CisgICAgQml0c3RyZWFtRW50cnkgRTsgRS5LaW5kID0gUmVjb3JkOyBFLklEID0gQWJicmV2SUQ7IHJldHVybiBFOworICB9Cit9OworCisvLy8gVGhpcyByZXByZXNlbnRzIGEgcG9zaXRpb24gd2l0aGluIGEgYml0Y29kZSBmaWxlLCBpbXBsZW1lbnRlZCBvbiB0b3Agb2YgYQorLy8vIFNpbXBsZUJpdHN0cmVhbUN1cnNvci4KKy8vLworLy8vIFVubGlrZSBpdGVyYXRvcnMsIEJpdHN0cmVhbUN1cnNvcnMgYXJlIGhlYXZ5LXdlaWdodCBvYmplY3RzIHRoYXQgc2hvdWxkIG5vdAorLy8vIGJlIHBhc3NlZCBieSB2YWx1ZS4KK2NsYXNzIEJpdHN0cmVhbUN1cnNvciA6IFNpbXBsZUJpdHN0cmVhbUN1cnNvciB7CisgIC8vIFRoaXMgaXMgdGhlIGRlY2xhcmVkIHNpemUgb2YgY29kZSB2YWx1ZXMgdXNlZCBmb3IgdGhlIGN1cnJlbnQgYmxvY2ssIGluCisgIC8vIGJpdHMuCisgIHVuc2lnbmVkIEN1ckNvZGVTaXplID0gMjsKKworICAvLy8gQWJicmV2cyBpbnN0YWxsZWQgYXQgaW4gdGhpcyBibG9jay4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEJpdENvZGVBYmJyZXY+PiBDdXJBYmJyZXZzOworCisgIHN0cnVjdCBCbG9jayB7CisgICAgdW5zaWduZWQgUHJldkNvZGVTaXplOworICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c2hhcmVkX3B0cjxCaXRDb2RlQWJicmV2Pj4gUHJldkFiYnJldnM7CisKKyAgICBleHBsaWNpdCBCbG9jayh1bnNpZ25lZCBQQ1MpIDogUHJldkNvZGVTaXplKFBDUykge30KKyAgfTsKKworICAvLy8gVGhpcyB0cmFja3MgdGhlIGNvZGVzaXplIG9mIHBhcmVudCBibG9ja3MuCisgIFNtYWxsVmVjdG9yPEJsb2NrLCA4PiBCbG9ja1Njb3BlOworCisgIEJpdHN0cmVhbUJsb2NrSW5mbyAqQmxvY2tJbmZvID0gbnVsbHB0cjsKKworcHVibGljOgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IE1heENodW5rU2l6ZSA9IHNpemVvZih3b3JkX3QpICogODsKKworICBCaXRzdHJlYW1DdXJzb3IoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IEJpdHN0cmVhbUN1cnNvcihBcnJheVJlZjx1aW50OF90PiBCaXRjb2RlQnl0ZXMpCisgICAgICA6IFNpbXBsZUJpdHN0cmVhbUN1cnNvcihCaXRjb2RlQnl0ZXMpIHt9CisgIGV4cGxpY2l0IEJpdHN0cmVhbUN1cnNvcihTdHJpbmdSZWYgQml0Y29kZUJ5dGVzKQorICAgICAgOiBTaW1wbGVCaXRzdHJlYW1DdXJzb3IoQml0Y29kZUJ5dGVzKSB7fQorICBleHBsaWNpdCBCaXRzdHJlYW1DdXJzb3IoTWVtb3J5QnVmZmVyUmVmIEJpdGNvZGVCeXRlcykKKyAgICAgIDogU2ltcGxlQml0c3RyZWFtQ3Vyc29yKEJpdGNvZGVCeXRlcykge30KKworICB1c2luZyBTaW1wbGVCaXRzdHJlYW1DdXJzb3I6OmNhblNraXBUb1BvczsKKyAgdXNpbmcgU2ltcGxlQml0c3RyZWFtQ3Vyc29yOjpBdEVuZE9mU3RyZWFtOworICB1c2luZyBTaW1wbGVCaXRzdHJlYW1DdXJzb3I6OmdldEJpdGNvZGVCeXRlczsKKyAgdXNpbmcgU2ltcGxlQml0c3RyZWFtQ3Vyc29yOjpHZXRDdXJyZW50Qml0Tm87CisgIHVzaW5nIFNpbXBsZUJpdHN0cmVhbUN1cnNvcjo6Z2V0Q3VycmVudEJ5dGVObzsKKyAgdXNpbmcgU2ltcGxlQml0c3RyZWFtQ3Vyc29yOjpnZXRQb2ludGVyVG9CeXRlOworICB1c2luZyBTaW1wbGVCaXRzdHJlYW1DdXJzb3I6Okp1bXBUb0JpdDsKKyAgdXNpbmcgU2ltcGxlQml0c3RyZWFtQ3Vyc29yOjpmaWxsQ3VyV29yZDsKKyAgdXNpbmcgU2ltcGxlQml0c3RyZWFtQ3Vyc29yOjpSZWFkOworICB1c2luZyBTaW1wbGVCaXRzdHJlYW1DdXJzb3I6OlJlYWRWQlI7CisgIHVzaW5nIFNpbXBsZUJpdHN0cmVhbUN1cnNvcjo6UmVhZFZCUjY0OworCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIHVzZWQgdG8gZW5jb2RlIGFuIGFiYnJldiAjLgorICB1bnNpZ25lZCBnZXRBYmJyZXZJRFdpZHRoKCkgY29uc3QgeyByZXR1cm4gQ3VyQ29kZVNpemU7IH0KKworICAvLy8gRmxhZ3MgdGhhdCBtb2RpZnkgdGhlIGJlaGF2aW9yIG9mIGFkdmFuY2UoKS4KKyAgZW51bSB7CisgICAgLy8vIElmIHRoaXMgZmxhZyBpcyB1c2VkLCB0aGUgYWR2YW5jZSgpIG1ldGhvZCBkb2VzIG5vdCBhdXRvbWF0aWNhbGx5IHBvcAorICAgIC8vLyB0aGUgYmxvY2sgc2NvcGUgd2hlbiB0aGUgZW5kIG9mIGEgYmxvY2sgaXMgcmVhY2hlZC4KKyAgICBBRl9Eb250UG9wQmxvY2tBdEVuZCA9IDEsCisKKyAgICAvLy8gSWYgdGhpcyBmbGFnIGlzIHVzZWQsIGFiYnJldiBlbnRyaWVzIGFyZSByZXR1cm5lZCBqdXN0IGxpa2Ugbm9ybWFsCisgICAgLy8vIHJlY29yZHMuCisgICAgQUZfRG9udEF1dG9wcm9jZXNzQWJicmV2cyA9IDIKKyAgfTsKKworICAvLy8gQWR2YW5jZSB0aGUgY3VycmVudCBiaXRzdHJlYW0sIHJldHVybmluZyB0aGUgbmV4dCBlbnRyeSBpbiB0aGUgc3RyZWFtLgorICBCaXRzdHJlYW1FbnRyeSBhZHZhbmNlKHVuc2lnbmVkIEZsYWdzID0gMCkgeworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBpZiAoQXRFbmRPZlN0cmVhbSgpKQorICAgICAgICByZXR1cm4gQml0c3RyZWFtRW50cnk6OmdldEVycm9yKCk7CisKKyAgICAgIHVuc2lnbmVkIENvZGUgPSBSZWFkQ29kZSgpOworICAgICAgaWYgKENvZGUgPT0gYml0Yzo6RU5EX0JMT0NLKSB7CisgICAgICAgIC8vIFBvcCB0aGUgZW5kIG9mIHRoZSBibG9jayB1bmxlc3MgRmxhZ3MgdGVsbHMgdXMgbm90IHRvLgorICAgICAgICBpZiAoIShGbGFncyAmIEFGX0RvbnRQb3BCbG9ja0F0RW5kKSAmJiBSZWFkQmxvY2tFbmQoKSkKKyAgICAgICAgICByZXR1cm4gQml0c3RyZWFtRW50cnk6OmdldEVycm9yKCk7CisgICAgICAgIHJldHVybiBCaXRzdHJlYW1FbnRyeTo6Z2V0RW5kQmxvY2soKTsKKyAgICAgIH0KKworICAgICAgaWYgKENvZGUgPT0gYml0Yzo6RU5URVJfU1VCQkxPQ0spCisgICAgICAgIHJldHVybiBCaXRzdHJlYW1FbnRyeTo6Z2V0U3ViQmxvY2soUmVhZFN1YkJsb2NrSUQoKSk7CisKKyAgICAgIGlmIChDb2RlID09IGJpdGM6OkRFRklORV9BQkJSRVYgJiYKKyAgICAgICAgICAhKEZsYWdzICYgQUZfRG9udEF1dG9wcm9jZXNzQWJicmV2cykpIHsKKyAgICAgICAgLy8gV2UgcmVhZCBhbmQgYWNjdW11bGF0ZSBhYmJyZXYncywgdGhlIGNsaWVudCBjYW4ndCBkbyBhbnl0aGluZyB3aXRoCisgICAgICAgIC8vIHRoZW0gYW55d2F5LgorICAgICAgICBSZWFkQWJicmV2UmVjb3JkKCk7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICByZXR1cm4gQml0c3RyZWFtRW50cnk6OmdldFJlY29yZChDb2RlKTsKKyAgICB9CisgIH0KKworICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBjbGllbnRzIHRoYXQgZG9uJ3QgZXhwZWN0IGFueQorICAvLy8gc3ViYmxvY2tzLiBUaGlzIGp1c3Qgc2tpcHMgb3ZlciB0aGVtIGF1dG9tYXRpY2FsbHkuCisgIEJpdHN0cmVhbUVudHJ5IGFkdmFuY2VTa2lwcGluZ1N1YmJsb2Nrcyh1bnNpZ25lZCBGbGFncyA9IDApIHsKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgLy8gSWYgd2UgZm91bmQgYSBub3JtYWwgZW50cnksIHJldHVybiBpdC4KKyAgICAgIEJpdHN0cmVhbUVudHJ5IEVudHJ5ID0gYWR2YW5jZShGbGFncyk7CisgICAgICBpZiAoRW50cnkuS2luZCAhPSBCaXRzdHJlYW1FbnRyeTo6U3ViQmxvY2spCisgICAgICAgIHJldHVybiBFbnRyeTsKKworICAgICAgLy8gSWYgd2UgZm91bmQgYSBzdWItYmxvY2ssIGp1c3Qgc2tpcCBvdmVyIGl0IGFuZCBjaGVjayB0aGUgbmV4dCBlbnRyeS4KKyAgICAgIGlmIChTa2lwQmxvY2soKSkKKyAgICAgICAgcmV0dXJuIEJpdHN0cmVhbUVudHJ5OjpnZXRFcnJvcigpOworICAgIH0KKyAgfQorCisgIHVuc2lnbmVkIFJlYWRDb2RlKCkgeworICAgIHJldHVybiBSZWFkKEN1ckNvZGVTaXplKTsKKyAgfQorCisgIC8vIEJsb2NrIGhlYWRlcjoKKyAgLy8gICAgW0VOVEVSX1NVQkJMT0NLLCBibG9ja2lkLCBuZXdjb2RlbGVuLCA8YWxpZ240Ynl0ZXM+LCBibG9ja2xlbl0KKworICAvLy8gSGF2aW5nIHJlYWQgdGhlIEVOVEVSX1NVQkJMT0NLIGNvZGUsIHJlYWQgdGhlIEJsb2NrSUQgZm9yIHRoZSBibG9jay4KKyAgdW5zaWduZWQgUmVhZFN1YkJsb2NrSUQoKSB7CisgICAgcmV0dXJuIFJlYWRWQlIoYml0Yzo6QmxvY2tJRFdpZHRoKTsKKyAgfQorCisgIC8vLyBIYXZpbmcgcmVhZCB0aGUgRU5URVJfU1VCQkxPQ0sgYWJicmV2aWQgYW5kIGEgQmxvY2tJRCwgc2tpcCBvdmVyIHRoZSBib2R5CisgIC8vLyBvZiB0aGlzIGJsb2NrLiBJZiB0aGUgYmxvY2sgcmVjb3JkIGlzIG1hbGZvcm1lZCwgcmV0dXJuIHRydWUuCisgIGJvb2wgU2tpcEJsb2NrKCkgeworICAgIC8vIFJlYWQgYW5kIGlnbm9yZSB0aGUgY29kZWxlbiB2YWx1ZS4gIFNpbmNlIHdlIGFyZSBza2lwcGluZyB0aGlzIGJsb2NrLCB3ZQorICAgIC8vIGRvbid0IGNhcmUgd2hhdCBjb2RlIHdpZHRocyBhcmUgdXNlZCBpbnNpZGUgb2YgaXQuCisgICAgUmVhZFZCUihiaXRjOjpDb2RlTGVuV2lkdGgpOworICAgIFNraXBUb0ZvdXJCeXRlQm91bmRhcnkoKTsKKyAgICB1bnNpZ25lZCBOdW1Gb3VyQnl0ZXMgPSBSZWFkKGJpdGM6OkJsb2NrU2l6ZVdpZHRoKTsKKworICAgIC8vIENoZWNrIHRoYXQgdGhlIGJsb2NrIHdhc24ndCBwYXJ0aWFsbHkgZGVmaW5lZCwgYW5kIHRoYXQgdGhlIG9mZnNldCBpc24ndAorICAgIC8vIGJvZ3VzLgorICAgIHNpemVfdCBTa2lwVG8gPSBHZXRDdXJyZW50Qml0Tm8oKSArIE51bUZvdXJCeXRlcyo0Kjg7CisgICAgaWYgKEF0RW5kT2ZTdHJlYW0oKSB8fCAhY2FuU2tpcFRvUG9zKFNraXBUby84KSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgSnVtcFRvQml0KFNraXBUbyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIEhhdmluZyByZWFkIHRoZSBFTlRFUl9TVUJCTE9DSyBhYmJyZXZpZCwgZW50ZXIgdGhlIGJsb2NrLCBhbmQgcmV0dXJuIHRydWUKKyAgLy8vIGlmIHRoZSBibG9jayBoYXMgYW4gZXJyb3IuCisgIGJvb2wgRW50ZXJTdWJCbG9jayh1bnNpZ25lZCBCbG9ja0lELCB1bnNpZ25lZCAqTnVtV29yZHNQID0gbnVsbHB0cik7CisKKyAgYm9vbCBSZWFkQmxvY2tFbmQoKSB7CisgICAgaWYgKEJsb2NrU2NvcGUuZW1wdHkoKSkgcmV0dXJuIHRydWU7CisKKyAgICAvLyBCbG9jayB0YWlsOgorICAgIC8vICAgIFtFTkRfQkxPQ0ssIDxhbGlnbjRieXRlcz5dCisgICAgU2tpcFRvRm91ckJ5dGVCb3VuZGFyeSgpOworCisgICAgcG9wQmxvY2tTY29wZSgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIHBvcEJsb2NrU2NvcGUoKSB7CisgICAgQ3VyQ29kZVNpemUgPSBCbG9ja1Njb3BlLmJhY2soKS5QcmV2Q29kZVNpemU7CisKKyAgICBDdXJBYmJyZXZzID0gc3RkOjptb3ZlKEJsb2NrU2NvcGUuYmFjaygpLlByZXZBYmJyZXZzKTsKKyAgICBCbG9ja1Njb3BlLnBvcF9iYWNrKCk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUmVjb3JkIFByb2Nlc3NpbmcKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3B1YmxpYzoKKyAgLy8vIFJldHVybiB0aGUgYWJicmV2aWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIEFiYnJldklkLgorICBjb25zdCBCaXRDb2RlQWJicmV2ICpnZXRBYmJyZXYodW5zaWduZWQgQWJicmV2SUQpIHsKKyAgICB1bnNpZ25lZCBBYmJyZXZObyA9IEFiYnJldklEIC0gYml0Yzo6RklSU1RfQVBQTElDQVRJT05fQUJCUkVWOworICAgIGlmIChBYmJyZXZObyA+PSBDdXJBYmJyZXZzLnNpemUoKSkKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiSW52YWxpZCBhYmJyZXYgbnVtYmVyIik7CisgICAgcmV0dXJuIEN1ckFiYnJldnNbQWJicmV2Tm9dLmdldCgpOworICB9CisKKyAgLy8vIFJlYWQgdGhlIGN1cnJlbnQgcmVjb3JkIGFuZCBkaXNjYXJkIGl0LCByZXR1cm5pbmcgdGhlIGNvZGUgZm9yIHRoZSByZWNvcmQuCisgIHVuc2lnbmVkIHNraXBSZWNvcmQodW5zaWduZWQgQWJicmV2SUQpOworCisgIHVuc2lnbmVkIHJlYWRSZWNvcmQodW5zaWduZWQgQWJicmV2SUQsIFNtYWxsVmVjdG9ySW1wbDx1aW50NjRfdD4gJlZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmICpCbG9iID0gbnVsbHB0cik7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEFiYnJldiBQcm9jZXNzaW5nCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICB2b2lkIFJlYWRBYmJyZXZSZWNvcmQoKTsKKworICAvLy8gUmVhZCBhbmQgcmV0dXJuIGEgYmxvY2sgaW5mbyBibG9jayBmcm9tIHRoZSBiaXRzdHJlYW0uIElmIGFuIGVycm9yIHdhcworICAvLy8gZW5jb3VudGVyZWQsIHJldHVybiBOb25lLgorICAvLy8KKyAgLy8vIFxwYXJhbSBSZWFkQmxvY2tJbmZvTmFtZXMgV2hldGhlciB0byByZWFkIGJsb2NrL3JlY29yZCBuYW1lIGluZm9ybWF0aW9uIGluCisgIC8vLyB0aGUgQmxvY2tJbmZvIGJsb2NrLiBPbmx5IGxsdm0tYmNhbmFseXplciB1c2VzIHRoaXMuCisgIE9wdGlvbmFsPEJpdHN0cmVhbUJsb2NrSW5mbz4KKyAgUmVhZEJsb2NrSW5mb0Jsb2NrKGJvb2wgUmVhZEJsb2NrSW5mb05hbWVzID0gZmFsc2UpOworCisgIC8vLyBTZXQgdGhlIGJsb2NrIGluZm8gdG8gYmUgdXNlZCBieSB0aGlzIEJpdHN0cmVhbUN1cnNvciB0byBpbnRlcnByZXQKKyAgLy8vIGFiYnJldmlhdGVkIHJlY29yZHMuCisgIHZvaWQgc2V0QmxvY2tJbmZvKEJpdHN0cmVhbUJsb2NrSW5mbyAqQkkpIHsgQmxvY2tJbmZvID0gQkk7IH0KK307CisKK30gLy8gZW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBMTFZNX0JJVENPREVfQklUU1RSRUFNUkVBREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQml0Y29kZS9CaXRzdHJlYW1Xcml0ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQml0Y29kZS9CaXRzdHJlYW1Xcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjc2ZGI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0JpdHN0cmVhbVdyaXRlci5oCkBAIC0wLDAgKzEsNTUwIEBACisvLz09PS0gQml0c3RyZWFtV3JpdGVyLmggLSBMb3ctbGV2ZWwgYml0c3RyZWFtIHdyaXRlciBpbnRlcmZhY2UgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIGRlZmluZXMgdGhlIEJpdHN0cmVhbVdyaXRlciBjbGFzcy4gIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8KKy8vIHdyaXRlIGFuIGFyYml0cmFyeSBiaXRzdHJlYW0sIHJlZ2FyZGxlc3Mgb2YgaXRzIGNvbnRlbnRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9CSVRDT0RFX0JJVFNUUkVBTVdSSVRFUl9ICisjZGVmaW5lIExMVk1fQklUQ09ERV9CSVRTVFJFQU1XUklURVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9CaXRjb2RlL0JpdENvZGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCaXRzdHJlYW1Xcml0ZXIgeworICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJk91dDsKKworICAvLy8gQ3VyQml0IC0gQWx3YXlzIGJldHdlZW4gMCBhbmQgMzEgaW5jbHVzaXZlLCBzcGVjaWZpZXMgdGhlIG5leHQgYml0IHRvIHVzZS4KKyAgdW5zaWduZWQgQ3VyQml0OworCisgIC8vLyBDdXJWYWx1ZSAtIFRoZSBjdXJyZW50IHZhbHVlLiAgT25seSBiaXRzIDwgQ3VyQml0IGFyZSB2YWxpZC4KKyAgdWludDMyX3QgQ3VyVmFsdWU7CisKKyAgLy8vIEN1ckNvZGVTaXplIC0gVGhpcyBpcyB0aGUgZGVjbGFyZWQgc2l6ZSBvZiBjb2RlIHZhbHVlcyB1c2VkIGZvciB0aGUKKyAgLy8vIGN1cnJlbnQgYmxvY2ssIGluIGJpdHMuCisgIHVuc2lnbmVkIEN1ckNvZGVTaXplOworCisgIC8vLyBCbG9ja0luZm9DdXJCSUQgLSBXaGVuIGVtaXR0aW5nIGEgQkxPQ0tJTkZPX0JMT0NLLCB0aGlzIGlzIHRoZSBjdXJyZW50bHkKKyAgLy8vIHNlbGVjdGVkIEJMT0NLIElELgorICB1bnNpZ25lZCBCbG9ja0luZm9DdXJCSUQ7CisKKyAgLy8vIEN1ckFiYnJldnMgLSBBYmJyZXZzIGluc3RhbGxlZCBhdCBpbiB0aGlzIGJsb2NrLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnNoYXJlZF9wdHI8Qml0Q29kZUFiYnJldj4+IEN1ckFiYnJldnM7CisKKyAgc3RydWN0IEJsb2NrIHsKKyAgICB1bnNpZ25lZCBQcmV2Q29kZVNpemU7CisgICAgc2l6ZV90IFN0YXJ0U2l6ZVdvcmQ7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEJpdENvZGVBYmJyZXY+PiBQcmV2QWJicmV2czsKKyAgICBCbG9jayh1bnNpZ25lZCBQQ1MsIHNpemVfdCBTU1cpIDogUHJldkNvZGVTaXplKFBDUyksIFN0YXJ0U2l6ZVdvcmQoU1NXKSB7fQorICB9OworCisgIC8vLyBCbG9ja1Njb3BlIC0gVGhpcyB0cmFja3MgdGhlIGN1cnJlbnQgYmxvY2tzIHRoYXQgd2UgaGF2ZSBlbnRlcmVkLgorICBzdGQ6OnZlY3RvcjxCbG9jaz4gQmxvY2tTY29wZTsKKworICAvLy8gQmxvY2tJbmZvIC0gVGhpcyBjb250YWlucyBpbmZvcm1hdGlvbiBlbWl0dGVkIHRvIEJMT0NLSU5GT19CTE9DSyBibG9ja3MuCisgIC8vLyBUaGVzZSBkZXNjcmliZSBhYmJyZXZpYXRpb25zIHRoYXQgYWxsIGJsb2NrcyBvZiB0aGUgc3BlY2lmaWVkIElEIGluaGVyaXQuCisgIHN0cnVjdCBCbG9ja0luZm8geworICAgIHVuc2lnbmVkIEJsb2NrSUQ7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEJpdENvZGVBYmJyZXY+PiBBYmJyZXZzOworICB9OworICBzdGQ6OnZlY3RvcjxCbG9ja0luZm8+IEJsb2NrSW5mb1JlY29yZHM7CisKKyAgdm9pZCBXcml0ZUJ5dGUodW5zaWduZWQgY2hhciBWYWx1ZSkgeworICAgIE91dC5wdXNoX2JhY2soVmFsdWUpOworICB9CisKKyAgdm9pZCBXcml0ZVdvcmQodW5zaWduZWQgVmFsdWUpIHsKKyAgICBWYWx1ZSA9IHN1cHBvcnQ6OmVuZGlhbjo6Ynl0ZV9zd2FwPHVpbnQzMl90LCBzdXBwb3J0OjpsaXR0bGU+KFZhbHVlKTsKKyAgICBPdXQuYXBwZW5kKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhciAqPigmVmFsdWUpLAorICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZWYWx1ZSArIDEpKTsKKyAgfQorCisgIHNpemVfdCBHZXRCdWZmZXJPZmZzZXQoKSBjb25zdCB7IHJldHVybiBPdXQuc2l6ZSgpOyB9CisKKyAgc2l6ZV90IEdldFdvcmRJbmRleCgpIGNvbnN0IHsKKyAgICBzaXplX3QgT2Zmc2V0ID0gR2V0QnVmZmVyT2Zmc2V0KCk7CisgICAgYXNzZXJ0KChPZmZzZXQgJiAzKSA9PSAwICYmICJOb3QgMzItYml0IGFsaWduZWQiKTsKKyAgICByZXR1cm4gT2Zmc2V0IC8gNDsKKyAgfQorCitwdWJsaWM6CisgIGV4cGxpY2l0IEJpdHN0cmVhbVdyaXRlcihTbWFsbFZlY3RvckltcGw8Y2hhcj4gJk8pCisgICAgOiBPdXQoTyksIEN1ckJpdCgwKSwgQ3VyVmFsdWUoMCksIEN1ckNvZGVTaXplKDIpIHt9CisKKyAgfkJpdHN0cmVhbVdyaXRlcigpIHsKKyAgICBhc3NlcnQoQ3VyQml0ID09IDAgJiYgIlVuZmx1c2hlZCBkYXRhIHJlbWFpbmluZyIpOworICAgIGFzc2VydChCbG9ja1Njb3BlLmVtcHR5KCkgJiYgQ3VyQWJicmV2cy5lbXB0eSgpICYmICJCbG9jayBpbWJhbGFuY2UiKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHN0cmVhbSwgaW4gYml0cy4KKyAgdWludDY0X3QgR2V0Q3VycmVudEJpdE5vKCkgY29uc3QgeyByZXR1cm4gR2V0QnVmZmVyT2Zmc2V0KCkgKiA4ICsgQ3VyQml0OyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIGJpdHMgY3VycmVudGx5IHVzZWQgdG8gZW5jb2RlIGFuIGFiYnJldiBJRC4KKyAgdW5zaWduZWQgR2V0QWJicmV2SURXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIEN1ckNvZGVTaXplOyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEJhc2ljIFByaW1pdGl2ZXMgZm9yIGVtaXR0aW5nIGJpdHMgdG8gdGhlIHN0cmVhbS4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIEJhY2twYXRjaCBhIDMyLWJpdCB3b3JkIGluIHRoZSBvdXRwdXQgYXQgdGhlIGdpdmVuIGJpdCBvZmZzZXQKKyAgLy8vIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgdm9pZCBCYWNrcGF0Y2hXb3JkKHVpbnQ2NF90IEJpdE5vLCB1bnNpZ25lZCBOZXdXb3JkKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN1cHBvcnQ7CisgICAgdW5zaWduZWQgQnl0ZU5vID0gQml0Tm8gLyA4OworICAgIGFzc2VydCgoIWVuZGlhbjo6cmVhZEF0Qml0QWxpZ25tZW50PHVpbnQzMl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oCisgICAgICAgICAgICAgICAmT3V0W0J5dGVOb10sIEJpdE5vICYgNykpICYmCisgICAgICAgICAgICJFeHBlY3RlZCB0byBiZSBwYXRjaGluZyBvdmVyIDAtdmFsdWUgcGxhY2Vob2xkZXJzIik7CisgICAgZW5kaWFuOjp3cml0ZUF0Qml0QWxpZ25tZW50PHVpbnQzMl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oCisgICAgICAgICZPdXRbQnl0ZU5vXSwgTmV3V29yZCwgQml0Tm8gJiA3KTsKKyAgfQorCisgIHZvaWQgQmFja3BhdGNoV29yZDY0KHVpbnQ2NF90IEJpdE5vLCB1aW50NjRfdCBWYWwpIHsKKyAgICBCYWNrcGF0Y2hXb3JkKEJpdE5vLCAodWludDMyX3QpVmFsKTsKKyAgICBCYWNrcGF0Y2hXb3JkKEJpdE5vICsgMzIsICh1aW50MzJfdCkoVmFsID4+IDMyKSk7CisgIH0KKworICB2b2lkIEVtaXQodWludDMyX3QgVmFsLCB1bnNpZ25lZCBOdW1CaXRzKSB7CisgICAgYXNzZXJ0KE51bUJpdHMgJiYgTnVtQml0cyA8PSAzMiAmJiAiSW52YWxpZCB2YWx1ZSBzaXplISIpOworICAgIGFzc2VydCgoVmFsICYgfih+MFUgPj4gKDMyLU51bUJpdHMpKSkgPT0gMCAmJiAiSGlnaCBiaXRzIHNldCEiKTsKKyAgICBDdXJWYWx1ZSB8PSBWYWwgPDwgQ3VyQml0OworICAgIGlmIChDdXJCaXQgKyBOdW1CaXRzIDwgMzIpIHsKKyAgICAgIEN1ckJpdCArPSBOdW1CaXRzOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIEFkZCB0aGUgY3VycmVudCB3b3JkLgorICAgIFdyaXRlV29yZChDdXJWYWx1ZSk7CisKKyAgICBpZiAoQ3VyQml0KQorICAgICAgQ3VyVmFsdWUgPSBWYWwgPj4gKDMyLUN1ckJpdCk7CisgICAgZWxzZQorICAgICAgQ3VyVmFsdWUgPSAwOworICAgIEN1ckJpdCA9IChDdXJCaXQrTnVtQml0cykgJiAzMTsKKyAgfQorCisgIHZvaWQgRmx1c2hUb1dvcmQoKSB7CisgICAgaWYgKEN1ckJpdCkgeworICAgICAgV3JpdGVXb3JkKEN1clZhbHVlKTsKKyAgICAgIEN1ckJpdCA9IDA7CisgICAgICBDdXJWYWx1ZSA9IDA7CisgICAgfQorICB9CisKKyAgdm9pZCBFbWl0VkJSKHVpbnQzMl90IFZhbCwgdW5zaWduZWQgTnVtQml0cykgeworICAgIGFzc2VydChOdW1CaXRzIDw9IDMyICYmICJUb28gbWFueSBiaXRzIHRvIGVtaXQhIik7CisgICAgdWludDMyX3QgVGhyZXNob2xkID0gMVUgPDwgKE51bUJpdHMtMSk7CisKKyAgICAvLyBFbWl0IHRoZSBiaXRzIHdpdGggVkJSIGVuY29kaW5nLCBOdW1CaXRzLTEgYml0cyBhdCBhIHRpbWUuCisgICAgd2hpbGUgKFZhbCA+PSBUaHJlc2hvbGQpIHsKKyAgICAgIEVtaXQoKFZhbCAmICgoMSA8PCAoTnVtQml0cy0xKSktMSkpIHwgKDEgPDwgKE51bUJpdHMtMSkpLCBOdW1CaXRzKTsKKyAgICAgIFZhbCA+Pj0gTnVtQml0cy0xOworICAgIH0KKworICAgIEVtaXQoVmFsLCBOdW1CaXRzKTsKKyAgfQorCisgIHZvaWQgRW1pdFZCUjY0KHVpbnQ2NF90IFZhbCwgdW5zaWduZWQgTnVtQml0cykgeworICAgIGFzc2VydChOdW1CaXRzIDw9IDMyICYmICJUb28gbWFueSBiaXRzIHRvIGVtaXQhIik7CisgICAgaWYgKCh1aW50MzJfdClWYWwgPT0gVmFsKQorICAgICAgcmV0dXJuIEVtaXRWQlIoKHVpbnQzMl90KVZhbCwgTnVtQml0cyk7CisKKyAgICB1aW50MzJfdCBUaHJlc2hvbGQgPSAxVSA8PCAoTnVtQml0cy0xKTsKKworICAgIC8vIEVtaXQgdGhlIGJpdHMgd2l0aCBWQlIgZW5jb2RpbmcsIE51bUJpdHMtMSBiaXRzIGF0IGEgdGltZS4KKyAgICB3aGlsZSAoVmFsID49IFRocmVzaG9sZCkgeworICAgICAgRW1pdCgoKHVpbnQzMl90KVZhbCAmICgoMSA8PCAoTnVtQml0cy0xKSktMSkpIHwKKyAgICAgICAgICAgKDEgPDwgKE51bUJpdHMtMSkpLCBOdW1CaXRzKTsKKyAgICAgIFZhbCA+Pj0gTnVtQml0cy0xOworICAgIH0KKworICAgIEVtaXQoKHVpbnQzMl90KVZhbCwgTnVtQml0cyk7CisgIH0KKworICAvLy8gRW1pdENvZGUgLSBFbWl0IHRoZSBzcGVjaWZpZWQgY29kZS4KKyAgdm9pZCBFbWl0Q29kZSh1bnNpZ25lZCBWYWwpIHsKKyAgICBFbWl0KFZhbCwgQ3VyQ29kZVNpemUpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEJsb2NrIE1hbmlwdWxhdGlvbgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gZ2V0QmxvY2tJbmZvIC0gSWYgdGhlcmUgaXMgYmxvY2sgaW5mbyBmb3IgdGhlIHNwZWNpZmllZCBJRCwgcmV0dXJuIGl0LAorICAvLy8gb3RoZXJ3aXNlIHJldHVybiBudWxsLgorICBCbG9ja0luZm8gKmdldEJsb2NrSW5mbyh1bnNpZ25lZCBCbG9ja0lEKSB7CisgICAgLy8gQ29tbW9uIGNhc2UsIHRoZSBtb3N0IHJlY2VudCBlbnRyeSBtYXRjaGVzIEJsb2NrSUQuCisgICAgaWYgKCFCbG9ja0luZm9SZWNvcmRzLmVtcHR5KCkgJiYgQmxvY2tJbmZvUmVjb3Jkcy5iYWNrKCkuQmxvY2tJRCA9PSBCbG9ja0lEKQorICAgICAgcmV0dXJuICZCbG9ja0luZm9SZWNvcmRzLmJhY2soKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oQmxvY2tJbmZvUmVjb3Jkcy5zaXplKCkpOworICAgICAgICAgaSAhPSBlOyArK2kpCisgICAgICBpZiAoQmxvY2tJbmZvUmVjb3Jkc1tpXS5CbG9ja0lEID09IEJsb2NrSUQpCisgICAgICAgIHJldHVybiAmQmxvY2tJbmZvUmVjb3Jkc1tpXTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHZvaWQgRW50ZXJTdWJibG9jayh1bnNpZ25lZCBCbG9ja0lELCB1bnNpZ25lZCBDb2RlTGVuKSB7CisgICAgLy8gQmxvY2sgaGVhZGVyOgorICAgIC8vICAgIFtFTlRFUl9TVUJCTE9DSywgYmxvY2tpZCwgbmV3Y29kZWxlbiwgPGFsaWduNGJ5dGVzPiwgYmxvY2tsZW5dCisgICAgRW1pdENvZGUoYml0Yzo6RU5URVJfU1VCQkxPQ0spOworICAgIEVtaXRWQlIoQmxvY2tJRCwgYml0Yzo6QmxvY2tJRFdpZHRoKTsKKyAgICBFbWl0VkJSKENvZGVMZW4sIGJpdGM6OkNvZGVMZW5XaWR0aCk7CisgICAgRmx1c2hUb1dvcmQoKTsKKworICAgIHNpemVfdCBCbG9ja1NpemVXb3JkSW5kZXggPSBHZXRXb3JkSW5kZXgoKTsKKyAgICB1bnNpZ25lZCBPbGRDb2RlU2l6ZSA9IEN1ckNvZGVTaXplOworCisgICAgLy8gRW1pdCBhIHBsYWNlaG9sZGVyLCB3aGljaCB3aWxsIGJlIHJlcGxhY2VkIHdoZW4gdGhlIGJsb2NrIGlzIHBvcHBlZC4KKyAgICBFbWl0KDAsIGJpdGM6OkJsb2NrU2l6ZVdpZHRoKTsKKworICAgIEN1ckNvZGVTaXplID0gQ29kZUxlbjsKKworICAgIC8vIFB1c2ggdGhlIG91dGVyIGJsb2NrJ3MgYWJicmV2IHNldCBvbnRvIHRoZSBzdGFjaywgc3RhcnQgb3V0IHdpdGggYW4KKyAgICAvLyBlbXB0eSBhYmJyZXYgc2V0LgorICAgIEJsb2NrU2NvcGUuZW1wbGFjZV9iYWNrKE9sZENvZGVTaXplLCBCbG9ja1NpemVXb3JkSW5kZXgpOworICAgIEJsb2NrU2NvcGUuYmFjaygpLlByZXZBYmJyZXZzLnN3YXAoQ3VyQWJicmV2cyk7CisKKyAgICAvLyBJZiB0aGVyZSBpcyBhIGJsb2NraW5mbyBmb3IgdGhpcyBCbG9ja0lELCBhZGQgYWxsIHRoZSBwcmVkZWZpbmVkIGFiYnJldnMKKyAgICAvLyB0byB0aGUgYWJicmV2IGxpc3QuCisgICAgaWYgKEJsb2NrSW5mbyAqSW5mbyA9IGdldEJsb2NrSW5mbyhCbG9ja0lEKSkgeworICAgICAgQ3VyQWJicmV2cy5pbnNlcnQoQ3VyQWJicmV2cy5lbmQoKSwgSW5mby0+QWJicmV2cy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgSW5mby0+QWJicmV2cy5lbmQoKSk7CisgICAgfQorICB9CisKKyAgdm9pZCBFeGl0QmxvY2soKSB7CisgICAgYXNzZXJ0KCFCbG9ja1Njb3BlLmVtcHR5KCkgJiYgIkJsb2NrIHNjb3BlIGltYmFsYW5jZSEiKTsKKyAgICBjb25zdCBCbG9jayAmQiA9IEJsb2NrU2NvcGUuYmFjaygpOworCisgICAgLy8gQmxvY2sgdGFpbDoKKyAgICAvLyAgICBbRU5EX0JMT0NLLCA8YWxpZ240Ynl0ZXM+XQorICAgIEVtaXRDb2RlKGJpdGM6OkVORF9CTE9DSyk7CisgICAgRmx1c2hUb1dvcmQoKTsKKworICAgIC8vIENvbXB1dGUgdGhlIHNpemUgb2YgdGhlIGJsb2NrLCBpbiB3b3Jkcywgbm90IGNvdW50aW5nIHRoZSBzaXplIGZpZWxkLgorICAgIHNpemVfdCBTaXplSW5Xb3JkcyA9IEdldFdvcmRJbmRleCgpIC0gQi5TdGFydFNpemVXb3JkIC0gMTsKKyAgICB1aW50NjRfdCBCaXRObyA9IHVpbnQ2NF90KEIuU3RhcnRTaXplV29yZCkgKiAzMjsKKworICAgIC8vIFVwZGF0ZSB0aGUgYmxvY2sgc2l6ZSBmaWVsZCBpbiB0aGUgaGVhZGVyIG9mIHRoaXMgc3ViLWJsb2NrLgorICAgIEJhY2twYXRjaFdvcmQoQml0Tm8sIFNpemVJbldvcmRzKTsKKworICAgIC8vIFJlc3RvcmUgdGhlIGlubmVyIGJsb2NrJ3MgY29kZSBzaXplIGFuZCBhYmJyZXYgdGFibGUuCisgICAgQ3VyQ29kZVNpemUgPSBCLlByZXZDb2RlU2l6ZTsKKyAgICBDdXJBYmJyZXZzID0gc3RkOjptb3ZlKEIuUHJldkFiYnJldnMpOworICAgIEJsb2NrU2NvcGUucG9wX2JhY2soKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBSZWNvcmQgRW1pc3Npb24KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3ByaXZhdGU6CisgIC8vLyBFbWl0QWJicmV2aWF0ZWRMaXRlcmFsIC0gRW1pdCBhIGxpdGVyYWwgdmFsdWUgYWNjb3JkaW5nIHRvIGl0cyBhYmJyZXYKKyAgLy8vIHJlY29yZC4gIFRoaXMgaXMgYSBuby1vcCwgc2luY2UgdGhlIGFiYnJldiBzcGVjaWZpZXMgdGhlIGxpdGVyYWwgdG8gdXNlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSB1aW50dHk+CisgIHZvaWQgRW1pdEFiYnJldmlhdGVkTGl0ZXJhbChjb25zdCBCaXRDb2RlQWJicmV2T3AgJk9wLCB1aW50dHkgVikgeworICAgIGFzc2VydChPcC5pc0xpdGVyYWwoKSAmJiAiTm90IGEgbGl0ZXJhbCIpOworICAgIC8vIElmIHRoZSBhYmJyZXYgc3BlY2lmaWVzIHRoZSBsaXRlcmFsIHZhbHVlIHRvIHVzZSwgZG9uJ3QgZW1pdAorICAgIC8vIGFueXRoaW5nLgorICAgIGFzc2VydChWID09IE9wLmdldExpdGVyYWxWYWx1ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIGFiYnJldiBmb3IgcmVjb3JkISIpOworICB9CisKKyAgLy8vIEVtaXRBYmJyZXZpYXRlZEZpZWxkIC0gRW1pdCBhIHNpbmdsZSBzY2FsYXIgZmllbGQgdmFsdWUgd2l0aCB0aGUgc3BlY2lmaWVkCisgIC8vLyBlbmNvZGluZy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgdWludHR5PgorICB2b2lkIEVtaXRBYmJyZXZpYXRlZEZpZWxkKGNvbnN0IEJpdENvZGVBYmJyZXZPcCAmT3AsIHVpbnR0eSBWKSB7CisgICAgYXNzZXJ0KCFPcC5pc0xpdGVyYWwoKSAmJiAiTGl0ZXJhbHMgc2hvdWxkIHVzZSBFbWl0QWJicmV2aWF0ZWRMaXRlcmFsISIpOworCisgICAgLy8gRW5jb2RlIHRoZSB2YWx1ZSBhcyB3ZSBhcmUgY29tbWFuZGVkLgorICAgIHN3aXRjaCAoT3AuZ2V0RW5jb2RpbmcoKSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gZW5jb2RpbmchIik7CisgICAgY2FzZSBCaXRDb2RlQWJicmV2T3A6OkZpeGVkOgorICAgICAgaWYgKE9wLmdldEVuY29kaW5nRGF0YSgpKQorICAgICAgICBFbWl0KCh1bnNpZ25lZClWLCAodW5zaWduZWQpT3AuZ2V0RW5jb2RpbmdEYXRhKCkpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCaXRDb2RlQWJicmV2T3A6OlZCUjoKKyAgICAgIGlmIChPcC5nZXRFbmNvZGluZ0RhdGEoKSkKKyAgICAgICAgRW1pdFZCUjY0KFYsICh1bnNpZ25lZClPcC5nZXRFbmNvZGluZ0RhdGEoKSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpdENvZGVBYmJyZXZPcDo6Q2hhcjY6CisgICAgICBFbWl0KEJpdENvZGVBYmJyZXZPcDo6RW5jb2RlQ2hhcjYoKGNoYXIpViksIDYpOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8vIEVtaXRSZWNvcmRXaXRoQWJicmV2SW1wbCAtIFRoaXMgaXMgdGhlIGNvcmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHJlY29yZAorICAvLy8gZW1pc3Npb24gY29kZS4gIElmIEJsb2JEYXRhIGlzIG5vbi1udWxsLCB0aGVuIGl0IHNwZWNpZmllcyBhbiBhcnJheSBvZgorICAvLy8gZGF0YSB0aGF0IHNob3VsZCBiZSBlbWl0dGVkIGFzIHBhcnQgb2YgdGhlIEJsb2Igb3IgQXJyYXkgb3BlcmFuZCB0aGF0IGlzCisgIC8vLyBrbm93biB0byBleGlzdCBhdCB0aGUgZW5kIG9mIHRoZSByZWNvcmQuIElmIENvZGUgaXMgc3BlY2lmaWVkLCB0aGVuCisgIC8vLyBpdCBpcyB0aGUgcmVjb3JkIGNvZGUgdG8gZW1pdCBiZWZvcmUgdGhlIFZhbHMsIHdoaWNoIG11c3Qgbm90IGNvbnRhaW4KKyAgLy8vIHRoZSBjb2RlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgdWludHR5PgorICB2b2lkIEVtaXRSZWNvcmRXaXRoQWJicmV2SW1wbCh1bnNpZ25lZCBBYmJyZXYsIEFycmF5UmVmPHVpbnR0eT4gVmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEJsb2IsIE9wdGlvbmFsPHVuc2lnbmVkPiBDb2RlKSB7CisgICAgY29uc3QgY2hhciAqQmxvYkRhdGEgPSBCbG9iLmRhdGEoKTsKKyAgICB1bnNpZ25lZCBCbG9iTGVuID0gKHVuc2lnbmVkKSBCbG9iLnNpemUoKTsKKyAgICB1bnNpZ25lZCBBYmJyZXZObyA9IEFiYnJldi1iaXRjOjpGSVJTVF9BUFBMSUNBVElPTl9BQkJSRVY7CisgICAgYXNzZXJ0KEFiYnJldk5vIDwgQ3VyQWJicmV2cy5zaXplKCkgJiYgIkludmFsaWQgYWJicmV2ICMhIik7CisgICAgY29uc3QgQml0Q29kZUFiYnJldiAqQWJidiA9IEN1ckFiYnJldnNbQWJicmV2Tm9dLmdldCgpOworCisgICAgRW1pdENvZGUoQWJicmV2KTsKKworICAgIHVuc2lnbmVkIGkgPSAwLCBlID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KEFiYnYtPmdldE51bU9wZXJhbmRJbmZvcygpKTsKKyAgICBpZiAoQ29kZSkgeworICAgICAgYXNzZXJ0KGUgJiYgIkV4cGVjdGVkIG5vbi1lbXB0eSBhYmJyZXZpYXRpb24iKTsKKyAgICAgIGNvbnN0IEJpdENvZGVBYmJyZXZPcCAmT3AgPSBBYmJ2LT5nZXRPcGVyYW5kSW5mbyhpKyspOworCisgICAgICBpZiAoT3AuaXNMaXRlcmFsKCkpCisgICAgICAgIEVtaXRBYmJyZXZpYXRlZExpdGVyYWwoT3AsIENvZGUuZ2V0VmFsdWUoKSk7CisgICAgICBlbHNlIHsKKyAgICAgICAgYXNzZXJ0KE9wLmdldEVuY29kaW5nKCkgIT0gQml0Q29kZUFiYnJldk9wOjpBcnJheSAmJgorICAgICAgICAgICAgICAgT3AuZ2V0RW5jb2RpbmcoKSAhPSBCaXRDb2RlQWJicmV2T3A6OkJsb2IgJiYKKyAgICAgICAgICAgICAgICJFeHBlY3RlZCBsaXRlcmFsIG9yIHNjYWxhciIpOworICAgICAgICBFbWl0QWJicmV2aWF0ZWRGaWVsZChPcCwgQ29kZS5nZXRWYWx1ZSgpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICB1bnNpZ25lZCBSZWNvcmRJZHggPSAwOworICAgIGZvciAoOyBpICE9IGU7ICsraSkgeworICAgICAgY29uc3QgQml0Q29kZUFiYnJldk9wICZPcCA9IEFiYnYtPmdldE9wZXJhbmRJbmZvKGkpOworICAgICAgaWYgKE9wLmlzTGl0ZXJhbCgpKSB7CisgICAgICAgIGFzc2VydChSZWNvcmRJZHggPCBWYWxzLnNpemUoKSAmJiAiSW52YWxpZCBhYmJyZXYvcmVjb3JkIik7CisgICAgICAgIEVtaXRBYmJyZXZpYXRlZExpdGVyYWwoT3AsIFZhbHNbUmVjb3JkSWR4XSk7CisgICAgICAgICsrUmVjb3JkSWR4OworICAgICAgfSBlbHNlIGlmIChPcC5nZXRFbmNvZGluZygpID09IEJpdENvZGVBYmJyZXZPcDo6QXJyYXkpIHsKKyAgICAgICAgLy8gQXJyYXkgY2FzZS4KKyAgICAgICAgYXNzZXJ0KGkgKyAyID09IGUgJiYgImFycmF5IG9wIG5vdCBzZWNvbmQgdG8gbGFzdD8iKTsKKyAgICAgICAgY29uc3QgQml0Q29kZUFiYnJldk9wICZFbHRFbmMgPSBBYmJ2LT5nZXRPcGVyYW5kSW5mbygrK2kpOworCisgICAgICAgIC8vIElmIHRoaXMgcmVjb3JkIGhhcyBibG9iIGRhdGEsIGVtaXQgaXQsIG90aGVyd2lzZSB3ZSBtdXN0IGhhdmUgcmVjb3JkCisgICAgICAgIC8vIGVudHJpZXMgdG8gZW5jb2RlIHRoaXMgd2F5LgorICAgICAgICBpZiAoQmxvYkRhdGEpIHsKKyAgICAgICAgICBhc3NlcnQoUmVjb3JkSWR4ID09IFZhbHMuc2l6ZSgpICYmCisgICAgICAgICAgICAgICAgICJCbG9iIGRhdGEgYW5kIHJlY29yZCBlbnRyaWVzIHNwZWNpZmllZCBmb3IgYXJyYXkhIik7CisgICAgICAgICAgLy8gRW1pdCBhIHZicjYgdG8gaW5kaWNhdGUgdGhlIG51bWJlciBvZiBlbGVtZW50cyBwcmVzZW50LgorICAgICAgICAgIEVtaXRWQlIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEJsb2JMZW4pLCA2KTsKKworICAgICAgICAgIC8vIEVtaXQgZWFjaCBmaWVsZC4KKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IEJsb2JMZW47ICsraSkKKyAgICAgICAgICAgIEVtaXRBYmJyZXZpYXRlZEZpZWxkKEVsdEVuYywgKHVuc2lnbmVkIGNoYXIpQmxvYkRhdGFbaV0pOworCisgICAgICAgICAgLy8gS25vdyB0aGF0IGJsb2IgZGF0YSBpcyBjb25zdW1lZCBmb3IgYXNzZXJ0aW9uIGJlbG93LgorICAgICAgICAgIEJsb2JEYXRhID0gbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBFbWl0IGEgdmJyNiB0byBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHByZXNlbnQuCisgICAgICAgICAgRW1pdFZCUihzdGF0aWNfY2FzdDx1aW50MzJfdD4oVmFscy5zaXplKCktUmVjb3JkSWR4KSwgNik7CisKKyAgICAgICAgICAvLyBFbWl0IGVhY2ggZmllbGQuCisgICAgICAgICAgZm9yICh1bnNpZ25lZCBlID0gVmFscy5zaXplKCk7IFJlY29yZElkeCAhPSBlOyArK1JlY29yZElkeCkKKyAgICAgICAgICAgIEVtaXRBYmJyZXZpYXRlZEZpZWxkKEVsdEVuYywgVmFsc1tSZWNvcmRJZHhdKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChPcC5nZXRFbmNvZGluZygpID09IEJpdENvZGVBYmJyZXZPcDo6QmxvYikgeworICAgICAgICAvLyBJZiB0aGlzIHJlY29yZCBoYXMgYmxvYiBkYXRhLCBlbWl0IGl0LCBvdGhlcndpc2Ugd2UgbXVzdCBoYXZlIHJlY29yZAorICAgICAgICAvLyBlbnRyaWVzIHRvIGVuY29kZSB0aGlzIHdheS4KKworICAgICAgICBpZiAoQmxvYkRhdGEpIHsKKyAgICAgICAgICBhc3NlcnQoUmVjb3JkSWR4ID09IFZhbHMuc2l6ZSgpICYmCisgICAgICAgICAgICAgICAgICJCbG9iIGRhdGEgYW5kIHJlY29yZCBlbnRyaWVzIHNwZWNpZmllZCBmb3IgYmxvYiBvcGVyYW5kISIpOworCisgICAgICAgICAgYXNzZXJ0KEJsb2IuZGF0YSgpID09IEJsb2JEYXRhICYmICJCbG9iRGF0YSBnb3QgbW92ZWQiKTsKKyAgICAgICAgICBhc3NlcnQoQmxvYi5zaXplKCkgPT0gQmxvYkxlbiAmJiAiQmxvYkxlbiBnb3QgY2hhbmdlZCIpOworICAgICAgICAgIGVtaXRCbG9iKEJsb2IpOworICAgICAgICAgIEJsb2JEYXRhID0gbnVsbHB0cjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBlbWl0QmxvYihWYWxzLnNsaWNlKFJlY29yZElkeCkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeyAgLy8gU2luZ2xlIHNjYWxhciBmaWVsZC4KKyAgICAgICAgYXNzZXJ0KFJlY29yZElkeCA8IFZhbHMuc2l6ZSgpICYmICJJbnZhbGlkIGFiYnJldi9yZWNvcmQiKTsKKyAgICAgICAgRW1pdEFiYnJldmlhdGVkRmllbGQoT3AsIFZhbHNbUmVjb3JkSWR4XSk7CisgICAgICAgICsrUmVjb3JkSWR4OworICAgICAgfQorICAgIH0KKyAgICBhc3NlcnQoUmVjb3JkSWR4ID09IFZhbHMuc2l6ZSgpICYmICJOb3QgYWxsIHJlY29yZCBvcGVyYW5kcyBlbWl0dGVkISIpOworICAgIGFzc2VydChCbG9iRGF0YSA9PSBudWxscHRyICYmCisgICAgICAgICAgICJCbG9iIGRhdGEgc3BlY2lmaWVkIGZvciByZWNvcmQgdGhhdCBkb2Vzbid0IHVzZSBpdCEiKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBFbWl0IGEgYmxvYiwgaW5jbHVkaW5nIGZsdXNoaW5nIGJlZm9yZSBhbmQgdGFpbC1wYWRkaW5nLgorICB0ZW1wbGF0ZSA8Y2xhc3MgVUludFR5PgorICB2b2lkIGVtaXRCbG9iKEFycmF5UmVmPFVJbnRUeT4gQnl0ZXMsIGJvb2wgU2hvdWxkRW1pdFNpemUgPSB0cnVlKSB7CisgICAgLy8gRW1pdCBhIHZicjYgdG8gaW5kaWNhdGUgdGhlIG51bWJlciBvZiBlbGVtZW50cyBwcmVzZW50LgorICAgIGlmIChTaG91bGRFbWl0U2l6ZSkKKyAgICAgIEVtaXRWQlIoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEJ5dGVzLnNpemUoKSksIDYpOworCisgICAgLy8gRmx1c2ggdG8gYSAzMi1iaXQgYWxpZ25tZW50IGJvdW5kYXJ5LgorICAgIEZsdXNoVG9Xb3JkKCk7CisKKyAgICAvLyBFbWl0IGxpdGVyYWwgYnl0ZXMuCisgICAgZm9yIChjb25zdCBhdXRvICZCIDogQnl0ZXMpIHsKKyAgICAgIGFzc2VydChpc1VJbnQ8OD4oQikgJiYgIlZhbHVlIHRvbyBsYXJnZSB0byBlbWl0IGFzIGJ5dGUiKTsKKyAgICAgIFdyaXRlQnl0ZSgodW5zaWduZWQgY2hhcilCKTsKKyAgICB9CisKKyAgICAvLyBBbGlnbiBlbmQgdG8gMzItYml0cy4KKyAgICB3aGlsZSAoR2V0QnVmZmVyT2Zmc2V0KCkgJiAzKQorICAgICAgV3JpdGVCeXRlKDApOworICB9CisgIHZvaWQgZW1pdEJsb2IoU3RyaW5nUmVmIEJ5dGVzLCBib29sIFNob3VsZEVtaXRTaXplID0gdHJ1ZSkgeworICAgIGVtaXRCbG9iKG1ha2VBcnJheVJlZigoY29uc3QgdWludDhfdCAqKUJ5dGVzLmRhdGEoKSwgQnl0ZXMuc2l6ZSgpKSwKKyAgICAgICAgICAgICBTaG91bGRFbWl0U2l6ZSk7CisgIH0KKworICAvLy8gRW1pdFJlY29yZCAtIEVtaXQgdGhlIHNwZWNpZmllZCByZWNvcmQgdG8gdGhlIHN0cmVhbSwgdXNpbmcgYW4gYWJicmV2IGlmCisgIC8vLyB3ZSBoYXZlIG9uZSB0byBjb21wcmVzcyB0aGUgb3V0cHV0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgorICB2b2lkIEVtaXRSZWNvcmQodW5zaWduZWQgQ29kZSwgY29uc3QgQ29udGFpbmVyICZWYWxzLCB1bnNpZ25lZCBBYmJyZXYgPSAwKSB7CisgICAgaWYgKCFBYmJyZXYpIHsKKyAgICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYW4gYWJicmV2IHRvIHVzZSwgZW1pdCB0aGlzIGluIGl0cyBmdWxseSB1bmFiYnJldmlhdGVkCisgICAgICAvLyBmb3JtLgorICAgICAgYXV0byBDb3VudCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihtYWtlQXJyYXlSZWYoVmFscykuc2l6ZSgpKTsKKyAgICAgIEVtaXRDb2RlKGJpdGM6OlVOQUJCUkVWX1JFQ09SRCk7CisgICAgICBFbWl0VkJSKENvZGUsIDYpOworICAgICAgRW1pdFZCUihDb3VudCwgNik7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQ291bnQ7IGkgIT0gZTsgKytpKQorICAgICAgICBFbWl0VkJSNjQoVmFsc1tpXSwgNik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgRW1pdFJlY29yZFdpdGhBYmJyZXZJbXBsKEFiYnJldiwgbWFrZUFycmF5UmVmKFZhbHMpLCBTdHJpbmdSZWYoKSwgQ29kZSk7CisgIH0KKworICAvLy8gRW1pdFJlY29yZFdpdGhBYmJyZXYgLSBFbWl0IGEgcmVjb3JkIHdpdGggdGhlIHNwZWNpZmllZCBhYmJyZXZpYXRpb24uCisgIC8vLyBVbmxpa2UgRW1pdFJlY29yZCwgdGhlIGNvZGUgZm9yIHRoZSByZWNvcmQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIFZhbHMgYXMKKyAgLy8vIHRoZSBmaXJzdCBlbnRyeS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENvbnRhaW5lcj4KKyAgdm9pZCBFbWl0UmVjb3JkV2l0aEFiYnJldih1bnNpZ25lZCBBYmJyZXYsIGNvbnN0IENvbnRhaW5lciAmVmFscykgeworICAgIEVtaXRSZWNvcmRXaXRoQWJicmV2SW1wbChBYmJyZXYsIG1ha2VBcnJheVJlZihWYWxzKSwgU3RyaW5nUmVmKCksIE5vbmUpOworICB9CisKKyAgLy8vIEVtaXRSZWNvcmRXaXRoQmxvYiAtIEVtaXQgdGhlIHNwZWNpZmllZCByZWNvcmQgdG8gdGhlIHN0cmVhbSwgdXNpbmcgYW4KKyAgLy8vIGFiYnJldiB0aGF0IGluY2x1ZGVzIGEgYmxvYiBhdCB0aGUgZW5kLiAgVGhlIGJsb2IgZGF0YSB0byBlbWl0IGlzCisgIC8vLyBzcGVjaWZpZWQgYnkgdGhlIHBvaW50ZXIgYW5kIGxlbmd0aCBzcGVjaWZpZWQgYXQgdGhlIGVuZC4gIEluIGNvbnRyYXN0IHRvCisgIC8vLyBFbWl0UmVjb3JkLCB0aGlzIHJvdXRpbmUgZXhwZWN0cyB0aGF0IHRoZSBmaXJzdCBlbnRyeSBpbiBWYWxzIGlzIHRoZSBjb2RlCisgIC8vLyBvZiB0aGUgcmVjb3JkLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgorICB2b2lkIEVtaXRSZWNvcmRXaXRoQmxvYih1bnNpZ25lZCBBYmJyZXYsIGNvbnN0IENvbnRhaW5lciAmVmFscywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEJsb2IpIHsKKyAgICBFbWl0UmVjb3JkV2l0aEFiYnJldkltcGwoQWJicmV2LCBtYWtlQXJyYXlSZWYoVmFscyksIEJsb2IsIE5vbmUpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDb250YWluZXI+CisgIHZvaWQgRW1pdFJlY29yZFdpdGhCbG9iKHVuc2lnbmVkIEFiYnJldiwgY29uc3QgQ29udGFpbmVyICZWYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpCbG9iRGF0YSwgdW5zaWduZWQgQmxvYkxlbikgeworICAgIHJldHVybiBFbWl0UmVjb3JkV2l0aEFiYnJldkltcGwoQWJicmV2LCBtYWtlQXJyYXlSZWYoVmFscyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYoQmxvYkRhdGEsIEJsb2JMZW4pLCBOb25lKTsKKyAgfQorCisgIC8vLyBFbWl0UmVjb3JkV2l0aEFycmF5IC0gSnVzdCBsaWtlIEVtaXRSZWNvcmRXaXRoQmxvYiwgd29ya3Mgd2l0aCByZWNvcmRzCisgIC8vLyB0aGF0IGVuZCB3aXRoIGFuIGFycmF5LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgorICB2b2lkIEVtaXRSZWNvcmRXaXRoQXJyYXkodW5zaWduZWQgQWJicmV2LCBjb25zdCBDb250YWluZXIgJlZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQXJyYXkpIHsKKyAgICBFbWl0UmVjb3JkV2l0aEFiYnJldkltcGwoQWJicmV2LCBtYWtlQXJyYXlSZWYoVmFscyksIEFycmF5LCBOb25lKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29udGFpbmVyPgorICB2b2lkIEVtaXRSZWNvcmRXaXRoQXJyYXkodW5zaWduZWQgQWJicmV2LCBjb25zdCBDb250YWluZXIgJlZhbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpBcnJheURhdGEsIHVuc2lnbmVkIEFycmF5TGVuKSB7CisgICAgcmV0dXJuIEVtaXRSZWNvcmRXaXRoQWJicmV2SW1wbChBYmJyZXYsIG1ha2VBcnJheVJlZihWYWxzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZihBcnJheURhdGEsIEFycmF5TGVuKSwgTm9uZSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQWJicmV2IEVtaXNzaW9uCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitwcml2YXRlOgorICAvLyBFbWl0IHRoZSBhYmJyZXZpYXRpb24gYXMgYSBERUZJTkVfQUJCUkVWIHJlY29yZC4KKyAgdm9pZCBFbmNvZGVBYmJyZXYoY29uc3QgQml0Q29kZUFiYnJldiAmQWJidikgeworICAgIEVtaXRDb2RlKGJpdGM6OkRFRklORV9BQkJSRVYpOworICAgIEVtaXRWQlIoQWJidi5nZXROdW1PcGVyYW5kSW5mb3MoKSwgNSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihBYmJ2LmdldE51bU9wZXJhbmRJbmZvcygpKTsKKyAgICAgICAgIGkgIT0gZTsgKytpKSB7CisgICAgICBjb25zdCBCaXRDb2RlQWJicmV2T3AgJk9wID0gQWJidi5nZXRPcGVyYW5kSW5mbyhpKTsKKyAgICAgIEVtaXQoT3AuaXNMaXRlcmFsKCksIDEpOworICAgICAgaWYgKE9wLmlzTGl0ZXJhbCgpKSB7CisgICAgICAgIEVtaXRWQlI2NChPcC5nZXRMaXRlcmFsVmFsdWUoKSwgOCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBFbWl0KE9wLmdldEVuY29kaW5nKCksIDMpOworICAgICAgICBpZiAoT3AuaGFzRW5jb2RpbmdEYXRhKCkpCisgICAgICAgICAgRW1pdFZCUjY0KE9wLmdldEVuY29kaW5nRGF0YSgpLCA1KTsKKyAgICAgIH0KKyAgICB9CisgIH0KK3B1YmxpYzoKKworICAvLy8gRW1pdEFiYnJldiAtIFRoaXMgZW1pdHMgYW4gYWJicmV2aWF0aW9uIHRvIHRoZSBzdHJlYW0uICBOb3RlIHRoYXQgdGhpcworICAvLy8gbWV0aG9kIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgc3BlY2lmaWVkIGFiYnJldi4KKyAgdW5zaWduZWQgRW1pdEFiYnJldihzdGQ6OnNoYXJlZF9wdHI8Qml0Q29kZUFiYnJldj4gQWJidikgeworICAgIC8vIEVtaXQgdGhlIGFiYnJldmlhdGlvbiBhcyBhIHJlY29yZC4KKyAgICBFbmNvZGVBYmJyZXYoKkFiYnYpOworICAgIEN1ckFiYnJldnMucHVzaF9iYWNrKHN0ZDo6bW92ZShBYmJ2KSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkPihDdXJBYmJyZXZzLnNpemUoKSktMSArCisgICAgICBiaXRjOjpGSVJTVF9BUFBMSUNBVElPTl9BQkJSRVY7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQmxvY2tJbmZvIEJsb2NrIEVtaXNzaW9uCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBFbnRlckJsb2NrSW5mb0Jsb2NrIC0gU3RhcnQgZW1pdHRpbmcgdGhlIEJMT0NLSU5GT19CTE9DSy4KKyAgdm9pZCBFbnRlckJsb2NrSW5mb0Jsb2NrKCkgeworICAgIEVudGVyU3ViYmxvY2soYml0Yzo6QkxPQ0tJTkZPX0JMT0NLX0lELCAyKTsKKyAgICBCbG9ja0luZm9DdXJCSUQgPSB+MFU7CisgICAgQmxvY2tJbmZvUmVjb3Jkcy5jbGVhcigpOworICB9Citwcml2YXRlOgorICAvLy8gU3dpdGNoVG9CbG9ja0lEIC0gSWYgd2UgYXJlbid0IGFscmVhZHkgdGFsa2luZyBhYm91dCB0aGUgc3BlY2lmaWVkIGJsb2NrCisgIC8vLyBJRCwgZW1pdCBhIEJMT0NLSU5GT19DT0RFX1NFVEJJRCByZWNvcmQuCisgIHZvaWQgU3dpdGNoVG9CbG9ja0lEKHVuc2lnbmVkIEJsb2NrSUQpIHsKKyAgICBpZiAoQmxvY2tJbmZvQ3VyQklEID09IEJsb2NrSUQpIHJldHVybjsKKyAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMj4gVjsKKyAgICBWLnB1c2hfYmFjayhCbG9ja0lEKTsKKyAgICBFbWl0UmVjb3JkKGJpdGM6OkJMT0NLSU5GT19DT0RFX1NFVEJJRCwgVik7CisgICAgQmxvY2tJbmZvQ3VyQklEID0gQmxvY2tJRDsKKyAgfQorCisgIEJsb2NrSW5mbyAmZ2V0T3JDcmVhdGVCbG9ja0luZm8odW5zaWduZWQgQmxvY2tJRCkgeworICAgIGlmIChCbG9ja0luZm8gKkJJID0gZ2V0QmxvY2tJbmZvKEJsb2NrSUQpKQorICAgICAgcmV0dXJuICpCSTsKKworICAgIC8vIE90aGVyd2lzZSwgYWRkIGEgbmV3IHJlY29yZC4KKyAgICBCbG9ja0luZm9SZWNvcmRzLmVtcGxhY2VfYmFjaygpOworICAgIEJsb2NrSW5mb1JlY29yZHMuYmFjaygpLkJsb2NrSUQgPSBCbG9ja0lEOworICAgIHJldHVybiBCbG9ja0luZm9SZWNvcmRzLmJhY2soKTsKKyAgfQorCitwdWJsaWM6CisKKyAgLy8vIEVtaXRCbG9ja0luZm9BYmJyZXYgLSBFbWl0IGEgREVGSU5FX0FCQlJFViByZWNvcmQgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIEJsb2NrSUQuCisgIHVuc2lnbmVkIEVtaXRCbG9ja0luZm9BYmJyZXYodW5zaWduZWQgQmxvY2tJRCwgc3RkOjpzaGFyZWRfcHRyPEJpdENvZGVBYmJyZXY+IEFiYnYpIHsKKyAgICBTd2l0Y2hUb0Jsb2NrSUQoQmxvY2tJRCk7CisgICAgRW5jb2RlQWJicmV2KCpBYmJ2KTsKKworICAgIC8vIEFkZCB0aGUgYWJicmV2IHRvIHRoZSBzcGVjaWZpZWQgYmxvY2sgcmVjb3JkLgorICAgIEJsb2NrSW5mbyAmSW5mbyA9IGdldE9yQ3JlYXRlQmxvY2tJbmZvKEJsb2NrSUQpOworICAgIEluZm8uQWJicmV2cy5wdXNoX2JhY2soc3RkOjptb3ZlKEFiYnYpKTsKKworICAgIHJldHVybiBJbmZvLkFiYnJldnMuc2l6ZSgpLTErYml0Yzo6RklSU1RfQVBQTElDQVRJT05fQUJCUkVWOworICB9Cit9OworCisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0xMVk1CaXRDb2Rlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9CaXRjb2RlL0xMVk1CaXRDb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNTAwZTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0JpdGNvZGUvTExWTUJpdENvZGVzLmgKQEAgLTAsMCArMSw2MTMgQEAKKy8vPT09LSBMTFZNQml0Q29kZXMuaCAtIEVudW0gdmFsdWVzIGZvciB0aGUgTExWTSBiaXRjb2RlIGZvcm1hdCAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyBCaXRjb2RlIGVudW0gdmFsdWVzIGZvciBMTFZNIElSIGJpdGNvZGUgZmlsZXMuCisvLworLy8gVGhlIGVudW0gdmFsdWVzIGRlZmluZWQgaW4gdGhpcyBmaWxlIHNob3VsZCBiZSBjb25zaWRlcmVkIHBlcm1hbmVudC4gIElmCisvLyBuZXcgZmVhdHVyZXMgYXJlIGFkZGVkLCB0aGV5IHNob3VsZCBoYXZlIHZhbHVlcyBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZQorLy8gcmVzcGVjdGl2ZSBsaXN0cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQklUQ09ERV9MTFZNQklUQ09ERVNfSAorI2RlZmluZSBMTFZNX0JJVENPREVfTExWTUJJVENPREVTX0gKKworI2luY2x1ZGUgImxsdm0vQml0Y29kZS9CaXRDb2Rlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgYml0YyB7CisvLyBUaGUgb25seSB0b3AtbGV2ZWwgYmxvY2sgdHlwZXMgYXJlIE1PRFVMRSwgSURFTlRJRklDQVRJT04sIFNUUlRBQiBhbmQgU1lNVEFCLgorZW51bSBCbG9ja0lEcyB7CisgIC8vIEJsb2NrcworICBNT0RVTEVfQkxPQ0tfSUQgPSBGSVJTVF9BUFBMSUNBVElPTl9CTE9DS0lELAorCisgIC8vIE1vZHVsZSBzdWItYmxvY2sgaWQncy4KKyAgUEFSQU1BVFRSX0JMT0NLX0lELAorICBQQVJBTUFUVFJfR1JPVVBfQkxPQ0tfSUQsCisKKyAgQ09OU1RBTlRTX0JMT0NLX0lELAorICBGVU5DVElPTl9CTE9DS19JRCwKKworICAvLyBCbG9jayBpbnRlbmRlZCB0byBjb250YWlucyBpbmZvcm1hdGlvbiBvbiB0aGUgYml0Y29kZSB2ZXJzaW9uaW5nLgorICAvLyBDYW4gYmUgdXNlZCB0byBwcm92aWRlIGJldHRlciBlcnJvciBtZXNzYWdlcyB3aGVuIHdlIGZhaWwgdG8gcGFyc2UgYQorICAvLyBiaXRjb2RlIGZpbGUuCisgIElERU5USUZJQ0FUSU9OX0JMT0NLX0lELAorCisgIFZBTFVFX1NZTVRBQl9CTE9DS19JRCwKKyAgTUVUQURBVEFfQkxPQ0tfSUQsCisgIE1FVEFEQVRBX0FUVEFDSE1FTlRfSUQsCisKKyAgVFlQRV9CTE9DS19JRF9ORVcsCisKKyAgVVNFTElTVF9CTE9DS19JRCwKKworICBNT0RVTEVfU1RSVEFCX0JMT0NLX0lELAorICBHTE9CQUxWQUxfU1VNTUFSWV9CTE9DS19JRCwKKworICBPUEVSQU5EX0JVTkRMRV9UQUdTX0JMT0NLX0lELAorCisgIE1FVEFEQVRBX0tJTkRfQkxPQ0tfSUQsCisKKyAgU1RSVEFCX0JMT0NLX0lELAorCisgIEZVTExfTFRPX0dMT0JBTFZBTF9TVU1NQVJZX0JMT0NLX0lELAorCisgIFNZTVRBQl9CTE9DS19JRCwKKworICBTWU5DX1NDT1BFX05BTUVTX0JMT0NLX0lELAorfTsKKworLy8vIElkZW50aWZpY2F0aW9uIGJsb2NrIGNvbnRhaW5zIGEgc3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSBwcm9kdWNlciBkZXRhaWxzLAorLy8vIGFuZCBhbiBlcG9jaCB0aGF0IGRlZmluZXMgdGhlIGF1dG8tdXBncmFkZSBjYXBhYmlsaXR5LgorZW51bSBJZGVudGlmaWNhdGlvbkNvZGVzIHsKKyAgSURFTlRJRklDQVRJT05fQ09ERV9TVFJJTkcgPSAxLCAvLyBJREVOVElGSUNBVElPTjogICAgICBbc3RyY2hyIHggTl0KKyAgSURFTlRJRklDQVRJT05fQ09ERV9FUE9DSCA9IDIsICAvLyBFUE9DSDogICAgICAgICAgICAgICBbZXBvY2gjXQorfTsKKworLy8vIFRoZSBlcG9jaCB0aGF0IGRlZmluZXMgdGhlIGF1dG8tdXBncmFkZSBjb21wYXRpYmlsaXR5IGZvciB0aGUgYml0Y29kZS4KKy8vLworLy8vIExMVk0gZ3VhcmFudGVlcyBpbiBhIG1ham9yIHJlbGVhc2UgdGhhdCBhIG1pbm9yIHJlbGVhc2UgY2FuIHJlYWQgYml0Y29kZQorLy8vIGdlbmVyYXRlZCBieSBwcmV2aW91cyBtaW5vciByZWxlYXNlcy4gV2UgdHJhbnNsYXRlIHRoaXMgYnkgbWFraW5nIHRoZSByZWFkZXIKKy8vLyBhY2NlcHRpbmcgb25seSBiaXRjb2RlIHdpdGggdGhlIHNhbWUgZXBvY2gsIGV4Y2VwdCBmb3IgdGhlIFguMCByZWxlYXNlIHdoaWNoCisvLy8gYWxzbyBhY2NlcHRzIE4tMS4KK2VudW0geyBCSVRDT0RFX0NVUlJFTlRfRVBPQ0ggPSAwIH07CisKKy8vLyBNT0RVTEUgYmxvY2tzIGhhdmUgYSBudW1iZXIgb2Ygb3B0aW9uYWwgZmllbGRzIGFuZCBzdWJibG9ja3MuCitlbnVtIE1vZHVsZUNvZGVzIHsKKyAgTU9EVUxFX0NPREVfVkVSU0lPTiA9IDEsICAgICAvLyBWRVJTSU9OOiAgICAgW3ZlcnNpb24jXQorICBNT0RVTEVfQ09ERV9UUklQTEUgPSAyLCAgICAgIC8vIFRSSVBMRTogICAgICBbc3RyY2hyIHggTl0KKyAgTU9EVUxFX0NPREVfREFUQUxBWU9VVCA9IDMsICAvLyBEQVRBTEFZT1VUOiAgW3N0cmNociB4IE5dCisgIE1PRFVMRV9DT0RFX0FTTSA9IDQsICAgICAgICAgLy8gQVNNOiAgICAgICAgIFtzdHJjaHIgeCBOXQorICBNT0RVTEVfQ09ERV9TRUNUSU9OTkFNRSA9IDUsIC8vIFNFQ1RJT05OQU1FOiBbc3RyY2hyIHggTl0KKworICAvLyBGSVhNRTogUmVtb3ZlIERFUExJQiBpbiA0LjAuCisgIE1PRFVMRV9DT0RFX0RFUExJQiA9IDYsIC8vIERFUExJQjogICAgICBbc3RyY2hyIHggTl0KKworICAvLyBHTE9CQUxWQVI6IFtwb2ludGVyIHR5cGUsIGlzY29uc3QsIGluaXRpZCwKKyAgLy8gICAgICAgICAgICAgbGlua2FnZSwgYWxpZ25tZW50LCBzZWN0aW9uLCB2aXNpYmlsaXR5LCB0aHJlYWRsb2NhbF0KKyAgTU9EVUxFX0NPREVfR0xPQkFMVkFSID0gNywKKworICAvLyBGVU5DVElPTjogIFt0eXBlLCBjYWxsaW5nY29udiwgaXNwcm90bywgbGlua2FnZSwgcGFyYW1hdHRycywgYWxpZ25tZW50LAorICAvLyAgICAgICAgICAgICBzZWN0aW9uLCB2aXNpYmlsaXR5LCBnYywgdW5uYW1lZF9hZGRyXQorICBNT0RVTEVfQ09ERV9GVU5DVElPTiA9IDgsCisKKyAgLy8gQUxJQVM6IFthbGlhcyB0eXBlLCBhbGlhc2VlIHZhbCMsIGxpbmthZ2UsIHZpc2liaWxpdHldCisgIE1PRFVMRV9DT0RFX0FMSUFTX09MRCA9IDksCisKKyAgTU9EVUxFX0NPREVfR0NOQU1FID0gMTEsIC8vIEdDTkFNRTogW3N0cmNociB4IE5dCisgIE1PRFVMRV9DT0RFX0NPTURBVCA9IDEyLCAvLyBDT01EQVQ6IFtzZWxlY3Rpb25fa2luZCwgbmFtZV0KKworICBNT0RVTEVfQ09ERV9WU1RPRkZTRVQgPSAxMywgLy8gVlNUT0ZGU0VUOiBbb2Zmc2V0XQorCisgIC8vIEFMSUFTOiBbYWxpYXMgdmFsdWUgdHlwZSwgYWRkcnNwYWNlLCBhbGlhc2VlIHZhbCMsIGxpbmthZ2UsIHZpc2liaWxpdHldCisgIE1PRFVMRV9DT0RFX0FMSUFTID0gMTQsCisKKyAgTU9EVUxFX0NPREVfTUVUQURBVEFfVkFMVUVTX1VOVVNFRCA9IDE1LAorCisgIC8vIFNPVVJDRV9GSUxFTkFNRTogW25hbWVjaGFyIHggTl0KKyAgTU9EVUxFX0NPREVfU09VUkNFX0ZJTEVOQU1FID0gMTYsCisKKyAgLy8gSEFTSDogWzUqaTMyXQorICBNT0RVTEVfQ09ERV9IQVNIID0gMTcsCisKKyAgLy8gSUZVTkM6IFtpZnVuYyB2YWx1ZSB0eXBlLCBhZGRyc3BhY2UsIHJlc29sdmVyIHZhbCMsIGxpbmthZ2UsIHZpc2liaWxpdHldCisgIE1PRFVMRV9DT0RFX0lGVU5DID0gMTgsCit9OworCisvLy8gUEFSQU1BVFRSIGJsb2NrcyBoYXZlIGNvZGUgZm9yIGRlZmluaW5nIGEgcGFyYW1ldGVyIGF0dHJpYnV0ZSBzZXQuCitlbnVtIEF0dHJpYnV0ZUNvZGVzIHsKKyAgLy8gRklYTUU6IFJlbW92ZSBgUEFSQU1BVFRSX0NPREVfRU5UUllfT0xEJyBpbiA0LjAKKyAgUEFSQU1BVFRSX0NPREVfRU5UUllfT0xEID0gMSwgLy8gRU5UUlk6IFtwYXJhbWlkeDAsIGF0dHIwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgIHBhcmFtaWR4MSwgYXR0cjEuLi5dCisgIFBBUkFNQVRUUl9DT0RFX0VOVFJZID0gMiwgICAgIC8vIEVOVFJZOiBbYXR0cmdycDAsIGF0dHJncnAxLCAuLi5dCisgIFBBUkFNQVRUUl9HUlBfQ09ERV9FTlRSWSA9IDMgIC8vIEVOVFJZOiBbZ3JwaWQsIGlkeCwgYXR0cjAsIGF0dHIxLCAuLi5dCit9OworCisvLy8gVFlQRSBibG9ja3MgaGF2ZSBjb2RlcyBmb3IgZWFjaCB0eXBlIHByaW1pdGl2ZSB0aGV5IHVzZS4KK2VudW0gVHlwZUNvZGVzIHsKKyAgVFlQRV9DT0RFX05VTUVOVFJZID0gMSwgLy8gTlVNRU5UUlk6IFtudW1lbnRyaWVzXQorCisgIC8vIFR5cGUgQ29kZXMKKyAgVFlQRV9DT0RFX1ZPSUQgPSAyLCAgICAvLyBWT0lECisgIFRZUEVfQ09ERV9GTE9BVCA9IDMsICAgLy8gRkxPQVQKKyAgVFlQRV9DT0RFX0RPVUJMRSA9IDQsICAvLyBET1VCTEUKKyAgVFlQRV9DT0RFX0xBQkVMID0gNSwgICAvLyBMQUJFTAorICBUWVBFX0NPREVfT1BBUVVFID0gNiwgIC8vIE9QQVFVRQorICBUWVBFX0NPREVfSU5URUdFUiA9IDcsIC8vIElOVEVHRVI6IFt3aWR0aF0KKyAgVFlQRV9DT0RFX1BPSU5URVIgPSA4LCAvLyBQT0lOVEVSOiBbcG9pbnRlZSB0eXBlXQorCisgIFRZUEVfQ09ERV9GVU5DVElPTl9PTEQgPSA5LCAvLyBGVU5DVElPTjogW3ZhcmFyZywgYXR0cmlkLCByZXR0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgcGFyYW10eSB4IE5dCisKKyAgVFlQRV9DT0RFX0hBTEYgPSAxMCwgLy8gSEFMRgorCisgIFRZUEVfQ09ERV9BUlJBWSA9IDExLCAgLy8gQVJSQVk6IFtudW1lbHRzLCBlbHR0eV0KKyAgVFlQRV9DT0RFX1ZFQ1RPUiA9IDEyLCAvLyBWRUNUT1I6IFtudW1lbHRzLCBlbHR0eV0KKworICAvLyBUaGVzZSBhcmUgbm90IHdpdGggdGhlIG90aGVyIGZsb2F0aW5nIHBvaW50IHR5cGVzIGJlY2F1c2UgdGhleSdyZQorICAvLyBhIGxhdGUgYWRkaXRpb24sIGFuZCBwdXR0aW5nIHRoZW0gaW4gdGhlIHJpZ2h0IHBsYWNlIGJyZWFrcworICAvLyBiaW5hcnkgY29tcGF0aWJpbGl0eS4KKyAgVFlQRV9DT0RFX1g4Nl9GUDgwID0gMTMsICAvLyBYODYgTE9ORyBET1VCTEUKKyAgVFlQRV9DT0RFX0ZQMTI4ID0gMTQsICAgICAvLyBMT05HIERPVUJMRSAoMTEyIGJpdCBtYW50aXNzYSkKKyAgVFlQRV9DT0RFX1BQQ19GUDEyOCA9IDE1LCAvLyBQUEMgTE9ORyBET1VCTEUgKDIgZG91YmxlcykKKworICBUWVBFX0NPREVfTUVUQURBVEEgPSAxNiwgLy8gTUVUQURBVEEKKworICBUWVBFX0NPREVfWDg2X01NWCA9IDE3LCAvLyBYODYgTU1YCisKKyAgVFlQRV9DT0RFX1NUUlVDVF9BTk9OID0gMTgsICAvLyBTVFJVQ1RfQU5PTjogW2lzcGFja2VkLCBlbHR0eSB4IE5dCisgIFRZUEVfQ09ERV9TVFJVQ1RfTkFNRSA9IDE5LCAgLy8gU1RSVUNUX05BTUU6IFtzdHJjaHIgeCBOXQorICBUWVBFX0NPREVfU1RSVUNUX05BTUVEID0gMjAsIC8vIFNUUlVDVF9OQU1FRDogW2lzcGFja2VkLCBlbHR0eSB4IE5dCisKKyAgVFlQRV9DT0RFX0ZVTkNUSU9OID0gMjEsIC8vIEZVTkNUSU9OOiBbdmFyYXJnLCByZXR0eSwgcGFyYW10eSB4IE5dCisKKyAgVFlQRV9DT0RFX1RPS0VOID0gMjIgLy8gVE9LRU4KK307CisKK2VudW0gT3BlcmFuZEJ1bmRsZVRhZ0NvZGUgeworICBPUEVSQU5EX0JVTkRMRV9UQUcgPSAxLCAvLyBUQUc6IFtzdHJjaHIgeCBOXQorfTsKKworZW51bSBTeW5jU2NvcGVOYW1lQ29kZSB7CisgIFNZTkNfU0NPUEVfTkFNRSA9IDEsCit9OworCisvLyBWYWx1ZSBzeW1ib2wgdGFibGUgY29kZXMuCitlbnVtIFZhbHVlU3ltdGFiQ29kZXMgeworICBWU1RfQ09ERV9FTlRSWSA9IDEsICAgLy8gVlNUX0VOVFJZOiBbdmFsdWVpZCwgbmFtZWNoYXIgeCBOXQorICBWU1RfQ09ERV9CQkVOVFJZID0gMiwgLy8gVlNUX0JCRU5UUlk6IFtiYmlkLCBuYW1lY2hhciB4IE5dCisgIFZTVF9DT0RFX0ZORU5UUlkgPSAzLCAvLyBWU1RfRk5FTlRSWTogW3ZhbHVlaWQsIG9mZnNldCwgbmFtZWNoYXIgeCBOXQorICAvLyBWU1RfQ09NQklORURfRU5UUlk6IFt2YWx1ZWlkLCByZWZndWlkXQorICBWU1RfQ09ERV9DT01CSU5FRF9FTlRSWSA9IDUKK307CisKKy8vIFRoZSBtb2R1bGUgcGF0aCBzeW1ib2wgdGFibGUgb25seSBoYXMgb25lIGNvZGUgKE1TVF9DT0RFX0VOVFJZKS4KK2VudW0gTW9kdWxlUGF0aFN5bXRhYkNvZGVzIHsKKyAgTVNUX0NPREVfRU5UUlkgPSAxLCAvLyBNU1RfRU5UUlk6IFttb2RpZCwgbmFtZWNoYXIgeCBOXQorICBNU1RfQ09ERV9IQVNIID0gMiwgIC8vIE1TVF9IQVNIOiAgWzUqaTMyXQorfTsKKworLy8gVGhlIHN1bW1hcnkgc2VjdGlvbiB1c2VzIGRpZmZlcmVudCBjb2RlcyBpbiB0aGUgcGVyLW1vZHVsZQorLy8gYW5kIGNvbWJpbmVkIGluZGV4IGNhc2VzLgorZW51bSBHbG9iYWxWYWx1ZVN1bW1hcnlTeW10YWJDb2RlcyB7CisgIC8vIFBFUk1PRFVMRTogW3ZhbHVlaWQsIGZsYWdzLCBpbnN0Y291bnQsIG51bXJlZnMsIG51bXJlZnMgeCB2YWx1ZWlkLAorICAvLyAgICAgICAgICAgICBuIHggKHZhbHVlaWQpXQorICBGU19QRVJNT0RVTEUgPSAxLAorICAvLyBQRVJNT0RVTEVfUFJPRklMRTogW3ZhbHVlaWQsIGZsYWdzLCBpbnN0Y291bnQsIG51bXJlZnMsCisgIC8vICAgICAgICAgICAgICAgICAgICAgbnVtcmVmcyB4IHZhbHVlaWQsCisgIC8vICAgICAgICAgICAgICAgICAgICAgbiB4ICh2YWx1ZWlkLCBob3RuZXNzKV0KKyAgRlNfUEVSTU9EVUxFX1BST0ZJTEUgPSAyLAorICAvLyBQRVJNT0RVTEVfR0xPQkFMVkFSX0lOSVRfUkVGUzogW3ZhbHVlaWQsIGZsYWdzLCBuIHggdmFsdWVpZF0KKyAgRlNfUEVSTU9EVUxFX0dMT0JBTFZBUl9JTklUX1JFRlMgPSAzLAorICAvLyBDT01CSU5FRDogW3ZhbHVlaWQsIG1vZGlkLCBmbGFncywgaW5zdGNvdW50LCBudW1yZWZzLCBudW1yZWZzIHggdmFsdWVpZCwKKyAgLy8gICAgICAgICAgICBuIHggKHZhbHVlaWQpXQorICBGU19DT01CSU5FRCA9IDQsCisgIC8vIENPTUJJTkVEX1BST0ZJTEU6IFt2YWx1ZWlkLCBtb2RpZCwgZmxhZ3MsIGluc3Rjb3VudCwgbnVtcmVmcywKKyAgLy8gICAgICAgICAgICAgICAgICAgIG51bXJlZnMgeCB2YWx1ZWlkLAorICAvLyAgICAgICAgICAgICAgICAgICAgbiB4ICh2YWx1ZWlkLCBob3RuZXNzKV0KKyAgRlNfQ09NQklORURfUFJPRklMRSA9IDUsCisgIC8vIENPTUJJTkVEX0dMT0JBTFZBUl9JTklUX1JFRlM6IFt2YWx1ZWlkLCBtb2RpZCwgZmxhZ3MsIG4geCB2YWx1ZWlkXQorICBGU19DT01CSU5FRF9HTE9CQUxWQVJfSU5JVF9SRUZTID0gNiwKKyAgLy8gQUxJQVM6IFt2YWx1ZWlkLCBmbGFncywgdmFsdWVpZF0KKyAgRlNfQUxJQVMgPSA3LAorICAvLyBDT01CSU5FRF9BTElBUzogW3ZhbHVlaWQsIG1vZGlkLCBmbGFncywgdmFsdWVpZF0KKyAgRlNfQ09NQklORURfQUxJQVMgPSA4LAorICAvLyBDT01CSU5FRF9PUklHSU5BTF9OQU1FOiBbb3JpZ2luYWxfbmFtZV9oYXNoXQorICBGU19DT01CSU5FRF9PUklHSU5BTF9OQU1FID0gOSwKKyAgLy8gVkVSU0lPTiBvZiB0aGUgc3VtbWFyeSwgYnVtcGVkIHdoZW4gYWRkaW5nIGZsYWdzIGZvciBpbnN0YW5jZS4KKyAgRlNfVkVSU0lPTiA9IDEwLAorICAvLyBUaGUgbGlzdCBvZiBsbHZtLnR5cGUudGVzdCB0eXBlIGlkZW50aWZpZXJzIHVzZWQgYnkgdGhlIGZvbGxvd2luZyBmdW5jdGlvbgorICAvLyB0aGF0IGFyZSB1c2VkIG90aGVyIHRoYW4gYnkgYW4gbGx2bS5hc3N1bWUuCisgIC8vIFtuIHggdHlwZWlkXQorICBGU19UWVBFX1RFU1RTID0gMTEsCisgIC8vIFRoZSBsaXN0IG9mIHZpcnR1YWwgY2FsbHMgbWFkZSBieSB0aGlzIGZ1bmN0aW9uIHVzaW5nCisgIC8vIGxsdm0uYXNzdW1lKGxsdm0udHlwZS50ZXN0KSBpbnRyaW5zaWNzIHRoYXQgZG8gbm90IGhhdmUgYWxsIGNvbnN0YW50CisgIC8vIGludGVnZXIgYXJndW1lbnRzLgorICAvLyBbbiB4ICh0eXBlaWQsIG9mZnNldCldCisgIEZTX1RZUEVfVEVTVF9BU1NVTUVfVkNBTExTID0gMTIsCisgIC8vIFRoZSBsaXN0IG9mIHZpcnR1YWwgY2FsbHMgbWFkZSBieSB0aGlzIGZ1bmN0aW9uIHVzaW5nCisgIC8vIGxsdm0udHlwZS5jaGVja2VkLmxvYWQgaW50cmluc2ljcyB0aGF0IGRvIG5vdCBoYXZlIGFsbCBjb25zdGFudCBpbnRlZ2VyCisgIC8vIGFyZ3VtZW50cy4KKyAgLy8gW24geCAodHlwZWlkLCBvZmZzZXQpXQorICBGU19UWVBFX0NIRUNLRURfTE9BRF9WQ0FMTFMgPSAxMywKKyAgLy8gSWRlbnRpZmllcyBhIHZpcnR1YWwgY2FsbCBtYWRlIGJ5IHRoaXMgZnVuY3Rpb24gdXNpbmcgYW4KKyAgLy8gbGx2bS5hc3N1bWUobGx2bS50eXBlLnRlc3QpIGludHJpbnNpYyB3aXRoIGFsbCBjb25zdGFudCBpbnRlZ2VyIGFyZ3VtZW50cy4KKyAgLy8gW3R5cGVpZCwgb2Zmc2V0LCBuIHggYXJnXQorICBGU19UWVBFX1RFU1RfQVNTVU1FX0NPTlNUX1ZDQUxMID0gMTQsCisgIC8vIElkZW50aWZpZXMgYSB2aXJ0dWFsIGNhbGwgbWFkZSBieSB0aGlzIGZ1bmN0aW9uIHVzaW5nIGFuCisgIC8vIGxsdm0udHlwZS5jaGVja2VkLmxvYWQgaW50cmluc2ljIHdpdGggYWxsIGNvbnN0YW50IGludGVnZXIgYXJndW1lbnRzLgorICAvLyBbdHlwZWlkLCBvZmZzZXQsIG4geCBhcmddCisgIEZTX1RZUEVfQ0hFQ0tFRF9MT0FEX0NPTlNUX1ZDQUxMID0gMTUsCisgIC8vIEFzc2lnbnMgYSBHVUlEIHRvIGEgdmFsdWUgSUQuIFRoaXMgbm9ybWFsbHkgYXBwZWFycyBvbmx5IGluIGNvbWJpbmVkCisgIC8vIHN1bW1hcmllcywgYnV0IGl0IGNhbiBhbHNvIGFwcGVhciBpbiBwZXItbW9kdWxlIHN1bW1hcmllcyBmb3IgUEdPIGRhdGEuCisgIC8vIFt2YWx1ZWlkLCBndWlkXQorICBGU19WQUxVRV9HVUlEID0gMTYsCisgIC8vIFRoZSBsaXN0IG9mIGxvY2FsIGZ1bmN0aW9ucyB3aXRoIENGSSBqdW1wIHRhYmxlcy4gRnVuY3Rpb24gbmFtZXMgYXJlCisgIC8vIHN0cmluZ3MgaW4gc3RydGFiLgorICAvLyBbbiAqIG5hbWVdCisgIEZTX0NGSV9GVU5DVElPTl9ERUZTID0gMTcsCisgIC8vIFRoZSBsaXN0IG9mIGV4dGVybmFsIGZ1bmN0aW9ucyB3aXRoIENGSSBqdW1wIHRhYmxlcy4gRnVuY3Rpb24gbmFtZXMgYXJlCisgIC8vIHN0cmluZ3MgaW4gc3RydGFiLgorICAvLyBbbiAqIG5hbWVdCisgIEZTX0NGSV9GVU5DVElPTl9ERUNMUyA9IDE4LAorICAvLyBQZXItbW9kdWxlIHN1bW1hcnkgdGhhdCBhbHNvIGFkZHMgcmVsYXRpdmUgYmxvY2sgZnJlcXVlbmN5IHRvIGNhbGxlZSBpbmZvLgorICAvLyBQRVJNT0RVTEVfUkVMQkY6IFt2YWx1ZWlkLCBmbGFncywgaW5zdGNvdW50LCBudW1yZWZzLAorICAvLyAgICAgICAgICAgICAgICAgICBudW1yZWZzIHggdmFsdWVpZCwKKyAgLy8gICAgICAgICAgICAgICAgICAgbiB4ICh2YWx1ZWlkLCByZWxibG9ja2ZyZXEpXQorICBGU19QRVJNT0RVTEVfUkVMQkYgPSAxOSwKKyAgLy8gSW5kZXgtd2lkZSBmbGFncworICBGU19GTEFHUyA9IDIwLAorICAvLyBNYXBzIHR5cGUgaWRlbnRpZmllciB0byBzdW1tYXJ5IGluZm9ybWF0aW9uIGZvciB0aGF0IHR5cGUgaWRlbnRpZmllci4KKyAgLy8gVFlQRV9JRDogW3R5cGVpZCwga2luZCwgYml0d2lkdGgsIGFsaWduLCBzaXplLCBiaXRtYXNrLCBpbmxpbmViaXRzLAorICAvLyAgICAgICAgICAgbiB4ICh0eXBlaWQsIGtpbmQsIG5hbWUsIG51bXJiYSwKKyAgLy8gICAgICAgICAgICAgICAgbnVtcmJhIHggKG51bWFyZywgbnVtYXJnIHggYXJnLCBraW5kLCBpbmZvLCBieXRlLCBiaXQpKV0KKyAgRlNfVFlQRV9JRCA9IDIxLAorfTsKKworZW51bSBNZXRhZGF0YUNvZGVzIHsKKyAgTUVUQURBVEFfU1RSSU5HX09MRCA9IDEsICAgICAvLyBNRFNUUklORzogICAgICBbdmFsdWVzXQorICBNRVRBREFUQV9WQUxVRSA9IDIsICAgICAgICAgIC8vIFZBTFVFOiAgICAgICAgIFt0eXBlIG51bSwgdmFsdWUgbnVtXQorICBNRVRBREFUQV9OT0RFID0gMywgICAgICAgICAgIC8vIE5PREU6ICAgICAgICAgIFtuIHggbWQgbnVtXQorICBNRVRBREFUQV9OQU1FID0gNCwgICAgICAgICAgIC8vIFNUUklORzogICAgICAgIFt2YWx1ZXNdCisgIE1FVEFEQVRBX0RJU1RJTkNUX05PREUgPSA1LCAgLy8gRElTVElOQ1RfTk9ERTogW24geCBtZCBudW1dCisgIE1FVEFEQVRBX0tJTkQgPSA2LCAgICAgICAgICAgLy8gW24geCBbaWQsIG5hbWVdXQorICBNRVRBREFUQV9MT0NBVElPTiA9IDcsICAgICAgIC8vIFtkaXN0aW5jdCwgbGluZSwgY29sLCBzY29wZSwgaW5saW5lZC1hdD9dCisgIE1FVEFEQVRBX09MRF9OT0RFID0gOCwgICAgICAgLy8gT0xEX05PREU6ICAgICAgW24geCAodHlwZSBudW0sIHZhbHVlIG51bSldCisgIE1FVEFEQVRBX09MRF9GTl9OT0RFID0gOSwgICAgLy8gT0xEX0ZOX05PREU6ICAgW24geCAodHlwZSBudW0sIHZhbHVlIG51bSldCisgIE1FVEFEQVRBX05BTUVEX05PREUgPSAxMCwgICAgLy8gTkFNRURfTk9ERTogICAgW24geCBtZG5vZGVzXQorICBNRVRBREFUQV9BVFRBQ0hNRU5UID0gMTEsICAgIC8vIFttIHggW3ZhbHVlLCBbbiB4IFtpZCwgbWRub2RlXV1dCisgIE1FVEFEQVRBX0dFTkVSSUNfREVCVUcgPSAxMiwgLy8gW2Rpc3RpbmN0LCB0YWcsIHZlcnMsIGhlYWRlciwgbiB4IG1kIG51bV0KKyAgTUVUQURBVEFfU1VCUkFOR0UgPSAxMywgICAgICAvLyBbZGlzdGluY3QsIGNvdW50LCBsb10KKyAgTUVUQURBVEFfRU5VTUVSQVRPUiA9IDE0LCAgICAvLyBbaXNVbnNpZ25lZHxkaXN0aW5jdCwgdmFsdWUsIG5hbWVdCisgIE1FVEFEQVRBX0JBU0lDX1RZUEUgPSAxNSwgICAgLy8gW2Rpc3RpbmN0LCB0YWcsIG5hbWUsIHNpemUsIGFsaWduLCBlbmNdCisgIE1FVEFEQVRBX0ZJTEUgPSAxNiwgLy8gW2Rpc3RpbmN0LCBmaWxlbmFtZSwgZGlyZWN0b3J5LCBjaGVja3N1bWtpbmQsIGNoZWNrc3VtXQorICBNRVRBREFUQV9ERVJJVkVEX1RZUEUgPSAxNywgICAgICAgLy8gW2Rpc3RpbmN0LCAuLi5dCisgIE1FVEFEQVRBX0NPTVBPU0lURV9UWVBFID0gMTgsICAgICAvLyBbZGlzdGluY3QsIC4uLl0KKyAgTUVUQURBVEFfU1VCUk9VVElORV9UWVBFID0gMTksICAgIC8vIFtkaXN0aW5jdCwgZmxhZ3MsIHR5cGVzLCBjY10KKyAgTUVUQURBVEFfQ09NUElMRV9VTklUID0gMjAsICAgICAgIC8vIFtkaXN0aW5jdCwgLi4uXQorICBNRVRBREFUQV9TVUJQUk9HUkFNID0gMjEsICAgICAgICAgLy8gW2Rpc3RpbmN0LCAuLi5dCisgIE1FVEFEQVRBX0xFWElDQUxfQkxPQ0sgPSAyMiwgICAgICAvLyBbZGlzdGluY3QsIHNjb3BlLCBmaWxlLCBsaW5lLCBjb2x1bW5dCisgIE1FVEFEQVRBX0xFWElDQUxfQkxPQ0tfRklMRSA9IDIzLCAvL1tkaXN0aW5jdCwgc2NvcGUsIGZpbGUsIGRpc2NyaW1pbmF0b3JdCisgIE1FVEFEQVRBX05BTUVTUEFDRSA9IDI0LCAvLyBbZGlzdGluY3QsIHNjb3BlLCBmaWxlLCBuYW1lLCBsaW5lLCBleHBvcnRTeW1ib2xzXQorICBNRVRBREFUQV9URU1QTEFURV9UWVBFID0gMjUsICAgLy8gW2Rpc3RpbmN0LCBzY29wZSwgbmFtZSwgdHlwZSwgLi4uXQorICBNRVRBREFUQV9URU1QTEFURV9WQUxVRSA9IDI2LCAgLy8gW2Rpc3RpbmN0LCBzY29wZSwgbmFtZSwgdHlwZSwgdmFsdWUsIC4uLl0KKyAgTUVUQURBVEFfR0xPQkFMX1ZBUiA9IDI3LCAgICAgIC8vIFtkaXN0aW5jdCwgLi4uXQorICBNRVRBREFUQV9MT0NBTF9WQVIgPSAyOCwgICAgICAgLy8gW2Rpc3RpbmN0LCAuLi5dCisgIE1FVEFEQVRBX0VYUFJFU1NJT04gPSAyOSwgICAgICAvLyBbZGlzdGluY3QsIG4geCBlbGVtZW50XQorICBNRVRBREFUQV9PQkpDX1BST1BFUlRZID0gMzAsICAgLy8gW2Rpc3RpbmN0LCBuYW1lLCBmaWxlLCBsaW5lLCAuLi5dCisgIE1FVEFEQVRBX0lNUE9SVEVEX0VOVElUWSA9IDMxLCAvLyBbZGlzdGluY3QsIHRhZywgc2NvcGUsIGVudGl0eSwgbGluZSwgbmFtZV0KKyAgTUVUQURBVEFfTU9EVUxFID0gMzIsICAgICAgICAgIC8vIFtkaXN0aW5jdCwgc2NvcGUsIG5hbWUsIC4uLl0KKyAgTUVUQURBVEFfTUFDUk8gPSAzMywgICAgICAgICAgIC8vIFtkaXN0aW5jdCwgbWFjaW5mbywgbGluZSwgbmFtZSwgdmFsdWVdCisgIE1FVEFEQVRBX01BQ1JPX0ZJTEUgPSAzNCwgICAgICAvLyBbZGlzdGluY3QsIG1hY2luZm8sIGxpbmUsIGZpbGUsIC4uLl0KKyAgTUVUQURBVEFfU1RSSU5HUyA9IDM1LCAgICAgICAgIC8vIFtjb3VudCwgb2Zmc2V0XSBibG9iKFtsZW5ndGhzXVtjaGFyc10pCisgIE1FVEFEQVRBX0dMT0JBTF9ERUNMX0FUVEFDSE1FTlQgPSAzNiwgLy8gW3ZhbHVlaWQsIG4geCBbaWQsIG1kbm9kZV1dCisgIE1FVEFEQVRBX0dMT0JBTF9WQVJfRVhQUiA9IDM3LCAgICAgICAgLy8gW2Rpc3RpbmN0LCB2YXIsIGV4cHJdCisgIE1FVEFEQVRBX0lOREVYX09GRlNFVCA9IDM4LCAgICAgICAgICAgLy8gW29mZnNldF0KKyAgTUVUQURBVEFfSU5ERVggPSAzOSwgICAgICAgICAgICAgICAgICAvLyBbYml0cG9zXQorfTsKKworLy8gVGhlIGNvbnN0YW50cyBibG9jayAoQ09OU1RBTlRTX0JMT0NLX0lEKSBkZXNjcmliZXMgZW1pc3Npb24gZm9yIGVhY2gKKy8vIGNvbnN0YW50IGFuZCBtYWludGFpbnMgYW4gaW1wbGljaXQgY3VycmVudCB0eXBlIHZhbHVlLgorZW51bSBDb25zdGFudHNDb2RlcyB7CisgIENTVF9DT0RFX1NFVFRZUEUgPSAxLCAgICAgICAgICAvLyBTRVRUWVBFOiAgICAgICBbdHlwZWlkXQorICBDU1RfQ09ERV9OVUxMID0gMiwgICAgICAgICAgICAgLy8gTlVMTAorICBDU1RfQ09ERV9VTkRFRiA9IDMsICAgICAgICAgICAgLy8gVU5ERUYKKyAgQ1NUX0NPREVfSU5URUdFUiA9IDQsICAgICAgICAgIC8vIElOVEVHRVI6ICAgICAgIFtpbnR2YWxdCisgIENTVF9DT0RFX1dJREVfSU5URUdFUiA9IDUsICAgICAvLyBXSURFX0lOVEVHRVI6ICBbbiB4IGludHZhbF0KKyAgQ1NUX0NPREVfRkxPQVQgPSA2LCAgICAgICAgICAgIC8vIEZMT0FUOiAgICAgICAgIFtmcHZhbF0KKyAgQ1NUX0NPREVfQUdHUkVHQVRFID0gNywgICAgICAgIC8vIEFHR1JFR0FURTogICAgIFtuIHggdmFsdWUgbnVtYmVyXQorICBDU1RfQ09ERV9TVFJJTkcgPSA4LCAgICAgICAgICAgLy8gU1RSSU5HOiAgICAgICAgW3ZhbHVlc10KKyAgQ1NUX0NPREVfQ1NUUklORyA9IDksICAgICAgICAgIC8vIENTVFJJTkc6ICAgICAgIFt2YWx1ZXNdCisgIENTVF9DT0RFX0NFX0JJTk9QID0gMTAsICAgICAgICAvLyBDRV9CSU5PUDogICAgICBbb3Bjb2RlLCBvcHZhbCwgb3B2YWxdCisgIENTVF9DT0RFX0NFX0NBU1QgPSAxMSwgICAgICAgICAvLyBDRV9DQVNUOiAgICAgICBbb3Bjb2RlLCBvcHR5LCBvcHZhbF0KKyAgQ1NUX0NPREVfQ0VfR0VQID0gMTIsICAgICAgICAgIC8vIENFX0dFUDogICAgICAgIFtuIHggb3BlcmFuZHNdCisgIENTVF9DT0RFX0NFX1NFTEVDVCA9IDEzLCAgICAgICAvLyBDRV9TRUxFQ1Q6ICAgICBbb3B2YWwsIG9wdmFsLCBvcHZhbF0KKyAgQ1NUX0NPREVfQ0VfRVhUUkFDVEVMVCA9IDE0LCAgIC8vIENFX0VYVFJBQ1RFTFQ6IFtvcHR5LCBvcHZhbCwgb3B2YWxdCisgIENTVF9DT0RFX0NFX0lOU0VSVEVMVCA9IDE1LCAgICAvLyBDRV9JTlNFUlRFTFQ6ICBbb3B2YWwsIG9wdmFsLCBvcHZhbF0KKyAgQ1NUX0NPREVfQ0VfU0hVRkZMRVZFQyA9IDE2LCAgIC8vIENFX1NIVUZGTEVWRUM6IFtvcHZhbCwgb3B2YWwsIG9wdmFsXQorICBDU1RfQ09ERV9DRV9DTVAgPSAxNywgICAgICAgICAgLy8gQ0VfQ01QOiAgICAgICAgW29wdHksIG9wdmFsLCBvcHZhbCwgcHJlZF0KKyAgQ1NUX0NPREVfSU5MSU5FQVNNX09MRCA9IDE4LCAgIC8vIElOTElORUFTTTogICAgIFtzaWRlZWZmZWN0fGFsaWduc3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgYXNtc3RyLGNvbnN0c3RyXQorICBDU1RfQ09ERV9DRV9TSFVGVkVDX0VYID0gMTksICAgLy8gU0hVRlZFQ19FWDogICAgW29wdHksIG9wdmFsLCBvcHZhbCwgb3B2YWxdCisgIENTVF9DT0RFX0NFX0lOQk9VTkRTX0dFUCA9IDIwLCAvLyBJTkJPVU5EU19HRVA6ICBbbiB4IG9wZXJhbmRzXQorICBDU1RfQ09ERV9CTE9DS0FERFJFU1MgPSAyMSwgICAgLy8gQ1NUX0NPREVfQkxPQ0tBRERSRVNTIFtmbnR5LCBmbnZhbCwgYmIjXQorICBDU1RfQ09ERV9EQVRBID0gMjIsICAgICAgICAgICAgLy8gREFUQTogICAgICAgICAgW24geCBlbGVtZW50c10KKyAgQ1NUX0NPREVfSU5MSU5FQVNNID0gMjMsICAgICAgIC8vIElOTElORUFTTTogICAgIFtzaWRlZWZmZWN0fGFsaWduc3RhY2t8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgYXNtZGlhbGVjdCxhc21zdHIsY29uc3RzdHJdCisgIENTVF9DT0RFX0NFX0dFUF9XSVRIX0lOUkFOR0VfSU5ERVggPSAyNCwgLy8gICAgICBbb3B0eSwgZmxhZ3MsIG4geCBvcGVyYW5kc10KK307CisKKy8vLyBDYXN0T3Bjb2RlcyAtIFRoZXNlIGFyZSB2YWx1ZXMgdXNlZCBpbiB0aGUgYml0Y29kZSBmaWxlcyB0byBlbmNvZGUgd2hpY2gKKy8vLyBjYXN0IGEgQ1NUX0NPREVfQ0VfQ0FTVCBvciBhIFhYWCByZWZlcnMgdG8uICBUaGUgdmFsdWVzIG9mIHRoZXNlIGVudW1zCisvLy8gaGF2ZSBubyBmaXhlZCByZWxhdGlvbiB0byB0aGUgTExWTSBJUiBlbnVtIHZhbHVlcy4gIENoYW5naW5nIHRoZXNlIHdpbGwKKy8vLyBicmVhayBjb21wYXRpYmlsaXR5IHdpdGggb2xkIGZpbGVzLgorZW51bSBDYXN0T3Bjb2RlcyB7CisgIENBU1RfVFJVTkMgPSAwLAorICBDQVNUX1pFWFQgPSAxLAorICBDQVNUX1NFWFQgPSAyLAorICBDQVNUX0ZQVE9VSSA9IDMsCisgIENBU1RfRlBUT1NJID0gNCwKKyAgQ0FTVF9VSVRPRlAgPSA1LAorICBDQVNUX1NJVE9GUCA9IDYsCisgIENBU1RfRlBUUlVOQyA9IDcsCisgIENBU1RfRlBFWFQgPSA4LAorICBDQVNUX1BUUlRPSU5UID0gOSwKKyAgQ0FTVF9JTlRUT1BUUiA9IDEwLAorICBDQVNUX0JJVENBU1QgPSAxMSwKKyAgQ0FTVF9BRERSU1BBQ0VDQVNUID0gMTIKK307CisKKy8vLyBCaW5hcnlPcGNvZGVzIC0gVGhlc2UgYXJlIHZhbHVlcyB1c2VkIGluIHRoZSBiaXRjb2RlIGZpbGVzIHRvIGVuY29kZSB3aGljaAorLy8vIGJpbm9wIGEgQ1NUX0NPREVfQ0VfQklOT1Agb3IgYSBYWFggcmVmZXJzIHRvLiAgVGhlIHZhbHVlcyBvZiB0aGVzZSBlbnVtcworLy8vIGhhdmUgbm8gZml4ZWQgcmVsYXRpb24gdG8gdGhlIExMVk0gSVIgZW51bSB2YWx1ZXMuICBDaGFuZ2luZyB0aGVzZSB3aWxsCisvLy8gYnJlYWsgY29tcGF0aWJpbGl0eSB3aXRoIG9sZCBmaWxlcy4KK2VudW0gQmluYXJ5T3Bjb2RlcyB7CisgIEJJTk9QX0FERCA9IDAsCisgIEJJTk9QX1NVQiA9IDEsCisgIEJJTk9QX01VTCA9IDIsCisgIEJJTk9QX1VESVYgPSAzLAorICBCSU5PUF9TRElWID0gNCwgLy8gb3ZlcmxvYWRlZCBmb3IgRlAKKyAgQklOT1BfVVJFTSA9IDUsCisgIEJJTk9QX1NSRU0gPSA2LCAvLyBvdmVybG9hZGVkIGZvciBGUAorICBCSU5PUF9TSEwgPSA3LAorICBCSU5PUF9MU0hSID0gOCwKKyAgQklOT1BfQVNIUiA9IDksCisgIEJJTk9QX0FORCA9IDEwLAorICBCSU5PUF9PUiA9IDExLAorICBCSU5PUF9YT1IgPSAxMgorfTsKKworLy8vIFRoZXNlIGFyZSB2YWx1ZXMgdXNlZCBpbiB0aGUgYml0Y29kZSBmaWxlcyB0byBlbmNvZGUgQXRvbWljUk1XIG9wZXJhdGlvbnMuCisvLy8gVGhlIHZhbHVlcyBvZiB0aGVzZSBlbnVtcyBoYXZlIG5vIGZpeGVkIHJlbGF0aW9uIHRvIHRoZSBMTFZNIElSIGVudW0KKy8vLyB2YWx1ZXMuICBDaGFuZ2luZyB0aGVzZSB3aWxsIGJyZWFrIGNvbXBhdGliaWxpdHkgd2l0aCBvbGQgZmlsZXMuCitlbnVtIFJNV09wZXJhdGlvbnMgeworICBSTVdfWENIRyA9IDAsCisgIFJNV19BREQgPSAxLAorICBSTVdfU1VCID0gMiwKKyAgUk1XX0FORCA9IDMsCisgIFJNV19OQU5EID0gNCwKKyAgUk1XX09SID0gNSwKKyAgUk1XX1hPUiA9IDYsCisgIFJNV19NQVggPSA3LAorICBSTVdfTUlOID0gOCwKKyAgUk1XX1VNQVggPSA5LAorICBSTVdfVU1JTiA9IDEwCit9OworCisvLy8gT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvck9wdGlvbmFsRmxhZ3MgLSBGbGFncyBmb3Igc2VyaWFsaXppbmcKKy8vLyBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yJ3MgU3ViY2xhc3NPcHRpb25hbERhdGEgY29udGVudHMuCitlbnVtIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3JPcHRpb25hbEZsYWdzIHsKKyAgT0JPX05PX1VOU0lHTkVEX1dSQVAgPSAwLAorICBPQk9fTk9fU0lHTkVEX1dSQVAgPSAxCit9OworCisvLy8gRmFzdE1hdGggRmxhZ3MKKy8vLyBUaGlzIGlzIGEgZml4ZWQgbGF5b3V0IGRlcml2ZWQgZnJvbSB0aGUgYml0Y29kZSBlbWl0dGVkIGJ5IExMVk0gNS4wCisvLy8gaW50ZW5kZWQgdG8gZGVjb3VwbGUgdGhlIGluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBmcm9tIHRoZSBzZXJpYWxpemF0aW9uLgorZW51bSBGYXN0TWF0aE1hcCB7CisgIFVuc2FmZUFsZ2VicmEgICA9ICgxIDw8IDApLCAvLyBMZWdhY3kKKyAgTm9OYU5zICAgICAgICAgID0gKDEgPDwgMSksCisgIE5vSW5mcyAgICAgICAgICA9ICgxIDw8IDIpLAorICBOb1NpZ25lZFplcm9zICAgPSAoMSA8PCAzKSwKKyAgQWxsb3dSZWNpcHJvY2FsID0gKDEgPDwgNCksCisgIEFsbG93Q29udHJhY3QgICA9ICgxIDw8IDUpLAorICBBcHByb3hGdW5jICAgICAgPSAoMSA8PCA2KSwKKyAgQWxsb3dSZWFzc29jICAgID0gKDEgPDwgNykKK307CisKKy8vLyBQb3NzaWJseUV4YWN0T3BlcmF0b3JPcHRpb25hbEZsYWdzIC0gRmxhZ3MgZm9yIHNlcmlhbGl6aW5nCisvLy8gUG9zc2libHlFeGFjdE9wZXJhdG9yJ3MgU3ViY2xhc3NPcHRpb25hbERhdGEgY29udGVudHMuCitlbnVtIFBvc3NpYmx5RXhhY3RPcGVyYXRvck9wdGlvbmFsRmxhZ3MgeyBQRU9fRVhBQ1QgPSAwIH07CisKKy8vLyBFbmNvZGVkIEF0b21pY09yZGVyaW5nIHZhbHVlcy4KK2VudW0gQXRvbWljT3JkZXJpbmdDb2RlcyB7CisgIE9SREVSSU5HX05PVEFUT01JQyA9IDAsCisgIE9SREVSSU5HX1VOT1JERVJFRCA9IDEsCisgIE9SREVSSU5HX01PTk9UT05JQyA9IDIsCisgIE9SREVSSU5HX0FDUVVJUkUgPSAzLAorICBPUkRFUklOR19SRUxFQVNFID0gNCwKKyAgT1JERVJJTkdfQUNRUkVMID0gNSwKKyAgT1JERVJJTkdfU0VRQ1NUID0gNgorfTsKKworLy8vIE1hcmtlcnMgYW5kIGZsYWdzIGZvciBjYWxsIGluc3RydWN0aW9uLgorZW51bSBDYWxsTWFya2Vyc0ZsYWdzIHsKKyAgQ0FMTF9UQUlMID0gMCwKKyAgQ0FMTF9DQ09OViA9IDEsCisgIENBTExfTVVTVFRBSUwgPSAxNCwKKyAgQ0FMTF9FWFBMSUNJVF9UWVBFID0gMTUsCisgIENBTExfTk9UQUlMID0gMTYsCisgIENBTExfRk1GID0gMTcgLy8gQ2FsbCBoYXMgb3B0aW9uYWwgZmFzdC1tYXRoLWZsYWdzLgorfTsKKworLy8gVGhlIGZ1bmN0aW9uIGJvZHkgYmxvY2sgKEZVTkNUSU9OX0JMT0NLX0lEKSBkZXNjcmliZXMgZnVuY3Rpb24gYm9kaWVzLiAgSXQKKy8vIGNhbiBjb250YWluIGEgY29uc3RhbnQgYmxvY2sgKENPTlNUQU5UU19CTE9DS19JRCkuCitlbnVtIEZ1bmN0aW9uQ29kZXMgeworICBGVU5DX0NPREVfREVDTEFSRUJMT0NLUyA9IDEsIC8vIERFQ0xBUkVCTE9DS1M6IFtuXQorCisgIEZVTkNfQ09ERV9JTlNUX0JJTk9QID0gMiwgICAgICAvLyBCSU5PUDogICAgICBbb3Bjb2RlLCB0eSwgb3B2YWwsIG9wdmFsXQorICBGVU5DX0NPREVfSU5TVF9DQVNUID0gMywgICAgICAgLy8gQ0FTVDogICAgICAgW29wY29kZSwgdHksIG9wdHksIG9wdmFsXQorICBGVU5DX0NPREVfSU5TVF9HRVBfT0xEID0gNCwgICAgLy8gR0VQOiAgICAgICAgW24geCBvcGVyYW5kc10KKyAgRlVOQ19DT0RFX0lOU1RfU0VMRUNUID0gNSwgICAgIC8vIFNFTEVDVDogICAgIFt0eSwgb3B2YWwsIG9wdmFsLCBvcHZhbF0KKyAgRlVOQ19DT0RFX0lOU1RfRVhUUkFDVEVMVCA9IDYsIC8vIEVYVFJBQ1RFTFQ6IFtvcHR5LCBvcHZhbCwgb3B2YWxdCisgIEZVTkNfQ09ERV9JTlNUX0lOU0VSVEVMVCA9IDcsICAvLyBJTlNFUlRFTFQ6ICBbdHksIG9wdmFsLCBvcHZhbCwgb3B2YWxdCisgIEZVTkNfQ09ERV9JTlNUX1NIVUZGTEVWRUMgPSA4LCAvLyBTSFVGRkxFVkVDOiBbdHksIG9wdmFsLCBvcHZhbCwgb3B2YWxdCisgIEZVTkNfQ09ERV9JTlNUX0NNUCA9IDksICAgICAgICAvLyBDTVA6ICAgICAgICBbb3B0eSwgb3B2YWwsIG9wdmFsLCBwcmVkXQorCisgIEZVTkNfQ09ERV9JTlNUX1JFVCA9IDEwLCAgICAvLyBSRVQ6ICAgICAgICBbb3B0eSxvcHZhbDxib3RoIG9wdGlvbmFsPl0KKyAgRlVOQ19DT0RFX0lOU1RfQlIgPSAxMSwgICAgIC8vIEJSOiAgICAgICAgIFtiYiMsIGJiIywgY29uZF0gb3IgW2JiI10KKyAgRlVOQ19DT0RFX0lOU1RfU1dJVENIID0gMTIsIC8vIFNXSVRDSDogICAgIFtvcHR5LCBvcDAsIG9wMSwgLi4uXQorICBGVU5DX0NPREVfSU5TVF9JTlZPS0UgPSAxMywgLy8gSU5WT0tFOiAgICAgW2F0dHIsIGZudHksIG9wMCxvcDEsIC4uLl0KKyAgLy8gMTQgaXMgdW51c2VkLgorICBGVU5DX0NPREVfSU5TVF9VTlJFQUNIQUJMRSA9IDE1LCAvLyBVTlJFQUNIQUJMRQorCisgIEZVTkNfQ09ERV9JTlNUX1BISSA9IDE2LCAvLyBQSEk6ICAgICAgICBbdHksIHZhbDAsYmIwLCAuLi5dCisgIC8vIDE3IGlzIHVudXNlZC4KKyAgLy8gMTggaXMgdW51c2VkLgorICBGVU5DX0NPREVfSU5TVF9BTExPQ0EgPSAxOSwgLy8gQUxMT0NBOiAgICAgW2luc3R0eSwgb3B0eSwgb3AsIGFsaWduXQorICBGVU5DX0NPREVfSU5TVF9MT0FEID0gMjAsICAgLy8gTE9BRDogICAgICAgW29wdHksIG9wLCBhbGlnbiwgdm9sXQorICAvLyAyMSBpcyB1bnVzZWQuCisgIC8vIDIyIGlzIHVudXNlZC4KKyAgRlVOQ19DT0RFX0lOU1RfVkFBUkcgPSAyMywgLy8gVkFBUkc6ICAgICAgW3ZhbGlzdHR5LCB2YWxpc3QsIGluc3R0eV0KKyAgLy8gVGhpcyBzdG9yZSBjb2RlIGVuY29kZXMgdGhlIHBvaW50ZXIgdHlwZSwgcmF0aGVyIHRoYW4gdGhlIHZhbHVlIHR5cGUKKyAgLy8gdGhpcyBpcyBzbyBpbmZvcm1hdGlvbiBvbmx5IGF2YWlsYWJsZSBpbiB0aGUgcG9pbnRlciB0eXBlIChlLmcuIGFkZHJlc3MKKyAgLy8gc3BhY2VzKSBpcyByZXRhaW5lZC4KKyAgRlVOQ19DT0RFX0lOU1RfU1RPUkVfT0xEID0gMjQsIC8vIFNUT1JFOiAgICAgIFtwdHJ0eSxwdHIsdmFsLCBhbGlnbiwgdm9sXQorICAvLyAyNSBpcyB1bnVzZWQuCisgIEZVTkNfQ09ERV9JTlNUX0VYVFJBQ1RWQUwgPSAyNiwgLy8gRVhUUkFDVFZBTDogW24geCBvcGVyYW5kc10KKyAgRlVOQ19DT0RFX0lOU1RfSU5TRVJUVkFMID0gMjcsICAvLyBJTlNFUlRWQUw6ICBbbiB4IG9wZXJhbmRzXQorICAvLyBmY21wL2ljbXAgcmV0dXJuaW5nIEludDFUWSBvciB2ZWN0b3Igb2YgSW50MVR5LiBTYW1lIGFzIENNUCwgZXhpc3RzIHRvCisgIC8vIHN1cHBvcnQgbGVnYWN5IHZpY21wL3ZmY21wIGluc3RydWN0aW9ucy4KKyAgRlVOQ19DT0RFX0lOU1RfQ01QMiA9IDI4LCAvLyBDTVAyOiAgICAgICBbb3B0eSwgb3B2YWwsIG9wdmFsLCBwcmVkXQorICAvLyBuZXcgc2VsZWN0IG9uIGkxIG9yIFtOIHggaTFdCisgIEZVTkNfQ09ERV9JTlNUX1ZTRUxFQ1QgPSAyOSwgLy8gVlNFTEVDVDogICAgW3R5LG9wdmFsLG9wdmFsLHByZWR0eSxwcmVkXQorICBGVU5DX0NPREVfSU5TVF9JTkJPVU5EU19HRVBfT0xEID0gMzAsIC8vIElOQk9VTkRTX0dFUDogW24geCBvcGVyYW5kc10KKyAgRlVOQ19DT0RFX0lOU1RfSU5ESVJFQ1RCUiA9IDMxLCAgICAgICAvLyBJTkRJUkVDVEJSOiBbb3B0eSwgb3AwLCBvcDEsIC4uLl0KKyAgLy8gMzIgaXMgdW51c2VkLgorICBGVU5DX0NPREVfREVCVUdfTE9DX0FHQUlOID0gMzMsIC8vIERFQlVHX0xPQ19BR0FJTgorCisgIEZVTkNfQ09ERV9JTlNUX0NBTEwgPSAzNCwgLy8gQ0FMTDogICAgW2F0dHIsIGNjLCBmbnR5LCBmbmlkLCBhcmdzLi4uXQorCisgIEZVTkNfQ09ERV9ERUJVR19MT0MgPSAzNSwgICAgICAgIC8vIERFQlVHX0xPQzogIFtMaW5lLENvbCxTY29wZVZhbCwgSUFWYWxdCisgIEZVTkNfQ09ERV9JTlNUX0ZFTkNFID0gMzYsICAgICAgIC8vIEZFTkNFOiBbb3JkZXJpbmcsIHN5bmNoc2NvcGVdCisgIEZVTkNfQ09ERV9JTlNUX0NNUFhDSEdfT0xEID0gMzcsIC8vIENNUFhDSEc6IFtwdHJ0eSxwdHIsY21wLG5ldywgYWxpZ24sIHZvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgIG9yZGVyaW5nLCBzeW5jaHNjb3BlXQorICBGVU5DX0NPREVfSU5TVF9BVE9NSUNSTVcgPSAzOCwgICAvLyBBVE9NSUNSTVc6IFtwdHJ0eSxwdHIsdmFsLCBvcGVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIGFsaWduLCB2b2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgIG9yZGVyaW5nLCBzeW5jaHNjb3BlXQorICBGVU5DX0NPREVfSU5TVF9SRVNVTUUgPSAzOSwgICAgICAvLyBSRVNVTUU6ICAgICBbb3B2YWxdCisgIEZVTkNfQ09ERV9JTlNUX0xBTkRJTkdQQURfT0xEID0KKyAgICAgIDQwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBMQU5ESU5HUEFEOiBbdHksdmFsLHZhbCxudW0saWQwLHZhbDAuLi5dCisgIEZVTkNfQ09ERV9JTlNUX0xPQURBVE9NSUMgPSA0MSwgLy8gTE9BRDogW29wdHksIG9wLCBhbGlnbiwgdm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICBvcmRlcmluZywgc3luY2hzY29wZV0KKyAgRlVOQ19DT0RFX0lOU1RfU1RPUkVBVE9NSUNfT0xEID0gNDIsIC8vIFNUT1JFOiBbcHRydHkscHRyLHZhbCwgYWxpZ24sIHZvbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICBvcmRlcmluZywgc3luY2hzY29wZV0KKyAgRlVOQ19DT0RFX0lOU1RfR0VQID0gNDMsICAgICAgICAgICAgIC8vIEdFUDogIFtpbmJvdW5kcywgbiB4IG9wZXJhbmRzXQorICBGVU5DX0NPREVfSU5TVF9TVE9SRSA9IDQ0LCAgICAgICAvLyBTVE9SRTogW3B0cnR5LHB0cix2YWx0eSx2YWwsIGFsaWduLCB2b2xdCisgIEZVTkNfQ09ERV9JTlNUX1NUT1JFQVRPTUlDID0gNDUsIC8vIFNUT1JFOiBbcHRydHkscHRyLHZhbCwgYWxpZ24sIHZvbAorICBGVU5DX0NPREVfSU5TVF9DTVBYQ0hHID0gNDYsICAgICAvLyBDTVBYQ0hHOiBbcHRydHkscHRyLHZhbHR5LGNtcCxuZXcsIGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgdm9sLG9yZGVyaW5nLHN5bmNoc2NvcGVdCisgIEZVTkNfQ09ERV9JTlNUX0xBTkRJTkdQQUQgPSA0NywgIC8vIExBTkRJTkdQQUQ6IFt0eSx2YWwsbnVtLGlkMCx2YWwwLi4uXQorICBGVU5DX0NPREVfSU5TVF9DTEVBTlVQUkVUID0gNDgsICAvLyBDTEVBTlVQUkVUOiBbdmFsXSBvciBbdmFsLGJiI10KKyAgRlVOQ19DT0RFX0lOU1RfQ0FUQ0hSRVQgPSA0OSwgICAgLy8gQ0FUQ0hSRVQ6IFt2YWwsYmIjXQorICBGVU5DX0NPREVfSU5TVF9DQVRDSFBBRCA9IDUwLCAgICAvLyBDQVRDSFBBRDogW2JiIyxiYiMsbnVtLGFyZ3MuLi5dCisgIEZVTkNfQ09ERV9JTlNUX0NMRUFOVVBQQUQgPSA1MSwgIC8vIENMRUFOVVBQQUQ6IFtudW0sYXJncy4uLl0KKyAgRlVOQ19DT0RFX0lOU1RfQ0FUQ0hTV0lUQ0ggPQorICAgICAgNTIsIC8vIENBVENIU1dJVENIOiBbbnVtLGFyZ3MuLi5dIG9yIFtudW0sYXJncy4uLixiYl0KKyAgLy8gNTMgaXMgdW51c2VkLgorICAvLyA1NCBpcyB1bnVzZWQuCisgIEZVTkNfQ09ERV9PUEVSQU5EX0JVTkRMRSA9IDU1LCAvLyBPUEVSQU5EX0JVTkRMRTogW3RhZyMsIHZhbHVlLi4uXQorfTsKKworZW51bSBVc2VMaXN0Q29kZXMgeworICBVU0VMSVNUX0NPREVfREVGQVVMVCA9IDEsIC8vIERFRkFVTFQ6IFtpbmRleC4uLiwgdmFsdWUtaWRdCisgIFVTRUxJU1RfQ09ERV9CQiA9IDIgICAgICAgLy8gQkI6IFtpbmRleC4uLiwgYmItaWRdCit9OworCitlbnVtIEF0dHJpYnV0ZUtpbmRDb2RlcyB7CisgIC8vID0gMCBpcyB1bnVzZWQKKyAgQVRUUl9LSU5EX0FMSUdOTUVOVCA9IDEsCisgIEFUVFJfS0lORF9BTFdBWVNfSU5MSU5FID0gMiwKKyAgQVRUUl9LSU5EX0JZX1ZBTCA9IDMsCisgIEFUVFJfS0lORF9JTkxJTkVfSElOVCA9IDQsCisgIEFUVFJfS0lORF9JTl9SRUcgPSA1LAorICBBVFRSX0tJTkRfTUlOX1NJWkUgPSA2LAorICBBVFRSX0tJTkRfTkFLRUQgPSA3LAorICBBVFRSX0tJTkRfTkVTVCA9IDgsCisgIEFUVFJfS0lORF9OT19BTElBUyA9IDksCisgIEFUVFJfS0lORF9OT19CVUlMVElOID0gMTAsCisgIEFUVFJfS0lORF9OT19DQVBUVVJFID0gMTEsCisgIEFUVFJfS0lORF9OT19EVVBMSUNBVEUgPSAxMiwKKyAgQVRUUl9LSU5EX05PX0lNUExJQ0lUX0ZMT0FUID0gMTMsCisgIEFUVFJfS0lORF9OT19JTkxJTkUgPSAxNCwKKyAgQVRUUl9LSU5EX05PTl9MQVpZX0JJTkQgPSAxNSwKKyAgQVRUUl9LSU5EX05PX1JFRF9aT05FID0gMTYsCisgIEFUVFJfS0lORF9OT19SRVRVUk4gPSAxNywKKyAgQVRUUl9LSU5EX05PX1VOV0lORCA9IDE4LAorICBBVFRSX0tJTkRfT1BUSU1JWkVfRk9SX1NJWkUgPSAxOSwKKyAgQVRUUl9LSU5EX1JFQURfTk9ORSA9IDIwLAorICBBVFRSX0tJTkRfUkVBRF9PTkxZID0gMjEsCisgIEFUVFJfS0lORF9SRVRVUk5FRCA9IDIyLAorICBBVFRSX0tJTkRfUkVUVVJOU19UV0lDRSA9IDIzLAorICBBVFRSX0tJTkRfU19FWFQgPSAyNCwKKyAgQVRUUl9LSU5EX1NUQUNLX0FMSUdOTUVOVCA9IDI1LAorICBBVFRSX0tJTkRfU1RBQ0tfUFJPVEVDVCA9IDI2LAorICBBVFRSX0tJTkRfU1RBQ0tfUFJPVEVDVF9SRVEgPSAyNywKKyAgQVRUUl9LSU5EX1NUQUNLX1BST1RFQ1RfU1RST05HID0gMjgsCisgIEFUVFJfS0lORF9TVFJVQ1RfUkVUID0gMjksCisgIEFUVFJfS0lORF9TQU5JVElaRV9BRERSRVNTID0gMzAsCisgIEFUVFJfS0lORF9TQU5JVElaRV9USFJFQUQgPSAzMSwKKyAgQVRUUl9LSU5EX1NBTklUSVpFX01FTU9SWSA9IDMyLAorICBBVFRSX0tJTkRfVVdfVEFCTEUgPSAzMywKKyAgQVRUUl9LSU5EX1pfRVhUID0gMzQsCisgIEFUVFJfS0lORF9CVUlMVElOID0gMzUsCisgIEFUVFJfS0lORF9DT0xEID0gMzYsCisgIEFUVFJfS0lORF9PUFRJTUlaRV9OT05FID0gMzcsCisgIEFUVFJfS0lORF9JTl9BTExPQ0EgPSAzOCwKKyAgQVRUUl9LSU5EX05PTl9OVUxMID0gMzksCisgIEFUVFJfS0lORF9KVU1QX1RBQkxFID0gNDAsCisgIEFUVFJfS0lORF9ERVJFRkVSRU5DRUFCTEUgPSA0MSwKKyAgQVRUUl9LSU5EX0RFUkVGRVJFTkNFQUJMRV9PUl9OVUxMID0gNDIsCisgIEFUVFJfS0lORF9DT05WRVJHRU5UID0gNDMsCisgIEFUVFJfS0lORF9TQUZFU1RBQ0sgPSA0NCwKKyAgQVRUUl9LSU5EX0FSR01FTU9OTFkgPSA0NSwKKyAgQVRUUl9LSU5EX1NXSUZUX1NFTEYgPSA0NiwKKyAgQVRUUl9LSU5EX1NXSUZUX0VSUk9SID0gNDcsCisgIEFUVFJfS0lORF9OT19SRUNVUlNFID0gNDgsCisgIEFUVFJfS0lORF9JTkFDQ0VTU0lCTEVNRU1fT05MWSA9IDQ5LAorICBBVFRSX0tJTkRfSU5BQ0NFU1NJQkxFTUVNX09SX0FSR01FTU9OTFkgPSA1MCwKKyAgQVRUUl9LSU5EX0FMTE9DX1NJWkUgPSA1MSwKKyAgQVRUUl9LSU5EX1dSSVRFT05MWSA9IDUyLAorICBBVFRSX0tJTkRfU1BFQ1VMQVRBQkxFID0gNTMsCisgIEFUVFJfS0lORF9TVFJJQ1RfRlAgPSA1NCwKKyAgQVRUUl9LSU5EX1NBTklUSVpFX0hXQUREUkVTUyA9IDU1LAorICBBVFRSX0tJTkRfTk9DRl9DSEVDSyA9IDU2LAorICBBVFRSX0tJTkRfT1BUX0ZPUl9GVVpaSU5HID0gNTcsCit9OworCitlbnVtIENvbWRhdFNlbGVjdGlvbktpbmRDb2RlcyB7CisgIENPTURBVF9TRUxFQ1RJT05fS0lORF9BTlkgPSAxLAorICBDT01EQVRfU0VMRUNUSU9OX0tJTkRfRVhBQ1RfTUFUQ0ggPSAyLAorICBDT01EQVRfU0VMRUNUSU9OX0tJTkRfTEFSR0VTVCA9IDMsCisgIENPTURBVF9TRUxFQ1RJT05fS0lORF9OT19EVVBMSUNBVEVTID0gNCwKKyAgQ09NREFUX1NFTEVDVElPTl9LSU5EX1NBTUVfU0laRSA9IDUsCit9OworCitlbnVtIFN0cnRhYkNvZGVzIHsKKyAgU1RSVEFCX0JMT0IgPSAxLAorfTsKKworZW51bSBTeW10YWJDb2RlcyB7CisgIFNZTVRBQl9CTE9CID0gMSwKK307CisKK30gLy8gRW5kIGJpdGMgbmFtZXNwYWNlCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9BY2NlbFRhYmxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vQWNjZWxUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjODUwYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vQWNjZWxUYWJsZS5oCkBAIC0wLDAgKzEsMzczIEBACisvLz09LSBpbmNsdWRlL2xsdm0vQ29kZUdlbi9BY2NlbFRhYmxlLmggLSBBY2NlbGVyYXRvciBUYWJsZXMgLS0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBzdXBwb3J0IGZvciB3cml0aW5nIGFjY2VsZXJhdG9yIHRhYmxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9EV0FSRkFDQ0VMVEFCTEVfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fRFdBUkZBQ0NFTFRBQkxFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9ESUUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vRHdhcmZTdHJpbmdQb29sRW50cnkuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9ESkIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworLy8vIFRoZSBEV0FSRiBhbmQgQXBwbGUgYWNjZWxlcmF0b3IgdGFibGVzIGFyZSBhbiBpbmRpcmVjdCBoYXNoIHRhYmxlIG9wdGltaXplZAorLy8vIGZvciBudWxsIGxvb2t1cCByYXRoZXIgdGhhbiBhY2Nlc3MgdG8ga25vd24gZGF0YS4gVGhlIEFwcGxlIGFjY2VsZXJhdG9yCisvLy8gdGFibGVzIGFyZSBhIHByZWN1cnNvciBvZiB0aGUgbmV3ZXIgRFdBUkYgdjUgYWNjZWxlcmF0b3IgdGFibGVzLiBCb3RoCisvLy8gZm9ybWF0cyBzaGFyZSBjb21tb24gZGVzaWduIGlkZWFzLgorLy8vCisvLy8gVGhlIEFwcGxlIGFjY2VsZXJhdG9yIHRhYmxlIGFyZSBvdXRwdXQgaW50byBhbiBvbi1kaXNrIGZvcm1hdCB0aGF0IGxvb2tzCisvLy8gbGlrZSB0aGlzOgorLy8vCisvLy8gLi0tLS0tLS0tLS0tLS0tLS0tLS4KKy8vLyB8ICBIRUFERVIgICAgICAgICAgfAorLy8vIHwtLS0tLS0tLS0tLS0tLS0tLS18CisvLy8gfCAgQlVDS0VUUyAgICAgICAgIHwKKy8vLyB8LS0tLS0tLS0tLS0tLS0tLS0tfAorLy8vIHwgIEhBU0hFUyAgICAgICAgICB8CisvLy8gfC0tLS0tLS0tLS0tLS0tLS0tLXwKKy8vLyB8ICBPRkZTRVRTICAgICAgICAgfAorLy8vIHwtLS0tLS0tLS0tLS0tLS0tLS18CisvLy8gfCAgREFUQSAgICAgICAgICAgIHwKKy8vLyBgLS0tLS0tLS0tLS0tLS0tLS0tJworLy8vCisvLy8gVGhlIGhlYWRlciBjb250YWlucyBhIG1hZ2ljIG51bWJlciwgdmVyc2lvbiwgdHlwZSBvZiBoYXNoIGZ1bmN0aW9uLAorLy8vIHRoZSBudW1iZXIgb2YgYnVja2V0cywgdG90YWwgbnVtYmVyIG9mIGhhc2hlcywgYW5kIHJvb20gZm9yIGEgc3BlY2lhbCBzdHJ1Y3QKKy8vLyBvZiBkYXRhIGFuZCB0aGUgbGVuZ3RoIG9mIHRoYXQgc3RydWN0LgorLy8vCisvLy8gVGhlIGJ1Y2tldHMgY29udGFpbiBhbiBpbmRleCAoZS5nLiA2KSBpbnRvIHRoZSBoYXNoZXMgYXJyYXkuIFRoZSBoYXNoZXMKKy8vLyBzZWN0aW9uIGNvbnRhaW5zIGFsbCBvZiB0aGUgMzItYml0IGhhc2ggdmFsdWVzIGluIGNvbnRpZ3VvdXMgbWVtb3J5LCBhbmQgdGhlCisvLy8gb2Zmc2V0cyBjb250YWluIHRoZSBvZmZzZXQgaW50byB0aGUgZGF0YSBhcmVhIGZvciB0aGUgcGFydGljdWxhciBoYXNoLgorLy8vCisvLy8gRm9yIGEgbG9va3VwIGV4YW1wbGUsIHdlIGNvdWxkIGhhc2ggYSBmdW5jdGlvbiBuYW1lIGFuZCB0YWtlIGl0IG1vZHVsbyB0aGUKKy8vLyBudW1iZXIgb2YgYnVja2V0cyBnaXZpbmcgdXMgb3VyIGJ1Y2tldC4gRnJvbSB0aGVyZSB3ZSB0YWtlIHRoZSBidWNrZXQgdmFsdWUKKy8vLyBhcyBhbiBpbmRleCBpbnRvIHRoZSBoYXNoZXMgdGFibGUgYW5kIGxvb2sgYXQgZWFjaCBzdWNjZXNzaXZlIGhhc2ggYXMgbG9uZworLy8vIGFzIHRoZSBoYXNoIHZhbHVlIGlzIHN0aWxsIHRoZSBzYW1lIG1vZHVsbyByZXN1bHQgKGJ1Y2tldCB2YWx1ZSkgYXMgZWFybGllci4KKy8vLyBJZiB3ZSBoYXZlIGEgbWF0Y2ggd2UgbG9vayBhdCB0aGF0IHNhbWUgZW50cnkgaW4gdGhlIG9mZnNldHMgdGFibGUgYW5kIGdyYWIKKy8vLyB0aGUgb2Zmc2V0IGluIHRoZSBkYXRhIGZvciBvdXIgZmluYWwgbWF0Y2guCisvLy8KKy8vLyBUaGUgRFdBUkYgdjUgYWNjZWxlcmF0b3IgdGFibGUgY29uc2lzdHMgb2YgemVybyBvciBtb3JlIG5hbWUgaW5kaWNlcyB0aGF0CisvLy8gYXJlIG91dHB1dCBpbnRvIGFuIG9uLWRpc2sgZm9ybWF0IHRoYXQgbG9va3MgbGlrZSB0aGlzOgorLy8vCisvLy8gLi0tLS0tLS0tLS0tLS0tLS0tLS4KKy8vLyB8ICBIRUFERVIgICAgICAgICAgfAorLy8vIHwtLS0tLS0tLS0tLS0tLS0tLS18CisvLy8gfCAgQ1UgTElTVCAgICAgICAgIHwKKy8vLyB8LS0tLS0tLS0tLS0tLS0tLS0tfAorLy8vIHwgIExPQ0FMIFRVIExJU1QgICB8CisvLy8gfC0tLS0tLS0tLS0tLS0tLS0tLXwKKy8vLyB8ICBGT1JFSUdOIFRVIExJU1QgfAorLy8vIHwtLS0tLS0tLS0tLS0tLS0tLS18CisvLy8gfCAgSEFTSCBUQUJMRSAgICAgIHwKKy8vLyB8LS0tLS0tLS0tLS0tLS0tLS0tfAorLy8vIHwgIE5BTUUgVEFCTEUgICAgICB8CisvLy8gfC0tLS0tLS0tLS0tLS0tLS0tLXwKKy8vLyB8ICBBQkJSRVYgVEFCTEUgICAgfAorLy8vIHwtLS0tLS0tLS0tLS0tLS0tLS18CisvLy8gfCAgRU5UUlkgUE9PTCAgICAgIHwKKy8vLyBgLS0tLS0tLS0tLS0tLS0tLS0tJworLy8vCisvLy8gRm9yIHRoZSBmdWxsIGRvY3VtZW50YXRpb24gcGxlYXNlIHJlZmVyIHRvIHRoZSBEV0FSRiA1IHN0YW5kYXJkLgorLy8vCisvLy8KKy8vLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgY2xhc3MgdGVtcGxhdGUgQWNjZWxUYWJsZSwgd2hpY2ggaXMgcmVwcmVzZW50cyBhbgorLy8vIGFic3RyYWN0IHZpZXcgb2YgYW4gQWNjZWxlcmF0b3IgdGFibGUsIHdpdGhvdXQgYW55IG5vdGlvbiBvZiBhbiBvbi1kaXNrCisvLy8gbGF5b3V0LiBUaGlzIGNsYXNzIGlzIHBhcmFtZXRlcml6ZWQgYnkgYW4gZW50cnkgdHlwZSwgd2hpY2ggc2hvdWxkIGRlcml2ZQorLy8vIGZyb20gQWNjZWxUYWJsZURhdGEuIFRoaXMgaXMgdGhlIHR5cGUgb2YgaW5kaXZpZHVhbCBlbnRyaWVzIGluIHRoZSB0YWJsZSwKKy8vLyBhbmQgaXQgc2hvdWxkIHN0b3JlIHRoZSBkYXRhIG5lY2Vzc2FyeSB0byBlbWl0IHRoZW0uIEFwcGxlQWNjZWxUYWJsZURhdGEgaXMKKy8vLyB0aGUgYmFzZSBjbGFzcyBmb3IgQXBwbGUgQWNjZWxlcmF0b3IgVGFibGUgZW50cmllcywgd2hpY2ggaGF2ZSBhIHVuaWZvcm0KKy8vLyBzdHJ1Y3R1cmUgYmFzZWQgb24gYSBzZXF1ZW5jZSBvZiBBdG9tcy4gVGhlcmUgYXJlIGRpZmZlcmVudCBzdWItY2xhc3NlcworLy8vIGRlcml2ZWQgZnJvbSBBcHBsZUFjY2VsVGFibGUsIHdoaWNoIGRpZmZlciBpbiB0aGUgc2V0IG9mIEF0b21zIGFuZCBob3cgdGhleQorLy8vIG9idGFpbiB0aGVpciB2YWx1ZXMuCisvLy8KKy8vLyBBbiBBcHBsZSBBY2NlbGVyYXRvciBUYWJsZSBjYW4gYmUgc2VyaWFsaXplZCBieSBjYWxsaW5nIGVtaXRBcHBsZUFjY2VsVGFibGUKKy8vLyBmdW5jdGlvbi4KKy8vLworLy8vIFRPRE86IEFkZCBEV0FSRiB2NSBlbWlzc2lvbiBjb2RlLgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFzbVByaW50ZXI7CisKKy8vLyBJbnRlcmZhY2Ugd2hpY2ggdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBhY2NlbGVyYXRvciB0YWJsZSBkYXRhIGhhdmUgdG8KKy8vLyBjb25mb3JtLiBJdCBzZXJ2ZXMgYXMgYSBiYXNlIGNsYXNzIGZvciBkaWZmZXJlbnQgdmFsdWVzIG9mIHRoZSB0ZW1wbGF0ZQorLy8vIGFyZ3VtZW50IG9mIHRoZSBBY2NlbFRhYmxlIGNsYXNzIHRlbXBsYXRlLgorY2xhc3MgQWNjZWxUYWJsZURhdGEgeworcHVibGljOgorICB2aXJ0dWFsIH5BY2NlbFRhYmxlRGF0YSgpID0gZGVmYXVsdDsKKworICBib29sIG9wZXJhdG9yPChjb25zdCBBY2NlbFRhYmxlRGF0YSAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gb3JkZXIoKSA8IE90aGVyLm9yZGVyKCk7CisgIH0KKworICAvLyBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQ6CisgIC8vIHN0YXRpYyB1aW50MzJfdCBoYXNoKFN0cmluZ1JlZiBOYW1lKTsKKworI2lmbmRlZiBOREVCVUcKKyAgdmlydHVhbCB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgPSAwOworI2VuZGlmCitwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdWludDY0X3Qgb3JkZXIoKSBjb25zdCA9IDA7Cit9OworCisvLy8gQSBiYXNlIGNsYXNzIGhvbGRpbmcgbm9uLXRlbXBsYXRlLWRlcGVuZGFudCBmdW5jdGlvbmFsaXR5IG9mIHRoZSBBY2NlbFRhYmxlCisvLy8gY2xhc3MuIENsaWVudHMgc2hvdWxkIG5vdCB1c2UgdGhpcyBjbGFzcyBkaXJlY3RseSBidXQgcmF0aGVyIGluc3RhbnRpYXRlCisvLy8gQWNjZWxUYWJsZSB3aXRoIGEgdHlwZSBkZXJpdmVkIGZyb20gQWNjZWxUYWJsZURhdGEuCitjbGFzcyBBY2NlbFRhYmxlQmFzZSB7CitwdWJsaWM6CisgIHVzaW5nIEhhc2hGbiA9IHVpbnQzMl90KFN0cmluZ1JlZik7CisKKyAgLy8vIFJlcHJlc2VudHMgYSBncm91cCBvZiBlbnRyaWVzIHdpdGggaWRlbnRpY2FsIG5hbWUgKGFuZCBoZW5jZSwgaGFzaCB2YWx1ZSkuCisgIHN0cnVjdCBIYXNoRGF0YSB7CisgICAgRHdhcmZTdHJpbmdQb29sRW50cnlSZWYgTmFtZTsKKyAgICB1aW50MzJfdCBIYXNoVmFsdWU7CisgICAgc3RkOjp2ZWN0b3I8QWNjZWxUYWJsZURhdGEgKj4gVmFsdWVzOworICAgIE1DU3ltYm9sICpTeW07CisKKyAgICBIYXNoRGF0YShEd2FyZlN0cmluZ1Bvb2xFbnRyeVJlZiBOYW1lLCBIYXNoRm4gKkhhc2gpCisgICAgICAgIDogTmFtZShOYW1lKSwgSGFzaFZhbHVlKEhhc2goTmFtZS5nZXRTdHJpbmcoKSkpIHt9CisKKyNpZm5kZWYgTkRFQlVHCisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICAgIHZvaWQgZHVtcCgpIGNvbnN0IHsgcHJpbnQoZGJncygpKTsgfQorI2VuZGlmCisgIH07CisgIHVzaW5nIEhhc2hMaXN0ID0gc3RkOjp2ZWN0b3I8SGFzaERhdGEgKj47CisgIHVzaW5nIEJ1Y2tldExpc3QgPSBzdGQ6OnZlY3RvcjxIYXNoTGlzdD47CisKK3Byb3RlY3RlZDoKKyAgLy8vIEFsbG9jYXRvciBmb3IgSGFzaERhdGEgYW5kIFZhbHVlcy4KKyAgQnVtcFB0ckFsbG9jYXRvciBBbGxvY2F0b3I7CisKKyAgdXNpbmcgU3RyaW5nRW50cmllcyA9IFN0cmluZ01hcDxIYXNoRGF0YSwgQnVtcFB0ckFsbG9jYXRvciAmPjsKKyAgU3RyaW5nRW50cmllcyBFbnRyaWVzOworCisgIEhhc2hGbiAqSGFzaDsKKyAgdWludDMyX3QgQnVja2V0Q291bnQ7CisgIHVpbnQzMl90IFVuaXF1ZUhhc2hDb3VudDsKKworICBIYXNoTGlzdCBIYXNoZXM7CisgIEJ1Y2tldExpc3QgQnVja2V0czsKKworICB2b2lkIGNvbXB1dGVCdWNrZXRDb3VudCgpOworCisgIEFjY2VsVGFibGVCYXNlKEhhc2hGbiAqSGFzaCkgOiBFbnRyaWVzKEFsbG9jYXRvciksIEhhc2goSGFzaCkge30KKworcHVibGljOgorICB2b2lkIGZpbmFsaXplKEFzbVByaW50ZXIgKkFzbSwgU3RyaW5nUmVmIFByZWZpeCk7CisgIEFycmF5UmVmPEhhc2hMaXN0PiBnZXRCdWNrZXRzKCkgY29uc3QgeyByZXR1cm4gQnVja2V0czsgfQorICB1aW50MzJfdCBnZXRCdWNrZXRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIEJ1Y2tldENvdW50OyB9CisgIHVpbnQzMl90IGdldFVuaXF1ZUhhc2hDb3VudCgpIGNvbnN0IHsgcmV0dXJuIFVuaXF1ZUhhc2hDb3VudDsgfQorICB1aW50MzJfdCBnZXRVbmlxdWVOYW1lQ291bnQoKSBjb25zdCB7IHJldHVybiBFbnRyaWVzLnNpemUoKTsgfQorCisjaWZuZGVmIE5ERUJVRworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0IHsgcHJpbnQoZGJncygpKTsgfQorI2VuZGlmCisKKyAgQWNjZWxUYWJsZUJhc2UoY29uc3QgQWNjZWxUYWJsZUJhc2UgJikgPSBkZWxldGU7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEFjY2VsVGFibGVCYXNlICYpID0gZGVsZXRlOworfTsKKworLy8vIFRoaXMgY2xhc3MgaG9sZHMgYW4gYWJzdHJhY3QgcmVwcmVzZW50YXRpb24gb2YgYW4gQWNjZWxlcmF0b3IgVGFibGUsCisvLy8gY29uc2lzdGluZyBvZiBhIHNlcXVlbmNlIG9mIGJ1Y2tldHMsIGVhY2ggYnVja2V0IGNvbnRhaW5pbnQgYSBzZXF1ZW5jZSBvZgorLy8vIEhhc2hEYXRhIGVudHJpZXMuIFRoZSBjbGFzcyBpcyBwYXJhbWV0ZXJpemVkIGJ5IHRoZSB0eXBlIG9mIGVudHJpZXMgaXQKKy8vLyBob2xkcy4gVGhlIHR5cGUgdGVtcGxhdGUgcGFyYW1ldGVyIGFsc28gZGVmaW5lcyB0aGUgaGFzaCBmdW5jdGlvbiB0byB1c2UgZm9yCisvLy8gaGFzaGluZyBuYW1lcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVD4gY2xhc3MgQWNjZWxUYWJsZSA6IHB1YmxpYyBBY2NlbFRhYmxlQmFzZSB7CitwdWJsaWM6CisgIEFjY2VsVGFibGUoKSA6IEFjY2VsVGFibGVCYXNlKERhdGFUOjpoYXNoKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUeXBlcz4KKyAgdm9pZCBhZGROYW1lKER3YXJmU3RyaW5nUG9vbEVudHJ5UmVmIE5hbWUsIFR5cGVzICYmLi4uIEFyZ3MpOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEFjY2VsVGFibGVEYXRhVD4KK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBUeXBlcz4KK3ZvaWQgQWNjZWxUYWJsZTxBY2NlbFRhYmxlRGF0YVQ+OjphZGROYW1lKER3YXJmU3RyaW5nUG9vbEVudHJ5UmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlcyAmJi4uLiBBcmdzKSB7CisgIGFzc2VydChCdWNrZXRzLmVtcHR5KCkgJiYgIkFscmVhZHkgZmluYWxpemVkISIpOworICAvLyBJZiB0aGUgc3RyaW5nIGlzIGluIHRoZSBsaXN0IGFscmVhZHkgdGhlbiBhZGQgdGhpcyBkaWUgdG8gdGhlIGxpc3QKKyAgLy8gb3RoZXJ3aXNlIGFkZCBhIG5ldyBvbmUuCisgIGF1dG8gSXRlciA9IEVudHJpZXMudHJ5X2VtcGxhY2UoTmFtZS5nZXRTdHJpbmcoKSwgTmFtZSwgSGFzaCkuZmlyc3Q7CisgIGFzc2VydChJdGVyLT5zZWNvbmQuTmFtZSA9PSBOYW1lKTsKKyAgSXRlci0+c2Vjb25kLlZhbHVlcy5wdXNoX2JhY2soCisgICAgICBuZXcgKEFsbG9jYXRvcikgQWNjZWxUYWJsZURhdGFUKHN0ZDo6Zm9yd2FyZDxUeXBlcz4oQXJncykuLi4pKTsKK30KKworLy8vIEEgYmFzZSBjbGFzcyBmb3IgZGlmZmVyZW50IGltcGxlbWVudGF0aW9ucyBvZiBEYXRhIGNsYXNzZXMgZm9yIEFwcGxlCisvLy8gQWNjZWxlcmF0b3IgVGFibGVzLiBUaGUgY29sdW1ucyBpbiB0aGUgdGFibGUgYXJlIGRlZmluZWQgYnkgdGhlIHN0YXRpYyBBdG9tcworLy8vIHZhcmlhYmxlIGRlZmluZWQgb24gdGhlIHN1YmNsYXNzZXMuCitjbGFzcyBBcHBsZUFjY2VsVGFibGVEYXRhIDogcHVibGljIEFjY2VsVGFibGVEYXRhIHsKK3B1YmxpYzoKKyAgLy8vIEFuIEF0b20gZGVmaW5lcyB0aGUgZm9ybSBvZiB0aGUgZGF0YSBpbiBhbiBBcHBsZSBhY2NlbGVyYXRvciB0YWJsZS4KKyAgLy8vIENvbmNlcHR1YWxseSBpdCBpcyBhIGNvbHVtbiBpbiB0aGUgYWNjZWxlcmF0b3IgY29uc2lzdGluZyBvZiBhIHR5cGUgYW5kIGEKKyAgLy8vIHNwZWNpZmljYXRpb24gb2YgdGhlIGZvcm0gb2YgaXRzIGRhdGEuCisgIHN0cnVjdCBBdG9tIHsKKyAgICAvLy8gQXRvbSBUeXBlLgorICAgIGNvbnN0IHVpbnQxNl90IFR5cGU7CisgICAgLy8vIERXQVJGIEZvcm0uCisgICAgY29uc3QgdWludDE2X3QgRm9ybTsKKworICAgIGNvbnN0ZXhwciBBdG9tKHVpbnQxNl90IFR5cGUsIHVpbnQxNl90IEZvcm0pIDogVHlwZShUeXBlKSwgRm9ybShGb3JtKSB7fQorCisjaWZuZGVmIE5ERUJVRworICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoKSBjb25zdCB7IHByaW50KGRiZ3MoKSk7IH0KKyNlbmRpZgorICB9OworICAvLyBTdWJjbGFzc2VzIHNob3VsZCBkZWZpbmU6CisgIC8vIHN0YXRpYyBjb25zdGV4cHIgQXRvbSBBdG9tc1tdOworCisgIHZpcnR1YWwgdm9pZCBlbWl0KEFzbVByaW50ZXIgKkFzbSkgY29uc3QgPSAwOworCisgIHN0YXRpYyB1aW50MzJfdCBoYXNoKFN0cmluZ1JlZiBCdWZmZXIpIHsgcmV0dXJuIGRqYkhhc2goQnVmZmVyKTsgfQorfTsKKwordm9pZCBlbWl0QXBwbGVBY2NlbFRhYmxlSW1wbChBc21QcmludGVyICpBc20sIEFjY2VsVGFibGVCYXNlICZDb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFByZWZpeCwgY29uc3QgTUNTeW1ib2wgKlNlY0JlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxBcHBsZUFjY2VsVGFibGVEYXRhOjpBdG9tPiBBdG9tcyk7CisKKy8vLyBFbWl0IGFuIEFwcGxlIEFjY2VsZXJhdG9yIFRhYmxlIGNvbnNpc3Rpbmcgb2YgZW50cmllcyBpbiB0aGUgc3BlY2lmaWVkCisvLy8gQWNjZWxUYWJsZS4gVGhlIERhdGFUIHRlbXBsYXRlIHBhcmFtZXRlciBzaG91bGQgYmUgZGVyaXZlZCBmcm9tCisvLy8gQXBwbGVBY2NlbFRhYmxlRGF0YS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBEYXRhVD4KK3ZvaWQgZW1pdEFwcGxlQWNjZWxUYWJsZShBc21QcmludGVyICpBc20sIEFjY2VsVGFibGU8RGF0YVQ+ICZDb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgUHJlZml4LCBjb25zdCBNQ1N5bWJvbCAqU2VjQmVnaW4pIHsKKyAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2NvbnZlcnRpYmxlPERhdGFUICosIEFwcGxlQWNjZWxUYWJsZURhdGEgKj46OnZhbHVlLCAiIik7CisgIGVtaXRBcHBsZUFjY2VsVGFibGVJbXBsKEFzbSwgQ29udGVudHMsIFByZWZpeCwgU2VjQmVnaW4sIERhdGFUOjpBdG9tcyk7Cit9CisKKy8vLyBBY2NlbGVyYXRvciB0YWJsZSBkYXRhIGltcGxlbWVudGF0aW9uIGZvciBzaW1wbGUgQXBwbGUgYWNjZWxlcmF0b3IgdGFibGVzCisvLy8gd2l0aCBqdXN0IGEgRElFIHJlZmVyZW5jZS4KK2NsYXNzIEFwcGxlQWNjZWxUYWJsZU9mZnNldERhdGEgOiBwdWJsaWMgQXBwbGVBY2NlbFRhYmxlRGF0YSB7CitwdWJsaWM6CisgIEFwcGxlQWNjZWxUYWJsZU9mZnNldERhdGEoY29uc3QgRElFICpEKSA6IERpZShEKSB7fQorCisgIHZvaWQgZW1pdChBc21QcmludGVyICpBc20pIGNvbnN0IG92ZXJyaWRlOworCisjaWZuZGVmIF9NU0NfVkVSCisgIC8vIFRoZSBsaW5lIGJlbG93IGlzIHJlamVjdGVkIGJ5IG9sZGVyIHZlcnNpb25zIChUQkQpIG9mIE1TVkMuCisgIHN0YXRpYyBjb25zdGV4cHIgQXRvbSBBdG9tc1tdID0geworICAgICAgQXRvbShkd2FyZjo6RFdfQVRPTV9kaWVfb2Zmc2V0LCBkd2FyZjo6RFdfRk9STV9kYXRhNCl9OworI2Vsc2UKKyAgLy8gRklYTUU6IEVyYXNlIHRoaXMgcGF0aCBvbmNlIHRoZSBtaW5pbXVtIE1TQ1YgdmVyc2lvbiBoYXMgYmVlbiBidW1wZWQuCisgIHN0YXRpYyBjb25zdCBTbWFsbFZlY3RvcjxBdG9tLCA0PiBBdG9tczsKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGU7CisjZW5kaWYKK3Byb3RlY3RlZDoKKyAgdWludDY0X3Qgb3JkZXIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBEaWUtPmdldE9mZnNldCgpOyB9CisKKyAgY29uc3QgRElFICpEaWU7Cit9OworCisvLy8gQWNjZWxlcmF0b3IgdGFibGUgZGF0YSBpbXBsZW1lbnRhdGlvbiBmb3IgQXBwbGUgdHlwZSBhY2NlbGVyYXRvciB0YWJsZXMuCitjbGFzcyBBcHBsZUFjY2VsVGFibGVUeXBlRGF0YSA6IHB1YmxpYyBBcHBsZUFjY2VsVGFibGVPZmZzZXREYXRhIHsKK3B1YmxpYzoKKyAgQXBwbGVBY2NlbFRhYmxlVHlwZURhdGEoY29uc3QgRElFICpEKSA6IEFwcGxlQWNjZWxUYWJsZU9mZnNldERhdGEoRCkge30KKworICB2b2lkIGVtaXQoQXNtUHJpbnRlciAqQXNtKSBjb25zdCBvdmVycmlkZTsKKworI2lmbmRlZiBfTVNDX1ZFUgorICAvLyBUaGUgbGluZSBiZWxvdyBpcyByZWplY3RlZCBieSBvbGRlciB2ZXJzaW9ucyAoVEJEKSBvZiBNU1ZDLgorICBzdGF0aWMgY29uc3RleHByIEF0b20gQXRvbXNbXSA9IHsKKyAgICAgIEF0b20oZHdhcmY6OkRXX0FUT01fZGllX29mZnNldCwgZHdhcmY6OkRXX0ZPUk1fZGF0YTQpLAorICAgICAgQXRvbShkd2FyZjo6RFdfQVRPTV9kaWVfdGFnLCBkd2FyZjo6RFdfRk9STV9kYXRhMiksCisgICAgICBBdG9tKGR3YXJmOjpEV19BVE9NX3R5cGVfZmxhZ3MsIGR3YXJmOjpEV19GT1JNX2RhdGExKX07CisjZWxzZQorICAvLyBGSVhNRTogRXJhc2UgdGhpcyBwYXRoIG9uY2UgdGhlIG1pbmltdW0gTVNDViB2ZXJzaW9uIGhhcyBiZWVuIGJ1bXBlZC4KKyAgc3RhdGljIGNvbnN0IFNtYWxsVmVjdG9yPEF0b20sIDQ+IEF0b21zOworI2VuZGlmCisKKyNpZm5kZWYgTkRFQlVHCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZTsKKyNlbmRpZgorfTsKKworLy8vIEFjY2VsZXJhdG9yIHRhYmxlIGRhdGEgaW1wbGVtZW50YXRpb24gZm9yIHNpbXBsZSBBcHBsZSBhY2NlbGVyYXRvciB0YWJsZXMKKy8vLyB3aXRoIGEgRElFIG9mZnNldCBidXQgbm8gYWN0dWFsIERJRSBwb2ludGVyLgorY2xhc3MgQXBwbGVBY2NlbFRhYmxlU3RhdGljT2Zmc2V0RGF0YSA6IHB1YmxpYyBBcHBsZUFjY2VsVGFibGVEYXRhIHsKK3B1YmxpYzoKKyAgQXBwbGVBY2NlbFRhYmxlU3RhdGljT2Zmc2V0RGF0YSh1aW50MzJfdCBPZmZzZXQpIDogT2Zmc2V0KE9mZnNldCkge30KKworICB2b2lkIGVtaXQoQXNtUHJpbnRlciAqQXNtKSBjb25zdCBvdmVycmlkZTsKKworI2lmbmRlZiBfTVNDX1ZFUgorICAvLyBUaGUgbGluZSBiZWxvdyBpcyByZWplY3RlZCBieSBvbGRlciB2ZXJzaW9ucyAoVEJEKSBvZiBNU1ZDLgorICBzdGF0aWMgY29uc3RleHByIEF0b20gQXRvbXNbXSA9IHsKKyAgICAgIEF0b20oZHdhcmY6OkRXX0FUT01fZGllX29mZnNldCwgZHdhcmY6OkRXX0ZPUk1fZGF0YTQpfTsKKyNlbHNlCisgIC8vIEZJWE1FOiBFcmFzZSB0aGlzIHBhdGggb25jZSB0aGUgbWluaW11bSBNU0NWIHZlcnNpb24gaGFzIGJlZW4gYnVtcGVkLgorICBzdGF0aWMgY29uc3QgU21hbGxWZWN0b3I8QXRvbSwgND4gQXRvbXM7CisjZW5kaWYKKworI2lmbmRlZiBOREVCVUcKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOworI2VuZGlmCitwcm90ZWN0ZWQ6CisgIHVpbnQ2NF90IG9yZGVyKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gT2Zmc2V0OyB9CisKKyAgdWludDMyX3QgT2Zmc2V0OworfTsKKworLy8vIEFjY2VsZXJhdG9yIHRhYmxlIGRhdGEgaW1wbGVtZW50YXRpb24gZm9yIHR5cGUgYWNjZWxlcmF0b3IgdGFibGVzIHdpdGgKKy8vLyBhIERJRSBvZmZzZXQgYnV0IG5vIGFjdHVhbCBESUUgcG9pbnRlci4KK2NsYXNzIEFwcGxlQWNjZWxUYWJsZVN0YXRpY1R5cGVEYXRhIDogcHVibGljIEFwcGxlQWNjZWxUYWJsZVN0YXRpY09mZnNldERhdGEgeworcHVibGljOgorICBBcHBsZUFjY2VsVGFibGVTdGF0aWNUeXBlRGF0YSh1aW50MzJfdCBPZmZzZXQsIHVpbnQxNl90IFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPYmpDQ2xhc3NJc0ltcGxlbWVudGF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBRdWFsaWZpZWROYW1lSGFzaCkKKyAgICAgIDogQXBwbGVBY2NlbFRhYmxlU3RhdGljT2Zmc2V0RGF0YShPZmZzZXQpLAorICAgICAgICBRdWFsaWZpZWROYW1lSGFzaChRdWFsaWZpZWROYW1lSGFzaCksIFRhZyhUYWcpLAorICAgICAgICBPYmpDQ2xhc3NJc0ltcGxlbWVudGF0aW9uKE9iakNDbGFzc0lzSW1wbGVtZW50YXRpb24pIHt9CisKKyAgdm9pZCBlbWl0KEFzbVByaW50ZXIgKkFzbSkgY29uc3Qgb3ZlcnJpZGU7CisKKyNpZm5kZWYgX01TQ19WRVIKKyAgLy8gVGhlIGxpbmUgYmVsb3cgaXMgcmVqZWN0ZWQgYnkgb2xkZXIgdmVyc2lvbnMgKFRCRCkgb2YgTVNWQy4KKyAgc3RhdGljIGNvbnN0ZXhwciBBdG9tIEF0b21zW10gPSB7CisgICAgICBBdG9tKGR3YXJmOjpEV19BVE9NX2RpZV9vZmZzZXQsIGR3YXJmOjpEV19GT1JNX2RhdGE0KSwKKyAgICAgIEF0b20oZHdhcmY6OkRXX0FUT01fZGllX3RhZywgZHdhcmY6OkRXX0ZPUk1fZGF0YTIpLAorICAgICAgQXRvbSg1LCBkd2FyZjo6RFdfRk9STV9kYXRhMSksIEF0b20oNiwgZHdhcmY6OkRXX0ZPUk1fZGF0YTQpfTsKKyNlbHNlCisgIC8vIEZJWE1FOiBFcmFzZSB0aGlzIHBhdGggb25jZSB0aGUgbWluaW11bSBNU0NWIHZlcnNpb24gaGFzIGJlZW4gYnVtcGVkLgorICBzdGF0aWMgY29uc3QgU21hbGxWZWN0b3I8QXRvbSwgND4gQXRvbXM7CisjZW5kaWYKKworI2lmbmRlZiBOREVCVUcKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOworI2VuZGlmCitwcm90ZWN0ZWQ6CisgIHVpbnQ2NF90IG9yZGVyKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gT2Zmc2V0OyB9CisKKyAgdWludDMyX3QgUXVhbGlmaWVkTmFtZUhhc2g7CisgIHVpbnQxNl90IFRhZzsKKyAgYm9vbCBPYmpDQ2xhc3NJc0ltcGxlbWVudGF0aW9uOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9EV0FSRkFDQ0VMVEFCTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0FuYWx5c2lzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYTg4ZjFmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0FuYWx5c2lzLmgKQEAgLTAsMCArMSwxMzEgQEAKKy8vPT09LSBDb2RlR2VuL0FuYWx5c2lzLmggLSBDb2RlR2VuIExMVk0gSVIgQW5hbHlzaXMgVXRpbGl0aWVzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHNldmVyYWwgQ29kZUdlbi1zcGVjaWZpYyBMTFZNIElSIGFuYWx5c2lzIHV0aWxpdGllcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9BTkFMWVNJU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9BTkFMWVNJU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vSVNET3Bjb2Rlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0lubGluZUFzbS5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvZGVHZW4uaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIFRhcmdldExvd2VyaW5nQmFzZTsKK2NsYXNzIFRhcmdldExvd2VyaW5nOworY2xhc3MgVGFyZ2V0TWFjaGluZTsKK2NsYXNzIFNETm9kZTsKK2NsYXNzIFNEVmFsdWU7CitjbGFzcyBTZWxlY3Rpb25EQUc7CitzdHJ1Y3QgRVZUOworCisvLy8gXGJyaWVmIENvbXB1dGUgdGhlIGxpbmVhcml6ZWQgaW5kZXggb2YgYSBtZW1iZXIgaW4gYSBuZXN0ZWQKKy8vLyBhZ2dyZWdhdGUvc3RydWN0L2FycmF5LgorLy8vCisvLy8gR2l2ZW4gYW4gTExWTSBJUiBhZ2dyZWdhdGUgdHlwZSBhbmQgYSBzZXF1ZW5jZSBvZiBpbnNlcnR2YWx1ZSBvcgorLy8vIGV4dHJhY3R2YWx1ZSBpbmRpY2VzIHRoYXQgaWRlbnRpZnkgYSBtZW1iZXIsIHJldHVybiB0aGUgbGluZWFyaXplZCBpbmRleCBvZgorLy8vIHRoZSBzdGFydCBvZiB0aGUgbWVtYmVyLCBpLmUgdGhlIG51bWJlciBvZiBlbGVtZW50IGluIG1lbW9yeSBiZWZvcmUgdGhlCisvLy8gc291Z2h0IG9uZS4gVGhpcyBpcyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgbnVtYmVyIG9mIGJ5dGVzLgorLy8vCisvLy8gXHBhcmFtIFR5IGlzIHRoZSB0eXBlIGluZGV4ZWQgYnkgXHAgSW5kaWNlcy4KKy8vLyBccGFyYW0gSW5kaWNlcyBpcyBhbiBvcHRpb25hbCBwb2ludGVyIGluIHRoZSBpbmRpY2VzIGxpc3QgdG8gdGhlIGN1cnJlbnQKKy8vLyBpbmRleC4KKy8vLyBccGFyYW0gSW5kaWNlc0VuZCBpcyB0aGUgZW5kIG9mIHRoZSBpbmRpY2VzIGxpc3QuCisvLy8gXHBhcmFtIEN1ckluZGV4IGlzIHRoZSBjdXJyZW50IGluZGV4IGluIHRoZSByZWN1cnNpb24uCisvLy8KKy8vLyBccmV0dXJucyBccCBDdXJJbmRleCBwbHVzIHRoZSBsaW5lYXIgaW5kZXggaW4gXHAgVHkgIHRoZSBpbmRpY2VzIGxpc3QuCit1bnNpZ25lZCBDb21wdXRlTGluZWFySW5kZXgoVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgKkluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgKkluZGljZXNFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ3VySW5kZXggPSAwKTsKKworaW5saW5lIHVuc2lnbmVkIENvbXB1dGVMaW5lYXJJbmRleChUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEN1ckluZGV4ID0gMCkgeworICByZXR1cm4gQ29tcHV0ZUxpbmVhckluZGV4KFR5LCBJbmRpY2VzLmJlZ2luKCksIEluZGljZXMuZW5kKCksIEN1ckluZGV4KTsKK30KKworLy8vIENvbXB1dGVWYWx1ZVZUcyAtIEdpdmVuIGFuIExMVk0gSVIgdHlwZSwgY29tcHV0ZSBhIHNlcXVlbmNlIG9mCisvLy8gRVZUcyB0aGF0IHJlcHJlc2VudCBhbGwgdGhlIGluZGl2aWR1YWwgdW5kZXJseWluZworLy8vIG5vbi1hZ2dyZWdhdGUgdHlwZXMgdGhhdCBjb21wcmlzZSBpdC4KKy8vLworLy8vIElmIE9mZnNldHMgaXMgbm9uLW51bGwsIGl0IHBvaW50cyB0byBhIHZlY3RvciB0byBiZSBmaWxsZWQgaW4KKy8vLyB3aXRoIHRoZSBpbi1tZW1vcnkgb2Zmc2V0cyBvZiBlYWNoIG9mIHRoZSBpbmRpdmlkdWFsIHZhbHVlcy4KKy8vLwordm9pZCBDb21wdXRlVmFsdWVWVHMoY29uc3QgVGFyZ2V0TG93ZXJpbmcgJlRMSSwgY29uc3QgRGF0YUxheW91dCAmREwsIFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEVWVD4gJlZhbHVlVlRzLAorICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHVpbnQ2NF90PiAqT2Zmc2V0cyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTdGFydGluZ09mZnNldCA9IDApOworCisvLy8gRXh0cmFjdFR5cGVJbmZvIC0gUmV0dXJucyB0aGUgdHlwZSBpbmZvLCBwb3NzaWJseSBiaXRjYXN0LCBlbmNvZGVkIGluIFYuCitHbG9iYWxWYWx1ZSAqRXh0cmFjdFR5cGVJbmZvKFZhbHVlICpWKTsKKworLy8vIGhhc0lubGluZUFzbU1lbUNvbnN0cmFpbnQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5saW5lIGFzbSBpbnN0cnVjdGlvbiBiZWluZworLy8vIHByb2Nlc3NlZCB1c2VzIGEgbWVtb3J5ICdtJyBjb25zdHJhaW50LgorYm9vbCBoYXNJbmxpbmVBc21NZW1Db25zdHJhaW50KElubGluZUFzbTo6Q29uc3RyYWludEluZm9WZWN0b3IgJkNJbmZvcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJKTsKKworLy8vIGdldEZDbXBDb25kQ29kZSAtIFJldHVybiB0aGUgSVNEIGNvbmRpdGlvbiBjb2RlIGNvcnJlc3BvbmRpbmcgdG8KKy8vLyB0aGUgZ2l2ZW4gTExWTSBJUiBmbG9hdGluZy1wb2ludCBjb25kaXRpb24gY29kZS4gIFRoaXMgaW5jbHVkZXMKKy8vLyBjb25zaWRlcmF0aW9uIG9mIGdsb2JhbCBmbG9hdGluZy1wb2ludCBtYXRoIGZsYWdzLgorLy8vCitJU0Q6OkNvbmRDb2RlIGdldEZDbXBDb25kQ29kZShGQ21wSW5zdDo6UHJlZGljYXRlIFByZWQpOworCisvLy8gZ2V0RkNtcENvZGVXaXRob3V0TmFOIC0gR2l2ZW4gYW4gSVNEIGNvbmRpdGlvbiBjb2RlIGNvbXBhcmluZyBmbG9hdHMsCisvLy8gcmV0dXJuIHRoZSBlcXVpdmFsZW50IGNvZGUgaWYgd2UncmUgYWxsb3dlZCB0byBhc3N1bWUgdGhhdCBOYU5zIHdvbid0IG9jY3VyLgorSVNEOjpDb25kQ29kZSBnZXRGQ21wQ29kZVdpdGhvdXROYU4oSVNEOjpDb25kQ29kZSBDQyk7CisKKy8vLyBnZXRJQ21wQ29uZENvZGUgLSBSZXR1cm4gdGhlIElTRCBjb25kaXRpb24gY29kZSBjb3JyZXNwb25kaW5nIHRvCisvLy8gdGhlIGdpdmVuIExMVk0gSVIgaW50ZWdlciBjb25kaXRpb24gY29kZS4KKy8vLworSVNEOjpDb25kQ29kZSBnZXRJQ21wQ29uZENvZGUoSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkKTsKKworLy8vIFRlc3QgaWYgdGhlIGdpdmVuIGluc3RydWN0aW9uIGlzIGluIGEgcG9zaXRpb24gdG8gYmUgb3B0aW1pemVkCisvLy8gd2l0aCBhIHRhaWwtY2FsbC4gVGhpcyByb3VnaGx5IG1lYW5zIHRoYXQgaXQncyBpbiBhIGJsb2NrIHdpdGgKKy8vLyBhIHJldHVybiBhbmQgdGhlcmUncyBub3RoaW5nIHRoYXQgbmVlZHMgdG8gYmUgc2NoZWR1bGVkCisvLy8gYmV0d2VlbiBpdCBhbmQgdGhlIHJldHVybi4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gb25seSB0ZXN0cyB0YXJnZXQtaW5kZXBlbmRlbnQgcmVxdWlyZW1lbnRzLgorYm9vbCBpc0luVGFpbENhbGxQb3NpdGlvbihJbW11dGFibGVDYWxsU2l0ZSBDUywgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pOworCisvLy8gVGVzdCBpZiBnaXZlbiB0aGF0IHRoZSBpbnB1dCBpbnN0cnVjdGlvbiBpcyBpbiB0aGUgdGFpbCBjYWxsIHBvc2l0aW9uLCBpZgorLy8vIHRoZXJlIGlzIGFuIGF0dHJpYnV0ZSBtaXNtYXRjaCBiZXR3ZWVuIHRoZSBjYWxsZXIgYW5kIHRoZSBjYWxsZWUgdGhhdCB3aWxsCisvLy8gaW5oaWJpdCB0YWlsIGNhbGwgb3B0aW1pemF0aW9ucy4KKy8vLyBccCBBbGxvd0RpZmZlcmluZ1NpemVzIGlzIGFuIG91dHB1dCBwYXJhbWV0ZXIgd2hpY2gsIGlmIGZvcm1pbmcgYSB0YWlsIGNhbGwKKy8vLyBpcyBwZXJtaXR0ZWQsIGRldGVybWluZXMgd2hldGhlciBpdCdzIHBlcm1pdHRlZCBvbmx5IGlmIHRoZSBzaXplIG9mIHRoZQorLy8vIGNhbGxlcidzIGFuZCBjYWxsZWUncyByZXR1cm4gdHlwZXMgbWF0Y2ggZXhhY3RseS4KK2Jvb2wgYXR0cmlidXRlc1Blcm1pdFRhaWxDYWxsKGNvbnN0IEZ1bmN0aW9uICpGLCBjb25zdCBJbnN0cnVjdGlvbiAqSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJldHVybkluc3QgKlJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExvd2VyaW5nQmFzZSAmVExJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqQWxsb3dEaWZmZXJpbmdTaXplcyA9IG51bGxwdHIpOworCisvLy8gVGVzdCBpZiBnaXZlbiB0aGF0IHRoZSBpbnB1dCBpbnN0cnVjdGlvbiBpcyBpbiB0aGUgdGFpbCBjYWxsIHBvc2l0aW9uIGlmIHRoZQorLy8vIHJldHVybiB0eXBlIG9yIGFueSBhdHRyaWJ1dGVzIG9mIHRoZSBmdW5jdGlvbiB3aWxsIGluaGliaXQgdGFpbCBjYWxsCisvLy8gb3B0aW1pemF0aW9uLgorYm9vbCByZXR1cm5UeXBlSXNFbGlnaWJsZUZvclRhaWxDYWxsKGNvbnN0IEZ1bmN0aW9uICpGLCBjb25zdCBJbnN0cnVjdGlvbiAqSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZXR1cm5JbnN0ICpSZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmdCYXNlICZUTEkpOworCitEZW5zZU1hcDxjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqLCBpbnQ+CitnZXRGdW5jbGV0TWVtYmVyc2hpcChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vQXNtUHJpbnRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0FzbVByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDNiZDNhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0FzbVByaW50ZXIuaApAQCAtMCwwICsxLDY0NSBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9Bc21QcmludGVyLmggLSBBc21QcmludGVyIEZyYW1ld29yayAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgYSBjbGFzcyB0byBiZSB1c2VkIGFzIHRoZSBiYXNlIGNsYXNzIGZvciB0YXJnZXQgc3BlY2lmaWMKKy8vIGFzbSB3cml0ZXJzLiAgVGhpcyBjbGFzcyBwcmltYXJpbHkgaGFuZGxlcyBjb21tb24gZnVuY3Rpb25hbGl0eSB1c2VkIGJ5CisvLyBhbGwgYXNtIHdyaXRlcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fQVNNUFJJTlRFUl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9BU01QUklOVEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL01hcFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vRHdhcmZTdHJpbmdQb29sRW50cnkuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5saW5lQXNtLmgiCisjaW5jbHVkZSAibGx2bS9JUi9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NvdXJjZU1nci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFzbVByaW50ZXJIYW5kbGVyOworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIEJsb2NrQWRkcmVzczsKK2NsYXNzIENvbnN0YW50OworY2xhc3MgQ29uc3RhbnRBcnJheTsKK2NsYXNzIERhdGFMYXlvdXQ7CitjbGFzcyBESUU7CitjbGFzcyBESUVBYmJyZXY7CitjbGFzcyBEd2FyZkRlYnVnOworY2xhc3MgR0NNZXRhZGF0YVByaW50ZXI7CitjbGFzcyBHQ1N0cmF0ZWd5OworY2xhc3MgR2xvYmFsSW5kaXJlY3RTeW1ib2w7CitjbGFzcyBHbG9iYWxPYmplY3Q7CitjbGFzcyBHbG9iYWxWYWx1ZTsKK2NsYXNzIEdsb2JhbFZhcmlhYmxlOworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CitjbGFzcyBNYWNoaW5lQ29uc3RhbnRQb29sVmFsdWU7CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBNYWNoaW5lSnVtcFRhYmxlSW5mbzsKK2NsYXNzIE1hY2hpbmVMb29wSW5mbzsKK2NsYXNzIE1hY2hpbmVNb2R1bGVJbmZvOworY2xhc3MgTWFjaGluZU9wdGltaXphdGlvblJlbWFya0VtaXR0ZXI7CitjbGFzcyBNQ0FzbUluZm87CitjbGFzcyBNQ0NGSUluc3RydWN0aW9uOworc3RydWN0IE1DQ29kZVBhZGRpbmdDb250ZXh0OworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNFeHByOworY2xhc3MgTUNJbnN0OworY2xhc3MgTUNTZWN0aW9uOworY2xhc3MgTUNTdHJlYW1lcjsKK2NsYXNzIE1DU3VidGFyZ2V0SW5mbzsKK2NsYXNzIE1DU3ltYm9sOworY2xhc3MgTUNUYXJnZXRPcHRpb25zOworY2xhc3MgTUROb2RlOworY2xhc3MgTW9kdWxlOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGU7CitjbGFzcyBUYXJnZXRNYWNoaW5lOworCisvLy8gVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGFzIGEgZHJpdmluZyBjbGFzcyBmb3IgYWxsIGFzbSB3cml0ZXJzLgorY2xhc3MgQXNtUHJpbnRlciA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKK3B1YmxpYzoKKyAgLy8vIFRhcmdldCBtYWNoaW5lIGRlc2NyaXB0aW9uLgorICBUYXJnZXRNYWNoaW5lICZUTTsKKworICAvLy8gVGFyZ2V0IEFzbSBQcmludGVyIGluZm9ybWF0aW9uLgorICBjb25zdCBNQ0FzbUluZm8gKk1BSTsKKworICAvLy8gVGhpcyBpcyB0aGUgY29udGV4dCBmb3IgdGhlIG91dHB1dCBmaWxlIHRoYXQgd2UgYXJlIHN0cmVhbWluZy4gVGhpcyBvd25zCisgIC8vLyBhbGwgb2YgdGhlIGdsb2JhbCBNQy1yZWxhdGVkIG9iamVjdHMgZm9yIHRoZSBnZW5lcmF0ZWQgdHJhbnNsYXRpb24gdW5pdC4KKyAgTUNDb250ZXh0ICZPdXRDb250ZXh0OworCisgIC8vLyBUaGlzIGlzIHRoZSBNQ1N0cmVhbWVyIG9iamVjdCBmb3IgdGhlIGZpbGUgd2UgYXJlIGdlbmVyYXRpbmcuIFRoaXMKKyAgLy8vIGNvbnRhaW5zIHRoZSB0cmFuc2llbnQgc3RhdGUgZm9yIHRoZSBjdXJyZW50IHRyYW5zbGF0aW9uIHVuaXQgdGhhdCB3ZSBhcmUKKyAgLy8vIGdlbmVyYXRpbmcgKHN1Y2ggYXMgdGhlIGN1cnJlbnQgc2VjdGlvbiBldGMpLgorICBzdGQ6OnVuaXF1ZV9wdHI8TUNTdHJlYW1lcj4gT3V0U3RyZWFtZXI7CisKKyAgLy8vIFRoZSBjdXJyZW50IG1hY2hpbmUgZnVuY3Rpb24uCisgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUYgPSBudWxscHRyOworCisgIC8vLyBUaGlzIGlzIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBNYWNoaW5lTW9kdWxlSW5mby4KKyAgTWFjaGluZU1vZHVsZUluZm8gKk1NSSA9IG51bGxwdHI7CisKKyAgLy8vIE9wdGltaXphdGlvbiByZW1hcmsgZW1pdHRlci4KKyAgTWFjaGluZU9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgKk9SRTsKKworICAvLy8gVGhlIHN5bWJvbCBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24uIFRoaXMgaXMgcmVjYWxjdWxhdGVkIGF0IHRoZSBiZWdpbm5pbmcKKyAgLy8vIG9mIGVhY2ggY2FsbCB0byBydW5Pbk1hY2hpbmVGdW5jdGlvbigpLgorICBNQ1N5bWJvbCAqQ3VycmVudEZuU3ltID0gbnVsbHB0cjsKKworICAvLy8gVGhlIHN5bWJvbCB1c2VkIHRvIHJlcHJlc2VudCB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24gZm9yIHRoZQorICAvLy8gcHVycG9zZSBvZiBjYWxjdWxhdGluZyBpdHMgc2l6ZSAoZS5nLiB1c2luZyB0aGUgLnNpemUgZGlyZWN0aXZlKS4gQnkKKyAgLy8vIGRlZmF1bHQsIHRoaXMgaXMgZXF1YWwgdG8gQ3VycmVudEZuU3ltLgorICBNQ1N5bWJvbCAqQ3VycmVudEZuU3ltRm9yU2l6ZSA9IG51bGxwdHI7CisKKyAgLy8vIE1hcCBnbG9iYWwgR09UIGVxdWl2YWxlbnQgTUNTeW1ib2xzIHRvIEdsb2JhbFZhcmlhYmxlcyBhbmQga2VlcCB0cmFjayBvZgorICAvLy8gaXRzIG51bWJlciBvZiB1c2VzIGJ5IG90aGVyIGdsb2JhbHMuCisgIHVzaW5nIEdPVEVxdWl2VXNlUGFpciA9IHN0ZDo6cGFpcjxjb25zdCBHbG9iYWxWYXJpYWJsZSAqLCB1bnNpZ25lZD47CisgIE1hcFZlY3Rvcjxjb25zdCBNQ1N5bWJvbCAqLCBHT1RFcXVpdlVzZVBhaXI+IEdsb2JhbEdPVEVxdWl2czsKKworICAvLy8gRW5hYmxlIHByaW50IFtsYXRlbmN5OnRocm91Z2hwdXRdIGluIG91dHB1dC4KKyAgYm9vbCBFbmFibGVQcmludFNjaGVkSW5mbyA9IGZhbHNlOworCitwcml2YXRlOgorICBNQ1N5bWJvbCAqQ3VycmVudEZuQmVnaW4gPSBudWxscHRyOworICBNQ1N5bWJvbCAqQ3VycmVudEZuRW5kID0gbnVsbHB0cjsKKyAgTUNTeW1ib2wgKkN1ckV4Y2VwdGlvblN5bSA9IG51bGxwdHI7CisKKyAgLy8gVGhlIGdhcmJhZ2UgY29sbGVjdGlvbiBtZXRhZGF0YSBwcmludGVyIHRhYmxlLgorICB2b2lkICpHQ01ldGFkYXRhUHJpbnRlcnMgPSBudWxscHRyOyAvLyBSZWFsbHkgYSBEZW5zZU1hcC4KKworICAvLy8gRW1pdCBjb21tZW50cyBpbiBhc3NlbWJseSBvdXRwdXQgaWYgdGhpcyBpcyB0cnVlLgorICBib29sIFZlcmJvc2VBc207CisKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgLy8vIElmIFZlcmJvc2VBc20gaXMgc2V0LCBhIHBvaW50ZXIgdG8gdGhlIGxvb3AgaW5mbyBmb3IgdGhpcyBmdW5jdGlvbi4KKyAgTWFjaGluZUxvb3BJbmZvICpMSSA9IG51bGxwdHI7CisKKyAgc3RydWN0IEhhbmRsZXJJbmZvIHsKKyAgICBBc21QcmludGVySGFuZGxlciAqSGFuZGxlcjsKKyAgICBjb25zdCBjaGFyICpUaW1lck5hbWU7CisgICAgY29uc3QgY2hhciAqVGltZXJEZXNjcmlwdGlvbjsKKyAgICBjb25zdCBjaGFyICpUaW1lckdyb3VwTmFtZTsKKyAgICBjb25zdCBjaGFyICpUaW1lckdyb3VwRGVzY3JpcHRpb247CisKKyAgICBIYW5kbGVySW5mbyhBc21QcmludGVySGFuZGxlciAqSGFuZGxlciwgY29uc3QgY2hhciAqVGltZXJOYW1lLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKlRpbWVyRGVzY3JpcHRpb24sIGNvbnN0IGNoYXIgKlRpbWVyR3JvdXBOYW1lLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKlRpbWVyR3JvdXBEZXNjcmlwdGlvbikKKyAgICAgICAgOiBIYW5kbGVyKEhhbmRsZXIpLCBUaW1lck5hbWUoVGltZXJOYW1lKSwKKyAgICAgICAgICBUaW1lckRlc2NyaXB0aW9uKFRpbWVyRGVzY3JpcHRpb24pLCBUaW1lckdyb3VwTmFtZShUaW1lckdyb3VwTmFtZSksCisgICAgICAgICAgVGltZXJHcm91cERlc2NyaXB0aW9uKFRpbWVyR3JvdXBEZXNjcmlwdGlvbikge30KKyAgfTsKKworICAvLy8gQSB2ZWN0b3Igb2YgYWxsIGRlYnVnL0VIIGluZm8gZW1pdHRlcnMgd2Ugc2hvdWxkIHVzZS4gVGhpcyB2ZWN0b3IKKyAgLy8vIG1haW50YWlucyBvd25lcnNoaXAgb2YgdGhlIGVtaXR0ZXJzLgorICBTbWFsbFZlY3RvcjxIYW5kbGVySW5mbywgMT4gSGFuZGxlcnM7CisKK3B1YmxpYzoKKyAgc3RydWN0IFNyY01nckRpYWdJbmZvIHsKKyAgICBTb3VyY2VNZ3IgU3JjTWdyOworICAgIHN0ZDo6dmVjdG9yPGNvbnN0IE1ETm9kZSAqPiBMb2NJbmZvczsKKyAgICBMTFZNQ29udGV4dDo6SW5saW5lQXNtRGlhZ0hhbmRsZXJUeSBEaWFnSGFuZGxlcjsKKyAgICB2b2lkICpEaWFnQ29udGV4dDsKKyAgfTsKKworcHJpdmF0ZToKKyAgLy8vIFN0cnVjdHVyZSBmb3IgZ2VuZXJhdGluZyBkaWFnbm9zdGljcyBmb3IgaW5saW5lIGFzc2VtYmx5LiBPbmx5IGluaXRpYWxpc2VkCisgIC8vLyB3aGVuIG5lY2Vzc2FyeS4KKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8U3JjTWdyRGlhZ0luZm8+IERpYWdJbmZvOworCisgIC8vLyBJZiB0aGUgdGFyZ2V0IHN1cHBvcnRzIGR3YXJmIGRlYnVnIGluZm8sIHRoaXMgcG9pbnRlciBpcyBub24tbnVsbC4KKyAgRHdhcmZEZWJ1ZyAqREQgPSBudWxscHRyOworCisgIC8vLyBJZiB0aGUgY3VycmVudCBtb2R1bGUgdXNlcyBkd2FyZiBDRkkgYW5ub3RhdGlvbnMgc3RyaWN0bHkgZm9yIGRlYnVnZ2luZy4KKyAgYm9vbCBpc0NGSU1vdmVGb3JEZWJ1Z2dpbmcgPSBmYWxzZTsKKworcHJvdGVjdGVkOgorICBleHBsaWNpdCBBc21QcmludGVyKFRhcmdldE1hY2hpbmUgJlRNLCBzdGQ6OnVuaXF1ZV9wdHI8TUNTdHJlYW1lcj4gU3RyZWFtZXIpOworCitwdWJsaWM6CisgIH5Bc21QcmludGVyKCkgb3ZlcnJpZGU7CisKKyAgRHdhcmZEZWJ1ZyAqZ2V0RHdhcmZEZWJ1ZygpIHsgcmV0dXJuIEREOyB9CisgIER3YXJmRGVidWcgKmdldER3YXJmRGVidWcoKSBjb25zdCB7IHJldHVybiBERDsgfQorCisgIHVpbnQxNl90IGdldER3YXJmVmVyc2lvbigpIGNvbnN0OworICB2b2lkIHNldER3YXJmVmVyc2lvbih1aW50MTZfdCBWZXJzaW9uKTsKKworICBib29sIGlzUG9zaXRpb25JbmRlcGVuZGVudCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhc3NlbWJseSBvdXRwdXQgc2hvdWxkIGNvbnRhaW4gY29tbWVudHMuCisgIGJvb2wgaXNWZXJib3NlKCkgY29uc3QgeyByZXR1cm4gVmVyYm9zZUFzbTsgfQorCisgIC8vLyBSZXR1cm4gYSB1bmlxdWUgSUQgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICB1bnNpZ25lZCBnZXRGdW5jdGlvbk51bWJlcigpIGNvbnN0OworCisgIE1DU3ltYm9sICpnZXRGdW5jdGlvbkJlZ2luKCkgY29uc3QgeyByZXR1cm4gQ3VycmVudEZuQmVnaW47IH0KKyAgTUNTeW1ib2wgKmdldEZ1bmN0aW9uRW5kKCkgY29uc3QgeyByZXR1cm4gQ3VycmVudEZuRW5kOyB9CisgIE1DU3ltYm9sICpnZXRDdXJFeGNlcHRpb25TeW0oKTsKKworICAvLy8gUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IG9iamVjdCBmaWxlIGxvd2VyaW5nLgorICBjb25zdCBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGUgJmdldE9iakZpbGVMb3dlcmluZygpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgZGF0YSBsYXlvdXQuCisgIGNvbnN0IERhdGFMYXlvdXQgJmdldERhdGFMYXlvdXQoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBwb2ludGVyIHNpemUgZnJvbSB0aGUgVGFyZ2V0TWFjaGluZQorICB1bnNpZ25lZCBnZXRQb2ludGVyU2l6ZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgc3VidGFyZ2V0LgorICBjb25zdCBNQ1N1YnRhcmdldEluZm8gJmdldFN1YnRhcmdldEluZm8oKSBjb25zdDsKKworICB2b2lkIEVtaXRUb1N0cmVhbWVyKE1DU3RyZWFtZXIgJlMsIGNvbnN0IE1DSW5zdCAmSW5zdCk7CisKKyAgLy8vIFJldHVybiB0aGUgY3VycmVudCBzZWN0aW9uIHdlIGFyZSBlbWl0dGluZyB0by4KKyAgY29uc3QgTUNTZWN0aW9uICpnZXRDdXJyZW50U2VjdGlvbigpIGNvbnN0OworCisgIHZvaWQgZ2V0TmFtZVdpdGhQcmVmaXgoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdsb2JhbFZhbHVlICpHVikgY29uc3Q7CisKKyAgTUNTeW1ib2wgKmdldFN5bWJvbChjb25zdCBHbG9iYWxWYWx1ZSAqR1YpIGNvbnN0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gWFJheSBpbnN0cnVtZW50YXRpb24gaW1wbGVtZW50YXRpb24uCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK3B1YmxpYzoKKyAgLy8gVGhpcyBkZXNjcmliZXMgdGhlIGtpbmQgb2Ygc2xlZCB3ZSdyZSBzdG9yaW5nIGluIHRoZSBYUmF5IHRhYmxlLgorICBlbnVtIGNsYXNzIFNsZWRLaW5kIDogdWludDhfdCB7CisgICAgRlVOQ1RJT05fRU5URVIgPSAwLAorICAgIEZVTkNUSU9OX0VYSVQgPSAxLAorICAgIFRBSUxfQ0FMTCA9IDIsCisgICAgTE9HX0FSR1NfRU5URVIgPSAzLAorICAgIENVU1RPTV9FVkVOVCA9IDQsCisgIH07CisKKyAgLy8gVGhlIHRhYmxlIHdpbGwgY29udGFpbiB0aGVzZSBzdHJ1Y3RzIHRoYXQgcG9pbnQgdG8gdGhlIHNsZWQsIHRoZSBmdW5jdGlvbgorICAvLyBjb250YWluaW5nIHRoZSBzbGVkLCBhbmQgd2hhdCBraW5kIG9mIHNsZWQgKGFuZCB3aGV0aGVyIHRoZXkgc2hvdWxkIGFsd2F5cworICAvLyBiZSBpbnN0cnVtZW50ZWQpLiBXZSBhbHNvIHVzZSBhIHZlcnNpb24gaWRlbnRpZmllciB0aGF0IHRoZSBydW50aW1lIGNhbiB1c2UKKyAgLy8gdG8gZGVjaWRlIHdoYXQgdG8gZG8gd2l0aCB0aGUgc2xlZCwgZGVwZW5kaW5nIG9uIHRoZSB2ZXJzaW9uIG9mIHRoZSBzbGVkLgorICBzdHJ1Y3QgWFJheUZ1bmN0aW9uRW50cnkgeworICAgIGNvbnN0IE1DU3ltYm9sICpTbGVkOworICAgIGNvbnN0IE1DU3ltYm9sICpGdW5jdGlvbjsKKyAgICBTbGVkS2luZCBLaW5kOworICAgIGJvb2wgQWx3YXlzSW5zdHJ1bWVudDsKKyAgICBjb25zdCBjbGFzcyBGdW5jdGlvbiAqRm47CisgICAgdWludDhfdCBWZXJzaW9uOworCisgICAgdm9pZCBlbWl0KGludCwgTUNTdHJlYW1lciAqLCBjb25zdCBNQ1N5bWJvbCAqKSBjb25zdDsKKyAgfTsKKworICAvLyBBbGwgdGhlIHNsZWRzIHRvIGJlIGVtaXR0ZWQuCisgIFNtYWxsVmVjdG9yPFhSYXlGdW5jdGlvbkVudHJ5LCA0PiBTbGVkczsKKworICAvLyBBIHVuaXF1ZSBJRCB1c2VkIGZvciBFTEYgc2VjdGlvbnMgYXNzb2NpYXRlZCB3aXRoIGEgcGFydGljdWxhciBmdW5jdGlvbi4KKyAgdW5zaWduZWQgWFJheUZuVW5pcXVlSUQgPSAwOworCisgIC8vIEhlbHBlciBmdW5jdGlvbiB0byByZWNvcmQgYSBnaXZlbiBYUmF5IHNsZWQuCisgIHZvaWQgcmVjb3JkU2xlZChNQ1N5bWJvbCAqU2xlZCwgY29uc3QgTWFjaGluZUluc3RyICZNSSwgU2xlZEtpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgVmVyc2lvbiA9IDApOworCisgIC8vLyBFbWl0IGEgdGFibGUgd2l0aCBhbGwgWFJheSBpbnN0cnVtZW50YXRpb24gcG9pbnRzLgorICB2b2lkIGVtaXRYUmF5VGFibGUoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE1hY2hpbmVGdW5jdGlvblBhc3MgSW1wbGVtZW50YXRpb24uCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gUmVjb3JkIGFuYWx5c2lzIHVzYWdlLgorICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vLyBTZXQgdXAgdGhlIEFzbVByaW50ZXIgd2hlbiB3ZSBhcmUgd29ya2luZyBvbiBhIG5ldyBtb2R1bGUuIElmIHlvdXIgcGFzcworICAvLy8gb3ZlcnJpZGVzIHRoaXMsIGl0IG11c3QgbWFrZSBzdXJlIHRvIGV4cGxpY2l0bHkgY2FsbCB0aGlzIGltcGxlbWVudGF0aW9uLgorICBib29sIGRvSW5pdGlhbGl6YXRpb24oTW9kdWxlICZNKSBvdmVycmlkZTsKKworICAvLy8gU2h1dCBkb3duIHRoZSBhc21wcmludGVyLiBJZiB5b3Ugb3ZlcnJpZGUgdGhpcyBpbiB5b3VyIHBhc3MsIHlvdSBtdXN0IG1ha2UKKyAgLy8vIHN1cmUgdG8gY2FsbCBpdCBleHBsaWNpdGx5LgorICBib29sIGRvRmluYWxpemF0aW9uKE1vZHVsZSAmTSkgb3ZlcnJpZGU7CisKKyAgLy8vIEVtaXQgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBvdXQgdG8gdGhlIE91dFN0cmVhbWVyLgorICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIG92ZXJyaWRlIHsKKyAgICBTZXR1cE1hY2hpbmVGdW5jdGlvbihNRik7CisgICAgRW1pdEZ1bmN0aW9uQm9keSgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQ29hcnNlIGdyYWluZWQgSVIgbG93ZXJpbmcgcm91dGluZXMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIHdoZW4gYSBuZXcgTWFjaGluZUZ1bmN0aW9uIGlzIGJlaW5nIHByb2Nlc3NlZCBmcm9tCisgIC8vLyBydW5Pbk1hY2hpbmVGdW5jdGlvbi4KKyAgdm9pZCBTZXR1cE1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworICAvLy8gVGhpcyBtZXRob2QgZW1pdHMgdGhlIGJvZHkgYW5kIHRyYWlsZXIgZm9yIGEgZnVuY3Rpb24uCisgIHZvaWQgRW1pdEZ1bmN0aW9uQm9keSgpOworCisgIHZvaWQgZW1pdENGSUluc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpOworCisgIHZvaWQgZW1pdEZyYW1lQWxsb2MoY29uc3QgTWFjaGluZUluc3RyICZNSSk7CisKKyAgdm9pZCBlbWl0U3RhY2tTaXplU2VjdGlvbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworICBlbnVtIENGSU1vdmVUeXBlIHsgQ0ZJX01fTm9uZSwgQ0ZJX01fRUgsIENGSV9NX0RlYnVnIH07CisgIENGSU1vdmVUeXBlIG5lZWRzQ0ZJTW92ZXMoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyBmYWxzZSBpZiBuZWVkc0NGSU1vdmVzKCkgPT0gQ0ZJX01fRUggZm9yIGFueSBmdW5jdGlvbgorICAvLy8gaW4gdGhlIG1vZHVsZS4KKyAgYm9vbCBuZWVkc09ubHlEZWJ1Z0NGSU1vdmVzKCkgY29uc3QgeyByZXR1cm4gaXNDRklNb3ZlRm9yRGVidWdnaW5nOyB9CisKKyAgYm9vbCBuZWVkc1NFSE1vdmVzKCk7CisKKyAgLy8vIFByaW50IHRvIHRoZSBjdXJyZW50IG91dHB1dCBzdHJlYW0gYXNzZW1ibHkgcmVwcmVzZW50YXRpb25zIG9mIHRoZQorICAvLy8gY29uc3RhbnRzIGluIHRoZSBjb25zdGFudCBwb29sIE1DUC4gVGhpcyBpcyB1c2VkIHRvIHByaW50IG91dCBjb25zdGFudHMKKyAgLy8vIHdoaWNoIGhhdmUgYmVlbiAic3BpbGxlZCB0byBtZW1vcnkiIGJ5IHRoZSBjb2RlIGdlbmVyYXRvci4KKyAgdmlydHVhbCB2b2lkIEVtaXRDb25zdGFudFBvb2woKTsKKworICAvLy8gUHJpbnQgYXNzZW1ibHkgcmVwcmVzZW50YXRpb25zIG9mIHRoZSBqdW1wIHRhYmxlcyB1c2VkIGJ5IHRoZSBjdXJyZW50CisgIC8vLyBmdW5jdGlvbiB0byB0aGUgY3VycmVudCBvdXRwdXQgc3RyZWFtLgorICB2aXJ0dWFsIHZvaWQgRW1pdEp1bXBUYWJsZUluZm8oKTsKKworICAvLy8gRW1pdCB0aGUgc3BlY2lmaWVkIGdsb2JhbCB2YXJpYWJsZSB0byB0aGUgLnMgZmlsZS4KKyAgdmlydHVhbCB2b2lkIEVtaXRHbG9iYWxWYXJpYWJsZShjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YpOworCisgIC8vLyBDaGVjayB0byBzZWUgaWYgdGhlIHNwZWNpZmllZCBnbG9iYWwgaXMgYSBzcGVjaWFsIGdsb2JhbCB1c2VkIGJ5IExMVk0uIElmCisgIC8vLyBzbywgZW1pdCBpdCBhbmQgcmV0dXJuIHRydWUsIG90aGVyd2lzZSBkbyBub3RoaW5nIGFuZCByZXR1cm4gZmFsc2UuCisgIGJvb2wgRW1pdFNwZWNpYWxMTFZNR2xvYmFsKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHVik7CisKKyAgLy8vIEVtaXQgYW4gYWxpZ25tZW50IGRpcmVjdGl2ZSB0byB0aGUgc3BlY2lmaWVkIHBvd2VyIG9mIHR3byBib3VuZGFyeS4gRm9yCisgIC8vLyBleGFtcGxlLCBpZiB5b3UgcGFzcyBpbiAzIGhlcmUsIHlvdSB3aWxsIGdldCBhbiA4IGJ5dGUgYWxpZ25tZW50LiBJZiBhCisgIC8vLyBnbG9iYWwgdmFsdWUgaXMgc3BlY2lmaWVkLCBhbmQgaWYgdGhhdCBnbG9iYWwgaGFzIGFuIGV4cGxpY2l0IGFsaWdubWVudAorICAvLy8gcmVxdWVzdGVkLCBpdCB3aWxsIG92ZXJyaWRlIHRoZSBhbGlnbm1lbnQgcmVxdWVzdCBpZiByZXF1aXJlZCBmb3IKKyAgLy8vIGNvcnJlY3RuZXNzLgorICB2b2lkIEVtaXRBbGlnbm1lbnQodW5zaWduZWQgTnVtQml0cywgY29uc3QgR2xvYmFsT2JqZWN0ICpHTyA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBMb3dlciB0aGUgc3BlY2lmaWVkIExMVk0gQ29uc3RhbnQgdG8gYW4gTUNFeHByLgorICB2aXJ0dWFsIGNvbnN0IE1DRXhwciAqbG93ZXJDb25zdGFudChjb25zdCBDb25zdGFudCAqQ1YpOworCisgIC8vLyBcYnJpZWYgUHJpbnQgYSBnZW5lcmFsIExMVk0gY29uc3RhbnQgdG8gdGhlIC5zIGZpbGUuCisgIHZvaWQgRW1pdEdsb2JhbENvbnN0YW50KGNvbnN0IERhdGFMYXlvdXQgJkRMLCBjb25zdCBDb25zdGFudCAqQ1YpOworCisgIC8vLyBcYnJpZWYgVW5uYW1lZCBjb25zdGFudCBnbG9iYWwgdmFyaWFibGVzIHNvbGVseSBjb250YW5pbmcgYSBwb2ludGVyIHRvCisgIC8vLyBhbm90aGVyIGdsb2JhbHMgdmFyaWFibGUgYWN0IGxpa2UgYSBnbG9iYWwgdmFyaWFibGUgInByb3h5Iiwgb3IgR09UCisgIC8vLyBlcXVpdmFsZW50cywgaS5lLiwgaXQncyBvbmx5IHVzZWQgdG8gaG9sZCB0aGUgYWRkcmVzcyBvZiB0aGUgbGF0dGVyLiBPbmUKKyAgLy8vIG9wdGltaXphdGlvbiBpcyB0byByZXBsYWNlIGFjY2Vzc2VzIHRvIHRoZXNlIHByb3hpZXMgYnkgdXNpbmcgdGhlIEdPVAorICAvLy8gZW50cnkgZm9yIHRoZSBmaW5hbCBnbG9iYWwgaW5zdGVhZC4gSGVuY2UsIHdlIHNlbGVjdCBHT1QgZXF1aXZhbGVudAorICAvLy8gY2FuZGlkYXRlcyBhbW9uZyBhbGwgdGhlIG1vZHVsZSBnbG9iYWwgdmFyaWFibGVzLCBhdm9pZCBlbWl0dGluZyB0aGVtCisgIC8vLyB1bm5lY2Vzc2FyaWx5IGFuZCBmaW5hbGx5IHJlcGxhY2UgcmVmZXJlbmNlcyB0byB0aGVtIGJ5IHBjIHJlbGF0aXZlCisgIC8vLyBhY2Nlc3NlcyB0byBHT1QgZW50cmllcy4KKyAgdm9pZCBjb21wdXRlR2xvYmFsR09URXF1aXZzKE1vZHVsZSAmTSk7CisKKyAgLy8vIFxicmllZiBDb25zdGFudCBleHByZXNzaW9ucyB1c2luZyBHT1QgZXF1aXZhbGVudCBnbG9iYWxzIG1heSBub3QgYmUKKyAgLy8vIGVsaWdpYmxlIGZvciBQQyByZWxhdGl2ZSBHT1QgZW50cnkgY29udmVyc2lvbiwgaW4gc3VjaCBjYXNlcyB3ZSBuZWVkIHRvCisgIC8vLyBlbWl0IHRoZSBwcm94aWVzIHdlIHByZXZpb3VzbHkgb21pdHRlZCBpbiBFbWl0R2xvYmFsVmFyaWFibGUuCisgIHZvaWQgZW1pdEdsb2JhbEdPVEVxdWl2cygpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gT3ZlcnJpZGFibGUgSG9va3MKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vIFRhcmdldHMgY2FuLCBvciBpbiB0aGUgY2FzZSBvZiBFbWl0SW5zdHJ1Y3Rpb24sIG11c3QgaW1wbGVtZW50IHRoZXNlIHRvCisgIC8vIGN1c3RvbWl6ZSBvdXRwdXQuCisKKyAgLy8vIFRoaXMgdmlydHVhbCBtZXRob2QgY2FuIGJlIG92ZXJyaWRkZW4gYnkgdGFyZ2V0cyB0aGF0IHdhbnQgdG8gZW1pdAorICAvLy8gc29tZXRoaW5nIGF0IHRoZSBzdGFydCBvZiB0aGVpciBmaWxlLgorICB2aXJ0dWFsIHZvaWQgRW1pdFN0YXJ0T2ZBc21GaWxlKE1vZHVsZSAmKSB7fQorCisgIC8vLyBUaGlzIHZpcnR1YWwgbWV0aG9kIGNhbiBiZSBvdmVycmlkZGVuIGJ5IHRhcmdldHMgdGhhdCB3YW50IHRvIGVtaXQKKyAgLy8vIHNvbWV0aGluZyBhdCB0aGUgZW5kIG9mIHRoZWlyIGZpbGUuCisgIHZpcnR1YWwgdm9pZCBFbWl0RW5kT2ZBc21GaWxlKE1vZHVsZSAmKSB7fQorCisgIC8vLyBUYXJnZXRzIGNhbiBvdmVycmlkZSB0aGlzIHRvIGVtaXQgc3R1ZmYgYmVmb3JlIHRoZSBmaXJzdCBiYXNpYyBibG9jayBpbgorICAvLy8gdGhlIGZ1bmN0aW9uLgorICB2aXJ0dWFsIHZvaWQgRW1pdEZ1bmN0aW9uQm9keVN0YXJ0KCkge30KKworICAvLy8gVGFyZ2V0cyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBlbWl0IHN0dWZmIGFmdGVyIHRoZSBsYXN0IGJhc2ljIGJsb2NrIGluIHRoZQorICAvLy8gZnVuY3Rpb24uCisgIHZpcnR1YWwgdm9pZCBFbWl0RnVuY3Rpb25Cb2R5RW5kKCkge30KKworICAvLy8gVGFyZ2V0cyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBlbWl0IHN0dWZmIGF0IHRoZSBzdGFydCBvZiBhIGJhc2ljIGJsb2NrLgorICAvLy8gQnkgZGVmYXVsdCwgdGhpcyBtZXRob2QgcHJpbnRzIHRoZSBsYWJlbCBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gTWFjaGluZUJhc2ljQmxvY2ssIGFuIGFsaWdubWVudCAoaWYgcHJlc2VudCkgYW5kIGEgY29tbWVudCBkZXNjcmliaW5nIGl0CisgIC8vLyBpZiBhcHByb3ByaWF0ZS4KKyAgdmlydHVhbCB2b2lkIEVtaXRCYXNpY0Jsb2NrU3RhcnQoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3Q7CisKKyAgLy8vIFRhcmdldHMgY2FuIG92ZXJyaWRlIHRoaXMgdG8gZW1pdCBzdHVmZiBhdCB0aGUgZW5kIG9mIGEgYmFzaWMgYmxvY2suCisgIHZpcnR1YWwgdm9pZCBFbWl0QmFzaWNCbG9ja0VuZChjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKTsKKworICAvLy8gVGFyZ2V0cyBzaG91bGQgaW1wbGVtZW50IHRoaXMgdG8gZW1pdCBpbnN0cnVjdGlvbnMuCisgIHZpcnR1YWwgdm9pZCBFbWl0SW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICopIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJFbWl0SW5zdHJ1Y3Rpb24gbm90IGltcGxlbWVudGVkIik7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBzeW1ib2wgZm9yIHRoZSBzcGVjaWZpZWQgY29uc3RhbnQgcG9vbCBlbnRyeS4KKyAgdmlydHVhbCBNQ1N5bWJvbCAqR2V0Q1BJU3ltYm9sKHVuc2lnbmVkIENQSUQpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBFbWl0RnVuY3Rpb25FbnRyeUxhYmVsKCk7CisKKyAgdmlydHVhbCB2b2lkIEVtaXRNYWNoaW5lQ29uc3RhbnRQb29sVmFsdWUoTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlICpNQ1BWKTsKKworICAvLy8gVGFyZ2V0cyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBjaGFuZ2UgaG93IGdsb2JhbCBjb25zdGFudHMgdGhhdCBhcmUgcGFydCBvZgorICAvLy8gYSBDKysgc3RhdGljL2dsb2JhbCBjb25zdHJ1Y3RvciBsaXN0IGFyZSBlbWl0dGVkLgorICB2aXJ0dWFsIHZvaWQgRW1pdFhYU3RydWN0b3IoY29uc3QgRGF0YUxheW91dCAmREwsIGNvbnN0IENvbnN0YW50ICpDVikgeworICAgIEVtaXRHbG9iYWxDb25zdGFudChETCwgQ1YpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBiYXNpYyBibG9jayBoYXMgZXhhY3RseSBvbmUgcHJlZGVjZXNzb3IgYW5kIHRoZSBjb250cm9sCisgIC8vLyB0cmFuc2ZlciBtZWNoYW5pc20gYmV0d2VlbiB0aGUgcHJlZGVjZXNzb3IgYW5kIHRoaXMgYmxvY2sgaXMgYQorICAvLy8gZmFsbC10aHJvdWdoLgorICB2aXJ0dWFsIGJvb2wKKyAgaXNCbG9ja09ubHlSZWFjaGFibGVCeUZhbGx0aHJvdWdoKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIGNvbnN0OworCisgIC8vLyBUYXJnZXRzIGNhbiBvdmVycmlkZSB0aGlzIHRvIGN1c3RvbWl6ZSB0aGUgb3V0cHV0IG9mIElNUExJQ0lUX0RFRgorICAvLy8gaW5zdHJ1Y3Rpb25zIGluIHZlcmJvc2UgbW9kZS4KKyAgdmlydHVhbCB2b2lkIGVtaXRJbXBsaWNpdERlZihjb25zdCBNYWNoaW5lSW5zdHIgKk1JKSBjb25zdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFN5bWJvbCBMb3dlcmluZyBSb3V0aW5lcy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIE1DU3ltYm9sICpjcmVhdGVUZW1wU3ltYm9sKGNvbnN0IFR3aW5lICZOYW1lKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBNQ1N5bWJvbCBmb3IgYSBwcml2YXRlIHN5bWJvbCB3aXRoIGdsb2JhbCB2YWx1ZSBuYW1lIGFzIGl0cworICAvLy8gYmFzZSwgd2l0aCB0aGUgc3BlY2lmaWVkIHN1ZmZpeC4KKyAgTUNTeW1ib2wgKmdldFN5bWJvbFdpdGhHbG9iYWxWYWx1ZUJhc2UoY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU3VmZml4KSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBNQ1N5bWJvbCBmb3IgdGhlIHNwZWNpZmllZCBFeHRlcm5hbFN5bWJvbC4KKyAgTUNTeW1ib2wgKkdldEV4dGVybmFsU3ltYm9sU3ltYm9sKFN0cmluZ1JlZiBTeW0pIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIHN5bWJvbCBmb3IgdGhlIHNwZWNpZmllZCBqdW1wIHRhYmxlIGVudHJ5LgorICBNQ1N5bWJvbCAqR2V0SlRJU3ltYm9sKHVuc2lnbmVkIEpUSUQsIGJvb2wgaXNMaW5rZXJQcml2YXRlID0gZmFsc2UpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIHN5bWJvbCBmb3IgdGhlIHNwZWNpZmllZCBqdW1wIHRhYmxlIC5zZXQKKyAgLy8vIEZJWE1FOiBwcml2YXRpemUgdG8gQXNtUHJpbnRlci4KKyAgTUNTeW1ib2wgKkdldEpUU2V0U3ltYm9sKHVuc2lnbmVkIFVJRCwgdW5zaWduZWQgTUJCSUQpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIE1DU3ltYm9sIHVzZWQgdG8gc2F0aXNmeSBCbG9ja0FkZHJlc3MgdXNlcyBvZiB0aGUgc3BlY2lmaWVkCisgIC8vLyBiYXNpYyBibG9jay4KKyAgTUNTeW1ib2wgKkdldEJsb2NrQWRkcmVzc1N5bWJvbChjb25zdCBCbG9ja0FkZHJlc3MgKkJBKSBjb25zdDsKKyAgTUNTeW1ib2wgKkdldEJsb2NrQWRkcmVzc1N5bWJvbChjb25zdCBCYXNpY0Jsb2NrICpCQikgY29uc3Q7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBFbWlzc2lvbiBIZWxwZXIgUm91dGluZXMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gVGhpcyBpcyBqdXN0IGNvbnZlbmllbnQgaGFuZGxlciBmb3IgcHJpbnRpbmcgb2Zmc2V0cy4KKyAgdm9pZCBwcmludE9mZnNldChpbnQ2NF90IE9mZnNldCwgcmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLy8gRW1pdCBhIGJ5dGUgZGlyZWN0aXZlIGFuZCB2YWx1ZS4KKyAgdm9pZCBlbWl0SW50OChpbnQgVmFsdWUpIGNvbnN0OworCisgIC8vLyBFbWl0IGEgc2hvcnQgZGlyZWN0aXZlIGFuZCB2YWx1ZS4KKyAgdm9pZCBlbWl0SW50MTYoaW50IFZhbHVlKSBjb25zdDsKKworICAvLy8gRW1pdCBhIGxvbmcgZGlyZWN0aXZlIGFuZCB2YWx1ZS4KKyAgdm9pZCBlbWl0SW50MzIoaW50IFZhbHVlKSBjb25zdDsKKworICAvLy8gRW1pdCBzb21ldGhpbmcgbGlrZSAiLmxvbmcgSGktTG8iIHdoZXJlIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBkaXJlY3RpdmUKKyAgLy8vIGlzIHNwZWNpZmllZCBieSBTaXplIGFuZCBIaS9MbyBzcGVjaWZ5IHRoZSBsYWJlbHMuICBUaGlzIGltcGxpY2l0bHkgdXNlcworICAvLy8gLnNldCBpZiBpdCBpcyBhdmFpbGFibGUuCisgIHZvaWQgRW1pdExhYmVsRGlmZmVyZW5jZShjb25zdCBNQ1N5bWJvbCAqSGksIGNvbnN0IE1DU3ltYm9sICpMbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNpemUpIGNvbnN0OworCisgIC8vLyBFbWl0IHNvbWV0aGluZyBsaWtlICIudWxlYjEyOCBIaS1MbyIuCisgIHZvaWQgRW1pdExhYmVsRGlmZmVyZW5jZUFzVUxFQjEyOChjb25zdCBNQ1N5bWJvbCAqSGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqTG8pIGNvbnN0OworCisgIC8vLyBFbWl0IHNvbWV0aGluZyBsaWtlICIubG9uZyBMYWJlbCtPZmZzZXQiIHdoZXJlIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZQorICAvLy8gZGlyZWN0aXZlIGlzIHNwZWNpZmllZCBieSBTaXplIGFuZCBMYWJlbCBzcGVjaWZpZXMgdGhlIGxhYmVsLiAgVGhpcworICAvLy8gaW1wbGljaXRseSB1c2VzIC5zZXQgaWYgaXQgaXMgYXZhaWxhYmxlLgorICB2b2lkIEVtaXRMYWJlbFBsdXNPZmZzZXQoY29uc3QgTUNTeW1ib2wgKkxhYmVsLCB1aW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTaXplLCBib29sIElzU2VjdGlvblJlbGF0aXZlID0gZmFsc2UpIGNvbnN0OworCisgIC8vLyBFbWl0IHNvbWV0aGluZyBsaWtlICIubG9uZyBMYWJlbCIgd2hlcmUgdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGRpcmVjdGl2ZQorICAvLy8gaXMgc3BlY2lmaWVkIGJ5IFNpemUgYW5kIExhYmVsIHNwZWNpZmllcyB0aGUgbGFiZWwuCisgIHZvaWQgRW1pdExhYmVsUmVmZXJlbmNlKGNvbnN0IE1DU3ltYm9sICpMYWJlbCwgdW5zaWduZWQgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1NlY3Rpb25SZWxhdGl2ZSA9IGZhbHNlKSBjb25zdCB7CisgICAgRW1pdExhYmVsUGx1c09mZnNldChMYWJlbCwgMCwgU2l6ZSwgSXNTZWN0aW9uUmVsYXRpdmUpOworICB9CisKKyAgLy8vIEVtaXQgc29tZXRoaW5nIGxpa2UgIi5sb25nIExhYmVsICsgT2Zmc2V0Ii4KKyAgdm9pZCBFbWl0RHdhcmZPZmZzZXQoY29uc3QgTUNTeW1ib2wgKkxhYmVsLCB1aW50NjRfdCBPZmZzZXQpIGNvbnN0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gRHdhcmYgRW1pc3Npb24gSGVscGVyIFJvdXRpbmVzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gRW1pdCB0aGUgc3BlY2lmaWVkIHNpZ25lZCBsZWIxMjggdmFsdWUuCisgIHZvaWQgRW1pdFNMRUIxMjgoaW50NjRfdCBWYWx1ZSwgY29uc3QgY2hhciAqRGVzYyA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBFbWl0IHRoZSBzcGVjaWZpZWQgdW5zaWduZWQgbGViMTI4IHZhbHVlLgorICB2b2lkIEVtaXRVTEVCMTI4KHVpbnQ2NF90IFZhbHVlLCBjb25zdCBjaGFyICpEZXNjID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIEVtaXQgYSAuYnl0ZSA0MiBkaXJlY3RpdmUgdGhhdCBjb3JyZXNwb25kcyB0byBhbiBlbmNvZGluZy4gIElmIHZlcmJvc2UKKyAgLy8vIGFzc2VtYmx5IG91dHB1dCBpcyBlbmFibGVkLCB3ZSBvdXRwdXQgY29tbWVudHMgZGVzY3JpYmluZyB0aGUgZW5jb2RpbmcuCisgIC8vLyBEZXNjIGlzIGEgc3RyaW5nIHNheWluZyB3aGF0IHRoZSBlbmNvZGluZyBpcyBzcGVjaWZ5aW5nIChlLmcuICJMU0RBIikuCisgIHZvaWQgRW1pdEVuY29kaW5nQnl0ZSh1bnNpZ25lZCBWYWwsIGNvbnN0IGNoYXIgKkRlc2MgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBlbmNvZGluZyBpbiBieXRlcy4KKyAgdW5zaWduZWQgR2V0U2l6ZU9mRW5jb2RlZFZhbHVlKHVuc2lnbmVkIEVuY29kaW5nKSBjb25zdDsKKworICAvLy8gRW1pdCByZWZlcmVuY2UgdG8gYSB0dHlwZSBnbG9iYWwgd2l0aCBhIHNwZWNpZmllZCBlbmNvZGluZy4KKyAgdm9pZCBFbWl0VFR5cGVSZWZlcmVuY2UoY29uc3QgR2xvYmFsVmFsdWUgKkdWLCB1bnNpZ25lZCBFbmNvZGluZykgY29uc3Q7CisKKyAgLy8vIEVtaXQgYSByZWZlcmVuY2UgdG8gYSBzeW1ib2wgZm9yIHVzZSBpbiBkd2FyZi4gRGlmZmVyZW50IG9iamVjdCBmb3JtYXRzCisgIC8vLyByZXByZXNlbnQgdGhpcyBpbiBkaWZmZXJlbnQgd2F5cy4gU29tZSB1c2UgYSByZWxvY2F0aW9uIG90aGVycyBlbmNvZGUKKyAgLy8vIHRoZSBsYWJlbCBvZmZzZXQgaW4gaXRzIHNlY3Rpb24uCisgIHZvaWQgZW1pdER3YXJmU3ltYm9sUmVmZXJlbmNlKGNvbnN0IE1DU3ltYm9sICpMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBGb3JjZU9mZnNldCA9IGZhbHNlKSBjb25zdDsKKworICAvLy8gRW1pdCB0aGUgNC1ieXRlIG9mZnNldCBvZiBhIHN0cmluZyBmcm9tIHRoZSBzdGFydCBvZiBpdHMgc2VjdGlvbi4KKyAgLy8vCisgIC8vLyBXaGVuIHBvc3NpYmxlLCBlbWl0IGEgRHdhcmZTdHJpbmdQb29sIHNlY3Rpb24gb2Zmc2V0IHdpdGhvdXQgYW55CisgIC8vLyByZWxvY2F0aW9ucywgYW5kIHdpdGhvdXQgdXNpbmcgdGhlIHN5bWJvbC4gIE90aGVyd2lzZSwgZGVmZXJzIHRvIFxhCisgIC8vLyBlbWl0RHdhcmZTeW1ib2xSZWZlcmVuY2UoKS4KKyAgdm9pZCBlbWl0RHdhcmZTdHJpbmdPZmZzZXQoRHdhcmZTdHJpbmdQb29sRW50cnkgUykgY29uc3Q7CisKKyAgLy8vIEVtaXQgdGhlIDQtYnl0ZSBvZmZzZXQgb2YgYSBzdHJpbmcgZnJvbSB0aGUgc3RhcnQgb2YgaXRzIHNlY3Rpb24uCisgIHZvaWQgZW1pdER3YXJmU3RyaW5nT2Zmc2V0KER3YXJmU3RyaW5nUG9vbEVudHJ5UmVmIFMpIGNvbnN0IHsKKyAgICBlbWl0RHdhcmZTdHJpbmdPZmZzZXQoUy5nZXRFbnRyeSgpKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIHZhbHVlIGZvciBEV19BVF9BUFBMRV9pc2EuIFplcm8gaWYgbm8gaXNhIGVuY29kaW5nIHNwZWNpZmllZC4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRJU0FFbmNvZGluZygpIHsgcmV0dXJuIDA7IH0KKworICAvLy8gRW1pdCB0aGUgZGlyZWN0aXZlIGFuZCB2YWx1ZSBmb3IgZGVidWcgdGhyZWFkIGxvY2FsIGV4cHJlc3Npb24KKyAgLy8vCisgIC8vLyBccCBWYWx1ZSAtIFRoZSB2YWx1ZSB0byBlbWl0LgorICAvLy8gXHAgU2l6ZSAtIFRoZSBzaXplIG9mIHRoZSBpbnRlZ2VyIChpbiBieXRlcykgdG8gZW1pdC4KKyAgdmlydHVhbCB2b2lkIEVtaXREZWJ1Z1RocmVhZExvY2FsKGNvbnN0IE1DRXhwciAqVmFsdWUsIHVuc2lnbmVkIFNpemUpIGNvbnN0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gRHdhcmYgTG93ZXJpbmcgUm91dGluZXMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBcYnJpZWYgRW1pdCBmcmFtZSBpbnN0cnVjdGlvbiB0byBkZXNjcmliZSB0aGUgbGF5b3V0IG9mIHRoZSBmcmFtZS4KKyAgdm9pZCBlbWl0Q0ZJSW5zdHJ1Y3Rpb24oY29uc3QgTUNDRklJbnN0cnVjdGlvbiAmSW5zdCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBFbWl0IER3YXJmIGFiYnJldmlhdGlvbiB0YWJsZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgZW1pdER3YXJmQWJicmV2cyhjb25zdCBUICZBYmJyZXZzKSBjb25zdCB7CisgICAgLy8gRm9yIGVhY2ggYWJicmV2aWF0aW9uLgorICAgIGZvciAoY29uc3QgYXV0byAmQWJicmV2IDogQWJicmV2cykKKyAgICAgIGVtaXREd2FyZkFiYnJldigqQWJicmV2KTsKKworICAgIC8vIE1hcmsgZW5kIG9mIGFiYnJldmlhdGlvbnMuCisgICAgRW1pdFVMRUIxMjgoMCwgIkVPTSgzKSIpOworICB9CisKKyAgdm9pZCBlbWl0RHdhcmZBYmJyZXYoY29uc3QgRElFQWJicmV2ICZBYmJyZXYpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmVjdXJzaXZlbHkgZW1pdCBEd2FyZiBESUUgdHJlZS4KKyAgdm9pZCBlbWl0RHdhcmZESUUoY29uc3QgRElFICZEaWUpIGNvbnN0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSW5saW5lIEFzbSBTdXBwb3J0CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLyBUaGVzZSBhcmUgaG9va3MgdGhhdCB0YXJnZXRzIGNhbiBvdmVycmlkZSB0byBpbXBsZW1lbnQgaW5saW5lIGFzbQorICAvLyBzdXBwb3J0LiAgVGhlc2Ugc2hvdWxkIHByb2JhYmx5IGJlIG1vdmVkIG91dCBvZiBBc21QcmludGVyIHNvbWVkYXkuCisKKyAgLy8vIFByaW50IGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RyIHRoYXQgaXMKKyAgLy8vIGluZGVwZW5kZW50IG9mIHRoZSBvcGVyYW5kLCBhbmQgbWF5IGJlIGluZGVwZW5kZW50IG9mIHRoZSBpbnN0ciBpdHNlbGYuCisgIC8vLyBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIHBvcnRhYmx5IGVuY29kaW5nIHRoZSBjb21tZW50IGNoYXJhY3RlciBvciBvdGhlcgorICAvLy8gYml0cyBvZiB0YXJnZXQtc3BlY2lmaWMga25vd2xlZGdlIGludG8gdGhlIGFzbXN0cmluZ3MuICBUaGUgc3ludGF4IHVzZWQgaXMKKyAgLy8vICR7OmNvbW1lbnR9LiAgVGFyZ2V0cyBjYW4gb3ZlcnJpZGUgdGhpcyB0byBhZGQgc3VwcG9ydCBmb3IgdGhlaXIgb3duCisgIC8vLyBzdHJhbmdlIGNvZGVzLgorICB2aXJ0dWFsIHZvaWQgUHJpbnRTcGVjaWFsKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpDb2RlKSBjb25zdDsKKworICAvLy8gUHJpbnQgdGhlIHNwZWNpZmllZCBvcGVyYW5kIG9mIE1JLCBhbiBJTkxJTkVBU00gaW5zdHJ1Y3Rpb24sIHVzaW5nIHRoZQorICAvLy8gc3BlY2lmaWVkIGFzc2VtYmxlciB2YXJpYW50LiAgVGFyZ2V0cyBzaG91bGQgb3ZlcnJpZGUgdGhpcyB0byBmb3JtYXQgYXMKKyAgLy8vIGFwcHJvcHJpYXRlLiAgVGhpcyBtZXRob2QgY2FuIHJldHVybiB0cnVlIGlmIHRoZSBvcGVyYW5kIGlzIGVycm9uZW91cy4KKyAgdmlydHVhbCBib29sIFByaW50QXNtT3BlcmFuZChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBPcE5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFzbVZhcmlhbnQsIGNvbnN0IGNoYXIgKkV4dHJhQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MpOworCisgIC8vLyBQcmludCB0aGUgc3BlY2lmaWVkIG9wZXJhbmQgb2YgTUksIGFuIElOTElORUFTTSBpbnN0cnVjdGlvbiwgdXNpbmcgdGhlCisgIC8vLyBzcGVjaWZpZWQgYXNzZW1ibGVyIHZhcmlhbnQgYXMgYW4gYWRkcmVzcy4gVGFyZ2V0cyBzaG91bGQgb3ZlcnJpZGUgdGhpcyB0bworICAvLy8gZm9ybWF0IGFzIGFwcHJvcHJpYXRlLiAgVGhpcyBtZXRob2QgY2FuIHJldHVybiB0cnVlIGlmIHRoZSBvcGVyYW5kIGlzCisgIC8vLyBlcnJvbmVvdXMuCisgIHZpcnR1YWwgYm9vbCBQcmludEFzbU1lbW9yeU9wZXJhbmQoY29uc3QgTWFjaGluZUluc3RyICpNSSwgdW5zaWduZWQgT3BObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBc21WYXJpYW50LCBjb25zdCBjaGFyICpFeHRyYUNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKTsKKworICAvLy8gTGV0IHRoZSB0YXJnZXQgZG8gYW55dGhpbmcgaXQgbmVlZHMgdG8gZG8gYmVmb3JlIGVtaXR0aW5nIGlubGluZWFzbS4KKyAgLy8vIFxwIFN0YXJ0SW5mbyAtIHRoZSBzdWJ0YXJnZXQgaW5mbyBiZWZvcmUgcGFyc2luZyBpbmxpbmUgYXNtCisgIHZpcnR1YWwgdm9pZCBlbWl0SW5saW5lQXNtU3RhcnQoKSBjb25zdDsKKworICAvLy8gTGV0IHRoZSB0YXJnZXQgZG8gYW55dGhpbmcgaXQgbmVlZHMgdG8gZG8gYWZ0ZXIgZW1pdHRpbmcgaW5saW5lYXNtLgorICAvLy8gVGhpcyBjYWxsYmFjayBjYW4gYmUgdXNlZCByZXN0b3JlIHRoZSBvcmlnaW5hbCBtb2RlIGluIGNhc2UgdGhlCisgIC8vLyBpbmxpbmVhc20gY29udGFpbnMgZGlyZWN0aXZlcyB0byBzd2l0Y2ggbW9kZXMuCisgIC8vLyBccCBTdGFydEluZm8gLSB0aGUgb3JpZ2luYWwgc3VidGFyZ2V0IGluZm8gYmVmb3JlIGlubGluZSBhc20KKyAgLy8vIFxwIEVuZEluZm8gICAtIHRoZSBmaW5hbCBzdWJ0YXJnZXQgaW5mbyBhZnRlciBwYXJzaW5nIHRoZSBpbmxpbmUgYXNtLAorICAvLy8gICAgICAgICAgICAgICAgb3IgTlVMTCBpZiB0aGUgdmFsdWUgaXMgdW5rbm93bi4KKyAgdmlydHVhbCB2b2lkIGVtaXRJbmxpbmVBc21FbmQoY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZTdGFydEluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAqRW5kSW5mbykgY29uc3Q7CisKK3ByaXZhdGU6CisgIC8vLyBQcml2YXRlIHN0YXRlIGZvciBQcmludFNwZWNpYWwoKQorICAvLyBBc3NpZ24gYSB1bmlxdWUgSUQgdG8gdGhpcyBtYWNoaW5lIGluc3RydWN0aW9uLgorICBtdXRhYmxlIGNvbnN0IE1hY2hpbmVJbnN0ciAqTGFzdE1JID0gbnVsbHB0cjsKKyAgbXV0YWJsZSB1bnNpZ25lZCBMYXN0Rm4gPSAwOworICBtdXRhYmxlIHVuc2lnbmVkIENvdW50ZXIgPSB+MFU7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGVtaXRzIHRoZSBoZWFkZXIgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICB2aXJ0dWFsIHZvaWQgRW1pdEZ1bmN0aW9uSGVhZGVyKCk7CisKKyAgLy8vIEVtaXQgYSBibG9iIG9mIGlubGluZSBhc20gdG8gdGhlIG91dHB1dCBzdHJlYW1lci4KKyAgdm9pZAorICBFbWl0SW5saW5lQXNtKFN0cmluZ1JlZiBTdHIsIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU1RJLAorICAgICAgICAgICAgICAgIGNvbnN0IE1DVGFyZ2V0T3B0aW9ucyAmTUNPcHRpb25zLAorICAgICAgICAgICAgICAgIGNvbnN0IE1ETm9kZSAqTG9jTUROb2RlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBJbmxpbmVBc206OkFzbURpYWxlY3QgQXNtRGlhbGVjdCA9IElubGluZUFzbTo6QURfQVRUKSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2QgZm9ybWF0cyBhbmQgZW1pdHMgdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RydWN0aW9uIHRoYXQgaXMgYW4KKyAgLy8vIGlubGluZSBhc20uCisgIHZvaWQgRW1pdElubGluZUFzbShjb25zdCBNYWNoaW5lSW5zdHIgKk1JKSBjb25zdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEludGVybmFsIEltcGxlbWVudGF0aW9uIERldGFpbHMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBUaGlzIGVtaXRzIHZpc2liaWxpdHkgaW5mb3JtYXRpb24gYWJvdXQgc3ltYm9sLCBpZiB0aGlzIGlzIHN1cHBvcnRlZCBieQorICAvLy8gdGhlIHRhcmdldC4KKyAgdm9pZCBFbWl0VmlzaWJpbGl0eShNQ1N5bWJvbCAqU3ltLCB1bnNpZ25lZCBWaXNpYmlsaXR5LAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNEZWZpbml0aW9uID0gdHJ1ZSkgY29uc3Q7CisKKyAgdm9pZCBFbWl0TGlua2FnZShjb25zdCBHbG9iYWxWYWx1ZSAqR1YsIE1DU3ltYm9sICpHVlN5bSkgY29uc3Q7CisKKyAgdm9pZCBFbWl0SnVtcFRhYmxlRW50cnkoY29uc3QgTWFjaGluZUp1bXBUYWJsZUluZm8gKk1KVEksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsIHVuc2lnbmVkIHVpZCkgY29uc3Q7CisgIHZvaWQgRW1pdExMVk1Vc2VkTGlzdChjb25zdCBDb25zdGFudEFycmF5ICpJbml0TGlzdCk7CisgIC8vLyBFbWl0IGxsdm0uaWRlbnQgbWV0YWRhdGEgaW4gYW4gJy5pZGVudCcgZGlyZWN0aXZlLgorICB2b2lkIEVtaXRNb2R1bGVJZGVudHMoTW9kdWxlICZNKTsKKyAgdm9pZCBFbWl0WFhTdHJ1Y3Rvckxpc3QoY29uc3QgRGF0YUxheW91dCAmREwsIGNvbnN0IENvbnN0YW50ICpMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQ3Rvcik7CisKKyAgR0NNZXRhZGF0YVByaW50ZXIgKkdldE9yQ3JlYXRlR0NQcmludGVyKEdDU3RyYXRlZ3kgJkMpOworICAvLy8gRW1pdCBHbG9iYWxBbGlhcyBvciBHbG9iYWxJRnVuYy4KKyAgdm9pZCBlbWl0R2xvYmFsSW5kaXJlY3RTeW1ib2woTW9kdWxlICZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHbG9iYWxJbmRpcmVjdFN5bWJvbCYgR0lTKTsKKyAgdm9pZCBzZXR1cENvZGVQYWRkaW5nQ29udGV4dChjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29kZVBhZGRpbmdDb250ZXh0ICZDb250ZXh0KSBjb25zdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fQVNNUFJJTlRFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vQXRvbWljRXhwYW5kVXRpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9BdG9taWNFeHBhbmRVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmOWM5NmIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vQXRvbWljRXhwYW5kVXRpbHMuaApAQCAtMCwwICsxLDY1IEBACisvLz09PS0gQXRvbWljRXhwYW5kVXRpbHMuaCAtIFV0aWxpdGllcyBmb3IgZXhwYW5kaW5nIGF0b21pYyBpbnN0cnVjdGlvbnMgLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9BVE9NSUNFWFBBTkRVVElMU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9BVE9NSUNFWFBBTkRVVElMU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0lSQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BdG9taWNPcmRlcmluZy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEF0b21pY1JNV0luc3Q7CitjbGFzcyBWYWx1ZTsKKworLy8vIFBhcmFtZXRlcnMgKHNlZSB0aGUgZXhwYW5zaW9uIGV4YW1wbGUgYmVsb3cpOgorLy8vICh0aGUgYnVpbGRlciwgJWFkZHIsICVsb2FkZWQsICVuZXdfdmFsLCBvcmRlcmluZywKKy8vLyAgLyogT1VUICovICVzdWNjZXNzLCAvKiBPVVQgKi8gJW5ld19sb2FkZWQpCit1c2luZyBDcmVhdGVDbXBYY2hnSW5zdEZ1biA9CisgICAgZnVuY3Rpb25fcmVmPHZvaWQoSVJCdWlsZGVyPD4gJiwgVmFsdWUgKiwgVmFsdWUgKiwgVmFsdWUgKiwgQXRvbWljT3JkZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKiYsIFZhbHVlIComKT47CisKKy8vLyBcYnJpZWYgRXhwYW5kIGFuIGF0b21pYyBSTVcgaW5zdHJ1Y3Rpb24gaW50byBhIGxvb3AgdXRpbGl6aW5nCisvLy8gY21weGNoZy4gWW91J2xsIHdhbnQgdG8gbWFrZSBzdXJlIHlvdXIgdGFyZ2V0IG1hY2hpbmUgbGlrZXMgY21weGNoZworLy8vIGluc3RydWN0aW9ucyBpbiB0aGUgZmlyc3QgcGxhY2UgYW5kIHRoYXQgdGhlcmUgaXNuJ3QgYW5vdGhlciwgYmV0dGVyLAorLy8vIHRyYW5zZm9ybWF0aW9uIGF2YWlsYWJsZSAoZm9yIGV4YW1wbGUgQUFyY2gzMi9BQXJjaDY0IGhhdmUgbGlua2VkIGxvYWRzKS4KKy8vLworLy8vIFRoaXMgaXMgdXNlZnVsIGluIHBhc3NlcyB3aGljaCBjYW4ndCByZXdyaXRlIHRoZSBtb3JlIGV4b3RpYyBSTVcKKy8vLyBpbnN0cnVjdGlvbnMgZGlyZWN0bHkgaW50byBhIHBsYXRmb3JtIHNwZWNpZmljIGludHJpbnNpY3MgKGJlY2F1c2UsIHNheSwKKy8vLyB0aG9zZSBpbnRyaW5zaWNzIGRvbid0IGV4aXN0KS4gSWYgc3VjaCBhIHBhc3MgaXMgYWJsZSB0byBleHBhbmQgY21weGNoZworLy8vIGluc3RydWN0aW9ucyBkaXJlY3RseSBob3dldmVyLCB0aGVuLCB3aXRoIHRoaXMgZnVuY3Rpb24sIGl0IGNvdWxkIGF2b2lkIHR3bworLy8vIGV4dHJhIG1vZHVsZSBwYXNzZXMgKGF2b2lkaW5nIHBhc3NlcyBieSBgLWF0b21pYy1leHBhbmRgIGFuZCBpdHNlbGYpLiBBCisvLy8gc3BlY2lmaWMgZXhhbXBsZSB3b3VsZCBiZSBQTmFDbCdzIGBSZXdyaXRlQXRvbWljc2AgcGFzcy4KKy8vLworLy8vIEdpdmVuOiBhdG9taWNybXcgc29tZV9vcCBpTiogJWFkZHIsIGlOICVpbmNyIG9yZGVyaW5nCisvLy8KKy8vLyBUaGUgc3RhbmRhcmQgZXhwYW5zaW9uIHdlIHByb2R1Y2UgaXM6CisvLy8gICAgIFsuLi5dCisvLy8gICAgICVpbml0X2xvYWRlZCA9IGxvYWQgYXRvbWljIGlOKiAlYWRkcgorLy8vICAgICBiciBsYWJlbCAlbG9vcAorLy8vIGxvb3A6CisvLy8gICAgICVsb2FkZWQgPSBwaGkgaU4gWyAlaW5pdF9sb2FkZWQsICVlbnRyeSBdLCBbICVuZXdfbG9hZGVkLCAlbG9vcCBdCisvLy8gICAgICVuZXcgPSBzb21lX29wIGlOICVsb2FkZWQsICVpbmNyCisvLy8gOyBUaGlzIGlzIHdoYXQgLWF0b21pYy1leHBhbmQgd2lsbCBwcm9kdWNlIHVzaW5nIHRoaXMgZnVuY3Rpb24gb24gaTY4NgorLy8vIHRhcmdldHM6CisvLy8gICAgICVwYWlyID0gY21weGNoZyBpTiogJWFkZHIsIGlOICVsb2FkZWQsIGlOICVuZXdfdmFsCisvLy8gICAgICVuZXdfbG9hZGVkID0gZXh0cmFjdHZhbHVlIHsgaU4sIGkxIH0gJXBhaXIsIDAKKy8vLyAgICAgJXN1Y2Nlc3MgPSBleHRyYWN0dmFsdWUgeyBpTiwgaTEgfSAlcGFpciwgMQorLy8vIDsgRW5kIGNhbGxiYWNrIHByb2R1Y2VkIElSCisvLy8gICAgIGJyIGkxICVzdWNjZXNzLCBsYWJlbCAlYXRvbWljcm13LmVuZCwgbGFiZWwgJWxvb3AKKy8vLyBhdG9taWNybXcuZW5kOgorLy8vICAgICBbLi4uXQorLy8vCisvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjb250YWluaW5nIGZ1bmN0aW9uIHdhcyBtb2RpZmllZC4KK2Jvb2wgZXhwYW5kQXRvbWljUk1XVG9DbXBYY2hnKEF0b21pY1JNV0luc3QgKkFJLCBDcmVhdGVDbXBYY2hnSW5zdEZ1biBGYWN0b3J5KTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9BVE9NSUNFWFBBTkRVVElMU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vQmFzaWNUVElJbXBsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vQmFzaWNUVElJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5NjI2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9CYXNpY1RUSUltcGwuaApAQCAtMCwwICsxLDEzODMgQEAKKy8vPT09LSBCYXNpY1RUSUltcGwuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIHByb3ZpZGVzIGEgaGVscGVyIHRoYXQgaW1wbGVtZW50cyBtdWNoIG9mIHRoZSBUVEkgaW50ZXJmYWNlIGluCisvLy8gdGVybXMgb2YgdGhlIHRhcmdldC1pbmRlcGVuZGVudCBjb2RlIGdlbmVyYXRvciBhbmQgVGFyZ2V0TG93ZXJpbmcKKy8vLyBpbnRlcmZhY2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0JBU0lDVFRJSU1QTF9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9CQVNJQ1RUSUlNUExfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0JpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9UYXJnZXRUcmFuc2Zvcm1JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9UYXJnZXRUcmFuc2Zvcm1JbmZvSW1wbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9JU0RPcGNvZGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldExvd2VyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldFN1YnRhcmdldEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50LmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RhdGFMYXlvdXQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvT3BlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NjaGVkdWxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tbWFuZExpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYWNoaW5lVmFsdWVUeXBlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIFNjYWxhckV2b2x1dGlvbjsKK2NsYXNzIFNDRVY7CitjbGFzcyBUYXJnZXRNYWNoaW5lOworCitleHRlcm4gY2w6Om9wdDx1bnNpZ25lZD4gUGFydGlhbFVucm9sbGluZ1RocmVzaG9sZDsKKworLy8vIFxicmllZiBCYXNlIGNsYXNzIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGhlbHAgYnVpbGQgYSBUVEkgaW1wbGVtZW50YXRpb24uCisvLy8KKy8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGFzIG11Y2ggaW1wbGVtZW50YXRpb24gb2YgdGhlIFRUSSBpbnRlcmZhY2UgYXMgaXMKKy8vLyBwb3NzaWJsZSB1c2luZyB0aGUgdGFyZ2V0IGluZGVwZW5kZW50IHBhcnRzIG9mIHRoZSBjb2RlIGdlbmVyYXRvci4KKy8vLworLy8vIEluIG9yZGVyIHRvIHN1YmNsYXNzIGl0LCB5b3VyIGNsYXNzIG11c3QgaW1wbGVtZW50IGEgZ2V0U1QoKSBtZXRob2QgdG8KKy8vLyByZXR1cm4gdGhlIHN1YnRhcmdldCwgYW5kIGEgZ2V0VExJKCkgbWV0aG9kIHRvIHJldHVybiB0aGUgdGFyZ2V0IGxvd2VyaW5nLgorLy8vIFdlIG5lZWQgdGhlc2UgbWV0aG9kcyBpbXBsZW1lbnRlZCBpbiB0aGUgZGVyaXZlZCBjbGFzcyBzbyB0aGF0IHRoaXMgY2xhc3MKKy8vLyBkb2Vzbid0IGhhdmUgdG8gZHVwbGljYXRlIHN0b3JhZ2UgZm9yIHRoZW0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEJhc2ljVFRJSW1wbEJhc2UgOiBwdWJsaWMgVGFyZ2V0VHJhbnNmb3JtSW5mb0ltcGxDUlRQQmFzZTxUPiB7Citwcml2YXRlOgorICB1c2luZyBCYXNlVCA9IFRhcmdldFRyYW5zZm9ybUluZm9JbXBsQ1JUUEJhc2U8VD47CisgIHVzaW5nIFRUSSA9IFRhcmdldFRyYW5zZm9ybUluZm87CisKKyAgLy8vIEVzdGltYXRlIGEgY29zdCBvZiBzaHVmZmxlIGFzIGEgc2VxdWVuY2Ugb2YgZXh0cmFjdCBhbmQgaW5zZXJ0CisgIC8vLyBvcGVyYXRpb25zLgorICB1bnNpZ25lZCBnZXRQZXJtdXRlU2h1ZmZsZU92ZXJoZWFkKFR5cGUgKlR5KSB7CisgICAgYXNzZXJ0KFR5LT5pc1ZlY3RvclR5KCkgJiYgIkNhbiBvbmx5IHNodWZmbGUgdmVjdG9ycyIpOworICAgIHVuc2lnbmVkIENvc3QgPSAwOworICAgIC8vIFNodWZmbGUgY29zdCBpcyBlcXVhbCB0byB0aGUgY29zdCBvZiBleHRyYWN0aW5nIGVsZW1lbnQgZnJvbSBpdHMgYXJndW1lbnQKKyAgICAvLyBwbHVzIHRoZSBjb3N0IG9mIGluc2VydGluZyB0aGVtIG9udG8gdGhlIHJlc3VsdCB2ZWN0b3IuCisKKyAgICAvLyBlLmcuIDw0IHggZmxvYXQ+IGhhcyBhIG1hc2sgb2YgPDAsNSwyLDc+IGkuZSB3ZSBuZWVkIHRvIGV4dHJhY3QgZnJvbQorICAgIC8vIGluZGV4IDAgb2YgZmlyc3QgdmVjdG9yLCBpbmRleCAxIG9mIHNlY29uZCB2ZWN0b3IsaW5kZXggMiBvZiBmaXJzdAorICAgIC8vIHZlY3RvciBhbmQgZmluYWxseSBpbmRleCAzIG9mIHNlY29uZCB2ZWN0b3IgYW5kIGluc2VydCB0aGVtIGF0IGluZGV4CisgICAgLy8gPDAsMSwyLDM+IG9mIHJlc3VsdCB2ZWN0b3IuCisgICAgZm9yIChpbnQgaSA9IDAsIGUgPSBUeS0+Z2V0VmVjdG9yTnVtRWxlbWVudHMoKTsgaSA8IGU7ICsraSkgeworICAgICAgQ29zdCArPSBzdGF0aWNfY2FzdDxUICo+KHRoaXMpCisgICAgICAgICAgICAgICAgICAtPmdldFZlY3Rvckluc3RyQ29zdChJbnN0cnVjdGlvbjo6SW5zZXJ0RWxlbWVudCwgVHksIGkpOworICAgICAgQ29zdCArPSBzdGF0aWNfY2FzdDxUICo+KHRoaXMpCisgICAgICAgICAgICAgICAgICAtPmdldFZlY3Rvckluc3RyQ29zdChJbnN0cnVjdGlvbjo6RXh0cmFjdEVsZW1lbnQsIFR5LCBpKTsKKyAgICB9CisgICAgcmV0dXJuIENvc3Q7CisgIH0KKworICAvLy8gXGJyaWVmIExvY2FsIHF1ZXJ5IG1ldGhvZCBkZWxlZ2F0ZXMgdXAgdG8gVCB3aGljaCAqbXVzdCogaW1wbGVtZW50IHRoaXMhCisgIGNvbnN0IFRhcmdldFN1YnRhcmdldEluZm8gKmdldFNUKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBUICo+KHRoaXMpLT5nZXRTVCgpOworICB9CisKKyAgLy8vIFxicmllZiBMb2NhbCBxdWVyeSBtZXRob2QgZGVsZWdhdGVzIHVwIHRvIFQgd2hpY2ggKm11c3QqIGltcGxlbWVudCB0aGlzIQorICBjb25zdCBUYXJnZXRMb3dlcmluZ0Jhc2UgKmdldFRMSSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgVCAqPih0aGlzKS0+Z2V0VExJKCk7CisgIH0KKworICBzdGF0aWMgSVNEOjpNZW1JbmRleGVkTW9kZSBnZXRJU0RJbmRleGVkTW9kZShUVEk6Ok1lbUluZGV4ZWRNb2RlIE0pIHsKKyAgICBzd2l0Y2ggKE0pIHsKKyAgICAgIGNhc2UgVFRJOjpNSU1fVW5pbmRleGVkOgorICAgICAgICByZXR1cm4gSVNEOjpVTklOREVYRUQ7CisgICAgICBjYXNlIFRUSTo6TUlNX1ByZUluYzoKKyAgICAgICAgcmV0dXJuIElTRDo6UFJFX0lOQzsKKyAgICAgIGNhc2UgVFRJOjpNSU1fUHJlRGVjOgorICAgICAgICByZXR1cm4gSVNEOjpQUkVfREVDOworICAgICAgY2FzZSBUVEk6Ok1JTV9Qb3N0SW5jOgorICAgICAgICByZXR1cm4gSVNEOjpQT1NUX0lOQzsKKyAgICAgIGNhc2UgVFRJOjpNSU1fUG9zdERlYzoKKyAgICAgICAgcmV0dXJuIElTRDo6UE9TVF9ERUM7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgTWVtSW5kZXhlZE1vZGUiKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IEJhc2ljVFRJSW1wbEJhc2UoY29uc3QgVGFyZ2V0TWFjaGluZSAqVE0sIGNvbnN0IERhdGFMYXlvdXQgJkRMKQorICAgICAgOiBCYXNlVChETCkge30KKworICB1c2luZyBUYXJnZXRUcmFuc2Zvcm1JbmZvSW1wbEJhc2U6OkRMOworCitwdWJsaWM6CisgIC8vLyBcbmFtZSBTY2FsYXIgVFRJIEltcGxlbWVudGF0aW9ucworICAvLy8gQHsKKyAgYm9vbCBhbGxvd3NNaXNhbGlnbmVkTWVtb3J5QWNjZXNzZXMoTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJpdFdpZHRoLCB1bnNpZ25lZCBBZGRyZXNzU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCwgYm9vbCAqRmFzdCkgY29uc3QgeworICAgIEVWVCBFID0gRVZUOjpnZXRJbnRlZ2VyVlQoQ29udGV4dCwgQml0V2lkdGgpOworICAgIHJldHVybiBnZXRUTEkoKS0+YWxsb3dzTWlzYWxpZ25lZE1lbW9yeUFjY2Vzc2VzKEUsIEFkZHJlc3NTcGFjZSwgQWxpZ25tZW50LCBGYXN0KTsKKyAgfQorCisgIGJvb2wgaGFzQnJhbmNoRGl2ZXJnZW5jZSgpIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgYm9vbCBpc1NvdXJjZU9mRGl2ZXJnZW5jZShjb25zdCBWYWx1ZSAqVikgeyByZXR1cm4gZmFsc2U7IH0KKworICBib29sIGlzQWx3YXlzVW5pZm9ybShjb25zdCBWYWx1ZSAqVikgeyByZXR1cm4gZmFsc2U7IH0KKworICB1bnNpZ25lZCBnZXRGbGF0QWRkcmVzc1NwYWNlKCkgeworICAgIC8vIFJldHVybiBhbiBpbnZhbGlkIGFkZHJlc3Mgc3BhY2UuCisgICAgcmV0dXJuIC0xOworICB9CisKKyAgYm9vbCBpc0xlZ2FsQWRkSW1tZWRpYXRlKGludDY0X3QgaW1tKSB7CisgICAgcmV0dXJuIGdldFRMSSgpLT5pc0xlZ2FsQWRkSW1tZWRpYXRlKGltbSk7CisgIH0KKworICBib29sIGlzTGVnYWxJQ21wSW1tZWRpYXRlKGludDY0X3QgaW1tKSB7CisgICAgcmV0dXJuIGdldFRMSSgpLT5pc0xlZ2FsSUNtcEltbWVkaWF0ZShpbW0pOworICB9CisKKyAgYm9vbCBpc0xlZ2FsQWRkcmVzc2luZ01vZGUoVHlwZSAqVHksIEdsb2JhbFZhbHVlICpCYXNlR1YsIGludDY0X3QgQmFzZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNCYXNlUmVnLCBpbnQ2NF90IFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyU3BhY2UsIEluc3RydWN0aW9uICpJID0gbnVsbHB0cikgeworICAgIFRhcmdldExvd2VyaW5nQmFzZTo6QWRkck1vZGUgQU07CisgICAgQU0uQmFzZUdWID0gQmFzZUdWOworICAgIEFNLkJhc2VPZmZzID0gQmFzZU9mZnNldDsKKyAgICBBTS5IYXNCYXNlUmVnID0gSGFzQmFzZVJlZzsKKyAgICBBTS5TY2FsZSA9IFNjYWxlOworICAgIHJldHVybiBnZXRUTEkoKS0+aXNMZWdhbEFkZHJlc3NpbmdNb2RlKERMLCBBTSwgVHksIEFkZHJTcGFjZSwgSSk7CisgIH0KKworICBib29sIGlzSW5kZXhlZExvYWRMZWdhbChUVEk6Ok1lbUluZGV4ZWRNb2RlIE0sIFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCkgY29uc3QgeworICAgIEVWVCBWVCA9IGdldFRMSSgpLT5nZXRWYWx1ZVR5cGUoREwsIFR5KTsKKyAgICByZXR1cm4gZ2V0VExJKCktPmlzSW5kZXhlZExvYWRMZWdhbChnZXRJU0RJbmRleGVkTW9kZShNKSwgVlQpOworICB9CisKKyAgYm9vbCBpc0luZGV4ZWRTdG9yZUxlZ2FsKFRUSTo6TWVtSW5kZXhlZE1vZGUgTSwgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCkgY29uc3QgeworICAgIEVWVCBWVCA9IGdldFRMSSgpLT5nZXRWYWx1ZVR5cGUoREwsIFR5KTsKKyAgICByZXR1cm4gZ2V0VExJKCktPmlzSW5kZXhlZFN0b3JlTGVnYWwoZ2V0SVNESW5kZXhlZE1vZGUoTSksIFZUKTsKKyAgfQorCisgIGJvb2wgaXNMU1JDb3N0TGVzcyhUVEk6OkxTUkNvc3QgQzEsIFRUSTo6TFNSQ29zdCBDMikgeworICAgIHJldHVybiBUYXJnZXRUcmFuc2Zvcm1JbmZvSW1wbEJhc2U6OmlzTFNSQ29zdExlc3MoQzEsIEMyKTsKKyAgfQorCisgIGludCBnZXRTY2FsaW5nRmFjdG9yQ29zdChUeXBlICpUeSwgR2xvYmFsVmFsdWUgKkJhc2VHViwgaW50NjRfdCBCYXNlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNCYXNlUmVnLCBpbnQ2NF90IFNjYWxlLCB1bnNpZ25lZCBBZGRyU3BhY2UpIHsKKyAgICBUYXJnZXRMb3dlcmluZ0Jhc2U6OkFkZHJNb2RlIEFNOworICAgIEFNLkJhc2VHViA9IEJhc2VHVjsKKyAgICBBTS5CYXNlT2ZmcyA9IEJhc2VPZmZzZXQ7CisgICAgQU0uSGFzQmFzZVJlZyA9IEhhc0Jhc2VSZWc7CisgICAgQU0uU2NhbGUgPSBTY2FsZTsKKyAgICByZXR1cm4gZ2V0VExJKCktPmdldFNjYWxpbmdGYWN0b3JDb3N0KERMLCBBTSwgVHksIEFkZHJTcGFjZSk7CisgIH0KKworICBib29sIGlzVHJ1bmNhdGVGcmVlKFR5cGUgKlR5MSwgVHlwZSAqVHkyKSB7CisgICAgcmV0dXJuIGdldFRMSSgpLT5pc1RydW5jYXRlRnJlZShUeTEsIFR5Mik7CisgIH0KKworICBib29sIGlzUHJvZml0YWJsZVRvSG9pc3QoSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gZ2V0VExJKCktPmlzUHJvZml0YWJsZVRvSG9pc3QoSSk7CisgIH0KKworICBib29sIHVzZUFBKCkgY29uc3QgeyByZXR1cm4gZ2V0U1QoKS0+dXNlQUEoKTsgfQorCisgIGJvb2wgaXNUeXBlTGVnYWwoVHlwZSAqVHkpIHsKKyAgICBFVlQgVlQgPSBnZXRUTEkoKS0+Z2V0VmFsdWVUeXBlKERMLCBUeSk7CisgICAgcmV0dXJuIGdldFRMSSgpLT5pc1R5cGVMZWdhbChWVCk7CisgIH0KKworICBpbnQgZ2V0R0VQQ29zdChUeXBlICpQb2ludGVlVHlwZSwgY29uc3QgVmFsdWUgKlB0ciwKKyAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gT3BlcmFuZHMpIHsKKyAgICByZXR1cm4gQmFzZVQ6OmdldEdFUENvc3QoUG9pbnRlZVR5cGUsIFB0ciwgT3BlcmFuZHMpOworICB9CisKKyAgaW50IGdldEV4dENvc3QoY29uc3QgSW5zdHJ1Y3Rpb24gKkksIGNvbnN0IFZhbHVlICpTcmMpIHsKKyAgICBpZiAoZ2V0VExJKCktPmlzRXh0RnJlZShJKSkKKyAgICAgIHJldHVybiBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpUQ0NfRnJlZTsKKworICAgIGlmIChpc2E8WkV4dEluc3Q+KEkpIHx8IGlzYTxTRXh0SW5zdD4oSSkpCisgICAgICBpZiAoY29uc3QgTG9hZEluc3QgKkxJID0gZHluX2Nhc3Q8TG9hZEluc3Q+KFNyYykpCisgICAgICAgIGlmIChnZXRUTEkoKS0+aXNFeHRMb2FkKExJLCBJLCBETCkpCisgICAgICAgICAgcmV0dXJuIFRhcmdldFRyYW5zZm9ybUluZm86OlRDQ19GcmVlOworCisgICAgcmV0dXJuIFRhcmdldFRyYW5zZm9ybUluZm86OlRDQ19CYXNpYzsKKyAgfQorCisgIHVuc2lnbmVkIGdldEludHJpbnNpY0Nvc3QoSW50cmluc2ljOjpJRCBJSUQsIFR5cGUgKlJldFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IFZhbHVlICo+IEFyZ3VtZW50cykgeworICAgIHJldHVybiBCYXNlVDo6Z2V0SW50cmluc2ljQ29zdChJSUQsIFJldFR5LCBBcmd1bWVudHMpOworICB9CisKKyAgdW5zaWduZWQgZ2V0SW50cmluc2ljQ29zdChJbnRyaW5zaWM6OklEIElJRCwgVHlwZSAqUmV0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VHlwZSAqPiBQYXJhbVR5cykgeworICAgIGlmIChJSUQgPT0gSW50cmluc2ljOjpjdHR6KSB7CisgICAgICBpZiAoZ2V0VExJKCktPmlzQ2hlYXBUb1NwZWN1bGF0ZUN0dHooKSkKKyAgICAgICAgcmV0dXJuIFRhcmdldFRyYW5zZm9ybUluZm86OlRDQ19CYXNpYzsKKyAgICAgIHJldHVybiBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpUQ0NfRXhwZW5zaXZlOworICAgIH0KKworICAgIGlmIChJSUQgPT0gSW50cmluc2ljOjpjdGx6KSB7CisgICAgICBpZiAoZ2V0VExJKCktPmlzQ2hlYXBUb1NwZWN1bGF0ZUN0bHooKSkKKyAgICAgICAgcmV0dXJuIFRhcmdldFRyYW5zZm9ybUluZm86OlRDQ19CYXNpYzsKKyAgICAgIHJldHVybiBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpUQ0NfRXhwZW5zaXZlOworICAgIH0KKworICAgIHJldHVybiBCYXNlVDo6Z2V0SW50cmluc2ljQ29zdChJSUQsIFJldFR5LCBQYXJhbVR5cyk7CisgIH0KKworICB1bnNpZ25lZCBnZXRFc3RpbWF0ZWROdW1iZXJPZkNhc2VDbHVzdGVycyhjb25zdCBTd2l0Y2hJbnN0ICZTSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkp1bXBUYWJsZVNpemUpIHsKKyAgICAvLy8gVHJ5IHRvIGZpbmQgdGhlIGVzdGltYXRlZCBudW1iZXIgb2YgY2x1c3RlcnMuIE5vdGUgdGhhdCB0aGUgbnVtYmVyIG9mCisgICAgLy8vIGNsdXN0ZXJzIGlkZW50aWZpZWQgaW4gdGhpcyBmdW5jdGlvbiBjb3VsZCBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgYWN0dXJhbAorICAgIC8vLyBudW1iZXJzIGZvdW5kIGluIGxvd2VyaW5nLiBUaGlzIGZ1bmN0aW9uIGlnbm9yZSBzd2l0Y2hlcyB0aGF0IGFyZQorICAgIC8vLyBsb3dlcmVkIHdpdGggYSBtaXggb2YganVtcCB0YWJsZSAvIGJpdCB0ZXN0IC8gQlRyZWUuIFRoaXMgZnVuY3Rpb24gd2FzCisgICAgLy8vIGluaXRpYWxseSBpbnRlbmRlZCB0byBiZSB1c2VkIHdoZW4gZXN0aW1hdGluZyB0aGUgY29zdCBvZiBzd2l0Y2ggaW4KKyAgICAvLy8gaW5saW5lIGNvc3QgaGV1cmlzdGljLCBidXQgaXQncyBhIGdlbmVyaWMgY29zdCBtb2RlbCB0byBiZSB1c2VkIGluIG90aGVyCisgICAgLy8vIHBsYWNlcyAoZS5nLiwgaW4gbG9vcCB1bnJvbGxpbmcpLgorICAgIHVuc2lnbmVkIE4gPSBTSS5nZXROdW1DYXNlcygpOworICAgIGNvbnN0IFRhcmdldExvd2VyaW5nQmFzZSAqVExJID0gZ2V0VExJKCk7CisgICAgY29uc3QgRGF0YUxheW91dCAmREwgPSB0aGlzLT5nZXREYXRhTGF5b3V0KCk7CisKKyAgICBKdW1wVGFibGVTaXplID0gMDsKKyAgICBib29sIElzSlRBbGxvd2VkID0gVExJLT5hcmVKVHNBbGxvd2VkKFNJLmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKSk7CisKKyAgICAvLyBFYXJseSBleGl0IGlmIGJvdGggYSBqdW1wIHRhYmxlIGFuZCBiaXQgdGVzdCBhcmUgbm90IGFsbG93ZWQuCisgICAgaWYgKE4gPCAxIHx8ICghSXNKVEFsbG93ZWQgJiYgREwuZ2V0SW5kZXhTaXplSW5CaXRzKDB1KSA8IE4pKQorICAgICAgcmV0dXJuIE47CisKKyAgICBBUEludCBNYXhDYXNlVmFsID0gU0kuY2FzZV9iZWdpbigpLT5nZXRDYXNlVmFsdWUoKS0+Z2V0VmFsdWUoKTsKKyAgICBBUEludCBNaW5DYXNlVmFsID0gTWF4Q2FzZVZhbDsKKyAgICBmb3IgKGF1dG8gQ0kgOiBTSS5jYXNlcygpKSB7CisgICAgICBjb25zdCBBUEludCAmQ2FzZVZhbCA9IENJLmdldENhc2VWYWx1ZSgpLT5nZXRWYWx1ZSgpOworICAgICAgaWYgKENhc2VWYWwuc2d0KE1heENhc2VWYWwpKQorICAgICAgICBNYXhDYXNlVmFsID0gQ2FzZVZhbDsKKyAgICAgIGlmIChDYXNlVmFsLnNsdChNaW5DYXNlVmFsKSkKKyAgICAgICAgTWluQ2FzZVZhbCA9IENhc2VWYWw7CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgc3VpdGFibGUgZm9yIGEgYml0IHRlc3QKKyAgICBpZiAoTiA8PSBETC5nZXRJbmRleFNpemVJbkJpdHMoMHUpKSB7CisgICAgICBTbWFsbFB0clNldDxjb25zdCBCYXNpY0Jsb2NrICosIDQ+IERlc3RzOworICAgICAgZm9yIChhdXRvIEkgOiBTSS5jYXNlcygpKQorICAgICAgICBEZXN0cy5pbnNlcnQoSS5nZXRDYXNlU3VjY2Vzc29yKCkpOworCisgICAgICBpZiAoVExJLT5pc1N1aXRhYmxlRm9yQml0VGVzdHMoRGVzdHMuc2l6ZSgpLCBOLCBNaW5DYXNlVmFsLCBNYXhDYXNlVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERMKSkKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLy8gQ2hlY2sgaWYgc3VpdGFibGUgZm9yIGEganVtcCB0YWJsZS4KKyAgICBpZiAoSXNKVEFsbG93ZWQpIHsKKyAgICAgIGlmIChOIDwgMiB8fCBOIDwgVExJLT5nZXRNaW5pbXVtSnVtcFRhYmxlRW50cmllcygpKQorICAgICAgICByZXR1cm4gTjsKKyAgICAgIHVpbnQ2NF90IFJhbmdlID0KKyAgICAgICAgICAoTWF4Q2FzZVZhbCAtIE1pbkNhc2VWYWwpCisgICAgICAgICAgICAgIC5nZXRMaW1pdGVkVmFsdWUoc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpIC0gMSkgKyAxOworICAgICAgLy8gQ2hlY2sgd2hldGhlciBhIHJhbmdlIG9mIGNsdXN0ZXJzIGlzIGRlbnNlIGVub3VnaCBmb3IgYSBqdW1wIHRhYmxlCisgICAgICBpZiAoVExJLT5pc1N1aXRhYmxlRm9ySnVtcFRhYmxlKCZTSSwgTiwgUmFuZ2UpKSB7CisgICAgICAgIEp1bXBUYWJsZVNpemUgPSBSYW5nZTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBOOworICB9CisKKyAgdW5zaWduZWQgZ2V0SnVtcEJ1ZkFsaWdubWVudCgpIHsgcmV0dXJuIGdldFRMSSgpLT5nZXRKdW1wQnVmQWxpZ25tZW50KCk7IH0KKworICB1bnNpZ25lZCBnZXRKdW1wQnVmU2l6ZSgpIHsgcmV0dXJuIGdldFRMSSgpLT5nZXRKdW1wQnVmU2l6ZSgpOyB9CisKKyAgYm9vbCBzaG91bGRCdWlsZExvb2t1cFRhYmxlcygpIHsKKyAgICBjb25zdCBUYXJnZXRMb3dlcmluZ0Jhc2UgKlRMSSA9IGdldFRMSSgpOworICAgIHJldHVybiBUTEktPmlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbShJU0Q6OkJSX0pULCBNVlQ6Ok90aGVyKSB8fAorICAgICAgICAgICBUTEktPmlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbShJU0Q6OkJSSU5ELCBNVlQ6Ok90aGVyKTsKKyAgfQorCisgIGJvb2wgaGF2ZUZhc3RTcXJ0KFR5cGUgKlR5KSB7CisgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmdCYXNlICpUTEkgPSBnZXRUTEkoKTsKKyAgICBFVlQgVlQgPSBUTEktPmdldFZhbHVlVHlwZShETCwgVHkpOworICAgIHJldHVybiBUTEktPmlzVHlwZUxlZ2FsKFZUKSAmJgorICAgICAgICAgICBUTEktPmlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbShJU0Q6OkZTUVJULCBWVCk7CisgIH0KKworICBib29sIGlzRkNtcE9yZENoZWFwZXJUaGFuRkNtcFplcm8oVHlwZSAqVHkpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHVuc2lnbmVkIGdldEZQT3BDb3N0KFR5cGUgKlR5KSB7CisgICAgLy8gQ2hlY2sgd2hldGhlciBGQUREIGlzIGF2YWlsYWJsZSwgYXMgYSBwcm94eSBmb3IgZmxvYXRpbmctcG9pbnQgaW4KKyAgICAvLyBnZW5lcmFsLgorICAgIGNvbnN0IFRhcmdldExvd2VyaW5nQmFzZSAqVExJID0gZ2V0VExJKCk7CisgICAgRVZUIFZUID0gVExJLT5nZXRWYWx1ZVR5cGUoREwsIFR5KTsKKyAgICBpZiAoVExJLT5pc09wZXJhdGlvbkxlZ2FsT3JDdXN0b21PclByb21vdGUoSVNEOjpGQURELCBWVCkpCisgICAgICByZXR1cm4gVGFyZ2V0VHJhbnNmb3JtSW5mbzo6VENDX0Jhc2ljOworICAgIHJldHVybiBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpUQ0NfRXhwZW5zaXZlOworICB9CisKKyAgdW5zaWduZWQgZ2V0T3BlcmF0aW9uQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlR5LCBUeXBlICpPcFR5KSB7CisgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmdCYXNlICpUTEkgPSBnZXRUTEkoKTsKKyAgICBzd2l0Y2ggKE9wY29kZSkgeworICAgIGRlZmF1bHQ6IGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlRydW5jOgorICAgICAgaWYgKFRMSS0+aXNUcnVuY2F0ZUZyZWUoT3BUeSwgVHkpKQorICAgICAgICByZXR1cm4gVGFyZ2V0VHJhbnNmb3JtSW5mbzo6VENDX0ZyZWU7CisgICAgICByZXR1cm4gVGFyZ2V0VHJhbnNmb3JtSW5mbzo6VENDX0Jhc2ljOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlpFeHQ6CisgICAgICBpZiAoVExJLT5pc1pFeHRGcmVlKE9wVHksIFR5KSkKKyAgICAgICAgcmV0dXJuIFRhcmdldFRyYW5zZm9ybUluZm86OlRDQ19GcmVlOworICAgICAgcmV0dXJuIFRhcmdldFRyYW5zZm9ybUluZm86OlRDQ19CYXNpYzsKKyAgICB9CisKKyAgICByZXR1cm4gQmFzZVQ6OmdldE9wZXJhdGlvbkNvc3QoT3Bjb2RlLCBUeSwgT3BUeSk7CisgIH0KKworICB1bnNpZ25lZCBnZXRJbmxpbmluZ1RocmVzaG9sZE11bHRpcGxpZXIoKSB7IHJldHVybiAxOyB9CisKKyAgdm9pZCBnZXRVbnJvbGxpbmdQcmVmZXJlbmNlcyhMb29wICpMLCBTY2FsYXJFdm9sdXRpb24gJlNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRUSTo6VW5yb2xsaW5nUHJlZmVyZW5jZXMgJlVQKSB7CisgICAgLy8gVGhpcyB1bnJvbGxpbmcgZnVuY3Rpb25hbGl0eSBpcyB0YXJnZXQgaW5kZXBlbmRlbnQsIGJ1dCB0byBwcm92aWRlIHNvbWUKKyAgICAvLyBtb3RpdmF0aW9uIGZvciBpdHMgaW50ZW5kZWQgdXNlLCBmb3IgeDg2OgorCisgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBJbnRlbCA2NCBhbmQgSUEtMzIgQXJjaGl0ZWN0dXJlcyBPcHRpbWl6YXRpb24gUmVmZXJlbmNlCisgICAgLy8gTWFudWFsLCBJbnRlbCBDb3JlIG1vZGVscyBhbmQgbGF0ZXIgaGF2ZSBhIGxvb3Agc3RyZWFtIGRldGVjdG9yIChhbmQKKyAgICAvLyBhc3NvY2lhdGVkIHVvcCBxdWV1ZSkgdGhhdCBjYW4gYmVuZWZpdCBmcm9tIHBhcnRpYWwgdW5yb2xsaW5nLgorICAgIC8vIFRoZSByZWxldmFudCByZXF1aXJlbWVudHMgYXJlOgorICAgIC8vICAtIFRoZSBsb29wIG11c3QgaGF2ZSBubyBtb3JlIHRoYW4gNCAoOCBmb3IgTmVoYWxlbSBhbmQgbGF0ZXIpIGJyYW5jaGVzCisgICAgLy8gICAgdGFrZW4sIGFuZCBub25lIG9mIHRoZW0gbWF5IGJlIGNhbGxzLgorICAgIC8vICAtIFRoZSBsb29wIGNhbiBoYXZlIG5vIG1vcmUgdGhhbiAxOCAoMjggZm9yIE5laGFsZW0gYW5kIGxhdGVyKSB1b3BzLgorCisgICAgLy8gQWNjb3JkaW5nIHRvIHRoZSBTb2Z0d2FyZSBPcHRpbWl6YXRpb24gR3VpZGUgZm9yIEFNRCBGYW1pbHkgMTVoCisgICAgLy8gUHJvY2Vzc29ycywgbW9kZWxzIDMwaC00ZmggKFN0ZWFtcm9sbGVyIGFuZCBsYXRlcikgaGF2ZSBhIGxvb3AgcHJlZGljdG9yCisgICAgLy8gYW5kIGxvb3AgYnVmZmVyIHdoaWNoIGNhbiBiZW5lZml0IGZyb20gcGFydGlhbCB1bnJvbGxpbmcuCisgICAgLy8gVGhlIHJlbGV2YW50IHJlcXVpcmVtZW50cyBhcmU6CisgICAgLy8gIC0gVGhlIGxvb3AgbXVzdCBoYXZlIGZld2VyIHRoYW4gMTYgYnJhbmNoZXMKKyAgICAvLyAgLSBUaGUgbG9vcCBtdXN0IGhhdmUgbGVzcyB0aGFuIDQwIHVvcHMgaW4gYWxsIGV4ZWN1dGVkIGxvb3AgYnJhbmNoZXMKKworICAgIC8vIFRoZSBudW1iZXIgb2YgdGFrZW4gYnJhbmNoZXMgaW4gYSBsb29wIGlzIGhhcmQgdG8gZXN0aW1hdGUgaGVyZSwgYW5kCisgICAgLy8gYmVuY2htYXJraW5nIGhhcyByZXZlYWxlZCB0aGF0IGl0IGlzIGJldHRlciBub3QgdG8gYmUgY29uc2VydmF0aXZlIHdoZW4KKyAgICAvLyBlc3RpbWF0aW5nIHRoZSBicmFuY2ggY291bnQuIEFzIGEgcmVzdWx0LCB3ZSdsbCBpZ25vcmUgdGhlIGJyYW5jaCBsaW1pdHMKKyAgICAvLyB1bnRpbCBzb21lb25lIGZpbmRzIGEgY2FzZSB3aGVyZSBpdCBtYXR0ZXJzIGluIHByYWN0aWNlLgorCisgICAgdW5zaWduZWQgTWF4T3BzOworICAgIGNvbnN0IFRhcmdldFN1YnRhcmdldEluZm8gKlNUID0gZ2V0U1QoKTsKKyAgICBpZiAoUGFydGlhbFVucm9sbGluZ1RocmVzaG9sZC5nZXROdW1PY2N1cnJlbmNlcygpID4gMCkKKyAgICAgIE1heE9wcyA9IFBhcnRpYWxVbnJvbGxpbmdUaHJlc2hvbGQ7CisgICAgZWxzZSBpZiAoU1QtPmdldFNjaGVkTW9kZWwoKS5Mb29wTWljcm9PcEJ1ZmZlclNpemUgPiAwKQorICAgICAgTWF4T3BzID0gU1QtPmdldFNjaGVkTW9kZWwoKS5Mb29wTWljcm9PcEJ1ZmZlclNpemU7CisgICAgZWxzZQorICAgICAgcmV0dXJuOworCisgICAgLy8gU2NhbiB0aGUgbG9vcDogZG9uJ3QgdW5yb2xsIGxvb3BzIHdpdGggY2FsbHMuCisgICAgZm9yIChMb29wOjpibG9ja19pdGVyYXRvciBJID0gTC0+YmxvY2tfYmVnaW4oKSwgRSA9IEwtPmJsb2NrX2VuZCgpOyBJICE9IEU7CisgICAgICAgICArK0kpIHsKKyAgICAgIEJhc2ljQmxvY2sgKkJCID0gKkk7CisKKyAgICAgIGZvciAoQmFzaWNCbG9jazo6aXRlcmF0b3IgSiA9IEJCLT5iZWdpbigpLCBKRSA9IEJCLT5lbmQoKTsgSiAhPSBKRTsgKytKKQorICAgICAgICBpZiAoaXNhPENhbGxJbnN0PihKKSB8fCBpc2E8SW52b2tlSW5zdD4oSikpIHsKKyAgICAgICAgICBJbW11dGFibGVDYWxsU2l0ZSBDUygmKkopOworICAgICAgICAgIGlmIChjb25zdCBGdW5jdGlvbiAqRiA9IENTLmdldENhbGxlZEZ1bmN0aW9uKCkpIHsKKyAgICAgICAgICAgIGlmICghc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+aXNMb3dlcmVkVG9DYWxsKEYpKQorICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBFbmFibGUgcnVudGltZSBhbmQgcGFydGlhbCB1bnJvbGxpbmcgdXAgdG8gdGhlIHNwZWNpZmllZCBzaXplLgorICAgIC8vIEVuYWJsZSB1c2luZyB0cmlwIGNvdW50IHVwcGVyIGJvdW5kIHRvIHVucm9sbCBsb29wcy4KKyAgICBVUC5QYXJ0aWFsID0gVVAuUnVudGltZSA9IFVQLlVwcGVyQm91bmQgPSB0cnVlOworICAgIFVQLlBhcnRpYWxUaHJlc2hvbGQgPSBNYXhPcHM7CisKKyAgICAvLyBBdm9pZCB1bnJvbGxpbmcgd2hlbiBvcHRpbWl6aW5nIGZvciBzaXplLgorICAgIFVQLk9wdFNpemVUaHJlc2hvbGQgPSAwOworICAgIFVQLlBhcnRpYWxPcHRTaXplVGhyZXNob2xkID0gMDsKKworICAgIC8vIFNldCBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIG9wdGltaXplZCB3aGVuICJiYWNrIGVkZ2UiCisgICAgLy8gYmVjb21lcyAiZmFsbCB0aHJvdWdoIiB0byBkZWZhdWx0IHZhbHVlIG9mIDIuCisgICAgVVAuQkVJbnNucyA9IDI7CisgIH0KKworICBpbnQgZ2V0SW5zdHJ1Y3Rpb25MYXRlbmN5KGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgaWYgKGlzYTxMb2FkSW5zdD4oSSkpCisgICAgICByZXR1cm4gZ2V0U1QoKS0+Z2V0U2NoZWRNb2RlbCgpLkRlZmF1bHRMb2FkTGF0ZW5jeTsKKworICAgIHJldHVybiBCYXNlVDo6Z2V0SW5zdHJ1Y3Rpb25MYXRlbmN5KEkpOworICB9CisKKyAgLy8vIEB9CisKKyAgLy8vIFxuYW1lIFZlY3RvciBUVEkgSW1wbGVtZW50YXRpb25zCisgIC8vLyBAeworCisgIHVuc2lnbmVkIGdldE51bWJlck9mUmVnaXN0ZXJzKGJvb2wgVmVjdG9yKSB7IHJldHVybiBWZWN0b3IgPyAwIDogMTsgfQorCisgIHVuc2lnbmVkIGdldFJlZ2lzdGVyQml0V2lkdGgoYm9vbCBWZWN0b3IpIGNvbnN0IHsgcmV0dXJuIDMyOyB9CisKKyAgLy8vIEVzdGltYXRlIHRoZSBvdmVyaGVhZCBvZiBzY2FsYXJpemluZyBhbiBpbnN0cnVjdGlvbi4gSW5zZXJ0IGFuZCBFeHRyYWN0CisgIC8vLyBhcmUgc2V0IGlmIHRoZSByZXN1bHQgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgYW5kL29yIGV4dHJhY3RlZCBmcm9tIHZlY3RvcnMuCisgIHVuc2lnbmVkIGdldFNjYWxhcml6YXRpb25PdmVyaGVhZChUeXBlICpUeSwgYm9vbCBJbnNlcnQsIGJvb2wgRXh0cmFjdCkgeworICAgIGFzc2VydChUeS0+aXNWZWN0b3JUeSgpICYmICJDYW4gb25seSBzY2FsYXJpemUgdmVjdG9ycyIpOworICAgIHVuc2lnbmVkIENvc3QgPSAwOworCisgICAgZm9yIChpbnQgaSA9IDAsIGUgPSBUeS0+Z2V0VmVjdG9yTnVtRWxlbWVudHMoKTsgaSA8IGU7ICsraSkgeworICAgICAgaWYgKEluc2VydCkKKyAgICAgICAgQ29zdCArPSBzdGF0aWNfY2FzdDxUICo+KHRoaXMpCisgICAgICAgICAgICAgICAgICAgIC0+Z2V0VmVjdG9ySW5zdHJDb3N0KEluc3RydWN0aW9uOjpJbnNlcnRFbGVtZW50LCBUeSwgaSk7CisgICAgICBpZiAoRXh0cmFjdCkKKyAgICAgICAgQ29zdCArPSBzdGF0aWNfY2FzdDxUICo+KHRoaXMpCisgICAgICAgICAgICAgICAgICAgIC0+Z2V0VmVjdG9ySW5zdHJDb3N0KEluc3RydWN0aW9uOjpFeHRyYWN0RWxlbWVudCwgVHksIGkpOworICAgIH0KKworICAgIHJldHVybiBDb3N0OworICB9CisKKyAgLy8vIEVzdGltYXRlIHRoZSBvdmVyaGVhZCBvZiBzY2FsYXJpemluZyBhbiBpbnN0cnVjdGlvbnMgdW5pcXVlCisgIC8vLyBub24tY29uc3RhbnQgb3BlcmFuZHMuIFRoZSB0eXBlcyBvZiB0aGUgYXJndW1lbnRzIGFyZSBvcmRpbmFyaWx5CisgIC8vLyBzY2FsYXIsIGluIHdoaWNoIGNhc2UgdGhlIGNvc3RzIGFyZSBtdWx0aXBsaWVkIHdpdGggVkYuCisgIHVuc2lnbmVkIGdldE9wZXJhbmRzU2NhbGFyaXphdGlvbk92ZXJoZWFkKEFycmF5UmVmPGNvbnN0IFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZGKSB7CisgICAgdW5zaWduZWQgQ29zdCA9IDA7CisgICAgU21hbGxQdHJTZXQ8Y29uc3QgVmFsdWUqLCA0PiBVbmlxdWVPcGVyYW5kczsKKyAgICBmb3IgKGNvbnN0IFZhbHVlICpBIDogQXJncykgeworICAgICAgaWYgKCFpc2E8Q29uc3RhbnQ+KEEpICYmIFVuaXF1ZU9wZXJhbmRzLmluc2VydChBKS5zZWNvbmQpIHsKKyAgICAgICAgVHlwZSAqVmVjVHkgPSBudWxscHRyOworICAgICAgICBpZiAoQS0+Z2V0VHlwZSgpLT5pc1ZlY3RvclR5KCkpIHsKKyAgICAgICAgICBWZWNUeSA9IEEtPmdldFR5cGUoKTsKKyAgICAgICAgICAvLyBJZiBBIGlzIGEgdmVjdG9yIG9wZXJhbmQsIFZGIHNob3VsZCBiZSAxIG9yIGNvcnJlc3BvbmQgdG8gQS4KKyAgICAgICAgICBhc3NlcnQoKFZGID09IDEgfHwgVkYgPT0gVmVjVHktPmdldFZlY3Rvck51bUVsZW1lbnRzKCkpICYmCisgICAgICAgICAgICAgICAgICJWZWN0b3IgYXJndW1lbnQgZG9lcyBub3QgbWF0Y2ggVkYiKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgICAgVmVjVHkgPSBWZWN0b3JUeXBlOjpnZXQoQS0+Z2V0VHlwZSgpLCBWRik7CisKKyAgICAgICAgQ29zdCArPSBnZXRTY2FsYXJpemF0aW9uT3ZlcmhlYWQoVmVjVHksIGZhbHNlLCB0cnVlKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gQ29zdDsKKyAgfQorCisgIHVuc2lnbmVkIGdldFNjYWxhcml6YXRpb25PdmVyaGVhZChUeXBlICpWZWNUeSwgQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gQXJncykgeworICAgIGFzc2VydChWZWNUeS0+aXNWZWN0b3JUeSgpKTsKKworICAgIHVuc2lnbmVkIENvc3QgPSAwOworCisgICAgQ29zdCArPSBnZXRTY2FsYXJpemF0aW9uT3ZlcmhlYWQoVmVjVHksIHRydWUsIGZhbHNlKTsKKyAgICBpZiAoIUFyZ3MuZW1wdHkoKSkKKyAgICAgIENvc3QgKz0gZ2V0T3BlcmFuZHNTY2FsYXJpemF0aW9uT3ZlcmhlYWQoQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjVHktPmdldFZlY3Rvck51bUVsZW1lbnRzKCkpOworICAgIGVsc2UKKyAgICAgIC8vIFdoZW4gbm8gaW5mb3JtYXRpb24gb24gYXJndW1lbnRzIGlzIHByb3ZpZGVkLCB3ZSBhZGQgdGhlIGNvc3QKKyAgICAgIC8vIGFzc29jaWF0ZWQgd2l0aCBvbmUgYXJndW1lbnQgYXMgYSBoZXVyaXN0aWMuCisgICAgICBDb3N0ICs9IGdldFNjYWxhcml6YXRpb25PdmVyaGVhZChWZWNUeSwgZmFsc2UsIHRydWUpOworCisgICAgcmV0dXJuIENvc3Q7CisgIH0KKworICB1bnNpZ25lZCBnZXRNYXhJbnRlcmxlYXZlRmFjdG9yKHVuc2lnbmVkIFZGKSB7IHJldHVybiAxOyB9CisKKyAgdW5zaWduZWQgZ2V0QXJpdGhtZXRpY0luc3RyQ29zdCgKKyAgICAgIHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVHksCisgICAgICBUVEk6Ok9wZXJhbmRWYWx1ZUtpbmQgT3BkMUluZm8gPSBUVEk6Ok9LX0FueVZhbHVlLAorICAgICAgVFRJOjpPcGVyYW5kVmFsdWVLaW5kIE9wZDJJbmZvID0gVFRJOjpPS19BbnlWYWx1ZSwKKyAgICAgIFRUSTo6T3BlcmFuZFZhbHVlUHJvcGVydGllcyBPcGQxUHJvcEluZm8gPSBUVEk6Ok9QX05vbmUsCisgICAgICBUVEk6Ok9wZXJhbmRWYWx1ZVByb3BlcnRpZXMgT3BkMlByb3BJbmZvID0gVFRJOjpPUF9Ob25lLAorICAgICAgQXJyYXlSZWY8Y29uc3QgVmFsdWUgKj4gQXJncyA9IEFycmF5UmVmPGNvbnN0IFZhbHVlICo+KCkpIHsKKyAgICAvLyBDaGVjayBpZiBhbnkgb2YgdGhlIG9wZXJhbmRzIGFyZSB2ZWN0b3Igb3BlcmFuZHMuCisgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmdCYXNlICpUTEkgPSBnZXRUTEkoKTsKKyAgICBpbnQgSVNEID0gVExJLT5JbnN0cnVjdGlvbk9wY29kZVRvSVNEKE9wY29kZSk7CisgICAgYXNzZXJ0KElTRCAmJiAiSW52YWxpZCBvcGNvZGUiKTsKKworICAgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgTVZUPiBMVCA9IFRMSS0+Z2V0VHlwZUxlZ2FsaXphdGlvbkNvc3QoREwsIFR5KTsKKworICAgIGJvb2wgSXNGbG9hdCA9IFR5LT5pc0ZQT3JGUFZlY3RvclR5KCk7CisgICAgLy8gQXNzdW1lIHRoYXQgZmxvYXRpbmcgcG9pbnQgYXJpdGhtZXRpYyBvcGVyYXRpb25zIGNvc3QgdHdpY2UgYXMgbXVjaCBhcworICAgIC8vIGludGVnZXIgb3BlcmF0aW9ucy4KKyAgICB1bnNpZ25lZCBPcENvc3QgPSAoSXNGbG9hdCA/IDIgOiAxKTsKKworICAgIGlmIChUTEktPmlzT3BlcmF0aW9uTGVnYWxPclByb21vdGUoSVNELCBMVC5zZWNvbmQpKSB7CisgICAgICAvLyBUaGUgb3BlcmF0aW9uIGlzIGxlZ2FsLiBBc3N1bWUgaXQgY29zdHMgMS4KKyAgICAgIC8vIFRPRE86IE9uY2Ugd2UgaGF2ZSBleHRyYWN0L2luc2VydCBzdWJ2ZWN0b3IgY29zdCB3ZSBuZWVkIHRvIHVzZSB0aGVtLgorICAgICAgcmV0dXJuIExULmZpcnN0ICogT3BDb3N0OworICAgIH0KKworICAgIGlmICghVExJLT5pc09wZXJhdGlvbkV4cGFuZChJU0QsIExULnNlY29uZCkpIHsKKyAgICAgIC8vIElmIHRoZSBvcGVyYXRpb24gaXMgY3VzdG9tIGxvd2VyZWQsIHRoZW4gYXNzdW1lIHRoYXQgdGhlIGNvZGUgaXMgdHdpY2UKKyAgICAgIC8vIGFzIGV4cGVuc2l2ZS4KKyAgICAgIHJldHVybiBMVC5maXJzdCAqIDIgKiBPcENvc3Q7CisgICAgfQorCisgICAgLy8gRWxzZSwgYXNzdW1lIHRoYXQgd2UgbmVlZCB0byBzY2FsYXJpemUgdGhpcyBvcC4KKyAgICAvLyBUT0RPOiBJZiBvbmUgb2YgdGhlIHR5cGVzIGdldCBsZWdhbGl6ZWQgYnkgc3BsaXR0aW5nLCBoYW5kbGUgdGhpcworICAgIC8vIHNpbWlsYXJseSB0byB3aGF0IGdldENhc3RJbnN0ckNvc3QoKSBkb2VzLgorICAgIGlmIChUeS0+aXNWZWN0b3JUeSgpKSB7CisgICAgICB1bnNpZ25lZCBOdW0gPSBUeS0+Z2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgICAgIHVuc2lnbmVkIENvc3QgPSBzdGF0aWNfY2FzdDxUICo+KHRoaXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0QXJpdGhtZXRpY0luc3RyQ29zdChPcGNvZGUsIFR5LT5nZXRTY2FsYXJUeXBlKCkpOworICAgICAgLy8gUmV0dXJuIHRoZSBjb3N0IG9mIG11bHRpcGxlIHNjYWxhciBpbnZvY2F0aW9uIHBsdXMgdGhlIGNvc3Qgb2YKKyAgICAgIC8vIGluc2VydGluZyBhbmQgZXh0cmFjdGluZyB0aGUgdmFsdWVzLgorICAgICAgcmV0dXJuIGdldFNjYWxhcml6YXRpb25PdmVyaGVhZChUeSwgQXJncykgKyBOdW0gKiBDb3N0OworICAgIH0KKworICAgIC8vIFdlIGRvbid0IGtub3cgYW55dGhpbmcgYWJvdXQgdGhpcyBzY2FsYXIgaW5zdHJ1Y3Rpb24uCisgICAgcmV0dXJuIE9wQ29zdDsKKyAgfQorCisgIHVuc2lnbmVkIGdldFNodWZmbGVDb3N0KFRUSTo6U2h1ZmZsZUtpbmQgS2luZCwgVHlwZSAqVHAsIGludCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqU3ViVHApIHsKKyAgICBpZiAoS2luZCA9PSBUVEk6OlNLX0FsdGVybmF0ZSB8fCBLaW5kID09IFRUSTo6U0tfUGVybXV0ZVR3b1NyYyB8fAorICAgICAgICBLaW5kID09IFRUSTo6U0tfUGVybXV0ZVNpbmdsZVNyYykgeworICAgICAgcmV0dXJuIGdldFBlcm11dGVTaHVmZmxlT3ZlcmhlYWQoVHApOworICAgIH0KKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHVuc2lnbmVkIGdldENhc3RJbnN0ckNvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpEc3QsIFR5cGUgKlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqSSA9IG51bGxwdHIpIHsKKyAgICBjb25zdCBUYXJnZXRMb3dlcmluZ0Jhc2UgKlRMSSA9IGdldFRMSSgpOworICAgIGludCBJU0QgPSBUTEktPkluc3RydWN0aW9uT3Bjb2RlVG9JU0QoT3Bjb2RlKTsKKyAgICBhc3NlcnQoSVNEICYmICJJbnZhbGlkIG9wY29kZSIpOworICAgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgTVZUPiBTcmNMVCA9IFRMSS0+Z2V0VHlwZUxlZ2FsaXphdGlvbkNvc3QoREwsIFNyYyk7CisgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCBNVlQ+IERzdExUID0gVExJLT5nZXRUeXBlTGVnYWxpemF0aW9uQ29zdChETCwgRHN0KTsKKworICAgIC8vIENoZWNrIGZvciBOT09QIGNvbnZlcnNpb25zLgorICAgIGlmIChTcmNMVC5maXJzdCA9PSBEc3RMVC5maXJzdCAmJgorICAgICAgICBTcmNMVC5zZWNvbmQuZ2V0U2l6ZUluQml0cygpID09IERzdExULnNlY29uZC5nZXRTaXplSW5CaXRzKCkpIHsKKworICAgICAgLy8gQml0Y2FzdCBiZXR3ZWVuIHR5cGVzIHRoYXQgYXJlIGxlZ2FsaXplZCB0byB0aGUgc2FtZSB0eXBlIGFyZSBmcmVlLgorICAgICAgaWYgKE9wY29kZSA9PSBJbnN0cnVjdGlvbjo6Qml0Q2FzdCB8fCBPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246OlRydW5jKQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICBpZiAoT3Bjb2RlID09IEluc3RydWN0aW9uOjpUcnVuYyAmJgorICAgICAgICBUTEktPmlzVHJ1bmNhdGVGcmVlKFNyY0xULnNlY29uZCwgRHN0TFQuc2Vjb25kKSkKKyAgICAgIHJldHVybiAwOworCisgICAgaWYgKE9wY29kZSA9PSBJbnN0cnVjdGlvbjo6WkV4dCAmJgorICAgICAgICBUTEktPmlzWkV4dEZyZWUoU3JjTFQuc2Vjb25kLCBEc3RMVC5zZWNvbmQpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBpZiAoT3Bjb2RlID09IEluc3RydWN0aW9uOjpBZGRyU3BhY2VDYXN0ICYmCisgICAgICAgIFRMSS0+aXNOb29wQWRkclNwYWNlQ2FzdChTcmMtPmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERzdC0+Z2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpKSkKKyAgICAgIHJldHVybiAwOworCisgICAgLy8gSWYgdGhpcyBpcyBhIHpleHQvc2V4dCBvZiBhIGxvYWQsIHJldHVybiAwIGlmIHRoZSBjb3JyZXNwb25kaW5nCisgICAgLy8gZXh0ZW5kaW5nIGxvYWQgZXhpc3RzIG9uIHRhcmdldC4KKyAgICBpZiAoKE9wY29kZSA9PSBJbnN0cnVjdGlvbjo6WkV4dCB8fCBPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246OlNFeHQpICYmCisgICAgICAgIEkgJiYgaXNhPExvYWRJbnN0PihJLT5nZXRPcGVyYW5kKDApKSkgeworICAgICAgICBFVlQgRXh0VlQgPSBFVlQ6OmdldEVWVChEc3QpOworICAgICAgICBFVlQgTG9hZFZUID0gRVZUOjpnZXRFVlQoU3JjKTsKKyAgICAgICAgdW5zaWduZWQgTFR5cGUgPQorICAgICAgICAgICgoT3Bjb2RlID09IEluc3RydWN0aW9uOjpaRXh0KSA/IElTRDo6WkVYVExPQUQgOiBJU0Q6OlNFWFRMT0FEKTsKKyAgICAgICAgaWYgKFRMSS0+aXNMb2FkRXh0TGVnYWwoTFR5cGUsIEV4dFZULCBMb2FkVlQpKQorICAgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vIElmIHRoZSBjYXN0IGlzIG1hcmtlZCBhcyBsZWdhbCAob3IgcHJvbW90ZSkgdGhlbiBhc3N1bWUgbG93IGNvc3QuCisgICAgaWYgKFNyY0xULmZpcnN0ID09IERzdExULmZpcnN0ICYmCisgICAgICAgIFRMSS0+aXNPcGVyYXRpb25MZWdhbE9yUHJvbW90ZShJU0QsIERzdExULnNlY29uZCkpCisgICAgICByZXR1cm4gMTsKKworICAgIC8vIEhhbmRsZSBzY2FsYXIgY29udmVyc2lvbnMuCisgICAgaWYgKCFTcmMtPmlzVmVjdG9yVHkoKSAmJiAhRHN0LT5pc1ZlY3RvclR5KCkpIHsKKyAgICAgIC8vIFNjYWxhciBiaXRjYXN0cyBhcmUgdXN1YWxseSBmcmVlLgorICAgICAgaWYgKE9wY29kZSA9PSBJbnN0cnVjdGlvbjo6Qml0Q2FzdCkKKyAgICAgICAgcmV0dXJuIDA7CisKKyAgICAgIC8vIEp1c3QgY2hlY2sgdGhlIG9wIGNvc3QuIElmIHRoZSBvcGVyYXRpb24gaXMgbGVnYWwgdGhlbiBhc3N1bWUgaXQgY29zdHMKKyAgICAgIC8vIDEuCisgICAgICBpZiAoIVRMSS0+aXNPcGVyYXRpb25FeHBhbmQoSVNELCBEc3RMVC5zZWNvbmQpKQorICAgICAgICByZXR1cm4gMTsKKworICAgICAgLy8gQXNzdW1lIHRoYXQgaWxsZWdhbCBzY2FsYXIgaW5zdHJ1Y3Rpb24gYXJlIGV4cGVuc2l2ZS4KKyAgICAgIHJldHVybiA0OworICAgIH0KKworICAgIC8vIENoZWNrIHZlY3Rvci10by12ZWN0b3IgY2FzdHMuCisgICAgaWYgKERzdC0+aXNWZWN0b3JUeSgpICYmIFNyYy0+aXNWZWN0b3JUeSgpKSB7CisgICAgICAvLyBJZiB0aGUgY2FzdCBpcyBiZXR3ZWVuIHNhbWUtc2l6ZWQgcmVnaXN0ZXJzLCB0aGVuIHRoZSBjaGVjayBpcyBzaW1wbGUuCisgICAgICBpZiAoU3JjTFQuZmlyc3QgPT0gRHN0TFQuZmlyc3QgJiYKKyAgICAgICAgICBTcmNMVC5zZWNvbmQuZ2V0U2l6ZUluQml0cygpID09IERzdExULnNlY29uZC5nZXRTaXplSW5CaXRzKCkpIHsKKworICAgICAgICAvLyBBc3N1bWUgdGhhdCBaZXh0IGlzIGRvbmUgdXNpbmcgQU5ELgorICAgICAgICBpZiAoT3Bjb2RlID09IEluc3RydWN0aW9uOjpaRXh0KQorICAgICAgICAgIHJldHVybiAxOworCisgICAgICAgIC8vIEFzc3VtZSB0aGF0IHNleHQgaXMgZG9uZSB1c2luZyBTSEwgYW5kIFNSQS4KKyAgICAgICAgaWYgKE9wY29kZSA9PSBJbnN0cnVjdGlvbjo6U0V4dCkKKyAgICAgICAgICByZXR1cm4gMjsKKworICAgICAgICAvLyBKdXN0IGNoZWNrIHRoZSBvcCBjb3N0LiBJZiB0aGUgb3BlcmF0aW9uIGlzIGxlZ2FsIHRoZW4gYXNzdW1lIGl0CisgICAgICAgIC8vIGNvc3RzCisgICAgICAgIC8vIDEgYW5kIG11bHRpcGx5IGJ5IHRoZSB0eXBlLWxlZ2FsaXphdGlvbiBvdmVyaGVhZC4KKyAgICAgICAgaWYgKCFUTEktPmlzT3BlcmF0aW9uRXhwYW5kKElTRCwgRHN0TFQuc2Vjb25kKSkKKyAgICAgICAgICByZXR1cm4gU3JjTFQuZmlyc3QgKiAxOworICAgICAgfQorCisgICAgICAvLyBJZiB3ZSBhcmUgbGVnYWxpemluZyBieSBzcGxpdHRpbmcsIHF1ZXJ5IHRoZSBjb25jcmV0ZSBUVEkgZm9yIHRoZSBjb3N0CisgICAgICAvLyBvZiBjYXN0aW5nIHRoZSBvcmlnaW5hbCB2ZWN0b3IgdHdpY2UuIFdlIGFsc28gbmVlZCB0byBmYWN0b3IgaW4gdGhlCisgICAgICAvLyBjb3N0IG9mIHRoZSBzcGxpdCBpdHNlbGYuIENvdW50IHRoYXQgYXMgMSwgdG8gYmUgY29uc2lzdGVudCB3aXRoCisgICAgICAvLyBUTEktPmdldFR5cGVMZWdhbGl6YXRpb25Db3N0KCkuCisgICAgICBpZiAoKFRMSS0+Z2V0VHlwZUFjdGlvbihTcmMtPmdldENvbnRleHQoKSwgVExJLT5nZXRWYWx1ZVR5cGUoREwsIFNyYykpID09CisgICAgICAgICAgIFRhcmdldExvd2VyaW5nOjpUeXBlU3BsaXRWZWN0b3IpIHx8CisgICAgICAgICAgKFRMSS0+Z2V0VHlwZUFjdGlvbihEc3QtPmdldENvbnRleHQoKSwgVExJLT5nZXRWYWx1ZVR5cGUoREwsIERzdCkpID09CisgICAgICAgICAgIFRhcmdldExvd2VyaW5nOjpUeXBlU3BsaXRWZWN0b3IpKSB7CisgICAgICAgIFR5cGUgKlNwbGl0RHN0ID0gVmVjdG9yVHlwZTo6Z2V0KERzdC0+Z2V0VmVjdG9yRWxlbWVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHN0LT5nZXRWZWN0b3JOdW1FbGVtZW50cygpIC8gMik7CisgICAgICAgIFR5cGUgKlNwbGl0U3JjID0gVmVjdG9yVHlwZTo6Z2V0KFNyYy0+Z2V0VmVjdG9yRWxlbWVudFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjLT5nZXRWZWN0b3JOdW1FbGVtZW50cygpIC8gMik7CisgICAgICAgIFQgKlRUSSA9IHN0YXRpY19jYXN0PFQgKj4odGhpcyk7CisgICAgICAgIHJldHVybiBUVEktPmdldFZlY3RvclNwbGl0Q29zdCgpICsKKyAgICAgICAgICAgICAgICgyICogVFRJLT5nZXRDYXN0SW5zdHJDb3N0KE9wY29kZSwgU3BsaXREc3QsIFNwbGl0U3JjLCBJKSk7CisgICAgICB9CisKKyAgICAgIC8vIEluIG90aGVyIGNhc2VzIHdoZXJlIHRoZSBzb3VyY2Ugb3IgZGVzdGluYXRpb24gYXJlIGlsbGVnYWwsIGFzc3VtZQorICAgICAgLy8gdGhlIG9wZXJhdGlvbiB3aWxsIGdldCBzY2FsYXJpemVkLgorICAgICAgdW5zaWduZWQgTnVtID0gRHN0LT5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICAgICAgdW5zaWduZWQgQ29zdCA9IHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmdldENhc3RJbnN0ckNvc3QoCisgICAgICAgICAgT3Bjb2RlLCBEc3QtPmdldFNjYWxhclR5cGUoKSwgU3JjLT5nZXRTY2FsYXJUeXBlKCksIEkpOworCisgICAgICAvLyBSZXR1cm4gdGhlIGNvc3Qgb2YgbXVsdGlwbGUgc2NhbGFyIGludm9jYXRpb24gcGx1cyB0aGUgY29zdCBvZgorICAgICAgLy8gaW5zZXJ0aW5nIGFuZCBleHRyYWN0aW5nIHRoZSB2YWx1ZXMuCisgICAgICByZXR1cm4gZ2V0U2NhbGFyaXphdGlvbk92ZXJoZWFkKERzdCwgdHJ1ZSwgdHJ1ZSkgKyBOdW0gKiBDb3N0OworICAgIH0KKworICAgIC8vIFdlIGFscmVhZHkgaGFuZGxlZCB2ZWN0b3ItdG8tdmVjdG9yIGFuZCBzY2FsYXItdG8tc2NhbGFyIGNvbnZlcnNpb25zLgorICAgIC8vIFRoaXMKKyAgICAvLyBpcyB3aGVyZSB3ZSBoYW5kbGUgYml0Y2FzdCBiZXR3ZWVuIHZlY3RvcnMgYW5kIHNjYWxhcnMuIFdlIG5lZWQgdG8gYXNzdW1lCisgICAgLy8gIHRoYXQgdGhlIGNvbnZlcnNpb24gaXMgc2NhbGFyaXplZCBpbiBvbmUgd2F5IG9yIGFub3RoZXIuCisgICAgaWYgKE9wY29kZSA9PSBJbnN0cnVjdGlvbjo6Qml0Q2FzdCkKKyAgICAgIC8vIElsbGVnYWwgYml0Y2FzdHMgYXJlIGRvbmUgYnkgc3RvcmluZyBhbmQgbG9hZGluZyBmcm9tIGEgc3RhY2sgc2xvdC4KKyAgICAgIHJldHVybiAoU3JjLT5pc1ZlY3RvclR5KCkgPyBnZXRTY2FsYXJpemF0aW9uT3ZlcmhlYWQoU3JjLCBmYWxzZSwgdHJ1ZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAwKSArCisgICAgICAgICAgICAgKERzdC0+aXNWZWN0b3JUeSgpID8gZ2V0U2NhbGFyaXphdGlvbk92ZXJoZWFkKERzdCwgdHJ1ZSwgZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogMCk7CisKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmhhbmRsZWQgY2FzdCIpOworICB9CisKKyAgdW5zaWduZWQgZ2V0RXh0cmFjdFdpdGhFeHRlbmRDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqRHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjdG9yVHlwZSAqVmVjVHksIHVuc2lnbmVkIEluZGV4KSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmdldFZlY3Rvckluc3RyQ29zdCgKKyAgICAgICAgICAgICAgIEluc3RydWN0aW9uOjpFeHRyYWN0RWxlbWVudCwgVmVjVHksIEluZGV4KSArCisgICAgICAgICAgIHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmdldENhc3RJbnN0ckNvc3QoT3Bjb2RlLCBEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVjVHktPmdldEVsZW1lbnRUeXBlKCkpOworICB9CisKKyAgdW5zaWduZWQgZ2V0Q0ZJbnN0ckNvc3QodW5zaWduZWQgT3Bjb2RlKSB7CisgICAgLy8gQnJhbmNoZXMgYXJlIGFzc3VtZWQgdG8gYmUgcHJlZGljdGVkLgorICAgIHJldHVybiAwOworICB9CisKKyAgdW5zaWduZWQgZ2V0Q21wU2VsSW5zdHJDb3N0KHVuc2lnbmVkIE9wY29kZSwgVHlwZSAqVmFsVHksIFR5cGUgKkNvbmRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgY29uc3QgVGFyZ2V0TG93ZXJpbmdCYXNlICpUTEkgPSBnZXRUTEkoKTsKKyAgICBpbnQgSVNEID0gVExJLT5JbnN0cnVjdGlvbk9wY29kZVRvSVNEKE9wY29kZSk7CisgICAgYXNzZXJ0KElTRCAmJiAiSW52YWxpZCBvcGNvZGUiKTsKKworICAgIC8vIFNlbGVjdHMgb24gdmVjdG9ycyBhcmUgYWN0dWFsbHkgdmVjdG9yIHNlbGVjdHMuCisgICAgaWYgKElTRCA9PSBJU0Q6OlNFTEVDVCkgeworICAgICAgYXNzZXJ0KENvbmRUeSAmJiAiQ29uZFR5IG11c3QgZXhpc3QiKTsKKyAgICAgIGlmIChDb25kVHktPmlzVmVjdG9yVHkoKSkKKyAgICAgICAgSVNEID0gSVNEOjpWU0VMRUNUOworICAgIH0KKyAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIE1WVD4gTFQgPSBUTEktPmdldFR5cGVMZWdhbGl6YXRpb25Db3N0KERMLCBWYWxUeSk7CisKKyAgICBpZiAoIShWYWxUeS0+aXNWZWN0b3JUeSgpICYmICFMVC5zZWNvbmQuaXNWZWN0b3IoKSkgJiYKKyAgICAgICAgIVRMSS0+aXNPcGVyYXRpb25FeHBhbmQoSVNELCBMVC5zZWNvbmQpKSB7CisgICAgICAvLyBUaGUgb3BlcmF0aW9uIGlzIGxlZ2FsLiBBc3N1bWUgaXQgY29zdHMgMS4gTXVsdGlwbHkKKyAgICAgIC8vIGJ5IHRoZSB0eXBlLWxlZ2FsaXphdGlvbiBvdmVyaGVhZC4KKyAgICAgIHJldHVybiBMVC5maXJzdCAqIDE7CisgICAgfQorCisgICAgLy8gT3RoZXJ3aXNlLCBhc3N1bWUgdGhhdCB0aGUgY2FzdCBpcyBzY2FsYXJpemVkLgorICAgIC8vIFRPRE86IElmIG9uZSBvZiB0aGUgdHlwZXMgZ2V0IGxlZ2FsaXplZCBieSBzcGxpdHRpbmcsIGhhbmRsZSB0aGlzCisgICAgLy8gc2ltaWxhcmx5IHRvIHdoYXQgZ2V0Q2FzdEluc3RyQ29zdCgpIGRvZXMuCisgICAgaWYgKFZhbFR5LT5pc1ZlY3RvclR5KCkpIHsKKyAgICAgIHVuc2lnbmVkIE51bSA9IFZhbFR5LT5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICAgICAgaWYgKENvbmRUeSkKKyAgICAgICAgQ29uZFR5ID0gQ29uZFR5LT5nZXRTY2FsYXJUeXBlKCk7CisgICAgICB1bnNpZ25lZCBDb3N0ID0gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+Z2V0Q21wU2VsSW5zdHJDb3N0KAorICAgICAgICAgIE9wY29kZSwgVmFsVHktPmdldFNjYWxhclR5cGUoKSwgQ29uZFR5LCBJKTsKKworICAgICAgLy8gUmV0dXJuIHRoZSBjb3N0IG9mIG11bHRpcGxlIHNjYWxhciBpbnZvY2F0aW9uIHBsdXMgdGhlIGNvc3Qgb2YKKyAgICAgIC8vIGluc2VydGluZyBhbmQgZXh0cmFjdGluZyB0aGUgdmFsdWVzLgorICAgICAgcmV0dXJuIGdldFNjYWxhcml6YXRpb25PdmVyaGVhZChWYWxUeSwgdHJ1ZSwgZmFsc2UpICsgTnVtICogQ29zdDsKKyAgICB9CisKKyAgICAvLyBVbmtub3duIHNjYWxhciBvcGNvZGUuCisgICAgcmV0dXJuIDE7CisgIH0KKworICB1bnNpZ25lZCBnZXRWZWN0b3JJbnN0ckNvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpWYWwsIHVuc2lnbmVkIEluZGV4KSB7CisgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCBNVlQ+IExUID0KKyAgICAgICAgZ2V0VExJKCktPmdldFR5cGVMZWdhbGl6YXRpb25Db3N0KERMLCBWYWwtPmdldFNjYWxhclR5cGUoKSk7CisKKyAgICByZXR1cm4gTFQuZmlyc3Q7CisgIH0KKworICB1bnNpZ25lZCBnZXRNZW1vcnlPcENvc3QodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpTcmMsIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkcmVzc1NwYWNlLCBjb25zdCBJbnN0cnVjdGlvbiAqSSA9IG51bGxwdHIpIHsKKyAgICBhc3NlcnQoIVNyYy0+aXNWb2lkVHkoKSAmJiAiSW52YWxpZCB0eXBlIik7CisgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCBNVlQ+IExUID0gZ2V0VExJKCktPmdldFR5cGVMZWdhbGl6YXRpb25Db3N0KERMLCBTcmMpOworCisgICAgLy8gQXNzdW1pbmcgdGhhdCBhbGwgbG9hZHMgb2YgbGVnYWwgdHlwZXMgY29zdCAxLgorICAgIHVuc2lnbmVkIENvc3QgPSBMVC5maXJzdDsKKworICAgIGlmIChTcmMtPmlzVmVjdG9yVHkoKSAmJgorICAgICAgICBTcmMtPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKSA8IExULnNlY29uZC5nZXRTaXplSW5CaXRzKCkpIHsKKyAgICAgIC8vIFRoaXMgaXMgYSB2ZWN0b3IgbG9hZCB0aGF0IGxlZ2FsaXplcyB0byBhIGxhcmdlciB0eXBlIHRoYW4gdGhlIHZlY3RvcgorICAgICAgLy8gaXRzZWxmLiBVbmxlc3MgdGhlIGNvcnJlc3BvbmRpbmcgZXh0ZW5kaW5nIGxvYWQgb3IgdHJ1bmNhdGluZyBzdG9yZSBpcworICAgICAgLy8gbGVnYWwsIHRoZW4gdGhpcyB3aWxsIHNjYWxhcml6ZS4KKyAgICAgIFRhcmdldExvd2VyaW5nOjpMZWdhbGl6ZUFjdGlvbiBMQSA9IFRhcmdldExvd2VyaW5nOjpFeHBhbmQ7CisgICAgICBFVlQgTWVtVlQgPSBnZXRUTEkoKS0+Z2V0VmFsdWVUeXBlKERMLCBTcmMpOworICAgICAgaWYgKE9wY29kZSA9PSBJbnN0cnVjdGlvbjo6U3RvcmUpCisgICAgICAgIExBID0gZ2V0VExJKCktPmdldFRydW5jU3RvcmVBY3Rpb24oTFQuc2Vjb25kLCBNZW1WVCk7CisgICAgICBlbHNlCisgICAgICAgIExBID0gZ2V0VExJKCktPmdldExvYWRFeHRBY3Rpb24oSVNEOjpFWFRMT0FELCBMVC5zZWNvbmQsIE1lbVZUKTsKKworICAgICAgaWYgKExBICE9IFRhcmdldExvd2VyaW5nOjpMZWdhbCAmJiBMQSAhPSBUYXJnZXRMb3dlcmluZzo6Q3VzdG9tKSB7CisgICAgICAgIC8vIFRoaXMgaXMgYSB2ZWN0b3IgbG9hZC9zdG9yZSBmb3Igc29tZSBpbGxlZ2FsIHR5cGUgdGhhdCBpcyBzY2FsYXJpemVkLgorICAgICAgICAvLyBXZSBtdXN0IGFjY291bnQgZm9yIHRoZSBjb3N0IG9mIGJ1aWxkaW5nIG9yIGRlY29tcG9zaW5nIHRoZSB2ZWN0b3IuCisgICAgICAgIENvc3QgKz0gZ2V0U2NhbGFyaXphdGlvbk92ZXJoZWFkKFNyYywgT3Bjb2RlICE9IEluc3RydWN0aW9uOjpTdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3Bjb2RlID09IEluc3RydWN0aW9uOjpTdG9yZSk7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIENvc3Q7CisgIH0KKworICB1bnNpZ25lZCBnZXRJbnRlcmxlYXZlZE1lbW9yeU9wQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlZlY1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGYWN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSkgeworICAgIFZlY3RvclR5cGUgKlZUID0gZHluX2Nhc3Q8VmVjdG9yVHlwZT4oVmVjVHkpOworICAgIGFzc2VydChWVCAmJiAiRXhwZWN0IGEgdmVjdG9yIHR5cGUgZm9yIGludGVybGVhdmVkIG1lbW9yeSBvcCIpOworCisgICAgdW5zaWduZWQgTnVtRWx0cyA9IFZULT5nZXROdW1FbGVtZW50cygpOworICAgIGFzc2VydChGYWN0b3IgPiAxICYmIE51bUVsdHMgJSBGYWN0b3IgPT0gMCAmJiAiSW52YWxpZCBpbnRlcmxlYXZlIGZhY3RvciIpOworCisgICAgdW5zaWduZWQgTnVtU3ViRWx0cyA9IE51bUVsdHMgLyBGYWN0b3I7CisgICAgVmVjdG9yVHlwZSAqU3ViVlQgPSBWZWN0b3JUeXBlOjpnZXQoVlQtPmdldEVsZW1lbnRUeXBlKCksIE51bVN1YkVsdHMpOworCisgICAgLy8gRmlyc3RseSwgdGhlIGNvc3Qgb2YgbG9hZC9zdG9yZSBvcGVyYXRpb24uCisgICAgdW5zaWduZWQgQ29zdCA9IHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmdldE1lbW9yeU9wQ29zdCgKKyAgICAgICAgT3Bjb2RlLCBWZWNUeSwgQWxpZ25tZW50LCBBZGRyZXNzU3BhY2UpOworCisgICAgLy8gTGVnYWxpemUgdGhlIHZlY3RvciB0eXBlLCBhbmQgZ2V0IHRoZSBsZWdhbGl6ZWQgYW5kIHVubGVnYWxpemVkIHR5cGUKKyAgICAvLyBzaXplcy4KKyAgICBNVlQgVmVjVHlMVCA9IGdldFRMSSgpLT5nZXRUeXBlTGVnYWxpemF0aW9uQ29zdChETCwgVmVjVHkpLnNlY29uZDsKKyAgICB1bnNpZ25lZCBWZWNUeVNpemUgPQorICAgICAgICBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXREYXRhTGF5b3V0KCkuZ2V0VHlwZVN0b3JlU2l6ZShWZWNUeSk7CisgICAgdW5zaWduZWQgVmVjVHlMVFNpemUgPSBWZWNUeUxULmdldFN0b3JlU2l6ZSgpOworCisgICAgLy8gUmV0dXJuIHRoZSBjZWlsaW5nIG9mIGRpdmlkaW5nIEEgYnkgQi4KKyAgICBhdXRvIGNlaWwgPSBbXSh1bnNpZ25lZCBBLCB1bnNpZ25lZCBCKSB7IHJldHVybiAoQSArIEIgLSAxKSAvIEI7IH07CisKKyAgICAvLyBTY2FsZSB0aGUgY29zdCBvZiB0aGUgbWVtb3J5IG9wZXJhdGlvbiBieSB0aGUgZnJhY3Rpb24gb2YgbGVnYWxpemVkCisgICAgLy8gaW5zdHJ1Y3Rpb25zIHRoYXQgd2lsbCBhY3R1YWxseSBiZSB1c2VkLiBXZSBzaG91bGRuJ3QgYWNjb3VudCBmb3IgdGhlCisgICAgLy8gY29zdCBvZiBkZWFkIGluc3RydWN0aW9ucyBzaW5jZSB0aGV5IHdpbGwgYmUgcmVtb3ZlZC4KKyAgICAvLworICAgIC8vIEUuZy4sIEFuIGludGVybGVhdmVkIGxvYWQgb2YgZmFjdG9yIDg6CisgICAgLy8gICAgICAgJXZlYyA9IGxvYWQgPDE2IHggaTY0PiwgPDE2IHggaTY0PiogJXB0cgorICAgIC8vICAgICAgICV2MCA9IHNodWZmbGV2ZWN0b3IgJXZlYywgdW5kZWYsIDwwLCA4PgorICAgIC8vCisgICAgLy8gSWYgPDE2IHggaTY0PiBpcyBsZWdhbGl6ZWQgdG8gOCB2Mmk2NCBsb2Fkcywgb25seSAyIG9mIHRoZSBsb2FkcyB3aWxsIGJlCisgICAgLy8gdXNlZCAodGhvc2UgY29ycmVzcG9uZGluZyB0byBlbGVtZW50cyBbMDoxXSBhbmQgWzg6OV0gb2YgdGhlIHVubGVnYWxpemVkCisgICAgLy8gdHlwZSkuIFRoZSBvdGhlciBsb2FkcyBhcmUgdW51c2VkLgorICAgIC8vCisgICAgLy8gV2Ugb25seSBzY2FsZSB0aGUgY29zdCBvZiBsb2FkcyBzaW5jZSBpbnRlcmxlYXZlZCBzdG9yZSBncm91cHMgYXJlbid0CisgICAgLy8gYWxsb3dlZCB0byBoYXZlIGdhcHMuCisgICAgaWYgKE9wY29kZSA9PSBJbnN0cnVjdGlvbjo6TG9hZCAmJiBWZWNUeVNpemUgPiBWZWNUeUxUU2l6ZSkgeworICAgICAgLy8gVGhlIG51bWJlciBvZiBsb2FkcyBvZiBhIGxlZ2FsIHR5cGUgaXQgd2lsbCB0YWtlIHRvIHJlcHJlc2VudCBhIGxvYWQKKyAgICAgIC8vIG9mIHRoZSB1bmxlZ2FsaXplZCB2ZWN0b3IgdHlwZS4KKyAgICAgIHVuc2lnbmVkIE51bUxlZ2FsSW5zdHMgPSBjZWlsKFZlY1R5U2l6ZSwgVmVjVHlMVFNpemUpOworCisgICAgICAvLyBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHRoZSB1bmxlZ2FsaXplZCB0eXBlIHRoYXQgY29ycmVzcG9uZCB0byBhCisgICAgICAvLyBzaW5nbGUgbGVnYWwgaW5zdHJ1Y3Rpb24uCisgICAgICB1bnNpZ25lZCBOdW1FbHRzUGVyTGVnYWxJbnN0ID0gY2VpbChOdW1FbHRzLCBOdW1MZWdhbEluc3RzKTsKKworICAgICAgLy8gRGV0ZXJtaW5lIHdoaWNoIGxlZ2FsIGluc3RydWN0aW9ucyB3aWxsIGJlIHVzZWQuCisgICAgICBCaXRWZWN0b3IgVXNlZEluc3RzKE51bUxlZ2FsSW5zdHMsIGZhbHNlKTsKKyAgICAgIGZvciAodW5zaWduZWQgSW5kZXggOiBJbmRpY2VzKQorICAgICAgICBmb3IgKHVuc2lnbmVkIEVsdCA9IDA7IEVsdCA8IE51bVN1YkVsdHM7ICsrRWx0KQorICAgICAgICAgIFVzZWRJbnN0cy5zZXQoKEluZGV4ICsgRWx0ICogRmFjdG9yKSAvIE51bUVsdHNQZXJMZWdhbEluc3QpOworCisgICAgICAvLyBTY2FsZSB0aGUgY29zdCBvZiB0aGUgbG9hZCBieSB0aGUgZnJhY3Rpb24gb2YgbGVnYWwgaW5zdHJ1Y3Rpb25zIHRoYXQKKyAgICAgIC8vIHdpbGwgYmUgdXNlZC4KKyAgICAgIENvc3QgKj0gVXNlZEluc3RzLmNvdW50KCkgLyBOdW1MZWdhbEluc3RzOworICAgIH0KKworICAgIC8vIFRoZW4gcGx1cyB0aGUgY29zdCBvZiBpbnRlcmxlYXZlIG9wZXJhdGlvbi4KKyAgICBpZiAoT3Bjb2RlID09IEluc3RydWN0aW9uOjpMb2FkKSB7CisgICAgICAvLyBUaGUgaW50ZXJsZWF2ZSBjb3N0IGlzIHNpbWlsYXIgdG8gZXh0cmFjdCBzdWIgdmVjdG9ycycgZWxlbWVudHMKKyAgICAgIC8vIGZyb20gdGhlIHdpZGUgdmVjdG9yLCBhbmQgaW5zZXJ0IHRoZW0gaW50byBzdWIgdmVjdG9ycy4KKyAgICAgIC8vCisgICAgICAvLyBFLmcuIEFuIGludGVybGVhdmVkIGxvYWQgb2YgZmFjdG9yIDIgKHdpdGggb25lIG1lbWJlciBvZiBpbmRleCAwKToKKyAgICAgIC8vICAgICAgJXZlYyA9IGxvYWQgPDggeCBpMzI+LCA8OCB4IGkzMj4qICVwdHIKKyAgICAgIC8vICAgICAgJXYwID0gc2h1ZmZsZSAldmVjLCB1bmRlZiwgPDAsIDIsIDQsIDY+ICAgICAgICAgOyBJbmRleCAwCisgICAgICAvLyBUaGUgY29zdCBpcyBlc3RpbWF0ZWQgYXMgZXh0cmFjdCBlbGVtZW50cyBhdCAwLCAyLCA0LCA2IGZyb20gdGhlCisgICAgICAvLyA8OCB4IGkzMj4gdmVjdG9yIGFuZCBpbnNlcnQgdGhlbSBpbnRvIGEgPDQgeCBpMzI+IHZlY3Rvci4KKworICAgICAgYXNzZXJ0KEluZGljZXMuc2l6ZSgpIDw9IEZhY3RvciAmJgorICAgICAgICAgICAgICJJbnRlcmxlYXZlZCBtZW1vcnkgb3AgaGFzIHRvbyBtYW55IG1lbWJlcnMiKTsKKworICAgICAgZm9yICh1bnNpZ25lZCBJbmRleCA6IEluZGljZXMpIHsKKyAgICAgICAgYXNzZXJ0KEluZGV4IDwgRmFjdG9yICYmICJJbnZhbGlkIGluZGV4IGZvciBpbnRlcmxlYXZlZCBtZW1vcnkgb3AiKTsKKworICAgICAgICAvLyBFeHRyYWN0IGVsZW1lbnRzIGZyb20gbG9hZGVkIHZlY3RvciBmb3IgZWFjaCBzdWIgdmVjdG9yLgorICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgTnVtU3ViRWx0czsgaSsrKQorICAgICAgICAgIENvc3QgKz0gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+Z2V0VmVjdG9ySW5zdHJDb3N0KAorICAgICAgICAgICAgICBJbnN0cnVjdGlvbjo6RXh0cmFjdEVsZW1lbnQsIFZULCBJbmRleCArIGkgKiBGYWN0b3IpOworICAgICAgfQorCisgICAgICB1bnNpZ25lZCBJbnNTdWJDb3N0ID0gMDsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1TdWJFbHRzOyBpKyspCisgICAgICAgIEluc1N1YkNvc3QgKz0gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+Z2V0VmVjdG9ySW5zdHJDb3N0KAorICAgICAgICAgICAgSW5zdHJ1Y3Rpb246Okluc2VydEVsZW1lbnQsIFN1YlZULCBpKTsKKworICAgICAgQ29zdCArPSBJbmRpY2VzLnNpemUoKSAqIEluc1N1YkNvc3Q7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRoZSBpbnRlcmxlYXZlIGNvc3QgaXMgZXh0cmFjdCBhbGwgZWxlbWVudHMgZnJvbSBzdWIgdmVjdG9ycywgYW5kCisgICAgICAvLyBpbnNlcnQgdGhlbSBpbnRvIHRoZSB3aWRlIHZlY3Rvci4KKyAgICAgIC8vCisgICAgICAvLyBFLmcuIEFuIGludGVybGVhdmVkIHN0b3JlIG9mIGZhY3RvciAyOgorICAgICAgLy8gICAgICAldjBfdjEgPSBzaHVmZmxlICV2MCwgJXYxLCA8MCwgNCwgMSwgNSwgMiwgNiwgMywgNz4KKyAgICAgIC8vICAgICAgc3RvcmUgPDggeCBpMzI+ICVpbnRlcmxlYXZlZC52ZWMsIDw4IHggaTMyPiogJXB0cgorICAgICAgLy8gVGhlIGNvc3QgaXMgZXN0aW1hdGVkIGFzIGV4dHJhY3QgYWxsIGVsZW1lbnRzIGZyb20gYm90aCA8NCB4IGkzMj4KKyAgICAgIC8vIHZlY3RvcnMgYW5kIGluc2VydCBpbnRvIHRoZSA8OCB4IGkzMj4gdmVjdG9yLgorCisgICAgICB1bnNpZ25lZCBFeHRTdWJDb3N0ID0gMDsKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1TdWJFbHRzOyBpKyspCisgICAgICAgIEV4dFN1YkNvc3QgKz0gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+Z2V0VmVjdG9ySW5zdHJDb3N0KAorICAgICAgICAgICAgSW5zdHJ1Y3Rpb246OkV4dHJhY3RFbGVtZW50LCBTdWJWVCwgaSk7CisgICAgICBDb3N0ICs9IEV4dFN1YkNvc3QgKiBGYWN0b3I7CisKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW1FbHRzOyBpKyspCisgICAgICAgIENvc3QgKz0gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKQorICAgICAgICAgICAgICAgICAgICAtPmdldFZlY3Rvckluc3RyQ29zdChJbnN0cnVjdGlvbjo6SW5zZXJ0RWxlbWVudCwgVlQsIGkpOworICAgIH0KKworICAgIHJldHVybiBDb3N0OworICB9CisKKyAgLy8vIEdldCBpbnRyaW5zaWMgY29zdCBiYXNlZCBvbiBhcmd1bWVudHMuCisgIHVuc2lnbmVkIGdldEludHJpbnNpY0luc3RyQ29zdChJbnRyaW5zaWM6OklEIElJRCwgVHlwZSAqUmV0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLCBGYXN0TWF0aEZsYWdzIEZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZGID0gMSkgeworICAgIHVuc2lnbmVkIFJldFZGID0gKFJldFR5LT5pc1ZlY3RvclR5KCkgPyBSZXRUeS0+Z2V0VmVjdG9yTnVtRWxlbWVudHMoKSA6IDEpOworICAgIGFzc2VydCgoUmV0VkYgPT0gMSB8fCBWRiA9PSAxKSAmJiAiVkYgPiAxIGFuZCBSZXRWRiBpcyBhIHZlY3RvciB0eXBlIik7CisKKyAgICBzd2l0Y2ggKElJRCkgeworICAgIGRlZmF1bHQ6IHsKKyAgICAgIC8vIEFzc3VtZSB0aGF0IHdlIG5lZWQgdG8gc2NhbGFyaXplIHRoaXMgaW50cmluc2ljLgorICAgICAgU21hbGxWZWN0b3I8VHlwZSAqLCA0PiBUeXBlczsKKyAgICAgIGZvciAoVmFsdWUgKk9wIDogQXJncykgeworICAgICAgICBUeXBlICpPcFR5ID0gT3AtPmdldFR5cGUoKTsKKyAgICAgICAgYXNzZXJ0KFZGID09IDEgfHwgIU9wVHktPmlzVmVjdG9yVHkoKSk7CisgICAgICAgIFR5cGVzLnB1c2hfYmFjayhWRiA9PSAxID8gT3BUeSA6IFZlY3RvclR5cGU6OmdldChPcFR5LCBWRikpOworICAgICAgfQorCisgICAgICBpZiAoVkYgPiAxICYmICFSZXRUeS0+aXNWb2lkVHkoKSkKKyAgICAgICAgUmV0VHkgPSBWZWN0b3JUeXBlOjpnZXQoUmV0VHksIFZGKTsKKworICAgICAgLy8gQ29tcHV0ZSB0aGUgc2NhbGFyaXphdGlvbiBvdmVyaGVhZCBiYXNlZCBvbiBBcmdzIGZvciBhIHZlY3RvcgorICAgICAgLy8gaW50cmluc2ljLiBBIHZlY3Rvcml6ZXIgd2lsbCBwYXNzIGEgc2NhbGFyIFJldFR5IGFuZCBWRiA+IDEsIHdoaWxlCisgICAgICAvLyBDb3N0TW9kZWwgd2lsbCBwYXNzIGEgdmVjdG9yIFJldFR5IGFuZCBWRiBpcyAxLgorICAgICAgdW5zaWduZWQgU2NhbGFyaXphdGlvbkNvc3QgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCk7CisgICAgICBpZiAoUmV0VkYgPiAxIHx8IFZGID4gMSkgeworICAgICAgICBTY2FsYXJpemF0aW9uQ29zdCA9IDA7CisgICAgICAgIGlmICghUmV0VHktPmlzVm9pZFR5KCkpCisgICAgICAgICAgU2NhbGFyaXphdGlvbkNvc3QgKz0gZ2V0U2NhbGFyaXphdGlvbk92ZXJoZWFkKFJldFR5LCB0cnVlLCBmYWxzZSk7CisgICAgICAgIFNjYWxhcml6YXRpb25Db3N0ICs9IGdldE9wZXJhbmRzU2NhbGFyaXphdGlvbk92ZXJoZWFkKEFyZ3MsIFZGKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4odGhpcyktPgorICAgICAgICBnZXRJbnRyaW5zaWNJbnN0ckNvc3QoSUlELCBSZXRUeSwgVHlwZXMsIEZNRiwgU2NhbGFyaXphdGlvbkNvc3QpOworICAgIH0KKyAgICBjYXNlIEludHJpbnNpYzo6bWFza2VkX3NjYXR0ZXI6IHsKKyAgICAgIGFzc2VydChWRiA9PSAxICYmICJDYW4ndCB2ZWN0b3JpemUgdHlwZXMgaGVyZS4iKTsKKyAgICAgIFZhbHVlICpNYXNrID0gQXJnc1szXTsKKyAgICAgIGJvb2wgVmFyTWFzayA9ICFpc2E8Q29uc3RhbnQ+KE1hc2spOworICAgICAgdW5zaWduZWQgQWxpZ25tZW50ID0gY2FzdDxDb25zdGFudEludD4oQXJnc1syXSktPmdldFpFeHRWYWx1ZSgpOworICAgICAgcmV0dXJuCisgICAgICAgIHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmdldEdhdGhlclNjYXR0ZXJPcENvc3QoSW5zdHJ1Y3Rpb246OlN0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ3NbMF0tPmdldFR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdzWzFdLCBWYXJNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWdubWVudCk7CisgICAgfQorICAgIGNhc2UgSW50cmluc2ljOjptYXNrZWRfZ2F0aGVyOiB7CisgICAgICBhc3NlcnQoVkYgPT0gMSAmJiAiQ2FuJ3QgdmVjdG9yaXplIHR5cGVzIGhlcmUuIik7CisgICAgICBWYWx1ZSAqTWFzayA9IEFyZ3NbMl07CisgICAgICBib29sIFZhck1hc2sgPSAhaXNhPENvbnN0YW50PihNYXNrKTsKKyAgICAgIHVuc2lnbmVkIEFsaWdubWVudCA9IGNhc3Q8Q29uc3RhbnRJbnQ+KEFyZ3NbMV0pLT5nZXRaRXh0VmFsdWUoKTsKKyAgICAgIHJldHVybgorICAgICAgICBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXRHYXRoZXJTY2F0dGVyT3BDb3N0KEluc3RydWN0aW9uOjpMb2FkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJldFR5LCBBcmdzWzBdLCBWYXJNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWdubWVudCk7CisgICAgfQorICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9hZGQ6CisgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX211bDoKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfYW5kOgorICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9vcjoKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfeG9yOgorICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9mYWRkOgorICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9mbXVsOgorICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9zbWF4OgorICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9zbWluOgorICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9mbWF4OgorICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9mbWluOgorICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV91bWF4OgorICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV91bWluOgorICAgICAgcmV0dXJuIGdldEludHJpbnNpY0luc3RyQ29zdChJSUQsIFJldFR5LCBBcmdzWzBdLT5nZXRUeXBlKCksIEZNRik7CisgICAgfQorICB9CisKKyAgLy8vIEdldCBpbnRyaW5zaWMgY29zdCBiYXNlZCBvbiBhcmd1bWVudCB0eXBlcy4KKyAgLy8vIElmIFNjYWxhcml6YXRpb25Db3N0UGFzc2VkIGlzIHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSwgdGhlCisgIC8vLyBjb3N0IG9mIHNjYWxhcml6aW5nIHRoZSBhcmd1bWVudHMgYW5kIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBjb21wdXRlZAorICAvLy8gYmFzZWQgb24gdHlwZXMuCisgIHVuc2lnbmVkIGdldEludHJpbnNpY0luc3RyQ29zdCgKKyAgICAgIEludHJpbnNpYzo6SUQgSUlELCBUeXBlICpSZXRUeSwgQXJyYXlSZWY8VHlwZSAqPiBUeXMsIEZhc3RNYXRoRmxhZ3MgRk1GLAorICAgICAgdW5zaWduZWQgU2NhbGFyaXphdGlvbkNvc3RQYXNzZWQgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCkpIHsKKyAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMj4gSVNEczsKKyAgICB1bnNpZ25lZCBTaW5nbGVDYWxsQ29zdCA9IDEwOyAvLyBMaWJyYXJ5IGNhbGwgY29zdC4gTWFrZSBpdCBleHBlbnNpdmUuCisgICAgc3dpdGNoIChJSUQpIHsKKyAgICBkZWZhdWx0OiB7CisgICAgICAvLyBBc3N1bWUgdGhhdCB3ZSBuZWVkIHRvIHNjYWxhcml6ZSB0aGlzIGludHJpbnNpYy4KKyAgICAgIHVuc2lnbmVkIFNjYWxhcml6YXRpb25Db3N0ID0gU2NhbGFyaXphdGlvbkNvc3RQYXNzZWQ7CisgICAgICB1bnNpZ25lZCBTY2FsYXJDYWxscyA9IDE7CisgICAgICBUeXBlICpTY2FsYXJSZXRUeSA9IFJldFR5OworICAgICAgaWYgKFJldFR5LT5pc1ZlY3RvclR5KCkpIHsKKyAgICAgICAgaWYgKFNjYWxhcml6YXRpb25Db3N0UGFzc2VkID09IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSkKKyAgICAgICAgICBTY2FsYXJpemF0aW9uQ29zdCA9IGdldFNjYWxhcml6YXRpb25PdmVyaGVhZChSZXRUeSwgdHJ1ZSwgZmFsc2UpOworICAgICAgICBTY2FsYXJDYWxscyA9IHN0ZDo6bWF4KFNjYWxhckNhbGxzLCBSZXRUeS0+Z2V0VmVjdG9yTnVtRWxlbWVudHMoKSk7CisgICAgICAgIFNjYWxhclJldFR5ID0gUmV0VHktPmdldFNjYWxhclR5cGUoKTsKKyAgICAgIH0KKyAgICAgIFNtYWxsVmVjdG9yPFR5cGUgKiwgND4gU2NhbGFyVHlzOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgaWUgPSBUeXMuc2l6ZSgpOyBpICE9IGllOyArK2kpIHsKKyAgICAgICAgVHlwZSAqVHkgPSBUeXNbaV07CisgICAgICAgIGlmIChUeS0+aXNWZWN0b3JUeSgpKSB7CisgICAgICAgICAgaWYgKFNjYWxhcml6YXRpb25Db3N0UGFzc2VkID09IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSkKKyAgICAgICAgICAgIFNjYWxhcml6YXRpb25Db3N0ICs9IGdldFNjYWxhcml6YXRpb25PdmVyaGVhZChUeSwgZmFsc2UsIHRydWUpOworICAgICAgICAgIFNjYWxhckNhbGxzID0gc3RkOjptYXgoU2NhbGFyQ2FsbHMsIFR5LT5nZXRWZWN0b3JOdW1FbGVtZW50cygpKTsKKyAgICAgICAgICBUeSA9IFR5LT5nZXRTY2FsYXJUeXBlKCk7CisgICAgICAgIH0KKyAgICAgICAgU2NhbGFyVHlzLnB1c2hfYmFjayhUeSk7CisgICAgICB9CisgICAgICBpZiAoU2NhbGFyQ2FsbHMgPT0gMSkKKyAgICAgICAgcmV0dXJuIDE7IC8vIFJldHVybiBjb3N0IG9mIGEgc2NhbGFyIGludHJpbnNpYy4gQXNzdW1lIGl0IHRvIGJlIGNoZWFwLgorCisgICAgICB1bnNpZ25lZCBTY2FsYXJDb3N0ID0gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+Z2V0SW50cmluc2ljSW5zdHJDb3N0KAorICAgICAgICAgIElJRCwgU2NhbGFyUmV0VHksIFNjYWxhclR5cywgRk1GKTsKKworICAgICAgcmV0dXJuIFNjYWxhckNhbGxzICogU2NhbGFyQ29zdCArIFNjYWxhcml6YXRpb25Db3N0OworICAgIH0KKyAgICAvLyBMb29rIGZvciBpbnRyaW5zaWNzIHRoYXQgY2FuIGJlIGxvd2VyZWQgZGlyZWN0bHkgb3IgdHVybmVkIGludG8gYSBzY2FsYXIKKyAgICAvLyBpbnRyaW5zaWMgY2FsbC4KKyAgICBjYXNlIEludHJpbnNpYzo6c3FydDoKKyAgICAgIElTRHMucHVzaF9iYWNrKElTRDo6RlNRUlQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6OnNpbjoKKyAgICAgIElTRHMucHVzaF9iYWNrKElTRDo6RlNJTik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6Y29zOgorICAgICAgSVNEcy5wdXNoX2JhY2soSVNEOjpGQ09TKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjpleHA6CisgICAgICBJU0RzLnB1c2hfYmFjayhJU0Q6OkZFWFApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6OmV4cDI6CisgICAgICBJU0RzLnB1c2hfYmFjayhJU0Q6OkZFWFAyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjpsb2c6CisgICAgICBJU0RzLnB1c2hfYmFjayhJU0Q6OkZMT0cpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6OmxvZzEwOgorICAgICAgSVNEcy5wdXNoX2JhY2soSVNEOjpGTE9HMTApOworICAgICAgYnJlYWs7CisgICAgY2FzZSBJbnRyaW5zaWM6OmxvZzI6CisgICAgICBJU0RzLnB1c2hfYmFjayhJU0Q6OkZMT0cyKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjpmYWJzOgorICAgICAgSVNEcy5wdXNoX2JhY2soSVNEOjpGQUJTKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjptaW5udW06CisgICAgICBJU0RzLnB1c2hfYmFjayhJU0Q6OkZNSU5OVU0pOworICAgICAgaWYgKEZNRi5ub05hTnMoKSkKKyAgICAgICAgSVNEcy5wdXNoX2JhY2soSVNEOjpGTUlOTkFOKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjptYXhudW06CisgICAgICBJU0RzLnB1c2hfYmFjayhJU0Q6OkZNQVhOVU0pOworICAgICAgaWYgKEZNRi5ub05hTnMoKSkKKyAgICAgICAgSVNEcy5wdXNoX2JhY2soSVNEOjpGTUFYTkFOKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjpjb3B5c2lnbjoKKyAgICAgIElTRHMucHVzaF9iYWNrKElTRDo6RkNPUFlTSUdOKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjpmbG9vcjoKKyAgICAgIElTRHMucHVzaF9iYWNrKElTRDo6RkZMT09SKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjpjZWlsOgorICAgICAgSVNEcy5wdXNoX2JhY2soSVNEOjpGQ0VJTCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6dHJ1bmM6CisgICAgICBJU0RzLnB1c2hfYmFjayhJU0Q6OkZUUlVOQyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6bmVhcmJ5aW50OgorICAgICAgSVNEcy5wdXNoX2JhY2soSVNEOjpGTkVBUkJZSU5UKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjpyaW50OgorICAgICAgSVNEcy5wdXNoX2JhY2soSVNEOjpGUklOVCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6cm91bmQ6CisgICAgICBJU0RzLnB1c2hfYmFjayhJU0Q6OkZST1VORCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6cG93OgorICAgICAgSVNEcy5wdXNoX2JhY2soSVNEOjpGUE9XKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW50cmluc2ljOjpmbWE6CisgICAgICBJU0RzLnB1c2hfYmFjayhJU0Q6OkZNQSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEludHJpbnNpYzo6Zm11bGFkZDoKKyAgICAgIElTRHMucHVzaF9iYWNrKElTRDo6Rk1BKTsKKyAgICAgIGJyZWFrOworICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgcmV0dXJuIDAgd2hlbmV2ZXIgZ2V0SW50cmluc2ljQ29zdCA9PSBUQ0NfRnJlZS4KKyAgICBjYXNlIEludHJpbnNpYzo6bGlmZXRpbWVfc3RhcnQ6CisgICAgY2FzZSBJbnRyaW5zaWM6OmxpZmV0aW1lX2VuZDoKKyAgICBjYXNlIEludHJpbnNpYzo6c2lkZWVmZmVjdDoKKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgSW50cmluc2ljOjptYXNrZWRfc3RvcmU6CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKQorICAgICAgICAgIC0+Z2V0TWFza2VkTWVtb3J5T3BDb3N0KEluc3RydWN0aW9uOjpTdG9yZSwgVHlzWzBdLCAwLCAwKTsKKyAgICBjYXNlIEludHJpbnNpYzo6bWFza2VkX2xvYWQ6CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKQorICAgICAgICAgIC0+Z2V0TWFza2VkTWVtb3J5T3BDb3N0KEluc3RydWN0aW9uOjpMb2FkLCBSZXRUeSwgMCwgMCk7CisgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX2FkZDoKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXRBcml0aG1ldGljUmVkdWN0aW9uQ29zdCgKKyAgICAgICAgICBJbnN0cnVjdGlvbjo6QWRkLCBUeXNbMF0sIC8qSXNQYWlyd2lzZUZvcm09Ki9mYWxzZSk7CisgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX211bDoKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXRBcml0aG1ldGljUmVkdWN0aW9uQ29zdCgKKyAgICAgICAgICBJbnN0cnVjdGlvbjo6TXVsLCBUeXNbMF0sIC8qSXNQYWlyd2lzZUZvcm09Ki9mYWxzZSk7CisgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX2FuZDoKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXRBcml0aG1ldGljUmVkdWN0aW9uQ29zdCgKKyAgICAgICAgICBJbnN0cnVjdGlvbjo6QW5kLCBUeXNbMF0sIC8qSXNQYWlyd2lzZUZvcm09Ki9mYWxzZSk7CisgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX29yOgorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmdldEFyaXRobWV0aWNSZWR1Y3Rpb25Db3N0KAorICAgICAgICAgIEluc3RydWN0aW9uOjpPciwgVHlzWzBdLCAvKklzUGFpcndpc2VGb3JtPSovZmFsc2UpOworICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV94b3I6CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+Z2V0QXJpdGhtZXRpY1JlZHVjdGlvbkNvc3QoCisgICAgICAgICAgSW5zdHJ1Y3Rpb246OlhvciwgVHlzWzBdLCAvKklzUGFpcndpc2VGb3JtPSovZmFsc2UpOworICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9mYWRkOgorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4odGhpcyktPmdldEFyaXRobWV0aWNSZWR1Y3Rpb25Db3N0KAorICAgICAgICAgIEluc3RydWN0aW9uOjpGQWRkLCBUeXNbMF0sIC8qSXNQYWlyd2lzZUZvcm09Ki9mYWxzZSk7CisgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX2ZtdWw6CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+Z2V0QXJpdGhtZXRpY1JlZHVjdGlvbkNvc3QoCisgICAgICAgICAgSW5zdHJ1Y3Rpb246OkZNdWwsIFR5c1swXSwgLypJc1BhaXJ3aXNlRm9ybT0qL2ZhbHNlKTsKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2Vfc21heDoKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2Vfc21pbjoKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfZm1heDoKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfZm1pbjoKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXRNaW5NYXhSZWR1Y3Rpb25Db3N0KAorICAgICAgICAgIFR5c1swXSwgQ21wSW5zdDo6bWFrZUNtcFJlc3VsdFR5cGUoVHlzWzBdKSwgLypJc1BhaXJ3aXNlRm9ybT0qL2ZhbHNlLAorICAgICAgICAgIC8qSXNTaWduZWQ9Ki90cnVlKTsKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfdW1heDoKKyAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfdW1pbjoKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUICo+KHRoaXMpLT5nZXRNaW5NYXhSZWR1Y3Rpb25Db3N0KAorICAgICAgICAgIFR5c1swXSwgQ21wSW5zdDo6bWFrZUNtcFJlc3VsdFR5cGUoVHlzWzBdKSwgLypJc1BhaXJ3aXNlRm9ybT0qL2ZhbHNlLAorICAgICAgICAgIC8qSXNTaWduZWQ9Ki9mYWxzZSk7CisgICAgY2FzZSBJbnRyaW5zaWM6OmN0cG9wOgorICAgICAgSVNEcy5wdXNoX2JhY2soSVNEOjpDVFBPUCk7CisgICAgICAvLyBJbiBjYXNlIG9mIGxlZ2FsaXphdGlvbiB1c2UgVENDX0V4cGVuc2l2ZS4gVGhpcyBpcyBjaGVhcGVyIHRoYW4gYQorICAgICAgLy8gbGlicmFyeSBjYWxsIGJ1dCBzdGlsbCBub3QgYSBjaGVhcCBpbnN0cnVjdGlvbi4KKyAgICAgIFNpbmdsZUNhbGxDb3N0ID0gVGFyZ2V0VHJhbnNmb3JtSW5mbzo6VENDX0V4cGVuc2l2ZTsKKyAgICAgIGJyZWFrOworICAgIC8vIEZJWE1FOiBjdGx6LCBjdHR6LCAuLi4KKyAgICB9CisKKyAgICBjb25zdCBUYXJnZXRMb3dlcmluZ0Jhc2UgKlRMSSA9IGdldFRMSSgpOworICAgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgTVZUPiBMVCA9IFRMSS0+Z2V0VHlwZUxlZ2FsaXphdGlvbkNvc3QoREwsIFJldFR5KTsKKworICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCAyPiBMZWdhbENvc3Q7CisgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDI+IEN1c3RvbUNvc3Q7CisgICAgZm9yICh1bnNpZ25lZCBJU0QgOiBJU0RzKSB7CisgICAgICBpZiAoVExJLT5pc09wZXJhdGlvbkxlZ2FsT3JQcm9tb3RlKElTRCwgTFQuc2Vjb25kKSkgeworICAgICAgICBpZiAoSUlEID09IEludHJpbnNpYzo6ZmFicyAmJiBUTEktPmlzRkFic0ZyZWUoTFQuc2Vjb25kKSkgeworICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIG9wZXJhdGlvbiBpcyBsZWdhbC4gQXNzdW1lIGl0IGNvc3RzIDEuCisgICAgICAgIC8vIElmIHRoZSB0eXBlIGlzIHNwbGl0IHRvIG11bHRpcGxlIHJlZ2lzdGVycywgYXNzdW1lIHRoYXQgdGhlcmUgaXMgc29tZQorICAgICAgICAvLyBvdmVyaGVhZCB0byB0aGlzLgorICAgICAgICAvLyBUT0RPOiBPbmNlIHdlIGhhdmUgZXh0cmFjdC9pbnNlcnQgc3VidmVjdG9yIGNvc3Qgd2UgbmVlZCB0byB1c2UgdGhlbS4KKyAgICAgICAgaWYgKExULmZpcnN0ID4gMSkKKyAgICAgICAgICBMZWdhbENvc3QucHVzaF9iYWNrKExULmZpcnN0ICogMik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBMZWdhbENvc3QucHVzaF9iYWNrKExULmZpcnN0ICogMSk7CisgICAgICB9IGVsc2UgaWYgKCFUTEktPmlzT3BlcmF0aW9uRXhwYW5kKElTRCwgTFQuc2Vjb25kKSkgeworICAgICAgICAvLyBJZiB0aGUgb3BlcmF0aW9uIGlzIGN1c3RvbSBsb3dlcmVkIHRoZW4gYXNzdW1lCisgICAgICAgIC8vIHRoYXQgdGhlIGNvZGUgaXMgdHdpY2UgYXMgZXhwZW5zaXZlLgorICAgICAgICBDdXN0b21Db3N0LnB1c2hfYmFjayhMVC5maXJzdCAqIDIpOworICAgICAgfQorICAgIH0KKworICAgIGF1dG8gTWluTGVnYWxDb3N0SSA9IHN0ZDo6bWluX2VsZW1lbnQoTGVnYWxDb3N0LmJlZ2luKCksIExlZ2FsQ29zdC5lbmQoKSk7CisgICAgaWYgKE1pbkxlZ2FsQ29zdEkgIT0gTGVnYWxDb3N0LmVuZCgpKQorICAgICAgcmV0dXJuICpNaW5MZWdhbENvc3RJOworCisgICAgYXV0byBNaW5DdXN0b21Db3N0SSA9IHN0ZDo6bWluX2VsZW1lbnQoQ3VzdG9tQ29zdC5iZWdpbigpLCBDdXN0b21Db3N0LmVuZCgpKTsKKyAgICBpZiAoTWluQ3VzdG9tQ29zdEkgIT0gQ3VzdG9tQ29zdC5lbmQoKSkKKyAgICAgIHJldHVybiAqTWluQ3VzdG9tQ29zdEk7CisKKyAgICAvLyBJZiB3ZSBjYW4ndCBsb3dlciBmbXVsYWRkIGludG8gYW4gRk1BIGVzdGltYXRlIHRoZSBjb3N0IGFzIGEgZmxvYXRpbmcKKyAgICAvLyBwb2ludCBtdWwgZm9sbG93ZWQgYnkgYW4gYWRkLgorICAgIGlmIChJSUQgPT0gSW50cmluc2ljOjpmbXVsYWRkKQorICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQgKj4odGhpcykKKyAgICAgICAgICAgICAgICAgLT5nZXRBcml0aG1ldGljSW5zdHJDb3N0KEJpbmFyeU9wZXJhdG9yOjpGTXVsLCBSZXRUeSkgKworICAgICAgICAgICAgIHN0YXRpY19jYXN0PFQgKj4odGhpcykKKyAgICAgICAgICAgICAgICAgLT5nZXRBcml0aG1ldGljSW5zdHJDb3N0KEJpbmFyeU9wZXJhdG9yOjpGQWRkLCBSZXRUeSk7CisKKyAgICAvLyBFbHNlLCBhc3N1bWUgdGhhdCB3ZSBuZWVkIHRvIHNjYWxhcml6ZSB0aGlzIGludHJpbnNpYy4gRm9yIG1hdGggYnVpbHRpbnMKKyAgICAvLyB0aGlzIHdpbGwgZW1pdCBhIGNvc3RseSBsaWJjYWxsLCBhZGRpbmcgY2FsbCBvdmVyaGVhZCBhbmQgc3BpbGxzLiBNYWtlIGl0CisgICAgLy8gdmVyeSBleHBlbnNpdmUuCisgICAgaWYgKFJldFR5LT5pc1ZlY3RvclR5KCkpIHsKKyAgICAgIHVuc2lnbmVkIFNjYWxhcml6YXRpb25Db3N0ID0KKyAgICAgICAgICAoKFNjYWxhcml6YXRpb25Db3N0UGFzc2VkICE9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSkKKyAgICAgICAgICAgICAgID8gU2NhbGFyaXphdGlvbkNvc3RQYXNzZWQKKyAgICAgICAgICAgICAgIDogZ2V0U2NhbGFyaXphdGlvbk92ZXJoZWFkKFJldFR5LCB0cnVlLCBmYWxzZSkpOworICAgICAgdW5zaWduZWQgU2NhbGFyQ2FsbHMgPSBSZXRUeS0+Z2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgICAgIFNtYWxsVmVjdG9yPFR5cGUgKiwgND4gU2NhbGFyVHlzOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgaWUgPSBUeXMuc2l6ZSgpOyBpICE9IGllOyArK2kpIHsKKyAgICAgICAgVHlwZSAqVHkgPSBUeXNbaV07CisgICAgICAgIGlmIChUeS0+aXNWZWN0b3JUeSgpKQorICAgICAgICAgIFR5ID0gVHktPmdldFNjYWxhclR5cGUoKTsKKyAgICAgICAgU2NhbGFyVHlzLnB1c2hfYmFjayhUeSk7CisgICAgICB9CisgICAgICB1bnNpZ25lZCBTY2FsYXJDb3N0ID0gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKS0+Z2V0SW50cmluc2ljSW5zdHJDb3N0KAorICAgICAgICAgIElJRCwgUmV0VHktPmdldFNjYWxhclR5cGUoKSwgU2NhbGFyVHlzLCBGTUYpOworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgaWUgPSBUeXMuc2l6ZSgpOyBpICE9IGllOyArK2kpIHsKKyAgICAgICAgaWYgKFR5c1tpXS0+aXNWZWN0b3JUeSgpKSB7CisgICAgICAgICAgaWYgKFNjYWxhcml6YXRpb25Db3N0UGFzc2VkID09IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSkKKyAgICAgICAgICAgIFNjYWxhcml6YXRpb25Db3N0ICs9IGdldFNjYWxhcml6YXRpb25PdmVyaGVhZChUeXNbaV0sIGZhbHNlLCB0cnVlKTsKKyAgICAgICAgICBTY2FsYXJDYWxscyA9IHN0ZDo6bWF4KFNjYWxhckNhbGxzLCBUeXNbaV0tPmdldFZlY3Rvck51bUVsZW1lbnRzKCkpOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHJldHVybiBTY2FsYXJDYWxscyAqIFNjYWxhckNvc3QgKyBTY2FsYXJpemF0aW9uQ29zdDsKKyAgICB9CisKKyAgICAvLyBUaGlzIGlzIGdvaW5nIHRvIGJlIHR1cm5lZCBpbnRvIGEgbGlicmFyeSBjYWxsLCBtYWtlIGl0IGV4cGVuc2l2ZS4KKyAgICByZXR1cm4gU2luZ2xlQ2FsbENvc3Q7CisgIH0KKworICAvLy8gXGJyaWVmIENvbXB1dGUgYSBjb3N0IG9mIHRoZSBnaXZlbiBjYWxsIGluc3RydWN0aW9uLgorICAvLy8KKyAgLy8vIENvbXB1dGUgdGhlIGNvc3Qgb2YgY2FsbGluZyBmdW5jdGlvbiBGIHdpdGggcmV0dXJuIHR5cGUgUmV0VHkgYW5kCisgIC8vLyBhcmd1bWVudCB0eXBlcyBUeXMuIEYgbWlnaHQgYmUgbnVsbHB0ciwgaW4gdGhpcyBjYXNlIHRoZSBjb3N0IG9mIGFuCisgIC8vLyBhcmJpdHJhcnkgY2FsbCB3aXRoIHRoZSBzcGVjaWZpZWQgc2lnbmF0dXJlIHdpbGwgYmUgcmV0dXJuZWQuCisgIC8vLyBUaGlzIGlzIHVzZWQsIGZvciBpbnN0YW5jZSwgIHdoZW4gd2UgZXN0aW1hdGUgY2FsbCBvZiBhIHZlY3RvcgorICAvLy8gY291bnRlcnBhcnQgb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLgorICAvLy8gXHBhcmFtIEYgQ2FsbGVkIGZ1bmN0aW9uLCBtaWdodCBiZSBudWxscHRyLgorICAvLy8gXHBhcmFtIFJldFR5IFJldHVybiB2YWx1ZSB0eXBlcy4KKyAgLy8vIFxwYXJhbSBUeXMgQXJndW1lbnQgdHlwZXMuCisgIC8vLyBccmV0dXJucyBUaGUgY29zdCBvZiBDYWxsIGluc3RydWN0aW9uLgorICB1bnNpZ25lZCBnZXRDYWxsSW5zdHJDb3N0KEZ1bmN0aW9uICpGLCBUeXBlICpSZXRUeSwgQXJyYXlSZWY8VHlwZSAqPiBUeXMpIHsKKyAgICByZXR1cm4gMTA7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1iZXJPZlBhcnRzKFR5cGUgKlRwKSB7CisgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCBNVlQ+IExUID0gZ2V0VExJKCktPmdldFR5cGVMZWdhbGl6YXRpb25Db3N0KERMLCBUcCk7CisgICAgcmV0dXJuIExULmZpcnN0OworICB9CisKKyAgdW5zaWduZWQgZ2V0QWRkcmVzc0NvbXB1dGF0aW9uQ29zdChUeXBlICpUeSwgU2NhbGFyRXZvbHV0aW9uICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gVHJ5IHRvIGNhbGN1bGF0ZSBhcml0aG1ldGljIGFuZCBzaHVmZmxlIG9wIGNvc3RzIGZvciByZWR1Y3Rpb24gb3BlcmF0aW9ucy4KKyAgLy8vIFdlJ3JlIGFzc3VtaW5nIHRoYXQgcmVkdWN0aW9uIG9wZXJhdGlvbiBhcmUgcGVyZm9ybWluZyB0aGUgZm9sbG93aW5nIHdheToKKyAgLy8vIDEuIE5vbi1wYWlyd2lzZSByZWR1Y3Rpb24KKyAgLy8vICV2YWwxID0gc2h1ZmZsZXZlY3RvcjxuIHggdD4gJXZhbCwgPG4geCB0PiAldW5kZWYsCisgIC8vLyA8biB4IGkzMj4gPGkzMiBuLzIsIGkzMiBuLzIgKyAxLCAuLi4sIGkzMiBuLCBpMzIgdW5kZWYsIC4uLiwgaTMyIHVuZGVmPgorICAvLy8gICAgICAgICAgICBcLS0tLS0tLS0tLS0tLS0tLXYtLS0tLS0tLS0tLS0tLyAgXC0tLS0tLS0tLS12LS0tLS0tLS0tLS0tLworICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbi8yIGVsZW1lbnRzICAgICAgICAgICAgICAgbi8yIGVsZW1lbnRzCisgIC8vLyAlcmVkMSA9IG9wIDxuIHggdD4gJXZhbCwgPG4geCB0PiB2YWwxCisgIC8vLyBBZnRlciB0aGlzIG9wZXJhdGlvbiB3ZSBoYXZlIGEgdmVjdG9yICVyZWQxIHdoZXJlIG9ubHkgdGhlIGZpcnN0IG4vMgorICAvLy8gZWxlbWVudHMgYXJlIG1lYW5pbmdmdWwsIHRoZSBzZWNvbmQgbi8yIGVsZW1lbnRzIGFyZSB1bmRlZmluZWQgYW5kIGNhbiBiZQorICAvLy8gZHJvcHBlZC4gQWxsIG90aGVyIG9wZXJhdGlvbnMgYXJlIGFjdHVhbGx5IHdvcmtpbmcgd2l0aCB0aGUgdmVjdG9yIG9mCisgIC8vLyBsZW5ndGggbi8yLCBub3QgbiwgdGhvdWdoIHRoZSByZWFsIHZlY3RvciBsZW5ndGggaXMgc3RpbGwgbi4KKyAgLy8vICV2YWwyID0gc2h1ZmZsZXZlY3RvcjxuIHggdD4gJXJlZDEsIDxuIHggdD4gJXVuZGVmLAorICAvLy8gPG4geCBpMzI+IDxpMzIgbi80LCBpMzIgbi80ICsgMSwgLi4uLCBpMzIgbi8yLCBpMzIgdW5kZWYsIC4uLiwgaTMyIHVuZGVmPgorICAvLy8gICAgICAgICAgICBcLS0tLS0tLS0tLS0tLS0tLXYtLS0tLS0tLS0tLS0tLyAgXC0tLS0tLS0tLS12LS0tLS0tLS0tLS0tLworICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgbi80IGVsZW1lbnRzICAgICAgICAgICAgICAgMypuLzQgZWxlbWVudHMKKyAgLy8vICVyZWQyID0gb3AgPG4geCB0PiAlcmVkMSwgPG4geCB0PiB2YWwyICAtIHdvcmtpbmcgd2l0aCB0aGUgdmVjdG9yIG9mCisgIC8vLyBsZW5ndGggbi8yLCB0aGUgcmVzdWx0aW5nIHZlY3RvciBoYXMgbGVuZ3RoIG4vNCBldGMuCisgIC8vLyAyLiBQYWlyd2lzZSByZWR1Y3Rpb246CisgIC8vLyBFdmVyeXRoaW5nIGlzIHRoZSBzYW1lIGV4Y2VwdCBmb3IgYW4gYWRkaXRpb25hbCBzaHVmZmxlIG9wZXJhdGlvbiB3aGljaAorICAvLy8gaXMgdXNlZCB0byBwcm9kdWNlIG9wZXJhbmRzIGZvciBwYWlyd2lzZSBraW5kIG9mIHJlZHVjdGlvbnMuCisgIC8vLyAldmFsMSA9IHNodWZmbGV2ZWN0b3I8biB4IHQ+ICV2YWwsIDxuIHggdD4gJXVuZGVmLAorICAvLy8gPG4geCBpMzI+IDxpMzIgMCwgaTMyIDIsIC4uLiwgaTMyIG4tMiwgaTMyIHVuZGVmLCAuLi4sIGkzMiB1bmRlZj4KKyAgLy8vICAgICAgICAgICAgXC0tLS0tLS0tLS0tLS12LS0tLS0tLS0tLS8gIFwtLS0tLS0tLS0tdi0tLS0tLS0tLS0tLS8KKyAgLy8vICAgICAgICAgICAgICAgICAgIG4vMiBlbGVtZW50cyAgICAgICAgICAgICAgIG4vMiBlbGVtZW50cworICAvLy8gJXZhbDIgPSBzaHVmZmxldmVjdG9yPG4geCB0PiAldmFsLCA8biB4IHQ+ICV1bmRlZiwKKyAgLy8vIDxuIHggaTMyPiA8aTMyIDEsIGkzMiAzLCAuLi4sIGkzMiBuLTEsIGkzMiB1bmRlZiwgLi4uLCBpMzIgdW5kZWY+CisgIC8vLyAgICAgICAgICAgIFwtLS0tLS0tLS0tLS0tdi0tLS0tLS0tLS0vICBcLS0tLS0tLS0tLXYtLS0tLS0tLS0tLS0vCisgIC8vLyAgICAgICAgICAgICAgICAgICBuLzIgZWxlbWVudHMgICAgICAgICAgICAgICBuLzIgZWxlbWVudHMKKyAgLy8vICVyZWQxID0gb3AgPG4geCB0PiAldmFsMSwgPG4geCB0PiB2YWwyCisgIC8vLyBBZ2FpbiwgdGhlIG9wZXJhdGlvbiBpcyBwZXJmb3JtZWQgb24gPG4geCB0PiB2ZWN0b3IsIGJ1dCB0aGUgcmVzdWx0aW5nCisgIC8vLyB2ZWN0b3IgJXJlZDEgaXMgPG4vMiB4IHQ+IHZlY3Rvci4KKyAgLy8vCisgIC8vLyBUaGUgY29zdCBtb2RlbCBzaG91bGQgdGFrZSBpbnRvIGFjY291bnQgdGhhdCB0aGUgYWN0dWFsIGxlbmd0aCBvZiB0aGUKKyAgLy8vIHZlY3RvciBpcyByZWR1Y2VkIG9uIGVhY2ggaXRlcmF0aW9uLgorICB1bnNpZ25lZCBnZXRBcml0aG1ldGljUmVkdWN0aW9uQ29zdCh1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzUGFpcndpc2UpIHsKKyAgICBhc3NlcnQoVHktPmlzVmVjdG9yVHkoKSAmJiAiRXhwZWN0IGEgdmVjdG9yIHR5cGUiKTsKKyAgICBUeXBlICpTY2FsYXJUeSA9IFR5LT5nZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICAgIHVuc2lnbmVkIE51bVZlY0VsdHMgPSBUeS0+Z2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgICB1bnNpZ25lZCBOdW1SZWR1eExldmVscyA9IExvZzJfMzIoTnVtVmVjRWx0cyk7CisgICAgdW5zaWduZWQgQXJpdGhDb3N0ID0gMDsKKyAgICB1bnNpZ25lZCBTaHVmZmxlQ29zdCA9IDA7CisgICAgYXV0byAqQ29uY3JldGVUVEkgPSBzdGF0aWNfY2FzdDxUICo+KHRoaXMpOworICAgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgTVZUPiBMVCA9CisgICAgICAgIENvbmNyZXRlVFRJLT5nZXRUTEkoKS0+Z2V0VHlwZUxlZ2FsaXphdGlvbkNvc3QoREwsIFR5KTsKKyAgICB1bnNpZ25lZCBMb25nVmVjdG9yQ291bnQgPSAwOworICAgIHVuc2lnbmVkIE1WVExlbiA9CisgICAgICAgIExULnNlY29uZC5pc1ZlY3RvcigpID8gTFQuc2Vjb25kLmdldFZlY3Rvck51bUVsZW1lbnRzKCkgOiAxOworICAgIHdoaWxlIChOdW1WZWNFbHRzID4gTVZUTGVuKSB7CisgICAgICBOdW1WZWNFbHRzIC89IDI7CisgICAgICAvLyBBc3N1bWUgdGhlIHBhaXJ3aXNlIHNodWZmbGVzIGFkZCBhIGNvc3QuCisgICAgICBTaHVmZmxlQ29zdCArPSAoSXNQYWlyd2lzZSArIDEpICoKKyAgICAgICAgICAgICAgICAgICAgIENvbmNyZXRlVFRJLT5nZXRTaHVmZmxlQ29zdChUVEk6OlNLX0V4dHJhY3RTdWJ2ZWN0b3IsIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVZlY0VsdHMsIFR5KTsKKyAgICAgIEFyaXRoQ29zdCArPSBDb25jcmV0ZVRUSS0+Z2V0QXJpdGhtZXRpY0luc3RyQ29zdChPcGNvZGUsIFR5KTsKKyAgICAgIFR5ID0gVmVjdG9yVHlwZTo6Z2V0KFNjYWxhclR5LCBOdW1WZWNFbHRzKTsKKyAgICAgICsrTG9uZ1ZlY3RvckNvdW50OworICAgIH0KKyAgICAvLyBUaGUgbWluaW1hbCBsZW5ndGggb2YgdGhlIHZlY3RvciBpcyBsaW1pdGVkIGJ5IHRoZSByZWFsIGxlbmd0aCBvZiB2ZWN0b3IKKyAgICAvLyBvcGVyYXRpb25zIHBlcmZvcm1lZCBvbiB0aGUgY3VycmVudCBwbGF0Zm9ybS4gVGhhdCdzIHdoeSBzZXZlcmFsIGZpbmFsCisgICAgLy8gcmVkdWN0aW9uIG9wZXJhdGlvbnMgYXJlIHBlcmZvcm1lZCBvbiB0aGUgdmVjdG9ycyB3aXRoIHRoZSBzYW1lCisgICAgLy8gYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBsZW5ndGguCisgICAgU2h1ZmZsZUNvc3QgKz0gKE51bVJlZHV4TGV2ZWxzIC0gTG9uZ1ZlY3RvckNvdW50KSAqIChJc1BhaXJ3aXNlICsgMSkgKgorICAgICAgICAgICAgICAgICAgIENvbmNyZXRlVFRJLT5nZXRTaHVmZmxlQ29zdChUVEk6OlNLX0V4dHJhY3RTdWJ2ZWN0b3IsIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1WZWNFbHRzLCBUeSk7CisgICAgQXJpdGhDb3N0ICs9IChOdW1SZWR1eExldmVscyAtIExvbmdWZWN0b3JDb3VudCkgKgorICAgICAgICAgICAgICAgICBDb25jcmV0ZVRUSS0+Z2V0QXJpdGhtZXRpY0luc3RyQ29zdChPcGNvZGUsIFR5KTsKKyAgICByZXR1cm4gU2h1ZmZsZUNvc3QgKyBBcml0aENvc3QgKyBnZXRTY2FsYXJpemF0aW9uT3ZlcmhlYWQoVHksIGZhbHNlLCB0cnVlKTsKKyAgfQorCisgIC8vLyBUcnkgdG8gY2FsY3VsYXRlIG9wIGNvc3RzIGZvciBtaW4vbWF4IHJlZHVjdGlvbiBvcGVyYXRpb25zLgorICAvLy8gXHBhcmFtIENvbmRUeSBDb25kaXRpb25hbCB0eXBlIGZvciB0aGUgU2VsZWN0IGluc3RydWN0aW9uLgorICB1bnNpZ25lZCBnZXRNaW5NYXhSZWR1Y3Rpb25Db3N0KFR5cGUgKlR5LCBUeXBlICpDb25kVHksIGJvb2wgSXNQYWlyd2lzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKSB7CisgICAgYXNzZXJ0KFR5LT5pc1ZlY3RvclR5KCkgJiYgIkV4cGVjdCBhIHZlY3RvciB0eXBlIik7CisgICAgVHlwZSAqU2NhbGFyVHkgPSBUeS0+Z2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgICBUeXBlICpTY2FsYXJDb25kVHkgPSBDb25kVHktPmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgICAgdW5zaWduZWQgTnVtVmVjRWx0cyA9IFR5LT5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICAgIHVuc2lnbmVkIE51bVJlZHV4TGV2ZWxzID0gTG9nMl8zMihOdW1WZWNFbHRzKTsKKyAgICB1bnNpZ25lZCBDbXBPcGNvZGU7CisgICAgaWYgKFR5LT5pc0ZQT3JGUFZlY3RvclR5KCkpIHsKKyAgICAgIENtcE9wY29kZSA9IEluc3RydWN0aW9uOjpGQ21wOworICAgIH0gZWxzZSB7CisgICAgICBhc3NlcnQoVHktPmlzSW50T3JJbnRWZWN0b3JUeSgpICYmCisgICAgICAgICAgICAgImV4cGVjdGluZyBmbG9hdGluZyBwb2ludCBvciBpbnRlZ2VyIHR5cGUgZm9yIG1pbi9tYXggcmVkdWN0aW9uIik7CisgICAgICBDbXBPcGNvZGUgPSBJbnN0cnVjdGlvbjo6SUNtcDsKKyAgICB9CisgICAgdW5zaWduZWQgTWluTWF4Q29zdCA9IDA7CisgICAgdW5zaWduZWQgU2h1ZmZsZUNvc3QgPSAwOworICAgIGF1dG8gKkNvbmNyZXRlVFRJID0gc3RhdGljX2Nhc3Q8VCAqPih0aGlzKTsKKyAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIE1WVD4gTFQgPQorICAgICAgICBDb25jcmV0ZVRUSS0+Z2V0VExJKCktPmdldFR5cGVMZWdhbGl6YXRpb25Db3N0KERMLCBUeSk7CisgICAgdW5zaWduZWQgTG9uZ1ZlY3RvckNvdW50ID0gMDsKKyAgICB1bnNpZ25lZCBNVlRMZW4gPQorICAgICAgICBMVC5zZWNvbmQuaXNWZWN0b3IoKSA/IExULnNlY29uZC5nZXRWZWN0b3JOdW1FbGVtZW50cygpIDogMTsKKyAgICB3aGlsZSAoTnVtVmVjRWx0cyA+IE1WVExlbikgeworICAgICAgTnVtVmVjRWx0cyAvPSAyOworICAgICAgLy8gQXNzdW1lIHRoZSBwYWlyd2lzZSBzaHVmZmxlcyBhZGQgYSBjb3N0LgorICAgICAgU2h1ZmZsZUNvc3QgKz0gKElzUGFpcndpc2UgKyAxKSAqCisgICAgICAgICAgICAgICAgICAgICBDb25jcmV0ZVRUSS0+Z2V0U2h1ZmZsZUNvc3QoVFRJOjpTS19FeHRyYWN0U3VidmVjdG9yLCBUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1WZWNFbHRzLCBUeSk7CisgICAgICBNaW5NYXhDb3N0ICs9CisgICAgICAgICAgQ29uY3JldGVUVEktPmdldENtcFNlbEluc3RyQ29zdChDbXBPcGNvZGUsIFR5LCBDb25kVHksIG51bGxwdHIpICsKKyAgICAgICAgICBDb25jcmV0ZVRUSS0+Z2V0Q21wU2VsSW5zdHJDb3N0KEluc3RydWN0aW9uOjpTZWxlY3QsIFR5LCBDb25kVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKyAgICAgIFR5ID0gVmVjdG9yVHlwZTo6Z2V0KFNjYWxhclR5LCBOdW1WZWNFbHRzKTsKKyAgICAgIENvbmRUeSA9IFZlY3RvclR5cGU6OmdldChTY2FsYXJDb25kVHksIE51bVZlY0VsdHMpOworICAgICAgKytMb25nVmVjdG9yQ291bnQ7CisgICAgfQorICAgIC8vIFRoZSBtaW5pbWFsIGxlbmd0aCBvZiB0aGUgdmVjdG9yIGlzIGxpbWl0ZWQgYnkgdGhlIHJlYWwgbGVuZ3RoIG9mIHZlY3RvcgorICAgIC8vIG9wZXJhdGlvbnMgcGVyZm9ybWVkIG9uIHRoZSBjdXJyZW50IHBsYXRmb3JtLiBUaGF0J3Mgd2h5IHNldmVyYWwgZmluYWwKKyAgICAvLyByZWR1Y3Rpb24gb3BlcnRpb25zIGFyZSBwZXJmb21lZCBvbiB0aGUgdmVjdG9ycyB3aXRoIHRoZSBzYW1lCisgICAgLy8gYXJjaGl0ZWN0dXJlLWRlcGVuZGVudCBsZW5ndGguCisgICAgU2h1ZmZsZUNvc3QgKz0gKE51bVJlZHV4TGV2ZWxzIC0gTG9uZ1ZlY3RvckNvdW50KSAqIChJc1BhaXJ3aXNlICsgMSkgKgorICAgICAgICAgICAgICAgICAgIENvbmNyZXRlVFRJLT5nZXRTaHVmZmxlQ29zdChUVEk6OlNLX0V4dHJhY3RTdWJ2ZWN0b3IsIFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOdW1WZWNFbHRzLCBUeSk7CisgICAgTWluTWF4Q29zdCArPQorICAgICAgICAoTnVtUmVkdXhMZXZlbHMgLSBMb25nVmVjdG9yQ291bnQpICoKKyAgICAgICAgKENvbmNyZXRlVFRJLT5nZXRDbXBTZWxJbnN0ckNvc3QoQ21wT3Bjb2RlLCBUeSwgQ29uZFR5LCBudWxscHRyKSArCisgICAgICAgICBDb25jcmV0ZVRUSS0+Z2V0Q21wU2VsSW5zdHJDb3N0KEluc3RydWN0aW9uOjpTZWxlY3QsIFR5LCBDb25kVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIpKTsKKyAgICAvLyBOZWVkIDMgZXh0cmFjdGVsZW1lbnQgaW5zdHJ1Y3Rpb25zIGZvciBzY2FsYXJpemF0aW9uICsgYW4gYWRkaXRpb25hbAorICAgIC8vIHNjYWxhciBzZWxlY3QgaW5zdHJ1Y3Rpb24uCisgICAgcmV0dXJuIFNodWZmbGVDb3N0ICsgTWluTWF4Q29zdCArCisgICAgICAgICAgIDMgKiBnZXRTY2FsYXJpemF0aW9uT3ZlcmhlYWQoVHksIC8qSW5zZXJ0PSovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypFeHRyYWN0PSovdHJ1ZSkgKworICAgICAgICAgICBDb25jcmV0ZVRUSS0+Z2V0Q21wU2VsSW5zdHJDb3N0KEluc3RydWN0aW9uOjpTZWxlY3QsIFNjYWxhclR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhckNvbmRUeSwgbnVsbHB0cik7CisgIH0KKworICB1bnNpZ25lZCBnZXRWZWN0b3JTcGxpdENvc3QoKSB7IHJldHVybiAxOyB9CisKKyAgLy8vIEB9Cit9OworCisvLy8gXGJyaWVmIENvbmNyZXRlIEJhc2ljVFRJSW1wbCB0aGF0IGNhbiBiZSB1c2VkIGlmIG5vIGZ1cnRoZXIgY3VzdG9taXphdGlvbgorLy8vIGlzIG5lZWRlZC4KK2NsYXNzIEJhc2ljVFRJSW1wbCA6IHB1YmxpYyBCYXNpY1RUSUltcGxCYXNlPEJhc2ljVFRJSW1wbD4geworICB1c2luZyBCYXNlVCA9IEJhc2ljVFRJSW1wbEJhc2U8QmFzaWNUVElJbXBsPjsKKworICBmcmllbmQgY2xhc3MgQmFzaWNUVElJbXBsQmFzZTxCYXNpY1RUSUltcGw+OworCisgIGNvbnN0IFRhcmdldFN1YnRhcmdldEluZm8gKlNUOworICBjb25zdCBUYXJnZXRMb3dlcmluZ0Jhc2UgKlRMSTsKKworICBjb25zdCBUYXJnZXRTdWJ0YXJnZXRJbmZvICpnZXRTVCgpIGNvbnN0IHsgcmV0dXJuIFNUOyB9CisgIGNvbnN0IFRhcmdldExvd2VyaW5nQmFzZSAqZ2V0VExJKCkgY29uc3QgeyByZXR1cm4gVExJOyB9CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgQmFzaWNUVElJbXBsKGNvbnN0IFRhcmdldE1hY2hpbmUgKlNULCBjb25zdCBGdW5jdGlvbiAmRik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0JBU0lDVFRJSU1QTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vQ2FsY1NwaWxsV2VpZ2h0cy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0NhbGNTcGlsbFdlaWdodHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWU4MjA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0NhbGNTcGlsbFdlaWdodHMuaApAQCAtMCwwICsxLDEwOCBAQAorLy89PT0tIGxpYi9Db2RlR2VuL0NhbGNTcGlsbFdlaWdodHMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fQ0FMQ1NQSUxMV0VJR0hUU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9DQUxDU1BJTExXRUlHSFRTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Nsb3RJbmRleGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTGl2ZUludGVydmFsOworY2xhc3MgTGl2ZUludGVydmFsczsKK2NsYXNzIE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm87CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lTG9vcEluZm87CitjbGFzcyBWaXJ0UmVnTWFwOworCisgIC8vLyBcYnJpZWYgTm9ybWFsaXplIHRoZSBzcGlsbCB3ZWlnaHQgb2YgYSBsaXZlIGludGVydmFsCisgIC8vLworICAvLy8gVGhlIHNwaWxsIHdlaWdodCBvZiBhIGxpdmUgaW50ZXJ2YWwgaXMgY29tcHV0ZWQgYXM6CisgIC8vLworICAvLy8gICAoc3VtKHVzZSBmcmVxKSArIHN1bShkZWYgZnJlcSkpIC8gKEsgKyBzaXplKQorICAvLy8KKyAgLy8vIEBwYXJhbSBVc2VEZWZGcmVxIEV4cGVjdGVkIG51bWJlciBvZiBleGVjdXRlZCB1c2UgYW5kIGRlZiBpbnN0cnVjdGlvbnMKKyAgLy8vICAgICAgICAgICAgICAgICAgIHBlciBmdW5jdGlvbiBjYWxsLiBEZXJpdmVkIGZyb20gYmxvY2sgZnJlcXVlbmNpZXMuCisgIC8vLyBAcGFyYW0gU2l6ZSAgICAgICBTaXplIG9mIGxpdmUgaW50ZXJ2YWwgYXMgcmV0dXJuZXhkIGJ5IGdldFNpemUoKQorICAvLy8gQHBhcmFtIE51bUluc3RyICAgTnVtYmVyIG9mIGluc3RydWN0aW9ucyB1c2luZyB0aGlzIGxpdmUgaW50ZXJ2YWwKKyAgc3RhdGljIGlubGluZSBmbG9hdCBub3JtYWxpemVTcGlsbFdlaWdodChmbG9hdCBVc2VEZWZGcmVxLCB1bnNpZ25lZCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUluc3RyKSB7CisgICAgLy8gVGhlIGNvbnN0YW50IDI1IGluc3RydWN0aW9ucyBpcyBhZGRlZCB0byBhdm9pZCBkZXBlbmRpbmcgdG9vIG11Y2ggb24KKyAgICAvLyBhY2NpZGVudGFsIFNsb3RJbmRleCBnYXBzIGZvciBzbWFsbCBpbnRlcnZhbHMuIFRoZSBlZmZlY3QgaXMgdGhhdCBzbWFsbAorICAgIC8vIGludGVydmFscyBoYXZlIGEgc3BpbGwgd2VpZ2h0IHRoYXQgaXMgbW9zdGx5IHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyCisgICAgLy8gb2YgdXNlcywgd2hpbGUgbGFyZ2UgaW50ZXJ2YWxzIGdldCBhIHNwaWxsIHdlaWdodCB0aGF0IGlzIGNsb3NlciB0byBhIHVzZQorICAgIC8vIGRlbnNpdHkuCisgICAgcmV0dXJuIFVzZURlZkZyZXEgLyAoU2l6ZSArIDI1KlNsb3RJbmRleDo6SW5zdHJEaXN0KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2FsY3VsYXRlIGF1eGlsaWFyeSBpbmZvcm1hdGlvbiBmb3IgYSB2aXJ0dWFsIHJlZ2lzdGVyIHN1Y2ggYXMgaXRzCisgIC8vLyBzcGlsbCB3ZWlnaHQgYW5kIGFsbG9jYXRpb24gaGludC4KKyAgY2xhc3MgVmlydFJlZ0F1eEluZm8geworICBwdWJsaWM6CisgICAgdXNpbmcgTm9ybWFsaXppbmdGbiA9IGZsb2F0ICgqKShmbG9hdCwgdW5zaWduZWQsIHVuc2lnbmVkKTsKKworICBwcml2YXRlOgorICAgIE1hY2hpbmVGdW5jdGlvbiAmTUY7CisgICAgTGl2ZUludGVydmFscyAmTElTOworICAgIFZpcnRSZWdNYXAgKlZSTTsKKyAgICBjb25zdCBNYWNoaW5lTG9vcEluZm8gJkxvb3BzOworICAgIGNvbnN0IE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8gJk1CRkk7CisgICAgRGVuc2VNYXA8dW5zaWduZWQsIGZsb2F0PiBIaW50OworICAgIE5vcm1hbGl6aW5nRm4gbm9ybWFsaXplOworCisgIHB1YmxpYzoKKyAgICBWaXJ0UmVnQXV4SW5mbyhNYWNoaW5lRnVuY3Rpb24gJm1mLCBMaXZlSW50ZXJ2YWxzICZsaXMsCisgICAgICAgICAgICAgICAgICAgVmlydFJlZ01hcCAqdnJtLCBjb25zdCBNYWNoaW5lTG9vcEluZm8gJmxvb3BzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8gJm1iZmksCisgICAgICAgICAgICAgICAgICAgTm9ybWFsaXppbmdGbiBub3JtID0gbm9ybWFsaXplU3BpbGxXZWlnaHQpCisgICAgICAgIDogTUYobWYpLCBMSVMobGlzKSwgVlJNKHZybSksIExvb3BzKGxvb3BzKSwgTUJGSShtYmZpKSwgbm9ybWFsaXplKG5vcm0pIHt9CisKKyAgICAvLy8gXGJyaWVmIChyZSljb21wdXRlIGxpJ3Mgc3BpbGwgd2VpZ2h0IGFuZCBhbGxvY2F0aW9uIGhpbnQuCisgICAgdm9pZCBjYWxjdWxhdGVTcGlsbFdlaWdodEFuZEhpbnQoTGl2ZUludGVydmFsICZsaSk7CisKKyAgICAvLy8gXGJyaWVmIENvbXB1dGUgZnV0dXJlIGV4cGVjdGVkIHNwaWxsIHdlaWdodCBvZiBhIHNwbGl0IGFydGlmYWN0IG9mIGxpCisgICAgLy8vIHRoYXQgd2lsbCBzcGFuIGJldHdlZW4gc3RhcnQgYW5kIGVuZCBzbG90IGluZGV4ZXMuCisgICAgLy8vIFxwYXJhbSBsaSAgICAgVGhlIGxpdmUgaW50ZXJ2YWwgdG8gYmUgc3BsaXQuCisgICAgLy8vIFxwYXJhbSBzdGFydCAgVGhlIGV4cGVjdGVkIGJlZ2luaW5nIG9mIHRoZSBzcGxpdCBhcnRpZmFjdC4gSW5zdHJ1Y3Rpb25zCisgICAgLy8vICAgICAgICAgICAgICAgYmVmb3JlIHN0YXJ0IHdpbGwgbm90IGFmZmVjdCB0aGUgd2VpZ2h0LgorICAgIC8vLyBccGFyYW0gZW5kICAgIFRoZSBleHBlY3RlZCBlbmQgb2YgdGhlIHNwbGl0IGFydGlmYWN0LiBJbnN0cnVjdGlvbnMKKyAgICAvLy8gICAgICAgICAgICAgICBhZnRlciBlbmQgd2lsbCBub3QgYWZmZWN0IHRoZSB3ZWlnaHQuCisgICAgLy8vIFxyZXR1cm4gVGhlIGV4cGVjdGVkIHNwaWxsIHdlaWdodCBvZiB0aGUgc3BsaXQgYXJ0aWZhY3QuIFJldHVybnMKKyAgICAvLy8gbmVnYXRpdmUgd2VpZ2h0IGZvciB1bnNwaWxsYWJsZSBsaS4KKyAgICBmbG9hdCBmdXR1cmVXZWlnaHQoTGl2ZUludGVydmFsICZsaSwgU2xvdEluZGV4IHN0YXJ0LCBTbG90SW5kZXggZW5kKTsKKworICAgIC8vLyBcYnJpZWYgSGVscGVyIGZ1bmN0aW9uIGZvciB3ZWlnaHQgY2FsY3VsYXRpb25zLgorICAgIC8vLyAoUmUpY29tcHV0ZSBsaSdzIHNwaWxsIHdlaWdodCBhbmQgYWxsb2NhdGlvbiBoaW50LCBvciwgZm9yIG5vbiBudWxsCisgICAgLy8vIHN0YXJ0IGFuZCBlbmQgLSBjb21wdXRlIGZ1dHVyZSBleHBlY3RlZCBzcGlsbCB3ZWlnaHQgb2YgYSBzcGxpdAorICAgIC8vLyBhcnRpZmFjdCBvZiBsaSB0aGF0IHdpbGwgc3BhbiBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgc2xvdCBpbmRleGVzLgorICAgIC8vLyBccGFyYW0gbGkgICAgIFRoZSBsaXZlIGludGVydmFsIGZvciB3aGljaCB0byBjb21wdXRlIHRoZSB3ZWlnaHQuCisgICAgLy8vIFxwYXJhbSBzdGFydCAgVGhlIGV4cGVjdGVkIGJlZ2luaW5nIG9mIHRoZSBzcGxpdCBhcnRpZmFjdC4gSW5zdHJ1Y3Rpb25zCisgICAgLy8vICAgICAgICAgICAgICAgYmVmb3JlIHN0YXJ0IHdpbGwgbm90IGFmZmVjdCB0aGUgd2VpZ2h0LiBSZWxldmFudCBmb3IKKyAgICAvLy8gICAgICAgICAgICAgICB3ZWlnaHQgY2FsY3VsYXRpb24gb2YgZnV0dXJlIHNwbGl0IGFydGlmYWN0LgorICAgIC8vLyBccGFyYW0gZW5kICAgIFRoZSBleHBlY3RlZCBlbmQgb2YgdGhlIHNwbGl0IGFydGlmYWN0LiBJbnN0cnVjdGlvbnMKKyAgICAvLy8gICAgICAgICAgICAgICBhZnRlciBlbmQgd2lsbCBub3QgYWZmZWN0IHRoZSB3ZWlnaHQuIFJlbGV2YW50IGZvcgorICAgIC8vLyAgICAgICAgICAgICAgIHdlaWdodCBjYWxjdWxhdGlvbiBvZiBmdXR1cmUgc3BsaXQgYXJ0aWZhY3QuCisgICAgLy8vIFxyZXR1cm4gVGhlIHNwaWxsIHdlaWdodC4gUmV0dXJucyBuZWdhdGl2ZSB3ZWlnaHQgZm9yIHVuc3BpbGxhYmxlIGxpLgorICAgIGZsb2F0IHdlaWdodENhbGNIZWxwZXIoTGl2ZUludGVydmFsICZsaSwgU2xvdEluZGV4ICpzdGFydCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90SW5kZXggKmVuZCA9IG51bGxwdHIpOworICB9OworCisgIC8vLyBcYnJpZWYgQ29tcHV0ZSBzcGlsbCB3ZWlnaHRzIGFuZCBhbGxvY2F0aW9uIGhpbnRzIGZvciBhbGwgdmlydHVhbCByZWdpc3RlcgorICAvLy8gbGl2ZSBpbnRlcnZhbHMuCisgIHZvaWQgY2FsY3VsYXRlU3BpbGxXZWlnaHRzQW5kSGludHMoTGl2ZUludGVydmFscyAmTElTLCBNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpcnRSZWdNYXAgKlZSTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lTG9vcEluZm8gJk1MSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvICZNQkZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpcnRSZWdBdXhJbmZvOjpOb3JtYWxpemluZ0ZuIG5vcm0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3JtYWxpemVTcGlsbFdlaWdodCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fQ0FMQ1NQSUxMV0VJR0hUU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vQ2FsbGluZ0NvbnZMb3dlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0NhbGxpbmdDb252TG93ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzBhMjczCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0NhbGxpbmdDb252TG93ZXIuaApAQCAtMCwwICsxLDU3NiBAQAorLy89PT0tIGxsdm0vQ2FsbGluZ0NvbnZMb3dlci5oIC0gQ2FsbGluZyBDb252ZW50aW9ucyAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIENDU3RhdGUgYW5kIENDVmFsQXNzaWduIGNsYXNzZXMsIHVzZWQgZm9yIGxvd2VyaW5nCisvLyBhbmQgaW1wbGVtZW50aW5nIGNhbGxpbmcgY29udmVudGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fQ0FMTElOR0NPTlZMT1dFUl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9DQUxMSU5HQ09OVkxPV0VSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldENhbGxpbmdDb252LmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsaW5nQ29udi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNSZWdpc3RlckluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBDQ1N0YXRlOworY2xhc3MgTVZUOworY2xhc3MgVGFyZ2V0TWFjaGluZTsKK2NsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKKworLy8vIENDVmFsQXNzaWduIC0gUmVwcmVzZW50IGFzc2lnbm1lbnQgb2Ygb25lIGFyZy9yZXR2YWwgdG8gYSBsb2NhdGlvbi4KK2NsYXNzIENDVmFsQXNzaWduIHsKK3B1YmxpYzoKKyAgZW51bSBMb2NJbmZvIHsKKyAgICBGdWxsLCAgICAgIC8vIFRoZSB2YWx1ZSBmaWxscyB0aGUgZnVsbCBsb2NhdGlvbi4KKyAgICBTRXh0LCAgICAgIC8vIFRoZSB2YWx1ZSBpcyBzaWduIGV4dGVuZGVkIGluIHRoZSBsb2NhdGlvbi4KKyAgICBaRXh0LCAgICAgIC8vIFRoZSB2YWx1ZSBpcyB6ZXJvIGV4dGVuZGVkIGluIHRoZSBsb2NhdGlvbi4KKyAgICBBRXh0LCAgICAgIC8vIFRoZSB2YWx1ZSBpcyBleHRlbmRlZCB3aXRoIHVuZGVmaW5lZCB1cHBlciBiaXRzLgorICAgIFNFeHRVcHBlciwgLy8gVGhlIHZhbHVlIGlzIGluIHRoZSB1cHBlciBiaXRzIG9mIHRoZSBsb2NhdGlvbiBhbmQgc2hvdWxkIGJlCisgICAgICAgICAgICAgICAvLyBzaWduIGV4dGVuZGVkIHdoZW4gcmV0cmlldmVkLgorICAgIFpFeHRVcHBlciwgLy8gVGhlIHZhbHVlIGlzIGluIHRoZSB1cHBlciBiaXRzIG9mIHRoZSBsb2NhdGlvbiBhbmQgc2hvdWxkIGJlCisgICAgICAgICAgICAgICAvLyB6ZXJvIGV4dGVuZGVkIHdoZW4gcmV0cmlldmVkLgorICAgIEFFeHRVcHBlciwgLy8gVGhlIHZhbHVlIGlzIGluIHRoZSB1cHBlciBiaXRzIG9mIHRoZSBsb2NhdGlvbiBhbmQgc2hvdWxkIGJlCisgICAgICAgICAgICAgICAvLyBleHRlbmRlZCB3aXRoIHVuZGVmaW5lZCB1cHBlciBiaXRzIHdoZW4gcmV0cmlldmVkLgorICAgIEJDdnQsICAgICAgLy8gVGhlIHZhbHVlIGlzIGJpdC1jb252ZXJ0ZWQgaW4gdGhlIGxvY2F0aW9uLgorICAgIFZFeHQsICAgICAgLy8gVGhlIHZhbHVlIGlzIHZlY3Rvci13aWRlbmVkIGluIHRoZSBsb2NhdGlvbi4KKyAgICAgICAgICAgICAgIC8vIEZJWE1FOiBOb3QgaW1wbGVtZW50ZWQgeWV0LiBDb2RlIHRoYXQgdXNlcyBBRXh0IHRvIG1lYW4KKyAgICAgICAgICAgICAgIC8vIHZlY3Rvci13aWRlbiBzaG91bGQgYmUgZml4ZWQgdG8gdXNlIFZFeHQgaW5zdGVhZC4KKyAgICBGUEV4dCwgICAgIC8vIFRoZSBmbG9hdGluZy1wb2ludCB2YWx1ZSBpcyBmcC1leHRlbmRlZCBpbiB0aGUgbG9jYXRpb24uCisgICAgSW5kaXJlY3QgICAvLyBUaGUgbG9jYXRpb24gY29udGFpbnMgcG9pbnRlciB0byB0aGUgdmFsdWUuCisgICAgLy8gVE9ETzogYSBzdWJzZXQgb2YgdGhlIHZhbHVlIGlzIGluIHRoZSBsb2NhdGlvbi4KKyAgfTsKKworcHJpdmF0ZToKKyAgLy8vIFZhbE5vIC0gVGhpcyBpcyB0aGUgdmFsdWUgbnVtYmVyIGJlZ2luIGFzc2lnbmVkIChlLmcuIGFuIGFyZ3VtZW50IG51bWJlcikuCisgIHVuc2lnbmVkIFZhbE5vOworCisgIC8vLyBMb2MgaXMgZWl0aGVyIGEgc3RhY2sgb2Zmc2V0IG9yIGEgcmVnaXN0ZXIgbnVtYmVyLgorICB1bnNpZ25lZCBMb2M7CisKKyAgLy8vIGlzTWVtIC0gVHJ1ZSBpZiB0aGlzIGlzIGEgbWVtb3J5IGxvYywgZmFsc2UgaWYgaXQgaXMgYSByZWdpc3RlciBsb2MuCisgIHVuc2lnbmVkIGlzTWVtIDogMTsKKworICAvLy8gaXNDdXN0b20gLSBUcnVlIGlmIHRoaXMgYXJnL3JldHZhbCByZXF1aXJlcyBzcGVjaWFsIGhhbmRsaW5nLgorICB1bnNpZ25lZCBpc0N1c3RvbSA6IDE7CisKKyAgLy8vIEluZm9ybWF0aW9uIGFib3V0IGhvdyB0aGUgdmFsdWUgaXMgYXNzaWduZWQuCisgIExvY0luZm8gSFRQIDogNjsKKworICAvLy8gVmFsVlQgLSBUaGUgdHlwZSBvZiB0aGUgdmFsdWUgYmVpbmcgYXNzaWduZWQuCisgIE1WVCBWYWxWVDsKKworICAvLy8gTG9jVlQgLSBUaGUgdHlwZSBvZiB0aGUgbG9jYXRpb24gYmVpbmcgYXNzaWduZWQgdG8uCisgIE1WVCBMb2NWVDsKK3B1YmxpYzoKKworICBzdGF0aWMgQ0NWYWxBc3NpZ24gZ2V0UmVnKHVuc2lnbmVkIFZhbE5vLCBNVlQgVmFsVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnTm8sIE1WVCBMb2NWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NJbmZvIEhUUCkgeworICAgIENDVmFsQXNzaWduIFJldDsKKyAgICBSZXQuVmFsTm8gPSBWYWxObzsKKyAgICBSZXQuTG9jID0gUmVnTm87CisgICAgUmV0LmlzTWVtID0gZmFsc2U7CisgICAgUmV0LmlzQ3VzdG9tID0gZmFsc2U7CisgICAgUmV0LkhUUCA9IEhUUDsKKyAgICBSZXQuVmFsVlQgPSBWYWxWVDsKKyAgICBSZXQuTG9jVlQgPSBMb2NWVDsKKyAgICByZXR1cm4gUmV0OworICB9CisKKyAgc3RhdGljIENDVmFsQXNzaWduIGdldEN1c3RvbVJlZyh1bnNpZ25lZCBWYWxObywgTVZUIFZhbFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlZ05vLCBNVlQgTG9jVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jSW5mbyBIVFApIHsKKyAgICBDQ1ZhbEFzc2lnbiBSZXQ7CisgICAgUmV0ID0gZ2V0UmVnKFZhbE5vLCBWYWxWVCwgUmVnTm8sIExvY1ZULCBIVFApOworICAgIFJldC5pc0N1c3RvbSA9IHRydWU7CisgICAgcmV0dXJuIFJldDsKKyAgfQorCisgIHN0YXRpYyBDQ1ZhbEFzc2lnbiBnZXRNZW0odW5zaWduZWQgVmFsTm8sIE1WVCBWYWxWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPZmZzZXQsIE1WVCBMb2NWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2NJbmZvIEhUUCkgeworICAgIENDVmFsQXNzaWduIFJldDsKKyAgICBSZXQuVmFsTm8gPSBWYWxObzsKKyAgICBSZXQuTG9jID0gT2Zmc2V0OworICAgIFJldC5pc01lbSA9IHRydWU7CisgICAgUmV0LmlzQ3VzdG9tID0gZmFsc2U7CisgICAgUmV0LkhUUCA9IEhUUDsKKyAgICBSZXQuVmFsVlQgPSBWYWxWVDsKKyAgICBSZXQuTG9jVlQgPSBMb2NWVDsKKyAgICByZXR1cm4gUmV0OworICB9CisKKyAgc3RhdGljIENDVmFsQXNzaWduIGdldEN1c3RvbU1lbSh1bnNpZ25lZCBWYWxObywgTVZUIFZhbFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9mZnNldCwgTVZUIExvY1ZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvY0luZm8gSFRQKSB7CisgICAgQ0NWYWxBc3NpZ24gUmV0OworICAgIFJldCA9IGdldE1lbShWYWxObywgVmFsVlQsIE9mZnNldCwgTG9jVlQsIEhUUCk7CisgICAgUmV0LmlzQ3VzdG9tID0gdHJ1ZTsKKyAgICByZXR1cm4gUmV0OworICB9CisKKyAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYSBwZW5kaW5nIENDVmFsQXNzaWduIGFuZCBvdGhlcgorICAvLyBraW5kcywgYXMgdGhleSBhcmUgc3RvcmVkIGluIGEgZGlmZmVyZW50IGxpc3QuCisgIHN0YXRpYyBDQ1ZhbEFzc2lnbiBnZXRQZW5kaW5nKHVuc2lnbmVkIFZhbE5vLCBNVlQgVmFsVlQsIE1WVCBMb2NWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9jSW5mbyBIVFAsIHVuc2lnbmVkIEV4dHJhSW5mbyA9IDApIHsKKyAgICByZXR1cm4gZ2V0UmVnKFZhbE5vLCBWYWxWVCwgRXh0cmFJbmZvLCBMb2NWVCwgSFRQKTsKKyAgfQorCisgIHZvaWQgY29udmVydFRvUmVnKHVuc2lnbmVkIFJlZ05vKSB7CisgICAgTG9jID0gUmVnTm87CisgICAgaXNNZW0gPSBmYWxzZTsKKyAgfQorCisgIHZvaWQgY29udmVydFRvTWVtKHVuc2lnbmVkIE9mZnNldCkgeworICAgIExvYyA9IE9mZnNldDsKKyAgICBpc01lbSA9IHRydWU7CisgIH0KKworICB1bnNpZ25lZCBnZXRWYWxObygpIGNvbnN0IHsgcmV0dXJuIFZhbE5vOyB9CisgIE1WVCBnZXRWYWxWVCgpIGNvbnN0IHsgcmV0dXJuIFZhbFZUOyB9CisKKyAgYm9vbCBpc1JlZ0xvYygpIGNvbnN0IHsgcmV0dXJuICFpc01lbTsgfQorICBib29sIGlzTWVtTG9jKCkgY29uc3QgeyByZXR1cm4gaXNNZW07IH0KKworICBib29sIG5lZWRzQ3VzdG9tKCkgY29uc3QgeyByZXR1cm4gaXNDdXN0b207IH0KKworICB1bnNpZ25lZCBnZXRMb2NSZWcoKSBjb25zdCB7IGFzc2VydChpc1JlZ0xvYygpKTsgcmV0dXJuIExvYzsgfQorICB1bnNpZ25lZCBnZXRMb2NNZW1PZmZzZXQoKSBjb25zdCB7IGFzc2VydChpc01lbUxvYygpKTsgcmV0dXJuIExvYzsgfQorICB1bnNpZ25lZCBnZXRFeHRyYUluZm8oKSBjb25zdCB7IHJldHVybiBMb2M7IH0KKyAgTVZUIGdldExvY1ZUKCkgY29uc3QgeyByZXR1cm4gTG9jVlQ7IH0KKworICBMb2NJbmZvIGdldExvY0luZm8oKSBjb25zdCB7IHJldHVybiBIVFA7IH0KKyAgYm9vbCBpc0V4dEluTG9jKCkgY29uc3QgeworICAgIHJldHVybiAoSFRQID09IEFFeHQgfHwgSFRQID09IFNFeHQgfHwgSFRQID09IFpFeHQpOworICB9CisKKyAgYm9vbCBpc1VwcGVyQml0c0luTG9jKCkgY29uc3QgeworICAgIHJldHVybiBIVFAgPT0gQUV4dFVwcGVyIHx8IEhUUCA9PSBTRXh0VXBwZXIgfHwgSFRQID09IFpFeHRVcHBlcjsKKyAgfQorfTsKKworLy8vIERlc2NyaWJlcyBhIHJlZ2lzdGVyIHRoYXQgbmVlZHMgdG8gYmUgZm9yd2FyZGVkIGZyb20gdGhlIHByb2xvZ3VlIHRvIGEKKy8vLyBtdXN0dGFpbCBjYWxsLgorc3RydWN0IEZvcndhcmRlZFJlZ2lzdGVyIHsKKyAgRm9yd2FyZGVkUmVnaXN0ZXIodW5zaWduZWQgVlJlZywgTUNQaHlzUmVnIFBSZWcsIE1WVCBWVCkKKyAgICAgIDogVlJlZyhWUmVnKSwgUFJlZyhQUmVnKSwgVlQoVlQpIHt9CisgIHVuc2lnbmVkIFZSZWc7CisgIE1DUGh5c1JlZyBQUmVnOworICBNVlQgVlQ7Cit9OworCisvLy8gQ0NBc3NpZ25GbiAtIFRoaXMgZnVuY3Rpb24gYXNzaWducyBhIGxvY2F0aW9uIGZvciBWYWwsIHVwZGF0aW5nIFN0YXRlIHRvCisvLy8gcmVmbGVjdCB0aGUgY2hhbmdlLiAgSXQgcmV0dXJucyAndHJ1ZScgaWYgaXQgZmFpbGVkIHRvIGhhbmRsZSBWYWwuCit0eXBlZGVmIGJvb2wgQ0NBc3NpZ25Gbih1bnNpZ25lZCBWYWxObywgTVZUIFZhbFZULAorICAgICAgICAgICAgICAgICAgICAgICAgTVZUIExvY1ZULCBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyBMb2NJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpBcmdGbGFnc1R5IEFyZ0ZsYWdzLCBDQ1N0YXRlICZTdGF0ZSk7CisKKy8vLyBDQ0N1c3RvbUZuIC0gVGhpcyBmdW5jdGlvbiBhc3NpZ25zIGEgbG9jYXRpb24gZm9yIFZhbCwgcG9zc2libHkgdXBkYXRpbmcKKy8vLyBhbGwgYXJncyB0byByZWZsZWN0IGNoYW5nZXMgYW5kIGluZGljYXRlcyBpZiBpdCBoYW5kbGVkIGl0LiBJdCBtdXN0IHNldAorLy8vIGlzQ3VzdG9tIGlmIGl0IGhhbmRsZXMgdGhlIGFyZyBhbmQgcmV0dXJucyB0cnVlLgordHlwZWRlZiBib29sIENDQ3VzdG9tRm4odW5zaWduZWQgJlZhbE5vLCBNVlQgJlZhbFZULAorICAgICAgICAgICAgICAgICAgICAgICAgTVZUICZMb2NWVCwgQ0NWYWxBc3NpZ246OkxvY0luZm8gJkxvY0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICBJU0Q6OkFyZ0ZsYWdzVHkgJkFyZ0ZsYWdzLCBDQ1N0YXRlICZTdGF0ZSk7CisKKy8vLyBDQ1N0YXRlIC0gVGhpcyBjbGFzcyBob2xkcyBpbmZvcm1hdGlvbiBuZWVkZWQgd2hpbGUgbG93ZXJpbmcgYXJndW1lbnRzIGFuZAorLy8vIHJldHVybiB2YWx1ZXMuICBJdCBjYXB0dXJlcyB3aGljaCByZWdpc3RlcnMgYXJlIGFscmVhZHkgYXNzaWduZWQgYW5kIHdoaWNoCisvLy8gc3RhY2sgc2xvdHMgYXJlIHVzZWQuICBJdCBwcm92aWRlcyBhY2Nlc3NvcnMgdG8gYWxsb2NhdGUgdGhlc2UgdmFsdWVzLgorY2xhc3MgQ0NTdGF0ZSB7Citwcml2YXRlOgorICBDYWxsaW5nQ29udjo6SUQgQ2FsbGluZ0NvbnY7CisgIGJvb2wgSXNWYXJBcmc7CisgIGJvb2wgQW5hbHl6aW5nTXVzdFRhaWxGb3J3YXJkZWRSZWdzID0gZmFsc2U7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUY7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJOworICBTbWFsbFZlY3RvckltcGw8Q0NWYWxBc3NpZ24+ICZMb2NzOworICBMTFZNQ29udGV4dCAmQ29udGV4dDsKKworICB1bnNpZ25lZCBTdGFja09mZnNldDsKKyAgdW5zaWduZWQgTWF4U3RhY2tBcmdBbGlnbjsKKyAgU21hbGxWZWN0b3I8dWludDMyX3QsIDE2PiBVc2VkUmVnczsKKyAgU21hbGxWZWN0b3I8Q0NWYWxBc3NpZ24sIDQ+IFBlbmRpbmdMb2NzOworICBTbWFsbFZlY3RvcjxJU0Q6OkFyZ0ZsYWdzVHksIDQ+IFBlbmRpbmdBcmdGbGFnczsKKworICAvLyBCeVZhbEluZm8gYW5kIFNtYWxsVmVjdG9yPEJ5VmFsSW5mbywgND4gQnlWYWxSZWdzOgorICAvLworICAvLyBWZWN0b3Igb2YgQnlWYWxJbmZvIGluc3RhbmNlcyAoQnlWYWxSZWdzKSBpcyBpbnRyb2R1Y2VkIGZvciBieXZhbCByZWdpc3RlcnMKKyAgLy8gdHJhY2tpbmcuCisgIC8vIE9yLCBpbiBhbm90aGVyIHdvcmRzIGl0IHRyYWNrcyBieXZhbCBwYXJhbWV0ZXJzIHRoYXQgYXJlIHN0b3JlZCBpbgorICAvLyBnZW5lcmFsIHB1cnBvc2UgcmVnaXN0ZXJzLgorICAvLworICAvLyBGb3IgNCBieXRlIHN0YWNrIGFsaWdubWVudCwKKyAgLy8gaW5zdGFuY2UgaW5kZXggbWVhbnMgYnl2YWwgcGFyYW1ldGVyIG51bWJlciBpbiBmb3JtYWwKKyAgLy8gYXJndW1lbnRzIHNldC4gQXNzdW1lLCB3ZSBoYXZlIHNvbWUgInN0cnVjdF90eXBlIiB3aXRoIHNpemUgPSA0IGJ5dGVzLAorICAvLyB0aGVuLCBmb3IgZnVuY3Rpb24gImZvbyI6CisgIC8vCisgIC8vIGkzMiBmb28oaTMyICVwLCAlc3RydWN0X3R5cGUqICVyLCBpMzIgJXMsICVzdHJ1Y3RfdHlwZSogJXQpCisgIC8vCisgIC8vIEJ5VmFsUmVnc1swXSBkZXNjcmliZXMgaG93ICIlciIgaXMgc3RvcmVkIChCZWdpbiA9PSByMSwgRW5kID09IHIyKQorICAvLyBCeVZhbFJlZ3NbMV0gZGVzY3JpYmVzIGhvdyAiJXQiIGlzIHN0b3JlZCAoQmVnaW4gPT0gcjMsIEVuZCA9PSByNCkuCisgIC8vCisgIC8vIEluIGNhc2Ugb2YgOCBieXRlcyBzdGFjayBhbGlnbm1lbnQsCisgIC8vIEJ5VmFsUmVncyBtYXkgYWxzbyBjb250YWluIGluZm9ybWF0aW9uIGFib3V0IHdhc3RlZCByZWdpc3RlcnMuCisgIC8vIEluIGZ1bmN0aW9uIHNob3duIGFib3ZlLCByMyB3b3VsZCBiZSB3YXN0ZWQgYWNjb3JkaW5nIHRvIEFBUENTIHJ1bGVzLgorICAvLyBBbmQgaW4gdGhhdCBjYXNlIEJ5VmFsUmVnc1sxXS5XYXN0ZSB3b3VsZCBiZSAidHJ1ZSIuCisgIC8vIEJ5VmFsUmVncyB2ZWN0b3Igc2l6ZSBzdGlsbCB3b3VsZCBiZSAyLAorICAvLyB3aGlsZSAiJXQiIGdvZXMgdG8gdGhlIHN0YWNrOiBpdCB3b3VsZG4ndCBiZSBkZXNjcmliZWQgaW4gQnlWYWxSZWdzLgorICAvLworICAvLyBTdXBwb3NlZCB1c2UtY2FzZSBmb3IgdGhpcyBjb2xsZWN0aW9uOgorICAvLyAxLiBJbml0aWFsbHkgQnlWYWxSZWdzIGlzIGVtcHR5LCBJblJlZ3NQYXJhbXNQcm9jZXNzZWQgaXMgMC4KKyAgLy8gMi4gSGFuZGxlQnlWYWwgZmlsbHVwcyBCeVZhbFJlZ3MuCisgIC8vIDMuIEFyZ3VtZW50IGFuYWx5c2lzIChMb3dlckZvcm1hdEFyZ3VtZW50cywgZm9yIGV4YW1wbGUpLiBBZnRlcgorICAvLyBzb21lIGJ5dmFsIGFyZ3VtZW50IHdhcyBhbmFseXplZCwgSW5SZWdzUGFyYW1zUHJvY2Vzc2VkIGlzIGluY3JlYXNlZC4KKyAgc3RydWN0IEJ5VmFsSW5mbyB7CisgICAgQnlWYWxJbmZvKHVuc2lnbmVkIEIsIHVuc2lnbmVkIEUsIGJvb2wgSXNXYXN0ZSA9IGZhbHNlKSA6CisgICAgICBCZWdpbihCKSwgRW5kKEUpLCBXYXN0ZShJc1dhc3RlKSB7fQorICAgIC8vIEZpcnN0IHJlZ2lzdGVyIGFsbG9jYXRlZCBmb3IgY3VycmVudCBwYXJhbWV0ZXIuCisgICAgdW5zaWduZWQgQmVnaW47CisKKyAgICAvLyBGaXJzdCBhZnRlciBsYXN0IHJlZ2lzdGVyIGFsbG9jYXRlZCBmb3IgY3VycmVudCBwYXJhbWV0ZXIuCisgICAgdW5zaWduZWQgRW5kOworCisgICAgLy8gTWVhbnMgdGhhdCBjdXJyZW50IHJhbmdlIG9mIHJlZ2lzdGVycyBkb2Vzbid0IGJlbG9uZyB0byBhbnkKKyAgICAvLyBwYXJhbWV0ZXJzLiBJdCB3YXMgd2FzdGVkIGR1ZSB0byBzdGFjayBhbGlnbm1lbnQgcnVsZXMuCisgICAgLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24gc2VlOgorICAgIC8vIEFBUENTLCA1LjUgUGFyYW1ldGVyIFBhc3NpbmcsIFN0YWdlIEMsIEMuMy4KKyAgICBib29sIFdhc3RlOworICB9OworICBTbWFsbFZlY3RvcjxCeVZhbEluZm8sIDQgPiBCeVZhbFJlZ3M7CisKKyAgLy8gSW5SZWdzUGFyYW1zUHJvY2Vzc2VkIC0gc2hvd3MgaG93IG1hbnkgaW5zdGFuY2VzIG9mIEJ5VmFsUmVncyB3YXMgcHJvY2VlZAorICAvLyBkdXJpbmcgYXJndW1lbnQgYW5hbHlzaXMuCisgIHVuc2lnbmVkIEluUmVnc1BhcmFtc1Byb2Nlc3NlZDsKKworcHVibGljOgorICBDQ1N0YXRlKENhbGxpbmdDb252OjpJRCBDQywgYm9vbCBpc1ZhckFyZywgTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Q0NWYWxBc3NpZ24+ICZsb2NzLCBMTFZNQ29udGV4dCAmQyk7CisKKyAgdm9pZCBhZGRMb2MoY29uc3QgQ0NWYWxBc3NpZ24gJlYpIHsKKyAgICBMb2NzLnB1c2hfYmFjayhWKTsKKyAgfQorCisgIExMVk1Db250ZXh0ICZnZXRDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gQ29udGV4dDsgfQorICBNYWNoaW5lRnVuY3Rpb24gJmdldE1hY2hpbmVGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIE1GOyB9CisgIENhbGxpbmdDb252OjpJRCBnZXRDYWxsaW5nQ29udigpIGNvbnN0IHsgcmV0dXJuIENhbGxpbmdDb252OyB9CisgIGJvb2wgaXNWYXJBcmcoKSBjb25zdCB7IHJldHVybiBJc1ZhckFyZzsgfQorCisgIC8vLyBnZXROZXh0U3RhY2tPZmZzZXQgLSBSZXR1cm4gdGhlIG5leHQgc3RhY2sgb2Zmc2V0IHN1Y2ggdGhhdCBhbGwgc3RhY2sKKyAgLy8vIHNsb3RzIHNhdGlzZnkgdGhlaXIgYWxpZ25tZW50IHJlcXVpcmVtZW50cy4KKyAgdW5zaWduZWQgZ2V0TmV4dFN0YWNrT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBTdGFja09mZnNldDsKKyAgfQorCisgIC8vLyBnZXRBbGlnbmVkQ2FsbEZyYW1lU2l6ZSAtIFJldHVybiB0aGUgc2l6ZSBvZiB0aGUgY2FsbCBmcmFtZSBuZWVkZWQgdG8KKyAgLy8vIGJlIGFibGUgdG8gc3RvcmUgYWxsIGFyZ3VtZW50cyBhbmQgc3VjaCB0aGF0IHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQKKyAgLy8vIG9mIGVhY2ggb2YgdGhlIGFyZ3VtZW50cyBpcyBzYXRpc2ZpZWQuCisgIHVuc2lnbmVkIGdldEFsaWduZWRDYWxsRnJhbWVTaXplKCkgY29uc3QgeworICAgIHJldHVybiBhbGlnblRvKFN0YWNrT2Zmc2V0LCBNYXhTdGFja0FyZ0FsaWduKTsKKyAgfQorCisgIC8vLyBpc0FsbG9jYXRlZCAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgKG9yIGFuIGFsaWFzKSBpcworICAvLy8gYWxsb2NhdGVkLgorICBib29sIGlzQWxsb2NhdGVkKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIHJldHVybiBVc2VkUmVnc1tSZWcvMzJdICYgKDEgPDwgKFJlZyYzMSkpOworICB9CisKKyAgLy8vIEFuYWx5emVGb3JtYWxBcmd1bWVudHMgLSBBbmFseXplIGFuIGFycmF5IG9mIGFyZ3VtZW50IHZhbHVlcywKKyAgLy8vIGluY29ycG9yYXRpbmcgaW5mbyBhYm91dCB0aGUgZm9ybWFscyBpbnRvIHRoaXMgc3RhdGUuCisgIHZvaWQgQW5hbHl6ZUZvcm1hbEFyZ3VtZW50cyhjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDQXNzaWduRm4gRm4pOworCisgIC8vLyBUaGUgZnVuY3Rpb24gd2lsbCBpbnZva2UgQW5hbHl6ZUZvcm1hbEFyZ3VtZW50cy4KKyAgdm9pZCBBbmFseXplQXJndW1lbnRzKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmSW5zLAorICAgICAgICAgICAgICAgICAgICAgICAgQ0NBc3NpZ25GbiBGbikgeworICAgIEFuYWx5emVGb3JtYWxBcmd1bWVudHMoSW5zLCBGbik7CisgIH0KKworICAvLy8gQW5hbHl6ZVJldHVybiAtIEFuYWx5emUgdGhlIHJldHVybmVkIHZhbHVlcyBvZiBhIHJldHVybiwKKyAgLy8vIGluY29ycG9yYXRpbmcgaW5mbyBhYm91dCB0aGUgcmVzdWx0IHZhbHVlcyBpbnRvIHRoaXMgc3RhdGUuCisgIHZvaWQgQW5hbHl6ZVJldHVybihjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgQ0NBc3NpZ25GbiBGbik7CisKKyAgLy8vIENoZWNrUmV0dXJuIC0gQW5hbHl6ZSB0aGUgcmV0dXJuIHZhbHVlcyBvZiBhIGZ1bmN0aW9uLCByZXR1cm5pbmcKKyAgLy8vIHRydWUgaWYgdGhlIHJldHVybiBjYW4gYmUgcGVyZm9ybWVkIHdpdGhvdXQgc3JldC1kZW1vdGlvbiwgYW5kCisgIC8vLyBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgQ2hlY2tSZXR1cm4oY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmQXJnc0ZsYWdzLAorICAgICAgICAgICAgICAgICAgIENDQXNzaWduRm4gRm4pOworCisgIC8vLyBBbmFseXplQ2FsbE9wZXJhbmRzIC0gQW5hbHl6ZSB0aGUgb3V0Z29pbmcgYXJndW1lbnRzIHRvIGEgY2FsbCwKKyAgLy8vIGluY29ycG9yYXRpbmcgaW5mbyBhYm91dCB0aGUgcGFzc2VkIHZhbHVlcyBpbnRvIHRoaXMgc3RhdGUuCisgIHZvaWQgQW5hbHl6ZUNhbGxPcGVyYW5kcyhjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICZPdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NBc3NpZ25GbiBGbik7CisKKyAgLy8vIEFuYWx5emVDYWxsT3BlcmFuZHMgLSBTYW1lIGFzIGFib3ZlIGV4Y2VwdCBpdCB0YWtlcyB2ZWN0b3JzIG9mIHR5cGVzCisgIC8vLyBhbmQgYXJndW1lbnQgZmxhZ3MuCisgIHZvaWQgQW5hbHl6ZUNhbGxPcGVyYW5kcyhTbWFsbFZlY3RvckltcGw8TVZUPiAmQXJnVlRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPElTRDo6QXJnRmxhZ3NUeT4gJkZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NBc3NpZ25GbiBGbik7CisKKyAgLy8vIFRoZSBmdW5jdGlvbiB3aWxsIGludm9rZSBBbmFseXplQ2FsbE9wZXJhbmRzLgorICB2b2lkIEFuYWx5emVBcmd1bWVudHMoY29uc3QgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIENDQXNzaWduRm4gRm4pIHsKKyAgICBBbmFseXplQ2FsbE9wZXJhbmRzKE91dHMsIEZuKTsKKyAgfQorCisgIC8vLyBBbmFseXplQ2FsbFJlc3VsdCAtIEFuYWx5emUgdGhlIHJldHVybiB2YWx1ZXMgb2YgYSBjYWxsLAorICAvLy8gaW5jb3Jwb3JhdGluZyBpbmZvIGFib3V0IHRoZSBwYXNzZWQgdmFsdWVzIGludG8gdGhpcyBzdGF0ZS4KKyAgdm9pZCBBbmFseXplQ2FsbFJlc3VsdChjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDQ0Fzc2lnbkZuIEZuKTsKKworICAvLy8gQSBzaGFkb3cgYWxsb2NhdGVkIHJlZ2lzdGVyIGlzIGEgcmVnaXN0ZXIgdGhhdCB3YXMgYWxsb2NhdGVkCisgIC8vLyBidXQgd2Fzbid0IGFkZGVkIHRvIHRoZSBsb2NhdGlvbiBsaXN0IChMb2NzKS4KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhlIHJlZ2lzdGVyIHdhcyBhbGxvY2F0ZWQgYXMgc2hhZG93IG9yIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBJc1NoYWRvd0FsbG9jYXRlZFJlZyh1bnNpZ25lZCBSZWcpIGNvbnN0OworCisgIC8vLyBBbmFseXplQ2FsbFJlc3VsdCAtIFNhbWUgYXMgYWJvdmUgZXhjZXB0IGl0J3Mgc3BlY2lhbGl6ZWQgZm9yIGNhbGxzIHdoaWNoCisgIC8vLyBwcm9kdWNlIGEgc2luZ2xlIHZhbHVlLgorICB2b2lkIEFuYWx5emVDYWxsUmVzdWx0KE1WVCBWVCwgQ0NBc3NpZ25GbiBGbik7CisKKyAgLy8vIGdldEZpcnN0VW5hbGxvY2F0ZWQgLSBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCB1bmFsbG9jYXRlZCByZWdpc3RlcgorICAvLy8gaW4gdGhlIHNldCwgb3IgUmVncy5zaXplKCkgaWYgdGhleSBhcmUgYWxsIGFsbG9jYXRlZC4KKyAgdW5zaWduZWQgZ2V0Rmlyc3RVbmFsbG9jYXRlZChBcnJheVJlZjxNQ1BoeXNSZWc+IFJlZ3MpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgUmVncy5zaXplKCk7ICsraSkKKyAgICAgIGlmICghaXNBbGxvY2F0ZWQoUmVnc1tpXSkpCisgICAgICAgIHJldHVybiBpOworICAgIHJldHVybiBSZWdzLnNpemUoKTsKKyAgfQorCisgIC8vLyBBbGxvY2F0ZVJlZyAtIEF0dGVtcHQgdG8gYWxsb2NhdGUgb25lIHJlZ2lzdGVyLiAgSWYgaXQgaXMgbm90IGF2YWlsYWJsZSwKKyAgLy8vIHJldHVybiB6ZXJvLiAgT3RoZXJ3aXNlLCByZXR1cm4gdGhlIHJlZ2lzdGVyLCBtYXJraW5nIGl0IGFuZCBhbnkgYWxpYXNlcworICAvLy8gYXMgYWxsb2NhdGVkLgorICB1bnNpZ25lZCBBbGxvY2F0ZVJlZyh1bnNpZ25lZCBSZWcpIHsKKyAgICBpZiAoaXNBbGxvY2F0ZWQoUmVnKSkgcmV0dXJuIDA7CisgICAgTWFya0FsbG9jYXRlZChSZWcpOworICAgIHJldHVybiBSZWc7CisgIH0KKworICAvLy8gVmVyc2lvbiBvZiBBbGxvY2F0ZVJlZyB3aXRoIGV4dHJhIHJlZ2lzdGVyIHRvIGJlIHNoYWRvd2VkLgorICB1bnNpZ25lZCBBbGxvY2F0ZVJlZyh1bnNpZ25lZCBSZWcsIHVuc2lnbmVkIFNoYWRvd1JlZykgeworICAgIGlmIChpc0FsbG9jYXRlZChSZWcpKSByZXR1cm4gMDsKKyAgICBNYXJrQWxsb2NhdGVkKFJlZyk7CisgICAgTWFya0FsbG9jYXRlZChTaGFkb3dSZWcpOworICAgIHJldHVybiBSZWc7CisgIH0KKworICAvLy8gQWxsb2NhdGVSZWcgLSBBdHRlbXB0IHRvIGFsbG9jYXRlIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVycy4gIElmIG5vbmUKKyAgLy8vIGFyZSBhdmFpbGFibGUsIHJldHVybiB6ZXJvLiAgT3RoZXJ3aXNlLCByZXR1cm4gdGhlIGZpcnN0IG9uZSBhdmFpbGFibGUsCisgIC8vLyBtYXJraW5nIGl0IGFuZCBhbnkgYWxpYXNlcyBhcyBhbGxvY2F0ZWQuCisgIHVuc2lnbmVkIEFsbG9jYXRlUmVnKEFycmF5UmVmPE1DUGh5c1JlZz4gUmVncykgeworICAgIHVuc2lnbmVkIEZpcnN0VW5hbGxvYyA9IGdldEZpcnN0VW5hbGxvY2F0ZWQoUmVncyk7CisgICAgaWYgKEZpcnN0VW5hbGxvYyA9PSBSZWdzLnNpemUoKSkKKyAgICAgIHJldHVybiAwOyAgICAvLyBEaWRuJ3QgZmluZCB0aGUgcmVnLgorCisgICAgLy8gTWFyayB0aGUgcmVnaXN0ZXIgYW5kIGFueSBhbGlhc2VzIGFzIGFsbG9jYXRlZC4KKyAgICB1bnNpZ25lZCBSZWcgPSBSZWdzW0ZpcnN0VW5hbGxvY107CisgICAgTWFya0FsbG9jYXRlZChSZWcpOworICAgIHJldHVybiBSZWc7CisgIH0KKworICAvLy8gQWxsb2NhdGVSZWdCbG9jayAtIEF0dGVtcHQgdG8gYWxsb2NhdGUgYSBibG9jayBvZiBSZWdzUmVxdWlyZWQgY29uc2VjdXRpdmUKKyAgLy8vIHJlZ2lzdGVycy4gSWYgdGhpcyBpcyBub3QgcG9zc2libGUsIHJldHVybiB6ZXJvLiBPdGhlcndpc2UsIHJldHVybiB0aGUgZmlyc3QKKyAgLy8vIHJlZ2lzdGVyIG9mIHRoZSBibG9jayB0aGF0IHdlcmUgYWxsb2NhdGVkLCBtYXJraW5nIHRoZSBlbnRpcmUgYmxvY2sgYXMgYWxsb2NhdGVkLgorICB1bnNpZ25lZCBBbGxvY2F0ZVJlZ0Jsb2NrKEFycmF5UmVmPE1DUGh5c1JlZz4gUmVncywgdW5zaWduZWQgUmVnc1JlcXVpcmVkKSB7CisgICAgaWYgKFJlZ3NSZXF1aXJlZCA+IFJlZ3Muc2l6ZSgpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICBmb3IgKHVuc2lnbmVkIFN0YXJ0SWR4ID0gMDsgU3RhcnRJZHggPD0gUmVncy5zaXplKCkgLSBSZWdzUmVxdWlyZWQ7CisgICAgICAgICArK1N0YXJ0SWR4KSB7CisgICAgICBib29sIEJsb2NrQXZhaWxhYmxlID0gdHJ1ZTsKKyAgICAgIC8vIENoZWNrIGZvciBhbHJlYWR5LWFsbG9jYXRlZCByZWdzIGluIHRoaXMgYmxvY2sKKyAgICAgIGZvciAodW5zaWduZWQgQmxvY2tJZHggPSAwOyBCbG9ja0lkeCA8IFJlZ3NSZXF1aXJlZDsgKytCbG9ja0lkeCkgeworICAgICAgICBpZiAoaXNBbGxvY2F0ZWQoUmVnc1tTdGFydElkeCArIEJsb2NrSWR4XSkpIHsKKyAgICAgICAgICBCbG9ja0F2YWlsYWJsZSA9IGZhbHNlOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgICBpZiAoQmxvY2tBdmFpbGFibGUpIHsKKyAgICAgICAgLy8gTWFyayB0aGUgZW50aXJlIGJsb2NrIGFzIGFsbG9jYXRlZAorICAgICAgICBmb3IgKHVuc2lnbmVkIEJsb2NrSWR4ID0gMDsgQmxvY2tJZHggPCBSZWdzUmVxdWlyZWQ7ICsrQmxvY2tJZHgpIHsKKyAgICAgICAgICBNYXJrQWxsb2NhdGVkKFJlZ3NbU3RhcnRJZHggKyBCbG9ja0lkeF0pOworICAgICAgICB9CisgICAgICAgIHJldHVybiBSZWdzW1N0YXJ0SWR4XTsKKyAgICAgIH0KKyAgICB9CisgICAgLy8gTm8gYmxvY2sgd2FzIGF2YWlsYWJsZQorICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIFZlcnNpb24gb2YgQWxsb2NhdGVSZWcgd2l0aCBsaXN0IG9mIHJlZ2lzdGVycyB0byBiZSBzaGFkb3dlZC4KKyAgdW5zaWduZWQgQWxsb2NhdGVSZWcoQXJyYXlSZWY8TUNQaHlzUmVnPiBSZWdzLCBjb25zdCBNQ1BoeXNSZWcgKlNoYWRvd1JlZ3MpIHsKKyAgICB1bnNpZ25lZCBGaXJzdFVuYWxsb2MgPSBnZXRGaXJzdFVuYWxsb2NhdGVkKFJlZ3MpOworICAgIGlmIChGaXJzdFVuYWxsb2MgPT0gUmVncy5zaXplKCkpCisgICAgICByZXR1cm4gMDsgICAgLy8gRGlkbid0IGZpbmQgdGhlIHJlZy4KKworICAgIC8vIE1hcmsgdGhlIHJlZ2lzdGVyIGFuZCBhbnkgYWxpYXNlcyBhcyBhbGxvY2F0ZWQuCisgICAgdW5zaWduZWQgUmVnID0gUmVnc1tGaXJzdFVuYWxsb2NdLCBTaGFkb3dSZWcgPSBTaGFkb3dSZWdzW0ZpcnN0VW5hbGxvY107CisgICAgTWFya0FsbG9jYXRlZChSZWcpOworICAgIE1hcmtBbGxvY2F0ZWQoU2hhZG93UmVnKTsKKyAgICByZXR1cm4gUmVnOworICB9CisKKyAgLy8vIEFsbG9jYXRlU3RhY2sgLSBBbGxvY2F0ZSBhIGNodW5rIG9mIHN0YWNrIHNwYWNlIHdpdGggdGhlIHNwZWNpZmllZCBzaXplCisgIC8vLyBhbmQgYWxpZ25tZW50LgorICB1bnNpZ25lZCBBbGxvY2F0ZVN0YWNrKHVuc2lnbmVkIFNpemUsIHVuc2lnbmVkIEFsaWduKSB7CisgICAgYXNzZXJ0KEFsaWduICYmICgoQWxpZ24gLSAxKSAmIEFsaWduKSA9PSAwKTsgLy8gQWxpZ24gaXMgcG93ZXIgb2YgMi4KKyAgICBTdGFja09mZnNldCA9IGFsaWduVG8oU3RhY2tPZmZzZXQsIEFsaWduKTsKKyAgICB1bnNpZ25lZCBSZXN1bHQgPSBTdGFja09mZnNldDsKKyAgICBTdGFja09mZnNldCArPSBTaXplOworICAgIE1heFN0YWNrQXJnQWxpZ24gPSBzdGQ6Om1heChBbGlnbiwgTWF4U3RhY2tBcmdBbGlnbik7CisgICAgZW5zdXJlTWF4QWxpZ25tZW50KEFsaWduKTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgdm9pZCBlbnN1cmVNYXhBbGlnbm1lbnQodW5zaWduZWQgQWxpZ24pIHsKKyAgICBpZiAoIUFuYWx5emluZ011c3RUYWlsRm9yd2FyZGVkUmVncykKKyAgICAgIE1GLmdldEZyYW1lSW5mbygpLmVuc3VyZU1heEFsaWdubWVudChBbGlnbik7CisgIH0KKworICAvLy8gVmVyc2lvbiBvZiBBbGxvY2F0ZVN0YWNrIHdpdGggZXh0cmEgcmVnaXN0ZXIgdG8gYmUgc2hhZG93ZWQuCisgIHVuc2lnbmVkIEFsbG9jYXRlU3RhY2sodW5zaWduZWQgU2l6ZSwgdW5zaWduZWQgQWxpZ24sIHVuc2lnbmVkIFNoYWRvd1JlZykgeworICAgIE1hcmtBbGxvY2F0ZWQoU2hhZG93UmVnKTsKKyAgICByZXR1cm4gQWxsb2NhdGVTdGFjayhTaXplLCBBbGlnbik7CisgIH0KKworICAvLy8gVmVyc2lvbiBvZiBBbGxvY2F0ZVN0YWNrIHdpdGggbGlzdCBvZiBleHRyYSByZWdpc3RlcnMgdG8gYmUgc2hhZG93ZWQuCisgIC8vLyBOb3RlIHRoYXQsIHVubGlrZSBBbGxvY2F0ZVJlZywgdGhpcyBzaGFkb3dzIEFMTCBvZiB0aGUgc2hhZG93IHJlZ2lzdGVycy4KKyAgdW5zaWduZWQgQWxsb2NhdGVTdGFjayh1bnNpZ25lZCBTaXplLCB1bnNpZ25lZCBBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxNQ1BoeXNSZWc+IFNoYWRvd1JlZ3MpIHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgU2hhZG93UmVncy5zaXplKCk7ICsraSkKKyAgICAgIE1hcmtBbGxvY2F0ZWQoU2hhZG93UmVnc1tpXSk7CisgICAgcmV0dXJuIEFsbG9jYXRlU3RhY2soU2l6ZSwgQWxpZ24pOworICB9CisKKyAgLy8gSGFuZGxlQnlWYWwgLSBBbGxvY2F0ZSBhIHN0YWNrIHNsb3QgbGFyZ2UgZW5vdWdoIHRvIHBhc3MgYW4gYXJndW1lbnQgYnkKKyAgLy8gdmFsdWUuIFRoZSBzaXplIGFuZCBhbGlnbm1lbnQgaW5mb3JtYXRpb24gb2YgdGhlIGFyZ3VtZW50IGlzIGVuY29kZWQgaW4gaXRzCisgIC8vIHBhcmFtZXRlciBhdHRyaWJ1dGUuCisgIHZvaWQgSGFuZGxlQnlWYWwodW5zaWduZWQgVmFsTm8sIE1WVCBWYWxWVCwKKyAgICAgICAgICAgICAgICAgICBNVlQgTG9jVlQsIENDVmFsQXNzaWduOjpMb2NJbmZvIExvY0luZm8sCisgICAgICAgICAgICAgICAgICAgaW50IE1pblNpemUsIGludCBNaW5BbGlnbiwgSVNEOjpBcmdGbGFnc1R5IEFyZ0ZsYWdzKTsKKworICAvLyBSZXR1cm5zIGNvdW50IG9mIGJ5dmFsIGFyZ3VtZW50cyB0aGF0IGFyZSB0byBiZSBzdG9yZWQgKGV2ZW4gcGFydGx5KQorICAvLyBpbiByZWdpc3RlcnMuCisgIHVuc2lnbmVkIGdldEluUmVnc1BhcmFtc0NvdW50KCkgY29uc3QgeyByZXR1cm4gQnlWYWxSZWdzLnNpemUoKTsgfQorCisgIC8vIFJldHVybnMgY291bnQgb2YgYnl2YWwgaW4tcmVncyBhcmd1bWVudHMgcHJvY2VlZC4KKyAgdW5zaWduZWQgZ2V0SW5SZWdzUGFyYW1zUHJvY2Vzc2VkKCkgY29uc3QgeyByZXR1cm4gSW5SZWdzUGFyYW1zUHJvY2Vzc2VkOyB9CisKKyAgLy8gR2V0IGluZm9ybWF0aW9uIGFib3V0IE4tdGggYnl2YWwgcGFyYW1ldGVyIHRoYXQgaXMgc3RvcmVkIGluIHJlZ2lzdGVycy4KKyAgLy8gSGVyZSAiQnlWYWxQYXJhbUluZGV4IiBpcyBOLgorICB2b2lkIGdldEluUmVnc1BhcmFtSW5mbyh1bnNpZ25lZCBJblJlZ3NQYXJhbVJlY29yZEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCYgQmVnaW5SZWcsIHVuc2lnbmVkJiBFbmRSZWcpIGNvbnN0IHsKKyAgICBhc3NlcnQoSW5SZWdzUGFyYW1SZWNvcmRJbmRleCA8IEJ5VmFsUmVncy5zaXplKCkgJiYKKyAgICAgICAgICAgIldyb25nIEJ5VmFsIHBhcmFtZXRlciBpbmRleCIpOworCisgICAgY29uc3QgQnlWYWxJbmZvJiBpbmZvID0gQnlWYWxSZWdzW0luUmVnc1BhcmFtUmVjb3JkSW5kZXhdOworICAgIEJlZ2luUmVnID0gaW5mby5CZWdpbjsKKyAgICBFbmRSZWcgPSBpbmZvLkVuZDsKKyAgfQorCisgIC8vIEFkZCBpbmZvcm1hdGlvbiBhYm91dCBwYXJhbWV0ZXIgdGhhdCBpcyBrZXB0IGluIHJlZ2lzdGVycy4KKyAgdm9pZCBhZGRJblJlZ3NQYXJhbUluZm8odW5zaWduZWQgUmVnQmVnaW4sIHVuc2lnbmVkIFJlZ0VuZCkgeworICAgIEJ5VmFsUmVncy5wdXNoX2JhY2soQnlWYWxJbmZvKFJlZ0JlZ2luLCBSZWdFbmQpKTsKKyAgfQorCisgIC8vIEdvZXMgZWl0aGVyIHRvIG5leHQgYnl2YWwgcGFyYW1ldGVyIChleGNsdWRpbmcgIndhc3RlIiByZWNvcmQpLCBvcgorICAvLyB0byB0aGUgZW5kIG9mIGNvbGxlY3Rpb24uCisgIC8vIFJldHVybnMgZmFsc2UsIGlmIGVuZCBpcyByZWFjaGVkLgorICBib29sIG5leHRJblJlZ3NQYXJhbSgpIHsKKyAgICB1bnNpZ25lZCBlID0gQnlWYWxSZWdzLnNpemUoKTsKKyAgICBpZiAoSW5SZWdzUGFyYW1zUHJvY2Vzc2VkIDwgZSkKKyAgICAgICsrSW5SZWdzUGFyYW1zUHJvY2Vzc2VkOworICAgIHJldHVybiBJblJlZ3NQYXJhbXNQcm9jZXNzZWQgPCBlOworICB9CisKKyAgLy8gQ2xlYXIgYnl2YWwgcmVnaXN0ZXJzIHRyYWNraW5nIGluZm8uCisgIHZvaWQgY2xlYXJCeVZhbFJlZ3NJbmZvKCkgeworICAgIEluUmVnc1BhcmFtc1Byb2Nlc3NlZCA9IDA7CisgICAgQnlWYWxSZWdzLmNsZWFyKCk7CisgIH0KKworICAvLyBSZXdpbmQgYnl2YWwgcmVnaXN0ZXJzIHRyYWNraW5nIGluZm8uCisgIHZvaWQgcmV3aW5kQnlWYWxSZWdzSW5mbygpIHsKKyAgICBJblJlZ3NQYXJhbXNQcm9jZXNzZWQgPSAwOworICB9CisKKyAgLy8gR2V0IGxpc3Qgb2YgcGVuZGluZyBhc3NpZ25tZW50cworICBTbWFsbFZlY3RvckltcGw8Q0NWYWxBc3NpZ24+ICZnZXRQZW5kaW5nTG9jcygpIHsKKyAgICByZXR1cm4gUGVuZGluZ0xvY3M7CisgIH0KKworICAvLyBHZXQgYSBsaXN0IG9mIGFyZ2ZsYWdzIGZvciBwZW5kaW5nIGFzc2lnbm1lbnRzLgorICBTbWFsbFZlY3RvckltcGw8SVNEOjpBcmdGbGFnc1R5PiAmZ2V0UGVuZGluZ0FyZ0ZsYWdzKCkgeworICAgIHJldHVybiBQZW5kaW5nQXJnRmxhZ3M7CisgIH0KKworICAvLy8gQ29tcHV0ZSB0aGUgcmVtYWluaW5nIHVudXNlZCByZWdpc3RlciBwYXJhbWV0ZXJzIHRoYXQgd291bGQgYmUgdXNlZCBmb3IKKyAgLy8vIHRoZSBnaXZlbiB2YWx1ZSB0eXBlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHZhcmFyZ3MgYXJlIHBhc3NlZCBpbiB0aGUKKyAgLy8vIHJlZ2lzdGVycyB0aGF0IG5vcm1hbCBwcm90b3R5cGVkIHBhcmFtZXRlcnMgd291bGQgYmUgcGFzc2VkIGluLCBvciBmb3IKKyAgLy8vIGltcGxlbWVudGluZyBwZXJmZWN0IGZvcndhcmRpbmcuCisgIHZvaWQgZ2V0UmVtYWluaW5nUmVnUGFybXNGb3JUeXBlKFNtYWxsVmVjdG9ySW1wbDxNQ1BoeXNSZWc+ICZSZWdzLCBNVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDQXNzaWduRm4gRm4pOworCisgIC8vLyBDb21wdXRlIHRoZSBzZXQgb2YgcmVnaXN0ZXJzIHRoYXQgbmVlZCB0byBiZSBwcmVzZXJ2ZWQgYW5kIGZvcndhcmRlZCB0bworICAvLy8gYW55IG11c3R0YWlsIGNhbGxzLgorICB2b2lkIGFuYWx5emVNdXN0VGFpbEZvcndhcmRlZFJlZ2lzdGVycygKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxGb3J3YXJkZWRSZWdpc3Rlcj4gJkZvcndhcmRzLCBBcnJheVJlZjxNVlQ+IFJlZ1Bhcm1UeXBlcywKKyAgICAgIENDQXNzaWduRm4gRm4pOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHJlc3VsdHMgb2YgdGhlIHR3byBjYWxsaW5nIGNvbnZlbnRpb25zIGFyZSBjb21wYXRpYmxlLgorICAvLy8gVGhpcyBpcyB1c3VhbGx5IHBhcnQgb2YgdGhlIGNoZWNrIGZvciB0YWlsY2FsbCBlbGlnaWJpbGl0eS4KKyAgc3RhdGljIGJvb2wgcmVzdWx0c0NvbXBhdGlibGUoQ2FsbGluZ0NvbnY6OklEIENhbGxlZUNDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbGVyQ0MsIE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpJbnB1dEFyZz4gJklucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NBc3NpZ25GbiBDYWxsZWVGbiwgQ0NBc3NpZ25GbiBDYWxsZXJGbik7CisKKyAgLy8vIFRoZSBmdW5jdGlvbiBydW5zIGFuIGFkZGl0aW9uYWwgYW5hbHlzaXMgcGFzcyBvdmVyIGZ1bmN0aW9uIGFyZ3VtZW50cy4KKyAgLy8vIEl0IHdpbGwgbWFyayBlYWNoIGFyZ3VtZW50IHdpdGggdGhlIGF0dHJpYnV0ZSBmbGFnIFNlY0FyZ1Bhc3MuCisgIC8vLyBBZnRlciBydW5uaW5nLCBpdCB3aWxsIHNvcnQgdGhlIGxvY3MgbGlzdC4KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIHZvaWQgQW5hbHl6ZUFyZ3VtZW50c1NlY29uZFBhc3MoY29uc3QgU21hbGxWZWN0b3JJbXBsPFQ+ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENDQXNzaWduRm4gRm4pIHsKKyAgICB1bnNpZ25lZCBOdW1GaXJzdFBhc3NMb2NzID0gTG9jcy5zaXplKCk7CisKKyAgICAvLy8gQ3JlYXRlcyBzaW1pbGFyIGFyZ3VtZW50IGxpc3QgdG8gXHAgQXJncyBpbiB3aGljaCBlYWNoIGFyZ3VtZW50IGlzCisgICAgLy8vIG1hcmtlZCB1c2luZyBTZWNBcmdQYXNzIGZsYWcuCisgICAgU21hbGxWZWN0b3I8VCwgMTY+IFNlY1Bhc3NBcmc7CisgICAgLy8gU21hbGxWZWN0b3I8SVNEOjpJbnB1dEFyZywgMTY+IFNlY1Bhc3NBcmc7CisgICAgZm9yIChhdXRvIEFyZyA6IEFyZ3MpIHsKKyAgICAgIEFyZy5GbGFncy5zZXRTZWNBcmdQYXNzKCk7CisgICAgICBTZWNQYXNzQXJnLnB1c2hfYmFjayhBcmcpOworICAgIH0KKworICAgIC8vIFJ1biB0aGUgc2Vjb25kIGFyZ3VtZW50IHBhc3MKKyAgICBBbmFseXplQXJndW1lbnRzKFNlY1Bhc3NBcmcsIEZuKTsKKworICAgIC8vIFNvcnQgdGhlIGxvY2F0aW9ucyBvZiB0aGUgYXJndW1lbnRzIGFjY29yZGluZyB0byB0aGVpciBvcmlnaW5hbCBwb3NpdGlvbi4KKyAgICBTbWFsbFZlY3RvcjxDQ1ZhbEFzc2lnbiwgMTY+IFRtcEFyZ0xvY3M7CisgICAgc3RkOjpzd2FwKFRtcEFyZ0xvY3MsIExvY3MpOworICAgIGF1dG8gQiA9IFRtcEFyZ0xvY3MuYmVnaW4oKSwgRSA9IFRtcEFyZ0xvY3MuZW5kKCk7CisgICAgc3RkOjptZXJnZShCLCBCICsgTnVtRmlyc3RQYXNzTG9jcywgQiArIE51bUZpcnN0UGFzc0xvY3MsIEUsCisgICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIoTG9jcyksCisgICAgICAgICAgICAgICBbXShjb25zdCBDQ1ZhbEFzc2lnbiAmQSwgY29uc3QgQ0NWYWxBc3NpZ24gJkIpIC0+IGJvb2wgeworICAgICAgICAgICAgICAgICByZXR1cm4gQS5nZXRWYWxObygpIDwgQi5nZXRWYWxObygpOworICAgICAgICAgICAgICAgfSk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIE1hcmtBbGxvY2F0ZWQgLSBNYXJrIGEgcmVnaXN0ZXIgYW5kIGFsbCBvZiBpdHMgYWxpYXNlcyBhcyBhbGxvY2F0ZWQuCisgIHZvaWQgTWFya0FsbG9jYXRlZCh1bnNpZ25lZCBSZWcpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9DQUxMSU5HQ09OVkxPV0VSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9Db21tYW5kRmxhZ3MuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0NvbW1hbmRGbGFncy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzcwOGMwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9Db21tYW5kRmxhZ3MuZGVmCkBAIC0wLDAgKzEsMzg5IEBACisvLz09PS0tIENvbW1hbmRGbGFncy5oIC0gQ29tbWFuZCBMaW5lIEZsYWdzIEludGVyZmFjZSAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBjb2RlZ2VuLXNwZWNpZmljIGZsYWdzIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIGRpZmZlcmVudAorLy8gY29tbWFuZCBsaW5lIHRvb2xzLiBUaGUgdG9vbHMgImxsYyIgYW5kICJvcHQiIGJvdGggdXNlIHRoaXMgZmlsZSB0byBwcmV2ZW50CisvLyBmbGFnIGR1cGxpY2F0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1RhcmdldE9wdGlvbnNDb21tYW5kRmxhZ3MuZGVmIgorI2luY2x1ZGUgImxsdm0vTUMvU3VidGFyZ2V0RmVhdHVyZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db2RlR2VuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0hvc3QuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgPHN0cmluZz4KK3VzaW5nIG5hbWVzcGFjZSBsbHZtOworCitzdGF0aWMgY2w6Om9wdDxzdGQ6OnN0cmluZz4KKyAgICBNQXJjaCgibWFyY2giLAorICAgICAgICAgIGNsOjpkZXNjKCJBcmNoaXRlY3R1cmUgdG8gZ2VuZXJhdGUgY29kZSBmb3IgKHNlZSAtLXZlcnNpb24pIikpOworCitzdGF0aWMgY2w6Om9wdDxzdGQ6OnN0cmluZz4KKyAgICBNQ1BVKCJtY3B1IiwKKyAgICAgICAgIGNsOjpkZXNjKCJUYXJnZXQgYSBzcGVjaWZpYyBjcHUgdHlwZSAoLW1jcHU9aGVscCBmb3IgZGV0YWlscykiKSwKKyAgICAgICAgIGNsOjp2YWx1ZV9kZXNjKCJjcHUtbmFtZSIpLCBjbDo6aW5pdCgiIikpOworCitzdGF0aWMgY2w6Omxpc3Q8c3RkOjpzdHJpbmc+CisgICAgTUF0dHJzKCJtYXR0ciIsIGNsOjpDb21tYVNlcGFyYXRlZCwKKyAgICAgICAgICAgY2w6OmRlc2MoIlRhcmdldCBzcGVjaWZpYyBhdHRyaWJ1dGVzICgtbWF0dHI9aGVscCBmb3IgZGV0YWlscykiKSwKKyAgICAgICAgICAgY2w6OnZhbHVlX2Rlc2MoImExLCthMiwtYTMsLi4uIikpOworCitzdGF0aWMgY2w6Om9wdDxSZWxvYzo6TW9kZWw+IFJlbG9jTW9kZWwoCisgICAgInJlbG9jYXRpb24tbW9kZWwiLCBjbDo6ZGVzYygiQ2hvb3NlIHJlbG9jYXRpb24gbW9kZWwiKSwKKyAgICBjbDo6dmFsdWVzKAorICAgICAgICBjbEVudW1WYWxOKFJlbG9jOjpTdGF0aWMsICJzdGF0aWMiLCAiTm9uLXJlbG9jYXRhYmxlIGNvZGUiKSwKKyAgICAgICAgY2xFbnVtVmFsTihSZWxvYzo6UElDXywgInBpYyIsCisgICAgICAgICAgICAgICAgICAgIkZ1bGx5IHJlbG9jYXRhYmxlLCBwb3NpdGlvbiBpbmRlcGVuZGVudCBjb2RlIiksCisgICAgICAgIGNsRW51bVZhbE4oUmVsb2M6OkR5bmFtaWNOb1BJQywgImR5bmFtaWMtbm8tcGljIiwKKyAgICAgICAgICAgICAgICAgICAiUmVsb2NhdGFibGUgZXh0ZXJuYWwgcmVmZXJlbmNlcywgbm9uLXJlbG9jYXRhYmxlIGNvZGUiKSwKKyAgICAgICAgY2xFbnVtVmFsTihSZWxvYzo6Uk9QSSwgInJvcGkiLAorICAgICAgICAgICAgICAgICAgICJDb2RlIGFuZCByZWFkLW9ubHkgZGF0YSByZWxvY2F0YWJsZSwgYWNjZXNzZWQgUEMtcmVsYXRpdmUiKSwKKyAgICAgICAgY2xFbnVtVmFsTigKKyAgICAgICAgICAgIFJlbG9jOjpSV1BJLCAicndwaSIsCisgICAgICAgICAgICAiUmVhZC13cml0ZSBkYXRhIHJlbG9jYXRhYmxlLCBhY2Nlc3NlZCByZWxhdGl2ZSB0byBzdGF0aWMgYmFzZSIpLAorICAgICAgICBjbEVudW1WYWxOKFJlbG9jOjpST1BJX1JXUEksICJyb3BpLXJ3cGkiLAorICAgICAgICAgICAgICAgICAgICJDb21iaW5hdGlvbiBvZiByb3BpIGFuZCByd3BpIikpKTsKKworTExWTV9BVFRSSUJVVEVfVU5VU0VEIHN0YXRpYyBPcHRpb25hbDxSZWxvYzo6TW9kZWw+IGdldFJlbG9jTW9kZWwoKSB7CisgIGlmIChSZWxvY01vZGVsLmdldE51bU9jY3VycmVuY2VzKCkpIHsKKyAgICBSZWxvYzo6TW9kZWwgUiA9IFJlbG9jTW9kZWw7CisgICAgcmV0dXJuIFI7CisgIH0KKyAgcmV0dXJuIE5vbmU7Cit9CisKK3N0YXRpYyBjbDo6b3B0PFRocmVhZE1vZGVsOjpNb2RlbD4gVE1Nb2RlbCgKKyAgICAidGhyZWFkLW1vZGVsIiwgY2w6OmRlc2MoIkNob29zZSB0aHJlYWRpbmcgbW9kZWwiKSwKKyAgICBjbDo6aW5pdChUaHJlYWRNb2RlbDo6UE9TSVgpLAorICAgIGNsOjp2YWx1ZXMoY2xFbnVtVmFsTihUaHJlYWRNb2RlbDo6UE9TSVgsICJwb3NpeCIsICJQT1NJWCB0aHJlYWQgbW9kZWwiKSwKKyAgICAgICAgICAgICAgIGNsRW51bVZhbE4oVGhyZWFkTW9kZWw6OlNpbmdsZSwgInNpbmdsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTaW5nbGUgdGhyZWFkIG1vZGVsIikpKTsKKworc3RhdGljIGNsOjpvcHQ8bGx2bTo6Q29kZU1vZGVsOjpNb2RlbD4gQ01Nb2RlbCgKKyAgICAiY29kZS1tb2RlbCIsIGNsOjpkZXNjKCJDaG9vc2UgY29kZSBtb2RlbCIpLAorICAgIGNsOjp2YWx1ZXMoY2xFbnVtVmFsTihDb2RlTW9kZWw6OlNtYWxsLCAic21hbGwiLCAiU21hbGwgY29kZSBtb2RlbCIpLAorICAgICAgICAgICAgICAgY2xFbnVtVmFsTihDb2RlTW9kZWw6Oktlcm5lbCwgImtlcm5lbCIsICJLZXJuZWwgY29kZSBtb2RlbCIpLAorICAgICAgICAgICAgICAgY2xFbnVtVmFsTihDb2RlTW9kZWw6Ok1lZGl1bSwgIm1lZGl1bSIsICJNZWRpdW0gY29kZSBtb2RlbCIpLAorICAgICAgICAgICAgICAgY2xFbnVtVmFsTihDb2RlTW9kZWw6OkxhcmdlLCAibGFyZ2UiLCAiTGFyZ2UgY29kZSBtb2RlbCIpKSk7CisKK0xMVk1fQVRUUklCVVRFX1VOVVNFRCBzdGF0aWMgT3B0aW9uYWw8Q29kZU1vZGVsOjpNb2RlbD4gZ2V0Q29kZU1vZGVsKCkgeworICBpZiAoQ01Nb2RlbC5nZXROdW1PY2N1cnJlbmNlcygpKSB7CisgICAgQ29kZU1vZGVsOjpNb2RlbCBNID0gQ01Nb2RlbDsKKyAgICByZXR1cm4gTTsKKyAgfQorICByZXR1cm4gTm9uZTsKK30KKworc3RhdGljIGNsOjpvcHQ8bGx2bTo6RXhjZXB0aW9uSGFuZGxpbmc+IEV4Y2VwdGlvbk1vZGVsKAorICAgICJleGNlcHRpb24tbW9kZWwiLCBjbDo6ZGVzYygiZXhjZXB0aW9uIG1vZGVsIiksCisgICAgY2w6OmluaXQoRXhjZXB0aW9uSGFuZGxpbmc6Ok5vbmUpLAorICAgIGNsOjp2YWx1ZXMoCisgICAgICAgIGNsRW51bVZhbE4oRXhjZXB0aW9uSGFuZGxpbmc6Ok5vbmUsICJkZWZhdWx0IiwKKyAgICAgICAgICAgICAgICAgICAiZGVmYXVsdCBleGNlcHRpb24gaGFuZGxpbmcgbW9kZWwiKSwKKyAgICAgICAgY2xFbnVtVmFsTihFeGNlcHRpb25IYW5kbGluZzo6RHdhcmZDRkksICJkd2FyZiIsCisgICAgICAgICAgICAgICAgICAgIkRXQVJGLWxpa2UgQ0ZJIGJhc2VkIGV4Y2VwdGlvbiBoYW5kbGluZyIpLAorICAgICAgICBjbEVudW1WYWxOKEV4Y2VwdGlvbkhhbmRsaW5nOjpTakxqLCAic2psaiIsICJTakxqIGV4Y2VwdGlvbiBoYW5kbGluZyIpLAorICAgICAgICBjbEVudW1WYWxOKEV4Y2VwdGlvbkhhbmRsaW5nOjpBUk0sICJhcm0iLCAiQVJNIEVIQUJJIGV4Y2VwdGlvbnMiKSwKKyAgICAgICAgY2xFbnVtVmFsTihFeGNlcHRpb25IYW5kbGluZzo6V2luRUgsICJ3aW5laCIsCisgICAgICAgICAgICAgICAgICAgIldpbmRvd3MgZXhjZXB0aW9uIG1vZGVsIiksCisgICAgICAgIGNsRW51bVZhbE4oRXhjZXB0aW9uSGFuZGxpbmc6Oldhc20sICJ3YXNtIiwKKyAgICAgICAgICAgICAgICAgICAiV2ViQXNzZW1ibHkgZXhjZXB0aW9uIGhhbmRsaW5nIikpKTsKKworc3RhdGljIGNsOjpvcHQ8VGFyZ2V0TWFjaGluZTo6Q29kZUdlbkZpbGVUeXBlPiBGaWxlVHlwZSgKKyAgICAiZmlsZXR5cGUiLCBjbDo6aW5pdChUYXJnZXRNYWNoaW5lOjpDR0ZUX0Fzc2VtYmx5RmlsZSksCisgICAgY2w6OmRlc2MoCisgICAgICAgICJDaG9vc2UgYSBmaWxlIHR5cGUgKG5vdCBhbGwgdHlwZXMgYXJlIHN1cHBvcnRlZCBieSBhbGwgdGFyZ2V0cyk6IiksCisgICAgY2w6OnZhbHVlcyhjbEVudW1WYWxOKFRhcmdldE1hY2hpbmU6OkNHRlRfQXNzZW1ibHlGaWxlLCAiYXNtIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkVtaXQgYW4gYXNzZW1ibHkgKCcucycpIGZpbGUiKSwKKyAgICAgICAgICAgICAgIGNsRW51bVZhbE4oVGFyZ2V0TWFjaGluZTo6Q0dGVF9PYmplY3RGaWxlLCAib2JqIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkVtaXQgYSBuYXRpdmUgb2JqZWN0ICgnLm8nKSBmaWxlIiksCisgICAgICAgICAgICAgICBjbEVudW1WYWxOKFRhcmdldE1hY2hpbmU6OkNHRlRfTnVsbCwgIm51bGwiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRW1pdCBub3RoaW5nLCBmb3IgcGVyZm9ybWFuY2UgdGVzdGluZyIpKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CisgICAgRGlzYWJsZUZQRWxpbSgiZGlzYWJsZS1mcC1lbGltIiwKKyAgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJEaXNhYmxlIGZyYW1lIHBvaW50ZXIgZWxpbWluYXRpb24gb3B0aW1pemF0aW9uIiksCisgICAgICAgICAgICAgICAgICBjbDo6aW5pdChmYWxzZSkpOworCitzdGF0aWMgY2w6Om9wdDxib29sPiBFbmFibGVVbnNhZmVGUE1hdGgoCisgICAgImVuYWJsZS11bnNhZmUtZnAtbWF0aCIsCisgICAgY2w6OmRlc2MoIkVuYWJsZSBvcHRpbWl6YXRpb25zIHRoYXQgbWF5IGRlY3JlYXNlIEZQIHByZWNpc2lvbiIpLAorICAgIGNsOjppbml0KGZhbHNlKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IEVuYWJsZU5vSW5mc0ZQTWF0aCgKKyAgICAiZW5hYmxlLW5vLWluZnMtZnAtbWF0aCIsCisgICAgY2w6OmRlc2MoIkVuYWJsZSBGUCBtYXRoIG9wdGltaXphdGlvbnMgdGhhdCBhc3N1bWUgbm8gKy1JbmZzIiksCisgICAgY2w6OmluaXQoZmFsc2UpKTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4gRW5hYmxlTm9OYU5zRlBNYXRoKAorICAgICJlbmFibGUtbm8tbmFucy1mcC1tYXRoIiwKKyAgICBjbDo6ZGVzYygiRW5hYmxlIEZQIG1hdGggb3B0aW1pemF0aW9ucyB0aGF0IGFzc3VtZSBubyBOYU5zIiksCisgICAgY2w6OmluaXQoZmFsc2UpKTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4gRW5hYmxlTm9TaWduZWRaZXJvc0ZQTWF0aCgKKyAgICAiZW5hYmxlLW5vLXNpZ25lZC16ZXJvcy1mcC1tYXRoIiwKKyAgICBjbDo6ZGVzYygiRW5hYmxlIEZQIG1hdGggb3B0aW1pemF0aW9ucyB0aGF0IGFzc3VtZSAiCisgICAgICAgICAgICAgInRoZSBzaWduIG9mIDAgaXMgaW5zaWduaWZpY2FudCIpLAorICAgIGNsOjppbml0KGZhbHNlKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+CisgICAgRW5hYmxlTm9UcmFwcGluZ0ZQTWF0aCgiZW5hYmxlLW5vLXRyYXBwaW5nLWZwLW1hdGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIkVuYWJsZSBzZXR0aW5nIHRoZSBGUCBleGNlcHRpb25zIGJ1aWxkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdHRyaWJ1dGUgbm90IHRvIHVzZSBleGNlcHRpb25zIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbDo6aW5pdChmYWxzZSkpOworCitzdGF0aWMgY2w6Om9wdDxsbHZtOjpGUERlbm9ybWFsOjpEZW5vcm1hbE1vZGU+IERlbm9ybWFsTW9kZSgKKyAgICAiZGVub3JtYWwtZnAtbWF0aCIsCisgICAgY2w6OmRlc2MoIlNlbGVjdCB3aGljaCBkZW5vcm1hbCBudW1iZXJzIHRoZSBjb2RlIGlzIHBlcm1pdHRlZCB0byByZXF1aXJlIiksCisgICAgY2w6OmluaXQoRlBEZW5vcm1hbDo6SUVFRSksCisgICAgY2w6OnZhbHVlcyhjbEVudW1WYWxOKEZQRGVub3JtYWw6OklFRUUsICJpZWVlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIklFRUUgNzU0IGRlbm9ybWFsIG51bWJlcnMiKSwKKyAgICAgICAgICAgICAgIGNsRW51bVZhbE4oRlBEZW5vcm1hbDo6UHJlc2VydmVTaWduLCAicHJlc2VydmUtc2lnbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgc2lnbiBvZiBhICBmbHVzaGVkLXRvLXplcm8gbnVtYmVyIGlzIHByZXNlcnZlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiB0aGUgc2lnbiBvZiAwIiksCisgICAgICAgICAgICAgICBjbEVudW1WYWxOKEZQRGVub3JtYWw6OlBvc2l0aXZlWmVybywgInBvc2l0aXZlLXplcm8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVub3JtYWxzIGFyZSBmbHVzaGVkIHRvIHBvc2l0aXZlIHplcm8iKSkpOworCitzdGF0aWMgY2w6Om9wdDxib29sPiBFbmFibGVIb25vclNpZ25EZXBlbmRlbnRSb3VuZGluZ0ZQTWF0aCgKKyAgICAiZW5hYmxlLXNpZ24tZGVwZW5kZW50LXJvdW5kaW5nLWZwLW1hdGgiLCBjbDo6SGlkZGVuLAorICAgIGNsOjpkZXNjKCJGb3JjZSBjb2RlZ2VuIHRvIGFzc3VtZSByb3VuZGluZyBtb2RlIGNhbiBjaGFuZ2UgZHluYW1pY2FsbHkiKSwKKyAgICBjbDo6aW5pdChmYWxzZSkpOworCitzdGF0aWMgY2w6Om9wdDxsbHZtOjpGbG9hdEFCSTo6QUJJVHlwZT4gRmxvYXRBQklGb3JDYWxscygKKyAgICAiZmxvYXQtYWJpIiwgY2w6OmRlc2MoIkNob29zZSBmbG9hdCBBQkkgdHlwZSIpLCBjbDo6aW5pdChGbG9hdEFCSTo6RGVmYXVsdCksCisgICAgY2w6OnZhbHVlcyhjbEVudW1WYWxOKEZsb2F0QUJJOjpEZWZhdWx0LCAiZGVmYXVsdCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJUYXJnZXQgZGVmYXVsdCBmbG9hdCBBQkkgdHlwZSIpLAorICAgICAgICAgICAgICAgY2xFbnVtVmFsTihGbG9hdEFCSTo6U29mdCwgInNvZnQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiU29mdCBmbG9hdCBBQkkgKGltcGxpZWQgYnkgLXNvZnQtZmxvYXQpIiksCisgICAgICAgICAgICAgICBjbEVudW1WYWxOKEZsb2F0QUJJOjpIYXJkLCAiaGFyZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJIYXJkIGZsb2F0IEFCSSAodXNlcyBGUCByZWdpc3RlcnMpIikpKTsKKworc3RhdGljIGNsOjpvcHQ8bGx2bTo6RlBPcEZ1c2lvbjo6RlBPcEZ1c2lvbk1vZGU+IEZ1c2VGUE9wcygKKyAgICAiZnAtY29udHJhY3QiLCBjbDo6ZGVzYygiRW5hYmxlIGFnZ3Jlc3NpdmUgZm9ybWF0aW9uIG9mIGZ1c2VkIEZQIG9wcyIpLAorICAgIGNsOjppbml0KEZQT3BGdXNpb246OlN0YW5kYXJkKSwKKyAgICBjbDo6dmFsdWVzKAorICAgICAgICBjbEVudW1WYWxOKEZQT3BGdXNpb246OkZhc3QsICJmYXN0IiwgIkZ1c2UgRlAgb3BzIHdoZW5ldmVyIHByb2ZpdGFibGUiKSwKKyAgICAgICAgY2xFbnVtVmFsTihGUE9wRnVzaW9uOjpTdGFuZGFyZCwgIm9uIiwgIk9ubHkgZnVzZSAnYmxlc3NlZCcgRlAgb3BzLiIpLAorICAgICAgICBjbEVudW1WYWxOKEZQT3BGdXNpb246OlN0cmljdCwgIm9mZiIsCisgICAgICAgICAgICAgICAgICAgIk9ubHkgZnVzZSBGUCBvcHMgd2hlbiB0aGUgcmVzdWx0IHdvbid0IGJlIGFmZmVjdGVkLiIpKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IERvbnRQbGFjZVplcm9zSW5CU1MoCisgICAgIm5vemVyby1pbml0aWFsaXplZC1pbi1ic3MiLAorICAgIGNsOjpkZXNjKCJEb24ndCBwbGFjZSB6ZXJvLWluaXRpYWxpemVkIHN5bWJvbHMgaW50byBic3Mgc2VjdGlvbiIpLAorICAgIGNsOjppbml0KGZhbHNlKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IEVuYWJsZUd1YXJhbnRlZWRUYWlsQ2FsbE9wdCgKKyAgICAidGFpbGNhbGxvcHQiLAorICAgIGNsOjpkZXNjKAorICAgICAgICAiVHVybiBmYXN0Y2MgY2FsbHMgaW50byB0YWlsIGNhbGxzIGJ5IChwb3RlbnRpYWxseSkgY2hhbmdpbmcgQUJJLiIpLAorICAgIGNsOjppbml0KGZhbHNlKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IERpc2FibGVUYWlsQ2FsbHMoImRpc2FibGUtdGFpbC1jYWxscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJOZXZlciBlbWl0IHRhaWwgY2FsbHMiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmluaXQoZmFsc2UpKTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4gU3RhY2tTeW1ib2xPcmRlcmluZygic3RhY2stc3ltYm9sLW9yZGVyaW5nIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIk9yZGVyIGxvY2FsIHN0YWNrIHN5bWJvbHMuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjppbml0KHRydWUpKTsKKworc3RhdGljIGNsOjpvcHQ8dW5zaWduZWQ+CisgICAgT3ZlcnJpZGVTdGFja0FsaWdubWVudCgic3RhY2stYWxpZ25tZW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJPdmVycmlkZSBkZWZhdWx0IHN0YWNrIGFsaWdubWVudCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmluaXQoMCkpOworCitzdGF0aWMgY2w6Om9wdDxib29sPgorICAgIFN0YWNrUmVhbGlnbigic3RhY2tyZWFsaWduIiwKKyAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIkZvcmNlIGFsaWduIHRoZSBzdGFjayB0byB0aGUgbWluaW11bSBhbGlnbm1lbnQiKSwKKyAgICAgICAgICAgICAgICAgY2w6OmluaXQoZmFsc2UpKTsKKworc3RhdGljIGNsOjpvcHQ8c3RkOjpzdHJpbmc+IFRyYXBGdW5jTmFtZSgKKyAgICAidHJhcC1mdW5jIiwgY2w6OkhpZGRlbiwKKyAgICBjbDo6ZGVzYygiRW1pdCBhIGNhbGwgdG8gdHJhcCBmdW5jdGlvbiByYXRoZXIgdGhhbiBhIHRyYXAgaW5zdHJ1Y3Rpb24iKSwKKyAgICBjbDo6aW5pdCgiIikpOworCitzdGF0aWMgY2w6Om9wdDxib29sPiBVc2VDdG9ycygidXNlLWN0b3JzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJVc2UgLmN0b3JzIGluc3RlYWQgb2YgLmluaXRfYXJyYXkuIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbDo6aW5pdChmYWxzZSkpOworCitzdGF0aWMgY2w6Om9wdDxib29sPiBSZWxheEVMRlJlbG9jYXRpb25zKAorICAgICJyZWxheC1lbGYtcmVsb2NhdGlvbnMiLAorICAgIGNsOjpkZXNjKCJFbWl0IEdPVFBDUkVMWC9SRVhfR09UUENSRUxYIGluc3RlYWQgb2YgR09UUENSRUwgb24geDg2LTY0IEVMRiIpLAorICAgIGNsOjppbml0KGZhbHNlKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IERhdGFTZWN0aW9ucygiZGF0YS1zZWN0aW9ucyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIkVtaXQgZGF0YSBpbnRvIHNlcGFyYXRlIHNlY3Rpb25zIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmluaXQoZmFsc2UpKTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KKyAgICBGdW5jdGlvblNlY3Rpb25zKCJmdW5jdGlvbi1zZWN0aW9ucyIsCisgICAgICAgICAgICAgICAgICAgICBjbDo6ZGVzYygiRW1pdCBmdW5jdGlvbnMgaW50byBzZXBhcmF0ZSBzZWN0aW9ucyIpLAorICAgICAgICAgICAgICAgICAgICAgY2w6OmluaXQoZmFsc2UpKTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4gRW11bGF0ZWRUTFMoImVtdWxhdGVkLXRscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbDo6ZGVzYygiVXNlIGVtdWxhdGVkIFRMUyBtb2RlbCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmluaXQoZmFsc2UpKTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4KKyAgICBVbmlxdWVTZWN0aW9uTmFtZXMoInVuaXF1ZS1zZWN0aW9uLW5hbWVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIkdpdmUgdW5pcXVlIG5hbWVzIHRvIGV2ZXJ5IHNlY3Rpb24iKSwKKyAgICAgICAgICAgICAgICAgICAgICAgY2w6OmluaXQodHJ1ZSkpOworCitzdGF0aWMgY2w6Om9wdDxsbHZtOjpFQUJJPgorICAgIEVBQklWZXJzaW9uKCJtZWFiaSIsIGNsOjpkZXNjKCJTZXQgRUFCSSB0eXBlIChkZWZhdWx0IGRlcGVuZHMgb24gdHJpcGxlKToiKSwKKyAgICAgICAgICAgICAgICBjbDo6aW5pdChFQUJJOjpEZWZhdWx0KSwKKyAgICAgICAgICAgICAgICBjbDo6dmFsdWVzKGNsRW51bVZhbE4oRUFCSTo6RGVmYXVsdCwgImRlZmF1bHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVHJpcGxlIGRlZmF1bHQgRUFCSSB2ZXJzaW9uIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjbEVudW1WYWxOKEVBQkk6OkVBQkk0LCAiNCIsICJFQUJJIHZlcnNpb24gNCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xFbnVtVmFsTihFQUJJOjpFQUJJNSwgIjUiLCAiRUFCSSB2ZXJzaW9uIDUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsRW51bVZhbE4oRUFCSTo6R05VLCAiZ251IiwgIkVBQkkgR05VIikpKTsKKworc3RhdGljIGNsOjpvcHQ8RGVidWdnZXJLaW5kPiBEZWJ1Z2dlclR1bmluZ09wdCgKKyAgICAiZGVidWdnZXItdHVuZSIsIGNsOjpkZXNjKCJUdW5lIGRlYnVnIGluZm8gZm9yIGEgcGFydGljdWxhciBkZWJ1Z2dlciIpLAorICAgIGNsOjppbml0KERlYnVnZ2VyS2luZDo6RGVmYXVsdCksCisgICAgY2w6OnZhbHVlcyhjbEVudW1WYWxOKERlYnVnZ2VyS2luZDo6R0RCLCAiZ2RiIiwgImdkYiIpLAorICAgICAgICAgICAgICAgY2xFbnVtVmFsTihEZWJ1Z2dlcktpbmQ6OkxMREIsICJsbGRiIiwgImxsZGIiKSwKKyAgICAgICAgICAgICAgIGNsRW51bVZhbE4oRGVidWdnZXJLaW5kOjpTQ0UsICJzY2UiLCAiU0NFIHRhcmdldHMgKGUuZy4gUFM0KSIpKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IEVuYWJsZVN0YWNrU2l6ZVNlY3Rpb24oCisgICAgInN0YWNrLXNpemUtc2VjdGlvbiIsCisgICAgY2w6OmRlc2MoIkVtaXQgYSBzZWN0aW9uIGNvbnRhaW5pbmcgc3RhY2sgc2l6ZSBtZXRhZGF0YSIpLCBjbDo6aW5pdChmYWxzZSkpOworCisvLyBDb21tb24gdXRpbGl0eSBmdW5jdGlvbiB0aWdodGx5IHRpZWQgdG8gdGhlIG9wdGlvbnMgbGlzdGVkIGhlcmUuIEluaXRpYWxpemVzCisvLyBhIFRhcmdldE9wdGlvbnMgb2JqZWN0IHdpdGggQ29kZUdlbiBmbGFncyBhbmQgcmV0dXJucyBpdC4KK3N0YXRpYyBUYXJnZXRPcHRpb25zIEluaXRUYXJnZXRPcHRpb25zRnJvbUNvZGVHZW5GbGFncygpIHsKKyAgVGFyZ2V0T3B0aW9ucyBPcHRpb25zOworICBPcHRpb25zLkFsbG93RlBPcEZ1c2lvbiA9IEZ1c2VGUE9wczsKKyAgT3B0aW9ucy5VbnNhZmVGUE1hdGggPSBFbmFibGVVbnNhZmVGUE1hdGg7CisgIE9wdGlvbnMuTm9JbmZzRlBNYXRoID0gRW5hYmxlTm9JbmZzRlBNYXRoOworICBPcHRpb25zLk5vTmFOc0ZQTWF0aCA9IEVuYWJsZU5vTmFOc0ZQTWF0aDsKKyAgT3B0aW9ucy5Ob1NpZ25lZFplcm9zRlBNYXRoID0gRW5hYmxlTm9TaWduZWRaZXJvc0ZQTWF0aDsKKyAgT3B0aW9ucy5Ob1RyYXBwaW5nRlBNYXRoID0gRW5hYmxlTm9UcmFwcGluZ0ZQTWF0aDsKKyAgT3B0aW9ucy5GUERlbm9ybWFsTW9kZSA9IERlbm9ybWFsTW9kZTsKKyAgT3B0aW9ucy5Ib25vclNpZ25EZXBlbmRlbnRSb3VuZGluZ0ZQTWF0aE9wdGlvbiA9CisgICAgICBFbmFibGVIb25vclNpZ25EZXBlbmRlbnRSb3VuZGluZ0ZQTWF0aDsKKyAgaWYgKEZsb2F0QUJJRm9yQ2FsbHMgIT0gRmxvYXRBQkk6OkRlZmF1bHQpCisgICAgT3B0aW9ucy5GbG9hdEFCSVR5cGUgPSBGbG9hdEFCSUZvckNhbGxzOworICBPcHRpb25zLk5vWmVyb3NJbkJTUyA9IERvbnRQbGFjZVplcm9zSW5CU1M7CisgIE9wdGlvbnMuR3VhcmFudGVlZFRhaWxDYWxsT3B0ID0gRW5hYmxlR3VhcmFudGVlZFRhaWxDYWxsT3B0OworICBPcHRpb25zLlN0YWNrQWxpZ25tZW50T3ZlcnJpZGUgPSBPdmVycmlkZVN0YWNrQWxpZ25tZW50OworICBPcHRpb25zLlN0YWNrU3ltYm9sT3JkZXJpbmcgPSBTdGFja1N5bWJvbE9yZGVyaW5nOworICBPcHRpb25zLlVzZUluaXRBcnJheSA9ICFVc2VDdG9yczsKKyAgT3B0aW9ucy5SZWxheEVMRlJlbG9jYXRpb25zID0gUmVsYXhFTEZSZWxvY2F0aW9uczsKKyAgT3B0aW9ucy5EYXRhU2VjdGlvbnMgPSBEYXRhU2VjdGlvbnM7CisgIE9wdGlvbnMuRnVuY3Rpb25TZWN0aW9ucyA9IEZ1bmN0aW9uU2VjdGlvbnM7CisgIE9wdGlvbnMuVW5pcXVlU2VjdGlvbk5hbWVzID0gVW5pcXVlU2VjdGlvbk5hbWVzOworICBPcHRpb25zLkVtdWxhdGVkVExTID0gRW11bGF0ZWRUTFM7CisgIE9wdGlvbnMuRXhwbGljaXRFbXVsYXRlZFRMUyA9IEVtdWxhdGVkVExTLmdldE51bU9jY3VycmVuY2VzKCkgPiAwOworICBPcHRpb25zLkV4Y2VwdGlvbk1vZGVsID0gRXhjZXB0aW9uTW9kZWw7CisgIE9wdGlvbnMuRW1pdFN0YWNrU2l6ZVNlY3Rpb24gPSBFbmFibGVTdGFja1NpemVTZWN0aW9uOworCisgIE9wdGlvbnMuTUNPcHRpb25zID0gSW5pdE1DVGFyZ2V0T3B0aW9uc0Zyb21GbGFncygpOworCisgIE9wdGlvbnMuVGhyZWFkTW9kZWwgPSBUTU1vZGVsOworICBPcHRpb25zLkVBQklWZXJzaW9uID0gRUFCSVZlcnNpb247CisgIE9wdGlvbnMuRGVidWdnZXJUdW5pbmcgPSBEZWJ1Z2dlclR1bmluZ09wdDsKKworICByZXR1cm4gT3B0aW9uczsKK30KKworTExWTV9BVFRSSUJVVEVfVU5VU0VEIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRDUFVTdHIoKSB7CisgIC8vIElmIHVzZXIgYXNrZWQgZm9yIHRoZSAnbmF0aXZlJyBDUFUsIGF1dG9kZXRlY3QgaGVyZS4gSWYgYXV0b2RlY3Rpb24gZmFpbHMsCisgIC8vIHRoaXMgd2lsbCBzZXQgdGhlIENQVSB0byBhbiBlbXB0eSBzdHJpbmcgd2hpY2ggdGVsbHMgdGhlIHRhcmdldCB0bworICAvLyBwaWNrIGEgYmFzaWMgZGVmYXVsdC4KKyAgaWYgKE1DUFUgPT0gIm5hdGl2ZSIpCisgICAgcmV0dXJuIHN5czo6Z2V0SG9zdENQVU5hbWUoKTsKKworICByZXR1cm4gTUNQVTsKK30KKworTExWTV9BVFRSSUJVVEVfVU5VU0VEIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRGZWF0dXJlc1N0cigpIHsKKyAgU3VidGFyZ2V0RmVhdHVyZXMgRmVhdHVyZXM7CisKKyAgLy8gSWYgdXNlciBhc2tlZCBmb3IgdGhlICduYXRpdmUnIENQVSwgd2UgbmVlZCB0byBhdXRvZGV0ZWN0IGZlYXR1cmVzLgorICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgeDg2IHdoZXJlIHRoZSBDUFUgbWlnaHQgbm90IHN1cHBvcnQgYWxsIHRoZQorICAvLyBmZWF0dXJlcyB0aGUgYXV0b2RldGVjdGVkIENQVSBuYW1lIGxpc3RzIGluIHRoZSB0YXJnZXQuIEZvciBleGFtcGxlLAorICAvLyBub3QgYWxsIFNhbmR5YnJpZGdlIHByb2Nlc3NvcnMgc3VwcG9ydCBBVlguCisgIGlmIChNQ1BVID09ICJuYXRpdmUiKSB7CisgICAgU3RyaW5nTWFwPGJvb2w+IEhvc3RGZWF0dXJlczsKKyAgICBpZiAoc3lzOjpnZXRIb3N0Q1BVRmVhdHVyZXMoSG9zdEZlYXR1cmVzKSkKKyAgICAgIGZvciAoYXV0byAmRiA6IEhvc3RGZWF0dXJlcykKKyAgICAgICAgRmVhdHVyZXMuQWRkRmVhdHVyZShGLmZpcnN0KCksIEYuc2Vjb25kKTsKKyAgfQorCisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTUF0dHJzLnNpemUoKTsgKytpKQorICAgIEZlYXR1cmVzLkFkZEZlYXR1cmUoTUF0dHJzW2ldKTsKKworICByZXR1cm4gRmVhdHVyZXMuZ2V0U3RyaW5nKCk7Cit9CisKK0xMVk1fQVRUUklCVVRFX1VOVVNFRCBzdGF0aWMgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdldEZlYXR1cmVMaXN0KCkgeworICBTdWJ0YXJnZXRGZWF0dXJlcyBGZWF0dXJlczsKKworICAvLyBJZiB1c2VyIGFza2VkIGZvciB0aGUgJ25hdGl2ZScgQ1BVLCB3ZSBuZWVkIHRvIGF1dG9kZXRlY3QgZmVhdHVyZXMuCisgIC8vIFRoaXMgaXMgbmVjZXNzYXJ5IGZvciB4ODYgd2hlcmUgdGhlIENQVSBtaWdodCBub3Qgc3VwcG9ydCBhbGwgdGhlCisgIC8vIGZlYXR1cmVzIHRoZSBhdXRvZGV0ZWN0ZWQgQ1BVIG5hbWUgbGlzdHMgaW4gdGhlIHRhcmdldC4gRm9yIGV4YW1wbGUsCisgIC8vIG5vdCBhbGwgU2FuZHlicmlkZ2UgcHJvY2Vzc29ycyBzdXBwb3J0IEFWWC4KKyAgaWYgKE1DUFUgPT0gIm5hdGl2ZSIpIHsKKyAgICBTdHJpbmdNYXA8Ym9vbD4gSG9zdEZlYXR1cmVzOworICAgIGlmIChzeXM6OmdldEhvc3RDUFVGZWF0dXJlcyhIb3N0RmVhdHVyZXMpKQorICAgICAgZm9yIChhdXRvICZGIDogSG9zdEZlYXR1cmVzKQorICAgICAgICBGZWF0dXJlcy5BZGRGZWF0dXJlKEYuZmlyc3QoKSwgRi5zZWNvbmQpOworICB9CisKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBNQXR0cnMuc2l6ZSgpOyArK2kpCisgICAgRmVhdHVyZXMuQWRkRmVhdHVyZShNQXR0cnNbaV0pOworCisgIHJldHVybiBGZWF0dXJlcy5nZXRGZWF0dXJlcygpOworfQorCisvLy8gXGJyaWVmIFNldCBmdW5jdGlvbiBhdHRyaWJ1dGVzIG9mIGZ1bmN0aW9ucyBpbiBNb2R1bGUgTSBiYXNlZCBvbiBDUFUsCisvLy8gRmVhdHVyZXMsIGFuZCBjb21tYW5kIGxpbmUgZmxhZ3MuCitMTFZNX0FUVFJJQlVURV9VTlVTRUQgc3RhdGljIHZvaWQKK3NldEZ1bmN0aW9uQXR0cmlidXRlcyhTdHJpbmdSZWYgQ1BVLCBTdHJpbmdSZWYgRmVhdHVyZXMsIE1vZHVsZSAmTSkgeworICBmb3IgKGF1dG8gJkYgOiBNKSB7CisgICAgYXV0byAmQ3R4ID0gRi5nZXRDb250ZXh0KCk7CisgICAgQXR0cmlidXRlTGlzdCBBdHRycyA9IEYuZ2V0QXR0cmlidXRlcygpOworICAgIEF0dHJCdWlsZGVyIE5ld0F0dHJzOworCisgICAgaWYgKCFDUFUuZW1wdHkoKSkKKyAgICAgIE5ld0F0dHJzLmFkZEF0dHJpYnV0ZSgidGFyZ2V0LWNwdSIsIENQVSk7CisgICAgaWYgKCFGZWF0dXJlcy5lbXB0eSgpKQorICAgICAgTmV3QXR0cnMuYWRkQXR0cmlidXRlKCJ0YXJnZXQtZmVhdHVyZXMiLCBGZWF0dXJlcyk7CisgICAgaWYgKERpc2FibGVGUEVsaW0uZ2V0TnVtT2NjdXJyZW5jZXMoKSA+IDApCisgICAgICBOZXdBdHRycy5hZGRBdHRyaWJ1dGUoIm5vLWZyYW1lLXBvaW50ZXItZWxpbSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlzYWJsZUZQRWxpbSA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICAgIGlmIChEaXNhYmxlVGFpbENhbGxzLmdldE51bU9jY3VycmVuY2VzKCkgPiAwKQorICAgICAgTmV3QXR0cnMuYWRkQXR0cmlidXRlKCJkaXNhYmxlLXRhaWwtY2FsbHMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvU3RyaW5nUmVmKERpc2FibGVUYWlsQ2FsbHMpKTsKKyAgICBpZiAoU3RhY2tSZWFsaWduKQorICAgICAgTmV3QXR0cnMuYWRkQXR0cmlidXRlKCJzdGFja3JlYWxpZ24iKTsKKworICAgIGlmIChUcmFwRnVuY05hbWUuZ2V0TnVtT2NjdXJyZW5jZXMoKSA+IDApCisgICAgICBmb3IgKGF1dG8gJkIgOiBGKQorICAgICAgICBmb3IgKGF1dG8gJkkgOiBCKQorICAgICAgICAgIGlmIChhdXRvICpDYWxsID0gZHluX2Nhc3Q8Q2FsbEluc3Q+KCZJKSkKKyAgICAgICAgICAgIGlmIChjb25zdCBhdXRvICpGID0gQ2FsbC0+Z2V0Q2FsbGVkRnVuY3Rpb24oKSkKKyAgICAgICAgICAgICAgaWYgKEYtPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjpkZWJ1Z3RyYXAgfHwKKyAgICAgICAgICAgICAgICAgIEYtPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjp0cmFwKQorICAgICAgICAgICAgICAgIENhbGwtPmFkZEF0dHJpYnV0ZSgKKyAgICAgICAgICAgICAgICAgICAgbGx2bTo6QXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwKKyAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlOjpnZXQoQ3R4LCAidHJhcC1mdW5jLW5hbWUiLCBUcmFwRnVuY05hbWUpKTsKKworICAgIC8vIExldCBOZXdBdHRycyBvdmVycmlkZSBBdHRycy4KKyAgICBGLnNldEF0dHJpYnV0ZXMoCisgICAgICAgIEF0dHJzLmFkZEF0dHJpYnV0ZXMoQ3R4LCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBOZXdBdHRycykpOworICB9Cit9CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vQ29zdFRhYmxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vQ29zdFRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjMTZkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9Db3N0VGFibGUuaApAQCAtMCwwICsxLDY5IEBACisvLz09PS0tIENvc3RUYWJsZS5oIC0gSW5zdHJ1Y3Rpb24gQ29zdCBUYWJsZSBoYW5kbGluZyAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgQ29zdCB0YWJsZXMgYW5kIHNpbXBsZSBsb29rdXAgZnVuY3Rpb25zCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0NPU1RUQUJMRV9IXworI2RlZmluZSBMTFZNX0NPREVHRU5fQ09TVFRBQkxFX0hfCisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYWNoaW5lVmFsdWVUeXBlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIENvc3QgVGFibGUgRW50cnkKK3N0cnVjdCBDb3N0VGJsRW50cnkgeworICBpbnQgSVNEOworICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBUeXBlOworICB1bnNpZ25lZCBDb3N0OworfTsKKworLy8vIEZpbmQgaW4gY29zdCB0YWJsZSwgVHlwZVR5IG11c3QgYmUgY29tcGFyYWJsZSB0byBDb21wYXJlVHkgYnkgPT0KK2lubGluZSBjb25zdCBDb3N0VGJsRW50cnkgKkNvc3RUYWJsZUxvb2t1cChBcnJheVJlZjxDb3N0VGJsRW50cnk+IFRibCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgSVNELCBNVlQgVHkpIHsKKyAgYXV0byBJID0gZmluZF9pZihUYmwsIFs9XShjb25zdCBDb3N0VGJsRW50cnkgJkVudHJ5KSB7CisgICAgcmV0dXJuIElTRCA9PSBFbnRyeS5JU0QgJiYgVHkgPT0gRW50cnkuVHlwZTsKKyAgfSk7CisgIGlmIChJICE9IFRibC5lbmQoKSkKKyAgICByZXR1cm4gSTsKKworICAvLyBDb3VsZCBub3QgZmluZCBhbiBlbnRyeS4KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vLyBUeXBlIENvbnZlcnNpb24gQ29zdCBUYWJsZQorc3RydWN0IFR5cGVDb252ZXJzaW9uQ29zdFRibEVudHJ5IHsKKyAgaW50IElTRDsKKyAgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgRHN0OworICBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBTcmM7CisgIHVuc2lnbmVkIENvc3Q7Cit9OworCisvLy8gRmluZCBpbiB0eXBlIGNvbnZlcnNpb24gY29zdCB0YWJsZSwgVHlwZVR5IG11c3QgYmUgY29tcGFyYWJsZSB0byBDb21wYXJlVHkKKy8vLyBieSA9PQoraW5saW5lIGNvbnN0IFR5cGVDb252ZXJzaW9uQ29zdFRibEVudHJ5ICoKK0NvbnZlcnRDb3N0VGFibGVMb29rdXAoQXJyYXlSZWY8VHlwZUNvbnZlcnNpb25Db3N0VGJsRW50cnk+IFRibCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50IElTRCwgTVZUIERzdCwgTVZUIFNyYykgeworICBhdXRvIEkgPSBmaW5kX2lmKFRibCwgWz1dKGNvbnN0IFR5cGVDb252ZXJzaW9uQ29zdFRibEVudHJ5ICZFbnRyeSkgeworICAgIHJldHVybiBJU0QgPT0gRW50cnkuSVNEICYmIFNyYyA9PSBFbnRyeS5TcmMgJiYgRHN0ID09IEVudHJ5LkRzdDsKKyAgfSk7CisgIGlmIChJICE9IFRibC5lbmQoKSkKKyAgICByZXR1cm4gSTsKKworICAvLyBDb3VsZCBub3QgZmluZCBhbiBlbnRyeS4KKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8qIExMVk1fQ09ERUdFTl9DT1NUVEFCTEVfSF8gKi8KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9EQUdDb21iaW5lLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vREFHQ29tYmluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiNTkxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vREFHQ29tYmluZS5oCkBAIC0wLDAgKzEsMjUgQEAKKy8vPT09LS0gbGx2bS9Db2RlR2VuL0RBR0NvbWJpbmUuaCAgLS0tLS0tLSBTZWxlY3Rpb25EQUcgTm9kZXMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9EQUdDT01CSU5FX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0RBR0NPTUJJTkVfSAorCituYW1lc3BhY2UgbGx2bSB7CisKK2VudW0gQ29tYmluZUxldmVsIHsKKyAgQmVmb3JlTGVnYWxpemVUeXBlcywKKyAgQWZ0ZXJMZWdhbGl6ZVR5cGVzLAorICBBZnRlckxlZ2FsaXplVmVjdG9yT3BzLAorICBBZnRlckxlZ2FsaXplREFHCit9OworCit9IC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9ERkFQYWNrZXRpemVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vREZBUGFja2V0aXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzYWFiZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vREZBUGFja2V0aXplci5oCkBAIC0wLDAgKzEsMjIyIEBACisvLz09PS0gbGx2bS9Db2RlR2VuL0RGQVBhY2tldGl6ZXIuaCAtIERGQSBQYWNrZXRpemVyIGZvciBWTElXIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgZGV0ZXJtaW5pc3RpYyBmaW5pdGUgYXV0b21hdG9uIChERkEpIGJhc2VkCisvLyBwYWNrZXRpemluZyBtZWNoYW5pc20gZm9yIFZMSVcgYXJjaGl0ZWN0dXJlcy4gSXQgcHJvdmlkZXMgQVBJcyB0bworLy8gZGV0ZXJtaW5lIHdoZXRoZXIgdGhlcmUgZXhpc3RzIGEgbGVnYWwgbWFwcGluZyBvZiBpbnN0cnVjdGlvbnMgdG8KKy8vIGZ1bmN0aW9uYWwgdW5pdCBhc3NpZ25tZW50cyBpbiBhIHBhY2tldC4gVGhlIERGQSBpcyBhdXRvLWdlbmVyYXRlZCBmcm9tCisvLyB0aGUgdGFyZ2V0J3MgU2NoZWR1bGUudGQgZmlsZS4KKy8vCisvLyBBIERGQSBjb25zaXN0cyBvZiAzIG1ham9yIGVsZW1lbnRzOiBzdGF0ZXMsIGlucHV0cywgYW5kIHRyYW5zaXRpb25zLiBGb3IKKy8vIHRoZSBwYWNrZXRpemluZyBtZWNoYW5pc20sIHRoZSBpbnB1dCBpcyB0aGUgc2V0IG9mIGluc3RydWN0aW9uIGNsYXNzZXMgZm9yCisvLyBhIHRhcmdldC4gVGhlIHN0YXRlIG1vZGVscyBhbGwgcG9zc2libGUgY29tYmluYXRpb25zIG9mIGZ1bmN0aW9uYWwgdW5pdAorLy8gY29uc3VtcHRpb24gZm9yIGEgZ2l2ZW4gc2V0IG9mIGluc3RydWN0aW9ucyBpbiBhIHBhY2tldC4gQSB0cmFuc2l0aW9uCisvLyBtb2RlbHMgdGhlIGFkZGl0aW9uIG9mIGFuIGluc3RydWN0aW9uIHRvIGEgcGFja2V0LiBJbiB0aGUgREZBIGNvbnN0cnVjdGVkCisvLyBieSB0aGlzIGNsYXNzLCBpZiBhbiBpbnN0cnVjdGlvbiBjYW4gYmUgYWRkZWQgdG8gYSBwYWNrZXQsIHRoZW4gYSB2YWxpZAorLy8gdHJhbnNpdGlvbiBleGlzdHMgZnJvbSB0aGUgY29ycmVzcG9uZGluZyBzdGF0ZS4gSW52YWxpZCB0cmFuc2l0aW9ucworLy8gaW5kaWNhdGUgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gY2Fubm90IGJlIGFkZGVkIHRvIHRoZSBjdXJyZW50IHBhY2tldC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9ERkFQQUNLRVRJWkVSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0RGQVBBQ0tFVElaRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUdNdXRhdGlvbi5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBEZWZhdWx0VkxJV1NjaGVkdWxlcjsKK2NsYXNzIEluc3RySXRpbmVyYXJ5RGF0YTsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIE1hY2hpbmVMb29wSW5mbzsKK2NsYXNzIE1DSW5zdHJEZXNjOworY2xhc3MgU1VuaXQ7CitjbGFzcyBUYXJnZXRJbnN0ckluZm87CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEZWZpbml0aW9ucyBzaGFyZWQgYmV0d2VlbiBERkFQYWNrZXRpemVyLmNwcCBhbmQgREZBUGFja2V0aXplckVtaXR0ZXIuY3BwCisKKy8vIERGQV9NQVhfUkVTVEVSTVMgKiBERkFfTUFYX1JFU09VUkNFUyBtdXN0IGZpdCB3aXRoaW4gc2l6ZW9mIERGQUlucHV0LgorLy8gVGhpcyBpcyB2ZXJpZmllZCBpbiBERkFQYWNrZXRpemVyLmNwcDpERkFQYWNrZXRpemVyOjpERkFQYWNrZXRpemVyLgorLy8KKy8vIGUuZy4gdGVybXMgeCByZXNvdXJjZSBiaXQgY29tYmluYXRpb25zIHRoYXQgZml0IGluIHVpbnQzMl90OgorLy8gICAgICA0IHRlcm1zIHggOCAgYml0cyA9IDMyIGJpdHMKKy8vICAgICAgMyB0ZXJtcyB4IDEwIGJpdHMgPSAzMCBiaXRzCisvLyAgICAgIDIgdGVybXMgeCAxNiBiaXRzID0gMzIgYml0cworLy8KKy8vIGUuZy4gdGVybXMgeCByZXNvdXJjZSBiaXQgY29tYmluYXRpb25zIHRoYXQgZml0IGluIHVpbnQ2NF90OgorLy8gICAgICA4IHRlcm1zIHggOCAgYml0cyA9IDY0IGJpdHMKKy8vICAgICAgNyB0ZXJtcyB4IDkgIGJpdHMgPSA2MyBiaXRzCisvLyAgICAgIDYgdGVybXMgeCAxMCBiaXRzID0gNjAgYml0cworLy8gICAgICA1IHRlcm1zIHggMTIgYml0cyA9IDYwIGJpdHMKKy8vICAgICAgNCB0ZXJtcyB4IDE2IGJpdHMgPSA2NCBiaXRzIDwtLS0gY3VycmVudAorLy8gICAgICAzIHRlcm1zIHggMjEgYml0cyA9IDYzIGJpdHMKKy8vICAgICAgMiB0ZXJtcyB4IDMyIGJpdHMgPSA2NCBiaXRzCisvLworI2RlZmluZSBERkFfTUFYX1JFU1RFUk1TICAgICAgICA0ICAgLy8gVGhlIG1heCAjIG9mIEFORCdlZCByZXNvdXJjZSB0ZXJtcy4KKyNkZWZpbmUgREZBX01BWF9SRVNPVVJDRVMgICAgICAgMTYgIC8vIFRoZSBtYXggIyBvZiByZXNvdXJjZSBiaXRzIGluIG9uZSB0ZXJtLgorCit1c2luZyBERkFJbnB1dCA9IHVpbnQ2NF90OwordXNpbmcgREZBU3RhdGVJbnB1dCA9IGludDY0X3Q7CisKKyNkZWZpbmUgREZBX1RCTFRZUEUgICAgICAgICAgICAgImludDY0X3QiIC8vIEZvciBnZW5lcmF0aW5nIERGQVN0YXRlSW5wdXRUYWJsZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIERGQVBhY2tldGl6ZXIgeworcHJpdmF0ZToKKyAgdXNpbmcgVW5zaWduUGFpciA9IHN0ZDo6cGFpcjx1bnNpZ25lZCwgREZBSW5wdXQ+OworCisgIGNvbnN0IEluc3RySXRpbmVyYXJ5RGF0YSAqSW5zdHJJdGluczsKKyAgaW50IEN1cnJlbnRTdGF0ZSA9IDA7CisgIGNvbnN0IERGQVN0YXRlSW5wdXQgKCpERkFTdGF0ZUlucHV0VGFibGUpWzJdOworICBjb25zdCB1bnNpZ25lZCAqREZBU3RhdGVFbnRyeVRhYmxlOworCisgIC8vIENhY2hlZFRhYmxlIGlzIGEgbWFwIGZyb20gPEZyb21TdGF0ZSwgSW5wdXQ+IHRvIFRvU3RhdGUuCisgIERlbnNlTWFwPFVuc2lnblBhaXIsIHVuc2lnbmVkPiBDYWNoZWRUYWJsZTsKKworICAvLyBSZWFkIHRoZSBERkEgdHJhbnNpdGlvbiB0YWJsZSBhbmQgdXBkYXRlIENhY2hlZFRhYmxlLgorICB2b2lkIFJlYWRUYWJsZSh1bnNpZ25lZCBzdGF0ZSk7CisKK3B1YmxpYzoKKyAgREZBUGFja2V0aXplcihjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEgKkksIGNvbnN0IERGQVN0YXRlSW5wdXQgKCpTSVQpWzJdLAorICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkICpTRVQpOworCisgIC8vIFJlc2V0IHRoZSBjdXJyZW50IHN0YXRlIHRvIG1ha2UgYWxsIHJlc291cmNlcyBhdmFpbGFibGUuCisgIHZvaWQgY2xlYXJSZXNvdXJjZXMoKSB7CisgICAgQ3VycmVudFN0YXRlID0gMDsKKyAgfQorCisgIC8vIFJldHVybiB0aGUgREZBSW5wdXQgZm9yIGFuIGluc3RydWN0aW9uIGNsYXNzLgorICBERkFJbnB1dCBnZXRJbnNuSW5wdXQodW5zaWduZWQgSW5zbkNsYXNzKTsKKworICAvLyBSZXR1cm4gdGhlIERGQUlucHV0IGZvciBhbiBpbnN0cnVjdGlvbiBjbGFzcyBpbnB1dCB2ZWN0b3IuCisgIHN0YXRpYyBERkFJbnB1dCBnZXRJbnNuSW5wdXQoY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZJbnNuQ2xhc3MpOworCisgIC8vIENoZWNrIGlmIHRoZSByZXNvdXJjZXMgb2NjdXBpZWQgYnkgYSBNQ0luc3RyRGVzYyBhcmUgYXZhaWxhYmxlIGluCisgIC8vIHRoZSBjdXJyZW50IHN0YXRlLgorICBib29sIGNhblJlc2VydmVSZXNvdXJjZXMoY29uc3QgTUNJbnN0ckRlc2MgKk1JRCk7CisKKyAgLy8gUmVzZXJ2ZSB0aGUgcmVzb3VyY2VzIG9jY3VwaWVkIGJ5IGEgTUNJbnN0ckRlc2MgYW5kIGNoYW5nZSB0aGUgY3VycmVudAorICAvLyBzdGF0ZSB0byByZWZsZWN0IHRoYXQgY2hhbmdlLgorICB2b2lkIHJlc2VydmVSZXNvdXJjZXMoY29uc3QgTUNJbnN0ckRlc2MgKk1JRCk7CisKKyAgLy8gQ2hlY2sgaWYgdGhlIHJlc291cmNlcyBvY2N1cGllZCBieSBhIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gYXJlIGF2YWlsYWJsZQorICAvLyBpbiB0aGUgY3VycmVudCBzdGF0ZS4KKyAgYm9vbCBjYW5SZXNlcnZlUmVzb3VyY2VzKE1hY2hpbmVJbnN0ciAmTUkpOworCisgIC8vIFJlc2VydmUgdGhlIHJlc291cmNlcyBvY2N1cGllZCBieSBhIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gYW5kIGNoYW5nZSB0aGUKKyAgLy8gY3VycmVudCBzdGF0ZSB0byByZWZsZWN0IHRoYXQgY2hhbmdlLgorICB2b2lkIHJlc2VydmVSZXNvdXJjZXMoTWFjaGluZUluc3RyICZNSSk7CisKKyAgY29uc3QgSW5zdHJJdGluZXJhcnlEYXRhICpnZXRJbnN0ckl0aW5zKCkgY29uc3QgeyByZXR1cm4gSW5zdHJJdGluczsgfQorfTsKKworLy8gVkxJV1BhY2tldGl6ZXJMaXN0IGltcGxlbWVudHMgYSBzaW1wbGUgVkxJVyBwYWNrZXRpemVyIHVzaW5nIERGQS4gVGhlCisvLyBwYWNrZXRpemVyIHdvcmtzIG9uIG1hY2hpbmUgYmFzaWMgYmxvY2tzLiBGb3IgZWFjaCBpbnN0cnVjdGlvbiBJIGluIEJCLAorLy8gdGhlIHBhY2tldGl6ZXIgY29uc3VsdHMgdGhlIERGQSB0byBzZWUgaWYgbWFjaGluZSByZXNvdXJjZXMgYXJlIGF2YWlsYWJsZQorLy8gdG8gZXhlY3V0ZSBJLiBJZiBzbywgdGhlIHBhY2tldGl6ZXIgY2hlY2tzIGlmIEkgZGVwZW5kcyBvbiBhbnkgaW5zdHJ1Y3Rpb24KKy8vIGluIHRoZSBjdXJyZW50IHBhY2tldC4gSWYgbm8gZGVwZW5kZW5jeSBpcyBmb3VuZCwgSSBpcyBhZGRlZCB0byBjdXJyZW50CisvLyBwYWNrZXQgYW5kIHRoZSBtYWNoaW5lIHJlc291cmNlIGlzIG1hcmtlZCBhcyB0YWtlbi4gSWYgYW55IGRlcGVuZGVuY3kgaXMKKy8vIGZvdW5kLCBhIHRhcmdldCBBUEkgY2FsbCBpcyBtYWRlIHRvIHBydW5lIHRoZSBkZXBlbmRlbmNlLgorY2xhc3MgVkxJV1BhY2tldGl6ZXJMaXN0IHsKK3Byb3RlY3RlZDoKKyAgTWFjaGluZUZ1bmN0aW9uICZNRjsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7CisgIEFsaWFzQW5hbHlzaXMgKkFBOworCisgIC8vIFRoZSBWTElXIFNjaGVkdWxlci4KKyAgRGVmYXVsdFZMSVdTY2hlZHVsZXIgKlZMSVdTY2hlZHVsZXI7CisgIC8vIFZlY3RvciBvZiBpbnN0cnVjdGlvbnMgYXNzaWduZWQgdG8gdGhlIGN1cnJlbnQgcGFja2V0LgorICBzdGQ6OnZlY3RvcjxNYWNoaW5lSW5zdHIqPiBDdXJyZW50UGFja2V0TUlzOworICAvLyBERkEgcmVzb3VyY2UgdHJhY2tlci4KKyAgREZBUGFja2V0aXplciAqUmVzb3VyY2VUcmFja2VyOworICAvLyBNYXA6IE1JIC0+IFNVLgorICBzdGQ6Om1hcDxNYWNoaW5lSW5zdHIqLCBTVW5pdCo+IE1JVG9TVW5pdDsKKworcHVibGljOgorICAvLyBUaGUgQWxpYXNBbmFseXNpcyBwYXJhbWV0ZXIgY2FuIGJlIG51bGxwdHIuCisgIFZMSVdQYWNrZXRpemVyTGlzdChNYWNoaW5lRnVuY3Rpb24gJk1GLCBNYWNoaW5lTG9vcEluZm8gJk1MSSwKKyAgICAgICAgICAgICAgICAgICAgIEFsaWFzQW5hbHlzaXMgKkFBKTsKKworICB2aXJ0dWFsIH5WTElXUGFja2V0aXplckxpc3QoKTsKKworICAvLyBJbXBsZW1lbnQgdGhpcyBBUEkgaW4gdGhlIGJhY2tlbmQgdG8gYnVuZGxlIGluc3RydWN0aW9ucy4KKyAgdm9pZCBQYWNrZXRpemVNSXMoTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEJlZ2luSXRyLAorICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgRW5kSXRyKTsKKworICAvLyBSZXR1cm4gdGhlIFJlc291cmNlVHJhY2tlci4KKyAgREZBUGFja2V0aXplciAqZ2V0UmVzb3VyY2VUcmFja2VyKCkge3JldHVybiBSZXNvdXJjZVRyYWNrZXI7fQorCisgIC8vIGFkZFRvUGFja2V0IC0gQWRkIE1JIHRvIHRoZSBjdXJyZW50IHBhY2tldC4KKyAgdmlydHVhbCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgYWRkVG9QYWNrZXQoTWFjaGluZUluc3RyICZNSSkgeworICAgIEN1cnJlbnRQYWNrZXRNSXMucHVzaF9iYWNrKCZNSSk7CisgICAgUmVzb3VyY2VUcmFja2VyLT5yZXNlcnZlUmVzb3VyY2VzKE1JKTsKKyAgICByZXR1cm4gTUk7CisgIH0KKworICAvLyBFbmQgdGhlIGN1cnJlbnQgcGFja2V0IGFuZCByZXNldCB0aGUgc3RhdGUgb2YgdGhlIHBhY2tldGl6ZXIuCisgIC8vIE92ZXJyaWRpbmcgdGhpcyBmdW5jdGlvbiBhbGxvd3MgdGhlIHRhcmdldC1zcGVjaWZpYyBwYWNrZXRpemVyCisgIC8vIHRvIHBlcmZvcm0gY3VzdG9tIGZpbmFsaXphdGlvbi4KKyAgdmlydHVhbCB2b2lkIGVuZFBhY2tldChNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSk7CisKKyAgLy8gUGVyZm9ybSBpbml0aWFsaXphdGlvbiBiZWZvcmUgcGFja2V0aXppbmcgYW4gaW5zdHJ1Y3Rpb24uIFRoaXMKKyAgLy8gZnVuY3Rpb24gaXMgc3VwcG9zZWQgdG8gYmUgb3ZlcnJpZGVkIGJ5IHRoZSB0YXJnZXQgZGVwZW5kZW50IHBhY2tldGl6ZXIuCisgIHZpcnR1YWwgdm9pZCBpbml0UGFja2V0aXplclN0YXRlKCkge30KKworICAvLyBDaGVjayBpZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gSSBzaG91bGQgYmUgaWdub3JlZCBieSB0aGUgcGFja2V0aXplci4KKyAgdmlydHVhbCBib29sIGlnbm9yZVBzZXVkb0luc3RydWN0aW9uKGNvbnN0IE1hY2hpbmVJbnN0ciAmSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBSZXR1cm4gdHJ1ZSBpZiBpbnN0cnVjdGlvbiBNSSBjYW4gbm90IGJlIHBhY2tldGl6ZWQgd2l0aCBhbnkgb3RoZXIKKyAgLy8gaW5zdHJ1Y3Rpb24sIHdoaWNoIG1lYW5zIHRoYXQgTUkgaXRzZWxmIGlzIGEgcGFja2V0LgorICB2aXJ0dWFsIGJvb2wgaXNTb2xvSW5zdHJ1Y3Rpb24oY29uc3QgTWFjaGluZUluc3RyICZNSSkgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vIENoZWNrIGlmIHRoZSBwYWNrZXRpemVyIHNob3VsZCB0cnkgdG8gYWRkIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiB0bworICAvLyB0aGUgY3VycmVudCBwYWNrZXQuIE9uZSByZWFzb25zIGZvciB3aGljaCBpdCBtYXkgbm90IGJlIGRlc2lyYWJsZQorICAvLyB0byBpbmNsdWRlIGFuIGluc3RydWN0aW9uIGluIHRoZSBjdXJyZW50IHBhY2tldCBjb3VsZCBiZSB0aGF0IGl0CisgIC8vIHdvdWxkIGNhdXNlIGEgc3RhbGwuCisgIC8vIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyAiZmFsc2UiLCB0aGUgY3VycmVudCBwYWNrZXQgd2lsbCBiZSBlbmRlZCwKKyAgLy8gYW5kIHRoZSBpbnN0cnVjdGlvbiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBuZXh0IHBhY2tldC4KKyAgdmlydHVhbCBib29sIHNob3VsZEFkZFRvUGFja2V0KGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIHsgcmV0dXJuIHRydWU7IH0KKworICAvLyBDaGVjayBpZiBpdCBpcyBsZWdhbCB0byBwYWNrZXRpemUgU1VJIGFuZCBTVUogdG9nZXRoZXIuCisgIHZpcnR1YWwgYm9vbCBpc0xlZ2FsVG9QYWNrZXRpemVUb2dldGhlcihTVW5pdCAqU1VJLCBTVW5pdCAqU1VKKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gQ2hlY2sgaWYgaXQgaXMgbGVnYWwgdG8gcHJ1bmUgZGVwZW5kZWNlIGJldHdlZW4gU1VJIGFuZCBTVUouCisgIHZpcnR1YWwgYm9vbCBpc0xlZ2FsVG9QcnVuZURlcGVuZGVuY2llcyhTVW5pdCAqU1VJLCBTVW5pdCAqU1VKKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gQWRkIGEgREFHIG11dGF0aW9uIHRvIGJlIGRvbmUgYmVmb3JlIHRoZSBwYWNrZXRpemF0aW9uIGJlZ2lucy4KKyAgdm9pZCBhZGRNdXRhdGlvbihzdGQ6OnVuaXF1ZV9wdHI8U2NoZWR1bGVEQUdNdXRhdGlvbj4gTXV0YXRpb24pOworCisgIGJvb2wgYWxpYXMoY29uc3QgTWFjaGluZUluc3RyICZNSTEsIGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkyLAorICAgICAgICAgICAgIGJvb2wgVXNlVEJBQSA9IHRydWUpIGNvbnN0OworCitwcml2YXRlOgorICBib29sIGFsaWFzKGNvbnN0IE1hY2hpbmVNZW1PcGVyYW5kICZPcDEsIGNvbnN0IE1hY2hpbmVNZW1PcGVyYW5kICZPcDIsCisgICAgICAgICAgICAgYm9vbCBVc2VUQkFBID0gdHJ1ZSkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0RGQVBBQ0tFVElaRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0RJRS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0RJRS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MDlmYzkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vRElFLmgKQEAgLTAsMCArMSw5MTAgQEAKKy8vPT09LSBsaWIvQ29kZUdlbi9ESUUuaCAtIERXQVJGIEluZm8gRW50cmllcyAtLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGF0YSBzdHJ1Y3R1cmVzIGZvciBEV0FSRiBpbmZvIGVudHJpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0xJQl9DT0RFR0VOX0FTTVBSSU5URVJfRElFX0gKKyNkZWZpbmUgTExWTV9MSUJfQ09ERUdFTl9BU01QUklOVEVSX0RJRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVyVW5pb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9Ed2FyZlN0cmluZ1Bvb2xFbnRyeS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGlnbk9mLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBc21QcmludGVyOworY2xhc3MgRElFOworY2xhc3MgRElFVW5pdDsKK2NsYXNzIE1DRXhwcjsKK2NsYXNzIE1DU2VjdGlvbjsKK2NsYXNzIE1DU3ltYm9sOworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIER3YXJmIGFiYnJldmlhdGlvbiBkYXRhLCBkZXNjcmliZXMgb25lIGF0dHJpYnV0ZSBvZiBhIER3YXJmIGFiYnJldmlhdGlvbi4KK2NsYXNzIERJRUFiYnJldkRhdGEgeworICAvLy8gRHdhcmYgYXR0cmlidXRlIGNvZGUuCisgIGR3YXJmOjpBdHRyaWJ1dGUgQXR0cmlidXRlOworCisgIC8vLyBEd2FyZiBmb3JtIGNvZGUuCisgIGR3YXJmOjpGb3JtIEZvcm07CisKKyAgLy8vIER3YXJmIGF0dHJpYnV0ZSB2YWx1ZSBmb3IgRFdfRk9STV9pbXBsaWNpdF9jb25zdAorICBpbnQ2NF90IFZhbHVlID0gMDsKKworcHVibGljOgorICBESUVBYmJyZXZEYXRhKGR3YXJmOjpBdHRyaWJ1dGUgQSwgZHdhcmY6OkZvcm0gRikKKyAgICAgIDogQXR0cmlidXRlKEEpLCBGb3JtKEYpIHt9CisgIERJRUFiYnJldkRhdGEoZHdhcmY6OkF0dHJpYnV0ZSBBLCBpbnQ2NF90IFYpCisgICAgICA6IEF0dHJpYnV0ZShBKSwgRm9ybShkd2FyZjo6RFdfRk9STV9pbXBsaWNpdF9jb25zdCksIFZhbHVlKFYpIHt9CisKKyAgLy8vIEFjY2Vzc29ycy4KKyAgLy8vIEB7CisgIGR3YXJmOjpBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKCkgY29uc3QgeyByZXR1cm4gQXR0cmlidXRlOyB9CisgIGR3YXJmOjpGb3JtIGdldEZvcm0oKSBjb25zdCB7IHJldHVybiBGb3JtOyB9CisgIGludDY0X3QgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZTsgfQorICAvLy8gQH0KKworICAvLy8gVXNlZCB0byBnYXRoZXIgdW5pcXVlIGRhdGEgZm9yIHRoZSBhYmJyZXZpYXRpb24gZm9sZGluZyBzZXQuCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Q7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBEd2FyZiBhYmJyZXZpYXRpb24sIGRlc2NyaWJlcyB0aGUgb3JnYW5pemF0aW9uIG9mIGEgZGVidWcgaW5mb3JtYXRpb24KKy8vLyBvYmplY3QuCitjbGFzcyBESUVBYmJyZXYgOiBwdWJsaWMgRm9sZGluZ1NldE5vZGUgeworICAvLy8gVW5pcXVlIG51bWJlciBmb3Igbm9kZS4KKyAgdW5zaWduZWQgTnVtYmVyOworCisgIC8vLyBEd2FyZiB0YWcgY29kZS4KKyAgZHdhcmY6OlRhZyBUYWc7CisKKyAgLy8vIFdoZXRoZXIgb3Igbm90IHRoaXMgbm9kZSBoYXMgY2hpbGRyZW4uCisgIC8vLworICAvLy8gVGhpcyBjaGVhdHMgYSBiaXQgaW4gYWxsIG9mIHRoZSB1c2VzIHNpbmNlIHRoZSB2YWx1ZXMgaW4gdGhlIHN0YW5kYXJkCisgIC8vLyBhcmUgMCBhbmQgMSBmb3Igbm8gY2hpbGRyZW4gYW5kIGNoaWxkcmVuIHJlc3BlY3RpdmVseS4KKyAgYm9vbCBDaGlsZHJlbjsKKworICAvLy8gUmF3IGRhdGEgYnl0ZXMgZm9yIGFiYnJldmlhdGlvbi4KKyAgU21hbGxWZWN0b3I8RElFQWJicmV2RGF0YSwgMTI+IERhdGE7CisKK3B1YmxpYzoKKyAgRElFQWJicmV2KGR3YXJmOjpUYWcgVCwgYm9vbCBDKSA6IFRhZyhUKSwgQ2hpbGRyZW4oQykge30KKworICAvLy8gQWNjZXNzb3JzLgorICAvLy8gQHsKKyAgZHdhcmY6OlRhZyBnZXRUYWcoKSBjb25zdCB7IHJldHVybiBUYWc7IH0KKyAgdW5zaWduZWQgZ2V0TnVtYmVyKCkgY29uc3QgeyByZXR1cm4gTnVtYmVyOyB9CisgIGJvb2wgaGFzQ2hpbGRyZW4oKSBjb25zdCB7IHJldHVybiBDaGlsZHJlbjsgfQorICBjb25zdCBTbWFsbFZlY3RvckltcGw8RElFQWJicmV2RGF0YT4gJmdldERhdGEoKSBjb25zdCB7IHJldHVybiBEYXRhOyB9CisgIHZvaWQgc2V0Q2hpbGRyZW5GbGFnKGJvb2wgaGFzQ2hpbGQpIHsgQ2hpbGRyZW4gPSBoYXNDaGlsZDsgfQorICB2b2lkIHNldE51bWJlcih1bnNpZ25lZCBOKSB7IE51bWJlciA9IE47IH0KKyAgLy8vIEB9CisKKyAgLy8vIEFkZHMgYW5vdGhlciBzZXQgb2YgYXR0cmlidXRlIGluZm9ybWF0aW9uIHRvIHRoZSBhYmJyZXZpYXRpb24uCisgIHZvaWQgQWRkQXR0cmlidXRlKGR3YXJmOjpBdHRyaWJ1dGUgQXR0cmlidXRlLCBkd2FyZjo6Rm9ybSBGb3JtKSB7CisgICAgRGF0YS5wdXNoX2JhY2soRElFQWJicmV2RGF0YShBdHRyaWJ1dGUsIEZvcm0pKTsKKyAgfQorCisgIC8vLyBBZGRzIGF0dHJpYnV0ZSB3aXRoIERXX0ZPUk1faW1wbGljaXRfY29uc3QgdmFsdWUKKyAgdm9pZCBBZGRJbXBsaWNpdENvbnN0QXR0cmlidXRlKGR3YXJmOjpBdHRyaWJ1dGUgQXR0cmlidXRlLCBpbnQ2NF90IFZhbHVlKSB7CisgICAgRGF0YS5wdXNoX2JhY2soRElFQWJicmV2RGF0YShBdHRyaWJ1dGUsIFZhbHVlKSk7CisgIH0KKworICAvLy8gVXNlZCB0byBnYXRoZXIgdW5pcXVlIGRhdGEgZm9yIHRoZSBhYmJyZXZpYXRpb24gZm9sZGluZyBzZXQuCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Q7CisKKyAgLy8vIFByaW50IHRoZSBhYmJyZXZpYXRpb24gdXNpbmcgdGhlIHNwZWNpZmllZCBhc20gcHJpbnRlci4KKyAgdm9pZCBFbWl0KGNvbnN0IEFzbVByaW50ZXIgKkFQKSBjb25zdDsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBIZWxwcyB1bmlxdWUgRElFQWJicmV2IG9iamVjdHMgYW5kIGFzc2lnbnMgYWJicmV2aWF0aW9uIG51bWJlcnMuCisvLy8KKy8vLyBUaGlzIGNsYXNzIHdpbGwgdW5pcXVlIHRoZSBESUUgYWJicmV2aWF0aW9ucyBmb3IgYSBsbHZtOjpESUUgb2JqZWN0IGFuZAorLy8vIGFzc2lnbiBhIHVuaXF1ZSBhYmJyZXZpYXRpb24gbnVtYmVyIHRvIGVhY2ggdW5pcXVlIERJRUFiYnJldiBvYmplY3QgaXQKKy8vLyBmaW5kcy4gVGhlIHJlc3VsdGluZyBjb2xsZWN0aW9uIG9mIERJRUFiYnJldiBvYmplY3RzIGNhbiB0aGVuIGJlIGVtaXR0ZWQKKy8vLyBpbnRvIHRoZSAuZGVidWdfYWJicmV2IHNlY3Rpb24uCitjbGFzcyBESUVBYmJyZXZTZXQgeworICAvLy8gVGhlIGJ1bXAgYWxsb2NhdG9yIHRvIHVzZSB3aGVuIGNyZWF0aW5nIERJRUFiYnJldiBvYmplY3RzIGluIHRoZSB1bmlxdWVkCisgIC8vLyBzdG9yYWdlIGNvbnRhaW5lci4KKyAgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2M7CisgIC8vLyBcYnJpZWYgRm9sZGluZ1NldCB0aGF0IHVuaXF1ZXMgdGhlIGFiYnJldmlhdGlvbnMuCisgIEZvbGRpbmdTZXQ8RElFQWJicmV2PiBBYmJyZXZpYXRpb25zU2V0OworICAvLy8gQSBsaXN0IG9mIGFsbCB0aGUgdW5pcXVlIGFiYnJldmlhdGlvbnMgaW4gdXNlLgorICBzdGQ6OnZlY3RvcjxESUVBYmJyZXYgKj4gQWJicmV2aWF0aW9uczsKKworcHVibGljOgorICBESUVBYmJyZXZTZXQoQnVtcFB0ckFsbG9jYXRvciAmQSkgOiBBbGxvYyhBKSB7fQorICB+RElFQWJicmV2U2V0KCk7CisKKyAgLy8vIEdlbmVyYXRlIHRoZSBhYmJyZXZpYXRpb24gZGVjbGFyYXRpb24gZm9yIGEgRElFIGFuZCByZXR1cm4gYSBwb2ludGVyIHRvCisgIC8vLyB0aGUgZ2VuZXJhdGVkIGFiYnJldmlhdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gRGllIHRoZSBkZWJ1ZyBpbmZvIGVudHJ5IHRvIGdlbmVyYXRlIHRoZSBhYmJyZXZpYXRpb24gZm9yLgorICAvLy8gXHJldHVybnMgQSByZWZlcmVuY2UgdG8gdGhlIHVuaXF1ZWQgYWJicmV2aWF0aW9uIGRlY2xhcmF0aW9uIHRoYXQgaXMKKyAgLy8vIG93bmVkIGJ5IHRoaXMgY2xhc3MuCisgIERJRUFiYnJldiAmdW5pcXVlQWJicmV2aWF0aW9uKERJRSAmRGllKTsKKworICAvLy8gUHJpbnQgYWxsIGFiYnJldmlhdGlvbnMgdXNpbmcgdGhlIHNwZWNpZmllZCBhc20gcHJpbnRlci4KKyAgdm9pZCBFbWl0KGNvbnN0IEFzbVByaW50ZXIgKkFQLCBNQ1NlY3Rpb24gKlNlY3Rpb24pIGNvbnN0OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQW4gaW50ZWdlciB2YWx1ZSBESUUuCisvLy8KK2NsYXNzIERJRUludGVnZXIgeworICB1aW50NjRfdCBJbnRlZ2VyOworCitwdWJsaWM6CisgIGV4cGxpY2l0IERJRUludGVnZXIodWludDY0X3QgSSkgOiBJbnRlZ2VyKEkpIHt9CisKKyAgLy8vIENob29zZSB0aGUgYmVzdCBmb3JtIGZvciBpbnRlZ2VyLgorICBzdGF0aWMgZHdhcmY6OkZvcm0gQmVzdEZvcm0oYm9vbCBJc1NpZ25lZCwgdWludDY0X3QgSW50KSB7CisgICAgaWYgKElzU2lnbmVkKSB7CisgICAgICBjb25zdCBpbnQ2NF90IFNpZ25lZEludCA9IEludDsKKyAgICAgIGlmICgoY2hhcilJbnQgPT0gU2lnbmVkSW50KQorICAgICAgICByZXR1cm4gZHdhcmY6OkRXX0ZPUk1fZGF0YTE7CisgICAgICBpZiAoKHNob3J0KUludCA9PSBTaWduZWRJbnQpCisgICAgICAgIHJldHVybiBkd2FyZjo6RFdfRk9STV9kYXRhMjsKKyAgICAgIGlmICgoaW50KUludCA9PSBTaWduZWRJbnQpCisgICAgICAgIHJldHVybiBkd2FyZjo6RFdfRk9STV9kYXRhNDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCh1bnNpZ25lZCBjaGFyKUludCA9PSBJbnQpCisgICAgICAgIHJldHVybiBkd2FyZjo6RFdfRk9STV9kYXRhMTsKKyAgICAgIGlmICgodW5zaWduZWQgc2hvcnQpSW50ID09IEludCkKKyAgICAgICAgcmV0dXJuIGR3YXJmOjpEV19GT1JNX2RhdGEyOworICAgICAgaWYgKCh1bnNpZ25lZCBpbnQpSW50ID09IEludCkKKyAgICAgICAgcmV0dXJuIGR3YXJmOjpEV19GT1JNX2RhdGE0OworICAgIH0KKyAgICByZXR1cm4gZHdhcmY6OkRXX0ZPUk1fZGF0YTg7CisgIH0KKworICB1aW50NjRfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIEludGVnZXI7IH0KKyAgdm9pZCBzZXRWYWx1ZSh1aW50NjRfdCBWYWwpIHsgSW50ZWdlciA9IFZhbDsgfQorCisgIHZvaWQgRW1pdFZhbHVlKGNvbnN0IEFzbVByaW50ZXIgKkFQLCBkd2FyZjo6Rm9ybSBGb3JtKSBjb25zdDsKKyAgdW5zaWduZWQgU2l6ZU9mKGNvbnN0IEFzbVByaW50ZXIgKkFQLCBkd2FyZjo6Rm9ybSBGb3JtKSBjb25zdDsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPKSBjb25zdDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEFuIGV4cHJlc3Npb24gRElFLgorY2xhc3MgRElFRXhwciB7CisgIGNvbnN0IE1DRXhwciAqRXhwcjsKKworcHVibGljOgorICBleHBsaWNpdCBESUVFeHByKGNvbnN0IE1DRXhwciAqRSkgOiBFeHByKEUpIHt9CisKKyAgLy8vIEdldCBNQ0V4cHIuCisgIGNvbnN0IE1DRXhwciAqZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBFeHByOyB9CisKKyAgdm9pZCBFbWl0VmFsdWUoY29uc3QgQXNtUHJpbnRlciAqQVAsIGR3YXJmOjpGb3JtIEZvcm0pIGNvbnN0OworICB1bnNpZ25lZCBTaXplT2YoY29uc3QgQXNtUHJpbnRlciAqQVAsIGR3YXJmOjpGb3JtIEZvcm0pIGNvbnN0OworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8pIGNvbnN0OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQSBsYWJlbCBESUUuCitjbGFzcyBESUVMYWJlbCB7CisgIGNvbnN0IE1DU3ltYm9sICpMYWJlbDsKKworcHVibGljOgorICBleHBsaWNpdCBESUVMYWJlbChjb25zdCBNQ1N5bWJvbCAqTCkgOiBMYWJlbChMKSB7fQorCisgIC8vLyBHZXQgTUNTeW1ib2wuCisgIGNvbnN0IE1DU3ltYm9sICpnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIExhYmVsOyB9CisKKyAgdm9pZCBFbWl0VmFsdWUoY29uc3QgQXNtUHJpbnRlciAqQVAsIGR3YXJmOjpGb3JtIEZvcm0pIGNvbnN0OworICB1bnNpZ25lZCBTaXplT2YoY29uc3QgQXNtUHJpbnRlciAqQVAsIGR3YXJmOjpGb3JtIEZvcm0pIGNvbnN0OworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8pIGNvbnN0OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQSBzaW1wbGUgbGFiZWwgZGlmZmVyZW5jZSBESUUuCisvLy8KK2NsYXNzIERJRURlbHRhIHsKKyAgY29uc3QgTUNTeW1ib2wgKkxhYmVsSGk7CisgIGNvbnN0IE1DU3ltYm9sICpMYWJlbExvOworCitwdWJsaWM6CisgIERJRURlbHRhKGNvbnN0IE1DU3ltYm9sICpIaSwgY29uc3QgTUNTeW1ib2wgKkxvKSA6IExhYmVsSGkoSGkpLCBMYWJlbExvKExvKSB7fQorCisgIHZvaWQgRW1pdFZhbHVlKGNvbnN0IEFzbVByaW50ZXIgKkFQLCBkd2FyZjo6Rm9ybSBGb3JtKSBjb25zdDsKKyAgdW5zaWduZWQgU2l6ZU9mKGNvbnN0IEFzbVByaW50ZXIgKkFQLCBkd2FyZjo6Rm9ybSBGb3JtKSBjb25zdDsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPKSBjb25zdDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEEgY29udGFpbmVyIGZvciBzdHJpbmcgcG9vbCBzdHJpbmcgdmFsdWVzLgorLy8vCisvLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHdpdGggdGhlIERXX0ZPUk1fc3RycCBhbmQgRFdfRk9STV9HTlVfc3RyX2luZGV4IGZvcm1zLgorY2xhc3MgRElFU3RyaW5nIHsKKyAgRHdhcmZTdHJpbmdQb29sRW50cnlSZWYgUzsKKworcHVibGljOgorICBESUVTdHJpbmcoRHdhcmZTdHJpbmdQb29sRW50cnlSZWYgUykgOiBTKFMpIHt9CisKKyAgLy8vIEdyYWIgdGhlIHN0cmluZyBvdXQgb2YgdGhlIG9iamVjdC4KKyAgU3RyaW5nUmVmIGdldFN0cmluZygpIGNvbnN0IHsgcmV0dXJuIFMuZ2V0U3RyaW5nKCk7IH0KKworICB2b2lkIEVtaXRWYWx1ZShjb25zdCBBc21QcmludGVyICpBUCwgZHdhcmY6OkZvcm0gRm9ybSkgY29uc3Q7CisgIHVuc2lnbmVkIFNpemVPZihjb25zdCBBc21QcmludGVyICpBUCwgZHdhcmY6OkZvcm0gRm9ybSkgY29uc3Q7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTykgY29uc3Q7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBBIGNvbnRhaW5lciBmb3IgaW5saW5lIHN0cmluZyB2YWx1ZXMuCisvLy8KKy8vLyBUaGlzIGNsYXNzIGlzIHVzZWQgd2l0aCB0aGUgRFdfRk9STV9zdHJpbmcgZm9ybS4KK2NsYXNzIERJRUlubGluZVN0cmluZyB7CisgIFN0cmluZ1JlZiBTOworCitwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBbGxvY2F0b3I+CisgIGV4cGxpY2l0IERJRUlubGluZVN0cmluZyhTdHJpbmdSZWYgU3RyLCBBbGxvY2F0b3IgJkEpIDogUyhTdHIuY29weShBKSkge30KKworICB+RElFSW5saW5lU3RyaW5nKCkgPSBkZWZhdWx0OworCisgIC8vLyBHcmFiIHRoZSBzdHJpbmcgb3V0IG9mIHRoZSBvYmplY3QuCisgIFN0cmluZ1JlZiBnZXRTdHJpbmcoKSBjb25zdCB7IHJldHVybiBTOyB9CisKKyAgdm9pZCBFbWl0VmFsdWUoY29uc3QgQXNtUHJpbnRlciAqQVAsIGR3YXJmOjpGb3JtIEZvcm0pIGNvbnN0OworICB1bnNpZ25lZCBTaXplT2YoY29uc3QgQXNtUHJpbnRlciAqQVAsIGR3YXJmOjpGb3JtIEZvcm0pIGNvbnN0OworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8pIGNvbnN0OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQSBwb2ludGVyIHRvIGFub3RoZXIgZGVidWcgaW5mb3JtYXRpb24gZW50cnkuICBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGNhbgorLy8vIGFsc28gYmUgdXNlZCBhcyBhIHByb3h5IGZvciBhIGRlYnVnIGluZm9ybWF0aW9uIGVudHJ5IG5vdCB5ZXQgZGVmaW5lZAorLy8vIChpZS4gdHlwZXMuKQorY2xhc3MgRElFRW50cnkgeworICBESUUgKkVudHJ5OworCitwdWJsaWM6CisgIERJRUVudHJ5KCkgPSBkZWxldGU7CisgIGV4cGxpY2l0IERJRUVudHJ5KERJRSAmRSkgOiBFbnRyeSgmRSkge30KKworICBESUUgJmdldEVudHJ5KCkgY29uc3QgeyByZXR1cm4gKkVudHJ5OyB9CisKKyAgdm9pZCBFbWl0VmFsdWUoY29uc3QgQXNtUHJpbnRlciAqQVAsIGR3YXJmOjpGb3JtIEZvcm0pIGNvbnN0OworICB1bnNpZ25lZCBTaXplT2YoY29uc3QgQXNtUHJpbnRlciAqQVAsIGR3YXJmOjpGb3JtIEZvcm0pIGNvbnN0OworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8pIGNvbnN0OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gUmVwcmVzZW50cyBhIHBvaW50ZXIgdG8gYSBsb2NhdGlvbiBsaXN0IGluIHRoZSBkZWJ1Z19sb2MKKy8vLyBzZWN0aW9uLgorY2xhc3MgRElFTG9jTGlzdCB7CisgIC8vLyBJbmRleCBpbnRvIHRoZSAuZGVidWdfbG9jIHZlY3Rvci4KKyAgc2l6ZV90IEluZGV4OworCitwdWJsaWM6CisgIERJRUxvY0xpc3Qoc2l6ZV90IEkpIDogSW5kZXgoSSkge30KKworICAvLy8gR3JhYiB0aGUgY3VycmVudCBpbmRleCBvdXQuCisgIHNpemVfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIEluZGV4OyB9CisKKyAgdm9pZCBFbWl0VmFsdWUoY29uc3QgQXNtUHJpbnRlciAqQVAsIGR3YXJmOjpGb3JtIEZvcm0pIGNvbnN0OworICB1bnNpZ25lZCBTaXplT2YoY29uc3QgQXNtUHJpbnRlciAqQVAsIGR3YXJmOjpGb3JtIEZvcm0pIGNvbnN0OworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8pIGNvbnN0OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQSBkZWJ1ZyBpbmZvcm1hdGlvbiBlbnRyeSB2YWx1ZS4gU29tZSBvZiB0aGVzZSByb3VnaGx5IGNvcnJlbGF0ZQorLy8vIHRvIERXQVJGIGF0dHJpYnV0ZSBjbGFzc2VzLgorY2xhc3MgRElFQmxvY2s7CitjbGFzcyBESUVMb2M7CitjbGFzcyBESUVWYWx1ZSB7CitwdWJsaWM6CisgIGVudW0gVHlwZSB7CisgICAgaXNOb25lLAorI2RlZmluZSBIQU5ETEVfRElFVkFMVUUoVCkgaXMjI1QsCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0RJRVZhbHVlLmRlZiIKKyAgfTsKKworcHJpdmF0ZToKKyAgLy8vIFR5cGUgb2YgZGF0YSBzdG9yZWQgaW4gdGhlIHZhbHVlLgorICBUeXBlIFR5ID0gaXNOb25lOworICBkd2FyZjo6QXR0cmlidXRlIEF0dHJpYnV0ZSA9IChkd2FyZjo6QXR0cmlidXRlKTA7CisgIGR3YXJmOjpGb3JtIEZvcm0gPSAoZHdhcmY6OkZvcm0pMDsKKworICAvLy8gU3RvcmFnZSBmb3IgdGhlIHZhbHVlLgorICAvLy8KKyAgLy8vIEFsbCB2YWx1ZXMgdGhhdCBhcmVuJ3Qgc3RhbmRhcmQgbGF5b3V0IChvciBhcmUgbGFyZ2VyIHRoYW4gOCBieXRlcykKKyAgLy8vIHNob3VsZCBiZSBzdG9yZWQgYnkgcmVmZXJlbmNlIGluc3RlYWQgb2YgYnkgdmFsdWUuCisgIHVzaW5nIFZhbFR5ID0gQWxpZ25lZENoYXJBcnJheVVuaW9uPERJRUludGVnZXIsIERJRVN0cmluZywgRElFRXhwciwgRElFTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRURlbHRhICosIERJRUVudHJ5LCBESUVCbG9jayAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUVMb2MgKiwgRElFTG9jTGlzdD47CisKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoVmFsVHkpIDw9IHNpemVvZih1aW50NjRfdCkgfHwKKyAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFZhbFR5KSA8PSBzaXplb2Yodm9pZCAqKSwKKyAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgYWxsIGxhcmdlIHR5cGVzIHRvIGJlIHN0b3JlZCB2aWEgcG9pbnRlciIpOworCisgIC8vLyBVbmRlcmx5aW5nIHN0b3JlZCB2YWx1ZS4KKyAgVmFsVHkgVmFsOworCisgIHRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIGNvbnN0cnVjdChUIFYpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfc3RhbmRhcmRfbGF5b3V0PFQ+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfcG9pbnRlcjxUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgc3RhbmRhcmQgbGF5b3V0IG9yIHBvaW50ZXIiKTsKKyAgICBuZXcgKHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihWYWwuYnVmZmVyKSkgVChWKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBUPiBUICpnZXQoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PFQgKj4oVmFsLmJ1ZmZlcik7IH0KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IGNvbnN0IFQgKmdldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUICo+KFZhbC5idWZmZXIpOworICB9CisgIHRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIGRlc3RydWN0KCkgeyBnZXQ8VD4oKS0+flQoKTsgfQorCisgIC8vLyBEZXN0cm95IHRoZSB1bmRlcmx5aW5nIHZhbHVlLgorICAvLy8KKyAgLy8vIFRoaXMgc2hvdWxkIGdldCBvcHRpbWl6ZWQgZG93biB0byBhIG5vLW9wLiAgV2UgY291bGQgc2tpcCBpdCBpZiB3ZSBjb3VsZAorICAvLy8gYWRkIGEgc3RhdGljIGFzc2VydCBvbiBcYSBzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZSgpLCBidXQgd2UgY3VycmVudGx5CisgIC8vLyBzdXBwb3J0IHZlcnNpb25zIG9mIEdDQyB0aGF0IGRvbid0IHVuZGVyc3RhbmQgdGhhdC4KKyAgdm9pZCBkZXN0cm95VmFsKCkgeworICAgIHN3aXRjaCAoVHkpIHsKKyAgICBjYXNlIGlzTm9uZToKKyAgICAgIHJldHVybjsKKyNkZWZpbmUgSEFORExFX0RJRVZBTFVFX1NNQUxMKFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNhc2UgaXMjI1Q6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRlc3RydWN0PERJRSMjVD4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm47CisjZGVmaW5lIEhBTkRMRV9ESUVWQUxVRV9MQVJHRShUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIGlzIyNUOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBkZXN0cnVjdDxjb25zdCBESUUjI1QgKj4oKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuOworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9ESUVWYWx1ZS5kZWYiCisgICAgfQorICB9CisKKyAgLy8vIENvcHkgdGhlIHVuZGVybHlpbmcgdmFsdWUuCisgIC8vLworICAvLy8gVGhpcyBzaG91bGQgZ2V0IG9wdGltaXplZCBkb3duIHRvIGEgc2ltcGxlIGNvcHkuICBXZSBuZWVkIHRvIGFjdHVhbGx5CisgIC8vLyBjb25zdHJ1Y3QgdGhlIHZhbHVlLCByYXRoZXIgdGhhbiBjYWxsaW5nIG1lbWNweSwgdG8gc2F0aXNmeSBzdHJpY3QKKyAgLy8vIGFsaWFzaW5nIHJ1bGVzLgorICB2b2lkIGNvcHlWYWwoY29uc3QgRElFVmFsdWUgJlgpIHsKKyAgICBzd2l0Y2ggKFR5KSB7CisgICAgY2FzZSBpc05vbmU6CisgICAgICByZXR1cm47CisjZGVmaW5lIEhBTkRMRV9ESUVWQUxVRV9TTUFMTChUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIGlzIyNUOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdHJ1Y3Q8RElFIyNUPigqWC5nZXQ8RElFIyNUPigpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuOworI2RlZmluZSBIQU5ETEVfRElFVkFMVUVfTEFSR0UoVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY2FzZSBpcyMjVDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY29uc3RydWN0PGNvbnN0IERJRSMjVCAqPigqWC5nZXQ8Y29uc3QgRElFIyNUICo+KCkpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybjsKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vRElFVmFsdWUuZGVmIgorICAgIH0KKyAgfQorCitwdWJsaWM6CisgIERJRVZhbHVlKCkgPSBkZWZhdWx0OworCisgIERJRVZhbHVlKGNvbnN0IERJRVZhbHVlICZYKSA6IFR5KFguVHkpLCBBdHRyaWJ1dGUoWC5BdHRyaWJ1dGUpLCBGb3JtKFguRm9ybSkgeworICAgIGNvcHlWYWwoWCk7CisgIH0KKworICBESUVWYWx1ZSAmb3BlcmF0b3I9KGNvbnN0IERJRVZhbHVlICZYKSB7CisgICAgZGVzdHJveVZhbCgpOworICAgIFR5ID0gWC5UeTsKKyAgICBBdHRyaWJ1dGUgPSBYLkF0dHJpYnV0ZTsKKyAgICBGb3JtID0gWC5Gb3JtOworICAgIGNvcHlWYWwoWCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgfkRJRVZhbHVlKCkgeyBkZXN0cm95VmFsKCk7IH0KKworI2RlZmluZSBIQU5ETEVfRElFVkFMVUVfU01BTEwoVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRElFVmFsdWUoZHdhcmY6OkF0dHJpYnV0ZSBBdHRyaWJ1dGUsIGR3YXJmOjpGb3JtIEZvcm0sIGNvbnN0IERJRSMjVCAmVikgICAgICBcCisgICAgICA6IFR5KGlzIyNUKSwgQXR0cmlidXRlKEF0dHJpYnV0ZSksIEZvcm0oRm9ybSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNvbnN0cnVjdDxESUUjI1Q+KFYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2RlZmluZSBIQU5ETEVfRElFVkFMVUVfTEFSR0UoVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRElFVmFsdWUoZHdhcmY6OkF0dHJpYnV0ZSBBdHRyaWJ1dGUsIGR3YXJmOjpGb3JtIEZvcm0sIGNvbnN0IERJRSMjVCAqVikgICAgICBcCisgICAgICA6IFR5KGlzIyNUKSwgQXR0cmlidXRlKEF0dHJpYnV0ZSksIEZvcm0oRm9ybSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzc2VydChWICYmICJFeHBlY3RlZCB2YWxpZCB2YWx1ZSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zdHJ1Y3Q8Y29uc3QgRElFIyNUICo+KFYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vRElFVmFsdWUuZGVmIgorCisgIC8vLyBBY2Nlc3NvcnMuCisgIC8vLyBAeworICBUeXBlIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBUeTsgfQorICBkd2FyZjo6QXR0cmlidXRlIGdldEF0dHJpYnV0ZSgpIGNvbnN0IHsgcmV0dXJuIEF0dHJpYnV0ZTsgfQorICBkd2FyZjo6Rm9ybSBnZXRGb3JtKCkgY29uc3QgeyByZXR1cm4gRm9ybTsgfQorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gVHk7IH0KKyAgLy8vIEB9CisKKyNkZWZpbmUgSEFORExFX0RJRVZBTFVFX1NNQUxMKFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IERJRSMjVCAmZ2V0RElFIyNUKCkgY29uc3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzc2VydChnZXRUeXBlKCkgPT0gaXMjI1QgJiYgIkV4cGVjdGVkICIgI1QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKmdldDxESUUjI1Q+KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgSEFORExFX0RJRVZBTFVFX0xBUkdFKFQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNvbnN0IERJRSMjVCAmZ2V0RElFIyNUKCkgY29uc3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzc2VydChnZXRUeXBlKCkgPT0gaXMjI1QgJiYgIkV4cGVjdGVkICIgI1QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKipnZXQ8Y29uc3QgRElFIyNUICo+KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vRElFVmFsdWUuZGVmIgorCisgIC8vLyBFbWl0IHZhbHVlIHZpYSB0aGUgRHdhcmYgd3JpdGVyLgorICB2b2lkIEVtaXRWYWx1ZShjb25zdCBBc21QcmludGVyICpBUCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgc2l6ZSBvZiBhIHZhbHVlIGluIGJ5dGVzLgorICB1bnNpZ25lZCBTaXplT2YoY29uc3QgQXNtUHJpbnRlciAqQVApIGNvbnN0OworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8pIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKK3N0cnVjdCBJbnRydXNpdmVCYWNrTGlzdE5vZGUgeworICBQb2ludGVySW50UGFpcjxJbnRydXNpdmVCYWNrTGlzdE5vZGUgKiwgMT4gTmV4dDsKKworICBJbnRydXNpdmVCYWNrTGlzdE5vZGUoKSA6IE5leHQodGhpcywgdHJ1ZSkge30KKworICBJbnRydXNpdmVCYWNrTGlzdE5vZGUgKmdldE5leHQoKSBjb25zdCB7CisgICAgcmV0dXJuIE5leHQuZ2V0SW50KCkgPyBudWxscHRyIDogTmV4dC5nZXRQb2ludGVyKCk7CisgIH0KK307CisKK3N0cnVjdCBJbnRydXNpdmVCYWNrTGlzdEJhc2UgeworICB1c2luZyBOb2RlID0gSW50cnVzaXZlQmFja0xpc3ROb2RlOworCisgIE5vZGUgKkxhc3QgPSBudWxscHRyOworCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiAhTGFzdDsgfQorCisgIHZvaWQgcHVzaF9iYWNrKE5vZGUgJk4pIHsKKyAgICBhc3NlcnQoTi5OZXh0LmdldFBvaW50ZXIoKSA9PSAmTiAmJiAiRXhwZWN0ZWQgdW5saW5rZWQgbm9kZSIpOworICAgIGFzc2VydChOLk5leHQuZ2V0SW50KCkgPT0gdHJ1ZSAmJiAiRXhwZWN0ZWQgdW5saW5rZWQgbm9kZSIpOworCisgICAgaWYgKExhc3QpIHsKKyAgICAgIE4uTmV4dCA9IExhc3QtPk5leHQ7CisgICAgICBMYXN0LT5OZXh0LnNldFBvaW50ZXJBbmRJbnQoJk4sIGZhbHNlKTsKKyAgICB9CisgICAgTGFzdCA9ICZOOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgSW50cnVzaXZlQmFja0xpc3QgOiBJbnRydXNpdmVCYWNrTGlzdEJhc2UgeworcHVibGljOgorICB1c2luZyBJbnRydXNpdmVCYWNrTGlzdEJhc2U6OmVtcHR5OworCisgIHZvaWQgcHVzaF9iYWNrKFQgJk4pIHsgSW50cnVzaXZlQmFja0xpc3RCYXNlOjpwdXNoX2JhY2soTik7IH0KKyAgVCAmYmFjaygpIHsgcmV0dXJuICpzdGF0aWNfY2FzdDxUICo+KExhc3QpOyB9CisgIGNvbnN0IFQgJmJhY2soKSBjb25zdCB7IHJldHVybiAqc3RhdGljX2Nhc3Q8VCAqPihMYXN0KTsgfQorCisgIGNsYXNzIGNvbnN0X2l0ZXJhdG9yOworICBjbGFzcyBpdGVyYXRvcgorICAgICAgOiBwdWJsaWMgaXRlcmF0b3JfZmFjYWRlX2Jhc2U8aXRlcmF0b3IsIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIFQ+IHsKKyAgICBmcmllbmQgY2xhc3MgY29uc3RfaXRlcmF0b3I7CisKKyAgICBOb2RlICpOID0gbnVsbHB0cjsKKworICBwdWJsaWM6CisgICAgaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgICAgZXhwbGljaXQgaXRlcmF0b3IoVCAqTikgOiBOKE4pIHt9CisKKyAgICBpdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICAgIE4gPSBOLT5nZXROZXh0KCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIE47IH0KKyAgICBUICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqc3RhdGljX2Nhc3Q8VCAqPihOKTsgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yICZYKSBjb25zdCB7IHJldHVybiBOID09IFguTjsgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciAmWCkgY29uc3QgeyByZXR1cm4gTiAhPSBYLk47IH0KKyAgfTsKKworICBjbGFzcyBjb25zdF9pdGVyYXRvcgorICAgICAgOiBwdWJsaWMgaXRlcmF0b3JfZmFjYWRlX2Jhc2U8Y29uc3RfaXRlcmF0b3IsIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUPiB7CisgICAgY29uc3QgTm9kZSAqTiA9IG51bGxwdHI7CisKKyAgcHVibGljOgorICAgIGNvbnN0X2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworICAgIC8vIFBsYWNhdGUgTVNWQyBieSBleHBsaWNpdGx5IHNjb3BpbmcgJ2l0ZXJhdG9yJy4KKyAgICBjb25zdF9pdGVyYXRvcih0eXBlbmFtZSBJbnRydXNpdmVCYWNrTGlzdDxUPjo6aXRlcmF0b3IgWCkgOiBOKFguTikge30KKyAgICBleHBsaWNpdCBjb25zdF9pdGVyYXRvcihjb25zdCBUICpOKSA6IE4oTikge30KKworICAgIGNvbnN0X2l0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgICAgTiA9IE4tPmdldE5leHQoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gTjsgfQorICAgIGNvbnN0IFQgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBUICo+KE4pOyB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgY29uc3RfaXRlcmF0b3IgJlgpIGNvbnN0IHsgcmV0dXJuIE4gPT0gWC5OOyB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNvbnN0X2l0ZXJhdG9yICZYKSBjb25zdCB7IHJldHVybiBOICE9IFguTjsgfQorICB9OworCisgIGl0ZXJhdG9yIGJlZ2luKCkgeworICAgIHJldHVybiBMYXN0ID8gaXRlcmF0b3Ioc3RhdGljX2Nhc3Q8VCAqPihMYXN0LT5OZXh0LmdldFBvaW50ZXIoKSkpIDogZW5kKCk7CisgIH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8SW50cnVzaXZlQmFja0xpc3QgKj4odGhpcyktPmJlZ2luKCk7CisgIH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gaXRlcmF0b3IoKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF9pdGVyYXRvcigpOyB9CisKKyAgc3RhdGljIGl0ZXJhdG9yIHRvSXRlcmF0b3IoVCAmTikgeyByZXR1cm4gaXRlcmF0b3IoJk4pOyB9CisgIHN0YXRpYyBjb25zdF9pdGVyYXRvciB0b0l0ZXJhdG9yKGNvbnN0IFQgJk4pIHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKCZOKTsgfQorfTsKKworLy8vIEEgbGlzdCBvZiBESUUgdmFsdWVzLgorLy8vCisvLy8gVGhpcyBpcyBhIHNpbmdseS1saW5rZWQgbGlzdCwgYnV0IGluc3RlYWQgb2YgcmV2ZXJzaW5nIHRoZSBvcmRlciBvZgorLy8vIGluc2VydGlvbiwgd2Uga2VlcCBhIHBvaW50ZXIgdG8gdGhlIGJhY2sgb2YgdGhlIGxpc3Qgc28gd2UgY2FuIHB1c2ggaW4KKy8vLyBvcmRlci4KKy8vLworLy8vIFRoZXJlIGFyZSB0d28gbWFpbiByZWFzb25zIHRvIGNob29zZSBhIGxpbmtlZCBsaXN0IG92ZXIgYSBjdXN0b21pemVkCisvLy8gdmVjdG9yLWxpa2UgZGF0YSBzdHJ1Y3R1cmUuCisvLy8KKy8vLyAgMS4gRm9yIHRlYXJkb3duIGVmZmljaWVuY3ksIHdlIHdhbnQgRElFcyB0byBiZSBCdW1wUHRyQWxsb2NhdGVkLiAgVXNpbmcgYQorLy8vICAgICBsaW5rZWQgbGlzdCBoZXJlIG1ha2VzIHRoaXMgd2F5IGVhc2llciB0byBhY2NvbXBsaXNoLgorLy8vICAyLiBDYXJyeWluZyBhbiBleHRyYSBwb2ludGVyIHBlciBcYSBESUVWYWx1ZSBpc24ndCBleHBlbnNpdmUuICA0NSUgb2YgRElFcworLy8vICAgICBoYXZlIDIgb3IgZmV3ZXIgdmFsdWVzLCBhbmQgOTAlIGhhdmUgNSBvciBmZXdlci4gIEEgdmVjdG9yIHdvdWxkIGJlCisvLy8gICAgIG92ZXItYWxsb2NhdGVkIGJ5IDUwJSBvbiBhdmVyYWdlIGFueXdheSwgdGhlIHNhbWUgY29zdCBhcyB0aGUKKy8vLyAgICAgbGlua2VkLWxpc3Qgbm9kZS4KK2NsYXNzIERJRVZhbHVlTGlzdCB7CisgIHN0cnVjdCBOb2RlIDogSW50cnVzaXZlQmFja0xpc3ROb2RlIHsKKyAgICBESUVWYWx1ZSBWOworCisgICAgZXhwbGljaXQgTm9kZShESUVWYWx1ZSBWKSA6IFYoVikge30KKyAgfTsKKworICB1c2luZyBMaXN0VHkgPSBJbnRydXNpdmVCYWNrTGlzdDxOb2RlPjsKKworICBMaXN0VHkgTGlzdDsKKworcHVibGljOgorICBjbGFzcyBjb25zdF92YWx1ZV9pdGVyYXRvcjsKKyAgY2xhc3MgdmFsdWVfaXRlcmF0b3IKKyAgICAgIDogcHVibGljIGl0ZXJhdG9yX2FkYXB0b3JfYmFzZTx2YWx1ZV9pdGVyYXRvciwgTGlzdFR5OjppdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBESUVWYWx1ZT4geworICAgIGZyaWVuZCBjbGFzcyBjb25zdF92YWx1ZV9pdGVyYXRvcjsKKworICAgIHVzaW5nIGl0ZXJhdG9yX2FkYXB0b3IgPQorICAgICAgICBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U8dmFsdWVfaXRlcmF0b3IsIExpc3RUeTo6aXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBESUVWYWx1ZT47CisKKyAgcHVibGljOgorICAgIHZhbHVlX2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworICAgIGV4cGxpY2l0IHZhbHVlX2l0ZXJhdG9yKExpc3RUeTo6aXRlcmF0b3IgWCkgOiBpdGVyYXRvcl9hZGFwdG9yKFgpIHt9CisKKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gYm9vbCh3cmFwcGVkKCkpOyB9CisgICAgRElFVmFsdWUgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIHdyYXBwZWQoKS0+VjsgfQorICB9OworCisgIGNsYXNzIGNvbnN0X3ZhbHVlX2l0ZXJhdG9yIDogcHVibGljIGl0ZXJhdG9yX2FkYXB0b3JfYmFzZTwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfdmFsdWVfaXRlcmF0b3IsIExpc3RUeTo6Y29uc3RfaXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIGNvbnN0IERJRVZhbHVlPiB7CisgICAgdXNpbmcgaXRlcmF0b3JfYWRhcHRvciA9CisgICAgICAgIGl0ZXJhdG9yX2FkYXB0b3JfYmFzZTxjb25zdF92YWx1ZV9pdGVyYXRvciwgTGlzdFR5Ojpjb25zdF9pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIGNvbnN0IERJRVZhbHVlPjsKKworICBwdWJsaWM6CisgICAgY29uc3RfdmFsdWVfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgICAgY29uc3RfdmFsdWVfaXRlcmF0b3IoRElFVmFsdWVMaXN0Ojp2YWx1ZV9pdGVyYXRvciBYKQorICAgICAgICA6IGl0ZXJhdG9yX2FkYXB0b3IoWC53cmFwcGVkKCkpIHt9CisgICAgZXhwbGljaXQgY29uc3RfdmFsdWVfaXRlcmF0b3IoTGlzdFR5Ojpjb25zdF9pdGVyYXRvciBYKQorICAgICAgICA6IGl0ZXJhdG9yX2FkYXB0b3IoWCkge30KKworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBib29sKHdyYXBwZWQoKSk7IH0KKyAgICBjb25zdCBESUVWYWx1ZSAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gd3JhcHBlZCgpLT5WOyB9CisgIH07CisKKyAgdXNpbmcgdmFsdWVfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTx2YWx1ZV9pdGVyYXRvcj47CisgIHVzaW5nIGNvbnN0X3ZhbHVlX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8Y29uc3RfdmFsdWVfaXRlcmF0b3I+OworCisgIHZhbHVlX2l0ZXJhdG9yIGFkZFZhbHVlKEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jLCBjb25zdCBESUVWYWx1ZSAmVikgeworICAgIExpc3QucHVzaF9iYWNrKCpuZXcgKEFsbG9jKSBOb2RlKFYpKTsKKyAgICByZXR1cm4gdmFsdWVfaXRlcmF0b3IoTGlzdFR5Ojp0b0l0ZXJhdG9yKExpc3QuYmFjaygpKSk7CisgIH0KKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIHZhbHVlX2l0ZXJhdG9yIGFkZFZhbHVlKEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jLCBkd2FyZjo6QXR0cmlidXRlIEF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgZHdhcmY6OkZvcm0gRm9ybSwgVCAmJlZhbHVlKSB7CisgICAgcmV0dXJuIGFkZFZhbHVlKEFsbG9jLCBESUVWYWx1ZShBdHRyaWJ1dGUsIEZvcm0sIHN0ZDo6Zm9yd2FyZDxUPihWYWx1ZSkpKTsKKyAgfQorCisgIHZhbHVlX3JhbmdlIHZhbHVlcygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZSh2YWx1ZV9pdGVyYXRvcihMaXN0LmJlZ2luKCkpLCB2YWx1ZV9pdGVyYXRvcihMaXN0LmVuZCgpKSk7CisgIH0KKyAgY29uc3RfdmFsdWVfcmFuZ2UgdmFsdWVzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGNvbnN0X3ZhbHVlX2l0ZXJhdG9yKExpc3QuYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3RfdmFsdWVfaXRlcmF0b3IoTGlzdC5lbmQoKSkpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBBIHN0cnVjdHVyZWQgZGVidWcgaW5mb3JtYXRpb24gZW50cnkuICBIYXMgYW4gYWJicmV2aWF0aW9uIHdoaWNoCisvLy8gZGVzY3JpYmVzIGl0cyBvcmdhbml6YXRpb24uCitjbGFzcyBESUUgOiBJbnRydXNpdmVCYWNrTGlzdE5vZGUsIHB1YmxpYyBESUVWYWx1ZUxpc3QgeworICBmcmllbmQgY2xhc3MgSW50cnVzaXZlQmFja0xpc3Q8RElFPjsKKyAgZnJpZW5kIGNsYXNzIERJRVVuaXQ7CisKKyAgLy8vIER3YXJmIHVuaXQgcmVsYXRpdmUgb2Zmc2V0LgorICB1bnNpZ25lZCBPZmZzZXQgPSAwOworICAvLy8gU2l6ZSBvZiBpbnN0YW5jZSArIGNoaWxkcmVuLgorICB1bnNpZ25lZCBTaXplID0gMDsKKyAgdW5zaWduZWQgQWJicmV2TnVtYmVyID0gfjB1OworICAvLy8gRHdhcmYgdGFnIGNvZGUuCisgIGR3YXJmOjpUYWcgVGFnID0gKGR3YXJmOjpUYWcpMDsKKyAgLy8vIFNldCB0byB0cnVlIHRvIGZvcmNlIGEgRElFIHRvIGVtaXQgYW4gYWJicmV2aWF0aW9uIHRoYXQgc2F5cyBpdCBoYXMKKyAgLy8vIGNoaWxkcmVuIGV2ZW4gd2hlbiBpdCBkb2Vzbid0LiBUaGlzIGlzIHVzZWQgZm9yIHVuaXQgdGVzdGluZyBwdXJwb3Nlcy4KKyAgYm9vbCBGb3JjZUNoaWxkcmVuID0gZmFsc2U7CisgIC8vLyBDaGlsZHJlbiBESUVzLgorICBJbnRydXNpdmVCYWNrTGlzdDxESUU+IENoaWxkcmVuOworCisgIC8vLyBUaGUgb3duZXIgaXMgZWl0aGVyIHRoZSBwYXJlbnQgRElFIGZvciBjaGlsZHJlbiBvZiBvdGhlciBESUVzLCBvciBhCisgIC8vLyBESUVVbml0IHdoaWNoIGNvbnRhaW5zIHRoaXMgRElFIGFzIGl0cyB1bml0IERJRS4KKyAgUG9pbnRlclVuaW9uPERJRSAqLCBESUVVbml0ICo+IE93bmVyOworCisgIGV4cGxpY2l0IERJRShkd2FyZjo6VGFnIFRhZykgOiBUYWcoVGFnKSB7fQorCitwdWJsaWM6CisgIERJRSgpID0gZGVsZXRlOworICBESUUoY29uc3QgRElFICZSSFMpID0gZGVsZXRlOworICBESUUoRElFICYmUkhTKSA9IGRlbGV0ZTsKKyAgRElFICZvcGVyYXRvcj0oY29uc3QgRElFICZSSFMpID0gZGVsZXRlOworICBESUUgJm9wZXJhdG9yPShjb25zdCBESUUgJiZSSFMpID0gZGVsZXRlOworCisgIHN0YXRpYyBESUUgKmdldChCdW1wUHRyQWxsb2NhdG9yICZBbGxvYywgZHdhcmY6OlRhZyBUYWcpIHsKKyAgICByZXR1cm4gbmV3IChBbGxvYykgRElFKFRhZyk7CisgIH0KKworICAvLyBBY2Nlc3NvcnMuCisgIHVuc2lnbmVkIGdldEFiYnJldk51bWJlcigpIGNvbnN0IHsgcmV0dXJuIEFiYnJldk51bWJlcjsgfQorICBkd2FyZjo6VGFnIGdldFRhZygpIGNvbnN0IHsgcmV0dXJuIFRhZzsgfQorICAvLy8gR2V0IHRoZSBjb21waWxlL3R5cGUgdW5pdCByZWxhdGl2ZSBvZmZzZXQgb2YgdGhpcyBESUUuCisgIHVuc2lnbmVkIGdldE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIE9mZnNldDsgfQorICB1bnNpZ25lZCBnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gU2l6ZTsgfQorICBib29sIGhhc0NoaWxkcmVuKCkgY29uc3QgeyByZXR1cm4gRm9yY2VDaGlsZHJlbiB8fCAhQ2hpbGRyZW4uZW1wdHkoKTsgfQorICB2b2lkIHNldEZvcmNlQ2hpbGRyZW4oYm9vbCBCKSB7IEZvcmNlQ2hpbGRyZW4gPSBCOyB9CisKKyAgdXNpbmcgY2hpbGRfaXRlcmF0b3IgPSBJbnRydXNpdmVCYWNrTGlzdDxESUU+OjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfY2hpbGRfaXRlcmF0b3IgPSBJbnRydXNpdmVCYWNrTGlzdDxESUU+Ojpjb25zdF9pdGVyYXRvcjsKKyAgdXNpbmcgY2hpbGRfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxjaGlsZF9pdGVyYXRvcj47CisgIHVzaW5nIGNvbnN0X2NoaWxkX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8Y29uc3RfY2hpbGRfaXRlcmF0b3I+OworCisgIGNoaWxkX3JhbmdlIGNoaWxkcmVuKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKENoaWxkcmVuLmJlZ2luKCksIENoaWxkcmVuLmVuZCgpKTsKKyAgfQorICBjb25zdF9jaGlsZF9yYW5nZSBjaGlsZHJlbigpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShDaGlsZHJlbi5iZWdpbigpLCBDaGlsZHJlbi5lbmQoKSk7CisgIH0KKworICBESUUgKmdldFBhcmVudCgpIGNvbnN0OworCisgIC8vLyBHZW5lcmF0ZSB0aGUgYWJicmV2aWF0aW9uIGZvciB0aGlzIERJRS4KKyAgLy8vCisgIC8vLyBDYWxjdWxhdGUgdGhlIGFiYnJldmlhdGlvbiBmb3IgdGhpcywgd2hpY2ggc2hvdWxkIGJlIHVuaXF1ZWQgYW5kCisgIC8vLyBldmVudHVhbGx5IHVzZWQgdG8gY2FsbCBcYSBzZXRBYmJyZXZOdW1iZXIoKS4KKyAgRElFQWJicmV2IGdlbmVyYXRlQWJicmV2KCkgY29uc3Q7CisKKyAgLy8vIFNldCB0aGUgYWJicmV2aWF0aW9uIG51bWJlciBmb3IgdGhpcyBESUUuCisgIHZvaWQgc2V0QWJicmV2TnVtYmVyKHVuc2lnbmVkIEkpIHsgQWJicmV2TnVtYmVyID0gSTsgfQorCisgIC8vLyBHZXQgdGhlIGFic29sdXRlIG9mZnNldCB3aXRoaW4gdGhlIC5kZWJ1Z19pbmZvIG9yIC5kZWJ1Z190eXBlcyBzZWN0aW9uCisgIC8vLyBmb3IgdGhpcyBESUUuCisgIHVuc2lnbmVkIGdldERlYnVnU2VjdGlvbk9mZnNldCgpIGNvbnN0OworCisgIC8vLyBDb21wdXRlIHRoZSBvZmZzZXQgb2YgdGhpcyBESUUgYW5kIGFsbCBpdHMgY2hpbGRyZW4uCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBnZXRzIGNhbGxlZCBqdXN0IGJlZm9yZSB3ZSBhcmUgZ29pbmcgdG8gZ2VuZXJhdGUgdGhlIGRlYnVnCisgIC8vLyBpbmZvcm1hdGlvbiBhbmQgZ2l2ZXMgZWFjaCBESUUgYSBjaGFuY2UgdG8gZmlndXJlIG91dCBpdHMgQ1UgcmVsYXRpdmUgRElFCisgIC8vLyBvZmZzZXQsIHVuaXF1ZSBpdHMgYWJicmV2aWF0aW9uIGFuZCBmaWxsIGluIHRoZSBhYmJyZXZpYXRpb24gY29kZSwgYW5kCisgIC8vLyByZXR1cm4gdGhlIHVuaXQgb2Zmc2V0IHRoYXQgcG9pbnRzIHRvIHdoZXJlIHRoZSBuZXh0IERJRSB3aWxsIGJlIGVtaXR0ZWQKKyAgLy8vIHdpdGhpbiB0aGUgZGVidWcgdW5pdCBzZWN0aW9uLiBBZnRlciB0aGlzIGZ1bmN0aW9uIGhhcyBiZWVuIGNhbGxlZCBmb3IgYWxsCisgIC8vLyBESUUgb2JqZWN0cywgdGhlIERXQVJGIGNhbiBiZSBnZW5lcmF0ZWQgc2luY2UgYWxsIERJRXMgd2lsbCBiZSBhYmxlIHRvCisgIC8vLyBwcm9wZXJseSByZWZlciB0byBvdGhlciBESUUgb2JqZWN0cyBzaW5jZSBhbGwgRElFcyBoYXZlIGNhbGN1bGF0ZWQgdGhlaXIKKyAgLy8vIG9mZnNldHMuCisgIC8vLworICAvLy8gXHBhcmFtIEFQIEFzbVByaW50ZXIgdG8gdXNlIHdoZW4gY2FsY3VsYXRpbmcgc2l6ZXMuCisgIC8vLyBccGFyYW0gQWJicmV2U2V0IHRoZSBhYmJyZXZpYXRpb24gdXNlZCB0byB1bmlxdWUgRElFIGFiYnJldmlhdGlvbnMuCisgIC8vLyBccGFyYW0gQ1VPZmZzZXQgdGhlIGNvbXBpbGUvdHlwZSB1bml0IHJlbGF0aXZlIG9mZnNldCBpbiBieXRlcy4KKyAgLy8vIFxyZXR1cm5zIHRoZSBvZmZzZXQgZm9yIHRoZSBESUUgdGhhdCBmb2xsb3dzIHRoaXMgRElFIHdpdGhpbiB0aGUKKyAgLy8vIGN1cnJlbnQgY29tcGlsZS90eXBlIHVuaXQuCisgIHVuc2lnbmVkIGNvbXB1dGVPZmZzZXRzQW5kQWJicmV2cyhjb25zdCBBc21QcmludGVyICpBUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRUFiYnJldlNldCAmQWJicmV2U2V0LCB1bnNpZ25lZCBDVU9mZnNldCk7CisKKyAgLy8vIENsaW1iIHVwIHRoZSBwYXJlbnQgY2hhaW4gdG8gZ2V0IHRoZSBjb21waWxlIHVuaXQgb3IgdHlwZSB1bml0IERJRSB0aGF0CisgIC8vLyB0aGlzIERJRSBiZWxvbmdzIHRvLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSBjb21waWxlIG9yIHR5cGUgdW5pdCBESUUgdGhhdCBvd25zIHRoaXMgRElFLCBvciBOVUxMIGlmCisgIC8vLyB0aGlzIERJRSBoYXNuJ3QgYmVlbiBhZGRlZCB0byBhIHVuaXQgRElFLgorICBjb25zdCBESUUgKmdldFVuaXREaWUoKSBjb25zdDsKKworICAvLy8gQ2xpbWIgdXAgdGhlIHBhcmVudCBjaGFpbiB0byBnZXQgdGhlIGNvbXBpbGUgdW5pdCBvciB0eXBlIHVuaXQgdGhhdCB0aGlzCisgIC8vLyBESUUgYmVsb25ncyB0by4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgRElFVW5pdCB0aGF0IHJlcHJlc2VudHMgdGhlIGNvbXBpbGUgb3IgdHlwZSB1bml0IHRoYXQgb3ducworICAvLy8gdGhpcyBESUUsIG9yIE5VTEwgaWYgdGhpcyBESUUgaGFzbid0IGJlZW4gYWRkZWQgdG8gYSB1bml0IERJRS4KKyAgY29uc3QgRElFVW5pdCAqZ2V0VW5pdCgpIGNvbnN0OworCisgIHZvaWQgc2V0T2Zmc2V0KHVuc2lnbmVkIE8pIHsgT2Zmc2V0ID0gTzsgfQorICB2b2lkIHNldFNpemUodW5zaWduZWQgUykgeyBTaXplID0gUzsgfQorCisgIC8vLyBBZGQgYSBjaGlsZCB0byB0aGUgRElFLgorICBESUUgJmFkZENoaWxkKERJRSAqQ2hpbGQpIHsKKyAgICBhc3NlcnQoIUNoaWxkLT5nZXRQYXJlbnQoKSAmJiAiQ2hpbGQgc2hvdWxkIGJlIG9ycGhhbmVkIik7CisgICAgQ2hpbGQtPk93bmVyID0gdGhpczsKKyAgICBDaGlsZHJlbi5wdXNoX2JhY2soKkNoaWxkKTsKKyAgICByZXR1cm4gQ2hpbGRyZW4uYmFjaygpOworICB9CisKKyAgLy8vIEZpbmQgYSB2YWx1ZSBpbiB0aGUgRElFIHdpdGggdGhlIGF0dHJpYnV0ZSBnaXZlbi4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIGEgZGVmYXVsdC1jb25zdHJ1Y3RlZCBESUVWYWx1ZSAod2hlcmUgXGEgRElFVmFsdWU6OmdldFR5cGUoKQorICAvLy8gZ2l2ZXMgXGEgRElFVmFsdWU6OmlzTm9uZSkgaWYgbm8gc3VjaCBhdHRyaWJ1dGUgZXhpc3RzLgorICBESUVWYWx1ZSBmaW5kQXR0cmlidXRlKGR3YXJmOjpBdHRyaWJ1dGUgQXR0cmlidXRlKSBjb25zdDsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPLCB1bnNpZ25lZCBJbmRlbnRDb3VudCA9IDApIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFJlcHJlc2VudHMgYSBjb21waWxlIG9yIHR5cGUgdW5pdC4KK2NsYXNzIERJRVVuaXQgeworICAvLy8gVGhlIGNvbXBpbGUgdW5pdCBvciB0eXBlIHVuaXQgRElFLiBUaGlzIHZhcmlhYmxlIG11c3QgYmUgYW4gaW5zdGFuY2Ugb2YKKyAgLy8vIERJRSBzbyB0aGF0IHdlIGNhbiBjYWxjdWxhdGUgdGhlIERJRVVuaXQgZnJvbSBhbnkgRElFIGJ5IHRyYXZlcnNpbmcgdGhlCisgIC8vLyBwYXJlbnQgYmFja2NoYWluIGFuZCBnZXR0aW5nIHRoZSBVbml0IERJRSwgYW5kIHRoZW4gY2FzdGluZyBpdHNlbGYgdG8gYQorICAvLy8gRElFVW5pdC4gVGhpcyBhbGxvd3MgdXMgdG8gYmUgYWJsZSB0byBmaW5kIHRoZSBESUVVbml0IGZvciBhbnkgRElFIHdpdGhvdXQKKyAgLy8vIGhhdmluZyB0byBzdG9yZSBhIHBvaW50ZXIgdG8gdGhlIERJRVVuaXQgaW4gZWFjaCBESUUgaW5zdGFuY2UuCisgIERJRSBEaWU7CisgIC8vLyBUaGUgc2VjdGlvbiB0aGlzIHVuaXQgd2lsbCBiZSBlbWl0dGVkIGluLiBUaGlzIG1heSBvciBtYXkgbm90IGJlIHNldCB0bworICAvLy8gYSB2YWxpZCBzZWN0aW9uIGRlcGVuZGluZyBvbiB0aGUgY2xpZW50IHRoYXQgaXMgZW1pdHRpbmcgRFdBUkYuCisgIE1DU2VjdGlvbiAqU2VjdGlvbjsKKyAgdWludDY0X3QgT2Zmc2V0OyAvLy8gLmRlYnVnX2luZm8gb3IgLmRlYnVnX3R5cGVzIGFic29sdXRlIHNlY3Rpb24gb2Zmc2V0LgorICB1aW50MzJfdCBMZW5ndGg7IC8vLyBUaGUgbGVuZ3RoIGluIGJ5dGVzIG9mIGFsbCBvZiB0aGUgRElFcyBpbiB0aGlzIHVuaXQuCisgIGNvbnN0IHVpbnQxNl90IFZlcnNpb247IC8vLyBUaGUgRHdhcmYgdmVyc2lvbiBudW1iZXIgZm9yIHRoaXMgdW5pdC4KKyAgY29uc3QgdWludDhfdCBBZGRyU2l6ZTsgLy8vIFRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIGFkZHJlc3MgZm9yIHRoaXMgdW5pdC4KK3Byb3RlY3RlZDoKKyAgfkRJRVVuaXQoKSA9IGRlZmF1bHQ7CisKK3B1YmxpYzoKKyAgRElFVW5pdCh1aW50MTZfdCBWZXJzaW9uLCB1aW50OF90IEFkZHJTaXplLCBkd2FyZjo6VGFnIFVuaXRUYWcpOworICBESUVVbml0KGNvbnN0IERJRVVuaXQgJlJIUykgPSBkZWxldGU7CisgIERJRVVuaXQoRElFVW5pdCAmJlJIUykgPSBkZWxldGU7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IERJRVVuaXQgJlJIUykgPSBkZWxldGU7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IERJRVVuaXQgJiZSSFMpID0gZGVsZXRlOworICAvLy8gU2V0IHRoZSBzZWN0aW9uIHRoYXQgdGhpcyBESUVVbml0IHdpbGwgYmUgZW1pdHRlZCBpbnRvLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBzb21lIGNsaWVudHMgdG8gc2V0IHRoZSBzZWN0aW9uLiBOb3QgYWxsIGNsaWVudHMKKyAgLy8vIHRoYXQgZW1pdCBEV0FSRiB1c2UgdGhpcyBzZWN0aW9uIHZhcmlhYmxlLgorICB2b2lkIHNldFNlY3Rpb24oTUNTZWN0aW9uICpTZWN0aW9uKSB7CisgICAgYXNzZXJ0KCF0aGlzLT5TZWN0aW9uKTsKKyAgICB0aGlzLT5TZWN0aW9uID0gU2VjdGlvbjsKKyAgfQorCisgIHZpcnR1YWwgY29uc3QgTUNTeW1ib2wgKmdldENyb3NzU2VjdGlvblJlbGF0aXZlQmFzZUFkZHJlc3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBzZWN0aW9uIHRoYXQgdGhpcyBESUVVbml0IHdpbGwgYmUgZW1pdHRlZCBpbnRvLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFNlY3Rpb24gcG9pbnRlciB3aGljaCBjYW4gYmUgTlVMTC4KKyAgTUNTZWN0aW9uICpnZXRTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gU2VjdGlvbjsgfQorICB2b2lkIHNldERlYnVnU2VjdGlvbk9mZnNldCh1bnNpZ25lZCBPKSB7IE9mZnNldCA9IE87IH0KKyAgdW5zaWduZWQgZ2V0RGVidWdTZWN0aW9uT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gT2Zmc2V0OyB9CisgIHZvaWQgc2V0TGVuZ3RoKHVpbnQ2NF90IEwpIHsgTGVuZ3RoID0gTDsgfQorICB1aW50NjRfdCBnZXRMZW5ndGgoKSBjb25zdCB7IHJldHVybiBMZW5ndGg7IH0KKyAgdWludDE2X3QgZ2V0RHdhcmZWZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gVmVyc2lvbjsgfQorICB1aW50MTZfdCBnZXRBZGRyZXNzU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEFkZHJTaXplOyB9CisgIERJRSAmZ2V0VW5pdERpZSgpIHsgcmV0dXJuIERpZTsgfQorICBjb25zdCBESUUgJmdldFVuaXREaWUoKSBjb25zdCB7IHJldHVybiBEaWU7IH0KK307CisKK3N0cnVjdCBCYXNpY0RJRVVuaXQgZmluYWwgOiBESUVVbml0IHsKKyAgQmFzaWNESUVVbml0KHVpbnQxNl90IFZlcnNpb24sIHVpbnQ4X3QgQWRkclNpemUsIGR3YXJmOjpUYWcgVW5pdFRhZykKKyAgICAgIDogRElFVW5pdChWZXJzaW9uLCBBZGRyU2l6ZSwgVW5pdFRhZykge30KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIERJRUxvYyAtIFJlcHJlc2VudHMgYW4gZXhwcmVzc2lvbiBsb2NhdGlvbi4KKy8vCitjbGFzcyBESUVMb2MgOiBwdWJsaWMgRElFVmFsdWVMaXN0IHsKKyAgbXV0YWJsZSB1bnNpZ25lZCBTaXplID0gMDsgLy8gU2l6ZSBpbiBieXRlcyBleGNsdWRpbmcgc2l6ZSBoZWFkZXIuCisKK3B1YmxpYzoKKyAgRElFTG9jKCkgPSBkZWZhdWx0OworCisgIC8vLyBDb21wdXRlU2l6ZSAtIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgbG9jYXRpb24gZXhwcmVzc2lvbi4KKyAgLy8vCisgIHVuc2lnbmVkIENvbXB1dGVTaXplKGNvbnN0IEFzbVByaW50ZXIgKkFQKSBjb25zdDsKKworICAvLy8gQmVzdEZvcm0gLSBDaG9vc2UgdGhlIGJlc3QgZm9ybSBmb3IgZGF0YS4KKyAgLy8vCisgIGR3YXJmOjpGb3JtIEJlc3RGb3JtKHVuc2lnbmVkIER3YXJmVmVyc2lvbikgY29uc3QgeworICAgIGlmIChEd2FyZlZlcnNpb24gPiAzKQorICAgICAgcmV0dXJuIGR3YXJmOjpEV19GT1JNX2V4cHJsb2M7CisgICAgLy8gUHJlLURXQVJGNCBsb2NhdGlvbiBleHByZXNzaW9ucyB3ZXJlIGJsb2NrcyBhbmQgbm90IGV4cHJsb2MuCisgICAgaWYgKCh1bnNpZ25lZCBjaGFyKVNpemUgPT0gU2l6ZSkKKyAgICAgIHJldHVybiBkd2FyZjo6RFdfRk9STV9ibG9jazE7CisgICAgaWYgKCh1bnNpZ25lZCBzaG9ydClTaXplID09IFNpemUpCisgICAgICByZXR1cm4gZHdhcmY6OkRXX0ZPUk1fYmxvY2syOworICAgIGlmICgodW5zaWduZWQgaW50KVNpemUgPT0gU2l6ZSkKKyAgICAgIHJldHVybiBkd2FyZjo6RFdfRk9STV9ibG9jazQ7CisgICAgcmV0dXJuIGR3YXJmOjpEV19GT1JNX2Jsb2NrOworICB9CisKKyAgdm9pZCBFbWl0VmFsdWUoY29uc3QgQXNtUHJpbnRlciAqQVAsIGR3YXJmOjpGb3JtIEZvcm0pIGNvbnN0OworICB1bnNpZ25lZCBTaXplT2YoY29uc3QgQXNtUHJpbnRlciAqQVAsIGR3YXJmOjpGb3JtIEZvcm0pIGNvbnN0OworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8pIGNvbnN0OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gRElFQmxvY2sgLSBSZXByZXNlbnRzIGEgYmxvY2sgb2YgdmFsdWVzLgorLy8KK2NsYXNzIERJRUJsb2NrIDogcHVibGljIERJRVZhbHVlTGlzdCB7CisgIG11dGFibGUgdW5zaWduZWQgU2l6ZSA9IDA7IC8vIFNpemUgaW4gYnl0ZXMgZXhjbHVkaW5nIHNpemUgaGVhZGVyLgorCitwdWJsaWM6CisgIERJRUJsb2NrKCkgPSBkZWZhdWx0OworCisgIC8vLyBDb21wdXRlU2l6ZSAtIENhbGN1bGF0ZSB0aGUgc2l6ZSBvZiB0aGUgbG9jYXRpb24gZXhwcmVzc2lvbi4KKyAgLy8vCisgIHVuc2lnbmVkIENvbXB1dGVTaXplKGNvbnN0IEFzbVByaW50ZXIgKkFQKSBjb25zdDsKKworICAvLy8gQmVzdEZvcm0gLSBDaG9vc2UgdGhlIGJlc3QgZm9ybSBmb3IgZGF0YS4KKyAgLy8vCisgIGR3YXJmOjpGb3JtIEJlc3RGb3JtKCkgY29uc3QgeworICAgIGlmICgodW5zaWduZWQgY2hhcilTaXplID09IFNpemUpCisgICAgICByZXR1cm4gZHdhcmY6OkRXX0ZPUk1fYmxvY2sxOworICAgIGlmICgodW5zaWduZWQgc2hvcnQpU2l6ZSA9PSBTaXplKQorICAgICAgcmV0dXJuIGR3YXJmOjpEV19GT1JNX2Jsb2NrMjsKKyAgICBpZiAoKHVuc2lnbmVkIGludClTaXplID09IFNpemUpCisgICAgICByZXR1cm4gZHdhcmY6OkRXX0ZPUk1fYmxvY2s0OworICAgIHJldHVybiBkd2FyZjo6RFdfRk9STV9ibG9jazsKKyAgfQorCisgIHZvaWQgRW1pdFZhbHVlKGNvbnN0IEFzbVByaW50ZXIgKkFQLCBkd2FyZjo6Rm9ybSBGb3JtKSBjb25zdDsKKyAgdW5zaWduZWQgU2l6ZU9mKGNvbnN0IEFzbVByaW50ZXIgKkFQLCBkd2FyZjo6Rm9ybSBGb3JtKSBjb25zdDsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPKSBjb25zdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0xJQl9DT0RFR0VOX0FTTVBSSU5URVJfRElFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9ESUVWYWx1ZS5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vRElFVmFsdWUuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZmNlOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vRElFVmFsdWUuZGVmCkBAIC0wLDAgKzEsNDcgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vRElFVmFsdWUuZGVmIC0gRElFVmFsdWUgdHlwZXMgLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTWFjcm9zIGZvciBydW5uaW5nIHRocm91Z2ggYWxsIHR5cGVzIG9mIERJRVZhbHVlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZiAhKGRlZmluZWQgSEFORExFX0RJRVZBTFVFIHx8IGRlZmluZWQgSEFORExFX0RJRVZBTFVFX1NNQUxMIHx8ICAgICAgICAgICAgICBcCisgICAgICBkZWZpbmVkIEhBTkRMRV9ESUVWQUxVRV9MQVJHRSkKKyNlcnJvciAiTWlzc2luZyBtYWNybyBkZWZpbml0aW9uIG9mIEhBTkRMRV9ESUVWQUxVRSIKKyNlbmRpZgorCisvLyBIYW5kbGVyIGZvciBhbGwgdmFsdWVzLgorI2lmbmRlZiBIQU5ETEVfRElFVkFMVUUKKyNkZWZpbmUgSEFORExFX0RJRVZBTFVFKFQpCisjZW5kaWYKKworLy8gSGFuZGxlciBmb3Igc21hbGwgdmFsdWVzLgorI2lmbmRlZiBIQU5ETEVfRElFVkFMVUVfU01BTEwKKyNkZWZpbmUgSEFORExFX0RJRVZBTFVFX1NNQUxMKFQpIEhBTkRMRV9ESUVWQUxVRShUKQorI2VuZGlmCisKKy8vIEhhbmRsZXIgZm9yIGxhcmdlIHZhbHVlcy4KKyNpZm5kZWYgSEFORExFX0RJRVZBTFVFX0xBUkdFCisjZGVmaW5lIEhBTkRMRV9ESUVWQUxVRV9MQVJHRShUKSBIQU5ETEVfRElFVkFMVUUoVCkKKyNlbmRpZgorCitIQU5ETEVfRElFVkFMVUVfU01BTEwoSW50ZWdlcikKK0hBTkRMRV9ESUVWQUxVRV9TTUFMTChTdHJpbmcpCitIQU5ETEVfRElFVkFMVUVfU01BTEwoRXhwcikKK0hBTkRMRV9ESUVWQUxVRV9TTUFMTChMYWJlbCkKK0hBTkRMRV9ESUVWQUxVRV9MQVJHRShEZWx0YSkKK0hBTkRMRV9ESUVWQUxVRV9TTUFMTChFbnRyeSkKK0hBTkRMRV9ESUVWQUxVRV9MQVJHRShCbG9jaykKK0hBTkRMRV9ESUVWQUxVRV9MQVJHRShMb2MpCitIQU5ETEVfRElFVkFMVUVfU01BTEwoTG9jTGlzdCkKK0hBTkRMRV9ESUVWQUxVRV9MQVJHRShJbmxpbmVTdHJpbmcpCisKKyN1bmRlZiBIQU5ETEVfRElFVkFMVUUKKyN1bmRlZiBIQU5ETEVfRElFVkFMVUVfU01BTEwKKyN1bmRlZiBIQU5ETEVfRElFVkFMVUVfTEFSR0UKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9Ed2FyZlN0cmluZ1Bvb2xFbnRyeS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0R3YXJmU3RyaW5nUG9vbEVudHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTZjMDQ4MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9Ed2FyZlN0cmluZ1Bvb2xFbnRyeS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vRHdhcmZTdHJpbmdQb29sRW50cnkuaCAtIFN0cmluZyBwb29sIGVudHJ5IC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0RXQVJGU1RSSU5HUE9PTEVOVFJZX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0RXQVJGU1RSSU5HUE9PTEVOVFJZX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DU3ltYm9sOworCisvLy8gRGF0YSBmb3IgYSBzdHJpbmcgcG9vbCBlbnRyeS4KK3N0cnVjdCBEd2FyZlN0cmluZ1Bvb2xFbnRyeSB7CisgIE1DU3ltYm9sICpTeW1ib2w7CisgIHVuc2lnbmVkIE9mZnNldDsKKyAgdW5zaWduZWQgSW5kZXg7Cit9OworCisvLy8gU3RyaW5nIHBvb2wgZW50cnkgcmVmZXJlbmNlLgorc3RydWN0IER3YXJmU3RyaW5nUG9vbEVudHJ5UmVmIHsKKyAgY29uc3QgU3RyaW5nTWFwRW50cnk8RHdhcmZTdHJpbmdQb29sRW50cnk+ICpJID0gbnVsbHB0cjsKKworcHVibGljOgorICBEd2FyZlN0cmluZ1Bvb2xFbnRyeVJlZigpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgRHdhcmZTdHJpbmdQb29sRW50cnlSZWYoCisgICAgICBjb25zdCBTdHJpbmdNYXBFbnRyeTxEd2FyZlN0cmluZ1Bvb2xFbnRyeT4gJkkpCisgICAgICA6IEkoJkkpIHt9CisKKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIEk7IH0KKyAgTUNTeW1ib2wgKmdldFN5bWJvbCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSS0+c2Vjb25kLlN5bWJvbCAmJiAiTm8gc3ltYm9sIGF2YWlsYWJsZSEiKTsKKyAgICByZXR1cm4gSS0+c2Vjb25kLlN5bWJvbDsKKyAgfQorICB1bnNpZ25lZCBnZXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBJLT5zZWNvbmQuT2Zmc2V0OyB9CisgIHVuc2lnbmVkIGdldEluZGV4KCkgY29uc3QgeyByZXR1cm4gSS0+c2Vjb25kLkluZGV4OyB9CisgIFN0cmluZ1JlZiBnZXRTdHJpbmcoKSBjb25zdCB7IHJldHVybiBJLT5maXJzdCgpOyB9CisgIC8vLyBSZXR1cm4gdGhlIGVudGlyZSBzdHJpbmcgcG9vbCBlbnRyeSBmb3IgY29udmVuaWVuY2UuCisgIER3YXJmU3RyaW5nUG9vbEVudHJ5IGdldEVudHJ5KCkgY29uc3QgeyByZXR1cm4gSS0+Z2V0VmFsdWUoKTsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEd2FyZlN0cmluZ1Bvb2xFbnRyeVJlZiAmWCkgY29uc3QgeyByZXR1cm4gSSA9PSBYLkk7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IER3YXJmU3RyaW5nUG9vbEVudHJ5UmVmICZYKSBjb25zdCB7IHJldHVybiBJICE9IFguSTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vRWRnZUJ1bmRsZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9FZGdlQnVuZGxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzMWZhZDIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vRWRnZUJ1bmRsZXMuaApAQCAtMCwwICsxLDY0IEBACisvLz09PS0tLS0tLS0tIEVkZ2VCdW5kbGVzLmggLSBCdW5kbGVzIG9mIENGRyBlZGdlcyAtLS0tLS0tLS0tLS0tLSotIGMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoZSBFZGdlQnVuZGxlcyBhbmFseXNpcyBmb3JtcyBlcXVpdmFsZW5jZSBjbGFzc2VzIG9mIENGRyBlZGdlcyBzdWNoIHRoYXQgYWxsCisvLyBlZGdlcyBsZWF2aW5nIGEgbWFjaGluZSBiYXNpYyBibG9jayBhcmUgaW4gdGhlIHNhbWUgYnVuZGxlLCBhbmQgYWxsIGVkZ2VzCisvLyBsZWF2aW5nIGEgYmFzaWMgYmxvY2sgYXJlIGluIHRoZSBzYW1lIGJ1bmRsZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9FREdFQlVORExFU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9FREdFQlVORExFU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ludEVxQ2xhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBFZGdlQnVuZGxlcyA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRjsKKworICAvLy8gRUMgLSBFYWNoIGVkZ2UgYnVuZGxlIGlzIGFuIGVxdWl2YWxlbmNlIGNsYXNzLiBUaGUga2V5cyBhcmU6CisgIC8vLyAgIDIqQkItPmdldE51bWJlcigpICAgLT4gSW5nb2luZyBidW5kbGUuCisgIC8vLyAgIDIqQkItPmdldE51bWJlcigpKzEgLT4gT3V0Z29pbmcgYnVuZGxlLgorICBJbnRFcUNsYXNzZXMgRUM7CisKKyAgLy8vIEJsb2NrcyAtIE1hcCBlYWNoIGJ1bmRsZSB0byBhIGxpc3Qgb2YgYmFzaWMgYmxvY2sgbnVtYmVycy4KKyAgU21hbGxWZWN0b3I8U21hbGxWZWN0b3I8dW5zaWduZWQsIDg+LCA0PiBCbG9ja3M7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisgIEVkZ2VCdW5kbGVzKCkgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSB7fQorCisgIC8vLyBnZXRCdW5kbGUgLSBSZXR1cm4gdGhlIGluZ29pbmcgKE91dCA9IGZhbHNlKSBvciBvdXRnb2luZyAoT3V0ID0gdHJ1ZSkKKyAgLy8vIGJ1bmRsZSBudW1iZXIgZm9yIGJhc2ljIGJsb2NrICNOCisgIHVuc2lnbmVkIGdldEJ1bmRsZSh1bnNpZ25lZCBOLCBib29sIE91dCkgY29uc3QgeyByZXR1cm4gRUNbMiAqIE4gKyBPdXRdOyB9CisKKyAgLy8vIGdldE51bUJ1bmRsZXMgLSBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBidW5kbGVzIGluIHRoZSBDRkcuCisgIHVuc2lnbmVkIGdldE51bUJ1bmRsZXMoKSBjb25zdCB7IHJldHVybiBFQy5nZXROdW1DbGFzc2VzKCk7IH0KKworICAvLy8gZ2V0QmxvY2tzIC0gUmV0dXJuIGFuIGFycmF5IG9mIGJsb2NrcyB0aGF0IGFyZSBjb25uZWN0ZWQgdG8gQnVuZGxlLgorICBBcnJheVJlZjx1bnNpZ25lZD4gZ2V0QmxvY2tzKHVuc2lnbmVkIEJ1bmRsZSkgY29uc3QgeyByZXR1cm4gQmxvY2tzW0J1bmRsZV07IH0KKworICAvLy8gZ2V0TWFjaGluZUZ1bmN0aW9uIC0gUmV0dXJuIHRoZSBsYXN0IG1hY2hpbmUgZnVuY3Rpb24gY29tcHV0ZWQuCisgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqZ2V0TWFjaGluZUZ1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gTUY7IH0KKworICAvLy8gdmlldyAtIFZpc3VhbGl6ZSB0aGUgYW5ub3RhdGVkIGJpcGFydGl0ZSBDRkcgd2l0aCBHcmFwaHZpei4KKyAgdm9pZCB2aWV3KCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uJikgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlJikgY29uc3Qgb3ZlcnJpZGU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9FeGVjdXRpb25Eb21haW5GaXguaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9FeGVjdXRpb25Eb21haW5GaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMzhjMjE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0V4ZWN1dGlvbkRvbWFpbkZpeC5oCkBAIC0wLDAgKzEsMjEzIEBACisvLz09LS0gbGx2bS9Db2RlR2VuL0V4ZWN1dGlvbkRvbWFpbkZpeC5oIC0gRXhlY3V0aW9uIERvbWFpbiBGaXggLSotIEMrKyAtKi0tPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZSBFeGVjdXRpb24gRG9tYWluIEZpeCBwYXNzLgorLy8vCisvLy8gU29tZSBYODYgU1NFIGluc3RydWN0aW9ucyBsaWtlIG1vdiwgYW5kLCBvciwgeG9yIGFyZSBhdmFpbGFibGUgaW4gZGlmZmVyZW50CisvLy8gdmFyaWFudHMgZm9yIGRpZmZlcmVudCBvcGVyYW5kIHR5cGVzLiBUaGVzZSB2YXJpYW50IGluc3RydWN0aW9ucyBhcmUKKy8vLyBlcXVpdmFsZW50LCBidXQgb24gTmVoYWxlbSBhbmQgbmV3ZXIgY3B1cyB0aGVyZSBpcyBleHRyYSBsYXRlbmN5CisvLy8gdHJhbnNmZXJyaW5nIGRhdGEgYmV0d2VlbiBpbnRlZ2VyIGFuZCBmbG9hdGluZyBwb2ludCBkb21haW5zLiAgQVJNIGNvcmVzCisvLy8gaGF2ZSBzaW1pbGFyIGlzc3VlcyB3aGVuIHRoZXkgYXJlIGNvbmZpZ3VyZWQgd2l0aCBib3RoIFZGUCBhbmQgTkVPTgorLy8vIHBpcGVsaW5lcy4KKy8vLworLy8vIFRoaXMgcGFzcyBjaGFuZ2VzIHRoZSB2YXJpYW50IGluc3RydWN0aW9ucyB0byBtaW5pbWl6ZSBkb21haW4gY3Jvc3NpbmdzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0VYRUNVVElPTkRPTUFJTkZJWF9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9FWEVDVVRJT05ET01BSU5GSVhfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTG9vcFRyYXZlcnNhbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1JlYWNoaW5nRGVmQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBUYXJnZXRJbnN0ckluZm87CisKKy8vLyBBIERvbWFpblZhbHVlIGlzIGEgYml0IGxpa2UgTGl2ZUludGVydmFscycgVmFsTm8sIGJ1dCBpdCBhbHNvIGtlZXBzIHRyYWNrCisvLy8gb2YgZXhlY3V0aW9uIGRvbWFpbnMuCisvLy8KKy8vLyBBbiBvcGVuIERvbWFpblZhbHVlIHJlcHJlc2VudHMgYSBzZXQgb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgY2FuIHN0aWxsIHN3aXRjaAorLy8vIGV4ZWN1dGlvbiBkb21haW4uIE11bHRpcGxlIHJlZ2lzdGVycyBtYXkgcmVmZXIgdG8gdGhlIHNhbWUgb3BlbgorLy8vIERvbWFpblZhbHVlIC0gdGhleSB3aWxsIGV2ZW50dWFsbHkgYmUgY29sbGFwc2VkIHRvIHRoZSBzYW1lIGV4ZWN1dGlvbgorLy8vIGRvbWFpbi4KKy8vLworLy8vIEEgY29sbGFwc2VkIERvbWFpblZhbHVlIHJlcHJlc2VudHMgYSBzaW5nbGUgcmVnaXN0ZXIgdGhhdCBoYXMgYmVlbiBmb3JjZWQKKy8vLyBpbnRvIG9uZSBvZiBtb3JlIGV4ZWN1dGlvbiBkb21haW5zLiBUaGVyZSBpcyBhIHNlcGFyYXRlIGNvbGxhcHNlZAorLy8vIERvbWFpblZhbHVlIGZvciBlYWNoIHJlZ2lzdGVyLCBidXQgaXQgbWF5IGNvbnRhaW4gbXVsdGlwbGUgZXhlY3V0aW9uCisvLy8gZG9tYWlucy4gQSByZWdpc3RlciB2YWx1ZSBpcyBpbml0aWFsbHkgY3JlYXRlZCBpbiBhIHNpbmdsZSBleGVjdXRpb24KKy8vLyBkb21haW4sIGJ1dCBpZiB3ZSB3ZXJlIGZvcmNlZCB0byBwYXkgdGhlIHBlbmFsdHkgb2YgYSBkb21haW4gY3Jvc3NpbmcsIHdlCisvLy8ga2VlcCB0cmFjayBvZiB0aGUgZmFjdCB0aGF0IHRoZSByZWdpc3RlciBpcyBub3cgYXZhaWxhYmxlIGluIG11bHRpcGxlCisvLy8gZG9tYWlucy4KK3N0cnVjdCBEb21haW5WYWx1ZSB7CisgIC8vLyBCYXNpYyByZWZlcmVuY2UgY291bnRpbmcuCisgIHVuc2lnbmVkIFJlZnMgPSAwOworCisgIC8vLyBCaXRtYXNrIG9mIGF2YWlsYWJsZSBkb21haW5zLiBGb3IgYW4gb3BlbiBEb21haW5WYWx1ZSwgaXQgaXMgdGhlIHN0aWxsCisgIC8vLyBwb3NzaWJsZSBkb21haW5zIGZvciBjb2xsYXBzaW5nLiBGb3IgYSBjb2xsYXBzZWQgRG9tYWluVmFsdWUgaXQgaXMgdGhlCisgIC8vLyBkb21haW5zIHdoZXJlIHRoZSByZWdpc3RlciBpcyBhdmFpbGFibGUgZm9yIGZyZWUuCisgIHVuc2lnbmVkIEF2YWlsYWJsZURvbWFpbnM7CisKKyAgLy8vIFBvaW50ZXIgdG8gdGhlIG5leHQgRG9tYWluVmFsdWUgaW4gYSBjaGFpbi4gIFdoZW4gdHdvIERvbWFpblZhbHVlcyBhcmUKKyAgLy8vIG1lcmdlZCwgVmljdGltLk5leHQgaXMgc2V0IHRvIHBvaW50IHRvIFZpY3Rvciwgc28gb2xkIERvbWFpblZhbHVlCisgIC8vLyByZWZlcmVuY2VzIGNhbiBiZSB1cGRhdGVkIGJ5IGZvbGxvd2luZyB0aGUgY2hhaW4uCisgIERvbWFpblZhbHVlICpOZXh0OworCisgIC8vLyBUd2lkZGxlYWJsZSBpbnN0cnVjdGlvbnMgdXNpbmcgb3IgZGVmaW5pbmcgdGhlc2UgcmVnaXN0ZXJzLgorICBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIgKiwgOD4gSW5zdHJzOworCisgIERvbWFpblZhbHVlKCkgeyBjbGVhcigpOyB9CisKKyAgLy8vIEEgY29sbGFwc2VkIERvbWFpblZhbHVlIGhhcyBubyBpbnN0cnVjdGlvbnMgdG8gdHdpZGRsZSAtIGl0IHNpbXBseSBrZWVwcworICAvLy8gdHJhY2sgb2YgdGhlIGRvbWFpbnMgd2hlcmUgdGhlIHJlZ2lzdGVycyBhcmUgYWxyZWFkeSBhdmFpbGFibGUuCisgIGJvb2wgaXNDb2xsYXBzZWQoKSBjb25zdCB7IHJldHVybiBJbnN0cnMuZW1wdHkoKTsgfQorCisgIC8vLyBJcyBkb21haW4gYXZhaWxhYmxlPworICBib29sIGhhc0RvbWFpbih1bnNpZ25lZCBkb21haW4pIGNvbnN0IHsKKyAgICBhc3NlcnQoZG9tYWluIDwKKyAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkPihzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6ZGlnaXRzKSAmJgorICAgICAgICAgICAidW5kZWZpbmVkIGJlaGF2aW9yIik7CisgICAgcmV0dXJuIEF2YWlsYWJsZURvbWFpbnMgJiAoMXUgPDwgZG9tYWluKTsKKyAgfQorCisgIC8vLyBNYXJrIGRvbWFpbiBhcyBhdmFpbGFibGUuCisgIHZvaWQgYWRkRG9tYWluKHVuc2lnbmVkIGRvbWFpbikgeyBBdmFpbGFibGVEb21haW5zIHw9IDF1IDw8IGRvbWFpbjsgfQorCisgIC8vIFJlc3RyaWN0IHRvIGEgc2luZ2xlIGRvbWFpbiBhdmFpbGFibGUuCisgIHZvaWQgc2V0U2luZ2xlRG9tYWluKHVuc2lnbmVkIGRvbWFpbikgeyBBdmFpbGFibGVEb21haW5zID0gMXUgPDwgZG9tYWluOyB9CisKKyAgLy8vIFJldHVybiBiaXRtYXNrIG9mIGRvbWFpbnMgdGhhdCBhcmUgYXZhaWxhYmxlIGFuZCBpbiBtYXNrLgorICB1bnNpZ25lZCBnZXRDb21tb25Eb21haW5zKHVuc2lnbmVkIG1hc2spIGNvbnN0IHsKKyAgICByZXR1cm4gQXZhaWxhYmxlRG9tYWlucyAmIG1hc2s7CisgIH0KKworICAvLy8gRmlyc3QgZG9tYWluIGF2YWlsYWJsZS4KKyAgdW5zaWduZWQgZ2V0Rmlyc3REb21haW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvdW50VHJhaWxpbmdaZXJvcyhBdmFpbGFibGVEb21haW5zKTsKKyAgfQorCisgIC8vLyBDbGVhciB0aGlzIERvbWFpblZhbHVlIGFuZCBwb2ludCB0byBuZXh0IHdoaWNoIGhhcyBhbGwgaXRzIGRhdGEuCisgIHZvaWQgY2xlYXIoKSB7CisgICAgQXZhaWxhYmxlRG9tYWlucyA9IDA7CisgICAgTmV4dCA9IG51bGxwdHI7CisgICAgSW5zdHJzLmNsZWFyKCk7CisgIH0KK307CisKK2NsYXNzIEV4ZWN1dGlvbkRvbWFpbkZpeCA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgU3BlY2lmaWNCdW1wUHRyQWxsb2NhdG9yPERvbWFpblZhbHVlPiBBbGxvY2F0b3I7CisgIFNtYWxsVmVjdG9yPERvbWFpblZhbHVlICosIDE2PiBBdmFpbDsKKworICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpjb25zdCBSQzsKKyAgTWFjaGluZUZ1bmN0aW9uICpNRjsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJOworICBzdGQ6OnZlY3RvcjxTbWFsbFZlY3RvcjxpbnQsIDE+PiBBbGlhc01hcDsKKyAgY29uc3QgdW5zaWduZWQgTnVtUmVnczsKKyAgLy8vIFZhbHVlIGN1cnJlbnRseSBpbiBlYWNoIHJlZ2lzdGVyLCBvciBOVUxMIHdoZW4gbm8gdmFsdWUgaXMgYmVpbmcgdHJhY2tlZC4KKyAgLy8vIFRoaXMgY291bnRzIGFzIGEgRG9tYWluVmFsdWUgcmVmZXJlbmNlLgorICB1c2luZyBMaXZlUmVnc0RWSW5mbyA9IHN0ZDo6dmVjdG9yPERvbWFpblZhbHVlICo+OworICBMaXZlUmVnc0RWSW5mbyBMaXZlUmVnczsKKyAgLy8vIEtlZXBzIGRvbWFpbiBpbmZvcm1hdGlvbiBmb3IgYWxsIHJlZ2lzdGVycy4gTm90ZSB0aGF0IHRoaXMKKyAgLy8vIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB1c3VhbCBkZWZpbml0aW9uIG5vdGlvbiBvZiBsaXZlbmVzcy4gVGhlIENQVQorICAvLy8gZG9lc24ndCBjYXJlIHdoZXRoZXIgb3Igbm90IHdlIGNvbnNpZGVyIGEgcmVnaXN0ZXIga2lsbGVkLgorICB1c2luZyBPdXRSZWdzSW5mb01hcCA9IFNtYWxsVmVjdG9yPExpdmVSZWdzRFZJbmZvLCA0PjsKKyAgT3V0UmVnc0luZm9NYXAgTUJCT3V0UmVnc0luZm9zOworCisgIFJlYWNoaW5nRGVmQW5hbHlzaXMgKlJEQTsKKworcHVibGljOgorICBFeGVjdXRpb25Eb21haW5GaXgoY2hhciAmUGFzc0lELCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICZSQykKKyAgICAgIDogTWFjaGluZUZ1bmN0aW9uUGFzcyhQYXNzSUQpLCBSQygmUkMpLCBOdW1SZWdzKFJDLmdldE51bVJlZ3MoKSkge30KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgICBBVS5hZGRSZXF1aXJlZDxSZWFjaGluZ0RlZkFuYWx5c2lzPigpOworICAgIE1hY2hpbmVGdW5jdGlvblBhc3M6OmdldEFuYWx5c2lzVXNhZ2UoQVUpOworICB9CisKKyAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKSBvdmVycmlkZTsKKworICBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzIGdldFJlcXVpcmVkUHJvcGVydGllcygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcygpLnNldCgKKyAgICAgICAgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllczo6UHJvcGVydHk6Ok5vVlJlZ3MpOworICB9CisKK3ByaXZhdGU6CisgIC8vLyBUcmFuc2xhdGUgVFJJIHJlZ2lzdGVyIG51bWJlciB0byBhIGxpc3Qgb2YgaW5kaWNlcyBpbnRvIG91ciBzbWFsbGVyIHRhYmxlcworICAvLy8gb2YgaW50ZXJlc3RpbmcgcmVnaXN0ZXJzLgorICBpdGVyYXRvcl9yYW5nZTxTbWFsbFZlY3RvckltcGw8aW50Pjo6Y29uc3RfaXRlcmF0b3I+CisgIHJlZ0luZGljZXModW5zaWduZWQgUmVnKSBjb25zdDsKKworICAvLy8gRG9tYWluVmFsdWUgYWxsb2NhdGlvbi4KKyAgRG9tYWluVmFsdWUgKmFsbG9jKGludCBkb21haW4gPSAtMSk7CisKKyAgLy8vIEFkZCByZWZlcmVuY2UgdG8gRFYuCisgIERvbWFpblZhbHVlICpyZXRhaW4oRG9tYWluVmFsdWUgKkRWKSB7CisgICAgaWYgKERWKQorICAgICAgKytEVi0+UmVmczsKKyAgICByZXR1cm4gRFY7CisgIH0KKworICAvLy8gUmVsZWFzZSBhIHJlZmVyZW5jZSB0byBEVi4gIFdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIGlzIHJlbGVhc2VkLAorICAvLy8gY29sbGFwc2UgaWYgbmVlZGVkLgorICB2b2lkIHJlbGVhc2UoRG9tYWluVmFsdWUgKik7CisKKyAgLy8vIEZvbGxvdyB0aGUgY2hhaW4gb2YgZGVhZCBEb21haW5WYWx1ZXMgdW50aWwgYSBsaXZlIERvbWFpblZhbHVlIGlzIHJlYWNoZWQuCisgIC8vLyBVcGRhdGUgdGhlIHJlZmVyZW5jZWQgcG9pbnRlciB3aGVuIG5lY2Vzc2FyeS4KKyAgRG9tYWluVmFsdWUgKnJlc29sdmUoRG9tYWluVmFsdWUgKiYpOworCisgIC8vLyBTZXQgTGl2ZVJlZ3NbcnhdID0gZHYsIHVwZGF0aW5nIHJlZmVyZW5jZSBjb3VudHMuCisgIHZvaWQgc2V0TGl2ZVJlZyhpbnQgcngsIERvbWFpblZhbHVlICpEVik7CisKKyAgLy8vIEtpbGwgcmVnaXN0ZXIgcngsIHJlY3ljbGUgb3IgY29sbGFwc2UgYW55IERvbWFpblZhbHVlLgorICB2b2lkIGtpbGwoaW50IHJ4KTsKKworICAvLy8gRm9yY2UgcmVnaXN0ZXIgcnggaW50byBkb21haW4uCisgIHZvaWQgZm9yY2UoaW50IHJ4LCB1bnNpZ25lZCBkb21haW4pOworCisgIC8vLyBDb2xsYXBzZSBvcGVuIERvbWFpblZhbHVlIGludG8gZ2l2ZW4gZG9tYWluLiBJZiB0aGVyZSBhcmUgbXVsdGlwbGUKKyAgLy8vIHJlZ2lzdGVycyB1c2luZyBkdiwgdGhleSBlYWNoIGdldCBhIHVuaXF1ZSBjb2xsYXBzZWQgRG9tYWluVmFsdWUuCisgIHZvaWQgY29sbGFwc2UoRG9tYWluVmFsdWUgKmR2LCB1bnNpZ25lZCBkb21haW4pOworCisgIC8vLyBBbGwgaW5zdHJ1Y3Rpb25zIGFuZCByZWdpc3RlcnMgaW4gQiBhcmUgbW92ZWQgdG8gQSwgYW5kIEIgaXMgcmVsZWFzZWQuCisgIGJvb2wgbWVyZ2UoRG9tYWluVmFsdWUgKkEsIERvbWFpblZhbHVlICpCKTsKKworICAvLy8gU2V0IHVwIExpdmVSZWdzIGJ5IG1lcmdpbmcgcHJlZGVjZXNzb3IgbGl2ZS1vdXQgdmFsdWVzLgorICB2b2lkIGVudGVyQmFzaWNCbG9jayhjb25zdCBMb29wVHJhdmVyc2FsOjpUcmF2ZXJzZWRNQkJJbmZvICZUcmF2ZXJzZWRNQkIpOworCisgIC8vLyBVcGRhdGUgbGl2ZS1vdXQgdmFsdWVzLgorICB2b2lkIGxlYXZlQmFzaWNCbG9jayhjb25zdCBMb29wVHJhdmVyc2FsOjpUcmF2ZXJzZWRNQkJJbmZvICZUcmF2ZXJzZWRNQkIpOworCisgIC8vLyBQcm9jZXNzIGhlIGdpdmVuIGJhc2ljIGJsb2NrLgorICB2b2lkIHByb2Nlc3NCYXNpY0Jsb2NrKGNvbnN0IExvb3BUcmF2ZXJzYWw6OlRyYXZlcnNlZE1CQkluZm8gJlRyYXZlcnNlZE1CQik7CisKKyAgLy8vIFZpc2l0IGdpdmVuIGluc3R1cmNpb24uCisgIGJvb2wgdmlzaXRJbnN0cihNYWNoaW5lSW5zdHIgKik7CisKKyAgLy8vIFVwZGF0ZSBkZWYtYWdlcyBmb3IgcmVnaXN0ZXJzIGRlZmluZWQgYnkgTUkuCisgIC8vLyBJZiBLaWxsIGlzIHNldCwgYWxzbyBraWxsIG9mZiBEb21haW5WYWx1ZXMgY2xvYmJlcmVkIGJ5IHRoZSBkZWZzLgorICB2b2lkIHByb2Nlc3NEZWZzKE1hY2hpbmVJbnN0ciAqLCBib29sIEtpbGwpOworCisgIC8vLyBBIHNvZnQgaW5zdHJ1Y3Rpb24gY2FuIGJlIGNoYW5nZWQgdG8gd29yayBpbiBvdGhlciBkb21haW5zIGdpdmVuIGJ5IG1hc2suCisgIHZvaWQgdmlzaXRTb2Z0SW5zdHIoTWFjaGluZUluc3RyICosIHVuc2lnbmVkIG1hc2spOworCisgIC8vLyBBIGhhcmQgaW5zdHJ1Y3Rpb24gb25seSB3b3JrcyBpbiBvbmUgZG9tYWluLiBBbGwgaW5wdXQgcmVnaXN0ZXJzIHdpbGwgYmUKKyAgLy8vIGZvcmNlZCBpbnRvIHRoYXQgZG9tYWluLgorICB2b2lkIHZpc2l0SGFyZEluc3RyKE1hY2hpbmVJbnN0ciAqLCB1bnNpZ25lZCBkb21haW4pOworfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0VYRUNVVElPTkRPTUFJTkZJWF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vRXhwYW5kUmVkdWN0aW9ucy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0V4cGFuZFJlZHVjdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmFhYWFkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0V4cGFuZFJlZHVjdGlvbnMuaApAQCAtMCwwICsxLDI0IEBACisvLz09PS0tLS0tIEV4cGFuZFJlZHVjdGlvbnMuaCAtIEV4cGFuZCBleHBlcmltZW50YWwgcmVkdWN0aW9uIGludHJpbnNpY3MgLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9FWFBBTkRSRURVQ1RJT05TX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0VYUEFORFJFRFVDVElPTlNfSAorCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEV4cGFuZFJlZHVjdGlvbnNQYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxFeHBhbmRSZWR1Y3Rpb25zUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9FWFBBTkRSRURVQ1RJT05TX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9GYXN0SVNlbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0Zhc3RJU2VsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcyYmQ2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9GYXN0SVNlbC5oCkBAIC0wLDAgKzEsNTkzIEBACisvLz09PS0gRmFzdElTZWwuaCAtIERlZmluaXRpb24gb2YgdGhlIEZhc3RJU2VsIGNsYXNzIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgRmFzdElTZWwgY2xhc3MuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0ZBU1RJU0VMX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0ZBU1RJU0VMX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0TG93ZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsaW5nQ29udi5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGVidWdMb2MuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYWNoaW5lVmFsdWVUeXBlLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBbGxvY2FJbnN0OworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIENhbGxJbnN0OworY2xhc3MgQ29uc3RhbnQ7CitjbGFzcyBDb25zdGFudEZQOworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIEZ1bmN0aW9uTG93ZXJpbmdJbmZvOworY2xhc3MgTG9hZEluc3Q7CitjbGFzcyBNYWNoaW5lQ29uc3RhbnRQb29sOworY2xhc3MgTWFjaGluZUZyYW1lSW5mbzsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIE1hY2hpbmVNZW1PcGVyYW5kOworY2xhc3MgTWFjaGluZU9wZXJhbmQ7CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNJbnN0ckRlc2M7CitjbGFzcyBNQ1N5bWJvbDsKK2NsYXNzIFRhcmdldEluc3RySW5mbzsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworY2xhc3MgVGFyZ2V0TWFjaGluZTsKK2NsYXNzIFRhcmdldFJlZ2lzdGVyQ2xhc3M7CitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CitjbGFzcyBUeXBlOworY2xhc3MgVXNlcjsKK2NsYXNzIFZhbHVlOworCisvLy8gXGJyaWVmIFRoaXMgaXMgYSBmYXN0LXBhdGggaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIGNsYXNzIHRoYXQgZ2VuZXJhdGVzIHBvb3IKKy8vLyBjb2RlIGFuZCBkb2Vzbid0IHN1cHBvcnQgaWxsZWdhbCB0eXBlcyBvciBub24tdHJpdmlhbCBsb3dlcmluZywgYnV0IHJ1bnMKKy8vLyBxdWlja2x5LgorY2xhc3MgRmFzdElTZWwgeworcHVibGljOgorICB1c2luZyBBcmdMaXN0RW50cnkgPSBUYXJnZXRMb3dlcmluZ0Jhc2U6OkFyZ0xpc3RFbnRyeTsKKyAgdXNpbmcgQXJnTGlzdFR5ID0gVGFyZ2V0TG93ZXJpbmdCYXNlOjpBcmdMaXN0VHk7CisgIHN0cnVjdCBDYWxsTG93ZXJpbmdJbmZvIHsKKyAgICBUeXBlICpSZXRUeSA9IG51bGxwdHI7CisgICAgYm9vbCBSZXRTRXh0IDogMTsKKyAgICBib29sIFJldFpFeHQgOiAxOworICAgIGJvb2wgSXNWYXJBcmcgOiAxOworICAgIGJvb2wgSXNJblJlZyA6IDE7CisgICAgYm9vbCBEb2VzTm90UmV0dXJuIDogMTsKKyAgICBib29sIElzUmV0dXJuVmFsdWVVc2VkIDogMTsKKyAgICBib29sIElzUGF0Y2hQb2ludCA6IDE7CisKKyAgICAvLyBcYnJpZWYgSXNUYWlsQ2FsbCBTaG91bGQgYmUgbW9kaWZpZWQgYnkgaW1wbGVtZW50YXRpb25zIG9mIEZhc3RMb3dlckNhbGwKKyAgICAvLyB0aGF0IHBlcmZvcm0gdGFpbCBjYWxsIGNvbnZlcnNpb25zLgorICAgIGJvb2wgSXNUYWlsQ2FsbCA9IGZhbHNlOworCisgICAgdW5zaWduZWQgTnVtRml4ZWRBcmdzID0gLTE7CisgICAgQ2FsbGluZ0NvbnY6OklEIENhbGxDb252ID0gQ2FsbGluZ0NvbnY6OkM7CisgICAgY29uc3QgVmFsdWUgKkNhbGxlZSA9IG51bGxwdHI7CisgICAgTUNTeW1ib2wgKlN5bWJvbCA9IG51bGxwdHI7CisgICAgQXJnTGlzdFR5IEFyZ3M7CisgICAgSW1tdXRhYmxlQ2FsbFNpdGUgKkNTID0gbnVsbHB0cjsKKyAgICBNYWNoaW5lSW5zdHIgKkNhbGwgPSBudWxscHRyOworICAgIHVuc2lnbmVkIFJlc3VsdFJlZyA9IDA7CisgICAgdW5zaWduZWQgTnVtUmVzdWx0UmVncyA9IDA7CisKKyAgICBTbWFsbFZlY3RvcjxWYWx1ZSAqLCAxNj4gT3V0VmFsczsKKyAgICBTbWFsbFZlY3RvcjxJU0Q6OkFyZ0ZsYWdzVHksIDE2PiBPdXRGbGFnczsKKyAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMTY+IE91dFJlZ3M7CisgICAgU21hbGxWZWN0b3I8SVNEOjpJbnB1dEFyZywgND4gSW5zOworICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBJblJlZ3M7CisKKyAgICBDYWxsTG93ZXJpbmdJbmZvKCkKKyAgICAgICAgOiBSZXRTRXh0KGZhbHNlKSwgUmV0WkV4dChmYWxzZSksIElzVmFyQXJnKGZhbHNlKSwgSXNJblJlZyhmYWxzZSksCisgICAgICAgICAgRG9lc05vdFJldHVybihmYWxzZSksIElzUmV0dXJuVmFsdWVVc2VkKHRydWUpLCBJc1BhdGNoUG9pbnQoZmFsc2UpIHt9CisKKyAgICBDYWxsTG93ZXJpbmdJbmZvICZzZXRDYWxsZWUoVHlwZSAqUmVzdWx0VHksIEZ1bmN0aW9uVHlwZSAqRnVuY1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqVGFyZ2V0LCBBcmdMaXN0VHkgJiZBcmdzTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlQ2FsbFNpdGUgJkNhbGwpIHsKKyAgICAgIFJldFR5ID0gUmVzdWx0VHk7CisgICAgICBDYWxsZWUgPSBUYXJnZXQ7CisKKyAgICAgIElzSW5SZWcgPSBDYWxsLmhhc1JldEF0dHIoQXR0cmlidXRlOjpJblJlZyk7CisgICAgICBEb2VzTm90UmV0dXJuID0gQ2FsbC5kb2VzTm90UmV0dXJuKCk7CisgICAgICBJc1ZhckFyZyA9IEZ1bmNUeS0+aXNWYXJBcmcoKTsKKyAgICAgIElzUmV0dXJuVmFsdWVVc2VkID0gIUNhbGwuZ2V0SW5zdHJ1Y3Rpb24oKS0+dXNlX2VtcHR5KCk7CisgICAgICBSZXRTRXh0ID0gQ2FsbC5oYXNSZXRBdHRyKEF0dHJpYnV0ZTo6U0V4dCk7CisgICAgICBSZXRaRXh0ID0gQ2FsbC5oYXNSZXRBdHRyKEF0dHJpYnV0ZTo6WkV4dCk7CisKKyAgICAgIENhbGxDb252ID0gQ2FsbC5nZXRDYWxsaW5nQ29udigpOworICAgICAgQXJncyA9IHN0ZDo6bW92ZShBcmdzTGlzdCk7CisgICAgICBOdW1GaXhlZEFyZ3MgPSBGdW5jVHktPmdldE51bVBhcmFtcygpOworCisgICAgICBDUyA9ICZDYWxsOworCisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ2FsbExvd2VyaW5nSW5mbyAmc2V0Q2FsbGVlKFR5cGUgKlJlc3VsdFR5LCBGdW5jdGlvblR5cGUgKkZ1bmNUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTeW1ib2wgKlRhcmdldCwgQXJnTGlzdFR5ICYmQXJnc0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltbXV0YWJsZUNhbGxTaXRlICZDYWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGaXhlZEFyZ3MgPSB+MFUpIHsKKyAgICAgIFJldFR5ID0gUmVzdWx0VHk7CisgICAgICBDYWxsZWUgPSBDYWxsLmdldENhbGxlZFZhbHVlKCk7CisgICAgICBTeW1ib2wgPSBUYXJnZXQ7CisKKyAgICAgIElzSW5SZWcgPSBDYWxsLmhhc1JldEF0dHIoQXR0cmlidXRlOjpJblJlZyk7CisgICAgICBEb2VzTm90UmV0dXJuID0gQ2FsbC5kb2VzTm90UmV0dXJuKCk7CisgICAgICBJc1ZhckFyZyA9IEZ1bmNUeS0+aXNWYXJBcmcoKTsKKyAgICAgIElzUmV0dXJuVmFsdWVVc2VkID0gIUNhbGwuZ2V0SW5zdHJ1Y3Rpb24oKS0+dXNlX2VtcHR5KCk7CisgICAgICBSZXRTRXh0ID0gQ2FsbC5oYXNSZXRBdHRyKEF0dHJpYnV0ZTo6U0V4dCk7CisgICAgICBSZXRaRXh0ID0gQ2FsbC5oYXNSZXRBdHRyKEF0dHJpYnV0ZTo6WkV4dCk7CisKKyAgICAgIENhbGxDb252ID0gQ2FsbC5nZXRDYWxsaW5nQ29udigpOworICAgICAgQXJncyA9IHN0ZDo6bW92ZShBcmdzTGlzdCk7CisgICAgICBOdW1GaXhlZEFyZ3MgPSAoRml4ZWRBcmdzID09IH4wVSkgPyBGdW5jVHktPmdldE51bVBhcmFtcygpIDogRml4ZWRBcmdzOworCisgICAgICBDUyA9ICZDYWxsOworCisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ2FsbExvd2VyaW5nSW5mbyAmc2V0Q2FsbGVlKENhbGxpbmdDb252OjpJRCBDQywgVHlwZSAqUmVzdWx0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpUYXJnZXQsIEFyZ0xpc3RUeSAmJkFyZ3NMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGaXhlZEFyZ3MgPSB+MFUpIHsKKyAgICAgIFJldFR5ID0gUmVzdWx0VHk7CisgICAgICBDYWxsZWUgPSBUYXJnZXQ7CisgICAgICBDYWxsQ29udiA9IENDOworICAgICAgQXJncyA9IHN0ZDo6bW92ZShBcmdzTGlzdCk7CisgICAgICBOdW1GaXhlZEFyZ3MgPSAoRml4ZWRBcmdzID09IH4wVSkgPyBBcmdzLnNpemUoKSA6IEZpeGVkQXJnczsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDYWxsTG93ZXJpbmdJbmZvICZzZXRDYWxsZWUoY29uc3QgRGF0YUxheW91dCAmREwsIE1DQ29udGV4dCAmQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYWxsaW5nQ29udjo6SUQgQ0MsIFR5cGUgKlJlc3VsdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVGFyZ2V0LCBBcmdMaXN0VHkgJiZBcmdzTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRml4ZWRBcmdzID0gfjBVKTsKKworICAgIENhbGxMb3dlcmluZ0luZm8gJnNldENhbGxlZShDYWxsaW5nQ29udjo6SUQgQ0MsIFR5cGUgKlJlc3VsdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1N5bWJvbCAqVGFyZ2V0LCBBcmdMaXN0VHkgJiZBcmdzTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRml4ZWRBcmdzID0gfjBVKSB7CisgICAgICBSZXRUeSA9IFJlc3VsdFR5OworICAgICAgU3ltYm9sID0gVGFyZ2V0OworICAgICAgQ2FsbENvbnYgPSBDQzsKKyAgICAgIEFyZ3MgPSBzdGQ6Om1vdmUoQXJnc0xpc3QpOworICAgICAgTnVtRml4ZWRBcmdzID0gKEZpeGVkQXJncyA9PSB+MFUpID8gQXJncy5zaXplKCkgOiBGaXhlZEFyZ3M7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ2FsbExvd2VyaW5nSW5mbyAmc2V0VGFpbENhbGwoYm9vbCBWYWx1ZSA9IHRydWUpIHsKKyAgICAgIElzVGFpbENhbGwgPSBWYWx1ZTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDYWxsTG93ZXJpbmdJbmZvICZzZXRJc1BhdGNoUG9pbnQoYm9vbCBWYWx1ZSA9IHRydWUpIHsKKyAgICAgIElzUGF0Y2hQb2ludCA9IFZhbHVlOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIEFyZ0xpc3RUeSAmZ2V0QXJncygpIHsgcmV0dXJuIEFyZ3M7IH0KKworICAgIHZvaWQgY2xlYXJPdXRzKCkgeworICAgICAgT3V0VmFscy5jbGVhcigpOworICAgICAgT3V0RmxhZ3MuY2xlYXIoKTsKKyAgICAgIE91dFJlZ3MuY2xlYXIoKTsKKyAgICB9CisKKyAgICB2b2lkIGNsZWFySW5zKCkgeworICAgICAgSW5zLmNsZWFyKCk7CisgICAgICBJblJlZ3MuY2xlYXIoKTsKKyAgICB9CisgIH07CisKK3Byb3RlY3RlZDoKKyAgRGVuc2VNYXA8Y29uc3QgVmFsdWUgKiwgdW5zaWduZWQ+IExvY2FsVmFsdWVNYXA7CisgIEZ1bmN0aW9uTG93ZXJpbmdJbmZvICZGdW5jSW5mbzsKKyAgTWFjaGluZUZ1bmN0aW9uICpNRjsKKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJOworICBNYWNoaW5lRnJhbWVJbmZvICZNRkk7CisgIE1hY2hpbmVDb25zdGFudFBvb2wgJk1DUDsKKyAgRGVidWdMb2MgRGJnTG9jOworICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTTsKKyAgY29uc3QgRGF0YUxheW91dCAmREw7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJOworICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJOworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSTsKKyAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKkxpYkluZm87CisgIGJvb2wgU2tpcFRhcmdldEluZGVwZW5kZW50SVNlbDsKKworICAvLy8gXGJyaWVmIFRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBpbnN0cnVjdGlvbiBmb3IgbWF0ZXJpYWxpemluZyBjb25zdGFudHMKKyAgLy8vIGZvciB1c2UgaW4gdGhlIGN1cnJlbnQgYmxvY2suIEl0IHJlc2V0cyB0byBFbWl0U3RhcnRQdCB3aGVuIGl0IG1ha2VzIHNlbnNlCisgIC8vLyAoZm9yIGV4YW1wbGUsIGl0J3MgdXN1YWxseSBwcm9maXRhYmxlIHRvIGF2b2lkIGZ1bmN0aW9uIGNhbGxzIGJldHdlZW4gdGhlCisgIC8vLyBkZWZpbml0aW9uIGFuZCB0aGUgdXNlKQorICBNYWNoaW5lSW5zdHIgKkxhc3RMb2NhbFZhbHVlOworCisgIC8vLyBcYnJpZWYgVGhlIHRvcCBtb3N0IGluc3RydWN0aW9uIGluIHRoZSBjdXJyZW50IGJsb2NrIHRoYXQgaXMgYWxsb3dlZCBmb3IKKyAgLy8vIGVtaXR0aW5nIGxvY2FsIHZhcmlhYmxlcy4gTGFzdExvY2FsVmFsdWUgcmVzZXRzIHRvIEVtaXRTdGFydFB0IHdoZW4gaXQKKyAgLy8vIG1ha2VzIHNlbnNlIChmb3IgZXhhbXBsZSwgb24gZnVuY3Rpb24gY2FsbHMpCisgIE1hY2hpbmVJbnN0ciAqRW1pdFN0YXJ0UHQ7CisKK3B1YmxpYzoKKyAgdmlydHVhbCB+RmFzdElTZWwoKTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3QgaW5zdHJ1Y3Rpb24gZW1pdHRlZCBmb3IKKyAgLy8vIG1hdGVyaWFsaXppbmcgY29uc3RhbnRzIGZvciB1c2UgaW4gdGhlIGN1cnJlbnQgYmxvY2suCisgIE1hY2hpbmVJbnN0ciAqZ2V0TGFzdExvY2FsVmFsdWUoKSB7IHJldHVybiBMYXN0TG9jYWxWYWx1ZTsgfQorCisgIC8vLyBcYnJpZWYgVXBkYXRlIHRoZSBwb3NpdGlvbiBvZiB0aGUgbGFzdCBpbnN0cnVjdGlvbiBlbWl0dGVkIGZvcgorICAvLy8gbWF0ZXJpYWxpemluZyBjb25zdGFudHMgZm9yIHVzZSBpbiB0aGUgY3VycmVudCBibG9jay4KKyAgdm9pZCBzZXRMYXN0TG9jYWxWYWx1ZShNYWNoaW5lSW5zdHIgKkkpIHsKKyAgICBFbWl0U3RhcnRQdCA9IEk7CisgICAgTGFzdExvY2FsVmFsdWUgPSBJOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIGN1cnJlbnQgYmxvY2sgdG8gd2hpY2ggZ2VuZXJhdGVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIHdpbGwKKyAgLy8vIGJlIGFwcGVuZGVkLgorICB2b2lkIHN0YXJ0TmV3QmxvY2soKTsKKworICAvLy8gRmx1c2ggdGhlIGxvY2FsIHZhbHVlIG1hcCBhbmQgc2luayBsb2NhbCB2YWx1ZXMgaWYgcG9zc2libGUuCisgIHZvaWQgZmluaXNoQmFzaWNCbG9jaygpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIGN1cnJlbnQgZGVidWcgbG9jYXRpb24gaW5mb3JtYXRpb24uCisgIERlYnVnTG9jIGdldEN1ckRlYnVnTG9jKCkgY29uc3QgeyByZXR1cm4gRGJnTG9jOyB9CisKKyAgLy8vIFxicmllZiBEbyAiZmFzdCIgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIGZvciBmdW5jdGlvbiBhcmd1bWVudHMgYW5kIGFwcGVuZAorICAvLy8gdGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBjdXJyZW50IGJsb2NrLiBSZXR1cm5zIHRydWUgd2hlbgorICAvLy8gc3VjY2Vzc2Z1bC4KKyAgYm9vbCBsb3dlckFyZ3VtZW50cygpOworCisgIC8vLyBcYnJpZWYgRG8gImZhc3QiIGluc3RydWN0aW9uIHNlbGVjdGlvbiBmb3IgdGhlIGdpdmVuIExMVk0gSVIgaW5zdHJ1Y3Rpb24KKyAgLy8vIGFuZCBhcHBlbmQgdGhlIGdlbmVyYXRlZCBtYWNoaW5lIGluc3RydWN0aW9ucyB0byB0aGUgY3VycmVudCBibG9jay4KKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBzZWxlY3Rpb24gd2FzIHN1Y2Nlc3NmdWwuCisgIGJvb2wgc2VsZWN0SW5zdHJ1Y3Rpb24oY29uc3QgSW5zdHJ1Y3Rpb24gKkkpOworCisgIC8vLyBcYnJpZWYgRG8gImZhc3QiIGluc3RydWN0aW9uIHNlbGVjdGlvbiBmb3IgdGhlIGdpdmVuIExMVk0gSVIgb3BlcmF0b3IKKyAgLy8vIChJbnN0cnVjdGlvbiBvciBDb25zdGFudEV4cHIpLCBhbmQgYXBwZW5kIGdlbmVyYXRlZCBtYWNoaW5lIGluc3RydWN0aW9ucworICAvLy8gdG8gdGhlIGN1cnJlbnQgYmxvY2suIFJldHVybiB0cnVlIGlmIHNlbGVjdGlvbiB3YXMgc3VjY2Vzc2Z1bC4KKyAgYm9vbCBzZWxlY3RPcGVyYXRvcihjb25zdCBVc2VyICpJLCB1bnNpZ25lZCBPcGNvZGUpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgdmlydHVhbCByZWdpc3RlciBhbmQgYXJyYW5nZSBmb3IgaXQgdG8gYmUgYXNzaWduZWQgdGhlCisgIC8vLyB2YWx1ZSBmb3IgdGhlIGdpdmVuIExMVk0gdmFsdWUuCisgIHVuc2lnbmVkIGdldFJlZ0ZvclZhbHVlKGNvbnN0IFZhbHVlICpWKTsKKworICAvLy8gXGJyaWVmIExvb2sgdXAgdGhlIHZhbHVlIHRvIHNlZSBpZiBpdHMgdmFsdWUgaXMgYWxyZWFkeSBjYWNoZWQgaW4gYQorICAvLy8gcmVnaXN0ZXIuIEl0IG1heSBiZSBkZWZpbmVkIGJ5IGluc3RydWN0aW9ucyBhY3Jvc3MgYmxvY2tzIG9yIGRlZmluZWQKKyAgLy8vIGxvY2FsbHkuCisgIHVuc2lnbmVkIGxvb2tVcFJlZ0ZvclZhbHVlKGNvbnN0IFZhbHVlICpWKTsKKworICAvLy8gXGJyaWVmIFRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZCBnZXRSZWdGb3JWYWx1ZSB0aGF0IGFsc28gdGFrZXMgY2FyZSBvZgorICAvLy8gdHJ1bmNhdGluZyBvciBzaWduLWV4dGVuZGluZyB0aGUgZ2l2ZW4gZ2V0ZWxlbWVudHB0ciBpbmRleCB2YWx1ZS4KKyAgc3RkOjpwYWlyPHVuc2lnbmVkLCBib29sPiBnZXRSZWdGb3JHRVBJbmRleChjb25zdCBWYWx1ZSAqVik7CisKKyAgLy8vIFxicmllZiBXZSdyZSBjaGVja2luZyB0byBzZWUgaWYgd2UgY2FuIGZvbGQgXHAgTEkgaW50byBccCBGb2xkSW5zdC4gTm90ZQorICAvLy8gdGhhdCB3ZSBjb3VsZCBoYXZlIGEgc2VxdWVuY2Ugd2hlcmUgbXVsdGlwbGUgTExWTSBJUiBpbnN0cnVjdGlvbnMgYXJlCisgIC8vLyBmb2xkZWQgaW50byB0aGUgc2FtZSBtYWNoaW5laW5zdHIuICBGb3IgZXhhbXBsZSB3ZSBjb3VsZCBoYXZlOgorICAvLy8KKyAgLy8vICAgQTogeCA9IGxvYWQgaTMyICpQCisgIC8vLyAgIEI6IHkgPSBpY21wIEEsIDQyCisgIC8vLyAgIEM6IGJyIHksIC4uLgorICAvLy8KKyAgLy8vIEluIHRoaXMgc2NlbmFyaW8sIFxwIExJIGlzICJBIiwgYW5kIFxwIEZvbGRJbnN0IGlzICJDIi4gIFdlIGtub3cgYWJvdXQgIkIiCisgIC8vLyAoYW5kIGFueSBvdGhlciBmb2xkZWQgaW5zdHJ1Y3Rpb25zKSBiZWNhdXNlIGl0IGlzIGJldHdlZW4gQSBhbmQgQy4KKyAgLy8vCisgIC8vLyBJZiB3ZSBzdWNjZWVkIGZvbGRpbmcsIHJldHVybiB0cnVlLgorICBib29sIHRyeVRvRm9sZExvYWQoY29uc3QgTG9hZEluc3QgKkxJLCBjb25zdCBJbnN0cnVjdGlvbiAqRm9sZEluc3QpOworCisgIC8vLyBcYnJpZWYgVGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RyIG9wZXJhbmQgaXMgYSB2cmVnLCBhbmQgdGhhdCB2cmVnIGlzCisgIC8vLyBiZWluZyBwcm92aWRlZCBieSB0aGUgc3BlY2lmaWVkIGxvYWQgaW5zdHJ1Y3Rpb24uICBJZiBwb3NzaWJsZSwgdHJ5IHRvCisgIC8vLyBmb2xkIHRoZSBsb2FkIGFzIGFuIG9wZXJhbmQgdG8gdGhlIGluc3RydWN0aW9uLCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLy8gcG9zc2libGUuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IHRhcmdldHMuCisgIHZpcnR1YWwgYm9vbCB0cnlUb0ZvbGRMb2FkSW50b01JKE1hY2hpbmVJbnN0ciAqIC8qTUkqLywgdW5zaWduZWQgLypPcE5vKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvYWRJbnN0ICogLypMSSovKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBSZXNldCBJbnNlcnRQdCB0byBwcmVwYXJlIGZvciBpbnNlcnRpbmcgaW5zdHJ1Y3Rpb25zIGludG8gdGhlCisgIC8vLyBjdXJyZW50IGJsb2NrLgorICB2b2lkIHJlY29tcHV0ZUluc2VydFB0KCk7CisKKyAgLy8vIFxicmllZiBSZW1vdmUgYWxsIGRlYWQgaW5zdHJ1Y3Rpb25zIGJldHdlZW4gdGhlIEkgYW5kIEUuCisgIHZvaWQgcmVtb3ZlRGVhZENvZGUoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEUpOworCisgIHN0cnVjdCBTYXZlUG9pbnQgeworICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRQdDsKKyAgICBEZWJ1Z0xvYyBETDsKKyAgfTsKKworICAvLy8gXGJyaWVmIFByZXBhcmUgSW5zZXJ0UHQgdG8gYmVnaW4gaW5zZXJ0aW5nIGluc3RydWN0aW9ucyBpbnRvIHRoZSBsb2NhbAorICAvLy8gdmFsdWUgYXJlYSBhbmQgcmV0dXJuIHRoZSBvbGQgaW5zZXJ0IHBvc2l0aW9uLgorICBTYXZlUG9pbnQgZW50ZXJMb2NhbFZhbHVlQXJlYSgpOworCisgIC8vLyBcYnJpZWYgUmVzZXQgSW5zZXJ0UHQgdG8gdGhlIGdpdmVuIG9sZCBpbnNlcnQgcG9zaXRpb24uCisgIHZvaWQgbGVhdmVMb2NhbFZhbHVlQXJlYShTYXZlUG9pbnQgT2xkKTsKKworcHJvdGVjdGVkOgorICBleHBsaWNpdCBGYXN0SVNlbChGdW5jdGlvbkxvd2VyaW5nSW5mbyAmRnVuY0luZm8sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpMaWJJbmZvLAorICAgICAgICAgICAgICAgICAgICBib29sIFNraXBUYXJnZXRJbmRlcGVuZGVudElTZWwgPSBmYWxzZSk7CisKKyAgLy8vIFxicmllZiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGFyZ2V0LWluZGVwZW5kZW50IGNvZGUgd2hlbiB0aGUgbm9ybWFsCisgIC8vLyBGYXN0SVNlbCBwcm9jZXNzIGZhaWxzIHRvIHNlbGVjdCBhbiBpbnN0cnVjdGlvbi4gVGhpcyBnaXZlcyB0YXJnZXRzIGEKKyAgLy8vIGNoYW5jZSB0byBlbWl0IGNvZGUgZm9yIGFueXRoaW5nIHRoYXQgZG9lc24ndCBmaXQgaW50byBGYXN0SVNlbCdzCisgIC8vLyBmcmFtZXdvcmsuIEl0IHJldHVybnMgdHJ1ZSBpZiBpdCB3YXMgc3VjY2Vzc2Z1bC4KKyAgdmlydHVhbCBib29sIGZhc3RTZWxlY3RJbnN0cnVjdGlvbihjb25zdCBJbnN0cnVjdGlvbiAqSSkgPSAwOworCisgIC8vLyBcYnJpZWYgVGhpcyBtZXRob2QgaXMgY2FsbGVkIGJ5IHRhcmdldC1pbmRlcGVuZGVudCBjb2RlIHRvIGRvIHRhcmdldC0KKyAgLy8vIHNwZWNpZmljIGFyZ3VtZW50IGxvd2VyaW5nLiBJdCByZXR1cm5zIHRydWUgaWYgaXQgd2FzIHN1Y2Nlc3NmdWwuCisgIHZpcnR1YWwgYm9vbCBmYXN0TG93ZXJBcmd1bWVudHMoKTsKKworICAvLy8gXGJyaWVmIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0YXJnZXQtaW5kZXBlbmRlbnQgY29kZSB0byBkbyB0YXJnZXQtCisgIC8vLyBzcGVjaWZpYyBjYWxsIGxvd2VyaW5nLiBJdCByZXR1cm5zIHRydWUgaWYgaXQgd2FzIHN1Y2Nlc3NmdWwuCisgIHZpcnR1YWwgYm9vbCBmYXN0TG93ZXJDYWxsKENhbGxMb3dlcmluZ0luZm8gJkNMSSk7CisKKyAgLy8vIFxicmllZiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGFyZ2V0LWluZGVwZW5kZW50IGNvZGUgdG8gZG8gdGFyZ2V0LQorICAvLy8gc3BlY2lmaWMgaW50cmluc2ljIGxvd2VyaW5nLiBJdCByZXR1cm5zIHRydWUgaWYgaXQgd2FzIHN1Y2Nlc3NmdWwuCisgIHZpcnR1YWwgYm9vbCBmYXN0TG93ZXJJbnRyaW5zaWNDYWxsKGNvbnN0IEludHJpbnNpY0luc3QgKklJKTsKKworICAvLy8gXGJyaWVmIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0YXJnZXQtaW5kZXBlbmRlbnQgY29kZSB0byByZXF1ZXN0IHRoYXQgYW4KKyAgLy8vIGluc3RydWN0aW9uIHdpdGggdGhlIGdpdmVuIHR5cGUgYW5kIG9wY29kZSBiZSBlbWl0dGVkLgorICB2aXJ0dWFsIHVuc2lnbmVkIGZhc3RFbWl0XyhNVlQgVlQsIE1WVCBSZXRWVCwgdW5zaWduZWQgT3Bjb2RlKTsKKworICAvLy8gXGJyaWVmIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0YXJnZXQtaW5kZXBlbmRlbnQgY29kZSB0byByZXF1ZXN0IHRoYXQgYW4KKyAgLy8vIGluc3RydWN0aW9uIHdpdGggdGhlIGdpdmVuIHR5cGUsIG9wY29kZSwgYW5kIHJlZ2lzdGVyIG9wZXJhbmQgYmUgZW1pdHRlZC4KKyAgdmlydHVhbCB1bnNpZ25lZCBmYXN0RW1pdF9yKE1WVCBWVCwgTVZUIFJldFZULCB1bnNpZ25lZCBPcGNvZGUsIHVuc2lnbmVkIE9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT3AwSXNLaWxsKTsKKworICAvLy8gXGJyaWVmIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0YXJnZXQtaW5kZXBlbmRlbnQgY29kZSB0byByZXF1ZXN0IHRoYXQgYW4KKyAgLy8vIGluc3RydWN0aW9uIHdpdGggdGhlIGdpdmVuIHR5cGUsIG9wY29kZSwgYW5kIHJlZ2lzdGVyIG9wZXJhbmRzIGJlIGVtaXR0ZWQuCisgIHZpcnR1YWwgdW5zaWduZWQgZmFzdEVtaXRfcnIoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wY29kZSwgdW5zaWduZWQgT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT3AwSXNLaWxsLCB1bnNpZ25lZCBPcDEsIGJvb2wgT3AxSXNLaWxsKTsKKworICAvLy8gXGJyaWVmIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0YXJnZXQtaW5kZXBlbmRlbnQgY29kZSB0byByZXF1ZXN0IHRoYXQgYW4KKyAgLy8vIGluc3RydWN0aW9uIHdpdGggdGhlIGdpdmVuIHR5cGUsIG9wY29kZSwgYW5kIHJlZ2lzdGVyIGFuZCBpbW1lZGlhdGUKKyAgLy8vIG9wZXJhbmRzIGJlIGVtaXR0ZWQuCisgIHZpcnR1YWwgdW5zaWduZWQgZmFzdEVtaXRfcmkoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wY29kZSwgdW5zaWduZWQgT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT3AwSXNLaWxsLCB1aW50NjRfdCBJbW0pOworCisgIC8vLyBcYnJpZWYgVGhpcyBtZXRob2QgaXMgYSB3cmFwcGVyIG9mIGZhc3RFbWl0X3JpLgorICAvLy8KKyAgLy8vIEl0IGZpcnN0IHRyaWVzIHRvIGVtaXQgYW4gaW5zdHJ1Y3Rpb24gd2l0aCBhbiBpbW1lZGlhdGUgb3BlcmFuZCB1c2luZworICAvLy8gZmFzdEVtaXRfcmkuICBJZiB0aGF0IGZhaWxzLCBpdCBtYXRlcmlhbGl6ZXMgdGhlIGltbWVkaWF0ZSBpbnRvIGEgcmVnaXN0ZXIKKyAgLy8vIGFuZCB0cnkgZmFzdEVtaXRfcnIgaW5zdGVhZC4KKyAgdW5zaWduZWQgZmFzdEVtaXRfcmlfKE1WVCBWVCwgdW5zaWduZWQgT3Bjb2RlLCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgSW1tLCBNVlQgSW1tVHlwZSk7CisKKyAgLy8vIFxicmllZiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGFyZ2V0LWluZGVwZW5kZW50IGNvZGUgdG8gcmVxdWVzdCB0aGF0IGFuCisgIC8vLyBpbnN0cnVjdGlvbiB3aXRoIHRoZSBnaXZlbiB0eXBlLCBvcGNvZGUsIGFuZCBpbW1lZGlhdGUgb3BlcmFuZCBiZSBlbWl0dGVkLgorICB2aXJ0dWFsIHVuc2lnbmVkIGZhc3RFbWl0X2koTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wY29kZSwgdWludDY0X3QgSW1tKTsKKworICAvLy8gXGJyaWVmIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBieSB0YXJnZXQtaW5kZXBlbmRlbnQgY29kZSB0byByZXF1ZXN0IHRoYXQgYW4KKyAgLy8vIGluc3RydWN0aW9uIHdpdGggdGhlIGdpdmVuIHR5cGUsIG9wY29kZSwgYW5kIGZsb2F0aW5nLXBvaW50IGltbWVkaWF0ZQorICAvLy8gb3BlcmFuZCBiZSBlbWl0dGVkLgorICB2aXJ0dWFsIHVuc2lnbmVkIGZhc3RFbWl0X2YoTVZUIFZULCBNVlQgUmV0VlQsIHVuc2lnbmVkIE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnN0YW50RlAgKkZQSW1tKTsKKworICAvLy8gXGJyaWVmIEVtaXQgYSBNYWNoaW5lSW5zdHIgd2l0aCBubyBvcGVyYW5kcyBhbmQgYSByZXN1bHQgcmVnaXN0ZXIgaW4gdGhlCisgIC8vLyBnaXZlbiByZWdpc3RlciBjbGFzcy4KKyAgdW5zaWduZWQgZmFzdEVtaXRJbnN0Xyh1bnNpZ25lZCBNYWNoaW5lSW5zdE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyk7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgTWFjaGluZUluc3RyIHdpdGggb25lIHJlZ2lzdGVyIG9wZXJhbmQgYW5kIGEgcmVzdWx0IHJlZ2lzdGVyCisgIC8vLyBpbiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgY2xhc3MuCisgIHVuc2lnbmVkIGZhc3RFbWl0SW5zdF9yKHVuc2lnbmVkIE1hY2hpbmVJbnN0T3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywgdW5zaWduZWQgT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9wMElzS2lsbCk7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgTWFjaGluZUluc3RyIHdpdGggdHdvIHJlZ2lzdGVyIG9wZXJhbmRzIGFuZCBhIHJlc3VsdAorICAvLy8gcmVnaXN0ZXIgaW4gdGhlIGdpdmVuIHJlZ2lzdGVyIGNsYXNzLgorICB1bnNpZ25lZCBmYXN0RW1pdEluc3RfcnIodW5zaWduZWQgTWFjaGluZUluc3RPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywgdW5zaWduZWQgT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwpOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIE1hY2hpbmVJbnN0ciB3aXRoIHRocmVlIHJlZ2lzdGVyIG9wZXJhbmRzIGFuZCBhIHJlc3VsdAorICAvLy8gcmVnaXN0ZXIgaW4gdGhlIGdpdmVuIHJlZ2lzdGVyIGNsYXNzLgorICB1bnNpZ25lZCBmYXN0RW1pdEluc3RfcnJyKHVuc2lnbmVkIE1hY2hpbmVJbnN0T3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLCB1bnNpZ25lZCBPcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3AyLCBib29sIE9wMklzS2lsbCk7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgTWFjaGluZUluc3RyIHdpdGggYSByZWdpc3RlciBvcGVyYW5kLCBhbiBpbW1lZGlhdGUsIGFuZCBhCisgIC8vLyByZXN1bHQgcmVnaXN0ZXIgaW4gdGhlIGdpdmVuIHJlZ2lzdGVyIGNsYXNzLgorICB1bnNpZ25lZCBmYXN0RW1pdEluc3RfcmkodW5zaWduZWQgTWFjaGluZUluc3RPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywgdW5zaWduZWQgT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IEltbSk7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgTWFjaGluZUluc3RyIHdpdGggb25lIHJlZ2lzdGVyIG9wZXJhbmQgYW5kIHR3byBpbW1lZGlhdGUKKyAgLy8vIG9wZXJhbmRzLgorICB1bnNpZ25lZCBmYXN0RW1pdEluc3RfcmlpKHVuc2lnbmVkIE1hY2hpbmVJbnN0T3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLCB1bnNpZ25lZCBPcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPcDBJc0tpbGwsIHVpbnQ2NF90IEltbTEsIHVpbnQ2NF90IEltbTIpOworCisgIC8vLyBcYnJpZWYgRW1pdCBhIE1hY2hpbmVJbnN0ciB3aXRoIGEgZmxvYXRpbmcgcG9pbnQgaW1tZWRpYXRlLCBhbmQgYSByZXN1bHQKKyAgLy8vIHJlZ2lzdGVyIGluIHRoZSBnaXZlbiByZWdpc3RlciBjbGFzcy4KKyAgdW5zaWduZWQgZmFzdEVtaXRJbnN0X2YodW5zaWduZWQgTWFjaGluZUluc3RPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25zdGFudEZQICpGUEltbSk7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgTWFjaGluZUluc3RyIHdpdGggdHdvIHJlZ2lzdGVyIG9wZXJhbmRzLCBhbiBpbW1lZGlhdGUsIGFuZCBhCisgIC8vLyByZXN1bHQgcmVnaXN0ZXIgaW4gdGhlIGdpdmVuIHJlZ2lzdGVyIGNsYXNzLgorICB1bnNpZ25lZCBmYXN0RW1pdEluc3RfcnJpKHVuc2lnbmVkIE1hY2hpbmVJbnN0T3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLCB1bnNpZ25lZCBPcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPcDBJc0tpbGwsIHVuc2lnbmVkIE9wMSwgYm9vbCBPcDFJc0tpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgSW1tKTsKKworICAvLy8gXGJyaWVmIEVtaXQgYSBNYWNoaW5lSW5zdHIgd2l0aCBhIHNpbmdsZSBpbW1lZGlhdGUgb3BlcmFuZCwgYW5kIGEgcmVzdWx0CisgIC8vLyByZWdpc3RlciBpbiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgY2xhc3MuCisgIHVuc2lnbmVkIGZhc3RFbWl0SW5zdF9pKHVuc2lnbmVkIE1hY2hpbmVJbnN0ck9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMsIHVpbnQ2NF90IEltbSk7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgTWFjaGluZUluc3RyIGZvciBhbiBleHRyYWN0X3N1YnJlZyBmcm9tIGEgc3BlY2lmaWVkIGluZGV4IG9mCisgIC8vLyBhIHN1cGVycmVnaXN0ZXIgdG8gYSBzcGVjaWZpZWQgdHlwZS4KKyAgdW5zaWduZWQgZmFzdEVtaXRJbnN0X2V4dHJhY3RzdWJyZWcoTVZUIFJldFZULCB1bnNpZ25lZCBPcDAsIGJvb2wgT3AwSXNLaWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJZHgpOworCisgIC8vLyBcYnJpZWYgRW1pdCBNYWNoaW5lSW5zdHJzIHRvIGNvbXB1dGUgdGhlIHZhbHVlIG9mIE9wIHdpdGggYWxsIGJ1dCB0aGUKKyAgLy8vIGxlYXN0IHNpZ25pZmljYW50IGJpdCBzZXQgdG8gemVyby4KKyAgdW5zaWduZWQgZmFzdEVtaXRaRXh0RnJvbUkxKE1WVCBWVCwgdW5zaWduZWQgT3AwLCBib29sIE9wMElzS2lsbCk7CisKKyAgLy8vIFxicmllZiBFbWl0IGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIHRvIHRoZSBnaXZlbiBibG9jaywgdW5sZXNzIGl0IGlzIHRoZQorICAvLy8gaW1tZWRpYXRlIChmYWxsLXRocm91Z2gpIHN1Y2Nlc3NvciwgYW5kIHVwZGF0ZSB0aGUgQ0ZHLgorICB2b2lkIGZhc3RFbWl0QnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsIGNvbnN0IERlYnVnTG9jICZETCk7CisKKyAgLy8vIEVtaXQgYW4gdW5jb25kaXRpb25hbCBicmFuY2ggdG8gXHAgRmFsc2VNQkIsIG9idGFpbnMgdGhlIGJyYW5jaCB3ZWlnaHQKKyAgLy8vIGFuZCBhZGRzIFRydWVNQkIgYW5kIEZhbHNlTUJCIHRvIHRoZSBzdWNjZXNzb3IgbGlzdC4KKyAgdm9pZCBmaW5pc2hDb25kQnJhbmNoKGNvbnN0IEJhc2ljQmxvY2sgKkJyYW5jaEJCLCBNYWNoaW5lQmFzaWNCbG9jayAqVHJ1ZU1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpGYWxzZU1CQik7CisKKyAgLy8vIFxicmllZiBVcGRhdGUgdGhlIHZhbHVlIG1hcCB0byBpbmNsdWRlIHRoZSBuZXcgbWFwcGluZyBmb3IgdGhpcworICAvLy8gaW5zdHJ1Y3Rpb24sIG9yIGluc2VydCBhbiBleHRyYSBjb3B5IHRvIGdldCB0aGUgcmVzdWx0IGluIGEgcHJldmlvdXMKKyAgLy8vIGRldGVybWluZWQgcmVnaXN0ZXIuCisgIC8vLworICAvLy8gTk9URTogVGhpcyBpcyBvbmx5IG5lY2Vzc2FyeSBiZWNhdXNlIHdlIG1pZ2h0IHNlbGVjdCBhIGJsb2NrIHRoYXQgdXNlcyBhCisgIC8vLyB2YWx1ZSBiZWZvcmUgd2Ugc2VsZWN0IHRoZSBibG9jayB0aGF0IGRlZmluZXMgdGhlIHZhbHVlLiBJdCBtaWdodCBiZQorICAvLy8gcG9zc2libGUgdG8gZml4IHRoaXMgYnkgc2VsZWN0aW5nIGJsb2NrcyBpbiByZXZlcnNlIHBvc3RvcmRlci4KKyAgdm9pZCB1cGRhdGVWYWx1ZU1hcChjb25zdCBWYWx1ZSAqSSwgdW5zaWduZWQgUmVnLCB1bnNpZ25lZCBOdW1SZWdzID0gMSk7CisKKyAgdW5zaWduZWQgY3JlYXRlUmVzdWx0UmVnKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKTsKKworICAvLy8gXGJyaWVmIFRyeSB0byBjb25zdHJhaW4gT3Agc28gdGhhdCBpdCBpcyB1c2FibGUgYnkgYXJndW1lbnQgT3BOdW0gb2YgdGhlCisgIC8vLyBwcm92aWRlZCBNQ0luc3RyRGVzYy4gSWYgdGhpcyBmYWlscywgY3JlYXRlIGEgbmV3IHZpcnR1YWwgcmVnaXN0ZXIgaW4gdGhlCisgIC8vLyBjb3JyZWN0IGNsYXNzIGFuZCBDT1BZIHRoZSB2YWx1ZSB0aGVyZS4KKyAgdW5zaWduZWQgY29uc3RyYWluT3BlcmFuZFJlZ0NsYXNzKGNvbnN0IE1DSW5zdHJEZXNjICZJSSwgdW5zaWduZWQgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcE51bSk7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgY29uc3RhbnQgaW4gYSByZWdpc3RlciB1c2luZyB0YXJnZXQtc3BlY2lmaWMgbG9naWMsIHN1Y2ggYXMKKyAgLy8vIGNvbnN0YW50IHBvb2wgbG9hZHMuCisgIHZpcnR1YWwgdW5zaWduZWQgZmFzdE1hdGVyaWFsaXplQ29uc3RhbnQoY29uc3QgQ29uc3RhbnQgKkMpIHsgcmV0dXJuIDA7IH0KKworICAvLy8gXGJyaWVmIEVtaXQgYW4gYWxsb2NhIGFkZHJlc3MgaW4gYSByZWdpc3RlciB1c2luZyB0YXJnZXQtc3BlY2lmaWMgbG9naWMuCisgIHZpcnR1YWwgdW5zaWduZWQgZmFzdE1hdGVyaWFsaXplQWxsb2NhKGNvbnN0IEFsbG9jYUluc3QgKkMpIHsgcmV0dXJuIDA7IH0KKworICAvLy8gXGJyaWVmIEVtaXQgdGhlIGZsb2F0aW5nLXBvaW50IGNvbnN0YW50ICswLjAgaW4gYSByZWdpc3RlciB1c2luZyB0YXJnZXQtCisgIC8vLyBzcGVjaWZpYyBsb2dpYy4KKyAgdmlydHVhbCB1bnNpZ25lZCBmYXN0TWF0ZXJpYWxpemVGbG9hdFplcm8oY29uc3QgQ29uc3RhbnRGUCAqQ0YpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ2hlY2sgaWYgXGMgQWRkIGlzIGFuIGFkZCB0aGF0IGNhbiBiZSBzYWZlbHkgZm9sZGVkIGludG8gXGMgR0VQLgorICAvLy8KKyAgLy8vIFxjIEFkZCBjYW4gYmUgZm9sZGVkIGludG8gXGMgR0VQIGlmOgorICAvLy8gLSBcYyBBZGQgaXMgYW4gYWRkLAorICAvLy8gLSBcYyBBZGQncyBzaXplIG1hdGNoZXMgXGMgR0VQJ3MsCisgIC8vLyAtIFxjIEFkZCBpcyBpbiB0aGUgc2FtZSBiYXNpYyBibG9jayBhcyBcYyBHRVAsIGFuZAorICAvLy8gLSBcYyBBZGQgaGFzIGEgY29uc3RhbnQgb3BlcmFuZC4KKyAgYm9vbCBjYW5Gb2xkQWRkSW50b0dFUChjb25zdCBVc2VyICpHRVAsIGNvbnN0IFZhbHVlICpBZGQpOworCisgIC8vLyBcYnJpZWYgVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiB2YWx1ZSBoYXMgZXhhY3RseSBvbmUgdXNlLgorICBib29sIGhhc1RyaXZpYWxLaWxsKGNvbnN0IFZhbHVlICpWKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIG1hY2hpbmUgbWVtIG9wZXJhbmQgZnJvbSB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVNZW1PcGVyYW5kICpjcmVhdGVNYWNoaW5lTWVtT3BlcmFuZEZvcihjb25zdCBJbnN0cnVjdGlvbiAqSSkgY29uc3Q7CisKKyAgQ21wSW5zdDo6UHJlZGljYXRlIG9wdGltaXplQ21wUHJlZGljYXRlKGNvbnN0IENtcEluc3QgKkNJKSBjb25zdDsKKworICBib29sIGxvd2VyQ2FsbFRvKGNvbnN0IENhbGxJbnN0ICpDSSwgTUNTeW1ib2wgKlN5bWJvbCwgdW5zaWduZWQgTnVtQXJncyk7CisgIGJvb2wgbG93ZXJDYWxsVG8oY29uc3QgQ2FsbEluc3QgKkNJLCBjb25zdCBjaGFyICpTeW1ib2xOYW1lLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUFyZ3MpOworICBib29sIGxvd2VyQ2FsbFRvKENhbGxMb3dlcmluZ0luZm8gJkNMSSk7CisKKyAgYm9vbCBpc0NvbW11dGF0aXZlSW50cmluc2ljKEludHJpbnNpY0luc3QgY29uc3QgKklJKSB7CisgICAgc3dpdGNoIChJSS0+Z2V0SW50cmluc2ljSUQoKSkgeworICAgIGNhc2UgSW50cmluc2ljOjpzYWRkX3dpdGhfb3ZlcmZsb3c6CisgICAgY2FzZSBJbnRyaW5zaWM6OnVhZGRfd2l0aF9vdmVyZmxvdzoKKyAgICBjYXNlIEludHJpbnNpYzo6c211bF93aXRoX292ZXJmbG93OgorICAgIGNhc2UgSW50cmluc2ljOjp1bXVsX3dpdGhfb3ZlcmZsb3c6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIGJvb2wgbG93ZXJDYWxsKGNvbnN0IENhbGxJbnN0ICpJKTsKKyAgLy8vIFxicmllZiBTZWxlY3QgYW5kIGVtaXQgY29kZSBmb3IgYSBiaW5hcnkgb3BlcmF0b3IgaW5zdHJ1Y3Rpb24sIHdoaWNoIGhhcworICAvLy8gYW4gb3Bjb2RlIHdoaWNoIGRpcmVjdGx5IGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBJU0Qgb3Bjb2RlLgorICBib29sIHNlbGVjdEJpbmFyeU9wKGNvbnN0IFVzZXIgKkksIHVuc2lnbmVkIElTRE9wY29kZSk7CisgIGJvb2wgc2VsZWN0Rk5lZyhjb25zdCBVc2VyICpJKTsKKyAgYm9vbCBzZWxlY3RHZXRFbGVtZW50UHRyKGNvbnN0IFVzZXIgKkkpOworICBib29sIHNlbGVjdFN0YWNrbWFwKGNvbnN0IENhbGxJbnN0ICpJKTsKKyAgYm9vbCBzZWxlY3RQYXRjaHBvaW50KGNvbnN0IENhbGxJbnN0ICpJKTsKKyAgYm9vbCBzZWxlY3RDYWxsKGNvbnN0IFVzZXIgKkNhbGwpOworICBib29sIHNlbGVjdEludHJpbnNpY0NhbGwoY29uc3QgSW50cmluc2ljSW5zdCAqSUkpOworICBib29sIHNlbGVjdEJpdENhc3QoY29uc3QgVXNlciAqSSk7CisgIGJvb2wgc2VsZWN0Q2FzdChjb25zdCBVc2VyICpJLCB1bnNpZ25lZCBPcGNvZGUpOworICBib29sIHNlbGVjdEV4dHJhY3RWYWx1ZShjb25zdCBVc2VyICpJKTsKKyAgYm9vbCBzZWxlY3RJbnNlcnRWYWx1ZShjb25zdCBVc2VyICpJKTsKKyAgYm9vbCBzZWxlY3RYUmF5Q3VzdG9tRXZlbnQoY29uc3QgQ2FsbEluc3QgKklJKTsKKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBIYW5kbGUgUEhJIG5vZGVzIGluIHN1Y2Nlc3NvciBibG9ja3MuCisgIC8vLworICAvLy8gRW1pdCBjb2RlIHRvIGVuc3VyZSBjb25zdGFudHMgYXJlIGNvcGllZCBpbnRvIHJlZ2lzdGVycyB3aGVuIG5lZWRlZC4KKyAgLy8vIFJlbWVtYmVyIHRoZSB2aXJ0dWFsIHJlZ2lzdGVycyB0aGF0IG5lZWQgdG8gYmUgYWRkZWQgdG8gdGhlIE1hY2hpbmUgUEhJCisgIC8vLyBub2RlcyBhcyBpbnB1dC4gIFdlIGNhbm5vdCBqdXN0IGRpcmVjdGx5IGFkZCB0aGVtLCBiZWNhdXNlIGV4cGFuc2lvbiBtaWdodAorICAvLy8gcmVzdWx0IGluIG11bHRpcGxlIE1CQidzIGZvciBvbmUgQkIuICBBcyBzdWNoLCB0aGUgc3RhcnQgb2YgdGhlIEJCIG1pZ2h0CisgIC8vLyBjb3JyZXNwb25kIHRvIGEgZGlmZmVyZW50IE1CQiB0aGFuIHRoZSBlbmQuCisgIGJvb2wgaGFuZGxlUEhJTm9kZXNJblN1Y2Nlc3NvckJsb2Nrcyhjb25zdCBCYXNpY0Jsb2NrICpMTFZNQkIpOworCisgIC8vLyBcYnJpZWYgSGVscGVyIGZvciBtYXRlcmlhbGl6ZVJlZ0ZvclZhbHVlIHRvIG1hdGVyaWFsaXplIGEgY29uc3RhbnQgaW4gYQorICAvLy8gdGFyZ2V0LWluZGVwZW5kZW50IHdheS4KKyAgdW5zaWduZWQgbWF0ZXJpYWxpemVDb25zdGFudChjb25zdCBWYWx1ZSAqViwgTVZUIFZUKTsKKworICAvLy8gXGJyaWVmIEhlbHBlciBmb3IgZ2V0UmVnRm9yVmFsZS4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB0aGUgdmFsdWUKKyAgLy8vIGlzbid0IGFscmVhZHkgYXZhaWxhYmxlIGluIGEgcmVnaXN0ZXIgYW5kIG11c3QgYmUgbWF0ZXJpYWxpemVkIHdpdGggbmV3CisgIC8vLyBpbnN0cnVjdGlvbnMuCisgIHVuc2lnbmVkIG1hdGVyaWFsaXplUmVnRm9yVmFsdWUoY29uc3QgVmFsdWUgKlYsIE1WVCBWVCk7CisKKyAgLy8vIFxicmllZiBDbGVhcnMgTG9jYWxWYWx1ZU1hcCBhbmQgbW92ZXMgdGhlIGFyZWEgZm9yIHRoZSBuZXcgbG9jYWwgdmFyaWFibGVzCisgIC8vLyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBibG9jay4gSXQgaGVscHMgdG8gYXZvaWQgc3BpbGxpbmcgY2FjaGVkIHZhcmlhYmxlcworICAvLy8gYWNyb3NzIGhlYXZ5IGluc3RydWN0aW9ucyBsaWtlIGNhbGxzLgorICB2b2lkIGZsdXNoTG9jYWxWYWx1ZU1hcCgpOworCisgIC8vLyBcYnJpZWYgUmVtb3ZlcyBkZWFkIGxvY2FsIHZhbHVlIGluc3RydWN0aW9ucyBhZnRlciBTYXZlZExhc3RMb2NhbHZhbHVlLgorICB2b2lkIHJlbW92ZURlYWRMb2NhbFZhbHVlQ29kZShNYWNoaW5lSW5zdHIgKlNhdmVkTGFzdExvY2FsVmFsdWUpOworCisgIHN0cnVjdCBJbnN0T3JkZXJNYXAgeworICAgIERlbnNlTWFwPE1hY2hpbmVJbnN0ciAqLCB1bnNpZ25lZD4gT3JkZXJzOworICAgIE1hY2hpbmVJbnN0ciAqRmlyc3RUZXJtaW5hdG9yID0gbnVsbHB0cjsKKyAgICB1bnNpZ25lZCBGaXJzdFRlcm1pbmF0b3JPcmRlciA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKTsKKworICAgIHZvaWQgaW5pdGlhbGl6ZShNYWNoaW5lQmFzaWNCbG9jayAqTUJCKTsKKyAgfTsKKworICAvLy8gU2lua3MgdGhlIGxvY2FsIHZhbHVlIG1hdGVyaWFsaXphdGlvbiBpbnN0cnVjdGlvbiBMb2NhbE1JIHRvIGl0cyBmaXJzdCB1c2UKKyAgLy8vIGluIHRoZSBiYXNpYyBibG9jaywgb3IgZGVsZXRlcyBpdCBpZiBpdCBpcyBub3QgdXNlZC4KKyAgdm9pZCBzaW5rTG9jYWxWYWx1ZU1hdGVyaWFsaXphdGlvbihNYWNoaW5lSW5zdHIgJkxvY2FsTUksIHVuc2lnbmVkIERlZlJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0T3JkZXJNYXAgJk9yZGVyTWFwKTsKKworICAvLy8gXGJyaWVmIEluc2VydGlvbiBwb2ludCBiZWZvcmUgdHJ5aW5nIHRvIHNlbGVjdCB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4KKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFNhdmVkSW5zZXJ0UHQ7CisKKyAgLy8vIFxicmllZiBBZGQgYSBzdGFja21hcCBvciBwYXRjaHBvaW50IGludHJpbnNpYyBjYWxsJ3MgbGl2ZSB2YXJpYWJsZQorICAvLy8gb3BlcmFuZHMgdG8gYSBzdGFja21hcCBvciBwYXRjaHBvaW50IG1hY2hpbmUgaW5zdHJ1Y3Rpb24uCisgIGJvb2wgYWRkU3RhY2tNYXBMaXZlVmFycyhTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYWxsSW5zdCAqQ0ksIHVuc2lnbmVkIFN0YXJ0SWR4KTsKKyAgYm9vbCBsb3dlckNhbGxPcGVyYW5kcyhjb25zdCBDYWxsSW5zdCAqQ0ksIHVuc2lnbmVkIEFyZ0lkeCwgdW5zaWduZWQgTnVtQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZSAqQ2FsbGVlLCBib29sIEZvcmNlUmV0Vm9pZFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxMb3dlcmluZ0luZm8gJkNMSSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0ZBU1RJU0VMX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9GYXVsdE1hcHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9GYXVsdE1hcHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NWUyNWM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0ZhdWx0TWFwcy5oCkBAIC0wLDAgKzEsMjE4IEBACisvLz09PS0gRmF1bHRNYXBzLmggLSBUaGUgIkZhdWx0TWFwcyIgc2VjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9GQVVMVE1BUFNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fRkFVTFRNQVBTX0gKKworI2luY2x1ZGUgImxsdm0vTUMvTUNTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBc21QcmludGVyOworY2xhc3MgTUNFeHByOworY2xhc3MgcmF3X29zdHJlYW07CisKK2NsYXNzIEZhdWx0TWFwcyB7CitwdWJsaWM6CisgIGVudW0gRmF1bHRLaW5kIHsKKyAgICBGYXVsdGluZ0xvYWQgPSAxLAorICAgIEZhdWx0aW5nTG9hZFN0b3JlLAorICAgIEZhdWx0aW5nU3RvcmUsCisgICAgRmF1bHRLaW5kTWF4CisgIH07CisKKyAgZXhwbGljaXQgRmF1bHRNYXBzKEFzbVByaW50ZXIgJkFQKTsKKworICBzdGF0aWMgY29uc3QgY2hhciAqZmF1bHRUeXBlVG9TdHJpbmcoRmF1bHRLaW5kKTsKKworICB2b2lkIHJlY29yZEZhdWx0aW5nT3AoRmF1bHRLaW5kIEZhdWx0VHksIGNvbnN0IE1DU3ltYm9sICpIYW5kbGVyTGFiZWwpOworICB2b2lkIHNlcmlhbGl6ZVRvRmF1bHRNYXBTZWN0aW9uKCk7CisgIHZvaWQgcmVzZXQoKSB7CisgICAgRnVuY3Rpb25JbmZvcy5jbGVhcigpOworICB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyBjb25zdCBjaGFyICpXRk1QOworCisgIHN0cnVjdCBGYXVsdEluZm8geworICAgIEZhdWx0S2luZCBLaW5kID0gRmF1bHRLaW5kTWF4OworICAgIGNvbnN0IE1DRXhwciAqRmF1bHRpbmdPZmZzZXRFeHByID0gbnVsbHB0cjsKKyAgICBjb25zdCBNQ0V4cHIgKkhhbmRsZXJPZmZzZXRFeHByID0gbnVsbHB0cjsKKworICAgIEZhdWx0SW5mbygpID0gZGVmYXVsdDsKKworICAgIGV4cGxpY2l0IEZhdWx0SW5mbyhGYXVsdE1hcHM6OkZhdWx0S2luZCBLaW5kLCBjb25zdCBNQ0V4cHIgKkZhdWx0aW5nT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0V4cHIgKkhhbmRsZXJPZmZzZXQpCisgICAgICAgIDogS2luZChLaW5kKSwgRmF1bHRpbmdPZmZzZXRFeHByKEZhdWx0aW5nT2Zmc2V0KSwKKyAgICAgICAgICBIYW5kbGVyT2Zmc2V0RXhwcihIYW5kbGVyT2Zmc2V0KSB7fQorICB9OworCisgIHVzaW5nIEZ1bmN0aW9uRmF1bHRJbmZvcyA9IHN0ZDo6dmVjdG9yPEZhdWx0SW5mbz47CisKKyAgLy8gV2UnZCBsaWtlIHRvIGtlZXAgYSBzdGFibGUgaXRlcmF0aW9uIG9yZGVyIGZvciBGdW5jdGlvbkluZm9zIHRvIGhlbHAKKyAgLy8gRmlsZUNoZWNrIGJhc2VkIHRlc3RpbmcuCisgIHN0cnVjdCBNQ1N5bWJvbENvbXBhcmF0b3IgeworICAgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBNQ1N5bWJvbCAqTEhTLCBjb25zdCBNQ1N5bWJvbCAqUkhTKSBjb25zdCB7CisgICAgICByZXR1cm4gTEhTLT5nZXROYW1lKCkgPCBSSFMtPmdldE5hbWUoKTsKKyAgICB9CisgIH07CisKKyAgc3RkOjptYXA8Y29uc3QgTUNTeW1ib2wgKiwgRnVuY3Rpb25GYXVsdEluZm9zLCBNQ1N5bWJvbENvbXBhcmF0b3I+CisgICAgICBGdW5jdGlvbkluZm9zOworICBBc21QcmludGVyICZBUDsKKworICB2b2lkIGVtaXRGdW5jdGlvbkluZm8oY29uc3QgTUNTeW1ib2wgKkZuTGFiZWwsIGNvbnN0IEZ1bmN0aW9uRmF1bHRJbmZvcyAmRkZJKTsKK307CisKKy8vLyBBIHBhcnNlciBmb3IgdGhlIF9fbGx2bV9mYXVsdG1hcHMgc2VjdGlvbiBnZW5lcmF0ZWQgYnkgdGhlIEZhdWx0TWFwcyBjbGFzcworLy8vIGFib3ZlLiAgVGhpcyBwYXJzZXIgaXMgdmVyc2lvbiBsb2NrZWQgd2l0aCB3aXRoIHRoZSBfX2xsdm1fZmF1bHRtYXBzIHNlY3Rpb24KKy8vLyBnZW5lcmF0ZWQgYnkgdGhlIHZlcnNpb24gb2YgTExWTSB0aGF0IGluY2x1ZGVzIGl0LiAgTm8gZ3VhcmFudGVlcyBhcmUgbWFkZQorLy8vIHdpdGggcmVzcGVjdCB0byBmb3J3YXJkIG9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCitjbGFzcyBGYXVsdE1hcFBhcnNlciB7CisgIHVzaW5nIEZhdWx0TWFwVmVyc2lvblR5cGUgPSB1aW50OF90OworICB1c2luZyBSZXNlcnZlZDBUeXBlID0gdWludDhfdDsKKyAgdXNpbmcgUmVzZXJ2ZWQxVHlwZSA9IHVpbnQxNl90OworICB1c2luZyBOdW1GdW5jdGlvbnNUeXBlID0gdWludDMyX3Q7CisKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBGYXVsdE1hcFZlcnNpb25PZmZzZXQgPSAwOworICBzdGF0aWMgY29uc3Qgc2l6ZV90IFJlc2VydmVkME9mZnNldCA9CisgICAgICBGYXVsdE1hcFZlcnNpb25PZmZzZXQgKyBzaXplb2YoRmF1bHRNYXBWZXJzaW9uVHlwZSk7CisgIHN0YXRpYyBjb25zdCBzaXplX3QgUmVzZXJ2ZWQxT2Zmc2V0ID0gUmVzZXJ2ZWQwT2Zmc2V0ICsgc2l6ZW9mKFJlc2VydmVkMFR5cGUpOworICBzdGF0aWMgY29uc3Qgc2l6ZV90IE51bUZ1bmN0aW9uc09mZnNldCA9CisgICAgICBSZXNlcnZlZDFPZmZzZXQgKyBzaXplb2YoUmVzZXJ2ZWQxVHlwZSk7CisgIHN0YXRpYyBjb25zdCBzaXplX3QgRnVuY3Rpb25JbmZvc09mZnNldCA9CisgICAgICBOdW1GdW5jdGlvbnNPZmZzZXQgKyBzaXplb2YoTnVtRnVuY3Rpb25zVHlwZSk7CisKKyAgY29uc3QgdWludDhfdCAqUDsKKyAgY29uc3QgdWludDhfdCAqRTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RhdGljIFQgcmVhZChjb25zdCB1aW50OF90ICpQLCBjb25zdCB1aW50OF90ICpFKSB7CisgICAgYXNzZXJ0KFAgKyBzaXplb2YoVCkgPD0gRSAmJiAib3V0IG9mIGJvdW5kcyByZWFkISIpOworICAgIHJldHVybiBzdXBwb3J0OjplbmRpYW46OnJlYWQ8VCwgc3VwcG9ydDo6bGl0dGxlLCAxPihQKTsKKyAgfQorCitwdWJsaWM6CisgIGNsYXNzIEZ1bmN0aW9uRmF1bHRJbmZvQWNjZXNzb3IgeworICAgIHVzaW5nIEZhdWx0S2luZFR5cGUgPSB1aW50MzJfdDsKKyAgICB1c2luZyBGYXVsdGluZ1BDT2Zmc2V0VHlwZSA9IHVpbnQzMl90OworICAgIHVzaW5nIEhhbmRsZXJQQ09mZnNldFR5cGUgPSB1aW50MzJfdDsKKworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgRmF1bHRLaW5kT2Zmc2V0ID0gMDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IEZhdWx0aW5nUENPZmZzZXRPZmZzZXQgPQorICAgICAgICBGYXVsdEtpbmRPZmZzZXQgKyBzaXplb2YoRmF1bHRLaW5kVHlwZSk7CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBIYW5kbGVyUENPZmZzZXRPZmZzZXQgPQorICAgICAgICBGYXVsdGluZ1BDT2Zmc2V0T2Zmc2V0ICsgc2l6ZW9mKEZhdWx0aW5nUENPZmZzZXRUeXBlKTsKKworICAgIGNvbnN0IHVpbnQ4X3QgKlA7CisgICAgY29uc3QgdWludDhfdCAqRTsKKworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IHNpemVfdCBTaXplID0KKyAgICAgICAgSGFuZGxlclBDT2Zmc2V0T2Zmc2V0ICsgc2l6ZW9mKEhhbmRsZXJQQ09mZnNldFR5cGUpOworCisgICAgZXhwbGljaXQgRnVuY3Rpb25GYXVsdEluZm9BY2Nlc3Nvcihjb25zdCB1aW50OF90ICpQLCBjb25zdCB1aW50OF90ICpFKQorICAgICAgICA6IFAoUCksIEUoRSkge30KKworICAgIEZhdWx0S2luZFR5cGUgZ2V0RmF1bHRLaW5kKCkgY29uc3QgeworICAgICAgcmV0dXJuIHJlYWQ8RmF1bHRLaW5kVHlwZT4oUCArIEZhdWx0S2luZE9mZnNldCwgRSk7CisgICAgfQorCisgICAgRmF1bHRpbmdQQ09mZnNldFR5cGUgZ2V0RmF1bHRpbmdQQ09mZnNldCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiByZWFkPEZhdWx0aW5nUENPZmZzZXRUeXBlPihQICsgRmF1bHRpbmdQQ09mZnNldE9mZnNldCwgRSk7CisgICAgfQorCisgICAgSGFuZGxlclBDT2Zmc2V0VHlwZSBnZXRIYW5kbGVyUENPZmZzZXQoKSBjb25zdCB7CisgICAgICByZXR1cm4gcmVhZDxIYW5kbGVyUENPZmZzZXRUeXBlPihQICsgSGFuZGxlclBDT2Zmc2V0T2Zmc2V0LCBFKTsKKyAgICB9CisgIH07CisKKyAgY2xhc3MgRnVuY3Rpb25JbmZvQWNjZXNzb3IgeworICAgIHVzaW5nIEZ1bmN0aW9uQWRkclR5cGUgPSB1aW50NjRfdDsKKyAgICB1c2luZyBOdW1GYXVsdGluZ1BDc1R5cGUgPSB1aW50MzJfdDsKKyAgICB1c2luZyBSZXNlcnZlZFR5cGUgPSB1aW50MzJfdDsKKworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgRnVuY3Rpb25BZGRyT2Zmc2V0ID0gMDsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IE51bUZhdWx0aW5nUENzT2Zmc2V0ID0KKyAgICAgICAgRnVuY3Rpb25BZGRyT2Zmc2V0ICsgc2l6ZW9mKEZ1bmN0aW9uQWRkclR5cGUpOworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgUmVzZXJ2ZWRPZmZzZXQgPQorICAgICAgICBOdW1GYXVsdGluZ1BDc09mZnNldCArIHNpemVvZihOdW1GYXVsdGluZ1BDc1R5cGUpOworICAgIHN0YXRpYyBjb25zdCBzaXplX3QgRnVuY3Rpb25GYXVsdEluZm9zT2Zmc2V0ID0KKyAgICAgICAgUmVzZXJ2ZWRPZmZzZXQgKyBzaXplb2YoUmVzZXJ2ZWRUeXBlKTsKKyAgICBzdGF0aWMgY29uc3Qgc2l6ZV90IEZ1bmN0aW9uSW5mb0hlYWRlclNpemUgPSBGdW5jdGlvbkZhdWx0SW5mb3NPZmZzZXQ7CisKKyAgICBjb25zdCB1aW50OF90ICpQID0gbnVsbHB0cjsKKyAgICBjb25zdCB1aW50OF90ICpFID0gbnVsbHB0cjsKKworICBwdWJsaWM6CisgICAgRnVuY3Rpb25JbmZvQWNjZXNzb3IoKSA9IGRlZmF1bHQ7CisKKyAgICBleHBsaWNpdCBGdW5jdGlvbkluZm9BY2Nlc3Nvcihjb25zdCB1aW50OF90ICpQLCBjb25zdCB1aW50OF90ICpFKQorICAgICAgICA6IFAoUCksIEUoRSkge30KKworICAgIEZ1bmN0aW9uQWRkclR5cGUgZ2V0RnVuY3Rpb25BZGRyKCkgY29uc3QgeworICAgICAgcmV0dXJuIHJlYWQ8RnVuY3Rpb25BZGRyVHlwZT4oUCArIEZ1bmN0aW9uQWRkck9mZnNldCwgRSk7CisgICAgfQorCisgICAgTnVtRmF1bHRpbmdQQ3NUeXBlIGdldE51bUZhdWx0aW5nUENzKCkgY29uc3QgeworICAgICAgcmV0dXJuIHJlYWQ8TnVtRmF1bHRpbmdQQ3NUeXBlPihQICsgTnVtRmF1bHRpbmdQQ3NPZmZzZXQsIEUpOworICAgIH0KKworICAgIEZ1bmN0aW9uRmF1bHRJbmZvQWNjZXNzb3IgZ2V0RnVuY3Rpb25GYXVsdEluZm9BdCh1aW50MzJfdCBJbmRleCkgY29uc3QgeworICAgICAgYXNzZXJ0KEluZGV4IDwgZ2V0TnVtRmF1bHRpbmdQQ3MoKSAmJiAiaW5kZXggb3V0IG9mIGJvdW5kcyEiKTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QgKkJlZ2luID0gUCArIEZ1bmN0aW9uRmF1bHRJbmZvc09mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uRmF1bHRJbmZvQWNjZXNzb3I6OlNpemUgKiBJbmRleDsKKyAgICAgIHJldHVybiBGdW5jdGlvbkZhdWx0SW5mb0FjY2Vzc29yKEJlZ2luLCBFKTsKKyAgICB9CisKKyAgICBGdW5jdGlvbkluZm9BY2Nlc3NvciBnZXROZXh0RnVuY3Rpb25JbmZvKCkgY29uc3QgeworICAgICAgc2l6ZV90IE15U2l6ZSA9IEZ1bmN0aW9uSW5mb0hlYWRlclNpemUgKworICAgICAgICAgICAgICAgICAgICAgIGdldE51bUZhdWx0aW5nUENzKCkgKiBGdW5jdGlvbkZhdWx0SW5mb0FjY2Vzc29yOjpTaXplOworCisgICAgICBjb25zdCB1aW50OF90ICpCZWdpbiA9IFAgKyBNeVNpemU7CisgICAgICBhc3NlcnQoQmVnaW4gPCBFICYmICJvdXQgb2YgYm91bmRzISIpOworICAgICAgcmV0dXJuIEZ1bmN0aW9uSW5mb0FjY2Vzc29yKEJlZ2luLCBFKTsKKyAgICB9CisgIH07CisKKyAgZXhwbGljaXQgRmF1bHRNYXBQYXJzZXIoY29uc3QgdWludDhfdCAqQmVnaW4sIGNvbnN0IHVpbnQ4X3QgKkVuZCkKKyAgICAgIDogUChCZWdpbiksIEUoRW5kKSB7fQorCisgIEZhdWx0TWFwVmVyc2lvblR5cGUgZ2V0RmF1bHRNYXBWZXJzaW9uKCkgY29uc3QgeworICAgIGF1dG8gVmVyc2lvbiA9IHJlYWQ8RmF1bHRNYXBWZXJzaW9uVHlwZT4oUCArIEZhdWx0TWFwVmVyc2lvbk9mZnNldCwgRSk7CisgICAgYXNzZXJ0KFZlcnNpb24gPT0gMSAmJiAib25seSB2ZXJzaW9uIDEgc3VwcG9ydGVkISIpOworICAgIHJldHVybiBWZXJzaW9uOworICB9CisKKyAgTnVtRnVuY3Rpb25zVHlwZSBnZXROdW1GdW5jdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlYWQ8TnVtRnVuY3Rpb25zVHlwZT4oUCArIE51bUZ1bmN0aW9uc09mZnNldCwgRSk7CisgIH0KKworICBGdW5jdGlvbkluZm9BY2Nlc3NvciBnZXRGaXJzdEZ1bmN0aW9uSW5mbygpIGNvbnN0IHsKKyAgICBjb25zdCB1aW50OF90ICpCZWdpbiA9IFAgKyBGdW5jdGlvbkluZm9zT2Zmc2V0OworICAgIHJldHVybiBGdW5jdGlvbkluZm9BY2Nlc3NvcihCZWdpbiwgRSk7CisgIH0KK307CisKK3Jhd19vc3RyZWFtICYKK29wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBGYXVsdE1hcFBhcnNlcjo6RnVuY3Rpb25GYXVsdEluZm9BY2Nlc3NvciAmKTsKKworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmF1bHRNYXBQYXJzZXI6OkZ1bmN0aW9uSW5mb0FjY2Vzc29yICYpOworCityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IEZhdWx0TWFwUGFyc2VyICYpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0ZBVUxUTUFQU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vRnVuY3Rpb25Mb3dlcmluZ0luZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9GdW5jdGlvbkxvd2VyaW5nSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkYTAwYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vRnVuY3Rpb25Mb3dlcmluZ0luZm8uaApAQCAtMCwwICsxLDMyNSBAQAorLy89PT0tIEZ1bmN0aW9uTG93ZXJpbmdJbmZvLmggLSBMb3dlciBmdW5jdGlvbnMgZnJvbSBMTFZNIElSIHRvIENvZGVHZW4gLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGltcGxlbWVudHMgcm91dGluZXMgZm9yIHRyYW5zbGF0aW5nIGZ1bmN0aW9ucyBmcm9tIExMVk0gSVIgaW50bworLy8gTWFjaGluZSBJUi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9GVU5DVElPTkxPV0VSSU5HSU5GT19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9GVU5DVElPTkxPV0VSSU5HSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSW5kZXhlZE1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9JU0RPcGNvZGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JUi9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Lbm93bkJpdHMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFyZ3VtZW50OworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIEJyYW5jaFByb2JhYmlsaXR5SW5mbzsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworY2xhc3MgTVZUOworY2xhc3MgU2VsZWN0aW9uREFHOworY2xhc3MgVGFyZ2V0TG93ZXJpbmc7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEZ1bmN0aW9uTG93ZXJpbmdJbmZvIC0gVGhpcyBjb250YWlucyBpbmZvcm1hdGlvbiB0aGF0IGlzIGdsb2JhbCB0byBhCisvLy8gZnVuY3Rpb24gdGhhdCBpcyB1c2VkIHdoZW4gbG93ZXJpbmcgYSByZWdpb24gb2YgdGhlIGZ1bmN0aW9uLgorLy8vCitjbGFzcyBGdW5jdGlvbkxvd2VyaW5nSW5mbyB7CitwdWJsaWM6CisgIGNvbnN0IEZ1bmN0aW9uICpGbjsKKyAgTWFjaGluZUZ1bmN0aW9uICpNRjsKKyAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgKlRMSTsKKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAqUmVnSW5mbzsKKyAgQnJhbmNoUHJvYmFiaWxpdHlJbmZvICpCUEk7CisgIC8vLyBDYW5Mb3dlclJldHVybiAtIHRydWUgaWZmIHRoZSBmdW5jdGlvbidzIHJldHVybiB2YWx1ZSBjYW4gYmUgbG93ZXJlZCB0bworICAvLy8gcmVnaXN0ZXJzLgorICBib29sIENhbkxvd2VyUmV0dXJuOworCisgIC8vLyBUcnVlIGlmIHBhcnQgb2YgdGhlIENTUnMgd2lsbCBiZSBoYW5kbGVkIHZpYSBleHBsaWNpdCBjb3BpZXMuCisgIGJvb2wgU3BsaXRDU1I7CisKKyAgLy8vIERlbW90ZVJlZ2lzdGVyIC0gaWYgQ2FuTG93ZXJSZXR1cm4gaXMgZmFsc2UsIERlbW90ZVJlZ2lzdGVyIGlzIGEgdnJlZworICAvLy8gYWxsb2NhdGVkIHRvIGhvbGQgYSBwb2ludGVyIHRvIHRoZSBoaWRkZW4gc3JldCBwYXJhbWV0ZXIuCisgIHVuc2lnbmVkIERlbW90ZVJlZ2lzdGVyOworCisgIC8vLyBNQkJNYXAgLSBBIG1hcHBpbmcgZnJvbSBMTFZNIGJhc2ljIGJsb2NrcyB0byB0aGVpciBtYWNoaW5lIGNvZGUgZW50cnkuCisgIERlbnNlTWFwPGNvbnN0IEJhc2ljQmxvY2sqLCBNYWNoaW5lQmFzaWNCbG9jayAqPiBNQkJNYXA7CisKKyAgLy8vIEEgbWFwIGZyb20gc3dpZnRlcnJvciB2YWx1ZSBpbiBhIGJhc2ljIGJsb2NrIHRvIHRoZSB2aXJ0dWFsIHJlZ2lzdGVyIGl0IGlzCisgIC8vLyBjdXJyZW50bHkgcmVwcmVzZW50ZWQgYnkuCisgIERlbnNlTWFwPHN0ZDo6cGFpcjxjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqLCBjb25zdCBWYWx1ZSAqPiwgdW5zaWduZWQ+CisgICAgICBTd2lmdEVycm9yVlJlZ0RlZk1hcDsKKworICAvLy8gQSBsaXN0IG9mIHVwd2FyZCBleHBvc2VkIHZyZWcgdXNlcyB0aGF0IG5lZWQgdG8gYmUgc2F0aXNmaWVkIGJ5IGVpdGhlciBhCisgIC8vLyBjb3B5IGRlZiBvciBhIHBoaSBub2RlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJhc2ljIGJsb2NrIHJlcHJlc2VudGluZworICAvLy8gdGhlIHByZWRlY2Vzc29yKHMpIHN3aWZ0ZXJyb3IgdmFsdWUuCisgIERlbnNlTWFwPHN0ZDo6cGFpcjxjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqLCBjb25zdCBWYWx1ZSAqPiwgdW5zaWduZWQ+CisgICAgICBTd2lmdEVycm9yVlJlZ1Vwd2FyZHNVc2U7CisKKyAgLy8vIEEgbWFwIGZyb20gaW5zdHJ1Y3Rpb25zIHRoYXQgZGVmaW5lL3VzZSBhIHN3aWZ0ZXJyb3IgdmFsdWUgdG8gdGhlIHZpcnR1YWwKKyAgLy8vIHJlZ2lzdGVyIHRoYXQgcmVwcmVzZW50cyB0aGF0IGRlZi91c2UuCisgIGxsdm06OkRlbnNlTWFwPFBvaW50ZXJJbnRQYWlyPGNvbnN0IEluc3RydWN0aW9uICosIDEsIGJvb2w+LCB1bnNpZ25lZD4KKyAgICAgIFN3aWZ0RXJyb3JWUmVnRGVmVXNlczsKKworICAvLy8gVGhlIHN3aWZ0ZXJyb3IgYXJndW1lbnQgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgIGNvbnN0IFZhbHVlICpTd2lmdEVycm9yQXJnOworCisgIHVzaW5nIFN3aWZ0RXJyb3JWYWx1ZXMgPSBTbWFsbFZlY3Rvcjxjb25zdCBWYWx1ZSosIDE+OworICAvLy8gQSBmdW5jdGlvbiBjYW4gb25seSBoYXZlIGEgc2luZ2xlIHN3aWZ0ZXJyb3IgYXJndW1lbnQuIEFuZCBpZiBpdCBkb2VzCisgIC8vLyBoYXZlIGEgc3dpZnRlcnJvciBhcmd1bWVudCwgaXQgbXVzdCBiZSB0aGUgZmlyc3QgZW50cnkgaW4KKyAgLy8vIFN3aWZ0RXJyb3JWYWxzLgorICBTd2lmdEVycm9yVmFsdWVzIFN3aWZ0RXJyb3JWYWxzOworCisgIC8vLyBHZXQgb3IgY3JlYXRlIHRoZSBzd2lmdGVycm9yIHZhbHVlIHZpcnR1YWwgcmVnaXN0ZXIgaW4KKyAgLy8vIFN3aWZ0RXJyb3JWUmVnRGVmTWFwIGZvciB0aGlzIGJhc2ljIGJsb2NrLgorICB1bnNpZ25lZCBnZXRPckNyZWF0ZVN3aWZ0RXJyb3JWUmVnKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKik7CisKKyAgLy8vIFNldCB0aGUgc3dpZnRlcnJvciB2aXJ0dWFsIHJlZ2lzdGVyIGluIHRoZSBTd2lmdEVycm9yVlJlZ0RlZk1hcCBmb3IgdGhpcworICAvLy8gYmFzaWMgYmxvY2suCisgIHZvaWQgc2V0Q3VycmVudFN3aWZ0RXJyb3JWUmVnKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsIGNvbnN0IFZhbHVlICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkKTsKKworICAvLy8gR2V0IG9yIGNyZWF0ZSB0aGUgc3dpZnRlcnJvciB2YWx1ZSB2aXJ0dWFsIHJlZ2lzdGVyIGZvciBhIGRlZiBvZiBhCisgIC8vLyBzd2lmdGVycm9yIGJ5IGFuIGluc3RydWN0aW9uLgorICBzdGQ6OnBhaXI8dW5zaWduZWQsIGJvb2w+IGdldE9yQ3JlYXRlU3dpZnRFcnJvclZSZWdEZWZBdChjb25zdCBJbnN0cnVjdGlvbiAqKTsKKyAgc3RkOjpwYWlyPHVuc2lnbmVkLCBib29sPgorICBnZXRPckNyZWF0ZVN3aWZ0RXJyb3JWUmVnVXNlQXQoY29uc3QgSW5zdHJ1Y3Rpb24gKiwgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICopOworCisgIC8vLyBWYWx1ZU1hcCAtIFNpbmNlIHdlIGVtaXQgY29kZSBmb3IgdGhlIGZ1bmN0aW9uIGEgYmFzaWMgYmxvY2sgYXQgYSB0aW1lLAorICAvLy8gd2UgbXVzdCByZW1lbWJlciB3aGljaCB2aXJ0dWFsIHJlZ2lzdGVycyBob2xkIHRoZSB2YWx1ZXMgZm9yCisgIC8vLyBjcm9zcy1iYXNpYy1ibG9jayB2YWx1ZXMuCisgIERlbnNlTWFwPGNvbnN0IFZhbHVlICosIHVuc2lnbmVkPiBWYWx1ZU1hcDsKKworICAvLy8gVmlydFJlZzJWYWx1ZSBtYXAgaXMgbmVlZGVkIGJ5IHRoZSBEaXZlcmdlbmNlIEFuYWx5c2lzIGRyaXZlbgorICAvLy8gaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uLiBJdCBpcyByZXZlcnRlZCBWYWx1ZU1hcC4gSXQgaXMgY29tcHV0ZWQKKyAgLy8vIGluIGxhenkgc3R5bGUgLSBvbiBkZW1hbmQuIEl0IGlzIHVzZWQgdG8gZ2V0IHRoZSBWYWx1ZSBjb3JyZXNwb25kaW5nCisgIC8vLyB0byB0aGUgbGl2ZSBpbiB2aXJ0dWFsIHJlZ2lzdGVyIGFuZCBpcyBjYWxsZWQgZnJvbSB0aGUKKyAgLy8vIFRhcmdldExvd2VyaW5JbmZvOjppc1NETm9kZVNvdXJjZU9mRGl2ZXJnZW5jZS4KKyAgRGVuc2VNYXA8dW5zaWduZWQsIGNvbnN0IFZhbHVlKj4gVmlydFJlZzJWYWx1ZTsKKworICAvLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGZyb20gVGFyZ2V0TG93ZXJpbkluZm86OmlzU0ROb2RlU291cmNlT2ZEaXZlcmdlbmNlCisgIC8vLyB0byBnZXQgdGhlIFZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGxpdmUtaW4gdmlydHVhbCByZWdpc3Rlci4KKyAgY29uc3QgVmFsdWUgKiBnZXRWYWx1ZUZyb21WaXJ0dWFsUmVnKHVuc2lnbmVkIFZyZWcpOworCisgIC8vLyBUcmFjayB2aXJ0dWFsIHJlZ2lzdGVycyBjcmVhdGVkIGZvciBleGNlcHRpb24gcG9pbnRlcnMuCisgIERlbnNlTWFwPGNvbnN0IFZhbHVlICosIHVuc2lnbmVkPiBDYXRjaFBhZEV4Y2VwdGlvblBvaW50ZXJzOworCisgIC8vLyBLZWVwIHRyYWNrIG9mIGZyYW1lIGluZGljZXMgYWxsb2NhdGVkIGZvciBzdGF0ZXBvaW50cyBhcyB0aGV5IGNvdWxkIGJlCisgIC8vLyB1c2VkIGFjcm9zcyBiYXNpYyBibG9jayBib3VuZGFyaWVzLiAgVGhpcyBzdHJ1Y3QgaXMgbW9yZSBjb21wbGV4IHRoYW4gYQorICAvLy8gc2ltcGxlIG1hcCBiZWNhdXNlIHRoZSBzdGF0ZW9waW50IGxvd2VyaW5nIGNvZGUgZGUtZHVwbGljYXRlcyBnYyBwb2ludGVycworICAvLy8gYmFzZWQgb24gdGhlaXIgU0RWYWx1ZSAoc28gJXAgYW5kIChiaXRjYXN0ICVwIHRvIFQpIHdpbGwgZ2V0IHRoZSBzYW1lCisgIC8vLyBzbG90KSwgYW5kIHdlIHRyYWNrIHRoYXQgaGVyZS4KKworICBzdHJ1Y3QgU3RhdGVwb2ludFNwaWxsTWFwIHsKKyAgICB1c2luZyBTbG90TWFwVHkgPSBEZW5zZU1hcDxjb25zdCBWYWx1ZSAqLCBPcHRpb25hbDxpbnQ+PjsKKworICAgIC8vLyBNYXBzIHVuaXF1ZWQgbGx2bSBJUiB2YWx1ZXMgdG8gdGhlIHNsb3RzIHRoZXkgd2VyZSBzcGlsbGVkIGluLiAgSWYgYQorICAgIC8vLyB2YWx1ZSBpcyBtYXBwZWQgdG8gTm9uZSBpdCBtZWFucyB3ZSB2aXNpdGVkIHRoZSB2YWx1ZSBidXQgZGlkbid0IHNwaWxsCisgICAgLy8vIGl0IChiZWNhdXNlIGl0IHdhcyBhIGNvbnN0YW50LCBmb3IgaW5zdGFuY2UpLgorICAgIFNsb3RNYXBUeSBTbG90TWFwOworCisgICAgLy8vIE1hcHMgbGx2bSBJUiB2YWx1ZXMgdG8gdGhlIHZhbHVlcyB0aGV5IHdlcmUgZGUtZHVwbGljYXRlZCB0by4KKyAgICBEZW5zZU1hcDxjb25zdCBWYWx1ZSAqLCBjb25zdCBWYWx1ZSAqPiBEdXBsaWNhdGVNYXA7CisKKyAgICBTbG90TWFwVHk6OmNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgVmFsdWUgKlYpIGNvbnN0IHsKKyAgICAgIGF1dG8gRHVwbEl0ID0gRHVwbGljYXRlTWFwLmZpbmQoVik7CisgICAgICBpZiAoRHVwbEl0ICE9IER1cGxpY2F0ZU1hcC5lbmQoKSkKKyAgICAgICAgViA9IER1cGxJdC0+c2Vjb25kOworICAgICAgcmV0dXJuIFNsb3RNYXAuZmluZChWKTsKKyAgICB9CisKKyAgICBTbG90TWFwVHk6OmNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIFNsb3RNYXAuZW5kKCk7IH0KKyAgfTsKKworICAvLy8gTWFwcyBnYy5zdGF0ZXBvaW50IGluc3RydWN0aW9ucyB0byB0aGVpciBjb3JyZXNwb25kaW5nIFN0YXRlcG9pbnRTcGlsbE1hcAorICAvLy8gaW5zdGFuY2VzLgorICBEZW5zZU1hcDxjb25zdCBJbnN0cnVjdGlvbiAqLCBTdGF0ZXBvaW50U3BpbGxNYXA+IFN0YXRlcG9pbnRTcGlsbE1hcHM7CisKKyAgLy8vIFN0YXRpY0FsbG9jYU1hcCAtIEtlZXAgdHJhY2sgb2YgZnJhbWUgaW5kaWNlcyBmb3IgZml4ZWQgc2l6ZWQgYWxsb2NhcyBpbgorICAvLy8gdGhlIGVudHJ5IGJsb2NrLiAgVGhpcyBhbGxvd3MgdGhlIGFsbG9jYXMgdG8gYmUgZWZmaWNpZW50bHkgcmVmZXJlbmNlZAorICAvLy8gYW55d2hlcmUgaW4gdGhlIGZ1bmN0aW9uLgorICBEZW5zZU1hcDxjb25zdCBBbGxvY2FJbnN0KiwgaW50PiBTdGF0aWNBbGxvY2FNYXA7CisKKyAgLy8vIEJ5VmFsQXJnRnJhbWVJbmRleE1hcCAtIEtlZXAgdHJhY2sgb2YgZnJhbWUgaW5kaWNlcyBmb3IgYnl2YWwgYXJndW1lbnRzLgorICBEZW5zZU1hcDxjb25zdCBBcmd1bWVudCosIGludD4gQnlWYWxBcmdGcmFtZUluZGV4TWFwOworCisgIC8vLyBBcmdEYmdWYWx1ZXMgLSBBIGxpc3Qgb2YgREJHX1ZBTFVFIGluc3RydWN0aW9ucyBjcmVhdGVkIGR1cmluZyBpc2VsIGZvcgorICAvLy8gZnVuY3Rpb24gYXJndW1lbnRzIHRoYXQgYXJlIGluc2VydGVkIGFmdGVyIHNjaGVkdWxpbmcgaXMgY29tcGxldGVkLgorICBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHIqLCA4PiBBcmdEYmdWYWx1ZXM7CisKKyAgLy8vIFJlZ0ZpeHVwcyAtIFJlZ2lzdGVycyB3aGljaCBuZWVkIHRvIGJlIHJlcGxhY2VkIGFmdGVyIGlzZWwgaXMgZG9uZS4KKyAgRGVuc2VNYXA8dW5zaWduZWQsIHVuc2lnbmVkPiBSZWdGaXh1cHM7CisKKyAgRGVuc2VTZXQ8dW5zaWduZWQ+IFJlZ3NXaXRoRml4dXBzOworCisgIC8vLyBTdGF0ZXBvaW50U3RhY2tTbG90cyAtIEEgbGlzdCBvZiB0ZW1wb3Jhcnkgc3RhY2sgc2xvdHMgKGZyYW1lIGluZGljZXMpCisgIC8vLyB1c2VkIHRvIHNwaWxsIHZhbHVlcyBhdCBhIHN0YXRlcG9pbnQuICBXZSBzdG9yZSB0aGVtIGhlcmUgdG8gZW5hYmxlCisgIC8vLyByZXVzZSBvZiB0aGUgc2FtZSBzdGFjayBzbG90cyBhY3Jvc3MgZGlmZmVyZW50IHN0YXRlcG9pbnRzIGluIGRpZmZlcmVudAorICAvLy8gYmFzaWMgYmxvY2tzLgorICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgNTA+IFN0YXRlcG9pbnRTdGFja1Nsb3RzOworCisgIC8vLyBNQkIgLSBUaGUgY3VycmVudCBibG9jay4KKyAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQjsKKworICAvLy8gTUJCIC0gVGhlIGN1cnJlbnQgaW5zZXJ0IHBvc2l0aW9uIGluc2lkZSB0aGUgY3VycmVudCBibG9jay4KKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEluc2VydFB0OworCisgIHN0cnVjdCBMaXZlT3V0SW5mbyB7CisgICAgdW5zaWduZWQgTnVtU2lnbkJpdHMgOiAzMTsKKyAgICB1bnNpZ25lZCBJc1ZhbGlkIDogMTsKKyAgICBLbm93bkJpdHMgS25vd24gPSAxOworCisgICAgTGl2ZU91dEluZm8oKSA6IE51bVNpZ25CaXRzKDApLCBJc1ZhbGlkKHRydWUpIHt9CisgIH07CisKKyAgLy8vIFJlY29yZCB0aGUgcHJlZmVycmVkIGV4dGVuZCB0eXBlIChJU0Q6OlNJR05fRVhURU5EIG9yIElTRDo6WkVST19FWFRFTkQpCisgIC8vLyBmb3IgYSB2YWx1ZS4KKyAgRGVuc2VNYXA8Y29uc3QgVmFsdWUgKiwgSVNEOjpOb2RlVHlwZT4gUHJlZmVycmVkRXh0ZW5kVHlwZTsKKworICAvLy8gVmlzaXRlZEJCcyAtIFRoZSBzZXQgb2YgYmFzaWMgYmxvY2tzIHZpc2l0ZWQgdGh1cyBmYXIgYnkgaW5zdHJ1Y3Rpb24KKyAgLy8vIHNlbGVjdGlvbi4KKyAgU21hbGxQdHJTZXQ8Y29uc3QgQmFzaWNCbG9jayosIDQ+IFZpc2l0ZWRCQnM7CisKKyAgLy8vIFBISU5vZGVzVG9VcGRhdGUgLSBBIGxpc3Qgb2YgcGhpIGluc3RydWN0aW9ucyB3aG9zZSBvcGVyYW5kIGxpc3Qgd2lsbAorICAvLy8gYmUgdXBkYXRlZCBhZnRlciBwcm9jZXNzaW5nIHRoZSBjdXJyZW50IGJhc2ljIGJsb2NrLgorICAvLy8gVE9ETzogVGhpcyBpc24ndCBwZXItZnVuY3Rpb24gc3RhdGUsIGl0J3MgcGVyLWJhc2ljLWJsb2NrIHN0YXRlLiBCdXQKKyAgLy8vIHRoZXJlJ3Mgbm8gb3RoZXIgY29udmVuaWVudCBwbGFjZSBmb3IgaXQgdG8gbGl2ZSByaWdodCBub3cuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxNYWNoaW5lSW5zdHIqLCB1bnNpZ25lZD4gPiBQSElOb2Rlc1RvVXBkYXRlOworICB1bnNpZ25lZCBPcmlnTnVtUEhJTm9kZXNUb1VwZGF0ZTsKKworICAvLy8gSWYgdGhlIGN1cnJlbnQgTUJCIGlzIGEgbGFuZGluZyBwYWQsIHRoZSBleGNlcHRpb24gcG9pbnRlciBhbmQgZXhjZXB0aW9uCisgIC8vLyBzZWxlY3RvciByZWdpc3RlcnMgYXJlIGNvcGllZCBpbnRvIHRoZXNlIHZpcnR1YWwgcmVnaXN0ZXJzIGJ5CisgIC8vLyBTZWxlY3Rpb25EQUdJU2VsOjpQcmVwYXJlRUhMYW5kaW5nUGFkKCkuCisgIHVuc2lnbmVkIEV4Y2VwdGlvblBvaW50ZXJWaXJ0UmVnLCBFeGNlcHRpb25TZWxlY3RvclZpcnRSZWc7CisKKyAgLy8vIHNldCAtIEluaXRpYWxpemUgdGhpcyBGdW5jdGlvbkxvd2VyaW5nSW5mbyB3aXRoIHRoZSBnaXZlbiBGdW5jdGlvbgorICAvLy8gYW5kIGl0cyBhc3NvY2lhdGVkIE1hY2hpbmVGdW5jdGlvbi4KKyAgLy8vCisgIHZvaWQgc2V0KGNvbnN0IEZ1bmN0aW9uICZGbiwgTWFjaGluZUZ1bmN0aW9uICZNRiwgU2VsZWN0aW9uREFHICpEQUcpOworCisgIC8vLyBjbGVhciAtIENsZWFyIG91dCBhbGwgdGhlIGZ1bmN0aW9uLXNwZWNpZmljIHN0YXRlLiBUaGlzIHJldHVybnMgdGhpcworICAvLy8gRnVuY3Rpb25Mb3dlcmluZ0luZm8gdG8gYW4gZW1wdHkgc3RhdGUsIHJlYWR5IHRvIGJlIHVzZWQgZm9yIGEKKyAgLy8vIGRpZmZlcmVudCBmdW5jdGlvbi4KKyAgdm9pZCBjbGVhcigpOworCisgIC8vLyBpc0V4cG9ydGVkSW5zdCAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdmFsdWUgaXMgYW4gaW5zdHJ1Y3Rpb24KKyAgLy8vIGV4cG9ydGVkIGZyb20gaXRzIGJsb2NrLgorICBib29sIGlzRXhwb3J0ZWRJbnN0KGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFZhbHVlTWFwLmNvdW50KFYpOworICB9CisKKyAgdW5zaWduZWQgQ3JlYXRlUmVnKE1WVCBWVCk7CisKKyAgdW5zaWduZWQgQ3JlYXRlUmVncyhUeXBlICpUeSk7CisKKyAgdW5zaWduZWQgSW5pdGlhbGl6ZVJlZ0ZvclZhbHVlKGNvbnN0IFZhbHVlICpWKSB7CisgICAgLy8gVG9rZW5zIG5ldmVyIGxpdmUgaW4gdnJlZ3MuCisgICAgaWYgKFYtPmdldFR5cGUoKS0+aXNUb2tlblR5KCkpCisgICAgICByZXR1cm4gMDsKKyAgICB1bnNpZ25lZCAmUiA9IFZhbHVlTWFwW1ZdOworICAgIGFzc2VydChSID09IDAgJiYgIkFscmVhZHkgaW5pdGlhbGl6ZWQgdGhpcyB2YWx1ZSByZWdpc3RlciEiKTsKKyAgICByZXR1cm4gUiA9IENyZWF0ZVJlZ3MoVi0+Z2V0VHlwZSgpKTsKKyAgfQorCisgIC8vLyBHZXRMaXZlT3V0UmVnSW5mbyAtIEdldHMgTGl2ZU91dEluZm8gZm9yIGEgcmVnaXN0ZXIsIHJldHVybmluZyBOVUxMIGlmIHRoZQorICAvLy8gcmVnaXN0ZXIgaXMgYSBQSEkgZGVzdGluYXRpb24gYW5kIHRoZSBQSEkncyBMaXZlT3V0SW5mbyBpcyBub3QgdmFsaWQuCisgIGNvbnN0IExpdmVPdXRJbmZvICpHZXRMaXZlT3V0UmVnSW5mbyh1bnNpZ25lZCBSZWcpIHsKKyAgICBpZiAoIUxpdmVPdXRSZWdJbmZvLmluQm91bmRzKFJlZykpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIGNvbnN0IExpdmVPdXRJbmZvICpMT0kgPSAmTGl2ZU91dFJlZ0luZm9bUmVnXTsKKyAgICBpZiAoIUxPSS0+SXNWYWxpZCkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgcmV0dXJuIExPSTsKKyAgfQorCisgIC8vLyBHZXRMaXZlT3V0UmVnSW5mbyAtIEdldHMgTGl2ZU91dEluZm8gZm9yIGEgcmVnaXN0ZXIsIHJldHVybmluZyBOVUxMIGlmIHRoZQorICAvLy8gcmVnaXN0ZXIgaXMgYSBQSEkgZGVzdGluYXRpb24gYW5kIHRoZSBQSEkncyBMaXZlT3V0SW5mbyBpcyBub3QgdmFsaWQuIElmCisgIC8vLyB0aGUgcmVnaXN0ZXIncyBMaXZlT3V0SW5mbyBpcyBmb3IgYSBzbWFsbGVyIGJpdCB3aWR0aCwgaXQgaXMgZXh0ZW5kZWQgdG8KKyAgLy8vIHRoZSBsYXJnZXIgYml0IHdpZHRoIGJ5IHplcm8gZXh0ZW5zaW9uLiBUaGUgYml0IHdpZHRoIG11c3QgYmUgbm8gc21hbGxlcgorICAvLy8gdGhhbiB0aGUgTGl2ZU91dEluZm8ncyBleGlzdGluZyBiaXQgd2lkdGguCisgIGNvbnN0IExpdmVPdXRJbmZvICpHZXRMaXZlT3V0UmVnSW5mbyh1bnNpZ25lZCBSZWcsIHVuc2lnbmVkIEJpdFdpZHRoKTsKKworICAvLy8gQWRkTGl2ZU91dFJlZ0luZm8gLSBBZGRzIExpdmVPdXRJbmZvIGZvciBhIHJlZ2lzdGVyLgorICB2b2lkIEFkZExpdmVPdXRSZWdJbmZvKHVuc2lnbmVkIFJlZywgdW5zaWduZWQgTnVtU2lnbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgS25vd25CaXRzICZLbm93bikgeworICAgIC8vIE9ubHkgaW5zdGFsbCB0aGlzIGluZm9ybWF0aW9uIGlmIGl0IHRlbGxzIHVzIHNvbWV0aGluZy4KKyAgICBpZiAoTnVtU2lnbkJpdHMgPT0gMSAmJiBLbm93bi5pc1Vua25vd24oKSkKKyAgICAgIHJldHVybjsKKworICAgIExpdmVPdXRSZWdJbmZvLmdyb3coUmVnKTsKKyAgICBMaXZlT3V0SW5mbyAmTE9JID0gTGl2ZU91dFJlZ0luZm9bUmVnXTsKKyAgICBMT0kuTnVtU2lnbkJpdHMgPSBOdW1TaWduQml0czsKKyAgICBMT0kuS25vd24uT25lID0gS25vd24uT25lOworICAgIExPSS5Lbm93bi5aZXJvID0gS25vd24uWmVybzsKKyAgfQorCisgIC8vLyBDb21wdXRlUEhJTGl2ZU91dFJlZ0luZm8gLSBDb21wdXRlIExpdmVPdXRJbmZvIGZvciBhIFBISSdzIGRlc3RpbmF0aW9uCisgIC8vLyByZWdpc3RlciBiYXNlZCBvbiB0aGUgTGl2ZU91dEluZm8gb2YgaXRzIG9wZXJhbmRzLgorICB2b2lkIENvbXB1dGVQSElMaXZlT3V0UmVnSW5mbyhjb25zdCBQSElOb2RlKik7CisKKyAgLy8vIEludmFsaWRhdGVQSElMaXZlT3V0UmVnSW5mbyAtIEludmFsaWRhdGVzIGEgUEhJJ3MgTGl2ZU91dEluZm8sIHRvIGJlCisgIC8vLyBjYWxsZWQgd2hlbiBhIGJsb2NrIGlzIHZpc2l0ZWQgYmVmb3JlIGFsbCBvZiBpdHMgcHJlZGVjZXNzb3JzLgorICB2b2lkIEludmFsaWRhdGVQSElMaXZlT3V0UmVnSW5mbyhjb25zdCBQSElOb2RlICpQTikgeworICAgIC8vIFBISXMgd2l0aCBubyB1c2VzIGhhdmUgbm8gVmFsdWVNYXAgZW50cnkuCisgICAgRGVuc2VNYXA8Y29uc3QgVmFsdWUqLCB1bnNpZ25lZD46OmNvbnN0X2l0ZXJhdG9yIEl0ID0gVmFsdWVNYXAuZmluZChQTik7CisgICAgaWYgKEl0ID09IFZhbHVlTWFwLmVuZCgpKQorICAgICAgcmV0dXJuOworCisgICAgdW5zaWduZWQgUmVnID0gSXQtPnNlY29uZDsKKyAgICBpZiAoUmVnID09IDApCisgICAgICByZXR1cm47CisKKyAgICBMaXZlT3V0UmVnSW5mby5ncm93KFJlZyk7CisgICAgTGl2ZU91dFJlZ0luZm9bUmVnXS5Jc1ZhbGlkID0gZmFsc2U7CisgIH0KKworICAvLy8gc2V0QXJndW1lbnRGcmFtZUluZGV4IC0gUmVjb3JkIGZyYW1lIGluZGV4IGZvciB0aGUgYnl2YWwKKyAgLy8vIGFyZ3VtZW50LgorICB2b2lkIHNldEFyZ3VtZW50RnJhbWVJbmRleChjb25zdCBBcmd1bWVudCAqQSwgaW50IEZJKTsKKworICAvLy8gZ2V0QXJndW1lbnRGcmFtZUluZGV4IC0gR2V0IGZyYW1lIGluZGV4IGZvciB0aGUgYnl2YWwgYXJndW1lbnQuCisgIGludCBnZXRBcmd1bWVudEZyYW1lSW5kZXgoY29uc3QgQXJndW1lbnQgKkEpOworCisgIHVuc2lnbmVkIGdldENhdGNoUGFkRXhjZXB0aW9uUG9pbnRlclZSZWcoY29uc3QgVmFsdWUgKkNQSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyk7CisKK3ByaXZhdGU6CisgIHZvaWQgYWRkU0VISGFuZGxlcnNGb3JMUGFkcyhBcnJheVJlZjxjb25zdCBMYW5kaW5nUGFkSW5zdCAqPiBMUGFkcyk7CisKKyAgLy8vIExpdmVPdXRSZWdJbmZvIC0gSW5mb3JtYXRpb24gYWJvdXQgbGl2ZSBvdXQgdnJlZ3MuCisgIEluZGV4ZWRNYXA8TGl2ZU91dEluZm8sIFZpcnRSZWcySW5kZXhGdW5jdG9yPiBMaXZlT3V0UmVnSW5mbzsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fRlVOQ1RJT05MT1dFUklOR0lORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dDTWV0YWRhdGEuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HQ01ldGFkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQyNTk5ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HQ01ldGFkYXRhLmgKQEAgLTAsMCArMSwyMDcgQEAKKy8vPT09LSBHQ01ldGFkYXRhLmggLSBHYXJiYWdlIGNvbGxlY3RvciBtZXRhZGF0YSAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBHQ0Z1bmN0aW9uSW5mbyBhbmQgR0NNb2R1bGVJbmZvIGNsYXNzZXMsIHdoaWNoIGFyZQorLy8gdXNlZCBhcyBhIGNvbW11bmljYXRpb24gY2hhbm5lbCBmcm9tIHRoZSB0YXJnZXQgY29kZSBnZW5lcmF0b3IgdG8gdGhlIHRhcmdldAorLy8gZ2FyYmFnZSBjb2xsZWN0b3JzLiBUaGlzIGludGVyZmFjZSBhbGxvd3MgY29kZSBnZW5lcmF0b3JzIGFuZCBnYXJiYWdlCisvLyBjb2xsZWN0b3JzIHRvIGJlIGRldmVsb3BlZCBpbmRlcGVuZGVudGx5LgorLy8KKy8vIFRoZSBHQ0Z1bmN0aW9uSW5mbyBjbGFzcyBsb2dzIHRoZSBkYXRhIG5lY2Vzc2FyeSB0byBidWlsZCBhIHR5cGUgYWNjdXJhdGUKKy8vIHN0YWNrIG1hcC4gVGhlIGNvZGUgZ2VuZXJhdG9yIG91dHB1dHM6CisvLworLy8gICAtIFNhZmUgcG9pbnRzIGFzIHNwZWNpZmllZCBieSB0aGUgR0NTdHJhdGVneSdzIE5lZWRlZFNhZmVQb2ludHMuCisvLyAgIC0gU3RhY2sgb2Zmc2V0cyBmb3IgR0Mgcm9vdHMsIGFzIHNwZWNpZmllZCBieSBjYWxscyB0byBsbHZtLmdjcm9vdAorLy8KKy8vIEFzIGEgcmVmaW5lbWVudCwgbGl2ZW5lc3MgYW5hbHlzaXMgY2FsY3VsYXRlcyB0aGUgc2V0IG9mIGxpdmUgcm9vdHMgYXQgZWFjaAorLy8gc2FmZSBwb2ludC4gTGl2ZW5lc3MgYW5hbHlzaXMgaXMgbm90IHByZXNlbnRseSBwZXJmb3JtZWQgYnkgdGhlIGNvZGUKKy8vIGdlbmVyYXRvciwgc28gYWxsIHJvb3RzIGFyZSBhc3N1bWVkIGxpdmUuCisvLworLy8gR0NNb2R1bGVJbmZvIHNpbXBseSBjb2xsZWN0cyBHQ0Z1bmN0aW9uSW5mbyBpbnN0YW5jZXMgZm9yIGVhY2ggRnVuY3Rpb24gYXMKKy8vIHRoZXkgYXJlIGNvbXBpbGVkLiBUaGlzIGFjY3JldGlvbiBpcyBuZWNlc3NhcnkgZm9yIGNvbGxlY3RvcnMgd2hpY2ggbXVzdCBlbWl0CisvLyBhIHN0YWNrIG1hcCBmb3IgdGhlIGNvbXBpbGF0aW9uIHVuaXQgYXMgYSB3aG9sZS4gVGhlcmVmb3JlLCBHQ0Z1bmN0aW9uSW5mbworLy8gb3V0bGl2ZXMgdGhlIE1hY2hpbmVGdW5jdGlvbiBmcm9tIHdoaWNoIGl0IGlzIGRlcml2ZWQgYW5kIG11c3Qgbm90IHJlZmVyIHRvCisvLyBhbnkgY29kZSBnZW5lcmF0b3IgZGF0YSBzdHJ1Y3R1cmVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0dDTUVUQURBVEFfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fR0NNRVRBREFUQV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0dDU3RyYXRlZ3kuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RlYnVnTG9jLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIENvbnN0YW50OworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBNQ1N5bWJvbDsKKworLy8vIEdDUG9pbnQgLSBNZXRhZGF0YSBmb3IgYSBjb2xsZWN0b3Itc2FmZSBwb2ludCBpbiBtYWNoaW5lIGNvZGUuCisvLy8KK3N0cnVjdCBHQ1BvaW50IHsKKyAgR0M6OlBvaW50S2luZCBLaW5kOyAvLy88IFRoZSBraW5kIG9mIHRoZSBzYWZlIHBvaW50LgorICBNQ1N5bWJvbCAqTGFiZWw7ICAgIC8vLzwgQSBsYWJlbC4KKyAgRGVidWdMb2MgTG9jOworCisgIEdDUG9pbnQoR0M6OlBvaW50S2luZCBLLCBNQ1N5bWJvbCAqTCwgRGVidWdMb2MgREwpCisgICAgICA6IEtpbmQoSyksIExhYmVsKEwpLCBMb2Moc3RkOjptb3ZlKERMKSkge30KK307CisKKy8vLyBHQ1Jvb3QgLSBNZXRhZGF0YSBmb3IgYSBwb2ludGVyIHRvIGFuIG9iamVjdCBtYW5hZ2VkIGJ5IHRoZSBnYXJiYWdlCisvLy8gY29sbGVjdG9yLgorc3RydWN0IEdDUm9vdCB7CisgIGludCBOdW07ICAgICAgICAgICAgICAgICAgLy8vPCBVc3VhbGx5IGEgZnJhbWUgaW5kZXguCisgIGludCBTdGFja09mZnNldCA9IC0xOyAgICAgLy8vPCBPZmZzZXQgZnJvbSB0aGUgc3RhY2sgcG9pbnRlci4KKyAgY29uc3QgQ29uc3RhbnQgKk1ldGFkYXRhOyAvLy88IE1ldGFkYXRhIHN0cmFpZ2h0IGZyb20gdGhlIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHRvIGxsdm0uZ2Nyb290LgorCisgIEdDUm9vdChpbnQgTiwgY29uc3QgQ29uc3RhbnQgKk1EKSA6IE51bShOKSwgTWV0YWRhdGEoTUQpIHt9Cit9OworCisvLy8gR2FyYmFnZSBjb2xsZWN0aW9uIG1ldGFkYXRhIGZvciBhIHNpbmdsZSBmdW5jdGlvbi4gIEN1cnJlbnRseSwgdGhpcworLy8vIGluZm9ybWF0aW9uIG9ubHkgYXBwbGllcyB0byBHQ1N0cmF0ZWdpZXMgd2hpY2ggdXNlIEdDUm9vdC4KK2NsYXNzIEdDRnVuY3Rpb25JbmZvIHsKK3B1YmxpYzoKKyAgdXNpbmcgaXRlcmF0b3IgPSBzdGQ6OnZlY3RvcjxHQ1BvaW50Pjo6aXRlcmF0b3I7CisgIHVzaW5nIHJvb3RzX2l0ZXJhdG9yID0gc3RkOjp2ZWN0b3I8R0NSb290Pjo6aXRlcmF0b3I7CisgIHVzaW5nIGxpdmVfaXRlcmF0b3IgPSBzdGQ6OnZlY3RvcjxHQ1Jvb3Q+Ojpjb25zdF9pdGVyYXRvcjsKKworcHJpdmF0ZToKKyAgY29uc3QgRnVuY3Rpb24gJkY7CisgIEdDU3RyYXRlZ3kgJlM7CisgIHVpbnQ2NF90IEZyYW1lU2l6ZTsKKyAgc3RkOjp2ZWN0b3I8R0NSb290PiBSb290czsKKyAgc3RkOjp2ZWN0b3I8R0NQb2ludD4gU2FmZVBvaW50czsKKworICAvLyBGSVhNRTogTGl2ZW5lc3MuIEEgMkQgQml0VmVjdG9yLCBwZXJoYXBzPworICAvLworICAvLyAgIEJpdFZlY3RvciBMaXZlbmVzczsKKyAgLy8KKyAgLy8gICBib29sIGlzbGl2ZShpbnQgcG9pbnQsIGludCByb290KSA9CisgIC8vICAgICBMaXZlbmVzc1twb2ludCAqIFNhZmVQb2ludHMuc2l6ZSgpICsgcm9vdF0KKyAgLy8KKyAgLy8gVGhlIGJpdCB2ZWN0b3IgaXMgdGhlIG1vcmUgY29tcGFjdCByZXByZXNlbnRhdGlvbiB3aGVyZSA+My4yJSBvZiByb290cworICAvLyBhcmUgbGl2ZSBwZXIgc2FmZSBwb2ludCAoMS41JSBvbiA2NC1iaXQgaG9zdHMpLgorCitwdWJsaWM6CisgIEdDRnVuY3Rpb25JbmZvKGNvbnN0IEZ1bmN0aW9uICZGLCBHQ1N0cmF0ZWd5ICZTKTsKKyAgfkdDRnVuY3Rpb25JbmZvKCk7CisKKyAgLy8vIGdldEZ1bmN0aW9uIC0gUmV0dXJuIHRoZSBmdW5jdGlvbiB0byB3aGljaCB0aGlzIG1ldGFkYXRhIGFwcGxpZXMuCisgIGNvbnN0IEZ1bmN0aW9uICZnZXRGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIEY7IH0KKworICAvLy8gZ2V0U3RyYXRlZ3kgLSBSZXR1cm4gdGhlIEdDIHN0cmF0ZWd5IGZvciB0aGUgZnVuY3Rpb24uCisgIEdDU3RyYXRlZ3kgJmdldFN0cmF0ZWd5KCkgeyByZXR1cm4gUzsgfQorCisgIC8vLyBhZGRTdGFja1Jvb3QgLSBSZWdpc3RlcnMgYSByb290IHRoYXQgbGl2ZXMgb24gdGhlIHN0YWNrLiBOdW0gaXMgdGhlCisgIC8vLyAgICAgICAgICAgICAgICBzdGFjayBvYmplY3QgSUQgZm9yIHRoZSBhbGxvY2EgKGlmIHRoZSBjb2RlIGdlbmVyYXRvciBpcworICAvLyAgICAgICAgICAgICAgICAgdXNpbmcgIE1hY2hpbmVGcmFtZUluZm8pLgorICB2b2lkIGFkZFN0YWNrUm9vdChpbnQgTnVtLCBjb25zdCBDb25zdGFudCAqTWV0YWRhdGEpIHsKKyAgICBSb290cy5wdXNoX2JhY2soR0NSb290KE51bSwgTWV0YWRhdGEpKTsKKyAgfQorCisgIC8vLyByZW1vdmVTdGFja1Jvb3QgLSBSZW1vdmVzIGEgcm9vdC4KKyAgcm9vdHNfaXRlcmF0b3IgcmVtb3ZlU3RhY2tSb290KHJvb3RzX2l0ZXJhdG9yIHBvc2l0aW9uKSB7CisgICAgcmV0dXJuIFJvb3RzLmVyYXNlKHBvc2l0aW9uKTsKKyAgfQorCisgIC8vLyBhZGRTYWZlUG9pbnQgLSBOb3RlcyB0aGUgZXhpc3RlbmNlIG9mIGEgc2FmZSBwb2ludC4gTnVtIGlzIHRoZSBJRCBvZiB0aGUKKyAgLy8vIGxhYmVsIGp1c3QgcHJpb3IgdG8gdGhlIHNhZmUgcG9pbnQgKGlmIHRoZSBjb2RlIGdlbmVyYXRvciBpcyB1c2luZworICAvLy8gTWFjaGluZU1vZHVsZUluZm8pLgorICB2b2lkIGFkZFNhZmVQb2ludChHQzo6UG9pbnRLaW5kIEtpbmQsIE1DU3ltYm9sICpMYWJlbCwgY29uc3QgRGVidWdMb2MgJkRMKSB7CisgICAgU2FmZVBvaW50cy5lbXBsYWNlX2JhY2soS2luZCwgTGFiZWwsIERMKTsKKyAgfQorCisgIC8vLyBnZXRGcmFtZVNpemUvc2V0RnJhbWVTaXplIC0gUmVjb3JkcyB0aGUgZnVuY3Rpb24ncyBmcmFtZSBzaXplLgorICB1aW50NjRfdCBnZXRGcmFtZVNpemUoKSBjb25zdCB7IHJldHVybiBGcmFtZVNpemU7IH0KKyAgdm9pZCBzZXRGcmFtZVNpemUodWludDY0X3QgUykgeyBGcmFtZVNpemUgPSBTOyB9CisKKyAgLy8vIGJlZ2luL2VuZCAtIEl0ZXJhdG9ycyBmb3Igc2FmZSBwb2ludHMuCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gU2FmZVBvaW50cy5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIFNhZmVQb2ludHMuZW5kKCk7IH0KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBTYWZlUG9pbnRzLnNpemUoKTsgfQorCisgIC8vLyByb290c19iZWdpbi9yb290c19lbmQgLSBJdGVyYXRvcnMgZm9yIGFsbCByb290cyBpbiB0aGUgZnVuY3Rpb24uCisgIHJvb3RzX2l0ZXJhdG9yIHJvb3RzX2JlZ2luKCkgeyByZXR1cm4gUm9vdHMuYmVnaW4oKTsgfQorICByb290c19pdGVyYXRvciByb290c19lbmQoKSB7IHJldHVybiBSb290cy5lbmQoKTsgfQorICBzaXplX3Qgcm9vdHNfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFJvb3RzLnNpemUoKTsgfQorCisgIC8vLyBsaXZlX2JlZ2luL2xpdmVfZW5kIC0gSXRlcmF0b3JzIGZvciBsaXZlIHJvb3RzIGF0IGEgZ2l2ZW4gc2FmZSBwb2ludC4KKyAgbGl2ZV9pdGVyYXRvciBsaXZlX2JlZ2luKGNvbnN0IGl0ZXJhdG9yICZwKSB7IHJldHVybiByb290c19iZWdpbigpOyB9CisgIGxpdmVfaXRlcmF0b3IgbGl2ZV9lbmQoY29uc3QgaXRlcmF0b3IgJnApIHsgcmV0dXJuIHJvb3RzX2VuZCgpOyB9CisgIHNpemVfdCBsaXZlX3NpemUoY29uc3QgaXRlcmF0b3IgJnApIGNvbnN0IHsgcmV0dXJuIHJvb3RzX3NpemUoKTsgfQorfTsKKworLy8vIEFuIGFuYWx5c2lzIHBhc3Mgd2hpY2ggY2FjaGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlbnRpcmUgTW9kdWxlLgorLy8vIFJlY29yZHMgYm90aCB0aGUgZnVuY3Rpb24gbGV2ZWwgaW5mb3JtYXRpb24gdXNlZCBieSBHQ1Jvb3RzIGFuZCBhCisvLy8gY2FjaGUgb2YgdGhlICdhY3RpdmUnIGdjIHN0cmF0ZWd5IG9iamVjdHMgZm9yIHRoZSBjdXJyZW50IE1vZHVsZS4KK2NsYXNzIEdDTW9kdWxlSW5mbyA6IHB1YmxpYyBJbW11dGFibGVQYXNzIHsKKyAgLy8vIEFuIG93bmluZyBsaXN0IG9mIGFsbCBHQ1N0cmF0ZWdpZXMgd2hpY2ggaGF2ZSBiZWVuIGNyZWF0ZWQKKyAgU21hbGxWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEdDU3RyYXRlZ3k+LCAxPiBHQ1N0cmF0ZWd5TGlzdDsKKyAgLy8vIEEgaGVscGVyIG1hcCB0byBzcGVlZHVwIGxvb2t1cHMgaW50byB0aGUgYWJvdmUgbGlzdAorICBTdHJpbmdNYXA8R0NTdHJhdGVneSo+IEdDU3RyYXRlZ3lNYXA7CisKK3B1YmxpYzoKKyAgLy8vIExvb2t1cCB0aGUgR0NTdHJhdGVneSBvYmplY3QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBnYyBuYW1lLgorICAvLy8gT2JqZWN0cyBhcmUgb3duZWQgaW50ZXJuYWxseTsgTm8gY2FsbGVyIHNob3VsZCBhdHRlbXB0IHRvIGRlbGV0ZSB0aGUKKyAgLy8vIHJldHVybmVkIG9iamVjdHMuCisgIEdDU3RyYXRlZ3kgKmdldEdDU3RyYXRlZ3koY29uc3QgU3RyaW5nUmVmIE5hbWUpOworCisgIC8vLyBMaXN0IG9mIHBlciBmdW5jdGlvbiBpbmZvIG9iamVjdHMuICBJbiB0aGVvcnksIEVhY2ggb2YgdGhlc2UKKyAgLy8vIG1heSBiZSBhc3NvY2lhdGVkIHdpdGggYSBkaWZmZXJlbnQgR0MuCisgIHVzaW5nIEZ1bmNJbmZvVmVjID0gc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEdDRnVuY3Rpb25JbmZvPj47CisKKyAgRnVuY0luZm9WZWM6Oml0ZXJhdG9yIGZ1bmNpbmZvX2JlZ2luKCkgeyByZXR1cm4gRnVuY3Rpb25zLmJlZ2luKCk7IH0KKyAgRnVuY0luZm9WZWM6Oml0ZXJhdG9yIGZ1bmNpbmZvX2VuZCgpIHsgcmV0dXJuIEZ1bmN0aW9ucy5lbmQoKTsgfQorCitwcml2YXRlOgorICAvLy8gT3duaW5nIGxpc3Qgb2YgYWxsIEdDRnVuY3Rpb25JbmZvcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBNb2R1bGUKKyAgRnVuY0luZm9WZWMgRnVuY3Rpb25zOworCisgIC8vLyBOb24tb3duaW5nIG1hcCB0byBieXBhc3MgbGluZWFyIHNlYXJjaCB3aGVuIGZpbmRpbmcgdGhlIEdDRnVuY3Rpb25JbmZvCisgIC8vLyBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIEZ1bmN0aW9uLgorICB1c2luZyBmaW5mb19tYXBfdHlwZSA9IERlbnNlTWFwPGNvbnN0IEZ1bmN0aW9uICosIEdDRnVuY3Rpb25JbmZvICo+OworICBmaW5mb19tYXBfdHlwZSBGSW5mb01hcDsKKworcHVibGljOgorICB1c2luZyBpdGVyYXRvciA9IFNtYWxsVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxHQ1N0cmF0ZWd5PiwgMT46OmNvbnN0X2l0ZXJhdG9yOworCisgIHN0YXRpYyBjaGFyIElEOworCisgIEdDTW9kdWxlSW5mbygpOworCisgIC8vLyBjbGVhciAtIFJlc2V0cyB0aGUgcGFzcy4gQW55IHBhc3MsIHdoaWNoIHVzZXMgR0NNb2R1bGVJbmZvLCBzaG91bGQKKyAgLy8vIGNhbGwgaXQgaW4gZG9GaW5hbGl6YXRpb24oKS4KKyAgLy8vCisgIHZvaWQgY2xlYXIoKTsKKworICAvLy8gYmVnaW4vZW5kIC0gSXRlcmF0b3JzIGZvciB1c2VkIHN0cmF0ZWdpZXMuCisgIC8vLworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEdDU3RyYXRlZ3lMaXN0LmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gR0NTdHJhdGVneUxpc3QuZW5kKCk7IH0KKworICAvLy8gZ2V0IC0gTG9vayB1cCBmdW5jdGlvbiBtZXRhZGF0YS4gIFRoaXMgaXMgY3VycmVudGx5IGFzc3VtZWQKKyAgLy8vIGhhdmUgdGhlIHNpZGUgZWZmZWN0IG9mIGluaXRpYWxpemluZyB0aGUgYXNzb2NpYXRlZCBHQ1N0cmF0ZWd5LiAgVGhhdAorICAvLy8gd2lsbCBzb29uIGNoYW5nZS4KKyAgR0NGdW5jdGlvbkluZm8gJmdldEZ1bmN0aW9uSW5mbyhjb25zdCBGdW5jdGlvbiAmRik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0dDTUVUQURBVEFfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dDTWV0YWRhdGFQcmludGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR0NNZXRhZGF0YVByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xY2M2OWE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dDTWV0YWRhdGFQcmludGVyLmgKQEAgLTAsMCArMSw2NyBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9HQ01ldGFkYXRhUHJpbnRlci5oIC0gUHJpbnRzIGFzbSBHQyB0YWJsZXMgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGUgYWJzdHJhY3QgYmFzZSBjbGFzcyBHQ01ldGFkYXRhUHJpbnRlciBzdXBwb3J0cyB3cml0aW5nIEdDIG1ldGFkYXRhIHRhYmxlcworLy8gYXMgYXNzZW1ibHkgY29kZS4gVGhpcyBpcyBhIHNlcGFyYXRlIGNsYXNzIGZyb20gR0NTdHJhdGVneSBpbiBvcmRlciB0byBhbGxvdworLy8gdXNlcnMgb2YgdGhlIExMVk0gSklUIHRvIGF2b2lkIGxpbmtpbmcgd2l0aCB0aGUgQXNtV3JpdGVyLgorLy8KKy8vIFN1YmNsYXNzZXMgb2YgR0NNZXRhZGF0YVByaW50ZXIgbXVzdCBiZSByZWdpc3RlcmVkIHVzaW5nIHRoZQorLy8gR0NNZXRhZGF0YVByaW50ZXJSZWdpc3RyeS4gVGhpcyBpcyBzZXBhcmF0ZSBmcm9tIHRoZSBHQ1N0cmF0ZWd5IGl0c2VsZgorLy8gYmVjYXVzZSB0aGVzZSBzdWJjbGFzc2VzIGFyZSBsb2dpY2FsbHkgcGx1Z2lucyBmb3IgdGhlIEFzbVdyaXRlci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9HQ01FVEFEQVRBUFJJTlRFUl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9HQ01FVEFEQVRBUFJJTlRFUl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUmVnaXN0cnkuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBc21QcmludGVyOworY2xhc3MgR0NNZXRhZGF0YVByaW50ZXI7CitjbGFzcyBHQ01vZHVsZUluZm87CitjbGFzcyBHQ1N0cmF0ZWd5OworY2xhc3MgTW9kdWxlOworCisvLy8gR0NNZXRhZGF0YVByaW50ZXJSZWdpc3RyeSAtIFRoZSBHQyBhc3NlbWJseSBwcmludGVyIHJlZ2lzdHJ5IHVzZXMgYWxsIHRoZQorLy8vIGRlZmF1bHRzIGZyb20gUmVnaXN0cnkuCit1c2luZyBHQ01ldGFkYXRhUHJpbnRlclJlZ2lzdHJ5ID0gUmVnaXN0cnk8R0NNZXRhZGF0YVByaW50ZXI+OworCisvLy8gR0NNZXRhZGF0YVByaW50ZXIgLSBFbWl0cyBHQyBtZXRhZGF0YSBhcyBhc3NlbWJseSBjb2RlLiAgSW5zdGFuY2VzIGFyZQorLy8vIGNyZWF0ZWQsIG1hbmFnZWQsIGFuZCBvd25lZCBieSB0aGUgQXNtUHJpbnRlci4KK2NsYXNzIEdDTWV0YWRhdGFQcmludGVyIHsKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBBc21QcmludGVyOworCisgIEdDU3RyYXRlZ3kgKlM7CisKK3Byb3RlY3RlZDoKKyAgLy8gTWF5IG9ubHkgYmUgc3ViY2xhc3NlZC4KKyAgR0NNZXRhZGF0YVByaW50ZXIoKTsKKworcHVibGljOgorICBHQ01ldGFkYXRhUHJpbnRlcihjb25zdCBHQ01ldGFkYXRhUHJpbnRlciAmKSA9IGRlbGV0ZTsKKyAgR0NNZXRhZGF0YVByaW50ZXIgJm9wZXJhdG9yPShjb25zdCBHQ01ldGFkYXRhUHJpbnRlciAmKSA9IGRlbGV0ZTsKKyAgdmlydHVhbCB+R0NNZXRhZGF0YVByaW50ZXIoKTsKKworICBHQ1N0cmF0ZWd5ICZnZXRTdHJhdGVneSgpIHsgcmV0dXJuICpTOyB9CisKKyAgLy8vIENhbGxlZCBiZWZvcmUgdGhlIGFzc2VtYmx5IGZvciB0aGUgbW9kdWxlIGlzIGdlbmVyYXRlZCBieQorICAvLy8gdGhlIEFzbVByaW50ZXIgKGJ1dCBhZnRlciB0YXJnZXQgc3BlY2lmaWMgaG9va3MuKQorICB2aXJ0dWFsIHZvaWQgYmVnaW5Bc3NlbWJseShNb2R1bGUgJk0sIEdDTW9kdWxlSW5mbyAmSW5mbywgQXNtUHJpbnRlciAmQVApIHt9CisKKyAgLy8vIENhbGxlZCBhZnRlciB0aGUgYXNzZW1ibHkgZm9yIHRoZSBtb2R1bGUgaXMgZ2VuZXJhdGVkIGJ5CisgIC8vLyB0aGUgQXNtUHJpbnRlciAoYnV0IGJlZm9yZSB0YXJnZXQgc3BlY2lmaWMgaG9va3MpCisgIHZpcnR1YWwgdm9pZCBmaW5pc2hBc3NlbWJseShNb2R1bGUgJk0sIEdDTW9kdWxlSW5mbyAmSW5mbywgQXNtUHJpbnRlciAmQVApIHt9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0dDTUVUQURBVEFQUklOVEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HQ1N0cmF0ZWd5LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR0NTdHJhdGVneS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2MTY4ZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR0NTdHJhdGVneS5oCkBAIC0wLDAgKzEsMTgxIEBACisvLz09PS0gbGx2bS9Db2RlR2VuL0dDU3RyYXRlZ3kuaCAtIEdhcmJhZ2UgY29sbGVjdGlvbiAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEdDU3RyYXRlZ3kgY29vcmRpbmF0ZXMgY29kZSBnZW5lcmF0aW9uIGFsZ29yaXRobXMgYW5kIGltcGxlbWVudHMgc29tZSBpdHNlbGYKKy8vIGluIG9yZGVyIHRvIGdlbmVyYXRlIGNvZGUgY29tcGF0aWJsZSB3aXRoIGEgdGFyZ2V0IGNvZGUgZ2VuZXJhdG9yIGFzCisvLyBzcGVjaWZpZWQgaW4gYSBmdW5jdGlvbidzICdnYycgYXR0cmlidXRlLiBBbGdvcml0aG1zIGFyZSBlbmFibGVkIGJ5IHNldHRpbmcKKy8vIGZsYWdzIGluIGEgc3ViY2xhc3MncyBjb25zdHJ1Y3RvciwgYW5kIHNvbWUgdmlydHVhbCBtZXRob2RzIGNhbiBiZQorLy8gb3ZlcnJpZGRlbi4KKy8vCisvLyBHQ1N0cmF0ZWd5IGlzIHJlbGV2YW50IGZvciBpbXBsZW1lbnRhdGlvbnMgdXNpbmcgZWl0aGVyIGdjLnJvb3Qgb3IKKy8vIGdjLnN0YXRlcG9pbnQgYmFzZWQgbG93ZXJpbmcgc3RyYXRlZ2llcywgYnV0IGlzIGN1cnJlbnRseSBmb2N1c2VkIG1vc3RseSBvbgorLy8gb3B0aW9ucyBmb3IgZ2Mucm9vdC4gIFRoaXMgd2lsbCBjaGFuZ2Ugb3ZlciB0aW1lLgorLy8KKy8vIFdoZW4gcmVxdWVzdGVkIGJ5IGEgc3ViY2xhc3Mgb2YgR0NTdHJhdGVneSwgdGhlIGdjLnJvb3QgaW1wbGVtZW50YXRpb24gd2lsbAorLy8gcG9wdWxhdGUgR0NNb2R1bGVJbmZvIGFuZCBHQ0Z1bmN0aW9uSW5mbyB3aXRoIHRoYXQgYWJvdXQgZWFjaCBGdW5jdGlvbiBpbgorLy8gdGhlIE1vZHVsZSB0aGF0IG9wdHMgaW4gdG8gZ2FyYmFnZSBjb2xsZWN0aW9uLiAgU3BlY2lmaWNhbGx5OgorLy8KKy8vIC0gU2FmZSBwb2ludHMKKy8vICAgR2FyYmFnZSBjb2xsZWN0aW9uIGlzIGdlbmVyYWxseSBvbmx5IHBvc3NpYmxlIGF0IGNlcnRhaW4gcG9pbnRzIGluIGNvZGUuCisvLyAgIEdDU3RyYXRlZ3kgY2FuIHJlcXVlc3QgdGhhdCB0aGUgY29sbGVjdG9yIGluc2VydCBzdWNoIHBvaW50czoKKy8vCisvLyAgICAgLSBBdCBhbmQgYWZ0ZXIgYW55IGNhbGwgdG8gYSBzdWJyb3V0aW5lCisvLyAgICAgLSBCZWZvcmUgcmV0dXJuaW5nIGZyb20gdGhlIGN1cnJlbnQgZnVuY3Rpb24KKy8vICAgICAtIEJlZm9yZSBiYWNrd2FyZHMgYnJhbmNoZXMgKGxvb3BzKQorLy8KKy8vIC0gUm9vdHMKKy8vICAgV2hlbiBhIHJlZmVyZW5jZSB0byBhIEdDLWFsbG9jYXRlZCBvYmplY3QgZXhpc3RzIG9uIHRoZSBzdGFjaywgaXQgbXVzdCBiZQorLy8gICBzdG9yZWQgaW4gYW4gYWxsb2NhIHJlZ2lzdGVyZWQgd2l0aCBsbHZtLmdjb290LgorLy8KKy8vIFRoaXMgaW5mb3JtYXRpb24gY2FuIHVzZWQgdG8gZW1pdCB0aGUgbWV0YWRhdGEgdGFibGVzIHdoaWNoIGFyZSByZXF1aXJlZCBieQorLy8gdGhlIHRhcmdldCBnYXJiYWdlIGNvbGxlY3RvciBydW50aW1lLgorLy8KKy8vIFdoZW4gdXNlZCB3aXRoIGdjLnN0YXRlcG9pbnQsIGluZm9ybWF0aW9uIGFib3V0IHNhZmVwb2ludCBhbmQgcm9vdHMgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgYmluYXJ5IFN0YWNrTWFwIHNlY3Rpb24gYWZ0ZXIgY29kZSBnZW5lcmF0aW9uLiAgU2FmZXBvaW50CisvLyBwbGFjZW1lbnQgaXMgY3VycmVudGx5IHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgZnJvbnRlbmQsIHRob3VnaCBsYXRlCisvLyBpbnNlcnRpb24gc3VwcG9ydCBpcyBwbGFubmVkLiAgZ2Muc3RhdGVwb2ludCBkb2VzIG5vdCBjdXJyZW50bHkgc3VwcG9ydAorLy8gY3VzdG9tIHN0YWNrIG1hcCBmb3JtYXRzOyBzdWNoIGNhbiBiZSBnZW5lcmF0ZWQgYnkgcGFyc2luZyB0aGUgc3RhbmRhcmQKKy8vIHN0YWNrIG1hcCBzZWN0aW9uIGlmIGRlc2lyZWQuCisvLworLy8gVGhlIHJlYWQgYW5kIHdyaXRlIGJhcnJpZXIgc3VwcG9ydCBjYW4gYmUgdXNlZCB3aXRoIGVpdGhlciBpbXBsZW1lbnRhdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9HQ1NUUkFURUdZX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0dDU1RSQVRFR1lfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1JlZ2lzdHJ5LmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFR5cGU7CisKK25hbWVzcGFjZSBHQyB7CisKKy8vLyBQb2ludEtpbmQgLSBVc2VkIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlIGFkZHJlc3Mgb2YgdGhlIGNhbGwgaW5zdHJ1Y3Rpb24KKy8vLyBvciB0aGUgYWRkcmVzcyBhZnRlciB0aGUgY2FsbCBpbnN0cnVjdGlvbiBpcyBsaXN0ZWQgaW4gdGhlIHN0YWNrbWFwLiAgRm9yCisvLy8gbW9zdCBydW50aW1lcywgUG9zdENhbGwgc2FmZXBvaW50cyBhcmUgYXBwcm9wcmlhdGUuCisvLy8KK2VudW0gUG9pbnRLaW5kIHsKKyAgUHJlQ2FsbCwgLy8vPCBJbnN0ciBpcyBhIGNhbGwgaW5zdHJ1Y3Rpb24uCisgIFBvc3RDYWxsIC8vLzwgSW5zdHIgaXMgdGhlIHJldHVybiBhZGRyZXNzIG9mIGEgY2FsbC4KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBHQworCisvLy8gR0NTdHJhdGVneSBkZXNjcmliZXMgYSBnYXJiYWdlIGNvbGxlY3RvciBhbGdvcml0aG0ncyBjb2RlIGdlbmVyYXRpb24KKy8vLyByZXF1aXJlbWVudHMsIGFuZCBwcm92aWRlcyBvdmVycmlkYWJsZSBob29rcyBmb3IgdGhvc2UgbmVlZHMgd2hpY2ggY2Fubm90CisvLy8gYmUgYWJzdHJhY3RseSBkZXNjcmliZWQuICBHQ1N0cmF0ZWd5IG9iamVjdHMgbXVzdCBiZSBsb29rZWQgdXAgdGhyb3VnaAorLy8vIHRoZSBGdW5jdGlvbi4gIFRoZSBvYmplY3RzIHRoZW1zZWx2ZXMgYXJlIG93bmVkIGJ5IHRoZSBDb250ZXh0IGFuZCBtdXN0CisvLy8gYmUgaW1tdXRhYmxlLgorY2xhc3MgR0NTdHJhdGVneSB7Citwcml2YXRlOgorICBmcmllbmQgY2xhc3MgR0NNb2R1bGVJbmZvOworCisgIHN0ZDo6c3RyaW5nIE5hbWU7CisKK3Byb3RlY3RlZDoKKyAgYm9vbCBVc2VTdGF0ZXBvaW50cyA9IGZhbHNlOyAvLy8gVXNlcyBnYy5zdGF0ZXBvaW50cyBhcyBvcHBvc2VkIHRvIGdjLnJvb3RzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyBpZiBzZXQsIG5vbmUgb2YgdGhlIG90aGVyIG9wdGlvbnMgY2FuIGJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vIGFueXRoaW5nIGJ1dCB0aGVpciBkZWZhdWx0IHZhbHVlcy4KKworICB1bnNpZ25lZCBOZWVkZWRTYWZlUG9pbnRzID0gMDsgICAgLy8vPCBCaXRtYXNrIG9mIHJlcXVpcmVkIHNhZmUgcG9pbnRzLgorICBib29sIEN1c3RvbVJlYWRCYXJyaWVycyA9IGZhbHNlOyAgLy8vPCBEZWZhdWx0IGlzIHRvIGluc2VydCBsb2Fkcy4KKyAgYm9vbCBDdXN0b21Xcml0ZUJhcnJpZXJzID0gZmFsc2U7IC8vLzwgRGVmYXVsdCBpcyB0byBpbnNlcnQgc3RvcmVzLgorICBib29sIEN1c3RvbVJvb3RzID0gZmFsc2U7ICAgICAgLy8vPCBEZWZhdWx0IGlzIHRvIHBhc3MgdGhyb3VnaCB0byBiYWNrZW5kLgorICBib29sIEluaXRSb290cz0gdHJ1ZTsgICAgICAgICAgLy8vPCBJZiBzZXQsIHJvb3RzIGFyZSBudWxsZWQgZHVyaW5nIGxvd2VyaW5nLgorICBib29sIFVzZXNNZXRhZGF0YSA9IGZhbHNlOyAgICAgLy8vPCBJZiBzZXQsIGJhY2tlbmQgbXVzdCBlbWl0IG1ldGFkYXRhIHRhYmxlcy4KKworcHVibGljOgorICBHQ1N0cmF0ZWd5KCk7CisgIHZpcnR1YWwgfkdDU3RyYXRlZ3koKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgR0Mgc3RyYXRlZ3kuICBUaGlzIGlzIHRoZSB2YWx1ZSBvZiB0aGUgY29sbGVjdG9yCisgIC8vLyBuYW1lIHN0cmluZyBzcGVjaWZpZWQgb24gZnVuY3Rpb25zIHdoaWNoIHVzZSB0aGlzIHN0cmF0ZWd5LgorICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICAvLy8gQnkgZGVmYXVsdCwgd3JpdGUgYmFycmllcnMgYXJlIHJlcGxhY2VkIHdpdGggc2ltcGxlIHN0b3JlCisgIC8vLyBpbnN0cnVjdGlvbnMuIElmIHRydWUsIHlvdSBtdXN0IHByb3ZpZGUgYSBjdXN0b20gcGFzcyB0byBsb3dlciAKKyAgLy8vIGNhbGxzIHRvIEBsbHZtLmdjd3JpdGUuCisgIGJvb2wgY3VzdG9tV3JpdGVCYXJyaWVyKCkgY29uc3QgeyByZXR1cm4gQ3VzdG9tV3JpdGVCYXJyaWVyczsgfQorCisgIC8vLyBCeSBkZWZhdWx0LCByZWFkIGJhcnJpZXJzIGFyZSByZXBsYWNlZCB3aXRoIHNpbXBsZSBsb2FkCisgIC8vLyBpbnN0cnVjdGlvbnMuIElmIHRydWUsIHlvdSBtdXN0IHByb3ZpZGUgYSBjdXN0b20gcGFzcyB0byBsb3dlciAKKyAgLy8vIGNhbGxzIHRvIEBsbHZtLmdjcmVhZC4KKyAgYm9vbCBjdXN0b21SZWFkQmFycmllcigpIGNvbnN0IHsgcmV0dXJuIEN1c3RvbVJlYWRCYXJyaWVyczsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBzdHJhdGVneSBpcyBleHBlY3RpbmcgdGhlIHVzZSBvZiBnYy5zdGF0ZXBvaW50cywKKyAgLy8vIGFuZCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgdXNlU3RhdGVwb2ludHMoKSBjb25zdCB7IHJldHVybiBVc2VTdGF0ZXBvaW50czsgfQorCisgIC8qKiBAbmFtZSBTdGF0ZXBvaW50IFNwZWNpZmljIFByb3BlcnRpZXMgKi8KKyAgLy8vQHsKKworICAvLy8gSWYgdGhlIHR5cGUgc3BlY2lmaWVkIGNhbiBiZSByZWxpYWJseSBkaXN0aW5ndWlzaGVkLCByZXR1cm5zIHRydWUgZm9yCisgIC8vLyBwb2ludGVycyB0byBHQyBtYW5hZ2VkIGxvY2F0aW9ucyBhbmQgZmFsc2UgZm9yIHBvaW50ZXJzIHRvIG5vbi1HQworICAvLy8gbWFuYWdlZCBsb2NhdGlvbnMuICBOb3RlIGEgR0NTdHJhdGVneSBjYW4gYWx3YXlzIHJldHVybiAnTm9uZScgKGkuZS4gYW4KKyAgLy8vIGVtcHR5IG9wdGlvbmFsIGluZGljYXRpbmcgaXQgY2FuJ3QgcmVsaWFibHkgZGlzdGluZ3Vpc2guCisgIHZpcnR1YWwgT3B0aW9uYWw8Ym9vbD4gaXNHQ01hbmFnZWRQb2ludGVyKGNvbnN0IFR5cGUgKlR5KSBjb25zdCB7CisgICAgcmV0dXJuIE5vbmU7CisgIH0KKyAgLy8vQH0KKworICAvKiogQG5hbWUgR0NSb290IFNwZWNpZmljIFByb3BlcnRpZXMKKyAgICogVGhlc2UgcHJvcGVydGllcyBhbmQgb3ZlcnJpZGVzIG9ubHkgYXBwbHkgdG8gY29sbGVjdG9yIHN0cmF0ZWdpZXMgdXNpbmcKKyAgICogR0NSb290LgorICAgKi8KKyAgLy8vQHsKKworICAvLy8gVHJ1ZSBpZiBzYWZlIHBvaW50cyBvZiBhbnkga2luZCBhcmUgcmVxdWlyZWQuIEJ5IGRlZmF1bHQsIG5vbmUgYXJlCisgIC8vLyByZWNvcmRlZC4KKyAgYm9vbCBuZWVkc1NhZmVQb2ludHMoKSBjb25zdCB7IHJldHVybiBOZWVkZWRTYWZlUG9pbnRzICE9IDA7IH0KKworICAvLy8gVHJ1ZSBpZiB0aGUgZ2l2ZW4ga2luZCBvZiBzYWZlIHBvaW50IGlzIHJlcXVpcmVkLiBCeSBkZWZhdWx0LCBub25lIGFyZQorICAvLy8gcmVjb3JkZWQuCisgIGJvb2wgbmVlZHNTYWZlUG9pbnQoR0M6OlBvaW50S2luZCBLaW5kKSBjb25zdCB7CisgICAgcmV0dXJuIChOZWVkZWRTYWZlUG9pbnRzICYgMSA8PCBLaW5kKSAhPSAwOworICB9CisKKyAgLy8vIEJ5IGRlZmF1bHQsIHJvb3RzIGFyZSBsZWZ0IGZvciB0aGUgY29kZSBnZW5lcmF0b3Igc28gaXQgY2FuIGdlbmVyYXRlIGEKKyAgLy8vIHN0YWNrIG1hcC4gSWYgdHJ1ZSwgeW91IG11c3QgcHJvdmlkZSBhIGN1c3RvbSBwYXNzIHRvIGxvd2VyIAorICAvLy8gY2FsbHMgdG8gQGxsdm0uZ2Nyb290LgorICBib29sIGN1c3RvbVJvb3RzKCkgY29uc3QgeyByZXR1cm4gQ3VzdG9tUm9vdHM7IH0KKworICAvLy8gSWYgc2V0LCBnY3Jvb3QgaW50cmluc2ljcyBzaG91bGQgaW5pdGlhbGl6ZSB0aGVpciBhbGxvY2FzIHRvIG51bGwKKyAgLy8vIGJlZm9yZSB0aGUgZmlyc3QgdXNlLiBUaGlzIGlzIG5lY2Vzc2FyeSBmb3IgbW9zdCBHQ3MgYW5kIGlzIGVuYWJsZWQgYnkKKyAgLy8vIGRlZmF1bHQuCisgIGJvb2wgaW5pdGlhbGl6ZVJvb3RzKCkgY29uc3QgeyByZXR1cm4gSW5pdFJvb3RzOyB9CisKKyAgLy8vIElmIHNldCwgYXBwcm9wcmlhdGUgbWV0YWRhdGEgdGFibGVzIG11c3QgYmUgZW1pdHRlZCBieSB0aGUgYmFjay1lbmQKKyAgLy8vIChhc3NlbWJsZXIsIEpJVCwgb3Igb3RoZXJ3aXNlKS4gRm9yIHN0YXRlcG9pbnQsIHRoaXMgbWV0aG9kIGlzCisgIC8vLyBjdXJyZW50bHkgdW5zdXBwb3J0ZWQuICBUaGUgc3RhY2ttYXAgaW5mb3JtYXRpb24gY2FuIGJlIGZvdW5kIGluIHRoZQorICAvLy8gU3RhY2tNYXAgc2VjdGlvbiBhcyBkZXNjcmliZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uCisgIGJvb2wgdXNlc01ldGFkYXRhKCkgY29uc3QgeyByZXR1cm4gVXNlc01ldGFkYXRhOyB9CisKKyAgLy8vQH0KK307CisKKy8vLyBTdWJjbGFzc2VzIG9mIEdDU3RyYXRlZ3kgYXJlIG1hZGUgYXZhaWxhYmxlIGZvciB1c2UgZHVyaW5nIGNvbXBpbGF0aW9uIGJ5CisvLy8gYWRkaW5nIHRoZW0gdG8gdGhlIGdsb2JhbCBHQ1JlZ2lzdHJ5LiAgVGhpcyBjYW4gZG9uZSBlaXRoZXIgd2l0aGluIHRoZQorLy8vIExMVk0gc291cmNlIHRyZWUgb3IgdmlhIGEgbG9hZGFibGUgcGx1Z2luLiAgQW4gZXhhbXBsZSByZWdpc3RlcmF0aW9uCisvLy8gd291bGQgYmU6CisvLy8gc3RhdGljIEdDUmVnaXN0cnk6OkFkZDxDdXN0b21HQz4gWCgiY3VzdG9tLW5hbWUiLAorLy8vICAgICAgICAibXkgY3VzdG9tIHN1cHBlciBmYW5jeSBnYyBzdHJhdGVneSIpOworLy8vCisvLy8gTm90ZSB0aGF0IHRvIHVzZSBhIGN1c3RvbSBHQ01ldGFkYXRhUHJpbnRlciB3L2djLnJvb3RzLCB5b3UgbXVzdCBhbHNvCisvLy8gcmVnaXN0ZXIgeW91ciBHQ01ldGFkYXRhUHJpbnRlciBzdWJjbGFzcyB3aXRoIHRoZQorLy8vIEdDTWV0YWRhdGFQcmludGVyUmVnaXN0ZXJ5IGFzIHdlbGwuCit1c2luZyBHQ1JlZ2lzdHJ5ID0gUmVnaXN0cnk8R0NTdHJhdGVneT47CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fR0NTVFJBVEVHWV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR0NzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR0NzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIwN2Y4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HQ3MuaApAQCAtMCwwICsxLDQ2IEBACisvLz09PS0tIEdDcy5oIC0gR2FyYmFnZSBjb2xsZWN0b3IgbGlua2FnZSBoYWNrcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBoYWNrIGZ1bmN0aW9ucyB0byBmb3JjZSBsaW5raW5nIGluIHRoZSBHQyBjb21wb25lbnRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0dDU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9HQ1NfSAorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBHQ1N0cmF0ZWd5OworY2xhc3MgR0NNZXRhZGF0YVByaW50ZXI7CisKKy8vLyBGSVhNRTogQ29sbGVjdG9yIGluc3RhbmNlcyBhcmUgbm90IHVzZWZ1bCBvbiB0aGVpciBvd24uIFRoZXNlIG5vIGxvbmdlcgorLy8vICAgICAgICBzZXJ2ZSBhbnkgcHVycG9zZSBleGNlcHQgdG8gbGluayBpbiB0aGUgcGx1Z2lucy4KKworLy8vIENyZWF0ZXMgYSBDb3JlQ0xSLWNvbXBhdGlibGUgZ2FyYmFnZSBjb2xsZWN0b3IuCit2b2lkIGxpbmtDb3JlQ0xSR0MoKTsKKworLy8vIENyZWF0ZXMgYW4gb2NhbWwtY29tcGF0aWJsZSBnYXJiYWdlIGNvbGxlY3Rvci4KK3ZvaWQgbGlua09jYW1sR0MoKTsKKworLy8vIENyZWF0ZXMgYW4gb2NhbWwtY29tcGF0aWJsZSBtZXRhZGF0YSBwcmludGVyLgordm9pZCBsaW5rT2NhbWxHQ1ByaW50ZXIoKTsKKworLy8vIENyZWF0ZXMgYW4gZXJsYW5nLWNvbXBhdGlibGUgZ2FyYmFnZSBjb2xsZWN0b3IuCit2b2lkIGxpbmtFcmxhbmdHQygpOworCisvLy8gQ3JlYXRlcyBhbiBlcmxhbmctY29tcGF0aWJsZSBtZXRhZGF0YSBwcmludGVyLgordm9pZCBsaW5rRXJsYW5nR0NQcmludGVyKCk7CisKKy8vLyBDcmVhdGVzIGEgc2hhZG93IHN0YWNrIGdhcmJhZ2UgY29sbGVjdG9yLiBUaGlzIGNvbGxlY3RvciByZXF1aXJlcyBubyBjb2RlCisvLy8gZ2VuZXJhdG9yIHN1cHBvcnQuCit2b2lkIGxpbmtTaGFkb3dTdGFja0dDKCk7CisKK3ZvaWQgbGlua1N0YXRlcG9pbnRFeGFtcGxlR0MoKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9DYWxsTG93ZXJpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0NhbGxMb3dlcmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkOTFjYzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9DYWxsTG93ZXJpbmcuaApAQCAtMCwwICsxLDIxNSBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0NhbGxMb3dlcmluZy5oIC0gQ2FsbCBsb3dlcmluZyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIGRlc2NyaWJlcyBob3cgdG8gbG93ZXIgTExWTSBjYWxscyB0byBtYWNoaW5lIGNvZGUgY2FsbHMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfQ0FMTExPV0VSSU5HX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfQ0FMTExPV0VSSU5HX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0NhbGxpbmdDb252TG93ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0Q2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsaW5nQ29udi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hY2hpbmVWYWx1ZVR5cGUuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgTWFjaGluZUlSQnVpbGRlcjsKK2NsYXNzIE1hY2hpbmVPcGVyYW5kOworc3RydWN0IE1hY2hpbmVQb2ludGVySW5mbzsKK2NsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CitjbGFzcyBUYXJnZXRMb3dlcmluZzsKK2NsYXNzIFR5cGU7CitjbGFzcyBWYWx1ZTsKKworY2xhc3MgQ2FsbExvd2VyaW5nIHsKKyAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgKlRMSTsKKworcHVibGljOgorICBzdHJ1Y3QgQXJnSW5mbyB7CisgICAgdW5zaWduZWQgUmVnOworICAgIFR5cGUgKlR5OworICAgIElTRDo6QXJnRmxhZ3NUeSBGbGFnczsKKyAgICBib29sIElzRml4ZWQ7CisKKyAgICBBcmdJbmZvKHVuc2lnbmVkIFJlZywgVHlwZSAqVHksIElTRDo6QXJnRmxhZ3NUeSBGbGFncyA9IElTRDo6QXJnRmxhZ3NUeXt9LAorICAgICAgICAgICAgYm9vbCBJc0ZpeGVkID0gdHJ1ZSkKKyAgICAgICAgOiBSZWcoUmVnKSwgVHkoVHkpLCBGbGFncyhGbGFncyksIElzRml4ZWQoSXNGaXhlZCkge30KKyAgfTsKKworICAvLy8gQXJndW1lbnQgaGFuZGxpbmcgaXMgbW9zdGx5IHVuaWZvcm0gYmV0d2VlbiB0aGUgZm91ciBwbGFjZXMgdGhhdAorICAvLy8gbWFrZSB0aGVzZSBkZWNpc2lvbnM6IGZ1bmN0aW9uIGZvcm1hbCBhcmd1bWVudHMsIGNhbGwKKyAgLy8vIGluc3RydWN0aW9uIGFyZ3MsIGNhbGwgaW5zdHJ1Y3Rpb24gcmV0dXJucyBhbmQgZnVuY3Rpb24KKyAgLy8vIHJldHVybnMuIEhvd2V2ZXIsIG9uY2UgYSBkZWNpc2lvbiBoYXMgYmVlbiBtYWRlIG9uIHdoZXJlIGFuCisgIC8vLyBhcnVnbWVudCBzaG91bGQgZ28sIGV4YWN0bHkgd2hhdCBoYXBwZW5zIGNhbiB2YXJ5IHNsaWdodGx5LiBUaGlzCisgIC8vLyBjbGFzcyBhYnN0cmFjdHMgdGhlIGRpZmZlcmVuY2VzLgorICBzdHJ1Y3QgVmFsdWVIYW5kbGVyIHsKKyAgICBWYWx1ZUhhbmRsZXIoTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlciwgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJLAorICAgICAgICAgICAgICAgICBDQ0Fzc2lnbkZuICpBc3NpZ25GbikKKyAgICAgIDogTUlSQnVpbGRlcihNSVJCdWlsZGVyKSwgTVJJKE1SSSksIEFzc2lnbkZuKEFzc2lnbkZuKSB7fQorCisgICAgdmlydHVhbCB+VmFsdWVIYW5kbGVyKCkgPSBkZWZhdWx0OworCisgICAgLy8vIE1hdGVyaWFsaXplIGEgVlJlZyBjb250YWluaW5nIHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gc3RhY2stYmFzZWQgb2JqZWN0LiBUaGlzIGlzIGVpdGhlciBiYXNlZCBvbiBhIEZyYW1lSW5kZXggb3IKKyAgICAvLy8gZGlyZWN0IFNQIG1hbmlwdWxhdGlvbiwgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0LiBccCBNUE8KKyAgICAvLy8gc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIGFuIGFwcHJvcHJpYXRlIGRlc2NyaXB0aW9uIG9mIHRoZQorICAgIC8vLyBhZGRyZXNzIGNyZWF0ZWQuCisgICAgdmlydHVhbCB1bnNpZ25lZCBnZXRTdGFja0FkZHJlc3ModWludDY0X3QgU2l6ZSwgaW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZVBvaW50ZXJJbmZvICZNUE8pID0gMDsKKworICAgIC8vLyBUaGUgc3BlY2lmaWVkIHZhbHVlIGhhcyBiZWVuIGFzc2lnbmVkIHRvIGEgcGh5c2ljYWwgcmVnaXN0ZXIsCisgICAgLy8vIGhhbmRsZSB0aGUgYXBwcm9wcmlhdGUgQ09QWSAoZWl0aGVyIHRvIG9yIGZyb20pIGFuZCBtYXJrIGFueQorICAgIC8vLyByZWxldmFudCB1c2VzL2RlZmluZXMgYXMgbmVlZGVkLgorICAgIHZpcnR1YWwgdm9pZCBhc3NpZ25WYWx1ZVRvUmVnKHVuc2lnbmVkIFZhbFZSZWcsIHVuc2lnbmVkIFBoeXNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NWYWxBc3NpZ24gJlZBKSA9IDA7CisKKyAgICAvLy8gVGhlIHNwZWNpZmllZCB2YWx1ZSBoYXMgYmVlbiBhc3NpZ25lZCB0byBhIHN0YWNrCisgICAgLy8vIGxvY2F0aW9uLiBMb2FkIG9yIHN0b3JlIGl0IHRoZXJlLCB3aXRoIGFwcHJvcHJpYXRlIGV4dGVuc2lvbgorICAgIC8vLyBpZiBuZWNlc3NhcnkuCisgICAgdmlydHVhbCB2b2lkIGFzc2lnblZhbHVlVG9BZGRyZXNzKHVuc2lnbmVkIFZhbFZSZWcsIHVuc2lnbmVkIEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUsIE1hY2hpbmVQb2ludGVySW5mbyAmTVBPLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1ZhbEFzc2lnbiAmVkEpID0gMDsKKworICAgIC8vLyBIYW5kbGUgY3VzdG9tIHZhbHVlcywgd2hpY2ggbWF5IGJlIHBhc3NlZCBpbnRvIG9uZSBvciBtb3JlIG9mIFxwIFZBcy4KKyAgICAvLy8gXHJldHVybiBUaGUgbnVtYmVyIG9mIFxwIFZBcyB0aGF0IGhhdmUgYmVlbiBhc3NpZ25lZCBhZnRlciB0aGUgZmlyc3QKKyAgICAvLy8gICAgICAgICBvbmUsIGFuZCB3aGljaCBzaG91bGQgdGhlcmVmb3JlIGJlIHNraXBwZWQgZnJvbSBmdXJ0aGVyCisgICAgLy8vICAgICAgICAgcHJvY2Vzc2luZy4KKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGFzc2lnbkN1c3RvbVZhbHVlKGNvbnN0IEFyZ0luZm8gJkFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENDVmFsQXNzaWduPiBWQXMpIHsKKyAgICAgIC8vIFRoaXMgaXMgbm90IGEgcHVyZSB2aXJ0dWFsIG1ldGhvZCBiZWNhdXNlIG5vdCBhbGwgdGFyZ2V0cyBuZWVkIHRvIHdvcnJ5CisgICAgICAvLyBhYm91dCBjdXN0b20gdmFsdWVzLgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiQ3VzdG9tIHZhbHVlcyBub3Qgc3VwcG9ydGVkIik7CisgICAgfQorCisgICAgdW5zaWduZWQgZXh0ZW5kUmVnaXN0ZXIodW5zaWduZWQgVmFsUmVnLCBDQ1ZhbEFzc2lnbiAmVkEpOworCisgICAgdmlydHVhbCBib29sIGFzc2lnbkFyZyh1bnNpZ25lZCBWYWxObywgTVZUIFZhbFZULCBNVlQgTG9jVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ1ZhbEFzc2lnbjo6TG9jSW5mbyBMb2NJbmZvLCBjb25zdCBBcmdJbmZvICZJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0NTdGF0ZSAmU3RhdGUpIHsKKyAgICAgIHJldHVybiBBc3NpZ25GbihWYWxObywgVmFsVlQsIExvY1ZULCBMb2NJbmZvLCBJbmZvLkZsYWdzLCBTdGF0ZSk7CisgICAgfQorCisgICAgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcjsKKyAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkk7CisgICAgQ0NBc3NpZ25GbiAqQXNzaWduRm47CisgIH07CisKK3Byb3RlY3RlZDoKKyAgLy8vIEdldHRlciBmb3IgZ2VuZXJpYyBUYXJnZXRMb3dlcmluZyBjbGFzcy4KKyAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgKmdldFRMSSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVExJOworICB9CisKKyAgLy8vIEdldHRlciBmb3IgdGFyZ2V0IHNwZWNpZmljIFRhcmdldExvd2VyaW5nIGNsYXNzLgorICB0ZW1wbGF0ZSA8Y2xhc3MgWFhYVGFyZ2V0TG93ZXJpbmc+CisgICAgY29uc3QgWFhYVGFyZ2V0TG93ZXJpbmcgKmdldFRMSSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgWFhYVGFyZ2V0TG93ZXJpbmcgKj4oVExJKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jSW5mb1R5PgorICB2b2lkIHNldEFyZ0ZsYWdzKEFyZ0luZm8gJkFyZywgdW5zaWduZWQgT3BOdW0sIGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmNJbmZvVHkgJkZ1bmNJbmZvKSBjb25zdDsKKworICAvLy8gSW52b2tlIEhhbmRsZXI6OmFzc2lnbkFyZyBvbiBlYWNoIG9mIHRoZSBnaXZlbiBccCBBcmdzIGFuZCB0aGVuIHVzZQorICAvLy8gXHAgQ2FsbGJhY2sgdG8gbW92ZSB0aGVtIHRvIHRoZSBhc3NpZ25lZCBsb2NhdGlvbnMuCisgIC8vLworICAvLy8gXHJldHVybiBUcnVlIGlmIGV2ZXJ5dGhpbmcgaGFzIHN1Y2NlZWRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIGhhbmRsZUFzc2lnbm1lbnRzKE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIsIEFycmF5UmVmPEFyZ0luZm8+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVIYW5kbGVyICZDYWxsYmFjaykgY29uc3Q7CisKK3B1YmxpYzoKKyAgQ2FsbExvd2VyaW5nKGNvbnN0IFRhcmdldExvd2VyaW5nICpUTEkpIDogVExJKFRMSSkge30KKyAgdmlydHVhbCB+Q2FsbExvd2VyaW5nKCkgPSBkZWZhdWx0OworCisgIC8vLyBUaGlzIGhvb2sgbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBsb3dlciBvdXRnb2luZyByZXR1cm4gdmFsdWVzLCBkZXNjcmliZWQKKyAgLy8vIGJ5IFxwIFZhbCwgaW50byB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgcmVnaXN0ZXIgXHAgVlJlZy4KKyAgLy8vIFRoaXMgaG9vayBpcyB1c2VkIGJ5IEdsb2JhbElTZWwuCisgIC8vLworICAvLy8gXHJldHVybiBUcnVlIGlmIHRoZSBsb3dlcmluZyBzdWNjZWVkcywgZmFsc2Ugb3RoZXJ3aXNlLgorICB2aXJ0dWFsIGJvb2wgbG93ZXJSZXR1cm4oTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpWYWwsIHVuc2lnbmVkIFZSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gVGhpcyBob29rIG11c3QgYmUgaW1wbGVtZW50ZWQgdG8gbG93ZXIgdGhlIGluY29taW5nIChmb3JtYWwpCisgIC8vLyBhcmd1bWVudHMsIGRlc2NyaWJlZCBieSBccCBBcmdzLCBmb3IgR2xvYmFsSVNlbC4gRWFjaCBhcmd1bWVudAorICAvLy8gbXVzdCBlbmQgdXAgaW4gdGhlIHJlbGF0ZWQgdmlydHVhbCByZWdpc3RlciBkZXNjcmliZWQgYnkgVlJlZ3MuCisgIC8vLyBJbiBvdGhlciB3b3JkcywgdGhlIGZpcnN0IGFyZ3VtZW50IHNob3VsZCBlbmQgdXAgaW4gVlJlZ3NbMF0sCisgIC8vLyB0aGUgc2Vjb25kIGluIFZSZWdzWzFdLCBhbmQgc28gb24uCisgIC8vLyBccCBNSVJCdWlsZGVyIGlzIHNldCB0byB0aGUgcHJvcGVyIGluc2VydGlvbiBmb3IgdGhlIGFyZ3VtZW50CisgIC8vLyBsb3dlcmluZy4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRydWUgaWYgdGhlIGxvd2VyaW5nIHN1Y2NlZWRlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICB2aXJ0dWFsIGJvb2wgbG93ZXJGb3JtYWxBcmd1bWVudHMoTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uICZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IFZSZWdzKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFRoaXMgaG9vayBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGxvd2VyIHRoZSBnaXZlbiBjYWxsIGluc3RydWN0aW9uLAorICAvLy8gaW5jbHVkaW5nIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWUgbWFyc2hhbGxpbmcuCisgIC8vLworICAvLy8gXHAgQ2FsbENvbnYgaXMgdGhlIGNhbGxpbmcgY29udmVudGlvbiB0byBiZSB1c2VkIGZvciB0aGUgY2FsbC4KKyAgLy8vCisgIC8vLyBccCBDYWxsZWUgaXMgdGhlIGRlc3RpbmF0aW9uIG9mIHRoZSBjYWxsLiBJdCBzaG91bGQgYmUgZWl0aGVyIGEgcmVnaXN0ZXIsCisgIC8vLyBnbG9iYWxhZGRyZXNzLCBvciBleHRlcm5hbHN5bWJvbC4KKyAgLy8vCisgIC8vLyBccCBSZXNUeSBpcyB0aGUgdHlwZSByZXR1cm5lZCBieSB0aGUgZnVuY3Rpb24KKyAgLy8vCisgIC8vLyBccCBSZXNSZWcgaXMgdGhlIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB0aGF0IHRoZSByZXR1cm5lZAorICAvLy8gdmFsdWUgc2hvdWxkIGJlIGxvd2VyZWQgaW50by4KKyAgLy8vCisgIC8vLyBccCBBcmdUeXMgaXMgYSBsaXN0IG9mIHRoZSB0eXBlcyBlYWNoIG1lbWJlciBvZiBccCBBcmdSZWdzIGhhczsgdXNlZCBieQorICAvLy8gdGhlIHRhcmdldCB0byBkZWNpZGUgd2hpY2ggcmVnaXN0ZXIvc3RhY2sgc2xvdCBzaG91bGQgYmUgYWxsb2NhdGVkLgorICAvLy8KKyAgLy8vIFxwIEFyZ1JlZ3MgaXMgYSBsaXN0IG9mIHZpcnR1YWwgcmVnaXN0ZXJzIGNvbnRhaW5pbmcgZWFjaCBhcmd1bWVudCB0aGF0CisgIC8vLyBuZWVkcyB0byBiZSBwYXNzZWQuCisgIC8vLworICAvLy8gXHJldHVybiB0cnVlIGlmIHRoZSBsb3dlcmluZyBzdWNjZWVkZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgdmlydHVhbCBib29sIGxvd2VyQ2FsbChNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyLCBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJkNhbGxlZSwgY29uc3QgQXJnSW5mbyAmT3JpZ1JldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxBcmdJbmZvPiBPcmlnQXJncykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBMb3dlciB0aGUgZ2l2ZW4gY2FsbCBpbnN0cnVjdGlvbiwgaW5jbHVkaW5nIGFyZ3VtZW50IGFuZCByZXR1cm4gdmFsdWUKKyAgLy8vIG1hcnNoYWxsaW5nLgorICAvLy8KKyAgLy8vIFxwIENJIGlzIHRoZSBjYWxsL2ludm9rZSBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBccCBSZXNSZWcgaXMgYSByZWdpc3RlciB3aGVyZSB0aGUgY2FsbCdzIHJldHVybiB2YWx1ZSBzaG91bGQgYmUgc3RvcmVkIChvcgorICAvLy8gMCBpZiB0aGVyZSBpcyBubyByZXR1cm4gdmFsdWUpLgorICAvLy8KKyAgLy8vIFxwIEFyZ1JlZ3MgaXMgYSBsaXN0IG9mIHZpcnR1YWwgcmVnaXN0ZXJzIGNvbnRhaW5pbmcgZWFjaCBhcmd1bWVudCB0aGF0CisgIC8vLyBuZWVkcyB0byBiZSBwYXNzZWQuCisgIC8vLworICAvLy8gXHAgR2V0Q2FsbGVlUmVnIGlzIGEgY2FsbGJhY2sgdG8gbWF0ZXJpYWxpemUgYSByZWdpc3RlciBmb3IgdGhlIGNhbGxlZSBpZgorICAvLy8gdGhlIHRhcmdldCBkZXRlcm1pbmVzIGl0IGNhbm5vdCBqdW1wIHRvIHRoZSBkZXN0aW5hdGlvbiBiYXNlZCBwdXJlbHkgb24gXHAKKyAgLy8vIENJLiBUaGlzIG1pZ2h0IGJlIGJlY2F1c2UgXHAgQ0kgaXMgaW5kaXJlY3QsIG9yIGJlY2F1c2Ugb2YgdGhlIGxpbWl0ZWQKKyAgLy8vIHJhbmdlIG9mIGFuIGltbWVkaWF0ZSBqdW1wLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gdHJ1ZSBpZiB0aGUgbG93ZXJpbmcgc3VjY2VlZGVkLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgbG93ZXJDYWxsKE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIsIEltbXV0YWJsZUNhbGxTaXRlIENTLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZXNSZWcsIEFycmF5UmVmPHVuc2lnbmVkPiBBcmdSZWdzLAorICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHVuc2lnbmVkKCk+IEdldENhbGxlZVJlZykgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfQ0FMTExPV0VSSU5HX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0NvbWJpbmVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9Db21iaW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2YTMzZGUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9Db21iaW5lci5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vPT0gLS0tLS0gbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvQ29tYmluZXIuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gPT0gLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gVGhpcyBjb250YWlucyBjb21tb24gY29kZSB0byBkcml2ZSBjb21iaW5lcy4gQ29tYmluZXIgUGFzc2VzIHdpbGwgbmVlZCB0bworLy8vIHNldHVwIGEgQ29tYmluZXJJbmZvIGFuZCBjYWxsIGNvbWJpbmVNYWNoaW5lRnVuY3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9DT01CSU5FUl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX0NPTUJJTkVSX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL01hY2hpbmVJUkJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworY2xhc3MgQ29tYmluZXJJbmZvOworY2xhc3MgVGFyZ2V0UGFzc0NvbmZpZzsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKKworY2xhc3MgQ29tYmluZXIgeworcHVibGljOgorICBDb21iaW5lcihDb21iaW5lckluZm8gJkNvbWJpbmVySW5mbywgY29uc3QgVGFyZ2V0UGFzc0NvbmZpZyAqVFBDKTsKKworICBib29sIGNvbWJpbmVNYWNoaW5lSW5zdHJzKE1hY2hpbmVGdW5jdGlvbiAmTUYpOworCitwcm90ZWN0ZWQ6CisgIENvbWJpbmVySW5mbyAmQ0luZm87CisKKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJID0gbnVsbHB0cjsKKyAgY29uc3QgVGFyZ2V0UGFzc0NvbmZpZyAqVFBDOworICBNYWNoaW5lSVJCdWlsZGVyIEJ1aWxkZXI7Cit9OworCit9IC8vIEVuZCBuYW1lc3BhY2UgbGx2bS4KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX0dJQ09NQklORVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvQ29tYmluZXJIZWxwZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0NvbWJpbmVySGVscGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ1YjgzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0NvbWJpbmVySGVscGVyLmgKQEAgLTAsMCArMSw0NCBAQAorLy89PSBsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9Db21iaW5lckhlbHBlci5oIC0tLS0tLS0tLS0tLS0tIC0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gVGhpcyBjb250YWlucyBjb21tb24gY29tYmluZSB0cmFuc2Zvcm1hdGlvbnMgdGhhdCBtYXkgYmUgdXNlZCBpbiBhIGNvbWJpbmUKKy8vLyBwYXNzLG9yIGJ5IHRoZSB0YXJnZXQgZWxzZXdoZXJlLgorLy8vIFRhcmdldHMgY2FuIHBpY2sgaW5kaXZpZHVhbCBvcGNvZGUgdHJhbnNmb3JtYXRpb25zIGZyb20gdGhlIGhlbHBlciBvciB1c2UKKy8vLyB0cnlDb21iaW5lIHdoaWNoIGludm9rZXMgYWxsIHRyYW5zZm9ybWF0aW9ucy4gQWxsIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbnMKKy8vLyByZXR1cm4gdHJ1ZSBpZiB0aGUgTWFjaGluZUluc3RydWN0aW9uIGNoYW5nZWQgYW5kIGZhbHNlIG90aGVyd2lzZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9DT01CSU5FUl9IRUxQRVJfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9DT01CSU5FUl9IRUxQRVJfSAorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hpbmVJUkJ1aWxkZXI7CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworY2xhc3MgTWFjaGluZUluc3RyOworCitjbGFzcyBDb21iaW5lckhlbHBlciB7CisgIE1hY2hpbmVJUkJ1aWxkZXIgJkJ1aWxkZXI7CisgIE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSTsKKworcHVibGljOgorICBDb21iaW5lckhlbHBlcihNYWNoaW5lSVJCdWlsZGVyICZCKTsKKworICAvLy8gSWYgXHAgTUkgaXMgQ09QWSwgdHJ5IHRvIGNvbWJpbmUgaXQuCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgTUkgY2hhbmdlZC4KKyAgYm9vbCB0cnlDb21iaW5lQ29weShNYWNoaW5lSW5zdHIgJk1JKTsKKworICAvLy8gVHJ5IHRvIHRyYW5zZm9ybSBccCBNSSBieSB1c2luZyBhbGwgb2YgdGhlIGFib3ZlCisgIC8vLyBjb21iaW5lIGZ1bmN0aW9ucy4gUmV0dXJucyB0cnVlIGlmIGNoYW5nZWQuCisgIGJvb2wgdHJ5Q29tYmluZShNYWNoaW5lSW5zdHIgJk1JKTsKK307Cit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvQ29tYmluZXJJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9Db21iaW5lckluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDI0ODU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvQ29tYmluZXJJbmZvLmgKQEAgLTAsMCArMSw0OCBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0NvbWJpbmVySW5mby5oIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBJbnRlcmZhY2UgZm9yIFRhcmdldHMgdG8gc3BlY2lmeSB3aGljaCBvcGVyYXRpb25zIGFyZSBjb21iaW5lZCBob3cgYW5kIHdoZW4uCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfQ09NQklORVJfSU5GT19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX0NPTUJJTkVSX0lORk9fSAorCisjaW5jbHVkZSA8Y2Fzc2VydD4KK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTGVnYWxpemVySW5mbzsKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIE1hY2hpbmVJUkJ1aWxkZXI7CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworLy8gQ29udGFpbnMgaW5mb3JtYXRpb24gcmVsZXZhbnQgdG8gZW5hYmxpbmcvZGlzYWJsaW5nIHZhcmlvdXMgY29tYmluZXMgZm9yIGEKKy8vIHBhc3MuCitjbGFzcyBDb21iaW5lckluZm8geworcHVibGljOgorICBDb21iaW5lckluZm8oYm9vbCBBbGxvd0lsbGVnYWxPcHMsIGJvb2wgU2hvdWxkTGVnYWxpemVJbGxlZ2FsLAorICAgICAgICAgICAgICAgTGVnYWxpemVySW5mbyAqTEluZm8pCisgICAgICA6IElsbGVnYWxPcHNBbGxvd2VkKEFsbG93SWxsZWdhbE9wcyksCisgICAgICAgIExlZ2FsaXplSWxsZWdhbE9wcyhTaG91bGRMZWdhbGl6ZUlsbGVnYWwpLCBMSW5mbyhMSW5mbykgeworICAgIGFzc2VydCgoKEFsbG93SWxsZWdhbE9wcyB8fCAhTGVnYWxpemVJbGxlZ2FsT3BzKSB8fCBMSW5mbykgJiYKKyAgICAgICAgICAgIkV4cGVjdGluZyBsZWdhbGl6ZXJJbmZvIHdoZW4gaWxsZWdhbG9wcyBub3QgYWxsb3dlZCIpOworICB9CisgIHZpcnR1YWwgfkNvbWJpbmVySW5mbygpID0gZGVmYXVsdDsKKyAgLy8vIElmIFxwIElsbGVnYWxPcHNBbGxvd2VkIGlzIGZhbHNlLCB0aGUgQ29tYmluZXJIZWxwZXIgd2lsbCBtYWtlIHVzZSBvZgorICAvLy8gdGhlIGxlZ2FsaXplckluZm8gdG8gY2hlY2sgZm9yIGxlZ2FsaXR5IGJlZm9yZSBlYWNoIHRyYW5zZm9ybWF0aW9uLgorICBib29sIElsbGVnYWxPcHNBbGxvd2VkOyAvLyBUT0RPOiBNYWtlIHVzZSBvZiB0aGlzLgorCisgIC8vLyBJZiBccCBMZWdhbGl6ZUlsbGVnYWxPcHMgaXMgdHJ1ZSwgdGhlIENvbWJpbmVyIHdpbGwgYWxzbyBsZWdhbGl6ZSB0aGUKKyAgLy8vIGlsbGVnYWwgb3BzIHRoYXQgYXJlIGNyZWF0ZWQuCisgIGJvb2wgTGVnYWxpemVJbGxlZ2FsT3BzOyAvLyBUT0RPOiBNYWtlIHVzZSBvZiB0aGlzLgorICBjb25zdCBMZWdhbGl6ZXJJbmZvICpMSW5mbzsKKyAgdmlydHVhbCBib29sIGNvbWJpbmUoTWFjaGluZUluc3RyICZNSSwgTWFjaGluZUlSQnVpbGRlciAmQikgY29uc3QgPSAwOworfTsKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9HSVNlbFdvcmtMaXN0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9HSVNlbFdvcmtMaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY3OTA1ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0dJU2VsV29ya0xpc3QuaApAQCAtMCwwICsxLDY5IEBACisvLz09PS0gR0lTZWxXb3JrTGlzdC5oIC0gV29ya2xpc3QgZm9yIEdJU2VsIHBhc3NlcyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9HSVNFTF9XT1JLTElTVF9ICisjZGVmaW5lIExMVk1fR0lTRUxfV09SS0xJU1RfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hpbmVJbnN0cjsKKworLy8gV29ya2xpc3Qgd2hpY2ggbW9zdGx5IHdvcmtzIHNpbWlsYXIgdG8gSW5zdENvbWJpbmVXb3JrTGlzdCwgYnV0IG9uIE1hY2hpbmVJbnN0cnMuCisvLyBUaGUgbWFpbiBkaWZmZXJlbmNlIHdpdGggc29tZXRoaW5nIGxpa2UgYSBTZXRWZWN0b3IgaXMgdGhhdCBlcmFzaW5nIGFuIGVsZW1lbnQgZG9lc24ndAorLy8gbW92ZSBhbGwgZWxlbWVudHMgb3ZlciBvbmUgcGxhY2UgLSBpbnN0ZWFkIGp1c3QgbnVsbHMgb3V0IHRoZSBlbGVtZW50IG9mIHRoZSB2ZWN0b3IuCisvLyBGSVhNRTogRG9lcyBpdCBtYWtlIHNlbnNlIHRvIGZhY3RvciBvdXQgY29tbW9uIGNvZGUgd2l0aCB0aGUgaW5zdGNvbWJpbmVyV29ya0xpc3Q/Cit0ZW1wbGF0ZTx1bnNpZ25lZCBOPgorY2xhc3MgR0lTZWxXb3JrTGlzdCB7CisgIFNtYWxsVmVjdG9yPE1hY2hpbmVJbnN0ciosIE4+IFdvcmtsaXN0OworICBEZW5zZU1hcDxNYWNoaW5lSW5zdHIqLCB1bnNpZ25lZD4gV29ya2xpc3RNYXA7CisKK3B1YmxpYzoKKyAgR0lTZWxXb3JrTGlzdCgpID0gZGVmYXVsdDsKKworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gV29ya2xpc3RNYXAuZW1wdHkoKTsgfQorCisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBXb3JrbGlzdE1hcC5zaXplKCk7IH0KKworICAvLy8gQWRkIC0gQWRkIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gdG8gdGhlIHdvcmtsaXN0IGlmIGl0IGlzbid0IGFscmVhZHkKKyAgLy8vIGluIGl0LgorICB2b2lkIGluc2VydChNYWNoaW5lSW5zdHIgKkkpIHsKKyAgICBpZiAoV29ya2xpc3RNYXAudHJ5X2VtcGxhY2UoSSwgV29ya2xpc3Quc2l6ZSgpKS5zZWNvbmQpIHsKKyAgICAgIFdvcmtsaXN0LnB1c2hfYmFjayhJKTsKKyAgICB9CisgIH0KKworICAvLy8gUmVtb3ZlIC0gcmVtb3ZlIEkgZnJvbSB0aGUgd29ya2xpc3QgaWYgaXQgZXhpc3RzLgorICB2b2lkIHJlbW92ZShNYWNoaW5lSW5zdHIgKkkpIHsKKyAgICBhdXRvIEl0ID0gV29ya2xpc3RNYXAuZmluZChJKTsKKyAgICBpZiAoSXQgPT0gV29ya2xpc3RNYXAuZW5kKCkpIHJldHVybjsgLy8gTm90IGluIHdvcmtsaXN0LgorCisgICAgLy8gRG9uJ3QgYm90aGVyIG1vdmluZyBldmVyeXRoaW5nIGRvd24sIGp1c3QgbnVsbCBvdXQgdGhlIHNsb3QuCisgICAgV29ya2xpc3RbSXQtPnNlY29uZF0gPSBudWxscHRyOworCisgICAgV29ya2xpc3RNYXAuZXJhc2UoSXQpOworICB9CisKKyAgTWFjaGluZUluc3RyICpwb3BfYmFja192YWwoKSB7CisgICAgTWFjaGluZUluc3RyICpJOworICAgIGRvIHsKKyAgICAgIEkgPSBXb3JrbGlzdC5wb3BfYmFja192YWwoKTsKKyAgICB9IHdoaWxlKCFJKTsKKyAgICBhc3NlcnQoSSAmJiAiUG9wIGJhY2sgb24gZW1wdHkgd29ya2xpc3QiKTsKKyAgICBXb3JrbGlzdE1hcC5lcmFzZShJKTsKKyAgICByZXR1cm4gSTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0uCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvSVJUcmFuc2xhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9JUlRyYW5zbGF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MDYxYzAxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvSVJUcmFuc2xhdG9yLmgKQEAgLTAsMCArMSw0NDQgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9JUlRyYW5zbGF0b3IuaCAtIElSVHJhbnNsYXRvciAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIElSVHJhbnNsYXRvciBwYXNzLgorLy8vIFRoaXMgcGFzcyBpcyByZXNwb25zaWJsZSBmb3IgdHJhbnNsYXRpbmcgTExWTSBJUiBpbnRvIE1hY2hpbmVJbnN0ci4KKy8vLyBJdCB1c2VzIHRhcmdldCBob29rcyB0byBsb3dlciB0aGUgQUJJIGJ1dCBhc2lkZSBmcm9tIHRoYXQsIHRoZSBwYXNzCisvLy8gZ2VuZXJhdGVkIGNvZGUgaXMgZ2VuZXJpYy4gVGhpcyBpcyB0aGUgZGVmYXVsdCB0cmFuc2xhdG9yIHVzZWQgZm9yCisvLy8gR2xvYmFsSVNlbC4KKy8vLworLy8vIFx0b2RvIFJlcGxhY2UgdGhlIGNvbW1lbnRzIHdpdGggYWN0dWFsIGRveHlnZW4gY29tbWVudHMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX0lSVFJBTlNMQVRPUl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX0lSVFJBTlNMQVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTWFjaGluZUlSQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL1R5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBbGxvY2FJbnN0OworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIENhbGxJbnN0OworY2xhc3MgQ2FsbExvd2VyaW5nOworY2xhc3MgQ29uc3RhbnQ7CitjbGFzcyBEYXRhTGF5b3V0OworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CitjbGFzcyBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyOworY2xhc3MgUEhJTm9kZTsKK2NsYXNzIFRhcmdldFBhc3NDb25maWc7CitjbGFzcyBVc2VyOworY2xhc3MgVmFsdWU7CisKKy8vIFRlY2huaWNhbGx5IHRoZSBwYXNzIHNob3VsZCBydW4gb24gYW4gaHlwb3RoZXRpY2FsIE1hY2hpbmVNb2R1bGUsCisvLyBzaW5jZSBpdCBzaG91bGQgdHJhbnNsYXRlIEdsb2JhbCBpbnRvIHNvbWUgc29ydCBvZiBNYWNoaW5lR2xvYmFsLgorLy8gVGhlIE1hY2hpbmVHbG9iYWwgc2hvdWxkIHVsdGltYXRlbHkganVzdCBiZSBhIHRyYW5zZmVyIG9mIG93bmVyc2hpcCBvZgorLy8gdGhlIGludGVyZXN0aW5nIGJpdHMgdGhhdCBhcmUgcmVsZXZhbnQgdG8gcmVwcmVzZW50IGEgZ2xvYmFsIHZhbHVlLgorLy8gVGhhdCBiZWluZyBzYWlkLCB3ZSBjb3VsZCBpbnZlc3RpZ2F0ZSB3aGF0IHdvdWxkIGl0IGNvc3QgdG8ganVzdCBkdXBsaWNhdGUKKy8vIHRoZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBMTFZNIElSLgorLy8gVGhlIGlkZWEgaXMgdGhhdCB1bHRpbWF0ZWx5IHdlIHdvdWxkIGJlIGFibGUgdG8gZnJlZSB1cCB0aGUgbWVtb3J5IHVzZWQKKy8vIGJ5IHRoZSBMTFZNIElSIGFzIHNvb24gYXMgdGhlIHRyYW5zbGF0aW9uIGlzIG92ZXIuCitjbGFzcyBJUlRyYW5zbGF0b3IgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCitwcml2YXRlOgorICAvLy8gSW50ZXJmYWNlIHVzZWQgdG8gbG93ZXIgdGhlIGV2ZXJ5dGhpbmcgcmVsYXRlZCB0byBjYWxscy4KKyAgY29uc3QgQ2FsbExvd2VyaW5nICpDTEk7CisKKyAgLy8vIE1hcHBpbmcgb2YgdGhlIHZhbHVlcyBvZiB0aGUgY3VycmVudCBMTFZNIElSIGZ1bmN0aW9uCisgIC8vLyB0byB0aGUgcmVsYXRlZCB2aXJ0dWFsIHJlZ2lzdGVycy4KKyAgVmFsdWVUb1ZSZWcgVmFsVG9WUmVnOworCisgIC8vIE4uYi4gaXQncyBub3QgY29tcGxldGVseSBvYnZpb3VzIHRoYXQgdGhpcyB3aWxsIGJlIHN1ZmZpY2llbnQgZm9yIGV2ZXJ5CisgIC8vIExMVk0gSVIgY29uc3RydWN0ICh3aXRoICJpbnZva2UiIGJlaW5nIHRoZSBvYnZpb3VzIGNhbmRpZGF0ZSB0byBtZXNzIHVwIG91cgorICAvLyBsaXZlcy4KKyAgRGVuc2VNYXA8Y29uc3QgQmFzaWNCbG9jayAqLCBNYWNoaW5lQmFzaWNCbG9jayAqPiBCQlRvTUJCOworCisgIC8vIE9uZSBCYXNpY0Jsb2NrIGNhbiBiZSB0cmFuc2xhdGVkIHRvIG11bHRpcGxlIE1hY2hpbmVCYXNpY0Jsb2Nrcy4gIEZvciBzdWNoCisgIC8vIEJhc2ljQmxvY2tzIHRyYW5zbGF0ZWQgdG8gbXVsdGlwbGUgTWFjaGluZUJhc2ljQmxvY2tzLCBNYWNoaW5lUHJlZHMgcmV0YWlucworICAvLyBhIG1hcHBpbmcgYmV0d2VlbiB0aGUgZWRnZXMgYXJyaXZpbmcgYXQgdGhlIEJhc2ljQmxvY2sgdG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAgLy8gY3JlYXRlZCBNYWNoaW5lQmFzaWNCbG9ja3MuIFNvbWUgQmFzaWNCbG9ja3MgdGhhdCBnZXQgdHJhbnNsYXRlZCB0byBhCisgIC8vIHNpbmdsZSBNYWNoaW5lQmFzaWNCbG9jayBtYXkgYWxzbyBlbmQgdXAgaW4gdGhpcyBNYXAuCisgIHVzaW5nIENGR0VkZ2UgPSBzdGQ6OnBhaXI8Y29uc3QgQmFzaWNCbG9jayAqLCBjb25zdCBCYXNpY0Jsb2NrICo+OworICBEZW5zZU1hcDxDRkdFZGdlLCBTbWFsbFZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayAqLCAxPj4gTWFjaGluZVByZWRzOworCisgIC8vIExpc3Qgb2Ygc3R1YmJlZCBQSEkgaW5zdHJ1Y3Rpb25zLCBmb3IgdmFsdWVzIGFuZCBiYXNpYyBibG9ja3MgdG8gYmUgZmlsbGVkCisgIC8vIGluIG9uY2UgYWxsIE1hY2hpbmVCYXNpY0Jsb2NrcyBoYXZlIGJlZW4gY3JlYXRlZC4KKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPGNvbnN0IFBISU5vZGUgKiwgTWFjaGluZUluc3RyICo+LCA0PiBQZW5kaW5nUEhJczsKKworICAvLy8gUmVjb3JkIG9mIHdoYXQgZnJhbWUgaW5kZXggaGFzIGJlZW4gYWxsb2NhdGVkIHRvIHNwZWNpZmllZCBhbGxvY2FzIGZvcgorICAvLy8gdGhpcyBmdW5jdGlvbi4KKyAgRGVuc2VNYXA8Y29uc3QgQWxsb2NhSW5zdCAqLCBpbnQ+IEZyYW1lSW5kaWNlczsKKworICAvLy8gXG5hbWUgTWV0aG9kcyBmb3IgdHJhbnNsYXRpbmcgZm9ybSBMTFZNIElSIHRvIE1hY2hpbmVJbnN0ci4KKyAgLy8vIFxzZWUgOjp0cmFuc2xhdGUgZm9yIGdlbmVyYWwgaW5mb3JtYXRpb24gb24gdGhlIHRyYW5zbGF0ZSBtZXRob2RzLgorICAvLy8gQHsKKworICAvLy8gVHJhbnNsYXRlIFxwIEluc3QgaW50byBpdHMgY29ycmVzcG9uZGluZyBNYWNoaW5lSW5zdHIgaW5zdHJ1Y3Rpb24ocykuCisgIC8vLyBJbnNlcnQgdGhlIG5ld2x5IHRyYW5zbGF0ZWQgaW5zdHJ1Y3Rpb24ocykgcmlnaHQgd2hlcmUgdGhlIEN1ckJ1aWxkZXIKKyAgLy8vIGlzIHNldC4KKyAgLy8vCisgIC8vLyBUaGUgZ2VuZXJhbCBhbGdvcml0aG0gaXM6CisgIC8vLyAxLiBMb29rIGZvciBhIHZpcnR1YWwgcmVnaXN0ZXIgZm9yIGVhY2ggb3BlcmFuZCBvcgorICAvLy8gICAgY3JlYXRlIG9uZS4KKyAgLy8vIDIgVXBkYXRlIHRoZSBWYWxUb1ZSZWcgYWNjb3JkaW5nbHkuCisgIC8vLyAyLmFsdC4gRm9yIGNvbnN0YW50IGFyZ3VtZW50cywgaWYgdGhleSBhcmUgY29tcGlsZSB0aW1lIGNvbnN0YW50cywKKyAgLy8vICAgcHJvZHVjZSBhbiBpbW1lZGlhdGUgaW4gdGhlIHJpZ2h0IG9wZXJhbmQgYW5kIGRvIG5vdCB0b3VjaAorICAvLy8gICBWYWxUb1JlZy4gQWN0dWFsbHkgd2Ugd2lsbCBnbyB3aXRoIGEgdmlydHVhbCByZWdpc3RlciBmb3IgZWFjaAorICAvLy8gICBjb25zdGFudHMgYmVjYXVzZSBpdCBtYXkgYmUgZXhwZW5zaXZlIHRvIGFjdHVhbGx5IG1hdGVyaWFsaXplIHRoZQorICAvLy8gICBjb25zdGFudC4gTW9yZW92ZXIsIGlmIHRoZSBjb25zdGFudCBzcGFucyBvbiBzZXZlcmFsIGluc3RydWN0aW9ucywKKyAgLy8vICAgQ1NFIG1heSBub3QgY2F0Y2ggdGhlbS4KKyAgLy8vICAgPT4gVXBkYXRlIFZhbFRvVlJlZyBhbmQgcmVtZW1iZXIgdGhhdCB3ZSBzYXcgYSBjb25zdGFudCBpbiBDb25zdGFudHMuCisgIC8vLyAgIFdlIHdpbGwgbWF0ZXJpYWxpemUgYWxsIHRoZSBjb25zdGFudHMgaW4gZmluYWxpemUuCisgIC8vLyBOb3RlOiB3ZSB3b3VsZCBuZWVkIHRvIGRvIHNvbWV0aGluZyBzbyB0aGF0IHdlIGNhbiByZWNvZ25pemUgc3VjaCBvcGVyYW5kCisgIC8vLyAgICAgICBhcyBjb25zdGFudHMuCisgIC8vLyAzLiBDcmVhdGUgdGhlIGdlbmVyaWMgaW5zdHJ1Y3Rpb24uCisgIC8vLworICAvLy8gXHJldHVybiB0cnVlIGlmIHRoZSB0cmFuc2xhdGlvbiBzdWNjZWVkZWQuCisgIGJvb2wgdHJhbnNsYXRlKGNvbnN0IEluc3RydWN0aW9uICZJbnN0KTsKKworICAvLy8gTWF0ZXJpYWxpemUgXHAgQyBpbnRvIHZpcnR1YWwtcmVnaXN0ZXIgXHAgUmVnLiBUaGUgZ2VuZXJpYyBpbnN0cnVjdGlvbnMKKyAgLy8vIHBlcmZvcm1pbmcgdGhpcyBtYXRlcmlhbGl6YXRpb24gd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBlbnRyeSBibG9jayBvZgorICAvLy8gdGhlIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gdHJ1ZSBpZiB0aGUgbWF0ZXJpYWxpemF0aW9uIHN1Y2NlZWRlZC4KKyAgYm9vbCB0cmFuc2xhdGUoY29uc3QgQ29uc3RhbnQgJkMsIHVuc2lnbmVkIFJlZyk7CisKKyAgLy8vIFRyYW5zbGF0ZSBhbiBMTFZNIGJpdGNhc3QgaW50byBnZW5lcmljIElSLiBFaXRoZXIgYSBDT1BZIG9yIGEgR19CSVRDQVNUIGlzCisgIC8vLyBlbWl0dGVkLgorICBib29sIHRyYW5zbGF0ZUJpdENhc3QoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcik7CisKKyAgLy8vIFRyYW5zbGF0ZSBhbiBMTFZNIGxvYWQgaW5zdHJ1Y3Rpb24gaW50byBnZW5lcmljIElSLgorICBib29sIHRyYW5zbGF0ZUxvYWQoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcik7CisKKyAgLy8vIFRyYW5zbGF0ZSBhbiBMTFZNIHN0b3JlIGluc3RydWN0aW9uIGludG8gZ2VuZXJpYyBJUi4KKyAgYm9vbCB0cmFuc2xhdGVTdG9yZShjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKTsKKworICAvLy8gVHJhbnNsYXRlIGFuIExMVk0gc3RyaW5nIGludHJpbnNpYyAobWVtY3B5LCBtZW1zZXQsIC4uLikuCisgIGJvb2wgdHJhbnNsYXRlTWVtZnVuYyhjb25zdCBDYWxsSW5zdCAmQ0ksIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbnRyaW5zaWMpOworCisgIHZvaWQgZ2V0U3RhY2tHdWFyZCh1bnNpZ25lZCBEc3RSZWcsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpOworCisgIGJvb2wgdHJhbnNsYXRlT3ZlcmZsb3dJbnRyaW5zaWMoY29uc3QgQ2FsbEluc3QgJkNJLCB1bnNpZ25lZCBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKTsKKworICBib29sIHRyYW5zbGF0ZUtub3duSW50cmluc2ljKGNvbnN0IENhbGxJbnN0ICZDSSwgSW50cmluc2ljOjpJRCBJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKTsKKworICBib29sIHRyYW5zbGF0ZUlubGluZUFzbShjb25zdCBDYWxsSW5zdCAmQ0ksIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpOworCisgIC8vLyBUcmFuc2xhdGUgY2FsbCBpbnN0cnVjdGlvbi4KKyAgLy8vIFxwcmUgXHAgVSBpcyBhIGNhbGwgaW5zdHJ1Y3Rpb24uCisgIGJvb2wgdHJhbnNsYXRlQ2FsbChjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKTsKKworICBib29sIHRyYW5zbGF0ZUludm9rZShjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKTsKKworICBib29sIHRyYW5zbGF0ZUxhbmRpbmdQYWQoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcik7CisKKyAgLy8vIFRyYW5zbGF0ZSBvbmUgb2YgTExWTSdzIGNhc3QgaW5zdHJ1Y3Rpb25zIGludG8gTWFjaGluZUluc3Rycywgd2l0aCB0aGUKKyAgLy8vIGdpdmVuIGdlbmVyaWMgT3Bjb2RlLgorICBib29sIHRyYW5zbGF0ZUNhc3QodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBVc2VyICZVLAorICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcik7CisKKyAgLy8vIFRyYW5zbGF0ZSBhIHBoaSBpbnN0cnVjdGlvbi4KKyAgYm9vbCB0cmFuc2xhdGVQSEkoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcik7CisKKyAgLy8vIFRyYW5zbGF0ZSBhIGNvbXBhcmlzb24gKGljbXAgb3IgZmNtcCkgaW5zdHJ1Y3Rpb24gb3IgY29uc3RhbnQuCisgIGJvb2wgdHJhbnNsYXRlQ29tcGFyZShjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKTsKKworICAvLy8gVHJhbnNsYXRlIGFuIGludGVnZXIgY29tcGFyZSBpbnN0cnVjdGlvbiAob3IgY29uc3RhbnQpLgorICBib29sIHRyYW5zbGF0ZUlDbXAoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVDb21wYXJlKFUsIE1JUkJ1aWxkZXIpOworICB9CisKKyAgLy8vIFRyYW5zbGF0ZSBhIGZsb2F0aW5nLXBvaW50IGNvbXBhcmUgaW5zdHJ1Y3Rpb24gKG9yIGNvbnN0YW50KS4KKyAgYm9vbCB0cmFuc2xhdGVGQ21wKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQ29tcGFyZShVLCBNSVJCdWlsZGVyKTsKKyAgfQorCisgIC8vLyBBZGQgcmVtYWluaW5nIG9wZXJhbmRzIG9udG8gcGhpcyB3ZSd2ZSB0cmFuc2xhdGVkLiBFeGVjdXRlZCBhZnRlciBhbGwKKyAgLy8vIE1hY2hpbmVCYXNpY0Jsb2NrcyBmb3IgdGhlIGZ1bmN0aW9uIGhhdmUgYmVlbiBjcmVhdGVkLgorICB2b2lkIGZpbmlzaFBlbmRpbmdQaGlzKCk7CisKKyAgLy8vIFRyYW5zbGF0ZSBccCBJbnN0IGludG8gYSBiaW5hcnkgb3BlcmF0aW9uIFxwIE9wY29kZS4KKyAgLy8vIFxwcmUgXHAgVSBpcyBhIGJpbmFyeSBvcGVyYXRpb24uCisgIGJvb2wgdHJhbnNsYXRlQmluYXJ5T3AodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBVc2VyICZVLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpOworCisgIC8vLyBUcmFuc2xhdGUgYnJhbmNoIChicikgaW5zdHJ1Y3Rpb24uCisgIC8vLyBccHJlIFxwIFUgaXMgYSBicmFuY2ggaW5zdHJ1Y3Rpb24uCisgIGJvb2wgdHJhbnNsYXRlQnIoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcik7CisKKyAgYm9vbCB0cmFuc2xhdGVTd2l0Y2goY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcik7CisKKyAgYm9vbCB0cmFuc2xhdGVJbmRpcmVjdEJyKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpOworCisgIGJvb2wgdHJhbnNsYXRlRXh0cmFjdFZhbHVlKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpOworCisgIGJvb2wgdHJhbnNsYXRlSW5zZXJ0VmFsdWUoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcik7CisKKyAgYm9vbCB0cmFuc2xhdGVTZWxlY3QoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcik7CisKKyAgYm9vbCB0cmFuc2xhdGVHZXRFbGVtZW50UHRyKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpOworCisgIGJvb2wgdHJhbnNsYXRlQWxsb2NhKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpOworCisgIC8vLyBUcmFuc2xhdGUgcmV0dXJuIChyZXQpIGluc3RydWN0aW9uLgorICAvLy8gVGhlIHRhcmdldCBuZWVkcyB0byBpbXBsZW1lbnQgQ2FsbExvd2VyaW5nOjpsb3dlclJldHVybiBmb3IKKyAgLy8vIHRoaXMgdG8gc3VjY2VlZC4KKyAgLy8vIFxwcmUgXHAgVSBpcyBhIHJldHVybiBpbnN0cnVjdGlvbi4KKyAgYm9vbCB0cmFuc2xhdGVSZXQoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcik7CisKKyAgYm9vbCB0cmFuc2xhdGVGU3ViKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpOworCisgIGJvb2wgdHJhbnNsYXRlQWRkKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQmluYXJ5T3AoVGFyZ2V0T3Bjb2RlOjpHX0FERCwgVSwgTUlSQnVpbGRlcik7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVTdWIoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVCaW5hcnlPcChUYXJnZXRPcGNvZGU6OkdfU1VCLCBVLCBNSVJCdWlsZGVyKTsKKyAgfQorICBib29sIHRyYW5zbGF0ZUFuZChjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUJpbmFyeU9wKFRhcmdldE9wY29kZTo6R19BTkQsIFUsIE1JUkJ1aWxkZXIpOworICB9CisgIGJvb2wgdHJhbnNsYXRlTXVsKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQmluYXJ5T3AoVGFyZ2V0T3Bjb2RlOjpHX01VTCwgVSwgTUlSQnVpbGRlcik7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVPcihjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUJpbmFyeU9wKFRhcmdldE9wY29kZTo6R19PUiwgVSwgTUlSQnVpbGRlcik7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVYb3IoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVCaW5hcnlPcChUYXJnZXRPcGNvZGU6OkdfWE9SLCBVLCBNSVJCdWlsZGVyKTsKKyAgfQorCisgIGJvb2wgdHJhbnNsYXRlVURpdihjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUJpbmFyeU9wKFRhcmdldE9wY29kZTo6R19VRElWLCBVLCBNSVJCdWlsZGVyKTsKKyAgfQorICBib29sIHRyYW5zbGF0ZVNEaXYoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVCaW5hcnlPcChUYXJnZXRPcGNvZGU6OkdfU0RJViwgVSwgTUlSQnVpbGRlcik7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVVUmVtKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQmluYXJ5T3AoVGFyZ2V0T3Bjb2RlOjpHX1VSRU0sIFUsIE1JUkJ1aWxkZXIpOworICB9CisgIGJvb2wgdHJhbnNsYXRlU1JlbShjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUJpbmFyeU9wKFRhcmdldE9wY29kZTo6R19TUkVNLCBVLCBNSVJCdWlsZGVyKTsKKyAgfQorICBib29sIHRyYW5zbGF0ZUludFRvUHRyKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQ2FzdChUYXJnZXRPcGNvZGU6OkdfSU5UVE9QVFIsIFUsIE1JUkJ1aWxkZXIpOworICB9CisgIGJvb2wgdHJhbnNsYXRlUHRyVG9JbnQoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVDYXN0KFRhcmdldE9wY29kZTo6R19QVFJUT0lOVCwgVSwgTUlSQnVpbGRlcik7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVUcnVuYyhjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUNhc3QoVGFyZ2V0T3Bjb2RlOjpHX1RSVU5DLCBVLCBNSVJCdWlsZGVyKTsKKyAgfQorICBib29sIHRyYW5zbGF0ZUZQVHJ1bmMoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVDYXN0KFRhcmdldE9wY29kZTo6R19GUFRSVU5DLCBVLCBNSVJCdWlsZGVyKTsKKyAgfQorICBib29sIHRyYW5zbGF0ZUZQRXh0KGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQ2FzdChUYXJnZXRPcGNvZGU6OkdfRlBFWFQsIFUsIE1JUkJ1aWxkZXIpOworICB9CisgIGJvb2wgdHJhbnNsYXRlRlBUb1VJKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQ2FzdChUYXJnZXRPcGNvZGU6OkdfRlBUT1VJLCBVLCBNSVJCdWlsZGVyKTsKKyAgfQorICBib29sIHRyYW5zbGF0ZUZQVG9TSShjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUNhc3QoVGFyZ2V0T3Bjb2RlOjpHX0ZQVE9TSSwgVSwgTUlSQnVpbGRlcik7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVVSVRvRlAoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVDYXN0KFRhcmdldE9wY29kZTo6R19VSVRPRlAsIFUsIE1JUkJ1aWxkZXIpOworICB9CisgIGJvb2wgdHJhbnNsYXRlU0lUb0ZQKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQ2FzdChUYXJnZXRPcGNvZGU6OkdfU0lUT0ZQLCBVLCBNSVJCdWlsZGVyKTsKKyAgfQorICBib29sIHRyYW5zbGF0ZVVucmVhY2hhYmxlKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBib29sIHRyYW5zbGF0ZVNFeHQoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVDYXN0KFRhcmdldE9wY29kZTo6R19TRVhULCBVLCBNSVJCdWlsZGVyKTsKKyAgfQorCisgIGJvb2wgdHJhbnNsYXRlWkV4dChjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUNhc3QoVGFyZ2V0T3Bjb2RlOjpHX1pFWFQsIFUsIE1JUkJ1aWxkZXIpOworICB9CisKKyAgYm9vbCB0cmFuc2xhdGVTaGwoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVCaW5hcnlPcChUYXJnZXRPcGNvZGU6OkdfU0hMLCBVLCBNSVJCdWlsZGVyKTsKKyAgfQorICBib29sIHRyYW5zbGF0ZUxTaHIoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVCaW5hcnlPcChUYXJnZXRPcGNvZGU6OkdfTFNIUiwgVSwgTUlSQnVpbGRlcik7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVBU2hyKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQmluYXJ5T3AoVGFyZ2V0T3Bjb2RlOjpHX0FTSFIsIFUsIE1JUkJ1aWxkZXIpOworICB9CisKKyAgYm9vbCB0cmFuc2xhdGVGQWRkKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQmluYXJ5T3AoVGFyZ2V0T3Bjb2RlOjpHX0ZBREQsIFUsIE1JUkJ1aWxkZXIpOworICB9CisgIGJvb2wgdHJhbnNsYXRlRk11bChjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIHRyYW5zbGF0ZUJpbmFyeU9wKFRhcmdldE9wY29kZTo6R19GTVVMLCBVLCBNSVJCdWlsZGVyKTsKKyAgfQorICBib29sIHRyYW5zbGF0ZUZEaXYoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiB0cmFuc2xhdGVCaW5hcnlPcChUYXJnZXRPcGNvZGU6OkdfRkRJViwgVSwgTUlSQnVpbGRlcik7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVGUmVtKGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gdHJhbnNsYXRlQmluYXJ5T3AoVGFyZ2V0T3Bjb2RlOjpHX0ZSRU0sIFUsIE1JUkJ1aWxkZXIpOworICB9CisKKyAgYm9vbCB0cmFuc2xhdGVWQUFyZyhjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKTsKKworICBib29sIHRyYW5zbGF0ZUluc2VydEVsZW1lbnQoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcik7CisKKyAgYm9vbCB0cmFuc2xhdGVFeHRyYWN0RWxlbWVudChjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKTsKKworICBib29sIHRyYW5zbGF0ZVNodWZmbGVWZWN0b3IoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcik7CisKKyAgLy8gU3R1YnMgdG8ga2VlcCB0aGUgY29tcGlsZXIgaGFwcHkgd2hpbGUgd2UgaW1wbGVtZW50IHRoZSByZXN0IG9mIHRoZQorICAvLyB0cmFuc2xhdGlvbi4KKyAgYm9vbCB0cmFuc2xhdGVSZXN1bWUoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBib29sIHRyYW5zbGF0ZUNsZWFudXBSZXQoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBib29sIHRyYW5zbGF0ZUNhdGNoUmV0KGNvbnN0IFVzZXIgJlUsIE1hY2hpbmVJUkJ1aWxkZXIgJk1JUkJ1aWxkZXIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgYm9vbCB0cmFuc2xhdGVDYXRjaFN3aXRjaChjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGJvb2wgdHJhbnNsYXRlRmVuY2UoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBib29sIHRyYW5zbGF0ZUF0b21pY0NtcFhjaGcoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBib29sIHRyYW5zbGF0ZUF0b21pY1JNVyhjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGJvb2wgdHJhbnNsYXRlQWRkclNwYWNlQ2FzdChjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGJvb2wgdHJhbnNsYXRlQ2xlYW51cFBhZChjb25zdCBVc2VyICZVLCBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGJvb2wgdHJhbnNsYXRlQ2F0Y2hQYWQoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBib29sIHRyYW5zbGF0ZVVzZXJPcDEoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBib29sIHRyYW5zbGF0ZVVzZXJPcDIoY29uc3QgVXNlciAmVSwgTWFjaGluZUlSQnVpbGRlciAmTUlSQnVpbGRlcikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBAfQorCisgIC8vIEJ1aWxkZXIgZm9yIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gYSBsYSBJUkJ1aWxkZXIuCisgIC8vIEkuZS4sIGNvbXBhcmVkIHRvIHJlZ3VsYXIgTUlCdWlsZGVyLCB0aGlzIG9uZSBhbHNvIGluc2VydHMgdGhlIGluc3RydWN0aW9uCisgIC8vIGluIHRoZSBjdXJyZW50IGJsb2NrLCBpdCBjYW4gY3JlYXRlcyBibG9jaywgZXRjLiwgYmFzaWNhbGx5IGEga2luZCBvZgorICAvLyBJUkJ1aWxkZXIsIGJ1dCBmb3IgTWFjaGluZSBJUi4KKyAgTWFjaGluZUlSQnVpbGRlciBDdXJCdWlsZGVyOworCisgIC8vIEJ1aWxkZXIgc2V0IHRvIHRoZSBlbnRyeSBibG9jayAoanVzdCBhZnRlciBBQkkgbG93ZXJpbmcgaW5zdHJ1Y3Rpb25zKS4gVXNlZAorICAvLyBhcyBhIGNvbnZlbmllbnQgbG9jYXRpb24gZm9yIENvbnN0YW50cy4KKyAgTWFjaGluZUlSQnVpbGRlciBFbnRyeUJ1aWxkZXI7CisKKyAgLy8gVGhlIE1hY2hpbmVGdW5jdGlvbiBjdXJyZW50bHkgYmVpbmcgdHJhbnNsYXRlZC4KKyAgTWFjaGluZUZ1bmN0aW9uICpNRjsKKworICAvLy8gTWFjaGluZVJlZ2lzdGVySW5mbyB1c2VkIHRvIGNyZWF0ZSB2aXJ0dWFsIHJlZ2lzdGVycy4KKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJID0gbnVsbHB0cjsKKworICBjb25zdCBEYXRhTGF5b3V0ICpETDsKKworICAvLy8gQ3VycmVudCB0YXJnZXQgY29uZmlndXJhdGlvbi4gQ29udHJvbHMgaG93IHRoZSBwYXNzIGhhbmRsZXMgZXJyb3JzLgorICBjb25zdCBUYXJnZXRQYXNzQ29uZmlnICpUUEM7CisKKyAgLy8vIEN1cnJlbnQgb3B0aW1pemF0aW9uIHJlbWFyayBlbWl0dGVyLiBVc2VkIHRvIHJlcG9ydCBmYWlsdXJlcy4KKyAgc3RkOjp1bmlxdWVfcHRyPE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXI+IE9SRTsKKworICAvLyAqIEluc2VydCBhbGwgdGhlIGNvZGUgbmVlZGVkIHRvIG1hdGVyaWFsaXplIHRoZSBjb25zdGFudHMKKyAgLy8gYXQgdGhlIHByb3BlciBwbGFjZS4gRS5nLiwgRW50cnkgYmxvY2sgb3IgZG9taW5hdG9yIGJsb2NrCisgIC8vIG9mIGVhY2ggY29uc3RhbnQgZGVwZW5kaW5nIG9uIGhvdyBmYW5jeSB3ZSB3YW50IHRvIGJlLgorICAvLyAqIENsZWFyIHRoZSBkaWZmZXJlbnQgbWFwcy4KKyAgdm9pZCBmaW5hbGl6ZUZ1bmN0aW9uKCk7CisKKyAgLy8vIEdldCB0aGUgVlJlZyB0aGF0IHJlcHJlc2VudHMgXHAgVmFsLgorICAvLy8gSWYgc3VjaCBWUmVnIGRvZXMgbm90IGV4aXN0LCBpdCBpcyBjcmVhdGVkLgorICB1bnNpZ25lZCBnZXRPckNyZWF0ZVZSZWcoY29uc3QgVmFsdWUgJlZhbCk7CisKKyAgLy8vIEdldCB0aGUgZnJhbWUgaW5kZXggdGhhdCByZXByZXNlbnRzIFxwIFZhbC4KKyAgLy8vIElmIHN1Y2ggVlJlZyBkb2VzIG5vdCBleGlzdCwgaXQgaXMgY3JlYXRlZC4KKyAgaW50IGdldE9yQ3JlYXRlRnJhbWVJbmRleChjb25zdCBBbGxvY2FJbnN0ICZBSSk7CisKKyAgLy8vIEdldCB0aGUgYWxpZ25tZW50IG9mIHRoZSBnaXZlbiBtZW1vcnkgb3BlcmF0aW9uIGluc3RydWN0aW9uLiBUaGlzIHdpbGwKKyAgLy8vIGVpdGhlciBiZSB0aGUgZXhwbGljaXRseSBzcGVjaWZpZWQgdmFsdWUgb3IgdGhlIEFCSS1yZXF1aXJlZCBhbGlnbm1lbnQgZm9yCisgIC8vLyB0aGUgdHlwZSBiZWluZyBhY2Nlc3NlZCAoYWNjb3JkaW5nIHRvIHRoZSBNb2R1bGUncyBEYXRhTGF5b3V0KS4KKyAgdW5zaWduZWQgZ2V0TWVtT3BBbGlnbm1lbnQoY29uc3QgSW5zdHJ1Y3Rpb24gJkkpOworCisgIC8vLyBHZXQgdGhlIE1hY2hpbmVCYXNpY0Jsb2NrIHRoYXQgcmVwcmVzZW50cyBccCBCQi4gU3BlY2lmaWNhbGx5LCB0aGUgYmxvY2sKKyAgLy8vIHJldHVybmVkIHdpbGwgYmUgdGhlIGhlYWQgb2YgdGhlIHRyYW5zbGF0ZWQgYmxvY2sgKHN1aXRhYmxlIGZvciBicmFuY2gKKyAgLy8vIGRlc3RpbmF0aW9ucykuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICZnZXRNQkIoY29uc3QgQmFzaWNCbG9jayAmQkIpOworCisgIC8vLyBSZWNvcmQgXHAgTmV3UHJlZCBhcyBhIE1hY2hpbmUgcHJlZGVjZXNzb3IgdG8gYEVkZ2Uuc2Vjb25kYCwgY29ycmVzcG9uZGluZworICAvLy8gdG8gYEVkZ2UuZmlyc3RgIGF0IHRoZSBJUiBsZXZlbC4gVGhpcyBpcyB1c2VkIHdoZW4gSVJUcmFuc2xhdGlvbiBjcmVhdGVzCisgIC8vLyBtdWx0aXBsZSBNYWNoaW5lQmFzaWNCbG9ja3MgZm9yIGEgZ2l2ZW4gSVIgYmxvY2sgYW5kIHRoZSBDRkcgaXMgbm8gbG9uZ2VyCisgIC8vLyByZXByZXNlbnRlZCBzaW1wbHkgYnkgdGhlIElSLWxldmVsIENGRy4KKyAgdm9pZCBhZGRNYWNoaW5lQ0ZHUHJlZChDRkdFZGdlIEVkZ2UsIE1hY2hpbmVCYXNpY0Jsb2NrICpOZXdQcmVkKTsKKworICAvLy8gUmV0dXJucyB0aGUgTWFjaGluZSBJUiBwcmVkZWNlc3NvcnMgZm9yIHRoZSBnaXZlbiBJUiBDRkcgZWRnZS4gVXN1YWxseQorICAvLy8gdGhpcyBpcyBqdXN0IHRoZSBzaW5nbGUgTWFjaGluZUJhc2ljQmxvY2sgY29ycmVzcG9uZGluZyB0byB0aGUgcHJlZGVjZXNzb3IKKyAgLy8vIGluIHRoZSBJUi4gTW9yZSBjb21wbGV4IGxvd2VyaW5nIGNhbiByZXN1bHQgaW4gbXVsdGlwbGUgTWFjaGluZUJhc2ljQmxvY2tzCisgIC8vLyBwcmVjZWRpbmcgdGhlIG9yaWdpbmFsIHRob3VnaCAoZS5nLiBzd2l0Y2ggaW5zdHJ1Y3Rpb25zKS4KKyAgU21hbGxWZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sgKiwgMT4gZ2V0TWFjaGluZVByZWRCQnMoQ0ZHRWRnZSBFZGdlKSB7CisgICAgYXV0byBSZW1hcHBlZEVkZ2UgPSBNYWNoaW5lUHJlZHMuZmluZChFZGdlKTsKKyAgICBpZiAoUmVtYXBwZWRFZGdlICE9IE1hY2hpbmVQcmVkcy5lbmQoKSkKKyAgICAgIHJldHVybiBSZW1hcHBlZEVkZ2UtPnNlY29uZDsKKyAgICByZXR1cm4gU21hbGxWZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sgKiwgND4oMSwgJmdldE1CQigqRWRnZS5maXJzdCkpOworICB9CisKK3B1YmxpYzoKKyAgLy8gQ3Rvciwgbm90aGluZyBmYW5jeS4KKyAgSVJUcmFuc2xhdG9yKCk7CisKKyAgU3RyaW5nUmVmIGdldFBhc3NOYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIklSVHJhbnNsYXRvciI7IH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vIEFsZ286CisgIC8vICAgQ2FsbExvd2VyaW5nID0gTUYuc3VidGFyZ2V0LmdldENhbGxMb3dlcmluZygpCisgIC8vICAgRiA9IE1GLmdldFBhcmVudCgpCisgIC8vICAgTUlSQnVpbGRlci5yZXNldChNRikKKyAgLy8gICBnZXRNQkIoRi5nZXRFbnRyeUJCKCkpCisgIC8vICAgQ2FsbExvd2VyaW5nLT50cmFuc2xhdGVBcmd1bWVudHMoTUlSQnVpbGRlciwgRiwgVmFsVG9WUmVnKQorICAvLyAgIGZvciBlYWNoIGJiIGluIEYKKyAgLy8gICAgIGdldE1CQihiYikKKyAgLy8gICAgIGZvciBlYWNoIGluc3QgaW4gYmIKKyAgLy8gICAgICAgaWYgKCF0cmFuc2xhdGUoTUlSQnVpbGRlciwgaW5zdCwgVmFsVG9WUmVnLCBDb25zdGFudFRvU2VxdWVuY2UpKQorICAvLyAgICAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiRG9uJ3Qga25vdyBob3cgdG8gdHJhbnNsYXRlIGlucHV0Iik7CisgIC8vICAgZmluYWxpemUoKQorICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIG92ZXJyaWRlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX0lSVFJBTlNMQVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9JbnN0cnVjdGlvblNlbGVjdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvSW5zdHJ1Y3Rpb25TZWxlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTUyMWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvSW5zdHJ1Y3Rpb25TZWxlY3QuaApAQCAtMCwwICsxLDUzIEBACisvLz09IGxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0luc3RydWN0aW9uU2VsZWN0LmggLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIGludGVyZmFjZSBvZiB0aGUgTWFjaGluZUZ1bmN0aW9uUGFzcworLy8vIHJlc3BvbnNpYmxlIGZvciBzZWxlY3RpbmcgKHBvc3NpYmx5IGdlbmVyaWMpIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIHRvCisvLy8gdGFyZ2V0LXNwZWNpZmljIGluc3RydWN0aW9ucy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfSU5TVFJVQ1RJT05TRUxFQ1RfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9JTlNUUlVDVElPTlNFTEVDVF9ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9JbnN0cnVjdGlvblNlbGVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworLy8vIFRoaXMgcGFzcyBpcyByZXNwb25zaWJsZSBmb3Igc2VsZWN0aW5nIGdlbmVyaWMgbWFjaGluZSBpbnN0cnVjdGlvbnMgdG8KKy8vLyB0YXJnZXQtc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zLiAgSXQgcmVsaWVzIG9uIHRoZSBJbnN0cnVjdGlvblNlbGVjdG9yIHByb3ZpZGVkCisvLy8gYnkgdGhlIHRhcmdldC4KKy8vLyBTZWxlY3Rpb24gaXMgZG9uZSBieSBleGFtaW5pbmcgYmxvY2tzIGluIHBvc3Qtb3JkZXIsIGFuZCBpbnN0cnVjdGlvbnMgaW4KKy8vLyByZXZlcnNlIG9yZGVyLgorLy8vCisvLy8gXHBvc3QgZm9yIGFsbCBpbnN0IGluIE1GOiBub3QgaXNQcmVJU2VsR2VuZXJpY09wY29kZShpbnN0Lm9wY29kZSkKK2NsYXNzIEluc3RydWN0aW9uU2VsZWN0IDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKyAgU3RyaW5nUmVmIGdldFBhc3NOYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIkluc3RydWN0aW9uU2VsZWN0IjsgfQorCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcyBnZXRSZXF1aXJlZFByb3BlcnRpZXMoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMoKQorICAgICAgICAuc2V0KE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXM6OlByb3BlcnR5OjpJc1NTQSkKKyAgICAgICAgLnNldChNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzOjpQcm9wZXJ0eTo6TGVnYWxpemVkKQorICAgICAgICAuc2V0KE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXM6OlByb3BlcnR5OjpSZWdCYW5rU2VsZWN0ZWQpOworICB9CisKKyAgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcyBnZXRTZXRQcm9wZXJ0aWVzKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzKCkuc2V0KAorICAgICAgICBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzOjpQcm9wZXJ0eTo6U2VsZWN0ZWQpOworICB9CisKKyAgSW5zdHJ1Y3Rpb25TZWxlY3QoKTsKKworICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIG92ZXJyaWRlOworfTsKK30gLy8gRW5kIG5hbWVzcGFjZSBsbHZtLgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0luc3RydWN0aW9uU2VsZWN0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0luc3RydWN0aW9uU2VsZWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWNkMTM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvSW5zdHJ1Y3Rpb25TZWxlY3Rvci5oCkBAIC0wLDAgKzEsMzgxIEBACisvLz09PS0gbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvSW5zdHJ1Y3Rpb25TZWxlY3Rvci5oIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZSBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIEFQSSBmb3IgdGhlIGluc3RydWN0aW9uIHNlbGVjdG9yLgorLy8vIFRoaXMgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHNlbGVjdGluZyBtYWNoaW5lIGluc3RydWN0aW9ucy4KKy8vLyBJdCdzIGltcGxlbWVudGVkIGJ5IHRoZSB0YXJnZXQuIEl0J3MgdXNlZCBieSB0aGUgSW5zdHJ1Y3Rpb25TZWxlY3QgcGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX0lOU1RSVUNUSU9OU0VMRUNUT1JfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9JTlNUUlVDVElPTlNFTEVDVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db2RlR2VuQ292ZXJhZ2UuaCIKKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQVBJbnQ7CitjbGFzcyBBUEZsb2F0OworY2xhc3MgTExUOworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgTWFjaGluZUluc3RyQnVpbGRlcjsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVPcGVyYW5kOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIFJlZ2lzdGVyQmFua0luZm87CitjbGFzcyBUYXJnZXRJbnN0ckluZm87CitjbGFzcyBUYXJnZXRSZWdpc3RlckNsYXNzOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworCisvLy8gQ29udGFpbmVyIGNsYXNzIGZvciBDb2RlR2VuIHByZWRpY2F0ZSByZXN1bHRzLgorLy8vIFRoaXMgaXMgY29udmVuaWVudCBiZWNhdXNlIHN0ZDo6Yml0c2V0IGRvZXMgbm90IGhhdmUgYSBjb25zdHJ1Y3RvcgorLy8vIHdpdGggYW4gaW5pdGlhbGl6ZXIgbGlzdCBvZiBzZXQgYml0cy4KKy8vLworLy8vIEVhY2ggSW5zdHJ1Y3Rpb25TZWxlY3RvciBzdWJjbGFzcyBzaG91bGQgZGVmaW5lIGEgUHJlZGljYXRlQml0c2V0IGNsYXNzCisvLy8gd2l0aDoKKy8vLyAgIGNvbnN0IHVuc2lnbmVkIE1BWF9TVUJUQVJHRVRfUFJFRElDQVRFUyA9IDE5MjsKKy8vLyAgIHVzaW5nIFByZWRpY2F0ZUJpdHNldCA9IFByZWRpY2F0ZUJpdHNldEltcGw8TUFYX1NVQlRBUkdFVF9QUkVESUNBVEVTPjsKKy8vLyBhbmQgdXBkYXRpbmcgdGhlIGNvbnN0YW50IHRvIHN1aXQgdGhlIHRhcmdldC4gVGFibGVnZW4gcHJvdmlkZXMgYSBzdWl0YWJsZQorLy8vIGRlZmluaXRpb24gZm9yIHRoZSBwcmVkaWNhdGVzIGluIHVzZSBpbiA8VGFyZ2V0Pkdlbkdsb2JhbElTZWwuaW5jIHdoZW4KKy8vLyBHRVRfR0xPQkFMSVNFTF9QUkVESUNBVEVfQklUU0VUIGlzIGRlZmluZWQuCit0ZW1wbGF0ZSA8c3RkOjpzaXplX3QgTWF4UHJlZGljYXRlcz4KK2NsYXNzIFByZWRpY2F0ZUJpdHNldEltcGwgOiBwdWJsaWMgc3RkOjpiaXRzZXQ8TWF4UHJlZGljYXRlcz4geworcHVibGljOgorICAvLyBDYW5ub3QgaW5oZXJpdCBjb25zdHJ1Y3RvcnMgYmVjYXVzZSBpdCdzIG5vdCBzdXBwb3J0ZWQgYnkgVkMrKy4uCisgIFByZWRpY2F0ZUJpdHNldEltcGwoKSA9IGRlZmF1bHQ7CisKKyAgUHJlZGljYXRlQml0c2V0SW1wbChjb25zdCBzdGQ6OmJpdHNldDxNYXhQcmVkaWNhdGVzPiAmQikKKyAgICAgIDogc3RkOjpiaXRzZXQ8TWF4UHJlZGljYXRlcz4oQikge30KKworICBQcmVkaWNhdGVCaXRzZXRJbXBsKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDx1bnNpZ25lZD4gSW5pdCkgeworICAgIGZvciAoYXV0byBJIDogSW5pdCkKKyAgICAgIHN0ZDo6Yml0c2V0PE1heFByZWRpY2F0ZXM+OjpzZXQoSSk7CisgIH0KK307CisKK2VudW0geworICAvLy8gQmVnaW4gYSB0cnktYmxvY2sgdG8gYXR0ZW1wdCBhIG1hdGNoIGFuZCBqdW1wIHRvIE9uRmFpbCBpZiBpdCBpcworICAvLy8gdW5zdWNjZXNzZnVsLgorICAvLy8gLSBPbkZhaWwgLSBUaGUgTWF0Y2hUYWJsZSBlbnRyeSBhdCB3aGljaCB0byByZXN1bWUgaWYgdGhlIG1hdGNoIGZhaWxzLgorICAvLy8KKyAgLy8vIEZJWE1FOiBUaGlzIG91Z2h0IHRvIHRha2UgYW4gYXJndW1lbnQgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIHRyeS1ibG9ja3MKKyAgLy8vICAgICAgICB0byBleGl0IG9uIGZhaWx1cmUuIEl0J3MgdXN1YWxseSBvbmUgYnV0IHRoZSBsYXN0IG1hdGNoIGF0dGVtcHQgb2YKKyAgLy8vICAgICAgICBhIGJsb2NrIHdpbGwgbmVlZCBtb3JlLiBUaGUgKGltcGxlbWVudGVkKSBhbHRlcm5hdGl2ZSBpcyB0byB0YWNrIGEKKyAgLy8vICAgICAgICBHSU1fUmVqZWN0IG9uIHRoZSBlbmQgb2YgZWFjaCB0cnktYmxvY2sgd2hpY2ggaXMgc2ltcGxlciBidXQKKyAgLy8vICAgICAgICByZXF1aXJlcyBhbiBleHRyYSBvcGNvZGUgYW5kIGl0ZXJhdGlvbiBpbiB0aGUgaW50ZXJwcmV0ZXIgb24gZWFjaAorICAvLy8gICAgICAgIGZhaWxlZCBtYXRjaC4KKyAgR0lNX1RyeSwKKworICAvLy8gUmVjb3JkIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24KKyAgLy8vIC0gTmV3SW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQgdG8gZGVmaW5lCisgIC8vLyAtIEluc25JRCAtIEluc3RydWN0aW9uIElECisgIC8vLyAtIE9wSWR4IC0gT3BlcmFuZCBpbmRleAorICBHSU1fUmVjb3JkSW5zbiwKKworICAvLy8gQ2hlY2sgdGhlIGZlYXR1cmUgYml0cworICAvLy8gLSBFeHBlY3RlZCBmZWF0dXJlcworICBHSU1fQ2hlY2tGZWF0dXJlcywKKworICAvLy8gQ2hlY2sgdGhlIG9wY29kZSBvbiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uCisgIC8vLyAtIEluc25JRCAtIEluc3RydWN0aW9uIElECisgIC8vLyAtIEV4cGVjdGVkIG9wY29kZQorICBHSU1fQ2hlY2tPcGNvZGUsCisgIC8vLyBDaGVjayB0aGUgaW5zdHJ1Y3Rpb24gaGFzIHRoZSByaWdodCBudW1iZXIgb2Ygb3BlcmFuZHMKKyAgLy8vIC0gSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQKKyAgLy8vIC0gRXhwZWN0ZWQgbnVtYmVyIG9mIG9wZXJhbmRzCisgIEdJTV9DaGVja051bU9wZXJhbmRzLAorICAvLy8gQ2hlY2sgYW4gaW1tZWRpYXRlIHByZWRpY2F0ZSBvbiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uCisgIC8vLyAtIEluc25JRCAtIEluc3RydWN0aW9uIElECisgIC8vLyAtIFRoZSBwcmVkaWNhdGUgdG8gdGVzdAorICBHSU1fQ2hlY2tJNjRJbW1QcmVkaWNhdGUsCisgIC8vLyBDaGVjayBhbiBpbW1lZGlhdGUgcHJlZGljYXRlIG9uIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gdmlhIGFuIEFQSW50LgorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRAorICAvLy8gLSBUaGUgcHJlZGljYXRlIHRvIHRlc3QKKyAgR0lNX0NoZWNrQVBJbnRJbW1QcmVkaWNhdGUsCisgIC8vLyBDaGVjayBhIGZsb2F0aW5nIHBvaW50IGltbWVkaWF0ZSBwcmVkaWNhdGUgb24gdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbi4KKyAgLy8vIC0gSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQKKyAgLy8vIC0gVGhlIHByZWRpY2F0ZSB0byB0ZXN0CisgIEdJTV9DaGVja0FQRmxvYXRJbW1QcmVkaWNhdGUsCisgIC8vLyBDaGVjayBhIG1lbW9yeSBvcGVyYXRpb24gaGFzIHRoZSBzcGVjaWZpZWQgYXRvbWljIG9yZGVyaW5nLgorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRAorICAvLy8gLSBPcmRlcmluZyAtIFRoZSBBdG9taWNPcmRlcmluZyB2YWx1ZQorICBHSU1fQ2hlY2tBdG9taWNPcmRlcmluZywKKyAgR0lNX0NoZWNrQXRvbWljT3JkZXJpbmdPclN0cm9uZ2VyVGhhbiwKKyAgR0lNX0NoZWNrQXRvbWljT3JkZXJpbmdXZWFrZXJUaGFuLAorCisgIC8vLyBDaGVjayB0aGUgdHlwZSBmb3IgdGhlIHNwZWNpZmllZCBvcGVyYW5kCisgIC8vLyAtIEluc25JRCAtIEluc3RydWN0aW9uIElECisgIC8vLyAtIE9wSWR4IC0gT3BlcmFuZCBpbmRleAorICAvLy8gLSBFeHBlY3RlZCB0eXBlCisgIEdJTV9DaGVja1R5cGUsCisgIC8vLyBDaGVjayB0aGUgdHlwZSBvZiBhIHBvaW50ZXIgdG8gYW55IGFkZHJlc3Mgc3BhY2UuCisgIC8vLyAtIEluc25JRCAtIEluc3RydWN0aW9uIElECisgIC8vLyAtIE9wSWR4IC0gT3BlcmFuZCBpbmRleAorICAvLy8gLSBTaXplSW5CaXRzIC0gVGhlIHNpemUgb2YgdGhlIHBvaW50ZXIgdmFsdWUgaW4gYml0cy4KKyAgR0lNX0NoZWNrUG9pbnRlclRvQW55LAorICAvLy8gQ2hlY2sgdGhlIHJlZ2lzdGVyIGJhbmsgZm9yIHRoZSBzcGVjaWZpZWQgb3BlcmFuZAorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRAorICAvLy8gLSBPcElkeCAtIE9wZXJhbmQgaW5kZXgKKyAgLy8vIC0gRXhwZWN0ZWQgcmVnaXN0ZXIgYmFuayAoc3BlY2lmaWVkIGFzIGEgcmVnaXN0ZXIgY2xhc3MpCisgIEdJTV9DaGVja1JlZ0JhbmtGb3JDbGFzcywKKyAgLy8vIENoZWNrIHRoZSBvcGVyYW5kIG1hdGNoZXMgYSBjb21wbGV4IHByZWRpY2F0ZQorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRAorICAvLy8gLSBPcElkeCAtIE9wZXJhbmQgaW5kZXgKKyAgLy8vIC0gUmVuZGVyZXJJRCAtIFRoZSByZW5kZXJlciB0byBob2xkIHRoZSByZXN1bHQKKyAgLy8vIC0gQ29tcGxleCBwcmVkaWNhdGUgSUQKKyAgR0lNX0NoZWNrQ29tcGxleFBhdHRlcm4sCisgIC8vLyBDaGVjayB0aGUgb3BlcmFuZCBpcyBhIHNwZWNpZmljIGludGVnZXIKKyAgLy8vIC0gSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQKKyAgLy8vIC0gT3BJZHggLSBPcGVyYW5kIGluZGV4CisgIC8vLyAtIEV4cGVjdGVkIGludGVnZXIKKyAgR0lNX0NoZWNrQ29uc3RhbnRJbnQsCisgIC8vLyBDaGVjayB0aGUgb3BlcmFuZCBpcyBhIHNwZWNpZmljIGxpdGVyYWwgaW50ZWdlciAoaS5lLiBNTy5pc0ltbSgpIG9yCisgIC8vLyBNTy5pc0NJbW0oKSBpcyB0cnVlKS4KKyAgLy8vIC0gSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQKKyAgLy8vIC0gT3BJZHggLSBPcGVyYW5kIGluZGV4CisgIC8vLyAtIEV4cGVjdGVkIGludGVnZXIKKyAgR0lNX0NoZWNrTGl0ZXJhbEludCwKKyAgLy8vIENoZWNrIHRoZSBvcGVyYW5kIGlzIGEgc3BlY2lmaWMgaW50cmluc2ljIElECisgIC8vLyAtIEluc25JRCAtIEluc3RydWN0aW9uIElECisgIC8vLyAtIE9wSWR4IC0gT3BlcmFuZCBpbmRleAorICAvLy8gLSBFeHBlY3RlZCBJbnRyaW5zaWMgSUQKKyAgR0lNX0NoZWNrSW50cmluc2ljSUQsCisgIC8vLyBDaGVjayB0aGUgc3BlY2lmaWVkIG9wZXJhbmQgaXMgYW4gTUJCCisgIC8vLyAtIEluc25JRCAtIEluc3RydWN0aW9uIElECisgIC8vLyAtIE9wSWR4IC0gT3BlcmFuZCBpbmRleAorICBHSU1fQ2hlY2tJc01CQiwKKworICAvLy8gQ2hlY2sgaWYgdGhlIHNwZWNpZmllZCBvcGVyYW5kIGlzIHNhZmUgdG8gZm9sZCBpbnRvIHRoZSBjdXJyZW50CisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgLy8vIC0gSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQKKyAgR0lNX0NoZWNrSXNTYWZlVG9Gb2xkLAorCisgIC8vLyBDaGVjayB0aGUgc3BlY2lmaWVkIG9wZXJhbmRzIGFyZSBpZGVudGljYWwuCisgIC8vLyAtIEluc25JRCAtIEluc3RydWN0aW9uIElECisgIC8vLyAtIE9wSWR4IC0gT3BlcmFuZCBpbmRleAorICAvLy8gLSBPdGhlckluc25JRCAtIE90aGVyIGluc3RydWN0aW9uIElECisgIC8vLyAtIE90aGVyT3BJZHggLSBPdGhlciBvcGVyYW5kIGluZGV4CisgIEdJTV9DaGVja0lzU2FtZU9wZXJhbmQsCisKKyAgLy8vIEZhaWwgdGhlIGN1cnJlbnQgdHJ5LWJsb2NrLCBvciBjb21wbGV0ZWx5IGZhaWwgdG8gbWF0Y2ggaWYgdGhlcmUgaXMgbm8KKyAgLy8vIGN1cnJlbnQgdHJ5LWJsb2NrLgorICBHSU1fUmVqZWN0LAorCisgIC8vPT09IFJlbmRlcmVycyA9PT0KKworICAvLy8gTXV0YXRlIGFuIGluc3RydWN0aW9uCisgIC8vLyAtIE5ld0luc25JRCAtIEluc3RydWN0aW9uIElEIHRvIGRlZmluZQorICAvLy8gLSBPbGRJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRCB0byBtdXRhdGUKKyAgLy8vIC0gTmV3T3Bjb2RlIC0gVGhlIG5ldyBvcGNvZGUgdG8gdXNlCisgIEdJUl9NdXRhdGVPcGNvZGUsCisgIC8vLyBCdWlsZCBhIG5ldyBpbnN0cnVjdGlvbgorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRCB0byBkZWZpbmUKKyAgLy8vIC0gT3Bjb2RlIC0gVGhlIG5ldyBvcGNvZGUgdG8gdXNlCisgIEdJUl9CdWlsZE1JLAorCisgIC8vLyBDb3B5IGFuIG9wZXJhbmQgdG8gdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbgorICAvLy8gLSBOZXdJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRCB0byBtb2RpZnkKKyAgLy8vIC0gT2xkSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQgdG8gY29weSBmcm9tCisgIC8vLyAtIE9wSWR4IC0gVGhlIG9wZXJhbmQgdG8gY29weQorICBHSVJfQ29weSwKKyAgLy8vIENvcHkgYW4gb3BlcmFuZCB0byB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIG9yIGFkZCBhIHplcm8gcmVnaXN0ZXIgaWYgdGhlCisgIC8vLyBvcGVyYW5kIGlzIGEgemVybyBpbW1lZGlhdGUuCisgIC8vLyAtIE5ld0luc25JRCAtIEluc3RydWN0aW9uIElEIHRvIG1vZGlmeQorICAvLy8gLSBPbGRJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRCB0byBjb3B5IGZyb20KKyAgLy8vIC0gT3BJZHggLSBUaGUgb3BlcmFuZCB0byBjb3B5CisgIC8vLyAtIFplcm9SZWcgLSBUaGUgemVybyByZWdpc3RlciB0byB1c2UKKyAgR0lSX0NvcHlPckFkZFplcm9SZWcsCisgIC8vLyBDb3B5IGFuIG9wZXJhbmQgdG8gdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbgorICAvLy8gLSBOZXdJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRCB0byBtb2RpZnkKKyAgLy8vIC0gT2xkSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQgdG8gY29weSBmcm9tCisgIC8vLyAtIE9wSWR4IC0gVGhlIG9wZXJhbmQgdG8gY29weQorICAvLy8gLSBTdWJSZWdJZHggLSBUaGUgc3VicmVnaXN0ZXIgdG8gY29weQorICBHSVJfQ29weVN1YlJlZywKKyAgLy8vIEFkZCBhbiBpbXBsaWNpdCByZWdpc3RlciBkZWYgdG8gdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbgorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRCB0byBtb2RpZnkKKyAgLy8vIC0gUmVnTnVtIC0gVGhlIHJlZ2lzdGVyIHRvIGFkZAorICBHSVJfQWRkSW1wbGljaXREZWYsCisgIC8vLyBBZGQgYW4gaW1wbGljaXQgcmVnaXN0ZXIgdXNlIHRvIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24KKyAgLy8vIC0gSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQgdG8gbW9kaWZ5CisgIC8vLyAtIFJlZ051bSAtIFRoZSByZWdpc3RlciB0byBhZGQKKyAgR0lSX0FkZEltcGxpY2l0VXNlLAorICAvLy8gQWRkIGFuIHJlZ2lzdGVyIHRvIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24KKyAgLy8vIC0gSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQgdG8gbW9kaWZ5CisgIC8vLyAtIFJlZ051bSAtIFRoZSByZWdpc3RlciB0byBhZGQKKyAgR0lSX0FkZFJlZ2lzdGVyLAorICAvLy8gQWRkIGEgdGVtcG9yYXJ5IHJlZ2lzdGVyIHRvIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24KKyAgLy8vIC0gSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQgdG8gbW9kaWZ5CisgIC8vLyAtIFRlbXBSZWdJRCAtIFRoZSB0ZW1wb3JhcnkgcmVnaXN0ZXIgSUQgdG8gYWRkCisgIEdJUl9BZGRUZW1wUmVnaXN0ZXIsCisgIC8vLyBBZGQgYW4gaW1tZWRpYXRlIHRvIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24KKyAgLy8vIC0gSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQgdG8gbW9kaWZ5CisgIC8vLyAtIEltbSAtIFRoZSBpbW1lZGlhdGUgdG8gYWRkCisgIEdJUl9BZGRJbW0sCisgIC8vLyBSZW5kZXIgY29tcGxleCBvcGVyYW5kcyB0byB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uCisgIC8vLyAtIEluc25JRCAtIEluc3RydWN0aW9uIElEIHRvIG1vZGlmeQorICAvLy8gLSBSZW5kZXJlcklEIC0gVGhlIHJlbmRlcmVyIHRvIGNhbGwKKyAgR0lSX0NvbXBsZXhSZW5kZXJlciwKKyAgLy8vIFJlbmRlciBzdWItb3BlcmFuZHMgb2YgY29tcGxleCBvcGVyYW5kcyB0byB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uCisgIC8vLyAtIEluc25JRCAtIEluc3RydWN0aW9uIElEIHRvIG1vZGlmeQorICAvLy8gLSBSZW5kZXJlcklEIC0gVGhlIHJlbmRlcmVyIHRvIGNhbGwKKyAgLy8vIC0gUmVuZGVyT3BJRCAtIFRoZSBzdWJvcGVyYW5kIHRvIHJlbmRlci4KKyAgR0lSX0NvbXBsZXhTdWJPcGVyYW5kUmVuZGVyZXIsCisgIC8vLyBSZW5kZXIgb3BlcmFuZHMgdG8gdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiB1c2luZyBhIGN1c3RvbSBmdW5jdGlvbgorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRCB0byBtb2RpZnkKKyAgLy8vIC0gT2xkSW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQgdG8gZ2V0IHRoZSBtYXRjaGVkIG9wZXJhbmQgZnJvbQorICAvLy8gLSBSZW5kZXJlckZuSUQgLSBDdXN0b20gcmVuZGVyZXIgZnVuY3Rpb24gdG8gY2FsbAorICBHSVJfQ3VzdG9tUmVuZGVyZXIsCisKKyAgLy8vIFJlbmRlciBhIEdfQ09OU1RBTlQgb3BlcmF0b3IgYXMgYSBzaWduLWV4dGVuZGVkIGltbWVkaWF0ZS4KKyAgLy8vIC0gTmV3SW5zbklEIC0gSW5zdHJ1Y3Rpb24gSUQgdG8gbW9kaWZ5CisgIC8vLyAtIE9sZEluc25JRCAtIEluc3RydWN0aW9uIElEIHRvIGNvcHkgZnJvbQorICAvLy8gVGhlIG9wZXJhbmQgaW5kZXggaXMgaW1wbGljaXRseSAxLgorICBHSVJfQ29weUNvbnN0YW50QXNTSW1tLAorCisgIC8vLyBDb25zdHJhaW4gYW4gaW5zdHJ1Y3Rpb24gb3BlcmFuZCB0byBhIHJlZ2lzdGVyIGNsYXNzLgorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRCB0byBtb2RpZnkKKyAgLy8vIC0gT3BJZHggLSBPcGVyYW5kIGluZGV4CisgIC8vLyAtIFJDRW51bSAtIFJlZ2lzdGVyIGNsYXNzIGVudW1lcmF0aW9uIHZhbHVlCisgIEdJUl9Db25zdHJhaW5PcGVyYW5kUkMsCisgIC8vLyBDb25zdHJhaW4gYW4gaW5zdHJ1Y3Rpb25zIG9wZXJhbmRzIGFjY29yZGluZyB0byB0aGUgaW5zdHJ1Y3Rpb24KKyAgLy8vIGRlc2NyaXB0aW9uLgorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRCB0byBtb2RpZnkKKyAgR0lSX0NvbnN0cmFpblNlbGVjdGVkSW5zdE9wZXJhbmRzLAorICAvLy8gTWVyZ2UgYWxsIG1lbW9yeSBvcGVyYW5kcyBpbnRvIGluc3RydWN0aW9uLgorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRCB0byBtb2RpZnkKKyAgLy8vIC0gTWVyZ2VJbnNuSUQuLi4gLSBPbmUgb3IgbW9yZSBJbnN0cnVjdGlvbiBJRCB0byBtZXJnZSBpbnRvIHRoZSByZXN1bHQuCisgIC8vLyAtIEdJVV9NZXJnZU1lbU9wZXJhbmRzX0VuZE9mTGlzdCAtIFRlcm1pbmF0ZXMgdGhlIGxpc3Qgb2YgaW5zdHJ1Y3Rpb25zIHRvCisgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lcmdlLgorICBHSVJfTWVyZ2VNZW1PcGVyYW5kcywKKyAgLy8vIEVyYXNlIGZyb20gcGFyZW50LgorICAvLy8gLSBJbnNuSUQgLSBJbnN0cnVjdGlvbiBJRCB0byBlcmFzZQorICBHSVJfRXJhc2VGcm9tUGFyZW50LAorICAvLy8gQ3JlYXRlIGEgbmV3IHRlbXBvcmFyeSByZWdpc3RlciB0aGF0J3Mgbm90IGNvbnN0cmFpbmVkLgorICAvLy8gLSBUZW1wUmVnSUQgLSBUaGUgdGVtcG9yYXJ5IHJlZ2lzdGVyIElEIHRvIGluaXRpYWxpemUuCisgIC8vLyAtIEV4cGVjdGVkIHR5cGUKKyAgR0lSX01ha2VUZW1wUmVnLAorCisgIC8vLyBBIHN1Y2Nlc3NmdWwgZW1pc3Npb24KKyAgR0lSX0RvbmUsCisKKyAgLy8vIEluY3JlbWVudCB0aGUgcnVsZSBjb3ZlcmFnZSBjb3VudGVyLgorICAvLy8gLSBSdWxlSUQgLSBUaGUgSUQgb2YgdGhlIHJ1bGUgdGhhdCB3YXMgY292ZXJlZC4KKyAgR0lSX0NvdmVyYWdlLAorfTsKKworZW51bSB7CisgIC8vLyBJbmRpY2F0ZXMgdGhlIGVuZCBvZiB0aGUgdmFyaWFibGUtbGVuZ3RoIE1lcmdlSW5zbklEIGxpc3QgaW4gYQorICAvLy8gR0lSX01lcmdlTWVtT3BlcmFuZHMgb3Bjb2RlLgorICBHSVVfTWVyZ2VNZW1PcGVyYW5kc19FbmRPZkxpc3QgPSAtMSwKK307CisKKy8vLyBQcm92aWRlcyB0aGUgbG9naWMgdG8gc2VsZWN0IGdlbmVyaWMgbWFjaGluZSBpbnN0cnVjdGlvbnMuCitjbGFzcyBJbnN0cnVjdGlvblNlbGVjdG9yIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+SW5zdHJ1Y3Rpb25TZWxlY3RvcigpID0gZGVmYXVsdDsKKworICAvLy8gU2VsZWN0IHRoZSAocG9zc2libHkgZ2VuZXJpYykgaW5zdHJ1Y3Rpb24gXHAgSSB0byBvbmx5IHVzZSB0YXJnZXQtc3BlY2lmaWMKKyAgLy8vIG9wY29kZXMuIEl0IGlzIE9LIHRvIGluc2VydCBtdWx0aXBsZSBpbnN0cnVjdGlvbnMsIGJ1dCB0aGV5IGNhbm5vdCBiZQorICAvLy8gZ2VuZXJpYyBwcmUtaXNlbCBpbnN0cnVjdGlvbnMuCisgIC8vLworICAvLy8gXHJldHVybnMgd2hldGhlciBzZWxlY3Rpb24gc3VjY2VlZGVkLgorICAvLy8gXHByZSAgSS5nZXRQYXJlbnQoKSAmJiBJLmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKQorICAvLy8gXHBvc3QKKyAgLy8vICAgaWYgcmV0dXJucyB0cnVlOgorICAvLy8gICAgIGZvciBJIGluIGFsbCBtdXRhdGVkL2luc2VydGVkIGluc3RydWN0aW9uczoKKyAgLy8vICAgICAgICFpc1ByZUlTZWxHZW5lcmljT3Bjb2RlKEkuZ2V0T3Bjb2RlKCkpCisgIHZpcnR1YWwgYm9vbCBzZWxlY3QoTWFjaGluZUluc3RyICZJLCBDb2RlR2VuQ292ZXJhZ2UgJkNvdmVyYWdlSW5mbykgY29uc3QgPSAwOworCitwcm90ZWN0ZWQ6CisgIHVzaW5nIENvbXBsZXhSZW5kZXJlckZucyA9CisgICAgICBPcHRpb25hbDxTbWFsbFZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoTWFjaGluZUluc3RyQnVpbGRlciAmKT4sIDQ+PjsKKyAgdXNpbmcgUmVjb3JkZWRNSVZlY3RvciA9IFNtYWxsVmVjdG9yPE1hY2hpbmVJbnN0ciAqLCA0PjsKKyAgdXNpbmcgTmV3TUlWZWN0b3IgPSBTbWFsbFZlY3RvcjxNYWNoaW5lSW5zdHJCdWlsZGVyLCA0PjsKKworICBzdHJ1Y3QgTWF0Y2hlclN0YXRlIHsKKyAgICBzdGQ6OnZlY3RvcjxDb21wbGV4UmVuZGVyZXJGbnM6OnZhbHVlX3R5cGU+IFJlbmRlcmVyczsKKyAgICBSZWNvcmRlZE1JVmVjdG9yIE1JczsKKyAgICBEZW5zZU1hcDx1bnNpZ25lZCwgdW5zaWduZWQ+IFRlbXBSZWdpc3RlcnM7CisKKyAgICBNYXRjaGVyU3RhdGUodW5zaWduZWQgTWF4UmVuZGVyZXJzKTsKKyAgfTsKKworcHVibGljOgorICB0ZW1wbGF0ZSA8Y2xhc3MgUHJlZGljYXRlQml0c2V0LCBjbGFzcyBDb21wbGV4TWF0Y2hlck1lbUZuLAorICAgICAgICAgICAgY2xhc3MgQ3VzdG9tUmVuZGVyZXJGbj4KKyAgc3RydWN0IElTZWxJbmZvVHkgeworICAgIGNvbnN0IExMVCAqVHlwZU9iamVjdHM7CisgICAgY29uc3QgUHJlZGljYXRlQml0c2V0ICpGZWF0dXJlQml0c2V0czsKKyAgICBjb25zdCBDb21wbGV4TWF0Y2hlck1lbUZuICpDb21wbGV4UHJlZGljYXRlczsKKyAgICBjb25zdCBDdXN0b21SZW5kZXJlckZuICpDdXN0b21SZW5kZXJlcnM7CisgIH07CisKK3Byb3RlY3RlZDoKKyAgSW5zdHJ1Y3Rpb25TZWxlY3RvcigpOworCisgIC8vLyBFeGVjdXRlIGEgZ2l2ZW4gbWF0Y2hlciB0YWJsZSBhbmQgcmV0dXJuIHRydWUgaWYgdGhlIG1hdGNoIHdhcyBzdWNjZXNzZnVsCisgIC8vLyBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICB0ZW1wbGF0ZSA8Y2xhc3MgVGd0SW5zdHJ1Y3Rpb25TZWxlY3RvciwgY2xhc3MgUHJlZGljYXRlQml0c2V0LAorICAgICAgICAgICAgY2xhc3MgQ29tcGxleE1hdGNoZXJNZW1GbiwgY2xhc3MgQ3VzdG9tUmVuZGVyZXJGbj4KKyAgYm9vbCBleGVjdXRlTWF0Y2hUYWJsZSgKKyAgICAgIFRndEluc3RydWN0aW9uU2VsZWN0b3IgJklTZWwsIE5ld01JVmVjdG9yICZPdXRNSXMsIE1hdGNoZXJTdGF0ZSAmU3RhdGUsCisgICAgICBjb25zdCBJU2VsSW5mb1R5PFByZWRpY2F0ZUJpdHNldCwgQ29tcGxleE1hdGNoZXJNZW1GbiwgQ3VzdG9tUmVuZGVyZXJGbj4KKyAgICAgICAgICAmSVNlbEluZm8sCisgICAgICBjb25zdCBpbnQ2NF90ICpNYXRjaFRhYmxlLCBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSSwKKyAgICAgIE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkksCisgICAgICBjb25zdCBSZWdpc3RlckJhbmtJbmZvICZSQkksIGNvbnN0IFByZWRpY2F0ZUJpdHNldCAmQXZhaWxhYmxlRmVhdHVyZXMsCisgICAgICBDb2RlR2VuQ292ZXJhZ2UgJkNvdmVyYWdlSW5mbykgY29uc3Q7CisKKyAgdmlydHVhbCBib29sIHRlc3RJbW1QcmVkaWNhdGVfSTY0KHVuc2lnbmVkLCBpbnQ2NF90KSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiU3ViY2xhc3NlcyBtdXN0IG92ZXJyaWRlIHRoaXMgdG8gdXNlIHRhYmxlZ2VuIik7CisgIH0KKyAgdmlydHVhbCBib29sIHRlc3RJbW1QcmVkaWNhdGVfQVBJbnQodW5zaWduZWQsIGNvbnN0IEFQSW50ICYpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyB0byB1c2UgdGFibGVnZW4iKTsKKyAgfQorICB2aXJ0dWFsIGJvb2wgdGVzdEltbVByZWRpY2F0ZV9BUEZsb2F0KHVuc2lnbmVkLCBjb25zdCBBUEZsb2F0ICYpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJTdWJjbGFzc2VzIG11c3Qgb3ZlcnJpZGUgdGhpcyB0byB1c2UgdGFibGVnZW4iKTsKKyAgfQorCisgIC8vLyBDb25zdHJhaW4gYSByZWdpc3RlciBvcGVyYW5kIG9mIGFuIGluc3RydWN0aW9uIFxwIEkgdG8gYSBzcGVjaWZpZWQKKyAgLy8vIHJlZ2lzdGVyIGNsYXNzLiBUaGlzIGNvdWxkIGludm9sdmUgaW5zZXJ0aW5nIENPUFlzIGJlZm9yZSAoZm9yIHVzZXMpIG9yCisgIC8vLyBhZnRlciAoZm9yIGRlZnMpIGFuZCBtYXkgcmVwbGFjZSB0aGUgb3BlcmFuZCBvZiBccCBJLgorICAvLy8gXHJldHVybnMgd2hldGhlciBvcGVyYW5kIHJlZ2NsYXNzIGNvbnN0cmFpbmluZyBzdWNjZWVkZWQuCisgIGJvb2wgY29uc3RyYWluT3BlcmFuZFJlZ1RvUmVnQ2xhc3MoTWFjaGluZUluc3RyICZJLCB1bnNpZ25lZCBPcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICZSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWdpc3RlckJhbmtJbmZvICZSQkkpIGNvbnN0OworCisgIGJvb2wgaXNPcGVyYW5kSW1tRXF1YWwoY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PLCBpbnQ2NF90IFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb3BlcmFuZCBpcyBhIEdfR0VQIHdpdGggYSBHX0NPTlNUQU5UIG9uIHRoZQorICAvLy8gcmlnaHQtaGFuZCBzaWRlLiBHbG9iYWxJU2VsJ3Mgc2VwYXJhdGlvbiBvZiBwb2ludGVyIGFuZCBpbnRlZ2VyIHR5cGVzCisgIC8vLyBtZWFucyB0aGF0IHdlIGRvbid0IG5lZWQgdG8gd29ycnkgYWJvdXQgR19PUiB3aXRoIGVxdWl2YWxlbnQgc2VtYW50aWNzLgorICBib29sIGlzQmFzZVdpdGhDb25zdGFudE9mZnNldChjb25zdCBNYWNoaW5lT3BlcmFuZCAmUm9vdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgTUkgY2FuIG9idmlvdXNseSBiZSBmb2xkZWQgaW50byBJbnRvTUkuCisgIC8vLyBNSSBhbmQgSW50b01JIGRvIG5vdCBuZWVkIHRvIGJlIGluIHRoZSBzYW1lIGJhc2ljIGJsb2NrcywgYnV0IE1JIG11c3QKKyAgLy8vIHByZWNlZWQgSW50b01JLgorICBib29sIGlzT2J2aW91c2x5U2FmZVRvRm9sZChNYWNoaW5lSW5zdHIgJk1JLCBNYWNoaW5lSW5zdHIgJkludG9NSSkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfSU5TVFJVQ1RJT05TRUxFQ1RPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9JbnN0cnVjdGlvblNlbGVjdG9ySW1wbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvSW5zdHJ1Y3Rpb25TZWxlY3RvckltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzU5M2JhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvSW5zdHJ1Y3Rpb25TZWxlY3RvckltcGwuaApAQCAtMCwwICsxLDc2OSBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0luc3RydWN0aW9uU2VsZWN0b3JJbXBsLmggLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBBUEkgZm9yIHRoZSBpbnN0cnVjdGlvbiBzZWxlY3Rvci4KKy8vLyBUaGlzIGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBzZWxlY3RpbmcgbWFjaGluZSBpbnN0cnVjdGlvbnMuCisvLy8gSXQncyBpbXBsZW1lbnRlZCBieSB0aGUgdGFyZ2V0LiBJdCdzIHVzZWQgYnkgdGhlIEluc3RydWN0aW9uU2VsZWN0IHBhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9JTlNUUlVDVElPTlNFTEVDVE9SSU1QTF9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX0lOU1RSVUNUSU9OU0VMRUNUT1JJTVBMX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvSW5zdHJ1Y3Rpb25TZWxlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL1JlZ2lzdGVyQmFua0luZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9VdGlscy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVPcGVyYW5kLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0SW5zdHJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldE9wY29kZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBHbG9iYWxJU2VsIFBhdEZyYWcgUHJlZGljYXRlcworZW51bSB7CisgIEdJUEZQX0k2NF9JbnZhbGlkID0gMCwKKyAgR0lQRlBfQVBJbnRfSW52YWxpZCA9IDAsCisgIEdJUEZQX0FQRmxvYXRfSW52YWxpZCA9IDAsCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVGd0SW5zdHJ1Y3Rpb25TZWxlY3RvciwgY2xhc3MgUHJlZGljYXRlQml0c2V0LAorICAgICAgICAgIGNsYXNzIENvbXBsZXhNYXRjaGVyTWVtRm4sIGNsYXNzIEN1c3RvbVJlbmRlcmVyRm4+Citib29sIEluc3RydWN0aW9uU2VsZWN0b3I6OmV4ZWN1dGVNYXRjaFRhYmxlKAorICAgIFRndEluc3RydWN0aW9uU2VsZWN0b3IgJklTZWwsIE5ld01JVmVjdG9yICZPdXRNSXMsIE1hdGNoZXJTdGF0ZSAmU3RhdGUsCisgICAgY29uc3QgSVNlbEluZm9UeTxQcmVkaWNhdGVCaXRzZXQsIENvbXBsZXhNYXRjaGVyTWVtRm4sIEN1c3RvbVJlbmRlcmVyRm4+CisgICAgICAgICZJU2VsSW5mbywKKyAgICBjb25zdCBpbnQ2NF90ICpNYXRjaFRhYmxlLCBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSSwKKyAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJLAorICAgIGNvbnN0IFJlZ2lzdGVyQmFua0luZm8gJlJCSSwgY29uc3QgUHJlZGljYXRlQml0c2V0ICZBdmFpbGFibGVGZWF0dXJlcywKKyAgICBDb2RlR2VuQ292ZXJhZ2UgJkNvdmVyYWdlSW5mbykgY29uc3QgeworICB1aW50NjRfdCBDdXJyZW50SWR4ID0gMDsKKyAgU21hbGxWZWN0b3I8dWludDY0X3QsIDg+IE9uRmFpbFJlc3VtZUF0OworCisgIGVudW0gUmVqZWN0QWN0aW9uIHsgUmVqZWN0QW5kR2l2ZVVwLCBSZWplY3RBbmRSZXN1bWUgfTsKKyAgYXV0byBoYW5kbGVSZWplY3QgPSBbJl0oKSAtPiBSZWplY3RBY3Rpb24geworICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IFJlamVjdGVkXG4iKTsKKyAgICBpZiAoT25GYWlsUmVzdW1lQXQuZW1wdHkoKSkKKyAgICAgIHJldHVybiBSZWplY3RBbmRHaXZlVXA7CisgICAgQ3VycmVudElkeCA9IE9uRmFpbFJlc3VtZUF0LmJhY2soKTsKKyAgICBPbkZhaWxSZXN1bWVBdC5wb3BfYmFjaygpOworICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IFJlc3VtZSBhdCAiIDw8IEN1cnJlbnRJZHggPDwgIiAoIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgT25GYWlsUmVzdW1lQXQuc2l6ZSgpIDw8ICIgdHJ5LWJsb2NrcyByZW1haW4pXG4iKTsKKyAgICByZXR1cm4gUmVqZWN0QW5kUmVzdW1lOworICB9OworCisgIHdoaWxlICh0cnVlKSB7CisgICAgYXNzZXJ0KEN1cnJlbnRJZHggIT0gfjB1ICYmICJJbnZhbGlkIE1hdGNoVGFibGUgaW5kZXgiKTsKKyAgICBzd2l0Y2ggKE1hdGNoVGFibGVbQ3VycmVudElkeCsrXSkgeworICAgIGNhc2UgR0lNX1RyeTogeworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBCZWdpbiB0cnktYmxvY2tcbiIpOworICAgICAgT25GYWlsUmVzdW1lQXQucHVzaF9iYWNrKE1hdGNoVGFibGVbQ3VycmVudElkeCsrXSk7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdJTV9SZWNvcmRJbnNuOiB7CisgICAgICBpbnQ2NF90IE5ld0luc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBPcElkeCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKworICAgICAgLy8gQXMgYW4gb3B0aW1pc2F0aW9uIHdlIHJlcXVpcmUgdGhhdCBNSXNbMF0gaXMgYWx3YXlzIHRoZSByb290LiBSZWZ1c2UKKyAgICAgIC8vIGFueSBhdHRlbXB0IHRvIG1vZGlmeSBpdC4KKyAgICAgIGFzc2VydChOZXdJbnNuSUQgIT0gMCAmJiAiUmVmdXNpbmcgdG8gbW9kaWZ5IE1Jc1swXSIpOworCisgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBTdGF0ZS5NSXNbSW5zbklEXS0+Z2V0T3BlcmFuZChPcElkeCk7CisgICAgICBpZiAoIU1PLmlzUmVnKCkpIHsKKyAgICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IE5vdCBhIHJlZ2lzdGVyXG4iKTsKKyAgICAgICAgaWYgKGhhbmRsZVJlamVjdCgpID09IFJlamVjdEFuZEdpdmVVcCkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgaWYgKFRSSS5pc1BoeXNpY2FsUmVnaXN0ZXIoTU8uZ2V0UmVnKCkpKSB7CisgICAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBJcyBhIHBoeXNpY2FsIHJlZ2lzdGVyXG4iKTsKKyAgICAgICAgaWYgKGhhbmRsZVJlamVjdCgpID09IFJlamVjdEFuZEdpdmVVcCkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBNYWNoaW5lSW5zdHIgKk5ld01JID0gTVJJLmdldFZSZWdEZWYoTU8uZ2V0UmVnKCkpOworICAgICAgaWYgKChzaXplX3QpTmV3SW5zbklEIDwgU3RhdGUuTUlzLnNpemUoKSkKKyAgICAgICAgU3RhdGUuTUlzW05ld0luc25JRF0gPSBOZXdNSTsKKyAgICAgIGVsc2UgeworICAgICAgICBhc3NlcnQoKHNpemVfdClOZXdJbnNuSUQgPT0gU3RhdGUuTUlzLnNpemUoKSAmJgorICAgICAgICAgICAgICAgIkV4cGVjdGVkIHRvIHN0b3JlIE1JcyBpbiBvcmRlciIpOworICAgICAgICBTdGF0ZS5NSXMucHVzaF9iYWNrKE5ld01JKTsKKyAgICAgIH0KKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogTUlzWyIgPDwgTmV3SW5zbklECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJdID0gR0lNX1JlY29yZEluc24oIiA8PCBJbnNuSUQgPDwgIiwgIiA8PCBPcElkeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKVxuIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdJTV9DaGVja0ZlYXR1cmVzOiB7CisgICAgICBpbnQ2NF90IEV4cGVjdGVkQml0c2V0SUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IEdJTV9DaGVja0ZlYXR1cmVzKEV4cGVjdGVkQml0c2V0SUQ9IgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBFeHBlY3RlZEJpdHNldElEIDw8ICIpXG4iKTsKKyAgICAgIGlmICgoQXZhaWxhYmxlRmVhdHVyZXMgJiBJU2VsSW5mby5GZWF0dXJlQml0c2V0c1tFeHBlY3RlZEJpdHNldElEXSkgIT0KKyAgICAgICAgICBJU2VsSW5mby5GZWF0dXJlQml0c2V0c1tFeHBlY3RlZEJpdHNldElEXSkgeworICAgICAgICBpZiAoaGFuZGxlUmVqZWN0KCkgPT0gUmVqZWN0QW5kR2l2ZVVwKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR0lNX0NoZWNrT3Bjb2RlOiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgRXhwZWN0ZWQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisKKyAgICAgIHVuc2lnbmVkIE9wY29kZSA9IFN0YXRlLk1Jc1tJbnNuSURdLT5nZXRPcGNvZGUoKTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogR0lNX0NoZWNrT3Bjb2RlKE1Jc1siIDw8IEluc25JRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXSwgRXhwZWN0ZWRPcGNvZGU9IiA8PCBFeHBlY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSAvLyBHb3Q9IiA8PCBPcGNvZGUgPDwgIlxuIik7CisgICAgICBhc3NlcnQoU3RhdGUuTUlzW0luc25JRF0gIT0gbnVsbHB0ciAmJiAiVXNlZCBpbnNuIGJlZm9yZSBkZWZpbmVkIik7CisgICAgICBpZiAoT3Bjb2RlICE9IEV4cGVjdGVkKSB7CisgICAgICAgIGlmIChoYW5kbGVSZWplY3QoKSA9PSBSZWplY3RBbmRHaXZlVXApCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHSU1fQ2hlY2tOdW1PcGVyYW5kczogeworICAgICAgaW50NjRfdCBJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IEV4cGVjdGVkID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBHSU1fQ2hlY2tOdW1PcGVyYW5kcyhNSXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBJbnNuSUQgPDwgIl0sIEV4cGVjdGVkPSIgPDwgRXhwZWN0ZWQgPDwgIilcbiIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdICE9IG51bGxwdHIgJiYgIlVzZWQgaW5zbiBiZWZvcmUgZGVmaW5lZCIpOworICAgICAgaWYgKFN0YXRlLk1Jc1tJbnNuSURdLT5nZXROdW1PcGVyYW5kcygpICE9IEV4cGVjdGVkKSB7CisgICAgICAgIGlmIChoYW5kbGVSZWplY3QoKSA9PSBSZWplY3RBbmRHaXZlVXApCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR0lNX0NoZWNrSTY0SW1tUHJlZGljYXRlOiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgUHJlZGljYXRlID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgQ3VycmVudElkeCA8PCAiOiBHSU1fQ2hlY2tJNjRJbW1QcmVkaWNhdGUoTUlzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgSW5zbklEIDw8ICJdLCBQcmVkaWNhdGU9IiA8PCBQcmVkaWNhdGUgPDwgIilcbiIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdICE9IG51bGxwdHIgJiYgIlVzZWQgaW5zbiBiZWZvcmUgZGVmaW5lZCIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdLT5nZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OkdfQ09OU1RBTlQgJiYKKyAgICAgICAgICAgICAiRXhwZWN0ZWQgR19DT05TVEFOVCIpOworICAgICAgYXNzZXJ0KFByZWRpY2F0ZSA+IEdJUEZQX0k2NF9JbnZhbGlkICYmICJFeHBlY3RlZCBhIHZhbGlkIHByZWRpY2F0ZSIpOworICAgICAgaW50NjRfdCBWYWx1ZSA9IDA7CisgICAgICBpZiAoU3RhdGUuTUlzW0luc25JRF0tPmdldE9wZXJhbmQoMSkuaXNDSW1tKCkpCisgICAgICAgIFZhbHVlID0gU3RhdGUuTUlzW0luc25JRF0tPmdldE9wZXJhbmQoMSkuZ2V0Q0ltbSgpLT5nZXRTRXh0VmFsdWUoKTsKKyAgICAgIGVsc2UgaWYgKFN0YXRlLk1Jc1tJbnNuSURdLT5nZXRPcGVyYW5kKDEpLmlzSW1tKCkpCisgICAgICAgIFZhbHVlID0gU3RhdGUuTUlzW0luc25JRF0tPmdldE9wZXJhbmQoMSkuZ2V0SW1tKCk7CisgICAgICBlbHNlCisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkV4cGVjdGVkIEltbSBvciBDSW1tIG9wZXJhbmQiKTsKKworICAgICAgaWYgKCF0ZXN0SW1tUHJlZGljYXRlX0k2NChQcmVkaWNhdGUsIFZhbHVlKSkKKyAgICAgICAgaWYgKGhhbmRsZVJlamVjdCgpID09IFJlamVjdEFuZEdpdmVVcCkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHSU1fQ2hlY2tBUEludEltbVByZWRpY2F0ZTogeworICAgICAgaW50NjRfdCBJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IFByZWRpY2F0ZSA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEN1cnJlbnRJZHggPDwgIjogR0lNX0NoZWNrQVBJbnRJbW1QcmVkaWNhdGUoTUlzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgSW5zbklEIDw8ICJdLCBQcmVkaWNhdGU9IiA8PCBQcmVkaWNhdGUgPDwgIilcbiIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdICE9IG51bGxwdHIgJiYgIlVzZWQgaW5zbiBiZWZvcmUgZGVmaW5lZCIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdLT5nZXRPcGNvZGUoKSAmJiAiRXhwZWN0ZWQgR19DT05TVEFOVCIpOworICAgICAgYXNzZXJ0KFByZWRpY2F0ZSA+IEdJUEZQX0FQSW50X0ludmFsaWQgJiYgIkV4cGVjdGVkIGEgdmFsaWQgcHJlZGljYXRlIik7CisgICAgICBBUEludCBWYWx1ZTsKKyAgICAgIGlmIChTdGF0ZS5NSXNbSW5zbklEXS0+Z2V0T3BlcmFuZCgxKS5pc0NJbW0oKSkKKyAgICAgICAgVmFsdWUgPSBTdGF0ZS5NSXNbSW5zbklEXS0+Z2V0T3BlcmFuZCgxKS5nZXRDSW1tKCktPmdldFZhbHVlKCk7CisgICAgICBlbHNlCisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIkV4cGVjdGVkIEltbSBvciBDSW1tIG9wZXJhbmQiKTsKKworICAgICAgaWYgKCF0ZXN0SW1tUHJlZGljYXRlX0FQSW50KFByZWRpY2F0ZSwgVmFsdWUpKQorICAgICAgICBpZiAoaGFuZGxlUmVqZWN0KCkgPT0gUmVqZWN0QW5kR2l2ZVVwKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdJTV9DaGVja0FQRmxvYXRJbW1QcmVkaWNhdGU6IHsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBQcmVkaWNhdGUgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBDdXJyZW50SWR4IDw8ICI6IEdJTV9DaGVja0FQRmxvYXRJbW1QcmVkaWNhdGUoTUlzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgSW5zbklEIDw8ICJdLCBQcmVkaWNhdGU9IiA8PCBQcmVkaWNhdGUgPDwgIilcbiIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdICE9IG51bGxwdHIgJiYgIlVzZWQgaW5zbiBiZWZvcmUgZGVmaW5lZCIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdLT5nZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OkdfRkNPTlNUQU5UICYmCisgICAgICAgICAgICAgIkV4cGVjdGVkIEdfRkNPTlNUQU5UIik7CisgICAgICBhc3NlcnQoU3RhdGUuTUlzW0luc25JRF0tPmdldE9wZXJhbmQoMSkuaXNGUEltbSgpICYmICJFeHBlY3RlZCBGUEltbSBvcGVyYW5kIik7CisgICAgICBhc3NlcnQoUHJlZGljYXRlID4gR0lQRlBfQVBGbG9hdF9JbnZhbGlkICYmICJFeHBlY3RlZCBhIHZhbGlkIHByZWRpY2F0ZSIpOworICAgICAgQVBGbG9hdCBWYWx1ZSA9IFN0YXRlLk1Jc1tJbnNuSURdLT5nZXRPcGVyYW5kKDEpLmdldEZQSW1tKCktPmdldFZhbHVlQVBGKCk7CisKKyAgICAgIGlmICghdGVzdEltbVByZWRpY2F0ZV9BUEZsb2F0KFByZWRpY2F0ZSwgVmFsdWUpKQorICAgICAgICBpZiAoaGFuZGxlUmVqZWN0KCkgPT0gUmVqZWN0QW5kR2l2ZVVwKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdJTV9DaGVja0F0b21pY09yZGVyaW5nOiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIEF0b21pY09yZGVyaW5nIE9yZGVyaW5nID0gKEF0b21pY09yZGVyaW5nKU1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogR0lNX0NoZWNrQXRvbWljT3JkZXJpbmcoTUlzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgSW5zbklEIDw8ICJdLCAiIDw8ICh1aW50NjRfdClPcmRlcmluZyA8PCAiKVxuIik7CisgICAgICBhc3NlcnQoU3RhdGUuTUlzW0luc25JRF0gIT0gbnVsbHB0ciAmJiAiVXNlZCBpbnNuIGJlZm9yZSBkZWZpbmVkIik7CisKKyAgICAgIGlmICghU3RhdGUuTUlzW0luc25JRF0tPmhhc09uZU1lbU9wZXJhbmQoKSkKKyAgICAgICAgaWYgKGhhbmRsZVJlamVjdCgpID09IFJlamVjdEFuZEdpdmVVcCkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIGZvciAoY29uc3QgYXV0byAmTU1PIDogU3RhdGUuTUlzW0luc25JRF0tPm1lbW9wZXJhbmRzKCkpCisgICAgICAgIGlmIChNTU8tPmdldE9yZGVyaW5nKCkgIT0gT3JkZXJpbmcpCisgICAgICAgICAgaWYgKGhhbmRsZVJlamVjdCgpID09IFJlamVjdEFuZEdpdmVVcCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdJTV9DaGVja0F0b21pY09yZGVyaW5nT3JTdHJvbmdlclRoYW46IHsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgQXRvbWljT3JkZXJpbmcgT3JkZXJpbmcgPSAoQXRvbWljT3JkZXJpbmcpTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBHSU1fQ2hlY2tBdG9taWNPcmRlcmluZ09yU3Ryb25nZXJUaGFuKE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluc25JRCA8PCAiXSwgIiA8PCAodWludDY0X3QpT3JkZXJpbmcgPDwgIilcbiIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdICE9IG51bGxwdHIgJiYgIlVzZWQgaW5zbiBiZWZvcmUgZGVmaW5lZCIpOworCisgICAgICBpZiAoIVN0YXRlLk1Jc1tJbnNuSURdLT5oYXNPbmVNZW1PcGVyYW5kKCkpCisgICAgICAgIGlmIChoYW5kbGVSZWplY3QoKSA9PSBSZWplY3RBbmRHaXZlVXApCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICBmb3IgKGNvbnN0IGF1dG8gJk1NTyA6IFN0YXRlLk1Jc1tJbnNuSURdLT5tZW1vcGVyYW5kcygpKQorICAgICAgICBpZiAoIWlzQXRMZWFzdE9yU3Ryb25nZXJUaGFuKE1NTy0+Z2V0T3JkZXJpbmcoKSwgT3JkZXJpbmcpKQorICAgICAgICAgIGlmIChoYW5kbGVSZWplY3QoKSA9PSBSZWplY3RBbmRHaXZlVXApCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHSU1fQ2hlY2tBdG9taWNPcmRlcmluZ1dlYWtlclRoYW46IHsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgQXRvbWljT3JkZXJpbmcgT3JkZXJpbmcgPSAoQXRvbWljT3JkZXJpbmcpTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBHSU1fQ2hlY2tBdG9taWNPcmRlcmluZ1dlYWtlclRoYW4oTUlzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgSW5zbklEIDw8ICJdLCAiIDw8ICh1aW50NjRfdClPcmRlcmluZyA8PCAiKVxuIik7CisgICAgICBhc3NlcnQoU3RhdGUuTUlzW0luc25JRF0gIT0gbnVsbHB0ciAmJiAiVXNlZCBpbnNuIGJlZm9yZSBkZWZpbmVkIik7CisKKyAgICAgIGlmICghU3RhdGUuTUlzW0luc25JRF0tPmhhc09uZU1lbU9wZXJhbmQoKSkKKyAgICAgICAgaWYgKGhhbmRsZVJlamVjdCgpID09IFJlamVjdEFuZEdpdmVVcCkKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIGZvciAoY29uc3QgYXV0byAmTU1PIDogU3RhdGUuTUlzW0luc25JRF0tPm1lbW9wZXJhbmRzKCkpCisgICAgICAgIGlmICghaXNTdHJvbmdlclRoYW4oT3JkZXJpbmcsIE1NTy0+Z2V0T3JkZXJpbmcoKSkpCisgICAgICAgICAgaWYgKGhhbmRsZVJlamVjdCgpID09IFJlamVjdEFuZEdpdmVVcCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdJTV9DaGVja1R5cGU6IHsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBPcElkeCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgVHlwZUlEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBHSU1fQ2hlY2tUeXBlKE1Jc1siIDw8IEluc25JRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXS0+Z2V0T3BlcmFuZCgiIDw8IE9wSWR4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpLCBUeXBlSUQ9IiA8PCBUeXBlSUQgPDwgIilcbiIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdICE9IG51bGxwdHIgJiYgIlVzZWQgaW5zbiBiZWZvcmUgZGVmaW5lZCIpOworCisgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBTdGF0ZS5NSXNbSW5zbklEXS0+Z2V0T3BlcmFuZChPcElkeCk7CisgICAgICBpZiAoIU1PLmlzUmVnKCkgfHwKKyAgICAgICAgICBNUkkuZ2V0VHlwZShNTy5nZXRSZWcoKSkgIT0gSVNlbEluZm8uVHlwZU9iamVjdHNbVHlwZUlEXSkgeworICAgICAgICBpZiAoaGFuZGxlUmVqZWN0KCkgPT0gUmVqZWN0QW5kR2l2ZVVwKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdJTV9DaGVja1BvaW50ZXJUb0FueTogeworICAgICAgaW50NjRfdCBJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IE9wSWR4ID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBTaXplSW5CaXRzID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworCisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IEdJTV9DaGVja1BvaW50ZXJUb0FueShNSXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBJbnNuSUQgPDwgIl0tPmdldE9wZXJhbmQoIiA8PCBPcElkeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKSwgU2l6ZUluQml0cz0iIDw8IFNpemVJbkJpdHMgPDwgIilcbiIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdICE9IG51bGxwdHIgJiYgIlVzZWQgaW5zbiBiZWZvcmUgZGVmaW5lZCIpOworCisgICAgICAvLyBpUFRSIG11c3QgYmUgbG9va2VkIHVwIGluIHRoZSB0YXJnZXQuCisgICAgICBpZiAoU2l6ZUluQml0cyA9PSAwKSB7CisgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAqTUYgPSBTdGF0ZS5NSXNbSW5zbklEXS0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpOworICAgICAgICBTaXplSW5CaXRzID0gTUYtPmdldERhdGFMYXlvdXQoKS5nZXRQb2ludGVyU2l6ZUluQml0cygwKTsKKyAgICAgIH0KKworICAgICAgYXNzZXJ0KFNpemVJbkJpdHMgIT0gMCAmJiAiUG9pbnRlciBzaXplIG11c3QgYmUga25vd24iKTsKKworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gU3RhdGUuTUlzW0luc25JRF0tPmdldE9wZXJhbmQoT3BJZHgpOworICAgICAgaWYgKE1PLmlzUmVnKCkpIHsKKyAgICAgICAgY29uc3QgTExUICZUeSA9IE1SSS5nZXRUeXBlKE1PLmdldFJlZygpKTsKKyAgICAgICAgaWYgKCFUeS5pc1BvaW50ZXIoKSB8fCBUeS5nZXRTaXplSW5CaXRzKCkgIT0gU2l6ZUluQml0cykKKyAgICAgICAgICBpZiAoaGFuZGxlUmVqZWN0KCkgPT0gUmVqZWN0QW5kR2l2ZVVwKQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfSBlbHNlIGlmIChoYW5kbGVSZWplY3QoKSA9PSBSZWplY3RBbmRHaXZlVXApCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgR0lNX0NoZWNrUmVnQmFua0ZvckNsYXNzOiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgT3BJZHggPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IFJDRW51bSA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogR0lNX0NoZWNrUmVnQmFua0ZvckNsYXNzKE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluc25JRCA8PCAiXS0+Z2V0T3BlcmFuZCgiIDw8IE9wSWR4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpLCBSQ0VudW09IiA8PCBSQ0VudW0gPDwgIilcbiIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdICE9IG51bGxwdHIgJiYgIlVzZWQgaW5zbiBiZWZvcmUgZGVmaW5lZCIpOworICAgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gU3RhdGUuTUlzW0luc25JRF0tPmdldE9wZXJhbmQoT3BJZHgpOworICAgICAgaWYgKCFNTy5pc1JlZygpIHx8CisgICAgICAgICAgJlJCSS5nZXRSZWdCYW5rRnJvbVJlZ0NsYXNzKCpUUkkuZ2V0UmVnQ2xhc3MoUkNFbnVtKSkgIT0KKyAgICAgICAgICAgICAgUkJJLmdldFJlZ0JhbmsoTU8uZ2V0UmVnKCksIE1SSSwgVFJJKSkgeworICAgICAgICBpZiAoaGFuZGxlUmVqZWN0KCkgPT0gUmVqZWN0QW5kR2l2ZVVwKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR0lNX0NoZWNrQ29tcGxleFBhdHRlcm46IHsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBPcElkeCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgUmVuZGVyZXJJRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgQ29tcGxleFByZWRpY2F0ZUlEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBTdGF0ZS5SZW5kZXJlcnNbIiA8PCBSZW5kZXJlcklECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJdID0gR0lNX0NoZWNrQ29tcGxleFBhdHRlcm4oTUlzWyIgPDwgSW5zbklECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJdLT5nZXRPcGVyYW5kKCIgPDwgT3BJZHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiksIENvbXBsZXhQcmVkaWNhdGVJRD0iIDw8IENvbXBsZXhQcmVkaWNhdGVJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiKVxuIik7CisgICAgICBhc3NlcnQoU3RhdGUuTUlzW0luc25JRF0gIT0gbnVsbHB0ciAmJiAiVXNlZCBpbnNuIGJlZm9yZSBkZWZpbmVkIik7CisgICAgICAvLyBGSVhNRTogVXNlIHN0ZDo6aW52b2tlKCkgd2hlbiBpdCdzIGF2YWlsYWJsZS4KKyAgICAgIENvbXBsZXhSZW5kZXJlckZucyBSZW5kZXJlciA9CisgICAgICAgICAgKElTZWwuKklTZWxJbmZvLkNvbXBsZXhQcmVkaWNhdGVzW0NvbXBsZXhQcmVkaWNhdGVJRF0pKAorICAgICAgICAgICAgICBTdGF0ZS5NSXNbSW5zbklEXS0+Z2V0T3BlcmFuZChPcElkeCkpOworICAgICAgaWYgKFJlbmRlcmVyLmhhc1ZhbHVlKCkpCisgICAgICAgIFN0YXRlLlJlbmRlcmVyc1tSZW5kZXJlcklEXSA9IFJlbmRlcmVyLmdldFZhbHVlKCk7CisgICAgICBlbHNlCisgICAgICAgIGlmIChoYW5kbGVSZWplY3QoKSA9PSBSZWplY3RBbmRHaXZlVXApCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHSU1fQ2hlY2tDb25zdGFudEludDogeworICAgICAgaW50NjRfdCBJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IE9wSWR4ID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBWYWx1ZSA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogR0lNX0NoZWNrQ29uc3RhbnRJbnQoTUlzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgSW5zbklEIDw8ICJdLT5nZXRPcGVyYW5kKCIgPDwgT3BJZHgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIiksIFZhbHVlPSIgPDwgVmFsdWUgPDwgIilcbiIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdICE9IG51bGxwdHIgJiYgIlVzZWQgaW5zbiBiZWZvcmUgZGVmaW5lZCIpOworCisgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBTdGF0ZS5NSXNbSW5zbklEXS0+Z2V0T3BlcmFuZChPcElkeCk7CisgICAgICBpZiAoTU8uaXNSZWcoKSkgeworICAgICAgICAvLyBpc09wZXJhbmRJbW1FcXVhbCgpIHdpbGwgc2lnbi1leHRlbmQgdG8gNjQtYml0cywgc28gc2hvdWxkIHdlLgorICAgICAgICBMTFQgVHkgPSBNUkkuZ2V0VHlwZShNTy5nZXRSZWcoKSk7CisgICAgICAgIFZhbHVlID0gU2lnbkV4dGVuZDY0KFZhbHVlLCBUeS5nZXRTaXplSW5CaXRzKCkpOworCisgICAgICAgIGlmICghaXNPcGVyYW5kSW1tRXF1YWwoTU8sIFZhbHVlLCBNUkkpKSB7CisgICAgICAgICAgaWYgKGhhbmRsZVJlamVjdCgpID09IFJlamVjdEFuZEdpdmVVcCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChoYW5kbGVSZWplY3QoKSA9PSBSZWplY3RBbmRHaXZlVXApCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHSU1fQ2hlY2tMaXRlcmFsSW50OiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgT3BJZHggPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IFZhbHVlID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBHSU1fQ2hlY2tMaXRlcmFsSW50KE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluc25JRCA8PCAiXS0+Z2V0T3BlcmFuZCgiIDw8IE9wSWR4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpLCBWYWx1ZT0iIDw8IFZhbHVlIDw8ICIpXG4iKTsKKyAgICAgIGFzc2VydChTdGF0ZS5NSXNbSW5zbklEXSAhPSBudWxscHRyICYmICJVc2VkIGluc24gYmVmb3JlIGRlZmluZWQiKTsKKyAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IFN0YXRlLk1Jc1tJbnNuSURdLT5nZXRPcGVyYW5kKE9wSWR4KTsKKyAgICAgIGlmICghTU8uaXNDSW1tKCkgfHwgIU1PLmdldENJbW0oKS0+ZXF1YWxzSW50KFZhbHVlKSkgeworICAgICAgICBpZiAoaGFuZGxlUmVqZWN0KCkgPT0gUmVqZWN0QW5kR2l2ZVVwKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR0lNX0NoZWNrSW50cmluc2ljSUQ6IHsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBPcElkeCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgVmFsdWUgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IEdJTV9DaGVja0ludHJpbnNpY0lEKE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluc25JRCA8PCAiXS0+Z2V0T3BlcmFuZCgiIDw8IE9wSWR4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpLCBWYWx1ZT0iIDw8IFZhbHVlIDw8ICIpXG4iKTsKKyAgICAgIGFzc2VydChTdGF0ZS5NSXNbSW5zbklEXSAhPSBudWxscHRyICYmICJVc2VkIGluc24gYmVmb3JlIGRlZmluZWQiKTsKKyAgICAgIE1hY2hpbmVPcGVyYW5kICZNTyA9IFN0YXRlLk1Jc1tJbnNuSURdLT5nZXRPcGVyYW5kKE9wSWR4KTsKKyAgICAgIGlmICghTU8uaXNJbnRyaW5zaWNJRCgpIHx8IE1PLmdldEludHJpbnNpY0lEKCkgIT0gVmFsdWUpCisgICAgICAgIGlmIChoYW5kbGVSZWplY3QoKSA9PSBSZWplY3RBbmRHaXZlVXApCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHSU1fQ2hlY2tJc01CQjogeworICAgICAgaW50NjRfdCBJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IE9wSWR4ID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBHSU1fQ2hlY2tJc01CQihNSXNbIiA8PCBJbnNuSUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIl0tPmdldE9wZXJhbmQoIiA8PCBPcElkeCA8PCAiKSlcbiIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdICE9IG51bGxwdHIgJiYgIlVzZWQgaW5zbiBiZWZvcmUgZGVmaW5lZCIpOworICAgICAgaWYgKCFTdGF0ZS5NSXNbSW5zbklEXS0+Z2V0T3BlcmFuZChPcElkeCkuaXNNQkIoKSkgeworICAgICAgICBpZiAoaGFuZGxlUmVqZWN0KCkgPT0gUmVqZWN0QW5kR2l2ZVVwKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR0lNX0NoZWNrSXNTYWZlVG9Gb2xkOiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogR0lNX0NoZWNrSXNTYWZlVG9Gb2xkKE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluc25JRCA8PCAiXSlcbiIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdICE9IG51bGxwdHIgJiYgIlVzZWQgaW5zbiBiZWZvcmUgZGVmaW5lZCIpOworICAgICAgaWYgKCFpc09idmlvdXNseVNhZmVUb0ZvbGQoKlN0YXRlLk1Jc1tJbnNuSURdLCAqU3RhdGUuTUlzWzBdKSkgeworICAgICAgICBpZiAoaGFuZGxlUmVqZWN0KCkgPT0gUmVqZWN0QW5kR2l2ZVVwKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdJTV9DaGVja0lzU2FtZU9wZXJhbmQ6IHsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBPcElkeCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgT3RoZXJJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IE90aGVyT3BJZHggPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IEdJTV9DaGVja0lzU2FtZU9wZXJhbmQoTUlzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgSW5zbklEIDw8ICJdWyIgPDwgT3BJZHggPDwgIl0sIE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IE90aGVySW5zbklEIDw8ICJdWyIgPDwgT3RoZXJPcElkeCA8PCAiXSlcbiIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdICE9IG51bGxwdHIgJiYgIlVzZWQgaW5zbiBiZWZvcmUgZGVmaW5lZCIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tPdGhlckluc25JRF0gIT0gbnVsbHB0ciAmJiAiVXNlZCBpbnNuIGJlZm9yZSBkZWZpbmVkIik7CisgICAgICBpZiAoIVN0YXRlLk1Jc1tJbnNuSURdLT5nZXRPcGVyYW5kKE9wSWR4KS5pc0lkZW50aWNhbFRvKAorICAgICAgICAgICAgICBTdGF0ZS5NSXNbT3RoZXJJbnNuSURdLT5nZXRPcGVyYW5kKE90aGVyT3BJZHgpKSkgeworICAgICAgICBpZiAoaGFuZGxlUmVqZWN0KCkgPT0gUmVqZWN0QW5kR2l2ZVVwKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEdJTV9SZWplY3Q6CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IEdJTV9SZWplY3QiKTsKKyAgICAgIGlmIChoYW5kbGVSZWplY3QoKSA9PSBSZWplY3RBbmRHaXZlVXApCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBHSVJfTXV0YXRlT3Bjb2RlOiB7CisgICAgICBpbnQ2NF90IE9sZEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIHVpbnQ2NF90IE5ld0luc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgTmV3T3Bjb2RlID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaWYgKE5ld0luc25JRCA+PSBPdXRNSXMuc2l6ZSgpKQorICAgICAgICBPdXRNSXMucmVzaXplKE5ld0luc25JRCArIDEpOworCisgICAgICBPdXRNSXNbTmV3SW5zbklEXSA9IE1hY2hpbmVJbnN0ckJ1aWxkZXIoKlN0YXRlLk1Jc1tPbGRJbnNuSURdLT5nZXRNRigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlLk1Jc1tPbGRJbnNuSURdKTsKKyAgICAgIE91dE1Jc1tOZXdJbnNuSURdLT5zZXREZXNjKFRJSS5nZXQoTmV3T3Bjb2RlKSk7CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IEdJUl9NdXRhdGVPcGNvZGUoT3V0TUlzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgTmV3SW5zbklEIDw8ICJdLCBNSXNbIiA8PCBPbGRJbnNuSUQgPDwgIl0sICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgTmV3T3Bjb2RlIDw8ICIpXG4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR0lSX0J1aWxkTUk6IHsKKyAgICAgIHVpbnQ2NF90IE5ld0luc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgT3Bjb2RlID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaWYgKE5ld0luc25JRCA+PSBPdXRNSXMuc2l6ZSgpKQorICAgICAgICBPdXRNSXMucmVzaXplKE5ld0luc25JRCArIDEpOworCisgICAgICBPdXRNSXNbTmV3SW5zbklEXSA9IEJ1aWxkTUkoKlN0YXRlLk1Jc1swXS0+Z2V0UGFyZW50KCksIFN0YXRlLk1Jc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZS5NSXNbMF0tPmdldERlYnVnTG9jKCksIFRJSS5nZXQoT3Bjb2RlKSk7CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IEdJUl9CdWlsZE1JKE91dE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IE5ld0luc25JRCA8PCAiXSwgIiA8PCBPcGNvZGUgPDwgIilcbiIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHSVJfQ29weTogeworICAgICAgaW50NjRfdCBOZXdJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IE9sZEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgT3BJZHggPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBhc3NlcnQoT3V0TUlzW05ld0luc25JRF0gJiYgIkF0dGVtcHRlZCB0byBhZGQgdG8gdW5kZWZpbmVkIGluc3RydWN0aW9uIik7CisgICAgICBPdXRNSXNbTmV3SW5zbklEXS5hZGQoU3RhdGUuTUlzW09sZEluc25JRF0tPmdldE9wZXJhbmQoT3BJZHgpKTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEN1cnJlbnRJZHggPDwgIjogR0lSX0NvcHkoT3V0TUlzWyIgPDwgTmV3SW5zbklECisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJdLCBNSXNbIiA8PCBPbGRJbnNuSUQgPDwgIl0sICIgPDwgT3BJZHggPDwgIilcbiIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHSVJfQ29weU9yQWRkWmVyb1JlZzogeworICAgICAgaW50NjRfdCBOZXdJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IE9sZEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgT3BJZHggPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IFplcm9SZWcgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBhc3NlcnQoT3V0TUlzW05ld0luc25JRF0gJiYgIkF0dGVtcHRlZCB0byBhZGQgdG8gdW5kZWZpbmVkIGluc3RydWN0aW9uIik7CisgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBTdGF0ZS5NSXNbT2xkSW5zbklEXS0+Z2V0T3BlcmFuZChPcElkeCk7CisgICAgICBpZiAoaXNPcGVyYW5kSW1tRXF1YWwoTU8sIDAsIE1SSSkpCisgICAgICAgIE91dE1Jc1tOZXdJbnNuSURdLmFkZFJlZyhaZXJvUmVnKTsKKyAgICAgIGVsc2UKKyAgICAgICAgT3V0TUlzW05ld0luc25JRF0uYWRkKE1PKTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogR0lSX0NvcHlPckFkZFplcm9SZWcoT3V0TUlzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgTmV3SW5zbklEIDw8ICJdLCBNSXNbIiA8PCBPbGRJbnNuSUQgPDwgIl0sICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgT3BJZHggPDwgIiwgIiA8PCBaZXJvUmVnIDw8ICIpXG4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR0lSX0NvcHlTdWJSZWc6IHsKKyAgICAgIGludDY0X3QgTmV3SW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBPbGRJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IE9wSWR4ID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBTdWJSZWdJZHggPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBhc3NlcnQoT3V0TUlzW05ld0luc25JRF0gJiYgIkF0dGVtcHRlZCB0byBhZGQgdG8gdW5kZWZpbmVkIGluc3RydWN0aW9uIik7CisgICAgICBPdXRNSXNbTmV3SW5zbklEXS5hZGRSZWcoU3RhdGUuTUlzW09sZEluc25JRF0tPmdldE9wZXJhbmQoT3BJZHgpLmdldFJlZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIFN1YlJlZ0lkeCk7CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IEdJUl9Db3B5U3ViUmVnKE91dE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IE5ld0luc25JRCA8PCAiXSwgTUlzWyIgPDwgT2xkSW5zbklEIDw8ICJdLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IE9wSWR4IDw8ICIsICIgPDwgU3ViUmVnSWR4IDw8ICIpXG4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR0lSX0FkZEltcGxpY2l0RGVmOiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgUmVnTnVtID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgYXNzZXJ0KE91dE1Jc1tJbnNuSURdICYmICJBdHRlbXB0ZWQgdG8gYWRkIHRvIHVuZGVmaW5lZCBpbnN0cnVjdGlvbiIpOworICAgICAgT3V0TUlzW0luc25JRF0uYWRkRGVmKFJlZ051bSwgUmVnU3RhdGU6OkltcGxpY2l0KTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogR0lSX0FkZEltcGxpY2l0RGVmKE91dE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluc25JRCA8PCAiXSwgIiA8PCBSZWdOdW0gPDwgIilcbiIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHSVJfQWRkSW1wbGljaXRVc2U6IHsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBSZWdOdW0gPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBhc3NlcnQoT3V0TUlzW0luc25JRF0gJiYgIkF0dGVtcHRlZCB0byBhZGQgdG8gdW5kZWZpbmVkIGluc3RydWN0aW9uIik7CisgICAgICBPdXRNSXNbSW5zbklEXS5hZGRVc2UoUmVnTnVtLCBSZWdTdGF0ZTo6SW1wbGljaXQpOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBHSVJfQWRkSW1wbGljaXRVc2UoT3V0TUlzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgSW5zbklEIDw8ICJdLCAiIDw8IFJlZ051bSA8PCAiKVxuIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdJUl9BZGRSZWdpc3RlcjogeworICAgICAgaW50NjRfdCBJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IFJlZ051bSA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGFzc2VydChPdXRNSXNbSW5zbklEXSAmJiAiQXR0ZW1wdGVkIHRvIGFkZCB0byB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24iKTsKKyAgICAgIE91dE1Jc1tJbnNuSURdLmFkZFJlZyhSZWdOdW0pOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBHSVJfQWRkUmVnaXN0ZXIoT3V0TUlzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgSW5zbklEIDw8ICJdLCAiIDw8IFJlZ051bSA8PCAiKVxuIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdJUl9BZGRUZW1wUmVnaXN0ZXI6IHsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBUZW1wUmVnSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICB1aW50NjRfdCBUZW1wUmVnRmxhZ3MgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBhc3NlcnQoT3V0TUlzW0luc25JRF0gJiYgIkF0dGVtcHRlZCB0byBhZGQgdG8gdW5kZWZpbmVkIGluc3RydWN0aW9uIik7CisgICAgICBPdXRNSXNbSW5zbklEXS5hZGRSZWcoU3RhdGUuVGVtcFJlZ2lzdGVyc1tUZW1wUmVnSURdLCBUZW1wUmVnRmxhZ3MpOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBHSVJfQWRkVGVtcFJlZ2lzdGVyKE91dE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluc25JRCA8PCAiXSwgVGVtcFJlZ2lzdGVyc1siIDw8IFRlbXBSZWdJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXSwgIiA8PCBUZW1wUmVnRmxhZ3MgPDwgIilcbiIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHSVJfQWRkSW1tOiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgSW1tID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgYXNzZXJ0KE91dE1Jc1tJbnNuSURdICYmICJBdHRlbXB0ZWQgdG8gYWRkIHRvIHVuZGVmaW5lZCBpbnN0cnVjdGlvbiIpOworICAgICAgT3V0TUlzW0luc25JRF0uYWRkSW1tKEltbSk7CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IEdJUl9BZGRJbW0oT3V0TUlzWyIgPDwgSW5zbklECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICJdLCAiIDw8IEltbSA8PCAiKVxuIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdJUl9Db21wbGV4UmVuZGVyZXI6IHsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgaW50NjRfdCBSZW5kZXJlcklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgYXNzZXJ0KE91dE1Jc1tJbnNuSURdICYmICJBdHRlbXB0ZWQgdG8gYWRkIHRvIHVuZGVmaW5lZCBpbnN0cnVjdGlvbiIpOworICAgICAgZm9yIChjb25zdCBhdXRvICZSZW5kZXJPcEZuIDogU3RhdGUuUmVuZGVyZXJzW1JlbmRlcmVySURdKQorICAgICAgICBSZW5kZXJPcEZuKE91dE1Jc1tJbnNuSURdKTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogR0lSX0NvbXBsZXhSZW5kZXJlcihPdXRNSXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBJbnNuSUQgPDwgIl0sICIgPDwgUmVuZGVyZXJJRCA8PCAiKVxuIik7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHSVJfQ29tcGxleFN1Yk9wZXJhbmRSZW5kZXJlcjogeworICAgICAgaW50NjRfdCBJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IFJlbmRlcmVySUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IFJlbmRlck9wSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBhc3NlcnQoT3V0TUlzW0luc25JRF0gJiYgIkF0dGVtcHRlZCB0byBhZGQgdG8gdW5kZWZpbmVkIGluc3RydWN0aW9uIik7CisgICAgICBTdGF0ZS5SZW5kZXJlcnNbUmVuZGVyZXJJRF1bUmVuZGVyT3BJRF0oT3V0TUlzW0luc25JRF0pOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiOiBHSVJfQ29tcGxleFN1Yk9wZXJhbmRSZW5kZXJlcihPdXRNSXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBJbnNuSUQgPDwgIl0sICIgPDwgUmVuZGVyZXJJRCA8PCAiLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IFJlbmRlck9wSUQgPDwgIilcbiIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHSVJfQ29weUNvbnN0YW50QXNTSW1tOiB7CisgICAgICBpbnQ2NF90IE5ld0luc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgT2xkSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgYXNzZXJ0KE91dE1Jc1tOZXdJbnNuSURdICYmICJBdHRlbXB0ZWQgdG8gYWRkIHRvIHVuZGVmaW5lZCBpbnN0cnVjdGlvbiIpOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tPbGRJbnNuSURdLT5nZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OkdfQ09OU1RBTlQgJiYgIkV4cGVjdGVkIEdfQ09OU1RBTlQiKTsKKyAgICAgIGlmIChTdGF0ZS5NSXNbT2xkSW5zbklEXS0+Z2V0T3BlcmFuZCgxKS5pc0NJbW0oKSkgeworICAgICAgICBPdXRNSXNbTmV3SW5zbklEXS5hZGRJbW0oCisgICAgICAgICAgICBTdGF0ZS5NSXNbT2xkSW5zbklEXS0+Z2V0T3BlcmFuZCgxKS5nZXRDSW1tKCktPmdldFNFeHRWYWx1ZSgpKTsKKyAgICAgIH0gZWxzZSBpZiAoU3RhdGUuTUlzW09sZEluc25JRF0tPmdldE9wZXJhbmQoMSkuaXNJbW0oKSkKKyAgICAgICAgT3V0TUlzW05ld0luc25JRF0uYWRkKFN0YXRlLk1Jc1tPbGRJbnNuSURdLT5nZXRPcGVyYW5kKDEpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiRXhwZWN0ZWQgSW1tIG9yIENJbW0gb3BlcmFuZCIpOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBHSVJfQ29weUNvbnN0YW50QXNTSW1tKE91dE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IE5ld0luc25JRCA8PCAiXSwgTUlzWyIgPDwgT2xkSW5zbklEIDw8ICJdKVxuIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdJUl9DdXN0b21SZW5kZXJlcjogeworICAgICAgaW50NjRfdCBJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IE9sZEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgUmVuZGVyZXJGbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgYXNzZXJ0KE91dE1Jc1tJbnNuSURdICYmICJBdHRlbXB0ZWQgdG8gYWRkIHRvIHVuZGVmaW5lZCBpbnN0cnVjdGlvbiIpOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBHSVJfQ3VzdG9tUmVuZGVyZXIoT3V0TUlzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgSW5zbklEIDw8ICJdLCBNSXNbIiA8PCBPbGRJbnNuSUQgPDwgIl0sICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgUmVuZGVyZXJGbklEIDw8ICIpXG4iKTsKKyAgICAgIChJU2VsLipJU2VsSW5mby5DdXN0b21SZW5kZXJlcnNbUmVuZGVyZXJGbklEXSkoT3V0TUlzW0luc25JRF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpTdGF0ZS5NSXNbT2xkSW5zbklEXSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBHSVJfQ29uc3RyYWluT3BlcmFuZFJDOiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgT3BJZHggPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBpbnQ2NF90IFJDRW51bSA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGFzc2VydChPdXRNSXNbSW5zbklEXSAmJiAiQXR0ZW1wdGVkIHRvIGFkZCB0byB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24iKTsKKyAgICAgIGNvbnN0cmFpbk9wZXJhbmRSZWdUb1JlZ0NsYXNzKCpPdXRNSXNbSW5zbklEXS5nZXRJbnN0cigpLCBPcElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpUUkkuZ2V0UmVnQ2xhc3MoUkNFbnVtKSwgVElJLCBUUkksIFJCSSk7CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IEdJUl9Db25zdHJhaW5PcGVyYW5kUkMoT3V0TUlzWyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgSW5zbklEIDw8ICJdLCAiIDw8IE9wSWR4IDw8ICIsICIgPDwgUkNFbnVtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIpXG4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR0lSX0NvbnN0cmFpblNlbGVjdGVkSW5zdE9wZXJhbmRzOiB7CisgICAgICBpbnQ2NF90IEluc25JRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGFzc2VydChPdXRNSXNbSW5zbklEXSAmJiAiQXR0ZW1wdGVkIHRvIGFkZCB0byB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24iKTsKKyAgICAgIGNvbnN0cmFpblNlbGVjdGVkSW5zdFJlZ09wZXJhbmRzKCpPdXRNSXNbSW5zbklEXS5nZXRJbnN0cigpLCBUSUksIFRSSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJCSSk7CisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI6IEdJUl9Db25zdHJhaW5TZWxlY3RlZEluc3RPcGVyYW5kcyhPdXRNSXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBJbnNuSUQgPDwgIl0pXG4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR0lSX01lcmdlTWVtT3BlcmFuZHM6IHsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgYXNzZXJ0KE91dE1Jc1tJbnNuSURdICYmICJBdHRlbXB0ZWQgdG8gYWRkIHRvIHVuZGVmaW5lZCBpbnN0cnVjdGlvbiIpOworCisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKSA8PCBDdXJyZW50SWR4IDw8ICI6IEdJUl9NZXJnZU1lbU9wZXJhbmRzKE91dE1Jc1siCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IEluc25JRCA8PCAiXSIpOworICAgICAgaW50NjRfdCBNZXJnZUluc25JRCA9IEdJVV9NZXJnZU1lbU9wZXJhbmRzX0VuZE9mTGlzdDsKKyAgICAgIHdoaWxlICgoTWVyZ2VJbnNuSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK10pICE9CisgICAgICAgICAgICAgR0lVX01lcmdlTWVtT3BlcmFuZHNfRW5kT2ZMaXN0KSB7CisgICAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgIiwgTUlzWyIgPDwgTWVyZ2VJbnNuSUQgPDwgIl0iKTsKKyAgICAgICAgZm9yIChjb25zdCBhdXRvICZNTU8gOiBTdGF0ZS5NSXNbTWVyZ2VJbnNuSURdLT5tZW1vcGVyYW5kcygpKQorICAgICAgICAgIE91dE1Jc1tJbnNuSURdLmFkZE1lbU9wZXJhbmQoTU1PKTsKKyAgICAgIH0KKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksIGRiZ3MoKSA8PCAiKVxuIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdJUl9FcmFzZUZyb21QYXJlbnQ6IHsKKyAgICAgIGludDY0X3QgSW5zbklEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworICAgICAgYXNzZXJ0KFN0YXRlLk1Jc1tJbnNuSURdICYmCisgICAgICAgICAgICAgIkF0dGVtcHRlZCB0byBlcmFzZSBhbiB1bmRlZmluZWQgaW5zdHJ1Y3Rpb24iKTsKKyAgICAgIFN0YXRlLk1Jc1tJbnNuSURdLT5lcmFzZUZyb21QYXJlbnQoKTsKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogR0lSX0VyYXNlRnJvbVBhcmVudChNSXNbIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBJbnNuSUQgPDwgIl0pXG4iKTsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIGNhc2UgR0lSX01ha2VUZW1wUmVnOiB7CisgICAgICBpbnQ2NF90IFRlbXBSZWdJRCA9IE1hdGNoVGFibGVbQ3VycmVudElkeCsrXTsKKyAgICAgIGludDY0X3QgVHlwZUlEID0gTWF0Y2hUYWJsZVtDdXJyZW50SWR4KytdOworCisgICAgICBTdGF0ZS5UZW1wUmVnaXN0ZXJzW1RlbXBSZWdJRF0gPQorICAgICAgICAgIE1SSS5jcmVhdGVHZW5lcmljVmlydHVhbFJlZ2lzdGVyKElTZWxJbmZvLlR5cGVPYmplY3RzW1R5cGVJRF0pOworICAgICAgREVCVUdfV0lUSF9UWVBFKFRndEluc3RydWN0aW9uU2VsZWN0b3I6OmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICBkYmdzKCkgPDwgQ3VycmVudElkeCA8PCAiOiBUZW1wUmVnc1siIDw8IFRlbXBSZWdJRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiXSA9IEdJUl9NYWtlVGVtcFJlZygiIDw8IFR5cGVJRCA8PCAiKVxuIik7CisgICAgICBicmVhazsKKyAgICB9CisKKyAgICBjYXNlIEdJUl9Db3ZlcmFnZTogeworICAgICAgaW50NjRfdCBSdWxlSUQgPSBNYXRjaFRhYmxlW0N1cnJlbnRJZHgrK107CisgICAgICBDb3ZlcmFnZUluZm8uc2V0Q292ZXJlZChSdWxlSUQpOworCisgICAgICBERUJVR19XSVRIX1RZUEUoVGd0SW5zdHJ1Y3Rpb25TZWxlY3Rvcjo6Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgIGRiZ3MoKQorICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBDdXJyZW50SWR4IDw8ICI6IEdJUl9Db3ZlcmFnZSgiIDw8IFJ1bGVJRCA8PCAiKSIpOworICAgICAgYnJlYWs7CisgICAgfQorCisgICAgY2FzZSBHSVJfRG9uZToKKyAgICAgIERFQlVHX1dJVEhfVFlQRShUZ3RJbnN0cnVjdGlvblNlbGVjdG9yOjpnZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgZGJncygpIDw8IEN1cnJlbnRJZHggPDwgIjogR0lSX0RvbmUiKTsKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgZGVmYXVsdDoKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuZXhwZWN0ZWQgY29tbWFuZCIpOworICAgIH0KKyAgfQorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfSU5TVFJVQ1RJT05TRUxFQ1RPUklNUExfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTGVnYWxpemF0aW9uQXJ0aWZhY3RDb21iaW5lci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTGVnYWxpemF0aW9uQXJ0aWZhY3RDb21iaW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExZjU2NGIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9MZWdhbGl6YXRpb25BcnRpZmFjdENvbWJpbmVyLmgKQEAgLTAsMCArMSwyODcgQEAKKy8vPT09LS0gbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTGVnYWxpemF0aW9uQXJ0aWZhY3RDb21iaW5lci5oIC0tPT09PT09PT09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHNvbWUgaGVscGVyIGZ1bmN0aW9ucyB3aGljaCB0cnkgdG8gY2xlYW51cCBhcnRpZmFjdHMKKy8vIHN1Y2ggYXMgR19UUlVOQ3MvR19bWlNBXUVYVEVORFMgdGhhdCB3ZXJlIGNyZWF0ZWQgZHVyaW5nIGxlZ2FsaXphdGlvbiB0byBtYWtlCisvLyB0aGUgdHlwZXMgbWF0Y2guIFRoaXMgZmlsZSBhbHNvIGNvbnRhaW5zIHNvbWUgY29tYmluZXMgb2YgbWVyZ2VzIHRoYXQgaGFwcGVucworLy8gYXQgdGhlIGVuZCBvZiB0aGUgbGVnYWxpemF0aW9uLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0xlZ2FsaXplci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0xlZ2FsaXplckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9NYWNoaW5lSVJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvVXRpbHMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorCisjZGVmaW5lIERFQlVHX1RZUEUgImxlZ2FsaXplciIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTGVnYWxpemF0aW9uQXJ0aWZhY3RDb21iaW5lciB7CisgIE1hY2hpbmVJUkJ1aWxkZXIgJkJ1aWxkZXI7CisgIE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSTsKKyAgY29uc3QgTGVnYWxpemVySW5mbyAmTEk7CisKK3B1YmxpYzoKKyAgTGVnYWxpemF0aW9uQXJ0aWZhY3RDb21iaW5lcihNYWNoaW5lSVJCdWlsZGVyICZCLCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IExlZ2FsaXplckluZm8gJkxJKQorICAgICAgOiBCdWlsZGVyKEIpLCBNUkkoTVJJKSwgTEkoTEkpIHt9CisKKyAgYm9vbCB0cnlDb21iaW5lQW55RXh0KE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUluc3RyICo+ICZEZWFkSW5zdHMpIHsKKyAgICBpZiAoTUkuZ2V0T3Bjb2RlKCkgIT0gVGFyZ2V0T3Bjb2RlOjpHX0FOWUVYVCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoTWFjaGluZUluc3RyICpEZWZNSSA9IGdldE9wY29kZURlZihUYXJnZXRPcGNvZGU6OkdfVFJVTkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUkuZ2V0T3BlcmFuZCgxKS5nZXRSZWcoKSwgTVJJKSkgeworICAgICAgREVCVUcoZGJncygpIDw8ICIuLiBDb21iaW5lIE1JOiAiIDw8IE1JOyk7CisgICAgICB1bnNpZ25lZCBEc3RSZWcgPSBNSS5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgICAgdW5zaWduZWQgU3JjUmVnID0gRGVmTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCk7CisgICAgICBCdWlsZGVyLnNldEluc3RyKE1JKTsKKyAgICAgIC8vIFdlIGdldCBhIGNvcHkvdHJ1bmMvZXh0ZW5kIGRlcGVuZGluZyBvbiB0aGUgc2l6ZXMKKyAgICAgIEJ1aWxkZXIuYnVpbGRBbnlFeHRPclRydW5jKERzdFJlZywgU3JjUmVnKTsKKyAgICAgIG1hcmtJbnN0QW5kRGVmRGVhZChNSSwgKkRlZk1JLCBEZWFkSW5zdHMpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiB0cnlGb2xkSW1wbGljaXREZWYoTUksIERlYWRJbnN0cyk7CisgIH0KKworICBib29sIHRyeUNvbWJpbmVaRXh0KE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0ciAqPiAmRGVhZEluc3RzKSB7CisKKyAgICBpZiAoTUkuZ2V0T3Bjb2RlKCkgIT0gVGFyZ2V0T3Bjb2RlOjpHX1pFWFQpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKE1hY2hpbmVJbnN0ciAqRGVmTUkgPSBnZXRPcGNvZGVEZWYoVGFyZ2V0T3Bjb2RlOjpHX1RSVU5DLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1JLmdldE9wZXJhbmQoMSkuZ2V0UmVnKCksIE1SSSkpIHsKKyAgICAgIHVuc2lnbmVkIERzdFJlZyA9IE1JLmdldE9wZXJhbmQoMCkuZ2V0UmVnKCk7CisgICAgICBMTFQgRHN0VHkgPSBNUkkuZ2V0VHlwZShEc3RSZWcpOworICAgICAgaWYgKGlzSW5zdFVuc3VwcG9ydGVkKHtUYXJnZXRPcGNvZGU6OkdfQU5ELCB7RHN0VHl9fSkgfHwKKyAgICAgICAgICBpc0luc3RVbnN1cHBvcnRlZCh7VGFyZ2V0T3Bjb2RlOjpHX0NPTlNUQU5ULCB7RHN0VHl9fSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiLi4gQ29tYmluZSBNSTogIiA8PCBNSTspOworICAgICAgQnVpbGRlci5zZXRJbnN0cihNSSk7CisgICAgICB1bnNpZ25lZCBaRXh0U3JjID0gTUkuZ2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgICAgIExMVCBaRXh0U3JjVHkgPSBNUkkuZ2V0VHlwZShaRXh0U3JjKTsKKyAgICAgIEFQSW50IE1hc2sgPSBBUEludDo6Z2V0QWxsT25lc1ZhbHVlKFpFeHRTcmNUeS5nZXRTaXplSW5CaXRzKCkpOworICAgICAgYXV0byBNYXNrQ3N0TUlCID0gQnVpbGRlci5idWlsZENvbnN0YW50KERzdFR5LCBNYXNrLmdldFpFeHRWYWx1ZSgpKTsKKyAgICAgIHVuc2lnbmVkIFRydW5jU3JjID0gRGVmTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCk7CisgICAgICAvLyBXZSBnZXQgYSBjb3B5L3RydW5jL2V4dGVuZCBkZXBlbmRpbmcgb24gdGhlIHNpemVzCisgICAgICBhdXRvIFNyY0NvcHlPclRydW5jID0gQnVpbGRlci5idWlsZEFueUV4dE9yVHJ1bmMoRHN0VHksIFRydW5jU3JjKTsKKyAgICAgIEJ1aWxkZXIuYnVpbGRBbmQoRHN0UmVnLCBTcmNDb3B5T3JUcnVuYywgTWFza0NzdE1JQik7CisgICAgICBtYXJrSW5zdEFuZERlZkRlYWQoTUksICpEZWZNSSwgRGVhZEluc3RzKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gdHJ5Rm9sZEltcGxpY2l0RGVmKE1JLCBEZWFkSW5zdHMpOworICB9CisKKyAgYm9vbCB0cnlDb21iaW5lU0V4dChNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIgKj4gJkRlYWRJbnN0cykgeworCisgICAgaWYgKE1JLmdldE9wY29kZSgpICE9IFRhcmdldE9wY29kZTo6R19TRVhUKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChNYWNoaW5lSW5zdHIgKkRlZk1JID0gZ2V0T3Bjb2RlRGVmKFRhcmdldE9wY29kZTo6R19UUlVOQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSS5nZXRPcGVyYW5kKDEpLmdldFJlZygpLCBNUkkpKSB7CisgICAgICB1bnNpZ25lZCBEc3RSZWcgPSBNSS5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgICAgTExUIERzdFR5ID0gTVJJLmdldFR5cGUoRHN0UmVnKTsKKyAgICAgIGlmIChpc0luc3RVbnN1cHBvcnRlZCh7VGFyZ2V0T3Bjb2RlOjpHX1NITCwge0RzdFR5fX0pIHx8CisgICAgICAgICAgaXNJbnN0VW5zdXBwb3J0ZWQoe1RhcmdldE9wY29kZTo6R19BU0hSLCB7RHN0VHl9fSkgfHwKKyAgICAgICAgICBpc0luc3RVbnN1cHBvcnRlZCh7VGFyZ2V0T3Bjb2RlOjpHX0NPTlNUQU5ULCB7RHN0VHl9fSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiLi4gQ29tYmluZSBNSTogIiA8PCBNSTspOworICAgICAgQnVpbGRlci5zZXRJbnN0cihNSSk7CisgICAgICB1bnNpZ25lZCBTRXh0U3JjID0gTUkuZ2V0T3BlcmFuZCgxKS5nZXRSZWcoKTsKKyAgICAgIExMVCBTRXh0U3JjVHkgPSBNUkkuZ2V0VHlwZShTRXh0U3JjKTsKKyAgICAgIHVuc2lnbmVkIFNpemVEaWZmID0gRHN0VHkuZ2V0U2l6ZUluQml0cygpIC0gU0V4dFNyY1R5LmdldFNpemVJbkJpdHMoKTsKKyAgICAgIGF1dG8gU2l6ZURpZmZNSUIgPSBCdWlsZGVyLmJ1aWxkQ29uc3RhbnQoRHN0VHksIFNpemVEaWZmKTsKKyAgICAgIHVuc2lnbmVkIFRydW5jU3JjUmVnID0gRGVmTUktPmdldE9wZXJhbmQoMSkuZ2V0UmVnKCk7CisgICAgICAvLyBXZSBnZXQgYSBjb3B5L3RydW5jL2V4dGVuZCBkZXBlbmRpbmcgb24gdGhlIHNpemVzCisgICAgICBhdXRvIFNyY0NvcHlFeHRPclRydW5jID0gQnVpbGRlci5idWlsZEFueUV4dE9yVHJ1bmMoRHN0VHksIFRydW5jU3JjUmVnKTsKKyAgICAgIGF1dG8gU2hsTUlCID0gQnVpbGRlci5idWlsZEluc3RyKFRhcmdldE9wY29kZTo6R19TSEwsIERzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3JjQ29weUV4dE9yVHJ1bmMsIFNpemVEaWZmTUlCKTsKKyAgICAgIEJ1aWxkZXIuYnVpbGRJbnN0cihUYXJnZXRPcGNvZGU6OkdfQVNIUiwgRHN0UmVnLCBTaGxNSUIsIFNpemVEaWZmTUlCKTsKKyAgICAgIG1hcmtJbnN0QW5kRGVmRGVhZChNSSwgKkRlZk1JLCBEZWFkSW5zdHMpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiB0cnlGb2xkSW1wbGljaXREZWYoTUksIERlYWRJbnN0cyk7CisgIH0KKworICAvLy8gVHJ5IHRvIGZvbGQgc2IgPSBFWFRFTkQgKEdfSU1QTElDSVRfREVGIHNhKSAtPiBzYiA9IEdfSU1QTElDSVRfREVGCisgIGJvb2wgdHJ5Rm9sZEltcGxpY2l0RGVmKE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIgKj4gJkRlYWRJbnN0cykgeworICAgIHVuc2lnbmVkIE9wY29kZSA9IE1JLmdldE9wY29kZSgpOworICAgIGlmIChPcGNvZGUgIT0gVGFyZ2V0T3Bjb2RlOjpHX0FOWUVYVCAmJiBPcGNvZGUgIT0gVGFyZ2V0T3Bjb2RlOjpHX1pFWFQgJiYKKyAgICAgICAgT3Bjb2RlICE9IFRhcmdldE9wY29kZTo6R19TRVhUKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKE1hY2hpbmVJbnN0ciAqRGVmTUkgPSBnZXRPcGNvZGVEZWYoVGFyZ2V0T3Bjb2RlOjpHX0lNUExJQ0lUX0RFRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNSS5nZXRPcGVyYW5kKDEpLmdldFJlZygpLCBNUkkpKSB7CisgICAgICB1bnNpZ25lZCBEc3RSZWcgPSBNSS5nZXRPcGVyYW5kKDApLmdldFJlZygpOworICAgICAgTExUIERzdFR5ID0gTVJJLmdldFR5cGUoRHN0UmVnKTsKKyAgICAgIGlmIChpc0luc3RVbnN1cHBvcnRlZCh7VGFyZ2V0T3Bjb2RlOjpHX0lNUExJQ0lUX0RFRiwge0RzdFR5fX0pKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIi4uIENvbWJpbmUgRVhUKElNUExJQ0lUX0RFRikgIiA8PCBNSTspOworICAgICAgQnVpbGRlci5zZXRJbnN0cihNSSk7CisgICAgICBCdWlsZGVyLmJ1aWxkSW5zdHIoVGFyZ2V0T3Bjb2RlOjpHX0lNUExJQ0lUX0RFRiwgRHN0UmVnKTsKKyAgICAgIG1hcmtJbnN0QW5kRGVmRGVhZChNSSwgKkRlZk1JLCBEZWFkSW5zdHMpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGJvb2wgdHJ5Q29tYmluZU1lcmdlcyhNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0ciAqPiAmRGVhZEluc3RzKSB7CisKKyAgICBpZiAoTUkuZ2V0T3Bjb2RlKCkgIT0gVGFyZ2V0T3Bjb2RlOjpHX1VOTUVSR0VfVkFMVUVTKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgdW5zaWduZWQgTnVtRGVmcyA9IE1JLmdldE51bU9wZXJhbmRzKCkgLSAxOworICAgIHVuc2lnbmVkIFNyY1JlZyA9IE1JLmdldE9wZXJhbmQoTnVtRGVmcykuZ2V0UmVnKCk7CisgICAgTWFjaGluZUluc3RyICpNZXJnZUkgPSBNUkkuZ2V0VlJlZ0RlZihTcmNSZWcpOworICAgIGlmICghTWVyZ2VJIHx8IChNZXJnZUktPmdldE9wY29kZSgpICE9IFRhcmdldE9wY29kZTo6R19NRVJHRV9WQUxVRVMpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY29uc3QgdW5zaWduZWQgTnVtTWVyZ2VSZWdzID0gTWVyZ2VJLT5nZXROdW1PcGVyYW5kcygpIC0gMTsKKworICAgIGlmIChOdW1NZXJnZVJlZ3MgPCBOdW1EZWZzKSB7CisgICAgICBpZiAoTnVtRGVmcyAlIE51bU1lcmdlUmVncyAhPSAwKQorICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIEJ1aWxkZXIuc2V0SW5zdHIoTUkpOworICAgICAgLy8gVHJhbnNmb3JtIHRvIFVOTUVSR0VzLCBmb3IgZXhhbXBsZQorICAgICAgLy8gICAlMSA9IEdfTUVSR0VfVkFMVUVTICU0LCAlNQorICAgICAgLy8gICAlOSwgJTEwLCAlMTEsICUxMiA9IEdfVU5NRVJHRV9WQUxVRVMgJTEKKyAgICAgIC8vIHRvCisgICAgICAvLyAgICU5LCAlMTAgPSBHX1VOTUVSR0VfVkFMVUVTICU0CisgICAgICAvLyAgICUxMSwgJTEyID0gR19VTk1FUkdFX1ZBTFVFUyAlNQorCisgICAgICBjb25zdCB1bnNpZ25lZCBOZXdOdW1EZWZzID0gTnVtRGVmcyAvIE51bU1lcmdlUmVnczsKKyAgICAgIGZvciAodW5zaWduZWQgSWR4ID0gMDsgSWR4IDwgTnVtTWVyZ2VSZWdzOyArK0lkeCkgeworICAgICAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMj4gRHN0UmVnczsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBqID0gMCwgRGVmSWR4ID0gSWR4ICogTmV3TnVtRGVmczsgaiA8IE5ld051bURlZnM7CisgICAgICAgICAgICAgKytqLCArK0RlZklkeCkKKyAgICAgICAgICBEc3RSZWdzLnB1c2hfYmFjayhNSS5nZXRPcGVyYW5kKERlZklkeCkuZ2V0UmVnKCkpOworCisgICAgICAgIEJ1aWxkZXIuYnVpbGRVbm1lcmdlKERzdFJlZ3MsIE1lcmdlSS0+Z2V0T3BlcmFuZChJZHggKyAxKS5nZXRSZWcoKSk7CisgICAgICB9CisKKyAgICB9IGVsc2UgaWYgKE51bU1lcmdlUmVncyA+IE51bURlZnMpIHsKKyAgICAgIGlmIChOdW1NZXJnZVJlZ3MgJSBOdW1EZWZzICE9IDApCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgQnVpbGRlci5zZXRJbnN0cihNSSk7CisgICAgICAvLyBUcmFuc2Zvcm0gdG8gTUVSR0VzCisgICAgICAvLyAgICU2ID0gR19NRVJHRV9WQUxVRVMgJTE3LCAlMTgsICUxOSwgJTIwCisgICAgICAvLyAgICU3LCAlOCA9IEdfVU5NRVJHRV9WQUxVRVMgJTYKKyAgICAgIC8vIHRvCisgICAgICAvLyAgICU3ID0gR19NRVJHRV9WQUxVRVMgJTE3LCAlMTgKKyAgICAgIC8vICAgJTggPSBHX01FUkdFX1ZBTFVFUyAlMTksICUyMAorCisgICAgICBjb25zdCB1bnNpZ25lZCBOdW1SZWdzID0gTnVtTWVyZ2VSZWdzIC8gTnVtRGVmczsKKyAgICAgIGZvciAodW5zaWduZWQgRGVmSWR4ID0gMDsgRGVmSWR4IDwgTnVtRGVmczsgKytEZWZJZHgpIHsKKyAgICAgICAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDI+IFJlZ3M7CisgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDAsIElkeCA9IE51bVJlZ3MgKiBEZWZJZHggKyAxOyBqIDwgTnVtUmVnczsKKyAgICAgICAgICAgICArK2osICsrSWR4KQorICAgICAgICAgIFJlZ3MucHVzaF9iYWNrKE1lcmdlSS0+Z2V0T3BlcmFuZChJZHgpLmdldFJlZygpKTsKKworICAgICAgICBCdWlsZGVyLmJ1aWxkTWVyZ2UoTUkuZ2V0T3BlcmFuZChEZWZJZHgpLmdldFJlZygpLCBSZWdzKTsKKyAgICAgIH0KKworICAgIH0gZWxzZSB7CisgICAgICAvLyBGSVhNRTogaXMgYSBDT1BZIGFwcHJvcHJpYXRlIGlmIHRoZSB0eXBlcyBtaXNtYXRjaD8gV2Uga25vdyBib3RoCisgICAgICAvLyByZWdpc3RlcnMgYXJlIGFsbG9jYXRhYmxlIGJ5IG5vdy4KKyAgICAgIGlmIChNUkkuZ2V0VHlwZShNSS5nZXRPcGVyYW5kKDApLmdldFJlZygpKSAhPQorICAgICAgICAgIE1SSS5nZXRUeXBlKE1lcmdlSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKworICAgICAgZm9yICh1bnNpZ25lZCBJZHggPSAwOyBJZHggPCBOdW1EZWZzOyArK0lkeCkKKyAgICAgICAgTVJJLnJlcGxhY2VSZWdXaXRoKE1JLmdldE9wZXJhbmQoSWR4KS5nZXRSZWcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lcmdlSS0+Z2V0T3BlcmFuZChJZHggKyAxKS5nZXRSZWcoKSk7CisgICAgfQorCisgICAgbWFya0luc3RBbmREZWZEZWFkKE1JLCAqTWVyZ2VJLCBEZWFkSW5zdHMpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFRyeSB0byBjb21iaW5lIGF3YXkgTUkuCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgaXQgY29tYmluZWQgYXdheSB0aGUgTUkuCisgIC8vLyBBZGRzIGluc3RydWN0aW9ucyB0aGF0IGFyZSBkZWFkIGFzIGEgcmVzdWx0IG9mIHRoZSBjb21iaW5lCisgIC8vLyBpbnRvIERlYWRJbnN0cywgd2hpY2ggY2FuIGluY2x1ZGUgTUkuCisgIGJvb2wgdHJ5Q29tYmluZUluc3RydWN0aW9uKE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIgKj4gJkRlYWRJbnN0cykgeworICAgIHN3aXRjaCAoTUkuZ2V0T3Bjb2RlKCkpIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgVGFyZ2V0T3Bjb2RlOjpHX0FOWUVYVDoKKyAgICAgIHJldHVybiB0cnlDb21iaW5lQW55RXh0KE1JLCBEZWFkSW5zdHMpOworICAgIGNhc2UgVGFyZ2V0T3Bjb2RlOjpHX1pFWFQ6CisgICAgICByZXR1cm4gdHJ5Q29tYmluZVpFeHQoTUksIERlYWRJbnN0cyk7CisgICAgY2FzZSBUYXJnZXRPcGNvZGU6OkdfU0VYVDoKKyAgICAgIHJldHVybiB0cnlDb21iaW5lU0V4dChNSSwgRGVhZEluc3RzKTsKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6R19VTk1FUkdFX1ZBTFVFUzoKKyAgICAgIHJldHVybiB0cnlDb21iaW5lTWVyZ2VzKE1JLCBEZWFkSW5zdHMpOworICAgIGNhc2UgVGFyZ2V0T3Bjb2RlOjpHX1RSVU5DOiB7CisgICAgICBib29sIENoYW5nZWQgPSBmYWxzZTsKKyAgICAgIGZvciAoYXV0byAmVXNlIDogTVJJLnVzZV9pbnN0cnVjdGlvbnMoTUkuZ2V0T3BlcmFuZCgwKS5nZXRSZWcoKSkpCisgICAgICAgIENoYW5nZWQgfD0gdHJ5Q29tYmluZUluc3RydWN0aW9uKFVzZSwgRGVhZEluc3RzKTsKKyAgICAgIHJldHVybiBDaGFuZ2VkOworICAgIH0KKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIE1hcmsgTUkgYXMgZGVhZC4gSWYgYSBkZWYgb2Ygb25lIG9mIE1JJ3Mgb3BlcmFuZHMsIERlZk1JLCB3b3VsZCBhbHNvIGJlCisgIC8vLyBkZWFkIGR1ZSB0byBNSSBiZWluZyBraWxsZWQsIHRoZW4gbWFyayBEZWZNSSBhcyBkZWFkIHRvby4KKyAgLy8vIFNvbWUgb2YgdGhlIGNvbWJpbmVzIChleHRlbmRzKHRydW5jKSksIHRyeSB0byB3YWxrIHRocm91Z2ggcmVkdW5kYW50CisgIC8vLyBjb3BpZXMgaW4gYmV0d2VlbiB0aGUgZXh0ZW5kcyBhbmQgdGhlIHRydW5jcywgYW5kIHRoaXMgYXR0ZW1wdHMgdG8gY29sbGVjdAorICAvLy8gdGhlIGluIGJldHdlZW4gY29waWVzIGlmIHRoZXkncmUgZGVhZC4KKyAgdm9pZCBtYXJrSW5zdEFuZERlZkRlYWQoTWFjaGluZUluc3RyICZNSSwgTWFjaGluZUluc3RyICZEZWZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0ciAqPiAmRGVhZEluc3RzKSB7CisgICAgRGVhZEluc3RzLnB1c2hfYmFjaygmTUkpOworCisgICAgLy8gQ29sbGVjdCBhbGwgdGhlIGNvcHkgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIG1hZGUgZGVhZCwgZHVlIHRvIGRlbGV0aW5nCisgICAgLy8gdGhpcyBpbnN0cnVjdGlvbi4gQ29sbGVjdCBhbGwgb2YgdGhlbSB1bnRpbCB0aGUgVHJ1bmMoRGVmTUkpLgorICAgIC8vIEVnLAorICAgIC8vICUxKHMxKSA9IEdfVFJVTkMgJTAoczMyKQorICAgIC8vICUyKHMxKSA9IENPUFkgJTEoczEpCisgICAgLy8gJTMoczEpID0gQ09QWSAlMihzMSkKKyAgICAvLyAlNChzMzIpID0gR19BTllFWFQgJTMoczEpCisgICAgLy8gSW4gdGhpcyBjYXNlLCB3ZSB3b3VsZCBoYXZlIHJlcGxhY2VkICU0IHdpdGggYSBjb3B5IG9mICUwLAorICAgIC8vIGFuZCBhcyBhIHJlc3VsdCwgJTMsICUyLCAlMSBhcmUgZGVhZC4KKyAgICBNYWNoaW5lSW5zdHIgKlByZXZNSSA9ICZNSTsKKyAgICB3aGlsZSAoUHJldk1JICE9ICZEZWZNSSkgeworICAgICAgLy8gSWYgd2UncmUgZGVhbGluZyB3aXRoIEdfVU5NRVJHRV9WQUxVRVMsIHRyeUNvbWJpbmVNZXJnZXMgZG9lc24ndCByZWFsbHkgdHJ5CisgICAgICAvLyB0byBmb2xkIGNvcGllcyBpbiBiZXR3ZWVuIGFuZCB3ZSBjYW4gaWdub3JlIHRoZW0gaGVyZS4KKyAgICAgIGlmIChQcmV2TUktPmdldE9wY29kZSgpID09IFRhcmdldE9wY29kZTo6R19VTk1FUkdFX1ZBTFVFUykKKyAgICAgICAgYnJlYWs7CisgICAgICB1bnNpZ25lZCBQcmV2UmVnU3JjID0gUHJldk1JLT5nZXRPcGVyYW5kKDEpLmdldFJlZygpOworICAgICAgTWFjaGluZUluc3RyICpUbXBEZWYgPSBNUkkuZ2V0VlJlZ0RlZihQcmV2UmVnU3JjKTsKKyAgICAgIGlmIChNUkkuaGFzT25lVXNlKFByZXZSZWdTcmMpKSB7CisgICAgICAgIGlmIChUbXBEZWYgIT0gJkRlZk1JKSB7CisgICAgICAgICAgYXNzZXJ0KFRtcERlZi0+Z2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpDT1BZICYmCisgICAgICAgICAgICAgICAgICJFeHBlY3RpbmcgY29weSBoZXJlIik7CisgICAgICAgICAgRGVhZEluc3RzLnB1c2hfYmFjayhUbXBEZWYpOworICAgICAgICB9CisgICAgICB9IGVsc2UKKyAgICAgICAgYnJlYWs7CisgICAgICBQcmV2TUkgPSBUbXBEZWY7CisgICAgfQorICAgIGlmICgoUHJldk1JID09ICZEZWZNSSB8fAorICAgICAgICAgRGVmTUkuZ2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpHX01FUkdFX1ZBTFVFUykgJiYKKyAgICAgICAgTVJJLmhhc09uZVVzZShEZWZNSS5nZXRPcGVyYW5kKDApLmdldFJlZygpKSkKKyAgICAgIERlYWRJbnN0cy5wdXNoX2JhY2soJkRlZk1JKTsKKyAgfQorCisgIC8vLyBDaGVja3MgaWYgdGhlIHRhcmdldCBsZWdhbGl6ZXIgaW5mbyBoYXMgc3BlY2lmaWVkIGFueXRoaW5nIGFib3V0IHRoZQorICAvLy8gaW5zdHJ1Y3Rpb24sIG9yIGlmIHVuc3VwcG9ydGVkLgorICBib29sIGlzSW5zdFVuc3VwcG9ydGVkKGNvbnN0IExlZ2FsaXR5UXVlcnkgJlF1ZXJ5KSBjb25zdCB7CisgICAgdXNpbmcgbmFtZXNwYWNlIExlZ2FsaXplQWN0aW9uczsKKyAgICBhdXRvIFN0ZXAgPSBMSS5nZXRBY3Rpb24oUXVlcnkpOworICAgIHJldHVybiBTdGVwLkFjdGlvbiA9PSBVbnN1cHBvcnRlZCB8fCBTdGVwLkFjdGlvbiA9PSBOb3RGb3VuZDsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTGVnYWxpemVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9MZWdhbGl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mjg0YWI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTGVnYWxpemVyLmgKQEAgLTAsMCArMSw2NSBAQAorLy89PSBsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9MZWdhbGl6ZVBhc3MuaCAtLS0tLS0tLS0tLS0tIC0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZSBBIHBhc3MgdG8gY29udmVydCB0aGUgdGFyZ2V0LWlsbGVnYWwgb3BlcmF0aW9ucyBjcmVhdGVkIGJ5IElSIC0+IE1JUgorLy8vIHRyYW5zbGF0aW9uIGludG8gb25lcyB0aGUgdGFyZ2V0IGV4cGVjdHMgdG8gYmUgYWJsZSB0byBzZWxlY3QuIFRoaXMgbWF5CisvLy8gb2NjdXIgaW4gbXVsdGlwbGUgcGhhc2VzLCBmb3IgZXhhbXBsZSBHX0FERCA8MiB4IGk4PiAtPiBHX0FERCA8MiB4IGkxNj4gLT4KKy8vLyBHX0FERCA8NCB4IGkxNj4uCisvLy8KKy8vLyBUaGUgTGVnYWxpemVIZWxwZXIgY2xhc3MgaXMgd2hlcmUgbW9zdCBvZiB0aGUgd29yayBoYXBwZW5zLCBhbmQgaXMgZGVzaWduZWQKKy8vLyB0byBiZSBjYWxsYWJsZSBmcm9tIG90aGVyIHBhc3NlcyB0aGF0IGZpbmQgdGhlbXNlbHZlcyB3aXRoIGFuIGlsbGVnYWwKKy8vLyBpbnN0cnVjdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX0xFR0FMSVpFTUFDSElORUlSUEFTU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX0xFR0FMSVpFTUFDSElORUlSUEFTU19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9NYWNoaW5lSVJCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworCitjbGFzcyBMZWdhbGl6ZXIgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCitwcml2YXRlOgorCisgIC8vLyBJbml0aWFsaXplIHRoZSBmaWVsZCBtZW1iZXJzIHVzaW5nIFxwIE1GLgorICB2b2lkIGluaXQoTWFjaGluZUZ1bmN0aW9uICZNRik7CisKK3B1YmxpYzoKKyAgLy8gQ3Rvciwgbm90aGluZyBmYW5jeS4KKyAgTGVnYWxpemVyKCk7CisKKyAgU3RyaW5nUmVmIGdldFBhc3NOYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIkxlZ2FsaXplciI7IH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworCisgIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzKCkuc2V0KAorICAgICAgICBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzOjpQcm9wZXJ0eTo6SXNTU0EpOworICB9CisKKyAgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcyBnZXRTZXRQcm9wZXJ0aWVzKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzKCkuc2V0KAorICAgICAgICBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzOjpQcm9wZXJ0eTo6TGVnYWxpemVkKTsKKyAgfQorCisgIGJvb2wgY29tYmluZUV4dHJhY3RzKE1hY2hpbmVJbnN0ciAmTUksIE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUkpOworCisgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRikgb3ZlcnJpZGU7Cit9OworfSAvLyBFbmQgbmFtZXNwYWNlIGxsdm0uCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTGVnYWxpemVySGVscGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9MZWdhbGl6ZXJIZWxwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YmQ4YTlkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTGVnYWxpemVySGVscGVyLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8vPT0gbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTGVnYWxpemVySGVscGVyLmggLS0tLS0tLS0tLS0tLS0tLSAtKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUgQSBwYXNzIHRvIGNvbnZlcnQgdGhlIHRhcmdldC1pbGxlZ2FsIG9wZXJhdGlvbnMgY3JlYXRlZCBieSBJUiAtPiBNSVIKKy8vLyB0cmFuc2xhdGlvbiBpbnRvIG9uZXMgdGhlIHRhcmdldCBleHBlY3RzIHRvIGJlIGFibGUgdG8gc2VsZWN0LiBUaGlzIG1heQorLy8vIG9jY3VyIGluIG11bHRpcGxlIHBoYXNlcywgZm9yIGV4YW1wbGUgR19BREQgPDIgeCBpOD4gLT4gR19BREQgPDIgeCBpMTY+IC0+CisvLy8gR19BREQgPDQgeCBpMTY+LgorLy8vCisvLy8gVGhlIExlZ2FsaXplckhlbHBlciBjbGFzcyBpcyB3aGVyZSBtb3N0IG9mIHRoZSB3b3JrIGhhcHBlbnMsIGFuZCBpcworLy8vIGRlc2lnbmVkIHRvIGJlIGNhbGxhYmxlIGZyb20gb3RoZXIgcGFzc2VzIHRoYXQgZmluZCB0aGVtc2VsdmVzIHdpdGggYW4KKy8vLyBpbGxlZ2FsIGluc3RydWN0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfTUFDSElORUxFR0FMSVpFSEVMUEVSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfTUFDSElORUxFR0FMSVpFSEVMUEVSX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0NhbGxMb3dlcmluZy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL01hY2hpbmVJUkJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTG93TGV2ZWxUeXBlLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUnVudGltZUxpYmNhbGxzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKy8vIEZvcndhcmQgZGVjbGFyYXRpb25zLgorY2xhc3MgTGVnYWxpemVySW5mbzsKK2NsYXNzIExlZ2FsaXplcjsKK2NsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CisKK2NsYXNzIExlZ2FsaXplckhlbHBlciB7CitwdWJsaWM6CisgIGVudW0gTGVnYWxpemVSZXN1bHQgeworICAgIC8vLyBJbnN0cnVjdGlvbiB3YXMgYWxyZWFkeSBsZWdhbCBhbmQgbm8gY2hhbmdlIHdhcyBtYWRlIHRvIHRoZQorICAgIC8vLyBNYWNoaW5lRnVuY3Rpb24uCisgICAgQWxyZWFkeUxlZ2FsLAorCisgICAgLy8vIEluc3RydWN0aW9uIGhhcyBiZWVuIGxlZ2FsaXplZCBhbmQgdGhlIE1hY2hpbmVGdW5jdGlvbiBjaGFuZ2VkLgorICAgIExlZ2FsaXplZCwKKworICAgIC8vLyBTb21lIGtpbmQgb2YgZXJyb3IgaGFzIG9jY3VycmVkIGFuZCB3ZSBjb3VsZCBub3QgbGVnYWxpemUgdGhpcworICAgIC8vLyBpbnN0cnVjdGlvbi4KKyAgICBVbmFibGVUb0xlZ2FsaXplLAorICB9OworCisgIExlZ2FsaXplckhlbHBlcihNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworICAvLy8gUmVwbGFjZSBccCBNSSBieSBhIHNlcXVlbmNlIG9mIGxlZ2FsIGluc3RydWN0aW9ucyB0aGF0IGNhbiBpbXBsZW1lbnQgdGhlCisgIC8vLyBzYW1lIG9wZXJhdGlvbi4gTm90ZSB0aGF0IHRoaXMgbWVhbnMgXHAgTUkgbWF5IGJlIGRlbGV0ZWQsIHNvIGFueSBpdGVyYXRvcgorICAvLy8gc3RlcHMgc2hvdWxkIGJlIHBlcmZvcm1lZCBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBccCBIZWxwZXIgc2hvdWxkCisgIC8vLyBiZSBpbml0aWFsaXplZCB0byB0aGUgTWFjaGluZUZ1bmN0aW9uIGNvbnRhaW5pbmcgXHAgTUkuCisgIC8vLworICAvLy8gQ29uc2lkZXJlZCBhcyBhbiBvcGFxdWUgYmxvYiwgdGhlIGxlZ2FsIGNvZGUgd2lsbCB1c2UgYW5kIGRlZmluZSB0aGUgc2FtZQorICAvLy8gcmVnaXN0ZXJzIGFzIFxwIE1JLgorICBMZWdhbGl6ZVJlc3VsdCBsZWdhbGl6ZUluc3RyU3RlcChNYWNoaW5lSW5zdHIgJk1JKTsKKworICAvLy8gTGVnYWxpemUgYW4gaW5zdHJ1Y3Rpb24gYnkgZW1pdGluZyBhIHJ1bnRpbWUgbGlicmFyeSBjYWxsIGluc3RlYWQuCisgIExlZ2FsaXplUmVzdWx0IGxpYmNhbGwoTWFjaGluZUluc3RyICZNSSk7CisKKyAgLy8vIExlZ2FsaXplIGFuIGluc3RydWN0aW9uIGJ5IHJlZHVjaW5nIHRoZSB3aWR0aCBvZiB0aGUgdW5kZXJseWluZyBzY2FsYXIKKyAgLy8vIHR5cGUuCisgIExlZ2FsaXplUmVzdWx0IG5hcnJvd1NjYWxhcihNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBUeXBlSWR4LCBMTFQgTmFycm93VHkpOworCisgIC8vLyBMZWdhbGl6ZSBhbiBpbnN0cnVjdGlvbiBieSBwZXJmb3JtaW5nIHRoZSBvcGVyYXRpb24gb24gYSB3aWRlciBzY2FsYXIgdHlwZQorICAvLy8gKGZvciBleGFtcGxlIGEgMTYtYml0IGFkZGl0aW9uIGNhbiBiZSBzYWZlbHkgcGVyZm9ybWVkIGF0IDMyLWJpdHMKKyAgLy8vIHByZWNpc2lvbiwgaWdub3JpbmcgdGhlIHVudXNlZCBiaXRzKS4KKyAgTGVnYWxpemVSZXN1bHQgd2lkZW5TY2FsYXIoTWFjaGluZUluc3RyICZNSSwgdW5zaWduZWQgVHlwZUlkeCwgTExUIFdpZGVUeSk7CisKKyAgLy8vIExlZ2FsaXplIGFuIGluc3RydWN0aW9uIGJ5IHNwbGl0dGluZyBpdCBpbnRvIHNpbXBsZXIgcGFydHMsIGhvcGVmdWxseQorICAvLy8gdW5kZXJzdG9vZCBieSB0aGUgdGFyZ2V0LgorICBMZWdhbGl6ZVJlc3VsdCBsb3dlcihNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBUeXBlSWR4LCBMTFQgVHkpOworCisgIC8vLyBMZWdhbGl6ZSBhIHZlY3RvciBpbnN0cnVjdGlvbiBieSBzcGxpdHRpbmcgaW50byBtdWx0aXBsZSBjb21wb25lbnRzLCBlYWNoCisgIC8vLyBhY3Rpbmcgb24gdGhlIHNhbWUgc2NhbGFyIHR5cGUgYXMgdGhlIG9yaWdpbmFsIGJ1dCB3aXRoIGZld2VyIGVsZW1lbnRzLgorICBMZWdhbGl6ZVJlc3VsdCBmZXdlckVsZW1lbnRzVmVjdG9yKE1hY2hpbmVJbnN0ciAmTUksIHVuc2lnbmVkIFR5cGVJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExUIE5hcnJvd1R5KTsKKworICAvLy8gTGVnYWxpemUgYSB2ZWN0b3IgaW5zdHJ1Y3Rpb24gYnkgaW5jcmVhc2luZyB0aGUgbnVtYmVyIG9mIHZlY3RvciBlbGVtZW50cworICAvLy8gaW52b2x2ZWQgYW5kIGlnbm9yaW5nIHRoZSBhZGRlZCBlbGVtZW50cyBsYXRlci4KKyAgTGVnYWxpemVSZXN1bHQgbW9yZUVsZW1lbnRzVmVjdG9yKE1hY2hpbmVJbnN0ciAmTUksIHVuc2lnbmVkIFR5cGVJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFQgV2lkZVR5KTsKKworICAvLy8gRXhwb3NlIE1JUkJ1aWxkZXIgc28gY2xpZW50cyBjYW4gc2V0IHRoZWlyIG93biBSZWNvcmRJbnNlcnRJbnN0cnVjdGlvbgorICAvLy8gZnVuY3Rpb25zCisgIE1hY2hpbmVJUkJ1aWxkZXIgTUlSQnVpbGRlcjsKKworICAvLy8gRXhwb3NlIExlZ2FsaXplckluZm8gc28gdGhlIGNsaWVudHMgY2FuIHJlLXVzZS4KKyAgY29uc3QgTGVnYWxpemVySW5mbyAmZ2V0TGVnYWxpemVySW5mbygpIGNvbnN0IHsgcmV0dXJuIExJOyB9CisKK3ByaXZhdGU6CisKKyAgLy8vIEhlbHBlciBmdW5jdGlvbiB0byBzcGxpdCBhIHdpZGUgZ2VuZXJpYyByZWdpc3RlciBpbnRvIGJpdHdpc2UgYmxvY2tzIHdpdGgKKyAgLy8vIHRoZSBnaXZlbiBUeXBlICh3aGljaCBpbXBsaWVzIHRoZSBudW1iZXIgb2YgYmxvY2tzIG5lZWRlZCkuIFRoZSBnZW5lcmljCisgIC8vLyByZWdpc3RlcnMgY3JlYXRlZCBhcmUgYXBwZW5kZWQgdG8gT3BzLCBzdGFydGluZyBhdCBiaXQgMCBvZiBSZWcuCisgIHZvaWQgZXh0cmFjdFBhcnRzKHVuc2lnbmVkIFJlZywgTExUIFR5LCBpbnQgTnVtUGFydHMsCisgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD4gJk9wcyk7CisKKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJOworICBjb25zdCBMZWdhbGl6ZXJJbmZvICZMSTsKK307CisKKy8vLyBIZWxwZXIgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIHRoZSBnaXZlbiBsaWJjYWxsLgorTGVnYWxpemVySGVscGVyOjpMZWdhbGl6ZVJlc3VsdAorY3JlYXRlTGliY2FsbChNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyLCBSVExJQjo6TGliY2FsbCBMaWJjYWxsLAorICAgICAgICAgICAgICBjb25zdCBDYWxsTG93ZXJpbmc6OkFyZ0luZm8gJlJlc3VsdCwKKyAgICAgICAgICAgICAgQXJyYXlSZWY8Q2FsbExvd2VyaW5nOjpBcmdJbmZvPiBBcmdzKTsKKworfSAvLyBFbmQgbmFtZXNwYWNlIGxsdm0uCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTGVnYWxpemVySW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTGVnYWxpemVySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExN2M3OTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9MZWdhbGl6ZXJJbmZvLmgKQEAgLTAsMCArMSw5MjAgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9MZWdhbGl6ZXJJbmZvLmggLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIEludGVyZmFjZSBmb3IgVGFyZ2V0cyB0byBzcGVjaWZ5IHdoaWNoIG9wZXJhdGlvbnMgdGhleSBjYW4gc3VjY2Vzc2Z1bGx5CisvLy8gc2VsZWN0IGFuZCBob3cgdGhlIG90aGVycyBzaG91bGQgYmUgZXhwYW5kZWQgbW9zdCBlZmZpY2llbnRseS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX0xFR0FMSVpFUklORk9fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9MRUdBTElaRVJJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldE9wY29kZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTG93TGV2ZWxUeXBlSW1wbC5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworZXh0ZXJuIGNsOjpvcHQ8Ym9vbD4gRGlzYWJsZUdJU2VsTGVnYWxpdHlDaGVjazsKKworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgTWFjaGluZUlSQnVpbGRlcjsKK2NsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CisKK25hbWVzcGFjZSBMZWdhbGl6ZUFjdGlvbnMgeworZW51bSBMZWdhbGl6ZUFjdGlvbiA6IHN0ZDo6dWludDhfdCB7CisgIC8vLyBUaGUgb3BlcmF0aW9uIGlzIGV4cGVjdGVkIHRvIGJlIHNlbGVjdGFibGUgZGlyZWN0bHkgYnkgdGhlIHRhcmdldCwgYW5kCisgIC8vLyBubyB0cmFuc2Zvcm1hdGlvbiBpcyBuZWNlc3NhcnkuCisgIExlZ2FsLAorCisgIC8vLyBUaGUgb3BlcmF0aW9uIHNob3VsZCBiZSBzeW50aGVzaXplZCBmcm9tIG11bHRpcGxlIGluc3RydWN0aW9ucyBhY3Rpbmcgb24KKyAgLy8vIGEgbmFycm93ZXIgc2NhbGFyIGJhc2UtdHlwZS4gRm9yIGV4YW1wbGUgYSA2NC1iaXQgYWRkIG1pZ2h0IGJlCisgIC8vLyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiAzMi1iaXQgYWRkLXdpdGgtY2FycnkuCisgIE5hcnJvd1NjYWxhciwKKworICAvLy8gVGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgYSB3aWRlciBzY2FsYXIKKyAgLy8vIGJhc2UtdHlwZS4gRm9yIGV4YW1wbGUgYSA8MiB4IHM4PiBhZGQgY291bGQgYmUgaW1wbGVtZW50ZWQgYXMgYSA8MgorICAvLy8geCBzMzI+IGFkZCAoaWdub3JpbmcgdGhlIGhpZ2ggYml0cykuCisgIFdpZGVuU2NhbGFyLAorCisgIC8vLyBUaGUgKHZlY3Rvcikgb3BlcmF0aW9uIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSBzcGxpdHRpbmcgaXQgaW50bworICAvLy8gc3ViLXZlY3RvcnMgd2hlcmUgdGhlIG9wZXJhdGlvbiBpcyBsZWdhbC4gRm9yIGV4YW1wbGUgYSA8OCB4IHM2ND4gYWRkCisgIC8vLyBtaWdodCBiZSBpbXBsZW1lbnRlZCBhcyA0IHNlcGFyYXRlIDwyIHggczY0PiBhZGRzLgorICBGZXdlckVsZW1lbnRzLAorCisgIC8vLyBUaGUgKHZlY3Rvcikgb3BlcmF0aW9uIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBieSB3aWRlbmluZyB0aGUgaW5wdXQKKyAgLy8vIHZlY3RvciBhbmQgaWdub3JpbmcgdGhlIGxhbmVzIGFkZGVkIGJ5IGRvaW5nIHNvLiBGb3IgZXhhbXBsZSA8MiB4IGk4PiBpcworICAvLy8gcmFyZWx5IGxlZ2FsLCBidXQgeW91IG1pZ2h0IHBlcmZvcm0gYW4gPDggeCBpOD4gYW5kIHRoZW4gb25seSBsb29rIGF0CisgIC8vLyB0aGUgZmlyc3QgdHdvIHJlc3VsdHMuCisgIE1vcmVFbGVtZW50cywKKworICAvLy8gVGhlIG9wZXJhdGlvbiBpdHNlbGYgbXVzdCBiZSBleHByZXNzZWQgaW4gdGVybXMgb2Ygc2ltcGxlciBhY3Rpb25zIG9uCisgIC8vLyB0aGlzIHRhcmdldC4gRS5nLiBhIFNSRU0gcmVwbGFjZWQgYnkgYW4gU0RJViBhbmQgc3VidHJhY3Rpb24uCisgIExvd2VyLAorCisgIC8vLyBUaGUgb3BlcmF0aW9uIHNob3VsZCBiZSBpbXBsZW1lbnRlZCBhcyBhIGNhbGwgdG8gc29tZSBraW5kIG9mIHJ1bnRpbWUKKyAgLy8vIHN1cHBvcnQgbGlicmFyeS4gRm9yIGV4YW1wbGUgdGhpcyB1c3VhbGx5IGhhcHBlbnMgb24gbWFjaGluZXMgdGhhdCBkb24ndAorICAvLy8gc3VwcG9ydCBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zIG5hdGl2ZWx5LgorICBMaWJjYWxsLAorCisgIC8vLyBUaGUgdGFyZ2V0IHdhbnRzIHRvIGRvIHNvbWV0aGluZyBzcGVjaWFsIHdpdGggdGhpcyBjb21iaW5hdGlvbiBvZgorICAvLy8gb3BlcmFuZCBhbmQgdHlwZS4gQSBjYWxsYmFjayB3aWxsIGJlIGlzc3VlZCB3aGVuIGl0IGlzIG5lZWRlZC4KKyAgQ3VzdG9tLAorCisgIC8vLyBUaGlzIG9wZXJhdGlvbiBpcyBjb21wbGV0ZWx5IHVuc3VwcG9ydGVkIG9uIHRoZSB0YXJnZXQuIEEgcHJvZ3JhbW1pbmcKKyAgLy8vIGVycm9yIGhhcyBvY2N1cnJlZC4KKyAgVW5zdXBwb3J0ZWQsCisKKyAgLy8vIFNlbnRpbmVsIHZhbHVlIGZvciB3aGVuIG5vIGFjdGlvbiB3YXMgZm91bmQgaW4gdGhlIHNwZWNpZmllZCB0YWJsZS4KKyAgTm90Rm91bmQsCisKKyAgLy8vIEZhbGwgYmFjayBvbnRvIHRoZSBvbGQgcnVsZXMuCisgIC8vLyBUT0RPOiBSZW1vdmUgdGhpcyBvbmNlIHdlJ3ZlIG1pZ3JhdGVkCisgIFVzZUxlZ2FjeVJ1bGVzLAorfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBMZWdhbGl6ZUFjdGlvbnMKKwordXNpbmcgTGVnYWxpemVBY3Rpb25zOjpMZWdhbGl6ZUFjdGlvbjsKKworLy8vIExlZ2FsaXphdGlvbiBpcyBkZWNpZGVkIGJhc2VkIG9uIGFuIGluc3RydWN0aW9uJ3Mgb3Bjb2RlLCB3aGljaCB0eXBlIHNsb3QKKy8vLyB3ZSdyZSBjb25zaWRlcmluZywgYW5kIHdoYXQgdGhlIGV4aXN0aW5nIHR5cGUgaXMuIFRoZXNlIGFzcGVjdHMgYXJlIGdhdGhlcmVkCisvLy8gdG9nZXRoZXIgZm9yIGNvbnZlbmllbmNlIGluIHRoZSBJbnN0ckFzcGVjdCBjbGFzcy4KK3N0cnVjdCBJbnN0ckFzcGVjdCB7CisgIHVuc2lnbmVkIE9wY29kZTsKKyAgdW5zaWduZWQgSWR4ID0gMDsKKyAgTExUIFR5cGU7CisKKyAgSW5zdHJBc3BlY3QodW5zaWduZWQgT3Bjb2RlLCBMTFQgVHlwZSkgOiBPcGNvZGUoT3Bjb2RlKSwgVHlwZShUeXBlKSB7fQorICBJbnN0ckFzcGVjdCh1bnNpZ25lZCBPcGNvZGUsIHVuc2lnbmVkIElkeCwgTExUIFR5cGUpCisgICAgICA6IE9wY29kZShPcGNvZGUpLCBJZHgoSWR4KSwgVHlwZShUeXBlKSB7fQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbnN0ckFzcGVjdCAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIE9wY29kZSA9PSBSSFMuT3Bjb2RlICYmIElkeCA9PSBSSFMuSWR4ICYmIFR5cGUgPT0gUkhTLlR5cGU7CisgIH0KK307CisKKy8vLyBUaGUgTGVnYWxpdHlRdWVyeSBvYmplY3QgYnVuZGxlcyB0b2dldGhlciBhbGwgdGhlIGluZm9ybWF0aW9uIHRoYXQncyBuZWVkZWQKKy8vLyB0byBkZWNpZGUgd2hldGhlciBhIGdpdmVuIG9wZXJhdGlvbiBpcyBsZWdhbCBvciBub3QuCisvLy8gRm9yIGVmZmljaWVuY3ksIGl0IGRvZXNuJ3QgbWFrZSBhIGNvcHkgb2YgVHlwZXMgc28gY2FyZSBtdXN0IGJlIHRha2VuIG5vdAorLy8vIHRvIGZyZWUgaXQgYmVmb3JlIHVzaW5nIHRoZSBxdWVyeS4KK3N0cnVjdCBMZWdhbGl0eVF1ZXJ5IHsKKyAgdW5zaWduZWQgT3Bjb2RlOworICBBcnJheVJlZjxMTFQ+IFR5cGVzOworCisgIHJhd19vc3RyZWFtICZwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworfTsKKworLy8vIFRoZSByZXN1bHQgb2YgYSBxdWVyeS4gSXQgZWl0aGVyIGluZGljYXRlcyBhIGZpbmFsIGFuc3dlciBvZiBMZWdhbCBvcgorLy8vIFVuc3VwcG9ydGVkIG9yIGRlc2NyaWJlcyBhbiBhY3Rpb24gdGhhdCBtdXN0IGJlIHRha2VuIHRvIG1ha2UgYW4gb3BlcmF0aW9uCisvLy8gbW9yZSBsZWdhbC4KK3N0cnVjdCBMZWdhbGl6ZUFjdGlvblN0ZXAgeworICAvLy8gVGhlIGFjdGlvbiB0byB0YWtlIG9yIHRoZSBmaW5hbCBhbnN3ZXIuCisgIExlZ2FsaXplQWN0aW9uIEFjdGlvbjsKKyAgLy8vIElmIGRlc2NyaWJpbmcgYW4gYWN0aW9uLCB0aGUgdHlwZSBpbmRleCB0byBjaGFuZ2UuIE90aGVyd2lzZSB6ZXJvLgorICB1bnNpZ25lZCBUeXBlSWR4OworICAvLy8gSWYgZGVzY3JpYmluZyBhbiBhY3Rpb24sIHRoZSBuZXcgdHlwZSBmb3IgVHlwZUlkeC4gT3RoZXJ3aXNlIExMVHt9LgorICBMTFQgTmV3VHlwZTsKKworICBMZWdhbGl6ZUFjdGlvblN0ZXAoTGVnYWxpemVBY3Rpb24gQWN0aW9uLCB1bnNpZ25lZCBUeXBlSWR4LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTExUICZOZXdUeXBlKQorICAgICAgOiBBY3Rpb24oQWN0aW9uKSwgVHlwZUlkeChUeXBlSWR4KSwgTmV3VHlwZShOZXdUeXBlKSB7fQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBMZWdhbGl6ZUFjdGlvblN0ZXAgJlJIUykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShBY3Rpb24sIFR5cGVJZHgsIE5ld1R5cGUpID09CisgICAgICAgIHN0ZDo6dGllKFJIUy5BY3Rpb24sIFJIUy5UeXBlSWR4LCBSSFMuTmV3VHlwZSk7CisgIH0KK307CisKK3VzaW5nIExlZ2FsaXR5UHJlZGljYXRlID0gc3RkOjpmdW5jdGlvbjxib29sIChjb25zdCBMZWdhbGl0eVF1ZXJ5ICYpPjsKK3VzaW5nIExlZ2FsaXplTXV0YXRpb24gPQorICAgIHN0ZDo6ZnVuY3Rpb248c3RkOjpwYWlyPHVuc2lnbmVkLCBMTFQ+KGNvbnN0IExlZ2FsaXR5UXVlcnkgJik+OworCituYW1lc3BhY2UgTGVnYWxpdHlQcmVkaWNhdGVzIHsKKy8vLyBUcnVlIGlmZiBQMCBhbmQgUDEgYXJlIHRydWUuCitMZWdhbGl0eVByZWRpY2F0ZSBhbGwoTGVnYWxpdHlQcmVkaWNhdGUgUDAsIExlZ2FsaXR5UHJlZGljYXRlIFAxKTsKKy8vLyBUcnVlIGlmZiB0aGUgZ2l2ZW4gdHlwZSBpbmRleCBpcyBvbmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlcy4KK0xlZ2FsaXR5UHJlZGljYXRlIHR5cGVJblNldCh1bnNpZ25lZCBUeXBlSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxMTFQ+IFR5cGVzSW5pdCk7CisvLy8gVHJ1ZSBpZmYgdGhlIGdpdmVuIHR5cGVzIGZvciB0aGUgZ2l2ZW4gcGFpciBvZiB0eXBlIGluZGV4ZXMgaXMgb25lIG9mIHRoZQorLy8vIHNwZWNpZmllZCB0eXBlIHBhaXJzLgorTGVnYWxpdHlQcmVkaWNhdGUKK3R5cGVQYWlySW5TZXQodW5zaWduZWQgVHlwZUlkeDAsIHVuc2lnbmVkIFR5cGVJZHgxLAorICAgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8c3RkOjpwYWlyPExMVCwgTExUPj4gVHlwZXNJbml0KTsKKy8vLyBUcnVlIGlmZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW5kZXggaXMgYSBzY2FsYXIuCitMZWdhbGl0eVByZWRpY2F0ZSBpc1NjYWxhcih1bnNpZ25lZCBUeXBlSWR4KTsKKy8vLyBUcnVlIGlmZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW5kZXggaXMgYSBzY2FsYXIgdGhhdCdzIG5hcnJvd2VyIHRoYW4gdGhlIGdpdmVuCisvLy8gc2l6ZS4KK0xlZ2FsaXR5UHJlZGljYXRlIG5hcnJvd2VyVGhhbih1bnNpZ25lZCBUeXBlSWR4LCB1bnNpZ25lZCBTaXplKTsKKy8vLyBUcnVlIGlmZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW5kZXggaXMgYSBzY2FsYXIgdGhhdCdzIHdpZGVyIHRoYW4gdGhlIGdpdmVuCisvLy8gc2l6ZS4KK0xlZ2FsaXR5UHJlZGljYXRlIHdpZGVyVGhhbih1bnNpZ25lZCBUeXBlSWR4LCB1bnNpZ25lZCBTaXplKTsKKy8vLyBUcnVlIGlmZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW5kZXggaXMgYSBzY2FsYXIgd2hvc2Ugc2l6ZSBpcyBub3QgYSBwb3dlciBvZgorLy8vIDIuCitMZWdhbGl0eVByZWRpY2F0ZSBzaXplTm90UG93Mih1bnNpZ25lZCBUeXBlSWR4KTsKKy8vLyBUcnVlIGlmZiB0aGUgc3BlY2lmaWVkIHR5cGUgaW5kZXggaXMgYSB2ZWN0b3Igd2hvc2UgZWxlbWVudCBjb3VudCBpcyBub3QgYQorLy8vIHBvd2VyIG9mIDIuCitMZWdhbGl0eVByZWRpY2F0ZSBudW1FbGVtZW50c05vdFBvdzIodW5zaWduZWQgVHlwZUlkeCk7Cit9IC8vIGVuZCBuYW1lc3BhY2UgTGVnYWxpdHlQcmVkaWNhdGVzCisKK25hbWVzcGFjZSBMZWdhbGl6ZU11dGF0aW9ucyB7CisvLy8gU2VsZWN0IHRoaXMgc3BlY2lmaWMgdHlwZSBmb3IgdGhlIGdpdmVuIHR5cGUgaW5kZXguCitMZWdhbGl6ZU11dGF0aW9uIGNoYW5nZVRvKHVuc2lnbmVkIFR5cGVJZHgsIExMVCBUeSk7CisvLy8gV2lkZW4gdGhlIHR5cGUgZm9yIHRoZSBnaXZlbiB0eXBlIGluZGV4IHRvIHRoZSBuZXh0IHBvd2VyIG9mIDIuCitMZWdhbGl6ZU11dGF0aW9uIHdpZGVuU2NhbGFyVG9OZXh0UG93Mih1bnNpZ25lZCBUeXBlSWR4LCB1bnNpZ25lZCBNaW4gPSAwKTsKKy8vLyBBZGQgbW9yZSBlbGVtZW50cyB0byB0aGUgdHlwZSBmb3IgdGhlIGdpdmVuIHR5cGUgaW5kZXggdG8gdGhlIG5leHQgcG93ZXIgb2YKKy8vLyAyLgorTGVnYWxpemVNdXRhdGlvbiBtb3JlRWxlbWVudHNUb05leHRQb3cyKHVuc2lnbmVkIFR5cGVJZHgsIHVuc2lnbmVkIE1pbiA9IDApOworfSAvLyBlbmQgbmFtZXNwYWNlIExlZ2FsaXplTXV0YXRpb25zCisKKy8vLyBBIHNpbmdsZSBydWxlIGluIGEgbGVnYWxpemVyIGluZm8gcnVsZXNldC4KKy8vLyBUaGUgc3BlY2lmaWVkIGFjdGlvbiBpcyBjaG9zZW4gd2hlbiB0aGUgcHJlZGljYXRlIGlzIHRydWUuIFdoZXJlIGFwcHJvcHJpYXRlCisvLy8gZm9yIHRoZSBhY3Rpb24gKGUuZy4gZm9yIFdpZGVuU2NhbGFyKSB0aGUgbmV3IHR5cGUgaXMgc2VsZWN0ZWQgdXNpbmcgdGhlCisvLy8gZ2l2ZW4gbXV0YXRvci4KK2NsYXNzIExlZ2FsaXplUnVsZSB7CisgIExlZ2FsaXR5UHJlZGljYXRlIFByZWRpY2F0ZTsKKyAgTGVnYWxpemVBY3Rpb24gQWN0aW9uOworICBMZWdhbGl6ZU11dGF0aW9uIE11dGF0aW9uOworCitwdWJsaWM6CisgIExlZ2FsaXplUnVsZShMZWdhbGl0eVByZWRpY2F0ZSBQcmVkaWNhdGUsIExlZ2FsaXplQWN0aW9uIEFjdGlvbiwKKyAgICAgICAgICAgICAgIExlZ2FsaXplTXV0YXRpb24gTXV0YXRpb24gPSBudWxscHRyKQorICAgICAgOiBQcmVkaWNhdGUoUHJlZGljYXRlKSwgQWN0aW9uKEFjdGlvbiksIE11dGF0aW9uKE11dGF0aW9uKSB7fQorCisgIC8vLyBUZXN0IHdoZXRoZXIgdGhlIExlZ2FsaXR5UXVlcnkgbWF0Y2hlcy4KKyAgYm9vbCBtYXRjaChjb25zdCBMZWdhbGl0eVF1ZXJ5ICZRdWVyeSkgY29uc3QgeworICAgIHJldHVybiBQcmVkaWNhdGUoUXVlcnkpOworICB9CisKKyAgTGVnYWxpemVBY3Rpb24gZ2V0QWN0aW9uKCkgY29uc3QgeyByZXR1cm4gQWN0aW9uOyB9CisKKyAgLy8vIERldGVybWluZSB0aGUgY2hhbmdlIHRvIG1ha2UuCisgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgTExUPiBkZXRlcm1pbmVNdXRhdGlvbihjb25zdCBMZWdhbGl0eVF1ZXJ5ICZRdWVyeSkgY29uc3QgeworICAgIGlmIChNdXRhdGlvbikKKyAgICAgIHJldHVybiBNdXRhdGlvbihRdWVyeSk7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKDAsIExMVHt9KTsKKyAgfQorfTsKKworY2xhc3MgTGVnYWxpemVSdWxlU2V0IHsKKyAgLy8vIFdoZW4gbm9uLXplcm8sIHRoZSBvcGNvZGUgd2UgYXJlIGFuIGFsaWFzIG9mCisgIHVuc2lnbmVkIEFsaWFzT2Y7CisgIC8vLyBJZiB0cnVlLCB0aGVyZSBpcyBhbm90aGVyIG9wY29kZSB0aGF0IGFsaWFzZXMgdGhpcyBvbmUKKyAgYm9vbCBJc0FsaWFzZWRCeUFub3RoZXI7CisgIFNtYWxsVmVjdG9yPExlZ2FsaXplUnVsZSwgMj4gUnVsZXM7CisKKyAgdm9pZCBhZGQoY29uc3QgTGVnYWxpemVSdWxlICZSdWxlKSB7CisgICAgYXNzZXJ0KEFsaWFzT2YgPT0gMCAmJgorICAgICAgICAgICAiUnVsZVNldCBpcyBhbGlhc2VkLCBjaGFuZ2UgdGhlIHJlcHJlc2VudGF0aXZlIG9wY29kZSBpbnN0ZWFkIik7CisgICAgUnVsZXMucHVzaF9iYWNrKFJ1bGUpOworICB9CisKKyAgc3RhdGljIGJvb2wgYWx3YXlzKGNvbnN0IExlZ2FsaXR5UXVlcnkgJikgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vLyBVc2UgdGhlIGdpdmVuIGFjdGlvbiB3aGVuIHRoZSBwcmVkaWNhdGUgaXMgdHJ1ZS4KKyAgLy8vIEFjdGlvbiBzaG91bGQgbm90IGJlIGFuIGFjdGlvbiB0aGF0IHJlcXVpcmVzIG11dGF0aW9uLgorICBMZWdhbGl6ZVJ1bGVTZXQgJmFjdGlvbklmKExlZ2FsaXplQWN0aW9uIEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWdhbGl0eVByZWRpY2F0ZSBQcmVkaWNhdGUpIHsKKyAgICBhZGQoe1ByZWRpY2F0ZSwgQWN0aW9ufSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIC8vLyBVc2UgdGhlIGdpdmVuIGFjdGlvbiB3aGVuIHRoZSBwcmVkaWNhdGUgaXMgdHJ1ZS4KKyAgLy8vIEFjdGlvbiBzaG91bGQgbm90IGJlIGFuIGFjdGlvbiB0aGF0IHJlcXVpcmVzIG11dGF0aW9uLgorICBMZWdhbGl6ZVJ1bGVTZXQgJmFjdGlvbklmKExlZ2FsaXplQWN0aW9uIEFjdGlvbiwgTGVnYWxpdHlQcmVkaWNhdGUgUHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZ2FsaXplTXV0YXRpb24gTXV0YXRpb24pIHsKKyAgICBhZGQoe1ByZWRpY2F0ZSwgQWN0aW9uLCBNdXRhdGlvbn0pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICAvLy8gVXNlIHRoZSBnaXZlbiBhY3Rpb24gd2hlbiB0eXBlIGluZGV4IDAgaXMgYW55IHR5cGUgaW4gdGhlIGdpdmVuIGxpc3QuCisgIC8vLyBBY3Rpb24gc2hvdWxkIG5vdCBiZSBhbiBhY3Rpb24gdGhhdCByZXF1aXJlcyBtdXRhdGlvbi4KKyAgTGVnYWxpemVSdWxlU2V0ICZhY3Rpb25Gb3IoTGVnYWxpemVBY3Rpb24gQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8TExUPiBUeXBlcykgeworICAgIHVzaW5nIG5hbWVzcGFjZSBMZWdhbGl0eVByZWRpY2F0ZXM7CisgICAgcmV0dXJuIGFjdGlvbklmKEFjdGlvbiwgdHlwZUluU2V0KDAsIFR5cGVzKSk7CisgIH0KKyAgLy8vIFVzZSB0aGUgZ2l2ZW4gYWN0aW9uIHdoZW4gdHlwZSBpbmRleGVzIDAgYW5kIDEgaXMgYW55IHR5cGUgcGFpciBpbiB0aGUKKyAgLy8vIGdpdmVuIGxpc3QuCisgIC8vLyBBY3Rpb24gc2hvdWxkIG5vdCBiZSBhbiBhY3Rpb24gdGhhdCByZXF1aXJlcyBtdXRhdGlvbi4KKyAgTGVnYWxpemVSdWxlU2V0ICYKKyAgYWN0aW9uRm9yKExlZ2FsaXplQWN0aW9uIEFjdGlvbiwKKyAgICAgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxzdGQ6OnBhaXI8TExULCBMTFQ+PiBUeXBlcykgeworICAgIHVzaW5nIG5hbWVzcGFjZSBMZWdhbGl0eVByZWRpY2F0ZXM7CisgICAgcmV0dXJuIGFjdGlvbklmKEFjdGlvbiwgdHlwZVBhaXJJblNldCgwLCAxLCBUeXBlcykpOworICB9CisgIC8vLyBVc2UgdGhlIGdpdmVuIGFjdGlvbiB3aGVuIHR5cGUgaW5kZXhlcyAwIGFuZCAxIGFyZSBib3RoIGluIHRoZSBnaXZlbiBsaXN0LgorICAvLy8gVGhhdCBpcywgdGhlIHR5cGUgcGFpciBpcyBpbiB0aGUgY2FydGVzaWFuIHByb2R1Y3Qgb2YgdGhlIGxpc3QuCisgIC8vLyBBY3Rpb24gc2hvdWxkIG5vdCBiZSBhbiBhY3Rpb24gdGhhdCByZXF1aXJlcyBtdXRhdGlvbi4KKyAgTGVnYWxpemVSdWxlU2V0ICZhY3Rpb25Gb3JDYXJ0ZXNpYW5Qcm9kdWN0KExlZ2FsaXplQWN0aW9uIEFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxMTFQ+IFR5cGVzKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIExlZ2FsaXR5UHJlZGljYXRlczsKKyAgICByZXR1cm4gYWN0aW9uSWYoQWN0aW9uLCBhbGwodHlwZUluU2V0KDAsIFR5cGVzKSwgdHlwZUluU2V0KDEsIFR5cGVzKSkpOworICB9CisgIC8vLyBVc2UgdGhlIGdpdmVuIGFjdGlvbiB3aGVuIHR5cGUgaW5kZXhlcyAwIGFuZCAxIGFyZSBib3RoIHRoZWlyIHJlc3BlY3RpdmUKKyAgLy8vIGxpc3RzLgorICAvLy8gVGhhdCBpcywgdGhlIHR5cGUgcGFpciBpcyBpbiB0aGUgY2FydGVzaWFuIHByb2R1Y3Qgb2YgdGhlIGxpc3RzCisgIC8vLyBBY3Rpb24gc2hvdWxkIG5vdCBiZSBhbiBhY3Rpb24gdGhhdCByZXF1aXJlcyBtdXRhdGlvbi4KKyAgTGVnYWxpemVSdWxlU2V0ICYKKyAgYWN0aW9uRm9yQ2FydGVzaWFuUHJvZHVjdChMZWdhbGl6ZUFjdGlvbiBBY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PExMVD4gVHlwZXMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxMTFQ+IFR5cGVzMSkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBMZWdhbGl0eVByZWRpY2F0ZXM7CisgICAgcmV0dXJuIGFjdGlvbklmKEFjdGlvbiwgYWxsKHR5cGVJblNldCgwLCBUeXBlczApLCB0eXBlSW5TZXQoMSwgVHlwZXMxKSkpOworICB9CisKK3B1YmxpYzoKKyAgTGVnYWxpemVSdWxlU2V0KCkgOiBBbGlhc09mKDApLCBJc0FsaWFzZWRCeUFub3RoZXIoZmFsc2UpLCBSdWxlcygpIHt9CisKKyAgYm9vbCBpc0FsaWFzZWRCeUFub3RoZXIoKSB7IHJldHVybiBJc0FsaWFzZWRCeUFub3RoZXI7IH0KKyAgdm9pZCBzZXRJc0FsaWFzZWRCeUFub3RoZXIoKSB7IElzQWxpYXNlZEJ5QW5vdGhlciA9IHRydWU7IH0KKyAgdm9pZCBhbGlhc1RvKHVuc2lnbmVkIE9wY29kZSkgeworICAgIGFzc2VydCgoQWxpYXNPZiA9PSAwIHx8IEFsaWFzT2YgPT0gT3Bjb2RlKSAmJgorICAgICAgICAgICAiT3Bjb2RlIGlzIGFscmVhZHkgYWxpYXNlZCB0byBhbm90aGVyIG9wY29kZSIpOworICAgIGFzc2VydChSdWxlcy5lbXB0eSgpICYmICJBbGlhc2luZyB3aWxsIGRpc2NhcmQgcnVsZXMiKTsKKyAgICBBbGlhc09mID0gT3Bjb2RlOworICB9CisgIHVuc2lnbmVkIGdldEFsaWFzKCkgY29uc3QgeyByZXR1cm4gQWxpYXNPZjsgfQorCisgIC8vLyBUaGUgaW5zdHJ1Y3Rpb24gaXMgbGVnYWwgaWYgcHJlZGljYXRlIGlzIHRydWUuCisgIExlZ2FsaXplUnVsZVNldCAmbGVnYWxJZihMZWdhbGl0eVByZWRpY2F0ZSBQcmVkaWNhdGUpIHsKKyAgICByZXR1cm4gYWN0aW9uSWYoTGVnYWxpemVBY3Rpb246OkxlZ2FsLCBQcmVkaWNhdGUpOworICB9CisgIC8vLyBUaGUgaW5zdHJ1Y3Rpb24gaXMgbGVnYWwgd2hlbiB0eXBlIGluZGV4IDAgaXMgYW55IHR5cGUgaW4gdGhlIGdpdmVuIGxpc3QuCisgIExlZ2FsaXplUnVsZVNldCAmbGVnYWxGb3Ioc3RkOjppbml0aWFsaXplcl9saXN0PExMVD4gVHlwZXMpIHsKKyAgICByZXR1cm4gYWN0aW9uRm9yKExlZ2FsaXplQWN0aW9uOjpMZWdhbCwgVHlwZXMpOworICB9CisgIC8vLyBUaGUgaW5zdHJ1Y3Rpb24gaXMgbGVnYWwgd2hlbiB0eXBlIGluZGV4ZXMgMCBhbmQgMSBpcyBhbnkgdHlwZSBwYWlyIGluIHRoZQorICAvLy8gZ2l2ZW4gbGlzdC4KKyAgTGVnYWxpemVSdWxlU2V0ICZsZWdhbEZvcihzdGQ6OmluaXRpYWxpemVyX2xpc3Q8c3RkOjpwYWlyPExMVCwgTExUPj4gVHlwZXMpIHsKKyAgICByZXR1cm4gYWN0aW9uRm9yKExlZ2FsaXplQWN0aW9uOjpMZWdhbCwgVHlwZXMpOworICB9CisgIC8vLyBUaGUgaW5zdHJ1Y3Rpb24gaXMgbGVnYWwgd2hlbiB0eXBlIGluZGV4ZXMgMCBhbmQgMSBhcmUgYm90aCBpbiB0aGUgZ2l2ZW4KKyAgLy8vIGxpc3QuIFRoYXQgaXMsIHRoZSB0eXBlIHBhaXIgaXMgaW4gdGhlIGNhcnRlc2lhbiBwcm9kdWN0IG9mIHRoZSBsaXN0LgorICBMZWdhbGl6ZVJ1bGVTZXQgJmxlZ2FsRm9yQ2FydGVzaWFuUHJvZHVjdChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8TExUPiBUeXBlcykgeworICAgIHJldHVybiBhY3Rpb25Gb3JDYXJ0ZXNpYW5Qcm9kdWN0KExlZ2FsaXplQWN0aW9uOjpMZWdhbCwgVHlwZXMpOworICB9CisgIC8vLyBUaGUgaW5zdHJ1Y3Rpb24gaXMgbGVnYWwgd2hlbiB0eXBlIGluZGV4ZXMgMCBhbmQgMSBhcmUgYm90aCB0aGVpcgorICAvLy8gcmVzcGVjdGl2ZSBsaXN0cy4KKyAgTGVnYWxpemVSdWxlU2V0ICZsZWdhbEZvckNhcnRlc2lhblByb2R1Y3Qoc3RkOjppbml0aWFsaXplcl9saXN0PExMVD4gVHlwZXMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmluaXRpYWxpemVyX2xpc3Q8TExUPiBUeXBlczEpIHsKKyAgICByZXR1cm4gYWN0aW9uRm9yQ2FydGVzaWFuUHJvZHVjdChMZWdhbGl6ZUFjdGlvbjo6TGVnYWwsIFR5cGVzMCwgVHlwZXMxKTsKKyAgfQorCisgIC8vLyBMaWtlIGxlZ2FsSWYsIGJ1dCBmb3IgdGhlIExpYmNhbGwgYWN0aW9uLgorICBMZWdhbGl6ZVJ1bGVTZXQgJmxpYmNhbGxJZihMZWdhbGl0eVByZWRpY2F0ZSBQcmVkaWNhdGUpIHsKKyAgICByZXR1cm4gYWN0aW9uSWYoTGVnYWxpemVBY3Rpb246OkxpYmNhbGwsIFByZWRpY2F0ZSk7CisgIH0KKyAgTGVnYWxpemVSdWxlU2V0ICZsaWJjYWxsRm9yKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxMTFQ+IFR5cGVzKSB7CisgICAgcmV0dXJuIGFjdGlvbkZvcihMZWdhbGl6ZUFjdGlvbjo6TGliY2FsbCwgVHlwZXMpOworICB9CisgIExlZ2FsaXplUnVsZVNldCAmCisgIGxpYmNhbGxGb3Ioc3RkOjppbml0aWFsaXplcl9saXN0PHN0ZDo6cGFpcjxMTFQsIExMVD4+IFR5cGVzKSB7CisgICAgcmV0dXJuIGFjdGlvbkZvcihMZWdhbGl6ZUFjdGlvbjo6TGliY2FsbCwgVHlwZXMpOworICB9CisgIExlZ2FsaXplUnVsZVNldCAmCisgIGxpYmNhbGxGb3JDYXJ0ZXNpYW5Qcm9kdWN0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxMTFQ+IFR5cGVzKSB7CisgICAgcmV0dXJuIGFjdGlvbkZvckNhcnRlc2lhblByb2R1Y3QoTGVnYWxpemVBY3Rpb246OkxpYmNhbGwsIFR5cGVzKTsKKyAgfQorICBMZWdhbGl6ZVJ1bGVTZXQgJgorICBsaWJjYWxsRm9yQ2FydGVzaWFuUHJvZHVjdChzdGQ6OmluaXRpYWxpemVyX2xpc3Q8TExUPiBUeXBlczAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxMTFQ+IFR5cGVzMSkgeworICAgIHJldHVybiBhY3Rpb25Gb3JDYXJ0ZXNpYW5Qcm9kdWN0KExlZ2FsaXplQWN0aW9uOjpMaWJjYWxsLCBUeXBlczAsIFR5cGVzMSk7CisgIH0KKworICAvLy8gV2lkZW4gdGhlIHNjYWxhciB0byB0aGUgb25lIHNlbGVjdGVkIGJ5IHRoZSBtdXRhdGlvbiBpZiB0aGUgcHJlZGljYXRlIGlzCisgIC8vLyB0cnVlLgorICBMZWdhbGl6ZVJ1bGVTZXQgJndpZGVuU2NhbGFySWYoTGVnYWxpdHlQcmVkaWNhdGUgUHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWxpemVNdXRhdGlvbiBNdXRhdGlvbikgeworICAgIHJldHVybiBhY3Rpb25JZihMZWdhbGl6ZUFjdGlvbjo6V2lkZW5TY2FsYXIsIFByZWRpY2F0ZSwgTXV0YXRpb24pOworICB9CisgIC8vLyBOYXJyb3cgdGhlIHNjYWxhciB0byB0aGUgb25lIHNlbGVjdGVkIGJ5IHRoZSBtdXRhdGlvbiBpZiB0aGUgcHJlZGljYXRlIGlzCisgIC8vLyB0cnVlLgorICBMZWdhbGl6ZVJ1bGVTZXQgJm5hcnJvd1NjYWxhcklmKExlZ2FsaXR5UHJlZGljYXRlIFByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWdhbGl6ZU11dGF0aW9uIE11dGF0aW9uKSB7CisgICAgcmV0dXJuIGFjdGlvbklmKExlZ2FsaXplQWN0aW9uOjpOYXJyb3dTY2FsYXIsIFByZWRpY2F0ZSwgTXV0YXRpb24pOworICB9CisKKyAgLy8vIEFkZCBtb3JlIGVsZW1lbnRzIHRvIHJlYWNoIHRoZSB0eXBlIHNlbGVjdGVkIGJ5IHRoZSBtdXRhdGlvbiBpZiB0aGUKKyAgLy8vIHByZWRpY2F0ZSBpcyB0cnVlLgorICBMZWdhbGl6ZVJ1bGVTZXQgJm1vcmVFbGVtZW50c0lmKExlZ2FsaXR5UHJlZGljYXRlIFByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWdhbGl6ZU11dGF0aW9uIE11dGF0aW9uKSB7CisgICAgcmV0dXJuIGFjdGlvbklmKExlZ2FsaXplQWN0aW9uOjpNb3JlRWxlbWVudHMsIFByZWRpY2F0ZSwgTXV0YXRpb24pOworICB9CisgIC8vLyBSZW1vdmUgZWxlbWVudHMgdG8gcmVhY2ggdGhlIHR5cGUgc2VsZWN0ZWQgYnkgdGhlIG11dGF0aW9uIGlmIHRoZQorICAvLy8gcHJlZGljYXRlIGlzIHRydWUuCisgIExlZ2FsaXplUnVsZVNldCAmZmV3ZXJFbGVtZW50c0lmKExlZ2FsaXR5UHJlZGljYXRlIFByZWRpY2F0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWxpemVNdXRhdGlvbiBNdXRhdGlvbikgeworICAgIHJldHVybiBhY3Rpb25JZihMZWdhbGl6ZUFjdGlvbjo6RmV3ZXJFbGVtZW50cywgUHJlZGljYXRlLCBNdXRhdGlvbik7CisgIH0KKworICAvLy8gVGhlIGluc3RydWN0aW9uIGlzIHVuc3VwcG9ydGVkLgorICBMZWdhbGl6ZVJ1bGVTZXQgJnVuc3VwcG9ydGVkKCkgeworICAgIHJldHVybiBhY3Rpb25JZihMZWdhbGl6ZUFjdGlvbjo6VW5zdXBwb3J0ZWQsIGFsd2F5cyk7CisgIH0KKyAgTGVnYWxpemVSdWxlU2V0ICZ1bnN1cHBvcnRlZElmKExlZ2FsaXR5UHJlZGljYXRlIFByZWRpY2F0ZSkgeworICAgIHJldHVybiBhY3Rpb25JZihMZWdhbGl6ZUFjdGlvbjo6VW5zdXBwb3J0ZWQsIFByZWRpY2F0ZSk7CisgIH0KKworICBMZWdhbGl6ZVJ1bGVTZXQgJmN1c3RvbUlmKExlZ2FsaXR5UHJlZGljYXRlIFByZWRpY2F0ZSkgeworICAgIHJldHVybiBhY3Rpb25JZihMZWdhbGl6ZUFjdGlvbjo6Q3VzdG9tLCBQcmVkaWNhdGUpOworICB9CisgIExlZ2FsaXplUnVsZVNldCAmY3VzdG9tRm9yKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxMTFQ+IFR5cGVzKSB7CisgICAgcmV0dXJuIGFjdGlvbkZvcihMZWdhbGl6ZUFjdGlvbjo6Q3VzdG9tLCBUeXBlcyk7CisgIH0KKyAgTGVnYWxpemVSdWxlU2V0ICZjdXN0b21Gb3JDYXJ0ZXNpYW5Qcm9kdWN0KHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxMTFQ+IFR5cGVzKSB7CisgICAgcmV0dXJuIGFjdGlvbkZvckNhcnRlc2lhblByb2R1Y3QoTGVnYWxpemVBY3Rpb246OkN1c3RvbSwgVHlwZXMpOworICB9CisgIExlZ2FsaXplUnVsZVNldCAmCisgIGN1c3RvbUZvckNhcnRlc2lhblByb2R1Y3Qoc3RkOjppbml0aWFsaXplcl9saXN0PExMVD4gVHlwZXMwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxMTFQ+IFR5cGVzMSkgeworICAgIHJldHVybiBhY3Rpb25Gb3JDYXJ0ZXNpYW5Qcm9kdWN0KExlZ2FsaXplQWN0aW9uOjpDdXN0b20sIFR5cGVzMCwgVHlwZXMxKTsKKyAgfQorCisgIC8vLyBXaWRlbiB0aGUgc2NhbGFyIHRvIHRoZSBuZXh0IHBvd2VyIG9mIHR3byB0aGF0IGlzIGF0IGxlYXN0IE1pblNpemUuCisgIC8vLyBObyBlZmZlY3QgaWYgdGhlIHR5cGUgaXMgbm90IGEgc2NhbGFyIG9yIGlzIGEgcG93ZXIgb2YgdHdvLgorICBMZWdhbGl6ZVJ1bGVTZXQgJndpZGVuU2NhbGFyVG9OZXh0UG93Mih1bnNpZ25lZCBUeXBlSWR4LCB1bnNpZ25lZCBNaW5TaXplID0gMCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBMZWdhbGl0eVByZWRpY2F0ZXM7CisgICAgcmV0dXJuIHdpZGVuU2NhbGFySWYoCisgICAgICAgIHNpemVOb3RQb3cyKFR5cGVJZHgpLAorICAgICAgICBMZWdhbGl6ZU11dGF0aW9uczo6d2lkZW5TY2FsYXJUb05leHRQb3cyKFR5cGVJZHgsIE1pblNpemUpKTsKKyAgfQorCisgIExlZ2FsaXplUnVsZVNldCAmbmFycm93U2NhbGFyKHVuc2lnbmVkIFR5cGVJZHgsIExlZ2FsaXplTXV0YXRpb24gTXV0YXRpb24pIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgTGVnYWxpdHlQcmVkaWNhdGVzOworICAgIHJldHVybiBuYXJyb3dTY2FsYXJJZihpc1NjYWxhcihUeXBlSWR4KSwgTXV0YXRpb24pOworICB9CisKKyAgLy8vIEVuc3VyZSB0aGUgc2NhbGFyIGlzIGF0IGxlYXN0IGFzIHdpZGUgYXMgVHkuCisgIExlZ2FsaXplUnVsZVNldCAmbWluU2NhbGFyKHVuc2lnbmVkIFR5cGVJZHgsIGNvbnN0IExMVCAmVHkpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgTGVnYWxpdHlQcmVkaWNhdGVzOworICAgIHVzaW5nIG5hbWVzcGFjZSBMZWdhbGl6ZU11dGF0aW9uczsKKyAgICByZXR1cm4gd2lkZW5TY2FsYXJJZihuYXJyb3dlclRoYW4oVHlwZUlkeCwgVHkuZ2V0U2l6ZUluQml0cygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFuZ2VUbyhUeXBlSWR4LCBUeSkpOworICB9CisKKyAgLy8vIEVuc3VyZSB0aGUgc2NhbGFyIGlzIGF0IG1vc3QgYXMgd2lkZSBhcyBUeS4KKyAgTGVnYWxpemVSdWxlU2V0ICZtYXhTY2FsYXIodW5zaWduZWQgVHlwZUlkeCwgY29uc3QgTExUICZUeSkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBMZWdhbGl0eVByZWRpY2F0ZXM7CisgICAgdXNpbmcgbmFtZXNwYWNlIExlZ2FsaXplTXV0YXRpb25zOworICAgIHJldHVybiBuYXJyb3dTY2FsYXJJZih3aWRlclRoYW4oVHlwZUlkeCwgVHkuZ2V0U2l6ZUluQml0cygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhbmdlVG8oVHlwZUlkeCwgVHkpKTsKKyAgfQorCisgIC8vLyBDb25kaXRpb25hbGx5IGxpbWl0IHRoZSBtYXhpbXVtIHNpemUgb2YgdGhlIHNjYWxhci4KKyAgLy8vIEZvciBleGFtcGxlLCB3aGVuIHRoZSBtYXhpbXVtIHNpemUgb2Ygb25lIHR5cGUgZGVwZW5kcyBvbiB0aGUgc2l6ZSBvZgorICAvLy8gYW5vdGhlciBzdWNoIGFzIGV4dHJhY3RpbmcgTiBiaXRzIGZyb20gYW4gTSBiaXQgY29udGFpbmVyLgorICBMZWdhbGl6ZVJ1bGVTZXQgJm1heFNjYWxhcklmKExlZ2FsaXR5UHJlZGljYXRlIFByZWRpY2F0ZSwgdW5zaWduZWQgVHlwZUlkeCwgY29uc3QgTExUICZUeSkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBMZWdhbGl0eVByZWRpY2F0ZXM7CisgICAgdXNpbmcgbmFtZXNwYWNlIExlZ2FsaXplTXV0YXRpb25zOworICAgIHJldHVybiBuYXJyb3dTY2FsYXJJZigKKyAgICAgICAgWz1dKGNvbnN0IExlZ2FsaXR5UXVlcnkgJlF1ZXJ5KSB7CisgICAgICAgICAgcmV0dXJuIHdpZGVyVGhhbihUeXBlSWR4LCBUeS5nZXRTaXplSW5CaXRzKCkpICYmCisgICAgICAgICAgICAgICAgIFByZWRpY2F0ZShRdWVyeSk7CisgICAgICAgIH0sCisgICAgICAgIGNoYW5nZVRvKFR5cGVJZHgsIFR5KSk7CisgIH0KKworICAvLy8gTGltaXQgdGhlIHJhbmdlIG9mIHNjYWxhciBzaXplcyB0byBNaW5UeSBhbmQgTWF4VHkuCisgIExlZ2FsaXplUnVsZVNldCAmY2xhbXBTY2FsYXIodW5zaWduZWQgVHlwZUlkeCwgY29uc3QgTExUICZNaW5UeSwgY29uc3QgTExUICZNYXhUeSkgeworICAgIGFzc2VydChNaW5UeS5pc1NjYWxhcigpICYmIE1heFR5LmlzU2NhbGFyKCkgJiYgIkV4cGVjdGVkIHNjYWxhciB0eXBlcyIpOworCisgICAgcmV0dXJuIG1pblNjYWxhcihUeXBlSWR4LCBNaW5UeSkKKyAgICAgICAgLm1heFNjYWxhcihUeXBlSWR4LCBNYXhUeSk7CisgIH0KKworICAvLy8gQWRkIG1vcmUgZWxlbWVudHMgdG8gdGhlIHZlY3RvciB0byByZWFjaCB0aGUgbmV4dCBwb3dlciBvZiB0d28uCisgIC8vLyBObyBlZmZlY3QgaWYgdGhlIHR5cGUgaXMgbm90IGEgdmVjdG9yIG9yIHRoZSBlbGVtZW50IGNvdW50IGlzIGEgcG93ZXIgb2YKKyAgLy8vIHR3by4KKyAgTGVnYWxpemVSdWxlU2V0ICZtb3JlRWxlbWVudHNUb05leHRQb3cyKHVuc2lnbmVkIFR5cGVJZHgpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgTGVnYWxpdHlQcmVkaWNhdGVzOworICAgIHJldHVybiBtb3JlRWxlbWVudHNJZihudW1FbGVtZW50c05vdFBvdzIoVHlwZUlkeCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIExlZ2FsaXplTXV0YXRpb25zOjptb3JlRWxlbWVudHNUb05leHRQb3cyKFR5cGVJZHgpKTsKKyAgfQorCisgIC8vLyBMaW1pdCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIEVsdFR5IHZlY3RvcnMgdG8gYXQgbGVhc3QgTWluRWxlbWVudHMuCisgIExlZ2FsaXplUnVsZVNldCAmY2xhbXBNaW5OdW1FbGVtZW50cyh1bnNpZ25lZCBUeXBlSWR4LCBjb25zdCBMTFQgJkVsdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWluRWxlbWVudHMpIHsKKyAgICByZXR1cm4gbW9yZUVsZW1lbnRzSWYoCisgICAgICAgIFs9XShjb25zdCBMZWdhbGl0eVF1ZXJ5ICZRdWVyeSkgeworICAgICAgICAgIExMVCBWZWNUeSA9IFF1ZXJ5LlR5cGVzW1R5cGVJZHhdOworICAgICAgICAgIHJldHVybiBWZWNUeS5nZXRFbGVtZW50VHlwZSgpID09IEVsdFR5ICYmCisgICAgICAgICAgICAgICAgIFZlY1R5LmdldE51bUVsZW1lbnRzKCkgPCBNaW5FbGVtZW50czsKKyAgICAgICAgfSwKKyAgICAgICAgWz1dKGNvbnN0IExlZ2FsaXR5UXVlcnkgJlF1ZXJ5KSB7CisgICAgICAgICAgTExUIFZlY1R5ID0gUXVlcnkuVHlwZXNbVHlwZUlkeF07CisgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICBUeXBlSWR4LCBMTFQ6OnZlY3RvcihNaW5FbGVtZW50cywgVmVjVHkuZ2V0U2NhbGFyU2l6ZUluQml0cygpKSk7CisgICAgICAgIH0pOworICB9CisgIC8vLyBMaW1pdCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIEVsdFR5IHZlY3RvcnMgdG8gYXQgbW9zdCBNYXhFbGVtZW50cy4KKyAgTGVnYWxpemVSdWxlU2V0ICZjbGFtcE1heE51bUVsZW1lbnRzKHVuc2lnbmVkIFR5cGVJZHgsIGNvbnN0IExMVCAmRWx0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNYXhFbGVtZW50cykgeworICAgIHJldHVybiBmZXdlckVsZW1lbnRzSWYoCisgICAgICAgIFs9XShjb25zdCBMZWdhbGl0eVF1ZXJ5ICZRdWVyeSkgeworICAgICAgICAgIExMVCBWZWNUeSA9IFF1ZXJ5LlR5cGVzW1R5cGVJZHhdOworICAgICAgICAgIHJldHVybiBWZWNUeS5nZXRFbGVtZW50VHlwZSgpID09IEVsdFR5ICYmCisgICAgICAgICAgICAgICAgIFZlY1R5LmdldE51bUVsZW1lbnRzKCkgPiBNYXhFbGVtZW50czsKKyAgICAgICAgfSwKKyAgICAgICAgWz1dKGNvbnN0IExlZ2FsaXR5UXVlcnkgJlF1ZXJ5KSB7CisgICAgICAgICAgTExUIFZlY1R5ID0gUXVlcnkuVHlwZXNbVHlwZUlkeF07CisgICAgICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKAorICAgICAgICAgICAgICBUeXBlSWR4LCBMTFQ6OnZlY3RvcihNYXhFbGVtZW50cywgVmVjVHkuZ2V0U2NhbGFyU2l6ZUluQml0cygpKSk7CisgICAgICAgIH0pOworICB9CisgIC8vLyBMaW1pdCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGZvciB0aGUgZ2l2ZW4gdmVjdG9ycyB0byBhdCBsZWFzdCBNaW5UeSdzCisgIC8vLyBudW1iZXIgb2YgZWxlbWVudHMgYW5kIGF0IG1vc3QgTWF4VHkncyBudW1iZXIgb2YgZWxlbWVudHMuCisgIC8vLworICAvLy8gTm8gZWZmZWN0IGlmIHRoZSB0eXBlIGlzIG5vdCBhIHZlY3RvciBvciBkb2VzIG5vdCBoYXZlIHRoZSBzYW1lIGVsZW1lbnQKKyAgLy8vIHR5cGUgYXMgdGhlIGNvbnN0cmFpbnRzLgorICAvLy8gVGhlIGVsZW1lbnQgdHlwZSBvZiBNaW5UeSBhbmQgTWF4VHkgbXVzdCBtYXRjaC4KKyAgTGVnYWxpemVSdWxlU2V0ICZjbGFtcE51bUVsZW1lbnRzKHVuc2lnbmVkIFR5cGVJZHgsIGNvbnN0IExMVCAmTWluVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMTFQgJk1heFR5KSB7CisgICAgYXNzZXJ0KE1pblR5LmdldEVsZW1lbnRUeXBlKCkgPT0gTWF4VHkuZ2V0RWxlbWVudFR5cGUoKSAmJgorICAgICAgICAgICAiRXhwZWN0ZWQgZWxlbWVudCB0eXBlcyB0byBhZ3JlZSIpOworCisgICAgY29uc3QgTExUICZFbHRUeSA9IE1pblR5LmdldEVsZW1lbnRUeXBlKCk7CisgICAgcmV0dXJuIGNsYW1wTWluTnVtRWxlbWVudHMoVHlwZUlkeCwgRWx0VHksIE1pblR5LmdldE51bUVsZW1lbnRzKCkpCisgICAgICAgIC5jbGFtcE1heE51bUVsZW1lbnRzKFR5cGVJZHgsIEVsdFR5LCBNYXhUeS5nZXROdW1FbGVtZW50cygpKTsKKyAgfQorCisgIC8vLyBGYWxsYmFjayBvbiB0aGUgcHJldmlvdXMgaW1wbGVtZW50YXRpb24uIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGlsZQorICAvLy8gcG9ydGluZyBhIHJ1bGUuCisgIExlZ2FsaXplUnVsZVNldCAmZmFsbGJhY2soKSB7CisgICAgYWRkKHthbHdheXMsIExlZ2FsaXplQWN0aW9uOjpVc2VMZWdhY3lSdWxlc30pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBBcHBseSB0aGUgcnVsZXNldCB0byB0aGUgZ2l2ZW4gTGVnYWxpdHlRdWVyeS4KKyAgTGVnYWxpemVBY3Rpb25TdGVwIGFwcGx5KGNvbnN0IExlZ2FsaXR5UXVlcnkgJlF1ZXJ5KSBjb25zdDsKK307CisKK2NsYXNzIExlZ2FsaXplckluZm8geworcHVibGljOgorICBMZWdhbGl6ZXJJbmZvKCk7CisgIHZpcnR1YWwgfkxlZ2FsaXplckluZm8oKSA9IGRlZmF1bHQ7CisKKyAgdW5zaWduZWQgZ2V0T3Bjb2RlSWR4Rm9yT3Bjb2RlKHVuc2lnbmVkIE9wY29kZSkgY29uc3Q7CisgIHVuc2lnbmVkIGdldEFjdGlvbkRlZmluaXRpb25zSWR4KHVuc2lnbmVkIE9wY29kZSkgY29uc3Q7CisKKyAgLy8vIENvbXB1dGUgYW55IGFuY2lsbGFyeSB0YWJsZXMgbmVlZGVkIHRvIHF1aWNrbHkgZGVjaWRlIGhvdyBhbiBvcGVyYXRpb24KKyAgLy8vIHNob3VsZCBiZSBoYW5kbGVkLiBUaGlzIG11c3QgYmUgY2FsbGVkIGFmdGVyIGFsbCAic2V0KkFjdGlvbiJtZXRob2RzIGJ1dAorICAvLy8gYmVmb3JlIGFueSBxdWVyeSBpcyBtYWRlIG9yIGluY29ycmVjdCByZXN1bHRzIG1heSBiZSByZXR1cm5lZC4KKyAgdm9pZCBjb21wdXRlVGFibGVzKCk7CisKKyAgc3RhdGljIGJvb2wgbmVlZHNMZWdhbGl6aW5nVG9EaWZmZXJlbnRTaXplKGNvbnN0IExlZ2FsaXplQWN0aW9uIEFjdGlvbikgeworICAgIHVzaW5nIG5hbWVzcGFjZSBMZWdhbGl6ZUFjdGlvbnM7CisgICAgc3dpdGNoIChBY3Rpb24pIHsKKyAgICBjYXNlIE5hcnJvd1NjYWxhcjoKKyAgICBjYXNlIFdpZGVuU2NhbGFyOgorICAgIGNhc2UgRmV3ZXJFbGVtZW50czoKKyAgICBjYXNlIE1vcmVFbGVtZW50czoKKyAgICBjYXNlIFVuc3VwcG9ydGVkOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICB1c2luZyBTaXplQW5kQWN0aW9uID0gc3RkOjpwYWlyPHVpbnQxNl90LCBMZWdhbGl6ZUFjdGlvbj47CisgIHVzaW5nIFNpemVBbmRBY3Rpb25zVmVjID0gc3RkOjp2ZWN0b3I8U2l6ZUFuZEFjdGlvbj47CisgIHVzaW5nIFNpemVDaGFuZ2VTdHJhdGVneSA9CisgICAgICBzdGQ6OmZ1bmN0aW9uPFNpemVBbmRBY3Rpb25zVmVjKGNvbnN0IFNpemVBbmRBY3Rpb25zVmVjICZ2KT47CisKKyAgLy8vIE1vcmUgZnJpZW5kbHkgd2F5IHRvIHNldCBhbiBhY3Rpb24gZm9yIGNvbW1vbiB0eXBlcyB0aGF0IGhhdmUgYW4gTExUCisgIC8vLyByZXByZXNlbnRhdGlvbi4KKyAgLy8vIFRoZSBMZWdhbGl6ZUFjdGlvbiBtdXN0IGJlIG9uZSBmb3Igd2hpY2ggTmVlZHNMZWdhbGl6aW5nVG9EaWZmZXJlbnRTaXplCisgIC8vLyByZXR1cm5zIGZhbHNlLgorICB2b2lkIHNldEFjdGlvbihjb25zdCBJbnN0ckFzcGVjdCAmQXNwZWN0LCBMZWdhbGl6ZUFjdGlvbiBBY3Rpb24pIHsKKyAgICBhc3NlcnQoIW5lZWRzTGVnYWxpemluZ1RvRGlmZmVyZW50U2l6ZShBY3Rpb24pKTsKKyAgICBUYWJsZXNJbml0aWFsaXplZCA9IGZhbHNlOworICAgIGNvbnN0IHVuc2lnbmVkIE9wY29kZUlkeCA9IEFzcGVjdC5PcGNvZGUgLSBGaXJzdE9wOworICAgIGlmIChTcGVjaWZpZWRBY3Rpb25zW09wY29kZUlkeF0uc2l6ZSgpIDw9IEFzcGVjdC5JZHgpCisgICAgICBTcGVjaWZpZWRBY3Rpb25zW09wY29kZUlkeF0ucmVzaXplKEFzcGVjdC5JZHggKyAxKTsKKyAgICBTcGVjaWZpZWRBY3Rpb25zW09wY29kZUlkeF1bQXNwZWN0LklkeF1bQXNwZWN0LlR5cGVdID0gQWN0aW9uOworICB9CisKKyAgLy8vIFRoZSBzZXRBY3Rpb24gY2FsbHMgcmVjb3JkIHRoZSBub24tc2l6ZS1jaGFuZ2luZyBsZWdhbGl6YXRpb24gYWN0aW9ucworICAvLy8gdG8gdGFrZSBvbiBzcGVjaWZpY2x5LXNpemVkIHR5cGVzLiBUaGUgU2l6ZUNoYW5nZVN0cmF0ZWd5IGRlZmluZXMgd2hhdAorICAvLy8gdG8gZG8gd2hlbiB0aGUgc2l6ZSBvZiB0aGUgdHlwZSBuZWVkcyB0byBiZSBjaGFuZ2VkIHRvIHJlYWNoIGEgbGVnYWxseQorICAvLy8gc2l6ZWQgdHlwZSAoaS5lLiwgb25lIHRoYXQgd2FzIGRlZmluZWQgdGhyb3VnaCBhIHNldEFjdGlvbiBjYWxsKS4KKyAgLy8vIGUuZy4KKyAgLy8vIHNldEFjdGlvbiAoe0dfQURELCAwLCBMTFQ6OnNjYWxhcigzMil9LCBMZWdhbCk7CisgIC8vLyBzZXRMZWdhbGl6ZVNjYWxhclRvRGlmZmVyZW50U2l6ZVN0cmF0ZWd5KAorICAvLy8gICBHX0FERCwgMCwgd2lkZW5Ub0xhcmdlclR5cGVzQW5kTmFycm93VG9MYXJnZXN0KTsKKyAgLy8vIHdpbGwgZW5kIHVwIGRlZmluaW5nIGdldEFjdGlvbih7R19BREQsIDAsIFR9KSB0byByZXR1cm4gdGhlIGZvbGxvd2luZyAKKyAgLy8vIGFjdGlvbnMgZm9yIGRpZmZlcmVudCBzY2FsYXIgdHlwZXMgVDoKKyAgLy8vICBMTFQ6OnNjYWxhcigxKS4uTExUOjpzY2FsYXIoMzEpOiB7V2lkZW5TY2FsYXIsIDAsIExMVDo6c2NhbGFyKDMyKX0KKyAgLy8vICBMTFQ6OnNjYWxhcigzMik6ICAgICAgICAgICAgICAgICB7TGVnYWwsIDAsIExMVDo6c2NhbGFyKDMyKX0KKyAgLy8vICBMTFQ6OnNjYWxhcigzMykuLjogICAgICAgICAgICAgICB7TmFycm93U2NhbGFyLCAwLCBMTFQ6OnNjYWxhcigzMil9CisgIC8vLworICAvLy8gSWYgbm8gU2l6ZUNoYW5nZUFjdGlvbiBnZXRzIGRlZmluZWQsIHRocm91Z2ggdGhpcyBmdW5jdGlvbiwKKyAgLy8vIHRoZSBkZWZhdWx0IGlzIHVuc3VwcG9ydGVkRm9yRGlmZmVyZW50U2l6ZXMuCisgIHZvaWQgc2V0TGVnYWxpemVTY2FsYXJUb0RpZmZlcmVudFNpemVTdHJhdGVneShjb25zdCB1bnNpZ25lZCBPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBUeXBlSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2l6ZUNoYW5nZVN0cmF0ZWd5IFMpIHsKKyAgICBjb25zdCB1bnNpZ25lZCBPcGNvZGVJZHggPSBPcGNvZGUgLSBGaXJzdE9wOworICAgIGlmIChTY2FsYXJTaXplQ2hhbmdlU3RyYXRlZ2llc1tPcGNvZGVJZHhdLnNpemUoKSA8PSBUeXBlSWR4KQorICAgICAgU2NhbGFyU2l6ZUNoYW5nZVN0cmF0ZWdpZXNbT3Bjb2RlSWR4XS5yZXNpemUoVHlwZUlkeCArIDEpOworICAgIFNjYWxhclNpemVDaGFuZ2VTdHJhdGVnaWVzW09wY29kZUlkeF1bVHlwZUlkeF0gPSBTOworICB9CisKKyAgLy8vIFNlZSBhbHNvIHNldExlZ2FsaXplU2NhbGFyVG9EaWZmZXJlbnRTaXplU3RyYXRlZ3kuCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGFsbG93cyB0byBzZXQgdGhlIFNpemVDaGFuZ2VTdHJhdGVneSBmb3IgdmVjdG9yIGVsZW1lbnRzLgorICB2b2lkIHNldExlZ2FsaXplVmVjdG9yRWxlbWVudFRvRGlmZmVyZW50U2l6ZVN0cmF0ZWd5KGNvbnN0IHVuc2lnbmVkIE9wY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBUeXBlSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemVDaGFuZ2VTdHJhdGVneSBTKSB7CisgICAgY29uc3QgdW5zaWduZWQgT3Bjb2RlSWR4ID0gT3Bjb2RlIC0gRmlyc3RPcDsKKyAgICBpZiAoVmVjdG9yRWxlbWVudFNpemVDaGFuZ2VTdHJhdGVnaWVzW09wY29kZUlkeF0uc2l6ZSgpIDw9IFR5cGVJZHgpCisgICAgICBWZWN0b3JFbGVtZW50U2l6ZUNoYW5nZVN0cmF0ZWdpZXNbT3Bjb2RlSWR4XS5yZXNpemUoVHlwZUlkeCArIDEpOworICAgIFZlY3RvckVsZW1lbnRTaXplQ2hhbmdlU3RyYXRlZ2llc1tPcGNvZGVJZHhdW1R5cGVJZHhdID0gUzsKKyAgfQorCisgIC8vLyBBIFNpemVDaGFuZ2VTdHJhdGVneSBmb3IgdGhlIGNvbW1vbiBjYXNlIHdoZXJlIGxlZ2FsaXphdGlvbiBmb3IgYSAKKyAgLy8vIHBhcnRpY3VsYXIgb3BlcmF0aW9uIGNvbnNpc3RzIG9mIG9ubHkgc3VwcG9ydGluZyBhIHNwZWNpZmljIHNldCBvZiB0eXBlCisgIC8vLyBzaXplcy4gRS5nLgorICAvLy8gICBzZXRBY3Rpb24gKHtHX0RJViwgMCwgTExUOjpzY2FsYXIoMzIpfSwgTGVnYWwpOworICAvLy8gICBzZXRBY3Rpb24gKHtHX0RJViwgMCwgTExUOjpzY2FsYXIoNjQpfSwgTGVnYWwpOworICAvLy8gICBzZXRMZWdhbGl6ZVNjYWxhclRvRGlmZmVyZW50U2l6ZVN0cmF0ZWd5KAorICAvLy8gICAgIEdfRElWLCAwLCB1bnN1cHBvcnRlZEZvckRpZmZlcmVudFNpemVzKTsKKyAgLy8vIHdpbGwgcmVzdWx0IGluIGdldEFjdGlvbih7R19ESVYsIDAsIFR9KSB0byByZXR1cm4gTGVnYWwgZm9yIHMzMiBhbmQgczY0LAorICAvLy8gYW5kIFVuc3VwcG9ydGVkIGZvciBhbGwgb3RoZXIgc2NhbGFyIHR5cGVzIFQuCisgIHN0YXRpYyBTaXplQW5kQWN0aW9uc1ZlYworICB1bnN1cHBvcnRlZEZvckRpZmZlcmVudFNpemVzKGNvbnN0IFNpemVBbmRBY3Rpb25zVmVjICZ2KSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIExlZ2FsaXplQWN0aW9uczsKKyAgICByZXR1cm4gaW5jcmVhc2VUb0xhcmdlclR5cGVzQW5kRGVjcmVhc2VUb0xhcmdlc3QodiwgVW5zdXBwb3J0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuc3VwcG9ydGVkKTsKKyAgfQorCisgIC8vLyBBIFNpemVDaGFuZ2VTdHJhdGVneSBmb3IgdGhlIGNvbW1vbiBjYXNlIHdoZXJlIGxlZ2FsaXphdGlvbiBmb3IgYQorICAvLy8gcGFydGljdWxhciBvcGVyYXRpb24gY29uc2lzdHMgb2Ygd2lkZW5pbmcgdGhlIHR5cGUgdG8gYSBsYXJnZSBsZWdhbCB0eXBlLAorICAvLy8gdW5sZXNzIHRoZXJlIGlzIG5vIHN1Y2ggdHlwZSBhbmQgdGhlbiBpbnN0ZWFkIGl0IHNob3VsZCBiZSBuYXJyb3dlZCB0byB0aGUKKyAgLy8vIGxhcmdlc3QgbGVnYWwgdHlwZS4KKyAgc3RhdGljIFNpemVBbmRBY3Rpb25zVmVjCisgIHdpZGVuVG9MYXJnZXJUeXBlc0FuZE5hcnJvd1RvTGFyZ2VzdChjb25zdCBTaXplQW5kQWN0aW9uc1ZlYyAmdikgeworICAgIHVzaW5nIG5hbWVzcGFjZSBMZWdhbGl6ZUFjdGlvbnM7CisgICAgYXNzZXJ0KHYuc2l6ZSgpID4gMCAmJgorICAgICAgICAgICAiQXQgbGVhc3Qgb25lIHNpemUgdGhhdCBjYW4gYmUgbGVnYWxpemVkIHRvd2FyZHMgaXMgbmVlZGVkIgorICAgICAgICAgICAiIGZvciB0aGlzIFNpemVDaGFuZ2VTdHJhdGVneSIpOworICAgIHJldHVybiBpbmNyZWFzZVRvTGFyZ2VyVHlwZXNBbmREZWNyZWFzZVRvTGFyZ2VzdCh2LCBXaWRlblNjYWxhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFycm93U2NhbGFyKTsKKyAgfQorCisgIHN0YXRpYyBTaXplQW5kQWN0aW9uc1ZlYworICB3aWRlblRvTGFyZ2VyVHlwZXNVbnN1cHBvcnRlZE90aGVyd2lzZShjb25zdCBTaXplQW5kQWN0aW9uc1ZlYyAmdikgeworICAgIHVzaW5nIG5hbWVzcGFjZSBMZWdhbGl6ZUFjdGlvbnM7CisgICAgcmV0dXJuIGluY3JlYXNlVG9MYXJnZXJUeXBlc0FuZERlY3JlYXNlVG9MYXJnZXN0KHYsIFdpZGVuU2NhbGFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbnN1cHBvcnRlZCk7CisgIH0KKworICBzdGF0aWMgU2l6ZUFuZEFjdGlvbnNWZWMKKyAgbmFycm93VG9TbWFsbGVyQW5kVW5zdXBwb3J0ZWRJZlRvb1NtYWxsKGNvbnN0IFNpemVBbmRBY3Rpb25zVmVjICZ2KSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIExlZ2FsaXplQWN0aW9uczsKKyAgICByZXR1cm4gZGVjcmVhc2VUb1NtYWxsZXJUeXBlc0FuZEluY3JlYXNlVG9TbWFsbGVzdCh2LCBOYXJyb3dTY2FsYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5zdXBwb3J0ZWQpOworICB9CisKKyAgc3RhdGljIFNpemVBbmRBY3Rpb25zVmVjCisgIG5hcnJvd1RvU21hbGxlckFuZFdpZGVuVG9TbWFsbGVzdChjb25zdCBTaXplQW5kQWN0aW9uc1ZlYyAmdikgeworICAgIHVzaW5nIG5hbWVzcGFjZSBMZWdhbGl6ZUFjdGlvbnM7CisgICAgYXNzZXJ0KHYuc2l6ZSgpID4gMCAmJgorICAgICAgICAgICAiQXQgbGVhc3Qgb25lIHNpemUgdGhhdCBjYW4gYmUgbGVnYWxpemVkIHRvd2FyZHMgaXMgbmVlZGVkIgorICAgICAgICAgICAiIGZvciB0aGlzIFNpemVDaGFuZ2VTdHJhdGVneSIpOworICAgIHJldHVybiBkZWNyZWFzZVRvU21hbGxlclR5cGVzQW5kSW5jcmVhc2VUb1NtYWxsZXN0KHYsIE5hcnJvd1NjYWxhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaWRlblNjYWxhcik7CisgIH0KKworICAvLy8gQSBTaXplQ2hhbmdlU3RyYXRlZ3kgZm9yIHRoZSBjb21tb24gY2FzZSB3aGVyZSBsZWdhbGl6YXRpb24gZm9yIGEKKyAgLy8vIHBhcnRpY3VsYXIgdmVjdG9yIG9wZXJhdGlvbiBjb25zaXN0cyBvZiBoYXZpbmcgbW9yZSBlbGVtZW50cyBpbiB0aGUKKyAgLy8vIHZlY3RvciwgdG8gYSB0eXBlIHRoYXQgaXMgbGVnYWwuIFVubGVzcyB0aGVyZSBpcyBubyBzdWNoIHR5cGUgYW5kIHRoZW4KKyAgLy8vIGluc3RlYWQgaXQgc2hvdWxkIGJlIGxlZ2FsaXplZCB0b3dhcmRzIHRoZSB3aWRlc3QgdmVjdG9yIHRoYXQncyBzdGlsbAorICAvLy8gbGVnYWwuIEUuZy4KKyAgLy8vICAgc2V0QWN0aW9uKHtHX0FERCwgTExUOjp2ZWN0b3IoOCwgOCl9LCBMZWdhbCk7CisgIC8vLyAgIHNldEFjdGlvbih7R19BREQsIExMVDo6dmVjdG9yKDE2LCA4KX0sIExlZ2FsKTsKKyAgLy8vICAgc2V0QWN0aW9uKHtHX0FERCwgTExUOjp2ZWN0b3IoMiwgMzIpfSwgTGVnYWwpOworICAvLy8gICBzZXRBY3Rpb24oe0dfQURELCBMTFQ6OnZlY3Rvcig0LCAzMil9LCBMZWdhbCk7CisgIC8vLyAgIHNldExlZ2FsaXplVmVjdG9yRWxlbWVudFRvRGlmZmVyZW50U2l6ZVN0cmF0ZWd5KAorICAvLy8gICAgIEdfQURELCAwLCBtb3JlVG9XaWRlclR5cGVzQW5kTGVzc1RvV2lkZXN0KTsKKyAgLy8vIHdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgZ2V0QWN0aW9uIHJlc3VsdHM6CisgIC8vLyAgICogZ2V0QWN0aW9uKHtHX0FERCwgTExUOjp2ZWN0b3IoOCw4KX0pIHJldHVybnMKKyAgLy8vICAgICAgIChMZWdhbCwgdmVjdG9yKDgsOCkpLgorICAvLy8gICAqIGdldEFjdGlvbih7R19BREQsIExMVDo6dmVjdG9yKDksOCl9KSByZXR1cm5zCisgIC8vLyAgICAgICAoTW9yZUVsZW1lbnRzLCB2ZWN0b3IoMTYsOCkpLgorICAvLy8gICAqIGdldEFjdGlvbih7R19BREQsIExMVDo6dmVjdG9yKDgsMzIpfSkgcmV0dXJucworICAvLy8gICAgICAgKEZld2VyRWxlbWVudHMsIHZlY3Rvcig0LDMyKSkuCisgIHN0YXRpYyBTaXplQW5kQWN0aW9uc1ZlYworICBtb3JlVG9XaWRlclR5cGVzQW5kTGVzc1RvV2lkZXN0KGNvbnN0IFNpemVBbmRBY3Rpb25zVmVjICZ2KSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIExlZ2FsaXplQWN0aW9uczsKKyAgICByZXR1cm4gaW5jcmVhc2VUb0xhcmdlclR5cGVzQW5kRGVjcmVhc2VUb0xhcmdlc3QodiwgTW9yZUVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGZXdlckVsZW1lbnRzKTsKKyAgfQorCisgIC8vLyBIZWxwZXIgZnVuY3Rpb24gdG8gaW1wbGVtZW50IG1hbnkgdHlwaWNhbCBTaXplQ2hhbmdlU3RyYXRlZ3kgZnVuY3Rpb25zLgorICBzdGF0aWMgU2l6ZUFuZEFjdGlvbnNWZWMKKyAgaW5jcmVhc2VUb0xhcmdlclR5cGVzQW5kRGVjcmVhc2VUb0xhcmdlc3QoY29uc3QgU2l6ZUFuZEFjdGlvbnNWZWMgJnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZ2FsaXplQWN0aW9uIEluY3JlYXNlQWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWdhbGl6ZUFjdGlvbiBEZWNyZWFzZUFjdGlvbik7CisgIC8vLyBIZWxwZXIgZnVuY3Rpb24gdG8gaW1wbGVtZW50IG1hbnkgdHlwaWNhbCBTaXplQ2hhbmdlU3RyYXRlZ3kgZnVuY3Rpb25zLgorICBzdGF0aWMgU2l6ZUFuZEFjdGlvbnNWZWMKKyAgZGVjcmVhc2VUb1NtYWxsZXJUeXBlc0FuZEluY3JlYXNlVG9TbWFsbGVzdChjb25zdCBTaXplQW5kQWN0aW9uc1ZlYyAmdiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWdhbGl6ZUFjdGlvbiBEZWNyZWFzZUFjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWdhbGl6ZUFjdGlvbiBJbmNyZWFzZUFjdGlvbik7CisKKyAgLy8vIEdldCB0aGUgYWN0aW9uIGRlZmluaXRpb25zIGZvciB0aGUgZ2l2ZW4gb3Bjb2RlLiBVc2UgdGhpcyB0byBydW4gYQorICAvLy8gTGVnYWxpdHlRdWVyeSB0aHJvdWdoIHRoZSBkZWZpbml0aW9ucy4KKyAgY29uc3QgTGVnYWxpemVSdWxlU2V0ICZnZXRBY3Rpb25EZWZpbml0aW9ucyh1bnNpZ25lZCBPcGNvZGUpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIGFjdGlvbiBkZWZpbml0aW9uIGJ1aWxkZXIgZm9yIHRoZSBnaXZlbiBvcGNvZGUuIFVzZSB0aGlzIHRvIGRlZmluZQorICAvLy8gdGhlIGFjdGlvbiBkZWZpbml0aW9ucy4KKyAgLy8vCisgIC8vLyBJdCBpcyBhbiBlcnJvciB0byByZXF1ZXN0IGFuIG9wY29kZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkIGJ5IHRoZQorICAvLy8gbXVsdGlwbGUtb3Bjb2RlIHZhcmlhbnQuCisgIExlZ2FsaXplUnVsZVNldCAmZ2V0QWN0aW9uRGVmaW5pdGlvbnNCdWlsZGVyKHVuc2lnbmVkIE9wY29kZSk7CisKKyAgLy8vIEdldCB0aGUgYWN0aW9uIGRlZmluaXRpb24gYnVpbGRlciBmb3IgdGhlIGdpdmVuIHNldCBvZiBvcGNvZGVzLiBVc2UgdGhpcworICAvLy8gdG8gZGVmaW5lIHRoZSBhY3Rpb24gZGVmaW5pdGlvbnMgZm9yIG11bHRpcGxlIG9wY29kZXMgYXQgb25jZS4gVGhlIGZpcnN0CisgIC8vLyBvcGNvZGUgZ2l2ZW4gd2lsbCBiZSBjb25zaWRlcmVkIHRoZSByZXByZXNlbnRhdGl2ZSBvcGNvZGUgYW5kIHdpbGwgaG9sZAorICAvLy8gdGhlIGRlZmluaXRpb25zIHdoZXJlYXMgdGhlIG90aGVyIG9wY29kZXMgd2lsbCBiZSBjb25maWd1cmVkIHRvIHJlZmVyIHRvCisgIC8vLyB0aGUgcmVwcmVzZW50YXRpdmUgb3Bjb2RlLiBUaGlzIGxvd2VycyBtZW1vcnkgcmVxdWlyZW1lbnRzIGFuZCB2ZXJ5CisgIC8vLyBzbGlnaHRseSBpbXByb3ZlcyBwZXJmb3JtYW5jZS4KKyAgLy8vCisgIC8vLyBJdCB3b3VsZCBiZSB2ZXJ5IGVhc3kgdG8gaW50cm9kdWNlIHVuZXhwZWN0ZWQgc2lkZS1lZmZlY3RzIGFzIGEgcmVzdWx0IG9mCisgIC8vLyB0aGlzIGFsaWFzaW5nIGlmIGl0IHdlcmUgcGVybWl0dGVkIHRvIHJlcXVlc3QgZGlmZmVyZW50IGJ1dCBpbnRlcnNlY3RpbmcKKyAgLy8vIHNldHMgb2Ygb3Bjb2RlcyBidXQgdGhhdCBpcyBkaWZmaWN1bHQgdG8ga2VlcCB0cmFjayBvZi4gSXQgaXMgdGhlcmVmb3JlIGFuCisgIC8vLyBlcnJvciB0byByZXF1ZXN0IHRoZSBzYW1lIG9wY29kZSB0d2ljZSB1c2luZyB0aGlzIEFQSSwgdG8gcmVxdWVzdCBhbgorICAvLy8gb3Bjb2RlIHRoYXQgYWxyZWFkeSBoYXMgZGVmaW5pdGlvbnMsIG9yIHRvIHVzZSB0aGUgc2luZ2xlLW9wY29kZSBBUEkgb24gYW4KKyAgLy8vIG9wY29kZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gcmVxdWVzdGVkIGJ5IHRoaXMgQVBJLgorICBMZWdhbGl6ZVJ1bGVTZXQgJgorICBnZXRBY3Rpb25EZWZpbml0aW9uc0J1aWxkZXIoc3RkOjppbml0aWFsaXplcl9saXN0PHVuc2lnbmVkPiBPcGNvZGVzKTsKKyAgdm9pZCBhbGlhc0FjdGlvbkRlZmluaXRpb25zKHVuc2lnbmVkIE9wY29kZVRvLCB1bnNpZ25lZCBPcGNvZGVGcm9tKTsKKworICAvLy8gRGV0ZXJtaW5lIHdoYXQgYWN0aW9uIHNob3VsZCBiZSB0YWtlbiB0byBsZWdhbGl6ZSB0aGUgZGVzY3JpYmVkCisgIC8vLyBpbnN0cnVjdGlvbi4gUmVxdWlyZXMgY29tcHV0ZVRhYmxlcyB0byBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIG5leHQgbGVnYWxpemF0aW9uIHN0ZXAgdG8gcGVyZm9ybS4KKyAgTGVnYWxpemVBY3Rpb25TdGVwIGdldEFjdGlvbihjb25zdCBMZWdhbGl0eVF1ZXJ5ICZRdWVyeSkgY29uc3Q7CisKKyAgLy8vIERldGVybWluZSB3aGF0IGFjdGlvbiBzaG91bGQgYmUgdGFrZW4gdG8gbGVnYWxpemUgdGhlIGdpdmVuIGdlbmVyaWMKKyAgLy8vIGluc3RydWN0aW9uLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgZGVzY3JpcHRpb24gb2YgdGhlIG5leHQgbGVnYWxpemF0aW9uIHN0ZXAgdG8gcGVyZm9ybS4KKyAgTGVnYWxpemVBY3Rpb25TdGVwIGdldEFjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSkgY29uc3Q7CisKKyAgYm9vbCBpc0xlZ2FsKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSkgY29uc3Q7CisKKyAgdmlydHVhbCBib29sIGxlZ2FsaXplQ3VzdG9tKE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSVJCdWlsZGVyICZNSVJCdWlsZGVyKSBjb25zdDsKKworcHJpdmF0ZToKKyAgLy8vIERldGVybWluZSB3aGF0IGFjdGlvbiBzaG91bGQgYmUgdGFrZW4gdG8gbGVnYWxpemUgdGhlIGdpdmVuIGdlbmVyaWMKKyAgLy8vIGluc3RydWN0aW9uIG9wY29kZSwgdHlwZS1pbmRleCBhbmQgdHlwZS4gUmVxdWlyZXMgY29tcHV0ZVRhYmxlcyB0byBoYXZlCisgIC8vLyBiZWVuIGNhbGxlZC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHBhaXIgY29uc2lzdGluZyBvZiB0aGUga2luZCBvZiBsZWdhbGl6YXRpb24gdGhhdCBzaG91bGQgYmUKKyAgLy8vIHBlcmZvcm1lZCBhbmQgdGhlIGRlc3RpbmF0aW9uIHR5cGUuCisgIHN0ZDo6cGFpcjxMZWdhbGl6ZUFjdGlvbiwgTExUPgorICBnZXRBc3BlY3RBY3Rpb24oY29uc3QgSW5zdHJBc3BlY3QgJkFzcGVjdCkgY29uc3Q7CisKKyAgLy8vIFRoZSBTaXplQW5kQWN0aW9uc1ZlYyBpcyBhIHJlcHJlc2VudGF0aW9uIG1hcHBpbmcgYmV0d2VlbiBhbGwgbmF0dXJhbAorICAvLy8gbnVtYmVycyBhbmQgYW4gQWN0aW9uLiBUaGUgbmF0dXJhbCBudW1iZXIgcmVwcmVzZW50cyB0aGUgYml0IHNpemUgb2YKKyAgLy8vIHRoZSBJbnN0ckFzcGVjdC4gRm9yIGV4YW1wbGUsIGZvciBhIHRhcmdldCB3aXRoIG5hdGl2ZSBzdXBwb3J0IGZvciAzMi1iaXQKKyAgLy8vIGFuZCA2NC1iaXQgYWRkaXRpb25zLCB5b3UnZCBleHByZXNzIHRoYXQgYXM6CisgIC8vLyBzZXRTY2FsYXJBY3Rpb24oR19BREQsIDAsCisgIC8vLyAgICAgICAgICAge3sxLCBXaWRlblNjYWxhcn0sICAvLyBiaXQgc2l6ZXMgWyAxLCAzMVsKKyAgLy8vICAgICAgICAgICAgezMyLCBMZWdhbH0sICAgICAgIC8vIGJpdCBzaXplcyBbMzIsIDMzWworICAvLy8gICAgICAgICAgICB7MzMsIFdpZGVuU2NhbGFyfSwgLy8gYml0IHNpemVzIFszMywgNjRbCisgIC8vLyAgICAgICAgICAgIHs2NCwgTGVnYWx9LCAgICAgICAvLyBiaXQgc2l6ZXMgWzY0LCA2NVsKKyAgLy8vICAgICAgICAgICAgezY1LCBOYXJyb3dTY2FsYXJ9IC8vIGJpdCBzaXplcyBbNjUsICtpbmZbCisgIC8vLyAgICAgICAgICAgfSk7CisgIC8vLyBJdCBtYXkgYmUgdGhhdCBvbmx5IDY0LWJpdCBwb2ludGVycyBhcmUgc3VwcG9ydGVkIG9uIHlvdXIgdGFyZ2V0OgorICAvLy8gc2V0UG9pbnRlckFjdGlvbihHX0dFUCwgMCwgTExUOnBvaW50ZXIoMSksCisgIC8vLyAgICAgICAgICAge3sxLCBVbnN1cHBvcnRlZH0sICAvLyBiaXQgc2l6ZXMgWyAxLCA2M1sKKyAgLy8vICAgICAgICAgICAgezY0LCBMZWdhbH0sICAgICAgIC8vIGJpdCBzaXplcyBbNjQsIDY1WworICAvLy8gICAgICAgICAgICB7NjUsIFVuc3VwcG9ydGVkfSwgLy8gYml0IHNpemVzIFs2NSwgK2luZlsKKyAgLy8vICAgICAgICAgICB9KTsKKyAgdm9pZCBzZXRTY2FsYXJBY3Rpb24oY29uc3QgdW5zaWduZWQgT3Bjb2RlLCBjb25zdCB1bnNpZ25lZCBUeXBlSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpemVBbmRBY3Rpb25zVmVjICZTaXplQW5kQWN0aW9ucykgeworICAgIGNvbnN0IHVuc2lnbmVkIE9wY29kZUlkeCA9IE9wY29kZSAtIEZpcnN0T3A7CisgICAgU21hbGxWZWN0b3I8U2l6ZUFuZEFjdGlvbnNWZWMsIDE+ICZBY3Rpb25zID0gU2NhbGFyQWN0aW9uc1tPcGNvZGVJZHhdOworICAgIHNldEFjdGlvbnMoVHlwZUluZGV4LCBBY3Rpb25zLCBTaXplQW5kQWN0aW9ucyk7CisgIH0KKyAgdm9pZCBzZXRQb2ludGVyQWN0aW9uKGNvbnN0IHVuc2lnbmVkIE9wY29kZSwgY29uc3QgdW5zaWduZWQgVHlwZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgQWRkcmVzc1NwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2l6ZUFuZEFjdGlvbnNWZWMgJlNpemVBbmRBY3Rpb25zKSB7CisgICAgY29uc3QgdW5zaWduZWQgT3Bjb2RlSWR4ID0gT3Bjb2RlIC0gRmlyc3RPcDsKKyAgICBpZiAoQWRkclNwYWNlMlBvaW50ZXJBY3Rpb25zW09wY29kZUlkeF0uZmluZChBZGRyZXNzU3BhY2UpID09CisgICAgICAgIEFkZHJTcGFjZTJQb2ludGVyQWN0aW9uc1tPcGNvZGVJZHhdLmVuZCgpKQorICAgICAgQWRkclNwYWNlMlBvaW50ZXJBY3Rpb25zW09wY29kZUlkeF1bQWRkcmVzc1NwYWNlXSA9IHt7fX07CisgICAgU21hbGxWZWN0b3I8U2l6ZUFuZEFjdGlvbnNWZWMsIDE+ICZBY3Rpb25zID0KKyAgICAgICAgQWRkclNwYWNlMlBvaW50ZXJBY3Rpb25zW09wY29kZUlkeF0uZmluZChBZGRyZXNzU3BhY2UpLT5zZWNvbmQ7CisgICAgc2V0QWN0aW9ucyhUeXBlSW5kZXgsIEFjdGlvbnMsIFNpemVBbmRBY3Rpb25zKTsKKyAgfQorCisgIC8vLyBJZiBhbiBvcGVyYXRpb24gb24gYSBnaXZlbiB2ZWN0b3IgdHlwZSAoc2F5IDxNIHggaU4+KSBpc24ndCBleHBsaWNpdGx5CisgIC8vLyBzcGVjaWZpZWQsIHdlIHByb2NlZWQgaW4gMiBzdGFnZXMuIEZpcnN0IHdlIGxlZ2FsaXplIHRoZSB1bmRlcmx5aW5nIHNjYWxhcgorICAvLy8gKHNvIHRoYXQgdGhlcmUncyBhdCBsZWFzdCBvbmUgbGVnYWwgdmVjdG9yIHdpdGggdGhhdCBzY2FsYXIpLCB0aGVuIHdlCisgIC8vLyBhZGp1c3QgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgdmVjdG9yIHNvIHRoYXQgaXQgaXMgbGVnYWwuIFRoZQorICAvLy8gZGVzaXJlZCBhY3Rpb24gaW4gdGhlIGZpcnN0IHN0ZXAgaXMgY29udHJvbGxlZCBieSB0aGlzIGZ1bmN0aW9uLgorICB2b2lkIHNldFNjYWxhckluVmVjdG9yQWN0aW9uKGNvbnN0IHVuc2lnbmVkIE9wY29kZSwgY29uc3QgdW5zaWduZWQgVHlwZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNpemVBbmRBY3Rpb25zVmVjICZTaXplQW5kQWN0aW9ucykgeworICAgIHVuc2lnbmVkIE9wY29kZUlkeCA9IE9wY29kZSAtIEZpcnN0T3A7CisgICAgU21hbGxWZWN0b3I8U2l6ZUFuZEFjdGlvbnNWZWMsIDE+ICZBY3Rpb25zID0KKyAgICAgICAgU2NhbGFySW5WZWN0b3JBY3Rpb25zW09wY29kZUlkeF07CisgICAgc2V0QWN0aW9ucyhUeXBlSW5kZXgsIEFjdGlvbnMsIFNpemVBbmRBY3Rpb25zKTsKKyAgfQorCisgIC8vLyBTZWUgYWxzbyBzZXRTY2FsYXJJblZlY3RvckFjdGlvbi4KKyAgLy8vIFRoaXMgZnVuY3Rpb24gbGV0J3MgeW91IHNwZWNpZnkgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHZlY3RvciB0aGF0CisgIC8vLyBhcmUgbGVnYWwgZm9yIGEgbGVnYWwgZWxlbWVudCBzaXplLgorICB2b2lkIHNldFZlY3Rvck51bUVsZW1lbnRBY3Rpb24oY29uc3QgdW5zaWduZWQgT3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgVHlwZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgRWxlbWVudFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTaXplQW5kQWN0aW9uc1ZlYyAmU2l6ZUFuZEFjdGlvbnMpIHsKKyAgICBjb25zdCB1bnNpZ25lZCBPcGNvZGVJZHggPSBPcGNvZGUgLSBGaXJzdE9wOworICAgIGlmIChOdW1FbGVtZW50czJBY3Rpb25zW09wY29kZUlkeF0uZmluZChFbGVtZW50U2l6ZSkgPT0KKyAgICAgICAgTnVtRWxlbWVudHMyQWN0aW9uc1tPcGNvZGVJZHhdLmVuZCgpKQorICAgICAgTnVtRWxlbWVudHMyQWN0aW9uc1tPcGNvZGVJZHhdW0VsZW1lbnRTaXplXSA9IHt7fX07CisgICAgU21hbGxWZWN0b3I8U2l6ZUFuZEFjdGlvbnNWZWMsIDE+ICZBY3Rpb25zID0KKyAgICAgICAgTnVtRWxlbWVudHMyQWN0aW9uc1tPcGNvZGVJZHhdLmZpbmQoRWxlbWVudFNpemUpLT5zZWNvbmQ7CisgICAgc2V0QWN0aW9ucyhUeXBlSW5kZXgsIEFjdGlvbnMsIFNpemVBbmRBY3Rpb25zKTsKKyAgfQorCisgIC8vLyBBIHBhcnRpYWwgU2l6ZUFuZEFjdGlvbnNWZWMgcG90ZW50aWFsbHkgZG9lc24ndCBjb3ZlciBhbGwgYml0IHNpemVzLAorICAvLy8gaS5lLiBpdCdzIE9LIGlmIGl0IGRvZXNuJ3Qgc3RhcnQgZnJvbSBzaXplIDEuCisgIHN0YXRpYyB2b2lkIGNoZWNrUGFydGlhbFNpemVBbmRBY3Rpb25zVmVjdG9yKGNvbnN0IFNpemVBbmRBY3Rpb25zVmVjJiB2KSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIExlZ2FsaXplQWN0aW9uczsKKyNpZm5kZWYgTkRFQlVHCisgICAgLy8gVGhlIHNpemVzIHNob3VsZCBiZSBpbiBpbmNyZWFzaW5nIG9yZGVyCisgICAgaW50IHByZXZfc2l6ZSA9IC0xOworICAgIGZvcihhdXRvIFNpemVBbmRBY3Rpb246IHYpIHsKKyAgICAgIGFzc2VydChTaXplQW5kQWN0aW9uLmZpcnN0ID4gcHJldl9zaXplKTsKKyAgICAgIHByZXZfc2l6ZSA9IFNpemVBbmRBY3Rpb24uZmlyc3Q7CisgICAgfQorICAgIC8vIC0gZm9yIGV2ZXJ5IFdpZGVuIGFjdGlvbiwgdGhlcmUgc2hvdWxkIGJlIGEgbGFyZ2VyIGJpdHNpemUgdGhhdAorICAgIC8vICAgY2FuIGJlIGxlZ2FsaXplZCB0b3dhcmRzIChlLmcuIExlZ2FsLCBMb3dlciwgTGliY2FsbCBvciBDdXN0b20KKyAgICAvLyAgIGFjdGlvbikuCisgICAgLy8gLSBmb3IgZXZlcnkgTmFycm93IGFjdGlvbiwgdGhlcmUgc2hvdWxkIGJlIGEgc21hbGxlciBiaXRzaXplIHRoYXQKKyAgICAvLyAgIGNhbiBiZSBsZWdhbGl6ZWQgdG93YXJkcy4KKyAgICBpbnQgU21hbGxlc3ROYXJyb3dJZHggPSAtMTsKKyAgICBpbnQgTGFyZ2VzdFdpZGVuSWR4ID0gLTE7CisgICAgaW50IFNtYWxsZXN0TGVnYWxpemFibGVUb1NhbWVTaXplSWR4ID0gLTE7CisgICAgaW50IExhcmdlc3RMZWdhbGl6YWJsZVRvU2FtZVNpemVJZHggPSAtMTsKKyAgICBmb3Ioc2l6ZV90IGk9MDsgaTx2LnNpemUoKTsgKytpKSB7CisgICAgICBzd2l0Y2ggKHZbaV0uc2Vjb25kKSB7CisgICAgICAgIGNhc2UgRmV3ZXJFbGVtZW50czoKKyAgICAgICAgY2FzZSBOYXJyb3dTY2FsYXI6CisgICAgICAgICAgaWYgKFNtYWxsZXN0TmFycm93SWR4ID09IC0xKQorICAgICAgICAgICAgU21hbGxlc3ROYXJyb3dJZHggPSBpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFdpZGVuU2NhbGFyOgorICAgICAgICBjYXNlIE1vcmVFbGVtZW50czoKKyAgICAgICAgICBMYXJnZXN0V2lkZW5JZHggPSBpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIFVuc3VwcG9ydGVkOgorICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIGlmIChTbWFsbGVzdExlZ2FsaXphYmxlVG9TYW1lU2l6ZUlkeCA9PSAtMSkKKyAgICAgICAgICAgIFNtYWxsZXN0TGVnYWxpemFibGVUb1NhbWVTaXplSWR4ID0gaTsKKyAgICAgICAgICBMYXJnZXN0TGVnYWxpemFibGVUb1NhbWVTaXplSWR4ID0gaTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKFNtYWxsZXN0TmFycm93SWR4ICE9IC0xKSB7CisgICAgICBhc3NlcnQoU21hbGxlc3RMZWdhbGl6YWJsZVRvU2FtZVNpemVJZHggIT0gLTEpOworICAgICAgYXNzZXJ0KFNtYWxsZXN0TmFycm93SWR4ID4gU21hbGxlc3RMZWdhbGl6YWJsZVRvU2FtZVNpemVJZHgpOworICAgIH0KKyAgICBpZiAoTGFyZ2VzdFdpZGVuSWR4ICE9IC0xKQorICAgICAgYXNzZXJ0KExhcmdlc3RXaWRlbklkeCA8IExhcmdlc3RMZWdhbGl6YWJsZVRvU2FtZVNpemVJZHgpOworI2VuZGlmCisgIH0KKworICAvLy8gQSBmdWxsIFNpemVBbmRBY3Rpb25zVmVjIG11c3QgY292ZXIgYWxsIGJpdCBzaXplcywgaS5lLiBtdXN0IHN0YXJ0IHdpdGgKKyAgLy8vIGZyb20gc2l6ZSAxLgorICBzdGF0aWMgdm9pZCBjaGVja0Z1bGxTaXplQW5kQWN0aW9uc1ZlY3Rvcihjb25zdCBTaXplQW5kQWN0aW9uc1ZlYyYgdikgeworI2lmbmRlZiBOREVCVUcKKyAgICAvLyBEYXRhIHN0cnVjdHVyZSBpbnZhcmlhbnQ6IFRoZSBmaXJzdCBiaXQgc2l6ZSBtdXN0IGJlIHNpemUgMS4KKyAgICBhc3NlcnQodi5zaXplKCkgPj0gMSk7CisgICAgYXNzZXJ0KHZbMF0uZmlyc3QgPT0gMSk7CisgICAgY2hlY2tQYXJ0aWFsU2l6ZUFuZEFjdGlvbnNWZWN0b3Iodik7CisjZW5kaWYKKyAgfQorCisgIC8vLyBTZXRzIGFjdGlvbnMgZm9yIGFsbCBiaXQgc2l6ZXMgb24gYSBwYXJ0aWN1bGFyIGdlbmVyaWMgb3Bjb2RlLCB0eXBlCisgIC8vLyBpbmRleCBhbmQgc2NhbGFyIG9yIHBvaW50ZXIgdHlwZS4KKyAgdm9pZCBzZXRBY3Rpb25zKHVuc2lnbmVkIFR5cGVJbmRleCwKKyAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPFNpemVBbmRBY3Rpb25zVmVjLCAxPiAmQWN0aW9ucywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNpemVBbmRBY3Rpb25zVmVjICZTaXplQW5kQWN0aW9ucykgeworICAgIGNoZWNrRnVsbFNpemVBbmRBY3Rpb25zVmVjdG9yKFNpemVBbmRBY3Rpb25zKTsKKyAgICBpZiAoQWN0aW9ucy5zaXplKCkgPD0gVHlwZUluZGV4KQorICAgICAgQWN0aW9ucy5yZXNpemUoVHlwZUluZGV4ICsgMSk7CisgICAgQWN0aW9uc1tUeXBlSW5kZXhdID0gU2l6ZUFuZEFjdGlvbnM7CisgIH0KKworICBzdGF0aWMgU2l6ZUFuZEFjdGlvbiBmaW5kQWN0aW9uKGNvbnN0IFNpemVBbmRBY3Rpb25zVmVjICZWZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDMyX3QgU2l6ZSk7CisKKyAgLy8vIFJldHVybnMgdGhlIG5leHQgYWN0aW9uIG5lZWRlZCB0byBnZXQgdGhlIHNjYWxhciBvciBwb2ludGVyIHR5cGUgY2xvc2VyCisgIC8vLyB0byBiZWluZyBsZWdhbAorICAvLy8gRS5nLiBmaW5kTGVnYWxBY3Rpb24oe0dfUkVNLCAxM30pIHNob3VsZCByZXR1cm4KKyAgLy8vIChXaWRlblNjYWxhciwgMzIpLiBBZnRlciB0aGF0LCBmaW5kTGVnYWxBY3Rpb24oe0dfUkVNLCAzMn0pIHdpbGwKKyAgLy8vIHByb2JhYmx5IGJlIGNhbGxlZCwgd2hpY2ggc2hvdWxkIHJldHVybiAoTG93ZXIsIDMyKS4KKyAgLy8vIFRoaXMgaXMgYXNzdW1pbmcgdGhlIHNldFNjYWxhckFjdGlvbiBvbiBHX1JFTSB3YXMgc29tZXRoaW5nIGxpa2U6CisgIC8vLyBzZXRTY2FsYXJBY3Rpb24oR19SRU0sIDAsCisgIC8vLyAgICAgICAgICAge3sxLCBXaWRlblNjYWxhcn0sICAvLyBiaXQgc2l6ZXMgWyAxLCAzMVsKKyAgLy8vICAgICAgICAgICAgezMyLCBMb3dlcn0sICAgICAgIC8vIGJpdCBzaXplcyBbMzIsIDMzWworICAvLy8gICAgICAgICAgICB7MzMsIE5hcnJvd1NjYWxhcn0gLy8gYml0IHNpemVzIFs2NSwgK2luZlsKKyAgLy8vICAgICAgICAgICB9KTsKKyAgc3RkOjpwYWlyPExlZ2FsaXplQWN0aW9uLCBMTFQ+CisgIGZpbmRTY2FsYXJMZWdhbEFjdGlvbihjb25zdCBJbnN0ckFzcGVjdCAmQXNwZWN0KSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgbmV4dCBhY3Rpb24gbmVlZGVkIHRvd2FyZHMgbGVnYWxpemluZyB0aGUgdmVjdG9yIHR5cGUuCisgIHN0ZDo6cGFpcjxMZWdhbGl6ZUFjdGlvbiwgTExUPgorICBmaW5kVmVjdG9yTGVnYWxBY3Rpb24oY29uc3QgSW5zdHJBc3BlY3QgJkFzcGVjdCkgY29uc3Q7CisKKyAgc3RhdGljIGNvbnN0IGludCBGaXJzdE9wID0gVGFyZ2V0T3Bjb2RlOjpQUkVfSVNFTF9HRU5FUklDX09QQ09ERV9TVEFSVDsKKyAgc3RhdGljIGNvbnN0IGludCBMYXN0T3AgPSBUYXJnZXRPcGNvZGU6OlBSRV9JU0VMX0dFTkVSSUNfT1BDT0RFX0VORDsKKworICAvLyBEYXRhIHN0cnVjdHVyZXMgdXNlZCB0ZW1wb3JhcmlseSBkdXJpbmcgY29uc3RydWN0aW9uIG9mIGxlZ2FsaXR5IGRhdGE6CisgIHVzaW5nIFR5cGVNYXAgPSBEZW5zZU1hcDxMTFQsIExlZ2FsaXplQWN0aW9uPjsKKyAgU21hbGxWZWN0b3I8VHlwZU1hcCwgMT4gU3BlY2lmaWVkQWN0aW9uc1tMYXN0T3AgLSBGaXJzdE9wICsgMV07CisgIFNtYWxsVmVjdG9yPFNpemVDaGFuZ2VTdHJhdGVneSwgMT4KKyAgICAgIFNjYWxhclNpemVDaGFuZ2VTdHJhdGVnaWVzW0xhc3RPcCAtIEZpcnN0T3AgKyAxXTsKKyAgU21hbGxWZWN0b3I8U2l6ZUNoYW5nZVN0cmF0ZWd5LCAxPgorICAgICAgVmVjdG9yRWxlbWVudFNpemVDaGFuZ2VTdHJhdGVnaWVzW0xhc3RPcCAtIEZpcnN0T3AgKyAxXTsKKyAgYm9vbCBUYWJsZXNJbml0aWFsaXplZDsKKworICAvLyBEYXRhIHN0cnVjdHVyZXMgdXNlZCBieSBnZXRBY3Rpb246CisgIFNtYWxsVmVjdG9yPFNpemVBbmRBY3Rpb25zVmVjLCAxPiBTY2FsYXJBY3Rpb25zW0xhc3RPcCAtIEZpcnN0T3AgKyAxXTsKKyAgU21hbGxWZWN0b3I8U2l6ZUFuZEFjdGlvbnNWZWMsIDE+IFNjYWxhckluVmVjdG9yQWN0aW9uc1tMYXN0T3AgLSBGaXJzdE9wICsgMV07CisgIHN0ZDo6dW5vcmRlcmVkX21hcDx1aW50MTZfdCwgU21hbGxWZWN0b3I8U2l6ZUFuZEFjdGlvbnNWZWMsIDE+PgorICAgICAgQWRkclNwYWNlMlBvaW50ZXJBY3Rpb25zW0xhc3RPcCAtIEZpcnN0T3AgKyAxXTsKKyAgc3RkOjp1bm9yZGVyZWRfbWFwPHVpbnQxNl90LCBTbWFsbFZlY3RvcjxTaXplQW5kQWN0aW9uc1ZlYywgMT4+CisgICAgICBOdW1FbGVtZW50czJBY3Rpb25zW0xhc3RPcCAtIEZpcnN0T3AgKyAxXTsKKworICBMZWdhbGl6ZVJ1bGVTZXQgUnVsZXNGb3JPcGNvZGVbTGFzdE9wIC0gRmlyc3RPcCArIDFdOworfTsKKworI2lmbmRlZiBOREVCVUcKKy8vLyBDaGVja3MgdGhhdCBNSVIgaXMgZnVsbHkgbGVnYWwsIHJldHVybnMgYW4gaWxsZWdhbCBpbnN0cnVjdGlvbiBpZiBpdCdzIG5vdCwKKy8vLyBudWxscHRyIG90aGVyd2lzZQorY29uc3QgTWFjaGluZUluc3RyICptYWNoaW5lRnVuY3Rpb25Jc0lsbGVnYWwoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRik7CisjZW5kaWYKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0uCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9MRUdBTElaRVJJTkZPX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0xvY2FsaXplci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTG9jYWxpemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE0NmViOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL0xvY2FsaXplci5oCkBAIC0wLDAgKzEsNzggQEAKKy8vPT0gbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTG9jYWxpemVyLmggLSBMb2NhbGl6ZXIgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIGludGVyZmFjZSBvZiB0aGUgTG9jYWxpemVyIHBhc3MuCisvLy8gVGhpcyBwYXNzIG1vdmVzL2R1cGxpY2F0ZXMgY29uc3RhbnQtbGlrZSBpbnN0cnVjdGlvbnMgY2xvc2UgdG8gdGhlaXIgdXNlcy4KKy8vLyBJdHMgcHJpbWFyaWx5IGdvYWwgaXMgdG8gd29ya2Fyb3VuZCB0aGUgZGVmaWNpZW5jaWVzIG9mIHRoZSBmYXN0IHJlZ2lzdGVyCisvLy8gYWxsb2NhdG9yLgorLy8vIFdpdGggR2xvYmFsSVNlbCBjb25zdGFudHMgYXJlIGFsbCBtYXRlcmlhbGl6ZWQgaW4gdGhlIGVudHJ5IGJsb2NrIG9mCisvLy8gYSBmdW5jdGlvbi4gSG93ZXZlciwgdGhlIGZhc3QgYWxsb2NhdG9yIGNhbm5vdCByZW1hdGVyaWFsaXplIGNvbnN0YW50cyBhbmQKKy8vLyBoYXMgYSBsb3QgbW9yZSBsaXZlLXJhbmdlcyB0byBkZWFsIHdpdGggYW5kIHdpbGwgbW9zdCBsaWtlbHkgZW5kIHVwCisvLy8gc3BpbGxpbmcgYSBsb3QuCisvLy8gQnkgcHVzaGluZyB0aGUgY29uc3RhbnRzIGNsb3NlIHRvIHRoZWlyIHVzZSwgd2Ugb25seSBjcmVhdGUgc21hbGwKKy8vLyBsaXZlLXJhbmdlcy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfTE9DQUxJWkVSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfTE9DQUxJWkVSX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL01hY2hpbmVJUkJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KK2NsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CisKKy8vLyBUaGlzIHBhc3MgaW1wbGVtZW50cyB0aGUgbG9jYWxpemF0aW9uIG1lY2hhbmlzbSBkZXNjcmliZWQgYXQgdGhlCisvLy8gdG9wIG9mIHRoaXMgZmlsZS4gT25lIHNwZWNpZmljaXR5IG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyB0aGF0CisvLy8gaXQgd2lsbCBtYXRlcmlhbGl6ZSBvbmUgYW5kIG9ubHkgb25lIGluc3RhbmNlIG9mIGEgY29uc3RhbnQgcGVyCisvLy8gYmFzaWMgYmxvY2ssIHRodXMgZW5hYmxpbmcgcmV1c2Ugb2YgdGhhdCBjb25zdGFudCB3aXRoaW4gdGhhdCBibG9jay4KKy8vLyBNb3Jlb3ZlciwgaXQgb25seSBtYXRlcmlhbGl6ZXMgY29uc3RhbnRzIGluIGJsb2NrcyB3aGVyZSB0aGV5CisvLy8gYXJlIHVzZWQuIFBISSB1c2VzIGFyZSBjb25zaWRlcmVkIGhhcHBlbmluZyBhdCB0aGUgZW5kIG9mIHRoZQorLy8vIHJlbGF0ZWQgcHJlZGVjZXNzb3IuCitjbGFzcyBMb2NhbGl6ZXIgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCitwcml2YXRlOgorICAvLy8gTVJJIGNvbnRhaW5zIGFsbCB0aGUgcmVnaXN0ZXIgY2xhc3MvYmFuayBpbmZvcm1hdGlvbiB0aGF0IHRoaXMKKyAgLy8vIHBhc3MgdXNlcyBhbmQgdXBkYXRlcy4KKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJOworCisgIC8vLyBDaGVjayB3aGV0aGVyIG9yIG5vdCBccCBNSSBuZWVkcyB0byBiZSBtb3ZlZCBjbG9zZSB0byBpdHMgdXNlcy4KKyAgc3RhdGljIGJvb2wgc2hvdWxkTG9jYWxpemUoY29uc3QgTWFjaGluZUluc3RyICZNSSk7CisKKyAgLy8vIENoZWNrIGlmIFxwIE1PVXNlIGlzIHVzZWQgaW4gdGhlIHNhbWUgYmFzaWMgYmxvY2sgYXMgXHAgRGVmLgorICAvLy8gSWYgdGhlIHVzZSBpcyBpbiB0aGUgc2FtZSBibG9jaywgd2Ugc2F5IGl0IGlzIGxvY2FsLgorICAvLy8gV2hlbiB0aGUgdXNlIGlzIG5vdCBsb2NhbCwgXHAgSW5zZXJ0TUJCIHdpbGwgY29udGFpbiB0aGUgYmFzaWMKKyAgLy8vIGJsb2NrIHdoZW4gdG8gaW5zZXJ0IFxwIERlZiB0byBoYXZlIGEgbG9jYWwgdXNlLgorICBzdGF0aWMgYm9vbCBpc0xvY2FsVXNlKE1hY2hpbmVPcGVyYW5kICZNT1VzZSwgY29uc3QgTWFjaGluZUluc3RyICZEZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKiZJbnNlcnRNQkIpOworCisgIC8vLyBJbml0aWFsaXplIHRoZSBmaWVsZCBtZW1iZXJzIHVzaW5nIFxwIE1GLgorICB2b2lkIGluaXQoTWFjaGluZUZ1bmN0aW9uICZNRik7CisKK3B1YmxpYzoKKyAgTG9jYWxpemVyKCk7CisKKyAgU3RyaW5nUmVmIGdldFBhc3NOYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIkxvY2FsaXplciI7IH0KKworICBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzIGdldFJlcXVpcmVkUHJvcGVydGllcygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcygpCisgICAgICAgIC5zZXQoTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllczo6UHJvcGVydHk6OklzU1NBKQorICAgICAgICAuc2V0KE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXM6OlByb3BlcnR5OjpMZWdhbGl6ZWQpCisgICAgICAgIC5zZXQoTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllczo6UHJvcGVydHk6OlJlZ0JhbmtTZWxlY3RlZCk7CisgIH0KKworICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIG92ZXJyaWRlOworfTsKKworfSAvLyBFbmQgbmFtZXNwYWNlIGxsdm0uCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTUlQYXR0ZXJuTWF0Y2guaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL01JUGF0dGVybk1hdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk3ZjVlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL01JUGF0dGVybk1hdGNoLmgKQEAgLTAsMCArMSwzMjcgQEAKKy8vPT0gLS0tLS0gbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTUlQYXR0ZXJuTWF0Y2guaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0gPT0gLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gQ29udGFpbnMgbWF0Y2hlcnMgZm9yIG1hdGNoaW5nIFNTQSBNYWNoaW5lIEluc3RydWN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX0dNSVJfUEFUVEVSTk1BVENIX0gKKyNkZWZpbmUgTExWTV9HTUlSX1BBVFRFUk5NQVRDSF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEZsb2F0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9VdGlscy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBNSVBhdHRlcm5NYXRjaCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSZWcsIHR5cGVuYW1lIFBhdHRlcm4+Citib29sIG1pX21hdGNoKFJlZyBSLCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksIFBhdHRlcm4gJiZQKSB7CisgIHJldHVybiBQLm1hdGNoKE1SSSwgUik7Cit9CisKKy8vIFRPRE86IEV4dGVuZCBmb3IgTiB1c2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3ViUGF0dGVyblQ+IHN0cnVjdCBPbmVVc2VfbWF0Y2ggeworICBTdWJQYXR0ZXJuVCBTdWJQYXQ7CisgIE9uZVVzZV9tYXRjaChjb25zdCBTdWJQYXR0ZXJuVCAmU1ApIDogU3ViUGF0KFNQKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PgorICBib29sIG1hdGNoKGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwgdW5zaWduZWQgUmVnKSB7CisgICAgcmV0dXJuIE1SSS5oYXNPbmVVc2UoUmVnKSAmJiBTdWJQYXQubWF0Y2goTVJJLCBSZWcpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3ViUGF0PgoraW5saW5lIE9uZVVzZV9tYXRjaDxTdWJQYXQ+IG1fT25lVXNlKGNvbnN0IFN1YlBhdCAmU1ApIHsKKyAgcmV0dXJuIFNQOworfQorCitzdHJ1Y3QgQ29uc3RhbnRNYXRjaCB7CisgIGludDY0X3QgJkNSOworICBDb25zdGFudE1hdGNoKGludDY0X3QgJkMpIDogQ1IoQykge30KKyAgYm9vbCBtYXRjaChjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksIHVuc2lnbmVkIFJlZykgeworICAgIGlmIChhdXRvIE1heWJlQ3N0ID0gZ2V0Q29uc3RhbnRWUmVnVmFsKFJlZywgTVJJKSkgeworICAgICAgQ1IgPSAqTWF5YmVDc3Q7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCitpbmxpbmUgQ29uc3RhbnRNYXRjaCBtX0lDc3QoaW50NjRfdCAmQ3N0KSB7IHJldHVybiBDb25zdGFudE1hdGNoKENzdCk7IH0KKworLy8gVE9ETzogUmV3b3JrIHRoaXMgZm9yIGRpZmZlcmVudCBraW5kcyBvZiBNYWNoaW5lT3BlcmFuZC4KKy8vIEN1cnJlbnRseSBhc3N1bWVzIHRoZSBTcmMgZm9yIGEgbWF0Y2ggaXMgYSByZWdpc3Rlci4KKy8vIFdlIG1pZ2h0IHdhbnQgdG8gc3VwcG9ydCB0YWtpbmcgaW4gc29tZSBNYWNoaW5lT3BlcmFuZHMgYW5kIGNhbGwgZ2V0UmVnIG9uCisvLyB0aGF0LgorCitzdHJ1Y3Qgb3BlcmFuZF90eXBlX21hdGNoIHsKKyAgYm9vbCBtYXRjaChjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksIHVuc2lnbmVkIFJlZykgeyByZXR1cm4gdHJ1ZTsgfQorICBib29sIG1hdGNoKGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwgTWFjaGluZU9wZXJhbmQgKk1PKSB7CisgICAgcmV0dXJuIE1PLT5pc1JlZygpOworICB9Cit9OworCitpbmxpbmUgb3BlcmFuZF90eXBlX21hdGNoIG1fUmVnKCkgeyByZXR1cm4gb3BlcmFuZF90eXBlX21hdGNoKCk7IH0KKworLy8vIE1hdGNoaW5nIGNvbWJpbmF0b3JzLgordGVtcGxhdGUgPHR5cGVuYW1lLi4uIFByZWRzPiBzdHJ1Y3QgQW5kIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoU3JjPgorICBib29sIG1hdGNoKE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwgTWF0Y2hTcmMgJiZzcmMpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFByZWQsIHR5cGVuYW1lLi4uIFByZWRzPgorc3RydWN0IEFuZDxQcmVkLCBQcmVkcy4uLj4gOiBBbmQ8UHJlZHMuLi4+IHsKKyAgUHJlZCBQOworICBBbmQoUHJlZCAmJnAsIFByZWRzICYmLi4uIHByZWRzKQorICAgICAgOiBBbmQ8UHJlZHMuLi4+KHN0ZDo6Zm9yd2FyZDxQcmVkcz4ocHJlZHMpLi4uKSwgUChzdGQ6OmZvcndhcmQ8UHJlZD4ocCkpIHsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWF0Y2hTcmM+CisgIGJvb2wgbWF0Y2goTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJLCBNYXRjaFNyYyAmJnNyYykgeworICAgIHJldHVybiBQLm1hdGNoKE1SSSwgc3JjKSAmJiBBbmQ8UHJlZHMuLi4+OjptYXRjaChNUkksIHNyYyk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBQcmVkcz4gc3RydWN0IE9yIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hdGNoU3JjPgorICBib29sIG1hdGNoKE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwgTWF0Y2hTcmMgJiZzcmMpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBQcmVkLCB0eXBlbmFtZS4uLiBQcmVkcz4KK3N0cnVjdCBPcjxQcmVkLCBQcmVkcy4uLj4gOiBPcjxQcmVkcy4uLj4geworICBQcmVkIFA7CisgIE9yKFByZWQgJiZwLCBQcmVkcyAmJi4uLiBwcmVkcykKKyAgICAgIDogT3I8UHJlZHMuLi4+KHN0ZDo6Zm9yd2FyZDxQcmVkcz4ocHJlZHMpLi4uKSwgUChzdGQ6OmZvcndhcmQ8UHJlZD4ocCkpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRjaFNyYz4KKyAgYm9vbCBtYXRjaChNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksIE1hdGNoU3JjICYmc3JjKSB7CisgICAgcmV0dXJuIFAubWF0Y2goTVJJLCBzcmMpIHx8IE9yPFByZWRzLi4uPjo6bWF0Y2goTVJJLCBzcmMpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gUHJlZHM+IEFuZDxQcmVkcy4uLj4gbV9hbGxfb2YoUHJlZHMgJiYuLi4gcHJlZHMpIHsKKyAgcmV0dXJuIEFuZDxQcmVkcy4uLj4oc3RkOjpmb3J3YXJkPFByZWRzPihwcmVkcykuLi4pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gUHJlZHM+IE9yPFByZWRzLi4uPiBtX2FueV9vZihQcmVkcyAmJi4uLiBwcmVkcykgeworICByZXR1cm4gT3I8UHJlZHMuLi4+KHN0ZDo6Zm9yd2FyZDxQcmVkcz4ocHJlZHMpLi4uKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEJpbmRUeT4gc3RydWN0IGJpbmRfaGVscGVyIHsKKyAgc3RhdGljIGJvb2wgYmluZChjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksIEJpbmRUeSAmVlIsIEJpbmRUeSAmVikgeworICAgIFZSID0gVjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGJpbmRfaGVscGVyPE1hY2hpbmVJbnN0ciAqPiB7CisgIHN0YXRpYyBib29sIGJpbmQoY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJLCBNYWNoaW5lSW5zdHIgKiZNSSwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWcpIHsKKyAgICBNSSA9IE1SSS5nZXRWUmVnRGVmKFJlZyk7CisgICAgaWYgKE1JKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgYmluZF9oZWxwZXI8TExUPiB7CisgIHN0YXRpYyBib29sIGJpbmQoY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJLCBMTFQgJlR5LCB1bnNpZ25lZCBSZWcpIHsKKyAgICBUeSA9IE1SSS5nZXRUeXBlKFJlZyk7CisgICAgaWYgKFR5LmlzVmFsaWQoKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGJpbmRfaGVscGVyPGNvbnN0IENvbnN0YW50RlAgKj4geworICBzdGF0aWMgYm9vbCBiaW5kKGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwgY29uc3QgQ29uc3RhbnRGUCAqJkYsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnKSB7CisgICAgRiA9IGdldENvbnN0YW50RlBWUmVnVmFsKFJlZywgTVJJKTsKKyAgICBpZiAoRikKKyAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzPiBzdHJ1Y3QgYmluZF90eSB7CisgIENsYXNzICZWUjsKKworICBiaW5kX3R5KENsYXNzICZWKSA6IFZSKFYpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElUeT4gYm9vbCBtYXRjaChjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksIElUeSAmJlYpIHsKKyAgICByZXR1cm4gYmluZF9oZWxwZXI8Q2xhc3M+OjpiaW5kKE1SSSwgVlIsIFYpOworICB9Cit9OworCitpbmxpbmUgYmluZF90eTx1bnNpZ25lZD4gbV9SZWcodW5zaWduZWQgJlIpIHsgcmV0dXJuIFI7IH0KK2lubGluZSBiaW5kX3R5PE1hY2hpbmVJbnN0ciAqPiBtX01JbnN0cihNYWNoaW5lSW5zdHIgKiZNSSkgeyByZXR1cm4gTUk7IH0KK2lubGluZSBiaW5kX3R5PExMVD4gbV9UeXBlKExMVCAmVHkpIHsgcmV0dXJuIFR5OyB9CisKKy8vIEhlbHBlciBmb3IgbWF0Y2hpbmcgR19GQ09OU1RBTlQKK2lubGluZSBiaW5kX3R5PGNvbnN0IENvbnN0YW50RlAgKj4gbV9HRkNzdChjb25zdCBDb25zdGFudEZQIComQykgeyByZXR1cm4gQzsgfQorCisvLyBHZW5lcmFsIGhlbHBlciBmb3IgYWxsIHRoZSBiaW5hcnkgZ2VuZXJpYyBNSSBzdWNoIGFzIEdfQUREL0dfU1VCIGV0YwordGVtcGxhdGUgPHR5cGVuYW1lIExIU19QLCB0eXBlbmFtZSBSSFNfUCwgdW5zaWduZWQgT3Bjb2RlLAorICAgICAgICAgIGJvb2wgQ29tbXV0YWJsZSA9IGZhbHNlPgorc3RydWN0IEJpbmFyeU9wX21hdGNoIHsKKyAgTEhTX1AgTDsKKyAgUkhTX1AgUjsKKworICBCaW5hcnlPcF9tYXRjaChjb25zdCBMSFNfUCAmTEhTLCBjb25zdCBSSFNfUCAmUkhTKSA6IEwoTEhTKSwgUihSSFMpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PiBib29sIG1hdGNoKE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwgT3BUeSAmJk9wKSB7CisgICAgTWFjaGluZUluc3RyICpUbXBNSTsKKyAgICBpZiAobWlfbWF0Y2goT3AsIE1SSSwgbV9NSW5zdHIoVG1wTUkpKSkgeworICAgICAgaWYgKFRtcE1JLT5nZXRPcGNvZGUoKSA9PSBPcGNvZGUgJiYgVG1wTUktPmdldE51bU9wZXJhbmRzKCkgPT0gMykgeworICAgICAgICByZXR1cm4gKEwubWF0Y2goTVJJLCBUbXBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKSkgJiYKKyAgICAgICAgICAgICAgICBSLm1hdGNoKE1SSSwgVG1wTUktPmdldE9wZXJhbmQoMikuZ2V0UmVnKCkpKSB8fAorICAgICAgICAgICAgICAgKENvbW11dGFibGUgJiYgKFIubWF0Y2goTVJJLCBUbXBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMLm1hdGNoKE1SSSwgVG1wTUktPmdldE9wZXJhbmQoMikuZ2V0UmVnKCkpKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBUYXJnZXRPcGNvZGU6OkdfQURELCB0cnVlPgorbV9HQWRkKGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgVGFyZ2V0T3Bjb2RlOjpHX0FERCwgdHJ1ZT4oTCwgUik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgVGFyZ2V0T3Bjb2RlOjpHX1NVQj4gbV9HU3ViKGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIFRhcmdldE9wY29kZTo6R19TVUI+KEwsIFIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIFRhcmdldE9wY29kZTo6R19NVUwsIHRydWU+CittX0dNdWwoY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBUYXJnZXRPcGNvZGU6OkdfTVVMLCB0cnVlPihMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBUYXJnZXRPcGNvZGU6OkdfRkFERCwgdHJ1ZT4KK21fR0ZBZGQoY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBUYXJnZXRPcGNvZGU6OkdfRkFERCwgdHJ1ZT4oTCwgUik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgVGFyZ2V0T3Bjb2RlOjpHX0ZNVUwsIHRydWU+CittX0dGTXVsKGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgVGFyZ2V0T3Bjb2RlOjpHX0ZNVUwsIHRydWU+KEwsIFIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIFRhcmdldE9wY29kZTo6R19BTkQsIHRydWU+CittX0dBbmQoY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBUYXJnZXRPcGNvZGU6OkdfQU5ELCB0cnVlPihMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBUYXJnZXRPcGNvZGU6OkdfT1IsIHRydWU+IG1fR09yKGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBUYXJnZXRPcGNvZGU6OkdfT1IsIHRydWU+KEwsIFIpOworfQorCisvLyBIZWxwZXIgZm9yIHVuYXJ5IGluc3RydWN0aW9ucyAoR19bWlNBXUVYVC9HX1RSVU5DKSBldGMKK3RlbXBsYXRlIDx0eXBlbmFtZSBTcmNUeSwgdW5zaWduZWQgT3Bjb2RlPiBzdHJ1Y3QgVW5hcnlPcF9tYXRjaCB7CisgIFNyY1R5IEw7CisKKyAgVW5hcnlPcF9tYXRjaChjb25zdCBTcmNUeSAmTEhTKSA6IEwoTEhTKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4gYm9vbCBtYXRjaChNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksIE9wVHkgJiZPcCkgeworICAgIE1hY2hpbmVJbnN0ciAqVG1wTUk7CisgICAgaWYgKG1pX21hdGNoKE9wLCBNUkksIG1fTUluc3RyKFRtcE1JKSkpIHsKKyAgICAgIGlmIChUbXBNSS0+Z2V0T3Bjb2RlKCkgPT0gT3Bjb2RlICYmIFRtcE1JLT5nZXROdW1PcGVyYW5kcygpID09IDIpIHsKKyAgICAgICAgcmV0dXJuIEwubWF0Y2goTVJJLCBUbXBNSS0+Z2V0T3BlcmFuZCgxKS5nZXRSZWcoKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFNyY1R5PgoraW5saW5lIFVuYXJ5T3BfbWF0Y2g8U3JjVHksIFRhcmdldE9wY29kZTo6R19BTllFWFQ+CittX0dBbnlFeHQoY29uc3QgU3JjVHkgJlNyYykgeworICByZXR1cm4gVW5hcnlPcF9tYXRjaDxTcmNUeSwgVGFyZ2V0T3Bjb2RlOjpHX0FOWUVYVD4oU3JjKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNyY1R5PgoraW5saW5lIFVuYXJ5T3BfbWF0Y2g8U3JjVHksIFRhcmdldE9wY29kZTo6R19TRVhUPiBtX0dTRXh0KGNvbnN0IFNyY1R5ICZTcmMpIHsKKyAgcmV0dXJuIFVuYXJ5T3BfbWF0Y2g8U3JjVHksIFRhcmdldE9wY29kZTo6R19TRVhUPihTcmMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3JjVHk+CitpbmxpbmUgVW5hcnlPcF9tYXRjaDxTcmNUeSwgVGFyZ2V0T3Bjb2RlOjpHX1pFWFQ+IG1fR1pFeHQoY29uc3QgU3JjVHkgJlNyYykgeworICByZXR1cm4gVW5hcnlPcF9tYXRjaDxTcmNUeSwgVGFyZ2V0T3Bjb2RlOjpHX1pFWFQ+KFNyYyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTcmNUeT4KK2lubGluZSBVbmFyeU9wX21hdGNoPFNyY1R5LCBUYXJnZXRPcGNvZGU6OkdfRlBFWFQ+IG1fR0ZQRXh0KGNvbnN0IFNyY1R5ICZTcmMpIHsKKyAgcmV0dXJuIFVuYXJ5T3BfbWF0Y2g8U3JjVHksIFRhcmdldE9wY29kZTo6R19GUEVYVD4oU3JjKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFNyY1R5PgoraW5saW5lIFVuYXJ5T3BfbWF0Y2g8U3JjVHksIFRhcmdldE9wY29kZTo6R19UUlVOQz4gbV9HVHJ1bmMoY29uc3QgU3JjVHkgJlNyYykgeworICByZXR1cm4gVW5hcnlPcF9tYXRjaDxTcmNUeSwgVGFyZ2V0T3Bjb2RlOjpHX1RSVU5DPihTcmMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3JjVHk+CitpbmxpbmUgVW5hcnlPcF9tYXRjaDxTcmNUeSwgVGFyZ2V0T3Bjb2RlOjpHX0JJVENBU1Q+CittX0dCaXRjYXN0KGNvbnN0IFNyY1R5ICZTcmMpIHsKKyAgcmV0dXJuIFVuYXJ5T3BfbWF0Y2g8U3JjVHksIFRhcmdldE9wY29kZTo6R19CSVRDQVNUPihTcmMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3JjVHk+CitpbmxpbmUgVW5hcnlPcF9tYXRjaDxTcmNUeSwgVGFyZ2V0T3Bjb2RlOjpHX1BUUlRPSU5UPgorbV9HUHRyVG9JbnQoY29uc3QgU3JjVHkgJlNyYykgeworICByZXR1cm4gVW5hcnlPcF9tYXRjaDxTcmNUeSwgVGFyZ2V0T3Bjb2RlOjpHX1BUUlRPSU5UPihTcmMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3JjVHk+CitpbmxpbmUgVW5hcnlPcF9tYXRjaDxTcmNUeSwgVGFyZ2V0T3Bjb2RlOjpHX0lOVFRPUFRSPgorbV9HSW50VG9QdHIoY29uc3QgU3JjVHkgJlNyYykgeworICByZXR1cm4gVW5hcnlPcF9tYXRjaDxTcmNUeSwgVGFyZ2V0T3Bjb2RlOjpHX0lOVFRPUFRSPihTcmMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3JjVHk+CitpbmxpbmUgVW5hcnlPcF9tYXRjaDxTcmNUeSwgVGFyZ2V0T3Bjb2RlOjpHX0ZQVFJVTkM+CittX0dGUFRydW5jKGNvbnN0IFNyY1R5ICZTcmMpIHsKKyAgcmV0dXJuIFVuYXJ5T3BfbWF0Y2g8U3JjVHksIFRhcmdldE9wY29kZTo6R19GUFRSVU5DPihTcmMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3JjVHk+CitpbmxpbmUgVW5hcnlPcF9tYXRjaDxTcmNUeSwgVGFyZ2V0T3Bjb2RlOjpHX0ZBQlM+IG1fR0ZhYnMoY29uc3QgU3JjVHkgJlNyYykgeworICByZXR1cm4gVW5hcnlPcF9tYXRjaDxTcmNUeSwgVGFyZ2V0T3Bjb2RlOjpHX0ZBQlM+KFNyYyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTcmNUeT4KK2lubGluZSBVbmFyeU9wX21hdGNoPFNyY1R5LCBUYXJnZXRPcGNvZGU6OkNPUFk+IG1fQ29weShTcmNUeSAmJlNyYykgeworICByZXR1cm4gVW5hcnlPcF9tYXRjaDxTcmNUeSwgVGFyZ2V0T3Bjb2RlOjpDT1BZPihzdGQ6OmZvcndhcmQ8U3JjVHk+KFNyYykpOworfQorCisvLyBIZWxwZXIgZm9yIGNoZWNraW5nIGlmIGEgUmVnIGlzIG9mIHNwZWNpZmljIHR5cGUuCitzdHJ1Y3QgQ2hlY2tUeXBlIHsKKyAgTExUIFR5OworICBDaGVja1R5cGUoY29uc3QgTExUICZUeSkgOiBUeShUeSkge30KKworICBib29sIG1hdGNoKE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwgdW5zaWduZWQgUmVnKSB7CisgICAgcmV0dXJuIE1SSS5nZXRUeXBlKFJlZykgPT0gVHk7CisgIH0KK307CisKK2lubGluZSBDaGVja1R5cGUgbV9TcGVjaWZpY1R5cGUoTExUIFR5KSB7IHJldHVybiBUeTsgfQorCit9IC8vIG5hbWVzcGFjZSBHTUlQYXR0ZXJuTWF0Y2gKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9NYWNoaW5lSVJCdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9NYWNoaW5lSVJCdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY0ZTBhZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL01hY2hpbmVJUkJ1aWxkZXIuaApAQCAtMCwwICsxLDgwOCBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9NYWNoaW5lSVJCdWlsZGVyLmggLSBNSUJ1aWxkZXIgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgTWFjaGluZUlSQnVpbGRlciBjbGFzcy4KKy8vLyBUaGlzIGlzIGEgaGVscGVyIGNsYXNzIHRvIGJ1aWxkIE1hY2hpbmVJbnN0ci4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfTUFDSElORUlSQlVJTERFUl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX01BQ0hJTkVJUkJVSUxERVJfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvVHlwZXMuaCIKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9Mb3dMZXZlbFR5cGUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RlYnVnTG9jLmgiCisKKworbmFtZXNwYWNlIGxsdm0geworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucy4KK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIFRhcmdldEluc3RySW5mbzsKKworLy8vIEhlbHBlciBjbGFzcyB0byBidWlsZCBNYWNoaW5lSW5zdHIuCisvLy8gSXQga2VlcHMgaW50ZXJuYWxseSB0aGUgaW5zZXJ0aW9uIHBvaW50IGFuZCBkZWJ1ZyBsb2NhdGlvbiBmb3IgYWxsCisvLy8gdGhlIG5ldyBpbnN0cnVjdGlvbnMgd2Ugd2FudCB0byBjcmVhdGUuCisvLy8gVGhpcyBpbmZvcm1hdGlvbiBjYW4gYmUgbW9kaWZ5IHZpYSB0aGUgcmVsYXRlZCBzZXR0ZXJzLgorY2xhc3MgTWFjaGluZUlSQnVpbGRlciB7CisgIC8vLyBNYWNoaW5lRnVuY3Rpb24gdW5kZXIgY29uc3RydWN0aW9uLgorICBNYWNoaW5lRnVuY3Rpb24gKk1GOworICAvLy8gSW5mb3JtYXRpb24gdXNlZCB0byBhY2Nlc3MgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBvcGNvZGVzLgorICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSTsKKyAgLy8vIEluZm9ybWF0aW9uIHVzZWQgdG8gdmVyaWZ5IHR5cGVzIGFyZSBjb25zaXN0ZW50IGFuZCB0byBjcmVhdGUgdmlydHVhbCByZWdpc3RlcnMuCisgIE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSTsKKyAgLy8vIERlYnVnIGxvY2F0aW9uIHRvIGJlIHNldCB0byBhbnkgaW5zdHJ1Y3Rpb24gd2UgY3JlYXRlLgorICBEZWJ1Z0xvYyBETDsKKworICAvLy8gXG5hbWUgRmllbGRzIGRlc2NyaWJpbmcgdGhlIGluc2VydGlvbiBwb2ludC4KKyAgLy8vIEB7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkI7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJSTsKKyAgLy8vIEB9CisKKyAgc3RkOjpmdW5jdGlvbjx2b2lkKE1hY2hpbmVJbnN0ciAqKT4gSW5zZXJ0ZWRJbnN0cjsKKworICBjb25zdCBUYXJnZXRJbnN0ckluZm8gJmdldFRJSSgpIHsKKyAgICBhc3NlcnQoVElJICYmICJUYXJnZXRJbnN0ckluZm8gaXMgbm90IHNldCIpOworICAgIHJldHVybiAqVElJOworICB9CisKKyAgdm9pZCB2YWxpZGF0ZVRydW5jRXh0KHVuc2lnbmVkIERzdCwgdW5zaWduZWQgU3JjLCBib29sIElzRXh0ZW5kKTsKKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEJpbmFyeU9wKHVuc2lnbmVkIE9wY29kZSwgdW5zaWduZWQgUmVzLCB1bnNpZ25lZCBPcDAsIHVuc2lnbmVkIE9wMSk7CisKKyAgdW5zaWduZWQgZ2V0RGVzdEZyb21BcmcodW5zaWduZWQgUmVnKSB7IHJldHVybiBSZWc7IH0KKyAgdW5zaWduZWQgZ2V0RGVzdEZyb21BcmcoTExUIFR5KSB7CisgICAgcmV0dXJuIGdldE1GKCkuZ2V0UmVnSW5mbygpLmNyZWF0ZUdlbmVyaWNWaXJ0dWFsUmVnaXN0ZXIoVHkpOworICB9CisgIHVuc2lnbmVkIGdldERlc3RGcm9tQXJnKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSB7CisgICAgcmV0dXJuIGdldE1GKCkuZ2V0UmVnSW5mbygpLmNyZWF0ZVZpcnR1YWxSZWdpc3RlcihSQyk7CisgIH0KKworICB2b2lkIGFkZFVzZUZyb21BcmcoTWFjaGluZUluc3RyQnVpbGRlciAmTUlCLCB1bnNpZ25lZCBSZWcpIHsKKyAgICBNSUIuYWRkVXNlKFJlZyk7CisgIH0KKworICB2b2lkIGFkZFVzZUZyb21BcmcoTWFjaGluZUluc3RyQnVpbGRlciAmTUlCLCBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZVc2VNSUIpIHsKKyAgICBNSUIuYWRkVXNlKFVzZU1JQi0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKSk7CisgIH0KKworICB2b2lkIGFkZFVzZXNGcm9tQXJncyhNYWNoaW5lSW5zdHJCdWlsZGVyICZNSUIpIHsgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSBVc2VBcmdUeSwgdHlwZW5hbWUgLi4uIFVzZUFyZ3NUeT4KKyAgdm9pZCBhZGRVc2VzRnJvbUFyZ3MoTWFjaGluZUluc3RyQnVpbGRlciAmTUlCLCBVc2VBcmdUeSAmJkFyZzEsIFVzZUFyZ3NUeSAmJi4uLiBBcmdzKSB7CisgICAgYWRkVXNlRnJvbUFyZyhNSUIsIEFyZzEpOworICAgIGFkZFVzZXNGcm9tQXJncyhNSUIsIHN0ZDo6Zm9yd2FyZDxVc2VBcmdzVHk+KEFyZ3MpLi4uKTsKKyAgfQorICB1bnNpZ25lZCBnZXRSZWdGcm9tQXJnKHVuc2lnbmVkIFJlZykgeyByZXR1cm4gUmVnOyB9CisgIHVuc2lnbmVkIGdldFJlZ0Zyb21BcmcoY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmTUlCKSB7CisgICAgcmV0dXJuIE1JQi0+Z2V0T3BlcmFuZCgwKS5nZXRSZWcoKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBTb21lIGNvbnN0cnVjdG9ycyBmb3IgZWFzeSB1c2UuCisgIE1hY2hpbmVJUkJ1aWxkZXIoKSA9IGRlZmF1bHQ7CisgIE1hY2hpbmVJUkJ1aWxkZXIoTWFjaGluZUZ1bmN0aW9uICZNRikgeyBzZXRNRihNRik7IH0KKyAgTWFjaGluZUlSQnVpbGRlcihNYWNoaW5lSW5zdHIgJk1JKSA6IE1hY2hpbmVJUkJ1aWxkZXIoKk1JLmdldE1GKCkpIHsKKyAgICBzZXRJbnN0cihNSSk7CisgIH0KKworICAvLy8gR2V0dGVyIGZvciB0aGUgZnVuY3Rpb24gd2UgY3VycmVudGx5IGJ1aWxkLgorICBNYWNoaW5lRnVuY3Rpb24gJmdldE1GKCkgeworICAgIGFzc2VydChNRiAmJiAiTWFjaGluZUZ1bmN0aW9uIGlzIG5vdCBzZXQiKTsKKyAgICByZXR1cm4gKk1GOworICB9CisKKyAgLy8vIEdldHRlciBmb3IgdGhlIGJhc2ljIGJsb2NrIHdlIGN1cnJlbnRseSBidWlsZC4KKyAgTWFjaGluZUJhc2ljQmxvY2sgJmdldE1CQigpIHsKKyAgICBhc3NlcnQoTUJCICYmICJNYWNoaW5lQmFzaWNCbG9jayBpcyBub3Qgc2V0Iik7CisgICAgcmV0dXJuICpNQkI7CisgIH0KKworICAvLy8gQ3VycmVudCBpbnNlcnRpb24gcG9pbnQgZm9yIG5ldyBpbnN0cnVjdGlvbnMuCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBnZXRJbnNlcnRQdCgpIHsKKyAgICByZXR1cm4gSUk7CisgIH0KKworICAvLy8gU2V0IHRoZSBpbnNlcnRpb24gcG9pbnQgYmVmb3JlIHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uCisgIC8vLyBccHJlIE1CQiBtdXN0IGJlIGluIGdldE1GKCkuCisgIC8vLyBccHJlIElJIG11c3QgYmUgYSB2YWxpZCBpdGVyYXRvciBpbiBNQkIuCisgIHZvaWQgc2V0SW5zZXJ0UHQoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIElJKTsKKyAgLy8vIEB9CisKKyAgLy8vIFxuYW1lIFNldHRlcnMgZm9yIHRoZSBpbnNlcnRpb24gcG9pbnQuCisgIC8vLyBAeworICAvLy8gU2V0IHRoZSBNYWNoaW5lRnVuY3Rpb24gd2hlcmUgdG8gYnVpbGQgaW5zdHJ1Y3Rpb25zLgorICB2b2lkIHNldE1GKE1hY2hpbmVGdW5jdGlvbiAmKTsKKworICAvLy8gU2V0IHRoZSBpbnNlcnRpb24gcG9pbnQgdG8gdGhlICBlbmQgb2YgXHAgTUJCLgorICAvLy8gXHByZSBccCBNQkIgbXVzdCBiZSBjb250YWluZWQgYnkgZ2V0TUYoKS4KKyAgdm9pZCBzZXRNQkIoTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisKKyAgLy8vIFNldCB0aGUgaW5zZXJ0aW9uIHBvaW50IHRvIGJlZm9yZSBNSS4KKyAgLy8vIFxwcmUgTUkgbXVzdCBiZSBpbiBnZXRNRigpLgorICB2b2lkIHNldEluc3RyKE1hY2hpbmVJbnN0ciAmTUkpOworICAvLy8gQH0KKworICAvLy8gXG5hbWUgQ29udHJvbCB3aGVyZSBpbnN0cnVjdGlvbnMgd2UgY3JlYXRlIGFyZSByZWNvcmRlZCAodHlwaWNhbGx5IGZvcgorICAvLy8gdmlzaXRpbmcgYWdhaW4gbGF0ZXIgZHVyaW5nIGxlZ2FsaXphdGlvbikuCisgIC8vLyBAeworICB2b2lkIHJlY29yZEluc2VydGlvbnMoc3RkOjpmdW5jdGlvbjx2b2lkKE1hY2hpbmVJbnN0ciAqKT4gSW5zZXJ0ZWRJbnN0cik7CisgIHZvaWQgc3RvcFJlY29yZGluZ0luc2VydGlvbnMoKTsKKyAgLy8vIEB9CisKKyAgLy8vIFNldCB0aGUgZGVidWcgbG9jYXRpb24gdG8gXHAgREwgZm9yIGFsbCB0aGUgbmV4dCBidWlsZCBpbnN0cnVjdGlvbnMuCisgIHZvaWQgc2V0RGVidWdMb2MoY29uc3QgRGVidWdMb2MgJkRMKSB7IHRoaXMtPkRMID0gREw7IH0KKworICAvLy8gR2V0IHRoZSBjdXJyZW50IGluc3RydWN0aW9uJ3MgZGVidWcgbG9jYXRpb24uCisgIERlYnVnTG9jIGdldERlYnVnTG9jKCkgeyByZXR1cm4gREw7IH0KKworICAvLy8gQnVpbGQgYW5kIGluc2VydCA8ZW1wdHk+ID0gXHAgT3Bjb2RlIDxlbXB0eT4uCisgIC8vLyBUaGUgaW5zZXJ0aW9uIHBvaW50IGlzIHRoZSBvbmUgc2V0IGJ5IHRoZSBsYXN0IGNhbGwgb2YgZWl0aGVyCisgIC8vLyBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JLgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLworICAvLy8gXHJldHVybiBhIE1hY2hpbmVJbnN0ckJ1aWxkZXIgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkSW5zdHIodW5zaWduZWQgT3Bjb2RlKTsKKworICAvLy8gREFHIGxpa2UgR2VuZXJpYyBtZXRob2QgZm9yIGJ1aWxkaW5nIGFyYml0cmFyeSBpbnN0cnVjdGlvbnMgYXMgYWJvdmUuCisgIC8vLyBcT3BjIG9wY29kZSBmb3IgdGhlIGluc3RydWN0aW9uLgorICAvLy8gXFR5IEVpdGhlciBMTFQvVGFyZ2V0UmVnaXN0ZXJDbGFzcy91bnNpZ25lZCB0eXBlcyBmb3IgRHN0CisgIC8vLyBcQXJncyBWYXJpYWRpYyBsaXN0IG9mIHVzZXMgb2YgdHlwZXModW5zaWduZWQvTWFjaGluZUluc3RyQnVpbGRlcikKKyAgLy8vIFVzZXMgb2YgdHlwZSBNYWNoaW5lSW5zdHJCdWlsZGVyIHdpbGwgcGVyZm9ybQorICAvLy8gZ2V0T3BlcmFuZCgwKS5nZXRSZWcoKSB0byBjb252ZXJ0IHRvIHJlZ2lzdGVyLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHN0VHksIHR5cGVuYW1lLi4uIFVzZUFyZ3NUeT4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEluc3RyKHVuc2lnbmVkIE9wYywgRHN0VHkgJiZUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZUFyZ3NUeSAmJi4uLiBBcmdzKSB7CisgICAgYXV0byBNSUIgPSBidWlsZEluc3RyKE9wYykuYWRkRGVmKGdldERlc3RGcm9tQXJnKFR5KSk7CisgICAgYWRkVXNlc0Zyb21BcmdzKE1JQiwgc3RkOjpmb3J3YXJkPFVzZUFyZ3NUeT4oQXJncykuLi4pOworICAgIHJldHVybiBNSUI7CisgIH0KKworICAvLy8gQnVpbGQgYnV0IGRvbid0IGluc2VydCA8ZW1wdHk+ID0gXHAgT3Bjb2RlIDxlbXB0eT4uCisgIC8vLworICAvLy8gXHByZSBzZXRNRiwgc2V0QmFzaWNCbG9jayBvciBzZXRNSSAgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gYSBNYWNoaW5lSW5zdHJCdWlsZGVyIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEluc3RyTm9JbnNlcnQodW5zaWduZWQgT3Bjb2RlKTsKKworICAvLy8gSW5zZXJ0IGFuIGV4aXN0aW5nIGluc3RydWN0aW9uIGF0IHRoZSBpbnNlcnRpb24gcG9pbnQuCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgaW5zZXJ0SW5zdHIoTWFjaGluZUluc3RyQnVpbGRlciBNSUIpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IGEgREJHX1ZBTFVFIGluc3RydWN0aW9uIGV4cHJlc3NpbmcgdGhlIGZhY3QgdGhhdCB0aGUKKyAgLy8vIGFzc29jaWF0ZWQgXHAgVmFyaWFibGUgbGl2ZXMgaW4gXHAgUmVnIChzdWl0YWJseSBtb2RpZmllZCBieSBccCBFeHByKS4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZERpcmVjdERiZ1ZhbHVlKHVuc2lnbmVkIFJlZywgY29uc3QgTUROb2RlICpWYXJpYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ETm9kZSAqRXhwcik7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgYSBEQkdfVkFMVUUgaW5zdHJ1Y3Rpb24gZXhwcmVzc2luZyB0aGUgZmFjdCB0aGF0IHRoZQorICAvLy8gYXNzb2NpYXRlZCBccCBWYXJpYWJsZSBsaXZlcyBpbiBtZW1vcnkgYXQgXHAgUmVnIChzdWl0YWJseSBtb2RpZmllZCBieSBccAorICAvLy8gRXhwcikuCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRJbmRpcmVjdERiZ1ZhbHVlKHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUROb2RlICpWYXJpYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUROb2RlICpFeHByKTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBhIERCR19WQUxVRSBpbnN0cnVjdGlvbiBleHByZXNzaW5nIHRoZSBmYWN0IHRoYXQgdGhlCisgIC8vLyBhc3NvY2lhdGVkIFxwIFZhcmlhYmxlIGxpdmVzIGluIHRoZSBzdGFjayBzbG90IHNwZWNpZmllZCBieSBccCBGSQorICAvLy8gKHN1aXRhYmx5IG1vZGlmaWVkIGJ5IFxwIEV4cHIpLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkRklEYmdWYWx1ZShpbnQgRkksIGNvbnN0IE1ETm9kZSAqVmFyaWFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ETm9kZSAqRXhwcik7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgYSBEQkdfVkFMVUUgaW5zdHJ1Y3Rpb25zIHNwZWNpZnlpbmcgdGhhdCBccCBWYXJpYWJsZSBpcworICAvLy8gZ2l2ZW4gYnkgXHAgQyAoc3VpdGFibHkgbW9kaWZpZWQgYnkgXHAgRXhwcikuCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRDb25zdERiZ1ZhbHVlKGNvbnN0IENvbnN0YW50ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNRE5vZGUgKlZhcmlhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNRE5vZGUgKkV4cHIpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlcyA9IEdfRlJBTUVfSU5ERVggXHAgSWR4CisgIC8vLworICAvLy8gR19GUkFNRV9JTkRFWCBtYXRlcmlhbGl6ZXMgdGhlIGFkZHJlc3Mgb2YgYW4gYWxsb2NhIHZhbHVlIG9yIG90aGVyCisgIC8vLyBzdGFjay1iYXNlZCBvYmplY3QuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgUmVzIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBwb2ludGVyIHR5cGUuCisgIC8vLworICAvLy8gXHJldHVybiBhIE1hY2hpbmVJbnN0ckJ1aWxkZXIgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkRnJhbWVJbmRleCh1bnNpZ25lZCBSZXMsIGludCBJZHgpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlcyA9IEdfR0xPQkFMX1ZBTFVFIFxwIEdWCisgIC8vLworICAvLy8gR19HTE9CQUxfVkFMVUUgbWF0ZXJpYWxpemVzIHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQgZ2xvYmFsCisgIC8vLyBpbnRvIFxwIFJlcy4KKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBccCBSZXMgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHBvaW50ZXIgdHlwZQorICAvLy8gICAgICBpbiB0aGUgc2FtZSBhZGRyZXNzIHNwYWNlIGFzIFxwIEdWLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gYSBNYWNoaW5lSW5zdHJCdWlsZGVyIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEdsb2JhbFZhbHVlKHVuc2lnbmVkIFJlcywgY29uc3QgR2xvYmFsVmFsdWUgKkdWKTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBccCBSZXMgPSBHX0FERCBccCBPcDAsIFxwIE9wMQorICAvLy8KKyAgLy8vIEdfQUREIHNldHMgXHAgUmVzIHRvIHRoZSBzdW0gb2YgaW50ZWdlciBwYXJhbWV0ZXJzIFxwIE9wMCBhbmQgXHAgT3AxLAorICAvLy8gdHJ1bmNhdGVkIHRvIHRoZWlyIHdpZHRoLgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFxwIFJlcywgXHAgT3AwIGFuZCBccCBPcDEgbXVzdCBiZSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXJzCisgIC8vLyAgICAgIHdpdGggdGhlIHNhbWUgKHNjYWxhciBvciB2ZWN0b3IpIHR5cGUpLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gYSBNYWNoaW5lSW5zdHJCdWlsZGVyIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEFkZCh1bnNpZ25lZCBSZXMsIHVuc2lnbmVkIE9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcDEpOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHN0VHksIHR5cGVuYW1lLi4uIFVzZUFyZ3NUeT4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEFkZChEc3RUeSAmJlR5LCBVc2VBcmdzVHkgJiYuLi4gVXNlQXJncykgeworICAgIHVuc2lnbmVkIFJlcyA9IGdldERlc3RGcm9tQXJnKFR5KTsKKyAgICByZXR1cm4gYnVpbGRBZGQoUmVzLCAoZ2V0UmVnRnJvbUFyZyhVc2VBcmdzKSkuLi4pOworICB9CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgXHAgUmVzID0gR19TVUIgXHAgT3AwLCBccCBPcDEKKyAgLy8vCisgIC8vLyBHX1NVQiBzZXRzIFxwIFJlcyB0byB0aGUgc3VtIG9mIGludGVnZXIgcGFyYW1ldGVycyBccCBPcDAgYW5kIFxwIE9wMSwKKyAgLy8vIHRydW5jYXRlZCB0byB0aGVpciB3aWR0aC4KKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBccCBSZXMsIFxwIE9wMCBhbmQgXHAgT3AxIG11c3QgYmUgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVycworICAvLy8gICAgICB3aXRoIHRoZSBzYW1lIChzY2FsYXIgb3IgdmVjdG9yKSB0eXBlKS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEc3RUeSwgdHlwZW5hbWUuLi4gVXNlQXJnc1R5PgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkU3ViKERzdFR5ICYmVHksIFVzZUFyZ3NUeSAmJi4uLiBVc2VBcmdzKSB7CisgICAgdW5zaWduZWQgUmVzID0gZ2V0RGVzdEZyb21BcmcoVHkpOworICAgIHJldHVybiBidWlsZFN1YihSZXMsIChnZXRSZWdGcm9tQXJnKFVzZUFyZ3MpKS4uLik7CisgIH0KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZFN1Yih1bnNpZ25lZCBSZXMsIHVuc2lnbmVkIE9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcDEpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlcyA9IEdfTVVMIFxwIE9wMCwgXHAgT3AxCisgIC8vLworICAvLy8gR19NVUwgc2V0cyBccCBSZXMgdG8gdGhlIHN1bSBvZiBpbnRlZ2VyIHBhcmFtZXRlcnMgXHAgT3AwIGFuZCBccCBPcDEsCisgIC8vLyB0cnVuY2F0ZWQgdG8gdGhlaXIgd2lkdGguCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgUmVzLCBccCBPcDAgYW5kIFxwIE9wMSBtdXN0IGJlIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlcnMKKyAgLy8vICAgICAgd2l0aCB0aGUgc2FtZSAoc2NhbGFyIG9yIHZlY3RvcikgdHlwZSkuCisgIC8vLworICAvLy8gXHJldHVybiBhIE1hY2hpbmVJbnN0ckJ1aWxkZXIgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHN0VHksIHR5cGVuYW1lLi4uIFVzZUFyZ3NUeT4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZE11bChEc3RUeSAmJlR5LCBVc2VBcmdzVHkgJiYuLi4gVXNlQXJncykgeworICAgIHVuc2lnbmVkIFJlcyA9IGdldERlc3RGcm9tQXJnKFR5KTsKKyAgICByZXR1cm4gYnVpbGRNdWwoUmVzLCAoZ2V0UmVnRnJvbUFyZyhVc2VBcmdzKSkuLi4pOworICB9CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRNdWwodW5zaWduZWQgUmVzLCB1bnNpZ25lZCBPcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3AxKTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBccCBSZXMgPSBHX0dFUCBccCBPcDAsIFxwIE9wMQorICAvLy8KKyAgLy8vIEdfR0VQIGFkZHMgXHAgT3AxIGJ5dGVzIHRvIHRoZSBwb2ludGVyIHNwZWNpZmllZCBieSBccCBPcDAsCisgIC8vLyBzdG9yaW5nIHRoZSByZXN1bHRpbmcgcG9pbnRlciBpbiBccCBSZXMuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgUmVzIGFuZCBccCBPcDAgbXVzdCBiZSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXJzIHdpdGggcG9pbnRlcgorICAvLy8gICAgICB0eXBlLgorICAvLy8gXHByZSBccCBPcDEgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciB0eXBlLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gYSBNYWNoaW5lSW5zdHJCdWlsZGVyIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEdFUCh1bnNpZ25lZCBSZXMsIHVuc2lnbmVkIE9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcDEpOworCisgIC8vLyBNYXRlcmlhbGl6ZSBhbmQgaW5zZXJ0IFxwIFJlcyA9IEdfR0VQIFxwIE9wMCwgKEdfQ09OU1RBTlQgXHAgVmFsdWUpCisgIC8vLworICAvLy8gR19HRVAgYWRkcyBccCBWYWx1ZSBieXRlcyB0byB0aGUgcG9pbnRlciBzcGVjaWZpZWQgYnkgXHAgT3AwLAorICAvLy8gc3RvcmluZyB0aGUgcmVzdWx0aW5nIHBvaW50ZXIgaW4gXHAgUmVzLiBJZiBccCBWYWx1ZSBpcyB6ZXJvIHRoZW4gbm8KKyAgLy8vIEdfR0VQIG9yIEdfQ09OU1RBTlQgd2lsbCBiZSBjcmVhdGVkIGFuZCBccHJlIE9wMCB3aWxsIGJlIGFzc2lnbmVkIHRvCisgIC8vLyBccCBSZXMuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgT3AwIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBwb2ludGVyIHR5cGUuCisgIC8vLyBccHJlIFxwIFZhbHVlVHkgbXVzdCBiZSBhIHNjYWxhciB0eXBlLgorICAvLy8gXHByZSBccCBSZXMgbXVzdCBiZSAwLiBUaGlzIGlzIHRvIGRldGVjdCBjb25mdXNpb24gYmV0d2VlbgorICAvLy8gICAgICBtYXRlcmlhbGl6ZUdFUCgpIGFuZCBidWlsZEdFUCgpLgorICAvLy8gXHBvc3QgXHAgUmVzIHdpbGwgZWl0aGVyIGJlIGEgbmV3IGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciBvZiB0aGUgc2FtZQorICAvLy8gICAgICAgdHlwZSBhcyBccCBPcDAgb3IgXHAgT3AwIGl0c2VsZi4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE9wdGlvbmFsPE1hY2hpbmVJbnN0ckJ1aWxkZXI+IG1hdGVyaWFsaXplR0VQKHVuc2lnbmVkICZSZXMsIHVuc2lnbmVkIE9wMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTExUICZWYWx1ZVR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBWYWx1ZSk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgXHAgUmVzID0gR19QVFJfTUFTSyBccCBPcDAsIFxwIE51bUJpdHMKKyAgLy8vCisgIC8vLyBHX1BUUl9NQVNLIGNsZWFycyB0aGUgbG93IGJpdHMgb2YgYSBwb2ludGVyIG9wZXJhbmQgd2l0aG91dCBkZXN0cm95aW5nIGl0cworICAvLy8gcG9pbnRlciBwcm9wZXJ0aWVzLiBUaGlzIGhhcyB0aGUgZWZmZWN0IG9mIHJvdW5kaW5nIHRoZSBhZGRyZXNzICpkb3duKiB0bworICAvLy8gYSBzcGVjaWZpZWQgYWxpZ25tZW50IGluIGJpdHMuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgUmVzIGFuZCBccCBPcDAgbXVzdCBiZSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXJzIHdpdGggcG9pbnRlcgorICAvLy8gICAgICB0eXBlLgorICAvLy8gXHByZSBccCBOdW1CaXRzIG11c3QgYmUgYW4gaW50ZWdlciByZXByZXNlbnRpbmcgdGhlIG51bWJlciBvZiBsb3cgYml0cyB0bworICAvLy8gICAgICBiZSBjbGVhcmVkIGluIFxwIE9wMC4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRQdHJNYXNrKHVuc2lnbmVkIFJlcywgdW5zaWduZWQgT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBOdW1CaXRzKTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBccCBSZXMsIFxwIENhcnJ5T3V0ID0gR19VQURERSBccCBPcDAsCisgIC8vLyBccCBPcDEsIFxwIENhcnJ5SW4KKyAgLy8vCisgIC8vLyBHX1VBRERFIHNldHMgXHAgUmVzIHRvIFxwIE9wMCArIFxwIE9wMSArIFxwIENhcnJ5SW4gKHRydW5jYXRlZCB0byB0aGUgYml0CisgIC8vLyB3aWR0aCkgYW5kIHNldHMgXHAgQ2FycnlPdXQgdG8gMSBpZiB0aGUgcmVzdWx0IG92ZXJmbG93ZWQgaW4gdW5zaWduZWQKKyAgLy8vIGFyaXRobWV0aWMuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgUmVzLCBccCBPcDAgYW5kIFxwIE9wMSBtdXN0IGJlIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlcnMKKyAgLy8vICAgICAgd2l0aCB0aGUgc2FtZSBzY2FsYXIgdHlwZS4KKyAgLy8vIFxwcmUgXHAgQ2FycnlPdXQgYW5kIFxwIENhcnJ5SW4gbXVzdCBiZSBnZW5lcmljIHZpcnR1YWwKKyAgLy8vICAgICAgcmVnaXN0ZXJzIHdpdGggdGhlIHNhbWUgc2NhbGFyIHR5cGUgKHR5cGljYWxseSBzMSkKKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkVUFkZGUodW5zaWduZWQgUmVzLCB1bnNpZ25lZCBDYXJyeU91dCwgdW5zaWduZWQgT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3AxLCB1bnNpZ25lZCBDYXJyeUluKTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBccCBSZXMgPSBHX0FORCBccCBPcDAsIFxwIE9wMQorICAvLy8KKyAgLy8vIEdfQU5EIHNldHMgXHAgUmVzIHRvIHRoZSBiaXR3aXNlIGFuZCBvZiBpbnRlZ2VyIHBhcmFtZXRlcnMgXHAgT3AwIGFuZCBccAorICAvLy8gT3AxLgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFxwIFJlcywgXHAgT3AwIGFuZCBccCBPcDEgbXVzdCBiZSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXJzCisgIC8vLyAgICAgIHdpdGggdGhlIHNhbWUgKHNjYWxhciBvciB2ZWN0b3IpIHR5cGUpLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gYSBNYWNoaW5lSW5zdHJCdWlsZGVyIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERzdFR5LCB0eXBlbmFtZS4uLiBVc2VBcmdzVHk+CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRBbmQoRHN0VHkgJiZEc3QsIFVzZUFyZ3NUeSAmJi4uLiBVc2VBcmdzKSB7CisgICAgcmV0dXJuIGJ1aWxkQW5kKGdldERlc3RGcm9tQXJnKERzdCksIGdldFJlZ0Zyb21BcmcoVXNlQXJncykuLi4pOworICB9CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRBbmQodW5zaWduZWQgUmVzLCB1bnNpZ25lZCBPcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3AxKTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBccCBSZXMgPSBHX09SIFxwIE9wMCwgXHAgT3AxCisgIC8vLworICAvLy8gR19PUiBzZXRzIFxwIFJlcyB0byB0aGUgYml0d2lzZSBvciBvZiBpbnRlZ2VyIHBhcmFtZXRlcnMgXHAgT3AwIGFuZCBccAorICAvLy8gT3AxLgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFxwIFJlcywgXHAgT3AwIGFuZCBccCBPcDEgbXVzdCBiZSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXJzCisgIC8vLyAgICAgIHdpdGggdGhlIHNhbWUgKHNjYWxhciBvciB2ZWN0b3IpIHR5cGUpLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gYSBNYWNoaW5lSW5zdHJCdWlsZGVyIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERzdFR5LCB0eXBlbmFtZS4uLiBVc2VBcmdzVHk+CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRPcihEc3RUeSAmJkRzdCwgVXNlQXJnc1R5ICYmLi4uIFVzZUFyZ3MpIHsKKyAgICByZXR1cm4gYnVpbGRPcihnZXREZXN0RnJvbUFyZyhEc3QpLCBnZXRSZWdGcm9tQXJnKFVzZUFyZ3MpLi4uKTsKKyAgfQorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkT3IodW5zaWduZWQgUmVzLCB1bnNpZ25lZCBPcDAsIHVuc2lnbmVkIE9wMSk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgXHAgUmVzID0gR19BTllFWFQgXHAgT3AwCisgIC8vLworICAvLy8gR19BTllFWFQgcHJvZHVjZXMgYSByZWdpc3RlciBvZiB0aGUgc3BlY2lmaWVkIHdpZHRoLCB3aXRoIGJpdHMgMCB0bworICAvLy8gc2l6ZW9mKFxwIFR5KSAqIDggc2V0IHRvIFxwIE9wLiBUaGUgcmVtYWluaW5nIGJpdHMgYXJlIHVuc3BlY2lmaWVkCisgIC8vLyAoaS5lLiB0aGlzIGlzIG5laXRoZXIgemVybyBub3Igc2lnbi1leHRlbnNpb24pLiBGb3IgYSB2ZWN0b3IgcmVnaXN0ZXIsCisgIC8vLyBlYWNoIGVsZW1lbnQgaXMgZXh0ZW5kZWQgaW5kaXZpZHVhbGx5LgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFxwIFJlcyBtdXN0IGJlIGEgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyIHdpdGggc2NhbGFyIG9yIHZlY3RvciB0eXBlLgorICAvLy8gXHByZSBccCBPcCBtdXN0IGJlIGEgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyIHdpdGggc2NhbGFyIG9yIHZlY3RvciB0eXBlLgorICAvLy8gXHByZSBccCBPcCBtdXN0IGJlIHNtYWxsZXIgdGhhbiBccCBSZXMKKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRBbnlFeHQodW5zaWduZWQgUmVzLCB1bnNpZ25lZCBPcCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEc3RUeXBlLCB0eXBlbmFtZSBBcmdUeXBlPgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkQW55RXh0KERzdFR5cGUgJiZSZXMsIEFyZ1R5cGUgJiZBcmcpIHsKKyAgICByZXR1cm4gYnVpbGRBbnlFeHQoZ2V0RGVzdEZyb21BcmcoUmVzKSwgZ2V0UmVnRnJvbUFyZyhBcmcpKTsKKyAgfQorCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlcyA9IEdfU0VYVCBccCBPcAorICAvLy8KKyAgLy8vIEdfU0VYVCBwcm9kdWNlcyBhIHJlZ2lzdGVyIG9mIHRoZSBzcGVjaWZpZWQgd2lkdGgsIHdpdGggYml0cyAwIHRvCisgIC8vLyBzaXplb2YoXHAgVHkpICogOCBzZXQgdG8gXHAgT3AuIFRoZSByZW1haW5pbmcgYml0cyBhcmUgZHVwbGljYXRlZCBmcm9tIHRoZQorICAvLy8gaGlnaCBiaXQgb2YgXHAgT3AgKGkuZS4gMnMtY29tcGxlbWVudCBzaWduIGV4dGVuZGVkKS4KKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBccCBSZXMgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciBvciB2ZWN0b3IgdHlwZS4KKyAgLy8vIFxwcmUgXHAgT3AgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciBvciB2ZWN0b3IgdHlwZS4KKyAgLy8vIFxwcmUgXHAgT3AgbXVzdCBiZSBzbWFsbGVyIHRoYW4gXHAgUmVzCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERzdFR5cGUsIHR5cGVuYW1lIEFyZ1R5cGU+CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRTRXh0KERzdFR5cGUgJiZSZXMsIEFyZ1R5cGUgJiZBcmcpIHsKKyAgICByZXR1cm4gYnVpbGRTRXh0KGdldERlc3RGcm9tQXJnKFJlcyksIGdldFJlZ0Zyb21BcmcoQXJnKSk7CisgIH0KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZFNFeHQodW5zaWduZWQgUmVzLCB1bnNpZ25lZCBPcCk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgXHAgUmVzID0gR19aRVhUIFxwIE9wCisgIC8vLworICAvLy8gR19aRVhUIHByb2R1Y2VzIGEgcmVnaXN0ZXIgb2YgdGhlIHNwZWNpZmllZCB3aWR0aCwgd2l0aCBiaXRzIDAgdG8KKyAgLy8vIHNpemVvZihccCBUeSkgKiA4IHNldCB0byBccCBPcC4gVGhlIHJlbWFpbmluZyBiaXRzIGFyZSAwLiBGb3IgYSB2ZWN0b3IKKyAgLy8vIHJlZ2lzdGVyLCBlYWNoIGVsZW1lbnQgaXMgZXh0ZW5kZWQgaW5kaXZpZHVhbGx5LgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFxwIFJlcyBtdXN0IGJlIGEgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyIHdpdGggc2NhbGFyIG9yIHZlY3RvciB0eXBlLgorICAvLy8gXHByZSBccCBPcCBtdXN0IGJlIGEgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyIHdpdGggc2NhbGFyIG9yIHZlY3RvciB0eXBlLgorICAvLy8gXHByZSBccCBPcCBtdXN0IGJlIHNtYWxsZXIgdGhhbiBccCBSZXMKKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHN0VHlwZSwgdHlwZW5hbWUgQXJnVHlwZT4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZFpFeHQoRHN0VHlwZSAmJlJlcywgQXJnVHlwZSAmJkFyZykgeworICAgIHJldHVybiBidWlsZFpFeHQoZ2V0RGVzdEZyb21BcmcoUmVzKSwgZ2V0UmVnRnJvbUFyZyhBcmcpKTsKKyAgfQorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkWkV4dCh1bnNpZ25lZCBSZXMsIHVuc2lnbmVkIE9wKTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBccCBSZXMgPSBHX1NFWFQgXHAgT3AsIFxwIFJlcyA9IEdfVFJVTkMgXHAgT3AsIG9yCisgIC8vLyBccCBSZXMgPSBDT1BZIFxwIE9wIGRlcGVuZGluZyBvbiB0aGUgZGlmZmVyaW5nIHNpemVzIG9mIFxwIFJlcyBhbmQgXHAgT3AuCisgIC8vLyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBccCBSZXMgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciBvciB2ZWN0b3IgdHlwZS4KKyAgLy8vIFxwcmUgXHAgT3AgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciBvciB2ZWN0b3IgdHlwZS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHN0VHksIHR5cGVuYW1lIFVzZUFyZ1R5PgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkU0V4dE9yVHJ1bmMoRHN0VHkgJiZEc3QsIFVzZUFyZ1R5ICYmVXNlKSB7CisgICAgcmV0dXJuIGJ1aWxkU0V4dE9yVHJ1bmMoZ2V0RGVzdEZyb21BcmcoRHN0KSwgZ2V0UmVnRnJvbUFyZyhVc2UpKTsKKyAgfQorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkU0V4dE9yVHJ1bmModW5zaWduZWQgUmVzLCB1bnNpZ25lZCBPcCk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgXHAgUmVzID0gR19aRVhUIFxwIE9wLCBccCBSZXMgPSBHX1RSVU5DIFxwIE9wLCBvcgorICAvLy8gXHAgUmVzID0gQ09QWSBccCBPcCBkZXBlbmRpbmcgb24gdGhlIGRpZmZlcmluZyBzaXplcyBvZiBccCBSZXMgYW5kIFxwIE9wLgorICAvLy8gIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgUmVzIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBzY2FsYXIgb3IgdmVjdG9yIHR5cGUuCisgIC8vLyBccHJlIFxwIE9wIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBzY2FsYXIgb3IgdmVjdG9yIHR5cGUuCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERzdFR5LCB0eXBlbmFtZSBVc2VBcmdUeT4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZFpFeHRPclRydW5jKERzdFR5ICYmRHN0LCBVc2VBcmdUeSAmJlVzZSkgeworICAgIHJldHVybiBidWlsZFpFeHRPclRydW5jKGdldERlc3RGcm9tQXJnKERzdCksIGdldFJlZ0Zyb21BcmcoVXNlKSk7CisgIH0KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZFpFeHRPclRydW5jKHVuc2lnbmVkIFJlcywgdW5zaWduZWQgT3ApOworCisgIC8vIEJ1aWxkIGFuZCBpbnNlcnQgXHAgUmVzID0gR19BTllFWFQgXHAgT3AsIFxwIFJlcyA9IEdfVFJVTkMgXHAgT3AsIG9yCisgIC8vLyBccCBSZXMgPSBDT1BZIFxwIE9wIGRlcGVuZGluZyBvbiB0aGUgZGlmZmVyaW5nIHNpemVzIG9mIFxwIFJlcyBhbmQgXHAgT3AuCisgIC8vLyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBccCBSZXMgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciBvciB2ZWN0b3IgdHlwZS4KKyAgLy8vIFxwcmUgXHAgT3AgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciBvciB2ZWN0b3IgdHlwZS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHN0VHksIHR5cGVuYW1lIFVzZUFyZ1R5PgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkQW55RXh0T3JUcnVuYyhEc3RUeSAmJkRzdCwgVXNlQXJnVHkgJiZVc2UpIHsKKyAgICByZXR1cm4gYnVpbGRBbnlFeHRPclRydW5jKGdldERlc3RGcm9tQXJnKERzdCksIGdldFJlZ0Zyb21BcmcoVXNlKSk7CisgIH0KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEFueUV4dE9yVHJ1bmModW5zaWduZWQgUmVzLCB1bnNpZ25lZCBPcCk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgXHAgUmVzID0gXHAgRXh0T3BjLCBccCBSZXMgPSBHX1RSVU5DIFxwCisgIC8vLyBPcCwgb3IgXHAgUmVzID0gQ09QWSBccCBPcCBkZXBlbmRpbmcgb24gdGhlIGRpZmZlcmluZyBzaXplcyBvZiBccCBSZXMgYW5kCisgIC8vLyBccCBPcC4KKyAgLy8vICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFxwIFJlcyBtdXN0IGJlIGEgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyIHdpdGggc2NhbGFyIG9yIHZlY3RvciB0eXBlLgorICAvLy8gXHByZSBccCBPcCBtdXN0IGJlIGEgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyIHdpdGggc2NhbGFyIG9yIHZlY3RvciB0eXBlLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRFeHRPclRydW5jKHVuc2lnbmVkIEV4dE9wYywgdW5zaWduZWQgUmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcCk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgYW4gYXBwcm9wcmlhdGUgY2FzdCBiZXR3ZWVuIHR3byByZWdpc3RlcnMgb2YgZXF1YWwgc2l6ZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIERzdFR5cGUsIHR5cGVuYW1lIEFyZ1R5cGU+CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRDYXN0KERzdFR5cGUgJiZSZXMsIEFyZ1R5cGUgJiZBcmcpIHsKKyAgICByZXR1cm4gYnVpbGRDYXN0KGdldERlc3RGcm9tQXJnKFJlcyksIGdldFJlZ0Zyb21BcmcoQXJnKSk7CisgIH0KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZENhc3QodW5zaWduZWQgRHN0LCB1bnNpZ25lZCBTcmMpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IEdfQlIgXHAgRGVzdAorICAvLy8KKyAgLy8vIEdfQlIgaXMgYW4gdW5jb25kaXRpb25hbCBicmFuY2ggdG8gXHAgRGVzdC4KKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gYSBNYWNoaW5lSW5zdHJCdWlsZGVyIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEJyKE1hY2hpbmVCYXNpY0Jsb2NrICZCQik7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgR19CUkNPTkQgXHAgVHN0LCBccCBEZXN0CisgIC8vLworICAvLy8gR19CUkNPTkQgaXMgYSBjb25kaXRpb25hbCBicmFuY2ggdG8gXHAgRGVzdC4KKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBccCBUc3QgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhcgorICAvLy8gICAgICB0eXBlLiBBdCB0aGUgYmVnaW5uaW5nIG9mIGxlZ2FsaXphdGlvbiwgdGhpcyB3aWxsIGJlIGEgc2luZ2xlCisgIC8vLyAgICAgIGJpdCAoczEpLiBUYXJnZXRzIHdpdGggaW50ZXJlc3RpbmcgZmxhZ3MgcmVnaXN0ZXJzIG1heSBjaGFuZ2UKKyAgLy8vICAgICAgdGhpcy4gRm9yIGEgd2lkZXIgdHlwZSwgd2hldGhlciB0aGUgYnJhbmNoIGlzIHRha2VuIG11c3Qgb25seQorICAvLy8gICAgICBkZXBlbmQgb24gYml0IDAgKGZvciBub3cpLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRCckNvbmQodW5zaWduZWQgVHN0LCBNYWNoaW5lQmFzaWNCbG9jayAmQkIpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IEdfQlJJTkRJUkVDVCBccCBUZ3QKKyAgLy8vCisgIC8vLyBHX0JSSU5ESVJFQ1QgaXMgYW4gaW5kaXJlY3QgYnJhbmNoIHRvIFxwIFRndC4KKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBccCBUZ3QgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHBvaW50ZXIgdHlwZS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRCckluZGlyZWN0KHVuc2lnbmVkIFRndCk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgXHAgUmVzID0gR19DT05TVEFOVCBccCBWYWwKKyAgLy8vCisgIC8vLyBHX0NPTlNUQU5UIGlzIGFuIGludGVnZXIgY29uc3RhbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNpemUgYW5kIHZhbHVlLiBccAorICAvLy8gVmFsIHdpbGwgYmUgZXh0ZW5kZWQgb3IgdHJ1bmNhdGVkIHRvIHRoZSBzaXplIG9mIFxwIFJlZy4KKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBccCBSZXMgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciBvciBwb2ludGVyCisgIC8vLyAgICAgIHR5cGUuCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZENvbnN0YW50KHVuc2lnbmVkIFJlcywgY29uc3QgQ29uc3RhbnRJbnQgJlZhbCk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgXHAgUmVzID0gR19DT05TVEFOVCBccCBWYWwKKyAgLy8vCisgIC8vLyBHX0NPTlNUQU5UIGlzIGFuIGludGVnZXIgY29uc3RhbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNpemUgYW5kIHZhbHVlLgorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFxwIFJlcyBtdXN0IGJlIGEgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyIHdpdGggc2NhbGFyIHR5cGUuCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZENvbnN0YW50KHVuc2lnbmVkIFJlcywgaW50NjRfdCBWYWwpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEc3RUeXBlPgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkQ29uc3RhbnQoRHN0VHlwZSAmJlJlcywgaW50NjRfdCBWYWwpIHsKKyAgICByZXR1cm4gYnVpbGRDb25zdGFudChnZXREZXN0RnJvbUFyZyhSZXMpLCBWYWwpOworICB9CisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlcyA9IEdfRkNPTlNUQU5UIFxwIFZhbAorICAvLy8KKyAgLy8vIEdfRkNPTlNUQU5UIGlzIGEgZmxvYXRpbmctcG9pbnQgY29uc3RhbnQgd2l0aCB0aGUgc3BlY2lmaWVkIHNpemUgYW5kCisgIC8vLyB2YWx1ZS4KKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBccCBSZXMgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciB0eXBlLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEc3RUeXBlPgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkRkNvbnN0YW50KERzdFR5cGUgJiZSZXMsIGNvbnN0IENvbnN0YW50RlAgJlZhbCkgeworICAgIHJldHVybiBidWlsZEZDb25zdGFudChnZXREZXN0RnJvbUFyZyhSZXMpLCBWYWwpOworICB9CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRGQ29uc3RhbnQodW5zaWduZWQgUmVzLCBjb25zdCBDb25zdGFudEZQICZWYWwpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEc3RUeXBlPgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkRkNvbnN0YW50KERzdFR5cGUgJiZSZXMsIGRvdWJsZSBWYWwpIHsKKyAgICByZXR1cm4gYnVpbGRGQ29uc3RhbnQoZ2V0RGVzdEZyb21BcmcoUmVzKSwgVmFsKTsKKyAgfQorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkRkNvbnN0YW50KHVuc2lnbmVkIFJlcywgZG91YmxlIFZhbCk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgXHAgUmVzID0gQ09QWSBPcAorICAvLy8KKyAgLy8vIFJlZ2lzdGVyLXRvLXJlZ2lzdGVyIENPUFkgc2V0cyBccCBSZXMgdG8gXHAgT3AuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRDb3B5KHVuc2lnbmVkIFJlcywgdW5zaWduZWQgT3ApOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHN0VHlwZSwgdHlwZW5hbWUgU3JjVHlwZT4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZENvcHkoRHN0VHlwZSAmJlJlcywgU3JjVHlwZSAmJlNyYykgeworICAgIHJldHVybiBidWlsZENvcHkoZ2V0RGVzdEZyb21BcmcoUmVzKSwgZ2V0UmVnRnJvbUFyZyhTcmMpKTsKKyAgfQorCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IGBSZXMgPSBHX0xPQUQgQWRkciwgTU1PYC4KKyAgLy8vCisgIC8vLyBMb2FkcyB0aGUgdmFsdWUgc3RvcmVkIGF0IFxwIEFkZHIuIFB1dHMgdGhlIHJlc3VsdCBpbiBccCBSZXMuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgUmVzIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIuCisgIC8vLyBccHJlIFxwIEFkZHIgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHBvaW50ZXIgdHlwZS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRMb2FkKHVuc2lnbmVkIFJlcywgdW5zaWduZWQgQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgJk1NTyk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgYEdfU1RPUkUgVmFsLCBBZGRyLCBNTU9gLgorICAvLy8KKyAgLy8vIFN0b3JlcyB0aGUgdmFsdWUgXHAgVmFsIHRvIFxwIEFkZHIuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgVmFsIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIuCisgIC8vLyBccHJlIFxwIEFkZHIgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHBvaW50ZXIgdHlwZS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRTdG9yZSh1bnNpZ25lZCBWYWwsIHVuc2lnbmVkIEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTWVtT3BlcmFuZCAmTU1PKTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBgUmVzMCwgLi4uID0gR19FWFRSQUNUIFNyYywgSWR4MGAuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgUmVzIGFuZCBccCBTcmMgbXVzdCBiZSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXJzLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gYSBNYWNoaW5lSW5zdHJCdWlsZGVyIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZEV4dHJhY3QodW5zaWduZWQgUmVzLCB1bnNpZ25lZCBTcmMsIHVpbnQ2NF90IEluZGV4KTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBccCBSZXMgPSBJTVBMSUNJVF9ERUYuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEc3RUeXBlPiBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkVW5kZWYoRHN0VHlwZSAmJlJlcykgeworICAgIHJldHVybiBidWlsZFVuZGVmKGdldERlc3RGcm9tQXJnKFJlcykpOworICB9CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRVbmRlZih1bnNpZ25lZCBEc3QpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IGluc3RydWN0aW9ucyB0byBwdXQgXHAgT3BzIHRvZ2V0aGVyIGF0IHRoZSBzcGVjaWZpZWQgcAorICAvLy8gSW5kaWNlcyB0byBmb3JtIGEgbGFyZ2VyIHJlZ2lzdGVyLgorICAvLy8KKyAgLy8vIElmIHRoZSB0eXBlcyBvZiB0aGUgaW5wdXQgcmVnaXN0ZXJzIGFyZSB1bmlmb3JtIGFuZCBjb3ZlciB0aGUgZW50aXJpdHkgb2YKKyAgLy8vIFxwIFJlcyB0aGVuIGEgR19NRVJHRV9WQUxVRVMgd2lsbCBiZSBwcm9kdWNlZC4gT3RoZXJ3aXNlIGFuIElNUExJQ0lUX0RFRgorICAvLy8gZm9sbG93ZWQgYnkgYSBzZXF1ZW5jZSBvZiBHX0lOU0VSVCBpbnN0cnVjdGlvbnMuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgVGhlIGZpbmFsIGVsZW1lbnQgb2YgdGhlIHNlcXVlbmNlIG11c3Qgbm90IGV4dGVuZCBwYXN0IHRoZSBlbmQgb2YgdGhlCisgIC8vLyAgICAgIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLgorICAvLy8gXHByZSBUaGUgYml0cyBkZWZpbmVkIGJ5IGVhY2ggT3AgKGRlcml2ZWQgZnJvbSBpbmRleCBhbmQgc2NhbGFyIHNpemUpIG11c3QKKyAgLy8vICAgICAgbm90IG92ZXJsYXAuCisgIC8vLyBccHJlIFxwIEluZGljZXMgbXVzdCBiZSBpbiBhc2NlbmRpbmcgb3JkZXIgb2YgYml0IHBvc2l0aW9uLgorICB2b2lkIGJ1aWxkU2VxdWVuY2UodW5zaWduZWQgUmVzLCBBcnJheVJlZjx1bnNpZ25lZD4gT3BzLAorICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDY0X3Q+IEluZGljZXMpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlcyA9IEdfTUVSR0VfVkFMVUVTIFxwIE9wMCwgLi4uCisgIC8vLworICAvLy8gR19NRVJHRV9WQUxVRVMgY29tYmluZXMgdGhlIGlucHV0IGVsZW1lbnRzIGNvbnRpZ3VvdXNseSBpbnRvIGEgbGFyZ2VyCisgIC8vLyByZWdpc3Rlci4KKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBUaGUgZW50aXJlIHJlZ2lzdGVyIFxwIFJlcyAoYW5kIG5vIG1vcmUpIG11c3QgYmUgY292ZXJlZCBieSB0aGUgaW5wdXQKKyAgLy8vICAgICAgcmVnaXN0ZXJzLgorICAvLy8gXHByZSBUaGUgdHlwZSBvZiBhbGwgXHAgT3BzIHJlZ2lzdGVycyBtdXN0IGJlIGlkZW50aWNhbC4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRNZXJnZSh1bnNpZ25lZCBSZXMsIEFycmF5UmVmPHVuc2lnbmVkPiBPcHMpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlczAsIC4uLiA9IEdfVU5NRVJHRV9WQUxVRVMgXHAgT3AKKyAgLy8vCisgIC8vLyBHX1VOTUVSR0VfVkFMVUVTIHNwbGl0cyBjb250aWd1b3VzIGJpdHMgb2YgdGhlIGlucHV0IGludG8gbXVsdGlwbGUKKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBUaGUgZW50aXJlIHJlZ2lzdGVyIFxwIFJlcyAoYW5kIG5vIG1vcmUpIG11c3QgYmUgY292ZXJlZCBieSB0aGUgaW5wdXQKKyAgLy8vICAgICAgcmVnaXN0ZXJzLgorICAvLy8gXHByZSBUaGUgdHlwZSBvZiBhbGwgXHAgUmVzIHJlZ2lzdGVycyBtdXN0IGJlIGlkZW50aWNhbC4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRVbm1lcmdlKEFycmF5UmVmPHVuc2lnbmVkPiBSZXMsIHVuc2lnbmVkIE9wKTsKKworICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkSW5zZXJ0KHVuc2lnbmVkIFJlcywgdW5zaWduZWQgU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wLCB1bnNpZ25lZCBJbmRleCk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgZWl0aGVyIGEgR19JTlRSSU5TSUMgKGlmIFxwIEhhc1NpZGVFZmZlY3RzIGlzIGZhbHNlKSBvcgorICAvLy8gR19JTlRSSU5TSUNfV19TSURFX0VGRkVDVFMgaW5zdHJ1Y3Rpb24uIEl0cyBmaXJzdCBvcGVyYW5kIHdpbGwgYmUgdGhlCisgIC8vLyByZXN1bHQgcmVnaXN0ZXIgZGVmaW5pdGlvbiB1bmxlc3MgXHAgUmVnIGlzIE5vUmVnICg9PSAwKS4gVGhlIHNlY29uZAorICAvLy8gb3BlcmFuZCB3aWxsIGJlIHRoZSBpbnRyaW5zaWMncyBJRC4KKyAgLy8vCisgIC8vLyBDYWxsZXJzIGFyZSBleHBlY3RlZCB0byBhZGQgdGhlIHJlcXVpcmVkIGRlZmluaXRpb25zIGFuZCB1c2VzIGFmdGVyd2FyZHMuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRJbnRyaW5zaWMoSW50cmluc2ljOjpJRCBJRCwgdW5zaWduZWQgUmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzU2lkZUVmZmVjdHMpOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlcyA9IEdfRlBUUlVOQyBccCBPcAorICAvLy8KKyAgLy8vIEdfRlBUUlVOQyBjb252ZXJ0cyBhIGZsb2F0aW5nLXBvaW50IHZhbHVlIGludG8gb25lIHdpdGggYSBzbWFsbGVyIHR5cGUuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgUmVzIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBzY2FsYXIgb3IgdmVjdG9yIHR5cGUuCisgIC8vLyBccHJlIFxwIE9wIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgd2l0aCBzY2FsYXIgb3IgdmVjdG9yIHR5cGUuCisgIC8vLyBccHJlIFxwIFJlcyBtdXN0IGJlIHNtYWxsZXIgdGhhbiBccCBPcAorICAvLy8KKyAgLy8vIFxyZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBEc3RUeXBlLCB0eXBlbmFtZSBTcmNUeXBlPgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkRlBUcnVuYyhEc3RUeXBlICYmUmVzLCBTcmNUeXBlICYmU3JjKSB7CisgICAgcmV0dXJuIGJ1aWxkRlBUcnVuYyhnZXREZXN0RnJvbUFyZyhSZXMpLCBnZXRSZWdGcm9tQXJnKFNyYykpOworICB9CisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRGUFRydW5jKHVuc2lnbmVkIFJlcywgdW5zaWduZWQgT3ApOworCisgIC8vLyBCdWlsZCBhbmQgaW5zZXJ0IFxwIFJlcyA9IEdfVFJVTkMgXHAgT3AKKyAgLy8vCisgIC8vLyBHX1RSVU5DIGV4dHJhY3RzIHRoZSBsb3cgYml0cyBvZiBhIHR5cGUuIEZvciBhIHZlY3RvciB0eXBlIGVhY2ggZWxlbWVudCBpcworICAvLy8gdHJ1bmNhdGVkIGluZGVwZW5kZW50bHkgYmVmb3JlIGJlaW5nIHBhY2tlZCBpbnRvIHRoZSBkZXN0aW5hdGlvbi4KKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBccCBSZXMgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciBvciB2ZWN0b3IgdHlwZS4KKyAgLy8vIFxwcmUgXHAgT3AgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciBvciB2ZWN0b3IgdHlwZS4KKyAgLy8vIFxwcmUgXHAgUmVzIG11c3QgYmUgc21hbGxlciB0aGFuIFxwIE9wCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZFRydW5jKHVuc2lnbmVkIFJlcywgdW5zaWduZWQgT3ApOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRHN0VHlwZSwgdHlwZW5hbWUgU3JjVHlwZT4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZFRydW5jKERzdFR5cGUgJiZSZXMsIFNyY1R5cGUgJiZTcmMpIHsKKyAgICByZXR1cm4gYnVpbGRUcnVuYyhnZXREZXN0RnJvbUFyZyhSZXMpLCBnZXRSZWdGcm9tQXJnKFNyYykpOworICB9CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgYSBccCBSZXMgPSBHX0lDTVAgXHAgUHJlZCwgXHAgT3AwLCBccCBPcDEKKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgIC8vLyBccHJlIFxwIFJlcyBtdXN0IGJlIGEgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyIHdpdGggc2NhbGFyIG9yCisgIC8vLyAgICAgIHZlY3RvciB0eXBlLiBUeXBpY2FsbHkgdGhpcyBzdGFydHMgYXMgczEgb3IgPE4geCBzMT4uCisgIC8vLyBccHJlIFxwIE9wMCBhbmQgT3AxIG11c3QgYmUgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVycyB3aXRoIHRoZQorICAvLy8gICAgICBzYW1lIG51bWJlciBvZiBlbGVtZW50cyBhcyBccCBSZXMuIElmIFxwIFJlcyBpcyBhIHNjYWxhciwKKyAgLy8vICAgICAgXHAgT3AwIG11c3QgYmUgZWl0aGVyIGEgc2NhbGFyIG9yIHBvaW50ZXIuCisgIC8vLyBccHJlIFxwIFByZWQgbXVzdCBiZSBhbiBpbnRlZ2VyIHByZWRpY2F0ZS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRJQ21wKENtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZXMsIHVuc2lnbmVkIE9wMCwgdW5zaWduZWQgT3AxKTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBhIFxwIFJlcyA9IEdfRkNNUCBccCBQcmVkXHAgT3AwLCBccCBPcDEKKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorCisgIC8vLyBccHJlIFxwIFJlcyBtdXN0IGJlIGEgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyIHdpdGggc2NhbGFyIG9yCisgIC8vLyAgICAgIHZlY3RvciB0eXBlLiBUeXBpY2FsbHkgdGhpcyBzdGFydHMgYXMgczEgb3IgPE4geCBzMT4uCisgIC8vLyBccHJlIFxwIE9wMCBhbmQgT3AxIG11c3QgYmUgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVycyB3aXRoIHRoZQorICAvLy8gICAgICBzYW1lIG51bWJlciBvZiBlbGVtZW50cyBhcyBccCBSZXMgKG9yIHNjYWxhciwgaWYgXHAgUmVzIGlzCisgIC8vLyAgICAgIHNjYWxhcikuCisgIC8vLyBccHJlIFxwIFByZWQgbXVzdCBiZSBhIGZsb2F0aW5nLXBvaW50IHByZWRpY2F0ZS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIGEgTWFjaGluZUluc3RyQnVpbGRlciBmb3IgdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRGQ21wKENtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZXMsIHVuc2lnbmVkIE9wMCwgdW5zaWduZWQgT3AxKTsKKworICAvLy8gQnVpbGQgYW5kIGluc2VydCBhIFxwIFJlcyA9IEdfU0VMRUNUIFxwIFRzdCwgXHAgT3AwLCBccCBPcDEKKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBccCBSZXMsIFxwIE9wMCBhbmQgXHAgT3AxIG11c3QgYmUgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVycworICAvLy8gICAgICB3aXRoIHRoZSBzYW1lIHR5cGUuCisgIC8vLyBccHJlIFxwIFRzdCBtdXN0IGJlIGEgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyIHdpdGggc2NhbGFyLCBwb2ludGVyIG9yCisgIC8vLyAgICAgIHZlY3RvciB0eXBlLiBJZiB2ZWN0b3IgdGhlbiBpdCBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mCisgIC8vLyAgICAgIGVsZW1lbnRzIGFzIHRoZSBvdGhlciBwYXJhbWV0ZXJzLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gYSBNYWNoaW5lSW5zdHJCdWlsZGVyIGZvciB0aGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgTWFjaGluZUluc3RyQnVpbGRlciBidWlsZFNlbGVjdCh1bnNpZ25lZCBSZXMsIHVuc2lnbmVkIFRzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcDAsIHVuc2lnbmVkIE9wMSk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgXHAgUmVzID0gR19JTlNFUlRfVkVDVE9SX0VMVCBccCBWYWwsCisgIC8vLyBccCBFbHQsIFxwIElkeAorICAvLy8KKyAgLy8vIFxwcmUgc2V0QmFzaWNCbG9jayBvciBzZXRNSSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQuCisgIC8vLyBccHJlIFxwIFJlcyBhbmQgXHAgVmFsIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIKKyAgLy8gICAgICAgd2l0aCB0aGUgc2FtZSB2ZWN0b3IgdHlwZS4KKyAgLy8vIFxwcmUgXHAgRWx0IGFuZCBccCBJZHggbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlcgorICAvLy8gICAgICB3aXRoIHNjYWxhciB0eXBlLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRJbnNlcnRWZWN0b3JFbGVtZW50KHVuc2lnbmVkIFJlcywgdW5zaWduZWQgVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFbHQsIHVuc2lnbmVkIElkeCk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgXHAgUmVzID0gR19FWFRSQUNUX1ZFQ1RPUl9FTFQgXHAgVmFsLCBccCBJZHgKKyAgLy8vCisgIC8vLyBccHJlIHNldEJhc2ljQmxvY2sgb3Igc2V0TUkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkLgorICAvLy8gXHByZSBccCBSZXMgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciB0eXBlLgorICAvLy8gXHByZSBccCBWYWwgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHZlY3RvciB0eXBlLgorICAvLy8gXHByZSBccCBJZHggbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHNjYWxhciB0eXBlLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ckJ1aWxkZXIgYnVpbGRFeHRyYWN0VmVjdG9yRWxlbWVudCh1bnNpZ25lZCBSZXMsIHVuc2lnbmVkIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIElkeCk7CisKKyAgLy8vIEJ1aWxkIGFuZCBpbnNlcnQgYE9sZFZhbFJlcyA9IEdfQVRPTUlDX0NNUFhDSEcgQWRkciwgQ21wVmFsLCBOZXdWYWwsCisgIC8vLyBNTU9gLgorICAvLy8KKyAgLy8vIEF0b21pY2FsbHkgcmVwbGFjZSB0aGUgdmFsdWUgYXQgXHAgQWRkciB3aXRoIFxwIE5ld1ZhbCBpZiBpdCBpcyBjdXJyZW50bHkKKyAgLy8vIFxwIENtcFZhbCBvdGhlcndpc2UgbGVhdmVzIGl0IHVuY2hhbmdlZC4gUHV0cyB0aGUgb3JpZ2luYWwgdmFsdWUgZnJvbSBccAorICAvLy8gQWRkciBpbiBccCBSZXMuCisgIC8vLworICAvLy8gXHByZSBzZXRCYXNpY0Jsb2NrIG9yIHNldE1JIG11c3QgaGF2ZSBiZWVuIGNhbGxlZC4KKyAgLy8vIFxwcmUgXHAgT2xkVmFsUmVzIG11c3QgYmUgYSBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXIgb2Ygc2NhbGFyIHR5cGUuCisgIC8vLyBccHJlIFxwIEFkZHIgbXVzdCBiZSBhIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlciB3aXRoIHBvaW50ZXIgdHlwZS4KKyAgLy8vIFxwcmUgXHAgT2xkVmFsUmVzLCBccCBDbXBWYWwsIGFuZCBccCBOZXdWYWwgbXVzdCBiZSBnZW5lcmljIHZpcnR1YWwKKyAgLy8vICAgICAgcmVnaXN0ZXJzIG9mIHRoZSBzYW1lIHR5cGUuCisgIC8vLworICAvLy8gXHJldHVybiBhIE1hY2hpbmVJbnN0ckJ1aWxkZXIgZm9yIHRoZSBuZXdseSBjcmVhdGVkIGluc3RydWN0aW9uLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyIGJ1aWxkQXRvbWljQ21wWGNoZyh1bnNpZ25lZCBPbGRWYWxSZXMsIHVuc2lnbmVkIEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENtcFZhbCwgdW5zaWduZWQgTmV3VmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTWVtT3BlcmFuZCAmTU1PKTsKK307CisKK30gLy8gRW5kIG5hbWVzcGFjZSBsbHZtLgorI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX01BQ0hJTkVJUkJVSUxERVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvUmVnQmFua1NlbGVjdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvUmVnQmFua1NlbGVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1M2FlNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9SZWdCYW5rU2VsZWN0LmgKQEAgLTAsMCArMSw2NjUgQEAKKy8vPS0gbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvUmVnQmFua1NlbGVjdC5oIC0gUmVnIEJhbmsgU2VsZWN0b3IgLS0qLSBDKysgLSotPS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIGludGVyZmFjZSBvZiB0aGUgTWFjaGluZUZ1bmN0aW9uUGFzcworLy8vIHJlc3BvbnNpYmxlIGZvciBhc3NpZ25pbmcgdGhlIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlcnMgdG8gcmVnaXN0ZXIgYmFuay4KKworLy8vIEJ5IGRlZmF1bHQsIHRoZSByZWcgYmFuayBzZWxlY3RvciByZWxpZXMgb24gbG9jYWwgZGVjaXNpb25zIHRvCisvLy8gYXNzaWduIHRoZSByZWdpc3RlciBiYW5rLiBJbiBvdGhlciB3b3JkcywgaXQgbG9va3MgYXQgb25lIGluc3RydWN0aW9uCisvLy8gYXQgYSB0aW1lIHRvIGRlY2lkZSB3aGVyZSB0aGUgb3BlcmFuZCBvZiB0aGF0IGluc3RydWN0aW9uIHNob3VsZCBsaXZlLgorLy8vCisvLy8gQXQgaGlnaGVyIG9wdGltaXphdGlvbiBsZXZlbCwgd2UgY291bGQgaW1hZ2luZSB0aGF0IHRoZSByZWcgYmFuayBzZWxlY3RvcgorLy8vIHdvdWxkIHVzZSBtb3JlIGdsb2JhbCBhbmFseXNpcyBhbmQgZG8gY3JhemllciB0aGluZyBsaWtlIGR1cGxpY2F0aW5nCisvLy8gaW5zdHJ1Y3Rpb25zIGFuZCBzbyBvbi4gVGhpcyBpcyBmdXR1cmUgd29yay4KKy8vLworLy8vIEZvciBub3csIHRoZSBwYXNzIHVzZXMgYSBncmVlZHkgYWxnb3JpdGhtIHRvIGRlY2lkZSB3aGVyZSB0aGUgb3BlcmFuZAorLy8vIG9mIGFuIGluc3RydWN0aW9uIHNob3VsZCBsaXZlLiBJdCBhc2tzIHRoZSB0YXJnZXQgd2hpY2ggYmFua3MgbWF5IGJlCisvLy8gdXNlZCBmb3IgZWFjaCBvcGVyYW5kIG9mIHRoZSBpbnN0cnVjdGlvbiBhbmQgd2hhdCBpcyB0aGUgY29zdC4gVGhlbiwKKy8vLyBpdCBjaG9vc2VzIHRoZSBzb2x1dGlvbiB3aGljaCBtaW5pbWl6ZSB0aGUgY29zdCBvZiB0aGUgaW5zdHJ1Y3Rpb24gcGx1cworLy8vIHRoZSBjb3N0IG9mIGFueSBtb3ZlIHRoYXQgbWF5IGJlIG5lZWRlZCB0byB0aGUgdmFsdWVzIGludG8gdGhlIHJpZ2h0CisvLy8gcmVnaXN0ZXIgYmFuay4KKy8vLyBJbiBvdGhlciB3b3JkcywgdGhlIGNvc3QgZm9yIGFuIGluc3RydWN0aW9uIG9uIGEgcmVnaXN0ZXIgYmFuayBSZWdCYW5rCisvLy8gaXM6IENvc3Qgb2YgSSBvbiBSZWdCYW5rIHBsdXMgdGhlIHN1bSBvZiB0aGUgY29zdCBmb3IgYnJpbmdpbmcgdGhlCisvLy8gaW5wdXQgb3BlcmFuZHMgZnJvbSB0aGVpciBjdXJyZW50IHJlZ2lzdGVyIGJhbmsgdG8gUmVnQmFuay4KKy8vLyBUaHVzLCB0aGUgZm9sbG93aW5nIGZvcm11bGE6CisvLy8gY29zdChJLCBSZWdCYW5rKSA9IGNvc3QoSS5PcGNvZGUsIFJlZ0JhbmspICsKKy8vLyAgICBzdW0oZm9yIGVhY2ggYXJnIGluIEkuYXJndW1lbnRzOiBjb3N0Q3Jvc3NDb3B5KGFyZy5SZWdCYW5rLCBSZWdCYW5rKSkKKy8vLworLy8vIEUuZy4sIExldCBzYXkgd2UgYXJlIGFzc2lnbmluZyB0aGUgcmVnaXN0ZXIgYmFuayBmb3IgdGhlIGluc3RydWN0aW9uCisvLy8gZGVmaW5pbmcgdjIuCisvLy8gdjAoQV9SRUdCQU5LKSA9IC4uLgorLy8vIHYxKEFfUkVHQkFOSykgPSAuLi4KKy8vLyB2MiA9IEdfQUREIGkzMiB2MCwgdjEgPC0tIE1JCisvLy8KKy8vLyBUaGUgdGFyZ2V0IG1heSBzYXkgaXQgY2FuIGdlbmVyYXRlIEdfQUREIGkzMiBvbiByZWdpc3RlciBiYW5rIEEgYW5kIEIKKy8vLyB3aXRoIGEgY29zdCBvZiByZXNwZWN0aXZlbHkgNSBhbmQgMS4KKy8vLyBUaGVuLCBsZXQgc2F5IHRoZSBjb3N0IG9mIGEgY3Jvc3MgcmVnaXN0ZXIgYmFuayBjb3BpZXMgZnJvbSBBIHRvIEIgaXMgMS4KKy8vLyBUaGUgcmVnIGJhbmsgc2VsZWN0b3Igd291bGQgY29tcGFyZSB0aGUgZm9sbG93aW5nIHR3byBjb3N0czoKKy8vLyBjb3N0KE1JLCBBX1JFR0JBTkspID0gY29zdChHX0FERCwgQV9SRUdCQU5LKSArIGNvc3QodjAuUmVnQmFuaywgQV9SRUdCQU5LKSArCisvLy8gICAgY29zdCh2MS5SZWdCYW5rLCBBX1JFR0JBTkspCisvLy8gICAgICAgICAgICAgICAgICAgICA9IDUgKyBjb3N0KEFfUkVHQkFOSywgQV9SRUdCQU5LKSArIGNvc3QoQV9SRUdCQU5LLAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFfUkVHQkFOSykKKy8vLyAgICAgICAgICAgICAgICAgICAgID0gNSArIDAgKyAwID0gNQorLy8vIGNvc3QoTUksIEJfUkVHQkFOSykgPSBjb3N0KEdfQURELCBCX1JFR0JBTkspICsgY29zdCh2MC5SZWdCYW5rLCBCX1JFR0JBTkspICsKKy8vLyAgICBjb3N0KHYxLlJlZ0JhbmssIEJfUkVHQkFOSykKKy8vLyAgICAgICAgICAgICAgICAgICAgID0gMSArIGNvc3QoQV9SRUdCQU5LLCBCX1JFR0JBTkspICsgY29zdChBX1JFR0JBTkssCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQl9SRUdCQU5LKQorLy8vICAgICAgICAgICAgICAgICAgICAgPSAxICsgMSArIDEgPSAzCisvLy8gVGhlcmVmb3JlLCBpbiB0aGlzIHNwZWNpZmljIGV4YW1wbGUsIHRoZSByZWcgYmFuayBzZWxlY3RvciB3b3VsZCBjaG9vc2UKKy8vLyBiYW5rIEIgZm9yIE1JLgorLy8vIHYwKEFfUkVHQkFOSykgPSAuLi4KKy8vLyB2MShBX1JFR0JBTkspID0gLi4uCisvLy8gdG1wMChCX1JFR0JBTkspID0gQ09QWSB2MAorLy8vIHRtcDEoQl9SRUdCQU5LKSA9IENPUFkgdjEKKy8vLyB2MihCX1JFR0JBTkspID0gR19BREQgaTMyIHRtcDAsIHRtcDEKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX1JFR0JBTktTRUxFQ1RfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9SRUdCQU5LU0VMRUNUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvTWFjaGluZUlSQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL1JlZ2lzdGVyQmFua0luZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmxvY2tGcmVxdWVuY3k7CitjbGFzcyBNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvOworY2xhc3MgTWFjaGluZUJyYW5jaFByb2JhYmlsaXR5SW5mbzsKK2NsYXNzIE1hY2hpbmVPcGVyYW5kOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIFBhc3M7CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFRhcmdldFBhc3NDb25maWc7CitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CisKKy8vLyBUaGlzIHBhc3MgaW1wbGVtZW50cyB0aGUgcmVnIGJhbmsgc2VsZWN0b3IgcGFzcyB1c2VkIGluIHRoZSBHbG9iYWxJU2VsCisvLy8gcGlwZWxpbmUuIEF0IHRoZSBlbmQgb2YgdGhpcyBwYXNzLCBhbGwgcmVnaXN0ZXIgb3BlcmFuZHMgaGF2ZSBiZWVuIGFzc2lnbmVkCitjbGFzcyBSZWdCYW5rU2VsZWN0IDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICAvLy8gTGlzdCBvZiB0aGUgbW9kZXMgc3VwcG9ydGVkIGJ5IHRoZSBSZWdCYW5rU2VsZWN0IHBhc3MuCisgIGVudW0gTW9kZSB7CisgICAgLy8vIEFzc2lnbiB0aGUgcmVnaXN0ZXIgYmFua3MgYXMgZmFzdCBhcyBwb3NzaWJsZSAoZGVmYXVsdCkuCisgICAgRmFzdCwKKyAgICAvLy8gR3JlZWRpbHkgbWluaW1pemUgdGhlIGNvc3Qgb2YgYXNzaWduaW5nIHJlZ2lzdGVyIGJhbmtzLgorICAgIC8vLyBUaGlzIHNob3VsZCBwcm9kdWNlIGNvZGUgb2YgZ3JlYXRlciBxdWFsaXR5LCBidXQgd2lsbAorICAgIC8vLyByZXF1aXJlIG1vcmUgY29tcGlsZSB0aW1lLgorICAgIEdyZWVkeQorICB9OworCisgIC8vLyBBYnN0cmFjdCBjbGFzcyB1c2VkIHRvIHJlcHJlc2VudCBhbiBpbnNlcnRpb24gcG9pbnQgaW4gYSBDRkcuCisgIC8vLyBUaGlzIGNsYXNzIHJlY29yZHMgYW4gaW5zZXJ0aW9uIHBvaW50IGFuZCBtYXRlcmlhbGl6ZXMgaXQgb24KKyAgLy8vIGRlbWFuZC4KKyAgLy8vIEl0IGFsbG93cyB0byByZWFzb24gYWJvdXQgdGhlIGZyZXF1ZW5jeSBvZiB0aGlzIGluc2VydGlvbiBwb2ludCwKKyAgLy8vIHdpdGhvdXQgaGF2aW5nIHRvIGxvZ2ljYWxseSBtYXRlcmlhbGl6ZSBpdCAoZS5nLiwgb24gYW4gZWRnZSksCisgIC8vLyBiZWZvcmUgd2UgYWN0dWFsbHkgbmVlZCB0byBpbnNlcnQgc29tZXRoaW5nLgorICBjbGFzcyBJbnNlcnRQb2ludCB7CisgIHByb3RlY3RlZDoKKyAgICAvLy8gVGVsbCBpZiB0aGUgaW5zZXJ0IHBvaW50IGhhcyBhbHJlYWR5IGJlZW4gbWF0ZXJpYWxpemVkLgorICAgIGJvb2wgV2FzTWF0ZXJpYWxpemVkID0gZmFsc2U7CisKKyAgICAvLy8gTWF0ZXJpYWxpemUgdGhlIGluc2VydGlvbiBwb2ludC4KKyAgICAvLy8KKyAgICAvLy8gSWYgaXNTcGxpdCgpIGlzIHRydWUsIHRoaXMgaW52b2x2ZXMgYWN0dWFsbHkgc3BsaXR0aW5nCisgICAgLy8vIHRoZSBibG9jayBvciBlZGdlLgorICAgIC8vLworICAgIC8vLyBccG9zdCBnZXRQb2ludEltcGwoKSByZXR1cm5zIGEgdmFsaWQgaXRlcmF0b3IuCisgICAgLy8vIFxwb3N0IGdldEluc2VydE1CQkltcGwoKSByZXR1cm5zIGEgdmFsaWQgYmFzaWMgYmxvY2suCisgICAgLy8vIFxwb3N0IGlzU3BsaXQoKSA9PSBmYWxzZSA7IG5vIG1vcmUgc3BsaXR0aW5nIHNob3VsZCBiZSByZXF1aXJlZC4KKyAgICB2aXJ0dWFsIHZvaWQgbWF0ZXJpYWxpemUoKSA9IDA7CisKKyAgICAvLy8gUmV0dXJuIHRoZSBtYXRlcmlhbGl6ZWQgaW5zZXJ0aW9uIGJhc2ljIGJsb2NrLgorICAgIC8vLyBDb2RlIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byB0aGF0IGJhc2ljIGJsb2NrLgorICAgIC8vLworICAgIC8vLyBccHJlIDo6bWF0ZXJpYWxpemUgaGFzIGJlZW4gY2FsbGVkLgorICAgIHZpcnR1YWwgTWFjaGluZUJhc2ljQmxvY2sgJmdldEluc2VydE1CQkltcGwoKSA9IDA7CisKKyAgICAvLy8gUmV0dXJuIHRoZSBtYXRlcmlhbGl6ZWQgaW5zZXJ0aW9uIHBvaW50LgorICAgIC8vLyBDb2RlIHdpbGwgYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoYXQgcG9pbnQuCisgICAgLy8vCisgICAgLy8vIFxwcmUgOjptYXRlcmlhbGl6ZSBoYXMgYmVlbiBjYWxsZWQuCisgICAgdmlydHVhbCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgZ2V0UG9pbnRJbXBsKCkgPSAwOworCisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5JbnNlcnRQb2ludCgpID0gZGVmYXVsdDsKKworICAgIC8vLyBUaGUgZmlyc3QgY2FsbCB0byB0aGlzIG1ldGhvZCB3aWxsIGNhdXNlIHRoZSBzcGxpdHRpbmcgdG8KKyAgICAvLy8gaGFwcGVuIGlmIG5lZWQgYmUsIHRoZW4gc3ViIHNlcXVlbnQgY2FsbHMganVzdCByZXR1cm4KKyAgICAvLy8gdGhlIGl0ZXJhdG9yIHRvIHRoYXQgcG9pbnQuIEkuZS4sIG5vIG1vcmUgc3BsaXR0aW5nIHdpbGwKKyAgICAvLy8gb2NjdXIuCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm4gVGhlIGl0ZXJhdG9yIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2l0aAorICAgIC8vLyBNYWNoaW5lQmFzaWNCbG9jazo6aW5zZXJ0LiBJLmUuLCBhZGRpdGlvbmFsIGNvZGUgaGFwcGVucworICAgIC8vLyBiZWZvcmUgdGhhdCBwb2ludC4KKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgZ2V0UG9pbnQoKSB7CisgICAgICBpZiAoIVdhc01hdGVyaWFsaXplZCkgeworICAgICAgICBXYXNNYXRlcmlhbGl6ZWQgPSB0cnVlOworICAgICAgICBhc3NlcnQoY2FuTWF0ZXJpYWxpemUoKSAmJiAiSW1wb3NzaWJsZSB0byBtYXRlcmlhbGl6ZSB0aGlzIHBvaW50Iik7CisgICAgICAgIG1hdGVyaWFsaXplKCk7CisgICAgICB9CisgICAgICAvLyBXaGVuIHdlIG1hdGVyaWFsaXplZCB0aGUgcG9pbnQgd2Ugc2hvdWxkIGhhdmUgZG9uZSB0aGUgc3BsaXR0aW5nLgorICAgICAgYXNzZXJ0KCFpc1NwbGl0KCkgJiYgIldyb25nIHByZS1jb25kaXRpb24iKTsKKyAgICAgIHJldHVybiBnZXRQb2ludEltcGwoKTsKKyAgICB9CisKKyAgICAvLy8gVGhlIGZpcnN0IGNhbGwgdG8gdGhpcyBtZXRob2Qgd2lsbCBjYXVzZSB0aGUgc3BsaXR0aW5nIHRvCisgICAgLy8vIGhhcHBlbiBpZiBuZWVkIGJlLCB0aGVuIHN1YiBzZXF1ZW50IGNhbGxzIGp1c3QgcmV0dXJuCisgICAgLy8vIHRoZSBiYXNpYyBibG9jayB0aGF0IGNvbnRhaW5zIHRoZSBpbnNlcnRpb24gcG9pbnQuCisgICAgLy8vIEkuZS4sIG5vIG1vcmUgc3BsaXR0aW5nIHdpbGwgb2NjdXIuCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm4gVGhlIGJhc2ljIGJsb2NrIHNob3VsZCBiZSB1c2VkIHdpdGgKKyAgICAvLy8gTWFjaGluZUJhc2ljQmxvY2s6Omluc2VydCBhbmQgOjpnZXRQb2ludC4gVGhlIG5ldyBjb2RlIHNob3VsZAorICAgIC8vLyBoYXBwZW4gYmVmb3JlIHRoYXQgcG9pbnQuCisgICAgTWFjaGluZUJhc2ljQmxvY2sgJmdldEluc2VydE1CQigpIHsKKyAgICAgIGlmICghV2FzTWF0ZXJpYWxpemVkKSB7CisgICAgICAgIFdhc01hdGVyaWFsaXplZCA9IHRydWU7CisgICAgICAgIGFzc2VydChjYW5NYXRlcmlhbGl6ZSgpICYmICJJbXBvc3NpYmxlIHRvIG1hdGVyaWFsaXplIHRoaXMgcG9pbnQiKTsKKyAgICAgICAgbWF0ZXJpYWxpemUoKTsKKyAgICAgIH0KKyAgICAgIC8vIFdoZW4gd2UgbWF0ZXJpYWxpemVkIHRoZSBwb2ludCB3ZSBzaG91bGQgaGF2ZSBkb25lIHRoZSBzcGxpdHRpbmcuCisgICAgICBhc3NlcnQoIWlzU3BsaXQoKSAmJiAiV3JvbmcgcHJlLWNvbmRpdGlvbiIpOworICAgICAgcmV0dXJuIGdldEluc2VydE1CQkltcGwoKTsKKyAgICB9CisKKyAgICAvLy8gSW5zZXJ0IFxwIE1JIGluIHRoZSBqdXN0IGJlZm9yZSA6OmdldFBvaW50KCkKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgaW5zZXJ0KE1hY2hpbmVJbnN0ciAmTUkpIHsKKyAgICAgIHJldHVybiBnZXRJbnNlcnRNQkIoKS5pbnNlcnQoZ2V0UG9pbnQoKSwgJk1JKTsKKyAgICB9CisKKyAgICAvLy8gRG9lcyB0aGlzIHBvaW50IGludm9sdmUgc3BsaXR0aW5nIGFuIGVkZ2Ugb3IgYmxvY2s/CisgICAgLy8vIEFzIHNvb24gYXMgOjpnZXRQb2ludCBpcyBjYWxsZWQgYW5kIHRodXMsIHRoZSBwb2ludAorICAgIC8vLyBtYXRlcmlhbGl6ZWQsIHRoZSBwb2ludCB3aWxsIG5vdCByZXF1aXJlIHNwbGl0dGluZyBhbnltb3JlLAorICAgIC8vLyBpLmUuLCB0aGlzIHdpbGwgcmV0dXJuIGZhbHNlLgorICAgIHZpcnR1YWwgYm9vbCBpc1NwbGl0KCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIC8vLyBGcmVxdWVuY3kgb2YgdGhlIGluc2VydGlvbiBwb2ludC4KKyAgICAvLy8gXHAgUCBpcyB1c2VkIHRvIGFjY2VzcyB0aGUgdmFyaW91cyBhbmFseXNpcyB0aGF0IHdpbGwgaGVscCB0bworICAgIC8vLyBnZXQgdGhhdCBpbmZvcm1hdGlvbiwgbGlrZSBNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvLiAgSWYgXHAgUAorICAgIC8vLyBkb2VzIG5vdCBjb250YWluIGVub3VnaCBlbm91Z2ggdG8gcmV0dXJuIHRoZSBhY3R1YWwgZnJlcXVlbmN5LAorICAgIC8vLyB0aGlzIHJldHVybnMgMS4KKyAgICB2aXJ0dWFsIHVpbnQ2NF90IGZyZXF1ZW5jeShjb25zdCBQYXNzICZQKSBjb25zdCB7IHJldHVybiAxOyB9CisKKyAgICAvLy8gQ2hlY2sgd2hldGhlciB0aGlzIGluc2VydGlvbiBwb2ludCBjYW4gYmUgbWF0ZXJpYWxpemVkLgorICAgIC8vLyBBcyBzb29uIGFzIDo6Z2V0UG9pbnQgaXMgY2FsbGVkIGFuZCB0aHVzLCB0aGUgcG9pbnQgbWF0ZXJpYWxpemVkCisgICAgLy8vIGNhbGxpbmcgdGhpcyBtZXRob2QgZG9lcyBub3QgbWFrZSBzZW5zZS4KKyAgICB2aXJ0dWFsIGJvb2wgY2FuTWF0ZXJpYWxpemUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorICB9OworCisgIC8vLyBJbnNlcnRpb24gcG9pbnQgYmVmb3JlIG9yIGFmdGVyIGFuIGluc3RydWN0aW9uLgorICBjbGFzcyBJbnN0ckluc2VydFBvaW50IDogcHVibGljIEluc2VydFBvaW50IHsKKyAgcHJpdmF0ZToKKyAgICAvLy8gSW5zZXJ0aW9uIHBvaW50LgorICAgIE1hY2hpbmVJbnN0ciAmSW5zdHI7CisKKyAgICAvLy8gRG9lcyB0aGUgaW5zZXJ0aW9uIHBvaW50IGlzIGJlZm9yZSBvciBhZnRlciBJbnN0ci4KKyAgICBib29sIEJlZm9yZTsKKworICAgIHZvaWQgbWF0ZXJpYWxpemUoKSBvdmVycmlkZTsKKworICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBnZXRQb2ludEltcGwoKSBvdmVycmlkZSB7CisgICAgICBpZiAoQmVmb3JlKQorICAgICAgICByZXR1cm4gSW5zdHI7CisgICAgICByZXR1cm4gSW5zdHIuZ2V0TmV4dE5vZGUoKSA/ICpJbnN0ci5nZXROZXh0Tm9kZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEluc3RyLmdldFBhcmVudCgpLT5lbmQoKTsKKyAgICB9CisKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAmZ2V0SW5zZXJ0TUJCSW1wbCgpIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiAqSW5zdHIuZ2V0UGFyZW50KCk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICAvLy8gQ3JlYXRlIGFuIGluc2VydGlvbiBwb2ludCBiZWZvcmUgKFxwIEJlZm9yZT10cnVlKSBvciBhZnRlciBccCBJbnN0ci4KKyAgICBJbnN0ckluc2VydFBvaW50KE1hY2hpbmVJbnN0ciAmSW5zdHIsIGJvb2wgQmVmb3JlID0gdHJ1ZSk7CisKKyAgICBib29sIGlzU3BsaXQoKSBjb25zdCBvdmVycmlkZTsKKyAgICB1aW50NjRfdCBmcmVxdWVuY3koY29uc3QgUGFzcyAmUCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLyBXb3JzdCBjYXNlLCB3ZSBuZWVkIHRvIHNsaWNlIHRoZSBiYXNpYyBibG9jaywgYnV0IHRoYXQgaXMgc3RpbGwgZG9hYmxlLgorICAgIGJvb2wgY2FuTWF0ZXJpYWxpemUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgIH07CisKKyAgLy8vIEluc2VydGlvbiBwb2ludCBhdCB0aGUgYmVnaW5uaW5nIG9yIGVuZCBvZiBhIGJhc2ljIGJsb2NrLgorICBjbGFzcyBNQkJJbnNlcnRQb2ludCA6IHB1YmxpYyBJbnNlcnRQb2ludCB7CisgIHByaXZhdGU6CisgICAgLy8vIEluc2VydGlvbiBwb2ludC4KKyAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCOworCisgICAgLy8vIERvZXMgdGhlIGluc2VydGlvbiBwb2ludCBpcyBhdCB0aGUgYmVnaW5uaW5nIG9yIGVuZCBvZiBNQkIuCisgICAgYm9vbCBCZWdpbm5pbmc7CisKKyAgICB2b2lkIG1hdGVyaWFsaXplKCkgb3ZlcnJpZGUgeyAvKk5vdGhpbmcgdG8gZG8gdG8gbWF0ZXJpYWxpemUqLworICAgIH0KKworICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBnZXRQb2ludEltcGwoKSBvdmVycmlkZSB7CisgICAgICByZXR1cm4gQmVnaW5uaW5nID8gTUJCLmJlZ2luKCkgOiBNQkIuZW5kKCk7CisgICAgfQorCisgICAgTWFjaGluZUJhc2ljQmxvY2sgJmdldEluc2VydE1CQkltcGwoKSBvdmVycmlkZSB7IHJldHVybiBNQkI7IH0KKworICBwdWJsaWM6CisgICAgTUJCSW5zZXJ0UG9pbnQoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgYm9vbCBCZWdpbm5pbmcgPSB0cnVlKQorICAgICAgICA6IEluc2VydFBvaW50KCksIE1CQihNQkIpLCBCZWdpbm5pbmcoQmVnaW5uaW5nKSB7CisgICAgICAvLyBJZiB3ZSB0cnkgdG8gaW5zZXJ0IGJlZm9yZSBwaGlzLCB3ZSBzaG91bGQgdXNlIHRoZSBpbnNlcnRpb24KKyAgICAgIC8vIHBvaW50cyBvbiB0aGUgaW5jb21pbmcgZWRnZXMuCisgICAgICBhc3NlcnQoKCFCZWdpbm5pbmcgfHwgTUJCLmdldEZpcnN0Tm9uUEhJKCkgPT0gTUJCLmJlZ2luKCkpICYmCisgICAgICAgICAgICAgIkludmFsaWQgYmVnaW5uaW5nIHBvaW50Iik7CisgICAgICAvLyBJZiB3ZSB0cnkgdG8gaW5zZXJ0IGFmdGVyIHRoZSB0ZXJtaW5hdG9ycywgd2Ugc2hvdWxkIHVzZSB0aGUKKyAgICAgIC8vIHBvaW50cyBvbiB0aGUgb3V0Y29taW5nIGVkZ2VzLgorICAgICAgYXNzZXJ0KChCZWdpbm5pbmcgfHwgTUJCLmdldEZpcnN0VGVybWluYXRvcigpID09IE1CQi5lbmQoKSkgJiYKKyAgICAgICAgICAgICAiSW52YWxpZCBlbmQgcG9pbnQiKTsKKyAgICB9CisKKyAgICBib29sIGlzU3BsaXQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorICAgIHVpbnQ2NF90IGZyZXF1ZW5jeShjb25zdCBQYXNzICZQKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIGNhbk1hdGVyaWFsaXplKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfTsKKyAgfTsKKworICAvLy8gSW5zZXJ0aW9uIHBvaW50IG9uIGFuIGVkZ2UuCisgIGNsYXNzIEVkZ2VJbnNlcnRQb2ludCA6IHB1YmxpYyBJbnNlcnRQb2ludCB7CisgIHByaXZhdGU6CisgICAgLy8vIFNvdXJjZSBvZiB0aGUgZWRnZS4KKyAgICBNYWNoaW5lQmFzaWNCbG9jayAmU3JjOworCisgICAgLy8vIERlc3RpbmF0aW9uIG9mIHRoZSBlZGdlLgorICAgIC8vLyBBZnRlciB0aGUgbWF0ZXJpYWxpemF0aW9uIGlzIGRvbmUsIHRoaXMgaG9sZCB0aGUgYmFzaWMgYmxvY2sKKyAgICAvLy8gdGhhdCByZXN1bHRlZCBmcm9tIHRoZSBzcGxpdHRpbmcuCisgICAgTWFjaGluZUJhc2ljQmxvY2sgKkRzdE9yU3BsaXQ7CisKKyAgICAvLy8gUCBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgYW5hbHlzaXMgcGFzc2VzIGFzIGFwcGxpY2FibGUuCisgICAgUGFzcyAmUDsKKworICAgIHZvaWQgbWF0ZXJpYWxpemUoKSBvdmVycmlkZTsKKworICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBnZXRQb2ludEltcGwoKSBvdmVycmlkZSB7CisgICAgICAvLyBEc3RPclNwbGl0IHNob3VsZCBiZSB0aGUgU3BsaXQgYmxvY2sgYXQgdGhpcyBwb2ludC4KKyAgICAgIC8vIEkuZS4sIGl0IHNob3VsZCBoYXZlIG9uZSBwcmVkZWNlc3NvciwgU3JjLCBhbmQgb25lIHN1Y2Nlc3NvciwKKyAgICAgIC8vIHRoZSBvcmlnaW5hbCBEc3QuCisgICAgICBhc3NlcnQoRHN0T3JTcGxpdCAmJiBEc3RPclNwbGl0LT5pc1ByZWRlY2Vzc29yKCZTcmMpICYmCisgICAgICAgICAgICAgRHN0T3JTcGxpdC0+cHJlZF9zaXplKCkgPT0gMSAmJiBEc3RPclNwbGl0LT5zdWNjX3NpemUoKSA9PSAxICYmCisgICAgICAgICAgICAgIkRpZCBub3Qgc3BsaXQ/ISIpOworICAgICAgcmV0dXJuIERzdE9yU3BsaXQtPmJlZ2luKCk7CisgICAgfQorCisgICAgTWFjaGluZUJhc2ljQmxvY2sgJmdldEluc2VydE1CQkltcGwoKSBvdmVycmlkZSB7IHJldHVybiAqRHN0T3JTcGxpdDsgfQorCisgIHB1YmxpYzoKKyAgICBFZGdlSW5zZXJ0UG9pbnQoTWFjaGluZUJhc2ljQmxvY2sgJlNyYywgTWFjaGluZUJhc2ljQmxvY2sgJkRzdCwgUGFzcyAmUCkKKyAgICAgICAgOiBJbnNlcnRQb2ludCgpLCBTcmMoU3JjKSwgRHN0T3JTcGxpdCgmRHN0KSwgUChQKSB7fQorCisgICAgYm9vbCBpc1NwbGl0KCkgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIFNyYy5zdWNjX3NpemUoKSA+IDEgJiYgRHN0T3JTcGxpdC0+cHJlZF9zaXplKCkgPiAxOworICAgIH0KKworICAgIHVpbnQ2NF90IGZyZXF1ZW5jeShjb25zdCBQYXNzICZQKSBjb25zdCBvdmVycmlkZTsKKyAgICBib29sIGNhbk1hdGVyaWFsaXplKCkgY29uc3Qgb3ZlcnJpZGU7CisgIH07CisKKyAgLy8vIFN0cnVjdCB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcGxhY2VtZW50IG9mIGEgcmVwYWlyaW5nIHBvaW50IGZvcgorICAvLy8gYSBnaXZlbiBvcGVyYW5kLgorICBjbGFzcyBSZXBhaXJpbmdQbGFjZW1lbnQgeworICBwdWJsaWM6CisgICAgLy8vIERlZmluZSB0aGUga2luZCBvZiBhY3Rpb24gdGhpcyByZXBhaXJpbmcgbmVlZHMuCisgICAgZW51bSBSZXBhaXJpbmdLaW5kIHsKKyAgICAgIC8vLyBOb3RoaW5nIHRvIHJlcGFpciwganVzdCBkcm9wIHRoaXMgYWN0aW9uLgorICAgICAgTm9uZSwKKyAgICAgIC8vLyBSZXBhcmluZyBjb2RlIG5lZWRzIHRvIGhhcHBlbiBiZWZvcmUgSW5zZXJ0UG9pbnRzLgorICAgICAgSW5zZXJ0LAorICAgICAgLy8vIChSZSlhc3NpZ24gdGhlIHJlZ2lzdGVyIGJhbmsgb2YgdGhlIG9wZXJhbmQuCisgICAgICBSZWFzc2lnbiwKKyAgICAgIC8vLyBNYXJrIHRoaXMgcmVwYWlyaW5nIHBsYWNlbWVudCBhcyBpbXBvc3NpYmxlLgorICAgICAgSW1wb3NzaWJsZQorICAgIH07CisKKyAgICAvLy8gXG5hbWUgQ29udmVuaWVudCB0eXBlcyBmb3IgYSBsaXN0IG9mIGluc2VydGlvbiBwb2ludHMuCisgICAgLy8vIEB7CisgICAgdXNpbmcgSW5zZXJ0aW9uUG9pbnRzID0gU21hbGxWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEluc2VydFBvaW50PiwgMj47CisgICAgdXNpbmcgaW5zZXJ0cHRfaXRlcmF0b3IgPSBJbnNlcnRpb25Qb2ludHM6Oml0ZXJhdG9yOworICAgIHVzaW5nIGNvbnN0X2luc2VydHB0X2l0ZXJhdG9yID0gSW5zZXJ0aW9uUG9pbnRzOjpjb25zdF9pdGVyYXRvcjsKKyAgICAvLy8gQH0KKworICBwcml2YXRlOgorICAgIC8vLyBLaW5kIG9mIHJlcGFpcmluZy4KKyAgICBSZXBhaXJpbmdLaW5kIEtpbmQ7CisgICAgLy8vIEluZGV4IG9mIHRoZSBvcGVyYW5kIHRoYXQgd2lsbCBiZSByZXBhaXJlZC4KKyAgICB1bnNpZ25lZCBPcElkeDsKKyAgICAvLy8gQXJlIGFsbCB0aGUgaW5zZXJ0IHBvaW50cyBtYXRlcmlhbGl6ZWFibGU/CisgICAgYm9vbCBDYW5NYXRlcmlhbGl6ZTsKKyAgICAvLy8gSXMgdGhlcmUgYW55IG9mIHRoZSBpbnNlcnQgcG9pbnRzIG5lZWRpbmcgc3BsaXR0aW5nPworICAgIGJvb2wgSGFzU3BsaXQgPSBmYWxzZTsKKyAgICAvLy8gSW5zZXJ0aW9uIHBvaW50IGZvciB0aGUgcmVwYWlyIGNvZGUuCisgICAgLy8vIFRoZSByZXBhaXJpbmcgY29kZSBuZWVkcyB0byBoYXBwZW4ganVzdCBiZWZvcmUgdGhlc2UgcG9pbnRzLgorICAgIEluc2VydGlvblBvaW50cyBJbnNlcnRQb2ludHM7CisgICAgLy8vIFNvbWUgaW5zZXJ0aW9uIHBvaW50cyBtYXkgbmVlZCB0byB1cGRhdGUgdGhlIGxpdmVuZXNzIGFuZCBzdWNoLgorICAgIFBhc3MgJlA7CisKKyAgcHVibGljOgorICAgIC8vLyBDcmVhdGUgYSByZXBhaXJpbmcgcGxhY2VtZW50IGZvciB0aGUgXHAgT3BJZHgtdGggb3BlcmFuZCBvZgorICAgIC8vLyBccCBNSS4gXHAgVFJJIGlzIHVzZWQgdG8gbWFrZSBzb21lIGNoZWNrcyBvbiB0aGUgcmVnaXN0ZXIgYWxpYXNlcworICAgIC8vLyBpZiB0aGUgbWFjaGluZSBvcGVyYW5kIGlzIGEgcGh5c2ljYWwgcmVnaXN0ZXIuIFxwIFAgaXMgdXNlZCB0bworICAgIC8vLyB0byB1cGRhdGUgbGl2ZW5lc3MgaW5mb3JtYXRpb24gYW5kIHN1Y2ggd2hlbiBtYXRlcmlhbGl6aW5nIHRoZQorICAgIC8vLyBwb2ludHMuCisgICAgUmVwYWlyaW5nUGxhY2VtZW50KE1hY2hpbmVJbnN0ciAmTUksIHVuc2lnbmVkIE9wSWR4LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSwgUGFzcyAmUCwKKyAgICAgICAgICAgICAgICAgICAgICAgUmVwYWlyaW5nS2luZCBLaW5kID0gUmVwYWlyaW5nS2luZDo6SW5zZXJ0KTsKKworICAgIC8vLyBcbmFtZSBHZXR0ZXJzLgorICAgIC8vLyBAeworICAgIFJlcGFpcmluZ0tpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKyAgICB1bnNpZ25lZCBnZXRPcElkeCgpIGNvbnN0IHsgcmV0dXJuIE9wSWR4OyB9CisgICAgYm9vbCBjYW5NYXRlcmlhbGl6ZSgpIGNvbnN0IHsgcmV0dXJuIENhbk1hdGVyaWFsaXplOyB9CisgICAgYm9vbCBoYXNTcGxpdCgpIHsgcmV0dXJuIEhhc1NwbGl0OyB9CisgICAgLy8vIEB9CisKKyAgICAvLy8gXG5hbWUgT3ZlcmxvYWRlZCBtZXRob2RzIHRvIGFkZCBhbiBpbnNlcnRpb24gcG9pbnQuCisgICAgLy8vIEB7CisgICAgLy8vIEFkZCBhIE1CQkluc2VydGlvblBvaW50IHRvIHRoZSBsaXN0IG9mIEluc2VydFBvaW50cy4KKyAgICB2b2lkIGFkZEluc2VydFBvaW50KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsIGJvb2wgQmVnaW5uaW5nKTsKKyAgICAvLy8gQWRkIGEgSW5zdHJJbnNlcnRpb25Qb2ludCB0byB0aGUgbGlzdCBvZiBJbnNlcnRQb2ludHMuCisgICAgdm9pZCBhZGRJbnNlcnRQb2ludChNYWNoaW5lSW5zdHIgJk1JLCBib29sIEJlZm9yZSk7CisgICAgLy8vIEFkZCBhbiBFZGdlSW5zZXJ0aW9uUG9pbnQgKFxwIFNyYywgXHAgRHN0KSB0byB0aGUgbGlzdCBvZiBJbnNlcnRQb2ludHMuCisgICAgdm9pZCBhZGRJbnNlcnRQb2ludChNYWNoaW5lQmFzaWNCbG9jayAmU3JjLCBNYWNoaW5lQmFzaWNCbG9jayAmRHN0KTsKKyAgICAvLy8gQWRkIGFuIEluc2VydFBvaW50IHRvIHRoZSBsaXN0IG9mIGluc2VydCBwb2ludHMuCisgICAgLy8vIFRoaXMgbWV0aG9kIHRha2VzIHRoZSBvd25lcnNoaXAgb2YgJlxwIFBvaW50LgorICAgIHZvaWQgYWRkSW5zZXJ0UG9pbnQoSW5zZXJ0UG9pbnQgJlBvaW50KTsKKyAgICAvLy8gQH0KKworICAgIC8vLyBcbmFtZSBBY2Nlc3NvcnMgcmVsYXRlZCB0byB0aGUgaW5zZXJ0aW9uIHBvaW50cy4KKyAgICAvLy8gQHsKKyAgICBpbnNlcnRwdF9pdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIEluc2VydFBvaW50cy5iZWdpbigpOyB9CisgICAgaW5zZXJ0cHRfaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gSW5zZXJ0UG9pbnRzLmVuZCgpOyB9CisKKyAgICBjb25zdF9pbnNlcnRwdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEluc2VydFBvaW50cy5iZWdpbigpOyB9CisgICAgY29uc3RfaW5zZXJ0cHRfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gSW5zZXJ0UG9pbnRzLmVuZCgpOyB9CisKKyAgICB1bnNpZ25lZCBnZXROdW1JbnNlcnRQb2ludHMoKSBjb25zdCB7IHJldHVybiBJbnNlcnRQb2ludHMuc2l6ZSgpOyB9CisgICAgLy8vIEB9CisKKyAgICAvLy8gQ2hhbmdlIHRoZSB0eXBlIG9mIHRoaXMgcmVwYWlyaW5nIHBsYWNlbWVudCB0byBccCBOZXdLaW5kLgorICAgIC8vLyBJdCBpcyBub3QgcG9zc2libGUgdG8gc3dpdGNoIGEgcmVwYWlyaW5nIHBsYWNlbWVudCB0byB0aGUKKyAgICAvLy8gUmVwYWlyaW5nS2luZDo6SW5zZXJ0LiBUaGVyZSBpcyBubyBmdW5kYW1lbnRhbCBwcm9ibGVtIHdpdGgKKyAgICAvLy8gdGhhdCwgYnV0IG5vIHVzZXMgYXMgd2VsbCwgc28gZG8gbm90IHN1cHBvcnQgaXQgZm9yIG5vdy4KKyAgICAvLy8KKyAgICAvLy8gXHByZSBOZXdLaW5kICE9IFJlcGFpcmluZ0tpbmQ6Okluc2VydAorICAgIC8vLyBccG9zdCBnZXRLaW5kKCkgPT0gTmV3S2luZAorICAgIHZvaWQgc3dpdGNoVG8oUmVwYWlyaW5nS2luZCBOZXdLaW5kKSB7CisgICAgICBhc3NlcnQoTmV3S2luZCAhPSBLaW5kICYmICJBbHJlYWR5IG9mIHRoZSByaWdodCBLaW5kIik7CisgICAgICBLaW5kID0gTmV3S2luZDsKKyAgICAgIEluc2VydFBvaW50cy5jbGVhcigpOworICAgICAgQ2FuTWF0ZXJpYWxpemUgPSBOZXdLaW5kICE9IFJlcGFpcmluZ0tpbmQ6OkltcG9zc2libGU7CisgICAgICBIYXNTcGxpdCA9IGZhbHNlOworICAgICAgYXNzZXJ0KE5ld0tpbmQgIT0gUmVwYWlyaW5nS2luZDo6SW5zZXJ0ICYmCisgICAgICAgICAgICAgIldlIHdvdWxkIG5lZWQgbW9yZSBNSSB0byBzd2l0Y2ggdG8gSW5zZXJ0Iik7CisgICAgfQorICB9OworCitwcml2YXRlOgorICAvLy8gSGVscGVyIGNsYXNzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjb3N0IGZvciBtYXBwaW5nIGFuIGluc3RydWN0aW9uLgorICAvLy8gV2hlbiBtYXBwaW5nIGFuIGluc3RydWN0aW9uLCB3ZSBtYXkgaW50cm9kdWNlIHNvbWUgcmVwYWlyaW5nIGNvZGUuCisgIC8vLyBJbiBtb3N0IGNhc2VzLCB0aGUgcmVwYWlyaW5nIGNvZGUgaXMgbG9jYWwgdG8gdGhlIGluc3RydWN0aW9uLAorICAvLy8gdGh1cywgd2UgY2FuIG9taXQgdGhlIGJhc2ljIGJsb2NrIGZyZXF1ZW5jeSBmcm9tIHRoZSBjb3N0LgorICAvLy8gSG93ZXZlciwgc29tZSBhbHRlcm5hdGl2ZXMgbWF5IHByb2R1Y2Ugbm9uLWxvY2FsIGNvc3QsIGUuZy4sIHdoZW4KKyAgLy8vIHJlcGFpcmluZyBhIHBoaSwgYW5kIHRodXMgd2UgdGhlbiBuZWVkIHRvIHNjYWxlIHRoZSBsb2NhbCBjb3N0CisgIC8vLyB0byB0aGUgbm9uLWxvY2FsIGNvc3QuIFRoaXMgY2xhc3MgZG9lcyB0aGlzIGZvciB1cy4KKyAgLy8vIFxub3RlOiBXZSBjb3VsZCBzaW1wbHkgYWx3YXlzIHNjYWxlIHRoZSBjb3N0LiBUaGUgcHJvYmxlbSBpcyB0aGF0CisgIC8vLyB0aGVyZSBhcmUgaGlnaGVyIGNoYW5jZXMgdGhhdCB3ZSBzYXR1cmF0ZSB0aGUgY29zdCBlYXNpZXIgYW5kIGVuZAorICAvLy8gdXAgaGF2aW5nIHRoZSBzYW1lIGNvc3QgZm9yIGFjdHVhbGx5IGRpZmZlcmVudCBhbHRlcm5hdGl2ZXMuCisgIC8vLyBBbm90aGVyIG9wdGlvbiB3b3VsZCBiZSB0byB1c2UgQVBJbnQgZXZlcnl3aGVyZS4KKyAgY2xhc3MgTWFwcGluZ0Nvc3QgeworICBwcml2YXRlOgorICAgIC8vLyBDb3N0IG9mIHRoZSBsb2NhbCBpbnN0cnVjdGlvbnMuCisgICAgLy8vIFRoaXMgY29zdCBpcyBmcmVlIG9mIGJhc2ljIGJsb2NrIGZyZXF1ZW5jeS4KKyAgICB1aW50NjRfdCBMb2NhbENvc3QgPSAwOworICAgIC8vLyBDb3N0IG9mIHRoZSBub24tbG9jYWwgaW5zdHJ1Y3Rpb25zLgorICAgIC8vLyBUaGlzIGNvc3Qgc2hvdWxkIGluY2x1ZGUgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgcmVsYXRlZCBibG9ja3MuCisgICAgdWludDY0X3QgTm9uTG9jYWxDb3N0ID0gMDsKKyAgICAvLy8gRnJlcXVlbmN5IG9mIHRoZSBibG9jayB3aGVyZSB0aGUgbG9jYWwgaW5zdHJ1Y3Rpb25zIGxpdmUuCisgICAgdWludDY0X3QgTG9jYWxGcmVxOworCisgICAgTWFwcGluZ0Nvc3QodWludDY0X3QgTG9jYWxDb3N0LCB1aW50NjRfdCBOb25Mb2NhbENvc3QsIHVpbnQ2NF90IExvY2FsRnJlcSkKKyAgICAgICAgOiBMb2NhbENvc3QoTG9jYWxDb3N0KSwgTm9uTG9jYWxDb3N0KE5vbkxvY2FsQ29zdCksCisgICAgICAgICAgTG9jYWxGcmVxKExvY2FsRnJlcSkge30KKworICAgIC8vLyBDaGVjayBpZiB0aGlzIGNvc3QgaXMgc2F0dXJhdGVkLgorICAgIGJvb2wgaXNTYXR1cmF0ZWQoKSBjb25zdDsKKworICBwdWJsaWM6CisgICAgLy8vIENyZWF0ZSBhIE1hcHBpbmdDb3N0IGFzc3VtaW5nIHRoYXQgbW9zdCBvZiB0aGUgaW5zdHJ1Y3Rpb25zCisgICAgLy8vIHdpbGwgb2NjdXIgaW4gYSBiYXNpYyBibG9jayB3aXRoIFxwIExvY2FsRnJlcSBmcmVxdWVuY3kuCisgICAgTWFwcGluZ0Nvc3QoY29uc3QgQmxvY2tGcmVxdWVuY3kgJkxvY2FsRnJlcSk7CisKKyAgICAvLy8gQWRkIFxwIENvc3QgdG8gdGhlIGxvY2FsIGNvc3QuCisgICAgLy8vIFxyZXR1cm4gdHJ1ZSBpZiB0aGlzIGNvc3QgaXMgc2F0dXJhdGVkLCBmYWxzZSBvdGhlcndpc2UuCisgICAgYm9vbCBhZGRMb2NhbENvc3QodWludDY0X3QgQ29zdCk7CisKKyAgICAvLy8gQWRkIFxwIENvc3QgdG8gdGhlIG5vbi1sb2NhbCBjb3N0LgorICAgIC8vLyBOb24tbG9jYWwgY29zdCBzaG91bGQgcmVmbGVjdCB0aGUgZnJlcXVlbmN5IG9mIHRoZWlyIHBsYWNlbWVudC4KKyAgICAvLy8gXHJldHVybiB0cnVlIGlmIHRoaXMgY29zdCBpcyBzYXR1cmF0ZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICBib29sIGFkZE5vbkxvY2FsQ29zdCh1aW50NjRfdCBDb3N0KTsKKworICAgIC8vLyBTYXR1cmF0ZSB0aGUgY29zdCB0byB0aGUgbWF4aW1hbCByZXByZXNlbnRhYmxlIHZhbHVlLgorICAgIHZvaWQgc2F0dXJhdGUoKTsKKworICAgIC8vLyBSZXR1cm4gYW4gaW5zdGFuY2Ugb2YgTWFwcGluZ0Nvc3QgdGhhdCByZXByZXNlbnRzIGFuCisgICAgLy8vIGltcG9zc2libGUgbWFwcGluZy4KKyAgICBzdGF0aWMgTWFwcGluZ0Nvc3QgSW1wb3NzaWJsZUNvc3QoKTsKKworICAgIC8vLyBDaGVjayBpZiB0aGlzIGlzIGxlc3MgdGhhbiBccCBDb3N0LgorICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE1hcHBpbmdDb3N0ICZDb3N0KSBjb25zdDsKKyAgICAvLy8gQ2hlY2sgaWYgdGhpcyBpcyBlcXVhbCB0byBccCBDb3N0LgorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXBwaW5nQ29zdCAmQ29zdCkgY29uc3Q7CisgICAgLy8vIENoZWNrIGlmIHRoaXMgaXMgbm90IGVxdWFsIHRvIFxwIENvc3QuCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1hcHBpbmdDb3N0ICZDb3N0KSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IENvc3QpOyB9CisgICAgLy8vIENoZWNrIGlmIHRoaXMgaXMgZ3JlYXRlciB0aGFuIFxwIENvc3QuCisgICAgYm9vbCBvcGVyYXRvcj4oY29uc3QgTWFwcGluZ0Nvc3QgJkNvc3QpIGNvbnN0IHsKKyAgICAgIHJldHVybiAqdGhpcyAhPSBDb3N0ICYmIENvc3QgPCAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gUHJpbnQgdGhpcyBvbiBkYmdzKCkgc3RyZWFtLgorICAgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgICAgLy8vIFByaW50IHRoaXMgb24gXHAgT1M7CisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgICAgLy8vIE92ZXJsb2FkIHRoZSBzdHJlYW0gb3BlcmF0b3IgZm9yIGVhc3kgZGVidWcgcHJpbnRpbmcuCisgICAgZnJpZW5kIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTWFwcGluZ0Nvc3QgJkNvc3QpIHsKKyAgICAgIENvc3QucHJpbnQoT1MpOworICAgICAgcmV0dXJuIE9TOworICAgIH0KKyAgfTsKKworICAvLy8gSW50ZXJmYWNlIHRvIHRoZSB0YXJnZXQgbG93ZXJpbmcgaW5mbyByZWxhdGVkCisgIC8vLyB0byByZWdpc3RlciBiYW5rcy4KKyAgY29uc3QgUmVnaXN0ZXJCYW5rSW5mbyAqUkJJID0gbnVsbHB0cjsKKworICAvLy8gTVJJIGNvbnRhaW5zIGFsbCB0aGUgcmVnaXN0ZXIgY2xhc3MvYmFuayBpbmZvcm1hdGlvbiB0aGF0IHRoaXMKKyAgLy8vIHBhc3MgdXNlcyBhbmQgdXBkYXRlcy4KKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJID0gbnVsbHB0cjsKKworICAvLy8gSW5mb3JtYXRpb24gb24gdGhlIHJlZ2lzdGVyIGNsYXNzZXMgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSA9IG51bGxwdHI7CisKKyAgLy8vIEdldCB0aGUgZnJlcXVlbmN5IG9mIGJsb2Nrcy4KKyAgLy8vIFRoaXMgaXMgcmVxdWlyZWQgZm9yIG5vbi1mYXN0IG1vZGUuCisgIE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8gKk1CRkkgPSBudWxscHRyOworCisgIC8vLyBHZXQgdGhlIGZyZXF1ZW5jeSBvZiB0aGUgZWRnZXMuCisgIC8vLyBUaGlzIGlzIHJlcXVpcmVkIGZvciBub24tZmFzdCBtb2RlLgorICBNYWNoaW5lQnJhbmNoUHJvYmFiaWxpdHlJbmZvICpNQlBJID0gbnVsbHB0cjsKKworICAvLy8gQ3VycmVudCBvcHRpbWl6YXRpb24gcmVtYXJrIGVtaXR0ZXIuIFVzZWQgdG8gcmVwb3J0IGZhaWx1cmVzLgorICBzdGQ6OnVuaXF1ZV9wdHI8TWFjaGluZU9wdGltaXphdGlvblJlbWFya0VtaXR0ZXI+IE1PUkU7CisKKyAgLy8vIEhlbHBlciBjbGFzcyB1c2VkIGZvciBldmVyeSBjb2RlIG1vcnBoaW5nLgorICBNYWNoaW5lSVJCdWlsZGVyIE1JUkJ1aWxkZXI7CisKKyAgLy8vIE9wdGltaXphdGlvbiBtb2RlIG9mIHRoZSBwYXNzLgorICBNb2RlIE9wdE1vZGU7CisKKyAgLy8vIEN1cnJlbnQgdGFyZ2V0IGNvbmZpZ3VyYXRpb24uIENvbnRyb2xzIGhvdyB0aGUgcGFzcyBoYW5kbGVzIGVycm9ycy4KKyAgY29uc3QgVGFyZ2V0UGFzc0NvbmZpZyAqVFBDOworCisgIC8vLyBBc3NpZ24gdGhlIHJlZ2lzdGVyIGJhbmsgb2YgZWFjaCBvcGVyYW5kIG9mIFxwIE1JLgorICAvLy8gXHJldHVybiBUcnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBhc3NpZ25JbnN0cihNYWNoaW5lSW5zdHIgJk1JKTsKKworICAvLy8gSW5pdGlhbGl6ZSB0aGUgZmllbGQgbWVtYmVycyB1c2luZyBccCBNRi4KKyAgdm9pZCBpbml0KE1hY2hpbmVGdW5jdGlvbiAmTUYpOworCisgIC8vLyBDaGVjayBpZiBccCBSZWcgaXMgYWxyZWFkeSBhc3NpZ25lZCB3aGF0IGlzIGRlc2NyaWJlZCBieSBccCBWYWxNYXBwaW5nLgorICAvLy8gXHAgT25seUFzc2lnbiA9PSB0cnVlIG1lYW5zIHRoYXQgXHAgUmVnIGp1c3QgbmVlZHMgdG8gYmUgYXNzaWduZWQgYQorICAvLy8gcmVnaXN0ZXIgYmFuay4gIEkuZS4sIG5vIHJlcGFpcmluZyBpcyBuZWNlc3NhcnkgdG8gaGF2ZSB0aGUKKyAgLy8vIGFzc2lnbm1lbnQgbWF0Y2guCisgIGJvb2wgYXNzaWdubWVudE1hdGNoKHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVnaXN0ZXJCYW5rSW5mbzo6VmFsdWVNYXBwaW5nICZWYWxNYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICBib29sICZPbmx5QXNzaWduKSBjb25zdDsKKworICAvLy8gSW5zZXJ0IHJlcGFpcmluZyBjb2RlIGZvciBccCBSZWcgYXMgc3BlY2lmaWVkIGJ5IFxwIFZhbE1hcHBpbmcuCisgIC8vLyBUaGUgcmVwYWlyaW5nIHBsYWNlbWVudCBpcyBzcGVjaWZpZWQgYnkgXHAgUmVwYWlyUHQuCisgIC8vLyBccCBOZXdWUmVncyBjb250YWlucyBhbGwgdGhlIHJlZ2lzdGVycyByZXF1aXJlZCB0byByZW1hcCBccCBSZWcuCisgIC8vLyBJbiBvdGhlciB3b3JkcywgdGhlIG51bWJlciBvZiByZWdpc3RlcnMgaW4gTmV3VlJlZ3MgbXVzdCBiZSBlcXVhbAorICAvLy8gdG8gVmFsTWFwcGluZy5CcmVha0Rvd24uc2l6ZSgpLgorICAvLy8KKyAgLy8vIFRoZSB0cmFuc2Zvcm1hdGlvbiBjb3VsZCBiZSBza2V0Y2hlZCBhczoKKyAgLy8vIFxjb2RlCisgIC8vLyAuLi4gPSBvcCBSZWcKKyAgLy8vIFxlbmRjb2RlCisgIC8vLyBCZWNvbWVzCisgIC8vLyBcY29kZQorICAvLy8gPE5ld1JlZ3M+ID0gQ09QWSBvciBleHRyYWN0IFJlZworICAvLy8gLi4uID0gb3AgUmVnCisgIC8vLyBcZW5kY29kZQorICAvLy8KKyAgLy8vIGFuZAorICAvLy8gXGNvZGUKKyAgLy8vIFJlZyA9IG9wIC4uLgorICAvLy8gXGVuZGNvZGUKKyAgLy8vIEJlY29tZXMKKyAgLy8vIFxjb2RlCisgIC8vLyBSZWcgPSBvcCAuLi4KKyAgLy8vIFJlZyA9IENPUFkgb3IgYnVpbGRfc2VxdWVuY2UgPE5ld1JlZ3M+CisgIC8vLyBcZW5kY29kZQorICAvLy8KKyAgLy8vIFxwcmUgTmV3VlJlZ3Muc2l6ZSgpID09IFZhbE1hcHBpbmcuQnJlYWtEb3duLnNpemUoKQorICAvLy8KKyAgLy8vIFxub3RlIFRoZSBjYWxsZXIgaXMgc3VwcG9zZWQgdG8gZG8gdGhlIHJld3JpdGluZyBvZiBvcCBpZiBuZWVkIGJlLgorICAvLy8gSS5lLiwgUmVnID0gb3AgLi4uID0+IDxOZXdSZWdzPiA9IE5ld09wIC4uLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVHJ1ZSBpZiB0aGUgcmVwYWlyaW5nIHdvcmtlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIHJlcGFpclJlZyhNYWNoaW5lT3BlcmFuZCAmTU8sCisgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ2lzdGVyQmFua0luZm86OlZhbHVlTWFwcGluZyAmVmFsTWFwcGluZywKKyAgICAgICAgICAgICAgICAgUmVnQmFua1NlbGVjdDo6UmVwYWlyaW5nUGxhY2VtZW50ICZSZXBhaXJQdCwKKyAgICAgICAgICAgICAgICAgY29uc3QgaXRlcmF0b3JfcmFuZ2U8U21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPjo6Y29uc3RfaXRlcmF0b3I+CisgICAgICAgICAgICAgICAgICAgICAmTmV3VlJlZ3MpOworCisgIC8vLyBSZXR1cm4gdGhlIGNvc3Qgb2YgdGhlIGluc3RydWN0aW9uIG5lZWRlZCB0byBtYXAgXHAgTU8gdG8gXHAgVmFsTWFwcGluZy4KKyAgLy8vIFRoZSBjb3N0IGlzIGZyZWUgb2YgYmFzaWMgYmxvY2sgZnJlcXVlbmNpZXMuCisgIC8vLyBccHJlIE1PLmlzUmVnKCkKKyAgLy8vIFxwcmUgTU8gaXMgYXNzaWduZWQgdG8gYSByZWdpc3RlciBiYW5rLgorICAvLy8gXHByZSBWYWxNYXBwaW5nIGlzIGEgdmFsaWQgbWFwcGluZyBmb3IgTU8uCisgIHVpbnQ2NF90CisgIGdldFJlcGFpckNvc3QoY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PLAorICAgICAgICAgICAgICAgIGNvbnN0IFJlZ2lzdGVyQmFua0luZm86OlZhbHVlTWFwcGluZyAmVmFsTWFwcGluZykgY29uc3Q7CisKKyAgLy8vIEZpbmQgdGhlIGJlc3QgbWFwcGluZyBmb3IgXHAgTUkgZnJvbSBccCBQb3NzaWJsZU1hcHBpbmdzLgorICAvLy8gXHJldHVybiBhIHJlZmVyZW5jZSBvbiB0aGUgYmVzdCBtYXBwaW5nIGluIFxwIFBvc3NpYmxlTWFwcGluZ3MuCisgIGNvbnN0IFJlZ2lzdGVyQmFua0luZm86Okluc3RydWN0aW9uTWFwcGluZyAmCisgIGZpbmRCZXN0TWFwcGluZyhNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgUmVnaXN0ZXJCYW5rSW5mbzo6SW5zdHJ1Y3Rpb25NYXBwaW5ncyAmUG9zc2libGVNYXBwaW5ncywKKyAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxSZXBhaXJpbmdQbGFjZW1lbnQ+ICZSZXBhaXJQdHMpOworCisgIC8vLyBDb21wdXRlIHRoZSBjb3N0IG9mIG1hcHBpbmcgXHAgTUkgd2l0aCBccCBJbnN0ck1hcHBpbmcgYW5kCisgIC8vLyBjb21wdXRlIHRoZSByZXBhaXJpbmcgcGxhY2VtZW50IGZvciBzdWNoIG1hcHBpbmcgaW4gXHAKKyAgLy8vIFJlcGFpclB0cy4KKyAgLy8vIFxwIEJlc3RDb3N0IGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVuIHRoZSBjb3N0IGJlY29tZXMgdG9vIGhpZ2gKKyAgLy8vIGFuZCB0aHVzIGl0IGlzIG5vdCB3b3J0aCBjb21wdXRpbmcgdGhlIFJlcGFpclB0cy4gIE1vcmVvdmVyIGlmCisgIC8vLyBccCBCZXN0Q29zdCA9PSBudWxscHRyLCB0aGUgbWFwcGluZyBjb3N0IGlzIGFjdHVhbGx5IG5vdAorICAvLy8gY29tcHV0ZWQuCisgIE1hcHBpbmdDb3N0CisgIGNvbXB1dGVNYXBwaW5nKE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ2lzdGVyQmFua0luZm86Okluc3RydWN0aW9uTWFwcGluZyAmSW5zdHJNYXBwaW5nLAorICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8UmVwYWlyaW5nUGxhY2VtZW50PiAmUmVwYWlyUHRzLAorICAgICAgICAgICAgICAgICBjb25zdCBNYXBwaW5nQ29zdCAqQmVzdENvc3QgPSBudWxscHRyKTsKKworICAvLy8gV2hlbiBccCBSZXBhaXJQdCBpbnZvbHZlcyBzcGxpdHRpbmcgdG8gcmVwYWlyIFxwIE1PIGZvciB0aGUKKyAgLy8vIGdpdmVuIFxwIFZhbE1hcHBpbmcsIHRyeSB0byBjaGFuZ2UgdGhlIHdheSB3ZSByZXBhaXIgc3VjaCB0aGF0CisgIC8vLyB0aGUgc3BsaXR0aW5nIGlzIG5vdCByZXF1aXJlZCBhbnltb3JlLgorICAvLy8KKyAgLy8vIFxwcmUgXHAgUmVwYWlyUHQuaGFzU3BsaXQoKQorICAvLy8gXHByZSBccCBNTyA9PSBNTy5nZXRQYXJlbnQoKS0+Z2V0T3BlcmFuZChccCBSZXBhaXJQdC5nZXRPcElkeCgpKQorICAvLy8gXHByZSBccCBWYWxNYXBwaW5nIGlzIHRoZSBtYXBwaW5nIG9mIFxwIE1PIGZvciBNTy5nZXRQYXJlbnQoKQorICAvLy8gICAgICB0aGF0IGltcGxpZWQgXHAgUmVwYWlyUHQuCisgIHZvaWQgdHJ5QXZvaWRpbmdTcGxpdChSZWdCYW5rU2VsZWN0OjpSZXBhaXJpbmdQbGFjZW1lbnQgJlJlcGFpclB0LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVnaXN0ZXJCYW5rSW5mbzo6VmFsdWVNYXBwaW5nICZWYWxNYXBwaW5nKSBjb25zdDsKKworICAvLy8gQXBwbHkgXHAgTWFwcGluZyB0byBccCBNSS4gXHAgUmVwYWlyUHRzIHJlcHJlc2VudHMgdGhlIGRpZmZlcmVudAorICAvLy8gbWFwcGluZyBhY3Rpb24gdGhhdCBuZWVkIHRvIGhhcHBlbiBmb3IgdGhlIG1hcHBpbmcgdG8gYmUKKyAgLy8vIGFwcGxpZWQuCisgIC8vLyBccmV0dXJuIFRydWUgaWYgdGhlIG1hcHBpbmcgd2FzIGFwcGxpZWQgc3VjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBhcHBseU1hcHBpbmcoTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVnaXN0ZXJCYW5rSW5mbzo6SW5zdHJ1Y3Rpb25NYXBwaW5nICZJbnN0ck1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxSZXBhaXJpbmdQbGFjZW1lbnQ+ICZSZXBhaXJQdHMpOworCitwdWJsaWM6CisgIC8vLyBDcmVhdGUgYSBSZWdCYW5rU2VsZWN0IHBhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkIFxwIFJ1bm5pbmdNb2RlLgorICBSZWdCYW5rU2VsZWN0KE1vZGUgUnVubmluZ01vZGUgPSBGYXN0KTsKKworICBTdHJpbmdSZWYgZ2V0UGFzc05hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAiUmVnQmFua1NlbGVjdCI7IH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworCisgIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgZ2V0UmVxdWlyZWRQcm9wZXJ0aWVzKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzKCkKKyAgICAgICAgLnNldChNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzOjpQcm9wZXJ0eTo6SXNTU0EpCisgICAgICAgIC5zZXQoTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllczo6UHJvcGVydHk6OkxlZ2FsaXplZCk7CisgIH0KKworICBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzIGdldFNldFByb3BlcnRpZXMoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMoKS5zZXQoCisgICAgICAgIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXM6OlByb3BlcnR5OjpSZWdCYW5rU2VsZWN0ZWQpOworICB9CisKKyAgLy8vIFdhbGsgdGhyb3VnaCBccCBNRiBhbmQgYXNzaWduIGEgcmVnaXN0ZXIgYmFuayB0byBldmVyeSB2aXJ0dWFsIHJlZ2lzdGVyCisgIC8vLyB0aGF0IGFyZSBzdGlsbCBtYXBwZWQgdG8gbm90aGluZy4KKyAgLy8vIFRoZSB0YXJnZXQgbmVlZHMgdG8gcHJvdmlkZSBhIFJlZ2lzdGVyQmFua0luZm8gYW5kIGluIHBhcnRpY3VsYXIKKyAgLy8vIG92ZXJyaWRlIFJlZ2lzdGVyQmFua0luZm86OmdldEluc3RyTWFwcGluZy4KKyAgLy8vCisgIC8vLyBTaW1wbGlmaWVkIGFsZ286CisgIC8vLyBcY29kZQorICAvLy8gICBSQkkgPSBNRi5zdWJ0YXJnZXQuZ2V0UmVnQmFua0luZm8oKQorICAvLy8gICBNSVJCdWlsZGVyLnNldE1GKE1GKQorICAvLy8gICBmb3IgZWFjaCBiYiBpbiBNRgorICAvLy8gICAgIGZvciBlYWNoIGluc3QgaW4gYmIKKyAgLy8vICAgICAgIE1JUkJ1aWxkZXIuc2V0SW5zdHIoaW5zdCkKKyAgLy8vICAgICAgIE1hcHBpbmdDb3N0cyA9IFJCSS5nZXRNYXBwaW5nKGluc3QpOworICAvLy8gICAgICAgSWR4ID0gZmluZElkeE9mTWluQ29zdChNYXBwaW5nQ29zdHMpCisgIC8vLyAgICAgICBDdXJSZWdCYW5rID0gTWFwcGluZ0Nvc3RzW0lkeF0uUmVnQmFuaworICAvLy8gICAgICAgTVJJLnNldFJlZ0JhbmsoaW5zdC5nZXRPcGVyYW5kKDApLmdldFJlZygpLCBDdXJSZWdCYW5rKQorICAvLy8gICAgICAgZm9yIGVhY2ggYXJndW1lbnQgaW4gaW5zdAorICAvLy8gICAgICAgICBpZiAoQ3VyUmVnQmFuayAhPSBhcmd1bWVudC5SZWdCYW5rKQorICAvLy8gICAgICAgICAgIEFyZ1JlZyA9IGFyZ3VtZW50LmdldFJlZygpCisgIC8vLyAgICAgICAgICAgVG1wID0gTVJJLmNyZWF0ZU5ld1ZpcnR1YWwoTVJJLmdldFNpemUoQXJnUmVnKSwgQ3VyUmVnQmFuaykKKyAgLy8vICAgICAgICAgICBNSVJCdWlsZGVyLmJ1aWxkSW5zdHIoQ09QWSwgVG1wLCBBcmdSZWcpCisgIC8vLyAgICAgICAgICAgaW5zdC5nZXRPcGVyYW5kKGFyZ3VtZW50LmdldE9wZXJhbmRObygpKS5zZXRSZWcoVG1wKQorICAvLy8gXGVuZGNvZGUKKyAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKSBvdmVycmlkZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9SRUdCQU5LU0VMRUNUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL1JlZ2lzdGVyQmFuay5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvUmVnaXN0ZXJCYW5rLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWQ3NTg0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL1JlZ2lzdGVyQmFuay5oCkBAIC0wLDAgKzEsOTkgQEAKKy8vPT0tLSBsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9SZWdpc3RlckJhbmsuaCAtIFJlZ2lzdGVyIEJhbmsgLS0tLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgQVBJIG9mIHJlZ2lzdGVyIGJhbmtzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfUkVHQkFOS19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX1JFR0JBTktfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKy8vIEZvcndhcmQgZGVjbGFyYXRpb25zLgorY2xhc3MgUmVnaXN0ZXJCYW5rSW5mbzsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJDbGFzczsKK2NsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKKworLy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgcmVnaXN0ZXIgYmFuayBjb25jZXB0LgorLy8vIFR3byBpbnN0YW5jZXMgb2YgUmVnaXN0ZXJCYW5rIG11c3QgaGF2ZSBkaWZmZXJlbnQgSUQuCisvLy8gVGhpcyBwcm9wZXJ0eSBpcyBlbmZvcmNlZCBieSB0aGUgUmVnaXN0ZXJCYW5rSW5mbyBjbGFzcy4KK2NsYXNzIFJlZ2lzdGVyQmFuayB7Citwcml2YXRlOgorICB1bnNpZ25lZCBJRDsKKyAgY29uc3QgY2hhciAqTmFtZTsKKyAgdW5zaWduZWQgU2l6ZTsKKyAgQml0VmVjdG9yIENvbnRhaW5lZFJlZ0NsYXNzZXM7CisKKyAgLy8vIFNlbnRpbmVsIHZhbHVlIHVzZWQgdG8gcmVjb2duaXplIHJlZ2lzdGVyIGJhbmsgbm90IHByb3Blcmx5CisgIC8vLyBpbml0aWFsaXplZCB5ZXQuCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBJbnZhbGlkSUQ7CisKKyAgLy8vIE9ubHkgdGhlIFJlZ2lzdGVyQmFua0luZm8gY2FuIGluaXRpYWxpemUgUmVnaXN0ZXJCYW5rIHByb3Blcmx5LgorICBmcmllbmQgUmVnaXN0ZXJCYW5rSW5mbzsKKworcHVibGljOgorICBSZWdpc3RlckJhbmsodW5zaWduZWQgSUQsIGNvbnN0IGNoYXIgKk5hbWUsIHVuc2lnbmVkIFNpemUsCisgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCAqQ29udGFpbmVkUmVnQ2xhc3NlcywgdW5zaWduZWQgTnVtUmVnQ2xhc3Nlcyk7CisKKyAgLy8vIEdldCB0aGUgaWRlbnRpZmllciBvZiB0aGlzIHJlZ2lzdGVyIGJhbmsuCisgIHVuc2lnbmVkIGdldElEKCkgY29uc3QgeyByZXR1cm4gSUQ7IH0KKworICAvLy8gR2V0IGEgdXNlciBmcmllbmRseSBuYW1lIG9mIHRoaXMgcmVnaXN0ZXIgYmFuay4KKyAgLy8vIFNob3VsZCBiZSB1c2VkIG9ubHkgZm9yIGRlYnVnZ2luZyBwdXJwb3Nlcy4KKyAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICAvLy8gR2V0IHRoZSBtYXhpbWFsIHNpemUgaW4gYml0cyB0aGF0IGZpdHMgaW4gdGhpcyByZWdpc3RlciBiYW5rLgorICB1bnNpZ25lZCBnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gU2l6ZTsgfQorCisgIC8vLyBDaGVjayB3aGV0aGVyIHRoaXMgaW5zdGFuY2UgaXMgcmVhZHkgdG8gYmUgdXNlZC4KKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3Q7CisKKyAgLy8vIENoZWNrIGlmIHRoaXMgcmVnaXN0ZXIgYmFuayBpcyB2YWxpZC4gSW4gb3RoZXIgd29yZHMsCisgIC8vLyBpZiBpdCBoYXMgYmVlbiBwcm9wZXJseSBjb25zdHJ1Y3RlZC4KKyAgLy8vCisgIC8vLyBcbm90ZSBUaGlzIG1ldGhvZCBkb2VzIG5vdCBjaGVjayBhbnl0aGluZyB3aGVuIGFzc2VydGlvbnMgYXJlIGRpc2FibGVkLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVHJ1ZSBpcyB0aGUgY2hlY2sgd2FzIHN1Y2Nlc3NmdWwuCisgIGJvb2wgdmVyaWZ5KGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJKSBjb25zdDsKKworICAvLy8gQ2hlY2sgd2hldGhlciB0aGlzIHJlZ2lzdGVyIGJhbmsgY292ZXJzIFxwIFJDLgorICAvLy8gSW4gb3RoZXIgd29yZHMsIGNoZWNrIGlmIHRoaXMgcmVnaXN0ZXIgYmFuayBmdWxseSBjb3ZlcnMKKyAgLy8vIHRoZSByZWdpc3RlcnMgdGhhdCBccCBSQyBjb250YWlucy4KKyAgLy8vIFxwcmUgaXNWYWxpZCgpCisgIGJvb2wgY292ZXJzKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgJlJDKSBjb25zdDsKKworICAvLy8gQ2hlY2sgd2hldGhlciBccCBPdGhlclJCIGlzIHRoZSBzYW1lIGFzIHRoaXMuCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZWdpc3RlckJhbmsgJk90aGVyUkIpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgUmVnaXN0ZXJCYW5rICZPdGhlclJCKSBjb25zdCB7CisgICAgcmV0dXJuICF0aGlzLT5vcGVyYXRvcj09KE90aGVyUkIpOworICB9CisKKyAgLy8vIER1bXAgdGhlIHJlZ2lzdGVyIG1hc2sgb24gZGJncygpIHN0cmVhbS4KKyAgLy8vIFRoZSBkdW1wIGlzIHZlcmJvc2UuCisgIHZvaWQgZHVtcChjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBQcmludCB0aGUgcmVnaXN0ZXIgbWFzayBvbiBPUy4KKyAgLy8vIElmIElzRm9yRGVidWcgaXMgZmFsc2UsIHRoZW4gb25seSB0aGUgbmFtZSBvZiB0aGUgcmVnaXN0ZXIgYmFuaworICAvLy8gaXMgcHJpbnRlZC4gT3RoZXJ3aXNlLCBhbGwgdGhlIGZpZWxkcyBhcmUgcHJpbnRpbmcuCisgIC8vLyBUUkkgaXMgdGhlbiB1c2VkIHRvIHByaW50IHRoZSBuYW1lIG9mIHRoZSByZWdpc3RlciBjbGFzc2VzIHRoYXQKKyAgLy8vIHRoaXMgcmVnaXN0ZXIgYmFuayBjb3ZlcnMuCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBib29sIElzRm9yRGVidWcgPSBmYWxzZSwKKyAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSA9IG51bGxwdHIpIGNvbnN0OworfTsKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgUmVnaXN0ZXJCYW5rICZSZWdCYW5rKSB7CisgIFJlZ0JhbmsucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9Cit9IC8vIEVuZCBuYW1lc3BhY2UgbGx2bS4KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9SZWdpc3RlckJhbmtJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9SZWdpc3RlckJhbmtJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJmZDdlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL1JlZ2lzdGVyQmFua0luZm8uaApAQCAtMCwwICsxLDc1NyBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL1JlZ2lzdGVyQmFua0luZm8uaCAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBBUEkgZm9yIHRoZSByZWdpc3RlciBiYW5rIGluZm8uCisvLy8gVGhpcyBBUEkgaXMgcmVzcG9uc2libGUgZm9yIGhhbmRsaW5nIHRoZSByZWdpc3RlciBiYW5rcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX1JFR0lTVEVSQkFOS0lORk9fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9SRUdJU1RFUkJBTktJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSGFzaGluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8aW5pdGlhbGl6ZXJfbGlzdD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgUmVnaXN0ZXJCYW5rOworY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJDbGFzczsKK2NsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKKworLy8vIEhvbGRzIGFsbCB0aGUgaW5mb3JtYXRpb24gcmVsYXRlZCB0byByZWdpc3RlciBiYW5rcy4KK2NsYXNzIFJlZ2lzdGVyQmFua0luZm8geworcHVibGljOgorICAvLy8gSGVscGVyIHN0cnVjdCB0aGF0IHJlcHJlc2VudHMgaG93IGEgdmFsdWUgaXMgcGFydGlhbGx5IG1hcHBlZAorICAvLy8gaW50byBhIHJlZ2lzdGVyLgorICAvLy8gVGhlIFN0YXJ0SWR4IGFuZCBMZW5ndGggcmVwcmVzZW50IHdoYXQgcmVnaW9uIG9mIHRoZSBvcmdpbmFsCisgIC8vLyB2YWx1ZSB0aGlzIHBhcnRpYWwgbWFwcGluZyBjb3ZlcnMuCisgIC8vLyBUaGlzIGNhbiBiZSByZXByZXNlbnRlZCBhcyBhIE1hc2sgb2YgY29udGlndW91cyBiaXQgc3RhcnRpbmcKKyAgLy8vIGF0IFN0YXJ0SWR4IGJpdCBhbmQgc3Bhbm5pbmcgTGVuZ3RoIGJpdHMuCisgIC8vLyBTdGFydElkeCBpcyB0aGUgbnVtYmVyIG9mIGJpdHMgZnJvbSB0aGUgbGVzcyBzaWduaWZpY2FudCBiaXRzLgorICBzdHJ1Y3QgUGFydGlhbE1hcHBpbmcgeworICAgIC8vLyBOdW1iZXIgb2YgYml0cyBhdCB3aGljaCB0aGlzIHBhcnRpYWwgbWFwcGluZyBzdGFydHMgaW4gdGhlCisgICAgLy8vIG9yaWdpbmFsIHZhbHVlLiAgVGhlIGJpdHMgYXJlIGNvdW50ZWQgZnJvbSBsZXNzIHNpZ25pZmljYW50CisgICAgLy8vIGJpdHMgdG8gbW9zdCBzaWduaWZpY2FudCBiaXRzLgorICAgIHVuc2lnbmVkIFN0YXJ0SWR4OworCisgICAgLy8vIExlbmd0aCBvZiB0aGlzIG1hcHBpbmcgaW4gYml0cy4gVGhpcyBpcyBob3cgbWFueSBiaXRzIHRoaXMKKyAgICAvLy8gcGFydGlhbCBtYXBwaW5nIGNvdmVycyBpbiB0aGUgb3JpZ2luYWwgdmFsdWU6CisgICAgLy8vIGZyb20gU3RhcnRJZHggdG8gU3RhcnRJZHggKyBMZW5ndGggLTEuCisgICAgdW5zaWduZWQgTGVuZ3RoOworCisgICAgLy8vIFJlZ2lzdGVyIGJhbmsgd2hlcmUgdGhlIHBhcnRpYWwgdmFsdWUgbGl2ZXMuCisgICAgY29uc3QgUmVnaXN0ZXJCYW5rICpSZWdCYW5rOworCisgICAgUGFydGlhbE1hcHBpbmcoKSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gUHJvdmlkZSBhIHNob3J0Y3V0IGZvciBxdWlja2x5IGJ1aWxkaW5nIFBhcnRpYWxNYXBwaW5nLgorICAgIFBhcnRpYWxNYXBwaW5nKHVuc2lnbmVkIFN0YXJ0SWR4LCB1bnNpZ25lZCBMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgY29uc3QgUmVnaXN0ZXJCYW5rICZSZWdCYW5rKQorICAgICAgICA6IFN0YXJ0SWR4KFN0YXJ0SWR4KSwgTGVuZ3RoKExlbmd0aCksIFJlZ0JhbmsoJlJlZ0JhbmspIHt9CisKKyAgICAvLy8gXHJldHVybiB0aGUgaW5kZXggb2YgaW4gdGhlIG9yaWdpbmFsIHZhbHVlIG9mIHRoZSBtb3N0CisgICAgLy8vIHNpZ25pZmljYW50IGJpdCB0aGF0IHRoaXMgcGFydGlhbCBtYXBwaW5nIGNvdmVycy4KKyAgICB1bnNpZ25lZCBnZXRIaWdoQml0SWR4KCkgY29uc3QgeyByZXR1cm4gU3RhcnRJZHggKyBMZW5ndGggLSAxOyB9CisKKyAgICAvLy8gUHJpbnQgdGhpcyBwYXJ0aWFsIG1hcHBpbmcgb24gZGJncygpIHN0cmVhbS4KKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAgIC8vLyBQcmludCB0aGlzIHBhcnRpYWwgbWFwcGluZyBvbiBccCBPUzsKKyAgICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgICAvLy8gQ2hlY2sgdGhhdCB0aGUgTWFzayBpcyBjb21wYXRpYmxlIHdpdGggdGhlIFJlZ0JhbmsuCisgICAgLy8vIEluZGVlZCwgaWYgdGhlIFJlZ0JhbmsgY2Fubm90IGFjY29tYWRhdGUgdGhlICJhY3RpdmUgYml0cyIgb2YgdGhlIG1hc2ssCisgICAgLy8vIHRoZXJlIGlzIG5vIHdheSB0aGlzIG1hcHBpbmcgaXMgdmFsaWQuCisgICAgLy8vCisgICAgLy8vIFxub3RlIFRoaXMgbWV0aG9kIGRvZXMgbm90IGNoZWNrIGFueXRoaW5nIHdoZW4gYXNzZXJ0aW9ucyBhcmUgZGlzYWJsZWQuCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm4gVHJ1ZSBpcyB0aGUgY2hlY2sgd2FzIHN1Y2Nlc3NmdWwuCisgICAgYm9vbCB2ZXJpZnkoKSBjb25zdDsKKyAgfTsKKworICAvLy8gSGVscGVyIHN0cnVjdCB0aGF0IHJlcHJlc2VudHMgaG93IGEgdmFsdWUgaXMgbWFwcGVkIHRocm91Z2gKKyAgLy8vIGRpZmZlcmVudCByZWdpc3RlciBiYW5rcy4KKyAgLy8vCisgIC8vLyBcbm90ZTogU28gZmFyIHdlIGRvIG5vdCBoYXZlIGFueSB1c2VycyBvZiB0aGUgY29tcGxleCBtYXBwaW5ncworICAvLy8gKG1hcHBpbmdzIHdpdGggbW9yZSB0aGFuIG9uZSBwYXJ0aWFsIG1hcHBpbmcpLCBidXQgd2hlbiB3ZSBkbywKKyAgLy8vIHdlIHdvdWxkIGhhdmUgbmVlZGVkIHRvIGR1cGxpY2F0ZSBwYXJ0aWFsIG1hcHBpbmdzLgorICAvLy8gVGhlIGFsdGVybmF0aXZlIGNvdWxkIGJlIHRvIHVzZSBhbiBhcnJheSBvZiBwb2ludGVycyBvZiBwYXJ0aWFsCisgIC8vLyBtYXBwaW5nIChpLmUuLCBQYXJ0aWFsTWFwcGluZyAqKkJyZWFrRG93bikgYW5kIGR1cGxpY2F0ZSB0aGUKKyAgLy8vIHBvaW50ZXJzIGluc3RlYWQuCisgIC8vLworICAvLy8gRS5nLiwKKyAgLy8vIExldCBzYXkgd2UgaGF2ZSBhIDMyLWJpdCBhZGQgYW5kIGEgPDIgeCAzMi1iaXQ+IHZhZGQuIFdlCisgIC8vLyBjYW4gZXhwYW5kIHRoZQorICAvLy8gPDIgeCAzMi1iaXQ+IGFkZCBpbnRvIDIgeCAzMi1iaXQgYWRkLgorICAvLy8KKyAgLy8vIEN1cnJlbnRseSB0aGUgVGFibGVHZW4tbGlrZSBmaWxlIHdvdWxkIGxvb2sgbGlrZToKKyAgLy8vIFxjb2RlCisgIC8vLyBQYXJ0aWFsTWFwcGluZ1tdID0geworICAvLy8gLyozMi1iaXQgYWRkKi8gezAsIDMyLCBHUFJ9LAorICAvLy8gLyoyeDMyLWJpdCBhZGQqLyB7MCwgMzIsIEdQUn0sIHswLCAzMiwgR1BSfSwgLy8gPC0tIFNhbWUgZW50cnkgM3gKKyAgLy8vIC8qPDJ4MzItYml0PiB2YWRkIHswLCA2NCwgVlBSfQorICAvLy8gfTsgLy8gUGFydGlhbE1hcHBpbmcgZHVwbGljYXRlZC4KKyAgLy8vCisgIC8vLyBWYWx1ZU1hcHBpbmdbXSB7CisgIC8vLyAgIC8qcGxhaW4gMzItYml0IGFkZCovIHsmUGFydGlhbE1hcHBpbmdbMF0sIDF9LAorICAvLy8gICAvKmV4cGFuZGVkIHZhZGQgb24gMnhhZGQqLyB7JlBhcnRpYWxNYXBwaW5nWzFdLCAyfSwKKyAgLy8vICAgLypwbGFpbiA8MngzMi1iaXQ+IHZhZGQqLyB7JlBhcnRpYWxNYXBwaW5nWzNdLCAxfQorICAvLy8gfTsKKyAgLy8vIFxlbmRjb2RlCisgIC8vLworICAvLy8gV2l0aCB0aGUgYXJyYXkgb2YgcG9pbnRlciwgd2Ugd291bGQgaGF2ZToKKyAgLy8vIFxjb2RlCisgIC8vLyBQYXJ0aWFsTWFwcGluZ1tdID0geworICAvLy8gLyozMi1iaXQgYWRkKi8gezAsIDMyLCBHUFJ9LAorICAvLy8gLyo8MngzMi1iaXQ+IHZhZGQgezAsIDY0LCBWUFJ9CisgIC8vLyB9OyAvLyBObyBtb3JlIGR1cGxpY2F0aW9uLgorICAvLy8KKyAgLy8vIEJyZWFrRG93bnNbXSA9IHsKKyAgLy8vIC8qQWRkQnJlYWtEb3duKi8gJlBhcnRpYWxNYXBwaW5nWzBdLAorICAvLy8gLyoyeEFkZEJyZWFrRG93biovICZQYXJ0aWFsTWFwcGluZ1swXSwgJlBhcnRpYWxNYXBwaW5nWzBdLAorICAvLy8gLypWQWRkQnJlYWtEb3duKi8gJlBhcnRpYWxNYXBwaW5nWzFdCisgIC8vLyB9OyAvLyBBZGRyZXNzZXMgb2YgUGFydGlhbE1hcHBpbmcgZHVwbGljYXRlZCAoc21hbGxlcikuCisgIC8vLworICAvLy8gVmFsdWVNYXBwaW5nW10geworICAvLy8gICAvKnBsYWluIDMyLWJpdCBhZGQqLyB7JkJyZWFrRG93bnNbMF0sIDF9LAorICAvLy8gICAvKmV4cGFuZGVkIHZhZGQgb24gMnhhZGQqLyB7JkJyZWFrRG93bnNbMV0sIDJ9LAorICAvLy8gICAvKnBsYWluIDwyeDMyLWJpdD4gdmFkZCovIHsmQnJlYWtEb3duc1szXSwgMX0KKyAgLy8vIH07CisgIC8vLyBcZW5kY29kZQorICAvLy8KKyAgLy8vIEdpdmVuIHRoYXQgYSBQYXJ0aWFsTWFwcGluZyBpcyBhY3R1YWxseSBzbWFsbCwgdGhlIGNvZGUgc2l6ZQorICAvLy8gaW1wYWN0IGlzIGFjdHVhbGx5IGEgZGVncmFkYXRpb24uIE1vcmVvdmVyIHRoZSBjb21waWxlIHRpbWUgd2lsbAorICAvLy8gYmUgaGl0IGJ5IHRoZSBhZGRpdGlvbmFsIGluZGlyZWN0aW9uLgorICAvLy8gSWYgUGFydGlhbE1hcHBpbmcgZ2V0cyBiaWdnZXIgd2UgbWF5IHJlY29uc2lkZXIuCisgIHN0cnVjdCBWYWx1ZU1hcHBpbmcgeworICAgIC8vLyBIb3cgdGhlIHZhbHVlIGlzIGJyb2tlbiBkb3duIGJldHdlZW4gdGhlIGRpZmZlcmVudCByZWdpc3RlciBiYW5rcy4KKyAgICBjb25zdCBQYXJ0aWFsTWFwcGluZyAqQnJlYWtEb3duOworCisgICAgLy8vIE51bWJlciBvZiBwYXJ0aWFsIG1hcHBpbmcgdG8gYnJlYWsgZG93biB0aGlzIHZhbHVlLgorICAgIHVuc2lnbmVkIE51bUJyZWFrRG93bnM7CisKKyAgICAvLy8gVGhlIGRlZmF1bHQgY29uc3RydWN0b3IgY3JlYXRlcyBhbiBpbnZhbGlkIChpc1ZhbGlkKCkgPT0gZmFsc2UpCisgICAgLy8vIGluc3RhbmNlLgorICAgIFZhbHVlTWFwcGluZygpIDogVmFsdWVNYXBwaW5nKG51bGxwdHIsIDApIHt9CisKKyAgICAvLy8gSW5pdGlhbGl6ZSBhIFZhbHVlTWFwcGluZyB3aXRoIHRoZSBnaXZlbiBwYXJhbWV0ZXIuCisgICAgLy8vIFxwIEJyZWFrRG93biBuZWVkcyB0byBoYXZlIGEgbGlmZSB0aW1lIGF0IGxlYXN0IGFzIGxvbmcKKyAgICAvLy8gYXMgdGhpcyBpbnN0YW5jZS4KKyAgICBWYWx1ZU1hcHBpbmcoY29uc3QgUGFydGlhbE1hcHBpbmcgKkJyZWFrRG93biwgdW5zaWduZWQgTnVtQnJlYWtEb3ducykKKyAgICAgICAgOiBCcmVha0Rvd24oQnJlYWtEb3duKSwgTnVtQnJlYWtEb3ducyhOdW1CcmVha0Rvd25zKSB7fQorCisgICAgLy8vIEl0ZXJhdG9ycyB0aHJvdWdoIHRoZSBQYXJ0aWFsTWFwcGluZ3MuCisgICAgY29uc3QgUGFydGlhbE1hcHBpbmcgKmJlZ2luKCkgY29uc3QgeyByZXR1cm4gQnJlYWtEb3duOyB9CisgICAgY29uc3QgUGFydGlhbE1hcHBpbmcgKmVuZCgpIGNvbnN0IHsgcmV0dXJuIEJyZWFrRG93biArIE51bUJyZWFrRG93bnM7IH0KKworICAgIC8vLyBDaGVjayBpZiB0aGlzIFZhbHVlTWFwcGluZyBpcyB2YWxpZC4KKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBCcmVha0Rvd24gJiYgTnVtQnJlYWtEb3duczsgfQorCisgICAgLy8vIFZlcmlmeSB0aGF0IHRoaXMgbWFwcGluZyBtYWtlcyBzZW5zZSBmb3IgYSB2YWx1ZSBvZgorICAgIC8vLyBccCBNZWFuaW5nZnVsQml0V2lkdGguCisgICAgLy8vIFxub3RlIFRoaXMgbWV0aG9kIGRvZXMgbm90IGNoZWNrIGFueXRoaW5nIHdoZW4gYXNzZXJ0aW9ucyBhcmUgZGlzYWJsZWQuCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm4gVHJ1ZSBpcyB0aGUgY2hlY2sgd2FzIHN1Y2Nlc3NmdWwuCisgICAgYm9vbCB2ZXJpZnkodW5zaWduZWQgTWVhbmluZ2Z1bEJpdFdpZHRoKSBjb25zdDsKKworICAgIC8vLyBQcmludCB0aGlzIG9uIGRiZ3MoKSBzdHJlYW0uCisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgICAvLy8gUHJpbnQgdGhpcyBvbiBccCBPUzsKKyAgICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIH07CisKKyAgLy8vIEhlbHBlciBjbGFzcyB0aGF0IHJlcHJlc2VudHMgaG93IHRoZSB2YWx1ZSBvZiBhbiBpbnN0cnVjdGlvbiBtYXkgYmUKKyAgLy8vIG1hcHBlZCBhbmQgd2hhdCBpcyB0aGUgcmVsYXRlZCBjb3N0IG9mIHN1Y2ggbWFwcGluZy4KKyAgY2xhc3MgSW5zdHJ1Y3Rpb25NYXBwaW5nIHsKKyAgICAvLy8gSWRlbnRpZmllciBvZiB0aGUgbWFwcGluZy4KKyAgICAvLy8gVGhpcyBpcyB1c2VkIHRvIGNvbW11bmljYXRlIGJldHdlZW4gdGhlIHRhcmdldCBhbmQgdGhlIG9wdGltaXplcnMKKyAgICAvLy8gd2hpY2ggbWFwcGluZyBzaG91bGQgYmUgcmVhbGl6ZWQuCisgICAgdW5zaWduZWQgSUQgPSBJbnZhbGlkTWFwcGluZ0lEOworCisgICAgLy8vIENvc3Qgb2YgdGhpcyBtYXBwaW5nLgorICAgIHVuc2lnbmVkIENvc3QgPSAwOworCisgICAgLy8vIE1hcHBpbmcgb2YgYWxsIHRoZSBvcGVyYW5kcy4KKyAgICBjb25zdCBWYWx1ZU1hcHBpbmcgKk9wZXJhbmRzTWFwcGluZzsKKworICAgIC8vLyBOdW1iZXIgb2Ygb3BlcmFuZHMuCisgICAgdW5zaWduZWQgTnVtT3BlcmFuZHMgPSAwOworCisgICAgY29uc3QgVmFsdWVNYXBwaW5nICZnZXRPcGVyYW5kTWFwcGluZyh1bnNpZ25lZCBpKSB7CisgICAgICBhc3NlcnQoaSA8IGdldE51bU9wZXJhbmRzKCkgJiYgIk91dCBvZiBib3VuZCBvcGVyYW5kIik7CisgICAgICByZXR1cm4gT3BlcmFuZHNNYXBwaW5nW2ldOworICAgIH0KKworICBwdWJsaWM6CisgICAgLy8vIENvbnN0cnVjdG9yIGZvciB0aGUgbWFwcGluZyBvZiBhbiBpbnN0cnVjdGlvbi4KKyAgICAvLy8gXHAgTnVtT3BlcmFuZHMgbXVzdCBiZSBlcXVhbCB0byBudW1iZXIgb2YgYWxsIHRoZSBvcGVyYW5kcyBvZgorICAgIC8vLyB0aGUgcmVsYXRlZCBpbnN0cnVjdGlvbi4KKyAgICAvLy8gVGhlIHJhdGlvbmFsZSBpcyB0aGF0IGl0IGlzIG1vcmUgZWZmaWNpZW50IGZvciB0aGUgb3B0aW1pemVycworICAgIC8vLyB0byBiZSBhYmxlIHRvIGFzc3VtZSB0aGF0IHRoZSBtYXBwaW5nIG9mIHRoZSBpdGggb3BlcmFuZCBpcworICAgIC8vLyBhdCB0aGUgaW5kZXggaS4KKyAgICAvLy8KKyAgICAvLy8gXHByZSBJRCAhPSBJbnZhbGlkTWFwcGluZ0lECisgICAgSW5zdHJ1Y3Rpb25NYXBwaW5nKHVuc2lnbmVkIElELCB1bnNpZ25lZCBDb3N0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZU1hcHBpbmcgKk9wZXJhbmRzTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtT3BlcmFuZHMpCisgICAgICAgIDogSUQoSUQpLCBDb3N0KENvc3QpLCBPcGVyYW5kc01hcHBpbmcoT3BlcmFuZHNNYXBwaW5nKSwKKyAgICAgICAgICBOdW1PcGVyYW5kcyhOdW1PcGVyYW5kcykgeworICAgICAgYXNzZXJ0KGdldElEKCkgIT0gSW52YWxpZE1hcHBpbmdJRCAmJgorICAgICAgICAgICAgICJVc2UgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgZm9yIGludmFsaWQgbWFwcGluZyIpOworICAgIH0KKworICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICAgIC8vLyBVc2UgdGhpcyBjb25zdHJ1Y3RvciB0byBleHByZXNzIHRoYXQgdGhlIG1hcHBpbmcgaXMgaW52YWxpZC4KKyAgICBJbnN0cnVjdGlvbk1hcHBpbmcoKSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gR2V0IHRoZSBjb3N0LgorICAgIHVuc2lnbmVkIGdldENvc3QoKSBjb25zdCB7IHJldHVybiBDb3N0OyB9CisKKyAgICAvLy8gR2V0IHRoZSBJRC4KKyAgICB1bnNpZ25lZCBnZXRJRCgpIGNvbnN0IHsgcmV0dXJuIElEOyB9CisKKyAgICAvLy8gR2V0IHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMuCisgICAgdW5zaWduZWQgZ2V0TnVtT3BlcmFuZHMoKSBjb25zdCB7IHJldHVybiBOdW1PcGVyYW5kczsgfQorCisgICAgLy8vIEdldCB0aGUgdmFsdWUgbWFwcGluZyBvZiB0aGUgaXRoIG9wZXJhbmQuCisgICAgLy8vIFxwcmUgVGhlIG1hcHBpbmcgZm9yIHRoZSBpdGggb3BlcmFuZCBoYXMgYmVlbiBzZXQuCisgICAgLy8vIFxwcmUgVGhlIGl0aCBvcGVyYW5kIGlzIGEgcmVnaXN0ZXIuCisgICAgY29uc3QgVmFsdWVNYXBwaW5nICZnZXRPcGVyYW5kTWFwcGluZyh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgICBjb25zdCBWYWx1ZU1hcHBpbmcgJlZhbE1hcHBpbmcgPQorICAgICAgICAgIGNvbnN0X2Nhc3Q8SW5zdHJ1Y3Rpb25NYXBwaW5nICo+KHRoaXMpLT5nZXRPcGVyYW5kTWFwcGluZyhpKTsKKyAgICAgIHJldHVybiBWYWxNYXBwaW5nOworICAgIH0KKworICAgIC8vLyBTZXQgdGhlIG1hcHBpbmcgZm9yIGFsbCB0aGUgb3BlcmFuZHMuCisgICAgLy8vIEluIG90aGVyIHdvcmRzLCBPcGRzTWFwcGluZyBzaG91bGQgaG9sZCBhdCBsZWFzdCBnZXROdW1PcGVyYW5kcworICAgIC8vLyBWYWx1ZU1hcHBpbmcuCisgICAgdm9pZCBzZXRPcGVyYW5kc01hcHBpbmcoY29uc3QgVmFsdWVNYXBwaW5nICpPcGRzTWFwcGluZykgeworICAgICAgT3BlcmFuZHNNYXBwaW5nID0gT3Bkc01hcHBpbmc7CisgICAgfQorCisgICAgLy8vIENoZWNrIHdoZXRoZXIgdGhpcyBvYmplY3QgaXMgdmFsaWQuCisgICAgLy8vIFRoaXMgaXMgYSBsaWdodHdlaWdodCBjaGVjayBmb3Igb2J2aW91cyB3cm9uZyBpbnN0YW5jZS4KKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0SUQoKSAhPSBJbnZhbGlkTWFwcGluZ0lEICYmIE9wZXJhbmRzTWFwcGluZzsKKyAgICB9CisKKyAgICAvLy8gVmVyaWZpeSB0aGF0IHRoaXMgbWFwcGluZyBtYWtlcyBzZW5zZSBmb3IgXHAgTUkuCisgICAgLy8vIFxwcmUgXHAgTUkgbXVzdCBiZSBjb25uZWN0ZWQgdG8gYSBNYWNoaW5lRnVuY3Rpb24uCisgICAgLy8vCisgICAgLy8vIFxub3RlIFRoaXMgbWV0aG9kIGRvZXMgbm90IGNoZWNrIGFueXRoaW5nIHdoZW4gYXNzZXJ0aW9ucyBhcmUgZGlzYWJsZWQuCisgICAgLy8vCisgICAgLy8vIFxyZXR1cm4gVHJ1ZSBpcyB0aGUgY2hlY2sgd2FzIHN1Y2Nlc3NmdWwuCisgICAgYm9vbCB2ZXJpZnkoY29uc3QgTWFjaGluZUluc3RyICZNSSkgY29uc3Q7CisKKyAgICAvLy8gUHJpbnQgdGhpcyBvbiBkYmdzKCkgc3RyZWFtLgorICAgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgICAgLy8vIFByaW50IHRoaXMgb24gXHAgT1M7CisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB9OworCisgIC8vLyBDb252ZW5pZW50IHR5cGUgdG8gcmVwcmVzZW50IHRoZSBhbHRlcm5hdGl2ZXMgZm9yIG1hcHBpbmcgYW4KKyAgLy8vIGluc3RydWN0aW9uLgorICAvLy8gXHRvZG8gV2hlbiB3ZSBtb3ZlIHRvIFRhYmxlR2VuIHRoaXMgc2hvdWxkIGJlIGFuIGFycmF5IHJlZi4KKyAgdXNpbmcgSW5zdHJ1Y3Rpb25NYXBwaW5ncyA9IFNtYWxsVmVjdG9yPGNvbnN0IEluc3RydWN0aW9uTWFwcGluZyAqLCA0PjsKKworICAvLy8gSGVscGVyIGNsYXNzIHVzZWQgdG8gZ2V0L2NyZWF0ZSB0aGUgdmlydHVhbCByZWdpc3RlcnMgdGhhdCB3aWxsIGJlIHVzZWQKKyAgLy8vIHRvIHJlcGxhY2UgdGhlIE1hY2hpbmVPcGVyYW5kIHdoZW4gYXBwbHlpbmcgYSBtYXBwaW5nLgorICBjbGFzcyBPcGVyYW5kc01hcHBlciB7CisgICAgLy8vIFRoZSBPcElkeC10aCBjZWxsIGNvbnRhaW5zIHRoZSBpbmRleCBpbiBOZXdWUmVncyB3aGVyZSB0aGUgVlJlZ3Mgb2YgdGhlCisgICAgLy8vIE9wSWR4LXRoIG9wZXJhbmQgc3RhcnRzLiAtMSBtZWFucyB3ZSBkbyBub3QgaGF2ZSBzdWNoIG1hcHBpbmcgeWV0LgorICAgIC8vLyBOb3RlOiBXZSB1c2UgYSBTbWFsbFZlY3RvciB0byBhdm9pZCBoZWFwIGFsbG9jYXRpb24gZm9yIG1vc3QgY2FzZXMuCisgICAgU21hbGxWZWN0b3I8aW50LCA4PiBPcFRvTmV3VlJlZ0lkeDsKKworICAgIC8vLyBIb2xkIHRoZSByZWdpc3RlcnMgdGhhdCB3aWxsIGJlIHVzZWQgdG8gbWFwIE1JIHdpdGggSW5zdHJNYXBwaW5nLgorICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA4PiBOZXdWUmVnczsKKworICAgIC8vLyBDdXJyZW50IE1hY2hpbmVSZWdpc3RlckluZm8sIHVzZWQgdG8gY3JlYXRlIG5ldyB2aXJ0dWFsIHJlZ2lzdGVycy4KKyAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkk7CisKKyAgICAvLy8gSW5zdHJ1Y3Rpb24gYmVpbmcgcmVtYXBwZWQuCisgICAgTWFjaGluZUluc3RyICZNSTsKKworICAgIC8vLyBOZXcgbWFwcGluZyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgY29uc3QgSW5zdHJ1Y3Rpb25NYXBwaW5nICZJbnN0ck1hcHBpbmc7CisKKyAgICAvLy8gQ29uc3RhbnQgdmFsdWUgaWRlbnRpZnlpbmcgdGhhdCB0aGUgaW5kZXggaW4gT3BUb05ld1ZSZWdJZHgKKyAgICAvLy8gZm9yIGFuIG9wZXJhbmQgaGFzIG5vdCBiZWVuIHNldCB5ZXQuCisgICAgc3RhdGljIGNvbnN0IGludCBEb250S25vd0lkeDsKKworICAgIC8vLyBHZXQgdGhlIHJhbmdlIGluIE5ld1ZSZWdzIHRvIHN0b3JlIGFsbCB0aGUgcGFydGlhbAorICAgIC8vLyB2YWx1ZXMgZm9yIHRoZSBccCBPcElkeC10aCBvcGVyYW5kLgorICAgIC8vLworICAgIC8vLyBccmV0dXJuIFRoZSBpdGVyYXRvciByYW5nZSBmb3IgdGhlIHNwYWNlIGNyZWF0ZWQuCisgICAgLy8KKyAgICAvLy8gXHByZSBnZXRNSSgpLmdldE9wZXJhbmQoT3BJZHgpLmlzUmVnKCkKKyAgICBpdGVyYXRvcl9yYW5nZTxTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+OjppdGVyYXRvcj4KKyAgICBnZXRWUmVnc01lbSh1bnNpZ25lZCBPcElkeCk7CisKKyAgICAvLy8gR2V0IHRoZSBlbmQgaXRlcmF0b3IgZm9yIGEgcmFuZ2Ugc3RhcnRpbmcgYXQgXHAgU3RhcnRJZHggYW5kCisgICAgLy8vIHNwYW5uaWcgXHAgTnVtVmFsIGluIE5ld1ZSZWdzLgorICAgIC8vLyBccHJlIFN0YXJ0SWR4ICsgTnVtVmFsIDw9IE5ld1ZSZWdzLnNpemUoKQorICAgIFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD46OmNvbnN0X2l0ZXJhdG9yCisgICAgZ2V0TmV3VlJlZ3NFbmQodW5zaWduZWQgU3RhcnRJZHgsIHVuc2lnbmVkIE51bVZhbCkgY29uc3Q7CisgICAgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPjo6aXRlcmF0b3IgZ2V0TmV3VlJlZ3NFbmQodW5zaWduZWQgU3RhcnRJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtVmFsKTsKKworICBwdWJsaWM6CisgICAgLy8vIENyZWF0ZSBhbiBPcGVyYW5kc01hcHBlciB0aGF0IHdpbGwgaG9sZCB0aGUgaW5mb3JtYXRpb24gdG8gYXBwbHkgXHAKKyAgICAvLy8gSW5zdHJNYXBwaW5nIHRvIFxwIE1JLgorICAgIC8vLyBccHJlIEluc3RyTWFwcGluZy52ZXJpZnkoTUkpCisgICAgT3BlcmFuZHNNYXBwZXIoTWFjaGluZUluc3RyICZNSSwgY29uc3QgSW5zdHJ1Y3Rpb25NYXBwaW5nICZJbnN0ck1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJKTsKKworICAgIC8vLyBcbmFtZSBHZXR0ZXJzLgorICAgIC8vLyBAeworICAgIC8vLyBUaGUgTWFjaGluZUluc3RyIGJlaW5nIHJlbWFwcGVkLgorICAgIE1hY2hpbmVJbnN0ciAmZ2V0TUkoKSBjb25zdCB7IHJldHVybiBNSTsgfQorCisgICAgLy8vIFRoZSBmaW5hbCBtYXBwaW5nIG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgICBjb25zdCBJbnN0cnVjdGlvbk1hcHBpbmcgJmdldEluc3RyTWFwcGluZygpIGNvbnN0IHsgcmV0dXJuIEluc3RyTWFwcGluZzsgfQorCisgICAgLy8vIFRoZSBNYWNoaW5lUmVnaXN0ZXJJbmZvIHdlIHVzZWQgdG8gcmVhbGl6ZSB0aGUgbWFwcGluZy4KKyAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZnZXRNUkkoKSBjb25zdCB7IHJldHVybiBNUkk7IH0KKyAgICAvLy8gQH0KKworICAgIC8vLyBDcmVhdGUgYXMgbWFueSBuZXcgdmlydHVhbCByZWdpc3RlcnMgYXMgbmVlZGVkIGZvciB0aGUgbWFwcGluZyBvZiB0aGUgXHAKKyAgICAvLy8gT3BJZHgtdGggb3BlcmFuZC4KKyAgICAvLy8gVGhlIG51bWJlciBvZiByZWdpc3RlcnMgaXMgZGV0ZXJtaW5lZCBieSB0aGUgbnVtYmVyIG9mIGJyZWFrZG93biBmb3IgdGhlCisgICAgLy8vIHJlbGF0ZWQgb3BlcmFuZCBpbiB0aGUgaW5zdHJ1Y3Rpb24gbWFwcGluZy4KKyAgICAvLy8gVGhlIHR5cGUgb2YgdGhlIG5ldyByZWdpc3RlcnMgaXMgYSBwbGFpbiBzY2FsYXIgb2YgdGhlIHJpZ2h0IHNpemUuCisgICAgLy8vIFRoZSBwcm9wZXIgdHlwZSBpcyBleHBlY3RlZCB0byBiZSBzZXQgd2hlbiB0aGUgbWFwcGluZyBpcyBhcHBsaWVkIHRvCisgICAgLy8vIHRoZSBpbnN0cnVjdGlvbihzKSB0aGF0IHJlYWxpemVzIHRoZSBtYXBwaW5nLgorICAgIC8vLworICAgIC8vLyBccHJlIGdldE1JKCkuZ2V0T3BlcmFuZChPcElkeCkuaXNSZWcoKQorICAgIC8vLworICAgIC8vLyBccG9zdCBBbGwgdGhlIHBhcnRpYWwgbWFwcGluZyBvZiB0aGUgXHAgT3BJZHgtdGggb3BlcmFuZCBoYXZlIGJlZW4KKyAgICAvLy8gYXNzaWduZWQgYSBuZXcgdmlydHVhbCByZWdpc3Rlci4KKyAgICB2b2lkIGNyZWF0ZVZSZWdzKHVuc2lnbmVkIE9wSWR4KTsKKworICAgIC8vLyBTZXQgdGhlIHZpcnR1YWwgcmVnaXN0ZXIgb2YgdGhlIFxwIFBhcnRpYWxNYXBJZHgtdGggcGFydGlhbCBtYXBwaW5nIG9mCisgICAgLy8vIHRoZSBPcElkeC10aCBvcGVyYW5kIHRvIFxwIE5ld1ZSZWcuCisgICAgLy8vCisgICAgLy8vIFxwcmUgZ2V0TUkoKS5nZXRPcGVyYW5kKE9wSWR4KS5pc1JlZygpCisgICAgLy8vIFxwcmUgZ2V0SW5zdHJNYXBwaW5nKCkuZ2V0T3BlcmFuZE1hcHBpbmcoT3BJZHgpLkJyZWFrRG93bi5zaXplKCkgPgorICAgIC8vLyBQYXJ0aWFsTWFwSWR4CisgICAgLy8vIFxwcmUgTmV3UmVnICE9IDAKKyAgICAvLy8KKyAgICAvLy8gXHBvc3QgdGhlIFxwIFBhcnRpYWxNYXBJZHgtdGggcmVnaXN0ZXIgb2YgdGhlIHZhbHVlIG1hcHBpbmcgb2YgdGhlIFxwCisgICAgLy8vIE9wSWR4LXRoIG9wZXJhbmQgaGFzIGJlZW4gc2V0LgorICAgIHZvaWQgc2V0VlJlZ3ModW5zaWduZWQgT3BJZHgsIHVuc2lnbmVkIFBhcnRpYWxNYXBJZHgsIHVuc2lnbmVkIE5ld1ZSZWcpOworCisgICAgLy8vIEdldCBhbGwgdGhlIHZpcnR1YWwgcmVnaXN0ZXJzIHJlcXVpcmVkIHRvIG1hcCB0aGUgXHAgT3BJZHgtdGggb3BlcmFuZCBvZgorICAgIC8vLyB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgLy8vCisgICAgLy8vIFRoaXMgcmV0dXJuIGFuIGVtcHR5IHJhbmdlIHdoZW4gY3JlYXRlVlJlZ3Mgb3Igc2V0VlJlZ3MgaGFzIG5vdCBiZWVuCisgICAgLy8vIGNhbGxlZC4KKyAgICAvLy8gVGhlIGl0ZXJhdG9yIG1heSBiZSBpbnZhbGlkYXRlZCBieSBhIGNhbGwgdG8gc2V0VlJlZ3Mgb3IgY3JlYXRlVlJlZ3MuCisgICAgLy8vCisgICAgLy8vIFdoZW4gXHAgRm9yRGVidWcgaXMgdHJ1ZSwgd2Ugd2lsbCBub3QgY2hlY2sgdGhhdCB0aGUgbGlzdCBvZiBuZXcgdmlydHVhbAorICAgIC8vLyByZWdpc3RlcnMgZG9lcyBub3QgY29udGFpbiB1bmluaXRpYWxpemVkIHZhbHVlcy4KKyAgICAvLy8KKyAgICAvLy8gXHByZSBnZXRNSSgpLmdldE9wZXJhbmQoT3BJZHgpLmlzUmVnKCkKKyAgICAvLy8gXHByZSBGb3JEZWJ1ZyB8fCBBbGwgcGFydGlhbCBtYXBwaW5ncyBoYXZlIGJlZW4gc2V0IGEgcmVnaXN0ZXIKKyAgICBpdGVyYXRvcl9yYW5nZTxTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+Ojpjb25zdF9pdGVyYXRvcj4KKyAgICBnZXRWUmVncyh1bnNpZ25lZCBPcElkeCwgYm9vbCBGb3JEZWJ1ZyA9IGZhbHNlKSBjb25zdDsKKworICAgIC8vLyBQcmludCB0aGlzIG9wZXJhbmRzIG1hcHBlciBvbiBkYmdzKCkgc3RyZWFtLgorICAgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgICAgLy8vIFByaW50IHRoaXMgb3BlcmFuZHMgbWFwcGVyIG9uIFxwIE9TIHN0cmVhbS4KKyAgICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgYm9vbCBGb3JEZWJ1ZyA9IGZhbHNlKSBjb25zdDsKKyAgfTsKKworcHJvdGVjdGVkOgorICAvLy8gSG9sZCB0aGUgc2V0IG9mIHN1cHBvcnRlZCByZWdpc3RlciBiYW5rcy4KKyAgUmVnaXN0ZXJCYW5rICoqUmVnQmFua3M7CisKKyAgLy8vIFRvdGFsIG51bWJlciBvZiByZWdpc3RlciBiYW5rcy4KKyAgdW5zaWduZWQgTnVtUmVnQmFua3M7CisKKyAgLy8vIEtlZXAgZHluYW1pY2FsbHkgYWxsb2NhdGVkIFBhcnRpYWxNYXBwaW5nIGluIGEgc2VwYXJhdGUgbWFwLgorICAvLy8gVGhpcyBzaG91bGRuJ3QgYmUgbmVlZGVkIHdoZW4gZXZlcnl0aGluZyBnZXRzIFRhYmxlR2VuJ2VkLgorICBtdXRhYmxlIERlbnNlTWFwPHVuc2lnbmVkLCBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgUGFydGlhbE1hcHBpbmc+PgorICAgICAgTWFwT2ZQYXJ0aWFsTWFwcGluZ3M7CisKKyAgLy8vIEtlZXAgZHluYW1pY2FsbHkgYWxsb2NhdGVkIFZhbHVlTWFwcGluZyBpbiBhIHNlcGFyYXRlIG1hcC4KKyAgLy8vIFRoaXMgc2hvdWxkbid0IGJlIG5lZWRlZCB3aGVuIGV2ZXJ5dGhpbmcgZ2V0cyBUYWJsZUdlbidlZC4KKyAgbXV0YWJsZSBEZW5zZU1hcDx1bnNpZ25lZCwgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IFZhbHVlTWFwcGluZz4+CisgICAgICBNYXBPZlZhbHVlTWFwcGluZ3M7CisKKyAgLy8vIEtlZXAgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGFycmF5IG9mIFZhbHVlTWFwcGluZyBpbiBhIHNlcGFyYXRlIG1hcC4KKyAgLy8vIFRoaXMgc2hvdWxkbid0IGJlIG5lZWRlZCB3aGVuIGV2ZXJ5dGhpbmcgZ2V0cyBUYWJsZUdlbidlZC4KKyAgbXV0YWJsZSBEZW5zZU1hcDx1bnNpZ25lZCwgc3RkOjp1bmlxdWVfcHRyPFZhbHVlTWFwcGluZ1tdPj4KKyAgICAgIE1hcE9mT3BlcmFuZHNNYXBwaW5nczsKKworICAvLy8gS2VlcCBkeW5hbWljYWxseSBhbGxvY2F0ZWQgSW5zdHJ1Y3Rpb25NYXBwaW5nIGluIGEgc2VwYXJhdGUgbWFwLgorICAvLy8gVGhpcyBzaG91bGRuJ3QgYmUgbmVlZGVkIHdoZW4gZXZlcnl0aGluZyBnZXRzIFRhYmxlR2VuJ2VkLgorICBtdXRhYmxlIERlbnNlTWFwPHVuc2lnbmVkLCBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgSW5zdHJ1Y3Rpb25NYXBwaW5nPj4KKyAgICAgIE1hcE9mSW5zdHJ1Y3Rpb25NYXBwaW5nczsKKworICAvLy8gR2V0dGluZyB0aGUgbWluaW1hbCByZWdpc3RlciBjbGFzcyBvZiBhIHBoeXNyZWcgaXMgZXhwZW5zaXZlLgorICAvLy8gQ2FjaGUgdGhpcyBpbmZvcm1hdGlvbiBhcyB3ZSBnZXQgaXQuCisgIG11dGFibGUgRGVuc2VNYXA8dW5zaWduZWQsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKj4gUGh5c1JlZ01pbmltYWxSQ3M7CisKKyAgLy8vIENyZWF0ZSBhIFJlZ2lzdGVyQmFua0luZm8gdGhhdCBjYW4gYWNjb21tb2RhdGUgdXAgdG8gXHAgTnVtUmVnQmFua3MKKyAgLy8vIFJlZ2lzdGVyQmFuayBpbnN0YW5jZXMuCisgIFJlZ2lzdGVyQmFua0luZm8oUmVnaXN0ZXJCYW5rICoqUmVnQmFua3MsIHVuc2lnbmVkIE51bVJlZ0JhbmtzKTsKKworICAvLy8gVGhpcyBjb25zdHJ1Y3RvciBpcyBtZWFuaW5nbGVzcy4KKyAgLy8vIEl0IGp1c3QgcHJvdmlkZXMgYSBkZWZhdWx0IGNvbnN0cnVjdG9yIHRoYXQgY2FuIGJlIHVzZWQgYXQgbGluayB0aW1lCisgIC8vLyB3aGVuIEdsb2JhbElTZWwgaXMgbm90IGJ1aWx0LgorICAvLy8gVGhhdCB3YXksIHRhcmdldHMgY2FuIHN0aWxsIGluaGVyaXQgZnJvbSB0aGlzIGNsYXNzIHdpdGhvdXQgZG9pbmcKKyAgLy8vIGNyYXp5IGd5bW5hc3RpYyB0byBhdm9pZCBsaW5rIHRpbWUgZmFpbHVyZXMuCisgIC8vLyBcbm90ZSBUaGF0IHdvcmtzIGJlY2F1c2UgdGhlIGNvbnN0cnVjdG9yIGlzIGlubGluZWQuCisgIFJlZ2lzdGVyQmFua0luZm8oKSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgbm90IGJlIGV4ZWN1dGVkIik7CisgIH0KKworICAvLy8gR2V0IHRoZSByZWdpc3RlciBiYW5rIGlkZW50aWZpZWQgYnkgXHAgSUQuCisgIFJlZ2lzdGVyQmFuayAmZ2V0UmVnQmFuayh1bnNpZ25lZCBJRCkgeworICAgIGFzc2VydChJRCA8IGdldE51bVJlZ0JhbmtzKCkgJiYgIkFjY2Vzc2luZyBhbiB1bmtub3duIHJlZ2lzdGVyIGJhbmsiKTsKKyAgICByZXR1cm4gKlJlZ0JhbmtzW0lEXTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIE1pbmltYWxQaHlzUmVnQ2xhc3MgZm9yIFJlZy4KKyAgLy8vIFxwcmUgUmVnIGlzIGEgcGh5c2ljYWwgcmVnaXN0ZXIuCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgJgorICBnZXRNaW5pbWFsUGh5c1JlZ0NsYXNzKHVuc2lnbmVkIFJlZywgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkkpIGNvbnN0OworCisgIC8vLyBUcnkgdG8gZ2V0IHRoZSBtYXBwaW5nIG9mIFxwIE1JLgorICAvLy8gU2VlIGdldEluc3RyTWFwcGluZyBmb3IgbW9yZSBkZXRhaWxzIG9uIHdoYXQgYSBtYXBwaW5nIHJlcHJlc2VudHMuCisgIC8vLworICAvLy8gVW5saWtlIGdldEluc3RyTWFwcGluZyB0aGUgcmV0dXJuZWQgSW5zdHJ1Y3Rpb25NYXBwaW5nIG1heSBiZSBpbnZhbGlkCisgIC8vLyAoaXNWYWxpZCgpID09IGZhbHNlKS4KKyAgLy8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgdGFyZ2V0IGluZGVwZW5kZW50IGNvZGUgaXMgbm90IHNtYXJ0IGVub3VnaAorICAvLy8gdG8gZ2V0IHRoZSBtYXBwaW5nIG9mIFxwIE1JIGFuZCB0aHVzLCB0aGUgdGFyZ2V0IGhhcyB0byBwcm92aWRlIHRoZQorICAvLy8gaW5mb3JtYXRpb24gZm9yIFxwIE1JLgorICAvLy8KKyAgLy8vIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgYWJsZSB0byBnZXQgdGhlIG1hcHBpbmcgb2Y6CisgIC8vLyAtIFRhcmdldCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgYnkgbG9va2luZyBhdCB0aGUgZW5jb2RpbmcgY29uc3RyYWludHMuCisgIC8vLyAtIEFueSBpbnN0cnVjdGlvbiBpZiBhbGwgdGhlIHJlZ2lzdGVyIG9wZXJhbmRzIGhhdmUgYWxyZWFkeSBiZWVuIGFzc2lnbmVkCisgIC8vLyAgIGEgcmVnaXN0ZXIsIGEgcmVnaXN0ZXIgY2xhc3MsIG9yIGEgcmVnaXN0ZXIgYmFuay4KKyAgLy8vIC0gQ29waWVzIGFuZCBwaGlzIGlmIGF0IGxlYXN0IG9uZSBvZiB0aGUgb3BlcmFuZHMgaGFzIGJlZW4gYXNzaWduZWQgYQorICAvLy8gICByZWdpc3RlciwgYSByZWdpc3RlciBjbGFzcywgb3IgYSByZWdpc3RlciBiYW5rLgorICAvLy8gSW4gb3RoZXIgd29yZHMsIHRoaXMgbWV0aG9kIHdpbGwgbGlrZWx5IGZhaWwgdG8gZmluZCBhIG1hcHBpbmcgZm9yCisgIC8vLyBhbnkgZ2VuZXJpYyBvcGNvZGUgdGhhdCBoYXMgbm90IGJlZW4gbG93ZXJlZCBieSB0YXJnZXQgc3BlY2lmaWMgY29kZS4KKyAgY29uc3QgSW5zdHJ1Y3Rpb25NYXBwaW5nICZnZXRJbnN0ck1hcHBpbmdJbXBsKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIHVuaXF1ZWx5IGdlbmVyYXRlZCBQYXJ0aWFsTWFwcGluZyBmb3IgdGhlCisgIC8vLyBnaXZlbiBhcmd1bWVudHMuCisgIGNvbnN0IFBhcnRpYWxNYXBwaW5nICZnZXRQYXJ0aWFsTWFwcGluZyh1bnNpZ25lZCBTdGFydElkeCwgdW5zaWduZWQgTGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVnaXN0ZXJCYW5rICZSZWdCYW5rKSBjb25zdDsKKworICAvLy8gXG5hbWUgTWV0aG9kcyB0byBnZXQgYSB1bmlxdWVseSBnZW5lcmF0ZWQgVmFsdWVNYXBwaW5nLgorICAvLy8gQHsKKworICAvLy8gVGhlIG1vc3QgY29tbW9uIFZhbHVlTWFwcGluZyBjb25zaXN0cyBvZiBhIHNpbmdsZSBQYXJ0aWFsTWFwcGluZy4KKyAgLy8vIEZlYXR1cmUgYSBtZXRob2QgZm9yIHRoYXQuCisgIGNvbnN0IFZhbHVlTWFwcGluZyAmZ2V0VmFsdWVNYXBwaW5nKHVuc2lnbmVkIFN0YXJ0SWR4LCB1bnNpZ25lZCBMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ2lzdGVyQmFuayAmUmVnQmFuaykgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgVmFsdWVNYXBwaW5nIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnRzLgorICBjb25zdCBWYWx1ZU1hcHBpbmcgJmdldFZhbHVlTWFwcGluZyhjb25zdCBQYXJ0aWFsTWFwcGluZyAqQnJlYWtEb3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1CcmVha0Rvd25zKSBjb25zdDsKKyAgLy8vIEB9CisKKyAgLy8vIFxuYW1lIE1ldGhvZHMgdG8gZ2V0IGEgdW5pcXVlbHkgZ2VuZXJhdGVkIGFycmF5IG9mIFZhbHVlTWFwcGluZy4KKyAgLy8vIEB7CisKKyAgLy8vIEdldCB0aGUgdW5pcXVlbHkgZ2VuZXJhdGVkIGFycmF5IG9mIFZhbHVlTWFwcGluZyBmb3IgdGhlCisgIC8vLyBlbGVtZW50cyBvZiBiZXR3ZWVuIFxwIEJlZ2luIGFuZCBccCBFbmQuCisgIC8vLworICAvLy8gRWxlbWVudHMgdGhhdCBhcmUgbnVsbHB0ciB3aWxsIGJlIHJlcGxhY2VkIGJ5CisgIC8vLyBpbnZhbGlkIFZhbHVlTWFwcGluZyAoVmFsdWVNYXBwaW5nOjppc1ZhbGlkID09IGZhbHNlKS4KKyAgLy8vCisgIC8vLyBccHJlIFRoZSBwb2ludGVycyBvbiBWYWx1ZU1hcHBpbmcgYmV0d2VlbiBccCBCZWdpbiBhbmQgXHAgRW5kCisgIC8vLyBtdXN0IHVuaXF1ZWx5IGlkZW50aWZ5IGEgVmFsdWVNYXBwaW5nLiBPdGhlcndpc2UsIHRoZXJlIGlzIG5vCisgIC8vLyBndWFyYW50ZWUgdGhhdCB0aGUgcmV0dXJuIGluc3RhbmNlIHdpbGwgYmUgdW5pcXVlLCBpLmUuLCBhbm90aGVyCisgIC8vLyBPcGVyYW5kc01hcHBpbmcgY291bGQgaGF2ZSB0aGUgc2FtZSBjb250ZW50LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcmF0b3I+CisgIGNvbnN0IFZhbHVlTWFwcGluZyAqZ2V0T3BlcmFuZHNNYXBwaW5nKEl0ZXJhdG9yIEJlZ2luLCBJdGVyYXRvciBFbmQpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIHVuaXF1ZWx5IGdlbmVyYXRlZCBhcnJheSBvZiBWYWx1ZU1hcHBpbmcgZm9yIHRoZQorICAvLy8gZWxlbWVudHMgb2YgXHAgT3Bkc01hcHBpbmcuCisgIC8vLworICAvLy8gRWxlbWVudHMgb2YgXHAgT3Bkc01hcHBpbmcgdGhhdCBhcmUgbnVsbHB0ciB3aWxsIGJlIHJlcGxhY2VkIGJ5CisgIC8vLyBpbnZhbGlkIFZhbHVlTWFwcGluZyAoVmFsdWVNYXBwaW5nOjppc1ZhbGlkID09IGZhbHNlKS4KKyAgY29uc3QgVmFsdWVNYXBwaW5nICpnZXRPcGVyYW5kc01hcHBpbmcoCisgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8Y29uc3QgVmFsdWVNYXBwaW5nICo+ICZPcGRzTWFwcGluZykgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgdW5pcXVlbHkgZ2VuZXJhdGVkIGFycmF5IG9mIFZhbHVlTWFwcGluZyBmb3IgdGhlCisgIC8vLyBnaXZlbiBhcmd1bWVudHMuCisgIC8vLworICAvLy8gQXJndW1lbnRzIHRoYXQgYXJlIG51bGxwdHIgd2lsbCBiZSByZXBsYWNlZCBieSBpbnZhbGlkCisgIC8vLyBWYWx1ZU1hcHBpbmcgKFZhbHVlTWFwcGluZzo6aXNWYWxpZCA9PSBmYWxzZSkuCisgIGNvbnN0IFZhbHVlTWFwcGluZyAqZ2V0T3BlcmFuZHNNYXBwaW5nKAorICAgICAgc3RkOjppbml0aWFsaXplcl9saXN0PGNvbnN0IFZhbHVlTWFwcGluZyAqPiBPcGRzTWFwcGluZykgY29uc3Q7CisgIC8vLyBAfQorCisgIC8vLyBcbmFtZSBNZXRob2RzIHRvIGdldCBhIHVuaXF1ZWx5IGdlbmVyYXRlZCBJbnN0cnVjdGlvbk1hcHBpbmcuCisgIC8vLyBAeworCitwcml2YXRlOgorICAvLy8gTWV0aG9kIHRvIGdldCBhIHVuaXF1ZWx5IGdlbmVyYXRlZCBJbnN0cnVjdGlvbk1hcHBpbmcuCisgIGNvbnN0IEluc3RydWN0aW9uTWFwcGluZyAmCisgIGdldEluc3RydWN0aW9uTWFwcGluZ0ltcGwoYm9vbCBJc0ludmFsaWQsIHVuc2lnbmVkIElEID0gSW52YWxpZE1hcHBpbmdJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb3N0ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWYWx1ZU1hcHBpbmcgKk9wZXJhbmRzTWFwcGluZyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtT3BlcmFuZHMgPSAwKSBjb25zdDsKKworcHVibGljOgorICAvLy8gTWV0aG9kIHRvIGdldCBhIHVuaXF1ZWx5IGdlbmVyYXRlZCBJbnN0cnVjdGlvbk1hcHBpbmcuCisgIGNvbnN0IEluc3RydWN0aW9uTWFwcGluZyAmCisgIGdldEluc3RydWN0aW9uTWFwcGluZyh1bnNpZ25lZCBJRCwgdW5zaWduZWQgQ29zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlTWFwcGluZyAqT3BlcmFuZHNNYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtT3BlcmFuZHMpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SW5zdHJ1Y3Rpb25NYXBwaW5nSW1wbCgvKklzSW52YWxpZCovIGZhbHNlLCBJRCwgQ29zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYW5kc01hcHBpbmcsIE51bU9wZXJhbmRzKTsKKyAgfQorCisgIC8vLyBNZXRob2QgdG8gZ2V0IGEgdW5pcXVlbHkgZ2VuZXJhdGVkIGludmFsaWQgSW5zdHJ1Y3Rpb25NYXBwaW5nLgorICBjb25zdCBJbnN0cnVjdGlvbk1hcHBpbmcgJmdldEludmFsaWRJbnN0cnVjdGlvbk1hcHBpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEluc3RydWN0aW9uTWFwcGluZ0ltcGwoLypJc0ludmFsaWQqLyB0cnVlKTsKKyAgfQorICAvLy8gQH0KKworICAvLy8gR2V0IHRoZSByZWdpc3RlciBiYW5rIGZvciB0aGUgXHAgT3BJZHgtdGggb3BlcmFuZCBvZiBccCBNSSBmb3JtCisgIC8vLyB0aGUgZW5jb2RpbmcgY29uc3RyYWludHMsIGlmIGFueS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIEEgcmVnaXN0ZXIgYmFuayB0aGF0IGNvdmVycyB0aGUgcmVnaXN0ZXIgY2xhc3Mgb2YgdGhlCisgIC8vLyByZWxhdGVkIGVuY29kaW5nIGNvbnN0cmFpbnRzIG9yIG51bGxwdHIgaWYgXHAgTUkgZGlkIG5vdCBwcm92aWRlCisgIC8vLyBlbm91Z2ggaW5mb3JtYXRpb24gdG8gZGVkdWNlIGl0LgorICBjb25zdCBSZWdpc3RlckJhbmsgKgorICBnZXRSZWdCYW5rRnJvbUNvbnN0cmFpbnRzKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksIHVuc2lnbmVkIE9wSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJKSBjb25zdDsKKworICAvLy8gSGVscGVyIG1ldGhvZCB0byBhcHBseSBzb21ldGhpbmcgdGhhdCBpcyBsaWtlIHRoZSBkZWZhdWx0IG1hcHBpbmcuCisgIC8vLyBCYXNpY2FsbHksIHRoYXQgbWVhbnMgdGhhdCBccCBPcGRNYXBwZXIuZ2V0TUkoKSBpcyBsZWZ0IHVudG91Y2hlZAorICAvLy8gYXNpZGUgZnJvbSB0aGUgcmVhc3NpZ25tZW50IG9mIHRoZSByZWdpc3RlciBvcGVyYW5kIHRoYXQgaGF2ZSBiZWVuCisgIC8vLyByZW1hcHBlZC4KKyAgLy8vCisgIC8vLyBUaGUgdHlwZSBvZiBhbGwgdGhlIG5ldyByZWdpc3RlcnMgdGhhdCBoYXZlIGJlZW4gY3JlYXRlZCBieSB0aGUKKyAgLy8vIG1hcHBlciBhcmUgcHJvcGVybHkgcmVtYXBwZWQgdG8gdGhlIHR5cGUgb2YgdGhlIG9yaWdpbmFsIHJlZ2lzdGVycworICAvLy8gdGhleSByZXBsYWNlLiBJbiBvdGhlciB3b3JkcywgdGhlIHNlbWFudGljIG9mIHRoZSBpbnN0cnVjdGlvbiBkb2VzCisgIC8vLyBub3QgY2hhbmdlLCBvbmx5IHRoZSByZWdpc3RlciBiYW5rcy4KKyAgLy8vCisgIC8vLyBJZiB0aGUgbWFwcGluZyBvZiBvbmUgb2YgdGhlIG9wZXJhbmQgc3BhbnMgc2V2ZXJhbCByZWdpc3RlcnMsIHRoaXMKKyAgLy8vIG1ldGhvZCB3aWxsIGFib3J0IGFzIHRoaXMgaXMgbm90IGxpa2UgYSBkZWZhdWx0IG1hcHBpbmcgYW55bW9yZS4KKyAgLy8vCisgIC8vLyBccHJlIEZvciBPcElkeCBpbiB7MC4uXHAgT3BkTWFwcGVyLmdldE1JKCkuZ2V0TnVtT3BlcmFuZHMoKSkKKyAgLy8vICAgICAgICB0aGUgcmFuZ2UgT3BkTWFwcGVyLmdldFZSZWdzKE9wSWR4KSBpcyBlbXB0eSBvciBvZiBzaXplIDEuCisgIHN0YXRpYyB2b2lkIGFwcGx5RGVmYXVsdE1hcHBpbmcoY29uc3QgT3BlcmFuZHNNYXBwZXIgJk9wZE1hcHBlcik7CisKKyAgLy8vIFNlZSA6OmFwcGx5TWFwcGluZy4KKyAgdmlydHVhbCB2b2lkIGFwcGx5TWFwcGluZ0ltcGwoY29uc3QgT3BlcmFuZHNNYXBwZXIgJk9wZE1hcHBlcikgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlRoZSB0YXJnZXQgaGFzIHRvIGltcGxlbWVudCB0aGF0IHBhcnQiKTsKKyAgfQorCitwdWJsaWM6CisgIHZpcnR1YWwgflJlZ2lzdGVyQmFua0luZm8oKSA9IGRlZmF1bHQ7CisKKyAgLy8vIEdldCB0aGUgcmVnaXN0ZXIgYmFuayBpZGVudGlmaWVkIGJ5IFxwIElELgorICBjb25zdCBSZWdpc3RlckJhbmsgJmdldFJlZ0JhbmsodW5zaWduZWQgSUQpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxSZWdpc3RlckJhbmtJbmZvICo+KHRoaXMpLT5nZXRSZWdCYW5rKElEKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIHJlZ2lzdGVyIGJhbmsgb2YgXHAgUmVnLgorICAvLy8gSWYgUmVnIGhhcyBub3QgYmVlbiBhc3NpZ25lZCBhIHJlZ2lzdGVyLCBhIHJlZ2lzdGVyIGNsYXNzLAorICAvLy8gb3IgYSByZWdpc3RlciBiYW5rLCB0aGVuIHRoaXMgcmV0dXJucyBudWxscHRyLgorICAvLy8KKyAgLy8vIFxwcmUgUmVnICE9IDAgKE5vUmVnaXN0ZXIpCisgIGNvbnN0IFJlZ2lzdGVyQmFuayAqZ2V0UmVnQmFuayh1bnNpZ25lZCBSZWcsIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgcmVnaXN0ZXIgYmFua3MuCisgIHVuc2lnbmVkIGdldE51bVJlZ0JhbmtzKCkgY29uc3QgeyByZXR1cm4gTnVtUmVnQmFua3M7IH0KKworICAvLy8gR2V0IGEgcmVnaXN0ZXIgYmFuayB0aGF0IGNvdmVycyBccCBSQy4KKyAgLy8vCisgIC8vLyBccHJlIFxwIFJDIGlzIGEgdXNlci1kZWZpbmVkIHJlZ2lzdGVyIGNsYXNzIChhcyBvcHBvc2VkIGFzIG9uZQorICAvLy8gZ2VuZXJhdGVkIGJ5IFRhYmxlR2VuKS4KKyAgLy8vCisgIC8vLyBcbm90ZSBUaGUgbWFwcGluZyBSQyAtPiBSZWdCYW5rIGNvdWxkIGJlIGJ1aWx0IHdoaWxlIGFkZGluZyB0aGUKKyAgLy8vIGNvdmVyYWdlIGZvciB0aGUgcmVnaXN0ZXIgYmFua3MuIEhvd2V2ZXIsIHdlIGRvIG5vdCBkbyBpdCwgYmVjYXVzZSwKKyAgLy8vIGF0IGxlYXN0IGZvciBub3csIHdlIG9ubHkgbmVlZCB0aGlzIGluZm9ybWF0aW9uIGZvciByZWdpc3RlciBjbGFzc2VzCisgIC8vLyB0aGF0IGFyZSB1c2VkIGluIHRoZSBkZXNjcmlwdGlvbiBvZiBpbnN0cnVjdGlvbi4gSW4gb3RoZXIgd29yZHMsCisgIC8vLyB0aGVyZSBhcmUganVzdCBhIGhhbmRmdWwgb2YgdGhlbSBhbmQgd2UgZG8gbm90IHdhbnQgdG8gd2FzdGUgc3BhY2UuCisgIC8vLworICAvLy8gXHRvZG8gVGhpcyBzaG91bGQgYmUgVGFibGVHZW4nZWQuCisgIHZpcnR1YWwgY29uc3QgUmVnaXN0ZXJCYW5rICYKKyAgZ2V0UmVnQmFua0Zyb21SZWdDbGFzcyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICZSQykgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlRoZSB0YXJnZXQgbXVzdCBvdmVycmlkZSB0aGlzIG1ldGhvZCIpOworICB9CisKKyAgLy8vIEdldCB0aGUgY29zdCBvZiBhIGNvcHkgZnJvbSBccCBCIHRvIFxwIEEsIG9yIHB1dCBkaWZmZXJlbnRseSwKKyAgLy8vIGdldCB0aGUgY29zdCBvZiBBID0gQ09QWSBCLiBTaW5jZSByZWdpc3RlciBiYW5rcyBtYXkgY292ZXIKKyAgLy8vIGRpZmZlcmVudCBzaXplLCBccCBTaXplIHNwZWNpZmllcyB3aGF0IHdpbGwgYmUgdGhlIHNpemUgaW4gYml0cworICAvLy8gdGhhdCB3aWxsIGJlIGNvcGllZCBhcm91bmQuCisgIC8vLworICAvLy8gXG5vdGUgU2luY2UgdGhpcyBpcyBhIGNvcHksIGJvdGggcmVnaXN0ZXJzIGhhdmUgdGhlIHNhbWUgc2l6ZS4KKyAgdmlydHVhbCB1bnNpZ25lZCBjb3B5Q29zdChjb25zdCBSZWdpc3RlckJhbmsgJkEsIGNvbnN0IFJlZ2lzdGVyQmFuayAmQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTaXplKSBjb25zdCB7CisgICAgLy8gT3B0aW1pc3RpY2FsbHkgYXNzdW1lIHRoYXQgY29waWVzIGFyZSBjb2FsZXNjZWQuIEkuZS4sIHdoZW4KKyAgICAvLyB0aGV5IGFyZSBvbiB0aGUgc2FtZSBiYW5rLCB0aGV5IGFyZSBmcmVlLgorICAgIC8vIE90aGVyd2lzZSBhc3N1bWUgYSBub24temVybyBjb3N0IG9mIDEuIFRoZSB0YXJnZXRzIGFyZSBzdXBwb3NlZAorICAgIC8vIHRvIG92ZXJyaWRlIHRoYXQgcHJvcGVybHkgYW55d2F5IGlmIHRoZXkgY2FyZS4KKyAgICByZXR1cm4gJkEgIT0gJkI7CisgIH0KKworICAvLy8gQ29uc3RyYWluIHRoZSAocG9zc2libHkgZ2VuZXJpYykgdmlydHVhbCByZWdpc3RlciBccCBSZWcgdG8gXHAgUkMuCisgIC8vLworICAvLy8gXHByZSBccCBSZWcgaXMgYSB2aXJ0dWFsIHJlZ2lzdGVyIHRoYXQgZWl0aGVyIGhhcyBhIGJhbmsgb3IgYSBjbGFzcy4KKyAgLy8vIFxyZXR1cm5zIFRoZSBjb25zdHJhaW5lZCByZWdpc3RlciBjbGFzcywgb3IgbnVsbHB0ciBpZiB0aGVyZSBpcyBub25lLgorICAvLy8gXG5vdGUgVGhpcyBpcyBhIGdlbmVyaWMgdmFyaWFudCBvZiBNYWNoaW5lUmVnaXN0ZXJJbmZvOjpjb25zdHJhaW5SZWdDbGFzcworICAvLy8gXG5vdGUgVXNlIE1hY2hpbmVSZWdpc3RlckluZm86OmNvbnN0cmFpblJlZ0F0dHJzIGluc3RlYWQgZm9yIGFueSBub24taXNlbAorICAvLy8gcHVycG9zZSwgaW5jbHVkaW5nIG5vbi1zZWxlY3QgcGFzc2VzIG9mIEdsb2JhbElTZWwKKyAgc3RhdGljIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKgorICBjb25zdHJhaW5HZW5lcmljUmVnaXN0ZXIodW5zaWduZWQgUmVnLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICZSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSk7CisKKyAgLy8vIElkZW50aWZpZXIgdXNlZCB3aGVuIHRoZSByZWxhdGVkIGluc3RydWN0aW9uIG1hcHBpbmcgaW5zdGFuY2UKKyAgLy8vIGlzIGdlbmVyYXRlZCBieSB0YXJnZXQgaW5kZXBlbmRlbnQgY29kZS4KKyAgLy8vIE1ha2Ugc3VyZSBub3QgdG8gdXNlIHRoYXQgaWRlbnRpZmllciB0byBhdm9pZCBwb3NzaWJsZSBjb2xsaXNpb24uCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBEZWZhdWx0TWFwcGluZ0lEOworCisgIC8vLyBJZGVudGlmaWVyIHVzZWQgd2hlbiB0aGUgcmVsYXRlZCBpbnN0cnVjdGlvbiBtYXBwaW5nIGluc3RhbmNlCisgIC8vLyBpcyBnZW5lcmF0ZWQgYnkgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCisgIC8vLyBNYWtlIHN1cmUgbm90IHRvIHVzZSB0aGF0IGlkZW50aWZpZXIuCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBJbnZhbGlkTWFwcGluZ0lEOworCisgIC8vLyBHZXQgdGhlIG1hcHBpbmcgb2YgdGhlIGRpZmZlcmVudCBvcGVyYW5kcyBvZiBccCBNSQorICAvLy8gb24gdGhlIHJlZ2lzdGVyIGJhbmsuCisgIC8vLyBUaGlzIG1hcHBpbmcgc2hvdWxkIGJlIHRoZSBkaXJlY3QgdHJhbnNsYXRpb24gb2YgXHAgTUkuCisgIC8vLyBJbiBvdGhlciB3b3Jkcywgd2hlbiBccCBNSSBpcyBtYXBwZWQgd2l0aCB0aGUgcmV0dXJuZWQgbWFwcGluZywKKyAgLy8vIG9ubHkgdGhlIHJlZ2lzdGVyIGJhbmtzIG9mIHRoZSBvcGVyYW5kcyBvZiBccCBNSSBuZWVkIHRvIGJlIHVwZGF0ZWQuCisgIC8vLyBJbiBwYXJ0aWN1bGFyLCBuZWl0aGVyIHRoZSBvcGNvZGUgbm9yIHRoZSB0eXBlIG9mIFxwIE1JIG5lZWRzIHRvIGJlCisgIC8vLyB1cGRhdGVkIGZvciB0aGlzIGRpcmVjdCBtYXBwaW5nLgorICAvLy8KKyAgLy8vIFRoZSB0YXJnZXQgaW5kZXBlbmRlbnQgaW1wbGVtZW50YXRpb24gZ2l2ZXMgYSBtYXBwaW5nIGJhc2VkIG9uCisgIC8vLyB0aGUgcmVnaXN0ZXIgY2xhc3NlcyBmb3IgdGhlIHRhcmdldCBzcGVjaWZpYyBvcGNvZGUuCisgIC8vLyBJdCB1c2VzIHRoZSBJRCBSZWdpc3RlckJhbmtJbmZvOjpEZWZhdWx0TWFwcGluZ0lEIGZvciB0aGF0IG1hcHBpbmcuCisgIC8vLyBNYWtlIHN1cmUgeW91IGRvIG5vdCB1c2UgdGhhdCBJRCBmb3IgdGhlIGFsdGVybmF0aXZlIG1hcHBpbmcKKyAgLy8vIGZvciBNSS4gU2VlIGdldEluc3RyQWx0ZXJuYXRpdmVNYXBwaW5ncyBmb3IgdGhlIGFsdGVybmF0aXZlCisgIC8vLyBtYXBwaW5ncy4KKyAgLy8vCisgIC8vLyBGb3IgaW5zdGFuY2UsIGlmIFxwIE1JIGlzIGEgdmVjdG9yIGFkZCwgdGhlIG1hcHBpbmcgc2hvdWxkCisgIC8vLyBub3QgYmUgYSBzY2FsYXJpemF0aW9uIG9mIHRoZSBhZGQuCisgIC8vLworICAvLy8gXHBvc3QgcmV0dXJuZWRWYWwudmVyaWZ5KE1JKS4KKyAgLy8vCisgIC8vLyBcbm90ZSBJZiByZXR1cm5lZFZhbCBkb2VzIG5vdCB2ZXJpZnkgTUksIHRoaXMgd291bGQgcHJvYmFibHkgbWVhbgorICAvLy8gdGhhdCB0aGUgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgdGhhdCBpbnN0cnVjdGlvbi4KKyAgdmlydHVhbCBjb25zdCBJbnN0cnVjdGlvbk1hcHBpbmcgJgorICBnZXRJbnN0ck1hcHBpbmcoY29uc3QgTWFjaGluZUluc3RyICZNSSkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgYWx0ZXJuYXRpdmUgbWFwcGluZ3MgZm9yIFxwIE1JLgorICAvLy8gQWx0ZXJuYXRpdmUgaW4gdGhlIHNlbnNlIGRpZmZlcmVudCBmcm9tIGdldEluc3RyTWFwcGluZy4KKyAgdmlydHVhbCBJbnN0cnVjdGlvbk1hcHBpbmdzCisgIGdldEluc3RyQWx0ZXJuYXRpdmVNYXBwaW5ncyhjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSBwb3NzaWJsZSBtYXBwaW5nIGZvciBccCBNSS4KKyAgLy8vIEEgbWFwcGluZyBkZWZpbmVzIHdoZXJlIHRoZSBkaWZmZXJlbnQgb3BlcmFuZHMgbWF5IGxpdmUgYW5kIGF0IHdoYXQgY29zdC4KKyAgLy8vIEZvciBpbnN0YW5jZSwgbGV0IHVzIGNvbnNpZGVyOgorICAvLy8gdjAoMTYpID0gR19BREQgPDIgeCBpOD4gdjEsIHYyCisgIC8vLyBUaGUgcG9zc2libGUgbWFwcGluZyBjb3VsZCBiZToKKyAgLy8vCisgIC8vLyB7LypJRCovVmVjdG9yQWRkLCAvKkNvc3QqLzEsIC8qdjAqL3soMHhGRkZGLCBWUFIpfSwgLyp2MSoveygweEZGRkYsIFZQUil9LAorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKnYyKi97KDB4RkZGRiwgVlBSKX19CisgIC8vLyB7LypJRCovU2NhbGFyQWRkeDIsIC8qQ29zdCovMiwgLyp2MCoveygweDAwRkYsIEdQUiksKDB4RkYwMCwgR1BSKX0sCisgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp2MSoveygweDAwRkYsIEdQUiksKDB4RkYwMCwgR1BSKX0sCisgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyp2MioveygweDAwRkYsIEdQUiksKDB4RkYwMCwgR1BSKX19CisgIC8vLworICAvLy8gXG5vdGUgVGhlIGZpcnN0IGFsdGVybmF0aXZlIG9mIHRoZSByZXR1cm5lZCBtYXBwaW5nIHNob3VsZCBiZSB0aGUKKyAgLy8vIGRpcmVjdCB0cmFuc2xhdGlvbiBvZiBccCBNSSBjdXJyZW50IGZvcm0uCisgIC8vLworICAvLy8gXHBvc3QgIXJldHVybmVkVmFsLmVtcHR5KCkuCisgIEluc3RydWN0aW9uTWFwcGluZ3MgZ2V0SW5zdHJQb3NzaWJsZU1hcHBpbmdzKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIGNvbnN0OworCisgIC8vLyBBcHBseSBccCBPcGRNYXBwZXIuZ2V0SW5zdHJNYXBwaW5nKCkgdG8gXHAgT3BkTWFwcGVyLmdldE1JKCkuCisgIC8vLyBBZnRlciB0aGlzIGNhbGwgXHAgT3BkTWFwcGVyLmdldE1JKCkgbWF5IG5vdCBiZSB2YWxpZCBhbnltb3JlLgorICAvLy8gXHAgT3BkTWFwcGVyLmdldEluc3RyTWFwcGluZygpLmdldElEKCkgY2FycmllcyB0aGUgaW5mb3JtYXRpb24gb2YKKyAgLy8vIHdoYXQgaGFzIGJlZW4gY2hvc2VuIHRvIG1hcCBccCBPcGRNYXBwZXIuZ2V0TUkoKS4gVGhpcyBJRCBpcyBzZXQKKyAgLy8vIGJ5IHRoZSB2YXJpb3VzIGdldEluc3RyWFhYTWFwcGluZyBtZXRob2QuCisgIC8vLworICAvLy8gVGhlcmVmb3JlLCBnZXR0aW5nIHRoZSBtYXBwaW5nIGFuZCBhcHBseWluZyBpdCBzaG91bGQgYmUga2VwdCBpbgorICAvLy8gc3luYy4KKyAgdm9pZCBhcHBseU1hcHBpbmcoY29uc3QgT3BlcmFuZHNNYXBwZXIgJk9wZE1hcHBlcikgY29uc3QgeworICAgIC8vIFRoZSBvbmx5IG1hcHBpbmcgd2Uga25vdyBob3cgdG8gaGFuZGxlIGlzIHRoZSBkZWZhdWx0IG1hcHBpbmcuCisgICAgaWYgKE9wZE1hcHBlci5nZXRJbnN0ck1hcHBpbmcoKS5nZXRJRCgpID09IERlZmF1bHRNYXBwaW5nSUQpCisgICAgICByZXR1cm4gYXBwbHlEZWZhdWx0TWFwcGluZyhPcGRNYXBwZXIpOworICAgIC8vIEZvciBvdGhlciBtYXBwaW5nLCB0aGUgdGFyZ2V0IG5lZWRzIHRvIGRvIHRoZSByaWdodCB0aGluZy4KKyAgICAvLyBJZiB0aGF0IG1lYW5zIGNhbGxpbmcgYXBwbHlEZWZhdWx0TWFwcGluZywgZmluZSwgYnV0IHRoaXMKKyAgICAvLyBtdXN0IGJlIGV4cGxpY2l0bHkgc3RhdGVkLgorICAgIGFwcGx5TWFwcGluZ0ltcGwoT3BkTWFwcGVyKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIHNpemUgaW4gYml0cyBvZiBccCBSZWcuCisgIC8vLyBVdGlsaXR5IG1ldGhvZCB0byBnZXQgdGhlIHNpemUgb2YgYW55IHJlZ2lzdGVycy4gVW5saWtlCisgIC8vLyBNYWNoaW5lUmVnaXN0ZXJJbmZvOjpnZXRTaXplLCB0aGUgcmVnaXN0ZXIgZG9lcyBub3QgbmVlZCB0byBiZSBhCisgIC8vLyB2aXJ0dWFsIHJlZ2lzdGVyLgorICAvLy8KKyAgLy8vIFxwcmUgXHAgUmVnICE9IDAgKE5vUmVnaXN0ZXIpLgorICB1bnNpZ25lZCBnZXRTaXplSW5CaXRzKHVuc2lnbmVkIFJlZywgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJKSBjb25zdDsKKworICAvLy8gQ2hlY2sgdGhhdCBpbmZvcm1hdGlvbiBob2xkIGJ5IHRoaXMgaW5zdGFuY2UgbWFrZSBzZW5zZSBmb3IgdGhlCisgIC8vLyBnaXZlbiBccCBUUkkuCisgIC8vLworICAvLy8gXG5vdGUgVGhpcyBtZXRob2QgZG9lcyBub3QgY2hlY2sgYW55dGhpbmcgd2hlbiBhc3NlcnRpb25zIGFyZSBkaXNhYmxlZC4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRydWUgaXMgdGhlIGNoZWNrIHdhcyBzdWNjZXNzZnVsLgorICBib29sIHZlcmlmeShjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSkgY29uc3Q7Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0gJgorb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgIGNvbnN0IFJlZ2lzdGVyQmFua0luZm86OlBhcnRpYWxNYXBwaW5nICZQYXJ0TWFwcGluZykgeworICBQYXJ0TWFwcGluZy5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKworaW5saW5lIHJhd19vc3RyZWFtICYKK29wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBSZWdpc3RlckJhbmtJbmZvOjpWYWx1ZU1hcHBpbmcgJlZhbE1hcHBpbmcpIHsKKyAgVmFsTWFwcGluZy5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKworaW5saW5lIHJhd19vc3RyZWFtICYKK29wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICBjb25zdCBSZWdpc3RlckJhbmtJbmZvOjpJbnN0cnVjdGlvbk1hcHBpbmcgJkluc3RyTWFwcGluZykgeworICBJbnN0ck1hcHBpbmcucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKK2lubGluZSByYXdfb3N0cmVhbSAmCitvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgUmVnaXN0ZXJCYW5rSW5mbzo6T3BlcmFuZHNNYXBwZXIgJk9wZE1hcHBlcikgeworICBPcGRNYXBwZXIucHJpbnQoT1MsIC8qRm9yRGVidWcqLyBmYWxzZSk7CisgIHJldHVybiBPUzsKK30KKworLy8vIEhhc2hpbmcgZnVuY3Rpb24gZm9yIFBhcnRpYWxNYXBwaW5nLgorLy8vIEl0IGlzIHJlcXVpcmVkIGZvciB0aGUgaGFzaGluZyBvZiBWYWx1ZU1hcHBpbmcuCitoYXNoX2NvZGUgaGFzaF92YWx1ZShjb25zdCBSZWdpc3RlckJhbmtJbmZvOjpQYXJ0aWFsTWFwcGluZyAmUGFydE1hcHBpbmcpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfUkVHSVNURVJCQU5LSU5GT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9UeXBlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjIyZTM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvVHlwZXMuaApAQCAtMCwwICsxLDM0IEBACisvLz09PS0gbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvVHlwZXMuaCAtIFR5cGVzIHVzZWQgYnkgR0lTZWwgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgZGVzY3JpYmVzIGhpZ2ggbGV2ZWwgdHlwZXMgdGhhdCBhcmUgdXNlZCBieSBzZXZlcmFsIHBhc3NlcyBvcgorLy8vIEFQSXMgaW52b2x2ZWQgaW4gdGhlIEdsb2JhbElTZWwgcGlwZWxpbmUuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX1RZUEVTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfVFlQRVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBWYWx1ZTsKKworLy8vIE1hcCBhIHZhbHVlIHRvIGEgdmlydHVhbCByZWdpc3Rlci4KKy8vLyBGb3Igbm93LCB3ZSBjaG9zZSB0byBtYXAgYWdncmVnYXRlIHR5cGVzIHRvIG9uIHNpbmdsZSB2aXJ0dWFsCisvLy8gcmVnaXN0ZXIuIFRoaXMgbWlnaHQgYmUgcmV2aXNpdGVkIGlmIGl0IHR1cm5zIG91dCB0byBiZSBpbmVmZmljaWVudC4KKy8vLyBQUjI2MTYxIHRyYWNrcyB0aGF0LgorLy8vIE5vdGU6IFdlIG5lZWQgdG8gZXhwb3NlIHRoaXMgdHlwZSB0byB0aGUgdGFyZ2V0IGhvb2tzIGZvciB0aGluZyBsaWtlCisvLy8gQUJJIGxvd2VyaW5nIHRoYXQgd291bGQgYmUgdXNlZCBkdXJpbmcgSVJUcmFuc2xhdGlvbi4KK3VzaW5nIFZhbHVlVG9WUmVnID0gRGVuc2VNYXA8Y29uc3QgVmFsdWUgKiwgdW5zaWduZWQ+OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0dMT0JBTElTRUxfVFlQRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvVXRpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM3MDM1ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9HbG9iYWxJU2VsL1V0aWxzLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8vPT0tLSBsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9VdGlscy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgQVBJIG9mIGhlbHBlciBmdW5jdGlvbnMgdXNlZCB0aHJvdWdob3V0IHRoZQorLy8vIEdsb2JhbElTZWwgcGlwZWxpbmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fR0xPQkFMSVNFTF9VVElMU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9HTE9CQUxJU0VMX1VUSUxTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIE1hY2hpbmVPcGVyYW5kOworY2xhc3MgTWFjaGluZU9wdGltaXphdGlvblJlbWFya0VtaXR0ZXI7CitjbGFzcyBNYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrTWlzc2VkOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIE1DSW5zdHJEZXNjOworY2xhc3MgUmVnaXN0ZXJCYW5rSW5mbzsKK2NsYXNzIFRhcmdldEluc3RySW5mbzsKK2NsYXNzIFRhcmdldFBhc3NDb25maWc7CitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CitjbGFzcyBUYXJnZXRSZWdpc3RlckNsYXNzOworY2xhc3MgVHdpbmU7CitjbGFzcyBDb25zdGFudEZQOworY2xhc3MgQVBGbG9hdDsKKworLy8vIFRyeSB0byBjb25zdHJhaW4gUmVnIHRvIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgY2xhc3MuIElmIHRoaXMgZmFpbHMsCisvLy8gY3JlYXRlIGEgbmV3IHZpcnR1YWwgcmVnaXN0ZXIgaW4gdGhlIGNvcnJlY3QgY2xhc3MgYW5kIGluc2VydCBhIENPUFkgYmVmb3JlCisvLy8gXHAgSW5zZXJ0UHQuIFRoZSBkZWJ1ZyBsb2NhdGlvbiBvZiBccCBJbnNlcnRQdCBpcyB1c2VkIGZvciB0aGUgbmV3IGNvcHkuCisvLy8KKy8vLyBccmV0dXJuIFRoZSB2aXJ0dWFsIHJlZ2lzdGVyIGNvbnN0cmFpbmVkIHRvIHRoZSByaWdodCByZWdpc3RlciBjbGFzcy4KK3Vuc2lnbmVkIGNvbnN0cmFpblJlZ1RvQ2xhc3MoTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVnaXN0ZXJCYW5rSW5mbyAmUkJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgJkluc2VydFB0LCB1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgJlJlZ0NsYXNzKTsKKworLy8vIFRyeSB0byBjb25zdHJhaW4gUmVnIHNvIHRoYXQgaXQgaXMgdXNhYmxlIGJ5IGFyZ3VtZW50IE9wSWR4IG9mIHRoZQorLy8vIHByb3ZpZGVkIE1DSW5zdHJEZXNjIFxwIElJLiBJZiB0aGlzIGZhaWxzLCBjcmVhdGUgYSBuZXcgdmlydHVhbAorLy8vIHJlZ2lzdGVyIGluIHRoZSBjb3JyZWN0IGNsYXNzIGFuZCBpbnNlcnQgYSBDT1BZIGJlZm9yZSBccCBJbnNlcnRQdC4KKy8vLyBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gY29uc3RyYWluUmVnVG9DbGFzcygpIHdpdGggUmVnQ2xhc3Mgb2J0YWluZWQgZnJvbSB0aGUKKy8vLyBNQ0luc3RyRGVzYy4gVGhlIGRlYnVnIGxvY2F0aW9uIG9mIFxwIEluc2VydFB0IGlzIHVzZWQgZm9yIHRoZSBuZXcgY29weS4KKy8vLworLy8vIFxyZXR1cm4gVGhlIHZpcnR1YWwgcmVnaXN0ZXIgY29uc3RyYWluZWQgdG8gdGhlIHJpZ2h0IHJlZ2lzdGVyIGNsYXNzLgordW5zaWduZWQgY29uc3RyYWluT3BlcmFuZFJlZ0NsYXNzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ2lzdGVyQmFua0luZm8gJlJCSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgJkluc2VydFB0LCBjb25zdCBNQ0luc3RyRGVzYyAmSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJlJlZ01PLCB1bnNpZ25lZCBPcElkeCk7CisKKy8vLyBNdXRhdGUgdGhlIG5ld2x5LXNlbGVjdGVkIGluc3RydWN0aW9uIFxwIEkgdG8gY29uc3RyYWluIGl0cyAocG9zc2libHkKKy8vLyBnZW5lcmljKSB2aXJ0dWFsIHJlZ2lzdGVyIG9wZXJhbmRzIHRvIHRoZSBpbnN0cnVjdGlvbidzIHJlZ2lzdGVyIGNsYXNzLgorLy8vIFRoaXMgY291bGQgaW52b2x2ZSBpbnNlcnRpbmcgQ09QWXMgYmVmb3JlIChmb3IgdXNlcykgb3IgYWZ0ZXIgKGZvciBkZWZzKS4KKy8vLyBUaGlzIHJlcXVpcmVzIHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgdG8gbWF0Y2ggdGhlIGluc3RydWN0aW9uIGRlc2NyaXB0aW9uLgorLy8vIFxyZXR1cm5zIHdoZXRoZXIgb3BlcmFuZCByZWdjbGFzcyBjb25zdHJhaW5pbmcgc3VjY2VlZGVkLgorLy8vCisvLyBGSVhNRTogTm90IGFsbCBpbnN0cnVjdGlvbnMgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2Ygb3BlcmFuZHMuIFdlIHNob3VsZAorLy8gcHJvYmFibHkgZXhwb3NlIGEgY29uc3RyYWluIGhlbHBlciBwZXIgb3BlcmFuZCBhbmQgbGV0IHRoZSB0YXJnZXQgc2VsZWN0b3IKKy8vIGNvbnN0cmFpbiBpbmRpdmlkdWFsIHJlZ2lzdGVycywgbGlrZSBmYXN0LWlzZWwuCitib29sIGNvbnN0cmFpblNlbGVjdGVkSW5zdFJlZ09wZXJhbmRzKE1hY2hpbmVJbnN0ciAmSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWdpc3RlckJhbmtJbmZvICZSQkkpOworLy8vIENoZWNrIHdoZXRoZXIgYW4gaW5zdHJ1Y3Rpb24gXHAgTUkgaXMgZGVhZDogaXQgb25seSBkZWZpbmVzIGRlYWQgdmlydHVhbAorLy8vIHJlZ2lzdGVycywgYW5kIGRvZXNuJ3QgaGF2ZSBvdGhlciBzaWRlIGVmZmVjdHMuCitib29sIGlzVHJpdmlhbGx5RGVhZChjb25zdCBNYWNoaW5lSW5zdHIgJk1JLCBjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkkpOworCisvLy8gUmVwb3J0IGFuIElTZWwgZXJyb3IgYXMgYSBtaXNzZWQgb3B0aW1pemF0aW9uIHJlbWFyayB0byB0aGUgTExWTUNvbnRleHQncworLy8vIGRpYWdub3N0aWMgc3RyZWFtLiAgU2V0IHRoZSBGYWlsZWRJU2VsIE1hY2hpbmVGdW5jdGlvbiBwcm9wZXJ0eS4KK3ZvaWQgcmVwb3J0R0lTZWxGYWlsdXJlKE1hY2hpbmVGdW5jdGlvbiAmTUYsIGNvbnN0IFRhcmdldFBhc3NDb25maWcgJlRQQywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyICZNT1JFLAorICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU9wdGltaXphdGlvblJlbWFya01pc3NlZCAmUik7CisKK3ZvaWQgcmVwb3J0R0lTZWxGYWlsdXJlKE1hY2hpbmVGdW5jdGlvbiAmTUYsIGNvbnN0IFRhcmdldFBhc3NDb25maWcgJlRQQywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyICZNT1JFLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqUGFzc05hbWUsIFN0cmluZ1JlZiBNc2csCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHIgJk1JKTsKKworT3B0aW9uYWw8aW50NjRfdD4gZ2V0Q29uc3RhbnRWUmVnVmFsKHVuc2lnbmVkIFZSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJKTsKK2NvbnN0IENvbnN0YW50RlAqIGdldENvbnN0YW50RlBWUmVnVmFsKHVuc2lnbmVkIFZSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkkpOworCisvLy8gU2VlIGlmIFJlZyBpcyBkZWZpbmVkIGJ5IGFuIHNpbmdsZSBkZWYgaW5zdHJ1Y3Rpb24gdGhhdCBpcworLy8vIE9wY29kZS4gQWxzbyB0cnkgdG8gZG8gdHJpdmlhbCBmb2xkaW5nIGlmIGl0J3MgYSBDT1BZIHdpdGgKKy8vLyBzYW1lIHR5cGVzLiBSZXR1cm5zIG51bGwgb3RoZXJ3aXNlLgorTWFjaGluZUluc3RyICpnZXRPcGNvZGVEZWYodW5zaWduZWQgT3Bjb2RlLCB1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkkpOworCisvLy8gUmV0dXJucyBhbiBBUEZsb2F0IGZyb20gVmFsIGNvbnZlcnRlZCB0byB0aGUgYXBwcm9wcmlhdGUgc2l6ZS4KK0FQRmxvYXQgZ2V0QVBGbG9hdEZyb21TaXplKGRvdWJsZSBWYWwsIHVuc2lnbmVkIFNpemUpOworfSAvLyBFbmQgbmFtZXNwYWNlIGxsdm0uCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9JU0RPcGNvZGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vSVNET3Bjb2Rlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhOTQ4NzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vSVNET3Bjb2Rlcy5oCkBAIC0wLDAgKzEsOTk3IEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9JU0RPcGNvZGVzLmggLSBDb2RlR2VuIG9wY29kZXMgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBjb2RlZ2VuIG9wY29kZXMgYW5kIHJlbGF0ZWQgdXRpbGl0aWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0lTRE9QQ09ERVNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fSVNET1BDT0RFU19ICisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIElTRCBuYW1lc3BhY2UgLSBUaGlzIG5hbWVzcGFjZSBjb250YWlucyBhbiBlbnVtIHdoaWNoIHJlcHJlc2VudHMgYWxsIG9mIHRoZQorLy8vIFNlbGVjdGlvbkRBRyBub2RlIHR5cGVzIGFuZCB2YWx1ZSB0eXBlcy4KKy8vLworbmFtZXNwYWNlIElTRCB7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBJU0Q6Ok5vZGVUeXBlIGVudW0gLSBUaGlzIGVudW0gZGVmaW5lcyB0aGUgdGFyZ2V0LWluZGVwZW5kZW50IG9wZXJhdG9ycworICAvLy8gZm9yIGEgU2VsZWN0aW9uREFHLgorICAvLy8KKyAgLy8vIFRhcmdldHMgbWF5IGFsc28gZGVmaW5lIHRhcmdldC1kZXBlbmRlbnQgb3BlcmF0b3IgY29kZXMgZm9yIFNETm9kZXMuIEZvcgorICAvLy8gZXhhbXBsZSwgb24geDg2LCB0aGVzZSBhcmUgdGhlIGVudW0gdmFsdWVzIGluIHRoZSBYODZJU0QgbmFtZXNwYWNlLgorICAvLy8gVGFyZ2V0cyBzaG91bGQgYWltIHRvIHVzZSB0YXJnZXQtaW5kZXBlbmRlbnQgb3BlcmF0b3JzIHRvIG1vZGVsIHRoZWlyCisgIC8vLyBpbnN0cnVjdGlvbiBzZXRzIGFzIG11Y2ggYXMgcG9zc2libGUsIGFuZCBvbmx5IHVzZSB0YXJnZXQtZGVwZW5kZW50CisgIC8vLyBvcGVyYXRvcnMgd2hlbiB0aGV5IGhhdmUgc3BlY2lhbCByZXF1aXJlbWVudHMuCisgIC8vLworICAvLy8gRmluYWxseSwgZHVyaW5nIGFuZCBhZnRlciBzZWxlY3Rpb24gcHJvcGVyLCBTTm9kZXMgbWF5IHVzZSBzcGVjaWFsCisgIC8vLyBvcGVyYXRvciBjb2RlcyB0aGF0IGNvcnJlc3BvbmQgZGlyZWN0bHkgd2l0aCBNYWNoaW5lSW5zdHIgb3Bjb2Rlcy4gVGhlc2UKKyAgLy8vIGFyZSB1c2VkIHRvIHJlcHJlc2VudCBzZWxlY3RlZCBpbnN0cnVjdGlvbnMuIFNlZSB0aGUgaXNNYWNoaW5lT3Bjb2RlKCkKKyAgLy8vIGFuZCBnZXRNYWNoaW5lT3Bjb2RlKCkgbWVtYmVyIGZ1bmN0aW9ucyBvZiBTRE5vZGUuCisgIC8vLworICBlbnVtIE5vZGVUeXBlIHsKKyAgICAvLy8gREVMRVRFRF9OT0RFIC0gVGhpcyBpcyBhbiBpbGxlZ2FsIHZhbHVlIHRoYXQgaXMgdXNlZCB0byBjYXRjaAorICAgIC8vLyBlcnJvcnMuICBUaGlzIG9wY29kZSBpcyBub3QgYSBsZWdhbCBvcGNvZGUgZm9yIGFueSBub2RlLgorICAgIERFTEVURURfTk9ERSwKKworICAgIC8vLyBFbnRyeVRva2VuIC0gVGhpcyBpcyB0aGUgbWFya2VyIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGEgcmVnaW9uLgorICAgIEVudHJ5VG9rZW4sCisKKyAgICAvLy8gVG9rZW5GYWN0b3IgLSBUaGlzIG5vZGUgdGFrZXMgbXVsdGlwbGUgdG9rZW5zIGFzIGlucHV0IGFuZCBwcm9kdWNlcyBhCisgICAgLy8vIHNpbmdsZSB0b2tlbiByZXN1bHQuIFRoaXMgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGZhY3QgdGhhdCB0aGUgb3BlcmFuZAorICAgIC8vLyBvcGVyYXRvcnMgYXJlIGluZGVwZW5kZW50IG9mIGVhY2ggb3RoZXIuCisgICAgVG9rZW5GYWN0b3IsCisKKyAgICAvLy8gQXNzZXJ0U2V4dCwgQXNzZXJ0WmV4dCAtIFRoZXNlIG5vZGVzIHJlY29yZCBpZiBhIHJlZ2lzdGVyIGNvbnRhaW5zIGEKKyAgICAvLy8gdmFsdWUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIHplcm8gb3Igc2lnbiBleHRlbmRlZCBmcm9tIGEgbmFycm93ZXIgdHlwZS4KKyAgICAvLy8gVGhlc2Ugbm9kZXMgdGFrZSB0d28gb3BlcmFuZHMuICBUaGUgZmlyc3QgaXMgdGhlIG5vZGUgdGhhdCBoYXMgYWxyZWFkeQorICAgIC8vLyBiZWVuIGV4dGVuZGVkLCBhbmQgdGhlIHNlY29uZCBpcyBhIHZhbHVlIHR5cGUgbm9kZSBpbmRpY2F0aW5nIHRoZSB3aWR0aAorICAgIC8vLyBvZiB0aGUgZXh0ZW5zaW9uCisgICAgQXNzZXJ0U2V4dCwgQXNzZXJ0WmV4dCwKKworICAgIC8vLyBWYXJpb3VzIGxlYWYgbm9kZXMuCisgICAgQmFzaWNCbG9jaywgVkFMVUVUWVBFLCBDT05EQ09ERSwgUmVnaXN0ZXIsIFJlZ2lzdGVyTWFzaywKKyAgICBDb25zdGFudCwgQ29uc3RhbnRGUCwKKyAgICBHbG9iYWxBZGRyZXNzLCBHbG9iYWxUTFNBZGRyZXNzLCBGcmFtZUluZGV4LAorICAgIEp1bXBUYWJsZSwgQ29uc3RhbnRQb29sLCBFeHRlcm5hbFN5bWJvbCwgQmxvY2tBZGRyZXNzLAorCisgICAgLy8vIFRoZSBhZGRyZXNzIG9mIHRoZSBHT1QKKyAgICBHTE9CQUxfT0ZGU0VUX1RBQkxFLAorCisgICAgLy8vIEZSQU1FQUREUiwgUkVUVVJOQUREUiAtIFRoZXNlIG5vZGVzIHJlcHJlc2VudCBsbHZtLmZyYW1lYWRkcmVzcyBhbmQKKyAgICAvLy8gbGx2bS5yZXR1cm5hZGRyZXNzIG9uIHRoZSBEQUcuICBUaGVzZSBub2RlcyB0YWtlIG9uZSBvcGVyYW5kLCB0aGUgaW5kZXgKKyAgICAvLy8gb2YgdGhlIGZyYW1lIG9yIHJldHVybiBhZGRyZXNzIHRvIHJldHVybi4gIEFuIGluZGV4IG9mIHplcm8gY29ycmVzcG9uZHMKKyAgICAvLy8gdG8gdGhlIGN1cnJlbnQgZnVuY3Rpb24ncyBmcmFtZSBvciByZXR1cm4gYWRkcmVzcywgYW4gaW5kZXggb2Ygb25lIHRvCisgICAgLy8vIHRoZSBwYXJlbnQncyBmcmFtZSBvciByZXR1cm4gYWRkcmVzcywgYW5kIHNvIG9uLgorICAgIEZSQU1FQUREUiwgUkVUVVJOQUREUiwgQUREUk9GUkVUVVJOQUREUiwKKworICAgIC8vLyBMT0NBTF9SRUNPVkVSIC0gUmVwcmVzZW50cyB0aGUgbGx2bS5sb2NhbHJlY292ZXIgaW50cmluc2ljLgorICAgIC8vLyBNYXRlcmlhbGl6ZXMgdGhlIG9mZnNldCBmcm9tIHRoZSBsb2NhbCBvYmplY3QgcG9pbnRlciBvZiBhbm90aGVyCisgICAgLy8vIGZ1bmN0aW9uIHRvIGEgcGFydGljdWxhciBsb2NhbCBvYmplY3QgcGFzc2VkIHRvIGxsdm0ubG9jYWxlc2NhcGUuIFRoZQorICAgIC8vLyBvcGVyYW5kIGlzIHRoZSBNQ1N5bWJvbCBsYWJlbCB1c2VkIHRvIHJlcHJlc2VudCB0aGlzIG9mZnNldCwgc2luY2UKKyAgICAvLy8gdHlwaWNhbGx5IHRoZSBvZmZzZXQgaXMgbm90IGtub3duIHVudGlsIGFmdGVyIGNvZGUgZ2VuZXJhdGlvbiBvZiB0aGUKKyAgICAvLy8gcGFyZW50LgorICAgIExPQ0FMX1JFQ09WRVIsCisKKyAgICAvLy8gUkVBRF9SRUdJU1RFUiwgV1JJVEVfUkVHSVNURVIgLSBUaGlzIG5vZGUgcmVwcmVzZW50cyBsbHZtLnJlZ2lzdGVyIG9uCisgICAgLy8vIHRoZSBEQUcsIHdoaWNoIGltcGxlbWVudHMgdGhlIG5hbWVkIHJlZ2lzdGVyIGdsb2JhbCB2YXJpYWJsZXMgZXh0ZW5zaW9uLgorICAgIFJFQURfUkVHSVNURVIsCisgICAgV1JJVEVfUkVHSVNURVIsCisKKyAgICAvLy8gRlJBTUVfVE9fQVJHU19PRkZTRVQgLSBUaGlzIG5vZGUgcmVwcmVzZW50cyBvZmZzZXQgZnJvbSBmcmFtZSBwb2ludGVyIHRvCisgICAgLy8vIGZpcnN0IChwb3NzaWJsZSkgb24tc3RhY2sgYXJndW1lbnQuIFRoaXMgaXMgbmVlZGVkIGZvciBjb3JyZWN0IHN0YWNrCisgICAgLy8vIGFkanVzdG1lbnQgZHVyaW5nIHVud2luZC4KKyAgICBGUkFNRV9UT19BUkdTX09GRlNFVCwKKworICAgIC8vLyBFSF9EV0FSRl9DRkEgLSBUaGlzIG5vZGUgcmVwcmVzZW50cyB0aGUgcG9pbnRlciB0byB0aGUgRFdBUkYgQ2Fub25pY2FsCisgICAgLy8vIEZyYW1lIEFkZHJlc3MgKENGQSksIGdlbmVyYWxseSB0aGUgdmFsdWUgb2YgdGhlIHN0YWNrIHBvaW50ZXIgYXQgdGhlCisgICAgLy8vIGNhbGwgc2l0ZSBpbiB0aGUgcHJldmlvdXMgZnJhbWUuCisgICAgRUhfRFdBUkZfQ0ZBLAorCisgICAgLy8vIE9VVENIQUlOID0gRUhfUkVUVVJOKElOQ0hBSU4sIE9GRlNFVCwgSEFORExFUikgLSBUaGlzIG5vZGUgcmVwcmVzZW50cworICAgIC8vLyAnZWhfcmV0dXJuJyBnY2MgZHdhcmYgYnVpbHRpbiwgd2hpY2ggaXMgdXNlZCB0byByZXR1cm4gZnJvbQorICAgIC8vLyBleGNlcHRpb24uIFRoZSBnZW5lcmFsIG1lYW5pbmcgaXM6IGFkanVzdCBzdGFjayBieSBPRkZTRVQgYW5kIHBhc3MKKyAgICAvLy8gZXhlY3V0aW9uIHRvIEhBTkRMRVIuIE1hbnkgcGxhdGZvcm0tcmVsYXRlZCBkZXRhaWxzIGFsc28gOikKKyAgICBFSF9SRVRVUk4sCisKKyAgICAvLy8gUkVTVUxULCBPVVRDSEFJTiA9IEVIX1NKTEpfU0VUSk1QKElOQ0hBSU4sIGJ1ZmZlcikKKyAgICAvLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgZWguc2psai5zZXRqbXAgaW50cmluc2ljLgorICAgIC8vLyBJdCB0YWtlcyBhbiBpbnB1dCBjaGFpbiBhbmQgYSBwb2ludGVyIHRvIHRoZSBqdW1wIGJ1ZmZlciBhcyBpbnB1dHMKKyAgICAvLy8gYW5kIHJldHVybnMgYW4gb3V0Y2hhaW4uCisgICAgRUhfU0pMSl9TRVRKTVAsCisKKyAgICAvLy8gT1VUQ0hBSU4gPSBFSF9TSkxKX0xPTkdKTVAoSU5DSEFJTiwgYnVmZmVyKQorICAgIC8vLyBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBlaC5zamxqLmxvbmdqbXAgaW50cmluc2ljLgorICAgIC8vLyBJdCB0YWtlcyBhbiBpbnB1dCBjaGFpbiBhbmQgYSBwb2ludGVyIHRvIHRoZSBqdW1wIGJ1ZmZlciBhcyBpbnB1dHMKKyAgICAvLy8gYW5kIHJldHVybnMgYW4gb3V0Y2hhaW4uCisgICAgRUhfU0pMSl9MT05HSk1QLAorCisgICAgLy8vIE9VVENIQUlOID0gRUhfU0pMSl9TRVRVUF9ESVNQQVRDSChJTkNIQUlOKQorICAgIC8vLyBUaGUgdGFyZ2V0IGluaXRpYWxpemVzIHRoZSBkaXNwYXRjaCB0YWJsZSBoZXJlLgorICAgIEVIX1NKTEpfU0VUVVBfRElTUEFUQ0gsCisKKyAgICAvLy8gVGFyZ2V0Q29uc3RhbnQqIC0gTGlrZSBDb25zdGFudCosIGJ1dCB0aGUgREFHIGRvZXMgbm90IGRvIGFueSBmb2xkaW5nLAorICAgIC8vLyBzaW1wbGlmaWNhdGlvbiwgb3IgbG93ZXJpbmcgb2YgdGhlIGNvbnN0YW50LiBUaGV5IGFyZSB1c2VkIGZvciBjb25zdGFudHMKKyAgICAvLy8gd2hpY2ggYXJlIGtub3duIHRvIGZpdCBpbiB0aGUgaW1tZWRpYXRlIGZpZWxkcyBvZiB0aGVpciB1c2Vycywgb3IgZm9yCisgICAgLy8vIGNhcnJ5aW5nIG1hZ2ljIG51bWJlcnMgd2hpY2ggYXJlIG5vdCB2YWx1ZXMgd2hpY2ggbmVlZCB0byBiZQorICAgIC8vLyBtYXRlcmlhbGl6ZWQgaW4gcmVnaXN0ZXJzLgorICAgIFRhcmdldENvbnN0YW50LAorICAgIFRhcmdldENvbnN0YW50RlAsCisKKyAgICAvLy8gVGFyZ2V0R2xvYmFsQWRkcmVzcyAtIExpa2UgR2xvYmFsQWRkcmVzcywgYnV0IHRoZSBEQUcgZG9lcyBubyBmb2xkaW5nIG9yCisgICAgLy8vIGFueXRoaW5nIGVsc2Ugd2l0aCB0aGlzIG5vZGUsIGFuZCB0aGlzIGlzIHZhbGlkIGluIHRoZSB0YXJnZXQtc3BlY2lmaWMKKyAgICAvLy8gZGFnLCB0dXJuaW5nIGludG8gYSBHbG9iYWxBZGRyZXNzIG9wZXJhbmQuCisgICAgVGFyZ2V0R2xvYmFsQWRkcmVzcywKKyAgICBUYXJnZXRHbG9iYWxUTFNBZGRyZXNzLAorICAgIFRhcmdldEZyYW1lSW5kZXgsCisgICAgVGFyZ2V0SnVtcFRhYmxlLAorICAgIFRhcmdldENvbnN0YW50UG9vbCwKKyAgICBUYXJnZXRFeHRlcm5hbFN5bWJvbCwKKyAgICBUYXJnZXRCbG9ja0FkZHJlc3MsCisKKyAgICBNQ1N5bWJvbCwKKworICAgIC8vLyBUYXJnZXRJbmRleCAtIExpa2UgYSBjb25zdGFudCBwb29sIGVudHJ5LCBidXQgd2l0aCBjb21wbGV0ZWx5CisgICAgLy8vIHRhcmdldC1kZXBlbmRlbnQgc2VtYW50aWNzLiBIb2xkcyB0YXJnZXQgZmxhZ3MsIGEgMzItYml0IGluZGV4LCBhbmQgYQorICAgIC8vLyA2NC1iaXQgaW5kZXguIFRhcmdldHMgY2FuIHVzZSB0aGlzIGhvd2V2ZXIgdGhleSBsaWtlLgorICAgIFRhcmdldEluZGV4LAorCisgICAgLy8vIFJFU1VMVCA9IElOVFJJTlNJQ19XT19DSEFJTihJTlRSSU5TSUNJRCwgYXJnMSwgYXJnMiwgLi4uKQorICAgIC8vLyBUaGlzIG5vZGUgcmVwcmVzZW50cyBhIHRhcmdldCBpbnRyaW5zaWMgZnVuY3Rpb24gd2l0aCBubyBzaWRlIGVmZmVjdHMuCisgICAgLy8vIFRoZSBmaXJzdCBvcGVyYW5kIGlzIHRoZSBJRCBudW1iZXIgb2YgdGhlIGludHJpbnNpYyBmcm9tIHRoZQorICAgIC8vLyBsbHZtOjpJbnRyaW5zaWMgbmFtZXNwYWNlLiAgVGhlIG9wZXJhbmRzIHRvIHRoZSBpbnRyaW5zaWMgZm9sbG93LiAgVGhlCisgICAgLy8vIG5vZGUgcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBpbnRyaW5zaWMuCisgICAgSU5UUklOU0lDX1dPX0NIQUlOLAorCisgICAgLy8vIFJFU1VMVCxPVVRDSEFJTiA9IElOVFJJTlNJQ19XX0NIQUlOKElOQ0hBSU4sIElOVFJJTlNJQ0lELCBhcmcxLCAuLi4pCisgICAgLy8vIFRoaXMgbm9kZSByZXByZXNlbnRzIGEgdGFyZ2V0IGludHJpbnNpYyBmdW5jdGlvbiB3aXRoIHNpZGUgZWZmZWN0cyB0aGF0CisgICAgLy8vIHJldHVybnMgYSByZXN1bHQuICBUaGUgZmlyc3Qgb3BlcmFuZCBpcyBhIGNoYWluIHBvaW50ZXIuICBUaGUgc2Vjb25kIGlzCisgICAgLy8vIHRoZSBJRCBudW1iZXIgb2YgdGhlIGludHJpbnNpYyBmcm9tIHRoZSBsbHZtOjpJbnRyaW5zaWMgbmFtZXNwYWNlLiAgVGhlCisgICAgLy8vIG9wZXJhbmRzIHRvIHRoZSBpbnRyaW5zaWMgZm9sbG93LiAgVGhlIG5vZGUgaGFzIHR3byByZXN1bHRzLCB0aGUgcmVzdWx0CisgICAgLy8vIG9mIHRoZSBpbnRyaW5zaWMgYW5kIGFuIG91dHB1dCBjaGFpbi4KKyAgICBJTlRSSU5TSUNfV19DSEFJTiwKKworICAgIC8vLyBPVVRDSEFJTiA9IElOVFJJTlNJQ19WT0lEKElOQ0hBSU4sIElOVFJJTlNJQ0lELCBhcmcxLCBhcmcyLCAuLi4pCisgICAgLy8vIFRoaXMgbm9kZSByZXByZXNlbnRzIGEgdGFyZ2V0IGludHJpbnNpYyBmdW5jdGlvbiB3aXRoIHNpZGUgZWZmZWN0cyB0aGF0CisgICAgLy8vIGRvZXMgbm90IHJldHVybiBhIHJlc3VsdC4gIFRoZSBmaXJzdCBvcGVyYW5kIGlzIGEgY2hhaW4gcG9pbnRlci4gIFRoZQorICAgIC8vLyBzZWNvbmQgaXMgdGhlIElEIG51bWJlciBvZiB0aGUgaW50cmluc2ljIGZyb20gdGhlIGxsdm06OkludHJpbnNpYworICAgIC8vLyBuYW1lc3BhY2UuICBUaGUgb3BlcmFuZHMgdG8gdGhlIGludHJpbnNpYyBmb2xsb3cuCisgICAgSU5UUklOU0lDX1ZPSUQsCisKKyAgICAvLy8gQ29weVRvUmVnIC0gVGhpcyBub2RlIGhhcyB0aHJlZSBvcGVyYW5kczogYSBjaGFpbiwgYSByZWdpc3RlciBudW1iZXIgdG8KKyAgICAvLy8gc2V0IHRvIHRoaXMgdmFsdWUsIGFuZCBhIHZhbHVlLgorICAgIENvcHlUb1JlZywKKworICAgIC8vLyBDb3B5RnJvbVJlZyAtIFRoaXMgbm9kZSBpbmRpY2F0ZXMgdGhhdCB0aGUgaW5wdXQgdmFsdWUgaXMgYSB2aXJ0dWFsIG9yCisgICAgLy8vIHBoeXNpY2FsIHJlZ2lzdGVyIHRoYXQgaXMgZGVmaW5lZCBvdXRzaWRlIG9mIHRoZSBzY29wZSBvZiB0aGlzCisgICAgLy8vIFNlbGVjdGlvbkRBRy4gIFRoZSByZWdpc3RlciBpcyBhdmFpbGFibGUgZnJvbSB0aGUgUmVnaXN0ZXJTRE5vZGUgb2JqZWN0LgorICAgIENvcHlGcm9tUmVnLAorCisgICAgLy8vIFVOREVGIC0gQW4gdW5kZWZpbmVkIG5vZGUuCisgICAgVU5ERUYsCisKKyAgICAvLy8gRVhUUkFDVF9FTEVNRU5UIC0gVGhpcyBpcyB1c2VkIHRvIGdldCB0aGUgbG93ZXIgb3IgdXBwZXIgKGRldGVybWluZWQgYnkKKyAgICAvLy8gYSBDb25zdGFudCwgd2hpY2ggaXMgcmVxdWlyZWQgdG8gYmUgb3BlcmFuZCAjMSkgaGFsZiBvZiB0aGUgaW50ZWdlciBvcgorICAgIC8vLyBmbG9hdCB2YWx1ZSBzcGVjaWZpZWQgYXMgb3BlcmFuZCAjMC4gIFRoaXMgaXMgb25seSBmb3IgdXNlIGJlZm9yZQorICAgIC8vLyBsZWdhbGl6YXRpb24sIGZvciB2YWx1ZXMgdGhhdCB3aWxsIGJlIGJyb2tlbiBpbnRvIG11bHRpcGxlIHJlZ2lzdGVycy4KKyAgICBFWFRSQUNUX0VMRU1FTlQsCisKKyAgICAvLy8gQlVJTERfUEFJUiAtIFRoaXMgaXMgdGhlIG9wcG9zaXRlIG9mIEVYVFJBQ1RfRUxFTUVOVCBpbiBzb21lIHdheXMuCisgICAgLy8vIEdpdmVuIHR3byB2YWx1ZXMgb2YgdGhlIHNhbWUgaW50ZWdlciB2YWx1ZSB0eXBlLCB0aGlzIHByb2R1Y2VzIGEgdmFsdWUKKyAgICAvLy8gdHdpY2UgYXMgYmlnLiAgTGlrZSBFWFRSQUNUX0VMRU1FTlQsIHRoaXMgY2FuIG9ubHkgYmUgdXNlZCBiZWZvcmUKKyAgICAvLy8gbGVnYWxpemF0aW9uLiBUaGUgbG93ZXIgcGFydCBvZiB0aGUgY29tcG9zaXRlIHZhbHVlIHNob3VsZCBiZSBpbgorICAgIC8vLyBlbGVtZW50IDAgYW5kIHRoZSB1cHBlciBwYXJ0IHNob3VsZCBiZSBpbiBlbGVtZW50IDEuCisgICAgQlVJTERfUEFJUiwKKworICAgIC8vLyBNRVJHRV9WQUxVRVMgLSBUaGlzIG5vZGUgdGFrZXMgbXVsdGlwbGUgZGlzY3JldGUgb3BlcmFuZHMgYW5kIHJldHVybnMKKyAgICAvLy8gdGhlbSBhbGwgYXMgaXRzIGluZGl2aWR1YWwgcmVzdWx0cy4gIFRoaXMgbm9kZXMgaGFzIGV4YWN0bHkgdGhlIHNhbWUKKyAgICAvLy8gbnVtYmVyIG9mIGlucHV0cyBhbmQgb3V0cHV0cy4gVGhpcyBub2RlIGlzIHVzZWZ1bCBmb3Igc29tZSBwaWVjZXMgb2YgdGhlCisgICAgLy8vIGNvZGUgZ2VuZXJhdG9yIHRoYXQgd2FudCB0byB0aGluayBhYm91dCBhIHNpbmdsZSBub2RlIHdpdGggbXVsdGlwbGUKKyAgICAvLy8gcmVzdWx0cywgbm90IG11bHRpcGxlIG5vZGVzLgorICAgIE1FUkdFX1ZBTFVFUywKKworICAgIC8vLyBTaW1wbGUgaW50ZWdlciBiaW5hcnkgYXJpdGhtZXRpYyBvcGVyYXRvcnMuCisgICAgQURELCBTVUIsIE1VTCwgU0RJViwgVURJViwgU1JFTSwgVVJFTSwKKworICAgIC8vLyBTTVVMX0xPSEkvVU1VTF9MT0hJIC0gTXVsdGlwbHkgdHdvIGludGVnZXJzIG9mIHR5cGUgaU4sIHByb2R1Y2luZworICAgIC8vLyBhIHNpZ25lZC91bnNpZ25lZCB2YWx1ZSBvZiB0eXBlIGlbMipOXSwgYW5kIHJldHVybiB0aGUgZnVsbCB2YWx1ZSBhcworICAgIC8vLyB0d28gcmVzdWx0cywgZWFjaCBvZiB0eXBlIGlOLgorICAgIFNNVUxfTE9ISSwgVU1VTF9MT0hJLAorCisgICAgLy8vIFNESVZSRU0vVURJVlJFTSAtIERpdmlkZSB0d28gaW50ZWdlcnMgYW5kIHByb2R1Y2UgYm90aCBhIHF1b3RpZW50IGFuZAorICAgIC8vLyByZW1haW5kZXIgcmVzdWx0LgorICAgIFNESVZSRU0sIFVESVZSRU0sCisKKyAgICAvLy8gQ0FSUllfRkFMU0UgLSBUaGlzIG5vZGUgaXMgdXNlZCB3aGVuIGZvbGRpbmcgb3RoZXIgbm9kZXMsCisgICAgLy8vIGxpa2UgQUREQy9TVUJDLCB3aGljaCBpbmRpY2F0ZSB0aGUgY2FycnkgcmVzdWx0IGlzIGFsd2F5cyBmYWxzZS4KKyAgICBDQVJSWV9GQUxTRSwKKworICAgIC8vLyBDYXJyeS1zZXR0aW5nIG5vZGVzIGZvciBtdWx0aXBsZSBwcmVjaXNpb24gYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uLgorICAgIC8vLyBUaGVzZSBub2RlcyB0YWtlIHR3byBvcGVyYW5kcyBvZiB0aGUgc2FtZSB2YWx1ZSB0eXBlLCBhbmQgcHJvZHVjZSB0d28KKyAgICAvLy8gcmVzdWx0cy4gIFRoZSBmaXJzdCByZXN1bHQgaXMgdGhlIG5vcm1hbCBhZGQgb3Igc3ViIHJlc3VsdCwgdGhlIHNlY29uZAorICAgIC8vLyByZXN1bHQgaXMgdGhlIGNhcnJ5IGZsYWcgcmVzdWx0LgorICAgIC8vLyBGSVhNRTogVGhlc2Ugbm9kZXMgYXJlIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgQUREQ0FSUlkgYW5kIFNVQkNBUlJZLgorICAgIC8vLyBUaGV5IGFyZSBrZXB0IGFyb3VuZCBmb3Igbm93IHRvIHByb3ZpZGUgYSBzbW9vdGggdHJhbnNpdGlvbiBwYXRoCisgICAgLy8vIHRvd2FyZCB0aGUgdXNlIG9mIEFERENBUlJZL1NVQkNBUlJZIGFuZCB3aWxsIGV2ZW50dWFsbHkgYmUgcmVtb3ZlZC4KKyAgICBBRERDLCBTVUJDLAorCisgICAgLy8vIENhcnJ5LXVzaW5nIG5vZGVzIGZvciBtdWx0aXBsZSBwcmVjaXNpb24gYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uLiBUaGVzZQorICAgIC8vLyBub2RlcyB0YWtlIHRocmVlIG9wZXJhbmRzOiBUaGUgZmlyc3QgdHdvIGFyZSB0aGUgbm9ybWFsIGxocyBhbmQgcmhzIHRvCisgICAgLy8vIHRoZSBhZGQgb3Igc3ViLCBhbmQgdGhlIHRoaXJkIGlzIHRoZSBpbnB1dCBjYXJyeSBmbGFnLiAgVGhlc2Ugbm9kZXMKKyAgICAvLy8gcHJvZHVjZSB0d28gcmVzdWx0czsgdGhlIG5vcm1hbCByZXN1bHQgb2YgdGhlIGFkZCBvciBzdWIsIGFuZCB0aGUgb3V0cHV0CisgICAgLy8vIGNhcnJ5IGZsYWcuICBUaGVzZSBub2RlcyBib3RoIHJlYWQgYW5kIHdyaXRlIGEgY2FycnkgZmxhZyB0byBhbGxvdyB0aGVtCisgICAgLy8vIHRvIHRoZW0gdG8gYmUgY2hhaW5lZCB0b2dldGhlciBmb3IgYWRkIGFuZCBzdWIgb2YgYXJiaXRyYXJpbHkgbGFyZ2UKKyAgICAvLy8gdmFsdWVzLgorICAgIEFEREUsIFNVQkUsCisKKyAgICAvLy8gQ2FycnktdXNpbmcgbm9kZXMgZm9yIG11bHRpcGxlIHByZWNpc2lvbiBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24uCisgICAgLy8vIFRoZXNlIG5vZGVzIHRha2UgdGhyZWUgb3BlcmFuZHM6IFRoZSBmaXJzdCB0d28gYXJlIHRoZSBub3JtYWwgbGhzIGFuZAorICAgIC8vLyByaHMgdG8gdGhlIGFkZCBvciBzdWIsIGFuZCB0aGUgdGhpcmQgaXMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlcmUKKyAgICAvLy8gaXMgYW4gaW5jb21pbmcgY2FycnkuIFRoZXNlIG5vZGVzIHByb2R1Y2UgdHdvIHJlc3VsdHM6IHRoZSBub3JtYWwKKyAgICAvLy8gcmVzdWx0IG9mIHRoZSBhZGQgb3Igc3ViLCBhbmQgdGhlIG91dHB1dCBjYXJyeSBzbyB0aGV5IGNhbiBiZSBjaGFpbmVkCisgICAgLy8vIHRvZ2V0aGVyLiBUaGUgdXNlIG9mIHRoaXMgb3Bjb2RlIGlzIHByZWZlcmFibGUgdG8gYWRkZS9zdWJlIGlmIHRoZQorICAgIC8vLyB0YXJnZXQgc3VwcG9ydHMgaXQsIGFzIHRoZSBjYXJyeSBpcyBhIHJlZ3VsYXIgdmFsdWUgcmF0aGVyIHRoYW4gYQorICAgIC8vLyBnbHVlLCB3aGljaCBhbGxvd3MgZnVydGhlciBvcHRpbWlzYXRpb24uCisgICAgQUREQ0FSUlksIFNVQkNBUlJZLAorCisgICAgLy8vIFJFU1VMVCwgQk9PTCA9IFtTVV1BRERPKExIUywgUkhTKSAtIE92ZXJmbG93LWF3YXJlIG5vZGVzIGZvciBhZGRpdGlvbi4KKyAgICAvLy8gVGhlc2Ugbm9kZXMgdGFrZSB0d28gb3BlcmFuZHM6IHRoZSBub3JtYWwgTEhTIGFuZCBSSFMgdG8gdGhlIGFkZC4gVGhleQorICAgIC8vLyBwcm9kdWNlIHR3byByZXN1bHRzOiB0aGUgbm9ybWFsIHJlc3VsdCBvZiB0aGUgYWRkLCBhbmQgYSBib29sZWFuIHRoYXQKKyAgICAvLy8gaW5kaWNhdGVzIGlmIGFuIG92ZXJmbG93IG9jY3VycmVkICgqbm90KiBhIGZsYWcsIGJlY2F1c2UgaXQgbWF5IGJlIHN0b3JlCisgICAgLy8vIHRvIG1lbW9yeSwgZXRjLikuICBJZiB0aGUgdHlwZSBvZiB0aGUgYm9vbGVhbiBpcyBub3QgaTEgdGhlbiB0aGUgaGlnaAorICAgIC8vLyBiaXRzIGNvbmZvcm0gdG8gZ2V0Qm9vbGVhbkNvbnRlbnRzLgorICAgIC8vLyBUaGVzZSBub2RlcyBhcmUgZ2VuZXJhdGVkIGZyb20gbGx2bS5bc3VdYWRkLndpdGgub3ZlcmZsb3cgaW50cmluc2ljcy4KKyAgICBTQURETywgVUFERE8sCisKKyAgICAvLy8gU2FtZSBmb3Igc3VidHJhY3Rpb24uCisgICAgU1NVQk8sIFVTVUJPLAorCisgICAgLy8vIFNhbWUgZm9yIG11bHRpcGxpY2F0aW9uLgorICAgIFNNVUxPLCBVTVVMTywKKworICAgIC8vLyBTaW1wbGUgYmluYXJ5IGZsb2F0aW5nIHBvaW50IG9wZXJhdG9ycy4KKyAgICBGQURELCBGU1VCLCBGTVVMLCBGRElWLCBGUkVNLAorCisgICAgLy8vIENvbnN0cmFpbmVkIHZlcnNpb25zIG9mIHRoZSBiaW5hcnkgZmxvYXRpbmcgcG9pbnQgb3BlcmF0b3JzLgorICAgIC8vLyBUaGVzZSB3aWxsIGJlIGxvd2VyZWQgdG8gdGhlIHNpbXBsZSBvcGVyYXRvcnMgYmVmb3JlIGZpbmFsIHNlbGVjdGlvbi4KKyAgICAvLy8gVGhleSBhcmUgdXNlZCB0byBsaW1pdCBvcHRpbWl6YXRpb25zIHdoaWxlIHRoZSBEQUcgaXMgYmVpbmcKKyAgICAvLy8gb3B0aW1pemVkLgorICAgIFNUUklDVF9GQURELCBTVFJJQ1RfRlNVQiwgU1RSSUNUX0ZNVUwsIFNUUklDVF9GRElWLCBTVFJJQ1RfRlJFTSwKKyAgICBTVFJJQ1RfRk1BLAorCisgICAgLy8vIENvbnN0cmFpbmVkIHZlcnNpb25zIG9mIGxpYm0tZXF1aXZhbGVudCBmbG9hdGluZyBwb2ludCBpbnRyaW5zaWNzLgorICAgIC8vLyBUaGVzZSB3aWxsIGJlIGxvd2VyZWQgdG8gdGhlIGVxdWl2YWxlbnQgbm9uLWNvbnN0cmFpbmVkIHBzZXVkby1vcAorICAgIC8vLyAob3IgZXhwYW5kZWQgdG8gdGhlIGVxdWl2YWxlbnQgbGlicmFyeSBjYWxsKSBiZWZvcmUgZmluYWwgc2VsZWN0aW9uLgorICAgIC8vLyBUaGV5IGFyZSB1c2VkIHRvIGxpbWl0IG9wdGltaXphdGlvbnMgd2hpbGUgdGhlIERBRyBpcyBiZWluZyBvcHRpbWl6ZWQuCisgICAgU1RSSUNUX0ZTUVJULCBTVFJJQ1RfRlBPVywgU1RSSUNUX0ZQT1dJLCBTVFJJQ1RfRlNJTiwgU1RSSUNUX0ZDT1MsCisgICAgU1RSSUNUX0ZFWFAsIFNUUklDVF9GRVhQMiwgU1RSSUNUX0ZMT0csIFNUUklDVF9GTE9HMTAsIFNUUklDVF9GTE9HMiwKKyAgICBTVFJJQ1RfRlJJTlQsIFNUUklDVF9GTkVBUkJZSU5ULAorCisgICAgLy8vIEZNQSAtIFBlcmZvcm0gYSAqIGIgKyBjIHdpdGggbm8gaW50ZXJtZWRpYXRlIHJvdW5kaW5nIHN0ZXAuCisgICAgRk1BLAorCisgICAgLy8vIEZNQUQgLSBQZXJmb3JtIGEgKiBiICsgYywgd2hpbGUgZ2V0dGluZyB0aGUgc2FtZSByZXN1bHQgYXMgdGhlCisgICAgLy8vIHNlcGFyYXRlbHkgcm91bmRlZCBvcGVyYXRpb25zLgorICAgIEZNQUQsCisKKyAgICAvLy8gRkNPUFlTSUdOKFgsIFkpIC0gUmV0dXJuIHRoZSB2YWx1ZSBvZiBYIHdpdGggdGhlIHNpZ24gb2YgWS4gIE5PVEU6IFRoaXMKKyAgICAvLy8gREFHIG5vZGUgZG9lcyBub3QgcmVxdWlyZSB0aGF0IFggYW5kIFkgaGF2ZSB0aGUgc2FtZSB0eXBlLCBqdXN0IHRoYXQKKyAgICAvLy8gdGhleSBhcmUgYm90aCBmbG9hdGluZyBwb2ludC4gIFggYW5kIHRoZSByZXN1bHQgbXVzdCBoYXZlIHRoZSBzYW1lIHR5cGUuCisgICAgLy8vIEZDT1BZU0lHTihmMzIsIGY2NCkgaXMgYWxsb3dlZC4KKyAgICBGQ09QWVNJR04sCisKKyAgICAvLy8gSU5UID0gRkdFVFNJR04oRlApIC0gUmV0dXJuIHRoZSBzaWduIGJpdCBvZiB0aGUgc3BlY2lmaWVkIGZsb2F0aW5nIHBvaW50CisgICAgLy8vIHZhbHVlIGFzIGFuIGludGVnZXIgMC8xIHZhbHVlLgorICAgIEZHRVRTSUdOLAorCisgICAgLy8vIFJldHVybnMgcGxhdGZvcm0gc3BlY2lmaWMgY2Fub25pY2FsIGVuY29kaW5nIG9mIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgorICAgIEZDQU5PTklDQUxJWkUsCisKKyAgICAvLy8gQlVJTERfVkVDVE9SKEVMVDAsIEVMVDEsIEVMVDIsIEVMVDMsLi4uKSAtIFJldHVybiBhIHZlY3RvciB3aXRoIHRoZQorICAgIC8vLyBzcGVjaWZpZWQsIHBvc3NpYmx5IHZhcmlhYmxlLCBlbGVtZW50cy4gIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaXMKKyAgICAvLy8gcmVxdWlyZWQgdG8gYmUgYSBwb3dlciBvZiB0d28uICBUaGUgdHlwZXMgb2YgdGhlIG9wZXJhbmRzIG11c3QgYWxsIGJlCisgICAgLy8vIHRoZSBzYW1lIGFuZCBtdXN0IG1hdGNoIHRoZSB2ZWN0b3IgZWxlbWVudCB0eXBlLCBleGNlcHQgdGhhdCBpbnRlZ2VyCisgICAgLy8vIHR5cGVzIGFyZSBhbGxvd2VkIHRvIGJlIGxhcmdlciB0aGFuIHRoZSBlbGVtZW50IHR5cGUsIGluIHdoaWNoIGNhc2UKKyAgICAvLy8gdGhlIG9wZXJhbmRzIGFyZSBpbXBsaWNpdGx5IHRydW5jYXRlZC4KKyAgICBCVUlMRF9WRUNUT1IsCisKKyAgICAvLy8gSU5TRVJUX1ZFQ1RPUl9FTFQoVkVDVE9SLCBWQUwsIElEWCkgLSBSZXR1cm5zIFZFQ1RPUiB3aXRoIHRoZSBlbGVtZW50CisgICAgLy8vIGF0IElEWCByZXBsYWNlZCB3aXRoIFZBTC4gIElmIHRoZSB0eXBlIG9mIFZBTCBpcyBsYXJnZXIgdGhhbiB0aGUgdmVjdG9yCisgICAgLy8vIGVsZW1lbnQgdHlwZSB0aGVuIFZBTCBpcyB0cnVuY2F0ZWQgYmVmb3JlIHJlcGxhY2VtZW50LgorICAgIElOU0VSVF9WRUNUT1JfRUxULAorCisgICAgLy8vIEVYVFJBQ1RfVkVDVE9SX0VMVChWRUNUT1IsIElEWCkgLSBSZXR1cm5zIGEgc2luZ2xlIGVsZW1lbnQgZnJvbSBWRUNUT1IKKyAgICAvLy8gaWRlbnRpZmllZCBieSB0aGUgKHBvdGVudGlhbGx5IHZhcmlhYmxlKSBlbGVtZW50IG51bWJlciBJRFguICBJZiB0aGUKKyAgICAvLy8gcmV0dXJuIHR5cGUgaXMgYW4gaW50ZWdlciB0eXBlIGxhcmdlciB0aGFuIHRoZSBlbGVtZW50IHR5cGUgb2YgdGhlCisgICAgLy8vIHZlY3RvciwgdGhlIHJlc3VsdCBpcyBleHRlbmRlZCB0byB0aGUgd2lkdGggb2YgdGhlIHJldHVybiB0eXBlLiBJbgorICAgIC8vLyB0aGF0IGNhc2UsIHRoZSBoaWdoIGJpdHMgYXJlIHVuZGVmaW5lZC4KKyAgICBFWFRSQUNUX1ZFQ1RPUl9FTFQsCisKKyAgICAvLy8gQ09OQ0FUX1ZFQ1RPUlMoVkVDVE9SMCwgVkVDVE9SMSwgLi4uKSAtIEdpdmVuIGEgbnVtYmVyIG9mIHZhbHVlcyBvZgorICAgIC8vLyB2ZWN0b3IgdHlwZSB3aXRoIHRoZSBzYW1lIGxlbmd0aCBhbmQgZWxlbWVudCB0eXBlLCB0aGlzIHByb2R1Y2VzIGEKKyAgICAvLy8gY29uY2F0ZW5hdGVkIHZlY3RvciByZXN1bHQgdmFsdWUsIHdpdGggbGVuZ3RoIGVxdWFsIHRvIHRoZSBzdW0gb2YgdGhlCisgICAgLy8vIGxlbmd0aHMgb2YgdGhlIGlucHV0IHZlY3RvcnMuCisgICAgQ09OQ0FUX1ZFQ1RPUlMsCisKKyAgICAvLy8gSU5TRVJUX1NVQlZFQ1RPUihWRUNUT1IxLCBWRUNUT1IyLCBJRFgpIC0gUmV0dXJucyBhIHZlY3RvcgorICAgIC8vLyB3aXRoIFZFQ1RPUjIgaW5zZXJ0ZWQgaW50byBWRUNUT1IxIGF0IHRoZSAocG90ZW50aWFsbHkKKyAgICAvLy8gdmFyaWFibGUpIGVsZW1lbnQgbnVtYmVyIElEWCwgd2hpY2ggbXVzdCBiZSBhIG11bHRpcGxlIG9mIHRoZQorICAgIC8vLyBWRUNUT1IyIHZlY3RvciBsZW5ndGguICBUaGUgZWxlbWVudHMgb2YgVkVDVE9SMSBzdGFydGluZyBhdAorICAgIC8vLyBJRFggYXJlIG92ZXJ3cml0dGVuIHdpdGggVkVDVE9SMi4gIEVsZW1lbnRzIElEWCB0aHJvdWdoCisgICAgLy8vIHZlY3Rvcl9sZW5ndGgoVkVDVE9SMikgbXVzdCBiZSB2YWxpZCBWRUNUT1IxIGluZGljZXMuCisgICAgSU5TRVJUX1NVQlZFQ1RPUiwKKworICAgIC8vLyBFWFRSQUNUX1NVQlZFQ1RPUihWRUNUT1IsIElEWCkgLSBSZXR1cm5zIGEgc3VidmVjdG9yIGZyb20gVkVDVE9SIChhbgorICAgIC8vLyB2ZWN0b3IgdmFsdWUpIHN0YXJ0aW5nIHdpdGggdGhlIGVsZW1lbnQgbnVtYmVyIElEWCwgd2hpY2ggbXVzdCBiZSBhCisgICAgLy8vIGNvbnN0YW50IG11bHRpcGxlIG9mIHRoZSByZXN1bHQgdmVjdG9yIGxlbmd0aC4KKyAgICBFWFRSQUNUX1NVQlZFQ1RPUiwKKworICAgIC8vLyBWRUNUT1JfU0hVRkZMRShWRUMxLCBWRUMyKSAtIFJldHVybnMgYSB2ZWN0b3IsIG9mIHRoZSBzYW1lIHR5cGUgYXMKKyAgICAvLy8gVkVDMS9WRUMyLiAgQSBWRUNUT1JfU0hVRkZMRSBub2RlIGFsc28gY29udGFpbnMgYW4gYXJyYXkgb2YgY29uc3RhbnQgaW50CisgICAgLy8vIHZhbHVlcyB0aGF0IGluZGljYXRlIHdoaWNoIHZhbHVlIChvciB1bmRlZikgZWFjaCByZXN1bHQgZWxlbWVudCB3aWxsCisgICAgLy8vIGdldC4gIFRoZXNlIGNvbnN0YW50IGludHMgYXJlIGFjY2Vzc2libGUgdGhyb3VnaCB0aGUKKyAgICAvLy8gU2h1ZmZsZVZlY3RvclNETm9kZSBjbGFzcy4gIFRoaXMgaXMgcXVpdGUgc2ltaWxhciB0byB0aGUgQWx0aXZlYworICAgIC8vLyAndnBlcm0nIGluc3RydWN0aW9uLCBleGNlcHQgdGhhdCB0aGUgaW5kaWNlcyBtdXN0IGJlIGNvbnN0YW50cyBhbmQgYXJlCisgICAgLy8vIGluIHRlcm1zIG9mIHRoZSBlbGVtZW50IHNpemUgb2YgVkVDMS9WRUMyLCBub3QgaW4gdGVybXMgb2YgYnl0ZXMuCisgICAgVkVDVE9SX1NIVUZGTEUsCisKKyAgICAvLy8gU0NBTEFSX1RPX1ZFQ1RPUihWQUwpIC0gVGhpcyByZXByZXNlbnRzIHRoZSBvcGVyYXRpb24gb2YgbG9hZGluZyBhCisgICAgLy8vIHNjYWxhciB2YWx1ZSBpbnRvIGVsZW1lbnQgMCBvZiB0aGUgcmVzdWx0YW50IHZlY3RvciB0eXBlLiAgVGhlIHRvcAorICAgIC8vLyBlbGVtZW50cyAxIHRvIE4tMSBvZiB0aGUgTi1lbGVtZW50IHZlY3RvciBhcmUgdW5kZWZpbmVkLiAgVGhlIHR5cGUKKyAgICAvLy8gb2YgdGhlIG9wZXJhbmQgbXVzdCBtYXRjaCB0aGUgdmVjdG9yIGVsZW1lbnQgdHlwZSwgZXhjZXB0IHdoZW4gdGhleQorICAgIC8vLyBhcmUgaW50ZWdlciB0eXBlcy4gIEluIHRoaXMgY2FzZSB0aGUgb3BlcmFuZCBpcyBhbGxvd2VkIHRvIGJlIHdpZGVyCisgICAgLy8vIHRoYW4gdGhlIHZlY3RvciBlbGVtZW50IHR5cGUsIGFuZCBpcyBpbXBsaWNpdGx5IHRydW5jYXRlZCB0byBpdC4KKyAgICBTQ0FMQVJfVE9fVkVDVE9SLAorCisgICAgLy8vIE1VTEhVL01VTEhTIC0gTXVsdGlwbHkgaGlnaCAtIE11bHRpcGx5IHR3byBpbnRlZ2VycyBvZiB0eXBlIGlOLAorICAgIC8vLyBwcm9kdWNpbmcgYW4gdW5zaWduZWQvc2lnbmVkIHZhbHVlIG9mIHR5cGUgaVsyKk5dLCB0aGVuIHJldHVybiB0aGUgdG9wCisgICAgLy8vIHBhcnQuCisgICAgTVVMSFUsIE1VTEhTLAorCisgICAgLy8vIFtVU117TUlOL01BWH0gLSBCaW5hcnkgbWluaW11bSBvciBtYXhpbXVtIG9yIHNpZ25lZCBvciB1bnNpZ25lZAorICAgIC8vLyBpbnRlZ2Vycy4KKyAgICBTTUlOLCBTTUFYLCBVTUlOLCBVTUFYLAorCisgICAgLy8vIEJpdHdpc2Ugb3BlcmF0b3JzIC0gbG9naWNhbCBhbmQsIGxvZ2ljYWwgb3IsIGxvZ2ljYWwgeG9yLgorICAgIEFORCwgT1IsIFhPUiwKKworICAgIC8vLyBBQlMgLSBEZXRlcm1pbmUgdGhlIHVuc2lnbmVkIGFic29sdXRlIHZhbHVlIG9mIGEgc2lnbmVkIGludGVnZXIgdmFsdWUgb2YKKyAgICAvLy8gdGhlIHNhbWUgYml0d2lkdGguCisgICAgLy8vIE5vdGU6IEEgdmFsdWUgb2YgSU5UX01JTiB3aWxsIHJldHVybiBJTlRfTUlOLCBubyBzYXR1cmF0aW9uIG9yIG92ZXJmbG93CisgICAgLy8vIGlzIHBlcmZvcm1lZC4KKyAgICBBQlMsCisKKyAgICAvLy8gU2hpZnQgYW5kIHJvdGF0aW9uIG9wZXJhdGlvbnMuICBBZnRlciBsZWdhbGl6YXRpb24sIHRoZSB0eXBlIG9mIHRoZQorICAgIC8vLyBzaGlmdCBhbW91bnQgaXMga25vd24gdG8gYmUgVExJLmdldFNoaWZ0QW1vdW50VHkoKS4gIEJlZm9yZSBsZWdhbGl6YXRpb24KKyAgICAvLy8gdGhlIHNoaWZ0IGFtb3VudCBjYW4gYmUgYW55IHR5cGUsIGJ1dCBjYXJlIG11c3QgYmUgdGFrZW4gdG8gZW5zdXJlIGl0IGlzCisgICAgLy8vIGxhcmdlIGVub3VnaC4gIFRMSS5nZXRTaGlmdEFtb3VudFR5KCkgaXMgaTggb24gc29tZSB0YXJnZXRzLCBidXQgYmVmb3JlCisgICAgLy8vIGxlZ2FsaXphdGlvbiwgdHlwZXMgbGlrZSBpMTAyNCBjYW4gb2NjdXIgYW5kIGk4IGRvZXNuJ3QgaGF2ZSBlbm91Z2ggYml0cworICAgIC8vLyB0byByZXByZXNlbnQgdGhlIHNoaWZ0IGFtb3VudC4KKyAgICAvLy8gV2hlbiB0aGUgMXN0IG9wZXJhbmQgaXMgYSB2ZWN0b3IsIHRoZSBzaGlmdCBhbW91bnQgbXVzdCBiZSBpbiB0aGUgc2FtZQorICAgIC8vLyB0eXBlLiAoVExJLmdldFNoaWZ0QW1vdW50VHkoKSB3aWxsIHJldHVybiB0aGUgc2FtZSB0eXBlIHdoZW4gdGhlIGlucHV0CisgICAgLy8vIHR5cGUgaXMgYSB2ZWN0b3IuKQorICAgIFNITCwgU1JBLCBTUkwsIFJPVEwsIFJPVFIsCisKKyAgICAvLy8gQnl0ZSBTd2FwIGFuZCBDb3VudGluZyBvcGVyYXRvcnMuCisgICAgQlNXQVAsIENUVFosIENUTFosIENUUE9QLCBCSVRSRVZFUlNFLAorCisgICAgLy8vIEJpdCBjb3VudGluZyBvcGVyYXRvcnMgd2l0aCBhbiB1bmRlZmluZWQgcmVzdWx0IGZvciB6ZXJvIGlucHV0cy4KKyAgICBDVFRaX1pFUk9fVU5ERUYsIENUTFpfWkVST19VTkRFRiwKKworICAgIC8vLyBTZWxlY3QoQ09ORCwgVFJVRVZBTCwgRkFMU0VWQUwpLiAgSWYgdGhlIHR5cGUgb2YgdGhlIGJvb2xlYW4gQ09ORCBpcyBub3QKKyAgICAvLy8gaTEgdGhlbiB0aGUgaGlnaCBiaXRzIG11c3QgY29uZm9ybSB0byBnZXRCb29sZWFuQ29udGVudHMuCisgICAgU0VMRUNULAorCisgICAgLy8vIFNlbGVjdCB3aXRoIGEgdmVjdG9yIGNvbmRpdGlvbiAob3AgIzApIGFuZCB0d28gdmVjdG9yIG9wZXJhbmRzIChvcHMgIzEKKyAgICAvLy8gYW5kICMyKSwgcmV0dXJuaW5nIGEgdmVjdG9yIHJlc3VsdC4gIEFsbCB2ZWN0b3JzIGhhdmUgdGhlIHNhbWUgbGVuZ3RoLgorICAgIC8vLyBNdWNoIGxpa2UgdGhlIHNjYWxhciBzZWxlY3QgYW5kIHNldGNjLCBlYWNoIGJpdCBpbiB0aGUgY29uZGl0aW9uIHNlbGVjdHMKKyAgICAvLy8gd2hldGhlciB0aGUgY29ycmVzcG9uZGluZyByZXN1bHQgZWxlbWVudCBpcyB0YWtlbiBmcm9tIG9wICMxIG9yIG9wICMyLgorICAgIC8vLyBBdCBmaXJzdCwgdGhlIFZTRUxFQ1QgY29uZGl0aW9uIGlzIG9mIHZYaTEgdHlwZS4gTGF0ZXIsIHRhcmdldHMgbWF5CisgICAgLy8vIGNoYW5nZSB0aGUgY29uZGl0aW9uIHR5cGUgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIFZTRUxFQ1Qgbm9kZSB1c2luZyBhCisgICAgLy8vIHBhdHRlcm4uIFRoZSBjb25kaXRpb24gZm9sbG93cyB0aGUgQm9vbGVhbkNvbnRlbnQgZm9ybWF0IG9mIHRoZSB0YXJnZXQuCisgICAgVlNFTEVDVCwKKworICAgIC8vLyBTZWxlY3Qgd2l0aCBjb25kaXRpb24gb3BlcmF0b3IgLSBUaGlzIHNlbGVjdHMgYmV0d2VlbiBhIHRydWUgdmFsdWUgYW5kCisgICAgLy8vIGEgZmFsc2UgdmFsdWUgKG9wcyAjMiBhbmQgIzMpIGJhc2VkIG9uIHRoZSBib29sZWFuIHJlc3VsdCBvZiBjb21wYXJpbmcKKyAgICAvLy8gdGhlIGxocyBhbmQgcmhzIChvcHMgIzAgYW5kICMxKSBvZiBhIGNvbmRpdGlvbmFsIGV4cHJlc3Npb24gd2l0aCB0aGUKKyAgICAvLy8gY29uZGl0aW9uIGNvZGUgaW4gb3AgIzQsIGEgQ29uZENvZGVTRE5vZGUuCisgICAgU0VMRUNUX0NDLAorCisgICAgLy8vIFNldENDIG9wZXJhdG9yIC0gVGhpcyBldmFsdWF0ZXMgdG8gYSB0cnVlIHZhbHVlIGlmZiB0aGUgY29uZGl0aW9uIGlzCisgICAgLy8vIHRydWUuICBJZiB0aGUgcmVzdWx0IHZhbHVlIHR5cGUgaXMgbm90IGkxIHRoZW4gdGhlIGhpZ2ggYml0cyBjb25mb3JtCisgICAgLy8vIHRvIGdldEJvb2xlYW5Db250ZW50cy4gIFRoZSBvcGVyYW5kcyB0byB0aGlzIGFyZSB0aGUgbGVmdCBhbmQgcmlnaHQKKyAgICAvLy8gb3BlcmFuZHMgdG8gY29tcGFyZSAob3BzICMwLCBhbmQgIzEpIGFuZCB0aGUgY29uZGl0aW9uIGNvZGUgdG8gY29tcGFyZQorICAgIC8vLyB0aGVtIHdpdGggKG9wICMyKSBhcyBhIENvbmRDb2RlU0ROb2RlLiBJZiB0aGUgb3BlcmFuZHMgYXJlIHZlY3RvciB0eXBlcworICAgIC8vLyB0aGVuIHRoZSByZXN1bHQgdHlwZSBtdXN0IGFsc28gYmUgYSB2ZWN0b3IgdHlwZS4KKyAgICBTRVRDQywKKworICAgIC8vLyBMaWtlIFNldENDLCBvcHMgIzAgYW5kICMxIGFyZSB0aGUgTEhTIGFuZCBSSFMgb3BlcmFuZHMgdG8gY29tcGFyZSwgYW5kCisgICAgLy8vIG9wICMyIGlzIGEgKmNhcnJ5IHZhbHVlKi4gVGhpcyBvcGVyYXRvciBjaGVja3MgdGhlIHJlc3VsdCBvZgorICAgIC8vLyAiTEhTIC0gUkhTIC0gQ2FycnkiLCBhbmQgY2FuIGJlIHVzZWQgdG8gY29tcGFyZSB0d28gd2lkZSBpbnRlZ2VyczoKKyAgICAvLy8gKHNldGNjZSBsaHNoaSByaHNoaSAoc3ViYyBsaHNsbyByaHNsbykgY2MpLiBPbmx5IHZhbGlkIGZvciBpbnRlZ2Vycy4KKyAgICAvLy8gRklYTUU6IFRoaXMgbm9kZSBpcyBkZXByZWNhdGVkIGluIGZhdm9yIG9mIFNFVENDQ0FSUlkuCisgICAgLy8vIEl0IGlzIGtlcHQgYXJvdW5kIGZvciBub3cgdG8gcHJvdmlkZSBhIHNtb290aCB0cmFuc2l0aW9uIHBhdGgKKyAgICAvLy8gdG93YXJkIHRoZSB1c2Ugb2YgU0VUQ0NDQVJSWSBhbmQgd2lsbCBldmVudHVhbGx5IGJlIHJlbW92ZWQuCisgICAgU0VUQ0NFLAorCisgICAgLy8vIExpa2UgU2V0Q0MsIG9wcyAjMCBhbmQgIzEgYXJlIHRoZSBMSFMgYW5kIFJIUyBvcGVyYW5kcyB0byBjb21wYXJlLCBidXQKKyAgICAvLy8gb3AgIzIgaXMgYSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhlcmUgaXMgYW4gaW5jb21pbmcgY2FycnkuIFRoaXMKKyAgICAvLy8gb3BlcmF0b3IgY2hlY2tzIHRoZSByZXN1bHQgb2YgIkxIUyAtIFJIUyAtIENhcnJ5IiwgYW5kIGNhbiBiZSB1c2VkIHRvCisgICAgLy8vIGNvbXBhcmUgdHdvIHdpZGUgaW50ZWdlcnM6IChzZXRjY2UgbGhzaGkgcmhzaGkgKHN1YmMgbGhzbG8gcmhzbG8pIGNjKS4KKyAgICAvLy8gT25seSB2YWxpZCBmb3IgaW50ZWdlcnMuCisgICAgU0VUQ0NDQVJSWSwKKworICAgIC8vLyBTSExfUEFSVFMvU1JBX1BBUlRTL1NSTF9QQVJUUyAtIFRoZXNlIG9wZXJhdG9ycyBhcmUgdXNlZCBmb3IgZXhwYW5kZWQKKyAgICAvLy8gaW50ZWdlciBzaGlmdCBvcGVyYXRpb25zLiAgVGhlIG9wZXJhdGlvbiBvcmRlcmluZyBpczoKKyAgICAvLy8gICAgICAgW0xvLEhpXSA9IG9wIFtMb0xIUyxIaUxIU10sIEFtdAorICAgIFNITF9QQVJUUywgU1JBX1BBUlRTLCBTUkxfUEFSVFMsCisKKyAgICAvLy8gQ29udmVyc2lvbiBvcGVyYXRvcnMuICBUaGVzZSBhcmUgYWxsIHNpbmdsZSBpbnB1dCBzaW5nbGUgb3V0cHV0CisgICAgLy8vIG9wZXJhdGlvbnMuICBGb3IgYWxsIG9mIHRoZXNlLCB0aGUgcmVzdWx0IHR5cGUgbXVzdCBiZSBzdHJpY3RseQorICAgIC8vLyB3aWRlciBvciBuYXJyb3dlciAoZGVwZW5kaW5nIG9uIHRoZSBvcGVyYXRpb24pIHRoYW4gdGhlIHNvdXJjZQorICAgIC8vLyB0eXBlLgorCisgICAgLy8vIFNJR05fRVhURU5EIC0gVXNlZCBmb3IgaW50ZWdlciB0eXBlcywgcmVwbGljYXRpbmcgdGhlIHNpZ24gYml0CisgICAgLy8vIGludG8gbmV3IGJpdHMuCisgICAgU0lHTl9FWFRFTkQsCisKKyAgICAvLy8gWkVST19FWFRFTkQgLSBVc2VkIGZvciBpbnRlZ2VyIHR5cGVzLCB6ZXJvaW5nIHRoZSBuZXcgYml0cy4KKyAgICBaRVJPX0VYVEVORCwKKworICAgIC8vLyBBTllfRVhURU5EIC0gVXNlZCBmb3IgaW50ZWdlciB0eXBlcy4gIFRoZSBoaWdoIGJpdHMgYXJlIHVuZGVmaW5lZC4KKyAgICBBTllfRVhURU5ELAorCisgICAgLy8vIFRSVU5DQVRFIC0gQ29tcGxldGVseSBkcm9wIHRoZSBoaWdoIGJpdHMuCisgICAgVFJVTkNBVEUsCisKKyAgICAvLy8gW1NVXUlOVF9UT19GUCAtIFRoZXNlIG9wZXJhdG9ycyBjb252ZXJ0IGludGVnZXJzICh3aG9zZSBpbnRlcnByZXRlZCBzaWduCisgICAgLy8vIGRlcGVuZHMgb24gdGhlIGZpcnN0IGxldHRlcikgdG8gZmxvYXRpbmcgcG9pbnQuCisgICAgU0lOVF9UT19GUCwKKyAgICBVSU5UX1RPX0ZQLAorCisgICAgLy8vIFNJR05fRVhURU5EX0lOUkVHIC0gVGhpcyBvcGVyYXRvciBhdG9taWNhbGx5IHBlcmZvcm1zIGEgU0hML1NSQSBwYWlyIHRvCisgICAgLy8vIHNpZ24gZXh0ZW5kIGEgc21hbGwgdmFsdWUgaW4gYSBsYXJnZSBpbnRlZ2VyIHJlZ2lzdGVyIChlLmcuIHNpZ24KKyAgICAvLy8gZXh0ZW5kaW5nIHRoZSBsb3cgOCBiaXRzIG9mIGEgMzItYml0IHJlZ2lzdGVyIHRvIGZpbGwgdGhlIHRvcCAyNCBiaXRzCisgICAgLy8vIHdpdGggdGhlIDd0aCBiaXQpLiAgVGhlIHNpemUgb2YgdGhlIHNtYWxsZXIgdHlwZSBpcyBpbmRpY2F0ZWQgYnkgdGhlIDF0aAorICAgIC8vLyBvcGVyYW5kLCBhIFZhbHVlVHlwZSBub2RlLgorICAgIFNJR05fRVhURU5EX0lOUkVHLAorCisgICAgLy8vIEFOWV9FWFRFTkRfVkVDVE9SX0lOUkVHKFZlY3RvcikgLSBUaGlzIG9wZXJhdG9yIHJlcHJlc2VudHMgYW4KKyAgICAvLy8gaW4tcmVnaXN0ZXIgYW55LWV4dGVuc2lvbiBvZiB0aGUgbG93IGxhbmVzIG9mIGFuIGludGVnZXIgdmVjdG9yLiBUaGUKKyAgICAvLy8gcmVzdWx0IHR5cGUgbXVzdCBoYXZlIGZld2VyIGVsZW1lbnRzIHRoYW4gdGhlIG9wZXJhbmQgdHlwZSwgYW5kIHRob3NlCisgICAgLy8vIGVsZW1lbnRzIG11c3QgYmUgbGFyZ2VyIGludGVnZXIgdHlwZXMgc3VjaCB0aGF0IHRoZSB0b3RhbCBzaXplIG9mIHRoZQorICAgIC8vLyBvcGVyYW5kIHR5cGUgYW5kIHRoZSByZXN1bHQgdHlwZSBtYXRjaC4gRWFjaCBvZiB0aGUgbG93IG9wZXJhbmQKKyAgICAvLy8gZWxlbWVudHMgaXMgYW55LWV4dGVuZGVkIGludG8gdGhlIGNvcnJlc3BvbmRpbmcsIHdpZGVyIHJlc3VsdAorICAgIC8vLyBlbGVtZW50cyB3aXRoIHRoZSBoaWdoIGJpdHMgYmVjb21pbmcgdW5kZWYuCisgICAgQU5ZX0VYVEVORF9WRUNUT1JfSU5SRUcsCisKKyAgICAvLy8gU0lHTl9FWFRFTkRfVkVDVE9SX0lOUkVHKFZlY3RvcikgLSBUaGlzIG9wZXJhdG9yIHJlcHJlc2VudHMgYW4KKyAgICAvLy8gaW4tcmVnaXN0ZXIgc2lnbi1leHRlbnNpb24gb2YgdGhlIGxvdyBsYW5lcyBvZiBhbiBpbnRlZ2VyIHZlY3Rvci4gVGhlCisgICAgLy8vIHJlc3VsdCB0eXBlIG11c3QgaGF2ZSBmZXdlciBlbGVtZW50cyB0aGFuIHRoZSBvcGVyYW5kIHR5cGUsIGFuZCB0aG9zZQorICAgIC8vLyBlbGVtZW50cyBtdXN0IGJlIGxhcmdlciBpbnRlZ2VyIHR5cGVzIHN1Y2ggdGhhdCB0aGUgdG90YWwgc2l6ZSBvZiB0aGUKKyAgICAvLy8gb3BlcmFuZCB0eXBlIGFuZCB0aGUgcmVzdWx0IHR5cGUgbWF0Y2guIEVhY2ggb2YgdGhlIGxvdyBvcGVyYW5kCisgICAgLy8vIGVsZW1lbnRzIGlzIHNpZ24tZXh0ZW5kZWQgaW50byB0aGUgY29ycmVzcG9uZGluZywgd2lkZXIgcmVzdWx0CisgICAgLy8vIGVsZW1lbnRzLgorICAgIC8vIEZJWE1FOiBUaGUgU0lHTl9FWFRFTkRfSU5SRUcgbm9kZSBpc24ndCBzcGVjaWZpY2FsbHkgbGltaXRlZCB0bworICAgIC8vIHNjYWxhcnMsIGJ1dCBpdCBhbHNvIGRvZXNuJ3QgaGFuZGxlIHZlY3RvcnMgd2VsbC4gRWl0aGVyIGl0IHNob3VsZCBiZQorICAgIC8vIHJlc3RyaWN0ZWQgdG8gc2NhbGFycyBvciB0aGlzIG5vZGUgKGFuZCBpdHMgaGFuZGxpbmcpIHNob3VsZCBiZSBtZXJnZWQKKyAgICAvLyBpbnRvIGl0LgorICAgIFNJR05fRVhURU5EX1ZFQ1RPUl9JTlJFRywKKworICAgIC8vLyBaRVJPX0VYVEVORF9WRUNUT1JfSU5SRUcoVmVjdG9yKSAtIFRoaXMgb3BlcmF0b3IgcmVwcmVzZW50cyBhbgorICAgIC8vLyBpbi1yZWdpc3RlciB6ZXJvLWV4dGVuc2lvbiBvZiB0aGUgbG93IGxhbmVzIG9mIGFuIGludGVnZXIgdmVjdG9yLiBUaGUKKyAgICAvLy8gcmVzdWx0IHR5cGUgbXVzdCBoYXZlIGZld2VyIGVsZW1lbnRzIHRoYW4gdGhlIG9wZXJhbmQgdHlwZSwgYW5kIHRob3NlCisgICAgLy8vIGVsZW1lbnRzIG11c3QgYmUgbGFyZ2VyIGludGVnZXIgdHlwZXMgc3VjaCB0aGF0IHRoZSB0b3RhbCBzaXplIG9mIHRoZQorICAgIC8vLyBvcGVyYW5kIHR5cGUgYW5kIHRoZSByZXN1bHQgdHlwZSBtYXRjaC4gRWFjaCBvZiB0aGUgbG93IG9wZXJhbmQKKyAgICAvLy8gZWxlbWVudHMgaXMgemVyby1leHRlbmRlZCBpbnRvIHRoZSBjb3JyZXNwb25kaW5nLCB3aWRlciByZXN1bHQKKyAgICAvLy8gZWxlbWVudHMuCisgICAgWkVST19FWFRFTkRfVkVDVE9SX0lOUkVHLAorCisgICAgLy8vIEZQX1RPX1tVU11JTlQgLSBDb252ZXJ0IGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUgdG8gYSBzaWduZWQgb3IgdW5zaWduZWQKKyAgICAvLy8gaW50ZWdlci4KKyAgICBGUF9UT19TSU5ULAorICAgIEZQX1RPX1VJTlQsCisKKyAgICAvLy8gWCA9IEZQX1JPVU5EKFksIFRSVU5DKSAtIFJvdW5kaW5nICdZJyBmcm9tIGEgbGFyZ2VyIGZsb2F0aW5nIHBvaW50IHR5cGUKKyAgICAvLy8gZG93biB0byB0aGUgcHJlY2lzaW9uIG9mIHRoZSBkZXN0aW5hdGlvbiBWVC4gIFRSVU5DIGlzIGEgZmxhZywgd2hpY2ggaXMKKyAgICAvLy8gYWx3YXlzIGFuIGludGVnZXIgdGhhdCBpcyB6ZXJvIG9yIG9uZS4gIElmIFRSVU5DIGlzIDAsIHRoaXMgaXMgYQorICAgIC8vLyBub3JtYWwgcm91bmRpbmcsIGlmIGl0IGlzIDEsIHRoaXMgRlBfUk9VTkQgaXMga25vd24gdG8gbm90IGNoYW5nZSB0aGUKKyAgICAvLy8gdmFsdWUgb2YgWS4KKyAgICAvLy8KKyAgICAvLy8gVGhlIFRSVU5DID0gMSBjYXNlIGlzIHVzZWQgaW4gY2FzZXMgd2hlcmUgd2Uga25vdyB0aGF0IHRoZSB2YWx1ZSB3aWxsCisgICAgLy8vIG5vdCBiZSBtb2RpZmllZCBieSB0aGUgbm9kZSwgYmVjYXVzZSBZIGlzIG5vdCB1c2luZyBhbnkgb2YgdGhlIGV4dHJhCisgICAgLy8vIHByZWNpc2lvbiBvZiBzb3VyY2UgdHlwZS4gIFRoaXMgYWxsb3dzIGNlcnRhaW4gdHJhbnNmb3JtYXRpb25zIGxpa2UKKyAgICAvLy8gRlBfRVhURU5EKEZQX1JPVU5EKFgsMSkpIC0+IFggd2hpY2ggYXJlIG5vdCBzYWZlIGZvcgorICAgIC8vLyBGUF9FWFRFTkQoRlBfUk9VTkQoWCwwKSkgYmVjYXVzZSB0aGUgZXh0cmEgYml0cyBhcmVuJ3QgcmVtb3ZlZC4KKyAgICBGUF9ST1VORCwKKworICAgIC8vLyBGTFRfUk9VTkRTXyAtIFJldHVybnMgY3VycmVudCByb3VuZGluZyBtb2RlOgorICAgIC8vLyAtMSBVbmRlZmluZWQKKyAgICAvLy8gIDAgUm91bmQgdG8gMAorICAgIC8vLyAgMSBSb3VuZCB0byBuZWFyZXN0CisgICAgLy8vICAyIFJvdW5kIHRvICtpbmYKKyAgICAvLy8gIDMgUm91bmQgdG8gLWluZgorICAgIEZMVF9ST1VORFNfLAorCisgICAgLy8vIFggPSBGUF9ST1VORF9JTlJFRyhZLCBWVCkgLSBUaGlzIG9wZXJhdG9yIHRha2VzIGFuIEZQIHJlZ2lzdGVyLCBhbmQKKyAgICAvLy8gcm91bmRzIGl0IHRvIGEgZmxvYXRpbmcgcG9pbnQgdmFsdWUuICBJdCB0aGVuIHByb21vdGVzIGl0IGFuZCByZXR1cm5zIGl0CisgICAgLy8vIGluIGEgcmVnaXN0ZXIgb2YgdGhlIHNhbWUgc2l6ZS4gIFRoaXMgb3BlcmF0aW9uIGVmZmVjdGl2ZWx5IGp1c3QKKyAgICAvLy8gZGlzY2FyZHMgZXhjZXNzIHByZWNpc2lvbi4gIFRoZSB0eXBlIHRvIHJvdW5kIGRvd24gdG8gaXMgc3BlY2lmaWVkIGJ5CisgICAgLy8vIHRoZSBWVCBvcGVyYW5kLCBhIFZUU0ROb2RlLgorICAgIEZQX1JPVU5EX0lOUkVHLAorCisgICAgLy8vIFggPSBGUF9FWFRFTkQoWSkgLSBFeHRlbmQgYSBzbWFsbGVyIEZQIHR5cGUgaW50byBhIGxhcmdlciBGUCB0eXBlLgorICAgIEZQX0VYVEVORCwKKworICAgIC8vLyBCSVRDQVNUIC0gVGhpcyBvcGVyYXRvciBjb252ZXJ0cyBiZXR3ZWVuIGludGVnZXIsIHZlY3RvciBhbmQgRlAKKyAgICAvLy8gdmFsdWVzLCBhcyBpZiB0aGUgdmFsdWUgd2FzIHN0b3JlZCB0byBtZW1vcnkgd2l0aCBvbmUgdHlwZSBhbmQgbG9hZGVkCisgICAgLy8vIGZyb20gdGhlIHNhbWUgYWRkcmVzcyB3aXRoIHRoZSBvdGhlciB0eXBlIChvciBlcXVpdmFsZW50bHkgZm9yIHZlY3RvcgorICAgIC8vLyBmb3JtYXQgY29udmVyc2lvbnMsIGV0YykuICBUaGUgc291cmNlIGFuZCByZXN1bHQgYXJlIHJlcXVpcmVkIHRvIGhhdmUKKyAgICAvLy8gdGhlIHNhbWUgYml0IHNpemUgKGUuZy4gIGYzMiA8LT4gaTMyKS4gIFRoaXMgY2FuIGFsc28gYmUgdXNlZCBmb3IKKyAgICAvLy8gaW50LXRvLWludCBvciBmcC10by1mcCBjb252ZXJzaW9ucywgYnV0IHRoYXQgaXMgYSBub29wLCBkZWxldGVkIGJ5CisgICAgLy8vIGdldE5vZGUoKS4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBvcGVyYXRvciBpcyBzdWJ0bHkgZGlmZmVyZW50IGZyb20gdGhlIGJpdGNhc3QgaW5zdHJ1Y3Rpb24gZnJvbQorICAgIC8vLyBMTFZNLUlSIHNpbmNlIHRoaXMgbm9kZSBtYXkgY2hhbmdlIHRoZSBiaXRzIGluIHRoZSByZWdpc3Rlci4gRm9yCisgICAgLy8vIGV4YW1wbGUsIHRoaXMgb2NjdXJzIG9uIGJpZy1lbmRpYW4gTkVPTiBhbmQgYmlnLWVuZGlhbiBNU0Egd2hlcmUgdGhlCisgICAgLy8vIGxheW91dCBvZiB0aGUgYml0cyBpbiB0aGUgcmVnaXN0ZXIgZGVwZW5kcyBvbiB0aGUgdmVjdG9yIHR5cGUgYW5kIHRoaXMKKyAgICAvLy8gb3BlcmF0b3IgYWN0cyBhcyBhIHNodWZmbGUgb3BlcmF0aW9uIGZvciBzb21lIHZlY3RvciB0eXBlIGNvbWJpbmF0aW9ucy4KKyAgICBCSVRDQVNULAorCisgICAgLy8vIEFERFJTUEFDRUNBU1QgLSBUaGlzIG9wZXJhdG9yIGNvbnZlcnRzIGJldHdlZW4gcG9pbnRlcnMgb2YgZGlmZmVyZW50CisgICAgLy8vIGFkZHJlc3Mgc3BhY2VzLgorICAgIEFERFJTUEFDRUNBU1QsCisKKyAgICAvLy8gRlAxNl9UT19GUCwgRlBfVE9fRlAxNiAtIFRoZXNlIG9wZXJhdG9ycyBhcmUgdXNlZCB0byBwZXJmb3JtIHByb21vdGlvbnMKKyAgICAvLy8gYW5kIHRydW5jYXRpb24gZm9yIGhhbGYtcHJlY2lzaW9uICgxNiBiaXQpIGZsb2F0aW5nIG51bWJlcnMuIFRoZXNlIG5vZGVzCisgICAgLy8vIGZvcm0gYSBzZW1pLXNvZnRlbmVkIGludGVyZmFjZSBmb3IgZGVhbGluZyB3aXRoIGYxNiAoYXMgYW4gaTE2KSwgd2hpY2gKKyAgICAvLy8gaXMgb2Z0ZW4gYSBzdG9yYWdlLW9ubHkgdHlwZSBidXQgaGFzIG5hdGl2ZSBjb252ZXJzaW9ucy4KKyAgICBGUDE2X1RPX0ZQLCBGUF9UT19GUDE2LAorCisgICAgLy8vIEZORUcsIEZBQlMsIEZTUVJULCBGU0lOLCBGQ09TLCBGUE9XSSwgRlBPVywKKyAgICAvLy8gRkxPRywgRkxPRzIsIEZMT0cxMCwgRkVYUCwgRkVYUDIsCisgICAgLy8vIEZDRUlMLCBGVFJVTkMsIEZSSU5ULCBGTkVBUkJZSU5ULCBGUk9VTkQsIEZGTE9PUiAtIFBlcmZvcm0gdmFyaW91cyB1bmFyeQorICAgIC8vLyBmbG9hdGluZyBwb2ludCBvcGVyYXRpb25zLiBUaGVzZSBhcmUgaW5zcGlyZWQgYnkgbGlibS4KKyAgICBGTkVHLCBGQUJTLCBGU1FSVCwgRlNJTiwgRkNPUywgRlBPV0ksIEZQT1csCisgICAgRkxPRywgRkxPRzIsIEZMT0cxMCwgRkVYUCwgRkVYUDIsCisgICAgRkNFSUwsIEZUUlVOQywgRlJJTlQsIEZORUFSQllJTlQsIEZST1VORCwgRkZMT09SLAorICAgIC8vLyBGTUlOTlVNL0ZNQVhOVU0gLSBQZXJmb3JtIGZsb2F0aW5nLXBvaW50IG1pbmltdW0gb3IgbWF4aW11bSBvbiB0d28KKyAgICAvLy8gdmFsdWVzLgorICAgIC8vLyBJbiB0aGUgY2FzZSB3aGVyZSBhIHNpbmdsZSBpbnB1dCBpcyBOYU4sIHRoZSBub24tTmFOIGlucHV0IGlzIHJldHVybmVkLgorICAgIC8vLworICAgIC8vLyBUaGUgcmV0dXJuIHZhbHVlIG9mIChGTUlOTlVNIDAuMCwgLTAuMCkgY291bGQgYmUgZWl0aGVyIDAuMCBvciAtMC4wLgorICAgIEZNSU5OVU0sIEZNQVhOVU0sCisgICAgLy8vIEZNSU5OQU4vRk1BWE5BTiAtIEJlaGF2ZSBpZGVudGljYWxseSB0byBGTUlOTlVNL0ZNQVhOVU0sIGV4Y2VwdCB0aGF0CisgICAgLy8vIHdoZW4gYSBzaW5nbGUgaW5wdXQgaXMgTmFOLCBOYU4gaXMgcmV0dXJuZWQuCisgICAgRk1JTk5BTiwgRk1BWE5BTiwKKworICAgIC8vLyBGU0lOQ09TIC0gQ29tcHV0ZSBib3RoIGZzaW4gYW5kIGZjb3MgYXMgYSBzaW5nbGUgb3BlcmF0aW9uLgorICAgIEZTSU5DT1MsCisKKyAgICAvLy8gTE9BRCBhbmQgU1RPUkUgaGF2ZSB0b2tlbiBjaGFpbnMgYXMgdGhlaXIgZmlyc3Qgb3BlcmFuZCwgdGhlbiB0aGUgc2FtZQorICAgIC8vLyBvcGVyYW5kcyBhcyBhbiBMTFZNIGxvYWQvc3RvcmUgaW5zdHJ1Y3Rpb24sIHRoZW4gYW4gb2Zmc2V0IG5vZGUgdGhhdAorICAgIC8vLyBpcyBhZGRlZCAvIHN1YnRyYWN0ZWQgZnJvbSB0aGUgYmFzZSBwb2ludGVyIHRvIGZvcm0gdGhlIGFkZHJlc3MgKGZvcgorICAgIC8vLyBpbmRleGVkIG1lbW9yeSBvcHMpLgorICAgIExPQUQsIFNUT1JFLAorCisgICAgLy8vIERZTkFNSUNfU1RBQ0tBTExPQyAtIEFsbG9jYXRlIHNvbWUgbnVtYmVyIG9mIGJ5dGVzIG9uIHRoZSBzdGFjayBhbGlnbmVkCisgICAgLy8vIHRvIGEgc3BlY2lmaWVkIGJvdW5kYXJ5LiAgVGhpcyBub2RlIGFsd2F5cyBoYXMgdHdvIHJldHVybiB2YWx1ZXM6IGEgbmV3CisgICAgLy8vIHN0YWNrIHBvaW50ZXIgdmFsdWUgYW5kIGEgY2hhaW4uIFRoZSBmaXJzdCBvcGVyYW5kIGlzIHRoZSB0b2tlbiBjaGFpbiwKKyAgICAvLy8gdGhlIHNlY29uZCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlLCBhbmQgdGhlIHRoaXJkIGlzIHRoZQorICAgIC8vLyBhbGlnbm1lbnQgYm91bmRhcnkuICBUaGUgc2l6ZSBpcyBndWFyYW50ZWVkIHRvIGJlIGEgbXVsdGlwbGUgb2YgdGhlCisgICAgLy8vIHN0YWNrIGFsaWdubWVudCwgYW5kIHRoZSBhbGlnbm1lbnQgaXMgZ3VhcmFudGVlZCB0byBiZSBiaWdnZXIgdGhhbiB0aGUKKyAgICAvLy8gc3RhY2sgYWxpZ25tZW50IChpZiByZXF1aXJlZCkgb3IgMCB0byBnZXQgc3RhbmRhcmQgc3RhY2sgYWxpZ25tZW50LgorICAgIERZTkFNSUNfU1RBQ0tBTExPQywKKworICAgIC8vLyBDb250cm9sIGZsb3cgaW5zdHJ1Y3Rpb25zLiAgVGhlc2UgYWxsIGhhdmUgdG9rZW4gY2hhaW5zLgorCisgICAgLy8vIEJSIC0gVW5jb25kaXRpb25hbCBicmFuY2guICBUaGUgZmlyc3Qgb3BlcmFuZCBpcyB0aGUgY2hhaW4KKyAgICAvLy8gb3BlcmFuZCwgdGhlIHNlY29uZCBpcyB0aGUgTUJCIHRvIGJyYW5jaCB0by4KKyAgICBCUiwKKworICAgIC8vLyBCUklORCAtIEluZGlyZWN0IGJyYW5jaC4gIFRoZSBmaXJzdCBvcGVyYW5kIGlzIHRoZSBjaGFpbiwgdGhlIHNlY29uZAorICAgIC8vLyBpcyB0aGUgdmFsdWUgdG8gYnJhbmNoIHRvLCB3aGljaCBtdXN0IGJlIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhlCisgICAgLy8vIHRhcmdldCdzIHBvaW50ZXIgdHlwZS4KKyAgICBCUklORCwKKworICAgIC8vLyBCUl9KVCAtIEp1bXB0YWJsZSBicmFuY2guIFRoZSBmaXJzdCBvcGVyYW5kIGlzIHRoZSBjaGFpbiwgdGhlIHNlY29uZAorICAgIC8vLyBpcyB0aGUganVtcHRhYmxlIGluZGV4LCB0aGUgbGFzdCBvbmUgaXMgdGhlIGp1bXB0YWJsZSBlbnRyeSBpbmRleC4KKyAgICBCUl9KVCwKKworICAgIC8vLyBCUkNPTkQgLSBDb25kaXRpb25hbCBicmFuY2guICBUaGUgZmlyc3Qgb3BlcmFuZCBpcyB0aGUgY2hhaW4sIHRoZQorICAgIC8vLyBzZWNvbmQgaXMgdGhlIGNvbmRpdGlvbiwgdGhlIHRoaXJkIGlzIHRoZSBibG9jayB0byBicmFuY2ggdG8gaWYgdGhlCisgICAgLy8vIGNvbmRpdGlvbiBpcyB0cnVlLiAgSWYgdGhlIHR5cGUgb2YgdGhlIGNvbmRpdGlvbiBpcyBub3QgaTEsIHRoZW4gdGhlCisgICAgLy8vIGhpZ2ggYml0cyBtdXN0IGNvbmZvcm0gdG8gZ2V0Qm9vbGVhbkNvbnRlbnRzLgorICAgIEJSQ09ORCwKKworICAgIC8vLyBCUl9DQyAtIENvbmRpdGlvbmFsIGJyYW5jaC4gIFRoZSBiZWhhdmlvciBpcyBsaWtlIHRoYXQgb2YgU0VMRUNUX0NDLCBpbgorICAgIC8vLyB0aGF0IHRoZSBjb25kaXRpb24gaXMgcmVwcmVzZW50ZWQgYXMgY29uZGl0aW9uIGNvZGUsIGFuZCB0d28gbm9kZXMgdG8KKyAgICAvLy8gY29tcGFyZSwgcmF0aGVyIHRoYW4gYXMgYSBjb21iaW5lZCBTZXRDQyBub2RlLiAgVGhlIG9wZXJhbmRzIGluIG9yZGVyCisgICAgLy8vIGFyZSBjaGFpbiwgY2MsIGxocywgcmhzLCBibG9jayB0byBicmFuY2ggdG8gaWYgY29uZGl0aW9uIGlzIHRydWUuCisgICAgQlJfQ0MsCisKKyAgICAvLy8gSU5MSU5FQVNNIC0gUmVwcmVzZW50cyBhbiBpbmxpbmUgYXNtIGJsb2NrLiAgVGhpcyBub2RlIGFsd2F5cyBoYXMgdHdvCisgICAgLy8vIHJldHVybiB2YWx1ZXM6IGEgY2hhaW4gYW5kIGEgZmxhZyByZXN1bHQuICBUaGUgaW5wdXRzIGFyZSBhcyBmb2xsb3dzOgorICAgIC8vLyAgIE9wZXJhbmQgIzAgIDogSW5wdXQgY2hhaW4uCisgICAgLy8vICAgT3BlcmFuZCAjMSAgOiBhIEV4dGVybmFsU3ltYm9sU0ROb2RlIHdpdGggYSBwb2ludGVyIHRvIHRoZSBhc20gc3RyaW5nLgorICAgIC8vLyAgIE9wZXJhbmQgIzIgIDogYSBNRE5vZGVTRE5vZGUgd2l0aCB0aGUgIXNyY2xvYyBtZXRhZGF0YS4KKyAgICAvLy8gICBPcGVyYW5kICMzICA6IEhhc1NpZGVFZmZlY3QsIElzQWxpZ25TdGFjayBiaXRzLgorICAgIC8vLyAgIEFmdGVyIHRoaXMsIGl0IGlzIGZvbGxvd2VkIGJ5IGEgbGlzdCBvZiBvcGVyYW5kcyB3aXRoIHRoaXMgZm9ybWF0OgorICAgIC8vLyAgICAgQ29uc3RhbnRTRE5vZGU6IEZsYWdzIHRoYXQgZW5jb2RlIHdoZXRoZXIgaXQgaXMgYSBtZW0gb3Igbm90LCB0aGUKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICBvZiBvcGVyYW5kcyB0aGF0IGZvbGxvdywgZXRjLiAgU2VlIElubGluZUFzbS5oLgorICAgIC8vLyAgICAgLi4uIGhvd2V2ZXIgbWFueSBvcGVyYW5kcyAuLi4KKyAgICAvLy8gICBPcGVyYW5kICNsYXN0OiBPcHRpb25hbCwgYW4gaW5jb21pbmcgZmxhZy4KKyAgICAvLy8KKyAgICAvLy8gVGhlIHZhcmlhYmxlIHdpZHRoIG9wZXJhbmRzIGFyZSByZXF1aXJlZCB0byByZXByZXNlbnQgdGFyZ2V0IGFkZHJlc3NpbmcKKyAgICAvLy8gbW9kZXMgYXMgYSBzaW5nbGUgIm9wZXJhbmQiLCBldmVuIHRob3VnaCB0aGV5IG1heSBoYXZlIG11bHRpcGxlCisgICAgLy8vIFNET3BlcmFuZHMuCisgICAgSU5MSU5FQVNNLAorCisgICAgLy8vIEVIX0xBQkVMIC0gUmVwcmVzZW50cyBhIGxhYmVsIGluIG1pZCBiYXNpYyBibG9jayB1c2VkIHRvIHRyYWNrCisgICAgLy8vIGxvY2F0aW9ucyBuZWVkZWQgZm9yIGRlYnVnIGFuZCBleGNlcHRpb24gaGFuZGxpbmcgdGFibGVzLiAgVGhlc2Ugbm9kZXMKKyAgICAvLy8gdGFrZSBhIGNoYWluIGFzIGlucHV0IGFuZCByZXR1cm4gYSBjaGFpbi4KKyAgICBFSF9MQUJFTCwKKworICAgIC8vLyBBTk5PVEFUSU9OX0xBQkVMIC0gUmVwcmVzZW50cyBhIG1pZCBiYXNpYyBibG9jayBsYWJlbCB1c2VkIGJ5CisgICAgLy8vIGFubm90YXRpb25zLiBUaGlzIHNob3VsZCByZW1haW4gd2l0aGluIHRoZSBiYXNpYyBibG9jayBhbmQgYmUgb3JkZXJlZAorICAgIC8vLyB3aXRoIHJlc3BlY3QgdG8gb3RoZXIgY2FsbCBpbnN0cnVjdGlvbnMsIGJ1dCBsb2FkcyBhbmQgc3RvcmVzIG1heSBmbG9hdAorICAgIC8vLyBwYXN0IGl0LgorICAgIEFOTk9UQVRJT05fTEFCRUwsCisKKyAgICAvLy8gQ0FUQ0hQQUQgLSBSZXByZXNlbnRzIGEgY2F0Y2hwYWQgaW5zdHJ1Y3Rpb24uCisgICAgQ0FUQ0hQQUQsCisKKyAgICAvLy8gQ0FUQ0hSRVQgLSBSZXByZXNlbnRzIGEgcmV0dXJuIGZyb20gYSBjYXRjaCBibG9jayBmdW5jbGV0LiBVc2VkIGZvcgorICAgIC8vLyBNU1ZDIGNvbXBhdGlibGUgZXhjZXB0aW9uIGhhbmRsaW5nLiBUYWtlcyBhIGNoYWluIG9wZXJhbmQgYW5kIGEKKyAgICAvLy8gZGVzdGluYXRpb24gYmFzaWMgYmxvY2sgb3BlcmFuZC4KKyAgICBDQVRDSFJFVCwKKworICAgIC8vLyBDTEVBTlVQUkVUIC0gUmVwcmVzZW50cyBhIHJldHVybiBmcm9tIGEgY2xlYW51cCBibG9jayBmdW5jbGV0LiAgVXNlZCBmb3IKKyAgICAvLy8gTVNWQyBjb21wYXRpYmxlIGV4Y2VwdGlvbiBoYW5kbGluZy4gVGFrZXMgb25seSBhIGNoYWluIG9wZXJhbmQuCisgICAgQ0xFQU5VUFJFVCwKKworICAgIC8vLyBTVEFDS1NBVkUgLSBTVEFDS1NBVkUgaGFzIG9uZSBvcGVyYW5kLCBhbiBpbnB1dCBjaGFpbi4gIEl0IHByb2R1Y2VzIGEKKyAgICAvLy8gdmFsdWUsIHRoZSBzYW1lIHR5cGUgYXMgdGhlIHBvaW50ZXIgdHlwZSBmb3IgdGhlIHN5c3RlbSwgYW5kIGFuIG91dHB1dAorICAgIC8vLyBjaGFpbi4KKyAgICBTVEFDS1NBVkUsCisKKyAgICAvLy8gU1RBQ0tSRVNUT1JFIGhhcyB0d28gb3BlcmFuZHMsIGFuIGlucHV0IGNoYWluIGFuZCBhIHBvaW50ZXIgdG8gcmVzdG9yZQorICAgIC8vLyB0byBpdCByZXR1cm5zIGFuIG91dHB1dCBjaGFpbi4KKyAgICBTVEFDS1JFU1RPUkUsCisKKyAgICAvLy8gQ0FMTFNFUV9TVEFSVC9DQUxMU0VRX0VORCAtIFRoZXNlIG9wZXJhdG9ycyBtYXJrIHRoZSBiZWdpbm5pbmcgYW5kIGVuZAorICAgIC8vLyBvZiBhIGNhbGwgc2VxdWVuY2UsIGFuZCBjYXJyeSBhcmJpdHJhcnkgaW5mb3JtYXRpb24gdGhhdCB0YXJnZXQgbWlnaHQKKyAgICAvLy8gd2FudCB0byBrbm93LiAgVGhlIGZpcnN0IG9wZXJhbmQgaXMgYSBjaGFpbiwgdGhlIHJlc3QgYXJlIHNwZWNpZmllZCBieQorICAgIC8vLyB0aGUgdGFyZ2V0IGFuZCBub3QgdG91Y2hlZCBieSB0aGUgREFHIG9wdGltaXplcnMuCisgICAgLy8vIFRhcmdldHMgdGhhdCBtYXkgdXNlIHN0YWNrIHRvIHBhc3MgY2FsbCBhcmd1bWVudHMgZGVmaW5lIGFkZGl0aW9uYWwKKyAgICAvLy8gb3BlcmFuZHM6CisgICAgLy8vIC0gc2l6ZSBvZiB0aGUgY2FsbCBmcmFtZSBwYXJ0IHRoYXQgbXVzdCBiZSBzZXQgdXAgd2l0aGluIHRoZQorICAgIC8vLyAgIENBTExTRVFfU1RBUlQuLkNBTExTRVFfRU5EIHBhaXIsCisgICAgLy8vIC0gcGFydCBvZiB0aGUgY2FsbCBmcmFtZSBwcmVwYXJlZCBwcmlvciB0byBDQUxMU0VRX1NUQVJULgorICAgIC8vLyBCb3RoIHRoZXNlIHBhcmFtZXRlcnMgbXVzdCBiZSBjb25zdGFudHMsIHRoZWlyIHN1bSBpcyB0aGUgdG90YWwgY2FsbAorICAgIC8vLyBmcmFtZSBzaXplLgorICAgIC8vLyBDQUxMU0VRX1NUQVJULi5DQUxMU0VRX0VORCBwYWlycyBtYXkgbm90IGJlIG5lc3RlZC4KKyAgICBDQUxMU0VRX1NUQVJULCAgLy8gQmVnaW5uaW5nIG9mIGEgY2FsbCBzZXF1ZW5jZQorICAgIENBTExTRVFfRU5ELCAgICAvLyBFbmQgb2YgYSBjYWxsIHNlcXVlbmNlCisKKyAgICAvLy8gVkFBUkcgLSBWQUFSRyBoYXMgZm91ciBvcGVyYW5kczogYW4gaW5wdXQgY2hhaW4sIGEgcG9pbnRlciwgYSBTUkNWQUxVRSwKKyAgICAvLy8gYW5kIHRoZSBhbGlnbm1lbnQuIEl0IHJldHVybnMgYSBwYWlyIG9mIHZhbHVlczogdGhlIHZhYXJnIHZhbHVlIGFuZCBhCisgICAgLy8vIG5ldyBjaGFpbi4KKyAgICBWQUFSRywKKworICAgIC8vLyBWQUNPUFkgLSBWQUNPUFkgaGFzIDUgb3BlcmFuZHM6IGFuIGlucHV0IGNoYWluLCBhIGRlc3RpbmF0aW9uIHBvaW50ZXIsCisgICAgLy8vIGEgc291cmNlIHBvaW50ZXIsIGEgU1JDVkFMVUUgZm9yIHRoZSBkZXN0aW5hdGlvbiwgYW5kIGEgU1JDVkFMVUUgZm9yIHRoZQorICAgIC8vLyBzb3VyY2UuCisgICAgVkFDT1BZLAorCisgICAgLy8vIFZBRU5ELCBWQVNUQVJUIC0gVkFFTkQgYW5kIFZBU1RBUlQgaGF2ZSB0aHJlZSBvcGVyYW5kczogYW4gaW5wdXQgY2hhaW4sCisgICAgLy8vIHBvaW50ZXIsIGFuZCBhIFNSQ1ZBTFVFLgorICAgIFZBRU5ELCBWQVNUQVJULAorCisgICAgLy8vIFNSQ1ZBTFVFIC0gVGhpcyBpcyBhIG5vZGUgdHlwZSB0aGF0IGhvbGRzIGEgVmFsdWUqIHRoYXQgaXMgdXNlZCB0bworICAgIC8vLyBtYWtlIHJlZmVyZW5jZSB0byBhIHZhbHVlIGluIHRoZSBMTFZNIElSLgorICAgIFNSQ1ZBTFVFLAorCisgICAgLy8vIE1ETk9ERV9TRE5PREUgLSBUaGlzIGlzIGEgbm9kZSB0aGF0IGhvbGRlcyBhbiBNRE5vZGUqLCB3aGljaCBpcyB1c2VkIHRvCisgICAgLy8vIHJlZmVyZW5jZSBtZXRhZGF0YSBpbiB0aGUgSVIuCisgICAgTUROT0RFX1NETk9ERSwKKworICAgIC8vLyBQQ01BUktFUiAtIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIHBjbWFya2VyIGludHJpbnNpYy4KKyAgICBQQ01BUktFUiwKKworICAgIC8vLyBSRUFEQ1lDTEVDT1VOVEVSIC0gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgcmVhZGN5Y2xlY291bnRlciBpbnRyaW5zaWMuCisgICAgLy8vIEl0IHByb2R1Y2VzIGEgY2hhaW4gYW5kIG9uZSBpNjQgdmFsdWUuIFRoZSBvbmx5IG9wZXJhbmQgaXMgYSBjaGFpbi4KKyAgICAvLy8gSWYgaTY0IGlzIG5vdCBsZWdhbCwgdGhlIHJlc3VsdCB3aWxsIGJlIGV4cGFuZGVkIGludG8gc21hbGxlciB2YWx1ZXMuCisgICAgLy8vIFN0aWxsLCBpdCByZXR1cm5zIGFuIGk2NCwgc28gdGFyZ2V0cyBzaG91bGQgc2V0IGxlZ2FsaXR5IGZvciBpNjQuCisgICAgLy8vIFRoZSByZXN1bHQgaXMgdGhlIGNvbnRlbnQgb2YgdGhlIGFyY2hpdGVjdHVyZS1zcGVjaWZpYyBjeWNsZQorICAgIC8vLyBjb3VudGVyLWxpa2UgcmVnaXN0ZXIgKG9yIG90aGVyIGhpZ2ggYWNjdXJhY3kgbG93IGxhdGVuY3kgY2xvY2sgc291cmNlKS4KKyAgICBSRUFEQ1lDTEVDT1VOVEVSLAorCisgICAgLy8vIEhBTkRMRU5PREUgbm9kZSAtIFVzZWQgYXMgYSBoYW5kbGUgZm9yIHZhcmlvdXMgcHVycG9zZXMuCisgICAgSEFORExFTk9ERSwKKworICAgIC8vLyBJTklUX1RSQU1QT0xJTkUgLSBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBpbml0X3RyYW1wb2xpbmUgaW50cmluc2ljLiAgSXQKKyAgICAvLy8gdGFrZXMgYXMgaW5wdXQgYSB0b2tlbiBjaGFpbiwgdGhlIHBvaW50ZXIgdG8gdGhlIHRyYW1wb2xpbmUsIHRoZSBwb2ludGVyCisgICAgLy8vIHRvIHRoZSBuZXN0ZWQgZnVuY3Rpb24sIHRoZSBwb2ludGVyIHRvIHBhc3MgZm9yIHRoZSAnbmVzdCcgcGFyYW1ldGVyLCBhCisgICAgLy8vIFNSQ1ZBTFVFIGZvciB0aGUgdHJhbXBvbGluZSBhbmQgYW5vdGhlciBmb3IgdGhlIG5lc3RlZCBmdW5jdGlvbgorICAgIC8vLyAoYWxsb3dpbmcgdGFyZ2V0cyB0byBhY2Nlc3MgdGhlIG9yaWdpbmFsIEZ1bmN0aW9uKikuCisgICAgLy8vIEl0IHByb2R1Y2VzIGEgdG9rZW4gY2hhaW4gYXMgb3V0cHV0LgorICAgIElOSVRfVFJBTVBPTElORSwKKworICAgIC8vLyBBREpVU1RfVFJBTVBPTElORSAtIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGFkanVzdF90cmFtcG9saW5lIGludHJpbnNpYy4KKyAgICAvLy8gSXQgdGFrZXMgYSBwb2ludGVyIHRvIHRoZSB0cmFtcG9saW5lIGFuZCBwcm9kdWNlcyBhIChwb3NzaWJseSkgbmV3CisgICAgLy8vIHBvaW50ZXIgdG8gdGhlIHNhbWUgdHJhbXBvbGluZSB3aXRoIHBsYXRmb3JtLXNwZWNpZmljIGFkanVzdG1lbnRzCisgICAgLy8vIGFwcGxpZWQuICBUaGUgcG9pbnRlciBpdCByZXR1cm5zIHBvaW50cyB0byBhbiBleGVjdXRhYmxlIGJsb2NrIG9mIGNvZGUuCisgICAgQURKVVNUX1RSQU1QT0xJTkUsCisKKyAgICAvLy8gVFJBUCAtIFRyYXBwaW5nIGluc3RydWN0aW9uCisgICAgVFJBUCwKKworICAgIC8vLyBERUJVR1RSQVAgLSBUcmFwIGludGVuZGVkIHRvIGdldCB0aGUgYXR0ZW50aW9uIG9mIGEgZGVidWdnZXIuCisgICAgREVCVUdUUkFQLAorCisgICAgLy8vIFBSRUZFVENIIC0gVGhpcyBjb3JyZXNwb25kcyB0byBhIHByZWZldGNoIGludHJpbnNpYy4gVGhlIGZpcnN0IG9wZXJhbmQKKyAgICAvLy8gaXMgdGhlIGNoYWluLiAgVGhlIG90aGVyIG9wZXJhbmRzIGFyZSB0aGUgYWRkcmVzcyB0byBwcmVmZXRjaCwKKyAgICAvLy8gcmVhZCAvIHdyaXRlIHNwZWNpZmllciwgbG9jYWxpdHkgc3BlY2lmaWVyIGFuZCBpbnN0cnVjdGlvbiAvIGRhdGEgY2FjaGUKKyAgICAvLy8gc3BlY2lmaWVyLgorICAgIFBSRUZFVENILAorCisgICAgLy8vIE9VVENIQUlOID0gQVRPTUlDX0ZFTkNFKElOQ0hBSU4sIG9yZGVyaW5nLCBzY29wZSkKKyAgICAvLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgZmVuY2UgaW5zdHJ1Y3Rpb24uIEl0IHRha2VzIGFuIGlucHV0IGNoYWluLCBhbmQKKyAgICAvLy8gdHdvIGludGVnZXIgY29uc3RhbnRzOiBhbiBBdG9taWNPcmRlcmluZyBhbmQgYSBTeW5jaHJvbml6YXRpb25TY29wZS4KKyAgICBBVE9NSUNfRkVOQ0UsCisKKyAgICAvLy8gVmFsLCBPVVRDSEFJTiA9IEFUT01JQ19MT0FEKElOQ0hBSU4sIHB0cikKKyAgICAvLy8gVGhpcyBjb3JyZXNwb25kcyB0byAibG9hZCBhdG9taWMiIGluc3RydWN0aW9uLgorICAgIEFUT01JQ19MT0FELAorCisgICAgLy8vIE9VVENIQUlOID0gQVRPTUlDX1NUT1JFKElOQ0hBSU4sIHB0ciwgdmFsKQorICAgIC8vLyBUaGlzIGNvcnJlc3BvbmRzIHRvICJzdG9yZSBhdG9taWMiIGluc3RydWN0aW9uLgorICAgIEFUT01JQ19TVE9SRSwKKworICAgIC8vLyBWYWwsIE9VVENIQUlOID0gQVRPTUlDX0NNUF9TV0FQKElOQ0hBSU4sIHB0ciwgY21wLCBzd2FwKQorICAgIC8vLyBGb3IgZG91YmxlLXdvcmQgYXRvbWljIG9wZXJhdGlvbnM6CisgICAgLy8vIFZhbExvLCBWYWxIaSwgT1VUQ0hBSU4gPSBBVE9NSUNfQ01QX1NXQVAoSU5DSEFJTiwgcHRyLCBjbXBMbywgY21wSGksCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3dhcExvLCBzd2FwSGkpCisgICAgLy8vIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGNtcHhjaGcgaW5zdHJ1Y3Rpb24uCisgICAgQVRPTUlDX0NNUF9TV0FQLAorCisgICAgLy8vIFZhbCwgU3VjY2VzcywgT1VUQ0hBSU4KKyAgICAvLy8gICAgID0gQVRPTUlDX0NNUF9TV0FQX1dJVEhfU1VDQ0VTUyhJTkNIQUlOLCBwdHIsIGNtcCwgc3dhcCkKKyAgICAvLy8gTi5iLiB0aGlzIGlzIHN0aWxsIGEgc3Ryb25nIGNtcHhjaGcgb3BlcmF0aW9uLCBzbworICAgIC8vLyBTdWNjZXNzID09ICJWYWwgPT0gY21wIi4KKyAgICBBVE9NSUNfQ01QX1NXQVBfV0lUSF9TVUNDRVNTLAorCisgICAgLy8vIFZhbCwgT1VUQ0hBSU4gPSBBVE9NSUNfU1dBUChJTkNIQUlOLCBwdHIsIGFtdCkKKyAgICAvLy8gVmFsLCBPVVRDSEFJTiA9IEFUT01JQ19MT0FEX1tPcE5hbWVdKElOQ0hBSU4sIHB0ciwgYW10KQorICAgIC8vLyBGb3IgZG91YmxlLXdvcmQgYXRvbWljIG9wZXJhdGlvbnM6CisgICAgLy8vIFZhbExvLCBWYWxIaSwgT1VUQ0hBSU4gPSBBVE9NSUNfU1dBUChJTkNIQUlOLCBwdHIsIGFtdExvLCBhbXRIaSkKKyAgICAvLy8gVmFsTG8sIFZhbEhpLCBPVVRDSEFJTiA9IEFUT01JQ19MT0FEX1tPcE5hbWVdKElOQ0hBSU4sIHB0ciwgYW10TG8sIGFtdEhpKQorICAgIC8vLyBUaGVzZSBjb3JyZXNwb25kIHRvIHRoZSBhdG9taWNybXcgaW5zdHJ1Y3Rpb24uCisgICAgQVRPTUlDX1NXQVAsCisgICAgQVRPTUlDX0xPQURfQURELAorICAgIEFUT01JQ19MT0FEX1NVQiwKKyAgICBBVE9NSUNfTE9BRF9BTkQsCisgICAgQVRPTUlDX0xPQURfQ0xSLAorICAgIEFUT01JQ19MT0FEX09SLAorICAgIEFUT01JQ19MT0FEX1hPUiwKKyAgICBBVE9NSUNfTE9BRF9OQU5ELAorICAgIEFUT01JQ19MT0FEX01JTiwKKyAgICBBVE9NSUNfTE9BRF9NQVgsCisgICAgQVRPTUlDX0xPQURfVU1JTiwKKyAgICBBVE9NSUNfTE9BRF9VTUFYLAorCisgICAgLy8gTWFza2VkIGxvYWQgYW5kIHN0b3JlIC0gY29uc2VjdXRpdmUgdmVjdG9yIGxvYWQgYW5kIHN0b3JlIG9wZXJhdGlvbnMKKyAgICAvLyB3aXRoIGFkZGl0aW9uYWwgbWFzayBvcGVyYW5kIHRoYXQgcHJldmVudHMgbWVtb3J5IGFjY2Vzc2VzIHRvIHRoZQorICAgIC8vIG1hc2tlZC1vZmYgbGFuZXMuCisgICAgTUxPQUQsIE1TVE9SRSwKKworICAgIC8vIE1hc2tlZCBnYXRoZXIgYW5kIHNjYXR0ZXIgLSBsb2FkIGFuZCBzdG9yZSBvcGVyYXRpb25zIGZvciBhIHZlY3RvciBvZgorICAgIC8vIHJhbmRvbSBhZGRyZXNzZXMgd2l0aCBhZGRpdGlvbmFsIG1hc2sgb3BlcmFuZCB0aGF0IHByZXZlbnRzIG1lbW9yeQorICAgIC8vIGFjY2Vzc2VzIHRvIHRoZSBtYXNrZWQtb2ZmIGxhbmVzLgorICAgIE1HQVRIRVIsIE1TQ0FUVEVSLAorCisgICAgLy8vIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlIGxsdm0ubGlmZXRpbWUuKiBpbnRyaW5zaWNzLiBUaGUgZmlyc3Qgb3BlcmFuZAorICAgIC8vLyBpcyB0aGUgY2hhaW4gYW5kIHRoZSBzZWNvbmQgb3BlcmFuZCBpcyB0aGUgYWxsb2NhIHBvaW50ZXIuCisgICAgTElGRVRJTUVfU1RBUlQsIExJRkVUSU1FX0VORCwKKworICAgIC8vLyBHQ19UUkFOU0lUSU9OX1NUQVJUL0dDX1RSQU5TSVRJT05fRU5EIC0gVGhlc2Ugb3BlcmF0b3JzIG1hcmsgdGhlCisgICAgLy8vIGJlZ2lubmluZyBhbmQgZW5kIG9mIEdDIHRyYW5zaXRpb24gIHNlcXVlbmNlLCBhbmQgY2FycnkgYXJiaXRyYXJ5CisgICAgLy8vIGluZm9ybWF0aW9uIHRoYXQgdGFyZ2V0IG1pZ2h0IG5lZWQgZm9yIGxvd2VyaW5nLiAgVGhlIGZpcnN0IG9wZXJhbmQgaXMKKyAgICAvLy8gYSBjaGFpbiwgdGhlIHJlc3QgYXJlIHNwZWNpZmllZCBieSB0aGUgdGFyZ2V0IGFuZCBub3QgdG91Y2hlZCBieSB0aGUgREFHCisgICAgLy8vIG9wdGltaXplcnMuIEdDX1RSQU5TSVRJT05fU1RBUlQuLkdDX1RSQU5TSVRJT05fRU5EIHBhaXJzIG1heSBub3QgYmUKKyAgICAvLy8gbmVzdGVkLgorICAgIEdDX1RSQU5TSVRJT05fU1RBUlQsCisgICAgR0NfVFJBTlNJVElPTl9FTkQsCisKKyAgICAvLy8gR0VUX0RZTkFNSUNfQVJFQV9PRkZTRVQgLSBnZXQgb2Zmc2V0IGZyb20gbmF0aXZlIFNQIHRvIHRoZSBhZGRyZXNzIG9mCisgICAgLy8vIHRoZSBtb3N0IHJlY2VudCBkeW5hbWljIGFsbG9jYS4gRm9yIG1vc3QgdGFyZ2V0cyB0aGF0IHdvdWxkIGJlIDAsIGJ1dAorICAgIC8vLyBmb3Igc29tZSBvdGhlcnMgKGUuZy4gUG93ZXJQQywgUG93ZXJQQzY0KSB0aGF0IHdvdWxkIGJlIGNvbXBpbGUtdGltZQorICAgIC8vLyBrbm93biBub256ZXJvIGNvbnN0YW50LiBUaGUgb25seSBvcGVyYW5kIGhlcmUgaXMgdGhlIGNoYWluLgorICAgIEdFVF9EWU5BTUlDX0FSRUFfT0ZGU0VULAorCisgICAgLy8vIEdlbmVyaWMgcmVkdWN0aW9uIG5vZGVzLiBUaGVzZSBub2RlcyByZXByZXNlbnQgaG9yaXpvbnRhbCB2ZWN0b3IKKyAgICAvLy8gcmVkdWN0aW9uIG9wZXJhdGlvbnMsIHByb2R1Y2luZyBhIHNjYWxhciByZXN1bHQuCisgICAgLy8vIFRoZSBTVFJJQ1QgdmFyaWFudHMgcGVyZm9ybSByZWR1Y3Rpb25zIGluIHNlcXVlbnRpYWwgb3JkZXIuIFRoZSBmaXJzdAorICAgIC8vLyBvcGVyYW5kIGlzIGFuIGluaXRpYWwgc2NhbGFyIGFjY3VtdWxhdG9yIHZhbHVlLCBhbmQgdGhlIHNlY29uZCBvcGVyYW5kCisgICAgLy8vIGlzIHRoZSB2ZWN0b3IgdG8gcmVkdWNlLgorICAgIFZFQ1JFRFVDRV9TVFJJQ1RfRkFERCwgVkVDUkVEVUNFX1NUUklDVF9GTVVMLAorICAgIC8vLyBUaGVzZSByZWR1Y3Rpb25zIGFyZSBub24tc3RyaWN0LCBhbmQgaGF2ZSBhIHNpbmdsZSB2ZWN0b3Igb3BlcmFuZC4KKyAgICBWRUNSRURVQ0VfRkFERCwgVkVDUkVEVUNFX0ZNVUwsCisgICAgVkVDUkVEVUNFX0FERCwgVkVDUkVEVUNFX01VTCwKKyAgICBWRUNSRURVQ0VfQU5ELCBWRUNSRURVQ0VfT1IsIFZFQ1JFRFVDRV9YT1IsCisgICAgVkVDUkVEVUNFX1NNQVgsIFZFQ1JFRFVDRV9TTUlOLCBWRUNSRURVQ0VfVU1BWCwgVkVDUkVEVUNFX1VNSU4sCisgICAgLy8vIEZNSU4vRk1BWCBub2RlcyBjYW4gaGF2ZSBmbGFncywgZm9yIE5hTi9Ob05hTiB2YXJpYW50cy4KKyAgICBWRUNSRURVQ0VfRk1BWCwgVkVDUkVEVUNFX0ZNSU4sCisKKyAgICAvLy8gQlVJTFRJTl9PUF9FTkQgLSBUaGlzIG11c3QgYmUgdGhlIGxhc3QgZW51bSB2YWx1ZSBpbiB0aGlzIGxpc3QuCisgICAgLy8vIFRoZSB0YXJnZXQtc3BlY2lmaWMgcHJlLWlzZWwgb3Bjb2RlIHZhbHVlcyBzdGFydCBoZXJlLgorICAgIEJVSUxUSU5fT1BfRU5ECisgIH07CisKKyAgLy8vIEZJUlNUX1RBUkdFVF9NRU1PUllfT1BDT0RFIC0gVGFyZ2V0LXNwZWNpZmljIHByZS1pc2VsIG9wZXJhdGlvbnMKKyAgLy8vIHdoaWNoIGRvIG5vdCByZWZlcmVuY2UgYSBzcGVjaWZpYyBtZW1vcnkgbG9jYXRpb24gc2hvdWxkIGJlIGxlc3MgdGhhbgorICAvLy8gdGhpcyB2YWx1ZS4gVGhvc2UgdGhhdCBkbyBtdXN0IG5vdCBiZSBsZXNzIHRoYW4gdGhpcyB2YWx1ZSwgYW5kIGNhbgorICAvLy8gYmUgdXNlZCB3aXRoIFNlbGVjdGlvbkRBRzo6Z2V0TWVtSW50cmluc2ljTm9kZS4KKyAgc3RhdGljIGNvbnN0IGludCBGSVJTVF9UQVJHRVRfTUVNT1JZX09QQ09ERSA9IEJVSUxUSU5fT1BfRU5EKzQwMDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIE1lbUluZGV4ZWRNb2RlIGVudW0gLSBUaGlzIGVudW0gZGVmaW5lcyB0aGUgbG9hZCAvIHN0b3JlIGluZGV4ZWQKKyAgLy8vIGFkZHJlc3NpbmcgbW9kZXMuCisgIC8vLworICAvLy8gVU5JTkRFWEVEICAgICJOb3JtYWwiIGxvYWQgLyBzdG9yZS4gVGhlIGVmZmVjdGl2ZSBhZGRyZXNzIGlzIGFscmVhZHkKKyAgLy8vICAgICAgICAgICAgICBjb21wdXRlZCBhbmQgaXMgYXZhaWxhYmxlIGluIHRoZSBiYXNlIHBvaW50ZXIuIFRoZSBvZmZzZXQKKyAgLy8vICAgICAgICAgICAgICBvcGVyYW5kIGlzIGFsd2F5cyB1bmRlZmluZWQuIEluIGFkZGl0aW9uIHRvIHByb2R1Y2luZyBhCisgIC8vLyAgICAgICAgICAgICAgY2hhaW4sIGFuIHVuaW5kZXhlZCBsb2FkIHByb2R1Y2VzIG9uZSB2YWx1ZSAocmVzdWx0IG9mIHRoZQorICAvLy8gICAgICAgICAgICAgIGxvYWQpOyBhbiB1bmluZGV4ZWQgc3RvcmUgZG9lcyBub3QgcHJvZHVjZSBhIHZhbHVlLgorICAvLy8KKyAgLy8vIFBSRV9JTkMgICAgICBTaW1pbGFyIHRvIHRoZSB1bmluZGV4ZWQgbW9kZSB3aGVyZSB0aGUgZWZmZWN0aXZlIGFkZHJlc3MgaXMKKyAgLy8vIFBSRV9ERUMgICAgICB0aGUgdmFsdWUgb2YgdGhlIGJhc2UgcG9pbnRlciBhZGQgLyBzdWJ0cmFjdCB0aGUgb2Zmc2V0LgorICAvLy8gICAgICAgICAgICAgIEl0IGNvbnNpZGVycyB0aGUgY29tcHV0YXRpb24gYXMgYmVpbmcgZm9sZGVkIGludG8gdGhlIGxvYWQgLworICAvLy8gICAgICAgICAgICAgIHN0b3JlIG9wZXJhdGlvbiAoaS5lLiB0aGUgbG9hZCAvIHN0b3JlIGRvZXMgdGhlIGFkZHJlc3MKKyAgLy8vICAgICAgICAgICAgICBjb21wdXRhdGlvbiBhcyB3ZWxsIGFzIHBlcmZvcm1pbmcgdGhlIG1lbW9yeSB0cmFuc2FjdGlvbikuCisgIC8vLyAgICAgICAgICAgICAgVGhlIGJhc2Ugb3BlcmFuZCBpcyBhbHdheXMgdW5kZWZpbmVkLiBJbiBhZGRpdGlvbiB0bworICAvLy8gICAgICAgICAgICAgIHByb2R1Y2luZyBhIGNoYWluLCBwcmUtaW5kZXhlZCBsb2FkIHByb2R1Y2VzIHR3byB2YWx1ZXMKKyAgLy8vICAgICAgICAgICAgICAocmVzdWx0IG9mIHRoZSBsb2FkIGFuZCB0aGUgcmVzdWx0IG9mIHRoZSBhZGRyZXNzCisgIC8vLyAgICAgICAgICAgICAgY29tcHV0YXRpb24pOyBhIHByZS1pbmRleGVkIHN0b3JlIHByb2R1Y2VzIG9uZSB2YWx1ZSAocmVzdWx0CisgIC8vLyAgICAgICAgICAgICAgb2YgdGhlIGFkZHJlc3MgY29tcHV0YXRpb24pLgorICAvLy8KKyAgLy8vIFBPU1RfSU5DICAgICBUaGUgZWZmZWN0aXZlIGFkZHJlc3MgaXMgdGhlIHZhbHVlIG9mIHRoZSBiYXNlIHBvaW50ZXIuIFRoZQorICAvLy8gUE9TVF9ERUMgICAgIHZhbHVlIG9mIHRoZSBvZmZzZXQgb3BlcmFuZCBpcyB0aGVuIGFkZGVkIHRvIC8gc3VidHJhY3RlZAorICAvLy8gICAgICAgICAgICAgIGZyb20gdGhlIGJhc2UgYWZ0ZXIgbWVtb3J5IHRyYW5zYWN0aW9uLiBJbiBhZGRpdGlvbiB0bworICAvLy8gICAgICAgICAgICAgIHByb2R1Y2luZyBhIGNoYWluLCBwb3N0LWluZGV4ZWQgbG9hZCBwcm9kdWNlcyB0d28gdmFsdWVzCisgIC8vLyAgICAgICAgICAgICAgKHRoZSByZXN1bHQgb2YgdGhlIGxvYWQgYW5kIHRoZSByZXN1bHQgb2YgdGhlIGJhc2UgKy8tIG9mZnNldAorICAvLy8gICAgICAgICAgICAgIGNvbXB1dGF0aW9uKTsgYSBwb3N0LWluZGV4ZWQgc3RvcmUgcHJvZHVjZXMgb25lIHZhbHVlICh0aGUKKyAgLy8vICAgICAgICAgICAgICB0aGUgcmVzdWx0IG9mIHRoZSBiYXNlICsvLSBvZmZzZXQgY29tcHV0YXRpb24pLgorICBlbnVtIE1lbUluZGV4ZWRNb2RlIHsKKyAgICBVTklOREVYRUQgPSAwLAorICAgIFBSRV9JTkMsCisgICAgUFJFX0RFQywKKyAgICBQT1NUX0lOQywKKyAgICBQT1NUX0RFQworICB9OworCisgIHN0YXRpYyBjb25zdCBpbnQgTEFTVF9JTkRFWEVEX01PREUgPSBQT1NUX0RFQyArIDE7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBMb2FkRXh0VHlwZSBlbnVtIC0gVGhpcyBlbnVtIGRlZmluZXMgdGhlIHRocmVlIHZhcmlhbnRzIG9mIExPQURFWFQKKyAgLy8vIChsb2FkIHdpdGggZXh0ZW5zaW9uKS4KKyAgLy8vCisgIC8vLyBTRVhUTE9BRCBsb2FkcyB0aGUgaW50ZWdlciBvcGVyYW5kIGFuZCBzaWduIGV4dGVuZHMgaXQgdG8gYSBsYXJnZXIKKyAgLy8vICAgICAgICAgIGludGVnZXIgcmVzdWx0IHR5cGUuCisgIC8vLyBaRVhUTE9BRCBsb2FkcyB0aGUgaW50ZWdlciBvcGVyYW5kIGFuZCB6ZXJvIGV4dGVuZHMgaXQgdG8gYSBsYXJnZXIKKyAgLy8vICAgICAgICAgIGludGVnZXIgcmVzdWx0IHR5cGUuCisgIC8vLyBFWFRMT0FEICBpcyB1c2VkIGZvciB0d28gdGhpbmdzOiBmbG9hdGluZyBwb2ludCBleHRlbmRpbmcgbG9hZHMgYW5kCisgIC8vLyAgICAgICAgICBpbnRlZ2VyIGV4dGVuZGluZyBsb2FkcyBbdGhlIHRvcCBiaXRzIGFyZSB1bmRlZmluZWRdLgorICBlbnVtIExvYWRFeHRUeXBlIHsKKyAgICBOT05fRVhUTE9BRCA9IDAsCisgICAgRVhUTE9BRCwKKyAgICBTRVhUTE9BRCwKKyAgICBaRVhUTE9BRAorICB9OworCisgIHN0YXRpYyBjb25zdCBpbnQgTEFTVF9MT0FERVhUX1RZUEUgPSBaRVhUTE9BRCArIDE7CisKKyAgTm9kZVR5cGUgZ2V0RXh0Rm9yTG9hZEV4dFR5cGUoYm9vbCBJc0ZQLCBMb2FkRXh0VHlwZSk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBJU0Q6OkNvbmRDb2RlIGVudW0gLSBUaGVzZSBhcmUgb3JkZXJlZCBjYXJlZnVsbHkgdG8gbWFrZSB0aGUgYml0ZmllbGRzCisgIC8vLyBiZWxvdyB3b3JrIG91dCwgd2hlbiBjb25zaWRlcmluZyBTRVRGQUxTRSAoc29tZXRoaW5nIHRoYXQgbmV2ZXIgZXhpc3RzCisgIC8vLyBkeW5hbWljYWxseSkgYXMgMC4gICJVIiAtPiBVbnNpZ25lZCAoZm9yIGludGVnZXIgb3BlcmFuZHMpIG9yIFVub3JkZXJlZAorICAvLy8gKGZvciBmbG9hdGluZyBwb2ludCksICJMIiAtPiBMZXNzIHRoYW4sICJHIiAtPiBHcmVhdGVyIHRoYW4sICJFIiAtPiBFcXVhbAorICAvLy8gdG8uICBJZiB0aGUgIk4iIGNvbHVtbiBpcyAxLCB0aGUgcmVzdWx0IG9mIHRoZSBjb21wYXJpc29uIGlzIHVuZGVmaW5lZCBpZgorICAvLy8gdGhlIGlucHV0IGlzIGEgTkFOLgorICAvLy8KKyAgLy8vIEFsbCBvZiB0aGVzZSAoZXhjZXB0IGZvciB0aGUgJ2Fsd2F5cyBmb2xkZWQgb3BzJykgc2hvdWxkIGJlIGhhbmRsZWQgZm9yCisgIC8vLyBmbG9hdGluZyBwb2ludC4gIEZvciBpbnRlZ2VyLCBvbmx5IHRoZSBTRVRFUSxTRVRORSxTRVRMVCxTRVRMRSxTRVRHVCwKKyAgLy8vIFNFVEdFLFNFVFVMVCxTRVRVTEUsU0VUVUdULCBhbmQgU0VUVUdFIG9wY29kZXMgYXJlIHVzZWQuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoZXNlIGFyZSBsYWlkIG91dCBpbiBhIHNwZWNpZmljIG9yZGVyIHRvIGFsbG93IGJpdC10d2lkZGxpbmcKKyAgLy8vIHRvIHRyYW5zZm9ybSBjb25kaXRpb25zLgorICBlbnVtIENvbmRDb2RlIHsKKyAgICAvLyBPcGNvZGUgICAgICAgICAgTiBVIEwgRyBFICAgICAgIEludHVpdGl2ZSBvcGVyYXRpb24KKyAgICBTRVRGQUxTRSwgICAgICAvLyAgICAwIDAgMCAwICAgICAgIEFsd2F5cyBmYWxzZSAoYWx3YXlzIGZvbGRlZCkKKyAgICBTRVRPRVEsICAgICAgICAvLyAgICAwIDAgMCAxICAgICAgIFRydWUgaWYgb3JkZXJlZCBhbmQgZXF1YWwKKyAgICBTRVRPR1QsICAgICAgICAvLyAgICAwIDAgMSAwICAgICAgIFRydWUgaWYgb3JkZXJlZCBhbmQgZ3JlYXRlciB0aGFuCisgICAgU0VUT0dFLCAgICAgICAgLy8gICAgMCAwIDEgMSAgICAgICBUcnVlIGlmIG9yZGVyZWQgYW5kIGdyZWF0ZXIgdGhhbiBvciBlcXVhbAorICAgIFNFVE9MVCwgICAgICAgIC8vICAgIDAgMSAwIDAgICAgICAgVHJ1ZSBpZiBvcmRlcmVkIGFuZCBsZXNzIHRoYW4KKyAgICBTRVRPTEUsICAgICAgICAvLyAgICAwIDEgMCAxICAgICAgIFRydWUgaWYgb3JkZXJlZCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsCisgICAgU0VUT05FLCAgICAgICAgLy8gICAgMCAxIDEgMCAgICAgICBUcnVlIGlmIG9yZGVyZWQgYW5kIG9wZXJhbmRzIGFyZSB1bmVxdWFsCisgICAgU0VUTywgICAgICAgICAgLy8gICAgMCAxIDEgMSAgICAgICBUcnVlIGlmIG9yZGVyZWQgKG5vIG5hbnMpCisgICAgU0VUVU8sICAgICAgICAgLy8gICAgMSAwIDAgMCAgICAgICBUcnVlIGlmIHVub3JkZXJlZDogaXNuYW4oWCkgfCBpc25hbihZKQorICAgIFNFVFVFUSwgICAgICAgIC8vICAgIDEgMCAwIDEgICAgICAgVHJ1ZSBpZiB1bm9yZGVyZWQgb3IgZXF1YWwKKyAgICBTRVRVR1QsICAgICAgICAvLyAgICAxIDAgMSAwICAgICAgIFRydWUgaWYgdW5vcmRlcmVkIG9yIGdyZWF0ZXIgdGhhbgorICAgIFNFVFVHRSwgICAgICAgIC8vICAgIDEgMCAxIDEgICAgICAgVHJ1ZSBpZiB1bm9yZGVyZWQsIGdyZWF0ZXIgdGhhbiwgb3IgZXF1YWwKKyAgICBTRVRVTFQsICAgICAgICAvLyAgICAxIDEgMCAwICAgICAgIFRydWUgaWYgdW5vcmRlcmVkIG9yIGxlc3MgdGhhbgorICAgIFNFVFVMRSwgICAgICAgIC8vICAgIDEgMSAwIDEgICAgICAgVHJ1ZSBpZiB1bm9yZGVyZWQsIGxlc3MgdGhhbiwgb3IgZXF1YWwKKyAgICBTRVRVTkUsICAgICAgICAvLyAgICAxIDEgMSAwICAgICAgIFRydWUgaWYgdW5vcmRlcmVkIG9yIG5vdCBlcXVhbAorICAgIFNFVFRSVUUsICAgICAgIC8vICAgIDEgMSAxIDEgICAgICAgQWx3YXlzIHRydWUgKGFsd2F5cyBmb2xkZWQpCisgICAgLy8gRG9uJ3QgY2FyZSBvcGVyYXRpb25zOiB1bmRlZmluZWQgaWYgdGhlIGlucHV0IGlzIGEgbmFuLgorICAgIFNFVEZBTFNFMiwgICAgIC8vICAxIFggMCAwIDAgICAgICAgQWx3YXlzIGZhbHNlIChhbHdheXMgZm9sZGVkKQorICAgIFNFVEVRLCAgICAgICAgIC8vICAxIFggMCAwIDEgICAgICAgVHJ1ZSBpZiBlcXVhbAorICAgIFNFVEdULCAgICAgICAgIC8vICAxIFggMCAxIDAgICAgICAgVHJ1ZSBpZiBncmVhdGVyIHRoYW4KKyAgICBTRVRHRSwgICAgICAgICAvLyAgMSBYIDAgMSAxICAgICAgIFRydWUgaWYgZ3JlYXRlciB0aGFuIG9yIGVxdWFsCisgICAgU0VUTFQsICAgICAgICAgLy8gIDEgWCAxIDAgMCAgICAgICBUcnVlIGlmIGxlc3MgdGhhbgorICAgIFNFVExFLCAgICAgICAgIC8vICAxIFggMSAwIDEgICAgICAgVHJ1ZSBpZiBsZXNzIHRoYW4gb3IgZXF1YWwKKyAgICBTRVRORSwgICAgICAgICAvLyAgMSBYIDEgMSAwICAgICAgIFRydWUgaWYgbm90IGVxdWFsCisgICAgU0VUVFJVRTIsICAgICAgLy8gIDEgWCAxIDEgMSAgICAgICBBbHdheXMgdHJ1ZSAoYWx3YXlzIGZvbGRlZCkKKworICAgIFNFVENDX0lOVkFMSUQgICAgICAgLy8gTWFya2VyIHZhbHVlLgorICB9OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgc2V0Y2MgaW5zdHJ1Y3Rpb24gdGhhdCBwZXJmb3JtcyBhIHNpZ25lZAorICAvLy8gY29tcGFyaXNvbiB3aGVuIHVzZWQgd2l0aCBpbnRlZ2VyIG9wZXJhbmRzLgorICBpbmxpbmUgYm9vbCBpc1NpZ25lZEludFNldENDKENvbmRDb2RlIENvZGUpIHsKKyAgICByZXR1cm4gQ29kZSA9PSBTRVRHVCB8fCBDb2RlID09IFNFVEdFIHx8IENvZGUgPT0gU0VUTFQgfHwgQ29kZSA9PSBTRVRMRTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgc2V0Y2MgaW5zdHJ1Y3Rpb24gdGhhdCBwZXJmb3JtcyBhbiB1bnNpZ25lZAorICAvLy8gY29tcGFyaXNvbiB3aGVuIHVzZWQgd2l0aCBpbnRlZ2VyIG9wZXJhbmRzLgorICBpbmxpbmUgYm9vbCBpc1Vuc2lnbmVkSW50U2V0Q0MoQ29uZENvZGUgQ29kZSkgeworICAgIHJldHVybiBDb2RlID09IFNFVFVHVCB8fCBDb2RlID09IFNFVFVHRSB8fCBDb2RlID09IFNFVFVMVCB8fCBDb2RlID09IFNFVFVMRTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGNvbmRpdGlvbiByZXR1cm5zIHRydWUgaWYgdGhlIHR3byBvcGVyYW5kcyB0bworICAvLy8gdGhlIGNvbmRpdGlvbiBhcmUgZXF1YWwuIE5vdGUgdGhhdCBpZiBvbmUgb2YgdGhlIHR3byBvcGVyYW5kcyBpcyBhIE5hTiwKKyAgLy8vIHRoaXMgdmFsdWUgaXMgbWVhbmluZ2xlc3MuCisgIGlubGluZSBib29sIGlzVHJ1ZVdoZW5FcXVhbChDb25kQ29kZSBDb25kKSB7CisgICAgcmV0dXJuICgoaW50KUNvbmQgJiAxKSAhPSAwOworICB9CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyAwIGlmIHRoZSBjb25kaXRpb24gaXMgYWx3YXlzIGZhbHNlIGlmIGFuIG9wZXJhbmQgaXMKKyAgLy8vIGEgTmFOLCAxIGlmIHRoZSBjb25kaXRpb24gaXMgYWx3YXlzIHRydWUgaWYgdGhlIG9wZXJhbmQgaXMgYSBOYU4sIGFuZCAyIGlmCisgIC8vLyB0aGUgY29uZGl0aW9uIGlzIHVuZGVmaW5lZCBpZiB0aGUgb3BlcmFuZCBpcyBhIE5hTi4KKyAgaW5saW5lIHVuc2lnbmVkIGdldFVub3JkZXJlZEZsYXZvcihDb25kQ29kZSBDb25kKSB7CisgICAgcmV0dXJuICgoaW50KUNvbmQgPj4gMykgJiAzOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgb3BlcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gIShYIG9wIFkpLCB3aGVyZSAnb3AnIGlzIGEgdmFsaWQKKyAgLy8vIFNldENDIG9wZXJhdGlvbi4KKyAgQ29uZENvZGUgZ2V0U2V0Q0NJbnZlcnNlKENvbmRDb2RlIE9wZXJhdGlvbiwgYm9vbCBpc0ludGVnZXIpOworCisgIC8vLyBSZXR1cm4gdGhlIG9wZXJhdGlvbiBjb3JyZXNwb25kaW5nIHRvIChZIG9wIFgpIHdoZW4gZ2l2ZW4gdGhlIG9wZXJhdGlvbgorICAvLy8gZm9yIChYIG9wIFkpLgorICBDb25kQ29kZSBnZXRTZXRDQ1N3YXBwZWRPcGVyYW5kcyhDb25kQ29kZSBPcGVyYXRpb24pOworCisgIC8vLyBSZXR1cm4gdGhlIHJlc3VsdCBvZiBhIGxvZ2ljYWwgT1IgYmV0d2VlbiBkaWZmZXJlbnQgY29tcGFyaXNvbnMgb2YKKyAgLy8vIGlkZW50aWNhbCB2YWx1ZXM6ICgoWCBvcDEgWSkgfCAoWCBvcDIgWSkpLiBUaGlzIGZ1bmN0aW9uIHJldHVybnMKKyAgLy8vIFNFVENDX0lOVkFMSUQgaWYgaXQgaXMgbm90IHBvc3NpYmxlIHRvIHJlcHJlc2VudCB0aGUgcmVzdWx0YW50IGNvbXBhcmlzb24uCisgIENvbmRDb2RlIGdldFNldENDT3JPcGVyYXRpb24oQ29uZENvZGUgT3AxLCBDb25kQ29kZSBPcDIsIGJvb2wgaXNJbnRlZ2VyKTsKKworICAvLy8gUmV0dXJuIHRoZSByZXN1bHQgb2YgYSBsb2dpY2FsIEFORCBiZXR3ZWVuIGRpZmZlcmVudCBjb21wYXJpc29ucyBvZgorICAvLy8gaWRlbnRpY2FsIHZhbHVlczogKChYIG9wMSBZKSAmIChYIG9wMiBZKSkuIFRoaXMgZnVuY3Rpb24gcmV0dXJucworICAvLy8gU0VUQ0NfSU5WQUxJRCBpZiBpdCBpcyBub3QgcG9zc2libGUgdG8gcmVwcmVzZW50IHRoZSByZXN1bHRhbnQgY29tcGFyaXNvbi4KKyAgQ29uZENvZGUgZ2V0U2V0Q0NBbmRPcGVyYXRpb24oQ29uZENvZGUgT3AxLCBDb25kQ29kZSBPcDIsIGJvb2wgaXNJbnRlZ2VyKTsKKworfSAvLyBlbmQgbGx2bTo6SVNEIG5hbWVzcGFjZQorCit9IC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9JbnRyaW5zaWNMb3dlcmluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0ludHJpbnNpY0xvd2VyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTk3ZDY4NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9JbnRyaW5zaWNMb3dlcmluZy5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vPT09LS0gSW50cmluc2ljTG93ZXJpbmcuaCAtIEludHJpbnNpYyBGdW5jdGlvbiBMb3dlcmluZyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIEludHJpbnNpY0xvd2VyaW5nIGludGVyZmFjZS4gIFRoaXMgaW50ZXJmYWNlIGFsbG93cworLy8gYWRkaXRpb24gb2YgZG9tYWluLXNwZWNpZmljIG9yIGZyb250LWVuZCBzcGVjaWZpYyBpbnRyaW5zaWNzIHRvIExMVk0gd2l0aG91dAorLy8gaGF2aW5nIHRvIG1vZGlmeSBhbGwgb2YgdGhlIEMgYmFja2VuZCBvciBpbnRlcnByZXRlci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9JTlRSSU5TSUNMT1dFUklOR19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9JTlRSSU5TSUNMT1dFUklOR19ICisKKyNpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgQ2FsbEluc3Q7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBEYXRhTGF5b3V0OworCitjbGFzcyBJbnRyaW5zaWNMb3dlcmluZyB7CisgIGNvbnN0IERhdGFMYXlvdXQgJkRMOworCisgIGJvb2wgV2FybmVkOworCitwdWJsaWM6CisgIGV4cGxpY2l0IEludHJpbnNpY0xvd2VyaW5nKGNvbnN0IERhdGFMYXlvdXQgJkRMKSA6IERMKERMKSwgV2FybmVkKGZhbHNlKSB7fQorCisgIC8vLyBBZGQgYWxsIG9mIHRoZSBwcm90b3R5cGVzIHRoYXQgbWlnaHQgYmUgbmVlZGVkIGJ5IGFuIGludHJpbnNpYyBsb3dlcmluZworICAvLy8gaW1wbGVtZW50YXRpb24gdG8gYmUgaW5zZXJ0ZWQgaW50byB0aGUgbW9kdWxlIHNwZWNpZmllZC4KKyAgdm9pZCBBZGRQcm90b3R5cGVzKE1vZHVsZSAmTSk7CisKKyAgLy8vIFJlcGxhY2UgYSBjYWxsIHRvIHRoZSBzcGVjaWZpZWQgaW50cmluc2ljIGZ1bmN0aW9uLgorICAvLy8gSWYgYW4gaW50cmluc2ljIGZ1bmN0aW9uIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yCisgIC8vLyAoc3VjaCBhcyB2YV9zdGFydCksIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHByaW50IGEgbWVzc2FnZSBhbmQgYWJvcnQuCisgIC8vLworICAvLy8gT3RoZXJ3aXNlLCBpZiBhbiBpbnRyaW5zaWMgZnVuY3Rpb24gY2FsbCBjYW4gYmUgbG93ZXJlZCwgdGhlIGNvZGUgdG8KKyAgLy8vIGltcGxlbWVudCBpdCAob2Z0ZW4gYSBjYWxsIHRvIGEgbm9uLWludHJpbnNpYyBmdW5jdGlvbikgaXMgaW5zZXJ0ZWQKKyAgLy8vIF9hZnRlcl8gdGhlIGNhbGwgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBjYWxsIGlzIGRlbGV0ZWQuIFRoZSBjYWxsZXIgbXVzdAorICAvLy8gYmUgY2FwYWJsZSBvZiBoYW5kbGluZyB0aGlzIGtpbmQgb2YgY2hhbmdlLgorICB2b2lkIExvd2VySW50cmluc2ljQ2FsbChDYWxsSW5zdCAqQ0kpOworCisgIC8vLyBUcnkgdG8gcmVwbGFjZSBhIGNhbGwgaW5zdHJ1Y3Rpb24gd2l0aCBhIGNhbGwgdG8gYSBic3dhcCBpbnRyaW5zaWMuIFJldHVybgorICAvLy8gZmFsc2UgaWYgdGhlIGNhbGwgaXMgbm90IGEgc2ltcGxlIGludGVnZXIgYnN3YXAuCisgIHN0YXRpYyBib29sIExvd2VyVG9CeXRlU3dhcChDYWxsSW5zdCAqQ0kpOworfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGF0ZW5jeVByaW9yaXR5UXVldWUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MYXRlbmN5UHJpb3JpdHlRdWV1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4OGU2ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGF0ZW5jeVByaW9yaXR5UXVldWUuaApAQCAtMCwwICsxLDk4IEBACisvLz09PS0tLS0gTGF0ZW5jeVByaW9yaXR5UXVldWUuaCAtIEEgbGF0ZW5jeS1vcmllbnRlZCBwcmlvcml0eSBxdWV1ZSAtLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgTGF0ZW5jeVByaW9yaXR5UXVldWUgY2xhc3MsIHdoaWNoIGlzIGEKKy8vIFNjaGVkdWxpbmdQcmlvcml0eVF1ZXVlIHRoYXQgc2NoZWR1bGVzIHVzaW5nIGxhdGVuY3kgaW5mb3JtYXRpb24gdG8KKy8vIHJlZHVjZSB0aGUgbGVuZ3RoIG9mIHRoZSBjcml0aWNhbCBwYXRoIHRocm91Z2ggdGhlIGJhc2ljIGJsb2NrLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0xBVEVOQ1lQUklPUklUWVFVRVVFX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0xBVEVOQ1lQUklPUklUWVFVRVVFX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TY2hlZHVsZURBRy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIExhdGVuY3lQcmlvcml0eVF1ZXVlOworCisgIC8vLyBTb3J0aW5nIGZ1bmN0aW9ucyBmb3IgdGhlIEF2YWlsYWJsZSBxdWV1ZS4KKyAgc3RydWN0IGxhdGVuY3lfc29ydCB7CisgICAgTGF0ZW5jeVByaW9yaXR5UXVldWUgKlBROworICAgIGV4cGxpY2l0IGxhdGVuY3lfc29ydChMYXRlbmN5UHJpb3JpdHlRdWV1ZSAqcHEpIDogUFEocHEpIHt9CisKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgU1VuaXQqIGxlZnQsIGNvbnN0IFNVbml0KiByaWdodCkgY29uc3Q7CisgIH07CisKKyAgY2xhc3MgTGF0ZW5jeVByaW9yaXR5UXVldWUgOiBwdWJsaWMgU2NoZWR1bGluZ1ByaW9yaXR5UXVldWUgeworICAgIC8vIFNVbml0cyAtIFRoZSBTVW5pdHMgZm9yIHRoZSBjdXJyZW50IGdyYXBoLgorICAgIHN0ZDo6dmVjdG9yPFNVbml0PiAqU1VuaXRzOworCisgICAgLy8vIE51bU5vZGVzU29sZWx5QmxvY2tpbmcgLSBUaGlzIHZlY3RvciBjb250YWlucywgZm9yIGV2ZXJ5IG5vZGUgaW4gdGhlCisgICAgLy8vIFF1ZXVlLCB0aGUgbnVtYmVyIG9mIG5vZGVzIHRoYXQgdGhlIG5vZGUgaXMgdGhlIHNvbGUgdW5zY2hlZHVsZWQKKyAgICAvLy8gcHJlZGVjZXNzb3IgZm9yLiAgVGhpcyBpcyB1c2VkIGFzIGEgdGllLWJyZWFrZXIgaGV1cmlzdGljIGZvciBiZXR0ZXIKKyAgICAvLy8gbW9iaWxpdHkuCisgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IE51bU5vZGVzU29sZWx5QmxvY2tpbmc7CisKKyAgICAvLy8gUXVldWUgLSBUaGUgcXVldWUuCisgICAgc3RkOjp2ZWN0b3I8U1VuaXQqPiBRdWV1ZTsKKyAgICBsYXRlbmN5X3NvcnQgUGlja2VyOworCisgIHB1YmxpYzoKKyAgICBMYXRlbmN5UHJpb3JpdHlRdWV1ZSgpIDogUGlja2VyKHRoaXMpIHsKKyAgICB9CisKKyAgICBib29sIGlzQm90dG9tVXAoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgdm9pZCBpbml0Tm9kZXMoc3RkOjp2ZWN0b3I8U1VuaXQ+ICZzdW5pdHMpIG92ZXJyaWRlIHsKKyAgICAgIFNVbml0cyA9ICZzdW5pdHM7CisgICAgICBOdW1Ob2Rlc1NvbGVseUJsb2NraW5nLnJlc2l6ZShTVW5pdHMtPnNpemUoKSwgMCk7CisgICAgfQorCisgICAgdm9pZCBhZGROb2RlKGNvbnN0IFNVbml0ICpTVSkgb3ZlcnJpZGUgeworICAgICAgTnVtTm9kZXNTb2xlbHlCbG9ja2luZy5yZXNpemUoU1VuaXRzLT5zaXplKCksIDApOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlTm9kZShjb25zdCBTVW5pdCAqU1UpIG92ZXJyaWRlIHsKKyAgICB9CisKKyAgICB2b2lkIHJlbGVhc2VTdGF0ZSgpIG92ZXJyaWRlIHsKKyAgICAgIFNVbml0cyA9IG51bGxwdHI7CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0TGF0ZW5jeSh1bnNpZ25lZCBOb2RlTnVtKSBjb25zdCB7CisgICAgICBhc3NlcnQoTm9kZU51bSA8ICgqU1VuaXRzKS5zaXplKCkpOworICAgICAgcmV0dXJuICgqU1VuaXRzKVtOb2RlTnVtXS5nZXRIZWlnaHQoKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBnZXROdW1Tb2xlbHlCbG9ja05vZGVzKHVuc2lnbmVkIE5vZGVOdW0pIGNvbnN0IHsKKyAgICAgIGFzc2VydChOb2RlTnVtIDwgTnVtTm9kZXNTb2xlbHlCbG9ja2luZy5zaXplKCkpOworICAgICAgcmV0dXJuIE51bU5vZGVzU29sZWx5QmxvY2tpbmdbTm9kZU51bV07CisgICAgfQorCisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIFF1ZXVlLmVtcHR5KCk7IH0KKworICAgIHZvaWQgcHVzaChTVW5pdCAqVSkgb3ZlcnJpZGU7CisKKyAgICBTVW5pdCAqcG9wKCkgb3ZlcnJpZGU7CisKKyAgICB2b2lkIHJlbW92ZShTVW5pdCAqU1UpIG92ZXJyaWRlOworCisgICAgLy8gc2NoZWR1bGVkTm9kZSAtIEFzIG5vZGVzIGFyZSBzY2hlZHVsZWQsIHdlIGxvb2sgdG8gc2VlIGlmIHRoZXJlIGFyZSBhbnkKKyAgICAvLyBzdWNjZXNzb3Igbm9kZXMgdGhhdCBoYXZlIGEgc2luZ2xlIHVuc2NoZWR1bGVkIHByZWRlY2Vzc29yLiAgSWYgc28sIHRoYXQKKyAgICAvLyBzaW5nbGUgcHJlZGVjZXNzb3IgaGFzIGEgaGlnaGVyIHByaW9yaXR5LCBzaW5jZSBzY2hlZHVsaW5nIGl0IHdpbGwgbWFrZQorICAgIC8vIHRoZSBub2RlIGF2YWlsYWJsZS4KKyAgICB2b2lkIHNjaGVkdWxlZE5vZGUoU1VuaXQgKk5vZGUpIG92ZXJyaWRlOworCitwcml2YXRlOgorICAgIHZvaWQgQWRqdXN0UHJpb3JpdHlPZlVuc2NoZWR1bGVkUHJlZHMoU1VuaXQgKlNVKTsKKyAgICBTVW5pdCAqZ2V0U2luZ2xlVW5zY2hlZHVsZWRQcmVkKFNVbml0ICpTVSk7CisgIH07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xhenlNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGF6eU1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDhlZTFkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xhenlNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvLmgKQEAgLTAsMCArMSw3NiBAQAorLy8vPT09LSBMYXp5TWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mby5oIC0gTGF6eSBCbG9jayBGcmVxdWVuY3kgLSotIEMrKyAtKi0tPT09Ly8KKy8vLworLy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vLworLy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vLworLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIFRoaXMgaXMgYW4gYWx0ZXJuYXRpdmUgYW5hbHlzaXMgcGFzcyB0byBNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvLiAgVGhlCisvLy8gZGlmZmVyZW5jZSBpcyB0aGF0IHdpdGggdGhpcyBwYXNzIHRoZSBibG9jayBmcmVxdWVuY2llcyBhcmUgbm90IGNvbXB1dGVkCisvLy8gd2hlbiB0aGUgYW5hbHlzaXMgcGFzcyBpcyBleGVjdXRlZCBidXQgcmF0aGVyIHdoZW4gdGhlIEJGSSByZXN1bHQgaXMKKy8vLyBleHBsaWNpdGx5IHJlcXVlc3RlZCBieSB0aGUgYW5hbHlzaXMgY2xpZW50LgorLy8vCisvLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQU5BTFlTSVNfTEFaWU1BQ0hJTkVCTE9DS0ZSRVFVRU5DWUlORk9fSAorI2RlZmluZSBMTFZNX0FOQUxZU0lTX0xBWllNQUNISU5FQkxPQ0tGUkVRVUVOQ1lJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCcmFuY2hQcm9iYWJpbGl0eUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZURvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUxvb3BJbmZvLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKy8vLyBcYnJpZWYgVGhpcyBpcyBhbiBhbHRlcm5hdGl2ZSBhbmFseXNpcyBwYXNzIHRvIE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8uCisvLy8gVGhlIGRpZmZlcmVuY2UgaXMgdGhhdCB3aXRoIHRoaXMgcGFzcywgdGhlIGJsb2NrIGZyZXF1ZW5jaWVzIGFyZSBub3QKKy8vLyBjb21wdXRlZCB3aGVuIHRoZSBhbmFseXNpcyBwYXNzIGlzIGV4ZWN1dGVkIGJ1dCByYXRoZXIgd2hlbiB0aGUgQkZJIHJlc3VsdAorLy8vIGlzIGV4cGxpY2l0bHkgcmVxdWVzdGVkIGJ5IHRoZSBhbmFseXNpcyBjbGllbnQuCisvLy8KKy8vLyBUaGlzIHdvcmtzIGJ5IGNoZWNraW5nIHF1ZXJ5aW5nIGlmIE1CRkkgaXMgYXZhaWxhYmxlIGFuZCBvdGhlcndpc2UKKy8vLyBnZW5lcmF0aW5nIE1CRkkgb24gdGhlIGZseS4gIEluIHRoaXMgY2FzZSB0aGUgcGFzc2VzIHJlcXVpcmVkIGZvciAoTEksIERUKQorLy8vIGFyZSBhbHNvIHF1ZXJpZWQgYmVmb3JlIGJlaW5nIGNvbXB1dGVkIG9uIHRoZSBmbHkuCisvLy8KKy8vLyBOb3RlIHRoYXQgaXQgaXMgZXhwZWN0ZWQgdGhhdCB3ZSB3b3VsZG4ndCBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eSBmb3IgdGhlCisvLy8gbmV3IFBNIHNpbmNlIHdpdGggdGhlIG5ldyBQTSwgYW5hbHlzZXMgYXJlIGV4ZWN1dGVkIG9uIGRlbWFuZC4KKworY2xhc3MgTGF6eU1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm9QYXNzIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworcHJpdmF0ZToKKyAgLy8vIElmIGdlbmVyYXRlZCBvbiB0aGUgZmx5IHRoaXMgb3duIHRoZSBpbnN0YW5jZS4KKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8TWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mbz4gT3duZWRNQkZJOworCisgIC8vLyBJZiBnZW5lcmF0ZWQgb24gdGhlIGZseSB0aGlzIG93biB0aGUgaW5zdGFuY2UuCisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPE1hY2hpbmVMb29wSW5mbz4gT3duZWRNTEk7CisKKyAgLy8vIElmIGdlbmVyYXRlZCBvbiB0aGUgZmx5IHRoaXMgb3duIHRoZSBpbnN0YW5jZS4KKyAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8TWFjaGluZURvbWluYXRvclRyZWU+IE93bmVkTURUOworCisgIC8vLyBUaGUgZnVuY3Rpb24uCisgIE1hY2hpbmVGdW5jdGlvbiAqTUYgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgQ2FsY3VsYXRlIE1CRkkgYW5kIGFsbCBvdGhlciBhbmFseXNlcyB0aGF0J3Mgbm90IGF2YWlsYWJsZSBhbmQKKyAgLy8vIHJlcXVpcmVkIGJ5IEJGSS4KKyAgTWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mbyAmY2FsY3VsYXRlSWZOb3RBdmFpbGFibGUoKSBjb25zdDsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBMYXp5TWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mb1Bhc3MoKTsKKworICAvLy8gXGJyaWVmIENvbXB1dGUgYW5kIHJldHVybiB0aGUgYmxvY2sgZnJlcXVlbmNpZXMuCisgIE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8gJmdldEJGSSgpIHsgcmV0dXJuIGNhbGN1bGF0ZUlmTm90QXZhaWxhYmxlKCk7IH0KKworICAvLy8gXGJyaWVmIENvbXB1dGUgYW5kIHJldHVybiB0aGUgYmxvY2sgZnJlcXVlbmNpZXMuCisgIGNvbnN0IE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8gJmdldEJGSSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FsY3VsYXRlSWZOb3RBdmFpbGFibGUoKTsKKyAgfQorCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZTsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSAqTSkgY29uc3Qgb3ZlcnJpZGU7Cit9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGV4aWNhbFNjb3Blcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xleGljYWxTY29wZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmE1MDM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xleGljYWxTY29wZXMuaApAQCAtMCwwICsxLDI1OCBAQAorLy89PT0tIExleGljYWxTY29wZXMuY3BwIC0gQ29sbGVjdGluZyBsZXhpY2FsIHNjb3BlIGluZm8gLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBMZXhpY2FsU2NvcGVzIGFuYWx5c2lzLgorLy8KKy8vIFRoaXMgcGFzcyBjb2xsZWN0cyBsZXhpY2FsIHNjb3BlIGluZm9ybWF0aW9uIGFuZCBtYXBzIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zCisvLyB0byByZXNwZWN0aXZlIGxleGljYWwgc2NvcGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0xFWElDQUxTQ09QRVNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTEVYSUNBTFNDT1BFU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGVidWdJbmZvTWV0YWRhdGEuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIE1ETm9kZTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBJbnNuUmFuZ2UgLSBUaGlzIGlzIHVzZWQgdG8gdHJhY2sgcmFuZ2Ugb2YgaW5zdHJ1Y3Rpb25zIHdpdGggaWRlbnRpY2FsCisvLy8gbGV4aWNhbCBzY29wZS4KKy8vLwordXNpbmcgSW5zblJhbmdlID0gc3RkOjpwYWlyPGNvbnN0IE1hY2hpbmVJbnN0ciAqLCBjb25zdCBNYWNoaW5lSW5zdHIgKj47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gTGV4aWNhbFNjb3BlIC0gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHRyYWNrIHNjb3BlIGluZm9ybWF0aW9uLgorLy8vCitjbGFzcyBMZXhpY2FsU2NvcGUgeworcHVibGljOgorICBMZXhpY2FsU2NvcGUoTGV4aWNhbFNjb3BlICpQLCBjb25zdCBESUxvY2FsU2NvcGUgKkQsIGNvbnN0IERJTG9jYXRpb24gKkksCisgICAgICAgICAgICAgICBib29sIEEpCisgICAgICA6IFBhcmVudChQKSwgRGVzYyhEKSwgSW5saW5lZEF0TG9jYXRpb24oSSksIEFic3RyYWN0U2NvcGUoQSkgeworICAgIGFzc2VydChEKTsKKyAgICBhc3NlcnQoRC0+Z2V0U3VicHJvZ3JhbSgpLT5nZXRVbml0KCktPmdldEVtaXNzaW9uS2luZCgpICE9CisgICAgICAgICAgIERJQ29tcGlsZVVuaXQ6Ok5vRGVidWcgJiYKKyAgICAgICAgICAgIkRvbid0IGJ1aWxkIGxleGljYWwgc2NvcGVzIGZvciBub24tZGVidWcgbG9jYXRpb25zIik7CisgICAgYXNzZXJ0KEQtPmlzUmVzb2x2ZWQoKSAmJiAiRXhwZWN0ZWQgcmVzb2x2ZWQgbm9kZSIpOworICAgIGFzc2VydCgoIUkgfHwgSS0+aXNSZXNvbHZlZCgpKSAmJiAiRXhwZWN0ZWQgcmVzb2x2ZWQgbm9kZSIpOworICAgIGlmIChQYXJlbnQpCisgICAgICBQYXJlbnQtPmFkZENoaWxkKHRoaXMpOworICB9CisKKyAgLy8gQWNjZXNzb3JzLgorICBMZXhpY2FsU2NvcGUgKmdldFBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIFBhcmVudDsgfQorICBjb25zdCBNRE5vZGUgKmdldERlc2MoKSBjb25zdCB7IHJldHVybiBEZXNjOyB9CisgIGNvbnN0IERJTG9jYXRpb24gKmdldElubGluZWRBdCgpIGNvbnN0IHsgcmV0dXJuIElubGluZWRBdExvY2F0aW9uOyB9CisgIGNvbnN0IERJTG9jYWxTY29wZSAqZ2V0U2NvcGVOb2RlKCkgY29uc3QgeyByZXR1cm4gRGVzYzsgfQorICBib29sIGlzQWJzdHJhY3RTY29wZSgpIGNvbnN0IHsgcmV0dXJuIEFic3RyYWN0U2NvcGU7IH0KKyAgU21hbGxWZWN0b3JJbXBsPExleGljYWxTY29wZSAqPiAmZ2V0Q2hpbGRyZW4oKSB7IHJldHVybiBDaGlsZHJlbjsgfQorICBTbWFsbFZlY3RvckltcGw8SW5zblJhbmdlPiAmZ2V0UmFuZ2VzKCkgeyByZXR1cm4gUmFuZ2VzOyB9CisKKyAgLy8vIGFkZENoaWxkIC0gQWRkIGEgY2hpbGQgc2NvcGUuCisgIHZvaWQgYWRkQ2hpbGQoTGV4aWNhbFNjb3BlICpTKSB7IENoaWxkcmVuLnB1c2hfYmFjayhTKTsgfQorCisgIC8vLyBvcGVuSW5zblJhbmdlIC0gVGhpcyBzY29wZSBjb3ZlcnMgaW5zdHJ1Y3Rpb24gcmFuZ2Ugc3RhcnRpbmcgZnJvbSBNSS4KKyAgdm9pZCBvcGVuSW5zblJhbmdlKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgICBpZiAoIUZpcnN0SW5zbikKKyAgICAgIEZpcnN0SW5zbiA9IE1JOworCisgICAgaWYgKFBhcmVudCkKKyAgICAgIFBhcmVudC0+b3Blbkluc25SYW5nZShNSSk7CisgIH0KKworICAvLy8gZXh0ZW5kSW5zblJhbmdlIC0gRXh0ZW5kIHRoZSBjdXJyZW50IGluc3RydWN0aW9uIHJhbmdlIGNvdmVyZWQgYnkKKyAgLy8vIHRoaXMgc2NvcGUuCisgIHZvaWQgZXh0ZW5kSW5zblJhbmdlKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpIHsKKyAgICBhc3NlcnQoRmlyc3RJbnNuICYmICJNSSBSYW5nZSBpcyBub3Qgb3BlbiEiKTsKKyAgICBMYXN0SW5zbiA9IE1JOworICAgIGlmIChQYXJlbnQpCisgICAgICBQYXJlbnQtPmV4dGVuZEluc25SYW5nZShNSSk7CisgIH0KKworICAvLy8gY2xvc2VJbnNuUmFuZ2UgLSBDcmVhdGUgYSByYW5nZSBiYXNlZCBvbiBGaXJzdEluc24gYW5kIExhc3RJbnNuIGNvbGxlY3RlZAorICAvLy8gdW50aWwgbm93LiBUaGlzIGlzIHVzZWQgd2hlbiBhIG5ldyBzY29wZSBpcyBlbmNvdW50ZXJlZCB3aGlsZSB3YWxraW5nCisgIC8vLyBtYWNoaW5lIGluc3RydWN0aW9ucy4KKyAgdm9pZCBjbG9zZUluc25SYW5nZShMZXhpY2FsU2NvcGUgKk5ld1Njb3BlID0gbnVsbHB0cikgeworICAgIGFzc2VydChMYXN0SW5zbiAmJiAiTGFzdCBpbnNuIG1pc3NpbmchIik7CisgICAgUmFuZ2VzLnB1c2hfYmFjayhJbnNuUmFuZ2UoRmlyc3RJbnNuLCBMYXN0SW5zbikpOworICAgIEZpcnN0SW5zbiA9IG51bGxwdHI7CisgICAgTGFzdEluc24gPSBudWxscHRyOworICAgIC8vIElmIFBhcmVudCBkb21pbmF0ZXMgTmV3U2NvcGUgdGhlbiBkbyBub3QgY2xvc2UgUGFyZW50J3MgaW5zdHJ1Y3Rpb24KKyAgICAvLyByYW5nZS4KKyAgICBpZiAoUGFyZW50ICYmICghTmV3U2NvcGUgfHwgIVBhcmVudC0+ZG9taW5hdGVzKE5ld1Njb3BlKSkpCisgICAgICBQYXJlbnQtPmNsb3NlSW5zblJhbmdlKE5ld1Njb3BlKTsKKyAgfQorCisgIC8vLyBkb21pbmF0ZXMgLSBSZXR1cm4gdHJ1ZSBpZiBjdXJyZW50IHNjb3BlIGRvbWluYXRlcyBnaXZlbiBsZXhpY2FsIHNjb3BlLgorICBib29sIGRvbWluYXRlcyhjb25zdCBMZXhpY2FsU2NvcGUgKlMpIGNvbnN0IHsKKyAgICBpZiAoUyA9PSB0aGlzKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKERGU0luIDwgUy0+Z2V0REZTSW4oKSAmJiBERlNPdXQgPiBTLT5nZXRERlNPdXQoKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIERlcHRoIEZpcnN0IFNlYXJjaCBzdXBwb3J0IHRvIHdhbGsgYW5kIG1hbmlwdWxhdGUgTGV4aWNhbFNjb3BlIGhpZXJhcmNoeS4KKyAgdW5zaWduZWQgZ2V0REZTT3V0KCkgY29uc3QgeyByZXR1cm4gREZTT3V0OyB9CisgIHZvaWQgc2V0REZTT3V0KHVuc2lnbmVkIE8pIHsgREZTT3V0ID0gTzsgfQorICB1bnNpZ25lZCBnZXRERlNJbigpIGNvbnN0IHsgcmV0dXJuIERGU0luOyB9CisgIHZvaWQgc2V0REZTSW4odW5zaWduZWQgSSkgeyBERlNJbiA9IEk7IH0KKworICAvLy8gZHVtcCAtIHByaW50IGxleGljYWwgc2NvcGUuCisgIHZvaWQgZHVtcCh1bnNpZ25lZCBJbmRlbnQgPSAwKSBjb25zdDsKKworcHJpdmF0ZToKKyAgTGV4aWNhbFNjb3BlICpQYXJlbnQ7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFyZW50IHRvIHRoaXMgc2NvcGUuCisgIGNvbnN0IERJTG9jYWxTY29wZSAqRGVzYzsgICAgICAgICAgICAgICAgICAgIC8vIERlYnVnIGluZm8gZGVzY3JpcHRvci4KKyAgY29uc3QgRElMb2NhdGlvbiAqSW5saW5lZEF0TG9jYXRpb247ICAgICAgICAgLy8gTG9jYXRpb24gYXQgd2hpY2ggdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzY29wZSBpcyBpbmxpbmVkLgorICBib29sIEFic3RyYWN0U2NvcGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBBYnN0cmFjdCBTY29wZQorICBTbWFsbFZlY3RvcjxMZXhpY2FsU2NvcGUgKiwgND4gQ2hpbGRyZW47ICAgICAvLyBTY29wZXMgZGVmaW5lZCBpbiBzY29wZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29udGVudHMgbm90IG93bmVkLgorICBTbWFsbFZlY3RvcjxJbnNuUmFuZ2UsIDQ+IFJhbmdlczsKKworICBjb25zdCBNYWNoaW5lSW5zdHIgKkxhc3RJbnNuID0gbnVsbHB0cjsgIC8vIExhc3QgaW5zdHJ1Y3Rpb24gb2YgdGhpcyBzY29wZS4KKyAgY29uc3QgTWFjaGluZUluc3RyICpGaXJzdEluc24gPSBudWxscHRyOyAvLyBGaXJzdCBpbnN0cnVjdGlvbiBvZiB0aGlzIHNjb3BlLgorICB1bnNpZ25lZCBERlNJbiA9IDA7IC8vIEluICYgT3V0IERlcHRoIHVzZSB0byBkZXRlcm1pbmUgc2NvcGUgbmVzdGluZy4KKyAgdW5zaWduZWQgREZTT3V0ID0gMDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gTGV4aWNhbFNjb3BlcyAtICBUaGlzIGNsYXNzIHByb3ZpZGVzIGludGVyZmFjZSB0byBjb2xsZWN0IGFuZCB1c2UgbGV4aWNhbAorLy8vIHNjb3BpbmcgaW5mb3JtYXRpb24gZnJvbSBtYWNoaW5lIGluc3RydWN0aW9uLgorLy8vCitjbGFzcyBMZXhpY2FsU2NvcGVzIHsKK3B1YmxpYzoKKyAgTGV4aWNhbFNjb3BlcygpID0gZGVmYXVsdDsKKworICAvLy8gaW5pdGlhbGl6ZSAtIFNjYW4gbWFjaGluZSBmdW5jdGlvbiBhbmQgY29uc3R1Y3QgbGV4aWNhbCBzY29wZSBuZXN0LCByZXNldHMKKyAgLy8vIHRoZSBpbnN0YW5jZSBpZiBuZWNlc3NhcnkuCisgIHZvaWQgaW5pdGlhbGl6ZShjb25zdCBNYWNoaW5lRnVuY3Rpb24gJik7CisKKyAgLy8vIHJlbGVhc2VNZW1vcnkgLSByZWxlYXNlIG1lbW9yeS4KKyAgdm9pZCByZXNldCgpOworCisgIC8vLyBlbXB0eSAtIFJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGFueSBsZXhpY2FsIHNjb3BlIGluZm9ybWF0aW9uIGF2YWlsYWJsZS4KKyAgYm9vbCBlbXB0eSgpIHsgcmV0dXJuIEN1cnJlbnRGbkxleGljYWxTY29wZSA9PSBudWxscHRyOyB9CisKKyAgLy8vIGdldEN1cnJlbnRGdW5jdGlvblNjb3BlIC0gUmV0dXJuIGxleGljYWwgc2NvcGUgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICBMZXhpY2FsU2NvcGUgKmdldEN1cnJlbnRGdW5jdGlvblNjb3BlKCkgY29uc3QgeworICAgIHJldHVybiBDdXJyZW50Rm5MZXhpY2FsU2NvcGU7CisgIH0KKworICAvLy8gZ2V0TWFjaGluZUJhc2ljQmxvY2tzIC0gUG9wdWxhdGUgZ2l2ZW4gc2V0IHVzaW5nIG1hY2hpbmUgYmFzaWMgYmxvY2tzCisgIC8vLyB3aGljaCBoYXZlIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIHRoYXQgYmVsb25nIHRvIGxleGljYWwgc2NvcGUgaWRlbnRpZmllZCBieQorICAvLy8gRGVidWdMb2MuCisgIHZvaWQgZ2V0TWFjaGluZUJhc2ljQmxvY2tzKGNvbnN0IERJTG9jYXRpb24gKkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldEltcGw8Y29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKj4gJk1CQnMpOworCisgIC8vLyBkb21pbmF0ZXMgLSBSZXR1cm4gdHJ1ZSBpZiBEZWJ1Z0xvYydzIGxleGljYWwgc2NvcGUgZG9taW5hdGVzIGF0IGxlYXN0IG9uZQorICAvLy8gbWFjaGluZSBpbnN0cnVjdGlvbidzIGxleGljYWwgc2NvcGUgaW4gYSBnaXZlbiBtYWNoaW5lIGJhc2ljIGJsb2NrLgorICBib29sIGRvbWluYXRlcyhjb25zdCBESUxvY2F0aW9uICpETCwgTWFjaGluZUJhc2ljQmxvY2sgKk1CQik7CisKKyAgLy8vIGZpbmRMZXhpY2FsU2NvcGUgLSBGaW5kIGxleGljYWwgc2NvcGUsIGVpdGhlciByZWd1bGFyIG9yIGlubGluZWQsIGZvciB0aGUKKyAgLy8vIGdpdmVuIERlYnVnTG9jLiBSZXR1cm4gTlVMTCBpZiBub3QgZm91bmQuCisgIExleGljYWxTY29wZSAqZmluZExleGljYWxTY29wZShjb25zdCBESUxvY2F0aW9uICpETCk7CisKKyAgLy8vIGdldEFic3RyYWN0U2NvcGVzTGlzdCAtIFJldHVybiBhIHJlZmVyZW5jZSB0byBsaXN0IG9mIGFic3RyYWN0IHNjb3Blcy4KKyAgQXJyYXlSZWY8TGV4aWNhbFNjb3BlICo+IGdldEFic3RyYWN0U2NvcGVzTGlzdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQWJzdHJhY3RTY29wZXNMaXN0OworICB9CisKKyAgLy8vIGZpbmRBYnN0cmFjdFNjb3BlIC0gRmluZCBhbiBhYnN0cmFjdCBzY29wZSBvciByZXR1cm4gbnVsbC4KKyAgTGV4aWNhbFNjb3BlICpmaW5kQWJzdHJhY3RTY29wZShjb25zdCBESUxvY2FsU2NvcGUgKk4pIHsKKyAgICBhdXRvIEkgPSBBYnN0cmFjdFNjb3BlTWFwLmZpbmQoTik7CisgICAgcmV0dXJuIEkgIT0gQWJzdHJhY3RTY29wZU1hcC5lbmQoKSA/ICZJLT5zZWNvbmQgOiBudWxscHRyOworICB9CisKKyAgLy8vIGZpbmRJbmxpbmVkU2NvcGUgLSBGaW5kIGFuIGlubGluZWQgc2NvcGUgZm9yIHRoZSBnaXZlbiBzY29wZS9pbmxpbmVkLWF0LgorICBMZXhpY2FsU2NvcGUgKmZpbmRJbmxpbmVkU2NvcGUoY29uc3QgRElMb2NhbFNjb3BlICpOLCBjb25zdCBESUxvY2F0aW9uICpJQSkgeworICAgIGF1dG8gSSA9IElubGluZWRMZXhpY2FsU2NvcGVNYXAuZmluZChzdGQ6Om1ha2VfcGFpcihOLCBJQSkpOworICAgIHJldHVybiBJICE9IElubGluZWRMZXhpY2FsU2NvcGVNYXAuZW5kKCkgPyAmSS0+c2Vjb25kIDogbnVsbHB0cjsKKyAgfQorCisgIC8vLyBmaW5kTGV4aWNhbFNjb3BlIC0gRmluZCByZWd1bGFyIGxleGljYWwgc2NvcGUgb3IgcmV0dXJuIG51bGwuCisgIExleGljYWxTY29wZSAqZmluZExleGljYWxTY29wZShjb25zdCBESUxvY2FsU2NvcGUgKk4pIHsKKyAgICBhdXRvIEkgPSBMZXhpY2FsU2NvcGVNYXAuZmluZChOKTsKKyAgICByZXR1cm4gSSAhPSBMZXhpY2FsU2NvcGVNYXAuZW5kKCkgPyAmSS0+c2Vjb25kIDogbnVsbHB0cjsKKyAgfQorCisgIC8vLyBkdW1wIC0gUHJpbnQgZGF0YSBzdHJ1Y3R1cmVzIHRvIGRiZ3MoKS4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8vIGdldE9yQ3JlYXRlQWJzdHJhY3RTY29wZSAtIEZpbmQgb3IgY3JlYXRlIGFuIGFic3RyYWN0IGxleGljYWwgc2NvcGUuCisgIExleGljYWxTY29wZSAqZ2V0T3JDcmVhdGVBYnN0cmFjdFNjb3BlKGNvbnN0IERJTG9jYWxTY29wZSAqU2NvcGUpOworCitwcml2YXRlOgorICAvLy8gZ2V0T3JDcmVhdGVMZXhpY2FsU2NvcGUgLSBGaW5kIGxleGljYWwgc2NvcGUgZm9yIHRoZSBnaXZlbiBTY29wZS9JQS4gSWYKKyAgLy8vIG5vdCBhdmFpbGFibGUgdGhlbiBjcmVhdGUgbmV3IGxleGljYWwgc2NvcGUuCisgIExleGljYWxTY29wZSAqZ2V0T3JDcmVhdGVMZXhpY2FsU2NvcGUoY29uc3QgRElMb2NhbFNjb3BlICpTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBESUxvY2F0aW9uICpJQSA9IG51bGxwdHIpOworICBMZXhpY2FsU2NvcGUgKmdldE9yQ3JlYXRlTGV4aWNhbFNjb3BlKGNvbnN0IERJTG9jYXRpb24gKkRMKSB7CisgICAgcmV0dXJuIERMID8gZ2V0T3JDcmVhdGVMZXhpY2FsU2NvcGUoREwtPmdldFNjb3BlKCksIERMLT5nZXRJbmxpbmVkQXQoKSkKKyAgICAgICAgICAgICAgOiBudWxscHRyOworICB9CisKKyAgLy8vIGdldE9yQ3JlYXRlUmVndWxhclNjb3BlIC0gRmluZCBvciBjcmVhdGUgYSByZWd1bGFyIGxleGljYWwgc2NvcGUuCisgIExleGljYWxTY29wZSAqZ2V0T3JDcmVhdGVSZWd1bGFyU2NvcGUoY29uc3QgRElMb2NhbFNjb3BlICpTY29wZSk7CisKKyAgLy8vIGdldE9yQ3JlYXRlSW5saW5lZFNjb3BlIC0gRmluZCBvciBjcmVhdGUgYW4gaW5saW5lZCBsZXhpY2FsIHNjb3BlLgorICBMZXhpY2FsU2NvcGUgKmdldE9yQ3JlYXRlSW5saW5lZFNjb3BlKGNvbnN0IERJTG9jYWxTY29wZSAqU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRElMb2NhdGlvbiAqSW5saW5lZEF0KTsKKworICAvLy8gZXh0cmFjdExleGljYWxTY29wZXMgLSBFeHRyYWN0IGluc3RydWN0aW9uIHJhbmdlcyBmb3IgZWFjaCBsZXhpY2FsIHNjb3BlcworICAvLy8gZm9yIHRoZSBnaXZlbiBtYWNoaW5lIGZ1bmN0aW9uLgorICB2b2lkIGV4dHJhY3RMZXhpY2FsU2NvcGVzKFNtYWxsVmVjdG9ySW1wbDxJbnNuUmFuZ2U+ICZNSVJhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxjb25zdCBNYWNoaW5lSW5zdHIgKiwgTGV4aWNhbFNjb3BlICo+ICZNKTsKKyAgdm9pZCBjb25zdHJ1Y3RTY29wZU5lc3QoTGV4aWNhbFNjb3BlICpTY29wZSk7CisgIHZvaWQKKyAgYXNzaWduSW5zdHJ1Y3Rpb25SYW5nZXMoU21hbGxWZWN0b3JJbXBsPEluc25SYW5nZT4gJk1JUmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEZW5zZU1hcDxjb25zdCBNYWNoaW5lSW5zdHIgKiwgTGV4aWNhbFNjb3BlICo+ICZNKTsKKworICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GID0gbnVsbHB0cjsKKworICAvLy8gTGV4aWNhbFNjb3BlTWFwIC0gVHJhY2tzIHRoZSBzY29wZXMgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgIC8vIFVzZSBhbiB1bm9yZGVyZWRfbWFwIHRvIGVuc3VyZSB2YWx1ZSBwb2ludGVyIHZhbGlkaXR5IG92ZXIgaW5zZXJ0aW9uLgorICBzdGQ6OnVub3JkZXJlZF9tYXA8Y29uc3QgRElMb2NhbFNjb3BlICosIExleGljYWxTY29wZT4gTGV4aWNhbFNjb3BlTWFwOworCisgIC8vLyBJbmxpbmVkTGV4aWNhbFNjb3BlTWFwIC0gVHJhY2tzIGlubGluZWQgZnVuY3Rpb24gc2NvcGVzIGluIGN1cnJlbnQKKyAgLy8vIGZ1bmN0aW9uLgorICBzdGQ6OnVub3JkZXJlZF9tYXA8c3RkOjpwYWlyPGNvbnN0IERJTG9jYWxTY29wZSAqLCBjb25zdCBESUxvY2F0aW9uICo+LAorICAgICAgICAgICAgICAgICAgICAgTGV4aWNhbFNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgcGFpcl9oYXNoPGNvbnN0IERJTG9jYWxTY29wZSAqLCBjb25zdCBESUxvY2F0aW9uICo+PgorICAgICAgSW5saW5lZExleGljYWxTY29wZU1hcDsKKworICAvLy8gQWJzdHJhY3RTY29wZU1hcCAtIFRoZXNlIHNjb3BlcyBhcmUgIG5vdCBpbmNsdWRlZCBMZXhpY2FsU2NvcGVNYXAuCisgIC8vIFVzZSBhbiB1bm9yZGVyZWRfbWFwIHRvIGVuc3VyZSB2YWx1ZSBwb2ludGVyIHZhbGlkaXR5IG92ZXIgaW5zZXJ0aW9uLgorICBzdGQ6OnVub3JkZXJlZF9tYXA8Y29uc3QgRElMb2NhbFNjb3BlICosIExleGljYWxTY29wZT4gQWJzdHJhY3RTY29wZU1hcDsKKworICAvLy8gQWJzdHJhY3RTY29wZXNMaXN0IC0gVHJhY2tzIGFic3RyYWN0IHNjb3BlcyBjb25zdHJ1Y3RlZCB3aGlsZSBwcm9jZXNzaW5nCisgIC8vLyBhIGZ1bmN0aW9uLgorICBTbWFsbFZlY3RvcjxMZXhpY2FsU2NvcGUgKiwgND4gQWJzdHJhY3RTY29wZXNMaXN0OworCisgIC8vLyBDdXJyZW50Rm5MZXhpY2FsU2NvcGUgLSBUb3AgbGV2ZWwgc2NvcGUgZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICAvLy8KKyAgTGV4aWNhbFNjb3BlICpDdXJyZW50Rm5MZXhpY2FsU2NvcGUgPSBudWxscHRyOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9MRVhJQ0FMU0NPUEVTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaW5rQWxsQXNtV3JpdGVyQ29tcG9uZW50cy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpbmtBbGxBc21Xcml0ZXJDb21wb25lbnRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMwNDZkYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaW5rQWxsQXNtV3JpdGVyQ29tcG9uZW50cy5oCkBAIC0wLDAgKzEsMzggQEAKKy8vPT09LSBsbHZtL0NvZGVnZW4vTGlua0FsbEFzbVdyaXRlckNvbXBvbmVudHMuaCAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgcHVsbHMgaW4gYWxsIGFzc2VtYmxlciB3cml0ZXIgcmVsYXRlZCBwYXNzZXMgZm9yIHRvb2xzIGxpa2UKKy8vIGxsYyB0aGF0IG5lZWQgdGhpcyBmdW5jdGlvbmFsaXR5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0xJTktBTExBU01XUklURVJDT01QT05FTlRTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0xJTktBTExBU01XUklURVJDT01QT05FTlRTX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HQ3MuaCIKKyNpbmNsdWRlIDxjc3RkbGliPgorCituYW1lc3BhY2UgeworICBzdHJ1Y3QgRm9yY2VBc21Xcml0ZXJMaW5raW5nIHsKKyAgICBGb3JjZUFzbVdyaXRlckxpbmtpbmcoKSB7CisgICAgICAvLyBXZSBtdXN0IHJlZmVyZW5jZSB0aGUgcGx1Zy1pbnMgaW4gc3VjaCBhIHdheSB0aGF0IGNvbXBpbGVycyB3aWxsIG5vdAorICAgICAgLy8gZGVsZXRlIGl0IGFsbCBhcyBkZWFkIGNvZGUsIGV2ZW4gd2l0aCB3aG9sZSBwcm9ncmFtIG9wdGltaXphdGlvbiwKKyAgICAgIC8vIHlldCBpcyBlZmZlY3RpdmVseSBhIE5PLU9QLiBBcyB0aGUgY29tcGlsZXIgaXNuJ3Qgc21hcnQgZW5vdWdoCisgICAgICAvLyB0byBrbm93IHRoYXQgZ2V0ZW52KCkgbmV2ZXIgcmV0dXJucyAtMSwgdGhpcyB3aWxsIGRvIHRoZSBqb2IuCisgICAgICBpZiAoc3RkOjpnZXRlbnYoImJhciIpICE9IChjaGFyKikgLTEpCisgICAgICAgIHJldHVybjsKKworICAgICAgbGx2bTo6bGlua09jYW1sR0NQcmludGVyKCk7CisgICAgICBsbHZtOjpsaW5rRXJsYW5nR0NQcmludGVyKCk7CisKKyAgICB9CisgIH0gRm9yY2VBc21Xcml0ZXJMaW5raW5nOyAvLyBGb3JjZSBsaW5rIGJ5IGNyZWF0aW5nIGEgZ2xvYmFsIGRlZmluaXRpb24uCit9CisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTElOS0FMTEFTTVdSSVRFUkNPTVBPTkVOVFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpbmtBbGxDb2RlZ2VuQ29tcG9uZW50cy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpbmtBbGxDb2RlZ2VuQ29tcG9uZW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZTEzMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGlua0FsbENvZGVnZW5Db21wb25lbnRzLmgKQEAgLTAsMCArMSw1OSBAQAorLy89PT0tIGxsdm0vQ29kZWdlbi9MaW5rQWxsQ29kZWdlbkNvbXBvbmVudHMuaCAtLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBwdWxscyBpbiBhbGwgY29kZWdlbiByZWxhdGVkIHBhc3NlcyBmb3IgdG9vbHMgbGlrZSBsbGkgYW5kCisvLyBsbGMgdGhhdCBuZWVkIHRoaXMgZnVuY3Rpb25hbGl0eS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9MSU5LQUxMQ09ERUdFTkNPTVBPTkVOVFNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTElOS0FMTENPREVHRU5DT01QT05FTlRTX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9HQ3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NjaGVkdWxlclJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgPGNzdGRsaWI+CisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBGb3JjZUNvZGVnZW5MaW5raW5nIHsKKyAgICBGb3JjZUNvZGVnZW5MaW5raW5nKCkgeworICAgICAgLy8gV2UgbXVzdCByZWZlcmVuY2UgdGhlIHBhc3NlcyBpbiBzdWNoIGEgd2F5IHRoYXQgY29tcGlsZXJzIHdpbGwgbm90CisgICAgICAvLyBkZWxldGUgaXQgYWxsIGFzIGRlYWQgY29kZSwgZXZlbiB3aXRoIHdob2xlIHByb2dyYW0gb3B0aW1pemF0aW9uLAorICAgICAgLy8geWV0IGlzIGVmZmVjdGl2ZWx5IGEgTk8tT1AuIEFzIHRoZSBjb21waWxlciBpc24ndCBzbWFydCBlbm91Z2gKKyAgICAgIC8vIHRvIGtub3cgdGhhdCBnZXRlbnYoKSBuZXZlciByZXR1cm5zIC0xLCB0aGlzIHdpbGwgZG8gdGhlIGpvYi4KKyAgICAgIGlmIChzdGQ6OmdldGVudigiYmFyIikgIT0gKGNoYXIqKSAtMSkKKyAgICAgICAgcmV0dXJuOworCisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRmFzdFJlZ2lzdGVyQWxsb2NhdG9yKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlQmFzaWNSZWdpc3RlckFsbG9jYXRvcigpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUdyZWVkeVJlZ2lzdGVyQWxsb2NhdG9yKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRGVmYXVsdFBCUVBSZWdpc3RlckFsbG9jYXRvcigpOworCisgICAgICBsbHZtOjpsaW5rQ29yZUNMUkdDKCk7CisgICAgICBsbHZtOjpsaW5rT2NhbWxHQygpOworICAgICAgbGx2bTo6bGlua0VybGFuZ0dDKCk7CisgICAgICBsbHZtOjpsaW5rU2hhZG93U3RhY2tHQygpOworICAgICAgbGx2bTo6bGlua1N0YXRlcG9pbnRFeGFtcGxlR0MoKTsKKworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUJVUlJMaXN0REFHU2NoZWR1bGVyKG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6Q29kZUdlbk9wdDo6RGVmYXVsdCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlU291cmNlTGlzdERBR1NjaGVkdWxlcihudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6Q29kZUdlbk9wdDo6RGVmYXVsdCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlSHlicmlkTGlzdERBR1NjaGVkdWxlcihudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6Q29kZUdlbk9wdDo6RGVmYXVsdCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRmFzdERBR1NjaGVkdWxlcihudWxscHRyLCBsbHZtOjpDb2RlR2VuT3B0OjpEZWZhdWx0KTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVEZWZhdWx0U2NoZWR1bGVyKG51bGxwdHIsIGxsdm06OkNvZGVHZW5PcHQ6OkRlZmF1bHQpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVZMSVdEQUdTY2hlZHVsZXIobnVsbHB0ciwgbGx2bTo6Q29kZUdlbk9wdDo6RGVmYXVsdCk7CisKKyAgICB9CisgIH0gRm9yY2VDb2RlZ2VuTGlua2luZzsgLy8gRm9yY2UgbGluayBieSBjcmVhdGluZyBhIGdsb2JhbCBkZWZpbml0aW9uLgorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGZhODcyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVJbnRlcnZhbC5oCkBAIC0wLDAgKzEsOTQzIEBACisvLz09PS0gbGx2bS9Db2RlR2VuL0xpdmVJbnRlcnZhbC5oIC0gSW50ZXJ2YWwgcmVwcmVzZW50YXRpb24gLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBMaXZlUmFuZ2UgYW5kIExpdmVJbnRlcnZhbCBjbGFzc2VzLiAgR2l2ZW4gc29tZQorLy8gbnVtYmVyaW5nIG9mIGVhY2ggdGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIGFuIGludGVydmFsIFtpLCBqKSBpcyBzYWlkIHRvIGJlIGEKKy8vIGxpdmUgcmFuZ2UgZm9yIHJlZ2lzdGVyIHYgaWYgdGhlcmUgaXMgbm8gaW5zdHJ1Y3Rpb24gd2l0aCBudW1iZXIgaicgPj0gagorLy8gc3VjaCB0aGF0IHYgaXMgbGl2ZSBhdCBqJyBhbmQgdGhlcmUgaXMgbm8gaW5zdHJ1Y3Rpb24gd2l0aCBudW1iZXIgaScgPCBpIHN1Y2gKKy8vIHRoYXQgdiBpcyBsaXZlIGF0IGknLiBJbiB0aGlzIGltcGxlbWVudGF0aW9uIHJhbmdlcyBjYW4gaGF2ZSBob2xlcywKKy8vIGkuZS4gYSByYW5nZSBtaWdodCBsb29rIGxpa2UgWzEsMjApLCBbNTAsNjUpLCBbMTAwMCwxMDAxKS4gIEVhY2gKKy8vIGluZGl2aWR1YWwgc2VnbWVudCBpcyByZXByZXNlbnRlZCBhcyBhbiBpbnN0YW5jZSBvZiBMaXZlUmFuZ2U6OlNlZ21lbnQsCisvLyBhbmQgdGhlIHdob2xlIHJhbmdlIGlzIHJlcHJlc2VudGVkIGFzIGFuIGluc3RhbmNlIG9mIExpdmVSYW5nZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9MSVZFSU5URVJWQUxfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTElWRUlOVEVSVkFMX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSW50RXFDbGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TbG90SW5kZXhlcy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTGFuZUJpdG1hc2suaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgY2xhc3MgQ29hbGVzY2VyUGFpcjsKKyAgY2xhc3MgTGl2ZUludGVydmFsczsKKyAgY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKKyAgY2xhc3MgcmF3X29zdHJlYW07CisKKyAgLy8vIFZOSW5mbyAtIFZhbHVlIE51bWJlciBJbmZvcm1hdGlvbi4KKyAgLy8vIFRoaXMgY2xhc3MgaG9sZHMgaW5mb3JtYXRpb24gYWJvdXQgYSBtYWNoaW5lIGxldmVsIHZhbHVlcywgaW5jbHVkaW5nCisgIC8vLyBkZWZpbml0aW9uIGFuZCB1c2UgcG9pbnRzLgorICAvLy8KKyAgY2xhc3MgVk5JbmZvIHsKKyAgcHVibGljOgorICAgIHVzaW5nIEFsbG9jYXRvciA9IEJ1bXBQdHJBbGxvY2F0b3I7CisKKyAgICAvLy8gVGhlIElEIG51bWJlciBvZiB0aGlzIHZhbHVlLgorICAgIHVuc2lnbmVkIGlkOworCisgICAgLy8vIFRoZSBpbmRleCBvZiB0aGUgZGVmaW5pbmcgaW5zdHJ1Y3Rpb24uCisgICAgU2xvdEluZGV4IGRlZjsKKworICAgIC8vLyBWTkluZm8gY29uc3RydWN0b3IuCisgICAgVk5JbmZvKHVuc2lnbmVkIGksIFNsb3RJbmRleCBkKSA6IGlkKGkpLCBkZWYoZCkge30KKworICAgIC8vLyBWTkluZm8gY29uc3RydWN0b3IsIGNvcGllcyB2YWx1ZXMgZnJvbSBvcmlnLCBleGNlcHQgZm9yIHRoZSB2YWx1ZSBudW1iZXIuCisgICAgVk5JbmZvKHVuc2lnbmVkIGksIGNvbnN0IFZOSW5mbyAmb3JpZykgOiBpZChpKSwgZGVmKG9yaWcuZGVmKSB7fQorCisgICAgLy8vIENvcHkgZnJvbSB0aGUgcGFyYW1ldGVyIGludG8gdGhpcyBWTkluZm8uCisgICAgdm9pZCBjb3B5RnJvbShWTkluZm8gJnNyYykgeworICAgICAgZGVmID0gc3JjLmRlZjsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgaXMgZGVmaW5lZCBieSBhIFBISSBpbnN0cnVjdGlvbiAob3Igd2FzLAorICAgIC8vLyBQSEkgaW5zdHJ1Y3Rpb25zIG1heSBoYXZlIGJlZW4gZWxpbWluYXRlZCkuCisgICAgLy8vIFBISS1kZWZzIGJlZ2luIGF0IGEgYmxvY2sgYm91bmRhcnksIGFsbCBvdGhlciBkZWZzIGJlZ2luIGF0IHJlZ2lzdGVyIG9yCisgICAgLy8vIEVDIHNsb3RzLgorICAgIGJvb2wgaXNQSElEZWYoKSBjb25zdCB7IHJldHVybiBkZWYuaXNCbG9jaygpOyB9CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUgaXMgdW51c2VkLgorICAgIGJvb2wgaXNVbnVzZWQoKSBjb25zdCB7IHJldHVybiAhZGVmLmlzVmFsaWQoKTsgfQorCisgICAgLy8vIE1hcmsgdGhpcyB2YWx1ZSBhcyB1bnVzZWQuCisgICAgdm9pZCBtYXJrVW51c2VkKCkgeyBkZWYgPSBTbG90SW5kZXgoKTsgfQorICB9OworCisgIC8vLyBSZXN1bHQgb2YgYSBMaXZlUmFuZ2UgcXVlcnkuIFRoaXMgY2xhc3MgaGlkZXMgdGhlIGltcGxlbWVudGF0aW9uIGRldGFpbHMKKyAgLy8vIG9mIGxpdmUgcmFuZ2VzLCBhbmQgaXQgc2hvdWxkIGJlIHVzZWQgYXMgdGhlIHByaW1hcnkgaW50ZXJmYWNlIGZvcgorICAvLy8gZXhhbWluaW5nIGxpdmUgcmFuZ2VzIGFyb3VuZCBpbnN0cnVjdGlvbnMuCisgIGNsYXNzIExpdmVRdWVyeVJlc3VsdCB7CisgICAgVk5JbmZvICpjb25zdCBFYXJseVZhbDsKKyAgICBWTkluZm8gKmNvbnN0IExhdGVWYWw7CisgICAgY29uc3QgU2xvdEluZGV4IEVuZFBvaW50OworICAgIGNvbnN0IGJvb2wgS2lsbDsKKworICBwdWJsaWM6CisgICAgTGl2ZVF1ZXJ5UmVzdWx0KFZOSW5mbyAqRWFybHlWYWwsIFZOSW5mbyAqTGF0ZVZhbCwgU2xvdEluZGV4IEVuZFBvaW50LAorICAgICAgICAgICAgICAgICAgICBib29sIEtpbGwpCisgICAgICA6IEVhcmx5VmFsKEVhcmx5VmFsKSwgTGF0ZVZhbChMYXRlVmFsKSwgRW5kUG9pbnQoRW5kUG9pbnQpLCBLaWxsKEtpbGwpCisgICAge30KKworICAgIC8vLyBSZXR1cm4gdGhlIHZhbHVlIHRoYXQgaXMgbGl2ZS1pbiB0byB0aGUgaW5zdHJ1Y3Rpb24uIFRoaXMgaXMgdGhlIHZhbHVlCisgICAgLy8vIHRoYXQgd2lsbCBiZSByZWFkIGJ5IHRoZSBpbnN0cnVjdGlvbidzIHVzZSBvcGVyYW5kcy4gUmV0dXJuIE5VTEwgaWYgbm8KKyAgICAvLy8gdmFsdWUgaXMgbGl2ZS1pbi4KKyAgICBWTkluZm8gKnZhbHVlSW4oKSBjb25zdCB7CisgICAgICByZXR1cm4gRWFybHlWYWw7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBsaXZlLWluIHZhbHVlIGlzIGtpbGxlZCBieSB0aGlzIGluc3RydWN0aW9uLiBUaGlzCisgICAgLy8vIG1lYW5zIHRoYXQgZWl0aGVyIHRoZSBsaXZlIHJhbmdlIGVuZHMgYXQgdGhlIGluc3RydWN0aW9uLCBvciBpdCBjaGFuZ2VzCisgICAgLy8vIHZhbHVlLgorICAgIGJvb2wgaXNLaWxsKCkgY29uc3QgeworICAgICAgcmV0dXJuIEtpbGw7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaGFzIGEgZGVhZCBkZWYuCisgICAgYm9vbCBpc0RlYWREZWYoKSBjb25zdCB7CisgICAgICByZXR1cm4gRW5kUG9pbnQuaXNEZWFkKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0aGUgdmFsdWUgbGVhdmluZyB0aGUgaW5zdHJ1Y3Rpb24sIGlmIGFueS4gVGhpcyBjYW4gYmUgYQorICAgIC8vLyBsaXZlLXRocm91Z2ggdmFsdWUsIG9yIGEgbGl2ZSBkZWYuIEEgZGVhZCBkZWYgcmV0dXJucyBOVUxMLgorICAgIFZOSW5mbyAqdmFsdWVPdXQoKSBjb25zdCB7CisgICAgICByZXR1cm4gaXNEZWFkRGVmKCkgPyBudWxscHRyIDogTGF0ZVZhbDsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgdmFsdWUgYWxpdmUgYXQgdGhlIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24sIGlmIGFueS4gVGhpcyBjYW4KKyAgICAvLy8gYmUgYSBsaXZlLXRocm91Z2ggdmFsdWUsIGEgbGl2ZSBkZWYgb3IgYSBkZWFkIGRlZi4KKyAgICBWTkluZm8gKnZhbHVlT3V0T3JEZWFkKCkgY29uc3QgeworICAgICAgcmV0dXJuIExhdGVWYWw7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0aGUgdmFsdWUgZGVmaW5lZCBieSB0aGlzIGluc3RydWN0aW9uLCBpZiBhbnkuIFRoaXMgaW5jbHVkZXMKKyAgICAvLy8gZGVhZCBkZWZzLCBpdCBpcyB0aGUgdmFsdWUgY3JlYXRlZCBieSB0aGUgaW5zdHJ1Y3Rpb24ncyBkZWYgb3BlcmFuZHMuCisgICAgVk5JbmZvICp2YWx1ZURlZmluZWQoKSBjb25zdCB7CisgICAgICByZXR1cm4gRWFybHlWYWwgPT0gTGF0ZVZhbCA/IG51bGxwdHIgOiBMYXRlVmFsOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdGhlIGVuZCBwb2ludCBvZiB0aGUgbGFzdCBsaXZlIHJhbmdlIHNlZ21lbnQgdG8gaW50ZXJhY3Qgd2l0aAorICAgIC8vLyB0aGUgaW5zdHJ1Y3Rpb24sIGlmIGFueS4KKyAgICAvLy8KKyAgICAvLy8gVGhlIGVuZCBwb2ludCBpcyBhbiBpbnZhbGlkIFNsb3RJbmRleCBvbmx5IGlmIHRoZSBsaXZlIHJhbmdlIGRvZXNuJ3QKKyAgICAvLy8gaW50ZXJzZWN0IHRoZSBpbnN0cnVjdGlvbiBhdCBhbGwuCisgICAgLy8vCisgICAgLy8vIFRoZSBlbmQgcG9pbnQgbWF5IGJlIGF0IG9yIHBhc3QgdGhlIGVuZCBvZiB0aGUgaW5zdHJ1Y3Rpb24ncyBiYXNpYworICAgIC8vLyBibG9jay4gVGhhdCBtZWFucyB0aGUgdmFsdWUgd2FzIGxpdmUgb3V0IG9mIHRoZSBibG9jay4KKyAgICBTbG90SW5kZXggZW5kUG9pbnQoKSBjb25zdCB7CisgICAgICByZXR1cm4gRW5kUG9pbnQ7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGxpdmVuZXNzIG9mIGEgcmVnaXN0ZXIsIHN0YWNrIHNsb3QsIGV0Yy4KKyAgLy8vIEl0IG1hbmFnZXMgYW4gb3JkZXJlZCBsaXN0IG9mIFNlZ21lbnQgb2JqZWN0cy4KKyAgLy8vIFRoZSBTZWdtZW50cyBhcmUgb3JnYW5pemVkIGluIGEgc3RhdGljIHNpbmdsZSBhc3NpZ25tZW50IGZvcm06IEF0IHBsYWNlcworICAvLy8gd2hlcmUgYSBuZXcgdmFsdWUgaXMgZGVmaW5lZCBvciBkaWZmZXJlbnQgdmFsdWVzIHJlYWNoIGEgQ0ZHIGpvaW4gYSBuZXcKKyAgLy8vIHNlZ21lbnQgd2l0aCBhIG5ldyB2YWx1ZSBudW1iZXIgaXMgdXNlZC4KKyAgY2xhc3MgTGl2ZVJhbmdlIHsKKyAgcHVibGljOgorICAgIC8vLyBUaGlzIHJlcHJlc2VudHMgYSBzaW1wbGUgY29udGludW91cyBsaXZlbmVzcyBpbnRlcnZhbCBmb3IgYSB2YWx1ZS4KKyAgICAvLy8gVGhlIHN0YXJ0IHBvaW50IGlzIGluY2x1c2l2ZSwgdGhlIGVuZCBwb2ludCBleGNsdXNpdmUuIFRoZXNlIGludGVydmFscworICAgIC8vLyBhcmUgcmVuZGVyZWQgYXMgW3N0YXJ0LGVuZCkuCisgICAgc3RydWN0IFNlZ21lbnQgeworICAgICAgU2xvdEluZGV4IHN0YXJ0OyAgLy8gU3RhcnQgcG9pbnQgb2YgdGhlIGludGVydmFsIChpbmNsdXNpdmUpCisgICAgICBTbG90SW5kZXggZW5kOyAgICAvLyBFbmQgcG9pbnQgb2YgdGhlIGludGVydmFsIChleGNsdXNpdmUpCisgICAgICBWTkluZm8gKnZhbG5vID0gbnVsbHB0cjsgLy8gaWRlbnRpZmllciBmb3IgdGhlIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGlzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2VnbWVudC4KKworICAgICAgU2VnbWVudCgpID0gZGVmYXVsdDsKKworICAgICAgU2VnbWVudChTbG90SW5kZXggUywgU2xvdEluZGV4IEUsIFZOSW5mbyAqVikKKyAgICAgICAgOiBzdGFydChTKSwgZW5kKEUpLCB2YWxubyhWKSB7CisgICAgICAgIGFzc2VydChTIDwgRSAmJiAiQ2Fubm90IGNyZWF0ZSBlbXB0eSBvciBiYWNrd2FyZHMgc2VnbWVudCIpOworICAgICAgfQorCisgICAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGluZGV4IGlzIGNvdmVyZWQgYnkgdGhpcyBzZWdtZW50LgorICAgICAgYm9vbCBjb250YWlucyhTbG90SW5kZXggSSkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhcnQgPD0gSSAmJiBJIDwgZW5kOworICAgICAgfQorCisgICAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGludGVydmFsLCBbUywgRSksIGlzIGNvdmVyZWQgYnkgdGhpcyBzZWdtZW50LgorICAgICAgYm9vbCBjb250YWluc0ludGVydmFsKFNsb3RJbmRleCBTLCBTbG90SW5kZXggRSkgY29uc3QgeworICAgICAgICBhc3NlcnQoKFMgPCBFKSAmJiAiQmFja3dhcmRzIGludGVydmFsPyIpOworICAgICAgICByZXR1cm4gKHN0YXJ0IDw9IFMgJiYgUyA8IGVuZCkgJiYgKHN0YXJ0IDwgRSAmJiBFIDw9IGVuZCk7CisgICAgICB9CisKKyAgICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFNlZ21lbnQgJk90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGQ6OnRpZShzdGFydCwgZW5kKSA8IHN0ZDo6dGllKE90aGVyLnN0YXJ0LCBPdGhlci5lbmQpOworICAgICAgfQorICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNlZ21lbnQgJk90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGFydCA9PSBPdGhlci5zdGFydCAmJiBlbmQgPT0gT3RoZXIuZW5kOworICAgICAgfQorCisgICAgICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgICB9OworCisgICAgdXNpbmcgU2VnbWVudHMgPSBTbWFsbFZlY3RvcjxTZWdtZW50LCAyPjsKKyAgICB1c2luZyBWTkluZm9MaXN0ID0gU21hbGxWZWN0b3I8Vk5JbmZvICosIDI+OworCisgICAgU2VnbWVudHMgc2VnbWVudHM7ICAgLy8gdGhlIGxpdmVuZXNzIHNlZ21lbnRzCisgICAgVk5JbmZvTGlzdCB2YWxub3M7ICAgLy8gdmFsdWUjJ3MKKworICAgIC8vIFRoZSBzZWdtZW50IHNldCBpcyB1c2VkIHRlbXBvcmFyaWx5IHRvIGFjY2VsZXJhdGUgaW5pdGlhbCBjb21wdXRhdGlvbgorICAgIC8vIG9mIGxpdmUgcmFuZ2VzIG9mIHBoeXNpY2FsIHJlZ2lzdGVycyBpbiBjb21wdXRlUmVnVW5pdFJhbmdlLgorICAgIC8vIEFmdGVyIHRoYXQgdGhlIHNldCBpcyBmbHVzaGVkIHRvIHRoZSBzZWdtZW50IHZlY3RvciBhbmQgZGVsZXRlZC4KKyAgICB1c2luZyBTZWdtZW50U2V0ID0gc3RkOjpzZXQ8U2VnbWVudD47CisgICAgc3RkOjp1bmlxdWVfcHRyPFNlZ21lbnRTZXQ+IHNlZ21lbnRTZXQ7CisKKyAgICB1c2luZyBpdGVyYXRvciA9IFNlZ21lbnRzOjppdGVyYXRvcjsKKyAgICB1c2luZyBjb25zdF9pdGVyYXRvciA9IFNlZ21lbnRzOjpjb25zdF9pdGVyYXRvcjsKKworICAgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gc2VnbWVudHMuYmVnaW4oKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpICAgeyByZXR1cm4gc2VnbWVudHMuZW5kKCk7IH0KKworICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gc2VnbWVudHMuYmVnaW4oKTsgfQorICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0ICB7IHJldHVybiBzZWdtZW50cy5lbmQoKTsgfQorCisgICAgdXNpbmcgdm5pX2l0ZXJhdG9yID0gVk5JbmZvTGlzdDo6aXRlcmF0b3I7CisgICAgdXNpbmcgY29uc3Rfdm5pX2l0ZXJhdG9yID0gVk5JbmZvTGlzdDo6Y29uc3RfaXRlcmF0b3I7CisKKyAgICB2bmlfaXRlcmF0b3Igdm5pX2JlZ2luKCkgeyByZXR1cm4gdmFsbm9zLmJlZ2luKCk7IH0KKyAgICB2bmlfaXRlcmF0b3Igdm5pX2VuZCgpICAgeyByZXR1cm4gdmFsbm9zLmVuZCgpOyB9CisKKyAgICBjb25zdF92bmlfaXRlcmF0b3Igdm5pX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gdmFsbm9zLmJlZ2luKCk7IH0KKyAgICBjb25zdF92bmlfaXRlcmF0b3Igdm5pX2VuZCgpIGNvbnN0ICAgeyByZXR1cm4gdmFsbm9zLmVuZCgpOyB9CisKKyAgICAvLy8gQ29uc3RydWN0cyBhIG5ldyBMaXZlUmFuZ2Ugb2JqZWN0LgorICAgIExpdmVSYW5nZShib29sIFVzZVNlZ21lbnRTZXQgPSBmYWxzZSkKKyAgICAgICAgOiBzZWdtZW50U2V0KFVzZVNlZ21lbnRTZXQgPyBsbHZtOjptYWtlX3VuaXF1ZTxTZWdtZW50U2V0PigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cikge30KKworICAgIC8vLyBDb25zdHJ1Y3RzIGEgbmV3IExpdmVSYW5nZSBvYmplY3QgYnkgY29weWluZyBzZWdtZW50cyBhbmQgdmFsbm9zIGZyb20KKyAgICAvLy8gYW5vdGhlciBMaXZlUmFuZ2UuCisgICAgTGl2ZVJhbmdlKGNvbnN0IExpdmVSYW5nZSAmT3RoZXIsIEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvcikgeworICAgICAgYXNzZXJ0KE90aGVyLnNlZ21lbnRTZXQgPT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgICJDb3B5aW5nIG9mIExpdmVSYW5nZXMgd2l0aCBhY3RpdmUgU2VnbWVudFNldHMgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgYXNzaWduKE90aGVyLCBBbGxvY2F0b3IpOworICAgIH0KKworICAgIC8vLyBDb3BpZXMgdmFsdWVzIG51bWJlcnMgYW5kIGxpdmUgc2VnbWVudHMgZnJvbSBccCBPdGhlciBpbnRvIHRoaXMgcmFuZ2UuCisgICAgdm9pZCBhc3NpZ24oY29uc3QgTGl2ZVJhbmdlICZPdGhlciwgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yKSB7CisgICAgICBpZiAodGhpcyA9PSAmT3RoZXIpCisgICAgICAgIHJldHVybjsKKworICAgICAgYXNzZXJ0KE90aGVyLnNlZ21lbnRTZXQgPT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgICJDb3B5aW5nIG9mIExpdmVSYW5nZXMgd2l0aCBhY3RpdmUgU2VnbWVudFNldHMgaXMgbm90IHN1cHBvcnRlZCIpOworICAgICAgLy8gRHVwbGljYXRlIHZhbG5vcy4KKyAgICAgIGZvciAoY29uc3QgVk5JbmZvICpWTkkgOiBPdGhlci52YWxub3MpCisgICAgICAgIGNyZWF0ZVZhbHVlQ29weShWTkksIEFsbG9jYXRvcik7CisgICAgICAvLyBOb3cgd2UgY2FuIGNvcHkgc2VnbWVudHMgYW5kIHJlbWFwIHRoZWlyIHZhbG5vcy4KKyAgICAgIGZvciAoY29uc3QgU2VnbWVudCAmUyA6IE90aGVyLnNlZ21lbnRzKQorICAgICAgICBzZWdtZW50cy5wdXNoX2JhY2soU2VnbWVudChTLnN0YXJ0LCBTLmVuZCwgdmFsbm9zW1MudmFsbm8tPmlkXSkpOworICAgIH0KKworICAgIC8vLyBhZHZhbmNlVG8gLSBBZHZhbmNlIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgdG8gcG9pbnQgdG8gdGhlIFNlZ21lbnQKKyAgICAvLy8gY29udGFpbmluZyB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLCBvciBlbmQoKSBpZiB0aGUgcG9zaXRpb24gaXMgcGFzdCB0aGUKKyAgICAvLy8gZW5kIG9mIHRoZSByYW5nZS4gIElmIG5vIFNlZ21lbnQgY29udGFpbnMgdGhpcyBwb3NpdGlvbiwgYnV0IHRoZQorICAgIC8vLyBwb3NpdGlvbiBpcyBpbiBhIGhvbGUsIHRoaXMgbWV0aG9kIHJldHVybnMgYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlCisgICAgLy8vIFNlZ21lbnQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGhvbGUuCisgICAgaXRlcmF0b3IgYWR2YW5jZVRvKGl0ZXJhdG9yIEksIFNsb3RJbmRleCBQb3MpIHsKKyAgICAgIGFzc2VydChJICE9IGVuZCgpKTsKKyAgICAgIGlmIChQb3MgPj0gZW5kSW5kZXgoKSkKKyAgICAgICAgcmV0dXJuIGVuZCgpOworICAgICAgd2hpbGUgKEktPmVuZCA8PSBQb3MpICsrSTsKKyAgICAgIHJldHVybiBJOworICAgIH0KKworICAgIGNvbnN0X2l0ZXJhdG9yIGFkdmFuY2VUbyhjb25zdF9pdGVyYXRvciBJLCBTbG90SW5kZXggUG9zKSBjb25zdCB7CisgICAgICBhc3NlcnQoSSAhPSBlbmQoKSk7CisgICAgICBpZiAoUG9zID49IGVuZEluZGV4KCkpCisgICAgICAgIHJldHVybiBlbmQoKTsKKyAgICAgIHdoaWxlIChJLT5lbmQgPD0gUG9zKSArK0k7CisgICAgICByZXR1cm4gSTsKKyAgICB9CisKKyAgICAvLy8gZmluZCAtIFJldHVybiBhbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZmlyc3Qgc2VnbWVudCB0aGF0IGVuZHMgYWZ0ZXIKKyAgICAvLy8gUG9zLCBvciBlbmQoKS4gVGhpcyBpcyB0aGUgc2FtZSBhcyBhZHZhbmNlVG8oYmVnaW4oKSwgUG9zKSwgYnV0IGZhc3RlcgorICAgIC8vLyB3aGVuIHNlYXJjaGluZyBsYXJnZSByYW5nZXMuCisgICAgLy8vCisgICAgLy8vIElmIFBvcyBpcyBjb250YWluZWQgaW4gYSBTZWdtZW50LCB0aGF0IHNlZ21lbnQgaXMgcmV0dXJuZWQuCisgICAgLy8vIElmIFBvcyBpcyBpbiBhIGhvbGUsIHRoZSBmb2xsb3dpbmcgU2VnbWVudCBpcyByZXR1cm5lZC4KKyAgICAvLy8gSWYgUG9zIGlzIGJleW9uZCBlbmRJbmRleCwgZW5kKCkgaXMgcmV0dXJuZWQuCisgICAgaXRlcmF0b3IgZmluZChTbG90SW5kZXggUG9zKTsKKworICAgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoU2xvdEluZGV4IFBvcykgY29uc3QgeworICAgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TGl2ZVJhbmdlKj4odGhpcyktPmZpbmQoUG9zKTsKKyAgICB9CisKKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgdmFsbm9zLmNsZWFyKCk7CisgICAgICBzZWdtZW50cy5jbGVhcigpOworICAgIH0KKworICAgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgICAgcmV0dXJuIHNlZ21lbnRzLnNpemUoKTsKKyAgICB9CisKKyAgICBib29sIGhhc0F0TGVhc3RPbmVWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuICF2YWxub3MuZW1wdHkoKTsgfQorCisgICAgYm9vbCBjb250YWluc09uZVZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsbm9zLnNpemUoKSA9PSAxOyB9CisKKyAgICB1bnNpZ25lZCBnZXROdW1WYWxOdW1zKCkgY29uc3QgeyByZXR1cm4gKHVuc2lnbmVkKXZhbG5vcy5zaXplKCk7IH0KKworICAgIC8vLyBnZXRWYWxOdW1JbmZvIC0gUmV0dXJucyBwb2ludGVyIHRvIHRoZSBzcGVjaWZpZWQgdmFsIy4KKyAgICAvLy8KKyAgICBpbmxpbmUgVk5JbmZvICpnZXRWYWxOdW1JbmZvKHVuc2lnbmVkIFZhbE5vKSB7CisgICAgICByZXR1cm4gdmFsbm9zW1ZhbE5vXTsKKyAgICB9CisgICAgaW5saW5lIGNvbnN0IFZOSW5mbyAqZ2V0VmFsTnVtSW5mbyh1bnNpZ25lZCBWYWxObykgY29uc3QgeworICAgICAgcmV0dXJuIHZhbG5vc1tWYWxOb107CisgICAgfQorCisgICAgLy8vIGNvbnRhaW5zVmFsdWUgLSBSZXR1cm5zIHRydWUgaWYgVk5JIGJlbG9uZ3MgdG8gdGhpcyByYW5nZS4KKyAgICBib29sIGNvbnRhaW5zVmFsdWUoY29uc3QgVk5JbmZvICpWTkkpIGNvbnN0IHsKKyAgICAgIHJldHVybiBWTkkgJiYgVk5JLT5pZCA8IGdldE51bVZhbE51bXMoKSAmJiBWTkkgPT0gZ2V0VmFsTnVtSW5mbyhWTkktPmlkKTsKKyAgICB9CisKKyAgICAvLy8gZ2V0TmV4dFZhbHVlIC0gQ3JlYXRlIGEgbmV3IHZhbHVlIG51bWJlciBhbmQgcmV0dXJuIGl0LiAgTUlJZHggc3BlY2lmaWVzCisgICAgLy8vIHRoZSBpbnN0cnVjdGlvbiB0aGF0IGRlZmluZXMgdGhlIHZhbHVlIG51bWJlci4KKyAgICBWTkluZm8gKmdldE5leHRWYWx1ZShTbG90SW5kZXggZGVmLCBWTkluZm86OkFsbG9jYXRvciAmVk5JbmZvQWxsb2NhdG9yKSB7CisgICAgICBWTkluZm8gKlZOSSA9CisgICAgICAgIG5ldyAoVk5JbmZvQWxsb2NhdG9yKSBWTkluZm8oKHVuc2lnbmVkKXZhbG5vcy5zaXplKCksIGRlZik7CisgICAgICB2YWxub3MucHVzaF9iYWNrKFZOSSk7CisgICAgICByZXR1cm4gVk5JOworICAgIH0KKworICAgIC8vLyBjcmVhdGVEZWFkRGVmIC0gTWFrZSBzdXJlIHRoZSByYW5nZSBoYXMgYSB2YWx1ZSBkZWZpbmVkIGF0IERlZi4KKyAgICAvLy8gSWYgb25lIGFscmVhZHkgZXhpc3RzLCByZXR1cm4gaXQuIE90aGVyd2lzZSBhbGxvY2F0ZSBhIG5ldyB2YWx1ZSBhbmQKKyAgICAvLy8gYWRkIGxpdmVuZXNzIGZvciBhIGRlYWQgZGVmLgorICAgIFZOSW5mbyAqY3JlYXRlRGVhZERlZihTbG90SW5kZXggRGVmLCBWTkluZm86OkFsbG9jYXRvciAmVk5JbmZvQWxsb2NhdG9yKTsKKworICAgIC8vLyBDcmVhdGUgYSBkZWYgb2YgdmFsdWUgQHAgVk5JLiBSZXR1cm4gQHAgVk5JLiBJZiB0aGVyZSBhbHJlYWR5IGV4aXN0cworICAgIC8vLyBhIGRlZmluaXRpb24gYXQgVk5JLT5kZWYsIHRoZSB2YWx1ZSBkZWZpbmVkIHRoZXJlIG11c3QgYmUgQHAgVk5JLgorICAgIFZOSW5mbyAqY3JlYXRlRGVhZERlZihWTkluZm8gKlZOSSk7CisKKyAgICAvLy8gQ3JlYXRlIGEgY29weSBvZiB0aGUgZ2l2ZW4gdmFsdWUuIFRoZSBuZXcgdmFsdWUgd2lsbCBiZSBpZGVudGljYWwgZXhjZXB0CisgICAgLy8vIGZvciB0aGUgVmFsdWUgbnVtYmVyLgorICAgIFZOSW5mbyAqY3JlYXRlVmFsdWVDb3B5KGNvbnN0IFZOSW5mbyAqb3JpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWTkluZm86OkFsbG9jYXRvciAmVk5JbmZvQWxsb2NhdG9yKSB7CisgICAgICBWTkluZm8gKlZOSSA9CisgICAgICAgIG5ldyAoVk5JbmZvQWxsb2NhdG9yKSBWTkluZm8oKHVuc2lnbmVkKXZhbG5vcy5zaXplKCksICpvcmlnKTsKKyAgICAgIHZhbG5vcy5wdXNoX2JhY2soVk5JKTsKKyAgICAgIHJldHVybiBWTkk7CisgICAgfQorCisgICAgLy8vIFJlbnVtYmVyVmFsdWVzIC0gUmVudW1iZXIgYWxsIHZhbHVlcyBpbiBvcmRlciBvZiBhcHBlYXJhbmNlIGFuZCByZW1vdmUKKyAgICAvLy8gdW51c2VkIHZhbHVlcy4KKyAgICB2b2lkIFJlbnVtYmVyVmFsdWVzKCk7CisKKyAgICAvLy8gTWVyZ2VWYWx1ZU51bWJlckludG8gLSBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0d28gdmFsdWUgbnVtYmVycworICAgIC8vLyBhcmUgZm91bmQgdG8gYmUgZXF1aXZhbGVudC4gIFRoaXMgZWxpbWluYXRlcyBWMSwgcmVwbGFjaW5nIGFsbAorICAgIC8vLyBzZWdtZW50cyB3aXRoIHRoZSBWMSB2YWx1ZSBudW1iZXIgd2l0aCB0aGUgVjIgdmFsdWUgbnVtYmVyLiAgVGhpcyBjYW4KKyAgICAvLy8gY2F1c2UgbWVyZ2luZyBvZiBWMS9WMiB2YWx1ZXMgbnVtYmVycyBhbmQgY29tcGFjdGlvbiBvZiB0aGUgdmFsdWUgc3BhY2UuCisgICAgVk5JbmZvKiBNZXJnZVZhbHVlTnVtYmVySW50byhWTkluZm8gKlYxLCBWTkluZm8gKlYyKTsKKworICAgIC8vLyBNZXJnZSBhbGwgb2YgdGhlIGxpdmUgc2VnbWVudHMgb2YgYSBzcGVjaWZpYyB2YWwjIGluIFJIUyBpbnRvIHRoaXMgbGl2ZQorICAgIC8vLyByYW5nZSBhcyB0aGUgc3BlY2lmaWVkIHZhbHVlIG51bWJlci4gVGhlIHNlZ21lbnRzIGluIFJIUyBhcmUgYWxsb3dlZAorICAgIC8vLyB0byBvdmVybGFwIHdpdGggc2VnbWVudHMgaW4gdGhlIGN1cnJlbnQgcmFuZ2UsIGl0IHdpbGwgcmVwbGFjZSB0aGUKKyAgICAvLy8gdmFsdWUgbnVtYmVycyBvZiB0aGUgb3ZlcmxhcGVkIGxpdmUgc2VnbWVudHMgd2l0aCB0aGUgc3BlY2lmaWVkIHZhbHVlCisgICAgLy8vIG51bWJlci4KKyAgICB2b2lkIE1lcmdlU2VnbWVudHNJbkFzVmFsdWUoY29uc3QgTGl2ZVJhbmdlICZSSFMsIFZOSW5mbyAqTEhTVmFsTm8pOworCisgICAgLy8vIE1lcmdlVmFsdWVJbkFzVmFsdWUgLSBNZXJnZSBhbGwgb2YgdGhlIHNlZ21lbnRzIG9mIGEgc3BlY2lmaWMgdmFsIworICAgIC8vLyBpbiBSSFMgaW50byB0aGlzIGxpdmUgcmFuZ2UgYXMgdGhlIHNwZWNpZmllZCB2YWx1ZSBudW1iZXIuCisgICAgLy8vIFRoZSBzZWdtZW50cyBpbiBSSFMgYXJlIGFsbG93ZWQgdG8gb3ZlcmxhcCB3aXRoIHNlZ21lbnRzIGluIHRoZQorICAgIC8vLyBjdXJyZW50IHJhbmdlLCBidXQgb25seSBpZiB0aGUgb3ZlcmxhcHBpbmcgc2VnbWVudHMgaGF2ZSB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIHZhbHVlIG51bWJlci4KKyAgICB2b2lkIE1lcmdlVmFsdWVJbkFzVmFsdWUoY29uc3QgTGl2ZVJhbmdlICZSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZOSW5mbyAqUkhTVmFsTm8sIFZOSW5mbyAqTEhTVmFsTm8pOworCisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHNlZ21lbnRzLmVtcHR5KCk7IH0KKworICAgIC8vLyBiZWdpbkluZGV4IC0gUmV0dXJuIHRoZSBsb3dlc3QgbnVtYmVyZWQgc2xvdCBjb3ZlcmVkLgorICAgIFNsb3RJbmRleCBiZWdpbkluZGV4KCkgY29uc3QgeworICAgICAgYXNzZXJ0KCFlbXB0eSgpICYmICJDYWxsIHRvIGJlZ2luSW5kZXgoKSBvbiBlbXB0eSByYW5nZS4iKTsKKyAgICAgIHJldHVybiBzZWdtZW50cy5mcm9udCgpLnN0YXJ0OworICAgIH0KKworICAgIC8vLyBlbmROdW1iZXIgLSByZXR1cm4gdGhlIG1heGltdW0gcG9pbnQgb2YgdGhlIHJhbmdlIG9mIHRoZSB3aG9sZSwKKyAgICAvLy8gZXhjbHVzaXZlLgorICAgIFNsb3RJbmRleCBlbmRJbmRleCgpIGNvbnN0IHsKKyAgICAgIGFzc2VydCghZW1wdHkoKSAmJiAiQ2FsbCB0byBlbmRJbmRleCgpIG9uIGVtcHR5IHJhbmdlLiIpOworICAgICAgcmV0dXJuIHNlZ21lbnRzLmJhY2soKS5lbmQ7CisgICAgfQorCisgICAgYm9vbCBleHBpcmVkQXQoU2xvdEluZGV4IGluZGV4KSBjb25zdCB7CisgICAgICByZXR1cm4gaW5kZXggPj0gZW5kSW5kZXgoKTsKKyAgICB9CisKKyAgICBib29sIGxpdmVBdChTbG90SW5kZXggaW5kZXgpIGNvbnN0IHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIHIgPSBmaW5kKGluZGV4KTsKKyAgICAgIHJldHVybiByICE9IGVuZCgpICYmIHItPnN0YXJ0IDw9IGluZGV4OworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdGhlIHNlZ21lbnQgdGhhdCBjb250YWlucyB0aGUgc3BlY2lmaWVkIGluZGV4LCBvciBudWxsIGlmIHRoZXJlCisgICAgLy8vIGlzIG5vbmUuCisgICAgY29uc3QgU2VnbWVudCAqZ2V0U2VnbWVudENvbnRhaW5pbmcoU2xvdEluZGV4IElkeCkgY29uc3QgeworICAgICAgY29uc3RfaXRlcmF0b3IgSSA9IEZpbmRTZWdtZW50Q29udGFpbmluZyhJZHgpOworICAgICAgcmV0dXJuIEkgPT0gZW5kKCkgPyBudWxscHRyIDogJipJOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdGhlIGxpdmUgc2VnbWVudCB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgaW5kZXgsIG9yIG51bGwgaWYKKyAgICAvLy8gdGhlcmUgaXMgbm9uZS4KKyAgICBTZWdtZW50ICpnZXRTZWdtZW50Q29udGFpbmluZyhTbG90SW5kZXggSWR4KSB7CisgICAgICBpdGVyYXRvciBJID0gRmluZFNlZ21lbnRDb250YWluaW5nKElkeCk7CisgICAgICByZXR1cm4gSSA9PSBlbmQoKSA/IG51bGxwdHIgOiAmKkk7CisgICAgfQorCisgICAgLy8vIGdldFZOSW5mb0F0IC0gUmV0dXJuIHRoZSBWTkluZm8gdGhhdCBpcyBsaXZlIGF0IElkeCwgb3IgTlVMTC4KKyAgICBWTkluZm8gKmdldFZOSW5mb0F0KFNsb3RJbmRleCBJZHgpIGNvbnN0IHsKKyAgICAgIGNvbnN0X2l0ZXJhdG9yIEkgPSBGaW5kU2VnbWVudENvbnRhaW5pbmcoSWR4KTsKKyAgICAgIHJldHVybiBJID09IGVuZCgpID8gbnVsbHB0ciA6IEktPnZhbG5vOworICAgIH0KKworICAgIC8vLyBnZXRWTkluZm9CZWZvcmUgLSBSZXR1cm4gdGhlIFZOSW5mbyB0aGF0IGlzIGxpdmUgdXAgdG8gYnV0IG5vdAorICAgIC8vLyBuZWNlc3NhcmlsbHkgaW5jbHVkaW5nIElkeCwgb3IgTlVMTC4gVXNlIHRoaXMgdG8gZmluZCB0aGUgcmVhY2hpbmcgZGVmCisgICAgLy8vIHVzZWQgYnkgYW4gaW5zdHJ1Y3Rpb24gYXQgdGhpcyBTbG90SW5kZXggcG9zaXRpb24uCisgICAgVk5JbmZvICpnZXRWTkluZm9CZWZvcmUoU2xvdEluZGV4IElkeCkgY29uc3QgeworICAgICAgY29uc3RfaXRlcmF0b3IgSSA9IEZpbmRTZWdtZW50Q29udGFpbmluZyhJZHguZ2V0UHJldlNsb3QoKSk7CisgICAgICByZXR1cm4gSSA9PSBlbmQoKSA/IG51bGxwdHIgOiBJLT52YWxubzsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHRvIHRoZSBzZWdtZW50IHRoYXQgY29udGFpbnMgdGhlIHNwZWNpZmllZCBpbmRleCwgb3IKKyAgICAvLy8gZW5kKCkgaWYgdGhlcmUgaXMgbm9uZS4KKyAgICBpdGVyYXRvciBGaW5kU2VnbWVudENvbnRhaW5pbmcoU2xvdEluZGV4IElkeCkgeworICAgICAgaXRlcmF0b3IgSSA9IGZpbmQoSWR4KTsKKyAgICAgIHJldHVybiBJICE9IGVuZCgpICYmIEktPnN0YXJ0IDw9IElkeCA/IEkgOiBlbmQoKTsKKyAgICB9CisKKyAgICBjb25zdF9pdGVyYXRvciBGaW5kU2VnbWVudENvbnRhaW5pbmcoU2xvdEluZGV4IElkeCkgY29uc3QgeworICAgICAgY29uc3RfaXRlcmF0b3IgSSA9IGZpbmQoSWR4KTsKKyAgICAgIHJldHVybiBJICE9IGVuZCgpICYmIEktPnN0YXJ0IDw9IElkeCA/IEkgOiBlbmQoKTsKKyAgICB9CisKKyAgICAvLy8gb3ZlcmxhcHMgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoZSB0d28gbGl2ZSByYW5nZXMgaXMKKyAgICAvLy8gbm90IGVtcHR5LgorICAgIGJvb2wgb3ZlcmxhcHMoY29uc3QgTGl2ZVJhbmdlICZvdGhlcikgY29uc3QgeworICAgICAgaWYgKG90aGVyLmVtcHR5KCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiBvdmVybGFwc0Zyb20ob3RoZXIsIG90aGVyLmJlZ2luKCkpOworICAgIH0KKworICAgIC8vLyBvdmVybGFwcyAtIFJldHVybiB0cnVlIGlmIHRoZSB0d28gcmFuZ2VzIGhhdmUgb3ZlcmxhcHBpbmcgc2VnbWVudHMKKyAgICAvLy8gdGhhdCBhcmUgbm90IGNvYWxlc2NhYmxlIGFjY29yZGluZyB0byBDUC4KKyAgICAvLy8KKyAgICAvLy8gT3ZlcmxhcHBpbmcgc2VnbWVudHMgd2hlcmUgb25lIHJhbmdlIGlzIGRlZmluZWQgYnkgYSBjb2FsZXNjYWJsZQorICAgIC8vLyBjb3B5IGFyZSBhbGxvd2VkLgorICAgIGJvb2wgb3ZlcmxhcHMoY29uc3QgTGl2ZVJhbmdlICZPdGhlciwgY29uc3QgQ29hbGVzY2VyUGFpciAmQ1AsCisgICAgICAgICAgICAgICAgICBjb25zdCBTbG90SW5kZXhlcyYpIGNvbnN0OworCisgICAgLy8vIG92ZXJsYXBzIC0gUmV0dXJuIHRydWUgaWYgdGhlIGxpdmUgcmFuZ2Ugb3ZlcmxhcHMgYW4gaW50ZXJ2YWwgc3BlY2lmaWVkCisgICAgLy8vIGJ5IFtTdGFydCwgRW5kKS4KKyAgICBib29sIG92ZXJsYXBzKFNsb3RJbmRleCBTdGFydCwgU2xvdEluZGV4IEVuZCkgY29uc3Q7CisKKyAgICAvLy8gb3ZlcmxhcHNGcm9tIC0gUmV0dXJuIHRydWUgaWYgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgdHdvIGxpdmUgcmFuZ2VzCisgICAgLy8vIGlzIG5vdCBlbXB0eS4gIFRoZSBzcGVjaWZpZWQgaXRlcmF0b3IgaXMgYSBoaW50IHRoYXQgd2UgY2FuIGJlZ2luCisgICAgLy8vIHNjYW5uaW5nIHRoZSBPdGhlciByYW5nZSBzdGFydGluZyBhdCBJLgorICAgIGJvb2wgb3ZlcmxhcHNGcm9tKGNvbnN0IExpdmVSYW5nZSAmT3RoZXIsIGNvbnN0X2l0ZXJhdG9yIEkpIGNvbnN0OworCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbGwgc2VnbWVudHMgb2YgdGhlIEBwIE90aGVyIGxpdmUgcmFuZ2UgYXJlIGNvbXBsZXRlbHkKKyAgICAvLy8gY292ZXJlZCBieSB0aGlzIGxpdmUgcmFuZ2UuCisgICAgLy8vIEFkamFjZW50IGxpdmUgcmFuZ2VzIGRvIG5vdCBhZmZlY3QgdGhlIGNvdmVyaW5nOnRoZSBsaXZlcmFuZ2UKKyAgICAvLy8gWzEsNV0oNSwxMF0gY292ZXJzICgzLDddLgorICAgIGJvb2wgY292ZXJzKGNvbnN0IExpdmVSYW5nZSAmT3RoZXIpIGNvbnN0OworCisgICAgLy8vIEFkZCB0aGUgc3BlY2lmaWVkIFNlZ21lbnQgdG8gdGhpcyByYW5nZSwgbWVyZ2luZyBzZWdtZW50cyBhcworICAgIC8vLyBhcHByb3ByaWF0ZS4gIFRoaXMgcmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgaW5zZXJ0ZWQgc2VnbWVudCAod2hpY2gKKyAgICAvLy8gbWF5IGhhdmUgZ3Jvd24gc2luY2UgaXQgd2FzIGluc2VydGVkKS4KKyAgICBpdGVyYXRvciBhZGRTZWdtZW50KFNlZ21lbnQgUyk7CisKKyAgICAvLy8gQXR0ZW1wdCB0byBleHRlbmQgYSB2YWx1ZSBkZWZpbmVkIGFmdGVyIEBwIFN0YXJ0SWR4IHRvIGluY2x1ZGUgQHAgVXNlLgorICAgIC8vLyBCb3RoIEBwIFN0YXJ0SWR4IGFuZCBAcCBVc2Ugc2hvdWxkIGJlIGluIHRoZSBzYW1lIGJhc2ljIGJsb2NrLiBJbiBjYXNlCisgICAgLy8vIG9mIHN1YnJhbmdlcywgYW4gZXh0ZW5zaW9uIGNvdWxkIGJlIHByZXZlbnRlZCBieSBhbiBleHBsaWNpdCAidW5kZWYiCisgICAgLy8vIGNhdXNlZCBieSBhIDxkZWYscmVhZC11bmRlZj4gb24gYSBub24tb3ZlcmxhcHBpbmcgbGFuZS4gVGhlIGxpc3Qgb2YKKyAgICAvLy8gbG9jYXRpb24gb2Ygc3VjaCAidW5kZWZzIiBzaG91bGQgYmUgcHJvdmlkZWQgaW4gQHAgVW5kZWZzLgorICAgIC8vLyBUaGUgcmV0dXJuIHZhbHVlIGlzIGEgcGFpcjogdGhlIGZpcnN0IGVsZW1lbnQgaXMgVk5JbmZvIG9mIHRoZSB2YWx1ZQorICAgIC8vLyB0aGF0IHdhcyBleHRlbmRlZCAocG9zc2libHkgbnVsbHB0ciksIHRoZSBzZWNvbmQgaXMgYSBib29sZWFuIHZhbHVlCisgICAgLy8vIGluZGljYXRpbmcgd2hldGhlciBhbiAidW5kZWYiIHdhcyBlbmNvdW50ZXJlZC4KKyAgICAvLy8gSWYgdGhpcyByYW5nZSBpcyBsaXZlIGJlZm9yZSBAcCBVc2UgaW4gdGhlIGJhc2ljIGJsb2NrIHRoYXQgc3RhcnRzIGF0CisgICAgLy8vIEBwIFN0YXJ0SWR4LCBhbmQgdGhlcmUgaXMgbm8gaW50ZXJ2ZW5pbmcgInVuZGVmIiwgZXh0ZW5kIGl0IHRvIGJlIGxpdmUKKyAgICAvLy8gdXAgdG8gQHAgVXNlLCBhbmQgcmV0dXJuIHRoZSBwYWlyIHt2YWx1ZSwgZmFsc2V9LiBJZiB0aGVyZSBpcyBubworICAgIC8vLyBzZWdtZW50IGJlZm9yZSBAcCBVc2UgYW5kIHRoZXJlIGlzIG5vICJ1bmRlZiIgYmV0d2VlbiBAcCBTdGFydElkeCBhbmQKKyAgICAvLy8gQHAgVXNlLCByZXR1cm4ge251bGxwdHIsIGZhbHNlfS4gSWYgdGhlcmUgaXMgYW4gInVuZGVmIiBiZWZvcmUgQHAgVXNlLAorICAgIC8vLyByZXR1cm4ge251bGxwdHIsIHRydWV9LgorICAgIHN0ZDo6cGFpcjxWTkluZm8qLGJvb2w+IGV4dGVuZEluQmxvY2soQXJyYXlSZWY8U2xvdEluZGV4PiBVbmRlZnMsCisgICAgICAgIFNsb3RJbmRleCBTdGFydElkeCwgU2xvdEluZGV4IFVzZSk7CisKKyAgICAvLy8gU2ltcGxpZmllZCB2ZXJzaW9uIG9mIHRoZSBhYm92ZSAiZXh0ZW5kSW5CbG9jayIsIHdoaWNoIGFzc3VtZXMgdGhhdAorICAgIC8vLyBubyByZWdpc3RlciBsYW5lcyBhcmUgdW5kZWZpbmVkIGJ5IDxkZWYscmVhZC11bmRlZj4gb3BlcmFuZHMuCisgICAgLy8vIElmIHRoaXMgcmFuZ2UgaXMgbGl2ZSBiZWZvcmUgQHAgVXNlIGluIHRoZSBiYXNpYyBibG9jayB0aGF0IHN0YXJ0cworICAgIC8vLyBhdCBAcCBTdGFydElkeCwgZXh0ZW5kIGl0IHRvIGJlIGxpdmUgdXAgdG8gQHAgVXNlLCBhbmQgcmV0dXJuIHRoZQorICAgIC8vLyB2YWx1ZS4gSWYgdGhlcmUgaXMgbm8gc2VnbWVudCBiZWZvcmUgQHAgVXNlLCByZXR1cm4gbnVsbHB0ci4KKyAgICBWTkluZm8gKmV4dGVuZEluQmxvY2soU2xvdEluZGV4IFN0YXJ0SWR4LCBTbG90SW5kZXggS2lsbCk7CisKKyAgICAvLy8gam9pbiAtIEpvaW4gdHdvIGxpdmUgcmFuZ2VzICh0aGlzLCBhbmQgb3RoZXIpIHRvZ2V0aGVyLiAgVGhpcyBhcHBsaWVzCisgICAgLy8vIG1hcHBpbmdzIHRvIHRoZSB2YWx1ZSBudW1iZXJzIGluIHRoZSBMSFMvUkhTIHJhbmdlcyBhcyBzcGVjaWZpZWQuICBJZgorICAgIC8vLyB0aGUgcmFuZ2VzIGFyZSBub3Qgam9pbmFibGUsIHRoaXMgYWJvcnRzLgorICAgIHZvaWQgam9pbihMaXZlUmFuZ2UgJk90aGVyLAorICAgICAgICAgICAgICBjb25zdCBpbnQgKlZhbE5vQXNzaWdubWVudHMsCisgICAgICAgICAgICAgIGNvbnN0IGludCAqUkhTVmFsTm9Bc3NpZ25tZW50cywKKyAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFZOSW5mbyAqPiAmTmV3Vk5JbmZvKTsKKworICAgIC8vLyBUcnVlIGlmZiB0aGlzIHNlZ21lbnQgaXMgYSBzaW5nbGUgc2VnbWVudCB0aGF0IGxpZXMgYmV0d2VlbiB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIGJvdW5kYXJpZXMsIGV4Y2x1c2l2ZWx5LiBWcmVncyBsaXZlIGFjcm9zcyBhIGJhY2tlZGdlIGFyZSBub3QKKyAgICAvLy8gY29uc2lkZXJlZCBsb2NhbC4gVGhlIGJvdW5kYXJpZXMgYXJlIGV4cGVjdGVkIHRvIGxpZSB3aXRoaW4gYW4gZXh0ZW5kZWQKKyAgICAvLy8gYmFzaWMgYmxvY2ssIHNvIHZyZWdzIHRoYXQgYXJlIG5vdCBsaXZlIG91dCBzaG91bGQgY29udGFpbiBubyBob2xlcy4KKyAgICBib29sIGlzTG9jYWwoU2xvdEluZGV4IFN0YXJ0LCBTbG90SW5kZXggRW5kKSBjb25zdCB7CisgICAgICByZXR1cm4gYmVnaW5JbmRleCgpID4gU3RhcnQuZ2V0QmFzZUluZGV4KCkgJiYKKyAgICAgICAgZW5kSW5kZXgoKSA8IEVuZC5nZXRCb3VuZGFyeUluZGV4KCk7CisgICAgfQorCisgICAgLy8vIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHNlZ21lbnQgZnJvbSB0aGlzIHJhbmdlLiAgTm90ZSB0aGF0IHRoZSBzZWdtZW50CisgICAgLy8vIG11c3QgYmUgYSBzaW5nbGUgU2VnbWVudCBpbiBpdHMgZW50aXJldHkuCisgICAgdm9pZCByZW1vdmVTZWdtZW50KFNsb3RJbmRleCBTdGFydCwgU2xvdEluZGV4IEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZW1vdmVEZWFkVmFsTm8gPSBmYWxzZSk7CisKKyAgICB2b2lkIHJlbW92ZVNlZ21lbnQoU2VnbWVudCBTLCBib29sIFJlbW92ZURlYWRWYWxObyA9IGZhbHNlKSB7CisgICAgICByZW1vdmVTZWdtZW50KFMuc3RhcnQsIFMuZW5kLCBSZW1vdmVEZWFkVmFsTm8pOworICAgIH0KKworICAgIC8vLyBSZW1vdmUgc2VnbWVudCBwb2ludGVkIHRvIGJ5IGl0ZXJhdG9yIEBwIEkgZnJvbSB0aGlzIHJhbmdlLiAgVGhpcyBkb2VzCisgICAgLy8vIG5vdCByZW1vdmUgZGVhZCB2YWx1ZSBudW1iZXJzLgorICAgIGl0ZXJhdG9yIHJlbW92ZVNlZ21lbnQoaXRlcmF0b3IgSSkgeworICAgICAgcmV0dXJuIHNlZ21lbnRzLmVyYXNlKEkpOworICAgIH0KKworICAgIC8vLyBRdWVyeSBMaXZlbmVzcyBhdCBJZHguCisgICAgLy8vIFRoZSBzdWItaW5zdHJ1Y3Rpb24gc2xvdCBvZiBJZHggZG9lc24ndCBtYXR0ZXIsIG9ubHkgdGhlIGluc3RydWN0aW9uCisgICAgLy8vIGl0IHJlZmVycyB0byBpcyBjb25zaWRlcmVkLgorICAgIExpdmVRdWVyeVJlc3VsdCBRdWVyeShTbG90SW5kZXggSWR4KSBjb25zdCB7CisgICAgICAvLyBGaW5kIHRoZSBzZWdtZW50IHRoYXQgZW50ZXJzIHRoZSBpbnN0cnVjdGlvbi4KKyAgICAgIGNvbnN0X2l0ZXJhdG9yIEkgPSBmaW5kKElkeC5nZXRCYXNlSW5kZXgoKSk7CisgICAgICBjb25zdF9pdGVyYXRvciBFID0gZW5kKCk7CisgICAgICBpZiAoSSA9PSBFKQorICAgICAgICByZXR1cm4gTGl2ZVF1ZXJ5UmVzdWx0KG51bGxwdHIsIG51bGxwdHIsIFNsb3RJbmRleCgpLCBmYWxzZSk7CisKKyAgICAgIC8vIElzIHRoaXMgYW4gaW5zdHJ1Y3Rpb24gbGl2ZS1pbiBzZWdtZW50PworICAgICAgLy8gSWYgSWR4IGlzIHRoZSBzdGFydCBpbmRleCBvZiBhIGJhc2ljIGJsb2NrLCBpbmNsdWRlIGxpdmUtaW4gc2VnbWVudHMKKyAgICAgIC8vIHRoYXQgc3RhcnQgYXQgSWR4LmdldEJhc2VJbmRleCgpLgorICAgICAgVk5JbmZvICpFYXJseVZhbCA9IG51bGxwdHI7CisgICAgICBWTkluZm8gKkxhdGVWYWwgID0gbnVsbHB0cjsKKyAgICAgIFNsb3RJbmRleCBFbmRQb2ludDsKKyAgICAgIGJvb2wgS2lsbCA9IGZhbHNlOworICAgICAgaWYgKEktPnN0YXJ0IDw9IElkeC5nZXRCYXNlSW5kZXgoKSkgeworICAgICAgICBFYXJseVZhbCA9IEktPnZhbG5vOworICAgICAgICBFbmRQb2ludCA9IEktPmVuZDsKKyAgICAgICAgLy8gTW92ZSB0byB0aGUgcG90ZW50aWFsbHkgbGl2ZS1vdXQgc2VnbWVudC4KKyAgICAgICAgaWYgKFNsb3RJbmRleDo6aXNTYW1lSW5zdHIoSWR4LCBJLT5lbmQpKSB7CisgICAgICAgICAgS2lsbCA9IHRydWU7CisgICAgICAgICAgaWYgKCsrSSA9PSBFKQorICAgICAgICAgICAgcmV0dXJuIExpdmVRdWVyeVJlc3VsdChFYXJseVZhbCwgTGF0ZVZhbCwgRW5kUG9pbnQsIEtpbGwpOworICAgICAgICB9CisgICAgICAgIC8vIFNwZWNpYWwgY2FzZTogQSBQSElEZWYgdmFsdWUgY2FuIGhhdmUgaXRzIGRlZiBpbiB0aGUgbWlkZGxlIG9mIGEKKyAgICAgICAgLy8gc2VnbWVudCBpZiB0aGUgdmFsdWUgaGFwcGVucyB0byBiZSBsaXZlIG91dCBvZiB0aGUgbGF5b3V0CisgICAgICAgIC8vIHByZWRlY2Vzc29yLgorICAgICAgICAvLyBTdWNoIGEgdmFsdWUgaXMgbm90IGxpdmUtaW4uCisgICAgICAgIGlmIChFYXJseVZhbC0+ZGVmID09IElkeC5nZXRCYXNlSW5kZXgoKSkKKyAgICAgICAgICBFYXJseVZhbCA9IG51bGxwdHI7CisgICAgICB9CisgICAgICAvLyBJIG5vdyBwb2ludHMgdG8gdGhlIHNlZ21lbnQgdGhhdCBtYXkgYmUgbGl2ZS10aHJvdWdoLCBvciBkZWZpbmVkIGJ5CisgICAgICAvLyB0aGlzIGluc3RyLiBJZ25vcmUgc2VnbWVudHMgc3RhcnRpbmcgYWZ0ZXIgdGhlIGN1cnJlbnQgaW5zdHIuCisgICAgICBpZiAoIVNsb3RJbmRleDo6aXNFYXJsaWVySW5zdHIoSWR4LCBJLT5zdGFydCkpIHsKKyAgICAgICAgTGF0ZVZhbCA9IEktPnZhbG5vOworICAgICAgICBFbmRQb2ludCA9IEktPmVuZDsKKyAgICAgIH0KKyAgICAgIHJldHVybiBMaXZlUXVlcnlSZXN1bHQoRWFybHlWYWwsIExhdGVWYWwsIEVuZFBvaW50LCBLaWxsKTsKKyAgICB9CisKKyAgICAvLy8gcmVtb3ZlVmFsTm8gLSBSZW1vdmUgYWxsIHRoZSBzZWdtZW50cyBkZWZpbmVkIGJ5IHRoZSBzcGVjaWZpZWQgdmFsdWUjLgorICAgIC8vLyBBbHNvIHJlbW92ZSB0aGUgdmFsdWUjIGZyb20gdmFsdWUjIGxpc3QuCisgICAgdm9pZCByZW1vdmVWYWxObyhWTkluZm8gKlZhbE5vKTsKKworICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGxpdmUgcmFuZ2UgaXMgemVybyBsZW5ndGgsIGkuZS4gbm8gbGl2ZSBzZWdtZW50cworICAgIC8vLyBzcGFuIGluc3RydWN0aW9ucy4gSXQgZG9lc24ndCBwYXkgdG8gc3BpbGwgc3VjaCBhIHJhbmdlLgorICAgIGJvb2wgaXNaZXJvTGVuZ3RoKFNsb3RJbmRleGVzICpJbmRleGVzKSBjb25zdCB7CisgICAgICBmb3IgKGNvbnN0IFNlZ21lbnQgJlMgOiBzZWdtZW50cykKKyAgICAgICAgaWYgKEluZGV4ZXMtPmdldE5leHROb25OdWxsSW5kZXgoUy5zdGFydCkuZ2V0QmFzZUluZGV4KCkgPAorICAgICAgICAgICAgUy5lbmQuZ2V0QmFzZUluZGV4KCkpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0cnVlIGlmIGFueSBzZWdtZW50IGluIHRoZSBsaXZlIHJhbmdlIGNvbnRhaW5zIGFueSBvZiB0aGUKKyAgICAvLyBwcm92aWRlZCBzbG90IGluZGV4ZXMuICBTbG90cyB3aGljaCBvY2N1ciBpbiBob2xlcyBiZXR3ZWVuCisgICAgLy8gc2VnbWVudHMgd2lsbCBub3QgY2F1c2UgdGhlIGZ1bmN0aW9uIHRvIHJldHVybiB0cnVlLgorICAgIGJvb2wgaXNMaXZlQXRJbmRleGVzKEFycmF5UmVmPFNsb3RJbmRleD4gU2xvdHMpIGNvbnN0OworCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgTGl2ZVJhbmdlJiBvdGhlcikgY29uc3QgeworICAgICAgY29uc3QgU2xvdEluZGV4ICZ0aGlzSW5kZXggPSBiZWdpbkluZGV4KCk7CisgICAgICBjb25zdCBTbG90SW5kZXggJm90aGVySW5kZXggPSBvdGhlci5iZWdpbkluZGV4KCk7CisgICAgICByZXR1cm4gdGhpc0luZGV4IDwgb3RoZXJJbmRleDsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIGFuIGV4cGxpY2l0ICJ1bmRlZiIgYmV0d2VlbiBAcCBCZWdpbgorICAgIC8vLyBAcCBFbmQuCisgICAgYm9vbCBpc1VuZGVmSW4oQXJyYXlSZWY8U2xvdEluZGV4PiBVbmRlZnMsIFNsb3RJbmRleCBCZWdpbiwKKyAgICAgICAgICAgICAgICAgICBTbG90SW5kZXggRW5kKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjphbnlfb2YoVW5kZWZzLmJlZ2luKCksIFVuZGVmcy5lbmQoKSwKKyAgICAgICAgICAgICAgICBbQmVnaW4sRW5kXSAoU2xvdEluZGV4IElkeCkgLT4gYm9vbCB7CisgICAgICAgICAgICAgICAgICByZXR1cm4gQmVnaW4gPD0gSWR4ICYmIElkeCA8IEVuZDsKKyAgICAgICAgICAgICAgICB9KTsKKyAgICB9CisKKyAgICAvLy8gRmx1c2ggc2VnbWVudCBzZXQgaW50byB0aGUgcmVndWxhciBzZWdtZW50IHZlY3Rvci4KKyAgICAvLy8gVGhlIG1ldGhvZCBpcyB0byBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxpdmUgcmFuZ2UKKyAgICAvLy8gaGFzIGJlZW4gY3JlYXRlZCwgaWYgdXNlIG9mIHRoZSBzZWdtZW50IHNldCB3YXMKKyAgICAvLy8gYWN0aXZhdGVkIGluIHRoZSBjb25zdHJ1Y3RvciBvZiB0aGUgbGl2ZSByYW5nZS4KKyAgICB2b2lkIGZsdXNoU2VnbWVudFNldCgpOworCisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICAgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgICAgLy8vIFxicmllZiBXYWxrIHRoZSByYW5nZSBhbmQgYXNzZXJ0IGlmIGFueSBpbnZhcmlhbnRzIGZhaWwgdG8gaG9sZC4KKyAgICAvLy8KKyAgICAvLy8gTm90ZSB0aGF0IHRoaXMgaXMgYSBuby1vcCB3aGVuIGFzc2VydHMgYXJlIGRpc2FibGVkLgorI2lmZGVmIE5ERUJVRworICAgIHZvaWQgdmVyaWZ5KCkgY29uc3Qge30KKyNlbHNlCisgICAgdm9pZCB2ZXJpZnkoKSBjb25zdDsKKyNlbmRpZgorCisgIHByb3RlY3RlZDoKKyAgICAvLy8gQXBwZW5kIGEgc2VnbWVudCB0byB0aGUgbGlzdCBvZiBzZWdtZW50cy4KKyAgICB2b2lkIGFwcGVuZChjb25zdCBMaXZlUmFuZ2U6OlNlZ21lbnQgUyk7CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgTGl2ZVJhbmdlVXBkYXRlcjsKKyAgICB2b2lkIGFkZFNlZ21lbnRUb1NldChTZWdtZW50IFMpOworICAgIHZvaWQgbWFya1ZhbE5vRm9yRGVsZXRpb24oVk5JbmZvICpWKTsKKyAgfTsKKworICBpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBMaXZlUmFuZ2UgJkxSKSB7CisgICAgTFIucHJpbnQoT1MpOworICAgIHJldHVybiBPUzsKKyAgfQorCisgIC8vLyBMaXZlSW50ZXJ2YWwgLSBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGxpdmVuZXNzIG9mIGEgcmVnaXN0ZXIsCisgIC8vLyBvciBzdGFjayBzbG90LgorICBjbGFzcyBMaXZlSW50ZXJ2YWwgOiBwdWJsaWMgTGl2ZVJhbmdlIHsKKyAgcHVibGljOgorICAgIHVzaW5nIHN1cGVyID0gTGl2ZVJhbmdlOworCisgICAgLy8vIEEgbGl2ZSByYW5nZSBmb3Igc3VicmVnaXN0ZXJzLiBUaGUgTGFuZU1hc2sgc3BlY2lmaWVzIHdoaWNoIHBhcnRzIG9mIHRoZQorICAgIC8vLyBzdXBlciByZWdpc3RlciBhcmUgY292ZXJlZCBieSB0aGUgaW50ZXJ2YWwuCisgICAgLy8vIChAc2EgVGFyZ2V0UmVnaXN0ZXJJbmZvOjpnZXRTdWJSZWdJbmRleExhbmVNYXNrKCkpLgorICAgIGNsYXNzIFN1YlJhbmdlIDogcHVibGljIExpdmVSYW5nZSB7CisgICAgcHVibGljOgorICAgICAgU3ViUmFuZ2UgKk5leHQgPSBudWxscHRyOworICAgICAgTGFuZUJpdG1hc2sgTGFuZU1hc2s7CisKKyAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgbmV3IFN1YlJhbmdlIG9iamVjdC4KKyAgICAgIFN1YlJhbmdlKExhbmVCaXRtYXNrIExhbmVNYXNrKSA6IExhbmVNYXNrKExhbmVNYXNrKSB7fQorCisgICAgICAvLy8gQ29uc3RydWN0cyBhIG5ldyBTdWJSYW5nZSBvYmplY3QgYnkgY29weWluZyBsaXZlbmVzcyBmcm9tIEBwIE90aGVyLgorICAgICAgU3ViUmFuZ2UoTGFuZUJpdG1hc2sgTGFuZU1hc2ssIGNvbnN0IExpdmVSYW5nZSAmT3RoZXIsCisgICAgICAgICAgICAgICBCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IpCisgICAgICAgIDogTGl2ZVJhbmdlKE90aGVyLCBBbGxvY2F0b3IpLCBMYW5lTWFzayhMYW5lTWFzaykge30KKworICAgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICAgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisgICAgfTsKKworICBwcml2YXRlOgorICAgIFN1YlJhbmdlICpTdWJSYW5nZXMgPSBudWxscHRyOyAvLy88IFNpbmdsZSBsaW5rZWQgbGlzdCBvZiBzdWJyZWdpc3RlciBsaXZlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLyByYW5nZXMuCisKKyAgcHVibGljOgorICAgIGNvbnN0IHVuc2lnbmVkIHJlZzsgIC8vIHRoZSByZWdpc3RlciBvciBzdGFjayBzbG90IG9mIHRoaXMgaW50ZXJ2YWwuCisgICAgZmxvYXQgd2VpZ2h0OyAgICAgICAgLy8gd2VpZ2h0IG9mIHRoaXMgaW50ZXJ2YWwKKworICAgIExpdmVJbnRlcnZhbCh1bnNpZ25lZCBSZWcsIGZsb2F0IFdlaWdodCkgOiByZWcoUmVnKSwgd2VpZ2h0KFdlaWdodCkge30KKworICAgIH5MaXZlSW50ZXJ2YWwoKSB7CisgICAgICBjbGVhclN1YlJhbmdlcygpOworICAgIH0KKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgICAgY2xhc3MgU2luZ2xlTGlua2VkTGlzdEl0ZXJhdG9yIHsKKyAgICAgIFQgKlA7CisKKyAgICBwdWJsaWM6CisgICAgICBTaW5nbGVMaW5rZWRMaXN0SXRlcmF0b3I8VD4oVCAqUCkgOiBQKFApIHt9CisKKyAgICAgIFNpbmdsZUxpbmtlZExpc3RJdGVyYXRvcjxUPiAmb3BlcmF0b3IrKygpIHsKKyAgICAgICAgUCA9IFAtPk5leHQ7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKyAgICAgIFNpbmdsZUxpbmtlZExpc3RJdGVyYXRvcjxUPiBvcGVyYXRvcisrKGludCkgeworICAgICAgICBTaW5nbGVMaW5rZWRMaXN0SXRlcmF0b3IgcmVzID0gKnRoaXM7CisgICAgICAgICsrKnRoaXM7CisgICAgICAgIHJldHVybiByZXM7CisgICAgICB9CisgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgU2luZ2xlTGlua2VkTGlzdEl0ZXJhdG9yPFQ+ICZPdGhlcikgeworICAgICAgICByZXR1cm4gUCAhPSBPdGhlci5vcGVyYXRvci0+KCk7CisgICAgICB9CisgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgU2luZ2xlTGlua2VkTGlzdEl0ZXJhdG9yPFQ+ICZPdGhlcikgeworICAgICAgICByZXR1cm4gUCA9PSBPdGhlci5vcGVyYXRvci0+KCk7CisgICAgICB9CisgICAgICBUICZvcGVyYXRvciooKSBjb25zdCB7CisgICAgICAgIHJldHVybiAqUDsKKyAgICAgIH0KKyAgICAgIFQgKm9wZXJhdG9yLT4oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBQOworICAgICAgfQorICAgIH07CisKKyAgICB1c2luZyBzdWJyYW5nZV9pdGVyYXRvciA9IFNpbmdsZUxpbmtlZExpc3RJdGVyYXRvcjxTdWJSYW5nZT47CisgICAgdXNpbmcgY29uc3Rfc3VicmFuZ2VfaXRlcmF0b3IgPSBTaW5nbGVMaW5rZWRMaXN0SXRlcmF0b3I8Y29uc3QgU3ViUmFuZ2U+OworCisgICAgc3VicmFuZ2VfaXRlcmF0b3Igc3VicmFuZ2VfYmVnaW4oKSB7CisgICAgICByZXR1cm4gc3VicmFuZ2VfaXRlcmF0b3IoU3ViUmFuZ2VzKTsKKyAgICB9CisgICAgc3VicmFuZ2VfaXRlcmF0b3Igc3VicmFuZ2VfZW5kKCkgeworICAgICAgcmV0dXJuIHN1YnJhbmdlX2l0ZXJhdG9yKG51bGxwdHIpOworICAgIH0KKworICAgIGNvbnN0X3N1YnJhbmdlX2l0ZXJhdG9yIHN1YnJhbmdlX2JlZ2luKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNvbnN0X3N1YnJhbmdlX2l0ZXJhdG9yKFN1YlJhbmdlcyk7CisgICAgfQorICAgIGNvbnN0X3N1YnJhbmdlX2l0ZXJhdG9yIHN1YnJhbmdlX2VuZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjb25zdF9zdWJyYW5nZV9pdGVyYXRvcihudWxscHRyKTsKKyAgICB9CisKKyAgICBpdGVyYXRvcl9yYW5nZTxzdWJyYW5nZV9pdGVyYXRvcj4gc3VicmFuZ2VzKCkgeworICAgICAgcmV0dXJuIG1ha2VfcmFuZ2Uoc3VicmFuZ2VfYmVnaW4oKSwgc3VicmFuZ2VfZW5kKCkpOworICAgIH0KKworICAgIGl0ZXJhdG9yX3JhbmdlPGNvbnN0X3N1YnJhbmdlX2l0ZXJhdG9yPiBzdWJyYW5nZXMoKSBjb25zdCB7CisgICAgICByZXR1cm4gbWFrZV9yYW5nZShzdWJyYW5nZV9iZWdpbigpLCBzdWJyYW5nZV9lbmQoKSk7CisgICAgfQorCisgICAgLy8vIENyZWF0ZXMgYSBuZXcgZW1wdHkgc3VicmVnaXN0ZXIgbGl2ZSByYW5nZS4gVGhlIHJhbmdlIGlzIGFkZGVkIGF0IHRoZQorICAgIC8vLyBiZWdpbm5pbmcgb2YgdGhlIHN1YnJhbmdlIGxpc3Q7IHN1YnJhbmdlIGl0ZXJhdG9ycyBzdGF5IHZhbGlkLgorICAgIFN1YlJhbmdlICpjcmVhdGVTdWJSYW5nZShCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhbmVCaXRtYXNrIExhbmVNYXNrKSB7CisgICAgICBTdWJSYW5nZSAqUmFuZ2UgPSBuZXcgKEFsbG9jYXRvcikgU3ViUmFuZ2UoTGFuZU1hc2spOworICAgICAgYXBwZW5kU3ViUmFuZ2UoUmFuZ2UpOworICAgICAgcmV0dXJuIFJhbmdlOworICAgIH0KKworICAgIC8vLyBMaWtlIGNyZWF0ZVN1YlJhbmdlKCkgYnV0IHRoZSBuZXcgcmFuZ2UgaXMgZmlsbGVkIHdpdGggYSBjb3B5IG9mIHRoZQorICAgIC8vLyBsaXZlbmVzcyBpbmZvcm1hdGlvbiBpbiBAcCBDb3B5RnJvbS4KKyAgICBTdWJSYW5nZSAqY3JlYXRlU3ViUmFuZ2VGcm9tKEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhbmVCaXRtYXNrIExhbmVNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGl2ZVJhbmdlICZDb3B5RnJvbSkgeworICAgICAgU3ViUmFuZ2UgKlJhbmdlID0gbmV3IChBbGxvY2F0b3IpIFN1YlJhbmdlKExhbmVNYXNrLCBDb3B5RnJvbSwgQWxsb2NhdG9yKTsKKyAgICAgIGFwcGVuZFN1YlJhbmdlKFJhbmdlKTsKKyAgICAgIHJldHVybiBSYW5nZTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHN1YnJlZ2lzdGVyIGxpdmVuZXNzIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZS4KKyAgICBib29sIGhhc1N1YlJhbmdlcygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTdWJSYW5nZXMgIT0gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLy8gUmVtb3ZlcyBhbGwgc3VicmVnaXN0ZXIgbGl2ZW5lc3MgaW5mb3JtYXRpb24uCisgICAgdm9pZCBjbGVhclN1YlJhbmdlcygpOworCisgICAgLy8vIFJlbW92ZXMgYWxsIHN1YnJhbmdlcyB3aXRob3V0IGFueSBzZWdtZW50cyAoc3VicmFuZ2VzIHdpdGhvdXQgc2VnbWVudHMKKyAgICAvLy8gYXJlIG5vdCBjb25zaWRlcmVkIHZhbGlkIGFuZCBzaG91bGQgb25seSBleGlzdCB0ZW1wb3JhcmlseSkuCisgICAgdm9pZCByZW1vdmVFbXB0eVN1YlJhbmdlcygpOworCisgICAgLy8vIGdldFNpemUgLSBSZXR1cm5zIHRoZSBzdW0gb2Ygc2l6ZXMgb2YgYWxsIHRoZSBMaXZlUmFuZ2Uncy4KKyAgICAvLy8KKyAgICB1bnNpZ25lZCBnZXRTaXplKCkgY29uc3Q7CisKKyAgICAvLy8gaXNTcGlsbGFibGUgLSBDYW4gdGhpcyBpbnRlcnZhbCBiZSBzcGlsbGVkPworICAgIGJvb2wgaXNTcGlsbGFibGUoKSBjb25zdCB7CisgICAgICByZXR1cm4gd2VpZ2h0ICE9IGh1Z2VfdmFsZjsKKyAgICB9CisKKyAgICAvLy8gbWFya05vdFNwaWxsYWJsZSAtIE1hcmsgaW50ZXJ2YWwgYXMgbm90IHNwaWxsYWJsZQorICAgIHZvaWQgbWFya05vdFNwaWxsYWJsZSgpIHsKKyAgICAgIHdlaWdodCA9IGh1Z2VfdmFsZjsKKyAgICB9CisKKyAgICAvLy8gRm9yIGEgZ2l2ZW4gbGFuZSBtYXNrIEBwIExhbmVNYXNrLCBjb21wdXRlIGluZGV4ZXMgYXQgd2hpY2ggdGhlCisgICAgLy8vIGxhbmUgaXMgbWFya2VkIHVuZGVmaW5lZCBieSBzdWJyZWdpc3RlciA8ZGVmLHJlYWQtdW5kZWY+IGRlZmluaXRpb25zLgorICAgIHZvaWQgY29tcHV0ZVN1YlJhbmdlVW5kZWZzKFNtYWxsVmVjdG9ySW1wbDxTbG90SW5kZXg+ICZVbmRlZnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFuZUJpdG1hc2sgTGFuZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNsb3RJbmRleGVzICZJbmRleGVzKSBjb25zdDsKKworICAgIC8vLyBSZWZpbmVzIHRoZSBzdWJyYW5nZXMgdG8gc3VwcG9ydCBccCBMYW5lTWFzay4gVGhpcyBtYXkgb25seSBiZSBjYWxsZWQKKyAgICAvLy8gZm9yIExJLmhhc1N1YnJhbmdlKCk9PXRydWUuIFN1YnJlZ2lzdGVyIHJhbmdlcyBhcmUgc3BsaXQgb3IgY3JlYXRlZAorICAgIC8vLyB1bnRpbCBccCBMYW5lTWFzayBjYW4gYmUgbWF0Y2hlZCBleGFjdGx5LiBccCBNb2QgaXMgZXhlY3V0ZWQgb24gdGhlCisgICAgLy8vIG1hdGNoaW5nIHN1YnJhbmdlcy4KKyAgICAvLy8KKyAgICAvLy8gRXhhbXBsZToKKyAgICAvLy8gICAgR2l2ZW4gYW4gaW50ZXJ2YWwgd2l0aCBzdWJyYW5nZXMgd2l0aCBsYW5lbWFza3MgTDBGMDAsIEwwMEYwIGFuZAorICAgIC8vLyAgICBMMDAwRiwgcmVmaW5pbmcgZm9yIG1hc2sgTDAwMTguIFdpbGwgc3BsaXQgdGhlIEwwMEYwIGxhbmUgaW50bworICAgIC8vLyAgICBMMDBFMCBhbmQgTDAwMTAgYW5kIHRoZSBMMDAwRiBsYW5lIGludG8gTDAwMDcgYW5kIEwwMDA4LiBUaGUgTW9kCisgICAgLy8vICAgIGZ1bmN0aW9uIHdpbGwgYmUgYXBwbGllZCB0byB0aGUgTDAwMTAgYW5kIEwwMDA4IHN1YnJhbmdlcy4KKyAgICB2b2lkIHJlZmluZVN1YlJhbmdlcyhCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IsIExhbmVCaXRtYXNrIExhbmVNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChMaXZlSW50ZXJ2YWw6OlN1YlJhbmdlJik+IE1vZCk7CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBMaXZlSW50ZXJ2YWwmIG90aGVyKSBjb25zdCB7CisgICAgICBjb25zdCBTbG90SW5kZXggJnRoaXNJbmRleCA9IGJlZ2luSW5kZXgoKTsKKyAgICAgIGNvbnN0IFNsb3RJbmRleCAmb3RoZXJJbmRleCA9IG90aGVyLmJlZ2luSW5kZXgoKTsKKyAgICAgIHJldHVybiBzdGQ6OnRpZSh0aGlzSW5kZXgsIHJlZykgPCBzdGQ6OnRpZShvdGhlckluZGV4LCBvdGhlci5yZWcpOworICAgIH0KKworICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAgIC8vLyBcYnJpZWYgV2Fsa3MgdGhlIGludGVydmFsIGFuZCBhc3NlcnQgaWYgYW55IGludmFyaWFudHMgZmFpbCB0byBob2xkLgorICAgIC8vLworICAgIC8vLyBOb3RlIHRoYXQgdGhpcyBpcyBhIG5vLW9wIHdoZW4gYXNzZXJ0cyBhcmUgZGlzYWJsZWQuCisjaWZkZWYgTkRFQlVHCisgICAgdm9pZCB2ZXJpZnkoY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJID0gbnVsbHB0cikgY29uc3Qge30KKyNlbHNlCisgICAgdm9pZCB2ZXJpZnkoY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJID0gbnVsbHB0cikgY29uc3Q7CisjZW5kaWYKKworICBwcml2YXRlOgorICAgIC8vLyBBcHBlbmRzIEBwIFJhbmdlIHRvIFN1YlJhbmdlcyBsaXN0LgorICAgIHZvaWQgYXBwZW5kU3ViUmFuZ2UoU3ViUmFuZ2UgKlJhbmdlKSB7CisgICAgICBSYW5nZS0+TmV4dCA9IFN1YlJhbmdlczsKKyAgICAgIFN1YlJhbmdlcyA9IFJhbmdlOworICAgIH0KKworICAgIC8vLyBGcmVlIG1lbW9yeSBoZWxkIGJ5IFN1YlJhbmdlLgorICAgIHZvaWQgZnJlZVN1YlJhbmdlKFN1YlJhbmdlICpTKTsKKyAgfTsKKworICBpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTGl2ZUludGVydmFsOjpTdWJSYW5nZSAmU1IpIHsKKyAgICBTUi5wcmludChPUyk7CisgICAgcmV0dXJuIE9TOworICB9CisKKyAgaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTGl2ZUludGVydmFsICZMSSkgeworICAgIExJLnByaW50KE9TKTsKKyAgICByZXR1cm4gT1M7CisgIH0KKworICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IExpdmVSYW5nZTo6U2VnbWVudCAmUyk7CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KFNsb3RJbmRleCBWLCBjb25zdCBMaXZlUmFuZ2U6OlNlZ21lbnQgJlMpIHsKKyAgICByZXR1cm4gViA8IFMuc3RhcnQ7CisgIH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgTGl2ZVJhbmdlOjpTZWdtZW50ICZTLCBTbG90SW5kZXggVikgeworICAgIHJldHVybiBTLnN0YXJ0IDwgVjsKKyAgfQorCisgIC8vLyBIZWxwZXIgY2xhc3MgZm9yIHBlcmZvcm1hbnQgTGl2ZVJhbmdlIGJ1bGsgdXBkYXRlcy4KKyAgLy8vCisgIC8vLyBDYWxsaW5nIExpdmVSYW5nZTo6YWRkU2VnbWVudCgpIHJlcGVhdGVkbHkgY2FuIGJlIGV4cGVuc2l2ZSBvbiBsYXJnZQorICAvLy8gbGl2ZSByYW5nZXMgYmVjYXVzZSBzZWdtZW50cyBhZnRlciB0aGUgaW5zZXJ0aW9uIHBvaW50IG1heSBuZWVkIHRvIGJlCisgIC8vLyBzaGlmdGVkLiBUaGUgTGl2ZVJhbmdlVXBkYXRlciBjbGFzcyBjYW4gZGVmZXIgdGhlIHNoaWZ0aW5nIHdoZW4gYWRkaW5nCisgIC8vLyBtYW55IHNlZ21lbnRzIGluIG9yZGVyLgorICAvLy8KKyAgLy8vIFRoZSBMaXZlUmFuZ2Ugd2lsbCBiZSBpbiBhbiBpbnZhbGlkIHN0YXRlIHVudGlsIGZsdXNoKCkgaXMgY2FsbGVkLgorICBjbGFzcyBMaXZlUmFuZ2VVcGRhdGVyIHsKKyAgICBMaXZlUmFuZ2UgKkxSOworICAgIFNsb3RJbmRleCBMYXN0U3RhcnQ7CisgICAgTGl2ZVJhbmdlOjppdGVyYXRvciBXcml0ZUk7CisgICAgTGl2ZVJhbmdlOjppdGVyYXRvciBSZWFkSTsKKyAgICBTbWFsbFZlY3RvcjxMaXZlUmFuZ2U6OlNlZ21lbnQsIDE2PiBTcGlsbHM7CisgICAgdm9pZCBtZXJnZVNwaWxscygpOworCisgIHB1YmxpYzoKKyAgICAvLy8gQ3JlYXRlIGEgTGl2ZVJhbmdlVXBkYXRlciBmb3IgYWRkaW5nIHNlZ21lbnRzIHRvIExSLgorICAgIC8vLyBMUiB3aWxsIHRlbXBvcmFyaWx5IGJlIGluIGFuIGludmFsaWQgc3RhdGUgdW50aWwgZmx1c2goKSBpcyBjYWxsZWQuCisgICAgTGl2ZVJhbmdlVXBkYXRlcihMaXZlUmFuZ2UgKmxyID0gbnVsbHB0cikgOiBMUihscikge30KKworICAgIH5MaXZlUmFuZ2VVcGRhdGVyKCkgeyBmbHVzaCgpOyB9CisKKyAgICAvLy8gQWRkIGEgc2VnbWVudCB0byBMUiBhbmQgY29hbGVzY2Ugd2hlbiBwb3NzaWJsZSwganVzdCBsaWtlCisgICAgLy8vIExSLmFkZFNlZ21lbnQoKS4gU2VnbWVudHMgc2hvdWxkIGJlIGFkZGVkIGluIGluY3JlYXNpbmcgc3RhcnQgb3JkZXIgZm9yCisgICAgLy8vIGJlc3QgcGVyZm9ybWFuY2UuCisgICAgdm9pZCBhZGQoTGl2ZVJhbmdlOjpTZWdtZW50KTsKKworICAgIHZvaWQgYWRkKFNsb3RJbmRleCBTdGFydCwgU2xvdEluZGV4IEVuZCwgVk5JbmZvICpWTkkpIHsKKyAgICAgIGFkZChMaXZlUmFuZ2U6OlNlZ21lbnQoU3RhcnQsIEVuZCwgVk5JKSk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBMUiBpcyBjdXJyZW50bHkgaW4gYW4gaW52YWxpZCBzdGF0ZSwgYW5kIGZsdXNoKCkKKyAgICAvLy8gbmVlZHMgdG8gYmUgY2FsbGVkLgorICAgIGJvb2wgaXNEaXJ0eSgpIGNvbnN0IHsgcmV0dXJuIExhc3RTdGFydC5pc1ZhbGlkKCk7IH0KKworICAgIC8vLyBGbHVzaCB0aGUgdXBkYXRlciBzdGF0ZSB0byBMUiBzbyBpdCBpcyB2YWxpZCBhbmQgY29udGFpbnMgYWxsIGFkZGVkCisgICAgLy8vIHNlZ21lbnRzLgorICAgIHZvaWQgZmx1c2goKTsKKworICAgIC8vLyBTZWxlY3QgYSBkaWZmZXJlbnQgZGVzdGluYXRpb24gbGl2ZSByYW5nZS4KKyAgICB2b2lkIHNldERlc3QoTGl2ZVJhbmdlICpscikgeworICAgICAgaWYgKExSICE9IGxyICYmIGlzRGlydHkoKSkKKyAgICAgICAgZmx1c2goKTsKKyAgICAgIExSID0gbHI7CisgICAgfQorCisgICAgLy8vIEdldCB0aGUgY3VycmVudCBkZXN0aW5hdGlvbiBsaXZlIHJhbmdlLgorICAgIExpdmVSYW5nZSAqZ2V0RGVzdCgpIGNvbnN0IHsgcmV0dXJuIExSOyB9CisKKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgICB2b2lkIHByaW50KHJhd19vc3RyZWFtJikgY29uc3Q7CisgIH07CisKKyAgaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTGl2ZVJhbmdlVXBkYXRlciAmWCkgeworICAgIFgucHJpbnQoT1MpOworICAgIHJldHVybiBPUzsKKyAgfQorCisgIC8vLyBDb25uZWN0ZWRWTkluZm9FcUNsYXNzZXMgLSBIZWxwZXIgY2xhc3MgdGhhdCBjYW4gZGl2aWRlIFZOSW5mb3MgaW4gYQorICAvLy8gTGl2ZUludGVydmFsIGludG8gZXF1aXZhbGVuY2UgY2xhc2VzIG9mIGNvbm5lY3RlZCBjb21wb25lbnRzLiBBCisgIC8vLyBMaXZlSW50ZXJ2YWwgdGhhdCBoYXMgbXVsdGlwbGUgY29ubmVjdGVkIGNvbXBvbmVudHMgY2FuIGJlIGJyb2tlbiBpbnRvCisgIC8vLyBtdWx0aXBsZSBMaXZlSW50ZXJ2YWxzLgorICAvLy8KKyAgLy8vIEdpdmVuIGEgTGl2ZUludGVydmFsIHRoYXQgbWF5IGhhdmUgbXVsdGlwbGUgY29ubmVjdGVkIGNvbXBvbmVudHMsIHJ1bjoKKyAgLy8vCisgIC8vLyAgIHVuc2lnbmVkIG51bUNvbXBzID0gQ29uRVEuQ2xhc3NpZnkoTEkpOworICAvLy8gICBpZiAobnVtQ29tcHMgPiAxKSB7CisgIC8vLyAgICAgLy8gYWxsb2NhdGUgbnVtQ29tcHMtMSBuZXcgTGl2ZUludGVydmFscyBpbnRvIExJU1sxLi5dCisgIC8vLyAgICAgQ29uRVEuRGlzdHJpYnV0ZShMSVMpOworICAvLy8gfQorCisgIGNsYXNzIENvbm5lY3RlZFZOSW5mb0VxQ2xhc3NlcyB7CisgICAgTGl2ZUludGVydmFscyAmTElTOworICAgIEludEVxQ2xhc3NlcyBFcUNsYXNzOworCisgIHB1YmxpYzoKKyAgICBleHBsaWNpdCBDb25uZWN0ZWRWTkluZm9FcUNsYXNzZXMoTGl2ZUludGVydmFscyAmbGlzKSA6IExJUyhsaXMpIHt9CisKKyAgICAvLy8gQ2xhc3NpZnkgdGhlIHZhbHVlcyBpbiBccCBMUiBpbnRvIGNvbm5lY3RlZCBjb21wb25lbnRzLgorICAgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgY29ubmVjdGVkIGNvbXBvbmVudHMuCisgICAgdW5zaWduZWQgQ2xhc3NpZnkoY29uc3QgTGl2ZVJhbmdlICZMUik7CisKKyAgICAvLy8gZ2V0RXFDbGFzcyAtIENsYXNzaWZ5IGNyZWF0ZXMgZXF1aXZhbGVuY2UgY2xhc3NlcyBudW1iZXJlZCAwLi5OLiBSZXR1cm4KKyAgICAvLy8gdGhlIGVxdWl2YWxlbmNlIGNsYXNzIGFzc2lnbmVkIHRoZSBWTkkuCisgICAgdW5zaWduZWQgZ2V0RXFDbGFzcyhjb25zdCBWTkluZm8gKlZOSSkgY29uc3QgeyByZXR1cm4gRXFDbGFzc1tWTkktPmlkXTsgfQorCisgICAgLy8vIERpc3RyaWJ1dGUgdmFsdWVzIGluIFxwIExJIGludG8gYSBzZXBhcmF0ZSBMaXZlSW50ZXJ2YWxzCisgICAgLy8vIGZvciBlYWNoIGNvbm5lY3RlZCBjb21wb25lbnQuIExJViBtdXN0IGhhdmUgYW4gZW1wdHkgTGl2ZUludGVydmFsIGZvcgorICAgIC8vLyBlYWNoIGFkZGl0aW9uYWwgY29ubmVjdGVkIGNvbXBvbmVudC4gVGhlIGZpcnN0IGNvbm5lY3RlZCBjb21wb25lbnQgaXMKKyAgICAvLy8gbGVmdCBpbiBccCBMSS4KKyAgICB2b2lkIERpc3RyaWJ1dGUoTGl2ZUludGVydmFsICZMSSwgTGl2ZUludGVydmFsICpMSVZbXSwKKyAgICAgICAgICAgICAgICAgICAgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJKTsKKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9MSVZFSU5URVJWQUxfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVJbnRlcnZhbFVuaW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZUludGVydmFsVW5pb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOTIyZTU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVJbnRlcnZhbFVuaW9uLmgKQEAgLTAsMCArMSwxOTkgQEAKKy8vPT09LSBMaXZlSW50ZXJ2YWxVbmlvbi5oIC0gTGl2ZSBpbnRlcnZhbCB1bmlvbiBkYXRhIHN0cnVjdCAtLS0qLSBDKysgLSotLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTGl2ZUludGVydmFsVW5pb24gaXMgYSB1bmlvbiBvZiBsaXZlIHNlZ21lbnRzIGFjcm9zcyBtdWx0aXBsZSBsaXZlIHZpcnR1YWwKKy8vIHJlZ2lzdGVycy4gVGhpcyBtYXkgYmUgdXNlZCBkdXJpbmcgY29hbGVzY2luZyB0byByZXByZXNlbnQgYSBjb25ncnVlbmNlCisvLyBjbGFzcywgb3IgZHVyaW5nIHJlZ2lzdGVyIGFsbG9jYXRpb24gdG8gbW9kZWwgbGl2ZW5lc3Mgb2YgYSBwaHlzaWNhbAorLy8gcmVnaXN0ZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTElWRUlOVEVSVkFMVU5JT05fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTElWRUlOVEVSVkFMVU5JT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvSW50ZXJ2YWxNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWwuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2xvdEluZGV4ZXMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGxpbWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKKworI2lmbmRlZiBOREVCVUcKKy8vIGZvcndhcmQgZGVjbGFyYXRpb24KK3RlbXBsYXRlIDx1bnNpZ25lZCBFbGVtZW50PiBjbGFzcyBTcGFyc2VCaXRWZWN0b3I7CisKK3VzaW5nIExpdmVWaXJ0UmVnQml0U2V0ID0gU3BhcnNlQml0VmVjdG9yPDEyOD47CisjZW5kaWYKKworLy8vIFVuaW9uIG9mIGxpdmUgaW50ZXJ2YWxzIHRoYXQgYXJlIHN0cm9uZyBjYW5kaWRhdGVzIGZvciBjb2FsZXNjaW5nIGludG8gYQorLy8vIHNpbmdsZSByZWdpc3RlciAoZWl0aGVyIHBoeXNpY2FsIG9yIHZpcnR1YWwgZGVwZW5kaW5nIG9uIHRoZSBjb250ZXh0KS4gIFdlCisvLy8gZXhwZWN0IHRoZSBjb25zdGl0dWVudCBsaXZlIGludGVydmFscyB0byBiZSBkaXNqb2ludCwgYWx0aG91Z2ggd2UgbWF5CisvLy8gZXZlbnR1YWxseSBtYWtlIGV4Y2VwdGlvbnMgdG8gaGFuZGxlIHZhbHVlLWJhc2VkIGludGVyZmVyZW5jZS4KK2NsYXNzIExpdmVJbnRlcnZhbFVuaW9uIHsKKyAgLy8gQSBzZXQgb2YgbGl2ZSB2aXJ0dWFsIHJlZ2lzdGVyIHNlZ21lbnRzIHRoYXQgc3VwcG9ydHMgZmFzdCBpbnNlcnRpb24sCisgIC8vIGludGVyc2VjdGlvbiwgYW5kIHJlbW92YWwuCisgIC8vIE1hcHBpbmcgU2xvdEluZGV4IGludGVydmFscyB0byB2aXJ0dWFsIHJlZ2lzdGVyIG51bWJlcnMuCisgIHVzaW5nIExpdmVTZWdtZW50cyA9IEludGVydmFsTWFwPFNsb3RJbmRleCwgTGl2ZUludGVydmFsKj47CisKK3B1YmxpYzoKKyAgLy8gU2VnbWVudEl0ZXIgY2FuIGFkdmFuY2UgdG8gdGhlIG5leHQgc2VnbWVudCBvcmRlcmVkIGJ5IHN0YXJ0aW5nIHBvc2l0aW9uCisgIC8vIHdoaWNoIG1heSBiZWxvbmcgdG8gYSBkaWZmZXJlbnQgbGl2ZSB2aXJ0dWFsIHJlZ2lzdGVyLiBXZSBhbHNvIG11c3QgYmUgYWJsZQorICAvLyB0byByZWFjaCB0aGUgY3VycmVudCBzZWdtZW50J3MgY29udGFpbmluZyB2aXJ0dWFsIHJlZ2lzdGVyLgorICB1c2luZyBTZWdtZW50SXRlciA9IExpdmVTZWdtZW50czo6aXRlcmF0b3I7CisKKyAgLy8vIENvbnN0IHZlcnNpb24gb2YgU2VnbWVudEl0ZXIuCisgIHVzaW5nIENvbnN0U2VnbWVudEl0ZXIgPSBMaXZlU2VnbWVudHM6OmNvbnN0X2l0ZXJhdG9yOworCisgIC8vIExpdmVJbnRlcnZhbFVuaW9ucyBzaGFyZSBhbiBleHRlcm5hbCBhbGxvY2F0b3IuCisgIHVzaW5nIEFsbG9jYXRvciA9IExpdmVTZWdtZW50czo6QWxsb2NhdG9yOworCitwcml2YXRlOgorICB1bnNpZ25lZCBUYWcgPSAwOyAgICAgICAvLyB1bmlxdWUgdGFnIGZvciBjdXJyZW50IGNvbnRlbnRzLgorICBMaXZlU2VnbWVudHMgU2VnbWVudHM7ICAvLyB1bmlvbiBvZiB2aXJ0dWFsIHJlZyBzZWdtZW50cworCitwdWJsaWM6CisgIGV4cGxpY2l0IExpdmVJbnRlcnZhbFVuaW9uKEFsbG9jYXRvciAmYSkgOiBTZWdtZW50cyhhKSB7fQorCisgIC8vIEl0ZXJhdGUgb3ZlciBhbGwgc2VnbWVudHMgaW4gdGhlIHVuaW9uIG9mIGxpdmUgdmlydHVhbCByZWdpc3RlcnMgb3JkZXJlZAorICAvLyBieSB0aGVpciBzdGFydGluZyBwb3NpdGlvbi4KKyAgU2VnbWVudEl0ZXIgYmVnaW4oKSB7IHJldHVybiBTZWdtZW50cy5iZWdpbigpOyB9CisgIFNlZ21lbnRJdGVyIGVuZCgpIHsgcmV0dXJuIFNlZ21lbnRzLmVuZCgpOyB9CisgIFNlZ21lbnRJdGVyIGZpbmQoU2xvdEluZGV4IHgpIHsgcmV0dXJuIFNlZ21lbnRzLmZpbmQoeCk7IH0KKyAgQ29uc3RTZWdtZW50SXRlciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFNlZ21lbnRzLmJlZ2luKCk7IH0KKyAgQ29uc3RTZWdtZW50SXRlciBlbmQoKSBjb25zdCB7IHJldHVybiBTZWdtZW50cy5lbmQoKTsgfQorICBDb25zdFNlZ21lbnRJdGVyIGZpbmQoU2xvdEluZGV4IHgpIGNvbnN0IHsgcmV0dXJuIFNlZ21lbnRzLmZpbmQoeCk7IH0KKworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gU2VnbWVudHMuZW1wdHkoKTsgfQorICBTbG90SW5kZXggc3RhcnRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIFNlZ21lbnRzLnN0YXJ0KCk7IH0KKworICAvLyBQcm92aWRlIHB1YmxpYyBhY2Nlc3MgdG8gdGhlIHVuZGVybHlpbmcgbWFwIHRvIGFsbG93IG92ZXJsYXAgaXRlcmF0aW9uLgorICB1c2luZyBNYXAgPSBMaXZlU2VnbWVudHM7CisgIGNvbnN0IE1hcCAmZ2V0TWFwKCkgY29uc3QgeyByZXR1cm4gU2VnbWVudHM7IH0KKworICAvLy8gZ2V0VGFnIC0gUmV0dXJuIGFuIG9wYXF1ZSB0YWcgcmVwcmVzZW50aW5nIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB1bmlvbi4KKyAgdW5zaWduZWQgZ2V0VGFnKCkgY29uc3QgeyByZXR1cm4gVGFnOyB9CisKKyAgLy8vIGNoYW5nZWRTaW5jZSAtIFJldHVybiB0cnVlIGlmIHRoZSB1bmlvbiBjaGFuZ2Ugc2luY2UgZ2V0VGFnIHJldHVybmVkIHRhZy4KKyAgYm9vbCBjaGFuZ2VkU2luY2UodW5zaWduZWQgdGFnKSBjb25zdCB7IHJldHVybiB0YWcgIT0gVGFnOyB9CisKKyAgLy8gQWRkIGEgbGl2ZSB2aXJ0dWFsIHJlZ2lzdGVyIHRvIHRoaXMgdW5pb24gYW5kIG1lcmdlIGl0cyBzZWdtZW50cy4KKyAgdm9pZCB1bmlmeShMaXZlSW50ZXJ2YWwgJlZpcnRSZWcsIGNvbnN0IExpdmVSYW5nZSAmUmFuZ2UpOworCisgIC8vIFJlbW92ZSBhIGxpdmUgdmlydHVhbCByZWdpc3RlcidzIHNlZ21lbnRzIGZyb20gdGhpcyB1bmlvbi4KKyAgdm9pZCBleHRyYWN0KExpdmVJbnRlcnZhbCAmVmlydFJlZywgY29uc3QgTGl2ZVJhbmdlICZSYW5nZSk7CisKKyAgLy8gUmVtb3ZlIGFsbCBpbnNlcnRlZCB2aXJ0dWFsIHJlZ2lzdGVycy4KKyAgdm9pZCBjbGVhcigpIHsgU2VnbWVudHMuY2xlYXIoKTsgKytUYWc7IH0KKworICAvLyBQcmludCB1bmlvbiwgdXNpbmcgVFJJIHRvIHRyYW5zbGF0ZSByZWdpc3RlciBuYW1lcworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0OworCisjaWZuZGVmIE5ERUJVRworICAvLyBWZXJpZnkgdGhlIGxpdmUgaW50ZXJ2YWxzIGluIHRoaXMgdW5pb24gYW5kIGFkZCB0aGVtIHRvIHRoZSB2aXNpdGVkIHNldC4KKyAgdm9pZCB2ZXJpZnkoTGl2ZVZpcnRSZWdCaXRTZXQmIFZpc2l0ZWRWUmVncyk7CisjZW5kaWYKKworICAvLy8gUXVlcnkgaW50ZXJmZXJlbmNlcyBiZXR3ZWVuIGEgc2luZ2xlIGxpdmUgdmlydHVhbCByZWdpc3RlciBhbmQgYSBsaXZlCisgIC8vLyBpbnRlcnZhbCB1bmlvbi4KKyAgY2xhc3MgUXVlcnkgeworICAgIGNvbnN0IExpdmVJbnRlcnZhbFVuaW9uICpMaXZlVW5pb24gPSBudWxscHRyOworICAgIGNvbnN0IExpdmVSYW5nZSAqTFIgPSBudWxscHRyOworICAgIExpdmVSYW5nZTo6Y29uc3RfaXRlcmF0b3IgTFJJOyAgLy8vPCBjdXJyZW50IHBvc2l0aW9uIGluIExSCisgICAgQ29uc3RTZWdtZW50SXRlciBMaXZlVW5pb25JOyAgICAvLy88IGN1cnJlbnQgcG9zaXRpb24gaW4gTGl2ZVVuaW9uCisgICAgU21hbGxWZWN0b3I8TGl2ZUludGVydmFsKiw0PiBJbnRlcmZlcmluZ1ZSZWdzOworICAgIGJvb2wgQ2hlY2tlZEZpcnN0SW50ZXJmZXJlbmNlID0gZmFsc2U7CisgICAgYm9vbCBTZWVuQWxsSW50ZXJmZXJlbmNlcyA9IGZhbHNlOworICAgIHVuc2lnbmVkIFRhZyA9IDA7CisgICAgdW5zaWduZWQgVXNlclRhZyA9IDA7CisKKyAgICB2b2lkIHJlc2V0KHVuc2lnbmVkIE5ld1VzZXJUYWcsIGNvbnN0IExpdmVSYW5nZSAmTmV3TFIsCisgICAgICAgICAgICAgICBjb25zdCBMaXZlSW50ZXJ2YWxVbmlvbiAmTmV3TGl2ZVVuaW9uKSB7CisgICAgICBMaXZlVW5pb24gPSAmTmV3TGl2ZVVuaW9uOworICAgICAgTFIgPSAmTmV3TFI7CisgICAgICBJbnRlcmZlcmluZ1ZSZWdzLmNsZWFyKCk7CisgICAgICBDaGVja2VkRmlyc3RJbnRlcmZlcmVuY2UgPSBmYWxzZTsKKyAgICAgIFNlZW5BbGxJbnRlcmZlcmVuY2VzID0gZmFsc2U7CisgICAgICBUYWcgPSBOZXdMaXZlVW5pb24uZ2V0VGFnKCk7CisgICAgICBVc2VyVGFnID0gTmV3VXNlclRhZzsKKyAgICB9CisKKyAgcHVibGljOgorICAgIFF1ZXJ5KCkgPSBkZWZhdWx0OworICAgIFF1ZXJ5KGNvbnN0IExpdmVSYW5nZSAmTFIsIGNvbnN0IExpdmVJbnRlcnZhbFVuaW9uICZMSVUpOgorICAgICAgTGl2ZVVuaW9uKCZMSVUpLCBMUigmTFIpIHt9CisgICAgUXVlcnkoY29uc3QgUXVlcnkgJikgPSBkZWxldGU7CisgICAgUXVlcnkgJm9wZXJhdG9yPShjb25zdCBRdWVyeSAmKSA9IGRlbGV0ZTsKKworICAgIHZvaWQgaW5pdCh1bnNpZ25lZCBOZXdVc2VyVGFnLCBjb25zdCBMaXZlUmFuZ2UgJk5ld0xSLAorICAgICAgICAgICAgICBjb25zdCBMaXZlSW50ZXJ2YWxVbmlvbiAmTmV3TGl2ZVVuaW9uKSB7CisgICAgICBpZiAoVXNlclRhZyA9PSBOZXdVc2VyVGFnICYmIExSID09ICZOZXdMUiAmJiBMaXZlVW5pb24gPT0gJk5ld0xpdmVVbmlvbiAmJgorICAgICAgICAgICFOZXdMaXZlVW5pb24uY2hhbmdlZFNpbmNlKFRhZykpIHsKKyAgICAgICAgLy8gUmV0YWluIGNhY2hlZCByZXN1bHRzLCBlLmcuIGZpcnN0SW50ZXJmZXJlbmNlLgorICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICByZXNldChOZXdVc2VyVGFnLCBOZXdMUiwgTmV3TGl2ZVVuaW9uKTsKKyAgICB9CisKKyAgICAvLyBEb2VzIHRoaXMgbGl2ZSB2aXJ0dWFsIHJlZ2lzdGVyIGludGVyZmVyZSB3aXRoIHRoZSB1bmlvbj8KKyAgICBib29sIGNoZWNrSW50ZXJmZXJlbmNlKCkgeyByZXR1cm4gY29sbGVjdEludGVyZmVyaW5nVlJlZ3MoMSk7IH0KKworICAgIC8vIENvdW50IHRoZSB2aXJ0dWFsIHJlZ2lzdGVycyBpbiB0aGlzIHVuaW9uIHRoYXQgaW50ZXJmZXJlIHdpdGggdGhpcworICAgIC8vIHF1ZXJ5J3MgbGl2ZSB2aXJ0dWFsIHJlZ2lzdGVyLCB1cCB0byBtYXhJbnRlcmZlcmluZ1JlZ3MuCisgICAgdW5zaWduZWQgY29sbGVjdEludGVyZmVyaW5nVlJlZ3MoCisgICAgICAgIHVuc2lnbmVkIE1heEludGVyZmVyaW5nUmVncyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8dW5zaWduZWQ+OjptYXgoKSk7CisKKyAgICAvLyBXYXMgdGhpcyB2aXJ0dWFsIHJlZ2lzdGVyIHZpc2l0ZWQgZHVyaW5nIGNvbGxlY3RJbnRlcmZlcmluZ1ZSZWdzPworICAgIGJvb2wgaXNTZWVuSW50ZXJmZXJlbmNlKExpdmVJbnRlcnZhbCAqVlJlZykgY29uc3Q7CisKKyAgICAvLyBEaWQgY29sbGVjdEludGVyZmVyaW5nVlJlZ3MgY29sbGVjdCBhbGwgaW50ZXJmZXJlbmNlcz8KKyAgICBib29sIHNlZW5BbGxJbnRlcmZlcmVuY2VzKCkgY29uc3QgeyByZXR1cm4gU2VlbkFsbEludGVyZmVyZW5jZXM7IH0KKworICAgIC8vIFZlY3RvciBnZW5lcmF0ZWQgYnkgY29sbGVjdEludGVyZmVyaW5nVlJlZ3MuCisgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPExpdmVJbnRlcnZhbCo+ICZpbnRlcmZlcmluZ1ZSZWdzKCkgY29uc3QgeworICAgICAgcmV0dXJuIEludGVyZmVyaW5nVlJlZ3M7CisgICAgfQorICB9OworCisgIC8vIEFycmF5IG9mIExpdmVJbnRlcnZhbFVuaW9ucy4KKyAgY2xhc3MgQXJyYXkgeworICAgIHVuc2lnbmVkIFNpemUgPSAwOworICAgIExpdmVJbnRlcnZhbFVuaW9uICpMSVVzID0gbnVsbHB0cjsKKworICBwdWJsaWM6CisgICAgQXJyYXkoKSA9IGRlZmF1bHQ7CisgICAgfkFycmF5KCkgeyBjbGVhcigpOyB9CisKKyAgICAvLyBJbml0aWFsaXplIHRoZSBhcnJheSB0byBoYXZlIFNpemUgZW50cmllcy4KKyAgICAvLyBSZXVzZSBhbiBleGlzdGluZyBhbGxvY2F0aW9uIGlmIHRoZSBzaXplIG1hdGNoZXMuCisgICAgdm9pZCBpbml0KExpdmVJbnRlcnZhbFVuaW9uOjpBbGxvY2F0b3ImLCB1bnNpZ25lZCBTaXplKTsKKworICAgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBTaXplOyB9CisKKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICBMaXZlSW50ZXJ2YWxVbmlvbiYgb3BlcmF0b3JbXSh1bnNpZ25lZCBpZHgpIHsKKyAgICAgIGFzc2VydChpZHggPCAgU2l6ZSAmJiAiaWR4IG91dCBvZiBib3VuZHMiKTsKKyAgICAgIHJldHVybiBMSVVzW2lkeF07CisgICAgfQorCisgICAgY29uc3QgTGl2ZUludGVydmFsVW5pb24mIG9wZXJhdG9yW10odW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgICBhc3NlcnQoSWR4IDwgU2l6ZSAmJiAiSWR4IG91dCBvZiBib3VuZHMiKTsKKyAgICAgIHJldHVybiBMSVVzW0lkeF07CisgICAgfQorICB9OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9MSVZFSU5URVJWQUxVTklPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZUludGVydmFscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVJbnRlcnZhbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMTUwZjNjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVJbnRlcnZhbHMuaApAQCAtMCwwICsxLDQ4MSBAQAorLy89PT0tIExpdmVJbnRlcnZhbHMuaCAtIExpdmUgSW50ZXJ2YWwgQW5hbHlzaXMgLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUgVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIExpdmVJbnRlcnZhbCBhbmFseXNpcyBwYXNzLiAgR2l2ZW4gc29tZQorLy8vIG51bWJlcmluZyBvZiBlYWNoIHRoZSBtYWNoaW5lIGluc3RydWN0aW9ucyAoaW4gdGhpcyBpbXBsZW1lbnRpb24gZGVwdGgtZmlyc3QKKy8vLyBvcmRlcikgYW4gaW50ZXJ2YWwgW2ksIGopIGlzIHNhaWQgdG8gYmUgYSBsaXZlIGludGVydmFsIGZvciByZWdpc3RlciB2IGlmCisvLy8gdGhlcmUgaXMgbm8gaW5zdHJ1Y3Rpb24gd2l0aCBudW1iZXIgaicgPiBqIHN1Y2ggdGhhdCB2IGlzIGxpdmUgYXQgaicgYW5kCisvLy8gdGhlcmUgaXMgbm8gaW5zdHJ1Y3Rpb24gd2l0aCBudW1iZXIgaScgPCBpIHN1Y2ggdGhhdCB2IGlzIGxpdmUgYXQgaScuIEluCisvLy8gdGhpcyBpbXBsZW1lbnRhdGlvbiBpbnRlcnZhbHMgY2FuIGhhdmUgaG9sZXMsIGkuZS4gYW4gaW50ZXJ2YWwgbWlnaHQgbG9vaworLy8vIGxpa2UgWzEsMjApLCBbNTAsNjUpLCBbMTAwMCwxMDAxKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9MSVZFSU5URVJWQUxTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0xJVkVJTlRFUlZBTFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9JbmRleGVkTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTGl2ZUludGVydmFsLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2xvdEluZGV4ZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9MYW5lQml0bWFzay5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworZXh0ZXJuIGNsOjpvcHQ8Ym9vbD4gVXNlU2VnbWVudFNldEZvclBoeXNSZWdzOworCitjbGFzcyBCaXRWZWN0b3I7CitjbGFzcyBMaXZlUmFuZ2VDYWxjOworY2xhc3MgTWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mbzsKK2NsYXNzIE1hY2hpbmVEb21pbmF0b3JUcmVlOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworY2xhc3MgVmlydFJlZ01hcDsKKworICBjbGFzcyBMaXZlSW50ZXJ2YWxzIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICAgIE1hY2hpbmVGdW5jdGlvbiogTUY7CisgICAgTWFjaGluZVJlZ2lzdGVySW5mbyogTVJJOworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyogVFJJOworICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyogVElJOworICAgIEFsaWFzQW5hbHlzaXMgKkFBOworICAgIFNsb3RJbmRleGVzKiBJbmRleGVzOworICAgIE1hY2hpbmVEb21pbmF0b3JUcmVlICpEb21UcmVlID0gbnVsbHB0cjsKKyAgICBMaXZlUmFuZ2VDYWxjICpMUkNhbGMgPSBudWxscHRyOworCisgICAgLy8vIFNwZWNpYWwgcG9vbCBhbGxvY2F0b3IgZm9yIFZOSW5mbydzIChMaXZlSW50ZXJ2YWwgdmFsIykuCisgICAgVk5JbmZvOjpBbGxvY2F0b3IgVk5JbmZvQWxsb2NhdG9yOworCisgICAgLy8vIExpdmUgaW50ZXJ2YWwgcG9pbnRlcnMgZm9yIGFsbCB0aGUgdmlydHVhbCByZWdpc3RlcnMuCisgICAgSW5kZXhlZE1hcDxMaXZlSW50ZXJ2YWwqLCBWaXJ0UmVnMkluZGV4RnVuY3Rvcj4gVmlydFJlZ0ludGVydmFsczsKKworICAgIC8vLyBTb3J0ZWQgbGlzdCBvZiBpbnN0cnVjdGlvbnMgd2l0aCByZWdpc3RlciBtYXNrIG9wZXJhbmRzLiBBbHdheXMgdXNlIHRoZQorICAgIC8vLyAncicgc2xvdCwgUmVnTWFza3MgYXJlIG5vcm1hbCBjbG9iYmVycywgbm90IGVhcmx5IGNsb2JiZXJzLgorICAgIFNtYWxsVmVjdG9yPFNsb3RJbmRleCwgOD4gUmVnTWFza1Nsb3RzOworCisgICAgLy8vIFRoaXMgdmVjdG9yIGlzIHBhcmFsbGVsIHRvIFJlZ01hc2tTbG90cywgaXQgaG9sZHMgYSBwb2ludGVyIHRvIHRoZQorICAgIC8vLyBjb3JyZXNwb25kaW5nIHJlZ2lzdGVyIG1hc2suICBUaGlzIHBvaW50ZXIgY2FuIGJlIHJlY29tcHV0ZWQgYXM6CisgICAgLy8vCisgICAgLy8vICAgTUkgPSBJbmRleGVzLT5nZXRJbnN0cnVjdGlvbkZyb21JbmRleChSZWdNYXNrU2xvdFtOXSk7CisgICAgLy8vICAgdW5zaWduZWQgT3BOdW0gPSBmaW5kUmVnTWFza09wZXJhbmQoTUkpOworICAgIC8vLyAgIFJlZ01hc2tCaXRzW05dID0gTUktPmdldE9wZXJhbmQoT3BOdW0pLmdldFJlZ01hc2soKTsKKyAgICAvLy8KKyAgICAvLy8gVGhpcyBpcyBrZXB0IGluIGEgc2VwYXJhdGUgdmVjdG9yIHBhcnRseSBiZWNhdXNlIHNvbWUgc3RhbmRhcmQKKyAgICAvLy8gbGlicmFyaWVzIGRvbid0IHN1cHBvcnQgbG93ZXJfYm91bmQoKSB3aXRoIG1peGVkIG9iamVjdHMsIHBhcnRseSB0bworICAgIC8vLyBpbXByb3ZlIGxvY2FsaXR5IHdoZW4gc2VhcmNoaW5nIGluIFJlZ01hc2tTbG90cy4KKyAgICAvLy8gQWxzbyBzZWUgdGhlIGNvbW1lbnQgaW4gTGl2ZUludGVydmFsOjpmaW5kKCkuCisgICAgU21hbGxWZWN0b3I8Y29uc3QgdWludDMyX3QqLCA4PiBSZWdNYXNrQml0czsKKworICAgIC8vLyBGb3IgZWFjaCBiYXNpYyBibG9jayBudW1iZXIsIGtlZXAgKGJlZ2luLCBzaXplKSBwYWlycyBpbmRleGluZyBpbnRvIHRoZQorICAgIC8vLyBSZWdNYXNrU2xvdHMgYW5kIFJlZ01hc2tCaXRzIGFycmF5cy4KKyAgICAvLy8gTm90ZSB0aGF0IGJhc2ljIGJsb2NrIG51bWJlcnMgbWF5IG5vdCBiZSBsYXlvdXQgY29udGlndW91cywgdGhhdCdzIHdoeQorICAgIC8vLyB3ZSBjYW4ndCBqdXN0IGtlZXAgdHJhY2sgb2YgdGhlIGZpcnN0IHJlZ2lzdGVyIG1hc2sgaW4gZWFjaCBiYXNpYworICAgIC8vLyBibG9jay4KKyAgICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiwgOD4gUmVnTWFza0Jsb2NrczsKKworICAgIC8vLyBLZWVwcyBhIGxpdmUgcmFuZ2Ugc2V0IGZvciBlYWNoIHJlZ2lzdGVyIHVuaXQgdG8gdHJhY2sgZml4ZWQgcGh5c3JlZworICAgIC8vLyBpbnRlcmZlcmVuY2UuCisgICAgU21hbGxWZWN0b3I8TGl2ZVJhbmdlKiwgMD4gUmVnVW5pdFJhbmdlczsKKworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7CisKKyAgICBMaXZlSW50ZXJ2YWxzKCk7CisgICAgfkxpdmVJbnRlcnZhbHMoKSBvdmVycmlkZTsKKworICAgIC8vLyBDYWxjdWxhdGUgdGhlIHNwaWxsIHdlaWdodCB0byBhc3NpZ24gdG8gYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uCisgICAgc3RhdGljIGZsb2F0IGdldFNwaWxsV2VpZ2h0KGJvb2wgaXNEZWYsIGJvb2wgaXNVc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8gKk1CRkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAmSW5zdHIpOworCisgICAgLy8vIENhbGN1bGF0ZSB0aGUgc3BpbGwgd2VpZ2h0IHRvIGFzc2lnbiB0byBhIHNpbmdsZSBpbnN0cnVjdGlvbi4KKyAgICBzdGF0aWMgZmxvYXQgZ2V0U3BpbGxXZWlnaHQoYm9vbCBpc0RlZiwgYm9vbCBpc1VzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mbyAqTUJGSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQik7CisKKyAgICBMaXZlSW50ZXJ2YWwgJmdldEludGVydmFsKHVuc2lnbmVkIFJlZykgeworICAgICAgaWYgKGhhc0ludGVydmFsKFJlZykpCisgICAgICAgIHJldHVybiAqVmlydFJlZ0ludGVydmFsc1tSZWddOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gY3JlYXRlQW5kQ29tcHV0ZVZpcnRSZWdJbnRlcnZhbChSZWcpOworICAgIH0KKworICAgIGNvbnN0IExpdmVJbnRlcnZhbCAmZ2V0SW50ZXJ2YWwodW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgICByZXR1cm4gY29uc3RfY2FzdDxMaXZlSW50ZXJ2YWxzKj4odGhpcyktPmdldEludGVydmFsKFJlZyk7CisgICAgfQorCisgICAgYm9vbCBoYXNJbnRlcnZhbCh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICAgIHJldHVybiBWaXJ0UmVnSW50ZXJ2YWxzLmluQm91bmRzKFJlZykgJiYgVmlydFJlZ0ludGVydmFsc1tSZWddOworICAgIH0KKworICAgIC8vLyBJbnRlcnZhbCBjcmVhdGlvbi4KKyAgICBMaXZlSW50ZXJ2YWwgJmNyZWF0ZUVtcHR5SW50ZXJ2YWwodW5zaWduZWQgUmVnKSB7CisgICAgICBhc3NlcnQoIWhhc0ludGVydmFsKFJlZykgJiYgIkludGVydmFsIGFscmVhZHkgZXhpc3RzISIpOworICAgICAgVmlydFJlZ0ludGVydmFscy5ncm93KFJlZyk7CisgICAgICBWaXJ0UmVnSW50ZXJ2YWxzW1JlZ10gPSBjcmVhdGVJbnRlcnZhbChSZWcpOworICAgICAgcmV0dXJuICpWaXJ0UmVnSW50ZXJ2YWxzW1JlZ107CisgICAgfQorCisgICAgTGl2ZUludGVydmFsICZjcmVhdGVBbmRDb21wdXRlVmlydFJlZ0ludGVydmFsKHVuc2lnbmVkIFJlZykgeworICAgICAgTGl2ZUludGVydmFsICZMSSA9IGNyZWF0ZUVtcHR5SW50ZXJ2YWwoUmVnKTsKKyAgICAgIGNvbXB1dGVWaXJ0UmVnSW50ZXJ2YWwoTEkpOworICAgICAgcmV0dXJuIExJOworICAgIH0KKworICAgIC8vLyBJbnRlcnZhbCByZW1vdmFsLgorICAgIHZvaWQgcmVtb3ZlSW50ZXJ2YWwodW5zaWduZWQgUmVnKSB7CisgICAgICBkZWxldGUgVmlydFJlZ0ludGVydmFsc1tSZWddOworICAgICAgVmlydFJlZ0ludGVydmFsc1tSZWddID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLy8gR2l2ZW4gYSByZWdpc3RlciBhbmQgYW4gaW5zdHJ1Y3Rpb24sIGFkZHMgYSBsaXZlIHNlZ21lbnQgZnJvbSB0aGF0CisgICAgLy8vIGluc3RydWN0aW9uIHRvIHRoZSBlbmQgb2YgaXRzIE1CQi4KKyAgICBMaXZlSW50ZXJ2YWw6OlNlZ21lbnQgYWRkU2VnbWVudFRvRW5kT2ZCbG9jayh1bnNpZ25lZCByZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICZzdGFydEluc3QpOworCisgICAgLy8vIEFmdGVyIHJlbW92aW5nIHNvbWUgdXNlcyBvZiBhIHJlZ2lzdGVyLCBzaHJpbmsgaXRzIGxpdmUgcmFuZ2UgdG8ganVzdAorICAgIC8vLyB0aGUgcmVtYWluaW5nIHVzZXMuIFRoaXMgbWV0aG9kIGRvZXMgbm90IGNvbXB1dGUgcmVhY2hpbmcgZGVmcyBmb3IgbmV3CisgICAgLy8vIHVzZXMsIGFuZCBpdCBkb2Vzbid0IHJlbW92ZSBkZWFkIGRlZnMuCisgICAgLy8vIERlYWQgUEhJRGVmIHZhbHVlcyBhcmUgbWFya2VkIGFzIHVudXNlZC4gTmV3IGRlYWQgbWFjaGluZSBpbnN0cnVjdGlvbnMKKyAgICAvLy8gYXJlIGFkZGVkIHRvIHRoZSBkZWFkIHZlY3Rvci4gUmV0dXJucyB0cnVlIGlmIHRoZSBpbnRlcnZhbCBtYXkgaGF2ZSBiZWVuCisgICAgLy8vIHNlcGFyYXRlZCBpbnRvIG11bHRpcGxlIGNvbm5lY3RlZCBjb21wb25lbnRzLgorICAgIGJvb2wgc2hyaW5rVG9Vc2VzKExpdmVJbnRlcnZhbCAqbGksCisgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0cio+ICpkZWFkID0gbnVsbHB0cik7CisKKyAgICAvLy8gU3BlY2lhbGl6ZWQgdmVyc2lvbiBvZgorICAgIC8vLyBzaHJpbmtUb1VzZXMoTGl2ZUludGVydmFsICpsaSwgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0cio+ICpkZWFkKQorICAgIC8vLyB0aGF0IHdvcmtzIG9uIGEgc3VicmVnaXN0ZXIgbGl2ZSByYW5nZSBhbmQgb25seSBsb29rcyBhdCB1c2VzIG1hdGNoaW5nCisgICAgLy8vIHRoZSBsYW5lIG1hc2sgb2YgdGhlIHN1YnJlZ2lzdGVyIHJhbmdlLgorICAgIC8vLyBUaGlzIG1heSBsZWF2ZSB0aGUgc3VicmFuZ2UgZW1wdHkgd2hpY2ggbmVlZHMgdG8gYmUgY2xlYW5lZCB1cCB3aXRoCisgICAgLy8vIExpdmVJbnRlcnZhbDo6cmVtb3ZlRW1wdHlTdWJyYW5nZXMoKSBhZnRlcndhcmRzLgorICAgIHZvaWQgc2hyaW5rVG9Vc2VzKExpdmVJbnRlcnZhbDo6U3ViUmFuZ2UgJlNSLCB1bnNpZ25lZCBSZWcpOworCisgICAgLy8vIEV4dGVuZCB0aGUgbGl2ZSByYW5nZSBccCBMUiB0byByZWFjaCBhbGwgcG9pbnRzIGluIFxwIEluZGljZXMuIFRoZQorICAgIC8vLyBwb2ludHMgaW4gdGhlIFxwIEluZGljZXMgYXJyYXkgbXVzdCBiZSBqb2ludGx5IGRvbWluYXRlZCBieSB0aGUgdW5pb24KKyAgICAvLy8gb2YgdGhlIGV4aXN0aW5nIGRlZnMgaW4gXHAgTFIgYW5kIHBvaW50cyBpbiBccCBVbmRlZnMuCisgICAgLy8vCisgICAgLy8vIFBISS1kZWZzIGFyZSBhZGRlZCBhcyBuZWVkZWQgdG8gbWFpbnRhaW4gU1NBIGZvcm0uCisgICAgLy8vCisgICAgLy8vIElmIGEgU2xvdEluZGV4IGluIFxwIEluZGljZXMgaXMgdGhlIGVuZCBpbmRleCBvZiBhIGJhc2ljIGJsb2NrLCBccCBMUgorICAgIC8vLyB3aWxsIGJlIGV4dGVuZGVkIHRvIGJlIGxpdmUgb3V0IG9mIHRoZSBiYXNpYyBibG9jay4KKyAgICAvLy8gSWYgYSBTbG90SW5kZXggaW4gXHAgSW5kaWNlcyBpcyBqb2ludHkgZG9taW5hdGVkIG9ubHkgYnkgcG9pbnRzIGluCisgICAgLy8vIFxwIFVuZGVmcywgdGhlIGxpdmUgcmFuZ2Ugd2lsbCBub3QgYmUgZXh0ZW5kZWQgdG8gdGhhdCBwb2ludC4KKyAgICAvLy8KKyAgICAvLy8gU2VlIGFsc28gTGl2ZVJhbmdlQ2FsYzo6ZXh0ZW5kKCkuCisgICAgdm9pZCBleHRlbmRUb0luZGljZXMoTGl2ZVJhbmdlICZMUiwgQXJyYXlSZWY8U2xvdEluZGV4PiBJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNsb3RJbmRleD4gVW5kZWZzKTsKKworICAgIHZvaWQgZXh0ZW5kVG9JbmRpY2VzKExpdmVSYW5nZSAmTFIsIEFycmF5UmVmPFNsb3RJbmRleD4gSW5kaWNlcykgeworICAgICAgZXh0ZW5kVG9JbmRpY2VzKExSLCBJbmRpY2VzLCAvKlVuZGVmcz0qL3t9KTsKKyAgICB9CisKKyAgICAvLy8gSWYgXHAgTFIgaGFzIGEgbGl2ZSB2YWx1ZSBhdCBccCBLaWxsLCBwcnVuZSBpdHMgbGl2ZSByYW5nZSBieSByZW1vdmluZworICAgIC8vLyBhbnkgbGl2ZW5lc3MgcmVhY2hhYmxlIGZyb20gS2lsbC4gQWRkIGxpdmUgcmFuZ2UgZW5kIHBvaW50cyB0bworICAgIC8vLyBFbmRQb2ludHMgc3VjaCB0aGF0IGV4dGVuZFRvSW5kaWNlcyhMSSwgRW5kUG9pbnRzKSB3aWxsIHJlY29uc3RydWN0IHRoZQorICAgIC8vLyB2YWx1ZSdzIGxpdmUgcmFuZ2UuCisgICAgLy8vCisgICAgLy8vIENhbGxpbmcgcHJ1bmVWYWx1ZSgpIGFuZCBleHRlbmRUb0luZGljZXMoKSBjYW4gYmUgdXNlZCB0byByZWNvbnN0cnVjdAorICAgIC8vLyBTU0EgZm9ybSBhZnRlciBhZGRpbmcgZGVmcyB0byBhIHZpcnR1YWwgcmVnaXN0ZXIuCisgICAgdm9pZCBwcnVuZVZhbHVlKExpdmVSYW5nZSAmTFIsIFNsb3RJbmRleCBLaWxsLAorICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U2xvdEluZGV4PiAqRW5kUG9pbnRzKTsKKworICAgIC8vLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgdXNlZC4gSXRzIGludGVuZCBpcyB0byB0ZWxsIHlvdSB0aGF0CisgICAgLy8vIHlvdSBhcmUgZG9pbmcgc29tZXRoaW5nIHdyb25nIGlmIHlvdSBjYWxsIHBydXZlVmFsdWUgZGlyZWN0bHkgb24gYQorICAgIC8vLyBMaXZlSW50ZXJ2YWwuIEluZGVlZCwgeW91IGFyZSBzdXBwb3NlZCB0byBjYWxsIHBydW5lVmFsdWUgb24gdGhlIG1haW4KKyAgICAvLy8gTGl2ZVJhbmdlIGFuZCBhbGwgdGhlIExpdmVSYW5nZSBvZiB0aGUgc3VicmFuZ2VzIGlmIGFueS4KKyAgICBMTFZNX0FUVFJJQlVURV9VTlVTRUQgdm9pZCBwcnVuZVZhbHVlKExpdmVJbnRlcnZhbCAmLCBTbG90SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U2xvdEluZGV4PiAqKSB7CisgICAgICBsbHZtX3VucmVhY2hhYmxlKAorICAgICAgICAgICJVc2UgcHJ1bmVWYWx1ZSBvbiB0aGUgbWFpbiBMaXZlUmFuZ2UgYW5kIG9uIGVhY2ggc3VicmFuZ2UiKTsKKyAgICB9CisKKyAgICBTbG90SW5kZXhlcyAqZ2V0U2xvdEluZGV4ZXMoKSBjb25zdCB7CisgICAgICByZXR1cm4gSW5kZXhlczsKKyAgICB9CisKKyAgICBBbGlhc0FuYWx5c2lzICpnZXRBbGlhc0FuYWx5c2lzKCkgY29uc3QgeworICAgICAgcmV0dXJuIEFBOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RyIGhhcyBiZWVuIHJlbW92ZWQgb3Igd2FzCisgICAgLy8vIG5ldmVyIGVudGVyZWQgaW4gdGhlIG1hcC4KKyAgICBib29sIGlzTm90SW5NSU1hcChjb25zdCBNYWNoaW5lSW5zdHIgJkluc3RyKSBjb25zdCB7CisgICAgICByZXR1cm4gIUluZGV4ZXMtPmhhc0luZGV4KEluc3RyKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgYmFzZSBpbmRleCBvZiB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24uCisgICAgU2xvdEluZGV4IGdldEluc3RydWN0aW9uSW5kZXgoY29uc3QgTWFjaGluZUluc3RyICZJbnN0cikgY29uc3QgeworICAgICAgcmV0dXJuIEluZGV4ZXMtPmdldEluc3RydWN0aW9uSW5kZXgoSW5zdHIpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBpbnN0cnVjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGluZGV4LgorICAgIE1hY2hpbmVJbnN0ciogZ2V0SW5zdHJ1Y3Rpb25Gcm9tSW5kZXgoU2xvdEluZGV4IGluZGV4KSBjb25zdCB7CisgICAgICByZXR1cm4gSW5kZXhlcy0+Z2V0SW5zdHJ1Y3Rpb25Gcm9tSW5kZXgoaW5kZXgpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdGhlIGZpcnN0IGluZGV4IGluIHRoZSBnaXZlbiBiYXNpYyBibG9jay4KKyAgICBTbG90SW5kZXggZ2V0TUJCU3RhcnRJZHgoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKm1iYikgY29uc3QgeworICAgICAgcmV0dXJuIEluZGV4ZXMtPmdldE1CQlN0YXJ0SWR4KG1iYik7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0aGUgbGFzdCBpbmRleCBpbiB0aGUgZ2l2ZW4gYmFzaWMgYmxvY2suCisgICAgU2xvdEluZGV4IGdldE1CQkVuZElkeChjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqbWJiKSBjb25zdCB7CisgICAgICByZXR1cm4gSW5kZXhlcy0+Z2V0TUJCRW5kSWR4KG1iYik7CisgICAgfQorCisgICAgYm9vbCBpc0xpdmVJblRvTUJCKGNvbnN0IExpdmVSYW5nZSAmTFIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICptYmIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMUi5saXZlQXQoZ2V0TUJCU3RhcnRJZHgobWJiKSk7CisgICAgfQorCisgICAgYm9vbCBpc0xpdmVPdXRPZk1CQihjb25zdCBMaXZlUmFuZ2UgJkxSLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKm1iYikgY29uc3QgeworICAgICAgcmV0dXJuIExSLmxpdmVBdChnZXRNQkJFbmRJZHgobWJiKS5nZXRQcmV2U2xvdCgpKTsKKyAgICB9CisKKyAgICBNYWNoaW5lQmFzaWNCbG9jayogZ2V0TUJCRnJvbUluZGV4KFNsb3RJbmRleCBpbmRleCkgY29uc3QgeworICAgICAgcmV0dXJuIEluZGV4ZXMtPmdldE1CQkZyb21JbmRleChpbmRleCk7CisgICAgfQorCisgICAgdm9pZCBpbnNlcnRNQkJJbk1hcHMoTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgeworICAgICAgSW5kZXhlcy0+aW5zZXJ0TUJCSW5NYXBzKE1CQik7CisgICAgICBhc3NlcnQodW5zaWduZWQoTUJCLT5nZXROdW1iZXIoKSkgPT0gUmVnTWFza0Jsb2Nrcy5zaXplKCkgJiYKKyAgICAgICAgICAgICAiQmxvY2tzIG11c3QgYmUgYWRkZWQgaW4gb3JkZXIuIik7CisgICAgICBSZWdNYXNrQmxvY2tzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihSZWdNYXNrU2xvdHMuc2l6ZSgpLCAwKSk7CisgICAgfQorCisgICAgU2xvdEluZGV4IEluc2VydE1hY2hpbmVJbnN0ckluTWFwcyhNYWNoaW5lSW5zdHIgJk1JKSB7CisgICAgICByZXR1cm4gSW5kZXhlcy0+aW5zZXJ0TWFjaGluZUluc3RySW5NYXBzKE1JKTsKKyAgICB9CisKKyAgICB2b2lkIEluc2VydE1hY2hpbmVJbnN0clJhbmdlSW5NYXBzKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEUpIHsKKyAgICAgIGZvciAoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkgPSBCOyBJICE9IEU7ICsrSSkKKyAgICAgICAgSW5kZXhlcy0+aW5zZXJ0TWFjaGluZUluc3RySW5NYXBzKCpJKTsKKyAgICB9CisKKyAgICB2b2lkIFJlbW92ZU1hY2hpbmVJbnN0ckZyb21NYXBzKE1hY2hpbmVJbnN0ciAmTUkpIHsKKyAgICAgIEluZGV4ZXMtPnJlbW92ZU1hY2hpbmVJbnN0ckZyb21NYXBzKE1JKTsKKyAgICB9CisKKyAgICBTbG90SW5kZXggUmVwbGFjZU1hY2hpbmVJbnN0ckluTWFwcyhNYWNoaW5lSW5zdHIgJk1JLCBNYWNoaW5lSW5zdHIgJk5ld01JKSB7CisgICAgICByZXR1cm4gSW5kZXhlcy0+cmVwbGFjZU1hY2hpbmVJbnN0ckluTWFwcyhNSSwgTmV3TUkpOworICAgIH0KKworICAgIFZOSW5mbzo6QWxsb2NhdG9yJiBnZXRWTkluZm9BbGxvY2F0b3IoKSB7IHJldHVybiBWTkluZm9BbGxvY2F0b3I7IH0KKworICAgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGU7CisKKyAgICAvLy8gUGFzcyBlbnRyeSBwb2ludDsgQ2FsY3VsYXRlcyBMaXZlSW50ZXJ2YWxzLgorICAgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uJikgb3ZlcnJpZGU7CisKKyAgICAvLy8gSW1wbGVtZW50IHRoZSBkdW1wIG1ldGhvZC4KKyAgICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPLCBjb25zdCBNb2R1bGUqID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLy8gSWYgTEkgaXMgY29uZmluZWQgdG8gYSBzaW5nbGUgYmFzaWMgYmxvY2ssIHJldHVybiBhIHBvaW50ZXIgdG8gdGhhdAorICAgIC8vLyBibG9jay4gIElmIExJIGlzIGxpdmUgaW4gdG8gb3Igb3V0IG9mIGFueSBibG9jaywgcmV0dXJuIE5VTEwuCisgICAgTWFjaGluZUJhc2ljQmxvY2sgKmludGVydmFsSXNJbk9uZU1CQihjb25zdCBMaXZlSW50ZXJ2YWwgJkxJKSBjb25zdDsKKworICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgVk5JIGlzIGtpbGxlZCBieSBhbnkgUEhJLWRlZiB2YWx1ZXMgaW4gTEkuCisgICAgLy8vIFRoaXMgbWF5IGNvbnNlcnZhdGl2ZWx5IHJldHVybiB0cnVlIHRvIGF2b2lkIGV4cGVuc2l2ZSBjb21wdXRhdGlvbnMuCisgICAgYm9vbCBoYXNQSElLaWxsKGNvbnN0IExpdmVJbnRlcnZhbCAmTEksIGNvbnN0IFZOSW5mbyAqVk5JKSBjb25zdDsKKworICAgIC8vLyBBZGQga2lsbCBmbGFncyB0byBhbnkgaW5zdHJ1Y3Rpb24gdGhhdCBraWxscyBhIHZpcnR1YWwgcmVnaXN0ZXIuCisgICAgdm9pZCBhZGRLaWxsRmxhZ3MoY29uc3QgVmlydFJlZ01hcCopOworCisgICAgLy8vIENhbGwgdGhpcyBtZXRob2QgdG8gbm90aWZ5IExpdmVJbnRlcnZhbHMgdGhhdCBpbnN0cnVjdGlvbiBccCBNSSBoYXMgYmVlbgorICAgIC8vLyBtb3ZlZCB3aXRoaW4gYSBiYXNpYyBibG9jay4gVGhpcyB3aWxsIHVwZGF0ZSB0aGUgbGl2ZSBpbnRlcnZhbHMgZm9yIGFsbAorICAgIC8vLyBvcGVyYW5kcyBvZiBccCBNSS4gTW92ZXMgYmV0d2VlbiBiYXNpYyBibG9ja3MgYXJlIG5vdCBzdXBwb3J0ZWQuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBVcGRhdGVGbGFncyBVcGRhdGUgbGl2ZSBpbnRlcnZhbHMgZm9yIG5vbmFsbG9jYXRhYmxlIHBoeXNyZWdzLgorICAgIHZvaWQgaGFuZGxlTW92ZShNYWNoaW5lSW5zdHIgJk1JLCBib29sIFVwZGF0ZUZsYWdzID0gZmFsc2UpOworCisgICAgLy8vIFVwZGF0ZSBpbnRlcnZhbHMgZm9yIG9wZXJhbmRzIG9mIFxwIE1JIHNvIHRoYXQgdGhleSBiZWdpbi9lbmQgb24gdGhlCisgICAgLy8vIFNsb3RJbmRleCBmb3IgXHAgQnVuZGxlU3RhcnQuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBVcGRhdGVGbGFncyBVcGRhdGUgbGl2ZSBpbnRlcnZhbHMgZm9yIG5vbmFsbG9jYXRhYmxlIHBoeXNyZWdzLgorICAgIC8vLworICAgIC8vLyBSZXF1aXJlcyBNSSBhbmQgQnVuZGxlU3RhcnQgdG8gaGF2ZSBTbG90SW5kZXhlcywgYW5kIGFzc3VtZXMKKyAgICAvLy8gZXhpc3RpbmcgbGl2ZW5lc3MgaXMgYWNjdXJhdGUuIEJ1bmRsZVN0YXJ0IHNob3VsZCBiZSB0aGUgZmlyc3QKKyAgICAvLy8gaW5zdHJ1Y3Rpb24gaW4gdGhlIEJ1bmRsZS4KKyAgICB2b2lkIGhhbmRsZU1vdmVJbnRvQnVuZGxlKE1hY2hpbmVJbnN0ciAmTUksIE1hY2hpbmVJbnN0ciAmQnVuZGxlU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVwZGF0ZUZsYWdzID0gZmFsc2UpOworCisgICAgLy8vIFVwZGF0ZSBsaXZlIGludGVydmFscyBmb3IgaW5zdHJ1Y3Rpb25zIGluIGEgcmFuZ2Ugb2YgaXRlcmF0b3JzLiBJdCBpcworICAgIC8vLyBpbnRlbmRlZCBmb3IgdXNlIGFmdGVyIHRhcmdldCBob29rcyB0aGF0IG1heSBpbnNlcnQgb3IgcmVtb3ZlCisgICAgLy8vIGluc3RydWN0aW9ucywgYW5kIGlzIG9ubHkgZWZmaWNpZW50IGZvciBhIHNtYWxsIG51bWJlciBvZiBpbnN0cnVjdGlvbnMuCisgICAgLy8vCisgICAgLy8vIE9yaWdSZWdzIGlzIGEgdmVjdG9yIG9mIHJlZ2lzdGVycyB0aGF0IHdlcmUgb3JpZ2luYWxseSB1c2VkIGJ5IHRoZQorICAgIC8vLyBpbnN0cnVjdGlvbnMgaW4gdGhlIHJhbmdlIGJldHdlZW4gdGhlIHR3byBpdGVyYXRvcnMuCisgICAgLy8vCisgICAgLy8vIEN1cnJlbnRseSwgdGhlIG9ubHkgb25seSBjaGFuZ2VzIHRoYXQgYXJlIHN1cHBvcnRlZCBhcmUgc2ltcGxlIHJlbW92YWwKKyAgICAvLy8gYW5kIGFkZGl0aW9uIG9mIHVzZXMuCisgICAgdm9pZCByZXBhaXJJbnRlcnZhbHNJblJhbmdlKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IE9yaWdSZWdzKTsKKworICAgIC8vIFJlZ2lzdGVyIG1hc2sgZnVuY3Rpb25zLgorICAgIC8vCisgICAgLy8gTWFjaGluZSBpbnN0cnVjdGlvbnMgbWF5IHVzZSBhIHJlZ2lzdGVyIG1hc2sgb3BlcmFuZCB0byBpbmRpY2F0ZSB0aGF0IGEKKyAgICAvLyBsYXJnZSBudW1iZXIgb2YgcmVnaXN0ZXJzIGFyZSBjbG9iYmVyZWQgYnkgdGhlIGluc3RydWN0aW9uLiAgVGhpcyBpcworICAgIC8vIHR5cGljYWxseSB1c2VkIGZvciBjYWxscy4KKyAgICAvLworICAgIC8vIEZvciBjb21waWxlIHRpbWUgcGVyZm9ybWFuY2UgcmVhc29ucywgdGhlc2UgY2xvYmJlcnMgYXJlIG5vdCByZWNvcmRlZCBpbgorICAgIC8vIHRoZSBsaXZlIGludGVydmFscyBmb3IgaW5kaXZpZHVhbCBwaHlzaWNhbCByZWdpc3RlcnMuICBJbnN0ZWFkLAorICAgIC8vIExpdmVJbnRlcnZhbEFuYWx5c2lzIG1haW50YWlucyBhIHNvcnRlZCBsaXN0IG9mIGluc3RydWN0aW9ucyB3aXRoCisgICAgLy8gcmVnaXN0ZXIgbWFzayBvcGVyYW5kcy4KKworICAgIC8vLyBSZXR1cm5zIGEgc29ydGVkIGFycmF5IG9mIHNsb3QgaW5kaWNlcyBvZiBhbGwgaW5zdHJ1Y3Rpb25zIHdpdGgKKyAgICAvLy8gcmVnaXN0ZXIgbWFzayBvcGVyYW5kcy4KKyAgICBBcnJheVJlZjxTbG90SW5kZXg+IGdldFJlZ01hc2tTbG90cygpIGNvbnN0IHsgcmV0dXJuIFJlZ01hc2tTbG90czsgfQorCisgICAgLy8vIFJldHVybnMgYSBzb3J0ZWQgYXJyYXkgb2Ygc2xvdCBpbmRpY2VzIG9mIGFsbCBpbnN0cnVjdGlvbnMgd2l0aCByZWdpc3RlcgorICAgIC8vLyBtYXNrIG9wZXJhbmRzIGluIHRoZSBiYXNpYyBibG9jayBudW1iZXJlZCBccCBNQkJOdW0uCisgICAgQXJyYXlSZWY8U2xvdEluZGV4PiBnZXRSZWdNYXNrU2xvdHNJbkJsb2NrKHVuc2lnbmVkIE1CQk51bSkgY29uc3QgeworICAgICAgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4gUCA9IFJlZ01hc2tCbG9ja3NbTUJCTnVtXTsKKyAgICAgIHJldHVybiBnZXRSZWdNYXNrU2xvdHMoKS5zbGljZShQLmZpcnN0LCBQLnNlY29uZCk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgYW4gYXJyYXkgb2YgcmVnaXN0ZXIgbWFzayBwb2ludGVycyBjb3JyZXNwb25kaW5nIHRvCisgICAgLy8vIGdldFJlZ01hc2tTbG90cygpLgorICAgIEFycmF5UmVmPGNvbnN0IHVpbnQzMl90Kj4gZ2V0UmVnTWFza0JpdHMoKSBjb25zdCB7IHJldHVybiBSZWdNYXNrQml0czsgfQorCisgICAgLy8vIFJldHVybnMgYW4gYXJyYXkgb2YgbWFzayBwb2ludGVycyBjb3JyZXNwb25kaW5nIHRvCisgICAgLy8vIGdldFJlZ01hc2tTbG90c0luQmxvY2soTUJCTnVtKS4KKyAgICBBcnJheVJlZjxjb25zdCB1aW50MzJfdCo+IGdldFJlZ01hc2tCaXRzSW5CbG9jayh1bnNpZ25lZCBNQkJOdW0pIGNvbnN0IHsKKyAgICAgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+IFAgPSBSZWdNYXNrQmxvY2tzW01CQk51bV07CisgICAgICByZXR1cm4gZ2V0UmVnTWFza0JpdHMoKS5zbGljZShQLmZpcnN0LCBQLnNlY29uZCk7CisgICAgfQorCisgICAgLy8vIFRlc3QgaWYgXHAgTEkgaXMgbGl2ZSBhY3Jvc3MgYW55IHJlZ2lzdGVyIG1hc2sgaW5zdHJ1Y3Rpb25zLCBhbmQKKyAgICAvLy8gY29tcHV0ZSBhIGJpdCBtYXNrIG9mIHBoeXNpY2FsIHJlZ2lzdGVycyB0aGF0IGFyZSBub3QgY2xvYmJlcmVkIGJ5IGFueQorICAgIC8vLyBvZiB0aGVtLgorICAgIC8vLworICAgIC8vLyBSZXR1cm5zIGZhbHNlIGlmIFxwIExJIGRvZXNuJ3QgY3Jvc3MgYW55IHJlZ2lzdGVyIG1hc2sgaW5zdHJ1Y3Rpb25zLiBJbgorICAgIC8vLyB0aGF0IGNhc2UsIHRoZSBiaXQgdmVjdG9yIGlzIG5vdCBmaWxsZWQgaW4uCisgICAgYm9vbCBjaGVja1JlZ01hc2tJbnRlcmZlcmVuY2UoTGl2ZUludGVydmFsICZMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRWZWN0b3IgJlVzYWJsZVJlZ3MpOworCisgICAgLy8gUmVnaXN0ZXIgdW5pdCBmdW5jdGlvbnMuCisgICAgLy8KKyAgICAvLyBGaXhlZCBpbnRlcmZlcmVuY2Ugb2NjdXJzIHdoZW4gTWFjaGluZUluc3RycyB1c2UgcGh5c3JlZ3MgZGlyZWN0bHkKKyAgICAvLyBpbnN0ZWFkIG9mIHZpcnR1YWwgcmVnaXN0ZXJzLiBUaGlzIHR5cGljYWxseSBoYXBwZW5zIHdoZW4gcGFzc2luZworICAgIC8vIGFyZ3VtZW50cyB0byBhIGZ1bmN0aW9uIGNhbGwsIG9yIHdoZW4gaW5zdHJ1Y3Rpb25zIHJlcXVpcmUgb3BlcmFuZHMgaW4KKyAgICAvLyBmaXhlZCByZWdpc3RlcnMuCisgICAgLy8KKyAgICAvLyBFYWNoIHBoeXNyZWcgaGFzIG9uZSBvciBtb3JlIHJlZ2lzdGVyIHVuaXRzLCBzZWUgTUNSZWdpc3RlckluZm8uIFdlCisgICAgLy8gdHJhY2sgbGl2ZW5lc3MgcGVyIHJlZ2lzdGVyIHVuaXQgdG8gaGFuZGxlIGFsaWFzaW5nIHJlZ2lzdGVycyBtb3JlCisgICAgLy8gZWZmaWNpZW50bHkuCisKKyAgICAvLy8gUmV0dXJuIHRoZSBsaXZlIHJhbmdlIGZvciByZWdpc3RlciB1bml0IFxwIFVuaXQuIEl0IHdpbGwgYmUgY29tcHV0ZWQgaWYKKyAgICAvLy8gaXQgZG9lc24ndCBleGlzdC4KKyAgICBMaXZlUmFuZ2UgJmdldFJlZ1VuaXQodW5zaWduZWQgVW5pdCkgeworICAgICAgTGl2ZVJhbmdlICpMUiA9IFJlZ1VuaXRSYW5nZXNbVW5pdF07CisgICAgICBpZiAoIUxSKSB7CisgICAgICAgIC8vIENvbXB1dGUgbWlzc2luZyByYW5nZXMgb24gZGVtYW5kLgorICAgICAgICAvLyBVc2Ugc2VnbWVudCBzZXQgdG8gc3BlZWQtdXAgaW5pdGlhbCBjb21wdXRhdGlvbiBvZiB0aGUgbGl2ZSByYW5nZS4KKyAgICAgICAgUmVnVW5pdFJhbmdlc1tVbml0XSA9IExSID0gbmV3IExpdmVSYW5nZShVc2VTZWdtZW50U2V0Rm9yUGh5c1JlZ3MpOworICAgICAgICBjb21wdXRlUmVnVW5pdFJhbmdlKCpMUiwgVW5pdCk7CisgICAgICB9CisgICAgICByZXR1cm4gKkxSOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdGhlIGxpdmUgcmFuZ2UgZm9yIHJlZ2lzdGVyIHVuaXQgXHAgVW5pdCBpZiBpdCBoYXMgYWxyZWFkeSBiZWVuCisgICAgLy8vIGNvbXB1dGVkLCBvciBudWxscHRyIGlmIGl0IGhhc24ndCBiZWVuIGNvbXB1dGVkIHlldC4KKyAgICBMaXZlUmFuZ2UgKmdldENhY2hlZFJlZ1VuaXQodW5zaWduZWQgVW5pdCkgeworICAgICAgcmV0dXJuIFJlZ1VuaXRSYW5nZXNbVW5pdF07CisgICAgfQorCisgICAgY29uc3QgTGl2ZVJhbmdlICpnZXRDYWNoZWRSZWdVbml0KHVuc2lnbmVkIFVuaXQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBSZWdVbml0UmFuZ2VzW1VuaXRdOworICAgIH0KKworICAgIC8vLyBSZW1vdmUgY29tcHV0ZWQgbGl2ZSByYW5nZSBmb3IgcmVnaXN0ZXIgdW5pdCBccCBVbml0LiBTdWJzZXF1ZW50IHVzZXMKKyAgICAvLy8gc2hvdWxkIHJlbHkgb24gb24tZGVtYW5kIHJlY29tcHV0YXRpb24uCisgICAgdm9pZCByZW1vdmVSZWdVbml0KHVuc2lnbmVkIFVuaXQpIHsKKyAgICAgIGRlbGV0ZSBSZWdVbml0UmFuZ2VzW1VuaXRdOworICAgICAgUmVnVW5pdFJhbmdlc1tVbml0XSA9IG51bGxwdHI7CisgICAgfQorCisgICAgLy8vIFJlbW92ZSB2YWx1ZSBudW1iZXJzIGFuZCByZWxhdGVkIGxpdmUgc2VnbWVudHMgc3RhcnRpbmcgYXQgcG9zaXRpb24KKyAgICAvLy8gXHAgUG9zIHRoYXQgYXJlIHBhcnQgb2YgYW55IGxpdmVyYW5nZSBvZiBwaHlzaWNhbCByZWdpc3RlciBccCBSZWcgb3Igb25lCisgICAgLy8vIG9mIGl0cyBzdWJyZWdpc3RlcnMuCisgICAgdm9pZCByZW1vdmVQaHlzUmVnRGVmQXQodW5zaWduZWQgUmVnLCBTbG90SW5kZXggUG9zKTsKKworICAgIC8vLyBSZW1vdmUgdmFsdWUgbnVtYmVyIGFuZCByZWxhdGVkIGxpdmUgc2VnbWVudHMgb2YgXHAgTEkgYW5kIGl0cyBzdWJyYW5nZXMKKyAgICAvLy8gdGhhdCBzdGFydCBhdCBwb3NpdGlvbiBccCBQb3MuCisgICAgdm9pZCByZW1vdmVWUmVnRGVmQXQoTGl2ZUludGVydmFsICZMSSwgU2xvdEluZGV4IFBvcyk7CisKKyAgICAvLy8gU3BsaXQgc2VwYXJhdGUgY29tcG9uZW50cyBpbiBMaXZlSW50ZXJ2YWwgXHAgTEkgaW50byBzZXBhcmF0ZSBpbnRlcnZhbHMuCisgICAgdm9pZCBzcGxpdFNlcGFyYXRlQ29tcG9uZW50cyhMaXZlSW50ZXJ2YWwgJkxJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPExpdmVJbnRlcnZhbCo+ICZTcGxpdExJcyk7CisKKyAgICAvLy8gRm9yIGxpdmUgaW50ZXJ2YWwgXHAgTEkgd2l0aCBjb3JyZWN0IFN1YlJhbmdlcyBjb25zdHJ1Y3QgbWF0Y2hpbmcKKyAgICAvLy8gaW5mb3JtYXRpb24gZm9yIHRoZSBtYWluIGxpdmUgcmFuZ2UuIEV4cGVjdHMgdGhlIG1haW4gbGl2ZSByYW5nZSB0byBub3QKKyAgICAvLy8gaGF2ZSBhbnkgc2VnbWVudHMgb3IgdmFsdWUgbnVtYmVycy4KKyAgICB2b2lkIGNvbnN0cnVjdE1haW5SYW5nZUZyb21TdWJyYW5nZXMoTGl2ZUludGVydmFsICZMSSk7CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gQ29tcHV0ZSBsaXZlIGludGVydmFscyBmb3IgYWxsIHZpcnR1YWwgcmVnaXN0ZXJzLgorICAgIHZvaWQgY29tcHV0ZVZpcnRSZWdzKCk7CisKKyAgICAvLy8gQ29tcHV0ZSBSZWdNYXNrU2xvdHMgYW5kIFJlZ01hc2tCaXRzLgorICAgIHZvaWQgY29tcHV0ZVJlZ01hc2tzKCk7CisKKyAgICAvLy8gV2FsayB0aGUgdmFsdWVzIGluIFxwIExJIGFuZCBjaGVjayBmb3IgZGVhZCB2YWx1ZXM6CisgICAgLy8vIC0gRGVhZCBQSElEZWYgdmFsdWVzIGFyZSBtYXJrZWQgYXMgdW51c2VkLgorICAgIC8vLyAtIERlYWQgb3BlcmFuZHMgYXJlIG1hcmtlZCBhcyBzdWNoLgorICAgIC8vLyAtIENvbXBsZXRlbHkgZGVhZCBtYWNoaW5lIGluc3RydWN0aW9ucyBhcmUgYWRkZWQgdG8gdGhlIFxwIGRlYWQgdmVjdG9yCisgICAgLy8vICAgaWYgaXQgaXMgbm90IG51bGxwdHIuCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbnkgUEhJIHZhbHVlIG51bWJlcnMgaGF2ZSBiZWVuIHJlbW92ZWQgd2hpY2ggbWF5CisgICAgLy8vIGhhdmUgc2VwYXJhdGVkIHRoZSBpbnRlcnZhbCBpbnRvIG11bHRpcGxlIGNvbm5lY3RlZCBjb21wb25lbnRzLgorICAgIGJvb2wgY29tcHV0ZURlYWRWYWx1ZXMoTGl2ZUludGVydmFsICZMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIqPiAqZGVhZCk7CisKKyAgICBzdGF0aWMgTGl2ZUludGVydmFsKiBjcmVhdGVJbnRlcnZhbCh1bnNpZ25lZCBSZWcpOworCisgICAgdm9pZCBwcmludEluc3RycyhyYXdfb3N0cmVhbSAmTykgY29uc3Q7CisgICAgdm9pZCBkdW1wSW5zdHJzKCkgY29uc3Q7CisKKyAgICB2b2lkIGNvbXB1dGVMaXZlSW5SZWdVbml0cygpOworICAgIHZvaWQgY29tcHV0ZVJlZ1VuaXRSYW5nZShMaXZlUmFuZ2UmLCB1bnNpZ25lZCBVbml0KTsKKyAgICB2b2lkIGNvbXB1dGVWaXJ0UmVnSW50ZXJ2YWwoTGl2ZUludGVydmFsJik7CisKKworICAgIC8vLyBIZWxwZXIgZnVuY3Rpb24gZm9yIHJlcGFpckludGVydmFsc0luUmFuZ2UoKSwgd2Fsa3MgYmFja3dhcmRzIGFuZAorICAgIC8vLyBjcmVhdGVzL21vZGlmaWVzIGxpdmUgc2VnbWVudHMgaW4gXHAgTFIgdG8gbWF0Y2ggdGhlIG9wZXJhbmRzIGZvdW5kLgorICAgIC8vLyBPbmx5IGZ1bGwgb3BlcmFuZHMgb3Igb3BlcmFuZHMgd2l0aCBzdWJyZWdpc3RlcnMgbWF0Y2hpbmcgXHAgTGFuZU1hc2sKKyAgICAvLy8gYXJlIGNvbnNpZGVyZWQuCisgICAgdm9pZCByZXBhaXJPbGRSZWdJblJhbmdlKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2xvdEluZGV4IGVuZElkeCwgTGl2ZVJhbmdlICZMUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYW5lQml0bWFzayBMYW5lTWFzayA9IExhbmVCaXRtYXNrOjpnZXRBbGwoKSk7CisKKyAgICBjbGFzcyBITUVkaXRvcjsKKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZVBoeXNSZWdzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZVBoeXNSZWdzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjlhYWIwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaXZlUGh5c1JlZ3MuaApAQCAtMCwwICsxLDE5MCBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9MaXZlUGh5c1JlZ3MuaCAtIExpdmUgUGh5c2ljYWwgUmVnaXN0ZXIgU2V0IC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgTGl2ZVBoeXNSZWdzIHV0aWxpdHkgZm9yIHRyYWNraW5nIGxpdmVuZXNzIG9mCisvLy8gcGh5c2ljYWwgcmVnaXN0ZXJzLiBUaGlzIGNhbiBiZSB1c2VkIGZvciBhZC1ob2MgbGl2ZW5lc3MgdHJhY2tpbmcgYWZ0ZXIKKy8vLyByZWdpc3RlciBhbGxvY2F0aW9uLiBZb3UgY2FuIHN0YXJ0IHdpdGggdGhlIGxpdmUtaW5zL2xpdmUtb3V0cyBhdCB0aGUKKy8vLyBiZWdpbm5pbmcvZW5kIG9mIGEgYmxvY2sgYW5kIHVwZGF0ZSB0aGUgaW5mb3JtYXRpb24gd2hpbGUgd2Fsa2luZyB0aGUKKy8vLyBpbnN0cnVjdGlvbnMgaW5zaWRlIHRoZSBibG9jay4gVGhpcyBpbXBsZW1lbnRhdGlvbiB0cmFja3MgdGhlIGxpdmVuZXNzIG9uIGEKKy8vLyBzdWItcmVnaXN0ZXIgZ3JhbnVsYXJpdHkuCisvLy8KKy8vLyBXZSBhc3N1bWUgdGhhdCB0aGUgaGlnaCBiaXRzIG9mIGEgcGh5c2ljYWwgc3VwZXItcmVnaXN0ZXIgYXJlIG5vdCBwcmVzZXJ2ZWQKKy8vLyB1bmxlc3MgdGhlIGluc3RydWN0aW9uIGhhcyBhbiBpbXBsaWNpdC11c2Ugb3BlcmFuZCByZWFkaW5nIHRoZSBzdXBlci0KKy8vLyByZWdpc3Rlci4KKy8vLworLy8vIFg4NiBFeGFtcGxlOgorLy8vICV5bW0wID0gLi4uCisvLy8gJXhtbTAgPSAuLi4gKEtpbGxzICV4bW0wLCBhbGwgJXhtbTBzIHN1Yi1yZWdpc3RlcnMsIGFuZCAleW1tMCkKKy8vLworLy8vICV5bW0wID0gLi4uCisvLy8gJXhtbTAgPSAuLi4sIGltcGxpY2l0ICV5bW0wICgleW1tMCBhbmQgYWxsIGl0cyBzdWItcmVnaXN0ZXJzIGFyZSBhbGl2ZSkKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0xJVkVQSFlTUkVHU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9MSVZFUEhZU1JFR1NfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3BhcnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgTWFjaGluZU9wZXJhbmQ7CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vLyBcYnJpZWYgQSBzZXQgb2YgcGh5c2ljYWwgcmVnaXN0ZXJzIHdpdGggdXRpbGl0eSBmdW5jdGlvbnMgdG8gdHJhY2sgbGl2ZW5lc3MKKy8vLyB3aGVuIHdhbGtpbmcgYmFja3dhcmQvZm9yd2FyZCB0aHJvdWdoIGEgYmFzaWMgYmxvY2suCitjbGFzcyBMaXZlUGh5c1JlZ3MgeworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSA9IG51bGxwdHI7CisgIFNwYXJzZVNldDx1bnNpZ25lZD4gTGl2ZVJlZ3M7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdHMgYW4gdW5pdGlhbGl6ZWQgc2V0LiBpbml0KCkgbmVlZHMgdG8gYmUgY2FsbGVkIHRvIGluaXRpYWxpemUgaXQuCisgIExpdmVQaHlzUmVncygpID0gZGVmYXVsdDsKKworICAvLy8gQ29uc3RydWN0cyBhbmQgaW5pdGlhbGl6ZXMgYW4gZW1wdHkgc2V0LgorICBMaXZlUGh5c1JlZ3MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkkpIDogVFJJKCZUUkkpIHsKKyAgICBMaXZlUmVncy5zZXRVbml2ZXJzZShUUkkuZ2V0TnVtUmVncygpKTsKKyAgfQorCisgIExpdmVQaHlzUmVncyhjb25zdCBMaXZlUGh5c1JlZ3MmKSA9IGRlbGV0ZTsKKyAgTGl2ZVBoeXNSZWdzICZvcGVyYXRvcj0oY29uc3QgTGl2ZVBoeXNSZWdzJikgPSBkZWxldGU7CisKKyAgLy8vIChyZS0paW5pdGlhbGl6ZXMgYW5kIGNsZWFycyB0aGUgc2V0LgorICB2b2lkIGluaXQoY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkkpIHsKKyAgICB0aGlzLT5UUkkgPSAmVFJJOworICAgIExpdmVSZWdzLmNsZWFyKCk7CisgICAgTGl2ZVJlZ3Muc2V0VW5pdmVyc2UoVFJJLmdldE51bVJlZ3MoKSk7CisgIH0KKworICAvLy8gQ2xlYXJzIHRoZSBzZXQuCisgIHZvaWQgY2xlYXIoKSB7IExpdmVSZWdzLmNsZWFyKCk7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzZXQgaXMgZW1wdHkuCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBMaXZlUmVncy5lbXB0eSgpOyB9CisKKyAgLy8vIEFkZHMgYSBwaHlzaWNhbCByZWdpc3RlciBhbmQgYWxsIGl0cyBzdWItcmVnaXN0ZXJzIHRvIHRoZSBzZXQuCisgIHZvaWQgYWRkUmVnKHVuc2lnbmVkIFJlZykgeworICAgIGFzc2VydChUUkkgJiYgIkxpdmVQaHlzUmVncyBpcyBub3QgaW5pdGlhbGl6ZWQuIik7CisgICAgYXNzZXJ0KFJlZyA8PSBUUkktPmdldE51bVJlZ3MoKSAmJiAiRXhwZWN0ZWQgYSBwaHlzaWNhbCByZWdpc3Rlci4iKTsKKyAgICBmb3IgKE1DU3ViUmVnSXRlcmF0b3IgU3ViUmVncyhSZWcsIFRSSSwgLypJbmNsdWRlU2VsZj0qL3RydWUpOworICAgICAgICAgU3ViUmVncy5pc1ZhbGlkKCk7ICsrU3ViUmVncykKKyAgICAgIExpdmVSZWdzLmluc2VydCgqU3ViUmVncyk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlbW92ZXMgYSBwaHlzaWNhbCByZWdpc3RlciwgYWxsIGl0cyBzdWItcmVnaXN0ZXJzLCBhbmQgYWxsIGl0cworICAvLy8gc3VwZXItcmVnaXN0ZXJzIGZyb20gdGhlIHNldC4KKyAgdm9pZCByZW1vdmVSZWcodW5zaWduZWQgUmVnKSB7CisgICAgYXNzZXJ0KFRSSSAmJiAiTGl2ZVBoeXNSZWdzIGlzIG5vdCBpbml0aWFsaXplZC4iKTsKKyAgICBhc3NlcnQoUmVnIDw9IFRSSS0+Z2V0TnVtUmVncygpICYmICJFeHBlY3RlZCBhIHBoeXNpY2FsIHJlZ2lzdGVyLiIpOworICAgIGZvciAoTUNSZWdBbGlhc0l0ZXJhdG9yIFIoUmVnLCBUUkksIHRydWUpOyBSLmlzVmFsaWQoKTsgKytSKQorICAgICAgTGl2ZVJlZ3MuZXJhc2UoKlIpOworICB9CisKKyAgLy8vIFJlbW92ZXMgcGh5c2ljYWwgcmVnaXN0ZXJzIGNsb2JiZXJlZCBieSB0aGUgcmVnbWFzayBvcGVyYW5kIFxwIE1PLgorICB2b2lkIHJlbW92ZVJlZ3NJbk1hc2soY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PLAorICAgICAgICBTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPHVuc2lnbmVkLCBjb25zdCBNYWNoaW5lT3BlcmFuZCo+PiAqQ2xvYmJlcnMgPQorICAgICAgICBudWxscHRyKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiByZWdpc3RlciBccCBSZWcgaXMgY29udGFpbmVkIGluIHRoZSBzZXQuIFRoaXMgYWxzbworICAvLy8gd29ya3MgaWYgb25seSB0aGUgc3VwZXIgcmVnaXN0ZXIgb2YgXHAgUmVnIGhhcyBiZWVuIGRlZmluZWQsIGJlY2F1c2UKKyAgLy8vIGFkZFJlZygpIGFsd2F5cyBhZGRzIGFsbCBzdWItcmVnaXN0ZXJzIHRvIHRoZSBzZXQgYXMgd2VsbC4KKyAgLy8vIE5vdGU6IFJldHVybnMgZmFsc2UgaWYganVzdCBzb21lIHN1YiByZWdpc3RlcnMgYXJlIGxpdmUsIHVzZSBhdmFpbGFibGUoKQorICAvLy8gd2hlbiBzZWFyY2hpbmcgYSBmcmVlIHJlZ2lzdGVyLgorICBib29sIGNvbnRhaW5zKHVuc2lnbmVkIFJlZykgY29uc3QgeyByZXR1cm4gTGl2ZVJlZ3MuY291bnQoUmVnKTsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgcmVnaXN0ZXIgXHAgUmVnIGFuZCBubyBhbGlhc2luZyByZWdpc3RlciBpcyBpbiB0aGUgc2V0LgorICBib29sIGF2YWlsYWJsZShjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkksIHVuc2lnbmVkIFJlZykgY29uc3Q7CisKKyAgLy8vIFJlbW92ZSBkZWZpbmVkIHJlZ2lzdGVycyBhbmQgcmVnbWFzayBraWxscyBmcm9tIHRoZSBzZXQuCisgIHZvaWQgcmVtb3ZlRGVmcyhjb25zdCBNYWNoaW5lSW5zdHIgJk1JKTsKKworICAvLy8gQWRkIHVzZXMgdG8gdGhlIHNldC4KKyAgdm9pZCBhZGRVc2VzKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpOworCisgIC8vLyBTaW11bGF0ZXMgbGl2ZW5lc3Mgd2hlbiBzdGVwcGluZyBiYWNrd2FyZHMgb3ZlciBhbiBpbnN0cnVjdGlvbihidW5kbGUpLgorICAvLy8gUmVtb3ZlIERlZnMsIGFkZCB1c2VzLiBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCB3YXkgb2YgY2FsY3VsYXRpbmcKKyAgLy8vIGxpdmVuZXNzLgorICB2b2lkIHN0ZXBCYWNrd2FyZChjb25zdCBNYWNoaW5lSW5zdHIgJk1JKTsKKworICAvLy8gU2ltdWxhdGVzIGxpdmVuZXNzIHdoZW4gc3RlcHBpbmcgZm9yd2FyZCBvdmVyIGFuIGluc3RydWN0aW9uKGJ1bmRsZSkuCisgIC8vLyBSZW1vdmUga2lsbGVkLXVzZXMsIGFkZCBkZWZzLiBUaGlzIGlzIHRoZSBub3QgcmVjb21tZW5kZWQgd2F5LCBiZWNhdXNlIGl0CisgIC8vLyBkZXBlbmRzIG9uIGFjY3VyYXRlIGtpbGwgZmxhZ3MuIElmIHBvc3NpYmxlIHVzZSBzdGVwQmFja3dhcmQoKSBpbnN0ZWFkIG9mCisgIC8vLyB0aGlzIGZ1bmN0aW9uLiBUaGUgY2xvYmJlcnMgc2V0IHdpbGwgYmUgdGhlIGxpc3Qgb2YgcmVnaXN0ZXJzIGVpdGhlcgorICAvLy8gZGVmaW5lZCBvciBjbG9iYmVyZWQgYnkgYSByZWdtYXNrLiAgVGhlIG9wZXJhbmQgd2lsbCBpZGVudGlmeSB3aGV0aGVyIHRoaXMKKyAgLy8vIGlzIGEgcmVnbWFzayBvciByZWdpc3RlciBvcGVyYW5kLgorICB2b2lkIHN0ZXBGb3J3YXJkKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8dW5zaWduZWQsIGNvbnN0IE1hY2hpbmVPcGVyYW5kKj4+ICZDbG9iYmVycyk7CisKKyAgLy8vIEFkZHMgYWxsIGxpdmUtaW4gcmVnaXN0ZXJzIG9mIGJhc2ljIGJsb2NrIFxwIE1CQi4KKyAgLy8vIExpdmUgaW4gcmVnaXN0ZXJzIGFyZSB0aGUgcmVnaXN0ZXJzIGluIHRoZSBibG9ja3MgbGl2ZS1pbiBsaXN0IGFuZCB0aGUKKyAgLy8vIHByaXN0aW5lIHJlZ2lzdGVycy4KKyAgdm9pZCBhZGRMaXZlSW5zKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworCisgIC8vLyBBZGRzIGFsbCBsaXZlLW91dCByZWdpc3RlcnMgb2YgYmFzaWMgYmxvY2sgXHAgTUJCLgorICAvLy8gTGl2ZSBvdXQgcmVnaXN0ZXJzIGFyZSB0aGUgdW5pb24gb2YgdGhlIGxpdmUtaW4gcmVnaXN0ZXJzIG9mIHRoZSBzdWNjZXNzb3IKKyAgLy8vIGJsb2NrcyBhbmQgcHJpc3RpbmUgcmVnaXN0ZXJzLiBMaXZlIG91dCByZWdpc3RlcnMgb2YgdGhlIGVuZCBibG9jayBhcmUgdGhlCisgIC8vLyBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzLgorICB2b2lkIGFkZExpdmVPdXRzKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworCisgIC8vLyBBZGRzIGFsbCBsaXZlLW91dCByZWdpc3RlcnMgb2YgYmFzaWMgYmxvY2sgXHAgTUJCIGJ1dCBza2lwcyBwcmlzdGluZQorICAvLy8gcmVnaXN0ZXJzLgorICB2b2lkIGFkZExpdmVPdXRzTm9QcmlzdGluZXMoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBTcGFyc2VTZXQ8dW5zaWduZWQ+Ojpjb25zdF9pdGVyYXRvcjsKKworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIExpdmVSZWdzLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gTGl2ZVJlZ3MuZW5kKCk7IH0KKworICAvLy8gUHJpbnRzIHRoZSBjdXJyZW50bHkgbGl2ZSByZWdpc3RlcnMgdG8gXHAgT1MuCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLy8gRHVtcHMgdGhlIGN1cnJlbnRseSBsaXZlIHJlZ2lzdGVycyB0byB0aGUgZGVidWcgb3V0cHV0LgorICB2b2lkIGR1bXAoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBBZGRzIGxpdmUtaW4gcmVnaXN0ZXJzIGZyb20gYmFzaWMgYmxvY2sgXHAgTUJCLCB0YWtpbmcgYXNzb2NpYXRlZAorICAvLy8gbGFuZSBtYXNrcyBpbnRvIGNvbnNpZGVyYXRpb24uCisgIHZvaWQgYWRkQmxvY2tMaXZlSW5zKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworCisgIC8vLyBBZGRzIHByaXN0aW5lIHJlZ2lzdGVycy4gUHJpc3RpbmUgcmVnaXN0ZXJzIGFyZSBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzCisgIC8vLyB0aGF0IGFyZSB1bnVzZWQgaW4gdGhlIGZ1bmN0aW9uLgorICB2b2lkIGFkZFByaXN0aW5lcyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKTsKK307CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IExpdmVQaHlzUmVncyYgTFIpIHsKKyAgTFIucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKKy8vLyBcYnJpZWYgQ29tcHV0ZXMgcmVnaXN0ZXJzIGxpdmUtaW4gdG8gXHAgTUJCIGFzc3VtaW5nIGFsbCBvZiBpdHMgc3VjY2Vzc29ycworLy8vIGxpdmUtaW4gbGlzdHMgYXJlIHVwLXRvLWRhdGUuIFB1dHMgdGhlIHJlc3VsdCBpbnRvIHRoZSBnaXZlbiBMaXZlUGh5c1JlZworLy8vIGluc3RhbmNlIFxwIExpdmVSZWdzLgordm9pZCBjb21wdXRlTGl2ZUlucyhMaXZlUGh5c1JlZ3MgJkxpdmVSZWdzLCBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKTsKKworLy8vIFJlY29tcHV0ZXMgZGVhZCBhbmQga2lsbCBmbGFncyBpbiBccCBNQkIuCit2b2lkIHJlY29tcHV0ZUxpdmVuZXNzRmxhZ3MoTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisKKy8vLyBBZGRzIHJlZ2lzdGVycyBjb250YWluZWQgaW4gXHAgTGl2ZVJlZ3MgdG8gdGhlIGJsb2NrIGxpdmUtaW4gbGlzdCBvZiBccCBNQkIuCisvLy8gRG9lcyBub3QgYWRkIHJlc2VydmVkIHJlZ2lzdGVycy4KK3ZvaWQgYWRkTGl2ZUlucyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBjb25zdCBMaXZlUGh5c1JlZ3MgJkxpdmVSZWdzKTsKKworLy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIGNvbWJpbmluZyBjb21wdXRlTGl2ZUlucygpIGFuZCBhZGRMaXZlSW5zKCkuCit2b2lkIGNvbXB1dGVBbmRBZGRMaXZlSW5zKExpdmVQaHlzUmVncyAmTGl2ZVJlZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX0xJVkVQSFlTUkVHU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZVJhbmdlRWRpdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVSYW5nZUVkaXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmIxZjBiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVSYW5nZUVkaXQuaApAQCAtMCwwICsxLDI1OCBAQAorLy89PT0tIExpdmVSYW5nZUVkaXQuaCAtIEJhc2ljIHRvb2xzIGZvciBzcGxpdCBhbmQgc3BpbGwgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGUgTGl2ZVJhbmdlRWRpdCBjbGFzcyByZXByZXNlbnRzIGNoYW5nZXMgZG9uZSB0byBhIHZpcnR1YWwgcmVnaXN0ZXIgd2hlbiBpdAorLy8gaXMgc3BpbGxlZCBvciBzcGxpdC4KKy8vCisvLyBUaGUgcGFyZW50IHJlZ2lzdGVyIGlzIG5ldmVyIGNoYW5nZWQuIEluc3RlYWQsIGEgbnVtYmVyIG9mIG5ldyB2aXJ0dWFsCisvLyByZWdpc3RlcnMgYXJlIGNyZWF0ZWQgYW5kIGFkZGVkIHRvIHRoZSBuZXdSZWdzIHZlY3Rvci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9MSVZFUkFOR0VFRElUX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0xJVkVSQU5HRUVESVRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ob25lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU2V0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWwuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2xvdEluZGV4ZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0U3VidGFyZ2V0SW5mby5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTGl2ZUludGVydmFsczsKK2NsYXNzIE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm87CitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBNYWNoaW5lTG9vcEluZm87CitjbGFzcyBNYWNoaW5lT3BlcmFuZDsKK2NsYXNzIFRhcmdldEluc3RySW5mbzsKK2NsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKK2NsYXNzIFZpcnRSZWdNYXA7CisKK2NsYXNzIExpdmVSYW5nZUVkaXQgOiBwcml2YXRlIE1hY2hpbmVSZWdpc3RlckluZm86OkRlbGVnYXRlIHsKK3B1YmxpYzoKKyAgLy8vIENhbGxiYWNrIG1ldGhvZHMgZm9yIExpdmVSYW5nZUVkaXQgb3duZXJzLgorICBjbGFzcyBEZWxlZ2F0ZSB7CisgICAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5EZWxlZ2F0ZSgpID0gZGVmYXVsdDsKKworICAgIC8vLyBDYWxsZWQgaW1tZWRpYXRlbHkgYmVmb3JlIGVyYXNpbmcgYSBkZWFkIG1hY2hpbmUgaW5zdHJ1Y3Rpb24uCisgICAgdmlydHVhbCB2b2lkIExSRV9XaWxsRXJhc2VJbnN0cnVjdGlvbihNYWNoaW5lSW5zdHIgKk1JKSB7fQorCisgICAgLy8vIENhbGxlZCB3aGVuIGEgdmlydHVhbCByZWdpc3RlciBpcyBubyBsb25nZXIgdXNlZC4gUmV0dXJuIGZhbHNlIHRvIGRlZmVyCisgICAgLy8vIGl0cyBkZWxldGlvbiBmcm9tIExpdmVJbnRlcnZhbHMuCisgICAgdmlydHVhbCBib29sIExSRV9DYW5FcmFzZVZpcnRSZWcodW5zaWduZWQpIHsgcmV0dXJuIHRydWU7IH0KKworICAgIC8vLyBDYWxsZWQgYmVmb3JlIHNocmlua2luZyB0aGUgbGl2ZSByYW5nZSBvZiBhIHZpcnR1YWwgcmVnaXN0ZXIuCisgICAgdmlydHVhbCB2b2lkIExSRV9XaWxsU2hyaW5rVmlydFJlZyh1bnNpZ25lZCkge30KKworICAgIC8vLyBDYWxsZWQgYWZ0ZXIgY2xvbmluZyBhIHZpcnR1YWwgcmVnaXN0ZXIuCisgICAgLy8vIFRoaXMgaXMgdXNlZCBmb3IgbmV3IHJlZ2lzdGVycyByZXByZXNlbnRpbmcgY29ubmVjdGVkIGNvbXBvbmVudHMgb2YgT2xkLgorICAgIHZpcnR1YWwgdm9pZCBMUkVfRGlkQ2xvbmVWaXJ0UmVnKHVuc2lnbmVkIE5ldywgdW5zaWduZWQgT2xkKSB7fQorICB9OworCitwcml2YXRlOgorICBMaXZlSW50ZXJ2YWwgKlBhcmVudDsKKyAgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmTmV3UmVnczsKKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJOworICBMaXZlSW50ZXJ2YWxzICZMSVM7CisgIFZpcnRSZWdNYXAgKlZSTTsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUk7CisgIERlbGVnYXRlICpjb25zdCBUaGVEZWxlZ2F0ZTsKKworICAvLy8gRmlyc3ROZXcgLSBJbmRleCBvZiB0aGUgZmlyc3QgcmVnaXN0ZXIgYWRkZWQgdG8gTmV3UmVncy4KKyAgY29uc3QgdW5zaWduZWQgRmlyc3ROZXc7CisKKyAgLy8vIFNjYW5uZWRSZW1hdHRhYmxlIC0gdHJ1ZSB3aGVuIHJlbWF0dGFibGUgdmFsdWVzIGhhdmUgYmVlbiBpZGVudGlmaWVkLgorICBib29sIFNjYW5uZWRSZW1hdHRhYmxlID0gZmFsc2U7CisKKyAgLy8vIERlYWRSZW1hdHMgLSBUaGUgc2F2ZWQgaW5zdHJ1Y3Rpb25zIHdoaWNoIGhhdmUgYWxyZWFkeSBiZWVuIGRlYWQgYWZ0ZXIKKyAgLy8vIHJlbWF0ZXJpYWxpemF0aW9uIGJ1dCBub3QgZGVsZXRlZCB5ZXQgLS0gdG8gYmUgZG9uZSBpbiBwb3N0T3B0aW1pemF0aW9uLgorICBTbWFsbFB0clNldDxNYWNoaW5lSW5zdHIgKiwgMzI+ICpEZWFkUmVtYXRzOworCisgIC8vLyBSZW1hdHRhYmxlIC0gVmFsdWVzIGRlZmluZWQgYnkgcmVtYXR0YWJsZSBpbnN0cnVjdGlvbnMgYXMgaWRlbnRpZmllZCBieQorICAvLy8gdGlpLmlzVHJpdmlhbGx5UmVNYXRlcmlhbGl6YWJsZSgpLgorICBTbWFsbFB0clNldDxjb25zdCBWTkluZm8gKiwgND4gUmVtYXR0YWJsZTsKKworICAvLy8gUmVtYXR0ZWQgLSBWYWx1ZXMgdGhhdCB3ZXJlIGFjdHVhbGx5IHJlbWF0dGVkLCBhbmQgc28gbmVlZCB0byBoYXZlIHRoZWlyCisgIC8vLyBsaXZlIHJhbmdlIHRyaW1tZWQgb3IgZW50aXJlbHkgcmVtb3ZlZC4KKyAgU21hbGxQdHJTZXQ8Y29uc3QgVk5JbmZvICosIDQ+IFJlbWF0dGVkOworCisgIC8vLyBzY2FuUmVtYXR0YWJsZSAtIElkZW50aWZ5IHRoZSBQYXJlbnQgdmFsdWVzIHRoYXQgbWF5IHJlbWF0ZXJpYWxpemUuCisgIHZvaWQgc2NhblJlbWF0dGFibGUoQWxpYXNBbmFseXNpcyAqYWEpOworCisgIC8vLyBhbGxVc2VzQXZhaWxhYmxlQXQgLSBSZXR1cm4gdHJ1ZSBpZiBhbGwgcmVnaXN0ZXJzIHVzZWQgYnkgT3JpZ01JIGF0CisgIC8vLyBPcmlnSWR4IGFyZSBhbHNvIGF2YWlsYWJsZSB3aXRoIHRoZSBzYW1lIHZhbHVlIGF0IFVzZUlkeC4KKyAgYm9vbCBhbGxVc2VzQXZhaWxhYmxlQXQoY29uc3QgTWFjaGluZUluc3RyICpPcmlnTUksIFNsb3RJbmRleCBPcmlnSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBTbG90SW5kZXggVXNlSWR4KSBjb25zdDsKKworICAvLy8gZm9sZEFzTG9hZCAtIElmIExJIGhhcyBhIHNpbmdsZSB1c2UgYW5kIGEgc2luZ2xlIGRlZiB0aGF0IGNhbiBiZSBmb2xkZWQgYXMKKyAgLy8vIGEgbG9hZCwgZWxpbWluYXRlIHRoZSByZWdpc3RlciBieSBmb2xkaW5nIHRoZSBkZWYgaW50byB0aGUgdXNlLgorICBib29sIGZvbGRBc0xvYWQoTGl2ZUludGVydmFsICpMSSwgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0ciAqPiAmRGVhZCk7CisKKyAgdXNpbmcgVG9TaHJpbmtTZXQgPSBTZXRWZWN0b3I8TGl2ZUludGVydmFsICosIFNtYWxsVmVjdG9yPExpdmVJbnRlcnZhbCAqLCA4PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8TGl2ZUludGVydmFsICosIDg+PjsKKworICAvLy8gSGVscGVyIGZvciBlbGltaW5hdGVEZWFkRGVmcy4KKyAgdm9pZCBlbGltaW5hdGVEZWFkRGVmKE1hY2hpbmVJbnN0ciAqTUksIFRvU2hyaW5rU2V0ICZUb1NocmluaywKKyAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzQW5hbHlzaXMgKkFBKTsKKworICAvLy8gTWFjaGluZVJlZ2lzdGVySW5mbyBjYWxsYmFjayB0byBub3RpZnkgd2hlbiBuZXcgdmlydHVhbAorICAvLy8gcmVnaXN0ZXJzIGFyZSBjcmVhdGVkLgorICB2b2lkIE1SSV9Ob3RlTmV3VmlydHVhbFJlZ2lzdGVyKHVuc2lnbmVkIFZSZWcpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgQ2hlY2sgaWYgTWFjaGluZU9wZXJhbmQgXHAgTU8gaXMgYSBsYXN0IHVzZS9raWxsIGVpdGhlciBpbiB0aGUKKyAgLy8vIG1haW4gbGl2ZSByYW5nZSBvZiBccCBMSSBvciBpbiBvbmUgb2YgdGhlIG1hdGNoaW5nIHN1YnJlZ2lzdGVyIHJhbmdlcy4KKyAgYm9vbCB1c2VJc0tpbGwoY29uc3QgTGl2ZUludGVydmFsICZMSSwgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PKSBjb25zdDsKKworICAvLy8gQ3JlYXRlIGEgbmV3IGVtcHR5IGludGVydmFsIGJhc2VkIG9uIE9sZFJlZy4KKyAgTGl2ZUludGVydmFsICZjcmVhdGVFbXB0eUludGVydmFsRnJvbSh1bnNpZ25lZCBPbGRSZWcsIGJvb2wgY3JlYXRlU3ViUmFuZ2VzKTsKKworcHVibGljOgorICAvLy8gQ3JlYXRlIGEgTGl2ZVJhbmdlRWRpdCBmb3IgYnJlYWtpbmcgZG93biBwYXJlbnQgaW50byBzbWFsbGVyIHBpZWNlcy4KKyAgLy8vIEBwYXJhbSBwYXJlbnQgVGhlIHJlZ2lzdGVyIGJlaW5nIHNwaWxsZWQgb3Igc3BsaXQuCisgIC8vLyBAcGFyYW0gbmV3UmVncyBMaXN0IHRvIHJlY2VpdmUgYW55IG5ldyByZWdpc3RlcnMgY3JlYXRlZC4gVGhpcyBuZWVkbid0IGJlCisgIC8vLyAgICAgICAgICAgICAgICBlbXB0eSBpbml0aWFsbHksIGFueSBleGlzdGluZyByZWdpc3RlcnMgYXJlIGlnbm9yZWQuCisgIC8vLyBAcGFyYW0gTUYgVGhlIE1hY2hpbmVGdW5jdGlvbiB0aGUgbGl2ZSByYW5nZSBlZGl0IGlzIHRha2luZyBwbGFjZSBpbi4KKyAgLy8vIEBwYXJhbSBsaXMgVGhlIGNvbGxlY3Rpb24gb2YgYWxsIGxpdmUgaW50ZXJ2YWxzIGluIHRoaXMgZnVuY3Rpb24uCisgIC8vLyBAcGFyYW0gdnJtIE1hcCBvZiB2aXJ0dWFsIHJlZ2lzdGVycyB0byBwaHlzaWNhbCByZWdpc3RlcnMgZm9yIHRoaXMKKyAgLy8vICAgICAgICAgICAgZnVuY3Rpb24uICBJZiBOVUxMLCBubyB2aXJ0dWFsIHJlZ2lzdGVyIG1hcCB1cGRhdGVzIHdpbGwKKyAgLy8vICAgICAgICAgICAgYmUgZG9uZS4gIFRoaXMgY291bGQgYmUgdGhlIGNhc2UgaWYgY2FsbGVkIGJlZm9yZSBSZWdhbGxvYy4KKyAgLy8vIEBwYXJhbSBkZWFkUmVtYXRzIFRoZSBjb2xsZWN0aW9uIG9mIGFsbCB0aGUgaW5zdHJ1Y3Rpb25zIGRlZmluaW5nIGFuCisgIC8vLyAgICAgICAgICAgICAgICAgICBvcmlnaW5hbCByZWcgYW5kIGFyZSBkZWFkIGFmdGVyIHJlbWF0LgorICBMaXZlUmFuZ2VFZGl0KExpdmVJbnRlcnZhbCAqcGFyZW50LCBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICZuZXdSZWdzLAorICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYsIExpdmVJbnRlcnZhbHMgJmxpcywgVmlydFJlZ01hcCAqdnJtLAorICAgICAgICAgICAgICAgIERlbGVnYXRlICpkZWxlZ2F0ZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgU21hbGxQdHJTZXQ8TWFjaGluZUluc3RyICosIDMyPiAqZGVhZFJlbWF0cyA9IG51bGxwdHIpCisgICAgICA6IFBhcmVudChwYXJlbnQpLCBOZXdSZWdzKG5ld1JlZ3MpLCBNUkkoTUYuZ2V0UmVnSW5mbygpKSwgTElTKGxpcyksCisgICAgICAgIFZSTSh2cm0pLCBUSUkoKk1GLmdldFN1YnRhcmdldCgpLmdldEluc3RySW5mbygpKSwgVGhlRGVsZWdhdGUoZGVsZWdhdGUpLAorICAgICAgICBGaXJzdE5ldyhuZXdSZWdzLnNpemUoKSksIERlYWRSZW1hdHMoZGVhZFJlbWF0cykgeworICAgIE1SSS5zZXREZWxlZ2F0ZSh0aGlzKTsKKyAgfQorCisgIH5MaXZlUmFuZ2VFZGl0KCkgb3ZlcnJpZGUgeyBNUkkucmVzZXREZWxlZ2F0ZSh0aGlzKTsgfQorCisgIExpdmVJbnRlcnZhbCAmZ2V0UGFyZW50KCkgY29uc3QgeworICAgIGFzc2VydChQYXJlbnQgJiYgIk5vIHBhcmVudCBMaXZlSW50ZXJ2YWwiKTsKKyAgICByZXR1cm4gKlBhcmVudDsKKyAgfQorCisgIHVuc2lnbmVkIGdldFJlZygpIGNvbnN0IHsgcmV0dXJuIGdldFBhcmVudCgpLnJlZzsgfQorCisgIC8vLyBJdGVyYXRvciBmb3IgYWNjZXNzaW5nIHRoZSBuZXcgcmVnaXN0ZXJzIGFkZGVkIGJ5IHRoaXMgZWRpdC4KKyAgdXNpbmcgaXRlcmF0b3IgPSBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+Ojpjb25zdF9pdGVyYXRvcjsKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBOZXdSZWdzLmJlZ2luKCkgKyBGaXJzdE5ldzsgfQorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBOZXdSZWdzLmVuZCgpOyB9CisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiBOZXdSZWdzLnNpemUoKSAtIEZpcnN0TmV3OyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBzaXplKCkgPT0gMDsgfQorICB1bnNpZ25lZCBnZXQodW5zaWduZWQgaWR4KSBjb25zdCB7IHJldHVybiBOZXdSZWdzW2lkeCArIEZpcnN0TmV3XTsgfQorCisgIC8vLyBwb3BfYmFjayAtIEl0IGFsbG93cyBMaXZlUmFuZ2VFZGl0IHVzZXJzIHRvIGRyb3AgbmV3IHJlZ2lzdGVycy4KKyAgLy8vIFRoZSBjb250ZXh0IGlzIHdoZW4gYW4gb3JpZ2luYWwgZGVmIGluc3RydWN0aW9uIG9mIGEgcmVnaXN0ZXIgaXMKKyAgLy8vIGRlYWQgYWZ0ZXIgcmVtYXRlcmlhbGl6YXRpb24sIHdlIHN0aWxsIHdhbnQgdG8ga2VlcCBpdCBmb3IgZm9sbG93aW5nCisgIC8vLyByZW1hdGVyaWFsaXphdGlvbnMuIFdlIHNhdmUgdGhlIGRlZiBpbnN0cnVjdGlvbiBpbiBEZWFkUmVtYXRzLAorICAvLy8gYW5kIHJlcGxhY2UgdGhlIG9yaWdpbmFsIGRzdCByZWdpc3RlciB3aXRoIGEgbmV3IGR1bW15IHJlZ2lzdGVyIHNvCisgIC8vLyB0aGUgbGl2ZSByYW5nZSBvZiBvcmlnaW5hbCBkc3QgcmVnaXN0ZXIgY2FuIGJlIHNocmlua2VkIG5vcm1hbGx5LgorICAvLy8gV2UgZG9uJ3Qgd2FudCB0byBhbGxvY2F0ZSBwaHlzIHJlZ2lzdGVyIGZvciB0aGUgZHVtbXkgcmVnaXN0ZXIsIHNvCisgIC8vLyB3ZSB3YW50IHRvIGRyb3AgaXQgZnJvbSB0aGUgTmV3UmVncyBzZXQuCisgIHZvaWQgcG9wX2JhY2soKSB7IE5ld1JlZ3MucG9wX2JhY2soKTsgfQorCisgIEFycmF5UmVmPHVuc2lnbmVkPiByZWdzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlQXJyYXlSZWYoTmV3UmVncykuc2xpY2UoRmlyc3ROZXcpOworICB9CisKKyAgLy8vIGNyZWF0ZUZyb20gLSBDcmVhdGUgYSBuZXcgdmlydHVhbCByZWdpc3RlciBiYXNlZCBvbiBPbGRSZWcuCisgIHVuc2lnbmVkIGNyZWF0ZUZyb20odW5zaWduZWQgT2xkUmVnKTsKKworICAvLy8gY3JlYXRlIC0gQ3JlYXRlIGEgbmV3IHJlZ2lzdGVyIHdpdGggdGhlIHNhbWUgY2xhc3MgYW5kIG9yaWdpbmFsIHNsb3QgYXMKKyAgLy8vIHBhcmVudC4KKyAgTGl2ZUludGVydmFsICZjcmVhdGVFbXB0eUludGVydmFsKCkgeworICAgIHJldHVybiBjcmVhdGVFbXB0eUludGVydmFsRnJvbShnZXRSZWcoKSwgdHJ1ZSk7CisgIH0KKworICB1bnNpZ25lZCBjcmVhdGUoKSB7IHJldHVybiBjcmVhdGVGcm9tKGdldFJlZygpKTsgfQorCisgIC8vLyBhbnlSZW1hdGVyaWFsaXphYmxlIC0gUmV0dXJuIHRydWUgaWYgYW55IHBhcmVudCB2YWx1ZXMgbWF5IGJlCisgIC8vLyByZW1hdGVyaWFsaXphYmxlLgorICAvLy8gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IHJlbWF0ZXJpYWxpemF0aW9uIGlzIGF0dGVtcHRlZC4KKyAgYm9vbCBhbnlSZW1hdGVyaWFsaXphYmxlKEFsaWFzQW5hbHlzaXMgKik7CisKKyAgLy8vIGNoZWNrUmVtYXRlcmlhbGl6YWJsZSAtIE1hbnVhbGx5IGFkZCBWTkkgdG8gdGhlIGxpc3Qgb2YgcmVtYXRlcmlhbGl6YWJsZQorICAvLy8gdmFsdWVzIGlmIERlZk1JIG1heSBiZSByZW1hdGVyaWFsaXphYmxlLgorICBib29sIGNoZWNrUmVtYXRlcmlhbGl6YWJsZShWTkluZm8gKlZOSSwgY29uc3QgTWFjaGluZUluc3RyICpEZWZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNBbmFseXNpcyAqKTsKKworICAvLy8gUmVtYXQgLSBJbmZvcm1hdGlvbiBuZWVkZWQgdG8gcmVtYXRlcmlhbGl6ZSBhdCBhIHNwZWNpZmljIGxvY2F0aW9uLgorICBzdHJ1Y3QgUmVtYXQgeworICAgIFZOSW5mbyAqUGFyZW50Vk5JOyAgICAgICAgICAgICAgLy8gcGFyZW50XydzIHZhbHVlIGF0IHRoZSByZW1hdCBsb2NhdGlvbi4KKyAgICBNYWNoaW5lSW5zdHIgKk9yaWdNSSA9IG51bGxwdHI7IC8vIEluc3RydWN0aW9uIGRlZmluaW5nIE9yaWdWTkkuIEl0IGNvbnRhaW5zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgcmVhbCBleHByIGZvciByZW1hdC4KKworICAgIGV4cGxpY2l0IFJlbWF0KFZOSW5mbyAqUGFyZW50Vk5JKSA6IFBhcmVudFZOSShQYXJlbnRWTkkpIHt9CisgIH07CisKKyAgLy8vIGNhblJlbWF0ZXJpYWxpemVBdCAtIERldGVybWluZSBpZiBQYXJlbnRWTkkgY2FuIGJlIHJlbWF0ZXJpYWxpemVkIGF0CisgIC8vLyBVc2VJZHguIEl0IGlzIGFzc3VtZWQgdGhhdCBwYXJlbnRfLmdldFZOSU5mb0F0KFVzZUlkeCkgPT0gUGFyZW50Vk5JLgorICAvLy8gV2hlbiBjaGVhcEFzQU1vdmUgaXMgc2V0LCBvbmx5IGNoZWFwIHJlbWF0cyBhcmUgYWxsb3dlZC4KKyAgYm9vbCBjYW5SZW1hdGVyaWFsaXplQXQoUmVtYXQgJlJNLCBWTkluZm8gKk9yaWdWTkksIFNsb3RJbmRleCBVc2VJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgY2hlYXBBc0FNb3ZlKTsKKworICAvLy8gcmVtYXRlcmlhbGl6ZUF0IC0gUmVtYXRlcmlhbGl6ZSBSTS5QYXJlbnRWTkkgaW50byBEZXN0UmVnIGJ5IGluc2VydGluZyBhbgorICAvLy8gaW5zdHJ1Y3Rpb24gaW50byBNQkIgYmVmb3JlIE1JLiBUaGUgbmV3IGluc3RydWN0aW9uIGlzIG1hcHBlZCwgYnV0CisgIC8vLyBsaXZlbmVzcyBpcyBub3QgdXBkYXRlZC4KKyAgLy8vIFJldHVybiB0aGUgU2xvdEluZGV4IG9mIHRoZSBuZXcgaW5zdHJ1Y3Rpb24uCisgIFNsb3RJbmRleCByZW1hdGVyaWFsaXplQXQoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksIHVuc2lnbmVkIERlc3RSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVtYXQgJlJNLCBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIExhdGUgPSBmYWxzZSk7CisKKyAgLy8vIG1hcmtSZW1hdGVyaWFsaXplZCAtIGV4cGxpY2l0bHkgbWFyayBhIHZhbHVlIGFzIHJlbWF0ZXJpYWxpemVkIGFmdGVyIGRvaW5nCisgIC8vLyBpdCBtYW51YWxseS4KKyAgdm9pZCBtYXJrUmVtYXRlcmlhbGl6ZWQoY29uc3QgVk5JbmZvICpQYXJlbnRWTkkpIHsKKyAgICBSZW1hdHRlZC5pbnNlcnQoUGFyZW50Vk5JKTsKKyAgfQorCisgIC8vLyBkaWRSZW1hdGVyaWFsaXplIC0gUmV0dXJuIHRydWUgaWYgUGFyZW50Vk5JIHdhcyByZW1hdGVyaWFsaXplZCBhbnl3aGVyZS4KKyAgYm9vbCBkaWRSZW1hdGVyaWFsaXplKGNvbnN0IFZOSW5mbyAqUGFyZW50Vk5JKSBjb25zdCB7CisgICAgcmV0dXJuIFJlbWF0dGVkLmNvdW50KFBhcmVudFZOSSk7CisgIH0KKworICAvLy8gZXJhc2VWaXJ0UmVnIC0gTm90aWZ5IHRoZSBkZWxlZ2F0ZSB0aGF0IFJlZyBpcyBubyBsb25nZXIgaW4gdXNlLCBhbmQgdHJ5CisgIC8vLyB0byBlcmFzZSBpdCBmcm9tIExJUy4KKyAgdm9pZCBlcmFzZVZpcnRSZWcodW5zaWduZWQgUmVnKTsKKworICAvLy8gZWxpbWluYXRlRGVhZERlZnMgLSBUcnkgdG8gZGVsZXRlIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIG5vdyBkZWFkCisgIC8vLyAoYWxsRGVmc0FyZURlYWQgcmV0dXJucyB0cnVlKS4gVGhpcyBtYXkgY2F1c2UgbGl2ZSBpbnRlcnZhbHMgdG8gYmUgdHJpbW1lZAorICAvLy8gYW5kIGZ1cnRoZXIgZGVhZCBlZnMgdG8gYmUgZWxpbWluYXRlZC4KKyAgLy8vIFJlZ3NCZWluZ1NwaWxsZWQgbGlzdHMgcmVnaXN0ZXJzIGN1cnJlbnRseSBiZWluZyBzcGlsbGVkIGJ5IHRoZSByZWdpc3RlcgorICAvLy8gYWxsb2NhdG9yLiAgVGhlc2UgcmVnaXN0ZXJzIHNob3VsZCBub3QgYmUgc3BsaXQgaW50byBuZXcgaW50ZXJ2YWxzCisgIC8vLyBhcyBjdXJyZW50bHkgdGhvc2UgbmV3IGludGVydmFscyBhcmUgbm90IGd1YXJhbnRlZWQgdG8gc3BpbGwuCisgIHZvaWQgZWxpbWluYXRlRGVhZERlZnMoU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0ciAqPiAmRGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gUmVnc0JlaW5nU3BpbGxlZCA9IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNBbmFseXNpcyAqQUEgPSBudWxscHRyKTsKKworICAvLy8gY2FsY3VsYXRlUmVnQ2xhc3NBbmRIaW50IC0gUmVjb21wdXRlIHJlZ2lzdGVyIGNsYXNzIGFuZCBoaW50IGZvciBlYWNoIG5ldworICAvLy8gcmVnaXN0ZXIuCisgIHZvaWQgY2FsY3VsYXRlUmVnQ2xhc3NBbmRIaW50KE1hY2hpbmVGdW5jdGlvbiAmLCBjb25zdCBNYWNoaW5lTG9vcEluZm8gJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mbyAmKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTElWRVJBTkdFRURJVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZVJlZ01hdHJpeC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVSZWdNYXRyaXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjJhNTVjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xpdmVSZWdNYXRyaXguaApAQCAtMCwwICsxLDE2MCBAQAorLy89PT0tIExpdmVSZWdNYXRyaXguaCAtIFRyYWNrIHJlZ2lzdGVyIGludGVyZmVyZW5jZSAtLS0tLS0tLS0tKi0gQysrIC0qLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGUgTGl2ZVJlZ01hdHJpeCBhbmFseXNpcyBwYXNzIGtlZXBzIHRyYWNrIG9mIHZpcnR1YWwgcmVnaXN0ZXIgaW50ZXJmZXJlbmNlCisvLyBhbG9uZyB0d28gZGltZW5zaW9uczogU2xvdCBpbmRleGVzIGFuZCByZWdpc3RlciB1bml0cy4gVGhlIG1hdHJpeCBpcyB1c2VkIGJ5CisvLyByZWdpc3RlciBhbGxvY2F0b3JzIHRvIGVuc3VyZSB0aGF0IG5vIGludGVyZmVyaW5nIHZpcnR1YWwgcmVnaXN0ZXJzIGdldAorLy8gYXNzaWduZWQgdG8gb3ZlcmxhcHBpbmcgcGh5c2ljYWwgcmVnaXN0ZXJzLgorLy8KKy8vIFJlZ2lzdGVyIHVuaXRzIGFyZSBkZWZpbmVkIGluIE1DUmVnaXN0ZXJJbmZvLmgsIHRoZXkgcmVwcmVzZW50IHRoZSBzbWFsbGVzdAorLy8gdW5pdCBvZiBpbnRlcmZlcmVuY2Ugd2hlbiBkZWFsaW5nIHdpdGggb3ZlcmxhcHBpbmcgcGh5c2ljYWwgcmVnaXN0ZXJzLiBUaGUKKy8vIExpdmVSZWdNYXRyaXggaXMgcmVwcmVzZW50ZWQgYXMgYSBMaXZlSW50ZXJ2YWxVbmlvbiBwZXIgcmVnaXN0ZXIgdW5pdC4gV2hlbgorLy8gYSB2aXJ0dWFsIHJlZ2lzdGVyIGlzIGFzc2lnbmVkIHRvIGEgcGh5c2ljYWwgcmVnaXN0ZXIsIHRoZSBsaXZlIHJhbmdlIGZvcgorLy8gdGhlIHZpcnR1YWwgcmVnaXN0ZXIgaXMgaW5zZXJ0ZWQgaW50byB0aGUgTGl2ZUludGVydmFsVW5pb24gZm9yIGVhY2ggcmVndW5pdAorLy8gaW4gdGhlIHBoeXNyZWcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTElWRVJFR01BVFJJWF9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9MSVZFUkVHTUFUUklYX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0JpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9MaXZlSW50ZXJ2YWxVbmlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFuYWx5c2lzVXNhZ2U7CitjbGFzcyBMaXZlSW50ZXJ2YWw7CitjbGFzcyBMaXZlSW50ZXJ2YWxzOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworY2xhc3MgVmlydFJlZ01hcDsKKworY2xhc3MgTGl2ZVJlZ01hdHJpeCA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkk7CisgIExpdmVJbnRlcnZhbHMgKkxJUzsKKyAgVmlydFJlZ01hcCAqVlJNOworCisgIC8vIFVzZXJUYWcgY2hhbmdlcyB3aGVuZXZlciB2aXJ0dWFsIHJlZ2lzdGVycyBoYXZlIGJlZW4gbW9kaWZpZWQuCisgIHVuc2lnbmVkIFVzZXJUYWcgPSAwOworCisgIC8vIFRoZSBtYXRyaXggaXMgcmVwcmVzZW50ZWQgYXMgYSBMaXZlSW50ZXJ2YWxVbmlvbiBwZXIgcmVnaXN0ZXIgdW5pdC4KKyAgTGl2ZUludGVydmFsVW5pb246OkFsbG9jYXRvciBMSVVBbGxvYzsKKyAgTGl2ZUludGVydmFsVW5pb246OkFycmF5IE1hdHJpeDsKKworICAvLyBDYWNoZWQgcXVlcmllcyBwZXIgcmVnaXN0ZXIgdW5pdC4KKyAgc3RkOjp1bmlxdWVfcHRyPExpdmVJbnRlcnZhbFVuaW9uOjpRdWVyeVtdPiBRdWVyaWVzOworCisgIC8vIENhY2hlZCByZWdpc3RlciBtYXNrIGludGVyZmVyZW5jZSBpbmZvLgorICB1bnNpZ25lZCBSZWdNYXNrVGFnID0gMDsKKyAgdW5zaWduZWQgUmVnTWFza1ZpcnRSZWcgPSAwOworICBCaXRWZWN0b3IgUmVnTWFza1VzYWJsZTsKKworICAvLyBNYWNoaW5lRnVuY3Rpb25QYXNzIGJvaWxlcnBsYXRlLgorICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJikgb3ZlcnJpZGU7CisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIExpdmVSZWdNYXRyaXgoKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSGlnaC1sZXZlbCBpbnRlcmZhY2UuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLworICAvLyBDaGVjayBmb3IgaW50ZXJmZXJlbmNlIGJlZm9yZSBhc3NpZ25pbmcgdmlydHVhbCByZWdpc3RlcnMgdG8gcGh5c2ljYWwKKyAgLy8gcmVnaXN0ZXJzLgorICAvLworCisgIC8vLyBJbnZhbGlkYXRlIGNhY2hlZCBpbnRlcmZlcmVuY2UgcXVlcmllcyBhZnRlciBtb2RpZnlpbmcgdmlydHVhbCByZWdpc3RlcgorICAvLy8gbGl2ZSByYW5nZXMuIEludGVyZmVyZW5jZSBjaGVja3MgbWF5IHJldHVybiBzdGFsZSBpbmZvcm1hdGlvbiB1bmxlc3MKKyAgLy8vIGNhY2hlcyBhcmUgaW52YWxpZGF0ZWQuCisgIHZvaWQgaW52YWxpZGF0ZVZpcnRSZWdzKCkgeyArK1VzZXJUYWc7IH0KKworICBlbnVtIEludGVyZmVyZW5jZUtpbmQgeworICAgIC8vLyBObyBpbnRlcmZlcmVuY2UsIGdvIGFoZWFkIGFuZCBhc3NpZ24uCisgICAgSUtfRnJlZSA9IDAsCisKKyAgICAvLy8gVmlydHVhbCByZWdpc3RlciBpbnRlcmZlcmVuY2UuIFRoZXJlIGFyZSBpbnRlcmZlcmluZyB2aXJ0dWFsIHJlZ2lzdGVycworICAgIC8vLyBhc3NpZ25lZCB0byBQaHlzUmVnIG9yIGl0cyBhbGlhc2VzLiBUaGlzIGludGVyZmVyZW5jZSBjb3VsZCBiZSByZXNvbHZlZAorICAgIC8vLyBieSB1bmFzc2lnbmluZyB0aG9zZSBvdGhlciB2aXJ0dWFsIHJlZ2lzdGVycy4KKyAgICBJS19WaXJ0UmVnLAorCisgICAgLy8vIFJlZ2lzdGVyIHVuaXQgaW50ZXJmZXJlbmNlLiBBIGZpeGVkIGxpdmUgcmFuZ2UgaXMgaW4gdGhlIHdheSwgdHlwaWNhbGx5CisgICAgLy8vIGFyZ3VtZW50IHJlZ2lzdGVycyBmb3IgYSBjYWxsLiBUaGlzIGNhbid0IGJlIHJlc29sdmVkIGJ5IHVuYXNzaWduaW5nCisgICAgLy8vIG90aGVyIHZpcnR1YWwgcmVnaXN0ZXJzLgorICAgIElLX1JlZ1VuaXQsCisKKyAgICAvLy8gUmVnTWFzayBpbnRlcmZlcmVuY2UuIFRoZSBsaXZlIHJhbmdlIGlzIGNyb3NzaW5nIGFuIGluc3RydWN0aW9uIHdpdGggYQorICAgIC8vLyByZWdtYXNrIG9wZXJhbmQgdGhhdCBkb2Vzbid0IHByZXNlcnZlIFBoeXNSZWcuIFRoaXMgdHlwaWNhbGx5IG1lYW5zCisgICAgLy8vIFZpcnRSZWcgaXMgbGl2ZSBhY3Jvc3MgYSBjYWxsLCBhbmQgUGh5c1JlZyBpc24ndCBjYWxsLXByZXNlcnZlZC4KKyAgICBJS19SZWdNYXNrCisgIH07CisKKyAgLy8vIENoZWNrIGZvciBpbnRlcmZlcmVuY2UgYmVmb3JlIGFzc2lnbmluZyBWaXJ0UmVnIHRvIFBoeXNSZWcuCisgIC8vLyBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgSUtfRnJlZSwgaXQgaXMgbGVnYWwgdG8gYXNzaWduKFZpcnRSZWcsIFBoeXNSZWcpLgorICAvLy8gV2hlbiB0aGVyZSBpcyBtb3JlIHRoYW4gb25lIGtpbmQgb2YgaW50ZXJmZXJlbmNlLCB0aGUgSW50ZXJmZXJlbmNlS2luZAorICAvLy8gd2l0aCB0aGUgaGlnaGVzdCBlbnVtIHZhbHVlIGlzIHJldHVybmVkLgorICBJbnRlcmZlcmVuY2VLaW5kIGNoZWNrSW50ZXJmZXJlbmNlKExpdmVJbnRlcnZhbCAmVmlydFJlZywgdW5zaWduZWQgUGh5c1JlZyk7CisKKyAgLy8vIENoZWNrIGZvciBpbnRlcmZlcmVuY2UgaW4gdGhlIHNlZ21lbnQgW1N0YXJ0LCBFbmQpIHRoYXQgbWF5IHByZXZlbnQKKyAgLy8vIGFzc2lnbm1lbnQgdG8gUGh5c1JlZy4gSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUsIHRoZXJlIGlzCisgIC8vLyBpbnRlcmZlcmVuY2UgaW4gdGhlIHNlZ21lbnQgW1N0YXJ0LCBFbmQpIG9mIHNvbWUgb3RoZXIgaW50ZXJ2YWwgYWxyZWFkeQorICAvLy8gYXNzaWduZWQgdG8gUGh5c1JlZy4gSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCBQaHlzUmVnIGlzIGZyZWUgYXQKKyAgLy8vIHRoZSBzZWdtZW50IFtTdGFydCwgRW5kKS4KKyAgYm9vbCBjaGVja0ludGVyZmVyZW5jZShTbG90SW5kZXggU3RhcnQsIFNsb3RJbmRleCBFbmQsIHVuc2lnbmVkIFBoeXNSZWcpOworCisgIC8vLyBBc3NpZ24gVmlydFJlZyB0byBQaHlzUmVnLgorICAvLy8gVGhpcyB3aWxsIG1hcmsgVmlydFJlZydzIGxpdmUgcmFuZ2UgYXMgb2NjdXBpZWQgaW4gdGhlIExpdmVSZWdNYXRyaXggYW5kCisgIC8vLyB1cGRhdGUgVmlydFJlZ01hcC4gVGhlIGxpdmUgcmFuZ2UgaXMgZXhwZWN0ZWQgdG8gYmUgYXZhaWxhYmxlIGluIFBoeXNSZWcuCisgIHZvaWQgYXNzaWduKExpdmVJbnRlcnZhbCAmVmlydFJlZywgdW5zaWduZWQgUGh5c1JlZyk7CisKKyAgLy8vIFVuYXNzaWduIFZpcnRSZWcgZnJvbSBpdHMgUGh5c1JlZy4KKyAgLy8vIEFzc3VtaW5nIHRoYXQgVmlydFJlZyB3YXMgcHJldmlvdXNseSBhc3NpZ25lZCB0byBhIFBoeXNSZWcsIHRoaXMgdW5kb2VzCisgIC8vLyB0aGUgYXNzaWdubWVudCBhbmQgdXBkYXRlcyBWaXJ0UmVnTWFwIGFjY29yZGluZ2x5LgorICB2b2lkIHVuYXNzaWduKExpdmVJbnRlcnZhbCAmVmlydFJlZyk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gXHAgUGh5c1JlZyBoYXMgYW55IGxpdmUgaW50ZXJ2YWxzIGFzc2lnbmVkLgorICBib29sIGlzUGh5c1JlZ1VzZWQodW5zaWduZWQgUGh5c1JlZykgY29uc3Q7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIExvdy1sZXZlbCBpbnRlcmZhY2UuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLworICAvLyBQcm92aWRlIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZyBMaXZlSW50ZXJ2YWxVbmlvbnMuCisgIC8vCisKKyAgLy8vIENoZWNrIGZvciByZWdtYXNrIGludGVyZmVyZW5jZSBvbmx5LgorICAvLy8gUmV0dXJuIHRydWUgaWYgVmlydFJlZyBjcm9zc2VzIGEgcmVnbWFzayBvcGVyYW5kIHRoYXQgY2xvYmJlcnMgUGh5c1JlZy4KKyAgLy8vIElmIFBoeXNSZWcgaXMgbnVsbCwgY2hlY2sgaWYgVmlydFJlZyBjcm9zc2VzIGFueSByZWdtYXNrIG9wZXJhbmRzLgorICBib29sIGNoZWNrUmVnTWFza0ludGVyZmVyZW5jZShMaXZlSW50ZXJ2YWwgJlZpcnRSZWcsIHVuc2lnbmVkIFBoeXNSZWcgPSAwKTsKKworICAvLy8gQ2hlY2sgZm9yIHJlZ3VuaXQgaW50ZXJmZXJlbmNlIG9ubHkuCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBWaXJ0UmVnIG92ZXJsYXBzIGEgZml4ZWQgYXNzaWdubWVudCBvZiBvbmUgb2YgUGh5c1JlZ3MncworICAvLy8gcmVnaXN0ZXIgdW5pdHMuCisgIGJvb2wgY2hlY2tSZWdVbml0SW50ZXJmZXJlbmNlKExpdmVJbnRlcnZhbCAmVmlydFJlZywgdW5zaWduZWQgUGh5c1JlZyk7CisKKyAgLy8vIFF1ZXJ5IGEgbGluZSBvZiB0aGUgYXNzaWduZWQgdmlydHVhbCByZWdpc3RlciBtYXRyaXggZGlyZWN0bHkuCisgIC8vLyBVc2UgTUNSZWdVbml0SXRlcmF0b3IgdG8gZW51bWVyYXRlIGFsbCByZWd1bml0cyBpbiB0aGUgZGVzaXJlZCBQaHlzUmVnLgorICAvLy8gVGhpcyByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGFuIGludGVybmFsIFF1ZXJ5IGRhdGEgc3RydWN0dXJlIHRoYXQgaXMgb25seQorICAvLy8gdmFsaWQgdW50aWwgdGhlIG5leHQgcXVlcnkoKSBjYWxsLgorICBMaXZlSW50ZXJ2YWxVbmlvbjo6UXVlcnkgJnF1ZXJ5KGNvbnN0IExpdmVSYW5nZSAmTFIsIHVuc2lnbmVkIFJlZ1VuaXQpOworCisgIC8vLyBEaXJlY3RseSBhY2Nlc3MgdGhlIGxpdmUgaW50ZXJ2YWwgdW5pb25zIHBlciByZWd1bml0LgorICAvLy8gVGhpcyByZXR1cm5zIGFuIGFycmF5IGluZGV4ZWQgYnkgdGhlIHJlZ3VuaXQgbnVtYmVyLgorICBMaXZlSW50ZXJ2YWxVbmlvbiAqZ2V0TGl2ZVVuaW9ucygpIHsgcmV0dXJuICZNYXRyaXhbMF07IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTElWRVJFR01BVFJJWF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZVJlZ1VuaXRzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZVJlZ1VuaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM0OTU2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaXZlUmVnVW5pdHMuaApAQCAtMCwwICsxLDEzNSBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9MaXZlUmVnVW5pdHMuaCAtIFJlZ2lzdGVyIFVuaXQgU2V0IC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBBIHNldCBvZiByZWdpc3RlciB1bml0cy4gSXQgaXMgaW50ZW5kZWQgZm9yIHJlZ2lzdGVyIGxpdmVuZXNzIHRyYWNraW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0xJVkVSRUdVTklUU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9MSVZFUkVHVU5JVFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldFJlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgImxsdm0vTUMvTGFuZUJpdG1hc2suaCIKKyNpbmNsdWRlICJsbHZtL01DL01DUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKKworLy8vIEEgc2V0IG9mIHJlZ2lzdGVyIHVuaXRzIHVzZWQgdG8gdHJhY2sgcmVnaXN0ZXIgbGl2ZW5lc3MuCitjbGFzcyBMaXZlUmVnVW5pdHMgeworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSA9IG51bGxwdHI7CisgIEJpdFZlY3RvciBVbml0czsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0cyBhIG5ldyBlbXB0eSBMaXZlUmVnVW5pdHMgc2V0LgorICBMaXZlUmVnVW5pdHMoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIENvbnN0cnVjdHMgYW5kIGluaXRpYWxpemUgYW4gZW1wdHkgTGl2ZVJlZ1VuaXRzIHNldC4KKyAgTGl2ZVJlZ1VuaXRzKGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJKSB7CisgICAgaW5pdChUUkkpOworICB9CisKKyAgLy8vIEluaXRpYWxpemUgYW5kIGNsZWFyIHRoZSBzZXQuCisgIHZvaWQgaW5pdChjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSkgeworICAgIHRoaXMtPlRSSSA9ICZUUkk7CisgICAgVW5pdHMucmVzZXQoKTsKKyAgICBVbml0cy5yZXNpemUoVFJJLmdldE51bVJlZ1VuaXRzKCkpOworICB9CisKKyAgLy8vIENsZWFycyB0aGUgc2V0LgorICB2b2lkIGNsZWFyKCkgeyBVbml0cy5yZXNldCgpOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc2V0IGlzIGVtcHR5LgorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gVW5pdHMubm9uZSgpOyB9CisKKyAgLy8vIEFkZHMgcmVnaXN0ZXIgdW5pdHMgY292ZXJlZCBieSBwaHlzaWNhbCByZWdpc3RlciBccCBSZWcuCisgIHZvaWQgYWRkUmVnKHVuc2lnbmVkIFJlZykgeworICAgIGZvciAoTUNSZWdVbml0SXRlcmF0b3IgVW5pdChSZWcsIFRSSSk7IFVuaXQuaXNWYWxpZCgpOyArK1VuaXQpCisgICAgICBVbml0cy5zZXQoKlVuaXQpOworICB9CisKKyAgLy8vIFxicmllZiBBZGRzIHJlZ2lzdGVyIHVuaXRzIGNvdmVyZWQgYnkgcGh5c2ljYWwgcmVnaXN0ZXIgXHAgUmVnIHRoYXQgYXJlCisgIC8vLyBwYXJ0IG9mIHRoZSBsYW5lbWFzayBccCBNYXNrLgorICB2b2lkIGFkZFJlZ01hc2tlZCh1bnNpZ25lZCBSZWcsIExhbmVCaXRtYXNrIE1hc2spIHsKKyAgICBmb3IgKE1DUmVnVW5pdE1hc2tJdGVyYXRvciBVbml0KFJlZywgVFJJKTsgVW5pdC5pc1ZhbGlkKCk7ICsrVW5pdCkgeworICAgICAgTGFuZUJpdG1hc2sgVW5pdE1hc2sgPSAoKlVuaXQpLnNlY29uZDsKKyAgICAgIGlmIChVbml0TWFzay5ub25lKCkgfHwgKFVuaXRNYXNrICYgTWFzaykuYW55KCkpCisgICAgICAgIFVuaXRzLnNldCgoKlVuaXQpLmZpcnN0KTsKKyAgICB9CisgIH0KKworICAvLy8gUmVtb3ZlcyBhbGwgcmVnaXN0ZXIgdW5pdHMgY292ZXJlZCBieSBwaHlzaWNhbCByZWdpc3RlciBccCBSZWcuCisgIHZvaWQgcmVtb3ZlUmVnKHVuc2lnbmVkIFJlZykgeworICAgIGZvciAoTUNSZWdVbml0SXRlcmF0b3IgVW5pdChSZWcsIFRSSSk7IFVuaXQuaXNWYWxpZCgpOyArK1VuaXQpCisgICAgICBVbml0cy5yZXNldCgqVW5pdCk7CisgIH0KKworICAvLy8gUmVtb3ZlcyByZWdpc3RlciB1bml0cyBub3QgcHJlc2VydmVkIGJ5IHRoZSByZWdtYXNrIFxwIFJlZ01hc2suCisgIC8vLyBUaGUgcmVnbWFzayBoYXMgdGhlIHNhbWUgZm9ybWF0IGFzIHRoZSBvbmUgaW4gdGhlIFJlZ01hc2sgbWFjaGluZSBvcGVyYW5kLgorICB2b2lkIHJlbW92ZVJlZ3NOb3RQcmVzZXJ2ZWQoY29uc3QgdWludDMyX3QgKlJlZ01hc2spOworCisgIC8vLyBBZGRzIHJlZ2lzdGVyIHVuaXRzIG5vdCBwcmVzZXJ2ZWQgYnkgdGhlIHJlZ21hc2sgXHAgUmVnTWFzay4KKyAgLy8vIFRoZSByZWdtYXNrIGhhcyB0aGUgc2FtZSBmb3JtYXQgYXMgdGhlIG9uZSBpbiB0aGUgUmVnTWFzayBtYWNoaW5lIG9wZXJhbmQuCisgIHZvaWQgYWRkUmVnc0luTWFzayhjb25zdCB1aW50MzJfdCAqUmVnTWFzayk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBubyBwYXJ0IG9mIHBoeXNpY2FsIHJlZ2lzdGVyIFxwIFJlZyBpcyBsaXZlLgorICBib29sIGF2YWlsYWJsZSh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICBmb3IgKE1DUmVnVW5pdEl0ZXJhdG9yIFVuaXQoUmVnLCBUUkkpOyBVbml0LmlzVmFsaWQoKTsgKytVbml0KSB7CisgICAgICBpZiAoVW5pdHMudGVzdCgqVW5pdCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gVXBkYXRlcyBsaXZlbmVzcyB3aGVuIHN0ZXBwaW5nIGJhY2t3YXJkcyBvdmVyIHRoZSBpbnN0cnVjdGlvbiBccCBNSS4KKyAgLy8vIFRoaXMgcmVtb3ZlcyBhbGwgcmVnaXN0ZXIgdW5pdHMgZGVmaW5lZCBvciBjbG9iYmVyZWQgaW4gXHAgTUkgYW5kIHRoZW4KKyAgLy8vIGFkZHMgdGhlIHVuaXRzIHVzZWQgKGFzIGluIHVzZSBvcGVyYW5kcykgaW4gXHAgTUkuCisgIHZvaWQgc3RlcEJhY2t3YXJkKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpOworCisgIC8vLyBBZGRzIGFsbCByZWdpc3RlciB1bml0cyB1c2VkLCBkZWZpbmVkIG9yIGNsb2JiZXJlZCBpbiBccCBNSS4KKyAgLy8vIFRoaXMgaXMgdXNlZnVsIHdoZW4gd2Fsa2luZyBvdmVyIGEgcmFuZ2Ugb2YgaW5zdHJ1Y3Rpb24gdG8gZmluZCByZWdpc3RlcnMKKyAgLy8vIHVudXNlZCBvdmVyIHRoZSB3aG9sZSByYW5nZS4KKyAgdm9pZCBhY2N1bXVsYXRlKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpOworCisgIC8vLyBBZGRzIHJlZ2lzdGVycyBsaXZpbmcgb3V0IG9mIGJsb2NrIFxwIE1CQi4KKyAgLy8vIExpdmUgb3V0IHJlZ2lzdGVycyBhcmUgdGhlIHVuaW9uIG9mIHRoZSBsaXZlLWluIHJlZ2lzdGVycyBvZiB0aGUgc3VjY2Vzc29yCisgIC8vLyBibG9ja3MgYW5kIHByaXN0aW5lIHJlZ2lzdGVycy4gTGl2ZSBvdXQgcmVnaXN0ZXJzIG9mIHRoZSBlbmQgYmxvY2sgYXJlIHRoZQorICAvLy8gY2FsbGVlIHNhdmVkIHJlZ2lzdGVycy4KKyAgdm9pZCBhZGRMaXZlT3V0cyhjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKTsKKworICAvLy8gQWRkcyByZWdpc3RlcnMgbGl2aW5nIGludG8gYmxvY2sgXHAgTUJCLgorICB2b2lkIGFkZExpdmVJbnMoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisKKyAgLy8vIEFkZHMgYWxsIHJlZ2lzdGVyIHVuaXRzIG1hcmtlZCBpbiB0aGUgYml0dmVjdG9yIFxwIFJlZ1VuaXRzLgorICB2b2lkIGFkZFVuaXRzKGNvbnN0IEJpdFZlY3RvciAmUmVnVW5pdHMpIHsKKyAgICBVbml0cyB8PSBSZWdVbml0czsKKyAgfQorICAvLy8gUmVtb3ZlcyBhbGwgcmVnaXN0ZXIgdW5pdHMgbWFya2VkIGluIHRoZSBiaXR2ZWN0b3IgXHAgUmVnVW5pdHMuCisgIHZvaWQgcmVtb3ZlVW5pdHMoY29uc3QgQml0VmVjdG9yICZSZWdVbml0cykgeworICAgIFVuaXRzLnJlc2V0KFJlZ1VuaXRzKTsKKyAgfQorICAvLy8gUmV0dXJuIHRoZSBpbnRlcm5hbCBiaXR2ZWN0b3IgcmVwcmVzZW50YXRpb24gb2YgdGhlIHNldC4KKyAgY29uc3QgQml0VmVjdG9yICZnZXRCaXRWZWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIFVuaXRzOworICB9CisKK3ByaXZhdGU6CisgIC8vLyBBZGRzIHByaXN0aW5lIHJlZ2lzdGVycy4gUHJpc3RpbmUgcmVnaXN0ZXJzIGFyZSBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzCisgIC8vLyB0aGF0IGFyZSB1bnVzZWQgaW4gdGhlIGZ1bmN0aW9uLgorICB2b2lkIGFkZFByaXN0aW5lcyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTElWRVJFR1VOSVRTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaXZlU3RhY2tzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZVN0YWNrcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZWQ3ODUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZVN0YWNrcy5oCkBAIC0wLDAgKzEsMTAzIEBACisvLz09PS0gTGl2ZVN0YWNrcy5oIC0gTGl2ZSBTdGFjayBTbG90IEFuYWx5c2lzIC0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBsaXZlIHN0YWNrIHNsb3QgYW5hbHlzaXMgcGFzcy4gSXQgaXMgYW5hbG9nb3VzIHRvCisvLyBsaXZlIGludGVydmFsIGFuYWx5c2lzIGV4Y2VwdCBpdCdzIGFuYWx5emluZyBsaXZlbmVzcyBvZiBzdGFjayBzbG90cyByYXRoZXIKKy8vIHRoYW4gcmVnaXN0ZXJzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX0xJVkVTVEFDS1NfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTElWRVNUQUNLU19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTGl2ZUludGVydmFsLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFRhcmdldFJlZ2lzdGVyQ2xhc3M7CitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CisKK2NsYXNzIExpdmVTdGFja3MgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJOworCisgIC8vLyBTcGVjaWFsIHBvb2wgYWxsb2NhdG9yIGZvciBWTkluZm8ncyAoTGl2ZUludGVydmFsIHZhbCMpLgorICAvLy8KKyAgVk5JbmZvOjpBbGxvY2F0b3IgVk5JbmZvQWxsb2NhdG9yOworCisgIC8vLyBTMklNYXAgLSBTdGFjayBzbG90IGluZGljZXMgdG8gbGl2ZSBpbnRlcnZhbCBtYXBwaW5nLgorICB1c2luZyBTUzJJbnRlcnZhbE1hcCA9IHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQsIExpdmVJbnRlcnZhbD47CisgIFNTMkludGVydmFsTWFwIFMySU1hcDsKKworICAvLy8gUzJSQ01hcCAtIFN0YWNrIHNsb3QgaW5kaWNlcyB0byByZWdpc3RlciBjbGFzcyBtYXBwaW5nLgorICBzdGQ6Om1hcDxpbnQsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKj4gUzJSQ01hcDsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorCisgIExpdmVTdGFja3MoKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHsKKyAgICBpbml0aWFsaXplTGl2ZVN0YWNrc1Bhc3MoKlBhc3NSZWdpc3RyeTo6Z2V0UGFzc1JlZ2lzdHJ5KCkpOworICB9CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBTUzJJbnRlcnZhbE1hcDo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gU1MySW50ZXJ2YWxNYXA6OmNvbnN0X2l0ZXJhdG9yOworCisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gUzJJTWFwLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gUzJJTWFwLmVuZCgpOyB9CisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gUzJJTWFwLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gUzJJTWFwLmVuZCgpOyB9CisKKyAgdW5zaWduZWQgZ2V0TnVtSW50ZXJ2YWxzKCkgY29uc3QgeyByZXR1cm4gKHVuc2lnbmVkKVMySU1hcC5zaXplKCk7IH0KKworICBMaXZlSW50ZXJ2YWwgJmdldE9yQ3JlYXRlSW50ZXJ2YWwoaW50IFNsb3QsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKTsKKworICBMaXZlSW50ZXJ2YWwgJmdldEludGVydmFsKGludCBTbG90KSB7CisgICAgYXNzZXJ0KFNsb3QgPj0gMCAmJiAiU3BpbGwgc2xvdCBpbmRpY2UgbXVzdCBiZSA+PSAwIik7CisgICAgU1MySW50ZXJ2YWxNYXA6Oml0ZXJhdG9yIEkgPSBTMklNYXAuZmluZChTbG90KTsKKyAgICBhc3NlcnQoSSAhPSBTMklNYXAuZW5kKCkgJiYgIkludGVydmFsIGRvZXMgbm90IGV4aXN0IGZvciBzdGFjayBzbG90Iik7CisgICAgcmV0dXJuIEktPnNlY29uZDsKKyAgfQorCisgIGNvbnN0IExpdmVJbnRlcnZhbCAmZ2V0SW50ZXJ2YWwoaW50IFNsb3QpIGNvbnN0IHsKKyAgICBhc3NlcnQoU2xvdCA+PSAwICYmICJTcGlsbCBzbG90IGluZGljZSBtdXN0IGJlID49IDAiKTsKKyAgICBTUzJJbnRlcnZhbE1hcDo6Y29uc3RfaXRlcmF0b3IgSSA9IFMySU1hcC5maW5kKFNsb3QpOworICAgIGFzc2VydChJICE9IFMySU1hcC5lbmQoKSAmJiAiSW50ZXJ2YWwgZG9lcyBub3QgZXhpc3QgZm9yIHN0YWNrIHNsb3QiKTsKKyAgICByZXR1cm4gSS0+c2Vjb25kOworICB9CisKKyAgYm9vbCBoYXNJbnRlcnZhbChpbnQgU2xvdCkgY29uc3QgeyByZXR1cm4gUzJJTWFwLmNvdW50KFNsb3QpOyB9CisKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqZ2V0SW50ZXJ2YWxSZWdDbGFzcyhpbnQgU2xvdCkgY29uc3QgeworICAgIGFzc2VydChTbG90ID49IDAgJiYgIlNwaWxsIHNsb3QgaW5kaWNlIG11c3QgYmUgPj0gMCIpOworICAgIHN0ZDo6bWFwPGludCwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqPjo6Y29uc3RfaXRlcmF0b3IgSSA9CisgICAgICAgIFMyUkNNYXAuZmluZChTbG90KTsKKyAgICBhc3NlcnQoSSAhPSBTMlJDTWFwLmVuZCgpICYmCisgICAgICAgICAgICJSZWdpc3RlciBjbGFzcyBpbmZvIGRvZXMgbm90IGV4aXN0IGZvciBzdGFjayBzbG90Iik7CisgICAgcmV0dXJuIEktPnNlY29uZDsKKyAgfQorCisgIFZOSW5mbzo6QWxsb2NhdG9yICZnZXRWTkluZm9BbGxvY2F0b3IoKSB7IHJldHVybiBWTkluZm9BbGxvY2F0b3I7IH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZTsKKworICAvLy8gcnVuT25NYWNoaW5lRnVuY3Rpb24gLSBwYXNzIGVudHJ5IHBvaW50CisgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICYpIG92ZXJyaWRlOworCisgIC8vLyBwcmludCAtIEltcGxlbWVudCB0aGUgZHVtcCBtZXRob2QuCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8sIGNvbnN0IE1vZHVsZSAqID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9MaXZlVmFyaWFibGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZVZhcmlhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkOGRhODYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTGl2ZVZhcmlhYmxlcy5oCkBAIC0wLDAgKzEsMzA5IEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9MaXZlVmFyaWFibGVzLmggLSBMaXZlIFZhcmlhYmxlIEFuYWx5c2lzIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBMaXZlVmFyaWFibGVzIGFuYWx5c2lzIHBhc3MuICBGb3IgZWFjaCBtYWNoaW5lCisvLyBpbnN0cnVjdGlvbiBpbiB0aGUgZnVuY3Rpb24sIHRoaXMgcGFzcyBjYWxjdWxhdGVzIHRoZSBzZXQgb2YgcmVnaXN0ZXJzIHRoYXQKKy8vIGFyZSBpbW1lZGlhdGVseSBkZWFkIGFmdGVyIHRoZSBpbnN0cnVjdGlvbiAoaS5lLiwgdGhlIGluc3RydWN0aW9uIGNhbGN1bGF0ZXMKKy8vIHRoZSB2YWx1ZSwgYnV0IGl0IGlzIG5ldmVyIHVzZWQpIGFuZCB0aGUgc2V0IG9mIHJlZ2lzdGVycyB0aGF0IGFyZSB1c2VkIGJ5CisvLyB0aGUgaW5zdHJ1Y3Rpb24sIGJ1dCBhcmUgbmV2ZXIgdXNlZCBhZnRlciB0aGUgaW5zdHJ1Y3Rpb24gKGkuZS4sIHRoZXkgYXJlCisvLyBraWxsZWQpLgorLy8KKy8vIFRoaXMgY2xhc3MgY29tcHV0ZXMgbGl2ZSB2YXJpYWJsZXMgdXNpbmcgYSBzcGFyc2UgaW1wbGVtZW50YXRpb24gYmFzZWQgb24KKy8vIHRoZSBtYWNoaW5lIGNvZGUgU1NBIGZvcm0uICBUaGlzIGNsYXNzIGNvbXB1dGVzIGxpdmUgdmFyaWFibGUgaW5mb3JtYXRpb24gZm9yCisvLyBlYWNoIHZpcnR1YWwgYW5kIF9yZWdpc3RlciBhbGxvY2F0YWJsZV8gcGh5c2ljYWwgcmVnaXN0ZXIgaW4gYSBmdW5jdGlvbi4gIEl0CisvLyB1c2VzIHRoZSBkb21pbmFuY2UgcHJvcGVydGllcyBvZiBTU0EgZm9ybSB0byBlZmZpY2llbnRseSBjb21wdXRlIGxpdmUKKy8vIHZhcmlhYmxlcyBmb3IgdmlydHVhbCByZWdpc3RlcnMsIGFuZCBhc3N1bWVzIHRoYXQgcGh5c2ljYWwgcmVnaXN0ZXJzIGFyZSBvbmx5CisvLyBsaXZlIHdpdGhpbiBhIHNpbmdsZSBiYXNpYyBibG9jayAoYWxsb3dpbmcgaXQgdG8gZG8gYSBzaW5nbGUgbG9jYWwgYW5hbHlzaXMKKy8vIHRvIHJlc29sdmUgcGh5c2ljYWwgcmVnaXN0ZXIgbGlmZXRpbWVzIGluIGVhY2ggYmFzaWMgYmxvY2spLiAgSWYgYSBwaHlzaWNhbAorLy8gcmVnaXN0ZXIgaXMgbm90IHJlZ2lzdGVyIGFsbG9jYXRhYmxlLCBpdCBpcyBub3QgdHJhY2tlZC4gIFRoaXMgaXMgdXNlZnVsIGZvcgorLy8gdGhpbmdzIGxpa2UgdGhlIHN0YWNrIHBvaW50ZXIgYW5kIGNvbmRpdGlvbiBjb2Rlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9MSVZFVkFSSUFCTEVTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX0xJVkVWQVJJQUJMRVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9JbmRleGVkTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NwYXJzZUJpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRSZWdpc3RlckluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKK2NsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CisKK2NsYXNzIExpdmVWYXJpYWJsZXMgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisgIExpdmVWYXJpYWJsZXMoKSA6IE1hY2hpbmVGdW5jdGlvblBhc3MoSUQpIHsKKyAgICBpbml0aWFsaXplTGl2ZVZhcmlhYmxlc1Bhc3MoKlBhc3NSZWdpc3RyeTo6Z2V0UGFzc1JlZ2lzdHJ5KCkpOworICB9CisKKyAgLy8vIFZhckluZm8gLSBUaGlzIHJlcHJlc2VudHMgdGhlIHJlZ2lvbnMgd2hlcmUgYSB2aXJ0dWFsIHJlZ2lzdGVyIGlzIGxpdmUgaW4KKyAgLy8vIHRoZSBwcm9ncmFtLiAgV2UgcmVwcmVzZW50IHRoaXMgd2l0aCB0aHJlZSBkaWZmZXJlbnQgcGllY2VzIG9mCisgIC8vLyBpbmZvcm1hdGlvbjogdGhlIHNldCBvZiBibG9ja3MgaW4gd2hpY2ggdGhlIGluc3RydWN0aW9uIGlzIGxpdmUKKyAgLy8vIHRocm91Z2hvdXQsIHRoZSBzZXQgb2YgYmxvY2tzIGluIHdoaWNoIHRoZSBpbnN0cnVjdGlvbiBpcyBhY3R1YWxseSB1c2VkLAorICAvLy8gYW5kIHRoZSBzZXQgb2Ygbm9uLXBoaSBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgdGhlIGxhc3QgdXNlcnMgb2YgdGhlIHZhbHVlLgorICAvLy8KKyAgLy8vIEluIHRoZSBjb21tb24gY2FzZSB3aGVyZSBhIHZhbHVlIGlzIGRlZmluZWQgYW5kIGtpbGxlZCBpbiB0aGUgc2FtZSBibG9jaywKKyAgLy8vIFRoZXJlIGlzIG9uZSBraWxsaW5nIGluc3RydWN0aW9uLCBhbmQgQWxpdmVCbG9ja3MgaXMgZW1wdHkuCisgIC8vLworICAvLy8gT3RoZXJ3aXNlLCB0aGUgdmFsdWUgaXMgbGl2ZSBvdXQgb2YgdGhlIGJsb2NrLiAgSWYgdGhlIHZhbHVlIGlzIGxpdmUKKyAgLy8vIHRocm91Z2hvdXQgYW55IGJsb2NrcywgdGhlc2UgYmxvY2tzIGFyZSBsaXN0ZWQgaW4gQWxpdmVCbG9ja3MuICBCbG9ja3MKKyAgLy8vIHdoZXJlIHRoZSBsaXZlbmVzcyByYW5nZSBlbmRzIGFyZSBub3QgaW5jbHVkZWQgaW4gQWxpdmVCbG9ja3MsIGluc3RlYWQKKyAgLy8vIGJlaW5nIGNhcHR1cmVkIGJ5IHRoZSBLaWxscyBzZXQuICBJbiB0aGVzZSBibG9ja3MsIHRoZSB2YWx1ZSBpcyBsaXZlIGludG8KKyAgLy8vIHRoZSBibG9jayAodW5sZXNzIHRoZSB2YWx1ZSBpcyBkZWZpbmVkIGFuZCBraWxsZWQgaW4gdGhlIHNhbWUgYmxvY2spIGFuZAorICAvLy8gbGl2ZXMgdW50aWwgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbi4gIE5vdGUgdGhhdCB0aGVyZSBjYW5ub3QgZXZlciBiZSBhCisgIC8vLyB2YWx1ZSB3aG9zZSBLaWxscyBzZXQgY29udGFpbnMgdHdvIGluc3RydWN0aW9ucyBmcm9tIHRoZSBzYW1lIGJhc2ljIGJsb2NrLgorICAvLy8KKyAgLy8vIFBISSBub2RlcyBjb21wbGljYXRlIHRoaW5ncyBhIGJpdC4gIElmIGEgUEhJIG5vZGUgaXMgdGhlIGxhc3QgdXNlciBvZiBhCisgIC8vLyB2YWx1ZSBpbiBvbmUgb2YgaXRzIHByZWRlY2Vzc29yIGJsb2NrcywgaXQgaXMgbm90IGxpc3RlZCBpbiB0aGUga2lsbHMgc2V0LAorICAvLy8gYnV0IGRvZXMgaW5jbHVkZSB0aGUgcHJlZGVjZXNzb3IgYmxvY2sgaW4gdGhlIEFsaXZlQmxvY2tzIHNldCAodW5sZXNzIHRoYXQKKyAgLy8vIGJsb2NrIGFsc28gZGVmaW5lcyB0aGUgdmFsdWUpLiAgVGhpcyBsZWFkcyB0byB0aGUgKHBlcmZlY3RseSBzZW5zaWNhbCkKKyAgLy8vIHNpdHVhdGlvbiB3aGVyZSBhIHZhbHVlIGlzIGRlZmluZWQgaW4gYSBibG9jaywgYW5kIHRoZSBsYXN0IHVzZSBpcyBhIHBoaQorICAvLy8gbm9kZSBpbiB0aGUgc3VjY2Vzc29yLiAgSW4gdGhpcyBjYXNlLCBBbGl2ZUJsb2NrcyBpcyBlbXB0eSAodGhlIHZhbHVlIGlzCisgIC8vLyBub3QgbGl2ZSBhY3Jvc3MgYW55ICBibG9ja3MpIGFuZCBLaWxscyBpcyBlbXB0eSAocGhpIG5vZGVzIGFyZSBub3QKKyAgLy8vIGluY2x1ZGVkKS4gVGhpcyBpcyBzZW5zaWNhbCBiZWNhdXNlIHRoZSB2YWx1ZSBtdXN0IGJlIGxpdmUgdG8gdGhlIGVuZCBvZgorICAvLy8gdGhlIGJsb2NrLCBidXQgaXMgbm90IGxpdmUgaW4gYW55IHN1Y2Nlc3NvciBibG9ja3MuCisgIHN0cnVjdCBWYXJJbmZvIHsKKyAgICAvLy8gQWxpdmVCbG9ja3MgLSBTZXQgb2YgYmxvY2tzIGluIHdoaWNoIHRoaXMgdmFsdWUgaXMgYWxpdmUgY29tcGxldGVseQorICAgIC8vLyB0aHJvdWdoLiAgVGhpcyBpcyBhIGJpdCBzZXQgd2hpY2ggdXNlcyB0aGUgYmFzaWMgYmxvY2sgbnVtYmVyIGFzIGFuCisgICAgLy8vIGluZGV4LgorICAgIC8vLworICAgIFNwYXJzZUJpdFZlY3Rvcjw+IEFsaXZlQmxvY2tzOworCisgICAgLy8vIEtpbGxzIC0gTGlzdCBvZiBNYWNoaW5lSW5zdHJ1Y3Rpb24ncyB3aGljaCBhcmUgdGhlIGxhc3QgdXNlIG9mIHRoaXMKKyAgICAvLy8gdmlydHVhbCByZWdpc3RlciAoa2lsbCBpdCkgaW4gdGhlaXIgYmFzaWMgYmxvY2suCisgICAgLy8vCisgICAgc3RkOjp2ZWN0b3I8TWFjaGluZUluc3RyKj4gS2lsbHM7CisKKyAgICAvLy8gcmVtb3ZlS2lsbCAtIERlbGV0ZSBhIGtpbGwgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkCisgICAgLy8vIG1hY2hpbmUgaW5zdHJ1Y3Rpb24uIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSB3YXMgYSBraWxsCisgICAgLy8vIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBpbnN0cnVjdGlvbiwgZmFsc2Ugb3RoZXJ3aXNlLgorICAgIGJvb2wgcmVtb3ZlS2lsbChNYWNoaW5lSW5zdHIgJk1JKSB7CisgICAgICBzdGQ6OnZlY3RvcjxNYWNoaW5lSW5zdHIgKj46Oml0ZXJhdG9yIEkgPSBmaW5kKEtpbGxzLCAmTUkpOworICAgICAgaWYgKEkgPT0gS2lsbHMuZW5kKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIEtpbGxzLmVyYXNlKEkpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8vIGZpbmRLaWxsIC0gRmluZCBhIGtpbGwgaW5zdHJ1Y3Rpb24gaW4gTUJCLiBSZXR1cm4gTlVMTCBpZiBub25lIGlzIGZvdW5kLgorICAgIE1hY2hpbmVJbnN0ciAqZmluZEtpbGwoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgY29uc3Q7CisKKyAgICAvLy8gaXNMaXZlSW4gLSBJcyBSZWcgbGl2ZSBpbiB0byBNQkI/IFRoaXMgbWVhbnMgdGhhdCBSZWcgaXMgbGl2ZSB0aHJvdWdoCisgICAgLy8vIE1CQiwgb3IgaXQgaXMga2lsbGVkIGluIE1CQi4gSWYgUmVnIGlzIG9ubHkgdXNlZCBieSBQSEkgaW5zdHJ1Y3Rpb25zIGluCisgICAgLy8vIE1CQiwgaXQgaXMgbm90IGNvbnNpZGVyZWQgbGl2ZSBpbi4KKyAgICBib29sIGlzTGl2ZUluKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkkpOworCisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisgIH07CisKK3ByaXZhdGU6CisgIC8vLyBWaXJ0UmVnSW5mbyAtIFRoaXMgbGlzdCBpcyBhIG1hcHBpbmcgZnJvbSB2aXJ0dWFsIHJlZ2lzdGVyIG51bWJlciB0bworICAvLy8gdmFyaWFibGUgaW5mb3JtYXRpb24uCisgIC8vLworICBJbmRleGVkTWFwPFZhckluZm8sIFZpcnRSZWcySW5kZXhGdW5jdG9yPiBWaXJ0UmVnSW5mbzsKKworICAvLy8gUEhJSm9pbnMgLSBsaXN0IG9mIHZpcnR1YWwgcmVnaXN0ZXJzIHRoYXQgYXJlIFBISSBqb2lucy4gVGhlc2UgcmVnaXN0ZXJzCisgIC8vLyBtYXkgaGF2ZSBtdWx0aXBsZSBkZWZpbml0aW9ucywgYW5kIHRoZXkgcmVxdWlyZSBzcGVjaWFsIGhhbmRsaW5nIHdoZW4KKyAgLy8vIGJ1aWxkaW5nIGxpdmUgaW50ZXJ2YWxzLgorICBTcGFyc2VCaXRWZWN0b3I8PiBQSElKb2luczsKKworcHJpdmF0ZTogICAvLyBJbnRlcm1lZGlhdGUgZGF0YSBzdHJ1Y3R1cmVzCisgIE1hY2hpbmVGdW5jdGlvbiAqTUY7CisKKyAgTWFjaGluZVJlZ2lzdGVySW5mbyogTVJJOworCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJOworCisgIC8vIFBoeXNSZWdJbmZvIC0gS2VlcCB0cmFjayBvZiB3aGljaCBpbnN0cnVjdGlvbiB3YXMgdGhlIGxhc3QgZGVmIG9mIGEKKyAgLy8gcGh5c2ljYWwgcmVnaXN0ZXIuIFRoaXMgaXMgYSBwdXJlbHkgbG9jYWwgcHJvcGVydHksIGJlY2F1c2UgYWxsIHBoeXNpY2FsCisgIC8vIHJlZ2lzdGVyIHJlZmVyZW5jZXMgYXJlIHByZXN1bWVkIGRlYWQgYWNyb3NzIGJhc2ljIGJsb2Nrcy4KKyAgc3RkOjp2ZWN0b3I8TWFjaGluZUluc3RyICo+IFBoeXNSZWdEZWY7CisKKyAgLy8gUGh5c1JlZ0luZm8gLSBLZWVwIHRyYWNrIG9mIHdoaWNoIGluc3RydWN0aW9uIHdhcyB0aGUgbGFzdCB1c2Ugb2YgYQorICAvLyBwaHlzaWNhbCByZWdpc3Rlci4gVGhpcyBpcyBhIHB1cmVseSBsb2NhbCBwcm9wZXJ0eSwgYmVjYXVzZSBhbGwgcGh5c2ljYWwKKyAgLy8gcmVnaXN0ZXIgcmVmZXJlbmNlcyBhcmUgcHJlc3VtZWQgZGVhZCBhY3Jvc3MgYmFzaWMgYmxvY2tzLgorICBzdGQ6OnZlY3RvcjxNYWNoaW5lSW5zdHIgKj4gUGh5c1JlZ1VzZTsKKworICBzdGQ6OnZlY3RvcjxTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgND4+IFBISVZhckluZm87CisKKyAgLy8gRGlzdGFuY2VNYXAgLSBLZWVwIHRyYWNrIHRoZSBkaXN0YW5jZSBvZiBhIE1JIGZyb20gdGhlIHN0YXJ0IG9mIHRoZQorICAvLyBjdXJyZW50IGJhc2ljIGJsb2NrLgorICBEZW5zZU1hcDxNYWNoaW5lSW5zdHIqLCB1bnNpZ25lZD4gRGlzdGFuY2VNYXA7CisKKyAgLy8vIEhhbmRsZVBoeXNSZWdLaWxsIC0gQWRkIGtpbGxzIG9mIFJlZyBhbmQgaXRzIHN1Yi1yZWdpc3RlcnMgdG8gdGhlCisgIC8vLyB1c2VzLiBQYXkgc3BlY2lhbCBhdHRlbnRpb24gdG8gdGhlIHN1Yi1yZWdpc3RlciB1c2VzIHdoaWNoIG1heSBjb21lIGJlbG93CisgIC8vLyB0aGUgbGFzdCB1c2Ugb2YgdGhlIHdob2xlIHJlZ2lzdGVyLgorICBib29sIEhhbmRsZVBoeXNSZWdLaWxsKHVuc2lnbmVkIFJlZywgTWFjaGluZUluc3RyICpNSSk7CisKKyAgLy8vIEhhbmRsZVJlZ01hc2sgLSBDYWxsIEhhbmRsZVBoeXNSZWdLaWxsIGZvciBhbGwgcmVnaXN0ZXJzIGNsb2JiZXJlZCBieSBNYXNrLgorICB2b2lkIEhhbmRsZVJlZ01hc2soY29uc3QgTWFjaGluZU9wZXJhbmQmKTsKKworICB2b2lkIEhhbmRsZVBoeXNSZWdVc2UodW5zaWduZWQgUmVnLCBNYWNoaW5lSW5zdHIgJk1JKTsKKyAgdm9pZCBIYW5kbGVQaHlzUmVnRGVmKHVuc2lnbmVkIFJlZywgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD4gJkRlZnMpOworICB2b2lkIFVwZGF0ZVBoeXNSZWdEZWZzKE1hY2hpbmVJbnN0ciAmTUksIFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD4gJkRlZnMpOworCisgIC8vLyBGaW5kTGFzdFJlZk9yUGFydFJlZiAtIFJldHVybiB0aGUgbGFzdCByZWZlcmVuY2Ugb3IgcGFydGlhbCByZWZlcmVuY2Ugb2YKKyAgLy8vIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIuCisgIE1hY2hpbmVJbnN0ciAqRmluZExhc3RSZWZPclBhcnRSZWYodW5zaWduZWQgUmVnKTsKKworICAvLy8gRmluZExhc3RQYXJ0aWFsRGVmIC0gUmV0dXJuIHRoZSBsYXN0IHBhcnRpYWwgZGVmIG9mIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHJlZ2lzdGVyLiBBbHNvIHJldHVybnMgdGhlIHN1Yi1yZWdpc3RlcnMgdGhhdCdyZSBkZWZpbmVkIGJ5IHRoZQorICAvLy8gaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ciAqRmluZExhc3RQYXJ0aWFsRGVmKHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxTZXQ8dW5zaWduZWQsND4gJlBhcnREZWZSZWdzKTsKKworICAvLy8gYW5hbHl6ZVBISU5vZGVzIC0gR2F0aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBQSEkgbm9kZXMgaW4gaGVyZS4gSW4KKyAgLy8vIHBhcnRpY3VsYXIsIHdlIHdhbnQgdG8gbWFwIHRoZSB2YXJpYWJsZSBpbmZvcm1hdGlvbiBvZiBhIHZpcnR1YWwKKyAgLy8vIHJlZ2lzdGVyIHdoaWNoIGlzIHVzZWQgaW4gYSBQSEkgbm9kZS4gV2UgbWFwIHRoYXQgdG8gdGhlIEJCIHRoZSB2cmVnCisgIC8vLyBpcyBjb21pbmcgZnJvbS4KKyAgdm9pZCBhbmFseXplUEhJTm9kZXMoY29uc3QgTWFjaGluZUZ1bmN0aW9uJiBGbik7CisKKyAgdm9pZCBydW5Pbkluc3RyKE1hY2hpbmVJbnN0ciAmTUksIFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD4gJkRlZnMpOworCisgIHZvaWQgcnVuT25CbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqTUJCLCB1bnNpZ25lZCBOdW1SZWdzKTsKK3B1YmxpYzoKKworICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIG92ZXJyaWRlOworCisgIC8vLyBSZWdpc3RlckRlZklzRGVhZCAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gZGVmaW5lcyB0aGUKKyAgLy8vIHNwZWNpZmllZCByZWdpc3RlciwgYnV0IHRoYXQgZGVmaW5pdGlvbiBpcyBkZWFkLgorICBib29sIFJlZ2lzdGVyRGVmSXNEZWFkKE1hY2hpbmVJbnN0ciAmTUksIHVuc2lnbmVkIFJlZykgY29uc3Q7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vICBBUEkgdG8gdXBkYXRlIGxpdmUgdmFyaWFibGUgaW5mb3JtYXRpb24KKworICAvLy8gcmVwbGFjZUtpbGxJbnN0cnVjdGlvbiAtIFVwZGF0ZSByZWdpc3RlciBraWxsIGluZm8gYnkgcmVwbGFjaW5nIGEga2lsbAorICAvLy8gaW5zdHJ1Y3Rpb24gd2l0aCBhIG5ldyBvbmUuCisgIHZvaWQgcmVwbGFjZUtpbGxJbnN0cnVjdGlvbih1bnNpZ25lZCBSZWcsIE1hY2hpbmVJbnN0ciAmT2xkTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgJk5ld01JKTsKKworICAvLy8gYWRkVmlydHVhbFJlZ2lzdGVyS2lsbGVkIC0gQWRkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmYWN0IHRoYXQgdGhlCisgIC8vLyBzcGVjaWZpZWQgcmVnaXN0ZXIgaXMga2lsbGVkIGFmdGVyIGJlaW5nIHVzZWQgYnkgdGhlIHNwZWNpZmllZAorICAvLy8gaW5zdHJ1Y3Rpb24uIElmIEFkZElmTm90Rm91bmQgaXMgdHJ1ZSwgYWRkIGEgaW1wbGljaXQgb3BlcmFuZCBpZiBpdCdzCisgIC8vLyBub3QgZm91bmQuCisgIHZvaWQgYWRkVmlydHVhbFJlZ2lzdGVyS2lsbGVkKHVuc2lnbmVkIEluY29taW5nUmVnLCBNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFkZElmTm90Rm91bmQgPSBmYWxzZSkgeworICAgIGlmIChNSS5hZGRSZWdpc3RlcktpbGxlZChJbmNvbWluZ1JlZywgVFJJLCBBZGRJZk5vdEZvdW5kKSkKKyAgICAgIGdldFZhckluZm8oSW5jb21pbmdSZWcpLktpbGxzLnB1c2hfYmFjaygmTUkpOworICB9CisKKyAgLy8vIHJlbW92ZVZpcnR1YWxSZWdpc3RlcktpbGxlZCAtIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGtpbGwgb2YgdGhlIHZpcnR1YWwKKyAgLy8vIHJlZ2lzdGVyIGZyb20gdGhlIGxpdmUgdmFyaWFibGUgaW5mb3JtYXRpb24uIFJldHVybnMgdHJ1ZSBpZiB0aGUKKyAgLy8vIHZhcmlhYmxlIHdhcyBtYXJrZWQgYXMga2lsbGVkIGJ5IHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24sCisgIC8vLyBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgcmVtb3ZlVmlydHVhbFJlZ2lzdGVyS2lsbGVkKHVuc2lnbmVkIHJlZywgTWFjaGluZUluc3RyICZNSSkgeworICAgIGlmICghZ2V0VmFySW5mbyhyZWcpLnJlbW92ZUtpbGwoTUkpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbCBSZW1vdmVkID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS5nZXRPcGVyYW5kKGkpOworICAgICAgaWYgKE1PLmlzUmVnKCkgJiYgTU8uaXNLaWxsKCkgJiYgTU8uZ2V0UmVnKCkgPT0gcmVnKSB7CisgICAgICAgIE1PLnNldElzS2lsbChmYWxzZSk7CisgICAgICAgIFJlbW92ZWQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBhc3NlcnQoUmVtb3ZlZCAmJiAiUmVnaXN0ZXIgaXMgbm90IHVzZWQgYnkgdGhpcyBpbnN0cnVjdGlvbiEiKTsKKyAgICAodm9pZClSZW1vdmVkOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIHJlbW92ZVZpcnR1YWxSZWdpc3RlcnNLaWxsZWQgLSBSZW1vdmUgYWxsIGtpbGxlZCBpbmZvIGZvciB0aGUgc3BlY2lmaWVkCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgdm9pZCByZW1vdmVWaXJ0dWFsUmVnaXN0ZXJzS2lsbGVkKE1hY2hpbmVJbnN0ciAmTUkpOworCisgIC8vLyBhZGRWaXJ0dWFsUmVnaXN0ZXJEZWFkIC0gQWRkIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmYWN0IHRoYXQgdGhlIHNwZWNpZmllZAorICAvLy8gcmVnaXN0ZXIgaXMgZGVhZCBhZnRlciBiZWluZyB1c2VkIGJ5IHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uIElmCisgIC8vLyBBZGRJZk5vdEZvdW5kIGlzIHRydWUsIGFkZCBhIGltcGxpY2l0IG9wZXJhbmQgaWYgaXQncyBub3QgZm91bmQuCisgIHZvaWQgYWRkVmlydHVhbFJlZ2lzdGVyRGVhZCh1bnNpZ25lZCBJbmNvbWluZ1JlZywgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWRkSWZOb3RGb3VuZCA9IGZhbHNlKSB7CisgICAgaWYgKE1JLmFkZFJlZ2lzdGVyRGVhZChJbmNvbWluZ1JlZywgVFJJLCBBZGRJZk5vdEZvdW5kKSkKKyAgICAgIGdldFZhckluZm8oSW5jb21pbmdSZWcpLktpbGxzLnB1c2hfYmFjaygmTUkpOworICB9CisKKyAgLy8vIHJlbW92ZVZpcnR1YWxSZWdpc3RlckRlYWQgLSBSZW1vdmUgdGhlIHNwZWNpZmllZCBraWxsIG9mIHRoZSB2aXJ0dWFsCisgIC8vLyByZWdpc3RlciBmcm9tIHRoZSBsaXZlIHZhcmlhYmxlIGluZm9ybWF0aW9uLiBSZXR1cm5zIHRydWUgaWYgdGhlCisgIC8vLyB2YXJpYWJsZSB3YXMgbWFya2VkIGRlYWQgYXQgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiwgZmFsc2UKKyAgLy8vIG90aGVyd2lzZS4KKyAgYm9vbCByZW1vdmVWaXJ0dWFsUmVnaXN0ZXJEZWFkKHVuc2lnbmVkIHJlZywgTWFjaGluZUluc3RyICZNSSkgeworICAgIGlmICghZ2V0VmFySW5mbyhyZWcpLnJlbW92ZUtpbGwoTUkpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYm9vbCBSZW1vdmVkID0gZmFsc2U7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IE1JLmdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBNYWNoaW5lT3BlcmFuZCAmTU8gPSBNSS5nZXRPcGVyYW5kKGkpOworICAgICAgaWYgKE1PLmlzUmVnKCkgJiYgTU8uaXNEZWYoKSAmJiBNTy5nZXRSZWcoKSA9PSByZWcpIHsKKyAgICAgICAgTU8uc2V0SXNEZWFkKGZhbHNlKTsKKyAgICAgICAgUmVtb3ZlZCA9IHRydWU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgICBhc3NlcnQoUmVtb3ZlZCAmJiAiUmVnaXN0ZXIgaXMgbm90IGRlZmluZWQgYnkgdGhpcyBpbnN0cnVjdGlvbiEiKTsKKyAgICAodm9pZClSZW1vdmVkOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZSB7CisgICAgVmlydFJlZ0luZm8uY2xlYXIoKTsKKyAgfQorCisgIC8vLyBnZXRWYXJJbmZvIC0gUmV0dXJuIHRoZSBWYXJJbmZvIHN0cnVjdHVyZSBmb3IgdGhlIHNwZWNpZmllZCBWSVJUVUFMCisgIC8vLyByZWdpc3Rlci4KKyAgVmFySW5mbyAmZ2V0VmFySW5mbyh1bnNpZ25lZCBSZWdJZHgpOworCisgIHZvaWQgTWFya1ZpcnRSZWdBbGl2ZUluQmxvY2soVmFySW5mbyYgVlJJbmZvLCBNYWNoaW5lQmFzaWNCbG9jayogRGVmQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkJCKTsKKyAgdm9pZCBNYXJrVmlydFJlZ0FsaXZlSW5CbG9jayhWYXJJbmZvJiBWUkluZm8sIE1hY2hpbmVCYXNpY0Jsb2NrKiBEZWZCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqPiAmV29ya0xpc3QpOworICB2b2lkIEhhbmRsZVZpcnRSZWdEZWYodW5zaWduZWQgcmVnLCBNYWNoaW5lSW5zdHIgJk1JKTsKKyAgdm9pZCBIYW5kbGVWaXJ0UmVnVXNlKHVuc2lnbmVkIHJlZywgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwgTWFjaGluZUluc3RyICZNSSk7CisKKyAgYm9vbCBpc0xpdmVJbih1bnNpZ25lZCBSZWcsIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpIHsKKyAgICByZXR1cm4gZ2V0VmFySW5mbyhSZWcpLmlzTGl2ZUluKE1CQiwgUmVnLCAqTVJJKTsKKyAgfQorCisgIC8vLyBpc0xpdmVPdXQgLSBEZXRlcm1pbmUgaWYgUmVnIGlzIGxpdmUgb3V0IGZyb20gTUJCLCB3aGVuIG5vdCBjb25zaWRlcmluZworICAvLy8gUEhJIG5vZGVzLiBUaGlzIG1lYW5zIHRoYXQgUmVnIGlzIGVpdGhlciBraWxsZWQgYnkgYSBzdWNjZXNzb3IgYmxvY2sgb3IKKyAgLy8vIHBhc3NlZCB0aHJvdWdoIG9uZS4KKyAgYm9vbCBpc0xpdmVPdXQodW5zaWduZWQgUmVnLCBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKTsKKworICAvLy8gYWRkTmV3QmxvY2sgLSBBZGQgYSBuZXcgYmFzaWMgYmxvY2sgQkIgYmV0d2VlbiBEb21CQiBhbmQgU3VjY0JCLiBBbGwKKyAgLy8vIHZhcmlhYmxlcyB0aGF0IGFyZSBsaXZlIG91dCBvZiBEb21CQiBhbmQgbGl2ZSBpbnRvIFN1Y2NCQiB3aWxsIGJlIG1hcmtlZAorICAvLy8gYXMgcGFzc2luZyBsaXZlIHRocm91Z2ggQkIuIFRoaXMgbWV0aG9kIGFzc3VtZXMgdGhhdCB0aGUgbWFjaGluZSBjb2RlIGlzCisgIC8vLyBzdGlsbCBpbiBTU0EgZm9ybS4KKyAgdm9pZCBhZGROZXdCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkRvbUJCLAorICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpTdWNjQkIpOworCisgIC8vLyBpc1BISUpvaW4gLSBSZXR1cm4gdHJ1ZSBpZiBSZWcgaXMgYSBwaGkgam9pbiByZWdpc3Rlci4KKyAgYm9vbCBpc1BISUpvaW4odW5zaWduZWQgUmVnKSB7IHJldHVybiBQSElKb2lucy50ZXN0KFJlZyk7IH0KKworICAvLy8gc2V0UEhJSm9pbiAtIE1hcmsgUmVnIGFzIGEgcGhpIGpvaW4gcmVnaXN0ZXIuCisgIHZvaWQgc2V0UEhJSm9pbih1bnNpZ25lZCBSZWcpIHsgUEhJSm9pbnMuc2V0KFJlZyk7IH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xvb3BUcmF2ZXJzYWwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9Mb29wVHJhdmVyc2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgxNmY2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9Mb29wVHJhdmVyc2FsLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8vPT0tLS0tLS0gbGx2bS9Db2RlR2VuL0xvb3BUcmF2ZXJzYWwuaCAtIExvb3AgVHJhdmVyc2FsIC0qLSBDKysgLSotLS0tLS0tLS09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlIExvb3AgVHJhdmVyc2FsIGxvZ2ljLgorLy8vCisvLy8gVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgYmFzaWMgYmxvY2tzIHRyYXZlcnNhbCBvcmRlciB1c2VkIGJ5IHBhc3NlcyBsaWtlCisvLy8gUmVhY2hpbmdEZWZBbmFseXNpcyBhbmQgRXhlY3V0aW9uRG9tYWluRml4LgorLy8vIEl0IGlkZW50aWZpZXMgYmFzaWMgYmxvY2tzIHRoYXQgYXJlIHBhcnQgb2YgbG9vcHMgYW5kIHNob3VsZCB0byBiZSB2aXNpdGVkCisvLy8gdHdpY2UgYW5kIHJldHVybnMgZWZmaWNpZW50IHRyYXZlcnNhbCBvcmRlciBmb3IgYWxsIHRoZSBibG9ja3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTE9PUFRSQVZFUlNBTF9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9MT09QVFJBVkVSU0FMX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CisKKy8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBiYXNpYyBibG9ja3MgdHJhdmVyc2FsIG9yZGVyIHVzZWQgYnkgcGFzc2VzIGxpa2UKKy8vLyBSZWFjaGluZ0RlZkFuYWx5c2lzIGFuZCBFeGVjdXRpb25Eb21haW5GaXguCisvLy8gSXQgaWRlbnRpZmllcyBiYXNpYyBibG9ja3MgdGhhdCBhcmUgcGFydCBvZiBsb29wcyBhbmQgc2hvdWxkIHRvIGJlIHZpc2l0ZWQKKy8vLyB0d2ljZSBhbmQgcmV0dXJucyBlZmZpY2llbnQgdHJhdmVyc2FsIG9yZGVyIGZvciBhbGwgdGhlIGJsb2Nrcy4KKy8vLworLy8vIFdlIHdhbnQgdG8gdmlzaXQgZXZlcnkgaW5zdHJ1Y3Rpb24gaW4gZXZlcnkgYmFzaWMgYmxvY2sgaW4gb3JkZXIgdG8gdXBkYXRlCisvLy8gaXQncyBleGVjdXRpb24gZG9tYWluIG9yIGNvbGxlY3QgY2xlYXJhbmNlIGluZm9ybWF0aW9uLiBIb3dldmVyLCBmb3IgdGhlCisvLy8gY2xlYXJhbmNlIGNhbGN1bGF0aW9uLCB3ZSBuZWVkIHRvIGtub3cgY2xlYXJhbmNlcyBmcm9tIGFsbCBwcmVkZWNlc3NvcnMKKy8vLyAoaW5jbHVkaW5nIGFueSBiYWNrZWRnZXMpLCB0aGVyZm9yZSB3ZSBuZWVkIHRvIHZpc2l0IHNvbWUgYmxvY2tzIHR3aWNlLgorLy8vIEFzIGFuIGV4YW1wbGUsIGNvbnNpZGVyIHRoZSBmb2xsb3dpbmcgbG9vcC4KKy8vLworLy8vCisvLy8gICAgUEggLT4gQSAtPiBCICh4bW08VW5kZWY+IC0+IHhtbTxEZWY+KSAtPiBDIC0+IEQgLT4gRVhJVAorLy8vICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8vICAgICAgICAgICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8vCisvLy8gVGhlIGl0ZXJhdGlvbiBvcmRlciB0aGlzIHBhc3Mgd2lsbCByZXR1cm4gaXMgYXMgZm9sbG93czoKKy8vLyBPcHRpbWl6ZWQ6IFBIIEEgQiBDIEEnIEInIEMnIEQKKy8vLworLy8vIFRoZSBiYXNpYyBibG9jayBvcmRlciBpcyBjb25zdHJ1Y3RlZCBhcyBmb2xsb3dzOgorLy8vIE9uY2Ugd2UgZmluaXNoIHByb2Nlc3Npbmcgc29tZSBibG9jaywgd2UgdXBkYXRlIHRoZSBjb3VudGVycyBpbiBNQkJJbmZvcworLy8vIGFuZCByZS1wcm9jZXNzIGFueSBzdWNjZXNzb3JzIHRoYXQgYXJlIG5vdyAnZG9uZScuCisvLy8gV2UgY2FsbCBhIGJsb2NrIHRoYXQgaXMgcmVhZHkgZm9yIGl0cyBmaW5hbCByb3VuZCBvZiBwcm9jZXNzaW5nIGBkb25lYAorLy8vIChpc0Jsb2NrRG9uZSksIGUuZy4gd2hlbiBhbGwgcHJlZGVjZXNzb3IgaW5mb3JtYXRpb24gaXMga25vd24uCisvLy8KKy8vLyBOb3RlIHRoYXQgYSBuYWl2ZSB0cmF2ZXJzYWwgb3JkZXIgd291bGQgYmUgdG8gZG8gdHdvIGNvbXBsZXRlIHBhc3NlcyBvdmVyCisvLy8gYWxsIGJhc2ljIGJsb2Nrcy9pbnN0cnVjdGlvbnMsIHRoZSBmaXJzdCBmb3IgcmVjb3JkaW5nIGNsZWFyYW5jZXMsIHRoZQorLy8vIHNlY29uZCBmb3IgdXBkYXRpbmcgY2xlYXJhbmNlIGJhc2VkIG9uIGJhY2tlZGdlcy4KKy8vLyBIb3dldmVyLCBmb3IgZnVuY3Rpb25zIHdpdGhvdXQgYmFja2VkZ2VzLCBvciBmdW5jdGlvbnMgd2l0aCBhIGxvdCBvZgorLy8vIHN0cmFpZ2h0LWxpbmUgY29kZSwgYW5kIGEgc21hbGwgbG9vcCwgdGhhdCB3b3VsZCBiZSBhIGxvdCBvZiB1bm5lY2Vzc2FyeQorLy8vIHdvcmsgKHNpbmNlIG9ubHkgdGhlIEJCcyB0aGF0IGFyZSBwYXJ0IG9mIHRoZSBsb29wIHJlcXVpcmUgdHdvIHBhc3NlcykuCisvLy8KKy8vLyBFLmcuLCB0aGUgbmFpdmUgaXRlcmF0aW9uIG9yZGVyIGZvciB0aGUgYWJvdmUgZXhtcGxlIGlzIGFzIGZvbGxvd3M6CisvLy8gTmFpdmU6IFBIIEEgQiBDIEQgQScgQicgQycgRCcKKy8vLworLy8vIEluIHRoZSBvcHRpbWl6ZWQgYXBwcm9hY2ggd2UgYXZvaWQgcHJvY2Vzc2luZyBEIHR3aWNlLCBiZWNhdXNlIHdlCisvLy8gY2FuIGVudGlyZWx5IHByb2Nlc3MgdGhlIHByZWRlY2Vzc29ycyBiZWZvcmUgZ2V0dGluZyB0byBELgorY2xhc3MgTG9vcFRyYXZlcnNhbCB7Citwcml2YXRlOgorICBzdHJ1Y3QgTUJCSW5mbyB7CisgICAgLy8vIFdoZXRoZXIgd2UgaGF2ZSBnb3R0ZW4gdG8gdGhpcyBibG9jayBpbiBwcmltYXJ5IHByb2Nlc3NpbmcgeWV0LgorICAgIGJvb2wgUHJpbWFyeUNvbXBsZXRlZCA9IGZhbHNlOworCisgICAgLy8vIFRoZSBudW1iZXIgb2YgcHJlZGVjZXNzb3JzIGZvciB3aGljaCBwcmltYXJ5IHByb2Nlc3NpbmcgaGFzIGNvbXBsZXRlZAorICAgIHVuc2lnbmVkIEluY29taW5nUHJvY2Vzc2VkID0gMDsKKworICAgIC8vLyBUaGUgdmFsdWUgb2YgYEluY29taW5nUHJvY2Vzc2VkYCBhdCB0aGUgc3RhcnQgb2YgcHJpbWFyeSBwcm9jZXNzaW5nCisgICAgdW5zaWduZWQgUHJpbWFyeUluY29taW5nID0gMDsKKworICAgIC8vLyBUaGUgbnVtYmVyIG9mIHByZWRlY2Vzc29ycyBmb3Igd2hpY2ggYWxsIHByb2Nlc3Npbmcgc3RlcHMgYXJlIGRvbmUuCisgICAgdW5zaWduZWQgSW5jb21pbmdDb21wbGV0ZWQgPSAwOworCisgICAgTUJCSW5mbygpID0gZGVmYXVsdDsKKyAgfTsKKyAgdXNpbmcgTUJCSW5mb01hcCA9IFNtYWxsVmVjdG9yPE1CQkluZm8sIDQ+OworICAvLy8gSGVscHMga2VlcCB0cmFjayBpZiB3ZSBwcm9jY2Vzc2VkIHRoaXMgYmxvY2sgYW5kIGFsbCBpdHMgcHJlZGVjZXNzb3JzLgorICBNQkJJbmZvTWFwIE1CQkluZm9zOworCitwdWJsaWM6CisgIHN0cnVjdCBUcmF2ZXJzZWRNQkJJbmZvIHsKKyAgICAvLy8gVGhlIGJhc2ljIGJsb2NrLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSBudWxscHRyOworCisgICAgLy8vIFRydWUgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSB3ZSBwcm9jZXNzIHRoZSBiYXNpYyBibG9jay4KKyAgICBib29sIFByaW1hcnlQYXNzID0gdHJ1ZTsKKworICAgIC8vLyBUcnVlIGlmIHRoZSBibG9jayB0aGF0IGlzIHJlYWR5IGZvciBpdHMgZmluYWwgcm91bmQgb2YgcHJvY2Vzc2luZy4KKyAgICBib29sIElzRG9uZSA9IHRydWU7CisKKyAgICBUcmF2ZXJzZWRNQkJJbmZvKE1hY2hpbmVCYXNpY0Jsb2NrICpCQiA9IG51bGxwdHIsIGJvb2wgUHJpbWFyeSA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICBib29sIERvbmUgPSB0cnVlKQorICAgICAgICA6IE1CQihCQiksIFByaW1hcnlQYXNzKFByaW1hcnkpLCBJc0RvbmUoRG9uZSkge30KKyAgfTsKKyAgTG9vcFRyYXZlcnNhbCgpIHt9CisKKyAgLy8vIFxicmllZiBJZGVudGlmaWVzIGJhc2ljIGJsb2NrcyB0aGF0IGFyZSBwYXJ0IG9mIGxvb3BzIGFuZCBzaG91bGQgdG8gYmUKKyAgLy8vICB2aXNpdGVkIHR3aWNlIGFuZCByZXR1cm5zIGVmZmljaWVudCB0cmF2ZXJzYWwgb3JkZXIgZm9yIGFsbCB0aGUgYmxvY2tzLgorICB0eXBlZGVmIFNtYWxsVmVjdG9yPFRyYXZlcnNlZE1CQkluZm8sIDQ+IFRyYXZlcnNhbE9yZGVyOworICBUcmF2ZXJzYWxPcmRlciB0cmF2ZXJzZShNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworcHJpdmF0ZToKKyAgLy8vIFJldHVyZW5zIHRydWUgaWYgdGhlIGJsb2NrIGlzIHJlYWR5IGZvciBpdHMgZmluYWwgcm91bmQgb2YgcHJvY2Vzc2luZy4KKyAgYm9vbCBpc0Jsb2NrRG9uZShNYWNoaW5lQmFzaWNCbG9jayAqTUJCKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9MT09QVFJBVkVSU0FMX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9Mb3dMZXZlbFR5cGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9Mb3dMZXZlbFR5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2M1YzkzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL0xvd0xldmVsVHlwZS5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vPT0gbGx2bS9Db2RlR2VuL0xvd0xldmVsVHlwZS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIEltcGxlbWVudCBhIGxvdy1sZXZlbCB0eXBlIHN1aXRhYmxlIGZvciBNYWNoaW5lSW5zdHIgbGV2ZWwgaW5zdHJ1Y3Rpb24KKy8vLyBzZWxlY3Rpb24uCisvLy8KKy8vLyBUaGlzIHByb3ZpZGVzIHRoZSBDb2RlR2VuIGFzcGVjdHMgb2YgTG93TGV2ZWxUeXBlLCBzdWNoIGFzIFR5cGUgY29udmVyc2lvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9MT1dMRVZFTFRZUEVfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTE9XTEVWRUxUWVBFX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Mb3dMZXZlbFR5cGVJbXBsLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIFR5cGU7CisKKy8vLyBDb25zdHJ1Y3QgYSBsb3ctbGV2ZWwgdHlwZSBiYXNlZCBvbiBhbiBMTFZNIHR5cGUuCitMTFQgZ2V0TExURm9yVHlwZShUeXBlICZUeSwgY29uc3QgRGF0YUxheW91dCAmREwpOworCit9CisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTE9XTEVWRUxUWVBFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NSVJQYXJzZXIvTUlSUGFyc2VyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTUlSUGFyc2VyL01JUlBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2MzFhOGMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTUlSUGFyc2VyL01JUlBhcnNlci5oCkBAIC0wLDAgKzEsODEgQEAKKy8vPT09LSBNSVJQYXJzZXIuaCAtIE1JUiBzZXJpYWxpemF0aW9uIGZvcm1hdCBwYXJzZXIgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBNSVIgc2VyaWFsaXphdGlvbiBsaWJyYXJ5IGlzIGN1cnJlbnRseSBhIHdvcmsgaW4gcHJvZ3Jlc3MuIEl0IGNhbid0CisvLyBzZXJpYWxpemUgbWFjaGluZSBmdW5jdGlvbnMgYXQgdGhpcyB0aW1lLgorLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgZnVuY3Rpb25zIHRoYXQgcGFyc2UgdGhlIE1JUiBzZXJpYWxpemF0aW9uIGZvcm1hdAorLy8gZmlsZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUlSUEFSU0VSX01JUlBBUlNFUl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NSVJQQVJTRVJfTUlSUEFSU0VSX0gKKworI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBTdHJpbmdSZWY7CitjbGFzcyBNSVJQYXJzZXJJbXBsOworY2xhc3MgTWFjaGluZU1vZHVsZUluZm87CitjbGFzcyBTTURpYWdub3N0aWM7CisKKy8vLyBUaGlzIGNsYXNzIGluaXRpYWxpemVzIG1hY2hpbmUgZnVuY3Rpb25zIGJ5IGFwcGx5aW5nIHRoZSBzdGF0ZSBsb2FkZWQgZnJvbQorLy8vIGEgTUlSIGZpbGUuCitjbGFzcyBNSVJQYXJzZXIgeworICBzdGQ6OnVuaXF1ZV9wdHI8TUlSUGFyc2VySW1wbD4gSW1wbDsKKworcHVibGljOgorICBNSVJQYXJzZXIoc3RkOjp1bmlxdWVfcHRyPE1JUlBhcnNlckltcGw+IEltcGwpOworICBNSVJQYXJzZXIoY29uc3QgTUlSUGFyc2VyICYpID0gZGVsZXRlOworICB+TUlSUGFyc2VyKCk7CisKKyAgLy8vIFBhcnNlcyB0aGUgb3B0aW9uYWwgTExWTSBJUiBtb2R1bGUgaW4gdGhlIE1JUiBmaWxlLgorICAvLy8KKyAgLy8vIEEgbmV3LCBlbXB0eSBtb2R1bGUgaXMgY3JlYXRlZCBpZiB0aGUgTExWTSBJUiBpc24ndCBwcmVzZW50LgorICAvLy8gXHJldHVybnMgbnVsbHB0ciBpZiBhIHBhcnNpbmcgZXJyb3Igb2NjdXJyZWQuCisgIHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IHBhcnNlSVJNb2R1bGUoKTsKKworICAvLy8gXGJyaWVmIFBhcnNlcyBNYWNoaW5lRnVuY3Rpb25zIGluIHRoZSBNSVIgZmlsZSBhbmQgYWRkIHRoZW0gdG8gdGhlIGdpdmVuCisgIC8vLyBNYWNoaW5lTW9kdWxlSW5mbyBccCBNTUkuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAgYm9vbCBwYXJzZU1hY2hpbmVGdW5jdGlvbnMoTW9kdWxlICZNLCBNYWNoaW5lTW9kdWxlSW5mbyAmTU1JKTsKK307CisKKy8vLyBUaGlzIGZ1bmN0aW9uIGlzIHRoZSBtYWluIGludGVyZmFjZSB0byB0aGUgTUlSIHNlcmlhbGl6YXRpb24gZm9ybWF0IHBhcnNlci4KKy8vLworLy8vIEl0IHJlYWRzIGluIGEgTUlSIGZpbGUgYW5kIHJldHVybnMgYSBNSVIgcGFyc2VyIHRoYXQgY2FuIHBhcnNlIHRoZSBlbWJlZGRlZAorLy8vIExMVk0gSVIgbW9kdWxlIGFuZCBpbml0aWFsaXplIHRoZSBtYWNoaW5lIGZ1bmN0aW9ucyBieSBwYXJzaW5nIHRoZSBtYWNoaW5lCisvLy8gZnVuY3Rpb24ncyBzdGF0ZS4KKy8vLworLy8vIFxwYXJhbSBGaWxlbmFtZSAtIFRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIHBhcnNlLgorLy8vIFxwYXJhbSBFcnJvciAtIEVycm9yIHJlc3VsdCBpbmZvLgorLy8vIFxwYXJhbSBDb250ZXh0IC0gQ29udGV4dCB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBwYXJzZWQgTExWTSBJUiBtb2R1bGUuCitzdGQ6OnVuaXF1ZV9wdHI8TUlSUGFyc2VyPiBjcmVhdGVNSVJQYXJzZXJGcm9tRmlsZShTdHJpbmdSZWYgRmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTURpYWdub3N0aWMgJkVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUNvbnRleHQgJkNvbnRleHQpOworCisvLy8gVGhpcyBmdW5jdGlvbiBpcyBhbm90aGVyIGludGVyZmFjZSB0byB0aGUgTUlSIHNlcmlhbGl6YXRpb24gZm9ybWF0IHBhcnNlci4KKy8vLworLy8vIEl0IHJldHVybnMgYSBNSVIgcGFyc2VyIHRoYXQgd29ya3Mgd2l0aCB0aGUgZ2l2ZW4gbWVtb3J5IGJ1ZmZlciBhbmQgdGhhdCBjYW4KKy8vLyBwYXJzZSB0aGUgZW1iZWRkZWQgTExWTSBJUiBtb2R1bGUgYW5kIGluaXRpYWxpemUgdGhlIG1hY2hpbmUgZnVuY3Rpb25zIGJ5CisvLy8gcGFyc2luZyB0aGUgbWFjaGluZSBmdW5jdGlvbidzIHN0YXRlLgorLy8vCisvLy8gXHBhcmFtIENvbnRlbnRzIC0gVGhlIE1lbW9yeUJ1ZmZlciBjb250YWluaW5nIHRoZSBtYWNoaW5lIGxldmVsIElSLgorLy8vIFxwYXJhbSBDb250ZXh0IC0gQ29udGV4dCB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHRoZSBwYXJzZWQgTExWTSBJUiBtb2R1bGUuCitzdGQ6OnVuaXF1ZV9wdHI8TUlSUGFyc2VyPgorY3JlYXRlTUlSUGFyc2VyKHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IENvbnRlbnRzLCBMTFZNQ29udGV4dCAmQ29udGV4dCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTUlSUEFSU0VSX01JUlBBUlNFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTUlSUHJpbnRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01JUlByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNzNhZGMzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01JUlByaW50ZXIuaApAQCAtMCwwICsxLDQ2IEBACisvLz09PS0gTUlSUHJpbnRlci5oIC0gTUlSIHNlcmlhbGl6YXRpb24gZm9ybWF0IHByaW50ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgZnVuY3Rpb25zIHRoYXQgcHJpbnQgb3V0IHRoZSBMTFZNIElSIGFuZCB0aGUgbWFjaGluZQorLy8gZnVuY3Rpb25zIHVzaW5nIHRoZSBNSVIgc2VyaWFsaXphdGlvbiBmb3JtYXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0xJQl9DT0RFR0VOX01JUlBSSU5URVJfSAorI2RlZmluZSBMTFZNX0xJQl9DT0RFR0VOX01JUlBSSU5URVJfSAorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTW9kdWxlOworY2xhc3MgcmF3X29zdHJlYW07Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgU21hbGxWZWN0b3JJbXBsOworCisvLy8gUHJpbnQgTExWTSBJUiB1c2luZyB0aGUgTUlSIHNlcmlhbGl6YXRpb24gZm9ybWF0IHRvIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtLgordm9pZCBwcmludE1JUihyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1vZHVsZSAmTSk7CisKKy8vLyBQcmludCBhIG1hY2hpbmUgZnVuY3Rpb24gdXNpbmcgdGhlIE1JUiBzZXJpYWxpemF0aW9uIGZvcm1hdCB0byB0aGUgZ2l2ZW4KKy8vLyBvdXRwdXQgc3RyZWFtLgordm9pZCBwcmludE1JUihyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpOworCisvLy8gRGV0ZXJtaW5lIGEgcG9zc2libGUgbGlzdCBvZiBzdWNjZXNzb3JzIG9mIGEgYmFzaWMgYmxvY2sgYmFzZWQgb24gdGhlCisvLy8gYmFzaWMgYmxvY2sgbWFjaGluZSBvcGVyYW5kIGJlaW5nIHVzZWQgaW5zaWRlIHRoZSBibG9jay4gVGhpcyBzaG91bGQgZ2l2ZQorLy8vIHlvdSB0aGUgY29ycmVjdCBsaXN0IG9mIHN1Y2Nlc3NvciBibG9ja3MgaW4gbW9zdCBjYXNlcyBleGNlcHQgZm9yIHRoaW5ncworLy8vIGxpa2UganVtcCB0YWJsZXMgd2hlcmUgdGhlIGJhc2ljIGJsb2NrIHJlZmVyZW5jZXMgY2FuJ3QgZWFzaWx5IGJlIGZvdW5kLgorLy8vIFRoZSBNSVJQUmludGVyIHdpbGwgc2tpcCBwcmludGluZyBzdWNjZXNzb3JzIGlmIHRoZXkgbWF0Y2ggdGhlIHJlc3VsdCBvZgorLy8vIHRoaXMgZnVuY2l0b24gYW5kIHRoZSBwYXJzZXIgd2lsbCB1c2UgdGhpcyBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYSBsaXN0IGlmCisvLy8gaXQgaXMgbWlzc2luZy4KK3ZvaWQgZ3Vlc3NTdWNjZXNzb3JzKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUJhc2ljQmxvY2sqPiAmU3VjY2Vzc29ycywKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgJklzRmFsbHRocm91Z2gpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NSVJZYW1sTWFwcGluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01JUllhbWxNYXBwaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjc1ZjljOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NSVJZYW1sTWFwcGluZy5oCkBAIC0wLDAgKzEsNTIzIEBACisvLz09PS0gTUlSWUFNTE1hcHBpbmcuaCAtIERlc2NyaWJlcyB0aGUgbWFwcGluZyBiZXR3ZWVuIE1JUiBhbmQgWUFNTCAtLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBtYXBwaW5nIGJldHdlZW4gdmFyaW91cyBNSVIgZGF0YSBzdHJ1Y3R1cmVzIGFuZAorLy8gdGhlaXIgY29ycmVzcG9uZGluZyBZQU1MIHJlcHJlc2VudGF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01JUllBTUxNQVBQSU5HX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01JUllBTUxNQVBQSU5HX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVKdW1wVGFibGVJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NNTG9jLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1lBTUxUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgeWFtbCB7CisKKy8vLyBBIHdyYXBwZXIgYXJvdW5kIHN0ZDo6c3RyaW5nIHdoaWNoIGNvbnRhaW5zIGEgc291cmNlIHJhbmdlIHRoYXQncyBiZWluZworLy8vIHNldCBkdXJpbmcgcGFyc2luZy4KK3N0cnVjdCBTdHJpbmdWYWx1ZSB7CisgIHN0ZDo6c3RyaW5nIFZhbHVlOworICBTTVJhbmdlIFNvdXJjZVJhbmdlOworCisgIFN0cmluZ1ZhbHVlKCkgPSBkZWZhdWx0OworICBTdHJpbmdWYWx1ZShzdGQ6OnN0cmluZyBWYWx1ZSkgOiBWYWx1ZShzdGQ6Om1vdmUoVmFsdWUpKSB7fQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTdHJpbmdWYWx1ZSAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWUgPT0gT3RoZXIuVmFsdWU7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJUcmFpdHM8U3RyaW5nVmFsdWU+IHsKKyAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IFN0cmluZ1ZhbHVlICZTLCB2b2lkICosIHJhd19vc3RyZWFtICZPUykgeworICAgIE9TIDw8IFMuVmFsdWU7CisgIH0KKworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiBTY2FsYXIsIHZvaWQgKkN0eCwgU3RyaW5nVmFsdWUgJlMpIHsKKyAgICBTLlZhbHVlID0gU2NhbGFyLnN0cigpOworICAgIGlmIChjb25zdCBhdXRvICpOb2RlID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8eWFtbDo6SW5wdXQgKj4oQ3R4KS0+Z2V0Q3VycmVudE5vZGUoKSkKKyAgICAgIFMuU291cmNlUmFuZ2UgPSBOb2RlLT5nZXRTb3VyY2VSYW5nZSgpOworICAgIHJldHVybiAiIjsKKyAgfQorCisgIHN0YXRpYyBRdW90aW5nVHlwZSBtdXN0UXVvdGUoU3RyaW5nUmVmIFMpIHsgcmV0dXJuIG5lZWRzUXVvdGVzKFMpOyB9Cit9OworCitzdHJ1Y3QgRmxvd1N0cmluZ1ZhbHVlIDogU3RyaW5nVmFsdWUgeworICBGbG93U3RyaW5nVmFsdWUoKSA9IGRlZmF1bHQ7CisgIEZsb3dTdHJpbmdWYWx1ZShzdGQ6OnN0cmluZyBWYWx1ZSkgOiBTdHJpbmdWYWx1ZShzdGQ6Om1vdmUoVmFsdWUpKSB7fQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhclRyYWl0czxGbG93U3RyaW5nVmFsdWU+IHsKKyAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IEZsb3dTdHJpbmdWYWx1ZSAmUywgdm9pZCAqLCByYXdfb3N0cmVhbSAmT1MpIHsKKyAgICByZXR1cm4gU2NhbGFyVHJhaXRzPFN0cmluZ1ZhbHVlPjo6b3V0cHV0KFMsIG51bGxwdHIsIE9TKTsKKyAgfQorCisgIHN0YXRpYyBTdHJpbmdSZWYgaW5wdXQoU3RyaW5nUmVmIFNjYWxhciwgdm9pZCAqQ3R4LCBGbG93U3RyaW5nVmFsdWUgJlMpIHsKKyAgICByZXR1cm4gU2NhbGFyVHJhaXRzPFN0cmluZ1ZhbHVlPjo6aW5wdXQoU2NhbGFyLCBDdHgsIFMpOworICB9CisKKyAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYgUykgeyByZXR1cm4gbmVlZHNRdW90ZXMoUyk7IH0KK307CisKK3N0cnVjdCBCbG9ja1N0cmluZ1ZhbHVlIHsKKyAgU3RyaW5nVmFsdWUgVmFsdWU7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEJsb2NrU3RyaW5nVmFsdWUgJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlID09IE90aGVyLlZhbHVlOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgQmxvY2tTY2FsYXJUcmFpdHM8QmxvY2tTdHJpbmdWYWx1ZT4geworICBzdGF0aWMgdm9pZCBvdXRwdXQoY29uc3QgQmxvY2tTdHJpbmdWYWx1ZSAmUywgdm9pZCAqQ3R4LCByYXdfb3N0cmVhbSAmT1MpIHsKKyAgICByZXR1cm4gU2NhbGFyVHJhaXRzPFN0cmluZ1ZhbHVlPjo6b3V0cHV0KFMuVmFsdWUsIEN0eCwgT1MpOworICB9CisKKyAgc3RhdGljIFN0cmluZ1JlZiBpbnB1dChTdHJpbmdSZWYgU2NhbGFyLCB2b2lkICpDdHgsIEJsb2NrU3RyaW5nVmFsdWUgJlMpIHsKKyAgICByZXR1cm4gU2NhbGFyVHJhaXRzPFN0cmluZ1ZhbHVlPjo6aW5wdXQoU2NhbGFyLCBDdHgsIFMuVmFsdWUpOworICB9Cit9OworCisvLy8gQSB3cmFwcGVyIGFyb3VuZCB1bnNpZ25lZCB3aGljaCBjb250YWlucyBhIHNvdXJjZSByYW5nZSB0aGF0J3MgYmVpbmcgc2V0CisvLy8gZHVyaW5nIHBhcnNpbmcuCitzdHJ1Y3QgVW5zaWduZWRWYWx1ZSB7CisgIHVuc2lnbmVkIFZhbHVlID0gMDsKKyAgU01SYW5nZSBTb3VyY2VSYW5nZTsKKworICBVbnNpZ25lZFZhbHVlKCkgPSBkZWZhdWx0OworICBVbnNpZ25lZFZhbHVlKHVuc2lnbmVkIFZhbHVlKSA6IFZhbHVlKFZhbHVlKSB7fQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBVbnNpZ25lZFZhbHVlICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBWYWx1ZSA9PSBPdGhlci5WYWx1ZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhclRyYWl0czxVbnNpZ25lZFZhbHVlPiB7CisgIHN0YXRpYyB2b2lkIG91dHB1dChjb25zdCBVbnNpZ25lZFZhbHVlICZWYWx1ZSwgdm9pZCAqQ3R4LCByYXdfb3N0cmVhbSAmT1MpIHsKKyAgICByZXR1cm4gU2NhbGFyVHJhaXRzPHVuc2lnbmVkPjo6b3V0cHV0KFZhbHVlLlZhbHVlLCBDdHgsIE9TKTsKKyAgfQorCisgIHN0YXRpYyBTdHJpbmdSZWYgaW5wdXQoU3RyaW5nUmVmIFNjYWxhciwgdm9pZCAqQ3R4LCBVbnNpZ25lZFZhbHVlICZWYWx1ZSkgeworICAgIGlmIChjb25zdCBhdXRvICpOb2RlID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8eWFtbDo6SW5wdXQgKj4oQ3R4KS0+Z2V0Q3VycmVudE5vZGUoKSkKKyAgICAgIFZhbHVlLlNvdXJjZVJhbmdlID0gTm9kZS0+Z2V0U291cmNlUmFuZ2UoKTsKKyAgICByZXR1cm4gU2NhbGFyVHJhaXRzPHVuc2lnbmVkPjo6aW5wdXQoU2NhbGFyLCBDdHgsIFZhbHVlLlZhbHVlKTsKKyAgfQorCisgIHN0YXRpYyBRdW90aW5nVHlwZSBtdXN0UXVvdGUoU3RyaW5nUmVmIFNjYWxhcikgeworICAgIHJldHVybiBTY2FsYXJUcmFpdHM8dW5zaWduZWQ+OjptdXN0UXVvdGUoU2NhbGFyKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPE1hY2hpbmVKdW1wVGFibGVJbmZvOjpKVEVudHJ5S2luZD4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbih5YW1sOjpJTyAmSU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVKdW1wVGFibGVJbmZvOjpKVEVudHJ5S2luZCAmRW50cnlLaW5kKSB7CisgICAgSU8uZW51bUNhc2UoRW50cnlLaW5kLCAiYmxvY2stYWRkcmVzcyIsCisgICAgICAgICAgICAgICAgTWFjaGluZUp1bXBUYWJsZUluZm86OkVLX0Jsb2NrQWRkcmVzcyk7CisgICAgSU8uZW51bUNhc2UoRW50cnlLaW5kLCAiZ3AtcmVsNjQtYmxvY2stYWRkcmVzcyIsCisgICAgICAgICAgICAgICAgTWFjaGluZUp1bXBUYWJsZUluZm86OkVLX0dQUmVsNjRCbG9ja0FkZHJlc3MpOworICAgIElPLmVudW1DYXNlKEVudHJ5S2luZCwgImdwLXJlbDMyLWJsb2NrLWFkZHJlc3MiLAorICAgICAgICAgICAgICAgIE1hY2hpbmVKdW1wVGFibGVJbmZvOjpFS19HUFJlbDMyQmxvY2tBZGRyZXNzKTsKKyAgICBJTy5lbnVtQ2FzZShFbnRyeUtpbmQsICJsYWJlbC1kaWZmZXJlbmNlMzIiLAorICAgICAgICAgICAgICAgIE1hY2hpbmVKdW1wVGFibGVJbmZvOjpFS19MYWJlbERpZmZlcmVuY2UzMik7CisgICAgSU8uZW51bUNhc2UoRW50cnlLaW5kLCAiaW5saW5lIiwgTWFjaGluZUp1bXBUYWJsZUluZm86OkVLX0lubGluZSk7CisgICAgSU8uZW51bUNhc2UoRW50cnlLaW5kLCAiY3VzdG9tMzIiLCBNYWNoaW5lSnVtcFRhYmxlSW5mbzo6RUtfQ3VzdG9tMzIpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgeWFtbAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjp5YW1sOjpTdHJpbmdWYWx1ZSkKK0xMVk1fWUFNTF9JU19GTE9XX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjp5YW1sOjpGbG93U3RyaW5nVmFsdWUpCitMTFZNX1lBTUxfSVNfRkxPV19TRVFVRU5DRV9WRUNUT1IobGx2bTo6eWFtbDo6VW5zaWduZWRWYWx1ZSkKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHlhbWwgeworCitzdHJ1Y3QgVmlydHVhbFJlZ2lzdGVyRGVmaW5pdGlvbiB7CisgIFVuc2lnbmVkVmFsdWUgSUQ7CisgIFN0cmluZ1ZhbHVlIENsYXNzOworICBTdHJpbmdWYWx1ZSBQcmVmZXJyZWRSZWdpc3RlcjsKKworICAvLyBUT0RPOiBTZXJpYWxpemUgdGhlIHRhcmdldCBzcGVjaWZpYyByZWdpc3RlciBoaW50cy4KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgVmlydHVhbFJlZ2lzdGVyRGVmaW5pdGlvbiAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gSUQgPT0gT3RoZXIuSUQgJiYgQ2xhc3MgPT0gT3RoZXIuQ2xhc3MgJiYKKyAgICAgICAgICAgUHJlZmVycmVkUmVnaXN0ZXIgPT0gT3RoZXIuUHJlZmVycmVkUmVnaXN0ZXI7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPFZpcnR1YWxSZWdpc3RlckRlZmluaXRpb24+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmWWFtbElPLCBWaXJ0dWFsUmVnaXN0ZXJEZWZpbml0aW9uICZSZWcpIHsKKyAgICBZYW1sSU8ubWFwUmVxdWlyZWQoImlkIiwgUmVnLklEKTsKKyAgICBZYW1sSU8ubWFwUmVxdWlyZWQoImNsYXNzIiwgUmVnLkNsYXNzKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoInByZWZlcnJlZC1yZWdpc3RlciIsIFJlZy5QcmVmZXJyZWRSZWdpc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nVmFsdWUoKSk7IC8vIERvbid0IHByaW50IG91dCB3aGVuIGl0J3MgZW1wdHkuCisgIH0KKworICBzdGF0aWMgY29uc3QgYm9vbCBmbG93ID0gdHJ1ZTsKK307CisKK3N0cnVjdCBNYWNoaW5lRnVuY3Rpb25MaXZlSW4geworICBTdHJpbmdWYWx1ZSBSZWdpc3RlcjsKKyAgU3RyaW5nVmFsdWUgVmlydHVhbFJlZ2lzdGVyOworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYWNoaW5lRnVuY3Rpb25MaXZlSW4gJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIFJlZ2lzdGVyID09IE90aGVyLlJlZ2lzdGVyICYmCisgICAgICAgICAgIFZpcnR1YWxSZWdpc3RlciA9PSBPdGhlci5WaXJ0dWFsUmVnaXN0ZXI7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPE1hY2hpbmVGdW5jdGlvbkxpdmVJbj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZZYW1sSU8sIE1hY2hpbmVGdW5jdGlvbkxpdmVJbiAmTGl2ZUluKSB7CisgICAgWWFtbElPLm1hcFJlcXVpcmVkKCJyZWciLCBMaXZlSW4uUmVnaXN0ZXIpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgKKyAgICAgICAgInZpcnR1YWwtcmVnIiwgTGl2ZUluLlZpcnR1YWxSZWdpc3RlciwKKyAgICAgICAgU3RyaW5nVmFsdWUoKSk7IC8vIERvbid0IHByaW50IHRoZSB2aXJ0dWFsIHJlZ2lzdGVyIHdoZW4gaXQncyBlbXB0eS4KKyAgfQorCisgIHN0YXRpYyBjb25zdCBib29sIGZsb3cgPSB0cnVlOworfTsKKworLy8vIFNlcmlhbGl6YWJsZSByZXByZXNlbnRhdGlvbiBvZiBzdGFjayBvYmplY3QgZnJvbSB0aGUgTWFjaGluZUZyYW1lSW5mbyBjbGFzcy4KKy8vLworLy8vIFRoZSBmbGFncyAnaXNJbW11dGFibGUnIGFuZCAnaXNBbGlhc2VkJyBhcmVuJ3Qgc2VyaWFsaXplZCwgYXMgdGhleSBhcmUKKy8vLyBkZXRlcm1pbmVkIGJ5IHRoZSBvYmplY3QncyB0eXBlIGFuZCBmcmFtZSBpbmZvcm1hdGlvbiBmbGFncy4KKy8vLyBEZWFkIHN0YWNrIG9iamVjdHMgYXJlbid0IHNlcmlhbGl6ZWQuCisvLy8KKy8vLyBUaGUgJ2lzUHJlYWxsb2NhdGVkJyBmbGFnIGlzIGRldGVybWluZWQgYnkgdGhlIGxvY2FsIG9mZnNldC4KK3N0cnVjdCBNYWNoaW5lU3RhY2tPYmplY3QgeworICBlbnVtIE9iamVjdFR5cGUgeyBEZWZhdWx0VHlwZSwgU3BpbGxTbG90LCBWYXJpYWJsZVNpemVkIH07CisgIFVuc2lnbmVkVmFsdWUgSUQ7CisgIFN0cmluZ1ZhbHVlIE5hbWU7CisgIC8vIFRPRE86IFNlcmlhbGl6ZSB1bm5hbWVkIExMVk0gYWxsb2NhIHJlZmVyZW5jZS4KKyAgT2JqZWN0VHlwZSBUeXBlID0gRGVmYXVsdFR5cGU7CisgIGludDY0X3QgT2Zmc2V0ID0gMDsKKyAgdWludDY0X3QgU2l6ZSA9IDA7CisgIHVuc2lnbmVkIEFsaWdubWVudCA9IDA7CisgIHVpbnQ4X3QgU3RhY2tJRCA9IDA7CisgIFN0cmluZ1ZhbHVlIENhbGxlZVNhdmVkUmVnaXN0ZXI7CisgIGJvb2wgQ2FsbGVlU2F2ZWRSZXN0b3JlZCA9IHRydWU7CisgIE9wdGlvbmFsPGludDY0X3Q+IExvY2FsT2Zmc2V0OworICBTdHJpbmdWYWx1ZSBEZWJ1Z1ZhcjsKKyAgU3RyaW5nVmFsdWUgRGVidWdFeHByOworICBTdHJpbmdWYWx1ZSBEZWJ1Z0xvYzsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWFjaGluZVN0YWNrT2JqZWN0ICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBJRCA9PSBPdGhlci5JRCAmJiBOYW1lID09IE90aGVyLk5hbWUgJiYgVHlwZSA9PSBPdGhlci5UeXBlICYmCisgICAgICAgICAgIE9mZnNldCA9PSBPdGhlci5PZmZzZXQgJiYgU2l6ZSA9PSBPdGhlci5TaXplICYmCisgICAgICAgICAgIEFsaWdubWVudCA9PSBPdGhlci5BbGlnbm1lbnQgJiYKKyAgICAgICAgICAgU3RhY2tJRCA9PSBPdGhlci5TdGFja0lEICYmCisgICAgICAgICAgIENhbGxlZVNhdmVkUmVnaXN0ZXIgPT0gT3RoZXIuQ2FsbGVlU2F2ZWRSZWdpc3RlciAmJgorICAgICAgICAgICBDYWxsZWVTYXZlZFJlc3RvcmVkID09IE90aGVyLkNhbGxlZVNhdmVkUmVzdG9yZWQgJiYKKyAgICAgICAgICAgTG9jYWxPZmZzZXQgPT0gT3RoZXIuTG9jYWxPZmZzZXQgJiYgRGVidWdWYXIgPT0gT3RoZXIuRGVidWdWYXIgJiYKKyAgICAgICAgICAgRGVidWdFeHByID09IE90aGVyLkRlYnVnRXhwciAmJiBEZWJ1Z0xvYyA9PSBPdGhlci5EZWJ1Z0xvYzsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPE1hY2hpbmVTdGFja09iamVjdDo6T2JqZWN0VHlwZT4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbih5YW1sOjpJTyAmSU8sIE1hY2hpbmVTdGFja09iamVjdDo6T2JqZWN0VHlwZSAmVHlwZSkgeworICAgIElPLmVudW1DYXNlKFR5cGUsICJkZWZhdWx0IiwgTWFjaGluZVN0YWNrT2JqZWN0OjpEZWZhdWx0VHlwZSk7CisgICAgSU8uZW51bUNhc2UoVHlwZSwgInNwaWxsLXNsb3QiLCBNYWNoaW5lU3RhY2tPYmplY3Q6OlNwaWxsU2xvdCk7CisgICAgSU8uZW51bUNhc2UoVHlwZSwgInZhcmlhYmxlLXNpemVkIiwgTWFjaGluZVN0YWNrT2JqZWN0OjpWYXJpYWJsZVNpemVkKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TWFjaGluZVN0YWNrT2JqZWN0PiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoeWFtbDo6SU8gJllhbWxJTywgTWFjaGluZVN0YWNrT2JqZWN0ICZPYmplY3QpIHsKKyAgICBZYW1sSU8ubWFwUmVxdWlyZWQoImlkIiwgT2JqZWN0LklEKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoIm5hbWUiLCBPYmplY3QuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nVmFsdWUoKSk7IC8vIERvbid0IHByaW50IG91dCBhbiBlbXB0eSBuYW1lLgorICAgIFlhbWxJTy5tYXBPcHRpb25hbCgKKyAgICAgICAgInR5cGUiLCBPYmplY3QuVHlwZSwKKyAgICAgICAgTWFjaGluZVN0YWNrT2JqZWN0OjpEZWZhdWx0VHlwZSk7IC8vIERvbid0IHByaW50IHRoZSBkZWZhdWx0IHR5cGUuCisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJvZmZzZXQiLCBPYmplY3QuT2Zmc2V0LCAoaW50NjRfdCkwKTsKKyAgICBpZiAoT2JqZWN0LlR5cGUgIT0gTWFjaGluZVN0YWNrT2JqZWN0OjpWYXJpYWJsZVNpemVkKQorICAgICAgWWFtbElPLm1hcFJlcXVpcmVkKCJzaXplIiwgT2JqZWN0LlNpemUpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiYWxpZ25tZW50IiwgT2JqZWN0LkFsaWdubWVudCwgKHVuc2lnbmVkKTApOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgic3RhY2staWQiLCBPYmplY3QuU3RhY2tJRCk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJjYWxsZWUtc2F2ZWQtcmVnaXN0ZXIiLCBPYmplY3QuQ2FsbGVlU2F2ZWRSZWdpc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nVmFsdWUoKSk7IC8vIERvbid0IHByaW50IGl0IG91dCB3aGVuIGl0J3MgZW1wdHkuCisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJjYWxsZWUtc2F2ZWQtcmVzdG9yZWQiLCBPYmplY3QuQ2FsbGVlU2F2ZWRSZXN0b3JlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJsb2NhbC1vZmZzZXQiLCBPYmplY3QuTG9jYWxPZmZzZXQsIE9wdGlvbmFsPGludDY0X3Q+KCkpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiZGktdmFyaWFibGUiLCBPYmplY3QuRGVidWdWYXIsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ZhbHVlKCkpOyAvLyBEb24ndCBwcmludCBpdCBvdXQgd2hlbiBpdCdzIGVtcHR5LgorICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiZGktZXhwcmVzc2lvbiIsIE9iamVjdC5EZWJ1Z0V4cHIsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ZhbHVlKCkpOyAvLyBEb24ndCBwcmludCBpdCBvdXQgd2hlbiBpdCdzIGVtcHR5LgorICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiZGktbG9jYXRpb24iLCBPYmplY3QuRGVidWdMb2MsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ZhbHVlKCkpOyAvLyBEb24ndCBwcmludCBpdCBvdXQgd2hlbiBpdCdzIGVtcHR5LgorICB9CisKKyAgc3RhdGljIGNvbnN0IGJvb2wgZmxvdyA9IHRydWU7Cit9OworCisvLy8gU2VyaWFsaXphYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmaXhlZCBzdGFjayBvYmplY3QgZnJvbSB0aGUKKy8vLyBNYWNoaW5lRnJhbWVJbmZvIGNsYXNzLgorc3RydWN0IEZpeGVkTWFjaGluZVN0YWNrT2JqZWN0IHsKKyAgZW51bSBPYmplY3RUeXBlIHsgRGVmYXVsdFR5cGUsIFNwaWxsU2xvdCB9OworICBVbnNpZ25lZFZhbHVlIElEOworICBPYmplY3RUeXBlIFR5cGUgPSBEZWZhdWx0VHlwZTsKKyAgaW50NjRfdCBPZmZzZXQgPSAwOworICB1aW50NjRfdCBTaXplID0gMDsKKyAgdW5zaWduZWQgQWxpZ25tZW50ID0gMDsKKyAgdWludDhfdCBTdGFja0lEID0gMDsKKyAgYm9vbCBJc0ltbXV0YWJsZSA9IGZhbHNlOworICBib29sIElzQWxpYXNlZCA9IGZhbHNlOworICBTdHJpbmdWYWx1ZSBDYWxsZWVTYXZlZFJlZ2lzdGVyOworICBib29sIENhbGxlZVNhdmVkUmVzdG9yZWQgPSB0cnVlOworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBGaXhlZE1hY2hpbmVTdGFja09iamVjdCAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gSUQgPT0gT3RoZXIuSUQgJiYgVHlwZSA9PSBPdGhlci5UeXBlICYmIE9mZnNldCA9PSBPdGhlci5PZmZzZXQgJiYKKyAgICAgICAgICAgU2l6ZSA9PSBPdGhlci5TaXplICYmIEFsaWdubWVudCA9PSBPdGhlci5BbGlnbm1lbnQgJiYKKyAgICAgICAgICAgU3RhY2tJRCA9PSBPdGhlci5TdGFja0lEICYmCisgICAgICAgICAgIElzSW1tdXRhYmxlID09IE90aGVyLklzSW1tdXRhYmxlICYmIElzQWxpYXNlZCA9PSBPdGhlci5Jc0FsaWFzZWQgJiYKKyAgICAgICAgICAgQ2FsbGVlU2F2ZWRSZWdpc3RlciA9PSBPdGhlci5DYWxsZWVTYXZlZFJlZ2lzdGVyICYmCisgICAgICAgICAgIENhbGxlZVNhdmVkUmVzdG9yZWQgPT0gT3RoZXIuQ2FsbGVlU2F2ZWRSZXN0b3JlZDsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxGaXhlZE1hY2hpbmVTdGFja09iamVjdDo6T2JqZWN0VHlwZT4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbih5YW1sOjpJTyAmSU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZpeGVkTWFjaGluZVN0YWNrT2JqZWN0OjpPYmplY3RUeXBlICZUeXBlKSB7CisgICAgSU8uZW51bUNhc2UoVHlwZSwgImRlZmF1bHQiLCBGaXhlZE1hY2hpbmVTdGFja09iamVjdDo6RGVmYXVsdFR5cGUpOworICAgIElPLmVudW1DYXNlKFR5cGUsICJzcGlsbC1zbG90IiwgRml4ZWRNYWNoaW5lU3RhY2tPYmplY3Q6OlNwaWxsU2xvdCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPEZpeGVkTWFjaGluZVN0YWNrT2JqZWN0PiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoeWFtbDo6SU8gJllhbWxJTywgRml4ZWRNYWNoaW5lU3RhY2tPYmplY3QgJk9iamVjdCkgeworICAgIFlhbWxJTy5tYXBSZXF1aXJlZCgiaWQiLCBPYmplY3QuSUQpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgKKyAgICAgICAgInR5cGUiLCBPYmplY3QuVHlwZSwKKyAgICAgICAgRml4ZWRNYWNoaW5lU3RhY2tPYmplY3Q6OkRlZmF1bHRUeXBlKTsgLy8gRG9uJ3QgcHJpbnQgdGhlIGRlZmF1bHQgdHlwZS4KKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoIm9mZnNldCIsIE9iamVjdC5PZmZzZXQsIChpbnQ2NF90KTApOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgic2l6ZSIsIE9iamVjdC5TaXplLCAodWludDY0X3QpMCk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJhbGlnbm1lbnQiLCBPYmplY3QuQWxpZ25tZW50LCAodW5zaWduZWQpMCk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJzdGFjay1pZCIsIE9iamVjdC5TdGFja0lEKTsKKyAgICBpZiAoT2JqZWN0LlR5cGUgIT0gRml4ZWRNYWNoaW5lU3RhY2tPYmplY3Q6OlNwaWxsU2xvdCkgeworICAgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJpc0ltbXV0YWJsZSIsIE9iamVjdC5Jc0ltbXV0YWJsZSwgZmFsc2UpOworICAgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJpc0FsaWFzZWQiLCBPYmplY3QuSXNBbGlhc2VkLCBmYWxzZSk7CisgICAgfQorICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiY2FsbGVlLXNhdmVkLXJlZ2lzdGVyIiwgT2JqZWN0LkNhbGxlZVNhdmVkUmVnaXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ZhbHVlKCkpOyAvLyBEb24ndCBwcmludCBpdCBvdXQgd2hlbiBpdCdzIGVtcHR5LgorICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiY2FsbGVlLXNhdmVkLXJlc3RvcmVkIiwgT2JqZWN0LkNhbGxlZVNhdmVkUmVzdG9yZWQsCisgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBib29sIGZsb3cgPSB0cnVlOworfTsKKworc3RydWN0IE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZSB7CisgIFVuc2lnbmVkVmFsdWUgSUQ7CisgIFN0cmluZ1ZhbHVlIFZhbHVlOworICB1bnNpZ25lZCBBbGlnbm1lbnQgPSAwOworICBib29sIElzVGFyZ2V0U3BlY2lmaWMgPSBmYWxzZTsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBJRCA9PSBPdGhlci5JRCAmJiBWYWx1ZSA9PSBPdGhlci5WYWx1ZSAmJgorICAgICAgICAgICBBbGlnbm1lbnQgPT0gT3RoZXIuQWxpZ25tZW50ICYmCisgICAgICAgICAgIElzVGFyZ2V0U3BlY2lmaWMgPT0gT3RoZXIuSXNUYXJnZXRTcGVjaWZpYzsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TWFjaGluZUNvbnN0YW50UG9vbFZhbHVlPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJllhbWxJTywgTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlICZDb25zdGFudCkgeworICAgIFlhbWxJTy5tYXBSZXF1aXJlZCgiaWQiLCBDb25zdGFudC5JRCk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJ2YWx1ZSIsIENvbnN0YW50LlZhbHVlLCBTdHJpbmdWYWx1ZSgpKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImFsaWdubWVudCIsIENvbnN0YW50LkFsaWdubWVudCwgKHVuc2lnbmVkKTApOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiaXNUYXJnZXRTcGVjaWZpYyIsIENvbnN0YW50LklzVGFyZ2V0U3BlY2lmaWMsIGZhbHNlKTsKKyAgfQorfTsKKworc3RydWN0IE1hY2hpbmVKdW1wVGFibGUgeworICBzdHJ1Y3QgRW50cnkgeworICAgIFVuc2lnbmVkVmFsdWUgSUQ7CisgICAgc3RkOjp2ZWN0b3I8Rmxvd1N0cmluZ1ZhbHVlPiBCbG9ja3M7CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgRW50cnkgJk90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gSUQgPT0gT3RoZXIuSUQgJiYgQmxvY2tzID09IE90aGVyLkJsb2NrczsKKyAgICB9CisgIH07CisKKyAgTWFjaGluZUp1bXBUYWJsZUluZm86OkpURW50cnlLaW5kIEtpbmQgPSBNYWNoaW5lSnVtcFRhYmxlSW5mbzo6RUtfQ3VzdG9tMzI7CisgIHN0ZDo6dmVjdG9yPEVudHJ5PiBFbnRyaWVzOworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYWNoaW5lSnVtcFRhYmxlICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBLaW5kID09IE90aGVyLktpbmQgJiYgRW50cmllcyA9PSBPdGhlci5FbnRyaWVzOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoaW5lSnVtcFRhYmxlOjpFbnRyeT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZZYW1sSU8sIE1hY2hpbmVKdW1wVGFibGU6OkVudHJ5ICZFbnRyeSkgeworICAgIFlhbWxJTy5tYXBSZXF1aXJlZCgiaWQiLCBFbnRyeS5JRCk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJibG9ja3MiLCBFbnRyeS5CbG9ja3MsIHN0ZDo6dmVjdG9yPEZsb3dTdHJpbmdWYWx1ZT4oKSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSB5YW1sCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06OnlhbWw6Ok1hY2hpbmVGdW5jdGlvbkxpdmVJbikKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6eWFtbDo6VmlydHVhbFJlZ2lzdGVyRGVmaW5pdGlvbikKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6eWFtbDo6TWFjaGluZVN0YWNrT2JqZWN0KQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjp5YW1sOjpGaXhlZE1hY2hpbmVTdGFja09iamVjdCkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6eWFtbDo6TWFjaGluZUNvbnN0YW50UG9vbFZhbHVlKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjp5YW1sOjpNYWNoaW5lSnVtcFRhYmxlOjpFbnRyeSkKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHlhbWwgeworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoaW5lSnVtcFRhYmxlPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJllhbWxJTywgTWFjaGluZUp1bXBUYWJsZSAmSlQpIHsKKyAgICBZYW1sSU8ubWFwUmVxdWlyZWQoImtpbmQiLCBKVC5LaW5kKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImVudHJpZXMiLCBKVC5FbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYWNoaW5lSnVtcFRhYmxlOjpFbnRyeT4oKSk7CisgIH0KK307CisKKy8vLyBTZXJpYWxpemFibGUgcmVwcmVzZW50YXRpb24gb2YgTWFjaGluZUZyYW1lSW5mby4KKy8vLworLy8vIERvZXNuJ3Qgc2VyaWFsaXplIGF0dHJpYnV0ZXMgbGlrZSAnU3RhY2tBbGlnbm1lbnQnLCAnSXNTdGFja1JlYWxpZ25hYmxlJyBhbmQKKy8vLyAnUmVhbGlnbk9wdGlvbicgYXMgdGhleSBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgdGFyZ2V0IGFuZCBMTFZNIGZ1bmN0aW9uCisvLy8gYXR0cmlidXRlcy4KKy8vLyBJdCBhbHNvIGRvZXNuJ3Qgc2VyaWFsaXplIGF0dHJpYnV0ZXMgbGlrZSAnTnVtRml4ZWRPYmplY3QnIGFuZAorLy8vICdIYXNWYXJTaXplZE9iamVjdHMnIGFzIHRoZXkgYXJlIGRldGVybWluZWQgYnkgdGhlIGZyYW1lIG9iamVjdHMgdGhlbXNlbHZlcy4KK3N0cnVjdCBNYWNoaW5lRnJhbWVJbmZvIHsKKyAgYm9vbCBJc0ZyYW1lQWRkcmVzc1Rha2VuID0gZmFsc2U7CisgIGJvb2wgSXNSZXR1cm5BZGRyZXNzVGFrZW4gPSBmYWxzZTsKKyAgYm9vbCBIYXNTdGFja01hcCA9IGZhbHNlOworICBib29sIEhhc1BhdGNoUG9pbnQgPSBmYWxzZTsKKyAgdWludDY0X3QgU3RhY2tTaXplID0gMDsKKyAgaW50IE9mZnNldEFkanVzdG1lbnQgPSAwOworICB1bnNpZ25lZCBNYXhBbGlnbm1lbnQgPSAwOworICBib29sIEFkanVzdHNTdGFjayA9IGZhbHNlOworICBib29sIEhhc0NhbGxzID0gZmFsc2U7CisgIFN0cmluZ1ZhbHVlIFN0YWNrUHJvdGVjdG9yOworICAvLyBUT0RPOiBTZXJpYWxpemUgRnVuY3Rpb25Db250ZXh0SWR4CisgIHVuc2lnbmVkIE1heENhbGxGcmFtZVNpemUgPSB+MHU7IC8vLzwgfjB1IG1lYW5zOiBub3QgY29tcHV0ZWQgeWV0LgorICBib29sIEhhc09wYXF1ZVNQQWRqdXN0bWVudCA9IGZhbHNlOworICBib29sIEhhc1ZBU3RhcnQgPSBmYWxzZTsKKyAgYm9vbCBIYXNNdXN0VGFpbEluVmFyQXJnRnVuYyA9IGZhbHNlOworICBTdHJpbmdWYWx1ZSBTYXZlUG9pbnQ7CisgIFN0cmluZ1ZhbHVlIFJlc3RvcmVQb2ludDsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWFjaGluZUZyYW1lSW5mbyAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gSXNGcmFtZUFkZHJlc3NUYWtlbiA9PSBPdGhlci5Jc0ZyYW1lQWRkcmVzc1Rha2VuICYmCisgICAgICAgICAgIElzUmV0dXJuQWRkcmVzc1Rha2VuID09IE90aGVyLklzUmV0dXJuQWRkcmVzc1Rha2VuICYmCisgICAgICAgICAgIEhhc1N0YWNrTWFwID09IE90aGVyLkhhc1N0YWNrTWFwICYmCisgICAgICAgICAgIEhhc1BhdGNoUG9pbnQgPT0gT3RoZXIuSGFzUGF0Y2hQb2ludCAmJgorICAgICAgICAgICBTdGFja1NpemUgPT0gT3RoZXIuU3RhY2tTaXplICYmCisgICAgICAgICAgIE9mZnNldEFkanVzdG1lbnQgPT0gT3RoZXIuT2Zmc2V0QWRqdXN0bWVudCAmJgorICAgICAgICAgICBNYXhBbGlnbm1lbnQgPT0gT3RoZXIuTWF4QWxpZ25tZW50ICYmCisgICAgICAgICAgIEFkanVzdHNTdGFjayA9PSBPdGhlci5BZGp1c3RzU3RhY2sgJiYgSGFzQ2FsbHMgPT0gT3RoZXIuSGFzQ2FsbHMgJiYKKyAgICAgICAgICAgU3RhY2tQcm90ZWN0b3IgPT0gT3RoZXIuU3RhY2tQcm90ZWN0b3IgJiYKKyAgICAgICAgICAgTWF4Q2FsbEZyYW1lU2l6ZSA9PSBPdGhlci5NYXhDYWxsRnJhbWVTaXplICYmCisgICAgICAgICAgIEhhc09wYXF1ZVNQQWRqdXN0bWVudCA9PSBPdGhlci5IYXNPcGFxdWVTUEFkanVzdG1lbnQgJiYKKyAgICAgICAgICAgSGFzVkFTdGFydCA9PSBPdGhlci5IYXNWQVN0YXJ0ICYmCisgICAgICAgICAgIEhhc011c3RUYWlsSW5WYXJBcmdGdW5jID09IE90aGVyLkhhc011c3RUYWlsSW5WYXJBcmdGdW5jICYmCisgICAgICAgICAgIFNhdmVQb2ludCA9PSBPdGhlci5TYXZlUG9pbnQgJiYgUmVzdG9yZVBvaW50ID09IE90aGVyLlJlc3RvcmVQb2ludDsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8TWFjaGluZUZyYW1lSW5mbz4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZZYW1sSU8sIE1hY2hpbmVGcmFtZUluZm8gJk1GSSkgeworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiaXNGcmFtZUFkZHJlc3NUYWtlbiIsIE1GSS5Jc0ZyYW1lQWRkcmVzc1Rha2VuLCBmYWxzZSk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJpc1JldHVybkFkZHJlc3NUYWtlbiIsIE1GSS5Jc1JldHVybkFkZHJlc3NUYWtlbiwgZmFsc2UpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiaGFzU3RhY2tNYXAiLCBNRkkuSGFzU3RhY2tNYXAsIGZhbHNlKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImhhc1BhdGNoUG9pbnQiLCBNRkkuSGFzUGF0Y2hQb2ludCwgZmFsc2UpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgic3RhY2tTaXplIiwgTUZJLlN0YWNrU2l6ZSwgKHVpbnQ2NF90KTApOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgib2Zmc2V0QWRqdXN0bWVudCIsIE1GSS5PZmZzZXRBZGp1c3RtZW50LCAoaW50KTApOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgibWF4QWxpZ25tZW50IiwgTUZJLk1heEFsaWdubWVudCwgKHVuc2lnbmVkKTApOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiYWRqdXN0c1N0YWNrIiwgTUZJLkFkanVzdHNTdGFjaywgZmFsc2UpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiaGFzQ2FsbHMiLCBNRkkuSGFzQ2FsbHMsIGZhbHNlKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoInN0YWNrUHJvdGVjdG9yIiwgTUZJLlN0YWNrUHJvdGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdWYWx1ZSgpKTsgLy8gRG9uJ3QgcHJpbnQgaXQgb3V0IHdoZW4gaXQncyBlbXB0eS4KKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoIm1heENhbGxGcmFtZVNpemUiLCBNRkkuTWF4Q2FsbEZyYW1lU2l6ZSwgKHVuc2lnbmVkKX4wKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImhhc09wYXF1ZVNQQWRqdXN0bWVudCIsIE1GSS5IYXNPcGFxdWVTUEFkanVzdG1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImhhc1ZBU3RhcnQiLCBNRkkuSGFzVkFTdGFydCwgZmFsc2UpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiaGFzTXVzdFRhaWxJblZhckFyZ0Z1bmMiLCBNRkkuSGFzTXVzdFRhaWxJblZhckFyZ0Z1bmMsCisgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoInNhdmVQb2ludCIsIE1GSS5TYXZlUG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ZhbHVlKCkpOyAvLyBEb24ndCBwcmludCBpdCBvdXQgd2hlbiBpdCdzIGVtcHR5LgorICAgIFlhbWxJTy5tYXBPcHRpb25hbCgicmVzdG9yZVBvaW50IiwgTUZJLlJlc3RvcmVQb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nVmFsdWUoKSk7IC8vIERvbid0IHByaW50IGl0IG91dCB3aGVuIGl0J3MgZW1wdHkuCisgIH0KK307CisKK3N0cnVjdCBNYWNoaW5lRnVuY3Rpb24geworICBTdHJpbmdSZWYgTmFtZTsKKyAgdW5zaWduZWQgQWxpZ25tZW50ID0gMDsKKyAgYm9vbCBFeHBvc2VzUmV0dXJuc1R3aWNlID0gZmFsc2U7CisgIC8vIEdJU2VsIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMuCisgIGJvb2wgTGVnYWxpemVkID0gZmFsc2U7CisgIGJvb2wgUmVnQmFua1NlbGVjdGVkID0gZmFsc2U7CisgIGJvb2wgU2VsZWN0ZWQgPSBmYWxzZTsKKyAgYm9vbCBGYWlsZWRJU2VsID0gZmFsc2U7CisgIC8vIFJlZ2lzdGVyIGluZm9ybWF0aW9uCisgIGJvb2wgVHJhY2tzUmVnTGl2ZW5lc3MgPSBmYWxzZTsKKyAgc3RkOjp2ZWN0b3I8VmlydHVhbFJlZ2lzdGVyRGVmaW5pdGlvbj4gVmlydHVhbFJlZ2lzdGVyczsKKyAgc3RkOjp2ZWN0b3I8TWFjaGluZUZ1bmN0aW9uTGl2ZUluPiBMaXZlSW5zOworICBPcHRpb25hbDxzdGQ6OnZlY3RvcjxGbG93U3RyaW5nVmFsdWU+PiBDYWxsZWVTYXZlZFJlZ2lzdGVyczsKKyAgLy8gVE9ETzogU2VyaWFsaXplIHRoZSB2YXJpb3VzIHJlZ2lzdGVyIG1hc2tzLgorICAvLyBGcmFtZSBpbmZvcm1hdGlvbgorICBNYWNoaW5lRnJhbWVJbmZvIEZyYW1lSW5mbzsKKyAgc3RkOjp2ZWN0b3I8Rml4ZWRNYWNoaW5lU3RhY2tPYmplY3Q+IEZpeGVkU3RhY2tPYmplY3RzOworICBzdGQ6OnZlY3RvcjxNYWNoaW5lU3RhY2tPYmplY3Q+IFN0YWNrT2JqZWN0czsKKyAgc3RkOjp2ZWN0b3I8TWFjaGluZUNvbnN0YW50UG9vbFZhbHVlPiBDb25zdGFudHM7IC8vLyBDb25zdGFudCBwb29sLgorICBNYWNoaW5lSnVtcFRhYmxlIEp1bXBUYWJsZUluZm87CisgIEJsb2NrU3RyaW5nVmFsdWUgQm9keTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPE1hY2hpbmVGdW5jdGlvbj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZZYW1sSU8sIE1hY2hpbmVGdW5jdGlvbiAmTUYpIHsKKyAgICBZYW1sSU8ubWFwUmVxdWlyZWQoIm5hbWUiLCBNRi5OYW1lKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImFsaWdubWVudCIsIE1GLkFsaWdubWVudCwgKHVuc2lnbmVkKTApOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiZXhwb3Nlc1JldHVybnNUd2ljZSIsIE1GLkV4cG9zZXNSZXR1cm5zVHdpY2UsIGZhbHNlKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImxlZ2FsaXplZCIsIE1GLkxlZ2FsaXplZCwgZmFsc2UpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgicmVnQmFua1NlbGVjdGVkIiwgTUYuUmVnQmFua1NlbGVjdGVkLCBmYWxzZSk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJzZWxlY3RlZCIsIE1GLlNlbGVjdGVkLCBmYWxzZSk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJmYWlsZWRJU2VsIiwgTUYuRmFpbGVkSVNlbCwgZmFsc2UpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgidHJhY2tzUmVnTGl2ZW5lc3MiLCBNRi5UcmFja3NSZWdMaXZlbmVzcywgZmFsc2UpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgicmVnaXN0ZXJzIiwgTUYuVmlydHVhbFJlZ2lzdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VmlydHVhbFJlZ2lzdGVyRGVmaW5pdGlvbj4oKSk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJsaXZlaW5zIiwgTUYuTGl2ZUlucywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZUZ1bmN0aW9uTGl2ZUluPigpKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImNhbGxlZVNhdmVkUmVnaXN0ZXJzIiwgTUYuQ2FsbGVlU2F2ZWRSZWdpc3RlcnMsCisgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHN0ZDo6dmVjdG9yPEZsb3dTdHJpbmdWYWx1ZT4+KCkpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiZnJhbWVJbmZvIiwgTUYuRnJhbWVJbmZvLCBNYWNoaW5lRnJhbWVJbmZvKCkpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiZml4ZWRTdGFjayIsIE1GLkZpeGVkU3RhY2tPYmplY3RzLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxGaXhlZE1hY2hpbmVTdGFja09iamVjdD4oKSk7CisgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJzdGFjayIsIE1GLlN0YWNrT2JqZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZVN0YWNrT2JqZWN0PigpKTsKKyAgICBZYW1sSU8ubWFwT3B0aW9uYWwoImNvbnN0YW50cyIsIE1GLkNvbnN0YW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZUNvbnN0YW50UG9vbFZhbHVlPigpKTsKKyAgICBpZiAoIVlhbWxJTy5vdXRwdXR0aW5nKCkgfHwgIU1GLkp1bXBUYWJsZUluZm8uRW50cmllcy5lbXB0eSgpKQorICAgICAgWWFtbElPLm1hcE9wdGlvbmFsKCJqdW1wVGFibGUiLCBNRi5KdW1wVGFibGVJbmZvLCBNYWNoaW5lSnVtcFRhYmxlKCkpOworICAgIFlhbWxJTy5tYXBPcHRpb25hbCgiYm9keSIsIE1GLkJvZHksIEJsb2NrU3RyaW5nVmFsdWUoKSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSB5YW1sCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX01JUllBTUxNQVBQSU5HX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoT1JlbG9jYXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoT1JlbG9jYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzliN2E4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hPUmVsb2NhdGlvbi5oCkBAIC0wLDAgKzEsNTYgQEAKKy8vPT09IE1hY2hPUmVsb2NhdGlvbi5oIC0gTWFjaC1PIFJlbG9jYXRpb24gSW5mbyAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIE1hY2hPUmVsb2NhdGlvbiBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hPUkVMT0NBVElPTl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNIT1JFTE9DQVRJT05fSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgLy8vIE1hY2hPUmVsb2NhdGlvbiAtIFRoaXMgc3RydWN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggcmVsb2NhdGlvbgorICAvLy8gdGhhdCBuZWVkcyB0byBiZSBlbWl0dGVkIHRvIHRoZSBmaWxlLgorICAvLy8gc2VlIDxtYWNoLW8vcmVsb2MuaD4KKyAgY2xhc3MgTWFjaE9SZWxvY2F0aW9uIHsKKyAgICB1aW50MzJfdCByX2FkZHJlc3M7ICAgLy8gb2Zmc2V0IGluIHRoZSBzZWN0aW9uIHRvIHdoYXQgaXMgYmVpbmcgIHJlbG9jYXRlZAorICAgIHVpbnQzMl90IHJfc3ltYm9sbnVtOyAvLyBzeW1ib2wgaW5kZXggaWYgcl9leHRlcm4gPT0gMSBlbHNlIHNlY3Rpb24gaW5kZXgKKyAgICBib29sICAgICByX3BjcmVsOyAgICAgLy8gd2FzIHJlbG9jYXRlZCBwYy1yZWxhdGl2ZSBhbHJlYWR5CisgICAgdWludDhfdCAgcl9sZW5ndGg7ICAgIC8vIGxlbmd0aCA9IDIgXiByX2xlbmd0aAorICAgIGJvb2wgICAgIHJfZXh0ZXJuOyAgICAvLyAKKyAgICB1aW50OF90ICByX3R5cGU7ICAgICAgLy8gaWYgbm90IDAsIG1hY2hpbmUtc3BlY2lmaWMgcmVsb2NhdGlvbiB0eXBlLgorICAgIGJvb2wgICAgIHJfc2NhdHRlcmVkOyAvLyAxID0gc2NhdHRlcmVkLCAwID0gbm9uLXNjYXR0ZXJlZAorICAgIGludDMyX3QgIHJfdmFsdWU7ICAgICAvLyB0aGUgdmFsdWUgdGhlIGl0ZW0gdG8gYmUgcmVsb2NhdGVkIGlzIHJlZmVycmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0by4KKyAgcHVibGljOiAgICAgIAorICAgIHVpbnQzMl90IGdldFBhY2tlZEZpZWxkcygpIGNvbnN0IHsKKyAgICAgIGlmIChyX3NjYXR0ZXJlZCkKKyAgICAgICAgcmV0dXJuICgxIDw8IDMxKSB8IChyX3BjcmVsIDw8IDMwKSB8ICgocl9sZW5ndGggJiAzKSA8PCAyOCkgfCAKKyAgICAgICAgICAoKHJfdHlwZSAmIDE1KSA8PCAyNCkgfCAocl9hZGRyZXNzICYgMHgwMEZGRkZGRik7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAocl9zeW1ib2xudW0gPDwgOCkgfCAocl9wY3JlbCA8PCA3KSB8ICgocl9sZW5ndGggJiAzKSA8PCA1KSB8CisgICAgICAgICAgKHJfZXh0ZXJuIDw8IDQpIHwgKHJfdHlwZSAmIDE1KTsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0QWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIHJfc2NhdHRlcmVkID8gcl92YWx1ZSA6IHJfYWRkcmVzczsgfQorICAgIHVpbnQzMl90IGdldFJhd0FkZHJlc3MoKSBjb25zdCB7IHJldHVybiByX2FkZHJlc3M7IH0KKworICAgIE1hY2hPUmVsb2NhdGlvbih1aW50MzJfdCBhZGRyLCB1aW50MzJfdCBpbmRleCwgYm9vbCBwY3JlbCwgdWludDhfdCBsZW4sCisgICAgICAgICAgICAgICAgICAgIGJvb2wgZXh0LCB1aW50OF90IHR5cGUsIGJvb2wgc2NhdHRlcmVkID0gZmFsc2UsIAorICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlID0gMCkgOiAKKyAgICAgIHJfYWRkcmVzcyhhZGRyKSwgcl9zeW1ib2xudW0oaW5kZXgpLCByX3BjcmVsKHBjcmVsKSwgcl9sZW5ndGgobGVuKSwKKyAgICAgIHJfZXh0ZXJuKGV4dCksIHJfdHlwZSh0eXBlKSwgcl9zY2F0dGVyZWQoc2NhdHRlcmVkKSwgcl92YWx1ZSh2YWx1ZSkge30KKyAgfTsKKworfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9NQUNIT1JFTE9DQVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzEzMGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgKQEAgLTAsMCArMSw5MTggQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ29sbGVjdCB0aGUgc2VxdWVuY2Ugb2YgbWFjaGluZSBpbnN0cnVjdGlvbnMgZm9yIGEgYmFzaWMgYmxvY2suCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORUJBU0lDQkxPQ0tfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORUJBU0lDQkxPQ0tfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL3NpbXBsZV9pbGlzdC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RlYnVnTG9jLmgiCisjaW5jbHVkZSAibGx2bS9NQy9MYW5lQml0bWFzay5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQnJhbmNoUHJvYmFiaWxpdHkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUHJpbnRhYmxlLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTUNTeW1ib2w7CitjbGFzcyBNb2R1bGVTbG90VHJhY2tlcjsKK2NsYXNzIFBhc3M7CitjbGFzcyBTbG90SW5kZXhlczsKK2NsYXNzIFN0cmluZ1JlZjsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJDbGFzczsKK2NsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlsaXN0X3RyYWl0czxNYWNoaW5lSW5zdHI+IHsKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsgLy8gU2V0IGJ5IHRoZSBvd25pbmcgTWFjaGluZUJhc2ljQmxvY2suCisKKyAgTWFjaGluZUJhc2ljQmxvY2sgKlBhcmVudDsKKworICB1c2luZyBpbnN0cl9pdGVyYXRvciA9CisgICAgICBzaW1wbGVfaWxpc3Q8TWFjaGluZUluc3RyLCBpbGlzdF9zZW50aW5lbF90cmFja2luZzx0cnVlPj46Oml0ZXJhdG9yOworCitwdWJsaWM6CisgIHZvaWQgYWRkTm9kZVRvTGlzdChNYWNoaW5lSW5zdHIgKk4pOworICB2b2lkIHJlbW92ZU5vZGVGcm9tTGlzdChNYWNoaW5lSW5zdHIgKk4pOworICB2b2lkIHRyYW5zZmVyTm9kZXNGcm9tTGlzdChpbGlzdF90cmFpdHMgJk9sZExpc3QsIGluc3RyX2l0ZXJhdG9yIEZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnN0cl9pdGVyYXRvciBMYXN0KTsKKyAgdm9pZCBkZWxldGVOb2RlKE1hY2hpbmVJbnN0ciAqTUkpOworfTsKKworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2sKKyAgICA6IHB1YmxpYyBpbGlzdF9ub2RlX3dpdGhfcGFyZW50PE1hY2hpbmVCYXNpY0Jsb2NrLCBNYWNoaW5lRnVuY3Rpb24+IHsKK3B1YmxpYzoKKyAgLy8vIFBhaXIgb2YgcGh5c2ljYWwgcmVnaXN0ZXIgYW5kIGxhbmUgbWFzay4KKyAgLy8vIFRoaXMgaXMgbm90IHNpbXBseSBhIHN0ZDo6cGFpciB0eXBlZGVmIGJlY2F1c2UgdGhlIG1lbWJlcnMgc2hvdWxkIGJlIG5hbWVkCisgIC8vLyBjbGVhcmx5IGFzIHRoZXkgYm90aCBoYXZlIGFuIGludGVnZXIgdHlwZS4KKyAgc3RydWN0IFJlZ2lzdGVyTWFza1BhaXIgeworICBwdWJsaWM6CisgICAgTUNQaHlzUmVnIFBoeXNSZWc7CisgICAgTGFuZUJpdG1hc2sgTGFuZU1hc2s7CisKKyAgICBSZWdpc3Rlck1hc2tQYWlyKE1DUGh5c1JlZyBQaHlzUmVnLCBMYW5lQml0bWFzayBMYW5lTWFzaykKKyAgICAgICAgOiBQaHlzUmVnKFBoeXNSZWcpLCBMYW5lTWFzayhMYW5lTWFzaykge30KKyAgfTsKKworcHJpdmF0ZToKKyAgdXNpbmcgSW5zdHJ1Y3Rpb25zID0gaWxpc3Q8TWFjaGluZUluc3RyLCBpbGlzdF9zZW50aW5lbF90cmFja2luZzx0cnVlPj47CisKKyAgSW5zdHJ1Y3Rpb25zIEluc3RzOworICBjb25zdCBCYXNpY0Jsb2NrICpCQjsKKyAgaW50IE51bWJlcjsKKyAgTWFjaGluZUZ1bmN0aW9uICp4UGFyZW50OworCisgIC8vLyBLZWVwIHRyYWNrIG9mIHRoZSBwcmVkZWNlc3NvciAvIHN1Y2Nlc3NvciBiYXNpYyBibG9ja3MuCisgIHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrICo+IFByZWRlY2Vzc29yczsKKyAgc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sgKj4gU3VjY2Vzc29yczsKKworICAvLy8gS2VlcCB0cmFjayBvZiB0aGUgcHJvYmFiaWxpdGllcyB0byB0aGUgc3VjY2Vzc29ycy4gVGhpcyB2ZWN0b3IgaGFzIHRoZQorICAvLy8gc2FtZSBvcmRlciBhcyBTdWNjZXNzb3JzLCBvciBpdCBpcyBlbXB0eSBpZiB3ZSBkb24ndCB1c2UgaXQgKGRpc2FibGUKKyAgLy8vIG9wdGltaXphdGlvbikuCisgIHN0ZDo6dmVjdG9yPEJyYW5jaFByb2JhYmlsaXR5PiBQcm9iczsKKyAgdXNpbmcgcHJvYmFiaWxpdHlfaXRlcmF0b3IgPSBzdGQ6OnZlY3RvcjxCcmFuY2hQcm9iYWJpbGl0eT46Oml0ZXJhdG9yOworICB1c2luZyBjb25zdF9wcm9iYWJpbGl0eV9pdGVyYXRvciA9CisgICAgICBzdGQ6OnZlY3RvcjxCcmFuY2hQcm9iYWJpbGl0eT46OmNvbnN0X2l0ZXJhdG9yOworCisgIE9wdGlvbmFsPHVpbnQ2NF90PiBJcnJMb29wSGVhZGVyV2VpZ2h0OworCisgIC8vLyBLZWVwIHRyYWNrIG9mIHRoZSBwaHlzaWNhbCByZWdpc3RlcnMgdGhhdCBhcmUgbGl2ZWluIG9mIHRoZSBiYXNpY2Jsb2NrLgorICB1c2luZyBMaXZlSW5WZWN0b3IgPSBzdGQ6OnZlY3RvcjxSZWdpc3Rlck1hc2tQYWlyPjsKKyAgTGl2ZUluVmVjdG9yIExpdmVJbnM7CisKKyAgLy8vIEFsaWdubWVudCBvZiB0aGUgYmFzaWMgYmxvY2suIFplcm8gaWYgdGhlIGJhc2ljIGJsb2NrIGRvZXMgbm90IG5lZWQgdG8gYmUKKyAgLy8vIGFsaWduZWQuIFRoZSBhbGlnbm1lbnQgaXMgc3BlY2lmaWVkIGFzIGxvZzIoYnl0ZXMpLgorICB1bnNpZ25lZCBBbGlnbm1lbnQgPSAwOworCisgIC8vLyBJbmRpY2F0ZSB0aGF0IHRoaXMgYmFzaWMgYmxvY2sgaXMgZW50ZXJlZCB2aWEgYW4gZXhjZXB0aW9uIGhhbmRsZXIuCisgIGJvb2wgSXNFSFBhZCA9IGZhbHNlOworCisgIC8vLyBJbmRpY2F0ZSB0aGF0IHRoaXMgYmFzaWMgYmxvY2sgaXMgcG90ZW50aWFsbHkgdGhlIHRhcmdldCBvZiBhbiBpbmRpcmVjdAorICAvLy8gYnJhbmNoLgorICBib29sIEFkZHJlc3NUYWtlbiA9IGZhbHNlOworCisgIC8vLyBJbmRpY2F0ZSB0aGF0IHRoaXMgYmFzaWMgYmxvY2sgaXMgdGhlIGVudHJ5IGJsb2NrIG9mIGFuIEVIIGZ1bmNsZXQuCisgIGJvb2wgSXNFSEZ1bmNsZXRFbnRyeSA9IGZhbHNlOworCisgIC8vLyBJbmRpY2F0ZSB0aGF0IHRoaXMgYmFzaWMgYmxvY2sgaXMgdGhlIGVudHJ5IGJsb2NrIG9mIGEgY2xlYW51cCBmdW5jbGV0LgorICBib29sIElzQ2xlYW51cEZ1bmNsZXRFbnRyeSA9IGZhbHNlOworCisgIC8vLyBcYnJpZWYgc2luY2UgZ2V0U3ltYm9sIGlzIGEgcmVsYXRpdmVseSBoZWF2eS13ZWlnaHQgb3BlcmF0aW9uLCB0aGUgc3ltYm9sCisgIC8vLyBpcyBvbmx5IGNvbXB1dGVkIG9uY2UgYW5kIGlzIGNhY2hlZC4KKyAgbXV0YWJsZSBNQ1N5bWJvbCAqQ2FjaGVkTUNTeW1ib2wgPSBudWxscHRyOworCisgIC8vIEludHJ1c2l2ZSBsaXN0IHN1cHBvcnQKKyAgTWFjaGluZUJhc2ljQmxvY2soKSA9IGRlZmF1bHQ7CisKKyAgZXhwbGljaXQgTWFjaGluZUJhc2ljQmxvY2soTWFjaGluZUZ1bmN0aW9uICZNRiwgY29uc3QgQmFzaWNCbG9jayAqQkIpOworCisgIH5NYWNoaW5lQmFzaWNCbG9jaygpOworCisgIC8vIE1hY2hpbmVCYXNpY0Jsb2NrcyBhcmUgYWxsb2NhdGVkIGFuZCBvd25lZCBieSBNYWNoaW5lRnVuY3Rpb24uCisgIGZyaWVuZCBjbGFzcyBNYWNoaW5lRnVuY3Rpb247CisKK3B1YmxpYzoKKyAgLy8vIFJldHVybiB0aGUgTExWTSBiYXNpYyBibG9jayB0aGF0IHRoaXMgaW5zdGFuY2UgY29ycmVzcG9uZGVkIHRvIG9yaWdpbmFsbHkuCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBtYXkgYmUgTlVMTCBpZiB0aGlzIGluc3RhbmNlIGRvZXMgbm90IGNvcnJlc3BvbmQgZGlyZWN0bHkKKyAgLy8vIHRvIGFuIExMVk0gYmFzaWMgYmxvY2suCisgIGNvbnN0IEJhc2ljQmxvY2sgKmdldEJhc2ljQmxvY2soKSBjb25zdCB7IHJldHVybiBCQjsgfQorCisgIC8vLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGNvcnJlc3BvbmRpbmcgTExWTSBiYXNpYyBibG9jaywgb3IgYW4gZW1wdHkgc3RyaW5nLgorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBmb3JtYXR0ZWQgc3RyaW5nIHRvIGlkZW50aWZ5IHRoaXMgYmxvY2sgYW5kIGl0cyBwYXJlbnQgZnVuY3Rpb24uCisgIHN0ZDo6c3RyaW5nIGdldEZ1bGxOYW1lKCkgY29uc3Q7CisKKyAgLy8vIFRlc3Qgd2hldGhlciB0aGlzIGJsb2NrIGlzIHBvdGVudGlhbGx5IHRoZSB0YXJnZXQgb2YgYW4gaW5kaXJlY3QgYnJhbmNoLgorICBib29sIGhhc0FkZHJlc3NUYWtlbigpIGNvbnN0IHsgcmV0dXJuIEFkZHJlc3NUYWtlbjsgfQorCisgIC8vLyBTZXQgdGhpcyBibG9jayB0byByZWZsZWN0IHRoYXQgaXQgcG90ZW50aWFsbHkgaXMgdGhlIHRhcmdldCBvZiBhbiBpbmRpcmVjdAorICAvLy8gYnJhbmNoLgorICB2b2lkIHNldEhhc0FkZHJlc3NUYWtlbigpIHsgQWRkcmVzc1Rha2VuID0gdHJ1ZTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIE1hY2hpbmVGdW5jdGlvbiBjb250YWluaW5nIHRoaXMgYmFzaWMgYmxvY2suCisgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqZ2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4geFBhcmVudDsgfQorICBNYWNoaW5lRnVuY3Rpb24gKmdldFBhcmVudCgpIHsgcmV0dXJuIHhQYXJlbnQ7IH0KKworICB1c2luZyBpbnN0cl9pdGVyYXRvciA9IEluc3RydWN0aW9uczo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2luc3RyX2l0ZXJhdG9yID0gSW5zdHJ1Y3Rpb25zOjpjb25zdF9pdGVyYXRvcjsKKyAgdXNpbmcgcmV2ZXJzZV9pbnN0cl9pdGVyYXRvciA9IEluc3RydWN0aW9uczo6cmV2ZXJzZV9pdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfcmV2ZXJzZV9pbnN0cl9pdGVyYXRvciA9IEluc3RydWN0aW9uczo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICB1c2luZyBpdGVyYXRvciA9IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yPE1hY2hpbmVJbnN0cj47CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3I8Y29uc3QgTWFjaGluZUluc3RyPjsKKyAgdXNpbmcgcmV2ZXJzZV9pdGVyYXRvciA9IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yPE1hY2hpbmVJbnN0ciwgdHJ1ZT47CisgIHVzaW5nIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgPQorICAgICAgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3I8Y29uc3QgTWFjaGluZUluc3RyLCB0cnVlPjsKKworICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gKHVuc2lnbmVkKUluc3RzLnNpemUoKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gSW5zdHMuZW1wdHkoKTsgfQorCisgIE1hY2hpbmVJbnN0ciAgICAgICAmaW5zdHJfZnJvbnQoKSAgICAgICB7IHJldHVybiBJbnN0cy5mcm9udCgpOyB9CisgIE1hY2hpbmVJbnN0ciAgICAgICAmaW5zdHJfYmFjaygpICAgICAgICB7IHJldHVybiBJbnN0cy5iYWNrKCk7ICB9CisgIGNvbnN0IE1hY2hpbmVJbnN0ciAmaW5zdHJfZnJvbnQoKSBjb25zdCB7IHJldHVybiBJbnN0cy5mcm9udCgpOyB9CisgIGNvbnN0IE1hY2hpbmVJbnN0ciAmaW5zdHJfYmFjaygpICBjb25zdCB7IHJldHVybiBJbnN0cy5iYWNrKCk7ICB9CisKKyAgTWFjaGluZUluc3RyICAgICAgICZmcm9udCgpICAgICAgICAgICAgIHsgcmV0dXJuIEluc3RzLmZyb250KCk7IH0KKyAgTWFjaGluZUluc3RyICAgICAgICZiYWNrKCkgICAgICAgICAgICAgIHsgcmV0dXJuICotLWVuZCgpOyAgICAgIH0KKyAgY29uc3QgTWFjaGluZUluc3RyICZmcm9udCgpICAgICAgIGNvbnN0IHsgcmV0dXJuIEluc3RzLmZyb250KCk7IH0KKyAgY29uc3QgTWFjaGluZUluc3RyICZiYWNrKCkgICAgICAgIGNvbnN0IHsgcmV0dXJuICotLWVuZCgpOyAgICAgIH0KKworICBpbnN0cl9pdGVyYXRvciAgICAgICAgICAgICAgICBpbnN0cl9iZWdpbigpICAgICAgIHsgcmV0dXJuIEluc3RzLmJlZ2luKCk7ICB9CisgIGNvbnN0X2luc3RyX2l0ZXJhdG9yICAgICAgICAgIGluc3RyX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gSW5zdHMuYmVnaW4oKTsgIH0KKyAgaW5zdHJfaXRlcmF0b3IgICAgICAgICAgICAgICAgICBpbnN0cl9lbmQoKSAgICAgICB7IHJldHVybiBJbnN0cy5lbmQoKTsgICAgfQorICBjb25zdF9pbnN0cl9pdGVyYXRvciAgICAgICAgICAgIGluc3RyX2VuZCgpIGNvbnN0IHsgcmV0dXJuIEluc3RzLmVuZCgpOyAgICB9CisgIHJldmVyc2VfaW5zdHJfaXRlcmF0b3IgICAgICAgaW5zdHJfcmJlZ2luKCkgICAgICAgeyByZXR1cm4gSW5zdHMucmJlZ2luKCk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pbnN0cl9pdGVyYXRvciBpbnN0cl9yYmVnaW4oKSBjb25zdCB7IHJldHVybiBJbnN0cy5yYmVnaW4oKTsgfQorICByZXZlcnNlX2luc3RyX2l0ZXJhdG9yICAgICAgIGluc3RyX3JlbmQgICgpICAgICAgIHsgcmV0dXJuIEluc3RzLnJlbmQoKTsgICB9CisgIGNvbnN0X3JldmVyc2VfaW5zdHJfaXRlcmF0b3IgaW5zdHJfcmVuZCAgKCkgY29uc3QgeyByZXR1cm4gSW5zdHMucmVuZCgpOyAgIH0KKworICB1c2luZyBpbnN0cl9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPGluc3RyX2l0ZXJhdG9yPjsKKyAgdXNpbmcgY29uc3RfaW5zdHJfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxjb25zdF9pbnN0cl9pdGVyYXRvcj47CisgIGluc3RyX3JhbmdlIGluc3RycygpIHsgcmV0dXJuIGluc3RyX3JhbmdlKGluc3RyX2JlZ2luKCksIGluc3RyX2VuZCgpKTsgfQorICBjb25zdF9pbnN0cl9yYW5nZSBpbnN0cnMoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2luc3RyX3JhbmdlKGluc3RyX2JlZ2luKCksIGluc3RyX2VuZCgpKTsKKyAgfQorCisgIGl0ZXJhdG9yICAgICAgICAgICAgICAgIGJlZ2luKCkgICAgICAgeyByZXR1cm4gaW5zdHJfYmVnaW4oKTsgIH0KKyAgY29uc3RfaXRlcmF0b3IgICAgICAgICAgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpbnN0cl9iZWdpbigpOyAgfQorICBpdGVyYXRvciAgICAgICAgICAgICAgICBlbmQgICgpICAgICAgIHsgcmV0dXJuIGluc3RyX2VuZCgpOyAgICB9CisgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgIGVuZCAgKCkgY29uc3QgeyByZXR1cm4gaW5zdHJfZW5kKCk7ICAgIH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSB7CisgICAgcmV0dXJuIHJldmVyc2VfaXRlcmF0b3I6OmdldEF0QnVuZGxlQmVnaW4oaW5zdHJfcmJlZ2luKCkpOworICB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOjpnZXRBdEJ1bmRsZUJlZ2luKGluc3RyX3JiZWdpbigpKTsKKyAgfQorICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGluc3RyX3JlbmQoKSk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKGluc3RyX3JlbmQoKSk7CisgIH0KKworICAvLy8gU3VwcG9ydCBmb3IgTWFjaGluZUluc3RyOjpnZXROZXh0Tm9kZSgpLgorICBzdGF0aWMgSW5zdHJ1Y3Rpb25zIE1hY2hpbmVCYXNpY0Jsb2NrOjoqZ2V0U3VibGlzdEFjY2VzcyhNYWNoaW5lSW5zdHIgKikgeworICAgIHJldHVybiAmTWFjaGluZUJhc2ljQmxvY2s6Okluc3RzOworICB9CisKKyAgaW5saW5lIGl0ZXJhdG9yX3JhbmdlPGl0ZXJhdG9yPiB0ZXJtaW5hdG9ycygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShnZXRGaXJzdFRlcm1pbmF0b3IoKSwgZW5kKCkpOworICB9CisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTxjb25zdF9pdGVyYXRvcj4gdGVybWluYXRvcnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoZ2V0Rmlyc3RUZXJtaW5hdG9yKCksIGVuZCgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGEgcmFuZ2UgdGhhdCBpdGVyYXRlcyBvdmVyIHRoZSBwaGlzIGluIHRoZSBiYXNpYyBibG9jay4KKyAgaW5saW5lIGl0ZXJhdG9yX3JhbmdlPGl0ZXJhdG9yPiBwaGlzKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGJlZ2luKCksIGdldEZpcnN0Tm9uUEhJKCkpOworICB9CisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTxjb25zdF9pdGVyYXRvcj4gcGhpcygpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxNYWNoaW5lQmFzaWNCbG9jayAqPih0aGlzKS0+cGhpcygpOworICB9CisKKyAgLy8gTWFjaGluZS1DRkcgaXRlcmF0b3JzCisgIHVzaW5nIHByZWRfaXRlcmF0b3IgPSBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayAqPjo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X3ByZWRfaXRlcmF0b3IgPSBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayAqPjo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIHN1Y2NfaXRlcmF0b3IgPSBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayAqPjo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X3N1Y2NfaXRlcmF0b3IgPSBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayAqPjo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIHByZWRfcmV2ZXJzZV9pdGVyYXRvciA9CisgICAgICBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayAqPjo6cmV2ZXJzZV9pdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfcHJlZF9yZXZlcnNlX2l0ZXJhdG9yID0KKyAgICAgIHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrICo+Ojpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICB1c2luZyBzdWNjX3JldmVyc2VfaXRlcmF0b3IgPQorICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sgKj46OnJldmVyc2VfaXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X3N1Y2NfcmV2ZXJzZV9pdGVyYXRvciA9CisgICAgICBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayAqPjo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgcHJlZF9pdGVyYXRvciAgICAgICAgcHJlZF9iZWdpbigpICAgICAgIHsgcmV0dXJuIFByZWRlY2Vzc29ycy5iZWdpbigpOyB9CisgIGNvbnN0X3ByZWRfaXRlcmF0b3IgIHByZWRfYmVnaW4oKSBjb25zdCB7IHJldHVybiBQcmVkZWNlc3NvcnMuYmVnaW4oKTsgfQorICBwcmVkX2l0ZXJhdG9yICAgICAgICBwcmVkX2VuZCgpICAgICAgICAgeyByZXR1cm4gUHJlZGVjZXNzb3JzLmVuZCgpOyAgIH0KKyAgY29uc3RfcHJlZF9pdGVyYXRvciAgcHJlZF9lbmQoKSAgIGNvbnN0IHsgcmV0dXJuIFByZWRlY2Vzc29ycy5lbmQoKTsgICB9CisgIHByZWRfcmV2ZXJzZV9pdGVyYXRvciAgICAgICAgcHJlZF9yYmVnaW4oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gUHJlZGVjZXNzb3JzLnJiZWdpbigpO30KKyAgY29uc3RfcHJlZF9yZXZlcnNlX2l0ZXJhdG9yICBwcmVkX3JiZWdpbigpIGNvbnN0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBQcmVkZWNlc3NvcnMucmJlZ2luKCk7fQorICBwcmVkX3JldmVyc2VfaXRlcmF0b3IgICAgICAgIHByZWRfcmVuZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBQcmVkZWNlc3NvcnMucmVuZCgpOyAgfQorICBjb25zdF9wcmVkX3JldmVyc2VfaXRlcmF0b3IgIHByZWRfcmVuZCgpICAgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIFByZWRlY2Vzc29ycy5yZW5kKCk7ICB9CisgIHVuc2lnbmVkICAgICAgICAgICAgIHByZWRfc2l6ZSgpICBjb25zdCB7CisgICAgcmV0dXJuICh1bnNpZ25lZClQcmVkZWNlc3NvcnMuc2l6ZSgpOworICB9CisgIGJvb2wgICAgICAgICAgICAgICAgIHByZWRfZW1wdHkoKSBjb25zdCB7IHJldHVybiBQcmVkZWNlc3NvcnMuZW1wdHkoKTsgfQorICBzdWNjX2l0ZXJhdG9yICAgICAgICBzdWNjX2JlZ2luKCkgICAgICAgeyByZXR1cm4gU3VjY2Vzc29ycy5iZWdpbigpOyAgIH0KKyAgY29uc3Rfc3VjY19pdGVyYXRvciAgc3VjY19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIFN1Y2Nlc3NvcnMuYmVnaW4oKTsgICB9CisgIHN1Y2NfaXRlcmF0b3IgICAgICAgIHN1Y2NfZW5kKCkgICAgICAgICB7IHJldHVybiBTdWNjZXNzb3JzLmVuZCgpOyAgICAgfQorICBjb25zdF9zdWNjX2l0ZXJhdG9yICBzdWNjX2VuZCgpICAgY29uc3QgeyByZXR1cm4gU3VjY2Vzc29ycy5lbmQoKTsgICAgIH0KKyAgc3VjY19yZXZlcnNlX2l0ZXJhdG9yICAgICAgICBzdWNjX3JiZWdpbigpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBTdWNjZXNzb3JzLnJiZWdpbigpOyAgfQorICBjb25zdF9zdWNjX3JldmVyc2VfaXRlcmF0b3IgIHN1Y2NfcmJlZ2luKCkgY29uc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIFN1Y2Nlc3NvcnMucmJlZ2luKCk7ICB9CisgIHN1Y2NfcmV2ZXJzZV9pdGVyYXRvciAgICAgICAgc3VjY19yZW5kKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIFN1Y2Nlc3NvcnMucmVuZCgpOyAgICB9CisgIGNvbnN0X3N1Y2NfcmV2ZXJzZV9pdGVyYXRvciAgc3VjY19yZW5kKCkgICBjb25zdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gU3VjY2Vzc29ycy5yZW5kKCk7ICAgIH0KKyAgdW5zaWduZWQgICAgICAgICAgICAgc3VjY19zaXplKCkgIGNvbnN0IHsKKyAgICByZXR1cm4gKHVuc2lnbmVkKVN1Y2Nlc3NvcnMuc2l6ZSgpOworICB9CisgIGJvb2wgICAgICAgICAgICAgICAgIHN1Y2NfZW1wdHkoKSBjb25zdCB7IHJldHVybiBTdWNjZXNzb3JzLmVtcHR5KCk7ICAgfQorCisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTxwcmVkX2l0ZXJhdG9yPiBwcmVkZWNlc3NvcnMoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UocHJlZF9iZWdpbigpLCBwcmVkX2VuZCgpKTsKKyAgfQorICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8Y29uc3RfcHJlZF9pdGVyYXRvcj4gcHJlZGVjZXNzb3JzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHByZWRfYmVnaW4oKSwgcHJlZF9lbmQoKSk7CisgIH0KKyAgaW5saW5lIGl0ZXJhdG9yX3JhbmdlPHN1Y2NfaXRlcmF0b3I+IHN1Y2Nlc3NvcnMoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2Uoc3VjY19iZWdpbigpLCBzdWNjX2VuZCgpKTsKKyAgfQorICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8Y29uc3Rfc3VjY19pdGVyYXRvcj4gc3VjY2Vzc29ycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShzdWNjX2JlZ2luKCksIHN1Y2NfZW5kKCkpOworICB9CisKKyAgLy8gTGl2ZUluIG1hbmFnZW1lbnQgbWV0aG9kcy4KKworICAvLy8gQWRkcyB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGFzIGEgbGl2ZSBpbi4gTm90ZSB0aGF0IGl0IGlzIGFuIGVycm9yIHRvIGFkZAorICAvLy8gdGhlIHNhbWUgcmVnaXN0ZXIgdG8gdGhlIHNhbWUgc2V0IG1vcmUgdGhhbiBvbmNlIHVubGVzcyB0aGUgaW50ZW50aW9uIGlzCisgIC8vLyB0byBjYWxsIHNvcnRVbmlxdWVMaXZlSW5zIGFmdGVyIGFsbCByZWdpc3RlcnMgYXJlIGFkZGVkLgorICB2b2lkIGFkZExpdmVJbihNQ1BoeXNSZWcgUGh5c1JlZywKKyAgICAgICAgICAgICAgICAgTGFuZUJpdG1hc2sgTGFuZU1hc2sgPSBMYW5lQml0bWFzazo6Z2V0QWxsKCkpIHsKKyAgICBMaXZlSW5zLnB1c2hfYmFjayhSZWdpc3Rlck1hc2tQYWlyKFBoeXNSZWcsIExhbmVNYXNrKSk7CisgIH0KKyAgdm9pZCBhZGRMaXZlSW4oY29uc3QgUmVnaXN0ZXJNYXNrUGFpciAmUmVnTWFza1BhaXIpIHsKKyAgICBMaXZlSW5zLnB1c2hfYmFjayhSZWdNYXNrUGFpcik7CisgIH0KKworICAvLy8gU29ydHMgYW5kIHVuaXF1ZXMgdGhlIExpdmVJbnMgdmVjdG9yLiBJdCBjYW4gYmUgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdG8gZG8KKyAgLy8vIHRoaXMgdGhhbiByZXBlYXRlZGx5IGNhbGxpbmcgaXNMaXZlSW4gYmVmb3JlIGNhbGxpbmcgYWRkTGl2ZUluIGZvciBldmVyeQorICAvLy8gTGl2ZUluIGluc2VydGlvbi4KKyAgdm9pZCBzb3J0VW5pcXVlTGl2ZUlucygpOworCisgIC8vLyBDbGVhciBsaXZlIGluIGxpc3QuCisgIHZvaWQgY2xlYXJMaXZlSW5zKCk7CisKKyAgLy8vIEFkZCBQaHlzUmVnIGFzIGxpdmUgaW4gdG8gdGhpcyBibG9jaywgYW5kIGVuc3VyZSB0aGF0IHRoZXJlIGlzIGEgY29weSBvZgorICAvLy8gUGh5c1JlZyB0byBhIHZpcnR1YWwgcmVnaXN0ZXIgb2YgY2xhc3MgUkMuIFJldHVybiB0aGUgdmlydHVhbCByZWdpc3RlcgorICAvLy8gdGhhdCBpcyBhIGNvcHkgb2YgdGhlIGxpdmUgaW4gUGh5c1JlZy4KKyAgdW5zaWduZWQgYWRkTGl2ZUluKE1DUGh5c1JlZyBQaHlzUmVnLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyk7CisKKyAgLy8vIFJlbW92ZSB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGZyb20gdGhlIGxpdmUgaW4gc2V0LgorICB2b2lkIHJlbW92ZUxpdmVJbihNQ1BoeXNSZWcgUmVnLAorICAgICAgICAgICAgICAgICAgICBMYW5lQml0bWFzayBMYW5lTWFzayA9IExhbmVCaXRtYXNrOjpnZXRBbGwoKSk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgaXMgaW4gdGhlIGxpdmUgaW4gc2V0LgorICBib29sIGlzTGl2ZUluKE1DUGh5c1JlZyBSZWcsCisgICAgICAgICAgICAgICAgTGFuZUJpdG1hc2sgTGFuZU1hc2sgPSBMYW5lQml0bWFzazo6Z2V0QWxsKCkpIGNvbnN0OworCisgIC8vIEl0ZXJhdGlvbiBzdXBwb3J0IGZvciBsaXZlIGluIHNldHMuICBUaGVzZSBzZXRzIGFyZSBrZXB0IGluIHNvcnRlZAorICAvLyBvcmRlciBieSB0aGVpciByZWdpc3RlciBudW1iZXIuCisgIHVzaW5nIGxpdmVpbl9pdGVyYXRvciA9IExpdmVJblZlY3Rvcjo6Y29uc3RfaXRlcmF0b3I7CisjaWZuZGVmIE5ERUJVRworICAvLy8gVW5saWtlIGxpdmVpbl9iZWdpbiwgdGhpcyBtZXRob2QgZG9lcyBub3QgY2hlY2sgdGhhdCB0aGUgbGl2ZW5lc3MKKyAgLy8vIGluZm9ybWF0aW9uIGlzIGFjY3VyYXRlLiBTdGlsbCBmb3IgZGVidWcgcHVycG9zZXMgaXQgbWF5IGJlIHVzZWZ1bAorICAvLy8gdG8gaGF2ZSBpdGVyYXRvcnMgdGhhdCB3b24ndCBhc3NlcnQgaWYgdGhlIGxpdmVuZXNzIGluZm9ybWF0aW9uCisgIC8vLyBpcyBub3QgY3VycmVudC4KKyAgbGl2ZWluX2l0ZXJhdG9yIGxpdmVpbl9iZWdpbl9kYmcoKSBjb25zdCB7IHJldHVybiBMaXZlSW5zLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3JfcmFuZ2U8bGl2ZWluX2l0ZXJhdG9yPiBsaXZlaW5zX2RiZygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShsaXZlaW5fYmVnaW5fZGJnKCksIGxpdmVpbl9lbmQoKSk7CisgIH0KKyNlbmRpZgorICBsaXZlaW5faXRlcmF0b3IgbGl2ZWluX2JlZ2luKCkgY29uc3Q7CisgIGxpdmVpbl9pdGVyYXRvciBsaXZlaW5fZW5kKCkgICBjb25zdCB7IHJldHVybiBMaXZlSW5zLmVuZCgpOyB9CisgIGJvb2wgICAgICAgICAgICBsaXZlaW5fZW1wdHkoKSBjb25zdCB7IHJldHVybiBMaXZlSW5zLmVtcHR5KCk7IH0KKyAgaXRlcmF0b3JfcmFuZ2U8bGl2ZWluX2l0ZXJhdG9yPiBsaXZlaW5zKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGxpdmVpbl9iZWdpbigpLCBsaXZlaW5fZW5kKCkpOworICB9CisKKyAgLy8vIFJlbW92ZSBlbnRyeSBmcm9tIHRoZSBsaXZlaW4gc2V0IGFuZCByZXR1cm4gaXRlcmF0b3IgdG8gdGhlIG5leHQuCisgIGxpdmVpbl9pdGVyYXRvciByZW1vdmVMaXZlSW4obGl2ZWluX2l0ZXJhdG9yIEkpOworCisgIC8vLyBHZXQgdGhlIGNsb2JiZXIgbWFzayBmb3IgdGhlIHN0YXJ0IG9mIHRoaXMgYmFzaWMgYmxvY2suIEZ1bmNsZXRzIHVzZSB0aGlzCisgIC8vLyB0byBwcmV2ZW50IHJlZ2lzdGVyIGFsbG9jYXRpb24gYWNyb3NzIGZ1bmNsZXQgdHJhbnNpdGlvbnMuCisgIGNvbnN0IHVpbnQzMl90ICpnZXRCZWdpbkNsb2JiZXJNYXNrKGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSBjbG9iYmVyIG1hc2sgZm9yIHRoZSBlbmQgb2YgdGhlIGJhc2ljIGJsb2NrLgorICAvLy8gXHNlZSBnZXRCZWdpbkNsb2JiZXJNYXNrKCkKKyAgY29uc3QgdWludDMyX3QgKmdldEVuZENsb2JiZXJNYXNrKGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGFsaWdubWVudCBvZiB0aGUgYmFzaWMgYmxvY2suIFRoZSBhbGlnbm1lbnQgaXMgc3BlY2lmaWVkIGFzCisgIC8vLyBsb2cyKGJ5dGVzKS4KKyAgdW5zaWduZWQgZ2V0QWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gQWxpZ25tZW50OyB9CisKKyAgLy8vIFNldCBhbGlnbm1lbnQgb2YgdGhlIGJhc2ljIGJsb2NrLiBUaGUgYWxpZ25tZW50IGlzIHNwZWNpZmllZCBhcworICAvLy8gbG9nMihieXRlcykuCisgIHZvaWQgc2V0QWxpZ25tZW50KHVuc2lnbmVkIEFsaWduKSB7IEFsaWdubWVudCA9IEFsaWduOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgYmxvY2sgaXMgYSBsYW5kaW5nIHBhZC4gVGhhdCBpcyB0aGlzIGJhc2ljIGJsb2NrIGlzCisgIC8vLyBlbnRlcmVkIHZpYSBhbiBleGNlcHRpb24gaGFuZGxlci4KKyAgYm9vbCBpc0VIUGFkKCkgY29uc3QgeyByZXR1cm4gSXNFSFBhZDsgfQorCisgIC8vLyBJbmRpY2F0ZXMgdGhlIGJsb2NrIGlzIGEgbGFuZGluZyBwYWQuICBUaGF0IGlzIHRoaXMgYmFzaWMgYmxvY2sgaXMgZW50ZXJlZAorICAvLy8gdmlhIGFuIGV4Y2VwdGlvbiBoYW5kbGVyLgorICB2b2lkIHNldElzRUhQYWQoYm9vbCBWID0gdHJ1ZSkgeyBJc0VIUGFkID0gVjsgfQorCisgIGJvb2wgaGFzRUhQYWRTdWNjZXNzb3IoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIGVudHJ5IGJsb2NrIG9mIGFuIEVIIGZ1bmNsZXQuCisgIGJvb2wgaXNFSEZ1bmNsZXRFbnRyeSgpIGNvbnN0IHsgcmV0dXJuIElzRUhGdW5jbGV0RW50cnk7IH0KKworICAvLy8gSW5kaWNhdGVzIGlmIHRoaXMgaXMgdGhlIGVudHJ5IGJsb2NrIG9mIGFuIEVIIGZ1bmNsZXQuCisgIHZvaWQgc2V0SXNFSEZ1bmNsZXRFbnRyeShib29sIFYgPSB0cnVlKSB7IElzRUhGdW5jbGV0RW50cnkgPSBWOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIHRoZSBlbnRyeSBibG9jayBvZiBhIGNsZWFudXAgZnVuY2xldC4KKyAgYm9vbCBpc0NsZWFudXBGdW5jbGV0RW50cnkoKSBjb25zdCB7IHJldHVybiBJc0NsZWFudXBGdW5jbGV0RW50cnk7IH0KKworICAvLy8gSW5kaWNhdGVzIGlmIHRoaXMgaXMgdGhlIGVudHJ5IGJsb2NrIG9mIGEgY2xlYW51cCBmdW5jbGV0LgorICB2b2lkIHNldElzQ2xlYW51cEZ1bmNsZXRFbnRyeShib29sIFYgPSB0cnVlKSB7IElzQ2xlYW51cEZ1bmNsZXRFbnRyeSA9IFY7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIGl0IGlzIGxlZ2FsIHRvIGhvaXN0IGluc3RydWN0aW9ucyBpbnRvIHRoaXMgYmxvY2suCisgIGJvb2wgaXNMZWdhbFRvSG9pc3RJbnRvKCkgY29uc3Q7CisKKyAgLy8gQ29kZSBMYXlvdXQgbWV0aG9kcy4KKworICAvLy8gTW92ZSAndGhpcycgYmxvY2sgYmVmb3JlIG9yIGFmdGVyIHRoZSBzcGVjaWZpZWQgYmxvY2suICBUaGlzIG9ubHkgbW92ZXMKKyAgLy8vIHRoZSBibG9jaywgaXQgZG9lcyBub3QgbW9kaWZ5IHRoZSBDRkcgb3IgYWRqdXN0IHBvdGVudGlhbCBmYWxsLXRocm91Z2hzIGF0CisgIC8vLyB0aGUgZW5kIG9mIHRoZSBibG9jay4KKyAgdm9pZCBtb3ZlQmVmb3JlKE1hY2hpbmVCYXNpY0Jsb2NrICpOZXdBZnRlcik7CisgIHZvaWQgbW92ZUFmdGVyKE1hY2hpbmVCYXNpY0Jsb2NrICpOZXdCZWZvcmUpOworCisgIC8vLyBVcGRhdGUgdGhlIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb25zIGluIGJsb2NrIHRvIGFjY291bnQgZm9yIGNoYW5nZXMgdG8gdGhlCisgIC8vLyBsYXlvdXQuIElmIHRoZSBibG9jayBwcmV2aW91c2x5IHVzZWQgYSBmYWxsdGhyb3VnaCwgaXQgbWF5IG5vdyBuZWVkIGEKKyAgLy8vIGJyYW5jaCwgYW5kIGlmIGl0IHByZXZpb3VzbHkgdXNlZCBicmFuY2hpbmcgaXQgbWF5IG5vdyBiZSBhYmxlIHRvIHVzZSBhCisgIC8vLyBmYWxsdGhyb3VnaC4KKyAgdm9pZCB1cGRhdGVUZXJtaW5hdG9yKCk7CisKKyAgLy8gTWFjaGluZS1DRkcgbXV0YXRvcnMKKworICAvLy8gQWRkIFN1Y2MgYXMgYSBzdWNjZXNzb3Igb2YgdGhpcyBNYWNoaW5lQmFzaWNCbG9jay4gIFRoZSBQcmVkZWNlc3NvcnMgbGlzdAorICAvLy8gb2YgU3VjYyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQuIFBST0IgcGFyYW1ldGVyIGlzIHN0b3JlZCBpbgorICAvLy8gUHJvYmFiaWxpdGllcyBsaXN0LiBUaGUgZGVmYXVsdCBwcm9iYWJpbGl0eSBpcyBzZXQgYXMgdW5rbm93bi4gTWl4aW5nCisgIC8vLyBrbm93biBhbmQgdW5rbm93biBwcm9iYWJpbGl0aWVzIGluIHN1Y2Nlc3NvciBsaXN0IGlzIG5vdCBhbGxvd2VkLiBXaGVuIGFsbAorICAvLy8gc3VjY2Vzc29ycyBoYXZlIHVua25vd24gcHJvYmFiaWxpdGllcywgMSAvIE4gaXMgcmV0dXJuZWQgYXMgdGhlCisgIC8vLyBwcm9iYWJpbGl0eSBmb3IgZWFjaCBzdWNjZXNzb3IsIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBzdWNjZXNzb3JzLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBkdXBsaWNhdGUgTWFjaGluZSBDRkcgZWRnZXMgYXJlIG5vdCBhbGxvd2VkLgorICB2b2lkIGFkZFN1Y2Nlc3NvcihNYWNoaW5lQmFzaWNCbG9jayAqU3VjYywKKyAgICAgICAgICAgICAgICAgICAgQnJhbmNoUHJvYmFiaWxpdHkgUHJvYiA9IEJyYW5jaFByb2JhYmlsaXR5OjpnZXRVbmtub3duKCkpOworCisgIC8vLyBBZGQgU3VjYyBhcyBhIHN1Y2Nlc3NvciBvZiB0aGlzIE1hY2hpbmVCYXNpY0Jsb2NrLiAgVGhlIFByZWRlY2Vzc29ycyBsaXN0CisgIC8vLyBvZiBTdWNjIGlzIGF1dG9tYXRpY2FsbHkgdXBkYXRlZC4gVGhlIHByb2JhYmlsaXR5IGlzIG5vdCBwcm92aWRlZCBiZWNhdXNlCisgIC8vLyBCUEkgaXMgbm90IGF2YWlsYWJsZSAoZS5nLiAtTzAgaXMgdXNlZCksIGluIHdoaWNoIGNhc2UgZWRnZSBwcm9iYWJpbGl0aWVzCisgIC8vLyB3b24ndCBiZSB1c2VkLiBVc2luZyB0aGlzIGludGVyZmFjZSBjYW4gc2F2ZSBzb21lIHNwYWNlLgorICB2b2lkIGFkZFN1Y2Nlc3NvcldpdGhvdXRQcm9iKE1hY2hpbmVCYXNpY0Jsb2NrICpTdWNjKTsKKworICAvLy8gU2V0IHN1Y2Nlc3NvciBwcm9iYWJpbGl0eSBvZiBhIGdpdmVuIGl0ZXJhdG9yLgorICB2b2lkIHNldFN1Y2NQcm9iYWJpbGl0eShzdWNjX2l0ZXJhdG9yIEksIEJyYW5jaFByb2JhYmlsaXR5IFByb2IpOworCisgIC8vLyBOb3JtYWxpemUgcHJvYmFiaWxpdGllcyBvZiBhbGwgc3VjY2Vzc29ycyBzbyB0aGF0IHRoZSBzdW0gb2YgdGhlbSBiZWNvbWVzCisgIC8vLyBvbmUuIFRoaXMgaXMgdXN1YWxseSBkb25lIHdoZW4gdGhlIGN1cnJlbnQgdXBkYXRlIG9uIHRoaXMgTUJCIGlzIGRvbmUsIGFuZAorICAvLy8gdGhlIHN1bSBvZiBpdHMgc3VjY2Vzc29ycycgcHJvYmFiaWxpdGllcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBvbmUuIFRoZQorICAvLy8gdXNlciBpcyByZXNwb25zaWJsZSBmb3IgdGhlIGNvcnJlY3QgdXNlIG9mIHRoaXMgZnVuY3Rpb24uCisgIC8vLyBNQkI6OnJlbW92ZVN1Y2Nlc3NvcigpIGhhcyBhbiBvcHRpb24gdG8gZG8gdGhpcyBhdXRvbWF0aWNhbGx5LgorICB2b2lkIG5vcm1hbGl6ZVN1Y2NQcm9icygpIHsKKyAgICBCcmFuY2hQcm9iYWJpbGl0eTo6bm9ybWFsaXplUHJvYmFiaWxpdGllcyhQcm9icy5iZWdpbigpLCBQcm9icy5lbmQoKSk7CisgIH0KKworICAvLy8gVmFsaWRhdGUgc3VjY2Vzc29ycycgcHJvYmFiaWxpdGllcyBhbmQgY2hlY2sgaWYgdGhlIHN1bSBvZiB0aGVtIGlzCisgIC8vLyBhcHByb3hpbWF0ZSBvbmUuIFRoaXMgb25seSB3b3JrcyBpbiBERUJVRyBtb2RlLgorICB2b2lkIHZhbGlkYXRlU3VjY1Byb2JzKCkgY29uc3Q7CisKKyAgLy8vIFJlbW92ZSBzdWNjZXNzb3IgZnJvbSB0aGUgc3VjY2Vzc29ycyBsaXN0IG9mIHRoaXMgTWFjaGluZUJhc2ljQmxvY2suIFRoZQorICAvLy8gUHJlZGVjZXNzb3JzIGxpc3Qgb2YgU3VjYyBpcyBhdXRvbWF0aWNhbGx5IHVwZGF0ZWQuCisgIC8vLyBJZiBOb3JtYWxpemVTdWNjUHJvYnMgaXMgdHJ1ZSwgdGhlbiBub3JtYWxpemUgc3VjY2Vzc29ycycgcHJvYmFiaWxpdGllcworICAvLy8gYWZ0ZXIgdGhlIHN1Y2Nlc3NvciBpcyByZW1vdmVkLgorICB2b2lkIHJlbW92ZVN1Y2Nlc3NvcihNYWNoaW5lQmFzaWNCbG9jayAqU3VjYywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb3JtYWxpemVTdWNjUHJvYnMgPSBmYWxzZSk7CisKKyAgLy8vIFJlbW92ZSBzcGVjaWZpZWQgc3VjY2Vzc29yIGZyb20gdGhlIHN1Y2Nlc3NvcnMgbGlzdCBvZiB0aGlzCisgIC8vLyBNYWNoaW5lQmFzaWNCbG9jay4gVGhlIFByZWRlY2Vzc29ycyBsaXN0IG9mIFN1Y2MgaXMgYXV0b21hdGljYWxseSB1cGRhdGVkLgorICAvLy8gSWYgTm9ybWFsaXplU3VjY1Byb2JzIGlzIHRydWUsIHRoZW4gbm9ybWFsaXplIHN1Y2Nlc3NvcnMnIHByb2JhYmlsaXRpZXMKKyAgLy8vIGFmdGVyIHRoZSBzdWNjZXNzb3IgaXMgcmVtb3ZlZC4KKyAgLy8vIFJldHVybiB0aGUgaXRlcmF0b3IgdG8gdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIG9uZSByZW1vdmVkLgorICBzdWNjX2l0ZXJhdG9yIHJlbW92ZVN1Y2Nlc3NvcihzdWNjX2l0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTm9ybWFsaXplU3VjY1Byb2JzID0gZmFsc2UpOworCisgIC8vLyBSZXBsYWNlIHN1Y2Nlc3NvciBPTEQgd2l0aCBORVcgYW5kIHVwZGF0ZSBwcm9iYWJpbGl0eSBpbmZvLgorICB2b2lkIHJlcGxhY2VTdWNjZXNzb3IoTWFjaGluZUJhc2ljQmxvY2sgKk9sZCwgTWFjaGluZUJhc2ljQmxvY2sgKk5ldyk7CisKKyAgLy8vIENvcHkgYSBzdWNjZXNzb3IgKGFuZCBhbnkgcHJvYmFiaWxpdHkgaW5mbykgZnJvbSBvcmlnaW5hbCBibG9jayB0byB0aGlzCisgIC8vLyBibG9jaydzLiBVc2VzIGFuIGl0ZXJhdG9yIGludG8gdGhlIG9yaWdpbmFsIGJsb2NrcyBzdWNjZXNzb3JzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZnVsIHdoZW4gZG9pbmcgYSBwYXJ0aWFsIGNsb25lIG9mIHN1Y2Nlc3NvcnMuIEFmdGVyd2FyZCwgdGhlCisgIC8vLyBwcm9iYWJpbGl0aWVzIG1heSBuZWVkIHRvIGJlIG5vcm1hbGl6ZWQuCisgIHZvaWQgY29weVN1Y2Nlc3NvcihNYWNoaW5lQmFzaWNCbG9jayAqT3JpZywgc3VjY19pdGVyYXRvciBJKTsKKworICAvLy8gVHJhbnNmZXJzIGFsbCB0aGUgc3VjY2Vzc29ycyBmcm9tIE1CQiB0byB0aGlzIG1hY2hpbmUgYmFzaWMgYmxvY2sgKGkuZS4sCisgIC8vLyBjb3BpZXMgYWxsIHRoZSBzdWNjZXNzb3JzIEZyb21NQkIgYW5kIHJlbW92ZSBhbGwgdGhlIHN1Y2Nlc3NvcnMgZnJvbQorICAvLy8gRnJvbU1CQikuCisgIHZvaWQgdHJhbnNmZXJTdWNjZXNzb3JzKE1hY2hpbmVCYXNpY0Jsb2NrICpGcm9tTUJCKTsKKworICAvLy8gVHJhbnNmZXJzIGFsbCB0aGUgc3VjY2Vzc29ycywgYXMgaW4gdHJhbnNmZXJTdWNjZXNzb3JzLCBhbmQgdXBkYXRlIFBISQorICAvLy8gb3BlcmFuZHMgaW4gdGhlIHN1Y2Nlc3NvciBibG9ja3Mgd2hpY2ggcmVmZXIgdG8gRnJvbU1CQiB0byByZWZlciB0byB0aGlzLgorICB2b2lkIHRyYW5zZmVyU3VjY2Vzc29yc0FuZFVwZGF0ZVBISXMoTWFjaGluZUJhc2ljQmxvY2sgKkZyb21NQkIpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhbnkgb2YgdGhlIHN1Y2Nlc3NvcnMgaGF2ZSBwcm9iYWJpbGl0aWVzIGF0dGFjaGVkIHRvIHRoZW0uCisgIGJvb2wgaGFzU3VjY2Vzc29yUHJvYmFiaWxpdGllcygpIGNvbnN0IHsgcmV0dXJuICFQcm9icy5lbXB0eSgpOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgTUJCIGlzIGEgcHJlZGVjZXNzb3Igb2YgdGhpcyBibG9jay4KKyAgYm9vbCBpc1ByZWRlY2Vzc29yKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIE1CQiBpcyBhIHN1Y2Nlc3NvciBvZiB0aGlzIGJsb2NrLgorICBib29sIGlzU3VjY2Vzc29yKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIE1CQiB3aWxsIGJlIGVtaXR0ZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhpcworICAvLy8gYmxvY2ssIHN1Y2ggdGhhdCBpZiB0aGlzIGJsb2NrIGV4aXRzIGJ5IGZhbGxpbmcgdGhyb3VnaCwgY29udHJvbCB3aWxsCisgIC8vLyB0cmFuc2ZlciB0byB0aGUgc3BlY2lmaWVkIE1CQi4gTm90ZSB0aGF0IE1CQiBuZWVkIG5vdCBiZSBhIHN1Y2Nlc3NvciBhdAorICAvLy8gYWxsLCBmb3IgZXhhbXBsZSBpZiB0aGlzIGJsb2NrIGVuZHMgd2l0aCBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCB0byBzb21lCisgIC8vLyBvdGhlciBibG9jay4KKyAgYm9vbCBpc0xheW91dFN1Y2Nlc3Nvcihjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBmYWxsdGhyb3VnaCBibG9jayBpZiB0aGUgYmxvY2sgY2FuIGltcGxpY2l0bHkKKyAgLy8vIHRyYW5zZmVyIGNvbnRyb2wgdG8gdGhlIGJsb2NrIGFmdGVyIGl0IGJ5IGZhbGxpbmcgb2ZmIHRoZSBlbmQgb2YKKyAgLy8vIGl0LiAgVGhpcyBzaG91bGQgcmV0dXJuIG51bGwgaWYgaXQgY2FuIHJlYWNoIHRoZSBibG9jayBhZnRlcgorICAvLy8gaXQsIGJ1dCBpdCB1c2VzIGFuIGV4cGxpY2l0IGJyYW5jaCB0byBkbyBzbyAoZS5nLiwgYSB0YWJsZQorICAvLy8ganVtcCkuICBOb24tbnVsbCByZXR1cm4gIGlzIGEgY29uc2VydmF0aXZlIGFuc3dlci4KKyAgTWFjaGluZUJhc2ljQmxvY2sgKmdldEZhbGxUaHJvdWdoKCk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBibG9jayBjYW4gaW1wbGljaXRseSB0cmFuc2ZlciBjb250cm9sIHRvIHRoZQorICAvLy8gYmxvY2sgYWZ0ZXIgaXQgYnkgZmFsbGluZyBvZmYgdGhlIGVuZCBvZiBpdC4gIFRoaXMgc2hvdWxkIHJldHVybgorICAvLy8gZmFsc2UgaWYgaXQgY2FuIHJlYWNoIHRoZSBibG9jayBhZnRlciBpdCwgYnV0IGl0IHVzZXMgYW4KKyAgLy8vIGV4cGxpY2l0IGJyYW5jaCB0byBkbyBzbyAoZS5nLiwgYSB0YWJsZSBqdW1wKS4gIFRydWUgaXMgYQorICAvLy8gY29uc2VydmF0aXZlIGFuc3dlci4KKyAgYm9vbCBjYW5GYWxsVGhyb3VnaCgpOworCisgIC8vLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gdGhpcyBibG9jayB0aGF0IGlzIG5vdCBhCisgIC8vLyBQSElOb2RlIGluc3RydWN0aW9uLiBXaGVuIGFkZGluZyBpbnN0cnVjdGlvbnMgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUKKyAgLy8vIGJhc2ljIGJsb2NrLCB0aGV5IHNob3VsZCBiZSBhZGRlZCBiZWZvcmUgdGhlIHJldHVybmVkIHZhbHVlLCBub3QgYmVmb3JlCisgIC8vLyB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24sIHdoaWNoIG1pZ2h0IGJlIFBISS4KKyAgLy8vIFJldHVybnMgZW5kKCkgaXMgdGhlcmUncyBubyBub24tUEhJIGluc3RydWN0aW9uLgorICBpdGVyYXRvciBnZXRGaXJzdE5vblBISSgpOworCisgIC8vLyBSZXR1cm4gdGhlIGZpcnN0IGluc3RydWN0aW9uIGluIE1CQiBhZnRlciBJIHRoYXQgaXMgbm90IGEgUEhJIG9yIGEgbGFiZWwuCisgIC8vLyBUaGlzIGlzIHRoZSBjb3JyZWN0IHBvaW50IHRvIGluc2VydCBsb3dlcmVkIGNvcGllcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEKKyAgLy8vIGJhc2ljIGJsb2NrIHRoYXQgbXVzdCBiZSBiZWZvcmUgYW55IGRlYnVnZ2luZyBpbmZvcm1hdGlvbi4KKyAgaXRlcmF0b3IgU2tpcFBISXNBbmRMYWJlbHMoaXRlcmF0b3IgSSk7CisKKyAgLy8vIFJldHVybiB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gTUJCIGFmdGVyIEkgdGhhdCBpcyBub3QgYSBQSEksIGxhYmVsIG9yCisgIC8vLyBkZWJ1Zy4gIFRoaXMgaXMgdGhlIGNvcnJlY3QgcG9pbnQgdG8gaW5zZXJ0IGNvcGllcyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEKKyAgLy8vIGJhc2ljIGJsb2NrLgorICBpdGVyYXRvciBTa2lwUEhJc0xhYmVsc0FuZERlYnVnKGl0ZXJhdG9yIEkpOworCisgIC8vLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCB0ZXJtaW5hdG9yIGluc3RydWN0aW9uIG9mIHRoaXMgYmFzaWMKKyAgLy8vIGJsb2NrLiBJZiBhIHRlcm1pbmF0b3IgZG9lcyBub3QgZXhpc3QsIGl0IHJldHVybnMgZW5kKCkuCisgIGl0ZXJhdG9yIGdldEZpcnN0VGVybWluYXRvcigpOworICBjb25zdF9pdGVyYXRvciBnZXRGaXJzdFRlcm1pbmF0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TWFjaGluZUJhc2ljQmxvY2sgKj4odGhpcyktPmdldEZpcnN0VGVybWluYXRvcigpOworICB9CisKKyAgLy8vIFNhbWUgZ2V0Rmlyc3RUZXJtaW5hdG9yIGJ1dCBpdCBpZ25vcmVzIGJ1bmRsZXMgYW5kIHJldHVybiBhbgorICAvLy8gaW5zdHJfaXRlcmF0b3IgaW5zdGVhZC4KKyAgaW5zdHJfaXRlcmF0b3IgZ2V0Rmlyc3RJbnN0clRlcm1pbmF0b3IoKTsKKworICAvLy8gUmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZmlyc3Qgbm9uLWRlYnVnIGluc3RydWN0aW9uIGluIHRoZSBiYXNpYyBibG9jaywKKyAgLy8vIG9yIGVuZCgpLgorICBpdGVyYXRvciBnZXRGaXJzdE5vbkRlYnVnSW5zdHIoKTsKKyAgY29uc3RfaXRlcmF0b3IgZ2V0Rmlyc3ROb25EZWJ1Z0luc3RyKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PE1hY2hpbmVCYXNpY0Jsb2NrICo+KHRoaXMpLT5nZXRGaXJzdE5vbkRlYnVnSW5zdHIoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBsYXN0IG5vbi1kZWJ1ZyBpbnN0cnVjdGlvbiBpbiB0aGUgYmFzaWMgYmxvY2ssCisgIC8vLyBvciBlbmQoKS4KKyAgaXRlcmF0b3IgZ2V0TGFzdE5vbkRlYnVnSW5zdHIoKTsKKyAgY29uc3RfaXRlcmF0b3IgZ2V0TGFzdE5vbkRlYnVnSW5zdHIoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TWFjaGluZUJhc2ljQmxvY2sgKj4odGhpcyktPmdldExhc3ROb25EZWJ1Z0luc3RyKCk7CisgIH0KKworICAvLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRydWUgaWYgdGhlIGJsb2NrIGVuZHMgaW4gYSByZXR1cm4KKyAgLy8vIGluc3RydWN0aW9uLgorICBib29sIGlzUmV0dXJuQmxvY2soKSBjb25zdCB7CisgICAgcmV0dXJuICFlbXB0eSgpICYmIGJhY2soKS5pc1JldHVybigpOworICB9CisKKyAgLy8vIFNwbGl0IHRoZSBjcml0aWNhbCBlZGdlIGZyb20gdGhpcyBibG9jayB0byB0aGUgZ2l2ZW4gc3VjY2Vzc29yIGJsb2NrLCBhbmQKKyAgLy8vIHJldHVybiB0aGUgbmV3bHkgY3JlYXRlZCBibG9jaywgb3IgbnVsbCBpZiBzcGxpdHRpbmcgaXMgbm90IHBvc3NpYmxlLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gdXBkYXRlcyBMaXZlVmFyaWFibGVzLCBNYWNoaW5lRG9taW5hdG9yVHJlZSwgYW5kCisgIC8vLyBNYWNoaW5lTG9vcEluZm8sIGFzIGFwcGxpY2FibGUuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpTcGxpdENyaXRpY2FsRWRnZShNYWNoaW5lQmFzaWNCbG9jayAqU3VjYywgUGFzcyAmUCk7CisKKyAgLy8vIENoZWNrIGlmIHRoZSBlZGdlIGJldHdlZW4gdGhpcyBibG9jayBhbmQgdGhlIGdpdmVuIHN1Y2Nlc3NvciBccAorICAvLy8gU3VjYywgY2FuIGJlIHNwbGl0LiBJZiB0aGlzIHJldHVybnMgdHJ1ZSBhIHN1YnNlcXVlbnQgY2FsbCB0bworICAvLy8gU3BsaXRDcml0aWNhbEVkZ2UgaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gYSB2YWxpZCBiYXNpYyBibG9jayBpZgorICAvLy8gbm8gY2hhbmdlcyBvY2N1cnJlZCBpbiB0aGUgbWVhbnRpbWUuCisgIGJvb2wgY2FuU3BsaXRDcml0aWNhbEVkZ2UoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKlN1Y2MpIGNvbnN0OworCisgIHZvaWQgcG9wX2Zyb250KCkgeyBJbnN0cy5wb3BfZnJvbnQoKTsgfQorICB2b2lkIHBvcF9iYWNrKCkgeyBJbnN0cy5wb3BfYmFjaygpOyB9CisgIHZvaWQgcHVzaF9iYWNrKE1hY2hpbmVJbnN0ciAqTUkpIHsgSW5zdHMucHVzaF9iYWNrKE1JKTsgfQorCisgIC8vLyBJbnNlcnQgTUkgaW50byB0aGUgaW5zdHJ1Y3Rpb24gbGlzdCBiZWZvcmUgSSwgcG9zc2libHkgaW5zaWRlIGEgYnVuZGxlLgorICAvLy8KKyAgLy8vIElmIHRoZSBpbnNlcnRpb24gcG9pbnQgaXMgaW5zaWRlIGEgYnVuZGxlLCBNSSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBidW5kbGUsCisgIC8vLyBvdGhlcndpc2UgTUkgd2lsbCBub3QgYmUgYWRkZWQgdG8gYW55IGJ1bmRsZS4gVGhhdCBtZWFucyB0aGlzIGZ1bmN0aW9uCisgIC8vLyBhbG9uZSBjYW4ndCBiZSB1c2VkIHRvIHByZXBlbmQgb3IgYXBwZW5kIGluc3RydWN0aW9ucyB0byBidW5kbGVzLiBTZWUKKyAgLy8vIE1JQnVuZGxlQnVpbGRlcjo6aW5zZXJ0KCkgZm9yIGEgbW9yZSByZWxpYWJsZSB3YXkgb2YgZG9pbmcgdGhhdC4KKyAgaW5zdHJfaXRlcmF0b3IgaW5zZXJ0KGluc3RyX2l0ZXJhdG9yIEksIE1hY2hpbmVJbnN0ciAqTSk7CisKKyAgLy8vIEluc2VydCBhIHJhbmdlIG9mIGluc3RydWN0aW9ucyBpbnRvIHRoZSBpbnN0cnVjdGlvbiBsaXN0IGJlZm9yZSBJLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJVD4KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgSSwgSVQgUywgSVQgRSkgeworICAgIGFzc2VydCgoSSA9PSBlbmQoKSB8fCBJLT5nZXRQYXJlbnQoKSA9PSB0aGlzKSAmJgorICAgICAgICAgICAiaXRlcmF0b3IgcG9pbnRzIG91dHNpZGUgb2YgYmFzaWMgYmxvY2siKTsKKyAgICBJbnN0cy5pbnNlcnQoSS5nZXRJbnN0ckl0ZXJhdG9yKCksIFMsIEUpOworICB9CisKKyAgLy8vIEluc2VydCBNSSBpbnRvIHRoZSBpbnN0cnVjdGlvbiBsaXN0IGJlZm9yZSBJLgorICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgSSwgTWFjaGluZUluc3RyICpNSSkgeworICAgIGFzc2VydCgoSSA9PSBlbmQoKSB8fCBJLT5nZXRQYXJlbnQoKSA9PSB0aGlzKSAmJgorICAgICAgICAgICAiaXRlcmF0b3IgcG9pbnRzIG91dHNpZGUgb2YgYmFzaWMgYmxvY2siKTsKKyAgICBhc3NlcnQoIU1JLT5pc0J1bmRsZWRXaXRoUHJlZCgpICYmICFNSS0+aXNCdW5kbGVkV2l0aFN1Y2MoKSAmJgorICAgICAgICAgICAiQ2Fubm90IGluc2VydCBpbnN0cnVjdGlvbiB3aXRoIGJ1bmRsZSBmbGFncyIpOworICAgIHJldHVybiBJbnN0cy5pbnNlcnQoSS5nZXRJbnN0ckl0ZXJhdG9yKCksIE1JKTsKKyAgfQorCisgIC8vLyBJbnNlcnQgTUkgaW50byB0aGUgaW5zdHJ1Y3Rpb24gbGlzdCBhZnRlciBJLgorICBpdGVyYXRvciBpbnNlcnRBZnRlcihpdGVyYXRvciBJLCBNYWNoaW5lSW5zdHIgKk1JKSB7CisgICAgYXNzZXJ0KChJID09IGVuZCgpIHx8IEktPmdldFBhcmVudCgpID09IHRoaXMpICYmCisgICAgICAgICAgICJpdGVyYXRvciBwb2ludHMgb3V0c2lkZSBvZiBiYXNpYyBibG9jayIpOworICAgIGFzc2VydCghTUktPmlzQnVuZGxlZFdpdGhQcmVkKCkgJiYgIU1JLT5pc0J1bmRsZWRXaXRoU3VjYygpICYmCisgICAgICAgICAgICJDYW5ub3QgaW5zZXJ0IGluc3RydWN0aW9uIHdpdGggYnVuZGxlIGZsYWdzIik7CisgICAgcmV0dXJuIEluc3RzLmluc2VydEFmdGVyKEkuZ2V0SW5zdHJJdGVyYXRvcigpLCBNSSk7CisgIH0KKworICAvLy8gUmVtb3ZlIGFuIGluc3RydWN0aW9uIGZyb20gdGhlIGluc3RydWN0aW9uIGxpc3QgYW5kIGRlbGV0ZSBpdC4KKyAgLy8vCisgIC8vLyBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgcGFydCBvZiBhIGJ1bmRsZSwgdGhlIG90aGVyIGluc3RydWN0aW9ucyBpbiB0aGUKKyAgLy8vIGJ1bmRsZSB3aWxsIHN0aWxsIGJlIGJ1bmRsZWQgYWZ0ZXIgcmVtb3ZpbmcgdGhlIHNpbmdsZSBpbnN0cnVjdGlvbi4KKyAgaW5zdHJfaXRlcmF0b3IgZXJhc2UoaW5zdHJfaXRlcmF0b3IgSSk7CisKKyAgLy8vIFJlbW92ZSBhbiBpbnN0cnVjdGlvbiBmcm9tIHRoZSBpbnN0cnVjdGlvbiBsaXN0IGFuZCBkZWxldGUgaXQuCisgIC8vLworICAvLy8gSWYgdGhlIGluc3RydWN0aW9uIGlzIHBhcnQgb2YgYSBidW5kbGUsIHRoZSBvdGhlciBpbnN0cnVjdGlvbnMgaW4gdGhlCisgIC8vLyBidW5kbGUgd2lsbCBzdGlsbCBiZSBidW5kbGVkIGFmdGVyIHJlbW92aW5nIHRoZSBzaW5nbGUgaW5zdHJ1Y3Rpb24uCisgIGluc3RyX2l0ZXJhdG9yIGVyYXNlX2luc3RyKE1hY2hpbmVJbnN0ciAqSSkgeworICAgIHJldHVybiBlcmFzZShpbnN0cl9pdGVyYXRvcihJKSk7CisgIH0KKworICAvLy8gUmVtb3ZlIGEgcmFuZ2Ugb2YgaW5zdHJ1Y3Rpb25zIGZyb20gdGhlIGluc3RydWN0aW9uIGxpc3QgYW5kIGRlbGV0ZSB0aGVtLgorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBJLCBpdGVyYXRvciBFKSB7CisgICAgcmV0dXJuIEluc3RzLmVyYXNlKEkuZ2V0SW5zdHJJdGVyYXRvcigpLCBFLmdldEluc3RySXRlcmF0b3IoKSk7CisgIH0KKworICAvLy8gUmVtb3ZlIGFuIGluc3RydWN0aW9uIG9yIGJ1bmRsZSBmcm9tIHRoZSBpbnN0cnVjdGlvbiBsaXN0IGFuZCBkZWxldGUgaXQuCisgIC8vLworICAvLy8gSWYgSSBwb2ludHMgdG8gYSBidW5kbGUgb2YgaW5zdHJ1Y3Rpb25zLCB0aGV5IGFyZSBhbGwgZXJhc2VkLgorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBJKSB7CisgICAgcmV0dXJuIGVyYXNlKEksIHN0ZDo6bmV4dChJKSk7CisgIH0KKworICAvLy8gUmVtb3ZlIGFuIGluc3RydWN0aW9uIGZyb20gdGhlIGluc3RydWN0aW9uIGxpc3QgYW5kIGRlbGV0ZSBpdC4KKyAgLy8vCisgIC8vLyBJZiBJIGlzIHRoZSBoZWFkIG9mIGEgYnVuZGxlIG9mIGluc3RydWN0aW9ucywgdGhlIHdob2xlIGJ1bmRsZSB3aWxsIGJlCisgIC8vLyBlcmFzZWQuCisgIGl0ZXJhdG9yIGVyYXNlKE1hY2hpbmVJbnN0ciAqSSkgeworICAgIHJldHVybiBlcmFzZShpdGVyYXRvcihJKSk7CisgIH0KKworICAvLy8gUmVtb3ZlIHRoZSB1bmJ1bmRsZWQgaW5zdHJ1Y3Rpb24gZnJvbSB0aGUgaW5zdHJ1Y3Rpb24gbGlzdCB3aXRob3V0CisgIC8vLyBkZWxldGluZyBpdC4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGNhbiBub3QgYmUgdXNlZCB0byByZW1vdmUgYnVuZGxlZCBpbnN0cnVjdGlvbnMsIHVzZQorICAvLy8gcmVtb3ZlX2luc3RyIHRvIHJlbW92ZSBpbmRpdmlkdWFsIGluc3RydWN0aW9ucyBmcm9tIGEgYnVuZGxlLgorICBNYWNoaW5lSW5zdHIgKnJlbW92ZShNYWNoaW5lSW5zdHIgKkkpIHsKKyAgICBhc3NlcnQoIUktPmlzQnVuZGxlZCgpICYmICJDYW5ub3QgcmVtb3ZlIGJ1bmRsZWQgaW5zdHJ1Y3Rpb25zIik7CisgICAgcmV0dXJuIEluc3RzLnJlbW92ZShpbnN0cl9pdGVyYXRvcihJKSk7CisgIH0KKworICAvLy8gUmVtb3ZlIHRoZSBwb3NzaWJseSBidW5kbGVkIGluc3RydWN0aW9uIGZyb20gdGhlIGluc3RydWN0aW9uIGxpc3QKKyAgLy8vIHdpdGhvdXQgZGVsZXRpbmcgaXQuCisgIC8vLworICAvLy8gSWYgdGhlIGluc3RydWN0aW9uIGlzIHBhcnQgb2YgYSBidW5kbGUsIHRoZSBvdGhlciBpbnN0cnVjdGlvbnMgaW4gdGhlCisgIC8vLyBidW5kbGUgd2lsbCBzdGlsbCBiZSBidW5kbGVkIGFmdGVyIHJlbW92aW5nIHRoZSBzaW5nbGUgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ciAqcmVtb3ZlX2luc3RyKE1hY2hpbmVJbnN0ciAqSSk7CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBJbnN0cy5jbGVhcigpOworICB9CisKKyAgLy8vIFRha2UgYW4gaW5zdHJ1Y3Rpb24gZnJvbSBNQkIgJ090aGVyJyBhdCB0aGUgcG9zaXRpb24gRnJvbSwgYW5kIGluc2VydCBpdAorICAvLy8gaW50byB0aGlzIE1CQiByaWdodCBiZWZvcmUgJ1doZXJlJy4KKyAgLy8vCisgIC8vLyBJZiBGcm9tIHBvaW50cyB0byBhIGJ1bmRsZSBvZiBpbnN0cnVjdGlvbnMsIHRoZSB3aG9sZSBidW5kbGUgaXMgbW92ZWQuCisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIFdoZXJlLCBNYWNoaW5lQmFzaWNCbG9jayAqT3RoZXIsIGl0ZXJhdG9yIEZyb20pIHsKKyAgICAvLyBUaGUgcmFuZ2Ugc3BsaWNlKCkgZG9lc24ndCBhbGxvdyBub29wIG1vdmVzLCBidXQgdGhpcyBvbmUgZG9lcy4KKyAgICBpZiAoV2hlcmUgIT0gRnJvbSkKKyAgICAgIHNwbGljZShXaGVyZSwgT3RoZXIsIEZyb20sIHN0ZDo6bmV4dChGcm9tKSk7CisgIH0KKworICAvLy8gVGFrZSBhIGJsb2NrIG9mIGluc3RydWN0aW9ucyBmcm9tIE1CQiAnT3RoZXInIGluIHRoZSByYW5nZSBbRnJvbSwgVG8pLAorICAvLy8gYW5kIGluc2VydCB0aGVtIGludG8gdGhpcyBNQkIgcmlnaHQgYmVmb3JlICdXaGVyZScuCisgIC8vLworICAvLy8gVGhlIGluc3RydWN0aW9uIGF0ICdXaGVyZScgbXVzdCBub3QgYmUgaW5jbHVkZWQgaW4gdGhlIHJhbmdlIG9mCisgIC8vLyBpbnN0cnVjdGlvbnMgdG8gbW92ZS4KKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgV2hlcmUsIE1hY2hpbmVCYXNpY0Jsb2NrICpPdGhlciwKKyAgICAgICAgICAgICAgaXRlcmF0b3IgRnJvbSwgaXRlcmF0b3IgVG8pIHsKKyAgICBJbnN0cy5zcGxpY2UoV2hlcmUuZ2V0SW5zdHJJdGVyYXRvcigpLCBPdGhlci0+SW5zdHMsCisgICAgICAgICAgICAgICAgIEZyb20uZ2V0SW5zdHJJdGVyYXRvcigpLCBUby5nZXRJbnN0ckl0ZXJhdG9yKCkpOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIHVubGlua3MgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcgZnVuY3Rpb24sIGFuZCByZXR1cm5zIGl0LAorICAvLy8gYnV0IGRvZXMgbm90IGRlbGV0ZSBpdC4KKyAgTWFjaGluZUJhc2ljQmxvY2sgKnJlbW92ZUZyb21QYXJlbnQoKTsKKworICAvLy8gVGhpcyBtZXRob2QgdW5saW5rcyAndGhpcycgZnJvbSB0aGUgY29udGFpbmluZyBmdW5jdGlvbiBhbmQgZGVsZXRlcyBpdC4KKyAgdm9pZCBlcmFzZUZyb21QYXJlbnQoKTsKKworICAvLy8gR2l2ZW4gYSBtYWNoaW5lIGJhc2ljIGJsb2NrIHRoYXQgYnJhbmNoZWQgdG8gJ09sZCcsIGNoYW5nZSB0aGUgY29kZSBhbmQKKyAgLy8vIENGRyBzbyB0aGF0IGl0IGJyYW5jaGVzIHRvICdOZXcnIGluc3RlYWQuCisgIHZvaWQgUmVwbGFjZVVzZXNPZkJsb2NrV2l0aChNYWNoaW5lQmFzaWNCbG9jayAqT2xkLCBNYWNoaW5lQmFzaWNCbG9jayAqTmV3KTsKKworICAvLy8gVmFyaW91cyBwaWVjZXMgb2YgY29kZSBjYW4gY2F1c2UgZXhjZXNzIGVkZ2VzIGluIHRoZSBDRkcgdG8gYmUgaW5zZXJ0ZWQuCisgIC8vLyBJZiB3ZSBoYXZlIHByb3ZlbiB0aGF0IE1CQiBjYW4gb25seSBicmFuY2ggdG8gRGVzdEEgYW5kIERlc3RCLCByZW1vdmUgYW55CisgIC8vLyBvdGhlciBNQkIgc3VjY2Vzc29ycyBmcm9tIHRoZSBDRkcuIERlc3RBIGFuZCBEZXN0QiBjYW4gYmUgbnVsbC4gQmVzaWRlcworICAvLy8gRGVzdEEgYW5kIERlc3RCLCByZXRhaW4gb3RoZXIgZWRnZXMgbGVhZGluZyB0byBMYW5kaW5nUGFkcyAoY3VycmVudGx5CisgIC8vLyB0aGVyZSBjYW4gYmUgb25seSBvbmU7IHdlIGRvbid0IGNoZWNrIG9yIHJlcXVpcmUgdGhhdCBoZXJlKS4gTm90ZSBpdCBpcworICAvLy8gcG9zc2libGUgdGhhdCBEZXN0QSBhbmQvb3IgRGVzdEIgYXJlIExhbmRpbmdQYWRzLgorICBib29sIENvcnJlY3RFeHRyYUNGR0VkZ2VzKE1hY2hpbmVCYXNpY0Jsb2NrICpEZXN0QSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRGVzdEIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0NvbmQpOworCisgIC8vLyBGaW5kIHRoZSBuZXh0IHZhbGlkIERlYnVnTG9jIHN0YXJ0aW5nIGF0IE1CQkksIHNraXBwaW5nIGFueSBEQkdfVkFMVUUKKyAgLy8vIGluc3RydWN0aW9ucy4gIFJldHVybiBVbmtub3duTG9jIGlmIHRoZXJlIGlzIG5vbmUuCisgIERlYnVnTG9jIGZpbmREZWJ1Z0xvYyhpbnN0cl9pdGVyYXRvciBNQkJJKTsKKyAgRGVidWdMb2MgZmluZERlYnVnTG9jKGl0ZXJhdG9yIE1CQkkpIHsKKyAgICByZXR1cm4gZmluZERlYnVnTG9jKE1CQkkuZ2V0SW5zdHJJdGVyYXRvcigpKTsKKyAgfQorCisgIC8vLyBGaW5kIHRoZSBwcmV2aW91cyB2YWxpZCBEZWJ1Z0xvYyBwcmVjZWRpbmcgTUJCSSwgc2tpcHBpbmcgYW5kIERCR19WQUxVRQorICAvLy8gaW5zdHJ1Y3Rpb25zLiAgUmV0dXJuIFVua25vd25Mb2MgaWYgdGhlcmUgaXMgbm9uZS4KKyAgRGVidWdMb2MgZmluZFByZXZEZWJ1Z0xvYyhpbnN0cl9pdGVyYXRvciBNQkJJKTsKKyAgRGVidWdMb2MgZmluZFByZXZEZWJ1Z0xvYyhpdGVyYXRvciBNQkJJKSB7CisgICAgcmV0dXJuIGZpbmRQcmV2RGVidWdMb2MoTUJCSS5nZXRJbnN0ckl0ZXJhdG9yKCkpOworICB9CisKKyAgLy8vIEZpbmQgYW5kIHJldHVybiB0aGUgbWVyZ2VkIERlYnVnTG9jIG9mIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb25zIG9mIHRoZQorICAvLy8gYmxvY2suIFJldHVybiBVbmtub3duTG9jIGlmIHRoZXJlIGlzIG5vbmUuCisgIERlYnVnTG9jIGZpbmRCcmFuY2hEZWJ1Z0xvYygpOworCisgIC8vLyBQb3NzaWJsZSBvdXRjb21lIG9mIGEgcmVnaXN0ZXIgbGl2ZW5lc3MgcXVlcnkgdG8gY29tcHV0ZVJlZ2lzdGVyTGl2ZW5lc3MoKQorICBlbnVtIExpdmVuZXNzUXVlcnlSZXN1bHQgeworICAgIExRUl9MaXZlLCAgIC8vLzwgUmVnaXN0ZXIgaXMga25vd24gdG8gYmUgKGF0IGxlYXN0IHBhcnRpYWxseSkgbGl2ZS4KKyAgICBMUVJfRGVhZCwgICAvLy88IFJlZ2lzdGVyIGlzIGtub3duIHRvIGJlIGZ1bGx5IGRlYWQuCisgICAgTFFSX1Vua25vd24gLy8vPCBSZWdpc3RlciBsaXZlbmVzcyBub3QgZGVjaWRhYmxlIGZyb20gbG9jYWwgbmVpZ2hib3Job29kLgorICB9OworCisgIC8vLyBSZXR1cm4gd2hldGhlciAocGh5c2ljYWwpIHJlZ2lzdGVyIFxwIFJlZyBoYXMgYmVlbiBkZWZpbmVkIGFuZCBub3QKKyAgLy8vIGtpbGxlZCBhcyBvZiBqdXN0IGJlZm9yZSBccCBCZWZvcmUuCisgIC8vLworICAvLy8gU2VhcmNoIGlzIGxvY2FsaXNlZCB0byBhIG5laWdoYm9yaG9vZCBvZiBccCBOZWlnaGJvcmhvb2QgaW5zdHJ1Y3Rpb25zCisgIC8vLyBiZWZvcmUgKHNlYXJjaGluZyBmb3IgZGVmcyBvciBraWxscykgYW5kIFxwIE5laWdoYm9yaG9vZCBpbnN0cnVjdGlvbnMKKyAgLy8vIGFmdGVyIChzZWFyY2hpbmcganVzdCBmb3IgZGVmcykgXHAgQmVmb3JlLgorICAvLy8KKyAgLy8vIFxwIFJlZyBtdXN0IGJlIGEgcGh5c2ljYWwgcmVnaXN0ZXIuCisgIExpdmVuZXNzUXVlcnlSZXN1bHQgY29tcHV0ZVJlZ2lzdGVyTGl2ZW5lc3MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2l0ZXJhdG9yIEJlZm9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOZWlnaGJvcmhvb2QgPSAxMCkgY29uc3Q7CisKKyAgLy8gRGVidWdnaW5nIG1ldGhvZHMuCisgIHZvaWQgZHVtcCgpIGNvbnN0OworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgU2xvdEluZGV4ZXMgKiA9IG51bGxwdHIsCisgICAgICAgICAgICAgYm9vbCBJc1N0YW5kYWxvbmUgPSB0cnVlKSBjb25zdDsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIE1vZHVsZVNsb3RUcmFja2VyICZNU1QsCisgICAgICAgICAgICAgY29uc3QgU2xvdEluZGV4ZXMgKiA9IG51bGxwdHIsIGJvb2wgSXNTdGFuZGFsb25lID0gdHJ1ZSkgY29uc3Q7CisKKyAgLy8gUHJpbnRpbmcgbWV0aG9kIHVzZWQgYnkgTG9vcEluZm8uCisgIHZvaWQgcHJpbnRBc09wZXJhbmQocmF3X29zdHJlYW0gJk9TLCBib29sIFByaW50VHlwZSA9IHRydWUpIGNvbnN0OworCisgIC8vLyBNYWNoaW5lQmFzaWNCbG9ja3MgYXJlIHVuaXF1ZWx5IG51bWJlcmVkIGF0IHRoZSBmdW5jdGlvbiBsZXZlbCwgdW5sZXNzCisgIC8vLyB0aGV5J3JlIG5vdCBpbiBhIE1hY2hpbmVGdW5jdGlvbiB5ZXQsIGluIHdoaWNoIGNhc2UgdGhpcyB3aWxsIHJldHVybiAtMS4KKyAgaW50IGdldE51bWJlcigpIGNvbnN0IHsgcmV0dXJuIE51bWJlcjsgfQorICB2b2lkIHNldE51bWJlcihpbnQgTikgeyBOdW1iZXIgPSBOOyB9CisKKyAgLy8vIFJldHVybiB0aGUgTUNTeW1ib2wgZm9yIHRoaXMgYmFzaWMgYmxvY2suCisgIE1DU3ltYm9sICpnZXRTeW1ib2woKSBjb25zdDsKKworICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0SXJyTG9vcEhlYWRlcldlaWdodCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSXJyTG9vcEhlYWRlcldlaWdodDsKKyAgfQorCisgIHZvaWQgc2V0SXJyTG9vcEhlYWRlcldlaWdodCh1aW50NjRfdCBXZWlnaHQpIHsKKyAgICBJcnJMb29wSGVhZGVyV2VpZ2h0ID0gV2VpZ2h0OworICB9CisKK3ByaXZhdGU6CisgIC8vLyBSZXR1cm4gcHJvYmFiaWxpdHkgaXRlcmF0b3IgY29ycmVzcG9uZGluZyB0byB0aGUgSSBzdWNjZXNzb3IgaXRlcmF0b3IuCisgIHByb2JhYmlsaXR5X2l0ZXJhdG9yIGdldFByb2JhYmlsaXR5SXRlcmF0b3Ioc3VjY19pdGVyYXRvciBJKTsKKyAgY29uc3RfcHJvYmFiaWxpdHlfaXRlcmF0b3IKKyAgZ2V0UHJvYmFiaWxpdHlJdGVyYXRvcihjb25zdF9zdWNjX2l0ZXJhdG9yIEkpIGNvbnN0OworCisgIGZyaWVuZCBjbGFzcyBNYWNoaW5lQnJhbmNoUHJvYmFiaWxpdHlJbmZvOworICBmcmllbmQgY2xhc3MgTUlQcmludGVyOworCisgIC8vLyBSZXR1cm4gcHJvYmFiaWxpdHkgb2YgdGhlIGVkZ2UgZnJvbSB0aGlzIGJsb2NrIHRvIE1CQi4gVGhpcyBtZXRob2Qgc2hvdWxkCisgIC8vLyBOT1QgYmUgY2FsbGVkIGRpcmVjdGx5LCBidXQgYnkgdXNpbmcgZ2V0RWRnZVByb2JhYmlsaXR5IG1ldGhvZCBmcm9tCisgIC8vLyBNYWNoaW5lQnJhbmNoUHJvYmFiaWxpdHlJbmZvIGNsYXNzLgorICBCcmFuY2hQcm9iYWJpbGl0eSBnZXRTdWNjUHJvYmFiaWxpdHkoY29uc3Rfc3VjY19pdGVyYXRvciBTdWNjKSBjb25zdDsKKworICAvLyBNZXRob2RzIHVzZWQgdG8gbWFpbnRhaW4gZG91Ymx5IGxpbmtlZCBsaXN0IG9mIGJsb2Nrcy4uLgorICBmcmllbmQgc3RydWN0IGlsaXN0X2NhbGxiYWNrX3RyYWl0czxNYWNoaW5lQmFzaWNCbG9jaz47CisKKyAgLy8gTWFjaGluZS1DRkcgbXV0YXRvcnMKKworICAvLy8gQWRkIFByZWQgYXMgYSBwcmVkZWNlc3NvciBvZiB0aGlzIE1hY2hpbmVCYXNpY0Jsb2NrLiBEb24ndCBkbyB0aGlzCisgIC8vLyB1bmxlc3MgeW91IGtub3cgd2hhdCB5b3UncmUgZG9pbmcsIGJlY2F1c2UgaXQgZG9lc24ndCB1cGRhdGUgUHJlZCdzCisgIC8vLyBzdWNjZXNzb3JzIGxpc3QuIFVzZSBQcmVkLT5hZGRTdWNjZXNzb3IgaW5zdGVhZC4KKyAgdm9pZCBhZGRQcmVkZWNlc3NvcihNYWNoaW5lQmFzaWNCbG9jayAqUHJlZCk7CisKKyAgLy8vIFJlbW92ZSBQcmVkIGFzIGEgcHJlZGVjZXNzb3Igb2YgdGhpcyBNYWNoaW5lQmFzaWNCbG9jay4gRG9uJ3QgZG8gdGhpcworICAvLy8gdW5sZXNzIHlvdSBrbm93IHdoYXQgeW91J3JlIGRvaW5nLCBiZWNhdXNlIGl0IGRvZXNuJ3QgdXBkYXRlIFByZWQncworICAvLy8gc3VjY2Vzc29ycyBsaXN0LiBVc2UgUHJlZC0+cmVtb3ZlU3VjY2Vzc29yIGluc3RlYWQuCisgIHZvaWQgcmVtb3ZlUHJlZGVjZXNzb3IoTWFjaGluZUJhc2ljQmxvY2sgKlByZWQpOworfTsKKworcmF3X29zdHJlYW0mIG9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKTsKKworLy8vIFByaW50cyBhIG1hY2hpbmUgYmFzaWMgYmxvY2sgcmVmZXJlbmNlLgorLy8vCisvLy8gVGhlIGZvcm1hdCBpczoKKy8vLyAgICViYi41ICAgICAgICAgICAtIGEgbWFjaGluZSBiYXNpYyBibG9jayB3aXRoIE1CQi5nZXROdW1iZXIoKSA9PSA1LgorLy8vCisvLy8gVXNhZ2U6IE9TIDw8IHByaW50TUJCUmVmZXJlbmNlKE1CQikgPDwgJ1xuJzsKK1ByaW50YWJsZSBwcmludE1CQlJlZmVyZW5jZShjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKTsKKworLy8gVGhpcyBpcyB1c2VmdWwgd2hlbiBidWlsZGluZyBJbmRleGVkTWFwcyBrZXllZCBvbiBiYXNpYyBibG9jayBwb2ludGVycy4KK3N0cnVjdCBNQkIyTnVtYmVyRnVuY3RvciB7CisgIHVzaW5nIGFyZ3VtZW50X3R5cGUgPSBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqOworICB1bnNpZ25lZCBvcGVyYXRvcigpKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIGNvbnN0IHsKKyAgICByZXR1cm4gTUJCLT5nZXROdW1iZXIoKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBHcmFwaFRyYWl0cyBzcGVjaWFsaXphdGlvbnMgZm9yIG1hY2hpbmUgYmFzaWMgYmxvY2sgZ3JhcGhzIChtYWNoaW5lLUNGR3MpCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gUHJvdmlkZSBzcGVjaWFsaXphdGlvbnMgb2YgR3JhcGhUcmFpdHMgdG8gYmUgYWJsZSB0byB0cmVhdCBhCisvLyBNYWNoaW5lRnVuY3Rpb24gYXMgYSBncmFwaCBvZiBNYWNoaW5lQmFzaWNCbG9ja3MuCisvLworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8TWFjaGluZUJhc2ljQmxvY2sgKj4geworICB1c2luZyBOb2RlUmVmID0gTWFjaGluZUJhc2ljQmxvY2sgKjsKKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSBNYWNoaW5lQmFzaWNCbG9jazo6c3VjY19pdGVyYXRvcjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoTWFjaGluZUJhc2ljQmxvY2sgKkJCKSB7IHJldHVybiBCQjsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7IHJldHVybiBOLT5zdWNjX2JlZ2luKCk7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPnN1Y2NfZW5kKCk7IH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqPiB7CisgIHVzaW5nIE5vZGVSZWYgPSBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqOworICB1c2luZyBDaGlsZEl0ZXJhdG9yVHlwZSA9IE1hY2hpbmVCYXNpY0Jsb2NrOjpjb25zdF9zdWNjX2l0ZXJhdG9yOworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqQkIpIHsgcmV0dXJuIEJCOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPnN1Y2NfYmVnaW4oKTsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+c3VjY19lbmQoKTsgfQorfTsKKworLy8gUHJvdmlkZSBzcGVjaWFsaXphdGlvbnMgb2YgR3JhcGhUcmFpdHMgdG8gYmUgYWJsZSB0byB0cmVhdCBhCisvLyBNYWNoaW5lRnVuY3Rpb24gYXMgYSBncmFwaCBvZiBNYWNoaW5lQmFzaWNCbG9ja3MgYW5kIHRvIHdhbGsgaXQKKy8vIGluIGludmVyc2Ugb3JkZXIuICBJbnZlcnNlIG9yZGVyIGZvciBhIGZ1bmN0aW9uIGlzIGNvbnNpZGVyZWQKKy8vIHRvIGJlIHdoZW4gdHJhdmVyc2luZyB0aGUgcHJlZGVjZXNzb3IgZWRnZXMgb2YgYSBNQkIKKy8vIGluc3RlYWQgb2YgdGhlIHN1Y2Nlc3NvciBlZGdlcy4KKy8vCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8SW52ZXJzZTxNYWNoaW5lQmFzaWNCbG9jayo+PiB7CisgIHVzaW5nIE5vZGVSZWYgPSBNYWNoaW5lQmFzaWNCbG9jayAqOworICB1c2luZyBDaGlsZEl0ZXJhdG9yVHlwZSA9IE1hY2hpbmVCYXNpY0Jsb2NrOjpwcmVkX2l0ZXJhdG9yOworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShJbnZlcnNlPE1hY2hpbmVCYXNpY0Jsb2NrICo+IEcpIHsKKyAgICByZXR1cm4gRy5HcmFwaDsKKyAgfQorCisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPnByZWRfYmVnaW4oKTsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+cHJlZF9lbmQoKTsgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPEludmVyc2U8Y29uc3QgTWFjaGluZUJhc2ljQmxvY2sqPj4geworICB1c2luZyBOb2RlUmVmID0gY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKjsKKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSBNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfcHJlZF9pdGVyYXRvcjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoSW52ZXJzZTxjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqPiBHKSB7CisgICAgcmV0dXJuIEcuR3JhcGg7CisgIH0KKworICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7IHJldHVybiBOLT5wcmVkX2JlZ2luKCk7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPnByZWRfZW5kKCk7IH0KK307CisKKy8vLyBNYWNoaW5lSW5zdHJTcGFuIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byBnZXQgYW4gaXRlcmF0aW9uIHJhbmdlCisvLy8gY29udGFpbmluZyB0aGUgaW5zdHJ1Y3Rpb24gaXQgd2FzIGluaXRpYWxpemVkIHdpdGgsIGFsb25nIHdpdGggYWxsCisvLy8gdGhvc2UgaW5zdHJ1Y3Rpb25zIGluc2VydGVkIHByaW9yIHRvIG9yIGZvbGxvd2luZyB0aGF0IGluc3RydWN0aW9uCisvLy8gYXQgc29tZSBwb2ludCBhZnRlciB0aGUgTWFjaGluZUluc3RyU3BhbiBpcyBjb25zdHJ1Y3RlZC4KK2NsYXNzIE1hY2hpbmVJbnN0clNwYW4geworICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCOworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwgQiwgRTsKKworcHVibGljOgorICBNYWNoaW5lSW5zdHJTcGFuKE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJKQorICAgIDogTUJCKCpJLT5nZXRQYXJlbnQoKSksCisgICAgICBJKEkpLAorICAgICAgQihJID09IE1CQi5iZWdpbigpID8gTUJCLmVuZCgpIDogc3RkOjpwcmV2KEkpKSwKKyAgICAgIEUoc3RkOjpuZXh0KEkpKSB7fQorCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBiZWdpbigpIHsKKyAgICByZXR1cm4gQiA9PSBNQkIuZW5kKCkgPyBNQkIuYmVnaW4oKSA6IHN0ZDo6bmV4dChCKTsKKyAgfQorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gRTsgfQorICBib29sIGVtcHR5KCkgeyByZXR1cm4gYmVnaW4oKSA9PSBlbmQoKTsgfQorCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBnZXRJbml0aWFsKCkgeyByZXR1cm4gSTsgfQorfTsKKworLy8vIEluY3JlbWVudCBccCBJdCB1bnRpbCBpdCBwb2ludHMgdG8gYSBub24tZGVidWcgaW5zdHJ1Y3Rpb24gb3IgdG8gXHAgRW5kCisvLy8gYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIGl0ZXJhdG9yLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQKKy8vLyBNYWNoaW5lQmFzaWNCbG9jazo6e2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvciwgaW5zdHJfaXRlcmF0b3IsCisvLy8gY29uc3RfaW5zdHJfaXRlcmF0b3J9IGFuZCB0aGUgcmVzcGVjdGl2ZSByZXZlcnNlIGl0ZXJhdG9ycy4KK3RlbXBsYXRlPHR5cGVuYW1lIEl0ZXJUPgoraW5saW5lIEl0ZXJUIHNraXBEZWJ1Z0luc3RydWN0aW9uc0ZvcndhcmQoSXRlclQgSXQsIEl0ZXJUIEVuZCkgeworICB3aGlsZSAoSXQgIT0gRW5kICYmIEl0LT5pc0RlYnVnVmFsdWUoKSkKKyAgICBJdCsrOworICByZXR1cm4gSXQ7Cit9CisKKy8vLyBEZWNyZW1lbnQgXHAgSXQgdW50aWwgaXQgcG9pbnRzIHRvIGEgbm9uLWRlYnVnIGluc3RydWN0aW9uIG9yIHRvIFxwIEJlZ2luCisvLy8gYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIGl0ZXJhdG9yLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQKKy8vLyBNYWNoaW5lQmFzaWNCbG9jazo6e2l0ZXJhdG9yLCBjb25zdF9pdGVyYXRvciwgaW5zdHJfaXRlcmF0b3IsCisvLy8gY29uc3RfaW5zdHJfaXRlcmF0b3J9IGFuZCB0aGUgcmVzcGVjdGl2ZSByZXZlcnNlIGl0ZXJhdG9ycy4KK3RlbXBsYXRlPGNsYXNzIEl0ZXJUPgoraW5saW5lIEl0ZXJUIHNraXBEZWJ1Z0luc3RydWN0aW9uc0JhY2t3YXJkKEl0ZXJUIEl0LCBJdGVyVCBCZWdpbikgeworICB3aGlsZSAoSXQgIT0gQmVnaW4gJiYgSXQtPmlzRGVidWdWYWx1ZSgpKQorICAgIEl0LS07CisgIHJldHVybiBJdDsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9NQUNISU5FQkFTSUNCTE9DS19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjRiOTljCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8uaApAQCAtMCwwICsxLDg1IEBACisvLz09PS0gTWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mby5oIC0gTUJCIEZyZXF1ZW5jeSBBbmFseXNpcyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvb3BzIHNob3VsZCBiZSBzaW1wbGlmaWVkIGJlZm9yZSB0aGlzIGFuYWx5c2lzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVCTE9DS0ZSRVFVRU5DWUlORk9fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORUJMT0NLRlJFUVVFTkNZSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Jsb2NrRnJlcXVlbmN5LmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPGNsYXNzIEJsb2NrVD4gY2xhc3MgQmxvY2tGcmVxdWVuY3lJbmZvSW1wbDsKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworY2xhc3MgTWFjaGluZUJyYW5jaFByb2JhYmlsaXR5SW5mbzsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVMb29wSW5mbzsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gTWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mbyBwYXNzIHVzZXMgQmxvY2tGcmVxdWVuY3lJbmZvSW1wbCBpbXBsZW1lbnRhdGlvbgorLy8vIHRvIGVzdGltYXRlIG1hY2hpbmUgYmFzaWMgYmxvY2sgZnJlcXVlbmNpZXMuCitjbGFzcyBNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICB1c2luZyBJbXBsVHlwZSA9IEJsb2NrRnJlcXVlbmN5SW5mb0ltcGw8TWFjaGluZUJhc2ljQmxvY2s+OworICBzdGQ6OnVuaXF1ZV9wdHI8SW1wbFR5cGU+IE1CRkk7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgTWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mbygpOworICB+TWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mbygpIG92ZXJyaWRlOworCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworCisgIC8vLyBjYWxjdWxhdGUgLSBjb21wdXRlIGJsb2NrIGZyZXF1ZW5jeSBpbmZvIGZvciB0aGUgZ2l2ZW4gZnVuY3Rpb24uCisgIHZvaWQgY2FsY3VsYXRlKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmRiwKKyAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJyYW5jaFByb2JhYmlsaXR5SW5mbyAmTUJQSSwKKyAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUxvb3BJbmZvICZNTEkpOworCisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlOworCisgIC8vLyBnZXRibG9ja0ZyZXEgLSBSZXR1cm4gYmxvY2sgZnJlcXVlbmN5LiBSZXR1cm4gMCBpZiB3ZSBkb24ndCBoYXZlIHRoZQorICAvLy8gaW5mb3JtYXRpb24uIFBsZWFzZSBub3RlIHRoYXQgaW5pdGlhbCBmcmVxdWVuY3kgaXMgZXF1YWwgdG8gMTAyNC4gSXQgbWVhbnMKKyAgLy8vIHRoYXQgd2Ugc2hvdWxkIG5vdCByZWx5IG9uIHRoZSB2YWx1ZSBpdHNlbGYsIGJ1dCBvbmx5IG9uIHRoZSBjb21wYXJpc29uIHRvCisgIC8vLyB0aGUgb3RoZXIgYmxvY2sgZnJlcXVlbmNpZXMuIFdlIGRvIHRoaXMgdG8gYXZvaWQgdXNpbmcgb2YgZmxvYXRpbmcgcG9pbnRzLgorICAvLy8KKyAgQmxvY2tGcmVxdWVuY3kgZ2V0QmxvY2tGcmVxKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIGNvbnN0OworCisgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRCbG9ja1Byb2ZpbGVDb3VudChjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdDsKKyAgT3B0aW9uYWw8dWludDY0X3Q+IGdldFByb2ZpbGVDb3VudEZyb21GcmVxKHVpbnQ2NF90IEZyZXEpIGNvbnN0OworCisgIGJvb2wgaXNJcnJMb29wSGVhZGVyKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpOworCisgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqZ2V0RnVuY3Rpb24oKSBjb25zdDsKKyAgY29uc3QgTWFjaGluZUJyYW5jaFByb2JhYmlsaXR5SW5mbyAqZ2V0TUJQSSgpIGNvbnN0OworICB2b2lkIHZpZXcoY29uc3QgVHdpbmUgJk5hbWUsIGJvb2wgaXNTaW1wbGUgPSB0cnVlKSBjb25zdDsKKworICAvLyBQcmludCB0aGUgYmxvY2sgZnJlcXVlbmN5IEZyZXEgdG8gT1MgdXNpbmcgdGhlIGN1cnJlbnQgZnVuY3Rpb25zIGVudHJ5CisgIC8vIGZyZXF1ZW5jeSB0byBjb252ZXJ0IGZyZXEgaW50byBhIHJlbGF0aXZlIGRlY2ltYWwgZm9ybS4KKyAgcmF3X29zdHJlYW0gJnByaW50QmxvY2tGcmVxKHJhd19vc3RyZWFtICZPUywgY29uc3QgQmxvY2tGcmVxdWVuY3kgRnJlcSkgY29uc3Q7CisKKyAgLy8gQ29udmVuaWVuY2UgbWV0aG9kIHRoYXQgYXR0ZW1wdHMgdG8gbG9vayB1cCB0aGUgZnJlcXVlbmN5IGFzc29jaWF0ZWQgd2l0aAorICAvLyBCQiBhbmQgcHJpbnQgaXQgdG8gT1MuCisgIHJhd19vc3RyZWFtICZwcmludEJsb2NrRnJlcShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdDsKKworICB1aW50NjRfdCBnZXRFbnRyeUZyZXEoKSBjb25zdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTUFDSElORUJMT0NLRlJFUVVFTkNZSU5GT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUJyYW5jaFByb2JhYmlsaXR5SW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVCcmFuY2hQcm9iYWJpbGl0eUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWIwNTI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVCcmFuY2hQcm9iYWJpbGl0eUluZm8uaApAQCAtMCwwICsxLDc3IEBACisvLz0tIE1hY2hpbmVCcmFuY2hQcm9iYWJpbGl0eUluZm8uaCAtIEJyYW5jaCBQcm9iYWJpbGl0eSBBbmFseXNpcyAtKi0gQysrIC0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBpcyB1c2VkIHRvIGV2YWx1YXRlIGJyYW5jaCBwcm9iYWJpbHRpZXMgb24gbWFjaGluZSBiYXNpYyBibG9ja3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORUJSQU5DSFBST0JBQklMSVRZSU5GT19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FQlJBTkNIUFJPQkFCSUxJVFlJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CcmFuY2hQcm9iYWJpbGl0eS5oIgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8bnVtZXJpYz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lQnJhbmNoUHJvYmFiaWxpdHlJbmZvIDogcHVibGljIEltbXV0YWJsZVBhc3MgeworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKKyAgLy8gRGVmYXVsdCB3ZWlnaHQgdmFsdWUuIFVzZWQgd2hlbiB3ZSBkb24ndCBoYXZlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlZGdlLgorICAvLyBUT0RPOiBERUZBVUxUX1dFSUdIVCBtYWtlcyBzZW5zZSBkdXJpbmcgc3RhdGljIHByZWRpY2F0aW9uLCB3aGVuIG5vbmUgb2YKKyAgLy8gdGhlIHN1Y2Nlc3NvcnMgaGF2ZSBhIHdlaWdodCB5ZXQuIEJ1dCBpdCBkb2Vzbid0IG1ha2Ugc2Vuc2Ugd2hlbiBwcm92aWRpbmcKKyAgLy8gd2VpZ2h0IHRvIGFuIGVkZ2UgdGhhdCBtYXkgaGF2ZSBzaWJsaW5ncyB3aXRoIG5vbi16ZXJvIHdlaWdodHMuIFRoaXMgY2FuCisgIC8vIGJlIGhhbmRsZWQgdmFyaW91cyB3YXlzLCBidXQgaXQncyBwcm9iYWJseSBmaW5lIGZvciBhbiBlZGdlIHdpdGggdW5rbm93bgorICAvLyB3ZWlnaHQgdG8ganVzdCAiaW5oZXJpdCIgdGhlIG5vbi16ZXJvIHdlaWdodCBvZiBhbiBhZGphY2VudCBzdWNjZXNzb3IuCisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBERUZBVUxUX1dFSUdIVCA9IDE2OworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIE1hY2hpbmVCcmFuY2hQcm9iYWJpbGl0eUluZm8oKSA6IEltbXV0YWJsZVBhc3MoSUQpIHsKKyAgICBQYXNzUmVnaXN0cnkgJlJlZ2lzdHJ5ID0gKlBhc3NSZWdpc3RyeTo6Z2V0UGFzc1JlZ2lzdHJ5KCk7CisgICAgaW5pdGlhbGl6ZU1hY2hpbmVCcmFuY2hQcm9iYWJpbGl0eUluZm9QYXNzKFJlZ2lzdHJ5KTsKKyAgfQorCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIEFVLnNldFByZXNlcnZlc0FsbCgpOworICB9CisKKyAgLy8gUmV0dXJuIGVkZ2UgcHJvYmFiaWxpdHkuCisgIEJyYW5jaFByb2JhYmlsaXR5IGdldEVkZ2VQcm9iYWJpbGl0eShjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKkRzdCkgY29uc3Q7CisKKyAgLy8gU2FtZSBhcyBhYm92ZSwgYnV0IHVzaW5nIGEgY29uc3Rfc3VjY19pdGVyYXRvciBmcm9tIFNyYy4gVGhpcyBpcyBmYXN0ZXIKKyAgLy8gd2hlbiB0aGUgaXRlcmF0b3IgaXMgYWxyZWFkeSBhdmFpbGFibGUuCisgIEJyYW5jaFByb2JhYmlsaXR5CisgIGdldEVkZ2VQcm9iYWJpbGl0eShjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqU3JjLAorICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X3N1Y2NfaXRlcmF0b3IgRHN0KSBjb25zdDsKKworICAvLyBBICdIb3QnIGVkZ2UgaXMgYW4gZWRnZSB3aGljaCBwcm9iYWJpbGl0eSBpcyA+PSA4MCUuCisgIGJvb2wgaXNFZGdlSG90KGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpTcmMsCisgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpEc3QpIGNvbnN0OworCisgIC8vIFJldHVybiBhIGhvdCBzdWNjZXNzb3IgZm9yIHRoZSBibG9jayBCQiBvciBudWxsIGlmIHRoZXJlIGlzbid0IG9uZS4KKyAgLy8gTkI6IFRoaXMgcm91dGluZSdzIGNvbXBsZXhpdHkgaXMgbGluZWFyIG9uIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc29ycy4KKyAgTWFjaGluZUJhc2ljQmxvY2sgKmdldEhvdFN1Y2MoTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgY29uc3Q7CisKKyAgLy8gUHJpbnQgdmFsdWUgYmV0d2VlbiAwICgwJSBwcm9iYWJpbGl0eSkgYW5kIDEgKDEwMCUgcHJvYmFiaWxpdHkpLAorICAvLyBob3dldmVyIHRoZSB2YWx1ZSBpcyBuZXZlciBlcXVhbCB0byAwLCBhbmQgY2FuIGJlIDEgb25seSBpZmYgU1JDIGJsb2NrCisgIC8vIGhhcyBvbmx5IG9uZSBzdWNjZXNzb3IuCisgIHJhd19vc3RyZWFtICZwcmludEVkZ2VQcm9iYWJpbGl0eShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKkRzdCkgY29uc3Q7Cit9OworCit9CisKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUNvbWJpbmVyUGF0dGVybi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVDb21iaW5lclBhdHRlcm4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODY1MzVmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVDb21iaW5lclBhdHRlcm4uaApAQCAtMCwwICsxLDg3IEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9NYWNoaW5lQ29tYmluZXJQYXR0ZXJuLmggLSBJbnN0cnVjdGlvbiBwYXR0ZXJuIHN1cHBvcnRlZCBieQorLy8gY29tYmluZXIgIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGluc3RydWN0aW9uIHBhdHRlcm4gc3VwcG9ydGVkIGJ5IGNvbWJpbmVyCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORUNPTUJJTkVSUEFUVEVSTl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FQ09NQklORVJQQVRURVJOX0gKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gVGhlc2UgYXJlIGluc3RydWN0aW9uIHBhdHRlcm5zIG1hdGNoZWQgYnkgdGhlIG1hY2hpbmUgY29tYmluZXIgcGFzcy4KK2VudW0gY2xhc3MgTWFjaGluZUNvbWJpbmVyUGF0dGVybiB7CisgIC8vIFRoZXNlIGFyZSBjb21tdXRhdGl2ZSB2YXJpYW50cyBmb3IgcmVhc3NvY2lhdGluZyBhIGNvbXB1dGF0aW9uIGNoYWluLiBTZWUKKyAgLy8gdGhlIGNvbW1lbnRzIGJlZm9yZSBnZXRNYWNoaW5lQ29tYmluZXJQYXR0ZXJucygpIGluIFRhcmdldEluc3RySW5mby5jcHAuCisgIFJFQVNTT0NfQVhfQlksCisgIFJFQVNTT0NfQVhfWUIsCisgIFJFQVNTT0NfWEFfQlksCisgIFJFQVNTT0NfWEFfWUIsCisKKyAgLy8gVGhlc2UgYXJlIG11bHRpcGx5LWFkZCBwYXR0ZXJucyBtYXRjaGVkIGJ5IHRoZSBBQXJjaDY0IG1hY2hpbmUgY29tYmluZXIuCisgIE1VTEFERFdfT1AxLAorICBNVUxBRERXX09QMiwKKyAgTVVMU1VCV19PUDEsCisgIE1VTFNVQldfT1AyLAorICBNVUxBRERXSV9PUDEsCisgIE1VTFNVQldJX09QMSwKKyAgTVVMQUREWF9PUDEsCisgIE1VTEFERFhfT1AyLAorICBNVUxTVUJYX09QMSwKKyAgTVVMU1VCWF9PUDIsCisgIE1VTEFERFhJX09QMSwKKyAgTVVMU1VCWElfT1AxLAorICAvLyBGbG9hdGluZyBQb2ludAorICBGTVVMQUREU19PUDEsCisgIEZNVUxBRERTX09QMiwKKyAgRk1VTFNVQlNfT1AxLAorICBGTVVMU1VCU19PUDIsCisgIEZNVUxBREREX09QMSwKKyAgRk1VTEFERERfT1AyLAorICBGTVVMU1VCRF9PUDEsCisgIEZNVUxTVUJEX09QMiwKKyAgRk5NVUxTVUJTX09QMSwKKyAgRk5NVUxTVUJEX09QMSwKKyAgRk1MQXYxaTMyX2luZGV4ZWRfT1AxLAorICBGTUxBdjFpMzJfaW5kZXhlZF9PUDIsCisgIEZNTEF2MWk2NF9pbmRleGVkX09QMSwKKyAgRk1MQXYxaTY0X2luZGV4ZWRfT1AyLAorICBGTUxBdjJmMzJfT1AyLAorICBGTUxBdjJmMzJfT1AxLAorICBGTUxBdjJmNjRfT1AxLAorICBGTUxBdjJmNjRfT1AyLAorICBGTUxBdjJpMzJfaW5kZXhlZF9PUDEsCisgIEZNTEF2MmkzMl9pbmRleGVkX09QMiwKKyAgRk1MQXYyaTY0X2luZGV4ZWRfT1AxLAorICBGTUxBdjJpNjRfaW5kZXhlZF9PUDIsCisgIEZNTEF2NGYzMl9PUDEsCisgIEZNTEF2NGYzMl9PUDIsCisgIEZNTEF2NGkzMl9pbmRleGVkX09QMSwKKyAgRk1MQXY0aTMyX2luZGV4ZWRfT1AyLAorICBGTUxTdjFpMzJfaW5kZXhlZF9PUDIsCisgIEZNTFN2MWk2NF9pbmRleGVkX09QMiwKKyAgRk1MU3YyZjMyX09QMSwKKyAgRk1MU3YyZjMyX09QMiwKKyAgRk1MU3YyZjY0X09QMSwKKyAgRk1MU3YyZjY0X09QMiwKKyAgRk1MU3YyaTMyX2luZGV4ZWRfT1AxLAorICBGTUxTdjJpMzJfaW5kZXhlZF9PUDIsCisgIEZNTFN2Mmk2NF9pbmRleGVkX09QMSwKKyAgRk1MU3YyaTY0X2luZGV4ZWRfT1AyLAorICBGTUxTdjRmMzJfT1AxLAorICBGTUxTdjRmMzJfT1AyLAorICBGTUxTdjRpMzJfaW5kZXhlZF9PUDEsCisgIEZNTFN2NGkzMl9pbmRleGVkX09QMgorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUNvbnN0YW50UG9vbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVDb25zdGFudFBvb2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzA1YTBmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVDb25zdGFudFBvb2wuaApAQCAtMCwwICsxLDE2NCBAQAorLy89PT0tIENvZGVHZW4vTWFjaGluZUNvbnN0YW50UG9vbC5oIC0gQWJzdHJhY3QgQ29uc3RhbnQgUG9vbCAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gQGZpbGUKKy8vLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIE1hY2hpbmVDb25zdGFudFBvb2wgY2xhc3Mgd2hpY2ggaXMgYW4gYWJzdHJhY3QKKy8vLyBjb25zdGFudCBwb29sIHRvIGtlZXAgdHJhY2sgb2YgY29uc3RhbnRzIHJlZmVyZW5jZWQgYnkgYSBmdW5jdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNISU5FQ09OU1RBTlRQT09MX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVDT05TVEFOVFBPT0xfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL01DL1NlY3Rpb25LaW5kLmgiCisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQ29uc3RhbnQ7CitjbGFzcyBEYXRhTGF5b3V0OworY2xhc3MgRm9sZGluZ1NldE5vZGVJRDsKK2NsYXNzIE1hY2hpbmVDb25zdGFudFBvb2w7CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFR5cGU7CisKKy8vLyBBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBhbGwgbWFjaGluZSBzcGVjaWZpYyBjb25zdGFudHBvb2wgdmFsdWUgc3ViY2xhc3Nlcy4KKy8vLworY2xhc3MgTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlIHsKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCisgIFR5cGUgKlR5OworCitwdWJsaWM6CisgIGV4cGxpY2l0IE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZShUeXBlICp0eSkgOiBUeSh0eSkge30KKyAgdmlydHVhbCB+TWFjaGluZUNvbnN0YW50UG9vbFZhbHVlKCkgPSBkZWZhdWx0OworCisgIC8vLyBnZXRUeXBlIC0gZ2V0IHR5cGUgb2YgdGhpcyBNYWNoaW5lQ29uc3RhbnRQb29sVmFsdWUuCisgIC8vLworICBUeXBlICpnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gVHk7IH0KKworICB2aXJ0dWFsIGludCBnZXRFeGlzdGluZ01hY2hpbmVDUFZhbHVlKE1hY2hpbmVDb25zdGFudFBvb2wgKkNQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCkgPSAwOworCisgIHZpcnR1YWwgdm9pZCBhZGRTZWxlY3Rpb25EQUdDU0VJZChGb2xkaW5nU2V0Tm9kZUlEICZJRCkgPSAwOworCisgIC8vLyBwcmludCAtIEltcGxlbWVudCBvcGVyYXRvcjw8CisgIHZpcnR1YWwgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTykgY29uc3QgPSAwOworfTsKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQ29uc3RhbnRQb29sVmFsdWUgJlYpIHsKKyAgVi5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKworLy8vIFRoaXMgY2xhc3MgaXMgYSBkYXRhIGNvbnRhaW5lciBmb3Igb25lIGVudHJ5IGluIGEgTWFjaGluZUNvbnN0YW50UG9vbC4KKy8vLyBJdCBjb250YWlucyBhIHBvaW50ZXIgdG8gdGhlIHZhbHVlIGFuZCBhbiBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YKKy8vLyB0aGUgY29uc3RhbnQgcG9vbC4KKy8vLyBAYnJpZWYgQW4gZW50cnkgaW4gYSBNYWNoaW5lQ29uc3RhbnRQb29sCitjbGFzcyBNYWNoaW5lQ29uc3RhbnRQb29sRW50cnkgeworcHVibGljOgorICAvLy8gVGhlIGNvbnN0YW50IGl0c2VsZi4KKyAgdW5pb24geworICAgIGNvbnN0IENvbnN0YW50ICpDb25zdFZhbDsKKyAgICBNYWNoaW5lQ29uc3RhbnRQb29sVmFsdWUgKk1hY2hpbmVDUFZhbDsKKyAgfSBWYWw7CisKKyAgLy8vIFRoZSByZXF1aXJlZCBhbGlnbm1lbnQgZm9yIHRoaXMgZW50cnkuIFRoZSB0b3AgYml0IGlzIHNldCB3aGVuIFZhbCBpcworICAvLy8gYSB0YXJnZXQgc3BlY2lmaWMgTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlLgorICB1bnNpZ25lZCBBbGlnbm1lbnQ7CisKKyAgTWFjaGluZUNvbnN0YW50UG9vbEVudHJ5KGNvbnN0IENvbnN0YW50ICpWLCB1bnNpZ25lZCBBKQorICAgIDogQWxpZ25tZW50KEEpIHsKKyAgICBWYWwuQ29uc3RWYWwgPSBWOworICB9CisKKyAgTWFjaGluZUNvbnN0YW50UG9vbEVudHJ5KE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZSAqViwgdW5zaWduZWQgQSkKKyAgICAgIDogQWxpZ25tZW50KEEpIHsKKyAgICBWYWwuTWFjaGluZUNQVmFsID0gVjsKKyAgICBBbGlnbm1lbnQgfD0gMVUgPDwgKHNpemVvZih1bnNpZ25lZCkgKiBDSEFSX0JJVCAtIDEpOworICB9CisKKyAgLy8vIGlzTWFjaGluZUNvbnN0YW50UG9vbEVudHJ5IC0gUmV0dXJuIHRydWUgaWYgdGhlIE1hY2hpbmVDb25zdGFudFBvb2xFbnRyeQorICAvLy8gaXMgaW5kZWVkIGEgdGFyZ2V0IHNwZWNpZmljIGNvbnN0YW50cG9vbCBlbnRyeSwgbm90IGEgd3JhcHBlciBvdmVyIGEKKyAgLy8vIENvbnN0YW50LgorICBib29sIGlzTWFjaGluZUNvbnN0YW50UG9vbEVudHJ5KCkgY29uc3QgeworICAgIHJldHVybiAoaW50KUFsaWdubWVudCA8IDA7CisgIH0KKworICBpbnQgZ2V0QWxpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBBbGlnbm1lbnQgJiB+KDEgPDwgKHNpemVvZih1bnNpZ25lZCkgKiBDSEFSX0JJVCAtIDEpKTsKKyAgfQorCisgIFR5cGUgKmdldFR5cGUoKSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2QgY2xhc3NpZmllcyB0aGUgZW50cnkgYWNjb3JkaW5nIHRvIHdoZXRoZXIgb3Igbm90IGl0IG1heQorICAvLy8gZ2VuZXJhdGUgYSByZWxvY2F0aW9uIGVudHJ5LiAgVGhpcyBtdXN0IGJlIGNvbnNlcnZhdGl2ZSwgc28gaWYgaXQgbWlnaHQKKyAgLy8vIGNvZGVnZW4gdG8gYSByZWxvY2F0YWJsZSBlbnRyeSwgaXQgc2hvdWxkIHNheSBzby4KKyAgYm9vbCBuZWVkc1JlbG9jYXRpb24oKSBjb25zdDsKKworICBTZWN0aW9uS2luZCBnZXRTZWN0aW9uS2luZChjb25zdCBEYXRhTGF5b3V0ICpETCkgY29uc3Q7Cit9OworCisvLy8gVGhlIE1hY2hpbmVDb25zdGFudFBvb2wgY2xhc3Mga2VlcHMgdHJhY2sgb2YgY29uc3RhbnRzIHJlZmVyZW5jZWQgYnkgYQorLy8vIGZ1bmN0aW9uIHdoaWNoIG11c3QgYmUgc3BpbGxlZCB0byBtZW1vcnkuICBUaGlzIGlzIHVzZWQgZm9yIGNvbnN0YW50cyB3aGljaAorLy8vIGFyZSB1bmFibGUgdG8gYmUgdXNlZCBkaXJlY3RseSBhcyBvcGVyYW5kcyB0byBpbnN0cnVjdGlvbnMsIHdoaWNoIHR5cGljYWxseQorLy8vIGluY2x1ZGUgZmxvYXRpbmcgcG9pbnQgYW5kIGxhcmdlIGludGVnZXIgY29uc3RhbnRzLgorLy8vCisvLy8gSW5zdHJ1Y3Rpb25zIHJlZmVyZW5jZSB0aGUgYWRkcmVzcyBvZiB0aGVzZSBjb25zdGFudCBwb29sIGNvbnN0YW50cyB0aHJvdWdoCisvLy8gdGhlIHVzZSBvZiBNT19Db25zdGFudFBvb2xJbmRleCB2YWx1ZXMuICBXaGVuIGVtaXR0aW5nIGFzc2VtYmx5IG9yIG1hY2hpbmUKKy8vLyBjb2RlLCB0aGVzZSB2aXJ0dWFsIGFkZHJlc3MgcmVmZXJlbmNlcyBhcmUgY29udmVydGVkIHRvIHJlZmVyIHRvIHRoZQorLy8vIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uIGNvbnN0YW50IHBvb2wgdmFsdWVzLgorLy8vIEBicmllZiBUaGUgbWFjaGluZSBjb25zdGFudCBwb29sLgorY2xhc3MgTWFjaGluZUNvbnN0YW50UG9vbCB7CisgIHVuc2lnbmVkIFBvb2xBbGlnbm1lbnQ7ICAgICAgIC8vLzwgVGhlIGFsaWdubWVudCBmb3IgdGhlIHBvb2wuCisgIHN0ZDo6dmVjdG9yPE1hY2hpbmVDb25zdGFudFBvb2xFbnRyeT4gQ29uc3RhbnRzOyAvLy88IFRoZSBwb29sIG9mIGNvbnN0YW50cy4KKyAgLy8vIE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZXMgdGhhdCB1c2UgYW4gZXhpc3RpbmcgTWFjaGluZUNvbnN0YW50UG9vbEVudHJ5LgorICBEZW5zZVNldDxNYWNoaW5lQ29uc3RhbnRQb29sVmFsdWUqPiBNYWNoaW5lQ1BWc1NoYXJpbmdFbnRyaWVzOworICBjb25zdCBEYXRhTGF5b3V0ICZETDsKKworICBjb25zdCBEYXRhTGF5b3V0ICZnZXREYXRhTGF5b3V0KCkgY29uc3QgeyByZXR1cm4gREw7IH0KKworcHVibGljOgorICAvLy8gQGJyaWVmIFRoZSBvbmx5IGNvbnN0cnVjdG9yLgorICBleHBsaWNpdCBNYWNoaW5lQ29uc3RhbnRQb29sKGNvbnN0IERhdGFMYXlvdXQgJkRMKQorICAgICAgOiBQb29sQWxpZ25tZW50KDEpLCBETChETCkge30KKyAgfk1hY2hpbmVDb25zdGFudFBvb2woKTsKKworICAvLy8gZ2V0Q29uc3RhbnRQb29sQWxpZ25tZW50IC0gUmV0dXJuIHRoZSBhbGlnbm1lbnQgcmVxdWlyZWQgYnkKKyAgLy8vIHRoZSB3aG9sZSBjb25zdGFudCBwb29sLCBvZiB3aGljaCB0aGUgZmlyc3QgZWxlbWVudCBtdXN0IGJlIGFsaWduZWQuCisgIHVuc2lnbmVkIGdldENvbnN0YW50UG9vbEFsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuIFBvb2xBbGlnbm1lbnQ7IH0KKworICAvLy8gZ2V0Q29uc3RhbnRQb29sSW5kZXggLSBDcmVhdGUgYSBuZXcgZW50cnkgaW4gdGhlIGNvbnN0YW50IHBvb2wgb3IgcmV0dXJuCisgIC8vLyBhbiBleGlzdGluZyBvbmUuICBVc2VyIG11c3Qgc3BlY2lmeSB0aGUgbWluaW11bSByZXF1aXJlZCBhbGlnbm1lbnQgZm9yCisgIC8vLyB0aGUgb2JqZWN0LgorICB1bnNpZ25lZCBnZXRDb25zdGFudFBvb2xJbmRleChjb25zdCBDb25zdGFudCAqQywgdW5zaWduZWQgQWxpZ25tZW50KTsKKyAgdW5zaWduZWQgZ2V0Q29uc3RhbnRQb29sSW5kZXgoTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlICpWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQpOworCisgIC8vLyBpc0VtcHR5IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBjb25zdGFudCBwb29sIGNvbnRhaW5zIG5vIGNvbnN0YW50cy4KKyAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gQ29uc3RhbnRzLmVtcHR5KCk7IH0KKworICBjb25zdCBzdGQ6OnZlY3RvcjxNYWNoaW5lQ29uc3RhbnRQb29sRW50cnk+ICZnZXRDb25zdGFudHMoKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50czsKKyAgfQorCisgIC8vLyBwcmludCAtIFVzZWQgYnkgdGhlIE1hY2hpbmVGdW5jdGlvbiBwcmludGVyIHRvIHByaW50IGluZm9ybWF0aW9uIGFib3V0CisgIC8vLyBjb25zdGFudCBwb29sIG9iamVjdHMuICBJbXBsZW1lbnRlZCBpbiBNYWNoaW5lRnVuY3Rpb24uY3BwCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLy8gZHVtcCAtIENhbGwgcHJpbnQoY2VycikgdG8gYmUgY2FsbGVkIGZyb20gdGhlIGRlYnVnZ2VyLgorICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTUFDSElORUNPTlNUQU5UUE9PTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZURvbWluYW5jZUZyb250aWVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZURvbWluYW5jZUZyb250aWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZiY2M2MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lRG9taW5hbmNlRnJvbnRpZXIuaApAQCAtMCwwICsxLDExMSBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9NYWNoaW5lRG9taW5hbmNlRnJvbnRpZXIuaCAtLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORURPTUlOQU5DRUZST05USUVSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVET01JTkFOQ0VGUk9OVElFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RvbWluYW5jZUZyb250aWVyLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Eb21pbmFuY2VGcm9udGllckltcGwuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9HZW5lcmljRG9tVHJlZS5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lRG9taW5hbmNlRnJvbnRpZXIgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgIEZvcndhcmREb21pbmFuY2VGcm9udGllckJhc2U8TWFjaGluZUJhc2ljQmxvY2s+IEJhc2U7CisKK3B1YmxpYzoKKyB1c2luZyBEb21UcmVlVCA9IERvbVRyZWVCYXNlPE1hY2hpbmVCYXNpY0Jsb2NrPjsKKyB1c2luZyBEb21UcmVlTm9kZVQgPSBEb21UcmVlTm9kZUJhc2U8TWFjaGluZUJhc2ljQmxvY2s+OworIHVzaW5nIERvbVNldFR5cGUgPSBEb21pbmFuY2VGcm9udGllckJhc2U8TWFjaGluZUJhc2ljQmxvY2ssIGZhbHNlPjo6RG9tU2V0VHlwZTsKKyB1c2luZyBpdGVyYXRvciA9IERvbWluYW5jZUZyb250aWVyQmFzZTxNYWNoaW5lQmFzaWNCbG9jaywgZmFsc2U+OjppdGVyYXRvcjsKKyB1c2luZyBjb25zdF9pdGVyYXRvciA9CisgICAgIERvbWluYW5jZUZyb250aWVyQmFzZTxNYWNoaW5lQmFzaWNCbG9jaywgZmFsc2U+Ojpjb25zdF9pdGVyYXRvcjsKKworIE1hY2hpbmVEb21pbmFuY2VGcm9udGllcihjb25zdCBNYWNoaW5lRG9taW5hbmNlRnJvbnRpZXIgJikgPSBkZWxldGU7CisgTWFjaGluZURvbWluYW5jZUZyb250aWVyICZvcGVyYXRvcj0oY29uc3QgTWFjaGluZURvbWluYW5jZUZyb250aWVyICYpID0gZGVsZXRlOworCisgc3RhdGljIGNoYXIgSUQ7CisKKyBNYWNoaW5lRG9taW5hbmNlRnJvbnRpZXIoKTsKKworIERvbWluYW5jZUZyb250aWVyQmFzZTxNYWNoaW5lQmFzaWNCbG9jaywgZmFsc2U+ICZnZXRCYXNlKCkgeyByZXR1cm4gQmFzZTsgfQorCisgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lQmFzaWNCbG9jayAqPiAmZ2V0Um9vdHMoKSBjb25zdCB7CisgICByZXR1cm4gQmFzZS5nZXRSb290cygpOworICB9CisKKyAgTWFjaGluZUJhc2ljQmxvY2sgKmdldFJvb3QoKSBjb25zdCB7CisgICAgcmV0dXJuIEJhc2UuZ2V0Um9vdCgpOworICB9CisKKyAgYm9vbCBpc1Bvc3REb21pbmF0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIEJhc2UuaXNQb3N0RG9taW5hdG9yKCk7CisgIH0KKworICBpdGVyYXRvciBiZWdpbigpIHsKKyAgICByZXR1cm4gQmFzZS5iZWdpbigpOworICB9CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIEJhc2UuYmVnaW4oKTsKKyAgfQorCisgIGl0ZXJhdG9yIGVuZCgpIHsKKyAgICByZXR1cm4gQmFzZS5lbmQoKTsKKyAgfQorCisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQmFzZS5lbmQoKTsKKyAgfQorCisgIGl0ZXJhdG9yIGZpbmQoTWFjaGluZUJhc2ljQmxvY2sgKkIpIHsKKyAgICByZXR1cm4gQmFzZS5maW5kKEIpOworICB9CisKKyAgY29uc3RfaXRlcmF0b3IgZmluZChNYWNoaW5lQmFzaWNCbG9jayAqQikgY29uc3QgeworICAgIHJldHVybiBCYXNlLmZpbmQoQik7CisgIH0KKworICBpdGVyYXRvciBhZGRCYXNpY0Jsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpCQiwgY29uc3QgRG9tU2V0VHlwZSAmZnJvbnRpZXIpIHsKKyAgICByZXR1cm4gQmFzZS5hZGRCYXNpY0Jsb2NrKEJCLCBmcm9udGllcik7CisgIH0KKworICB2b2lkIHJlbW92ZUJsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgeworICAgIHJldHVybiBCYXNlLnJlbW92ZUJsb2NrKEJCKTsKKyAgfQorCisgIHZvaWQgYWRkVG9Gcm9udGllcihpdGVyYXRvciBJLCBNYWNoaW5lQmFzaWNCbG9jayAqTm9kZSkgeworICAgIHJldHVybiBCYXNlLmFkZFRvRnJvbnRpZXIoSSwgTm9kZSk7CisgIH0KKworICB2b2lkIHJlbW92ZUZyb21Gcm9udGllcihpdGVyYXRvciBJLCBNYWNoaW5lQmFzaWNCbG9jayAqTm9kZSkgeworICAgIHJldHVybiBCYXNlLnJlbW92ZUZyb21Gcm9udGllcihJLCBOb2RlKTsKKyAgfQorCisgIGJvb2wgY29tcGFyZURvbVNldChEb21TZXRUeXBlICZEUzEsIGNvbnN0IERvbVNldFR5cGUgJkRTMikgY29uc3QgeworICAgIHJldHVybiBCYXNlLmNvbXBhcmVEb21TZXQoRFMxLCBEUzIpOworICB9CisKKyAgYm9vbCBjb21wYXJlKERvbWluYW5jZUZyb250aWVyQmFzZTxNYWNoaW5lQmFzaWNCbG9jaywgZmFsc2U+ICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBCYXNlLmNvbXBhcmUoT3RoZXIpOworICB9CisKKyAgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworCisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlOworCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX01BQ0hJTkVET01JTkFOQ0VGUk9OVElFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZURvbWluYXRvcnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lRG9taW5hdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNjQyZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZURvbWluYXRvcnMuaApAQCAtMCwwICsxLDI5MSBAQAorLy89PS0gbGx2bS9Db2RlR2VuL01hY2hpbmVEb21pbmF0b3JzLmggLSBNYWNoaW5lIERvbSBDYWxjdWxhdGlvbiAtKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBjbGFzc2VzIG1pcnJvcmluZyB0aG9zZSBpbiBsbHZtL0FuYWx5c2lzL0RvbWluYXRvcnMuaCwKKy8vIGJ1dCBmb3IgdGFyZ2V0LXNwZWNpZmljIGNvZGUgcmF0aGVyIHRoYW4gdGFyZ2V0LWluZGVwZW5kZW50IElSLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVET01JTkFUT1JTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVET01JTkFUT1JTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvR2VuZXJpY0RvbVRyZWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvR2VuZXJpY0RvbVRyZWVDb25zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIERvbWluYXRvclRyZWVCYXNlPE1hY2hpbmVCYXNpY0Jsb2NrLCBmYWxzZT46OmFkZFJvb3QoCisgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgeworICB0aGlzLT5Sb290cy5wdXNoX2JhY2soTUJCKTsKK30KKworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIERvbVRyZWVOb2RlQmFzZTxNYWNoaW5lQmFzaWNCbG9jaz47CitleHRlcm4gdGVtcGxhdGUgY2xhc3MgRG9taW5hdG9yVHJlZUJhc2U8TWFjaGluZUJhc2ljQmxvY2ssIGZhbHNlPjsgLy8gRG9tVHJlZQorZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIERvbWluYXRvclRyZWVCYXNlPE1hY2hpbmVCYXNpY0Jsb2NrLCB0cnVlPjsgLy8gUG9zdERvbVRyZWUKKwordXNpbmcgTWFjaGluZURvbVRyZWVOb2RlID0gRG9tVHJlZU5vZGVCYXNlPE1hY2hpbmVCYXNpY0Jsb2NrPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8gRG9taW5hdG9yVHJlZSBDbGFzcyAtIENvbmNyZXRlIHN1YmNsYXNzIG9mIERvbWluYXRvclRyZWVCYXNlIHRoYXQgaXMgdXNlZCB0bworLy8vIGNvbXB1dGUgYSBub3JtYWwgZG9taW5hdG9yIHRyZWUuCisvLy8KK2NsYXNzIE1hY2hpbmVEb21pbmF0b3JUcmVlIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICAvLy8gXGJyaWVmIEhlbHBlciBzdHJ1Y3R1cmUgdXNlZCB0byBob2xkIGFsbCB0aGUgYmFzaWMgYmxvY2tzCisgIC8vLyBpbnZvbHZlZCBpbiB0aGUgc3BsaXQgb2YgYSBjcml0aWNhbCBlZGdlLgorICBzdHJ1Y3QgQ3JpdGljYWxFZGdlIHsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqRnJvbUJCOworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpUb0JCOworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpOZXdCQjsKKyAgfTsKKworICAvLy8gXGJyaWVmIFBpbGUgdXAgYWxsIHRoZSBjcml0aWNhbCBlZGdlcyB0byBiZSBzcGxpdC4KKyAgLy8vIFRoZSBzcGxpdHRpbmcgb2YgYSBjcml0aWNhbCBlZGdlIGlzIGxvY2FsIGFuZCB0aHVzLCBpdCBpcyBwb3NzaWJsZQorICAvLy8gdG8gYXBwbHkgc2V2ZXJhbCBvZiB0aG9zZSBjaGFuZ2VzIGF0IHRoZSBzYW1lIHRpbWUuCisgIG11dGFibGUgU21hbGxWZWN0b3I8Q3JpdGljYWxFZGdlLCAzMj4gQ3JpdGljYWxFZGdlc1RvU3BsaXQ7CisKKyAgLy8vIFxicmllZiBSZW1lbWJlciBhbGwgdGhlIGJhc2ljIGJsb2NrcyB0aGF0IGFyZSBpbnNlcnRlZCBkdXJpbmcKKyAgLy8vIGVkZ2Ugc3BsaXR0aW5nLgorICAvLy8gSW52YXJpYW50OiBOZXdCQnMgPT0gYWxsIHRoZSBiYXNpYyBibG9ja3MgY29udGFpbmVkIGluIHRoZSBOZXdCQgorICAvLy8gZmllbGQgb2YgYWxsIHRoZSBlbGVtZW50cyBvZiBDcml0aWNhbEVkZ2VzVG9TcGxpdC4KKyAgLy8vIEkuZS4sIGZvcmFsbCBlbHQgaW4gQ3JpdGljYWxFZGdlc1RvU3BsaXQsIGl0IGV4aXN0cyBCQiBpbiBOZXdCQnMKKyAgLy8vIHN1Y2ggYXMgQkIgPT0gZWx0Lk5ld0JCLgorICBtdXRhYmxlIFNtYWxsU2V0PE1hY2hpbmVCYXNpY0Jsb2NrICosIDMyPiBOZXdCQnM7CisKKyAgLy8vIFRoZSBEb21pbmF0b3JUcmVlQmFzZSB0aGF0IGlzIHVzZWQgdG8gY29tcHV0ZSBhIG5vcm1hbCBkb21pbmF0b3IgdHJlZQorICBzdGQ6OnVuaXF1ZV9wdHI8RG9tVHJlZUJhc2U8TWFjaGluZUJhc2ljQmxvY2s+PiBEVDsKKworICAvLy8gXGJyaWVmIEFwcGx5IGFsbCB0aGUgcmVjb3JkZWQgY3JpdGljYWwgZWRnZXMgdG8gdGhlIERULgorICAvLy8gVGhpcyB1cGRhdGVzIHRoZSB1bmRlcmx5aW5nIERUIGluZm9ybWF0aW9uIGluIGEgd2F5IHRoYXQgdXNlcworICAvLy8gdGhlIGZhc3QgcXVlcnkgcGF0aCBvZiBEVCBhcyBtdWNoIGFzIHBvc3NpYmxlLgorICAvLy8KKyAgLy8vIFxwb3N0IENyaXRpY2FsRWRnZXNUb1NwbGl0LmVtcHR5KCkuCisgIHZvaWQgYXBwbHlTcGxpdENyaXRpY2FsRWRnZXMoKSBjb25zdDsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBJRCwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorCisgIE1hY2hpbmVEb21pbmF0b3JUcmVlKCk7CisKKyAgRG9tVHJlZUJhc2U8TWFjaGluZUJhc2ljQmxvY2s+ICZnZXRCYXNlKCkgeworICAgIGlmICghRFQpIERULnJlc2V0KG5ldyBEb21UcmVlQmFzZTxNYWNoaW5lQmFzaWNCbG9jaz4oKSk7CisgICAgYXBwbHlTcGxpdENyaXRpY2FsRWRnZXMoKTsKKyAgICByZXR1cm4gKkRUOworICB9CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gZ2V0Um9vdHMgLSAgUmV0dXJuIHRoZSByb290IGJsb2NrcyBvZiB0aGUgY3VycmVudCBDRkcuICBUaGlzIG1heSBpbmNsdWRlCisgIC8vLyBtdWx0aXBsZSBibG9ja3MgaWYgd2UgYXJlIGNvbXB1dGluZyBwb3N0IGRvbWluYXRvcnMuICBGb3IgZm9yd2FyZAorICAvLy8gZG9taW5hdG9ycywgdGhpcyB3aWxsIGFsd2F5cyBiZSBhIHNpbmdsZSBibG9jayAodGhlIGVudHJ5IG5vZGUpLgorICAvLy8KKyAgaW5saW5lIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lQmFzaWNCbG9jayo+ICZnZXRSb290cygpIGNvbnN0IHsKKyAgICBhcHBseVNwbGl0Q3JpdGljYWxFZGdlcygpOworICAgIHJldHVybiBEVC0+Z2V0Um9vdHMoKTsKKyAgfQorCisgIGlubGluZSBNYWNoaW5lQmFzaWNCbG9jayAqZ2V0Um9vdCgpIGNvbnN0IHsKKyAgICBhcHBseVNwbGl0Q3JpdGljYWxFZGdlcygpOworICAgIHJldHVybiBEVC0+Z2V0Um9vdCgpOworICB9CisKKyAgaW5saW5lIE1hY2hpbmVEb21UcmVlTm9kZSAqZ2V0Um9vdE5vZGUoKSBjb25zdCB7CisgICAgYXBwbHlTcGxpdENyaXRpY2FsRWRnZXMoKTsKKyAgICByZXR1cm4gRFQtPmdldFJvb3ROb2RlKCk7CisgIH0KKworICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmRikgb3ZlcnJpZGU7CisKKyAgaW5saW5lIGJvb2wgZG9taW5hdGVzKGNvbnN0IE1hY2hpbmVEb21UcmVlTm9kZSogQSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVEb21UcmVlTm9kZSogQikgY29uc3QgeworICAgIGFwcGx5U3BsaXRDcml0aWNhbEVkZ2VzKCk7CisgICAgcmV0dXJuIERULT5kb21pbmF0ZXMoQSwgQik7CisgIH0KKworICBpbmxpbmUgYm9vbCBkb21pbmF0ZXMoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sqIEEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayogQikgY29uc3QgeworICAgIGFwcGx5U3BsaXRDcml0aWNhbEVkZ2VzKCk7CisgICAgcmV0dXJuIERULT5kb21pbmF0ZXMoQSwgQik7CisgIH0KKworICAvLyBkb21pbmF0ZXMgLSBSZXR1cm4gdHJ1ZSBpZiBBIGRvbWluYXRlcyBCLiBUaGlzIHBlcmZvcm1zIHRoZQorICAvLyBzcGVjaWFsIGNoZWNrcyBuZWNlc3NhcnkgaWYgQSBhbmQgQiBhcmUgaW4gdGhlIHNhbWUgYmFzaWMgYmxvY2suCisgIGJvb2wgZG9taW5hdGVzKGNvbnN0IE1hY2hpbmVJbnN0ciAqQSwgY29uc3QgTWFjaGluZUluc3RyICpCKSBjb25zdCB7CisgICAgYXBwbHlTcGxpdENyaXRpY2FsRWRnZXMoKTsKKyAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqQkJBID0gQS0+Z2V0UGFyZW50KCksICpCQkIgPSBCLT5nZXRQYXJlbnQoKTsKKyAgICBpZiAoQkJBICE9IEJCQikgcmV0dXJuIERULT5kb21pbmF0ZXMoQkJBLCBCQkIpOworCisgICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBiYXNpYyBibG9jayB1bnRpbCB3ZSBmaW5kIEEgb3IgQi4KKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgSSA9IEJCQS0+YmVnaW4oKTsKKyAgICBmb3IgKDsgJipJICE9IEEgJiYgJipJICE9IEI7ICsrSSkKKyAgICAgIC8qZW1wdHkqLyA7CisKKyAgICAvL2lmKCFEVC5Jc1Bvc3REb21pbmF0b3JzKSB7CisgICAgICAvLyBBIGRvbWluYXRlcyBCIGlmIGl0IGlzIGZvdW5kIGZpcnN0IGluIHRoZSBiYXNpYyBibG9jay4KKyAgICAgIHJldHVybiAmKkkgPT0gQTsKKyAgICAvL30gZWxzZSB7CisgICAgLy8gIC8vIEEgcG9zdC1kb21pbmF0ZXMgQiBpZiBCIGlzIGZvdW5kIGZpcnN0IGluIHRoZSBiYXNpYyBibG9jay4KKyAgICAvLyAgcmV0dXJuICYqSSA9PSBCOworICAgIC8vfQorICB9CisKKyAgaW5saW5lIGJvb2wgcHJvcGVybHlEb21pbmF0ZXMoY29uc3QgTWFjaGluZURvbVRyZWVOb2RlKiBBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lRG9tVHJlZU5vZGUqIEIpIGNvbnN0IHsKKyAgICBhcHBseVNwbGl0Q3JpdGljYWxFZGdlcygpOworICAgIHJldHVybiBEVC0+cHJvcGVybHlEb21pbmF0ZXMoQSwgQik7CisgIH0KKworICBpbmxpbmUgYm9vbCBwcm9wZXJseURvbWluYXRlcyhjb25zdCBNYWNoaW5lQmFzaWNCbG9jayogQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sqIEIpIGNvbnN0IHsKKyAgICBhcHBseVNwbGl0Q3JpdGljYWxFZGdlcygpOworICAgIHJldHVybiBEVC0+cHJvcGVybHlEb21pbmF0ZXMoQSwgQik7CisgIH0KKworICAvLy8gZmluZE5lYXJlc3RDb21tb25Eb21pbmF0b3IgLSBGaW5kIG5lYXJlc3QgY29tbW9uIGRvbWluYXRvciBiYXNpYyBibG9jaworICAvLy8gZm9yIGJhc2ljIGJsb2NrIEEgYW5kIEIuIElmIHRoZXJlIGlzIG5vIHN1Y2ggYmxvY2sgdGhlbiByZXR1cm4gTlVMTC4KKyAgaW5saW5lIE1hY2hpbmVCYXNpY0Jsb2NrICpmaW5kTmVhcmVzdENvbW1vbkRvbWluYXRvcihNYWNoaW5lQmFzaWNCbG9jayAqQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqQikgeworICAgIGFwcGx5U3BsaXRDcml0aWNhbEVkZ2VzKCk7CisgICAgcmV0dXJuIERULT5maW5kTmVhcmVzdENvbW1vbkRvbWluYXRvcihBLCBCKTsKKyAgfQorCisgIGlubGluZSBNYWNoaW5lRG9tVHJlZU5vZGUgKm9wZXJhdG9yW10oTWFjaGluZUJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgYXBwbHlTcGxpdENyaXRpY2FsRWRnZXMoKTsKKyAgICByZXR1cm4gRFQtPmdldE5vZGUoQkIpOworICB9CisKKyAgLy8vIGdldE5vZGUgLSByZXR1cm4gdGhlIChQb3N0KURvbWluYXRvclRyZWUgbm9kZSBmb3IgdGhlIHNwZWNpZmllZCBiYXNpYworICAvLy8gYmxvY2suICBUaGlzIGlzIHRoZSBzYW1lIGFzIHVzaW5nIG9wZXJhdG9yW10gb24gdGhpcyBjbGFzcy4KKyAgLy8vCisgIGlubGluZSBNYWNoaW5lRG9tVHJlZU5vZGUgKmdldE5vZGUoTWFjaGluZUJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgYXBwbHlTcGxpdENyaXRpY2FsRWRnZXMoKTsKKyAgICByZXR1cm4gRFQtPmdldE5vZGUoQkIpOworICB9CisKKyAgLy8vIGFkZE5ld0Jsb2NrIC0gQWRkIGEgbmV3IG5vZGUgdG8gdGhlIGRvbWluYXRvciB0cmVlIGluZm9ybWF0aW9uLiAgVGhpcworICAvLy8gY3JlYXRlcyBhIG5ldyBub2RlIGFzIGEgY2hpbGQgb2YgRG9tQkIgZG9taW5hdG9yIG5vZGUsbGlua2luZyBpdCBpbnRvCisgIC8vLyB0aGUgY2hpbGRyZW4gbGlzdCBvZiB0aGUgaW1tZWRpYXRlIGRvbWluYXRvci4KKyAgaW5saW5lIE1hY2hpbmVEb21UcmVlTm9kZSAqYWRkTmV3QmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRG9tQkIpIHsKKyAgICBhcHBseVNwbGl0Q3JpdGljYWxFZGdlcygpOworICAgIHJldHVybiBEVC0+YWRkTmV3QmxvY2soQkIsIERvbUJCKTsKKyAgfQorCisgIC8vLyBjaGFuZ2VJbW1lZGlhdGVEb21pbmF0b3IgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHVwZGF0ZSB0aGUgZG9taW5hdG9yCisgIC8vLyB0cmVlIGluZm9ybWF0aW9uIHdoZW4gYSBub2RlJ3MgaW1tZWRpYXRlIGRvbWluYXRvciBjaGFuZ2VzLgorICAvLy8KKyAgaW5saW5lIHZvaWQgY2hhbmdlSW1tZWRpYXRlRG9taW5hdG9yKE1hY2hpbmVCYXNpY0Jsb2NrICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sqIE5ld0lEb20pIHsKKyAgICBhcHBseVNwbGl0Q3JpdGljYWxFZGdlcygpOworICAgIERULT5jaGFuZ2VJbW1lZGlhdGVEb21pbmF0b3IoTiwgTmV3SURvbSk7CisgIH0KKworICBpbmxpbmUgdm9pZCBjaGFuZ2VJbW1lZGlhdGVEb21pbmF0b3IoTWFjaGluZURvbVRyZWVOb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZURvbVRyZWVOb2RlKiBOZXdJRG9tKSB7CisgICAgYXBwbHlTcGxpdENyaXRpY2FsRWRnZXMoKTsKKyAgICBEVC0+Y2hhbmdlSW1tZWRpYXRlRG9taW5hdG9yKE4sIE5ld0lEb20pOworICB9CisKKyAgLy8vIGVyYXNlTm9kZSAtIFJlbW92ZXMgYSBub2RlIGZyb20gIHRoZSBkb21pbmF0b3IgdHJlZS4gQmxvY2sgbXVzdCBub3QKKyAgLy8vIGRvbWluYXRlIGFueSBvdGhlciBibG9ja3MuIFJlbW92ZXMgbm9kZSBmcm9tIGl0cyBpbW1lZGlhdGUgZG9taW5hdG9yJ3MKKyAgLy8vIGNoaWxkcmVuIGxpc3QuIERlbGV0ZXMgZG9taW5hdG9yIG5vZGUgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIGJsb2NrIEJCLgorICBpbmxpbmUgdm9pZCBlcmFzZU5vZGUoTWFjaGluZUJhc2ljQmxvY2sgKkJCKSB7CisgICAgYXBwbHlTcGxpdENyaXRpY2FsRWRnZXMoKTsKKyAgICBEVC0+ZXJhc2VOb2RlKEJCKTsKKyAgfQorCisgIC8vLyBzcGxpdEJsb2NrIC0gQkIgaXMgc3BsaXQgYW5kIG5vdyBpdCBoYXMgb25lIHN1Y2Nlc3Nvci4gVXBkYXRlIGRvbWluYXRvcgorICAvLy8gdHJlZSB0byByZWZsZWN0IHRoaXMgY2hhbmdlLgorICBpbmxpbmUgdm9pZCBzcGxpdEJsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrKiBOZXdCQikgeworICAgIGFwcGx5U3BsaXRDcml0aWNhbEVkZ2VzKCk7CisgICAgRFQtPnNwbGl0QmxvY2soTmV3QkIpOworICB9CisKKyAgLy8vIGlzUmVhY2hhYmxlRnJvbUVudHJ5IC0gUmV0dXJuIHRydWUgaWYgQSBpcyBkb21pbmF0ZWQgYnkgdGhlIGVudHJ5CisgIC8vLyBibG9jayBvZiB0aGUgZnVuY3Rpb24gY29udGFpbmluZyBpdC4KKyAgYm9vbCBpc1JlYWNoYWJsZUZyb21FbnRyeShjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqQSkgeworICAgIGFwcGx5U3BsaXRDcml0aWNhbEVkZ2VzKCk7CisgICAgcmV0dXJuIERULT5pc1JlYWNoYWJsZUZyb21FbnRyeShBKTsKKyAgfQorCisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlOworCisgIHZvaWQgdmVyaWZ5QW5hbHlzaXMoKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlKikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBSZWNvcmQgdGhhdCB0aGUgY3JpdGljYWwgZWRnZSAoRnJvbUJCLCBUb0JCKSBoYXMgYmVlbgorICAvLy8gc3BsaXQgd2l0aCBOZXdCQi4KKyAgLy8vIFRoaXMgaXMgYmVzdCB0byB1c2UgdGhpcyBtZXRob2QgaW5zdGVhZCBvZiBkaXJlY3RseSB1cGRhdGUgdGhlCisgIC8vLyB1bmRlcmx5aW5nIGluZm9ybWF0aW9uLCBiZWNhdXNlIHRoaXMgaGVscHMgbWl0aWdhdGluZyB0aGUKKyAgLy8vIG51bWJlciBvZiB0aW1lIHRoZSBEVCBpbmZvcm1hdGlvbiBpcyBpbnZhbGlkYXRlZC4KKyAgLy8vCisgIC8vLyBcbm90ZSBEbyBub3QgdXNlIHRoaXMgbWV0aG9kIHdpdGggcmVndWxhciBlZGdlcy4KKyAgLy8vCisgIC8vLyBcbm90ZSBUbyBiZW5lZml0IGZyb20gdGhlIGNvbXBpbGUgdGltZSBpbXByb3ZlbWVudCBpbmN1cnJlZCBieSB0aGlzCisgIC8vLyBtZXRob2QsIHRoZSB1c2VycyBvZiB0aGlzIG1ldGhvZCBoYXZlIHRvIGxpbWl0IHRoZSBxdWVyaWVzIHRvIHRoZSBEVAorICAvLy8gaW50ZXJmYWNlIGJldHdlZW4gdHdvIGVkZ2VzIHNwbGl0dGluZy4gSW4gb3RoZXIgd29yZHMsIHRoZXkgaGF2ZSB0bworICAvLy8gcGFjayB0aGUgc3BsaXR0aW5nIG9mIGNyaXRpY2FsIGVkZ2VzIGFzIG11Y2ggYXMgcG9zc2libGUuCisgIHZvaWQgcmVjb3JkU3BsaXRDcml0aWNhbEVkZ2UoTWFjaGluZUJhc2ljQmxvY2sgKkZyb21CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpUb0JCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk5ld0JCKSB7CisgICAgYm9vbCBJbnNlcnRlZCA9IE5ld0JCcy5pbnNlcnQoTmV3QkIpLnNlY29uZDsKKyAgICAodm9pZClJbnNlcnRlZDsKKyAgICBhc3NlcnQoSW5zZXJ0ZWQgJiYKKyAgICAgICAgICAgIkEgYmFzaWMgYmxvY2sgaW5zZXJ0ZWQgdmlhIGVkZ2Ugc3BsaXR0aW5nIGNhbm5vdCBhcHBlYXIgdHdpY2UiKTsKKyAgICBDcml0aWNhbEVkZ2VzVG9TcGxpdC5wdXNoX2JhY2soe0Zyb21CQiwgVG9CQiwgTmV3QkJ9KTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8gRG9taW5hdG9yVHJlZSBHcmFwaFRyYWl0cyBzcGVjaWFsaXphdGlvbiBzbyB0aGUgRG9taW5hdG9yVHJlZSBjYW4gYmUKKy8vLyBpdGVyYWJsZSBieSBnZW5lcmljIGdyYXBoIGl0ZXJhdG9ycy4KKy8vLworCit0ZW1wbGF0ZSA8Y2xhc3MgTm9kZSwgY2xhc3MgQ2hpbGRJdGVyYXRvcj4KK3N0cnVjdCBNYWNoaW5lRG9tVHJlZUdyYXBoVHJhaXRzQmFzZSB7CisgIHVzaW5nIE5vZGVSZWYgPSBOb2RlICo7CisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gQ2hpbGRJdGVyYXRvcjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoTm9kZVJlZiBOKSB7IHJldHVybiBOOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPmJlZ2luKCk7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlUmVmIE4pIHsgcmV0dXJuIE4tPmVuZCgpOyB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IEdyYXBoVHJhaXRzOworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IEdyYXBoVHJhaXRzPE1hY2hpbmVEb21UcmVlTm9kZSAqPgorICAgIDogcHVibGljIE1hY2hpbmVEb21UcmVlR3JhcGhUcmFpdHNCYXNlPE1hY2hpbmVEb21UcmVlTm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lRG9tVHJlZU5vZGU6Oml0ZXJhdG9yPiB7fTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBHcmFwaFRyYWl0czxjb25zdCBNYWNoaW5lRG9tVHJlZU5vZGUgKj4KKyAgICA6IHB1YmxpYyBNYWNoaW5lRG9tVHJlZUdyYXBoVHJhaXRzQmFzZTxjb25zdCBNYWNoaW5lRG9tVHJlZU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZURvbVRyZWVOb2RlOjpjb25zdF9pdGVyYXRvcj4geworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPE1hY2hpbmVEb21pbmF0b3JUcmVlKj4KKyAgOiBwdWJsaWMgR3JhcGhUcmFpdHM8TWFjaGluZURvbVRyZWVOb2RlICo+IHsKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKE1hY2hpbmVEb21pbmF0b3JUcmVlICpEVCkgeworICAgIHJldHVybiBEVC0+Z2V0Um9vdE5vZGUoKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9NQUNISU5FRE9NSU5BVE9SU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUZyYW1lSW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mODg3NTE3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaApAQCAtMCwwICsxLDcyNCBAQAorLy89PT0tLSBDb2RlR2VuL01hY2hpbmVGcmFtZUluZm8uaCAtIEFic3RyYWN0IFN0YWNrIEZyYW1lIFJlcC4gLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGUgZmlsZSBkZWZpbmVzIHRoZSBNYWNoaW5lRnJhbWVJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVGUkFNRUlORk9fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORUZSQU1FSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKK2NsYXNzIEJpdFZlY3RvcjsKK2NsYXNzIEFsbG9jYUluc3Q7CisKKy8vLyBUaGUgQ2FsbGVlU2F2ZWRJbmZvIGNsYXNzIHRyYWNrcyB0aGUgaW5mb3JtYXRpb24gbmVlZCB0byBsb2NhdGUgd2hlcmUgYQorLy8vIGNhbGxlZSBzYXZlZCByZWdpc3RlciBpcyBpbiB0aGUgY3VycmVudCBmcmFtZS4KK2NsYXNzIENhbGxlZVNhdmVkSW5mbyB7CisgIHVuc2lnbmVkIFJlZzsKKyAgaW50IEZyYW1lSWR4OworICAvLy8gRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIHJlZ2lzdGVyIGlzIGFjdHVhbGx5IHJlc3RvcmVkIGluIHRoZSBlcGlsb2cuCisgIC8vLyBJbiBtb3N0IGNhc2VzLCBpZiBhIHJlZ2lzdGVyIGlzIHNhdmVkLCBpdCBpcyBhbHNvIHJlc3RvcmVkLiBUaGVyZSBhcmUKKyAgLy8vIHNvbWUgc2l0dWF0aW9ucywgdGhvdWdoLCB3aGVuIHRoaXMgaXMgbm90IHRoZSBjYXNlLiBGb3IgZXhhbXBsZSwgdGhlCisgIC8vLyBMUiByZWdpc3RlciBvbiBBUk0gaXMgdXN1YWxseSBzYXZlZCwgYnV0IG9uIGV4aXQgZnJvbSB0aGUgZnVuY3Rpb24gaXRzCisgIC8vLyBzYXZlZCB2YWx1ZSBtYXkgYmUgbG9hZGVkIGRpcmVjdGx5IGludG8gUEMuIFNpbmNlIGxpdmVuZXNzIHRyYWNraW5nIG9mCisgIC8vLyBwaHlzaWNhbCByZWdpc3RlcnMgdHJlYXRzIGNhbGxlZS1zYXZlZCByZWdpc3RlcnMgYXJlIGxpdmUgb3V0c2lkZSBvZgorICAvLy8gdGhlIGZ1bmN0aW9uLCBMUiB3b3VsZCBiZSB0cmVhdGVkIGFzIGxpdmUtb24tZXhpdCwgZXZlbiB0aG91Z2ggaW4gdGhlc2UKKyAgLy8vIHNjZW5hcmlvcyBpdCBpcyBub3QuIFRoaXMgZmxhZyBpcyBhZGRlZCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBzYXZlZAorICAvLy8gcmVnaXN0ZXIgZGVzY3JpYmVkIGJ5IHRoaXMgb2JqZWN0IGlzIG5vdCByZXN0b3JlZCBpbiB0aGUgZXBpbG9nLgorICAvLy8gVGhlIGxvbmctdGVybSBzb2x1dGlvbiBpcyB0byBtb2RlbCB0aGUgbGl2ZW5lc3Mgb2YgY2FsbGVlLXNhdmVkIHJlZ2lzdGVycworICAvLy8gYnkgaW1wbGljaXQgdXNlcyBvbiB0aGUgcmV0dXJuIGluc3RydWN0aW9ucywgaG93ZXZlciwgdGhlIHJlcXVpcmVkCisgIC8vLyBjaGFuZ2VzIGluIHRoZSBBUk0gYmFja2VuZCB3b3VsZCBiZSBxdWl0ZSBleHRlbnNpdmUuCisgIGJvb2wgUmVzdG9yZWQ7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgQ2FsbGVlU2F2ZWRJbmZvKHVuc2lnbmVkIFIsIGludCBGSSA9IDApCisgIDogUmVnKFIpLCBGcmFtZUlkeChGSSksIFJlc3RvcmVkKHRydWUpIHt9CisKKyAgLy8gQWNjZXNzb3JzLgorICB1bnNpZ25lZCBnZXRSZWcoKSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcmV0dXJuIFJlZzsgfQorICBpbnQgZ2V0RnJhbWVJZHgoKSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHsgcmV0dXJuIEZyYW1lSWR4OyB9CisgIHZvaWQgc2V0RnJhbWVJZHgoaW50IEZJKSAgICAgICAgICAgICAgICAgICAgICAgeyBGcmFtZUlkeCA9IEZJOyB9CisgIGJvb2wgaXNSZXN0b3JlZCgpICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgeyByZXR1cm4gUmVzdG9yZWQ7IH0KKyAgdm9pZCBzZXRSZXN0b3JlZChib29sIFIpICAgICAgICAgICAgICAgICAgICAgICB7IFJlc3RvcmVkID0gUjsgfQorfTsKKworLy8vIFRoZSBNYWNoaW5lRnJhbWVJbmZvIGNsYXNzIHJlcHJlc2VudHMgYW4gYWJzdHJhY3Qgc3RhY2sgZnJhbWUgdW50aWwKKy8vLyBwcm9sb2cvZXBpbG9nIGNvZGUgaXMgaW5zZXJ0ZWQuICBUaGlzIGNsYXNzIGlzIGtleSB0byBhbGxvd2luZyBzdGFjayBmcmFtZQorLy8vIHJlcHJlc2VudGF0aW9uIG9wdGltaXphdGlvbnMsIHN1Y2ggYXMgZnJhbWUgcG9pbnRlciBlbGltaW5hdGlvbi4gIEl0IGFsc28KKy8vLyBhbGxvd3MgbW9yZSBtdW5kYW5lIChidXQgc3RpbGwgaW1wb3J0YW50KSBvcHRpbWl6YXRpb25zLCBzdWNoIGFzIHJlb3JkZXJpbmcKKy8vLyBvZiBhYnN0cmFjdCBvYmplY3RzIG9uIHRoZSBzdGFjayBmcmFtZS4KKy8vLworLy8vIFRvIHN1cHBvcnQgdGhpcywgdGhlIGNsYXNzIGFzc2lnbnMgdW5pcXVlIGludGVnZXIgaWRlbnRpZmllcnMgdG8gc3RhY2sKKy8vLyBvYmplY3RzIHJlcXVlc3RlZCBjbGllbnRzLiAgVGhlc2UgaWRlbnRpZmllcnMgYXJlIG5lZ2F0aXZlIGludGVnZXJzIGZvcgorLy8vIGZpeGVkIHN0YWNrIG9iamVjdHMgKHN1Y2ggYXMgYXJndW1lbnRzIHBhc3NlZCBvbiB0aGUgc3RhY2spIG9yIG5vbm5lZ2F0aXZlCisvLy8gZm9yIG9iamVjdHMgdGhhdCBtYXkgYmUgcmVvcmRlcmVkLiAgSW5zdHJ1Y3Rpb25zIHdoaWNoIHJlZmVyIHRvIHN0YWNrCisvLy8gb2JqZWN0cyB1c2UgYSBzcGVjaWFsIE1PX0ZyYW1lSW5kZXggb3BlcmFuZCB0byByZXByZXNlbnQgdGhlc2UgZnJhbWUKKy8vLyBpbmRleGVzLgorLy8vCisvLy8gQmVjYXVzZSB0aGlzIGNsYXNzIGtlZXBzIHRyYWNrIG9mIGFsbCByZWZlcmVuY2VzIHRvIHRoZSBzdGFjayBmcmFtZSwgaXQKKy8vLyBrbm93cyB3aGVuIGEgdmFyaWFibGUgc2l6ZWQgb2JqZWN0IGlzIGFsbG9jYXRlZCBvbiB0aGUgc3RhY2suICBUaGlzIGlzIHRoZQorLy8vIHNvbGUgY29uZGl0aW9uIHdoaWNoIHByZXZlbnRzIGZyYW1lIHBvaW50ZXIgZWxpbWluYXRpb24sIHdoaWNoIGlzIGFuCisvLy8gaW1wb3J0YW50IG9wdGltaXphdGlvbiBvbiByZWdpc3Rlci1wb29yIGFyY2hpdGVjdHVyZXMuICBCZWNhdXNlIG9yaWdpbmFsCisvLy8gdmFyaWFibGUgc2l6ZWQgYWxsb2NhJ3MgaW4gdGhlIHNvdXJjZSBwcm9ncmFtIGFyZSB0aGUgb25seSBzb3VyY2Ugb2YKKy8vLyB2YXJpYWJsZSBzaXplZCBzdGFjayBvYmplY3RzLCBpdCBpcyBzYWZlIHRvIGRlY2lkZSB3aGV0aGVyIHRoZXJlIHdpbGwgYmUKKy8vLyBhbnkgdmFyaWFibGUgc2l6ZWQgb2JqZWN0cyBiZWZvcmUgYWxsIHN0YWNrIG9iamVjdHMgYXJlIGtub3duIChmb3IKKy8vLyBleGFtcGxlLCByZWdpc3RlciBhbGxvY2F0b3Igc3BpbGwgY29kZSBuZXZlciBuZWVkcyB2YXJpYWJsZSBzaXplZAorLy8vIG9iamVjdHMpLgorLy8vCisvLy8gV2hlbiBwcm9sb2cvZXBpbG9nIGNvZGUgZW1pc3Npb24gaXMgcGVyZm9ybWVkLCB0aGUgZmluYWwgc3RhY2sgZnJhbWUgaXMKKy8vLyBidWlsdCBhbmQgdGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIGFyZSBtb2RpZmllZCB0byByZWZlciB0byB0aGUgYWN0dWFsCisvLy8gc3RhY2sgb2Zmc2V0cyBvZiB0aGUgb2JqZWN0LCBlbGltaW5hdGluZyBhbGwgTU9fRnJhbWVJbmRleCBvcGVyYW5kcyBmcm9tCisvLy8gdGhlIHByb2dyYW0uCisvLy8KKy8vLyBAYnJpZWYgQWJzdHJhY3QgU3RhY2sgRnJhbWUgSW5mb3JtYXRpb24KK2NsYXNzIE1hY2hpbmVGcmFtZUluZm8geworCisgIC8vIFJlcHJlc2VudCBhIHNpbmdsZSBvYmplY3QgYWxsb2NhdGVkIG9uIHRoZSBzdGFjay4KKyAgc3RydWN0IFN0YWNrT2JqZWN0IHsKKyAgICAvLyBUaGUgb2Zmc2V0IG9mIHRoaXMgb2JqZWN0IGZyb20gdGhlIHN0YWNrIHBvaW50ZXIgb24gZW50cnkgdG8KKyAgICAvLyB0aGUgZnVuY3Rpb24uICBUaGlzIGZpZWxkIGhhcyBubyBtZWFuaW5nIGZvciBhIHZhcmlhYmxlIHNpemVkIGVsZW1lbnQuCisgICAgaW50NjRfdCBTUE9mZnNldDsKKworICAgIC8vIFRoZSBzaXplIG9mIHRoaXMgb2JqZWN0IG9uIHRoZSBzdGFjay4gMCBtZWFucyBhIHZhcmlhYmxlIHNpemVkIG9iamVjdCwKKyAgICAvLyB+MFVMTCBtZWFucyBhIGRlYWQgb2JqZWN0LgorICAgIHVpbnQ2NF90IFNpemU7CisKKyAgICAvLyBUaGUgcmVxdWlyZWQgYWxpZ25tZW50IG9mIHRoaXMgc3RhY2sgc2xvdC4KKyAgICB1bnNpZ25lZCBBbGlnbm1lbnQ7CisKKyAgICAvLyBJZiB0cnVlLCB0aGUgdmFsdWUgb2YgdGhlIHN0YWNrIG9iamVjdCBpcyBzZXQgYmVmb3JlCisgICAgLy8gZW50ZXJpbmcgdGhlIGZ1bmN0aW9uIGFuZCBpcyBub3QgbW9kaWZpZWQgaW5zaWRlIHRoZSBmdW5jdGlvbi4gQnkKKyAgICAvLyBkZWZhdWx0LCBmaXhlZCBvYmplY3RzIGFyZSBpbW11dGFibGUgdW5sZXNzIG1hcmtlZCBvdGhlcndpc2UuCisgICAgYm9vbCBpc0ltbXV0YWJsZTsKKworICAgIC8vIElmIHRydWUgdGhlIHN0YWNrIG9iamVjdCBpcyB1c2VkIGFzIHNwaWxsIHNsb3QuIEl0CisgICAgLy8gY2Fubm90IGFsaWFzIGFueSBvdGhlciBtZW1vcnkgb2JqZWN0cy4KKyAgICBib29sIGlzU3BpbGxTbG90OworCisgICAgLy8vIElmIHRydWUsIHRoaXMgc3RhY2sgc2xvdCBpcyB1c2VkIHRvIHNwaWxsIGEgdmFsdWUgKGNvdWxkIGJlIGRlb3B0CisgICAgLy8vIGFuZC9vciBHQyByZWxhdGVkKSBvdmVyIGEgc3RhdGVwb2ludC4gV2Uga25vdyB0aGF0IHRoZSBhZGRyZXNzIG9mIHRoZQorICAgIC8vLyBzbG90IGNhbid0IGFsaWFzIGFueSBMTFZNIElSIHZhbHVlLiAgVGhpcyBpcyB2ZXJ5IHNpbWlsYXIgdG8gYSBTcGlsbAorICAgIC8vLyBTbG90LCBidXQgaXMgY3JlYXRlZCBieSBzdGF0ZXBvaW50IGxvd2VyaW5nIGlzIFNlbGVjdGlvbkRBRywgbm90IHRoZQorICAgIC8vLyByZWdpc3RlciBhbGxvY2F0b3IuCisgICAgYm9vbCBpc1N0YXRlcG9pbnRTcGlsbFNsb3QgPSBmYWxzZTsKKworICAgIC8vLyBJZGVudGlmaWVyIGZvciBzdGFjayBtZW1vcnkgdHlwZSBhbmFsYWdvdXMgdG8gYWRkcmVzcyBzcGFjZS4gSWYgdGhpcyBpcworICAgIC8vLyBub24tMCwgdGhlIG1lYW5pbmcgaXMgdGFyZ2V0IGRlZmluZWQuIE9mZnNldHMgY2Fubm90IGJlIGRpcmVjdGx5CisgICAgLy8vIGNvbXBhcmVkIGJldHdlZW4gb2JqZWN0cyB3aXRoIGRpZmZlcmVudCBzdGFjayBJRHMuIFRoZSBvYmplY3QgbWF5IG5vdAorICAgIC8vLyBuZWNlc3NhcmlseSByZXNpZGUgaW4gdGhlIHNhbWUgY29udGlndW91cyBtZW1vcnkgYmxvY2sgYXMgb3RoZXIgc3RhY2sKKyAgICAvLy8gb2JqZWN0cy4gT2JqZWN0cyB3aXRoIGRpZmZlcmluZyBzdGFjayBJRHMgc2hvdWxkIG5vdCBiZSBtZXJnZWQgb3IKKyAgICAvLy8gcmVwbGFjZWQgc3Vic3RpdHV0ZWQgZm9yIGVhY2ggb3RoZXIuCisgICAgdWludDhfdCBTdGFja0lEOworCisgICAgLy8vIElmIHRoaXMgc3RhY2sgb2JqZWN0IGlzIG9yaWdpbmF0ZWQgZnJvbSBhbiBBbGxvY2EgaW5zdHJ1Y3Rpb24KKyAgICAvLy8gdGhpcyB2YWx1ZSBzYXZlcyB0aGUgb3JpZ2luYWwgSVIgYWxsb2NhdGlvbi4gQ2FuIGJlIE5VTEwuCisgICAgY29uc3QgQWxsb2NhSW5zdCAqQWxsb2NhOworCisgICAgLy8gSWYgdHJ1ZSwgdGhlIG9iamVjdCB3YXMgbWFwcGVkIGludG8gdGhlIGxvY2FsIGZyYW1lCisgICAgLy8gYmxvY2sgYW5kIGRvZXNuJ3QgbmVlZCBhZGRpdGlvbmFsIGhhbmRsaW5nIGZvciBhbGxvY2F0aW9uIGJleW9uZCB0aGF0LgorICAgIGJvb2wgUHJlQWxsb2NhdGVkID0gZmFsc2U7CisKKyAgICAvLyBJZiB0cnVlLCBhbiBMTFZNIElSIHZhbHVlIG1pZ2h0IHBvaW50IHRvIHRoaXMgb2JqZWN0LgorICAgIC8vIE5vcm1hbGx5LCBzcGlsbCBzbG90cyBhbmQgZml4ZWQtb2Zmc2V0IG9iamVjdHMgZG9uJ3QgYWxpYXMgSVItYWNjZXNzaWJsZQorICAgIC8vIG9iamVjdHMsIGJ1dCB0aGVyZSBhcmUgZXhjZXB0aW9ucyAob24gUG93ZXJQQywgZm9yIGV4YW1wbGUsIHNvbWUgYnl2YWwKKyAgICAvLyBhcmd1bWVudHMgaGF2ZSBBQkktcHJlc2NyaWJlZCBvZmZzZXRzKS4KKyAgICBib29sIGlzQWxpYXNlZDsKKworICAgIC8vLyBJZiB0cnVlLCB0aGUgb2JqZWN0IGhhcyBiZWVuIHplcm8tZXh0ZW5kZWQuCisgICAgYm9vbCBpc1pFeHQgPSBmYWxzZTsKKworICAgIC8vLyBJZiB0cnVlLCB0aGUgb2JqZWN0IGhhcyBiZWVuIHplcm8tZXh0ZW5kZWQuCisgICAgYm9vbCBpc1NFeHQgPSBmYWxzZTsKKworICAgIFN0YWNrT2JqZWN0KHVpbnQ2NF90IFNpemUsIHVuc2lnbmVkIEFsaWdubWVudCwgaW50NjRfdCBTUE9mZnNldCwKKyAgICAgICAgICAgICAgICBib29sIElzSW1tdXRhYmxlLCBib29sIElzU3BpbGxTbG90LCBjb25zdCBBbGxvY2FJbnN0ICpBbGxvY2EsCisgICAgICAgICAgICAgICAgYm9vbCBJc0FsaWFzZWQsIHVpbnQ4X3QgU3RhY2tJRCA9IDApCisgICAgICA6IFNQT2Zmc2V0KFNQT2Zmc2V0KSwgU2l6ZShTaXplKSwgQWxpZ25tZW50KEFsaWdubWVudCksCisgICAgICAgIGlzSW1tdXRhYmxlKElzSW1tdXRhYmxlKSwgaXNTcGlsbFNsb3QoSXNTcGlsbFNsb3QpLAorICAgICAgICBTdGFja0lEKFN0YWNrSUQpLCBBbGxvY2EoQWxsb2NhKSwgaXNBbGlhc2VkKElzQWxpYXNlZCkge30KKyAgfTsKKworICAvLy8gVGhlIGFsaWdubWVudCBvZiB0aGUgc3RhY2suCisgIHVuc2lnbmVkIFN0YWNrQWxpZ25tZW50OworCisgIC8vLyBDYW4gdGhlIHN0YWNrIGJlIHJlYWxpZ25lZC4gVGhpcyBjYW4gYmUgZmFsc2UgaWYgdGhlIHRhcmdldCBkb2VzIG5vdAorICAvLy8gc3VwcG9ydCBzdGFjayByZWFsaWdubWVudCwgb3IgaWYgdGhlIHVzZXIgYXNrcyB1cyBub3QgdG8gcmVhbGlnbiB0aGUKKyAgLy8vIHN0YWNrLiBJbiB0aGlzIHNpdHVhdGlvbiwgb3ZlcmFsaWduZWQgYWxsb2NhcyBhcmUgYWxsIHRyZWF0ZWQgYXMgZHluYW1pYworICAvLy8gYWxsb2NhdGlvbnMgYW5kIHRoZSB0YXJnZXQgbXVzdCBoYW5kbGUgdGhlbSBhcyBwYXJ0IG9mIERZTkFNSUNfU1RBQ0tBTExPQworICAvLy8gbG93ZXJpbmcuIEFsbCBub24tYWxsb2NhIHN0YWNrIG9iamVjdHMgaGF2ZSB0aGVpciBhbGlnbm1lbnQgY2xhbXBlZCB0byB0aGUKKyAgLy8vIGJhc2UgQUJJIHN0YWNrIGFsaWdubWVudC4KKyAgLy8vIEZJWE1FOiBUaGVyZSBpcyByb29tIGZvciBpbXByb3ZlbWVudCBpbiB0aGlzIGNhc2UsIGluIHRlcm1zIG9mCisgIC8vLyBncm91cGluZyBvdmVyYWxpZ25lZCBhbGxvY2FzIGludG8gYSAic2Vjb25kYXJ5IHN0YWNrIGZyYW1lIiBhbmQKKyAgLy8vIHRoZW4gb25seSB1c2UgYSBzaW5nbGUgYWxsb2NhIHRvIGFsbG9jYXRlIHRoaXMgZnJhbWUgYW5kIG9ubHkgYQorICAvLy8gc2luZ2xlIHZpcnR1YWwgcmVnaXN0ZXIgdG8gYWNjZXNzIGl0LiBDdXJyZW50bHksIHdpdGhvdXQgc3VjaCBhbgorICAvLy8gb3B0aW1pemF0aW9uLCBlYWNoIHN1Y2ggYWxsb2NhIGdldHMgaXRzIG93biBkeW5hbWljIHJlYWxpZ25tZW50LgorICBib29sIFN0YWNrUmVhbGlnbmFibGU7CisKKyAgLy8vIFdoZXRoZXIgdGhlIGZ1bmN0aW9uIGhhcyB0aGUgXGMgYWxpZ25zdGFjayBhdHRyaWJ1dGUuCisgIGJvb2wgRm9yY2VkUmVhbGlnbjsKKworICAvLy8gVGhlIGxpc3Qgb2Ygc3RhY2sgb2JqZWN0cyBhbGxvY2F0ZWQuCisgIHN0ZDo6dmVjdG9yPFN0YWNrT2JqZWN0PiBPYmplY3RzOworCisgIC8vLyBUaGlzIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgZml4ZWQgb2JqZWN0cyBjb250YWluZWQgb24KKyAgLy8vIHRoZSBzdGFjay4gIEJlY2F1c2UgZml4ZWQgb2JqZWN0cyBhcmUgc3RvcmVkIGF0IGEgbmVnYXRpdmUgaW5kZXggaW4gdGhlCisgIC8vLyBPYmplY3RzIGxpc3QsIHRoaXMgaXMgYWxzbyB0aGUgaW5kZXggdG8gdGhlIDB0aCBvYmplY3QgaW4gdGhlIGxpc3QuCisgIHVuc2lnbmVkIE51bUZpeGVkT2JqZWN0cyA9IDA7CisKKyAgLy8vIFRoaXMgYm9vbGVhbiBrZWVwcyB0cmFjayBvZiB3aGV0aGVyIGFueSB2YXJpYWJsZQorICAvLy8gc2l6ZWQgb2JqZWN0cyBoYXZlIGJlZW4gYWxsb2NhdGVkIHlldC4KKyAgYm9vbCBIYXNWYXJTaXplZE9iamVjdHMgPSBmYWxzZTsKKworICAvLy8gVGhpcyBib29sZWFuIGtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgdGhlcmUgaXMgYSBjYWxsCisgIC8vLyB0byBidWlsdGluIFxAbGx2bS5mcmFtZWFkZHJlc3MuCisgIGJvb2wgRnJhbWVBZGRyZXNzVGFrZW4gPSBmYWxzZTsKKworICAvLy8gVGhpcyBib29sZWFuIGtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgdGhlcmUgaXMgYSBjYWxsCisgIC8vLyB0byBidWlsdGluIFxAbGx2bS5yZXR1cm5hZGRyZXNzLgorICBib29sIFJldHVybkFkZHJlc3NUYWtlbiA9IGZhbHNlOworCisgIC8vLyBUaGlzIGJvb2xlYW4ga2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGVyZSBpcyBhIGNhbGwKKyAgLy8vIHRvIGJ1aWx0aW4gXEBsbHZtLmV4cGVyaW1lbnRhbC5zdGFja21hcC4KKyAgYm9vbCBIYXNTdGFja01hcCA9IGZhbHNlOworCisgIC8vLyBUaGlzIGJvb2xlYW4ga2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGVyZSBpcyBhIGNhbGwKKyAgLy8vIHRvIGJ1aWx0aW4gXEBsbHZtLmV4cGVyaW1lbnRhbC5wYXRjaHBvaW50LgorICBib29sIEhhc1BhdGNoUG9pbnQgPSBmYWxzZTsKKworICAvLy8gVGhlIHByb2xvZy9lcGlsb2cgY29kZSBpbnNlcnRlciBjYWxjdWxhdGVzIHRoZSBmaW5hbCBzdGFjaworICAvLy8gb2Zmc2V0cyBmb3IgYWxsIG9mIHRoZSBmaXhlZCBzaXplIG9iamVjdHMsIHVwZGF0aW5nIHRoZSBPYmplY3RzIGxpc3QKKyAgLy8vIGFib3ZlLiAgSXQgdGhlbiB1cGRhdGVzIFN0YWNrU2l6ZSB0byBjb250YWluIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBuZWVkCisgIC8vLyB0byBiZSBhbGxvY2F0ZWQgb24gZW50cnkgdG8gdGhlIGZ1bmN0aW9uLgorICB1aW50NjRfdCBTdGFja1NpemUgPSAwOworCisgIC8vLyBUaGUgYW1vdW50IHRoYXQgYSBmcmFtZSBvZmZzZXQgbmVlZHMgdG8gYmUgYWRqdXN0ZWQgdG8KKyAgLy8vIGhhdmUgdGhlIGFjdHVhbCBvZmZzZXQgZnJvbSB0aGUgc3RhY2svZnJhbWUgcG9pbnRlci4gIFRoZSBleGFjdCB1c2FnZSBvZgorICAvLy8gdGhpcyBpcyB0YXJnZXQtZGVwZW5kZW50LCBidXQgaXQgaXMgdHlwaWNhbGx5IHVzZWQgdG8gYWRqdXN0IGJldHdlZW4KKyAgLy8vIFNQLXJlbGF0aXZlIGFuZCBGUC1yZWxhdGl2ZSBvZmZzZXRzLiAgRS5HLiwgaWYgb2JqZWN0cyBhcmUgYWNjZXNzZWQgdmlhCisgIC8vLyBTUCB0aGVuIE9mZnNldEFkanVzdG1lbnQgaXMgemVybzsgaWYgRlAgaXMgdXNlZCwgT2Zmc2V0QWRqdXN0bWVudCBpcyBzZXQKKyAgLy8vIHRvIHRoZSBkaXN0YW5jZSBiZXR3ZWVuIHRoZSBpbml0aWFsIFNQIGFuZCB0aGUgdmFsdWUgaW4gRlAuICBGb3IgbWFueQorICAvLy8gdGFyZ2V0cywgdGhpcyB2YWx1ZSBpcyBvbmx5IHVzZWQgd2hlbiBnZW5lcmF0aW5nIGRlYnVnIGluZm8gKHZpYQorICAvLy8gVGFyZ2V0UmVnaXN0ZXJJbmZvOjpnZXRGcmFtZUluZGV4UmVmZXJlbmNlKTsgd2hlbiBnZW5lcmF0aW5nIGNvZGUsIHRoZQorICAvLy8gY29ycmVzcG9uZGluZyBhZGp1c3RtZW50cyBhcmUgcGVyZm9ybWVkIGRpcmVjdGx5LgorICBpbnQgT2Zmc2V0QWRqdXN0bWVudCA9IDA7CisKKyAgLy8vIFRoZSBwcm9sb2cvZXBpbG9nIGNvZGUgaW5zZXJ0ZXIgbWF5IHByb2Nlc3Mgb2JqZWN0cyB0aGF0IHJlcXVpcmUgZ3JlYXRlcgorICAvLy8gYWxpZ25tZW50IHRoYW4gdGhlIGRlZmF1bHQgYWxpZ25tZW50IHRoZSB0YXJnZXQgcHJvdmlkZXMuCisgIC8vLyBUbyBoYW5kbGUgdGhpcywgTWF4QWxpZ25tZW50IGlzIHNldCB0byB0aGUgbWF4aW11bSBhbGlnbm1lbnQKKyAgLy8vIG5lZWRlZCBieSB0aGUgb2JqZWN0cyBvbiB0aGUgY3VycmVudCBmcmFtZS4gIElmIHRoaXMgaXMgZ3JlYXRlciB0aGFuIHRoZQorICAvLy8gbmF0aXZlIGFsaWdubWVudCBtYWludGFpbmVkIGJ5IHRoZSBjb21waWxlciwgZHluYW1pYyBhbGlnbm1lbnQgY29kZSB3aWxsCisgIC8vLyBiZSBuZWVkZWQuCisgIC8vLworICB1bnNpZ25lZCBNYXhBbGlnbm1lbnQgPSAwOworCisgIC8vLyBTZXQgdG8gdHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIGFkanVzdHMgdGhlIHN0YWNrIC0tIGUuZy4sCisgIC8vLyB3aGVuIGNhbGxpbmcgYW5vdGhlciBmdW5jdGlvbi4gVGhpcyBpcyBvbmx5IHZhbGlkIGR1cmluZyBhbmQgYWZ0ZXIKKyAgLy8vIHByb2xvZy9lcGlsb2cgY29kZSBpbnNlcnRpb24uCisgIGJvb2wgQWRqdXN0c1N0YWNrID0gZmFsc2U7CisKKyAgLy8vIFNldCB0byB0cnVlIGlmIHRoaXMgZnVuY3Rpb24gaGFzIGFueSBmdW5jdGlvbiBjYWxscy4KKyAgYm9vbCBIYXNDYWxscyA9IGZhbHNlOworCisgIC8vLyBUaGUgZnJhbWUgaW5kZXggZm9yIHRoZSBzdGFjayBwcm90ZWN0b3IuCisgIGludCBTdGFja1Byb3RlY3RvcklkeCA9IC0xOworCisgIC8vLyBUaGUgZnJhbWUgaW5kZXggZm9yIHRoZSBmdW5jdGlvbiBjb250ZXh0LiBVc2VkIGZvciBTakxqIGV4Y2VwdGlvbnMuCisgIGludCBGdW5jdGlvbkNvbnRleHRJZHggPSAtMTsKKworICAvLy8gVGhpcyBjb250YWlucyB0aGUgc2l6ZSBvZiB0aGUgbGFyZ2VzdCBjYWxsIGZyYW1lIGlmIHRoZSB0YXJnZXQgdXNlcyBmcmFtZQorICAvLy8gc2V0dXAvZGVzdHJveSBwc2V1ZG8gaW5zdHJ1Y3Rpb25zIChhcyBkZWZpbmVkIGluIHRoZSBUYXJnZXRGcmFtZUluZm8KKyAgLy8vIGNsYXNzKS4gIFRoaXMgaW5mb3JtYXRpb24gaXMgaW1wb3J0YW50IGZvciBmcmFtZSBwb2ludGVyIGVsaW1pbmF0aW9uLgorICAvLy8gSXQgaXMgb25seSB2YWxpZCBkdXJpbmcgYW5kIGFmdGVyIHByb2xvZy9lcGlsb2cgY29kZSBpbnNlcnRpb24uCisgIHVuc2lnbmVkIE1heENhbGxGcmFtZVNpemUgPSB+MHU7CisKKyAgLy8vIFRoZSBwcm9sb2cvZXBpbG9nIGNvZGUgaW5zZXJ0ZXIgZmlsbHMgaW4gdGhpcyB2ZWN0b3Igd2l0aCBlYWNoCisgIC8vLyBjYWxsZWUgc2F2ZWQgcmVnaXN0ZXIgc2F2ZWQgaW4gdGhlIGZyYW1lLiAgQmV5b25kIGl0cyB1c2UgYnkgdGhlIHByb2xvZy8KKyAgLy8vIGVwaWxvZyBjb2RlIGluc2VydGVyLCB0aGlzIGRhdGEgdXNlZCBmb3IgZGVidWcgaW5mbyBhbmQgZXhjZXB0aW9uCisgIC8vLyBoYW5kbGluZy4KKyAgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiBDU0luZm87CisKKyAgLy8vIEhhcyBDU0luZm8gYmVlbiBzZXQgeWV0PworICBib29sIENTSVZhbGlkID0gZmFsc2U7CisKKyAgLy8vIFJlZmVyZW5jZXMgdG8gZnJhbWUgaW5kaWNlcyB3aGljaCBhcmUgbWFwcGVkCisgIC8vLyBpbnRvIHRoZSBsb2NhbCBmcmFtZSBhbGxvY2F0aW9uIGJsb2NrLiA8RnJhbWVJZHgsIExvY2FsT2Zmc2V0PgorICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8aW50LCBpbnQ2NF90PiwgMzI+IExvY2FsRnJhbWVPYmplY3RzOworCisgIC8vLyBTaXplIG9mIHRoZSBwcmUtYWxsb2NhdGVkIGxvY2FsIGZyYW1lIGJsb2NrLgorICBpbnQ2NF90IExvY2FsRnJhbWVTaXplID0gMDsKKworICAvLy8gUmVxdWlyZWQgYWxpZ25tZW50IG9mIHRoZSBsb2NhbCBvYmplY3QgYmxvYiwgd2hpY2ggaXMgdGhlIHN0cmljdGVzdAorICAvLy8gYWxpZ25tZW50IG9mIGFueSBvYmplY3QgaW4gaXQuCisgIHVuc2lnbmVkIExvY2FsRnJhbWVNYXhBbGlnbiA9IDA7CisKKyAgLy8vIFdoZXRoZXIgdGhlIGxvY2FsIG9iamVjdCBibG9iIG5lZWRzIHRvIGJlIGFsbG9jYXRlZCB0b2dldGhlci4gSWYgbm90LAorICAvLy8gUEVJIHNob3VsZCBpZ25vcmUgdGhlIGlzUHJlQWxsb2NhdGVkIGZsYWdzIG9uIHRoZSBzdGFjayBvYmplY3RzIGFuZAorICAvLy8ganVzdCBhbGxvY2F0ZSB0aGVtIG5vcm1hbGx5LgorICBib29sIFVzZUxvY2FsU3RhY2tBbGxvY2F0aW9uQmxvY2sgPSBmYWxzZTsKKworICAvLy8gVHJ1ZSBpZiB0aGUgZnVuY3Rpb24gZHluYW1pY2FsbHkgYWRqdXN0cyB0aGUgc3RhY2sgcG9pbnRlciB0aHJvdWdoIHNvbWUKKyAgLy8vIG9wYXF1ZSBtZWNoYW5pc20gbGlrZSBpbmxpbmUgYXNzZW1ibHkgb3IgV2luMzIgRUguCisgIGJvb2wgSGFzT3BhcXVlU1BBZGp1c3RtZW50ID0gZmFsc2U7CisKKyAgLy8vIFRydWUgaWYgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIG9wZXJhdGlvbnMgd2hpY2ggd2lsbCBsb3dlciBkb3duIHRvCisgIC8vLyBpbnN0cnVjdGlvbnMgd2hpY2ggbWFuaXB1bGF0ZSB0aGUgc3RhY2sgcG9pbnRlci4KKyAgYm9vbCBIYXNDb3B5SW1wbHlpbmdTdGFja0FkanVzdG1lbnQgPSBmYWxzZTsKKworICAvLy8gVHJ1ZSBpZiB0aGUgZnVuY3Rpb24gY29udGFpbnMgYSBjYWxsIHRvIHRoZSBsbHZtLnZhc3RhcnQgaW50cmluc2ljLgorICBib29sIEhhc1ZBU3RhcnQgPSBmYWxzZTsKKworICAvLy8gVHJ1ZSBpZiB0aGlzIGlzIGEgdmFyYXJncyBmdW5jdGlvbiB0aGF0IGNvbnRhaW5zIGEgbXVzdHRhaWwgY2FsbC4KKyAgYm9vbCBIYXNNdXN0VGFpbEluVmFyQXJnRnVuYyA9IGZhbHNlOworCisgIC8vLyBUcnVlIGlmIHRoaXMgZnVuY3Rpb24gY29udGFpbnMgYSB0YWlsIGNhbGwuIElmIHNvIGltbXV0YWJsZSBvYmplY3RzIGxpa2UKKyAgLy8vIGZ1bmN0aW9uIGFyZ3VtZW50cyBhcmUgbm8gbG9uZ2VyIHNvLiBBIHRhaWwgY2FsbCAqY2FuKiBvdmVycmlkZSBmaXhlZAorICAvLy8gc3RhY2sgb2JqZWN0cyBsaWtlIGFyZ3VtZW50cyBzbyB3ZSBjYW4ndCB0cmVhdCB0aGVtIGFzIGltbXV0YWJsZS4KKyAgYm9vbCBIYXNUYWlsQ2FsbCA9IGZhbHNlOworCisgIC8vLyBOb3QgbnVsbCwgaWYgc2hyaW5rLXdyYXBwaW5nIGZvdW5kIGEgYmV0dGVyIHBsYWNlIGZvciB0aGUgcHJvbG9ndWUuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpTYXZlID0gbnVsbHB0cjsKKyAgLy8vIE5vdCBudWxsLCBpZiBzaHJpbmstd3JhcHBpbmcgZm91bmQgYSBiZXR0ZXIgcGxhY2UgZm9yIHRoZSBlcGlsb2d1ZS4KKyAgTWFjaGluZUJhc2ljQmxvY2sgKlJlc3RvcmUgPSBudWxscHRyOworCitwdWJsaWM6CisgIGV4cGxpY2l0IE1hY2hpbmVGcmFtZUluZm8odW5zaWduZWQgU3RhY2tBbGlnbm1lbnQsIGJvb2wgU3RhY2tSZWFsaWduYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEZvcmNlZFJlYWxpZ24pCisgICAgICA6IFN0YWNrQWxpZ25tZW50KFN0YWNrQWxpZ25tZW50KSwgU3RhY2tSZWFsaWduYWJsZShTdGFja1JlYWxpZ25hYmxlKSwKKyAgICAgICAgRm9yY2VkUmVhbGlnbihGb3JjZWRSZWFsaWduKSB7fQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IHN0YWNrIG9iamVjdHMgaW4gdGhpcyBmdW5jdGlvbi4KKyAgYm9vbCBoYXNTdGFja09iamVjdHMoKSBjb25zdCB7IHJldHVybiAhT2JqZWN0cy5lbXB0eSgpOyB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgYW55IHRpbWUgYWZ0ZXIgaW5zdHJ1Y3Rpb24KKyAgLy8vIHNlbGVjdGlvbiBpcyBjb21wbGV0ZSB0byBkZXRlcm1pbmUgaWYgdGhlIHN0YWNrIGZyYW1lIGZvciB0aGlzIGZ1bmN0aW9uCisgIC8vLyBjb250YWlucyBhbnkgdmFyaWFibGUgc2l6ZWQgb2JqZWN0cy4KKyAgYm9vbCBoYXNWYXJTaXplZE9iamVjdHMoKSBjb25zdCB7IHJldHVybiBIYXNWYXJTaXplZE9iamVjdHM7IH0KKworICAvLy8gUmV0dXJuIHRoZSBpbmRleCBmb3IgdGhlIHN0YWNrIHByb3RlY3RvciBvYmplY3QuCisgIGludCBnZXRTdGFja1Byb3RlY3RvckluZGV4KCkgY29uc3QgeyByZXR1cm4gU3RhY2tQcm90ZWN0b3JJZHg7IH0KKyAgdm9pZCBzZXRTdGFja1Byb3RlY3RvckluZGV4KGludCBJKSB7IFN0YWNrUHJvdGVjdG9ySWR4ID0gSTsgfQorICBib29sIGhhc1N0YWNrUHJvdGVjdG9ySW5kZXgoKSBjb25zdCB7IHJldHVybiBTdGFja1Byb3RlY3RvcklkeCAhPSAtMTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIGluZGV4IGZvciB0aGUgZnVuY3Rpb24gY29udGV4dCBvYmplY3QuCisgIC8vLyBUaGlzIG9iamVjdCBpcyB1c2VkIGZvciBTakxqIGV4Y2VwdGlvbnMuCisgIGludCBnZXRGdW5jdGlvbkNvbnRleHRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIEZ1bmN0aW9uQ29udGV4dElkeDsgfQorICB2b2lkIHNldEZ1bmN0aW9uQ29udGV4dEluZGV4KGludCBJKSB7IEZ1bmN0aW9uQ29udGV4dElkeCA9IEk7IH0KKworICAvLy8gVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBhbnkgdGltZSBhZnRlciBpbnN0cnVjdGlvbgorICAvLy8gc2VsZWN0aW9uIGlzIGNvbXBsZXRlIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIGNhbGwgdG8KKyAgLy8vIFxAbGx2bS5mcmFtZWFkZHJlc3MgaW4gdGhpcyBmdW5jdGlvbi4KKyAgYm9vbCBpc0ZyYW1lQWRkcmVzc1Rha2VuKCkgY29uc3QgeyByZXR1cm4gRnJhbWVBZGRyZXNzVGFrZW47IH0KKyAgdm9pZCBzZXRGcmFtZUFkZHJlc3NJc1Rha2VuKGJvb2wgVCkgeyBGcmFtZUFkZHJlc3NUYWtlbiA9IFQ7IH0KKworICAvLy8gVGhpcyBtZXRob2QgbWF5IGJlIGNhbGxlZCBhbnkgdGltZSBhZnRlcgorICAvLy8gaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIGlzIGNvbXBsZXRlIHRvIGRldGVybWluZSBpZiB0aGVyZSBpcyBhIGNhbGwgdG8KKyAgLy8vIFxAbGx2bS5yZXR1cm5hZGRyZXNzIGluIHRoaXMgZnVuY3Rpb24uCisgIGJvb2wgaXNSZXR1cm5BZGRyZXNzVGFrZW4oKSBjb25zdCB7IHJldHVybiBSZXR1cm5BZGRyZXNzVGFrZW47IH0KKyAgdm9pZCBzZXRSZXR1cm5BZGRyZXNzSXNUYWtlbihib29sIHMpIHsgUmV0dXJuQWRkcmVzc1Rha2VuID0gczsgfQorCisgIC8vLyBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGFueSB0aW1lIGFmdGVyIGluc3RydWN0aW9uCisgIC8vLyBzZWxlY3Rpb24gaXMgY29tcGxldGUgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgY2FsbCB0byBidWlsdGluCisgIC8vLyBcQGxsdm0uZXhwZXJpbWVudGFsLnN0YWNrbWFwLgorICBib29sIGhhc1N0YWNrTWFwKCkgY29uc3QgeyByZXR1cm4gSGFzU3RhY2tNYXA7IH0KKyAgdm9pZCBzZXRIYXNTdGFja01hcChib29sIHMgPSB0cnVlKSB7IEhhc1N0YWNrTWFwID0gczsgfQorCisgIC8vLyBUaGlzIG1ldGhvZCBtYXkgYmUgY2FsbGVkIGFueSB0aW1lIGFmdGVyIGluc3RydWN0aW9uCisgIC8vLyBzZWxlY3Rpb24gaXMgY29tcGxldGUgdG8gZGV0ZXJtaW5lIGlmIHRoZXJlIGlzIGEgY2FsbCB0byBidWlsdGluCisgIC8vLyBcQGxsdm0uZXhwZXJpbWVudGFsLnBhdGNocG9pbnQuCisgIGJvb2wgaGFzUGF0Y2hQb2ludCgpIGNvbnN0IHsgcmV0dXJuIEhhc1BhdGNoUG9pbnQ7IH0KKyAgdm9pZCBzZXRIYXNQYXRjaFBvaW50KGJvb2wgcyA9IHRydWUpIHsgSGFzUGF0Y2hQb2ludCA9IHM7IH0KKworICAvLy8gUmV0dXJuIHRoZSBtaW5pbXVtIGZyYW1lIG9iamVjdCBpbmRleC4KKyAgaW50IGdldE9iamVjdEluZGV4QmVnaW4oKSBjb25zdCB7IHJldHVybiAtTnVtRml4ZWRPYmplY3RzOyB9CisKKyAgLy8vIFJldHVybiBvbmUgcGFzdCB0aGUgbWF4aW11bSBmcmFtZSBvYmplY3QgaW5kZXguCisgIGludCBnZXRPYmplY3RJbmRleEVuZCgpIGNvbnN0IHsgcmV0dXJuIChpbnQpT2JqZWN0cy5zaXplKCktTnVtRml4ZWRPYmplY3RzOyB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpeGVkIG9iamVjdHMuCisgIHVuc2lnbmVkIGdldE51bUZpeGVkT2JqZWN0cygpIGNvbnN0IHsgcmV0dXJuIE51bUZpeGVkT2JqZWN0czsgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBvYmplY3RzLgorICB1bnNpZ25lZCBnZXROdW1PYmplY3RzKCkgY29uc3QgeyByZXR1cm4gT2JqZWN0cy5zaXplKCk7IH0KKworICAvLy8gTWFwIGEgZnJhbWUgaW5kZXggaW50byB0aGUgbG9jYWwgb2JqZWN0IGJsb2NrCisgIHZvaWQgbWFwTG9jYWxGcmFtZU9iamVjdChpbnQgT2JqZWN0SW5kZXgsIGludDY0X3QgT2Zmc2V0KSB7CisgICAgTG9jYWxGcmFtZU9iamVjdHMucHVzaF9iYWNrKHN0ZDo6cGFpcjxpbnQsIGludDY0X3Q+KE9iamVjdEluZGV4LCBPZmZzZXQpKTsKKyAgICBPYmplY3RzW09iamVjdEluZGV4ICsgTnVtRml4ZWRPYmplY3RzXS5QcmVBbGxvY2F0ZWQgPSB0cnVlOworICB9CisKKyAgLy8vIEdldCB0aGUgbG9jYWwgb2Zmc2V0IG1hcHBpbmcgZm9yIGEgZm9yIGFuIG9iamVjdC4KKyAgc3RkOjpwYWlyPGludCwgaW50NjRfdD4gZ2V0TG9jYWxGcmFtZU9iamVjdE1hcChpbnQgaSkgY29uc3QgeworICAgIGFzc2VydCAoaSA+PSAwICYmICh1bnNpZ25lZClpIDwgTG9jYWxGcmFtZU9iamVjdHMuc2l6ZSgpICYmCisgICAgICAgICAgICAiSW52YWxpZCBsb2NhbCBvYmplY3QgcmVmZXJlbmNlISIpOworICAgIHJldHVybiBMb2NhbEZyYW1lT2JqZWN0c1tpXTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBvYmplY3RzIGFsbG9jYXRlZCBpbnRvIHRoZSBsb2NhbCBvYmplY3QgYmxvY2suCisgIGludDY0X3QgZ2V0TG9jYWxGcmFtZU9iamVjdENvdW50KCkgY29uc3QgeyByZXR1cm4gTG9jYWxGcmFtZU9iamVjdHMuc2l6ZSgpOyB9CisKKyAgLy8vIFNldCB0aGUgc2l6ZSBvZiB0aGUgbG9jYWwgb2JqZWN0IGJsb2IuCisgIHZvaWQgc2V0TG9jYWxGcmFtZVNpemUoaW50NjRfdCBzeikgeyBMb2NhbEZyYW1lU2l6ZSA9IHN6OyB9CisKKyAgLy8vIEdldCB0aGUgc2l6ZSBvZiB0aGUgbG9jYWwgb2JqZWN0IGJsb2IuCisgIGludDY0X3QgZ2V0TG9jYWxGcmFtZVNpemUoKSBjb25zdCB7IHJldHVybiBMb2NhbEZyYW1lU2l6ZTsgfQorCisgIC8vLyBSZXF1aXJlZCBhbGlnbm1lbnQgb2YgdGhlIGxvY2FsIG9iamVjdCBibG9iLAorICAvLy8gd2hpY2ggaXMgdGhlIHN0cmljdGVzdCBhbGlnbm1lbnQgb2YgYW55IG9iamVjdCBpbiBpdC4KKyAgdm9pZCBzZXRMb2NhbEZyYW1lTWF4QWxpZ24odW5zaWduZWQgQWxpZ24pIHsgTG9jYWxGcmFtZU1heEFsaWduID0gQWxpZ247IH0KKworICAvLy8gUmV0dXJuIHRoZSByZXF1aXJlZCBhbGlnbm1lbnQgb2YgdGhlIGxvY2FsIG9iamVjdCBibG9iLgorICB1bnNpZ25lZCBnZXRMb2NhbEZyYW1lTWF4QWxpZ24oKSBjb25zdCB7IHJldHVybiBMb2NhbEZyYW1lTWF4QWxpZ247IH0KKworICAvLy8gR2V0IHdoZXRoZXIgdGhlIGxvY2FsIGFsbG9jYXRpb24gYmxvYiBzaG91bGQgYmUgYWxsb2NhdGVkIHRvZ2V0aGVyIG9yCisgIC8vLyBsZXQgUEVJIGFsbG9jYXRlIHRoZSBsb2NhbHMgaW4gaXQgZGlyZWN0bHkuCisgIGJvb2wgZ2V0VXNlTG9jYWxTdGFja0FsbG9jYXRpb25CbG9jaygpIGNvbnN0IHsKKyAgICByZXR1cm4gVXNlTG9jYWxTdGFja0FsbG9jYXRpb25CbG9jazsKKyAgfQorCisgIC8vLyBzZXRVc2VMb2NhbFN0YWNrQWxsb2NhdGlvbkJsb2NrIC0gU2V0IHdoZXRoZXIgdGhlIGxvY2FsIGFsbG9jYXRpb24gYmxvYgorICAvLy8gc2hvdWxkIGJlIGFsbG9jYXRlZCB0b2dldGhlciBvciBsZXQgUEVJIGFsbG9jYXRlIHRoZSBsb2NhbHMgaW4gaXQKKyAgLy8vIGRpcmVjdGx5LgorICB2b2lkIHNldFVzZUxvY2FsU3RhY2tBbGxvY2F0aW9uQmxvY2soYm9vbCB2KSB7CisgICAgVXNlTG9jYWxTdGFja0FsbG9jYXRpb25CbG9jayA9IHY7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIG9iamVjdCB3YXMgcHJlLWFsbG9jYXRlZCBpbnRvIHRoZSBsb2NhbCBibG9jay4KKyAgYm9vbCBpc09iamVjdFByZUFsbG9jYXRlZChpbnQgT2JqZWN0SWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KHVuc2lnbmVkKE9iamVjdElkeCtOdW1GaXhlZE9iamVjdHMpIDwgT2JqZWN0cy5zaXplKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgT2JqZWN0IElkeCEiKTsKKyAgICByZXR1cm4gT2JqZWN0c1tPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzXS5QcmVBbGxvY2F0ZWQ7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0LgorICBpbnQ2NF90IGdldE9iamVjdFNpemUoaW50IE9iamVjdElkeCkgY29uc3QgeworICAgIGFzc2VydCh1bnNpZ25lZChPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzKSA8IE9iamVjdHMuc2l6ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIE9iamVjdCBJZHghIik7CisgICAgcmV0dXJuIE9iamVjdHNbT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0c10uU2l6ZTsKKyAgfQorCisgIC8vLyBDaGFuZ2UgdGhlIHNpemUgb2YgdGhlIHNwZWNpZmllZCBzdGFjayBvYmplY3QuCisgIHZvaWQgc2V0T2JqZWN0U2l6ZShpbnQgT2JqZWN0SWR4LCBpbnQ2NF90IFNpemUpIHsKKyAgICBhc3NlcnQodW5zaWduZWQoT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0cykgPCBPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPYmplY3QgSWR4ISIpOworICAgIE9iamVjdHNbT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0c10uU2l6ZSA9IFNpemU7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBhbGlnbm1lbnQgb2YgdGhlIHNwZWNpZmllZCBzdGFjayBvYmplY3QuCisgIHVuc2lnbmVkIGdldE9iamVjdEFsaWdubWVudChpbnQgT2JqZWN0SWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KHVuc2lnbmVkKE9iamVjdElkeCtOdW1GaXhlZE9iamVjdHMpIDwgT2JqZWN0cy5zaXplKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgT2JqZWN0IElkeCEiKTsKKyAgICByZXR1cm4gT2JqZWN0c1tPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzXS5BbGlnbm1lbnQ7CisgIH0KKworICAvLy8gc2V0T2JqZWN0QWxpZ25tZW50IC0gQ2hhbmdlIHRoZSBhbGlnbm1lbnQgb2YgdGhlIHNwZWNpZmllZCBzdGFjayBvYmplY3QuCisgIHZvaWQgc2V0T2JqZWN0QWxpZ25tZW50KGludCBPYmplY3RJZHgsIHVuc2lnbmVkIEFsaWduKSB7CisgICAgYXNzZXJ0KHVuc2lnbmVkKE9iamVjdElkeCtOdW1GaXhlZE9iamVjdHMpIDwgT2JqZWN0cy5zaXplKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgT2JqZWN0IElkeCEiKTsKKyAgICBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLkFsaWdubWVudCA9IEFsaWduOworICAgIGVuc3VyZU1heEFsaWdubWVudChBbGlnbik7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSB1bmRlcmx5aW5nIEFsbG9jYSBvZiB0aGUgc3BlY2lmaWVkCisgIC8vLyBzdGFjayBvYmplY3QgaWYgaXQgZXhpc3RzLiBSZXR1cm5zIDAgaWYgbm9uZSBleGlzdHMuCisgIGNvbnN0IEFsbG9jYUluc3QqIGdldE9iamVjdEFsbG9jYXRpb24oaW50IE9iamVjdElkeCkgY29uc3QgeworICAgIGFzc2VydCh1bnNpZ25lZChPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzKSA8IE9iamVjdHMuc2l6ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIE9iamVjdCBJZHghIik7CisgICAgcmV0dXJuIE9iamVjdHNbT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0c10uQWxsb2NhOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgYXNzaWduZWQgc3RhY2sgb2Zmc2V0IG9mIHRoZSBzcGVjaWZpZWQgb2JqZWN0CisgIC8vLyBmcm9tIHRoZSBpbmNvbWluZyBzdGFjayBwb2ludGVyLgorICBpbnQ2NF90IGdldE9iamVjdE9mZnNldChpbnQgT2JqZWN0SWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KHVuc2lnbmVkKE9iamVjdElkeCtOdW1GaXhlZE9iamVjdHMpIDwgT2JqZWN0cy5zaXplKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgT2JqZWN0IElkeCEiKTsKKyAgICBhc3NlcnQoIWlzRGVhZE9iamVjdEluZGV4KE9iamVjdElkeCkgJiYKKyAgICAgICAgICAgIkdldHRpbmcgZnJhbWUgb2Zmc2V0IGZvciBhIGRlYWQgb2JqZWN0PyIpOworICAgIHJldHVybiBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLlNQT2Zmc2V0OworICB9CisKKyAgYm9vbCBpc09iamVjdFpFeHQoaW50IE9iamVjdElkeCkgY29uc3QgeworICAgIGFzc2VydCh1bnNpZ25lZChPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzKSA8IE9iamVjdHMuc2l6ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIE9iamVjdCBJZHghIik7CisgICAgcmV0dXJuIE9iamVjdHNbT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0c10uaXNaRXh0OworICB9CisKKyAgdm9pZCBzZXRPYmplY3RaRXh0KGludCBPYmplY3RJZHgsIGJvb2wgSXNaRXh0KSB7CisgICAgYXNzZXJ0KHVuc2lnbmVkKE9iamVjdElkeCtOdW1GaXhlZE9iamVjdHMpIDwgT2JqZWN0cy5zaXplKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgT2JqZWN0IElkeCEiKTsKKyAgICBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLmlzWkV4dCA9IElzWkV4dDsKKyAgfQorCisgIGJvb2wgaXNPYmplY3RTRXh0KGludCBPYmplY3RJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQodW5zaWduZWQoT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0cykgPCBPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPYmplY3QgSWR4ISIpOworICAgIHJldHVybiBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLmlzU0V4dDsKKyAgfQorCisgIHZvaWQgc2V0T2JqZWN0U0V4dChpbnQgT2JqZWN0SWR4LCBib29sIElzU0V4dCkgeworICAgIGFzc2VydCh1bnNpZ25lZChPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzKSA8IE9iamVjdHMuc2l6ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIE9iamVjdCBJZHghIik7CisgICAgT2JqZWN0c1tPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzXS5pc1NFeHQgPSBJc1NFeHQ7CisgIH0KKworICAvLy8gU2V0IHRoZSBzdGFjayBmcmFtZSBvZmZzZXQgb2YgdGhlIHNwZWNpZmllZCBvYmplY3QuIFRoZQorICAvLy8gb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIHRoZSBzdGFjayBwb2ludGVyIG9uIGVudHJ5IHRvIHRoZSBmdW5jdGlvbi4KKyAgdm9pZCBzZXRPYmplY3RPZmZzZXQoaW50IE9iamVjdElkeCwgaW50NjRfdCBTUE9mZnNldCkgeworICAgIGFzc2VydCh1bnNpZ25lZChPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzKSA8IE9iamVjdHMuc2l6ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIE9iamVjdCBJZHghIik7CisgICAgYXNzZXJ0KCFpc0RlYWRPYmplY3RJbmRleChPYmplY3RJZHgpICYmCisgICAgICAgICAgICJTZXR0aW5nIGZyYW1lIG9mZnNldCBmb3IgYSBkZWFkIG9iamVjdD8iKTsKKyAgICBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLlNQT2Zmc2V0ID0gU1BPZmZzZXQ7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtdXN0IGJlIGFsbG9jYXRlZCB0byBob2xkCisgIC8vLyBhbGwgb2YgdGhlIGZpeGVkIHNpemUgZnJhbWUgb2JqZWN0cy4gIFRoaXMgaXMgb25seSB2YWxpZCBhZnRlcgorICAvLy8gUHJvbG9nL0VwaWxvZyBjb2RlIGluc2VydGlvbiBoYXMgZmluYWxpemVkIHRoZSBzdGFjayBmcmFtZSBsYXlvdXQuCisgIHVpbnQ2NF90IGdldFN0YWNrU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFN0YWNrU2l6ZTsgfQorCisgIC8vLyBTZXQgdGhlIHNpemUgb2YgdGhlIHN0YWNrLgorICB2b2lkIHNldFN0YWNrU2l6ZSh1aW50NjRfdCBTaXplKSB7IFN0YWNrU2l6ZSA9IFNpemU7IH0KKworICAvLy8gRXN0aW1hdGUgYW5kIHJldHVybiB0aGUgc2l6ZSBvZiB0aGUgc3RhY2sgZnJhbWUuCisgIHVuc2lnbmVkIGVzdGltYXRlU3RhY2tTaXplKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIGNvcnJlY3Rpb24gZm9yIGZyYW1lIG9mZnNldHMuCisgIGludCBnZXRPZmZzZXRBZGp1c3RtZW50KCkgY29uc3QgeyByZXR1cm4gT2Zmc2V0QWRqdXN0bWVudDsgfQorCisgIC8vLyBTZXQgdGhlIGNvcnJlY3Rpb24gZm9yIGZyYW1lIG9mZnNldHMuCisgIHZvaWQgc2V0T2Zmc2V0QWRqdXN0bWVudChpbnQgQWRqKSB7IE9mZnNldEFkanVzdG1lbnQgPSBBZGo7IH0KKworICAvLy8gUmV0dXJuIHRoZSBhbGlnbm1lbnQgaW4gYnl0ZXMgdGhhdCB0aGlzIGZ1bmN0aW9uIG11c3QgYmUgYWxpZ25lZCB0bywKKyAgLy8vIHdoaWNoIGlzIGdyZWF0ZXIgdGhhbiB0aGUgZGVmYXVsdCBzdGFjayBhbGlnbm1lbnQgcHJvdmlkZWQgYnkgdGhlIHRhcmdldC4KKyAgdW5zaWduZWQgZ2V0TWF4QWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gTWF4QWxpZ25tZW50OyB9CisKKyAgLy8vIE1ha2Ugc3VyZSB0aGUgZnVuY3Rpb24gaXMgYXQgbGVhc3QgQWxpZ24gYnl0ZXMgYWxpZ25lZC4KKyAgdm9pZCBlbnN1cmVNYXhBbGlnbm1lbnQodW5zaWduZWQgQWxpZ24pOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGZ1bmN0aW9uIGFkanVzdHMgdGhlIHN0YWNrIC0tIGUuZy4sCisgIC8vLyB3aGVuIGNhbGxpbmcgYW5vdGhlciBmdW5jdGlvbi4gVGhpcyBpcyBvbmx5IHZhbGlkIGR1cmluZyBhbmQgYWZ0ZXIKKyAgLy8vIHByb2xvZy9lcGlsb2cgY29kZSBpbnNlcnRpb24uCisgIGJvb2wgYWRqdXN0c1N0YWNrKCkgY29uc3QgeyByZXR1cm4gQWRqdXN0c1N0YWNrOyB9CisgIHZvaWQgc2V0QWRqdXN0c1N0YWNrKGJvb2wgVikgeyBBZGp1c3RzU3RhY2sgPSBWOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGhhcyBhbnkgZnVuY3Rpb24gY2FsbHMuCisgIGJvb2wgaGFzQ2FsbHMoKSBjb25zdCB7IHJldHVybiBIYXNDYWxsczsgfQorICB2b2lkIHNldEhhc0NhbGxzKGJvb2wgVikgeyBIYXNDYWxscyA9IFY7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmdW5jdGlvbiBjb250YWlucyBvcGFxdWUgZHluYW1pYyBzdGFjayBhZGp1c3RtZW50cy4KKyAgYm9vbCBoYXNPcGFxdWVTUEFkanVzdG1lbnQoKSBjb25zdCB7IHJldHVybiBIYXNPcGFxdWVTUEFkanVzdG1lbnQ7IH0KKyAgdm9pZCBzZXRIYXNPcGFxdWVTUEFkanVzdG1lbnQoYm9vbCBCKSB7IEhhc09wYXF1ZVNQQWRqdXN0bWVudCA9IEI7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmdW5jdGlvbiBjb250YWlucyBvcGVyYXRpb25zIHdoaWNoIHdpbGwgbG93ZXIgZG93biB0bworICAvLy8gaW5zdHJ1Y3Rpb25zIHdoaWNoIG1hbmlwdWxhdGUgdGhlIHN0YWNrIHBvaW50ZXIuCisgIGJvb2wgaGFzQ29weUltcGx5aW5nU3RhY2tBZGp1c3RtZW50KCkgY29uc3QgeworICAgIHJldHVybiBIYXNDb3B5SW1wbHlpbmdTdGFja0FkanVzdG1lbnQ7CisgIH0KKyAgdm9pZCBzZXRIYXNDb3B5SW1wbHlpbmdTdGFja0FkanVzdG1lbnQoYm9vbCBCKSB7CisgICAgSGFzQ29weUltcGx5aW5nU3RhY2tBZGp1c3RtZW50ID0gQjsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGZ1bmN0aW9uIGNhbGxzIHRoZSBsbHZtLnZhX3N0YXJ0IGludHJpbnNpYy4KKyAgYm9vbCBoYXNWQVN0YXJ0KCkgY29uc3QgeyByZXR1cm4gSGFzVkFTdGFydDsgfQorICB2b2lkIHNldEhhc1ZBU3RhcnQoYm9vbCBCKSB7IEhhc1ZBU3RhcnQgPSBCOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gaXMgdmFyaWFkaWMgYW5kIGNvbnRhaW5zIGEgbXVzdHRhaWwgY2FsbC4KKyAgYm9vbCBoYXNNdXN0VGFpbEluVmFyQXJnRnVuYygpIGNvbnN0IHsgcmV0dXJuIEhhc011c3RUYWlsSW5WYXJBcmdGdW5jOyB9CisgIHZvaWQgc2V0SGFzTXVzdFRhaWxJblZhckFyZ0Z1bmMoYm9vbCBCKSB7IEhhc011c3RUYWlsSW5WYXJBcmdGdW5jID0gQjsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIGEgdGFpbCBjYWxsLgorICBib29sIGhhc1RhaWxDYWxsKCkgY29uc3QgeyByZXR1cm4gSGFzVGFpbENhbGw7IH0KKyAgdm9pZCBzZXRIYXNUYWlsQ2FsbCgpIHsgSGFzVGFpbENhbGwgPSB0cnVlOyB9CisKKyAgLy8vIENvbXB1dGVzIHRoZSBtYXhpbXVtIHNpemUgb2YgYSBjYWxsZnJhbWUgYW5kIHRoZSBBZGp1c3RzU3RhY2sgcHJvcGVydHkuCisgIC8vLyBUaGlzIG9ubHkgd29ya3MgZm9yIHRhcmdldHMgZGVmaW5pbmcKKyAgLy8vIFRhcmdldEluc3RySW5mbzo6Z2V0Q2FsbEZyYW1lU2V0dXBPcGNvZGUoKSwgZ2V0Q2FsbEZyYW1lRGVzdHJveU9wY29kZSgpLAorICAvLy8gYW5kIGdldEZyYW1lU2l6ZSgpLgorICAvLy8gVGhpcyBpcyB1c3VhbGx5IGNvbXB1dGVkIGJ5IHRoZSBwcm9sb2d1ZSBlcGlsb2d1ZSBpbnNlcnRlciBidXQgc29tZQorICAvLy8gdGFyZ2V0cyBtYXkgY2FsbCB0aGlzIHRvIGNvbXB1dGUgaXQgZWFybGllci4KKyAgdm9pZCBjb21wdXRlTWF4Q2FsbEZyYW1lU2l6ZShjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworICAvLy8gUmV0dXJuIHRoZSBtYXhpbXVtIHNpemUgb2YgYSBjYWxsIGZyYW1lIHRoYXQgbXVzdCBiZQorICAvLy8gYWxsb2NhdGVkIGZvciBhbiBvdXRnb2luZyBmdW5jdGlvbiBjYWxsLiAgVGhpcyBpcyBvbmx5IGF2YWlsYWJsZSBpZgorICAvLy8gQ2FsbEZyYW1lU2V0dXAvRGVzdHJveSBwc2V1ZG8gaW5zdHJ1Y3Rpb25zIGFyZSB1c2VkIGJ5IHRoZSB0YXJnZXQsIGFuZAorICAvLy8gdGhlbiBvbmx5IGR1cmluZyBvciBhZnRlciBwcm9sb2cvZXBpbG9nIGNvZGUgaW5zZXJ0aW9uLgorICAvLy8KKyAgdW5zaWduZWQgZ2V0TWF4Q2FsbEZyYW1lU2l6ZSgpIGNvbnN0IHsKKyAgICAvLyBUT0RPOiBFbmFibGUgdGhpcyBhc3NlcnQgd2hlbiB0YXJnZXRzIGFyZSBmaXhlZC4KKyAgICAvL2Fzc2VydChpc01heENhbGxGcmFtZVNpemVDb21wdXRlZCgpICYmICJNYXhDYWxsRnJhbWVTaXplIG5vdCBjb21wdXRlZCB5ZXQiKTsKKyAgICBpZiAoIWlzTWF4Q2FsbEZyYW1lU2l6ZUNvbXB1dGVkKCkpCisgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gTWF4Q2FsbEZyYW1lU2l6ZTsKKyAgfQorICBib29sIGlzTWF4Q2FsbEZyYW1lU2l6ZUNvbXB1dGVkKCkgY29uc3QgeworICAgIHJldHVybiBNYXhDYWxsRnJhbWVTaXplICE9IH4wdTsKKyAgfQorICB2b2lkIHNldE1heENhbGxGcmFtZVNpemUodW5zaWduZWQgUykgeyBNYXhDYWxsRnJhbWVTaXplID0gUzsgfQorCisgIC8vLyBDcmVhdGUgYSBuZXcgb2JqZWN0IGF0IGEgZml4ZWQgbG9jYXRpb24gb24gdGhlIHN0YWNrLgorICAvLy8gQWxsIGZpeGVkIG9iamVjdHMgc2hvdWxkIGJlIGNyZWF0ZWQgYmVmb3JlIG90aGVyIG9iamVjdHMgYXJlIGNyZWF0ZWQgZm9yCisgIC8vLyBlZmZpY2llbmN5LiBCeSBkZWZhdWx0LCBmaXhlZCBvYmplY3RzIGFyZSBub3QgcG9pbnRlZCB0byBieSBMTFZNIElSCisgIC8vLyB2YWx1ZXMuIFRoaXMgcmV0dXJucyBhbiBpbmRleCB3aXRoIGEgbmVnYXRpdmUgdmFsdWUuCisgIGludCBDcmVhdGVGaXhlZE9iamVjdCh1aW50NjRfdCBTaXplLCBpbnQ2NF90IFNQT2Zmc2V0LCBib29sIElzSW1tdXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0FsaWFzZWQgPSBmYWxzZSk7CisKKyAgLy8vIENyZWF0ZSBhIHNwaWxsIHNsb3QgYXQgYSBmaXhlZCBsb2NhdGlvbiBvbiB0aGUgc3RhY2suCisgIC8vLyBSZXR1cm5zIGFuIGluZGV4IHdpdGggYSBuZWdhdGl2ZSB2YWx1ZS4KKyAgaW50IENyZWF0ZUZpeGVkU3BpbGxTdGFja09iamVjdCh1aW50NjRfdCBTaXplLCBpbnQ2NF90IFNQT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNJbW11dGFibGUgPSBmYWxzZSk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluZGV4IGNvcnJlc3BvbmRzIHRvIGEgZml4ZWQgc3RhY2sgb2JqZWN0LgorICBib29sIGlzRml4ZWRPYmplY3RJbmRleChpbnQgT2JqZWN0SWR4KSBjb25zdCB7CisgICAgcmV0dXJuIE9iamVjdElkeCA8IDAgJiYgKE9iamVjdElkeCA+PSAtKGludClOdW1GaXhlZE9iamVjdHMpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluZGV4IGNvcnJlc3BvbmRzCisgIC8vLyB0byBhbiBvYmplY3QgdGhhdCBtaWdodCBiZSBwb2ludGVkIHRvIGJ5IGFuIExMVk0gSVIgdmFsdWUuCisgIGJvb2wgaXNBbGlhc2VkT2JqZWN0SW5kZXgoaW50IE9iamVjdElkeCkgY29uc3QgeworICAgIGFzc2VydCh1bnNpZ25lZChPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzKSA8IE9iamVjdHMuc2l6ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIE9iamVjdCBJZHghIik7CisgICAgcmV0dXJuIE9iamVjdHNbT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0c10uaXNBbGlhc2VkOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluZGV4IGNvcnJlc3BvbmRzIHRvIGFuIGltbXV0YWJsZSBvYmplY3QuCisgIGJvb2wgaXNJbW11dGFibGVPYmplY3RJbmRleChpbnQgT2JqZWN0SWR4KSBjb25zdCB7CisgICAgLy8gVGFpbCBjYWxsaW5nIGZ1bmN0aW9ucyBjYW4gY2xvYmJlciB0aGVpciBmdW5jdGlvbiBhcmd1bWVudHMuCisgICAgaWYgKEhhc1RhaWxDYWxsKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGFzc2VydCh1bnNpZ25lZChPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzKSA8IE9iamVjdHMuc2l6ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIE9iamVjdCBJZHghIik7CisgICAgcmV0dXJuIE9iamVjdHNbT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0c10uaXNJbW11dGFibGU7CisgIH0KKworICAvLy8gTWFya3MgdGhlIGltbXV0YWJpbGl0eSBvZiBhbiBvYmplY3QuCisgIHZvaWQgc2V0SXNJbW11dGFibGVPYmplY3RJbmRleChpbnQgT2JqZWN0SWR4LCBib29sIElzSW1tdXRhYmxlKSB7CisgICAgYXNzZXJ0KHVuc2lnbmVkKE9iamVjdElkeCtOdW1GaXhlZE9iamVjdHMpIDwgT2JqZWN0cy5zaXplKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgT2JqZWN0IElkeCEiKTsKKyAgICBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLmlzSW1tdXRhYmxlID0gSXNJbW11dGFibGU7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5kZXggY29ycmVzcG9uZHMgdG8gYSBzcGlsbCBzbG90LgorICBib29sIGlzU3BpbGxTbG90T2JqZWN0SW5kZXgoaW50IE9iamVjdElkeCkgY29uc3QgeworICAgIGFzc2VydCh1bnNpZ25lZChPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzKSA8IE9iamVjdHMuc2l6ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIE9iamVjdCBJZHghIik7CisgICAgcmV0dXJuIE9iamVjdHNbT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0c10uaXNTcGlsbFNsb3Q7CisgIH0KKworICBib29sIGlzU3RhdGVwb2ludFNwaWxsU2xvdE9iamVjdEluZGV4KGludCBPYmplY3RJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQodW5zaWduZWQoT2JqZWN0SWR4K051bUZpeGVkT2JqZWN0cykgPCBPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPYmplY3QgSWR4ISIpOworICAgIHJldHVybiBPYmplY3RzW09iamVjdElkeCtOdW1GaXhlZE9iamVjdHNdLmlzU3RhdGVwb2ludFNwaWxsU2xvdDsKKyAgfQorCisgIC8vLyBcc2VlIFN0YWNrSUQKKyAgdWludDhfdCBnZXRTdGFja0lEKGludCBPYmplY3RJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gT2JqZWN0c1tPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzXS5TdGFja0lEOworICB9CisKKyAgLy8vIFxzZWUgU3RhY2tJRAorICB2b2lkIHNldFN0YWNrSUQoaW50IE9iamVjdElkeCwgdWludDhfdCBJRCkgeworICAgIGFzc2VydCh1bnNpZ25lZChPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzKSA8IE9iamVjdHMuc2l6ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIE9iamVjdCBJZHghIik7CisgICAgT2JqZWN0c1tPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzXS5TdGFja0lEID0gSUQ7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5kZXggY29ycmVzcG9uZHMgdG8gYSBkZWFkIG9iamVjdC4KKyAgYm9vbCBpc0RlYWRPYmplY3RJbmRleChpbnQgT2JqZWN0SWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KHVuc2lnbmVkKE9iamVjdElkeCtOdW1GaXhlZE9iamVjdHMpIDwgT2JqZWN0cy5zaXplKCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgT2JqZWN0IElkeCEiKTsKKyAgICByZXR1cm4gT2JqZWN0c1tPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzXS5TaXplID09IH4wVUxMOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluZGV4IGNvcnJlc3BvbmRzIHRvIGEgdmFyaWFibGUgc2l6ZWQKKyAgLy8vIG9iamVjdC4KKyAgYm9vbCBpc1ZhcmlhYmxlU2l6ZWRPYmplY3RJbmRleChpbnQgT2JqZWN0SWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KHVuc2lnbmVkKE9iamVjdElkeCArIE51bUZpeGVkT2JqZWN0cykgPCBPYmplY3RzLnNpemUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBPYmplY3QgSWR4ISIpOworICAgIHJldHVybiBPYmplY3RzW09iamVjdElkeCArIE51bUZpeGVkT2JqZWN0c10uU2l6ZSA9PSAwOworICB9CisKKyAgdm9pZCBtYXJrQXNTdGF0ZXBvaW50U3BpbGxTbG90T2JqZWN0SW5kZXgoaW50IE9iamVjdElkeCkgeworICAgIGFzc2VydCh1bnNpZ25lZChPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzKSA8IE9iamVjdHMuc2l6ZSgpICYmCisgICAgICAgICAgICJJbnZhbGlkIE9iamVjdCBJZHghIik7CisgICAgT2JqZWN0c1tPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzXS5pc1N0YXRlcG9pbnRTcGlsbFNsb3QgPSB0cnVlOworICAgIGFzc2VydChpc1N0YXRlcG9pbnRTcGlsbFNsb3RPYmplY3RJbmRleChPYmplY3RJZHgpICYmICJpbmNvbnNpc3RlbnQiKTsKKyAgfQorCisgIC8vLyBDcmVhdGUgYSBuZXcgc3RhdGljYWxseSBzaXplZCBzdGFjayBvYmplY3QsIHJldHVybmluZworICAvLy8gYSBub25uZWdhdGl2ZSBpZGVudGlmaWVyIHRvIHJlcHJlc2VudCBpdC4KKyAgaW50IENyZWF0ZVN0YWNrT2JqZWN0KHVpbnQ2NF90IFNpemUsIHVuc2lnbmVkIEFsaWdubWVudCwgYm9vbCBpc1NwaWxsU2xvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFsbG9jYUluc3QgKkFsbG9jYSA9IG51bGxwdHIsIHVpbnQ4X3QgSUQgPSAwKTsKKworICAvLy8gQ3JlYXRlIGEgbmV3IHN0YXRpY2FsbHkgc2l6ZWQgc3RhY2sgb2JqZWN0IHRoYXQgcmVwcmVzZW50cyBhIHNwaWxsIHNsb3QsCisgIC8vLyByZXR1cm5pbmcgYSBub25uZWdhdGl2ZSBpZGVudGlmaWVyIHRvIHJlcHJlc2VudCBpdC4KKyAgaW50IENyZWF0ZVNwaWxsU3RhY2tPYmplY3QodWludDY0X3QgU2l6ZSwgdW5zaWduZWQgQWxpZ25tZW50KTsKKworICAvLy8gUmVtb3ZlIG9yIG1hcmsgZGVhZCBhIHN0YXRpY2FsbHkgc2l6ZWQgc3RhY2sgb2JqZWN0LgorICB2b2lkIFJlbW92ZVN0YWNrT2JqZWN0KGludCBPYmplY3RJZHgpIHsKKyAgICAvLyBNYXJrIGl0IGRlYWQuCisgICAgT2JqZWN0c1tPYmplY3RJZHgrTnVtRml4ZWRPYmplY3RzXS5TaXplID0gfjBVTEw7CisgIH0KKworICAvLy8gTm90aWZ5IHRoZSBNYWNoaW5lRnJhbWVJbmZvIG9iamVjdCB0aGF0IGEgdmFyaWFibGUgc2l6ZWQgb2JqZWN0IGhhcyBiZWVuCisgIC8vLyBjcmVhdGVkLiAgVGhpcyBtdXN0IGJlIGNyZWF0ZWQgd2hlbmV2ZXIgYSB2YXJpYWJsZSBzaXplZCBvYmplY3QgaXMKKyAgLy8vIGNyZWF0ZWQsIHdoZXRoZXIgb3Igbm90IHRoZSBpbmRleCByZXR1cm5lZCBpcyBhY3R1YWxseSB1c2VkLgorICBpbnQgQ3JlYXRlVmFyaWFibGVTaXplZE9iamVjdCh1bnNpZ25lZCBBbGlnbm1lbnQsIGNvbnN0IEFsbG9jYUluc3QgKkFsbG9jYSk7CisKKyAgLy8vIFJldHVybnMgYSByZWZlcmVuY2UgdG8gY2FsbCBzYXZlZCBpbmZvIHZlY3RvciBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgIGNvbnN0IHN0ZDo6dmVjdG9yPENhbGxlZVNhdmVkSW5mbz4gJmdldENhbGxlZVNhdmVkSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ1NJbmZvOworICB9CisgIC8vLyBcY29weWRvYyBnZXRDYWxsZWVTYXZlZEluZm8oKQorICBzdGQ6OnZlY3RvcjxDYWxsZWVTYXZlZEluZm8+ICZnZXRDYWxsZWVTYXZlZEluZm8oKSB7IHJldHVybiBDU0luZm87IH0KKworICAvLy8gVXNlZCBieSBwcm9sb2cvZXBpbG9nIGluc2VydGVyIHRvIHNldCB0aGUgZnVuY3Rpb24ncyBjYWxsZWUgc2F2ZWQKKyAgLy8vIGluZm9ybWF0aW9uLgorICB2b2lkIHNldENhbGxlZVNhdmVkSW5mbyhjb25zdCBzdGQ6OnZlY3RvcjxDYWxsZWVTYXZlZEluZm8+ICZDU0kpIHsKKyAgICBDU0luZm8gPSBDU0k7CisgIH0KKworICAvLy8gSGFzIHRoZSBjYWxsZWUgc2F2ZWQgaW5mbyBiZWVuIGNhbGN1bGF0ZWQgeWV0PworICBib29sIGlzQ2FsbGVlU2F2ZWRJbmZvVmFsaWQoKSBjb25zdCB7IHJldHVybiBDU0lWYWxpZDsgfQorCisgIHZvaWQgc2V0Q2FsbGVlU2F2ZWRJbmZvVmFsaWQoYm9vbCB2KSB7IENTSVZhbGlkID0gdjsgfQorCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpnZXRTYXZlUG9pbnQoKSBjb25zdCB7IHJldHVybiBTYXZlOyB9CisgIHZvaWQgc2V0U2F2ZVBvaW50KE1hY2hpbmVCYXNpY0Jsb2NrICpOZXdTYXZlKSB7IFNhdmUgPSBOZXdTYXZlOyB9CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpnZXRSZXN0b3JlUG9pbnQoKSBjb25zdCB7IHJldHVybiBSZXN0b3JlOyB9CisgIHZvaWQgc2V0UmVzdG9yZVBvaW50KE1hY2hpbmVCYXNpY0Jsb2NrICpOZXdSZXN0b3JlKSB7IFJlc3RvcmUgPSBOZXdSZXN0b3JlOyB9CisKKyAgLy8vIFJldHVybiBhIHNldCBvZiBwaHlzaWNhbCByZWdpc3RlcnMgdGhhdCBhcmUgcHJpc3RpbmUuCisgIC8vLworICAvLy8gUHJpc3RpbmUgcmVnaXN0ZXJzIGhvbGQgYSB2YWx1ZSB0aGF0IGlzIHVzZWxlc3MgdG8gdGhlIGN1cnJlbnQgZnVuY3Rpb24sCisgIC8vLyBidXQgdGhhdCBtdXN0IGJlIHByZXNlcnZlZCAtIHRoZXkgYXJlIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMgdGhhdCBhcmUgbm90CisgIC8vLyBzYXZlZC4KKyAgLy8vCisgIC8vLyBCZWZvcmUgdGhlIFByb2xvZ3VlRXBpbG9ndWVJbnNlcnRlciBoYXMgcGxhY2VkIHRoZSBDU1Igc3BpbGwgY29kZSwgdGhpcworICAvLy8gbWV0aG9kIGFsd2F5cyByZXR1cm5zIGFuIGVtcHR5IHNldC4KKyAgQml0VmVjdG9yIGdldFByaXN0aW5lUmVncyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICAvLy8gVXNlZCBieSB0aGUgTWFjaGluZUZ1bmN0aW9uIHByaW50ZXIgdG8gcHJpbnQgaW5mb3JtYXRpb24gYWJvdXQKKyAgLy8vIHN0YWNrIG9iamVjdHMuIEltcGxlbWVudGVkIGluIE1hY2hpbmVGdW5jdGlvbi5jcHAuCisgIHZvaWQgcHJpbnQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRiwgcmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLy8gZHVtcCAtIFByaW50IHRoZSBmdW5jdGlvbiB0byBzdGRlcnIuCisgIHZvaWQgZHVtcChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkOGI3ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgKQEAgLTAsMCArMSw5NDggQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ29sbGVjdCBuYXRpdmUgbWFjaGluZSBjb2RlIGZvciBhIGZ1bmN0aW9uLiAgVGhpcyBjbGFzcyBjb250YWlucyBhIGxpc3Qgb2YKKy8vIE1hY2hpbmVCYXNpY0Jsb2NrIGluc3RhbmNlcyB0aGF0IG1ha2UgdXAgdGhlIGN1cnJlbnQgY29tcGlsZWQgZnVuY3Rpb24uCisvLworLy8gVGhpcyBjbGFzcyBhbHNvIGNvbnRhaW5zIHBvaW50ZXJzIHRvIHZhcmlvdXMgY2xhc3NlcyB3aGljaCBob2xkCisvLyB0YXJnZXQtc3BlY2lmaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGdlbmVyYXRlZCBjb2RlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVGVU5DVElPTl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FRlVOQ1RJT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0VIUGVyc29uYWxpdGllcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU1lbU9wZXJhbmQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RlYnVnTG9jLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01ldGFkYXRhLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0R3YXJmLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQXJyYXlSZWN5Y2xlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BdG9taWNPcmRlcmluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1JlY3ljbGVyLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgQmxvY2tBZGRyZXNzOworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIERJRXhwcmVzc2lvbjsKK2NsYXNzIERJTG9jYWxWYXJpYWJsZTsKK2NsYXNzIERJTG9jYXRpb247CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEdsb2JhbFZhbHVlOworY2xhc3MgTWFjaGluZUNvbnN0YW50UG9vbDsKK2NsYXNzIE1hY2hpbmVGcmFtZUluZm87CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lSnVtcFRhYmxlSW5mbzsKK2NsYXNzIE1hY2hpbmVNb2R1bGVJbmZvOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIE1DQ29udGV4dDsKK2NsYXNzIE1DSW5zdHJEZXNjOworY2xhc3MgUGFzczsKK2NsYXNzIFBzZXVkb1NvdXJjZVZhbHVlTWFuYWdlcjsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgU2xvdEluZGV4ZXM7CitjbGFzcyBUYXJnZXRNYWNoaW5lOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJDbGFzczsKK2NsYXNzIFRhcmdldFN1YnRhcmdldEluZm87CitzdHJ1Y3QgV2luRUhGdW5jSW5mbzsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlsaXN0X2FsbG9jX3RyYWl0czxNYWNoaW5lQmFzaWNCbG9jaz4geworICB2b2lkIGRlbGV0ZU5vZGUoTWFjaGluZUJhc2ljQmxvY2sgKk1CQik7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaWxpc3RfY2FsbGJhY2tfdHJhaXRzPE1hY2hpbmVCYXNpY0Jsb2NrPiB7CisgIHZvaWQgYWRkTm9kZVRvTGlzdChNYWNoaW5lQmFzaWNCbG9jayogTUJCKTsKKyAgdm9pZCByZW1vdmVOb2RlRnJvbUxpc3QoTWFjaGluZUJhc2ljQmxvY2sqIE1CQik7CisKKyAgdGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yPgorICB2b2lkIHRyYW5zZmVyTm9kZXNGcm9tTGlzdChpbGlzdF9jYWxsYmFja190cmFpdHMgJk9sZExpc3QsIEl0ZXJhdG9yLCBJdGVyYXRvcikgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIk5ldmVyIHRyYW5zZmVyIGJldHdlZW4gbGlzdHMiKTsKKyAgfQorfTsKKworLy8vIE1hY2hpbmVGdW5jdGlvbkluZm8gLSBUaGlzIGNsYXNzIGNhbiBiZSBkZXJpdmVkIGZyb20gYW5kIHVzZWQgYnkgdGFyZ2V0cyB0bworLy8vIGhvbGQgcHJpdmF0ZSB0YXJnZXQtc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIGVhY2ggTWFjaGluZUZ1bmN0aW9uLiAgT2JqZWN0cworLy8vIG9mIHR5cGUgYXJlIGFjY2Vzc2VkL2NyZWF0ZWQgd2l0aCBNRjo6Z2V0SW5mbyBhbmQgZGVzdHJveWVkIHdoZW4gdGhlCisvLy8gTWFjaGluZUZ1bmN0aW9uIGlzIGRlc3Ryb3llZC4KK3N0cnVjdCBNYWNoaW5lRnVuY3Rpb25JbmZvIHsKKyAgdmlydHVhbCB+TWFjaGluZUZ1bmN0aW9uSW5mbygpOworCisgIC8vLyBcYnJpZWYgRmFjdG9yeSBmdW5jdGlvbjogZGVmYXVsdCBiZWhhdmlvciBpcyB0byBjYWxsIG5ldyB1c2luZyB0aGUKKyAgLy8vIHN1cHBsaWVkIGFsbG9jYXRvci4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSBvdmVycmlkZGVuIGluIGEgZGVyaXZlIGNsYXNzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeT4KKyAgc3RhdGljIFR5ICpjcmVhdGUoQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yLCBNYWNoaW5lRnVuY3Rpb24gJk1GKSB7CisgICAgcmV0dXJuIG5ldyAoQWxsb2NhdG9yLkFsbG9jYXRlPFR5PigpKSBUeShNRik7CisgIH0KK307CisKKy8vLyBQcm9wZXJ0aWVzIHdoaWNoIGEgTWFjaGluZUZ1bmN0aW9uIG1heSBoYXZlIGF0IGEgZ2l2ZW4gcG9pbnQgaW4gdGltZS4KKy8vLyBFYWNoIG9mIHRoZXNlIGhhcyBjaGVja2luZyBjb2RlIGluIHRoZSBNYWNoaW5lVmVyaWZpZXIsIGFuZCBwYXNzZXMgY2FuCisvLy8gcmVxdWlyZSB0aGF0IGEgcHJvcGVydHkgYmUgc2V0LgorY2xhc3MgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcyB7CisgIC8vIFBvc3NpYmxlIFRPRE86IEFsbG93IHRhcmdldHMgdG8gZXh0ZW5kIHRoaXMgKHBlcmhhcHMgYnkgYWxsb3dpbmcgdGhlCisgIC8vIGNvbnN0cnVjdG9yIHRvIHNwZWNpZnkgdGhlIHNpemUgb2YgdGhlIGJpdCB2ZWN0b3IpCisgIC8vIFBvc3NpYmxlIFRPRE86IEFsbG93IHJlcXVpcmluZyB0aGUgbmVnYXRpdmUgKGUuZy4gVlJlZ3NBbGxvY2F0ZWQgY291bGQgYmUKKyAgLy8gc3RhdGVkIGFzIHRoZSBuZWdhdGl2ZSBvZiAiaGFzIHZyZWdzIgorCitwdWJsaWM6CisgIC8vIFRoZSBwcm9wZXJ0aWVzIGFyZSBzdGF0ZWQgaW4gInBvc2l0aXZlIiBmb3JtOyBpLmUuIGEgcGFzcyBjb3VsZCByZXF1aXJlCisgIC8vIHRoYXQgdGhlIHByb3BlcnR5IGhvbGQsIGJ1dCBub3QgdGhhdCBpdCBkb2VzIG5vdCBob2xkLgorCisgIC8vIFByb3BlcnR5IGRlc2NyaXB0aW9uczoKKyAgLy8gSXNTU0E6IFRydWUgd2hlbiB0aGUgbWFjaGluZSBmdW5jdGlvbiBpcyBpbiBTU0EgZm9ybSBhbmQgdmlydHVhbCByZWdpc3RlcnMKKyAgLy8gIGhhdmUgYSBzaW5nbGUgZGVmLgorICAvLyBOb1BISXM6IFRoZSBtYWNoaW5lIGZ1bmN0aW9uIGRvZXMgbm90IGNvbnRhaW4gYW55IFBISSBpbnN0cnVjdGlvbi4KKyAgLy8gVHJhY2tzTGl2ZW5lc3M6IFRydWUgd2hlbiB0cmFja2luZyByZWdpc3RlciBsaXZlbmVzcyBhY2N1cmF0ZWx5LgorICAvLyAgV2hpbGUgdGhpcyBwcm9wZXJ0eSBpcyBzZXQsIHJlZ2lzdGVyIGxpdmVuZXNzIGluZm9ybWF0aW9uIGluIGJhc2ljIGJsb2NrCisgIC8vICBsaXZlLWluIGxpc3RzIGFuZCBtYWNoaW5lIGluc3RydWN0aW9uIG9wZXJhbmRzIChlLmcuIGtpbGwgZmxhZ3MsIGltcGxpY2l0CisgIC8vICBkZWZzKSBpcyBhY2N1cmF0ZS4gVGhpcyBtZWFucyBpdCBjYW4gYmUgdXNlZCB0byBjaGFuZ2UgdGhlIGNvZGUgaW4gd2F5cworICAvLyAgdGhhdCBhZmZlY3QgdGhlIHZhbHVlcyBpbiByZWdpc3RlcnMsIGZvciBleGFtcGxlIGJ5IHRoZSByZWdpc3RlcgorICAvLyAgc2NhdmVuZ2VyLgorICAvLyAgV2hlbiB0aGlzIHByb3BlcnR5IGlzIGNsZWFyLCBsaXZlbmVzcyBpcyBubyBsb25nZXIgcmVsaWFibGUuCisgIC8vIE5vVlJlZ3M6IFRoZSBtYWNoaW5lIGZ1bmN0aW9uIGRvZXMgbm90IHVzZSBhbnkgdmlydHVhbCByZWdpc3RlcnMuCisgIC8vIExlZ2FsaXplZDogSW4gR2xvYmFsSVNlbDogdGhlIE1hY2hpbmVMZWdhbGl6ZXIgcmFuIGFuZCBhbGwgcHJlLWlzZWwgZ2VuZXJpYworICAvLyAgaW5zdHJ1Y3Rpb25zIGhhdmUgYmVlbiBsZWdhbGl6ZWQ7IGkuZS4sIGFsbCBpbnN0cnVjdGlvbnMgYXJlIG5vdyBvbmUgb2Y6CisgIC8vICAgLSBnZW5lcmljIGFuZCBhbHdheXMgbGVnYWwgKGUuZy4sIENPUFkpCisgIC8vICAgLSB0YXJnZXQtc3BlY2lmaWMKKyAgLy8gICAtIGxlZ2FsIHByZS1pc2VsIGdlbmVyaWMgaW5zdHJ1Y3Rpb25zLgorICAvLyBSZWdCYW5rU2VsZWN0ZWQ6IEluIEdsb2JhbElTZWw6IHRoZSBSZWdCYW5rU2VsZWN0IHBhc3MgcmFuIGFuZCBhbGwgZ2VuZXJpYworICAvLyAgdmlydHVhbCByZWdpc3RlcnMgaGF2ZSBiZWVuIGFzc2lnbmVkIHRvIGEgcmVnaXN0ZXIgYmFuay4KKyAgLy8gU2VsZWN0ZWQ6IEluIEdsb2JhbElTZWw6IHRoZSBJbnN0cnVjdGlvblNlbGVjdCBwYXNzIHJhbiBhbmQgYWxsIHByZS1pc2VsCisgIC8vICBnZW5lcmljIGluc3RydWN0aW9ucyBoYXZlIGJlZW4gZWxpbWluYXRlZDsgaS5lLiwgYWxsIGluc3RydWN0aW9ucyBhcmUgbm93CisgIC8vICB0YXJnZXQtc3BlY2lmaWMgb3Igbm9uLXByZS1pc2VsIGdlbmVyaWMgaW5zdHJ1Y3Rpb25zIChlLmcuLCBDT1BZKS4KKyAgLy8gIFNpbmNlIG9ubHkgcHJlLWlzZWwgZ2VuZXJpYyBpbnN0cnVjdGlvbnMgY2FuIGhhdmUgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyCisgIC8vICBvcGVyYW5kcywgdGhpcyBhbHNvIG1lYW5zIHRoYXQgYWxsIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlcnMgaGF2ZSBiZWVuCisgIC8vICBjb25zdHJhaW5lZCB0byB2aXJ0dWFsIHJlZ2lzdGVycyAoYXNzaWduZWQgdG8gcmVnaXN0ZXIgY2xhc3NlcykgYW5kIHRoYXQKKyAgLy8gIGFsbCBzaXplcyBhdHRhY2hlZCB0byB0aGVtIGhhdmUgYmVlbiBlbGltaW5hdGVkLgorICBlbnVtIGNsYXNzIFByb3BlcnR5IDogdW5zaWduZWQgeworICAgIElzU1NBLAorICAgIE5vUEhJcywKKyAgICBUcmFja3NMaXZlbmVzcywKKyAgICBOb1ZSZWdzLAorICAgIEZhaWxlZElTZWwsCisgICAgTGVnYWxpemVkLAorICAgIFJlZ0JhbmtTZWxlY3RlZCwKKyAgICBTZWxlY3RlZCwKKyAgICBMYXN0UHJvcGVydHkgPSBTZWxlY3RlZCwKKyAgfTsKKworICBib29sIGhhc1Byb3BlcnR5KFByb3BlcnR5IFApIGNvbnN0IHsKKyAgICByZXR1cm4gUHJvcGVydGllc1tzdGF0aWNfY2FzdDx1bnNpZ25lZD4oUCldOworICB9CisKKyAgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcyAmc2V0KFByb3BlcnR5IFApIHsKKyAgICBQcm9wZXJ0aWVzLnNldChzdGF0aWNfY2FzdDx1bnNpZ25lZD4oUCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgJnJlc2V0KFByb3BlcnR5IFApIHsKKyAgICBQcm9wZXJ0aWVzLnJlc2V0KHN0YXRpY19jYXN0PHVuc2lnbmVkPihQKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFJlc2V0IGFsbCB0aGUgcHJvcGVydGllcy4KKyAgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcyAmcmVzZXQoKSB7CisgICAgUHJvcGVydGllcy5yZXNldCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgJnNldChjb25zdCBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzICZNRlApIHsKKyAgICBQcm9wZXJ0aWVzIHw9IE1GUC5Qcm9wZXJ0aWVzOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgJnJlc2V0KGNvbnN0IE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgJk1GUCkgeworICAgIFByb3BlcnRpZXMucmVzZXQoTUZQLlByb3BlcnRpZXMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbGwgcHJvcGVydGllcyBzZXQgaW4gViAoaS5lLiByZXF1aXJlZCBieSBhIHBhc3MpIGFyZSBzZXQKKyAgLy8gaW4gdGhpcy4KKyAgYm9vbCB2ZXJpZnlSZXF1aXJlZFByb3BlcnRpZXMoY29uc3QgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcyAmVikgY29uc3QgeworICAgIHJldHVybiAhVi5Qcm9wZXJ0aWVzLnRlc3QoUHJvcGVydGllcyk7CisgIH0KKworICAvLy8gUHJpbnQgdGhlIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgaW4gaHVtYW4tcmVhZGFibGUgZm9ybS4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCitwcml2YXRlOgorICBCaXRWZWN0b3IgUHJvcGVydGllcyA9CisgICAgICBCaXRWZWN0b3Ioc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KFByb3BlcnR5OjpMYXN0UHJvcGVydHkpKzEpOworfTsKKworc3RydWN0IFNFSEhhbmRsZXIgeworICAvLy8gRmlsdGVyIG9yIGZpbmFsbHkgZnVuY3Rpb24uIE51bGwgaW5kaWNhdGVzIGEgY2F0Y2gtYWxsLgorICBjb25zdCBGdW5jdGlvbiAqRmlsdGVyT3JGaW5hbGx5OworCisgIC8vLyBBZGRyZXNzIG9mIGJsb2NrIHRvIHJlY292ZXIgYXQuIE51bGwgZm9yIGEgZmluYWxseSBoYW5kbGVyLgorICBjb25zdCBCbG9ja0FkZHJlc3MgKlJlY292ZXJCQTsKK307CisKKy8vLyBUaGlzIHN0cnVjdHVyZSBpcyB1c2VkIHRvIHJldGFpbiBsYW5kaW5nIHBhZCBpbmZvIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbi4KK3N0cnVjdCBMYW5kaW5nUGFkSW5mbyB7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpMYW5kaW5nUGFkQmxvY2s7ICAgICAgLy8gTGFuZGluZyBwYWQgYmxvY2suCisgIFNtYWxsVmVjdG9yPE1DU3ltYm9sICosIDE+IEJlZ2luTGFiZWxzOyAgLy8gTGFiZWxzIHByaW9yIHRvIGludm9rZS4KKyAgU21hbGxWZWN0b3I8TUNTeW1ib2wgKiwgMT4gRW5kTGFiZWxzOyAgICAvLyBMYWJlbHMgYWZ0ZXIgaW52b2tlLgorICBTbWFsbFZlY3RvcjxTRUhIYW5kbGVyLCAxPiBTRUhIYW5kbGVyczsgIC8vIFNFSCBoYW5kbGVycyBhY3RpdmUgYXQgdGhpcyBscGFkLgorICBNQ1N5bWJvbCAqTGFuZGluZ1BhZExhYmVsID0gbnVsbHB0cjsgICAgIC8vIExhYmVsIGF0IGJlZ2lubmluZyBvZiBsYW5kaW5nIHBhZC4KKyAgc3RkOjp2ZWN0b3I8aW50PiBUeXBlSWRzOyAgICAgICAgICAgICAgICAvLyBMaXN0IG9mIHR5cGUgaWRzIChmaWx0ZXJzIG5lZ2F0aXZlKS4KKworICBleHBsaWNpdCBMYW5kaW5nUGFkSW5mbyhNYWNoaW5lQmFzaWNCbG9jayAqTUJCKQorICAgICAgOiBMYW5kaW5nUGFkQmxvY2soTUJCKSB7fQorfTsKKworY2xhc3MgTWFjaGluZUZ1bmN0aW9uIHsKKyAgY29uc3QgRnVuY3Rpb24gJkY7CisgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRhcmdldDsKKyAgY29uc3QgVGFyZ2V0U3VidGFyZ2V0SW5mbyAqU1RJOworICBNQ0NvbnRleHQgJkN0eDsKKyAgTWFjaGluZU1vZHVsZUluZm8gJk1NSTsKKworICAvLyBSZWdJbmZvIC0gSW5mb3JtYXRpb24gYWJvdXQgZWFjaCByZWdpc3RlciBpbiB1c2UgaW4gdGhlIGZ1bmN0aW9uLgorICBNYWNoaW5lUmVnaXN0ZXJJbmZvICpSZWdJbmZvOworCisgIC8vIFVzZWQgdG8ga2VlcCB0cmFjayBvZiB0YXJnZXQtc3BlY2lmaWMgcGVyLW1hY2hpbmUgZnVuY3Rpb24gaW5mb3JtYXRpb24gZm9yCisgIC8vIHRoZSB0YXJnZXQgaW1wbGVtZW50YXRpb24uCisgIE1hY2hpbmVGdW5jdGlvbkluZm8gKk1GSW5mbzsKKworICAvLyBLZWVwIHRyYWNrIG9mIG9iamVjdHMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjay4KKyAgTWFjaGluZUZyYW1lSW5mbyAqRnJhbWVJbmZvOworCisgIC8vIEtlZXAgdHJhY2sgb2YgY29uc3RhbnRzIHdoaWNoIGFyZSBzcGlsbGVkIHRvIG1lbW9yeQorICBNYWNoaW5lQ29uc3RhbnRQb29sICpDb25zdGFudFBvb2w7CisKKyAgLy8gS2VlcCB0cmFjayBvZiBqdW1wIHRhYmxlcyBmb3Igc3dpdGNoIGluc3RydWN0aW9ucworICBNYWNoaW5lSnVtcFRhYmxlSW5mbyAqSnVtcFRhYmxlSW5mbzsKKworICAvLyBLZWVwcyB0cmFjayBvZiBXaW5kb3dzIGV4Y2VwdGlvbiBoYW5kbGluZyByZWxhdGVkIGRhdGEuIFRoaXMgd2lsbCBiZSBudWxsCisgIC8vIGZvciBmdW5jdGlvbnMgdGhhdCBhcmVuJ3QgdXNpbmcgYSBmdW5jbGV0LWJhc2VkIEVIIHBlcnNvbmFsaXR5LgorICBXaW5FSEZ1bmNJbmZvICpXaW5FSEluZm8gPSBudWxscHRyOworCisgIC8vIEZ1bmN0aW9uLWxldmVsIHVuaXF1ZSBudW1iZXJpbmcgZm9yIE1hY2hpbmVCYXNpY0Jsb2Nrcy4gIFdoZW4gYQorICAvLyBNYWNoaW5lQmFzaWNCbG9jayBpcyBpbnNlcnRlZCBpbnRvIGEgTWFjaGluZUZ1bmN0aW9uIGlzIGl0IGF1dG9tYXRpY2FsbHkKKyAgLy8gbnVtYmVyZWQgYW5kIHRoaXMgdmVjdG9yIGtlZXBzIHRyYWNrIG9mIHRoZSBtYXBwaW5nIGZyb20gSUQncyB0byBNQkIncy4KKyAgc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqPiBNQkJOdW1iZXJpbmc7CisKKyAgLy8gUG9vbC1hbGxvY2F0ZSBNYWNoaW5lRnVuY3Rpb24tbGlmZXRpbWUgYW5kIElSIG9iamVjdHMuCisgIEJ1bXBQdHJBbGxvY2F0b3IgQWxsb2NhdG9yOworCisgIC8vIEFsbG9jYXRpb24gbWFuYWdlbWVudCBmb3IgaW5zdHJ1Y3Rpb25zIGluIGZ1bmN0aW9uLgorICBSZWN5Y2xlcjxNYWNoaW5lSW5zdHI+IEluc3RydWN0aW9uUmVjeWNsZXI7CisKKyAgLy8gQWxsb2NhdGlvbiBtYW5hZ2VtZW50IGZvciBvcGVyYW5kIGFycmF5cyBvbiBpbnN0cnVjdGlvbnMuCisgIEFycmF5UmVjeWNsZXI8TWFjaGluZU9wZXJhbmQ+IE9wZXJhbmRSZWN5Y2xlcjsKKworICAvLyBBbGxvY2F0aW9uIG1hbmFnZW1lbnQgZm9yIGJhc2ljIGJsb2NrcyBpbiBmdW5jdGlvbi4KKyAgUmVjeWNsZXI8TWFjaGluZUJhc2ljQmxvY2s+IEJhc2ljQmxvY2tSZWN5Y2xlcjsKKworICAvLyBMaXN0IG9mIG1hY2hpbmUgYmFzaWMgYmxvY2tzIGluIGZ1bmN0aW9uCisgIHVzaW5nIEJhc2ljQmxvY2tMaXN0VHlwZSA9IGlsaXN0PE1hY2hpbmVCYXNpY0Jsb2NrPjsKKyAgQmFzaWNCbG9ja0xpc3RUeXBlIEJhc2ljQmxvY2tzOworCisgIC8vLyBGdW5jdGlvbk51bWJlciAtIFRoaXMgcHJvdmlkZXMgYSB1bmlxdWUgSUQgZm9yIGVhY2ggZnVuY3Rpb24gZW1pdHRlZCBpbgorICAvLy8gdGhpcyB0cmFuc2xhdGlvbiB1bml0LgorICAvLy8KKyAgdW5zaWduZWQgRnVuY3Rpb25OdW1iZXI7CisKKyAgLy8vIEFsaWdubWVudCAtIFRoZSBhbGlnbm1lbnQgb2YgdGhlIGZ1bmN0aW9uLgorICB1bnNpZ25lZCBBbGlnbm1lbnQ7CisKKyAgLy8vIEV4cG9zZXNSZXR1cm5zVHdpY2UgLSBUcnVlIGlmIHRoZSBmdW5jdGlvbiBjYWxscyBzZXRqbXAgb3IgcmVsYXRlZAorICAvLy8gZnVuY3Rpb25zIHdpdGggYXR0cmlidXRlICJyZXR1cm5zIHR3aWNlIiwgYnV0IGRvZXNuJ3QgaGF2ZQorICAvLy8gdGhlIGF0dHJpYnV0ZSBpdHNlbGYuCisgIC8vLyBUaGlzIGlzIHVzZWQgdG8gbGltaXQgb3B0aW1pemF0aW9ucyB3aGljaCBjYW5ub3QgcmVhc29uCisgIC8vLyBhYm91dCB0aGUgY29udHJvbCBmbG93IG9mIHN1Y2ggZnVuY3Rpb25zLgorICBib29sIEV4cG9zZXNSZXR1cm5zVHdpY2UgPSBmYWxzZTsKKworICAvLy8gVHJ1ZSBpZiB0aGUgZnVuY3Rpb24gaW5jbHVkZXMgYW55IGlubGluZSBhc3NlbWJseS4KKyAgYm9vbCBIYXNJbmxpbmVBc20gPSBmYWxzZTsKKworICAvLy8gVHJ1ZSBpZiBhbnkgV2luQ0ZJIGluc3RydWN0aW9uIGhhdmUgYmVlbiBlbWl0dGVkIGluIHRoaXMgZnVuY3Rpb24uCisgIE9wdGlvbmFsPGJvb2w+IEhhc1dpbkNGSTsKKworICAvLy8gQ3VycmVudCBoaWdoLWxldmVsIHByb3BlcnRpZXMgb2YgdGhlIElSIG9mIHRoZSBmdW5jdGlvbiAoZS5nLiBpcyBpbiBTU0EKKyAgLy8vIGZvcm0gb3Igd2hldGhlciByZWdpc3RlcnMgaGF2ZSBiZWVuIGFsbG9jYXRlZCkKKyAgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcyBQcm9wZXJ0aWVzOworCisgIC8vIEFsbG9jYXRpb24gbWFuYWdlbWVudCBmb3IgcHNldWRvIHNvdXJjZSB2YWx1ZXMuCisgIHN0ZDo6dW5pcXVlX3B0cjxQc2V1ZG9Tb3VyY2VWYWx1ZU1hbmFnZXI+IFBTVk1hbmFnZXI7CisKKyAgLy8vIExpc3Qgb2YgbW92ZXMgZG9uZSBieSBhIGZ1bmN0aW9uJ3MgcHJvbG9nLiAgVXNlZCB0byBjb25zdHJ1Y3QgZnJhbWUgbWFwcworICAvLy8gYnkgZGVidWcgYW5kIGV4Y2VwdGlvbiBoYW5kbGluZyBjb25zdW1lcnMuCisgIHN0ZDo6dmVjdG9yPE1DQ0ZJSW5zdHJ1Y3Rpb24+IEZyYW1lSW5zdHJ1Y3Rpb25zOworCisgIC8vLyBcbmFtZSBFeGNlcHRpb24gSGFuZGxpbmcKKyAgLy8vIFx7CisKKyAgLy8vIExpc3Qgb2YgTGFuZGluZ1BhZEluZm8gZGVzY3JpYmluZyB0aGUgbGFuZGluZyBwYWQgaW5mb3JtYXRpb24uCisgIHN0ZDo6dmVjdG9yPExhbmRpbmdQYWRJbmZvPiBMYW5kaW5nUGFkczsKKworICAvLy8gTWFwIGEgbGFuZGluZyBwYWQncyBFSCBzeW1ib2wgdG8gdGhlIGNhbGwgc2l0ZSBpbmRleGVzLgorICBEZW5zZU1hcDxNQ1N5bWJvbCosIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0Pj4gTFBhZFRvQ2FsbFNpdGVNYXA7CisKKyAgLy8vIE1hcCBvZiBpbnZva2UgY2FsbCBzaXRlIGluZGV4IHZhbHVlcyB0byBhc3NvY2lhdGVkIGJlZ2luIEVIX0xBQkVMLgorICBEZW5zZU1hcDxNQ1N5bWJvbCosIHVuc2lnbmVkPiBDYWxsU2l0ZU1hcDsKKworICAvLy8gQ29kZVZpZXcgbGFiZWwgYW5ub3RhdGlvbnMuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxNQ1N5bWJvbCAqLCBNRE5vZGUgKj4+IENvZGVWaWV3QW5ub3RhdGlvbnM7CisKKyAgYm9vbCBDYWxsc0VIUmV0dXJuID0gZmFsc2U7CisgIGJvb2wgQ2FsbHNVbndpbmRJbml0ID0gZmFsc2U7CisgIGJvb2wgSGFzRUhGdW5jbGV0cyA9IGZhbHNlOworCisgIC8vLyBMaXN0IG9mIEMrKyBUeXBlSW5mbyB1c2VkLgorICBzdGQ6OnZlY3Rvcjxjb25zdCBHbG9iYWxWYWx1ZSAqPiBUeXBlSW5mb3M7CisKKyAgLy8vIExpc3Qgb2YgdHlwZWlkcyBlbmNvZGluZyBmaWx0ZXJzIHVzZWQuCisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBGaWx0ZXJJZHM7CisKKyAgLy8vIExpc3Qgb2YgdGhlIGluZGljZXMgaW4gRmlsdGVySWRzIGNvcnJlc3BvbmRpbmcgdG8gZmlsdGVyIHRlcm1pbmF0b3JzLgorICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gRmlsdGVyRW5kczsKKworICBFSFBlcnNvbmFsaXR5IFBlcnNvbmFsaXR5VHlwZUNhY2hlID0gRUhQZXJzb25hbGl0eTo6VW5rbm93bjsKKworICAvLy8gXH0KKworICAvLy8gQ2xlYXIgYWxsIHRoZSBtZW1iZXJzIG9mIHRoaXMgTWFjaGluZUZ1bmN0aW9uLCBidXQgdGhlIG9uZXMgdXNlZAorICAvLy8gdG8gaW5pdGlhbGl6ZSBhZ2FpbiB0aGUgTWFjaGluZUZ1bmN0aW9uLgorICAvLy8gTW9yZSBzcGVjaWZpY2FsbHksIHRoaXMgZGVhbGxvY2F0ZXMgYWxsIHRoZSBkeW5hbWljYWxseSBhbGxvY2F0ZWQKKyAgLy8vIG9iamVjdHMgYW5kIGdldCByaWQgb2YgYWxsIHRoZSBYWFhJbmZvIGRhdGEgc3RydWN0dXJlLCBidXQga2VlcAorICAvLy8gdW5jaGFuZ2VkIHRoZSByZWZlcmVuY2VzIHRvIEZuLCBUYXJnZXQsIE1NSSwgYW5kIEZ1bmN0aW9uTnVtYmVyLgorICB2b2lkIGNsZWFyKCk7CisgIC8vLyBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB0aGUgZGlmZmVyZW50IG1lbWJlcnMuCisgIC8vLyBJbiBwYXJ0aWN1bGFyLCB0aGUgWFhYSW5mbyBkYXRhIHN0cnVjdHVyZS4KKyAgLy8vIFxwcmUgRm4sIFRhcmdldCwgTU1JLCBhbmQgRnVuY3Rpb25OdW1iZXIgYXJlIHByb3Blcmx5IHNldC4KKyAgdm9pZCBpbml0KCk7CisKK3B1YmxpYzoKKyAgc3RydWN0IFZhcmlhYmxlRGJnSW5mbyB7CisgICAgY29uc3QgRElMb2NhbFZhcmlhYmxlICpWYXI7CisgICAgY29uc3QgRElFeHByZXNzaW9uICpFeHByOworICAgIHVuc2lnbmVkIFNsb3Q7CisgICAgY29uc3QgRElMb2NhdGlvbiAqTG9jOworCisgICAgVmFyaWFibGVEYmdJbmZvKGNvbnN0IERJTG9jYWxWYXJpYWJsZSAqVmFyLCBjb25zdCBESUV4cHJlc3Npb24gKkV4cHIsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNsb3QsIGNvbnN0IERJTG9jYXRpb24gKkxvYykKKyAgICAgICAgOiBWYXIoVmFyKSwgRXhwcihFeHByKSwgU2xvdChTbG90KSwgTG9jKExvYykge30KKyAgfTsKKyAgdXNpbmcgVmFyaWFibGVEYmdJbmZvTWFwVHkgPSBTbWFsbFZlY3RvcjxWYXJpYWJsZURiZ0luZm8sIDQ+OworICBWYXJpYWJsZURiZ0luZm9NYXBUeSBWYXJpYWJsZURiZ0luZm9zOworCisgIE1hY2hpbmVGdW5jdGlvbihjb25zdCBGdW5jdGlvbiAmRiwgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRTdWJ0YXJnZXRJbmZvICZTVEksIHVuc2lnbmVkIEZ1bmN0aW9uTnVtLAorICAgICAgICAgICAgICAgICAgTWFjaGluZU1vZHVsZUluZm8gJk1NSSk7CisgIE1hY2hpbmVGdW5jdGlvbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJikgPSBkZWxldGU7CisgIE1hY2hpbmVGdW5jdGlvbiAmb3BlcmF0b3I9KGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmKSA9IGRlbGV0ZTsKKyAgfk1hY2hpbmVGdW5jdGlvbigpOworCisgIC8vLyBSZXNldCB0aGUgaW5zdGFuY2UgYXMgaWYgaXQgd2FzIGp1c3QgY3JlYXRlZC4KKyAgdm9pZCByZXNldCgpIHsKKyAgICBjbGVhcigpOworICAgIGluaXQoKTsKKyAgfQorCisgIE1hY2hpbmVNb2R1bGVJbmZvICZnZXRNTUkoKSBjb25zdCB7IHJldHVybiBNTUk7IH0KKyAgTUNDb250ZXh0ICZnZXRDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gQ3R4OyB9CisKKyAgUHNldWRvU291cmNlVmFsdWVNYW5hZ2VyICZnZXRQU1ZNYW5hZ2VyKCkgY29uc3QgeyByZXR1cm4gKlBTVk1hbmFnZXI7IH0KKworICAvLy8gUmV0dXJuIHRoZSBEYXRhTGF5b3V0IGF0dGFjaGVkIHRvIHRoZSBNb2R1bGUgYXNzb2NpYXRlZCB0byB0aGlzIE1GLgorICBjb25zdCBEYXRhTGF5b3V0ICZnZXREYXRhTGF5b3V0KCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgTExWTSBmdW5jdGlvbiB0aGF0IHRoaXMgbWFjaGluZSBjb2RlIHJlcHJlc2VudHMKKyAgY29uc3QgRnVuY3Rpb24gJmdldEZ1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gRjsgfQorCisgIC8vLyBnZXROYW1lIC0gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBjb3JyZXNwb25kaW5nIExMVk0gZnVuY3Rpb24uCisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3Q7CisKKyAgLy8vIGdldEZ1bmN0aW9uTnVtYmVyIC0gUmV0dXJuIGEgdW5pcXVlIElEIGZvciB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgdW5zaWduZWQgZ2V0RnVuY3Rpb25OdW1iZXIoKSBjb25zdCB7IHJldHVybiBGdW5jdGlvbk51bWJlcjsgfQorCisgIC8vLyBnZXRUYXJnZXQgLSBSZXR1cm4gdGhlIHRhcmdldCBtYWNoaW5lIHRoaXMgbWFjaGluZSBjb2RlIGlzIGNvbXBpbGVkIHdpdGgKKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmZ2V0VGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gVGFyZ2V0OyB9CisKKyAgLy8vIGdldFN1YnRhcmdldCAtIFJldHVybiB0aGUgc3VidGFyZ2V0IGZvciB3aGljaCB0aGlzIG1hY2hpbmUgY29kZSBpcyBiZWluZworICAvLy8gY29tcGlsZWQuCisgIGNvbnN0IFRhcmdldFN1YnRhcmdldEluZm8gJmdldFN1YnRhcmdldCgpIGNvbnN0IHsgcmV0dXJuICpTVEk7IH0KKyAgdm9pZCBzZXRTdWJ0YXJnZXQoY29uc3QgVGFyZ2V0U3VidGFyZ2V0SW5mbyAqU1QpIHsgU1RJID0gU1Q7IH0KKworICAvLy8gZ2V0U3VidGFyZ2V0IC0gVGhpcyBtZXRob2QgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHNwZWNpZmllZCB0eXBlIG9mCisgIC8vLyBUYXJnZXRTdWJ0YXJnZXRJbmZvLiAgSW4gZGVidWcgYnVpbGRzLCBpdCB2ZXJpZmllcyB0aGF0IHRoZSBvYmplY3QgYmVpbmcKKyAgLy8vIHJldHVybmVkIGlzIG9mIHRoZSBjb3JyZWN0IHR5cGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFNUQz4gY29uc3QgU1RDICZnZXRTdWJ0YXJnZXQoKSBjb25zdCB7CisgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBTVEMgKj4oU1RJKTsKKyAgfQorCisgIC8vLyBnZXRSZWdJbmZvIC0gUmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWdpc3RlcnMgY3VycmVudGx5IGluIHVzZS4KKyAgTWFjaGluZVJlZ2lzdGVySW5mbyAmZ2V0UmVnSW5mbygpIHsgcmV0dXJuICpSZWdJbmZvOyB9CisgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJmdldFJlZ0luZm8oKSBjb25zdCB7IHJldHVybiAqUmVnSW5mbzsgfQorCisgIC8vLyBnZXRGcmFtZUluZm8gLSBSZXR1cm4gdGhlIGZyYW1lIGluZm8gb2JqZWN0IGZvciB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgLy8vIFRoaXMgb2JqZWN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IG9iamVjdHMgYWxsb2NhdGVkIG9uIHRoZSBzdGFjaworICAvLy8gZnJhbWUgb2YgdGhlIGN1cnJlbnQgZnVuY3Rpb24gaW4gYW4gYWJzdHJhY3Qgd2F5LgorICBNYWNoaW5lRnJhbWVJbmZvICZnZXRGcmFtZUluZm8oKSB7IHJldHVybiAqRnJhbWVJbmZvOyB9CisgIGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gJmdldEZyYW1lSW5mbygpIGNvbnN0IHsgcmV0dXJuICpGcmFtZUluZm87IH0KKworICAvLy8gZ2V0SnVtcFRhYmxlSW5mbyAtIFJldHVybiB0aGUganVtcCB0YWJsZSBpbmZvIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQKKyAgLy8vIGZ1bmN0aW9uLiAgVGhpcyBvYmplY3QgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQganVtcCB0YWJsZXMgaW4gdGhlCisgIC8vLyBjdXJyZW50IGZ1bmN0aW9uLiAgSWYgdGhlIGN1cnJlbnQgZnVuY3Rpb24gaGFzIG5vIGp1bXAgdGFibGVzLCB0aGlzIHdpbGwKKyAgLy8vIHJldHVybiBudWxsLgorICBjb25zdCBNYWNoaW5lSnVtcFRhYmxlSW5mbyAqZ2V0SnVtcFRhYmxlSW5mbygpIGNvbnN0IHsgcmV0dXJuIEp1bXBUYWJsZUluZm87IH0KKyAgTWFjaGluZUp1bXBUYWJsZUluZm8gKmdldEp1bXBUYWJsZUluZm8oKSB7IHJldHVybiBKdW1wVGFibGVJbmZvOyB9CisKKyAgLy8vIGdldE9yQ3JlYXRlSnVtcFRhYmxlSW5mbyAtIEdldCB0aGUgSnVtcFRhYmxlSW5mbyBmb3IgdGhpcyBmdW5jdGlvbiwgaWYgaXQKKyAgLy8vIGRvZXMgYWxyZWFkeSBleGlzdCwgYWxsb2NhdGUgb25lLgorICBNYWNoaW5lSnVtcFRhYmxlSW5mbyAqZ2V0T3JDcmVhdGVKdW1wVGFibGVJbmZvKHVuc2lnbmVkIEpURW50cnlLaW5kKTsKKworICAvLy8gZ2V0Q29uc3RhbnRQb29sIC0gUmV0dXJuIHRoZSBjb25zdGFudCBwb29sIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQKKyAgLy8vIGZ1bmN0aW9uLgorICBNYWNoaW5lQ29uc3RhbnRQb29sICpnZXRDb25zdGFudFBvb2woKSB7IHJldHVybiBDb25zdGFudFBvb2w7IH0KKyAgY29uc3QgTWFjaGluZUNvbnN0YW50UG9vbCAqZ2V0Q29uc3RhbnRQb29sKCkgY29uc3QgeyByZXR1cm4gQ29uc3RhbnRQb29sOyB9CisKKyAgLy8vIGdldFdpbkVIRnVuY0luZm8gLSBSZXR1cm4gaW5mb3JtYXRpb24gYWJvdXQgaG93IHRoZSBjdXJyZW50IGZ1bmN0aW9uIHVzZXMKKyAgLy8vIFdpbmRvd3MgZXhjZXB0aW9uIGhhbmRsaW5nLiBSZXR1cm5zIG51bGwgZm9yIGZ1bmN0aW9ucyB0aGF0IGRvbid0IHVzZQorICAvLy8gZnVuY2xldHMgZm9yIGV4Y2VwdGlvbiBoYW5kbGluZy4KKyAgY29uc3QgV2luRUhGdW5jSW5mbyAqZ2V0V2luRUhGdW5jSW5mbygpIGNvbnN0IHsgcmV0dXJuIFdpbkVISW5mbzsgfQorICBXaW5FSEZ1bmNJbmZvICpnZXRXaW5FSEZ1bmNJbmZvKCkgeyByZXR1cm4gV2luRUhJbmZvOyB9CisKKyAgLy8vIGdldEFsaWdubWVudCAtIFJldHVybiB0aGUgYWxpZ25tZW50IChsb2cyLCBub3QgYnl0ZXMpIG9mIHRoZSBmdW5jdGlvbi4KKyAgdW5zaWduZWQgZ2V0QWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gQWxpZ25tZW50OyB9CisKKyAgLy8vIHNldEFsaWdubWVudCAtIFNldCB0aGUgYWxpZ25tZW50IChsb2cyLCBub3QgYnl0ZXMpIG9mIHRoZSBmdW5jdGlvbi4KKyAgdm9pZCBzZXRBbGlnbm1lbnQodW5zaWduZWQgQSkgeyBBbGlnbm1lbnQgPSBBOyB9CisKKyAgLy8vIGVuc3VyZUFsaWdubWVudCAtIE1ha2Ugc3VyZSB0aGUgZnVuY3Rpb24gaXMgYXQgbGVhc3QgMSA8PCBBIGJ5dGVzIGFsaWduZWQuCisgIHZvaWQgZW5zdXJlQWxpZ25tZW50KHVuc2lnbmVkIEEpIHsKKyAgICBpZiAoQWxpZ25tZW50IDwgQSkgQWxpZ25tZW50ID0gQTsKKyAgfQorCisgIC8vLyBleHBvc2VzUmV0dXJuc1R3aWNlIC0gUmV0dXJucyB0cnVlIGlmIHRoZSBmdW5jdGlvbiBjYWxscyBzZXRqbXAgb3IKKyAgLy8vIGFueSBvdGhlciBzaW1pbGFyIGZ1bmN0aW9ucyB3aXRoIGF0dHJpYnV0ZSAicmV0dXJucyB0d2ljZSIgd2l0aG91dAorICAvLy8gaGF2aW5nIHRoZSBhdHRyaWJ1dGUgaXRzZWxmLgorICBib29sIGV4cG9zZXNSZXR1cm5zVHdpY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIEV4cG9zZXNSZXR1cm5zVHdpY2U7CisgIH0KKworICAvLy8gc2V0Q2FsbHNTZXRKbXAgLSBTZXQgYSBmbGFnIHRoYXQgaW5kaWNhdGVzIGlmIHRoZXJlJ3MgYSBjYWxsIHRvCisgIC8vLyBhICJyZXR1cm5zIHR3aWNlIiBmdW5jdGlvbi4KKyAgdm9pZCBzZXRFeHBvc2VzUmV0dXJuc1R3aWNlKGJvb2wgQikgeworICAgIEV4cG9zZXNSZXR1cm5zVHdpY2UgPSBCOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gY29udGFpbnMgYW55IGlubGluZSBhc3NlbWJseS4KKyAgYm9vbCBoYXNJbmxpbmVBc20oKSBjb25zdCB7CisgICAgcmV0dXJuIEhhc0lubGluZUFzbTsKKyAgfQorCisgIC8vLyBTZXQgYSBmbGFnIHRoYXQgaW5kaWNhdGVzIHRoYXQgdGhlIGZ1bmN0aW9uIGNvbnRhaW5zIGlubGluZSBhc3NlbWJseS4KKyAgdm9pZCBzZXRIYXNJbmxpbmVBc20oYm9vbCBCKSB7CisgICAgSGFzSW5saW5lQXNtID0gQjsKKyAgfQorCisgIGJvb2wgaGFzV2luQ0ZJKCkgY29uc3QgeworICAgIGFzc2VydChIYXNXaW5DRkkuaGFzVmFsdWUoKSAmJiAiSGFzV2luQ0ZJIG5vdCBzZXQgeWV0ISIpOworICAgIHJldHVybiAqSGFzV2luQ0ZJOworICB9CisgIHZvaWQgc2V0SGFzV2luQ0ZJKGJvb2wgdikgeyBIYXNXaW5DRkkgPSB2OyB9CisKKyAgLy8vIEdldCB0aGUgZnVuY3Rpb24gcHJvcGVydGllcworICBjb25zdCBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzICZnZXRQcm9wZXJ0aWVzKCkgY29uc3QgeyByZXR1cm4gUHJvcGVydGllczsgfQorICBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzICZnZXRQcm9wZXJ0aWVzKCkgeyByZXR1cm4gUHJvcGVydGllczsgfQorCisgIC8vLyBnZXRJbmZvIC0gS2VlcCB0cmFjayBvZiB2YXJpb3VzIHBlci1mdW5jdGlvbiBwaWVjZXMgb2YgaW5mb3JtYXRpb24gZm9yCisgIC8vLyBiYWNrZW5kcyB0aGF0IHdvdWxkIGxpa2UgdG8gZG8gc28uCisgIC8vLworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeT4KKyAgVHkgKmdldEluZm8oKSB7CisgICAgaWYgKCFNRkluZm8pCisgICAgICBNRkluZm8gPSBUeTo6dGVtcGxhdGUgY3JlYXRlPFR5PihBbGxvY2F0b3IsICp0aGlzKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHkqPihNRkluZm8pOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHk+CisgIGNvbnN0IFR5ICpnZXRJbmZvKCkgY29uc3QgeworICAgICByZXR1cm4gY29uc3RfY2FzdDxNYWNoaW5lRnVuY3Rpb24qPih0aGlzKS0+Z2V0SW5mbzxUeT4oKTsKKyAgfQorCisgIC8vLyBnZXRCbG9ja051bWJlcmVkIC0gTWFjaGluZUJhc2ljQmxvY2tzIGFyZSBhdXRvbWF0aWNhbGx5IG51bWJlcmVkIHdoZW4gdGhleQorICAvLy8gYXJlIGluc2VydGVkIGludG8gdGhlIG1hY2hpbmUgZnVuY3Rpb24uICBUaGUgYmxvY2sgbnVtYmVyIGZvciBhIG1hY2hpbmUKKyAgLy8vIGJhc2ljIGJsb2NrIGNhbiBiZSBmb3VuZCBieSB1c2luZyB0aGUgTUJCOjpnZXROdW1iZXIgbWV0aG9kLCB0aGlzIG1ldGhvZAorICAvLy8gcHJvdmlkZXMgdGhlIGludmVyc2UgbWFwcGluZy4KKyAgTWFjaGluZUJhc2ljQmxvY2sgKmdldEJsb2NrTnVtYmVyZWQodW5zaWduZWQgTikgY29uc3QgeworICAgIGFzc2VydChOIDwgTUJCTnVtYmVyaW5nLnNpemUoKSAmJiAiSWxsZWdhbCBibG9jayBudW1iZXIiKTsKKyAgICBhc3NlcnQoTUJCTnVtYmVyaW5nW05dICYmICJCbG9jayB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBtYWNoaW5lIGZ1bmN0aW9uISIpOworICAgIHJldHVybiBNQkJOdW1iZXJpbmdbTl07CisgIH0KKworICAvLy8gU2hvdWxkIHdlIGJlIGVtaXR0aW5nIHNlZ21lbnRlZCBzdGFjayBzdHVmZiBmb3IgdGhlIGZ1bmN0aW9uCisgIGJvb2wgc2hvdWxkU3BsaXRTdGFjaygpIGNvbnN0OworCisgIC8vLyBnZXROdW1CbG9ja0lEcyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIE1CQiBJRCdzIGFsbG9jYXRlZC4KKyAgdW5zaWduZWQgZ2V0TnVtQmxvY2tJRHMoKSBjb25zdCB7IHJldHVybiAodW5zaWduZWQpTUJCTnVtYmVyaW5nLnNpemUoKTsgfQorCisgIC8vLyBSZW51bWJlckJsb2NrcyAtIFRoaXMgZGlzY2FyZHMgYWxsIG9mIHRoZSBNYWNoaW5lQmFzaWNCbG9jayBudW1iZXJzIGFuZAorICAvLy8gcmVjb21wdXRlcyB0aGVtLiAgVGhpcyBndWFyYW50ZWVzIHRoYXQgdGhlIE1CQiBudW1iZXJzIGFyZSBzZXF1ZW50aWFsLAorICAvLy8gZGVuc2UsIGFuZCBtYXRjaCB0aGUgb3JkZXJpbmcgb2YgdGhlIGJsb2NrcyB3aXRoaW4gdGhlIGZ1bmN0aW9uLiAgSWYgYQorICAvLy8gc3BlY2lmaWMgTWFjaGluZUJhc2ljQmxvY2sgaXMgc3BlY2lmaWVkLCBvbmx5IHRoYXQgYmxvY2sgYW5kIHRob3NlIGFmdGVyCisgIC8vLyBpdCBhcmUgcmVudW1iZXJlZC4KKyAgdm9pZCBSZW51bWJlckJsb2NrcyhNYWNoaW5lQmFzaWNCbG9jayAqTUJCRnJvbSA9IG51bGxwdHIpOworCisgIC8vLyBwcmludCAtIFByaW50IG91dCB0aGUgTWFjaGluZUZ1bmN0aW9uIGluIGEgZm9ybWF0IHN1aXRhYmxlIGZvciBkZWJ1Z2dpbmcKKyAgLy8vIHRvIHRoZSBzcGVjaWZpZWQgc3RyZWFtLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgU2xvdEluZGV4ZXMqID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIHZpZXdDRkcgLSBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IGZvciB1c2UgZnJvbSB0aGUgZGVidWdnZXIuICBZb3UgY2FuIGp1c3QKKyAgLy8vIHNheSAnY2FsbCBGLT52aWV3Q0ZHKCknIGFuZCBhIGdob3N0dmlldyB3aW5kb3cgc2hvdWxkIHBvcCB1cCBmcm9tIHRoZQorICAvLy8gcHJvZ3JhbSwgZGlzcGxheWluZyB0aGUgQ0ZHIG9mIHRoZSBjdXJyZW50IGZ1bmN0aW9uIHdpdGggdGhlIGNvZGUgZm9yIGVhY2gKKyAgLy8vIGJhc2ljIGJsb2NrIGluc2lkZS4gIFRoaXMgZGVwZW5kcyBvbiB0aGVyZSBiZWluZyBhICdkb3QnIGFuZCAnZ3YnIHByb2dyYW0KKyAgLy8vIGluIHlvdXIgcGF0aC4KKyAgdm9pZCB2aWV3Q0ZHKCkgY29uc3Q7CisKKyAgLy8vIHZpZXdDRkdPbmx5IC0gVGhpcyBmdW5jdGlvbiBpcyBtZWFudCBmb3IgdXNlIGZyb20gdGhlIGRlYnVnZ2VyLiAgSXQgd29ya3MKKyAgLy8vIGp1c3QgbGlrZSB2aWV3Q0ZHLCBidXQgaXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgY29udGVudHMgb2YgYmFzaWMgYmxvY2tzCisgIC8vLyBpbnRvIHRoZSBub2RlcywganVzdCB0aGUgbGFiZWwuICBJZiB5b3UgYXJlIG9ubHkgaW50ZXJlc3RlZCBpbiB0aGUgQ0ZHCisgIC8vLyB0aGlzIGNhbiBtYWtlIHRoZSBncmFwaCBzbWFsbGVyLgorICAvLy8KKyAgdm9pZCB2aWV3Q0ZHT25seSgpIGNvbnN0OworCisgIC8vLyBkdW1wIC0gUHJpbnQgdGhlIGN1cnJlbnQgTWFjaGluZUZ1bmN0aW9uIHRvIGNlcnIsIHVzZWZ1bCBmb3IgZGVidWdnZXIgdXNlLgorICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLy8gUnVuIHRoZSBjdXJyZW50IE1hY2hpbmVGdW5jdGlvbiB0aHJvdWdoIHRoZSBtYWNoaW5lIGNvZGUgdmVyaWZpZXIsIHVzZWZ1bAorICAvLy8gZm9yIGRlYnVnZ2VyIHVzZS4KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgbm8gcHJvYmxlbXMgd2VyZSBmb3VuZC4KKyAgYm9vbCB2ZXJpZnkoUGFzcyAqcCA9IG51bGxwdHIsIGNvbnN0IGNoYXIgKkJhbm5lciA9IG51bGxwdHIsCisgICAgICAgICAgICAgIGJvb2wgQWJvcnRPbkVycm9yID0gdHJ1ZSkgY29uc3Q7CisKKyAgLy8gUHJvdmlkZSBhY2Nlc3NvcnMgZm9yIHRoZSBNYWNoaW5lQmFzaWNCbG9jayBsaXN0Li4uCisgIHVzaW5nIGl0ZXJhdG9yID0gQmFzaWNCbG9ja0xpc3RUeXBlOjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBCYXNpY0Jsb2NrTGlzdFR5cGU6OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yID0gQmFzaWNCbG9ja0xpc3RUeXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICB1c2luZyByZXZlcnNlX2l0ZXJhdG9yID0gQmFzaWNCbG9ja0xpc3RUeXBlOjpyZXZlcnNlX2l0ZXJhdG9yOworCisgIC8vLyBTdXBwb3J0IGZvciBNYWNoaW5lQmFzaWNCbG9jazo6Z2V0TmV4dE5vZGUoKS4KKyAgc3RhdGljIEJhc2ljQmxvY2tMaXN0VHlwZSBNYWNoaW5lRnVuY3Rpb246OioKKyAgZ2V0U3VibGlzdEFjY2VzcyhNYWNoaW5lQmFzaWNCbG9jayAqKSB7CisgICAgcmV0dXJuICZNYWNoaW5lRnVuY3Rpb246OkJhc2ljQmxvY2tzOworICB9CisKKyAgLy8vIGFkZExpdmVJbiAtIEFkZCB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsIHJlZ2lzdGVyIGFzIGEgbGl2ZS1pbiB2YWx1ZSBhbmQKKyAgLy8vIGNyZWF0ZSBhIGNvcnJlc3BvbmRpbmcgdmlydHVhbCByZWdpc3RlciBmb3IgaXQuCisgIHVuc2lnbmVkIGFkZExpdmVJbih1bnNpZ25lZCBQUmVnLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEJhc2ljQmxvY2sgYWNjZXNzb3IgZnVuY3Rpb25zLgorICAvLworICBpdGVyYXRvciAgICAgICAgICAgICAgICAgYmVnaW4oKSAgICAgICB7IHJldHVybiBCYXNpY0Jsb2Nrcy5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgICBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgICAgICAgICAgICAgICAgIGVuZCAgKCkgICAgICAgeyByZXR1cm4gQmFzaWNCbG9ja3MuZW5kKCk7ICAgfQorICBjb25zdF9pdGVyYXRvciAgICAgICAgICAgZW5kICAoKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2Nrcy5lbmQoKTsgICB9CisKKyAgcmV2ZXJzZV9pdGVyYXRvciAgICAgICAgcmJlZ2luKCkgICAgICAgeyByZXR1cm4gQmFzaWNCbG9ja3MucmJlZ2luKCk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciAgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3MucmJlZ2luKCk7IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciAgICAgICAgcmVuZCAgKCkgICAgICAgeyByZXR1cm4gQmFzaWNCbG9ja3MucmVuZCgpOyAgIH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciAgcmVuZCAgKCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3MucmVuZCgpOyAgIH0KKworICB1bnNpZ25lZCAgICAgICAgICAgICAgICAgIHNpemUoKSBjb25zdCB7IHJldHVybiAodW5zaWduZWQpQmFzaWNCbG9ja3Muc2l6ZSgpO30KKyAgYm9vbCAgICAgICAgICAgICAgICAgICAgIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3MuZW1wdHkoKTsgfQorICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmZnJvbnQoKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2Nrcy5mcm9udCgpOyB9CisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZmcm9udCgpICAgICAgIHsgcmV0dXJuIEJhc2ljQmxvY2tzLmZyb250KCk7IH0KKyAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJiBiYWNrKCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3MuYmFjaygpOyB9CisgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICYgYmFjaygpICAgICAgIHsgcmV0dXJuIEJhc2ljQmxvY2tzLmJhY2soKTsgfQorCisgIHZvaWQgcHVzaF9iYWNrIChNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7IEJhc2ljQmxvY2tzLnB1c2hfYmFjayAoTUJCKTsgfQorICB2b2lkIHB1c2hfZnJvbnQoTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgeyBCYXNpY0Jsb2Nrcy5wdXNoX2Zyb250KE1CQik7IH0KKyAgdm9pZCBpbnNlcnQoaXRlcmF0b3IgTUJCSSwgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgeworICAgIEJhc2ljQmxvY2tzLmluc2VydChNQkJJLCBNQkIpOworICB9CisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIEluc2VydFB0LCBpdGVyYXRvciBNQkJJKSB7CisgICAgQmFzaWNCbG9ja3Muc3BsaWNlKEluc2VydFB0LCBCYXNpY0Jsb2NrcywgTUJCSSk7CisgIH0KKyAgdm9pZCBzcGxpY2UoaXRlcmF0b3IgSW5zZXJ0UHQsIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIHsKKyAgICBCYXNpY0Jsb2Nrcy5zcGxpY2UoSW5zZXJ0UHQsIEJhc2ljQmxvY2tzLCBNQkIpOworICB9CisgIHZvaWQgc3BsaWNlKGl0ZXJhdG9yIEluc2VydFB0LCBpdGVyYXRvciBNQkJJLCBpdGVyYXRvciBNQkJFKSB7CisgICAgQmFzaWNCbG9ja3Muc3BsaWNlKEluc2VydFB0LCBCYXNpY0Jsb2NrcywgTUJCSSwgTUJCRSk7CisgIH0KKworICB2b2lkIHJlbW92ZShpdGVyYXRvciBNQkJJKSB7IEJhc2ljQmxvY2tzLnJlbW92ZShNQkJJKTsgfQorICB2b2lkIHJlbW92ZShNYWNoaW5lQmFzaWNCbG9jayAqTUJCSSkgeyBCYXNpY0Jsb2Nrcy5yZW1vdmUoTUJCSSk7IH0KKyAgdm9pZCBlcmFzZShpdGVyYXRvciBNQkJJKSB7IEJhc2ljQmxvY2tzLmVyYXNlKE1CQkkpOyB9CisgIHZvaWQgZXJhc2UoTWFjaGluZUJhc2ljQmxvY2sgKk1CQkkpIHsgQmFzaWNCbG9ja3MuZXJhc2UoTUJCSSk7IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29tcD4KKyAgdm9pZCBzb3J0KENvbXAgY29tcCkgeworICAgIEJhc2ljQmxvY2tzLnNvcnQoY29tcCk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSW50ZXJuYWwgZnVuY3Rpb25zIHVzZWQgdG8gYXV0b21hdGljYWxseSBudW1iZXIgTWFjaGluZUJhc2ljQmxvY2tzCisKKyAgLy8vIFxicmllZiBBZGRzIHRoZSBNQkIgdG8gdGhlIGludGVybmFsIG51bWJlcmluZy4gUmV0dXJucyB0aGUgdW5pcXVlIG51bWJlcgorICAvLy8gYXNzaWduZWQgdG8gdGhlIE1CQi4KKyAgdW5zaWduZWQgYWRkVG9NQkJOdW1iZXJpbmcoTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgeworICAgIE1CQk51bWJlcmluZy5wdXNoX2JhY2soTUJCKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkKU1CQk51bWJlcmluZy5zaXplKCktMTsKKyAgfQorCisgIC8vLyByZW1vdmVGcm9tTUJCTnVtYmVyaW5nIC0gUmVtb3ZlIHRoZSBzcGVjaWZpYyBtYWNoaW5lIGJhc2ljIGJsb2NrIGZyb20gb3VyCisgIC8vLyB0cmFja2VyLCB0aGlzIGlzIG9ubHkgcmVhbGx5IHRvIGJlIHVzZWQgYnkgdGhlIE1hY2hpbmVCYXNpY0Jsb2NrCisgIC8vLyBpbXBsZW1lbnRhdGlvbi4KKyAgdm9pZCByZW1vdmVGcm9tTUJCTnVtYmVyaW5nKHVuc2lnbmVkIE4pIHsKKyAgICBhc3NlcnQoTiA8IE1CQk51bWJlcmluZy5zaXplKCkgJiYgIklsbGVnYWwgYmFzaWMgYmxvY2sgIyIpOworICAgIE1CQk51bWJlcmluZ1tOXSA9IG51bGxwdHI7CisgIH0KKworICAvLy8gQ3JlYXRlTWFjaGluZUluc3RyIC0gQWxsb2NhdGUgYSBuZXcgTWFjaGluZUluc3RyLiBVc2UgdGhpcyBpbnN0ZWFkCisgIC8vLyBvZiBgbmV3IE1hY2hpbmVJbnN0cicuCisgIE1hY2hpbmVJbnN0ciAqQ3JlYXRlTWFjaGluZUluc3RyKGNvbnN0IE1DSW5zdHJEZXNjICZNQ0lELCBjb25zdCBEZWJ1Z0xvYyAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTm9JbXAgPSBmYWxzZSk7CisKKyAgLy8vIENyZWF0ZSBhIG5ldyBNYWNoaW5lSW5zdHIgd2hpY2ggaXMgYSBjb3B5IG9mIFxwIE9yaWcsIGlkZW50aWNhbCBpbiBhbGwKKyAgLy8vIHdheXMgZXhjZXB0IHRoZSBpbnN0cnVjdGlvbiBoYXMgbm8gcGFyZW50LCBwcmV2LCBvciBuZXh0LiBCdW5kbGluZyBmbGFncworICAvLy8gYXJlIHJlc2V0LgorICAvLy8KKyAgLy8vIE5vdGU6IENsb25lcyBhIHNpbmdsZSBpbnN0cnVjdGlvbiwgbm90IHdob2xlIGluc3RydWN0aW9uIGJ1bmRsZXMuCisgIC8vLyBEb2VzIG5vdCBwZXJmb3JtIHRhcmdldCBzcGVjaWZpYyBhZGp1c3RtZW50czsgY29uc2lkZXIgdXNpbmcKKyAgLy8vIFRhcmdldEluc3RySW5mbzo6ZHVwbGljYXRlKCkgaW5zdGVhZC4KKyAgTWFjaGluZUluc3RyICpDbG9uZU1hY2hpbmVJbnN0cihjb25zdCBNYWNoaW5lSW5zdHIgKk9yaWcpOworCisgIC8vLyBDbG9uZXMgaW5zdHJ1Y3Rpb24gb3IgdGhlIHdob2xlIGluc3RydWN0aW9uIGJ1bmRsZSBccCBPcmlnIGFuZCBpbnNlcnQKKyAgLy8vIGludG8gXHAgTUJCIGJlZm9yZSBccCBJbnNlcnRCZWZvcmUuCisgIC8vLworICAvLy8gTm90ZTogRG9lcyBub3QgcGVyZm9ybSB0YXJnZXQgc3BlY2lmaWMgYWRqdXN0bWVudHM7IGNvbnNpZGVyIHVzaW5nCisgIC8vLyBUYXJnZXRJbnN0ckluZm86OmR1cGxpY2F0ZSgpIGludGVhZC4KKyAgTWFjaGluZUluc3RyICZDbG9uZU1hY2hpbmVJbnN0ckJ1bmRsZShNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEluc2VydEJlZm9yZSwgY29uc3QgTWFjaGluZUluc3RyICZPcmlnKTsKKworICAvLy8gRGVsZXRlTWFjaGluZUluc3RyIC0gRGVsZXRlIHRoZSBnaXZlbiBNYWNoaW5lSW5zdHIuCisgIHZvaWQgRGVsZXRlTWFjaGluZUluc3RyKE1hY2hpbmVJbnN0ciAqTUkpOworCisgIC8vLyBDcmVhdGVNYWNoaW5lQmFzaWNCbG9jayAtIEFsbG9jYXRlIGEgbmV3IE1hY2hpbmVCYXNpY0Jsb2NrLiBVc2UgdGhpcworICAvLy8gaW5zdGVhZCBvZiBgbmV3IE1hY2hpbmVCYXNpY0Jsb2NrJy4KKyAgTWFjaGluZUJhc2ljQmxvY2sgKkNyZWF0ZU1hY2hpbmVCYXNpY0Jsb2NrKGNvbnN0IEJhc2ljQmxvY2sgKmJiID0gbnVsbHB0cik7CisKKyAgLy8vIERlbGV0ZU1hY2hpbmVCYXNpY0Jsb2NrIC0gRGVsZXRlIHRoZSBnaXZlbiBNYWNoaW5lQmFzaWNCbG9jay4KKyAgdm9pZCBEZWxldGVNYWNoaW5lQmFzaWNCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqTUJCKTsKKworICAvLy8gZ2V0TWFjaGluZU1lbU9wZXJhbmQgLSBBbGxvY2F0ZSBhIG5ldyBNYWNoaW5lTWVtT3BlcmFuZC4KKyAgLy8vIE1hY2hpbmVNZW1PcGVyYW5kcyBhcmUgb3duZWQgYnkgdGhlIE1hY2hpbmVGdW5jdGlvbiBhbmQgbmVlZCBub3QgYmUKKyAgLy8vIGV4cGxpY2l0bHkgZGVhbGxvY2F0ZWQuCisgIE1hY2hpbmVNZW1PcGVyYW5kICpnZXRNYWNoaW5lTWVtT3BlcmFuZCgKKyAgICAgIE1hY2hpbmVQb2ludGVySW5mbyBQdHJJbmZvLCBNYWNoaW5lTWVtT3BlcmFuZDo6RmxhZ3MgZiwgdWludDY0X3QgcywKKyAgICAgIHVuc2lnbmVkIGJhc2VfYWxpZ25tZW50LCBjb25zdCBBQU1ETm9kZXMgJkFBSW5mbyA9IEFBTUROb2RlcygpLAorICAgICAgY29uc3QgTUROb2RlICpSYW5nZXMgPSBudWxscHRyLAorICAgICAgU3luY1Njb3BlOjpJRCBTU0lEID0gU3luY1Njb3BlOjpTeXN0ZW0sCisgICAgICBBdG9taWNPcmRlcmluZyBPcmRlcmluZyA9IEF0b21pY09yZGVyaW5nOjpOb3RBdG9taWMsCisgICAgICBBdG9taWNPcmRlcmluZyBGYWlsdXJlT3JkZXJpbmcgPSBBdG9taWNPcmRlcmluZzo6Tm90QXRvbWljKTsKKworICAvLy8gZ2V0TWFjaGluZU1lbU9wZXJhbmQgLSBBbGxvY2F0ZSBhIG5ldyBNYWNoaW5lTWVtT3BlcmFuZCBieSBjb3B5aW5nCisgIC8vLyBhbiBleGlzdGluZyBvbmUsIGFkanVzdGluZyBieSBhbiBvZmZzZXQgYW5kIHVzaW5nIHRoZSBnaXZlbiBzaXplLgorICAvLy8gTWFjaGluZU1lbU9wZXJhbmRzIGFyZSBvd25lZCBieSB0aGUgTWFjaGluZUZ1bmN0aW9uIGFuZCBuZWVkIG5vdCBiZQorICAvLy8gZXhwbGljaXRseSBkZWFsbG9jYXRlZC4KKyAgTWFjaGluZU1lbU9wZXJhbmQgKmdldE1hY2hpbmVNZW1PcGVyYW5kKGNvbnN0IE1hY2hpbmVNZW1PcGVyYW5kICpNTU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IE9mZnNldCwgdWludDY0X3QgU2l6ZSk7CisKKyAgLy8vIEFsbG9jYXRlIGEgbmV3IE1hY2hpbmVNZW1PcGVyYW5kIGJ5IGNvcHlpbmcgYW4gZXhpc3Rpbmcgb25lLAorICAvLy8gcmVwbGFjaW5nIG9ubHkgQWxpYXNBbmFseXNpcyBpbmZvcm1hdGlvbi4gTWFjaGluZU1lbU9wZXJhbmRzIGFyZSBvd25lZAorICAvLy8gYnkgdGhlIE1hY2hpbmVGdW5jdGlvbiBhbmQgbmVlZCBub3QgYmUgZXhwbGljaXRseSBkZWFsbG9jYXRlZC4KKyAgTWFjaGluZU1lbU9wZXJhbmQgKmdldE1hY2hpbmVNZW1PcGVyYW5kKGNvbnN0IE1hY2hpbmVNZW1PcGVyYW5kICpNTU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBQU1ETm9kZXMgJkFBSW5mbyk7CisKKyAgdXNpbmcgT3BlcmFuZENhcGFjaXR5ID0gQXJyYXlSZWN5Y2xlcjxNYWNoaW5lT3BlcmFuZD46OkNhcGFjaXR5OworCisgIC8vLyBBbGxvY2F0ZSBhbiBhcnJheSBvZiBNYWNoaW5lT3BlcmFuZHMuIFRoaXMgaXMgb25seSBpbnRlbmRlZCBmb3IgdXNlIGJ5CisgIC8vLyBpbnRlcm5hbCBNYWNoaW5lSW5zdHIgZnVuY3Rpb25zLgorICBNYWNoaW5lT3BlcmFuZCAqYWxsb2NhdGVPcGVyYW5kQXJyYXkoT3BlcmFuZENhcGFjaXR5IENhcCkgeworICAgIHJldHVybiBPcGVyYW5kUmVjeWNsZXIuYWxsb2NhdGUoQ2FwLCBBbGxvY2F0b3IpOworICB9CisKKyAgLy8vIERlbGxvY2F0ZSBhbiBhcnJheSBvZiBNYWNoaW5lT3BlcmFuZHMgYW5kIHJlY3ljbGUgdGhlIG1lbW9yeS4gVGhpcyBpcworICAvLy8gb25seSBpbnRlbmRlZCBmb3IgdXNlIGJ5IGludGVybmFsIE1hY2hpbmVJbnN0ciBmdW5jdGlvbnMuCisgIC8vLyBDYXAgbXVzdCBiZSB0aGUgc2FtZSBjYXBhY2l0eSB0aGF0IHdhcyB1c2VkIHRvIGFsbG9jYXRlIHRoZSBhcnJheS4KKyAgdm9pZCBkZWFsbG9jYXRlT3BlcmFuZEFycmF5KE9wZXJhbmRDYXBhY2l0eSBDYXAsIE1hY2hpbmVPcGVyYW5kICpBcnJheSkgeworICAgIE9wZXJhbmRSZWN5Y2xlci5kZWFsbG9jYXRlKENhcCwgQXJyYXkpOworICB9CisKKyAgLy8vIFxicmllZiBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIHJlZ2lzdGVyIG1hc2sgd2l0aCBAcCBOdW1SZWdpc3RlciBiaXRzLgorICB1aW50MzJfdCAqYWxsb2NhdGVSZWdpc3Rlck1hc2sodW5zaWduZWQgTnVtUmVnaXN0ZXIpIHsKKyAgICB1bnNpZ25lZCBTaXplID0gKE51bVJlZ2lzdGVyICsgMzEpIC8gMzI7CisgICAgdWludDMyX3QgKk1hc2sgPSBBbGxvY2F0b3IuQWxsb2NhdGU8dWludDMyX3Q+KFNpemUpOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gU2l6ZTsgKytpKQorICAgICAgTWFza1tpXSA9IDA7CisgICAgcmV0dXJuIE1hc2s7CisgIH0KKworICAvLy8gYWxsb2NhdGVNZW1SZWZzQXJyYXkgLSBBbGxvY2F0ZSBhbiBhcnJheSB0byBob2xkIE1hY2hpbmVNZW1PcGVyYW5kCisgIC8vLyBwb2ludGVycy4gIFRoaXMgYXJyYXkgaXMgb3duZWQgYnkgdGhlIE1hY2hpbmVGdW5jdGlvbi4KKyAgTWFjaGluZUluc3RyOjptbW9faXRlcmF0b3IgYWxsb2NhdGVNZW1SZWZzQXJyYXkodW5zaWduZWQgbG9uZyBOdW0pOworCisgIC8vLyBleHRyYWN0TG9hZE1lbVJlZnMgLSBBbGxvY2F0ZSBhbiBhcnJheSBhbmQgcG9wdWxhdGUgaXQgd2l0aCBqdXN0IHRoZQorICAvLy8gbG9hZCBpbmZvcm1hdGlvbiBmcm9tIHRoZSBnaXZlbiBNYWNoaW5lTWVtT3BlcmFuZCBzZXF1ZW5jZS4KKyAgc3RkOjpwYWlyPE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yLAorICAgICAgICAgICAgTWFjaGluZUluc3RyOjptbW9faXRlcmF0b3I+CisgICAgZXh0cmFjdExvYWRNZW1SZWZzKE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yIEJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvciBFbmQpOworCisgIC8vLyBleHRyYWN0U3RvcmVNZW1SZWZzIC0gQWxsb2NhdGUgYW4gYXJyYXkgYW5kIHBvcHVsYXRlIGl0IHdpdGgganVzdCB0aGUKKyAgLy8vIHN0b3JlIGluZm9ybWF0aW9uIGZyb20gdGhlIGdpdmVuIE1hY2hpbmVNZW1PcGVyYW5kIHNlcXVlbmNlLgorICBzdGQ6OnBhaXI8TWFjaGluZUluc3RyOjptbW9faXRlcmF0b3IsCisgICAgICAgICAgICBNYWNoaW5lSW5zdHI6Om1tb19pdGVyYXRvcj4KKyAgICBleHRyYWN0U3RvcmVNZW1SZWZzKE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yIEJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyOjptbW9faXRlcmF0b3IgRW5kKTsKKworICAvLy8gQWxsb2NhdGUgYSBzdHJpbmcgYW5kIHBvcHVsYXRlIGl0IHdpdGggdGhlIGdpdmVuIGV4dGVybmFsIHN5bWJvbCBuYW1lLgorICBjb25zdCBjaGFyICpjcmVhdGVFeHRlcm5hbFN5bWJvbE5hbWUoU3RyaW5nUmVmIE5hbWUpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBMYWJlbCBNYW5pcHVsYXRpb24uCisKKyAgLy8vIGdldEpUSVN5bWJvbCAtIFJldHVybiB0aGUgTUNTeW1ib2wgZm9yIHRoZSBzcGVjaWZpZWQgbm9uLWVtcHR5IGp1bXAgdGFibGUuCisgIC8vLyBJZiBpc0xpbmtlclByaXZhdGUgaXMgc3BlY2lmaWVkLCBhbiAnbCcgbGFiZWwgaXMgcmV0dXJuZWQsIG90aGVyd2lzZSBhCisgIC8vLyBub3JtYWwgJ0wnIGxhYmVsIGlzIHJldHVybmVkLgorICBNQ1N5bWJvbCAqZ2V0SlRJU3ltYm9sKHVuc2lnbmVkIEpUSSwgTUNDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0xpbmtlclByaXZhdGUgPSBmYWxzZSkgY29uc3Q7CisKKyAgLy8vIGdldFBJQ0Jhc2VTeW1ib2wgLSBSZXR1cm4gYSBmdW5jdGlvbi1sb2NhbCBzeW1ib2wgdG8gcmVwcmVzZW50IHRoZSBQSUMKKyAgLy8vIGJhc2UuCisgIE1DU3ltYm9sICpnZXRQSUNCYXNlU3ltYm9sKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgYSByZWZlcmVuY2UgdG8gYSBsaXN0IG9mIGNmaSBpbnN0cnVjdGlvbnMgaW4gdGhlIGZ1bmN0aW9uJ3MKKyAgLy8vIHByb2xvZ3VlLiAgVXNlZCB0byBjb25zdHJ1Y3QgZnJhbWUgbWFwcyBmb3IgZGVidWcgYW5kIGV4Y2VwdGlvbiBoYW5kbGluZworICAvLy8gY29tc3VtZXJzLgorICBjb25zdCBzdGQ6OnZlY3RvcjxNQ0NGSUluc3RydWN0aW9uPiAmZ2V0RnJhbWVJbnN0cnVjdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIEZyYW1lSW5zdHJ1Y3Rpb25zOworICB9CisKKyAgTExWTV9OT0RJU0NBUkQgdW5zaWduZWQgYWRkRnJhbWVJbnN0KGNvbnN0IE1DQ0ZJSW5zdHJ1Y3Rpb24gJkluc3QpIHsKKyAgICBGcmFtZUluc3RydWN0aW9ucy5wdXNoX2JhY2soSW5zdCk7CisgICAgcmV0dXJuIEZyYW1lSW5zdHJ1Y3Rpb25zLnNpemUoKSAtIDE7CisgIH0KKworICAvLy8gXG5hbWUgRXhjZXB0aW9uIEhhbmRsaW5nCisgIC8vLyBceworCisgIGJvb2wgY2FsbHNFSFJldHVybigpIGNvbnN0IHsgcmV0dXJuIENhbGxzRUhSZXR1cm47IH0KKyAgdm9pZCBzZXRDYWxsc0VIUmV0dXJuKGJvb2wgYikgeyBDYWxsc0VIUmV0dXJuID0gYjsgfQorCisgIGJvb2wgY2FsbHNVbndpbmRJbml0KCkgY29uc3QgeyByZXR1cm4gQ2FsbHNVbndpbmRJbml0OyB9CisgIHZvaWQgc2V0Q2FsbHNVbndpbmRJbml0KGJvb2wgYikgeyBDYWxsc1Vud2luZEluaXQgPSBiOyB9CisKKyAgYm9vbCBoYXNFSEZ1bmNsZXRzKCkgY29uc3QgeyByZXR1cm4gSGFzRUhGdW5jbGV0czsgfQorICB2b2lkIHNldEhhc0VIRnVuY2xldHMoYm9vbCBWKSB7IEhhc0VIRnVuY2xldHMgPSBWOyB9CisKKyAgLy8vIEZpbmQgb3IgY3JlYXRlIGFuIExhbmRpbmdQYWRJbmZvIGZvciB0aGUgc3BlY2lmaWVkIE1hY2hpbmVCYXNpY0Jsb2NrLgorICBMYW5kaW5nUGFkSW5mbyAmZ2V0T3JDcmVhdGVMYW5kaW5nUGFkSW5mbyhNYWNoaW5lQmFzaWNCbG9jayAqTGFuZGluZ1BhZCk7CisKKyAgLy8vIFJlbWFwIGxhbmRpbmcgcGFkIGxhYmVscyBhbmQgcmVtb3ZlIGFueSBkZWxldGVkIGxhbmRpbmcgcGFkcy4KKyAgdm9pZCB0aWR5TGFuZGluZ1BhZHMoRGVuc2VNYXA8TUNTeW1ib2wqLCB1aW50cHRyX3Q+ICpMUE1hcCA9IG51bGxwdHIpOworCisgIC8vLyBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGxhbmRpbmcgcGFkIGluZm8gZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICBjb25zdCBzdGQ6OnZlY3RvcjxMYW5kaW5nUGFkSW5mbz4gJmdldExhbmRpbmdQYWRzKCkgY29uc3QgeworICAgIHJldHVybiBMYW5kaW5nUGFkczsKKyAgfQorCisgIC8vLyBQcm92aWRlIHRoZSBiZWdpbiBhbmQgZW5kIGxhYmVscyBvZiBhbiBpbnZva2Ugc3R5bGUgY2FsbCBhbmQgYXNzb2NpYXRlIGl0CisgIC8vLyB3aXRoIGEgdHJ5IGxhbmRpbmcgcGFkIGJsb2NrLgorICB2b2lkIGFkZEludm9rZShNYWNoaW5lQmFzaWNCbG9jayAqTGFuZGluZ1BhZCwKKyAgICAgICAgICAgICAgICAgTUNTeW1ib2wgKkJlZ2luTGFiZWwsIE1DU3ltYm9sICpFbmRMYWJlbCk7CisKKyAgLy8vIEFkZCBhIG5ldyBwYW5kaW5nIHBhZC4gIFJldHVybnMgdGhlIGxhYmVsIElEIGZvciB0aGUgbGFuZGluZyBwYWQgZW50cnkuCisgIE1DU3ltYm9sICphZGRMYW5kaW5nUGFkKE1hY2hpbmVCYXNpY0Jsb2NrICpMYW5kaW5nUGFkKTsKKworICAvLy8gUHJvdmlkZSB0aGUgY2F0Y2ggdHlwZWluZm8gZm9yIGEgbGFuZGluZyBwYWQuCisgIHZvaWQgYWRkQ2F0Y2hUeXBlSW5mbyhNYWNoaW5lQmFzaWNCbG9jayAqTGFuZGluZ1BhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IEdsb2JhbFZhbHVlICo+IFR5SW5mbyk7CisKKyAgLy8vIFByb3ZpZGUgdGhlIGZpbHRlciB0eXBlaW5mbyBmb3IgYSBsYW5kaW5nIHBhZC4KKyAgdm9pZCBhZGRGaWx0ZXJUeXBlSW5mbyhNYWNoaW5lQmFzaWNCbG9jayAqTGFuZGluZ1BhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBHbG9iYWxWYWx1ZSAqPiBUeUluZm8pOworCisgIC8vLyBBZGQgYSBjbGVhbnVwIGFjdGlvbiBmb3IgYSBsYW5kaW5nIHBhZC4KKyAgdm9pZCBhZGRDbGVhbnVwKE1hY2hpbmVCYXNpY0Jsb2NrICpMYW5kaW5nUGFkKTsKKworICB2b2lkIGFkZFNFSENhdGNoSGFuZGxlcihNYWNoaW5lQmFzaWNCbG9jayAqTGFuZGluZ1BhZCwgY29uc3QgRnVuY3Rpb24gKkZpbHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQmxvY2tBZGRyZXNzICpSZWNvdmVyTGFiZWwpOworCisgIHZvaWQgYWRkU0VIQ2xlYW51cEhhbmRsZXIoTWFjaGluZUJhc2ljQmxvY2sgKkxhbmRpbmdQYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb24gKkNsZWFudXApOworCisgIC8vLyBSZXR1cm4gdGhlIHR5cGUgaWQgZm9yIHRoZSBzcGVjaWZpZWQgdHlwZWluZm8uICBUaGlzIGlzIGZ1bmN0aW9uIHdpZGUuCisgIHVuc2lnbmVkIGdldFR5cGVJREZvcihjb25zdCBHbG9iYWxWYWx1ZSAqVEkpOworCisgIC8vLyBSZXR1cm4gdGhlIGlkIG9mIHRoZSBmaWx0ZXIgZW5jb2RlZCBieSBUeUlkcy4gIFRoaXMgaXMgZnVuY3Rpb24gd2lkZS4KKyAgaW50IGdldEZpbHRlcklERm9yKHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmVHlJZHMpOworCisgIC8vLyBNYXAgdGhlIGxhbmRpbmcgcGFkJ3MgRUggc3ltYm9sIHRvIHRoZSBjYWxsIHNpdGUgaW5kZXhlcy4KKyAgdm9pZCBzZXRDYWxsU2l0ZUxhbmRpbmdQYWQoTUNTeW1ib2wgKlN5bSwgQXJyYXlSZWY8dW5zaWduZWQ+IFNpdGVzKTsKKworICAvLy8gR2V0IHRoZSBjYWxsIHNpdGUgaW5kZXhlcyBmb3IgYSBsYW5kaW5nIHBhZCBFSCBzeW1ib2wuCisgIFNtYWxsVmVjdG9ySW1wbDx1bnNpZ25lZD4gJmdldENhbGxTaXRlTGFuZGluZ1BhZChNQ1N5bWJvbCAqU3ltKSB7CisgICAgYXNzZXJ0KGhhc0NhbGxTaXRlTGFuZGluZ1BhZChTeW0pICYmCisgICAgICAgICAgICJtaXNzaW5nIGNhbGwgc2l0ZSBudW1iZXIgZm9yIGxhbmRpbmcgcGFkISIpOworICAgIHJldHVybiBMUGFkVG9DYWxsU2l0ZU1hcFtTeW1dOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBsYW5kaW5nIHBhZCBFaCBzeW1ib2wgaGFzIGFuIGFzc29jaWF0ZWQgY2FsbCBzaXRlLgorICBib29sIGhhc0NhbGxTaXRlTGFuZGluZ1BhZChNQ1N5bWJvbCAqU3ltKSB7CisgICAgcmV0dXJuICFMUGFkVG9DYWxsU2l0ZU1hcFtTeW1dLmVtcHR5KCk7CisgIH0KKworICAvLy8gTWFwIHRoZSBiZWdpbiBsYWJlbCBmb3IgYSBjYWxsIHNpdGUuCisgIHZvaWQgc2V0Q2FsbFNpdGVCZWdpbkxhYmVsKE1DU3ltYm9sICpCZWdpbkxhYmVsLCB1bnNpZ25lZCBTaXRlKSB7CisgICAgQ2FsbFNpdGVNYXBbQmVnaW5MYWJlbF0gPSBTaXRlOworICB9CisKKyAgLy8vIEdldCB0aGUgY2FsbCBzaXRlIG51bWJlciBmb3IgYSBiZWdpbiBsYWJlbC4KKyAgdW5zaWduZWQgZ2V0Q2FsbFNpdGVCZWdpbkxhYmVsKE1DU3ltYm9sICpCZWdpbkxhYmVsKSBjb25zdCB7CisgICAgYXNzZXJ0KGhhc0NhbGxTaXRlQmVnaW5MYWJlbChCZWdpbkxhYmVsKSAmJgorICAgICAgICAgICAiTWlzc2luZyBjYWxsIHNpdGUgbnVtYmVyIGZvciBFSF9MQUJFTCEiKTsKKyAgICByZXR1cm4gQ2FsbFNpdGVNYXAubG9va3VwKEJlZ2luTGFiZWwpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBiZWdpbiBsYWJlbCBoYXMgYSBjYWxsIHNpdGUgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgYm9vbCBoYXNDYWxsU2l0ZUJlZ2luTGFiZWwoTUNTeW1ib2wgKkJlZ2luTGFiZWwpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2FsbFNpdGVNYXAuY291bnQoQmVnaW5MYWJlbCk7CisgIH0KKworICAvLy8gUmVjb3JkIGFubm90YXRpb25zIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgbGFiZWwuCisgIHZvaWQgYWRkQ29kZVZpZXdBbm5vdGF0aW9uKE1DU3ltYm9sICpMYWJlbCwgTUROb2RlICpNRCkgeworICAgIENvZGVWaWV3QW5ub3RhdGlvbnMucHVzaF9iYWNrKHtMYWJlbCwgTUR9KTsKKyAgfQorCisgIEFycmF5UmVmPHN0ZDo6cGFpcjxNQ1N5bWJvbCAqLCBNRE5vZGUgKj4+IGdldENvZGVWaWV3QW5ub3RhdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIENvZGVWaWV3QW5ub3RhdGlvbnM7CisgIH0KKworICAvLy8gUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBDKysgdHlwZWluZm8gZm9yIHRoZSBjdXJyZW50IGZ1bmN0aW9uLgorICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBHbG9iYWxWYWx1ZSAqPiAmZ2V0VHlwZUluZm9zKCkgY29uc3QgeworICAgIHJldHVybiBUeXBlSW5mb3M7CisgIH0KKworICAvLy8gUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSB0eXBlaWRzIGVuY29kaW5nIGZpbHRlcnMgdXNlZCBpbiB0aGUgY3VycmVudAorICAvLy8gZnVuY3Rpb24uCisgIGNvbnN0IHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmZ2V0RmlsdGVySWRzKCkgY29uc3QgeworICAgIHJldHVybiBGaWx0ZXJJZHM7CisgIH0KKworICAvLy8gXH0KKworICAvLy8gQ29sbGVjdCBpbmZvcm1hdGlvbiB1c2VkIHRvIGVtaXQgZGVidWdnaW5nIGluZm9ybWF0aW9uIG9mIGEgdmFyaWFibGUuCisgIHZvaWQgc2V0VmFyaWFibGVEYmdJbmZvKGNvbnN0IERJTG9jYWxWYXJpYWJsZSAqVmFyLCBjb25zdCBESUV4cHJlc3Npb24gKkV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNsb3QsIGNvbnN0IERJTG9jYXRpb24gKkxvYykgeworICAgIFZhcmlhYmxlRGJnSW5mb3MuZW1wbGFjZV9iYWNrKFZhciwgRXhwciwgU2xvdCwgTG9jKTsKKyAgfQorCisgIFZhcmlhYmxlRGJnSW5mb01hcFR5ICZnZXRWYXJpYWJsZURiZ0luZm8oKSB7IHJldHVybiBWYXJpYWJsZURiZ0luZm9zOyB9CisgIGNvbnN0IFZhcmlhYmxlRGJnSW5mb01hcFR5ICZnZXRWYXJpYWJsZURiZ0luZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIFZhcmlhYmxlRGJnSW5mb3M7CisgIH0KK307CisKKy8vLyBcbmFtZSBFeGNlcHRpb24gSGFuZGxpbmcKKy8vLyBceworCisvLy8gRXh0cmFjdCB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nIGluZm9ybWF0aW9uIGZyb20gdGhlIGxhbmRpbmdwYWQgaW5zdHJ1Y3Rpb24KKy8vLyBhbmQgYWRkIHRoZW0gdG8gdGhlIHNwZWNpZmllZCBtYWNoaW5lIG1vZHVsZSBpbmZvLgordm9pZCBhZGRMYW5kaW5nUGFkSW5mbyhjb25zdCBMYW5kaW5nUGFkSW5zdCAmSSwgTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisKKy8vLyBcfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEdyYXBoVHJhaXRzIHNwZWNpYWxpemF0aW9ucyBmb3IgZnVuY3Rpb24gYmFzaWMgYmxvY2sgZ3JhcGhzIChDRkdzKQorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFByb3ZpZGUgc3BlY2lhbGl6YXRpb25zIG9mIEdyYXBoVHJhaXRzIHRvIGJlIGFibGUgdG8gdHJlYXQgYQorLy8gbWFjaGluZSBmdW5jdGlvbiBhcyBhIGdyYXBoIG9mIG1hY2hpbmUgYmFzaWMgYmxvY2tzLi4uIHRoZXNlIGFyZQorLy8gdGhlIHNhbWUgYXMgdGhlIG1hY2hpbmUgYmFzaWMgYmxvY2sgaXRlcmF0b3JzLCBleGNlcHQgdGhhdCB0aGUgcm9vdAorLy8gbm9kZSBpcyBpbXBsaWNpdGx5IHRoZSBmaXJzdCBub2RlIG9mIHRoZSBmdW5jdGlvbi4KKy8vCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8TWFjaGluZUZ1bmN0aW9uKj4gOgorICBwdWJsaWMgR3JhcGhUcmFpdHM8TWFjaGluZUJhc2ljQmxvY2sqPiB7CisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShNYWNoaW5lRnVuY3Rpb24gKkYpIHsgcmV0dXJuICZGLT5mcm9udCgpOyB9CisKKyAgLy8gbm9kZXNfaXRlcmF0b3IvYmVnaW4vZW5kIC0gQWxsb3cgaXRlcmF0aW9uIG92ZXIgYWxsIG5vZGVzIGluIHRoZSBncmFwaAorICB1c2luZyBub2Rlc19pdGVyYXRvciA9IHBvaW50ZXJfaXRlcmF0b3I8TWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvcj47CisKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2JlZ2luKE1hY2hpbmVGdW5jdGlvbiAqRikgeworICAgIHJldHVybiBub2Rlc19pdGVyYXRvcihGLT5iZWdpbigpKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoTWFjaGluZUZ1bmN0aW9uICpGKSB7CisgICAgcmV0dXJuIG5vZGVzX2l0ZXJhdG9yKEYtPmVuZCgpKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCAgICAgICBzaXplICAgICAgIChNYWNoaW5lRnVuY3Rpb24gKkYpIHsgcmV0dXJuIEYtPnNpemUoKTsgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxjb25zdCBNYWNoaW5lRnVuY3Rpb24qPiA6CisgIHB1YmxpYyBHcmFwaFRyYWl0czxjb25zdCBNYWNoaW5lQmFzaWNCbG9jayo+IHsKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqRikgeyByZXR1cm4gJkYtPmZyb250KCk7IH0KKworICAvLyBub2Rlc19pdGVyYXRvci9iZWdpbi9lbmQgLSBBbGxvdyBpdGVyYXRpb24gb3ZlciBhbGwgbm9kZXMgaW4gdGhlIGdyYXBoCisgIHVzaW5nIG5vZGVzX2l0ZXJhdG9yID0gcG9pbnRlcl9pdGVyYXRvcjxNYWNoaW5lRnVuY3Rpb246OmNvbnN0X2l0ZXJhdG9yPjsKKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfYmVnaW4oY29uc3QgTWFjaGluZUZ1bmN0aW9uICpGKSB7CisgICAgcmV0dXJuIG5vZGVzX2l0ZXJhdG9yKEYtPmJlZ2luKCkpOworICB9CisKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2VuZCAgKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqRikgeworICAgIHJldHVybiBub2Rlc19pdGVyYXRvcihGLT5lbmQoKSk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgICAgICAgc2l6ZSAgICAgICAoY29uc3QgTWFjaGluZUZ1bmN0aW9uICpGKSAgeworICAgIHJldHVybiBGLT5zaXplKCk7CisgIH0KK307CisKKy8vIFByb3ZpZGUgc3BlY2lhbGl6YXRpb25zIG9mIEdyYXBoVHJhaXRzIHRvIGJlIGFibGUgdG8gdHJlYXQgYSBmdW5jdGlvbiBhcyBhCisvLyBncmFwaCBvZiBiYXNpYyBibG9ja3MuLi4gYW5kIHRvIHdhbGsgaXQgaW4gaW52ZXJzZSBvcmRlci4gIEludmVyc2Ugb3JkZXIgZm9yCisvLyBhIGZ1bmN0aW9uIGlzIGNvbnNpZGVyZWQgdG8gYmUgd2hlbiB0cmF2ZXJzaW5nIHRoZSBwcmVkZWNlc3NvciBlZGdlcyBvZiBhIEJCCisvLyBpbnN0ZWFkIG9mIHRoZSBzdWNjZXNzb3IgZWRnZXMuCisvLwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPEludmVyc2U8TWFjaGluZUZ1bmN0aW9uKj4+IDoKKyAgcHVibGljIEdyYXBoVHJhaXRzPEludmVyc2U8TWFjaGluZUJhc2ljQmxvY2sqPj4geworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoSW52ZXJzZTxNYWNoaW5lRnVuY3Rpb24gKj4gRykgeworICAgIHJldHVybiAmRy5HcmFwaC0+ZnJvbnQoKTsKKyAgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxJbnZlcnNlPGNvbnN0IE1hY2hpbmVGdW5jdGlvbio+PiA6CisgIHB1YmxpYyBHcmFwaFRyYWl0czxJbnZlcnNlPGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrKj4+IHsKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKEludmVyc2U8Y29uc3QgTWFjaGluZUZ1bmN0aW9uICo+IEcpIHsKKyAgICByZXR1cm4gJkcuR3JhcGgtPmZyb250KCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTUFDSElORUZVTkNUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkOTc4ZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oCkBAIC0wLDAgKzEsODEgQEAKKy8vPT09LS0gTWFjaGluZUZ1bmN0aW9uUGFzcy5oIC0gUGFzcyBmb3IgTWFjaGluZUZ1bmN0aW9ucyAtLS0tLS0tLSotQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIE1hY2hpbmVGdW5jdGlvblBhc3MgY2xhc3MuICBNYWNoaW5lRnVuY3Rpb25QYXNzJ3MgYXJlCisvLyBqdXN0IEZ1bmN0aW9uUGFzcydzLCBleGNlcHQgdGhleSBvcGVyYXRlIG9uIG1hY2hpbmUgY29kZSBhcyBwYXJ0IG9mIGEgY29kZQorLy8gZ2VuZXJhdG9yLiAgQmVjYXVzZSB0aGV5IG9wZXJhdGUgb24gbWFjaGluZSBjb2RlLCBub3QgdGhlIExMVk0KKy8vIHJlcHJlc2VudGF0aW9uLCBNYWNoaW5lRnVuY3Rpb25QYXNzJ3MgYXJlIG5vdCBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgTExWTQorLy8gcmVwcmVzZW50YXRpb24uICBEdWUgdG8gdGhpcyBsaW1pdGF0aW9uLCB0aGUgTWFjaGluZUZ1bmN0aW9uUGFzcyBjbGFzcyB0YWtlcworLy8gY2FyZSBvZiBkZWNsYXJpbmcgdGhhdCBubyBMTFZNIHBhc3NlcyBhcmUgaW52YWxpZGF0ZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORUZVTkNUSU9OUEFTU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FRlVOQ1RJT05QQVNTX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gTWFjaGluZUZ1bmN0aW9uUGFzcyAtIFRoaXMgY2xhc3MgYWRhcHRzIHRoZSBGdW5jdGlvblBhc3MgaW50ZXJmYWNlIHRvCisvLy8gYWxsb3cgY29udmVuaWVudCBjcmVhdGlvbiBvZiBwYXNzZXMgdGhhdCBvcGVyYXRlIG9uIHRoZSBNYWNoaW5lRnVuY3Rpb24KKy8vLyByZXByZXNlbnRhdGlvbi4gSW5zdGVhZCBvZiBvdmVycmlkaW5nIHJ1bk9uRnVuY3Rpb24sIHN1YmNsYXNzZXMKKy8vLyBvdmVycmlkZSBydW5Pbk1hY2hpbmVGdW5jdGlvbi4KK2NsYXNzIE1hY2hpbmVGdW5jdGlvblBhc3MgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKK3B1YmxpYzoKKyAgYm9vbCBkb0luaXRpYWxpemF0aW9uKE1vZHVsZSYpIG92ZXJyaWRlIHsKKyAgICAvLyBDYWNoZSB0aGUgcHJvcGVydGllcyBpbmZvIGF0IG1vZHVsZS1pbml0IHRpbWUgc28gd2UgZG9uJ3QgaGF2ZSB0bworICAgIC8vIGNvbnN0cnVjdCB0aGVtIGZvciBldmVyeSBmdW5jdGlvbi4KKyAgICBSZXF1aXJlZFByb3BlcnRpZXMgPSBnZXRSZXF1aXJlZFByb3BlcnRpZXMoKTsKKyAgICBTZXRQcm9wZXJ0aWVzID0gZ2V0U2V0UHJvcGVydGllcygpOworICAgIENsZWFyZWRQcm9wZXJ0aWVzID0gZ2V0Q2xlYXJlZFByb3BlcnRpZXMoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK3Byb3RlY3RlZDoKKyAgZXhwbGljaXQgTWFjaGluZUZ1bmN0aW9uUGFzcyhjaGFyICZJRCkgOiBGdW5jdGlvblBhc3MoSUQpIHt9CisKKyAgLy8vIHJ1bk9uTWFjaGluZUZ1bmN0aW9uIC0gVGhpcyBtZXRob2QgbXVzdCBiZSBvdmVybG9hZGVkIHRvIHBlcmZvcm0gdGhlCisgIC8vLyBkZXNpcmVkIG1hY2hpbmUgY29kZSB0cmFuc2Zvcm1hdGlvbiBvciBhbmFseXNpcy4KKyAgLy8vCisgIHZpcnR1YWwgYm9vbCBydW5Pbk1hY2hpbmVGdW5jdGlvbihNYWNoaW5lRnVuY3Rpb24gJk1GKSA9IDA7CisKKyAgLy8vIGdldEFuYWx5c2lzVXNhZ2UgLSBTdWJjbGFzc2VzIHRoYXQgb3ZlcnJpZGUgZ2V0QW5hbHlzaXNVc2FnZQorICAvLy8gbXVzdCBjYWxsIHRoaXMuCisgIC8vLworICAvLy8gRm9yIE1hY2hpbmVGdW5jdGlvblBhc3NlcywgY2FsbGluZyBBVS5wcmVzZXJ2ZXNDRkcoKSBpbmRpY2F0ZXMgdGhhdAorICAvLy8gdGhlIHBhc3MgZG9lcyBub3QgbW9kaWZ5IHRoZSBNYWNoaW5lQmFzaWNCbG9jayBDRkcuCisgIC8vLworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworCisgIHZpcnR1YWwgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcyBnZXRSZXF1aXJlZFByb3BlcnRpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMoKTsKKyAgfQorICB2aXJ0dWFsIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgZ2V0U2V0UHJvcGVydGllcygpIGNvbnN0IHsKKyAgICByZXR1cm4gTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcygpOworICB9CisgIHZpcnR1YWwgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcyBnZXRDbGVhcmVkUHJvcGVydGllcygpIGNvbnN0IHsKKyAgICByZXR1cm4gTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcygpOworICB9CisKK3ByaXZhdGU6CisgIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgUmVxdWlyZWRQcm9wZXJ0aWVzOworICBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzIFNldFByb3BlcnRpZXM7CisgIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMgQ2xlYXJlZFByb3BlcnRpZXM7CisKKyAgLy8vIGNyZWF0ZVByaW50ZXJQYXNzIC0gR2V0IGEgbWFjaGluZSBmdW5jdGlvbiBwcmludGVyIHBhc3MuCisgIFBhc3MgKmNyZWF0ZVByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQmFubmVyKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpIG92ZXJyaWRlOworfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE5NGJlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaApAQCAtMCwwICsxLDE0MDcgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmggLSBNYWNoaW5lSW5zdHIgY2xhc3MgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgTWFjaGluZUluc3RyIGNsYXNzLCB3aGljaCBpcyB0aGUKKy8vIGJhc2ljIHJlcHJlc2VudGF0aW9uIGZvciBhbGwgdGFyZ2V0IGRlcGVuZGVudCBtYWNoaW5lIGluc3RydWN0aW9ucyB1c2VkIGJ5CisvLyB0aGUgYmFjayBlbmQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORUlOU1RSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVJTlNUUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lT3BlcmFuZC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRPcGNvZGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZWJ1Z0xvYy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5saW5lQXNtLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3RyRGVzYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BcnJheVJlY3ljbGVyLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheVJlZjsKK2NsYXNzIERJRXhwcmVzc2lvbjsKK2NsYXNzIERJTG9jYWxWYXJpYWJsZTsKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTWFjaGluZU1lbU9wZXJhbmQ7CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworY2xhc3MgTW9kdWxlU2xvdFRyYWNrZXI7CitjbGFzcyByYXdfb3N0cmVhbTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBTbWFsbFZlY3RvckltcGw7CitjbGFzcyBTbWFsbEJpdFZlY3RvcjsKK2NsYXNzIFN0cmluZ1JlZjsKK2NsYXNzIFRhcmdldEluc3RySW5mbzsKK2NsYXNzIFRhcmdldFJlZ2lzdGVyQ2xhc3M7CitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gUmVwcmVzZW50YXRpb24gb2YgZWFjaCBtYWNoaW5lIGluc3RydWN0aW9uLgorLy8vCisvLy8gVGhpcyBjbGFzcyBpc24ndCBhIFBPRCB0eXBlLCBidXQgaXQgbXVzdCBoYXZlIGEgdHJpdmlhbCBkZXN0cnVjdG9yLiBXaGVuIGEKKy8vLyBNYWNoaW5lRnVuY3Rpb24gaXMgZGVsZXRlZCwgYWxsIHRoZSBjb250YWluZWQgTWFjaGluZUluc3RycyBhcmUgZGVhbGxvY2F0ZWQKKy8vLyB3aXRob3V0IGhhdmluZyB0aGVpciBkZXN0cnVjdG9yIGNhbGxlZC4KKy8vLworY2xhc3MgTWFjaGluZUluc3RyCisgICAgOiBwdWJsaWMgaWxpc3Rfbm9kZV93aXRoX3BhcmVudDxNYWNoaW5lSW5zdHIsIE1hY2hpbmVCYXNpY0Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWxpc3Rfc2VudGluZWxfdHJhY2tpbmc8dHJ1ZT4+IHsKK3B1YmxpYzoKKyAgdXNpbmcgbW1vX2l0ZXJhdG9yID0gTWFjaGluZU1lbU9wZXJhbmQgKio7CisKKyAgLy8vIEZsYWdzIHRvIHNwZWNpZnkgZGlmZmVyZW50IGtpbmRzIG9mIGNvbW1lbnRzIHRvIG91dHB1dCBpbgorICAvLy8gYXNzZW1ibHkgY29kZS4gIFRoZXNlIGZsYWdzIGNhcnJ5IHNlbWFudGljIGluZm9ybWF0aW9uIG5vdAorICAvLy8gb3RoZXJ3aXNlIGVhc2lseSBkZXJpdmFibGUgZnJvbSB0aGUgSVIgdGV4dC4KKyAgLy8vCisgIGVudW0gQ29tbWVudEZsYWcgeworICAgIFJlbG9hZFJldXNlID0gMHgxLCAgICAvLyBoaWdoZXIgYml0cyBhcmUgcmVzZXJ2ZWQgZm9yIHRhcmdldCBkZXAgY29tbWVudHMuCisgICAgTm9TY2hlZENvbW1lbnQgPSAweDIsCisgICAgVEFzbUNvbW1lbnRzID0gMHg0ICAgIC8vIFRhcmdldCBBc20gY29tbWVudHMgc2hvdWxkIHN0YXJ0IGZyb20gdGhpcyB2YWx1ZS4KKyAgfTsKKworICBlbnVtIE1JRmxhZyB7CisgICAgTm9GbGFncyAgICAgID0gMCwKKyAgICBGcmFtZVNldHVwICAgPSAxIDw8IDAsICAgICAgICAgICAgICAvLyBJbnN0cnVjdGlvbiBpcyB1c2VkIGFzIGEgcGFydCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZ1bmN0aW9uIGZyYW1lIHNldHVwIGNvZGUuCisgICAgRnJhbWVEZXN0cm95ID0gMSA8PCAxLCAgICAgICAgICAgICAgLy8gSW5zdHJ1Y3Rpb24gaXMgdXNlZCBhcyBhIHBhcnQgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbiBmcmFtZSBkZXN0cnVjdGlvbiBjb2RlLgorICAgIEJ1bmRsZWRQcmVkICA9IDEgPDwgMiwgICAgICAgICAgICAgIC8vIEluc3RydWN0aW9uIGhhcyBidW5kbGVkIHByZWRlY2Vzc29ycy4KKyAgICBCdW5kbGVkU3VjYyAgPSAxIDw8IDMgICAgICAgICAgICAgICAvLyBJbnN0cnVjdGlvbiBoYXMgYnVuZGxlZCBzdWNjZXNzb3JzLgorICB9OworCitwcml2YXRlOgorICBjb25zdCBNQ0luc3RyRGVzYyAqTUNJRDsgICAgICAgICAgICAgIC8vIEluc3RydWN0aW9uIGRlc2NyaXB0b3IuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpQYXJlbnQgPSBudWxscHRyOyAgLy8gUG9pbnRlciB0byB0aGUgb3duaW5nIGJhc2ljIGJsb2NrLgorCisgIC8vIE9wZXJhbmRzIGFyZSBhbGxvY2F0ZWQgYnkgYW4gQXJyYXlSZWN5Y2xlci4KKyAgTWFjaGluZU9wZXJhbmQgKk9wZXJhbmRzID0gbnVsbHB0cjsgICAvLyBQb2ludGVyIHRvIHRoZSBmaXJzdCBvcGVyYW5kLgorICB1bnNpZ25lZCBOdW1PcGVyYW5kcyA9IDA7ICAgICAgICAgICAgIC8vIE51bWJlciBvZiBvcGVyYW5kcyBvbiBpbnN0cnVjdGlvbi4KKyAgdXNpbmcgT3BlcmFuZENhcGFjaXR5ID0gQXJyYXlSZWN5Y2xlcjxNYWNoaW5lT3BlcmFuZD46OkNhcGFjaXR5OworICBPcGVyYW5kQ2FwYWNpdHkgQ2FwT3BlcmFuZHM7ICAgICAgICAgIC8vIENhcGFjaXR5IG9mIHRoZSBPcGVyYW5kcyBhcnJheS4KKworICB1aW50OF90IEZsYWdzID0gMDsgICAgICAgICAgICAgICAgICAgIC8vIFZhcmlvdXMgYml0cyBvZiBhZGRpdGlvbmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24gYWJvdXQgbWFjaGluZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluc3RydWN0aW9uLgorCisgIHVpbnQ4X3QgQXNtUHJpbnRlckZsYWdzID0gMDsgICAgICAgICAgLy8gVmFyaW91cyBiaXRzIG9mIGluZm9ybWF0aW9uIHVzZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgQXNtUHJpbnRlciB0byBlbWl0IGhlbHBmdWwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb21tZW50cy4gIFRoaXMgaXMgKm5vdCogc2VtYW50aWMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvcm1hdGlvbi4gIERvIG5vdCB1c2UgdGhpcyBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbnl0aGluZyBvdGhlciB0aGFuIHRvIGNvbnZleSBjb21tZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5mb3JtYXRpb24gdG8gQXNtUHJpbnRlci4KKworICB1aW50OF90IE51bU1lbVJlZnMgPSAwOyAgICAgICAgICAgICAgIC8vIEluZm9ybWF0aW9uIG9uIG1lbW9yeSByZWZlcmVuY2VzLgorICAvLyBOb3RlIHRoYXQgTWVtUmVmcyA9PSBudWxscHRyLCAgbWVhbnMgJ2Rvbid0IGtub3cnLCBub3QgJ25vIG1lbW9yeSBhY2Nlc3MnLgorICAvLyBDYWxsaW5nIGNvZGUgbXVzdCB0cmVhdCBtaXNzaW5nIGluZm9ybWF0aW9uIGNvbnNlcnZhdGl2ZWx5LiAgSWYgdGhlIG51bWJlcgorICAvLyBvZiBtZW1vcnkgb3BlcmFuZHMgcmVxdWlyZWQgdG8gYmUgcHJlY2lzZSBleGNlZWRzIHRoZSBtYXhpbXVtIHZhbHVlIG9mCisgIC8vIE51bU1lbVJlZnMgLSBjdXJyZW50bHkgMjU2IC0gd2UgcmVtb3ZlIHRoZSBvcGVyYW5kcyBlbnRpcmVseS4gTm90ZSBhbHNvCisgIC8vIHRoYXQgdGhpcyBpcyBhIG5vbi1vd25pbmcgcmVmZXJlbmNlIHRvIGEgc2hhcmVkIGNvcHkgb24gd3JpdGUgYnVmZmVyIG93bmVkCisgIC8vIGJ5IHRoZSBNYWNoaW5lRnVuY3Rpb24gYW5kIGNyZWF0ZWQgdmlhIE1GLmFsbG9jYXRlTWVtUmVmc0FycmF5LgorICBtbW9faXRlcmF0b3IgTWVtUmVmcyA9IG51bGxwdHI7CisKKyAgRGVidWdMb2MgZGVidWdMb2M7ICAgICAgICAgICAgICAgICAgICAvLyBTb3VyY2UgbGluZSBpbmZvcm1hdGlvbi4KKworICAvLyBJbnRydXNpdmUgbGlzdCBzdXBwb3J0CisgIGZyaWVuZCBzdHJ1Y3QgaWxpc3RfdHJhaXRzPE1hY2hpbmVJbnN0cj47CisgIGZyaWVuZCBzdHJ1Y3QgaWxpc3RfY2FsbGJhY2tfdHJhaXRzPE1hY2hpbmVCYXNpY0Jsb2NrPjsKKyAgdm9pZCBzZXRQYXJlbnQoTWFjaGluZUJhc2ljQmxvY2sgKlApIHsgUGFyZW50ID0gUDsgfQorCisgIC8vLyBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZXMgYSBjb3B5IG9mIHRoZSBnaXZlbgorICAvLy8gTWFjaGluZUluc3RyIGluIHRoZSBnaXZlbiBNYWNoaW5lRnVuY3Rpb24uCisgIE1hY2hpbmVJbnN0cihNYWNoaW5lRnVuY3Rpb24gJiwgY29uc3QgTWFjaGluZUluc3RyICYpOworCisgIC8vLyBUaGlzIGNvbnN0cnVjdG9yIGNyZWF0ZSBhIE1hY2hpbmVJbnN0ciBhbmQgYWRkIHRoZSBpbXBsaWNpdCBvcGVyYW5kcy4KKyAgLy8vIEl0IHJlc2VydmVzIHNwYWNlIGZvciBudW1iZXIgb2Ygb3BlcmFuZHMgc3BlY2lmaWVkIGJ5CisgIC8vLyBNQ0luc3RyRGVzYy4gIEFuIGV4cGxpY2l0IERlYnVnTG9jIGlzIHN1cHBsaWVkLgorICBNYWNoaW5lSW5zdHIoTWFjaGluZUZ1bmN0aW9uICYsIGNvbnN0IE1DSW5zdHJEZXNjICZNQ0lELCBEZWJ1Z0xvYyBkbCwKKyAgICAgICAgICAgICAgIGJvb2wgTm9JbXAgPSBmYWxzZSk7CisKKyAgLy8gTWFjaGluZUluc3RycyBhcmUgcG9vbC1hbGxvY2F0ZWQgYW5kIG93bmVkIGJ5IE1hY2hpbmVGdW5jdGlvbi4KKyAgZnJpZW5kIGNsYXNzIE1hY2hpbmVGdW5jdGlvbjsKKworcHVibGljOgorICBNYWNoaW5lSW5zdHIoY29uc3QgTWFjaGluZUluc3RyICYpID0gZGVsZXRlOworICBNYWNoaW5lSW5zdHIgJm9wZXJhdG9yPShjb25zdCBNYWNoaW5lSW5zdHIgJikgPSBkZWxldGU7CisgIC8vIFVzZSBNYWNoaW5lRnVuY3Rpb246OkRlbGV0ZU1hY2hpbmVJbnN0cigpIGluc3RlYWQuCisgIH5NYWNoaW5lSW5zdHIoKSA9IGRlbGV0ZTsKKworICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayogZ2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4gUGFyZW50OyB9CisgIE1hY2hpbmVCYXNpY0Jsb2NrKiBnZXRQYXJlbnQoKSB7IHJldHVybiBQYXJlbnQ7IH0KKworICAvLy8gUmV0dXJuIHRoZSBmdW5jdGlvbiB0aGF0IGNvbnRhaW5zIHRoZSBiYXNpYyBibG9jayB0aGF0IHRoaXMgaW5zdHJ1Y3Rpb24KKyAgLy8vIGJlbG9uZ3MgdG8uCisgIC8vLworICAvLy8gTm90ZTogdGhpcyBpcyB1bmRlZmluZWQgYmVoYXZpb3VyIGlmIHRoZSBpbnN0cnVjdGlvbiBkb2VzIG5vdCBoYXZlIGEKKyAgLy8vIHBhcmVudC4KKyAgY29uc3QgTWFjaGluZUZ1bmN0aW9uICpnZXRNRigpIGNvbnN0OworICBNYWNoaW5lRnVuY3Rpb24gKmdldE1GKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PE1hY2hpbmVGdW5jdGlvbiAqPigKKyAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgTWFjaGluZUluc3RyICo+KHRoaXMpLT5nZXRNRigpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGFzbSBwcmludGVyIGZsYWdzIGJpdHZlY3Rvci4KKyAgdWludDhfdCBnZXRBc21QcmludGVyRmxhZ3MoKSBjb25zdCB7IHJldHVybiBBc21QcmludGVyRmxhZ3M7IH0KKworICAvLy8gQ2xlYXIgdGhlIEFzbVByaW50ZXIgYml0dmVjdG9yLgorICB2b2lkIGNsZWFyQXNtUHJpbnRlckZsYWdzKCkgeyBBc21QcmludGVyRmxhZ3MgPSAwOyB9CisKKyAgLy8vIFJldHVybiB3aGV0aGVyIGFuIEFzbVByaW50ZXIgZmxhZyBpcyBzZXQuCisgIGJvb2wgZ2V0QXNtUHJpbnRlckZsYWcoQ29tbWVudEZsYWcgRmxhZykgY29uc3QgeworICAgIHJldHVybiBBc21QcmludGVyRmxhZ3MgJiBGbGFnOworICB9CisKKyAgLy8vIFNldCBhIGZsYWcgZm9yIHRoZSBBc21QcmludGVyLgorICB2b2lkIHNldEFzbVByaW50ZXJGbGFnKHVpbnQ4X3QgRmxhZykgeworICAgIEFzbVByaW50ZXJGbGFncyB8PSBGbGFnOworICB9CisKKyAgLy8vIENsZWFyIHNwZWNpZmljIEFzbVByaW50ZXIgZmxhZ3MuCisgIHZvaWQgY2xlYXJBc21QcmludGVyRmxhZyhDb21tZW50RmxhZyBGbGFnKSB7CisgICAgQXNtUHJpbnRlckZsYWdzICY9IH5GbGFnOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgTUkgZmxhZ3MgYml0dmVjdG9yLgorICB1aW50OF90IGdldEZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBGbGFnczsKKyAgfQorCisgIC8vLyBSZXR1cm4gd2hldGhlciBhbiBNSSBmbGFnIGlzIHNldC4KKyAgYm9vbCBnZXRGbGFnKE1JRmxhZyBGbGFnKSBjb25zdCB7CisgICAgcmV0dXJuIEZsYWdzICYgRmxhZzsKKyAgfQorCisgIC8vLyBTZXQgYSBNSSBmbGFnLgorICB2b2lkIHNldEZsYWcoTUlGbGFnIEZsYWcpIHsKKyAgICBGbGFncyB8PSAodWludDhfdClGbGFnOworICB9CisKKyAgdm9pZCBzZXRGbGFncyh1bnNpZ25lZCBmbGFncykgeworICAgIC8vIEZpbHRlciBvdXQgdGhlIGF1dG9tYXRpY2FsbHkgbWFpbnRhaW5lZCBmbGFncy4KKyAgICB1bnNpZ25lZCBNYXNrID0gQnVuZGxlZFByZWQgfCBCdW5kbGVkU3VjYzsKKyAgICBGbGFncyA9IChGbGFncyAmIE1hc2spIHwgKGZsYWdzICYgfk1hc2spOworICB9CisKKyAgLy8vIGNsZWFyRmxhZyAtIENsZWFyIGEgTUkgZmxhZy4KKyAgdm9pZCBjbGVhckZsYWcoTUlGbGFnIEZsYWcpIHsKKyAgICBGbGFncyAmPSB+KCh1aW50OF90KUZsYWcpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIE1JIGlzIGluIGEgYnVuZGxlIChidXQgbm90IHRoZSBmaXJzdCBNSSBpbiBhIGJ1bmRsZSkuCisgIC8vLworICAvLy8gQSBidW5kbGUgbG9va3MgbGlrZSB0aGlzIGJlZm9yZSBpdCdzIGZpbmFsaXplZDoKKyAgLy8vICAgLS0tLS0tLS0tLS0tLS0tLQorICAvLy8gICB8ICAgICAgTUkgICAgICB8CisgIC8vLyAgIC0tLS0tLS0tLS0tLS0tLS0KKyAgLy8vICAgICAgICAgIHwKKyAgLy8vICAgLS0tLS0tLS0tLS0tLS0tLQorICAvLy8gICB8ICAgICAgTUkgICAgKiB8CisgIC8vLyAgIC0tLS0tLS0tLS0tLS0tLS0KKyAgLy8vICAgICAgICAgIHwKKyAgLy8vICAgLS0tLS0tLS0tLS0tLS0tLQorICAvLy8gICB8ICAgICAgTUkgICAgKiB8CisgIC8vLyAgIC0tLS0tLS0tLS0tLS0tLS0KKyAgLy8vIEluIHRoaXMgY2FzZSwgdGhlIGZpcnN0IE1JIHN0YXJ0cyBhIGJ1bmRsZSBidXQgaXMgbm90IGluc2lkZSBhIGJ1bmRsZSwgdGhlCisgIC8vLyBuZXh0IDIgTUlzIGFyZSBjb25zaWRlcmVkICJpbnNpZGUiIHRoZSBidW5kbGUuCisgIC8vLworICAvLy8gQWZ0ZXIgYSBidW5kbGUgaXMgZmluYWxpemVkLCBpdCBsb29rcyBsaWtlIHRoaXM6CisgIC8vLyAgIC0tLS0tLS0tLS0tLS0tLS0KKyAgLy8vICAgfCAgICBCdW5kbGUgICAgfAorICAvLy8gICAtLS0tLS0tLS0tLS0tLS0tCisgIC8vLyAgICAgICAgICB8CisgIC8vLyAgIC0tLS0tLS0tLS0tLS0tLS0KKyAgLy8vICAgfCAgICAgIE1JICAgICogfAorICAvLy8gICAtLS0tLS0tLS0tLS0tLS0tCisgIC8vLyAgICAgICAgICB8CisgIC8vLyAgIC0tLS0tLS0tLS0tLS0tLS0KKyAgLy8vICAgfCAgICAgIE1JICAgICogfAorICAvLy8gICAtLS0tLS0tLS0tLS0tLS0tCisgIC8vLyAgICAgICAgICB8CisgIC8vLyAgIC0tLS0tLS0tLS0tLS0tLS0KKyAgLy8vICAgfCAgICAgIE1JICAgICogfAorICAvLy8gICAtLS0tLS0tLS0tLS0tLS0tCisgIC8vLyBUaGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaGFzIHRoZSBzcGVjaWFsIG9wY29kZSAiQlVORExFIi4gSXQncyBub3QgImluc2lkZSIKKyAgLy8vIGEgYnVuZGxlLCBidXQgdGhlIG5leHQgdGhyZWUgTUlzIGFyZS4KKyAgYm9vbCBpc0luc2lkZUJ1bmRsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RmxhZyhCdW5kbGVkUHJlZCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBwYXJ0IG9mIGEgYnVuZGxlLiBUaGlzIGlzIHRydWUKKyAgLy8vIGlmIGVpdGhlciBpdHNlbGYgb3IgaXRzIGZvbGxvd2luZyBpbnN0cnVjdGlvbiBpcyBtYXJrZWQgIkluc2lkZUJ1bmRsZSIuCisgIGJvb2wgaXNCdW5kbGVkKCkgY29uc3QgeworICAgIHJldHVybiBpc0J1bmRsZWRXaXRoUHJlZCgpIHx8IGlzQnVuZGxlZFdpdGhTdWNjKCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBwYXJ0IG9mIGEgYnVuZGxlLCBhbmQgaXQgaXMgbm90IHRoZQorICAvLy8gZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gdGhlIGJ1bmRsZS4KKyAgYm9vbCBpc0J1bmRsZWRXaXRoUHJlZCgpIGNvbnN0IHsgcmV0dXJuIGdldEZsYWcoQnVuZGxlZFByZWQpOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgcGFydCBvZiBhIGJ1bmRsZSwgYW5kIGl0IGlzIG5vdCB0aGUKKyAgLy8vIGxhc3QgaW5zdHJ1Y3Rpb24gaW4gdGhlIGJ1bmRsZS4KKyAgYm9vbCBpc0J1bmRsZWRXaXRoU3VjYygpIGNvbnN0IHsgcmV0dXJuIGdldEZsYWcoQnVuZGxlZFN1Y2MpOyB9CisKKyAgLy8vIEJ1bmRsZSB0aGlzIGluc3RydWN0aW9uIHdpdGggaXRzIHByZWRlY2Vzc29yLiBUaGlzIGNhbiBiZSBhbiB1bmJ1bmRsZWQKKyAgLy8vIGluc3RydWN0aW9uLCBvciBpdCBjYW4gYmUgdGhlIGZpcnN0IGluc3RydWN0aW9uIGluIGEgYnVuZGxlLgorICB2b2lkIGJ1bmRsZVdpdGhQcmVkKCk7CisKKyAgLy8vIEJ1bmRsZSB0aGlzIGluc3RydWN0aW9uIHdpdGggaXRzIHN1Y2Nlc3Nvci4gVGhpcyBjYW4gYmUgYW4gdW5idW5kbGVkCisgIC8vLyBpbnN0cnVjdGlvbiwgb3IgaXQgY2FuIGJlIHRoZSBsYXN0IGluc3RydWN0aW9uIGluIGEgYnVuZGxlLgorICB2b2lkIGJ1bmRsZVdpdGhTdWNjKCk7CisKKyAgLy8vIEJyZWFrIGJ1bmRsZSBhYm92ZSB0aGlzIGluc3RydWN0aW9uLgorICB2b2lkIHVuYnVuZGxlRnJvbVByZWQoKTsKKworICAvLy8gQnJlYWsgYnVuZGxlIGJlbG93IHRoaXMgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgdW5idW5kbGVGcm9tU3VjYygpOworCisgIC8vLyBSZXR1cm5zIHRoZSBkZWJ1ZyBsb2NhdGlvbiBpZCBvZiB0aGlzIE1hY2hpbmVJbnN0ci4KKyAgY29uc3QgRGVidWdMb2MgJmdldERlYnVnTG9jKCkgY29uc3QgeyByZXR1cm4gZGVidWdMb2M7IH0KKworICAvLy8gUmV0dXJuIHRoZSBkZWJ1ZyB2YXJpYWJsZSByZWZlcmVuY2VkIGJ5CisgIC8vLyB0aGlzIERCR19WQUxVRSBpbnN0cnVjdGlvbi4KKyAgY29uc3QgRElMb2NhbFZhcmlhYmxlICpnZXREZWJ1Z1ZhcmlhYmxlKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgY29tcGxleCBhZGRyZXNzIGV4cHJlc3Npb24gcmVmZXJlbmNlZCBieQorICAvLy8gdGhpcyBEQkdfVkFMVUUgaW5zdHJ1Y3Rpb24uCisgIGNvbnN0IERJRXhwcmVzc2lvbiAqZ2V0RGVidWdFeHByZXNzaW9uKCkgY29uc3Q7CisKKyAgLy8vIEVtaXQgYW4gZXJyb3IgcmVmZXJyaW5nIHRvIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhpcyBpbnN0cnVjdGlvbi4KKyAgLy8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBmb3IgaW5saW5lIGFzc2VtYmx5IHRoYXQgaXMgc29tZWhvdworICAvLy8gaW1wb3NzaWJsZSB0byBjb21waWxlLiBPdGhlciBlcnJvcnMgc2hvdWxkIGhhdmUgYmVlbiBoYW5kbGVkIG11Y2gKKyAgLy8vIGVhcmxpZXIuCisgIC8vLworICAvLy8gSWYgdGhpcyBtZXRob2QgcmV0dXJucywgdGhlIGNhbGxlciBzaG91bGQgdHJ5IHRvIHJlY292ZXIgZnJvbSB0aGUgZXJyb3IuCisgIHZvaWQgZW1pdEVycm9yKFN0cmluZ1JlZiBNc2cpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSB0YXJnZXQgaW5zdHJ1Y3Rpb24gZGVzY3JpcHRvciBvZiB0aGlzIE1hY2hpbmVJbnN0ci4KKyAgY29uc3QgTUNJbnN0ckRlc2MgJmdldERlc2MoKSBjb25zdCB7IHJldHVybiAqTUNJRDsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBvcGNvZGUgb2YgdGhpcyBNYWNoaW5lSW5zdHIuCisgIHVuc2lnbmVkIGdldE9wY29kZSgpIGNvbnN0IHsgcmV0dXJuIE1DSUQtPk9wY29kZTsgfQorCisgIC8vLyBBY2Nlc3MgdG8gZXhwbGljaXQgb3BlcmFuZHMgb2YgdGhlIGluc3RydWN0aW9uLgorICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kcygpIGNvbnN0IHsgcmV0dXJuIE51bU9wZXJhbmRzOyB9CisKKyAgY29uc3QgTWFjaGluZU9wZXJhbmQmIGdldE9wZXJhbmQodW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgZ2V0TnVtT3BlcmFuZHMoKSAmJiAiZ2V0T3BlcmFuZCgpIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gT3BlcmFuZHNbaV07CisgIH0KKyAgTWFjaGluZU9wZXJhbmQmIGdldE9wZXJhbmQodW5zaWduZWQgaSkgeworICAgIGFzc2VydChpIDwgZ2V0TnVtT3BlcmFuZHMoKSAmJiAiZ2V0T3BlcmFuZCgpIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gT3BlcmFuZHNbaV07CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgb3BlcmFuZCBccCBPcElkeCBpcyBhIHN1YnJlZ2lzdGVyIGluZGV4LgorICBib29sIGlzT3BlcmFuZFN1YnJlZ0lkeCh1bnNpZ25lZCBPcElkeCkgY29uc3QgeworICAgIGFzc2VydChnZXRPcGVyYW5kKE9wSWR4KS5nZXRUeXBlKCkgPT0gTWFjaGluZU9wZXJhbmQ6Ok1PX0ltbWVkaWF0ZSAmJgorICAgICAgICAgICAiRXhwZWN0ZWQgTU9fSW1tZWRpYXRlIG9wZXJhbmQgdHlwZS4iKTsKKyAgICBpZiAoaXNFeHRyYWN0U3VicmVnKCkgJiYgT3BJZHggPT0gMikKKyAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChpc0luc2VydFN1YnJlZygpICYmIE9wSWR4ID09IDMpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoaXNSZWdTZXF1ZW5jZSgpICYmIE9wSWR4ID4gMSAmJiAoT3BJZHggJSAyKSA9PSAwKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKGlzU3VicmVnVG9SZWcoKSAmJiBPcElkeCA9PSAzKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBub24taW1wbGljaXQgb3BlcmFuZHMuCisgIHVuc2lnbmVkIGdldE51bUV4cGxpY2l0T3BlcmFuZHMoKSBjb25zdDsKKworICAvLy8gaXRlcmF0b3IvYmVnaW4vZW5kIC0gSXRlcmF0ZSBvdmVyIGFsbCBvcGVyYW5kcyBvZiBhIG1hY2hpbmUgaW5zdHJ1Y3Rpb24uCisgIHVzaW5nIG1vcF9pdGVyYXRvciA9IE1hY2hpbmVPcGVyYW5kICo7CisgIHVzaW5nIGNvbnN0X21vcF9pdGVyYXRvciA9IGNvbnN0IE1hY2hpbmVPcGVyYW5kICo7CisKKyAgbW9wX2l0ZXJhdG9yIG9wZXJhbmRzX2JlZ2luKCkgeyByZXR1cm4gT3BlcmFuZHM7IH0KKyAgbW9wX2l0ZXJhdG9yIG9wZXJhbmRzX2VuZCgpIHsgcmV0dXJuIE9wZXJhbmRzICsgTnVtT3BlcmFuZHM7IH0KKworICBjb25zdF9tb3BfaXRlcmF0b3Igb3BlcmFuZHNfYmVnaW4oKSBjb25zdCB7IHJldHVybiBPcGVyYW5kczsgfQorICBjb25zdF9tb3BfaXRlcmF0b3Igb3BlcmFuZHNfZW5kKCkgY29uc3QgeyByZXR1cm4gT3BlcmFuZHMgKyBOdW1PcGVyYW5kczsgfQorCisgIGl0ZXJhdG9yX3JhbmdlPG1vcF9pdGVyYXRvcj4gb3BlcmFuZHMoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2Uob3BlcmFuZHNfYmVnaW4oKSwgb3BlcmFuZHNfZW5kKCkpOworICB9CisgIGl0ZXJhdG9yX3JhbmdlPGNvbnN0X21vcF9pdGVyYXRvcj4gb3BlcmFuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2Uob3BlcmFuZHNfYmVnaW4oKSwgb3BlcmFuZHNfZW5kKCkpOworICB9CisgIGl0ZXJhdG9yX3JhbmdlPG1vcF9pdGVyYXRvcj4gZXhwbGljaXRfb3BlcmFuZHMoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2Uob3BlcmFuZHNfYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICBvcGVyYW5kc19iZWdpbigpICsgZ2V0TnVtRXhwbGljaXRPcGVyYW5kcygpKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTxjb25zdF9tb3BfaXRlcmF0b3I+IGV4cGxpY2l0X29wZXJhbmRzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKG9wZXJhbmRzX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgb3BlcmFuZHNfYmVnaW4oKSArIGdldE51bUV4cGxpY2l0T3BlcmFuZHMoKSk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8bW9wX2l0ZXJhdG9yPiBpbXBsaWNpdF9vcGVyYW5kcygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShleHBsaWNpdF9vcGVyYW5kcygpLmVuZCgpLCBvcGVyYW5kc19lbmQoKSk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3RfbW9wX2l0ZXJhdG9yPiBpbXBsaWNpdF9vcGVyYW5kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShleHBsaWNpdF9vcGVyYW5kcygpLmVuZCgpLCBvcGVyYW5kc19lbmQoKSk7CisgIH0KKyAgLy8vIFJldHVybnMgYSByYW5nZSBvdmVyIGFsbCBleHBsaWNpdCBvcGVyYW5kcyB0aGF0IGFyZSByZWdpc3RlciBkZWZpbml0aW9ucy4KKyAgLy8vIEltcGxpY2l0IGRlZmluaXRpb24gYXJlIG5vdCBpbmNsdWRlZCEKKyAgaXRlcmF0b3JfcmFuZ2U8bW9wX2l0ZXJhdG9yPiBkZWZzKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKG9wZXJhbmRzX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgb3BlcmFuZHNfYmVnaW4oKSArIGdldERlc2MoKS5nZXROdW1EZWZzKCkpOworICB9CisgIC8vLyBcY29weWRvYyBkZWZzKCkKKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3RfbW9wX2l0ZXJhdG9yPiBkZWZzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKG9wZXJhbmRzX2JlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgb3BlcmFuZHNfYmVnaW4oKSArIGdldERlc2MoKS5nZXROdW1EZWZzKCkpOworICB9CisgIC8vLyBSZXR1cm5zIGEgcmFuZ2UgdGhhdCBpbmNsdWRlcyBhbGwgb3BlcmFuZHMgdGhhdCBhcmUgcmVnaXN0ZXIgdXNlcy4KKyAgLy8vIFRoaXMgbWF5IGluY2x1ZGUgdW5yZWxhdGVkIG9wZXJhbmRzIHdoaWNoIGFyZSBub3QgcmVnaXN0ZXIgdXNlcy4KKyAgaXRlcmF0b3JfcmFuZ2U8bW9wX2l0ZXJhdG9yPiB1c2VzKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKG9wZXJhbmRzX2JlZ2luKCkgKyBnZXREZXNjKCkuZ2V0TnVtRGVmcygpLAorICAgICAgICAgICAgICAgICAgICAgIG9wZXJhbmRzX2VuZCgpKTsKKyAgfQorICAvLy8gXGNvcHlkb2MgdXNlcygpCisgIGl0ZXJhdG9yX3JhbmdlPGNvbnN0X21vcF9pdGVyYXRvcj4gdXNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShvcGVyYW5kc19iZWdpbigpICsgZ2V0RGVzYygpLmdldE51bURlZnMoKSwKKyAgICAgICAgICAgICAgICAgICAgICBvcGVyYW5kc19lbmQoKSk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8bW9wX2l0ZXJhdG9yPiBleHBsaWNpdF91c2VzKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKG9wZXJhbmRzX2JlZ2luKCkgKyBnZXREZXNjKCkuZ2V0TnVtRGVmcygpLAorICAgICAgICAgICAgICAgICAgICAgIG9wZXJhbmRzX2JlZ2luKCkgKyBnZXROdW1FeHBsaWNpdE9wZXJhbmRzKCkgKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTxjb25zdF9tb3BfaXRlcmF0b3I+IGV4cGxpY2l0X3VzZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2Uob3BlcmFuZHNfYmVnaW4oKSArIGdldERlc2MoKS5nZXROdW1EZWZzKCksCisgICAgICAgICAgICAgICAgICAgICAgb3BlcmFuZHNfYmVnaW4oKSArIGdldE51bUV4cGxpY2l0T3BlcmFuZHMoKSApOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiB0aGUgb3BlcmFuZCBpdGVyYXRvciBccCBJIHBvaW50cyB0by4KKyAgdW5zaWduZWQgZ2V0T3BlcmFuZE5vKGNvbnN0X21vcF9pdGVyYXRvciBJKSBjb25zdCB7CisgICAgcmV0dXJuIEkgLSBvcGVyYW5kc19iZWdpbigpOworICB9CisKKyAgLy8vIEFjY2VzcyB0byBtZW1vcnkgb3BlcmFuZHMgb2YgdGhlIGluc3RydWN0aW9uCisgIG1tb19pdGVyYXRvciBtZW1vcGVyYW5kc19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIE1lbVJlZnM7IH0KKyAgbW1vX2l0ZXJhdG9yIG1lbW9wZXJhbmRzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIE1lbVJlZnMgKyBOdW1NZW1SZWZzOyB9CisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB3ZSBkb24ndCBoYXZlIGFueSBtZW1vcnkgb3BlcmFuZHMgd2hpY2ggZGVzY3JpYmVkIHRoZQorICAvLy8gbWVtb3J5IGFjY2VzcyBkb25lIGJ5IHRoaXMgaW5zdHJ1Y3Rpb24uICBJZiB0aGlzIGlzIHRydWUsIGNhbGxpbmcgY29kZQorICAvLy8gbXVzdCBiZSBjb25zZXJ2YXRpdmUuCisgIGJvb2wgbWVtb3BlcmFuZHNfZW1wdHkoKSBjb25zdCB7IHJldHVybiBOdW1NZW1SZWZzID09IDA7IH0KKworICBpdGVyYXRvcl9yYW5nZTxtbW9faXRlcmF0b3I+ICBtZW1vcGVyYW5kcygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShtZW1vcGVyYW5kc19iZWdpbigpLCBtZW1vcGVyYW5kc19lbmQoKSk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8bW1vX2l0ZXJhdG9yPiBtZW1vcGVyYW5kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShtZW1vcGVyYW5kc19iZWdpbigpLCBtZW1vcGVyYW5kc19lbmQoKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBoYXMgZXhhY3RseSBvbmUgTWFjaGluZU1lbU9wZXJhbmQuCisgIGJvb2wgaGFzT25lTWVtT3BlcmFuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gTnVtTWVtUmVmcyA9PSAxOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIG1lbW9yeSBvcGVyYW5kcy4KKyAgdW5zaWduZWQgZ2V0TnVtTWVtT3BlcmFuZHMoKSBjb25zdCB7IHJldHVybiBOdW1NZW1SZWZzOyB9CisKKyAgLy8vIEFQSSBmb3IgcXVlcnlpbmcgTWFjaGluZUluc3RyIHByb3BlcnRpZXMuIFRoZXkgYXJlIHRoZSBzYW1lIGFzIE1DSW5zdHJEZXNjCisgIC8vLyBxdWVyaWVzIGJ1dCB0aGV5IGFyZSBidW5kbGUgYXdhcmUuCisKKyAgZW51bSBRdWVyeVR5cGUgeworICAgIElnbm9yZUJ1bmRsZSwgICAgLy8gSWdub3JlIGJ1bmRsZXMKKyAgICBBbnlJbkJ1bmRsZSwgICAgIC8vIFJldHVybiB0cnVlIGlmIGFueSBpbnN0cnVjdGlvbiBpbiBidW5kbGUgaGFzIHByb3BlcnR5CisgICAgQWxsSW5CdW5kbGUgICAgICAvLyBSZXR1cm4gdHJ1ZSBpZiBhbGwgaW5zdHJ1Y3Rpb25zIGluIGJ1bmRsZSBoYXZlIHByb3BlcnR5CisgIH07CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbiAob3IgaW4gdGhlIGNhc2Ugb2YgYSBidW5kbGUsCisgIC8vLyB0aGUgaW5zdHJ1Y3Rpb25zIGluc2lkZSB0aGUgYnVuZGxlKSBoYXMgdGhlIHNwZWNpZmllZCBwcm9wZXJ0eS4KKyAgLy8vIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgcHJvcGVydHkgYmVpbmcgcXVlcmllZC4KKyAgLy8vIFRoZSBzZWNvbmQgYXJndW1lbnQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHF1ZXJ5IHNob3VsZCBsb29rIGluc2lkZQorICAvLy8gaW5zdHJ1Y3Rpb24gYnVuZGxlcy4KKyAgYm9vbCBoYXNQcm9wZXJ0eSh1bnNpZ25lZCBNQ0ZsYWcsIFF1ZXJ5VHlwZSBUeXBlID0gQW55SW5CdW5kbGUpIGNvbnN0IHsKKyAgICAvLyBJbmxpbmUgdGhlIGZhc3QgcGF0aCBmb3IgdW5idW5kbGVkIG9yIGJ1bmRsZS1pbnRlcm5hbCBpbnN0cnVjdGlvbnMuCisgICAgaWYgKFR5cGUgPT0gSWdub3JlQnVuZGxlIHx8ICFpc0J1bmRsZWQoKSB8fCBpc0J1bmRsZWRXaXRoUHJlZCgpKQorICAgICAgcmV0dXJuIGdldERlc2MoKS5nZXRGbGFncygpICYgKDFVTEwgPDwgTUNGbGFnKTsKKworICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IGluc3RydWN0aW9uIGluIGEgYnVuZGxlLCB0YWtlIHRoZSBzbG93IHBhdGguCisgICAgcmV0dXJuIGhhc1Byb3BlcnR5SW5CdW5kbGUoMVVMTCA8PCBNQ0ZsYWcsIFR5cGUpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gY2FuIGhhdmUgYSB2YXJpYWJsZSBudW1iZXIgb2Ygb3BlcmFuZHMuCisgIC8vLyBJbiB0aGlzIGNhc2UsIHRoZSB2YXJpYWJsZSBvcGVyYW5kcyB3aWxsIGJlIGFmdGVyIHRoZSBub3JtYWwKKyAgLy8vIG9wZXJhbmRzIGJ1dCBiZWZvcmUgdGhlIGltcGxpY2l0IGRlZmluaXRpb25zIGFuZCB1c2VzIChpZiBhbnkgYXJlCisgIC8vLyBwcmVzZW50KS4KKyAgYm9vbCBpc1ZhcmlhZGljKFF1ZXJ5VHlwZSBUeXBlID0gSWdub3JlQnVuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6OlZhcmlhZGljLCBUeXBlKTsKKyAgfQorCisgIC8vLyBTZXQgaWYgdGhpcyBpbnN0cnVjdGlvbiBoYXMgYW4gb3B0aW9uYWwgZGVmaW5pdGlvbiwgZS5nLgorICAvLy8gQVJNIGluc3RydWN0aW9ucyB3aGljaCBjYW4gc2V0IGNvbmRpdGlvbiBjb2RlIGlmICdzJyBiaXQgaXMgc2V0LgorICBib29sIGhhc09wdGlvbmFsRGVmKFF1ZXJ5VHlwZSBUeXBlID0gSWdub3JlQnVuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6Okhhc09wdGlvbmFsRGVmLCBUeXBlKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgcHNldWRvIGluc3RydWN0aW9uIHRoYXQgZG9lc24ndAorICAvLy8gY29ycmVzcG9uZCB0byBhIHJlYWwgbWFjaGluZSBpbnN0cnVjdGlvbi4KKyAgYm9vbCBpc1BzZXVkbyhRdWVyeVR5cGUgVHlwZSA9IElnbm9yZUJ1bmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpQc2V1ZG8sIFR5cGUpOworICB9CisKKyAgYm9vbCBpc1JldHVybihRdWVyeVR5cGUgVHlwZSA9IEFueUluQnVuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6OlJldHVybiwgVHlwZSk7CisgIH0KKworICBib29sIGlzQ2FsbChRdWVyeVR5cGUgVHlwZSA9IEFueUluQnVuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6OkNhbGwsIFR5cGUpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIHN0b3BzIGNvbnRyb2wgZmxvdworICAvLy8gZnJvbSBleGVjdXRpbmcgdGhlIGluc3RydWN0aW9uIGltbWVkaWF0ZWx5IGZvbGxvd2luZyBpdC4gIEV4YW1wbGVzIGluY2x1ZGUKKyAgLy8vIHVuY29uZGl0aW9uYWwgYnJhbmNoZXMgYW5kIHJldHVybiBpbnN0cnVjdGlvbnMuCisgIGJvb2wgaXNCYXJyaWVyKFF1ZXJ5VHlwZSBUeXBlID0gQW55SW5CdW5kbGUpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzUHJvcGVydHkoTUNJRDo6QmFycmllciwgVHlwZSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gcGFydCBvZiB0aGUgdGVybWluYXRvciBmb3IgYSBiYXNpYyBibG9jay4KKyAgLy8vIFR5cGljYWxseSB0aGlzIGlzIHRoaW5ncyBsaWtlIHJldHVybiBhbmQgYnJhbmNoIGluc3RydWN0aW9ucy4KKyAgLy8vCisgIC8vLyBWYXJpb3VzIHBhc3NlcyB1c2UgdGhpcyB0byBpbnNlcnQgY29kZSBpbnRvIHRoZSBib3R0b20gb2YgYSBiYXNpYyBibG9jaywKKyAgLy8vIGJ1dCBiZWZvcmUgY29udHJvbCBmbG93IG9jY3Vycy4KKyAgYm9vbCBpc1Rlcm1pbmF0b3IoUXVlcnlUeXBlIFR5cGUgPSBBbnlJbkJ1bmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpUZXJtaW5hdG9yLCBUeXBlKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIGNvbmRpdGlvbmFsLCB1bmNvbmRpdGlvbmFsLCBvciBpbmRpcmVjdCBicmFuY2guCisgIC8vLyBQcmVkaWNhdGVzIGJlbG93IGNhbiBiZSB1c2VkIHRvIGRpc2NyaW1pbmF0ZSBiZXR3ZWVuCisgIC8vLyB0aGVzZSBjYXNlcywgYW5kIHRoZSBUYXJnZXRJbnN0ckluZm86OkFuYWx5emVCcmFuY2ggbWV0aG9kIGNhbiBiZSB1c2VkIHRvCisgIC8vLyBnZXQgbW9yZSBpbmZvcm1hdGlvbi4KKyAgYm9vbCBpc0JyYW5jaChRdWVyeVR5cGUgVHlwZSA9IEFueUluQnVuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6OkJyYW5jaCwgVHlwZSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBpbmRpcmVjdCBicmFuY2gsIHN1Y2ggYXMgYQorICAvLy8gYnJhbmNoIHRocm91Z2ggYSByZWdpc3Rlci4KKyAgYm9vbCBpc0luZGlyZWN0QnJhbmNoKFF1ZXJ5VHlwZSBUeXBlID0gQW55SW5CdW5kbGUpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzUHJvcGVydHkoTUNJRDo6SW5kaXJlY3RCcmFuY2gsIFR5cGUpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBicmFuY2ggd2hpY2ggbWF5IGZhbGwKKyAgLy8vIHRocm91Z2ggdG8gdGhlIG5leHQgaW5zdHJ1Y3Rpb24gb3IgbWF5IHRyYW5zZmVyIGNvbnRyb2wgZmxvdyB0byBzb21lIG90aGVyCisgIC8vLyBibG9jay4gIFRoZSBUYXJnZXRJbnN0ckluZm86OkFuYWx5emVCcmFuY2ggbWV0aG9kIGNhbiBiZSB1c2VkIHRvIGdldCBtb3JlCisgIC8vLyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIGJyYW5jaC4KKyAgYm9vbCBpc0NvbmRpdGlvbmFsQnJhbmNoKFF1ZXJ5VHlwZSBUeXBlID0gQW55SW5CdW5kbGUpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNCcmFuY2goVHlwZSkgJiAhaXNCYXJyaWVyKFR5cGUpICYgIWlzSW5kaXJlY3RCcmFuY2goVHlwZSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGJyYW5jaCB3aGljaCBhbHdheXMKKyAgLy8vIHRyYW5zZmVycyBjb250cm9sIGZsb3cgdG8gc29tZSBvdGhlciBibG9jay4gIFRoZQorICAvLy8gVGFyZ2V0SW5zdHJJbmZvOjpBbmFseXplQnJhbmNoIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBnZXQgbW9yZSBpbmZvcm1hdGlvbgorICAvLy8gYWJvdXQgdGhpcyBicmFuY2guCisgIGJvb2wgaXNVbmNvbmRpdGlvbmFsQnJhbmNoKFF1ZXJ5VHlwZSBUeXBlID0gQW55SW5CdW5kbGUpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNCcmFuY2goVHlwZSkgJiBpc0JhcnJpZXIoVHlwZSkgJiAhaXNJbmRpcmVjdEJyYW5jaChUeXBlKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGhhcyBhIHByZWRpY2F0ZSBvcGVyYW5kIHRoYXQKKyAgLy8vIGNvbnRyb2xzIGV4ZWN1dGlvbi4gIEl0IG1heSBiZSBzZXQgdG8gJ2Fsd2F5cycsIG9yIG1heSBiZSBzZXQgdG8gb3RoZXIKKyAgLy8vIHZhbHVlcy4gICBUaGVyZSBhcmUgdmFyaW91cyBtZXRob2RzIGluIFRhcmdldEluc3RySW5mbyB0aGF0IGNhbiBiZSB1c2VkIHRvCisgIC8vLyBjb250cm9sIGFuZCBtb2RpZnkgdGhlIHByZWRpY2F0ZSBpbiB0aGlzIGluc3RydWN0aW9uLgorICBib29sIGlzUHJlZGljYWJsZShRdWVyeVR5cGUgVHlwZSA9IEFsbEluQnVuZGxlKSBjb25zdCB7CisgICAgLy8gSWYgaXQncyBhIGJ1bmRsZSB0aGFuIGFsbCBidW5kbGVkIGluc3RydWN0aW9ucyBtdXN0IGJlIHByZWRpY2FibGUgZm9yIHRoaXMKKyAgICAvLyB0byByZXR1cm4gdHJ1ZS4KKyAgICByZXR1cm4gaGFzUHJvcGVydHkoTUNJRDo6UHJlZGljYWJsZSwgVHlwZSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBhIGNvbXBhcmlzb24uCisgIGJvb2wgaXNDb21wYXJlKFF1ZXJ5VHlwZSBUeXBlID0gSWdub3JlQnVuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6OkNvbXBhcmUsIFR5cGUpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgYSBtb3ZlIGltbWVkaWF0ZQorICAvLy8gKGluY2x1ZGluZyBjb25kaXRpb25hbCBtb3ZlcykgaW5zdHJ1Y3Rpb24uCisgIGJvb2wgaXNNb3ZlSW1tZWRpYXRlKFF1ZXJ5VHlwZSBUeXBlID0gSWdub3JlQnVuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6Ok1vdmVJbW0sIFR5cGUpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgYSBiaXRjYXN0IGluc3RydWN0aW9uLgorICBib29sIGlzQml0Y2FzdChRdWVyeVR5cGUgVHlwZSA9IElnbm9yZUJ1bmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpCaXRjYXN0LCBUeXBlKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGlzIGEgc2VsZWN0IGluc3RydWN0aW9uLgorICBib29sIGlzU2VsZWN0KFF1ZXJ5VHlwZSBUeXBlID0gSWdub3JlQnVuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6OlNlbGVjdCwgVHlwZSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBjYW5ub3QgYmUgc2FmZWx5IGR1cGxpY2F0ZWQuCisgIC8vLyBGb3IgZXhhbXBsZSwgaWYgdGhlIGluc3RydWN0aW9uIGhhcyBhIHVuaXF1ZSBsYWJlbHMgYXR0YWNoZWQKKyAgLy8vIHRvIGl0LCBkdXBsaWNhdGluZyBpdCB3b3VsZCBjYXVzZSBtdWx0aXBsZSBkZWZpbml0aW9uIGVycm9ycy4KKyAgYm9vbCBpc05vdER1cGxpY2FibGUoUXVlcnlUeXBlIFR5cGUgPSBBbnlJbkJ1bmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpOb3REdXBsaWNhYmxlLCBUeXBlKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGlzIGNvbnZlcmdlbnQuCisgIC8vLyBDb252ZXJnZW50IGluc3RydWN0aW9ucyBjYW4gbm90IGJlIG1hZGUgY29udHJvbC1kZXBlbmRlbnQgb24gYW55CisgIC8vLyBhZGRpdGlvbmFsIHZhbHVlcy4KKyAgYm9vbCBpc0NvbnZlcmdlbnQoUXVlcnlUeXBlIFR5cGUgPSBBbnlJbkJ1bmRsZSkgY29uc3QgeworICAgIGlmIChpc0lubGluZUFzbSgpKSB7CisgICAgICB1bnNpZ25lZCBFeHRyYUluZm8gPSBnZXRPcGVyYW5kKElubGluZUFzbTo6TUlPcF9FeHRyYUluZm8pLmdldEltbSgpOworICAgICAgaWYgKEV4dHJhSW5mbyAmIElubGluZUFzbTo6RXh0cmFfSXNDb252ZXJnZW50KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6OkNvbnZlcmdlbnQsIFR5cGUpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIGhhcyBhIGRlbGF5IHNsb3QKKyAgLy8vIHdoaWNoIG11c3QgYmUgZmlsbGVkIGJ5IHRoZSBjb2RlIGdlbmVyYXRvci4KKyAgYm9vbCBoYXNEZWxheVNsb3QoUXVlcnlUeXBlIFR5cGUgPSBBbnlJbkJ1bmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpEZWxheVNsb3QsIFR5cGUpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGZvciBpbnN0cnVjdGlvbnMgdGhhdCBjYW4gYmUgZm9sZGVkIGFzCisgIC8vLyBtZW1vcnkgb3BlcmFuZHMgaW4gb3RoZXIgaW5zdHJ1Y3Rpb25zLiBUaGUgbW9zdCBjb21tb24gdXNlIGZvciB0aGlzCisgIC8vLyBpcyBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgc2ltcGxlIGxvYWRzIGZyb20gbWVtb3J5IHRoYXQgZG9uJ3QgbW9kaWZ5CisgIC8vLyB0aGUgbG9hZGVkIHZhbHVlIGluIGFueSB3YXksIGJ1dCBpdCBjYW4gYWxzbyBiZSB1c2VkIGZvciBpbnN0cnVjdGlvbnMKKyAgLy8vIHRoYXQgY2FuIGJlIGV4cHJlc3NlZCBhcyBjb25zdGFudC1wb29sIGxvYWRzLCBzdWNoIGFzIFZfU0VUQUxMT05FUworICAvLy8gb24geDg2LCB0byBhbGxvdyB0aGVtIHRvIGJlIGZvbGRlZCB3aGVuIGl0IGlzIGJlbmVmaWNpYWwuCisgIC8vLyBUaGlzIHNob3VsZCBvbmx5IGJlIHNldCBvbiBpbnN0cnVjdGlvbnMgdGhhdCByZXR1cm4gYSB2YWx1ZSBpbiB0aGVpcgorICAvLy8gb25seSB2aXJ0dWFsIHJlZ2lzdGVyIGRlZmluaXRpb24uCisgIGJvb2wgY2FuRm9sZEFzTG9hZChRdWVyeVR5cGUgVHlwZSA9IElnbm9yZUJ1bmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpGb2xkYWJsZUFzTG9hZCwgVHlwZSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gYmVoYXZlcworICAvLy8gdGhlIHNhbWUgd2F5IGFzIHRoZSBnZW5lcmljIFJFR19TRVFVRU5DRSBpbnN0cnVjdGlvbnMuCisgIC8vLyBFLmcuLCBvbiBBUk0sCisgIC8vLyBkWCBWTU9WRFJSIHJZLCByWgorICAvLy8gaXMgZXF1aXZhbGVudCB0bworICAvLy8gZFggPSBSRUdfU0VRVUVOQ0UgclksIHNzdWJfMCwgclosIHNzdWJfMS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgZm9yIHRoZSBvcHRpbWl6ZXJzIHRvIGJlIGFibGUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YKKyAgLy8vIHRoaXMgcHJvcGVydHksIFRhcmdldEluc3RySW5mbzo6Z2V0UmVnU2VxdWVuY2VMaWtlSW5wdXRzIGhhcyB0byBiZQorICAvLy8gb3ZlcnJpZGUgYWNjb3JkaW5nbHkuCisgIGJvb2wgaXNSZWdTZXF1ZW5jZUxpa2UoUXVlcnlUeXBlIFR5cGUgPSBJZ25vcmVCdW5kbGUpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzUHJvcGVydHkoTUNJRDo6UmVnU2VxdWVuY2UsIFR5cGUpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGJlaGF2ZXMKKyAgLy8vIHRoZSBzYW1lIHdheSBhcyB0aGUgZ2VuZXJpYyBFWFRSQUNUX1NVQlJFRyBpbnN0cnVjdGlvbnMuCisgIC8vLyBFLmcuLCBvbiBBUk0sCisgIC8vLyByWCwgclkgVk1PVlJSRCBkWgorICAvLy8gaXMgZXF1aXZhbGVudCB0byB0d28gRVhUUkFDVF9TVUJSRUc6CisgIC8vLyByWCA9IEVYVFJBQ1RfU1VCUkVHIGRaLCBzc3ViXzAKKyAgLy8vIHJZID0gRVhUUkFDVF9TVUJSRUcgZFosIHNzdWJfMQorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBmb3IgdGhlIG9wdGltaXplcnMgdG8gYmUgYWJsZSB0byB0YWtlIGFkdmFudGFnZSBvZgorICAvLy8gdGhpcyBwcm9wZXJ0eSwgVGFyZ2V0SW5zdHJJbmZvOjpnZXRFeHRyYWN0U3VicmVnTGlrZUlucHV0cyBoYXMgdG8gYmUKKyAgLy8vIG92ZXJyaWRlIGFjY29yZGluZ2x5LgorICBib29sIGlzRXh0cmFjdFN1YnJlZ0xpa2UoUXVlcnlUeXBlIFR5cGUgPSBJZ25vcmVCdW5kbGUpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzUHJvcGVydHkoTUNJRDo6RXh0cmFjdFN1YnJlZywgVHlwZSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gYmVoYXZlcworICAvLy8gdGhlIHNhbWUgd2F5IGFzIHRoZSBnZW5lcmljIElOU0VSVF9TVUJSRUcgaW5zdHJ1Y3Rpb25zLgorICAvLy8gRS5nLiwgb24gQVJNLAorICAvLy8gZFggPSBWU0VUTE5pMzIgZFksIHJaLCBJbW0KKyAgLy8vIGlzIGVxdWl2YWxlbnQgdG8gYSBJTlNFUlRfU1VCUkVHOgorICAvLy8gZFggPSBJTlNFUlRfU1VCUkVHIGRZLCByWiwgdHJhbnNsYXRlSW1tVG9TdWJJZHgoSW1tKQorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBmb3IgdGhlIG9wdGltaXplcnMgdG8gYmUgYWJsZSB0byB0YWtlIGFkdmFudGFnZSBvZgorICAvLy8gdGhpcyBwcm9wZXJ0eSwgVGFyZ2V0SW5zdHJJbmZvOjpnZXRJbnNlcnRTdWJyZWdMaWtlSW5wdXRzIGhhcyB0byBiZQorICAvLy8gb3ZlcnJpZGUgYWNjb3JkaW5nbHkuCisgIGJvb2wgaXNJbnNlcnRTdWJyZWdMaWtlKFF1ZXJ5VHlwZSBUeXBlID0gSWdub3JlQnVuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6Okluc2VydFN1YnJlZywgVHlwZSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gU2lkZSBFZmZlY3QgQW5hbHlzaXMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gY291bGQgcG9zc2libHkgcmVhZCBtZW1vcnkuCisgIC8vLyBJbnN0cnVjdGlvbnMgd2l0aCB0aGlzIGZsYWcgc2V0IGFyZSBub3QgbmVjZXNzYXJpbHkgc2ltcGxlIGxvYWQKKyAgLy8vIGluc3RydWN0aW9ucywgdGhleSBtYXkgbG9hZCBhIHZhbHVlIGFuZCBtb2RpZnkgaXQsIGZvciBleGFtcGxlLgorICBib29sIG1heUxvYWQoUXVlcnlUeXBlIFR5cGUgPSBBbnlJbkJ1bmRsZSkgY29uc3QgeworICAgIGlmIChpc0lubGluZUFzbSgpKSB7CisgICAgICB1bnNpZ25lZCBFeHRyYUluZm8gPSBnZXRPcGVyYW5kKElubGluZUFzbTo6TUlPcF9FeHRyYUluZm8pLmdldEltbSgpOworICAgICAgaWYgKEV4dHJhSW5mbyAmIElubGluZUFzbTo6RXh0cmFfTWF5TG9hZCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpNYXlMb2FkLCBUeXBlKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGNvdWxkIHBvc3NpYmx5IG1vZGlmeSBtZW1vcnkuCisgIC8vLyBJbnN0cnVjdGlvbnMgd2l0aCB0aGlzIGZsYWcgc2V0IGFyZSBub3QgbmVjZXNzYXJpbHkgc2ltcGxlIHN0b3JlCisgIC8vLyBpbnN0cnVjdGlvbnMsIHRoZXkgbWF5IHN0b3JlIGEgbW9kaWZpZWQgdmFsdWUgYmFzZWQgb24gdGhlaXIgb3BlcmFuZHMsIG9yCisgIC8vLyBtYXkgbm90IGFjdHVhbGx5IG1vZGlmeSBhbnl0aGluZywgZm9yIGV4YW1wbGUuCisgIGJvb2wgbWF5U3RvcmUoUXVlcnlUeXBlIFR5cGUgPSBBbnlJbkJ1bmRsZSkgY29uc3QgeworICAgIGlmIChpc0lubGluZUFzbSgpKSB7CisgICAgICB1bnNpZ25lZCBFeHRyYUluZm8gPSBnZXRPcGVyYW5kKElubGluZUFzbTo6TUlPcF9FeHRyYUluZm8pLmdldEltbSgpOworICAgICAgaWYgKEV4dHJhSW5mbyAmIElubGluZUFzbTo6RXh0cmFfTWF5U3RvcmUpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gaGFzUHJvcGVydHkoTUNJRDo6TWF5U3RvcmUsIFR5cGUpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gY291bGQgcG9zc2libHkgcmVhZCBvciBtb2RpZnkgbWVtb3J5LgorICBib29sIG1heUxvYWRPclN0b3JlKFF1ZXJ5VHlwZSBUeXBlID0gQW55SW5CdW5kbGUpIGNvbnN0IHsKKyAgICByZXR1cm4gbWF5TG9hZChUeXBlKSB8fCBtYXlTdG9yZShUeXBlKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBGbGFncyB0aGF0IGluZGljYXRlIHdoZXRoZXIgYW4gaW5zdHJ1Y3Rpb24gY2FuIGJlIG1vZGlmaWVkIGJ5IGEgbWV0aG9kLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBtYXkgYmUgYSAyLSBvciAzLWFkZHJlc3MKKyAgLy8vIGluc3RydWN0aW9uIChvZiB0aGUgZm9ybSAiWCA9IG9wIFksIFosIC4uLiIpLCB3aGljaCBwcm9kdWNlcyB0aGUgc2FtZQorICAvLy8gcmVzdWx0IGlmIFkgYW5kIFogYXJlIGV4Y2hhbmdlZC4gIElmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZW4gdGhlCisgIC8vLyBUYXJnZXRJbnN0ckluZm86OmNvbW11dGVJbnN0cnVjdGlvbiBtZXRob2QgbWF5IGJlIHVzZWQgdG8gaGFjayBvbiB0aGUKKyAgLy8vIGluc3RydWN0aW9uLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGZsYWcgbWF5IGJlIHNldCBvbiBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgb25seSBjb21tdXRhYmxlCisgIC8vLyBzb21ldGltZXMuICBJbiB0aGVzZSBjYXNlcywgdGhlIGNhbGwgdG8gY29tbXV0ZUluc3RydWN0aW9uIHdpbGwgZmFpbC4KKyAgLy8vIEFsc28gbm90ZSB0aGF0IHNvbWUgaW5zdHJ1Y3Rpb25zIHJlcXVpcmUgbm9uLXRyaXZpYWwgbW9kaWZpY2F0aW9uIHRvCisgIC8vLyBjb21tdXRlIHRoZW0uCisgIGJvb2wgaXNDb21tdXRhYmxlKFF1ZXJ5VHlwZSBUeXBlID0gSWdub3JlQnVuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6OkNvbW11dGFibGUsIFR5cGUpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSAyLWFkZHJlc3MgaW5zdHJ1Y3Rpb24KKyAgLy8vIHdoaWNoIGNhbiBiZSBjaGFuZ2VkIGludG8gYSAzLWFkZHJlc3MgaW5zdHJ1Y3Rpb24gaWYgbmVlZGVkLiAgRG9pbmcgdGhpcworICAvLy8gdHJhbnNmb3JtYXRpb24gY2FuIGJlIHByb2ZpdGFibGUgaW4gdGhlIHJlZ2lzdGVyIGFsbG9jYXRvciwgYmVjYXVzZSBpdAorICAvLy8gbWVhbnMgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gY2FuIHVzZSBhIDItYWRkcmVzcyBmb3JtIGlmIHBvc3NpYmxlLCBidXQKKyAgLy8vIGRlZ3JhZGUgaW50byBhIGxlc3MgZWZmaWNpZW50IGZvcm0gaWYgdGhlIHNvdXJjZSBhbmQgZGVzdCByZWdpc3RlciBjYW5ub3QKKyAgLy8vIGJlIGFzc2lnbmVkIHRvIHRoZSBzYW1lIHJlZ2lzdGVyLiAgRm9yIGV4YW1wbGUsIHRoaXMgYWxsb3dzIHRoZSB4ODYKKyAgLy8vIGJhY2tlbmQgdG8gdHVybiBhICJzaGwgcmVnLCAzIiBpbnN0cnVjdGlvbiBpbnRvIGFuIExFQSBpbnN0cnVjdGlvbiwgd2hpY2gKKyAgLy8vIGlzIHRoZSBzYW1lIHNwZWVkIGFzIHRoZSBzaGlmdCBidXQgaGFzIGJpZ2dlciBjb2RlIHNpemUuCisgIC8vLworICAvLy8gSWYgdGhpcyByZXR1cm5zIHRydWUsIHRoZW4gdGhlIHRhcmdldCBtdXN0IGltcGxlbWVudCB0aGUKKyAgLy8vIFRhcmdldEluc3RySW5mbzo6Y29udmVydFRvVGhyZWVBZGRyZXNzIG1ldGhvZCBmb3IgdGhpcyBpbnN0cnVjdGlvbiwgd2hpY2gKKyAgLy8vIGlzIGFsbG93ZWQgdG8gZmFpbCBpZiB0aGUgdHJhbnNmb3JtYXRpb24gaXNuJ3QgdmFsaWQgZm9yIHRoaXMgc3BlY2lmaWMKKyAgLy8vIGluc3RydWN0aW9uIChlLmcuIHNobCByZWcsIDQgb24geDg2KS4KKyAgLy8vCisgIGJvb2wgaXNDb252ZXJ0aWJsZVRvM0FkZHIoUXVlcnlUeXBlIFR5cGUgPSBJZ25vcmVCdW5kbGUpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzUHJvcGVydHkoTUNJRDo6Q29udmVydGlibGVUbzNBZGRyLCBUeXBlKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIHJlcXVpcmVzCisgIC8vLyBjdXN0b20gaW5zZXJ0aW9uIHN1cHBvcnQgd2hlbiB0aGUgREFHIHNjaGVkdWxlciBpcyBpbnNlcnRpbmcgaXQgaW50byBhCisgIC8vLyBtYWNoaW5lIGJhc2ljIGJsb2NrLiAgSWYgdGhpcyBpcyB0cnVlIGZvciB0aGUgaW5zdHJ1Y3Rpb24sIGl0IGJhc2ljYWxseQorICAvLy8gbWVhbnMgdGhhdCBpdCBpcyBhIHBzZXVkbyBpbnN0cnVjdGlvbiB1c2VkIGF0IFNlbGVjdGlvbkRBRyB0aW1lIHRoYXQgaXMKKyAgLy8vIGV4cGFuZGVkIG91dCBpbnRvIG1hZ2ljIGNvZGUgYnkgdGhlIHRhcmdldCB3aGVuIE1hY2hpbmVJbnN0cnMgYXJlIGZvcm1lZC4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIGlzIHRydWUsIHRoZSBUYXJnZXRMb3dlcmluZ0luZm86Okluc2VydEF0RW5kT2ZCYXNpY0Jsb2NrIG1ldGhvZAorICAvLy8gaXMgdXNlZCB0byBpbnNlcnQgdGhpcyBpbnRvIHRoZSBNYWNoaW5lQmFzaWNCbG9jay4KKyAgYm9vbCB1c2VzQ3VzdG9tSW5zZXJ0aW9uSG9vayhRdWVyeVR5cGUgVHlwZSA9IElnbm9yZUJ1bmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIsIFR5cGUpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gcmVxdWlyZXMgKmFkanVzdG1lbnQqCisgIC8vLyBhZnRlciBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gYnkgY2FsbGluZyBhIHRhcmdldCBob29rLiBGb3IgZXhhbXBsZSwgdGhpcworICAvLy8gY2FuIGJlIHVzZWQgdG8gZmlsbCBpbiBBUk0gJ3MnIG9wdGlvbmFsIG9wZXJhbmQgZGVwZW5kaW5nIG9uIHdoZXRoZXIKKyAgLy8vIHRoZSBjb25kaXRpb25hbCBmbGFnIHJlZ2lzdGVyIGlzIHVzZWQuCisgIGJvb2wgaGFzUG9zdElTZWxIb29rKFF1ZXJ5VHlwZSBUeXBlID0gSWdub3JlQnVuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6Okhhc1Bvc3RJU2VsSG9vaywgVHlwZSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgYSBjYW5kaWRhdGUgZm9yIHJlbWF0LgorICAvLy8gVGhpcyBmbGFnIGlzIGRlcHJlY2F0ZWQsIHBsZWFzZSBkb24ndCB1c2UgaXQgYW55bW9yZS4gIElmIHRoaXMKKyAgLy8vIGZsYWcgaXMgc2V0LCB0aGUgaXNSZWFsbHlUcml2aWFsbHlSZU1hdGVyaWFsaXphYmxlKCkgbWV0aG9kIGlzIGNhbGxlZCB0bworICAvLy8gdmVyaWZ5IHRoZSBpbnN0cnVjdGlvbiBpcyByZWFsbHkgcmVtYXRhYmxlLgorICBib29sIGlzUmVtYXRlcmlhbGl6YWJsZShRdWVyeVR5cGUgVHlwZSA9IEFsbEluQnVuZGxlKSBjb25zdCB7CisgICAgLy8gSXQncyBvbmx5IHBvc3NpYmxlIHRvIHJlLW1hdCBhIGJ1bmRsZSBpZiBhbGwgYnVuZGxlZCBpbnN0cnVjdGlvbnMgYXJlCisgICAgLy8gcmUtbWF0ZXJpYWxpemFibGUuCisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6OlJlbWF0ZXJpYWxpemFibGUsIFR5cGUpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGhhcyB0aGUgc2FtZSBjb3N0IChvciBsZXNzKSB0aGFuIGEgbW92ZQorICAvLy8gaW5zdHJ1Y3Rpb24uIFRoaXMgaXMgdXNlZnVsIGR1cmluZyBjZXJ0YWluIHR5cGVzIG9mIG9wdGltaXphdGlvbnMKKyAgLy8vIChlLmcuLCByZW1hdCBkdXJpbmcgdHdvLWFkZHJlc3MgY29udmVyc2lvbiBvciBtYWNoaW5lIGxpY20pCisgIC8vLyB3aGVyZSB3ZSB3b3VsZCBsaWtlIHRvIHJlbWF0IG9yIGhvaXN0IHRoZSBpbnN0cnVjdGlvbiwgYnV0IG5vdCBpZiBpdCBjb3N0cworICAvLy8gbW9yZSB0aGFuIG1vdmluZyB0aGUgaW5zdHJ1Y3Rpb24gaW50byB0aGUgYXBwcm9wcmlhdGUgcmVnaXN0ZXIuIE5vdGUsIHdlCisgIC8vLyBhcmUgbm90IG1hcmtpbmcgY29waWVzIGZyb20gYW5kIHRvIHRoZSBzYW1lIHJlZ2lzdGVyIGNsYXNzIHdpdGggdGhpcyBmbGFnLgorICBib29sIGlzQXNDaGVhcEFzQU1vdmUoUXVlcnlUeXBlIFR5cGUgPSBBbGxJbkJ1bmRsZSkgY29uc3QgeworICAgIC8vIE9ubHkgcmV0dXJucyB0cnVlIGZvciBhIGJ1bmRsZSBpZiBhbGwgYnVuZGxlZCBpbnN0cnVjdGlvbnMgYXJlIGNoZWFwLgorICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpDaGVhcEFzQU1vdmUsIFR5cGUpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIHNvdXJjZSBvcGVyYW5kcworICAvLy8gaGF2ZSBzcGVjaWFsIHJlZ2lzdGVyIGFsbG9jYXRpb24gcmVxdWlyZW1lbnRzIHRoYXQgYXJlIG5vdCBjYXB0dXJlZCBieSB0aGUKKyAgLy8vIG9wZXJhbmQgcmVnaXN0ZXIgY2xhc3Nlcy4gZS5nLiBBUk06OlNUUkQncyB0d28gc291cmNlIHJlZ2lzdGVycyBtdXN0IGJlIGFuCisgIC8vLyBldmVuIC8gb2RkIHBhaXIsIEFSTTo6U1RNIHJlZ2lzdGVycyBoYXZlIHRvIGJlIGluIGFzY2VuZGluZyBvcmRlci4KKyAgLy8vIFBvc3QtcmVnaXN0ZXIgYWxsb2NhdGlvbiBwYXNzZXMgc2hvdWxkIG5vdCBhdHRlbXB0IHRvIGNoYW5nZSBhbGxvY2F0aW9ucworICAvLy8gZm9yIHNvdXJjZXMgb2YgaW5zdHJ1Y3Rpb25zIHdpdGggdGhpcyBmbGFnLgorICBib29sIGhhc0V4dHJhU3JjUmVnQWxsb2NSZXEoUXVlcnlUeXBlIFR5cGUgPSBBbnlJbkJ1bmRsZSkgY29uc3QgeworICAgIHJldHVybiBoYXNQcm9wZXJ0eShNQ0lEOjpFeHRyYVNyY1JlZ0FsbG9jUmVxLCBUeXBlKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBkZWYgb3BlcmFuZHMKKyAgLy8vIGhhdmUgc3BlY2lhbCByZWdpc3RlciBhbGxvY2F0aW9uIHJlcXVpcmVtZW50cyB0aGF0IGFyZSBub3QgY2FwdHVyZWQgYnkgdGhlCisgIC8vLyBvcGVyYW5kIHJlZ2lzdGVyIGNsYXNzZXMuIGUuZy4gQVJNOjpMRFJEJ3MgdHdvIGRlZiByZWdpc3RlcnMgbXVzdCBiZSBhbgorICAvLy8gZXZlbiAvIG9kZCBwYWlyLCBBUk06OkxETSByZWdpc3RlcnMgaGF2ZSB0byBiZSBpbiBhc2NlbmRpbmcgb3JkZXIuCisgIC8vLyBQb3N0LXJlZ2lzdGVyIGFsbG9jYXRpb24gcGFzc2VzIHNob3VsZCBub3QgYXR0ZW1wdCB0byBjaGFuZ2UgYWxsb2NhdGlvbnMKKyAgLy8vIGZvciBkZWZpbml0aW9ucyBvZiBpbnN0cnVjdGlvbnMgd2l0aCB0aGlzIGZsYWcuCisgIGJvb2wgaGFzRXh0cmFEZWZSZWdBbGxvY1JlcShRdWVyeVR5cGUgVHlwZSA9IEFueUluQnVuZGxlKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1Byb3BlcnR5KE1DSUQ6OkV4dHJhRGVmUmVnQWxsb2NSZXEsIFR5cGUpOworICB9CisKKyAgZW51bSBNSUNoZWNrVHlwZSB7CisgICAgQ2hlY2tEZWZzLCAgICAgIC8vIENoZWNrIGFsbCBvcGVyYW5kcyBmb3IgZXF1YWxpdHkKKyAgICBDaGVja0tpbGxEZWFkLCAgLy8gQ2hlY2sgYWxsIG9wZXJhbmRzIGluY2x1ZGluZyBraWxsIC8gZGVhZCBtYXJrZXJzCisgICAgSWdub3JlRGVmcywgICAgIC8vIElnbm9yZSBhbGwgZGVmaW5pdGlvbnMKKyAgICBJZ25vcmVWUmVnRGVmcyAgLy8gSWdub3JlIHZpcnR1YWwgcmVnaXN0ZXIgZGVmaW5pdGlvbnMKKyAgfTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBpZGVudGljYWwgdG8gXHAgT3RoZXIuCisgIC8vLyBUd28gaW5zdHJ1Y3Rpb25zIGFyZSBpZGVudGljYWwgaWYgdGhleSBoYXZlIHRoZSBzYW1lIG9wY29kZSBhbmQgYWxsIHRoZWlyCisgIC8vLyBvcGVyYW5kcyBhcmUgaWRlbnRpY2FsICh3aXRoIHJlc3BlY3QgdG8gTWFjaGluZU9wZXJhbmQ6OmlzSWRlbnRpY2FsVG8oKSkuCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBtZWFucyBsaXZlbmVzcyByZWxhdGVkIGZsYWdzIChkZWFkLCB1bmRlZiwga2lsbCkgZG8gbm90CisgIC8vLyBhZmZlY3QgdGhlIG5vdGlvbiBvZiBpZGVudGljYWwuCisgIGJvb2wgaXNJZGVudGljYWxUbyhjb25zdCBNYWNoaW5lSW5zdHIgJk90aGVyLAorICAgICAgICAgICAgICAgICAgICAgTUlDaGVja1R5cGUgQ2hlY2sgPSBDaGVja0RlZnMpIGNvbnN0OworCisgIC8vLyBVbmxpbmsgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcgYmFzaWMgYmxvY2ssIGFuZCByZXR1cm4gaXQgd2l0aG91dAorICAvLy8gZGVsZXRpbmcgaXQuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBjYW4gbm90IGJlIHVzZWQgb24gYnVuZGxlZCBpbnN0cnVjdGlvbnMsIHVzZQorICAvLy8gcmVtb3ZlRnJvbUJ1bmRsZSgpIHRvIHJlbW92ZSBpbmRpdmlkdWFsIGluc3RydWN0aW9ucyBmcm9tIGEgYnVuZGxlLgorICBNYWNoaW5lSW5zdHIgKnJlbW92ZUZyb21QYXJlbnQoKTsKKworICAvLy8gVW5saW5rIHRoaXMgaW5zdHJ1Y3Rpb24gZnJvbSBpdHMgYmFzaWMgYmxvY2sgYW5kIHJldHVybiBpdCB3aXRob3V0CisgIC8vLyBkZWxldGluZyBpdC4KKyAgLy8vCisgIC8vLyBJZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgcGFydCBvZiBhIGJ1bmRsZSwgdGhlIG90aGVyIGluc3RydWN0aW9ucyBpbiB0aGUKKyAgLy8vIGJ1bmRsZSByZW1haW4gYnVuZGxlZC4KKyAgTWFjaGluZUluc3RyICpyZW1vdmVGcm9tQnVuZGxlKCk7CisKKyAgLy8vIFVubGluayAndGhpcycgZnJvbSB0aGUgY29udGFpbmluZyBiYXNpYyBibG9jayBhbmQgZGVsZXRlIGl0LgorICAvLy8KKyAgLy8vIElmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgdGhlIGhlYWRlciBvZiBhIGJ1bmRsZSwgdGhlIHdob2xlIGJ1bmRsZSBpcyBlcmFzZWQuCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGNhbiBub3QgYmUgdXNlZCBmb3IgaW5zdHJ1Y3Rpb25zIGluc2lkZSBhIGJ1bmRsZSwgdXNlCisgIC8vLyBlcmFzZUZyb21CdW5kbGUoKSB0byBlcmFzZSBpbmRpdmlkdWFsIGJ1bmRsZWQgaW5zdHJ1Y3Rpb25zLgorICB2b2lkIGVyYXNlRnJvbVBhcmVudCgpOworCisgIC8vLyBVbmxpbmsgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcgYmFzaWMgYmxvY2sgYW5kIGRlbGV0ZSBpdC4KKyAgLy8vCisgIC8vLyBGb3IgYWxsIGRlZmluaXRpb25zIG1hcmsgdGhlaXIgdXNlcyBpbiBEQkdfVkFMVUUgbm9kZXMKKyAgLy8vIGFzIHVuZGVmaW5lZC4gT3RoZXJ3aXNlIGxpa2UgZXJhc2VGcm9tUGFyZW50KCkuCisgIHZvaWQgZXJhc2VGcm9tUGFyZW50QW5kTWFya0RCR1ZhbHVlc0ZvclJlbW92YWwoKTsKKworICAvLy8gVW5saW5rICd0aGlzJyBmb3JtIGl0cyBiYXNpYyBibG9jayBhbmQgZGVsZXRlIGl0LgorICAvLy8KKyAgLy8vIElmIHRoZSBpbnN0cnVjdGlvbiBpcyBwYXJ0IG9mIGEgYnVuZGxlLCB0aGUgb3RoZXIgaW5zdHJ1Y3Rpb25zIGluIHRoZQorICAvLy8gYnVuZGxlIHJlbWFpbiBidW5kbGVkLgorICB2b2lkIGVyYXNlRnJvbUJ1bmRsZSgpOworCisgIGJvb2wgaXNFSExhYmVsKCkgY29uc3QgeyByZXR1cm4gZ2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpFSF9MQUJFTDsgfQorICBib29sIGlzR0NMYWJlbCgpIGNvbnN0IHsgcmV0dXJuIGdldE9wY29kZSgpID09IFRhcmdldE9wY29kZTo6R0NfTEFCRUw7IH0KKyAgYm9vbCBpc0Fubm90YXRpb25MYWJlbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpBTk5PVEFUSU9OX0xBQkVMOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgTWFjaGluZUluc3RyIHJlcHJlc2VudHMgYSBsYWJlbC4KKyAgYm9vbCBpc0xhYmVsKCkgY29uc3QgeworICAgIHJldHVybiBpc0VITGFiZWwoKSB8fCBpc0dDTGFiZWwoKSB8fCBpc0Fubm90YXRpb25MYWJlbCgpOworICB9CisKKyAgYm9vbCBpc0NGSUluc3RydWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OkNGSV9JTlNUUlVDVElPTjsKKyAgfQorCisgIC8vIFRydWUgaWYgdGhlIGluc3RydWN0aW9uIHJlcHJlc2VudHMgYSBwb3NpdGlvbiBpbiB0aGUgZnVuY3Rpb24uCisgIGJvb2wgaXNQb3NpdGlvbigpIGNvbnN0IHsgcmV0dXJuIGlzTGFiZWwoKSB8fCBpc0NGSUluc3RydWN0aW9uKCk7IH0KKworICBib29sIGlzRGVidWdWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wY29kZSgpID09IFRhcmdldE9wY29kZTo6REJHX1ZBTFVFOyB9CisKKyAgLy8vIEEgREJHX1ZBTFVFIGlzIGluZGlyZWN0IGlmZiB0aGUgZmlyc3Qgb3BlcmFuZCBpcyBhIHJlZ2lzdGVyIGFuZAorICAvLy8gdGhlIHNlY29uZCBvcGVyYW5kIGlzIGFuIGltbWVkaWF0ZS4KKyAgYm9vbCBpc0luZGlyZWN0RGVidWdWYWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNEZWJ1Z1ZhbHVlKCkKKyAgICAgICYmIGdldE9wZXJhbmQoMCkuaXNSZWcoKQorICAgICAgJiYgZ2V0T3BlcmFuZCgxKS5pc0ltbSgpOworICB9CisKKyAgYm9vbCBpc1BISSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpQSEkgfHwKKyAgICAgICAgICAgZ2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpHX1BISTsKKyAgfQorICBib29sIGlzS2lsbCgpIGNvbnN0IHsgcmV0dXJuIGdldE9wY29kZSgpID09IFRhcmdldE9wY29kZTo6S0lMTDsgfQorICBib29sIGlzSW1wbGljaXREZWYoKSBjb25zdCB7IHJldHVybiBnZXRPcGNvZGUoKT09VGFyZ2V0T3Bjb2RlOjpJTVBMSUNJVF9ERUY7IH0KKyAgYm9vbCBpc0lubGluZUFzbSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wY29kZSgpID09IFRhcmdldE9wY29kZTo6SU5MSU5FQVNNOyB9CisKKyAgYm9vbCBpc01TSW5saW5lQXNtKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OklOTElORUFTTSAmJiBnZXRJbmxpbmVBc21EaWFsZWN0KCk7CisgIH0KKworICBib29sIGlzU3RhY2tBbGlnbmluZ0lubGluZUFzbSgpIGNvbnN0OworICBJbmxpbmVBc206OkFzbURpYWxlY3QgZ2V0SW5saW5lQXNtRGlhbGVjdCgpIGNvbnN0OworCisgIGJvb2wgaXNJbnNlcnRTdWJyZWcoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wY29kZSgpID09IFRhcmdldE9wY29kZTo6SU5TRVJUX1NVQlJFRzsKKyAgfQorCisgIGJvb2wgaXNTdWJyZWdUb1JlZygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpTVUJSRUdfVE9fUkVHOworICB9CisKKyAgYm9vbCBpc1JlZ1NlcXVlbmNlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGNvZGUoKSA9PSBUYXJnZXRPcGNvZGU6OlJFR19TRVFVRU5DRTsKKyAgfQorCisgIGJvb2wgaXNCdW5kbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wY29kZSgpID09IFRhcmdldE9wY29kZTo6QlVORExFOworICB9CisKKyAgYm9vbCBpc0NvcHkoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wY29kZSgpID09IFRhcmdldE9wY29kZTo6Q09QWTsKKyAgfQorCisgIGJvb2wgaXNGdWxsQ29weSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNDb3B5KCkgJiYgIWdldE9wZXJhbmQoMCkuZ2V0U3ViUmVnKCkgJiYgIWdldE9wZXJhbmQoMSkuZ2V0U3ViUmVnKCk7CisgIH0KKworICBib29sIGlzRXh0cmFjdFN1YnJlZygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3Bjb2RlKCkgPT0gVGFyZ2V0T3Bjb2RlOjpFWFRSQUNUX1NVQlJFRzsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gYmVoYXZlcyBsaWtlIGEgY29weS4KKyAgLy8vIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBuYXRpdmUgY29weSBpbnN0cnVjdGlvbnMuCisgIGJvb2wgaXNDb3B5TGlrZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNDb3B5KCkgfHwgaXNTdWJyZWdUb1JlZygpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlzIHRoZSBpbnN0cnVjdGlvbiBpcyBhbiBpZGVudGl0eSBjb3B5LgorICBib29sIGlzSWRlbnRpdHlDb3B5KCkgY29uc3QgeworICAgIHJldHVybiBpc0NvcHkoKSAmJiBnZXRPcGVyYW5kKDApLmdldFJlZygpID09IGdldE9wZXJhbmQoMSkuZ2V0UmVnKCkgJiYKKyAgICAgIGdldE9wZXJhbmQoMCkuZ2V0U3ViUmVnKCkgPT0gZ2V0T3BlcmFuZCgxKS5nZXRTdWJSZWcoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGRvZXNuJ3QgcHJvZHVjZSBhbnkgb3V0cHV0IGluIHRoZSBmb3JtIG9mCisgIC8vLyBleGVjdXRhYmxlIGluc3RydWN0aW9ucy4KKyAgYm9vbCBpc01ldGFJbnN0cnVjdGlvbigpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKGdldE9wY29kZSgpKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6SU1QTElDSVRfREVGOgorICAgIGNhc2UgVGFyZ2V0T3Bjb2RlOjpLSUxMOgorICAgIGNhc2UgVGFyZ2V0T3Bjb2RlOjpDRklfSU5TVFJVQ1RJT046CisgICAgY2FzZSBUYXJnZXRPcGNvZGU6OkVIX0xBQkVMOgorICAgIGNhc2UgVGFyZ2V0T3Bjb2RlOjpHQ19MQUJFTDoKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6REJHX1ZBTFVFOgorICAgIGNhc2UgVGFyZ2V0T3Bjb2RlOjpMSUZFVElNRV9TVEFSVDoKKyAgICBjYXNlIFRhcmdldE9wY29kZTo6TElGRVRJTUVfRU5EOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSB0cmFuc2llbnQgaW5zdHJ1Y3Rpb24gdGhhdCBpcyBlaXRoZXIgdmVyeSBsaWtlbHkKKyAgLy8vIHRvIGJlIGVsaW1pbmF0ZWQgZHVyaW5nIHJlZ2lzdGVyIGFsbG9jYXRpb24gKHN1Y2ggYXMgY29weS1saWtlCisgIC8vLyBpbnN0cnVjdGlvbnMpLCBvciBpZiB0aGlzIGluc3RydWN0aW9uIGRvZXNuJ3QgaGF2ZSBhbiBleGVjdXRpb24tdGltZSBjb3N0LgorICBib29sIGlzVHJhbnNpZW50KCkgY29uc3QgeworICAgIHN3aXRjaCAoZ2V0T3Bjb2RlKCkpIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGlzTWV0YUluc3RydWN0aW9uKCk7CisgICAgLy8gQ29weS1saWtlIGluc3RydWN0aW9ucyBhcmUgdXN1YWxseSBlbGltaW5hdGVkIGR1cmluZyByZWdpc3RlciBhbGxvY2F0aW9uLgorICAgIGNhc2UgVGFyZ2V0T3Bjb2RlOjpQSEk6CisgICAgY2FzZSBUYXJnZXRPcGNvZGU6OkdfUEhJOgorICAgIGNhc2UgVGFyZ2V0T3Bjb2RlOjpDT1BZOgorICAgIGNhc2UgVGFyZ2V0T3Bjb2RlOjpJTlNFUlRfU1VCUkVHOgorICAgIGNhc2UgVGFyZ2V0T3Bjb2RlOjpTVUJSRUdfVE9fUkVHOgorICAgIGNhc2UgVGFyZ2V0T3Bjb2RlOjpSRUdfU0VRVUVOQ0U6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIGluc2lkZSB0aGUgTUkgYnVuZGxlLCBleGNsdWRpbmcgdGhlCisgIC8vLyBidW5kbGUgaGVhZGVyLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdGhhdCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IKKyAgLy8vIHNraXBzLCAwIGZvciB1bmJ1bmRsZWQgaW5zdHJ1Y3Rpb25zLgorICB1bnNpZ25lZCBnZXRCdW5kbGVTaXplKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBNYWNoaW5lSW5zdHIgcmVhZHMgdGhlIHNwZWNpZmllZCByZWdpc3Rlci4KKyAgLy8vIElmIFRhcmdldFJlZ2lzdGVySW5mbyBpcyBwYXNzZWQsIHRoZW4gaXQgYWxzbyBjaGVja3MgaWYgdGhlcmUKKyAgLy8vIGlzIGEgcmVhZCBvZiBhIHN1cGVyLXJlZ2lzdGVyLgorICAvLy8gVGhpcyBkb2VzIG5vdCBjb3VudCBwYXJ0aWFsIHJlZGVmaW5lcyBvZiB2aXJ0dWFsIHJlZ2lzdGVycyBhcyByZWFkczoKKyAgLy8vICAgJXJlZzEwMjQ6NiA9IE9QLgorICBib29sIHJlYWRzUmVnaXN0ZXIodW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBudWxscHRyKSBjb25zdCB7CisgICAgcmV0dXJuIGZpbmRSZWdpc3RlclVzZU9wZXJhbmRJZHgoUmVnLCBmYWxzZSwgVFJJKSAhPSAtMTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgTWFjaGluZUluc3RyIHJlYWRzIHRoZSBzcGVjaWZpZWQgdmlydHVhbCByZWdpc3Rlci4KKyAgLy8vIFRha2UgaW50byBhY2NvdW50IHRoYXQgYSBwYXJ0aWFsIGRlZmluZSBpcyBhCisgIC8vLyByZWFkLW1vZGlmeS13cml0ZSBvcGVyYXRpb24uCisgIGJvb2wgcmVhZHNWaXJ0dWFsUmVnaXN0ZXIodW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgcmV0dXJuIHJlYWRzV3JpdGVzVmlydHVhbFJlZ2lzdGVyKFJlZykuZmlyc3Q7CisgIH0KKworICAvLy8gUmV0dXJuIGEgcGFpciBvZiBib29scyAocmVhZHMsIHdyaXRlcykgaW5kaWNhdGluZyBpZiB0aGlzIGluc3RydWN0aW9uCisgIC8vLyByZWFkcyBvciB3cml0ZXMgUmVnLiBUaGlzIGFsc28gY29uc2lkZXJzIHBhcnRpYWwgZGVmaW5lcy4KKyAgLy8vIElmIE9wcyBpcyBub3QgbnVsbCwgYWxsIG9wZXJhbmQgaW5kaWNlcyBmb3IgUmVnIGFyZSBhZGRlZC4KKyAgc3RkOjpwYWlyPGJvb2wsYm9vbD4gcmVhZHNXcml0ZXNWaXJ0dWFsUmVnaXN0ZXIodW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8dW5zaWduZWQ+ICpPcHMgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIE1hY2hpbmVJbnN0ciBraWxscyB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLgorICAvLy8gSWYgVGFyZ2V0UmVnaXN0ZXJJbmZvIGlzIHBhc3NlZCwgdGhlbiBpdCBhbHNvIGNoZWNrcyBpZiB0aGVyZSBpcworICAvLy8gYSBraWxsIG9mIGEgc3VwZXItcmVnaXN0ZXIuCisgIGJvb2wga2lsbHNSZWdpc3Rlcih1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gZmluZFJlZ2lzdGVyVXNlT3BlcmFuZElkeChSZWcsIHRydWUsIFRSSSkgIT0gLTE7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIE1hY2hpbmVJbnN0ciBmdWxseSBkZWZpbmVzIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIuCisgIC8vLyBJZiBUYXJnZXRSZWdpc3RlckluZm8gaXMgcGFzc2VkLCB0aGVuIGl0IGFsc28gY2hlY2tzCisgIC8vLyBpZiB0aGVyZSBpcyBhIGRlZiBvZiBhIHN1cGVyLXJlZ2lzdGVyLgorICAvLy8gTk9URTogSXQncyBpZ25vcmluZyBzdWJyZWcgaW5kaWNlcyBvbiB2aXJ0dWFsIHJlZ2lzdGVycy4KKyAgYm9vbCBkZWZpbmVzUmVnaXN0ZXIodW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gZmluZFJlZ2lzdGVyRGVmT3BlcmFuZElkeChSZWcsIGZhbHNlLCBmYWxzZSwgVFJJKSAhPSAtMTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgTWFjaGluZUluc3RyIG1vZGlmaWVzIChmdWxseSBkZWZpbmUgb3IgcGFydGlhbGx5CisgIC8vLyBkZWZpbmUpIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIuCisgIC8vLyBOT1RFOiBJdCdzIGlnbm9yaW5nIHN1YnJlZyBpbmRpY2VzIG9uIHZpcnR1YWwgcmVnaXN0ZXJzLgorICBib29sIG1vZGlmaWVzUmVnaXN0ZXIodW5zaWduZWQgUmVnLCBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3QgeworICAgIHJldHVybiBmaW5kUmVnaXN0ZXJEZWZPcGVyYW5kSWR4KFJlZywgZmFsc2UsIHRydWUsIFRSSSkgIT0gLTE7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSByZWdpc3RlciBpcyBkZWFkIGluIHRoaXMgbWFjaGluZSBpbnN0cnVjdGlvbi4KKyAgLy8vIElmIFRhcmdldFJlZ2lzdGVySW5mbyBpcyBwYXNzZWQsIHRoZW4gaXQgYWxzbyBjaGVja3MKKyAgLy8vIGlmIHRoZXJlIGlzIGEgZGVhZCBkZWYgb2YgYSBzdXBlci1yZWdpc3Rlci4KKyAgYm9vbCByZWdpc3RlckRlZklzRGVhZCh1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBudWxscHRyKSBjb25zdCB7CisgICAgcmV0dXJuIGZpbmRSZWdpc3RlckRlZk9wZXJhbmRJZHgoUmVnLCB0cnVlLCBmYWxzZSwgVFJJKSAhPSAtMTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIE1hY2hpbmVJbnN0ciBoYXMgYW4gaW1wbGljaXQtdXNlIG9wZXJhbmQgb2YgZXhhY3RseQorICAvLy8gdGhlIGdpdmVuIHJlZ2lzdGVyIChub3QgY29uc2lkZXJpbmcgc3ViL3N1cGVyLXJlZ2lzdGVycykuCisgIGJvb2wgaGFzUmVnaXN0ZXJJbXBsaWNpdFVzZU9wZXJhbmQodW5zaWduZWQgUmVnKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgb3BlcmFuZCBpbmRleCB0aGF0IGlzIGEgdXNlIG9mIHRoZSBzcGVjaWZpYyByZWdpc3RlciBvciAtMQorICAvLy8gaWYgaXQgaXMgbm90IGZvdW5kLiBJdCBmdXJ0aGVyIHRpZ2h0ZW5zIHRoZSBzZWFyY2ggY3JpdGVyaWEgdG8gYSB1c2UKKyAgLy8vIHRoYXQga2lsbHMgdGhlIHJlZ2lzdGVyIGlmIGlzS2lsbCBpcyB0cnVlLgorICBpbnQgZmluZFJlZ2lzdGVyVXNlT3BlcmFuZElkeCh1bnNpZ25lZCBSZWcsIGJvb2wgaXNLaWxsID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFdyYXBwZXIgZm9yIGZpbmRSZWdpc3RlclVzZU9wZXJhbmRJZHgsIGl0IHJldHVybnMKKyAgLy8vIGEgcG9pbnRlciB0byB0aGUgTWFjaGluZU9wZXJhbmQgcmF0aGVyIHRoYW4gYW4gaW5kZXguCisgIE1hY2hpbmVPcGVyYW5kICpmaW5kUmVnaXN0ZXJVc2VPcGVyYW5kKHVuc2lnbmVkIFJlZywgYm9vbCBpc0tpbGwgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBudWxscHRyKSB7CisgICAgaW50IElkeCA9IGZpbmRSZWdpc3RlclVzZU9wZXJhbmRJZHgoUmVnLCBpc0tpbGwsIFRSSSk7CisgICAgcmV0dXJuIChJZHggPT0gLTEpID8gbnVsbHB0ciA6ICZnZXRPcGVyYW5kKElkeCk7CisgIH0KKworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAqZmluZFJlZ2lzdGVyVXNlT3BlcmFuZCgKKyAgICB1bnNpZ25lZCBSZWcsIGJvb2wgaXNLaWxsID0gZmFsc2UsCisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBudWxscHRyKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TWFjaGluZUluc3RyICo+KHRoaXMpLT4KKyAgICAgIGZpbmRSZWdpc3RlclVzZU9wZXJhbmQoUmVnLCBpc0tpbGwsIFRSSSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgb3BlcmFuZCBpbmRleCB0aGF0IGlzIGEgZGVmIG9mIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgb3IKKyAgLy8vIC0xIGlmIGl0IGlzIG5vdCBmb3VuZC4gSWYgaXNEZWFkIGlzIHRydWUsIGRlZnMgdGhhdCBhcmUgbm90IGRlYWQgYXJlCisgIC8vLyBza2lwcGVkLiBJZiBPdmVybGFwIGlzIHRydWUsIHRoZW4gaXQgYWxzbyBsb29rcyBmb3IgZGVmcyB0aGF0IG1lcmVseQorICAvLy8gb3ZlcmxhcCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLiBJZiBUYXJnZXRSZWdpc3RlckluZm8gaXMgbm9uLW51bGwsCisgIC8vLyB0aGVuIGl0IGFsc28gY2hlY2tzIGlmIHRoZXJlIGlzIGEgZGVmIG9mIGEgc3VwZXItcmVnaXN0ZXIuCisgIC8vLyBUaGlzIG1heSBhbHNvIHJldHVybiBhIHJlZ2lzdGVyIG1hc2sgb3BlcmFuZCB3aGVuIE92ZXJsYXAgaXMgdHJ1ZS4KKyAgaW50IGZpbmRSZWdpc3RlckRlZk9wZXJhbmRJZHgodW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRGVhZCA9IGZhbHNlLCBib29sIE92ZXJsYXAgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gV3JhcHBlciBmb3IgZmluZFJlZ2lzdGVyRGVmT3BlcmFuZElkeCwgaXQgcmV0dXJucworICAvLy8gYSBwb2ludGVyIHRvIHRoZSBNYWNoaW5lT3BlcmFuZCByYXRoZXIgdGhhbiBhbiBpbmRleC4KKyAgTWFjaGluZU9wZXJhbmQgKmZpbmRSZWdpc3RlckRlZk9wZXJhbmQodW5zaWduZWQgUmVnLCBib29sIGlzRGVhZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSA9IG51bGxwdHIpIHsKKyAgICBpbnQgSWR4ID0gZmluZFJlZ2lzdGVyRGVmT3BlcmFuZElkeChSZWcsIGlzRGVhZCwgZmFsc2UsIFRSSSk7CisgICAgcmV0dXJuIChJZHggPT0gLTEpID8gbnVsbHB0ciA6ICZnZXRPcGVyYW5kKElkeCk7CisgIH0KKworICAvLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGZpcnN0IG9wZXJhbmQgaW4gdGhlCisgIC8vLyBvcGVyYW5kIGxpc3QgdGhhdCBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgcHJlZGljYXRlLiBJdCByZXR1cm5zIC0xIGlmCisgIC8vLyBub25lIGlzIGZvdW5kLgorICBpbnQgZmluZEZpcnN0UHJlZE9wZXJhbmRJZHgoKSBjb25zdDsKKworICAvLy8gRmluZCB0aGUgaW5kZXggb2YgdGhlIGZsYWcgd29yZCBvcGVyYW5kIHRoYXQKKyAgLy8vIGNvcnJlc3BvbmRzIHRvIG9wZXJhbmQgT3BJZHggb24gYW4gaW5saW5lIGFzbSBpbnN0cnVjdGlvbi4gIFJldHVybnMgLTEgaWYKKyAgLy8vIGdldE9wZXJhbmQoT3BJZHgpIGRvZXMgbm90IGJlbG9uZyB0byBhbiBpbmxpbmUgYXNtIG9wZXJhbmQgZ3JvdXAuCisgIC8vLworICAvLy8gSWYgR3JvdXBObyBpcyBub3QgTlVMTCwgaXQgd2lsbCByZWNlaXZlIHRoZSBudW1iZXIgb2YgdGhlIG9wZXJhbmQgZ3JvdXAKKyAgLy8vIGNvbnRhaW5pbmcgT3BJZHguCisgIC8vLworICAvLy8gVGhlIGZsYWcgb3BlcmFuZCBpcyBhbiBpbW1lZGlhdGUgdGhhdCBjYW4gYmUgZGVjb2RlZCB3aXRoIG1ldGhvZHMgbGlrZQorICAvLy8gSW5saW5lQXNtOjpoYXNSZWdDbGFzc0NvbnN0cmFpbnQoKS4KKyAgaW50IGZpbmRJbmxpbmVBc21GbGFnSWR4KHVuc2lnbmVkIE9wSWR4LCB1bnNpZ25lZCAqR3JvdXBObyA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBDb21wdXRlIHRoZSBzdGF0aWMgcmVnaXN0ZXIgY2xhc3MgY29uc3RyYWludCBmb3Igb3BlcmFuZCBPcElkeC4KKyAgLy8vIEZvciBub3JtYWwgaW5zdHJ1Y3Rpb25zLCB0aGlzIGlzIGRlcml2ZWQgZnJvbSB0aGUgTUNJbnN0ckRlc2MuCisgIC8vLyBGb3IgaW5saW5lIGFzc2VtYmx5IGl0IGlzIGRlcml2ZWQgZnJvbSB0aGUgZmxhZyB3b3Jkcy4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIE5VTEwgaWYgdGhlIHN0YXRpYyByZWdpc3RlciBjbGFzcyBjb25zdHJhaW50IGNhbm5vdCBiZQorICAvLy8gZGV0ZXJtaW5lZC4KKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyoKKyAgZ2V0UmVnQ2xhc3NDb25zdHJhaW50KHVuc2lnbmVkIE9wSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBBcHBsaWVzIHRoZSBjb25zdHJhaW50cyAoZGVmL3VzZSkgaW1wbGllZCBieSB0aGlzIE1JIG9uIFxwIFJlZyB0bworICAvLy8gdGhlIGdpdmVuIFxwIEN1clJDLgorICAvLy8gSWYgXHAgRXhwbG9yZUJ1bmRsZSBpcyBzZXQgYW5kIE1JIGlzIHBhcnQgb2YgYSBidW5kbGUsIGFsbCB0aGUKKyAgLy8vIGluc3RydWN0aW9ucyBpbnNpZGUgdGhlIGJ1bmRsZSB3aWxsIGJlIHRha2VuIGludG8gYWNjb3VudC4gSW4gb3RoZXIgd29yZHMsCisgIC8vLyB0aGlzIG1ldGhvZCBhY2N1bXVsYXRlcyBhbGwgdGhlIGNvbnN0cmFpbnRzIG9mIHRoZSBvcGVyYW5kIG9mIHRoaXMgTUkgYW5kCisgIC8vLyB0aGUgcmVsYXRlZCBidW5kbGUgaWYgTUkgaXMgYSBidW5kbGUgb3IgaW5zaWRlIGEgYnVuZGxlLgorICAvLy8KKyAgLy8vIFJldHVybnMgdGhlIHJlZ2lzdGVyIGNsYXNzIHRoYXQgc2F0aXNmaWVzIGJvdGggXHAgQ3VyUkMgYW5kIHRoZQorICAvLy8gY29uc3RyYWludHMgc2V0IGJ5IE1JLiBSZXR1cm5zIE5VTEwgaWYgc3VjaCBhIHJlZ2lzdGVyIGNsYXNzIGRvZXMgbm90CisgIC8vLyBleGlzdC4KKyAgLy8vCisgIC8vLyBccHJlIEN1clJDIG11c3Qgbm90IGJlIE5VTEwuCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKmdldFJlZ0NsYXNzQ29uc3RyYWludEVmZmVjdEZvclZSZWcoCisgICAgICB1bnNpZ25lZCBSZWcsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKkN1clJDLAorICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUksIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJLAorICAgICAgYm9vbCBFeHBsb3JlQnVuZGxlID0gZmFsc2UpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQXBwbGllcyB0aGUgY29uc3RyYWludHMgKGRlZi91c2UpIGltcGxpZWQgYnkgdGhlIFxwIE9wSWR4IG9wZXJhbmQKKyAgLy8vIHRvIHRoZSBnaXZlbiBccCBDdXJSQy4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIHRoZSByZWdpc3RlciBjbGFzcyB0aGF0IHNhdGlzZmllcyBib3RoIFxwIEN1clJDIGFuZCB0aGUKKyAgLy8vIGNvbnN0cmFpbnRzIHNldCBieSBccCBPcElkeCBNSS4gUmV0dXJucyBOVUxMIGlmIHN1Y2ggYSByZWdpc3RlciBjbGFzcworICAvLy8gZG9lcyBub3QgZXhpc3QuCisgIC8vLworICAvLy8gXHByZSBDdXJSQyBtdXN0IG5vdCBiZSBOVUxMLgorICAvLy8gXHByZSBUaGUgb3BlcmFuZCBhdCBccCBPcElkeCBtdXN0IGJlIGEgcmVnaXN0ZXIuCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKgorICBnZXRSZWdDbGFzc0NvbnN0cmFpbnRFZmZlY3QodW5zaWduZWQgT3BJZHgsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKkN1clJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7CisKKyAgLy8vIEFkZCBhIHRpZSBiZXR3ZWVuIHRoZSByZWdpc3RlciBvcGVyYW5kcyBhdCBEZWZJZHggYW5kIFVzZUlkeC4KKyAgLy8vIFRoZSB0aWUgd2lsbCBjYXVzZSB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9yIHRvIGVuc3VyZSB0aGF0IHRoZSB0d28KKyAgLy8vIG9wZXJhbmRzIGFyZSBhc3NpZ25lZCB0aGUgc2FtZSBwaHlzaWNhbCByZWdpc3Rlci4KKyAgLy8vCisgIC8vLyBUaWVkIG9wZXJhbmRzIGFyZSBtYW5hZ2VkIGF1dG9tYXRpY2FsbHkgZm9yIGV4cGxpY2l0IG9wZXJhbmRzIGluIHRoZQorICAvLy8gTUNJbnN0ckRlc2MuIFRoaXMgbWV0aG9kIGlzIGZvciBleGNlcHRpb25hbCBjYXNlcyBsaWtlIGlubGluZSBhc20uCisgIHZvaWQgdGllT3BlcmFuZHModW5zaWduZWQgRGVmSWR4LCB1bnNpZ25lZCBVc2VJZHgpOworCisgIC8vLyBHaXZlbiB0aGUgaW5kZXggb2YgYSB0aWVkIHJlZ2lzdGVyIG9wZXJhbmQsIGZpbmQgdGhlCisgIC8vLyBvcGVyYW5kIGl0IGlzIHRpZWQgdG8uIERlZnMgYXJlIHRpZWQgdG8gdXNlcyBhbmQgdmljZSB2ZXJzYS4gUmV0dXJucyB0aGUKKyAgLy8vIGluZGV4IG9mIHRoZSB0aWVkIG9wZXJhbmQgd2hpY2ggbXVzdCBleGlzdC4KKyAgdW5zaWduZWQgZmluZFRpZWRPcGVyYW5kSWR4KHVuc2lnbmVkIE9wSWR4KSBjb25zdDsKKworICAvLy8gR2l2ZW4gdGhlIGluZGV4IG9mIGEgcmVnaXN0ZXIgZGVmIG9wZXJhbmQsCisgIC8vLyBjaGVjayBpZiB0aGUgcmVnaXN0ZXIgZGVmIGlzIHRpZWQgdG8gYSBzb3VyY2Ugb3BlcmFuZCwgZHVlIHRvIGVpdGhlcgorICAvLy8gdHdvLWFkZHJlc3MgZWxpbWluYXRpb24gb3IgaW5saW5lIGFzc2VtYmx5IGNvbnN0cmFpbnRzLiBSZXR1cm5zIHRoZQorICAvLy8gZmlyc3QgdGllZCB1c2Ugb3BlcmFuZCBpbmRleCBieSByZWZlcmVuY2UgaWYgVXNlT3BJZHggaXMgbm90IG51bGwuCisgIGJvb2wgaXNSZWdUaWVkVG9Vc2VPcGVyYW5kKHVuc2lnbmVkIERlZk9wSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqVXNlT3BJZHggPSBudWxscHRyKSBjb25zdCB7CisgICAgY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PID0gZ2V0T3BlcmFuZChEZWZPcElkeCk7CisgICAgaWYgKCFNTy5pc1JlZygpIHx8ICFNTy5pc0RlZigpIHx8ICFNTy5pc1RpZWQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoVXNlT3BJZHgpCisgICAgICAqVXNlT3BJZHggPSBmaW5kVGllZE9wZXJhbmRJZHgoRGVmT3BJZHgpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB1c2Ugb3BlcmFuZCBvZiB0aGUgc3BlY2lmaWVkIGluZGV4IGlzIHRpZWQgdG8gYSBkZWYKKyAgLy8vIG9wZXJhbmQuIEl0IGFsc28gcmV0dXJucyB0aGUgZGVmIG9wZXJhbmQgaW5kZXggYnkgcmVmZXJlbmNlIGlmIERlZk9wSWR4CisgIC8vLyBpcyBub3QgbnVsbC4KKyAgYm9vbCBpc1JlZ1RpZWRUb0RlZk9wZXJhbmQodW5zaWduZWQgVXNlT3BJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICpEZWZPcElkeCA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmTU8gPSBnZXRPcGVyYW5kKFVzZU9wSWR4KTsKKyAgICBpZiAoIU1PLmlzUmVnKCkgfHwgIU1PLmlzVXNlKCkgfHwgIU1PLmlzVGllZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChEZWZPcElkeCkKKyAgICAgICpEZWZPcElkeCA9IGZpbmRUaWVkT3BlcmFuZElkeChVc2VPcElkeCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gQ2xlYXJzIGtpbGwgZmxhZ3Mgb24gYWxsIG9wZXJhbmRzLgorICB2b2lkIGNsZWFyS2lsbEluZm8oKTsKKworICAvLy8gUmVwbGFjZSBhbGwgb2NjdXJyZW5jZXMgb2YgRnJvbVJlZyB3aXRoIFRvUmVnOlN1YklkeCwKKyAgLy8vIHByb3Blcmx5IGNvbXBvc2luZyBzdWJyZWcgaW5kaWNlcyB3aGVyZSBuZWNlc3NhcnkuCisgIHZvaWQgc3Vic3RpdHV0ZVJlZ2lzdGVyKHVuc2lnbmVkIEZyb21SZWcsIHVuc2lnbmVkIFRvUmVnLCB1bnNpZ25lZCBTdWJJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmUmVnSW5mbyk7CisKKyAgLy8vIFdlIGhhdmUgZGV0ZXJtaW5lZCBNSSBraWxscyBhIHJlZ2lzdGVyLiBMb29rIGZvciB0aGUKKyAgLy8vIG9wZXJhbmQgdGhhdCB1c2VzIGl0IGFuZCBtYXJrIGl0IGFzIElzS2lsbC4gSWYgQWRkSWZOb3RGb3VuZCBpcyB0cnVlLAorICAvLy8gYWRkIGEgaW1wbGljaXQgb3BlcmFuZCBpZiBpdCdzIG5vdCBmb3VuZC4gUmV0dXJucyB0cnVlIGlmIHRoZSBvcGVyYW5kCisgIC8vLyBleGlzdHMgLyBpcyBhZGRlZC4KKyAgYm9vbCBhZGRSZWdpc3RlcktpbGxlZCh1bnNpZ25lZCBJbmNvbWluZ1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlJlZ0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBZGRJZk5vdEZvdW5kID0gZmFsc2UpOworCisgIC8vLyBDbGVhciBhbGwga2lsbCBmbGFncyBhZmZlY3RpbmcgUmVnLiAgSWYgUmVnSW5mbyBpcyBwcm92aWRlZCwgdGhpcyBpbmNsdWRlcworICAvLy8gYWxsIGFsaWFzaW5nIHJlZ2lzdGVycy4KKyAgdm9pZCBjbGVhclJlZ2lzdGVyS2lsbHModW5zaWduZWQgUmVnLCBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlJlZ0luZm8pOworCisgIC8vLyBXZSBoYXZlIGRldGVybWluZWQgTUkgZGVmaW5lZCBhIHJlZ2lzdGVyIHdpdGhvdXQgYSB1c2UuCisgIC8vLyBMb29rIGZvciB0aGUgb3BlcmFuZCB0aGF0IGRlZmluZXMgaXQgYW5kIG1hcmsgaXQgYXMgSXNEZWFkLiBJZgorICAvLy8gQWRkSWZOb3RGb3VuZCBpcyB0cnVlLCBhZGQgYSBpbXBsaWNpdCBvcGVyYW5kIGlmIGl0J3Mgbm90IGZvdW5kLiBSZXR1cm5zCisgIC8vLyB0cnVlIGlmIHRoZSBvcGVyYW5kIGV4aXN0cyAvIGlzIGFkZGVkLgorICBib29sIGFkZFJlZ2lzdGVyRGVhZCh1bnNpZ25lZCBSZWcsIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqUmVnSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBZGRJZk5vdEZvdW5kID0gZmFsc2UpOworCisgIC8vLyBDbGVhciBhbGwgZGVhZCBmbGFncyBvbiBvcGVyYW5kcyBkZWZpbmluZyByZWdpc3RlciBAcCBSZWcuCisgIHZvaWQgY2xlYXJSZWdpc3RlckRlYWRzKHVuc2lnbmVkIFJlZyk7CisKKyAgLy8vIE1hcmsgYWxsIHN1YnJlZ2lzdGVyIGRlZnMgb2YgcmVnaXN0ZXIgQHAgUmVnIHdpdGggdGhlIHVuZGVmIGZsYWcuCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiB3ZSBkZXRlcm1pbmVkIHRvIGhhdmUgYSBzdWJyZWdpc3RlciBkZWYgaW4gYW4KKyAgLy8vIG90aGVyd2lzZSB1bmRlZmluZWQgc3VwZXIgcmVnaXN0ZXIuCisgIHZvaWQgc2V0UmVnaXN0ZXJEZWZSZWFkVW5kZWYodW5zaWduZWQgUmVnLCBib29sIElzVW5kZWYgPSB0cnVlKTsKKworICAvLy8gV2UgaGF2ZSBkZXRlcm1pbmVkIE1JIGRlZmluZXMgYSByZWdpc3Rlci4gTWFrZSBzdXJlIHRoZXJlIGlzIGFuIG9wZXJhbmQKKyAgLy8vIGRlZmluaW5nIFJlZy4KKyAgdm9pZCBhZGRSZWdpc3RlckRlZmluZWQodW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlJlZ0luZm8gPSBudWxscHRyKTsKKworICAvLy8gTWFyayBldmVyeSBwaHlzcmVnIHVzZWQgYnkgdGhpcyBpbnN0cnVjdGlvbiBhcworICAvLy8gZGVhZCBleGNlcHQgdGhvc2UgaW4gdGhlIFVzZWRSZWdzIGxpc3QuCisgIC8vLworICAvLy8gT24gaW5zdHJ1Y3Rpb25zIHdpdGggcmVnaXN0ZXIgbWFzayBvcGVyYW5kcywgYWxzbyBhZGQgaW1wbGljaXQtZGVmCisgIC8vLyBvcGVyYW5kcyBmb3IgYWxsIHJlZ2lzdGVycyBpbiBVc2VkUmVncy4KKyAgdm9pZCBzZXRQaHlzUmVnc0RlYWRFeGNlcHQoQXJyYXlSZWY8dW5zaWduZWQ+IFVzZWRSZWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGl0IGlzIHNhZmUgdG8gbW92ZSB0aGlzIGluc3RydWN0aW9uLiBJZgorICAvLy8gU2F3U3RvcmUgaXMgc2V0IHRvIHRydWUsIGl0IG1lYW5zIHRoYXQgdGhlcmUgaXMgYSBzdG9yZSAob3IgY2FsbCkgYmV0d2VlbgorICAvLy8gdGhlIGluc3RydWN0aW9uJ3MgbG9jYXRpb24gYW5kIGl0cyBpbnRlbmRlZCBkZXN0aW5hdGlvbi4KKyAgYm9vbCBpc1NhZmVUb01vdmUoQWxpYXNBbmFseXNpcyAqQUEsIGJvb2wgJlNhd1N0b3JlKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24ncyBtZW1vcnkgYWNjZXNzIGFsaWFzZXMgdGhlIG1lbW9yeQorICAvLy8gYWNjZXNzIG9mIE90aGVyLgorICAvLworICAvLy8gQXNzdW1lcyBhbnkgcGh5c2ljYWwgcmVnaXN0ZXJzIHVzZWQgdG8gY29tcHV0ZSBhZGRyZXNzZXMKKyAgLy8vIGhhdmUgdGhlIHNhbWUgdmFsdWUgZm9yIGJvdGggaW5zdHJ1Y3Rpb25zLiAgUmV0dXJucyBmYWxzZSBpZiBuZWl0aGVyCisgIC8vLyBpbnN0cnVjdGlvbiB3cml0ZXMgdG8gbWVtb3J5LgorICAvLy8KKyAgLy8vIEBwYXJhbSBBQSBPcHRpb25hbCBhbGlhcyBhbmFseXNpcywgdXNlZCB0byBjb21wYXJlIG1lbW9yeSBvcGVyYW5kcy4KKyAgLy8vIEBwYXJhbSBPdGhlciBNYWNoaW5lSW5zdHIgdG8gY2hlY2sgYWxpYXNpbmcgYWdhaW5zdC4KKyAgLy8vIEBwYXJhbSBVc2VUQkFBIFdoZXRoZXIgdG8gcGFzcyBUQkFBIGluZm9ybWF0aW9uIHRvIGFsaWFzIGFuYWx5c2lzLgorICBib29sIG1heUFsaWFzKEFsaWFzQW5hbHlzaXMgKkFBLCBNYWNoaW5lSW5zdHIgJk90aGVyLCBib29sIFVzZVRCQUEpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIG1heSBoYXZlIGFuIG9yZGVyZWQKKyAgLy8vIG9yIHZvbGF0aWxlIG1lbW9yeSByZWZlcmVuY2UsIG9yIGlmIHRoZSBpbmZvcm1hdGlvbiBkZXNjcmliaW5nIHRoZSBtZW1vcnkKKyAgLy8vIHJlZmVyZW5jZSBpcyBub3QgYXZhaWxhYmxlLiBSZXR1cm4gZmFsc2UgaWYgaXQgaXMga25vd24gdG8gaGF2ZSBubworICAvLy8gb3JkZXJlZCBvciB2b2xhdGlsZSBtZW1vcnkgcmVmZXJlbmNlcy4KKyAgYm9vbCBoYXNPcmRlcmVkTWVtb3J5UmVmKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgbG9hZCBpbnN0cnVjdGlvbiBuZXZlciB0cmFwcyBhbmQgcG9pbnRzIHRvIGEgbWVtb3J5CisgIC8vLyBsb2NhdGlvbiB3aG9zZSB2YWx1ZSBkb2Vzbid0IGNoYW5nZSBkdXJpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIEV4YW1wbGVzIGluY2x1ZGUgbG9hZGluZyBhIHZhbHVlIGZyb20gdGhlIGNvbnN0YW50IHBvb2wgb3IgZnJvbSB0aGUKKyAgLy8vIGFyZ3VtZW50IGFyZWEgb2YgYSBmdW5jdGlvbiAoaWYgaXQgZG9lcyBub3QgY2hhbmdlKS4gIElmIHRoZSBpbnN0cnVjdGlvbgorICAvLy8gZG9lcyBtdWx0aXBsZSBsb2FkcywgdGhpcyByZXR1cm5zIHRydWUgb25seSBpZiBhbGwgb2YgdGhlIGxvYWRzIGFyZQorICAvLy8gZGVyZWZlcmVuY2VhYmxlIGFuZCBpbnZhcmlhbnQuCisgIGJvb2wgaXNEZXJlZmVyZW5jZWFibGVJbnZhcmlhbnRMb2FkKEFsaWFzQW5hbHlzaXMgKkFBKSBjb25zdDsKKworICAvLy8gSWYgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBpcyBhIFBISSB0aGF0IGFsd2F5cyBtZXJnZXMgdG9nZXRoZXIgdGhlCisgIC8vLyBzYW1lIHZpcnR1YWwgcmVnaXN0ZXIsIHJldHVybiB0aGUgcmVnaXN0ZXIsIG90aGVyd2lzZSByZXR1cm4gMC4KKyAgdW5zaWduZWQgaXNDb25zdGFudFZhbHVlUEhJKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaGFzIHNpZGUgZWZmZWN0cyB0aGF0IGFyZSBub3QgbW9kZWxlZAorICAvLy8gYnkgbWF5TG9hZCAvIG1heVN0b3JlLCBldGMuCisgIC8vLyBGb3IgYWxsIGluc3RydWN0aW9ucywgdGhlIHByb3BlcnR5IGlzIGVuY29kZWQgaW4gTUNJbnN0ckRlc2M6OkZsYWdzCisgIC8vLyAoc2VlIE1DSW5zdHJEZXNjOjpoYXNVbm1vZGVsZWRTaWRlRWZmZWN0cygpLiBUaGUgb25seSBleGNlcHRpb24gaXMKKyAgLy8vIElOTElORUFTTSBpbnN0cnVjdGlvbiwgaW4gd2hpY2ggY2FzZSB0aGUgc2lkZSBlZmZlY3QgcHJvcGVydHkgaXMgZW5jb2RlZAorICAvLy8gaW4gb25lIG9mIGl0cyBvcGVyYW5kcyAoc2VlIElubGluZUFzbTo6RXh0cmFfSGFzU2lkZUVmZmVjdCkuCisgIC8vLworICBib29sIGhhc1VubW9kZWxlZFNpZGVFZmZlY3RzKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBpdCBpcyBpbGxlZ2FsIHRvIGZvbGQgYSBsb2FkIGFjcm9zcyB0aGlzIGluc3RydWN0aW9uLgorICBib29sIGlzTG9hZEZvbGRCYXJyaWVyKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGFsbCB0aGUgZGVmcyBvZiB0aGlzIGluc3RydWN0aW9uIGFyZSBkZWFkLgorICBib29sIGFsbERlZnNBcmVEZWFkKCkgY29uc3Q7CisKKyAgLy8vIENvcHkgaW1wbGljaXQgcmVnaXN0ZXIgb3BlcmFuZHMgZnJvbSBzcGVjaWZpZWQKKyAgLy8vIGluc3RydWN0aW9uIHRvIHRoaXMgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgY29weUltcGxpY2l0T3BzKE1hY2hpbmVGdW5jdGlvbiAmTUYsIGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpOworCisgIC8vLyBEZWJ1Z2dpbmcgc3VwcG9ydAorICAvLy8gQHsKKyAgLy8vIERldGVybWluZSB0aGUgZ2VuZXJpYyB0eXBlIHRvIGJlIHByaW50ZWQgKGlmIG5lZWRlZCkgb24gdXNlcyBhbmQgZGVmcy4KKyAgTExUIGdldFR5cGVUb1ByaW50KHVuc2lnbmVkIE9wSWR4LCBTbWFsbEJpdFZlY3RvciAmUHJpbnRlZFR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgd2hlbiBhbiBpbnN0cnVjdGlvbiBoYXMgdGllZCByZWdpc3RlciB0aGF0IGNhbid0IGJlIGRldGVybWluZWQKKyAgLy8vIGJ5IHRoZSBpbnN0cnVjdGlvbidzIGRlc2NyaXB0b3IuIFRoaXMgaXMgdXNlZnVsIGZvciBNSVIgcHJpbnRpbmcsIHRvCisgIC8vLyBkZXRlcm1pbmUgd2hldGhlciB3ZSBuZWVkIHRvIHByaW50IHRoZSB0aWVzIG9yIG5vdC4KKyAgYm9vbCBoYXNDb21wbGV4UmVnaXN0ZXJUaWVzKCkgY29uc3Q7CisKKyAgLy8vIFByaW50IHRoaXMgTUkgdG8gXHAgT1MuCisgIC8vLyBEb24ndCBwcmludCBpbmZvcm1hdGlvbiB0aGF0IGNhbiBiZSBpbmZlcnJlZCBmcm9tIG90aGVyIGluc3RydWN0aW9ucyBpZgorICAvLy8gXHAgSXNTdGFuZGFsb25lIGlzIGZhbHNlLiBJdCBpcyB1c3VhbGx5IHRydWUgd2hlbiBvbmx5IGEgZnJhZ21lbnQgb2YgdGhlCisgIC8vLyBmdW5jdGlvbiBpcyBwcmludGVkLgorICAvLy8gT25seSBwcmludCB0aGUgZGVmcyBhbmQgdGhlIG9wY29kZSBpZiBccCBTa2lwT3BlcnMgaXMgdHJ1ZS4KKyAgLy8vIE90aGVyd2lzZSwgYWxzbyBwcmludCBvcGVyYW5kcyBpZiBccCBTa2lwRGVidWdMb2MgaXMgdHJ1ZS4KKyAgLy8vIE90aGVyd2lzZSwgYWxzbyBwcmludCB0aGUgZGVidWcgbG9jLCB3aXRoIGEgdGVybWluYXRpbmcgbmV3bGluZS4KKyAgLy8vIFxwIFRJSSBpcyB1c2VkIHRvIHByaW50IHRoZSBvcGNvZGUgbmFtZS4gIElmIGl0J3Mgbm90IHByZXNlbnQsIGJ1dCB0aGUKKyAgLy8vIE1JIGlzIGluIGEgZnVuY3Rpb24sIHRoZSBvcGNvZGUgd2lsbCBiZSBwcmludGVkIHVzaW5nIHRoZSBmdW5jdGlvbidzIFRJSS4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGJvb2wgSXNTdGFuZGFsb25lID0gdHJ1ZSwgYm9vbCBTa2lwT3BlcnMgPSBmYWxzZSwKKyAgICAgICAgICAgICBib29sIFNraXBEZWJ1Z0xvYyA9IGZhbHNlLAorICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBNb2R1bGVTbG90VHJhY2tlciAmTVNULCBib29sIElzU3RhbmRhbG9uZSA9IHRydWUsCisgICAgICAgICAgICAgYm9vbCBTa2lwT3BlcnMgPSBmYWxzZSwgYm9vbCBTa2lwRGVidWdMb2MgPSBmYWxzZSwKKyAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgLy8vIEB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEFjY2Vzc29ycyB1c2VkIHRvIGJ1aWxkIHVwIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLgorCisgIC8vLyBBZGQgdGhlIHNwZWNpZmllZCBvcGVyYW5kIHRvIHRoZSBpbnN0cnVjdGlvbi4gIElmIGl0IGlzIGFuIGltcGxpY2l0CisgIC8vLyBvcGVyYW5kLCBpdCBpcyBhZGRlZCB0byB0aGUgZW5kIG9mIHRoZSBvcGVyYW5kIGxpc3QuICBJZiBpdCBpcyBhbgorICAvLy8gZXhwbGljaXQgb3BlcmFuZCBpdCBpcyBhZGRlZCBhdCB0aGUgZW5kIG9mIHRoZSBleHBsaWNpdCBvcGVyYW5kIGxpc3QKKyAgLy8vIChiZWZvcmUgdGhlIGZpcnN0IGltcGxpY2l0IG9wZXJhbmQpLgorICAvLy8KKyAgLy8vIE1GIG11c3QgYmUgdGhlIG1hY2hpbmUgZnVuY3Rpb24gdGhhdCB3YXMgdXNlZCB0byBhbGxvY2F0ZSB0aGlzCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBNYWNoaW5lSW5zdHJCdWlsZGVyIHByb3ZpZGVzIGEgbW9yZSBjb252ZW5pZW50IGludGVyZmFjZSBmb3IgY3JlYXRpbmcKKyAgLy8vIGluc3RydWN0aW9ucyBhbmQgYWRkaW5nIG9wZXJhbmRzLgorICB2b2lkIGFkZE9wZXJhbmQoTWFjaGluZUZ1bmN0aW9uICZNRiwgY29uc3QgTWFjaGluZU9wZXJhbmQgJk9wKTsKKworICAvLy8gQWRkIGFuIG9wZXJhbmQgd2l0aG91dCBwcm92aWRpbmcgYW4gTUYgcmVmZXJlbmNlLiBUaGlzIG9ubHkgd29ya3MgZm9yCisgIC8vLyBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgaW5zZXJ0ZWQgaW4gYSBiYXNpYyBibG9jay4KKyAgLy8vCisgIC8vLyBNYWNoaW5lSW5zdHJCdWlsZGVyIGFuZCB0aGUgdHdvLWFyZ3VtZW50IGFkZE9wZXJhbmQoTUYsIE1PKSBzaG91bGQgYmUKKyAgLy8vIHByZWZlcnJlZC4KKyAgdm9pZCBhZGRPcGVyYW5kKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZPcCk7CisKKyAgLy8vIFJlcGxhY2UgdGhlIGluc3RydWN0aW9uIGRlc2NyaXB0b3IgKHRodXMgb3Bjb2RlKSBvZgorICAvLy8gdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gd2l0aCBhIG5ldyBvbmUuCisgIHZvaWQgc2V0RGVzYyhjb25zdCBNQ0luc3RyRGVzYyAmdGlkKSB7IE1DSUQgPSAmdGlkOyB9CisKKyAgLy8vIFJlcGxhY2UgY3VycmVudCBzb3VyY2UgaW5mb3JtYXRpb24gd2l0aCBuZXcgc3VjaC4KKyAgLy8vIEF2b2lkIHVzaW5nIHRoaXMsIHRoZSBjb25zdHJ1Y3RvciBhcmd1bWVudCBpcyBwcmVmZXJhYmxlLgorICB2b2lkIHNldERlYnVnTG9jKERlYnVnTG9jIGRsKSB7CisgICAgZGVidWdMb2MgPSBzdGQ6Om1vdmUoZGwpOworICAgIGFzc2VydChkZWJ1Z0xvYy5oYXNUcml2aWFsRGVzdHJ1Y3RvcigpICYmICJFeHBlY3RlZCB0cml2aWFsIGRlc3RydWN0b3IiKTsKKyAgfQorCisgIC8vLyBFcmFzZSBhbiBvcGVyYW5kIGZyb20gYW4gaW5zdHJ1Y3Rpb24sIGxlYXZpbmcgaXQgd2l0aCBvbmUKKyAgLy8vIGZld2VyIG9wZXJhbmQgdGhhbiBpdCBzdGFydGVkIHdpdGguCisgIHZvaWQgUmVtb3ZlT3BlcmFuZCh1bnNpZ25lZCBpKTsKKworICAvLy8gQWRkIGEgTWFjaGluZU1lbU9wZXJhbmQgdG8gdGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb24uCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSB1c2VkIG9ubHkgb2NjYXNpb25hbGx5LiBUaGUgc2V0TWVtUmVmcyBmdW5jdGlvbgorICAvLy8gaXMgdGhlIHByaW1hcnkgbWV0aG9kIGZvciBzZXR0aW5nIHVwIGEgTWFjaGluZUluc3RyJ3MgTWVtUmVmcyBsaXN0LgorICB2b2lkIGFkZE1lbU9wZXJhbmQoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZU1lbU9wZXJhbmQgKk1PKTsKKworICAvLy8gQXNzaWduIHRoaXMgTWFjaGluZUluc3RyJ3MgbWVtb3J5IHJlZmVyZW5jZSBkZXNjcmlwdG9yIGxpc3QuCisgIC8vLyBUaGlzIGRvZXMgbm90IHRyYW5zZmVyIG93bmVyc2hpcC4KKyAgdm9pZCBzZXRNZW1SZWZzKG1tb19pdGVyYXRvciBOZXdNZW1SZWZzLCBtbW9faXRlcmF0b3IgTmV3TWVtUmVmc0VuZCkgeworICAgIHNldE1lbVJlZnMoc3RkOjptYWtlX3BhaXIoTmV3TWVtUmVmcywgTmV3TWVtUmVmc0VuZC1OZXdNZW1SZWZzKSk7CisgIH0KKworICAvLy8gQXNzaWduIHRoaXMgTWFjaGluZUluc3RyJ3MgbWVtb3J5IHJlZmVyZW5jZSBkZXNjcmlwdG9yIGxpc3QuICBGaXJzdAorICAvLy8gZWxlbWVudCBpbiB0aGUgcGFpciBpcyB0aGUgYmVnaW4gaXRlcmF0b3IvcG9pbnRlciB0byB0aGUgYXJyYXk7IHRoZQorICAvLy8gc2Vjb25kIGlzIHRoZSBudW1iZXIgb2YgTWVtb3J5T3BlcmFuZHMuICBUaGlzIGRvZXMgbm90IHRyYW5zZmVyIG93bmVyc2hpcAorICAvLy8gb2YgdGhlIHVuZGVybHlpbmcgbWVtb3J5LgorICB2b2lkIHNldE1lbVJlZnMoc3RkOjpwYWlyPG1tb19pdGVyYXRvciwgdW5zaWduZWQ+IE5ld01lbVJlZnMpIHsKKyAgICBNZW1SZWZzID0gTmV3TWVtUmVmcy5maXJzdDsKKyAgICBOdW1NZW1SZWZzID0gdWludDhfdChOZXdNZW1SZWZzLnNlY29uZCk7CisgICAgYXNzZXJ0KE51bU1lbVJlZnMgPT0gTmV3TWVtUmVmcy5zZWNvbmQgJiYKKyAgICAgICAgICAgIlRvbyBtYW55IG1lbXJlZnMgLSBtdXN0IGRyb3AgbWVtb3J5IG9wZXJhbmRzIik7CisgIH0KKworICAvLy8gUmV0dXJuIGEgc2V0IG9mIG1lbXJlZnMgKGJlZ2luIGl0ZXJhdG9yLCBzaXplKSB3aGljaCBjb25zZXJ2YXRpdmVseQorICAvLy8gZGVzY3JpYmUgdGhlIG1lbW9yeSBiZWhhdmlvciBvZiBib3RoIE1hY2hpbmVJbnN0cnMuICBUaGlzIGlzIGFwcHJvcHJpYXRlCisgIC8vLyBmb3IgdXNlIHdoZW4gbWVyZ2luZyB0d28gTWFjaGluZUluc3RycyBpbnRvIG9uZS4gVGhpcyByb3V0aW5lIGRvZXMgbm90CisgIC8vLyBtb2RpZnkgdGhlIG1lbXJlZnMgb2YgdGhlIHRoaXMgTWFjaGluZUluc3RyLgorICBzdGQ6OnBhaXI8bW1vX2l0ZXJhdG9yLCB1bnNpZ25lZD4gbWVyZ2VNZW1SZWZzV2l0aChjb25zdCBNYWNoaW5lSW5zdHImIE90aGVyKTsKKworICAvLy8gUmV0dXJuIHRoZSBNSUZsYWdzIHdoaWNoIHJlcHJlc2VudCBib3RoIE1hY2hpbmVJbnN0cnMuIFRoaXMKKyAgLy8vIHNob3VsZCBiZSB1c2VkIHdoZW4gbWVyZ2luZyB0d28gTWFjaGluZUluc3RycyBpbnRvIG9uZS4gVGhpcyByb3V0aW5lIGRvZXMKKyAgLy8vIG5vdCBtb2RpZnkgdGhlIE1JRmxhZ3Mgb2YgdGhpcyBNYWNoaW5lSW5zdHIuCisgIHVpbnQ4X3QgbWVyZ2VGbGFnc1dpdGgoY29uc3QgTWFjaGluZUluc3RyJiBPdGhlcikgY29uc3Q7CisKKyAgLy8vIENsZWFyIHRoaXMgTWFjaGluZUluc3RyJ3MgbWVtb3J5IHJlZmVyZW5jZSBkZXNjcmlwdG9yIGxpc3QuICBUaGlzIHJlc2V0cworICAvLy8gdGhlIG1lbXJlZnMgdG8gdGhlaXIgbW9zdCBjb25zZXJ2YXRpdmUgc3RhdGUuICBUaGlzIHNob3VsZCBiZSB1c2VkIG9ubHkKKyAgLy8vIGFzIGEgbGFzdCByZXNvcnQgc2luY2UgaXQgZ3JlYXRseSBwZXNzaW1pemVzIG91ciBrbm93bGVkZ2Ugb2YgdGhlIG1lbW9yeQorICAvLy8gYWNjZXNzIHBlcmZvcm1lZCBieSB0aGUgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgZHJvcE1lbVJlZnMoKSB7CisgICAgTWVtUmVmcyA9IG51bGxwdHI7CisgICAgTnVtTWVtUmVmcyA9IDA7CisgIH0KKworICAvLy8gQnJlYWsgYW55IHRpZSBpbnZvbHZpbmcgT3BJZHguCisgIHZvaWQgdW50aWVSZWdPcGVyYW5kKHVuc2lnbmVkIE9wSWR4KSB7CisgICAgTWFjaGluZU9wZXJhbmQgJk1PID0gZ2V0T3BlcmFuZChPcElkeCk7CisgICAgaWYgKE1PLmlzUmVnKCkgJiYgTU8uaXNUaWVkKCkpIHsKKyAgICAgIGdldE9wZXJhbmQoZmluZFRpZWRPcGVyYW5kSWR4KE9wSWR4KSkuVGllZFRvID0gMDsKKyAgICAgIE1PLlRpZWRUbyA9IDA7CisgICAgfQorICB9CisKKyAgLy8vIEFkZCBhbGwgaW1wbGljaXQgZGVmIGFuZCB1c2Ugb3BlcmFuZHMgdG8gdGhpcyBpbnN0cnVjdGlvbi4KKyAgdm9pZCBhZGRJbXBsaWNpdERlZlVzZU9wZXJhbmRzKE1hY2hpbmVGdW5jdGlvbiAmTUYpOworCitwcml2YXRlOgorICAvLy8gSWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBlbWJlZGRlZCBpbnRvIGEgTWFjaGluZUZ1bmN0aW9uLCByZXR1cm4gdGhlCisgIC8vLyBNYWNoaW5lUmVnaXN0ZXJJbmZvIG9iamVjdCBmb3IgdGhlIGN1cnJlbnQgZnVuY3Rpb24sIG90aGVyd2lzZQorICAvLy8gcmV0dXJuIG51bGwuCisgIE1hY2hpbmVSZWdpc3RlckluZm8gKmdldFJlZ0luZm8oKTsKKworICAvLy8gVW5saW5rIGFsbCBvZiB0aGUgcmVnaXN0ZXIgb3BlcmFuZHMgaW4gdGhpcyBpbnN0cnVjdGlvbiBmcm9tIHRoZWlyCisgIC8vLyByZXNwZWN0aXZlIHVzZSBsaXN0cy4gIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgb3BlcmFuZHMgYWxyZWFkeSBiZSBvbiB0aGVpcgorICAvLy8gdXNlIGxpc3RzLgorICB2b2lkIFJlbW92ZVJlZ09wZXJhbmRzRnJvbVVzZUxpc3RzKE1hY2hpbmVSZWdpc3RlckluZm8mKTsKKworICAvLy8gQWRkIGFsbCBvZiB0aGUgcmVnaXN0ZXIgb3BlcmFuZHMgaW4gdGhpcyBpbnN0cnVjdGlvbiBmcm9tIHRoZWlyCisgIC8vLyByZXNwZWN0aXZlIHVzZSBsaXN0cy4gIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUgb3BlcmFuZHMgbm90IGJlIG9uIHRoZWlyCisgIC8vLyB1c2UgbGlzdHMgeWV0LgorICB2b2lkIEFkZFJlZ09wZXJhbmRzVG9Vc2VMaXN0cyhNYWNoaW5lUmVnaXN0ZXJJbmZvJik7CisKKyAgLy8vIFNsb3cgcGF0aCBmb3IgaGFzUHJvcGVydHkgd2hlbiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBidW5kbGUuCisgIGJvb2wgaGFzUHJvcGVydHlJbkJ1bmRsZSh1bnNpZ25lZCBNYXNrLCBRdWVyeVR5cGUgVHlwZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJbXBsZW1lbnRzIHRoZSBsb2dpYyBvZiBnZXRSZWdDbGFzc0NvbnN0cmFpbnRFZmZlY3RGb3JWUmVnIGZvciB0aGUKKyAgLy8vIHRoaXMgTUkgYW5kIHRoZSBnaXZlbiBvcGVyYW5kIGluZGV4IFxwIE9wSWR4LgorICAvLy8gSWYgdGhlIHJlbGF0ZWQgb3BlcmFuZCBkb2VzIG5vdCBjb25zdHJhaW5lZCBSZWcsIHRoaXMgcmV0dXJucyBDdXJSQy4KKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqZ2V0UmVnQ2xhc3NDb25zdHJhaW50RWZmZWN0Rm9yVlJlZ0ltcGwoCisgICAgICB1bnNpZ25lZCBPcElkeCwgdW5zaWduZWQgUmVnLCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpDdXJSQywKKyAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJLCBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7Cit9OworCisvLy8gU3BlY2lhbCBEZW5zZU1hcEluZm8gdHJhaXRzIHRvIGNvbXBhcmUgTWFjaGluZUluc3RyKiBieSAqdmFsdWUqIG9mIHRoZQorLy8vIGluc3RydWN0aW9uIHJhdGhlciB0aGFuIGJ5IHBvaW50ZXIgdmFsdWUuCisvLy8gVGhlIGhhc2hpbmcgYW5kIGVxdWFsaXR5IHRlc3RpbmcgZnVuY3Rpb25zIGlnbm9yZSBkZWZpbml0aW9ucyBzbyB0aGlzIGlzCisvLy8gdXNlZnVsIGZvciBDU0UsIGV0Yy4KK3N0cnVjdCBNYWNoaW5lSW5zdHJFeHByZXNzaW9uVHJhaXQgOiBEZW5zZU1hcEluZm88TWFjaGluZUluc3RyKj4geworICBzdGF0aWMgaW5saW5lIE1hY2hpbmVJbnN0ciAqZ2V0RW1wdHlLZXkoKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBzdGF0aWMgaW5saW5lIE1hY2hpbmVJbnN0ciAqZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PE1hY2hpbmVJbnN0cio+KC0xKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgTWFjaGluZUluc3RyKiBjb25zdCAmTUkpOworCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgTWFjaGluZUluc3RyKiBjb25zdCAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciogY29uc3QgJlJIUykgeworICAgIGlmIChSSFMgPT0gZ2V0RW1wdHlLZXkoKSB8fCBSSFMgPT0gZ2V0VG9tYnN0b25lS2V5KCkgfHwKKyAgICAgICAgTEhTID09IGdldEVtcHR5S2V5KCkgfHwgTEhTID09IGdldFRvbWJzdG9uZUtleSgpKQorICAgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgICAgcmV0dXJuIExIUy0+aXNJZGVudGljYWxUbygqUkhTLCBNYWNoaW5lSW5zdHI6Oklnbm9yZVZSZWdEZWZzKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIERlYnVnZ2luZyBTdXBwb3J0CisKK2lubGluZSByYXdfb3N0cmVhbSYgb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIHsKKyAgTUkucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTUFDSElORUlOU1RSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkZjg5YjEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVpbGRlci5oCkBAIC0wLDAgKzEsNTYwIEBACisvLz09PS0gQ29kZUdlbi9NYWNoaW5lSW5zdHJCdWlsZGVyLmggLSBTaW1wbGlmeSBjcmVhdGlvbiBvZiBNSXMgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZXhwb3NlcyBhIGZ1bmN0aW9uIG5hbWVkIEJ1aWxkTUksIHdoaWNoIGlzIHVzZWZ1bCBmb3IgZHJhbWF0aWNhbGx5CisvLyBzaW1wbGlmeWluZyBob3cgTWFjaGluZUluc3RyJ3MgYXJlIGNyZWF0ZWQuICBJdCBhbGxvd3MgdXNlIG9mIGNvZGUgbGlrZSB0aGlzOgorLy8KKy8vICAgTSA9IEJ1aWxkTUkoTUJCLCBNSSwgREwsIFRJSS5nZXQoWDg2OjpBREQ4cnIpLCBEc3QpCisvLyAgICAgICAgICAgLmFkZFJlZyhhcmdWYWwxKQorLy8gICAgICAgICAgIC5hZGRSZWcoYXJnVmFsMik7CisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORUlOU1RSQlVJTERFUl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FSU5TVFJCVUlMREVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0dsb2JhbElTZWwvVXRpbHMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU9wZXJhbmQuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0clR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0luc3RyRGVzYzsKK2NsYXNzIE1ETm9kZTsKKworbmFtZXNwYWNlIFJlZ1N0YXRlIHsKKworICBlbnVtIHsKKyAgICBEZWZpbmUgICAgICAgICA9IDB4MiwKKyAgICBJbXBsaWNpdCAgICAgICA9IDB4NCwKKyAgICBLaWxsICAgICAgICAgICA9IDB4OCwKKyAgICBEZWFkICAgICAgICAgICA9IDB4MTAsCisgICAgVW5kZWYgICAgICAgICAgPSAweDIwLAorICAgIEVhcmx5Q2xvYmJlciAgID0gMHg0MCwKKyAgICBEZWJ1ZyAgICAgICAgICA9IDB4ODAsCisgICAgSW50ZXJuYWxSZWFkICAgPSAweDEwMCwKKyAgICBSZW5hbWFibGUgICAgICA9IDB4MjAwLAorICAgIERlZmluZU5vUmVhZCAgID0gRGVmaW5lIHwgVW5kZWYsCisgICAgSW1wbGljaXREZWZpbmUgPSBJbXBsaWNpdCB8IERlZmluZSwKKyAgICBJbXBsaWNpdEtpbGwgICA9IEltcGxpY2l0IHwgS2lsbAorICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgUmVnU3RhdGUKKworY2xhc3MgTWFjaGluZUluc3RyQnVpbGRlciB7CisgIE1hY2hpbmVGdW5jdGlvbiAqTUYgPSBudWxscHRyOworICBNYWNoaW5lSW5zdHIgKk1JID0gbnVsbHB0cjsKKworcHVibGljOgorICBNYWNoaW5lSW5zdHJCdWlsZGVyKCkgPSBkZWZhdWx0OworCisgIC8vLyBDcmVhdGUgYSBNYWNoaW5lSW5zdHJCdWlsZGVyIGZvciBtYW5pcHVsYXRpbmcgYW4gZXhpc3RpbmcgaW5zdHJ1Y3Rpb24uCisgIC8vLyBGIG11c3QgYmUgdGhlIG1hY2hpbmUgZnVuY3Rpb24gdGhhdCB3YXMgdXNlZCB0byBhbGxvY2F0ZSBJLgorICBNYWNoaW5lSW5zdHJCdWlsZGVyKE1hY2hpbmVGdW5jdGlvbiAmRiwgTWFjaGluZUluc3RyICpJKSA6IE1GKCZGKSwgTUkoSSkge30KKyAgTWFjaGluZUluc3RyQnVpbGRlcihNYWNoaW5lRnVuY3Rpb24gJkYsIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJKQorICAgICAgOiBNRigmRiksIE1JKCYqSSkge30KKworICAvLy8gQWxsb3cgYXV0b21hdGljIGNvbnZlcnNpb24gdG8gdGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gd2UgYXJlIHdvcmtpbmcgb24uCisgIG9wZXJhdG9yIE1hY2hpbmVJbnN0ciooKSBjb25zdCB7IHJldHVybiBNSTsgfQorICBNYWNoaW5lSW5zdHIgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBNSTsgfQorICBvcGVyYXRvciBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IoKSBjb25zdCB7IHJldHVybiBNSTsgfQorCisgIC8vLyBJZiBjb252ZXJzaW9uIG9wZXJhdG9ycyBmYWlsLCB1c2UgdGhpcyBtZXRob2QgdG8gZ2V0IHRoZSBNYWNoaW5lSW5zdHIKKyAgLy8vIGV4cGxpY2l0bHkuCisgIE1hY2hpbmVJbnN0ciAqZ2V0SW5zdHIoKSBjb25zdCB7IHJldHVybiBNSTsgfQorCisgIC8vLyBBZGQgYSBuZXcgdmlydHVhbCByZWdpc3RlciBvcGVyYW5kLgorICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZhZGRSZWcodW5zaWduZWQgUmVnTm8sIHVuc2lnbmVkIGZsYWdzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFN1YlJlZyA9IDApIGNvbnN0IHsKKyAgICBhc3NlcnQoKGZsYWdzICYgMHgxKSA9PSAwICYmCisgICAgICAgICAgICJQYXNzaW5nIGluICd0cnVlJyB0byBhZGRSZWcgaXMgZm9yYmlkZGVuISBVc2UgZW51bXMgaW5zdGVhZC4iKTsKKyAgICBNSS0+YWRkT3BlcmFuZCgqTUYsIE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVSZWcoUmVnTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgUmVnU3RhdGU6OkRlZmluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiBSZWdTdGF0ZTo6SW1wbGljaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgUmVnU3RhdGU6OktpbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgUmVnU3RhdGU6OkRlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgUmVnU3RhdGU6OlVuZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFncyAmIFJlZ1N0YXRlOjpFYXJseUNsb2JiZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1YlJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiBSZWdTdGF0ZTo6RGVidWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzICYgUmVnU3RhdGU6OkludGVybmFsUmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3MgJiBSZWdTdGF0ZTo6UmVuYW1hYmxlKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIEFkZCBhIHZpcnR1YWwgcmVnaXN0ZXIgZGVmaW5pdGlvbiBvcGVyYW5kLgorICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZhZGREZWYodW5zaWduZWQgUmVnTm8sIHVuc2lnbmVkIEZsYWdzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFN1YlJlZyA9IDApIGNvbnN0IHsKKyAgICByZXR1cm4gYWRkUmVnKFJlZ05vLCBGbGFncyB8IFJlZ1N0YXRlOjpEZWZpbmUsIFN1YlJlZyk7CisgIH0KKworICAvLy8gQWRkIGEgdmlydHVhbCByZWdpc3RlciB1c2Ugb3BlcmFuZC4gSXQgaXMgYW4gZXJyb3IgZm9yIEZsYWdzIHRvIGNvbnRhaW4KKyAgLy8vIGBSZWdTdGF0ZTo6RGVmaW5lYCB3aGVuIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4KKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkVXNlKHVuc2lnbmVkIFJlZ05vLCB1bnNpZ25lZCBGbGFncyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTdWJSZWcgPSAwKSBjb25zdCB7CisgICAgYXNzZXJ0KCEoRmxhZ3MgJiBSZWdTdGF0ZTo6RGVmaW5lKSAmJgorICAgICAgICAgICAiTWlzbGVhZGluZyBhZGRVc2UgZGVmaW5lcyByZWdpc3RlciwgdXNlIGFkZFJlZyBpbnN0ZWFkLiIpOworICAgIHJldHVybiBhZGRSZWcoUmVnTm8sIEZsYWdzLCBTdWJSZWcpOworICB9CisKKyAgLy8vIEFkZCBhIG5ldyBpbW1lZGlhdGUgb3BlcmFuZC4KKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkSW1tKGludDY0X3QgVmFsKSBjb25zdCB7CisgICAgTUktPmFkZE9wZXJhbmQoKk1GLCBNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlSW1tKFZhbCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZENJbW0oY29uc3QgQ29uc3RhbnRJbnQgKlZhbCkgY29uc3QgeworICAgIE1JLT5hZGRPcGVyYW5kKCpNRiwgTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUNJbW0oVmFsKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkRlBJbW0oY29uc3QgQ29uc3RhbnRGUCAqVmFsKSBjb25zdCB7CisgICAgTUktPmFkZE9wZXJhbmQoKk1GLCBNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlRlBJbW0oVmFsKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkTUJCKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgY29uc3QgeworICAgIE1JLT5hZGRPcGVyYW5kKCpNRiwgTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZU1CQihNQkIsIFRhcmdldEZsYWdzKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkRnJhbWVJbmRleChpbnQgSWR4KSBjb25zdCB7CisgICAgTUktPmFkZE9wZXJhbmQoKk1GLCBNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlRkkoSWR4KSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkQ29uc3RhbnRQb29sSW5kZXgodW5zaWduZWQgSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgT2Zmc2V0ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKSBjb25zdCB7CisgICAgTUktPmFkZE9wZXJhbmQoKk1GLCBNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlQ1BJKElkeCwgT2Zmc2V0LCBUYXJnZXRGbGFncykpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZFRhcmdldEluZGV4KHVuc2lnbmVkIElkeCwgaW50NjRfdCBPZmZzZXQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApIGNvbnN0IHsKKyAgICBNSS0+YWRkT3BlcmFuZCgqTUYsIE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVUYXJnZXRJbmRleChJZHgsIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRGbGFncykpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZEp1bXBUYWJsZUluZGV4KHVuc2lnbmVkIElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKSBjb25zdCB7CisgICAgTUktPmFkZE9wZXJhbmQoKk1GLCBNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlSlRJKElkeCwgVGFyZ2V0RmxhZ3MpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZhZGRHbG9iYWxBZGRyZXNzKGNvbnN0IEdsb2JhbFZhbHVlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IE9mZnNldCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgY29uc3QgeworICAgIE1JLT5hZGRPcGVyYW5kKCpNRiwgTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUdBKEdWLCBPZmZzZXQsIFRhcmdldEZsYWdzKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkRXh0ZXJuYWxTeW1ib2woY29uc3QgY2hhciAqRm5OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApIGNvbnN0IHsKKyAgICBNSS0+YWRkT3BlcmFuZCgqTUYsIE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVFUyhGbk5hbWUsIFRhcmdldEZsYWdzKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkQmxvY2tBZGRyZXNzKGNvbnN0IEJsb2NrQWRkcmVzcyAqQkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IE9mZnNldCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgY29uc3QgeworICAgIE1JLT5hZGRPcGVyYW5kKCpNRiwgTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUJBKEJBLCBPZmZzZXQsIFRhcmdldEZsYWdzKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkUmVnTWFzayhjb25zdCB1aW50MzJfdCAqTWFzaykgY29uc3QgeworICAgIE1JLT5hZGRPcGVyYW5kKCpNRiwgTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZVJlZ01hc2soTWFzaykpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZE1lbU9wZXJhbmQoTWFjaGluZU1lbU9wZXJhbmQgKk1NTykgY29uc3QgeworICAgIE1JLT5hZGRNZW1PcGVyYW5kKCpNRiwgTU1PKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZzZXRNZW1SZWZzKE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyOjptbW9faXRlcmF0b3IgZSkgY29uc3QgeworICAgIE1JLT5zZXRNZW1SZWZzKGIsIGUpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJnNldE1lbVJlZnMoc3RkOjpwYWlyPE1hY2hpbmVJbnN0cjo6bW1vX2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkPiBNZW1PcGVyYW5kc1JlZikgY29uc3QgeworICAgIE1JLT5zZXRNZW1SZWZzKE1lbU9wZXJhbmRzUmVmKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZhZGQoY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PKSBjb25zdCB7CisgICAgTUktPmFkZE9wZXJhbmQoKk1GLCBNTyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkKEFycmF5UmVmPE1hY2hpbmVPcGVyYW5kPiBNT3MpIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyA6IE1PcykgeworICAgICAgTUktPmFkZE9wZXJhbmQoKk1GLCBNTyk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZE1ldGFkYXRhKGNvbnN0IE1ETm9kZSAqTUQpIGNvbnN0IHsKKyAgICBNSS0+YWRkT3BlcmFuZCgqTUYsIE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVNZXRhZGF0YShNRCkpOworICAgIGFzc2VydCgoTUktPmlzRGVidWdWYWx1ZSgpID8gc3RhdGljX2Nhc3Q8Ym9vbD4oTUktPmdldERlYnVnVmFyaWFibGUoKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHRydWUpICYmCisgICAgICAgICAgICJmaXJzdCBNRE5vZGUgYXJndW1lbnQgb2YgYSBEQkdfVkFMVUUgbm90IGEgdmFyaWFibGUiKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZhZGRDRklJbmRleCh1bnNpZ25lZCBDRklJbmRleCkgY29uc3QgeworICAgIE1JLT5hZGRPcGVyYW5kKCpNRiwgTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUNGSUluZGV4KENGSUluZGV4KSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkSW50cmluc2ljSUQoSW50cmluc2ljOjpJRCBJRCkgY29uc3QgeworICAgIE1JLT5hZGRPcGVyYW5kKCpNRiwgTWFjaGluZU9wZXJhbmQ6OkNyZWF0ZUludHJpbnNpY0lEKElEKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgY29uc3QgTWFjaGluZUluc3RyQnVpbGRlciAmYWRkUHJlZGljYXRlKENtcEluc3Q6OlByZWRpY2F0ZSBQcmVkKSBjb25zdCB7CisgICAgTUktPmFkZE9wZXJhbmQoKk1GLCBNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlUHJlZGljYXRlKFByZWQpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICZhZGRTeW0oTUNTeW1ib2wgKlN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKSBjb25zdCB7CisgICAgTUktPmFkZE9wZXJhbmQoKk1GLCBNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlTUNTeW1ib2woU3ltLCBUYXJnZXRGbGFncykpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJnNldE1JRmxhZ3ModW5zaWduZWQgRmxhZ3MpIGNvbnN0IHsKKyAgICBNSS0+c2V0RmxhZ3MoRmxhZ3MpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJnNldE1JRmxhZyhNYWNoaW5lSW5zdHI6Ok1JRmxhZyBGbGFnKSBjb25zdCB7CisgICAgTUktPnNldEZsYWcoRmxhZyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gQWRkIGEgZGlzcGxhY2VtZW50IGZyb20gYW4gZXhpc3RpbmcgTWFjaGluZU9wZXJhbmQgd2l0aCBhbiBhZGRlZCBvZmZzZXQuCisgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1aWxkZXIgJmFkZERpc3AoY29uc3QgTWFjaGluZU9wZXJhbmQgJkRpc3AsIGludDY0X3Qgb2ZmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKSBjb25zdCB7CisgICAgLy8gSWYgY2FsbGVyIHNwZWNpZmllcyBuZXcgVGFyZ2V0RmxhZ3MgdGhlbiB1c2UgaXQsIG90aGVyd2lzZSB0aGUKKyAgICAvLyBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGNvcHkgdGhlIHRhcmdldCBmbGFncyBmcm9tIHRoZSBleGlzdGluZworICAgIC8vIE1hY2hpbmVPcGVyYW5kLiBUaGlzIG1lYW5zIGlmIHRoZSBjYWxsZXIgd2FudHMgdG8gY2xlYXIgdGhlCisgICAgLy8gdGFyZ2V0IGZsYWdzIGl0IG5lZWRzIHRvIGRvIHNvIGV4cGxpY2l0bHkuCisgICAgaWYgKDAgPT0gVGFyZ2V0RmxhZ3MpCisgICAgICBUYXJnZXRGbGFncyA9IERpc3AuZ2V0VGFyZ2V0RmxhZ3MoKTsKKworICAgIHN3aXRjaCAoRGlzcC5nZXRUeXBlKCkpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuaGFuZGxlZCBvcGVyYW5kIHR5cGUgaW4gYWRkRGlzcCgpIik7CisgICAgICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19JbW1lZGlhdGU6CisgICAgICAgIHJldHVybiBhZGRJbW0oRGlzcC5nZXRJbW0oKSArIG9mZik7CisgICAgICBjYXNlIE1hY2hpbmVPcGVyYW5kOjpNT19Db25zdGFudFBvb2xJbmRleDoKKyAgICAgICAgcmV0dXJuIGFkZENvbnN0YW50UG9vbEluZGV4KERpc3AuZ2V0SW5kZXgoKSwgRGlzcC5nZXRPZmZzZXQoKSArIG9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEZsYWdzKTsKKyAgICAgIGNhc2UgTWFjaGluZU9wZXJhbmQ6Ok1PX0dsb2JhbEFkZHJlc3M6CisgICAgICAgIHJldHVybiBhZGRHbG9iYWxBZGRyZXNzKERpc3AuZ2V0R2xvYmFsKCksIERpc3AuZ2V0T2Zmc2V0KCkgKyBvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEZsYWdzKTsKKyAgICB9CisgIH0KKworICAvLy8gQ29weSBhbGwgdGhlIGltcGxpY2l0IG9wZXJhbmRzIGZyb20gT3RoZXJNSSBvbnRvIHRoaXMgb25lLgorICBjb25zdCBNYWNoaW5lSW5zdHJCdWlsZGVyICYKKyAgY29weUltcGxpY2l0T3BzKGNvbnN0IE1hY2hpbmVJbnN0ciAmT3RoZXJNSSkgY29uc3QgeworICAgIE1JLT5jb3B5SW1wbGljaXRPcHMoKk1GLCBPdGhlck1JKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBib29sIGNvbnN0cmFpbkFsbFVzZXMoY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZ2lzdGVyQmFua0luZm8gJlJCSSkgY29uc3QgeworICAgIHJldHVybiBjb25zdHJhaW5TZWxlY3RlZEluc3RSZWdPcGVyYW5kcygqTUksIFRJSSwgVFJJLCBSQkkpOworICB9Cit9OworCisvLy8gQnVpbGRlciBpbnRlcmZhY2UuIFNwZWNpZnkgaG93IHRvIGNyZWF0ZSB0aGUgaW5pdGlhbCBpbnN0cnVjdGlvbiBpdHNlbGYuCitpbmxpbmUgTWFjaGluZUluc3RyQnVpbGRlciBCdWlsZE1JKE1hY2hpbmVGdW5jdGlvbiAmTUYsIGNvbnN0IERlYnVnTG9jICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNJbnN0ckRlc2MgJk1DSUQpIHsKKyAgcmV0dXJuIE1hY2hpbmVJbnN0ckJ1aWxkZXIoTUYsIE1GLkNyZWF0ZU1hY2hpbmVJbnN0cihNQ0lELCBETCkpOworfQorCisvLy8gVGhpcyB2ZXJzaW9uIG9mIHRoZSBidWlsZGVyIHNldHMgdXAgdGhlIGZpcnN0IG9wZXJhbmQgYXMgYQorLy8vIGRlc3RpbmF0aW9uIHZpcnR1YWwgcmVnaXN0ZXIuCitpbmxpbmUgTWFjaGluZUluc3RyQnVpbGRlciBCdWlsZE1JKE1hY2hpbmVGdW5jdGlvbiAmTUYsIGNvbnN0IERlYnVnTG9jICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNJbnN0ckRlc2MgJk1DSUQsIHVuc2lnbmVkIERlc3RSZWcpIHsKKyAgcmV0dXJuIE1hY2hpbmVJbnN0ckJ1aWxkZXIoTUYsIE1GLkNyZWF0ZU1hY2hpbmVJbnN0cihNQ0lELCBETCkpCisgICAgICAgICAgIC5hZGRSZWcoRGVzdFJlZywgUmVnU3RhdGU6OkRlZmluZSk7Cit9CisKKy8vLyBUaGlzIHZlcnNpb24gb2YgdGhlIGJ1aWxkZXIgaW5zZXJ0cyB0aGUgbmV3bHktYnVpbHQgaW5zdHJ1Y3Rpb24gYmVmb3JlCisvLy8gdGhlIGdpdmVuIHBvc2l0aW9uIGluIHRoZSBnaXZlbiBNYWNoaW5lQmFzaWNCbG9jaywgYW5kIHNldHMgdXAgdGhlIGZpcnN0CisvLy8gb3BlcmFuZCBhcyBhIGRlc3RpbmF0aW9uIHZpcnR1YWwgcmVnaXN0ZXIuCitpbmxpbmUgTWFjaGluZUluc3RyQnVpbGRlciBCdWlsZE1JKE1hY2hpbmVCYXNpY0Jsb2NrICZCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnTG9jICZETCwgY29uc3QgTUNJbnN0ckRlc2MgJk1DSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcpIHsKKyAgTWFjaGluZUZ1bmN0aW9uICZNRiA9ICpCQi5nZXRQYXJlbnQoKTsKKyAgTWFjaGluZUluc3RyICpNSSA9IE1GLkNyZWF0ZU1hY2hpbmVJbnN0cihNQ0lELCBETCk7CisgIEJCLmluc2VydChJLCBNSSk7CisgIHJldHVybiBNYWNoaW5lSW5zdHJCdWlsZGVyKE1GLCBNSSkuYWRkUmVnKERlc3RSZWcsIFJlZ1N0YXRlOjpEZWZpbmUpOworfQorCisvLy8gVGhpcyB2ZXJzaW9uIG9mIHRoZSBidWlsZGVyIGluc2VydHMgdGhlIG5ld2x5LWJ1aWx0IGluc3RydWN0aW9uIGJlZm9yZQorLy8vIHRoZSBnaXZlbiBwb3NpdGlvbiBpbiB0aGUgZ2l2ZW4gTWFjaGluZUJhc2ljQmxvY2ssIGFuZCBzZXRzIHVwIHRoZSBmaXJzdAorLy8vIG9wZXJhbmQgYXMgYSBkZXN0aW5hdGlvbiB2aXJ0dWFsIHJlZ2lzdGVyLgorLy8vCisvLy8gSWYgXGMgSSBpcyBpbnNpZGUgYSBidW5kbGUsIHRoZW4gdGhlIG5ld2x5IGluc2VydGVkIFxhIE1hY2hpbmVJbnN0ciBpcworLy8vIGFkZGVkIHRvIHRoZSBzYW1lIGJ1bmRsZS4KK2lubGluZSBNYWNoaW5lSW5zdHJCdWlsZGVyIEJ1aWxkTUkoTWFjaGluZUJhc2ljQmxvY2sgJkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aW5zdHJfaXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdMb2MgJkRMLCBjb25zdCBNQ0luc3RyRGVzYyAmTUNJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVzdFJlZykgeworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKkJCLmdldFBhcmVudCgpOworICBNYWNoaW5lSW5zdHIgKk1JID0gTUYuQ3JlYXRlTWFjaGluZUluc3RyKE1DSUQsIERMKTsKKyAgQkIuaW5zZXJ0KEksIE1JKTsKKyAgcmV0dXJuIE1hY2hpbmVJbnN0ckJ1aWxkZXIoTUYsIE1JKS5hZGRSZWcoRGVzdFJlZywgUmVnU3RhdGU6OkRlZmluZSk7Cit9CisKK2lubGluZSBNYWNoaW5lSW5zdHJCdWlsZGVyIEJ1aWxkTUkoTWFjaGluZUJhc2ljQmxvY2sgJkJCLCBNYWNoaW5lSW5zdHIgJkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnTG9jICZETCwgY29uc3QgTUNJbnN0ckRlc2MgJk1DSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcpIHsKKyAgLy8gQ2FsbGluZyB0aGUgb3ZlcmxvYWQgZm9yIGluc3RyX2l0ZXJhdG9yIGlzIGFsd2F5cyBjb3JyZWN0LiAgSG93ZXZlciwgdGhlCisgIC8vIGRlZmluaXRpb24gaXMgbm90IGF2YWlsYWJsZSBpbiBoZWFkZXJzLCBzbyBpbmxpbmUgdGhlIGNoZWNrLgorICBpZiAoSS5pc0luc2lkZUJ1bmRsZSgpKQorICAgIHJldHVybiBCdWlsZE1JKEJCLCBNYWNoaW5lQmFzaWNCbG9jazo6aW5zdHJfaXRlcmF0b3IoSSksIERMLCBNQ0lELCBEZXN0UmVnKTsKKyAgcmV0dXJuIEJ1aWxkTUkoQkIsIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvcihJKSwgREwsIE1DSUQsIERlc3RSZWcpOworfQorCitpbmxpbmUgTWFjaGluZUluc3RyQnVpbGRlciBCdWlsZE1JKE1hY2hpbmVCYXNpY0Jsb2NrICZCQiwgTWFjaGluZUluc3RyICpJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z0xvYyAmREwsIGNvbnN0IE1DSW5zdHJEZXNjICZNQ0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnKSB7CisgIHJldHVybiBCdWlsZE1JKEJCLCAqSSwgREwsIE1DSUQsIERlc3RSZWcpOworfQorCisvLy8gVGhpcyB2ZXJzaW9uIG9mIHRoZSBidWlsZGVyIGluc2VydHMgdGhlIG5ld2x5LWJ1aWx0IGluc3RydWN0aW9uIGJlZm9yZSB0aGUKKy8vLyBnaXZlbiBwb3NpdGlvbiBpbiB0aGUgZ2l2ZW4gTWFjaGluZUJhc2ljQmxvY2ssIGFuZCBkb2VzIE5PVCB0YWtlIGEKKy8vLyBkZXN0aW5hdGlvbiByZWdpc3Rlci4KK2lubGluZSBNYWNoaW5lSW5zdHJCdWlsZGVyIEJ1aWxkTUkoTWFjaGluZUJhc2ljQmxvY2sgJkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdMb2MgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0luc3RyRGVzYyAmTUNJRCkgeworICBNYWNoaW5lRnVuY3Rpb24gJk1GID0gKkJCLmdldFBhcmVudCgpOworICBNYWNoaW5lSW5zdHIgKk1JID0gTUYuQ3JlYXRlTWFjaGluZUluc3RyKE1DSUQsIERMKTsKKyAgQkIuaW5zZXJ0KEksIE1JKTsKKyAgcmV0dXJuIE1hY2hpbmVJbnN0ckJ1aWxkZXIoTUYsIE1JKTsKK30KKworaW5saW5lIE1hY2hpbmVJbnN0ckJ1aWxkZXIgQnVpbGRNSShNYWNoaW5lQmFzaWNCbG9jayAmQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppbnN0cl9pdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z0xvYyAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DSW5zdHJEZXNjICZNQ0lEKSB7CisgIE1hY2hpbmVGdW5jdGlvbiAmTUYgPSAqQkIuZ2V0UGFyZW50KCk7CisgIE1hY2hpbmVJbnN0ciAqTUkgPSBNRi5DcmVhdGVNYWNoaW5lSW5zdHIoTUNJRCwgREwpOworICBCQi5pbnNlcnQoSSwgTUkpOworICByZXR1cm4gTWFjaGluZUluc3RyQnVpbGRlcihNRiwgTUkpOworfQorCitpbmxpbmUgTWFjaGluZUluc3RyQnVpbGRlciBCdWlsZE1JKE1hY2hpbmVCYXNpY0Jsb2NrICZCQiwgTWFjaGluZUluc3RyICZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z0xvYyAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DSW5zdHJEZXNjICZNQ0lEKSB7CisgIC8vIENhbGxpbmcgdGhlIG92ZXJsb2FkIGZvciBpbnN0cl9pdGVyYXRvciBpcyBhbHdheXMgY29ycmVjdC4gIEhvd2V2ZXIsIHRoZQorICAvLyBkZWZpbml0aW9uIGlzIG5vdCBhdmFpbGFibGUgaW4gaGVhZGVycywgc28gaW5saW5lIHRoZSBjaGVjay4KKyAgaWYgKEkuaXNJbnNpZGVCdW5kbGUoKSkKKyAgICByZXR1cm4gQnVpbGRNSShCQiwgTWFjaGluZUJhc2ljQmxvY2s6Omluc3RyX2l0ZXJhdG9yKEkpLCBETCwgTUNJRCk7CisgIHJldHVybiBCdWlsZE1JKEJCLCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IoSSksIERMLCBNQ0lEKTsKK30KKworaW5saW5lIE1hY2hpbmVJbnN0ckJ1aWxkZXIgQnVpbGRNSShNYWNoaW5lQmFzaWNCbG9jayAmQkIsIE1hY2hpbmVJbnN0ciAqSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdMb2MgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0luc3RyRGVzYyAmTUNJRCkgeworICByZXR1cm4gQnVpbGRNSShCQiwgKkksIERMLCBNQ0lEKTsKK30KKworLy8vIFRoaXMgdmVyc2lvbiBvZiB0aGUgYnVpbGRlciBpbnNlcnRzIHRoZSBuZXdseS1idWlsdCBpbnN0cnVjdGlvbiBhdCB0aGUgZW5kCisvLy8gb2YgdGhlIGdpdmVuIE1hY2hpbmVCYXNpY0Jsb2NrLCBhbmQgZG9lcyBOT1QgdGFrZSBhIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLgoraW5saW5lIE1hY2hpbmVJbnN0ckJ1aWxkZXIgQnVpbGRNSShNYWNoaW5lQmFzaWNCbG9jayAqQkIsIGNvbnN0IERlYnVnTG9jICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNJbnN0ckRlc2MgJk1DSUQpIHsKKyAgcmV0dXJuIEJ1aWxkTUkoKkJCLCBCQi0+ZW5kKCksIERMLCBNQ0lEKTsKK30KKworLy8vIFRoaXMgdmVyc2lvbiBvZiB0aGUgYnVpbGRlciBpbnNlcnRzIHRoZSBuZXdseS1idWlsdCBpbnN0cnVjdGlvbiBhdCB0aGUKKy8vLyBlbmQgb2YgdGhlIGdpdmVuIE1hY2hpbmVCYXNpY0Jsb2NrLCBhbmQgc2V0cyB1cCB0aGUgZmlyc3Qgb3BlcmFuZCBhcyBhCisvLy8gZGVzdGluYXRpb24gdmlydHVhbCByZWdpc3Rlci4KK2lubGluZSBNYWNoaW5lSW5zdHJCdWlsZGVyIEJ1aWxkTUkoTWFjaGluZUJhc2ljQmxvY2sgKkJCLCBjb25zdCBEZWJ1Z0xvYyAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DSW5zdHJEZXNjICZNQ0lELCB1bnNpZ25lZCBEZXN0UmVnKSB7CisgIHJldHVybiBCdWlsZE1JKCpCQiwgQkItPmVuZCgpLCBETCwgTUNJRCwgRGVzdFJlZyk7Cit9CisKKy8vLyBUaGlzIHZlcnNpb24gb2YgdGhlIGJ1aWxkZXIgYnVpbGRzIGEgREJHX1ZBTFVFIGludHJpbnNpYworLy8vIGZvciBlaXRoZXIgYSB2YWx1ZSBpbiBhIHJlZ2lzdGVyIG9yIGEgcmVnaXN0ZXItaW5kaXJlY3QKKy8vLyBhZGRyZXNzLiAgVGhlIGNvbnZlbnRpb24gaXMgdGhhdCBhIERCR19WQUxVRSBpcyBpbmRpcmVjdCBpZmYgdGhlCisvLy8gc2Vjb25kIG9wZXJhbmQgaXMgYW4gaW1tZWRpYXRlLgorTWFjaGluZUluc3RyQnVpbGRlciBCdWlsZE1JKE1hY2hpbmVGdW5jdGlvbiAmTUYsIGNvbnN0IERlYnVnTG9jICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0luc3RyRGVzYyAmTUNJRCwgYm9vbCBJc0luZGlyZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJlZywgY29uc3QgTUROb2RlICpWYXJpYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNRE5vZGUgKkV4cHIpOworCisvLy8gVGhpcyB2ZXJzaW9uIG9mIHRoZSBidWlsZGVyIGJ1aWxkcyBhIERCR19WQUxVRSBpbnRyaW5zaWMKKy8vLyBmb3IgZWl0aGVyIGEgdmFsdWUgaW4gYSByZWdpc3RlciBvciBhIHJlZ2lzdGVyLWluZGlyZWN0CisvLy8gYWRkcmVzcyBhbmQgaW5zZXJ0cyBpdCBhdCBwb3NpdGlvbiBJLgorTWFjaGluZUluc3RyQnVpbGRlciBCdWlsZE1JKE1hY2hpbmVCYXNpY0Jsb2NrICZCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwgY29uc3QgRGVidWdMb2MgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DSW5zdHJEZXNjICZNQ0lELCBib29sIElzSW5kaXJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVnLCBjb25zdCBNRE5vZGUgKlZhcmlhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ETm9kZSAqRXhwcik7CisKKy8vLyBDbG9uZSBhIERCR19WQUxVRSB3aG9zZSB2YWx1ZSBoYXMgYmVlbiBzcGlsbGVkIHRvIEZyYW1lSW5kZXguCitNYWNoaW5lSW5zdHIgKmJ1aWxkRGJnVmFsdWVGb3JTcGlsbChNYWNoaW5lQmFzaWNCbG9jayAmQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAmT3JpZywgaW50IEZyYW1lSW5kZXgpOworCisvLy8gVXBkYXRlIGEgREJHX1ZBTFVFIHdob3NlIHZhbHVlIGhhcyBiZWVuIHNwaWxsZWQgdG8gRnJhbWVJbmRleC4gVXNlZnVsIHdoZW4KKy8vLyBtb2RpZnlpbmcgYW4gaW5zdHJ1Y3Rpb24gaW4gcGxhY2Ugd2hpbGUgaXRlcmF0aW5nIG92ZXIgYSBiYXNpYyBibG9jay4KK3ZvaWQgdXBkYXRlRGJnVmFsdWVGb3JTcGlsbChNYWNoaW5lSW5zdHIgJk9yaWcsIGludCBGcmFtZUluZGV4KTsKKworaW5saW5lIHVuc2lnbmVkIGdldERlZlJlZ1N0YXRlKGJvb2wgQikgeworICByZXR1cm4gQiA/IFJlZ1N0YXRlOjpEZWZpbmUgOiAwOworfQoraW5saW5lIHVuc2lnbmVkIGdldEltcGxSZWdTdGF0ZShib29sIEIpIHsKKyAgcmV0dXJuIEIgPyBSZWdTdGF0ZTo6SW1wbGljaXQgOiAwOworfQoraW5saW5lIHVuc2lnbmVkIGdldEtpbGxSZWdTdGF0ZShib29sIEIpIHsKKyAgcmV0dXJuIEIgPyBSZWdTdGF0ZTo6S2lsbCA6IDA7Cit9CitpbmxpbmUgdW5zaWduZWQgZ2V0RGVhZFJlZ1N0YXRlKGJvb2wgQikgeworICByZXR1cm4gQiA/IFJlZ1N0YXRlOjpEZWFkIDogMDsKK30KK2lubGluZSB1bnNpZ25lZCBnZXRVbmRlZlJlZ1N0YXRlKGJvb2wgQikgeworICByZXR1cm4gQiA/IFJlZ1N0YXRlOjpVbmRlZiA6IDA7Cit9CitpbmxpbmUgdW5zaWduZWQgZ2V0SW50ZXJuYWxSZWFkUmVnU3RhdGUoYm9vbCBCKSB7CisgIHJldHVybiBCID8gUmVnU3RhdGU6OkludGVybmFsUmVhZCA6IDA7Cit9CitpbmxpbmUgdW5zaWduZWQgZ2V0RGVidWdSZWdTdGF0ZShib29sIEIpIHsKKyAgcmV0dXJuIEIgPyBSZWdTdGF0ZTo6RGVidWcgOiAwOworfQoraW5saW5lIHVuc2lnbmVkIGdldFJlbmFtYWJsZVJlZ1N0YXRlKGJvb2wgQikgeworICByZXR1cm4gQiA/IFJlZ1N0YXRlOjpSZW5hbWFibGUgOiAwOworfQorCisvLy8gR2V0IGFsbCByZWdpc3RlciBzdGF0ZSBmbGFncyBmcm9tIG1hY2hpbmUgb3BlcmFuZCBccCBSZWdPcC4KK2lubGluZSB1bnNpZ25lZCBnZXRSZWdTdGF0ZShjb25zdCBNYWNoaW5lT3BlcmFuZCAmUmVnT3ApIHsKKyAgYXNzZXJ0KFJlZ09wLmlzUmVnKCkgJiYgIk5vdCBhIHJlZ2lzdGVyIG9wZXJhbmQiKTsKKyAgcmV0dXJuIGdldERlZlJlZ1N0YXRlKFJlZ09wLmlzRGVmKCkpICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgICBnZXRJbXBsUmVnU3RhdGUoUmVnT3AuaXNJbXBsaWNpdCgpKSAgICAgICAgICAgICAgfAorICAgICAgICAgZ2V0S2lsbFJlZ1N0YXRlKFJlZ09wLmlzS2lsbCgpKSAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAgIGdldERlYWRSZWdTdGF0ZShSZWdPcC5pc0RlYWQoKSkgICAgICAgICAgICAgICAgICB8CisgICAgICAgICBnZXRVbmRlZlJlZ1N0YXRlKFJlZ09wLmlzVW5kZWYoKSkgICAgICAgICAgICAgICAgfAorICAgICAgICAgZ2V0SW50ZXJuYWxSZWFkUmVnU3RhdGUoUmVnT3AuaXNJbnRlcm5hbFJlYWQoKSkgIHwKKyAgICAgICAgIGdldERlYnVnUmVnU3RhdGUoUmVnT3AuaXNEZWJ1ZygpKSAgICAgICAgICAgICAgICB8CisgICAgICAgICBnZXRSZW5hbWFibGVSZWdTdGF0ZSgKKyAgICAgICAgICAgICBUYXJnZXRSZWdpc3RlckluZm86OmlzUGh5c2ljYWxSZWdpc3RlcihSZWdPcC5nZXRSZWcoKSkgJiYKKyAgICAgICAgICAgICBSZWdPcC5pc1JlbmFtYWJsZSgpKTsKK30KKworLy8vIEhlbHBlciBjbGFzcyBmb3IgY29uc3RydWN0aW5nIGJ1bmRsZXMgb2YgTWFjaGluZUluc3Rycy4KKy8vLworLy8vIE1JQnVuZGxlQnVpbGRlciBjYW4gY3JlYXRlIGEgYnVuZGxlIGZyb20gc2NyYXRjaCBieSBpbnNlcnRpbmcgbmV3CisvLy8gTWFjaGluZUluc3RycyBvbmUgYXQgYSB0aW1lLCBvciBpdCBjYW4gY3JlYXRlIGEgYnVuZGxlIGZyb20gYSBzZXF1ZW5jZSBvZgorLy8vIGV4aXN0aW5nIE1hY2hpbmVJbnN0cnMgaW4gYSBiYXNpYyBibG9jay4KK2NsYXNzIE1JQnVuZGxlQnVpbGRlciB7CisgIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkI7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppbnN0cl9pdGVyYXRvciBCZWdpbjsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Omluc3RyX2l0ZXJhdG9yIEVuZDsKKworcHVibGljOgorICAvLy8gQ3JlYXRlIGFuIE1JQnVuZGxlQnVpbGRlciB0aGF0IGluc2VydHMgaW5zdHJ1Y3Rpb25zIGludG8gYSBuZXcgYnVuZGxlIGluCisgIC8vLyBCQiBhYm92ZSB0aGUgYnVuZGxlIG9yIGluc3RydWN0aW9uIGF0IFBvcy4KKyAgTUlCdW5kbGVCdWlsZGVyKE1hY2hpbmVCYXNpY0Jsb2NrICZCQiwgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFBvcykKKyAgICAgIDogTUJCKEJCKSwgQmVnaW4oUG9zLmdldEluc3RySXRlcmF0b3IoKSksIEVuZChCZWdpbikge30KKworICAvLy8gQ3JlYXRlIGEgYnVuZGxlIGZyb20gdGhlIHNlcXVlbmNlIG9mIGluc3RydWN0aW9ucyBiZXR3ZWVuIEIgYW5kIEUuCisgIE1JQnVuZGxlQnVpbGRlcihNYWNoaW5lQmFzaWNCbG9jayAmQkIsIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBCLAorICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEUpCisgICAgICA6IE1CQihCQiksIEJlZ2luKEIuZ2V0SW5zdHJJdGVyYXRvcigpKSwgRW5kKEUuZ2V0SW5zdHJJdGVyYXRvcigpKSB7CisgICAgYXNzZXJ0KEIgIT0gRSAmJiAiTm8gaW5zdHJ1Y3Rpb25zIHRvIGJ1bmRsZSIpOworICAgICsrQjsKKyAgICB3aGlsZSAoQiAhPSBFKSB7CisgICAgICBNYWNoaW5lSW5zdHIgJk1JID0gKkI7CisgICAgICArK0I7CisgICAgICBNSS5idW5kbGVXaXRoUHJlZCgpOworICAgIH0KKyAgfQorCisgIC8vLyBDcmVhdGUgYW4gTUlCdW5kbGVCdWlsZGVyIHJlcHJlc2VudGluZyBhbiBleGlzdGluZyBpbnN0cnVjdGlvbiBvciBidW5kbGUKKyAgLy8vIHRoYXQgaGFzIE1JIGFzIGl0cyBoZWFkLgorICBleHBsaWNpdCBNSUJ1bmRsZUJ1aWxkZXIoTWFjaGluZUluc3RyICpNSSkKKyAgICAgIDogTUJCKCpNSS0+Z2V0UGFyZW50KCkpLCBCZWdpbihNSSksCisgICAgICAgIEVuZChnZXRCdW5kbGVFbmQoTUktPmdldEl0ZXJhdG9yKCkpKSB7fQorCisgIC8vLyBSZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIGJhc2ljIGJsb2NrIGNvbnRhaW5pbmcgdGhpcyBidW5kbGUuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICZnZXRNQkIoKSBjb25zdCB7IHJldHVybiBNQkI7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgbm8gaW5zdHJ1Y3Rpb25zIGhhdmUgYmVlbiBpbnNlcnRlZCBpbiB0aGlzIGJ1bmRsZSB5ZXQuCisgIC8vLyBFbXB0eSBidW5kbGVzIGFyZW4ndCByZXByZXNlbnRhYmxlIGluIGEgTWFjaGluZUJhc2ljQmxvY2suCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBCZWdpbiA9PSBFbmQ7IH0KKworICAvLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBidW5kbGVkIGluc3RydWN0aW9uLgorICBNYWNoaW5lQmFzaWNCbG9jazo6aW5zdHJfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBCZWdpbjsgfQorCisgIC8vLyBSZXR1cm4gYW4gaXRlcmF0b3IgYmV5b25kIHRoZSBsYXN0IGJ1bmRsZWQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppbnN0cl9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBFbmQ7IH0KKworICAvLy8gSW5zZXJ0IE1JIGludG8gdGhpcyBidW5kbGUgYmVmb3JlIEkgd2hpY2ggbXVzdCBwb2ludCB0byBhbiBpbnN0cnVjdGlvbiBpbgorICAvLy8gdGhlIGJ1bmRsZSwgb3IgZW5kKCkuCisgIE1JQnVuZGxlQnVpbGRlciAmaW5zZXJ0KE1hY2hpbmVCYXNpY0Jsb2NrOjppbnN0cl9pdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKk1JKSB7CisgICAgTUJCLmluc2VydChJLCBNSSk7CisgICAgaWYgKEkgPT0gQmVnaW4pIHsKKyAgICAgIGlmICghZW1wdHkoKSkKKyAgICAgICAgTUktPmJ1bmRsZVdpdGhTdWNjKCk7CisgICAgICBCZWdpbiA9IE1JLT5nZXRJdGVyYXRvcigpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBpZiAoSSA9PSBFbmQpIHsKKyAgICAgIE1JLT5idW5kbGVXaXRoUHJlZCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICAvLyBNSSB3YXMgaW5zZXJ0ZWQgaW4gdGhlIG1pZGRsZSBvZiB0aGUgYnVuZGxlLCBzbyBpdHMgbmVpZ2hib3JzJyBmbGFncyBhcmUKKyAgICAvLyBhbHJlYWR5IGZpbmUuIFVwZGF0ZSBNSSdzIGJ1bmRsZSBmbGFncyBtYW51YWxseS4KKyAgICBNSS0+c2V0RmxhZyhNYWNoaW5lSW5zdHI6OkJ1bmRsZWRQcmVkKTsKKyAgICBNSS0+c2V0RmxhZyhNYWNoaW5lSW5zdHI6OkJ1bmRsZWRTdWNjKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gSW5zZXJ0IE1JIGludG8gTUJCIGJ5IHByZXBlbmRpbmcgaXQgdG8gdGhlIGluc3RydWN0aW9ucyBpbiB0aGUgYnVuZGxlLgorICAvLy8gTUkgd2lsbCBiZWNvbWUgdGhlIGZpcnN0IGluc3RydWN0aW9uIGluIHRoZSBidW5kbGUuCisgIE1JQnVuZGxlQnVpbGRlciAmcHJlcGVuZChNYWNoaW5lSW5zdHIgKk1JKSB7CisgICAgcmV0dXJuIGluc2VydChiZWdpbigpLCBNSSk7CisgIH0KKworICAvLy8gSW5zZXJ0IE1JIGludG8gTUJCIGJ5IGFwcGVuZGluZyBpdCB0byB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBidW5kbGUuCisgIC8vLyBNSSB3aWxsIGJlY29tZSB0aGUgbGFzdCBpbnN0cnVjdGlvbiBpbiB0aGUgYnVuZGxlLgorICBNSUJ1bmRsZUJ1aWxkZXIgJmFwcGVuZChNYWNoaW5lSW5zdHIgKk1JKSB7CisgICAgcmV0dXJuIGluc2VydChlbmQoKSwgTUkpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX01BQ0hJTkVJTlNUUkJVSUxERVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1bmRsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ckJ1bmRsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MzQxZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVuZGxlLmgKQEAgLTAsMCArMSwyNjEgQEAKKy8vPT09LS0gQ29kZUdlbi9NYWNoaW5lSW5zdEJ1bmRsZS5oIC0gTUkgYnVuZGxlIHV0aWxpdGllcyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGUgdXRpbGl0eSBmdW5jdGlvbnMgdG8gbWFuaXB1bGF0ZSBtYWNoaW5lIGluc3RydWN0aW9uCisvLyBidW5kbGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVJTlNUUkJVTkRMRV9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FSU5TVFJCVU5ETEVfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIGZpbmFsaXplQnVuZGxlIC0gRmluYWxpemUgYSBtYWNoaW5lIGluc3RydWN0aW9uIGJ1bmRsZSB3aGljaCBpbmNsdWRlcworLy8vIGEgc2VxdWVuY2Ugb2YgaW5zdHJ1Y3Rpb25zIHN0YXJ0aW5nIGZyb20gRmlyc3RNSSB0byBMYXN0TUkgKGV4Y2x1c2l2ZSkuCisvLy8gVGhpcyByb3V0aW5lIGFkZHMgYSBCVU5ETEUgaW5zdHJ1Y3Rpb24gdG8gcmVwcmVzZW50IHRoZSBidW5kbGUsIGl0IGFkZHMKKy8vLyBJc0ludGVybmFsUmVhZCBtYXJrZXJzIHRvIE1hY2hpbmVPcGVyYW5kcyB3aGljaCBhcmUgZGVmaW5lZCBpbnNpZGUgdGhlCisvLy8gYnVuZGxlLCBhbmQgaXQgY29waWVzIGV4dGVybmFsbHkgdmlzaWJsZSBkZWZzIGFuZCB1c2VzIHRvIHRoZSBCVU5ETEUKKy8vLyBpbnN0cnVjdGlvbi4KK3ZvaWQgZmluYWxpemVCdW5kbGUoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Omluc3RyX2l0ZXJhdG9yIEZpcnN0TUksCisgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppbnN0cl9pdGVyYXRvciBMYXN0TUkpOworCisvLy8gZmluYWxpemVCdW5kbGUgLSBTYW1lIGZ1bmN0aW9uYWxpdHkgYXMgdGhlIHByZXZpb3VzIGZpbmFsaXplQnVuZGxlIGV4Y2VwdAorLy8vIHRoZSBsYXN0IGluc3RydWN0aW9uIGluIHRoZSBidW5kbGUgaXMgbm90IHByb3ZpZGVkIGFzIGFuIGlucHV0LiBUaGlzIGlzCisvLy8gdXNlZCBpbiBjYXNlcyB3aGVyZSBidW5kbGVzIGFyZSBwcmUtZGV0ZXJtaW5lZCBieSBtYXJraW5nIGluc3RydWN0aW9ucworLy8vIHdpdGggJ0luc2lkZUJ1bmRsZScgbWFya2VyLiBJdCByZXR1cm5zIHRoZSBNQkIgaW5zdHJ1Y3Rpb24gaXRlcmF0b3IgdGhhdAorLy8vIHBvaW50cyB0byB0aGUgZW5kIG9mIHRoZSBidW5kbGUuCitNYWNoaW5lQmFzaWNCbG9jazo6aW5zdHJfaXRlcmF0b3IgZmluYWxpemVCdW5kbGUoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwKKyAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Omluc3RyX2l0ZXJhdG9yIEZpcnN0TUkpOworCisvLy8gZmluYWxpemVCdW5kbGVzIC0gRmluYWxpemUgaW5zdHJ1Y3Rpb24gYnVuZGxlcyBpbiB0aGUgc3BlY2lmaWVkCisvLy8gTWFjaGluZUZ1bmN0aW9uLiBSZXR1cm4gdHJ1ZSBpZiBhbnkgYnVuZGxlcyBhcmUgZmluYWxpemVkLgorYm9vbCBmaW5hbGl6ZUJ1bmRsZXMoTWFjaGluZUZ1bmN0aW9uICZNRik7CisKKy8vLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpbiB0aGUgYnVuZGxlIGNvbnRhaW5pbmcgXHAgSS4KK2lubGluZSBNYWNoaW5lQmFzaWNCbG9jazo6aW5zdHJfaXRlcmF0b3IgZ2V0QnVuZGxlU3RhcnQoCisgICAgTWFjaGluZUJhc2ljQmxvY2s6Omluc3RyX2l0ZXJhdG9yIEkpIHsKKyAgd2hpbGUgKEktPmlzQnVuZGxlZFdpdGhQcmVkKCkpCisgICAgLS1JOworICByZXR1cm4gSTsKK30KKworLy8vIFJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGZpcnN0IGluc3RydWN0aW9uIGluIHRoZSBidW5kbGUgY29udGFpbmluZyBccCBJLgoraW5saW5lIE1hY2hpbmVCYXNpY0Jsb2NrOjpjb25zdF9pbnN0cl9pdGVyYXRvciBnZXRCdW5kbGVTdGFydCgKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaW5zdHJfaXRlcmF0b3IgSSkgeworICB3aGlsZSAoSS0+aXNCdW5kbGVkV2l0aFByZWQoKSkKKyAgICAtLUk7CisgIHJldHVybiBJOworfQorCisvLy8gUmV0dXJucyBhbiBpdGVyYXRvciBwb2ludGluZyBiZXlvbmQgdGhlIGJ1bmRsZSBjb250YWluaW5nIFxwIEkuCitpbmxpbmUgTWFjaGluZUJhc2ljQmxvY2s6Omluc3RyX2l0ZXJhdG9yIGdldEJ1bmRsZUVuZCgKKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aW5zdHJfaXRlcmF0b3IgSSkgeworICB3aGlsZSAoSS0+aXNCdW5kbGVkV2l0aFN1Y2MoKSkKKyAgICArK0k7CisgIHJldHVybiArK0k7Cit9CisKKy8vLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHBvaW50aW5nIGJleW9uZCB0aGUgYnVuZGxlIGNvbnRhaW5pbmcgXHAgSS4KK2lubGluZSBNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaW5zdHJfaXRlcmF0b3IgZ2V0QnVuZGxlRW5kKAorICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjpjb25zdF9pbnN0cl9pdGVyYXRvciBJKSB7CisgIHdoaWxlIChJLT5pc0J1bmRsZWRXaXRoU3VjYygpKQorICAgICsrSTsKKyAgcmV0dXJuICsrSTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1hY2hpbmVPcGVyYW5kIGl0ZXJhdG9yCisvLworCisvLy8gTWFjaGluZU9wZXJhbmRJdGVyYXRvckJhc2UgLSBJdGVyYXRvciB0aGF0IGNhbiB2aXNpdCBhbGwgb3BlcmFuZHMgb24gYQorLy8vIE1hY2hpbmVJbnN0ciwgb3IgYWxsIG9wZXJhbmRzIG9uIGEgYnVuZGxlIG9mIE1hY2hpbmVJbnN0cnMuICBUaGlzIGNsYXNzIGlzCisvLy8gbm90IGludGVuZGVkIHRvIGJlIHVzZWQgZGlyZWN0bHksIHVzZSBvbmUgb2YgdGhlIHN1Yi1jbGFzc2VzIGluc3RlYWQuCisvLy8KKy8vLyBJbnRlbmRlZCB1c2U6CisvLy8KKy8vLyAgIGZvciAoTUlCdW5kbGVPcGVyYW5kcyBNSU8oTUkpOyBNSU8uaXNWYWxpZCgpOyArK01JTykgeworLy8vICAgICBpZiAoIU1JTy0+aXNSZWcoKSkKKy8vLyAgICAgICBjb250aW51ZTsKKy8vLyAgICAgLi4uCisvLy8gICB9CisvLy8KK2NsYXNzIE1hY2hpbmVPcGVyYW5kSXRlcmF0b3JCYXNlIHsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Omluc3RyX2l0ZXJhdG9yIEluc3RySSwgSW5zdHJFOworICBNYWNoaW5lSW5zdHI6Om1vcF9pdGVyYXRvciBPcEksIE9wRTsKKworICAvLyBJZiB0aGUgb3BlcmFuZHMgb24gSW5zdHJJIGFyZSBleGhhdXN0ZWQsIGFkdmFuY2UgSW5zdHJJIHRvIHRoZSBuZXh0CisgIC8vIGJ1bmRsZWQgaW5zdHJ1Y3Rpb24gd2l0aCBvcGVyYW5kcy4KKyAgdm9pZCBhZHZhbmNlKCkgeworICAgIHdoaWxlIChPcEkgPT0gT3BFKSB7CisgICAgICAvLyBEb24ndCBhZHZhbmNlIG9mZiB0aGUgYmFzaWMgYmxvY2ssIG9yIGludG8gYSBuZXcgYnVuZGxlLgorICAgICAgaWYgKCsrSW5zdHJJID09IEluc3RyRSB8fCAhSW5zdHJJLT5pc0luc2lkZUJ1bmRsZSgpKQorICAgICAgICBicmVhazsKKyAgICAgIE9wSSA9IEluc3RySS0+b3BlcmFuZHNfYmVnaW4oKTsKKyAgICAgIE9wRSA9IEluc3RySS0+b3BlcmFuZHNfZW5kKCk7CisgICAgfQorICB9CisKK3Byb3RlY3RlZDoKKyAgLy8vIE1hY2hpbmVPcGVyYW5kSXRlcmF0b3JCYXNlIC0gQ3JlYXRlIGFuIGl0ZXJhdG9yIHRoYXQgdmlzaXRzIGFsbCBvcGVyYW5kcworICAvLy8gb24gTUksIG9yIGFsbCBvcGVyYW5kcyBvbiBldmVyeSBpbnN0cnVjdGlvbiBpbiB0aGUgYnVuZGxlIGNvbnRhaW5pbmcgTUkuCisgIC8vLworICAvLy8gQHBhcmFtIE1JIFRoZSBpbnN0cnVjdGlvbiB0byBleGFtaW5lLgorICAvLy8gQHBhcmFtIFdob2xlQnVuZGxlIFdoZW4gdHJ1ZSwgdmlzaXQgYWxsIG9wZXJhbmRzIG9uIHRoZSBlbnRpcmUgYnVuZGxlLgorICAvLy8KKyAgZXhwbGljaXQgTWFjaGluZU9wZXJhbmRJdGVyYXRvckJhc2UoTWFjaGluZUluc3RyICZNSSwgYm9vbCBXaG9sZUJ1bmRsZSkgeworICAgIGlmIChXaG9sZUJ1bmRsZSkgeworICAgICAgSW5zdHJJID0gZ2V0QnVuZGxlU3RhcnQoTUkuZ2V0SXRlcmF0b3IoKSk7CisgICAgICBJbnN0ckUgPSBNSS5nZXRQYXJlbnQoKS0+aW5zdHJfZW5kKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEluc3RySSA9IEluc3RyRSA9IE1JLmdldEl0ZXJhdG9yKCk7CisgICAgICArK0luc3RyRTsKKyAgICB9CisgICAgT3BJID0gSW5zdHJJLT5vcGVyYW5kc19iZWdpbigpOworICAgIE9wRSA9IEluc3RySS0+b3BlcmFuZHNfZW5kKCk7CisgICAgaWYgKFdob2xlQnVuZGxlKQorICAgICAgYWR2YW5jZSgpOworICB9CisKKyAgTWFjaGluZU9wZXJhbmQgJmRlcmVmKCkgY29uc3QgeyByZXR1cm4gKk9wSTsgfQorCitwdWJsaWM6CisgIC8vLyBpc1ZhbGlkIC0gUmV0dXJucyB0cnVlIHVudGlsIGFsbCB0aGUgb3BlcmFuZHMgaGF2ZSBiZWVuIHZpc2l0ZWQuCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIE9wSSAhPSBPcEU7IH0KKworICAvLy8gUHJlaW5jcmVtZW50LiAgTW92ZSB0byB0aGUgbmV4dCBvcGVyYW5kLgorICB2b2lkIG9wZXJhdG9yKysoKSB7CisgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiQ2Fubm90IGFkdmFuY2UgTUlPcGVyYW5kcyBiZXlvbmQgdGhlIGxhc3Qgb3BlcmFuZCIpOworICAgICsrT3BJOworICAgIGFkdmFuY2UoKTsKKyAgfQorCisgIC8vLyBnZXRPcGVyYW5kTm8gLSBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhlIGN1cnJlbnQgb3BlcmFuZCByZWxhdGl2ZSB0byBpdHMKKyAgLy8vIGluc3RydWN0aW9uLgorICAvLy8KKyAgdW5zaWduZWQgZ2V0T3BlcmFuZE5vKCkgY29uc3QgeworICAgIHJldHVybiBPcEkgLSBJbnN0ckktPm9wZXJhbmRzX2JlZ2luKCk7CisgIH0KKworICAvLy8gVmlydFJlZ0luZm8gLSBJbmZvcm1hdGlvbiBhYm91dCBhIHZpcnR1YWwgcmVnaXN0ZXIgdXNlZCBieSBhIHNldCBvZiBvcGVyYW5kcy4KKyAgLy8vCisgIHN0cnVjdCBWaXJ0UmVnSW5mbyB7CisgICAgLy8vIFJlYWRzIC0gT25lIG9mIHRoZSBvcGVyYW5kcyByZWFkIHRoZSB2aXJ0dWFsIHJlZ2lzdGVyLiAgVGhpcyBkb2VzIG5vdAorICAgIC8vLyBpbmNsdWRlIHVuZGVmIG9yIGludGVybmFsIHVzZSBvcGVyYW5kcywgc2VlIE1POjpyZWFkc1JlZygpLgorICAgIGJvb2wgUmVhZHM7CisKKyAgICAvLy8gV3JpdGVzIC0gT25lIG9mIHRoZSBvcGVyYW5kcyB3cml0ZXMgdGhlIHZpcnR1YWwgcmVnaXN0ZXIuCisgICAgYm9vbCBXcml0ZXM7CisKKyAgICAvLy8gVGllZCAtIFVzZXMgYW5kIGRlZnMgbXVzdCB1c2UgdGhlIHNhbWUgcmVnaXN0ZXIuIFRoaXMgY2FuIGJlIGJlY2F1c2Ugb2YKKyAgICAvLy8gYSB0d28tYWRkcmVzcyBjb25zdHJhaW50LCBvciB0aGVyZSBtYXkgYmUgYSBwYXJ0aWFsIHJlZGVmaW5pdGlvbiBvZiBhCisgICAgLy8vIHN1Yi1yZWdpc3Rlci4KKyAgICBib29sIFRpZWQ7CisgIH07CisKKyAgLy8vIEluZm9ybWF0aW9uIGFib3V0IGhvdyBhIHBoeXNpY2FsIHJlZ2lzdGVyIFJlZyBpcyB1c2VkIGJ5IGEgc2V0IG9mCisgIC8vLyBvcGVyYW5kcy4KKyAgc3RydWN0IFBoeXNSZWdJbmZvIHsKKyAgICAvLy8gVGhlcmUgaXMgYSByZWdtYXNrIG9wZXJhbmQgaW5kaWNhdGluZyBSZWcgaXMgY2xvYmJlcmVkLgorICAgIC8vLyBcc2VlIE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVSZWdNYXNrKCkuCisgICAgYm9vbCBDbG9iYmVyZWQ7CisKKyAgICAvLy8gUmVnIG9yIG9uZSBvZiBpdHMgYWxpYXNlcyBpcyBkZWZpbmVkLiBUaGUgZGVmaW5pdGlvbiBtYXkgb25seSBjb3ZlcgorICAgIC8vLyBwYXJ0cyBvZiB0aGUgcmVnaXN0ZXIuCisgICAgYm9vbCBEZWZpbmVkOworICAgIC8vLyBSZWcgb3IgYSBzdXBlci1yZWdpc3RlciBpcyBkZWZpbmVkLiBUaGUgZGVmaW5pdGlvbiBjb3ZlcnMgdGhlIGZ1bGwKKyAgICAvLy8gcmVnaXN0ZXIuCisgICAgYm9vbCBGdWxseURlZmluZWQ7CisKKyAgICAvLy8gUmVnIG9yIG9uZSBvZiBpdHMgYWxpYXNlcyBpcyByZWFkLiBUaGUgcmVnaXN0ZXIgbWF5IG9ubHkgYmUgcmVhZAorICAgIC8vLyBwYXJ0aWFsbHkuCisgICAgYm9vbCBSZWFkOworICAgIC8vLyBSZWcgb3IgYSBzdXBlci1yZWdpc3RlciBpcyByZWFkLiBUaGUgZnVsbCByZWdpc3RlciBpcyByZWFkLgorICAgIGJvb2wgRnVsbHlSZWFkOworCisgICAgLy8vIEVpdGhlcjoKKyAgICAvLy8gLSBSZWcgaXMgRnVsbHlEZWZpbmVkIGFuZCBhbGwgZGVmcyBvZiByZWcgb3IgYW4gb3ZlcmxhcHBpbmcKKyAgICAvLy8gICByZWdpc3RlciBhcmUgZGVhZCwgb3IKKyAgICAvLy8gLSBSZWcgaXMgY29tcGxldGVseSBkZWFkIGJlY2F1c2UgImRlZmluZWQiIGJ5IGEgY2xvYmJlci4KKyAgICBib29sIERlYWREZWY7CisKKyAgICAvLy8gUmVnIGlzIERlZmluZWQgYW5kIGFsbCBkZWZzIG9mIHJlZyBvciBhbiBvdmVybGFwcGluZyByZWdpc3RlciBhcmUKKyAgICAvLy8gZGVhZC4KKyAgICBib29sIFBhcnRpYWxEZWFkRGVmOworCisgICAgLy8vIFRoZXJlIGlzIGEgdXNlIG9wZXJhbmQgb2YgcmVnIG9yIGEgc3VwZXItcmVnaXN0ZXIgd2l0aCBraWxsIGZsYWcgc2V0LgorICAgIGJvb2wgS2lsbGVkOworICB9OworCisgIC8vLyBhbmFseXplVmlydFJlZyAtIEFuYWx5emUgaG93IHRoZSBjdXJyZW50IGluc3RydWN0aW9uIG9yIGJ1bmRsZSB1c2VzIGEKKyAgLy8vIHZpcnR1YWwgcmVnaXN0ZXIuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIG9wZXJhdG9yKysoKSwKKyAgLy8vIGl0IGV4cGVjdHMgYSBmcmVzaCBpdGVyYXRvci4KKyAgLy8vCisgIC8vLyBAcGFyYW0gUmVnIFRoZSB2aXJ0dWFsIHJlZ2lzdGVyIHRvIGFuYWx5emUuCisgIC8vLyBAcGFyYW0gT3BzIFdoZW4gc2V0LCB0aGlzIHZlY3RvciB3aWxsIHJlY2VpdmUgYW4gKE1JLCBPcE51bSkgZW50cnkgZm9yCisgIC8vLyAgICAgICAgICAgIGVhY2ggb3BlcmFuZCByZWZlcnJpbmcgdG8gUmVnLgorICAvLy8gQHJldHVybnMgQSBmaWxsZWQtaW4gUmVnSW5mbyBzdHJ1Y3QuCisgIFZpcnRSZWdJbmZvIGFuYWx5emVWaXJ0UmVnKHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxNYWNoaW5lSW5zdHIqLCB1bnNpZ25lZD4gPiAqT3BzID0gbnVsbHB0cik7CisKKyAgLy8vIGFuYWx5emVQaHlzUmVnIC0gQW5hbHl6ZSBob3cgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gb3IgYnVuZGxlIHVzZXMgYQorICAvLy8gcGh5c2ljYWwgcmVnaXN0ZXIuICBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgY2FsbGVkIGFmdGVyIG9wZXJhdG9yKysoKSwKKyAgLy8vIGl0IGV4cGVjdHMgYSBmcmVzaCBpdGVyYXRvci4KKyAgLy8vCisgIC8vLyBAcGFyYW0gUmVnIFRoZSBwaHlzaWNhbCByZWdpc3RlciB0byBhbmFseXplLgorICAvLy8gQHJldHVybnMgQSBmaWxsZWQtaW4gUGh5c1JlZ0luZm8gc3RydWN0LgorICBQaHlzUmVnSW5mbyBhbmFseXplUGh5c1JlZyh1bnNpZ25lZCBSZWcsIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKTsKK307CisKKy8vLyBNSU9wZXJhbmRzIC0gSXRlcmF0ZSBvdmVyIG9wZXJhbmRzIG9mIGEgc2luZ2xlIGluc3RydWN0aW9uLgorLy8vCitjbGFzcyBNSU9wZXJhbmRzIDogcHVibGljIE1hY2hpbmVPcGVyYW5kSXRlcmF0b3JCYXNlIHsKK3B1YmxpYzoKKyAgTUlPcGVyYW5kcyhNYWNoaW5lSW5zdHIgJk1JKSA6IE1hY2hpbmVPcGVyYW5kSXRlcmF0b3JCYXNlKE1JLCBmYWxzZSkge30KKyAgTWFjaGluZU9wZXJhbmQgJm9wZXJhdG9yKiAoKSBjb25zdCB7IHJldHVybiBkZXJlZigpOyB9CisgIE1hY2hpbmVPcGVyYW5kICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJmRlcmVmKCk7IH0KK307CisKKy8vLyBDb25zdE1JT3BlcmFuZHMgLSBJdGVyYXRlIG92ZXIgb3BlcmFuZHMgb2YgYSBzaW5nbGUgY29uc3QgaW5zdHJ1Y3Rpb24uCisvLy8KK2NsYXNzIENvbnN0TUlPcGVyYW5kcyA6IHB1YmxpYyBNYWNoaW5lT3BlcmFuZEl0ZXJhdG9yQmFzZSB7CitwdWJsaWM6CisgIENvbnN0TUlPcGVyYW5kcyhjb25zdCBNYWNoaW5lSW5zdHIgJk1JKQorICAgICAgOiBNYWNoaW5lT3BlcmFuZEl0ZXJhdG9yQmFzZShjb25zdF9jYXN0PE1hY2hpbmVJbnN0ciAmPihNSSksIGZhbHNlKSB7fQorICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmb3BlcmF0b3IqICgpIGNvbnN0IHsgcmV0dXJuIGRlcmVmKCk7IH0KKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmZGVyZWYoKTsgfQorfTsKKworLy8vIE1JQnVuZGxlT3BlcmFuZHMgLSBJdGVyYXRlIG92ZXIgYWxsIG9wZXJhbmRzIGluIGEgYnVuZGxlIG9mIG1hY2hpbmUKKy8vLyBpbnN0cnVjdGlvbnMuCisvLy8KK2NsYXNzIE1JQnVuZGxlT3BlcmFuZHMgOiBwdWJsaWMgTWFjaGluZU9wZXJhbmRJdGVyYXRvckJhc2UgeworcHVibGljOgorICBNSUJ1bmRsZU9wZXJhbmRzKE1hY2hpbmVJbnN0ciAmTUkpIDogTWFjaGluZU9wZXJhbmRJdGVyYXRvckJhc2UoTUksIHRydWUpIHt9CisgIE1hY2hpbmVPcGVyYW5kICZvcGVyYXRvciogKCkgY29uc3QgeyByZXR1cm4gZGVyZWYoKTsgfQorICBNYWNoaW5lT3BlcmFuZCAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICZkZXJlZigpOyB9Cit9OworCisvLy8gQ29uc3RNSUJ1bmRsZU9wZXJhbmRzIC0gSXRlcmF0ZSBvdmVyIGFsbCBvcGVyYW5kcyBpbiBhIGNvbnN0IGJ1bmRsZSBvZgorLy8vIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLgorLy8vCitjbGFzcyBDb25zdE1JQnVuZGxlT3BlcmFuZHMgOiBwdWJsaWMgTWFjaGluZU9wZXJhbmRJdGVyYXRvckJhc2UgeworcHVibGljOgorICBDb25zdE1JQnVuZGxlT3BlcmFuZHMoY29uc3QgTWFjaGluZUluc3RyICZNSSkKKyAgICAgIDogTWFjaGluZU9wZXJhbmRJdGVyYXRvckJhc2UoY29uc3RfY2FzdDxNYWNoaW5lSW5zdHIgJj4oTUkpLCB0cnVlKSB7fQorICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmb3BlcmF0b3IqICgpIGNvbnN0IHsgcmV0dXJuIGRlcmVmKCk7IH0KKyAgY29uc3QgTWFjaGluZU9wZXJhbmQgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmZGVyZWYoKTsgfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmZTQ5NjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IuaApAQCAtMCwwICsxLDI4OSBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvci5oIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEZWZpbmVzIGFuIGl0ZXJhdG9yIGNsYXNzIHRoYXQgYnVuZGxlcyBNYWNoaW5lSW5zdHIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORUlOU1RSQlVORExFSVRFUkFUT1JfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORUlOU1RSQlVORExFSVRFUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3QuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9zaW1wbGVfaWxpc3QuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDxjbGFzcyBULCBib29sIElzUmV2ZXJzZT4gc3RydWN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yVHJhaXRzOwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvclRyYWl0czxULCBmYWxzZT4geworICB1c2luZyBsaXN0X3R5cGUgPSBzaW1wbGVfaWxpc3Q8VCwgaWxpc3Rfc2VudGluZWxfdHJhY2tpbmc8dHJ1ZT4+OworICB1c2luZyBpbnN0cl9pdGVyYXRvciA9IHR5cGVuYW1lIGxpc3RfdHlwZTo6aXRlcmF0b3I7CisgIHVzaW5nIG5vbmNvbnN0X2luc3RyX2l0ZXJhdG9yID0gdHlwZW5hbWUgbGlzdF90eXBlOjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaW5zdHJfaXRlcmF0b3IgPSB0eXBlbmFtZSBsaXN0X3R5cGU6OmNvbnN0X2l0ZXJhdG9yOworfTsKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3JUcmFpdHM8VCwgdHJ1ZT4geworICB1c2luZyBsaXN0X3R5cGUgPSBzaW1wbGVfaWxpc3Q8VCwgaWxpc3Rfc2VudGluZWxfdHJhY2tpbmc8dHJ1ZT4+OworICB1c2luZyBpbnN0cl9pdGVyYXRvciA9IHR5cGVuYW1lIGxpc3RfdHlwZTo6cmV2ZXJzZV9pdGVyYXRvcjsKKyAgdXNpbmcgbm9uY29uc3RfaW5zdHJfaXRlcmF0b3IgPSB0eXBlbmFtZSBsaXN0X3R5cGU6OnJldmVyc2VfaXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2luc3RyX2l0ZXJhdG9yID0gdHlwZW5hbWUgbGlzdF90eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworfTsKK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3JUcmFpdHM8Y29uc3QgVCwgZmFsc2U+IHsKKyAgdXNpbmcgbGlzdF90eXBlID0gc2ltcGxlX2lsaXN0PFQsIGlsaXN0X3NlbnRpbmVsX3RyYWNraW5nPHRydWU+PjsKKyAgdXNpbmcgaW5zdHJfaXRlcmF0b3IgPSB0eXBlbmFtZSBsaXN0X3R5cGU6OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyBub25jb25zdF9pbnN0cl9pdGVyYXRvciA9IHR5cGVuYW1lIGxpc3RfdHlwZTo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2luc3RyX2l0ZXJhdG9yID0gdHlwZW5hbWUgbGlzdF90eXBlOjpjb25zdF9pdGVyYXRvcjsKK307Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yVHJhaXRzPGNvbnN0IFQsIHRydWU+IHsKKyAgdXNpbmcgbGlzdF90eXBlID0gc2ltcGxlX2lsaXN0PFQsIGlsaXN0X3NlbnRpbmVsX3RyYWNraW5nPHRydWU+PjsKKyAgdXNpbmcgaW5zdHJfaXRlcmF0b3IgPSB0eXBlbmFtZSBsaXN0X3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgIHVzaW5nIG5vbmNvbnN0X2luc3RyX2l0ZXJhdG9yID0gdHlwZW5hbWUgbGlzdF90eXBlOjpyZXZlcnNlX2l0ZXJhdG9yOworICB1c2luZyBjb25zdF9pbnN0cl9pdGVyYXRvciA9IHR5cGVuYW1lIGxpc3RfdHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKK307CisKK3RlbXBsYXRlIDxib29sIElzUmV2ZXJzZT4gc3RydWN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9ySGVscGVyOwordGVtcGxhdGUgPD4gc3RydWN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9ySGVscGVyPGZhbHNlPiB7CisgIC8vLyBHZXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBidW5kbGUuCisgIHRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4gc3RhdGljIEl0ZXJhdG9yIGdldEJ1bmRsZUJlZ2luKEl0ZXJhdG9yIEkpIHsKKyAgICBpZiAoIUkuaXNFbmQoKSkKKyAgICAgIHdoaWxlIChJLT5pc0J1bmRsZWRXaXRoUHJlZCgpKQorICAgICAgICAtLUk7CisgICAgcmV0dXJuIEk7CisgIH0KKworICAvLy8gR2V0IHRoZSBmaW5hbCBub2RlIG9mIHRoZSBjdXJyZW50IGJ1bmRsZS4KKyAgdGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yPiBzdGF0aWMgSXRlcmF0b3IgZ2V0QnVuZGxlRmluYWwoSXRlcmF0b3IgSSkgeworICAgIGlmICghSS5pc0VuZCgpKQorICAgICAgd2hpbGUgKEktPmlzQnVuZGxlZFdpdGhTdWNjKCkpCisgICAgICAgICsrSTsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIC8vLyBJbmNyZW1lbnQgZm9yd2FyZCBpbGlzdCBpdGVyYXRvci4KKyAgdGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yPiBzdGF0aWMgdm9pZCBpbmNyZW1lbnQoSXRlcmF0b3IgJkkpIHsKKyAgICBJID0gc3RkOjpuZXh0KGdldEJ1bmRsZUZpbmFsKEkpKTsKKyAgfQorCisgIC8vLyBEZWNyZW1lbnQgZm9yd2FyZCBpbGlzdCBpdGVyYXRvci4KKyAgdGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yPiBzdGF0aWMgdm9pZCBkZWNyZW1lbnQoSXRlcmF0b3IgJkkpIHsKKyAgICBJID0gZ2V0QnVuZGxlQmVnaW4oc3RkOjpwcmV2KEkpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9ySGVscGVyPHRydWU+IHsKKyAgLy8vIEdldCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBjdXJyZW50IGJ1bmRsZS4KKyAgdGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yPiBzdGF0aWMgSXRlcmF0b3IgZ2V0QnVuZGxlQmVnaW4oSXRlcmF0b3IgSSkgeworICAgIHJldHVybiBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvckhlbHBlcjxmYWxzZT46OmdldEJ1bmRsZUJlZ2luKAorICAgICAgICAgICAgICAgSS5nZXRSZXZlcnNlKCkpCisgICAgICAgIC5nZXRSZXZlcnNlKCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBmaW5hbCBub2RlIG9mIHRoZSBjdXJyZW50IGJ1bmRsZS4KKyAgdGVtcGxhdGUgPGNsYXNzIEl0ZXJhdG9yPiBzdGF0aWMgSXRlcmF0b3IgZ2V0QnVuZGxlRmluYWwoSXRlcmF0b3IgSSkgeworICAgIHJldHVybiBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvckhlbHBlcjxmYWxzZT46OmdldEJ1bmRsZUZpbmFsKAorICAgICAgICAgICAgICAgSS5nZXRSZXZlcnNlKCkpCisgICAgICAgIC5nZXRSZXZlcnNlKCk7CisgIH0KKworICAvLy8gSW5jcmVtZW50IHJldmVyc2UgaWxpc3QgaXRlcmF0b3IuCisgIHRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4gc3RhdGljIHZvaWQgaW5jcmVtZW50KEl0ZXJhdG9yICZJKSB7CisgICAgSSA9IGdldEJ1bmRsZUJlZ2luKHN0ZDo6bmV4dChJKSk7CisgIH0KKworICAvLy8gRGVjcmVtZW50IHJldmVyc2UgaWxpc3QgaXRlcmF0b3IuCisgIHRlbXBsYXRlIDxjbGFzcyBJdGVyYXRvcj4gc3RhdGljIHZvaWQgZGVjcmVtZW50KEl0ZXJhdG9yICZJKSB7CisgICAgSSA9IHN0ZDo6cHJldihnZXRCdW5kbGVGaW5hbChJKSk7CisgIH0KK307CisKKy8vLyBNYWNoaW5lQmFzaWNCbG9jayBpdGVyYXRvciB0aGF0IGF1dG9tYXRpY2FsbHkgc2tpcHMgb3ZlciBNSXMgdGhhdCBhcmUKKy8vLyBpbnNpZGUgYnVuZGxlcyAoaS5lLiB3YWxrIHRvcCBsZXZlbCBNSXMgb25seSkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHksIGJvb2wgSXNSZXZlcnNlID0gZmFsc2U+CitjbGFzcyBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciA6IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9ySGVscGVyPElzUmV2ZXJzZT4geworICB1c2luZyBUcmFpdHMgPSBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvclRyYWl0czxUeSwgSXNSZXZlcnNlPjsKKyAgdXNpbmcgaW5zdHJfaXRlcmF0b3IgPSB0eXBlbmFtZSBUcmFpdHM6Omluc3RyX2l0ZXJhdG9yOworCisgIGluc3RyX2l0ZXJhdG9yIE1JSTsKKworcHVibGljOgorICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgaW5zdHJfaXRlcmF0b3I6OnZhbHVlX3R5cGU7CisgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IHR5cGVuYW1lIGluc3RyX2l0ZXJhdG9yOjpkaWZmZXJlbmNlX3R5cGU7CisgIHVzaW5nIHBvaW50ZXIgPSB0eXBlbmFtZSBpbnN0cl9pdGVyYXRvcjo6cG9pbnRlcjsKKyAgdXNpbmcgcmVmZXJlbmNlID0gdHlwZW5hbWUgaW5zdHJfaXRlcmF0b3I6OnJlZmVyZW5jZTsKKyAgdXNpbmcgY29uc3RfcG9pbnRlciA9IHR5cGVuYW1lIGluc3RyX2l0ZXJhdG9yOjpjb25zdF9wb2ludGVyOworICB1c2luZyBjb25zdF9yZWZlcmVuY2UgPSB0eXBlbmFtZSBpbnN0cl9pdGVyYXRvcjo6Y29uc3RfcmVmZXJlbmNlOworICB1c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6YmlkaXJlY3Rpb25hbF9pdGVyYXRvcl90YWc7CisKK3ByaXZhdGU6CisgIHVzaW5nIG5vbmNvbnN0X2luc3RyX2l0ZXJhdG9yID0gdHlwZW5hbWUgVHJhaXRzOjpub25jb25zdF9pbnN0cl9pdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaW5zdHJfaXRlcmF0b3IgPSB0eXBlbmFtZSBUcmFpdHM6OmNvbnN0X2luc3RyX2l0ZXJhdG9yOworICB1c2luZyBub25jb25zdF9pdGVyYXRvciA9CisgICAgICBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvcjx0eXBlbmFtZSBub25jb25zdF9pbnN0cl9pdGVyYXRvcjo6dmFsdWVfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzUmV2ZXJzZT47CisgIHVzaW5nIHJldmVyc2VfaXRlcmF0b3IgPSBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvcjxUeSwgIUlzUmV2ZXJzZT47CisKK3B1YmxpYzoKKyAgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IoaW5zdHJfaXRlcmF0b3IgTUkpIDogTUlJKE1JKSB7CisgICAgYXNzZXJ0KCghTUkuZ2V0Tm9kZVB0cigpIHx8IE1JLmlzRW5kKCkgfHwgIU1JLT5pc0J1bmRsZWRXaXRoUHJlZCgpKSAmJgorICAgICAgICAgICAiSXQncyBub3QgbGVnYWwgdG8gaW5pdGlhbGl6ZSBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciB3aXRoIGEgIgorICAgICAgICAgICAiYnVuZGxlZCBNSSIpOworICB9CisKKyAgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IocmVmZXJlbmNlIE1JKSA6IE1JSShNSSkgeworICAgIGFzc2VydCghTUkuaXNCdW5kbGVkV2l0aFByZWQoKSAmJiAiSXQncyBub3QgbGVnYWwgdG8gaW5pdGlhbGl6ZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciB3aXRoIGEgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnVuZGxlZCBNSSIpOworICB9CisKKyAgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IocG9pbnRlciBNSSkgOiBNSUkoTUkpIHsKKyAgICAvLyBGSVhNRTogVGhpcyBjb252ZXJzaW9uIHNob3VsZCBiZSBleHBsaWNpdC4KKyAgICBhc3NlcnQoKCFNSSB8fCAhTUktPmlzQnVuZGxlZFdpdGhQcmVkKCkpICYmICJJdCdzIG5vdCBsZWdhbCB0byBpbml0aWFsaXplICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2l0aCBhIGJ1bmRsZWQgTUkiKTsKKyAgfQorCisgIC8vIFRlbXBsYXRlIGFsbG93cyBjb252ZXJzaW9uIGZyb20gY29uc3QgdG8gbm9uY29uc3QuCisgIHRlbXBsYXRlIDxjbGFzcyBPdGhlclR5PgorICBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvcigKKyAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yPE90aGVyVHksIElzUmV2ZXJzZT4gJkksCisgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPE90aGVyVHkgKiwgVHkgKj46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqPjo6dHlwZSA9IG51bGxwdHIpCisgICAgICA6IE1JSShJLmdldEluc3RySXRlcmF0b3IoKSkge30KKworICBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvcigpIDogTUlJKG51bGxwdHIpIHt9CisKKyAgLy8vIEV4cGxpY2l0IGNvbnZlcnNpb24gYmV0d2VlbiBmb3J3YXJkL3JldmVyc2UgaXRlcmF0b3JzLgorICAvLy8KKyAgLy8vIFRyYW5zbGF0ZSBiZXR3ZWVuIGZvcndhcmQgYW5kIHJldmVyc2UgaXRlcmF0b3JzIHdpdGhvdXQgY2hhbmdpbmcgcmFuZ2UKKyAgLy8vIGJvdW5kYXJpZXMuICBUaGUgcmVzdWx0aW5nIGl0ZXJhdG9yIHdpbGwgZGVyZWZlcmVuY2UgKGFuZCBoYXZlIGEgaGFuZGxlKQorICAvLy8gdG8gdGhlIHByZXZpb3VzIG5vZGUsIHdoaWNoIGlzIHNvbWV3aGF0IHVuZXhwZWN0ZWQ7IGJ1dCBjb252ZXJ0aW5nIHRoZQorICAvLy8gdHdvIGVuZHBvaW50cyBpbiBhIHJhbmdlIHdpbGwgZ2l2ZSB0aGUgc2FtZSByYW5nZSBpbiByZXZlcnNlLgorICAvLy8KKyAgLy8vIFRoaXMgbWF0Y2hlcyBzdGQ6OnJldmVyc2VfaXRlcmF0b3IgY29udmVyc2lvbnMuCisgIGV4cGxpY2l0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yKAorICAgICAgY29uc3QgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3I8VHksICFJc1JldmVyc2U+ICZJKQorICAgICAgOiBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvcigrK0kuZ2V0UmV2ZXJzZSgpKSB7fQorCisgIC8vLyBHZXQgdGhlIGJ1bmRsZSBpdGVyYXRvciBmb3IgdGhlIGdpdmVuIGluc3RydWN0aW9uJ3MgYnVuZGxlLgorICBzdGF0aWMgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IgZ2V0QXRCdW5kbGVCZWdpbihpbnN0cl9pdGVyYXRvciBNSSkgeworICAgIHJldHVybiBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvckhlbHBlcjxJc1JldmVyc2U+OjpnZXRCdW5kbGVCZWdpbihNSSk7CisgIH0KKworICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKk1JSTsgfQorICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmb3BlcmF0b3IqKCk7IH0KKworICAvLy8gQ2hlY2sgZm9yIG51bGwuCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIE1JSS5nZXROb2RlUHRyKCk7IH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yICZSKSB7CisgICAgcmV0dXJuIEwuTUlJID09IFIuTUlJOworICB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29uc3RfaW5zdHJfaXRlcmF0b3IgJlIpIHsKKyAgICByZXR1cm4gTC5NSUkgPT0gUjsgLy8gQXZvaWQgYXNzZXJ0aW9uIGFib3V0IHZhbGlkaXR5IG9mIFIuCisgIH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBjb25zdF9pbnN0cl9pdGVyYXRvciAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciAmUikgeworICAgIHJldHVybiBMID09IFIuTUlJOyAvLyBBdm9pZCBhc3NlcnRpb24gYWJvdXQgdmFsaWRpdHkgb2YgTC4KKyAgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vbmNvbnN0X2luc3RyX2l0ZXJhdG9yICZSKSB7CisgICAgcmV0dXJuIEwuTUlJID09IFI7IC8vIEF2b2lkIGFzc2VydGlvbiBhYm91dCB2YWxpZGl0eSBvZiBSLgorICB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3Qgbm9uY29uc3RfaW5zdHJfaXRlcmF0b3IgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IgJlIpIHsKKyAgICByZXR1cm4gTCA9PSBSLk1JSTsgLy8gQXZvaWQgYXNzZXJ0aW9uIGFib3V0IHZhbGlkaXR5IG9mIEwuCisgIH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciAmTCwgY29uc3RfcG9pbnRlciBSKSB7CisgICAgcmV0dXJuIEwgPT0gY29uc3RfaW5zdHJfaXRlcmF0b3IoUik7IC8vIEF2b2lkIGFzc2VydGlvbiBhYm91dCB2YWxpZGl0eSBvZiBSLgorICB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3RfcG9pbnRlciBMLCBjb25zdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciAmUikgeworICAgIHJldHVybiBjb25zdF9pbnN0cl9pdGVyYXRvcihMKSA9PSBSOyAvLyBBdm9pZCBhc3NlcnRpb24gYWJvdXQgdmFsaWRpdHkgb2YgTC4KKyAgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X3JlZmVyZW5jZSBSKSB7CisgICAgcmV0dXJuIEwgPT0gJlI7IC8vIEF2b2lkIGFzc2VydGlvbiBhYm91dCB2YWxpZGl0eSBvZiBSLgorICB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3RfcmVmZXJlbmNlIEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IgJlIpIHsKKyAgICByZXR1cm4gJkwgPT0gUjsgLy8gQXZvaWQgYXNzZXJ0aW9uIGFib3V0IHZhbGlkaXR5IG9mIEwuCisgIH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yICZSKSB7CisgICAgcmV0dXJuICEoTCA9PSBSKTsKKyAgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvbnN0X2luc3RyX2l0ZXJhdG9yICZSKSB7CisgICAgcmV0dXJuICEoTCA9PSBSKTsKKyAgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNvbnN0X2luc3RyX2l0ZXJhdG9yICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yICZSKSB7CisgICAgcmV0dXJuICEoTCA9PSBSKTsKKyAgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5vbmNvbnN0X2luc3RyX2l0ZXJhdG9yICZSKSB7CisgICAgcmV0dXJuICEoTCA9PSBSKTsKKyAgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IG5vbmNvbnN0X2luc3RyX2l0ZXJhdG9yICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yICZSKSB7CisgICAgcmV0dXJuICEoTCA9PSBSKTsKKyAgfQorICBmcmllbmQgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yICZMLCBjb25zdF9wb2ludGVyIFIpIHsKKyAgICByZXR1cm4gIShMID09IFIpOworICB9CisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3RfcG9pbnRlciBMLCBjb25zdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciAmUikgeworICAgIHJldHVybiAhKEwgPT0gUik7CisgIH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9yZWZlcmVuY2UgUikgeworICAgIHJldHVybiAhKEwgPT0gUik7CisgIH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdF9yZWZlcmVuY2UgTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciAmUikgeworICAgIHJldHVybiAhKEwgPT0gUik7CisgIH0KKworICAvLyBJbmNyZW1lbnQgYW5kIGRlY3JlbWVudCBvcGVyYXRvcnMuLi4KKyAgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IgJm9wZXJhdG9yLS0oKSB7CisgICAgdGhpcy0+ZGVjcmVtZW50KE1JSSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgIHRoaXMtPmluY3JlbWVudChNSUkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBNYWNoaW5lSW5zdHJCdW5kbGVJdGVyYXRvciBvcGVyYXRvci0tKGludCkgeworICAgIE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yIFRlbXAgPSAqdGhpczsKKyAgICAtLSp0aGlzOworICAgIHJldHVybiBUZW1wOworICB9CisgIE1hY2hpbmVJbnN0ckJ1bmRsZUl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7CisgICAgTWFjaGluZUluc3RyQnVuZGxlSXRlcmF0b3IgVGVtcCA9ICp0aGlzOworICAgICsrKnRoaXM7CisgICAgcmV0dXJuIFRlbXA7CisgIH0KKworICBpbnN0cl9pdGVyYXRvciBnZXRJbnN0ckl0ZXJhdG9yKCkgY29uc3QgeyByZXR1cm4gTUlJOyB9CisKKyAgbm9uY29uc3RfaXRlcmF0b3IgZ2V0Tm9uQ29uc3RJdGVyYXRvcigpIGNvbnN0IHsgcmV0dXJuIE1JSS5nZXROb25Db25zdCgpOyB9CisKKyAgLy8vIEdldCBhIHJldmVyc2UgaXRlcmF0b3IgdG8gdGhlIHNhbWUgbm9kZS4KKyAgLy8vCisgIC8vLyBHaXZlcyBhIHJldmVyc2UgaXRlcmF0b3IgdGhhdCB3aWxsIGRlcmVmZXJlbmNlIChhbmQgaGF2ZSBhIGhhbmRsZSkgdG8gdGhlCisgIC8vLyBzYW1lIG5vZGUuICBDb252ZXJ0aW5nIHRoZSBlbmRwb2ludCBpdGVyYXRvcnMgaW4gYSByYW5nZSB3aWxsIGdpdmUgYQorICAvLy8gZGlmZmVyZW50IHJhbmdlOyBmb3IgcmFuZ2Ugb3BlcmF0aW9ucywgdXNlIHRoZSBleHBsaWNpdCBjb252ZXJzaW9ucy4KKyAgcmV2ZXJzZV9pdGVyYXRvciBnZXRSZXZlcnNlKCkgY29uc3QgeyByZXR1cm4gTUlJLmdldFJldmVyc2UoKTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9NQUNISU5FSU5TVFJCVU5ETEVJVEVSQVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUp1bXBUYWJsZUluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lSnVtcFRhYmxlSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI1YTNlNmIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZUp1bXBUYWJsZUluZm8uaApAQCAtMCwwICsxLDE0MCBAQAorLy89PT0tLSBDb2RlR2VuL01hY2hpbmVKdW1wVGFibGVJbmZvLmggLSBBYnN0cmFjdCBKdW1wIFRhYmxlcyAgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGUgTWFjaGluZUp1bXBUYWJsZUluZm8gY2xhc3Mga2VlcHMgdHJhY2sgb2YganVtcCB0YWJsZXMgcmVmZXJlbmNlZCBieQorLy8gbG93ZXJlZCBzd2l0Y2ggaW5zdHJ1Y3Rpb25zIGluIHRoZSBNYWNoaW5lRnVuY3Rpb24uCisvLworLy8gSW5zdHJ1Y3Rpb25zIHJlZmVyZW5jZSB0aGUgYWRkcmVzcyBvZiB0aGVzZSBqdW1wIHRhYmxlcyB0aHJvdWdoIHRoZSB1c2Ugb2YKKy8vIE1PX0p1bXBUYWJsZUluZGV4IHZhbHVlcy4gIFdoZW4gZW1pdHRpbmcgYXNzZW1ibHkgb3IgbWFjaGluZSBjb2RlLCB0aGVzZQorLy8gdmlydHVhbCBhZGRyZXNzIHJlZmVyZW5jZXMgYXJlIGNvbnZlcnRlZCB0byByZWZlciB0byB0aGUgYWRkcmVzcyBvZiB0aGUKKy8vIGZ1bmN0aW9uIGp1bXAgdGFibGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVKVU1QVEFCTEVJTkZPX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVKVU1QVEFCTEVJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QcmludGFibGUuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKK2NsYXNzIERhdGFMYXlvdXQ7CitjbGFzcyByYXdfb3N0cmVhbTsKKworLy8vIE1hY2hpbmVKdW1wVGFibGVFbnRyeSAtIE9uZSBqdW1wIHRhYmxlIGluIHRoZSBqdW1wIHRhYmxlIGluZm8uCisvLy8KK3N0cnVjdCBNYWNoaW5lSnVtcFRhYmxlRW50cnkgeworICAvLy8gTUJCcyAtIFRoZSB2ZWN0b3Igb2YgYmFzaWMgYmxvY2tzIGZyb20gd2hpY2ggdG8gY3JlYXRlIHRoZSBqdW1wIHRhYmxlLgorICBzdGQ6OnZlY3RvcjxNYWNoaW5lQmFzaWNCbG9jayo+IE1CQnM7CisKKyAgZXhwbGljaXQgTWFjaGluZUp1bXBUYWJsZUVudHJ5KGNvbnN0IHN0ZDo6dmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrKj4gJk0pCisgIDogTUJCcyhNKSB7fQorfTsKKworY2xhc3MgTWFjaGluZUp1bXBUYWJsZUluZm8geworcHVibGljOgorICAvLy8gSlRFbnRyeUtpbmQgLSBUaGlzIGVudW0gaW5kaWNhdGVzIGhvdyBlYWNoIGVudHJ5IG9mIHRoZSBqdW1wIHRhYmxlIGlzCisgIC8vLyByZXByZXNlbnRlZCBhbmQgZW1pdHRlZC4KKyAgZW51bSBKVEVudHJ5S2luZCB7CisgICAgLy8vIEVLX0Jsb2NrQWRkcmVzcyAtIEVhY2ggZW50cnkgaXMgYSBwbGFpbiBhZGRyZXNzIG9mIGJsb2NrLCBlLmcuOgorICAgIC8vLyAgICAgLndvcmQgTEJCMTIzCisgICAgRUtfQmxvY2tBZGRyZXNzLAorCisgICAgLy8vIEVLX0dQUmVsNjRCbG9ja0FkZHJlc3MgLSBFYWNoIGVudHJ5IGlzIGFuIGFkZHJlc3Mgb2YgYmxvY2ssIGVuY29kZWQKKyAgICAvLy8gd2l0aCBhIHJlbG9jYXRpb24gYXMgZ3AtcmVsYXRpdmUsIGUuZy46CisgICAgLy8vICAgICAuZ3Bkd29yZCBMQkIxMjMKKyAgICBFS19HUFJlbDY0QmxvY2tBZGRyZXNzLAorCisgICAgLy8vIEVLX0dQUmVsMzJCbG9ja0FkZHJlc3MgLSBFYWNoIGVudHJ5IGlzIGFuIGFkZHJlc3Mgb2YgYmxvY2ssIGVuY29kZWQKKyAgICAvLy8gd2l0aCBhIHJlbG9jYXRpb24gYXMgZ3AtcmVsYXRpdmUsIGUuZy46CisgICAgLy8vICAgICAuZ3ByZWwzMiBMQkIxMjMKKyAgICBFS19HUFJlbDMyQmxvY2tBZGRyZXNzLAorCisgICAgLy8vIEVLX0xhYmVsRGlmZmVyZW5jZTMyIC0gRWFjaCBlbnRyeSBpcyB0aGUgYWRkcmVzcyBvZiB0aGUgYmxvY2sgbWludXMKKyAgICAvLy8gdGhlIGFkZHJlc3Mgb2YgdGhlIGp1bXAgdGFibGUuICBUaGlzIGlzIHVzZWQgZm9yIFBJQyBqdW1wIHRhYmxlcyB3aGVyZQorICAgIC8vLyBncHJlbDMyIGlzIG5vdCBzdXBwb3J0ZWQuICBlLmcuOgorICAgIC8vLyAgICAgIC53b3JkIExCQjEyMyAtIExKVEkxXzIKKyAgICAvLy8gSWYgdGhlIC5zZXQgZGlyZWN0aXZlIGlzIHN1cHBvcnRlZCwgdGhpcyBpcyBlbWl0dGVkIGFzOgorICAgIC8vLyAgICAgIC5zZXQgTDRfNV9zZXRfMTIzLCBMQkIxMjMgLSBMSlRJMV8yCisgICAgLy8vICAgICAgLndvcmQgTDRfNV9zZXRfMTIzCisgICAgRUtfTGFiZWxEaWZmZXJlbmNlMzIsCisKKyAgICAvLy8gRUtfSW5saW5lIC0gSnVtcCB0YWJsZSBlbnRyaWVzIGFyZSBlbWl0dGVkIGlubGluZSBhdCB0aGVpciBwb2ludCBvZgorICAgIC8vLyB1c2UuIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgdGFyZ2V0IHRvIGVtaXQgdGhlIGVudHJpZXMuCisgICAgRUtfSW5saW5lLAorCisgICAgLy8vIEVLX0N1c3RvbTMyIC0gRWFjaCBlbnRyeSBpcyBhIDMyLWJpdCB2YWx1ZSB0aGF0IGlzIGN1c3RvbSBsb3dlcmVkIGJ5IHRoZQorICAgIC8vLyBUYXJnZXRMb3dlcmluZzo6TG93ZXJDdXN0b21KdW1wVGFibGVFbnRyeSBob29rLgorICAgIEVLX0N1c3RvbTMyCisgIH07Citwcml2YXRlOgorICBKVEVudHJ5S2luZCBFbnRyeUtpbmQ7CisgIHN0ZDo6dmVjdG9yPE1hY2hpbmVKdW1wVGFibGVFbnRyeT4gSnVtcFRhYmxlczsKK3B1YmxpYzoKKyAgZXhwbGljaXQgTWFjaGluZUp1bXBUYWJsZUluZm8oSlRFbnRyeUtpbmQgS2luZCk6IEVudHJ5S2luZChLaW5kKSB7fQorCisgIEpURW50cnlLaW5kIGdldEVudHJ5S2luZCgpIGNvbnN0IHsgcmV0dXJuIEVudHJ5S2luZDsgfQorCisgIC8vLyBnZXRFbnRyeVNpemUgLSBSZXR1cm4gdGhlIHNpemUgb2YgZWFjaCBlbnRyeSBpbiB0aGUganVtcCB0YWJsZS4KKyAgdW5zaWduZWQgZ2V0RW50cnlTaXplKGNvbnN0IERhdGFMYXlvdXQgJlREKSBjb25zdDsKKyAgLy8vIGdldEVudHJ5QWxpZ25tZW50IC0gUmV0dXJuIHRoZSBhbGlnbm1lbnQgb2YgZWFjaCBlbnRyeSBpbiB0aGUganVtcCB0YWJsZS4KKyAgdW5zaWduZWQgZ2V0RW50cnlBbGlnbm1lbnQoY29uc3QgRGF0YUxheW91dCAmVEQpIGNvbnN0OworCisgIC8vLyBjcmVhdGVKdW1wVGFibGVJbmRleCAtIENyZWF0ZSBhIG5ldyBqdW1wIHRhYmxlLgorICAvLy8KKyAgdW5zaWduZWQgY3JlYXRlSnVtcFRhYmxlSW5kZXgoY29uc3Qgc3RkOjp2ZWN0b3I8TWFjaGluZUJhc2ljQmxvY2sqPiAmRGVzdEJCcyk7CisKKyAgLy8vIGlzRW1wdHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgbm8ganVtcCB0YWJsZXMuCisgIC8vLworICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBKdW1wVGFibGVzLmVtcHR5KCk7IH0KKworICBjb25zdCBzdGQ6OnZlY3RvcjxNYWNoaW5lSnVtcFRhYmxlRW50cnk+ICZnZXRKdW1wVGFibGVzKCkgY29uc3QgeworICAgIHJldHVybiBKdW1wVGFibGVzOworICB9CisKKyAgLy8vIFJlbW92ZUp1bXBUYWJsZSAtIE1hcmsgdGhlIHNwZWNpZmljIGluZGV4IGFzIGJlaW5nIGRlYWQuICBUaGlzIHdpbGwKKyAgLy8vIHByZXZlbnQgaXQgZnJvbSBiZWluZyBlbWl0dGVkLgorICB2b2lkIFJlbW92ZUp1bXBUYWJsZSh1bnNpZ25lZCBJZHgpIHsKKyAgICBKdW1wVGFibGVzW0lkeF0uTUJCcy5jbGVhcigpOworICB9CisKKyAgLy8vIFJlcGxhY2VNQkJJbkp1bXBUYWJsZXMgLSBJZiBPbGQgaXMgdGhlIHRhcmdldCBvZiBhbnkganVtcCB0YWJsZXMsIHVwZGF0ZQorICAvLy8gdGhlIGp1bXAgdGFibGVzIHRvIGJyYW5jaCB0byBOZXcgaW5zdGVhZC4KKyAgYm9vbCBSZXBsYWNlTUJCSW5KdW1wVGFibGVzKE1hY2hpbmVCYXNpY0Jsb2NrICpPbGQsIE1hY2hpbmVCYXNpY0Jsb2NrICpOZXcpOworCisgIC8vLyBSZXBsYWNlTUJCSW5KdW1wVGFibGUgLSBJZiBPbGQgaXMgYSB0YXJnZXQgb2YgdGhlIGp1bXAgdGFibGVzLCB1cGRhdGUKKyAgLy8vIHRoZSBqdW1wIHRhYmxlIHRvIGJyYW5jaCB0byBOZXcgaW5zdGVhZC4KKyAgYm9vbCBSZXBsYWNlTUJCSW5KdW1wVGFibGUodW5zaWduZWQgSWR4LCBNYWNoaW5lQmFzaWNCbG9jayAqT2xkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTmV3KTsKKworICAvLy8gcHJpbnQgLSBVc2VkIGJ5IHRoZSBNYWNoaW5lRnVuY3Rpb24gcHJpbnRlciB0byBwcmludCBpbmZvcm1hdGlvbiBhYm91dAorICAvLy8ganVtcCB0YWJsZXMuICBJbXBsZW1lbnRlZCBpbiBNYWNoaW5lRnVuY3Rpb24uY3BwCisgIC8vLworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgLy8vIGR1bXAgLSBDYWxsIHRvIHN0ZGVyci4KKyAgLy8vCisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworCisvLy8gUHJpbnRzIGEganVtcCB0YWJsZSBlbnRyeSByZWZlcmVuY2UuCisvLy8KKy8vLyBUaGUgZm9ybWF0IGlzOgorLy8vICAgJWp1bXAtdGFibGUuNSAgICAgICAtIGEganVtcCB0YWJsZSBlbnRyeSB3aXRoIGluZGV4ID09IDUuCisvLy8KKy8vLyBVc2FnZTogT1MgPDwgcHJpbnRKdW1wVGFibGVFbnRyeVJlZmVyZW5jZShJZHgpIDw8ICdcbic7CitQcmludGFibGUgcHJpbnRKdW1wVGFibGVFbnRyeVJlZmVyZW5jZSh1bnNpZ25lZCBJZHgpOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lTG9vcEluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lTG9vcEluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDQ2NTVlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVMb29wSW5mby5oCkBAIC0wLDAgKzEsMTkzIEBACisvLz09PS0gbGx2bS9Db2RlR2VuL01hY2hpbmVMb29wSW5mby5oIC0gTmF0dXJhbCBMb29wIENhbGN1bGF0b3IgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBNYWNoaW5lTG9vcEluZm8gY2xhc3MgdGhhdCBpcyB1c2VkIHRvIGlkZW50aWZ5IG5hdHVyYWwKKy8vIGxvb3BzIGFuZCBkZXRlcm1pbmUgdGhlIGxvb3AgZGVwdGggb2YgdmFyaW91cyBub2RlcyBvZiB0aGUgQ0ZHLiAgTm90ZSB0aGF0CisvLyBuYXR1cmFsIGxvb3BzIG1heSBhY3R1YWxseSBiZSBzZXZlcmFsIGxvb3BzIHRoYXQgc2hhcmUgdGhlIHNhbWUgaGVhZGVyIG5vZGUuCisvLworLy8gVGhpcyBhbmFseXNpcyBjYWxjdWxhdGVzIHRoZSBuZXN0aW5nIHN0cnVjdHVyZSBvZiBsb29wcyBpbiBhIGZ1bmN0aW9uLiAgRm9yCisvLyBlYWNoIG5hdHVyYWwgbG9vcCBpZGVudGlmaWVkLCB0aGlzIGFuYWx5c2lzIGlkZW50aWZpZXMgbmF0dXJhbCBsb29wcworLy8gY29udGFpbmVkIGVudGlyZWx5IHdpdGhpbiB0aGUgbG9vcCBhbmQgdGhlIGJhc2ljIGJsb2NrcyB0aGUgbWFrZSB1cCB0aGUgbG9vcC4KKy8vCisvLyBJdCBjYW4gY2FsY3VsYXRlIG9uIHRoZSBmbHkgdmFyaW91cyBiaXRzIG9mIGluZm9ybWF0aW9uLCBmb3IgZXhhbXBsZToKKy8vCisvLyAgKiB3aGV0aGVyIHRoZXJlIGlzIGEgcHJlaGVhZGVyIGZvciB0aGUgbG9vcAorLy8gICogdGhlIG51bWJlciBvZiBiYWNrIGVkZ2VzIHRvIHRoZSBoZWFkZXIKKy8vICAqIHdoZXRoZXIgb3Igbm90IGEgcGFydGljdWxhciBibG9jayBicmFuY2hlcyBvdXQgb2YgdGhlIGxvb3AKKy8vICAqIHRoZSBzdWNjZXNzb3IgYmxvY2tzIG9mIHRoZSBsb29wCisvLyAgKiB0aGUgbG9vcCBkZXB0aAorLy8gICogdGhlIHRyaXAgY291bnQKKy8vICAqIGV0Yy4uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVMT09QSU5GT19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FTE9PUElORk9fSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZWJ1Z0xvYy5oIgorI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vIEltcGxlbWVudGF0aW9uIGluIExvb3BJbmZvSW1wbC5oCitjbGFzcyBNYWNoaW5lTG9vcDsKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBMb29wQmFzZTxNYWNoaW5lQmFzaWNCbG9jaywgTWFjaGluZUxvb3A+OworCitjbGFzcyBNYWNoaW5lTG9vcCA6IHB1YmxpYyBMb29wQmFzZTxNYWNoaW5lQmFzaWNCbG9jaywgTWFjaGluZUxvb3A+IHsKK3B1YmxpYzoKKyAgLy8vIFJldHVybiB0aGUgInRvcCIgYmxvY2sgaW4gdGhlIGxvb3AsIHdoaWNoIGlzIHRoZSBmaXJzdCBibG9jayBpbiB0aGUgbGluZWFyCisgIC8vLyBsYXlvdXQsIGlnbm9yaW5nIGFueSBwYXJ0cyBvZiB0aGUgbG9vcCBub3QgY29udGlndW91cyB3aXRoIHRoZSBwYXJ0IHRoYXQKKyAgLy8vIGNvbnRhaW5zIHRoZSBoZWFkZXIuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpnZXRUb3BCbG9jaygpOworCisgIC8vLyBSZXR1cm4gdGhlICJib3R0b20iIGJsb2NrIGluIHRoZSBsb29wLCB3aGljaCBpcyB0aGUgbGFzdCBibG9jayBpbiB0aGUKKyAgLy8vIGxpbmVhciBsYXlvdXQsIGlnbm9yaW5nIGFueSBwYXJ0cyBvZiB0aGUgbG9vcCBub3QgY29udGlndW91cyB3aXRoIHRoZSBwYXJ0CisgIC8vLyB0aGF0IGNvbnRhaW5zIHRoZSBoZWFkZXIuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpnZXRCb3R0b21CbG9jaygpOworCisgIC8vLyBcYnJpZWYgRmluZCB0aGUgYmxvY2sgdGhhdCBjb250YWlucyB0aGUgbG9vcCBjb250cm9sIHZhcmlhYmxlIGFuZCB0aGUKKyAgLy8vIGxvb3AgdGVzdC4gVGhpcyB3aWxsIHJldHVybiB0aGUgbGF0Y2ggYmxvY2sgaWYgaXQncyBvbmUgb2YgdGhlIGV4aXRpbmcKKyAgLy8vIGJsb2Nrcy4gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIGV4aXRpbmcgYmxvY2suIFJldHVybiAnbnVsbCcgd2hlbgorICAvLy8gbXVsdGlwbGUgZXhpdGluZyBibG9ja3MgYXJlIHByZXNlbnQuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpmaW5kTG9vcENvbnRyb2xCbG9jaygpOworCisgIC8vLyBSZXR1cm4gdGhlIGRlYnVnIGxvY2F0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGlzIGxvb3AuCisgIC8vLyBUaGlzIGxvb2tzIGZvciBhIEJCIHRlcm1pbmF0aW5nIGluc3RydWN0aW9uIHdpdGggYSBrbm93biBkZWJ1ZworICAvLy8gbG9jYXRpb24gYnkgbG9va2luZyBhdCB0aGUgcHJlaGVhZGVyIGFuZCBoZWFkZXIgYmxvY2tzLiBJZiBpdAorICAvLy8gY2Fubm90IGZpbmQgYSB0ZXJtaW5hdGluZyBpbnN0cnVjdGlvbiB3aXRoIGxvY2F0aW9uIGluZm9ybWF0aW9uLAorICAvLy8gaXQgcmV0dXJucyBhbiB1bmtub3duIGxvY2F0aW9uLgorICBEZWJ1Z0xvYyBnZXRTdGFydExvYygpIGNvbnN0OworCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgTG9vcEluZm9CYXNlPE1hY2hpbmVCYXNpY0Jsb2NrLCBNYWNoaW5lTG9vcD47CisKKyAgZXhwbGljaXQgTWFjaGluZUxvb3AoTWFjaGluZUJhc2ljQmxvY2sgKk1CQikKKyAgICA6IExvb3BCYXNlPE1hY2hpbmVCYXNpY0Jsb2NrLCBNYWNoaW5lTG9vcD4oTUJCKSB7fQorCisgIE1hY2hpbmVMb29wKCkgPSBkZWZhdWx0OworfTsKKworLy8gSW1wbGVtZW50YXRpb24gaW4gTG9vcEluZm9JbXBsLmgKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBMb29wSW5mb0Jhc2U8TWFjaGluZUJhc2ljQmxvY2ssIE1hY2hpbmVMb29wPjsKKworY2xhc3MgTWFjaGluZUxvb3BJbmZvIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICBmcmllbmQgY2xhc3MgTG9vcEJhc2U8TWFjaGluZUJhc2ljQmxvY2ssIE1hY2hpbmVMb29wPjsKKworICBMb29wSW5mb0Jhc2U8TWFjaGluZUJhc2ljQmxvY2ssIE1hY2hpbmVMb29wPiBMSTsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsgLy8gUGFzcyBpZGVudGlmaWNhdGlvbiwgcmVwbGFjZW1lbnQgZm9yIHR5cGVpZAorCisgIE1hY2hpbmVMb29wSW5mbygpIDogTWFjaGluZUZ1bmN0aW9uUGFzcyhJRCkgeworICAgIGluaXRpYWxpemVNYWNoaW5lTG9vcEluZm9QYXNzKCpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpKTsKKyAgfQorICBNYWNoaW5lTG9vcEluZm8oY29uc3QgTWFjaGluZUxvb3BJbmZvICYpID0gZGVsZXRlOworICBNYWNoaW5lTG9vcEluZm8gJm9wZXJhdG9yPShjb25zdCBNYWNoaW5lTG9vcEluZm8gJikgPSBkZWxldGU7CisKKyAgTG9vcEluZm9CYXNlPE1hY2hpbmVCYXNpY0Jsb2NrLCBNYWNoaW5lTG9vcD4mIGdldEJhc2UoKSB7IHJldHVybiBMSTsgfQorCisgIC8vLyBcYnJpZWYgRmluZCB0aGUgYmxvY2sgdGhhdCBlaXRoZXIgaXMgdGhlIGxvb3AgcHJlaGVhZGVyLCBvciBjb3VsZAorICAvLy8gc3BlY3VsYXRpdmVseSBiZSB1c2VkIGFzIHRoZSBwcmVoZWFkZXIuIFRoaXMgaXMgZS5nLiB1c2VmdWwgdG8gcGxhY2UKKyAgLy8vIGxvb3Agc2V0dXAgY29kZS4gQ29kZSB0aGF0IGNhbm5vdCBiZSBzcGVjdWxhdGVkIHNob3VsZCBub3QgYmUgcGxhY2VkCisgIC8vLyBoZXJlLiBTcGVjdWxhdGl2ZVByZWhlYWRlciBpcyBjb250cm9sbGluZyB3aGV0aGVyIGl0IGFsc28gdHJpZXMgdG8KKyAgLy8vIGZpbmQgdGhlIHNwZWN1bGF0aXZlIHByZWhlYWRlciBpZiB0aGUgcmVndWxhciBwcmVoZWFkZXIgaXMgbm90IHByZXNlbnQuCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpmaW5kTG9vcFByZWhlYWRlcihNYWNoaW5lTG9vcCAqTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU3BlY3VsYXRpdmVQcmVoZWFkZXIgPSBmYWxzZSkgY29uc3Q7CisKKyAgLy8vIFRoZSBpdGVyYXRvciBpbnRlcmZhY2UgdG8gdGhlIHRvcC1sZXZlbCBsb29wcyBpbiB0aGUgY3VycmVudCBmdW5jdGlvbi4KKyAgdXNpbmcgaXRlcmF0b3IgPSBMb29wSW5mb0Jhc2U8TWFjaGluZUJhc2ljQmxvY2ssIE1hY2hpbmVMb29wPjo6aXRlcmF0b3I7CisgIGlubGluZSBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIExJLmJlZ2luKCk7IH0KKyAgaW5saW5lIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIExJLmVuZCgpOyB9CisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBMSS5lbXB0eSgpOyB9CisKKyAgLy8vIFJldHVybiB0aGUgaW5uZXJtb3N0IGxvb3AgdGhhdCBCQiBsaXZlcyBpbi4gSWYgYSBiYXNpYyBibG9jayBpcyBpbiBubyBsb29wCisgIC8vLyAoZm9yIGV4YW1wbGUgdGhlIGVudHJ5IG5vZGUpLCBudWxsIGlzIHJldHVybmVkLgorICBpbmxpbmUgTWFjaGluZUxvb3AgKmdldExvb3BGb3IoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgcmV0dXJuIExJLmdldExvb3BGb3IoQkIpOworICB9CisKKyAgLy8vIFNhbWUgYXMgZ2V0TG9vcEZvci4KKyAgaW5saW5lIGNvbnN0IE1hY2hpbmVMb29wICpvcGVyYXRvcltdKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIHJldHVybiBMSS5nZXRMb29wRm9yKEJCKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGxvb3AgbmVzdGluZyBsZXZlbCBvZiB0aGUgc3BlY2lmaWVkIGJsb2NrLgorICBpbmxpbmUgdW5zaWduZWQgZ2V0TG9vcERlcHRoKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIHJldHVybiBMSS5nZXRMb29wRGVwdGgoQkIpOworICB9CisKKyAgLy8vIFRydWUgaWYgdGhlIGJsb2NrIGlzIGEgbG9vcCBoZWFkZXIgbm9kZS4KKyAgaW5saW5lIGJvb2wgaXNMb29wSGVhZGVyKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIHJldHVybiBMSS5pc0xvb3BIZWFkZXIoQkIpOworICB9CisKKyAgLy8vIENhbGN1bGF0ZSB0aGUgbmF0dXJhbCBsb29wIGluZm9ybWF0aW9uLgorICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmRikgb3ZlcnJpZGU7CisKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGUgeyBMSS5yZWxlYXNlTWVtb3J5KCk7IH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vLyBUaGlzIHJlbW92ZXMgdGhlIHNwZWNpZmllZCB0b3AtbGV2ZWwgbG9vcCBmcm9tIHRoaXMgbG9vcCBpbmZvIG9iamVjdC4gVGhlCisgIC8vLyBsb29wIGlzIG5vdCBkZWxldGVkLCBhcyBpdCB3aWxsIHByZXN1bWFibHkgYmUgaW5zZXJ0ZWQgaW50byBhbm90aGVyIGxvb3AuCisgIGlubGluZSBNYWNoaW5lTG9vcCAqcmVtb3ZlTG9vcChpdGVyYXRvciBJKSB7IHJldHVybiBMSS5yZW1vdmVMb29wKEkpOyB9CisKKyAgLy8vIENoYW5nZSB0aGUgdG9wLWxldmVsIGxvb3AgdGhhdCBjb250YWlucyBCQiB0byB0aGUgc3BlY2lmaWVkIGxvb3AuIFRoaXMKKyAgLy8vIHNob3VsZCBiZSB1c2VkIGJ5IHRyYW5zZm9ybWF0aW9ucyB0aGF0IHJlc3RydWN0dXJlIHRoZSBsb29wIGhpZXJhcmNoeQorICAvLy8gdHJlZS4KKyAgaW5saW5lIHZvaWQgY2hhbmdlTG9vcEZvcihNYWNoaW5lQmFzaWNCbG9jayAqQkIsIE1hY2hpbmVMb29wICpMKSB7CisgICAgTEkuY2hhbmdlTG9vcEZvcihCQiwgTCk7CisgIH0KKworICAvLy8gUmVwbGFjZSB0aGUgc3BlY2lmaWVkIGxvb3AgaW4gdGhlIHRvcC1sZXZlbCBsb29wcyBsaXN0IHdpdGggdGhlIGluZGljYXRlZAorICAvLy8gbG9vcC4KKyAgaW5saW5lIHZvaWQgY2hhbmdlVG9wTGV2ZWxMb29wKE1hY2hpbmVMb29wICpPbGRMb29wLCBNYWNoaW5lTG9vcCAqTmV3TG9vcCkgeworICAgIExJLmNoYW5nZVRvcExldmVsTG9vcChPbGRMb29wLCBOZXdMb29wKTsKKyAgfQorCisgIC8vLyBUaGlzIGFkZHMgdGhlIHNwZWNpZmllZCBsb29wIHRvIHRoZSBjb2xsZWN0aW9uIG9mIHRvcC1sZXZlbCBsb29wcy4KKyAgaW5saW5lIHZvaWQgYWRkVG9wTGV2ZWxMb29wKE1hY2hpbmVMb29wICpOZXcpIHsKKyAgICBMSS5hZGRUb3BMZXZlbExvb3AoTmV3KTsKKyAgfQorCisgIC8vLyBUaGlzIG1ldGhvZCBjb21wbGV0ZWx5IHJlbW92ZXMgQkIgZnJvbSBhbGwgZGF0YSBzdHJ1Y3R1cmVzLCBpbmNsdWRpbmcgYWxsCisgIC8vLyBvZiB0aGUgTG9vcCBvYmplY3RzIGl0IGlzIG5lc3RlZCBpbiBhbmQgb3VyIG1hcHBpbmcgZnJvbQorICAvLy8gTWFjaGluZUJhc2ljQmxvY2tzIHRvIGxvb3BzLgorICB2b2lkIHJlbW92ZUJsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgeworICAgIExJLnJlbW92ZUJsb2NrKEJCKTsKKyAgfQorfTsKKworLy8gQWxsb3cgY2xpZW50cyB0byB3YWxrIHRoZSBsaXN0IG9mIG5lc3RlZCBsb29wcy4uLgordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPGNvbnN0IE1hY2hpbmVMb29wKj4geworICB1c2luZyBOb2RlUmVmID0gY29uc3QgTWFjaGluZUxvb3AgKjsKKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSBNYWNoaW5lTG9vcEluZm86Oml0ZXJhdG9yOworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShjb25zdCBNYWNoaW5lTG9vcCAqTCkgeyByZXR1cm4gTDsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7IHJldHVybiBOLT5iZWdpbigpOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7IHJldHVybiBOLT5lbmQoKTsgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPE1hY2hpbmVMb29wKj4geworICB1c2luZyBOb2RlUmVmID0gTWFjaGluZUxvb3AgKjsKKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSBNYWNoaW5lTG9vcEluZm86Oml0ZXJhdG9yOworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShNYWNoaW5lTG9vcCAqTCkgeyByZXR1cm4gTDsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7IHJldHVybiBOLT5iZWdpbigpOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7IHJldHVybiBOLT5lbmQoKTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9NQUNISU5FTE9PUElORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVNZW1PcGVyYW5kLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZU1lbU9wZXJhbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWEwZDgwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVNZW1PcGVyYW5kLmgKQEAgLTAsMCArMSwzMjkgQEAKKy8vPT0tIGxsdm0vQ29kZUdlbi9NYWNoaW5lTWVtT3BlcmFuZC5oIC0gTWFjaGluZU1lbU9wZXJhbmQgY2xhc3MgLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgTWFjaGluZU1lbU9wZXJhbmQgY2xhc3MsIHdoaWNoIGlzIGEKKy8vIGRlc2NyaXB0aW9uIG9mIGEgbWVtb3J5IHJlZmVyZW5jZS4gSXQgaXMgdXNlZCB0byBoZWxwIHRyYWNrIGRlcGVuZGVuY2llcworLy8gaW4gdGhlIGJhY2tlbmQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORU1FTU9QRVJBTkRfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORU1FTU9QRVJBTkRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQml0bWFza0VudW0uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVyVW5pb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSVIvTWV0YWRhdGEuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiIC8vIFBvaW50ZXJMaWtlVHlwZVRyYWl0czxWYWx1ZSo+CisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0F0b21pY09yZGVyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZvbGRpbmdTZXROb2RlSUQ7CitjbGFzcyBNRE5vZGU7CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1vZHVsZVNsb3RUcmFja2VyOworCisvLy8gVGhpcyBjbGFzcyBjb250YWlucyBhIGRpc2NyaW1pbmF0ZWQgdW5pb24gb2YgaW5mb3JtYXRpb24gYWJvdXQgcG9pbnRlcnMgaW4KKy8vLyBtZW1vcnkgb3BlcmFuZHMsIHJlbGF0aW5nIHRoZW0gYmFjayB0byBMTFZNIElSIG9yIHRvIHZpcnR1YWwgbG9jYXRpb25zIChzdWNoCisvLy8gYXMgZnJhbWUgaW5kaWNlcykgdGhhdCBhcmUgZXhwb3NlZCBkdXJpbmcgY29kZWdlbi4KK3N0cnVjdCBNYWNoaW5lUG9pbnRlckluZm8geworICAvLy8gVGhpcyBpcyB0aGUgSVIgcG9pbnRlciB2YWx1ZSBmb3IgdGhlIGFjY2Vzcywgb3IgaXQgaXMgbnVsbCBpZiB1bmtub3duLgorICAvLy8gSWYgdGhpcyBpcyBudWxsLCB0aGVuIHRoZSBhY2Nlc3MgaXMgdG8gYSBwb2ludGVyIGluIHRoZSBkZWZhdWx0IGFkZHJlc3MKKyAgLy8vIHNwYWNlLgorICBQb2ludGVyVW5pb248Y29uc3QgVmFsdWUgKiwgY29uc3QgUHNldWRvU291cmNlVmFsdWUgKj4gVjsKKworICAvLy8gT2Zmc2V0IC0gVGhpcyBpcyBhbiBvZmZzZXQgZnJvbSB0aGUgYmFzZSBWYWx1ZSouCisgIGludDY0X3QgT2Zmc2V0OworCisgIHVpbnQ4X3QgU3RhY2tJRDsKKworICB1bnNpZ25lZCBBZGRyU3BhY2UgPSAwOworCisgIGV4cGxpY2l0IE1hY2hpbmVQb2ludGVySW5mbyhjb25zdCBWYWx1ZSAqdiwgaW50NjRfdCBvZmZzZXQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBJRCA9IDApCisgICAgICA6IFYodiksIE9mZnNldChvZmZzZXQpLCBTdGFja0lEKElEKSB7CisgICAgQWRkclNwYWNlID0gdiA/IHYtPmdldFR5cGUoKS0+Z2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpIDogMDsKKyAgfQorCisgIGV4cGxpY2l0IE1hY2hpbmVQb2ludGVySW5mbyhjb25zdCBQc2V1ZG9Tb3VyY2VWYWx1ZSAqdiwgaW50NjRfdCBvZmZzZXQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBJRCA9IDApCisgICAgICA6IFYodiksIE9mZnNldChvZmZzZXQpLCBTdGFja0lEKElEKSB7CisgICAgQWRkclNwYWNlID0gdiA/IHYtPmdldEFkZHJlc3NTcGFjZSgpIDogMDsKKyAgfQorCisgIGV4cGxpY2l0IE1hY2hpbmVQb2ludGVySW5mbyh1bnNpZ25lZCBBZGRyZXNzU3BhY2UgPSAwKQorICAgICAgOiBWKChjb25zdCBWYWx1ZSAqKW51bGxwdHIpLCBPZmZzZXQoMCksIFN0YWNrSUQoMCksCisgICAgICAgIEFkZHJTcGFjZShBZGRyZXNzU3BhY2UpIHt9CisKKyAgZXhwbGljaXQgTWFjaGluZVBvaW50ZXJJbmZvKAorICAgIFBvaW50ZXJVbmlvbjxjb25zdCBWYWx1ZSAqLCBjb25zdCBQc2V1ZG9Tb3VyY2VWYWx1ZSAqPiB2LAorICAgIGludDY0X3Qgb2Zmc2V0ID0gMCwKKyAgICB1aW50OF90IElEID0gMCkKKyAgICA6IFYodiksIE9mZnNldChvZmZzZXQpLCBTdGFja0lEKElEKSB7CisgICAgaWYgKFYpIHsKKyAgICAgIGlmIChjb25zdCBhdXRvICpWYWxQdHIgPSBWLmR5bl9jYXN0PGNvbnN0IFZhbHVlKj4oKSkKKyAgICAgICAgQWRkclNwYWNlID0gVmFsUHRyLT5nZXRUeXBlKCktPmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKTsKKyAgICAgIGVsc2UKKyAgICAgICAgQWRkclNwYWNlID0gVi5nZXQ8Y29uc3QgUHNldWRvU291cmNlVmFsdWUqPigpLT5nZXRBZGRyZXNzU3BhY2UoKTsKKyAgICB9CisgIH0KKworICBNYWNoaW5lUG9pbnRlckluZm8gZ2V0V2l0aE9mZnNldChpbnQ2NF90IE8pIGNvbnN0IHsKKyAgICBpZiAoVi5pc051bGwoKSkKKyAgICAgIHJldHVybiBNYWNoaW5lUG9pbnRlckluZm8oQWRkclNwYWNlKTsKKyAgICBpZiAoVi5pczxjb25zdCBWYWx1ZSo+KCkpCisgICAgICByZXR1cm4gTWFjaGluZVBvaW50ZXJJbmZvKFYuZ2V0PGNvbnN0IFZhbHVlKj4oKSwgT2Zmc2V0K08sIFN0YWNrSUQpOworICAgIHJldHVybiBNYWNoaW5lUG9pbnRlckluZm8oVi5nZXQ8Y29uc3QgUHNldWRvU291cmNlVmFsdWUqPigpLCBPZmZzZXQrTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YWNrSUQpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIG1lbW9yeSByZWdpb24gW1YsIFYrT2Zmc2V0K1NpemUpIGlzIGtub3duIHRvIGJlCisgIC8vLyBkZXJlZmVyZW5jZWFibGUuCisgIGJvb2wgaXNEZXJlZmVyZW5jZWFibGUodW5zaWduZWQgU2l6ZSwgTExWTUNvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIExMVk0gSVIgYWRkcmVzcyBzcGFjZSBudW1iZXIgdGhhdCB0aGlzIHBvaW50ZXIgcG9pbnRzIGludG8uCisgIHVuc2lnbmVkIGdldEFkZHJTcGFjZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBNYWNoaW5lUG9pbnRlckluZm8gcmVjb3JkIHRoYXQgcmVmZXJzIHRvIHRoZSBjb25zdGFudCBwb29sLgorICBzdGF0aWMgTWFjaGluZVBvaW50ZXJJbmZvIGdldENvbnN0YW50UG9vbChNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworICAvLy8gUmV0dXJuIGEgTWFjaGluZVBvaW50ZXJJbmZvIHJlY29yZCB0aGF0IHJlZmVycyB0byB0aGUgc3BlY2lmaWVkCisgIC8vLyBGcmFtZUluZGV4LgorICBzdGF0aWMgTWFjaGluZVBvaW50ZXJJbmZvIGdldEZpeGVkU3RhY2soTWFjaGluZUZ1bmN0aW9uICZNRiwgaW50IEZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBPZmZzZXQgPSAwKTsKKworICAvLy8gUmV0dXJuIGEgTWFjaGluZVBvaW50ZXJJbmZvIHJlY29yZCB0aGF0IHJlZmVycyB0byBhIGp1bXAgdGFibGUgZW50cnkuCisgIHN0YXRpYyBNYWNoaW5lUG9pbnRlckluZm8gZ2V0SnVtcFRhYmxlKE1hY2hpbmVGdW5jdGlvbiAmTUYpOworCisgIC8vLyBSZXR1cm4gYSBNYWNoaW5lUG9pbnRlckluZm8gcmVjb3JkIHRoYXQgcmVmZXJzIHRvIGEgR09UIGVudHJ5LgorICBzdGF0aWMgTWFjaGluZVBvaW50ZXJJbmZvIGdldEdPVChNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworICAvLy8gU3RhY2sgcG9pbnRlciByZWxhdGl2ZSBhY2Nlc3MuCisgIHN0YXRpYyBNYWNoaW5lUG9pbnRlckluZm8gZ2V0U3RhY2soTWFjaGluZUZ1bmN0aW9uICZNRiwgaW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBJRCA9IDApOworCisgIC8vLyBTdGFjayBtZW1vcnkgd2l0aG91dCBvdGhlciBpbmZvcm1hdGlvbi4KKyAgc3RhdGljIE1hY2hpbmVQb2ludGVySW5mbyBnZXRVbmtub3duU3RhY2soTWFjaGluZUZ1bmN0aW9uICZNRik7Cit9OworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQSBkZXNjcmlwdGlvbiBvZiBhIG1lbW9yeSByZWZlcmVuY2UgdXNlZCBpbiB0aGUgYmFja2VuZC4KKy8vLyBJbnN0ZWFkIG9mIGhvbGRpbmcgYSBTdG9yZUluc3Qgb3IgTG9hZEluc3QsIHRoaXMgY2xhc3MgaG9sZHMgdGhlIGFkZHJlc3MKKy8vLyBWYWx1ZSBvZiB0aGUgcmVmZXJlbmNlIGFsb25nIHdpdGggYSBieXRlIHNpemUgYW5kIG9mZnNldC4gVGhpcyBhbGxvd3MgaXQKKy8vLyB0byBkZXNjcmliZSBsb3dlcmVkIGxvYWRzIGFuZCBzdG9yZXMuIEFsc28sIHRoZSBzcGVjaWFsIFBzZXVkb1NvdXJjZVZhbHVlCisvLy8gb2JqZWN0cyBjYW4gYmUgdXNlZCB0byByZXByZXNlbnQgbG9hZHMgYW5kIHN0b3JlcyB0byBtZW1vcnkgbG9jYXRpb25zCisvLy8gdGhhdCBhcmVuJ3QgZXhwbGljaXQgaW4gdGhlIHJlZ3VsYXIgTExWTSBJUi4KKy8vLworY2xhc3MgTWFjaGluZU1lbU9wZXJhbmQgeworcHVibGljOgorICAvLy8gRmxhZ3MgdmFsdWVzLiBUaGVzZSBtYXkgYmUgb3InZCB0b2dldGhlci4KKyAgZW51bSBGbGFncyA6IHVpbnQxNl90IHsKKyAgICAvLyBObyBmbGFncyBzZXQuCisgICAgTU9Ob25lID0gMCwKKyAgICAvLy8gVGhlIG1lbW9yeSBhY2Nlc3MgcmVhZHMgZGF0YS4KKyAgICBNT0xvYWQgPSAxdSA8PCAwLAorICAgIC8vLyBUaGUgbWVtb3J5IGFjY2VzcyB3cml0ZXMgZGF0YS4KKyAgICBNT1N0b3JlID0gMXUgPDwgMSwKKyAgICAvLy8gVGhlIG1lbW9yeSBhY2Nlc3MgaXMgdm9sYXRpbGUuCisgICAgTU9Wb2xhdGlsZSA9IDF1IDw8IDIsCisgICAgLy8vIFRoZSBtZW1vcnkgYWNjZXNzIGlzIG5vbi10ZW1wb3JhbC4KKyAgICBNT05vblRlbXBvcmFsID0gMXUgPDwgMywKKyAgICAvLy8gVGhlIG1lbW9yeSBhY2Nlc3MgaXMgZGVyZWZlcmVuY2VhYmxlIChpLmUuLCBkb2Vzbid0IHRyYXApLgorICAgIE1PRGVyZWZlcmVuY2VhYmxlID0gMXUgPDwgNCwKKyAgICAvLy8gVGhlIG1lbW9yeSBhY2Nlc3MgYWx3YXlzIHJldHVybnMgdGhlIHNhbWUgdmFsdWUgKG9yIHRyYXBzKS4KKyAgICBNT0ludmFyaWFudCA9IDF1IDw8IDUsCisKKyAgICAvLyBSZXNlcnZlZCBmb3IgdXNlIGJ5IHRhcmdldC1zcGVjaWZpYyBwYXNzZXMuCisgICAgLy8gVGFyZ2V0cyBtYXkgb3ZlcnJpZGUgZ2V0U2VyaWFsaXphYmxlTWFjaGluZU1lbU9wZXJhbmRUYXJnZXRGbGFncygpIHRvCisgICAgLy8gZW5hYmxlIE1JUiBzZXJpYWxpemF0aW9uL3BhcnNpbmcgb2YgdGhlc2UgZmxhZ3MuICBJZiBtb3JlIG9mIHRoZXNlIGZsYWdzCisgICAgLy8gYXJlIGFkZGVkLCB0aGUgTUlSIHByaW50aW5nL3BhcnNpbmcgY29kZSB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZCBhcyB3ZWxsLgorICAgIE1PVGFyZ2V0RmxhZzEgPSAxdSA8PCA2LAorICAgIE1PVGFyZ2V0RmxhZzIgPSAxdSA8PCA3LAorICAgIE1PVGFyZ2V0RmxhZzMgPSAxdSA8PCA4LAorCisgICAgTExWTV9NQVJLX0FTX0JJVE1BU0tfRU5VTSgvKiBMYXJnZXN0RmxhZyA9ICovIE1PVGFyZ2V0RmxhZzMpCisgIH07CisKK3ByaXZhdGU6CisgIC8vLyBBdG9taWMgaW5mb3JtYXRpb24gZm9yIHRoaXMgbWVtb3J5IG9wZXJhdGlvbi4KKyAgc3RydWN0IE1hY2hpbmVBdG9taWNJbmZvIHsKKyAgICAvLy8gU3luY2hyb25pemF0aW9uIHNjb3BlIElEIGZvciB0aGlzIG1lbW9yeSBvcGVyYXRpb24uCisgICAgdW5zaWduZWQgU1NJRCA6IDg7ICAgICAgICAgICAgLy8gU3luY1Njb3BlOjpJRAorICAgIC8vLyBBdG9taWMgb3JkZXJpbmcgcmVxdWlyZW1lbnRzIGZvciB0aGlzIG1lbW9yeSBvcGVyYXRpb24uIEZvciBjbXB4Y2hnCisgICAgLy8vIGF0b21pYyBvcGVyYXRpb25zLCBhdG9taWMgb3JkZXJpbmcgcmVxdWlyZW1lbnRzIHdoZW4gc3RvcmUgb2NjdXJzLgorICAgIHVuc2lnbmVkIE9yZGVyaW5nIDogNDsgICAgICAgIC8vIGVudW0gQXRvbWljT3JkZXJpbmcKKyAgICAvLy8gRm9yIGNtcHhjaGcgYXRvbWljIG9wZXJhdGlvbnMsIGF0b21pYyBvcmRlcmluZyByZXF1aXJlbWVudHMgd2hlbiBzdG9yZQorICAgIC8vLyBkb2VzIG5vdCBvY2N1ci4KKyAgICB1bnNpZ25lZCBGYWlsdXJlT3JkZXJpbmcgOiA0OyAvLyBlbnVtIEF0b21pY09yZGVyaW5nCisgIH07CisKKyAgTWFjaGluZVBvaW50ZXJJbmZvIFB0ckluZm87CisgIHVpbnQ2NF90IFNpemU7CisgIEZsYWdzIEZsYWdWYWxzOworICB1aW50MTZfdCBCYXNlQWxpZ25Mb2cyOyAvLyBsb2dfMihiYXNlX2FsaWdubWVudCkgKyAxCisgIE1hY2hpbmVBdG9taWNJbmZvIEF0b21pY0luZm87CisgIEFBTUROb2RlcyBBQUluZm87CisgIGNvbnN0IE1ETm9kZSAqUmFuZ2VzOworCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3QgYSBNYWNoaW5lTWVtT3BlcmFuZCBvYmplY3Qgd2l0aCB0aGUgc3BlY2lmaWVkIFB0ckluZm8sIGZsYWdzLAorICAvLy8gc2l6ZSwgYW5kIGJhc2UgYWxpZ25tZW50LiBGb3IgYXRvbWljIG9wZXJhdGlvbnMgdGhlIHN5bmNocm9uaXphdGlvbiBzY29wZQorICAvLy8gYW5kIGF0b21pYyBvcmRlcmluZyByZXF1aXJlbWVudHMgbXVzdCBhbHNvIGJlIHNwZWNpZmllZC4gRm9yIGNtcHhjaGcKKyAgLy8vIGF0b21pYyBvcGVyYXRpb25zIHRoZSBhdG9taWMgb3JkZXJpbmcgcmVxdWlyZW1lbnRzIHdoZW4gc3RvcmUgZG9lcyBub3QKKyAgLy8vIG9jY3VyIG11c3QgYWxzbyBiZSBzcGVjaWZpZWQuCisgIE1hY2hpbmVNZW1PcGVyYW5kKE1hY2hpbmVQb2ludGVySW5mbyBQdHJJbmZvLCBGbGFncyBmbGFncywgdWludDY0X3QgcywKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgYmFzZV9hbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFBTUROb2RlcyAmQUFJbmZvID0gQUFNRE5vZGVzKCksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ETm9kZSAqUmFuZ2VzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgU3luY1Njb3BlOjpJRCBTU0lEID0gU3luY1Njb3BlOjpTeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgIEF0b21pY09yZGVyaW5nIE9yZGVyaW5nID0gQXRvbWljT3JkZXJpbmc6Ok5vdEF0b21pYywKKyAgICAgICAgICAgICAgICAgICAgQXRvbWljT3JkZXJpbmcgRmFpbHVyZU9yZGVyaW5nID0gQXRvbWljT3JkZXJpbmc6Ok5vdEF0b21pYyk7CisKKyAgY29uc3QgTWFjaGluZVBvaW50ZXJJbmZvICZnZXRQb2ludGVySW5mbygpIGNvbnN0IHsgcmV0dXJuIFB0ckluZm87IH0KKworICAvLy8gUmV0dXJuIHRoZSBiYXNlIGFkZHJlc3Mgb2YgdGhlIG1lbW9yeSBhY2Nlc3MuIFRoaXMgbWF5IGVpdGhlciBiZSBhIG5vcm1hbAorICAvLy8gTExWTSBJUiBWYWx1ZSwgb3Igb25lIG9mIHRoZSBzcGVjaWFsIHZhbHVlcyB1c2VkIGluIENvZGVHZW4uCisgIC8vLyBTcGVjaWFsIHZhbHVlcyBhcmUgdGhvc2Ugb2J0YWluZWQgdmlhCisgIC8vLyBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0Rml4ZWRTdGFjayhpbnQpLCBQc2V1ZG9Tb3VyY2VWYWx1ZTo6Z2V0U3RhY2ssIGFuZAorICAvLy8gb3RoZXIgUHNldWRvU291cmNlVmFsdWUgbWVtYmVyIGZ1bmN0aW9ucyB3aGljaCByZXR1cm4gb2JqZWN0cyB3aGljaCBzdGFuZAorICAvLy8gZm9yIGZyYW1lL3N0YWNrIHBvaW50ZXIgcmVsYXRpdmUgcmVmZXJlbmNlcyBhbmQgb3RoZXIgc3BlY2lhbCByZWZlcmVuY2VzCisgIC8vLyB3aGljaCBhcmUgbm90IHJlcHJlc2VudGFibGUgaW4gdGhlIGhpZ2gtbGV2ZWwgSVIuCisgIGNvbnN0IFZhbHVlICpnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFB0ckluZm8uVi5keW5fY2FzdDxjb25zdCBWYWx1ZSo+KCk7IH0KKworICBjb25zdCBQc2V1ZG9Tb3VyY2VWYWx1ZSAqZ2V0UHNldWRvVmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIFB0ckluZm8uVi5keW5fY2FzdDxjb25zdCBQc2V1ZG9Tb3VyY2VWYWx1ZSo+KCk7CisgIH0KKworICBjb25zdCB2b2lkICpnZXRPcGFxdWVWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFB0ckluZm8uVi5nZXRPcGFxdWVWYWx1ZSgpOyB9CisKKyAgLy8vIFJldHVybiB0aGUgcmF3IGZsYWdzIG9mIHRoZSBzb3VyY2UgdmFsdWUsIFxzZWUgRmxhZ3MuCisgIEZsYWdzIGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gRmxhZ1ZhbHM7IH0KKworICAvLy8gQml0d2lzZSBPUiB0aGUgY3VycmVudCBmbGFncyB3aXRoIHRoZSBnaXZlbiBmbGFncy4KKyAgdm9pZCBzZXRGbGFncyhGbGFncyBmKSB7IEZsYWdWYWxzIHw9IGY7IH0KKworICAvLy8gRm9yIG5vcm1hbCB2YWx1ZXMsIHRoaXMgaXMgYSBieXRlIG9mZnNldCBhZGRlZCB0byB0aGUgYmFzZSBhZGRyZXNzLgorICAvLy8gRm9yIFBzZXVkb1NvdXJjZVZhbHVlOjpGUFJlbCB2YWx1ZXMsIHRoaXMgaXMgdGhlIEZyYW1lSW5kZXggbnVtYmVyLgorICBpbnQ2NF90IGdldE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIFB0ckluZm8uT2Zmc2V0OyB9CisKKyAgdW5zaWduZWQgZ2V0QWRkclNwYWNlKCkgY29uc3QgeyByZXR1cm4gUHRySW5mby5nZXRBZGRyU3BhY2UoKTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG1lbW9yeSByZWZlcmVuY2UuCisgIHVpbnQ2NF90IGdldFNpemUoKSBjb25zdCB7IHJldHVybiBTaXplOyB9CisKKyAgLy8vIFJldHVybiB0aGUgbWluaW11bSBrbm93biBhbGlnbm1lbnQgaW4gYnl0ZXMgb2YgdGhlIGFjdHVhbCBtZW1vcnkKKyAgLy8vIHJlZmVyZW5jZS4KKyAgdWludDY0X3QgZ2V0QWxpZ25tZW50KCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgbWluaW11bSBrbm93biBhbGlnbm1lbnQgaW4gYnl0ZXMgb2YgdGhlIGJhc2UgYWRkcmVzcywgd2l0aG91dAorICAvLy8gdGhlIG9mZnNldC4KKyAgdWludDY0X3QgZ2V0QmFzZUFsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuICgxdSA8PCBCYXNlQWxpZ25Mb2cyKSA+PiAxOyB9CisKKyAgLy8vIFJldHVybiB0aGUgQUEgdGFncyBmb3IgdGhlIG1lbW9yeSByZWZlcmVuY2UuCisgIEFBTUROb2RlcyBnZXRBQUluZm8oKSBjb25zdCB7IHJldHVybiBBQUluZm87IH0KKworICAvLy8gUmV0dXJuIHRoZSByYW5nZSB0YWcgZm9yIHRoZSBtZW1vcnkgcmVmZXJlbmNlLgorICBjb25zdCBNRE5vZGUgKmdldFJhbmdlcygpIGNvbnN0IHsgcmV0dXJuIFJhbmdlczsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBzeW5jaHJvbml6YXRpb24gc2NvcGUgSUQgZm9yIHRoaXMgbWVtb3J5IG9wZXJhdGlvbi4KKyAgU3luY1Njb3BlOjpJRCBnZXRTeW5jU2NvcGVJRCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8U3luY1Njb3BlOjpJRD4oQXRvbWljSW5mby5TU0lEKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGF0b21pYyBvcmRlcmluZyByZXF1aXJlbWVudHMgZm9yIHRoaXMgbWVtb3J5IG9wZXJhdGlvbi4gRm9yCisgIC8vLyBjbXB4Y2hnIGF0b21pYyBvcGVyYXRpb25zLCByZXR1cm4gdGhlIGF0b21pYyBvcmRlcmluZyByZXF1aXJlbWVudHMgd2hlbgorICAvLy8gc3RvcmUgb2NjdXJzLgorICBBdG9taWNPcmRlcmluZyBnZXRPcmRlcmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QXRvbWljT3JkZXJpbmc+KEF0b21pY0luZm8uT3JkZXJpbmcpOworICB9CisKKyAgLy8vIEZvciBjbXB4Y2hnIGF0b21pYyBvcGVyYXRpb25zLCByZXR1cm4gdGhlIGF0b21pYyBvcmRlcmluZyByZXF1aXJlbWVudHMKKyAgLy8vIHdoZW4gc3RvcmUgZG9lcyBub3Qgb2NjdXIuCisgIEF0b21pY09yZGVyaW5nIGdldEZhaWx1cmVPcmRlcmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QXRvbWljT3JkZXJpbmc+KEF0b21pY0luZm8uRmFpbHVyZU9yZGVyaW5nKTsKKyAgfQorCisgIGJvb2wgaXNMb2FkKCkgY29uc3QgeyByZXR1cm4gRmxhZ1ZhbHMgJiBNT0xvYWQ7IH0KKyAgYm9vbCBpc1N0b3JlKCkgY29uc3QgeyByZXR1cm4gRmxhZ1ZhbHMgJiBNT1N0b3JlOyB9CisgIGJvb2wgaXNWb2xhdGlsZSgpIGNvbnN0IHsgcmV0dXJuIEZsYWdWYWxzICYgTU9Wb2xhdGlsZTsgfQorICBib29sIGlzTm9uVGVtcG9yYWwoKSBjb25zdCB7IHJldHVybiBGbGFnVmFscyAmIE1PTm9uVGVtcG9yYWw7IH0KKyAgYm9vbCBpc0RlcmVmZXJlbmNlYWJsZSgpIGNvbnN0IHsgcmV0dXJuIEZsYWdWYWxzICYgTU9EZXJlZmVyZW5jZWFibGU7IH0KKyAgYm9vbCBpc0ludmFyaWFudCgpIGNvbnN0IHsgcmV0dXJuIEZsYWdWYWxzICYgTU9JbnZhcmlhbnQ7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgb3BlcmF0aW9uIGhhcyBhbiBhdG9taWMgb3JkZXJpbmcgcmVxdWlyZW1lbnQgb2YKKyAgLy8vIHVub3JkZXJlZCBvciBoaWdoZXIsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBpc0F0b21pYygpIGNvbnN0IHsgcmV0dXJuIGdldE9yZGVyaW5nKCkgIT0gQXRvbWljT3JkZXJpbmc6Ok5vdEF0b21pYzsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBtZW1vcnkgb3BlcmF0aW9uIGRvZXNuJ3QgaGF2ZSBhbnkgb3JkZXJpbmcKKyAgLy8vIGNvbnN0cmFpbnRzIG90aGVyIHRoYW4gbm9ybWFsIGFsaWFzaW5nLiBWb2xhdGlsZSBhbmQgYXRvbWljIG1lbW9yeQorICAvLy8gb3BlcmF0aW9ucyBjYW4ndCBiZSByZW9yZGVyZWQuCisgIC8vLworICAvLy8gQ3VycmVudGx5LCB3ZSBkb24ndCBtb2RlbCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHZvbGF0aWxlIGFuZCBhdG9taWMKKyAgLy8vIG9wZXJhdGlvbnMuIFRoZXkgc2hvdWxkIHJldGFpbiB0aGVpciBvcmRlcmluZyByZWxhdGl2ZSB0byBhbGwgbWVtb3J5CisgIC8vLyBvcGVyYXRpb25zLgorICBib29sIGlzVW5vcmRlcmVkKCkgY29uc3QgeyByZXR1cm4gIWlzVm9sYXRpbGUoKTsgfQorCisgIC8vLyBVcGRhdGUgdGhpcyBNYWNoaW5lTWVtT3BlcmFuZCB0byByZWZsZWN0IHRoZSBhbGlnbm1lbnQgb2YgTU1PLCBpZiBpdCBoYXMgYQorICAvLy8gZ3JlYXRlciBhbGlnbm1lbnQuIFRoaXMgbXVzdCBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgbmV3IGFsaWdubWVudCBhcHBsaWVzCisgIC8vLyB0byBhbGwgdXNlcnMgb2YgdGhpcyBNYWNoaW5lTWVtT3BlcmFuZC4KKyAgdm9pZCByZWZpbmVBbGlnbm1lbnQoY29uc3QgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisKKyAgLy8vIENoYW5nZSB0aGUgU291cmNlVmFsdWUgZm9yIHRoaXMgTWFjaGluZU1lbU9wZXJhbmQuIFRoaXMgc2hvdWxkIG9ubHkgYmUKKyAgLy8vIHVzZWQgd2hlbiBhbiBvYmplY3QgaXMgYmVpbmcgcmVsb2NhdGVkIGFuZCBhbGwgcmVmZXJlbmNlcyB0byBpdCBhcmUgYmVpbmcKKyAgLy8vIHVwZGF0ZWQuCisgIHZvaWQgc2V0VmFsdWUoY29uc3QgVmFsdWUgKk5ld1NWKSB7IFB0ckluZm8uViA9IE5ld1NWOyB9CisgIHZvaWQgc2V0VmFsdWUoY29uc3QgUHNldWRvU291cmNlVmFsdWUgKk5ld1NWKSB7IFB0ckluZm8uViA9IE5ld1NWOyB9CisgIHZvaWQgc2V0T2Zmc2V0KGludDY0X3QgTmV3T2Zmc2V0KSB7IFB0ckluZm8uT2Zmc2V0ID0gTmV3T2Zmc2V0OyB9CisKKyAgLy8vIFByb2ZpbGUgLSBHYXRoZXIgdW5pcXVlIGRhdGEgZm9yIHRoZSBvYmplY3QuCisgIC8vLworICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OworCisgIC8vLyBTdXBwb3J0IGZvciBvcGVyYXRvcjw8LgorICAvLy8gQHsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgTW9kdWxlU2xvdFRyYWNrZXIgJk1TVCkgY29uc3Q7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBNb2R1bGVTbG90VHJhY2tlciAmTVNULAorICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTdHJpbmdSZWY+ICZTU05zLCBjb25zdCBMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICBjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkksIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJKSBjb25zdDsKKyAgLy8vIEB9CisKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYWNoaW5lTWVtT3BlcmFuZCAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVNZW1PcGVyYW5kICZSSFMpIHsKKyAgICByZXR1cm4gTEhTLmdldFZhbHVlKCkgPT0gUkhTLmdldFZhbHVlKCkgJiYKKyAgICAgICAgICAgTEhTLmdldFBzZXVkb1ZhbHVlKCkgPT0gUkhTLmdldFBzZXVkb1ZhbHVlKCkgJiYKKyAgICAgICAgICAgTEhTLmdldFNpemUoKSA9PSBSSFMuZ2V0U2l6ZSgpICYmCisgICAgICAgICAgIExIUy5nZXRPZmZzZXQoKSA9PSBSSFMuZ2V0T2Zmc2V0KCkgJiYKKyAgICAgICAgICAgTEhTLmdldEZsYWdzKCkgPT0gUkhTLmdldEZsYWdzKCkgJiYKKyAgICAgICAgICAgTEhTLmdldEFBSW5mbygpID09IFJIUy5nZXRBQUluZm8oKSAmJgorICAgICAgICAgICBMSFMuZ2V0UmFuZ2VzKCkgPT0gUkhTLmdldFJhbmdlcygpICYmCisgICAgICAgICAgIExIUy5nZXRBbGlnbm1lbnQoKSA9PSBSSFMuZ2V0QWxpZ25tZW50KCkgJiYKKyAgICAgICAgICAgTEhTLmdldEFkZHJTcGFjZSgpID09IFJIUy5nZXRBZGRyU3BhY2UoKTsKKyAgfQorCisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgTWFjaGluZU1lbU9wZXJhbmQgJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lTWVtT3BlcmFuZCAmUkhTKSB7CisgICAgcmV0dXJuICEoTEhTID09IFJIUyk7CisgIH0KK307CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1hY2hpbmVNZW1PcGVyYW5kICZNUk8pIHsKKyAgTVJPLnByaW50KE9TKTsKKyAgcmV0dXJuIE9TOworfQorCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVNb2R1bGVJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJlMzA0ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mby5oCkBAIC0wLDAgKzEsMjcxIEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mby5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIENvbGxlY3QgbWV0YSBpbmZvcm1hdGlvbiBmb3IgYSBtb2R1bGUuICBUaGlzIGluZm9ybWF0aW9uIHNob3VsZCBiZSBpbiBhCisvLyBuZXV0cmFsIGZvcm0gdGhhdCBjYW4gYmUgdXNlZCBieSBkaWZmZXJlbnQgZGVidWdnaW5nIGFuZCBleGNlcHRpb24gaGFuZGxpbmcKKy8vIHNjaGVtZXMuCisvLworLy8gVGhlIG9yZ2FuaXphdGlvbiBvZiBpbmZvcm1hdGlvbiBpcyBwcmltYXJpbHkgY2x1c3RlcmVkIGFyb3VuZCB0aGUgc291cmNlCisvLyBjb21waWxlIHVuaXRzLiAgVGhlIG1haW4gZXhjZXB0aW9uIGlzIHNvdXJjZSBsaW5lIGNvcnJlc3BvbmRlbmNlIHdoZXJlCisvLyBpbmxpbmluZyBtYXkgaW50ZXJsZWF2ZSBjb2RlIGZyb20gdmFyaW91cyBjb21waWxlIHVuaXRzLgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgaW5mb3JtYXRpb24gY2FuIGJlIHJldHJpZXZlZCBmcm9tIHRoZSBNYWNoaW5lTW9kdWxlSW5mby4KKy8vCisvLyAgLS0gU291cmNlIGRpcmVjdG9yaWVzIC0gRGlyZWN0b3JpZXMgYXJlIHVuaXF1ZWQgYmFzZWQgb24gdGhlaXIgY2Fub25pY2FsCisvLyAgICAgc3RyaW5nIGFuZCBhc3NpZ25lZCBhIHNlcXVlbnRpYWwgbnVtZXJpYyBJRCAoYmFzZSAxLikKKy8vICAtLSBTb3VyY2UgZmlsZXMgLSBGaWxlcyBhcmUgYWxzbyB1bmlxdWVkIGJhc2VkIG9uIHRoZWlyIG5hbWUgYW5kIGRpcmVjdG9yeQorLy8gICAgIElELiAgQSBmaWxlIElEIGlzIHNlcXVlbnRpYWwgbnVtYmVyIChiYXNlIDEuKQorLy8gIC0tIFNvdXJjZSBsaW5lIGNvcnJlc3BvbmRlbmNlIC0gQSB2ZWN0b3Igb2YgZmlsZSBJRCwgbGluZSMsIGNvbHVtbiMgdHJpcGxlcy4KKy8vICAgICBBIERFQlVHX0xPQ0FUSU9OIGluc3RydWN0aW9uIGlzIGdlbmVyYXRlZCAgYnkgdGhlIERBRyBMZWdhbGl6ZXIKKy8vICAgICBjb3JyZXNwb25kaW5nIHRvIGVhY2ggZW50cnkgaW4gdGhlIHNvdXJjZSBsaW5lIGxpc3QuICBUaGlzIGFsbG93cyBhIGRlYnVnCisvLyAgICAgZW1pdHRlciB0byBnZW5lcmF0ZSBsYWJlbHMgcmVmZXJlbmNlZCBieSBkZWJ1ZyBpbmZvcm1hdGlvbiB0YWJsZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORU1PRFVMRUlORk9fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORU1PRFVMRUlORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0NvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBDYWxsSW5zdDsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTU1JQWRkckxhYmVsTWFwOworY2xhc3MgTW9kdWxlOworY2xhc3MgVGFyZ2V0TWFjaGluZTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBUaGlzIGNsYXNzIGNhbiBiZSBkZXJpdmVkIGZyb20gYW5kIHVzZWQgYnkgdGFyZ2V0cyB0byBob2xkIHByaXZhdGUKKy8vLyB0YXJnZXQtc3BlY2lmaWMgaW5mb3JtYXRpb24gZm9yIGVhY2ggTW9kdWxlLiAgT2JqZWN0cyBvZiB0eXBlIGFyZQorLy8vIGFjY2Vzc2VkL2NyZWF0ZWQgd2l0aCBNTUk6OmdldEluZm8gYW5kIGRlc3Ryb3llZCB3aGVuIHRoZSBNYWNoaW5lTW9kdWxlSW5mbworLy8vIGlzIGRlc3Ryb3llZC4KKy8vLworY2xhc3MgTWFjaGluZU1vZHVsZUluZm9JbXBsIHsKK3B1YmxpYzoKKyAgdXNpbmcgU3R1YlZhbHVlVHkgPSBQb2ludGVySW50UGFpcjxNQ1N5bWJvbCAqLCAxLCBib29sPjsKKyAgdXNpbmcgU3ltYm9sTGlzdFR5ID0gc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPE1DU3ltYm9sICosIFN0dWJWYWx1ZVR5Pj47CisKKyAgdmlydHVhbCB+TWFjaGluZU1vZHVsZUluZm9JbXBsKCk7CisKK3Byb3RlY3RlZDoKKyAgLy8vIFJldHVybiB0aGUgZW50cmllcyBmcm9tIGEgRGVuc2VNYXAgaW4gYSBkZXRlcm1pbmlzdGljIHNvcnRlZCBvcmVyLgorICAvLy8gQ2xlYXJzIHRoZSBtYXAuCisgIHN0YXRpYyBTeW1ib2xMaXN0VHkgZ2V0U29ydGVkU3R1YnMoRGVuc2VNYXA8TUNTeW1ib2wqLCBTdHViVmFsdWVUeT4mKTsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gVGhpcyBjbGFzcyBjb250YWlucyBtZXRhIGluZm9ybWF0aW9uIHNwZWNpZmljIHRvIGEgbW9kdWxlLiAgUXVlcmllcyBjYW4gYmUKKy8vLyBtYWRlIGJ5IGRpZmZlcmVudCBkZWJ1Z2dpbmcgYW5kIGV4Y2VwdGlvbiBoYW5kbGluZyBzY2hlbWVzIGFuZCByZWZvcm1hdGVkCisvLy8gZm9yIHNwZWNpZmljIHVzZS4KKy8vLworY2xhc3MgTWFjaGluZU1vZHVsZUluZm8gOiBwdWJsaWMgSW1tdXRhYmxlUGFzcyB7CisgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNOworCisgIC8vLyBUaGlzIGlzIHRoZSBNQ0NvbnRleHQgdXNlZCBmb3IgdGhlIGVudGlyZSBjb2RlIGdlbmVyYXRvci4KKyAgTUNDb250ZXh0IENvbnRleHQ7CisKKyAgLy8vIFRoaXMgaXMgdGhlIExMVk0gTW9kdWxlIGJlaW5nIHdvcmtlZCBvbi4KKyAgY29uc3QgTW9kdWxlICpUaGVNb2R1bGU7CisKKyAgLy8vIFRoaXMgaXMgdGhlIG9iamVjdC1maWxlLWZvcm1hdC1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZgorICAvLy8gTWFjaGluZU1vZHVsZUluZm9JbXBsLCB3aGljaCBsZXRzIHRhcmdldHMgYWNjdW11bGF0ZSB3aGF0ZXZlciBpbmZvIHRoZXkKKyAgLy8vIHdhbnQuCisgIE1hY2hpbmVNb2R1bGVJbmZvSW1wbCAqT2JqRmlsZU1NSTsKKworICAvLy8gXG5hbWUgRXhjZXB0aW9uIEhhbmRsaW5nCisgIC8vLyBceworCisgIC8vLyBWZWN0b3Igb2YgYWxsIHBlcnNvbmFsaXR5IGZ1bmN0aW9ucyBldmVyIHNlZW4uIFVzZWQgdG8gZW1pdCBjb21tb24gRUgKKyAgLy8vIGZyYW1lcy4KKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRnVuY3Rpb24gKj4gUGVyc29uYWxpdGllczsKKworICAvLy8gVGhlIGN1cnJlbnQgY2FsbCBzaXRlIGluZGV4IGJlaW5nIHByb2Nlc3NlZCwgaWYgYW55LiAwIGlmIG5vbmUuCisgIHVuc2lnbmVkIEN1ckNhbGxTaXRlOworCisgIC8vLyBcfQorCisgIC8vLyBUaGlzIG1hcCBrZWVwcyB0cmFjayBvZiB3aGljaCBzeW1ib2wgaXMgYmVpbmcgdXNlZCBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gYmFzaWMgYmxvY2sncyBhZGRyZXNzIG9mIGxhYmVsLgorICBNTUlBZGRyTGFiZWxNYXAgKkFkZHJMYWJlbFN5bWJvbHM7CisKKyAgLy8gVE9ETzogSWRlYWxseSwgd2hhdCB3ZSdkIGxpa2UgaXMgdG8gaGF2ZSBhIHN3aXRjaCB0aGF0IGFsbG93cyBlbWl0dGluZyAKKyAgLy8gc3luY2hyb25vdXMgKHByZWNpc2UgYXQgY2FsbC1zaXRlcyBvbmx5KSBDRkEgaW50byAuZWhfZnJhbWUuIEhvd2V2ZXIsCisgIC8vIGV2ZW4gdW5kZXIgdGhpcyBzd2l0Y2gsIHdlJ2QgbGlrZSAuZGVidWdfZnJhbWUgdG8gYmUgcHJlY2lzZSB3aGVuIHVzaW5nCisgIC8vIC1nLiBBdCB0aGlzIG1vbWVudCwgdGhlcmUncyBubyB3YXkgdG8gc3BlY2lmeSB0aGF0IHNvbWUgQ0ZJIGRpcmVjdGl2ZXMKKyAgLy8gZ28gaW50byAuZWhfZnJhbWUgb25seSwgd2hpbGUgb3RoZXJzIGdvIGludG8gLmRlYnVnX2ZyYW1lIG9ubHkuCisKKyAgLy8vIFRydWUgaWYgZGVidWdnaW5nIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSBpbiB0aGlzIG1vZHVsZS4KKyAgYm9vbCBEYmdJbmZvQXZhaWxhYmxlOworCisgIC8vLyBUcnVlIGlmIHRoaXMgbW9kdWxlIGNhbGxzIFZhckFyZyBmdW5jdGlvbiB3aXRoIGZsb2F0aW5nLXBvaW50IGFyZ3VtZW50cy4KKyAgLy8vIFRoaXMgaXMgdXNlZCB0byBlbWl0IGFuIHVuZGVmaW5lZCByZWZlcmVuY2UgdG8gX2ZsdHVzZWQgb24gV2luZG93cworICAvLy8gdGFyZ2V0cy4KKyAgYm9vbCBVc2VzVkFGbG9hdEFyZ3VtZW50OworCisgIC8vLyBUcnVlIGlmIHRoZSBtb2R1bGUgY2FsbHMgdGhlIF9fbW9yZXN0YWNrIGZ1bmN0aW9uIGluZGlyZWN0bHksIGFzIGlzCisgIC8vLyByZXF1aXJlZCB1bmRlciB0aGUgbGFyZ2UgY29kZSBtb2RlbCBvbiB4ODYuIFRoaXMgaXMgdXNlZCB0byBlbWl0CisgIC8vLyBhIGRlZmluaXRpb24gb2YgYSBzeW1ib2wsIF9fbW9yZXN0YWNrX2FkZHIsIGNvbnRhaW5pbmcgdGhlIGFkZHJlc3MuIFNlZQorICAvLy8gY29tbWVudHMgaW4gbGliL1RhcmdldC9YODYvWDg2RnJhbWVMb3dlcmluZy5jcHAgZm9yIG1vcmUgZGV0YWlscy4KKyAgYm9vbCBVc2VzTW9yZXN0YWNrQWRkcjsKKworICAvLy8gVHJ1ZSBpZiB0aGUgbW9kdWxlIGNvbnRhaW5zIHNwbGl0LXN0YWNrIGZ1bmN0aW9ucy4gVGhpcyBpcyB1c2VkIHRvCisgIC8vLyBlbWl0IC5ub3RlLkdOVS1zcGxpdC1zdGFjayBzZWN0aW9uIGFzIHJlcXVpcmVkIGJ5IHRoZSBsaW5rZXIgZm9yCisgIC8vLyBzcGVjaWFsIGhhbmRsaW5nIHNwbGl0LXN0YWNrIGZ1bmN0aW9uIGNhbGxpbmcgbm8tc3BsaXQtc3RhY2sgZnVuY3Rpb24uCisgIGJvb2wgSGFzU3BsaXRTdGFjazsKKworICAvLy8gVHJ1ZSBpZiB0aGUgbW9kdWxlIGNvbnRhaW5zIG5vLXNwbGl0LXN0YWNrIGZ1bmN0aW9ucy4gVGhpcyBpcyB1c2VkIHRvCisgIC8vLyBlbWl0IC5ub3RlLkdOVS1uby1zcGxpdC1zdGFjayBzZWN0aW9uIHdoZW4gaXQgYWxzbyBjb250YWlucyBzcGxpdC1zdGFjaworICAvLy8gZnVuY3Rpb25zLgorICBib29sIEhhc05vc3BsaXRTdGFjazsKKworICAvLy8gTWFwcyBJUiBGdW5jdGlvbnMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBNYWNoaW5lRnVuY3Rpb25zLgorICBEZW5zZU1hcDxjb25zdCBGdW5jdGlvbiosIHN0ZDo6dW5pcXVlX3B0cjxNYWNoaW5lRnVuY3Rpb24+PiBNYWNoaW5lRnVuY3Rpb25zOworICAvLy8gTmV4dCB1bmlxdWUgbnVtYmVyIGF2YWlsYWJsZSBmb3IgYSBNYWNoaW5lRnVuY3Rpb24uCisgIHVuc2lnbmVkIE5leHRGbk51bSA9IDA7CisgIGNvbnN0IEZ1bmN0aW9uICpMYXN0UmVxdWVzdCA9IG51bGxwdHI7IC8vLzwgVXNlZCBmb3Igc2hvcnRjdXQvY2FjaGUuCisgIE1hY2hpbmVGdW5jdGlvbiAqTGFzdFJlc3VsdCA9IG51bGxwdHI7IC8vLzwgVXNlZCBmb3Igc2hvcnRjdXQvY2FjaGUuCisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKworICBleHBsaWNpdCBNYWNoaW5lTW9kdWxlSW5mbyhjb25zdCBUYXJnZXRNYWNoaW5lICpUTSA9IG51bGxwdHIpOworICB+TWFjaGluZU1vZHVsZUluZm8oKSBvdmVycmlkZTsKKworICAvLyBJbml0aWFsaXphdGlvbiBhbmQgRmluYWxpemF0aW9uCisgIGJvb2wgZG9Jbml0aWFsaXphdGlvbihNb2R1bGUgJikgb3ZlcnJpZGU7CisgIGJvb2wgZG9GaW5hbGl6YXRpb24oTW9kdWxlICYpIG92ZXJyaWRlOworCisgIGNvbnN0IE1DQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIENvbnRleHQ7IH0KKyAgTUNDb250ZXh0ICZnZXRDb250ZXh0KCkgeyByZXR1cm4gQ29udGV4dDsgfQorCisgIGNvbnN0IE1vZHVsZSAqZ2V0TW9kdWxlKCkgY29uc3QgeyByZXR1cm4gVGhlTW9kdWxlOyB9CisKKyAgLy8vIFJldHVybnMgdGhlIE1hY2hpbmVGdW5jdGlvbiBjb25zdHJ1Y3RlZCBmb3IgdGhlIElSIGZ1bmN0aW9uIFxwIEYuCisgIC8vLyBDcmVhdGVzIGEgbmV3IE1hY2hpbmVGdW5jdGlvbiBpZiBub25lIGV4aXN0cyB5ZXQuCisgIE1hY2hpbmVGdW5jdGlvbiAmZ2V0T3JDcmVhdGVNYWNoaW5lRnVuY3Rpb24oY29uc3QgRnVuY3Rpb24gJkYpOworCisgIC8vLyBcYnJpZWQgUmV0dXJucyB0aGUgTWFjaGluZUZ1bmN0aW9uIGFzc29jaWF0ZWQgdG8gSVIgZnVuY3Rpb24gXHAgRiBpZiB0aGVyZQorICAvLy8gaXMgb25lLCBvdGhlcndpc2UgbnVsbHB0ci4KKyAgTWFjaGluZUZ1bmN0aW9uICpnZXRNYWNoaW5lRnVuY3Rpb24oY29uc3QgRnVuY3Rpb24gJkYpIGNvbnN0OworCisgIC8vLyBEZWxldGUgdGhlIE1hY2hpbmVGdW5jdGlvbiBccCBNRiBhbmQgcmVzZXQgdGhlIGxpbmsgaW4gdGhlIElSIEZ1bmN0aW9uIHRvCisgIC8vLyBNYWNoaW5lIEZ1bmN0aW9uIG1hcC4KKyAgdm9pZCBkZWxldGVNYWNoaW5lRnVuY3Rpb25Gb3IoRnVuY3Rpb24gJkYpOworCisgIC8vLyBLZWVwIHRyYWNrIG9mIHZhcmlvdXMgcGVyLWZ1bmN0aW9uIHBpZWNlcyBvZiBpbmZvcm1hdGlvbiBmb3IgYmFja2VuZHMKKyAgLy8vIHRoYXQgd291bGQgbGlrZSB0byBkbyBzby4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHk+CisgIFR5ICZnZXRPYmpGaWxlSW5mbygpIHsKKyAgICBpZiAoT2JqRmlsZU1NSSA9PSBudWxscHRyKQorICAgICAgT2JqRmlsZU1NSSA9IG5ldyBUeSgqdGhpcyk7CisgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxUeSo+KE9iakZpbGVNTUkpOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHk+CisgIGNvbnN0IFR5ICZnZXRPYmpGaWxlSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxNYWNoaW5lTW9kdWxlSW5mbyo+KHRoaXMpLT5nZXRPYmpGaWxlSW5mbzxUeT4oKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdmFsaWQgZGVidWcgaW5mbyBpcyBwcmVzZW50LgorICBib29sIGhhc0RlYnVnSW5mbygpIGNvbnN0IHsgcmV0dXJuIERiZ0luZm9BdmFpbGFibGU7IH0KKyAgdm9pZCBzZXREZWJ1Z0luZm9BdmFpbGFiaWxpdHkoYm9vbCBhdmFpbCkgeyBEYmdJbmZvQXZhaWxhYmxlID0gYXZhaWw7IH0KKworICBib29sIHVzZXNWQUZsb2F0QXJndW1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIFVzZXNWQUZsb2F0QXJndW1lbnQ7CisgIH0KKworICB2b2lkIHNldFVzZXNWQUZsb2F0QXJndW1lbnQoYm9vbCBiKSB7CisgICAgVXNlc1ZBRmxvYXRBcmd1bWVudCA9IGI7CisgIH0KKworICBib29sIHVzZXNNb3Jlc3RhY2tBZGRyKCkgY29uc3QgeworICAgIHJldHVybiBVc2VzTW9yZXN0YWNrQWRkcjsKKyAgfQorCisgIHZvaWQgc2V0VXNlc01vcmVzdGFja0FkZHIoYm9vbCBiKSB7CisgICAgVXNlc01vcmVzdGFja0FkZHIgPSBiOworICB9CisKKyAgYm9vbCBoYXNTcGxpdFN0YWNrKCkgY29uc3QgeworICAgIHJldHVybiBIYXNTcGxpdFN0YWNrOworICB9CisKKyAgdm9pZCBzZXRIYXNTcGxpdFN0YWNrKGJvb2wgYikgeworICAgIEhhc1NwbGl0U3RhY2sgPSBiOworICB9CisKKyAgYm9vbCBoYXNOb3NwbGl0U3RhY2soKSBjb25zdCB7CisgICAgcmV0dXJuIEhhc05vc3BsaXRTdGFjazsKKyAgfQorCisgIHZvaWQgc2V0SGFzTm9zcGxpdFN0YWNrKGJvb2wgYikgeworICAgIEhhc05vc3BsaXRTdGFjayA9IGI7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBzeW1ib2wgdG8gYmUgdXNlZCBmb3IgdGhlIHNwZWNpZmllZCBiYXNpYyBibG9jayB3aGVuIGl0cworICAvLy8gYWRkcmVzcyBpcyB0YWtlbi4gIFRoaXMgY2Fubm90IGJlIGl0cyBub3JtYWwgTEJCIGxhYmVsIGJlY2F1c2UgdGhlIGJsb2NrCisgIC8vLyBtYXkgYmUgYWNjZXNzZWQgb3V0c2lkZSBpdHMgY29udGFpbmluZyBmdW5jdGlvbi4KKyAgTUNTeW1ib2wgKmdldEFkZHJMYWJlbFN5bWJvbChjb25zdCBCYXNpY0Jsb2NrICpCQikgeworICAgIHJldHVybiBnZXRBZGRyTGFiZWxTeW1ib2xUb0VtaXQoQkIpLmZyb250KCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBzeW1ib2wgdG8gYmUgdXNlZCBmb3IgdGhlIHNwZWNpZmllZCBiYXNpYyBibG9jayB3aGVuIGl0cworICAvLy8gYWRkcmVzcyBpcyB0YWtlbi4gIElmIG90aGVyIGJsb2NrcyB3ZXJlIFJBVVcnZCB0byB0aGlzIG9uZSwgd2UgbWF5IGhhdmUKKyAgLy8vIHRvIGVtaXQgdGhlbSBhcyB3ZWxsLCByZXR1cm4gdGhlIHdob2xlIHNldC4KKyAgQXJyYXlSZWY8TUNTeW1ib2wgKj4gZ2V0QWRkckxhYmVsU3ltYm9sVG9FbWl0KGNvbnN0IEJhc2ljQmxvY2sgKkJCKTsKKworICAvLy8gSWYgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBoYXMgaGFkIGFueSByZWZlcmVuY2VzIHRvIGFkZHJlc3MtdGFrZW4gYmxvY2tzCisgIC8vLyBnZW5lcmF0ZWQsIGJ1dCB0aGUgYmxvY2sgZ290IGRlbGV0ZWQsIHJldHVybiB0aGUgc3ltYm9sIG5vdyBzbyB3ZSBjYW4KKyAgLy8vIGVtaXQgaXQuICBUaGlzIHByZXZlbnRzIGVtaXR0aW5nIGEgcmVmZXJlbmNlIHRvIGEgc3ltYm9sIHRoYXQgaGFzIG5vCisgIC8vLyBkZWZpbml0aW9uLgorICB2b2lkIHRha2VEZWxldGVkU3ltYm9sc0ZvckZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uICpGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1DU3ltYm9sKj4gJlJlc3VsdCk7CisKKyAgLy8vIFxuYW1lIEV4Y2VwdGlvbiBIYW5kbGluZworICAvLy8gXHsKKworICAvLy8gU2V0IHRoZSBjYWxsIHNpdGUgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZC4KKyAgdm9pZCBzZXRDdXJyZW50Q2FsbFNpdGUodW5zaWduZWQgU2l0ZSkgeyBDdXJDYWxsU2l0ZSA9IFNpdGU7IH0KKworICAvLy8gR2V0IHRoZSBjYWxsIHNpdGUgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCwgaWYgYW55LiAgcmV0dXJuIHplcm8gaWYKKyAgLy8vIG5vbmUuCisgIHVuc2lnbmVkIGdldEN1cnJlbnRDYWxsU2l0ZSgpIHsgcmV0dXJuIEN1ckNhbGxTaXRlOyB9CisKKyAgLy8vIFByb3ZpZGUgdGhlIHBlcnNvbmFsaXR5IGZ1bmN0aW9uIGZvciB0aGUgZXhjZXB0aW9uIGluZm9ybWF0aW9uLgorICB2b2lkIGFkZFBlcnNvbmFsaXR5KGNvbnN0IEZ1bmN0aW9uICpQZXJzb25hbGl0eSk7CisKKyAgLy8vIFJldHVybiBhcnJheSBvZiBwZXJzb25hbGl0eSBmdW5jdGlvbnMgZXZlciBzZWVuLgorICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGdW5jdGlvbiAqPiYgZ2V0UGVyc29uYWxpdGllcygpIGNvbnN0IHsKKyAgICByZXR1cm4gUGVyc29uYWxpdGllczsKKyAgfQorICAvLy8gXH0KK307IC8vIEVuZCBjbGFzcyBNYWNoaW5lTW9kdWxlSW5mbworCisvLz09PS0gTU1JIGJ1aWxkaW5nIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gRGV0ZXJtaW5lIGlmIGFueSBmbG9hdGluZy1wb2ludCB2YWx1ZXMgYXJlIGJlaW5nIHBhc3NlZCB0byB0aGlzIHZhcmlhZGljCisvLy8gZnVuY3Rpb24sIGFuZCBzZXQgdGhlIE1hY2hpbmVNb2R1bGVJbmZvJ3MgdXNlc1ZBRmxvYXRBcmd1bWVudCBmbGFnIGlmIHNvLgorLy8vIFRoaXMgZmxhZyBpcyB1c2VkIHRvIGVtaXQgYW4gdW5kZWZpbmVkIHJlZmVyZW5jZSB0byBfZmx0dXNlZCBvbiBXaW5kb3dzLAorLy8vIHdoaWNoIHdpbGwgbGluayBpbiBNU1ZDUlQncyBmbG9hdGluZy1wb2ludCBzdXBwb3J0Lgordm9pZCBjb21wdXRlVXNlc1ZBRmxvYXRBcmd1bWVudChjb25zdCBDYWxsSW5zdCAmSSwgTWFjaGluZU1vZHVsZUluZm8gJk1NSSk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTUFDSElORU1PRFVMRUlORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVNb2R1bGVJbmZvSW1wbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mb0ltcGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE4N2ZhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mb0ltcGxzLmgKQEAgLTAsMCArMSw4NSBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9NYWNoaW5lTW9kdWxlSW5mb0ltcGxzLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBvYmplY3QtZmlsZSBmb3JtYXQgc3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIG9mCisvLyBNYWNoaW5lTW9kdWxlSW5mb0ltcGwuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORU1PRFVMRUlORk9JTVBMU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FTU9EVUxFSU5GT0lNUExTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVNb2R1bGVJbmZvLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ1N5bWJvbDsKKworLy8vIE1hY2hpbmVNb2R1bGVJbmZvTWFjaE8gLSBUaGlzIGlzIGEgTWFjaGluZU1vZHVsZUluZm9JbXBsIGltcGxlbWVudGF0aW9uCisvLy8gZm9yIE1hY2hPIHRhcmdldHMuCitjbGFzcyBNYWNoaW5lTW9kdWxlSW5mb01hY2hPIDogcHVibGljIE1hY2hpbmVNb2R1bGVJbmZvSW1wbCB7CisgIC8vLyBHVlN0dWJzIC0gRGFyd2luICckbm9uX2xhenlfcHRyJyBzdHVicy4gIFRoZSBrZXkgaXMgc29tZXRoaW5nIGxpa2UKKyAgLy8vICJMZm9vJG5vbl9sYXp5X3B0ciIsIHRoZSB2YWx1ZSBpcyBzb21ldGhpbmcgbGlrZSAiX2ZvbyIuIFRoZSBleHRyYSBiaXQKKyAgLy8vIGlzIHRydWUgaWYgdGhpcyBHViBpcyBleHRlcm5hbC4KKyAgRGVuc2VNYXA8TUNTeW1ib2wgKiwgU3R1YlZhbHVlVHk+IEdWU3R1YnM7CisKKyAgLy8vIFRocmVhZExvY2FsR1ZTdHVicyAtIERhcndpbiAnJG5vbl9sYXp5X3B0cicgc3R1YnMuICBUaGUga2V5IGlzIHNvbWV0aGluZworICAvLy8gbGlrZSAiTGZvbyRub25fbGF6eV9wdHIiLCB0aGUgdmFsdWUgaXMgc29tZXRoaW5nIGxpa2UgIl9mb28iLiBUaGUgZXh0cmEKKyAgLy8vIGJpdCBpcyB0cnVlIGlmIHRoaXMgR1YgaXMgZXh0ZXJuYWwuCisgIERlbnNlTWFwPE1DU3ltYm9sICosIFN0dWJWYWx1ZVR5PiBUaHJlYWRMb2NhbEdWU3R1YnM7CisKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOyAvLyBPdXQgb2YgbGluZSB2aXJ0dWFsIG1ldGhvZC4KKworcHVibGljOgorICBNYWNoaW5lTW9kdWxlSW5mb01hY2hPKGNvbnN0IE1hY2hpbmVNb2R1bGVJbmZvICYpIHt9CisKKyAgU3R1YlZhbHVlVHkgJmdldEdWU3R1YkVudHJ5KE1DU3ltYm9sICpTeW0pIHsKKyAgICBhc3NlcnQoU3ltICYmICJLZXkgY2Fubm90IGJlIG51bGwiKTsKKyAgICByZXR1cm4gR1ZTdHVic1tTeW1dOworICB9CisKKyAgU3R1YlZhbHVlVHkgJmdldFRocmVhZExvY2FsR1ZTdHViRW50cnkoTUNTeW1ib2wgKlN5bSkgeworICAgIGFzc2VydChTeW0gJiYgIktleSBjYW5ub3QgYmUgbnVsbCIpOworICAgIHJldHVybiBUaHJlYWRMb2NhbEdWU3R1YnNbU3ltXTsKKyAgfQorCisgIC8vLyBBY2Nlc3NvciBtZXRob2RzIHRvIHJldHVybiB0aGUgc2V0IG9mIHN0dWJzIGluIHNvcnRlZCBvcmRlci4KKyAgU3ltYm9sTGlzdFR5IEdldEdWU3R1Ykxpc3QoKSB7IHJldHVybiBnZXRTb3J0ZWRTdHVicyhHVlN0dWJzKTsgfQorICBTeW1ib2xMaXN0VHkgR2V0VGhyZWFkTG9jYWxHVlN0dWJMaXN0KCkgeworICAgIHJldHVybiBnZXRTb3J0ZWRTdHVicyhUaHJlYWRMb2NhbEdWU3R1YnMpOworICB9Cit9OworCisvLy8gTWFjaGluZU1vZHVsZUluZm9FTEYgLSBUaGlzIGlzIGEgTWFjaGluZU1vZHVsZUluZm9JbXBsIGltcGxlbWVudGF0aW9uCisvLy8gZm9yIEVMRiB0YXJnZXRzLgorY2xhc3MgTWFjaGluZU1vZHVsZUluZm9FTEYgOiBwdWJsaWMgTWFjaGluZU1vZHVsZUluZm9JbXBsIHsKKyAgLy8vIEdWU3R1YnMgLSBUaGVzZSBzdHVicyBhcmUgdXNlZCB0byBtYXRlcmlhbGl6ZSBnbG9iYWwgYWRkcmVzc2VzIGluIFBJQworICAvLy8gbW9kZS4KKyAgRGVuc2VNYXA8TUNTeW1ib2wgKiwgU3R1YlZhbHVlVHk+IEdWU3R1YnM7CisKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOyAvLyBPdXQgb2YgbGluZSB2aXJ0dWFsIG1ldGhvZC4KKworcHVibGljOgorICBNYWNoaW5lTW9kdWxlSW5mb0VMRihjb25zdCBNYWNoaW5lTW9kdWxlSW5mbyAmKSB7fQorCisgIFN0dWJWYWx1ZVR5ICZnZXRHVlN0dWJFbnRyeShNQ1N5bWJvbCAqU3ltKSB7CisgICAgYXNzZXJ0KFN5bSAmJiAiS2V5IGNhbm5vdCBiZSBudWxsIik7CisgICAgcmV0dXJuIEdWU3R1YnNbU3ltXTsKKyAgfQorCisgIC8vLyBBY2Nlc3NvciBtZXRob2RzIHRvIHJldHVybiB0aGUgc2V0IG9mIHN0dWJzIGluIHNvcnRlZCBvcmRlci4KKworICBTeW1ib2xMaXN0VHkgR2V0R1ZTdHViTGlzdCgpIHsgcmV0dXJuIGdldFNvcnRlZFN0dWJzKEdWU3R1YnMpOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX01BQ0hJTkVNT0RVTEVJTkZPSU1QTFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVPcGVyYW5kLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZU9wZXJhbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjBkYjFjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVPcGVyYW5kLmgKQEAgLTAsMCArMSw5NDEgQEAKKy8vPT09LS0gbGx2bS9Db2RlR2VuL01hY2hpbmVPcGVyYW5kLmggLSBNYWNoaW5lT3BlcmFuZCBjbGFzcyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgTWFjaGluZU9wZXJhbmQgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORU9QRVJBTkRfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORU9QRVJBTkRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0xvd0xldmVsVHlwZUltcGwuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJsb2NrQWRkcmVzczsKK2NsYXNzIENvbnN0YW50RlA7CitjbGFzcyBDb25zdGFudEludDsKK2NsYXNzIEdsb2JhbFZhbHVlOworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworY2xhc3MgTUNDRklJbnN0cnVjdGlvbjsKK2NsYXNzIE1ETm9kZTsKK2NsYXNzIE1vZHVsZVNsb3RUcmFja2VyOworY2xhc3MgVGFyZ2V0TWFjaGluZTsKK2NsYXNzIFRhcmdldEludHJpbnNpY0luZm87CitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CitjbGFzcyBoYXNoX2NvZGU7CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIE1DU3ltYm9sOworCisvLy8gTWFjaGluZU9wZXJhbmQgY2xhc3MgLSBSZXByZXNlbnRhdGlvbiBvZiBlYWNoIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gb3BlcmFuZC4KKy8vLworLy8vIFRoaXMgY2xhc3MgaXNuJ3QgYSBQT0QgdHlwZSBiZWNhdXNlIGl0IGhhcyBhIHByaXZhdGUgY29uc3RydWN0b3IsIGJ1dCBpdHMKKy8vLyBkZXN0cnVjdG9yIG11c3QgYmUgdHJpdmlhbC4gRnVuY3Rpb25zIGxpa2UgTWFjaGluZUluc3RyOjphZGRPcGVyYW5kKCksCisvLy8gTWFjaGluZVJlZ2lzdGVySW5mbzo6bW92ZU9wZXJhbmRzKCksIGFuZCBNRjo6RGVsZXRlTWFjaGluZUluc3RyKCkgZGVwZW5kIG9uCisvLy8gbm90IGhhdmluZyB0byBjYWxsIHRoZSBNYWNoaW5lT3BlcmFuZCBkZXN0cnVjdG9yLgorLy8vCitjbGFzcyBNYWNoaW5lT3BlcmFuZCB7CitwdWJsaWM6CisgIGVudW0gTWFjaGluZU9wZXJhbmRUeXBlIDogdW5zaWduZWQgY2hhciB7CisgICAgTU9fUmVnaXN0ZXIsICAgICAgICAgIC8vLzwgUmVnaXN0ZXIgb3BlcmFuZC4KKyAgICBNT19JbW1lZGlhdGUsICAgICAgICAgLy8vPCBJbW1lZGlhdGUgb3BlcmFuZAorICAgIE1PX0NJbW1lZGlhdGUsICAgICAgICAvLy88IEltbWVkaWF0ZSA+NjRiaXQgb3BlcmFuZAorICAgIE1PX0ZQSW1tZWRpYXRlLCAgICAgICAvLy88IEZsb2F0aW5nLXBvaW50IGltbWVkaWF0ZSBvcGVyYW5kCisgICAgTU9fTWFjaGluZUJhc2ljQmxvY2ssIC8vLzwgTWFjaGluZUJhc2ljQmxvY2sgcmVmZXJlbmNlCisgICAgTU9fRnJhbWVJbmRleCwgICAgICAgIC8vLzwgQWJzdHJhY3QgU3RhY2sgRnJhbWUgSW5kZXgKKyAgICBNT19Db25zdGFudFBvb2xJbmRleCwgLy8vPCBBZGRyZXNzIG9mIGluZGV4ZWQgQ29uc3RhbnQgaW4gQ29uc3RhbnQgUG9vbAorICAgIE1PX1RhcmdldEluZGV4LCAgICAgICAvLy88IFRhcmdldC1kZXBlbmRlbnQgaW5kZXgrb2Zmc2V0IG9wZXJhbmQuCisgICAgTU9fSnVtcFRhYmxlSW5kZXgsICAgIC8vLzwgQWRkcmVzcyBvZiBpbmRleGVkIEp1bXAgVGFibGUgZm9yIHN3aXRjaAorICAgIE1PX0V4dGVybmFsU3ltYm9sLCAgICAvLy88IE5hbWUgb2YgZXh0ZXJuYWwgZ2xvYmFsIHN5bWJvbAorICAgIE1PX0dsb2JhbEFkZHJlc3MsICAgICAvLy88IEFkZHJlc3Mgb2YgYSBnbG9iYWwgdmFsdWUKKyAgICBNT19CbG9ja0FkZHJlc3MsICAgICAgLy8vPCBBZGRyZXNzIG9mIGEgYmFzaWMgYmxvY2sKKyAgICBNT19SZWdpc3Rlck1hc2ssICAgICAgLy8vPCBNYXNrIG9mIHByZXNlcnZlZCByZWdpc3RlcnMuCisgICAgTU9fUmVnaXN0ZXJMaXZlT3V0LCAgIC8vLzwgTWFzayBvZiBsaXZlLW91dCByZWdpc3RlcnMuCisgICAgTU9fTWV0YWRhdGEsICAgICAgICAgIC8vLzwgTWV0YWRhdGEgcmVmZXJlbmNlIChmb3IgZGVidWcgaW5mbykKKyAgICBNT19NQ1N5bWJvbCwgICAgICAgICAgLy8vPCBNQ1N5bWJvbCByZWZlcmVuY2UgKGZvciBkZWJ1Zy9laCBpbmZvKQorICAgIE1PX0NGSUluZGV4LCAgICAgICAgICAvLy88IE1DQ0ZJSW5zdHJ1Y3Rpb24gaW5kZXguCisgICAgTU9fSW50cmluc2ljSUQsICAgICAgIC8vLzwgSW50cmluc2ljIElEIGZvciBJU2VsCisgICAgTU9fUHJlZGljYXRlLCAgICAgICAgIC8vLzwgR2VuZXJpYyBwcmVkaWNhdGUgZm9yIElTZWwKKyAgICBNT19MYXN0ID0gTU9fUHJlZGljYXRlLAorICB9OworCitwcml2YXRlOgorICAvLy8gT3BLaW5kIC0gU3BlY2lmeSB3aGF0IGtpbmQgb2Ygb3BlcmFuZCB0aGlzIGlzLiAgVGhpcyBkaXNjcmltaW5hdGVzIHRoZQorICAvLy8gdW5pb24uCisgIHVuc2lnbmVkIE9wS2luZCA6IDg7CisKKyAgLy8vIFN1YnJlZ2lzdGVyIG51bWJlciBmb3IgTU9fUmVnaXN0ZXIuICBBIHZhbHVlIG9mIDAgaW5kaWNhdGVzIHRoZQorICAvLy8gTU9fUmVnaXN0ZXIgaGFzIG5vIHN1YlJlZy4KKyAgLy8vCisgIC8vLyBGb3IgYWxsIG90aGVyIGtpbmRzIG9mIG9wZXJhbmRzLCB0aGlzIGZpZWxkIGhvbGRzIHRhcmdldC1zcGVjaWZpYyBmbGFncy4KKyAgdW5zaWduZWQgU3ViUmVnX1RhcmdldEZsYWdzIDogMTI7CisKKyAgLy8vIFRpZWRUbyAtIE5vbi16ZXJvIHdoZW4gdGhpcyByZWdpc3RlciBvcGVyYW5kIGlzIHRpZWQgdG8gYW5vdGhlciByZWdpc3RlcgorICAvLy8gb3BlcmFuZC4gVGhlIGVuY29kaW5nIG9mIHRoaXMgZmllbGQgaXMgZGVzY3JpYmVkIGluIHRoZSBibG9jayBjb21tZW50CisgIC8vLyBiZWZvcmUgTWFjaGluZUluc3RyOjp0aWVPcGVyYW5kcygpLgorICB1bnNpZ25lZCBUaWVkVG8gOiA0OworCisgIC8vLyBJc0RlZiAtIFRydWUgaWYgdGhpcyBpcyBhIGRlZiwgZmFsc2UgaWYgdGhpcyBpcyBhIHVzZSBvZiB0aGUgcmVnaXN0ZXIuCisgIC8vLyBUaGlzIGlzIG9ubHkgdmFsaWQgb24gcmVnaXN0ZXIgb3BlcmFuZHMuCisgIC8vLworICB1bnNpZ25lZCBJc0RlZiA6IDE7CisKKyAgLy8vIElzSW1wIC0gVHJ1ZSBpZiB0aGlzIGlzIGFuIGltcGxpY2l0IGRlZiBvciB1c2UsIGZhbHNlIGlmIGl0IGlzIGV4cGxpY2l0LgorICAvLy8gVGhpcyBpcyBvbmx5IHZhbGlkIG9uIHJlZ2lzdGVyIG9wZGVyYW5kcy4KKyAgLy8vCisgIHVuc2lnbmVkIElzSW1wIDogMTsKKworICAvLy8gSXNEZWFkT3JLaWxsCisgIC8vLyBGb3IgdXNlczogSXNLaWxsIC0gVHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGlzIHRoZSBsYXN0IHVzZSBvZiB0aGUKKyAgLy8vIHJlZ2lzdGVyIG9uIHRoaXMgcGF0aCB0aHJvdWdoIHRoZSBmdW5jdGlvbi4KKyAgLy8vIEZvciBkZWZzOiBJc0RlYWQgLSBUcnVlIGlmIHRoaXMgcmVnaXN0ZXIgaXMgbmV2ZXIgdXNlZCBieSBhIHN1YnNlcXVlbnQKKyAgLy8vIGluc3RydWN0aW9uLgorICAvLy8gVGhpcyBpcyBvbmx5IHZhbGlkIG9uIHJlZ2lzdGVyIG9wZXJhbmRzLgorICB1bnNpZ25lZCBJc0RlYWRPcktpbGwgOiAxOworCisgIC8vLyBTZWUgaXNSZW5hbWFibGUoKS4KKyAgdW5zaWduZWQgSXNSZW5hbWFibGUgOiAxOworCisgIC8vLyBJc1VuZGVmIC0gVHJ1ZSBpZiB0aGlzIHJlZ2lzdGVyIG9wZXJhbmQgcmVhZHMgYW4gInVuZGVmIiB2YWx1ZSwgaS5lLiB0aGUKKyAgLy8vIHJlYWQgdmFsdWUgZG9lc24ndCBtYXR0ZXIuICBUaGlzIGZsYWcgY2FuIGJlIHNldCBvbiBib3RoIHVzZSBhbmQgZGVmCisgIC8vLyBvcGVyYW5kcy4gIE9uIGEgc3ViLXJlZ2lzdGVyIGRlZiBvcGVyYW5kLCBpdCByZWZlcnMgdG8gdGhlIHBhcnQgb2YgdGhlCisgIC8vLyByZWdpc3RlciB0aGF0IGlzbid0IHdyaXR0ZW4uICBPbiBhIGZ1bGwtcmVnaXN0ZXIgZGVmIG9wZXJhbmQsIGl0IGlzIGEKKyAgLy8vIG5vb3AuICBTZWUgcmVhZHNSZWcoKS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIG9ubHkgdmFsaWQgb24gcmVnaXN0ZXJzLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBhbiBpbnN0cnVjdGlvbiBtYXkgaGF2ZSBtdWx0aXBsZSA8dW5kZWY+IG9wZXJhbmRzIHJlZmVycmluZyB0bworICAvLy8gdGhlIHNhbWUgcmVnaXN0ZXIuICBJbiB0aGF0IGNhc2UsIHRoZSBpbnN0cnVjdGlvbiBtYXkgZGVwZW5kIG9uIHRob3NlCisgIC8vLyBvcGVyYW5kcyByZWFkaW5nIHRoZSBzYW1lIGRvbnQtY2FyZSB2YWx1ZS4gIEZvciBleGFtcGxlOgorICAvLy8KKyAgLy8vICAgJTEgPSBYT1IgdW5kZWYgJTIsIHVuZGVmICUyCisgIC8vLworICAvLy8gQW55IHJlZ2lzdGVyIGNhbiBiZSB1c2VkIGZvciAlMiwgYW5kIGl0cyB2YWx1ZSBkb2Vzbid0IG1hdHRlciwgYnV0CisgIC8vLyB0aGUgdHdvIG9wZXJhbmRzIG11c3QgYmUgdGhlIHNhbWUgcmVnaXN0ZXIuCisgIC8vLworICB1bnNpZ25lZCBJc1VuZGVmIDogMTsKKworICAvLy8gSXNJbnRlcm5hbFJlYWQgLSBUcnVlIGlmIHRoaXMgb3BlcmFuZCByZWFkcyBhIHZhbHVlIHRoYXQgd2FzIGRlZmluZWQKKyAgLy8vIGluc2lkZSB0aGUgc2FtZSBpbnN0cnVjdGlvbiBvciBidW5kbGUuICBUaGlzIGZsYWcgY2FuIGJlIHNldCBvbiBib3RoIHVzZQorICAvLy8gYW5kIGRlZiBvcGVyYW5kcy4gIE9uIGEgc3ViLXJlZ2lzdGVyIGRlZiBvcGVyYW5kLCBpdCByZWZlcnMgdG8gdGhlIHBhcnQKKyAgLy8vIG9mIHRoZSByZWdpc3RlciB0aGF0IGlzbid0IHdyaXR0ZW4uICBPbiBhIGZ1bGwtcmVnaXN0ZXIgZGVmIG9wZXJhbmQsIGl0CisgIC8vLyBpcyBhIG5vb3AuCisgIC8vLworICAvLy8gV2hlbiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgaW5zdHJ1Y3Rpb24gYnVuZGxlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUKKyAgLy8vIG90aGVyIGRlZiBvZiB0aGUgcmVnaXN0ZXIuICBJZiBtdWx0aXBsZSBpbnN0cnVjdGlvbnMgaW4gdGhlIGJ1bmRsZSBkZWZpbmUKKyAgLy8vIHRoZSByZWdpc3RlciwgdGhlIG1lYW5pbmcgaXMgdGFyZ2V0LWRlZmluZWQuCisgIHVuc2lnbmVkIElzSW50ZXJuYWxSZWFkIDogMTsKKworICAvLy8gSXNFYXJseUNsb2JiZXIgLSBUcnVlIGlmIHRoaXMgTU9fUmVnaXN0ZXIgJ2RlZicgb3BlcmFuZCBpcyB3cml0dGVuIHRvCisgIC8vLyBieSB0aGUgTWFjaGluZUluc3RyIGJlZm9yZSBhbGwgaW5wdXQgcmVnaXN0ZXJzIGFyZSByZWFkLiAgVGhpcyBpcyB1c2VkIHRvCisgIC8vLyBtb2RlbCB0aGUgR0NDIGlubGluZSBhc20gJyYnIGNvbnN0cmFpbnQgbW9kaWZpZXIuCisgIHVuc2lnbmVkIElzRWFybHlDbG9iYmVyIDogMTsKKworICAvLy8gSXNEZWJ1ZyAtIFRydWUgaWYgdGhpcyBNT19SZWdpc3RlciAndXNlJyBvcGVyYW5kIGlzIGluIGEgZGVidWcgcHNldWRvLAorICAvLy8gbm90IGEgcmVhbCBpbnN0cnVjdGlvbi4gIFN1Y2ggdXNlcyBzaG91bGQgYmUgaWdub3JlZCBkdXJpbmcgY29kZWdlbi4KKyAgdW5zaWduZWQgSXNEZWJ1ZyA6IDE7CisKKyAgLy8vIFNtYWxsQ29udGVudHMgLSBUaGlzIHJlYWxseSBzaG91bGQgYmUgcGFydCBvZiB0aGUgQ29udGVudHMgdW5pb24sIGJ1dAorICAvLy8gbGl2ZXMgb3V0IGhlcmUgc28gd2UgY2FuIGdldCBhIGJldHRlciBwYWNrZWQgc3RydWN0LgorICAvLy8gTU9fUmVnaXN0ZXI6IFJlZ2lzdGVyIG51bWJlci4KKyAgLy8vIE9mZnNldGVkSW5mbzogTG93IGJpdHMgb2Ygb2Zmc2V0LgorICB1bmlvbiB7CisgICAgdW5zaWduZWQgUmVnTm87ICAgICAgICAgICAvLyBGb3IgTU9fUmVnaXN0ZXIuCisgICAgdW5zaWduZWQgT2Zmc2V0TG87ICAgICAgICAvLyBNYXRjaGVzIENvbnRlbnRzLk9mZnNldGVkSW5mby5PZmZzZXRIaS4KKyAgfSBTbWFsbENvbnRlbnRzOworCisgIC8vLyBQYXJlbnRNSSAtIFRoaXMgaXMgdGhlIGluc3RydWN0aW9uIHRoYXQgdGhpcyBvcGVyYW5kIGlzIGVtYmVkZGVkIGludG8uCisgIC8vLyBUaGlzIGlzIHZhbGlkIGZvciBhbGwgb3BlcmFuZCB0eXBlcywgd2hlbiB0aGUgb3BlcmFuZCBpcyBpbiBhbiBpbnN0ci4KKyAgTWFjaGluZUluc3RyICpQYXJlbnRNSTsKKworICAvLy8gQ29udGVudHMgdW5pb24gLSBUaGlzIGNvbnRhaW5zIHRoZSBwYXlsb2FkIGZvciB0aGUgdmFyaW91cyBvcGVyYW5kIHR5cGVzLgorICB1bmlvbiB7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQjsgIC8vIEZvciBNT19NYWNoaW5lQmFzaWNCbG9jay4KKyAgICBjb25zdCBDb25zdGFudEZQICpDRlA7ICAgLy8gRm9yIE1PX0ZQSW1tZWRpYXRlLgorICAgIGNvbnN0IENvbnN0YW50SW50ICpDSTsgICAvLyBGb3IgTU9fQ0ltbWVkaWF0ZS4gSW50ZWdlcnMgPiA2NGJpdC4KKyAgICBpbnQ2NF90IEltbVZhbDsgICAgICAgICAgLy8gRm9yIE1PX0ltbWVkaWF0ZS4KKyAgICBjb25zdCB1aW50MzJfdCAqUmVnTWFzazsgLy8gRm9yIE1PX1JlZ2lzdGVyTWFzayBhbmQgTU9fUmVnaXN0ZXJMaXZlT3V0LgorICAgIGNvbnN0IE1ETm9kZSAqTUQ7ICAgICAgICAvLyBGb3IgTU9fTWV0YWRhdGEuCisgICAgTUNTeW1ib2wgKlN5bTsgICAgICAgICAgIC8vIEZvciBNT19NQ1N5bWJvbC4KKyAgICB1bnNpZ25lZCBDRklJbmRleDsgICAgICAgLy8gRm9yIE1PX0NGSS4KKyAgICBJbnRyaW5zaWM6OklEIEludHJpbnNpY0lEOyAvLyBGb3IgTU9fSW50cmluc2ljSUQuCisgICAgdW5zaWduZWQgUHJlZDsgICAgICAgICAgIC8vIEZvciBNT19QcmVkaWNhdGUKKworICAgIHN0cnVjdCB7ICAgICAgICAgICAgICAgICAgLy8gRm9yIE1PX1JlZ2lzdGVyLgorICAgICAgLy8gUmVnaXN0ZXIgbnVtYmVyIGlzIGluIFNtYWxsQ29udGVudHMuUmVnTm8uCisgICAgICBNYWNoaW5lT3BlcmFuZCAqUHJldjsgICAvLyBBY2Nlc3MgbGlzdCBmb3IgcmVnaXN0ZXIuIFNlZSBNUkkuCisgICAgICBNYWNoaW5lT3BlcmFuZCAqTmV4dDsKKyAgICB9IFJlZzsKKworICAgIC8vLyBPZmZzZXRlZEluZm8gLSBUaGlzIHN0cnVjdCBjb250YWlucyB0aGUgb2Zmc2V0IGFuZCBhbiBvYmplY3QgaWRlbnRpZmllci4KKyAgICAvLy8gdGhpcyByZXByZXNlbnQgdGhlIG9iamVjdCBhcyB3aXRoIGFuIG9wdGlvbmFsIG9mZnNldCBmcm9tIGl0LgorICAgIHN0cnVjdCB7CisgICAgICB1bmlvbiB7CisgICAgICAgIGludCBJbmRleDsgICAgICAgICAgICAgICAgLy8gRm9yIE1PXypJbmRleCAtIFRoZSBpbmRleCBpdHNlbGYuCisgICAgICAgIGNvbnN0IGNoYXIgKlN5bWJvbE5hbWU7ICAgLy8gRm9yIE1PX0V4dGVybmFsU3ltYm9sLgorICAgICAgICBjb25zdCBHbG9iYWxWYWx1ZSAqR1Y7ICAgIC8vIEZvciBNT19HbG9iYWxBZGRyZXNzLgorICAgICAgICBjb25zdCBCbG9ja0FkZHJlc3MgKkJBOyAgIC8vIEZvciBNT19CbG9ja0FkZHJlc3MuCisgICAgICB9IFZhbDsKKyAgICAgIC8vIExvdyBiaXRzIG9mIG9mZnNldCBhcmUgaW4gU21hbGxDb250ZW50cy5PZmZzZXRMby4KKyAgICAgIGludCBPZmZzZXRIaTsgICAgICAgICAgICAgICAvLyBBbiBvZmZzZXQgZnJvbSB0aGUgb2JqZWN0LCBoaWdoIDMyIGJpdHMuCisgICAgfSBPZmZzZXRlZEluZm87CisgIH0gQ29udGVudHM7CisKKyAgZXhwbGljaXQgTWFjaGluZU9wZXJhbmQoTWFjaGluZU9wZXJhbmRUeXBlIEspCisgICAgOiBPcEtpbmQoSyksIFN1YlJlZ19UYXJnZXRGbGFncygwKSwgUGFyZW50TUkobnVsbHB0cikgeworICAgIC8vIEFzc2VydCB0aGF0IHRoZSBsYXlvdXQgaXMgd2hhdCB3ZSBleHBlY3QuIEl0J3MgZWFzeSB0byBncm93IHRoaXMgb2JqZWN0LgorICAgIHN0YXRpY19hc3NlcnQoYWxpZ25vZihNYWNoaW5lT3BlcmFuZCkgPD0gYWxpZ25vZihpbnQ2NF90KSwKKyAgICAgICAgICAgICAgICAgICJNYWNoaW5lT3BlcmFuZCBzaG91bGRuJ3QgYmUgbW9yZSB0aGFuIDggYnl0ZSBhbGlnbmVkIik7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoQ29udGVudHMpIDw9IDIgKiBzaXplb2Yodm9pZCAqKSwKKyAgICAgICAgICAgICAgICAgICJDb250ZW50cyBzaG91bGQgYmUgYXQgbW9zdCB0d28gcG9pbnRlcnMiKTsKKyAgICBzdGF0aWNfYXNzZXJ0KHNpemVvZihNYWNoaW5lT3BlcmFuZCkgPD0KKyAgICAgICAgICAgICAgICAgICAgICBhbGlnblRvPGFsaWdub2YoaW50NjRfdCk+KDIgKiBzaXplb2YodW5zaWduZWQpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDMgKiBzaXplb2Yodm9pZCAqKSksCisgICAgICAgICAgICAgICAgICAiTWFjaGluZU9wZXJhbmQgdG9vIGJpZy4gU2hvdWxkIGJlIEtpbmQsIFNtYWxsQ29udGVudHMsICIKKyAgICAgICAgICAgICAgICAgICJQYXJlbnRNSSwgYW5kIENvbnRlbnRzIik7CisgIH0KKworcHVibGljOgorICAvLy8gZ2V0VHlwZSAtIFJldHVybnMgdGhlIE1hY2hpbmVPcGVyYW5kVHlwZSBmb3IgdGhpcyBvcGVyYW5kLgorICAvLy8KKyAgTWFjaGluZU9wZXJhbmRUeXBlIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiAoTWFjaGluZU9wZXJhbmRUeXBlKU9wS2luZDsgfQorCisgIHVuc2lnbmVkIGdldFRhcmdldEZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBpc1JlZygpID8gMCA6IFN1YlJlZ19UYXJnZXRGbGFnczsKKyAgfQorICB2b2lkIHNldFRhcmdldEZsYWdzKHVuc2lnbmVkIEYpIHsKKyAgICBhc3NlcnQoIWlzUmVnKCkgJiYgIlJlZ2lzdGVyIG9wZXJhbmRzIGNhbid0IGhhdmUgdGFyZ2V0IGZsYWdzIik7CisgICAgU3ViUmVnX1RhcmdldEZsYWdzID0gRjsKKyAgICBhc3NlcnQoU3ViUmVnX1RhcmdldEZsYWdzID09IEYgJiYgIlRhcmdldCBmbGFncyBvdXQgb2YgcmFuZ2UiKTsKKyAgfQorICB2b2lkIGFkZFRhcmdldEZsYWcodW5zaWduZWQgRikgeworICAgIGFzc2VydCghaXNSZWcoKSAmJiAiUmVnaXN0ZXIgb3BlcmFuZHMgY2FuJ3QgaGF2ZSB0YXJnZXQgZmxhZ3MiKTsKKyAgICBTdWJSZWdfVGFyZ2V0RmxhZ3MgfD0gRjsKKyAgICBhc3NlcnQoKFN1YlJlZ19UYXJnZXRGbGFncyAmIEYpICYmICJUYXJnZXQgZmxhZ3Mgb3V0IG9mIHJhbmdlIik7CisgIH0KKworCisgIC8vLyBnZXRQYXJlbnQgLSBSZXR1cm4gdGhlIGluc3RydWN0aW9uIHRoYXQgdGhpcyBvcGVyYW5kIGJlbG9uZ3MgdG8uCisgIC8vLworICBNYWNoaW5lSW5zdHIgKmdldFBhcmVudCgpIHsgcmV0dXJuIFBhcmVudE1JOyB9CisgIGNvbnN0IE1hY2hpbmVJbnN0ciAqZ2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4gUGFyZW50TUk7IH0KKworICAvLy8gY2xlYXJQYXJlbnQgLSBSZXNldCB0aGUgcGFyZW50IHBvaW50ZXIuCisgIC8vLworICAvLy8gVGhlIE1hY2hpbmVPcGVyYW5kIGNvcHkgY29uc3RydWN0b3IgYWxzbyBjb3BpZXMgUGFyZW50TUksIGV4cGVjdGluZyB0aGUKKyAgLy8vIG9yaWdpbmFsIHRvIGJlIGRlbGV0ZWQuIElmIGEgTWFjaGluZU9wZXJhbmQgaXMgZXZlciBzdG9yZWQgb3V0c2lkZSBhCisgIC8vLyBNYWNoaW5lSW5zdHIsIHRoZSBwYXJlbnQgcG9pbnRlciBtdXN0IGJlIGNsZWFyZWQuCisgIC8vLworICAvLy8gTmV2ZXIgY2FsbCBjbGVhclBhcmVudCgpIG9uIGFuIG9wZXJhbmQgaW4gYSBNYWNoaW5lSW5zdHIuCisgIC8vLworICB2b2lkIGNsZWFyUGFyZW50KCkgeyBQYXJlbnRNSSA9IG51bGxwdHI7IH0KKworICAvLy8gUHJpbnQgYSBzdWJyZWcgaW5kZXggb3BlcmFuZC4KKyAgLy8vIE1PX0ltbWVkaWF0ZSBvcGVyYW5kcyBjYW4gYWxzbyBiZSBzdWJyZWcgaWRpY2VzLiBJZiBpdCdzIHRoZSBjYXNlLCB0aGUKKyAgLy8vIHN1YnJlZyBpbmRleCBuYW1lIHdpbGwgYmUgcHJpbnRlZC4gTWFjaGluZUluc3RyOjppc09wZXJhbmRTdWJyZWdJZHggY2FuIGJlCisgIC8vLyBjYWxsZWQgdG8gY2hlY2sgdGhpcy4KKyAgc3RhdGljIHZvaWQgcHJpbnRTdWJSZWdJZHgocmF3X29zdHJlYW0gJk9TLCB1aW50NjRfdCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpOworCisgIC8vLyBQcmludCBvcGVyYW5kIHRhcmdldCBmbGFncy4KKyAgc3RhdGljIHZvaWQgcHJpbnRUYXJnZXRGbGFncyhyYXdfb3N0cmVhbSYgT1MsIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZPcCk7CisKKyAgLy8vIFByaW50IGEgTUNTeW1ib2wgYXMgYW4gb3BlcmFuZC4KKyAgc3RhdGljIHZvaWQgcHJpbnRTeW1ib2wocmF3X29zdHJlYW0gJk9TLCBNQ1N5bWJvbCAmU3ltKTsKKworICAvLy8gUHJpbnQgYSBzdGFjayBvYmplY3QgcmVmZXJlbmNlLgorICBzdGF0aWMgdm9pZCBwcmludFN0YWNrT2JqZWN0UmVmZXJlbmNlKHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgRnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzRml4ZWQsIFN0cmluZ1JlZiBOYW1lKTsKKworICAvLy8gUHJpbnQgdGhlIG9mZnNldCB3aXRoIGV4cGxpY2l0ICsvLSBzaWducy4KKyAgc3RhdGljIHZvaWQgcHJpbnRPcGVyYW5kT2Zmc2V0KHJhd19vc3RyZWFtICZPUywgaW50NjRfdCBPZmZzZXQpOworCisgIC8vLyBQcmludCBhbiBJUlNsb3ROdW1iZXIuCisgIHN0YXRpYyB2b2lkIHByaW50SVJTbG90TnVtYmVyKHJhd19vc3RyZWFtICZPUywgaW50IFNsb3QpOworCisgIC8vLyBQcmludCB0aGUgTWFjaGluZU9wZXJhbmQgdG8gXHAgb3MuCisgIC8vLyBQcm92aWRpbmcgYSB2YWxpZCBccCBUUkkgYW5kIFxwIEludHJpbnNpY0luZm8gcmVzdWx0cyBpbiBhIG1vcmUKKyAgLy8vIHRhcmdldC1zcGVjaWZpYyBwcmludGluZy4gSWYgXHAgVFJJIGFuZCBccCBJbnRyaW5zaWNJbmZvIGFyZSBudWxsLCB0aGUKKyAgLy8vIGZ1bmN0aW9uIHdpbGwgdHJ5IHRvIHBpY2sgaXQgdXAgZnJvbSB0aGUgcGFyZW50LgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZvcywgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBudWxscHRyLAorICAgICAgICAgICAgIGNvbnN0IFRhcmdldEludHJpbnNpY0luZm8gKkludHJpbnNpY0luZm8gPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gTW9yZSBjb21wbGV4IHdheSBvZiBwcmludGluZyBhIE1hY2hpbmVPcGVyYW5kLgorICAvLy8gXHBhcmFtIFR5cGVUb1ByaW50IHNwZWNpZmllcyB0aGUgZ2VuZXJpYyB0eXBlIHRvIGJlIHByaW50ZWQgb24gdXNlcyBhbmQKKyAgLy8vIGRlZnMuIEl0IGNhbiBiZSBkZXRlcm1pbmVkIHVzaW5nIE1hY2hpbmVJbnN0cjo6Z2V0VHlwZVRvUHJpbnQuCisgIC8vLyBccGFyYW0gUHJpbnREZWYgLSB3aGV0aGVyIHdlIHdhbnQgdG8gcHJpbnQgYGRlZmAgb24gYW4gb3BlcmFuZCB3aGljaAorICAvLy8gaXNEZWYuIFNvbWV0aW1lcywgaWYgdGhlIG9wZXJhbmQgaXMgcHJpbnRlZCBiZWZvcmUgJz0nLCB3ZSBkb24ndCBwcmludAorICAvLy8gYGRlZmAuCisgIC8vLyBccGFyYW0gSXNTdGFuZGFsb25lIC0gd2hldGhlciB3ZSB3YW50IGEgdmVyYm9zZSBvdXRwdXQgb2YgdGhlIE1PLiBUaGlzCisgIC8vLyBwcmludHMgZXh0cmEgaW5mb3JtYXRpb24gdGhhdCBjYW4gYmUgZWFzaWx5IGluZmVycmVkIHdoZW4gcHJpbnRpbmcgdGhlCisgIC8vLyB3aG9sZSBmdW5jdGlvbiwgYnV0IG5vdCB3aGVuIHByaW50aW5nIG9ubHkgYSBmcmFnbWVudCBvZiBpdC4KKyAgLy8vIFxwYXJhbSBTaG91bGRQcmludFJlZ2lzdGVyVGllcyAtIHdoZXRoZXIgd2Ugd2FudCB0byBwcmludCByZWdpc3RlciB0aWVzLgorICAvLy8gU29tZXRpbWVzIHRoZXkgYXJlIGVhc2lseSBkZXRlcm1pbmVkIGJ5IHRoZSBpbnN0cnVjdGlvbidzIGRlc2NyaXB0b3IKKyAgLy8vIChNYWNoaW5lSW5zdHI6Omhhc0NvbXBsZXhSZWdpdGVyVGllcyBjYW4gZGV0ZXJtaW5lIGlmIGl0J3MgbmVlZGVkKS4KKyAgLy8vIFxwYXJhbSBUaWVkT3BlcmFuZElkeCAtIGlmIHdlIG5lZWQgdG8gcHJpbnQgcmVnaXN0ZXIgdGllcyB0aGlzIG5lZWRzIHRvCisgIC8vLyBwcm92aWRlIHRoZSBpbmRleCBvZiB0aGUgdGllZCByZWdpc3Rlci4gSWYgbm90LCBpdCB3aWxsIGJlIGlnbm9yZWQuCisgIC8vLyBccGFyYW0gVFJJIC0gcHJvdmlkZSBtb3JlIHRhcmdldC1zcGVjaWZpYyBpbmZvcm1hdGlvbiB0byB0aGUgcHJpbnRlci4KKyAgLy8vIFVubGlrZSB0aGUgcHJldmlvdXMgZnVuY3Rpb24sIHRoaXMgb25lIHdpbGwgbm90IHRyeSBhbmQgZ2V0IHRoZQorICAvLy8gaW5mb3JtYXRpb24gZnJvbSBpdCdzIHBhcmVudC4KKyAgLy8vIFxwYXJhbSBJbnRyaW5zaWNJbmZvIC0gc2FtZSBhcyBccCBUUkkuCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJm9zLCBNb2R1bGVTbG90VHJhY2tlciAmTVNULCBMTFQgVHlwZVRvUHJpbnQsCisgICAgICAgICAgICAgYm9vbCBQcmludERlZiwgYm9vbCBJc1N0YW5kYWxvbmUsIGJvb2wgU2hvdWxkUHJpbnRSZWdpc3RlclRpZXMsCisgICAgICAgICAgICAgdW5zaWduZWQgVGllZE9wZXJhbmRJZHgsIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJLAorICAgICAgICAgICAgIGNvbnN0IFRhcmdldEludHJpbnNpY0luZm8gKkludHJpbnNpY0luZm8pIGNvbnN0OworCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBBY2Nlc3NvcnMgdGhhdCB0ZWxsIHlvdSB3aGF0IGtpbmQgb2YgTWFjaGluZU9wZXJhbmQgeW91J3JlIGxvb2tpbmcgYXQuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBpc1JlZyAtIFRlc3RzIGlmIHRoaXMgaXMgYSBNT19SZWdpc3RlciBvcGVyYW5kLgorICBib29sIGlzUmVnKCkgY29uc3QgeyByZXR1cm4gT3BLaW5kID09IE1PX1JlZ2lzdGVyOyB9CisgIC8vLyBpc0ltbSAtIFRlc3RzIGlmIHRoaXMgaXMgYSBNT19JbW1lZGlhdGUgb3BlcmFuZC4KKyAgYm9vbCBpc0ltbSgpIGNvbnN0IHsgcmV0dXJuIE9wS2luZCA9PSBNT19JbW1lZGlhdGU7IH0KKyAgLy8vIGlzQ0ltbSAtIFRlc3QgaWYgdGhpcyBpcyBhIE1PX0NJbW1lZGlhdGUgb3BlcmFuZC4KKyAgYm9vbCBpc0NJbW0oKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fQ0ltbWVkaWF0ZTsgfQorICAvLy8gaXNGUEltbSAtIFRlc3RzIGlmIHRoaXMgaXMgYSBNT19GUEltbWVkaWF0ZSBvcGVyYW5kLgorICBib29sIGlzRlBJbW0oKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fRlBJbW1lZGlhdGU7IH0KKyAgLy8vIGlzTUJCIC0gVGVzdHMgaWYgdGhpcyBpcyBhIE1PX01hY2hpbmVCYXNpY0Jsb2NrIG9wZXJhbmQuCisgIGJvb2wgaXNNQkIoKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fTWFjaGluZUJhc2ljQmxvY2s7IH0KKyAgLy8vIGlzRkkgLSBUZXN0cyBpZiB0aGlzIGlzIGEgTU9fRnJhbWVJbmRleCBvcGVyYW5kLgorICBib29sIGlzRkkoKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fRnJhbWVJbmRleDsgfQorICAvLy8gaXNDUEkgLSBUZXN0cyBpZiB0aGlzIGlzIGEgTU9fQ29uc3RhbnRQb29sSW5kZXggb3BlcmFuZC4KKyAgYm9vbCBpc0NQSSgpIGNvbnN0IHsgcmV0dXJuIE9wS2luZCA9PSBNT19Db25zdGFudFBvb2xJbmRleDsgfQorICAvLy8gaXNUYXJnZXRJbmRleCAtIFRlc3RzIGlmIHRoaXMgaXMgYSBNT19UYXJnZXRJbmRleCBvcGVyYW5kLgorICBib29sIGlzVGFyZ2V0SW5kZXgoKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fVGFyZ2V0SW5kZXg7IH0KKyAgLy8vIGlzSlRJIC0gVGVzdHMgaWYgdGhpcyBpcyBhIE1PX0p1bXBUYWJsZUluZGV4IG9wZXJhbmQuCisgIGJvb2wgaXNKVEkoKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fSnVtcFRhYmxlSW5kZXg7IH0KKyAgLy8vIGlzR2xvYmFsIC0gVGVzdHMgaWYgdGhpcyBpcyBhIE1PX0dsb2JhbEFkZHJlc3Mgb3BlcmFuZC4KKyAgYm9vbCBpc0dsb2JhbCgpIGNvbnN0IHsgcmV0dXJuIE9wS2luZCA9PSBNT19HbG9iYWxBZGRyZXNzOyB9CisgIC8vLyBpc1N5bWJvbCAtIFRlc3RzIGlmIHRoaXMgaXMgYSBNT19FeHRlcm5hbFN5bWJvbCBvcGVyYW5kLgorICBib29sIGlzU3ltYm9sKCkgY29uc3QgeyByZXR1cm4gT3BLaW5kID09IE1PX0V4dGVybmFsU3ltYm9sOyB9CisgIC8vLyBpc0Jsb2NrQWRkcmVzcyAtIFRlc3RzIGlmIHRoaXMgaXMgYSBNT19CbG9ja0FkZHJlc3Mgb3BlcmFuZC4KKyAgYm9vbCBpc0Jsb2NrQWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIE9wS2luZCA9PSBNT19CbG9ja0FkZHJlc3M7IH0KKyAgLy8vIGlzUmVnTWFzayAtIFRlc3RzIGlmIHRoaXMgaXMgYSBNT19SZWdpc3Rlck1hc2sgb3BlcmFuZC4KKyAgYm9vbCBpc1JlZ01hc2soKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fUmVnaXN0ZXJNYXNrOyB9CisgIC8vLyBpc1JlZ0xpdmVPdXQgLSBUZXN0cyBpZiB0aGlzIGlzIGEgTU9fUmVnaXN0ZXJMaXZlT3V0IG9wZXJhbmQuCisgIGJvb2wgaXNSZWdMaXZlT3V0KCkgY29uc3QgeyByZXR1cm4gT3BLaW5kID09IE1PX1JlZ2lzdGVyTGl2ZU91dDsgfQorICAvLy8gaXNNZXRhZGF0YSAtIFRlc3RzIGlmIHRoaXMgaXMgYSBNT19NZXRhZGF0YSBvcGVyYW5kLgorICBib29sIGlzTWV0YWRhdGEoKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fTWV0YWRhdGE7IH0KKyAgYm9vbCBpc01DU3ltYm9sKCkgY29uc3QgeyByZXR1cm4gT3BLaW5kID09IE1PX01DU3ltYm9sOyB9CisgIGJvb2wgaXNDRklJbmRleCgpIGNvbnN0IHsgcmV0dXJuIE9wS2luZCA9PSBNT19DRklJbmRleDsgfQorICBib29sIGlzSW50cmluc2ljSUQoKSBjb25zdCB7IHJldHVybiBPcEtpbmQgPT0gTU9fSW50cmluc2ljSUQ7IH0KKyAgYm9vbCBpc1ByZWRpY2F0ZSgpIGNvbnN0IHsgcmV0dXJuIE9wS2luZCA9PSBNT19QcmVkaWNhdGU7IH0KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEFjY2Vzc29ycyBmb3IgUmVnaXN0ZXIgT3BlcmFuZHMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIGdldFJlZyAtIFJldHVybnMgdGhlIHJlZ2lzdGVyIG51bWJlci4KKyAgdW5zaWduZWQgZ2V0UmVnKCkgY29uc3QgeworICAgIGFzc2VydChpc1JlZygpICYmICJUaGlzIGlzIG5vdCBhIHJlZ2lzdGVyIG9wZXJhbmQhIik7CisgICAgcmV0dXJuIFNtYWxsQ29udGVudHMuUmVnTm87CisgIH0KKworICB1bnNpZ25lZCBnZXRTdWJSZWcoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzUmVnKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIFN1YlJlZ19UYXJnZXRGbGFnczsKKyAgfQorCisgIGJvb2wgaXNVc2UoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzUmVnKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuICFJc0RlZjsKKyAgfQorCisgIGJvb2wgaXNEZWYoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzUmVnKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIElzRGVmOworICB9CisKKyAgYm9vbCBpc0ltcGxpY2l0KCkgY29uc3QgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBJc0ltcDsKKyAgfQorCisgIGJvb2wgaXNEZWFkKCkgY29uc3QgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBJc0RlYWRPcktpbGwgJiBJc0RlZjsKKyAgfQorCisgIGJvb2wgaXNLaWxsKCkgY29uc3QgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBJc0RlYWRPcktpbGwgJiAhSXNEZWY7CisgIH0KKworICBib29sIGlzVW5kZWYoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzUmVnKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIElzVW5kZWY7CisgIH0KKworICAvLy8gaXNSZW5hbWFibGUgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyByZWdpc3RlciBtYXkgYmUgcmVuYW1lZCwgaS5lLiBpdCBkb2VzCisgIC8vLyBub3QgZ2VuZXJhdGUgYSB2YWx1ZSB0aGF0IGlzIHNvbWVob3cgcmVhZCBpbiBhIHdheSB0aGF0IGlzIG5vdCByZXByZXNlbnRlZAorICAvLy8gYnkgdGhlIE1hY2hpbmUgSVIgKGUuZy4gdG8gbWVldCBhbiBBQkkgb3IgSVNBIHJlcXVpcmVtZW50KS4gIFRoaXMgaXMgb25seQorICAvLy8gdmFsaWQgb24gcGh5c2ljYWwgcmVnaXN0ZXIgb3BlcmFuZHMuICBWaXJ0dWFsIHJlZ2lzdGVycyBhcmUgYXNzdW1lZCB0bworICAvLy8gYWx3YXlzIGJlIHJlbmFtYWJsZSByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiB0aGlzIGZpZWxkLgorICAvLy8KKyAgLy8vIE9wZXJhbmRzIHRoYXQgYXJlIHJlbmFtYWJsZSBjYW4gZnJlZWx5IGJlIGNoYW5nZWQgdG8gYW55IG90aGVyIHJlZ2lzdGVyCisgIC8vLyB0aGF0IGlzIGEgbWVtYmVyIG9mIHRoZSByZWdpc3RlciBjbGFzcyByZXR1cm5lZCBieQorICAvLy8gTUktPmdldFJlZ0NsYXNzQ29uc3RyYWludCgpLgorICAvLy8KKyAgLy8vIGlzUmVuYW1hYmxlIGNhbiByZXR1cm4gZmFsc2UgZm9yIHNldmVyYWwgZGlmZmVyZW50IHJlYXNvbnM6CisgIC8vLworICAvLy8gLSBBQkkgY29uc3RyYWludHMgKHNpbmNlIGxpdmVuZXNzIGlzIG5vdCBhbHdheXMgcHJlY2lzZWx5IG1vZGVsZWQpLiAgV2UKKyAgLy8vICAgY29uc2VydmF0aXZlbHkgaGFuZGxlIHRoZXNlIGNhc2VzIGJ5IHNldHRpbmcgYWxsIHBoeXNpY2FsIHJlZ2lzdGVyCisgIC8vLyAgIG9wZXJhbmRzIHRoYXQgZGlkbuKAmXQgc3RhcnQgb3V0IGFzIHZpcnR1YWwgcmVncyB0byBub3QgYmUgcmVuYW1hYmxlLgorICAvLy8gICBBbHNvIGFueSBwaHlzaWNhbCByZWdpc3RlciBvcGVyYW5kcyBjcmVhdGVkIGFmdGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24gb3IKKyAgLy8vICAgd2hvc2UgcmVnaXN0ZXIgaXMgY2hhbmdlZCBhZnRlciByZWdpc3RlciBhbGxvY2F0aW9uIHdpbGwgbm90IGJlCisgIC8vLyAgIHJlbmFtYWJsZS4gIFRoaXMgc3RhdGUgaXMgdHJhY2tlZCBpbiB0aGUgTWFjaGluZU9wZXJhbmQ6OklzUmVuYW1hYmxlCisgIC8vLyAgIGJpdC4KKyAgLy8vCisgIC8vLyAtIE9wY29kZS90YXJnZXQgY29uc3RyYWludHM6IGZvciBvcGNvZGVzIHRoYXQgaGF2ZSBjb21wbGV4IHJlZ2lzdGVyIGNsYXNzCisgIC8vLyAgIHJlcXVpcmVtZW50cyAoZS5nLiB0aGF0IGRlcGVuZCBvbiBvdGhlciBvcGVyYW5kcy9pbnN0cnVjdGlvbnMpLCB3ZSBzZXQKKyAgLy8vICAgaGFzRXh0cmFTcmNSZWdBbGxvY1JlcS9oYXNFeHRyYURzdFJlZ0FsbG9jUmVxIGluIHRoZSBtYWNoaW5lIG9wY29kZQorICAvLy8gICBkZXNjcmlwdGlvbi4gIE9wZXJhbmRzIGJlbG9uZ2luZyB0byBpbnN0cnVjdGlvbnMgd2l0aCBvcGNvZGVzIHRoYXQgYXJlCisgIC8vLyAgIG1hcmtlZCBoYXNFeHRyYVNyY1JlZ0FsbG9jUmVxL2hhc0V4dHJhRHN0UmVnQWxsb2NSZXEgcmV0dXJuIGZhbHNlIGZyb20KKyAgLy8vICAgaXNSZW5hbWFibGUoKS4gIEFkZGl0aW9uYWxseSwgdGhlIEFsbG93UmVnaXN0ZXJSZW5hbWluZyB0YXJnZXQgcHJvcGVydHkKKyAgLy8vICAgcHJldmVudHMgYW55IG9wZXJhbmRzIGZyb20gYmVpbmcgbWFya2VkIHJlbmFtYWJsZSBmb3IgdGFyZ2V0cyB0aGF0IGRvbid0CisgIC8vLyAgIGhhdmUgZGV0YWlsZWQgb3Bjb2RlIGhhc0V4dHJhU3JjUmVnQWxsb2NSZXEvaGFzRXh0cmFEc3RSZWdBbGxvY1JlcQorICAvLy8gICB2YWx1ZXMuCisgIGJvb2wgaXNSZW5hbWFibGUoKSBjb25zdDsKKworICBib29sIGlzSW50ZXJuYWxSZWFkKCkgY29uc3QgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBJc0ludGVybmFsUmVhZDsKKyAgfQorCisgIGJvb2wgaXNFYXJseUNsb2JiZXIoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzUmVnKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIElzRWFybHlDbG9iYmVyOworICB9CisKKyAgYm9vbCBpc1RpZWQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzUmVnKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIFRpZWRUbzsKKyAgfQorCisgIGJvb2wgaXNEZWJ1ZygpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gSXNEZWJ1ZzsKKyAgfQorCisgIC8vLyByZWFkc1JlZyAtIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG9wZXJhbmQgcmVhZHMgdGhlIHByZXZpb3VzIHZhbHVlIG9mIGl0cworICAvLy8gcmVnaXN0ZXIuICBBIHVzZSBvcGVyYW5kIHdpdGggdGhlIDx1bmRlZj4gZmxhZyBzZXQgZG9lc24ndCByZWFkIGl0cworICAvLy8gcmVnaXN0ZXIuICBBIHN1Yi1yZWdpc3RlciBkZWYgaW1wbGljaXRseSByZWFkcyB0aGUgb3RoZXIgcGFydHMgb2YgdGhlCisgIC8vLyByZWdpc3RlciBiZWluZyByZWRlZmluZWQgdW5sZXNzIHRoZSA8dW5kZWY+IGZsYWcgaXMgc2V0LgorICAvLy8KKyAgLy8vIFRoaXMgcmVmZXJzIHRvIHJlYWRpbmcgdGhlIHJlZ2lzdGVyIHZhbHVlIGZyb20gYmVmb3JlIHRoZSBjdXJyZW50CisgIC8vLyBpbnN0cnVjdGlvbiBvciBidW5kbGUuIEludGVybmFsIGJ1bmRsZSByZWFkcyBhcmUgbm90IGluY2x1ZGVkLgorICBib29sIHJlYWRzUmVnKCkgY29uc3QgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiAhaXNVbmRlZigpICYmICFpc0ludGVybmFsUmVhZCgpICYmIChpc1VzZSgpIHx8IGdldFN1YlJlZygpKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBNdXRhdG9ycyBmb3IgUmVnaXN0ZXIgT3BlcmFuZHMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIENoYW5nZSB0aGUgcmVnaXN0ZXIgdGhpcyBvcGVyYW5kIGNvcnJlc3BvbmRzIHRvLgorICAvLy8KKyAgdm9pZCBzZXRSZWcodW5zaWduZWQgUmVnKTsKKworICB2b2lkIHNldFN1YlJlZyh1bnNpZ25lZCBzdWJSZWcpIHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgbXV0YXRvciIpOworICAgIFN1YlJlZ19UYXJnZXRGbGFncyA9IHN1YlJlZzsKKyAgICBhc3NlcnQoU3ViUmVnX1RhcmdldEZsYWdzID09IHN1YlJlZyAmJiAiU3ViUmVnIG91dCBvZiByYW5nZSIpOworICB9CisKKyAgLy8vIHN1YnN0VmlydFJlZyAtIFN1YnN0aXR1dGUgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgd2l0aCB0aGUgdmlydHVhbAorICAvLy8gc3VicmVnaXN0ZXIgUmVnOlN1YlJlZy4gVGFrZSBhbnkgZXhpc3RpbmcgU3ViUmVnIGluZGV4IGludG8gYWNjb3VudCwKKyAgLy8vIHVzaW5nIFRhcmdldFJlZ2lzdGVySW5mbyB0byBjb21wb3NlIHRoZSBzdWJyZWcgaW5kaWNlcyBpZiBuZWNlc3NhcnkuCisgIC8vLyBSZWcgbXVzdCBiZSBhIHZpcnR1YWwgcmVnaXN0ZXIsIFN1YklkeCBjYW4gYmUgMC4KKyAgLy8vCisgIHZvaWQgc3Vic3RWaXJ0UmVnKHVuc2lnbmVkIFJlZywgdW5zaWduZWQgU3ViSWR4LCBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8mKTsKKworICAvLy8gc3Vic3RQaHlzUmVnIC0gU3Vic3RpdHV0ZSB0aGUgY3VycmVudCByZWdpc3RlciB3aXRoIHRoZSBwaHlzaWNhbCByZWdpc3RlcgorICAvLy8gUmVnLCB0YWtpbmcgYW55IGV4aXN0aW5nIFN1YlJlZyBpbnRvIGFjY291bnQuIEZvciBpbnN0YW5jZSwKKyAgLy8vIHN1YnN0UGh5c1JlZyglZWF4KSB3aWxsIGNoYW5nZSAlcmVnMTAyNDpzdWJfOGJpdCB0byAlYWwuCisgIC8vLworICB2b2lkIHN1YnN0UGh5c1JlZyh1bnNpZ25lZCBSZWcsIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyYpOworCisgIHZvaWQgc2V0SXNVc2UoYm9vbCBWYWwgPSB0cnVlKSB7IHNldElzRGVmKCFWYWwpOyB9CisKKyAgLy8vIENoYW5nZSBhIGRlZiB0byBhIHVzZSwgb3IgYSB1c2UgdG8gYSBkZWYuCisgIHZvaWQgc2V0SXNEZWYoYm9vbCBWYWwgPSB0cnVlKTsKKworICB2b2lkIHNldEltcGxpY2l0KGJvb2wgVmFsID0gdHJ1ZSkgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBtdXRhdG9yIik7CisgICAgSXNJbXAgPSBWYWw7CisgIH0KKworICB2b2lkIHNldElzS2lsbChib29sIFZhbCA9IHRydWUpIHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAhSXNEZWYgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIG11dGF0b3IiKTsKKyAgICBhc3NlcnQoKCFWYWwgfHwgIWlzRGVidWcoKSkgJiYgIk1hcmtpbmcgYSBkZWJ1ZyBvcGVyYXRpb24gYXMga2lsbCIpOworICAgIElzRGVhZE9yS2lsbCA9IFZhbDsKKyAgfQorCisgIHZvaWQgc2V0SXNEZWFkKGJvb2wgVmFsID0gdHJ1ZSkgeworICAgIGFzc2VydChpc1JlZygpICYmIElzRGVmICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBtdXRhdG9yIik7CisgICAgSXNEZWFkT3JLaWxsID0gVmFsOworICB9CisKKyAgdm9pZCBzZXRJc1VuZGVmKGJvb2wgVmFsID0gdHJ1ZSkgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBtdXRhdG9yIik7CisgICAgSXNVbmRlZiA9IFZhbDsKKyAgfQorCisgIHZvaWQgc2V0SXNSZW5hbWFibGUoYm9vbCBWYWwgPSB0cnVlKTsKKworICB2b2lkIHNldElzSW50ZXJuYWxSZWFkKGJvb2wgVmFsID0gdHJ1ZSkgeworICAgIGFzc2VydChpc1JlZygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBtdXRhdG9yIik7CisgICAgSXNJbnRlcm5hbFJlYWQgPSBWYWw7CisgIH0KKworICB2b2lkIHNldElzRWFybHlDbG9iYmVyKGJvb2wgVmFsID0gdHJ1ZSkgeworICAgIGFzc2VydChpc1JlZygpICYmIElzRGVmICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBtdXRhdG9yIik7CisgICAgSXNFYXJseUNsb2JiZXIgPSBWYWw7CisgIH0KKworICB2b2lkIHNldElzRGVidWcoYm9vbCBWYWwgPSB0cnVlKSB7CisgICAgYXNzZXJ0KGlzUmVnKCkgJiYgIUlzRGVmICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBtdXRhdG9yIik7CisgICAgSXNEZWJ1ZyA9IFZhbDsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBBY2Nlc3NvcnMgZm9yIHZhcmlvdXMgb3BlcmFuZCB0eXBlcy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgaW50NjRfdCBnZXRJbW0oKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzSW1tKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIENvbnRlbnRzLkltbVZhbDsKKyAgfQorCisgIGNvbnN0IENvbnN0YW50SW50ICpnZXRDSW1tKCkgY29uc3QgeworICAgIGFzc2VydChpc0NJbW0oKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gQ29udGVudHMuQ0k7CisgIH0KKworICBjb25zdCBDb25zdGFudEZQICpnZXRGUEltbSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNGUEltbSgpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBDb250ZW50cy5DRlA7CisgIH0KKworICBNYWNoaW5lQmFzaWNCbG9jayAqZ2V0TUJCKCkgY29uc3QgeworICAgIGFzc2VydChpc01CQigpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBDb250ZW50cy5NQkI7CisgIH0KKworICBpbnQgZ2V0SW5kZXgoKSBjb25zdCB7CisgICAgYXNzZXJ0KChpc0ZJKCkgfHwgaXNDUEkoKSB8fCBpc1RhcmdldEluZGV4KCkgfHwgaXNKVEkoKSkgJiYKKyAgICAgICAgICAgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIENvbnRlbnRzLk9mZnNldGVkSW5mby5WYWwuSW5kZXg7CisgIH0KKworICBjb25zdCBHbG9iYWxWYWx1ZSAqZ2V0R2xvYmFsKCkgY29uc3QgeworICAgIGFzc2VydChpc0dsb2JhbCgpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBDb250ZW50cy5PZmZzZXRlZEluZm8uVmFsLkdWOworICB9CisKKyAgY29uc3QgQmxvY2tBZGRyZXNzICpnZXRCbG9ja0FkZHJlc3MoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQmxvY2tBZGRyZXNzKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIENvbnRlbnRzLk9mZnNldGVkSW5mby5WYWwuQkE7CisgIH0KKworICBNQ1N5bWJvbCAqZ2V0TUNTeW1ib2woKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzTUNTeW1ib2woKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gQ29udGVudHMuU3ltOworICB9CisKKyAgdW5zaWduZWQgZ2V0Q0ZJSW5kZXgoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQ0ZJSW5kZXgoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gQ29udGVudHMuQ0ZJSW5kZXg7CisgIH0KKworICBJbnRyaW5zaWM6OklEIGdldEludHJpbnNpY0lEKCkgY29uc3QgeworICAgIGFzc2VydChpc0ludHJpbnNpY0lEKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIENvbnRlbnRzLkludHJpbnNpY0lEOworICB9CisKKyAgdW5zaWduZWQgZ2V0UHJlZGljYXRlKCkgY29uc3QgeworICAgIGFzc2VydChpc1ByZWRpY2F0ZSgpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBDb250ZW50cy5QcmVkOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgb2Zmc2V0IGZyb20gdGhlIHN5bWJvbCBpbiB0aGlzIG9wZXJhbmQuIFRoaXMgYWx3YXlzIHJldHVybnMgMAorICAvLy8gZm9yIEV4dGVybmFsU3ltYm9sIG9wZXJhbmRzLgorICBpbnQ2NF90IGdldE9mZnNldCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoKGlzR2xvYmFsKCkgfHwgaXNTeW1ib2woKSB8fCBpc01DU3ltYm9sKCkgfHwgaXNDUEkoKSB8fAorICAgICAgICAgICAgaXNUYXJnZXRJbmRleCgpIHx8IGlzQmxvY2tBZGRyZXNzKCkpICYmCisgICAgICAgICAgICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBhY2Nlc3NvciIpOworICAgIHJldHVybiBpbnQ2NF90KHVpbnQ2NF90KENvbnRlbnRzLk9mZnNldGVkSW5mby5PZmZzZXRIaSkgPDwgMzIpIHwKKyAgICAgICAgICAgU21hbGxDb250ZW50cy5PZmZzZXRMbzsKKyAgfQorCisgIGNvbnN0IGNoYXIgKmdldFN5bWJvbE5hbWUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzU3ltYm9sKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIENvbnRlbnRzLk9mZnNldGVkSW5mby5WYWwuU3ltYm9sTmFtZTsKKyAgfQorCisgIC8vLyBjbG9iYmVyc1BoeXNSZWcgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyBSZWdNYXNrIGNsb2JiZXJzIFBoeXNSZWcuCisgIC8vLyBJdCBpcyBzb21ldGltZXMgbmVjZXNzYXJ5IHRvIGRldGFjaCB0aGUgcmVnaXN0ZXIgbWFzayBwb2ludGVyIGZyb20gaXRzCisgIC8vLyBtYWNoaW5lIG9wZXJhbmQuIFRoaXMgc3RhdGljIG1ldGhvZCBjYW4gYmUgdXNlZCBmb3Igc3VjaCBkZXRhY2hlZCBiaXQKKyAgLy8vIG1hc2sgcG9pbnRlcnMuCisgIHN0YXRpYyBib29sIGNsb2JiZXJzUGh5c1JlZyhjb25zdCB1aW50MzJfdCAqUmVnTWFzaywgdW5zaWduZWQgUGh5c1JlZykgeworICAgIC8vIFNlZSBUYXJnZXRSZWdpc3RlckluZm8uaC4KKyAgICBhc3NlcnQoUGh5c1JlZyA8ICgxdSA8PCAzMCkgJiYgIk5vdCBhIHBoeXNpY2FsIHJlZ2lzdGVyIik7CisgICAgcmV0dXJuICEoUmVnTWFza1tQaHlzUmVnIC8gMzJdICYgKDF1IDw8IFBoeXNSZWcgJSAzMikpOworICB9CisKKyAgLy8vIGNsb2JiZXJzUGh5c1JlZyAtIFJldHVybnMgdHJ1ZSBpZiB0aGlzIFJlZ01hc2sgb3BlcmFuZCBjbG9iYmVycyBQaHlzUmVnLgorICBib29sIGNsb2JiZXJzUGh5c1JlZyh1bnNpZ25lZCBQaHlzUmVnKSBjb25zdCB7CisgICAgIHJldHVybiBjbG9iYmVyc1BoeXNSZWcoZ2V0UmVnTWFzaygpLCBQaHlzUmVnKTsKKyAgfQorCisgIC8vLyBnZXRSZWdNYXNrIC0gUmV0dXJucyBhIGJpdCBtYXNrIG9mIHJlZ2lzdGVycyBwcmVzZXJ2ZWQgYnkgdGhpcyBSZWdNYXNrCisgIC8vLyBvcGVyYW5kLgorICBjb25zdCB1aW50MzJfdCAqZ2V0UmVnTWFzaygpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNSZWdNYXNrKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIGFjY2Vzc29yIik7CisgICAgcmV0dXJuIENvbnRlbnRzLlJlZ01hc2s7CisgIH0KKworICAvLy8gZ2V0UmVnTGl2ZU91dCAtIFJldHVybnMgYSBiaXQgbWFzayBvZiBsaXZlLW91dCByZWdpc3RlcnMuCisgIGNvbnN0IHVpbnQzMl90ICpnZXRSZWdMaXZlT3V0KCkgY29uc3QgeworICAgIGFzc2VydChpc1JlZ0xpdmVPdXQoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gQ29udGVudHMuUmVnTWFzazsKKyAgfQorCisgIGNvbnN0IE1ETm9kZSAqZ2V0TWV0YWRhdGEoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzTWV0YWRhdGEoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgYWNjZXNzb3IiKTsKKyAgICByZXR1cm4gQ29udGVudHMuTUQ7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTXV0YXRvcnMgZm9yIHZhcmlvdXMgb3BlcmFuZCB0eXBlcy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgdm9pZCBzZXRJbW0oaW50NjRfdCBpbW1WYWwpIHsKKyAgICBhc3NlcnQoaXNJbW0oKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgbXV0YXRvciIpOworICAgIENvbnRlbnRzLkltbVZhbCA9IGltbVZhbDsKKyAgfQorCisgIHZvaWQgc2V0RlBJbW0oY29uc3QgQ29uc3RhbnRGUCAqQ0ZQKSB7CisgICAgYXNzZXJ0KGlzRlBJbW0oKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgbXV0YXRvciIpOworICAgIENvbnRlbnRzLkNGUCA9IENGUDsKKyAgfQorCisgIHZvaWQgc2V0T2Zmc2V0KGludDY0X3QgT2Zmc2V0KSB7CisgICAgYXNzZXJ0KChpc0dsb2JhbCgpIHx8IGlzU3ltYm9sKCkgfHwgaXNNQ1N5bWJvbCgpIHx8IGlzQ1BJKCkgfHwKKyAgICAgICAgICAgIGlzVGFyZ2V0SW5kZXgoKSB8fCBpc0Jsb2NrQWRkcmVzcygpKSAmJgorICAgICAgICAgICAiV3JvbmcgTWFjaGluZU9wZXJhbmQgbXV0YXRvciIpOworICAgIFNtYWxsQ29udGVudHMuT2Zmc2V0TG8gPSB1bnNpZ25lZChPZmZzZXQpOworICAgIENvbnRlbnRzLk9mZnNldGVkSW5mby5PZmZzZXRIaSA9IGludChPZmZzZXQgPj4gMzIpOworICB9CisKKyAgdm9pZCBzZXRJbmRleChpbnQgSWR4KSB7CisgICAgYXNzZXJ0KChpc0ZJKCkgfHwgaXNDUEkoKSB8fCBpc1RhcmdldEluZGV4KCkgfHwgaXNKVEkoKSkgJiYKKyAgICAgICAgICAgIldyb25nIE1hY2hpbmVPcGVyYW5kIG11dGF0b3IiKTsKKyAgICBDb250ZW50cy5PZmZzZXRlZEluZm8uVmFsLkluZGV4ID0gSWR4OworICB9CisKKyAgdm9pZCBzZXRNZXRhZGF0YShjb25zdCBNRE5vZGUgKk1EKSB7CisgICAgYXNzZXJ0KGlzTWV0YWRhdGEoKSAmJiAiV3JvbmcgTWFjaGluZU9wZXJhbmQgbXV0YXRvciIpOworICAgIENvbnRlbnRzLk1EID0gTUQ7CisgIH0KKworICB2b2lkIHNldE1CQihNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSB7CisgICAgYXNzZXJ0KGlzTUJCKCkgJiYgIldyb25nIE1hY2hpbmVPcGVyYW5kIG11dGF0b3IiKTsKKyAgICBDb250ZW50cy5NQkIgPSBNQkI7CisgIH0KKworICAvLy8gU2V0cyB2YWx1ZSBvZiByZWdpc3RlciBtYXNrIG9wZXJhbmQgcmVmZXJlbmNpbmcgTWFzay4gIFRoZQorICAvLy8gb3BlcmFuZCBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgbWVtb3J5IHJlZmVyZW5jZWQgYnkgTWFzaywgaXQgbXVzdAorICAvLy8gcmVtYWluIHZhbGlkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIG9wZXJhbmQuIFNlZSBDcmVhdGVSZWdNYXNrKCkuCisgIC8vLyBBbnkgcGh5c3JlZyB3aXRoIGEgMCBiaXQgaW4gdGhlIG1hc2sgaXMgY2xvYmJlcmVkIGJ5IHRoZSBpbnN0cnVjdGlvbi4KKyAgdm9pZCBzZXRSZWdNYXNrKGNvbnN0IHVpbnQzMl90ICpSZWdNYXNrUHRyKSB7CisgICAgYXNzZXJ0KGlzUmVnTWFzaygpICYmICJXcm9uZyBNYWNoaW5lT3BlcmFuZCBtdXRhdG9yIik7CisgICAgQ29udGVudHMuUmVnTWFzayA9IFJlZ01hc2tQdHI7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gT3RoZXIgbWV0aG9kcy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG9wZXJhbmQgaXMgaWRlbnRpY2FsIHRvIHRoZSBzcGVjaWZpZWQgb3BlcmFuZCBleGNlcHQKKyAgLy8vIGZvciBsaXZlbmVzcyByZWxhdGVkIGZsYWdzIChpc0tpbGwsIGlzVW5kZWYgYW5kIGlzRGVhZCkuIE5vdGUgdGhhdCB0aGlzCisgIC8vLyBzaG91bGQgc3RheSBpbiBzeW5jIHdpdGggdGhlIGhhc2hfdmFsdWUgb3ZlcmxvYWQgYmVsb3cuCisgIGJvb2wgaXNJZGVudGljYWxUbyhjb25zdCBNYWNoaW5lT3BlcmFuZCAmT3RoZXIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgTWFjaGluZU9wZXJhbmQgaGFzaF92YWx1ZSBvdmVybG9hZC4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBpbmNsdWRlcyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBpbiB0aGUgaGFzaCB0aGF0CisgIC8vLyBpc0lkZW50aWNhbFRvIHVzZXMgZm9yIGNvbXBhcmlzb24uIEl0IGlzIHRodXMgc3VpdGVkIGZvciB1c2UgaW4gaGFzaAorICAvLy8gdGFibGVzIHdoaWNoIHVzZSB0aGF0IGZ1bmN0aW9uIGZvciBlcXVhbGl0eSBjb21wYXJpc29ucyBvbmx5LiBUaGlzIG11c3QKKyAgLy8vIHN0YXkgZXhhY3RseSBpbiBzeW5jIHdpdGggaXNJZGVudGljYWxUbyBhYm92ZS4KKyAgZnJpZW5kIGhhc2hfY29kZSBoYXNoX3ZhbHVlKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTyk7CisKKyAgLy8vIENoYW5nZVRvSW1tZWRpYXRlIC0gUmVwbGFjZSB0aGlzIG9wZXJhbmQgd2l0aCBhIG5ldyBpbW1lZGlhdGUgb3BlcmFuZCBvZgorICAvLy8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gIElmIGFuIG9wZXJhbmQgaXMga25vd24gdG8gYmUgYW4gaW1tZWRpYXRlIGFscmVhZHksCisgIC8vLyB0aGUgc2V0SW1tIG1ldGhvZCBzaG91bGQgYmUgdXNlZC4KKyAgdm9pZCBDaGFuZ2VUb0ltbWVkaWF0ZShpbnQ2NF90IEltbVZhbCk7CisKKyAgLy8vIENoYW5nZVRvRlBJbW1lZGlhdGUgLSBSZXBsYWNlIHRoaXMgb3BlcmFuZCB3aXRoIGEgbmV3IEZQIGltbWVkaWF0ZSBvcGVyYW5kCisgIC8vLyBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLiAgSWYgYW4gb3BlcmFuZCBpcyBrbm93biB0byBiZSBhbiBGUCBpbW1lZGlhdGUKKyAgLy8vIGFscmVhZHksIHRoZSBzZXRGUEltbSBtZXRob2Qgc2hvdWxkIGJlIHVzZWQuCisgIHZvaWQgQ2hhbmdlVG9GUEltbWVkaWF0ZShjb25zdCBDb25zdGFudEZQICpGUEltbSk7CisKKyAgLy8vIENoYW5nZVRvRVMgLSBSZXBsYWNlIHRoaXMgb3BlcmFuZCB3aXRoIGEgbmV3IGV4dGVybmFsIHN5bWJvbCBvcGVyYW5kLgorICB2b2lkIENoYW5nZVRvRVMoY29uc3QgY2hhciAqU3ltTmFtZSwgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApOworCisgIC8vLyBDaGFuZ2VUb01DU3ltYm9sIC0gUmVwbGFjZSB0aGlzIG9wZXJhbmQgd2l0aCBhIG5ldyBNQyBzeW1ib2wgb3BlcmFuZC4KKyAgdm9pZCBDaGFuZ2VUb01DU3ltYm9sKE1DU3ltYm9sICpTeW0pOworCisgIC8vLyBSZXBsYWNlIHRoaXMgb3BlcmFuZCB3aXRoIGEgZnJhbWUgaW5kZXguCisgIHZvaWQgQ2hhbmdlVG9GcmFtZUluZGV4KGludCBJZHgpOworCisgIC8vLyBSZXBsYWNlIHRoaXMgb3BlcmFuZCB3aXRoIGEgdGFyZ2V0IGluZGV4LgorICB2b2lkIENoYW5nZVRvVGFyZ2V0SW5kZXgodW5zaWduZWQgSWR4LCBpbnQ2NF90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKTsKKworICAvLy8gQ2hhbmdlVG9SZWdpc3RlciAtIFJlcGxhY2UgdGhpcyBvcGVyYW5kIHdpdGggYSBuZXcgcmVnaXN0ZXIgb3BlcmFuZCBvZgorICAvLy8gdGhlIHNwZWNpZmllZCB2YWx1ZS4gIElmIGFuIG9wZXJhbmQgaXMga25vd24gdG8gYmUgYW4gcmVnaXN0ZXIgYWxyZWFkeSwKKyAgLy8vIHRoZSBzZXRSZWcgbWV0aG9kIHNob3VsZCBiZSB1c2VkLgorICB2b2lkIENoYW5nZVRvUmVnaXN0ZXIodW5zaWduZWQgUmVnLCBib29sIGlzRGVmLCBib29sIGlzSW1wID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzS2lsbCA9IGZhbHNlLCBib29sIGlzRGVhZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1VuZGVmID0gZmFsc2UsIGJvb2wgaXNEZWJ1ZyA9IGZhbHNlKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQ29uc3RydWN0aW9uIG1ldGhvZHMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBDcmVhdGVJbW0oaW50NjRfdCBWYWwpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCBPcChNYWNoaW5lT3BlcmFuZDo6TU9fSW1tZWRpYXRlKTsKKyAgICBPcC5zZXRJbW0oVmFsKTsKKyAgICByZXR1cm4gT3A7CisgIH0KKworICBzdGF0aWMgTWFjaGluZU9wZXJhbmQgQ3JlYXRlQ0ltbShjb25zdCBDb25zdGFudEludCAqQ0kpIHsKKyAgICBNYWNoaW5lT3BlcmFuZCBPcChNYWNoaW5lT3BlcmFuZDo6TU9fQ0ltbWVkaWF0ZSk7CisgICAgT3AuQ29udGVudHMuQ0kgPSBDSTsKKyAgICByZXR1cm4gT3A7CisgIH0KKworICBzdGF0aWMgTWFjaGluZU9wZXJhbmQgQ3JlYXRlRlBJbW0oY29uc3QgQ29uc3RhbnRGUCAqQ0ZQKSB7CisgICAgTWFjaGluZU9wZXJhbmQgT3AoTWFjaGluZU9wZXJhbmQ6Ok1PX0ZQSW1tZWRpYXRlKTsKKyAgICBPcC5Db250ZW50cy5DRlAgPSBDRlA7CisgICAgcmV0dXJuIE9wOworICB9CisKKyAgc3RhdGljIE1hY2hpbmVPcGVyYW5kIENyZWF0ZVJlZyh1bnNpZ25lZCBSZWcsIGJvb2wgaXNEZWYsIGJvb2wgaXNJbXAgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzS2lsbCA9IGZhbHNlLCBib29sIGlzRGVhZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNVbmRlZiA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNFYXJseUNsb2JiZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTdWJSZWcgPSAwLCBib29sIGlzRGVidWcgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzSW50ZXJuYWxSZWFkID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1JlbmFtYWJsZSA9IGZhbHNlKSB7CisgICAgYXNzZXJ0KCEoaXNEZWFkICYmICFpc0RlZikgJiYgIkRlYWQgZmxhZyBvbiBub24tZGVmIik7CisgICAgYXNzZXJ0KCEoaXNLaWxsICYmIGlzRGVmKSAmJiAiS2lsbCBmbGFnIG9uIGRlZiIpOworICAgIE1hY2hpbmVPcGVyYW5kIE9wKE1hY2hpbmVPcGVyYW5kOjpNT19SZWdpc3Rlcik7CisgICAgT3AuSXNEZWYgPSBpc0RlZjsKKyAgICBPcC5Jc0ltcCA9IGlzSW1wOworICAgIE9wLklzRGVhZE9yS2lsbCA9IGlzS2lsbCB8IGlzRGVhZDsKKyAgICBPcC5Jc1JlbmFtYWJsZSA9IGlzUmVuYW1hYmxlOworICAgIE9wLklzVW5kZWYgPSBpc1VuZGVmOworICAgIE9wLklzSW50ZXJuYWxSZWFkID0gaXNJbnRlcm5hbFJlYWQ7CisgICAgT3AuSXNFYXJseUNsb2JiZXIgPSBpc0Vhcmx5Q2xvYmJlcjsKKyAgICBPcC5UaWVkVG8gPSAwOworICAgIE9wLklzRGVidWcgPSBpc0RlYnVnOworICAgIE9wLlNtYWxsQ29udGVudHMuUmVnTm8gPSBSZWc7CisgICAgT3AuQ29udGVudHMuUmVnLlByZXYgPSBudWxscHRyOworICAgIE9wLkNvbnRlbnRzLlJlZy5OZXh0ID0gbnVsbHB0cjsKKyAgICBPcC5zZXRTdWJSZWcoU3ViUmVnKTsKKyAgICByZXR1cm4gT3A7CisgIH0KKyAgc3RhdGljIE1hY2hpbmVPcGVyYW5kIENyZWF0ZU1CQihNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKSB7CisgICAgTWFjaGluZU9wZXJhbmQgT3AoTWFjaGluZU9wZXJhbmQ6Ok1PX01hY2hpbmVCYXNpY0Jsb2NrKTsKKyAgICBPcC5zZXRNQkIoTUJCKTsKKyAgICBPcC5zZXRUYXJnZXRGbGFncyhUYXJnZXRGbGFncyk7CisgICAgcmV0dXJuIE9wOworICB9CisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBDcmVhdGVGSShpbnQgSWR4KSB7CisgICAgTWFjaGluZU9wZXJhbmQgT3AoTWFjaGluZU9wZXJhbmQ6Ok1PX0ZyYW1lSW5kZXgpOworICAgIE9wLnNldEluZGV4KElkeCk7CisgICAgcmV0dXJuIE9wOworICB9CisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBDcmVhdGVDUEkodW5zaWduZWQgSWR4LCBpbnQgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKSB7CisgICAgTWFjaGluZU9wZXJhbmQgT3AoTWFjaGluZU9wZXJhbmQ6Ok1PX0NvbnN0YW50UG9vbEluZGV4KTsKKyAgICBPcC5zZXRJbmRleChJZHgpOworICAgIE9wLnNldE9mZnNldChPZmZzZXQpOworICAgIE9wLnNldFRhcmdldEZsYWdzKFRhcmdldEZsYWdzKTsKKyAgICByZXR1cm4gT3A7CisgIH0KKyAgc3RhdGljIE1hY2hpbmVPcGVyYW5kIENyZWF0ZVRhcmdldEluZGV4KHVuc2lnbmVkIElkeCwgaW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgeworICAgIE1hY2hpbmVPcGVyYW5kIE9wKE1hY2hpbmVPcGVyYW5kOjpNT19UYXJnZXRJbmRleCk7CisgICAgT3Auc2V0SW5kZXgoSWR4KTsKKyAgICBPcC5zZXRPZmZzZXQoT2Zmc2V0KTsKKyAgICBPcC5zZXRUYXJnZXRGbGFncyhUYXJnZXRGbGFncyk7CisgICAgcmV0dXJuIE9wOworICB9CisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBDcmVhdGVKVEkodW5zaWduZWQgSWR4LCB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgeworICAgIE1hY2hpbmVPcGVyYW5kIE9wKE1hY2hpbmVPcGVyYW5kOjpNT19KdW1wVGFibGVJbmRleCk7CisgICAgT3Auc2V0SW5kZXgoSWR4KTsKKyAgICBPcC5zZXRUYXJnZXRGbGFncyhUYXJnZXRGbGFncyk7CisgICAgcmV0dXJuIE9wOworICB9CisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBDcmVhdGVHQShjb25zdCBHbG9iYWxWYWx1ZSAqR1YsIGludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApIHsKKyAgICBNYWNoaW5lT3BlcmFuZCBPcChNYWNoaW5lT3BlcmFuZDo6TU9fR2xvYmFsQWRkcmVzcyk7CisgICAgT3AuQ29udGVudHMuT2Zmc2V0ZWRJbmZvLlZhbC5HViA9IEdWOworICAgIE9wLnNldE9mZnNldChPZmZzZXQpOworICAgIE9wLnNldFRhcmdldEZsYWdzKFRhcmdldEZsYWdzKTsKKyAgICByZXR1cm4gT3A7CisgIH0KKyAgc3RhdGljIE1hY2hpbmVPcGVyYW5kIENyZWF0ZUVTKGNvbnN0IGNoYXIgKlN5bU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgeworICAgIE1hY2hpbmVPcGVyYW5kIE9wKE1hY2hpbmVPcGVyYW5kOjpNT19FeHRlcm5hbFN5bWJvbCk7CisgICAgT3AuQ29udGVudHMuT2Zmc2V0ZWRJbmZvLlZhbC5TeW1ib2xOYW1lID0gU3ltTmFtZTsKKyAgICBPcC5zZXRPZmZzZXQoMCk7IC8vIE9mZnNldCBpcyBhbHdheXMgMC4KKyAgICBPcC5zZXRUYXJnZXRGbGFncyhUYXJnZXRGbGFncyk7CisgICAgcmV0dXJuIE9wOworICB9CisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBDcmVhdGVCQShjb25zdCBCbG9ja0FkZHJlc3MgKkJBLCBpbnQ2NF90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKSB7CisgICAgTWFjaGluZU9wZXJhbmQgT3AoTWFjaGluZU9wZXJhbmQ6Ok1PX0Jsb2NrQWRkcmVzcyk7CisgICAgT3AuQ29udGVudHMuT2Zmc2V0ZWRJbmZvLlZhbC5CQSA9IEJBOworICAgIE9wLnNldE9mZnNldChPZmZzZXQpOworICAgIE9wLnNldFRhcmdldEZsYWdzKFRhcmdldEZsYWdzKTsKKyAgICByZXR1cm4gT3A7CisgIH0KKyAgLy8vIENyZWF0ZVJlZ01hc2sgLSBDcmVhdGVzIGEgcmVnaXN0ZXIgbWFzayBvcGVyYW5kIHJlZmVyZW5jaW5nIE1hc2suICBUaGUKKyAgLy8vIG9wZXJhbmQgZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YgdGhlIG1lbW9yeSByZWZlcmVuY2VkIGJ5IE1hc2ssIGl0CisgIC8vLyBtdXN0IHJlbWFpbiB2YWxpZCBmb3IgdGhlIGxpZmV0aW1lIG9mIHRoZSBvcGVyYW5kLgorICAvLy8KKyAgLy8vIEEgUmVnTWFzayBvcGVyYW5kIHJlcHJlc2VudHMgYSBzZXQgb2Ygbm9uLWNsb2JiZXJlZCBwaHlzaWNhbCByZWdpc3RlcnMKKyAgLy8vIG9uIGFuIGluc3RydWN0aW9uIHRoYXQgY2xvYmJlcnMgbWFueSByZWdpc3RlcnMsIHR5cGljYWxseSBhIGNhbGwuICBUaGUKKyAgLy8vIGJpdCBtYXNrIGhhcyBhIGJpdCBzZXQgZm9yIGVhY2ggcGh5c3JlZyB0aGF0IGlzIHByZXNlcnZlZCBieSB0aGlzCisgIC8vLyBpbnN0cnVjdGlvbiwgYXMgZGVzY3JpYmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvcgorICAvLy8gVGFyZ2V0UmVnaXN0ZXJJbmZvOjpnZXRDYWxsUHJlc2VydmVkTWFzaygpLgorICAvLy8KKyAgLy8vIEFueSBwaHlzcmVnIHdpdGggYSAwIGJpdCBpbiB0aGUgbWFzayBpcyBjbG9iYmVyZWQgYnkgdGhlIGluc3RydWN0aW9uLgorICAvLy8KKyAgc3RhdGljIE1hY2hpbmVPcGVyYW5kIENyZWF0ZVJlZ01hc2soY29uc3QgdWludDMyX3QgKk1hc2spIHsKKyAgICBhc3NlcnQoTWFzayAmJiAiTWlzc2luZyByZWdpc3RlciBtYXNrIik7CisgICAgTWFjaGluZU9wZXJhbmQgT3AoTWFjaGluZU9wZXJhbmQ6Ok1PX1JlZ2lzdGVyTWFzayk7CisgICAgT3AuQ29udGVudHMuUmVnTWFzayA9IE1hc2s7CisgICAgcmV0dXJuIE9wOworICB9CisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBDcmVhdGVSZWdMaXZlT3V0KGNvbnN0IHVpbnQzMl90ICpNYXNrKSB7CisgICAgYXNzZXJ0KE1hc2sgJiYgIk1pc3NpbmcgbGl2ZS1vdXQgcmVnaXN0ZXIgbWFzayIpOworICAgIE1hY2hpbmVPcGVyYW5kIE9wKE1hY2hpbmVPcGVyYW5kOjpNT19SZWdpc3RlckxpdmVPdXQpOworICAgIE9wLkNvbnRlbnRzLlJlZ01hc2sgPSBNYXNrOworICAgIHJldHVybiBPcDsKKyAgfQorICBzdGF0aWMgTWFjaGluZU9wZXJhbmQgQ3JlYXRlTWV0YWRhdGEoY29uc3QgTUROb2RlICpNZXRhKSB7CisgICAgTWFjaGluZU9wZXJhbmQgT3AoTWFjaGluZU9wZXJhbmQ6Ok1PX01ldGFkYXRhKTsKKyAgICBPcC5Db250ZW50cy5NRCA9IE1ldGE7CisgICAgcmV0dXJuIE9wOworICB9CisKKyAgc3RhdGljIE1hY2hpbmVPcGVyYW5kIENyZWF0ZU1DU3ltYm9sKE1DU3ltYm9sICpTeW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgeworICAgIE1hY2hpbmVPcGVyYW5kIE9wKE1hY2hpbmVPcGVyYW5kOjpNT19NQ1N5bWJvbCk7CisgICAgT3AuQ29udGVudHMuU3ltID0gU3ltOworICAgIE9wLnNldE9mZnNldCgwKTsKKyAgICBPcC5zZXRUYXJnZXRGbGFncyhUYXJnZXRGbGFncyk7CisgICAgcmV0dXJuIE9wOworICB9CisKKyAgc3RhdGljIE1hY2hpbmVPcGVyYW5kIENyZWF0ZUNGSUluZGV4KHVuc2lnbmVkIENGSUluZGV4KSB7CisgICAgTWFjaGluZU9wZXJhbmQgT3AoTWFjaGluZU9wZXJhbmQ6Ok1PX0NGSUluZGV4KTsKKyAgICBPcC5Db250ZW50cy5DRklJbmRleCA9IENGSUluZGV4OworICAgIHJldHVybiBPcDsKKyAgfQorCisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBDcmVhdGVJbnRyaW5zaWNJRChJbnRyaW5zaWM6OklEIElEKSB7CisgICAgTWFjaGluZU9wZXJhbmQgT3AoTWFjaGluZU9wZXJhbmQ6Ok1PX0ludHJpbnNpY0lEKTsKKyAgICBPcC5Db250ZW50cy5JbnRyaW5zaWNJRCA9IElEOworICAgIHJldHVybiBPcDsKKyAgfQorCisgIHN0YXRpYyBNYWNoaW5lT3BlcmFuZCBDcmVhdGVQcmVkaWNhdGUodW5zaWduZWQgUHJlZCkgeworICAgIE1hY2hpbmVPcGVyYW5kIE9wKE1hY2hpbmVPcGVyYW5kOjpNT19QcmVkaWNhdGUpOworICAgIE9wLkNvbnRlbnRzLlByZWQgPSBQcmVkOworICAgIHJldHVybiBPcDsKKyAgfQorCisgIGZyaWVuZCBjbGFzcyBNYWNoaW5lSW5zdHI7CisgIGZyaWVuZCBjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworCitwcml2YXRlOgorICAvLyBJZiB0aGlzIG9wZXJhbmQgaXMgY3VycmVudGx5IGEgcmVnaXN0ZXIgb3BlcmFuZCwgYW5kIGlmIHRoaXMgaXMgaW4gYQorICAvLyBmdW5jdGlvbiwgZGVyZWdpc3RlciB0aGUgb3BlcmFuZCBmcm9tIHRoZSByZWdpc3RlcidzIHVzZS9kZWYgbGlzdC4KKyAgdm9pZCByZW1vdmVSZWdGcm9tVXNlcygpOworCisgIC8vLyBBcnRpZmljaWFsIGtpbmRzIGZvciBEZW5zZU1hcCB1c2FnZS4KKyAgZW51bSA6IHVuc2lnbmVkIGNoYXIgeworICAgIE1PX0VtcHR5ID0gTU9fTGFzdCArIDEsCisgICAgTU9fVG9tYnN0b25lLAorICB9OworCisgIGZyaWVuZCBzdHJ1Y3QgRGVuc2VNYXBJbmZvPE1hY2hpbmVPcGVyYW5kPjsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTWV0aG9kcyBmb3IgaGFuZGxpbmcgcmVnaXN0ZXIgdXNlL2RlZiBsaXN0cy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIGlzT25SZWdVc2VMaXN0IC0gUmV0dXJuIHRydWUgaWYgdGhpcyBvcGVyYW5kIGlzIG9uIGEgcmVnaXN0ZXIgdXNlL2RlZgorICAvLy8gbGlzdCBvciBmYWxzZSBpZiBub3QuICBUaGlzIGNhbiBvbmx5IGJlIGNhbGxlZCBmb3IgcmVnaXN0ZXIgb3BlcmFuZHMKKyAgLy8vIHRoYXQgYXJlIHBhcnQgb2YgYSBtYWNoaW5lIGluc3RydWN0aW9uLgorICBib29sIGlzT25SZWdVc2VMaXN0KCkgY29uc3QgeworICAgIGFzc2VydChpc1JlZygpICYmICJDYW4gb25seSBhZGQgcmVnIG9wZXJhbmQgdG8gdXNlIGxpc3RzIik7CisgICAgcmV0dXJuIENvbnRlbnRzLlJlZy5QcmV2ICE9IG51bGxwdHI7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBEZW5zZU1hcEluZm88TWFjaGluZU9wZXJhbmQ+IHsKKyAgc3RhdGljIE1hY2hpbmVPcGVyYW5kIGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiBNYWNoaW5lT3BlcmFuZChzdGF0aWNfY2FzdDxNYWNoaW5lT3BlcmFuZDo6TWFjaGluZU9wZXJhbmRUeXBlPigKKyAgICAgICAgTWFjaGluZU9wZXJhbmQ6Ok1PX0VtcHR5KSk7CisgIH0KKyAgc3RhdGljIE1hY2hpbmVPcGVyYW5kIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gTWFjaGluZU9wZXJhbmQoc3RhdGljX2Nhc3Q8TWFjaGluZU9wZXJhbmQ6Ok1hY2hpbmVPcGVyYW5kVHlwZT4oCisgICAgICAgIE1hY2hpbmVPcGVyYW5kOjpNT19Ub21ic3RvbmUpKTsKKyAgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTykgeworICAgIHJldHVybiBoYXNoX3ZhbHVlKE1PKTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IE1hY2hpbmVPcGVyYW5kICZMSFMsIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZSSFMpIHsKKyAgICBpZiAoTEhTLmdldFR5cGUoKSA9PSBzdGF0aWNfY2FzdDxNYWNoaW5lT3BlcmFuZDo6TWFjaGluZU9wZXJhbmRUeXBlPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU9wZXJhbmQ6Ok1PX0VtcHR5KSB8fAorICAgICAgICBMSFMuZ2V0VHlwZSgpID09IHN0YXRpY19jYXN0PE1hY2hpbmVPcGVyYW5kOjpNYWNoaW5lT3BlcmFuZFR5cGU+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lT3BlcmFuZDo6TU9fVG9tYnN0b25lKSkKKyAgICAgIHJldHVybiBMSFMuZ2V0VHlwZSgpID09IFJIUy5nZXRUeXBlKCk7CisgICAgcmV0dXJuIExIUy5pc0lkZW50aWNhbFRvKFJIUyk7CisgIH0KK307CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZNTykgeworICBNTy5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKworLy8gU2VlIGZyaWVuZCBkZWNsYXJhdGlvbiBhYm92ZS4gVGhpcyBhZGRpdGlvbmFsIGRlY2xhcmF0aW9uIGlzIHJlcXVpcmVkIGluCisvLyBvcmRlciB0byBjb21waWxlIExMVk0gd2l0aCBJQk0geGxDIGNvbXBpbGVyLgoraGFzaF9jb2RlIGhhc2hfdmFsdWUoY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PKTsKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZU9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmZGVmYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZU9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIuaApAQCAtMCwwICsxLDIyNCBAQAorLy8vPT09LSBNYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlci5oIC0gT3B0IERpYWdub3N0aWNzIC0qLSBDKysgLSotLS0tPT09Ly8KKy8vLworLy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vLworLy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vLworLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIE9wdGltaXphdGlvbiBkaWFnbm9zdGljIGludGVyZmFjZXMgZm9yIG1hY2hpbmUgcGFzc2VzLiAgSXQncyBwYWNrYWdlZCBhcyBhbgorLy8vIGFuYWx5c2lzIHBhc3Mgc28gdGhhdCBieSB1c2luZyB0aGlzIHNlcnZpY2UgcGFzc2VzIGJlY29tZSBkZXBlbmRlbnQgb24gTUJGSQorLy8vIGFzIHdlbGwuICBNQkZJIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgImhvdG5lc3MiIG9mIHRoZSBkaWFnbm9zdGljIG1lc3NhZ2UuCisvLy8KKy8vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVPUFRJTUlaQVRJT05SRU1BUktFTUlUVEVSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVPUFRJTUlaQVRJT05SRU1BUktFTUlUVEVSX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworY2xhc3MgTWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mbzsKK2NsYXNzIE1hY2hpbmVJbnN0cjsKKworLy8vIFxicmllZiBDb21tb24gZmVhdHVyZXMgZm9yIGRpYWdub3N0aWNzIGRlYWxpbmcgd2l0aCBvcHRpbWl6YXRpb24gcmVtYXJrcworLy8vIHRoYXQgYXJlIHVzZWQgYnkgbWFjaGluZSBwYXNzZXMuCitjbGFzcyBEaWFnbm9zdGljSW5mb01JUk9wdGltaXphdGlvbiA6IHB1YmxpYyBEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2UgeworcHVibGljOgorICBEaWFnbm9zdGljSW5mb01JUk9wdGltaXphdGlvbihlbnVtIERpYWdub3N0aWNLaW5kIEtpbmQsIGNvbnN0IGNoYXIgKlBhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgUmVtYXJrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpY0xvY2F0aW9uICZMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpCisgICAgICA6IERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZShLaW5kLCBEU19SZW1hcmssIFBhc3NOYW1lLCBSZW1hcmtOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUJCLT5nZXRQYXJlbnQoKS0+Z2V0RnVuY3Rpb24oKSwgTG9jKSwKKyAgICAgICAgTUJCKE1CQikge30KKworICAvLy8gTUktc3BlY2lmaWMga2luZHMgb2YgZGlhZ25vc3RpYyBBcmd1bWVudHMuCisgIHN0cnVjdCBNYWNoaW5lQXJndW1lbnQgOiBwdWJsaWMgRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlOjpBcmd1bWVudCB7CisgICAgLy8vIFByaW50IGFuIGVudGlyZSBNYWNoaW5lSW5zdHIuCisgICAgTWFjaGluZUFyZ3VtZW50KFN0cmluZ1JlZiBLZXksIGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpOworICB9OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGlhZ25vc3RpY0luZm8gKkRJKSB7CisgICAgcmV0dXJuIERJLT5nZXRLaW5kKCkgPj0gREtfRmlyc3RNYWNoaW5lUmVtYXJrICYmCisgICAgICAgICAgIERJLT5nZXRLaW5kKCkgPD0gREtfTGFzdE1hY2hpbmVSZW1hcms7CisgIH0KKworICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqZ2V0QmxvY2soKSBjb25zdCB7IHJldHVybiBNQkI7IH0KKworcHJpdmF0ZToKKyAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQjsKK307CisKKy8vLyBEaWFnbm9zdGljIGluZm9ybWF0aW9uIGZvciBhcHBsaWVkIG9wdGltaXphdGlvbiByZW1hcmtzLgorY2xhc3MgTWFjaGluZU9wdGltaXphdGlvblJlbWFyayA6IHB1YmxpYyBEaWFnbm9zdGljSW5mb01JUk9wdGltaXphdGlvbiB7CitwdWJsaWM6CisgIC8vLyBccCBQYXNzTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFzcyBlbWl0dGluZyB0aGlzIGRpYWdub3N0aWMuIElmIHRoaXMgbmFtZQorICAvLy8gbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uIGdpdmVuIGluIC1ScGFzcz0sIHRoZW4gdGhlIGRpYWdub3N0aWMgd2lsbAorICAvLy8gYmUgZW1pdHRlZC4gIFxwIFJlbWFya05hbWUgaXMgYSB0ZXh0dWFsIGlkZW50aWZpZXIgZm9yIHRoZSByZW1hcmsuICBccAorICAvLy8gTG9jIGlzIHRoZSBkZWJ1ZyBsb2NhdGlvbiBhbmQgXHAgTUJCIGlzIHRoZSBibG9jayB0aGF0IHRoZSBvcHRpbWl6YXRpb24KKyAgLy8vIG9wZXJhdGVzIGluLgorICBNYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrKGNvbnN0IGNoYXIgKlBhc3NOYW1lLCBTdHJpbmdSZWYgUmVtYXJrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljTG9jYXRpb24gJkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKQorICAgICAgOiBEaWFnbm9zdGljSW5mb01JUk9wdGltaXphdGlvbihES19NYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrLCBQYXNzTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtYXJrTmFtZSwgTG9jLCBNQkIpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEaWFnbm9zdGljSW5mbyAqREkpIHsKKyAgICByZXR1cm4gREktPmdldEtpbmQoKSA9PSBES19NYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrOworICB9CisKKyAgLy8vIFxzZWUgRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlOjppc0VuYWJsZWQuCisgIGJvb2wgaXNFbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGNvbnN0IEZ1bmN0aW9uICZGbiA9IGdldEZ1bmN0aW9uKCk7CisgICAgTExWTUNvbnRleHQgJkN0eCA9IEZuLmdldENvbnRleHQoKTsKKyAgICByZXR1cm4gQ3R4LmdldERpYWdIYW5kbGVyUHRyKCktPmlzUGFzc2VkT3B0UmVtYXJrRW5hYmxlZChnZXRQYXNzTmFtZSgpKTsKKyAgfQorfTsKKworLy8vIERpYWdub3N0aWMgaW5mb3JtYXRpb24gZm9yIG1pc3NlZC1vcHRpbWl6YXRpb24gcmVtYXJrcy4KK2NsYXNzIE1hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtNaXNzZWQgOiBwdWJsaWMgRGlhZ25vc3RpY0luZm9NSVJPcHRpbWl6YXRpb24geworcHVibGljOgorICAvLy8gXHAgUGFzc05hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHBhc3MgZW1pdHRpbmcgdGhpcyBkaWFnbm9zdGljLiBJZiB0aGlzIG5hbWUKKyAgLy8vIG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiAtUnBhc3MtbWlzc2VkPSwgdGhlbiB0aGUKKyAgLy8vIGRpYWdub3N0aWMgd2lsbCBiZSBlbWl0dGVkLiAgXHAgUmVtYXJrTmFtZSBpcyBhIHRleHR1YWwgaWRlbnRpZmllciBmb3IgdGhlCisgIC8vLyByZW1hcmsuICBccCBMb2MgaXMgdGhlIGRlYnVnIGxvY2F0aW9uIGFuZCBccCBNQkIgaXMgdGhlIGJsb2NrIHRoYXQgdGhlCisgIC8vLyBvcHRpbWl6YXRpb24gb3BlcmF0ZXMgaW4uCisgIE1hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtNaXNzZWQoY29uc3QgY2hhciAqUGFzc05hbWUsIFN0cmluZ1JlZiBSZW1hcmtOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWNMb2NhdGlvbiAmTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpCisgICAgICA6IERpYWdub3N0aWNJbmZvTUlST3B0aW1pemF0aW9uKERLX01hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtNaXNzZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3NOYW1lLCBSZW1hcmtOYW1lLCBMb2MsIE1CQikge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERpYWdub3N0aWNJbmZvICpESSkgeworICAgIHJldHVybiBESS0+Z2V0S2luZCgpID09IERLX01hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtNaXNzZWQ7CisgIH0KKworICAvLy8gXHNlZSBEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2U6OmlzRW5hYmxlZC4KKyAgYm9vbCBpc0VuYWJsZWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgY29uc3QgRnVuY3Rpb24gJkZuID0gZ2V0RnVuY3Rpb24oKTsKKyAgICBMTFZNQ29udGV4dCAmQ3R4ID0gRm4uZ2V0Q29udGV4dCgpOworICAgIHJldHVybiBDdHguZ2V0RGlhZ0hhbmRsZXJQdHIoKS0+aXNNaXNzZWRPcHRSZW1hcmtFbmFibGVkKGdldFBhc3NOYW1lKCkpOworICB9Cit9OworCisvLy8gRGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBmb3Igb3B0aW1pemF0aW9uIGFuYWx5c2lzIHJlbWFya3MuCitjbGFzcyBNYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXMgOiBwdWJsaWMgRGlhZ25vc3RpY0luZm9NSVJPcHRpbWl6YXRpb24geworcHVibGljOgorICAvLy8gXHAgUGFzc05hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHBhc3MgZW1pdHRpbmcgdGhpcyBkaWFnbm9zdGljLiBJZiB0aGlzIG5hbWUKKyAgLy8vIG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiAtUnBhc3MtYW5hbHlzaXM9LCB0aGVuIHRoZQorICAvLy8gZGlhZ25vc3RpYyB3aWxsIGJlIGVtaXR0ZWQuICBccCBSZW1hcmtOYW1lIGlzIGEgdGV4dHVhbCBpZGVudGlmaWVyIGZvciB0aGUKKyAgLy8vIHJlbWFyay4gIFxwIExvYyBpcyB0aGUgZGVidWcgbG9jYXRpb24gYW5kIFxwIE1CQiBpcyB0aGUgYmxvY2sgdGhhdCB0aGUKKyAgLy8vIG9wdGltaXphdGlvbiBvcGVyYXRlcyBpbi4KKyAgTWFjaGluZU9wdGltaXphdGlvblJlbWFya0FuYWx5c2lzKGNvbnN0IGNoYXIgKlBhc3NOYW1lLCBTdHJpbmdSZWYgUmVtYXJrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWNMb2NhdGlvbiAmTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikKKyAgICAgIDogRGlhZ25vc3RpY0luZm9NSVJPcHRpbWl6YXRpb24oREtfTWFjaGluZU9wdGltaXphdGlvblJlbWFya0FuYWx5c2lzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzTmFtZSwgUmVtYXJrTmFtZSwgTG9jLCBNQkIpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEaWFnbm9zdGljSW5mbyAqREkpIHsKKyAgICByZXR1cm4gREktPmdldEtpbmQoKSA9PSBES19NYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXM7CisgIH0KKworICAvLy8gXHNlZSBEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2U6OmlzRW5hYmxlZC4KKyAgYm9vbCBpc0VuYWJsZWQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgY29uc3QgRnVuY3Rpb24gJkZuID0gZ2V0RnVuY3Rpb24oKTsKKyAgICBMTFZNQ29udGV4dCAmQ3R4ID0gRm4uZ2V0Q29udGV4dCgpOworICAgIHJldHVybiBDdHguZ2V0RGlhZ0hhbmRsZXJQdHIoKS0+aXNBbmFseXNpc1JlbWFya0VuYWJsZWQoZ2V0UGFzc05hbWUoKSk7CisgIH0KK307CisKKy8vLyBFeHRlbmQgbGx2bTo6b3JlOjogd2l0aCBNSS1zcGVjaWZpYyBoZWxwZXIgbmFtZXMuCituYW1lc3BhY2Ugb3JlIHsKK3VzaW5nIE1OViA9IERpYWdub3N0aWNJbmZvTUlST3B0aW1pemF0aW9uOjpNYWNoaW5lQXJndW1lbnQ7Cit9CisKKy8vLyBUaGUgb3B0aW1pemF0aW9uIGRpYWdub3N0aWMgaW50ZXJmYWNlLgorLy8vCisvLy8gSXQgYWxsb3dzIHJlcG9ydGluZyB3aGVuIG9wdGltaXphdGlvbnMgYXJlIHBlcmZvcm1lZCBhbmQgd2hlbiB0aGV5IGFyZSBub3QKKy8vLyBhbG9uZyB3aXRoIHRoZSByZWFzb25zIGZvciBpdC4gIEhvdG5lc3MgaW5mb3JtYXRpb24gb2YgdGhlIGNvcnJlc3BvbmRpbmcKKy8vLyBjb2RlIHJlZ2lvbiBjYW4gYmUgaW5jbHVkZWQgaW4gdGhlIHJlbWFyayBpZiBEaWFnbm9zdGljc0hvdG5lc3NSZXF1ZXN0ZWQgaXMKKy8vLyBlbmFibGVkIGluIHRoZSBMTFZNIGNvbnRleHQuCitjbGFzcyBNYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciB7CitwdWJsaWM6CisgIE1hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8gKk1CRkkpCisgICAgICA6IE1GKE1GKSwgTUJGSShNQkZJKSB7fQorCisgIC8vLyBFbWl0IGFuIG9wdGltaXphdGlvbiByZW1hcmsuCisgIHZvaWQgZW1pdChEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2UgJk9wdERpYWcpOworCisgIC8vLyBcYnJpZWYgV2hldGhlciB3ZSBhbGxvdyBmb3IgZXh0cmEgY29tcGlsZS10aW1lIGJ1ZGdldCB0byBwZXJmb3JtIG1vcmUKKyAgLy8vIGFuYWx5c2lzIHRvIGJlIG1vcmUgaW5mb3JtYXRpdmUuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VmdWwgdG8gZW5hYmxlIGFkZGl0aW9uYWwgbWlzc2VkIG9wdGltaXphdGlvbnMgdG8gYmUgcmVwb3J0ZWQKKyAgLy8vIHRoYXQgYXJlIG5vcm1hbGx5IHRvbyBub2lzeS4gIEluIHRoaXMgbW9kZSwgd2UgY2FuIHVzZSB0aGUgZXh0cmEgYW5hbHlzaXMKKyAgLy8vICgxKSB0byBmaWx0ZXIgdHJpdmlhbCBmYWxzZSBwb3NpdGl2ZXMgb3IgKDIpIHRvIHByb3ZpZGUgbW9yZSBjb250ZXh0IHNvCisgIC8vLyB0aGF0IG5vbi10cml2aWFsIGZhbHNlIHBvc2l0aXZlcyBjYW4gYmUgcXVpY2tseSBkZXRlY3RlZCBieSB0aGUgdXNlci4KKyAgYm9vbCBhbGxvd0V4dHJhQW5hbHlzaXMoU3RyaW5nUmVmIFBhc3NOYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIChNRi5nZXRGdW5jdGlvbigpLmdldENvbnRleHQoKS5nZXREaWFnbm9zdGljc091dHB1dEZpbGUoKSB8fAorICAgICAgICAgICAgTUYuZ2V0RnVuY3Rpb24oKS5nZXRDb250ZXh0KCkKKyAgICAgICAgICAgIC5nZXREaWFnSGFuZGxlclB0cigpLT5pc0FueVJlbWFya0VuYWJsZWQoUGFzc05hbWUpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGFrZSBhIGxhbWJkYSB0aGF0IHJldHVybnMgYSByZW1hcmsgd2hpY2ggd2lsbCBiZSBlbWl0dGVkLiAgU2Vjb25kCisgIC8vLyBhcmd1bWVudCBpcyBvbmx5IHVzZWQgdG8gcmVzdHJpY3QgdGhpcyB0byBmdW5jdGlvbnMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIGVtaXQoVCBSZW1hcmtCdWlsZGVyLCBkZWNsdHlwZShSZW1hcmtCdWlsZGVyKCkpICogPSBudWxscHRyKSB7CisgICAgLy8gQXZvaWQgYnVpbGRpbmcgdGhlIHJlbWFyayB1bmxlc3Mgd2Uga25vdyB0aGVyZSBhcmUgYXQgbGVhc3QgKnNvbWUqCisgICAgLy8gcmVtYXJrcyBlbmFibGVkLiBXZSBjYW4ndCBjdXJyZW50bHkgY2hlY2sgd2hldGhlciByZW1hcmtzIGFyZSByZXF1ZXN0ZWQKKyAgICAvLyBmb3IgdGhlIGNhbGxpbmcgcGFzcyBzaW5jZSB0aGF0IHJlcXVpcmVzIGFjdHVhbGx5IGJ1aWxkaW5nIHRoZSByZW1hcmsuCisKKyAgICBpZiAoTUYuZ2V0RnVuY3Rpb24oKS5nZXRDb250ZXh0KCkuZ2V0RGlhZ25vc3RpY3NPdXRwdXRGaWxlKCkgfHwKKyAgICAgICAgTUYuZ2V0RnVuY3Rpb24oKS5nZXRDb250ZXh0KCkuZ2V0RGlhZ0hhbmRsZXJQdHIoKS0+aXNBbnlSZW1hcmtFbmFibGVkKCkpIHsKKyAgICAgIGF1dG8gUiA9IFJlbWFya0J1aWxkZXIoKTsKKyAgICAgIGVtaXQoKERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZSAmKVIpOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICBNYWNoaW5lRnVuY3Rpb24gJk1GOworCisgIC8vLyBNQkZJIGlzIG9ubHkgc2V0IGlmIGhvdG5lc3MgaXMgcmVxdWVzdGVkLgorICBNYWNoaW5lQmxvY2tGcmVxdWVuY3lJbmZvICpNQkZJOworCisgIC8vLyBDb21wdXRlIGhvdG5lc3MgZnJvbSBJUiB2YWx1ZSAoY3VycmVudGx5IGFzc3VtZWQgdG8gYmUgYSBibG9jaykgaWYgUEdPIGlzCisgIC8vLyBhdmFpbGFibGUuCisgIE9wdGlvbmFsPHVpbnQ2NF90PiBjb21wdXRlSG90bmVzcyhjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKTsKKworICAvLy8gU2ltaWxhciBidXQgdXNlIHZhbHVlIGZyb20gXHAgT3B0RGlhZyBhbmQgdXBkYXRlIGhvdG5lc3MgdGhlcmUuCisgIHZvaWQgY29tcHV0ZUhvdG5lc3MoRGlhZ25vc3RpY0luZm9NSVJPcHRpbWl6YXRpb24gJlJlbWFyayk7CisKKyAgLy8vIFxicmllZiBPbmx5IGFsbG93IHZlcmJvc2UgbWVzc2FnZXMgaWYgd2Uga25vdyB3ZSdyZSBmaWx0ZXJpbmcgYnkgaG90bmVzcworICAvLy8gKEJGSSBpcyBvbmx5IHNldCBpbiB0aGlzIGNhc2UpLgorICBib29sIHNob3VsZEVtaXRWZXJib3NlKCkgeyByZXR1cm4gTUJGSSAhPSBudWxscHRyOyB9Cit9OworCisvLy8gVGhlIGFuYWx5c2lzIHBhc3MKKy8vLworLy8vIE5vdGUgdGhhdCB0aGlzIHBhc3Mgc2hvdWxkbid0IGdlbmVyYWxseSBiZSBtYXJrZWQgYXMgcHJlc2VydmVkIGJ5IG90aGVyCisvLy8gcGFzc2VzLiAgSXQncyBob2xkaW5nIG9udG8gQkZJLCBzbyBpZiB0aGUgcGFzcyBkb2VzIG5vdCBwcmVzZXJ2ZSBCRkksIEJGSQorLy8vIGNvdWxkIGJlIGZyZWVkLgorY2xhc3MgTWFjaGluZU9wdGltaXphdGlvblJlbWFya0VtaXR0ZXJQYXNzIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICBzdGQ6OnVuaXF1ZV9wdHI8TWFjaGluZU9wdGltaXphdGlvblJlbWFya0VtaXR0ZXI+IE9SRTsKKworcHVibGljOgorICBNYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlclBhc3MoKTsKKworICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIG92ZXJyaWRlOworCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgTWFjaGluZU9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgJmdldE9SRSgpIHsKKyAgICBhc3NlcnQoT1JFICYmICJwYXNzIG5vdCBydW4geWV0Iik7CisgICAgcmV0dXJuICpPUkU7CisgIH0KKworICBzdGF0aWMgY2hhciBJRDsKK307Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVQYXNzUmVnaXN0cnkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lUGFzc1JlZ2lzdHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2FiYTBiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lUGFzc1JlZ2lzdHJ5LmgKQEAgLTAsMCArMSwxNDIgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vTWFjaGluZVBhc3NSZWdpc3RyeS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBtZWNoYW5pY3MgZm9yIG1hY2hpbmUgZnVuY3Rpb24gcGFzcyByZWdpc3RyaWVzLiAgQQorLy8gZnVuY3Rpb24gcGFzcyByZWdpc3RyeSAoTWFjaGluZVBhc3NSZWdpc3RyeSkgaXMgYXV0byBmaWxsZWQgYnkgdGhlIHN0YXRpYworLy8gY29uc3RydWN0b3JzIG9mIE1hY2hpbmVQYXNzUmVnaXN0cnlOb2RlLiAgRnVydGhlciB0aGVyZSBpcyBhIGNvbW1hbmQgbGluZQorLy8gcGFyc2VyIChSZWdpc3RlclBhc3NQYXJzZXIpIHdoaWNoIGxpc3RlbnMgdG8gZWFjaCByZWdpc3RyeSBmb3IgYWRkaXRpb25zCisvLyBhbmQgZGVsZXRpb25zLCBzbyB0aGF0IHRoZSBhcHByb3ByaWF0ZSBjb21tYW5kIG9wdGlvbiBpcyB1cGRhdGVkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVQQVNTUkVHSVNUUllfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORVBBU1NSRUdJU1RSWV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKwordXNpbmcgTWFjaGluZVBhc3NDdG9yID0gdm9pZCAqKCopKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBNYWNoaW5lUGFzc1JlZ2lzdHJ5TGlzdGVuZXIgLSBMaXN0ZW5lciB0byBhZGRzIGFuZCByZW1vdmFscyBvZiBub2RlcyBpbgorLy8vIHJlZ2lzdHJhdGlvbiBsaXN0LgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworY2xhc3MgTWFjaGluZVBhc3NSZWdpc3RyeUxpc3RlbmVyIHsKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwdWJsaWM6CisgIE1hY2hpbmVQYXNzUmVnaXN0cnlMaXN0ZW5lcigpID0gZGVmYXVsdDsKKyAgdmlydHVhbCB+TWFjaGluZVBhc3NSZWdpc3RyeUxpc3RlbmVyKCkgPSBkZWZhdWx0OworCisgIHZpcnR1YWwgdm9pZCBOb3RpZnlBZGQoU3RyaW5nUmVmIE4sIE1hY2hpbmVQYXNzQ3RvciBDLCBTdHJpbmdSZWYgRCkgPSAwOworICB2aXJ0dWFsIHZvaWQgTm90aWZ5UmVtb3ZlKFN0cmluZ1JlZiBOKSA9IDA7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gTWFjaGluZVBhc3NSZWdpc3RyeU5vZGUgLSBNYWNoaW5lIHBhc3Mgbm9kZSBzdG9yZWQgaW4gcmVnaXN0cmF0aW9uIGxpc3QuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitjbGFzcyBNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZSB7Citwcml2YXRlOgorICBNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZSAqTmV4dCA9IG51bGxwdHI7IC8vIE5leHQgZnVuY3Rpb24gcGFzcyBpbiBsaXN0LgorICBTdHJpbmdSZWYgTmFtZTsgICAgICAgICAgICAgICAgICAgICAgIC8vIE5hbWUgb2YgZnVuY3Rpb24gcGFzcy4KKyAgU3RyaW5nUmVmIERlc2NyaXB0aW9uOyAgICAgICAgICAgICAgICAvLyBEZXNjcmlwdGlvbiBzdHJpbmcuCisgIE1hY2hpbmVQYXNzQ3RvciBDdG9yOyAgICAgICAgICAgICAgICAgLy8gRnVuY3Rpb24gcGFzcyBjcmVhdG9yLgorCitwdWJsaWM6CisgIE1hY2hpbmVQYXNzUmVnaXN0cnlOb2RlKGNvbnN0IGNoYXIgKk4sIGNvbnN0IGNoYXIgKkQsIE1hY2hpbmVQYXNzQ3RvciBDKQorICAgICAgOiBOYW1lKE4pLCBEZXNjcmlwdGlvbihEKSwgQ3RvcihDKSB7fQorCisgIC8vIEFjY2Vzc29ycworICBNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZSAqZ2V0TmV4dCgpICAgICAgY29uc3QgeyByZXR1cm4gTmV4dDsgfQorICBNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZSAqKmdldE5leHRBZGRyZXNzKCkgICAgeyByZXR1cm4gJk5leHQ7IH0KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSAgICAgICAgICAgICAgICAgICBjb25zdCB7IHJldHVybiBOYW1lOyB9CisgIFN0cmluZ1JlZiBnZXREZXNjcmlwdGlvbigpICAgICAgICAgICAgY29uc3QgeyByZXR1cm4gRGVzY3JpcHRpb247IH0KKyAgTWFjaGluZVBhc3NDdG9yIGdldEN0b3IoKSAgICAgICAgICAgICAgIGNvbnN0IHsgcmV0dXJuIEN0b3I7IH0KKyAgdm9pZCBzZXROZXh0KE1hY2hpbmVQYXNzUmVnaXN0cnlOb2RlICpOKSAgICAgIHsgTmV4dCA9IE47IH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBNYWNoaW5lUGFzc1JlZ2lzdHJ5IC0gVHJhY2sgdGhlIHJlZ2lzdHJhdGlvbiBvZiBtYWNoaW5lIHBhc3Nlcy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2NsYXNzIE1hY2hpbmVQYXNzUmVnaXN0cnkgeworcHJpdmF0ZToKKyAgTWFjaGluZVBhc3NSZWdpc3RyeU5vZGUgKkxpc3Q7ICAgICAgICAvLyBMaXN0IG9mIHJlZ2lzdHJ5IG5vZGVzLgorICBNYWNoaW5lUGFzc0N0b3IgRGVmYXVsdDsgICAgICAgICAgICAgIC8vIERlZmF1bHQgZnVuY3Rpb24gcGFzcyBjcmVhdG9yLgorICBNYWNoaW5lUGFzc1JlZ2lzdHJ5TGlzdGVuZXIgKkxpc3RlbmVyOyAvLyBMaXN0ZW5lciBmb3IgbGlzdCBhZGRzIGFyZSByZW1vdmVzLgorCitwdWJsaWM6CisgIC8vIE5PIENPTlNUUlVDVE9SIC0gd2UgZG9uJ3Qgd2FudCBzdGF0aWMgY29uc3RydWN0b3Igb3JkZXJpbmcgdG8gbWVzcworICAvLyB3aXRoIHRoZSByZWdpc3RyeS4KKworICAvLyBBY2Nlc3NvcnMuCisgIC8vCisgIE1hY2hpbmVQYXNzUmVnaXN0cnlOb2RlICpnZXRMaXN0KCkgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIExpc3Q7IH0KKyAgTWFjaGluZVBhc3NDdG9yIGdldERlZmF1bHQoKSAgICAgICAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gRGVmYXVsdDsgfQorICB2b2lkIHNldERlZmF1bHQoTWFjaGluZVBhc3NDdG9yIEMpICAgICAgICAgICAgICAgICAgICB7IERlZmF1bHQgPSBDOyB9CisgIHZvaWQgc2V0RGVmYXVsdChTdHJpbmdSZWYgTmFtZSk7CisgIHZvaWQgc2V0TGlzdGVuZXIoTWFjaGluZVBhc3NSZWdpc3RyeUxpc3RlbmVyICpMKSAgICAgIHsgTGlzdGVuZXIgPSBMOyB9CisKKyAgLy8vIEFkZCAtIEFkZHMgYSBmdW5jdGlvbiBwYXNzIHRvIHRoZSByZWdpc3RyYXRpb24gbGlzdC4KKyAgLy8vCisgIHZvaWQgQWRkKE1hY2hpbmVQYXNzUmVnaXN0cnlOb2RlICpOb2RlKTsKKworICAvLy8gUmVtb3ZlIC0gUmVtb3ZlcyBhIGZ1bmN0aW9uIHBhc3MgZnJvbSB0aGUgcmVnaXN0cmF0aW9uIGxpc3QuCisgIC8vLworICB2b2lkIFJlbW92ZShNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZSAqTm9kZSk7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gUmVnaXN0ZXJQYXNzUGFyc2VyIGNsYXNzIC0gSGFuZGxlIHRoZSBhZGRpdGlvbiBvZiBuZXcgbWFjaGluZSBwYXNzZXMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCit0ZW1wbGF0ZTxjbGFzcyBSZWdpc3RyeUNsYXNzPgorY2xhc3MgUmVnaXN0ZXJQYXNzUGFyc2VyIDogcHVibGljIE1hY2hpbmVQYXNzUmVnaXN0cnlMaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICBwdWJsaWMgY2w6OnBhcnNlcjx0eXBlbmFtZSBSZWdpc3RyeUNsYXNzOjpGdW5jdGlvblBhc3NDdG9yPiB7CitwdWJsaWM6CisgIFJlZ2lzdGVyUGFzc1BhcnNlcihjbDo6T3B0aW9uICZPKQorICAgICAgOiBjbDo6cGFyc2VyPHR5cGVuYW1lIFJlZ2lzdHJ5Q2xhc3M6OkZ1bmN0aW9uUGFzc0N0b3I+KE8pIHt9CisgIH5SZWdpc3RlclBhc3NQYXJzZXIoKSBvdmVycmlkZSB7IFJlZ2lzdHJ5Q2xhc3M6OnNldExpc3RlbmVyKG51bGxwdHIpOyB9CisKKyAgdm9pZCBpbml0aWFsaXplKCkgeworICAgIGNsOjpwYXJzZXI8dHlwZW5hbWUgUmVnaXN0cnlDbGFzczo6RnVuY3Rpb25QYXNzQ3Rvcj46OmluaXRpYWxpemUoKTsKKworICAgIC8vIEFkZCBleGlzdGluZyBwYXNzZXMgdG8gb3B0aW9uLgorICAgIGZvciAoUmVnaXN0cnlDbGFzcyAqTm9kZSA9IFJlZ2lzdHJ5Q2xhc3M6OmdldExpc3QoKTsKKyAgICAgICAgIE5vZGU7IE5vZGUgPSBOb2RlLT5nZXROZXh0KCkpIHsKKyAgICAgIHRoaXMtPmFkZExpdGVyYWxPcHRpb24oTm9kZS0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICh0eXBlbmFtZSBSZWdpc3RyeUNsYXNzOjpGdW5jdGlvblBhc3NDdG9yKU5vZGUtPmdldEN0b3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9kZS0+Z2V0RGVzY3JpcHRpb24oKSk7CisgICAgfQorCisgICAgLy8gTWFrZSBzdXJlIHdlIGxpc3RlbiBmb3IgbGlzdCBjaGFuZ2VzLgorICAgIFJlZ2lzdHJ5Q2xhc3M6OnNldExpc3RlbmVyKHRoaXMpOworICB9CisKKyAgLy8gSW1wbGVtZW50IHRoZSBNYWNoaW5lUGFzc1JlZ2lzdHJ5TGlzdGVuZXIgY2FsbGJhY2tzLgorICB2b2lkIE5vdGlmeUFkZChTdHJpbmdSZWYgTiwgTWFjaGluZVBhc3NDdG9yIEMsIFN0cmluZ1JlZiBEKSBvdmVycmlkZSB7CisgICAgdGhpcy0+YWRkTGl0ZXJhbE9wdGlvbihOLCAodHlwZW5hbWUgUmVnaXN0cnlDbGFzczo6RnVuY3Rpb25QYXNzQ3RvcilDLCBEKTsKKyAgfQorICB2b2lkIE5vdGlmeVJlbW92ZShTdHJpbmdSZWYgTikgb3ZlcnJpZGUgeworICAgIHRoaXMtPnJlbW92ZUxpdGVyYWxPcHRpb24oTik7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTUFDSElORVBBU1NSRUdJU1RSWV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZVBvc3REb21pbmF0b3JzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZVBvc3REb21pbmF0b3JzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhNDE1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lUG9zdERvbWluYXRvcnMuaApAQCAtMCwwICsxLDg2IEBACisvLz0tIGxsdm0vQ29kZUdlbi9NYWNoaW5lRG9taW5hdG9ycy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBleHBvc2VzIGludGVyZmFjZXMgdG8gcG9zdCBkb21pbmFuY2UgaW5mb3JtYXRpb24gZm9yCisvLyB0YXJnZXQtc3BlY2lmaWMgY29kZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9NQUNISU5FUE9TVERPTUlOQVRPUlNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORVBPU1RET01JTkFUT1JTX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vCisvLy8gUG9zdERvbWluYXRvclRyZWUgQ2xhc3MgLSBDb25jcmV0ZSBzdWJjbGFzcyBvZiBEb21pbmF0b3JUcmVlIHRoYXQgaXMgdXNlZAorLy8vIHRvIGNvbXB1dGUgdGhlIHBvc3QtZG9taW5hdG9yIHRyZWUuCisvLy8KK3N0cnVjdCBNYWNoaW5lUG9zdERvbWluYXRvclRyZWUgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7Citwcml2YXRlOgorIFBvc3REb21UcmVlQmFzZTxNYWNoaW5lQmFzaWNCbG9jaz4gKkRUOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIE1hY2hpbmVQb3N0RG9taW5hdG9yVHJlZSgpOworCisgIH5NYWNoaW5lUG9zdERvbWluYXRvclRyZWUoKSBvdmVycmlkZTsKKworICBGdW5jdGlvblBhc3MgKmNyZWF0ZU1hY2hpbmVQb3N0RG9taW5hdG9yVHJlZVBhc3MoKTsKKworICBjb25zdCBTbWFsbFZlY3RvckltcGw8TWFjaGluZUJhc2ljQmxvY2sgKj4gJmdldFJvb3RzKCkgY29uc3QgeworICAgIHJldHVybiBEVC0+Z2V0Um9vdHMoKTsKKyAgfQorCisgIE1hY2hpbmVEb21UcmVlTm9kZSAqZ2V0Um9vdE5vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIERULT5nZXRSb290Tm9kZSgpOworICB9CisKKyAgTWFjaGluZURvbVRyZWVOb2RlICpvcGVyYXRvcltdKE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3QgeworICAgIHJldHVybiBEVC0+Z2V0Tm9kZShCQik7CisgIH0KKworICBNYWNoaW5lRG9tVHJlZU5vZGUgKmdldE5vZGUoTWFjaGluZUJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgcmV0dXJuIERULT5nZXROb2RlKEJCKTsKKyAgfQorCisgIGJvb2wgZG9taW5hdGVzKGNvbnN0IE1hY2hpbmVEb21UcmVlTm9kZSAqQSwKKyAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZURvbVRyZWVOb2RlICpCKSBjb25zdCB7CisgICAgcmV0dXJuIERULT5kb21pbmF0ZXMoQSwgQik7CisgIH0KKworICBib29sIGRvbWluYXRlcyhjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqQSwgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKkIpIGNvbnN0IHsKKyAgICByZXR1cm4gRFQtPmRvbWluYXRlcyhBLCBCKTsKKyAgfQorCisgIGJvb2wgcHJvcGVybHlEb21pbmF0ZXMoY29uc3QgTWFjaGluZURvbVRyZWVOb2RlICpBLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVEb21UcmVlTm9kZSAqQikgY29uc3QgeworICAgIHJldHVybiBEVC0+cHJvcGVybHlEb21pbmF0ZXMoQSwgQik7CisgIH0KKworICBib29sIHByb3Blcmx5RG9taW5hdGVzKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpBLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpCKSBjb25zdCB7CisgICAgcmV0dXJuIERULT5wcm9wZXJseURvbWluYXRlcyhBLCBCKTsKKyAgfQorCisgIE1hY2hpbmVCYXNpY0Jsb2NrICpmaW5kTmVhcmVzdENvbW1vbkRvbWluYXRvcihNYWNoaW5lQmFzaWNCbG9jayAqQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCKSB7CisgICAgcmV0dXJuIERULT5maW5kTmVhcmVzdENvbW1vbkRvbWluYXRvcihBLCBCKTsKKyAgfQorCisgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRikgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgcHJpbnQobGx2bTo6cmF3X29zdHJlYW0gJk9TLCBjb25zdCBNb2R1bGUgKk0gPSBudWxscHRyKSBjb25zdCBvdmVycmlkZTsKK307Cit9IC8vZW5kIG9mIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpb25JbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lvbkluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Mzk0YjU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpb25JbmZvLmgKQEAgLTAsMCArMSwxODIgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vTWFjaGluZVJlZ2lvbkluZm8uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVSRUdJT05JTkZPX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ0hJTkVSRUdJT05JTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlcHRoRmlyc3RJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvUmVnaW9uSW5mby5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvUmVnaW9uSXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZURvbWluYW5jZUZyb250aWVyLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVEb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVMb29wSW5mby5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworc3RydWN0IE1hY2hpbmVQb3N0RG9taW5hdG9yVHJlZTsKK2NsYXNzIE1hY2hpbmVSZWdpb247CitjbGFzcyBNYWNoaW5lUmVnaW9uTm9kZTsKK2NsYXNzIE1hY2hpbmVSZWdpb25JbmZvOworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgUmVnaW9uVHJhaXRzPE1hY2hpbmVGdW5jdGlvbj4geworICB1c2luZyBGdW5jVCA9IE1hY2hpbmVGdW5jdGlvbjsKKyAgdXNpbmcgQmxvY2tUID0gTWFjaGluZUJhc2ljQmxvY2s7CisgIHVzaW5nIFJlZ2lvblQgPSBNYWNoaW5lUmVnaW9uOworICB1c2luZyBSZWdpb25Ob2RlVCA9IE1hY2hpbmVSZWdpb25Ob2RlOworICB1c2luZyBSZWdpb25JbmZvVCA9IE1hY2hpbmVSZWdpb25JbmZvOworICB1c2luZyBEb21UcmVlVCA9IE1hY2hpbmVEb21pbmF0b3JUcmVlOworICB1c2luZyBEb21UcmVlTm9kZVQgPSBNYWNoaW5lRG9tVHJlZU5vZGU7CisgIHVzaW5nIFBvc3REb21UcmVlVCA9IE1hY2hpbmVQb3N0RG9taW5hdG9yVHJlZTsKKyAgdXNpbmcgRG9tRnJvbnRpZXJUID0gTWFjaGluZURvbWluYW5jZUZyb250aWVyOworICB1c2luZyBJbnN0VCA9IE1hY2hpbmVJbnN0cjsKKyAgdXNpbmcgTG9vcFQgPSBNYWNoaW5lTG9vcDsKKyAgdXNpbmcgTG9vcEluZm9UID0gTWFjaGluZUxvb3BJbmZvOworCisgIHN0YXRpYyB1bnNpZ25lZCBnZXROdW1TdWNjZXNzb3JzKE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgeworICAgIHJldHVybiBCQi0+c3VjY19zaXplKCk7CisgIH0KK307CisKK2NsYXNzIE1hY2hpbmVSZWdpb25Ob2RlIDogcHVibGljIFJlZ2lvbk5vZGVCYXNlPFJlZ2lvblRyYWl0czxNYWNoaW5lRnVuY3Rpb24+PiB7CitwdWJsaWM6CisgIGlubGluZSBNYWNoaW5lUmVnaW9uTm9kZShNYWNoaW5lUmVnaW9uICpQYXJlbnQsIE1hY2hpbmVCYXNpY0Jsb2NrICpFbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTdWJSZWdpb24gPSBmYWxzZSkKKyAgICAgIDogUmVnaW9uTm9kZUJhc2U8UmVnaW9uVHJhaXRzPE1hY2hpbmVGdW5jdGlvbj4+KFBhcmVudCwgRW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc1N1YlJlZ2lvbikge30KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWFjaGluZVJlZ2lvbiAmUk4pIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcyA9PSByZWludGVycHJldF9jYXN0PGNvbnN0IE1hY2hpbmVSZWdpb25Ob2RlICo+KCZSTik7CisgIH0KK307CisKK2NsYXNzIE1hY2hpbmVSZWdpb24gOiBwdWJsaWMgUmVnaW9uQmFzZTxSZWdpb25UcmFpdHM8TWFjaGluZUZ1bmN0aW9uPj4geworcHVibGljOgorICBNYWNoaW5lUmVnaW9uKE1hY2hpbmVCYXNpY0Jsb2NrICpFbnRyeSwgTWFjaGluZUJhc2ljQmxvY2sgKkV4aXQsCisgICAgICAgICAgICAgICAgTWFjaGluZVJlZ2lvbkluZm8gKlJJLCBNYWNoaW5lRG9taW5hdG9yVHJlZSAqRFQsCisgICAgICAgICAgICAgICAgTWFjaGluZVJlZ2lvbiAqUGFyZW50ID0gbnVsbHB0cik7CisgIH5NYWNoaW5lUmVnaW9uKCk7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hY2hpbmVSZWdpb25Ob2RlICZSTikgY29uc3QgeworICAgIHJldHVybiAmUk4gPT0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBNYWNoaW5lUmVnaW9uTm9kZSAqPih0aGlzKTsKKyAgfQorfTsKKworY2xhc3MgTWFjaGluZVJlZ2lvbkluZm8gOiBwdWJsaWMgUmVnaW9uSW5mb0Jhc2U8UmVnaW9uVHJhaXRzPE1hY2hpbmVGdW5jdGlvbj4+IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgTWFjaGluZVJlZ2lvbkluZm8oKTsKKyAgfk1hY2hpbmVSZWdpb25JbmZvKCkgb3ZlcnJpZGU7CisKKyAgLy8gdXBkYXRlU3RhdGlzdGljcyAtIFVwZGF0ZSBzdGF0aXN0aWMgYWJvdXQgY3JlYXRlZCByZWdpb25zLgorICB2b2lkIHVwZGF0ZVN0YXRpc3RpY3MoTWFjaGluZVJlZ2lvbiAqUikgZmluYWw7CisKKyAgdm9pZCByZWNhbGN1bGF0ZShNYWNoaW5lRnVuY3Rpb24gJkYsIE1hY2hpbmVEb21pbmF0b3JUcmVlICpEVCwKKyAgICAgICAgICAgICAgICAgICBNYWNoaW5lUG9zdERvbWluYXRvclRyZWUgKlBEVCwgTWFjaGluZURvbWluYW5jZUZyb250aWVyICpERik7Cit9OworCitjbGFzcyBNYWNoaW5lUmVnaW9uSW5mb1Bhc3MgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CisgIE1hY2hpbmVSZWdpb25JbmZvIFJJOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIGV4cGxpY2l0IE1hY2hpbmVSZWdpb25JbmZvUGFzcygpOworICB+TWFjaGluZVJlZ2lvbkluZm9QYXNzKCkgb3ZlcnJpZGU7CisKKyAgTWFjaGluZVJlZ2lvbkluZm8gJmdldFJlZ2lvbkluZm8oKSB7IHJldHVybiBSSTsgfQorCisgIGNvbnN0IE1hY2hpbmVSZWdpb25JbmZvICZnZXRSZWdpb25JbmZvKCkgY29uc3QgeyByZXR1cm4gUkk7IH0KKworICAvLy8gQG5hbWUgTWFjaGluZUZ1bmN0aW9uUGFzcyBpbnRlcmZhY2UKKyAgLy9AeworICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmRikgb3ZlcnJpZGU7CisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlOworICB2b2lkIHZlcmlmeUFuYWx5c2lzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNb2R1bGUgKikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworICAvL0B9Cit9OworCit0ZW1wbGF0ZSA8PgordGVtcGxhdGUgPD4KK2lubGluZSBNYWNoaW5lQmFzaWNCbG9jayAqCitSZWdpb25Ob2RlQmFzZTxSZWdpb25UcmFpdHM8TWFjaGluZUZ1bmN0aW9uPj46OmdldE5vZGVBczxNYWNoaW5lQmFzaWNCbG9jaz4oKQorICAgIGNvbnN0IHsKKyAgYXNzZXJ0KCFpc1N1YlJlZ2lvbigpICYmICJUaGlzIGlzIG5vdCBhIE1hY2hpbmVCYXNpY0Jsb2NrIFJlZ2lvbk5vZGUhIik7CisgIHJldHVybiBnZXRFbnRyeSgpOworfQorCit0ZW1wbGF0ZSA8PgordGVtcGxhdGUgPD4KK2lubGluZSBNYWNoaW5lUmVnaW9uICoKK1JlZ2lvbk5vZGVCYXNlPFJlZ2lvblRyYWl0czxNYWNoaW5lRnVuY3Rpb24+Pjo6Z2V0Tm9kZUFzPE1hY2hpbmVSZWdpb24+KCkKKyAgICBjb25zdCB7CisgIGFzc2VydChpc1N1YlJlZ2lvbigpICYmICJUaGlzIGlzIG5vdCBhIHN1YnJlZ2lvbiBSZWdpb25Ob2RlISIpOworICBhdXRvIFVuY29uc3QgPQorICAgICAgY29uc3RfY2FzdDxSZWdpb25Ob2RlQmFzZTxSZWdpb25UcmFpdHM8TWFjaGluZUZ1bmN0aW9uPj4gKj4odGhpcyk7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PE1hY2hpbmVSZWdpb24gKj4oVW5jb25zdCk7Cit9CisKK1JlZ2lvbk5vZGVHcmFwaFRyYWl0cyhNYWNoaW5lUmVnaW9uTm9kZSwgTWFjaGluZUJhc2ljQmxvY2ssIE1hY2hpbmVSZWdpb24pOworUmVnaW9uTm9kZUdyYXBoVHJhaXRzKGNvbnN0IE1hY2hpbmVSZWdpb25Ob2RlLCBNYWNoaW5lQmFzaWNCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lUmVnaW9uKTsKKworUmVnaW9uR3JhcGhUcmFpdHMoTWFjaGluZVJlZ2lvbiwgTWFjaGluZVJlZ2lvbk5vZGUpOworUmVnaW9uR3JhcGhUcmFpdHMoY29uc3QgTWFjaGluZVJlZ2lvbiwgY29uc3QgTWFjaGluZVJlZ2lvbk5vZGUpOworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IEdyYXBoVHJhaXRzPE1hY2hpbmVSZWdpb25JbmZvICo+CisgICAgOiBwdWJsaWMgR3JhcGhUcmFpdHM8RmxhdEl0PE1hY2hpbmVSZWdpb25Ob2RlICo+PiB7CisgIHVzaW5nIG5vZGVzX2l0ZXJhdG9yID0gZGZfaXRlcmF0b3I8Tm9kZVJlZiwgZGZfaXRlcmF0b3JfZGVmYXVsdF9zZXQ8Tm9kZVJlZj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIEdyYXBoVHJhaXRzPEZsYXRJdDxOb2RlUmVmPj4+OworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShNYWNoaW5lUmVnaW9uSW5mbyAqUkkpIHsKKyAgICByZXR1cm4gR3JhcGhUcmFpdHM8RmxhdEl0PE1hY2hpbmVSZWdpb24gKj4+OjpnZXRFbnRyeU5vZGUoCisgICAgICAgIFJJLT5nZXRUb3BMZXZlbFJlZ2lvbigpKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihNYWNoaW5lUmVnaW9uSW5mbyAqUkkpIHsKKyAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3I6OmJlZ2luKGdldEVudHJ5Tm9kZShSSSkpOworICB9CisKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2VuZChNYWNoaW5lUmVnaW9uSW5mbyAqUkkpIHsKKyAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3I6OmVuZChnZXRFbnRyeU5vZGUoUkkpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBHcmFwaFRyYWl0czxNYWNoaW5lUmVnaW9uSW5mb1Bhc3MgKj4KKyAgICA6IHB1YmxpYyBHcmFwaFRyYWl0czxNYWNoaW5lUmVnaW9uSW5mbyAqPiB7CisgIHVzaW5nIG5vZGVzX2l0ZXJhdG9yID0gZGZfaXRlcmF0b3I8Tm9kZVJlZiwgZGZfaXRlcmF0b3JfZGVmYXVsdF9zZXQ8Tm9kZVJlZj4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIEdyYXBoVHJhaXRzPEZsYXRJdDxOb2RlUmVmPj4+OworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShNYWNoaW5lUmVnaW9uSW5mb1Bhc3MgKlJJKSB7CisgICAgcmV0dXJuIEdyYXBoVHJhaXRzPE1hY2hpbmVSZWdpb25JbmZvICo+OjpnZXRFbnRyeU5vZGUoJlJJLT5nZXRSZWdpb25JbmZvKCkpOworICB9CisKKyAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2JlZ2luKE1hY2hpbmVSZWdpb25JbmZvUGFzcyAqUkkpIHsKKyAgICByZXR1cm4gR3JhcGhUcmFpdHM8TWFjaGluZVJlZ2lvbkluZm8gKj46Om5vZGVzX2JlZ2luKCZSSS0+Z2V0UmVnaW9uSW5mbygpKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoTWFjaGluZVJlZ2lvbkluZm9QYXNzICpSSSkgeworICAgIHJldHVybiBHcmFwaFRyYWl0czxNYWNoaW5lUmVnaW9uSW5mbyAqPjo6bm9kZXNfZW5kKCZSSS0+Z2V0UmVnaW9uSW5mbygpKTsKKyAgfQorfTsKKworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIFJlZ2lvbkJhc2U8UmVnaW9uVHJhaXRzPE1hY2hpbmVGdW5jdGlvbj4+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIFJlZ2lvbk5vZGVCYXNlPFJlZ2lvblRyYWl0czxNYWNoaW5lRnVuY3Rpb24+PjsKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBSZWdpb25JbmZvQmFzZTxSZWdpb25UcmFpdHM8TWFjaGluZUZ1bmN0aW9uPj47CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTUFDSElORVJFR0lPTklORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBkZmQwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgKQEAgLTAsMCArMSwxMTk3IEBACisvLz09PS0gbGx2bS9Db2RlR2VuL01hY2hpbmVSZWdpc3RlckluZm8uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBNYWNoaW5lUmVnaXN0ZXJJbmZvIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ0hJTkVSRUdJU1RFUklORk9fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORVJFR0lTVEVSSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0JpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSW5kZXhlZE1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJVbmlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vR2xvYmFsSVNlbC9SZWdpc3RlckJhbmsuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTG93TGV2ZWxUeXBlLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHJCdW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZU9wZXJhbmQuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldFN1YnRhcmdldEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL0xhbmVCaXRtYXNrLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFBTZXRJdGVyYXRvcjsKKworLy8vIENvbnZlbmllbnQgdHlwZSB0byByZXByZXNlbnQgZWl0aGVyIGEgcmVnaXN0ZXIgY2xhc3Mgb3IgYSByZWdpc3RlciBiYW5rLgordXNpbmcgUmVnQ2xhc3NPclJlZ0JhbmsgPQorICAgIFBvaW50ZXJVbmlvbjxjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICosIGNvbnN0IFJlZ2lzdGVyQmFuayAqPjsKKworLy8vIE1hY2hpbmVSZWdpc3RlckluZm8gLSBLZWVwIHRyYWNrIG9mIGluZm9ybWF0aW9uIGZvciB2aXJ0dWFsIGFuZCBwaHlzaWNhbAorLy8vIHJlZ2lzdGVycywgaW5jbHVkaW5nIHZyZWcgcmVnaXN0ZXIgY2xhc3NlcywgdXNlL2RlZiBjaGFpbnMgZm9yIHJlZ2lzdGVycywKKy8vLyBldGMuCitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvIHsKK3B1YmxpYzoKKyAgY2xhc3MgRGVsZWdhdGUgeworICAgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworICBwdWJsaWM6CisgICAgdmlydHVhbCB+RGVsZWdhdGUoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIHZvaWQgTVJJX05vdGVOZXdWaXJ0dWFsUmVnaXN0ZXIodW5zaWduZWQgUmVnKSA9IDA7CisgIH07CisKK3ByaXZhdGU6CisgIE1hY2hpbmVGdW5jdGlvbiAqTUY7CisgIERlbGVnYXRlICpUaGVEZWxlZ2F0ZSA9IG51bGxwdHI7CisKKyAgLy8vIFRydWUgaWYgc3VicmVnaXN0ZXIgbGl2ZW5lc3MgaXMgdHJhY2tlZC4KKyAgY29uc3QgYm9vbCBUcmFja3NTdWJSZWdMaXZlbmVzczsKKworICAvLy8gVlJlZ0luZm8gLSBJbmZvcm1hdGlvbiB3ZSBrZWVwIGZvciBlYWNoIHZpcnR1YWwgcmVnaXN0ZXIuCisgIC8vLworICAvLy8gRWFjaCBlbGVtZW50IGluIHRoaXMgbGlzdCBjb250YWlucyB0aGUgcmVnaXN0ZXIgY2xhc3Mgb2YgdGhlIHZyZWcgYW5kIHRoZQorICAvLy8gc3RhcnQgb2YgdGhlIHVzZS9kZWYgbGlzdCBmb3IgdGhlIHJlZ2lzdGVyLgorICBJbmRleGVkTWFwPHN0ZDo6cGFpcjxSZWdDbGFzc09yUmVnQmFuaywgTWFjaGluZU9wZXJhbmQgKj4sCisgICAgICAgICAgICAgVmlydFJlZzJJbmRleEZ1bmN0b3I+CisgICAgICBWUmVnSW5mbzsKKworICAvLy8gTWFwIGZvciByZWNvdmVyaW5nIHZyZWcgbmFtZSBmcm9tIHZyZWcgbnVtYmVyLgorICAvLy8gVGhpcyBtYXAgaXMgdXNlZCBieSB0aGUgTUlSIFByaW50ZXIuCisgIEluZGV4ZWRNYXA8c3RkOjpzdHJpbmcsIFZpcnRSZWcySW5kZXhGdW5jdG9yPiBWUmVnMk5hbWU7CisKKyAgLy8vIFN0cmluZ1NldCB0aGF0IGlzIHVzZWQgdG8gdW5pcXVlIHZyZWcgbmFtZXMuCisgIFN0cmluZ1NldDw+IFZSZWdOYW1lczsKKworICAvLy8gVGhlIGZsYWcgaXMgdHJ1ZSB1cG9uIFxwIFVwZGF0ZWRDU1JzIGluaXRpYWxpemF0aW9uCisgIC8vLyBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIElzVXBkYXRlZENTUnNJbml0aWFsaXplZDsKKworICAvLy8gQ29udGFpbnMgdGhlIHVwZGF0ZWQgY2FsbGVlIHNhdmVkIHJlZ2lzdGVyIGxpc3QuCisgIC8vLyBBcyBvcHBvc2VkIHRvIHRoZSBzdGF0aWMgbGlzdCBkZWZpbmVkIGluIHJlZ2lzdGVyIGluZm8sCisgIC8vLyBhbGwgcmVnaXN0ZXJzIHRoYXQgd2VyZSBkaXNhYmxlZCBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LgorICBTbWFsbFZlY3RvcjxNQ1BoeXNSZWcsIDE2PiBVcGRhdGVkQ1NSczsKKworICAvLy8gUmVnQWxsb2NIaW50cyAtIFRoaXMgdmVjdG9yIHJlY29yZHMgcmVnaXN0ZXIgYWxsb2NhdGlvbiBoaW50cyBmb3IKKyAgLy8vIHZpcnR1YWwgcmVnaXN0ZXJzLiBGb3IgZWFjaCB2aXJ0dWFsIHJlZ2lzdGVyLCBpdCBrZWVwcyBhIHBhaXIgb2YgaGludAorICAvLy8gdHlwZSBhbmQgaGludHMgdmVjdG9yIG1ha2luZyB1cCB0aGUgYWxsb2NhdGlvbiBoaW50cy4gT25seSB0aGUgZmlyc3QKKyAgLy8vIGhpbnQgbWF5IGJlIHRhcmdldCBzcGVjaWZpYywgYW5kIGluIHRoYXQgY2FzZSB0aGlzIGlzIHJlZmxlY3RlZCBieSB0aGUKKyAgLy8vIGZpcnN0IG1lbWJlciBvZiB0aGUgcGFpciBiZWluZyBub24temVyby4gSWYgdGhlIGhpbnRlZCByZWdpc3RlciBpcworICAvLy8gdmlydHVhbCwgaXQgbWVhbnMgdGhlIGFsbG9jYXRvciBzaG91bGQgcHJlZmVyIHRoZSBwaHlzaWNhbCByZWdpc3RlcgorICAvLy8gYWxsb2NhdGVkIHRvIGl0IGlmIGFueS4KKyAgSW5kZXhlZE1hcDxzdGQ6OnBhaXI8dW5zaWduZWQsIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0Pj4sCisgICAgICAgICAgICAgVmlydFJlZzJJbmRleEZ1bmN0b3I+IFJlZ0FsbG9jSGludHM7CisKKyAgLy8vIFBoeXNSZWdVc2VEZWZMaXN0cyAtIFRoaXMgaXMgYW4gYXJyYXkgb2YgdGhlIGhlYWQgb2YgdGhlIHVzZS9kZWYgbGlzdCBmb3IKKyAgLy8vIHBoeXNpY2FsIHJlZ2lzdGVycy4KKyAgc3RkOjp1bmlxdWVfcHRyPE1hY2hpbmVPcGVyYW5kICpbXT4gUGh5c1JlZ1VzZURlZkxpc3RzOworCisgIC8vLyBnZXRSZWdVc2VEZWZMaXN0SGVhZCAtIFJldHVybiB0aGUgaGVhZCBwb2ludGVyIGZvciB0aGUgcmVnaXN0ZXIgdXNlL2RlZgorICAvLy8gbGlzdCBmb3IgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIG9yIHBoeXNpY2FsIHJlZ2lzdGVyLgorICBNYWNoaW5lT3BlcmFuZCAqJmdldFJlZ1VzZURlZkxpc3RIZWFkKHVuc2lnbmVkIFJlZ05vKSB7CisgICAgaWYgKFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoUmVnTm8pKQorICAgICAgcmV0dXJuIFZSZWdJbmZvW1JlZ05vXS5zZWNvbmQ7CisgICAgcmV0dXJuIFBoeXNSZWdVc2VEZWZMaXN0c1tSZWdOb107CisgIH0KKworICBNYWNoaW5lT3BlcmFuZCAqZ2V0UmVnVXNlRGVmTGlzdEhlYWQodW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihSZWdObykpCisgICAgICByZXR1cm4gVlJlZ0luZm9bUmVnTm9dLnNlY29uZDsKKyAgICByZXR1cm4gUGh5c1JlZ1VzZURlZkxpc3RzW1JlZ05vXTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIG5leHQgZWxlbWVudCBpbiB0aGUgdXNlLWRlZiBjaGFpbi4KKyAgc3RhdGljIE1hY2hpbmVPcGVyYW5kICpnZXROZXh0T3BlcmFuZEZvclJlZyhjb25zdCBNYWNoaW5lT3BlcmFuZCAqTU8pIHsKKyAgICBhc3NlcnQoTU8gJiYgTU8tPmlzUmVnKCkgJiYgIlRoaXMgaXMgbm90IGEgcmVnaXN0ZXIgb3BlcmFuZCEiKTsKKyAgICByZXR1cm4gTU8tPkNvbnRlbnRzLlJlZy5OZXh0OworICB9CisKKyAgLy8vIFVzZWRQaHlzUmVnTWFzayAtIEFkZGl0aW9uYWwgdXNlZCBwaHlzcmVncyBpbmNsdWRpbmcgYWxpYXNlcy4KKyAgLy8vIFRoaXMgYml0IHZlY3RvciByZXByZXNlbnRzIGFsbCB0aGUgcmVnaXN0ZXJzIGNsb2JiZXJlZCBieSBmdW5jdGlvbiBjYWxscy4KKyAgQml0VmVjdG9yIFVzZWRQaHlzUmVnTWFzazsKKworICAvLy8gUmVzZXJ2ZWRSZWdzIC0gVGhpcyBpcyBhIGJpdCB2ZWN0b3Igb2YgcmVzZXJ2ZWQgcmVnaXN0ZXJzLiAgVGhlIHRhcmdldAorICAvLy8gbWF5IGNoYW5nZSBpdHMgbWluZCBhYm91dCB3aGljaCByZWdpc3RlcnMgc2hvdWxkIGJlIHJlc2VydmVkLiAgVGhpcworICAvLy8gdmVjdG9yIGlzIHRoZSBmcm96ZW4gc2V0IG9mIHJlc2VydmVkIHJlZ2lzdGVycyB3aGVuIHJlZ2lzdGVyIGFsbG9jYXRpb24KKyAgLy8vIHN0YXJ0ZWQuCisgIEJpdFZlY3RvciBSZXNlcnZlZFJlZ3M7CisKKyAgdXNpbmcgVlJlZ1RvVHlwZU1hcCA9IERlbnNlTWFwPHVuc2lnbmVkLCBMTFQ+OworICAvLy8gTWFwIGdlbmVyaWMgdmlydHVhbCByZWdpc3RlcnMgdG8gdGhlaXIgYWN0dWFsIHNpemUuCisgIG11dGFibGUgc3RkOjp1bmlxdWVfcHRyPFZSZWdUb1R5cGVNYXA+IFZSZWdUb1R5cGU7CisKKyAgLy8vIEtlZXAgdHJhY2sgb2YgdGhlIHBoeXNpY2FsIHJlZ2lzdGVycyB0aGF0IGFyZSBsaXZlIGluIHRvIHRoZSBmdW5jdGlvbi4KKyAgLy8vIExpdmUgaW4gdmFsdWVzIGFyZSB0eXBpY2FsbHkgYXJndW1lbnRzIGluIHJlZ2lzdGVycy4gIExpdmVJbiB2YWx1ZXMgYXJlCisgIC8vLyBhbGxvd2VkIHRvIGhhdmUgdmlydHVhbCByZWdpc3RlcnMgYXNzb2NpYXRlZCB3aXRoIHRoZW0sIHN0b3JlZCBpbiB0aGUKKyAgLy8vIHNlY29uZCBlbGVtZW50LgorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPj4gTGl2ZUluczsKKworcHVibGljOgorICBleHBsaWNpdCBNYWNoaW5lUmVnaXN0ZXJJbmZvKE1hY2hpbmVGdW5jdGlvbiAqTUYpOworICBNYWNoaW5lUmVnaXN0ZXJJbmZvKGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJikgPSBkZWxldGU7CisgIE1hY2hpbmVSZWdpc3RlckluZm8gJm9wZXJhdG9yPShjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICYpID0gZGVsZXRlOworCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqZ2V0VGFyZ2V0UmVnaXN0ZXJJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBNRi0+Z2V0U3VidGFyZ2V0KCkuZ2V0UmVnaXN0ZXJJbmZvKCk7CisgIH0KKworICB2b2lkIHJlc2V0RGVsZWdhdGUoRGVsZWdhdGUgKmRlbGVnYXRlKSB7CisgICAgLy8gRW5zdXJlIGFub3RoZXIgZGVsZWdhdGUgZG9lcyBub3QgdGFrZSBvdmVyIHVubGVzcyB0aGUgY3VycmVudAorICAgIC8vIGRlbGVnYXRlIGZpcnN0IHVuYXR0YWNoZXMgaXRzZWxmLiBJZiB3ZSBldmVyIG5lZWQgdG8gbXVsdGljYXN0CisgICAgLy8gbm90aWZpY2F0aW9ucywgd2Ugd2lsbCBuZWVkIHRvIGNoYW5nZSB0byB1c2luZyBhIGxpc3QuCisgICAgYXNzZXJ0KFRoZURlbGVnYXRlID09IGRlbGVnYXRlICYmCisgICAgICAgICAgICJPbmx5IHRoZSBjdXJyZW50IGRlbGVnYXRlIGNhbiBwZXJmb3JtIHJlc2V0ISIpOworICAgIFRoZURlbGVnYXRlID0gbnVsbHB0cjsKKyAgfQorCisgIHZvaWQgc2V0RGVsZWdhdGUoRGVsZWdhdGUgKmRlbGVnYXRlKSB7CisgICAgYXNzZXJ0KGRlbGVnYXRlICYmICFUaGVEZWxlZ2F0ZSAmJgorICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIHNldCBkZWxlZ2F0ZSB0byBudWxsLCBvciB0byBjaGFuZ2UgaXQgd2l0aG91dCAiCisgICAgICAgICAgICJmaXJzdCByZXNldHRpbmcgaXQhIik7CisKKyAgICBUaGVEZWxlZ2F0ZSA9IGRlbGVnYXRlOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEZ1bmN0aW9uIFN0YXRlCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vIGlzU1NBIC0gUmV0dXJucyB0cnVlIHdoZW4gdGhlIG1hY2hpbmUgZnVuY3Rpb24gaXMgaW4gU1NBIGZvcm0uIEVhcmx5CisgIC8vIHBhc3NlcyByZXF1aXJlIHRoZSBtYWNoaW5lIGZ1bmN0aW9uIHRvIGJlIGluIFNTQSBmb3JtIHdoZXJlIGV2ZXJ5IHZpcnR1YWwKKyAgLy8gcmVnaXN0ZXIgaGFzIGEgc2luZ2xlIGRlZmluaW5nIGluc3RydWN0aW9uLgorICAvLworICAvLyBUaGUgVHdvQWRkcmVzc0luc3RydWN0aW9uUGFzcyBhbmQgUEhJRWxpbWluYXRpb24gcGFzc2VzIHRha2UgdGhlIG1hY2hpbmUKKyAgLy8gZnVuY3Rpb24gb3V0IG9mIFNTQSBmb3JtIHdoZW4gdGhleSBpbnRyb2R1Y2UgbXVsdGlwbGUgZGVmcyBwZXIgdmlydHVhbAorICAvLyByZWdpc3Rlci4KKyAgYm9vbCBpc1NTQSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTUYtPmdldFByb3BlcnRpZXMoKS5oYXNQcm9wZXJ0eSgKKyAgICAgICAgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllczo6UHJvcGVydHk6OklzU1NBKTsKKyAgfQorCisgIC8vIGxlYXZlU1NBIC0gSW5kaWNhdGVzIHRoYXQgdGhlIG1hY2hpbmUgZnVuY3Rpb24gaXMgbm8gbG9uZ2VyIGluIFNTQSBmb3JtLgorICB2b2lkIGxlYXZlU1NBKCkgeworICAgIE1GLT5nZXRQcm9wZXJ0aWVzKCkucmVzZXQoTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllczo6UHJvcGVydHk6OklzU1NBKTsKKyAgfQorCisgIC8vLyB0cmFja3NMaXZlbmVzcyAtIFJldHVybnMgdHJ1ZSB3aGVuIHRyYWNraW5nIHJlZ2lzdGVyIGxpdmVuZXNzIGFjY3VyYXRlbHkuCisgIC8vLyAoc2VlIE1hY2hpbmVGVW5jdGlvblByb3BlcnRpZXM6OlByb3BlcnR5IGRlc2NyaXB0aW9uIGZvciBkZXRhaWxzKQorICBib29sIHRyYWNrc0xpdmVuZXNzKCkgY29uc3QgeworICAgIHJldHVybiBNRi0+Z2V0UHJvcGVydGllcygpLmhhc1Byb3BlcnR5KAorICAgICAgICBNYWNoaW5lRnVuY3Rpb25Qcm9wZXJ0aWVzOjpQcm9wZXJ0eTo6VHJhY2tzTGl2ZW5lc3MpOworICB9CisKKyAgLy8vIGludmFsaWRhdGVMaXZlbmVzcyAtIEluZGljYXRlcyB0aGF0IHJlZ2lzdGVyIGxpdmVuZXNzIGlzIG5vIGxvbmdlciBiZWluZworICAvLy8gdHJhY2tlZCBhY2N1cmF0ZWx5LgorICAvLy8KKyAgLy8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieSBsYXRlIHBhc3NlcyB0aGF0IGludmFsaWRhdGUgdGhlIGxpdmVuZXNzCisgIC8vLyBpbmZvcm1hdGlvbi4KKyAgdm9pZCBpbnZhbGlkYXRlTGl2ZW5lc3MoKSB7CisgICAgTUYtPmdldFByb3BlcnRpZXMoKS5yZXNldCgKKyAgICAgICAgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllczo6UHJvcGVydHk6OlRyYWNrc0xpdmVuZXNzKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgbGl2ZW5lc3MgZm9yIHJlZ2lzdGVyIGNsYXNzIEBwIFJDIHNob3VsZCBiZSB0cmFja2VkIGF0CisgIC8vLyB0aGUgc3VicmVnaXN0ZXIgbGV2ZWwuCisgIGJvb2wgc2hvdWxkVHJhY2tTdWJSZWdMaXZlbmVzcyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICZSQykgY29uc3QgeworICAgIHJldHVybiBzdWJSZWdMaXZlbmVzc0VuYWJsZWQoKSAmJiBSQy5IYXNEaXNqdW5jdFN1YlJlZ3M7CisgIH0KKyAgYm9vbCBzaG91bGRUcmFja1N1YlJlZ0xpdmVuZXNzKHVuc2lnbmVkIFZSZWcpIGNvbnN0IHsKKyAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihWUmVnKSAmJiAiTXVzdCBwYXNzIGEgVlJlZyIpOworICAgIHJldHVybiBzaG91bGRUcmFja1N1YlJlZ0xpdmVuZXNzKCpnZXRSZWdDbGFzcyhWUmVnKSk7CisgIH0KKyAgYm9vbCBzdWJSZWdMaXZlbmVzc0VuYWJsZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIFRyYWNrc1N1YlJlZ0xpdmVuZXNzOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFJlZ2lzdGVyIEluZm8KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdXBkYXRlZCBDU1IgbGlzdCB3YXMgaW5pdGlhbGl6ZWQgYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBpc1VwZGF0ZWRDU1JzSW5pdGlhbGl6ZWQoKSBjb25zdCB7IHJldHVybiBJc1VwZGF0ZWRDU1JzSW5pdGlhbGl6ZWQ7IH0KKworICAvLy8gRGlzYWJsZXMgdGhlIHJlZ2lzdGVyIGZyb20gdGhlIGxpc3Qgb2YgQ1NScy4KKyAgLy8vIEkuZS4gdGhlIHJlZ2lzdGVyIHdpbGwgbm90IGFwcGVhciBhcyBwYXJ0IG9mIHRoZSBDU1IgbWFzay4KKyAgLy8vIFxzZWUgVXBkYXRlZENhbGxlZVNhdmVkUmVncy4KKyAgdm9pZCBkaXNhYmxlQ2FsbGVlU2F2ZWRSZWdpc3Rlcih1bnNpZ25lZCBSZWcpOworCisgIC8vLyBSZXR1cm5zIGxpc3Qgb2YgY2FsbGVlIHNhdmVkIHJlZ2lzdGVycy4KKyAgLy8vIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRoZSB1cGRhdGVkIENTUiBsaXN0IChhZnRlciB0YWtpbmcgaW50byBhY2NvdW50CisgIC8vLyByZWdpc3RlcnMgdGhhdCBhcmUgZGlzYWJsZWQgZnJvbSB0aGUgQ1NSIGxpc3QpLgorICBjb25zdCBNQ1BoeXNSZWcgKmdldENhbGxlZVNhdmVkUmVncygpIGNvbnN0OworCisgIC8vLyBTZXRzIHRoZSB1cGRhdGVkIENhbGxlZSBTYXZlZCBSZWdpc3RlcnMgbGlzdC4KKyAgLy8vIE5vdGljZSB0aGF0IGl0IHdpbGwgb3ZlcnJpZGUgYW50IHByZXZpb3VzbHkgZGlzYWJsZWQvc2F2ZWQgQ1NScy4KKyAgdm9pZCBzZXRDYWxsZWVTYXZlZFJlZ3MoQXJyYXlSZWY8TUNQaHlzUmVnPiBDU1JzKTsKKworICAvLyBTdHJpY3RseSBmb3IgdXNlIGJ5IE1hY2hpbmVJbnN0ci5jcHAuCisgIHZvaWQgYWRkUmVnT3BlcmFuZFRvVXNlTGlzdChNYWNoaW5lT3BlcmFuZCAqTU8pOworCisgIC8vIFN0cmljdGx5IGZvciB1c2UgYnkgTWFjaGluZUluc3RyLmNwcC4KKyAgdm9pZCByZW1vdmVSZWdPcGVyYW5kRnJvbVVzZUxpc3QoTWFjaGluZU9wZXJhbmQgKk1PKTsKKworICAvLyBTdHJpY3RseSBmb3IgdXNlIGJ5IE1hY2hpbmVJbnN0ci5jcHAuCisgIHZvaWQgbW92ZU9wZXJhbmRzKE1hY2hpbmVPcGVyYW5kICpEc3QsIE1hY2hpbmVPcGVyYW5kICpTcmMsIHVuc2lnbmVkIE51bU9wcyk7CisKKyAgLy8vIFZlcmlmeSB0aGUgc2FuaXR5IG9mIHRoZSB1c2UgbGlzdCBmb3IgUmVnLgorICB2b2lkIHZlcmlmeVVzZUxpc3QodW5zaWduZWQgUmVnKSBjb25zdDsKKworICAvLy8gVmVyaWZ5IHRoZSB1c2UgbGlzdCBvZiBhbGwgcmVnaXN0ZXJzLgorICB2b2lkIHZlcmlmeVVzZUxpc3RzKCkgY29uc3Q7CisKKyAgLy8vIHJlZ19iZWdpbi9yZWdfZW5kIC0gUHJvdmlkZSBpdGVyYXRpb24gc3VwcG9ydCB0byB3YWxrIG92ZXIgYWxsIGRlZmluaXRpb25zCisgIC8vLyBhbmQgdXNlcyBvZiBhIHJlZ2lzdGVyIHdpdGhpbiB0aGUgTWFjaGluZUZ1bmN0aW9uIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhpcworICAvLy8gTWFjaGluZVJlZ2lzdGVySW5mbyBvYmplY3QuCisgIHRlbXBsYXRlPGJvb2wgVXNlcywgYm9vbCBEZWZzLCBib29sIFNraXBEZWJ1ZywKKyAgICAgICAgICAgYm9vbCBCeU9wZXJhbmQsIGJvb2wgQnlJbnN0ciwgYm9vbCBCeUJ1bmRsZT4KKyAgY2xhc3MgZGVmdXNlY2hhaW5faXRlcmF0b3I7CisgIHRlbXBsYXRlPGJvb2wgVXNlcywgYm9vbCBEZWZzLCBib29sIFNraXBEZWJ1ZywKKyAgICAgICAgICAgYm9vbCBCeU9wZXJhbmQsIGJvb2wgQnlJbnN0ciwgYm9vbCBCeUJ1bmRsZT4KKyAgY2xhc3MgZGVmdXNlY2hhaW5faW5zdHJfaXRlcmF0b3I7CisKKyAgLy8gTWFrZSBpdCBhIGZyaWVuZCBzbyBpdCBjYW4gYWNjZXNzIGdldE5leHRPcGVyYW5kRm9yUmVnKCkuCisgIHRlbXBsYXRlPGJvb2wsIGJvb2wsIGJvb2wsIGJvb2wsIGJvb2wsIGJvb2w+CisgICAgZnJpZW5kIGNsYXNzIGRlZnVzZWNoYWluX2l0ZXJhdG9yOworICB0ZW1wbGF0ZTxib29sLCBib29sLCBib29sLCBib29sLCBib29sLCBib29sPgorICAgIGZyaWVuZCBjbGFzcyBkZWZ1c2VjaGFpbl9pbnN0cl9pdGVyYXRvcjsKKworICAvLy8gcmVnX2l0ZXJhdG9yL3JlZ19iZWdpbi9yZWdfZW5kIC0gV2FsayBhbGwgZGVmcyBhbmQgdXNlcyBvZiB0aGUgc3BlY2lmaWVkCisgIC8vLyByZWdpc3Rlci4KKyAgdXNpbmcgcmVnX2l0ZXJhdG9yID0KKyAgICAgIGRlZnVzZWNoYWluX2l0ZXJhdG9yPHRydWUsIHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSwgZmFsc2U+OworICByZWdfaXRlcmF0b3IgcmVnX2JlZ2luKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIHJlZ19pdGVyYXRvcihnZXRSZWdVc2VEZWZMaXN0SGVhZChSZWdObykpOworICB9CisgIHN0YXRpYyByZWdfaXRlcmF0b3IgcmVnX2VuZCgpIHsgcmV0dXJuIHJlZ19pdGVyYXRvcihudWxscHRyKTsgfQorCisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTxyZWdfaXRlcmF0b3I+ICByZWdfb3BlcmFuZHModW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UocmVnX2JlZ2luKFJlZyksIHJlZ19lbmQoKSk7CisgIH0KKworICAvLy8gcmVnX2luc3RyX2l0ZXJhdG9yL3JlZ19pbnN0cl9iZWdpbi9yZWdfaW5zdHJfZW5kIC0gV2FsayBhbGwgZGVmcyBhbmQgdXNlcworICAvLy8gb2YgdGhlIHNwZWNpZmllZCByZWdpc3Rlciwgc3RlcHBpbmcgYnkgTWFjaGluZUluc3RyLgorICB1c2luZyByZWdfaW5zdHJfaXRlcmF0b3IgPQorICAgICAgZGVmdXNlY2hhaW5faW5zdHJfaXRlcmF0b3I8dHJ1ZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCBmYWxzZT47CisgIHJlZ19pbnN0cl9pdGVyYXRvciByZWdfaW5zdHJfYmVnaW4odW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gcmVnX2luc3RyX2l0ZXJhdG9yKGdldFJlZ1VzZURlZkxpc3RIZWFkKFJlZ05vKSk7CisgIH0KKyAgc3RhdGljIHJlZ19pbnN0cl9pdGVyYXRvciByZWdfaW5zdHJfZW5kKCkgeworICAgIHJldHVybiByZWdfaW5zdHJfaXRlcmF0b3IobnVsbHB0cik7CisgIH0KKworICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8cmVnX2luc3RyX2l0ZXJhdG9yPgorICByZWdfaW5zdHJ1Y3Rpb25zKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHJlZ19pbnN0cl9iZWdpbihSZWcpLCByZWdfaW5zdHJfZW5kKCkpOworICB9CisKKyAgLy8vIHJlZ19idW5kbGVfaXRlcmF0b3IvcmVnX2J1bmRsZV9iZWdpbi9yZWdfYnVuZGxlX2VuZCAtIFdhbGsgYWxsIGRlZnMgYW5kIHVzZXMKKyAgLy8vIG9mIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIsIHN0ZXBwaW5nIGJ5IGJ1bmRsZS4KKyAgdXNpbmcgcmVnX2J1bmRsZV9pdGVyYXRvciA9CisgICAgICBkZWZ1c2VjaGFpbl9pbnN0cl9pdGVyYXRvcjx0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlPjsKKyAgcmVnX2J1bmRsZV9pdGVyYXRvciByZWdfYnVuZGxlX2JlZ2luKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIHJlZ19idW5kbGVfaXRlcmF0b3IoZ2V0UmVnVXNlRGVmTGlzdEhlYWQoUmVnTm8pKTsKKyAgfQorICBzdGF0aWMgcmVnX2J1bmRsZV9pdGVyYXRvciByZWdfYnVuZGxlX2VuZCgpIHsKKyAgICByZXR1cm4gcmVnX2J1bmRsZV9pdGVyYXRvcihudWxscHRyKTsKKyAgfQorCisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTxyZWdfYnVuZGxlX2l0ZXJhdG9yPiByZWdfYnVuZGxlcyh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShyZWdfYnVuZGxlX2JlZ2luKFJlZyksIHJlZ19idW5kbGVfZW5kKCkpOworICB9CisKKyAgLy8vIHJlZ19lbXB0eSAtIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBubyBpbnN0cnVjdGlvbnMgdXNpbmcgb3IgZGVmaW5pbmcgdGhlCisgIC8vLyBzcGVjaWZpZWQgcmVnaXN0ZXIgKGl0IG1heSBiZSBsaXZlLWluKS4KKyAgYm9vbCByZWdfZW1wdHkodW5zaWduZWQgUmVnTm8pIGNvbnN0IHsgcmV0dXJuIHJlZ19iZWdpbihSZWdObykgPT0gcmVnX2VuZCgpOyB9CisKKyAgLy8vIHJlZ19ub2RiZ19pdGVyYXRvci9yZWdfbm9kYmdfYmVnaW4vcmVnX25vZGJnX2VuZCAtIFdhbGsgYWxsIGRlZnMgYW5kIHVzZXMKKyAgLy8vIG9mIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIsIHNraXBwaW5nIHRob3NlIG1hcmtlZCBhcyBEZWJ1Zy4KKyAgdXNpbmcgcmVnX25vZGJnX2l0ZXJhdG9yID0KKyAgICAgIGRlZnVzZWNoYWluX2l0ZXJhdG9yPHRydWUsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZT47CisgIHJlZ19ub2RiZ19pdGVyYXRvciByZWdfbm9kYmdfYmVnaW4odW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gcmVnX25vZGJnX2l0ZXJhdG9yKGdldFJlZ1VzZURlZkxpc3RIZWFkKFJlZ05vKSk7CisgIH0KKyAgc3RhdGljIHJlZ19ub2RiZ19pdGVyYXRvciByZWdfbm9kYmdfZW5kKCkgeworICAgIHJldHVybiByZWdfbm9kYmdfaXRlcmF0b3IobnVsbHB0cik7CisgIH0KKworICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8cmVnX25vZGJnX2l0ZXJhdG9yPgorICByZWdfbm9kYmdfb3BlcmFuZHModW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UocmVnX25vZGJnX2JlZ2luKFJlZyksIHJlZ19ub2RiZ19lbmQoKSk7CisgIH0KKworICAvLy8gcmVnX2luc3RyX25vZGJnX2l0ZXJhdG9yL3JlZ19pbnN0cl9ub2RiZ19iZWdpbi9yZWdfaW5zdHJfbm9kYmdfZW5kIC0gV2FsaworICAvLy8gYWxsIGRlZnMgYW5kIHVzZXMgb2YgdGhlIHNwZWNpZmllZCByZWdpc3Rlciwgc3RlcHBpbmcgYnkgTWFjaGluZUluc3RyLAorICAvLy8gc2tpcHBpbmcgdGhvc2UgbWFya2VkIGFzIERlYnVnLgorICB1c2luZyByZWdfaW5zdHJfbm9kYmdfaXRlcmF0b3IgPQorICAgICAgZGVmdXNlY2hhaW5faW5zdHJfaXRlcmF0b3I8dHJ1ZSwgdHJ1ZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlPjsKKyAgcmVnX2luc3RyX25vZGJnX2l0ZXJhdG9yIHJlZ19pbnN0cl9ub2RiZ19iZWdpbih1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIHJldHVybiByZWdfaW5zdHJfbm9kYmdfaXRlcmF0b3IoZ2V0UmVnVXNlRGVmTGlzdEhlYWQoUmVnTm8pKTsKKyAgfQorICBzdGF0aWMgcmVnX2luc3RyX25vZGJnX2l0ZXJhdG9yIHJlZ19pbnN0cl9ub2RiZ19lbmQoKSB7CisgICAgcmV0dXJuIHJlZ19pbnN0cl9ub2RiZ19pdGVyYXRvcihudWxscHRyKTsKKyAgfQorCisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTxyZWdfaW5zdHJfbm9kYmdfaXRlcmF0b3I+CisgIHJlZ19ub2RiZ19pbnN0cnVjdGlvbnModW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UocmVnX2luc3RyX25vZGJnX2JlZ2luKFJlZyksIHJlZ19pbnN0cl9ub2RiZ19lbmQoKSk7CisgIH0KKworICAvLy8gcmVnX2J1bmRsZV9ub2RiZ19pdGVyYXRvci9yZWdfYnVuZGxlX25vZGJnX2JlZ2luL3JlZ19idW5kbGVfbm9kYmdfZW5kIC0gV2FsaworICAvLy8gYWxsIGRlZnMgYW5kIHVzZXMgb2YgdGhlIHNwZWNpZmllZCByZWdpc3Rlciwgc3RlcHBpbmcgYnkgYnVuZGxlLAorICAvLy8gc2tpcHBpbmcgdGhvc2UgbWFya2VkIGFzIERlYnVnLgorICB1c2luZyByZWdfYnVuZGxlX25vZGJnX2l0ZXJhdG9yID0KKyAgICAgIGRlZnVzZWNoYWluX2luc3RyX2l0ZXJhdG9yPHRydWUsIHRydWUsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZT47CisgIHJlZ19idW5kbGVfbm9kYmdfaXRlcmF0b3IgcmVnX2J1bmRsZV9ub2RiZ19iZWdpbih1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIHJldHVybiByZWdfYnVuZGxlX25vZGJnX2l0ZXJhdG9yKGdldFJlZ1VzZURlZkxpc3RIZWFkKFJlZ05vKSk7CisgIH0KKyAgc3RhdGljIHJlZ19idW5kbGVfbm9kYmdfaXRlcmF0b3IgcmVnX2J1bmRsZV9ub2RiZ19lbmQoKSB7CisgICAgcmV0dXJuIHJlZ19idW5kbGVfbm9kYmdfaXRlcmF0b3IobnVsbHB0cik7CisgIH0KKworICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8cmVnX2J1bmRsZV9ub2RiZ19pdGVyYXRvcj4KKyAgcmVnX25vZGJnX2J1bmRsZXModW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UocmVnX2J1bmRsZV9ub2RiZ19iZWdpbihSZWcpLCByZWdfYnVuZGxlX25vZGJnX2VuZCgpKTsKKyAgfQorCisgIC8vLyByZWdfbm9kYmdfZW1wdHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgb25seSBpbnN0cnVjdGlvbnMgdXNpbmcgb3IgZGVmaW5pbmcKKyAgLy8vIFJlZyBhcmUgRGVidWcgaW5zdHJ1Y3Rpb25zLgorICBib29sIHJlZ19ub2RiZ19lbXB0eSh1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIHJldHVybiByZWdfbm9kYmdfYmVnaW4oUmVnTm8pID09IHJlZ19ub2RiZ19lbmQoKTsKKyAgfQorCisgIC8vLyBkZWZfaXRlcmF0b3IvZGVmX2JlZ2luL2RlZl9lbmQgLSBXYWxrIGFsbCBkZWZzIG9mIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIuCisgIHVzaW5nIGRlZl9pdGVyYXRvciA9CisgICAgICBkZWZ1c2VjaGFpbl9pdGVyYXRvcjxmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZT47CisgIGRlZl9pdGVyYXRvciBkZWZfYmVnaW4odW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gZGVmX2l0ZXJhdG9yKGdldFJlZ1VzZURlZkxpc3RIZWFkKFJlZ05vKSk7CisgIH0KKyAgc3RhdGljIGRlZl9pdGVyYXRvciBkZWZfZW5kKCkgeyByZXR1cm4gZGVmX2l0ZXJhdG9yKG51bGxwdHIpOyB9CisKKyAgaW5saW5lIGl0ZXJhdG9yX3JhbmdlPGRlZl9pdGVyYXRvcj4gZGVmX29wZXJhbmRzKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGRlZl9iZWdpbihSZWcpLCBkZWZfZW5kKCkpOworICB9CisKKyAgLy8vIGRlZl9pbnN0cl9pdGVyYXRvci9kZWZfaW5zdHJfYmVnaW4vZGVmX2luc3RyX2VuZCAtIFdhbGsgYWxsIGRlZnMgb2YgdGhlCisgIC8vLyBzcGVjaWZpZWQgcmVnaXN0ZXIsIHN0ZXBwaW5nIGJ5IE1hY2hpbmVJbnN0LgorICB1c2luZyBkZWZfaW5zdHJfaXRlcmF0b3IgPQorICAgICAgZGVmdXNlY2hhaW5faW5zdHJfaXRlcmF0b3I8ZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2U+OworICBkZWZfaW5zdHJfaXRlcmF0b3IgZGVmX2luc3RyX2JlZ2luKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIGRlZl9pbnN0cl9pdGVyYXRvcihnZXRSZWdVc2VEZWZMaXN0SGVhZChSZWdObykpOworICB9CisgIHN0YXRpYyBkZWZfaW5zdHJfaXRlcmF0b3IgZGVmX2luc3RyX2VuZCgpIHsKKyAgICByZXR1cm4gZGVmX2luc3RyX2l0ZXJhdG9yKG51bGxwdHIpOworICB9CisKKyAgaW5saW5lIGl0ZXJhdG9yX3JhbmdlPGRlZl9pbnN0cl9pdGVyYXRvcj4KKyAgZGVmX2luc3RydWN0aW9ucyh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShkZWZfaW5zdHJfYmVnaW4oUmVnKSwgZGVmX2luc3RyX2VuZCgpKTsKKyAgfQorCisgIC8vLyBkZWZfYnVuZGxlX2l0ZXJhdG9yL2RlZl9idW5kbGVfYmVnaW4vZGVmX2J1bmRsZV9lbmQgLSBXYWxrIGFsbCBkZWZzIG9mIHRoZQorICAvLy8gc3BlY2lmaWVkIHJlZ2lzdGVyLCBzdGVwcGluZyBieSBidW5kbGUuCisgIHVzaW5nIGRlZl9idW5kbGVfaXRlcmF0b3IgPQorICAgICAgZGVmdXNlY2hhaW5faW5zdHJfaXRlcmF0b3I8ZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWU+OworICBkZWZfYnVuZGxlX2l0ZXJhdG9yIGRlZl9idW5kbGVfYmVnaW4odW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gZGVmX2J1bmRsZV9pdGVyYXRvcihnZXRSZWdVc2VEZWZMaXN0SGVhZChSZWdObykpOworICB9CisgIHN0YXRpYyBkZWZfYnVuZGxlX2l0ZXJhdG9yIGRlZl9idW5kbGVfZW5kKCkgeworICAgIHJldHVybiBkZWZfYnVuZGxlX2l0ZXJhdG9yKG51bGxwdHIpOworICB9CisKKyAgaW5saW5lIGl0ZXJhdG9yX3JhbmdlPGRlZl9idW5kbGVfaXRlcmF0b3I+IGRlZl9idW5kbGVzKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGRlZl9idW5kbGVfYmVnaW4oUmVnKSwgZGVmX2J1bmRsZV9lbmQoKSk7CisgIH0KKworICAvLy8gZGVmX2VtcHR5IC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIG5vIGluc3RydWN0aW9ucyBkZWZpbmluZyB0aGUKKyAgLy8vIHNwZWNpZmllZCByZWdpc3RlciAoaXQgbWF5IGJlIGxpdmUtaW4pLgorICBib29sIGRlZl9lbXB0eSh1bnNpZ25lZCBSZWdObykgY29uc3QgeyByZXR1cm4gZGVmX2JlZ2luKFJlZ05vKSA9PSBkZWZfZW5kKCk7IH0KKworICBTdHJpbmdSZWYgZ2V0VlJlZ05hbWUodW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgcmV0dXJuIFZSZWcyTmFtZS5pbkJvdW5kcyhSZWcpID8gU3RyaW5nUmVmKFZSZWcyTmFtZVtSZWddKSA6ICIiOworICB9CisKKyAgdm9pZCBpbnNlcnRWUmVnQnlOYW1lKFN0cmluZ1JlZiBOYW1lLCB1bnNpZ25lZCBSZWcpIHsKKyAgICBhc3NlcnQoKE5hbWUuZW1wdHkoKSB8fCBWUmVnTmFtZXMuZmluZChOYW1lKSA9PSBWUmVnTmFtZXMuZW5kKCkpICYmCisgICAgICAgICAgICJOYW1lZCBWUmVncyBNdXN0IGJlIFVuaXF1ZS4iKTsKKyAgICBpZiAoIU5hbWUuZW1wdHkoKSkgeworICAgICAgVlJlZ05hbWVzLmluc2VydChOYW1lKTsKKyAgICAgIFZSZWcyTmFtZS5ncm93KFJlZyk7CisgICAgICBWUmVnMk5hbWVbUmVnXSA9IE5hbWUuc3RyKCk7CisgICAgfQorICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGV4YWN0bHkgb25lIG9wZXJhbmQgZGVmaW5pbmcgdGhlIHNwZWNpZmllZAorICAvLy8gcmVnaXN0ZXIuCisgIGJvb2wgaGFzT25lRGVmKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgZGVmX2l0ZXJhdG9yIERJID0gZGVmX2JlZ2luKFJlZ05vKTsKKyAgICBpZiAoREkgPT0gZGVmX2VuZCgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiArK0RJID09IGRlZl9lbmQoKTsKKyAgfQorCisgIC8vLyB1c2VfaXRlcmF0b3IvdXNlX2JlZ2luL3VzZV9lbmQgLSBXYWxrIGFsbCB1c2VzIG9mIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIuCisgIHVzaW5nIHVzZV9pdGVyYXRvciA9CisgICAgICBkZWZ1c2VjaGFpbl9pdGVyYXRvcjx0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZT47CisgIHVzZV9pdGVyYXRvciB1c2VfYmVnaW4odW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gdXNlX2l0ZXJhdG9yKGdldFJlZ1VzZURlZkxpc3RIZWFkKFJlZ05vKSk7CisgIH0KKyAgc3RhdGljIHVzZV9pdGVyYXRvciB1c2VfZW5kKCkgeyByZXR1cm4gdXNlX2l0ZXJhdG9yKG51bGxwdHIpOyB9CisKKyAgaW5saW5lIGl0ZXJhdG9yX3JhbmdlPHVzZV9pdGVyYXRvcj4gdXNlX29wZXJhbmRzKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHVzZV9iZWdpbihSZWcpLCB1c2VfZW5kKCkpOworICB9CisKKyAgLy8vIHVzZV9pbnN0cl9pdGVyYXRvci91c2VfaW5zdHJfYmVnaW4vdXNlX2luc3RyX2VuZCAtIFdhbGsgYWxsIHVzZXMgb2YgdGhlCisgIC8vLyBzcGVjaWZpZWQgcmVnaXN0ZXIsIHN0ZXBwaW5nIGJ5IE1hY2hpbmVJbnN0ci4KKyAgdXNpbmcgdXNlX2luc3RyX2l0ZXJhdG9yID0KKyAgICAgIGRlZnVzZWNoYWluX2luc3RyX2l0ZXJhdG9yPHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlPjsKKyAgdXNlX2luc3RyX2l0ZXJhdG9yIHVzZV9pbnN0cl9iZWdpbih1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIHJldHVybiB1c2VfaW5zdHJfaXRlcmF0b3IoZ2V0UmVnVXNlRGVmTGlzdEhlYWQoUmVnTm8pKTsKKyAgfQorICBzdGF0aWMgdXNlX2luc3RyX2l0ZXJhdG9yIHVzZV9pbnN0cl9lbmQoKSB7CisgICAgcmV0dXJuIHVzZV9pbnN0cl9pdGVyYXRvcihudWxscHRyKTsKKyAgfQorCisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTx1c2VfaW5zdHJfaXRlcmF0b3I+CisgIHVzZV9pbnN0cnVjdGlvbnModW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UodXNlX2luc3RyX2JlZ2luKFJlZyksIHVzZV9pbnN0cl9lbmQoKSk7CisgIH0KKworICAvLy8gdXNlX2J1bmRsZV9pdGVyYXRvci91c2VfYnVuZGxlX2JlZ2luL3VzZV9idW5kbGVfZW5kIC0gV2FsayBhbGwgdXNlcyBvZiB0aGUKKyAgLy8vIHNwZWNpZmllZCByZWdpc3Rlciwgc3RlcHBpbmcgYnkgYnVuZGxlLgorICB1c2luZyB1c2VfYnVuZGxlX2l0ZXJhdG9yID0KKyAgICAgIGRlZnVzZWNoYWluX2luc3RyX2l0ZXJhdG9yPHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlPjsKKyAgdXNlX2J1bmRsZV9pdGVyYXRvciB1c2VfYnVuZGxlX2JlZ2luKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIHVzZV9idW5kbGVfaXRlcmF0b3IoZ2V0UmVnVXNlRGVmTGlzdEhlYWQoUmVnTm8pKTsKKyAgfQorICBzdGF0aWMgdXNlX2J1bmRsZV9pdGVyYXRvciB1c2VfYnVuZGxlX2VuZCgpIHsKKyAgICByZXR1cm4gdXNlX2J1bmRsZV9pdGVyYXRvcihudWxscHRyKTsKKyAgfQorCisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTx1c2VfYnVuZGxlX2l0ZXJhdG9yPiB1c2VfYnVuZGxlcyh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZSh1c2VfYnVuZGxlX2JlZ2luKFJlZyksIHVzZV9idW5kbGVfZW5kKCkpOworICB9CisKKyAgLy8vIHVzZV9lbXB0eSAtIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBubyBpbnN0cnVjdGlvbnMgdXNpbmcgdGhlIHNwZWNpZmllZAorICAvLy8gcmVnaXN0ZXIuCisgIGJvb2wgdXNlX2VtcHR5KHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7IHJldHVybiB1c2VfYmVnaW4oUmVnTm8pID09IHVzZV9lbmQoKTsgfQorCisgIC8vLyBoYXNPbmVVc2UgLSBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBleGFjdGx5IG9uZSBpbnN0cnVjdGlvbiB1c2luZyB0aGUKKyAgLy8vIHNwZWNpZmllZCByZWdpc3Rlci4KKyAgYm9vbCBoYXNPbmVVc2UodW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICB1c2VfaXRlcmF0b3IgVUkgPSB1c2VfYmVnaW4oUmVnTm8pOworICAgIGlmIChVSSA9PSB1c2VfZW5kKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuICsrVUkgPT0gdXNlX2VuZCgpOworICB9CisKKyAgLy8vIHVzZV9ub2RiZ19pdGVyYXRvci91c2Vfbm9kYmdfYmVnaW4vdXNlX25vZGJnX2VuZCAtIFdhbGsgYWxsIHVzZXMgb2YgdGhlCisgIC8vLyBzcGVjaWZpZWQgcmVnaXN0ZXIsIHNraXBwaW5nIHRob3NlIG1hcmtlZCBhcyBEZWJ1Zy4KKyAgdXNpbmcgdXNlX25vZGJnX2l0ZXJhdG9yID0KKyAgICAgIGRlZnVzZWNoYWluX2l0ZXJhdG9yPHRydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2U+OworICB1c2Vfbm9kYmdfaXRlcmF0b3IgdXNlX25vZGJnX2JlZ2luKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIHVzZV9ub2RiZ19pdGVyYXRvcihnZXRSZWdVc2VEZWZMaXN0SGVhZChSZWdObykpOworICB9CisgIHN0YXRpYyB1c2Vfbm9kYmdfaXRlcmF0b3IgdXNlX25vZGJnX2VuZCgpIHsKKyAgICByZXR1cm4gdXNlX25vZGJnX2l0ZXJhdG9yKG51bGxwdHIpOworICB9CisKKyAgaW5saW5lIGl0ZXJhdG9yX3JhbmdlPHVzZV9ub2RiZ19pdGVyYXRvcj4KKyAgdXNlX25vZGJnX29wZXJhbmRzKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHVzZV9ub2RiZ19iZWdpbihSZWcpLCB1c2Vfbm9kYmdfZW5kKCkpOworICB9CisKKyAgLy8vIHVzZV9pbnN0cl9ub2RiZ19pdGVyYXRvci91c2VfaW5zdHJfbm9kYmdfYmVnaW4vdXNlX2luc3RyX25vZGJnX2VuZCAtIFdhbGsKKyAgLy8vIGFsbCB1c2VzIG9mIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIsIHN0ZXBwaW5nIGJ5IE1hY2hpbmVJbnN0ciwgc2tpcHBpbmcKKyAgLy8vIHRob3NlIG1hcmtlZCBhcyBEZWJ1Zy4KKyAgdXNpbmcgdXNlX2luc3RyX25vZGJnX2l0ZXJhdG9yID0KKyAgICAgIGRlZnVzZWNoYWluX2luc3RyX2l0ZXJhdG9yPHRydWUsIGZhbHNlLCB0cnVlLCBmYWxzZSwgdHJ1ZSwgZmFsc2U+OworICB1c2VfaW5zdHJfbm9kYmdfaXRlcmF0b3IgdXNlX2luc3RyX25vZGJnX2JlZ2luKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIHVzZV9pbnN0cl9ub2RiZ19pdGVyYXRvcihnZXRSZWdVc2VEZWZMaXN0SGVhZChSZWdObykpOworICB9CisgIHN0YXRpYyB1c2VfaW5zdHJfbm9kYmdfaXRlcmF0b3IgdXNlX2luc3RyX25vZGJnX2VuZCgpIHsKKyAgICByZXR1cm4gdXNlX2luc3RyX25vZGJnX2l0ZXJhdG9yKG51bGxwdHIpOworICB9CisKKyAgaW5saW5lIGl0ZXJhdG9yX3JhbmdlPHVzZV9pbnN0cl9ub2RiZ19pdGVyYXRvcj4KKyAgdXNlX25vZGJnX2luc3RydWN0aW9ucyh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZSh1c2VfaW5zdHJfbm9kYmdfYmVnaW4oUmVnKSwgdXNlX2luc3RyX25vZGJnX2VuZCgpKTsKKyAgfQorCisgIC8vLyB1c2VfYnVuZGxlX25vZGJnX2l0ZXJhdG9yL3VzZV9idW5kbGVfbm9kYmdfYmVnaW4vdXNlX2J1bmRsZV9ub2RiZ19lbmQgLSBXYWxrCisgIC8vLyBhbGwgdXNlcyBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLCBzdGVwcGluZyBieSBidW5kbGUsIHNraXBwaW5nCisgIC8vLyB0aG9zZSBtYXJrZWQgYXMgRGVidWcuCisgIHVzaW5nIHVzZV9idW5kbGVfbm9kYmdfaXRlcmF0b3IgPQorICAgICAgZGVmdXNlY2hhaW5faW5zdHJfaXRlcmF0b3I8dHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZT47CisgIHVzZV9idW5kbGVfbm9kYmdfaXRlcmF0b3IgdXNlX2J1bmRsZV9ub2RiZ19iZWdpbih1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIHJldHVybiB1c2VfYnVuZGxlX25vZGJnX2l0ZXJhdG9yKGdldFJlZ1VzZURlZkxpc3RIZWFkKFJlZ05vKSk7CisgIH0KKyAgc3RhdGljIHVzZV9idW5kbGVfbm9kYmdfaXRlcmF0b3IgdXNlX2J1bmRsZV9ub2RiZ19lbmQoKSB7CisgICAgcmV0dXJuIHVzZV9idW5kbGVfbm9kYmdfaXRlcmF0b3IobnVsbHB0cik7CisgIH0KKworICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8dXNlX2J1bmRsZV9ub2RiZ19pdGVyYXRvcj4KKyAgdXNlX25vZGJnX2J1bmRsZXModW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UodXNlX2J1bmRsZV9ub2RiZ19iZWdpbihSZWcpLCB1c2VfYnVuZGxlX25vZGJnX2VuZCgpKTsKKyAgfQorCisgIC8vLyB1c2Vfbm9kYmdfZW1wdHkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgbm8gbm9uLURlYnVnIGluc3RydWN0aW9ucworICAvLy8gdXNpbmcgdGhlIHNwZWNpZmllZCByZWdpc3Rlci4KKyAgYm9vbCB1c2Vfbm9kYmdfZW1wdHkodW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gdXNlX25vZGJnX2JlZ2luKFJlZ05vKSA9PSB1c2Vfbm9kYmdfZW5kKCk7CisgIH0KKworICAvLy8gaGFzT25lTm9uREJHVXNlIC0gUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgZXhhY3RseSBvbmUgbm9uLURlYnVnCisgIC8vLyBpbnN0cnVjdGlvbiB1c2luZyB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLgorICBib29sIGhhc09uZU5vbkRCR1VzZSh1bnNpZ25lZCBSZWdObykgY29uc3Q7CisKKyAgLy8vIHJlcGxhY2VSZWdXaXRoIC0gUmVwbGFjZSBhbGwgaW5zdGFuY2VzIG9mIEZyb21SZWcgd2l0aCBUb1JlZyBpbiB0aGUKKyAgLy8vIG1hY2hpbmUgZnVuY3Rpb24uICBUaGlzIGlzIGxpa2UgbGx2bS1sZXZlbCBYLT5yZXBsYWNlQWxsVXNlc1dpdGgoWSksCisgIC8vLyBleGNlcHQgdGhhdCBpdCBhbHNvIGNoYW5nZXMgYW55IGRlZmluaXRpb25zIG9mIHRoZSByZWdpc3RlciBhcyB3ZWxsLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBpdCBpcyB1c3VhbGx5IG5lY2Vzc2FyeSB0byBmaXJzdCBjb25zdHJhaW4gVG9SZWcncyByZWdpc3RlcgorICAvLy8gY2xhc3MgYW5kIHJlZ2lzdGVyIGJhbmsgdG8gbWF0Y2ggdGhlIEZyb21SZWcgY29uc3RyYWludHMgdXNpbmcgb25lIG9mIHRoZQorICAvLy8gbWV0aG9kczoKKyAgLy8vCisgIC8vLyAgIGNvbnN0cmFpblJlZ0NsYXNzKFRvUmVnLCBnZXRSZWdDbGFzcyhGcm9tUmVnKSkKKyAgLy8vICAgY29uc3RyYWluUmVnQXR0cnMoVG9SZWcsIEZyb21SZWcpCisgIC8vLyAgIFJlZ2lzdGVyQmFua0luZm86OmNvbnN0cmFpbkdlbmVyaWNSZWdpc3RlcihUb1JlZywKKyAgLy8vICAgICAgICpNUkkuZ2V0UmVnQ2xhc3MoRnJvbVJlZyksIE1SSSkKKyAgLy8vCisgIC8vLyBUaGVzZSBmdW5jdGlvbnMgd2lsbCByZXR1cm4gYSBmYWxzeSByZXN1bHQgaWYgdGhlIHZpcnR1YWwgcmVnaXN0ZXJzIGhhdmUKKyAgLy8vIGluY29tcGF0aWJsZSBjb25zdHJhaW50cy4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgaWYgVG9SZWcgaXMgYSBwaHlzaWNhbCByZWdpc3RlciB0aGUgZnVuY3Rpb24gd2lsbCByZXBsYWNlIGFuZAorICAvLy8gYXBwbHkgc3ViIHJlZ2lzdGVycyB0byBUb1JlZyBpbiBvcmRlciB0byBvYnRhaW4gYSBmaW5hbC9wcm9wZXIgcGh5c2ljYWwKKyAgLy8vIHJlZ2lzdGVyLgorICB2b2lkIHJlcGxhY2VSZWdXaXRoKHVuc2lnbmVkIEZyb21SZWcsIHVuc2lnbmVkIFRvUmVnKTsKKworICAvLy8gZ2V0VlJlZ0RlZiAtIFJldHVybiB0aGUgbWFjaGluZSBpbnN0ciB0aGF0IGRlZmluZXMgdGhlIHNwZWNpZmllZCB2aXJ0dWFsCisgIC8vLyByZWdpc3RlciBvciBudWxsIGlmIG5vbmUgaXMgZm91bmQuICBUaGlzIGFzc3VtZXMgdGhhdCB0aGUgY29kZSBpcyBpbiBTU0EKKyAgLy8vIGZvcm0sIHNvIHRoZXJlIHNob3VsZCBvbmx5IGJlIG9uZSBkZWZpbml0aW9uLgorICBNYWNoaW5lSW5zdHIgKmdldFZSZWdEZWYodW5zaWduZWQgUmVnKSBjb25zdDsKKworICAvLy8gZ2V0VW5pcXVlVlJlZ0RlZiAtIFJldHVybiB0aGUgdW5pcXVlIG1hY2hpbmUgaW5zdHIgdGhhdCBkZWZpbmVzIHRoZQorICAvLy8gc3BlY2lmaWVkIHZpcnR1YWwgcmVnaXN0ZXIgb3IgbnVsbCBpZiBub25lIGlzIGZvdW5kLiAgSWYgdGhlcmUgYXJlCisgIC8vLyBtdWx0aXBsZSBkZWZpbml0aW9ucyBvciBubyBkZWZpbml0aW9uLCByZXR1cm4gbnVsbC4KKyAgTWFjaGluZUluc3RyICpnZXRVbmlxdWVWUmVnRGVmKHVuc2lnbmVkIFJlZykgY29uc3Q7CisKKyAgLy8vIGNsZWFyS2lsbEZsYWdzIC0gSXRlcmF0ZSBvdmVyIGFsbCB0aGUgdXNlcyBvZiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgYW5kCisgIC8vLyBjbGVhciB0aGUga2lsbCBmbGFnIGZyb20gdGhlIE1hY2hpbmVPcGVyYW5kLiBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgYnkKKyAgLy8vIG9wdGltaXphdGlvbiBwYXNzZXMgd2hpY2ggZXh0ZW5kIHJlZ2lzdGVyIGxpZmV0aW1lcyBhbmQgbmVlZCBvbmx5CisgIC8vLyBwcmVzZXJ2ZSBjb25zZXJ2YXRpdmUga2lsbCBmbGFnIGluZm9ybWF0aW9uLgorICB2b2lkIGNsZWFyS2lsbEZsYWdzKHVuc2lnbmVkIFJlZykgY29uc3Q7CisKKyAgdm9pZCBkdW1wVXNlcyh1bnNpZ25lZCBSZWdObykgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBQaHlzUmVnIGlzIHVuYWxsb2NhdGFibGUgYW5kIGNvbnN0YW50IHRocm91Z2hvdXQgdGhlCisgIC8vLyBmdW5jdGlvbi4gV3JpdGluZyB0byBhIGNvbnN0YW50IHJlZ2lzdGVyIGhhcyBubyBlZmZlY3QuCisgIGJvb2wgaXNDb25zdGFudFBoeXNSZWcodW5zaWduZWQgUGh5c1JlZykgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBlaXRoZXIgaXNDb25zdGFudFBoeXNSZWcgb3IgVFJJLT5pc0NhbGxlclByZXNlcnZlZFBoeXNSZWcKKyAgLy8vIHJldHVybnMgdHJ1ZS4gVGhpcyBpcyBhIHV0aWxpdHkgbWVtYmVyIGZ1bmN0aW9uLgorICBib29sIGlzQ2FsbGVyUHJlc2VydmVkT3JDb25zdFBoeXNSZWcodW5zaWduZWQgUGh5c1JlZykgY29uc3Q7CisKKyAgLy8vIEdldCBhbiBpdGVyYXRvciBvdmVyIHRoZSBwcmVzc3VyZSBzZXRzIGFmZmVjdGVkIGJ5IHRoZSBnaXZlbiBwaHlzaWNhbCBvcgorICAvLy8gdmlydHVhbCByZWdpc3Rlci4gSWYgUmVnVW5pdCBpcyBwaHlzaWNhbCwgaXQgbXVzdCBiZSBhIHJlZ2lzdGVyIHVuaXQgKGZyb20KKyAgLy8vIE1DUmVnVW5pdEl0ZXJhdG9yKS4KKyAgUFNldEl0ZXJhdG9yIGdldFByZXNzdXJlU2V0cyh1bnNpZ25lZCBSZWdVbml0KSBjb25zdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gVmlydHVhbCBSZWdpc3RlciBJbmZvCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBSZXR1cm4gdGhlIHJlZ2lzdGVyIGNsYXNzIG9mIHRoZSBzcGVjaWZpZWQgdmlydHVhbCByZWdpc3Rlci4KKyAgLy8vIFRoaXMgc2hvdWxkbid0IGJlIHVzZWQgZGlyZWN0bHkgdW5sZXNzIFxwIFJlZyBoYXMgYSByZWdpc3RlciBjbGFzcy4KKyAgLy8vIFxzZWUgZ2V0UmVnQ2xhc3NPck51bGwgd2hlbiB0aGlzIG1pZ2h0IGhhcHBlbi4KKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqZ2V0UmVnQ2xhc3ModW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgYXNzZXJ0KFZSZWdJbmZvW1JlZ10uZmlyc3QuaXM8Y29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqPigpICYmCisgICAgICAgICAgICJSZWdpc3RlciBjbGFzcyBub3Qgc2V0LCB3cm9uZyBhY2Nlc3NvciIpOworICAgIHJldHVybiBWUmVnSW5mb1tSZWddLmZpcnN0LmdldDxjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICo+KCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSByZWdpc3RlciBjbGFzcyBvZiBccCBSZWcsIG9yIG51bGwgaWYgUmVnIGhhcyBub3QgYmVlbiBhc3NpZ25lZAorICAvLy8gYSByZWdpc3RlciBjbGFzcyB5ZXQuCisgIC8vLworICAvLy8gXG5vdGUgQSBudWxsIHJlZ2lzdGVyIGNsYXNzIGNhbiBvbmx5IGhhcHBlbiB3aGVuIHRoZXNlIHR3bworICAvLy8gY29uZGl0aW9ucyBhcmUgbWV0OgorICAvLy8gMS4gR2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVycyBhcmUgY3JlYXRlZC4KKyAgLy8vIDIuIFRoZSBtYWNoaW5lIGZ1bmN0aW9uIGhhcyBub3QgY29tcGxldGVseSBiZWVuIHRocm91Z2ggdGhlCisgIC8vLyAgICBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gcHJvY2Vzcy4KKyAgLy8vIE5vbmUgb2YgdGhpcyBjb25kaXRpb24gaXMgcG9zc2libGUgd2l0aG91dCBHbG9iYWxJU2VsIGZvciBub3cuCisgIC8vLyBJbiBvdGhlciB3b3JkcywgaWYgR2xvYmFsSVNlbCBpcyBub3QgdXNlZCBvciBpZiB0aGUgcXVlcnkgaGFwcGVucyBhZnRlcgorICAvLy8gdGhlIHNlbGVjdCBwYXNzLCB1c2luZyBnZXRSZWdDbGFzcyBpcyBzYWZlLgorICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpnZXRSZWdDbGFzc09yTnVsbCh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICBjb25zdCBSZWdDbGFzc09yUmVnQmFuayAmVmFsID0gVlJlZ0luZm9bUmVnXS5maXJzdDsKKyAgICByZXR1cm4gVmFsLmR5bl9jYXN0PGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKj4oKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHJlZ2lzdGVyIGJhbmsgb2YgXHAgUmVnLCBvciBudWxsIGlmIFJlZyBoYXMgbm90IGJlZW4gYXNzaWduZWQKKyAgLy8vIGEgcmVnaXN0ZXIgYmFuayBvciBoYXMgYmVlbiBhc3NpZ25lZCBhIHJlZ2lzdGVyIGNsYXNzLgorICAvLy8gXG5vdGUgSXQgaXMgcG9zc2libGUgdG8gZ2V0IHRoZSByZWdpc3RlciBiYW5rIGZyb20gdGhlIHJlZ2lzdGVyIGNsYXNzIHZpYQorICAvLy8gUmVnaXN0ZXJCYW5rSW5mbzo6Z2V0UmVnQmFua0Zyb21SZWdDbGFzcy4KKyAgY29uc3QgUmVnaXN0ZXJCYW5rICpnZXRSZWdCYW5rT3JOdWxsKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIGNvbnN0IFJlZ0NsYXNzT3JSZWdCYW5rICZWYWwgPSBWUmVnSW5mb1tSZWddLmZpcnN0OworICAgIHJldHVybiBWYWwuZHluX2Nhc3Q8Y29uc3QgUmVnaXN0ZXJCYW5rICo+KCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSByZWdpc3RlciBiYW5rIG9yIHJlZ2lzdGVyIGNsYXNzIG9mIFxwIFJlZy4KKyAgLy8vIFxub3RlIEJlZm9yZSB0aGUgcmVnaXN0ZXIgYmFuayBnZXRzIGFzc2lnbmVkIChpLmUuLCBiZWZvcmUgdGhlCisgIC8vLyBSZWdCYW5rU2VsZWN0IHBhc3MpIFxwIFJlZyBtYXkgbm90IGhhdmUgZWl0aGVyLgorICBjb25zdCBSZWdDbGFzc09yUmVnQmFuayAmZ2V0UmVnQ2xhc3NPclJlZ0JhbmsodW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgcmV0dXJuIFZSZWdJbmZvW1JlZ10uZmlyc3Q7CisgIH0KKworICAvLy8gc2V0UmVnQ2xhc3MgLSBTZXQgdGhlIHJlZ2lzdGVyIGNsYXNzIG9mIHRoZSBzcGVjaWZpZWQgdmlydHVhbCByZWdpc3Rlci4KKyAgdm9pZCBzZXRSZWdDbGFzcyh1bnNpZ25lZCBSZWcsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKTsKKworICAvLy8gU2V0IHRoZSByZWdpc3RlciBiYW5rIHRvIFxwIFJlZ0JhbmsgZm9yIFxwIFJlZy4KKyAgdm9pZCBzZXRSZWdCYW5rKHVuc2lnbmVkIFJlZywgY29uc3QgUmVnaXN0ZXJCYW5rICZSZWdCYW5rKTsKKworICB2b2lkIHNldFJlZ0NsYXNzT3JSZWdCYW5rKHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWdDbGFzc09yUmVnQmFuayAmUkNPclJCKXsKKyAgICBWUmVnSW5mb1tSZWddLmZpcnN0ID0gUkNPclJCOworICB9CisKKyAgLy8vIGNvbnN0cmFpblJlZ0NsYXNzIC0gQ29uc3RyYWluIHRoZSByZWdpc3RlciBjbGFzcyBvZiB0aGUgc3BlY2lmaWVkIHZpcnR1YWwKKyAgLy8vIHJlZ2lzdGVyIHRvIGJlIGEgY29tbW9uIHN1YmNsYXNzIG9mIFJDIGFuZCB0aGUgY3VycmVudCByZWdpc3RlciBjbGFzcywKKyAgLy8vIGJ1dCBvbmx5IGlmIHRoZSBuZXcgY2xhc3MgaGFzIGF0IGxlYXN0IE1pbk51bVJlZ3MgcmVnaXN0ZXJzLiAgUmV0dXJuIHRoZQorICAvLy8gbmV3IHJlZ2lzdGVyIGNsYXNzLCBvciBOVUxMIGlmIG5vIHN1Y2ggY2xhc3MgZXhpc3RzLgorICAvLy8gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gdGhlIGNvbnN0cmFpbnQgaXMga25vd24gdG8gYmUgdHJpdmlhbCwgbGlrZQorICAvLy8gR1IzMiAtPiBHUjMyX05PU1AuIEJld2FyZSBvZiBpbmNyZWFzaW5nIHJlZ2lzdGVyIHByZXNzdXJlLgorICAvLy8KKyAgLy8vIFxub3RlIEFzc3VtZXMgdGhhdCB0aGUgcmVnaXN0ZXIgaGFzIGEgcmVnaXN0ZXIgY2xhc3MgYXNzaWduZWQuCisgIC8vLyBVc2UgUmVnaXN0ZXJCYW5rSW5mbzo6Y29uc3RyYWluR2VuZXJpY1JlZ2lzdGVyIGluIEdsb2JhbElTZWwncworICAvLy8gSW5zdHJ1Y3Rpb25TZWxlY3QgcGFzcyBhbmQgY29uc3RyYWluUmVnQXR0cnMgaW4gZXZlcnkgb3RoZXIgcGFzcywKKyAgLy8vIGluY2x1ZGluZyBub24tc2VsZWN0IHBhc3NlcyBvZiBHbG9iYWxJU2VsLCBpbnN0ZWFkLgorICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpjb25zdHJhaW5SZWdDbGFzcyh1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNaW5OdW1SZWdzID0gMCk7CisKKyAgLy8vIENvbnN0cmFpbiB0aGUgcmVnaXN0ZXIgY2xhc3Mgb3IgdGhlIHJlZ2lzdGVyIGJhbmsgb2YgdGhlIHZpcnR1YWwgcmVnaXN0ZXIKKyAgLy8vIFxwIFJlZyB0byBiZSBhIGNvbW1vbiBzdWJjbGFzcyBhbmQgYSBjb21tb24gYmFuayBvZiBib3RoIHJlZ2lzdGVycworICAvLy8gcHJvdmlkZWQgcmVzcGVjdGl2ZWx5LiBEbyBub3RoaW5nIGlmIGFueSBvZiB0aGUgYXR0cmlidXRlcyAoY2xhc3NlcywKKyAgLy8vIGJhbmtzLCBvciBsb3ctbGV2ZWwgdHlwZXMpIG9mIHRoZSByZWdpc3RlcnMgYXJlIGRlZW1lZCBpbmNvbXBhdGlibGUsIG9yIGlmCisgIC8vLyB0aGUgcmVzdWx0aW5nIHJlZ2lzdGVyIHdpbGwgaGF2ZSBhIGNsYXNzIHNtYWxsZXIgdGhhbiBiZWZvcmUgYW5kIG9mIHNpemUKKyAgLy8vIGxlc3MgdGhhbiBccCBNaW5OdW1SZWdzLiBSZXR1cm4gdHJ1ZSBpZiBzdWNoIHJlZ2lzdGVyIGF0dHJpYnV0ZXMgZXhpc3QsCisgIC8vLyBmYWxzZSBvdGhlcndpc2UuCisgIC8vLworICAvLy8gXG5vdGUgQXNzdW1lcyB0aGF0IGVhY2ggcmVnaXN0ZXIgaGFzIGVpdGhlciBhIGxvdy1sZXZlbCB0eXBlIG9yIGEgY2xhc3MKKyAgLy8vIGFzc2lnbmVkLCBidXQgbm90IGJvdGguIFVzZSB0aGlzIG1ldGhvZCBpbnN0ZWFkIG9mIGNvbnN0cmFpblJlZ0NsYXNzIGFuZAorICAvLy8gUmVnaXN0ZXJCYW5rSW5mbzo6Y29uc3RyYWluR2VuZXJpY1JlZ2lzdGVyIGV2ZXJ5d2hlcmUgYnV0IFNlbGVjdGlvbkRBRworICAvLy8gSVNlbCAvIEZhc3RJU2VsIGFuZCBHbG9iYWxJU2VsJ3MgSW5zdHJ1Y3Rpb25TZWxlY3QgcGFzcyByZXNwZWN0aXZlbHkuCisgIGJvb2wgY29uc3RyYWluUmVnQXR0cnModW5zaWduZWQgUmVnLCB1bnNpZ25lZCBDb25zdHJhaW5pbmdSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWluTnVtUmVncyA9IDApOworCisgIC8vLyByZWNvbXB1dGVSZWdDbGFzcyAtIFRyeSB0byBmaW5kIGEgbGVnYWwgc3VwZXItY2xhc3Mgb2YgUmVnJ3MgcmVnaXN0ZXIKKyAgLy8vIGNsYXNzIHRoYXQgc3RpbGwgc2F0aXNmaWVzIHRoZSBjb25zdHJhaW50cyBmcm9tIHRoZSBpbnN0cnVjdGlvbnMgdXNpbmcKKyAgLy8vIFJlZy4gIFJldHVybnMgdHJ1ZSBpZiBSZWcgd2FzIHVwZ3JhZGVkLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGFmdGVyIGNvbnN0cmFpbnRzIGhhdmUgYmVlbiByZW1vdmVkIGZyb20gYQorICAvLy8gdmlydHVhbCByZWdpc3RlciwgZm9yIGV4YW1wbGUgYWZ0ZXIgcmVtb3ZpbmcgaW5zdHJ1Y3Rpb25zIG9yIHNwbGl0dGluZworICAvLy8gdGhlIGxpdmUgcmFuZ2UuCisgIGJvb2wgcmVjb21wdXRlUmVnQ2xhc3ModW5zaWduZWQgUmVnKTsKKworICAvLy8gY3JlYXRlVmlydHVhbFJlZ2lzdGVyIC0gQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgdmlydHVhbCByZWdpc3RlciBpbiB0aGUKKyAgLy8vIGZ1bmN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCByZWdpc3RlciBjbGFzcy4KKyAgdW5zaWduZWQgY3JlYXRlVmlydHVhbFJlZ2lzdGVyKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJlZ0NsYXNzKTsKKworICAvLy8gQWNjZXNzb3IgZm9yIFZSZWdUb1R5cGUuIFRoaXMgYWNjZXNzb3Igc2hvdWxkIG9ubHkgYmUgdXNlZAorICAvLy8gYnkgZ2xvYmFsLWlzZWwgcmVsYXRlZCB3b3JrLgorICBWUmVnVG9UeXBlTWFwICZnZXRWUmVnVG9UeXBlKCkgY29uc3QgeworICAgIGlmICghVlJlZ1RvVHlwZSkKKyAgICAgIFZSZWdUb1R5cGUucmVzZXQobmV3IFZSZWdUb1R5cGVNYXApOworICAgIHJldHVybiAqVlJlZ1RvVHlwZS5nZXQoKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGxvdy1sZXZlbCB0eXBlIG9mIFxwIFZSZWcgb3IgTExUe30gaWYgVlJlZyBpcyBub3QgYSBnZW5lcmljCisgIC8vLyAodGFyZ2V0IGluZGVwZW5kZW50KSB2aXJ0dWFsIHJlZ2lzdGVyLgorICBMTFQgZ2V0VHlwZSh1bnNpZ25lZCBWUmVnKSBjb25zdDsKKworICAvLy8gU2V0IHRoZSBsb3ctbGV2ZWwgdHlwZSBvZiBccCBWUmVnIHRvIFxwIFR5LgorICB2b2lkIHNldFR5cGUodW5zaWduZWQgVlJlZywgTExUIFR5KTsKKworICAvLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgZ2VuZXJpYyB2aXJ0dWFsIHJlZ2lzdGVyIHdpdGggbG93LWxldmVsCisgIC8vLyB0eXBlIFxwIFR5LgorICB1bnNpZ25lZCBjcmVhdGVHZW5lcmljVmlydHVhbFJlZ2lzdGVyKExMVCBUeSk7CisKKyAgLy8vIFJlbW92ZSBhbGwgdHlwZXMgYXNzb2NpYXRlZCB0byB2aXJ0dWFsIHJlZ2lzdGVycyAoYWZ0ZXIgaW5zdHJ1Y3Rpb24KKyAgLy8vIHNlbGVjdGlvbiBhbmQgY29uc3RyYWluaW5nIG9mIGFsbCBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXJzKS4KKyAgdm9pZCBjbGVhclZpcnRSZWdUeXBlcygpOworCisgIC8vLyBDcmVhdGVzIGEgbmV3IHZpcnR1YWwgcmVnaXN0ZXIgdGhhdCBoYXMgbm8gcmVnaXN0ZXIgY2xhc3MsIHJlZ2lzdGVyIGJhbmsKKyAgLy8vIG9yIHNpemUgYXNzaWduZWQgeWV0LiBUaGlzIGlzIG9ubHkgYWxsb3dlZCB0byBiZSB1c2VkCisgIC8vLyB0ZW1wb3JhcmlseSB3aGlsZSBjb25zdHJ1Y3RpbmcgbWFjaGluZSBpbnN0cnVjdGlvbnMuIE1vc3Qgb3BlcmF0aW9ucyBhcmUKKyAgLy8vIHVuZGVmaW5lZCBvbiBhbiBpbmNvbXBsZXRlIHJlZ2lzdGVyIHVudGlsIG9uZSBvZiBzZXRSZWdDbGFzcygpLAorICAvLy8gc2V0UmVnQmFuaygpIG9yIHNldFNpemUoKSBoYXMgYmVlbiBjYWxsZWQgb24gaXQuCisgIHVuc2lnbmVkIGNyZWF0ZUluY29tcGxldGVWaXJ0dWFsUmVnaXN0ZXIoU3RyaW5nUmVmIE5hbWUgPSAiIik7CisKKyAgLy8vIGdldE51bVZpcnRSZWdzIC0gUmV0dXJuIHRoZSBudW1iZXIgb2YgdmlydHVhbCByZWdpc3RlcnMgY3JlYXRlZC4KKyAgdW5zaWduZWQgZ2V0TnVtVmlydFJlZ3MoKSBjb25zdCB7IHJldHVybiBWUmVnSW5mby5zaXplKCk7IH0KKworICAvLy8gY2xlYXJWaXJ0UmVncyAtIFJlbW92ZSBhbGwgdmlydHVhbCByZWdpc3RlcnMgKGFmdGVyIHBoeXNyZWcgYXNzaWdubWVudCkuCisgIHZvaWQgY2xlYXJWaXJ0UmVncygpOworCisgIC8vLyBzZXRSZWdBbGxvY2F0aW9uSGludCAtIFNwZWNpZnkgYSByZWdpc3RlciBhbGxvY2F0aW9uIGhpbnQgZm9yIHRoZQorICAvLy8gc3BlY2lmaWVkIHZpcnR1YWwgcmVnaXN0ZXIuIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgYnkgdGFyZ2V0LCBhbmQgaW4gY2FzZQorICAvLy8gb2YgYW4gZWFybGllciBoaW50IGl0IHdpbGwgYmUgb3ZlcndyaXR0ZW4uCisgIHZvaWQgc2V0UmVnQWxsb2NhdGlvbkhpbnQodW5zaWduZWQgVlJlZywgdW5zaWduZWQgVHlwZSwgdW5zaWduZWQgUHJlZlJlZykgeworICAgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKFZSZWcpKTsKKyAgICBSZWdBbGxvY0hpbnRzW1ZSZWddLmZpcnN0ICA9IFR5cGU7CisgICAgUmVnQWxsb2NIaW50c1tWUmVnXS5zZWNvbmQuY2xlYXIoKTsKKyAgICBSZWdBbGxvY0hpbnRzW1ZSZWddLnNlY29uZC5wdXNoX2JhY2soUHJlZlJlZyk7CisgIH0KKworICAvLy8gYWRkUmVnQWxsb2NhdGlvbkhpbnQgLSBBZGQgYSByZWdpc3RlciBhbGxvY2F0aW9uIGhpbnQgdG8gdGhlIGhpbnRzCisgIC8vLyB2ZWN0b3IgZm9yIFZSZWcuCisgIHZvaWQgYWRkUmVnQWxsb2NhdGlvbkhpbnQodW5zaWduZWQgVlJlZywgdW5zaWduZWQgUHJlZlJlZykgeworICAgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKFZSZWcpKTsKKyAgICBSZWdBbGxvY0hpbnRzW1ZSZWddLnNlY29uZC5wdXNoX2JhY2soUHJlZlJlZyk7CisgIH0KKworICAvLy8gU3BlY2lmeSB0aGUgcHJlZmVycmVkICh0YXJnZXQgaW5kZXBlbmRlbnQpIHJlZ2lzdGVyIGFsbG9jYXRpb24gaGludCBmb3IKKyAgLy8vIHRoZSBzcGVjaWZpZWQgdmlydHVhbCByZWdpc3Rlci4KKyAgdm9pZCBzZXRTaW1wbGVIaW50KHVuc2lnbmVkIFZSZWcsIHVuc2lnbmVkIFByZWZSZWcpIHsKKyAgICBzZXRSZWdBbGxvY2F0aW9uSGludChWUmVnLCAvKlR5cGU9Ki8wLCBQcmVmUmVnKTsKKyAgfQorCisgIHZvaWQgY2xlYXJTaW1wbGVIaW50KHVuc2lnbmVkIFZSZWcpIHsKKyAgICBhc3NlcnQgKFJlZ0FsbG9jSGludHNbVlJlZ10uZmlyc3QgPT0gMCAmJgorICAgICAgICAgICAgIkV4cGVjdGVkIHRvIGNsZWFyIGEgbm9uLXRhcmdldCBoaW50ISIpOworICAgIFJlZ0FsbG9jSGludHNbVlJlZ10uc2Vjb25kLmNsZWFyKCk7CisgIH0KKworICAvLy8gZ2V0UmVnQWxsb2NhdGlvbkhpbnQgLSBSZXR1cm4gdGhlIHJlZ2lzdGVyIGFsbG9jYXRpb24gaGludCBmb3IgdGhlCisgIC8vLyBzcGVjaWZpZWQgdmlydHVhbCByZWdpc3Rlci4gSWYgdGhlcmUgYXJlIG1hbnkgaGludHMsIHRoaXMgcmV0dXJucyB0aGUKKyAgLy8vIG9uZSB3aXRoIHRoZSBncmVhdGVzdCB3ZWlnaHQuCisgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+CisgIGdldFJlZ0FsbG9jYXRpb25IaW50KHVuc2lnbmVkIFZSZWcpIGNvbnN0IHsKKyAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihWUmVnKSk7CisgICAgdW5zaWduZWQgQmVzdEhpbnQgPSAoUmVnQWxsb2NIaW50c1tWUmVnXS5zZWNvbmQuc2l6ZSgpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICBSZWdBbGxvY0hpbnRzW1ZSZWddLnNlY29uZFswXSA6IDApOworICAgIHJldHVybiBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPihSZWdBbGxvY0hpbnRzW1ZSZWddLmZpcnN0LCBCZXN0SGludCk7CisgIH0KKworICAvLy8gZ2V0U2ltcGxlSGludCAtIHNhbWUgYXMgZ2V0UmVnQWxsb2NhdGlvbkhpbnQgZXhjZXB0IGl0IHdpbGwgb25seSByZXR1cm4KKyAgLy8vIGEgdGFyZ2V0IGluZGVwZW5kZW50IGhpbnQuCisgIHVuc2lnbmVkIGdldFNpbXBsZUhpbnQodW5zaWduZWQgVlJlZykgY29uc3QgeworICAgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKFZSZWcpKTsKKyAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiBIaW50ID0gZ2V0UmVnQWxsb2NhdGlvbkhpbnQoVlJlZyk7CisgICAgcmV0dXJuIEhpbnQuZmlyc3QgPyAwIDogSGludC5zZWNvbmQ7CisgIH0KKworICAvLy8gZ2V0UmVnQWxsb2NhdGlvbkhpbnRzIC0gUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSB2ZWN0b3Igb2YgYWxsCisgIC8vLyByZWdpc3RlciBhbGxvY2F0aW9uIGhpbnRzIGZvciBWUmVnLgorICBjb25zdCBzdGQ6OnBhaXI8dW5zaWduZWQsIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0Pj4KKyAgJmdldFJlZ0FsbG9jYXRpb25IaW50cyh1bnNpZ25lZCBWUmVnKSBjb25zdCB7CisgICAgYXNzZXJ0KFRhcmdldFJlZ2lzdGVySW5mbzo6aXNWaXJ0dWFsUmVnaXN0ZXIoVlJlZykpOworICAgIHJldHVybiBSZWdBbGxvY0hpbnRzW1ZSZWddOworICB9CisKKyAgLy8vIG1hcmtVc2VzSW5EZWJ1Z1ZhbHVlQXNVbmRlZiAtIE1hcmsgZXZlcnkgREJHX1ZBTFVFIHJlZmVyZW5jaW5nIHRoZQorICAvLy8gc3BlY2lmaWVkIHJlZ2lzdGVyIGFzIHVuZGVmaW5lZCB3aGljaCBjYXVzZXMgdGhlIERCR19WQUxVRSB0byBiZQorICAvLy8gZGVsZXRlZCBkdXJpbmcgTGl2ZURlYnVnVmFyaWFibGVzIGFuYWx5c2lzLgorICB2b2lkIG1hcmtVc2VzSW5EZWJ1Z1ZhbHVlQXNVbmRlZih1bnNpZ25lZCBSZWcpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGlzIG1vZGlmaWVkIGluIHRoaXMgZnVuY3Rpb24uCisgIC8vLyBUaGlzIGNoZWNrcyB0aGF0IG5vIGRlZmluaW5nIG1hY2hpbmUgb3BlcmFuZHMgZXhpc3QgZm9yIHRoZSByZWdpc3RlciBvcgorICAvLy8gYW55IG9mIGl0cyBhbGlhc2VzLiBEZWZpbml0aW9ucyBmb3VuZCBvbiBmdW5jdGlvbnMgbWFya2VkIG5vcmV0dXJuIGFyZQorICAvLy8gaWdub3JlZCwgdG8gY29uc2lkZXIgdGhlbSBwYXNzICd0cnVlJyBmb3Igb3B0aW9uYWwgcGFyYW1ldGVyCisgIC8vLyBTa2lwTm9SZXR1cm5EZWYuIFRoZSByZWdpc3RlciBpcyBhbHNvIGNvbnNpZGVyZWQgbW9kaWZpZWQgd2hlbiBpdCBpcyBzZXQKKyAgLy8vIGluIHRoZSBVc2VkUGh5c1JlZ01hc2suCisgIGJvb2wgaXNQaHlzUmVnTW9kaWZpZWQodW5zaWduZWQgUGh5c1JlZywgYm9vbCBTa2lwTm9SZXR1cm5EZWYgPSBmYWxzZSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgaXMgbW9kaWZpZWQgb3IgcmVhZCBpbiB0aGlzCisgIC8vLyBmdW5jdGlvbi4gVGhpcyBjaGVja3MgdGhhdCBubyBtYWNoaW5lIG9wZXJhbmRzIGV4aXN0IGZvciB0aGUgcmVnaXN0ZXIgb3IKKyAgLy8vIGFueSBvZiBpdHMgYWxpYXNlcy4gVGhlIHJlZ2lzdGVyIGlzIGFsc28gY29uc2lkZXJlZCB1c2VkIHdoZW4gaXQgaXMgc2V0CisgIC8vLyBpbiB0aGUgVXNlZFBoeXNSZWdNYXNrLgorICBib29sIGlzUGh5c1JlZ1VzZWQodW5zaWduZWQgUGh5c1JlZykgY29uc3Q7CisKKyAgLy8vIGFkZFBoeXNSZWdzVXNlZEZyb21SZWdNYXNrIC0gTWFyayBhbnkgcmVnaXN0ZXJzIG5vdCBpbiBSZWdNYXNrIGFzIHVzZWQuCisgIC8vLyBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBiaXQgbWFzayBhdHRhY2hlZCB0byByZWdpc3RlciBtYXNrIG9wZXJhbmRzLgorICB2b2lkIGFkZFBoeXNSZWdzVXNlZEZyb21SZWdNYXNrKGNvbnN0IHVpbnQzMl90ICpSZWdNYXNrKSB7CisgICAgVXNlZFBoeXNSZWdNYXNrLnNldEJpdHNOb3RJbk1hc2soUmVnTWFzayk7CisgIH0KKworICBjb25zdCBCaXRWZWN0b3IgJmdldFVzZWRQaHlzUmVnc01hc2soKSBjb25zdCB7IHJldHVybiBVc2VkUGh5c1JlZ01hc2s7IH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUmVzZXJ2ZWQgUmVnaXN0ZXIgSW5mbworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8KKyAgLy8gVGhlIHNldCBvZiByZXNlcnZlZCByZWdpc3RlcnMgbXVzdCBiZSBpbnZhcmlhbnQgZHVyaW5nIHJlZ2lzdGVyCisgIC8vIGFsbG9jYXRpb24uICBGb3IgZXhhbXBsZSwgdGhlIHRhcmdldCBjYW5ub3Qgc3VkZGVubHkgZGVjaWRlIGl0IG5lZWRzIGEKKyAgLy8gZnJhbWUgcG9pbnRlciB3aGVuIHRoZSByZWdpc3RlciBhbGxvY2F0b3IgaGFzIGFscmVhZHkgdXNlZCB0aGUgZnJhbWUKKyAgLy8gcG9pbnRlciByZWdpc3RlciBmb3Igc29tZXRoaW5nIGVsc2UuCisgIC8vCisgIC8vIFRoZXNlIG1ldGhvZHMgY2FuIGJlIHVzZWQgYnkgdGFyZ2V0IGhvb2tzIGxpa2UgaGFzRlAoKSB0byBhdm9pZCBjaGFuZ2luZworICAvLyB0aGUgcmVzZXJ2ZWQgcmVnaXN0ZXIgc2V0IGR1cmluZyByZWdpc3RlciBhbGxvY2F0aW9uLgorCisgIC8vLyBmcmVlemVSZXNlcnZlZFJlZ3MgLSBDYWxsZWQgYnkgdGhlIHJlZ2lzdGVyIGFsbG9jYXRvciB0byBmcmVlemUgdGhlIHNldAorICAvLy8gb2YgcmVzZXJ2ZWQgcmVnaXN0ZXJzIGJlZm9yZSBhbGxvY2F0aW9uIGJlZ2lucy4KKyAgdm9pZCBmcmVlemVSZXNlcnZlZFJlZ3MoY29uc3QgTWFjaGluZUZ1bmN0aW9uJik7CisKKyAgLy8vIHJlc2VydmVkUmVnc0Zyb3plbiAtIFJldHVybnMgdHJ1ZSBhZnRlciBmcmVlemVSZXNlcnZlZFJlZ3MoKSB3YXMgY2FsbGVkCisgIC8vLyB0byBlbnN1cmUgdGhlIHNldCBvZiByZXNlcnZlZCByZWdpc3RlcnMgc3RheXMgY29uc3RhbnQuCisgIGJvb2wgcmVzZXJ2ZWRSZWdzRnJvemVuKCkgY29uc3QgeworICAgIHJldHVybiAhUmVzZXJ2ZWRSZWdzLmVtcHR5KCk7CisgIH0KKworICAvLy8gY2FuUmVzZXJ2ZVJlZyAtIFJldHVybnMgdHJ1ZSBpZiBQaHlzUmVnIGNhbiBiZSB1c2VkIGFzIGEgcmVzZXJ2ZWQKKyAgLy8vIHJlZ2lzdGVyLiAgQW55IHJlZ2lzdGVyIGNhbiBiZSByZXNlcnZlZCBiZWZvcmUgZnJlZXplUmVzZXJ2ZWRSZWdzKCkgaXMKKyAgLy8vIGNhbGxlZC4KKyAgYm9vbCBjYW5SZXNlcnZlUmVnKHVuc2lnbmVkIFBoeXNSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gIXJlc2VydmVkUmVnc0Zyb3plbigpIHx8IFJlc2VydmVkUmVncy50ZXN0KFBoeXNSZWcpOworICB9CisKKyAgLy8vIGdldFJlc2VydmVkUmVncyAtIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIGZyb3plbiBzZXQgb2YgcmVzZXJ2ZWQKKyAgLy8vIHJlZ2lzdGVycy4gVGhpcyBtZXRob2Qgc2hvdWxkIGFsd2F5cyBiZSBwcmVmZXJyZWQgdG8gY2FsbGluZworICAvLy8gVFJJOjpnZXRSZXNlcnZlZFJlZ3MoKSB3aGVuIHBvc3NpYmxlLgorICBjb25zdCBCaXRWZWN0b3IgJmdldFJlc2VydmVkUmVncygpIGNvbnN0IHsKKyAgICBhc3NlcnQocmVzZXJ2ZWRSZWdzRnJvemVuKCkgJiYKKyAgICAgICAgICAgIlJlc2VydmVkIHJlZ2lzdGVycyBoYXZlbid0IGJlZW4gZnJvemVuIHlldC4gIgorICAgICAgICAgICAiVXNlIFRSSTo6Z2V0UmVzZXJ2ZWRSZWdzKCkuIik7CisgICAgcmV0dXJuIFJlc2VydmVkUmVnczsKKyAgfQorCisgIC8vLyBpc1Jlc2VydmVkIC0gUmV0dXJucyB0cnVlIHdoZW4gUGh5c1JlZyBpcyBhIHJlc2VydmVkIHJlZ2lzdGVyLgorICAvLy8KKyAgLy8vIFJlc2VydmVkIHJlZ2lzdGVycyBtYXkgYmVsb25nIHRvIGFuIGFsbG9jYXRhYmxlIHJlZ2lzdGVyIGNsYXNzLCBidXQgdGhlCisgIC8vLyB0YXJnZXQgaGFzIGV4cGxpY2l0bHkgcmVxdWVzdGVkIHRoYXQgdGhleSBhcmUgbm90IHVzZWQuCisgIGJvb2wgaXNSZXNlcnZlZCh1bnNpZ25lZCBQaHlzUmVnKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFJlc2VydmVkUmVncygpLnRlc3QoUGh5c1JlZyk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIHdoZW4gdGhlIGdpdmVuIHJlZ2lzdGVyIHVuaXQgaXMgY29uc2lkZXJlZCByZXNlcnZlZC4KKyAgLy8vCisgIC8vLyBSZWdpc3RlciB1bml0cyBhcmUgY29uc2lkZXJlZCByZXNlcnZlZCB3aGVuIGZvciBhdCBsZWFzdCBvbmUgb2YgdGhlaXIKKyAgLy8vIHJvb3QgcmVnaXN0ZXJzLCB0aGUgcm9vdCByZWdpc3RlciBhbmQgYWxsIHN1cGVyIHJlZ2lzdGVycyBhcmUgcmVzZXJ2ZWQuCisgIC8vLyBUaGlzIGN1cnJlbnRseSBpdGVyYXRlcyB0aGUgcmVnaXN0ZXIgaGllcmFyY2h5IGFuZCBtYXkgYmUgc2xvd2VyIHRoYW4KKyAgLy8vIGV4cGVjdGVkLgorICBib29sIGlzUmVzZXJ2ZWRSZWdVbml0KHVuc2lnbmVkIFVuaXQpIGNvbnN0OworCisgIC8vLyBpc0FsbG9jYXRhYmxlIC0gUmV0dXJucyB0cnVlIHdoZW4gUGh5c1JlZyBiZWxvbmdzIHRvIGFuIGFsbG9jYXRhYmxlCisgIC8vLyByZWdpc3RlciBjbGFzcyBhbmQgaXQgaGFzbid0IGJlZW4gcmVzZXJ2ZWQuCisgIC8vLworICAvLy8gQWxsb2NhdGFibGUgcmVnaXN0ZXJzIG1heSBzaG93IHVwIGluIHRoZSBhbGxvY2F0aW9uIG9yZGVyIG9mIHNvbWUgdmlydHVhbAorICAvLy8gcmVnaXN0ZXIsIHNvIGEgcmVnaXN0ZXIgYWxsb2NhdG9yIG5lZWRzIHRvIHRyYWNrIGl0cyBsaXZlbmVzcyBhbmQKKyAgLy8vIGF2YWlsYWJpbGl0eS4KKyAgYm9vbCBpc0FsbG9jYXRhYmxlKHVuc2lnbmVkIFBoeXNSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGFyZ2V0UmVnaXN0ZXJJbmZvKCktPmlzSW5BbGxvY2F0YWJsZUNsYXNzKFBoeXNSZWcpICYmCisgICAgICAhaXNSZXNlcnZlZChQaHlzUmVnKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBMaXZlSW4gTWFuYWdlbWVudAorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gYWRkTGl2ZUluIC0gQWRkIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgYXMgYSBsaXZlLWluLiAgTm90ZSB0aGF0IGl0CisgIC8vLyBpcyBhbiBlcnJvciB0byBhZGQgdGhlIHNhbWUgcmVnaXN0ZXIgdG8gdGhlIHNhbWUgc2V0IG1vcmUgdGhhbiBvbmNlLgorICB2b2lkIGFkZExpdmVJbih1bnNpZ25lZCBSZWcsIHVuc2lnbmVkIHZyZWcgPSAwKSB7CisgICAgTGl2ZUlucy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoUmVnLCB2cmVnKSk7CisgIH0KKworICAvLyBJdGVyYXRpb24gc3VwcG9ydCBmb3IgdGhlIGxpdmUtaW5zIHNldC4gIEl0J3Mga2VwdCBpbiBzb3J0ZWQgb3JkZXIKKyAgLy8gYnkgcmVnaXN0ZXIgbnVtYmVyLgorICB1c2luZyBsaXZlaW5faXRlcmF0b3IgPQorICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVuc2lnbmVkLHVuc2lnbmVkPj46OmNvbnN0X2l0ZXJhdG9yOworICBsaXZlaW5faXRlcmF0b3IgbGl2ZWluX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gTGl2ZUlucy5iZWdpbigpOyB9CisgIGxpdmVpbl9pdGVyYXRvciBsaXZlaW5fZW5kKCkgICBjb25zdCB7IHJldHVybiBMaXZlSW5zLmVuZCgpOyB9CisgIGJvb2wgICAgICAgICAgICBsaXZlaW5fZW1wdHkoKSBjb25zdCB7IHJldHVybiBMaXZlSW5zLmVtcHR5KCk7IH0KKworICBBcnJheVJlZjxzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPj4gbGl2ZWlucygpIGNvbnN0IHsKKyAgICByZXR1cm4gTGl2ZUluczsKKyAgfQorCisgIGJvb2wgaXNMaXZlSW4odW5zaWduZWQgUmVnKSBjb25zdDsKKworICAvLy8gZ2V0TGl2ZUluUGh5c1JlZyAtIElmIFZSZWcgaXMgYSBsaXZlLWluIHZpcnR1YWwgcmVnaXN0ZXIsIHJldHVybiB0aGUKKyAgLy8vIGNvcnJlc3BvbmRpbmcgbGl2ZS1pbiBwaHlzaWNhbCByZWdpc3Rlci4KKyAgdW5zaWduZWQgZ2V0TGl2ZUluUGh5c1JlZyh1bnNpZ25lZCBWUmVnKSBjb25zdDsKKworICAvLy8gZ2V0TGl2ZUluVmlydFJlZyAtIElmIFBSZWcgaXMgYSBsaXZlLWluIHBoeXNpY2FsIHJlZ2lzdGVyLCByZXR1cm4gdGhlCisgIC8vLyBjb3JyZXNwb25kaW5nIGxpdmUtaW4gcGh5c2ljYWwgcmVnaXN0ZXIuCisgIHVuc2lnbmVkIGdldExpdmVJblZpcnRSZWcodW5zaWduZWQgUFJlZykgY29uc3Q7CisKKyAgLy8vIEVtaXRMaXZlSW5Db3BpZXMgLSBFbWl0IGNvcGllcyB0byBpbml0aWFsaXplIGxpdmVpbiB2aXJ0dWFsIHJlZ2lzdGVycworICAvLy8gaW50byB0aGUgZ2l2ZW4gZW50cnkgYmxvY2suCisgIHZvaWQgRW1pdExpdmVJbkNvcGllcyhNYWNoaW5lQmFzaWNCbG9jayAqRW50cnlNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJKTsKKworICAvLy8gUmV0dXJucyBhIG1hc2sgY292ZXJpbmcgYWxsIGJpdHMgdGhhdCBjYW4gYXBwZWFyIGluIGxhbmUgbWFza3Mgb2YKKyAgLy8vIHN1YnJlZ2lzdGVycyBvZiB0aGUgdmlydHVhbCByZWdpc3RlciBAcCBSZWcuCisgIExhbmVCaXRtYXNrIGdldE1heExhbmVNYXNrRm9yVlJlZyh1bnNpZ25lZCBSZWcpIGNvbnN0OworCisgIC8vLyBkZWZ1c2VjaGFpbl9pdGVyYXRvciAtIFRoaXMgY2xhc3MgcHJvdmlkZXMgaXRlcmF0b3Igc3VwcG9ydCBmb3IgbWFjaGluZQorICAvLy8gb3BlcmFuZHMgaW4gdGhlIGZ1bmN0aW9uIHRoYXQgdXNlIG9yIGRlZmluZSBhIHNwZWNpZmljIHJlZ2lzdGVyLiAgSWYKKyAgLy8vIFJldHVyblVzZXMgaXMgdHJ1ZSBpdCByZXR1cm5zIHVzZXMgb2YgcmVnaXN0ZXJzLCBpZiBSZXR1cm5EZWZzIGlzIHRydWUgaXQKKyAgLy8vIHJldHVybnMgZGVmcy4gIElmIG5laXRoZXIgYXJlIHRydWUgdGhlbiB5b3UgYXJlIHNpbGx5IGFuZCBpdCBhbHdheXMKKyAgLy8vIHJldHVybnMgZW5kKCkuICBJZiBTa2lwRGVidWcgaXMgdHJ1ZSBpdCBza2lwcyB1c2VzIG1hcmtlZCBEZWJ1ZworICAvLy8gd2hlbiBpbmNyZW1lbnRpbmcuCisgIHRlbXBsYXRlPGJvb2wgUmV0dXJuVXNlcywgYm9vbCBSZXR1cm5EZWZzLCBib29sIFNraXBEZWJ1ZywKKyAgICAgICAgICAgYm9vbCBCeU9wZXJhbmQsIGJvb2wgQnlJbnN0ciwgYm9vbCBCeUJ1bmRsZT4KKyAgY2xhc3MgZGVmdXNlY2hhaW5faXRlcmF0b3IKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIE1hY2hpbmVJbnN0ciwgcHRyZGlmZl90PiB7CisgICAgZnJpZW5kIGNsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CisKKyAgICBNYWNoaW5lT3BlcmFuZCAqT3AgPSBudWxscHRyOworCisgICAgZXhwbGljaXQgZGVmdXNlY2hhaW5faXRlcmF0b3IoTWFjaGluZU9wZXJhbmQgKm9wKSA6IE9wKG9wKSB7CisgICAgICAvLyBJZiB0aGUgZmlyc3Qgbm9kZSBpc24ndCBvbmUgd2UncmUgaW50ZXJlc3RlZCBpbiwgYWR2YW5jZSB0byBvbmUgdGhhdAorICAgICAgLy8gd2UgYXJlIGludGVyZXN0ZWQgaW4uCisgICAgICBpZiAob3ApIHsKKyAgICAgICAgaWYgKCghUmV0dXJuVXNlcyAmJiBvcC0+aXNVc2UoKSkgfHwKKyAgICAgICAgICAgICghUmV0dXJuRGVmcyAmJiBvcC0+aXNEZWYoKSkgfHwKKyAgICAgICAgICAgIChTa2lwRGVidWcgJiYgb3AtPmlzRGVidWcoKSkpCisgICAgICAgICAgYWR2YW5jZSgpOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgYWR2YW5jZSgpIHsKKyAgICAgIGFzc2VydChPcCAmJiAiQ2Fubm90IGluY3JlbWVudCBlbmQgaXRlcmF0b3IhIik7CisgICAgICBPcCA9IGdldE5leHRPcGVyYW5kRm9yUmVnKE9wKTsKKworICAgICAgLy8gQWxsIGRlZnMgY29tZSBiZWZvcmUgdGhlIHVzZXMsIHNvIHN0b3AgZGVmX2l0ZXJhdG9yIGVhcmx5LgorICAgICAgaWYgKCFSZXR1cm5Vc2VzKSB7CisgICAgICAgIGlmIChPcCkgeworICAgICAgICAgIGlmIChPcC0+aXNVc2UoKSkKKyAgICAgICAgICAgIE9wID0gbnVsbHB0cjsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBhc3NlcnQoIU9wLT5pc0RlYnVnKCkgJiYgIkNhbid0IGhhdmUgZGVidWcgZGVmcyIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIG9wZXJhbmQgd2UgZG9uJ3QgY2FyZSBhYm91dCwgc2tpcCBpdC4KKyAgICAgICAgd2hpbGUgKE9wICYmICgoIVJldHVybkRlZnMgJiYgT3AtPmlzRGVmKCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgKFNraXBEZWJ1ZyAmJiBPcC0+aXNEZWJ1ZygpKSkpCisgICAgICAgICAgT3AgPSBnZXROZXh0T3BlcmFuZEZvclJlZyhPcCk7CisgICAgICB9CisgICAgfQorCisgIHB1YmxpYzoKKyAgICB1c2luZyByZWZlcmVuY2UgPSBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIsIHB0cmRpZmZfdD46OnJlZmVyZW5jZTsKKyAgICB1c2luZyBwb2ludGVyID0gc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciwgcHRyZGlmZl90Pjo6cG9pbnRlcjsKKworICAgIGRlZnVzZWNoYWluX2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGRlZnVzZWNoYWluX2l0ZXJhdG9yICZ4KSBjb25zdCB7CisgICAgICByZXR1cm4gT3AgPT0geC5PcDsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGRlZnVzZWNoYWluX2l0ZXJhdG9yICZ4KSBjb25zdCB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oeCk7CisgICAgfQorCisgICAgLy8vIGF0RW5kIC0gcmV0dXJuIHRydWUgaWYgdGhpcyBpdGVyYXRvciBpcyBlcXVhbCB0byByZWdfZW5kKCkgb24gdGhlIHZhbHVlLgorICAgIGJvb2wgYXRFbmQoKSBjb25zdCB7IHJldHVybiBPcCA9PSBudWxscHRyOyB9CisKKyAgICAvLyBJdGVyYXRvciB0cmF2ZXJzYWw6IGZvcndhcmQgaXRlcmF0aW9uIG9ubHkKKyAgICBkZWZ1c2VjaGFpbl9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsgICAgICAgICAgLy8gUHJlaW5jcmVtZW50CisgICAgICBhc3NlcnQoT3AgJiYgIkNhbm5vdCBpbmNyZW1lbnQgZW5kIGl0ZXJhdG9yISIpOworICAgICAgaWYgKEJ5T3BlcmFuZCkKKyAgICAgICAgYWR2YW5jZSgpOworICAgICAgZWxzZSBpZiAoQnlJbnN0cikgeworICAgICAgICBNYWNoaW5lSW5zdHIgKlAgPSBPcC0+Z2V0UGFyZW50KCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBhZHZhbmNlKCk7CisgICAgICAgIH0gd2hpbGUgKE9wICYmIE9wLT5nZXRQYXJlbnQoKSA9PSBQKTsKKyAgICAgIH0gZWxzZSBpZiAoQnlCdW5kbGUpIHsKKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Omluc3RyX2l0ZXJhdG9yIFAgPQorICAgICAgICAgICAgZ2V0QnVuZGxlU3RhcnQoT3AtPmdldFBhcmVudCgpLT5nZXRJdGVyYXRvcigpKTsKKyAgICAgICAgZG8geworICAgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgfSB3aGlsZSAoT3AgJiYgZ2V0QnVuZGxlU3RhcnQoT3AtPmdldFBhcmVudCgpLT5nZXRJdGVyYXRvcigpKSA9PSBQKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBkZWZ1c2VjaGFpbl9pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAgICAgICAgLy8gUG9zdGluY3JlbWVudAorICAgICAgZGVmdXNlY2hhaW5faXRlcmF0b3IgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7CisgICAgfQorCisgICAgLy8vIGdldE9wZXJhbmRObyAtIFJldHVybiB0aGUgb3BlcmFuZCAjIG9mIHRoaXMgTWFjaGluZU9wZXJhbmQgaW4gaXRzCisgICAgLy8vIE1hY2hpbmVJbnN0ci4KKyAgICB1bnNpZ25lZCBnZXRPcGVyYW5kTm8oKSBjb25zdCB7CisgICAgICBhc3NlcnQoT3AgJiYgIkNhbm5vdCBkZXJlZmVyZW5jZSBlbmQgaXRlcmF0b3IhIik7CisgICAgICByZXR1cm4gT3AgLSAmT3AtPmdldFBhcmVudCgpLT5nZXRPcGVyYW5kKDApOworICAgIH0KKworICAgIC8vIFJldHJpZXZlIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IG9wZXJhbmQuCisgICAgTWFjaGluZU9wZXJhbmQgJm9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgIGFzc2VydChPcCAmJiAiQ2Fubm90IGRlcmVmZXJlbmNlIGVuZCBpdGVyYXRvciEiKTsKKyAgICAgIHJldHVybiAqT3A7CisgICAgfQorCisgICAgTWFjaGluZU9wZXJhbmQgKm9wZXJhdG9yLT4oKSBjb25zdCB7CisgICAgICBhc3NlcnQoT3AgJiYgIkNhbm5vdCBkZXJlZmVyZW5jZSBlbmQgaXRlcmF0b3IhIik7CisgICAgICByZXR1cm4gT3A7CisgICAgfQorICB9OworCisgIC8vLyBkZWZ1c2VjaGFpbl9pdGVyYXRvciAtIFRoaXMgY2xhc3MgcHJvdmlkZXMgaXRlcmF0b3Igc3VwcG9ydCBmb3IgbWFjaGluZQorICAvLy8gb3BlcmFuZHMgaW4gdGhlIGZ1bmN0aW9uIHRoYXQgdXNlIG9yIGRlZmluZSBhIHNwZWNpZmljIHJlZ2lzdGVyLiAgSWYKKyAgLy8vIFJldHVyblVzZXMgaXMgdHJ1ZSBpdCByZXR1cm5zIHVzZXMgb2YgcmVnaXN0ZXJzLCBpZiBSZXR1cm5EZWZzIGlzIHRydWUgaXQKKyAgLy8vIHJldHVybnMgZGVmcy4gIElmIG5laXRoZXIgYXJlIHRydWUgdGhlbiB5b3UgYXJlIHNpbGx5IGFuZCBpdCBhbHdheXMKKyAgLy8vIHJldHVybnMgZW5kKCkuICBJZiBTa2lwRGVidWcgaXMgdHJ1ZSBpdCBza2lwcyB1c2VzIG1hcmtlZCBEZWJ1ZworICAvLy8gd2hlbiBpbmNyZW1lbnRpbmcuCisgIHRlbXBsYXRlPGJvb2wgUmV0dXJuVXNlcywgYm9vbCBSZXR1cm5EZWZzLCBib29sIFNraXBEZWJ1ZywKKyAgICAgICAgICAgYm9vbCBCeU9wZXJhbmQsIGJvb2wgQnlJbnN0ciwgYm9vbCBCeUJ1bmRsZT4KKyAgY2xhc3MgZGVmdXNlY2hhaW5faW5zdHJfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIE1hY2hpbmVJbnN0ciwgcHRyZGlmZl90PiB7CisgICAgZnJpZW5kIGNsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CisKKyAgICBNYWNoaW5lT3BlcmFuZCAqT3AgPSBudWxscHRyOworCisgICAgZXhwbGljaXQgZGVmdXNlY2hhaW5faW5zdHJfaXRlcmF0b3IoTWFjaGluZU9wZXJhbmQgKm9wKSA6IE9wKG9wKSB7CisgICAgICAvLyBJZiB0aGUgZmlyc3Qgbm9kZSBpc24ndCBvbmUgd2UncmUgaW50ZXJlc3RlZCBpbiwgYWR2YW5jZSB0byBvbmUgdGhhdAorICAgICAgLy8gd2UgYXJlIGludGVyZXN0ZWQgaW4uCisgICAgICBpZiAob3ApIHsKKyAgICAgICAgaWYgKCghUmV0dXJuVXNlcyAmJiBvcC0+aXNVc2UoKSkgfHwKKyAgICAgICAgICAgICghUmV0dXJuRGVmcyAmJiBvcC0+aXNEZWYoKSkgfHwKKyAgICAgICAgICAgIChTa2lwRGVidWcgJiYgb3AtPmlzRGVidWcoKSkpCisgICAgICAgICAgYWR2YW5jZSgpOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgYWR2YW5jZSgpIHsKKyAgICAgIGFzc2VydChPcCAmJiAiQ2Fubm90IGluY3JlbWVudCBlbmQgaXRlcmF0b3IhIik7CisgICAgICBPcCA9IGdldE5leHRPcGVyYW5kRm9yUmVnKE9wKTsKKworICAgICAgLy8gQWxsIGRlZnMgY29tZSBiZWZvcmUgdGhlIHVzZXMsIHNvIHN0b3AgZGVmX2l0ZXJhdG9yIGVhcmx5LgorICAgICAgaWYgKCFSZXR1cm5Vc2VzKSB7CisgICAgICAgIGlmIChPcCkgeworICAgICAgICAgIGlmIChPcC0+aXNVc2UoKSkKKyAgICAgICAgICAgIE9wID0gbnVsbHB0cjsKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICBhc3NlcnQoIU9wLT5pc0RlYnVnKCkgJiYgIkNhbid0IGhhdmUgZGVidWcgZGVmcyIpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBJZiB0aGlzIGlzIGFuIG9wZXJhbmQgd2UgZG9uJ3QgY2FyZSBhYm91dCwgc2tpcCBpdC4KKyAgICAgICAgd2hpbGUgKE9wICYmICgoIVJldHVybkRlZnMgJiYgT3AtPmlzRGVmKCkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgKFNraXBEZWJ1ZyAmJiBPcC0+aXNEZWJ1ZygpKSkpCisgICAgICAgICAgT3AgPSBnZXROZXh0T3BlcmFuZEZvclJlZyhPcCk7CisgICAgICB9CisgICAgfQorCisgIHB1YmxpYzoKKyAgICB1c2luZyByZWZlcmVuY2UgPSBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIsIHB0cmRpZmZfdD46OnJlZmVyZW5jZTsKKyAgICB1c2luZyBwb2ludGVyID0gc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciwgcHRyZGlmZl90Pjo6cG9pbnRlcjsKKworICAgIGRlZnVzZWNoYWluX2luc3RyX2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGRlZnVzZWNoYWluX2luc3RyX2l0ZXJhdG9yICZ4KSBjb25zdCB7CisgICAgICByZXR1cm4gT3AgPT0geC5PcDsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGRlZnVzZWNoYWluX2luc3RyX2l0ZXJhdG9yICZ4KSBjb25zdCB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oeCk7CisgICAgfQorCisgICAgLy8vIGF0RW5kIC0gcmV0dXJuIHRydWUgaWYgdGhpcyBpdGVyYXRvciBpcyBlcXVhbCB0byByZWdfZW5kKCkgb24gdGhlIHZhbHVlLgorICAgIGJvb2wgYXRFbmQoKSBjb25zdCB7IHJldHVybiBPcCA9PSBudWxscHRyOyB9CisKKyAgICAvLyBJdGVyYXRvciB0cmF2ZXJzYWw6IGZvcndhcmQgaXRlcmF0aW9uIG9ubHkKKyAgICBkZWZ1c2VjaGFpbl9pbnN0cl9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsgICAgICAgICAgLy8gUHJlaW5jcmVtZW50CisgICAgICBhc3NlcnQoT3AgJiYgIkNhbm5vdCBpbmNyZW1lbnQgZW5kIGl0ZXJhdG9yISIpOworICAgICAgaWYgKEJ5T3BlcmFuZCkKKyAgICAgICAgYWR2YW5jZSgpOworICAgICAgZWxzZSBpZiAoQnlJbnN0cikgeworICAgICAgICBNYWNoaW5lSW5zdHIgKlAgPSBPcC0+Z2V0UGFyZW50KCk7CisgICAgICAgIGRvIHsKKyAgICAgICAgICBhZHZhbmNlKCk7CisgICAgICAgIH0gd2hpbGUgKE9wICYmIE9wLT5nZXRQYXJlbnQoKSA9PSBQKTsKKyAgICAgIH0gZWxzZSBpZiAoQnlCdW5kbGUpIHsKKyAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Omluc3RyX2l0ZXJhdG9yIFAgPQorICAgICAgICAgICAgZ2V0QnVuZGxlU3RhcnQoT3AtPmdldFBhcmVudCgpLT5nZXRJdGVyYXRvcigpKTsKKyAgICAgICAgZG8geworICAgICAgICAgIGFkdmFuY2UoKTsKKyAgICAgICAgfSB3aGlsZSAoT3AgJiYgZ2V0QnVuZGxlU3RhcnQoT3AtPmdldFBhcmVudCgpLT5nZXRJdGVyYXRvcigpKSA9PSBQKTsKKyAgICAgIH0KKworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBkZWZ1c2VjaGFpbl9pbnN0cl9pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAgICAgICAgLy8gUG9zdGluY3JlbWVudAorICAgICAgZGVmdXNlY2hhaW5faW5zdHJfaXRlcmF0b3IgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7CisgICAgfQorCisgICAgLy8gUmV0cmlldmUgYSByZWZlcmVuY2UgdG8gdGhlIGN1cnJlbnQgb3BlcmFuZC4KKyAgICBNYWNoaW5lSW5zdHIgJm9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgIGFzc2VydChPcCAmJiAiQ2Fubm90IGRlcmVmZXJlbmNlIGVuZCBpdGVyYXRvciEiKTsKKyAgICAgIGlmIChCeUJ1bmRsZSkKKyAgICAgICAgcmV0dXJuICpnZXRCdW5kbGVTdGFydChPcC0+Z2V0UGFyZW50KCktPmdldEl0ZXJhdG9yKCkpOworICAgICAgcmV0dXJuICpPcC0+Z2V0UGFyZW50KCk7CisgICAgfQorCisgICAgTWFjaGluZUluc3RyICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJm9wZXJhdG9yKigpOyB9CisgIH07Cit9OworCisvLy8gSXRlcmF0ZSBvdmVyIHRoZSBwcmVzc3VyZSBzZXRzIGFmZmVjdGVkIGJ5IHRoZSBnaXZlbiBwaHlzaWNhbCBvciB2aXJ0dWFsCisvLy8gcmVnaXN0ZXIuIElmIFJlZyBpcyBwaHlzaWNhbCwgaXQgbXVzdCBiZSBhIHJlZ2lzdGVyIHVuaXQgKGZyb20KKy8vLyBNQ1JlZ1VuaXRJdGVyYXRvcikuCitjbGFzcyBQU2V0SXRlcmF0b3IgeworICBjb25zdCBpbnQgKlBTZXQgPSBudWxscHRyOworICB1bnNpZ25lZCBXZWlnaHQgPSAwOworCitwdWJsaWM6CisgIFBTZXRJdGVyYXRvcigpID0gZGVmYXVsdDsKKworICBQU2V0SXRlcmF0b3IodW5zaWduZWQgUmVnVW5pdCwgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJKSB7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBNUkktPmdldFRhcmdldFJlZ2lzdGVySW5mbygpOworICAgIGlmIChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKFJlZ1VuaXQpKSB7CisgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyA9IE1SSS0+Z2V0UmVnQ2xhc3MoUmVnVW5pdCk7CisgICAgICBQU2V0ID0gVFJJLT5nZXRSZWdDbGFzc1ByZXNzdXJlU2V0cyhSQyk7CisgICAgICBXZWlnaHQgPSBUUkktPmdldFJlZ0NsYXNzV2VpZ2h0KFJDKS5SZWdXZWlnaHQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgUFNldCA9IFRSSS0+Z2V0UmVnVW5pdFByZXNzdXJlU2V0cyhSZWdVbml0KTsKKyAgICAgIFdlaWdodCA9IFRSSS0+Z2V0UmVnVW5pdFdlaWdodChSZWdVbml0KTsKKyAgICB9CisgICAgaWYgKCpQU2V0ID09IC0xKQorICAgICAgUFNldCA9IG51bGxwdHI7CisgIH0KKworICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBQU2V0OyB9CisKKyAgdW5zaWduZWQgZ2V0V2VpZ2h0KCkgY29uc3QgeyByZXR1cm4gV2VpZ2h0OyB9CisKKyAgdW5zaWduZWQgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKlBTZXQ7IH0KKworICB2b2lkIG9wZXJhdG9yKysoKSB7CisgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiSW52YWxpZCBQU2V0SXRlcmF0b3IuIik7CisgICAgKytQU2V0OworICAgIGlmICgqUFNldCA9PSAtMSkKKyAgICAgIFBTZXQgPSBudWxscHRyOworICB9Cit9OworCitpbmxpbmUgUFNldEl0ZXJhdG9yIE1hY2hpbmVSZWdpc3RlckluZm86OgorZ2V0UHJlc3N1cmVTZXRzKHVuc2lnbmVkIFJlZ1VuaXQpIGNvbnN0IHsKKyAgcmV0dXJuIFBTZXRJdGVyYXRvcihSZWdVbml0LCB0aGlzKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9NQUNISU5FUkVHSVNURVJJTkZPX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lU1NBVXBkYXRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVTU0FVcGRhdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVlYTIwOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lU1NBVXBkYXRlci5oCkBAIC0wLDAgKzEsMTEzIEBACisvLz09PS0gTWFjaGluZVNTQVVwZGF0ZXIuaCAtIFVuc3RydWN0dXJlZCBTU0EgVXBkYXRlIFRvb2wgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgTWFjaGluZVNTQVVwZGF0ZXIgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORVNTQVVQREFURVJfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fTUFDSElORVNTQVVQREFURVJfSAorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgTWFjaGluZU9wZXJhbmQ7CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJDbGFzczsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFNTQVVwZGF0ZXJUcmFpdHM7CisKKy8vLyBNYWNoaW5lU1NBVXBkYXRlciAtIFRoaXMgY2xhc3MgdXBkYXRlcyBTU0EgZm9ybSBmb3IgYSBzZXQgb2YgdmlydHVhbAorLy8vIHJlZ2lzdGVycyBkZWZpbmVkIGluIG11bHRpcGxlIGJsb2Nrcy4gIFRoaXMgaXMgdXNlZCB3aGVuIGNvZGUgZHVwbGljYXRpb24KKy8vLyBvciBhbm90aGVyIHVuc3RydWN0dXJlZCB0cmFuc2Zvcm1hdGlvbiB3YW50cyB0byByZXdyaXRlIGEgc2V0IG9mIHVzZXMgb2Ygb25lCisvLy8gdnJlZyB3aXRoIHVzZXMgb2YgYSBzZXQgb2YgdnJlZ3MuCitjbGFzcyBNYWNoaW5lU1NBVXBkYXRlciB7CisgIGZyaWVuZCBjbGFzcyBTU0FVcGRhdGVyVHJhaXRzPE1hY2hpbmVTU0FVcGRhdGVyPjsKKworcHJpdmF0ZToKKyAgLy8vIEF2YWlsYWJsZVZhbHMgLSBUaGlzIGtlZXBzIHRyYWNrIG9mIHdoaWNoIHZhbHVlIHRvIHVzZSBvbiBhIHBlci1ibG9jaworICAvLy8gYmFzaXMuICBXaGVuIHdlIGluc2VydCBQSEkgbm9kZXMsIHdlIGtlZXAgdHJhY2sgb2YgdGhlbSBoZXJlLgorICAvL3R5cGVkZWYgRGVuc2VNYXA8TWFjaGluZUJhc2ljQmxvY2sqLCB1bnNpZ25lZCA+IEF2YWlsYWJsZVZhbHNUeTsKKyAgdm9pZCAqQVYgPSBudWxscHRyOworCisgIC8vLyBWUiAtIEN1cnJlbnQgdmlydHVhbCByZWdpc3RlciB3aG9zZSB1c2VzIGFyZSBiZWluZyB1cGRhdGVkLgorICB1bnNpZ25lZCBWUjsKKworICAvLy8gVlJDIC0gUmVnaXN0ZXIgY2xhc3Mgb2YgdGhlIGN1cnJlbnQgdmlydHVhbCByZWdpc3Rlci4KKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqVlJDOworCisgIC8vLyBJbnNlcnRlZFBISXMgLSBJZiB0aGlzIGlzIG5vbi1udWxsLCB0aGUgTWFjaGluZVNTQVVwZGF0ZXIgYWRkcyBhbGwgUEhJCisgIC8vLyBub2RlcyB0aGF0IGl0IGNyZWF0ZXMgdG8gdGhlIHZlY3Rvci4KKyAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0cio+ICpJbnNlcnRlZFBISXM7CisKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUk7CisgIE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSTsKKworcHVibGljOgorICAvLy8gTWFjaGluZVNTQVVwZGF0ZXIgY29uc3RydWN0b3IuICBJZiBJbnNlcnRlZFBISXMgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIGJlCisgIC8vLyBmaWxsZWQgaW4gd2l0aCBhbGwgUEhJIE5vZGVzIGNyZWF0ZWQgYnkgcmV3cml0aW5nLgorICBleHBsaWNpdCBNYWNoaW5lU1NBVXBkYXRlcihNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0cio+ICpJbnNlcnRlZFBISXMgPSBudWxscHRyKTsKKyAgTWFjaGluZVNTQVVwZGF0ZXIoY29uc3QgTWFjaGluZVNTQVVwZGF0ZXIgJikgPSBkZWxldGU7CisgIE1hY2hpbmVTU0FVcGRhdGVyICZvcGVyYXRvcj0oY29uc3QgTWFjaGluZVNTQVVwZGF0ZXIgJikgPSBkZWxldGU7CisgIH5NYWNoaW5lU1NBVXBkYXRlcigpOworCisgIC8vLyBJbml0aWFsaXplIC0gUmVzZXQgdGhpcyBvYmplY3QgdG8gZ2V0IHJlYWR5IGZvciBhIG5ldyBzZXQgb2YgU1NBCisgIC8vLyB1cGRhdGVzLgorICB2b2lkIEluaXRpYWxpemUodW5zaWduZWQgVik7CisKKyAgLy8vIEFkZEF2YWlsYWJsZVZhbHVlIC0gSW5kaWNhdGUgdGhhdCBhIHJld3JpdHRlbiB2YWx1ZSBpcyBhdmFpbGFibGUgYXQgdGhlCisgIC8vLyBlbmQgb2YgdGhlIHNwZWNpZmllZCBibG9jayB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUuCisgIHZvaWQgQWRkQXZhaWxhYmxlVmFsdWUoTWFjaGluZUJhc2ljQmxvY2sgKkJCLCB1bnNpZ25lZCBWKTsKKworICAvLy8gSGFzVmFsdWVGb3JCbG9jayAtIFJldHVybiB0cnVlIGlmIHRoZSBNYWNoaW5lU1NBVXBkYXRlciBhbHJlYWR5IGhhcyBhCisgIC8vLyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBibG9jay4KKyAgYm9vbCBIYXNWYWx1ZUZvckJsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpCQikgY29uc3Q7CisKKyAgLy8vIEdldFZhbHVlQXRFbmRPZkJsb2NrIC0gQ29uc3RydWN0IFNTQSBmb3JtLCBtYXRlcmlhbGl6aW5nIGEgdmFsdWUgdGhhdCBpcworICAvLy8gbGl2ZSBhdCB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2suCisgIHVuc2lnbmVkIEdldFZhbHVlQXRFbmRPZkJsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpCQik7CisKKyAgLy8vIEdldFZhbHVlSW5NaWRkbGVPZkJsb2NrIC0gQ29uc3RydWN0IFNTQSBmb3JtLCBtYXRlcmlhbGl6aW5nIGEgdmFsdWUgdGhhdAorICAvLy8gaXMgbGl2ZSBpbiB0aGUgbWlkZGxlIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2suCisgIC8vLworICAvLy8gR2V0VmFsdWVJbk1pZGRsZU9mQmxvY2sgaXMgdGhlIHNhbWUgYXMgR2V0VmFsdWVBdEVuZE9mQmxvY2sgZXhjZXB0IGluIG9uZQorICAvLy8gaW1wb3J0YW50IGNhc2U6IGlmIHRoZXJlIGlzIGEgZGVmaW5pdGlvbiBvZiB0aGUgcmV3cml0dGVuIHZhbHVlIGFmdGVyIHRoZQorICAvLy8gJ3VzZScgaW4gQkIuICBDb25zaWRlciBjb2RlIGxpa2UgdGhpczoKKyAgLy8vCisgIC8vLyAgICAgIFgxID0gLi4uCisgIC8vLyAgIFNvbWVCQjoKKyAgLy8vICAgICAgdXNlKFgpCisgIC8vLyAgICAgIFgyID0gLi4uCisgIC8vLyAgICAgIGJyIENvbmQsIFNvbWVCQiwgT3V0QkIKKyAgLy8vCisgIC8vLyBJbiB0aGlzIGNhc2UsIHRoZXJlIGFyZSB0d28gdmFsdWVzIChYMSBhbmQgWDIpIGFkZGVkIHRvIHRoZSBBdmFpbGFibGVWYWxzCisgIC8vLyBzZXQgYnkgdGhlIGNsaWVudCBvZiB0aGUgcmV3cml0ZXIsIGFuZCB0aG9zZSB2YWx1ZXMgYXJlIGJvdGggbGl2ZSBvdXQgb2YKKyAgLy8vIHRoZWlyIHJlc3BlY3RpdmUgYmxvY2tzLiAgSG93ZXZlciwgdGhlIHVzZSBvZiBYIGhhcHBlbnMgaW4gdGhlICptaWRkbGUqIG9mCisgIC8vLyBhIGJsb2NrLiAgQmVjYXVzZSBvZiB0aGlzLCB3ZSBuZWVkIHRvIGluc2VydCBhIG5ldyBQSEkgbm9kZSBpbiBTb21lQkIgdG8KKyAgLy8vIG1lcmdlIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMsIGFuZCB0aGlzIHZhbHVlIGlzbid0IGxpdmUgb3V0IG9mIHRoZSBibG9jay4KKyAgdW5zaWduZWQgR2V0VmFsdWVJbk1pZGRsZU9mQmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKkJCKTsKKworICAvLy8gUmV3cml0ZVVzZSAtIFJld3JpdGUgYSB1c2Ugb2YgdGhlIHN5bWJvbGljIHZhbHVlLiAgVGhpcyBoYW5kbGVzIFBISSBub2RlcywKKyAgLy8vIHdoaWNoIHVzZSB0aGVpciB2YWx1ZSBpbiB0aGUgY29ycmVzcG9uZGluZyBwcmVkZWNlc3Nvci4gIE5vdGUgdGhhdCB0aGlzCisgIC8vLyB3aWxsIG5vdCB3b3JrIGlmIHRoZSB1c2UgaXMgc3VwcG9zZWQgdG8gYmUgcmV3cml0dGVuIHRvIGEgdmFsdWUgZGVmaW5lZCBpbgorICAvLy8gdGhlIHNhbWUgYmxvY2sgYXMgdGhlIHVzZSwgYnV0IGFib3ZlIGl0LiAgQW55ICdBZGRBdmFpbGFibGVWYWx1ZSdzIGFkZGVkCisgIC8vLyBmb3IgdGhlIHVzZSdzIGJsb2NrIHdpbGwgYmUgY29uc2lkZXJlZCB0byBiZSBiZWxvdyBpdC4KKyAgdm9pZCBSZXdyaXRlVXNlKE1hY2hpbmVPcGVyYW5kICZVKTsKKworcHJpdmF0ZToKKyAgdW5zaWduZWQgR2V0VmFsdWVBdEVuZE9mQmxvY2tJbnRlcm5hbChNYWNoaW5lQmFzaWNCbG9jayAqQkIpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9NQUNISU5FU1NBVVBEQVRFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjaGluZVNjaGVkdWxlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVTY2hlZHVsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMzI3ODgxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVTY2hlZHVsZXIuaApAQCAtMCwwICsxLDEwNTYgQEAKKy8vPT09LSBNYWNoaW5lU2NoZWR1bGVyLmggLSBNYWNoaW5lSW5zdHIgU2NoZWR1bGluZyBQYXNzIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgY3VzdG9taXppbmcgdGhlIHN0YW5kYXJkIE1hY2hpbmVTY2hlZHVsZXIKKy8vIHBhc3MuIE5vdGUgdGhhdCB0aGUgZW50aXJlIHBhc3MgbWF5IGJlIHJlcGxhY2VkIGFzIGZvbGxvd3M6CisvLworLy8gPFRhcmdldD5UYXJnZXRNYWNoaW5lOjpjcmVhdGVQYXNzQ29uZmlnKFBhc3NNYW5hZ2VyQmFzZSAmUE0pIHsKKy8vICAgUE0uc3Vic3RpdHV0ZVBhc3MoJk1hY2hpbmVTY2hlZHVsZXJJRCwgJkN1c3RvbVNjaGVkdWxlclBhc3NJRCk7CisvLyAgIC4uLn0KKy8vCisvLyBUaGUgTWFjaGluZVNjaGVkdWxlciBwYXNzIGlzIG9ubHkgcmVzcG9uc2libGUgZm9yIGNob29zaW5nIHRoZSByZWdpb25zIHRvIGJlCisvLyBzY2hlZHVsZWQuIFRhcmdldHMgY2FuIG92ZXJyaWRlIHRoZSBEQUcgYnVpbGRlciBhbmQgc2NoZWR1bGVyIHdpdGhvdXQKKy8vIHJlcGxhY2luZyB0aGUgcGFzcyBhcyBmb2xsb3dzOgorLy8KKy8vIFNjaGVkdWxlREFHSW5zdHJzICo8VGFyZ2V0PlBhc3NDb25maWc6OgorLy8gY3JlYXRlTWFjaGluZVNjaGVkdWxlcihNYWNoaW5lU2NoZWRDb250ZXh0ICpDKSB7CisvLyAgIHJldHVybiBuZXcgQ3VzdG9tTWFjaGluZVNjaGVkdWxlcihDKTsKKy8vIH0KKy8vCisvLyBUaGUgZGVmYXVsdCBzY2hlZHVsZXIsIFNjaGVkdWxlREFHTUlMaXZlLCBidWlsZHMgdGhlIERBRyBhbmQgZHJpdmVzIGxpc3QKKy8vIHNjaGVkdWxpbmcgd2hpbGUgdXBkYXRpbmcgdGhlIGluc3RydWN0aW9uIHN0cmVhbSwgcmVnaXN0ZXIgcHJlc3N1cmUsIGFuZCBsaXZlCisvLyBpbnRlcnZhbHMuIE1vc3QgdGFyZ2V0cyBkb24ndCBuZWVkIHRvIG92ZXJyaWRlIHRoZSBEQUcgYnVpbGRlciBhbmQgbGlzdAorLy8gc2NoZWR1bGVyLCBidXQgc3VidGFyZ2V0cyB0aGF0IHJlcXVpcmUgY3VzdG9tIHNjaGVkdWxpbmcgaGV1cmlzdGljcyBtYXkKKy8vIHBsdWdpbiBhbiBhbHRlcm5hdGUgTWFjaGluZVNjaGVkU3RyYXRlZ3kuIFRoZSBzdHJhdGVneSBpcyByZXNwb25zaWJsZSBmb3IKKy8vIHNlbGVjdGluZyB0aGUgaGlnaGVzdCBwcmlvcml0eSBub2RlIGZyb20gdGhlIGxpc3Q6CisvLworLy8gU2NoZWR1bGVEQUdJbnN0cnMgKjxUYXJnZXQ+UGFzc0NvbmZpZzo6CisvLyBjcmVhdGVNYWNoaW5lU2NoZWR1bGVyKE1hY2hpbmVTY2hlZENvbnRleHQgKkMpIHsKKy8vICAgcmV0dXJuIG5ldyBTY2hlZHVsZURBR01JTGl2ZShDLCBDdXN0b21TdHJhdGVneShDKSk7CisvLyB9CisvLworLy8gVGhlIERBRyBidWlsZGVyIGNhbiBhbHNvIGJlIGN1c3RvbWl6ZWQgaW4gYSBzZW5zZSBieSBhZGRpbmcgREFHIG11dGF0aW9ucworLy8gdGhhdCB3aWxsIHJ1biBhZnRlciBEQUcgYnVpbGRpbmcgYW5kIGJlZm9yZSBsaXN0IHNjaGVkdWxpbmcuIERBRyBtdXRhdGlvbnMKKy8vIGNhbiBhZGp1c3QgZGVwZW5kZW5jaWVzIGJhc2VkIG9uIHRhcmdldC1zcGVjaWZpYyBrbm93bGVkZ2Ugb3IgYWRkIHdlYWsgZWRnZXMKKy8vIHRvIGFpZCBoZXVyaXN0aWNzOgorLy8KKy8vIFNjaGVkdWxlREFHSW5zdHJzICo8VGFyZ2V0PlBhc3NDb25maWc6OgorLy8gY3JlYXRlTWFjaGluZVNjaGVkdWxlcihNYWNoaW5lU2NoZWRDb250ZXh0ICpDKSB7CisvLyAgIFNjaGVkdWxlREFHTUkgKkRBRyA9IGNyZWF0ZUdlbmVyaWNTY2hlZExpdmUoQyk7CisvLyAgIERBRy0+YWRkTXV0YXRpb24obmV3IEN1c3RvbURBR011dGF0aW9uKC4uLikpOworLy8gICByZXR1cm4gREFHOworLy8gfQorLy8KKy8vIEEgdGFyZ2V0IHRoYXQgc3VwcG9ydHMgYWx0ZXJuYXRpdmUgc2NoZWR1bGVycyBjYW4gdXNlIHRoZQorLy8gTWFjaGluZVNjaGVkUmVnaXN0cnkgdG8gYWxsb3cgY29tbWFuZCBsaW5lIHNlbGVjdGlvbi4gVGhpcyBjYW4gYmUgZG9uZSBieQorLy8gaW1wbGVtZW50aW5nIHRoZSBmb2xsb3dpbmcgYm9pbGVycGxhdGU6CisvLworLy8gc3RhdGljIFNjaGVkdWxlREFHSW5zdHJzICpjcmVhdGVDdXN0b21NYWNoaW5lU2NoZWQoTWFjaGluZVNjaGVkQ29udGV4dCAqQykgeworLy8gIHJldHVybiBuZXcgQ3VzdG9tTWFjaGluZVNjaGVkdWxlcihDKTsKKy8vIH0KKy8vIHN0YXRpYyBNYWNoaW5lU2NoZWRSZWdpc3RyeQorLy8gU2NoZWRDdXN0b21SZWdpc3RyeSgiY3VzdG9tIiwgIlJ1biBteSB0YXJnZXQncyBjdXN0b20gc2NoZWR1bGVyIiwKKy8vICAgICAgICAgICAgICAgICAgICAgY3JlYXRlQ3VzdG9tTWFjaGluZVNjaGVkKTsKKy8vCisvLworLy8gRmluYWxseSwgc3VidGFyZ2V0cyB0aGF0IGRvbid0IG5lZWQgdG8gaW1wbGVtZW50IGN1c3RvbSBoZXVyaXN0aWNzIGJ1dCB3b3VsZAorLy8gbGlrZSB0byBjb25maWd1cmUgdGhlIEdlbmVyaWNTY2hlZHVsZXIncyBwb2xpY3kgZm9yIGEgZ2l2ZW4gc2NoZWR1bGVyIHJlZ2lvbiwKKy8vIGluY2x1ZGluZyBzY2hlZHVsaW5nIGRpcmVjdGlvbiBhbmQgcmVnaXN0ZXIgcHJlc3N1cmUgdHJhY2tpbmcgcG9saWN5LCBjYW4gZG8KKy8vIHRoaXM6CisvLworLy8gdm9pZCA8U3ViVGFyZ2V0PlN1YnRhcmdldDo6CisvLyBvdmVycmlkZVNjaGVkUG9saWN5KE1hY2hpbmVTY2hlZFBvbGljeSAmUG9saWN5LAorLy8gICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1SZWdpb25JbnN0cnMpIGNvbnN0IHsKKy8vICAgUG9saWN5LjxGbGFnPiA9IHRydWU7CisvLyB9CisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORVNDSEVEVUxFUl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FU0NIRURVTEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUGFzc1JlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1JlZ2lzdGVyUHJlc3N1cmUuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUcuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUdJbnN0cnMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUdNdXRhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRTY2hlZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworZXh0ZXJuIGNsOjpvcHQ8Ym9vbD4gRm9yY2VUb3BEb3duOworZXh0ZXJuIGNsOjpvcHQ8Ym9vbD4gRm9yY2VCb3R0b21VcDsKKworY2xhc3MgTGl2ZUludGVydmFsczsKK2NsYXNzIE1hY2hpbmVEb21pbmF0b3JUcmVlOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgTWFjaGluZUxvb3BJbmZvOworY2xhc3MgUmVnaXN0ZXJDbGFzc0luZm87CitjbGFzcyBTY2hlZERGU1Jlc3VsdDsKK2NsYXNzIFNjaGVkdWxlSGF6YXJkUmVjb2duaXplcjsKK2NsYXNzIFRhcmdldEluc3RySW5mbzsKK2NsYXNzIFRhcmdldFBhc3NDb25maWc7CitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CisKKy8vLyBNYWNoaW5lU2NoZWRDb250ZXh0IHByb3ZpZGVzIGVub3VnaCBjb250ZXh0IGZyb20gdGhlIE1hY2hpbmVTY2hlZHVsZXIgcGFzcworLy8vIGZvciB0aGUgdGFyZ2V0IHRvIGluc3RhbnRpYXRlIGEgc2NoZWR1bGVyLgorc3RydWN0IE1hY2hpbmVTY2hlZENvbnRleHQgeworICBNYWNoaW5lRnVuY3Rpb24gKk1GID0gbnVsbHB0cjsKKyAgY29uc3QgTWFjaGluZUxvb3BJbmZvICpNTEkgPSBudWxscHRyOworICBjb25zdCBNYWNoaW5lRG9taW5hdG9yVHJlZSAqTURUID0gbnVsbHB0cjsKKyAgY29uc3QgVGFyZ2V0UGFzc0NvbmZpZyAqUGFzc0NvbmZpZyA9IG51bGxwdHI7CisgIEFsaWFzQW5hbHlzaXMgKkFBID0gbnVsbHB0cjsKKyAgTGl2ZUludGVydmFscyAqTElTID0gbnVsbHB0cjsKKworICBSZWdpc3RlckNsYXNzSW5mbyAqUmVnQ2xhc3NJbmZvOworCisgIE1hY2hpbmVTY2hlZENvbnRleHQoKTsKKyAgdmlydHVhbCB+TWFjaGluZVNjaGVkQ29udGV4dCgpOworfTsKKworLy8vIE1hY2hpbmVTY2hlZFJlZ2lzdHJ5IHByb3ZpZGVzIGEgc2VsZWN0aW9uIG9mIGF2YWlsYWJsZSBtYWNoaW5lIGluc3RydWN0aW9uCisvLy8gc2NoZWR1bGVycy4KK2NsYXNzIE1hY2hpbmVTY2hlZFJlZ2lzdHJ5IDogcHVibGljIE1hY2hpbmVQYXNzUmVnaXN0cnlOb2RlIHsKK3B1YmxpYzoKKyAgdXNpbmcgU2NoZWR1bGVEQUdDdG9yID0gU2NoZWR1bGVEQUdJbnN0cnMgKigqKShNYWNoaW5lU2NoZWRDb250ZXh0ICopOworCisgIC8vIFJlZ2lzdGVyUGFzc1BhcnNlciByZXF1aXJlcyBhIChtaXNuYW1lZCkgRnVuY3Rpb25QYXNzQ3RvciB0eXBlLgorICB1c2luZyBGdW5jdGlvblBhc3NDdG9yID0gU2NoZWR1bGVEQUdDdG9yOworCisgIHN0YXRpYyBNYWNoaW5lUGFzc1JlZ2lzdHJ5IFJlZ2lzdHJ5OworCisgIE1hY2hpbmVTY2hlZFJlZ2lzdHJ5KGNvbnN0IGNoYXIgKk4sIGNvbnN0IGNoYXIgKkQsIFNjaGVkdWxlREFHQ3RvciBDKQorICAgIDogTWFjaGluZVBhc3NSZWdpc3RyeU5vZGUoTiwgRCwgKE1hY2hpbmVQYXNzQ3RvcilDKSB7CisgICAgUmVnaXN0cnkuQWRkKHRoaXMpOworICB9CisKKyAgfk1hY2hpbmVTY2hlZFJlZ2lzdHJ5KCkgeyBSZWdpc3RyeS5SZW1vdmUodGhpcyk7IH0KKworICAvLyBBY2Nlc3NvcnMuCisgIC8vCisgIE1hY2hpbmVTY2hlZFJlZ2lzdHJ5ICpnZXROZXh0KCkgY29uc3QgeworICAgIHJldHVybiAoTWFjaGluZVNjaGVkUmVnaXN0cnkgKilNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZTo6Z2V0TmV4dCgpOworICB9CisKKyAgc3RhdGljIE1hY2hpbmVTY2hlZFJlZ2lzdHJ5ICpnZXRMaXN0KCkgeworICAgIHJldHVybiAoTWFjaGluZVNjaGVkUmVnaXN0cnkgKilSZWdpc3RyeS5nZXRMaXN0KCk7CisgIH0KKworICBzdGF0aWMgdm9pZCBzZXRMaXN0ZW5lcihNYWNoaW5lUGFzc1JlZ2lzdHJ5TGlzdGVuZXIgKkwpIHsKKyAgICBSZWdpc3RyeS5zZXRMaXN0ZW5lcihMKTsKKyAgfQorfTsKKworY2xhc3MgU2NoZWR1bGVEQUdNSTsKKworLy8vIERlZmluZSBhIGdlbmVyaWMgc2NoZWR1bGluZyBwb2xpY3kgZm9yIHRhcmdldHMgdGhhdCBkb24ndCBwcm92aWRlIHRoZWlyIG93bgorLy8vIE1hY2hpbmVTY2hlZFN0cmF0ZWd5LiBUaGlzIGNhbiBiZSBvdmVycmlkZW4gZm9yIGVhY2ggc2NoZWR1bGluZyByZWdpb24KKy8vLyBiZWZvcmUgYnVpbGRpbmcgdGhlIERBRy4KK3N0cnVjdCBNYWNoaW5lU2NoZWRQb2xpY3kgeworICAvLyBBbGxvdyB0aGUgc2NoZWR1bGVyIHRvIGRpc2FibGUgcmVnaXN0ZXIgcHJlc3N1cmUgdHJhY2tpbmcuCisgIGJvb2wgU2hvdWxkVHJhY2tQcmVzc3VyZSA9IGZhbHNlOworICAvLy8gVHJhY2sgTGFuZU1hc2tzIHRvIGFsbG93IHJlb3JkZXJpbmcgb2YgaW5kZXBlbmRlbnQgc3VicmVnaXN0ZXIgd3JpdGVzCisgIC8vLyBvZiB0aGUgc2FtZSB2cmVnLiBcc2EgTWFjaGluZVNjaGVkU3RyYXRlZ3k6OnNob3VsZFRyYWNrTGFuZU1hc2tzKCkKKyAgYm9vbCBTaG91bGRUcmFja0xhbmVNYXNrcyA9IGZhbHNlOworCisgIC8vIEFsbG93IHRoZSBzY2hlZHVsZXIgdG8gZm9yY2UgdG9wLWRvd24gb3IgYm90dG9tLXVwIHNjaGVkdWxpbmcuIElmIG5laXRoZXIKKyAgLy8gaXMgdHJ1ZSwgdGhlIHNjaGVkdWxlciBydW5zIGluIGJvdGggZGlyZWN0aW9ucyBhbmQgY29udmVyZ2VzLgorICBib29sIE9ubHlUb3BEb3duID0gZmFsc2U7CisgIGJvb2wgT25seUJvdHRvbVVwID0gZmFsc2U7CisKKyAgLy8gRGlzYWJsZSBoZXVyaXN0aWMgdGhhdCB0cmllcyB0byBmZXRjaCBub2RlcyBmcm9tIGxvbmcgZGVwZW5kZW5jeSBjaGFpbnMKKyAgLy8gZmlyc3QuCisgIGJvb2wgRGlzYWJsZUxhdGVuY3lIZXVyaXN0aWMgPSBmYWxzZTsKKworICBNYWNoaW5lU2NoZWRQb2xpY3koKSA9IGRlZmF1bHQ7Cit9OworCisvLy8gTWFjaGluZVNjaGVkU3RyYXRlZ3kgLSBJbnRlcmZhY2UgdG8gdGhlIHNjaGVkdWxpbmcgYWxnb3JpdGhtIHVzZWQgYnkKKy8vLyBTY2hlZHVsZURBR01JLgorLy8vCisvLy8gSW5pdGlhbGl6YXRpb24gc2VxdWVuY2U6CisvLy8gICBpbml0UG9saWN5IC0+IHNob3VsZFRyYWNrUHJlc3N1cmUgLT4gaW5pdGlhbGl6ZShEQUcpIC0+IHJlZ2lzdGVyUm9vdHMKK2NsYXNzIE1hY2hpbmVTY2hlZFN0cmF0ZWd5IHsKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwdWJsaWM6CisgIHZpcnR1YWwgfk1hY2hpbmVTY2hlZFN0cmF0ZWd5KCkgPSBkZWZhdWx0OworCisgIC8vLyBPcHRpb25hbGx5IG92ZXJyaWRlIHRoZSBwZXItcmVnaW9uIHNjaGVkdWxpbmcgcG9saWN5LgorICB2aXJ0dWFsIHZvaWQgaW5pdFBvbGljeShNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVJlZ2lvbkluc3Rycykge30KKworICB2aXJ0dWFsIHZvaWQgZHVtcFBvbGljeSgpIGNvbnN0IHt9CisKKyAgLy8vIENoZWNrIGlmIHByZXNzdXJlIHRyYWNraW5nIGlzIG5lZWRlZCBiZWZvcmUgYnVpbGRpbmcgdGhlIERBRyBhbmQKKyAgLy8vIGluaXRpYWxpemluZyB0aGlzIHN0cmF0ZWd5LiBDYWxsZWQgYWZ0ZXIgaW5pdFBvbGljeS4KKyAgdmlydHVhbCBib29sIHNob3VsZFRyYWNrUHJlc3N1cmUoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBsYW5lbWFza3Mgc2hvdWxkIGJlIHRyYWNrZWQuIExhbmVNYXNrIHRyYWNraW5nIGlzCisgIC8vLyBuZWNlc3NhcnkgdG8gcmVvcmRlciBpbmRlcGVuZGVudCBzdWJyZWdpc3RlciBkZWZzIGZvciB0aGUgc2FtZSB2cmVnLgorICAvLy8gVGhpcyBoYXMgdG8gYmUgZW5hYmxlZCBpbiBjb21iaW5hdGlvbiB3aXRoIHNob3VsZFRyYWNrUHJlc3N1cmUoKS4KKyAgdmlydHVhbCBib29sIHNob3VsZFRyYWNrTGFuZU1hc2tzKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLyBJZiB0aGlzIG1ldGhvZCByZXR1cm5zIHRydWUsIGhhbmRsaW5nIG9mIHRoZSBzY2hlZHVsaW5nIHJlZ2lvbnMKKyAgLy8gdGhlbXNlbHZlcyAoaW4gY2FzZSBvZiBhIHNjaGVkdWxpbmcgYm91bmRhcnkgaW4gTUJCKSB3aWxsIGJlIGRvbmUKKyAgLy8gYmVnaW5uaW5nIHdpdGggdGhlIHRvcG1vc3QgcmVnaW9uIG9mIE1CQi4KKyAgdmlydHVhbCBib29sIGRvTUJCU2NoZWRSZWdpb25zVG9wRG93bigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIEluaXRpYWxpemUgdGhlIHN0cmF0ZWd5IGFmdGVyIGJ1aWxkaW5nIHRoZSBEQUcgZm9yIGEgbmV3IHJlZ2lvbi4KKyAgdmlydHVhbCB2b2lkIGluaXRpYWxpemUoU2NoZWR1bGVEQUdNSSAqREFHKSA9IDA7CisKKyAgLy8vIFRlbGwgdGhlIHN0cmF0ZWd5IHRoYXQgTUJCIGlzIGFib3V0IHRvIGJlIHByb2Nlc3NlZC4KKyAgdmlydHVhbCB2b2lkIGVudGVyTUJCKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIHt9OworCisgIC8vLyBUZWxsIHRoZSBzdHJhdGVneSB0aGF0IGN1cnJlbnQgTUJCIGlzIGRvbmUuCisgIHZpcnR1YWwgdm9pZCBsZWF2ZU1CQigpIHt9OworCisgIC8vLyBOb3RpZnkgdGhpcyBzdHJhdGVneSB0aGF0IGFsbCByb290cyBoYXZlIGJlZW4gcmVsZWFzZWQgKGluY2x1ZGluZyB0aG9zZQorICAvLy8gdGhhdCBkZXBlbmQgb24gRW50cnlTVSBvciBFeGl0U1UpLgorICB2aXJ0dWFsIHZvaWQgcmVnaXN0ZXJSb290cygpIHt9CisKKyAgLy8vIFBpY2sgdGhlIG5leHQgbm9kZSB0byBzY2hlZHVsZSwgb3IgcmV0dXJuIE5VTEwuIFNldCBJc1RvcE5vZGUgdG8gdHJ1ZSB0bworICAvLy8gc2NoZWR1bGUgdGhlIG5vZGUgYXQgdGhlIHRvcCBvZiB0aGUgdW5zY2hlZHVsZWQgcmVnaW9uLiBPdGhlcndpc2UgaXQgd2lsbAorICAvLy8gYmUgc2NoZWR1bGVkIGF0IHRoZSBib3R0b20uCisgIHZpcnR1YWwgU1VuaXQgKnBpY2tOb2RlKGJvb2wgJklzVG9wTm9kZSkgPSAwOworCisgIC8vLyBcYnJpZWYgU2NoZWR1bGVyIGNhbGxiYWNrIHRvIG5vdGlmeSB0aGF0IGEgbmV3IHN1YnRyZWUgaXMgc2NoZWR1bGVkLgorICB2aXJ0dWFsIHZvaWQgc2NoZWR1bGVUcmVlKHVuc2lnbmVkIFN1YnRyZWVJRCkge30KKworICAvLy8gTm90aWZ5IE1hY2hpbmVTY2hlZFN0cmF0ZWd5IHRoYXQgU2NoZWR1bGVEQUdNSSBoYXMgc2NoZWR1bGVkIGFuCisgIC8vLyBpbnN0cnVjdGlvbiBhbmQgdXBkYXRlZCBzY2hlZHVsZWQvcmVtYWluaW5nIGZsYWdzIGluIHRoZSBEQUcgbm9kZXMuCisgIHZpcnR1YWwgdm9pZCBzY2hlZE5vZGUoU1VuaXQgKlNVLCBib29sIElzVG9wTm9kZSkgPSAwOworCisgIC8vLyBXaGVuIGFsbCBwcmVkZWNlc3NvciBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIHJlc29sdmVkLCBmcmVlIHRoaXMgbm9kZSBmb3IKKyAgLy8vIHRvcC1kb3duIHNjaGVkdWxpbmcuCisgIHZpcnR1YWwgdm9pZCByZWxlYXNlVG9wTm9kZShTVW5pdCAqU1UpID0gMDsKKworICAvLy8gV2hlbiBhbGwgc3VjY2Vzc29yIGRlcGVuZGVuY2llcyBoYXZlIGJlZW4gcmVzb2x2ZWQsIGZyZWUgdGhpcyBub2RlIGZvcgorICAvLy8gYm90dG9tLXVwIHNjaGVkdWxpbmcuCisgIHZpcnR1YWwgdm9pZCByZWxlYXNlQm90dG9tTm9kZShTVW5pdCAqU1UpID0gMDsKK307CisKKy8vLyBTY2hlZHVsZURBR01JIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIFNjaGVkdWxlREFHSW5zdHJzIHRoYXQgc2ltcGx5CisvLy8gc2NoZWR1bGVzIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIGFjY29yZGluZyB0byB0aGUgZ2l2ZW4gTWFjaGluZVNjaGVkU3RyYXRlZ3kKKy8vLyB3aXRob3V0IG11Y2ggZXh0cmEgYm9vay1rZWVwaW5nLiBUaGlzIGlzIHRoZSBjb21tb24gZnVuY3Rpb25hbGl0eSBiZXR3ZWVuCisvLy8gUHJlUkEgYW5kIFBvc3RSQSBNYWNoaW5lU2NoZWR1bGVyLgorY2xhc3MgU2NoZWR1bGVEQUdNSSA6IHB1YmxpYyBTY2hlZHVsZURBR0luc3RycyB7Citwcm90ZWN0ZWQ6CisgIEFsaWFzQW5hbHlzaXMgKkFBOworICBMaXZlSW50ZXJ2YWxzICpMSVM7CisgIHN0ZDo6dW5pcXVlX3B0cjxNYWNoaW5lU2NoZWRTdHJhdGVneT4gU2NoZWRJbXBsOworCisgIC8vLyBUb3BvIC0gQSB0b3BvbG9naWNhbCBvcmRlcmluZyBmb3IgU1VuaXRzIHdoaWNoIHBlcm1pdHMgZmFzdCBJc1JlYWNoYWJsZQorICAvLy8gYW5kIHNpbWlsYXIgcXVlcmllcy4KKyAgU2NoZWR1bGVEQUdUb3BvbG9naWNhbFNvcnQgVG9wbzsKKworICAvLy8gT3JkZXJlZCBsaXN0IG9mIERBRyBwb3N0cHJvY2Vzc2luZyBzdGVwcy4KKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFNjaGVkdWxlREFHTXV0YXRpb24+PiBNdXRhdGlvbnM7CisKKyAgLy8vIFRoZSB0b3Agb2YgdGhlIHVuc2NoZWR1bGVkIHpvbmUuCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBDdXJyZW50VG9wOworCisgIC8vLyBUaGUgYm90dG9tIG9mIHRoZSB1bnNjaGVkdWxlZCB6b25lLgorICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgQ3VycmVudEJvdHRvbTsKKworICAvLy8gUmVjb3JkIHRoZSBuZXh0IG5vZGUgaW4gYSBzY2hlZHVsZWQgY2x1c3Rlci4KKyAgY29uc3QgU1VuaXQgKk5leHRDbHVzdGVyUHJlZCA9IG51bGxwdHI7CisgIGNvbnN0IFNVbml0ICpOZXh0Q2x1c3RlclN1Y2MgPSBudWxscHRyOworCisjaWZuZGVmIE5ERUJVRworICAvLy8gVGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgc2NoZWR1bGVkIHNvIGZhci4gVXNlZCB0byBjdXQgb2ZmIHRoZQorICAvLy8gc2NoZWR1bGVyIGF0IHRoZSBwb2ludCBkZXRlcm1pbmVkIGJ5IG1pc2NoZWQtY3V0b2ZmLgorICB1bnNpZ25lZCBOdW1JbnN0cnNTY2hlZHVsZWQgPSAwOworI2VuZGlmCisKK3B1YmxpYzoKKyAgU2NoZWR1bGVEQUdNSShNYWNoaW5lU2NoZWRDb250ZXh0ICpDLCBzdGQ6OnVuaXF1ZV9wdHI8TWFjaGluZVNjaGVkU3RyYXRlZ3k+IFMsCisgICAgICAgICAgICAgICAgYm9vbCBSZW1vdmVLaWxsRmxhZ3MpCisgICAgICA6IFNjaGVkdWxlREFHSW5zdHJzKCpDLT5NRiwgQy0+TUxJLCBSZW1vdmVLaWxsRmxhZ3MpLCBBQShDLT5BQSksCisgICAgICAgIExJUyhDLT5MSVMpLCBTY2hlZEltcGwoc3RkOjptb3ZlKFMpKSwgVG9wbyhTVW5pdHMsICZFeGl0U1UpIHt9CisKKyAgLy8gUHJvdmlkZSBhIHZ0YWJsZSBhbmNob3IKKyAgflNjaGVkdWxlREFHTUkoKSBvdmVycmlkZTsKKworICAvLy8gSWYgdGhpcyBtZXRob2QgcmV0dXJucyB0cnVlLCBoYW5kbGluZyBvZiB0aGUgc2NoZWR1bGluZyByZWdpb25zCisgIC8vLyB0aGVtc2VsdmVzIChpbiBjYXNlIG9mIGEgc2NoZWR1bGluZyBib3VuZGFyeSBpbiBNQkIpIHdpbGwgYmUgZG9uZQorICAvLy8gYmVnaW5uaW5nIHdpdGggdGhlIHRvcG1vc3QgcmVnaW9uIG9mIE1CQi4KKyAgYm9vbCBkb01CQlNjaGVkUmVnaW9uc1RvcERvd24oKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIFNjaGVkSW1wbC0+ZG9NQkJTY2hlZFJlZ2lvbnNUb3BEb3duKCk7CisgIH0KKworICAvLyBSZXR1cm5zIExpdmVJbnRlcnZhbHMgaW5zdGFuY2UgZm9yIHVzZSBpbiBEQUcgbXV0YXRvcnMgYW5kIHN1Y2guCisgIExpdmVJbnRlcnZhbHMgKmdldExJUygpIGNvbnN0IHsgcmV0dXJuIExJUzsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIERBRyBzdXBwb3J0cyBWUmVnIGxpdmVuZXNzIGFuZCBSZWdQcmVzc3VyZS4KKyAgdmlydHVhbCBib29sIGhhc1ZSZWdMaXZlbmVzcygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIEFkZCBhIHBvc3Rwcm9jZXNzaW5nIHN0ZXAgdG8gdGhlIERBRyBidWlsZGVyLgorICAvLy8gTXV0YXRpb25zIGFyZSBhcHBsaWVkIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXJlIGFkZGVkIGFmdGVyIG5vcm1hbCBEQUcKKyAgLy8vIGJ1aWxkaW5nIGFuZCBiZWZvcmUgTWFjaGluZVNjaGVkU3RyYXRlZ3kgaW5pdGlhbGl6YXRpb24uCisgIC8vLworICAvLy8gU2NoZWR1bGVEQUdNSSB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIE11dGF0aW9uIG9iamVjdC4KKyAgdm9pZCBhZGRNdXRhdGlvbihzdGQ6OnVuaXF1ZV9wdHI8U2NoZWR1bGVEQUdNdXRhdGlvbj4gTXV0YXRpb24pIHsKKyAgICBpZiAoTXV0YXRpb24pCisgICAgICBNdXRhdGlvbnMucHVzaF9iYWNrKHN0ZDo6bW92ZShNdXRhdGlvbikpOworICB9CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIGFuIGVkZ2UgY2FuIGJlIGFkZGVkIGZyb20gUHJlZFNVIHRvIFN1Y2NTVSB3aXRob3V0IGNyZWF0aW5nCisgIC8vLyBhIGN5Y2xlLgorICBib29sIGNhbkFkZEVkZ2UoU1VuaXQgKlN1Y2NTVSwgU1VuaXQgKlByZWRTVSk7CisKKyAgLy8vIFxicmllZiBBZGQgYSBEQUcgZWRnZSB0byB0aGUgZ2l2ZW4gU1Ugd2l0aCB0aGUgZ2l2ZW4gcHJlZGVjZXNzb3IKKyAgLy8vIGRlcGVuZGVuY2UgZGF0YS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoZSBlZGdlIG1heSBiZSBhZGRlZCB3aXRob3V0IGNyZWF0aW5nIGEgY3ljbGUgT1IgaWYgYW4KKyAgLy8vIGVxdWl2YWxlbnQgZWRnZSBhbHJlYWR5IGV4aXN0ZWQgKGZhbHNlIGluZGljYXRlcyBmYWlsdXJlKS4KKyAgYm9vbCBhZGRFZGdlKFNVbml0ICpTdWNjU1UsIGNvbnN0IFNEZXAgJlByZWREZXApOworCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciB0b3AoKSBjb25zdCB7IHJldHVybiBDdXJyZW50VG9wOyB9CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBib3R0b20oKSBjb25zdCB7IHJldHVybiBDdXJyZW50Qm90dG9tOyB9CisKKyAgLy8vIEltcGxlbWVudCB0aGUgU2NoZWR1bGVEQUdJbnN0cnMgaW50ZXJmYWNlIGZvciBoYW5kbGluZyB0aGUgbmV4dCBzY2hlZHVsaW5nCisgIC8vLyByZWdpb24uIFRoaXMgY292ZXJzIGFsbCBpbnN0cnVjdGlvbnMgaW4gYSBibG9jaywgd2hpbGUgc2NoZWR1bGUoKSBtYXkgb25seQorICAvLy8gY292ZXIgYSBzdWJzZXQuCisgIHZvaWQgZW50ZXJSZWdpb24oTWFjaGluZUJhc2ljQmxvY2sgKmJiLAorICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBiZWdpbiwKKyAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgZW5kLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHJlZ2lvbmluc3Rycykgb3ZlcnJpZGU7CisKKyAgLy8vIEltcGxlbWVudCBTY2hlZHVsZURBR0luc3RycyBpbnRlcmZhY2UgZm9yIHNjaGVkdWxpbmcgYSBzZXF1ZW5jZSBvZgorICAvLy8gcmVvcmRlcmFibGUgaW5zdHJ1Y3Rpb25zLgorICB2b2lkIHNjaGVkdWxlKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBzdGFydEJsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpiYikgb3ZlcnJpZGU7CisgIHZvaWQgZmluaXNoQmxvY2soKSBvdmVycmlkZTsKKworICAvLy8gQ2hhbmdlIHRoZSBwb3NpdGlvbiBvZiBhbiBpbnN0cnVjdGlvbiB3aXRoaW4gdGhlIGJhc2ljIGJsb2NrIGFuZCB1cGRhdGUKKyAgLy8vIGxpdmUgcmFuZ2VzIGFuZCByZWdpb24gYm91bmRhcnkgaXRlcmF0b3JzLgorICB2b2lkIG1vdmVJbnN0cnVjdGlvbihNYWNoaW5lSW5zdHIgKk1JLCBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0UG9zKTsKKworICBjb25zdCBTVW5pdCAqZ2V0TmV4dENsdXN0ZXJQcmVkKCkgY29uc3QgeyByZXR1cm4gTmV4dENsdXN0ZXJQcmVkOyB9CisKKyAgY29uc3QgU1VuaXQgKmdldE5leHRDbHVzdGVyU3VjYygpIGNvbnN0IHsgcmV0dXJuIE5leHRDbHVzdGVyU3VjYzsgfQorCisgIHZvaWQgdmlld0dyYXBoKGNvbnN0IFR3aW5lICZOYW1lLCBjb25zdCBUd2luZSAmVGl0bGUpIG92ZXJyaWRlOworICB2b2lkIHZpZXdHcmFwaCgpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgIC8vIFRvcC1MZXZlbCBlbnRyeSBwb2ludHMgZm9yIHRoZSBzY2hlZHVsZSgpIGRyaXZlci4uLgorCisgIC8vLyBBcHBseSBlYWNoIFNjaGVkdWxlREFHTXV0YXRpb24gc3RlcCBpbiBvcmRlci4gVGhpcyBhbGxvd3MgZGlmZmVyZW50CisgIC8vLyBpbnN0YW5jZXMgb2YgU2NoZWR1bGVEQUdNSSB0byBwZXJmb3JtIGN1c3RvbSBEQUcgcG9zdHByb2Nlc3NpbmcuCisgIHZvaWQgcG9zdHByb2Nlc3NEQUcoKTsKKworICAvLy8gUmVsZWFzZSBFeGl0U1UgcHJlZGVjZXNzb3JzIGFuZCBzZXR1cCBzY2hlZHVsZXIgcXVldWVzLgorICB2b2lkIGluaXRRdWV1ZXMoQXJyYXlSZWY8U1VuaXQqPiBUb3BSb290cywgQXJyYXlSZWY8U1VuaXQqPiBCb3RSb290cyk7CisKKyAgLy8vIFVwZGF0ZSBzY2hlZHVsZXIgREFHIGFuZCBxdWV1ZXMgYWZ0ZXIgc2NoZWR1bGluZyBhbiBpbnN0cnVjdGlvbi4KKyAgdm9pZCB1cGRhdGVRdWV1ZXMoU1VuaXQgKlNVLCBib29sIElzVG9wTm9kZSk7CisKKyAgLy8vIFJlaW5zZXJ0IGRlYnVnX3ZhbHVlcyByZWNvcmRlZCBpbiBTY2hlZHVsZURBR0luc3Ryczo6RGJnVmFsdWVzLgorICB2b2lkIHBsYWNlRGVidWdWYWx1ZXMoKTsKKworICAvLy8gXGJyaWVmIGR1bXAgdGhlIHNjaGVkdWxlZCBTZXF1ZW5jZS4KKyAgdm9pZCBkdW1wU2NoZWR1bGUoKSBjb25zdDsKKworICAvLyBMZXNzZXIgaGVscGVycy4uLgorICBib29sIGNoZWNrU2NoZWRMaW1pdCgpOworCisgIHZvaWQgZmluZFJvb3RzQW5kQmlhc0VkZ2VzKFNtYWxsVmVjdG9ySW1wbDxTVW5pdCo+ICZUb3BSb290cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNVbml0Kj4gJkJvdFJvb3RzKTsKKworICB2b2lkIHJlbGVhc2VTdWNjKFNVbml0ICpTVSwgU0RlcCAqU3VjY0VkZ2UpOworICB2b2lkIHJlbGVhc2VTdWNjZXNzb3JzKFNVbml0ICpTVSk7CisgIHZvaWQgcmVsZWFzZVByZWQoU1VuaXQgKlNVLCBTRGVwICpQcmVkRWRnZSk7CisgIHZvaWQgcmVsZWFzZVByZWRlY2Vzc29ycyhTVW5pdCAqU1UpOworfTsKKworLy8vIFNjaGVkdWxlREFHTUlMaXZlIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIFNjaGVkdWxlREFHSW5zdHJzIHRoYXQgc2NoZWR1bGVzCisvLy8gbWFjaGluZSBpbnN0cnVjdGlvbnMgd2hpbGUgdXBkYXRpbmcgTGl2ZUludGVydmFscyBhbmQgdHJhY2tpbmcgcmVncHJlc3N1cmUuCitjbGFzcyBTY2hlZHVsZURBR01JTGl2ZSA6IHB1YmxpYyBTY2hlZHVsZURBR01JIHsKK3Byb3RlY3RlZDoKKyAgUmVnaXN0ZXJDbGFzc0luZm8gKlJlZ0NsYXNzSW5mbzsKKworICAvLy8gSW5mb3JtYXRpb24gYWJvdXQgREFHIHN1YnRyZWVzLiBJZiBERlNSZXN1bHQgaXMgTlVMTCwgdGhlbiBTY2hlZHVsZXJUcmVlcworICAvLy8gd2lsbCBiZSBlbXB0eS4KKyAgU2NoZWRERlNSZXN1bHQgKkRGU1Jlc3VsdCA9IG51bGxwdHI7CisgIEJpdFZlY3RvciBTY2hlZHVsZWRUcmVlczsKKworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTGl2ZVJlZ2lvbkVuZDsKKworICAvLy8gTWFwcyB2cmVncyB0byB0aGUgU1VuaXRzIG9mIHRoZWlyIHVzZXMgaW4gdGhlIGN1cnJlbnQgc2NoZWR1bGluZyByZWdpb24uCisgIFZSZWcyU1VuaXRNdWx0aU1hcCBWUmVnVXNlczsKKworICAvLyBNYXAgZWFjaCBTVSB0byBpdHMgc3VtbWFyeSBvZiBwcmVzc3VyZSBjaGFuZ2VzLiBUaGlzIGFycmF5IGlzIHVwZGF0ZWQgZm9yCisgIC8vIGxpdmVuZXNzIGR1cmluZyBib3R0b20tdXAgc2NoZWR1bGluZy4gVG9wLWRvd24gc2NoZWR1bGluZyBtYXkgcHJvY2VlZCBidXQKKyAgLy8gaGFzIG5vIGFmZmVjdCBvbiB0aGUgcHJlc3N1cmUgZGlmZnMuCisgIFByZXNzdXJlRGlmZnMgU1VQcmVzc3VyZURpZmZzOworCisgIC8vLyBSZWdpc3RlciBwcmVzc3VyZSBpbiB0aGlzIHJlZ2lvbiBjb21wdXRlZCBieSBpbml0UmVnUHJlc3N1cmUuCisgIGJvb2wgU2hvdWxkVHJhY2tQcmVzc3VyZSA9IGZhbHNlOworICBib29sIFNob3VsZFRyYWNrTGFuZU1hc2tzID0gZmFsc2U7CisgIEludGVydmFsUHJlc3N1cmUgUmVnUHJlc3N1cmU7CisgIFJlZ1ByZXNzdXJlVHJhY2tlciBSUFRyYWNrZXI7CisKKyAgLy8vIExpc3Qgb2YgcHJlc3N1cmUgc2V0cyB0aGF0IGV4Y2VlZCB0aGUgdGFyZ2V0J3MgcHJlc3N1cmUgbGltaXQgYmVmb3JlCisgIC8vLyBzY2hlZHVsaW5nLCBsaXN0ZWQgaW4gaW5jcmVhc2luZyBzZXQgSUQgb3JkZXIuIEVhY2ggcHJlc3N1cmUgc2V0IGlzIHBhaXJlZAorICAvLy8gd2l0aCBpdHMgbWF4IHByZXNzdXJlIGluIHRoZSBjdXJyZW50bHkgc2NoZWR1bGVkIHJlZ2lvbnMuCisgIHN0ZDo6dmVjdG9yPFByZXNzdXJlQ2hhbmdlPiBSZWdpb25Dcml0aWNhbFBTZXRzOworCisgIC8vLyBUaGUgdG9wIG9mIHRoZSB1bnNjaGVkdWxlZCB6b25lLgorICBJbnRlcnZhbFByZXNzdXJlIFRvcFByZXNzdXJlOworICBSZWdQcmVzc3VyZVRyYWNrZXIgVG9wUlBUcmFja2VyOworCisgIC8vLyBUaGUgYm90dG9tIG9mIHRoZSB1bnNjaGVkdWxlZCB6b25lLgorICBJbnRlcnZhbFByZXNzdXJlIEJvdFByZXNzdXJlOworICBSZWdQcmVzc3VyZVRyYWNrZXIgQm90UlBUcmFja2VyOworCisgIC8vLyBUcnVlIGlmIGRpc2Nvbm5lY3RlZCBzdWJyZWdpc3RlciBjb21wb25lbnRzIGFyZSBhbHJlYWR5IHJlbmFtZWQuCisgIC8vLyBUaGUgcmVuYW1pbmcgaXMgb25seSBkb25lIG9uIGRlbWFuZCBpZiBsYW5lIG1hc2tzIGFyZSB0cmFja2VkLgorICBib29sIERpc2Nvbm5lY3RlZENvbXBvbmVudHNSZW5hbWVkID0gZmFsc2U7CisKK3B1YmxpYzoKKyAgU2NoZWR1bGVEQUdNSUxpdmUoTWFjaGluZVNjaGVkQ29udGV4dCAqQywKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1hY2hpbmVTY2hlZFN0cmF0ZWd5PiBTKQorICAgICAgOiBTY2hlZHVsZURBR01JKEMsIHN0ZDo6bW92ZShTKSwgLypSZW1vdmVLaWxsRmxhZ3M9Ki9mYWxzZSksCisgICAgICAgIFJlZ0NsYXNzSW5mbyhDLT5SZWdDbGFzc0luZm8pLCBSUFRyYWNrZXIoUmVnUHJlc3N1cmUpLAorICAgICAgICBUb3BSUFRyYWNrZXIoVG9wUHJlc3N1cmUpLCBCb3RSUFRyYWNrZXIoQm90UHJlc3N1cmUpIHt9CisKKyAgflNjaGVkdWxlREFHTUlMaXZlKCkgb3ZlcnJpZGU7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgREFHIHN1cHBvcnRzIFZSZWcgbGl2ZW5lc3MgYW5kIFJlZ1ByZXNzdXJlLgorICBib29sIGhhc1ZSZWdMaXZlbmVzcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHJlZ2lzdGVyIHByZXNzdXJlIHRyYWNraW5nIGlzIGVuYWJsZWQuCisgIGJvb2wgaXNUcmFja2luZ1ByZXNzdXJlKCkgY29uc3QgeyByZXR1cm4gU2hvdWxkVHJhY2tQcmVzc3VyZTsgfQorCisgIC8vLyBHZXQgY3VycmVudCByZWdpc3RlciBwcmVzc3VyZSBmb3IgdGhlIHRvcCBzY2hlZHVsZWQgaW5zdHJ1Y3Rpb25zLgorICBjb25zdCBJbnRlcnZhbFByZXNzdXJlICZnZXRUb3BQcmVzc3VyZSgpIGNvbnN0IHsgcmV0dXJuIFRvcFByZXNzdXJlOyB9CisgIGNvbnN0IFJlZ1ByZXNzdXJlVHJhY2tlciAmZ2V0VG9wUlBUcmFja2VyKCkgY29uc3QgeyByZXR1cm4gVG9wUlBUcmFja2VyOyB9CisKKyAgLy8vIEdldCBjdXJyZW50IHJlZ2lzdGVyIHByZXNzdXJlIGZvciB0aGUgYm90dG9tIHNjaGVkdWxlZCBpbnN0cnVjdGlvbnMuCisgIGNvbnN0IEludGVydmFsUHJlc3N1cmUgJmdldEJvdFByZXNzdXJlKCkgY29uc3QgeyByZXR1cm4gQm90UHJlc3N1cmU7IH0KKyAgY29uc3QgUmVnUHJlc3N1cmVUcmFja2VyICZnZXRCb3RSUFRyYWNrZXIoKSBjb25zdCB7IHJldHVybiBCb3RSUFRyYWNrZXI7IH0KKworICAvLy8gR2V0IHJlZ2lzdGVyIHByZXNzdXJlIGZvciB0aGUgZW50aXJlIHNjaGVkdWxpbmcgcmVnaW9uIGJlZm9yZSBzY2hlZHVsaW5nLgorICBjb25zdCBJbnRlcnZhbFByZXNzdXJlICZnZXRSZWdQcmVzc3VyZSgpIGNvbnN0IHsgcmV0dXJuIFJlZ1ByZXNzdXJlOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8UHJlc3N1cmVDaGFuZ2U+ICZnZXRSZWdpb25Dcml0aWNhbFBTZXRzKCkgY29uc3QgeworICAgIHJldHVybiBSZWdpb25Dcml0aWNhbFBTZXRzOworICB9CisKKyAgUHJlc3N1cmVEaWZmICZnZXRQcmVzc3VyZURpZmYoY29uc3QgU1VuaXQgKlNVKSB7CisgICAgcmV0dXJuIFNVUHJlc3N1cmVEaWZmc1tTVS0+Tm9kZU51bV07CisgIH0KKworICAvLy8gQ29tcHV0ZSBhIERGU1Jlc3VsdCBhZnRlciBEQUcgYnVpbGRpbmcgaXMgY29tcGxldGUsIGFuZCBiZWZvcmUgYW55CisgIC8vLyBxdWV1ZSBjb21wYXJpc29ucy4KKyAgdm9pZCBjb21wdXRlREZTUmVzdWx0KCk7CisKKyAgLy8vIFJldHVybiBhIG5vbi1udWxsIERGUyByZXN1bHQgaWYgdGhlIHNjaGVkdWxpbmcgc3RyYXRlZ3kgaW5pdGlhbGl6ZWQgaXQuCisgIGNvbnN0IFNjaGVkREZTUmVzdWx0ICpnZXRERlNSZXN1bHQoKSBjb25zdCB7IHJldHVybiBERlNSZXN1bHQ7IH0KKworICBCaXRWZWN0b3IgJmdldFNjaGVkdWxlZFRyZWVzKCkgeyByZXR1cm4gU2NoZWR1bGVkVHJlZXM7IH0KKworICAvLy8gSW1wbGVtZW50IHRoZSBTY2hlZHVsZURBR0luc3RycyBpbnRlcmZhY2UgZm9yIGhhbmRsaW5nIHRoZSBuZXh0IHNjaGVkdWxpbmcKKyAgLy8vIHJlZ2lvbi4gVGhpcyBjb3ZlcnMgYWxsIGluc3RydWN0aW9ucyBpbiBhIGJsb2NrLCB3aGlsZSBzY2hlZHVsZSgpIG1heSBvbmx5CisgIC8vLyBjb3ZlciBhIHN1YnNldC4KKyAgdm9pZCBlbnRlclJlZ2lvbihNYWNoaW5lQmFzaWNCbG9jayAqYmIsCisgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIGJlZ2luLAorICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBlbmQsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcmVnaW9uaW5zdHJzKSBvdmVycmlkZTsKKworICAvLy8gSW1wbGVtZW50IFNjaGVkdWxlREFHSW5zdHJzIGludGVyZmFjZSBmb3Igc2NoZWR1bGluZyBhIHNlcXVlbmNlIG9mCisgIC8vLyByZW9yZGVyYWJsZSBpbnN0cnVjdGlvbnMuCisgIHZvaWQgc2NoZWR1bGUoKSBvdmVycmlkZTsKKworICAvLy8gQ29tcHV0ZSB0aGUgY3ljbGljIGNyaXRpY2FsIHBhdGggdGhyb3VnaCB0aGUgREFHLgorICB1bnNpZ25lZCBjb21wdXRlQ3ljbGljQ3JpdGljYWxQYXRoKCk7CisKK3Byb3RlY3RlZDoKKyAgLy8gVG9wLUxldmVsIGVudHJ5IHBvaW50cyBmb3IgdGhlIHNjaGVkdWxlKCkgZHJpdmVyLi4uCisKKyAgLy8vIENhbGwgU2NoZWR1bGVEQUdJbnN0cnM6OmJ1aWxkU2NoZWRHcmFwaCB3aXRoIHJlZ2lzdGVyIHByZXNzdXJlIHRyYWNraW5nCisgIC8vLyBlbmFibGVkLiBUaGlzIHNldHMgdXAgdGhyZWUgdHJhY2tlcnMuIFJQVHJhY2tlciB3aWxsIGNvdmVyIHRoZSBlbnRpcmUgREFHCisgIC8vLyByZWdpb24sIFRvcFRyYWNrZXIgYW5kIEJvdHRvbVRyYWNrZXIgd2lsbCBiZSBpbml0aWFsaXplZCB0byB0aGUgdG9wIGFuZAorICAvLy8gYm90dG9tIG9mIHRoZSBEQUcgcmVnaW9uIHdpdGhvdXQgY292ZXJlaW5nIGFueSB1bnNjaGVkdWxlZCBpbnN0cnVjdGlvbi4KKyAgdm9pZCBidWlsZERBR1dpdGhSZWdQcmVzc3VyZSgpOworCisgIC8vLyBSZWxlYXNlIEV4aXRTVSBwcmVkZWNlc3NvcnMgYW5kIHNldHVwIHNjaGVkdWxlciBxdWV1ZXMuIFJlLXBvc2l0aW9uCisgIC8vLyB0aGUgVG9wIFJQIHRyYWNrZXIgaW4gY2FzZSB0aGUgcmVnaW9uIGJlZ2lubmluZyBoYXMgY2hhbmdlZC4KKyAgdm9pZCBpbml0UXVldWVzKEFycmF5UmVmPFNVbml0Kj4gVG9wUm9vdHMsIEFycmF5UmVmPFNVbml0Kj4gQm90Um9vdHMpOworCisgIC8vLyBNb3ZlIGFuIGluc3RydWN0aW9uIGFuZCB1cGRhdGUgcmVnaXN0ZXIgcHJlc3N1cmUuCisgIHZvaWQgc2NoZWR1bGVNSShTVW5pdCAqU1UsIGJvb2wgSXNUb3BOb2RlKTsKKworICAvLyBMZXNzZXIgaGVscGVycy4uLgorCisgIHZvaWQgaW5pdFJlZ1ByZXNzdXJlKCk7CisKKyAgdm9pZCB1cGRhdGVQcmVzc3VyZURpZmZzKEFycmF5UmVmPFJlZ2lzdGVyTWFza1BhaXI+IExpdmVVc2VzKTsKKworICB2b2lkIHVwZGF0ZVNjaGVkdWxlZFByZXNzdXJlKGNvbnN0IFNVbml0ICpTVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJk5ld01heFByZXNzdXJlKTsKKworICB2b2lkIGNvbGxlY3RWUmVnVXNlcyhTVW5pdCAmU1UpOworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIEhlbHBlcnMgZm9yIGltcGxlbWVudGluZyBjdXN0b20gTWFjaGluZVNjaGVkU3RyYXRlZ3kgY2xhc3Nlcy4gVGhlc2UgdGFrZQorLy8vIGNhcmUgb2YgdGhlIGJvb2sta2VlcGluZyBhc3NvY2lhdGVkIHdpdGggbGlzdCBzY2hlZHVsaW5nIGhldXJpc3RpY3MuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBSZWFkeVF1ZXVlIGVuY2Fwc3VsYXRlcyB2ZWN0b3Igb2YgInJlYWR5IiBTVW5pdHMgd2l0aCBiYXNpYyBjb252ZW5pZW5jZQorLy8vIG1ldGhvZHMgZm9yIHB1c2hpbmcgYW5kIHJlbW92aW5nIG5vZGVzLiBSZWFkeVF1ZXVlJ3MgYXJlIHVuaXF1ZWx5IGlkZW50aWZpZWQKKy8vLyBieSBhbiBJRC4gU1VuaXQ6Ok5vZGVRdWV1ZUlkIGlzIGEgbWFzayBvZiB0aGUgUmVhZHlRdWV1ZXMgdGhlIFNVbml0IGlzIGluLgorLy8vCisvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIGNsYXNzIHRoYXQgbWF5IGJlIHVzZWQgYnkgaW1wbGVtZW50YXRpb25zIG9mCisvLy8gTWFjaGluZVNjaGVkU3RyYXRlZ3kuCitjbGFzcyBSZWFkeVF1ZXVlIHsKKyAgdW5zaWduZWQgSUQ7CisgIHN0ZDo6c3RyaW5nIE5hbWU7CisgIHN0ZDo6dmVjdG9yPFNVbml0Kj4gUXVldWU7CisKK3B1YmxpYzoKKyAgUmVhZHlRdWV1ZSh1bnNpZ25lZCBpZCwgY29uc3QgVHdpbmUgJm5hbWUpOiBJRChpZCksIE5hbWUobmFtZS5zdHIoKSkge30KKworICB1bnNpZ25lZCBnZXRJRCgpIGNvbnN0IHsgcmV0dXJuIElEOyB9CisKKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisKKyAgLy8gU1UgaXMgaW4gdGhpcyBxdWV1ZSBpZiBpdCdzIE5vZGVRdWV1ZUlEIGlzIGEgc3VwZXJzZXQgb2YgdGhpcyBJRC4KKyAgYm9vbCBpc0luUXVldWUoU1VuaXQgKlNVKSBjb25zdCB7IHJldHVybiAoU1UtPk5vZGVRdWV1ZUlkICYgSUQpOyB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFF1ZXVlLmVtcHR5KCk7IH0KKworICB2b2lkIGNsZWFyKCkgeyBRdWV1ZS5jbGVhcigpOyB9CisKKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFF1ZXVlLnNpemUoKTsgfQorCisgIHVzaW5nIGl0ZXJhdG9yID0gc3RkOjp2ZWN0b3I8U1VuaXQqPjo6aXRlcmF0b3I7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBRdWV1ZS5iZWdpbigpOyB9CisKKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gUXVldWUuZW5kKCk7IH0KKworICBBcnJheVJlZjxTVW5pdCo+IGVsZW1lbnRzKCkgeyByZXR1cm4gUXVldWU7IH0KKworICBpdGVyYXRvciBmaW5kKFNVbml0ICpTVSkgeyByZXR1cm4gbGx2bTo6ZmluZChRdWV1ZSwgU1UpOyB9CisKKyAgdm9pZCBwdXNoKFNVbml0ICpTVSkgeworICAgIFF1ZXVlLnB1c2hfYmFjayhTVSk7CisgICAgU1UtPk5vZGVRdWV1ZUlkIHw9IElEOworICB9CisKKyAgaXRlcmF0b3IgcmVtb3ZlKGl0ZXJhdG9yIEkpIHsKKyAgICAoKkkpLT5Ob2RlUXVldWVJZCAmPSB+SUQ7CisgICAgKkkgPSBRdWV1ZS5iYWNrKCk7CisgICAgdW5zaWduZWQgaWR4ID0gSSAtIFF1ZXVlLmJlZ2luKCk7CisgICAgUXVldWUucG9wX2JhY2soKTsKKyAgICByZXR1cm4gUXVldWUuYmVnaW4oKSArIGlkeDsKKyAgfQorCisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworLy8vIFN1bW1hcml6ZSB0aGUgdW5zY2hlZHVsZWQgcmVnaW9uLgorc3RydWN0IFNjaGVkUmVtYWluZGVyIHsKKyAgLy8gQ3JpdGljYWwgcGF0aCB0aHJvdWdoIHRoZSBEQUcgaW4gZXhwZWN0ZWQgbGF0ZW5jeS4KKyAgdW5zaWduZWQgQ3JpdGljYWxQYXRoOworICB1bnNpZ25lZCBDeWNsaWNDcml0UGF0aDsKKworICAvLyBTY2FsZWQgY291bnQgb2YgbWljcm8tb3BzIGxlZnQgdG8gc2NoZWR1bGUuCisgIHVuc2lnbmVkIFJlbUlzc3VlQ291bnQ7CisKKyAgYm9vbCBJc0FjeWNsaWNMYXRlbmN5TGltaXRlZDsKKworICAvLyBVbnNjaGVkdWxlZCByZXNvdXJjZXMKKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDE2PiBSZW1haW5pbmdDb3VudHM7CisKKyAgU2NoZWRSZW1haW5kZXIoKSB7IHJlc2V0KCk7IH0KKworICB2b2lkIHJlc2V0KCkgeworICAgIENyaXRpY2FsUGF0aCA9IDA7CisgICAgQ3ljbGljQ3JpdFBhdGggPSAwOworICAgIFJlbUlzc3VlQ291bnQgPSAwOworICAgIElzQWN5Y2xpY0xhdGVuY3lMaW1pdGVkID0gZmFsc2U7CisgICAgUmVtYWluaW5nQ291bnRzLmNsZWFyKCk7CisgIH0KKworICB2b2lkIGluaXQoU2NoZWR1bGVEQUdNSSAqREFHLCBjb25zdCBUYXJnZXRTY2hlZE1vZGVsICpTY2hlZE1vZGVsKTsKK307CisKKy8vLyBFYWNoIFNjaGVkdWxpbmcgYm91bmRhcnkgaXMgYXNzb2NpYXRlZCB3aXRoIHJlYWR5IHF1ZXVlcy4gSXQgdHJhY2tzIHRoZQorLy8vIGN1cnJlbnQgY3ljbGUgaW4gdGhlIGRpcmVjdGlvbiBvZiBtb3ZlbWVudCwgYW5kIG1haW50YWlucyB0aGUgc3RhdGUKKy8vLyBvZiAiaGF6YXJkcyIgYW5kIG90aGVyIGludGVybG9ja3MgYXQgdGhlIGN1cnJlbnQgY3ljbGUuCitjbGFzcyBTY2hlZEJvdW5kYXJ5IHsKK3B1YmxpYzoKKyAgLy8vIFNVbml0OjpOb2RlUXVldWVJZDogMCAobm9uZSksIDEgKHRvcCksIDIgKGJvdCksIDMgKGJvdGgpCisgIGVudW0geworICAgIFRvcFFJRCA9IDEsCisgICAgQm90UUlEID0gMiwKKyAgICBMb2dNYXhRSUQgPSAyCisgIH07CisKKyAgU2NoZWR1bGVEQUdNSSAqREFHID0gbnVsbHB0cjsKKyAgY29uc3QgVGFyZ2V0U2NoZWRNb2RlbCAqU2NoZWRNb2RlbCA9IG51bGxwdHI7CisgIFNjaGVkUmVtYWluZGVyICpSZW0gPSBudWxscHRyOworCisgIFJlYWR5UXVldWUgQXZhaWxhYmxlOworICBSZWFkeVF1ZXVlIFBlbmRpbmc7CisKKyAgU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyICpIYXphcmRSZWMgPSBudWxscHRyOworCitwcml2YXRlOgorICAvLy8gVHJ1ZSBpZiB0aGUgcGVuZGluZyBRIHNob3VsZCBiZSBjaGVja2VkL3VwZGF0ZWQgYmVmb3JlIHNjaGVkdWxpbmcgYW5vdGhlcgorICAvLy8gaW5zdHJ1Y3Rpb24uCisgIGJvb2wgQ2hlY2tQZW5kaW5nOworCisgIC8vLyBOdW1iZXIgb2YgY3ljbGVzIGl0IHRha2VzIHRvIGlzc3VlIHRoZSBpbnN0cnVjdGlvbnMgc2NoZWR1bGVkIGluIHRoaXMKKyAgLy8vIHpvbmUuIEl0IGlzIGRlZmluZWQgYXM6IHNjaGVkdWxlZC1taWNyby1vcHMgLyBpc3N1ZS13aWR0aCArIHN0YWxscy4KKyAgLy8vIFNlZSBnZXRTdGFsbHMoKS4KKyAgdW5zaWduZWQgQ3VyckN5Y2xlOworCisgIC8vLyBNaWNyby1vcHMgaXNzdWVkIGluIHRoZSBjdXJyZW50IGN5Y2xlCisgIHVuc2lnbmVkIEN1cnJNT3BzOworCisgIC8vLyBNaW5SZWFkeUN5Y2xlIC0gQ3ljbGUgb2YgdGhlIHNvb25lc3QgYXZhaWxhYmxlIGluc3RydWN0aW9uLgorICB1bnNpZ25lZCBNaW5SZWFkeUN5Y2xlOworCisgIC8vIFRoZSBleHBlY3RlZCBsYXRlbmN5IG9mIHRoZSBjcml0aWNhbCBwYXRoIGluIHRoaXMgc2NoZWR1bGVkIHpvbmUuCisgIHVuc2lnbmVkIEV4cGVjdGVkTGF0ZW5jeTsKKworICAvLyBUaGUgbGF0ZW5jeSBvZiBkZXBlbmRlbmNlIGNoYWlucyBsZWFkaW5nIGludG8gdGhpcyB6b25lLgorICAvLyBGb3IgZWFjaCBub2RlIHNjaGVkdWxlZCBib3R0b20tdXA6IERMYXQgPSBtYXggRExhdCwgTi5EZXB0aC4KKyAgLy8gRm9yIGVhY2ggY3ljbGUgc2NoZWR1bGVkOiBETGF0IC09IDEuCisgIHVuc2lnbmVkIERlcGVuZGVudExhdGVuY3k7CisKKyAgLy8vIENvdW50IHRoZSBzY2hlZHVsZWQgKGlzc3VlZCkgbWljcm8tb3BzIHRoYXQgY2FuIGJlIHJldGlyZWQgYnkKKyAgLy8vIHRpbWU9Q3VyckN5Y2xlIGFzc3VtaW5nIHRoZSBmaXJzdCBzY2hlZHVsZWQgaW5zdHIgaXMgcmV0aXJlZCBhdCB0aW1lPTAuCisgIHVuc2lnbmVkIFJldGlyZWRNT3BzOworCisgIC8vIENvdW50IHNjaGVkdWxlZCByZXNvdXJjZXMgdGhhdCBoYXZlIGJlZW4gZXhlY3V0ZWQuIFJlc291cmNlcyBhcmUKKyAgLy8gY29uc2lkZXJlZCBleGVjdXRlZCBpZiB0aGV5IGJlY29tZSByZWFkeSBpbiB0aGUgdGltZSB0aGF0IGl0IHRha2VzIHRvCisgIC8vIHNhdHVyYXRlIGFueSByZXNvdXJjZSBpbmNsdWRpbmcgdGhlIG9uZSBpbiBxdWVzdGlvbi4gQ291bnRzIGFyZSBzY2FsZWQKKyAgLy8gZm9yIGRpcmVjdCBjb21wYXJpc29uIHdpdGggb3RoZXIgcmVzb3VyY2VzLiBDb3VudHMgY2FuIGJlIGNvbXBhcmVkIHdpdGgKKyAgLy8gTU9wcyAqIGdldE1pY3JvT3BGYWN0b3IgYW5kIExhdGVuY3kgKiBnZXRMYXRlbmN5RmFjdG9yLgorICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMTY+IEV4ZWN1dGVkUmVzQ291bnRzOworCisgIC8vLyBDYWNoZSB0aGUgbWF4IGNvdW50IGZvciBhIHNpbmdsZSByZXNvdXJjZS4KKyAgdW5zaWduZWQgTWF4RXhlY3V0ZWRSZXNDb3VudDsKKworICAvLyBDYWNoZSB0aGUgY3JpdGljYWwgcmVzb3VyY2VzIElEIGluIHRoaXMgc2NoZWR1bGVkIHpvbmUuCisgIHVuc2lnbmVkIFpvbmVDcml0UmVzSWR4OworCisgIC8vIElzIHRoZSBzY2hlZHVsZWQgcmVnaW9uIHJlc291cmNlIGxpbWl0ZWQgdnMuIGxhdGVuY3kgbGltaXRlZC4KKyAgYm9vbCBJc1Jlc291cmNlTGltaXRlZDsKKworICAvLyBSZWNvcmQgdGhlIGhpZ2hlc3QgY3ljbGUgYXQgd2hpY2ggZWFjaCByZXNvdXJjZSBoYXMgYmVlbiByZXNlcnZlZCBieSBhCisgIC8vIHNjaGVkdWxlZCBpbnN0cnVjdGlvbi4KKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDE2PiBSZXNlcnZlZEN5Y2xlczsKKworI2lmbmRlZiBOREVCVUcKKyAgLy8gUmVtZW1iZXIgdGhlIGdyZWF0ZXN0IHBvc3NpYmxlIHN0YWxsIGFzIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YKKyAgLy8gdGltZXMgd2Ugc2hvdWxkIHJldHJ5IHRoZSBwZW5kaW5nIHF1ZXVlIGJlY2F1c2Ugb2YgYSBoYXphcmQuCisgIHVuc2lnbmVkIE1heE9ic2VydmVkU3RhbGw7CisjZW5kaWYKKworcHVibGljOgorICAvLy8gUGVuZGluZyBxdWV1ZXMgZXh0ZW5kIHRoZSByZWFkeSBxdWV1ZXMgd2l0aCB0aGUgc2FtZSBJRCBhbmQgdGhlCisgIC8vLyBQZW5kaW5nRmxhZyBzZXQuCisgIFNjaGVkQm91bmRhcnkodW5zaWduZWQgSUQsIGNvbnN0IFR3aW5lICZOYW1lKToKKyAgICBBdmFpbGFibGUoSUQsIE5hbWUrIi5BIiksIFBlbmRpbmcoSUQgPDwgTG9nTWF4UUlELCBOYW1lKyIuUCIpIHsKKyAgICByZXNldCgpOworICB9CisKKyAgflNjaGVkQm91bmRhcnkoKTsKKworICB2b2lkIHJlc2V0KCk7CisKKyAgdm9pZCBpbml0KFNjaGVkdWxlREFHTUkgKmRhZywgY29uc3QgVGFyZ2V0U2NoZWRNb2RlbCAqc21vZGVsLAorICAgICAgICAgICAgU2NoZWRSZW1haW5kZXIgKnJlbSk7CisKKyAgYm9vbCBpc1RvcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gQXZhaWxhYmxlLmdldElEKCkgPT0gVG9wUUlEOworICB9CisKKyAgLy8vIE51bWJlciBvZiBjeWNsZXMgdG8gaXNzdWUgdGhlIGluc3RydWN0aW9ucyBzY2hlZHVsZWQgaW4gdGhpcyB6b25lLgorICB1bnNpZ25lZCBnZXRDdXJyQ3ljbGUoKSBjb25zdCB7IHJldHVybiBDdXJyQ3ljbGU7IH0KKworICAvLy8gTWljcm8tb3BzIGlzc3VlZCBpbiB0aGUgY3VycmVudCBjeWNsZQorICB1bnNpZ25lZCBnZXRDdXJyTU9wcygpIGNvbnN0IHsgcmV0dXJuIEN1cnJNT3BzOyB9CisKKyAgLy8gVGhlIGxhdGVuY3kgb2YgZGVwZW5kZW5jZSBjaGFpbnMgbGVhZGluZyBpbnRvIHRoaXMgem9uZS4KKyAgdW5zaWduZWQgZ2V0RGVwZW5kZW50TGF0ZW5jeSgpIGNvbnN0IHsgcmV0dXJuIERlcGVuZGVudExhdGVuY3k7IH0KKworICAvLy8gR2V0IHRoZSBudW1iZXIgb2YgbGF0ZW5jeSBjeWNsZXMgImNvdmVyZWQiIGJ5IHRoZSBzY2hlZHVsZWQKKyAgLy8vIGluc3RydWN0aW9ucy4gVGhpcyBpcyB0aGUgbGFyZ2VyIG9mIHRoZSBjcml0aWNhbCBwYXRoIHdpdGhpbiB0aGUgem9uZQorICAvLy8gYW5kIHRoZSBudW1iZXIgb2YgY3ljbGVzIHJlcXVpcmVkIHRvIGlzc3VlIHRoZSBpbnN0cnVjdGlvbnMuCisgIHVuc2lnbmVkIGdldFNjaGVkdWxlZExhdGVuY3koKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6bWF4KEV4cGVjdGVkTGF0ZW5jeSwgQ3VyckN5Y2xlKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFVuc2NoZWR1bGVkTGF0ZW5jeShTVW5pdCAqU1UpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNUb3AoKSA/IFNVLT5nZXRIZWlnaHQoKSA6IFNVLT5nZXREZXB0aCgpOworICB9CisKKyAgdW5zaWduZWQgZ2V0UmVzb3VyY2VDb3VudCh1bnNpZ25lZCBSZXNJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gRXhlY3V0ZWRSZXNDb3VudHNbUmVzSWR4XTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIHNjYWxlZCBjb3VudCBvZiBzY2hlZHVsZWQgbWljcm8tb3BzIGFuZCByZXNvdXJjZXMsIGluY2x1ZGluZworICAvLy8gZXhlY3V0ZWQgcmVzb3VyY2VzLgorICB1bnNpZ25lZCBnZXRDcml0aWNhbENvdW50KCkgY29uc3QgeworICAgIGlmICghWm9uZUNyaXRSZXNJZHgpCisgICAgICByZXR1cm4gUmV0aXJlZE1PcHMgKiBTY2hlZE1vZGVsLT5nZXRNaWNyb09wRmFjdG9yKCk7CisgICAgcmV0dXJuIGdldFJlc291cmNlQ291bnQoWm9uZUNyaXRSZXNJZHgpOworICB9CisKKyAgLy8vIEdldCBhIHNjYWxlZCBjb3VudCBmb3IgdGhlIG1pbmltdW0gZXhlY3V0aW9uIHRpbWUgb2YgdGhlIHNjaGVkdWxlZAorICAvLy8gbWljcm8tb3BzIHRoYXQgYXJlIHJlYWR5IHRvIGV4ZWN1dGUgYnkgZ2V0RXhlY3V0ZWRDb3VudC4gTm90aWNlIHRoZQorICAvLy8gZmVlZGJhY2sgbG9vcC4KKyAgdW5zaWduZWQgZ2V0RXhlY3V0ZWRDb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjptYXgoQ3VyckN5Y2xlICogU2NoZWRNb2RlbC0+Z2V0TGF0ZW5jeUZhY3RvcigpLAorICAgICAgICAgICAgICAgICAgICBNYXhFeGVjdXRlZFJlc0NvdW50KTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFpvbmVDcml0UmVzSWR4KCkgY29uc3QgeyByZXR1cm4gWm9uZUNyaXRSZXNJZHg7IH0KKworICAvLyBJcyB0aGUgc2NoZWR1bGVkIHJlZ2lvbiByZXNvdXJjZSBsaW1pdGVkIHZzLiBsYXRlbmN5IGxpbWl0ZWQuCisgIGJvb2wgaXNSZXNvdXJjZUxpbWl0ZWQoKSBjb25zdCB7IHJldHVybiBJc1Jlc291cmNlTGltaXRlZDsgfQorCisgIC8vLyBHZXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgZ2l2ZW4gU1VuaXQncyByZWFkeSB0aW1lIGFuZCB0aGUgY3VycmVudAorICAvLy8gY3ljbGUuCisgIHVuc2lnbmVkIGdldExhdGVuY3lTdGFsbEN5Y2xlcyhTVW5pdCAqU1UpOworCisgIHVuc2lnbmVkIGdldE5leHRSZXNvdXJjZUN5Y2xlKHVuc2lnbmVkIFBJZHgsIHVuc2lnbmVkIEN5Y2xlcyk7CisKKyAgYm9vbCBjaGVja0hhemFyZChTVW5pdCAqU1UpOworCisgIHVuc2lnbmVkIGZpbmRNYXhMYXRlbmN5KEFycmF5UmVmPFNVbml0Kj4gUmVhZHlTVXMpOworCisgIHVuc2lnbmVkIGdldE90aGVyUmVzb3VyY2VDb3VudCh1bnNpZ25lZCAmT3RoZXJDcml0SWR4KTsKKworICB2b2lkIHJlbGVhc2VOb2RlKFNVbml0ICpTVSwgdW5zaWduZWQgUmVhZHlDeWNsZSk7CisKKyAgdm9pZCBidW1wQ3ljbGUodW5zaWduZWQgTmV4dEN5Y2xlKTsKKworICB2b2lkIGluY0V4ZWN1dGVkUmVzb3VyY2VzKHVuc2lnbmVkIFBJZHgsIHVuc2lnbmVkIENvdW50KTsKKworICB1bnNpZ25lZCBjb3VudFJlc291cmNlKHVuc2lnbmVkIFBJZHgsIHVuc2lnbmVkIEN5Y2xlcywgdW5zaWduZWQgUmVhZHlDeWNsZSk7CisKKyAgdm9pZCBidW1wTm9kZShTVW5pdCAqU1UpOworCisgIHZvaWQgcmVsZWFzZVBlbmRpbmcoKTsKKworICB2b2lkIHJlbW92ZVJlYWR5KFNVbml0ICpTVSk7CisKKyAgLy8vIENhbGwgdGhpcyBiZWZvcmUgYXBwbHlpbmcgYW55IG90aGVyIGhldXJpc3RpY3MgdG8gdGhlIEF2YWlsYWJsZSBxdWV1ZS4KKyAgLy8vIFVwZGF0ZXMgdGhlIEF2YWlsYWJsZS9QZW5kaW5nIFEncyBpZiBuZWNlc3NhcnkgYW5kIHJldHVybnMgdGhlIHNpbmdsZQorICAvLy8gYXZhaWxhYmxlIGluc3RydWN0aW9uLCBvciBOVUxMIGlmIHRoZXJlIGFyZSBtdWx0aXBsZSBjYW5kaWRhdGVzLgorICBTVW5pdCAqcGlja09ubHlDaG9pY2UoKTsKKworICB2b2lkIGR1bXBTY2hlZHVsZWRTdGF0ZSgpIGNvbnN0OworfTsKKworLy8vIEJhc2UgY2xhc3MgZm9yIEdlbmVyaWNTY2hlZHVsZXIuIFRoaXMgY2xhc3MgbWFpbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0CisvLy8gc2NoZWR1bGluZyBjYW5kaWRhdGVzIGJhc2VkIG9uIFRhcmdldFNjaGVkTW9kZWwgbWFraW5nIGl0IGVhc3kgdG8gaW1wbGVtZW50CisvLy8gaGV1cmlzdGljcyBmb3IgZWl0aGVyIHByZVJBIG9yIHBvc3RSQSBzY2hlZHVsaW5nLgorY2xhc3MgR2VuZXJpY1NjaGVkdWxlckJhc2UgOiBwdWJsaWMgTWFjaGluZVNjaGVkU3RyYXRlZ3kgeworcHVibGljOgorICAvLy8gUmVwcmVzZW50IHRoZSB0eXBlIG9mIFNjaGVkQ2FuZGlkYXRlIGZvdW5kIHdpdGhpbiBhIHNpbmdsZSBxdWV1ZS4KKyAgLy8vIHBpY2tOb2RlQmlkaXJlY3Rpb25hbCBkZXBlbmRzIG9uIHRoZXNlIGxpc3RlZCBieSBkZWNyZWFzaW5nIHByaW9yaXR5LgorICBlbnVtIENhbmRSZWFzb24gOiB1aW50OF90IHsKKyAgICBOb0NhbmQsIE9ubHkxLCBQaHlzUmVnQ29weSwgUmVnRXhjZXNzLCBSZWdDcml0aWNhbCwgU3RhbGwsIENsdXN0ZXIsIFdlYWssCisgICAgUmVnTWF4LCBSZXNvdXJjZVJlZHVjZSwgUmVzb3VyY2VEZW1hbmQsIEJvdEhlaWdodFJlZHVjZSwgQm90UGF0aFJlZHVjZSwKKyAgICBUb3BEZXB0aFJlZHVjZSwgVG9wUGF0aFJlZHVjZSwgTmV4dERlZlVzZSwgTm9kZU9yZGVyfTsKKworI2lmbmRlZiBOREVCVUcKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmdldFJlYXNvblN0cihHZW5lcmljU2NoZWR1bGVyQmFzZTo6Q2FuZFJlYXNvbiBSZWFzb24pOworI2VuZGlmCisKKyAgLy8vIFBvbGljeSBmb3Igc2NoZWR1bGluZyB0aGUgbmV4dCBpbnN0cnVjdGlvbiBpbiB0aGUgY2FuZGlkYXRlJ3Mgem9uZS4KKyAgc3RydWN0IENhbmRQb2xpY3kgeworICAgIGJvb2wgUmVkdWNlTGF0ZW5jeSA9IGZhbHNlOworICAgIHVuc2lnbmVkIFJlZHVjZVJlc0lkeCA9IDA7CisgICAgdW5zaWduZWQgRGVtYW5kUmVzSWR4ID0gMDsKKworICAgIENhbmRQb2xpY3koKSA9IGRlZmF1bHQ7CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ2FuZFBvbGljeSAmUkhTKSBjb25zdCB7CisgICAgICByZXR1cm4gUmVkdWNlTGF0ZW5jeSA9PSBSSFMuUmVkdWNlTGF0ZW5jeSAmJgorICAgICAgICAgICAgIFJlZHVjZVJlc0lkeCA9PSBSSFMuUmVkdWNlUmVzSWR4ICYmCisgICAgICAgICAgICAgRGVtYW5kUmVzSWR4ID09IFJIUy5EZW1hbmRSZXNJZHg7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDYW5kUG9saWN5ICZSSFMpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhKCp0aGlzID09IFJIUyk7CisgICAgfQorICB9OworCisgIC8vLyBTdGF0dXMgb2YgYW4gaW5zdHJ1Y3Rpb24ncyBjcml0aWNhbCByZXNvdXJjZSBjb25zdW1wdGlvbi4KKyAgc3RydWN0IFNjaGVkUmVzb3VyY2VEZWx0YSB7CisgICAgLy8gQ291bnQgY3JpdGljYWwgcmVzb3VyY2VzIGluIHRoZSBzY2hlZHVsZWQgcmVnaW9uIHJlcXVpcmVkIGJ5IFNVLgorICAgIHVuc2lnbmVkIENyaXRSZXNvdXJjZXMgPSAwOworCisgICAgLy8gQ291bnQgY3JpdGljYWwgcmVzb3VyY2VzIGZyb20gYW5vdGhlciByZWdpb24gY29uc3VtZWQgYnkgU1UuCisgICAgdW5zaWduZWQgRGVtYW5kZWRSZXNvdXJjZXMgPSAwOworCisgICAgU2NoZWRSZXNvdXJjZURlbHRhKCkgPSBkZWZhdWx0OworCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNjaGVkUmVzb3VyY2VEZWx0YSAmUkhTKSBjb25zdCB7CisgICAgICByZXR1cm4gQ3JpdFJlc291cmNlcyA9PSBSSFMuQ3JpdFJlc291cmNlcworICAgICAgICAmJiBEZW1hbmRlZFJlc291cmNlcyA9PSBSSFMuRGVtYW5kZWRSZXNvdXJjZXM7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTY2hlZFJlc291cmNlRGVsdGEgJlJIUykgY29uc3QgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KFJIUyk7CisgICAgfQorICB9OworCisgIC8vLyBTdG9yZSB0aGUgc3RhdGUgdXNlZCBieSBHZW5lcmljU2NoZWR1bGVyIGhldXJpc3RpY3MsIHJlcXVpcmVkIGZvciB0aGUKKyAgLy8vIGxpZmV0aW1lIG9mIG9uZSBpbnZvY2F0aW9uIG9mIHBpY2tOb2RlKCkuCisgIHN0cnVjdCBTY2hlZENhbmRpZGF0ZSB7CisgICAgQ2FuZFBvbGljeSBQb2xpY3k7CisKKyAgICAvLyBUaGUgYmVzdCBTVW5pdCBjYW5kaWRhdGUuCisgICAgU1VuaXQgKlNVOworCisgICAgLy8gVGhlIHJlYXNvbiBmb3IgdGhpcyBjYW5kaWRhdGUuCisgICAgQ2FuZFJlYXNvbiBSZWFzb247CisKKyAgICAvLyBXaGV0aGVyIHRoaXMgY2FuZGlkYXRlIHNob3VsZCBiZSBzY2hlZHVsZWQgYXQgdG9wL2JvdHRvbS4KKyAgICBib29sIEF0VG9wOworCisgICAgLy8gUmVnaXN0ZXIgcHJlc3N1cmUgdmFsdWVzIGZvciB0aGUgYmVzdCBjYW5kaWRhdGUuCisgICAgUmVnUHJlc3N1cmVEZWx0YSBSUERlbHRhOworCisgICAgLy8gQ3JpdGljYWwgcmVzb3VyY2UgY29uc3VtcHRpb24gb2YgdGhlIGJlc3QgY2FuZGlkYXRlLgorICAgIFNjaGVkUmVzb3VyY2VEZWx0YSBSZXNEZWx0YTsKKworICAgIFNjaGVkQ2FuZGlkYXRlKCkgeyByZXNldChDYW5kUG9saWN5KCkpOyB9CisgICAgU2NoZWRDYW5kaWRhdGUoY29uc3QgQ2FuZFBvbGljeSAmUG9saWN5KSB7IHJlc2V0KFBvbGljeSk7IH0KKworICAgIHZvaWQgcmVzZXQoY29uc3QgQ2FuZFBvbGljeSAmTmV3UG9saWN5KSB7CisgICAgICBQb2xpY3kgPSBOZXdQb2xpY3k7CisgICAgICBTVSA9IG51bGxwdHI7CisgICAgICBSZWFzb24gPSBOb0NhbmQ7CisgICAgICBBdFRvcCA9IGZhbHNlOworICAgICAgUlBEZWx0YSA9IFJlZ1ByZXNzdXJlRGVsdGEoKTsKKyAgICAgIFJlc0RlbHRhID0gU2NoZWRSZXNvdXJjZURlbHRhKCk7CisgICAgfQorCisgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gU1U7IH0KKworICAgIC8vIENvcHkgdGhlIHN0YXR1cyBvZiBhbm90aGVyIGNhbmRpZGF0ZSB3aXRob3V0IGNoYW5naW5nIHBvbGljeS4KKyAgICB2b2lkIHNldEJlc3QoU2NoZWRDYW5kaWRhdGUgJkJlc3QpIHsKKyAgICAgIGFzc2VydChCZXN0LlJlYXNvbiAhPSBOb0NhbmQgJiYgInVuaW5pdGlhbGl6ZWQgU2NoZWQgY2FuZGlkYXRlIik7CisgICAgICBTVSA9IEJlc3QuU1U7CisgICAgICBSZWFzb24gPSBCZXN0LlJlYXNvbjsKKyAgICAgIEF0VG9wID0gQmVzdC5BdFRvcDsKKyAgICAgIFJQRGVsdGEgPSBCZXN0LlJQRGVsdGE7CisgICAgICBSZXNEZWx0YSA9IEJlc3QuUmVzRGVsdGE7CisgICAgfQorCisgICAgdm9pZCBpbml0UmVzb3VyY2VEZWx0YShjb25zdCBTY2hlZHVsZURBR01JICpEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRTY2hlZE1vZGVsICpTY2hlZE1vZGVsKTsKKyAgfTsKKworcHJvdGVjdGVkOgorICBjb25zdCBNYWNoaW5lU2NoZWRDb250ZXh0ICpDb250ZXh0OworICBjb25zdCBUYXJnZXRTY2hlZE1vZGVsICpTY2hlZE1vZGVsID0gbnVsbHB0cjsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBudWxscHRyOworCisgIFNjaGVkUmVtYWluZGVyIFJlbTsKKworICBHZW5lcmljU2NoZWR1bGVyQmFzZShjb25zdCBNYWNoaW5lU2NoZWRDb250ZXh0ICpDKSA6IENvbnRleHQoQykge30KKworICB2b2lkIHNldFBvbGljeShDYW5kUG9saWN5ICZQb2xpY3ksIGJvb2wgSXNQb3N0UkEsIFNjaGVkQm91bmRhcnkgJkN1cnJab25lLAorICAgICAgICAgICAgICAgICBTY2hlZEJvdW5kYXJ5ICpPdGhlclpvbmUpOworCisjaWZuZGVmIE5ERUJVRworICB2b2lkIHRyYWNlQ2FuZGlkYXRlKGNvbnN0IFNjaGVkQ2FuZGlkYXRlICZDYW5kKTsKKyNlbmRpZgorfTsKKworLy8vIEdlbmVyaWNTY2hlZHVsZXIgc2hyaW5rcyB0aGUgdW5zY2hlZHVsZWQgem9uZSB1c2luZyBoZXVyaXN0aWNzIHRvIGJhbGFuY2UKKy8vLyB0aGUgc2NoZWR1bGUuCitjbGFzcyBHZW5lcmljU2NoZWR1bGVyIDogcHVibGljIEdlbmVyaWNTY2hlZHVsZXJCYXNlIHsKK3B1YmxpYzoKKyAgR2VuZXJpY1NjaGVkdWxlcihjb25zdCBNYWNoaW5lU2NoZWRDb250ZXh0ICpDKToKKyAgICBHZW5lcmljU2NoZWR1bGVyQmFzZShDKSwgVG9wKFNjaGVkQm91bmRhcnk6OlRvcFFJRCwgIlRvcFEiKSwKKyAgICBCb3QoU2NoZWRCb3VuZGFyeTo6Qm90UUlELCAiQm90USIpIHt9CisKKyAgdm9pZCBpbml0UG9saWN5KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBCZWdpbiwKKyAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBFbmQsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1SZWdpb25JbnN0cnMpIG92ZXJyaWRlOworCisgIHZvaWQgZHVtcFBvbGljeSgpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgc2hvdWxkVHJhY2tQcmVzc3VyZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUmVnaW9uUG9saWN5LlNob3VsZFRyYWNrUHJlc3N1cmU7CisgIH0KKworICBib29sIHNob3VsZFRyYWNrTGFuZU1hc2tzKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBSZWdpb25Qb2xpY3kuU2hvdWxkVHJhY2tMYW5lTWFza3M7CisgIH0KKworICB2b2lkIGluaXRpYWxpemUoU2NoZWR1bGVEQUdNSSAqZGFnKSBvdmVycmlkZTsKKworICBTVW5pdCAqcGlja05vZGUoYm9vbCAmSXNUb3BOb2RlKSBvdmVycmlkZTsKKworICB2b2lkIHNjaGVkTm9kZShTVW5pdCAqU1UsIGJvb2wgSXNUb3BOb2RlKSBvdmVycmlkZTsKKworICB2b2lkIHJlbGVhc2VUb3BOb2RlKFNVbml0ICpTVSkgb3ZlcnJpZGUgeworICAgIGlmIChTVS0+aXNTY2hlZHVsZWQpCisgICAgICByZXR1cm47CisKKyAgICBUb3AucmVsZWFzZU5vZGUoU1UsIFNVLT5Ub3BSZWFkeUN5Y2xlKTsKKyAgICBUb3BDYW5kLlNVID0gbnVsbHB0cjsKKyAgfQorCisgIHZvaWQgcmVsZWFzZUJvdHRvbU5vZGUoU1VuaXQgKlNVKSBvdmVycmlkZSB7CisgICAgaWYgKFNVLT5pc1NjaGVkdWxlZCkKKyAgICAgIHJldHVybjsKKworICAgIEJvdC5yZWxlYXNlTm9kZShTVSwgU1UtPkJvdFJlYWR5Q3ljbGUpOworICAgIEJvdENhbmQuU1UgPSBudWxscHRyOworICB9CisKKyAgdm9pZCByZWdpc3RlclJvb3RzKCkgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgU2NoZWR1bGVEQUdNSUxpdmUgKkRBRyA9IG51bGxwdHI7CisKKyAgTWFjaGluZVNjaGVkUG9saWN5IFJlZ2lvblBvbGljeTsKKworICAvLyBTdGF0ZSBvZiB0aGUgdG9wIGFuZCBib3R0b20gc2NoZWR1bGVkIGluc3RydWN0aW9uIGJvdW5kYXJpZXMuCisgIFNjaGVkQm91bmRhcnkgVG9wOworICBTY2hlZEJvdW5kYXJ5IEJvdDsKKworICAvLy8gQ2FuZGlkYXRlIGxhc3QgcGlja2VkIGZyb20gVG9wIGJvdW5kYXJ5LgorICBTY2hlZENhbmRpZGF0ZSBUb3BDYW5kOworICAvLy8gQ2FuZGlkYXRlIGxhc3QgcGlja2VkIGZyb20gQm90IGJvdW5kYXJ5LgorICBTY2hlZENhbmRpZGF0ZSBCb3RDYW5kOworCisgIHZvaWQgY2hlY2tBY3ljbGljTGF0ZW5jeSgpOworCisgIHZvaWQgaW5pdENhbmRpZGF0ZShTY2hlZENhbmRpZGF0ZSAmQ2FuZCwgU1VuaXQgKlNVLCBib29sIEF0VG9wLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVnUHJlc3N1cmVUcmFja2VyICZSUFRyYWNrZXIsCisgICAgICAgICAgICAgICAgICAgICBSZWdQcmVzc3VyZVRyYWNrZXIgJlRlbXBUcmFja2VyKTsKKworICB2b2lkIHRyeUNhbmRpZGF0ZShTY2hlZENhbmRpZGF0ZSAmQ2FuZCwKKyAgICAgICAgICAgICAgICAgICAgU2NoZWRDYW5kaWRhdGUgJlRyeUNhbmQsCisgICAgICAgICAgICAgICAgICAgIFNjaGVkQm91bmRhcnkgKlpvbmUpOworCisgIFNVbml0ICpwaWNrTm9kZUJpZGlyZWN0aW9uYWwoYm9vbCAmSXNUb3BOb2RlKTsKKworICB2b2lkIHBpY2tOb2RlRnJvbVF1ZXVlKFNjaGVkQm91bmRhcnkgJlpvbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ2FuZFBvbGljeSAmWm9uZVBvbGljeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWdQcmVzc3VyZVRyYWNrZXIgJlJQVHJhY2tlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTY2hlZENhbmRpZGF0ZSAmQ2FuZGlkYXRlKTsKKworICB2b2lkIHJlc2NoZWR1bGVQaHlzUmVnQ29waWVzKFNVbml0ICpTVSwgYm9vbCBpc1RvcCk7Cit9OworCisvLy8gUG9zdEdlbmVyaWNTY2hlZHVsZXIgLSBJbnRlcmZhY2UgdG8gdGhlIHNjaGVkdWxpbmcgYWxnb3JpdGhtIHVzZWQgYnkKKy8vLyBTY2hlZHVsZURBR01JLgorLy8vCisvLy8gQ2FsbGJhY2tzIGZyb20gU2NoZWR1bGVEQUdNSToKKy8vLyAgIGluaXRQb2xpY3kgLT4gaW5pdGlhbGl6ZShEQUcpIC0+IHJlZ2lzdGVyUm9vdHMgLT4gcGlja05vZGUgLi4uCitjbGFzcyBQb3N0R2VuZXJpY1NjaGVkdWxlciA6IHB1YmxpYyBHZW5lcmljU2NoZWR1bGVyQmFzZSB7CisgIFNjaGVkdWxlREFHTUkgKkRBRzsKKyAgU2NoZWRCb3VuZGFyeSBUb3A7CisgIFNtYWxsVmVjdG9yPFNVbml0KiwgOD4gQm90Um9vdHM7CisKK3B1YmxpYzoKKyAgUG9zdEdlbmVyaWNTY2hlZHVsZXIoY29uc3QgTWFjaGluZVNjaGVkQ29udGV4dCAqQyk6CisgICAgR2VuZXJpY1NjaGVkdWxlckJhc2UoQyksIFRvcChTY2hlZEJvdW5kYXJ5OjpUb3BRSUQsICJUb3BRIikge30KKworICB+UG9zdEdlbmVyaWNTY2hlZHVsZXIoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBpbml0UG9saWN5KE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBCZWdpbiwKKyAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBFbmQsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1SZWdpb25JbnN0cnMpIG92ZXJyaWRlIHsKKyAgICAvKiBubyBjb25maWd1cmFibGUgcG9saWN5ICovCisgIH0KKworICAvLy8gUG9zdFJBIHNjaGVkdWxpbmcgZG9lcyBub3QgdHJhY2sgcHJlc3N1cmUuCisgIGJvb2wgc2hvdWxkVHJhY2tQcmVzc3VyZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgdm9pZCBpbml0aWFsaXplKFNjaGVkdWxlREFHTUkgKkRhZykgb3ZlcnJpZGU7CisKKyAgdm9pZCByZWdpc3RlclJvb3RzKCkgb3ZlcnJpZGU7CisKKyAgU1VuaXQgKnBpY2tOb2RlKGJvb2wgJklzVG9wTm9kZSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBzY2hlZHVsZVRyZWUodW5zaWduZWQgU3VidHJlZUlEKSBvdmVycmlkZSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiUG9zdFJBIHNjaGVkdWxlciBkb2VzIG5vdCBzdXBwb3J0IHN1YnRyZWUgYW5hbHlzaXMuIik7CisgIH0KKworICB2b2lkIHNjaGVkTm9kZShTVW5pdCAqU1UsIGJvb2wgSXNUb3BOb2RlKSBvdmVycmlkZTsKKworICB2b2lkIHJlbGVhc2VUb3BOb2RlKFNVbml0ICpTVSkgb3ZlcnJpZGUgeworICAgIGlmIChTVS0+aXNTY2hlZHVsZWQpCisgICAgICByZXR1cm47CisgICAgVG9wLnJlbGVhc2VOb2RlKFNVLCBTVS0+VG9wUmVhZHlDeWNsZSk7CisgIH0KKworICAvLyBPbmx5IGNhbGxlZCBmb3Igcm9vdHMuCisgIHZvaWQgcmVsZWFzZUJvdHRvbU5vZGUoU1VuaXQgKlNVKSBvdmVycmlkZSB7CisgICAgQm90Um9vdHMucHVzaF9iYWNrKFNVKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHZvaWQgdHJ5Q2FuZGlkYXRlKFNjaGVkQ2FuZGlkYXRlICZDYW5kLCBTY2hlZENhbmRpZGF0ZSAmVHJ5Q2FuZCk7CisKKyAgdm9pZCBwaWNrTm9kZUZyb21RdWV1ZShTY2hlZENhbmRpZGF0ZSAmQ2FuZCk7Cit9OworCisvLy8gQ3JlYXRlIHRoZSBzdGFuZGFyZCBjb252ZXJnaW5nIG1hY2hpbmUgc2NoZWR1bGVyLiBUaGlzIHdpbGwgYmUgdXNlZCBhcyB0aGUKKy8vLyBkZWZhdWx0IHNjaGVkdWxlciBpZiB0aGUgdGFyZ2V0IGRvZXMgbm90IHNldCBhIGRlZmF1bHQuCisvLy8gQWRkcyBkZWZhdWx0IERBRyBtdXRhdGlvbnMuCitTY2hlZHVsZURBR01JTGl2ZSAqY3JlYXRlR2VuZXJpY1NjaGVkTGl2ZShNYWNoaW5lU2NoZWRDb250ZXh0ICpDKTsKKworLy8vIENyZWF0ZSBhIGdlbmVyaWMgc2NoZWR1bGVyIHdpdGggbm8gdnJlZyBsaXZlbmVzcyBvciBEQUcgbXV0YXRpb24gcGFzc2VzLgorU2NoZWR1bGVEQUdNSSAqY3JlYXRlR2VuZXJpY1NjaGVkUG9zdFJBKE1hY2hpbmVTY2hlZENvbnRleHQgKkMpOworCitzdGQ6OnVuaXF1ZV9wdHI8U2NoZWR1bGVEQUdNdXRhdGlvbj4KK2NyZWF0ZUxvYWRDbHVzdGVyREFHTXV0YXRpb24oY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKTsKKworc3RkOjp1bmlxdWVfcHRyPFNjaGVkdWxlREFHTXV0YXRpb24+CitjcmVhdGVTdG9yZUNsdXN0ZXJEQUdNdXRhdGlvbihjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKTsKKworc3RkOjp1bmlxdWVfcHRyPFNjaGVkdWxlREFHTXV0YXRpb24+CitjcmVhdGVDb3B5Q29uc3RyYWluREFHTXV0YXRpb24oY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX01BQ0hJTkVTQ0hFRFVMRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL01hY2hpbmVUcmFjZU1ldHJpY3MuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lVHJhY2VNZXRyaWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQ4ZGIzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNoaW5lVHJhY2VNZXRyaWNzLmgKQEAgLTAsMCArMSw0MzYgQEAKKy8vPT09LSBsaWIvQ29kZUdlbi9NYWNoaW5lVHJhY2VNZXRyaWNzLmggLSBTdXBlci1zY2FsYXIgbWV0cmljcyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGludGVyZmFjZSBmb3IgdGhlIE1hY2hpbmVUcmFjZU1ldHJpY3MgYW5hbHlzaXMgcGFzcworLy8gdGhhdCBlc3RpbWF0ZXMgQ1BVIHJlc291cmNlIHVzYWdlIGFuZCBjcml0aWNhbCBkYXRhIGRlcGVuZGVuY3kgcGF0aHMgdGhyb3VnaAorLy8gcHJlZmVycmVkIHRyYWNlcy4gVGhpcyBpcyB1c2VmdWwgZm9yIHN1cGVyLXNjYWxhciBDUFVzIHdoZXJlIGV4ZWN1dGlvbiBzcGVlZAorLy8gY2FuIGJlIGxpbWl0ZWQgYm90aCBieSBkYXRhIGRlcGVuZGVuY2llcyBhbmQgYnkgbGltaXRlZCBleGVjdXRpb24gcmVzb3VyY2VzLgorLy8KKy8vIE91dC1vZi1vcmRlciBDUFVzIHdpbGwgb2Z0ZW4gYmUgZXhlY3V0aW5nIGluc3RydWN0aW9ucyBmcm9tIG11bHRpcGxlIGJhc2ljCisvLyBibG9ja3MgYXQgdGhlIHNhbWUgdGltZS4gVGhpcyBtYWtlcyBpdCBkaWZmaWN1bHQgdG8gZXN0aW1hdGUgdGhlIHJlc291cmNlCisvLyB1c2FnZSBhY2N1cmF0ZWx5IGluIGEgc2luZ2xlIGJhc2ljIGJsb2NrLiBSZXNvdXJjZXMgY2FuIGJlIGVzdGltYXRlZCBiZXR0ZXIKKy8vIGJ5IGxvb2tpbmcgYXQgYSB0cmFjZSB0aHJvdWdoIHRoZSBjdXJyZW50IGJhc2ljIGJsb2NrLgorLy8KKy8vIEZvciBldmVyeSBibG9jaywgdGhlIE1hY2hpbmVUcmFjZU1ldHJpY3MgcGFzcyB3aWxsIHBpY2sgYSBwcmVmZXJyZWQgdHJhY2UKKy8vIHRoYXQgcGFzc2VzIHRocm91Z2ggdGhlIGJsb2NrLiBUaGUgdHJhY2UgaXMgY2hvc2VuIGJhc2VkIG9uIGxvb3Agc3RydWN0dXJlLAorLy8gYnJhbmNoIHByb2JhYmlsaXRpZXMsIGFuZCByZXNvdXJjZSB1c2FnZS4gVGhlIGludGVudGlvbiBpcyB0byBwaWNrIGxpa2VseQorLy8gdHJhY2VzIHRoYXQgd291bGQgYmUgdGhlIG1vc3QgYWZmZWN0ZWQgYnkgY29kZSB0cmFuc2Zvcm1hdGlvbnMuCisvLworLy8gSXQgaXMgZXhwZW5zaXZlIHRvIGNvbXB1dGUgYSBmdWxsIGFyYml0cmFyeSB0cmFjZSBmb3IgZXZlcnkgYmxvY2ssIHNvIHRvCisvLyBzYXZlIHNvbWUgY29tcHV0YXRpb25zLCB0cmFjZXMgYXJlIGNob3NlbiB0byBiZSBjb252ZXJnZW50LiBUaGlzIG1lYW5zIHRoYXQKKy8vIGlmIHRoZSB0cmFjZXMgdGhyb3VnaCBiYXNpYyBibG9ja3MgQSBhbmQgQiBldmVyIGNyb3NzIHdoZW4gbW92aW5nIGF3YXkgZnJvbQorLy8gQSBhbmQgQiwgdGhleSBuZXZlciBkaXZlcmdlIGFnYWluLiBUaGlzIGFwcGxpZXMgaW4gYm90aCBkaXJlY3Rpb25zIC0gSWYgdGhlCisvLyB0cmFjZXMgbWVldCBhYm92ZSBBIGFuZCBCLCB0aGV5IHdvbid0IGRpdmVyZ2Ugd2hlbiBnb2luZyBmdXJ0aGVyIGJhY2suCisvLworLy8gVHJhY2VzIHRlbmQgdG8gYWxpZ24gd2l0aCBsb29wcy4gVGhlIHRyYWNlIHRocm91Z2ggYSBibG9jayBpbiBhbiBpbm5lciBsb29wCisvLyB3aWxsIGJlZ2luIGF0IHRoZSBsb29wIGVudHJ5IGJsb2NrIGFuZCBlbmQgYXQgYSBiYWNrIGVkZ2UuIElmIHRoZXJlIGFyZQorLy8gbmVzdGVkIGxvb3BzLCB0aGUgdHJhY2UgbWF5IGJlZ2luIGFuZCBlbmQgYXQgdGhvc2UgaW5zdGVhZC4KKy8vCisvLyBGb3IgZWFjaCB0cmFjZSwgd2UgY29tcHV0ZSB0aGUgY3JpdGljYWwgcGF0aCBsZW5ndGgsIHdoaWNoIGlzIHRoZSBudW1iZXIgb2YKKy8vIGN5Y2xlcyByZXF1aXJlZCB0byBleGVjdXRlIHRoZSB0cmFjZSB3aGVuIGV4ZWN1dGlvbiBpcyBsaW1pdGVkIGJ5IGRhdGEKKy8vIGRlcGVuZGVuY2llcyBvbmx5LiBXZSBhbHNvIGNvbXB1dGUgdGhlIHJlc291cmNlIGhlaWdodCwgd2hpY2ggaXMgdGhlIG51bWJlcgorLy8gb2YgY3ljbGVzIHJlcXVpcmVkIHRvIGV4ZWN1dGUgYWxsIGluc3RydWN0aW9ucyBpbiB0aGUgdHJhY2Ugd2hlbiBpZ25vcmluZworLy8gZGF0YSBkZXBlbmRlbmNpZXMuCisvLworLy8gRXZlcnkgaW5zdHJ1Y3Rpb24gaW4gdGhlIGN1cnJlbnQgYmxvY2sgaGFzIGEgc2xhY2sgLSB0aGUgbnVtYmVyIG9mIGN5Y2xlcworLy8gZXhlY3V0aW9uIG9mIHRoZSBpbnN0cnVjdGlvbiBjYW4gYmUgZGVsYXllZCB3aXRob3V0IGV4dGVuZGluZyB0aGUgY3JpdGljYWwKKy8vIHBhdGguCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fTUFDSElORVRSQUNFTUVUUklDU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9NQUNISU5FVFJBQ0VNRVRSSUNTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NwYXJzZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ob25lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRTY2hlZHVsZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFuYWx5c2lzVXNhZ2U7CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBNYWNoaW5lTG9vcDsKK2NsYXNzIE1hY2hpbmVMb29wSW5mbzsKK2NsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CitzdHJ1Y3QgTUNTY2hlZENsYXNzRGVzYzsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworCisvLyBLZWVwIHRyYWNrIG9mIHBoeXNyZWcgZGF0YSBkZXBlbmRlbmNpZXMgYnkgcmVjb3JkaW5nIGVhY2ggbGl2ZSByZWdpc3RlciB1bml0LgorLy8gQXNzb2NpYXRlIGVhY2ggcmVndW5pdCB3aXRoIGFuIGluc3RydWN0aW9uIG9wZXJhbmQuIERlcGVuZGluZyBvbiB0aGUKKy8vIGRpcmVjdGlvbiBpbnN0cnVjdGlvbnMgYXJlIHNjYW5uZWQsIGl0IGNvdWxkIGJlIHRoZSBvcGVyYW5kIHRoYXQgZGVmaW5lZCB0aGUKKy8vIHJlZ3VuaXQsIG9yIHRoZSBoaWdoZXN0IG9wZXJhbmQgdG8gcmVhZCB0aGUgcmVndW5pdC4KK3N0cnVjdCBMaXZlUmVnVW5pdCB7CisgIHVuc2lnbmVkIFJlZ1VuaXQ7CisgIHVuc2lnbmVkIEN5Y2xlID0gMDsKKyAgY29uc3QgTWFjaGluZUluc3RyICpNSSA9IG51bGxwdHI7CisgIHVuc2lnbmVkIE9wID0gMDsKKworICB1bnNpZ25lZCBnZXRTcGFyc2VTZXRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIFJlZ1VuaXQ7IH0KKworICBMaXZlUmVnVW5pdCh1bnNpZ25lZCBSVSkgOiBSZWdVbml0KFJVKSB7fQorfTsKKworCitjbGFzcyBNYWNoaW5lVHJhY2VNZXRyaWNzIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GID0gbnVsbHB0cjsKKyAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICpUSUkgPSBudWxscHRyOworICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSA9IG51bGxwdHI7CisgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSSA9IG51bGxwdHI7CisgIGNvbnN0IE1hY2hpbmVMb29wSW5mbyAqTG9vcHMgPSBudWxscHRyOworICBUYXJnZXRTY2hlZE1vZGVsIFNjaGVkTW9kZWw7CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIEVuc2VtYmxlOworICBmcmllbmQgY2xhc3MgVHJhY2U7CisKKyAgY2xhc3MgRW5zZW1ibGU7CisKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgTWFjaGluZVRyYWNlTWV0cmljcygpOworCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlJikgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uJikgb3ZlcnJpZGU7CisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIG92ZXJyaWRlOworICB2b2lkIHZlcmlmeUFuYWx5c2lzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIFBlci1iYXNpYyBibG9jayBpbmZvcm1hdGlvbiB0aGF0IGRvZXNuJ3QgZGVwZW5kIG9uIHRoZSB0cmFjZSB0aHJvdWdoIHRoZQorICAvLy8gYmxvY2suCisgIHN0cnVjdCBGaXhlZEJsb2NrSW5mbyB7CisgICAgLy8vIFRoZSBudW1iZXIgb2Ygbm9uLXRyaXZpYWwgaW5zdHJ1Y3Rpb25zIGluIHRoZSBibG9jay4KKyAgICAvLy8gRG9lc24ndCBjb3VudCBQSEkgYW5kIENPUFkgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIGxpa2VseSB0byBiZSByZW1vdmVkLgorICAgIHVuc2lnbmVkIEluc3RyQ291bnQgPSB+MHU7CisKKyAgICAvLy8gVHJ1ZSB3aGVuIHRoZSBibG9jayBjb250YWlucyBjYWxscy4KKyAgICBib29sIEhhc0NhbGxzID0gZmFsc2U7CisKKyAgICBGaXhlZEJsb2NrSW5mbygpID0gZGVmYXVsdDsKKworICAgIC8vLyBSZXR1cm5zIHRydWUgd2hlbiByZXNvdXJjZSBpbmZvcm1hdGlvbiBmb3IgdGhpcyBibG9jayBoYXMgYmVlbiBjb21wdXRlZC4KKyAgICBib29sIGhhc1Jlc291cmNlcygpIGNvbnN0IHsgcmV0dXJuIEluc3RyQ291bnQgIT0gfjB1OyB9CisKKyAgICAvLy8gSW52YWxpZGF0ZSByZXNvdXJjZSBpbmZvcm1hdGlvbi4KKyAgICB2b2lkIGludmFsaWRhdGUoKSB7IEluc3RyQ291bnQgPSB+MHU7IH0KKyAgfTsKKworICAvLy8gR2V0IHRoZSBmaXhlZCByZXNvdXJjZSBpbmZvcm1hdGlvbiBhYm91dCBNQkIuIENvbXB1dGUgaXQgb24gZGVtYW5kLgorICBjb25zdCBGaXhlZEJsb2NrSW5mbyAqZ2V0UmVzb3VyY2VzKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrKik7CisKKyAgLy8vIEdldCB0aGUgc2NhbGVkIG51bWJlciBvZiBjeWNsZXMgdXNlZCBwZXIgcHJvY2Vzc29yIHJlc291cmNlIGluIE1CQi4KKyAgLy8vIFRoaXMgaXMgYW4gYXJyYXkgd2l0aCBTY2hlZE1vZGVsLmdldE51bVByb2NSZXNvdXJjZUtpbmRzKCkgZW50cmllcy4KKyAgLy8vIFRoZSBnZXRSZXNvdXJjZXMoKSBmdW5jdGlvbiBhYm92ZSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgZmlyc3QuCisgIC8vLworICAvLy8gVGhlc2UgbnVtYmVycyBoYXZlIGFscmVhZHkgYmVlbiBzY2FsZWQgYnkgU2NoZWRNb2RlbC5nZXRSZXNvdXJjZUZhY3RvcigpLgorICBBcnJheVJlZjx1bnNpZ25lZD4gZ2V0UHJvY1Jlc291cmNlQ3ljbGVzKHVuc2lnbmVkIE1CQk51bSkgY29uc3Q7CisKKyAgLy8vIEEgdmlydHVhbCByZWdpc3RlciBvciByZWd1bml0IHJlcXVpcmVkIGJ5IGEgYmFzaWMgYmxvY2sgb3IgaXRzIHRyYWNlCisgIC8vLyBzdWNjZXNzb3JzLgorICBzdHJ1Y3QgTGl2ZUluUmVnIHsKKyAgICAvLy8gVGhlIHZpcnR1YWwgcmVnaXN0ZXIgcmVxdWlyZWQsIG9yIGEgcmVnaXN0ZXIgdW5pdC4KKyAgICB1bnNpZ25lZCBSZWc7CisKKyAgICAvLy8gRm9yIHZpcnR1YWwgcmVnaXN0ZXJzOiBNaW5pbXVtIGhlaWdodCBvZiB0aGUgZGVmaW5pbmcgaW5zdHJ1Y3Rpb24uCisgICAgLy8vIEZvciByZWd1bml0czogSGVpZ2h0IG9mIHRoZSBoaWdoZXN0IHVzZXIgaW4gdGhlIHRyYWNlLgorICAgIHVuc2lnbmVkIEhlaWdodDsKKworICAgIExpdmVJblJlZyh1bnNpZ25lZCBSZWcsIHVuc2lnbmVkIEhlaWdodCA9IDApIDogUmVnKFJlZyksIEhlaWdodChIZWlnaHQpIHt9CisgIH07CisKKyAgLy8vIFBlci1iYXNpYyBibG9jayBpbmZvcm1hdGlvbiB0aGF0IHJlbGF0ZXMgdG8gYSBzcGVjaWZpYyB0cmFjZSB0aHJvdWdoIHRoZQorICAvLy8gYmxvY2suIENvbnZlcmdlbnQgdHJhY2VzIG1lYW5zIHRoYXQgb25seSBvbmUgb2YgdGhlc2UgaXMgcmVxdWlyZWQgcGVyCisgIC8vLyBibG9jayBpbiBhIHRyYWNlIGVuc2VtYmxlLgorICBzdHJ1Y3QgVHJhY2VCbG9ja0luZm8geworICAgIC8vLyBUcmFjZSBwcmVkZWNlc3Nvciwgb3IgTlVMTCBmb3IgdGhlIGZpcnN0IGJsb2NrIGluIHRoZSB0cmFjZS4KKyAgICAvLy8gVmFsaWQgd2hlbiBoYXNWYWxpZERlcHRoKCkuCisgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKlByZWQgPSBudWxscHRyOworCisgICAgLy8vIFRyYWNlIHN1Y2Nlc3Nvciwgb3IgTlVMTCBmb3IgdGhlIGxhc3QgYmxvY2sgaW4gdGhlIHRyYWNlLgorICAgIC8vLyBWYWxpZCB3aGVuIGhhc1ZhbGlkSGVpZ2h0KCkuCisgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKlN1Y2MgPSBudWxscHRyOworCisgICAgLy8vIFRoZSBibG9jayBudW1iZXIgb2YgdGhlIGhlYWQgb2YgdGhlIHRyYWNlLiAoV2hlbiBoYXNWYWxpZERlcHRoKCkpLgorICAgIHVuc2lnbmVkIEhlYWQ7CisKKyAgICAvLy8gVGhlIGJsb2NrIG51bWJlciBvZiB0aGUgdGFpbCBvZiB0aGUgdHJhY2UuIChXaGVuIGhhc1ZhbGlkSGVpZ2h0KCkpLgorICAgIHVuc2lnbmVkIFRhaWw7CisKKyAgICAvLy8gQWNjdW11bGF0ZWQgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbiB0aGUgdHJhY2UgYWJvdmUgdGhpcyBibG9jay4KKyAgICAvLy8gRG9lcyBub3QgaW5jbHVkZSBpbnN0cnVjdGlvbnMgaW4gdGhpcyBibG9jay4KKyAgICB1bnNpZ25lZCBJbnN0ckRlcHRoID0gfjB1OworCisgICAgLy8vIEFjY3VtdWxhdGVkIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgaW4gdGhlIHRyYWNlIGJlbG93IHRoaXMgYmxvY2suCisgICAgLy8vIEluY2x1ZGVzIGluc3RydWN0aW9ucyBpbiB0aGlzIGJsb2NrLgorICAgIHVuc2lnbmVkIEluc3RySGVpZ2h0ID0gfjB1OworCisgICAgVHJhY2VCbG9ja0luZm8oKSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBkZXB0aCByZXNvdXJjZXMgaGF2ZSBiZWVuIGNvbXB1dGVkIGZyb20gdGhlIHRyYWNlCisgICAgLy8vIGFib3ZlIHRoaXMgYmxvY2suCisgICAgYm9vbCBoYXNWYWxpZERlcHRoKCkgY29uc3QgeyByZXR1cm4gSW5zdHJEZXB0aCAhPSB+MHU7IH0KKworICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGhlaWdodCByZXNvdXJjZXMgaGF2ZSBiZWVuIGNvbXB1dGVkIGZyb20gdGhlIHRyYWNlCisgICAgLy8vIGJlbG93IHRoaXMgYmxvY2suCisgICAgYm9vbCBoYXNWYWxpZEhlaWdodCgpIGNvbnN0IHsgcmV0dXJuIEluc3RySGVpZ2h0ICE9IH4wdTsgfQorCisgICAgLy8vIEludmFsaWRhdGUgZGVwdGggcmVzb3VyY2VzIHdoZW4gc29tZSBibG9jayBhYm92ZSB0aGlzIG9uZSBoYXMgY2hhbmdlZC4KKyAgICB2b2lkIGludmFsaWRhdGVEZXB0aCgpIHsgSW5zdHJEZXB0aCA9IH4wdTsgSGFzVmFsaWRJbnN0ckRlcHRocyA9IGZhbHNlOyB9CisKKyAgICAvLy8gSW52YWxpZGF0ZSBoZWlnaHQgcmVzb3VyY2VzIHdoZW4gYSBibG9jayBiZWxvdyB0aGlzIG9uZSBoYXMgY2hhbmdlZC4KKyAgICB2b2lkIGludmFsaWRhdGVIZWlnaHQoKSB7IEluc3RySGVpZ2h0ID0gfjB1OyBIYXNWYWxpZEluc3RySGVpZ2h0cyA9IGZhbHNlOyB9CisKKyAgICAvLy8gQXNzdW1pbmcgdGhhdCB0aGlzIGlzIGEgZG9taW5hdG9yIG9mIFRCSSwgZGV0ZXJtaW5lIGlmIGl0IGNvbnRhaW5zCisgICAgLy8vIHVzZWZ1bCBpbnN0cnVjdGlvbiBkZXB0aHMuIEEgZG9taW5hdGluZyBibG9jayBjYW4gYmUgYWJvdmUgdGhlIGN1cnJlbnQKKyAgICAvLy8gdHJhY2UgaGVhZCwgYW5kIGFueSBkZXBlbmRlbmNpZXMgZnJvbSBzdWNoIGEgZmFyIGF3YXkgZG9taW5hdG9yIGFyZSBub3QKKyAgICAvLy8gZXhwZWN0ZWQgdG8gYWZmZWN0IHRoZSBjcml0aWNhbCBwYXRoLgorICAgIC8vLworICAgIC8vLyBBbHNvIHJldHVybnMgdHJ1ZSB3aGVuIFRCSSA9PSB0aGlzLgorICAgIGJvb2wgaXNVc2VmdWxEb21pbmF0b3IoY29uc3QgVHJhY2VCbG9ja0luZm8gJlRCSSkgY29uc3QgeworICAgICAgLy8gVGhlIHRyYWNlIGZvciBUQkkgbWF5IG5vdCBldmVuIGJlIGNhbGN1bGF0ZWQgeWV0LgorICAgICAgaWYgKCFoYXNWYWxpZERlcHRoKCkgfHwgIVRCSS5oYXNWYWxpZERlcHRoKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIC8vIEluc3RydWN0aW9uIGRlcHRocyBhcmUgb25seSBjb21wYXJhYmxlIGlmIHRoZSB0cmFjZXMgc2hhcmUgYSBoZWFkLgorICAgICAgaWYgKEhlYWQgIT0gVEJJLkhlYWQpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIC8vIEl0IGlzIGFsbW9zdCBhbHdheXMgdGhlIGNhc2UgdGhhdCBUQkkgYmVsb25ncyB0byB0aGUgc2FtZSB0cmFjZSBhcworICAgICAgLy8gdGhpcyBibG9jaywgYnV0IHJhcmUgY29udm9sdXRlZCBjYXNlcyBpbnZvbHZpbmcgaXJyZWR1Y2libGUgY29udHJvbAorICAgICAgLy8gZmxvdywgYSBkb21pbmF0b3IgbWF5IHNoYXJlIGEgdHJhY2UgaGVhZCB3aXRob3V0IGFjdHVhbGx5IGJlaW5nIG9uIHRoZQorICAgICAgLy8gc2FtZSB0cmFjZSBhcyBUQkkuIFRoaXMgaXMgbm90IGEgYmlnIHByb2JsZW0gYXMgbG9uZyBhcyBpdCBkb2Vzbid0CisgICAgICAvLyBpbmNyZWFzZSB0aGUgaW5zdHJ1Y3Rpb24gZGVwdGguCisgICAgICByZXR1cm4gSGFzVmFsaWRJbnN0ckRlcHRocyAmJiBJbnN0ckRlcHRoIDw9IFRCSS5JbnN0ckRlcHRoOworICAgIH0KKworICAgIC8vIERhdGEtZGVwZW5kZW5jeS1yZWxhdGVkIGluZm9ybWF0aW9uLiBQZXItaW5zdHJ1Y3Rpb24gZGVwdGggYW5kIGhlaWdodAorICAgIC8vIGFyZSBjb21wdXRlZCBmcm9tIGRhdGEgZGVwZW5kZW5jaWVzIGluIHRoZSBjdXJyZW50IHRyYWNlLCB1c2luZworICAgIC8vIGl0aW5lcmFyeSBkYXRhLgorCisgICAgLy8vIEluc3RydWN0aW9uIGRlcHRocyBoYXZlIGJlZW4gY29tcHV0ZWQuIFRoaXMgaW1wbGllcyBoYXNWYWxpZERlcHRoKCkuCisgICAgYm9vbCBIYXNWYWxpZEluc3RyRGVwdGhzID0gZmFsc2U7CisKKyAgICAvLy8gSW5zdHJ1Y3Rpb24gaGVpZ2h0cyBoYXZlIGJlZW4gY29tcHV0ZWQuIFRoaXMgaW1wbGllcyBoYXNWYWxpZEhlaWdodCgpLgorICAgIGJvb2wgSGFzVmFsaWRJbnN0ckhlaWdodHMgPSBmYWxzZTsKKworICAgIC8vLyBDcml0aWNhbCBwYXRoIGxlbmd0aC4gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGN5Y2xlcyBpbiB0aGUgbG9uZ2VzdCBkYXRhCisgICAgLy8vIGRlcGVuZGVuY3kgY2hhaW4gdGhyb3VnaCB0aGUgdHJhY2UuIFRoaXMgaXMgb25seSB2YWxpZCB3aGVuIGJvdGgKKyAgICAvLy8gSGFzVmFsaWRJbnN0ckRlcHRocyBhbmQgSGFzVmFsaWRJbnN0ckhlaWdodHMgYXJlIHNldC4KKyAgICB1bnNpZ25lZCBDcml0aWNhbFBhdGg7CisKKyAgICAvLy8gTGl2ZS1pbiByZWdpc3RlcnMuIFRoZXNlIHJlZ2lzdGVycyBhcmUgZGVmaW5lZCBhYm92ZSB0aGUgY3VycmVudCBibG9jaworICAgIC8vLyBhbmQgdXNlZCBieSB0aGlzIGJsb2NrIG9yIGEgYmxvY2sgYmVsb3cgaXQuCisgICAgLy8vIFRoaXMgZG9lcyBub3QgaW5jbHVkZSBQSEkgdXNlcyBpbiB0aGUgY3VycmVudCBibG9jaywgYnV0IGl0IGRvZXMKKyAgICAvLy8gaW5jbHVkZSBQSEkgdXNlcyBpbiBkZWVwZXIgYmxvY2tzLgorICAgIFNtYWxsVmVjdG9yPExpdmVJblJlZywgND4gTGl2ZUluczsKKworICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0mKSBjb25zdDsKKyAgfTsKKworICAvLy8gSW5zdHJDeWNsZXMgcmVwcmVzZW50cyB0aGUgY3ljbGUgaGVpZ2h0IGFuZCBkZXB0aCBvZiBhbiBpbnN0cnVjdGlvbiBpbiBhCisgIC8vLyB0cmFjZS4KKyAgc3RydWN0IEluc3RyQ3ljbGVzIHsKKyAgICAvLy8gRWFybGllc3QgaXNzdWUgY3ljbGUgYXMgZGV0ZXJtaW5lZCBieSBkYXRhIGRlcGVuZGVuY2llcyBhbmQgaW5zdHJ1Y3Rpb24KKyAgICAvLy8gbGF0ZW5jaWVzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgdHJhY2UuIERhdGEgZGVwZW5kZW5jaWVzIGZyb20KKyAgICAvLy8gYmVmb3JlIHRoZSB0cmFjZSBhcmUgbm90IGluY2x1ZGVkLgorICAgIHVuc2lnbmVkIERlcHRoOworCisgICAgLy8vIE1pbmltdW0gbnVtYmVyIG9mIGN5Y2xlcyBmcm9tIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgaXNzdWVkIHRvIHRoZSBvZiB0aGUKKyAgICAvLy8gdHJhY2UsIGFzIGRldGVybWluZWQgYnkgZGF0YSBkZXBlbmRlbmNpZXMgYW5kIGluc3RydWN0aW9uIGxhdGVuY2llcy4KKyAgICB1bnNpZ25lZCBIZWlnaHQ7CisgIH07CisKKyAgLy8vIEEgdHJhY2UgcmVwcmVzZW50cyBhIHBsYXVzaWJsZSBzZXF1ZW5jZSBvZiBleGVjdXRlZCBiYXNpYyBibG9ja3MgdGhhdAorICAvLy8gcGFzc2VzIHRocm91Z2ggdGhlIGN1cnJlbnQgYmFzaWMgYmxvY2sgb25lLiBUaGUgVHJhY2UgY2xhc3Mgc2VydmVzIGFzIGEKKyAgLy8vIGhhbmRsZSB0byBpbnRlcm5hbCBjYWNoZWQgZGF0YSBzdHJ1Y3R1cmVzLgorICBjbGFzcyBUcmFjZSB7CisgICAgRW5zZW1ibGUgJlRFOworICAgIFRyYWNlQmxvY2tJbmZvICZUQkk7CisKKyAgICB1bnNpZ25lZCBnZXRCbG9ja051bSgpIGNvbnN0IHsgcmV0dXJuICZUQkkgLSAmVEUuQmxvY2tJbmZvWzBdOyB9CisKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFRyYWNlKEVuc2VtYmxlICZ0ZSwgVHJhY2VCbG9ja0luZm8gJnRiaSkgOiBURSh0ZSksIFRCSSh0YmkpIHt9CisKKyAgICB2b2lkIHByaW50KHJhd19vc3RyZWFtJikgY29uc3Q7CisKKyAgICAvLy8gQ29tcHV0ZSB0aGUgdG90YWwgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbiB0aGUgdHJhY2UuCisgICAgdW5zaWduZWQgZ2V0SW5zdHJDb3VudCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBUQkkuSW5zdHJEZXB0aCArIFRCSS5JbnN0ckhlaWdodDsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSByZXNvdXJjZSBkZXB0aCBvZiB0aGUgdG9wL2JvdHRvbSBvZiB0aGUgdHJhY2UgY2VudGVyIGJsb2NrLgorICAgIC8vLyBUaGlzIGlzIHRoZSBudW1iZXIgb2YgY3ljbGVzIHJlcXVpcmVkIHRvIGV4ZWN1dGUgYWxsIGluc3RydWN0aW9ucyBmcm9tCisgICAgLy8vIHRoZSB0cmFjZSBoZWFkIHRvIHRoZSB0cmFjZSBjZW50ZXIgYmxvY2suIFRoZSByZXNvdXJjZSBkZXB0aCBvbmx5CisgICAgLy8vIGNvbnNpZGVycyBleGVjdXRpb24gcmVzb3VyY2VzLCBpdCBpZ25vcmVzIGRhdGEgZGVwZW5kZW5jaWVzLgorICAgIC8vLyBXaGVuIEJvdHRvbSBpcyBzZXQsIGluc3RydWN0aW9ucyBpbiB0aGUgdHJhY2UgY2VudGVyIGJsb2NrIGFyZSBpbmNsdWRlZC4KKyAgICB1bnNpZ25lZCBnZXRSZXNvdXJjZURlcHRoKGJvb2wgQm90dG9tKSBjb25zdDsKKworICAgIC8vLyBSZXR1cm4gdGhlIHJlc291cmNlIGxlbmd0aCBvZiB0aGUgdHJhY2UuIFRoaXMgaXMgdGhlIG51bWJlciBvZiBjeWNsZXMKKyAgICAvLy8gcmVxdWlyZWQgdG8gZXhlY3V0ZSB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSB0cmFjZSBpZiB0aGV5IHdlcmUgYWxsCisgICAgLy8vIGluZGVwZW5kZW50LCBleHBvc2luZyB0aGUgbWF4aW11bSBpbnN0cnVjdGlvbi1sZXZlbCBwYXJhbGxlbGlzbS4KKyAgICAvLy8KKyAgICAvLy8gQW55IGJsb2NrcyBpbiBFeHRyYWJsb2NrcyBhcmUgaW5jbHVkZWQgYXMgaWYgdGhleSB3ZXJlIHBhcnQgb2YgdGhlCisgICAgLy8vIHRyYWNlLiBMaWtld2lzZSwgZXh0cmEgcmVzb3VyY2VzIHJlcXVpcmVkIGJ5IHRoZSBzcGVjaWZpZWQgc2NoZWR1bGluZworICAgIC8vLyBjbGFzc2VzIGFyZSBpbmNsdWRlZC4gRm9yIHRoZSBjYWxsZXIgdG8gYWNjb3VudCBmb3IgZXh0cmEgbWFjaGluZQorICAgIC8vLyBpbnN0cnVjdGlvbnMsIGl0IG11c3QgZmlyc3QgcmVzb2x2ZSBlYWNoIGluc3RydWN0aW9uJ3Mgc2NoZWR1bGluZyBjbGFzcy4KKyAgICB1bnNpZ25lZCBnZXRSZXNvdXJjZUxlbmd0aCgKKyAgICAgICAgQXJyYXlSZWY8Y29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKj4gRXh0cmFibG9ja3MgPSBOb25lLAorICAgICAgICBBcnJheVJlZjxjb25zdCBNQ1NjaGVkQ2xhc3NEZXNjICo+IEV4dHJhSW5zdHJzID0gTm9uZSwKKyAgICAgICAgQXJyYXlSZWY8Y29uc3QgTUNTY2hlZENsYXNzRGVzYyAqPiBSZW1vdmVJbnN0cnMgPSBOb25lKSBjb25zdDsKKworICAgIC8vLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgKGRhdGEgZGVwZW5kZW5jeSkgY3JpdGljYWwgcGF0aCB0aHJvdWdoIHRoZQorICAgIC8vLyB0cmFjZS4KKyAgICB1bnNpZ25lZCBnZXRDcml0aWNhbFBhdGgoKSBjb25zdCB7IHJldHVybiBUQkkuQ3JpdGljYWxQYXRoOyB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSBkZXB0aCBhbmQgaGVpZ2h0IG9mIE1JLiBUaGUgZGVwdGggaXMgb25seSB2YWxpZCBmb3IKKyAgICAvLy8gaW5zdHJ1Y3Rpb25zIGluIG9yIGFib3ZlIHRoZSB0cmFjZSBjZW50ZXIgYmxvY2suIFRoZSBoZWlnaHQgaXMgb25seQorICAgIC8vLyB2YWxpZCBmb3IgaW5zdHJ1Y3Rpb25zIGluIG9yIGJlbG93IHRoZSB0cmFjZSBjZW50ZXIgYmxvY2suCisgICAgSW5zdHJDeWNsZXMgZ2V0SW5zdHJDeWNsZXMoY29uc3QgTWFjaGluZUluc3RyICZNSSkgY29uc3QgeworICAgICAgcmV0dXJuIFRFLkN5Y2xlcy5sb29rdXAoJk1JKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSBzbGFjayBvZiBNSS4gVGhpcyBpcyB0aGUgbnVtYmVyIG9mIGN5Y2xlcyBNSSBjYW4gYmUgZGVsYXllZAorICAgIC8vLyBiZWZvcmUgdGhlIGNyaXRpY2FsIHBhdGggYmVjb21lcyBsb25nZXIuCisgICAgLy8vIE1JIG11c3QgYmUgYW4gaW5zdHJ1Y3Rpb24gaW4gdGhlIHRyYWNlIGNlbnRlciBibG9jay4KKyAgICB1bnNpZ25lZCBnZXRJbnN0clNsYWNrKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIGNvbnN0OworCisgICAgLy8vIFJldHVybiB0aGUgRGVwdGggb2YgYSBQSEkgaW5zdHJ1Y3Rpb24gaW4gYSB0cmFjZSBjZW50ZXIgYmxvY2sgc3VjY2Vzc29yLgorICAgIC8vLyBUaGUgUEhJIGRvZXMgbm90IGhhdmUgdG8gYmUgcGFydCBvZiB0aGUgdHJhY2UuCisgICAgdW5zaWduZWQgZ2V0UEhJRGVwdGgoY29uc3QgTWFjaGluZUluc3RyICZQSEkpIGNvbnN0OworCisgICAgLy8vIEEgZGVwZW5kZW5jZSBpcyB1c2VmdWwgaWYgdGhlIGJhc2ljIGJsb2NrIG9mIHRoZSBkZWZpbmluZyBpbnN0cnVjdGlvbgorICAgIC8vLyBpcyBwYXJ0IG9mIHRoZSB0cmFjZSBvZiB0aGUgdXNlciBpbnN0cnVjdGlvbi4gSXQgaXMgYXNzdW1lZCB0aGF0IERlZk1JCisgICAgLy8vIGRvbWluYXRlcyBVc2VNSSAoc2VlIGFsc28gaXNVc2VmdWxEb21pbmF0b3IpLgorICAgIGJvb2wgaXNEZXBJblRyYWNlKGNvbnN0IE1hY2hpbmVJbnN0ciAmRGVmTUksCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICZVc2VNSSkgY29uc3Q7CisgIH07CisKKyAgLy8vIEEgdHJhY2UgZW5zZW1ibGUgaXMgYSBjb2xsZWN0aW9uIG9mIHRyYWNlcyBzZWxlY3RlZCB1c2luZyB0aGUgc2FtZQorICAvLy8gc3RyYXRlZ3ksIGZvciBleGFtcGxlICdtaW5pbXVtIHJlc291cmNlIGhlaWdodCcuIFRoZXJlIGlzIG9uZSB0cmFjZSBmb3IKKyAgLy8vIGV2ZXJ5IGJsb2NrIGluIHRoZSBmdW5jdGlvbi4KKyAgY2xhc3MgRW5zZW1ibGUgeworICAgIGZyaWVuZCBjbGFzcyBUcmFjZTsKKworICAgIFNtYWxsVmVjdG9yPFRyYWNlQmxvY2tJbmZvLCA0PiBCbG9ja0luZm87CisgICAgRGVuc2VNYXA8Y29uc3QgTWFjaGluZUluc3RyKiwgSW5zdHJDeWNsZXM+IEN5Y2xlczsKKyAgICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMD4gUHJvY1Jlc291cmNlRGVwdGhzOworICAgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCAwPiBQcm9jUmVzb3VyY2VIZWlnaHRzOworCisgICAgdm9pZCBjb21wdXRlVHJhY2UoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sqKTsKKyAgICB2b2lkIGNvbXB1dGVEZXB0aFJlc291cmNlcyhjb25zdCBNYWNoaW5lQmFzaWNCbG9jayopOworICAgIHZvaWQgY29tcHV0ZUhlaWdodFJlc291cmNlcyhjb25zdCBNYWNoaW5lQmFzaWNCbG9jayopOworICAgIHVuc2lnbmVkIGNvbXB1dGVDcm9zc0Jsb2NrQ3JpdGljYWxQYXRoKGNvbnN0IFRyYWNlQmxvY2tJbmZvJik7CisgICAgdm9pZCBjb21wdXRlSW5zdHJEZXB0aHMoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sqKTsKKyAgICB2b2lkIGNvbXB1dGVJbnN0ckhlaWdodHMoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sqKTsKKyAgICB2b2lkIGFkZExpdmVJbnMoY29uc3QgTWFjaGluZUluc3RyICpEZWZNSSwgdW5zaWduZWQgRGVmT3AsCisgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrKj4gVHJhY2UpOworCisgIHByb3RlY3RlZDoKKyAgICBNYWNoaW5lVHJhY2VNZXRyaWNzICZNVE07CisKKyAgICBleHBsaWNpdCBFbnNlbWJsZShNYWNoaW5lVHJhY2VNZXRyaWNzKik7CisKKyAgICB2aXJ0dWFsIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpwaWNrVHJhY2VQcmVkKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrKikgPTA7CisgICAgdmlydHVhbCBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqcGlja1RyYWNlU3VjYyhjb25zdCBNYWNoaW5lQmFzaWNCbG9jayopID0wOworICAgIGNvbnN0IE1hY2hpbmVMb29wICpnZXRMb29wRm9yKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrKikgY29uc3Q7CisgICAgY29uc3QgVHJhY2VCbG9ja0luZm8gKmdldERlcHRoUmVzb3VyY2VzKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrKikgY29uc3Q7CisgICAgY29uc3QgVHJhY2VCbG9ja0luZm8gKmdldEhlaWdodFJlc291cmNlcyhjb25zdCBNYWNoaW5lQmFzaWNCbG9jayopIGNvbnN0OworICAgIEFycmF5UmVmPHVuc2lnbmVkPiBnZXRQcm9jUmVzb3VyY2VEZXB0aHModW5zaWduZWQgTUJCTnVtKSBjb25zdDsKKyAgICBBcnJheVJlZjx1bnNpZ25lZD4gZ2V0UHJvY1Jlc291cmNlSGVpZ2h0cyh1bnNpZ25lZCBNQkJOdW0pIGNvbnN0OworCisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5FbnNlbWJsZSgpOworCisgICAgdmlydHVhbCBjb25zdCBjaGFyICpnZXROYW1lKCkgY29uc3QgPSAwOworICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0mKSBjb25zdDsKKyAgICB2b2lkIGludmFsaWRhdGUoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQik7CisgICAgdm9pZCB2ZXJpZnkoKSBjb25zdDsKKworICAgIC8vLyBHZXQgdGhlIHRyYWNlIHRoYXQgcGFzc2VzIHRocm91Z2ggTUJCLgorICAgIC8vLyBUaGUgdHJhY2UgaXMgY29tcHV0ZWQgb24gZGVtYW5kLgorICAgIFRyYWNlIGdldFRyYWNlKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpOworCisgICAgLy8vIFVwZGF0ZXMgdGhlIGRlcHRoIG9mIGFuIG1hY2hpbmUgaW5zdHJ1Y3Rpb24sIGdpdmVuIFJlZ1VuaXRzLgorICAgIHZvaWQgdXBkYXRlRGVwdGgoVHJhY2VCbG9ja0luZm8gJlRCSSwgY29uc3QgTWFjaGluZUluc3RyJiwKKyAgICAgICAgICAgICAgICAgICAgIFNwYXJzZVNldDxMaXZlUmVnVW5pdD4gJlJlZ1VuaXRzKTsKKyAgICB2b2lkIHVwZGF0ZURlcHRoKGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICosIGNvbnN0IE1hY2hpbmVJbnN0ciYsCisgICAgICAgICAgICAgICAgICAgICBTcGFyc2VTZXQ8TGl2ZVJlZ1VuaXQ+ICZSZWdVbml0cyk7CisKKyAgICAvLy8gVXBkYXRlcyB0aGUgZGVwdGggb2YgdGhlIGluc3RydWN0aW9ucyBmcm9tIFN0YXJ0IHRvIEVuZC4KKyAgICB2b2lkIHVwZGF0ZURlcHRocyhNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICBTcGFyc2VTZXQ8TGl2ZVJlZ1VuaXQ+ICZSZWdVbml0cyk7CisKKyAgfTsKKworICAvLy8gU3RyYXRlZ2llcyBmb3Igc2VsZWN0aW5nIHRyYWNlcy4KKyAgZW51bSBTdHJhdGVneSB7CisgICAgLy8vIFNlbGVjdCB0aGUgdHJhY2UgdGhyb3VnaCBhIGJsb2NrIHRoYXQgaGFzIHRoZSBmZXdlc3QgaW5zdHJ1Y3Rpb25zLgorICAgIFRTX01pbkluc3RyQ291bnQsCisKKyAgICBUU19OdW1TdHJhdGVnaWVzCisgIH07CisKKyAgLy8vIEdldCB0aGUgdHJhY2UgZW5zZW1ibGUgcmVwcmVzZW50aW5nIHRoZSBnaXZlbiB0cmFjZSBzZWxlY3Rpb24gc3RyYXRlZ3kuCisgIC8vLyBUaGUgcmV0dXJuZWQgRW5zZW1ibGUgb2JqZWN0IGlzIG93bmVkIGJ5IHRoZSBNYWNoaW5lVHJhY2VNZXRyaWNzIGFuYWx5c2lzLAorICAvLy8gYW5kIHZhbGlkIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIGFuYWx5c2lzIHBhc3MuCisgIEVuc2VtYmxlICpnZXRFbnNlbWJsZShTdHJhdGVneSk7CisKKyAgLy8vIEludmFsaWRhdGUgY2FjaGVkIGluZm9ybWF0aW9uIGFib3V0IE1CQi4gVGhpcyBtdXN0IGJlIGNhbGxlZCAqYmVmb3JlKiBNQkIKKyAgLy8vIGlzIGVyYXNlZCwgb3IgdGhlIENGRyBpcyBvdGhlcndpc2UgY2hhbmdlZC4KKyAgLy8vCisgIC8vLyBUaGlzIGludmFsaWRhdGVzIHBlci1ibG9jayBpbmZvcm1hdGlvbiBhYm91dCByZXNvdXJjZSB1c2FnZSBmb3IgTUJCIG9ubHksCisgIC8vLyBhbmQgaXQgaW52YWxpZGF0ZXMgcGVyLXRyYWNlIGluZm9ybWF0aW9uIGZvciBhbnkgdHJhY2UgdGhhdCBwYXNzZXMKKyAgLy8vIHRocm91Z2ggTUJCLgorICAvLy8KKyAgLy8vIENhbGwgRW5zZW1ibGU6OmdldFRyYWNlKCkgYWdhaW4gdG8gdXBkYXRlIGFueSB0cmFjZSBoYW5kbGVzLgorICB2b2lkIGludmFsaWRhdGUoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQik7CisKK3ByaXZhdGU6CisgIC8vIE9uZSBlbnRyeSBwZXIgYmFzaWMgYmxvY2ssIGluZGV4ZWQgYnkgYmxvY2sgbnVtYmVyLgorICBTbWFsbFZlY3RvcjxGaXhlZEJsb2NrSW5mbywgND4gQmxvY2tJbmZvOworCisgIC8vIEN5Y2xlcyBjb25zdW1lZCBvbiBlYWNoIHByb2Nlc3NvciByZXNvdXJjZSBwZXIgYmxvY2suCisgIC8vIFRoZSBudW1iZXIgb2YgcHJvY2Vzc29yIHJlc291cmNlIGtpbmRzIGlzIGNvbnN0YW50IGZvciBhIGdpdmVuIHN1YnRhcmdldCwKKyAgLy8gYnV0IGl0IGlzIG5vdCBrbm93biBhdCBjb21waWxlIHRpbWUuIFRoZSBudW1iZXIgb2YgY3ljbGVzIGNvbnN1bWVkIGJ5CisgIC8vIGJsb2NrIEIgb24gcHJvY2Vzc29yIHJlc291cmNlIFIgaXMgYXQgUHJvY1Jlc291cmNlQ3ljbGVzW0IqS2luZHMgKyBSXQorICAvLyB3aGVyZSBLaW5kcyA9IFNjaGVkTW9kZWwuZ2V0TnVtUHJvY1Jlc291cmNlS2luZHMoKS4KKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDA+IFByb2NSZXNvdXJjZUN5Y2xlczsKKworICAvLyBPbmUgZW5zZW1ibGUgcGVyIHN0cmF0ZWd5LgorICBFbnNlbWJsZSogRW5zZW1ibGVzW1RTX051bVN0cmF0ZWdpZXNdOworCisgIC8vIENvbnZlcnQgc2NhbGVkIHJlc291cmNlIHVzYWdlIHRvIGEgY3ljbGUgY291bnQgdGhhdCBjYW4gYmUgY29tcGFyZWQgd2l0aAorICAvLyBsYXRlbmNpZXMuCisgIHVuc2lnbmVkIGdldEN5Y2xlcyh1bnNpZ25lZCBTY2FsZWQpIHsKKyAgICB1bnNpZ25lZCBGYWN0b3IgPSBTY2hlZE1vZGVsLmdldExhdGVuY3lGYWN0b3IoKTsKKyAgICByZXR1cm4gKFNjYWxlZCArIEZhY3RvciAtIDEpIC8gRmFjdG9yOworICB9Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVUcmFjZU1ldHJpY3M6OlRyYWNlICZUcikgeworICBUci5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lVHJhY2VNZXRyaWNzOjpFbnNlbWJsZSAmRW4pIHsKKyAgRW4ucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTUFDSElORVRSQUNFTUVUUklDU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjcm9GdXNpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9NYWNyb0Z1c2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMTA1ZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vTWFjcm9GdXNpb24uaApAQCAtMCwwICsxLDUwIEBACisvLz09PS0gTWFjcm9GdXNpb24uaCAtIE1hY3JvIEZ1c2lvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZSBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlZmluaXRpb24gb2YgdGhlIERBRyBzY2hlZHVsaW5nIG11dGF0aW9uIHRvCisvLy8gcGFpciBpbnN0cnVjdGlvbnMgYmFjayB0byBiYWNrLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX01BQ1JPRlVTSU9OX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX01BQ1JPRlVTSU9OX0gKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIFNjaGVkdWxlREFHTXV0YXRpb247CitjbGFzcyBUYXJnZXRJbnN0ckluZm87CitjbGFzcyBUYXJnZXRTdWJ0YXJnZXRJbmZvOworCisvLy8gXGJyaWVmIENoZWNrIGlmIHRoZSBpbnN0ciBwYWlyLCBGaXJzdE1JIGFuZCBTZWNvbmRNSSwgc2hvdWxkIGJlIGZ1c2VkCisvLy8gdG9nZXRoZXIuIEdpdmVuIFNlY29uZE1JLCB3aGVuIEZpcnN0TUkgaXMgdW5zcGVjaWZpZWQsIHRoZW4gY2hlY2sgaWYKKy8vLyBTZWNvbmRNSSBtYXkgYmUgcGFydCBvZiBhIGZ1c2VkIHBhaXIgYXQgYWxsLgordXNpbmcgU2hvdWxkU2NoZWR1bGVQcmVkVHkgPSBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRTdWJ0YXJnZXRJbmZvICZUU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHIgKkZpcnN0TUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHIgJlNlY29uZE1JKT47CisKKy8vLyBcYnJpZWYgQ3JlYXRlIGEgREFHIHNjaGVkdWxpbmcgbXV0YXRpb24gdG8gcGFpciBpbnN0cnVjdGlvbnMgYmFjayB0byBiYWNrCisvLy8gZm9yIGluc3RydWN0aW9ucyB0aGF0IGJlbmVmaXQgYWNjb3JkaW5nIHRvIHRoZSB0YXJnZXQtc3BlY2lmaWMKKy8vLyBzaG91bGRTY2hlZHVsZUFkamFjZW50IHByZWRpY2F0ZSBmdW5jdGlvbi4KK3N0ZDo6dW5pcXVlX3B0cjxTY2hlZHVsZURBR011dGF0aW9uPgorY3JlYXRlTWFjcm9GdXNpb25EQUdNdXRhdGlvbihTaG91bGRTY2hlZHVsZVByZWRUeSBzaG91bGRTY2hlZHVsZUFkamFjZW50KTsKKworLy8vIFxicmllZiBDcmVhdGUgYSBEQUcgc2NoZWR1bGluZyBtdXRhdGlvbiB0byBwYWlyIGJyYW5jaCBpbnN0cnVjdGlvbnMgd2l0aCBvbmUKKy8vLyBvZiB0aGVpciBwcmVkZWNlc3NvcnMgYmFjayB0byBiYWNrIGZvciBpbnN0cnVjdGlvbnMgdGhhdCBiZW5lZml0IGFjY29yZGluZworLy8vIHRvIHRoZSB0YXJnZXQtc3BlY2lmaWMgc2hvdWxkU2NoZWR1bGVBZGphY2VudCBwcmVkaWNhdGUgZnVuY3Rpb24uCitzdGQ6OnVuaXF1ZV9wdHI8U2NoZWR1bGVEQUdNdXRhdGlvbj4KK2NyZWF0ZUJyYW5jaE1hY3JvRnVzaW9uREFHTXV0YXRpb24oU2hvdWxkU2NoZWR1bGVQcmVkVHkgc2hvdWxkU2NoZWR1bGVBZGphY2VudCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fTUFDUk9GVVNJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1BCUVAvQ29zdEFsbG9jYXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1BCUVAvQ29zdEFsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZTQ1MWEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUEJRUC9Db3N0QWxsb2NhdG9yLmgKQEAgLTAsMCArMSwxMzUgQEAKKy8vPT09LSBDb3N0QWxsb2NhdG9yLmggLSBQQlFQIENvc3QgQWxsb2NhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGVmaW5lcyBjbGFzc2VzIGNvbmZvcm1pbmcgdG8gdGhlIFBCUVAgY29zdCB2YWx1ZSBtYW5hZ2VyIGNvbmNlcHQuCisvLworLy8gQ29zdCB2YWx1ZSBtYW5hZ2VycyBhcmUgbWVtb3J5IG1hbmFnZXJzIGZvciBQQlFQIGNvc3QgdmFsdWVzICh2ZWN0b3JzIGFuZAorLy8gbWF0cmljZXMpLiBTaW5jZSBQQlFQIGdyYXBocyBjYW4gZ3JvdyB2ZXJ5IGxhcmdlIChFLmcuIGh1bmRyZWRzIG9mIHRob3VzYW5kcworLy8gb2YgZWRnZXMgb24gdGhlIGxhcmdlc3QgZnVuY3Rpb24gaW4gU1BFQzIwMDYpLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1BCUVBfQ09TVEFMTE9DQVRPUl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9QQlFQX0NPU1RBTExPQ0FUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBQQlFQIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVD4gY2xhc3MgVmFsdWVQb29sIHsKK3B1YmxpYzoKKyAgdXNpbmcgUG9vbFJlZiA9IHN0ZDo6c2hhcmVkX3B0cjxjb25zdCBWYWx1ZVQ+OworCitwcml2YXRlOgorICBjbGFzcyBQb29sRW50cnkgOiBwdWJsaWMgc3RkOjplbmFibGVfc2hhcmVkX2Zyb21fdGhpczxQb29sRW50cnk+IHsKKyAgcHVibGljOgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZUtleVQ+CisgICAgUG9vbEVudHJ5KFZhbHVlUG9vbCAmUG9vbCwgVmFsdWVLZXlUIFZhbHVlKQorICAgICAgICA6IFBvb2woUG9vbCksIFZhbHVlKHN0ZDo6bW92ZShWYWx1ZSkpIHt9CisKKyAgICB+UG9vbEVudHJ5KCkgeyBQb29sLnJlbW92ZUVudHJ5KHRoaXMpOyB9CisKKyAgICBjb25zdCBWYWx1ZVQgJmdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKworICBwcml2YXRlOgorICAgIFZhbHVlUG9vbCAmUG9vbDsKKyAgICBWYWx1ZVQgVmFsdWU7CisgIH07CisKKyAgY2xhc3MgUG9vbEVudHJ5RFNJbmZvIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBpbmxpbmUgUG9vbEVudHJ5ICpnZXRFbXB0eUtleSgpIHsgcmV0dXJuIG51bGxwdHI7IH0KKworICAgIHN0YXRpYyBpbmxpbmUgUG9vbEVudHJ5ICpnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQb29sRW50cnkgKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PigxKSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlS2V5VD4KKyAgICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IFZhbHVlS2V5VCAmQykgeworICAgICAgcmV0dXJuIGhhc2hfdmFsdWUoQyk7CisgICAgfQorCisgICAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShQb29sRW50cnkgKlApIHsKKyAgICAgIHJldHVybiBnZXRIYXNoVmFsdWUoUC0+Z2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBQb29sRW50cnkgKlApIHsKKyAgICAgIHJldHVybiBnZXRIYXNoVmFsdWUoUC0+Z2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlS2V5VDEsIHR5cGVuYW1lIFZhbHVlS2V5VDI+CisgICAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBWYWx1ZUtleVQxICZDMSwgY29uc3QgVmFsdWVLZXlUMiAmQzIpIHsKKyAgICAgIHJldHVybiBDMSA9PSBDMjsKKyAgICB9CisKKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVLZXlUPgorICAgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgVmFsdWVLZXlUICZDLCBQb29sRW50cnkgKlApIHsKKyAgICAgIGlmIChQID09IGdldEVtcHR5S2V5KCkgfHwgUCA9PSBnZXRUb21ic3RvbmVLZXkoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIGlzRXF1YWwoQywgUC0+Z2V0VmFsdWUoKSk7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgaXNFcXVhbChQb29sRW50cnkgKlAxLCBQb29sRW50cnkgKlAyKSB7CisgICAgICBpZiAoUDEgPT0gZ2V0RW1wdHlLZXkoKSB8fCBQMSA9PSBnZXRUb21ic3RvbmVLZXkoKSkKKyAgICAgICAgcmV0dXJuIFAxID09IFAyOworICAgICAgcmV0dXJuIGlzRXF1YWwoUDEtPmdldFZhbHVlKCksIFAyKTsKKyAgICB9CisgIH07CisKKyAgdXNpbmcgRW50cnlTZXRUID0gRGVuc2VTZXQ8UG9vbEVudHJ5ICosIFBvb2xFbnRyeURTSW5mbz47CisKKyAgRW50cnlTZXRUIEVudHJ5U2V0OworCisgIHZvaWQgcmVtb3ZlRW50cnkoUG9vbEVudHJ5ICpQKSB7IEVudHJ5U2V0LmVyYXNlKFApOyB9CisKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlS2V5VD4gUG9vbFJlZiBnZXRWYWx1ZShWYWx1ZUtleVQgVmFsdWVLZXkpIHsKKyAgICB0eXBlbmFtZSBFbnRyeVNldFQ6Oml0ZXJhdG9yIEkgPSBFbnRyeVNldC5maW5kX2FzKFZhbHVlS2V5KTsKKworICAgIGlmIChJICE9IEVudHJ5U2V0LmVuZCgpKQorICAgICAgcmV0dXJuIFBvb2xSZWYoKCpJKS0+c2hhcmVkX2Zyb21fdGhpcygpLCAmKCpJKS0+Z2V0VmFsdWUoKSk7CisKKyAgICBhdXRvIFAgPSBzdGQ6Om1ha2Vfc2hhcmVkPFBvb2xFbnRyeT4oKnRoaXMsIHN0ZDo6bW92ZShWYWx1ZUtleSkpOworICAgIEVudHJ5U2V0Lmluc2VydChQLmdldCgpKTsKKyAgICByZXR1cm4gUG9vbFJlZihzdGQ6Om1vdmUoUCksICZQLT5nZXRWYWx1ZSgpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFZlY3RvclQsIHR5cGVuYW1lIE1hdHJpeFQ+IGNsYXNzIFBvb2xDb3N0QWxsb2NhdG9yIHsKK3ByaXZhdGU6CisgIHVzaW5nIFZlY3RvckNvc3RQb29sID0gVmFsdWVQb29sPFZlY3RvclQ+OworICB1c2luZyBNYXRyaXhDb3N0UG9vbCA9IFZhbHVlUG9vbDxNYXRyaXhUPjsKKworcHVibGljOgorICB1c2luZyBWZWN0b3IgPSBWZWN0b3JUOworICB1c2luZyBNYXRyaXggPSBNYXRyaXhUOworICB1c2luZyBWZWN0b3JQdHIgPSB0eXBlbmFtZSBWZWN0b3JDb3N0UG9vbDo6UG9vbFJlZjsKKyAgdXNpbmcgTWF0cml4UHRyID0gdHlwZW5hbWUgTWF0cml4Q29zdFBvb2w6OlBvb2xSZWY7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFZlY3RvcktleVQ+IFZlY3RvclB0ciBnZXRWZWN0b3IoVmVjdG9yS2V5VCB2KSB7CisgICAgcmV0dXJuIFZlY3RvclBvb2wuZ2V0VmFsdWUoc3RkOjptb3ZlKHYpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRyaXhLZXlUPiBNYXRyaXhQdHIgZ2V0TWF0cml4KE1hdHJpeEtleVQgbSkgeworICAgIHJldHVybiBNYXRyaXhQb29sLmdldFZhbHVlKHN0ZDo6bW92ZShtKSk7CisgIH0KKworcHJpdmF0ZToKKyAgVmVjdG9yQ29zdFBvb2wgVmVjdG9yUG9vbDsKKyAgTWF0cml4Q29zdFBvb2wgTWF0cml4UG9vbDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBQQlFQCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1BCUVBfQ09TVEFMTE9DQVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUEJRUC9HcmFwaC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1BCUVAvR3JhcGguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTQ4NzhjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1BCUVAvR3JhcGguaApAQCAtMCwwICsxLDY3NSBAQAorLy89PT0tIEdyYXBoLmggLSBQQlFQIEdyYXBoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBQQlFQIEdyYXBoIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1BCUVBfR1JBUEhfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fUEJRUF9HUkFQSF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgUEJRUCB7CisKKyAgY2xhc3MgR3JhcGhCYXNlIHsKKyAgcHVibGljOgorICAgIHVzaW5nIE5vZGVJZCA9IHVuc2lnbmVkOworICAgIHVzaW5nIEVkZ2VJZCA9IHVuc2lnbmVkOworCisgICAgLy8vIEBicmllZiBSZXR1cm5zIGEgdmFsdWUgcmVwcmVzZW50aW5nIGFuIGludmFsaWQgKG5vbi1leGlzdGVudCkgbm9kZS4KKyAgICBzdGF0aWMgTm9kZUlkIGludmFsaWROb2RlSWQoKSB7CisgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxOb2RlSWQ+OjptYXgoKTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIFJldHVybnMgYSB2YWx1ZSByZXByZXNlbnRpbmcgYW4gaW52YWxpZCAobm9uLWV4aXN0ZW50KSBlZGdlLgorICAgIHN0YXRpYyBFZGdlSWQgaW52YWxpZEVkZ2VJZCgpIHsKKyAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPEVkZ2VJZD46Om1heCgpOworICAgIH0KKyAgfTsKKworICAvLy8gUEJRUCBHcmFwaCBjbGFzcy4KKyAgLy8vIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGRlc2NyaWJlIFBCUVAgcHJvYmxlbXMuCisgIC8vLworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU29sdmVyVD4KKyAgY2xhc3MgR3JhcGggOiBwdWJsaWMgR3JhcGhCYXNlIHsKKyAgcHJpdmF0ZToKKyAgICB1c2luZyBDb3N0QWxsb2NhdG9yID0gdHlwZW5hbWUgU29sdmVyVDo6Q29zdEFsbG9jYXRvcjsKKworICBwdWJsaWM6CisgICAgdXNpbmcgUmF3VmVjdG9yID0gdHlwZW5hbWUgU29sdmVyVDo6UmF3VmVjdG9yOworICAgIHVzaW5nIFJhd01hdHJpeCA9IHR5cGVuYW1lIFNvbHZlclQ6OlJhd01hdHJpeDsKKyAgICB1c2luZyBWZWN0b3IgPSB0eXBlbmFtZSBTb2x2ZXJUOjpWZWN0b3I7CisgICAgdXNpbmcgTWF0cml4ID0gdHlwZW5hbWUgU29sdmVyVDo6TWF0cml4OworICAgIHVzaW5nIFZlY3RvclB0ciA9IHR5cGVuYW1lIENvc3RBbGxvY2F0b3I6OlZlY3RvclB0cjsKKyAgICB1c2luZyBNYXRyaXhQdHIgPSB0eXBlbmFtZSBDb3N0QWxsb2NhdG9yOjpNYXRyaXhQdHI7CisgICAgdXNpbmcgTm9kZU1ldGFkYXRhID0gdHlwZW5hbWUgU29sdmVyVDo6Tm9kZU1ldGFkYXRhOworICAgIHVzaW5nIEVkZ2VNZXRhZGF0YSA9IHR5cGVuYW1lIFNvbHZlclQ6OkVkZ2VNZXRhZGF0YTsKKyAgICB1c2luZyBHcmFwaE1ldGFkYXRhID0gdHlwZW5hbWUgU29sdmVyVDo6R3JhcGhNZXRhZGF0YTsKKworICBwcml2YXRlOgorICAgIGNsYXNzIE5vZGVFbnRyeSB7CisgICAgcHVibGljOgorICAgICAgdXNpbmcgQWRqRWRnZUxpc3QgPSBzdGQ6OnZlY3RvcjxFZGdlSWQ+OworICAgICAgdXNpbmcgQWRqRWRnZUlkeCA9IEFkakVkZ2VMaXN0OjpzaXplX3R5cGU7CisgICAgICB1c2luZyBBZGpFZGdlSXRyID0gQWRqRWRnZUxpc3Q6OmNvbnN0X2l0ZXJhdG9yOworCisgICAgICBOb2RlRW50cnkoVmVjdG9yUHRyIENvc3RzKSA6IENvc3RzKHN0ZDo6bW92ZShDb3N0cykpIHt9CisKKyAgICAgIHN0YXRpYyBBZGpFZGdlSWR4IGdldEludmFsaWRBZGpFZGdlSWR4KCkgeworICAgICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxBZGpFZGdlSWR4Pjo6bWF4KCk7CisgICAgICB9CisKKyAgICAgIEFkakVkZ2VJZHggYWRkQWRqRWRnZUlkKEVkZ2VJZCBFSWQpIHsKKyAgICAgICAgQWRqRWRnZUlkeCBJZHggPSBBZGpFZGdlSWRzLnNpemUoKTsKKyAgICAgICAgQWRqRWRnZUlkcy5wdXNoX2JhY2soRUlkKTsKKyAgICAgICAgcmV0dXJuIElkeDsKKyAgICAgIH0KKworICAgICAgdm9pZCByZW1vdmVBZGpFZGdlSWQoR3JhcGggJkcsIE5vZGVJZCBUaGlzTklkLCBBZGpFZGdlSWR4IElkeCkgeworICAgICAgICAvLyBTd2FwLWFuZC1wb3AgZm9yIGZhc3QgcmVtb3ZhbC4KKyAgICAgICAgLy8gICAxKSBVcGRhdGUgdGhlIGFkaiBpbmRleCBvZiB0aGUgZWRnZSBjdXJyZW50bHkgYXQgYmFjaygpLgorICAgICAgICAvLyAgIDIpIE1vdmUgbGFzdCBFZGdlIGRvd24gdG8gSWR4LgorICAgICAgICAvLyAgIDMpIHBvcF9iYWNrKCkKKyAgICAgICAgLy8gSWYgSWR4ID09IHNpemUoKSAtIDEgdGhlbiB0aGUgc2V0QWRqRWRnZUlkeCBhbmQgc3dhcCBhcmUKKyAgICAgICAgLy8gcmVkdW5kYW50LCBidXQgYm90aCBvcGVyYXRpb25zIGFyZSBjaGVhcC4KKyAgICAgICAgRy5nZXRFZGdlKEFkakVkZ2VJZHMuYmFjaygpKS5zZXRBZGpFZGdlSWR4KFRoaXNOSWQsIElkeCk7CisgICAgICAgIEFkakVkZ2VJZHNbSWR4XSA9IEFkakVkZ2VJZHMuYmFjaygpOworICAgICAgICBBZGpFZGdlSWRzLnBvcF9iYWNrKCk7CisgICAgICB9CisKKyAgICAgIGNvbnN0IEFkakVkZ2VMaXN0JiBnZXRBZGpFZGdlSWRzKCkgY29uc3QgeyByZXR1cm4gQWRqRWRnZUlkczsgfQorCisgICAgICBWZWN0b3JQdHIgQ29zdHM7CisgICAgICBOb2RlTWV0YWRhdGEgTWV0YWRhdGE7CisKKyAgICBwcml2YXRlOgorICAgICAgQWRqRWRnZUxpc3QgQWRqRWRnZUlkczsKKyAgICB9OworCisgICAgY2xhc3MgRWRnZUVudHJ5IHsKKyAgICBwdWJsaWM6CisgICAgICBFZGdlRW50cnkoTm9kZUlkIE4xSWQsIE5vZGVJZCBOMklkLCBNYXRyaXhQdHIgQ29zdHMpCisgICAgICAgICAgOiBDb3N0cyhzdGQ6Om1vdmUoQ29zdHMpKSB7CisgICAgICAgIE5JZHNbMF0gPSBOMUlkOworICAgICAgICBOSWRzWzFdID0gTjJJZDsKKyAgICAgICAgVGhpc0VkZ2VBZGpJZHhzWzBdID0gTm9kZUVudHJ5OjpnZXRJbnZhbGlkQWRqRWRnZUlkeCgpOworICAgICAgICBUaGlzRWRnZUFkaklkeHNbMV0gPSBOb2RlRW50cnk6OmdldEludmFsaWRBZGpFZGdlSWR4KCk7CisgICAgICB9CisKKyAgICAgIHZvaWQgY29ubmVjdFRvTihHcmFwaCAmRywgRWRnZUlkIFRoaXNFZGdlSWQsIHVuc2lnbmVkIE5JZHgpIHsKKyAgICAgICAgYXNzZXJ0KFRoaXNFZGdlQWRqSWR4c1tOSWR4XSA9PSBOb2RlRW50cnk6OmdldEludmFsaWRBZGpFZGdlSWR4KCkgJiYKKyAgICAgICAgICAgICAgICJFZGdlIGFscmVhZHkgY29ubmVjdGVkIHRvIE5JZHNbTklkeF0uIik7CisgICAgICAgIE5vZGVFbnRyeSAmTiA9IEcuZ2V0Tm9kZShOSWRzW05JZHhdKTsKKyAgICAgICAgVGhpc0VkZ2VBZGpJZHhzW05JZHhdID0gTi5hZGRBZGpFZGdlSWQoVGhpc0VkZ2VJZCk7CisgICAgICB9CisKKyAgICAgIHZvaWQgY29ubmVjdChHcmFwaCAmRywgRWRnZUlkIFRoaXNFZGdlSWQpIHsKKyAgICAgICAgY29ubmVjdFRvTihHLCBUaGlzRWRnZUlkLCAwKTsKKyAgICAgICAgY29ubmVjdFRvTihHLCBUaGlzRWRnZUlkLCAxKTsKKyAgICAgIH0KKworICAgICAgdm9pZCBzZXRBZGpFZGdlSWR4KE5vZGVJZCBOSWQsIHR5cGVuYW1lIE5vZGVFbnRyeTo6QWRqRWRnZUlkeCBOZXdJZHgpIHsKKyAgICAgICAgaWYgKE5JZCA9PSBOSWRzWzBdKQorICAgICAgICAgIFRoaXNFZGdlQWRqSWR4c1swXSA9IE5ld0lkeDsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgYXNzZXJ0KE5JZCA9PSBOSWRzWzFdICYmICJFZGdlIG5vdCBjb25uZWN0ZWQgdG8gTklkIik7CisgICAgICAgICAgVGhpc0VkZ2VBZGpJZHhzWzFdID0gTmV3SWR4OworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIHZvaWQgZGlzY29ubmVjdEZyb21OKEdyYXBoICZHLCB1bnNpZ25lZCBOSWR4KSB7CisgICAgICAgIGFzc2VydChUaGlzRWRnZUFkaklkeHNbTklkeF0gIT0gTm9kZUVudHJ5OjpnZXRJbnZhbGlkQWRqRWRnZUlkeCgpICYmCisgICAgICAgICAgICAgICAiRWRnZSBub3QgY29ubmVjdGVkIHRvIE5JZHNbTklkeF0uIik7CisgICAgICAgIE5vZGVFbnRyeSAmTiA9IEcuZ2V0Tm9kZShOSWRzW05JZHhdKTsKKyAgICAgICAgTi5yZW1vdmVBZGpFZGdlSWQoRywgTklkc1tOSWR4XSwgVGhpc0VkZ2VBZGpJZHhzW05JZHhdKTsKKyAgICAgICAgVGhpc0VkZ2VBZGpJZHhzW05JZHhdID0gTm9kZUVudHJ5OjpnZXRJbnZhbGlkQWRqRWRnZUlkeCgpOworICAgICAgfQorCisgICAgICB2b2lkIGRpc2Nvbm5lY3RGcm9tKEdyYXBoICZHLCBOb2RlSWQgTklkKSB7CisgICAgICAgIGlmIChOSWQgPT0gTklkc1swXSkKKyAgICAgICAgICBkaXNjb25uZWN0RnJvbU4oRywgMCk7CisgICAgICAgIGVsc2UgeworICAgICAgICAgIGFzc2VydChOSWQgPT0gTklkc1sxXSAmJiAiRWRnZSBkb2VzIG5vdCBjb25uZWN0IE5JZCIpOworICAgICAgICAgIGRpc2Nvbm5lY3RGcm9tTihHLCAxKTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBOb2RlSWQgZ2V0TjFJZCgpIGNvbnN0IHsgcmV0dXJuIE5JZHNbMF07IH0KKyAgICAgIE5vZGVJZCBnZXROMklkKCkgY29uc3QgeyByZXR1cm4gTklkc1sxXTsgfQorCisgICAgICBNYXRyaXhQdHIgQ29zdHM7CisgICAgICBFZGdlTWV0YWRhdGEgTWV0YWRhdGE7CisKKyAgICBwcml2YXRlOgorICAgICAgTm9kZUlkIE5JZHNbMl07CisgICAgICB0eXBlbmFtZSBOb2RlRW50cnk6OkFkakVkZ2VJZHggVGhpc0VkZ2VBZGpJZHhzWzJdOworICAgIH07CisKKyAgICAvLyAtLS0tLSBNRU1CRVJTIC0tLS0tCisKKyAgICBHcmFwaE1ldGFkYXRhIE1ldGFkYXRhOworICAgIENvc3RBbGxvY2F0b3IgQ29zdEFsbG9jOworICAgIFNvbHZlclQgKlNvbHZlciA9IG51bGxwdHI7CisKKyAgICB1c2luZyBOb2RlVmVjdG9yID0gc3RkOjp2ZWN0b3I8Tm9kZUVudHJ5PjsKKyAgICB1c2luZyBGcmVlTm9kZVZlY3RvciA9IHN0ZDo6dmVjdG9yPE5vZGVJZD47CisgICAgTm9kZVZlY3RvciBOb2RlczsKKyAgICBGcmVlTm9kZVZlY3RvciBGcmVlTm9kZUlkczsKKworICAgIHVzaW5nIEVkZ2VWZWN0b3IgPSBzdGQ6OnZlY3RvcjxFZGdlRW50cnk+OworICAgIHVzaW5nIEZyZWVFZGdlVmVjdG9yID0gc3RkOjp2ZWN0b3I8RWRnZUlkPjsKKyAgICBFZGdlVmVjdG9yIEVkZ2VzOworICAgIEZyZWVFZGdlVmVjdG9yIEZyZWVFZGdlSWRzOworCisgICAgR3JhcGgoY29uc3QgR3JhcGggJk90aGVyKSB7fQorCisgICAgLy8gLS0tLS0gSU5URVJOQUwgTUVUSE9EUyAtLS0tLQorCisgICAgTm9kZUVudHJ5ICZnZXROb2RlKE5vZGVJZCBOSWQpIHsKKyAgICAgIGFzc2VydChOSWQgPCBOb2Rlcy5zaXplKCkgJiYgIk91dCBvZiBib3VuZCBOb2RlSWQiKTsKKyAgICAgIHJldHVybiBOb2Rlc1tOSWRdOworICAgIH0KKyAgICBjb25zdCBOb2RlRW50cnkgJmdldE5vZGUoTm9kZUlkIE5JZCkgY29uc3QgeworICAgICAgYXNzZXJ0KE5JZCA8IE5vZGVzLnNpemUoKSAmJiAiT3V0IG9mIGJvdW5kIE5vZGVJZCIpOworICAgICAgcmV0dXJuIE5vZGVzW05JZF07CisgICAgfQorCisgICAgRWRnZUVudHJ5JiBnZXRFZGdlKEVkZ2VJZCBFSWQpIHsgcmV0dXJuIEVkZ2VzW0VJZF07IH0KKyAgICBjb25zdCBFZGdlRW50cnkmIGdldEVkZ2UoRWRnZUlkIEVJZCkgY29uc3QgeyByZXR1cm4gRWRnZXNbRUlkXTsgfQorCisgICAgTm9kZUlkIGFkZENvbnN0cnVjdGVkTm9kZShOb2RlRW50cnkgTikgeworICAgICAgTm9kZUlkIE5JZCA9IDA7CisgICAgICBpZiAoIUZyZWVOb2RlSWRzLmVtcHR5KCkpIHsKKyAgICAgICAgTklkID0gRnJlZU5vZGVJZHMuYmFjaygpOworICAgICAgICBGcmVlTm9kZUlkcy5wb3BfYmFjaygpOworICAgICAgICBOb2Rlc1tOSWRdID0gc3RkOjptb3ZlKE4pOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgTklkID0gTm9kZXMuc2l6ZSgpOworICAgICAgICBOb2Rlcy5wdXNoX2JhY2soc3RkOjptb3ZlKE4pKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBOSWQ7CisgICAgfQorCisgICAgRWRnZUlkIGFkZENvbnN0cnVjdGVkRWRnZShFZGdlRW50cnkgRSkgeworICAgICAgYXNzZXJ0KGZpbmRFZGdlKEUuZ2V0TjFJZCgpLCBFLmdldE4ySWQoKSkgPT0gaW52YWxpZEVkZ2VJZCgpICYmCisgICAgICAgICAgICAgIkF0dGVtcHQgdG8gYWRkIGR1cGxpY2F0ZSBlZGdlLiIpOworICAgICAgRWRnZUlkIEVJZCA9IDA7CisgICAgICBpZiAoIUZyZWVFZGdlSWRzLmVtcHR5KCkpIHsKKyAgICAgICAgRUlkID0gRnJlZUVkZ2VJZHMuYmFjaygpOworICAgICAgICBGcmVlRWRnZUlkcy5wb3BfYmFjaygpOworICAgICAgICBFZGdlc1tFSWRdID0gc3RkOjptb3ZlKEUpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRUlkID0gRWRnZXMuc2l6ZSgpOworICAgICAgICBFZGdlcy5wdXNoX2JhY2soc3RkOjptb3ZlKEUpKTsKKyAgICAgIH0KKworICAgICAgRWRnZUVudHJ5ICZORSA9IGdldEVkZ2UoRUlkKTsKKworICAgICAgLy8gQWRkIHRoZSBlZGdlIHRvIHRoZSBhZGphY2VuY3kgc2V0cyBvZiBpdHMgbm9kZXMuCisgICAgICBORS5jb25uZWN0KCp0aGlzLCBFSWQpOworICAgICAgcmV0dXJuIEVJZDsKKyAgICB9CisKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBHcmFwaCAmT3RoZXIpIHt9CisKKyAgcHVibGljOgorICAgIHVzaW5nIEFkakVkZ2VJdHIgPSB0eXBlbmFtZSBOb2RlRW50cnk6OkFkakVkZ2VJdHI7CisKKyAgICBjbGFzcyBOb2RlSXRyIHsKKyAgICBwdWJsaWM6CisgICAgICB1c2luZyBpdGVyYXRvcl9jYXRlZ29yeSA9IHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWc7CisgICAgICB1c2luZyB2YWx1ZV90eXBlID0gTm9kZUlkOworICAgICAgdXNpbmcgZGlmZmVyZW5jZV90eXBlID0gaW50OworICAgICAgdXNpbmcgcG9pbnRlciA9IE5vZGVJZCAqOworICAgICAgdXNpbmcgcmVmZXJlbmNlID0gTm9kZUlkICY7CisKKyAgICAgIE5vZGVJdHIoTm9kZUlkIEN1ck5JZCwgY29uc3QgR3JhcGggJkcpCisgICAgICAgIDogQ3VyTklkKEN1ck5JZCksIEVuZE5JZChHLk5vZGVzLnNpemUoKSksIEZyZWVOb2RlSWRzKEcuRnJlZU5vZGVJZHMpIHsKKyAgICAgICAgdGhpcy0+Q3VyTklkID0gZmluZE5leHRJblVzZShDdXJOSWQpOyAvLyBNb3ZlIHRvIGZpcnN0IGluLXVzZSBub2RlIGlkCisgICAgICB9CisKKyAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBOb2RlSXRyICZPKSBjb25zdCB7IHJldHVybiBDdXJOSWQgPT0gTy5DdXJOSWQ7IH0KKyAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBOb2RlSXRyICZPKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IE8pOyB9CisgICAgICBOb2RlSXRyJiBvcGVyYXRvcisrKCkgeyBDdXJOSWQgPSBmaW5kTmV4dEluVXNlKCsrQ3VyTklkKTsgcmV0dXJuICp0aGlzOyB9CisgICAgICBOb2RlSWQgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gQ3VyTklkOyB9CisKKyAgICBwcml2YXRlOgorICAgICAgTm9kZUlkIGZpbmROZXh0SW5Vc2UoTm9kZUlkIE5JZCkgY29uc3QgeworICAgICAgICB3aGlsZSAoTklkIDwgRW5kTklkICYmIGlzX2NvbnRhaW5lZChGcmVlTm9kZUlkcywgTklkKSkgeworICAgICAgICAgICsrTklkOworICAgICAgICB9CisgICAgICAgIHJldHVybiBOSWQ7CisgICAgICB9CisKKyAgICAgIE5vZGVJZCBDdXJOSWQsIEVuZE5JZDsKKyAgICAgIGNvbnN0IEZyZWVOb2RlVmVjdG9yICZGcmVlTm9kZUlkczsKKyAgICB9OworCisgICAgY2xhc3MgRWRnZUl0ciB7CisgICAgcHVibGljOgorICAgICAgRWRnZUl0cihFZGdlSWQgQ3VyRUlkLCBjb25zdCBHcmFwaCAmRykKKyAgICAgICAgOiBDdXJFSWQoQ3VyRUlkKSwgRW5kRUlkKEcuRWRnZXMuc2l6ZSgpKSwgRnJlZUVkZ2VJZHMoRy5GcmVlRWRnZUlkcykgeworICAgICAgICB0aGlzLT5DdXJFSWQgPSBmaW5kTmV4dEluVXNlKEN1ckVJZCk7IC8vIE1vdmUgdG8gZmlyc3QgaW4tdXNlIGVkZ2UgaWQKKyAgICAgIH0KKworICAgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEVkZ2VJdHIgJk8pIGNvbnN0IHsgcmV0dXJuIEN1ckVJZCA9PSBPLkN1ckVJZDsgfQorICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEVkZ2VJdHIgJk8pIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gTyk7IH0KKyAgICAgIEVkZ2VJdHImIG9wZXJhdG9yKysoKSB7IEN1ckVJZCA9IGZpbmROZXh0SW5Vc2UoKytDdXJFSWQpOyByZXR1cm4gKnRoaXM7IH0KKyAgICAgIEVkZ2VJZCBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBDdXJFSWQ7IH0KKworICAgIHByaXZhdGU6CisgICAgICBFZGdlSWQgZmluZE5leHRJblVzZShFZGdlSWQgRUlkKSBjb25zdCB7CisgICAgICAgIHdoaWxlIChFSWQgPCBFbmRFSWQgJiYgaXNfY29udGFpbmVkKEZyZWVFZGdlSWRzLCBFSWQpKSB7CisgICAgICAgICAgKytFSWQ7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEVJZDsKKyAgICAgIH0KKworICAgICAgRWRnZUlkIEN1ckVJZCwgRW5kRUlkOworICAgICAgY29uc3QgRnJlZUVkZ2VWZWN0b3IgJkZyZWVFZGdlSWRzOworICAgIH07CisKKyAgICBjbGFzcyBOb2RlSWRTZXQgeworICAgIHB1YmxpYzoKKyAgICAgIE5vZGVJZFNldChjb25zdCBHcmFwaCAmRykgOiBHKEcpIHt9CisKKyAgICAgIE5vZGVJdHIgYmVnaW4oKSBjb25zdCB7IHJldHVybiBOb2RlSXRyKDAsIEcpOyB9CisgICAgICBOb2RlSXRyIGVuZCgpIGNvbnN0IHsgcmV0dXJuIE5vZGVJdHIoRy5Ob2Rlcy5zaXplKCksIEcpOyB9CisKKyAgICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBHLk5vZGVzLmVtcHR5KCk7IH0KKworICAgICAgdHlwZW5hbWUgTm9kZVZlY3Rvcjo6c2l6ZV90eXBlIHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBHLk5vZGVzLnNpemUoKSAtIEcuRnJlZU5vZGVJZHMuc2l6ZSgpOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IEdyYXBoJiBHOworICAgIH07CisKKyAgICBjbGFzcyBFZGdlSWRTZXQgeworICAgIHB1YmxpYzoKKyAgICAgIEVkZ2VJZFNldChjb25zdCBHcmFwaCAmRykgOiBHKEcpIHt9CisKKyAgICAgIEVkZ2VJdHIgYmVnaW4oKSBjb25zdCB7IHJldHVybiBFZGdlSXRyKDAsIEcpOyB9CisgICAgICBFZGdlSXRyIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEVkZ2VJdHIoRy5FZGdlcy5zaXplKCksIEcpOyB9CisKKyAgICAgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBHLkVkZ2VzLmVtcHR5KCk7IH0KKworICAgICAgdHlwZW5hbWUgTm9kZVZlY3Rvcjo6c2l6ZV90eXBlIHNpemUoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBHLkVkZ2VzLnNpemUoKSAtIEcuRnJlZUVkZ2VJZHMuc2l6ZSgpOworICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgIGNvbnN0IEdyYXBoJiBHOworICAgIH07CisKKyAgICBjbGFzcyBBZGpFZGdlSWRTZXQgeworICAgIHB1YmxpYzoKKyAgICAgIEFkakVkZ2VJZFNldChjb25zdCBOb2RlRW50cnkgJk5FKSA6IE5FKE5FKSB7fQorCisgICAgICB0eXBlbmFtZSBOb2RlRW50cnk6OkFkakVkZ2VJdHIgYmVnaW4oKSBjb25zdCB7CisgICAgICAgIHJldHVybiBORS5nZXRBZGpFZGdlSWRzKCkuYmVnaW4oKTsKKyAgICAgIH0KKworICAgICAgdHlwZW5hbWUgTm9kZUVudHJ5OjpBZGpFZGdlSXRyIGVuZCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIE5FLmdldEFkakVkZ2VJZHMoKS5lbmQoKTsKKyAgICAgIH0KKworICAgICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIE5FLmdldEFkakVkZ2VJZHMoKS5lbXB0eSgpOyB9CisKKyAgICAgIHR5cGVuYW1lIE5vZGVFbnRyeTo6QWRqRWRnZUxpc3Q6OnNpemVfdHlwZSBzaXplKCkgY29uc3QgeworICAgICAgICByZXR1cm4gTkUuZ2V0QWRqRWRnZUlkcygpLnNpemUoKTsKKyAgICAgIH0KKworICAgIHByaXZhdGU6CisgICAgICBjb25zdCBOb2RlRW50cnkgJk5FOworICAgIH07CisKKyAgICAvLy8gQGJyaWVmIENvbnN0cnVjdCBhbiBlbXB0eSBQQlFQIGdyYXBoLgorICAgIEdyYXBoKCkgPSBkZWZhdWx0OworCisgICAgLy8vIEBicmllZiBDb25zdHJ1Y3QgYW4gZW1wdHkgUEJRUCBncmFwaCB3aXRoIHRoZSBnaXZlbiBncmFwaCBtZXRhZGF0YS4KKyAgICBHcmFwaChHcmFwaE1ldGFkYXRhIE1ldGFkYXRhKSA6IE1ldGFkYXRhKHN0ZDo6bW92ZShNZXRhZGF0YSkpIHt9CisKKyAgICAvLy8gQGJyaWVmIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgZ3JhcGggbWV0YWRhdGEuCisgICAgR3JhcGhNZXRhZGF0YSYgZ2V0TWV0YWRhdGEoKSB7IHJldHVybiBNZXRhZGF0YTsgfQorCisgICAgLy8vIEBicmllZiBHZXQgYSBjb25zdC1yZWZlcmVuY2UgdG8gdGhlIGdyYXBoIG1ldGFkYXRhLgorICAgIGNvbnN0IEdyYXBoTWV0YWRhdGEmIGdldE1ldGFkYXRhKCkgY29uc3QgeyByZXR1cm4gTWV0YWRhdGE7IH0KKworICAgIC8vLyBAYnJpZWYgTG9jayB0aGlzIGdyYXBoIHRvIHRoZSBnaXZlbiBzb2x2ZXIgaW5zdGFuY2UgaW4gcHJlcGFyYXRpb24KKyAgICAvLy8gZm9yIHJ1bm5pbmcgdGhlIHNvbHZlci4gVGhpcyBtZXRob2Qgd2lsbCBjYWxsIHNvbHZlci5oYW5kbGVBZGROb2RlIGZvcgorICAgIC8vLyBlYWNoIG5vZGUgaW4gdGhlIGdyYXBoLCBhbmQgaGFuZGxlQWRkRWRnZSBmb3IgZWFjaCBlZGdlLCB0byBnaXZlIHRoZQorICAgIC8vLyBzb2x2ZXIgYW4gb3Bwb3J0dW5pdHkgdG8gc2V0IHVwIGFueSByZXF1cmllZCBtZXRhZGF0YS4KKyAgICB2b2lkIHNldFNvbHZlcihTb2x2ZXJUICZTKSB7CisgICAgICBhc3NlcnQoIVNvbHZlciAmJiAiU29sdmVyIGFscmVhZHkgc2V0LiBDYWxsIHVuc2V0U29sdmVyKCkuIik7CisgICAgICBTb2x2ZXIgPSAmUzsKKyAgICAgIGZvciAoYXV0byBOSWQgOiBub2RlSWRzKCkpCisgICAgICAgIFNvbHZlci0+aGFuZGxlQWRkTm9kZShOSWQpOworICAgICAgZm9yIChhdXRvIEVJZCA6IGVkZ2VJZHMoKSkKKyAgICAgICAgU29sdmVyLT5oYW5kbGVBZGRFZGdlKEVJZCk7CisgICAgfQorCisgICAgLy8vIEBicmllZiBSZWxlYXNlIGZyb20gc29sdmVyIGluc3RhbmNlLgorICAgIHZvaWQgdW5zZXRTb2x2ZXIoKSB7CisgICAgICBhc3NlcnQoU29sdmVyICYmICJTb2x2ZXIgbm90IHNldC4iKTsKKyAgICAgIFNvbHZlciA9IG51bGxwdHI7CisgICAgfQorCisgICAgLy8vIEBicmllZiBBZGQgYSBub2RlIHdpdGggdGhlIGdpdmVuIGNvc3RzLgorICAgIC8vLyBAcGFyYW0gQ29zdHMgQ29zdCB2ZWN0b3IgZm9yIHRoZSBuZXcgbm9kZS4KKyAgICAvLy8gQHJldHVybiBOb2RlIGl0ZXJhdG9yIGZvciB0aGUgYWRkZWQgbm9kZS4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3RoZXJWZWN0b3JUPgorICAgIE5vZGVJZCBhZGROb2RlKE90aGVyVmVjdG9yVCBDb3N0cykgeworICAgICAgLy8gR2V0IGNvc3QgdmVjdG9yIGZyb20gdGhlIHByb2JsZW0gZG9tYWluCisgICAgICBWZWN0b3JQdHIgQWxsb2NhdGVkQ29zdHMgPSBDb3N0QWxsb2MuZ2V0VmVjdG9yKHN0ZDo6bW92ZShDb3N0cykpOworICAgICAgTm9kZUlkIE5JZCA9IGFkZENvbnN0cnVjdGVkTm9kZShOb2RlRW50cnkoQWxsb2NhdGVkQ29zdHMpKTsKKyAgICAgIGlmIChTb2x2ZXIpCisgICAgICAgIFNvbHZlci0+aGFuZGxlQWRkTm9kZShOSWQpOworICAgICAgcmV0dXJuIE5JZDsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIEFkZCBhIG5vZGUgYnlwYXNzaW5nIHRoZSBjb3N0IGFsbG9jYXRvci4KKyAgICAvLy8gQHBhcmFtIENvc3RzIENvc3QgdmVjdG9yIHB0ciBmb3IgdGhlIG5ldyBub2RlIChtdXN0IGJlIGNvbnZlcnRpYmxlIHRvCisgICAgLy8vICAgICAgICBWZWN0b3JQdHIpLgorICAgIC8vLyBAcmV0dXJuIE5vZGUgaXRlcmF0b3IgZm9yIHRoZSBhZGRlZCBub2RlLgorICAgIC8vLworICAgIC8vLyAgIFRoaXMgbWV0aG9kIGFsbG93cyBmb3IgZmFzdCBhZGRpdGlvbiBvZiBhIG5vZGUgd2hvc2UgY29zdHMgZG9uJ3QgbmVlZAorICAgIC8vLyB0byBiZSBwYXNzZWQgdGhyb3VnaCB0aGUgY29zdCBhbGxvY2F0b3IuIFRoZSBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IKKyAgICAvLy8gdGhpcyBpcyB3aGVuIGR1cGxpY2F0aW5nIGNvc3RzIGZyb20gYW4gZXhpc3Rpbmcgbm9kZSAod2hlbiB1c2luZyBhCisgICAgLy8vIHBvb2xpbmcgYWxsb2NhdG9yKS4gVGhlc2UgaGF2ZSBhbHJlYWR5IGJlZW4gdW5pcXVlZCwgc28gd2UgY2FuIGF2b2lkCisgICAgLy8vIHJlLWNvbnN0cnVjdGluZyBhbmQgcmUtdW5pcXVpbmcgdGhlbSBieSBhdHRhY2hpbmcgdGhlbSBkaXJlY3RseSB0byB0aGUKKyAgICAvLy8gbmV3IG5vZGUuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIE90aGVyVmVjdG9yUHRyVD4KKyAgICBOb2RlSWQgYWRkTm9kZUJ5cGFzc2luZ0Nvc3RBbGxvY2F0b3IoT3RoZXJWZWN0b3JQdHJUIENvc3RzKSB7CisgICAgICBOb2RlSWQgTklkID0gYWRkQ29uc3RydWN0ZWROb2RlKE5vZGVFbnRyeShDb3N0cykpOworICAgICAgaWYgKFNvbHZlcikKKyAgICAgICAgU29sdmVyLT5oYW5kbGVBZGROb2RlKE5JZCk7CisgICAgICByZXR1cm4gTklkOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgQWRkIGFuIGVkZ2UgYmV0d2VlbiB0aGUgZ2l2ZW4gbm9kZXMgd2l0aCB0aGUgZ2l2ZW4gY29zdHMuCisgICAgLy8vIEBwYXJhbSBOMUlkIEZpcnN0IG5vZGUuCisgICAgLy8vIEBwYXJhbSBOMklkIFNlY29uZCBub2RlLgorICAgIC8vLyBAcGFyYW0gQ29zdHMgQ29zdCBtYXRyaXggZm9yIG5ldyBlZGdlLgorICAgIC8vLyBAcmV0dXJuIEVkZ2UgaXRlcmF0b3IgZm9yIHRoZSBhZGRlZCBlZGdlLgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdGhlclZlY3RvclQ+CisgICAgRWRnZUlkIGFkZEVkZ2UoTm9kZUlkIE4xSWQsIE5vZGVJZCBOMklkLCBPdGhlclZlY3RvclQgQ29zdHMpIHsKKyAgICAgIGFzc2VydChnZXROb2RlQ29zdHMoTjFJZCkuZ2V0TGVuZ3RoKCkgPT0gQ29zdHMuZ2V0Um93cygpICYmCisgICAgICAgICAgICAgZ2V0Tm9kZUNvc3RzKE4ySWQpLmdldExlbmd0aCgpID09IENvc3RzLmdldENvbHMoKSAmJgorICAgICAgICAgICAgICJNYXRyaXggZGltZW5zaW9ucyBtaXNtYXRjaC4iKTsKKyAgICAgIC8vIEdldCBjb3N0IG1hdHJpeCBmcm9tIHRoZSBwcm9ibGVtIGRvbWFpbi4KKyAgICAgIE1hdHJpeFB0ciBBbGxvY2F0ZWRDb3N0cyA9IENvc3RBbGxvYy5nZXRNYXRyaXgoc3RkOjptb3ZlKENvc3RzKSk7CisgICAgICBFZGdlSWQgRUlkID0gYWRkQ29uc3RydWN0ZWRFZGdlKEVkZ2VFbnRyeShOMUlkLCBOMklkLCBBbGxvY2F0ZWRDb3N0cykpOworICAgICAgaWYgKFNvbHZlcikKKyAgICAgICAgU29sdmVyLT5oYW5kbGVBZGRFZGdlKEVJZCk7CisgICAgICByZXR1cm4gRUlkOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgQWRkIGFuIGVkZ2UgYnlwYXNzaW5nIHRoZSBjb3N0IGFsbG9jYXRvci4KKyAgICAvLy8gQHBhcmFtIE4xSWQgRmlyc3Qgbm9kZS4KKyAgICAvLy8gQHBhcmFtIE4ySWQgU2Vjb25kIG5vZGUuCisgICAgLy8vIEBwYXJhbSBDb3N0cyBDb3N0IG1hdHJpeCBmb3IgbmV3IGVkZ2UuCisgICAgLy8vIEByZXR1cm4gRWRnZSBpdGVyYXRvciBmb3IgdGhlIGFkZGVkIGVkZ2UuCisgICAgLy8vCisgICAgLy8vICAgVGhpcyBtZXRob2QgYWxsb3dzIGZvciBmYXN0IGFkZGl0aW9uIG9mIGFuIGVkZ2Ugd2hvc2UgY29zdHMgZG9uJ3QgbmVlZAorICAgIC8vLyB0byBiZSBwYXNzZWQgdGhyb3VnaCB0aGUgY29zdCBhbGxvY2F0b3IuIFRoZSBtb3N0IGNvbW1vbiB1c2UgY2FzZSBmb3IKKyAgICAvLy8gdGhpcyBpcyB3aGVuIGR1cGxpY2F0aW5nIGNvc3RzIGZyb20gYW4gZXhpc3RpbmcgZWRnZSAod2hlbiB1c2luZyBhCisgICAgLy8vIHBvb2xpbmcgYWxsb2NhdG9yKS4gVGhlc2UgaGF2ZSBhbHJlYWR5IGJlZW4gdW5pcXVlZCwgc28gd2UgY2FuIGF2b2lkCisgICAgLy8vIHJlLWNvbnN0cnVjdGluZyBhbmQgcmUtdW5pcXVpbmcgdGhlbSBieSBhdHRhY2hpbmcgdGhlbSBkaXJlY3RseSB0byB0aGUKKyAgICAvLy8gbmV3IGVkZ2UuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIE90aGVyTWF0cml4UHRyVD4KKyAgICBOb2RlSWQgYWRkRWRnZUJ5cGFzc2luZ0Nvc3RBbGxvY2F0b3IoTm9kZUlkIE4xSWQsIE5vZGVJZCBOMklkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdGhlck1hdHJpeFB0clQgQ29zdHMpIHsKKyAgICAgIGFzc2VydChnZXROb2RlQ29zdHMoTjFJZCkuZ2V0TGVuZ3RoKCkgPT0gQ29zdHMtPmdldFJvd3MoKSAmJgorICAgICAgICAgICAgIGdldE5vZGVDb3N0cyhOMklkKS5nZXRMZW5ndGgoKSA9PSBDb3N0cy0+Z2V0Q29scygpICYmCisgICAgICAgICAgICAgIk1hdHJpeCBkaW1lbnNpb25zIG1pc21hdGNoLiIpOworICAgICAgLy8gR2V0IGNvc3QgbWF0cml4IGZyb20gdGhlIHByb2JsZW0gZG9tYWluLgorICAgICAgRWRnZUlkIEVJZCA9IGFkZENvbnN0cnVjdGVkRWRnZShFZGdlRW50cnkoTjFJZCwgTjJJZCwgQ29zdHMpKTsKKyAgICAgIGlmIChTb2x2ZXIpCisgICAgICAgIFNvbHZlci0+aGFuZGxlQWRkRWRnZShFSWQpOworICAgICAgcmV0dXJuIEVJZDsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ3JhcGggaXMgZW1wdHkuCisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIE5vZGVJZFNldCgqdGhpcykuZW1wdHkoKTsgfQorCisgICAgTm9kZUlkU2V0IG5vZGVJZHMoKSBjb25zdCB7IHJldHVybiBOb2RlSWRTZXQoKnRoaXMpOyB9CisgICAgRWRnZUlkU2V0IGVkZ2VJZHMoKSBjb25zdCB7IHJldHVybiBFZGdlSWRTZXQoKnRoaXMpOyB9CisKKyAgICBBZGpFZGdlSWRTZXQgYWRqRWRnZUlkcyhOb2RlSWQgTklkKSB7IHJldHVybiBBZGpFZGdlSWRTZXQoZ2V0Tm9kZShOSWQpKTsgfQorCisgICAgLy8vIEBicmllZiBHZXQgdGhlIG51bWJlciBvZiBub2RlcyBpbiB0aGUgZ3JhcGguCisgICAgLy8vIEByZXR1cm4gTnVtYmVyIG9mIG5vZGVzIGluIHRoZSBncmFwaC4KKyAgICB1bnNpZ25lZCBnZXROdW1Ob2RlcygpIGNvbnN0IHsgcmV0dXJuIE5vZGVJZFNldCgqdGhpcykuc2l6ZSgpOyB9CisKKyAgICAvLy8gQGJyaWVmIEdldCB0aGUgbnVtYmVyIG9mIGVkZ2VzIGluIHRoZSBncmFwaC4KKyAgICAvLy8gQHJldHVybiBOdW1iZXIgb2YgZWRnZXMgaW4gdGhlIGdyYXBoLgorICAgIHVuc2lnbmVkIGdldE51bUVkZ2VzKCkgY29uc3QgeyByZXR1cm4gRWRnZUlkU2V0KCp0aGlzKS5zaXplKCk7IH0KKworICAgIC8vLyBAYnJpZWYgU2V0IGEgbm9kZSdzIGNvc3QgdmVjdG9yLgorICAgIC8vLyBAcGFyYW0gTklkIE5vZGUgdG8gdXBkYXRlLgorICAgIC8vLyBAcGFyYW0gQ29zdHMgTmV3IGNvc3RzIHRvIHNldC4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3RoZXJWZWN0b3JUPgorICAgIHZvaWQgc2V0Tm9kZUNvc3RzKE5vZGVJZCBOSWQsIE90aGVyVmVjdG9yVCBDb3N0cykgeworICAgICAgVmVjdG9yUHRyIEFsbG9jYXRlZENvc3RzID0gQ29zdEFsbG9jLmdldFZlY3RvcihzdGQ6Om1vdmUoQ29zdHMpKTsKKyAgICAgIGlmIChTb2x2ZXIpCisgICAgICAgIFNvbHZlci0+aGFuZGxlU2V0Tm9kZUNvc3RzKE5JZCwgKkFsbG9jYXRlZENvc3RzKTsKKyAgICAgIGdldE5vZGUoTklkKS5Db3N0cyA9IEFsbG9jYXRlZENvc3RzOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgR2V0IGEgVmVjdG9yUHRyIHRvIGEgbm9kZSdzIGNvc3QgdmVjdG9yLiBSYXJlbHkgdXNlZnVsIC0gdXNlCisgICAgLy8vICAgICAgICBnZXROb2RlQ29zdHMgd2hlcmUgcG9zc2libGUuCisgICAgLy8vIEBwYXJhbSBOSWQgTm9kZSBpZC4KKyAgICAvLy8gQHJldHVybiBWZWN0b3JQdHIgdG8gbm9kZSBjb3N0IHZlY3Rvci4KKyAgICAvLy8KKyAgICAvLy8gICBUaGlzIG1ldGhvZCBpcyBwcmltYXJpbHkgdXNlZnVsIGZvciBkdXBsaWNhdGluZyBjb3N0cyBxdWlja2x5IGJ5CisgICAgLy8vIGJ5cGFzc2luZyB0aGUgY29zdCBhbGxvY2F0b3IuIFNlZSBhZGROb2RlQnlwYXNzaW5nQ29zdEFsbG9jYXRvci4gUHJlZmVyCisgICAgLy8vIGdldE5vZGVDb3N0cyB3aGVuIGRlYWxpbmcgd2l0aCBub2RlIGNvc3QgdmFsdWVzLgorICAgIGNvbnN0IFZlY3RvclB0ciYgZ2V0Tm9kZUNvc3RzUHRyKE5vZGVJZCBOSWQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXROb2RlKE5JZCkuQ29zdHM7CisgICAgfQorCisgICAgLy8vIEBicmllZiBHZXQgYSBub2RlJ3MgY29zdCB2ZWN0b3IuCisgICAgLy8vIEBwYXJhbSBOSWQgTm9kZSBpZC4KKyAgICAvLy8gQHJldHVybiBOb2RlIGNvc3QgdmVjdG9yLgorICAgIGNvbnN0IFZlY3RvciYgZ2V0Tm9kZUNvc3RzKE5vZGVJZCBOSWQpIGNvbnN0IHsKKyAgICAgIHJldHVybiAqZ2V0Tm9kZUNvc3RzUHRyKE5JZCk7CisgICAgfQorCisgICAgTm9kZU1ldGFkYXRhJiBnZXROb2RlTWV0YWRhdGEoTm9kZUlkIE5JZCkgeworICAgICAgcmV0dXJuIGdldE5vZGUoTklkKS5NZXRhZGF0YTsKKyAgICB9CisKKyAgICBjb25zdCBOb2RlTWV0YWRhdGEmIGdldE5vZGVNZXRhZGF0YShOb2RlSWQgTklkKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0Tm9kZShOSWQpLk1ldGFkYXRhOworICAgIH0KKworICAgIHR5cGVuYW1lIE5vZGVFbnRyeTo6QWRqRWRnZUxpc3Q6OnNpemVfdHlwZSBnZXROb2RlRGVncmVlKE5vZGVJZCBOSWQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXROb2RlKE5JZCkuZ2V0QWRqRWRnZUlkcygpLnNpemUoKTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIFVwZGF0ZSBhbiBlZGdlJ3MgY29zdCBtYXRyaXguCisgICAgLy8vIEBwYXJhbSBFSWQgRWRnZSBpZC4KKyAgICAvLy8gQHBhcmFtIENvc3RzIE5ldyBjb3N0IG1hdHJpeC4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3RoZXJNYXRyaXhUPgorICAgIHZvaWQgdXBkYXRlRWRnZUNvc3RzKEVkZ2VJZCBFSWQsIE90aGVyTWF0cml4VCBDb3N0cykgeworICAgICAgTWF0cml4UHRyIEFsbG9jYXRlZENvc3RzID0gQ29zdEFsbG9jLmdldE1hdHJpeChzdGQ6Om1vdmUoQ29zdHMpKTsKKyAgICAgIGlmIChTb2x2ZXIpCisgICAgICAgIFNvbHZlci0+aGFuZGxlVXBkYXRlQ29zdHMoRUlkLCAqQWxsb2NhdGVkQ29zdHMpOworICAgICAgZ2V0RWRnZShFSWQpLkNvc3RzID0gQWxsb2NhdGVkQ29zdHM7CisgICAgfQorCisgICAgLy8vIEBicmllZiBHZXQgYSBNYXRyaXhQdHIgdG8gYSBub2RlJ3MgY29zdCBtYXRyaXguIFJhcmVseSB1c2VmdWwgLSB1c2UKKyAgICAvLy8gICAgICAgIGdldEVkZ2VDb3N0cyB3aGVyZSBwb3NzaWJsZS4KKyAgICAvLy8gQHBhcmFtIEVJZCBFZGdlIGlkLgorICAgIC8vLyBAcmV0dXJuIE1hdHJpeFB0ciB0byBlZGdlIGNvc3QgbWF0cml4LgorICAgIC8vLworICAgIC8vLyAgIFRoaXMgbWV0aG9kIGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIGR1cGxpY2F0aW5nIGNvc3RzIHF1aWNrbHkgYnkKKyAgICAvLy8gYnlwYXNzaW5nIHRoZSBjb3N0IGFsbG9jYXRvci4gU2VlIGFkZE5vZGVCeXBhc3NpbmdDb3N0QWxsb2NhdG9yLiBQcmVmZXIKKyAgICAvLy8gZ2V0RWRnZUNvc3RzIHdoZW4gZGVhbGluZyB3aXRoIGVkZ2UgY29zdCB2YWx1ZXMuCisgICAgY29uc3QgTWF0cml4UHRyJiBnZXRFZGdlQ29zdHNQdHIoRWRnZUlkIEVJZCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldEVkZ2UoRUlkKS5Db3N0czsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIEdldCBhbiBlZGdlJ3MgY29zdCBtYXRyaXguCisgICAgLy8vIEBwYXJhbSBFSWQgRWRnZSBpZC4KKyAgICAvLy8gQHJldHVybiBFZGdlIGNvc3QgbWF0cml4LgorICAgIGNvbnN0IE1hdHJpeCYgZ2V0RWRnZUNvc3RzKEVkZ2VJZCBFSWQpIGNvbnN0IHsKKyAgICAgIHJldHVybiAqZ2V0RWRnZShFSWQpLkNvc3RzOworICAgIH0KKworICAgIEVkZ2VNZXRhZGF0YSYgZ2V0RWRnZU1ldGFkYXRhKEVkZ2VJZCBFSWQpIHsKKyAgICAgIHJldHVybiBnZXRFZGdlKEVJZCkuTWV0YWRhdGE7CisgICAgfQorCisgICAgY29uc3QgRWRnZU1ldGFkYXRhJiBnZXRFZGdlTWV0YWRhdGEoRWRnZUlkIEVJZCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldEVkZ2UoRUlkKS5NZXRhZGF0YTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIEdldCB0aGUgZmlyc3Qgbm9kZSBjb25uZWN0ZWQgdG8gdGhpcyBlZGdlLgorICAgIC8vLyBAcGFyYW0gRUlkIEVkZ2UgaWQuCisgICAgLy8vIEByZXR1cm4gVGhlIGZpcnN0IG5vZGUgY29ubmVjdGVkIHRvIHRoZSBnaXZlbiBlZGdlLgorICAgIE5vZGVJZCBnZXRFZGdlTm9kZTFJZChFZGdlSWQgRUlkKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0RWRnZShFSWQpLmdldE4xSWQoKTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIEdldCB0aGUgc2Vjb25kIG5vZGUgY29ubmVjdGVkIHRvIHRoaXMgZWRnZS4KKyAgICAvLy8gQHBhcmFtIEVJZCBFZGdlIGlkLgorICAgIC8vLyBAcmV0dXJuIFRoZSBzZWNvbmQgbm9kZSBjb25uZWN0ZWQgdG8gdGhlIGdpdmVuIGVkZ2UuCisgICAgTm9kZUlkIGdldEVkZ2VOb2RlMklkKEVkZ2VJZCBFSWQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRFZGdlKEVJZCkuZ2V0TjJJZCgpOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgR2V0IHRoZSAib3RoZXIiIG5vZGUgY29ubmVjdGVkIHRvIHRoaXMgZWRnZS4KKyAgICAvLy8gQHBhcmFtIEVJZCBFZGdlIGlkLgorICAgIC8vLyBAcGFyYW0gTklkIE5vZGUgaWQgZm9yIHRoZSAiZ2l2ZW4iIG5vZGUuCisgICAgLy8vIEByZXR1cm4gVGhlIGl0ZXJhdG9yIGZvciB0aGUgIm90aGVyIiBub2RlIGNvbm5lY3RlZCB0byB0aGlzIGVkZ2UuCisgICAgTm9kZUlkIGdldEVkZ2VPdGhlck5vZGVJZChFZGdlSWQgRUlkLCBOb2RlSWQgTklkKSB7CisgICAgICBFZGdlRW50cnkgJkUgPSBnZXRFZGdlKEVJZCk7CisgICAgICBpZiAoRS5nZXROMUlkKCkgPT0gTklkKSB7CisgICAgICAgIHJldHVybiBFLmdldE4ySWQoKTsKKyAgICAgIH0gLy8gZWxzZQorICAgICAgcmV0dXJuIEUuZ2V0TjFJZCgpOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgR2V0IHRoZSBlZGdlIGNvbm5lY3RpbmcgdHdvIG5vZGVzLgorICAgIC8vLyBAcGFyYW0gTjFJZCBGaXJzdCBub2RlIGlkLgorICAgIC8vLyBAcGFyYW0gTjJJZCBTZWNvbmQgbm9kZSBpZC4KKyAgICAvLy8gQHJldHVybiBBbiBpZCBmb3IgZWRnZSAoTjFJZCwgTjJJZCkgaWYgc3VjaCBhbiBlZGdlIGV4aXN0cywKKyAgICAvLy8gICAgICAgICBvdGhlcndpc2UgcmV0dXJucyBhbiBpbnZhbGlkIGVkZ2UgaWQuCisgICAgRWRnZUlkIGZpbmRFZGdlKE5vZGVJZCBOMUlkLCBOb2RlSWQgTjJJZCkgeworICAgICAgZm9yIChhdXRvIEFFSWQgOiBhZGpFZGdlSWRzKE4xSWQpKSB7CisgICAgICAgIGlmICgoZ2V0RWRnZU5vZGUxSWQoQUVJZCkgPT0gTjJJZCkgfHwKKyAgICAgICAgICAgIChnZXRFZGdlTm9kZTJJZChBRUlkKSA9PSBOMklkKSkgeworICAgICAgICAgIHJldHVybiBBRUlkOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gaW52YWxpZEVkZ2VJZCgpOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgUmVtb3ZlIGEgbm9kZSBmcm9tIHRoZSBncmFwaC4KKyAgICAvLy8gQHBhcmFtIE5JZCBOb2RlIGlkLgorICAgIHZvaWQgcmVtb3ZlTm9kZShOb2RlSWQgTklkKSB7CisgICAgICBpZiAoU29sdmVyKQorICAgICAgICBTb2x2ZXItPmhhbmRsZVJlbW92ZU5vZGUoTklkKTsKKyAgICAgIE5vZGVFbnRyeSAmTiA9IGdldE5vZGUoTklkKTsKKyAgICAgIC8vIFRPRE86IENhbiB0aGlzIGJlIGZvci1lYWNoJ2Q/CisgICAgICBmb3IgKEFkakVkZ2VJdHIgQUVJdHIgPSBOLmFkakVkZ2VzQmVnaW4oKSwKKyAgICAgICAgICAgICBBRUVuZCA9IE4uYWRqRWRnZXNFbmQoKTsKKyAgICAgICAgICAgQUVJdHIgIT0gQUVFbmQ7KSB7CisgICAgICAgIEVkZ2VJZCBFSWQgPSAqQUVJdHI7CisgICAgICAgICsrQUVJdHI7CisgICAgICAgIHJlbW92ZUVkZ2UoRUlkKTsKKyAgICAgIH0KKyAgICAgIEZyZWVOb2RlSWRzLnB1c2hfYmFjayhOSWQpOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgRGlzY29ubmVjdCBhbiBlZGdlIGZyb20gdGhlIGdpdmVuIG5vZGUuCisgICAgLy8vCisgICAgLy8vIFJlbW92ZXMgdGhlIGdpdmVuIGVkZ2UgZnJvbSB0aGUgYWRqYWNlbmN5IGxpc3Qgb2YgdGhlIGdpdmVuIG5vZGUuCisgICAgLy8vIFRoaXMgb3BlcmF0aW9uIGxlYXZlcyB0aGUgZWRnZSBpbiBhbiAnYXN5bW1ldHJpYycgc3RhdGU6IEl0IHdpbGwgbm8KKyAgICAvLy8gbG9uZ2VyIGFwcGVhciBpbiBhbiBpdGVyYXRpb24gb3ZlciB0aGUgZ2l2ZW4gbm9kZSdzIChOSWQncykgZWRnZXMsIGJ1dAorICAgIC8vLyB3aWxsIGFwcGVhciBpbiBhbiBpdGVyYXRpb24gb3ZlciB0aGUgJ290aGVyJywgdW5uYW1lZCBub2RlJ3MgZWRnZXMuCisgICAgLy8vCisgICAgLy8vIFRoaXMgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhbnkgbm9ybWFsIGdyYXBoIG9wZXJhdGlvbiwgYnV0IGV4aXN0cyB0bworICAgIC8vLyBzdXBwb3J0IGVmZmljaWVudCBQQlFQIGdyYXBoLXJlZHVjdGlvbiBiYXNlZCBzb2x2ZXJzLiBJdCBpcyB1c2VkIHRvCisgICAgLy8vICdlZmZlY3RpdmVseScgcmVtb3ZlIHRoZSB1bm5hbWVkIG5vZGUgZnJvbSB0aGUgZ3JhcGggd2hpbGUgdGhlIHNvbHZlcgorICAgIC8vLyBpcyBwZXJmb3JtaW5nIHRoZSByZWR1Y3Rpb24uIFRoZSBzb2x2ZXIgd2lsbCBsYXRlciBjYWxsIHJlY29ubmVjdE5vZGUKKyAgICAvLy8gdG8gcmVzdG9yZSB0aGUgZWRnZSBpbiB0aGUgbmFtZWQgbm9kZSdzIGFkamFjZW5jeSBsaXN0LgorICAgIC8vLworICAgIC8vLyBTaW5jZSB0aGUgZGVncmVlIG9mIGEgbm9kZSBpcyB0aGUgbnVtYmVyIG9mIGNvbm5lY3RlZCBlZGdlcywKKyAgICAvLy8gZGlzY29ubmVjdGluZyBhbiBlZGdlIGZyb20gYSBub2RlICd1JyB3aWxsIGNhdXNlIHRoZSBkZWdyZWUgb2YgJ3UnIHRvCisgICAgLy8vIGRyb3AgYnkgMS4KKyAgICAvLy8KKyAgICAvLy8gQSBkaXNjb25uZWN0ZWQgZWRnZSBXSUxMIHN0aWxsIGFwcGVhciBpbiBhbiBpdGVyYXRpb24gb3ZlciB0aGUgZ3JhcGgKKyAgICAvLy8gZWRnZXMuCisgICAgLy8vCisgICAgLy8vIEEgZGlzY29ubmVjdGVkIGVkZ2Ugc2hvdWxkIG5vdCBiZSByZW1vdmVkIGZyb20gdGhlIGdyYXBoLCBpdCBzaG91bGQgYmUKKyAgICAvLy8gcmVjb25uZWN0ZWQgZmlyc3QuCisgICAgLy8vCisgICAgLy8vIEEgZGlzY29ubmVjdGVkIGVkZ2UgY2FuIGJlIHJlY29ubmVjdGVkIGJ5IGNhbGxpbmcgdGhlIHJlY29ubmVjdEVkZ2UKKyAgICAvLy8gbWV0aG9kLgorICAgIHZvaWQgZGlzY29ubmVjdEVkZ2UoRWRnZUlkIEVJZCwgTm9kZUlkIE5JZCkgeworICAgICAgaWYgKFNvbHZlcikKKyAgICAgICAgU29sdmVyLT5oYW5kbGVEaXNjb25uZWN0RWRnZShFSWQsIE5JZCk7CisKKyAgICAgIEVkZ2VFbnRyeSAmRSA9IGdldEVkZ2UoRUlkKTsKKyAgICAgIEUuZGlzY29ubmVjdEZyb20oKnRoaXMsIE5JZCk7CisgICAgfQorCisgICAgLy8vIEBicmllZiBDb252ZW5pZW5jZSBtZXRob2QgdG8gZGlzY29ubmVjdCBhbGwgbmVpZ2hib3VycyBmcm9tIHRoZSBnaXZlbgorICAgIC8vLyAgICAgICAgbm9kZS4KKyAgICB2b2lkIGRpc2Nvbm5lY3RBbGxOZWlnaGJvcnNGcm9tTm9kZShOb2RlSWQgTklkKSB7CisgICAgICBmb3IgKGF1dG8gQUVJZCA6IGFkakVkZ2VJZHMoTklkKSkKKyAgICAgICAgZGlzY29ubmVjdEVkZ2UoQUVJZCwgZ2V0RWRnZU90aGVyTm9kZUlkKEFFSWQsIE5JZCkpOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgUmUtYXR0YWNoIGFuIGVkZ2UgdG8gaXRzIG5vZGVzLgorICAgIC8vLworICAgIC8vLyBBZGRzIGFuIGVkZ2UgdGhhdCBoYWQgYmVlbiBwcmV2aW91c2x5IGRpc2Nvbm5lY3RlZCBiYWNrIGludG8gdGhlCisgICAgLy8vIGFkamFjZW5jeSBzZXQgb2YgdGhlIG5vZGVzIHRoYXQgdGhlIGVkZ2UgY29ubmVjdHMuCisgICAgdm9pZCByZWNvbm5lY3RFZGdlKEVkZ2VJZCBFSWQsIE5vZGVJZCBOSWQpIHsKKyAgICAgIEVkZ2VFbnRyeSAmRSA9IGdldEVkZ2UoRUlkKTsKKyAgICAgIEUuY29ubmVjdFRvKCp0aGlzLCBFSWQsIE5JZCk7CisgICAgICBpZiAoU29sdmVyKQorICAgICAgICBTb2x2ZXItPmhhbmRsZVJlY29ubmVjdEVkZ2UoRUlkLCBOSWQpOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgUmVtb3ZlIGFuIGVkZ2UgZnJvbSB0aGUgZ3JhcGguCisgICAgLy8vIEBwYXJhbSBFSWQgRWRnZSBpZC4KKyAgICB2b2lkIHJlbW92ZUVkZ2UoRWRnZUlkIEVJZCkgeworICAgICAgaWYgKFNvbHZlcikKKyAgICAgICAgU29sdmVyLT5oYW5kbGVSZW1vdmVFZGdlKEVJZCk7CisgICAgICBFZGdlRW50cnkgJkUgPSBnZXRFZGdlKEVJZCk7CisgICAgICBFLmRpc2Nvbm5lY3QoKTsKKyAgICAgIEZyZWVFZGdlSWRzLnB1c2hfYmFjayhFSWQpOworICAgICAgRWRnZXNbRUlkXS5pbnZhbGlkYXRlKCk7CisgICAgfQorCisgICAgLy8vIEBicmllZiBSZW1vdmUgYWxsIG5vZGVzIGFuZCBlZGdlcyBmcm9tIHRoZSBncmFwaC4KKyAgICB2b2lkIGNsZWFyKCkgeworICAgICAgTm9kZXMuY2xlYXIoKTsKKyAgICAgIEZyZWVOb2RlSWRzLmNsZWFyKCk7CisgICAgICBFZGdlcy5jbGVhcigpOworICAgICAgRnJlZUVkZ2VJZHMuY2xlYXIoKTsKKyAgICB9CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBQQlFQCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1BCUVBfR1JBUEhfSFBQCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUEJRUC9NYXRoLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUEJRUC9NYXRoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmE0MDVlOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9QQlFQL01hdGguaApAQCAtMCwwICsxLDI5MiBAQAorLy89PT0tIE1hdGguaCAtIFBCUVAgVmVjdG9yIGFuZCBNYXRyaXggY2xhc3NlcyAtLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fUEJRUF9NQVRIX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1BCUVBfTUFUSF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9IYXNoaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBQQlFQIHsKKwordXNpbmcgUEJRUE51bSA9IGZsb2F0OworCisvLy8gXGJyaWVmIFBCUVAgVmVjdG9yIGNsYXNzLgorY2xhc3MgVmVjdG9yIHsKKyAgZnJpZW5kIGhhc2hfY29kZSBoYXNoX3ZhbHVlKGNvbnN0IFZlY3RvciAmKTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIFBCUVAgdmVjdG9yIG9mIHRoZSBnaXZlbiBzaXplLgorICBleHBsaWNpdCBWZWN0b3IodW5zaWduZWQgTGVuZ3RoKQorICAgIDogTGVuZ3RoKExlbmd0aCksIERhdGEobGx2bTo6bWFrZV91bmlxdWU8UEJRUE51bSBbXT4oTGVuZ3RoKSkge30KKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIFBCUVAgdmVjdG9yIHdpdGggaW5pdGlhbGl6ZXIuCisgIFZlY3Rvcih1bnNpZ25lZCBMZW5ndGgsIFBCUVBOdW0gSW5pdFZhbCkKKyAgICA6IExlbmd0aChMZW5ndGgpLCBEYXRhKGxsdm06Om1ha2VfdW5pcXVlPFBCUVBOdW0gW10+KExlbmd0aCkpIHsKKyAgICBzdGQ6OmZpbGwoRGF0YS5nZXQoKSwgRGF0YS5nZXQoKSArIExlbmd0aCwgSW5pdFZhbCk7CisgIH0KKworICAvLy8gXGJyaWVmIENvcHkgY29uc3RydWN0IGEgUEJRUCB2ZWN0b3IuCisgIFZlY3Rvcihjb25zdCBWZWN0b3IgJlYpCisgICAgOiBMZW5ndGgoVi5MZW5ndGgpLCBEYXRhKGxsdm06Om1ha2VfdW5pcXVlPFBCUVBOdW0gW10+KExlbmd0aCkpIHsKKyAgICBzdGQ6OmNvcHkoVi5EYXRhLmdldCgpLCBWLkRhdGEuZ2V0KCkgKyBMZW5ndGgsIERhdGEuZ2V0KCkpOworICB9CisKKyAgLy8vIFxicmllZiBNb3ZlIGNvbnN0cnVjdCBhIFBCUVAgdmVjdG9yLgorICBWZWN0b3IoVmVjdG9yICYmVikKKyAgICA6IExlbmd0aChWLkxlbmd0aCksIERhdGEoc3RkOjptb3ZlKFYuRGF0YSkpIHsKKyAgICBWLkxlbmd0aCA9IDA7CisgIH0KKworICAvLy8gXGJyaWVmIENvbXBhcmlzb24gb3BlcmF0b3IuCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBWZWN0b3IgJlYpIGNvbnN0IHsKKyAgICBhc3NlcnQoTGVuZ3RoICE9IDAgJiYgRGF0YSAmJiAiSW52YWxpZCB2ZWN0b3IiKTsKKyAgICBpZiAoTGVuZ3RoICE9IFYuTGVuZ3RoKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBzdGQ6OmVxdWFsKERhdGEuZ2V0KCksIERhdGEuZ2V0KCkgKyBMZW5ndGgsIFYuRGF0YS5nZXQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSB2ZWN0b3IKKyAgdW5zaWduZWQgZ2V0TGVuZ3RoKCkgY29uc3QgeworICAgIGFzc2VydChMZW5ndGggIT0gMCAmJiBEYXRhICYmICJJbnZhbGlkIHZlY3RvciIpOworICAgIHJldHVybiBMZW5ndGg7CisgIH0KKworICAvLy8gXGJyaWVmIEVsZW1lbnQgYWNjZXNzLgorICBQQlFQTnVtJiBvcGVyYXRvcltdKHVuc2lnbmVkIEluZGV4KSB7CisgICAgYXNzZXJ0KExlbmd0aCAhPSAwICYmIERhdGEgJiYgIkludmFsaWQgdmVjdG9yIik7CisgICAgYXNzZXJ0KEluZGV4IDwgTGVuZ3RoICYmICJWZWN0b3IgZWxlbWVudCBhY2Nlc3Mgb3V0IG9mIGJvdW5kcy4iKTsKKyAgICByZXR1cm4gRGF0YVtJbmRleF07CisgIH0KKworICAvLy8gXGJyaWVmIENvbnN0IGVsZW1lbnQgYWNjZXNzLgorICBjb25zdCBQQlFQTnVtJiBvcGVyYXRvcltdKHVuc2lnbmVkIEluZGV4KSBjb25zdCB7CisgICAgYXNzZXJ0KExlbmd0aCAhPSAwICYmIERhdGEgJiYgIkludmFsaWQgdmVjdG9yIik7CisgICAgYXNzZXJ0KEluZGV4IDwgTGVuZ3RoICYmICJWZWN0b3IgZWxlbWVudCBhY2Nlc3Mgb3V0IG9mIGJvdW5kcy4iKTsKKyAgICByZXR1cm4gRGF0YVtJbmRleF07CisgIH0KKworICAvLy8gXGJyaWVmIEFkZCBhbm90aGVyIHZlY3RvciB0byB0aGlzIG9uZS4KKyAgVmVjdG9yJiBvcGVyYXRvcis9KGNvbnN0IFZlY3RvciAmVikgeworICAgIGFzc2VydChMZW5ndGggIT0gMCAmJiBEYXRhICYmICJJbnZhbGlkIHZlY3RvciIpOworICAgIGFzc2VydChMZW5ndGggPT0gVi5MZW5ndGggJiYgIlZlY3RvciBsZW5ndGggbWlzbWF0Y2guIik7CisgICAgc3RkOjp0cmFuc2Zvcm0oRGF0YS5nZXQoKSwgRGF0YS5nZXQoKSArIExlbmd0aCwgVi5EYXRhLmdldCgpLCBEYXRhLmdldCgpLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6cGx1czxQQlFQTnVtPigpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBtaW5pbXVtIHZhbHVlIGluIHRoaXMgdmVjdG9yCisgIHVuc2lnbmVkIG1pbkluZGV4KCkgY29uc3QgeworICAgIGFzc2VydChMZW5ndGggIT0gMCAmJiBEYXRhICYmICJJbnZhbGlkIHZlY3RvciIpOworICAgIHJldHVybiBzdGQ6Om1pbl9lbGVtZW50KERhdGEuZ2V0KCksIERhdGEuZ2V0KCkgKyBMZW5ndGgpIC0gRGF0YS5nZXQoKTsKKyAgfQorCitwcml2YXRlOgorICB1bnNpZ25lZCBMZW5ndGg7CisgIHN0ZDo6dW5pcXVlX3B0cjxQQlFQTnVtIFtdPiBEYXRhOworfTsKKworLy8vIFxicmllZiBSZXR1cm4gYSBoYXNoX3ZhbHVlIGZvciB0aGUgZ2l2ZW4gdmVjdG9yLgoraW5saW5lIGhhc2hfY29kZSBoYXNoX3ZhbHVlKGNvbnN0IFZlY3RvciAmVikgeworICB1bnNpZ25lZCAqVkJlZ2luID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCo+KFYuRGF0YS5nZXQoKSk7CisgIHVuc2lnbmVkICpWRW5kID0gcmVpbnRlcnByZXRfY2FzdDx1bnNpZ25lZCo+KFYuRGF0YS5nZXQoKSArIFYuTGVuZ3RoKTsKKyAgcmV0dXJuIGhhc2hfY29tYmluZShWLkxlbmd0aCwgaGFzaF9jb21iaW5lX3JhbmdlKFZCZWdpbiwgVkVuZCkpOworfQorCisvLy8gXGJyaWVmIE91dHB1dCBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHZlY3RvciBvbiB0aGUgZ2l2ZW4KKy8vLyAgICAgICAgb3V0cHV0IHN0cmVhbS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBPU3RyZWFtPgorT1N0cmVhbSYgb3BlcmF0b3I8PChPU3RyZWFtICZPUywgY29uc3QgVmVjdG9yICZWKSB7CisgIGFzc2VydCgoVi5nZXRMZW5ndGgoKSAhPSAwKSAmJiAiWmVyby1sZW5ndGggdmVjdG9yIGJhZG5lc3MuIik7CisKKyAgT1MgPDwgIlsgIiA8PCBWWzBdOworICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgVi5nZXRMZW5ndGgoKTsgKytpKQorICAgIE9TIDw8ICIsICIgPDwgVltpXTsKKyAgT1MgPDwgIiBdIjsKKworICByZXR1cm4gT1M7Cit9CisKKy8vLyBcYnJpZWYgUEJRUCBNYXRyaXggY2xhc3MKK2NsYXNzIE1hdHJpeCB7Citwcml2YXRlOgorICBmcmllbmQgaGFzaF9jb2RlIGhhc2hfdmFsdWUoY29uc3QgTWF0cml4ICYpOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IGEgUEJRUCBNYXRyaXggd2l0aCB0aGUgZ2l2ZW4gZGltZW5zaW9ucy4KKyAgTWF0cml4KHVuc2lnbmVkIFJvd3MsIHVuc2lnbmVkIENvbHMpIDoKKyAgICBSb3dzKFJvd3MpLCBDb2xzKENvbHMpLCBEYXRhKGxsdm06Om1ha2VfdW5pcXVlPFBCUVBOdW0gW10+KFJvd3MgKiBDb2xzKSkgeworICB9CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBQQlFQIE1hdHJpeCB3aXRoIHRoZSBnaXZlbiBkaW1lbnNpb25zIGFuZCBpbml0aWFsCisgIC8vLyB2YWx1ZS4KKyAgTWF0cml4KHVuc2lnbmVkIFJvd3MsIHVuc2lnbmVkIENvbHMsIFBCUVBOdW0gSW5pdFZhbCkKKyAgICA6IFJvd3MoUm93cyksIENvbHMoQ29scyksCisgICAgICBEYXRhKGxsdm06Om1ha2VfdW5pcXVlPFBCUVBOdW0gW10+KFJvd3MgKiBDb2xzKSkgeworICAgIHN0ZDo6ZmlsbChEYXRhLmdldCgpLCBEYXRhLmdldCgpICsgKFJvd3MgKiBDb2xzKSwgSW5pdFZhbCk7CisgIH0KKworICAvLy8gXGJyaWVmIENvcHkgY29uc3RydWN0IGEgUEJRUCBtYXRyaXguCisgIE1hdHJpeChjb25zdCBNYXRyaXggJk0pCisgICAgOiBSb3dzKE0uUm93cyksIENvbHMoTS5Db2xzKSwKKyAgICAgIERhdGEobGx2bTo6bWFrZV91bmlxdWU8UEJRUE51bSBbXT4oUm93cyAqIENvbHMpKSB7CisgICAgc3RkOjpjb3B5KE0uRGF0YS5nZXQoKSwgTS5EYXRhLmdldCgpICsgKFJvd3MgKiBDb2xzKSwgRGF0YS5nZXQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIE1vdmUgY29uc3RydWN0IGEgUEJRUCBtYXRyaXguCisgIE1hdHJpeChNYXRyaXggJiZNKQorICAgIDogUm93cyhNLlJvd3MpLCBDb2xzKE0uQ29scyksIERhdGEoc3RkOjptb3ZlKE0uRGF0YSkpIHsKKyAgICBNLlJvd3MgPSBNLkNvbHMgPSAwOworICB9CisKKyAgLy8vIFxicmllZiBDb21wYXJpc29uIG9wZXJhdG9yLgorICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWF0cml4ICZNKSBjb25zdCB7CisgICAgYXNzZXJ0KFJvd3MgIT0gMCAmJiBDb2xzICE9IDAgJiYgRGF0YSAmJiAiSW52YWxpZCBtYXRyaXgiKTsKKyAgICBpZiAoUm93cyAhPSBNLlJvd3MgfHwgQ29scyAhPSBNLkNvbHMpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHN0ZDo6ZXF1YWwoRGF0YS5nZXQoKSwgRGF0YS5nZXQoKSArIChSb3dzICogQ29scyksIE0uRGF0YS5nZXQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIHJvd3MgaW4gdGhpcyBtYXRyaXguCisgIHVuc2lnbmVkIGdldFJvd3MoKSBjb25zdCB7CisgICAgYXNzZXJ0KFJvd3MgIT0gMCAmJiBDb2xzICE9IDAgJiYgRGF0YSAmJiAiSW52YWxpZCBtYXRyaXgiKTsKKyAgICByZXR1cm4gUm93czsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgY29scyBpbiB0aGlzIG1hdHJpeC4KKyAgdW5zaWduZWQgZ2V0Q29scygpIGNvbnN0IHsKKyAgICBhc3NlcnQoUm93cyAhPSAwICYmIENvbHMgIT0gMCAmJiBEYXRhICYmICJJbnZhbGlkIG1hdHJpeCIpOworICAgIHJldHVybiBDb2xzOworICB9CisKKyAgLy8vIFxicmllZiBNYXRyaXggZWxlbWVudCBhY2Nlc3MuCisgIFBCUVBOdW0qIG9wZXJhdG9yW10odW5zaWduZWQgUikgeworICAgIGFzc2VydChSb3dzICE9IDAgJiYgQ29scyAhPSAwICYmIERhdGEgJiYgIkludmFsaWQgbWF0cml4Iik7CisgICAgYXNzZXJ0KFIgPCBSb3dzICYmICJSb3cgb3V0IG9mIGJvdW5kcy4iKTsKKyAgICByZXR1cm4gRGF0YS5nZXQoKSArIChSICogQ29scyk7CisgIH0KKworICAvLy8gXGJyaWVmIE1hdHJpeCBlbGVtZW50IGFjY2Vzcy4KKyAgY29uc3QgUEJRUE51bSogb3BlcmF0b3JbXSh1bnNpZ25lZCBSKSBjb25zdCB7CisgICAgYXNzZXJ0KFJvd3MgIT0gMCAmJiBDb2xzICE9IDAgJiYgRGF0YSAmJiAiSW52YWxpZCBtYXRyaXgiKTsKKyAgICBhc3NlcnQoUiA8IFJvd3MgJiYgIlJvdyBvdXQgb2YgYm91bmRzLiIpOworICAgIHJldHVybiBEYXRhLmdldCgpICsgKFIgKiBDb2xzKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgZ2l2ZW4gcm93IGFzIGEgdmVjdG9yLgorICBWZWN0b3IgZ2V0Um93QXNWZWN0b3IodW5zaWduZWQgUikgY29uc3QgeworICAgIGFzc2VydChSb3dzICE9IDAgJiYgQ29scyAhPSAwICYmIERhdGEgJiYgIkludmFsaWQgbWF0cml4Iik7CisgICAgVmVjdG9yIFYoQ29scyk7CisgICAgZm9yICh1bnNpZ25lZCBDID0gMDsgQyA8IENvbHM7ICsrQykKKyAgICAgIFZbQ10gPSAoKnRoaXMpW1JdW0NdOworICAgIHJldHVybiBWOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBnaXZlbiBjb2x1bW4gYXMgYSB2ZWN0b3IuCisgIFZlY3RvciBnZXRDb2xBc1ZlY3Rvcih1bnNpZ25lZCBDKSBjb25zdCB7CisgICAgYXNzZXJ0KFJvd3MgIT0gMCAmJiBDb2xzICE9IDAgJiYgRGF0YSAmJiAiSW52YWxpZCBtYXRyaXgiKTsKKyAgICBWZWN0b3IgVihSb3dzKTsKKyAgICBmb3IgKHVuc2lnbmVkIFIgPSAwOyBSIDwgUm93czsgKytSKQorICAgICAgVltSXSA9ICgqdGhpcylbUl1bQ107CisgICAgcmV0dXJuIFY7CisgIH0KKworICAvLy8gXGJyaWVmIE1hdHJpeCB0cmFuc3Bvc2UuCisgIE1hdHJpeCB0cmFuc3Bvc2UoKSBjb25zdCB7CisgICAgYXNzZXJ0KFJvd3MgIT0gMCAmJiBDb2xzICE9IDAgJiYgRGF0YSAmJiAiSW52YWxpZCBtYXRyaXgiKTsKKyAgICBNYXRyaXggTShDb2xzLCBSb3dzKTsKKyAgICBmb3IgKHVuc2lnbmVkIHIgPSAwOyByIDwgUm93czsgKytyKQorICAgICAgZm9yICh1bnNpZ25lZCBjID0gMDsgYyA8IENvbHM7ICsrYykKKyAgICAgICAgTVtjXVtyXSA9ICgqdGhpcylbcl1bY107CisgICAgcmV0dXJuIE07CisgIH0KKworICAvLy8gXGJyaWVmIEFkZCB0aGUgZ2l2ZW4gbWF0cml4IHRvIHRoaXMgb25lLgorICBNYXRyaXgmIG9wZXJhdG9yKz0oY29uc3QgTWF0cml4ICZNKSB7CisgICAgYXNzZXJ0KFJvd3MgIT0gMCAmJiBDb2xzICE9IDAgJiYgRGF0YSAmJiAiSW52YWxpZCBtYXRyaXgiKTsKKyAgICBhc3NlcnQoUm93cyA9PSBNLlJvd3MgJiYgQ29scyA9PSBNLkNvbHMgJiYKKyAgICAgICAgICAgIk1hdHJpeCBkaW1lbnNpb25zIG1pc21hdGNoLiIpOworICAgIHN0ZDo6dHJhbnNmb3JtKERhdGEuZ2V0KCksIERhdGEuZ2V0KCkgKyAoUm93cyAqIENvbHMpLCBNLkRhdGEuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgRGF0YS5nZXQoKSwgc3RkOjpwbHVzPFBCUVBOdW0+KCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE1hdHJpeCBvcGVyYXRvcisoY29uc3QgTWF0cml4ICZNKSB7CisgICAgYXNzZXJ0KFJvd3MgIT0gMCAmJiBDb2xzICE9IDAgJiYgRGF0YSAmJiAiSW52YWxpZCBtYXRyaXgiKTsKKyAgICBNYXRyaXggVG1wKCp0aGlzKTsKKyAgICBUbXAgKz0gTTsKKyAgICByZXR1cm4gVG1wOworICB9CisKK3ByaXZhdGU6CisgIHVuc2lnbmVkIFJvd3MsIENvbHM7CisgIHN0ZDo6dW5pcXVlX3B0cjxQQlFQTnVtIFtdPiBEYXRhOworfTsKKworLy8vIFxicmllZiBSZXR1cm4gYSBoYXNoX2NvZGUgZm9yIHRoZSBnaXZlbiBtYXRyaXguCitpbmxpbmUgaGFzaF9jb2RlIGhhc2hfdmFsdWUoY29uc3QgTWF0cml4ICZNKSB7CisgIHVuc2lnbmVkICpNQmVnaW4gPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkKj4oTS5EYXRhLmdldCgpKTsKKyAgdW5zaWduZWQgKk1FbmQgPQorICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dW5zaWduZWQqPihNLkRhdGEuZ2V0KCkgKyAoTS5Sb3dzICogTS5Db2xzKSk7CisgIHJldHVybiBoYXNoX2NvbWJpbmUoTS5Sb3dzLCBNLkNvbHMsIGhhc2hfY29tYmluZV9yYW5nZShNQmVnaW4sIE1FbmQpKTsKK30KKworLy8vIFxicmllZiBPdXRwdXQgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBtYXRyaXggb24gdGhlIGdpdmVuCisvLy8gICAgICAgIG91dHB1dCBzdHJlYW0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT1N0cmVhbT4KK09TdHJlYW0mIG9wZXJhdG9yPDwoT1N0cmVhbSAmT1MsIGNvbnN0IE1hdHJpeCAmTSkgeworICBhc3NlcnQoKE0uZ2V0Um93cygpICE9IDApICYmICJaZXJvLXJvdyBtYXRyaXggYmFkbmVzcy4iKTsKKyAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE0uZ2V0Um93cygpOyArK2kpCisgICAgT1MgPDwgTS5nZXRSb3dBc1ZlY3RvcihpKSA8PCAiXG4iOworICByZXR1cm4gT1M7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNZXRhZGF0YT4KK2NsYXNzIE1EVmVjdG9yIDogcHVibGljIFZlY3RvciB7CitwdWJsaWM6CisgIE1EVmVjdG9yKGNvbnN0IFZlY3RvciAmdikgOiBWZWN0b3IodiksIG1kKCp0aGlzKSB7fQorICBNRFZlY3RvcihWZWN0b3IgJiZ2KSA6IFZlY3RvcihzdGQ6Om1vdmUodikpLCBtZCgqdGhpcykgeyB9CisKKyAgY29uc3QgTWV0YWRhdGEmIGdldE1ldGFkYXRhKCkgY29uc3QgeyByZXR1cm4gbWQ7IH0KKworcHJpdmF0ZToKKyAgTWV0YWRhdGEgbWQ7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTWV0YWRhdGE+CitpbmxpbmUgaGFzaF9jb2RlIGhhc2hfdmFsdWUoY29uc3QgTURWZWN0b3I8TWV0YWRhdGE+ICZWKSB7CisgIHJldHVybiBoYXNoX3ZhbHVlKHN0YXRpY19jYXN0PGNvbnN0IFZlY3RvciY+KFYpKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE1ldGFkYXRhPgorY2xhc3MgTURNYXRyaXggOiBwdWJsaWMgTWF0cml4IHsKK3B1YmxpYzoKKyAgTURNYXRyaXgoY29uc3QgTWF0cml4ICZtKSA6IE1hdHJpeChtKSwgbWQoKnRoaXMpIHt9CisgIE1ETWF0cml4KE1hdHJpeCAmJm0pIDogTWF0cml4KHN0ZDo6bW92ZShtKSksIG1kKCp0aGlzKSB7IH0KKworICBjb25zdCBNZXRhZGF0YSYgZ2V0TWV0YWRhdGEoKSBjb25zdCB7IHJldHVybiBtZDsgfQorCitwcml2YXRlOgorICBNZXRhZGF0YSBtZDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNZXRhZGF0YT4KK2lubGluZSBoYXNoX2NvZGUgaGFzaF92YWx1ZShjb25zdCBNRE1hdHJpeDxNZXRhZGF0YT4gJk0pIHsKKyAgcmV0dXJuIGhhc2hfdmFsdWUoc3RhdGljX2Nhc3Q8Y29uc3QgTWF0cml4Jj4oTSkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgUEJRUAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9QQlFQX01BVEhfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1BCUVAvUmVkdWN0aW9uUnVsZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9QQlFQL1JlZHVjdGlvblJ1bGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFlYjUxOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9QQlFQL1JlZHVjdGlvblJ1bGVzLmgKQEAgLTAsMCArMSwyMjMgQEAKKy8vPT09LSBSZWR1Y3Rpb25SdWxlcy5oIC0gUmVkdWN0aW9uIFJ1bGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gUmVkdWN0aW9uIFJ1bGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1BCUVBfUkVEVUNUSU9OUlVMRVNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fUEJRUF9SRURVQ1RJT05SVUxFU19ICisKKyNpbmNsdWRlICJHcmFwaC5oIgorI2luY2x1ZGUgIk1hdGguaCIKKyNpbmNsdWRlICJTb2x1dGlvbi5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8bGltaXRzPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgUEJRUCB7CisKKyAgLy8vIFxicmllZiBSZWR1Y2UgYSBub2RlIG9mIGRlZ3JlZSBvbmUuCisgIC8vLworICAvLy8gUHJvcGFnYXRlIGNvc3RzIGZyb20gdGhlIGdpdmVuIG5vZGUsIHdoaWNoIG11c3QgYmUgb2YgZGVncmVlIG9uZSwgdG8gaXRzCisgIC8vLyBuZWlnaGJvci4gTm90aWZ5IHRoZSBwcm9ibGVtIGRvbWFpbi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEdyYXBoVD4KKyAgdm9pZCBhcHBseVIxKEdyYXBoVCAmRywgdHlwZW5hbWUgR3JhcGhUOjpOb2RlSWQgTklkKSB7CisgICAgdXNpbmcgTm9kZUlkID0gdHlwZW5hbWUgR3JhcGhUOjpOb2RlSWQ7CisgICAgdXNpbmcgRWRnZUlkID0gdHlwZW5hbWUgR3JhcGhUOjpFZGdlSWQ7CisgICAgdXNpbmcgVmVjdG9yID0gdHlwZW5hbWUgR3JhcGhUOjpWZWN0b3I7CisgICAgdXNpbmcgTWF0cml4ID0gdHlwZW5hbWUgR3JhcGhUOjpNYXRyaXg7CisgICAgdXNpbmcgUmF3VmVjdG9yID0gdHlwZW5hbWUgR3JhcGhUOjpSYXdWZWN0b3I7CisKKyAgICBhc3NlcnQoRy5nZXROb2RlRGVncmVlKE5JZCkgPT0gMSAmJgorICAgICAgICAgICAiUjEgYXBwbGllZCB0byBub2RlIHdpdGggZGVncmVlICE9IDEuIik7CisKKyAgICBFZGdlSWQgRUlkID0gKkcuYWRqRWRnZUlkcyhOSWQpLmJlZ2luKCk7CisgICAgTm9kZUlkIE1JZCA9IEcuZ2V0RWRnZU90aGVyTm9kZUlkKEVJZCwgTklkKTsKKworICAgIGNvbnN0IE1hdHJpeCAmRUNvc3RzID0gRy5nZXRFZGdlQ29zdHMoRUlkKTsKKyAgICBjb25zdCBWZWN0b3IgJlhDb3N0cyA9IEcuZ2V0Tm9kZUNvc3RzKE5JZCk7CisgICAgUmF3VmVjdG9yIFlDb3N0cyA9IEcuZ2V0Tm9kZUNvc3RzKE1JZCk7CisKKyAgICAvLyBEdXBsaWNhdGUgYSBsaXR0bGUgdG8gYXZvaWQgdHJhbnNwb3NpbmcgbWF0cmljZXMuCisgICAgaWYgKE5JZCA9PSBHLmdldEVkZ2VOb2RlMUlkKEVJZCkpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBZQ29zdHMuZ2V0TGVuZ3RoKCk7ICsraikgeworICAgICAgICBQQlFQTnVtIE1pbiA9IEVDb3N0c1swXVtqXSArIFhDb3N0c1swXTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IFhDb3N0cy5nZXRMZW5ndGgoKTsgKytpKSB7CisgICAgICAgICAgUEJRUE51bSBDID0gRUNvc3RzW2ldW2pdICsgWENvc3RzW2ldOworICAgICAgICAgIGlmIChDIDwgTWluKQorICAgICAgICAgICAgTWluID0gQzsKKyAgICAgICAgfQorICAgICAgICBZQ29zdHNbal0gKz0gTWluOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgWUNvc3RzLmdldExlbmd0aCgpOyArK2kpIHsKKyAgICAgICAgUEJRUE51bSBNaW4gPSBFQ29zdHNbaV1bMF0gKyBYQ29zdHNbMF07CisgICAgICAgIGZvciAodW5zaWduZWQgaiA9IDE7IGogPCBYQ29zdHMuZ2V0TGVuZ3RoKCk7ICsraikgeworICAgICAgICAgIFBCUVBOdW0gQyA9IEVDb3N0c1tpXVtqXSArIFhDb3N0c1tqXTsKKyAgICAgICAgICBpZiAoQyA8IE1pbikKKyAgICAgICAgICAgIE1pbiA9IEM7CisgICAgICAgIH0KKyAgICAgICAgWUNvc3RzW2ldICs9IE1pbjsKKyAgICAgIH0KKyAgICB9CisgICAgRy5zZXROb2RlQ29zdHMoTUlkLCBZQ29zdHMpOworICAgIEcuZGlzY29ubmVjdEVkZ2UoRUlkLCBNSWQpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEdyYXBoVD4KKyAgdm9pZCBhcHBseVIyKEdyYXBoVCAmRywgdHlwZW5hbWUgR3JhcGhUOjpOb2RlSWQgTklkKSB7CisgICAgdXNpbmcgTm9kZUlkID0gdHlwZW5hbWUgR3JhcGhUOjpOb2RlSWQ7CisgICAgdXNpbmcgRWRnZUlkID0gdHlwZW5hbWUgR3JhcGhUOjpFZGdlSWQ7CisgICAgdXNpbmcgVmVjdG9yID0gdHlwZW5hbWUgR3JhcGhUOjpWZWN0b3I7CisgICAgdXNpbmcgTWF0cml4ID0gdHlwZW5hbWUgR3JhcGhUOjpNYXRyaXg7CisgICAgdXNpbmcgUmF3TWF0cml4ID0gdHlwZW5hbWUgR3JhcGhUOjpSYXdNYXRyaXg7CisKKyAgICBhc3NlcnQoRy5nZXROb2RlRGVncmVlKE5JZCkgPT0gMiAmJgorICAgICAgICAgICAiUjIgYXBwbGllZCB0byBub2RlIHdpdGggZGVncmVlICE9IDIuIik7CisKKyAgICBjb25zdCBWZWN0b3IgJlhDb3N0cyA9IEcuZ2V0Tm9kZUNvc3RzKE5JZCk7CisKKyAgICB0eXBlbmFtZSBHcmFwaFQ6OkFkakVkZ2VJdHIgQUVJdHIgPSBHLmFkakVkZ2VJZHMoTklkKS5iZWdpbigpOworICAgIEVkZ2VJZCBZWEVJZCA9ICpBRUl0ciwKKyAgICAgICAgICAgWlhFSWQgPSAqKCsrQUVJdHIpOworCisgICAgTm9kZUlkIFlOSWQgPSBHLmdldEVkZ2VPdGhlck5vZGVJZChZWEVJZCwgTklkKSwKKyAgICAgICAgICAgWk5JZCA9IEcuZ2V0RWRnZU90aGVyTm9kZUlkKFpYRUlkLCBOSWQpOworCisgICAgYm9vbCBGbGlwRWRnZTEgPSAoRy5nZXRFZGdlTm9kZTFJZChZWEVJZCkgPT0gTklkKSwKKyAgICAgICAgIEZsaXBFZGdlMiA9IChHLmdldEVkZ2VOb2RlMUlkKFpYRUlkKSA9PSBOSWQpOworCisgICAgY29uc3QgTWF0cml4ICpZWEVDb3N0cyA9IEZsaXBFZGdlMSA/CisgICAgICBuZXcgTWF0cml4KEcuZ2V0RWRnZUNvc3RzKFlYRUlkKS50cmFuc3Bvc2UoKSkgOgorICAgICAgJkcuZ2V0RWRnZUNvc3RzKFlYRUlkKTsKKworICAgIGNvbnN0IE1hdHJpeCAqWlhFQ29zdHMgPSBGbGlwRWRnZTIgPworICAgICAgbmV3IE1hdHJpeChHLmdldEVkZ2VDb3N0cyhaWEVJZCkudHJhbnNwb3NlKCkpIDoKKyAgICAgICZHLmdldEVkZ2VDb3N0cyhaWEVJZCk7CisKKyAgICB1bnNpZ25lZCBYTGVuID0gWENvc3RzLmdldExlbmd0aCgpLAorICAgICAgWUxlbiA9IFlYRUNvc3RzLT5nZXRSb3dzKCksCisgICAgICBaTGVuID0gWlhFQ29zdHMtPmdldFJvd3MoKTsKKworICAgIFJhd01hdHJpeCBEZWx0YShZTGVuLCBaTGVuKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBZTGVuOyArK2kpIHsKKyAgICAgIGZvciAodW5zaWduZWQgaiA9IDA7IGogPCBaTGVuOyArK2opIHsKKyAgICAgICAgUEJRUE51bSBNaW4gPSAoKllYRUNvc3RzKVtpXVswXSArICgqWlhFQ29zdHMpW2pdWzBdICsgWENvc3RzWzBdOworICAgICAgICBmb3IgKHVuc2lnbmVkIGsgPSAxOyBrIDwgWExlbjsgKytrKSB7CisgICAgICAgICAgUEJRUE51bSBDID0gKCpZWEVDb3N0cylbaV1ba10gKyAoKlpYRUNvc3RzKVtqXVtrXSArIFhDb3N0c1trXTsKKyAgICAgICAgICBpZiAoQyA8IE1pbikgeworICAgICAgICAgICAgTWluID0gQzsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgRGVsdGFbaV1bal0gPSBNaW47CisgICAgICB9CisgICAgfQorCisgICAgaWYgKEZsaXBFZGdlMSkKKyAgICAgIGRlbGV0ZSBZWEVDb3N0czsKKworICAgIGlmIChGbGlwRWRnZTIpCisgICAgICBkZWxldGUgWlhFQ29zdHM7CisKKyAgICBFZGdlSWQgWVpFSWQgPSBHLmZpbmRFZGdlKFlOSWQsIFpOSWQpOworCisgICAgaWYgKFlaRUlkID09IEcuaW52YWxpZEVkZ2VJZCgpKSB7CisgICAgICBZWkVJZCA9IEcuYWRkRWRnZShZTklkLCBaTklkLCBEZWx0YSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGNvbnN0IE1hdHJpeCAmWVpFQ29zdHMgPSBHLmdldEVkZ2VDb3N0cyhZWkVJZCk7CisgICAgICBpZiAoWU5JZCA9PSBHLmdldEVkZ2VOb2RlMUlkKFlaRUlkKSkgeworICAgICAgICBHLnVwZGF0ZUVkZ2VDb3N0cyhZWkVJZCwgRGVsdGEgKyBZWkVDb3N0cyk7CisgICAgICB9IGVsc2UgeworICAgICAgICBHLnVwZGF0ZUVkZ2VDb3N0cyhZWkVJZCwgRGVsdGEudHJhbnNwb3NlKCkgKyBZWkVDb3N0cyk7CisgICAgICB9CisgICAgfQorCisgICAgRy5kaXNjb25uZWN0RWRnZShZWEVJZCwgWU5JZCk7CisgICAgRy5kaXNjb25uZWN0RWRnZShaWEVJZCwgWk5JZCk7CisKKyAgICAvLyBUT0RPOiBUcnkgdG8gbm9ybWFsaXplIG5ld2x5IGFkZGVkL21vZGlmaWVkIGVkZ2UuCisgIH0KKworI2lmbmRlZiBOREVCVUcKKyAgLy8gRG9lcyB0aGlzIENvc3QgdmVjdG9yIGhhdmUgYW55IHJlZ2lzdGVyIG9wdGlvbnMgPworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVmVjdG9yVD4KKyAgYm9vbCBoYXNSZWdpc3Rlck9wdGlvbnMoY29uc3QgVmVjdG9yVCAmVikgeworICAgIHVuc2lnbmVkIFZMID0gVi5nZXRMZW5ndGgoKTsKKworICAgIC8vIEFuIGVtcHR5IG9yIHNwaWxsIG9ubHkgY29zdCB2ZWN0b3IgZG9lcyBub3QgcHJvdmlkZSBhbnkgcmVnaXN0ZXIgb3B0aW9uLgorICAgIGlmIChWTCA8PSAxKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gSWYgdGhlcmUgYXJlIHJlZ2lzdGVycyBpbiB0aGUgY29zdCB2ZWN0b3IsIGJ1dCBhbGwgb2YgdGhlbSBoYXZlIGluZmluaXRlCisgICAgLy8gY29zdHMsIHRoZW4gLi4uIHRoZXJlIGlzIG5vIGF2YWlsYWJsZSByZWdpc3Rlci4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgVkw7ICsraSkKKyAgICAgIGlmIChWW2ldICE9IHN0ZDo6bnVtZXJpY19saW1pdHM8UEJRUDo6UEJRUE51bT46OmluZmluaXR5KCkpCisgICAgICAgIHJldHVybiB0cnVlOworCisgICAgcmV0dXJuIGZhbHNlOworICB9CisjZW5kaWYKKworICAvLyBcYnJpZWYgRmluZCBhIHNvbHV0aW9uIHRvIGEgZnVsbHkgcmVkdWNlZCBncmFwaCBieSBiYWNrcHJvcGFnYXRpb24uCisgIC8vCisgIC8vIEdpdmVuIGEgZ3JhcGggYW5kIGEgcmVkdWN0aW9uIG9yZGVyLCBwb3AgZWFjaCBub2RlIGZyb20gdGhlIHJlZHVjdGlvbgorICAvLyBvcmRlciBhbmQgZ3JlZWRpbHkgY29tcHV0ZSBhIG1pbmltdW0gc29sdXRpb24gYmFzZWQgb24gdGhlIG5vZGUgY29zdHMsIGFuZAorICAvLyB0aGUgZGVwZW5kZW50IGNvc3RzIGR1ZSB0byBwcmV2aW91c2x5IHNvbHZlZCBub2Rlcy4KKyAgLy8KKyAgLy8gTm90ZSAtIFRoaXMgZG9lcyBub3QgcmV0dXJuIHRoZSBncmFwaCB0byBpdHMgb3JpZ2luYWwgKHByZS1yZWR1Y3Rpb24pCisgIC8vICAgICAgICBzdGF0ZTogdGhlIGV4aXN0aW5nIHNvbHZlcnMgZGVzdHJ1Y3RpdmVseSBhbHRlciB0aGUgbm9kZSBhbmQgZWRnZQorICAvLyAgICAgICAgY29zdHMuIEdpdmVuIHRoYXQsIHRoZSBiYWNrcHJvcGFnYXRlIGZ1bmN0aW9uIGRvZXNuJ3QgYXR0ZW1wdCB0bworICAvLyAgICAgICAgcmVwbGFjZSB0aGUgZWRnZXMgZWl0aGVyLCBidXQgbGVhdmVzIHRoZSBncmFwaCBpbiBpdHMgcmVkdWNlZAorICAvLyAgICAgICAgc3RhdGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBHcmFwaFQsIHR5cGVuYW1lIFN0YWNrVD4KKyAgU29sdXRpb24gYmFja3Byb3BhZ2F0ZShHcmFwaFQmIEcsIFN0YWNrVCBzdGFjaykgeworICAgIHVzaW5nIE5vZGVJZCA9IEdyYXBoQmFzZTo6Tm9kZUlkOworICAgIHVzaW5nIE1hdHJpeCA9IHR5cGVuYW1lIEdyYXBoVDo6TWF0cml4OworICAgIHVzaW5nIFJhd1ZlY3RvciA9IHR5cGVuYW1lIEdyYXBoVDo6UmF3VmVjdG9yOworCisgICAgU29sdXRpb24gczsKKworICAgIHdoaWxlICghc3RhY2suZW1wdHkoKSkgeworICAgICAgTm9kZUlkIE5JZCA9IHN0YWNrLmJhY2soKTsKKyAgICAgIHN0YWNrLnBvcF9iYWNrKCk7CisKKyAgICAgIFJhd1ZlY3RvciB2ID0gRy5nZXROb2RlQ29zdHMoTklkKTsKKworI2lmbmRlZiBOREVCVUcKKyAgICAgIC8vIEFsdGhvdWdoIGEgY29uc2VydmF0aXZlbHkgYWxsb2NhdGFibGUgbm9kZSBjYW4gYmUgYWxsb2NhdGVkIHRvIGEgcmVnaXN0ZXIsCisgICAgICAvLyBzcGlsbGluZyBpdCBtYXkgcHJvdmlkZSBhIGxvd2VyIGNvc3Qgc29sdXRpb24uIEFzc2VydCBoZXJlIHRoYXQgc3BpbGxpbmcKKyAgICAgIC8vIGlzIGRvbmUgYnkgY2hvaWNlLCBub3QgYmVjYXVzZSB0aGVyZSB3ZXJlIG5vIHJlZ2lzdGVyIGF2YWlsYWJsZS4KKyAgICAgIGlmIChHLmdldE5vZGVNZXRhZGF0YShOSWQpLndhc0NvbnNlcnZhdGl2ZWx5QWxsb2NhdGFibGUoKSkKKyAgICAgICAgYXNzZXJ0KGhhc1JlZ2lzdGVyT3B0aW9ucyh2KSAmJiAiQSBjb25zZXJ2YXRpdmVseSBhbGxvY2F0YWJsZSBub2RlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXVzdCBoYXZlIGF2YWlsYWJsZSByZWdpc3RlciBvcHRpb25zIik7CisjZW5kaWYKKworICAgICAgZm9yIChhdXRvIEVJZCA6IEcuYWRqRWRnZUlkcyhOSWQpKSB7CisgICAgICAgIGNvbnN0IE1hdHJpeCYgZWRnZUNvc3RzID0gRy5nZXRFZGdlQ29zdHMoRUlkKTsKKyAgICAgICAgaWYgKE5JZCA9PSBHLmdldEVkZ2VOb2RlMUlkKEVJZCkpIHsKKyAgICAgICAgICBOb2RlSWQgbUlkID0gRy5nZXRFZGdlTm9kZTJJZChFSWQpOworICAgICAgICAgIHYgKz0gZWRnZUNvc3RzLmdldENvbEFzVmVjdG9yKHMuZ2V0U2VsZWN0aW9uKG1JZCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIE5vZGVJZCBtSWQgPSBHLmdldEVkZ2VOb2RlMUlkKEVJZCk7CisgICAgICAgICAgdiArPSBlZGdlQ29zdHMuZ2V0Um93QXNWZWN0b3Iocy5nZXRTZWxlY3Rpb24obUlkKSk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcy5zZXRTZWxlY3Rpb24oTklkLCB2Lm1pbkluZGV4KCkpOworICAgIH0KKworICAgIHJldHVybiBzOworICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBQQlFQCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1BCUVBfUkVEVUNUSU9OUlVMRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1BCUVAvU29sdXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9QQlFQL1NvbHV0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmEyNDcyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9QQlFQL1NvbHV0aW9uLmgKQEAgLTAsMCArMSw1NiBAQAorLy89PT0tIFNvbHV0aW9uLmggLSBQQlFQIFNvbHV0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBQQlFQIFNvbHV0aW9uIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1BCUVBfU09MVVRJT05fSAorI2RlZmluZSBMTFZNX0NPREVHRU5fUEJRUF9TT0xVVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUEJRUC9HcmFwaC5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgUEJRUCB7CisKKyAgLy8vIFxicmllZiBSZXByZXNlbnRzIGEgc29sdXRpb24gdG8gYSBQQlFQIHByb2JsZW0uCisgIC8vLworICAvLy8gVG8gZ2V0IHRoZSBzZWxlY3Rpb24gZm9yIGVhY2ggbm9kZSBpbiB0aGUgcHJvYmxlbSB1c2UgdGhlIGdldFNlbGVjdGlvbiBtZXRob2QuCisgIGNsYXNzIFNvbHV0aW9uIHsKKyAgcHJpdmF0ZToKKyAgICB1c2luZyBTZWxlY3Rpb25zTWFwID0gc3RkOjptYXA8R3JhcGhCYXNlOjpOb2RlSWQsIHVuc2lnbmVkPjsKKyAgICBTZWxlY3Rpb25zTWFwIHNlbGVjdGlvbnM7CisKKyAgcHVibGljOgorICAgIC8vLyBcYnJpZWYgSW5pdGlhbGlzZSBhbiBlbXB0eSBzb2x1dGlvbi4KKyAgICBTb2x1dGlvbigpID0gZGVmYXVsdDsKKworICAgIC8vLyBcYnJpZWYgU2V0IHRoZSBzZWxlY3Rpb24gZm9yIGEgZ2l2ZW4gbm9kZS4KKyAgICAvLy8gQHBhcmFtIG5vZGVJZCBOb2RlIGlkLgorICAgIC8vLyBAcGFyYW0gc2VsZWN0aW9uIFNlbGVjdGlvbiBmb3Igbm9kZUlkLgorICAgIHZvaWQgc2V0U2VsZWN0aW9uKEdyYXBoQmFzZTo6Tm9kZUlkIG5vZGVJZCwgdW5zaWduZWQgc2VsZWN0aW9uKSB7CisgICAgICBzZWxlY3Rpb25zW25vZGVJZF0gPSBzZWxlY3Rpb247CisgICAgfQorCisgICAgLy8vIFxicmllZiBHZXQgYSBub2RlJ3Mgc2VsZWN0aW9uLgorICAgIC8vLyBAcGFyYW0gbm9kZUlkIE5vZGUgaWQuCisgICAgLy8vIEByZXR1cm4gVGhlIHNlbGVjdGlvbiBmb3Igbm9kZUlkOworICAgIHVuc2lnbmVkIGdldFNlbGVjdGlvbihHcmFwaEJhc2U6Ok5vZGVJZCBub2RlSWQpIGNvbnN0IHsKKyAgICAgIFNlbGVjdGlvbnNNYXA6OmNvbnN0X2l0ZXJhdG9yIHNJdHIgPSBzZWxlY3Rpb25zLmZpbmQobm9kZUlkKTsKKyAgICAgIGFzc2VydChzSXRyICE9IHNlbGVjdGlvbnMuZW5kKCkgJiYgIk5vIHNlbGVjdGlvbiBmb3Igbm9kZS4iKTsKKyAgICAgIHJldHVybiBzSXRyLT5zZWNvbmQ7CisgICAgfQorICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgUEJRUAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9QQlFQX1NPTFVUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9QQlFQUkFDb25zdHJhaW50LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUEJRUFJBQ29uc3RyYWludC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2OWI3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUEJRUFJBQ29uc3RyYWludC5oCkBAIC0wLDAgKzEsNzEgQEAKKy8vPT09LSBSZWdBbGxvY1BCUVAuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFBCUVBCdWlsZGVyIGludGVyZmFjZSwgZm9yIGNsYXNzZXMgd2hpY2ggYnVpbGQgUEJRUAorLy8gaW5zdGFuY2VzIHRvIHJlcHJlc2VudCByZWdpc3RlciBhbGxvY2F0aW9uIHByb2JsZW1zLCBhbmQgdGhlIFJlZ0FsbG9jUEJRUAorLy8gaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1BCUVBSQUNPTlNUUkFJTlRfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fUEJRUFJBQ09OU1RSQUlOVF9ICisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgUEJRUCB7CituYW1lc3BhY2UgUmVnQWxsb2MgeworCisvLyBGb3J3YXJkIGRlY2xhcmUgUEJRUCBncmFwaCBjbGFzcy4KK2NsYXNzIFBCUVBSQUdyYXBoOworCit9IC8vIGVuZCBuYW1lc3BhY2UgUmVnQWxsb2MKK30gLy8gZW5kIG5hbWVzcGFjZSBQQlFQCisKK3VzaW5nIFBCUVBSQUdyYXBoID0gUEJRUDo6UmVnQWxsb2M6OlBCUVBSQUdyYXBoOworCisvLy8gQGJyaWVmIEFic3RyYWN0IGJhc2UgZm9yIGNsYXNzZXMgaW1wbGVtZW50aW5nIFBCUVAgcmVnaXN0ZXIgYWxsb2NhdGlvbgorLy8vICAgICAgICBjb25zdHJhaW50cyAoZS5nLiBTcGlsbC1jb3N0cywgaW50ZXJmZXJlbmNlLCBjb2FsZXNjaW5nKS4KK2NsYXNzIFBCUVBSQUNvbnN0cmFpbnQgeworcHVibGljOgorICB2aXJ0dWFsIH5QQlFQUkFDb25zdHJhaW50KCkgPSAwOworICB2aXJ0dWFsIHZvaWQgYXBwbHkoUEJRUFJBR3JhcGggJkcpID0gMDsKKworcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworfTsKKworLy8vIEBicmllZiBQQlFQIHJlZ2lzdGVyIGFsbG9jYXRpb24gY29uc3RyYWludCBjb21wb3Nlci4KKy8vLworLy8vICAgQ29uc3RyYWludHMgYWRkZWQgdG8gdGhpcyBsaXN0IHdpbGwgYmUgYXBwbGllZCwgaW4gdGhlIG9yZGVyIHRoYXQgdGhleSBhcmUKKy8vLyBhZGRlZCwgdG8gdGhlIFBCUVAgZ3JhcGguCitjbGFzcyBQQlFQUkFDb25zdHJhaW50TGlzdCA6IHB1YmxpYyBQQlFQUkFDb25zdHJhaW50IHsKK3B1YmxpYzoKKyAgdm9pZCBhcHBseShQQlFQUkFHcmFwaCAmRykgb3ZlcnJpZGUgeworICAgIGZvciAoYXV0byAmQyA6IENvbnN0cmFpbnRzKQorICAgICAgQy0+YXBwbHkoRyk7CisgIH0KKworICB2b2lkIGFkZENvbnN0cmFpbnQoc3RkOjp1bmlxdWVfcHRyPFBCUVBSQUNvbnN0cmFpbnQ+IEMpIHsKKyAgICBpZiAoQykKKyAgICAgIENvbnN0cmFpbnRzLnB1c2hfYmFjayhzdGQ6Om1vdmUoQykpOworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxQQlFQUkFDb25zdHJhaW50Pj4gQ29uc3RyYWludHM7CisKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fUEJRUFJBQ09OU1RSQUlOVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUGFyYWxsZWxDRy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1BhcmFsbGVsQ0cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNGVmMGVjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1BhcmFsbGVsQ0cuaApAQCAtMCwwICsxLDQ4IEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9QYXJhbGxlbENHLmggLSBQYXJhbGxlbCBjb2RlIGdlbmVyYXRpb24gLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIGRlY2xhcmVzIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSB1c2VkIGZvciBwYXJhbGxlbCBjb2RlIGdlbmVyYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fUEFSQUxMRUxDR19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9QQVJBTExFTENHX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db2RlR2VuLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBUYXJnZXRPcHRpb25zOworY2xhc3MgcmF3X3B3cml0ZV9zdHJlYW07CisKKy8vLyBTcGxpdCBNIGludG8gT1NzLnNpemUoKSBwYXJ0aXRpb25zLCBhbmQgZ2VuZXJhdGUgY29kZSBmb3IgZWFjaC4gVGFrZXMgYQorLy8vIGZhY3RvcnkgZnVuY3Rpb24gZm9yIHRoZSBUYXJnZXRNYWNoaW5lIFRNRmFjdG9yeS4gV3JpdGVzIE9Tcy5zaXplKCkgb3V0cHV0CisvLy8gZmlsZXMgdG8gdGhlIG91dHB1dCBzdHJlYW1zIGluIE9Tcy4gVGhlIHJlc3VsdGluZyBvdXRwdXQgZmlsZXMgaWYgbGlua2VkCisvLy8gdG9nZXRoZXIgYXJlIGludGVuZGVkIHRvIGJlIGVxdWl2YWxlbnQgdG8gdGhlIHNpbmdsZSBvdXRwdXQgZmlsZSB0aGF0IHdvdWxkCisvLy8gaGF2ZSBiZWVuIGNvZGUgZ2VuZXJhdGVkIGZyb20gTS4KKy8vLworLy8vIFdyaXRlcyBiaXRjb2RlIGZvciBpbmRpdmlkdWFsIHBhcnRpdGlvbnMgaW50byBvdXRwdXQgc3RyZWFtcyBpbiBCQ09TcywgaWYKKy8vLyBCQ09TcyBpcyBub3QgZW1wdHkuCisvLy8KKy8vLyBccmV0dXJucyBNIGlmIE9Tcy5zaXplKCkgPT0gMSwgb3RoZXJ3aXNlIHJldHVybnMgc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4oKS4KK3N0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+CitzcGxpdENvZGVHZW4oc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gTSwgQXJyYXlSZWY8cmF3X3B3cml0ZV9zdHJlYW0gKj4gT1NzLAorICAgICAgICAgICAgIEFycmF5UmVmPGxsdm06OnJhd19wd3JpdGVfc3RyZWFtICo+IEJDT1NzLAorICAgICAgICAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248c3RkOjp1bmlxdWVfcHRyPFRhcmdldE1hY2hpbmU+KCk+ICZUTUZhY3RvcnksCisgICAgICAgICAgICAgVGFyZ2V0TWFjaGluZTo6Q29kZUdlbkZpbGVUeXBlIEZUID0gVGFyZ2V0TWFjaGluZTo6Q0dGVF9PYmplY3RGaWxlLAorICAgICAgICAgICAgIGJvb2wgUHJlc2VydmVMb2NhbHMgPSBmYWxzZSk7CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUGFzc2VzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUGFzc2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjhmZDA0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9QYXNzZXMuaApAQCAtMCwwICsxLDQzOSBAQAorLy89PT0tLSBQYXNzZXMuaCAtIFRhcmdldCBpbmRlcGVuZGVudCBjb2RlIGdlbmVyYXRpb24gcGFzc2VzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBpbnRlcmZhY2VzIHRvIGFjY2VzcyB0aGUgdGFyZ2V0IGluZGVwZW5kZW50IGNvZGUgZ2VuZXJhdGlvbgorLy8gcGFzc2VzIHByb3ZpZGVkIGJ5IHRoZSBMTFZNIGJhY2tlbmQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fUEFTU0VTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1BBU1NFU19ICisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvblBhc3M7CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lRnVuY3Rpb25QYXNzOworY2xhc3MgTW9kdWxlUGFzczsKK2NsYXNzIFBhc3M7CitjbGFzcyBUYXJnZXRNYWNoaW5lOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJDbGFzczsKK2NsYXNzIHJhd19vc3RyZWFtOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisvLy8gTGlzdCBvZiB0YXJnZXQgaW5kZXBlbmRlbnQgQ29kZUdlbiBwYXNzIElEcy4KK25hbWVzcGFjZSBsbHZtIHsKKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVBdG9taWNFeHBhbmRQYXNzKCk7CisKKyAgLy8vIGNyZWF0ZVVucmVhY2hhYmxlQmxvY2tFbGltaW5hdGlvblBhc3MgLSBUaGUgTExWTSBjb2RlIGdlbmVyYXRvciBkb2VzIG5vdAorICAvLy8gd29yayB3ZWxsIHdpdGggdW5yZWFjaGFibGUgYmFzaWMgYmxvY2tzICh3aGF0IGxpdmUgcmFuZ2VzIG1ha2Ugc2Vuc2UgZm9yIGEKKyAgLy8vIGJsb2NrIHRoYXQgY2Fubm90IGJlIHJlYWNoZWQ/KS4gIEFzIHN1Y2gsIGEgY29kZSBnZW5lcmF0b3Igc2hvdWxkIGVpdGhlcgorICAvLy8gbm90IGluc3RydWN0aW9uIHNlbGVjdCB1bnJlYWNoYWJsZSBibG9ja3MsIG9yIHJ1biB0aGlzIHBhc3MgYXMgaXRzCisgIC8vLyBsYXN0IExMVk0gbW9kaWZ5aW5nIHBhc3MgdG8gY2xlYW4gdXAgYmxvY2tzIHRoYXQgYXJlIG5vdCByZWFjaGFibGUgZnJvbQorICAvLy8gdGhlIGVudHJ5IGJsb2NrLgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZVVucmVhY2hhYmxlQmxvY2tFbGltaW5hdGlvblBhc3MoKTsKKworICAvLy8gTWFjaGluZUZ1bmN0aW9uUHJpbnRlciBwYXNzIC0gVGhpcyBwYXNzIHByaW50cyBvdXQgdGhlIG1hY2hpbmUgZnVuY3Rpb24gdG8KKyAgLy8vIHRoZSBnaXZlbiBzdHJlYW0gYXMgYSBkZWJ1Z2dpbmcgdG9vbC4KKyAgTWFjaGluZUZ1bmN0aW9uUGFzcyAqCisgIGNyZWF0ZU1hY2hpbmVGdW5jdGlvblByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lciA9IiIpOworCisgIC8vLyBNSVJQcmludGluZyBwYXNzIC0gdGhpcyBwYXNzIHByaW50cyBvdXQgdGhlIExMVk0gSVIgaW50byB0aGUgZ2l2ZW4gc3RyZWFtCisgIC8vLyB1c2luZyB0aGUgTUlSIHNlcmlhbGl6YXRpb24gZm9ybWF0LgorICBNYWNoaW5lRnVuY3Rpb25QYXNzICpjcmVhdGVQcmludE1JUlBhc3MocmF3X29zdHJlYW0gJk9TKTsKKworICAvLy8gVGhpcyBwYXNzIHJlc2V0cyBhIE1hY2hpbmVGdW5jdGlvbiB3aGVuIGl0IGhhcyB0aGUgRmFpbGVkSVNlbCBwcm9wZXJ0eQorICAvLy8gYXMgaWYgaXQgd2FzIGp1c3QgY3JlYXRlZC4KKyAgLy8vIElmIEVtaXRGYWxsYmFja0RpYWcgaXMgdHJ1ZSwgdGhlIHBhc3Mgd2lsbCBlbWl0IGEKKyAgLy8vIERpYWdub3N0aWNJbmZvSVNlbEZhbGxiYWNrIGZvciBldmVyeSBNYWNoaW5lRnVuY3Rpb24gaXQgcmVzZXRzLgorICAvLy8gSWYgQWJvcnRPbkZhaWxlZElTZWwgaXMgdHJ1ZSwgYWJvcnQgY29tcGlsYXRpb24gaW5zdGVhZCBvZiByZXNldHRpbmcuCisgIE1hY2hpbmVGdW5jdGlvblBhc3MgKmNyZWF0ZVJlc2V0TWFjaGluZUZ1bmN0aW9uUGFzcyhib29sIEVtaXRGYWxsYmFja0RpYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFib3J0T25GYWlsZWRJU2VsKTsKKworICAvLy8gY3JlYXRlQ29kZUdlblByZXBhcmVQYXNzIC0gVHJhbnNmb3JtIHRoZSBjb2RlIHRvIGV4cG9zZSBtb3JlIHBhdHRlcm4KKyAgLy8vIG1hdGNoaW5nIGR1cmluZyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24uCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlQ29kZUdlblByZXBhcmVQYXNzKCk7CisKKyAgLy8vIGNyZWF0ZVNjYWxhcml6ZU1hc2tlZE1lbUludHJpblBhc3MgLSBSZXBsYWNlIG1hc2tlZCBsb2FkLCBzdG9yZSwgZ2F0aGVyCisgIC8vLyBhbmQgc2NhdHRlciBpbnRyaW5zaWNzIHdpdGggc2NhbGFyIGNvZGUgd2hlbiB0YXJnZXQgZG9lc24ndCBzdXBwb3J0IHRoZW0uCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlU2NhbGFyaXplTWFza2VkTWVtSW50cmluUGFzcygpOworCisgIC8vLyBBdG9taWNFeHBhbmRJRCAtLSBMb3dlcnMgYXRvbWljIG9wZXJhdGlvbnMgaW4gdGVybXMgb2YgZWl0aGVyIGNtcHhjaGcKKyAgLy8vIGxvYWQtbGlua2VkL3N0b3JlLWNvbmRpdGlvbmFsIGxvb3BzLgorICBleHRlcm4gY2hhciAmQXRvbWljRXhwYW5kSUQ7CisKKyAgLy8vIE1hY2hpbmVMb29wSW5mbyAtIFRoaXMgcGFzcyBpcyBhIGxvb3AgYW5hbHlzaXMgcGFzcy4KKyAgZXh0ZXJuIGNoYXIgJk1hY2hpbmVMb29wSW5mb0lEOworCisgIC8vLyBNYWNoaW5lRG9taW5hdG9ycyAtIFRoaXMgcGFzcyBpcyBhIG1hY2hpbmUgZG9taW5hdG9ycyBhbmFseXNpcyBwYXNzLgorICBleHRlcm4gY2hhciAmTWFjaGluZURvbWluYXRvcnNJRDsKKworLy8vIE1hY2hpbmVEb21pbmFuYWNlRnJvbnRpZXIgLSBUaGlzIHBhc3MgaXMgYSBtYWNoaW5lIGRvbWluYXRvcnMgYW5hbHlzaXMgcGFzcy4KKyAgZXh0ZXJuIGNoYXIgJk1hY2hpbmVEb21pbmFuY2VGcm9udGllcklEOworCisgIC8vLyBNYWNoaW5lUmVnaW9uSW5mbyAtIFRoaXMgcGFzcyBjb21wdXRlcyBTRVNFIHJlZ2lvbnMgZm9yIG1hY2hpbmUgZnVuY3Rpb25zLgorICBleHRlcm4gY2hhciAmTWFjaGluZVJlZ2lvbkluZm9QYXNzSUQ7CisKKyAgLy8vIEVkZ2VCdW5kbGVzIGFuYWx5c2lzIC0gQnVuZGxlIG1hY2hpbmUgQ0ZHIGVkZ2VzLgorICBleHRlcm4gY2hhciAmRWRnZUJ1bmRsZXNJRDsKKworICAvLy8gTGl2ZVZhcmlhYmxlcyBwYXNzIC0gVGhpcyBwYXNzIGNvbXB1dGVzIHRoZSBzZXQgb2YgYmxvY2tzIGluIHdoaWNoIGVhY2gKKyAgLy8vIHZhcmlhYmxlIGlzIGxpZmUgYW5kIHNldHMgbWFjaGluZSBvcGVyYW5kIGtpbGwgZmxhZ3MuCisgIGV4dGVybiBjaGFyICZMaXZlVmFyaWFibGVzSUQ7CisKKyAgLy8vIFBISUVsaW1pbmF0aW9uIC0gVGhpcyBwYXNzIGVsaW1pbmF0ZXMgbWFjaGluZSBpbnN0cnVjdGlvbiBQSEkgbm9kZXMKKyAgLy8vIGJ5IGluc2VydGluZyBjb3B5IGluc3RydWN0aW9ucy4gIFRoaXMgZGVzdHJveXMgU1NBIGluZm9ybWF0aW9uLCBidXQgaXMgdGhlCisgIC8vLyBkZXNpcmVkIGlucHV0IGZvciBzb21lIHJlZ2lzdGVyIGFsbG9jYXRvcnMuICBUaGlzIHBhc3MgaXMgInJlcXVpcmVkIiBieQorICAvLy8gdGhlc2UgcmVnaXN0ZXIgYWxsb2NhdG9yIGxpa2UgdGhpczogQVUuYWRkUmVxdWlyZWRJRChQSElFbGltaW5hdGlvbklEKTsKKyAgZXh0ZXJuIGNoYXIgJlBISUVsaW1pbmF0aW9uSUQ7CisKKyAgLy8vIExpdmVJbnRlcnZhbHMgLSBUaGlzIGFuYWx5c2lzIGtlZXBzIHRyYWNrIG9mIHRoZSBsaXZlIHJhbmdlcyBvZiB2aXJ0dWFsCisgIC8vLyBhbmQgcGh5c2ljYWwgcmVnaXN0ZXJzLgorICBleHRlcm4gY2hhciAmTGl2ZUludGVydmFsc0lEOworCisgIC8vLyBMaXZlU3RhY2tzIHBhc3MuIEFuIGFuYWx5c2lzIGtlZXBpbmcgdHJhY2sgb2YgdGhlIGxpdmVuZXNzIG9mIHN0YWNrIHNsb3RzLgorICBleHRlcm4gY2hhciAmTGl2ZVN0YWNrc0lEOworCisgIC8vLyBUd29BZGRyZXNzSW5zdHJ1Y3Rpb24gLSBUaGlzIHBhc3MgcmVkdWNlcyB0d28tYWRkcmVzcyBpbnN0cnVjdGlvbnMgdG8KKyAgLy8vIHVzZSB0d28gb3BlcmFuZHMuIFRoaXMgZGVzdHJveXMgU1NBIGluZm9ybWF0aW9uIGJ1dCBpdCBpcyBkZXNpcmVkIGJ5CisgIC8vLyByZWdpc3RlciBhbGxvY2F0b3JzLgorICBleHRlcm4gY2hhciAmVHdvQWRkcmVzc0luc3RydWN0aW9uUGFzc0lEOworCisgIC8vLyBQcm9jZXNzSW1waWNpdERlZnMgcGFzcyAtIFRoaXMgcGFzcyByZW1vdmVzIElNUExJQ0lUX0RFRnMuCisgIGV4dGVybiBjaGFyICZQcm9jZXNzSW1wbGljaXREZWZzSUQ7CisKKyAgLy8vIFJlZ2lzdGVyQ29hbGVzY2VyIC0gVGhpcyBwYXNzIG1lcmdlcyBsaXZlIHJhbmdlcyB0byBlbGltaW5hdGUgY29waWVzLgorICBleHRlcm4gY2hhciAmUmVnaXN0ZXJDb2FsZXNjZXJJRDsKKworICAvLy8gTWFjaGluZVNjaGVkdWxlciAtIFRoaXMgcGFzcyBzY2hlZHVsZXMgbWFjaGluZSBpbnN0cnVjdGlvbnMuCisgIGV4dGVybiBjaGFyICZNYWNoaW5lU2NoZWR1bGVySUQ7CisKKyAgLy8vIFBvc3RNYWNoaW5lU2NoZWR1bGVyIC0gVGhpcyBwYXNzIHNjaGVkdWxlcyBtYWNoaW5lIGluc3RydWN0aW9ucyBwb3N0UkEuCisgIGV4dGVybiBjaGFyICZQb3N0TWFjaGluZVNjaGVkdWxlcklEOworCisgIC8vLyBTcGlsbFBsYWNlbWVudCBhbmFseXNpcy4gU3VnZ2VzdCBvcHRpbWFsIHBsYWNlbWVudCBvZiBzcGlsbCBjb2RlIGJldHdlZW4KKyAgLy8vIGJhc2ljIGJsb2Nrcy4KKyAgZXh0ZXJuIGNoYXIgJlNwaWxsUGxhY2VtZW50SUQ7CisKKyAgLy8vIFNocmlua1dyYXAgcGFzcy4gTG9vayBmb3IgdGhlIGJlc3QgcGxhY2UgdG8gaW5zZXJ0IHNhdmUgYW5kIHJlc3RvcmUKKyAgLy8gaW5zdHJ1Y3Rpb24gYW5kIHVwZGF0ZSB0aGUgTWFjaGluZUZ1bmN0aW9uSW5mbyB3aXRoIHRoYXQgaW5mb3JtYXRpb24uCisgIGV4dGVybiBjaGFyICZTaHJpbmtXcmFwSUQ7CisKKyAgLy8vIExpdmVSYW5nZVNocmluayBwYXNzLiBNb3ZlIGluc3RydWN0aW9uIGNsb3NlIHRvIGl0cyBkZWZpbml0aW9uIHRvIHNocmluaworICAvLy8gdGhlIGRlZmluaXRpb24ncyBsaXZlIHJhbmdlLgorICBleHRlcm4gY2hhciAmTGl2ZVJhbmdlU2hyaW5rSUQ7CisKKyAgLy8vIEdyZWVkeSByZWdpc3RlciBhbGxvY2F0b3IuCisgIGV4dGVybiBjaGFyICZSQUdyZWVkeUlEOworCisgIC8vLyBCYXNpYyByZWdpc3RlciBhbGxvY2F0b3IuCisgIGV4dGVybiBjaGFyICZSQUJhc2ljSUQ7CisKKyAgLy8vIFZpcnRSZWdSZXdyaXRlciBwYXNzLiBSZXdyaXRlIHZpcnR1YWwgcmVnaXN0ZXJzIHRvIHBoeXNpY2FsIHJlZ2lzdGVycyBhcworICAvLy8gYXNzaWduZWQgaW4gVmlydFJlZ01hcC4KKyAgZXh0ZXJuIGNoYXIgJlZpcnRSZWdSZXdyaXRlcklEOworCisgIC8vLyBVbnJlYWNoYWJsZU1hY2hpbmVCbG9ja0VsaW1pbmF0aW9uIC0gVGhpcyBwYXNzIHJlbW92ZXMgdW5yZWFjaGFibGUKKyAgLy8vIG1hY2hpbmUgYmFzaWMgYmxvY2tzLgorICBleHRlcm4gY2hhciAmVW5yZWFjaGFibGVNYWNoaW5lQmxvY2tFbGltSUQ7CisKKyAgLy8vIERlYWRNYWNoaW5lSW5zdHJ1Y3Rpb25FbGltIC0gVGhpcyBwYXNzIHJlbW92ZXMgZGVhZCBtYWNoaW5lIGluc3RydWN0aW9ucy4KKyAgZXh0ZXJuIGNoYXIgJkRlYWRNYWNoaW5lSW5zdHJ1Y3Rpb25FbGltSUQ7CisKKyAgLy8vIFRoaXMgcGFzcyBhZGRzIGRlYWQvdW5kZWYgZmxhZ3MgYWZ0ZXIgYW5hbHl6aW5nIHN1YnJlZ2lzdGVyIGxhbmVzLgorICBleHRlcm4gY2hhciAmRGV0ZWN0RGVhZExhbmVzSUQ7CisKKyAgLy8vIFRoaXMgcGFzcyBwZXJmb3JtIHBvc3QtcmEgbWFjaGluZSBzaW5rIGZvciBDT1BZIGluc3RydWN0aW9ucy4KKyAgZXh0ZXJuIGNoYXIgJlBvc3RSQU1hY2hpbmVTaW5raW5nSUQ7CisKKyAgLy8vIEZhc3RSZWdpc3RlckFsbG9jYXRpb24gUGFzcyAtIFRoaXMgcGFzcyByZWdpc3RlciBhbGxvY2F0ZXMgYXMgZmFzdCBhcworICAvLy8gcG9zc2libGUuIEl0IGlzIGJlc3Qgc3VpdGVkIGZvciBkZWJ1ZyBjb2RlIHdoZXJlIGxpdmUgcmFuZ2VzIGFyZSBzaG9ydC4KKyAgLy8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlRmFzdFJlZ2lzdGVyQWxsb2NhdG9yKCk7CisKKyAgLy8vIEJhc2ljUmVnaXN0ZXJBbGxvY2F0aW9uIFBhc3MgLSBUaGlzIHBhc3MgaW1wbGVtZW50cyBhIGRlZ2VuZXJhdGUgZ2xvYmFsCisgIC8vLyByZWdpc3RlciBhbGxvY2F0b3IgdXNpbmcgdGhlIGJhc2ljIHJlZ2FsbG9jIGZyYW1ld29yay4KKyAgLy8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlQmFzaWNSZWdpc3RlckFsbG9jYXRvcigpOworCisgIC8vLyBHcmVlZHkgcmVnaXN0ZXIgYWxsb2NhdGlvbiBwYXNzIC0gVGhpcyBwYXNzIGltcGxlbWVudHMgYSBnbG9iYWwgcmVnaXN0ZXIKKyAgLy8vIGFsbG9jYXRvciBmb3Igb3B0aW1pemVkIGJ1aWxkcy4KKyAgLy8vCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlR3JlZWR5UmVnaXN0ZXJBbGxvY2F0b3IoKTsKKworICAvLy8gUEJRUFJlZ2lzdGVyQWxsb2NhdGlvbiBQYXNzIC0gVGhpcyBwYXNzIGltcGxlbWVudHMgdGhlIFBhcnRpdGlvbmVkIEJvb2xlYW4KKyAgLy8vIFF1YWRyYXRpYyBQcm9ncmFhbWluZyAoUEJRUCkgYmFzZWQgcmVnaXN0ZXIgYWxsb2NhdG9yLgorICAvLy8KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVEZWZhdWx0UEJRUFJlZ2lzdGVyQWxsb2NhdG9yKCk7CisKKyAgLy8vIFByb2xvZ0VwaWxvZ0NvZGVJbnNlcnRlciAtIFRoaXMgcGFzcyBpbnNlcnRzIHByb2xvZyBhbmQgZXBpbG9nIGNvZGUsCisgIC8vLyBhbmQgZWxpbWluYXRlcyBhYnN0cmFjdCBmcmFtZSByZWZlcmVuY2VzLgorICBleHRlcm4gY2hhciAmUHJvbG9nRXBpbG9nQ29kZUluc2VydGVySUQ7CisgIE1hY2hpbmVGdW5jdGlvblBhc3MgKmNyZWF0ZVByb2xvZ0VwaWxvZ0luc2VydGVyUGFzcygpOworCisgIC8vLyBFeHBhbmRQb3N0UkFQc2V1ZG9zIC0gVGhpcyBwYXNzIGV4cGFuZHMgcHNldWRvIGluc3RydWN0aW9ucyBhZnRlcgorICAvLy8gcmVnaXN0ZXIgYWxsb2NhdGlvbi4KKyAgZXh0ZXJuIGNoYXIgJkV4cGFuZFBvc3RSQVBzZXVkb3NJRDsKKworICAvLy8gY3JlYXRlUG9zdFJBSGF6YXJkUmVjb2duaXplciAtIFRoaXMgcGFzcyBydW5zIHRoZSBwb3N0LXJhIGhhemFyZAorICAvLy8gcmVjb2duaXplci4KKyAgZXh0ZXJuIGNoYXIgJlBvc3RSQUhhemFyZFJlY29nbml6ZXJJRDsKKworICAvLy8gY3JlYXRlUG9zdFJBU2NoZWR1bGVyIC0gVGhpcyBwYXNzIHBlcmZvcm1zIHBvc3QgcmVnaXN0ZXIgYWxsb2NhdGlvbgorICAvLy8gc2NoZWR1bGluZy4KKyAgZXh0ZXJuIGNoYXIgJlBvc3RSQVNjaGVkdWxlcklEOworCisgIC8vLyBCcmFuY2hGb2xkaW5nIC0gVGhpcyBwYXNzIHBlcmZvcm1zIG1hY2hpbmUgY29kZSBDRkcgYmFzZWQKKyAgLy8vIG9wdGltaXphdGlvbnMgdG8gZGVsZXRlIGJyYW5jaGVzIHRvIGJyYW5jaGVzLCBlbGltaW5hdGUgYnJhbmNoZXMgdG8KKyAgLy8vIHN1Y2Nlc3NvciBibG9ja3MgKGNyZWF0aW5nIGZhbGwgdGhyb3VnaHMpLCBhbmQgZWxpbWluYXRpbmcgYnJhbmNoZXMgb3ZlcgorICAvLy8gYnJhbmNoZXMuCisgIGV4dGVybiBjaGFyICZCcmFuY2hGb2xkZXJQYXNzSUQ7CisKKyAgLy8vIEJyYW5jaFJlbGF4YXRpb24gLSBUaGlzIHBhc3MgcmVwbGFjZXMgYnJhbmNoZXMgdGhhdCBuZWVkIHRvIGp1bXAgZnVydGhlcgorICAvLy8gdGhhbiBpcyBzdXBwb3J0ZWQgYnkgYSBicmFuY2ggaW5zdHJ1Y3Rpb24uCisgIGV4dGVybiBjaGFyICZCcmFuY2hSZWxheGF0aW9uUGFzc0lEOworCisgIC8vLyBNYWNoaW5lRnVuY3Rpb25QcmludGVyUGFzcyAtIFRoaXMgcGFzcyBwcmludHMgb3V0IE1hY2hpbmVJbnN0cidzLgorICBleHRlcm4gY2hhciAmTWFjaGluZUZ1bmN0aW9uUHJpbnRlclBhc3NJRDsKKworICAvLy8gTUlSUHJpbnRpbmdQYXNzIC0gdGhpcyBwYXNzIHByaW50cyBvdXQgdGhlIExMVk0gSVIgdXNpbmcgdGhlIE1JUgorICAvLy8gc2VyaWFsaXphdGlvbiBmb3JtYXQuCisgIGV4dGVybiBjaGFyICZNSVJQcmludGluZ1Bhc3NJRDsKKworICAvLy8gVGFpbER1cGxpY2F0ZSAtIER1cGxpY2F0ZSBibG9ja3Mgd2l0aCB1bmNvbmRpdGlvbmFsIGJyYW5jaGVzCisgIC8vLyBpbnRvIHRhaWxzIG9mIHRoZWlyIHByZWRlY2Vzc29ycy4KKyAgZXh0ZXJuIGNoYXIgJlRhaWxEdXBsaWNhdGVJRDsKKworICAvLy8gRHVwbGljYXRlIGJsb2NrcyB3aXRoIHVuY29uZGl0aW9uYWwgYnJhbmNoZXMgaW50byB0YWlscyBvZiB0aGVpcgorICAvLy8gcHJlZGVjZXNzb3JzLiBWYXJpYW50IHRoYXQgd29ya3MgYmVmb3JlIHJlZ2lzdGVyIGFsbG9jYXRpb24uCisgIGV4dGVybiBjaGFyICZFYXJseVRhaWxEdXBsaWNhdGVJRDsKKworICAvLy8gTWFjaGluZVRyYWNlTWV0cmljcyAtIFRoaXMgcGFzcyBjb21wdXRlcyBjcml0aWNhbCBwYXRoIGFuZCBDUFUgcmVzb3VyY2UKKyAgLy8vIHVzYWdlIGluIGFuIGVuc2VtYmxlIG9mIHRyYWNlcy4KKyAgZXh0ZXJuIGNoYXIgJk1hY2hpbmVUcmFjZU1ldHJpY3NJRDsKKworICAvLy8gRWFybHlJZkNvbnZlcnRlciAtIFRoaXMgcGFzcyBwZXJmb3JtcyBpZi1jb252ZXJzaW9uIG9uIFNTQSBmb3JtIGJ5CisgIC8vLyBpbnNlcnRpbmcgY21vdiBpbnN0cnVjdGlvbnMuCisgIGV4dGVybiBjaGFyICZFYXJseUlmQ29udmVydGVySUQ7CisKKyAgLy8vIFRoaXMgcGFzcyBwZXJmb3JtcyBpbnN0cnVjdGlvbiBjb21iaW5pbmcgdXNpbmcgdHJhY2UgbWV0cmljcyB0byBlc3RpbWF0ZQorICAvLy8gY3JpdGljYWwtcGF0aCBhbmQgcmVzb3VyY2UgZGVwdGguCisgIGV4dGVybiBjaGFyICZNYWNoaW5lQ29tYmluZXJJRDsKKworICAvLy8gU3RhY2tTbG90Q29sb3JpbmcgLSBUaGlzIHBhc3MgcGVyZm9ybXMgc3RhY2sgY29sb3JpbmcgYW5kIG1lcmdpbmcuCisgIC8vLyBJdCBtZXJnZXMgZGlzam9pbnQgYWxsb2NhcyB0byByZWR1Y2UgdGhlIHN0YWNrIHNpemUuCisgIGV4dGVybiBjaGFyICZTdGFja0NvbG9yaW5nSUQ7CisKKyAgLy8vIElmQ29udmVydGVyIC0gVGhpcyBwYXNzIHBlcmZvcm1zIG1hY2hpbmUgY29kZSBpZiBjb252ZXJzaW9uLgorICBleHRlcm4gY2hhciAmSWZDb252ZXJ0ZXJJRDsKKworICBGdW5jdGlvblBhc3MgKmNyZWF0ZUlmQ29udmVydGVyKAorICAgICAgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmKT4gRnRvcik7CisKKyAgLy8vIE1hY2hpbmVCbG9ja1BsYWNlbWVudCAtIFRoaXMgcGFzcyBwbGFjZXMgYmFzaWMgYmxvY2tzIGJhc2VkIG9uIGJyYW5jaAorICAvLy8gcHJvYmFiaWxpdGllcy4KKyAgZXh0ZXJuIGNoYXIgJk1hY2hpbmVCbG9ja1BsYWNlbWVudElEOworCisgIC8vLyBNYWNoaW5lQmxvY2tQbGFjZW1lbnRTdGF0cyAtIFRoaXMgcGFzcyBjb2xsZWN0cyBzdGF0aXN0aWNzIGFib3V0IHRoZQorICAvLy8gYmFzaWMgYmxvY2sgcGxhY2VtZW50IHVzaW5nIGJyYW5jaCBwcm9iYWJpbGl0aWVzIGFuZCBibG9jayBmcmVxdWVuY3kKKyAgLy8vIGluZm9ybWF0aW9uLgorICBleHRlcm4gY2hhciAmTWFjaGluZUJsb2NrUGxhY2VtZW50U3RhdHNJRDsKKworICAvLy8gR0NMb3dlcmluZyBQYXNzIC0gVXNlZCBieSBnYy5yb290IHRvIHBlcmZvcm0gaXRzIGRlZmF1bHQgbG93ZXJpbmcKKyAgLy8vIG9wZXJhdGlvbnMuCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlR0NMb3dlcmluZ1Bhc3MoKTsKKworICAvLy8gU2hhZG93U3RhY2tHQ0xvd2VyaW5nIC0gSW1wbGVtZW50cyB0aGUgY3VzdG9tIGxvd2VyaW5nIG1lY2hhbmlzbQorICAvLy8gdXNlZCBieSB0aGUgc2hhZG93IHN0YWNrIEdDLiAgT25seSBydW5zIG9uIGZ1bmN0aW9ucyB3aGljaCBvcHQgaW4gdG8KKyAgLy8vIHRoZSBzaGFkb3cgc3RhY2sgY29sbGVjdG9yLgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZVNoYWRvd1N0YWNrR0NMb3dlcmluZ1Bhc3MoKTsKKworICAvLy8gR0NNYWNoaW5lQ29kZUFuYWx5c2lzIC0gVGFyZ2V0LWluZGVwZW5kZW50IHBhc3MgdG8gbWFyayBzYWZlIHBvaW50cworICAvLy8gaW4gbWFjaGluZSBjb2RlLiBNdXN0IGJlIGFkZGVkIHZlcnkgbGF0ZSBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLCBqdXN0CisgIC8vLyBwcmlvciB0byBvdXRwdXQsIGFuZCBpbXBvcnRhbnRseSBhZnRlciBhbGwgQ0ZHIHRyYW5zZm9ybWF0aW9ucyAoc3VjaCBhcworICAvLy8gYnJhbmNoIGZvbGRpbmcpLgorICBleHRlcm4gY2hhciAmR0NNYWNoaW5lQ29kZUFuYWx5c2lzSUQ7CisKKyAgLy8vIENyZWF0ZXMgYSBwYXNzIHRvIHByaW50IEdDIG1ldGFkYXRhLgorICAvLy8KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVHQ0luZm9QcmludGVyKHJhd19vc3RyZWFtICZPUyk7CisKKyAgLy8vIE1hY2hpbmVDU0UgLSBUaGlzIHBhc3MgcGVyZm9ybXMgZ2xvYmFsIENTRSBvbiBtYWNoaW5lIGluc3RydWN0aW9ucy4KKyAgZXh0ZXJuIGNoYXIgJk1hY2hpbmVDU0VJRDsKKworICAvLy8gSW1wbGljaXROdWxsQ2hlY2tzIC0gVGhpcyBwYXNzIGZvbGRzIG51bGwgcG9pbnRlciBjaGVja3MgaW50byBuZWFyYnkKKyAgLy8vIG1lbW9yeSBvcGVyYXRpb25zLgorICBleHRlcm4gY2hhciAmSW1wbGljaXROdWxsQ2hlY2tzSUQ7CisKKyAgLy8vIFRoaXMgcGFzcyBwZXJmb3JtcyBsb29wIGludmFyaWFudCBjb2RlIG1vdGlvbiBvbiBtYWNoaW5lIGluc3RydWN0aW9ucy4KKyAgZXh0ZXJuIGNoYXIgJk1hY2hpbmVMSUNNSUQ7CisKKyAgLy8vIFRoaXMgcGFzcyBwZXJmb3JtcyBsb29wIGludmFyaWFudCBjb2RlIG1vdGlvbiBvbiBtYWNoaW5lIGluc3RydWN0aW9ucy4KKyAgLy8vIFRoaXMgdmFyaWFudCB3b3JrcyBiZWZvcmUgcmVnaXN0ZXIgYWxsb2NhdGlvbi4gXHNlZSBNYWNoaW5lTElDTUlELgorICBleHRlcm4gY2hhciAmRWFybHlNYWNoaW5lTElDTUlEOworCisgIC8vLyBNYWNoaW5lU2lua2luZyAtIFRoaXMgcGFzcyBwZXJmb3JtcyBzaW5raW5nIG9uIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zLgorICBleHRlcm4gY2hhciAmTWFjaGluZVNpbmtpbmdJRDsKKworICAvLy8gTWFjaGluZUNvcHlQcm9wYWdhdGlvbiAtIFRoaXMgcGFzcyBwZXJmb3JtcyBjb3B5IHByb3BhZ2F0aW9uIG9uCisgIC8vLyBtYWNoaW5lIGluc3RydWN0aW9ucy4KKyAgZXh0ZXJuIGNoYXIgJk1hY2hpbmVDb3B5UHJvcGFnYXRpb25JRDsKKworICAvLy8gUGVlcGhvbGVPcHRpbWl6ZXIgLSBUaGlzIHBhc3MgcGVyZm9ybXMgcGVlcGhvbGUgb3B0aW1pemF0aW9ucyAtCisgIC8vLyBsaWtlIGV4dGVuc2lvbiBhbmQgY29tcGFyaXNvbiBlbGltaW5hdGlvbnMuCisgIGV4dGVybiBjaGFyICZQZWVwaG9sZU9wdGltaXplcklEOworCisgIC8vLyBPcHRpbWl6ZVBISXMgLSBUaGlzIHBhc3Mgb3B0aW1pemVzIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gUEhJcworICAvLy8gdG8gdGFrZSBhZHZhbnRhZ2Ugb2Ygb3Bwb3J0dW5pdGllcyBjcmVhdGVkIGR1cmluZyBEQUcgbGVnYWxpemF0aW9uLgorICBleHRlcm4gY2hhciAmT3B0aW1pemVQSElzSUQ7CisKKyAgLy8vIFN0YWNrU2xvdENvbG9yaW5nIC0gVGhpcyBwYXNzIHBlcmZvcm1zIHN0YWNrIHNsb3QgY29sb3JpbmcuCisgIGV4dGVybiBjaGFyICZTdGFja1Nsb3RDb2xvcmluZ0lEOworCisgIC8vLyBcYnJpZWYgVGhpcyBwYXNzIGxheXMgb3V0IGZ1bmNsZXRzIGNvbnRpZ3VvdXNseS4KKyAgZXh0ZXJuIGNoYXIgJkZ1bmNsZXRMYXlvdXRJRDsKKworICAvLy8gVGhpcyBwYXNzIGluc2VydHMgdGhlIFhSYXkgaW5zdHJ1bWVudGF0aW9uIHNsZWRzIGlmIHRoZXkgYXJlIHN1cHBvcnRlZCBieQorICAvLy8gdGhlIHRhcmdldCBwbGF0Zm9ybS4KKyAgZXh0ZXJuIGNoYXIgJlhSYXlJbnN0cnVtZW50YXRpb25JRDsKKworICAvLy8gVGhpcyBwYXNzIGluc2VydHMgRkVudHJ5IGNhbGxzCisgIGV4dGVybiBjaGFyICZGRW50cnlJbnNlcnRlcklEOworCisgIC8vLyBcYnJpZWYgVGhpcyBwYXNzIGltcGxlbWVudHMgdGhlICJwYXRjaGFibGUtZnVuY3Rpb24iIGF0dHJpYnV0ZS4KKyAgZXh0ZXJuIGNoYXIgJlBhdGNoYWJsZUZ1bmN0aW9uSUQ7CisKKyAgLy8vIGNyZWF0ZVN0YWNrUHJvdGVjdG9yUGFzcyAtIFRoaXMgcGFzcyBhZGRzIHN0YWNrIHByb3RlY3RvcnMgdG8gZnVuY3Rpb25zLgorICAvLy8KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVTdGFja1Byb3RlY3RvclBhc3MoKTsKKworICAvLy8gY3JlYXRlTWFjaGluZVZlcmlmaWVyUGFzcyAtIFRoaXMgcGFzcyB2ZXJpZmllcyBjZW5lcmF0ZWQgbWFjaGluZSBjb2RlCisgIC8vLyBpbnN0cnVjdGlvbnMgZm9yIGNvcnJlY3RuZXNzLgorICAvLy8KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVNYWNoaW5lVmVyaWZpZXJQYXNzKGNvbnN0IHN0ZDo6c3RyaW5nJiBCYW5uZXIpOworCisgIC8vLyBjcmVhdGVEd2FyZkVIUGFzcyAtIFRoaXMgcGFzcyBtdWxjaGVzIGV4Y2VwdGlvbiBoYW5kbGluZyBjb2RlIGludG8gYSBmb3JtCisgIC8vLyBhZGFwdGVkIHRvIGNvZGUgZ2VuZXJhdGlvbi4gIFJlcXVpcmVkIGlmIHVzaW5nIGR3YXJmIGV4Y2VwdGlvbiBoYW5kbGluZy4KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVEd2FyZkVIUGFzcygpOworCisgIC8vLyBjcmVhdGVXaW5FSFBhc3MgLSBQcmVwYXJlcyBwZXJzb25hbGl0eSBmdW5jdGlvbnMgdXNlZCBieSBNU1ZDIG9uIFdpbmRvd3MsCisgIC8vLyBpbiBhZGRpdGlvbiB0byB0aGUgSXRhbml1bSBMU0RBIGJhc2VkIHBlcnNvbmFsaXRpZXMuCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlV2luRUhQYXNzKCk7CisKKyAgLy8vIGNyZWF0ZVNqTGpFSFByZXBhcmVQYXNzIC0gVGhpcyBwYXNzIGFkYXB0cyBleGNlcHRpb24gaGFuZGxpbmcgY29kZSB0byB1c2UKKyAgLy8vIHRoZSBHQ0Mtc3R5bGUgYnVpbHRpbiBzZXRqbXAvbG9uZ2ptcCAoc2psaikgdG8gaGFuZGxpbmcgRUggY29udHJvbCBmbG93LgorICAvLy8KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVTakxqRUhQcmVwYXJlUGFzcygpOworCisgIC8vLyBMb2NhbFN0YWNrU2xvdEFsbG9jYXRpb24gLSBUaGlzIHBhc3MgYXNzaWducyBsb2NhbCBmcmFtZSBpbmRpY2VzIHRvIHN0YWNrCisgIC8vLyBzbG90cyByZWxhdGl2ZSB0byBvbmUgYW5vdGhlciBhbmQgYWxsb2NhdGVzIGJhc2UgcmVnaXN0ZXJzIHRvIGFjY2VzcyB0aGVtCisgIC8vLyB3aGVuIGl0IGlzIGVzdGltYXRlZCBieSB0aGUgdGFyZ2V0IHRvIGJlIG91dCBvZiByYW5nZSBvZiBub3JtYWwgZnJhbWUKKyAgLy8vIHBvaW50ZXIgb3Igc3RhY2sgcG9pbnRlciBpbmRleCBhZGRyZXNzaW5nLgorICBleHRlcm4gY2hhciAmTG9jYWxTdGFja1Nsb3RBbGxvY2F0aW9uSUQ7CisKKyAgLy8vIEV4cGFuZElTZWxQc2V1ZG9zIC0gVGhpcyBwYXNzIGV4cGFuZHMgcHNldWRvLWluc3RydWN0aW9ucy4KKyAgZXh0ZXJuIGNoYXIgJkV4cGFuZElTZWxQc2V1ZG9zSUQ7CisKKyAgLy8vIFVucGFja01hY2hpbmVCdW5kbGVzIC0gVGhpcyBwYXNzIHVucGFjayBtYWNoaW5lIGluc3RydWN0aW9uIGJ1bmRsZXMuCisgIGV4dGVybiBjaGFyICZVbnBhY2tNYWNoaW5lQnVuZGxlc0lEOworCisgIEZ1bmN0aW9uUGFzcyAqCisgIGNyZWF0ZVVucGFja01hY2hpbmVCdW5kbGVzKHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJik+IEZ0b3IpOworCisgIC8vLyBGaW5hbGl6ZU1hY2hpbmVCdW5kbGVzIC0gVGhpcyBwYXNzIGZpbmFsaXplIG1hY2hpbmUgaW5zdHJ1Y3Rpb24KKyAgLy8vIGJ1bmRsZXMgKGNyZWF0ZWQgZWFybGllciwgZS5nLiBkdXJpbmcgcHJlLVJBIHNjaGVkdWxpbmcpLgorICBleHRlcm4gY2hhciAmRmluYWxpemVNYWNoaW5lQnVuZGxlc0lEOworCisgIC8vLyBTdGFja01hcExpdmVuZXNzIC0gVGhpcyBwYXNzIGFuYWx5c2VzIHRoZSByZWdpc3RlciBsaXZlLW91dCBzZXQgb2YKKyAgLy8vIHN0YWNrbWFwL3BhdGNocG9pbnQgaW50cmluc2ljcyBhbmQgYXR0YWNoZXMgdGhlIGNhbGN1bGF0ZWQgaW5mb3JtYXRpb24gdG8KKyAgLy8vIHRoZSBpbnRyaW5zaWMgZm9yIGxhdGVyIGVtaXNzaW9uIHRvIHRoZSBTdGFja01hcC4KKyAgZXh0ZXJuIGNoYXIgJlN0YWNrTWFwTGl2ZW5lc3NJRDsKKworICAvLy8gTGl2ZURlYnVnVmFsdWVzIHBhc3MKKyAgZXh0ZXJuIGNoYXIgJkxpdmVEZWJ1Z1ZhbHVlc0lEOworCisgIC8vLyBjcmVhdGVKdW1wSW5zdHJUYWJsZXMgLSBUaGlzIHBhc3MgY3JlYXRlcyBqdW1wLWluc3RydWN0aW9uIHRhYmxlcy4KKyAgTW9kdWxlUGFzcyAqY3JlYXRlSnVtcEluc3RyVGFibGVzUGFzcygpOworCisgIC8vLyBjcmVhdGVGb3J3YXJkQ29udHJvbEZsb3dJbnRlZ3JpdHlQYXNzIC0gVGhpcyBwYXNzIGFkZHMgY29udHJvbC1mbG93CisgIC8vLyBpbnRlZ3JpdHkuCisgIE1vZHVsZVBhc3MgKmNyZWF0ZUZvcndhcmRDb250cm9sRmxvd0ludGVncml0eVBhc3MoKTsKKworICAvLy8gSW50ZXJsZWF2ZWRBY2Nlc3MgUGFzcyAtIFRoaXMgcGFzcyBpZGVudGlmaWVzIGFuZCBtYXRjaGVzIGludGVybGVhdmVkCisgIC8vLyBtZW1vcnkgYWNjZXNzZXMgdG8gdGFyZ2V0IHNwZWNpZmljIGludHJpbnNpY3MuCisgIC8vLworICBGdW5jdGlvblBhc3MgKmNyZWF0ZUludGVybGVhdmVkQWNjZXNzUGFzcygpOworCisgIC8vLyBMb3dlckVtdVRMUyAtIFRoaXMgcGFzcyBnZW5lcmF0ZXMgX19lbXV0bHNfW3Z0XS54eXogdmFyaWFibGVzIGZvciBhbGwKKyAgLy8vIFRMUyB2YXJpYWJsZXMgZm9yIHRoZSBlbXVsYXRlZCBUTFMgbW9kZWwuCisgIC8vLworICBNb2R1bGVQYXNzICpjcmVhdGVMb3dlckVtdVRMU1Bhc3MoKTsKKworICAvLy8gVGhpcyBwYXNzIGxvd2VycyB0aGUgQGxsdm0ubG9hZC5yZWxhdGl2ZSBpbnRyaW5zaWMgdG8gaW5zdHJ1Y3Rpb25zLgorICAvLy8gVGhpcyBpcyB1bnNhZmUgdG8gZG8gZWFybGllciBiZWNhdXNlIGEgcGFzcyBtYXkgY29tYmluZSB0aGUgY29uc3RhbnQKKyAgLy8vIGluaXRpYWxpemVyIGludG8gdGhlIGxvYWQsIHdoaWNoIG1heSByZXN1bHQgaW4gYW4gb3ZlcmZsb3dpbmcgZXZhbHVhdGlvbi4KKyAgTW9kdWxlUGFzcyAqY3JlYXRlUHJlSVNlbEludHJpbnNpY0xvd2VyaW5nUGFzcygpOworCisgIC8vLyBHbG9iYWxNZXJnZSAtIFRoaXMgcGFzcyBtZXJnZXMgaW50ZXJuYWwgKGJ5IGRlZmF1bHQpIGdsb2JhbHMgaW50byBzdHJ1Y3RzCisgIC8vLyB0byBlbmFibGUgcmV1c2Ugb2YgYSBiYXNlIHBvaW50ZXIgYnkgaW5kZXhlZCBhZGRyZXNzaW5nIG1vZGVzLgorICAvLy8gSXQgY2FuIGFsc28gYmUgY29uZmlndXJlZCB0byBmb2N1cyBvbiBzaXplIG9wdGltaXphdGlvbnMgb25seS4KKyAgLy8vCisgIFBhc3MgKmNyZWF0ZUdsb2JhbE1lcmdlUGFzcyhjb25zdCBUYXJnZXRNYWNoaW5lICpUTSwgdW5zaWduZWQgTWF4aW1hbE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT25seU9wdGltaXplRm9yU2l6ZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNZXJnZUV4dGVybmFsQnlEZWZhdWx0ID0gZmFsc2UpOworCisgIC8vLyBUaGlzIHBhc3Mgc3BsaXRzIHRoZSBzdGFjayBpbnRvIGEgc2FmZSBzdGFjayBhbmQgYW4gdW5zYWZlIHN0YWNrIHRvCisgIC8vLyBwcm90ZWN0IGFnYWluc3Qgc3RhY2stYmFzZWQgb3ZlcmZsb3cgdnVsbmVyYWJpbGl0aWVzLgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZVNhZmVTdGFja1Bhc3MoKTsKKworICAvLy8gVGhpcyBwYXNzIGRldGVjdHMgc3VicmVnaXN0ZXIgbGFuZXMgaW4gYSB2aXJ0dWFsIHJlZ2lzdGVyIHRoYXQgYXJlIHVzZWQKKyAgLy8vIGluZGVwZW5kZW50bHkgb2Ygb3RoZXIgbGFuZXMgYW5kIHNwbGl0cyB0aGVtIGludG8gc2VwYXJhdGUgdmlydHVhbAorICAvLy8gcmVnaXN0ZXJzLgorICBleHRlcm4gY2hhciAmUmVuYW1lSW5kZXBlbmRlbnRTdWJyZWdzSUQ7CisKKyAgLy8vIFRoaXMgcGFzcyBpcyBleGVjdXRlZCBQT1NULVJBIHRvIGNvbGxlY3Qgd2hpY2ggcGh5c2ljYWwgcmVnaXN0ZXJzIGFyZQorICAvLy8gcHJlc2VydmVkIGJ5IGdpdmVuIG1hY2hpbmUgZnVuY3Rpb24uCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlUmVnVXNhZ2VJbmZvQ29sbGVjdG9yKCk7CisKKyAgLy8vIFJldHVybiBhIE1hY2hpbmVGdW5jdGlvbiBwYXNzIHRoYXQgaWRlbnRpZmllcyBjYWxsIHNpdGVzCisgIC8vLyBhbmQgcHJvcGFnYXRlcyByZWdpc3RlciB1c2FnZSBpbmZvcm1hdGlvbiBvZiBjYWxsZWUgdG8gY2FsbGVyCisgIC8vLyBpZiBhdmFpbGFibGUgd2l0aCBQeXNpY2FsUmVnaXN0ZXJVc2FnZUluZm8gcGFzcy4KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVSZWdVc2FnZUluZm9Qcm9wUGFzcygpOworCisgIC8vLyBUaGlzIHBhc3MgcGVyZm9ybXMgc29mdHdhcmUgcGlwZWxpbmluZyBvbiBtYWNoaW5lIGluc3RydWN0aW9ucy4KKyAgZXh0ZXJuIGNoYXIgJk1hY2hpbmVQaXBlbGluZXJJRDsKKworICAvLy8gVGhpcyBwYXNzIGZyZWVzIHRoZSBtZW1vcnkgb2NjdXBpZWQgYnkgdGhlIE1hY2hpbmVGdW5jdGlvbi4KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVGcmVlTWFjaGluZUZ1bmN0aW9uUGFzcygpOworCisgIC8vLyBUaGlzIHBhc3MgcGVyZm9ybXMgb3V0bGluaW5nIG9uIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIGRpcmVjdGx5IGJlZm9yZQorICAvLy8gcHJpbnRpbmcgYXNzZW1ibHkuCisgIE1vZHVsZVBhc3MgKmNyZWF0ZU1hY2hpbmVPdXRsaW5lclBhc3MoYm9vbCBPdXRsaW5lRnJvbUxpbmtPbmNlT0RScyA9IGZhbHNlKTsKKworICAvLy8gVGhpcyBwYXNzIGV4cGFuZHMgdGhlIGV4cGVyaW1lbnRhbCByZWR1Y3Rpb24gaW50cmluc2ljcyBpbnRvIHNlcXVlbmNlcyBvZgorICAvLy8gc2h1ZmZsZXMuCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlRXhwYW5kUmVkdWN0aW9uc1Bhc3MoKTsKKworICAvLyBUaGlzIHBhc3MgZXhwYW5kcyBtZW1jbXAoKSB0byBsb2FkL3N0b3Jlcy4KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVFeHBhbmRNZW1DbXBQYXNzKCk7CisKKyAgLy8vIENyZWF0ZXMgQnJlYWsgRmFsc2UgRGVwZW5kZW5jaWVzIHBhc3MuIFxzZWUgQnJlYWtGYWxzZURlcHMuY3BwCisgIEZ1bmN0aW9uUGFzcyAqY3JlYXRlQnJlYWtGYWxzZURlcHMoKTsKKworICAvLyBUaGlzIHBhc3MgZXhwYW5kcyBpbmRpcmVjdGJyIGluc3RydWN0aW9ucy4KKyAgRnVuY3Rpb25QYXNzICpjcmVhdGVJbmRpcmVjdEJyRXhwYW5kUGFzcygpOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9QcmVJU2VsSW50cmluc2ljTG93ZXJpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9QcmVJU2VsSW50cmluc2ljTG93ZXJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTAwN2ViCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1ByZUlTZWxJbnRyaW5zaWNMb3dlcmluZy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vPT09LSBQcmVJU2VsSW50cmluc2ljTG93ZXJpbmcuaCAtIFByZS1JU2VsIGludHJpbnNpYyBsb3dlcmluZyBwYXNzIC0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIGltcGxlbWVudHMgSVIgbG93ZXJpbmcgZm9yIHRoZSBsbHZtLmxvYWQucmVsYXRpdmUgaW50cmluc2ljLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fQ09ERUdFTl9QUkVJU0VMSU5UUklOU0lDTE9XRVJJTkdfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fUFJFSVNFTElOVFJJTlNJQ0xPV0VSSU5HX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNb2R1bGU7CisKK3N0cnVjdCBQcmVJU2VsSW50cmluc2ljTG93ZXJpbmdQYXNzCisgICAgOiBQYXNzSW5mb01peGluPFByZUlTZWxJbnRyaW5zaWNMb3dlcmluZ1Bhc3M+IHsKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1BSRUlTRUxJTlRSSU5TSUNMT1dFUklOR19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9Qc2V1ZG9Tb3VyY2VWYWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZjBiYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaApAQCAtMCwwICsxLDE5OCBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vUHNldWRvU291cmNlVmFsdWUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBQc2V1ZG9Tb3VyY2VWYWx1ZSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9QU0VVRE9TT1VSQ0VWQUxVRV9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9QU0VVRE9TT1VSQ0VWQUxVRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbFZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVNYXAuaCIKKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFjaGluZUZyYW1lSW5mbzsKK2NsYXNzIE1hY2hpbmVNZW1PcGVyYW5kOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBUYXJnZXRJbnN0ckluZm87CisKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTWFjaGluZU1lbU9wZXJhbmQgJk1NTyk7CitjbGFzcyBQc2V1ZG9Tb3VyY2VWYWx1ZTsKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgUHNldWRvU291cmNlVmFsdWUqIFBTVik7CisKKy8vLyBTcGVjaWFsIHZhbHVlIHN1cHBsaWVkIGZvciBtYWNoaW5lIGxldmVsIGFsaWFzIGFuYWx5c2lzLiBJdCBpbmRpY2F0ZXMgdGhhdAorLy8vIGEgbWVtb3J5IGFjY2VzcyByZWZlcmVuY2VzIHRoZSBmdW5jdGlvbnMgc3RhY2sgZnJhbWUgKGUuZy4sIGEgc3BpbGwgc2xvdCksCisvLy8gYmVsb3cgdGhlIHN0YWNrIGZyYW1lIChlLmcuLCBhcmd1bWVudCBzcGFjZSksIG9yIGNvbnN0YW50IHBvb2wuCitjbGFzcyBQc2V1ZG9Tb3VyY2VWYWx1ZSB7CitwdWJsaWM6CisgIGVudW0gUFNWS2luZCB7CisgICAgU3RhY2ssCisgICAgR09ULAorICAgIEp1bXBUYWJsZSwKKyAgICBDb25zdGFudFBvb2wsCisgICAgRml4ZWRTdGFjaywKKyAgICBHbG9iYWxWYWx1ZUNhbGxFbnRyeSwKKyAgICBFeHRlcm5hbFN5bWJvbENhbGxFbnRyeSwKKyAgICBUYXJnZXRDdXN0b20KKyAgfTsKKworcHJpdmF0ZToKKyAgUFNWS2luZCBLaW5kOworICB1bnNpZ25lZCBBZGRyZXNzU3BhY2U7CisgIGZyaWVuZCByYXdfb3N0cmVhbSAmbGx2bTo6b3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQc2V1ZG9Tb3VyY2VWYWx1ZSogUFNWKTsKKworICBmcmllbmQgY2xhc3MgTWFjaGluZU1lbU9wZXJhbmQ7IC8vIEZvciBwcmludEN1c3RvbSgpLgorCisgIC8vLyBJbXBsZW1lbnQgcHJpbnRpbmcgZm9yIFBzZXVkb1NvdXJjZVZhbHVlLiBUaGlzIGlzIGNhbGxlZCBmcm9tCisgIC8vLyBWYWx1ZTo6cHJpbnQgb3IgVmFsdWUncyBvcGVyYXRvcjw8LgorICB2aXJ0dWFsIHZvaWQgcHJpbnRDdXN0b20ocmF3X29zdHJlYW0gJk8pIGNvbnN0OworCitwdWJsaWM6CisgIGV4cGxpY2l0IFBzZXVkb1NvdXJjZVZhbHVlKFBTVktpbmQgS2luZCwgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUkpOworCisgIHZpcnR1YWwgflBzZXVkb1NvdXJjZVZhbHVlKCk7CisKKyAgUFNWS2luZCBraW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQorCisgIGJvb2wgaXNTdGFjaygpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gU3RhY2s7IH0KKyAgYm9vbCBpc0dPVCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gR09UOyB9CisgIGJvb2wgaXNDb25zdGFudFBvb2woKSBjb25zdCB7IHJldHVybiBLaW5kID09IENvbnN0YW50UG9vbDsgfQorICBib29sIGlzSnVtcFRhYmxlKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBKdW1wVGFibGU7IH0KKworICB1bnNpZ25lZCBnZXRBZGRyZXNzU3BhY2UoKSBjb25zdCB7IHJldHVybiBBZGRyZXNzU3BhY2U7IH0KKworICB1bnNpZ25lZCBnZXRUYXJnZXRDdXN0b20oKSBjb25zdCB7CisgICAgcmV0dXJuIChLaW5kID49IFRhcmdldEN1c3RvbSkgPyAoKEtpbmQrMSkgLSBUYXJnZXRDdXN0b20pIDogMDsKKyAgfQorCisgIC8vLyBUZXN0IHdoZXRoZXIgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IHRoaXMgUHNldWRvU291cmNlVmFsdWUgaGFzIGEKKyAgLy8vIGNvbnN0YW50IHZhbHVlLgorICB2aXJ0dWFsIGJvb2wgaXNDb25zdGFudChjb25zdCBNYWNoaW5lRnJhbWVJbmZvICopIGNvbnN0OworCisgIC8vLyBUZXN0IHdoZXRoZXIgdGhlIG1lbW9yeSBwb2ludGVkIHRvIGJ5IHRoaXMgUHNldWRvU291cmNlVmFsdWUgbWF5IGFsc28gYmUKKyAgLy8vIHBvaW50ZWQgdG8gYnkgYW4gTExWTSBJUiBWYWx1ZS4KKyAgdmlydHVhbCBib29sIGlzQWxpYXNlZChjb25zdCBNYWNoaW5lRnJhbWVJbmZvICopIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gYnkgdGhpcyBQc2V1ZG9Tb3VyY2VWYWx1ZSBjYW4gZXZlcgorICAvLy8gYWxpYXMgYW4gTExWTSBJUiBWYWx1ZS4KKyAgdmlydHVhbCBib29sIG1heUFsaWFzKGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKikgY29uc3Q7Cit9OworCisvLy8gQSBzcGVjaWFsaXplZCBQc2V1ZG9Tb3VyY2VWYWx1ZSBmb3IgaG9sZGluZyBGaXhlZFN0YWNrIHZhbHVlcywgd2hpY2ggbXVzdAorLy8vIGluY2x1ZGUgYSBmcmFtZSBpbmRleC4KK2NsYXNzIEZpeGVkU3RhY2tQc2V1ZG9Tb3VyY2VWYWx1ZSA6IHB1YmxpYyBQc2V1ZG9Tb3VyY2VWYWx1ZSB7CisgIGNvbnN0IGludCBGSTsKKworcHVibGljOgorICBleHBsaWNpdCBGaXhlZFN0YWNrUHNldWRvU291cmNlVmFsdWUoaW50IEZJLCBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSSkKKyAgICAgIDogUHNldWRvU291cmNlVmFsdWUoRml4ZWRTdGFjaywgVElJKSwgRkkoRkkpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBQc2V1ZG9Tb3VyY2VWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5raW5kKCkgPT0gRml4ZWRTdGFjazsKKyAgfQorCisgIGJvb2wgaXNDb25zdGFudChjb25zdCBNYWNoaW5lRnJhbWVJbmZvICpNRkkpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgaXNBbGlhc2VkKGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKk1GSSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBtYXlBbGlhcyhjb25zdCBNYWNoaW5lRnJhbWVJbmZvICopIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgcHJpbnRDdXN0b20ocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZTsKKworICBpbnQgZ2V0RnJhbWVJbmRleCgpIGNvbnN0IHsgcmV0dXJuIEZJOyB9Cit9OworCitjbGFzcyBDYWxsRW50cnlQc2V1ZG9Tb3VyY2VWYWx1ZSA6IHB1YmxpYyBQc2V1ZG9Tb3VyY2VWYWx1ZSB7Citwcm90ZWN0ZWQ6CisgIENhbGxFbnRyeVBzZXVkb1NvdXJjZVZhbHVlKFBTVktpbmQgS2luZCwgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUkpOworCitwdWJsaWM6CisgIGJvb2wgaXNDb25zdGFudChjb25zdCBNYWNoaW5lRnJhbWVJbmZvICopIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzQWxpYXNlZChjb25zdCBNYWNoaW5lRnJhbWVJbmZvICopIGNvbnN0IG92ZXJyaWRlOworICBib29sIG1heUFsaWFzKGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gKikgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gQSBzcGVjaWFsaXplZCBwc2V1ZG8gc29ydWNlIHZhbHVlIGZvciBob2xkaW5nIEdsb2JhbFZhbHVlIHZhbHVlcy4KK2NsYXNzIEdsb2JhbFZhbHVlUHNldWRvU291cmNlVmFsdWUgOiBwdWJsaWMgQ2FsbEVudHJ5UHNldWRvU291cmNlVmFsdWUgeworICBjb25zdCBHbG9iYWxWYWx1ZSAqR1Y7CisKK3B1YmxpYzoKKyAgR2xvYmFsVmFsdWVQc2V1ZG9Tb3VyY2VWYWx1ZShjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0SW5zdHJJbmZvICZUSUkpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgUHNldWRvU291cmNlVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+a2luZCgpID09IEdsb2JhbFZhbHVlQ2FsbEVudHJ5OworICB9CisKKyAgY29uc3QgR2xvYmFsVmFsdWUgKmdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gR1Y7IH0KK307CisKKy8vLyBBIHNwZWNpYWxpemVkIHBzZXVkbyBzb3VyY2UgdmFsdWUgZm9yIGhvbGRpbmcgZXh0ZXJuYWwgc3ltYm9sIHZhbHVlcy4KK2NsYXNzIEV4dGVybmFsU3ltYm9sUHNldWRvU291cmNlVmFsdWUgOiBwdWJsaWMgQ2FsbEVudHJ5UHNldWRvU291cmNlVmFsdWUgeworICBjb25zdCBjaGFyICpFUzsKKworcHVibGljOgorICBFeHRlcm5hbFN5bWJvbFBzZXVkb1NvdXJjZVZhbHVlKGNvbnN0IGNoYXIgKkVTLCBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSSk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBQc2V1ZG9Tb3VyY2VWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5raW5kKCkgPT0gRXh0ZXJuYWxTeW1ib2xDYWxsRW50cnk7CisgIH0KKworICBjb25zdCBjaGFyICpnZXRTeW1ib2woKSBjb25zdCB7IHJldHVybiBFUzsgfQorfTsKKworLy8vIE1hbmFnZXMgY3JlYXRpb24gb2YgcHNldWRvIHNvdXJjZSB2YWx1ZXMuCitjbGFzcyBQc2V1ZG9Tb3VyY2VWYWx1ZU1hbmFnZXIgeworICBjb25zdCBUYXJnZXRJbnN0ckluZm8gJlRJSTsKKyAgY29uc3QgUHNldWRvU291cmNlVmFsdWUgU3RhY2tQU1YsIEdPVFBTViwgSnVtcFRhYmxlUFNWLCBDb25zdGFudFBvb2xQU1Y7CisgIHN0ZDo6bWFwPGludCwgc3RkOjp1bmlxdWVfcHRyPEZpeGVkU3RhY2tQc2V1ZG9Tb3VyY2VWYWx1ZT4+IEZTVmFsdWVzOworICBTdHJpbmdNYXA8c3RkOjp1bmlxdWVfcHRyPGNvbnN0IEV4dGVybmFsU3ltYm9sUHNldWRvU291cmNlVmFsdWU+PgorICAgICAgRXh0ZXJuYWxDYWxsRW50cmllczsKKyAgVmFsdWVNYXA8Y29uc3QgR2xvYmFsVmFsdWUgKiwKKyAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGNvbnN0IEdsb2JhbFZhbHVlUHNldWRvU291cmNlVmFsdWU+PgorICAgICAgR2xvYmFsQ2FsbEVudHJpZXM7CisKK3B1YmxpYzoKKyAgUHNldWRvU291cmNlVmFsdWVNYW5hZ2VyKGNvbnN0IFRhcmdldEluc3RySW5mbyAmVElJKTsKKworICAvLy8gUmV0dXJuIGEgcHNldWRvIHNvdXJjZSB2YWx1ZSByZWZlcmVuY2luZyB0aGUgYXJlYSBiZWxvdyB0aGUgc3RhY2sgZnJhbWUgb2YKKyAgLy8vIGEgZnVuY3Rpb24sIGUuZy4sIHRoZSBhcmd1bWVudCBzcGFjZS4KKyAgY29uc3QgUHNldWRvU291cmNlVmFsdWUgKmdldFN0YWNrKCk7CisKKyAgLy8vIFJldHVybiBhIHBzZXVkbyBzb3VyY2UgdmFsdWUgcmVmZXJlbmNpbmcgdGhlIGdsb2JhbCBvZmZzZXQgdGFibGUKKyAgLy8vIChvciBzb21ldGhpbmcgdGhlIGxpa2UpLgorICBjb25zdCBQc2V1ZG9Tb3VyY2VWYWx1ZSAqZ2V0R09UKCk7CisKKyAgLy8vIFJldHVybiBhIHBzZXVkbyBzb3VyY2UgdmFsdWUgcmVmZXJlbmNpbmcgdGhlIGNvbnN0YW50IHBvb2wuIFNpbmNlIGNvbnN0YW50CisgIC8vLyBwb29scyBhcmUgY29uc3RhbnQsIHRoaXMgZG9lc24ndCBuZWVkIHRvIGlkZW50aWZ5IGEgc3BlY2lmaWMgY29uc3RhbnQKKyAgLy8vIHBvb2wgZW50cnkuCisgIGNvbnN0IFBzZXVkb1NvdXJjZVZhbHVlICpnZXRDb25zdGFudFBvb2woKTsKKworICAvLy8gUmV0dXJuIGEgcHNldWRvIHNvdXJjZSB2YWx1ZSByZWZlcmVuY2luZyBhIGp1bXAgdGFibGUuIFNpbmNlIGp1bXAgdGFibGVzCisgIC8vLyBhcmUgY29uc3RhbnQsIHRoaXMgZG9lc24ndCBuZWVkIHRvIGlkZW50aWZ5IGEgc3BlY2lmaWMganVtcCB0YWJsZS4KKyAgY29uc3QgUHNldWRvU291cmNlVmFsdWUgKmdldEp1bXBUYWJsZSgpOworCisgIC8vLyBSZXR1cm4gYSBwc2V1ZG8gc291cmNlIHZhbHVlIHJlZmVyZW5jaW5nIGEgZml4ZWQgc3RhY2sgZnJhbWUgZW50cnksCisgIC8vLyBlLmcuLCBhIHNwaWxsIHNsb3QuCisgIGNvbnN0IFBzZXVkb1NvdXJjZVZhbHVlICpnZXRGaXhlZFN0YWNrKGludCBGSSk7CisKKyAgY29uc3QgUHNldWRvU291cmNlVmFsdWUgKmdldEdsb2JhbFZhbHVlQ2FsbEVudHJ5KGNvbnN0IEdsb2JhbFZhbHVlICpHVik7CisKKyAgY29uc3QgUHNldWRvU291cmNlVmFsdWUgKmdldEV4dGVybmFsU3ltYm9sQ2FsbEVudHJ5KGNvbnN0IGNoYXIgKkVTKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1JlYWNoaW5nRGVmQW5hbHlzaXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWFjaGluZ0RlZkFuYWx5c2lzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjIxYjc0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWFjaGluZ0RlZkFuYWx5c2lzLmgKQEAgLTAsMCArMSwxMTggQEAKKy8vPT0tLS0gbGx2bS9Db2RlR2VuL1JlYWNoaW5nRGVmQW5hbHlzaXMuaCAtIFJlYWNoaW5nIERlZiBBbmFseXNpcyAtKi0gQysrIC0qLS0tPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZSBSZWFjaGluZyBEZWZzIEFuYWx5c2lzIHBhc3MuCisvLy8KKy8vLyBUaGlzIHBhc3MgdHJhY2tzIGZvciBlYWNoIGluc3RydWN0aW9uIHdoYXQgaXMgdGhlIJNjbG9zZXN0lCByZWFjaGluZyBkZWYgb2YKKy8vLyBhIGdpdmVuIHJlZ2lzdGVyLiBJdCBpcyB1c2VkIGJ5IEJyZWFrRmFsc2VEZXBzIChmb3IgY2xlYXJhbmNlIGNhbGN1bGF0aW9uKQorLy8vIGFuZCBFeGVjdXRpb25Eb21haW5GaXggKGZvciBhcmJpdHJhdGluZyBjb25mbGljdGluZyBkb21haW5zKS4KKy8vLworLy8vIE5vdGUgdGhhdCB0aGlzIGlzIGRpZmZlcmVudCBmcm9tIHRoZSB1c3VhbCBkZWZpbml0aW9uIG5vdGlvbiBvZiBsaXZlbmVzcy4KKy8vLyBUaGUgQ1BVIGRvZXNuJ3QgY2FyZSB3aGV0aGVyIG9yIG5vdCB3ZSBjb25zaWRlciBhIHJlZ2lzdGVyIGtpbGxlZC4KKy8vLworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1JFQUNISU5HREVGU0FOQUxZU0lTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1JFQUNISU5HREVGU0FOQUxZU0lTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTG9vcFRyYXZlcnNhbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb25QYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CitjbGFzcyBNYWNoaW5lSW5zdHI7CisKKy8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSByZWFjaGluZyBkZWYgYW5hbHlzaXMuCitjbGFzcyBSZWFjaGluZ0RlZkFuYWx5c2lzIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworcHJpdmF0ZToKKyAgTWFjaGluZUZ1bmN0aW9uICpNRjsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkk7CisgIHVuc2lnbmVkIE51bVJlZ1VuaXRzOworICAvLy8gSW5zdHJ1Y3Rpb24gdGhhdCBkZWZpbmVkIGVhY2ggcmVnaXN0ZXIsIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlCisgIC8vLyBjdXJyZW50IGJhc2ljIGJsb2NrLiAgV2hlbiBhIExpdmVSZWdzRGVmSW5mbyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhCisgIC8vLyBsaXZlLW91dCByZWdpc3RlciwgdGhpcyB2YWx1ZSBpcyByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBiYXNpYyBibG9jaywKKyAgLy8vIHNvIGl0IHdpbGwgYmUgYSBuZWdhdGl2ZSBudW1iZXIuCisgIHVzaW5nIExpdmVSZWdzRGVmSW5mbyA9IHN0ZDo6dmVjdG9yPGludD47CisgIExpdmVSZWdzRGVmSW5mbyBMaXZlUmVnczsKKworICAvLy8gS2VlcHMgY2xlYXJhbmNlIGluZm9ybWF0aW9uIGZvciBhbGwgcmVnaXN0ZXJzLiBOb3RlIHRoYXQgdGhpcworICAvLy8gaXMgZGlmZmVyZW50IGZyb20gdGhlIHVzdWFsIGRlZmluaXRpb24gbm90aW9uIG9mIGxpdmVuZXNzLiBUaGUgQ1BVCisgIC8vLyBkb2Vzbid0IGNhcmUgd2hldGhlciBvciBub3Qgd2UgY29uc2lkZXIgYSByZWdpc3RlciBraWxsZWQuCisgIHVzaW5nIE91dFJlZ3NJbmZvTWFwID0gU21hbGxWZWN0b3I8TGl2ZVJlZ3NEZWZJbmZvLCA0PjsKKyAgT3V0UmVnc0luZm9NYXAgTUJCT3V0UmVnc0luZm9zOworCisgIC8vLyBDdXJyZW50IGluc3RydWN0aW9uIG51bWJlci4KKyAgLy8vIFRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpbiBlYWNoIGJhc2ljIGJsb2NrIGlzIDAuCisgIGludCBDdXJJbnN0cjsKKworICAvLy8gTWFwcyBpbnN0cnVjdGlvbnMgdG8gdGhlaXIgaW5zdHJ1Y3Rpb24gSWRzLCByZWxhdGl2ZSB0byB0aGUgYmVnaW5pbmcgb2YKKyAgLy8vIHRoZWlyIGJhc2ljIGJsb2Nrcy4KKyAgRGVuc2VNYXA8TWFjaGluZUluc3RyICosIGludD4gSW5zdElkczsKKworICAvLy8gQWxsIHJlYWNoaW5nIGRlZnMgb2YgYSBnaXZlbiBSZWdVbml0IGZvciBhIGdpdmVuIE1CQi4KKyAgdXNpbmcgTUJCUmVnVW5pdERlZnMgPSBTbWFsbFZlY3RvcjxpbnQsIDE+OworICAvLy8gQWxsIHJlYWNoaW5nIGRlZnMgb2YgYWxsIHJlZyB1bml0cyBmb3IgYSBnaXZlbiBNQkIKKyAgdXNpbmcgTUJCRGVmc0luZm8gPSBzdGQ6OnZlY3RvcjxNQkJSZWdVbml0RGVmcz47CisgIC8vLyBBbGwgcmVhY2hpbmcgZGVmcyBvZiBhbGwgcmVnIHVuaXRzIGZvciBhIGFsbCBNQkJzCisgIHVzaW5nIE1CQlJlYWNoaW5nRGVmc0luZm8gPSBTbWFsbFZlY3RvcjxNQkJEZWZzSW5mbywgND47CisgIE1CQlJlYWNoaW5nRGVmc0luZm8gTUJCUmVhY2hpbmdEZWZzOworCisgIC8vLyBEZWZhdWx0IHZhbHVlcyBhcmUgJ25vdGhpbmcgaGFwcGVuZWQgYSBsb25nIHRpbWUgYWdvJy4KKyAgY29uc3QgaW50IFJlYWNoaW5nRGVmRGVmYXVsdFZhbCA9IC0oMSA8PCAyMCk7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKworICBSZWFjaGluZ0RlZkFuYWx5c2lzKCkgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSB7CisgICAgaW5pdGlhbGl6ZVJlYWNoaW5nRGVmQW5hbHlzaXNQYXNzKCpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpKTsKKyAgfQorICB2b2lkIHJlbGVhc2VNZW1vcnkoKSBvdmVycmlkZTsKKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgICBNYWNoaW5lRnVuY3Rpb25QYXNzOjpnZXRBbmFseXNpc1VzYWdlKEFVKTsKKyAgfQorCisgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRikgb3ZlcnJpZGU7CisKKyAgTWFjaGluZUZ1bmN0aW9uUHJvcGVydGllcyBnZXRSZXF1aXJlZFByb3BlcnRpZXMoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXMoKS5zZXQoCisgICAgICAgIE1hY2hpbmVGdW5jdGlvblByb3BlcnRpZXM6OlByb3BlcnR5OjpOb1ZSZWdzKTsKKyAgfQorCisgIC8vLyBQcm92aWRlcyB0aGUgaW5zdHJ1Y3Rpb24gaWQgb2YgdGhlIGNsb3Nlc3QgcmVhY2hpbmcgZGVmIGluc3RydWN0aW9uIG9mCisgIC8vLyBQaHlzUmVnIHRoYXQgcmVhY2hlcyBNSSwgcmVsYXRpdmUgdG8gdGhlIGJlZ2luaW5nIG9mIE1JJ3MgYmFzaWMgYmxvY2suCisgIGludCBnZXRSZWFjaGluZ0RlZihNYWNoaW5lSW5zdHIgKk1JLCBpbnQgUGh5c1JlZyk7CisKKyAgLy8vIFByb3ZpZGVzIHRoZSBjbGVhcmFuY2UgLSB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBzaW5jZSB0aGUgY2xvc2VzdAorICAvLy8gcmVhY2hpbmcgZGVmIGluc3R1Y3Rpb24gb2YgUGh5c1JlZyB0aGF0IHJlYWNoZXMgTUkuCisgIGludCBnZXRDbGVhcmFuY2UoTWFjaGluZUluc3RyICpNSSwgTUNQaHlzUmVnIFBoeXNSZWcpOworCitwcml2YXRlOgorICAvLy8gU2V0IHVwIExpdmVSZWdzIGJ5IG1lcmdpbmcgcHJlZGVjZXNzb3IgbGl2ZS1vdXQgdmFsdWVzLgorICB2b2lkIGVudGVyQmFzaWNCbG9jayhjb25zdCBMb29wVHJhdmVyc2FsOjpUcmF2ZXJzZWRNQkJJbmZvICZUcmF2ZXJzZWRNQkIpOworCisgIC8vLyBVcGRhdGUgbGl2ZS1vdXQgdmFsdWVzLgorICB2b2lkIGxlYXZlQmFzaWNCbG9jayhjb25zdCBMb29wVHJhdmVyc2FsOjpUcmF2ZXJzZWRNQkJJbmZvICZUcmF2ZXJzZWRNQkIpOworCisgIC8vLyBQcm9jZXNzIGhlIGdpdmVuIGJhc2ljIGJsb2NrLgorICB2b2lkIHByb2Nlc3NCYXNpY0Jsb2NrKGNvbnN0IExvb3BUcmF2ZXJzYWw6OlRyYXZlcnNlZE1CQkluZm8gJlRyYXZlcnNlZE1CQik7CisKKyAgLy8vIFVwZGF0ZSBkZWYtYWdlcyBmb3IgcmVnaXN0ZXJzIGRlZmluZWQgYnkgTUkuCisgIC8vLyBBbHNvIGJyZWFrIGRlcGVuZGVuY2llcyBvbiBwYXJ0aWFsIGRlZnMgYW5kIHVuZGVmIHVzZXMuCisgIHZvaWQgcHJvY2Vzc0RlZnMoTWFjaGluZUluc3RyICopOworfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1JFQUNISU5HREVGU0FOQUxZU0lTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWdBbGxvY1BCUVAuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWdBbGxvY1BCUVAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjM0Mjg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1JlZ0FsbG9jUEJRUC5oCkBAIC0wLDAgKzEsNTM2IEBACisvLz09PS0gUmVnQWxsb2NQQlFQLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBQQlFQQnVpbGRlciBpbnRlcmZhY2UsIGZvciBjbGFzc2VzIHdoaWNoIGJ1aWxkIFBCUVAKKy8vIGluc3RhbmNlcyB0byByZXByZXNlbnQgcmVnaXN0ZXIgYWxsb2NhdGlvbiBwcm9ibGVtcywgYW5kIHRoZSBSZWdBbGxvY1BCUVAKKy8vIGludGVyZmFjZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9SRUdBTExPQ1BCUVBfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fUkVHQUxMT0NQQlFQX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvSGFzaGluZy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9QQlFQL0Nvc3RBbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUEJRUC9HcmFwaC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9QQlFQL01hdGguaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUEJRUC9SZWR1Y3Rpb25SdWxlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9QQlFQL1NvbHV0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvblBhc3M7CitjbGFzcyBMaXZlSW50ZXJ2YWxzOworY2xhc3MgTWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mbzsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIHJhd19vc3RyZWFtOworCituYW1lc3BhY2UgUEJRUCB7CituYW1lc3BhY2UgUmVnQWxsb2MgeworCisvLy8gQGJyaWVmIFNwaWxsIG9wdGlvbiBpbmRleC4KK2lubGluZSB1bnNpZ25lZCBnZXRTcGlsbE9wdGlvbklkeCgpIHsgcmV0dXJuIDA7IH0KKworLy8vIFxicmllZiBNZXRhZGF0YSB0byBzcGVlZCBhbGxvY2F0YWJpbGl0eSB0ZXN0LgorLy8vCisvLy8gS2VlcHMgdHJhY2sgb2YgdGhlIG51bWJlciBvZiBpbmZpbml0aWVzIGluIGVhY2ggcm93IGFuZCBjb2x1bW4uCitjbGFzcyBNYXRyaXhNZXRhZGF0YSB7CitwdWJsaWM6CisgIE1hdHJpeE1ldGFkYXRhKGNvbnN0IE1hdHJpeCYgTSkKKyAgICA6IFVuc2FmZVJvd3MobmV3IGJvb2xbTS5nZXRSb3dzKCkgLSAxXSgpKSwKKyAgICAgIFVuc2FmZUNvbHMobmV3IGJvb2xbTS5nZXRDb2xzKCkgLSAxXSgpKSB7CisgICAgdW5zaWduZWQqIENvbENvdW50cyA9IG5ldyB1bnNpZ25lZFtNLmdldENvbHMoKSAtIDFdKCk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAxOyBpIDwgTS5nZXRSb3dzKCk7ICsraSkgeworICAgICAgdW5zaWduZWQgUm93Q291bnQgPSAwOworICAgICAgZm9yICh1bnNpZ25lZCBqID0gMTsgaiA8IE0uZ2V0Q29scygpOyArK2opIHsKKyAgICAgICAgaWYgKE1baV1bal0gPT0gc3RkOjpudW1lcmljX2xpbWl0czxQQlFQTnVtPjo6aW5maW5pdHkoKSkgeworICAgICAgICAgICsrUm93Q291bnQ7CisgICAgICAgICAgKytDb2xDb3VudHNbaiAtIDFdOworICAgICAgICAgIFVuc2FmZVJvd3NbaSAtIDFdID0gdHJ1ZTsKKyAgICAgICAgICBVbnNhZmVDb2xzW2ogLSAxXSA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIFdvcnN0Um93ID0gc3RkOjptYXgoV29yc3RSb3csIFJvd0NvdW50KTsKKyAgICB9CisgICAgdW5zaWduZWQgV29yc3RDb2xDb3VudEZvckN1clJvdyA9CisgICAgICAqc3RkOjptYXhfZWxlbWVudChDb2xDb3VudHMsIENvbENvdW50cyArIE0uZ2V0Q29scygpIC0gMSk7CisgICAgV29yc3RDb2wgPSBzdGQ6Om1heChXb3JzdENvbCwgV29yc3RDb2xDb3VudEZvckN1clJvdyk7CisgICAgZGVsZXRlW10gQ29sQ291bnRzOworICB9CisKKyAgTWF0cml4TWV0YWRhdGEoY29uc3QgTWF0cml4TWV0YWRhdGEgJikgPSBkZWxldGU7CisgIE1hdHJpeE1ldGFkYXRhICZvcGVyYXRvcj0oY29uc3QgTWF0cml4TWV0YWRhdGEgJikgPSBkZWxldGU7CisKKyAgdW5zaWduZWQgZ2V0V29yc3RSb3coKSBjb25zdCB7IHJldHVybiBXb3JzdFJvdzsgfQorICB1bnNpZ25lZCBnZXRXb3JzdENvbCgpIGNvbnN0IHsgcmV0dXJuIFdvcnN0Q29sOyB9CisgIGNvbnN0IGJvb2wqIGdldFVuc2FmZVJvd3MoKSBjb25zdCB7IHJldHVybiBVbnNhZmVSb3dzLmdldCgpOyB9CisgIGNvbnN0IGJvb2wqIGdldFVuc2FmZUNvbHMoKSBjb25zdCB7IHJldHVybiBVbnNhZmVDb2xzLmdldCgpOyB9CisKK3ByaXZhdGU6CisgIHVuc2lnbmVkIFdvcnN0Um93ID0gMDsKKyAgdW5zaWduZWQgV29yc3RDb2wgPSAwOworICBzdGQ6OnVuaXF1ZV9wdHI8Ym9vbFtdPiBVbnNhZmVSb3dzOworICBzdGQ6OnVuaXF1ZV9wdHI8Ym9vbFtdPiBVbnNhZmVDb2xzOworfTsKKworLy8vIFxicmllZiBIb2xkcyBhIHZlY3RvciBvZiB0aGUgYWxsb3dlZCBwaHlzaWNhbCByZWdzIGZvciBhIHZyZWcuCitjbGFzcyBBbGxvd2VkUmVnVmVjdG9yIHsKKyAgZnJpZW5kIGhhc2hfY29kZSBoYXNoX3ZhbHVlKGNvbnN0IEFsbG93ZWRSZWdWZWN0b3IgJik7CisKK3B1YmxpYzoKKyAgQWxsb3dlZFJlZ1ZlY3RvcigpID0gZGVmYXVsdDsKKyAgQWxsb3dlZFJlZ1ZlY3RvcihBbGxvd2VkUmVnVmVjdG9yICYmKSA9IGRlZmF1bHQ7CisKKyAgQWxsb3dlZFJlZ1ZlY3Rvcihjb25zdCBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJk9wdFZlYykKKyAgICA6IE51bU9wdHMoT3B0VmVjLnNpemUoKSksIE9wdHMobmV3IHVuc2lnbmVkW051bU9wdHNdKSB7CisgICAgc3RkOjpjb3B5KE9wdFZlYy5iZWdpbigpLCBPcHRWZWMuZW5kKCksIE9wdHMuZ2V0KCkpOworICB9CisKKyAgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIE51bU9wdHM7IH0KKyAgdW5zaWduZWQgb3BlcmF0b3JbXShzaXplX3QgSSkgY29uc3QgeyByZXR1cm4gT3B0c1tJXTsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBbGxvd2VkUmVnVmVjdG9yICZPdGhlcikgY29uc3QgeworICAgIGlmIChOdW1PcHRzICE9IE90aGVyLk51bU9wdHMpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHN0ZDo6ZXF1YWwoT3B0cy5nZXQoKSwgT3B0cy5nZXQoKSArIE51bU9wdHMsIE90aGVyLk9wdHMuZ2V0KCkpOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFsbG93ZWRSZWdWZWN0b3IgJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gT3RoZXIpOworICB9CisKK3ByaXZhdGU6CisgIHVuc2lnbmVkIE51bU9wdHMgPSAwOworICBzdGQ6OnVuaXF1ZV9wdHI8dW5zaWduZWRbXT4gT3B0czsKK307CisKK2lubGluZSBoYXNoX2NvZGUgaGFzaF92YWx1ZShjb25zdCBBbGxvd2VkUmVnVmVjdG9yICZPcHRSZWdzKSB7CisgIHVuc2lnbmVkICpPU3RhcnQgPSBPcHRSZWdzLk9wdHMuZ2V0KCk7CisgIHVuc2lnbmVkICpPRW5kID0gT3B0UmVncy5PcHRzLmdldCgpICsgT3B0UmVncy5OdW1PcHRzOworICByZXR1cm4gaGFzaF9jb21iaW5lKE9wdFJlZ3MuTnVtT3B0cywKKyAgICAgICAgICAgICAgICAgICAgICBoYXNoX2NvbWJpbmVfcmFuZ2UoT1N0YXJ0LCBPRW5kKSk7Cit9CisKKy8vLyBcYnJpZWYgSG9sZHMgZ3JhcGgtbGV2ZWwgbWV0YWRhdGEgcmVsZXZhbnQgdG8gUEJRUCBSQSBwcm9ibGVtcy4KK2NsYXNzIEdyYXBoTWV0YWRhdGEgeworcHJpdmF0ZToKKyAgdXNpbmcgQWxsb3dlZFJlZ1ZlY1Bvb2wgPSBWYWx1ZVBvb2w8QWxsb3dlZFJlZ1ZlY3Rvcj47CisKK3B1YmxpYzoKKyAgdXNpbmcgQWxsb3dlZFJlZ1ZlY1JlZiA9IEFsbG93ZWRSZWdWZWNQb29sOjpQb29sUmVmOworCisgIEdyYXBoTWV0YWRhdGEoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICBMaXZlSW50ZXJ2YWxzICZMSVMsCisgICAgICAgICAgICAgICAgTWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mbyAmTUJGSSkKKyAgICA6IE1GKE1GKSwgTElTKExJUyksIE1CRkkoTUJGSSkge30KKworICBNYWNoaW5lRnVuY3Rpb24gJk1GOworICBMaXZlSW50ZXJ2YWxzICZMSVM7CisgIE1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm8gJk1CRkk7CisKKyAgdm9pZCBzZXROb2RlSWRGb3JWUmVnKHVuc2lnbmVkIFZSZWcsIEdyYXBoQmFzZTo6Tm9kZUlkIE5JZCkgeworICAgIFZSZWdUb05vZGVJZFtWUmVnXSA9IE5JZDsKKyAgfQorCisgIEdyYXBoQmFzZTo6Tm9kZUlkIGdldE5vZGVJZEZvclZSZWcodW5zaWduZWQgVlJlZykgY29uc3QgeworICAgIGF1dG8gVlJlZ0l0ciA9IFZSZWdUb05vZGVJZC5maW5kKFZSZWcpOworICAgIGlmIChWUmVnSXRyID09IFZSZWdUb05vZGVJZC5lbmQoKSkKKyAgICAgIHJldHVybiBHcmFwaEJhc2U6OmludmFsaWROb2RlSWQoKTsKKyAgICByZXR1cm4gVlJlZ0l0ci0+c2Vjb25kOworICB9CisKKyAgQWxsb3dlZFJlZ1ZlY1JlZiBnZXRBbGxvd2VkUmVncyhBbGxvd2VkUmVnVmVjdG9yIEFsbG93ZWQpIHsKKyAgICByZXR1cm4gQWxsb3dlZFJlZ1ZlY3MuZ2V0VmFsdWUoc3RkOjptb3ZlKEFsbG93ZWQpKTsKKyAgfQorCitwcml2YXRlOgorICBEZW5zZU1hcDx1bnNpZ25lZCwgR3JhcGhCYXNlOjpOb2RlSWQ+IFZSZWdUb05vZGVJZDsKKyAgQWxsb3dlZFJlZ1ZlY1Bvb2wgQWxsb3dlZFJlZ1ZlY3M7Cit9OworCisvLy8gXGJyaWVmIEhvbGRzIHNvbHZlciBzdGF0ZSBhbmQgb3RoZXIgbWV0YWRhdGEgcmVsZXZhbnQgdG8gZWFjaCBQQlFQIFJBIG5vZGUuCitjbGFzcyBOb2RlTWV0YWRhdGEgeworcHVibGljOgorICB1c2luZyBBbGxvd2VkUmVnVmVjdG9yID0gUmVnQWxsb2M6OkFsbG93ZWRSZWdWZWN0b3I7CisKKyAgLy8gVGhlIG5vZGUncyByZWR1Y3Rpb24gc3RhdGUuIFRoZSBvcmRlciBpbiB0aGlzIGVudW0gaXMgaW1wb3J0YW50LAorICAvLyBhcyBpdCBpcyBhc3N1bWVkIG5vZGVzIGNhbiBvbmx5IHByb2dyZXNzIHVwIChpLmUuIHRvd2FyZHMgYmVpbmcKKyAgLy8gb3B0aW1hbGx5IHJlZHVjaWJsZSkgd2hlbiByZWR1Y2luZyB0aGUgZ3JhcGguCisgIHVzaW5nIFJlZHVjdGlvblN0YXRlID0gZW51bSB7CisgICAgVW5wcm9jZXNzZWQsCisgICAgTm90UHJvdmFibHlBbGxvY2F0YWJsZSwKKyAgICBDb25zZXJ2YXRpdmVseUFsbG9jYXRhYmxlLAorICAgIE9wdGltYWxseVJlZHVjaWJsZQorICB9OworCisgIE5vZGVNZXRhZGF0YSgpID0gZGVmYXVsdDsKKworICBOb2RlTWV0YWRhdGEoY29uc3QgTm9kZU1ldGFkYXRhICZPdGhlcikKKyAgICA6IFJTKE90aGVyLlJTKSwgTnVtT3B0cyhPdGhlci5OdW1PcHRzKSwgRGVuaWVkT3B0cyhPdGhlci5EZW5pZWRPcHRzKSwKKyAgICAgIE9wdFVuc2FmZUVkZ2VzKG5ldyB1bnNpZ25lZFtOdW1PcHRzXSksIFZSZWcoT3RoZXIuVlJlZyksCisgICAgICBBbGxvd2VkUmVncyhPdGhlci5BbGxvd2VkUmVncykKKyNpZm5kZWYgTkRFQlVHCisgICAgICAsIGV2ZXJDb25zZXJ2YXRpdmVseUFsbG9jYXRhYmxlKE90aGVyLmV2ZXJDb25zZXJ2YXRpdmVseUFsbG9jYXRhYmxlKQorI2VuZGlmCisgIHsKKyAgICBpZiAoTnVtT3B0cyA+IDApIHsKKyAgICAgIHN0ZDo6Y29weSgmT3RoZXIuT3B0VW5zYWZlRWRnZXNbMF0sICZPdGhlci5PcHRVbnNhZmVFZGdlc1tOdW1PcHRzXSwKKyAgICAgICAgICAgICAgICAmT3B0VW5zYWZlRWRnZXNbMF0pOworICAgIH0KKyAgfQorCisgIE5vZGVNZXRhZGF0YShOb2RlTWV0YWRhdGEgJiYpID0gZGVmYXVsdDsKKyAgTm9kZU1ldGFkYXRhJiBvcGVyYXRvcj0oTm9kZU1ldGFkYXRhICYmKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBzZXRWUmVnKHVuc2lnbmVkIFZSZWcpIHsgdGhpcy0+VlJlZyA9IFZSZWc7IH0KKyAgdW5zaWduZWQgZ2V0VlJlZygpIGNvbnN0IHsgcmV0dXJuIFZSZWc7IH0KKworICB2b2lkIHNldEFsbG93ZWRSZWdzKEdyYXBoTWV0YWRhdGE6OkFsbG93ZWRSZWdWZWNSZWYgQWxsb3dlZFJlZ3MpIHsKKyAgICB0aGlzLT5BbGxvd2VkUmVncyA9IHN0ZDo6bW92ZShBbGxvd2VkUmVncyk7CisgIH0KKyAgY29uc3QgQWxsb3dlZFJlZ1ZlY3RvciYgZ2V0QWxsb3dlZFJlZ3MoKSBjb25zdCB7IHJldHVybiAqQWxsb3dlZFJlZ3M7IH0KKworICB2b2lkIHNldHVwKGNvbnN0IFZlY3RvciYgQ29zdHMpIHsKKyAgICBOdW1PcHRzID0gQ29zdHMuZ2V0TGVuZ3RoKCkgLSAxOworICAgIE9wdFVuc2FmZUVkZ2VzID0gc3RkOjp1bmlxdWVfcHRyPHVuc2lnbmVkW10+KG5ldyB1bnNpZ25lZFtOdW1PcHRzXSgpKTsKKyAgfQorCisgIFJlZHVjdGlvblN0YXRlIGdldFJlZHVjdGlvblN0YXRlKCkgY29uc3QgeyByZXR1cm4gUlM7IH0KKyAgdm9pZCBzZXRSZWR1Y3Rpb25TdGF0ZShSZWR1Y3Rpb25TdGF0ZSBSUykgeworICAgIGFzc2VydChSUyA+PSB0aGlzLT5SUyAmJiAiQSBub2RlJ3MgcmVkdWN0aW9uIHN0YXRlIGNhbiBub3QgYmUgZG93bmdyYWRlZCIpOworICAgIHRoaXMtPlJTID0gUlM7CisKKyNpZm5kZWYgTkRFQlVHCisgICAgLy8gUmVtZW1iZXIgdGhpcyBzdGF0ZSB0byBhc3NlcnQgbGF0ZXIgdGhhdCBhIG5vbi1pbmZpbml0ZSByZWdpc3RlcgorICAgIC8vIG9wdGlvbiB3YXMgYXZhaWxhYmxlLgorICAgIGlmIChSUyA9PSBDb25zZXJ2YXRpdmVseUFsbG9jYXRhYmxlKQorICAgICAgZXZlckNvbnNlcnZhdGl2ZWx5QWxsb2NhdGFibGUgPSB0cnVlOworI2VuZGlmCisgIH0KKworICB2b2lkIGhhbmRsZUFkZEVkZ2UoY29uc3QgTWF0cml4TWV0YWRhdGEmIE1ELCBib29sIFRyYW5zcG9zZSkgeworICAgIERlbmllZE9wdHMgKz0gVHJhbnNwb3NlID8gTUQuZ2V0V29yc3RSb3coKSA6IE1ELmdldFdvcnN0Q29sKCk7CisgICAgY29uc3QgYm9vbCogVW5zYWZlT3B0cyA9CisgICAgICBUcmFuc3Bvc2UgPyBNRC5nZXRVbnNhZmVDb2xzKCkgOiBNRC5nZXRVbnNhZmVSb3dzKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bU9wdHM7ICsraSkKKyAgICAgIE9wdFVuc2FmZUVkZ2VzW2ldICs9IFVuc2FmZU9wdHNbaV07CisgIH0KKworICB2b2lkIGhhbmRsZVJlbW92ZUVkZ2UoY29uc3QgTWF0cml4TWV0YWRhdGEmIE1ELCBib29sIFRyYW5zcG9zZSkgeworICAgIERlbmllZE9wdHMgLT0gVHJhbnNwb3NlID8gTUQuZ2V0V29yc3RSb3coKSA6IE1ELmdldFdvcnN0Q29sKCk7CisgICAgY29uc3QgYm9vbCogVW5zYWZlT3B0cyA9CisgICAgICBUcmFuc3Bvc2UgPyBNRC5nZXRVbnNhZmVDb2xzKCkgOiBNRC5nZXRVbnNhZmVSb3dzKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IE51bU9wdHM7ICsraSkKKyAgICAgIE9wdFVuc2FmZUVkZ2VzW2ldIC09IFVuc2FmZU9wdHNbaV07CisgIH0KKworICBib29sIGlzQ29uc2VydmF0aXZlbHlBbGxvY2F0YWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKERlbmllZE9wdHMgPCBOdW1PcHRzKSB8fAorICAgICAgKHN0ZDo6ZmluZCgmT3B0VW5zYWZlRWRnZXNbMF0sICZPcHRVbnNhZmVFZGdlc1tOdW1PcHRzXSwgMCkgIT0KKyAgICAgICAmT3B0VW5zYWZlRWRnZXNbTnVtT3B0c10pOworICB9CisKKyNpZm5kZWYgTkRFQlVHCisgIGJvb2wgd2FzQ29uc2VydmF0aXZlbHlBbGxvY2F0YWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZXZlckNvbnNlcnZhdGl2ZWx5QWxsb2NhdGFibGU7CisgIH0KKyNlbmRpZgorCitwcml2YXRlOgorICBSZWR1Y3Rpb25TdGF0ZSBSUyA9IFVucHJvY2Vzc2VkOworICB1bnNpZ25lZCBOdW1PcHRzID0gMDsKKyAgdW5zaWduZWQgRGVuaWVkT3B0cyA9IDA7CisgIHN0ZDo6dW5pcXVlX3B0cjx1bnNpZ25lZFtdPiBPcHRVbnNhZmVFZGdlczsKKyAgdW5zaWduZWQgVlJlZyA9IDA7CisgIEdyYXBoTWV0YWRhdGE6OkFsbG93ZWRSZWdWZWNSZWYgQWxsb3dlZFJlZ3M7CisKKyNpZm5kZWYgTkRFQlVHCisgIGJvb2wgZXZlckNvbnNlcnZhdGl2ZWx5QWxsb2NhdGFibGUgPSBmYWxzZTsKKyNlbmRpZgorfTsKKworY2xhc3MgUmVnQWxsb2NTb2x2ZXJJbXBsIHsKK3ByaXZhdGU6CisgIHVzaW5nIFJBTWF0cml4ID0gTURNYXRyaXg8TWF0cml4TWV0YWRhdGE+OworCitwdWJsaWM6CisgIHVzaW5nIFJhd1ZlY3RvciA9IFBCUVA6OlZlY3RvcjsKKyAgdXNpbmcgUmF3TWF0cml4ID0gUEJRUDo6TWF0cml4OworICB1c2luZyBWZWN0b3IgPSBQQlFQOjpWZWN0b3I7CisgIHVzaW5nIE1hdHJpeCA9IFJBTWF0cml4OworICB1c2luZyBDb3N0QWxsb2NhdG9yID0gUEJRUDo6UG9vbENvc3RBbGxvY2F0b3I8VmVjdG9yLCBNYXRyaXg+OworCisgIHVzaW5nIE5vZGVJZCA9IEdyYXBoQmFzZTo6Tm9kZUlkOworICB1c2luZyBFZGdlSWQgPSBHcmFwaEJhc2U6OkVkZ2VJZDsKKworICB1c2luZyBOb2RlTWV0YWRhdGEgPSBSZWdBbGxvYzo6Tm9kZU1ldGFkYXRhOworICBzdHJ1Y3QgRWRnZU1ldGFkYXRhIHt9OworICB1c2luZyBHcmFwaE1ldGFkYXRhID0gUmVnQWxsb2M6OkdyYXBoTWV0YWRhdGE7CisKKyAgdXNpbmcgR3JhcGggPSBQQlFQOjpHcmFwaDxSZWdBbGxvY1NvbHZlckltcGw+OworCisgIFJlZ0FsbG9jU29sdmVySW1wbChHcmFwaCAmRykgOiBHKEcpIHt9CisKKyAgU29sdXRpb24gc29sdmUoKSB7CisgICAgRy5zZXRTb2x2ZXIoKnRoaXMpOworICAgIFNvbHV0aW9uIFM7CisgICAgc2V0dXAoKTsKKyAgICBTID0gYmFja3Byb3BhZ2F0ZShHLCByZWR1Y2UoKSk7CisgICAgRy51bnNldFNvbHZlcigpOworICAgIHJldHVybiBTOworICB9CisKKyAgdm9pZCBoYW5kbGVBZGROb2RlKE5vZGVJZCBOSWQpIHsKKyAgICBhc3NlcnQoRy5nZXROb2RlQ29zdHMoTklkKS5nZXRMZW5ndGgoKSA+IDEgJiYKKyAgICAgICAgICAgIlBCUVAgR3JhcGggc2hvdWxkIG5vdCBjb250YWluIHNpbmdsZSBvciB6ZXJvLW9wdGlvbiBub2RlcyIpOworICAgIEcuZ2V0Tm9kZU1ldGFkYXRhKE5JZCkuc2V0dXAoRy5nZXROb2RlQ29zdHMoTklkKSk7CisgIH0KKworICB2b2lkIGhhbmRsZVJlbW92ZU5vZGUoTm9kZUlkIE5JZCkge30KKyAgdm9pZCBoYW5kbGVTZXROb2RlQ29zdHMoTm9kZUlkIE5JZCwgY29uc3QgVmVjdG9yJiBuZXdDb3N0cykge30KKworICB2b2lkIGhhbmRsZUFkZEVkZ2UoRWRnZUlkIEVJZCkgeworICAgIGhhbmRsZVJlY29ubmVjdEVkZ2UoRUlkLCBHLmdldEVkZ2VOb2RlMUlkKEVJZCkpOworICAgIGhhbmRsZVJlY29ubmVjdEVkZ2UoRUlkLCBHLmdldEVkZ2VOb2RlMklkKEVJZCkpOworICB9CisKKyAgdm9pZCBoYW5kbGVEaXNjb25uZWN0RWRnZShFZGdlSWQgRUlkLCBOb2RlSWQgTklkKSB7CisgICAgTm9kZU1ldGFkYXRhJiBOTWQgPSBHLmdldE5vZGVNZXRhZGF0YShOSWQpOworICAgIGNvbnN0IE1hdHJpeE1ldGFkYXRhJiBNTWQgPSBHLmdldEVkZ2VDb3N0cyhFSWQpLmdldE1ldGFkYXRhKCk7CisgICAgTk1kLmhhbmRsZVJlbW92ZUVkZ2UoTU1kLCBOSWQgPT0gRy5nZXRFZGdlTm9kZTJJZChFSWQpKTsKKyAgICBwcm9tb3RlKE5JZCwgTk1kKTsKKyAgfQorCisgIHZvaWQgaGFuZGxlUmVjb25uZWN0RWRnZShFZGdlSWQgRUlkLCBOb2RlSWQgTklkKSB7CisgICAgTm9kZU1ldGFkYXRhJiBOTWQgPSBHLmdldE5vZGVNZXRhZGF0YShOSWQpOworICAgIGNvbnN0IE1hdHJpeE1ldGFkYXRhJiBNTWQgPSBHLmdldEVkZ2VDb3N0cyhFSWQpLmdldE1ldGFkYXRhKCk7CisgICAgTk1kLmhhbmRsZUFkZEVkZ2UoTU1kLCBOSWQgPT0gRy5nZXRFZGdlTm9kZTJJZChFSWQpKTsKKyAgfQorCisgIHZvaWQgaGFuZGxlVXBkYXRlQ29zdHMoRWRnZUlkIEVJZCwgY29uc3QgTWF0cml4JiBOZXdDb3N0cykgeworICAgIE5vZGVJZCBOMUlkID0gRy5nZXRFZGdlTm9kZTFJZChFSWQpOworICAgIE5vZGVJZCBOMklkID0gRy5nZXRFZGdlTm9kZTJJZChFSWQpOworICAgIE5vZGVNZXRhZGF0YSYgTjFNZCA9IEcuZ2V0Tm9kZU1ldGFkYXRhKE4xSWQpOworICAgIE5vZGVNZXRhZGF0YSYgTjJNZCA9IEcuZ2V0Tm9kZU1ldGFkYXRhKE4ySWQpOworICAgIGJvb2wgVHJhbnNwb3NlID0gTjFJZCAhPSBHLmdldEVkZ2VOb2RlMUlkKEVJZCk7CisKKyAgICAvLyBNZXRhZGF0YSBhcmUgY29tcHV0ZWQgaW5jcmVtZW50YWxseS4gRmlyc3QsIHVwZGF0ZSB0aGVtCisgICAgLy8gYnkgcmVtb3ZpbmcgdGhlIG9sZCBjb3N0LgorICAgIGNvbnN0IE1hdHJpeE1ldGFkYXRhJiBPbGRNTWQgPSBHLmdldEVkZ2VDb3N0cyhFSWQpLmdldE1ldGFkYXRhKCk7CisgICAgTjFNZC5oYW5kbGVSZW1vdmVFZGdlKE9sZE1NZCwgVHJhbnNwb3NlKTsKKyAgICBOMk1kLmhhbmRsZVJlbW92ZUVkZ2UoT2xkTU1kLCAhVHJhbnNwb3NlKTsKKworICAgIC8vIEFuZCB1cGRhdGUgbm93IHRoZSBtZXRhZGF0YSB3aXRoIHRoZSBuZXcgY29zdC4KKyAgICBjb25zdCBNYXRyaXhNZXRhZGF0YSYgTU1kID0gTmV3Q29zdHMuZ2V0TWV0YWRhdGEoKTsKKyAgICBOMU1kLmhhbmRsZUFkZEVkZ2UoTU1kLCBUcmFuc3Bvc2UpOworICAgIE4yTWQuaGFuZGxlQWRkRWRnZShNTWQsICFUcmFuc3Bvc2UpOworCisgICAgLy8gQXMgdGhlIG1ldGFkYXRhIG1heSBoYXZlIGNoYW5nZWQgd2l0aCB0aGUgdXBkYXRlLCB0aGUgbm9kZXMgbWF5IGhhdmUKKyAgICAvLyBiZWNvbWUgQ29uc2VydmF0aXZlbHlBbGxvY2F0YWJsZSBvciBPcHRpbWFsbHlSZWR1Y2libGUuCisgICAgcHJvbW90ZShOMUlkLCBOMU1kKTsKKyAgICBwcm9tb3RlKE4ySWQsIE4yTWQpOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgcHJvbW90ZShOb2RlSWQgTklkLCBOb2RlTWV0YWRhdGEmIE5NZCkgeworICAgIGlmIChHLmdldE5vZGVEZWdyZWUoTklkKSA9PSAzKSB7CisgICAgICAvLyBUaGlzIG5vZGUgaXMgYmVjb21pbmcgb3B0aW1hbGx5IHJlZHVjaWJsZS4KKyAgICAgIG1vdmVUb09wdGltYWxseVJlZHVjaWJsZU5vZGVzKE5JZCk7CisgICAgfSBlbHNlIGlmIChOTWQuZ2V0UmVkdWN0aW9uU3RhdGUoKSA9PQorICAgICAgICAgICAgICAgTm9kZU1ldGFkYXRhOjpOb3RQcm92YWJseUFsbG9jYXRhYmxlICYmCisgICAgICAgICAgICAgICBOTWQuaXNDb25zZXJ2YXRpdmVseUFsbG9jYXRhYmxlKCkpIHsKKyAgICAgIC8vIFRoaXMgbm9kZSBqdXN0IGJlY2FtZSBjb25zZXJ2YXRpdmVseSBhbGxvY2F0YWJsZS4KKyAgICAgIG1vdmVUb0NvbnNlcnZhdGl2ZWx5QWxsb2NhdGFibGVOb2RlcyhOSWQpOworICAgIH0KKyAgfQorCisgIHZvaWQgcmVtb3ZlRnJvbUN1cnJlbnRTZXQoTm9kZUlkIE5JZCkgeworICAgIHN3aXRjaCAoRy5nZXROb2RlTWV0YWRhdGEoTklkKS5nZXRSZWR1Y3Rpb25TdGF0ZSgpKSB7CisgICAgY2FzZSBOb2RlTWV0YWRhdGE6OlVucHJvY2Vzc2VkOiBicmVhazsKKyAgICBjYXNlIE5vZGVNZXRhZGF0YTo6T3B0aW1hbGx5UmVkdWNpYmxlOgorICAgICAgYXNzZXJ0KE9wdGltYWxseVJlZHVjaWJsZU5vZGVzLmZpbmQoTklkKSAhPQorICAgICAgICAgICAgIE9wdGltYWxseVJlZHVjaWJsZU5vZGVzLmVuZCgpICYmCisgICAgICAgICAgICAgIk5vZGUgbm90IGluIG9wdGltYWxseSByZWR1Y2libGUgc2V0LiIpOworICAgICAgT3B0aW1hbGx5UmVkdWNpYmxlTm9kZXMuZXJhc2UoTklkKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgTm9kZU1ldGFkYXRhOjpDb25zZXJ2YXRpdmVseUFsbG9jYXRhYmxlOgorICAgICAgYXNzZXJ0KENvbnNlcnZhdGl2ZWx5QWxsb2NhdGFibGVOb2Rlcy5maW5kKE5JZCkgIT0KKyAgICAgICAgICAgICBDb25zZXJ2YXRpdmVseUFsbG9jYXRhYmxlTm9kZXMuZW5kKCkgJiYKKyAgICAgICAgICAgICAiTm9kZSBub3QgaW4gY29uc2VydmF0aXZlbHkgYWxsb2NhdGFibGUgc2V0LiIpOworICAgICAgQ29uc2VydmF0aXZlbHlBbGxvY2F0YWJsZU5vZGVzLmVyYXNlKE5JZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIE5vZGVNZXRhZGF0YTo6Tm90UHJvdmFibHlBbGxvY2F0YWJsZToKKyAgICAgIGFzc2VydChOb3RQcm92YWJseUFsbG9jYXRhYmxlTm9kZXMuZmluZChOSWQpICE9CisgICAgICAgICAgICAgTm90UHJvdmFibHlBbGxvY2F0YWJsZU5vZGVzLmVuZCgpICYmCisgICAgICAgICAgICAgIk5vZGUgbm90IGluIG5vdC1wcm92YWJseS1hbGxvY2F0YWJsZSBzZXQuIik7CisgICAgICBOb3RQcm92YWJseUFsbG9jYXRhYmxlTm9kZXMuZXJhc2UoTklkKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIHZvaWQgbW92ZVRvT3B0aW1hbGx5UmVkdWNpYmxlTm9kZXMoTm9kZUlkIE5JZCkgeworICAgIHJlbW92ZUZyb21DdXJyZW50U2V0KE5JZCk7CisgICAgT3B0aW1hbGx5UmVkdWNpYmxlTm9kZXMuaW5zZXJ0KE5JZCk7CisgICAgRy5nZXROb2RlTWV0YWRhdGEoTklkKS5zZXRSZWR1Y3Rpb25TdGF0ZSgKKyAgICAgIE5vZGVNZXRhZGF0YTo6T3B0aW1hbGx5UmVkdWNpYmxlKTsKKyAgfQorCisgIHZvaWQgbW92ZVRvQ29uc2VydmF0aXZlbHlBbGxvY2F0YWJsZU5vZGVzKE5vZGVJZCBOSWQpIHsKKyAgICByZW1vdmVGcm9tQ3VycmVudFNldChOSWQpOworICAgIENvbnNlcnZhdGl2ZWx5QWxsb2NhdGFibGVOb2Rlcy5pbnNlcnQoTklkKTsKKyAgICBHLmdldE5vZGVNZXRhZGF0YShOSWQpLnNldFJlZHVjdGlvblN0YXRlKAorICAgICAgTm9kZU1ldGFkYXRhOjpDb25zZXJ2YXRpdmVseUFsbG9jYXRhYmxlKTsKKyAgfQorCisgIHZvaWQgbW92ZVRvTm90UHJvdmFibHlBbGxvY2F0YWJsZU5vZGVzKE5vZGVJZCBOSWQpIHsKKyAgICByZW1vdmVGcm9tQ3VycmVudFNldChOSWQpOworICAgIE5vdFByb3ZhYmx5QWxsb2NhdGFibGVOb2Rlcy5pbnNlcnQoTklkKTsKKyAgICBHLmdldE5vZGVNZXRhZGF0YShOSWQpLnNldFJlZHVjdGlvblN0YXRlKAorICAgICAgTm9kZU1ldGFkYXRhOjpOb3RQcm92YWJseUFsbG9jYXRhYmxlKTsKKyAgfQorCisgIHZvaWQgc2V0dXAoKSB7CisgICAgLy8gU2V0IHVwIHdvcmtsaXN0cy4KKyAgICBmb3IgKGF1dG8gTklkIDogRy5ub2RlSWRzKCkpIHsKKyAgICAgIGlmIChHLmdldE5vZGVEZWdyZWUoTklkKSA8IDMpCisgICAgICAgIG1vdmVUb09wdGltYWxseVJlZHVjaWJsZU5vZGVzKE5JZCk7CisgICAgICBlbHNlIGlmIChHLmdldE5vZGVNZXRhZGF0YShOSWQpLmlzQ29uc2VydmF0aXZlbHlBbGxvY2F0YWJsZSgpKQorICAgICAgICBtb3ZlVG9Db25zZXJ2YXRpdmVseUFsbG9jYXRhYmxlTm9kZXMoTklkKTsKKyAgICAgIGVsc2UKKyAgICAgICAgbW92ZVRvTm90UHJvdmFibHlBbGxvY2F0YWJsZU5vZGVzKE5JZCk7CisgICAgfQorICB9CisKKyAgLy8gQ29tcHV0ZSBhIHJlZHVjdGlvbiBvcmRlciBmb3IgdGhlIGdyYXBoIGJ5IGl0ZXJhdGl2ZWx5IGFwcGx5aW5nIFBCUVAKKyAgLy8gcmVkdWN0aW9uIHJ1bGVzLiBMb2NhbGx5IG9wdGltYWwgcnVsZXMgYXJlIGFwcGxpZWQgd2hlbmV2ZXIgcG9zc2libGUgKFIwLAorICAvLyBSMSwgUjIpLiBJZiBubyBsb2NhbGx5LW9wdGltYWwgcnVsZXMgYXBwbHkgdGhlbiBhbnkgY29uc2VydmF0aXZlbHkKKyAgLy8gYWxsb2NhdGFibGUgbm9kZSBpcyByZWR1Y2VkLiBGaW5hbGx5LCBpZiBubyBjb25zZXJ2YXRpdmVseSBhbGxvY2F0YWJsZQorICAvLyBub2RlIGV4aXN0cyB0aGVuIHRoZSBub2RlIHdpdGggdGhlIGxvd2VzdCBzcGlsbC1jb3N0OmRlZ3JlZSByYXRpbyBpcworICAvLyBzZWxlY3RlZC4KKyAgc3RkOjp2ZWN0b3I8R3JhcGhCYXNlOjpOb2RlSWQ+IHJlZHVjZSgpIHsKKyAgICBhc3NlcnQoIUcuZW1wdHkoKSAmJiAiQ2Fubm90IHJlZHVjZSBlbXB0eSBncmFwaC4iKTsKKworICAgIHVzaW5nIE5vZGVJZCA9IEdyYXBoQmFzZTo6Tm9kZUlkOworICAgIHN0ZDo6dmVjdG9yPE5vZGVJZD4gTm9kZVN0YWNrOworCisgICAgLy8gQ29uc3VtZSB3b3JrbGlzdHMuCisgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgIGlmICghT3B0aW1hbGx5UmVkdWNpYmxlTm9kZXMuZW1wdHkoKSkgeworICAgICAgICBOb2RlU2V0OjppdGVyYXRvciBOSXRyID0gT3B0aW1hbGx5UmVkdWNpYmxlTm9kZXMuYmVnaW4oKTsKKyAgICAgICAgTm9kZUlkIE5JZCA9ICpOSXRyOworICAgICAgICBPcHRpbWFsbHlSZWR1Y2libGVOb2Rlcy5lcmFzZShOSXRyKTsKKyAgICAgICAgTm9kZVN0YWNrLnB1c2hfYmFjayhOSWQpOworICAgICAgICBzd2l0Y2ggKEcuZ2V0Tm9kZURlZ3JlZShOSWQpKSB7CisgICAgICAgIGNhc2UgMDoKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgIGFwcGx5UjEoRywgTklkKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSAyOgorICAgICAgICAgIGFwcGx5UjIoRywgTklkKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiTm90IGFuIG9wdGltYWxseSByZWR1Y2libGUgbm9kZS4iKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICghQ29uc2VydmF0aXZlbHlBbGxvY2F0YWJsZU5vZGVzLmVtcHR5KCkpIHsKKyAgICAgICAgLy8gQ29uc2VydmF0aXZlbHkgYWxsb2NhdGFibGUgbm9kZXMgd2lsbCBuZXZlciBzcGlsbC4gRm9yIG5vdyBqdXN0CisgICAgICAgIC8vIHRha2UgdGhlIGZpcnN0IG5vZGUgaW4gdGhlIHNldCBhbmQgcHVzaCBpdCBvbiB0aGUgc3RhY2suIFdoZW4gd2UKKyAgICAgICAgLy8gc3RhcnQgb3B0aW1pemluZyBtb3JlIGhlYXZpbHkgZm9yIHJlZ2lzdGVyIHByZWZlcmVuY2luZywgaXQgbWF5CisgICAgICAgIC8vIHdvdWxkIGJlIGJldHRlciB0byBwdXNoIG5vZGVzIHdpdGggbG93ZXIgJ2V4cGVjdGVkJyBvciB3b3JzdC1jYXNlCisgICAgICAgIC8vIHJlZ2lzdGVyIGNvc3RzIGZpcnN0IChzaW5jZSBlYXJseSBub2RlcyBhcmUgdGhlIG1vc3QKKyAgICAgICAgLy8gY29uc3RyYWluZWQpLgorICAgICAgICBOb2RlU2V0OjppdGVyYXRvciBOSXRyID0gQ29uc2VydmF0aXZlbHlBbGxvY2F0YWJsZU5vZGVzLmJlZ2luKCk7CisgICAgICAgIE5vZGVJZCBOSWQgPSAqTkl0cjsKKyAgICAgICAgQ29uc2VydmF0aXZlbHlBbGxvY2F0YWJsZU5vZGVzLmVyYXNlKE5JdHIpOworICAgICAgICBOb2RlU3RhY2sucHVzaF9iYWNrKE5JZCk7CisgICAgICAgIEcuZGlzY29ubmVjdEFsbE5laWdoYm9yc0Zyb21Ob2RlKE5JZCk7CisgICAgICB9IGVsc2UgaWYgKCFOb3RQcm92YWJseUFsbG9jYXRhYmxlTm9kZXMuZW1wdHkoKSkgeworICAgICAgICBOb2RlU2V0OjppdGVyYXRvciBOSXRyID0KKyAgICAgICAgICBzdGQ6Om1pbl9lbGVtZW50KE5vdFByb3ZhYmx5QWxsb2NhdGFibGVOb2Rlcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTm90UHJvdmFibHlBbGxvY2F0YWJsZU5vZGVzLmVuZCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3BpbGxDb3N0Q29tcGFyYXRvcihHKSk7CisgICAgICAgIE5vZGVJZCBOSWQgPSAqTkl0cjsKKyAgICAgICAgTm90UHJvdmFibHlBbGxvY2F0YWJsZU5vZGVzLmVyYXNlKE5JdHIpOworICAgICAgICBOb2RlU3RhY2sucHVzaF9iYWNrKE5JZCk7CisgICAgICAgIEcuZGlzY29ubmVjdEFsbE5laWdoYm9yc0Zyb21Ob2RlKE5JZCk7CisgICAgICB9IGVsc2UKKyAgICAgICAgYnJlYWs7CisgICAgfQorCisgICAgcmV0dXJuIE5vZGVTdGFjazsKKyAgfQorCisgIGNsYXNzIFNwaWxsQ29zdENvbXBhcmF0b3IgeworICBwdWJsaWM6CisgICAgU3BpbGxDb3N0Q29tcGFyYXRvcihjb25zdCBHcmFwaCYgRykgOiBHKEcpIHt9CisKKyAgICBib29sIG9wZXJhdG9yKCkoTm9kZUlkIE4xSWQsIE5vZGVJZCBOMklkKSB7CisgICAgICBQQlFQTnVtIE4xU0MgPSBHLmdldE5vZGVDb3N0cyhOMUlkKVswXTsKKyAgICAgIFBCUVBOdW0gTjJTQyA9IEcuZ2V0Tm9kZUNvc3RzKE4ySWQpWzBdOworICAgICAgaWYgKE4xU0MgPT0gTjJTQykKKyAgICAgICAgcmV0dXJuIEcuZ2V0Tm9kZURlZ3JlZShOMUlkKSA8IEcuZ2V0Tm9kZURlZ3JlZShOMklkKTsKKyAgICAgIHJldHVybiBOMVNDIDwgTjJTQzsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBHcmFwaCYgRzsKKyAgfTsKKworICBHcmFwaCYgRzsKKyAgdXNpbmcgTm9kZVNldCA9IHN0ZDo6c2V0PE5vZGVJZD47CisgIE5vZGVTZXQgT3B0aW1hbGx5UmVkdWNpYmxlTm9kZXM7CisgIE5vZGVTZXQgQ29uc2VydmF0aXZlbHlBbGxvY2F0YWJsZU5vZGVzOworICBOb2RlU2V0IE5vdFByb3ZhYmx5QWxsb2NhdGFibGVOb2RlczsKK307CisKK2NsYXNzIFBCUVBSQUdyYXBoIDogcHVibGljIFBCUVA6OkdyYXBoPFJlZ0FsbG9jU29sdmVySW1wbD4geworcHJpdmF0ZToKKyAgdXNpbmcgQmFzZVQgPSBQQlFQOjpHcmFwaDxSZWdBbGxvY1NvbHZlckltcGw+OworCitwdWJsaWM6CisgIFBCUVBSQUdyYXBoKEdyYXBoTWV0YWRhdGEgTWV0YWRhdGEpIDogQmFzZVQoc3RkOjptb3ZlKE1ldGFkYXRhKSkge30KKworICAvLy8gQGJyaWVmIER1bXAgdGhpcyBncmFwaCB0byBkYmdzKCkuCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgRHVtcCB0aGlzIGdyYXBoIHRvIGFuIG91dHB1dCBzdHJlYW0uCisgIC8vLyBAcGFyYW0gT1MgT3V0cHV0IHN0cmVhbSB0byBwcmludCBvbi4KKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgLy8vIEBicmllZiBQcmludCBhIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgZ3JhcGggaW4gRE9UIGZvcm1hdC4KKyAgLy8vIEBwYXJhbSBPUyBPdXRwdXQgc3RyZWFtIHRvIHByaW50IG9uLgorICB2b2lkIHByaW50RG90KHJhd19vc3RyZWFtICZPUykgY29uc3Q7Cit9OworCitpbmxpbmUgU29sdXRpb24gc29sdmUoUEJRUFJBR3JhcGgmIEcpIHsKKyAgaWYgKEcuZW1wdHkoKSkKKyAgICByZXR1cm4gU29sdXRpb24oKTsKKyAgUmVnQWxsb2NTb2x2ZXJJbXBsIFJlZ0FsbG9jU29sdmVyKEcpOworICByZXR1cm4gUmVnQWxsb2NTb2x2ZXIuc29sdmUoKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIFJlZ0FsbG9jCit9IC8vIGVuZCBuYW1lc3BhY2UgUEJRUAorCisvLy8gQGJyaWVmIENyZWF0ZSBhIFBCUVAgcmVnaXN0ZXIgYWxsb2NhdG9yIGluc3RhbmNlLgorRnVuY3Rpb25QYXNzICoKK2NyZWF0ZVBCUVBSZWdpc3RlckFsbG9jYXRvcihjaGFyICpjdXN0b21QYXNzSUQgPSBudWxscHRyKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9SRUdBTExPQ1BCUVBfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1JlZ0FsbG9jUmVnaXN0cnkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWdBbGxvY1JlZ2lzdHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDgxNzQ3ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWdBbGxvY1JlZ2lzdHJ5LmgKQEAgLTAsMCArMSw2NiBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9SZWdBbGxvY1JlZ2lzdHJ5LmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGltcGxlbWVudGF0aW9uIGZvciByZWdpc3RlciBhbGxvY2F0b3IgZnVuY3Rpb24KKy8vIHBhc3MgcmVnaXN0cnkgKFJlZ2lzdGVyUmVnQWxsb2MpLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1JFR0FMTE9DUkVHSVNUUllfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fUkVHQUxMT0NSRUdJU1RSWV9ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZVBhc3NSZWdpc3RyeS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uUGFzczsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFJlZ2lzdGVyUmVnQWxsb2MgY2xhc3MgLSBUcmFjayB0aGUgcmVnaXN0cmF0aW9uIG9mIHJlZ2lzdGVyIGFsbG9jYXRvcnMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitjbGFzcyBSZWdpc3RlclJlZ0FsbG9jIDogcHVibGljIE1hY2hpbmVQYXNzUmVnaXN0cnlOb2RlIHsKK3B1YmxpYzoKKyAgdXNpbmcgRnVuY3Rpb25QYXNzQ3RvciA9IEZ1bmN0aW9uUGFzcyAqKCopKCk7CisKKyAgc3RhdGljIE1hY2hpbmVQYXNzUmVnaXN0cnkgUmVnaXN0cnk7CisKKyAgUmVnaXN0ZXJSZWdBbGxvYyhjb25zdCBjaGFyICpOLCBjb25zdCBjaGFyICpELCBGdW5jdGlvblBhc3NDdG9yIEMpCisgICAgICA6IE1hY2hpbmVQYXNzUmVnaXN0cnlOb2RlKE4sIEQsIChNYWNoaW5lUGFzc0N0b3IpQykgeworICAgIFJlZ2lzdHJ5LkFkZCh0aGlzKTsKKyAgfQorCisgIH5SZWdpc3RlclJlZ0FsbG9jKCkgeyBSZWdpc3RyeS5SZW1vdmUodGhpcyk7IH0KKworICAvLyBBY2Nlc3NvcnMuCisgIFJlZ2lzdGVyUmVnQWxsb2MgKmdldE5leHQoKSBjb25zdCB7CisgICAgcmV0dXJuIChSZWdpc3RlclJlZ0FsbG9jICopTWFjaGluZVBhc3NSZWdpc3RyeU5vZGU6OmdldE5leHQoKTsKKyAgfQorCisgIHN0YXRpYyBSZWdpc3RlclJlZ0FsbG9jICpnZXRMaXN0KCkgeworICAgIHJldHVybiAoUmVnaXN0ZXJSZWdBbGxvYyAqKVJlZ2lzdHJ5LmdldExpc3QoKTsKKyAgfQorCisgIHN0YXRpYyBGdW5jdGlvblBhc3NDdG9yIGdldERlZmF1bHQoKSB7CisgICAgcmV0dXJuIChGdW5jdGlvblBhc3NDdG9yKVJlZ2lzdHJ5LmdldERlZmF1bHQoKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIHNldERlZmF1bHQoRnVuY3Rpb25QYXNzQ3RvciBDKSB7CisgICAgUmVnaXN0cnkuc2V0RGVmYXVsdCgoTWFjaGluZVBhc3NDdG9yKUMpOworICB9CisKKyAgc3RhdGljIHZvaWQgc2V0TGlzdGVuZXIoTWFjaGluZVBhc3NSZWdpc3RyeUxpc3RlbmVyICpMKSB7CisgICAgUmVnaXN0cnkuc2V0TGlzdGVuZXIoTCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fUkVHQUxMT0NSRUdJU1RSWV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUmVnaXN0ZXJDbGFzc0luZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWdpc3RlckNsYXNzSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3MTEzYzUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUmVnaXN0ZXJDbGFzc0luZm8uaApAQCAtMCwwICsxLDE1MCBAQAorLy89PT0tIFJlZ2lzdGVyQ2xhc3NJbmZvLmggLSBEeW5hbWljIFJlZ2lzdGVyIENsYXNzIEluZm8gLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgUmVnaXN0ZXJDbGFzc0luZm8gY2xhc3Mgd2hpY2ggcHJvdmlkZXMgZHluYW1pYworLy8gaW5mb3JtYXRpb24gYWJvdXQgdGFyZ2V0IHJlZ2lzdGVyIGNsYXNzZXMuIENhbGxlZSBzYXZlZCBhbmQgcmVzZXJ2ZWQKKy8vIHJlZ2lzdGVycyBkZXBlbmRzIG9uIGNhbGxpbmcgY29udmVudGlvbnMgYW5kIG90aGVyIGR5bmFtaWMgaW5mb3JtYXRpb24sIHNvCisvLyBzb21lIHRoaW5ncyBjYW5ub3QgYmUgZGV0ZXJtaW5lZCBzdGF0aWNhbGx5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1JFR0lTVEVSQ0xBU1NJTkZPX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1JFR0lTVEVSQ0xBU1NJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1JlZ2lzdGVySW5mby5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgUmVnaXN0ZXJDbGFzc0luZm8geworICBzdHJ1Y3QgUkNJbmZvIHsKKyAgICB1bnNpZ25lZCBUYWcgPSAwOworICAgIHVuc2lnbmVkIE51bVJlZ3MgPSAwOworICAgIGJvb2wgUHJvcGVyU3ViQ2xhc3MgPSBmYWxzZTsKKyAgICB1aW50OF90IE1pbkNvc3QgPSAwOworICAgIHVpbnQxNl90IExhc3RDb3N0Q2hhbmdlID0gMDsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TUNQaHlzUmVnW10+IE9yZGVyOworCisgICAgUkNJbmZvKCkgPSBkZWZhdWx0OworCisgICAgb3BlcmF0b3IgQXJyYXlSZWY8TUNQaHlzUmVnPigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBtYWtlQXJyYXlSZWYoT3JkZXIuZ2V0KCksIE51bVJlZ3MpOworICAgIH0KKyAgfTsKKworICAvLyBCcmllZiBjYWNoZWQgaW5mb3JtYXRpb24gZm9yIGVhY2ggcmVnaXN0ZXIgY2xhc3MuCisgIHN0ZDo6dW5pcXVlX3B0cjxSQ0luZm9bXT4gUmVnQ2xhc3M7CisKKyAgLy8gVGFnIGNoYW5nZXMgd2hlbmV2ZXIgY2FjaGVkIGluZm9ybWF0aW9uIG5lZWRzIHRvIGJlIHJlY29tcHV0ZWQuIEFuIFJDSW5mbworICAvLyBlbnRyeSBpcyB2YWxpZCB3aGVuIGl0cyB0YWcgbWF0Y2hlcy4KKyAgdW5zaWduZWQgVGFnID0gMDsKKworICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GID0gbnVsbHB0cjsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBudWxscHRyOworCisgIC8vIENhbGxlZSBzYXZlZCByZWdpc3RlcnMgb2YgbGFzdCBNRi4gQXNzdW1lZCB0byBiZSB2YWxpZCB1bnRpbCB0aGUgbmV4dAorICAvLyBydW5PbkZ1bmN0aW9uKCkgY2FsbC4KKyAgLy8gVXNlZCBvbmx5IHRvIGRldGVybWluZSBpZiBhbiB1cGRhdGUgd2FzIG1hZGUgdG8gQ2FsbGVlU2F2ZWRBbGlhc2VzLgorICBjb25zdCBNQ1BoeXNSZWcgKkNhbGxlZVNhdmVkUmVncyA9IG51bGxwdHI7CisKKyAgLy8gTWFwIHJlZ2lzdGVyIGFsaWFzIHRvIHRoZSBjYWxsZWUgc2F2ZWQgUmVnaXN0ZXIuCisgIFNtYWxsVmVjdG9yPE1DUGh5c1JlZywgND4gQ2FsbGVlU2F2ZWRBbGlhc2VzOworCisgIC8vIFJlc2VydmVkIHJlZ2lzdGVycyBpbiB0aGUgY3VycmVudCBNRi4KKyAgQml0VmVjdG9yIFJlc2VydmVkOworCisgIHN0ZDo6dW5pcXVlX3B0cjx1bnNpZ25lZFtdPiBQU2V0TGltaXRzOworCisgIC8vIENvbXB1dGUgYWxsIGluZm9ybWF0aW9uIGFib3V0IFJDLgorICB2b2lkIGNvbXB1dGUoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpIGNvbnN0OworCisgIC8vIFJldHVybiBhbiB1cC10by1kYXRlIFJDSW5mbyBmb3IgUkMuCisgIGNvbnN0IFJDSW5mbyAmZ2V0KGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSBjb25zdCB7CisgICAgY29uc3QgUkNJbmZvICZSQ0kgPSBSZWdDbGFzc1tSQy0+Z2V0SUQoKV07CisgICAgaWYgKFRhZyAhPSBSQ0kuVGFnKQorICAgICAgY29tcHV0ZShSQyk7CisgICAgcmV0dXJuIFJDSTsKKyAgfQorCitwdWJsaWM6CisgIFJlZ2lzdGVyQ2xhc3NJbmZvKCk7CisKKyAgLy8vIHJ1bk9uRnVuY3Rpb24gLSBQcmVwYXJlIHRvIGFuc3dlciBxdWVzdGlvbnMgYWJvdXQgTUYuIFRoaXMgbXVzdCBiZSBjYWxsZWQKKyAgLy8vIGJlZm9yZSBhbnkgb3RoZXIgbWV0aG9kcyBhcmUgdXNlZC4KKyAgdm9pZCBydW5Pbk1hY2hpbmVGdW5jdGlvbihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKTsKKworICAvLy8gZ2V0TnVtQWxsb2NhdGFibGVSZWdzIC0gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGFjdHVhbGx5IGFsbG9jYXRhYmxlCisgIC8vLyByZWdpc3RlcnMgaW4gUkMgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24uCisgIHVuc2lnbmVkIGdldE51bUFsbG9jYXRhYmxlUmVncyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgY29uc3QgeworICAgIHJldHVybiBnZXQoUkMpLk51bVJlZ3M7CisgIH0KKworICAvLy8gZ2V0T3JkZXIgLSBSZXR1cm5zIHRoZSBwcmVmZXJyZWQgYWxsb2NhdGlvbiBvcmRlciBmb3IgUkMuIFRoZSBvcmRlcgorICAvLy8gY29udGFpbnMgbm8gcmVzZXJ2ZWQgcmVnaXN0ZXJzLCBhbmQgcmVnaXN0ZXJzIHRoYXQgYWxpYXMgY2FsbGVlIHNhdmVkCisgIC8vLyByZWdpc3RlcnMgY29tZSBsYXN0LgorICBBcnJheVJlZjxNQ1BoeXNSZWc+IGdldE9yZGVyKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSBjb25zdCB7CisgICAgcmV0dXJuIGdldChSQyk7CisgIH0KKworICAvLy8gaXNQcm9wZXJTdWJDbGFzcyAtIFJldHVybnMgdHJ1ZSBpZiBSQyBoYXMgYSBsZWdhbCBzdXBlci1jbGFzcyB3aXRoIG1vcmUKKyAgLy8vIGFsbG9jYXRhYmxlIHJlZ2lzdGVycy4KKyAgLy8vCisgIC8vLyBSZWdpc3RlciBjbGFzc2VzIGxpa2UgR1IzMl9OT1NQIGFyZSBub3QgcHJvcGVyIHN1Yi1jbGFzc2VzIGJlY2F1c2UgJWVzcAorICAvLy8gaXMgbm90IGFsbG9jYXRhYmxlLiAgU2ltaWxhcmx5LCB0R1BSIGlzIG5vdCBhIHByb3BlciBzdWItY2xhc3MgaW4gVGh1bWIKKyAgLy8vIG1vZGUgYmVjYXVzZSB0aGUgR1BSIHN1cGVyLWNsYXNzIGlzIG5vdCBsZWdhbC4KKyAgYm9vbCBpc1Byb3BlclN1YkNsYXNzKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSBjb25zdCB7CisgICAgcmV0dXJuIGdldChSQykuUHJvcGVyU3ViQ2xhc3M7CisgIH0KKworICAvLy8gZ2V0TGFzdENhbGxlZVNhdmVkQWxpYXMgLSBSZXR1cm5zIHRoZSBsYXN0IGNhbGxlZSBzYXZlZCByZWdpc3RlciB0aGF0CisgIC8vLyBvdmVybGFwcyBQaHlzUmVnLCBvciAwIGlmIFJlZyBkb2Vzbid0IG92ZXJsYXAgYSBDYWxsZWVTYXZlZEFsaWFzZXMuCisgIHVuc2lnbmVkIGdldExhc3RDYWxsZWVTYXZlZEFsaWFzKHVuc2lnbmVkIFBoeXNSZWcpIGNvbnN0IHsKKyAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1BoeXNpY2FsUmVnaXN0ZXIoUGh5c1JlZykpOworICAgIGlmIChQaHlzUmVnIDwgQ2FsbGVlU2F2ZWRBbGlhc2VzLnNpemUoKSkKKyAgICAgIHJldHVybiBDYWxsZWVTYXZlZEFsaWFzZXNbUGh5c1JlZ107CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gR2V0IHRoZSBtaW5pbXVtIHJlZ2lzdGVyIGNvc3QgaW4gUkMncyBhbGxvY2F0aW9uIG9yZGVyLgorICAvLy8gVGhpcyBpcyB0aGUgc21hbGxlc3QgdmFsdWUgcmV0dXJuZWQgYnkgVFJJLT5nZXRDb3N0UGVyVXNlKFJlZykgZm9yIGFsbAorICAvLy8gdGhlIHJlZ2lzdGVycyBpbiBnZXRPcmRlcihSQykuCisgIHVuc2lnbmVkIGdldE1pbkNvc3QoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpIHsKKyAgICByZXR1cm4gZ2V0KFJDKS5NaW5Db3N0OworICB9CisKKyAgLy8vIEdldCB0aGUgcG9zaXRpb24gb2YgdGhlIGxhc3QgY29zdCBjaGFuZ2UgaW4gZ2V0T3JkZXIoUkMpLgorICAvLy8KKyAgLy8vIEFsbCByZWdpc3RlcnMgaW4gZ2V0T3JkZXIoUkMpLnNsaWNlKGdldExhc3RDb3N0Q2hhbmdlKFJDKSkgd2lsbCBoYXZlIHRoZQorICAvLy8gc2FtZSBjb3N0IGFjY29yZGluZyB0byBUUkktPmdldENvc3RQZXJVc2UoKS4KKyAgdW5zaWduZWQgZ2V0TGFzdENvc3RDaGFuZ2UoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpIHsKKyAgICByZXR1cm4gZ2V0KFJDKS5MYXN0Q29zdENoYW5nZTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIHJlZ2lzdGVyIHVuaXQgbGltaXQgZm9yIHRoZSBnaXZlbiBwcmVzc3VyZSBzZXQgaW5kZXguCisgIC8vLworICAvLy8gUmVnaXN0ZXJDbGFzc0luZm8gYWRqdXN0cyB0aGlzIGxpbWl0IGZvciByZXNlcnZlZCByZWdpc3RlcnMuCisgIHVuc2lnbmVkIGdldFJlZ1ByZXNzdXJlU2V0TGltaXQodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgaWYgKCFQU2V0TGltaXRzW0lkeF0pCisgICAgICBQU2V0TGltaXRzW0lkeF0gPSBjb21wdXRlUFNldExpbWl0KElkeCk7CisgICAgcmV0dXJuIFBTZXRMaW1pdHNbSWR4XTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHVuc2lnbmVkIGNvbXB1dGVQU2V0TGltaXQodW5zaWduZWQgSWR4KSBjb25zdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fUkVHSVNURVJDTEFTU0lORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1JlZ2lzdGVyUHJlc3N1cmUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWdpc3RlclByZXNzdXJlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmIxNGI3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWdpc3RlclByZXNzdXJlLmgKQEAgLTAsMCArMSw1NzYgQEAKKy8vPT09LSBSZWdpc3RlclByZXNzdXJlLmggLSBEeW5hbWljIFJlZ2lzdGVyIFByZXNzdXJlIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFJlZ2lzdGVyUHJlc3N1cmUgY2xhc3Mgd2hpY2ggY2FuIGJlIHVzZWQgdG8gdHJhY2sKKy8vIE1hY2hpbmVJbnN0ciBsZXZlbCByZWdpc3RlciBwcmVzc3VyZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9SRUdJU1RFUlBSRVNTVVJFX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1JFR0lTVEVSUFJFU1NVUkVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NwYXJzZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TbG90SW5kZXhlcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL0xhbmVCaXRtYXNrLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExpdmVJbnRlcnZhbHM7CitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworY2xhc3MgUmVnaXN0ZXJDbGFzc0luZm87CisKK3N0cnVjdCBSZWdpc3Rlck1hc2tQYWlyIHsKKyAgdW5zaWduZWQgUmVnVW5pdDsgLy8vPCBWaXJ0dWFsIHJlZ2lzdGVyIG9yIHJlZ2lzdGVyIHVuaXQuCisgIExhbmVCaXRtYXNrIExhbmVNYXNrOworCisgIFJlZ2lzdGVyTWFza1BhaXIodW5zaWduZWQgUmVnVW5pdCwgTGFuZUJpdG1hc2sgTGFuZU1hc2spCisgICAgICA6IFJlZ1VuaXQoUmVnVW5pdCksIExhbmVNYXNrKExhbmVNYXNrKSB7fQorfTsKKworLy8vIEJhc2UgY2xhc3MgZm9yIHJlZ2lzdGVyIHByZXNzdXJlIHJlc3VsdHMuCitzdHJ1Y3QgUmVnaXN0ZXJQcmVzc3VyZSB7CisgIC8vLyBNYXAgb2YgbWF4IHJlZyBwcmVzc3VyZSBpbmRleGVkIGJ5IHByZXNzdXJlIHNldCBJRCwgbm90IGNsYXNzIElELgorICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gTWF4U2V0UHJlc3N1cmU7CisKKyAgLy8vIExpc3Qgb2YgbGl2ZSBpbiB2aXJ0dWFsIHJlZ2lzdGVycyBvciBwaHlzaWNhbCByZWdpc3RlciB1bml0cy4KKyAgU21hbGxWZWN0b3I8UmVnaXN0ZXJNYXNrUGFpciw4PiBMaXZlSW5SZWdzOworICBTbWFsbFZlY3RvcjxSZWdpc3Rlck1hc2tQYWlyLDg+IExpdmVPdXRSZWdzOworCisgIHZvaWQgZHVtcChjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3Q7Cit9OworCisvLy8gUmVnaXN0ZXJQcmVzc3VyZSBjb21wdXRlZCB3aXRoaW4gYSByZWdpb24gb2YgaW5zdHJ1Y3Rpb25zIGRlbGltaXRlZCBieQorLy8vIFRvcElkeCBhbmQgQm90dG9tSWR4LiAgRHVyaW5nIHByZXNzdXJlIGNvbXB1dGF0aW9uLCB0aGUgbWF4aW11bSBwcmVzc3VyZSBwZXIKKy8vLyByZWdpc3RlciBwcmVzc3VyZSBzZXQgaXMgaW5jcmVhc2VkLiBPbmNlIHByZXNzdXJlIHdpdGhpbiBhIHJlZ2lvbiBpcyBmdWxseQorLy8vIGNvbXB1dGVkLCB0aGUgbGl2ZS1pbiBhbmQgbGl2ZS1vdXQgc2V0cyBhcmUgcmVjb3JkZWQuCisvLy8KKy8vLyBUaGlzIGlzIHByZWZlcmFibGUgdG8gUmVnaW9uUHJlc3N1cmUgd2hlbiBMaXZlSW50ZXJ2YWxzIGFyZSBhdmFpbGFibGUsCisvLy8gYmVjYXVzZSBkZWxpbWl0aW5nIHJlZ2lvbnMgYnkgU2xvdEluZGV4IGlzIG1vcmUgcm9idXN0IGFuZCBjb252ZW5pZW50IHRoYW4KKy8vLyBob2xkaW5nIGJsb2NrIGl0ZXJhdG9ycy4gVGhlIGJsb2NrIGNvbnRlbnRzIGNhbiBjaGFuZ2Ugd2l0aG91dCBpbnZhbGlkYXRpbmcKKy8vLyB0aGUgcHJlc3N1cmUgcmVzdWx0Lgorc3RydWN0IEludGVydmFsUHJlc3N1cmUgOiBSZWdpc3RlclByZXNzdXJlIHsKKyAgLy8vIFJlY29yZCB0aGUgYm91bmRhcnkgb2YgdGhlIHJlZ2lvbiBiZWluZyB0cmFja2VkLgorICBTbG90SW5kZXggVG9wSWR4OworICBTbG90SW5kZXggQm90dG9tSWR4OworCisgIHZvaWQgcmVzZXQoKTsKKworICB2b2lkIG9wZW5Ub3AoU2xvdEluZGV4IE5leHRUb3ApOworCisgIHZvaWQgb3BlbkJvdHRvbShTbG90SW5kZXggUHJldkJvdHRvbSk7Cit9OworCisvLy8gUmVnaXN0ZXJQcmVzc3VyZSBjb21wdXRlZCB3aXRoaW4gYSByZWdpb24gb2YgaW5zdHJ1Y3Rpb25zIGRlbGltaXRlZCBieQorLy8vIFRvcFBvcyBhbmQgQm90dG9tUG9zLiBUaGlzIGlzIGEgbGVzcyBwcmVjaXNlIHZlcnNpb24gb2YgSW50ZXJ2YWxQcmVzc3VyZSBmb3IKKy8vLyB1c2Ugd2hlbiBMaXZlSW50ZXJ2YWxzIGFyZSB1bmF2YWlsYWJsZS4KK3N0cnVjdCBSZWdpb25QcmVzc3VyZSA6IFJlZ2lzdGVyUHJlc3N1cmUgeworICAvLy8gUmVjb3JkIHRoZSBib3VuZGFyeSBvZiB0aGUgcmVnaW9uIGJlaW5nIHRyYWNrZWQuCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciBUb3BQb3M7CisgIE1hY2hpbmVCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciBCb3R0b21Qb3M7CisKKyAgdm9pZCByZXNldCgpOworCisgIHZvaWQgb3BlblRvcChNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgUHJldlRvcCk7CisKKyAgdm9pZCBvcGVuQm90dG9tKE1hY2hpbmVCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciBQcmV2Qm90dG9tKTsKK307CisKKy8vLyBDYXB0dXJlIGEgY2hhbmdlIGluIHByZXNzdXJlIGZvciBhIHNpbmdsZSBwcmVzc3VyZSBzZXQuIFVuaXRJbmMgbWF5IGJlCisvLy8gZXhwcmVzc2VkIGluIHRlcm1zIG9mIHVwd2FyZCBvciBkb3dud2FyZCBwcmVzc3VyZSBkZXBlbmRpbmcgb24gdGhlIGNsaWVudAorLy8vIGFuZCB3aWxsIGJlIGR5bmFtaWNhbGx5IGFkanVzdGVkIGZvciBjdXJyZW50IGxpdmVuZXNzLgorLy8vCisvLy8gUHJlc3N1cmUgaW5jcmVtZW50cyBhcmUgdGlueSwgdHlwaWNhbGx5IDEtMiB1bml0cywgYW5kIHRoaXMgaXMgb25seSBmb3IKKy8vLyBoZXVyaXN0aWNzLCBzbyB3ZSBkb24ndCBjaGVjayBVbml0SW5jIG92ZXJmbG93LiBJbnN0ZWFkLCB3ZSBtYXkgaGF2ZSBhCisvLy8gaGlnaGVyIGxldmVsIGFzc2VydCB0aGF0IHByZXNzdXJlIGlzIGNvbnNpc3RlbnQgd2l0aGluIGEgcmVnaW9uLiBXZSBhbHNvCisvLy8gZWZmZWN0aXZlbHkgaWdub3JlIGRlYWQgZGVmcyB3aGljaCBkb24ndCBhZmZlY3QgaGV1cmlzdGljcyBtdWNoLgorY2xhc3MgUHJlc3N1cmVDaGFuZ2UgeworICB1aW50MTZfdCBQU2V0SUQgPSAwOyAvLyBJRCsxLiAwPUludmFsaWQuCisgIGludDE2X3QgVW5pdEluYyA9IDA7CisKK3B1YmxpYzoKKyAgUHJlc3N1cmVDaGFuZ2UoKSA9IGRlZmF1bHQ7CisgIFByZXNzdXJlQ2hhbmdlKHVuc2lnbmVkIGlkKTogUFNldElEKGlkICsgMSkgeworICAgIGFzc2VydChpZCA8IHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgoKSAmJiAiUFNldElEIG92ZXJmbG93LiIpOworICB9CisKKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gUFNldElEID4gMDsgfQorCisgIHVuc2lnbmVkIGdldFBTZXQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiaW52YWxpZCBQcmVzc3VyZUNoYW5nZSIpOworICAgIHJldHVybiBQU2V0SUQgLSAxOworICB9CisKKyAgLy8gSWYgUFNldElEIGlzIGludmFsaWQsIHJldHVybiBVSU5UMTZfTUFYIHRvIGdpdmUgaXQgbG93ZXN0IHByaW9yaXR5LgorICB1bnNpZ25lZCBnZXRQU2V0T3JNYXgoKSBjb25zdCB7CisgICAgcmV0dXJuIChQU2V0SUQgLSAxKSAmIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDE2X3Q+OjptYXgoKTsKKyAgfQorCisgIGludCBnZXRVbml0SW5jKCkgY29uc3QgeyByZXR1cm4gVW5pdEluYzsgfQorCisgIHZvaWQgc2V0VW5pdEluYyhpbnQgSW5jKSB7IFVuaXRJbmMgPSBJbmM7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgUHJlc3N1cmVDaGFuZ2UgJlJIUykgY29uc3QgeworICAgIHJldHVybiBQU2V0SUQgPT0gUkhTLlBTZXRJRCAmJiBVbml0SW5jID09IFJIUy5Vbml0SW5jOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNQb2RMaWtlPFByZXNzdXJlQ2hhbmdlPiB7CisgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OworCisvLy8gTGlzdCBvZiBQcmVzc3VyZUNoYW5nZXMgaW4gb3JkZXIgb2YgaW5jcmVhc2luZywgdW5pcXVlIFBTZXRJRC4KKy8vLworLy8vIFVzZSBhIHNtYWxsIGZpeGVkIG51bWJlciwgYmVjYXVzZSB3ZSBjYW4gZml0IG1vcmUgUHJlc3N1cmVDaGFuZ2VzIGluIGFuCisvLy8gZW1wdHkgU21hbGxWZWN0b3IgdGhhbiBldmVyIG5lZWQgdG8gYmUgdHJhY2tlZCBwZXIgcmVnaXN0ZXIgY2xhc3MuIElmIG1vcmUKKy8vLyBQU2V0cyBhcmUgYWZmZWN0ZWQsIHRoZW4gd2Ugb25seSB0cmFjayB0aGUgbW9zdCBjb25zdHJhaW5lZC4KK2NsYXNzIFByZXNzdXJlRGlmZiB7CisgIC8vIFRoZSBpbml0aWFsIGRlc2lnbiB3YXMgZm9yIE1heFBTZXRzPTQsIGJ1dCB0aGF0IHJlcXVpcmVzIFBTZXQgcGFydGl0aW9ucywKKyAgLy8gd2hpY2ggYXJlIG5vdCB5ZXQgaW1wbGVtZW50ZWQuIChQU2V0IHBhcnRpdGlvbnMgYXJlIGVxdWl2YWxlbnQgUFNldHMgZ2l2ZW4KKyAgLy8gdGhlIHJlZ2lzdGVyIGNsYXNzZXMgYWN0dWFsbHkgaW4gdXNlIHdpdGhpbiB0aGUgc2NoZWR1bGluZyByZWdpb24uKQorICBlbnVtIHsgTWF4UFNldHMgPSAxNiB9OworCisgIFByZXNzdXJlQ2hhbmdlIFByZXNzdXJlQ2hhbmdlc1tNYXhQU2V0c107CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBQcmVzc3VyZUNoYW5nZSAqOworCisgIGl0ZXJhdG9yIG5vbmNvbnN0X2JlZ2luKCkgeyByZXR1cm4gJlByZXNzdXJlQ2hhbmdlc1swXTsgfQorICBpdGVyYXRvciBub25jb25zdF9lbmQoKSB7IHJldHVybiAmUHJlc3N1cmVDaGFuZ2VzW01heFBTZXRzXTsgfQorCitwdWJsaWM6CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gY29uc3QgUHJlc3N1cmVDaGFuZ2UgKjsKKworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuICZQcmVzc3VyZUNoYW5nZXNbMF07IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gJlByZXNzdXJlQ2hhbmdlc1tNYXhQU2V0c107IH0KKworICB2b2lkIGFkZFByZXNzdXJlQ2hhbmdlKHVuc2lnbmVkIFJlZ1VuaXQsIGJvb2wgSXNEZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJKTsKKworICB2b2lkIGR1bXAoY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkkpIGNvbnN0OworfTsKKworLy8vIExpc3Qgb2YgcmVnaXN0ZXJzIGRlZmluZWQgYW5kIHVzZWQgYnkgYSBtYWNoaW5lIGluc3RydWN0aW9uLgorY2xhc3MgUmVnaXN0ZXJPcGVyYW5kcyB7CitwdWJsaWM6CisgIC8vLyBMaXN0IG9mIHZpcnR1YWwgcmVnaXN0ZXJzIGFuZCByZWdpc3RlciB1bml0cyByZWFkIGJ5IHRoZSBpbnN0cnVjdGlvbi4KKyAgU21hbGxWZWN0b3I8UmVnaXN0ZXJNYXNrUGFpciwgOD4gVXNlczsKKyAgLy8vIFxicmllZiBMaXN0IG9mIHZpcnR1YWwgcmVnaXN0ZXJzIGFuZCByZWdpc3RlciB1bml0cyBkZWZpbmVkIGJ5IHRoZQorICAvLy8gaW5zdHJ1Y3Rpb24gd2hpY2ggYXJlIG5vdCBkZWFkLgorICBTbWFsbFZlY3RvcjxSZWdpc3Rlck1hc2tQYWlyLCA4PiBEZWZzOworICAvLy8gXGJyaWVmIExpc3Qgb2YgdmlydHVhbCByZWdpc3RlcnMgYW5kIHJlZ2lzdGVyIHVuaXRzIGRlZmluZWQgYnkgdGhlCisgIC8vLyBpbnN0cnVjdGlvbiBidXQgZGVhZC4KKyAgU21hbGxWZWN0b3I8UmVnaXN0ZXJNYXNrUGFpciwgOD4gRGVhZERlZnM7CisKKyAgLy8vIEFuYWx5emUgdGhlIGdpdmVuIGluc3RydWN0aW9uIFxwIE1JIGFuZCBmaWxsIGluIHRoZSBVc2VzLCBEZWZzIGFuZAorICAvLy8gRGVhZERlZnMgbGlzdCBiYXNlZCBvbiB0aGUgTWFjaGluZU9wZXJhbmQgZmxhZ3MuCisgIHZvaWQgY29sbGVjdChjb25zdCBNYWNoaW5lSW5zdHIgJk1JLCBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gJlRSSSwKKyAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwgYm9vbCBUcmFja0xhbmVNYXNrcywKKyAgICAgICAgICAgICAgIGJvb2wgSWdub3JlRGVhZCk7CisKKyAgLy8vIFVzZSBsaXZlbmVzcyBpbmZvcm1hdGlvbiB0byBmaW5kIGRlYWQgZGVmcyBub3QgbWFya2VkIHdpdGggYSBkZWFkIGZsYWcKKyAgLy8vIGFuZCBtb3ZlIHRoZW0gdG8gdGhlIERlYWREZWZzIHZlY3Rvci4KKyAgdm9pZCBkZXRlY3REZWFkRGVmcyhjb25zdCBNYWNoaW5lSW5zdHIgJk1JLCBjb25zdCBMaXZlSW50ZXJ2YWxzICZMSVMpOworCisgIC8vLyBVc2UgbGl2ZW5lc3MgaW5mb3JtYXRpb24gdG8gZmluZCBvdXQgd2hpY2ggdXNlcy9kZWZzIGFyZSBwYXJ0aWFsbHkKKyAgLy8vIHVuZGVmaW5lZC9kZWFkIGFuZCBhZGp1c3QgdGhlIFJlZ2lzdGVyTWFza1BhaXJzIGFjY29yZGluZ2x5LgorICAvLy8gSWYgXHAgQWRkRmxhZ3NNSSBpcyBnaXZlbiB0aGVuIG1pc3NpbmcgcmVhZC11bmRlZiBhbmQgZGVhZCBmbGFncyB3aWxsIGJlCisgIC8vLyBhZGRlZCB0byB0aGUgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgYWRqdXN0TGFuZUxpdmVuZXNzKGNvbnN0IExpdmVJbnRlcnZhbHMgJkxJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJLCBTbG90SW5kZXggUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKkFkZEZsYWdzTUkgPSBudWxscHRyKTsKK307CisKKy8vLyBBcnJheSBvZiBQcmVzc3VyZURpZmZzLgorY2xhc3MgUHJlc3N1cmVEaWZmcyB7CisgIFByZXNzdXJlRGlmZiAqUERpZmZBcnJheSA9IG51bGxwdHI7CisgIHVuc2lnbmVkIFNpemUgPSAwOworICB1bnNpZ25lZCBNYXggPSAwOworCitwdWJsaWM6CisgIFByZXNzdXJlRGlmZnMoKSA9IGRlZmF1bHQ7CisgIH5QcmVzc3VyZURpZmZzKCkgeyBmcmVlKFBEaWZmQXJyYXkpOyB9CisKKyAgdm9pZCBjbGVhcigpIHsgU2l6ZSA9IDA7IH0KKworICB2b2lkIGluaXQodW5zaWduZWQgTik7CisKKyAgUHJlc3N1cmVEaWZmICZvcGVyYXRvcltdKHVuc2lnbmVkIElkeCkgeworICAgIGFzc2VydChJZHggPCBTaXplICYmICJQcmVzc3VyZURpZmYgaW5kZXggb3V0IG9mIGJvdW5kcyIpOworICAgIHJldHVybiBQRGlmZkFycmF5W0lkeF07CisgIH0KKyAgY29uc3QgUHJlc3N1cmVEaWZmICZvcGVyYXRvcltdKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PFByZXNzdXJlRGlmZnMqPih0aGlzKS0+b3BlcmF0b3JbXShJZHgpOworICB9CisKKyAgLy8vIFxicmllZiBSZWNvcmQgcHJlc3N1cmUgZGlmZmVyZW5jZSBpbmR1Y2VkIGJ5IHRoZSBnaXZlbiBvcGVyYW5kIGxpc3QgdG8KKyAgLy8vIG5vZGUgd2l0aCBpbmRleCBccCBJZHguCisgIHZvaWQgYWRkSW5zdHJ1Y3Rpb24odW5zaWduZWQgSWR4LCBjb25zdCBSZWdpc3Rlck9wZXJhbmRzICZSZWdPcGVycywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkkpOworfTsKKworLy8vIFN0b3JlIHRoZSBlZmZlY3RzIG9mIGEgY2hhbmdlIGluIHByZXNzdXJlIG9uIHRoaW5ncyB0aGF0IE1JIHNjaGVkdWxlciBjYXJlcworLy8vIGFib3V0LgorLy8vCisvLy8gRXhjZXNzIHJlY29yZHMgdGhlIHZhbHVlIG9mIHRoZSBsYXJnZXN0IGRpZmZlcmVuY2UgaW4gcmVnaXN0ZXIgdW5pdHMgYmV5b25kCisvLy8gdGhlIHRhcmdldCdzIHByZXNzdXJlIGxpbWl0cyBhY3Jvc3MgdGhlIGFmZmVjdGVkIHByZXNzdXJlIHNldHMsIHdoZXJlCisvLy8gbGFyZ2VzdCBpcyBkZWZpbmVkIGFzIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgZGlmZmVyZW5jZS4gTmVnYXRpdmUKKy8vLyBFeGNlc3NVbml0cyBpbmRpY2F0ZXMgYSByZWR1Y3Rpb24gaW4gcHJlc3N1cmUgdGhhdCBoYWQgYWxyZWFkeSBleGNlZWRlZCB0aGUKKy8vLyB0YXJnZXQncyBsaW1pdHMuCisvLy8KKy8vLyBDcml0aWNhbE1heCByZWNvcmRzIHRoZSBsYXJnZXN0IGluY3JlYXNlIGluIHRoZSB0cmFja2VyJ3MgbWF4IHByZXNzdXJlIHRoYXQKKy8vLyBleGNlZWRzIHRoZSBjcml0aWNhbCBsaW1pdCBmb3Igc29tZSBwcmVzc3VyZSBzZXQgZGV0ZXJtaW5lZCBieSB0aGUgY2xpZW50LgorLy8vCisvLy8gQ3VycmVudE1heCByZWNvcmRzIHRoZSBsYXJnZXN0IGluY3JlYXNlIGluIHRoZSB0cmFja2VyJ3MgbWF4IHByZXNzdXJlIHRoYXQKKy8vLyBleGNlZWRzIHRoZSBjdXJyZW50IGxpbWl0IGZvciBzb21lIHByZXNzdXJlIHNldCBkZXRlcm1pbmVkIGJ5IHRoZSBjbGllbnQuCitzdHJ1Y3QgUmVnUHJlc3N1cmVEZWx0YSB7CisgIFByZXNzdXJlQ2hhbmdlIEV4Y2VzczsKKyAgUHJlc3N1cmVDaGFuZ2UgQ3JpdGljYWxNYXg7CisgIFByZXNzdXJlQ2hhbmdlIEN1cnJlbnRNYXg7CisKKyAgUmVnUHJlc3N1cmVEZWx0YSgpID0gZGVmYXVsdDsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgUmVnUHJlc3N1cmVEZWx0YSAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEV4Y2VzcyA9PSBSSFMuRXhjZXNzICYmIENyaXRpY2FsTWF4ID09IFJIUy5Dcml0aWNhbE1heAorICAgICAgJiYgQ3VycmVudE1heCA9PSBSSFMuQ3VycmVudE1heDsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgUmVnUHJlc3N1cmVEZWx0YSAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuICFvcGVyYXRvcj09KFJIUyk7CisgIH0KK307CisKKy8vLyBBIHNldCBvZiBsaXZlIHZpcnR1YWwgcmVnaXN0ZXJzIGFuZCBwaHlzaWNhbCByZWdpc3RlciB1bml0cy4KKy8vLworLy8vIFRoaXMgaXMgYSB3cmFwcGVyIGFyb3VuZCBhIFNwYXJzZVNldCB3aGljaCBkZWFscyB3aXRoIG1hcHBpbmcgcmVnaXN0ZXIgdW5pdAorLy8vIGFuZCB2aXJ0dWFsIHJlZ2lzdGVyIGluZGV4ZXMgdG8gYW4gaW5kZXggdXNhYmxlIGJ5IHRoZSBzcGFyc2Ugc2V0LgorY2xhc3MgTGl2ZVJlZ1NldCB7Citwcml2YXRlOgorICBzdHJ1Y3QgSW5kZXhNYXNrUGFpciB7CisgICAgdW5zaWduZWQgSW5kZXg7CisgICAgTGFuZUJpdG1hc2sgTGFuZU1hc2s7CisKKyAgICBJbmRleE1hc2tQYWlyKHVuc2lnbmVkIEluZGV4LCBMYW5lQml0bWFzayBMYW5lTWFzaykKKyAgICAgICAgOiBJbmRleChJbmRleCksIExhbmVNYXNrKExhbmVNYXNrKSB7fQorCisgICAgdW5zaWduZWQgZ2V0U3BhcnNlU2V0SW5kZXgoKSBjb25zdCB7CisgICAgICByZXR1cm4gSW5kZXg7CisgICAgfQorICB9OworCisgIHVzaW5nIFJlZ1NldCA9IFNwYXJzZVNldDxJbmRleE1hc2tQYWlyPjsKKyAgUmVnU2V0IFJlZ3M7CisgIHVuc2lnbmVkIE51bVJlZ1VuaXRzOworCisgIHVuc2lnbmVkIGdldFNwYXJzZUluZGV4RnJvbVJlZyh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICBpZiAoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3RlcihSZWcpKQorICAgICAgcmV0dXJuIFRhcmdldFJlZ2lzdGVySW5mbzo6dmlydFJlZzJJbmRleChSZWcpICsgTnVtUmVnVW5pdHM7CisgICAgYXNzZXJ0KFJlZyA8IE51bVJlZ1VuaXRzKTsKKyAgICByZXR1cm4gUmVnOworICB9CisKKyAgdW5zaWduZWQgZ2V0UmVnRnJvbVNwYXJzZUluZGV4KHVuc2lnbmVkIFNwYXJzZUluZGV4KSBjb25zdCB7CisgICAgaWYgKFNwYXJzZUluZGV4ID49IE51bVJlZ1VuaXRzKQorICAgICAgcmV0dXJuIFRhcmdldFJlZ2lzdGVySW5mbzo6aW5kZXgyVmlydFJlZyhTcGFyc2VJbmRleC1OdW1SZWdVbml0cyk7CisgICAgcmV0dXJuIFNwYXJzZUluZGV4OworICB9CisKK3B1YmxpYzoKKyAgdm9pZCBjbGVhcigpOworICB2b2lkIGluaXQoY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJKTsKKworICBMYW5lQml0bWFzayBjb250YWlucyh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBTcGFyc2VJbmRleCA9IGdldFNwYXJzZUluZGV4RnJvbVJlZyhSZWcpOworICAgIFJlZ1NldDo6Y29uc3RfaXRlcmF0b3IgSSA9IFJlZ3MuZmluZChTcGFyc2VJbmRleCk7CisgICAgaWYgKEkgPT0gUmVncy5lbmQoKSkKKyAgICAgIHJldHVybiBMYW5lQml0bWFzazo6Z2V0Tm9uZSgpOworICAgIHJldHVybiBJLT5MYW5lTWFzazsKKyAgfQorCisgIC8vLyBNYXJrIHRoZSBccCBQYWlyLkxhbmVNYXNrIGxhbmVzIG9mIFxwIFBhaXIuUmVnIGFzIGxpdmUuCisgIC8vLyBSZXR1cm5zIHRoZSBwcmV2aW91c2x5IGxpdmUgbGFuZXMgb2YgXHAgUGFpci5SZWcuCisgIExhbmVCaXRtYXNrIGluc2VydChSZWdpc3Rlck1hc2tQYWlyIFBhaXIpIHsKKyAgICB1bnNpZ25lZCBTcGFyc2VJbmRleCA9IGdldFNwYXJzZUluZGV4RnJvbVJlZyhQYWlyLlJlZ1VuaXQpOworICAgIGF1dG8gSW5zZXJ0UmVzID0gUmVncy5pbnNlcnQoSW5kZXhNYXNrUGFpcihTcGFyc2VJbmRleCwgUGFpci5MYW5lTWFzaykpOworICAgIGlmICghSW5zZXJ0UmVzLnNlY29uZCkgeworICAgICAgTGFuZUJpdG1hc2sgUHJldk1hc2sgPSBJbnNlcnRSZXMuZmlyc3QtPkxhbmVNYXNrOworICAgICAgSW5zZXJ0UmVzLmZpcnN0LT5MYW5lTWFzayB8PSBQYWlyLkxhbmVNYXNrOworICAgICAgcmV0dXJuIFByZXZNYXNrOworICAgIH0KKyAgICByZXR1cm4gTGFuZUJpdG1hc2s6OmdldE5vbmUoKTsKKyAgfQorCisgIC8vLyBDbGVhcnMgdGhlIFxwIFBhaXIuTGFuZU1hc2sgbGFuZXMgb2YgXHAgUGFpci5SZWcgKG1hcmsgdGhlbSBhcyBkZWFkKS4KKyAgLy8vIFJldHVybnMgdGhlIHByZXZpb3VzbHkgbGl2ZSBsYW5lcyBvZiBccCBQYWlyLlJlZy4KKyAgTGFuZUJpdG1hc2sgZXJhc2UoUmVnaXN0ZXJNYXNrUGFpciBQYWlyKSB7CisgICAgdW5zaWduZWQgU3BhcnNlSW5kZXggPSBnZXRTcGFyc2VJbmRleEZyb21SZWcoUGFpci5SZWdVbml0KTsKKyAgICBSZWdTZXQ6Oml0ZXJhdG9yIEkgPSBSZWdzLmZpbmQoU3BhcnNlSW5kZXgpOworICAgIGlmIChJID09IFJlZ3MuZW5kKCkpCisgICAgICByZXR1cm4gTGFuZUJpdG1hc2s6OmdldE5vbmUoKTsKKyAgICBMYW5lQml0bWFzayBQcmV2TWFzayA9IEktPkxhbmVNYXNrOworICAgIEktPkxhbmVNYXNrICY9IH5QYWlyLkxhbmVNYXNrOworICAgIHJldHVybiBQcmV2TWFzazsKKyAgfQorCisgIHNpemVfdCBzaXplKCkgY29uc3QgeworICAgIHJldHVybiBSZWdzLnNpemUoKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIENvbnRhaW5lclQ+CisgIHZvaWQgYXBwZW5kVG8oQ29udGFpbmVyVCAmVG8pIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IEluZGV4TWFza1BhaXIgJlAgOiBSZWdzKSB7CisgICAgICB1bnNpZ25lZCBSZWcgPSBnZXRSZWdGcm9tU3BhcnNlSW5kZXgoUC5JbmRleCk7CisgICAgICBpZiAoUC5MYW5lTWFzay5hbnkoKSkKKyAgICAgICAgVG8ucHVzaF9iYWNrKFJlZ2lzdGVyTWFza1BhaXIoUmVnLCBQLkxhbmVNYXNrKSk7CisgICAgfQorICB9Cit9OworCisvLy8gVHJhY2sgdGhlIGN1cnJlbnQgcmVnaXN0ZXIgcHJlc3N1cmUgYXQgc29tZSBwb3NpdGlvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24KKy8vLyBzdHJlYW0sIGFuZCByZW1lbWJlciB0aGUgaGlnaCB3YXRlciBtYXJrIHdpdGhpbiB0aGUgcmVnaW9uIHRyYXZlcnNlZC4gVGhpcworLy8vIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgY29uc2lkZXIgbGl2ZS10aHJvdWdoIHJhbmdlcy4gVGhlIGNsaWVudCBtYXkKKy8vLyBpbmRlcGVuZGVudGx5IGFkanVzdCBmb3IgZ2xvYmFsIGxpdmVuZXNzLgorLy8vCisvLy8gRWFjaCBSZWdQcmVzc3VyZVRyYWNrZXIgb25seSB3b3JrcyB3aXRoaW4gYSBNYWNoaW5lQmFzaWNCbG9jay4gUHJlc3N1cmUgY2FuCisvLy8gYmUgdHJhY2tlZCBhY3Jvc3MgYSBsYXJnZXIgcmVnaW9uIGJ5IHN0b3JpbmcgYSBSZWdpc3RlclByZXNzdXJlIHJlc3VsdCBhdAorLy8vIGVhY2ggYmxvY2sgYm91bmRhcnkgYW5kIGV4cGxpY2l0bHkgYWRqdXN0aW5nIHByZXNzdXJlIHRvIGFjY291bnQgZm9yIGJsb2NrCisvLy8gbGl2ZS1pbiBhbmQgbGl2ZS1vdXQgcmVnaXN0ZXIgc2V0cy4KKy8vLworLy8vIFJlZ1ByZXNzdXJlVHJhY2tlciBob2xkcyBhIHJlZmVyZW5jZSB0byBhIFJlZ2lzdGVyUHJlc3N1cmUgcmVzdWx0IHRoYXQgaXQKKy8vLyBjb21wdXRlcyBpbmNyZW1lbnRhbGx5LiBEdXJpbmcgZG93bndhcmQgdHJhY2tpbmcsIFAuQm90dG9tSWR4IG9yIFAuQm90dG9tUG9zCisvLy8gaXMgaW52YWxpZCB1bnRpbCBpdCByZWFjaGVzIHRoZSBlbmQgb2YgdGhlIGJsb2NrIG9yIGNsb3NlUmVnaW9uKCkgaXMKKy8vLyBleHBsaWNpdGx5IGNhbGxlZC4gU2ltaWxhcmx5LCBQLlRvcElkeCBpcyBpbnZhbGlkIGR1cmluZyB1cHdhcmQKKy8vLyB0cmFja2luZy4gQ2hhbmdpbmcgZGlyZWN0aW9uIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgY2xvc2luZyByZWdpb24sIGFuZAorLy8vIHRyYXZlcnNpbmcgcGFzdCBUb3BJZHggb3IgQm90dG9tSWR4IHJlb3BlbnMgaXQuCitjbGFzcyBSZWdQcmVzc3VyZVRyYWNrZXIgeworICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gKk1GID0gbnVsbHB0cjsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBudWxscHRyOworICBjb25zdCBSZWdpc3RlckNsYXNzSW5mbyAqUkNJID0gbnVsbHB0cjsKKyAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJOworICBjb25zdCBMaXZlSW50ZXJ2YWxzICpMSVMgPSBudWxscHRyOworCisgIC8vLyBXZSBjdXJyZW50bHkgb25seSBhbGxvdyBwcmVzc3VyZSB0cmFja2luZyB3aXRoaW4gYSBibG9jay4KKyAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IG51bGxwdHI7CisKKyAgLy8vIFRyYWNrIHRoZSBtYXggcHJlc3N1cmUgd2l0aGluIHRoZSByZWdpb24gdHJhdmVyc2VkIHNvIGZhci4KKyAgUmVnaXN0ZXJQcmVzc3VyZSAmUDsKKworICAvLy8gUnVuIGluIHR3byBtb2RlcyBkZXBlbmRlbmRpbmcgb24gd2hldGhlciBjb25zdHJ1Y3RlZCB3aXRoIEludGVydmFsUHJlc3N1cmUKKyAgLy8vIG9yIFJlZ2lzdGVyUHJlc3N1cmUuIElmIHJlcXVpcmVJbnRlcnZhbHMgaXMgZmFsc2UsIExJUyBhcmUgaWdub3JlZC4KKyAgYm9vbCBSZXF1aXJlSW50ZXJ2YWxzOworCisgIC8vLyBUcnVlIGlmIFVudGllZERlZnMgd2lsbCBiZSBwb3B1bGF0ZWQuCisgIGJvb2wgVHJhY2tVbnRpZWREZWZzID0gZmFsc2U7CisKKyAgLy8vIFRydWUgaWYgbGFuZW1hc2tzIHNob3VsZCBiZSB0cmFja2VkLgorICBib29sIFRyYWNrTGFuZU1hc2tzID0gZmFsc2U7CisKKyAgLy8vIFJlZ2lzdGVyIHByZXNzdXJlIGNvcnJlc3BvbmRzIHRvIGxpdmVuZXNzIGJlZm9yZSB0aGlzIGluc3RydWN0aW9uCisgIC8vLyBpdGVyYXRvci4gSXQgbWF5IHBvaW50IHRvIHRoZSBlbmQgb2YgdGhlIGJsb2NrIG9yIGEgRGVidWdWYWx1ZSByYXRoZXIgdGhhbgorICAvLy8gYW4gaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciBDdXJyUG9zOworCisgIC8vLyBQcmVzc3VyZSBtYXAgaW5kZXhlZCBieSBwcmVzc3VyZSBzZXQgSUQsIG5vdCBjbGFzcyBJRC4KKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IEN1cnJTZXRQcmVzc3VyZTsKKworICAvLy8gU2V0IG9mIGxpdmUgcmVnaXN0ZXJzLgorICBMaXZlUmVnU2V0IExpdmVSZWdzOworCisgIC8vLyBTZXQgb2YgdnJlZyBkZWZzIHRoYXQgc3RhcnQgYSBsaXZlIHJhbmdlLgorICBTcGFyc2VTZXQ8dW5zaWduZWQsIFZpcnRSZWcySW5kZXhGdW5jdG9yPiBVbnRpZWREZWZzOworICAvLy8gTGl2ZS10aHJvdWdoIHByZXNzdXJlLgorICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gTGl2ZVRocnVQcmVzc3VyZTsKKworcHVibGljOgorICBSZWdQcmVzc3VyZVRyYWNrZXIoSW50ZXJ2YWxQcmVzc3VyZSAmcnApIDogUChycCksIFJlcXVpcmVJbnRlcnZhbHModHJ1ZSkge30KKyAgUmVnUHJlc3N1cmVUcmFja2VyKFJlZ2lvblByZXNzdXJlICZycCkgOiBQKHJwKSwgUmVxdWlyZUludGVydmFscyhmYWxzZSkge30KKworICB2b2lkIHJlc2V0KCk7CisKKyAgdm9pZCBpbml0KGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqbWYsIGNvbnN0IFJlZ2lzdGVyQ2xhc3NJbmZvICpyY2ksCisgICAgICAgICAgICBjb25zdCBMaXZlSW50ZXJ2YWxzICpsaXMsIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICptYmIsCisgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgcG9zLAorICAgICAgICAgICAgYm9vbCBUcmFja0xhbmVNYXNrcywgYm9vbCBUcmFja1VudGllZERlZnMpOworCisgIC8vLyBGb3JjZSBsaXZlbmVzcyBvZiB2aXJ0dWFsIHJlZ2lzdGVycyBvciBwaHlzaWNhbCByZWdpc3RlcgorICAvLy8gdW5pdHMuIFBhcnRpY3VsYXJseSB1c2VmdWwgdG8gaW5pdGlhbGl6ZSB0aGUgbGl2ZWluL291dCBzdGF0ZSBvZiB0aGUKKyAgLy8vIHRyYWNrZXIgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvIGFkdmFuY2UvcmVjZWRlLgorICB2b2lkIGFkZExpdmVSZWdzKEFycmF5UmVmPFJlZ2lzdGVyTWFza1BhaXI+IFJlZ3MpOworCisgIC8vLyBHZXQgdGhlIE1JIHBvc2l0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyByZWdpc3RlciBwcmVzc3VyZS4KKyAgTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIGdldFBvcygpIGNvbnN0IHsgcmV0dXJuIEN1cnJQb3M7IH0KKworICAvLyBSZXNldCB0aGUgTUkgcG9zaXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgcmVnaXN0ZXIgcHJlc3N1cmUuIFRoaXMgYWxsb3dzCisgIC8vIHNjaGVkdWxlcnMgdG8gbW92ZSBpbnN0cnVjdGlvbnMgYWJvdmUgdGhlIFJlZ1ByZXNzdXJlVHJhY2tlcidzCisgIC8vIEN1cnJQb3MuIFNpbmNlIHRoZSBwcmVzc3VyZSBpcyBjb21wdXRlZCBiZWZvcmUgQ3VyclBvcywgdGhlIGl0ZXJhdG9yCisgIC8vIHBvc2l0aW9uIGNoYW5nZXMgd2hpbGUgcHJlc3N1cmUgZG9lcyBub3QuCisgIHZvaWQgc2V0UG9zKE1hY2hpbmVCYXNpY0Jsb2NrOjpjb25zdF9pdGVyYXRvciBQb3MpIHsgQ3VyclBvcyA9IFBvczsgfQorCisgIC8vLyBSZWNlZGUgYWNyb3NzIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbi4KKyAgdm9pZCByZWNlZGUoU21hbGxWZWN0b3JJbXBsPFJlZ2lzdGVyTWFza1BhaXI+ICpMaXZlVXNlcyA9IG51bGxwdHIpOworCisgIC8vLyBSZWNlZGUgYWNyb3NzIHRoZSBwcmV2aW91cyBpbnN0cnVjdGlvbi4KKyAgLy8vIFRoaXMgImxvdy1sZXZlbCIgdmFyaWFudCBhc3N1bWVzIHRoYXQgcmVjZWRlU2tpcERlYnVnVmFsdWVzKCkgd2FzCisgIC8vLyBjYWxsZWQgcHJldmlvdXNseSBhbmQgdGFrZXMgcHJlY29tcHV0ZWQgUmVnaXN0ZXJPcGVyYW5kcyBmb3IgdGhlCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgdm9pZCByZWNlZGUoY29uc3QgUmVnaXN0ZXJPcGVyYW5kcyAmUmVnT3BlcnMsCisgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxSZWdpc3Rlck1hc2tQYWlyPiAqTGl2ZVVzZXMgPSBudWxscHRyKTsKKworICAvLy8gUmVjZWRlIHVudGlsIHdlIGZpbmQgYW4gaW5zdHJ1Y3Rpb24gd2hpY2ggaXMgbm90IGEgRGVidWdWYWx1ZS4KKyAgdm9pZCByZWNlZGVTa2lwRGVidWdWYWx1ZXMoKTsKKworICAvLy8gQWR2YW5jZSBhY3Jvc3MgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgYWR2YW5jZSgpOworCisgIC8vLyBBZHZhbmNlIGFjcm9zcyB0aGUgY3VycmVudCBpbnN0cnVjdGlvbi4KKyAgLy8vIFRoaXMgaXMgYSAibG93LWxldmVsIiB2YXJpYW50IG9mIGFkdmFuY2UoKSB3aGljaCB0YWtlcyBwcmVjb21wdXRlZAorICAvLy8gUmVnaXN0ZXJPcGVyYW5kcyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgYWR2YW5jZShjb25zdCBSZWdpc3Rlck9wZXJhbmRzICZSZWdPcGVycyk7CisKKyAgLy8vIEZpbmFsaXplIHRoZSByZWdpb24gYm91bmRhcmllcyBhbmQgcmVjb3JlZCBsaXZlIGlucyBhbmQgbGl2ZSBvdXRzLgorICB2b2lkIGNsb3NlUmVnaW9uKCk7CisKKyAgLy8vIEluaXRpYWxpemUgdGhlIExpdmVUaHJ1IHByZXNzdXJlIHNldCBiYXNlZCBvbiB0aGUgdW50aWVkIGRlZnMgZm91bmQgaW4KKyAgLy8vIFJQVHJhY2tlci4KKyAgdm9pZCBpbml0TGl2ZVRocnUoY29uc3QgUmVnUHJlc3N1cmVUcmFja2VyICZSUFRyYWNrZXIpOworCisgIC8vLyBDb3B5IGFuIGV4aXN0aW5nIGxpdmUgdGhydSBwcmVzc3VyZSByZXN1bHQuCisgIHZvaWQgaW5pdExpdmVUaHJ1KEFycmF5UmVmPHVuc2lnbmVkPiBQcmVzc3VyZVNldCkgeworICAgIExpdmVUaHJ1UHJlc3N1cmUuYXNzaWduKFByZXNzdXJlU2V0LmJlZ2luKCksIFByZXNzdXJlU2V0LmVuZCgpKTsKKyAgfQorCisgIEFycmF5UmVmPHVuc2lnbmVkPiBnZXRMaXZlVGhydSgpIGNvbnN0IHsgcmV0dXJuIExpdmVUaHJ1UHJlc3N1cmU7IH0KKworICAvLy8gR2V0IHRoZSByZXN1bHRpbmcgcmVnaXN0ZXIgcHJlc3N1cmUgb3ZlciB0aGUgdHJhdmVyc2VkIHJlZ2lvbi4KKyAgLy8vIFRoaXMgcmVzdWx0IGlzIGNvbXBsZXRlIGlmIGNsb3NlUmVnaW9uKCkgd2FzIGV4cGxpY2l0bHkgaW52b2tlZC4KKyAgUmVnaXN0ZXJQcmVzc3VyZSAmZ2V0UHJlc3N1cmUoKSB7IHJldHVybiBQOyB9CisgIGNvbnN0IFJlZ2lzdGVyUHJlc3N1cmUgJmdldFByZXNzdXJlKCkgY29uc3QgeyByZXR1cm4gUDsgfQorCisgIC8vLyBHZXQgdGhlIHJlZ2lzdGVyIHNldCBwcmVzc3VyZSBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiwgd2hpY2ggbWF5IGJlIGxlc3MKKyAgLy8vIHRoYW4gdGhlIHByZXNzdXJlIGFjcm9zcyB0aGUgdHJhdmVyc2VkIHJlZ2lvbi4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZnZXRSZWdTZXRQcmVzc3VyZUF0UG9zKCkgY29uc3QgeworICAgIHJldHVybiBDdXJyU2V0UHJlc3N1cmU7CisgIH0KKworICBib29sIGlzVG9wQ2xvc2VkKCkgY29uc3Q7CisgIGJvb2wgaXNCb3R0b21DbG9zZWQoKSBjb25zdDsKKworICB2b2lkIGNsb3NlVG9wKCk7CisgIHZvaWQgY2xvc2VCb3R0b20oKTsKKworICAvLy8gQ29uc2lkZXIgdGhlIHByZXNzdXJlIGluY3JlYXNlIGNhdXNlZCBieSB0cmF2ZXJzaW5nIHRoaXMgaW5zdHJ1Y3Rpb24KKyAgLy8vIGJvdHRvbS11cC4gRmluZCB0aGUgcHJlc3N1cmUgc2V0IHdpdGggdGhlIG1vc3QgY2hhbmdlIGJleW9uZCBpdHMgcHJlc3N1cmUKKyAgLy8vIGxpbWl0IGJhc2VkIG9uIHRoZSB0cmFja2VyJ3MgY3VycmVudCBwcmVzc3VyZSwgYW5kIHJlY29yZCB0aGUgbnVtYmVyIG9mCisgIC8vLyBleGNlc3MgcmVnaXN0ZXIgdW5pdHMgb2YgdGhhdCBwcmVzc3VyZSBzZXQgaW50cm9kdWNlZCBieSB0aGlzIGluc3RydWN0aW9uLgorICB2b2lkIGdldE1heFVwd2FyZFByZXNzdXJlRGVsdGEoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXNzdXJlRGlmZiAqUERpZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdQcmVzc3VyZURlbHRhICZEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFByZXNzdXJlQ2hhbmdlPiBDcml0aWNhbFBTZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IE1heFByZXNzdXJlTGltaXQpOworCisgIHZvaWQgZ2V0VXB3YXJkUHJlc3N1cmVEZWx0YShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjb25zdCovIFByZXNzdXJlRGlmZiAmUERpZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdQcmVzc3VyZURlbHRhICZEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFByZXNzdXJlQ2hhbmdlPiBDcml0aWNhbFBTZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IE1heFByZXNzdXJlTGltaXQpIGNvbnN0OworCisgIC8vLyBDb25zaWRlciB0aGUgcHJlc3N1cmUgaW5jcmVhc2UgY2F1c2VkIGJ5IHRyYXZlcnNpbmcgdGhpcyBpbnN0cnVjdGlvbgorICAvLy8gdG9wLWRvd24uIEZpbmQgdGhlIHByZXNzdXJlIHNldCB3aXRoIHRoZSBtb3N0IGNoYW5nZSBiZXlvbmQgaXRzIHByZXNzdXJlCisgIC8vLyBsaW1pdCBiYXNlZCBvbiB0aGUgdHJhY2tlcidzIGN1cnJlbnQgcHJlc3N1cmUsIGFuZCByZWNvcmQgdGhlIG51bWJlciBvZgorICAvLy8gZXhjZXNzIHJlZ2lzdGVyIHVuaXRzIG9mIHRoYXQgcHJlc3N1cmUgc2V0IGludHJvZHVjZWQgYnkgdGhpcyBpbnN0cnVjdGlvbi4KKyAgdm9pZCBnZXRNYXhEb3dud2FyZFByZXNzdXJlRGVsdGEoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnUHJlc3N1cmVEZWx0YSAmRGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFByZXNzdXJlQ2hhbmdlPiBDcml0aWNhbFBTZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gTWF4UHJlc3N1cmVMaW1pdCk7CisKKyAgLy8vIEZpbmQgdGhlIHByZXNzdXJlIHNldCB3aXRoIHRoZSBtb3N0IGNoYW5nZSBiZXlvbmQgaXRzIHByZXNzdXJlIGxpbWl0IGFmdGVyCisgIC8vLyB0cmF2ZXJzaW5nIHRoaXMgaW5zdHJ1Y3Rpb24gZWl0aGVyIHVwd2FyZCBvciBkb3dud2FyZCBkZXBlbmRpbmcgb24gdGhlCisgIC8vLyBjbG9zZWQgZW5kIG9mIHRoZSBjdXJyZW50IHJlZ2lvbi4KKyAgdm9pZCBnZXRNYXhQcmVzc3VyZURlbHRhKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdQcmVzc3VyZURlbHRhICZEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFByZXNzdXJlQ2hhbmdlPiBDcml0aWNhbFBTZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IE1heFByZXNzdXJlTGltaXQpIHsKKyAgICBpZiAoaXNUb3BDbG9zZWQoKSkKKyAgICAgIHJldHVybiBnZXRNYXhEb3dud2FyZFByZXNzdXJlRGVsdGEoTUksIERlbHRhLCBDcml0aWNhbFBTZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXhQcmVzc3VyZUxpbWl0KTsKKworICAgIGFzc2VydChpc0JvdHRvbUNsb3NlZCgpICYmICJVbmluaXRpYWxpemVkIHByZXNzdXJlIHRyYWNrZXIiKTsKKyAgICByZXR1cm4gZ2V0TWF4VXB3YXJkUHJlc3N1cmVEZWx0YShNSSwgbnVsbHB0ciwgRGVsdGEsIENyaXRpY2FsUFNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWF4UHJlc3N1cmVMaW1pdCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBwcmVzc3VyZSBvZiBlYWNoIFBTZXQgYWZ0ZXIgdHJhdmVyc2luZyB0aGlzIGluc3RydWN0aW9uIGJvdHRvbS11cC4KKyAgdm9pZCBnZXRVcHdhcmRQcmVzc3VyZShjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmUHJlc3N1cmVSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZNYXhQcmVzc3VyZVJlc3VsdCk7CisKKyAgLy8vIEdldCB0aGUgcHJlc3N1cmUgb2YgZWFjaCBQU2V0IGFmdGVyIHRyYXZlcnNpbmcgdGhpcyBpbnN0cnVjdGlvbiB0b3AtZG93bi4KKyAgdm9pZCBnZXREb3dud2FyZFByZXNzdXJlKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gJlByZXNzdXJlUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZNYXhQcmVzc3VyZVJlc3VsdCk7CisKKyAgdm9pZCBnZXRQcmVzc3VyZUFmdGVySW5zdChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiAmUHJlc3N1cmVSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+ICZNYXhQcmVzc3VyZVJlc3VsdCkgeworICAgIGlmIChpc1RvcENsb3NlZCgpKQorICAgICAgcmV0dXJuIGdldFVwd2FyZFByZXNzdXJlKE1JLCBQcmVzc3VyZVJlc3VsdCwgTWF4UHJlc3N1cmVSZXN1bHQpOworCisgICAgYXNzZXJ0KGlzQm90dG9tQ2xvc2VkKCkgJiYgIlVuaW5pdGlhbGl6ZWQgcHJlc3N1cmUgdHJhY2tlciIpOworICAgIHJldHVybiBnZXREb3dud2FyZFByZXNzdXJlKE1JLCBQcmVzc3VyZVJlc3VsdCwgTWF4UHJlc3N1cmVSZXN1bHQpOworICB9CisKKyAgYm9vbCBoYXNVbnRpZWREZWYodW5zaWduZWQgVmlydFJlZykgY29uc3QgeworICAgIHJldHVybiBVbnRpZWREZWZzLmNvdW50KFZpcnRSZWcpOworICB9CisKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgLy8vIEFkZCBSZWcgdG8gdGhlIGxpdmUgb3V0IHNldCBhbmQgaW5jcmVhc2UgbWF4IHByZXNzdXJlLgorICB2b2lkIGRpc2NvdmVyTGl2ZU91dChSZWdpc3Rlck1hc2tQYWlyIFBhaXIpOworICAvLy8gQWRkIFJlZyB0byB0aGUgbGl2ZSBpbiBzZXQgYW5kIGluY3JlYXNlIG1heCBwcmVzc3VyZS4KKyAgdm9pZCBkaXNjb3ZlckxpdmVJbihSZWdpc3Rlck1hc2tQYWlyIFBhaXIpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBTbG90SW5kZXggZm9yIHRoZSBmaXJzdCBub25kZWJ1ZyBpbnN0cnVjdGlvbiBpbmNsdWRpbmcgb3IKKyAgLy8vIGFmdGVyIHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICBTbG90SW5kZXggZ2V0Q3VyclNsb3QoKSBjb25zdDsKKworICB2b2lkIGluY3JlYXNlUmVnUHJlc3N1cmUodW5zaWduZWQgUmVnVW5pdCwgTGFuZUJpdG1hc2sgUHJldmlvdXNNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTGFuZUJpdG1hc2sgTmV3TWFzayk7CisgIHZvaWQgZGVjcmVhc2VSZWdQcmVzc3VyZSh1bnNpZ25lZCBSZWdVbml0LCBMYW5lQml0bWFzayBQcmV2aW91c01hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMYW5lQml0bWFzayBOZXdNYXNrKTsKKworICB2b2lkIGJ1bXBEZWFkRGVmcyhBcnJheVJlZjxSZWdpc3Rlck1hc2tQYWlyPiBEZWFkRGVmcyk7CisKKyAgdm9pZCBidW1wVXB3YXJkUHJlc3N1cmUoY29uc3QgTWFjaGluZUluc3RyICpNSSk7CisgIHZvaWQgYnVtcERvd253YXJkUHJlc3N1cmUoY29uc3QgTWFjaGluZUluc3RyICpNSSk7CisKKyAgdm9pZCBkaXNjb3ZlckxpdmVJbk9yT3V0KFJlZ2lzdGVyTWFza1BhaXIgUGFpciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxSZWdpc3Rlck1hc2tQYWlyPiAmTGl2ZUluT3JPdXQpOworCisgIExhbmVCaXRtYXNrIGdldExhc3RVc2VkTGFuZXModW5zaWduZWQgUmVnVW5pdCwgU2xvdEluZGV4IFBvcykgY29uc3Q7CisgIExhbmVCaXRtYXNrIGdldExpdmVMYW5lc0F0KHVuc2lnbmVkIFJlZ1VuaXQsIFNsb3RJbmRleCBQb3MpIGNvbnN0OworICBMYW5lQml0bWFzayBnZXRMaXZlVGhyb3VnaEF0KHVuc2lnbmVkIFJlZ1VuaXQsIFNsb3RJbmRleCBQb3MpIGNvbnN0OworfTsKKwordm9pZCBkdW1wUmVnU2V0UHJlc3N1cmUoQXJyYXlSZWY8dW5zaWduZWQ+IFNldFByZXNzdXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1JFR0lTVEVSUFJFU1NVUkVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1JlZ2lzdGVyU2NhdmVuZ2luZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1JlZ2lzdGVyU2NhdmVuZ2luZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4OWM3MmIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUmVnaXN0ZXJTY2F2ZW5naW5nLmgKQEAgLTAsMCArMSwyMzEgQEAKKy8vPT09LSBSZWdpc3RlclNjYXZlbmdpbmcuaCAtIE1hY2hpbmUgcmVnaXN0ZXIgc2NhdmVuZ2luZyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBtYWNoaW5lIHJlZ2lzdGVyIHNjYXZlbmdlciBjbGFzcy4gSXQgY2FuIHByb3ZpZGUKKy8vLyBpbmZvcm1hdGlvbiBzdWNoIGFzIHVudXNlZCByZWdpc3RlciBhdCBhbnkgcG9pbnQgaW4gYSBtYWNoaW5lIGJhc2ljIGJsb2NrLgorLy8vIEl0IGFsc28gcHJvdmlkZXMgYSBtZWNoYW5pc20gdG8gbWFrZSByZWdpc3RlcnMgYXZhaWxhYmxlIGJ5IGV2aWN0aW5nIHRoZW0KKy8vLyB0byBzcGlsbCBzbG90cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9SRUdJU1RFUlNDQVZFTkdJTkdfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fUkVHSVNURVJTQ0FWRU5HSU5HX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0JpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0xpdmVSZWdVbml0cy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9MYW5lQml0bWFzay5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIFRhcmdldEluc3RySW5mbzsKK2NsYXNzIFRhcmdldFJlZ2lzdGVyQ2xhc3M7CitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CisKK2NsYXNzIFJlZ1NjYXZlbmdlciB7CisgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJOworICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSTsKKyAgTWFjaGluZVJlZ2lzdGVySW5mbyogTVJJOworICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCID0gbnVsbHB0cjsKKyAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1CQkk7CisgIHVuc2lnbmVkIE51bVJlZ1VuaXRzID0gMDsKKworICAvLy8gVHJ1ZSBpZiBSZWdTY2F2ZW5nZXIgaXMgY3VycmVudGx5IHRyYWNraW5nIHRoZSBsaXZlbmVzcyBvZiByZWdpc3RlcnMuCisgIGJvb2wgVHJhY2tpbmcgPSBmYWxzZTsKKworICAvLy8gSW5mb3JtYXRpb24gb24gc2NhdmVuZ2VkIHJlZ2lzdGVycyAoaGVsZCBpbiBhIHNwaWxsIHNsb3QpLgorICBzdHJ1Y3QgU2NhdmVuZ2VkSW5mbyB7CisgICAgU2NhdmVuZ2VkSW5mbyhpbnQgRkkgPSAtMSkgOiBGcmFtZUluZGV4KEZJKSB7fQorCisgICAgLy8vIEEgc3BpbGwgc2xvdCB1c2VkIGZvciBzY2F2ZW5naW5nIGEgcmVnaXN0ZXIgcG9zdCByZWdpc3RlciBhbGxvY2F0aW9uLgorICAgIGludCBGcmFtZUluZGV4OworCisgICAgLy8vIElmIG5vbi16ZXJvLCB0aGUgc3BlY2lmaWMgcmVnaXN0ZXIgaXMgY3VycmVudGx5IGJlaW5nCisgICAgLy8vIHNjYXZlbmdlZC4gVGhhdCBpcywgaXQgaXMgc3BpbGxlZCB0byB0aGlzIHNjYXZlbmdpbmcgc3RhY2sgc2xvdC4KKyAgICB1bnNpZ25lZCBSZWcgPSAwOworCisgICAgLy8vIFRoZSBpbnN0cnVjdGlvbiB0aGF0IHJlc3RvcmVzIHRoZSBzY2F2ZW5nZWQgcmVnaXN0ZXIgZnJvbSBzdGFjay4KKyAgICBjb25zdCBNYWNoaW5lSW5zdHIgKlJlc3RvcmUgPSBudWxscHRyOworICB9OworCisgIC8vLyBBIHZlY3RvciBvZiBpbmZvcm1hdGlvbiBvbiBzY2F2ZW5nZWQgcmVnaXN0ZXJzLgorICBTbWFsbFZlY3RvcjxTY2F2ZW5nZWRJbmZvLCAyPiBTY2F2ZW5nZWQ7CisKKyAgTGl2ZVJlZ1VuaXRzIExpdmVVbml0czsKKworICAvLyBUaGVzZSBCaXRWZWN0b3JzIGFyZSBvbmx5IHVzZWQgaW50ZXJuYWxseSB0byBmb3J3YXJkKCkuIFRoZXkgYXJlIG1lbWJlcnMKKyAgLy8gdG8gYXZvaWQgZnJlcXVlbnQgcmVhbGxvY2F0aW9ucy4KKyAgQml0VmVjdG9yIEtpbGxSZWdVbml0cywgRGVmUmVnVW5pdHM7CisgIEJpdFZlY3RvciBUbXBSZWdVbml0czsKKworcHVibGljOgorICBSZWdTY2F2ZW5nZXIoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFN0YXJ0IHRyYWNraW5nIGxpdmVuZXNzIGZyb20gdGhlIGJlZ2luIG9mIGJhc2ljIGJsb2NrIFxwIE1CQi4KKyAgdm9pZCBlbnRlckJhc2ljQmxvY2soTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisKKyAgLy8vIFN0YXJ0IHRyYWNraW5nIGxpdmVuZXNzIGZyb20gdGhlIGVuZCBvZiBiYXNpYyBibG9jayBccCBNQkIuCisgIC8vLyBVc2UgYmFja3dhcmQoKSB0byBtb3ZlIHRvd2FyZHMgdGhlIGJlZ2lubmluZyBvZiB0aGUgYmxvY2suIFRoaXMgaXMKKyAgLy8vIHByZWZlcnJlZCB0byBlbnRlckJhc2ljQmxvY2soKSBhbmQgZm9yd2FyZCgpIGJlY2F1c2UgaXQgZG9lcyBub3QgZGVwZW5kCisgIC8vLyBvbiB0aGUgcHJlc2VuY2Ugb2Yga2lsbCBmbGFncy4KKyAgdm9pZCBlbnRlckJhc2ljQmxvY2tFbmQoTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisKKyAgLy8vIE1vdmUgdGhlIGludGVybmFsIE1CQiBpdGVyYXRvciBhbmQgdXBkYXRlIHJlZ2lzdGVyIHN0YXRlcy4KKyAgdm9pZCBmb3J3YXJkKCk7CisKKyAgLy8vIE1vdmUgdGhlIGludGVybmFsIE1CQiBpdGVyYXRvciBhbmQgdXBkYXRlIHJlZ2lzdGVyIHN0YXRlcyB1bnRpbAorICAvLy8gaXQgaGFzIHByb2Nlc3NlZCB0aGUgc3BlY2lmaWMgaXRlcmF0b3IuCisgIHZvaWQgZm9yd2FyZChNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSkgeworICAgIGlmICghVHJhY2tpbmcgJiYgTUJCLT5iZWdpbigpICE9IEkpIGZvcndhcmQoKTsKKyAgICB3aGlsZSAoTUJCSSAhPSBJKSBmb3J3YXJkKCk7CisgIH0KKworICAvLy8gSW52ZXJ0IHRoZSBiZWhhdmlvciBvZiBmb3J3YXJkKCkgb24gdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gKHVuZG8gdGhlCisgIC8vLyBjaGFuZ2VzIHRvIHRoZSBhdmFpbGFibGUgcmVnaXN0ZXJzIG1hZGUgYnkgZm9yd2FyZCgpKS4KKyAgdm9pZCB1bnByb2Nlc3MoKTsKKworICAvLy8gVW5wcm9jZXNzIGluc3RydWN0aW9ucyB1bnRpbCB5b3UgcmVhY2ggdGhlIHByb3ZpZGVkIGl0ZXJhdG9yLgorICB2b2lkIHVucHJvY2VzcyhNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSkgeworICAgIHdoaWxlIChNQkJJICE9IEkpIHVucHJvY2VzcygpOworICB9CisKKyAgLy8vIFVwZGF0ZSBpbnRlcm5hbCByZWdpc3RlciBzdGF0ZSBhbmQgbW92ZSBNQkIgaXRlcmF0b3IgYmFja3dhcmRzLgorICAvLy8gQ29udHJhcnkgdG8gdW5wcm9jZXNzKCkgdGhpcyBtZXRob2QgZ2l2ZXMgcHJlY2lzZSByZXN1bHRzIGV2ZW4gaW4gdGhlCisgIC8vLyBhYnNlbmNlIG9mIGtpbGwgZmxhZ3MuCisgIHZvaWQgYmFja3dhcmQoKTsKKworICAvLy8gQ2FsbCBiYWNrd2FyZCgpIGFzIGxvbmcgYXMgdGhlIGludGVybmFsIGl0ZXJhdG9yIGRvZXMgbm90IHBvaW50IHRvIFxwIEkuCisgIHZvaWQgYmFja3dhcmQoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEkpIHsKKyAgICB3aGlsZSAoTUJCSSAhPSBJKQorICAgICAgYmFja3dhcmQoKTsKKyAgfQorCisgIC8vLyBNb3ZlIHRoZSBpbnRlcm5hbCBNQkIgaXRlcmF0b3IgYnV0IGRvIG5vdCB1cGRhdGUgcmVnaXN0ZXIgc3RhdGVzLgorICB2b2lkIHNraXBUbyhNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSSkgeworICAgIGlmIChJID09IE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvcihudWxscHRyKSkKKyAgICAgIFRyYWNraW5nID0gZmFsc2U7CisgICAgTUJCSSA9IEk7CisgIH0KKworICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgZ2V0Q3VycmVudFBvc2l0aW9uKCkgY29uc3QgeyByZXR1cm4gTUJCSTsgfQorCisgIC8vLyBSZXR1cm4gaWYgYSBzcGVjaWZpYyByZWdpc3RlciBpcyBjdXJyZW50bHkgdXNlZC4KKyAgYm9vbCBpc1JlZ1VzZWQodW5zaWduZWQgUmVnLCBib29sIGluY2x1ZGVSZXNlcnZlZCA9IHRydWUpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYWxsIGF2YWlsYWJsZSByZWdpc3RlcnMgaW4gdGhlIHJlZ2lzdGVyIGNsYXNzIGluIE1hc2suCisgIEJpdFZlY3RvciBnZXRSZWdzQXZhaWxhYmxlKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKTsKKworICAvLy8gRmluZCBhbiB1bnVzZWQgcmVnaXN0ZXIgb2YgdGhlIHNwZWNpZmllZCByZWdpc3RlciBjbGFzcy4KKyAgLy8vIFJldHVybiAwIGlmIG5vbmUgaXMgZm91bmQuCisgIHVuc2lnbmVkIEZpbmRVbnVzZWRSZWcoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUmVnQ2xhc3MpIGNvbnN0OworCisgIC8vLyBBZGQgYSBzY2F2ZW5naW5nIGZyYW1lIGluZGV4LgorICB2b2lkIGFkZFNjYXZlbmdpbmdGcmFtZUluZGV4KGludCBGSSkgeworICAgIFNjYXZlbmdlZC5wdXNoX2JhY2soU2NhdmVuZ2VkSW5mbyhGSSkpOworICB9CisKKyAgLy8vIFF1ZXJ5IHdoZXRoZXIgYSBmcmFtZSBpbmRleCBpcyBhIHNjYXZlbmdpbmcgZnJhbWUgaW5kZXguCisgIGJvb2wgaXNTY2F2ZW5naW5nRnJhbWVJbmRleChpbnQgRkkpIGNvbnN0IHsKKyAgICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxTY2F2ZW5nZWRJbmZvPjo6Y29uc3RfaXRlcmF0b3IgSSA9IFNjYXZlbmdlZC5iZWdpbigpLAorICAgICAgICAgSUUgPSBTY2F2ZW5nZWQuZW5kKCk7IEkgIT0gSUU7ICsrSSkKKyAgICAgIGlmIChJLT5GcmFtZUluZGV4ID09IEZJKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBHZXQgYW4gYXJyYXkgb2Ygc2NhdmVuZ2luZyBmcmFtZSBpbmRpY2VzLgorICB2b2lkIGdldFNjYXZlbmdpbmdGcmFtZUluZGljZXMoU21hbGxWZWN0b3JJbXBsPGludD4gJkEpIGNvbnN0IHsKKyAgICBmb3IgKFNtYWxsVmVjdG9ySW1wbDxTY2F2ZW5nZWRJbmZvPjo6Y29uc3RfaXRlcmF0b3IgSSA9IFNjYXZlbmdlZC5iZWdpbigpLAorICAgICAgICAgSUUgPSBTY2F2ZW5nZWQuZW5kKCk7IEkgIT0gSUU7ICsrSSkKKyAgICAgIGlmIChJLT5GcmFtZUluZGV4ID49IDApCisgICAgICAgIEEucHVzaF9iYWNrKEktPkZyYW1lSW5kZXgpOworICB9CisKKyAgLy8vIE1ha2UgYSByZWdpc3RlciBvZiB0aGUgc3BlY2lmaWMgcmVnaXN0ZXIgY2xhc3MKKyAgLy8vIGF2YWlsYWJsZSBhbmQgZG8gdGhlIGFwcHJvcHJpYXRlIGJvb2trZWVwaW5nLiBTUEFkaiBpcyB0aGUgc3RhY2sKKyAgLy8vIGFkanVzdG1lbnQgZHVlIHRvIGNhbGwgZnJhbWUsIGl0J3MgcGFzc2VkIGFsb25nIHRvIGVsaW1pbmF0ZUZyYW1lSW5kZXgoKS4KKyAgLy8vIFJldHVybnMgdGhlIHNjYXZlbmdlZCByZWdpc3Rlci4KKyAgLy8vIFRoaXMgaXMgZGVwcmVjYXRlZCBhcyBpdCBkZXBlbmRzIG9uIHRoZSBxdWFsaXR5IG9mIHRoZSBraWxsIGZsYWdzIGJlaW5nCisgIC8vLyBwcmVzZW50OyBVc2Ugc2NhdmVuZ2VSZWdpc3RlckJhY2t3YXJkcygpIGluc3RlYWQhCisgIHVuc2lnbmVkIHNjYXZlbmdlUmVnaXN0ZXIoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUmVnQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksIGludCBTUEFkaik7CisgIHVuc2lnbmVkIHNjYXZlbmdlUmVnaXN0ZXIoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUmVnQ2xhc3MsIGludCBTUEFkaikgeworICAgIHJldHVybiBzY2F2ZW5nZVJlZ2lzdGVyKFJlZ0NsYXNzLCBNQkJJLCBTUEFkaik7CisgIH0KKworICAvLy8gTWFrZSBhIHJlZ2lzdGVyIG9mIHRoZSBzcGVjaWZpYyByZWdpc3RlciBjbGFzcyBhdmFpbGFibGUgZnJvbSB0aGUgY3VycmVudAorICAvLy8gcG9zaXRpb24gYmFja3dhcmRzIHRvIHRoZSBwbGFjZSBiZWZvcmUgXHAgVG8uIElmIFxwIFJlc3RvcmVBZnRlciBpcyB0cnVlCisgIC8vLyB0aGlzIGluY2x1ZGVzIHRoZSBpbnN0cnVjdGlvbiBmb2xsb3dpbmcgdGhlIGN1cnJlbnQgcG9zaXRpb24uCisgIC8vLyBTUEFkaiBpcyB0aGUgc3RhY2sgYWRqdXN0bWVudCBkdWUgdG8gY2FsbCBmcmFtZSwgaXQncyBwYXNzZWQgYWxvbmcgdG8KKyAgLy8vIGVsaW1pbmF0ZUZyYW1lSW5kZXgoKS4KKyAgLy8vIFJldHVybnMgdGhlIHNjYXZlbmdlZCByZWdpc3Rlci4KKyAgdW5zaWduZWQgc2NhdmVuZ2VSZWdpc3RlckJhY2t3YXJkcyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICZSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZXN0b3JlQWZ0ZXIsIGludCBTUEFkaik7CisKKyAgLy8vIFRlbGwgdGhlIHNjYXZlbmdlciBhIHJlZ2lzdGVyIGlzIHVzZWQuCisgIHZvaWQgc2V0UmVnVXNlZCh1bnNpZ25lZCBSZWcsIExhbmVCaXRtYXNrIExhbmVNYXNrID0gTGFuZUJpdG1hc2s6OmdldEFsbCgpKTsKKworcHJpdmF0ZToKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhIHJlZ2lzdGVyIGlzIHJlc2VydmVkLiBJdCBpcyBuZXZlciAidW51c2VkIi4KKyAgYm9vbCBpc1Jlc2VydmVkKHVuc2lnbmVkIFJlZykgY29uc3QgeyByZXR1cm4gTVJJLT5pc1Jlc2VydmVkKFJlZyk7IH0KKworICAvLy8gc2V0VXNlZCAvIHNldFVudXNlZCAtIE1hcmsgdGhlIHN0YXRlIG9mIG9uZSBvciBhIG51bWJlciBvZiByZWdpc3RlciB1bml0cy4KKyAgLy8vCisgIHZvaWQgc2V0VXNlZChjb25zdCBCaXRWZWN0b3IgJlJlZ1VuaXRzKSB7CisgICAgTGl2ZVVuaXRzLmFkZFVuaXRzKFJlZ1VuaXRzKTsKKyAgfQorICB2b2lkIHNldFVudXNlZChjb25zdCBCaXRWZWN0b3IgJlJlZ1VuaXRzKSB7CisgICAgTGl2ZVVuaXRzLnJlbW92ZVVuaXRzKFJlZ1VuaXRzKTsKKyAgfQorCisgIC8vLyBQcm9jZXNzZXMgdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gYW5kIGZpbGwgdGhlIEtpbGxSZWdVbml0cyBhbmQKKyAgLy8vIERlZlJlZ1VuaXRzIGJpdCB2ZWN0b3JzLgorICB2b2lkIGRldGVybWluZUtpbGxzQW5kRGVmcygpOworCisgIC8vLyBBZGQgYWxsIFJlZyBVbml0cyB0aGF0IFJlZyBjb250YWlucyB0byBCVi4KKyAgdm9pZCBhZGRSZWdVbml0cyhCaXRWZWN0b3IgJkJWLCB1bnNpZ25lZCBSZWcpOworCisgIC8vLyBSZW1vdmUgYWxsIFJlZyBVbml0cyB0aGF0IFxwIFJlZyBjb250YWlucyBmcm9tIFxwIEJWLgorICB2b2lkIHJlbW92ZVJlZ1VuaXRzKEJpdFZlY3RvciAmQlYsIHVuc2lnbmVkIFJlZyk7CisKKyAgLy8vIFJldHVybiB0aGUgY2FuZGlkYXRlIHJlZ2lzdGVyIHRoYXQgaXMgdW51c2VkIGZvciB0aGUgbG9uZ2VzdCBhZnRlcgorICAvLy8gU3RhcnRNSS4gVXNlTUkgaXMgc2V0IHRvIHRoZSBpbnN0cnVjdGlvbiB3aGVyZSB0aGUgc2VhcmNoIHN0b3BwZWQuCisgIC8vLworICAvLy8gTm8gbW9yZSB0aGFuIEluc3RyTGltaXQgaW5zdHJ1Y3Rpb25zIGFyZSBpbnNwZWN0ZWQuCisgIHVuc2lnbmVkIGZpbmRTdXJ2aXZvclJlZyhNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgU3RhcnRNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFZlY3RvciAmQ2FuZGlkYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluc3RyTGltaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJlVzZU1JKTsKKworICAvLy8gSW5pdGlhbGl6ZSBSZWdpc3RlclNjYXZlbmdlci4KKyAgdm9pZCBpbml0KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIpOworCisgIC8vLyBNYXJrIGxpdmUtaW4gcmVnaXN0ZXJzIG9mIGJhc2ljIGJsb2NrIGFzIHVzZWQuCisgIHZvaWQgc2V0TGl2ZUluc1VzZWQoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJk1CQik7CisKKyAgLy8vIFNwaWxsIGEgcmVnaXN0ZXIgYWZ0ZXIgcG9zaXRpb24gXHAgQWZ0ZXIgYW5kIHJlbG9hZCBpdCBiZWZvcmUgcG9zaXRpb24KKyAgLy8vIFxwIFVzZU1JLgorICBTY2F2ZW5nZWRJbmZvICZzcGlsbCh1bnNpZ25lZCBSZWcsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgJlJDLCBpbnQgU1BBZGosCisgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBBZnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZVc2VNSSk7Cit9OworCisvLy8gUmVwbGFjZXMgYWxsIGZyYW1lIGluZGV4IHZpcnR1YWwgcmVnaXN0ZXJzIHdpdGggcGh5c2ljYWwgcmVnaXN0ZXJzLiBVc2VzIHRoZQorLy8vIHJlZ2lzdGVyIHNjYXZlbmdlciB0byBmaW5kIGFuIGFwcHJvcHJpYXRlIHJlZ2lzdGVyIHRvIHVzZS4KK3ZvaWQgc2NhdmVuZ2VGcmFtZVZpcnR1YWxSZWdzKE1hY2hpbmVGdW5jdGlvbiAmTUYsIFJlZ1NjYXZlbmdlciAmUlMpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1JFR0lTVEVSU0NBVkVOR0lOR19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUmVnaXN0ZXJVc2FnZUluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZWdpc3RlclVzYWdlSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhYmFkZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUmVnaXN0ZXJVc2FnZUluZm8uaApAQCAtMCwwICsxLDc3IEBACisvLz09LSBSZWdpc3RlclVzYWdlSW5mby5oIC0gUmVnaXN0ZXIgVXNhZ2UgSW5mb3JtYXJ0aW9uIFN0b3JhZ2UgLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gVGhpcyBwYXNzIGlzIHJlcXVpcmVkIHRvIHRha2UgYWR2YW50YWdlIG9mIHRoZSBpbnRlcnByb2NlZHVyYWwgcmVnaXN0ZXIKKy8vLyBhbGxvY2F0aW9uIGluZnJhc3RydWN0dXJlLgorLy8vCisvLy8gVGhpcyBwYXNzIGlzIHNpbXBsZSBpbW11dGFibGUgcGFzcyB3aGljaCBrZWVwcyBSZWdNYXNrcyAoY2FsY3VsYXRlZCBiYXNlZCBvbgorLy8vIGFjdHVhbCByZWdpc3RlciBhbGxvY2F0aW9uKSBmb3IgZnVuY3Rpb25zIGluIGEgbW9kdWxlIGFuZCBwcm92aWRlcyBzaW1wbGUKKy8vLyBBUEkgdG8gcXVlcnkgdGhpcyBpbmZvcm1hdGlvbi4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fUEhZU0lDQUxSRUdJU1RFUlVTQUdFSU5GT19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9QSFlTSUNBTFJFR0lTVEVSVVNBR0VJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIFRhcmdldE1hY2hpbmU7CisKK2NsYXNzIFBoeXNpY2FsUmVnaXN0ZXJVc2FnZUluZm8gOiBwdWJsaWMgSW1tdXRhYmxlUGFzcyB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBQaHlzaWNhbFJlZ2lzdGVyVXNhZ2VJbmZvKCkgOiBJbW11dGFibGVQYXNzKElEKSB7CisgICAgUGFzc1JlZ2lzdHJ5ICZSZWdpc3RyeSA9ICpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpOworICAgIGluaXRpYWxpemVQaHlzaWNhbFJlZ2lzdGVyVXNhZ2VJbmZvUGFzcyhSZWdpc3RyeSk7CisgIH0KKworICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBBVS5zZXRQcmVzZXJ2ZXNBbGwoKTsKKyAgfQorCisgIC8vLyBUbyBzZXQgVGFyZ2V0TWFjaGluZSAqLCB3aGljaCBpcyB1c2VkIHRvIHByaW50CisgIC8vLyBhbmFseXNpcyB3aGVuIGNvbW1hbmQgbGluZSBvcHRpb24gLXByaW50LXJlZ3VzYWdlIGlzIHVzZWQuCisgIHZvaWQgc2V0VGFyZ2V0TWFjaGluZShjb25zdCBUYXJnZXRNYWNoaW5lICpUTV8pIHsgVE0gPSBUTV87IH0KKworICBib29sIGRvSW5pdGlhbGl6YXRpb24oTW9kdWxlICZNKSBvdmVycmlkZTsKKworICBib29sIGRvRmluYWxpemF0aW9uKE1vZHVsZSAmTSkgb3ZlcnJpZGU7CisKKyAgLy8vIFRvIHN0b3JlIFJlZ01hc2sgZm9yIGdpdmVuIEZ1bmN0aW9uICouCisgIHZvaWQgc3RvcmVVcGRhdGVSZWdVc2FnZUluZm8oY29uc3QgRnVuY3Rpb24gKkZQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBSZWdNYXNrKTsKKworICAvLy8gVG8gcXVlcnkgc3RvcmVkIFJlZ01hc2sgZm9yIGdpdmVuIEZ1bmN0aW9uICosIGl0IHdpbGwgcmV0dXJuIG51bGxwdHIgaWYKKyAgLy8vIGZ1bmN0aW9uIGlzIG5vdCBrbm93bi4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDMyX3Q+ICpnZXRSZWdVc2FnZUluZm8oY29uc3QgRnVuY3Rpb24gKkZQKTsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlICpNID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIC8vLyBBIERlbnNlIG1hcCBmcm9tIEZ1bmN0aW9uICogdG8gUmVnTWFzay4KKyAgLy8vIEluIFJlZ01hc2sgMCBtZWFucyByZWdpc3RlciB1c2VkIChjbG9iYmVyZWQpIGJ5IGZ1bmN0aW9uLgorICAvLy8gYW5kIDEgbWVhbnMgY29udGVudCBvZiByZWdpc3RlciB3aWxsIGJlIHByZXNlcnZlZCBhcm91bmQgZnVuY3Rpb24gY2FsbC4KKyAgRGVuc2VNYXA8Y29uc3QgRnVuY3Rpb24gKiwgc3RkOjp2ZWN0b3I8dWludDMyX3Q+PiBSZWdNYXNrczsKKworICBjb25zdCBUYXJnZXRNYWNoaW5lICpUTTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fUEhZU0lDQUxSRUdJU1RFUlVTQUdFSU5GT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUmVzb3VyY2VQcmlvcml0eVF1ZXVlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUmVzb3VyY2VQcmlvcml0eVF1ZXVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMxNjZjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SZXNvdXJjZVByaW9yaXR5UXVldWUuaApAQCAtMCwwICsxLDEzNiBAQAorLy89PT0tLS0tLSBSZXNvdXJjZVByaW9yaXR5UXVldWUuaCAtIEEgREZBLW9yaWVudGVkIHByaW9yaXR5IHF1ZXVlIC0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBSZXNvdXJjZVByaW9yaXR5UXVldWUgY2xhc3MsIHdoaWNoIGlzIGEKKy8vIFNjaGVkdWxpbmdQcmlvcml0eVF1ZXVlIHRoYXQgc2NoZWR1bGVzIHVzaW5nIERGQSBzdGF0ZSB0bworLy8gcmVkdWNlIHRoZSBsZW5ndGggb2YgdGhlIGNyaXRpY2FsIHBhdGggdGhyb3VnaCB0aGUgYmFzaWMgYmxvY2sKKy8vIG9uIFZMSVcgcGxhdGZvcm1zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1JFU09VUkNFUFJJT1JJVFlRVUVVRV9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9SRVNPVVJDRVBSSU9SSVRZUVVFVUVfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0RGQVBhY2tldGl6ZXIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUcuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHSVNlbC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3RySXRpbmVyYXJpZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBSZXNvdXJjZVByaW9yaXR5UXVldWU7CisKKyAgLy8vIFNvcnRpbmcgZnVuY3Rpb25zIGZvciB0aGUgQXZhaWxhYmxlIHF1ZXVlLgorICBzdHJ1Y3QgcmVzb3VyY2Vfc29ydCB7CisgICAgUmVzb3VyY2VQcmlvcml0eVF1ZXVlICpQUTsKKyAgICBleHBsaWNpdCByZXNvdXJjZV9zb3J0KFJlc291cmNlUHJpb3JpdHlRdWV1ZSAqcHEpIDogUFEocHEpIHt9CisKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgU1VuaXQqIGxlZnQsIGNvbnN0IFNVbml0KiByaWdodCkgY29uc3Q7CisgIH07CisKKyAgY2xhc3MgUmVzb3VyY2VQcmlvcml0eVF1ZXVlIDogcHVibGljIFNjaGVkdWxpbmdQcmlvcml0eVF1ZXVlIHsKKyAgICAvLy8gU1VuaXRzIC0gVGhlIFNVbml0cyBmb3IgdGhlIGN1cnJlbnQgZ3JhcGguCisgICAgc3RkOjp2ZWN0b3I8U1VuaXQ+ICpTVW5pdHM7CisKKyAgICAvLy8gTnVtTm9kZXNTb2xlbHlCbG9ja2luZyAtIFRoaXMgdmVjdG9yIGNvbnRhaW5zLCBmb3IgZXZlcnkgbm9kZSBpbiB0aGUKKyAgICAvLy8gUXVldWUsIHRoZSBudW1iZXIgb2Ygbm9kZXMgdGhhdCB0aGUgbm9kZSBpcyB0aGUgc29sZSB1bnNjaGVkdWxlZAorICAgIC8vLyBwcmVkZWNlc3NvciBmb3IuICBUaGlzIGlzIHVzZWQgYXMgYSB0aWUtYnJlYWtlciBoZXVyaXN0aWMgZm9yIGJldHRlcgorICAgIC8vLyBtb2JpbGl0eS4KKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gTnVtTm9kZXNTb2xlbHlCbG9ja2luZzsKKworICAgIC8vLyBRdWV1ZSAtIFRoZSBxdWV1ZS4KKyAgICBzdGQ6OnZlY3RvcjxTVW5pdCo+IFF1ZXVlOworCisgICAgLy8vIFJlZ1ByZXNzdXJlIC0gVHJhY2tpbmcgY3VycmVudCByZWcgcHJlc3N1cmUgcGVyIHJlZ2lzdGVyIGNsYXNzLgorICAgIC8vLworICAgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBSZWdQcmVzc3VyZTsKKworICAgIC8vLyBSZWdMaW1pdCAtIFRyYWNraW5nIHRoZSBudW1iZXIgb2YgYWxsb2NhdGFibGUgcmVnaXN0ZXJzIHBlciByZWdpc3RlcgorICAgIC8vLyBjbGFzcy4KKyAgICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gUmVnTGltaXQ7CisKKyAgICByZXNvdXJjZV9zb3J0IFBpY2tlcjsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSTsKKyAgICBjb25zdCBUYXJnZXRMb3dlcmluZyAqVExJOworICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJOworICAgIGNvbnN0IEluc3RySXRpbmVyYXJ5RGF0YSogSW5zdHJJdGluczsKKyAgICAvLy8gUmVzb3VyY2VzTW9kZWwgLSBSZXByZXNlbnRzIFZMSVcgc3RhdGUuCisgICAgLy8vIE5vdCBsaW1pdGVkIHRvIFZMSVcgdGFyZ2V0cyBwZXIgc2F5LCBidXQgYXNzdW1lcworICAgIC8vLyBkZWZpbml0aW9uIG9mIERGQSBieSBhIHRhcmdldC4KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8REZBUGFja2V0aXplcj4gUmVzb3VyY2VzTW9kZWw7CisKKyAgICAvLy8gUmVzb3VyY2UgbW9kZWwgLSBwYWNrZXQvYnVuZGxlIG1vZGVsLiBQdXJlbHkKKyAgICAvLy8gaW50ZXJuYWwgYXQgdGhlIHRpbWUuCisgICAgc3RkOjp2ZWN0b3I8U1VuaXQqPiBQYWNrZXQ7CisKKyAgICAvLy8gSGV1cmlzdGljcyBmb3IgZXN0aW1hdGluZyByZWdpc3RlciBwcmVzc3VyZS4KKyAgICB1bnNpZ25lZCBQYXJhbGxlbExpdmVSYW5nZXM7CisgICAgaW50IEhvcml6b250YWxWZXJ0aWNhbEJhbGFuY2U7CisKKyAgcHVibGljOgorICAgIFJlc291cmNlUHJpb3JpdHlRdWV1ZShTZWxlY3Rpb25EQUdJU2VsICpJUyk7CisKKyAgICBib29sIGlzQm90dG9tVXAoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBmYWxzZTsgfQorCisgICAgdm9pZCBpbml0Tm9kZXMoc3RkOjp2ZWN0b3I8U1VuaXQ+ICZzdW5pdHMpIG92ZXJyaWRlOworCisgICAgdm9pZCBhZGROb2RlKGNvbnN0IFNVbml0ICpTVSkgb3ZlcnJpZGUgeworICAgICAgTnVtTm9kZXNTb2xlbHlCbG9ja2luZy5yZXNpemUoU1VuaXRzLT5zaXplKCksIDApOworICAgIH0KKworICAgIHZvaWQgdXBkYXRlTm9kZShjb25zdCBTVW5pdCAqU1UpIG92ZXJyaWRlIHt9CisKKyAgICB2b2lkIHJlbGVhc2VTdGF0ZSgpIG92ZXJyaWRlIHsKKyAgICAgIFNVbml0cyA9IG51bGxwdHI7CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0TGF0ZW5jeSh1bnNpZ25lZCBOb2RlTnVtKSBjb25zdCB7CisgICAgICBhc3NlcnQoTm9kZU51bSA8ICgqU1VuaXRzKS5zaXplKCkpOworICAgICAgcmV0dXJuICgqU1VuaXRzKVtOb2RlTnVtXS5nZXRIZWlnaHQoKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBnZXROdW1Tb2xlbHlCbG9ja05vZGVzKHVuc2lnbmVkIE5vZGVOdW0pIGNvbnN0IHsKKyAgICAgIGFzc2VydChOb2RlTnVtIDwgTnVtTm9kZXNTb2xlbHlCbG9ja2luZy5zaXplKCkpOworICAgICAgcmV0dXJuIE51bU5vZGVzU29sZWx5QmxvY2tpbmdbTm9kZU51bV07CisgICAgfQorCisgICAgLy8vIFNpbmdsZSBjb3N0IGZ1bmN0aW9uIHJlZmxlY3RpbmcgYmVuZWZpdCBvZiBzY2hlZHVsaW5nIFNVCisgICAgLy8vIGluIHRoZSBjdXJyZW50IGN5Y2xlLgorICAgIGludCBTVVNjaGVkdWxpbmdDb3N0IChTVW5pdCAqU1UpOworCisgICAgLy8vIEluaXROdW1SZWdEZWZzTGVmdCAtIERldGVybWluZSB0aGUgIyBvZiByZWdzIGRlZmluZWQgYnkgdGhpcyBub2RlLgorICAgIC8vLworICAgIHZvaWQgaW5pdE51bVJlZ0RlZnNMZWZ0KFNVbml0ICpTVSk7CisgICAgdm9pZCB1cGRhdGVOdW1SZWdEZWZzTGVmdChTVW5pdCAqU1UpOworICAgIGludCByZWdQcmVzc3VyZURlbHRhKFNVbml0ICpTVSwgYm9vbCBSYXdQcmVzc3VyZSA9IGZhbHNlKTsKKyAgICBpbnQgcmF3UmVnUHJlc3N1cmVEZWx0YSAoU1VuaXQgKlNVLCB1bnNpZ25lZCBSQ0lkKTsKKworICAgIGJvb2wgZW1wdHkoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBRdWV1ZS5lbXB0eSgpOyB9CisKKyAgICB2b2lkIHB1c2goU1VuaXQgKlUpIG92ZXJyaWRlOworCisgICAgU1VuaXQgKnBvcCgpIG92ZXJyaWRlOworCisgICAgdm9pZCByZW1vdmUoU1VuaXQgKlNVKSBvdmVycmlkZTsKKworICAgIC8vLyBzY2hlZHVsZWROb2RlIC0gTWFpbiByZXNvdXJjZSB0cmFja2luZyBwb2ludC4KKyAgICB2b2lkIHNjaGVkdWxlZE5vZGUoU1VuaXQgKk5vZGUpIG92ZXJyaWRlOworICAgIGJvb2wgaXNSZXNvdXJjZUF2YWlsYWJsZShTVW5pdCAqU1UpOworICAgIHZvaWQgcmVzZXJ2ZVJlc291cmNlcyhTVW5pdCAqU1UpOworCitwcml2YXRlOgorICAgIHZvaWQgYWRqdXN0UHJpb3JpdHlPZlVuc2NoZWR1bGVkUHJlZHMoU1VuaXQgKlNVKTsKKyAgICBTVW5pdCAqZ2V0U2luZ2xlVW5zY2hlZHVsZWRQcmVkKFNVbml0ICpTVSk7CisgICAgdW5zaWduZWQgbnVtYmVyUkNWYWxQcmVkSW5TVSAoU1VuaXQgKlNVLCB1bnNpZ25lZCBSQ0lkKTsKKyAgICB1bnNpZ25lZCBudW1iZXJSQ1ZhbFN1Y2NJblNVIChTVW5pdCAqU1UsIHVuc2lnbmVkIFJDSWQpOworICB9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SdW50aW1lTGliY2FsbHMuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1J1bnRpbWVMaWJjYWxscy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2VkOTBkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9SdW50aW1lTGliY2FsbHMuZGVmCkBAIC0wLDAgKzEsNTI3IEBACisvLz09PS0tIGxsdm0vUnVudGltZUxpYmNhbGxzLmRlZiAtIEZpbGUgdGhhdCBkZXNjcmliZXMgbGliY2FsbHMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFsbCBvZiB0aGUgcnVudGltZSBsaWJyYXJ5IGNhbGxzIHRoZSBiYWNrZW5kIGNhbiBlbWl0LgorLy8gVGhlIHZhcmlvdXMgbG9uZyBkb3VibGUgdHlwZXMgY2Fubm90IGJlIG1lcmdlZCwgYmVjYXVzZSA4MC1iaXQgbGlicmFyeQorLy8gZnVuY3Rpb25zIHVzZSAieGYiIGFuZCAxMjgtYml0IHVzZSAidGYiLgorLy8KKy8vIFdoZW4gYWRkaW5nIFBQQ0YxMjggZnVuY3Rpb25zIGhlcmUsIG5vdGUgdGhhdCB0aGVpciBuYW1lcyBnZW5lcmFsbHkgbmVlZAorLy8gdG8gYmUgb3ZlcnJpZGRlbiBmb3IgRGFyd2luIHdpdGggdGhlIHh4eCRMREJMMTI4IGZvcm0uICBTZWUKKy8vIFBQQ0lTZWxMb3dlcmluZy5jcHAuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gTk9URTogTk8gSU5DTFVERSBHVUFSRCBERVNJUkVEIQorCisvLyBQcm92aWRlIGRlZmluaXRpb25zIG9mIG1hY3JvcyBzbyB0aGF0IHVzZXJzIG9mIHRoaXMgZmlsZSBkbyBub3QgaGF2ZSB0bworLy8gZGVmaW5lIGV2ZXJ5dGhpbmcgdG8gdXNlIGl0Li4uCisKKy8vIERlY2xhcmUgdGhlIGVudW1lcmF0b3IgZm9yIGVhY2ggbGliY2FsbCwgYWxvbmcgd2l0aCBpdHMgZGVmYXVsdCBuYW1lLiBTb21lCisvLyBsaWJjYWxscyBoYXZlIGRpZmZlcmVudCBuYW1lcyBvbiBwYXJ0aWN1bGFyIE9TZXMgb3IgYXJjaGl0ZWN0dXJlcy4gVGhlc2UKKy8vIGFyZSBzZXQgaW4gSW5pdExpYmNhbGxOYW1lcygpIGluIFRhcmdldExvd2VyaW5nQmFzZS5jcHAgYW5kL29yIGJ5IHRhcmdldHMKKy8vIHVzaW5nIFRhcmdldExvd2VyaW5nQmFzZTo6c2V0TGliY2FsbE5hbWUoKQorI2lmbmRlZiBIQU5ETEVfTElCQ0FMTAorI2Vycm9yICJIQU5ETEVfTElCQ0FMTCBtdXN0IGJlIGRlZmluZWQiCisjZW5kaWYKKworLy8gSW50ZWdlcgorSEFORExFX0xJQkNBTEwoU0hMX0kxNiwgIl9fYXNobGhpMyIpCitIQU5ETEVfTElCQ0FMTChTSExfSTMyLCAiX19hc2hsc2kzIikKK0hBTkRMRV9MSUJDQUxMKFNITF9JNjQsICJfX2FzaGxkaTMiKQorSEFORExFX0xJQkNBTEwoU0hMX0kxMjgsICJfX2FzaGx0aTMiKQorSEFORExFX0xJQkNBTEwoU1JMX0kxNiwgIl9fbHNocmhpMyIpCitIQU5ETEVfTElCQ0FMTChTUkxfSTMyLCAiX19sc2hyc2kzIikKK0hBTkRMRV9MSUJDQUxMKFNSTF9JNjQsICJfX2xzaHJkaTMiKQorSEFORExFX0xJQkNBTEwoU1JMX0kxMjgsICJfX2xzaHJ0aTMiKQorSEFORExFX0xJQkNBTEwoU1JBX0kxNiwgIl9fYXNocmhpMyIpCitIQU5ETEVfTElCQ0FMTChTUkFfSTMyLCAiX19hc2hyc2kzIikKK0hBTkRMRV9MSUJDQUxMKFNSQV9JNjQsICJfX2FzaHJkaTMiKQorSEFORExFX0xJQkNBTEwoU1JBX0kxMjgsICJfX2FzaHJ0aTMiKQorSEFORExFX0xJQkNBTEwoTVVMX0k4LCAiX19tdWxxaTMiKQorSEFORExFX0xJQkNBTEwoTVVMX0kxNiwgIl9fbXVsaGkzIikKK0hBTkRMRV9MSUJDQUxMKE1VTF9JMzIsICJfX211bHNpMyIpCitIQU5ETEVfTElCQ0FMTChNVUxfSTY0LCAiX19tdWxkaTMiKQorSEFORExFX0xJQkNBTEwoTVVMX0kxMjgsICJfX211bHRpMyIpCitIQU5ETEVfTElCQ0FMTChNVUxPX0kzMiwgIl9fbXVsb3NpNCIpCitIQU5ETEVfTElCQ0FMTChNVUxPX0k2NCwgIl9fbXVsb2RpNCIpCitIQU5ETEVfTElCQ0FMTChNVUxPX0kxMjgsICJfX211bG90aTQiKQorSEFORExFX0xJQkNBTEwoU0RJVl9JOCwgIl9fZGl2cWkzIikKK0hBTkRMRV9MSUJDQUxMKFNESVZfSTE2LCAiX19kaXZoaTMiKQorSEFORExFX0xJQkNBTEwoU0RJVl9JMzIsICJfX2RpdnNpMyIpCitIQU5ETEVfTElCQ0FMTChTRElWX0k2NCwgIl9fZGl2ZGkzIikKK0hBTkRMRV9MSUJDQUxMKFNESVZfSTEyOCwgIl9fZGl2dGkzIikKK0hBTkRMRV9MSUJDQUxMKFVESVZfSTgsICJfX3VkaXZxaTMiKQorSEFORExFX0xJQkNBTEwoVURJVl9JMTYsICJfX3VkaXZoaTMiKQorSEFORExFX0xJQkNBTEwoVURJVl9JMzIsICJfX3VkaXZzaTMiKQorSEFORExFX0xJQkNBTEwoVURJVl9JNjQsICJfX3VkaXZkaTMiKQorSEFORExFX0xJQkNBTEwoVURJVl9JMTI4LCAiX191ZGl2dGkzIikKK0hBTkRMRV9MSUJDQUxMKFNSRU1fSTgsICJfX21vZHFpMyIpCitIQU5ETEVfTElCQ0FMTChTUkVNX0kxNiwgIl9fbW9kaGkzIikKK0hBTkRMRV9MSUJDQUxMKFNSRU1fSTMyLCAiX19tb2RzaTMiKQorSEFORExFX0xJQkNBTEwoU1JFTV9JNjQsICJfX21vZGRpMyIpCitIQU5ETEVfTElCQ0FMTChTUkVNX0kxMjgsICJfX21vZHRpMyIpCitIQU5ETEVfTElCQ0FMTChVUkVNX0k4LCAiX191bW9kcWkzIikKK0hBTkRMRV9MSUJDQUxMKFVSRU1fSTE2LCAiX191bW9kaGkzIikKK0hBTkRMRV9MSUJDQUxMKFVSRU1fSTMyLCAiX191bW9kc2kzIikKK0hBTkRMRV9MSUJDQUxMKFVSRU1fSTY0LCAiX191bW9kZGkzIikKK0hBTkRMRV9MSUJDQUxMKFVSRU1fSTEyOCwgIl9fdW1vZHRpMyIpCitIQU5ETEVfTElCQ0FMTChTRElWUkVNX0k4LCBudWxscHRyKQorSEFORExFX0xJQkNBTEwoU0RJVlJFTV9JMTYsIG51bGxwdHIpCitIQU5ETEVfTElCQ0FMTChTRElWUkVNX0kzMiwgbnVsbHB0cikKK0hBTkRMRV9MSUJDQUxMKFNESVZSRU1fSTY0LCBudWxscHRyKQorSEFORExFX0xJQkNBTEwoU0RJVlJFTV9JMTI4LCBudWxscHRyKQorSEFORExFX0xJQkNBTEwoVURJVlJFTV9JOCwgbnVsbHB0cikKK0hBTkRMRV9MSUJDQUxMKFVESVZSRU1fSTE2LCBudWxscHRyKQorSEFORExFX0xJQkNBTEwoVURJVlJFTV9JMzIsIG51bGxwdHIpCitIQU5ETEVfTElCQ0FMTChVRElWUkVNX0k2NCwgbnVsbHB0cikKK0hBTkRMRV9MSUJDQUxMKFVESVZSRU1fSTEyOCwgbnVsbHB0cikKK0hBTkRMRV9MSUJDQUxMKE5FR19JMzIsICJfX25lZ3NpMiIpCitIQU5ETEVfTElCQ0FMTChORUdfSTY0LCAiX19uZWdkaTIiKQorCisvLyBGbG9hdGluZy1wb2ludAorSEFORExFX0xJQkNBTEwoQUREX0YzMiwgIl9fYWRkc2YzIikKK0hBTkRMRV9MSUJDQUxMKEFERF9GNjQsICJfX2FkZGRmMyIpCitIQU5ETEVfTElCQ0FMTChBRERfRjgwLCAiX19hZGR4ZjMiKQorSEFORExFX0xJQkNBTEwoQUREX0YxMjgsICJfX2FkZHRmMyIpCitIQU5ETEVfTElCQ0FMTChBRERfUFBDRjEyOCwgIl9fZ2NjX3FhZGQiKQorSEFORExFX0xJQkNBTEwoU1VCX0YzMiwgIl9fc3Vic2YzIikKK0hBTkRMRV9MSUJDQUxMKFNVQl9GNjQsICJfX3N1YmRmMyIpCitIQU5ETEVfTElCQ0FMTChTVUJfRjgwLCAiX19zdWJ4ZjMiKQorSEFORExFX0xJQkNBTEwoU1VCX0YxMjgsICJfX3N1YnRmMyIpCitIQU5ETEVfTElCQ0FMTChTVUJfUFBDRjEyOCwgIl9fZ2NjX3FzdWIiKQorSEFORExFX0xJQkNBTEwoTVVMX0YzMiwgIl9fbXVsc2YzIikKK0hBTkRMRV9MSUJDQUxMKE1VTF9GNjQsICJfX211bGRmMyIpCitIQU5ETEVfTElCQ0FMTChNVUxfRjgwLCAiX19tdWx4ZjMiKQorSEFORExFX0xJQkNBTEwoTVVMX0YxMjgsICJfX211bHRmMyIpCitIQU5ETEVfTElCQ0FMTChNVUxfUFBDRjEyOCwgIl9fZ2NjX3FtdWwiKQorSEFORExFX0xJQkNBTEwoRElWX0YzMiwgIl9fZGl2c2YzIikKK0hBTkRMRV9MSUJDQUxMKERJVl9GNjQsICJfX2RpdmRmMyIpCitIQU5ETEVfTElCQ0FMTChESVZfRjgwLCAiX19kaXZ4ZjMiKQorSEFORExFX0xJQkNBTEwoRElWX0YxMjgsICJfX2RpdnRmMyIpCitIQU5ETEVfTElCQ0FMTChESVZfUFBDRjEyOCwgIl9fZ2NjX3FkaXYiKQorSEFORExFX0xJQkNBTEwoUkVNX0YzMiwgImZtb2RmIikKK0hBTkRMRV9MSUJDQUxMKFJFTV9GNjQsICJmbW9kIikKK0hBTkRMRV9MSUJDQUxMKFJFTV9GODAsICJmbW9kbCIpCitIQU5ETEVfTElCQ0FMTChSRU1fRjEyOCwgImZtb2RsIikKK0hBTkRMRV9MSUJDQUxMKFJFTV9QUENGMTI4LCAiZm1vZGwiKQorSEFORExFX0xJQkNBTEwoRk1BX0YzMiwgImZtYWYiKQorSEFORExFX0xJQkNBTEwoRk1BX0Y2NCwgImZtYSIpCitIQU5ETEVfTElCQ0FMTChGTUFfRjgwLCAiZm1hbCIpCitIQU5ETEVfTElCQ0FMTChGTUFfRjEyOCwgImZtYWwiKQorSEFORExFX0xJQkNBTEwoRk1BX1BQQ0YxMjgsICJmbWFsIikKK0hBTkRMRV9MSUJDQUxMKFBPV0lfRjMyLCAiX19wb3dpc2YyIikKK0hBTkRMRV9MSUJDQUxMKFBPV0lfRjY0LCAiX19wb3dpZGYyIikKK0hBTkRMRV9MSUJDQUxMKFBPV0lfRjgwLCAiX19wb3dpeGYyIikKK0hBTkRMRV9MSUJDQUxMKFBPV0lfRjEyOCwgIl9fcG93aXRmMiIpCitIQU5ETEVfTElCQ0FMTChQT1dJX1BQQ0YxMjgsICJfX3Bvd2l0ZjIiKQorSEFORExFX0xJQkNBTEwoU1FSVF9GMzIsICJzcXJ0ZiIpCitIQU5ETEVfTElCQ0FMTChTUVJUX0Y2NCwgInNxcnQiKQorSEFORExFX0xJQkNBTEwoU1FSVF9GODAsICJzcXJ0bCIpCitIQU5ETEVfTElCQ0FMTChTUVJUX0YxMjgsICJzcXJ0bCIpCitIQU5ETEVfTElCQ0FMTChTUVJUX1BQQ0YxMjgsICJzcXJ0bCIpCitIQU5ETEVfTElCQ0FMTChMT0dfRjMyLCAibG9nZiIpCitIQU5ETEVfTElCQ0FMTChMT0dfRjY0LCAibG9nIikKK0hBTkRMRV9MSUJDQUxMKExPR19GODAsICJsb2dsIikKK0hBTkRMRV9MSUJDQUxMKExPR19GMTI4LCAibG9nbCIpCitIQU5ETEVfTElCQ0FMTChMT0dfUFBDRjEyOCwgImxvZ2wiKQorSEFORExFX0xJQkNBTEwoTE9HX0ZJTklURV9GMzIsICJfX2xvZ2ZfZmluaXRlIikKK0hBTkRMRV9MSUJDQUxMKExPR19GSU5JVEVfRjY0LCAiX19sb2dfZmluaXRlIikKK0hBTkRMRV9MSUJDQUxMKExPR19GSU5JVEVfRjgwLCAiX19sb2dsX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChMT0dfRklOSVRFX0YxMjgsICJfX2xvZ2xfZmluaXRlIikKK0hBTkRMRV9MSUJDQUxMKExPR19GSU5JVEVfUFBDRjEyOCwgIl9fbG9nbF9maW5pdGUiKQorSEFORExFX0xJQkNBTEwoTE9HMl9GMzIsICJsb2cyZiIpCitIQU5ETEVfTElCQ0FMTChMT0cyX0Y2NCwgImxvZzIiKQorSEFORExFX0xJQkNBTEwoTE9HMl9GODAsICJsb2cybCIpCitIQU5ETEVfTElCQ0FMTChMT0cyX0YxMjgsICJsb2cybCIpCitIQU5ETEVfTElCQ0FMTChMT0cyX1BQQ0YxMjgsICJsb2cybCIpCitIQU5ETEVfTElCQ0FMTChMT0cyX0ZJTklURV9GMzIsICJfX2xvZzJmX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChMT0cyX0ZJTklURV9GNjQsICJfX2xvZzJfZmluaXRlIikKK0hBTkRMRV9MSUJDQUxMKExPRzJfRklOSVRFX0Y4MCwgIl9fbG9nMmxfZmluaXRlIikKK0hBTkRMRV9MSUJDQUxMKExPRzJfRklOSVRFX0YxMjgsICJfX2xvZzJsX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChMT0cyX0ZJTklURV9QUENGMTI4LCAiX19sb2cybF9maW5pdGUiKQorSEFORExFX0xJQkNBTEwoTE9HMTBfRjMyLCAibG9nMTBmIikKK0hBTkRMRV9MSUJDQUxMKExPRzEwX0Y2NCwgImxvZzEwIikKK0hBTkRMRV9MSUJDQUxMKExPRzEwX0Y4MCwgImxvZzEwbCIpCitIQU5ETEVfTElCQ0FMTChMT0cxMF9GMTI4LCAibG9nMTBsIikKK0hBTkRMRV9MSUJDQUxMKExPRzEwX1BQQ0YxMjgsICJsb2cxMGwiKQorSEFORExFX0xJQkNBTEwoTE9HMTBfRklOSVRFX0YzMiwgIl9fbG9nMTBmX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChMT0cxMF9GSU5JVEVfRjY0LCAiX19sb2cxMF9maW5pdGUiKQorSEFORExFX0xJQkNBTEwoTE9HMTBfRklOSVRFX0Y4MCwgIl9fbG9nMTBsX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChMT0cxMF9GSU5JVEVfRjEyOCwgIl9fbG9nMTBsX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChMT0cxMF9GSU5JVEVfUFBDRjEyOCwgIl9fbG9nMTBsX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChFWFBfRjMyLCAiZXhwZiIpCitIQU5ETEVfTElCQ0FMTChFWFBfRjY0LCAiZXhwIikKK0hBTkRMRV9MSUJDQUxMKEVYUF9GODAsICJleHBsIikKK0hBTkRMRV9MSUJDQUxMKEVYUF9GMTI4LCAiZXhwbCIpCitIQU5ETEVfTElCQ0FMTChFWFBfUFBDRjEyOCwgImV4cGwiKQorSEFORExFX0xJQkNBTEwoRVhQX0ZJTklURV9GMzIsICJfX2V4cGZfZmluaXRlIikKK0hBTkRMRV9MSUJDQUxMKEVYUF9GSU5JVEVfRjY0LCAiX19leHBfZmluaXRlIikKK0hBTkRMRV9MSUJDQUxMKEVYUF9GSU5JVEVfRjgwLCAiX19leHBsX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChFWFBfRklOSVRFX0YxMjgsICJfX2V4cGxfZmluaXRlIikKK0hBTkRMRV9MSUJDQUxMKEVYUF9GSU5JVEVfUFBDRjEyOCwgIl9fZXhwbF9maW5pdGUiKQorSEFORExFX0xJQkNBTEwoRVhQMl9GMzIsICJleHAyZiIpCitIQU5ETEVfTElCQ0FMTChFWFAyX0Y2NCwgImV4cDIiKQorSEFORExFX0xJQkNBTEwoRVhQMl9GODAsICJleHAybCIpCitIQU5ETEVfTElCQ0FMTChFWFAyX0YxMjgsICJleHAybCIpCitIQU5ETEVfTElCQ0FMTChFWFAyX1BQQ0YxMjgsICJleHAybCIpCitIQU5ETEVfTElCQ0FMTChFWFAyX0ZJTklURV9GMzIsICJfX2V4cDJmX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChFWFAyX0ZJTklURV9GNjQsICJfX2V4cDJfZmluaXRlIikKK0hBTkRMRV9MSUJDQUxMKEVYUDJfRklOSVRFX0Y4MCwgIl9fZXhwMmxfZmluaXRlIikKK0hBTkRMRV9MSUJDQUxMKEVYUDJfRklOSVRFX0YxMjgsICJfX2V4cDJsX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChFWFAyX0ZJTklURV9QUENGMTI4LCAiX19leHAybF9maW5pdGUiKQorSEFORExFX0xJQkNBTEwoU0lOX0YzMiwgInNpbmYiKQorSEFORExFX0xJQkNBTEwoU0lOX0Y2NCwgInNpbiIpCitIQU5ETEVfTElCQ0FMTChTSU5fRjgwLCAic2lubCIpCitIQU5ETEVfTElCQ0FMTChTSU5fRjEyOCwgInNpbmwiKQorSEFORExFX0xJQkNBTEwoU0lOX1BQQ0YxMjgsICJzaW5sIikKK0hBTkRMRV9MSUJDQUxMKENPU19GMzIsICJjb3NmIikKK0hBTkRMRV9MSUJDQUxMKENPU19GNjQsICJjb3MiKQorSEFORExFX0xJQkNBTEwoQ09TX0Y4MCwgImNvc2wiKQorSEFORExFX0xJQkNBTEwoQ09TX0YxMjgsICJjb3NsIikKK0hBTkRMRV9MSUJDQUxMKENPU19QUENGMTI4LCAiY29zbCIpCitIQU5ETEVfTElCQ0FMTChTSU5DT1NfRjMyLCBudWxscHRyKQorSEFORExFX0xJQkNBTEwoU0lOQ09TX0Y2NCwgbnVsbHB0cikKK0hBTkRMRV9MSUJDQUxMKFNJTkNPU19GODAsIG51bGxwdHIpCitIQU5ETEVfTElCQ0FMTChTSU5DT1NfRjEyOCwgbnVsbHB0cikKK0hBTkRMRV9MSUJDQUxMKFNJTkNPU19QUENGMTI4LCBudWxscHRyKQorSEFORExFX0xJQkNBTEwoU0lOQ09TX1NUUkVUX0YzMiwgbnVsbHB0cikKK0hBTkRMRV9MSUJDQUxMKFNJTkNPU19TVFJFVF9GNjQsIG51bGxwdHIpCitIQU5ETEVfTElCQ0FMTChQT1dfRjMyLCAicG93ZiIpCitIQU5ETEVfTElCQ0FMTChQT1dfRjY0LCAicG93IikKK0hBTkRMRV9MSUJDQUxMKFBPV19GODAsICJwb3dsIikKK0hBTkRMRV9MSUJDQUxMKFBPV19GMTI4LCAicG93bCIpCitIQU5ETEVfTElCQ0FMTChQT1dfUFBDRjEyOCwgInBvd2wiKQorSEFORExFX0xJQkNBTEwoUE9XX0ZJTklURV9GMzIsICJfX3Bvd2ZfZmluaXRlIikKK0hBTkRMRV9MSUJDQUxMKFBPV19GSU5JVEVfRjY0LCAiX19wb3dfZmluaXRlIikKK0hBTkRMRV9MSUJDQUxMKFBPV19GSU5JVEVfRjgwLCAiX19wb3dsX2Zpbml0ZSIpCitIQU5ETEVfTElCQ0FMTChQT1dfRklOSVRFX0YxMjgsICJfX3Bvd2xfZmluaXRlIikKK0hBTkRMRV9MSUJDQUxMKFBPV19GSU5JVEVfUFBDRjEyOCwgIl9fcG93bF9maW5pdGUiKQorSEFORExFX0xJQkNBTEwoQ0VJTF9GMzIsICJjZWlsZiIpCitIQU5ETEVfTElCQ0FMTChDRUlMX0Y2NCwgImNlaWwiKQorSEFORExFX0xJQkNBTEwoQ0VJTF9GODAsICJjZWlsbCIpCitIQU5ETEVfTElCQ0FMTChDRUlMX0YxMjgsICJjZWlsbCIpCitIQU5ETEVfTElCQ0FMTChDRUlMX1BQQ0YxMjgsICJjZWlsbCIpCitIQU5ETEVfTElCQ0FMTChUUlVOQ19GMzIsICJ0cnVuY2YiKQorSEFORExFX0xJQkNBTEwoVFJVTkNfRjY0LCAidHJ1bmMiKQorSEFORExFX0xJQkNBTEwoVFJVTkNfRjgwLCAidHJ1bmNsIikKK0hBTkRMRV9MSUJDQUxMKFRSVU5DX0YxMjgsICJ0cnVuY2wiKQorSEFORExFX0xJQkNBTEwoVFJVTkNfUFBDRjEyOCwgInRydW5jbCIpCitIQU5ETEVfTElCQ0FMTChSSU5UX0YzMiwgInJpbnRmIikKK0hBTkRMRV9MSUJDQUxMKFJJTlRfRjY0LCAicmludCIpCitIQU5ETEVfTElCQ0FMTChSSU5UX0Y4MCwgInJpbnRsIikKK0hBTkRMRV9MSUJDQUxMKFJJTlRfRjEyOCwgInJpbnRsIikKK0hBTkRMRV9MSUJDQUxMKFJJTlRfUFBDRjEyOCwgInJpbnRsIikKK0hBTkRMRV9MSUJDQUxMKE5FQVJCWUlOVF9GMzIsICJuZWFyYnlpbnRmIikKK0hBTkRMRV9MSUJDQUxMKE5FQVJCWUlOVF9GNjQsICJuZWFyYnlpbnQiKQorSEFORExFX0xJQkNBTEwoTkVBUkJZSU5UX0Y4MCwgIm5lYXJieWludGwiKQorSEFORExFX0xJQkNBTEwoTkVBUkJZSU5UX0YxMjgsICJuZWFyYnlpbnRsIikKK0hBTkRMRV9MSUJDQUxMKE5FQVJCWUlOVF9QUENGMTI4LCAibmVhcmJ5aW50bCIpCitIQU5ETEVfTElCQ0FMTChST1VORF9GMzIsICJyb3VuZGYiKQorSEFORExFX0xJQkNBTEwoUk9VTkRfRjY0LCAicm91bmQiKQorSEFORExFX0xJQkNBTEwoUk9VTkRfRjgwLCAicm91bmRsIikKK0hBTkRMRV9MSUJDQUxMKFJPVU5EX0YxMjgsICJyb3VuZGwiKQorSEFORExFX0xJQkNBTEwoUk9VTkRfUFBDRjEyOCwgInJvdW5kbCIpCitIQU5ETEVfTElCQ0FMTChGTE9PUl9GMzIsICJmbG9vcmYiKQorSEFORExFX0xJQkNBTEwoRkxPT1JfRjY0LCAiZmxvb3IiKQorSEFORExFX0xJQkNBTEwoRkxPT1JfRjgwLCAiZmxvb3JsIikKK0hBTkRMRV9MSUJDQUxMKEZMT09SX0YxMjgsICJmbG9vcmwiKQorSEFORExFX0xJQkNBTEwoRkxPT1JfUFBDRjEyOCwgImZsb29ybCIpCitIQU5ETEVfTElCQ0FMTChDT1BZU0lHTl9GMzIsICJjb3B5c2lnbmYiKQorSEFORExFX0xJQkNBTEwoQ09QWVNJR05fRjY0LCAiY29weXNpZ24iKQorSEFORExFX0xJQkNBTEwoQ09QWVNJR05fRjgwLCAiY29weXNpZ25sIikKK0hBTkRMRV9MSUJDQUxMKENPUFlTSUdOX0YxMjgsICJjb3B5c2lnbmwiKQorSEFORExFX0xJQkNBTEwoQ09QWVNJR05fUFBDRjEyOCwgImNvcHlzaWdubCIpCitIQU5ETEVfTElCQ0FMTChGTUlOX0YzMiwgImZtaW5mIikKK0hBTkRMRV9MSUJDQUxMKEZNSU5fRjY0LCAiZm1pbiIpCitIQU5ETEVfTElCQ0FMTChGTUlOX0Y4MCwgImZtaW5sIikKK0hBTkRMRV9MSUJDQUxMKEZNSU5fRjEyOCwgImZtaW5sIikKK0hBTkRMRV9MSUJDQUxMKEZNSU5fUFBDRjEyOCwgImZtaW5sIikKK0hBTkRMRV9MSUJDQUxMKEZNQVhfRjMyLCAiZm1heGYiKQorSEFORExFX0xJQkNBTEwoRk1BWF9GNjQsICJmbWF4IikKK0hBTkRMRV9MSUJDQUxMKEZNQVhfRjgwLCAiZm1heGwiKQorSEFORExFX0xJQkNBTEwoRk1BWF9GMTI4LCAiZm1heGwiKQorSEFORExFX0xJQkNBTEwoRk1BWF9QUENGMTI4LCAiZm1heGwiKQorCisvLyBDb252ZXJzaW9uCitIQU5ETEVfTElCQ0FMTChGUEVYVF9GMzJfUFBDRjEyOCwgIl9fZ2NjX3N0b3EiKQorSEFORExFX0xJQkNBTEwoRlBFWFRfRjY0X1BQQ0YxMjgsICJfX2djY19kdG9xIikKK0hBTkRMRV9MSUJDQUxMKEZQRVhUX0Y4MF9GMTI4LCAiX19leHRlbmR4ZnRmMiIpCitIQU5ETEVfTElCQ0FMTChGUEVYVF9GNjRfRjEyOCwgIl9fZXh0ZW5kZGZ0ZjIiKQorSEFORExFX0xJQkNBTEwoRlBFWFRfRjMyX0YxMjgsICJfX2V4dGVuZHNmdGYyIikKK0hBTkRMRV9MSUJDQUxMKEZQRVhUX0YzMl9GNjQsICJfX2V4dGVuZHNmZGYyIikKK0hBTkRMRV9MSUJDQUxMKEZQRVhUX0YxNl9GMzIsICJfX2dudV9oMmZfaWVlZSIpCitIQU5ETEVfTElCQ0FMTChGUFJPVU5EX0YzMl9GMTYsICJfX2dudV9mMmhfaWVlZSIpCitIQU5ETEVfTElCQ0FMTChGUFJPVU5EX0Y2NF9GMTYsICJfX3RydW5jZGZoZjIiKQorSEFORExFX0xJQkNBTEwoRlBST1VORF9GODBfRjE2LCAiX190cnVuY3hmaGYyIikKK0hBTkRMRV9MSUJDQUxMKEZQUk9VTkRfRjEyOF9GMTYsICJfX3RydW5jdGZoZjIiKQorSEFORExFX0xJQkNBTEwoRlBST1VORF9QUENGMTI4X0YxNiwgIl9fdHJ1bmN0ZmhmMiIpCitIQU5ETEVfTElCQ0FMTChGUFJPVU5EX0Y2NF9GMzIsICJfX3RydW5jZGZzZjIiKQorSEFORExFX0xJQkNBTEwoRlBST1VORF9GODBfRjMyLCAiX190cnVuY3hmc2YyIikKK0hBTkRMRV9MSUJDQUxMKEZQUk9VTkRfRjEyOF9GMzIsICJfX3RydW5jdGZzZjIiKQorSEFORExFX0xJQkNBTEwoRlBST1VORF9QUENGMTI4X0YzMiwgIl9fZ2NjX3F0b3MiKQorSEFORExFX0xJQkNBTEwoRlBST1VORF9GODBfRjY0LCAiX190cnVuY3hmZGYyIikKK0hBTkRMRV9MSUJDQUxMKEZQUk9VTkRfRjEyOF9GNjQsICJfX3RydW5jdGZkZjIiKQorSEFORExFX0xJQkNBTEwoRlBST1VORF9QUENGMTI4X0Y2NCwgIl9fZ2NjX3F0b2QiKQorSEFORExFX0xJQkNBTEwoRlBST1VORF9GMTI4X0Y4MCwgIl9fdHJ1bmN0ZnhmMiIpCitIQU5ETEVfTElCQ0FMTChGUFRPU0lOVF9GMzJfSTMyLCAiX19maXhzZnNpIikKK0hBTkRMRV9MSUJDQUxMKEZQVE9TSU5UX0YzMl9JNjQsICJfX2ZpeHNmZGkiKQorSEFORExFX0xJQkNBTEwoRlBUT1NJTlRfRjMyX0kxMjgsICJfX2ZpeHNmdGkiKQorSEFORExFX0xJQkNBTEwoRlBUT1NJTlRfRjY0X0kzMiwgIl9fZml4ZGZzaSIpCitIQU5ETEVfTElCQ0FMTChGUFRPU0lOVF9GNjRfSTY0LCAiX19maXhkZmRpIikKK0hBTkRMRV9MSUJDQUxMKEZQVE9TSU5UX0Y2NF9JMTI4LCAiX19maXhkZnRpIikKK0hBTkRMRV9MSUJDQUxMKEZQVE9TSU5UX0Y4MF9JMzIsICJfX2ZpeHhmc2kiKQorSEFORExFX0xJQkNBTEwoRlBUT1NJTlRfRjgwX0k2NCwgIl9fZml4eGZkaSIpCitIQU5ETEVfTElCQ0FMTChGUFRPU0lOVF9GODBfSTEyOCwgIl9fZml4eGZ0aSIpCitIQU5ETEVfTElCQ0FMTChGUFRPU0lOVF9GMTI4X0kzMiwgIl9fZml4dGZzaSIpCitIQU5ETEVfTElCQ0FMTChGUFRPU0lOVF9GMTI4X0k2NCwgIl9fZml4dGZkaSIpCitIQU5ETEVfTElCQ0FMTChGUFRPU0lOVF9GMTI4X0kxMjgsICJfX2ZpeHRmdGkiKQorSEFORExFX0xJQkNBTEwoRlBUT1NJTlRfUFBDRjEyOF9JMzIsICJfX2djY19xdG91IikKK0hBTkRMRV9MSUJDQUxMKEZQVE9TSU5UX1BQQ0YxMjhfSTY0LCAiX19maXh0ZmRpIikKK0hBTkRMRV9MSUJDQUxMKEZQVE9TSU5UX1BQQ0YxMjhfSTEyOCwgIl9fZml4dGZ0aSIpCitIQU5ETEVfTElCQ0FMTChGUFRPVUlOVF9GMzJfSTMyLCAiX19maXh1bnNzZnNpIikKK0hBTkRMRV9MSUJDQUxMKEZQVE9VSU5UX0YzMl9JNjQsICJfX2ZpeHVuc3NmZGkiKQorSEFORExFX0xJQkNBTEwoRlBUT1VJTlRfRjMyX0kxMjgsICJfX2ZpeHVuc3NmdGkiKQorSEFORExFX0xJQkNBTEwoRlBUT1VJTlRfRjY0X0kzMiwgIl9fZml4dW5zZGZzaSIpCitIQU5ETEVfTElCQ0FMTChGUFRPVUlOVF9GNjRfSTY0LCAiX19maXh1bnNkZmRpIikKK0hBTkRMRV9MSUJDQUxMKEZQVE9VSU5UX0Y2NF9JMTI4LCAiX19maXh1bnNkZnRpIikKK0hBTkRMRV9MSUJDQUxMKEZQVE9VSU5UX0Y4MF9JMzIsICJfX2ZpeHVuc3hmc2kiKQorSEFORExFX0xJQkNBTEwoRlBUT1VJTlRfRjgwX0k2NCwgIl9fZml4dW5zeGZkaSIpCitIQU5ETEVfTElCQ0FMTChGUFRPVUlOVF9GODBfSTEyOCwgIl9fZml4dW5zeGZ0aSIpCitIQU5ETEVfTElCQ0FMTChGUFRPVUlOVF9GMTI4X0kzMiwgIl9fZml4dW5zdGZzaSIpCitIQU5ETEVfTElCQ0FMTChGUFRPVUlOVF9GMTI4X0k2NCwgIl9fZml4dW5zdGZkaSIpCitIQU5ETEVfTElCQ0FMTChGUFRPVUlOVF9GMTI4X0kxMjgsICJfX2ZpeHVuc3RmdGkiKQorSEFORExFX0xJQkNBTEwoRlBUT1VJTlRfUFBDRjEyOF9JMzIsICJfX2ZpeHVuc3Rmc2kiKQorSEFORExFX0xJQkNBTEwoRlBUT1VJTlRfUFBDRjEyOF9JNjQsICJfX2ZpeHVuc3RmZGkiKQorSEFORExFX0xJQkNBTEwoRlBUT1VJTlRfUFBDRjEyOF9JMTI4LCAiX19maXh1bnN0ZnRpIikKK0hBTkRMRV9MSUJDQUxMKFNJTlRUT0ZQX0kzMl9GMzIsICJfX2Zsb2F0c2lzZiIpCitIQU5ETEVfTElCQ0FMTChTSU5UVE9GUF9JMzJfRjY0LCAiX19mbG9hdHNpZGYiKQorSEFORExFX0xJQkNBTEwoU0lOVFRPRlBfSTMyX0Y4MCwgIl9fZmxvYXRzaXhmIikKK0hBTkRMRV9MSUJDQUxMKFNJTlRUT0ZQX0kzMl9GMTI4LCAiX19mbG9hdHNpdGYiKQorSEFORExFX0xJQkNBTEwoU0lOVFRPRlBfSTMyX1BQQ0YxMjgsICJfX2djY19pdG9xIikKK0hBTkRMRV9MSUJDQUxMKFNJTlRUT0ZQX0k2NF9GMzIsICJfX2Zsb2F0ZGlzZiIpCitIQU5ETEVfTElCQ0FMTChTSU5UVE9GUF9JNjRfRjY0LCAiX19mbG9hdGRpZGYiKQorSEFORExFX0xJQkNBTEwoU0lOVFRPRlBfSTY0X0Y4MCwgIl9fZmxvYXRkaXhmIikKK0hBTkRMRV9MSUJDQUxMKFNJTlRUT0ZQX0k2NF9GMTI4LCAiX19mbG9hdGRpdGYiKQorSEFORExFX0xJQkNBTEwoU0lOVFRPRlBfSTY0X1BQQ0YxMjgsICJfX2Zsb2F0ZGl0ZiIpCitIQU5ETEVfTElCQ0FMTChTSU5UVE9GUF9JMTI4X0YzMiwgIl9fZmxvYXR0aXNmIikKK0hBTkRMRV9MSUJDQUxMKFNJTlRUT0ZQX0kxMjhfRjY0LCAiX19mbG9hdHRpZGYiKQorSEFORExFX0xJQkNBTEwoU0lOVFRPRlBfSTEyOF9GODAsICJfX2Zsb2F0dGl4ZiIpCitIQU5ETEVfTElCQ0FMTChTSU5UVE9GUF9JMTI4X0YxMjgsICJfX2Zsb2F0dGl0ZiIpCitIQU5ETEVfTElCQ0FMTChTSU5UVE9GUF9JMTI4X1BQQ0YxMjgsICJfX2Zsb2F0dGl0ZiIpCitIQU5ETEVfTElCQ0FMTChVSU5UVE9GUF9JMzJfRjMyLCAiX19mbG9hdHVuc2lzZiIpCitIQU5ETEVfTElCQ0FMTChVSU5UVE9GUF9JMzJfRjY0LCAiX19mbG9hdHVuc2lkZiIpCitIQU5ETEVfTElCQ0FMTChVSU5UVE9GUF9JMzJfRjgwLCAiX19mbG9hdHVuc2l4ZiIpCitIQU5ETEVfTElCQ0FMTChVSU5UVE9GUF9JMzJfRjEyOCwgIl9fZmxvYXR1bnNpdGYiKQorSEFORExFX0xJQkNBTEwoVUlOVFRPRlBfSTMyX1BQQ0YxMjgsICJfX2djY191dG9xIikKK0hBTkRMRV9MSUJDQUxMKFVJTlRUT0ZQX0k2NF9GMzIsICJfX2Zsb2F0dW5kaXNmIikKK0hBTkRMRV9MSUJDQUxMKFVJTlRUT0ZQX0k2NF9GNjQsICJfX2Zsb2F0dW5kaWRmIikKK0hBTkRMRV9MSUJDQUxMKFVJTlRUT0ZQX0k2NF9GODAsICJfX2Zsb2F0dW5kaXhmIikKK0hBTkRMRV9MSUJDQUxMKFVJTlRUT0ZQX0k2NF9GMTI4LCAiX19mbG9hdHVuZGl0ZiIpCitIQU5ETEVfTElCQ0FMTChVSU5UVE9GUF9JNjRfUFBDRjEyOCwgIl9fZmxvYXR1bmRpdGYiKQorSEFORExFX0xJQkNBTEwoVUlOVFRPRlBfSTEyOF9GMzIsICJfX2Zsb2F0dW50aXNmIikKK0hBTkRMRV9MSUJDQUxMKFVJTlRUT0ZQX0kxMjhfRjY0LCAiX19mbG9hdHVudGlkZiIpCitIQU5ETEVfTElCQ0FMTChVSU5UVE9GUF9JMTI4X0Y4MCwgIl9fZmxvYXR1bnRpeGYiKQorSEFORExFX0xJQkNBTEwoVUlOVFRPRlBfSTEyOF9GMTI4LCAiX19mbG9hdHVudGl0ZiIpCitIQU5ETEVfTElCQ0FMTChVSU5UVE9GUF9JMTI4X1BQQ0YxMjgsICJfX2Zsb2F0dW50aXRmIikKKworLy8gQ29tcGFyaXNvbgorSEFORExFX0xJQkNBTEwoT0VRX0YzMiwgIl9fZXFzZjIiKQorSEFORExFX0xJQkNBTEwoT0VRX0Y2NCwgIl9fZXFkZjIiKQorSEFORExFX0xJQkNBTEwoT0VRX0YxMjgsICJfX2VxdGYyIikKK0hBTkRMRV9MSUJDQUxMKE9FUV9QUENGMTI4LCAiX19nY2NfcWVxIikKK0hBTkRMRV9MSUJDQUxMKFVORV9GMzIsICJfX25lc2YyIikKK0hBTkRMRV9MSUJDQUxMKFVORV9GNjQsICJfX25lZGYyIikKK0hBTkRMRV9MSUJDQUxMKFVORV9GMTI4LCAiX19uZXRmMiIpCitIQU5ETEVfTElCQ0FMTChVTkVfUFBDRjEyOCwgIl9fZ2NjX3FuZSIpCitIQU5ETEVfTElCQ0FMTChPR0VfRjMyLCAiX19nZXNmMiIpCitIQU5ETEVfTElCQ0FMTChPR0VfRjY0LCAiX19nZWRmMiIpCitIQU5ETEVfTElCQ0FMTChPR0VfRjEyOCwgIl9fZ2V0ZjIiKQorSEFORExFX0xJQkNBTEwoT0dFX1BQQ0YxMjgsICJfX2djY19xZ2UiKQorSEFORExFX0xJQkNBTEwoT0xUX0YzMiwgIl9fbHRzZjIiKQorSEFORExFX0xJQkNBTEwoT0xUX0Y2NCwgIl9fbHRkZjIiKQorSEFORExFX0xJQkNBTEwoT0xUX0YxMjgsICJfX2x0dGYyIikKK0hBTkRMRV9MSUJDQUxMKE9MVF9QUENGMTI4LCAiX19nY2NfcWx0IikKK0hBTkRMRV9MSUJDQUxMKE9MRV9GMzIsICJfX2xlc2YyIikKK0hBTkRMRV9MSUJDQUxMKE9MRV9GNjQsICJfX2xlZGYyIikKK0hBTkRMRV9MSUJDQUxMKE9MRV9GMTI4LCAiX19sZXRmMiIpCitIQU5ETEVfTElCQ0FMTChPTEVfUFBDRjEyOCwgIl9fZ2NjX3FsZSIpCitIQU5ETEVfTElCQ0FMTChPR1RfRjMyLCAiX19ndHNmMiIpCitIQU5ETEVfTElCQ0FMTChPR1RfRjY0LCAiX19ndGRmMiIpCitIQU5ETEVfTElCQ0FMTChPR1RfRjEyOCwgIl9fZ3R0ZjIiKQorSEFORExFX0xJQkNBTEwoT0dUX1BQQ0YxMjgsICJfX2djY19xZ3QiKQorSEFORExFX0xJQkNBTEwoVU9fRjMyLCAiX191bm9yZHNmMiIpCitIQU5ETEVfTElCQ0FMTChVT19GNjQsICJfX3Vub3JkZGYyIikKK0hBTkRMRV9MSUJDQUxMKFVPX0YxMjgsICJfX3Vub3JkdGYyIikKK0hBTkRMRV9MSUJDQUxMKFVPX1BQQ0YxMjgsICJfX2djY19xdW5vcmQiKQorSEFORExFX0xJQkNBTEwoT19GMzIsICJfX3Vub3Jkc2YyIikKK0hBTkRMRV9MSUJDQUxMKE9fRjY0LCAiX191bm9yZGRmMiIpCitIQU5ETEVfTElCQ0FMTChPX0YxMjgsICJfX3Vub3JkdGYyIikKK0hBTkRMRV9MSUJDQUxMKE9fUFBDRjEyOCwgIl9fZ2NjX3F1bm9yZCIpCisKKy8vIE1lbW9yeQorSEFORExFX0xJQkNBTEwoTUVNQ1BZLCAibWVtY3B5IikKK0hBTkRMRV9MSUJDQUxMKE1FTU1PVkUsICJtZW1tb3ZlIikKK0hBTkRMRV9MSUJDQUxMKE1FTVNFVCwgIm1lbXNldCIpCitIQU5ETEVfTElCQ0FMTChCWkVSTywgbnVsbHB0cikKKworLy8gRWxlbWVudC13aXNlIHVub3JkZXJlZC1hdG9taWMgbWVtb3J5IG9mIGRpZmZlcmVudCBzaXplcworSEFORExFX0xJQkNBTEwoTUVNQ1BZX0VMRU1FTlRfVU5PUkRFUkVEX0FUT01JQ18xLCAiX19sbHZtX21lbWNweV9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWNfMSIpCitIQU5ETEVfTElCQ0FMTChNRU1DUFlfRUxFTUVOVF9VTk9SREVSRURfQVRPTUlDXzIsICJfX2xsdm1fbWVtY3B5X2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pY18yIikKK0hBTkRMRV9MSUJDQUxMKE1FTUNQWV9FTEVNRU5UX1VOT1JERVJFRF9BVE9NSUNfNCwgIl9fbGx2bV9tZW1jcHlfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljXzQiKQorSEFORExFX0xJQkNBTEwoTUVNQ1BZX0VMRU1FTlRfVU5PUkRFUkVEX0FUT01JQ184LCAiX19sbHZtX21lbWNweV9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWNfOCIpCitIQU5ETEVfTElCQ0FMTChNRU1DUFlfRUxFTUVOVF9VTk9SREVSRURfQVRPTUlDXzE2LCAiX19sbHZtX21lbWNweV9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWNfMTYiKQorSEFORExFX0xJQkNBTEwoTUVNTU9WRV9FTEVNRU5UX1VOT1JERVJFRF9BVE9NSUNfMSwgIl9fbGx2bV9tZW1tb3ZlX2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pY18xIikKK0hBTkRMRV9MSUJDQUxMKE1FTU1PVkVfRUxFTUVOVF9VTk9SREVSRURfQVRPTUlDXzIsICJfX2xsdm1fbWVtbW92ZV9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWNfMiIpCitIQU5ETEVfTElCQ0FMTChNRU1NT1ZFX0VMRU1FTlRfVU5PUkRFUkVEX0FUT01JQ180LCAiX19sbHZtX21lbW1vdmVfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljXzQiKQorSEFORExFX0xJQkNBTEwoTUVNTU9WRV9FTEVNRU5UX1VOT1JERVJFRF9BVE9NSUNfOCwgIl9fbGx2bV9tZW1tb3ZlX2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pY184IikKK0hBTkRMRV9MSUJDQUxMKE1FTU1PVkVfRUxFTUVOVF9VTk9SREVSRURfQVRPTUlDXzE2LCAiX19sbHZtX21lbW1vdmVfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljXzE2IikKK0hBTkRMRV9MSUJDQUxMKE1FTVNFVF9FTEVNRU5UX1VOT1JERVJFRF9BVE9NSUNfMSwgIl9fbGx2bV9tZW1zZXRfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljXzEiKQorSEFORExFX0xJQkNBTEwoTUVNU0VUX0VMRU1FTlRfVU5PUkRFUkVEX0FUT01JQ18yLCAiX19sbHZtX21lbXNldF9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWNfMiIpCitIQU5ETEVfTElCQ0FMTChNRU1TRVRfRUxFTUVOVF9VTk9SREVSRURfQVRPTUlDXzQsICJfX2xsdm1fbWVtc2V0X2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pY180IikKK0hBTkRMRV9MSUJDQUxMKE1FTVNFVF9FTEVNRU5UX1VOT1JERVJFRF9BVE9NSUNfOCwgIl9fbGx2bV9tZW1zZXRfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljXzgiKQorSEFORExFX0xJQkNBTEwoTUVNU0VUX0VMRU1FTlRfVU5PUkRFUkVEX0FUT01JQ18xNiwgIl9fbGx2bV9tZW1zZXRfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljXzE2IikKKworLy8gRXhjZXB0aW9uIGhhbmRsaW5nCitIQU5ETEVfTElCQ0FMTChVTldJTkRfUkVTVU1FLCAiX1Vud2luZF9SZXN1bWUiKQorCisvLyBOb3RlOiB0aGVyZSBhcmUgdHdvIHNldHMgb2YgYXRvbWljcyBsaWJjYWxsczsgc2VlCisvLyA8aHR0cHM6Ly9sbHZtLm9yZy9kb2NzL0F0b21pY3MuaHRtbD4gZm9yIG1vcmUgaW5mbyBvbiB0aGUKKy8vIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVtLgorCisvLyBBdG9taWMgJ19fc3luY18qJyBsaWJjYWxscy4KK0hBTkRMRV9MSUJDQUxMKFNZTkNfVkFMX0NPTVBBUkVfQU5EX1NXQVBfMSwgIl9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcF8xIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfVkFMX0NPTVBBUkVfQU5EX1NXQVBfMiwgIl9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcF8yIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfVkFMX0NPTVBBUkVfQU5EX1NXQVBfNCwgIl9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcF80IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfVkFMX0NPTVBBUkVfQU5EX1NXQVBfOCwgIl9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcF84IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfVkFMX0NPTVBBUkVfQU5EX1NXQVBfMTYsICJfX3N5bmNfdmFsX2NvbXBhcmVfYW5kX3N3YXBfMTYiKQorSEFORExFX0xJQkNBTEwoU1lOQ19MT0NLX1RFU1RfQU5EX1NFVF8xLCAiX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0XzEiKQorSEFORExFX0xJQkNBTEwoU1lOQ19MT0NLX1RFU1RfQU5EX1NFVF8yLCAiX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0XzIiKQorSEFORExFX0xJQkNBTEwoU1lOQ19MT0NLX1RFU1RfQU5EX1NFVF80LCAiX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0XzQiKQorSEFORExFX0xJQkNBTEwoU1lOQ19MT0NLX1RFU1RfQU5EX1NFVF84LCAiX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0XzgiKQorSEFORExFX0xJQkNBTEwoU1lOQ19MT0NLX1RFU1RfQU5EX1NFVF8xNiwgIl9fc3luY19sb2NrX3Rlc3RfYW5kX3NldF8xNiIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9BRERfMSwgIl9fc3luY19mZXRjaF9hbmRfYWRkXzEiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfQUREXzIsICJfX3N5bmNfZmV0Y2hfYW5kX2FkZF8yIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX0FERF80LCAiX19zeW5jX2ZldGNoX2FuZF9hZGRfNCIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9BRERfOCwgIl9fc3luY19mZXRjaF9hbmRfYWRkXzgiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfQUREXzE2LCAiX19zeW5jX2ZldGNoX2FuZF9hZGRfMTYiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfU1VCXzEsICJfX3N5bmNfZmV0Y2hfYW5kX3N1Yl8xIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX1NVQl8yLCAiX19zeW5jX2ZldGNoX2FuZF9zdWJfMiIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9TVUJfNCwgIl9fc3luY19mZXRjaF9hbmRfc3ViXzQiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfU1VCXzgsICJfX3N5bmNfZmV0Y2hfYW5kX3N1Yl84IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX1NVQl8xNiwgIl9fc3luY19mZXRjaF9hbmRfc3ViXzE2IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX0FORF8xLCAiX19zeW5jX2ZldGNoX2FuZF9hbmRfMSIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9BTkRfMiwgIl9fc3luY19mZXRjaF9hbmRfYW5kXzIiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfQU5EXzQsICJfX3N5bmNfZmV0Y2hfYW5kX2FuZF80IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX0FORF84LCAiX19zeW5jX2ZldGNoX2FuZF9hbmRfOCIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9BTkRfMTYsICJfX3N5bmNfZmV0Y2hfYW5kX2FuZF8xNiIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9PUl8xLCAiX19zeW5jX2ZldGNoX2FuZF9vcl8xIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX09SXzIsICJfX3N5bmNfZmV0Y2hfYW5kX29yXzIiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfT1JfNCwgIl9fc3luY19mZXRjaF9hbmRfb3JfNCIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9PUl84LCAiX19zeW5jX2ZldGNoX2FuZF9vcl84IikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX09SXzE2LCAiX19zeW5jX2ZldGNoX2FuZF9vcl8xNiIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9YT1JfMSwgIl9fc3luY19mZXRjaF9hbmRfeG9yXzEiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfWE9SXzIsICJfX3N5bmNfZmV0Y2hfYW5kX3hvcl8yIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX1hPUl80LCAiX19zeW5jX2ZldGNoX2FuZF94b3JfNCIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9YT1JfOCwgIl9fc3luY19mZXRjaF9hbmRfeG9yXzgiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfWE9SXzE2LCAiX19zeW5jX2ZldGNoX2FuZF94b3JfMTYiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfTkFORF8xLCAiX19zeW5jX2ZldGNoX2FuZF9uYW5kXzEiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfTkFORF8yLCAiX19zeW5jX2ZldGNoX2FuZF9uYW5kXzIiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfTkFORF80LCAiX19zeW5jX2ZldGNoX2FuZF9uYW5kXzQiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfTkFORF84LCAiX19zeW5jX2ZldGNoX2FuZF9uYW5kXzgiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfTkFORF8xNiwgIl9fc3luY19mZXRjaF9hbmRfbmFuZF8xNiIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9NQVhfMSwgIl9fc3luY19mZXRjaF9hbmRfbWF4XzEiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfTUFYXzIsICJfX3N5bmNfZmV0Y2hfYW5kX21heF8yIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX01BWF80LCAiX19zeW5jX2ZldGNoX2FuZF9tYXhfNCIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9NQVhfOCwgIl9fc3luY19mZXRjaF9hbmRfbWF4XzgiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfTUFYXzE2LCAiX19zeW5jX2ZldGNoX2FuZF9tYXhfMTYiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfVU1BWF8xLCAiX19zeW5jX2ZldGNoX2FuZF91bWF4XzEiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfVU1BWF8yLCAiX19zeW5jX2ZldGNoX2FuZF91bWF4XzIiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfVU1BWF80LCAiX19zeW5jX2ZldGNoX2FuZF91bWF4XzQiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfVU1BWF84LCAiX19zeW5jX2ZldGNoX2FuZF91bWF4XzgiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfVU1BWF8xNiwgIl9fc3luY19mZXRjaF9hbmRfdW1heF8xNiIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9NSU5fMSwgIl9fc3luY19mZXRjaF9hbmRfbWluXzEiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfTUlOXzIsICJfX3N5bmNfZmV0Y2hfYW5kX21pbl8yIikKK0hBTkRMRV9MSUJDQUxMKFNZTkNfRkVUQ0hfQU5EX01JTl80LCAiX19zeW5jX2ZldGNoX2FuZF9taW5fNCIpCitIQU5ETEVfTElCQ0FMTChTWU5DX0ZFVENIX0FORF9NSU5fOCwgIl9fc3luY19mZXRjaF9hbmRfbWluXzgiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfTUlOXzE2LCAiX19zeW5jX2ZldGNoX2FuZF9taW5fMTYiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfVU1JTl8xLCAiX19zeW5jX2ZldGNoX2FuZF91bWluXzEiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfVU1JTl8yLCAiX19zeW5jX2ZldGNoX2FuZF91bWluXzIiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfVU1JTl80LCAiX19zeW5jX2ZldGNoX2FuZF91bWluXzQiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfVU1JTl84LCAiX19zeW5jX2ZldGNoX2FuZF91bWluXzgiKQorSEFORExFX0xJQkNBTEwoU1lOQ19GRVRDSF9BTkRfVU1JTl8xNiwgIl9fc3luY19mZXRjaF9hbmRfdW1pbl8xNiIpCisKKy8vIEF0b21pYyBgX19hdG9taWNfKicgbGliY2FsbHMuCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfTE9BRCwgIl9fYXRvbWljX2xvYWQiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0xPQURfMSwgIl9fYXRvbWljX2xvYWRfMSIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfTE9BRF8yLCAiX19hdG9taWNfbG9hZF8yIikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19MT0FEXzQsICJfX2F0b21pY19sb2FkXzQiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0xPQURfOCwgIl9fYXRvbWljX2xvYWRfOCIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfTE9BRF8xNiwgIl9fYXRvbWljX2xvYWRfMTYiKQorCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfU1RPUkUsICJfX2F0b21pY19zdG9yZSIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfU1RPUkVfMSwgIl9fYXRvbWljX3N0b3JlXzEiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX1NUT1JFXzIsICJfX2F0b21pY19zdG9yZV8yIikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19TVE9SRV80LCAiX19hdG9taWNfc3RvcmVfNCIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfU1RPUkVfOCwgIl9fYXRvbWljX3N0b3JlXzgiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX1NUT1JFXzE2LCAiX19hdG9taWNfc3RvcmVfMTYiKQorCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRVhDSEFOR0UsICJfX2F0b21pY19leGNoYW5nZSIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRVhDSEFOR0VfMSwgIl9fYXRvbWljX2V4Y2hhbmdlXzEiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0VYQ0hBTkdFXzIsICJfX2F0b21pY19leGNoYW5nZV8yIikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19FWENIQU5HRV80LCAiX19hdG9taWNfZXhjaGFuZ2VfNCIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRVhDSEFOR0VfOCwgIl9fYXRvbWljX2V4Y2hhbmdlXzgiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0VYQ0hBTkdFXzE2LCAiX19hdG9taWNfZXhjaGFuZ2VfMTYiKQorCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfQ09NUEFSRV9FWENIQU5HRSwgIl9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2UiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0NPTVBBUkVfRVhDSEFOR0VfMSwgIl9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfMSIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfQ09NUEFSRV9FWENIQU5HRV8yLCAiX19hdG9taWNfY29tcGFyZV9leGNoYW5nZV8yIikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19DT01QQVJFX0VYQ0hBTkdFXzQsICJfX2F0b21pY19jb21wYXJlX2V4Y2hhbmdlXzQiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0NPTVBBUkVfRVhDSEFOR0VfOCwgIl9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfOCIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfQ09NUEFSRV9FWENIQU5HRV8xNiwgIl9fYXRvbWljX2NvbXBhcmVfZXhjaGFuZ2VfMTYiKQorCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRkVUQ0hfQUREXzEsICJfX2F0b21pY19mZXRjaF9hZGRfMSIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRkVUQ0hfQUREXzIsICJfX2F0b21pY19mZXRjaF9hZGRfMiIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRkVUQ0hfQUREXzQsICJfX2F0b21pY19mZXRjaF9hZGRfNCIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRkVUQ0hfQUREXzgsICJfX2F0b21pY19mZXRjaF9hZGRfOCIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRkVUQ0hfQUREXzE2LCAiX19hdG9taWNfZmV0Y2hfYWRkXzE2IikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9TVUJfMSwgIl9fYXRvbWljX2ZldGNoX3N1Yl8xIikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9TVUJfMiwgIl9fYXRvbWljX2ZldGNoX3N1Yl8yIikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9TVUJfNCwgIl9fYXRvbWljX2ZldGNoX3N1Yl80IikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9TVUJfOCwgIl9fYXRvbWljX2ZldGNoX3N1Yl84IikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9TVUJfMTYsICJfX2F0b21pY19mZXRjaF9zdWJfMTYiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX0FORF8xLCAiX19hdG9taWNfZmV0Y2hfYW5kXzEiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX0FORF8yLCAiX19hdG9taWNfZmV0Y2hfYW5kXzIiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX0FORF80LCAiX19hdG9taWNfZmV0Y2hfYW5kXzQiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX0FORF84LCAiX19hdG9taWNfZmV0Y2hfYW5kXzgiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX0FORF8xNiwgIl9fYXRvbWljX2ZldGNoX2FuZF8xNiIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRkVUQ0hfT1JfMSwgIl9fYXRvbWljX2ZldGNoX29yXzEiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX09SXzIsICJfX2F0b21pY19mZXRjaF9vcl8yIikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9PUl80LCAiX19hdG9taWNfZmV0Y2hfb3JfNCIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRkVUQ0hfT1JfOCwgIl9fYXRvbWljX2ZldGNoX29yXzgiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX09SXzE2LCAiX19hdG9taWNfZmV0Y2hfb3JfMTYiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX1hPUl8xLCAiX19hdG9taWNfZmV0Y2hfeG9yXzEiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX1hPUl8yLCAiX19hdG9taWNfZmV0Y2hfeG9yXzIiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX1hPUl80LCAiX19hdG9taWNfZmV0Y2hfeG9yXzQiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX1hPUl84LCAiX19hdG9taWNfZmV0Y2hfeG9yXzgiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX1hPUl8xNiwgIl9fYXRvbWljX2ZldGNoX3hvcl8xNiIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRkVUQ0hfTkFORF8xLCAiX19hdG9taWNfZmV0Y2hfbmFuZF8xIikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9OQU5EXzIsICJfX2F0b21pY19mZXRjaF9uYW5kXzIiKQorSEFORExFX0xJQkNBTEwoQVRPTUlDX0ZFVENIX05BTkRfNCwgIl9fYXRvbWljX2ZldGNoX25hbmRfNCIpCitIQU5ETEVfTElCQ0FMTChBVE9NSUNfRkVUQ0hfTkFORF84LCAiX19hdG9taWNfZmV0Y2hfbmFuZF84IikKK0hBTkRMRV9MSUJDQUxMKEFUT01JQ19GRVRDSF9OQU5EXzE2LCAiX19hdG9taWNfZmV0Y2hfbmFuZF8xNiIpCisKKy8vIFN0YWNrIFByb3RlY3RvciBGYWlsCitIQU5ETEVfTElCQ0FMTChTVEFDS1BST1RFQ1RPUl9DSEVDS19GQUlMLCAiX19zdGFja19jaGtfZmFpbCIpCisKKy8vIERlb3B0aW1pemF0aW9uCitIQU5ETEVfTElCQ0FMTChERU9QVElNSVpFLCAiX19sbHZtX2Rlb3B0aW1pemUiKQorCitIQU5ETEVfTElCQ0FMTChVTktOT1dOX0xJQkNBTEwsIG51bGxwdHIpCisKKyN1bmRlZiBIQU5ETEVfTElCQ0FMTApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1J1bnRpbWVMaWJjYWxscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1J1bnRpbWVMaWJjYWxscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAxNmJlZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vUnVudGltZUxpYmNhbGxzLmgKQEAgLTAsMCArMSw4MiBAQAorLy89PT0tLSBDb2RlR2VuL1J1bnRpbWVMaWJjYWxscy5oIC0gUnVudGltZSBMaWJyYXJ5IENhbGxzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZW51bSByZXByZXNlbnRpbmcgdGhlIGxpc3Qgb2YgcnVudGltZSBsaWJyYXJ5IGNhbGxzCisvLyB0aGUgYmFja2VuZCBtYXkgZW1pdCBkdXJpbmcgY29kZSBnZW5lcmF0aW9uLCBhbmQgYWxzbyBzb21lIGhlbHBlciBmdW5jdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fUlVOVElNRUxJQkNBTExTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1JVTlRJTUVMSUJDQUxMU19ICisKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgUlRMSUIgeworICAvLy8gUlRMSUI6OkxpYmNhbGwgZW51bSAtIFRoaXMgZW51bSBkZWZpbmVzIGFsbCBvZiB0aGUgcnVudGltZSBsaWJyYXJ5IGNhbGxzCisgIC8vLyB0aGUgYmFja2VuZCBjYW4gZW1pdC4gIFRoZSB2YXJpb3VzIGxvbmcgZG91YmxlIHR5cGVzIGNhbm5vdCBiZSBtZXJnZWQsCisgIC8vLyBiZWNhdXNlIDgwLWJpdCBsaWJyYXJ5IGZ1bmN0aW9ucyB1c2UgInhmIiBhbmQgMTI4LWJpdCB1c2UgInRmIi4KKyAgLy8vCisgIC8vLyBXaGVuIGFkZGluZyBQUENGMTI4IGZ1bmN0aW9ucyBoZXJlLCBub3RlIHRoYXQgdGhlaXIgbmFtZXMgZ2VuZXJhbGx5IG5lZWQKKyAgLy8vIHRvIGJlIG92ZXJyaWRkZW4gZm9yIERhcndpbiB3aXRoIHRoZSB4eHgkTERCTDEyOCBmb3JtLiAgU2VlCisgIC8vLyBQUENJU2VsTG93ZXJpbmcuY3BwLgorICAvLy8KKyAgZW51bSBMaWJjYWxsIHsKKyNkZWZpbmUgSEFORExFX0xJQkNBTEwoY29kZSwgbmFtZSkgY29kZSwKKyAgICAjaW5jbHVkZSAiUnVudGltZUxpYmNhbGxzLmRlZiIKKyN1bmRlZiBIQU5ETEVfTElCQ0FMTAorICB9OworCisgIC8vLyBnZXRGUEVYVCAtIFJldHVybiB0aGUgRlBFWFRfKl8qIHZhbHVlIGZvciB0aGUgZ2l2ZW4gdHlwZXMsIG9yCisgIC8vLyBVTktOT1dOX0xJQkNBTEwgaWYgdGhlcmUgaXMgbm9uZS4KKyAgTGliY2FsbCBnZXRGUEVYVChFVlQgT3BWVCwgRVZUIFJldFZUKTsKKworICAvLy8gZ2V0RlBST1VORCAtIFJldHVybiB0aGUgRlBST1VORF8qXyogdmFsdWUgZm9yIHRoZSBnaXZlbiB0eXBlcywgb3IKKyAgLy8vIFVOS05PV05fTElCQ0FMTCBpZiB0aGVyZSBpcyBub25lLgorICBMaWJjYWxsIGdldEZQUk9VTkQoRVZUIE9wVlQsIEVWVCBSZXRWVCk7CisKKyAgLy8vIGdldEZQVE9TSU5UIC0gUmV0dXJuIHRoZSBGUFRPU0lOVF8qXyogdmFsdWUgZm9yIHRoZSBnaXZlbiB0eXBlcywgb3IKKyAgLy8vIFVOS05PV05fTElCQ0FMTCBpZiB0aGVyZSBpcyBub25lLgorICBMaWJjYWxsIGdldEZQVE9TSU5UKEVWVCBPcFZULCBFVlQgUmV0VlQpOworCisgIC8vLyBnZXRGUFRPVUlOVCAtIFJldHVybiB0aGUgRlBUT1VJTlRfKl8qIHZhbHVlIGZvciB0aGUgZ2l2ZW4gdHlwZXMsIG9yCisgIC8vLyBVTktOT1dOX0xJQkNBTEwgaWYgdGhlcmUgaXMgbm9uZS4KKyAgTGliY2FsbCBnZXRGUFRPVUlOVChFVlQgT3BWVCwgRVZUIFJldFZUKTsKKworICAvLy8gZ2V0U0lOVFRPRlAgLSBSZXR1cm4gdGhlIFNJTlRUT0ZQXypfKiB2YWx1ZSBmb3IgdGhlIGdpdmVuIHR5cGVzLCBvcgorICAvLy8gVU5LTk9XTl9MSUJDQUxMIGlmIHRoZXJlIGlzIG5vbmUuCisgIExpYmNhbGwgZ2V0U0lOVFRPRlAoRVZUIE9wVlQsIEVWVCBSZXRWVCk7CisKKyAgLy8vIGdldFVJTlRUT0ZQIC0gUmV0dXJuIHRoZSBVSU5UVE9GUF8qXyogdmFsdWUgZm9yIHRoZSBnaXZlbiB0eXBlcywgb3IKKyAgLy8vIFVOS05PV05fTElCQ0FMTCBpZiB0aGVyZSBpcyBub25lLgorICBMaWJjYWxsIGdldFVJTlRUT0ZQKEVWVCBPcFZULCBFVlQgUmV0VlQpOworCisgIC8vLyBSZXR1cm4gdGhlIFNZTkNfRkVUQ0hfQU5EXyogdmFsdWUgZm9yIHRoZSBnaXZlbiBvcGNvZGUgYW5kIHR5cGUsIG9yCisgIC8vLyBVTktOT1dOX0xJQkNBTEwgaWYgdGhlcmUgaXMgbm9uZS4KKyAgTGliY2FsbCBnZXRTWU5DKHVuc2lnbmVkIE9wYywgTVZUIFZUKTsKKworICAvLy8gZ2V0TUVNQ1BZX0VMRU1FTlRfVU5PUkRFUkVEX0FUT01JQyAtIFJldHVybgorICAvLy8gTUVNQ1BZX0VMRU1FTlRfVU5PUkRFUkVEX0FUT01JQ18qIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZWxlbWVudCBzaXplIG9yCisgIC8vLyBVTktOT1dfTElCQ0FMTCBpZiB0aGVyZSBpcyBub25lLgorICBMaWJjYWxsIGdldE1FTUNQWV9FTEVNRU5UX1VOT1JERVJFRF9BVE9NSUModWludDY0X3QgRWxlbWVudFNpemUpOworCisgIC8vLyBnZXRNRU1NT1ZFX0VMRU1FTlRfVU5PUkRFUkVEX0FUT01JQyAtIFJldHVybgorICAvLy8gTUVNTU9WRV9FTEVNRU5UX1VOT1JERVJFRF9BVE9NSUNfKiB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgc2l6ZSBvcgorICAvLy8gVU5LTk9XX0xJQkNBTEwgaWYgdGhlcmUgaXMgbm9uZS4KKyAgTGliY2FsbCBnZXRNRU1NT1ZFX0VMRU1FTlRfVU5PUkRFUkVEX0FUT01JQyh1aW50NjRfdCBFbGVtZW50U2l6ZSk7CisKKyAgLy8vIGdldE1FTVNFVF9FTEVNRU5UX1VOT1JERVJFRF9BVE9NSUMgLSBSZXR1cm4KKyAgLy8vIE1FTVNFVF9FTEVNRU5UX1VOT1JERVJFRF9BVE9NSUNfKiB2YWx1ZSBmb3IgdGhlIGdpdmVuIGVsZW1lbnQgc2l6ZSBvcgorICAvLy8gVU5LTk9XX0xJQkNBTEwgaWYgdGhlcmUgaXMgbm9uZS4KKyAgTGliY2FsbCBnZXRNRU1TRVRfRUxFTUVOVF9VTk9SREVSRURfQVRPTUlDKHVpbnQ2NF90IEVsZW1lbnRTaXplKTsKKworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TRE5vZGVQcm9wZXJ0aWVzLnRkIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NETm9kZVByb3BlcnRpZXMudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNiYmFiMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TRE5vZGVQcm9wZXJ0aWVzLnRkCkBAIC0wLDAgKzEsMzQgQEAKKy8vPT09LSBTRE5vZGVQcm9wZXJ0aWVzLnRkIC0gQ29tbW9uIGNvZGUgZm9yIERBRyBpc2VscyAtLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBTRE5vZGVQcm9wZXJ0eTsKKworLy8gU2VsZWN0aW9uIERBRyBQYXR0ZXJuIE9wZXJhdGlvbnMKK2NsYXNzIFNEUGF0dGVybk9wZXJhdG9yIHsKKyAgbGlzdDxTRE5vZGVQcm9wZXJ0eT4gUHJvcGVydGllcyA9IFtdOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU2VsZWN0aW9uIERBRyBOb2RlIFByb3BlcnRpZXMuCisvLworLy8gTm90ZTogVGhlc2UgYXJlIGhhcmQgY29kZWQgaW50byB0YmxnZW4uCisvLworZGVmIFNETlBDb21tdXRhdGl2ZSA6IFNETm9kZVByb3BlcnR5OyAgIC8vIFggb3AgWSA9PSBZIG9wIFgKK2RlZiBTRE5QQXNzb2NpYXRpdmUgOiBTRE5vZGVQcm9wZXJ0eTsgICAvLyAoWCBvcCBZKSBvcCBaID09IFggb3AgKFkgb3AgWikKK2RlZiBTRE5QSGFzQ2hhaW4gICAgOiBTRE5vZGVQcm9wZXJ0eTsgICAvLyBSL1cgY2hhaW4gb3BlcmFuZCBhbmQgcmVzdWx0CitkZWYgU0ROUE91dEdsdWUgICAgIDogU0ROb2RlUHJvcGVydHk7ICAgLy8gV3JpdGUgYSBmbGFnIHJlc3VsdAorZGVmIFNETlBJbkdsdWUgICAgICA6IFNETm9kZVByb3BlcnR5OyAgIC8vIFJlYWQgYSBmbGFnIG9wZXJhbmQKK2RlZiBTRE5QT3B0SW5HbHVlICAgOiBTRE5vZGVQcm9wZXJ0eTsgICAvLyBPcHRpb25hbGx5IHJlYWQgYSBmbGFnIG9wZXJhbmQKK2RlZiBTRE5QTWF5U3RvcmUgICAgOiBTRE5vZGVQcm9wZXJ0eTsgICAvLyBNYXkgd3JpdGUgdG8gbWVtb3J5LCBzZXRzICdtYXlTdG9yZScuCitkZWYgU0ROUE1heUxvYWQgICAgIDogU0ROb2RlUHJvcGVydHk7ICAgLy8gTWF5IHJlYWQgbWVtb3J5LCBzZXRzICdtYXlMb2FkJy4KK2RlZiBTRE5QU2lkZUVmZmVjdCAgOiBTRE5vZGVQcm9wZXJ0eTsgICAvLyBTZXRzICdIYXNVbm1vZGVsbGVkU2lkZUVmZmVjdHMnLgorZGVmIFNETlBNZW1PcGVyYW5kICA6IFNETm9kZVByb3BlcnR5OyAgIC8vIFRvdWNoZXMgbWVtb3J5LCBoYXMgYXNzb2MgTWVtT3BlcmFuZAorZGVmIFNETlBWYXJpYWRpYyAgICA6IFNETm9kZVByb3BlcnR5OyAgIC8vIE5vZGUgaGFzIHZhcmlhYmxlIGFyZ3VtZW50cy4KK2RlZiBTRE5QV2FudFJvb3QgICAgOiBTRE5vZGVQcm9wZXJ0eTsgICAvLyBDb21wbGV4UGF0dGVybiBnZXRzIHRoZSByb290IG9mIG1hdGNoCitkZWYgU0ROUFdhbnRQYXJlbnQgIDogU0ROb2RlUHJvcGVydHk7ICAgLy8gQ29tcGxleFBhdHRlcm4gZ2V0cyB0aGUgcGFyZW50CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TY2hlZHVsZURBRy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZjJmMDUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUcuaApAQCAtMCwwICsxLDc2NCBAQAorLy89PT0tIGxsdm0vQ29kZUdlbi9TY2hlZHVsZURBRy5oIC0gQ29tbW9uIEJhc2UgQ2xhc3MgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUgSW1wbGVtZW50cyB0aGUgU2NoZWR1bGVEQUcgY2xhc3MsIHdoaWNoIGlzIHVzZWQgYXMgdGhlIGNvbW1vbiBiYXNlCisvLy8gY2xhc3MgZm9yIGluc3RydWN0aW9uIHNjaGVkdWxlcnMuIFRoaXMgZW5jYXBzdWxhdGVzIHRoZSBzY2hlZHVsaW5nIERBRywKKy8vLyB3aGljaCBpcyBzaGFyZWQgYmV0d2VlbiBTZWxlY3Rpb25EQUcgYW5kIE1hY2hpbmVJbnN0ciBzY2hlZHVsaW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1NDSEVEVUxFREFHX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1NDSEVEVUxFREFHX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0JpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVJbnN0ci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRMb3dlcmluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGU8Y2xhc3MgR3JhcGg+IGNsYXNzIEdyYXBoV3JpdGVyOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIE1DSW5zdHJEZXNjOworc3RydWN0IE1DU2NoZWRDbGFzc0Rlc2M7CitjbGFzcyBTY2hlZHVsZURBRzsKK2NsYXNzIFNETm9kZTsKK2NsYXNzIFNVbml0OworY2xhc3MgVGFyZ2V0SW5zdHJJbmZvOworY2xhc3MgVGFyZ2V0TWFjaGluZTsKK2NsYXNzIFRhcmdldFJlZ2lzdGVyQ2xhc3M7CitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CisKKyAgLy8vIFNjaGVkdWxpbmcgZGVwZW5kZW5jeS4gVGhpcyByZXByZXNlbnRzIG9uZSBkaXJlY3Rpb24gb2YgYW4gZWRnZSBpbiB0aGUKKyAgLy8vIHNjaGVkdWxpbmcgREFHLgorICBjbGFzcyBTRGVwIHsKKyAgcHVibGljOgorICAgIC8vLyBUaGVzZSBhcmUgdGhlIGRpZmZlcmVudCBraW5kcyBvZiBzY2hlZHVsaW5nIGRlcGVuZGVuY2llcy4KKyAgICBlbnVtIEtpbmQgeworICAgICAgRGF0YSwgICAgICAgIC8vLzwgUmVndWxhciBkYXRhIGRlcGVuZGVuY2UgKGFrYSB0cnVlLWRlcGVuZGVuY2UpLgorICAgICAgQW50aSwgICAgICAgIC8vLzwgQSByZWdpc3RlciBhbnRpLWRlcGVuZGVuY2UgKGFrYSBXQVIpLgorICAgICAgT3V0cHV0LCAgICAgIC8vLzwgQSByZWdpc3RlciBvdXRwdXQtZGVwZW5kZW5jZSAoYWthIFdBVykuCisgICAgICBPcmRlciAgICAgICAgLy8vPCBBbnkgb3RoZXIgb3JkZXJpbmcgZGVwZW5kZW5jeS4KKyAgICB9OworCisgICAgLy8gU3Ryb25nIGRlcGVuZGVuY2llcyBtdXN0IGJlIHJlc3BlY3RlZCBieSB0aGUgc2NoZWR1bGVyLiBBcnRpZmljaWFsCisgICAgLy8gZGVwZW5kZW5jaWVzIG1heSBiZSByZW1vdmVkIG9ubHkgaWYgdGhleSBhcmUgcmVkdW5kYW50IHdpdGggYW5vdGhlcgorICAgIC8vIHN0cm9uZyBkZXBlbmRlbmNlLgorICAgIC8vCisgICAgLy8gV2VhayBkZXBlbmRlbmNpZXMgbWF5IGJlIHZpb2xhdGVkIGJ5IHRoZSBzY2hlZHVsaW5nIHN0cmF0ZWd5LCBidXQgb25seSBpZgorICAgIC8vIHRoZSBzdHJhdGVneSBjYW4gcHJvdmUgaXQgaXMgY29ycmVjdCB0byBkbyBzby4KKyAgICAvLworICAgIC8vIFN0cm9uZyBPcmRlcktpbmRzIG11c3Qgb2NjdXIgYmVmb3JlICJXZWFrIi4KKyAgICAvLyBXZWFrIE9yZGVyS2luZHMgbXVzdCBvY2N1ciBhZnRlciAiV2VhayIuCisgICAgZW51bSBPcmRlcktpbmQgeworICAgICAgQmFycmllciwgICAgICAvLy88IEFuIHVua25vd24gc2NoZWR1bGluZyBiYXJyaWVyLgorICAgICAgTWF5QWxpYXNNZW0sICAvLy88IE5vbnZvbGF0aWxlIGxvYWQvU3RvcmUgaW5zdHJ1Y3Rpb25zIHRoYXQgbWF5IGFsaWFzLgorICAgICAgTXVzdEFsaWFzTWVtLCAvLy88IE5vbnZvbGF0aWxlIGxvYWQvU3RvcmUgaW5zdHJ1Y3Rpb25zIHRoYXQgbXVzdCBhbGlhcy4KKyAgICAgIEFydGlmaWNpYWwsICAgLy8vPCBBcmJpdHJhcnkgc3Ryb25nIERBRyBlZGdlIChubyByZWFsIGRlcGVuZGVuY2UpLgorICAgICAgV2VhaywgICAgICAgICAvLy88IEFyYml0cmFyeSB3ZWFrIERBRyBlZGdlLgorICAgICAgQ2x1c3RlciAgICAgICAvLy88IFdlYWsgREFHIGVkZ2UgbGlua2luZyBhIGNoYWluIG9mIGNsdXN0ZXJlZCBpbnN0cnMuCisgICAgfTsKKworICBwcml2YXRlOgorICAgIC8vLyBcYnJpZWYgQSBwb2ludGVyIHRvIHRoZSBkZXBlbmRpbmcvZGVwZW5kZWQtb24gU1VuaXQsIGFuZCBhbiBlbnVtCisgICAgLy8vIGluZGljYXRpbmcgdGhlIGtpbmQgb2YgdGhlIGRlcGVuZGVuY3kuCisgICAgUG9pbnRlckludFBhaXI8U1VuaXQgKiwgMiwgS2luZD4gRGVwOworCisgICAgLy8vIEEgdW5pb24gZGlzY3JpbWluYXRlZCBieSB0aGUgZGVwZW5kZW5jZSBraW5kLgorICAgIHVuaW9uIHsKKyAgICAgIC8vLyBGb3IgRGF0YSwgQW50aSwgYW5kIE91dHB1dCBkZXBlbmRlbmNpZXMsIHRoZSBhc3NvY2lhdGVkIHJlZ2lzdGVyLiBGb3IKKyAgICAgIC8vLyBEYXRhIGRlcGVuZGVuY2llcyB0aGF0IGRvbid0IGN1cnJlbnRseSBoYXZlIGEgcmVnaXN0ZXIvIGFzc2lnbmVkLCB0aGlzCisgICAgICAvLy8gaXMgc2V0IHRvIHplcm8uCisgICAgICB1bnNpZ25lZCBSZWc7CisKKyAgICAgIC8vLyBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IE9yZGVyIGRlcGVuZGVuY2llcy4KKyAgICAgIHVuc2lnbmVkIE9yZEtpbmQ7IC8vIGVudW0gT3JkZXJLaW5kCisgICAgfSBDb250ZW50czsKKworICAgIC8vLyBUaGUgdGltZSBhc3NvY2lhdGVkIHdpdGggdGhpcyBlZGdlLiBPZnRlbiB0aGlzIGlzIGp1c3QgdGhlIHZhbHVlIG9mIHRoZQorICAgIC8vLyBMYXRlbmN5IGZpZWxkIG9mIHRoZSBwcmVkZWNlc3NvciwgaG93ZXZlciBhZHZhbmNlZCBtb2RlbHMgbWF5IHByb3ZpZGUKKyAgICAvLy8gYWRkaXRpb25hbCBpbmZvcm1hdGlvbiBhYm91dCBzcGVjaWZpYyBlZGdlcy4KKyAgICB1bnNpZ25lZCBMYXRlbmN5OworCisgIHB1YmxpYzoKKyAgICAvLy8gQ29uc3RydWN0cyBhIG51bGwgU0RlcC4gVGhpcyBpcyBvbmx5IGZvciB1c2UgYnkgY29udGFpbmVyIGNsYXNzZXMgd2hpY2gKKyAgICAvLy8gcmVxdWlyZSBkZWZhdWx0IGNvbnN0cnVjdG9ycy4gU1VuaXRzIG1heSBub3QvIGhhdmUgbnVsbCBTRGVwIGVkZ2VzLgorICAgIFNEZXAoKSA6IERlcChudWxscHRyLCBEYXRhKSB7fQorCisgICAgLy8vIENvbnN0cnVjdHMgYW4gU0RlcCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWVzLgorICAgIFNEZXAoU1VuaXQgKlMsIEtpbmQga2luZCwgdW5zaWduZWQgUmVnKQorICAgICAgOiBEZXAoUywga2luZCksIENvbnRlbnRzKCkgeworICAgICAgc3dpdGNoIChraW5kKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJSZWcgZ2l2ZW4gZm9yIG5vbi1yZWdpc3RlciBkZXBlbmRlbmNlISIpOworICAgICAgY2FzZSBBbnRpOgorICAgICAgY2FzZSBPdXRwdXQ6CisgICAgICAgIGFzc2VydChSZWcgIT0gMCAmJgorICAgICAgICAgICAgICAgIlNEZXA6OkFudGkgYW5kIFNEZXA6Ok91dHB1dCBtdXN0IHVzZSBhIG5vbi16ZXJvIFJlZyEiKTsKKyAgICAgICAgQ29udGVudHMuUmVnID0gUmVnOworICAgICAgICBMYXRlbmN5ID0gMDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIERhdGE6CisgICAgICAgIENvbnRlbnRzLlJlZyA9IFJlZzsKKyAgICAgICAgTGF0ZW5jeSA9IDE7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIFNEZXAoU1VuaXQgKlMsIE9yZGVyS2luZCBraW5kKQorICAgICAgOiBEZXAoUywgT3JkZXIpLCBDb250ZW50cygpLCBMYXRlbmN5KDApIHsKKyAgICAgIENvbnRlbnRzLk9yZEtpbmQgPSBraW5kOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBTRGVwIGlzIGVxdWl2YWxlbnQgZXhjZXB0IGZvciBsYXRlbmN5LgorICAgIGJvb2wgb3ZlcmxhcHMoY29uc3QgU0RlcCAmT3RoZXIpIGNvbnN0OworCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNEZXAgJk90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gb3ZlcmxhcHMoT3RoZXIpICYmIExhdGVuY3kgPT0gT3RoZXIuTGF0ZW5jeTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgU0RlcCAmT3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhb3BlcmF0b3I9PShPdGhlcik7CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBsYXRlbmN5IHZhbHVlIGZvciB0aGlzIGVkZ2UsIHdoaWNoIHJvdWdobHkgbWVhbnMgdGhlCisgICAgLy8vIG1pbmltdW0gbnVtYmVyIG9mIGN5Y2xlcyB0aGF0IG11c3QgZWxhcHNlIGJldHdlZW4gdGhlIHByZWRlY2Vzc29yIGFuZAorICAgIC8vLyB0aGUgc3VjY2Vzc29yLCBnaXZlbiB0aGF0IHRoZXkgaGF2ZSB0aGlzIGVkZ2UgYmV0d2VlbiB0aGVtLgorICAgIHVuc2lnbmVkIGdldExhdGVuY3koKSBjb25zdCB7CisgICAgICByZXR1cm4gTGF0ZW5jeTsKKyAgICB9CisKKyAgICAvLy8gU2V0cyB0aGUgbGF0ZW5jeSBmb3IgdGhpcyBlZGdlLgorICAgIHZvaWQgc2V0TGF0ZW5jeSh1bnNpZ25lZCBMYXQpIHsKKyAgICAgIExhdGVuY3kgPSBMYXQ7CisgICAgfQorCisgICAgLy8vLyBSZXR1cm5zIHRoZSBTVW5pdCB0byB3aGljaCB0aGlzIGVkZ2UgcG9pbnRzLgorICAgIFNVbml0ICpnZXRTVW5pdCgpIGNvbnN0OworCisgICAgLy8vLyBBc3NpZ25zIHRoZSBTVW5pdCB0byB3aGljaCB0aGlzIGVkZ2UgcG9pbnRzLgorICAgIHZvaWQgc2V0U1VuaXQoU1VuaXQgKlNVKTsKKworICAgIC8vLyBSZXR1cm5zIGFuIGVudW0gdmFsdWUgcmVwcmVzZW50aW5nIHRoZSBraW5kIG9mIHRoZSBkZXBlbmRlbmNlLgorICAgIEtpbmQgZ2V0S2luZCgpIGNvbnN0OworCisgICAgLy8vIFNob3J0aGFuZCBmb3IgZ2V0S2luZCgpICE9IFNEZXA6OkRhdGEuCisgICAgYm9vbCBpc0N0cmwoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0S2luZCgpICE9IERhdGE7CisgICAgfQorCisgICAgLy8vIFxicmllZiBUZXN0cyBpZiB0aGlzIGlzIGFuIE9yZGVyIGRlcGVuZGVuY2UgYmV0d2VlbiB0d28gbWVtb3J5IGFjY2Vzc2VzCisgICAgLy8vIHdoZXJlIGJvdGggc2lkZXMgb2YgdGhlIGRlcGVuZGVuY2UgYWNjZXNzIG1lbW9yeSBpbiBub24tdm9sYXRpbGUgYW5kCisgICAgLy8vIGZ1bGx5IG1vZGVsZWQgd2F5cy4KKyAgICBib29sIGlzTm9ybWFsTWVtb3J5KCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldEtpbmQoKSA9PSBPcmRlciAmJiAoQ29udGVudHMuT3JkS2luZCA9PSBNYXlBbGlhc01lbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfHwgQ29udGVudHMuT3JkS2luZCA9PSBNdXN0QWxpYXNNZW0pOworICAgIH0KKworICAgIC8vLyBUZXN0cyBpZiB0aGlzIGlzIGFuIE9yZGVyIGRlcGVuZGVuY2UgdGhhdCBpcyBtYXJrZWQgYXMgYSBiYXJyaWVyLgorICAgIGJvb2wgaXNCYXJyaWVyKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldEtpbmQoKSA9PSBPcmRlciAmJiBDb250ZW50cy5PcmRLaW5kID09IEJhcnJpZXI7CisgICAgfQorCisgICAgLy8vIFRlc3RzIGlmIHRoaXMgaXMgY291bGQgYmUgYW55IGtpbmQgb2YgbWVtb3J5IGRlcGVuZGVuY2UuCisgICAgYm9vbCBpc05vcm1hbE1lbW9yeU9yQmFycmllcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoaXNOb3JtYWxNZW1vcnkoKSB8fCBpc0JhcnJpZXIoKSk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBUZXN0cyBpZiB0aGlzIGlzIGFuIE9yZGVyIGRlcGVuZGVuY2UgdGhhdCBpcyBtYXJrZWQgYXMKKyAgICAvLy8gIm11c3QgYWxpYXMiLCBtZWFuaW5nIHRoYXQgdGhlIFNVbml0cyBhdCBlaXRoZXIgZW5kIG9mIHRoZSBlZGdlIGhhdmUgYQorICAgIC8vLyBtZW1vcnkgZGVwZW5kZW5jZSBvbiBhIGtub3duIG1lbW9yeSBsb2NhdGlvbi4KKyAgICBib29sIGlzTXVzdEFsaWFzKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldEtpbmQoKSA9PSBPcmRlciAmJiBDb250ZW50cy5PcmRLaW5kID09IE11c3RBbGlhc01lbTsKKyAgICB9CisKKyAgICAvLy8gVGVzdHMgaWYgdGhpcyBhIHdlYWsgZGVwZW5kZW5jZS4gV2VhayBkZXBlbmRlbmNpZXMgYXJlIGNvbnNpZGVyZWQgREFHCisgICAgLy8vIGVkZ2VzIGZvciBoZWlnaHQgY29tcHV0YXRpb24gYW5kIG90aGVyIGhldXJpc3RpY3MsIGJ1dCBkbyBub3QgZm9yY2UKKyAgICAvLy8gb3JkZXJpbmcuIEJyZWFraW5nIGEgd2VhayBlZGdlIG1heSByZXF1aXJlIHRoZSBzY2hlZHVsZXIgdG8gY29tcGVuc2F0ZSwKKyAgICAvLy8gZm9yIGV4YW1wbGUgYnkgaW5zZXJ0aW5nIGEgY29weS4KKyAgICBib29sIGlzV2VhaygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRLaW5kKCkgPT0gT3JkZXIgJiYgQ29udGVudHMuT3JkS2luZCA+PSBXZWFrOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgVGVzdHMgaWYgdGhpcyBpcyBhbiBPcmRlciBkZXBlbmRlbmNlIHRoYXQgaXMgbWFya2VkIGFzCisgICAgLy8vICJhcnRpZmljaWFsIiwgbWVhbmluZyBpdCBpc24ndCBuZWNlc3NhcnkgZm9yIGNvcnJlY3RuZXNzLgorICAgIGJvb2wgaXNBcnRpZmljaWFsKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldEtpbmQoKSA9PSBPcmRlciAmJiBDb250ZW50cy5PcmRLaW5kID09IEFydGlmaWNpYWw7CisgICAgfQorCisgICAgLy8vIFxicmllZiBUZXN0cyBpZiB0aGlzIGlzIGFuIE9yZGVyIGRlcGVuZGVuY2UgdGhhdCBpcyBtYXJrZWQgYXMgImNsdXN0ZXIiLAorICAgIC8vLyBtZWFuaW5nIGl0IGlzIGFydGlmaWNpYWwgYW5kIHdhbnRzIHRvIGJlIGFkamFjZW50LgorICAgIGJvb2wgaXNDbHVzdGVyKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldEtpbmQoKSA9PSBPcmRlciAmJiBDb250ZW50cy5PcmRLaW5kID09IENsdXN0ZXI7CisgICAgfQorCisgICAgLy8vIFRlc3RzIGlmIHRoaXMgaXMgYSBEYXRhIGRlcGVuZGVuY2UgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggYSByZWdpc3Rlci4KKyAgICBib29sIGlzQXNzaWduZWRSZWdEZXAoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0S2luZCgpID09IERhdGEgJiYgQ29udGVudHMuUmVnICE9IDA7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIHJlZ2lzdGVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVkZ2UuIFRoaXMgaXMgb25seSB2YWxpZCBvbgorICAgIC8vLyBEYXRhLCBBbnRpLCBhbmQgT3V0cHV0IGVkZ2VzLiBPbiBEYXRhIGVkZ2VzLCB0aGlzIHZhbHVlIG1heSBiZSB6ZXJvLAorICAgIC8vLyBtZWFuaW5nIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgcmVnaXN0ZXIuCisgICAgdW5zaWduZWQgZ2V0UmVnKCkgY29uc3QgeworICAgICAgYXNzZXJ0KChnZXRLaW5kKCkgPT0gRGF0YSB8fCBnZXRLaW5kKCkgPT0gQW50aSB8fCBnZXRLaW5kKCkgPT0gT3V0cHV0KSAmJgorICAgICAgICAgICAgICJnZXRSZWcgY2FsbGVkIG9uIG5vbi1yZWdpc3RlciBkZXBlbmRlbmNlIGVkZ2UhIik7CisgICAgICByZXR1cm4gQ29udGVudHMuUmVnOworICAgIH0KKworICAgIC8vLyBBc3NpZ25zIHRoZSBhc3NvY2lhdGVkIHJlZ2lzdGVyIGZvciB0aGlzIGVkZ2UuIFRoaXMgaXMgb25seSB2YWxpZCBvbgorICAgIC8vLyBEYXRhLCBBbnRpLCBhbmQgT3V0cHV0IGVkZ2VzLiBPbiBBbnRpIGFuZCBPdXRwdXQgZWRnZXMsIHRoaXMgdmFsdWUgbXVzdAorICAgIC8vLyBub3QgYmUgemVyby4gT24gRGF0YSBlZGdlcywgdGhlIHZhbHVlIG1heSBiZSB6ZXJvLCB3aGljaCB3b3VsZCBtZWFuIHRoYXQKKyAgICAvLy8gbm8gc3BlY2lmaWMgcmVnaXN0ZXIgaXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZWRnZS4KKyAgICB2b2lkIHNldFJlZyh1bnNpZ25lZCBSZWcpIHsKKyAgICAgIGFzc2VydCgoZ2V0S2luZCgpID09IERhdGEgfHwgZ2V0S2luZCgpID09IEFudGkgfHwgZ2V0S2luZCgpID09IE91dHB1dCkgJiYKKyAgICAgICAgICAgICAic2V0UmVnIGNhbGxlZCBvbiBub24tcmVnaXN0ZXIgZGVwZW5kZW5jZSBlZGdlISIpOworICAgICAgYXNzZXJ0KChnZXRLaW5kKCkgIT0gQW50aSB8fCBSZWcgIT0gMCkgJiYKKyAgICAgICAgICAgICAiU0RlcDo6QW50aSBlZGdlIGNhbm5vdCB1c2UgdGhlIHplcm8gcmVnaXN0ZXIhIik7CisgICAgICBhc3NlcnQoKGdldEtpbmQoKSAhPSBPdXRwdXQgfHwgUmVnICE9IDApICYmCisgICAgICAgICAgICAgIlNEZXA6Ok91dHB1dCBlZGdlIGNhbm5vdCB1c2UgdGhlIHplcm8gcmVnaXN0ZXIhIik7CisgICAgICBDb250ZW50cy5SZWcgPSBSZWc7CisgICAgfQorCisgICAgcmF3X29zdHJlYW0gJnByaW50KHJhd19vc3RyZWFtICZPLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSA9IG51bGxwdHIpIGNvbnN0OworICB9OworCisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBpc1BvZExpa2U8U0RlcD4geyBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7IH07CisKKyAgLy8vIFNjaGVkdWxpbmcgdW5pdC4gVGhpcyBpcyBhIG5vZGUgaW4gdGhlIHNjaGVkdWxpbmcgREFHLgorICBjbGFzcyBTVW5pdCB7CisgIHByaXZhdGU6CisgICAgZW51bSA6IHVuc2lnbmVkIHsgQm91bmRhcnlJRCA9IH4wdSB9OworCisgICAgU0ROb2RlICpOb2RlID0gbnVsbHB0cjsgICAgICAgIC8vLzwgUmVwcmVzZW50YXRpdmUgbm9kZS4KKyAgICBNYWNoaW5lSW5zdHIgKkluc3RyID0gbnVsbHB0cjsgLy8vPCBBbHRlcm5hdGl2ZWx5LCBhIE1hY2hpbmVJbnN0ci4KKworICBwdWJsaWM6CisgICAgU1VuaXQgKk9yaWdOb2RlID0gbnVsbHB0cjsgLy8vPCBJZiBub3QgdGhpcywgdGhlIG5vZGUgZnJvbSB3aGljaCB0aGlzIG5vZGUgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vIHdhcyBjbG9uZWQuIChTRCBzY2hlZHVsaW5nIG9ubHkpCisKKyAgICBjb25zdCBNQ1NjaGVkQ2xhc3NEZXNjICpTY2hlZENsYXNzID0KKyAgICAgICAgbnVsbHB0cjsgLy8vPCBudWxscHRyIG9yIHJlc29sdmVkIFNjaGVkQ2xhc3MuCisKKyAgICBTbWFsbFZlY3RvcjxTRGVwLCA0PiBQcmVkczsgIC8vLzwgQWxsIHN1bml0IHByZWRlY2Vzc29ycy4KKyAgICBTbWFsbFZlY3RvcjxTRGVwLCA0PiBTdWNjczsgIC8vLzwgQWxsIHN1bml0IHN1Y2Nlc3NvcnMuCisKKyAgICB0eXBlZGVmIFNtYWxsVmVjdG9ySW1wbDxTRGVwPjo6aXRlcmF0b3IgcHJlZF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIFNtYWxsVmVjdG9ySW1wbDxTRGVwPjo6aXRlcmF0b3Igc3VjY19pdGVyYXRvcjsKKyAgICB0eXBlZGVmIFNtYWxsVmVjdG9ySW1wbDxTRGVwPjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfcHJlZF9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIFNtYWxsVmVjdG9ySW1wbDxTRGVwPjo6Y29uc3RfaXRlcmF0b3IgY29uc3Rfc3VjY19pdGVyYXRvcjsKKworICAgIHVuc2lnbmVkIE5vZGVOdW0gPSBCb3VuZGFyeUlEOyAgICAgLy8vPCBFbnRyeSAjIG9mIG5vZGUgaW4gdGhlIG5vZGUgdmVjdG9yLgorICAgIHVuc2lnbmVkIE5vZGVRdWV1ZUlkID0gMDsgICAgICAgICAgLy8vPCBRdWV1ZSBpZCBvZiBub2RlLgorICAgIHVuc2lnbmVkIE51bVByZWRzID0gMDsgICAgICAgICAgICAgLy8vPCAjIG9mIFNEZXA6OkRhdGEgcHJlZHMuCisgICAgdW5zaWduZWQgTnVtU3VjY3MgPSAwOyAgICAgICAgICAgICAvLy88ICMgb2YgU0RlcDo6RGF0YSBzdWNzcy4KKyAgICB1bnNpZ25lZCBOdW1QcmVkc0xlZnQgPSAwOyAgICAgICAgIC8vLzwgIyBvZiBwcmVkcyBub3Qgc2NoZWR1bGVkLgorICAgIHVuc2lnbmVkIE51bVN1Y2NzTGVmdCA9IDA7ICAgICAgICAgLy8vPCAjIG9mIHN1Y2NzIG5vdCBzY2hlZHVsZWQuCisgICAgdW5zaWduZWQgV2Vha1ByZWRzTGVmdCA9IDA7ICAgICAgICAvLy88ICMgb2Ygd2VhayBwcmVkcyBub3Qgc2NoZWR1bGVkLgorICAgIHVuc2lnbmVkIFdlYWtTdWNjc0xlZnQgPSAwOyAgICAgICAgLy8vPCAjIG9mIHdlYWsgc3VjY3Mgbm90IHNjaGVkdWxlZC4KKyAgICB1bnNpZ25lZCBzaG9ydCBOdW1SZWdEZWZzTGVmdCA9IDA7IC8vLzwgIyBvZiByZWcgZGVmcyB3aXRoIG5vIHNjaGVkdWxlZCB1c2UuCisgICAgdW5zaWduZWQgc2hvcnQgTGF0ZW5jeSA9IDA7ICAgICAgICAvLy88IE5vZGUgbGF0ZW5jeS4KKyAgICBib29sIGlzVlJlZ0N5Y2xlICAgICAgOiAxOyAgICAgICAgIC8vLzwgTWF5IHVzZSBhbmQgZGVmIHRoZSBzYW1lIHZyZWcuCisgICAgYm9vbCBpc0NhbGwgICAgICAgICAgIDogMTsgICAgICAgICAvLy88IElzIGEgZnVuY3Rpb24gY2FsbC4KKyAgICBib29sIGlzQ2FsbE9wICAgICAgICAgOiAxOyAgICAgICAgIC8vLzwgSXMgYSBmdW5jdGlvbiBjYWxsIG9wZXJhbmQuCisgICAgYm9vbCBpc1R3b0FkZHJlc3MgICAgIDogMTsgICAgICAgICAvLy88IElzIGEgdHdvLWFkZHJlc3MgaW5zdHJ1Y3Rpb24uCisgICAgYm9vbCBpc0NvbW11dGFibGUgICAgIDogMTsgICAgICAgICAvLy88IElzIGEgY29tbXV0YWJsZSBpbnN0cnVjdGlvbi4KKyAgICBib29sIGhhc1BoeXNSZWdVc2VzICAgOiAxOyAgICAgICAgIC8vLzwgSGFzIHBoeXNyZWcgdXNlcy4KKyAgICBib29sIGhhc1BoeXNSZWdEZWZzICAgOiAxOyAgICAgICAgIC8vLzwgSGFzIHBoeXNyZWcgZGVmcyB0aGF0IGFyZSBiZWluZyB1c2VkLgorICAgIGJvb2wgaGFzUGh5c1JlZ0Nsb2JiZXJzIDogMTsgICAgICAgLy8vPCBIYXMgYW55IHBoeXNyZWcgZGVmcywgdXNlZCBvciBub3QuCisgICAgYm9vbCBpc1BlbmRpbmcgICAgICAgIDogMTsgICAgICAgICAvLy88IFRydWUgb25jZSBwZW5kaW5nLgorICAgIGJvb2wgaXNBdmFpbGFibGUgICAgICA6IDE7ICAgICAgICAgLy8vPCBUcnVlIG9uY2UgYXZhaWxhYmxlLgorICAgIGJvb2wgaXNTY2hlZHVsZWQgICAgICA6IDE7ICAgICAgICAgLy8vPCBUcnVlIG9uY2Ugc2NoZWR1bGVkLgorICAgIGJvb2wgaXNTY2hlZHVsZUhpZ2ggICA6IDE7ICAgICAgICAgLy8vPCBUcnVlIGlmIHByZWZlcmFibGUgdG8gc2NoZWR1bGUgaGlnaC4KKyAgICBib29sIGlzU2NoZWR1bGVMb3cgICAgOiAxOyAgICAgICAgIC8vLzwgVHJ1ZSBpZiBwcmVmZXJhYmxlIHRvIHNjaGVkdWxlIGxvdy4KKyAgICBib29sIGlzQ2xvbmVkICAgICAgICAgOiAxOyAgICAgICAgIC8vLzwgVHJ1ZSBpZiB0aGlzIG5vZGUgaGFzIGJlZW4gY2xvbmVkLgorICAgIGJvb2wgaXNVbmJ1ZmZlcmVkICAgICA6IDE7ICAgICAgICAgLy8vPCBVc2VzIGFuIHVuYnVmZmVyZWQgcmVzb3VyY2UuCisgICAgYm9vbCBoYXNSZXNlcnZlZFJlc291cmNlIDogMTsgICAgICAvLy88IFVzZXMgYSByZXNlcnZlZCByZXNvdXJjZS4KKyAgICBTY2hlZDo6UHJlZmVyZW5jZSBTY2hlZHVsaW5nUHJlZiA9IFNjaGVkOjpOb25lOyAvLy88IFNjaGVkdWxpbmcgcHJlZmVyZW5jZS4KKworICBwcml2YXRlOgorICAgIGJvb2wgaXNEZXB0aEN1cnJlbnQgICA6IDE7ICAgICAgICAgLy8vPCBUcnVlIGlmIERlcHRoIGlzIGN1cnJlbnQuCisgICAgYm9vbCBpc0hlaWdodEN1cnJlbnQgIDogMTsgICAgICAgICAvLy88IFRydWUgaWYgSGVpZ2h0IGlzIGN1cnJlbnQuCisgICAgdW5zaWduZWQgRGVwdGggPSAwOyAgICAgICAgICAgICAgICAvLy88IE5vZGUgZGVwdGguCisgICAgdW5zaWduZWQgSGVpZ2h0ID0gMDsgICAgICAgICAgICAgICAvLy88IE5vZGUgaGVpZ2h0LgorCisgIHB1YmxpYzoKKyAgICB1bnNpZ25lZCBUb3BSZWFkeUN5Y2xlID0gMDsgLy8vPCBDeWNsZSByZWxhdGl2ZSB0byBzdGFydCB3aGVuIG5vZGUgaXMgcmVhZHkuCisgICAgdW5zaWduZWQgQm90UmVhZHlDeWNsZSA9IDA7IC8vLzwgQ3ljbGUgcmVsYXRpdmUgdG8gZW5kIHdoZW4gbm9kZSBpcyByZWFkeS4KKworICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKkNvcHlEc3RSQyA9CisgICAgICAgIG51bGxwdHI7IC8vLzwgSXMgYSBzcGVjaWFsIGNvcHkgbm9kZSBpZiAhPSBudWxscHRyLgorICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKkNvcHlTcmNSQyA9IG51bGxwdHI7CisKKyAgICAvLy8gXGJyaWVmIENvbnN0cnVjdHMgYW4gU1VuaXQgZm9yIHByZS1yZWdhbGxvYyBzY2hlZHVsaW5nIHRvIHJlcHJlc2VudCBhbgorICAgIC8vLyBTRE5vZGUgYW5kIGFueSBub2RlcyBmbGFnZ2VkIHRvIGl0LgorICAgIFNVbml0KFNETm9kZSAqbm9kZSwgdW5zaWduZWQgbm9kZW51bSkKKyAgICAgIDogTm9kZShub2RlKSwgTm9kZU51bShub2RlbnVtKSwgaXNWUmVnQ3ljbGUoZmFsc2UpLCBpc0NhbGwoZmFsc2UpLAorICAgICAgICBpc0NhbGxPcChmYWxzZSksIGlzVHdvQWRkcmVzcyhmYWxzZSksIGlzQ29tbXV0YWJsZShmYWxzZSksCisgICAgICAgIGhhc1BoeXNSZWdVc2VzKGZhbHNlKSwgaGFzUGh5c1JlZ0RlZnMoZmFsc2UpLCBoYXNQaHlzUmVnQ2xvYmJlcnMoZmFsc2UpLAorICAgICAgICBpc1BlbmRpbmcoZmFsc2UpLCBpc0F2YWlsYWJsZShmYWxzZSksIGlzU2NoZWR1bGVkKGZhbHNlKSwKKyAgICAgICAgaXNTY2hlZHVsZUhpZ2goZmFsc2UpLCBpc1NjaGVkdWxlTG93KGZhbHNlKSwgaXNDbG9uZWQoZmFsc2UpLAorICAgICAgICBpc1VuYnVmZmVyZWQoZmFsc2UpLCBoYXNSZXNlcnZlZFJlc291cmNlKGZhbHNlKSwgaXNEZXB0aEN1cnJlbnQoZmFsc2UpLAorICAgICAgICBpc0hlaWdodEN1cnJlbnQoZmFsc2UpIHt9CisKKyAgICAvLy8gXGJyaWVmIENvbnN0cnVjdHMgYW4gU1VuaXQgZm9yIHBvc3QtcmVnYWxsb2Mgc2NoZWR1bGluZyB0byByZXByZXNlbnQgYQorICAgIC8vLyBNYWNoaW5lSW5zdHIuCisgICAgU1VuaXQoTWFjaGluZUluc3RyICppbnN0ciwgdW5zaWduZWQgbm9kZW51bSkKKyAgICAgIDogSW5zdHIoaW5zdHIpLCBOb2RlTnVtKG5vZGVudW0pLCBpc1ZSZWdDeWNsZShmYWxzZSksIGlzQ2FsbChmYWxzZSksCisgICAgICAgIGlzQ2FsbE9wKGZhbHNlKSwgaXNUd29BZGRyZXNzKGZhbHNlKSwgaXNDb21tdXRhYmxlKGZhbHNlKSwKKyAgICAgICAgaGFzUGh5c1JlZ1VzZXMoZmFsc2UpLCBoYXNQaHlzUmVnRGVmcyhmYWxzZSksIGhhc1BoeXNSZWdDbG9iYmVycyhmYWxzZSksCisgICAgICAgIGlzUGVuZGluZyhmYWxzZSksIGlzQXZhaWxhYmxlKGZhbHNlKSwgaXNTY2hlZHVsZWQoZmFsc2UpLAorICAgICAgICBpc1NjaGVkdWxlSGlnaChmYWxzZSksIGlzU2NoZWR1bGVMb3coZmFsc2UpLCBpc0Nsb25lZChmYWxzZSksCisgICAgICAgIGlzVW5idWZmZXJlZChmYWxzZSksIGhhc1Jlc2VydmVkUmVzb3VyY2UoZmFsc2UpLCBpc0RlcHRoQ3VycmVudChmYWxzZSksCisgICAgICAgIGlzSGVpZ2h0Q3VycmVudChmYWxzZSkge30KKworICAgIC8vLyBcYnJpZWYgQ29uc3RydWN0cyBhIHBsYWNlaG9sZGVyIFNVbml0LgorICAgIFNVbml0KCkKKyAgICAgIDogaXNWUmVnQ3ljbGUoZmFsc2UpLCBpc0NhbGwoZmFsc2UpLCBpc0NhbGxPcChmYWxzZSksIGlzVHdvQWRkcmVzcyhmYWxzZSksCisgICAgICAgIGlzQ29tbXV0YWJsZShmYWxzZSksIGhhc1BoeXNSZWdVc2VzKGZhbHNlKSwgaGFzUGh5c1JlZ0RlZnMoZmFsc2UpLAorICAgICAgICBoYXNQaHlzUmVnQ2xvYmJlcnMoZmFsc2UpLCBpc1BlbmRpbmcoZmFsc2UpLCBpc0F2YWlsYWJsZShmYWxzZSksCisgICAgICAgIGlzU2NoZWR1bGVkKGZhbHNlKSwgaXNTY2hlZHVsZUhpZ2goZmFsc2UpLCBpc1NjaGVkdWxlTG93KGZhbHNlKSwKKyAgICAgICAgaXNDbG9uZWQoZmFsc2UpLCBpc1VuYnVmZmVyZWQoZmFsc2UpLCBoYXNSZXNlcnZlZFJlc291cmNlKGZhbHNlKSwKKyAgICAgICAgaXNEZXB0aEN1cnJlbnQoZmFsc2UpLCBpc0hlaWdodEN1cnJlbnQoZmFsc2UpIHt9CisKKyAgICAvLy8gXGJyaWVmIEJvdW5kYXJ5IG5vZGVzIGFyZSBwbGFjZWhvbGRlcnMgZm9yIHRoZSBib3VuZGFyeSBvZiB0aGUKKyAgICAvLy8gc2NoZWR1bGluZyByZWdpb24uCisgICAgLy8vCisgICAgLy8vIEJvdW5kYXJ5Tm9kZXMgY2FuIGhhdmUgREFHIGVkZ2VzLCBpbmNsdWRpbmcgRGF0YSBlZGdlcywgYnV0IHRoZXkgZG8gbm90CisgICAgLy8vIGNvcnJlc3BvbmQgdG8gc2NoZWR1bGFibGUgZW50aXRpZXMgKGUuZy4gaW5zdHJ1Y3Rpb25zKSBhbmQgZG8gbm90IGhhdmUgYQorICAgIC8vLyB2YWxpZCBJRC4gQ29uc2VxdWVudGx5LCBhbHdheXMgY2hlY2sgZm9yIGJvdW5kYXJ5IG5vZGVzIGJlZm9yZSBhY2Nlc3NpbmcKKyAgICAvLy8gYW4gYXNzb2NpYXRpdmUgZGF0YSBzdHJ1Y3R1cmUga2V5ZWQgb24gbm9kZSBJRC4KKyAgICBib29sIGlzQm91bmRhcnlOb2RlKCkgY29uc3QgeyByZXR1cm4gTm9kZU51bSA9PSBCb3VuZGFyeUlEOyB9CisKKyAgICAvLy8gQXNzaWducyB0aGUgcmVwcmVzZW50YXRpdmUgU0ROb2RlIGZvciB0aGlzIFNVbml0LiBUaGlzIG1heSBiZSB1c2VkCisgICAgLy8vIGR1cmluZyBwcmUtcmVnYWxsb2Mgc2NoZWR1bGluZy4KKyAgICB2b2lkIHNldE5vZGUoU0ROb2RlICpOKSB7CisgICAgICBhc3NlcnQoIUluc3RyICYmICJTZXR0aW5nIFNETm9kZSBvZiBTVW5pdCB3aXRoIE1hY2hpbmVJbnN0ciEiKTsKKyAgICAgIE5vZGUgPSBOOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSByZXByZXNlbnRhdGl2ZSBTRE5vZGUgZm9yIHRoaXMgU1VuaXQuIFRoaXMgbWF5IGJlIHVzZWQKKyAgICAvLy8gZHVyaW5nIHByZS1yZWdhbGxvYyBzY2hlZHVsaW5nLgorICAgIFNETm9kZSAqZ2V0Tm9kZSgpIGNvbnN0IHsKKyAgICAgIGFzc2VydCghSW5zdHIgJiYgIlJlYWRpbmcgU0ROb2RlIG9mIFNVbml0IHdpdGggTWFjaGluZUluc3RyISIpOworICAgICAgcmV0dXJuIE5vZGU7CisgICAgfQorCisgICAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhpcyBTVW5pdCByZWZlcnMgdG8gYSBtYWNoaW5lIGluc3RydWN0aW9uIGFzCisgICAgLy8vIG9wcG9zZWQgdG8gYW4gU0ROb2RlLgorICAgIGJvb2wgaXNJbnN0cigpIGNvbnN0IHsgcmV0dXJuIEluc3RyOyB9CisKKyAgICAvLy8gQXNzaWducyB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBTVW5pdC4gVGhpcyBtYXkgYmUgdXNlZCBkdXJpbmcKKyAgICAvLy8gcG9zdC1yZWdhbGxvYyBzY2hlZHVsaW5nLgorICAgIHZvaWQgc2V0SW5zdHIoTWFjaGluZUluc3RyICpNSSkgeworICAgICAgYXNzZXJ0KCFOb2RlICYmICJTZXR0aW5nIE1hY2hpbmVJbnN0ciBvZiBTVW5pdCB3aXRoIFNETm9kZSEiKTsKKyAgICAgIEluc3RyID0gTUk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIHJlcHJlc2VudGF0aXZlIE1hY2hpbmVJbnN0ciBmb3IgdGhpcyBTVW5pdC4gVGhpcyBtYXkgYmUgdXNlZAorICAgIC8vLyBkdXJpbmcgcG9zdC1yZWdhbGxvYyBzY2hlZHVsaW5nLgorICAgIE1hY2hpbmVJbnN0ciAqZ2V0SW5zdHIoKSBjb25zdCB7CisgICAgICBhc3NlcnQoIU5vZGUgJiYgIlJlYWRpbmcgTWFjaGluZUluc3RyIG9mIFNVbml0IHdpdGggU0ROb2RlISIpOworICAgICAgcmV0dXJuIEluc3RyOworICAgIH0KKworICAgIC8vLyBBZGRzIHRoZSBzcGVjaWZpZWQgZWRnZSBhcyBhIHByZWQgb2YgdGhlIGN1cnJlbnQgbm9kZSBpZiBub3QgYWxyZWFkeS4KKyAgICAvLy8gSXQgYWxzbyBhZGRzIHRoZSBjdXJyZW50IG5vZGUgYXMgYSBzdWNjZXNzb3Igb2YgdGhlIHNwZWNpZmllZCBub2RlLgorICAgIGJvb2wgYWRkUHJlZChjb25zdCBTRGVwICZELCBib29sIFJlcXVpcmVkID0gdHJ1ZSk7CisKKyAgICAvLy8gXGJyaWVmIEFkZHMgYSBiYXJyaWVyIGVkZ2UgdG8gU1UgYnkgY2FsbGluZyBhZGRQcmVkKCksIHdpdGggbGF0ZW5jeSAwCisgICAgLy8vIGdlbmVyYWxseSBvciBsYXRlbmN5IDEgZm9yIGEgc3RvcmUgZm9sbG93ZWQgYnkgYSBsb2FkLgorICAgIGJvb2wgYWRkUHJlZEJhcnJpZXIoU1VuaXQgKlNVKSB7CisgICAgICBTRGVwIERlcChTVSwgU0RlcDo6QmFycmllcik7CisgICAgICB1bnNpZ25lZCBUcnVlTWVtT3JkZXJMYXRlbmN5ID0KKyAgICAgICAgKChTVS0+Z2V0SW5zdHIoKS0+bWF5U3RvcmUoKSAmJiB0aGlzLT5nZXRJbnN0cigpLT5tYXlMb2FkKCkpID8gMSA6IDApOworICAgICAgRGVwLnNldExhdGVuY3koVHJ1ZU1lbU9yZGVyTGF0ZW5jeSk7CisgICAgICByZXR1cm4gYWRkUHJlZChEZXApOworICAgIH0KKworICAgIC8vLyBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgZWRnZSBhcyBhIHByZWQgb2YgdGhlIGN1cnJlbnQgbm9kZSBpZiBpdCBleGlzdHMuCisgICAgLy8vIEl0IGFsc28gcmVtb3ZlcyB0aGUgY3VycmVudCBub2RlIGFzIGEgc3VjY2Vzc29yIG9mIHRoZSBzcGVjaWZpZWQgbm9kZS4KKyAgICB2b2lkIHJlbW92ZVByZWQoY29uc3QgU0RlcCAmRCk7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgZGVwdGggb2YgdGhpcyBub2RlLCB3aGljaCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBtYXhpbXVtIHBhdGgKKyAgICAvLy8gdXAgdG8gYW55IG5vZGUgd2hpY2ggaGFzIG5vIHByZWRlY2Vzc29ycy4KKyAgICB1bnNpZ25lZCBnZXREZXB0aCgpIGNvbnN0IHsKKyAgICAgIGlmICghaXNEZXB0aEN1cnJlbnQpCisgICAgICAgIGNvbnN0X2Nhc3Q8U1VuaXQgKj4odGhpcyktPkNvbXB1dGVEZXB0aCgpOworICAgICAgcmV0dXJuIERlcHRoOworICAgIH0KKworICAgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgaGVpZ2h0IG9mIHRoaXMgbm9kZSwgd2hpY2ggaXMgdGhlIGxlbmd0aCBvZiB0aGUKKyAgICAvLy8gbWF4aW11bSBwYXRoIGRvd24gdG8gYW55IG5vZGUgd2hpY2ggaGFzIG5vIHN1Y2Nlc3NvcnMuCisgICAgdW5zaWduZWQgZ2V0SGVpZ2h0KCkgY29uc3QgeworICAgICAgaWYgKCFpc0hlaWdodEN1cnJlbnQpCisgICAgICAgIGNvbnN0X2Nhc3Q8U1VuaXQgKj4odGhpcyktPkNvbXB1dGVIZWlnaHQoKTsKKyAgICAgIHJldHVybiBIZWlnaHQ7CisgICAgfQorCisgICAgLy8vIFxicmllZiBJZiBOZXdEZXB0aCBpcyBncmVhdGVyIHRoYW4gdGhpcyBub2RlJ3MgZGVwdGggdmFsdWUsIHNldHMgaXQgdG8KKyAgICAvLy8gYmUgdGhlIG5ldyBkZXB0aCB2YWx1ZS4gVGhpcyBhbHNvIHJlY3Vyc2l2ZWx5IG1hcmtzIHN1Y2Nlc3NvciBub2RlcworICAgIC8vLyBkaXJ0eS4KKyAgICB2b2lkIHNldERlcHRoVG9BdExlYXN0KHVuc2lnbmVkIE5ld0RlcHRoKTsKKworICAgIC8vLyBcYnJpZWYgSWYgTmV3RGVwdGggaXMgZ3JlYXRlciB0aGFuIHRoaXMgbm9kZSdzIGRlcHRoIHZhbHVlLCBzZXQgaXQgdG8gYmUKKyAgICAvLy8gdGhlIG5ldyBoZWlnaHQgdmFsdWUuIFRoaXMgYWxzbyByZWN1cnNpdmVseSBtYXJrcyBwcmVkZWNlc3NvciBub2RlcworICAgIC8vLyBkaXJ0eS4KKyAgICB2b2lkIHNldEhlaWdodFRvQXRMZWFzdCh1bnNpZ25lZCBOZXdIZWlnaHQpOworCisgICAgLy8vIFxicmllZiBTZXRzIGEgZmxhZyBpbiB0aGlzIG5vZGUgdG8gaW5kaWNhdGUgdGhhdCBpdHMgc3RvcmVkIERlcHRoIHZhbHVlCisgICAgLy8vIHdpbGwgcmVxdWlyZSByZWNvbXB1dGF0aW9uIHRoZSBuZXh0IHRpbWUgZ2V0RGVwdGgoKSBpcyBjYWxsZWQuCisgICAgdm9pZCBzZXREZXB0aERpcnR5KCk7CisKKyAgICAvLy8gXGJyaWVmIFNldHMgYSBmbGFnIGluIHRoaXMgbm9kZSB0byBpbmRpY2F0ZSB0aGF0IGl0cyBzdG9yZWQgSGVpZ2h0IHZhbHVlCisgICAgLy8vIHdpbGwgcmVxdWlyZSByZWNvbXB1dGF0aW9uIHRoZSBuZXh0IHRpbWUgZ2V0SGVpZ2h0KCkgaXMgY2FsbGVkLgorICAgIHZvaWQgc2V0SGVpZ2h0RGlydHkoKTsKKworICAgIC8vLyBUZXN0cyBpZiBub2RlIE4gaXMgYSBwcmVkZWNlc3NvciBvZiB0aGlzIG5vZGUuCisgICAgYm9vbCBpc1ByZWQoY29uc3QgU1VuaXQgKk4pIGNvbnN0IHsKKyAgICAgIGZvciAoY29uc3QgU0RlcCAmUHJlZCA6IFByZWRzKQorICAgICAgICBpZiAoUHJlZC5nZXRTVW5pdCgpID09IE4pCisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8vIFRlc3RzIGlmIG5vZGUgTiBpcyBhIHN1Y2Nlc3NvciBvZiB0aGlzIG5vZGUuCisgICAgYm9vbCBpc1N1Y2MoY29uc3QgU1VuaXQgKk4pIGNvbnN0IHsKKyAgICAgIGZvciAoY29uc3QgU0RlcCAmU3VjYyA6IFN1Y2NzKQorICAgICAgICBpZiAoU3VjYy5nZXRTVW5pdCgpID09IE4pCisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgYm9vbCBpc1RvcFJlYWR5KCkgY29uc3QgeworICAgICAgcmV0dXJuIE51bVByZWRzTGVmdCA9PSAwOworICAgIH0KKyAgICBib29sIGlzQm90dG9tUmVhZHkoKSBjb25zdCB7CisgICAgICByZXR1cm4gTnVtU3VjY3NMZWZ0ID09IDA7CisgICAgfQorCisgICAgLy8vIFxicmllZiBPcmRlcnMgdGhpcyBub2RlJ3MgcHJlZGVjZXNzb3IgZWRnZXMgc3VjaCB0aGF0IHRoZSBjcml0aWNhbCBwYXRoCisgICAgLy8vIGVkZ2Ugb2NjdXJzIGZpcnN0LgorICAgIHZvaWQgYmlhc0NyaXRpY2FsUGF0aCgpOworCisgICAgdm9pZCBkdW1wKGNvbnN0IFNjaGVkdWxlREFHICpHKSBjb25zdDsKKyAgICB2b2lkIGR1bXBBbGwoY29uc3QgU2NoZWR1bGVEQUcgKkcpIGNvbnN0OworICAgIHJhd19vc3RyZWFtICZwcmludChyYXdfb3N0cmVhbSAmTywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU1VuaXQgKk4gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTVW5pdCAqWCA9IG51bGxwdHIpIGNvbnN0OworICAgIHJhd19vc3RyZWFtICZwcmludChyYXdfb3N0cmVhbSAmTywgY29uc3QgU2NoZWR1bGVEQUcgKkcpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgdm9pZCBDb21wdXRlRGVwdGgoKTsKKyAgICB2b2lkIENvbXB1dGVIZWlnaHQoKTsKKyAgfTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgU0RlcCBpcyBlcXVpdmFsZW50IGV4Y2VwdCBmb3IgbGF0ZW5jeS4KKyAgaW5saW5lIGJvb2wgU0RlcDo6b3ZlcmxhcHMoY29uc3QgU0RlcCAmT3RoZXIpIGNvbnN0IHsKKyAgICBpZiAoRGVwICE9IE90aGVyLkRlcCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBzd2l0Y2ggKERlcC5nZXRJbnQoKSkgeworICAgIGNhc2UgRGF0YToKKyAgICBjYXNlIEFudGk6CisgICAgY2FzZSBPdXRwdXQ6CisgICAgICByZXR1cm4gQ29udGVudHMuUmVnID09IE90aGVyLkNvbnRlbnRzLlJlZzsKKyAgICBjYXNlIE9yZGVyOgorICAgICAgcmV0dXJuIENvbnRlbnRzLk9yZEtpbmQgPT0gT3RoZXIuQ29udGVudHMuT3JkS2luZDsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBkZXBlbmRlbmN5IGtpbmQhIik7CisgIH0KKworICAvLy8vIFJldHVybnMgdGhlIFNVbml0IHRvIHdoaWNoIHRoaXMgZWRnZSBwb2ludHMuCisgIGlubGluZSBTVW5pdCAqU0RlcDo6Z2V0U1VuaXQoKSBjb25zdCB7IHJldHVybiBEZXAuZ2V0UG9pbnRlcigpOyB9CisKKyAgLy8vLyBBc3NpZ25zIHRoZSBTVW5pdCB0byB3aGljaCB0aGlzIGVkZ2UgcG9pbnRzLgorICBpbmxpbmUgdm9pZCBTRGVwOjpzZXRTVW5pdChTVW5pdCAqU1UpIHsgRGVwLnNldFBvaW50ZXIoU1UpOyB9CisKKyAgLy8vIFJldHVybnMgYW4gZW51bSB2YWx1ZSByZXByZXNlbnRpbmcgdGhlIGtpbmQgb2YgdGhlIGRlcGVuZGVuY2UuCisgIGlubGluZSBTRGVwOjpLaW5kIFNEZXA6OmdldEtpbmQoKSBjb25zdCB7IHJldHVybiBEZXAuZ2V0SW50KCk7IH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gXGJyaWVmIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgdG8gcGx1ZyBkaWZmZXJlbnQgcHJpb3JpdGllcyBjb21wdXRhdGlvbgorICAvLy8gYWxnb3JpdGhtcyBpbnRvIHRoZSBsaXN0IHNjaGVkdWxlci4gSXQgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlIG9mIGEKKyAgLy8vIHN0YW5kYXJkIHByaW9yaXR5IHF1ZXVlLCB3aGVyZSBub2RlcyBhcmUgaW5zZXJ0ZWQgaW4gYXJiaXRyYXJ5IG9yZGVyIGFuZAorICAvLy8gcmV0dXJuZWQgaW4gcHJpb3JpdHkgb3JkZXIuICBUaGUgY29tcHV0YXRpb24gb2YgdGhlIHByaW9yaXR5IGFuZCB0aGUKKyAgLy8vIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBxdWV1ZSBhcmUgdG90YWxseSB1cCB0byB0aGUgaW1wbGVtZW50YXRpb24gdG8KKyAgLy8vIGRlY2lkZS4KKyAgY2xhc3MgU2NoZWR1bGluZ1ByaW9yaXR5UXVldWUgeworICAgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworICAgIHVuc2lnbmVkIEN1ckN5Y2xlID0gMDsKKyAgICBib29sIEhhc1JlYWR5RmlsdGVyOworCisgIHB1YmxpYzoKKyAgICBTY2hlZHVsaW5nUHJpb3JpdHlRdWV1ZShib29sIHJmID0gZmFsc2UpIDogIEhhc1JlYWR5RmlsdGVyKHJmKSB7fQorCisgICAgdmlydHVhbCB+U2NoZWR1bGluZ1ByaW9yaXR5UXVldWUoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIGJvb2wgaXNCb3R0b21VcCgpIGNvbnN0ID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBpbml0Tm9kZXMoc3RkOjp2ZWN0b3I8U1VuaXQ+ICZTVW5pdHMpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgYWRkTm9kZShjb25zdCBTVW5pdCAqU1UpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgdXBkYXRlTm9kZShjb25zdCBTVW5pdCAqU1UpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgcmVsZWFzZVN0YXRlKCkgPSAwOworCisgICAgdmlydHVhbCBib29sIGVtcHR5KCkgY29uc3QgPSAwOworCisgICAgYm9vbCBoYXNSZWFkeUZpbHRlcigpIGNvbnN0IHsgcmV0dXJuIEhhc1JlYWR5RmlsdGVyOyB9CisKKyAgICB2aXJ0dWFsIGJvb2wgdHJhY2tzUmVnUHJlc3N1cmUoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgICAgdmlydHVhbCBib29sIGlzUmVhZHkoU1VuaXQgKikgY29uc3QgeworICAgICAgYXNzZXJ0KCFIYXNSZWFkeUZpbHRlciAmJiAiVGhlIHJlYWR5IGZpbHRlciBtdXN0IG92ZXJyaWRlIGlzUmVhZHkoKSIpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdmlydHVhbCB2b2lkIHB1c2goU1VuaXQgKlUpID0gMDsKKworICAgIHZvaWQgcHVzaF9hbGwoY29uc3Qgc3RkOjp2ZWN0b3I8U1VuaXQgKj4gJk5vZGVzKSB7CisgICAgICBmb3IgKHN0ZDo6dmVjdG9yPFNVbml0ICo+Ojpjb25zdF9pdGVyYXRvciBJID0gTm9kZXMuYmVnaW4oKSwKKyAgICAgICAgICAgRSA9IE5vZGVzLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgICAgcHVzaCgqSSk7CisgICAgfQorCisgICAgdmlydHVhbCBTVW5pdCAqcG9wKCkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIHJlbW92ZShTVW5pdCAqU1UpID0gMDsKKworICAgIHZpcnR1YWwgdm9pZCBkdW1wKFNjaGVkdWxlREFHICopIGNvbnN0IHt9CisKKyAgICAvLy8gQXMgZWFjaCBub2RlIGlzIHNjaGVkdWxlZCwgdGhpcyBtZXRob2QgaXMgaW52b2tlZC4gIFRoaXMgYWxsb3dzIHRoZQorICAgIC8vLyBwcmlvcml0eSBmdW5jdGlvbiB0byBhZGp1c3QgdGhlIHByaW9yaXR5IG9mIHJlbGF0ZWQgdW5zY2hlZHVsZWQgbm9kZXMsCisgICAgLy8vIGZvciBleGFtcGxlLgorICAgIHZpcnR1YWwgdm9pZCBzY2hlZHVsZWROb2RlKFNVbml0ICopIHt9CisKKyAgICB2aXJ0dWFsIHZvaWQgdW5zY2hlZHVsZWROb2RlKFNVbml0ICopIHt9CisKKyAgICB2b2lkIHNldEN1ckN5Y2xlKHVuc2lnbmVkIEN5Y2xlKSB7CisgICAgICBDdXJDeWNsZSA9IEN5Y2xlOworICAgIH0KKworICAgIHVuc2lnbmVkIGdldEN1ckN5Y2xlKCkgY29uc3QgeworICAgICAgcmV0dXJuIEN1ckN5Y2xlOworICAgIH0KKyAgfTsKKworICBjbGFzcyBTY2hlZHVsZURBRyB7CisgIHB1YmxpYzoKKyAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTTsgICAgICAgICAgICAvLy88IFRhcmdldCBwcm9jZXNzb3IKKyAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSTsgICAgICAgICAvLy88IFRhcmdldCBpbnN0cnVjdGlvbiBpbmZvcm1hdGlvbgorICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJOyAgICAgIC8vLzwgVGFyZ2V0IHByb2Nlc3NvciByZWdpc3RlciBpbmZvCisgICAgTWFjaGluZUZ1bmN0aW9uICZNRjsgICAgICAgICAgICAgICAgLy8vPCBNYWNoaW5lIGZ1bmN0aW9uCisgICAgTWFjaGluZVJlZ2lzdGVySW5mbyAmTVJJOyAgICAgICAgICAgLy8vPCBWaXJ0dWFsL3JlYWwgcmVnaXN0ZXIgbWFwCisgICAgc3RkOjp2ZWN0b3I8U1VuaXQ+IFNVbml0czsgICAgICAgICAgLy8vPCBUaGUgc2NoZWR1bGluZyB1bml0cy4KKyAgICBTVW5pdCBFbnRyeVNVOyAgICAgICAgICAgICAgICAgICAgICAvLy88IFNwZWNpYWwgbm9kZSBmb3IgdGhlIHJlZ2lvbiBlbnRyeS4KKyAgICBTVW5pdCBFeGl0U1U7ICAgICAgICAgICAgICAgICAgICAgICAvLy88IFNwZWNpYWwgbm9kZSBmb3IgdGhlIHJlZ2lvbiBleGl0LgorCisjaWZkZWYgTkRFQlVHCisgICAgc3RhdGljIGNvbnN0IGJvb2wgU3RyZXNzU2NoZWQgPSBmYWxzZTsKKyNlbHNlCisgICAgYm9vbCBTdHJlc3NTY2hlZDsKKyNlbmRpZgorCisgICAgZXhwbGljaXQgU2NoZWR1bGVEQUcoTWFjaGluZUZ1bmN0aW9uICZtZik7CisKKyAgICB2aXJ0dWFsIH5TY2hlZHVsZURBRygpOworCisgICAgLy8vIENsZWFycyB0aGUgREFHIHN0YXRlIChiZXR3ZWVuIHJlZ2lvbnMpLgorICAgIHZvaWQgY2xlYXJEQUcoKTsKKworICAgIC8vLyBSZXR1cm5zIHRoZSBNQ0luc3RyRGVzYyBvZiB0aGlzIFNVbml0LgorICAgIC8vLyBSZXR1cm5zIE5VTEwgZm9yIFNETm9kZXMgd2l0aG91dCBhIG1hY2hpbmUgb3Bjb2RlLgorICAgIGNvbnN0IE1DSW5zdHJEZXNjICpnZXRJbnN0ckRlc2MoY29uc3QgU1VuaXQgKlNVKSBjb25zdCB7CisgICAgICBpZiAoU1UtPmlzSW5zdHIoKSkgcmV0dXJuICZTVS0+Z2V0SW5zdHIoKS0+Z2V0RGVzYygpOworICAgICAgcmV0dXJuIGdldE5vZGVEZXNjKFNVLT5nZXROb2RlKCkpOworICAgIH0KKworICAgIC8vLyBQb3BzIHVwIGEgR3JhcGhWaXovZ3Ygd2luZG93IHdpdGggdGhlIFNjaGVkdWxlREFHIHJlbmRlcmVkIHVzaW5nICdkb3QnLgorICAgIHZpcnR1YWwgdm9pZCB2aWV3R3JhcGgoY29uc3QgVHdpbmUgJk5hbWUsIGNvbnN0IFR3aW5lICZUaXRsZSk7CisgICAgdmlydHVhbCB2b2lkIHZpZXdHcmFwaCgpOworCisgICAgdmlydHVhbCB2b2lkIGR1bXBOb2RlKGNvbnN0IFNVbml0ICpTVSkgY29uc3QgPSAwOworCisgICAgLy8vIFJldHVybnMgYSBsYWJlbCBmb3IgYW4gU1VuaXQgbm9kZSBpbiBhIHZpc3VhbGl6YXRpb24gb2YgdGhlIFNjaGVkdWxlREFHLgorICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0R3JhcGhOb2RlTGFiZWwoY29uc3QgU1VuaXQgKlNVKSBjb25zdCA9IDA7CisKKyAgICAvLy8gUmV0dXJucyBhIGxhYmVsIGZvciB0aGUgcmVnaW9uIG9mIGNvZGUgY292ZXJlZCBieSB0aGUgREFHLgorICAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0REFHTmFtZSgpIGNvbnN0ID0gMDsKKworICAgIC8vLyBBZGRzIGN1c3RvbSBmZWF0dXJlcyBmb3IgYSB2aXN1YWxpemF0aW9uIG9mIHRoZSBTY2hlZHVsZURBRy4KKyAgICB2aXJ0dWFsIHZvaWQgYWRkQ3VzdG9tR3JhcGhGZWF0dXJlcyhHcmFwaFdyaXRlcjxTY2hlZHVsZURBRyo+ICYpIGNvbnN0IHt9CisKKyNpZm5kZWYgTkRFQlVHCisgICAgLy8vIFxicmllZiBWZXJpZmllcyB0aGF0IGFsbCBTVW5pdHMgd2VyZSBzY2hlZHVsZWQgYW5kIHRoYXQgdGhlaXIgc3RhdGUgaXMKKyAgICAvLy8gY29uc2lzdGVudC4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIHNjaGVkdWxlZCBTVW5pdHMuCisgICAgdW5zaWduZWQgVmVyaWZ5U2NoZWR1bGVkREFHKGJvb2wgaXNCb3R0b21VcCk7CisjZW5kaWYKKworICBwcml2YXRlOgorICAgIC8vLyBSZXR1cm5zIHRoZSBNQ0luc3RyRGVzYyBvZiB0aGlzIFNETm9kZSBvciBOVUxMLgorICAgIGNvbnN0IE1DSW5zdHJEZXNjICpnZXROb2RlRGVzYyhjb25zdCBTRE5vZGUgKk5vZGUpIGNvbnN0OworICB9OworCisgIGNsYXNzIFNVbml0SXRlcmF0b3IgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1VuaXQsIHB0cmRpZmZfdD4geworICAgIFNVbml0ICpOb2RlOworICAgIHVuc2lnbmVkIE9wZXJhbmQ7CisKKyAgICBTVW5pdEl0ZXJhdG9yKFNVbml0ICpOLCB1bnNpZ25lZCBPcCkgOiBOb2RlKE4pLCBPcGVyYW5kKE9wKSB7fQorCisgIHB1YmxpYzoKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgU1VuaXRJdGVyYXRvciYgeCkgY29uc3QgeworICAgICAgcmV0dXJuIE9wZXJhbmQgPT0geC5PcGVyYW5kOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgU1VuaXRJdGVyYXRvciYgeCkgY29uc3QgeyByZXR1cm4gIW9wZXJhdG9yPT0oeCk7IH0KKworICAgIHBvaW50ZXIgb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgcmV0dXJuIE5vZGUtPlByZWRzW09wZXJhbmRdLmdldFNVbml0KCk7CisgICAgfQorICAgIHBvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG9wZXJhdG9yKigpOyB9CisKKyAgICBTVW5pdEl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyAgICAgICAgICAgICAgICAvLyBQcmVpbmNyZW1lbnQKKyAgICAgICsrT3BlcmFuZDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgU1VuaXRJdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAvLyBQb3N0aW5jcmVtZW50CisgICAgICBTVW5pdEl0ZXJhdG9yIHRtcCA9ICp0aGlzOyArKyp0aGlzOyByZXR1cm4gdG1wOworICAgIH0KKworICAgIHN0YXRpYyBTVW5pdEl0ZXJhdG9yIGJlZ2luKFNVbml0ICpOKSB7IHJldHVybiBTVW5pdEl0ZXJhdG9yKE4sIDApOyB9CisgICAgc3RhdGljIFNVbml0SXRlcmF0b3IgZW5kICAoU1VuaXQgKk4pIHsKKyAgICAgIHJldHVybiBTVW5pdEl0ZXJhdG9yKE4sICh1bnNpZ25lZClOLT5QcmVkcy5zaXplKCkpOworICAgIH0KKworICAgIHVuc2lnbmVkIGdldE9wZXJhbmQoKSBjb25zdCB7IHJldHVybiBPcGVyYW5kOyB9CisgICAgY29uc3QgU1VuaXQgKmdldE5vZGUoKSBjb25zdCB7IHJldHVybiBOb2RlOyB9CisKKyAgICAvLy8gVGVzdHMgaWYgdGhpcyBpcyBub3QgYW4gU0RlcDo6RGF0YSBkZXBlbmRlbmNlLgorICAgIGJvb2wgaXNDdHJsRGVwKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldFNEZXAoKS5pc0N0cmwoKTsKKyAgICB9CisgICAgYm9vbCBpc0FydGlmaWNpYWxEZXAoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0U0RlcCgpLmlzQXJ0aWZpY2lhbCgpOworICAgIH0KKyAgICBjb25zdCBTRGVwICZnZXRTRGVwKCkgY29uc3QgeworICAgICAgcmV0dXJuIE5vZGUtPlByZWRzW09wZXJhbmRdOworICAgIH0KKyAgfTsKKworICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8U1VuaXQqPiB7CisgICAgdHlwZWRlZiBTVW5pdCAqTm9kZVJlZjsKKyAgICB0eXBlZGVmIFNVbml0SXRlcmF0b3IgQ2hpbGRJdGVyYXRvclR5cGU7CisgICAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKFNVbml0ICpOKSB7IHJldHVybiBOOyB9CisgICAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeworICAgICAgcmV0dXJuIFNVbml0SXRlcmF0b3I6OmJlZ2luKE4pOworICAgIH0KKyAgICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeworICAgICAgcmV0dXJuIFNVbml0SXRlcmF0b3I6OmVuZChOKTsKKyAgICB9CisgIH07CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPFNjaGVkdWxlREFHKj4gOiBwdWJsaWMgR3JhcGhUcmFpdHM8U1VuaXQqPiB7CisgICAgdHlwZWRlZiBwb2ludGVyX2l0ZXJhdG9yPHN0ZDo6dmVjdG9yPFNVbml0Pjo6aXRlcmF0b3I+IG5vZGVzX2l0ZXJhdG9yOworICAgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihTY2hlZHVsZURBRyAqRykgeworICAgICAgcmV0dXJuIG5vZGVzX2l0ZXJhdG9yKEctPlNVbml0cy5iZWdpbigpKTsKKyAgICB9CisgICAgc3RhdGljIG5vZGVzX2l0ZXJhdG9yIG5vZGVzX2VuZChTY2hlZHVsZURBRyAqRykgeworICAgICAgcmV0dXJuIG5vZGVzX2l0ZXJhdG9yKEctPlNVbml0cy5lbmQoKSk7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIGNsYXNzIGNhbiBjb21wdXRlIGEgdG9wb2xvZ2ljYWwgb3JkZXJpbmcgZm9yIFNVbml0cyBhbmQgcHJvdmlkZXMKKyAgLy8vIG1ldGhvZHMgZm9yIGR5bmFtaWNhbGx5IHVwZGF0aW5nIHRoZSBvcmRlcmluZyBhcyBuZXcgZWRnZXMgYXJlIGFkZGVkLgorICAvLy8KKyAgLy8vIFRoaXMgYWxsb3dzIGEgdmVyeSBmYXN0IGltcGxlbWVudGF0aW9uIG9mIElzUmVhY2hhYmxlLCBmb3IgZXhhbXBsZS4KKyAgY2xhc3MgU2NoZWR1bGVEQUdUb3BvbG9naWNhbFNvcnQgeworICAgIC8vLyBBIHJlZmVyZW5jZSB0byB0aGUgU2NoZWR1bGVEQUcncyBTVW5pdHMuCisgICAgc3RkOjp2ZWN0b3I8U1VuaXQ+ICZTVW5pdHM7CisgICAgU1VuaXQgKkV4aXRTVTsKKworICAgIC8vLyBNYXBzIHRvcG9sb2dpY2FsIGluZGV4IHRvIHRoZSBub2RlIG51bWJlci4KKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IEluZGV4Mk5vZGU7CisgICAgLy8vIE1hcHMgdGhlIG5vZGUgbnVtYmVyIHRvIGl0cyB0b3BvbG9naWNhbCBpbmRleC4KKyAgICBzdGQ6OnZlY3RvcjxpbnQ+IE5vZGUySW5kZXg7CisgICAgLy8vIGEgc2V0IG9mIG5vZGVzIHZpc2l0ZWQgZHVyaW5nIGEgREZTIHRyYXZlcnNhbC4KKyAgICBCaXRWZWN0b3IgVmlzaXRlZDsKKworICAgIC8vLyBNYWtlcyBhIERGUyB0cmF2ZXJzYWwgYW5kIG1hcmsgYWxsIG5vZGVzIGFmZmVjdGVkIGJ5IHRoZSBlZGdlIGluc2VydGlvbi4KKyAgICAvLy8gVGhlc2Ugbm9kZXMgd2lsbCBsYXRlciBnZXQgbmV3IHRvcG9sb2dpY2FsIGluZGV4ZXMgYnkgbWVhbnMgb2YgdGhlIFNoaWZ0CisgICAgLy8vIG1ldGhvZC4KKyAgICB2b2lkIERGUyhjb25zdCBTVW5pdCAqU1UsIGludCBVcHBlckJvdW5kLCBib29sJiBIYXNMb29wKTsKKworICAgIC8vLyBcYnJpZWYgUmVhc3NpZ25zIHRvcG9sb2dpY2FsIGluZGV4ZXMgZm9yIHRoZSBub2RlcyBpbiB0aGUgREFHIHRvCisgICAgLy8vIHByZXNlcnZlIHRoZSB0b3BvbG9naWNhbCBvcmRlcmluZy4KKyAgICB2b2lkIFNoaWZ0KEJpdFZlY3RvciYgVmlzaXRlZCwgaW50IExvd2VyQm91bmQsIGludCBVcHBlckJvdW5kKTsKKworICAgIC8vLyBBc3NpZ25zIHRoZSB0b3BvbG9naWNhbCBpbmRleCB0byB0aGUgbm9kZSBuLgorICAgIHZvaWQgQWxsb2NhdGUoaW50IG4sIGludCBpbmRleCk7CisKKyAgcHVibGljOgorICAgIFNjaGVkdWxlREFHVG9wb2xvZ2ljYWxTb3J0KHN0ZDo6dmVjdG9yPFNVbml0PiAmU1VuaXRzLCBTVW5pdCAqRXhpdFNVKTsKKworICAgIC8vLyBDcmVhdGVzIHRoZSBpbml0aWFsIHRvcG9sb2dpY2FsIG9yZGVyaW5nIGZyb20gdGhlIERBRyB0byBiZSBzY2hlZHVsZWQuCisgICAgdm9pZCBJbml0REFHVG9wb2xvZ2ljYWxTb3J0aW5nKCk7CisKKyAgICAvLy8gUmV0dXJucyBhbiBhcnJheSBvZiBTVXMgdGhhdCBhcmUgYm90aCBpbiB0aGUgc3VjY2Vzc29yCisgICAgLy8vIHN1YnRyZWUgb2YgU3RhcnRTVSBhbmQgaW4gdGhlIHByZWRlY2Vzc29yIHN1YnRyZWUgb2YgVGFyZ2V0U1UuCisgICAgLy8vIFN0YXJ0U1UgYW5kIFRhcmdldFNVIGFyZSBub3QgaW4gdGhlIGFycmF5LgorICAgIC8vLyBTdWNjZXNzIGlzIGZhbHNlIGlmIFRhcmdldFNVIGlzIG5vdCBpbiB0aGUgc3VjY2Vzc29yIHN1YnRyZWUgb2YKKyAgICAvLy8gU3RhcnRTVSwgZWxzZSBpdCBpcyB0cnVlLgorICAgIHN0ZDo6dmVjdG9yPGludD4gR2V0U3ViR3JhcGgoY29uc3QgU1VuaXQgJlN0YXJ0U1UsIGNvbnN0IFNVbml0ICZUYXJnZXRTVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJlN1Y2Nlc3MpOworCisgICAgLy8vIENoZWNrcyBpZiBccCBTVSBpcyByZWFjaGFibGUgZnJvbSBccCBUYXJnZXRTVS4KKyAgICBib29sIElzUmVhY2hhYmxlKGNvbnN0IFNVbml0ICpTVSwgY29uc3QgU1VuaXQgKlRhcmdldFNVKTsKKworICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgYWRkUHJlZChUYXJnZXRTVSwgU1UpIGNyZWF0ZXMgYSBjeWNsZS4KKyAgICBib29sIFdpbGxDcmVhdGVDeWNsZShTVW5pdCAqVGFyZ2V0U1UsIFNVbml0ICpTVSk7CisKKyAgICAvLy8gXGJyaWVmIFVwZGF0ZXMgdGhlIHRvcG9sb2dpY2FsIG9yZGVyaW5nIHRvIGFjY29tbW9kYXRlIGFuIGVkZ2UgdG8gYmUKKyAgICAvLy8gYWRkZWQgZnJvbSBTVW5pdCBccCBYIHRvIFNVbml0IFxwIFkuCisgICAgdm9pZCBBZGRQcmVkKFNVbml0ICpZLCBTVW5pdCAqWCk7CisKKyAgICAvLy8gXGJyaWVmIFVwZGF0ZXMgdGhlIHRvcG9sb2dpY2FsIG9yZGVyaW5nIHRvIGFjY29tbW9kYXRlIGFuIGFuIGVkZ2UgdG8gYmUKKyAgICAvLy8gcmVtb3ZlZCBmcm9tIHRoZSBzcGVjaWZpZWQgbm9kZSBccCBOIGZyb20gdGhlIHByZWRlY2Vzc29ycyBvZiB0aGUKKyAgICAvLy8gY3VycmVudCBub2RlIFxwIE0uCisgICAgdm9pZCBSZW1vdmVQcmVkKFNVbml0ICpNLCBTVW5pdCAqTik7CisKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGludD46Oml0ZXJhdG9yIGl0ZXJhdG9yOworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8aW50Pjo6Y29uc3RfaXRlcmF0b3IgY29uc3RfaXRlcmF0b3I7CisgICAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBJbmRleDJOb2RlLmJlZ2luKCk7IH0KKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEluZGV4Mk5vZGUuYmVnaW4oKTsgfQorICAgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIEluZGV4Mk5vZGUuZW5kKCk7IH0KKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBJbmRleDJOb2RlLmVuZCgpOyB9CisKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGludD46OnJldmVyc2VfaXRlcmF0b3IgcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICB0eXBlZGVmIHN0ZDo6dmVjdG9yPGludD46OmNvbnN0X3JldmVyc2VfaXRlcmF0b3IgY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIEluZGV4Mk5vZGUucmJlZ2luKCk7IH0KKyAgICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEluZGV4Mk5vZGUucmJlZ2luKCk7IH0KKyAgICByZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSB7IHJldHVybiBJbmRleDJOb2RlLnJlbmQoKTsgfQorICAgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsgcmV0dXJuIEluZGV4Mk5vZGUucmVuZCgpOyB9CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fU0NIRURVTEVEQUdfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHSW5zdHJzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUdJbnN0cnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDg4MjIwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHSW5zdHJzLmgKQEAgLTAsMCArMSwzODQgQEAKKy8vPT09LSBTY2hlZHVsZURBR0luc3Rycy5oIC0gTWFjaGluZUluc3RyIFNjaGVkdWxpbmcgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlIEltcGxlbWVudHMgdGhlIFNjaGVkdWxlREFHSW5zdHJzIGNsYXNzLCB3aGljaCBpbXBsZW1lbnRzIHNjaGVkdWxpbmcKKy8vLyBmb3IgYSBNYWNoaW5lSW5zdHItYmFzZWQgZGVwZW5kZW5jeSBncmFwaC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9TQ0hFRFVMRURBR0lOU1RSU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9TQ0hFRFVMRURBR0lOU1RSU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TcGFyc2VNdWx0aVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NwYXJzZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9MaXZlUGh5c1JlZ3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUcuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0UmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldFNjaGVkdWxlLmgiCisjaW5jbHVkZSAibGx2bS9NQy9MYW5lQml0bWFzay5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgY2xhc3MgTGl2ZUludGVydmFsczsKKyAgY2xhc3MgTWFjaGluZUZyYW1lSW5mbzsKKyAgY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworICBjbGFzcyBNYWNoaW5lSW5zdHI7CisgIGNsYXNzIE1hY2hpbmVMb29wSW5mbzsKKyAgY2xhc3MgTWFjaGluZU9wZXJhbmQ7CisgIHN0cnVjdCBNQ1NjaGVkQ2xhc3NEZXNjOworICBjbGFzcyBQcmVzc3VyZURpZmZzOworICBjbGFzcyBQc2V1ZG9Tb3VyY2VWYWx1ZTsKKyAgY2xhc3MgUmVnUHJlc3N1cmVUcmFja2VyOworICBjbGFzcyBVbmRlZlZhbHVlOworICBjbGFzcyBWYWx1ZTsKKworICAvLy8gQW4gaW5kaXZpZHVhbCBtYXBwaW5nIGZyb20gdmlydHVhbCByZWdpc3RlciBudW1iZXIgdG8gU1VuaXQuCisgIHN0cnVjdCBWUmVnMlNVbml0IHsKKyAgICB1bnNpZ25lZCBWaXJ0UmVnOworICAgIExhbmVCaXRtYXNrIExhbmVNYXNrOworICAgIFNVbml0ICpTVTsKKworICAgIFZSZWcyU1VuaXQodW5zaWduZWQgVlJlZywgTGFuZUJpdG1hc2sgTGFuZU1hc2ssIFNVbml0ICpTVSkKKyAgICAgIDogVmlydFJlZyhWUmVnKSwgTGFuZU1hc2soTGFuZU1hc2spLCBTVShTVSkge30KKworICAgIHVuc2lnbmVkIGdldFNwYXJzZVNldEluZGV4KCkgY29uc3QgeworICAgICAgcmV0dXJuIFRhcmdldFJlZ2lzdGVySW5mbzo6dmlydFJlZzJJbmRleChWaXJ0UmVnKTsKKyAgICB9CisgIH07CisKKyAgLy8vIE1hcHBpbmcgZnJvbSB2aXJ0dWFsIHJlZ2lzdGVyIHRvIFNVbml0IGluY2x1ZGluZyBhbiBvcGVyYW5kIGluZGV4LgorICBzdHJ1Y3QgVlJlZzJTVW5pdE9wZXJJZHggOiBwdWJsaWMgVlJlZzJTVW5pdCB7CisgICAgdW5zaWduZWQgT3BlcmFuZEluZGV4OworCisgICAgVlJlZzJTVW5pdE9wZXJJZHgodW5zaWduZWQgVlJlZywgTGFuZUJpdG1hc2sgTGFuZU1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BlcmFuZEluZGV4LCBTVW5pdCAqU1UpCisgICAgICA6IFZSZWcyU1VuaXQoVlJlZywgTGFuZU1hc2ssIFNVKSwgT3BlcmFuZEluZGV4KE9wZXJhbmRJbmRleCkge30KKyAgfTsKKworICAvLy8gUmVjb3JkIGEgcGh5c2ljYWwgcmVnaXN0ZXIgYWNjZXNzLgorICAvLy8gRm9yIG5vbi1kYXRhLWRlcGVuZGVudCB1c2VzLCBPcElkeCA9PSAtMS4KKyAgc3RydWN0IFBoeXNSZWdTVU9wZXIgeworICAgIFNVbml0ICpTVTsKKyAgICBpbnQgT3BJZHg7CisgICAgdW5zaWduZWQgUmVnOworCisgICAgUGh5c1JlZ1NVT3BlcihTVW5pdCAqc3UsIGludCBvcCwgdW5zaWduZWQgUik6IFNVKHN1KSwgT3BJZHgob3ApLCBSZWcoUikge30KKworICAgIHVuc2lnbmVkIGdldFNwYXJzZVNldEluZGV4KCkgY29uc3QgeyByZXR1cm4gUmVnOyB9CisgIH07CisKKyAgLy8vIFVzZSBhIFNwYXJzZU11bHRpU2V0IHRvIHRyYWNrIHBoeXNpY2FsIHJlZ2lzdGVycy4gU3RvcmFnZSBpcyBvbmx5CisgIC8vLyBhbGxvY2F0ZWQgb25jZSBmb3IgdGhlIHBhc3MuIEl0IGNhbiBiZSBjbGVhcmVkIGluIGNvbnN0YW50IHRpbWUgYW5kIHJldXNlZAorICAvLy8gd2l0aG91dCBhbnkgZnJlZXMuCisgIHVzaW5nIFJlZzJTVW5pdHNNYXAgPQorICAgICAgU3BhcnNlTXVsdGlTZXQ8UGh5c1JlZ1NVT3BlciwgaWRlbnRpdHk8dW5zaWduZWQ+LCB1aW50MTZfdD47CisKKyAgLy8vIFVzZSBTcGFyc2VTZXQgYXMgYSBTcGFyc2VNYXAgYnkgcmVseWluZyBvbiB0aGUgZmFjdCB0aGF0IGl0IG5ldmVyCisgIC8vLyBjb21wYXJlcyBWYWx1ZVQncywgb25seSB1bnNpZ25lZCBrZXlzLiBUaGlzIGFsbG93cyB0aGUgc2V0IHRvIGJlIGNsZWFyZWQKKyAgLy8vIGJldHdlZW4gc2NoZWR1bGluZyByZWdpb25zIGluIGNvbnN0YW50IHRpbWUgYXMgbG9uZyBhcyBWYWx1ZVQgZG9lcyBub3QKKyAgLy8vIHJlcXVpcmUgYSBkZXN0cnVjdG9yLgorICB1c2luZyBWUmVnMlNVbml0TWFwID0gU3BhcnNlU2V0PFZSZWcyU1VuaXQsIFZpcnRSZWcySW5kZXhGdW5jdG9yPjsKKworICAvLy8gVHJhY2sgbG9jYWwgdXNlcyBvZiB2aXJ0dWFsIHJlZ2lzdGVycy4gVGhlc2UgdXNlcyBhcmUgZ2F0aGVyZWQgYnkgdGhlIERBRworICAvLy8gYnVpbGRlciBhbmQgbWF5IGJlIGNvbnN1bHRlZCBieSB0aGUgc2NoZWR1bGVyIHRvIGF2b2lkIGl0ZXJhdGluZyBhbiBlbnRpcmUKKyAgLy8vIHZyZWcgdXNlIGxpc3QuCisgIHVzaW5nIFZSZWcyU1VuaXRNdWx0aU1hcCA9IFNwYXJzZU11bHRpU2V0PFZSZWcyU1VuaXQsIFZpcnRSZWcySW5kZXhGdW5jdG9yPjsKKworICB1c2luZyBWUmVnMlNVbml0T3BlcklkeE11bHRpTWFwID0KKyAgICAgIFNwYXJzZU11bHRpU2V0PFZSZWcyU1VuaXRPcGVySWR4LCBWaXJ0UmVnMkluZGV4RnVuY3Rvcj47CisKKyAgdXNpbmcgVmFsdWVUeXBlID0gUG9pbnRlclVuaW9uPGNvbnN0IFZhbHVlICosIGNvbnN0IFBzZXVkb1NvdXJjZVZhbHVlICo+OworCisgIHN0cnVjdCBVbmRlcmx5aW5nT2JqZWN0IDogUG9pbnRlckludFBhaXI8VmFsdWVUeXBlLCAxLCBib29sPiB7CisgICAgVW5kZXJseWluZ09iamVjdChWYWx1ZVR5cGUgViwgYm9vbCBNYXlBbGlhcykKKyAgICAgICAgOiBQb2ludGVySW50UGFpcjxWYWx1ZVR5cGUsIDEsIGJvb2w+KFYsIE1heUFsaWFzKSB7fQorCisgICAgVmFsdWVUeXBlIGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gZ2V0UG9pbnRlcigpOyB9CisgICAgYm9vbCBtYXlBbGlhcygpIGNvbnN0IHsgcmV0dXJuIGdldEludCgpOyB9CisgIH07CisKKyAgdXNpbmcgVW5kZXJseWluZ09iamVjdHNWZWN0b3IgPSBTbWFsbFZlY3RvcjxVbmRlcmx5aW5nT2JqZWN0LCA0PjsKKworICAvLy8gQSBTY2hlZHVsZURBRyBmb3Igc2NoZWR1bGluZyBsaXN0cyBvZiBNYWNoaW5lSW5zdHIuCisgIGNsYXNzIFNjaGVkdWxlREFHSW5zdHJzIDogcHVibGljIFNjaGVkdWxlREFHIHsKKyAgcHJvdGVjdGVkOgorICAgIGNvbnN0IE1hY2hpbmVMb29wSW5mbyAqTUxJOworICAgIGNvbnN0IE1hY2hpbmVGcmFtZUluZm8gJk1GSTsKKworICAgIC8vLyBUYXJnZXRTY2hlZE1vZGVsIHByb3ZpZGVzIGFuIGludGVyZmFjZSB0byB0aGUgbWFjaGluZSBtb2RlbC4KKyAgICBUYXJnZXRTY2hlZE1vZGVsIFNjaGVkTW9kZWw7CisKKyAgICAvLy8gVHJ1ZSBpZiB0aGUgREFHIGJ1aWxkZXIgc2hvdWxkIHJlbW92ZSBraWxsIGZsYWdzIChpbiBwcmVwYXJhdGlvbiBmb3IKKyAgICAvLy8gcmVzY2hlZHVsaW5nKS4KKyAgICBib29sIFJlbW92ZUtpbGxGbGFnczsKKworICAgIC8vLyBUaGUgc3RhbmRhcmQgREFHIGJ1aWxkZXIgZG9lcyBub3Qgbm9ybWFsbHkgaW5jbHVkZSB0ZXJtaW5hdG9ycyBhcyBEQUcKKyAgICAvLy8gbm9kZXMgYmVjYXVzZSBpdCBkb2VzIG5vdCBjcmVhdGUgdGhlIG5lY2Vzc2FyeSBkZXBlbmRlbmNpZXMgdG8gcHJldmVudAorICAgIC8vLyByZW9yZGVyaW5nLiBBIHNwZWNpYWxpemVkIHNjaGVkdWxlciBjYW4gb3ZlcnJpZGUKKyAgICAvLy8gVGFyZ2V0SW5zdHJJbmZvOjppc1NjaGVkdWxpbmdCb3VuZGFyeSB0aGVuIGVuYWJsZSB0aGlzIGZsYWcgdG8gaW5kaWNhdGUKKyAgICAvLy8gaXQgaGFzIHRha2VuIHJlc3BvbnNpYmlsaXR5IGZvciBzY2hlZHVsaW5nIHRoZSB0ZXJtaW5hdG9yIGNvcnJlY3RseS4KKyAgICBib29sIENhbkhhbmRsZVRlcm1pbmF0b3JzID0gZmFsc2U7CisKKyAgICAvLy8gV2hldGhlciBsYW5lIG1hc2tzIHNob3VsZCBnZXQgdHJhY2tlZC4KKyAgICBib29sIFRyYWNrTGFuZU1hc2tzID0gZmFsc2U7CisKKyAgICAvLyBTdGF0ZSBzcGVjaWZpYyB0byB0aGUgY3VycmVudCBzY2hlZHVsaW5nIHJlZ2lvbi4KKyAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIC8vLyBUaGUgYmxvY2sgaW4gd2hpY2ggdG8gaW5zZXJ0IGluc3RydWN0aW9ucworICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCQjsKKworICAgIC8vLyBUaGUgYmVnaW5uaW5nIG9mIHRoZSByYW5nZSB0byBiZSBzY2hlZHVsZWQuCisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFJlZ2lvbkJlZ2luOworCisgICAgLy8vIFRoZSBlbmQgb2YgdGhlIHJhbmdlIHRvIGJlIHNjaGVkdWxlZC4KKyAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgUmVnaW9uRW5kOworCisgICAgLy8vIEluc3RydWN0aW9ucyBpbiB0aGlzIHJlZ2lvbiAoZGlzdGFuY2UoUmVnaW9uQmVnaW4sIFJlZ2lvbkVuZCkpLgorICAgIHVuc2lnbmVkIE51bVJlZ2lvbkluc3RyczsKKworICAgIC8vLyBBZnRlciBjYWxsaW5nIEJ1aWxkU2NoZWRHcmFwaCwgZWFjaCBtYWNoaW5lIGluc3RydWN0aW9uIGluIHRoZSBjdXJyZW50CisgICAgLy8vIHNjaGVkdWxpbmcgcmVnaW9uIGlzIG1hcHBlZCB0byBhbiBTVW5pdC4KKyAgICBEZW5zZU1hcDxNYWNoaW5lSW5zdHIqLCBTVW5pdCo+IE1JU1VuaXRNYXA7CisKKyAgICAvLyBTdGF0ZSBpbnRlcm5hbCB0byBEQUcgYnVpbGRpbmcuCisgICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgLy8vIERlZnMsIFVzZXMgLSBSZW1lbWJlciB3aGVyZSBkZWZzIGFuZCB1c2VzIG9mIGVhY2ggcmVnaXN0ZXIgYXJlIGFzIHdlCisgICAgLy8vIGl0ZXJhdGUgdXB3YXJkIHRocm91Z2ggdGhlIGluc3RydWN0aW9ucy4gVGhpcyBpcyBhbGxvY2F0ZWQgaGVyZSBpbnN0ZWFkCisgICAgLy8vIG9mIGluc2lkZSBCdWlsZFNjaGVkR3JhcGggdG8gYXZvaWQgdGhlIG5lZWQgZm9yIGl0IHRvIGJlIGluaXRpYWxpemVkIGFuZAorICAgIC8vLyBkZXN0cnVjdGVkIGZvciBlYWNoIGJsb2NrLgorICAgIFJlZzJTVW5pdHNNYXAgRGVmczsKKyAgICBSZWcyU1VuaXRzTWFwIFVzZXM7CisKKyAgICAvLy8gVHJhY2tzIHRoZSBsYXN0IGluc3RydWN0aW9uKHMpIGluIHRoaXMgcmVnaW9uIGRlZmluaW5nIGVhY2ggdmlydHVhbAorICAgIC8vLyByZWdpc3Rlci4gVGhlcmUgbWF5IGJlIG11bHRpcGxlIGN1cnJlbnQgZGVmaW5pdGlvbnMgZm9yIGEgcmVnaXN0ZXIgd2l0aAorICAgIC8vLyBkaXNqdW5jdCBsYW5lbWFza3MuCisgICAgVlJlZzJTVW5pdE11bHRpTWFwIEN1cnJlbnRWUmVnRGVmczsKKyAgICAvLy8gVHJhY2tzIHRoZSBsYXN0IGluc3RydWN0aW9ucyBpbiB0aGlzIHJlZ2lvbiB1c2luZyBlYWNoIHZpcnR1YWwgcmVnaXN0ZXIuCisgICAgVlJlZzJTVW5pdE9wZXJJZHhNdWx0aU1hcCBDdXJyZW50VlJlZ1VzZXM7CisKKyAgICBBbGlhc0FuYWx5c2lzICpBQUZvckRlcCA9IG51bGxwdHI7CisKKyAgICAvLy8gUmVtZW1iZXIgYSBnZW5lcmljIHNpZGUtZWZmZWN0aW5nIGluc3RydWN0aW9uIGFzIHdlIHByb2NlZWQuCisgICAgLy8vIE5vIG90aGVyIFNVIGV2ZXIgZ2V0cyBzY2hlZHVsZWQgYXJvdW5kIGl0IChleGNlcHQgaW4gdGhlIHNwZWNpYWwKKyAgICAvLy8gY2FzZSBvZiBhIGh1Z2UgcmVnaW9uIHRoYXQgZ2V0cyByZWR1Y2VkKS4KKyAgICBTVW5pdCAqQmFycmllckNoYWluID0gbnVsbHB0cjsKKworICBwdWJsaWM6CisgICAgLy8vIEEgbGlzdCBvZiBTVW5pdHMsIHVzZWQgaW4gVmFsdWUyU1VzTWFwLCBkdXJpbmcgREFHIGNvbnN0cnVjdGlvbi4KKyAgICAvLy8gTm90ZTogdG8gZ2FpbiBzcGVlZCBpdCBtaWdodCBiZSB3b3J0aCBpbnZlc3RpZ2F0aW5nIGFuIG9wdGltaXplZAorICAgIC8vLyBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGRhdGEgc3RydWN0dXJlLCBzdWNoIGFzIGEgc2luZ2x5IGxpbmtlZCBsaXN0CisgICAgLy8vIHdpdGggYSBtZW1vcnkgcG9vbCAoU21hbGxWZWN0b3Igd2FzIHRyaWVkIGJ1dCBzbG93IGFuZCBTcGFyc2VTZXQgaXMgbm90CisgICAgLy8vIGFwcGxpY2FibGUpLgorICAgIHVzaW5nIFNVTGlzdCA9IHN0ZDo6bGlzdDxTVW5pdCAqPjsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8vIFxicmllZiBBIG1hcCBmcm9tIFZhbHVlVHlwZSB0byBTVUxpc3QsIHVzZWQgZHVyaW5nIERBRyBjb25zdHJ1Y3Rpb24sIGFzCisgICAgLy8vIGEgbWVhbnMgb2YgcmVtZW1iZXJpbmcgd2hpY2ggU1VzIGRlcGVuZCBvbiB3aGljaCBtZW1vcnkgbG9jYXRpb25zLgorICAgIGNsYXNzIFZhbHVlMlNVc01hcDsKKworICAgIC8vLyBSZWR1Y2VzIG1hcHMgaW4gRklGTyBvcmRlciwgYnkgTiBTVXMuIFRoaXMgaXMgYmV0dGVyIHRoYW4gdHVybmluZworICAgIC8vLyBldmVyeSBOdGggbWVtb3J5IFNVIGludG8gQmFycmllckNoYWluIGluIGJ1aWxkU2NoZWRHcmFwaCgpLCBzaW5jZQorICAgIC8vLyBpdCBhdm9pZHMgdW5uZWNlc3NhcnkgZWRnZXMgYmV0d2VlbiBzZWVuIFNVcyBhYm92ZSB0aGUgbmV3IEJhcnJpZXJDaGFpbiwKKyAgICAvLy8gYW5kIHRob3NlIGJlbG93IGl0LgorICAgIHZvaWQgcmVkdWNlSHVnZU1lbU5vZGVNYXBzKFZhbHVlMlNVc01hcCAmc3RvcmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlMlNVc01hcCAmbG9hZHMsIHVuc2lnbmVkIE4pOworCisgICAgLy8vIFxicmllZiBBZGRzIGEgY2hhaW4gZWRnZSBiZXR3ZWVuIFNVYSBhbmQgU1ViLCBidXQgb25seSBpZiBib3RoCisgICAgLy8vIEFsaWFzQW5hbHlzaXMgYW5kIFRhcmdldCBmYWlsIHRvIGRlbnkgdGhlIGRlcGVuZGVuY3kuCisgICAgdm9pZCBhZGRDaGFpbkRlcGVuZGVuY3koU1VuaXQgKlNVYSwgU1VuaXQgKlNVYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMYXRlbmN5ID0gMCk7CisKKyAgICAvLy8gQWRkcyBkZXBlbmRlbmNpZXMgYXMgbmVlZGVkIGZyb20gYWxsIFNVcyBpbiBsaXN0IHRvIFNVLgorICAgIHZvaWQgYWRkQ2hhaW5EZXBlbmRlbmNpZXMoU1VuaXQgKlNVLCBTVUxpc3QgJlNVcywgdW5zaWduZWQgTGF0ZW5jeSkgeworICAgICAgZm9yIChTVW5pdCAqRW50cnkgOiBTVXMpCisgICAgICAgIGFkZENoYWluRGVwZW5kZW5jeShTVSwgRW50cnksIExhdGVuY3kpOworICAgIH0KKworICAgIC8vLyBBZGRzIGRlcGVuZGVuY2llcyBhcyBuZWVkZWQgZnJvbSBhbGwgU1VzIGluIG1hcCwgdG8gU1UuCisgICAgdm9pZCBhZGRDaGFpbkRlcGVuZGVuY2llcyhTVW5pdCAqU1UsIFZhbHVlMlNVc01hcCAmVmFsMlNVc01hcCk7CisKKyAgICAvLy8gQWRkcyBkZXBlbmRlbmNpZXMgYXMgbmVlZGVkIHRvIFNVLCBmcm9tIGFsbCBTVXMgbWFwcGVkIHRvIFYuCisgICAgdm9pZCBhZGRDaGFpbkRlcGVuZGVuY2llcyhTVW5pdCAqU1UsIFZhbHVlMlNVc01hcCAmVmFsMlNVc01hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlVHlwZSBWKTsKKworICAgIC8vLyBBZGRzIGJhcnJpZXIgY2hhaW4gZWRnZXMgZnJvbSBhbGwgU1VzIGluIG1hcCwgYW5kIHRoZW4gY2xlYXIgdGhlIG1hcC4KKyAgICAvLy8gVGhpcyBpcyBlcXVpdmFsZW50IHRvIGluc2VydEJhcnJpZXJDaGFpbigpLCBidXQgb3B0aW1pemVkIGZvciB0aGUgY29tbW9uCisgICAgLy8vIGNhc2Ugd2hlcmUgdGhlIG5ldyBCYXJyaWVyQ2hhaW4gKGEgZ2xvYmFsIG1lbW9yeSBvYmplY3QpIGhhcyBhIGhpZ2hlcgorICAgIC8vLyBOb2RlTnVtIHRoYW4gYWxsIFNVcyBpbiBtYXAuIEl0IGlzIGFzc3VtZWQgQmFycmllckNoYWluIGhhcyBiZWVuIHNldAorICAgIC8vLyBiZWZvcmUgY2FsbGluZyB0aGlzLgorICAgIHZvaWQgYWRkQmFycmllckNoYWluKFZhbHVlMlNVc01hcCAmbWFwKTsKKworICAgIC8vLyBJbnNlcnRzIGEgYmFycmllciBjaGFpbiBpbiBhIGh1Z2UgcmVnaW9uLCBmYXIgYmVsb3cgY3VycmVudCBTVS4KKyAgICAvLy8gQWRkcyBiYXJyaWVyIGNoYWluIGVkZ2VzIGZyb20gYWxsIFNVcyBpbiBtYXAgd2l0aCBoaWdoZXIgTm9kZU51bXMgdGhhbgorICAgIC8vLyB0aGlzIG5ldyBCYXJyaWVyQ2hhaW4sIGFuZCByZW1vdmUgdGhlbSBmcm9tIG1hcC4gSXQgaXMgYXNzdW1lZAorICAgIC8vLyBCYXJyaWVyQ2hhaW4gaGFzIGJlZW4gc2V0IGJlZm9yZSBjYWxsaW5nIHRoaXMuCisgICAgdm9pZCBpbnNlcnRCYXJyaWVyQ2hhaW4oVmFsdWUyU1VzTWFwICZtYXApOworCisgICAgLy8vIEZvciBhbiB1bmFuYWx5emFibGUgbWVtb3J5IGFjY2VzcywgdGhpcyBWYWx1ZSBpcyB1c2VkIGluIG1hcHMuCisgICAgVW5kZWZWYWx1ZSAqVW5rbm93blZhbHVlOworCisgICAgdXNpbmcgRGJnVmFsdWVWZWN0b3IgPQorICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8TWFjaGluZUluc3RyICosIE1hY2hpbmVJbnN0ciAqPj47CisgICAgLy8vIFJlbWVtYmVyIGluc3RydWN0aW9uIHRoYXQgcHJlY2VkZXMgREJHX1ZBTFVFLgorICAgIC8vLyBUaGVzZSBhcmUgZ2VuZXJhdGVkIGJ5IGJ1aWxkU2NoZWRHcmFwaCBidXQgcGVyc2lzdCBzbyB0aGV5IGNhbiBiZQorICAgIC8vLyByZWZlcmVuY2VkIHdoZW4gZW1pdHRpbmcgdGhlIGZpbmFsIHNjaGVkdWxlLgorICAgIERiZ1ZhbHVlVmVjdG9yIERiZ1ZhbHVlczsKKyAgICBNYWNoaW5lSW5zdHIgKkZpcnN0RGJnVmFsdWUgPSBudWxscHRyOworCisgICAgLy8vIFNldCBvZiBsaXZlIHBoeXNpY2FsIHJlZ2lzdGVycyBmb3IgdXBkYXRpbmcga2lsbCBmbGFncy4KKyAgICBMaXZlUGh5c1JlZ3MgTGl2ZVJlZ3M7CisKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFNjaGVkdWxlREFHSW5zdHJzKE1hY2hpbmVGdW5jdGlvbiAmbWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUxvb3BJbmZvICptbGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZW1vdmVLaWxsRmxhZ3MgPSBmYWxzZSk7CisKKyAgICB+U2NoZWR1bGVEQUdJbnN0cnMoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gR2V0cyB0aGUgbWFjaGluZSBtb2RlbCBmb3IgaW5zdHJ1Y3Rpb24gc2NoZWR1bGluZy4KKyAgICBjb25zdCBUYXJnZXRTY2hlZE1vZGVsICpnZXRTY2hlZE1vZGVsKCkgY29uc3QgeyByZXR1cm4gJlNjaGVkTW9kZWw7IH0KKworICAgIC8vLyBSZXNvbHZlcyBhbmQgY2FjaGUgYSByZXNvbHZlZCBzY2hlZHVsaW5nIGNsYXNzIGZvciBhbiBTVW5pdC4KKyAgICBjb25zdCBNQ1NjaGVkQ2xhc3NEZXNjICpnZXRTY2hlZENsYXNzKFNVbml0ICpTVSkgY29uc3QgeworICAgICAgaWYgKCFTVS0+U2NoZWRDbGFzcyAmJiBTY2hlZE1vZGVsLmhhc0luc3RyU2NoZWRNb2RlbCgpKQorICAgICAgICBTVS0+U2NoZWRDbGFzcyA9IFNjaGVkTW9kZWwucmVzb2x2ZVNjaGVkQ2xhc3MoU1UtPmdldEluc3RyKCkpOworICAgICAgcmV0dXJuIFNVLT5TY2hlZENsYXNzOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSB0b3Agb2YgdGhlIGN1cnJlbnQgc2NoZWR1bGluZyByZWdpb24uCisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gUmVnaW9uQmVnaW47IH0KKworICAgIC8vLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBib3R0b20gb2YgdGhlIGN1cnJlbnQgc2NoZWR1bGluZyByZWdpb24uCisgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIFJlZ2lvbkVuZDsgfQorCisgICAgLy8vIENyZWF0ZXMgYSBuZXcgU1VuaXQgYW5kIHJldHVybiBhIHB0ciB0byBpdC4KKyAgICBTVW5pdCAqbmV3U1VuaXQoTWFjaGluZUluc3RyICpNSSk7CisKKyAgICAvLy8gUmV0dXJucyBhbiBleGlzdGluZyBTVW5pdCBmb3IgdGhpcyBNSSwgb3IgbnVsbHB0ci4KKyAgICBTVW5pdCAqZ2V0U1VuaXQoTWFjaGluZUluc3RyICpNSSkgY29uc3Q7CisKKyAgICAvLy8gSWYgdGhpcyBtZXRob2QgcmV0dXJucyB0cnVlLCBoYW5kbGluZyBvZiB0aGUgc2NoZWR1bGluZyByZWdpb25zCisgICAgLy8vIHRoZW1zZWx2ZXMgKGluIGNhc2Ugb2YgYSBzY2hlZHVsaW5nIGJvdW5kYXJ5IGluIE1CQikgd2lsbCBiZSBkb25lCisgICAgLy8vIGJlZ2lubmluZyB3aXRoIHRoZSB0b3Btb3N0IHJlZ2lvbiBvZiBNQkIuCisgICAgdmlydHVhbCBib29sIGRvTUJCU2NoZWRSZWdpb25zVG9wRG93bigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgICAvLy8gUHJlcGFyZXMgdG8gcGVyZm9ybSBzY2hlZHVsaW5nIGluIHRoZSBnaXZlbiBibG9jay4KKyAgICB2aXJ0dWFsIHZvaWQgc3RhcnRCbG9jayhNYWNoaW5lQmFzaWNCbG9jayAqQkIpOworCisgICAgLy8vIENsZWFucyB1cCBhZnRlciBzY2hlZHVsaW5nIGluIHRoZSBnaXZlbiBibG9jay4KKyAgICB2aXJ0dWFsIHZvaWQgZmluaXNoQmxvY2soKTsKKworICAgIC8vLyBcYnJpZWYgSW5pdGlhbGl6ZSB0aGUgREFHIGFuZCBjb21tb24gc2NoZWR1bGVyIHN0YXRlIGZvciBhIG5ldworICAgIC8vLyBzY2hlZHVsaW5nIHJlZ2lvbi4gVGhpcyBkb2VzIG5vdCBhY3R1YWxseSBjcmVhdGUgdGhlIERBRywgb25seSBjbGVhcnMKKyAgICAvLy8gaXQuIFRoZSBzY2hlZHVsaW5nIGRyaXZlciBtYXkgY2FsbCBCdWlsZFNjaGVkR3JhcGggbXVsdGlwbGUgdGltZXMgcGVyCisgICAgLy8vIHNjaGVkdWxpbmcgcmVnaW9uLgorICAgIHZpcnR1YWwgdm9pZCBlbnRlclJlZ2lvbihNYWNoaW5lQmFzaWNCbG9jayAqYmIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBiZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgcmVnaW9uaW5zdHJzKTsKKworICAgIC8vLyBDYWxsZWQgd2hlbiB0aGUgc2NoZWR1bGVyIGhhcyBmaW5pc2hlZCBzY2hlZHVsaW5nIHRoZSBjdXJyZW50IHJlZ2lvbi4KKyAgICB2aXJ0dWFsIHZvaWQgZXhpdFJlZ2lvbigpOworCisgICAgLy8vIEJ1aWxkcyBTVW5pdHMgZm9yIHRoZSBjdXJyZW50IHJlZ2lvbi4KKyAgICAvLy8gSWYgXHAgUlBUcmFja2VyIGlzIG5vbi1udWxsLCBjb21wdXRlIHJlZ2lzdGVyIHByZXNzdXJlIGFzIGEgc2lkZSBlZmZlY3QuCisgICAgLy8vIFRoZSBEQUcgYnVpbGRlciBpcyBhbiBlZmZpY2llbnQgcGxhY2UgdG8gZG8gaXQgYmVjYXVzZSBpdCBhbHJlYWR5IHZpc2l0cworICAgIC8vLyBvcGVyYW5kcy4KKyAgICB2b2lkIGJ1aWxkU2NoZWRHcmFwaChBbGlhc0FuYWx5c2lzICpBQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZWdQcmVzc3VyZVRyYWNrZXIgKlJQVHJhY2tlciA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUHJlc3N1cmVEaWZmcyAqUERpZmZzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBMaXZlSW50ZXJ2YWxzICpMSVMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVHJhY2tMYW5lTWFza3MgPSBmYWxzZSk7CisKKyAgICAvLy8gXGJyaWVmIEFkZHMgZGVwZW5kZW5jaWVzIGZyb20gaW5zdHJ1Y3Rpb25zIGluIHRoZSBjdXJyZW50IGxpc3Qgb2YKKyAgICAvLy8gaW5zdHJ1Y3Rpb25zIGJlaW5nIHNjaGVkdWxlZCB0byBzY2hlZHVsaW5nIGJhcnJpZXIuIFdlIHdhbnQgdG8gbWFrZSBzdXJlCisgICAgLy8vIGluc3RydWN0aW9ucyB3aGljaCBkZWZpbmUgcmVnaXN0ZXJzIHRoYXQgYXJlIGVpdGhlciB1c2VkIGJ5IHRoZQorICAgIC8vLyB0ZXJtaW5hdG9yIG9yIGFyZSBsaXZlLW91dCBhcmUgcHJvcGVybHkgc2NoZWR1bGVkLiBUaGlzIGlzIGVzcGVjaWFsbHkKKyAgICAvLy8gaW1wb3J0YW50IHdoZW4gdGhlIGRlZmluaXRpb24gbGF0ZW5jeSBvZiB0aGUgcmV0dXJuIHZhbHVlKHMpIGFyZSB0b28KKyAgICAvLy8gaGlnaCB0byBiZSBoaWRkZW4gYnkgdGhlIGJyYW5jaCBvciB3aGVuIHRoZSBsaXZlb3V0IHJlZ2lzdGVycyB1c2VkIGJ5CisgICAgLy8vIGluc3RydWN0aW9ucyBpbiB0aGUgZmFsbHRocm91Z2ggYmxvY2suCisgICAgdm9pZCBhZGRTY2hlZEJhcnJpZXJEZXBzKCk7CisKKyAgICAvLy8gT3JkZXJzIG5vZGVzIGFjY29yZGluZyB0byBzZWxlY3RlZCBzdHlsZS4KKyAgICAvLy8KKyAgICAvLy8gVHlwaWNhbGx5LCBhIHNjaGVkdWxpbmcgYWxnb3JpdGhtIHdpbGwgaW1wbGVtZW50IHNjaGVkdWxlKCkgd2l0aG91dAorICAgIC8vLyBvdmVycmlkaW5nIGVudGVyUmVnaW9uKCkgb3IgZXhpdFJlZ2lvbigpLgorICAgIHZpcnR1YWwgdm9pZCBzY2hlZHVsZSgpID0gMDsKKworICAgIC8vLyBBbGxvdyB0YXJnZXRzIHRvIHBlcmZvcm0gZmluYWwgc2NoZWR1bGluZyBhY3Rpb25zIGF0IHRoZSBsZXZlbCBvZiB0aGUKKyAgICAvLy8gd2hvbGUgTWFjaGluZUZ1bmN0aW9uLiBCeSBkZWZhdWx0IGRvZXMgbm90aGluZy4KKyAgICB2aXJ0dWFsIHZvaWQgZmluYWxpemVTY2hlZHVsZSgpIHt9CisKKyAgICB2b2lkIGR1bXBOb2RlKGNvbnN0IFNVbml0ICpTVSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLy8gUmV0dXJucyBhIGxhYmVsIGZvciBhIERBRyBub2RlIHRoYXQgcG9pbnRzIHRvIGFuIGluc3RydWN0aW9uLgorICAgIHN0ZDo6c3RyaW5nIGdldEdyYXBoTm9kZUxhYmVsKGNvbnN0IFNVbml0ICpTVSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgICAvLy8gUmV0dXJucyBhIGxhYmVsIGZvciB0aGUgcmVnaW9uIG9mIGNvZGUgY292ZXJlZCBieSB0aGUgREFHLgorICAgIHN0ZDo6c3RyaW5nIGdldERBR05hbWUoKSBjb25zdCBvdmVycmlkZTsKKworICAgIC8vLyBGaXhlcyByZWdpc3RlciBraWxsIGZsYWdzIHRoYXQgc2NoZWR1bGluZyBoYXMgbWFkZSBpbnZhbGlkLgorICAgIHZvaWQgZml4dXBLaWxscyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCKTsKKworICBwcm90ZWN0ZWQ6CisgICAgdm9pZCBpbml0U1VuaXRzKCk7CisgICAgdm9pZCBhZGRQaHlzUmVnRGF0YURlcHMoU1VuaXQgKlNVLCB1bnNpZ25lZCBPcGVySWR4KTsKKyAgICB2b2lkIGFkZFBoeXNSZWdEZXBzKFNVbml0ICpTVSwgdW5zaWduZWQgT3BlcklkeCk7CisgICAgdm9pZCBhZGRWUmVnRGVmRGVwcyhTVW5pdCAqU1UsIHVuc2lnbmVkIE9wZXJJZHgpOworICAgIHZvaWQgYWRkVlJlZ1VzZURlcHMoU1VuaXQgKlNVLCB1bnNpZ25lZCBPcGVySWR4KTsKKworICAgIC8vLyBJbml0aWFsaXplcyByZWdpc3RlciBsaXZlLXJhbmdlIHN0YXRlIGZvciB1cGRhdGluZyBraWxscy4KKyAgICAvLy8gUG9zdFJBIGhlbHBlciBmb3IgcmV3cml0aW5nIGtpbGwgZmxhZ3MuCisgICAgdm9pZCBzdGFydEJsb2NrRm9yS2lsbHMoTWFjaGluZUJhc2ljQmxvY2sgKkJCKTsKKworICAgIC8vLyBUb2dnbGVzIGEgcmVnaXN0ZXIgb3BlcmFuZCBraWxsIGZsYWcuCisgICAgLy8vCisgICAgLy8vIE90aGVyIGFkanVzdG1lbnRzIG1heSBiZSBtYWRlIHRvIHRoZSBpbnN0cnVjdGlvbiBpZiBuZWNlc3NhcnkuIFJldHVybgorICAgIC8vLyB0cnVlIGlmIHRoZSBvcGVyYW5kIGhhcyBiZWVuIGRlbGV0ZWQsIGZhbHNlIGlmIG5vdC4KKyAgICB2b2lkIHRvZ2dsZUtpbGxGbGFnKE1hY2hpbmVJbnN0ciAmTUksIE1hY2hpbmVPcGVyYW5kICZNTyk7CisKKyAgICAvLy8gUmV0dXJucyBhIG1hc2sgZm9yIHdoaWNoIGxhbmVzIGdldCByZWFkL3dyaXR0ZW4gYnkgdGhlIGdpdmVuIChyZWdpc3RlcikKKyAgICAvLy8gbWFjaGluZSBvcGVyYW5kLgorICAgIExhbmVCaXRtYXNrIGdldExhbmVNYXNrRm9yTU8oY29uc3QgTWFjaGluZU9wZXJhbmQgJk1PKSBjb25zdDsKKyAgfTsKKworICAvLy8gQ3JlYXRlcyBhIG5ldyBTVW5pdCBhbmQgcmV0dXJuIGEgcHRyIHRvIGl0LgorICBpbmxpbmUgU1VuaXQgKlNjaGVkdWxlREFHSW5zdHJzOjpuZXdTVW5pdChNYWNoaW5lSW5zdHIgKk1JKSB7CisjaWZuZGVmIE5ERUJVRworICAgIGNvbnN0IFNVbml0ICpBZGRyID0gU1VuaXRzLmVtcHR5KCkgPyBudWxscHRyIDogJlNVbml0c1swXTsKKyNlbmRpZgorICAgIFNVbml0cy5lbXBsYWNlX2JhY2soTUksICh1bnNpZ25lZClTVW5pdHMuc2l6ZSgpKTsKKyAgICBhc3NlcnQoKEFkZHIgPT0gbnVsbHB0ciB8fCBBZGRyID09ICZTVW5pdHNbMF0pICYmCisgICAgICAgICAgICJTVW5pdHMgc3RkOjp2ZWN0b3IgcmVhbGxvY2F0ZWQgb24gdGhlIGZseSEiKTsKKyAgICByZXR1cm4gJlNVbml0cy5iYWNrKCk7CisgIH0KKworICAvLy8gUmV0dXJucyBhbiBleGlzdGluZyBTVW5pdCBmb3IgdGhpcyBNSSwgb3IgbnVsbHB0ci4KKyAgaW5saW5lIFNVbml0ICpTY2hlZHVsZURBR0luc3Ryczo6Z2V0U1VuaXQoTWFjaGluZUluc3RyICpNSSkgY29uc3QgeworICAgIERlbnNlTWFwPE1hY2hpbmVJbnN0ciosIFNVbml0Kj46OmNvbnN0X2l0ZXJhdG9yIEkgPSBNSVNVbml0TWFwLmZpbmQoTUkpOworICAgIGlmIChJID09IE1JU1VuaXRNYXAuZW5kKCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gSS0+c2Vjb25kOworICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fU0NIRURVTEVEQUdJTlNUUlNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NjaGVkdWxlREFHTXV0YXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TY2hlZHVsZURBR011dGF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyMzY0MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TY2hlZHVsZURBR011dGF0aW9uLmgKQEAgLTAsMCArMSwzNCBAQAorLy89PT0tIFNjaGVkdWxlREFHTXV0YXRpb24uaCAtIE1hY2hpbmVJbnN0ciBTY2hlZHVsaW5nIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgU2NoZWR1bGVEQUdNdXRhdGlvbiBjbGFzcywgd2hpY2ggcmVwcmVzZW50cworLy8gYSB0YXJnZXQtc3BlY2lmaWMgbXV0YXRpb24gb2YgdGhlIGRlcGVuZGVuY3kgZ3JhcGggZm9yIHNjaGVkdWxpbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fU0NIRURVTEVEQUdNVVRBVElPTl9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9TQ0hFRFVMRURBR01VVEFUSU9OX0gKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBTY2hlZHVsZURBR0luc3RyczsKKworLy8vIE11dGF0ZSB0aGUgREFHIGFzIGEgcG9zdHBhc3MgYWZ0ZXIgbm9ybWFsIERBRyBidWlsZGluZy4KK2NsYXNzIFNjaGVkdWxlREFHTXV0YXRpb24geworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3B1YmxpYzoKKyAgdmlydHVhbCB+U2NoZWR1bGVEQUdNdXRhdGlvbigpID0gZGVmYXVsdDsKKworICB2aXJ0dWFsIHZvaWQgYXBwbHkoU2NoZWR1bGVEQUdJbnN0cnMgKkRBRykgPSAwOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9TQ0hFRFVMRURBR01VVEFUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TY2hlZHVsZURGUy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NjaGVkdWxlREZTLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDZhOGM3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TY2hlZHVsZURGUy5oCkBAIC0wLDAgKzEsMTk0IEBACisvLz09PS0gU2NoZWR1bGVEQUdJTFAuaCAtIElMUCBtZXRyaWMgZm9yIFNjaGVkdWxlREFHSW5zdHJzIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIERlZmluaXRpb24gb2YgYW4gSUxQIG1ldHJpYyBmb3IgbWFjaGluZSBsZXZlbCBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1NDSEVEVUxFREZTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1NDSEVEVUxFREZTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2NoZWR1bGVEQUcuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gXGJyaWVmIFJlcHJlc2VudCB0aGUgSUxQIG9mIHRoZSBzdWJEQUcgcm9vdGVkIGF0IGEgREFHIG5vZGUuCisvLy8KKy8vLyBJTFBWYWx1ZXMgc3VtbWFyaXplIHRoZSBEQUcgc3VidHJlZSByb290ZWQgYXQgZWFjaCBub2RlLiBJTFBWYWx1ZXMgYXJlCisvLy8gdmFsaWQgZm9yIGFsbCBub2RlcyByZWdhcmRsZXNzIG9mIHRoZWlyIHN1YnRyZWUgbWVtYmVyc2hpcC4KKy8vLworLy8vIFdoZW4gY29tcHV0ZWQgdXNpbmcgYm90dG9tLXVwIERGUywgdGhpcyBtZXRyaWMgYXNzdW1lcyB0aGF0IHRoZSBEQUcgaXMgYQorLy8vIGZvcmVzdCBvZiB0cmVlcyB3aXRoIHJvb3RzIGF0IHRoZSBib3R0b20gb2YgdGhlIHNjaGVkdWxlIGJyYW5jaGluZyB1cHdhcmQuCitzdHJ1Y3QgSUxQVmFsdWUgeworICB1bnNpZ25lZCBJbnN0ckNvdW50OworICAvLy8gTGVuZ3RoIG1heSBlaXRoZXIgY29ycmVzcG9uZCB0byBkZXB0aCBvciBoZWlnaHQsIGRlcGVuZGluZyBvbiBkaXJlY3Rpb24sCisgIC8vLyBhbmQgY3ljbGVzIG9yIG5vZGVzIGRlcGVuZGluZyBvbiBjb250ZXh0LgorICB1bnNpZ25lZCBMZW5ndGg7CisKKyAgSUxQVmFsdWUodW5zaWduZWQgY291bnQsIHVuc2lnbmVkIGxlbmd0aCk6CisgICAgSW5zdHJDb3VudChjb3VudCksIExlbmd0aChsZW5ndGgpIHt9CisKKyAgLy8gT3JkZXIgYnkgdGhlIElMUCBtZXRyaWMncyB2YWx1ZS4KKyAgYm9vbCBvcGVyYXRvcjwoSUxQVmFsdWUgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuICh1aW50NjRfdClJbnN0ckNvdW50ICogUkhTLkxlbmd0aAorICAgICAgPCAodWludDY0X3QpTGVuZ3RoICogUkhTLkluc3RyQ291bnQ7CisgIH0KKyAgYm9vbCBvcGVyYXRvcj4oSUxQVmFsdWUgUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFJIUyA8ICp0aGlzOworICB9CisgIGJvb2wgb3BlcmF0b3I8PShJTFBWYWx1ZSBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gKHVpbnQ2NF90KUluc3RyQ291bnQgKiBSSFMuTGVuZ3RoCisgICAgICA8PSAodWludDY0X3QpTGVuZ3RoICogUkhTLkluc3RyQ291bnQ7CisgIH0KKyAgYm9vbCBvcGVyYXRvcj49KElMUFZhbHVlIFJIUykgY29uc3QgeworICAgIHJldHVybiBSSFMgPD0gKnRoaXM7CisgIH0KKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgdm9pZCBkdW1wKCkgY29uc3Q7Cit9OworCisvLy8gXGJyaWVmIENvbXB1dGUgdGhlIHZhbHVlcyBvZiBlYWNoIERBRyBub2RlIGZvciB2YXJpb3VzIG1ldHJpY3MgZHVyaW5nIERGUy4KK2NsYXNzIFNjaGVkREZTUmVzdWx0IHsKKyAgZnJpZW5kIGNsYXNzIFNjaGVkREZTSW1wbDsKKworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgSW52YWxpZFN1YnRyZWVJRCA9IH4wdTsKKworICAvLy8gXGJyaWVmIFBlci1TVW5pdCBkYXRhIGNvbXB1dGVkIGR1cmluZyBERlMgZm9yIHZhcmlvdXMgbWV0cmljcy4KKyAgLy8vCisgIC8vLyBBIG5vZGUncyBTdWJ0cmVlSUQgaXMgc2V0IHRvIGl0c2VsZiB3aGVuIGl0IGlzIHZpc2l0ZWQgdG8gaW5kaWNhdGUgdGhhdCBpdAorICAvLy8gaXMgdGhlIHJvb3Qgb2YgYSBzdWJ0cmVlLiBMYXRlciBpdCBpcyBzZXQgdG8gaXRzIHBhcmVudCB0byBpbmRpY2F0ZSBhbgorICAvLy8gaW50ZXJpb3Igbm9kZS4gRmluYWxseSwgaXQgaXMgc2V0IHRvIGEgcmVwcmVzZW50YXRpdmUgc3VidHJlZSBJRCBkdXJpbmcKKyAgLy8vIGZpbmFsaXphdGlvbi4KKyAgc3RydWN0IE5vZGVEYXRhIHsKKyAgICB1bnNpZ25lZCBJbnN0ckNvdW50ID0gMDsKKyAgICB1bnNpZ25lZCBTdWJ0cmVlSUQgPSBJbnZhbGlkU3VidHJlZUlEOworCisgICAgTm9kZURhdGEoKSA9IGRlZmF1bHQ7CisgIH07CisKKyAgLy8vIFxicmllZiBQZXItU3VidHJlZSBkYXRhIGNvbXB1dGVkIGR1cmluZyBERlMuCisgIHN0cnVjdCBUcmVlRGF0YSB7CisgICAgdW5zaWduZWQgUGFyZW50VHJlZUlEID0gSW52YWxpZFN1YnRyZWVJRDsKKyAgICB1bnNpZ25lZCBTdWJJbnN0ckNvdW50ID0gMDsKKworICAgIFRyZWVEYXRhKCkgPSBkZWZhdWx0OworICB9OworCisgIC8vLyBcYnJpZWYgUmVjb3JkIGEgY29ubmVjdGlvbiBiZXR3ZWVuIHN1YnRyZWVzIGFuZCB0aGUgY29ubmVjdGlvbiBsZXZlbC4KKyAgc3RydWN0IENvbm5lY3Rpb24geworICAgIHVuc2lnbmVkIFRyZWVJRDsKKyAgICB1bnNpZ25lZCBMZXZlbDsKKworICAgIENvbm5lY3Rpb24odW5zaWduZWQgdHJlZSwgdW5zaWduZWQgbGV2ZWwpOiBUcmVlSUQodHJlZSksIExldmVsKGxldmVsKSB7fQorICB9OworCisgIGJvb2wgSXNCb3R0b21VcDsKKyAgdW5zaWduZWQgU3VidHJlZUxpbWl0OworICAvLy8gREZTIHJlc3VsdHMgZm9yIGVhY2ggU1VuaXQgaW4gdGhpcyBEQUcuCisgIHN0ZDo6dmVjdG9yPE5vZGVEYXRhPiBERlNOb2RlRGF0YTsKKworICAvLyBTdG9yZSBwZXItdHJlZSBkYXRhIGluZGV4ZWQgb24gdHJlZSBJRCwKKyAgU21hbGxWZWN0b3I8VHJlZURhdGEsIDE2PiBERlNUcmVlRGF0YTsKKworICAvLyBGb3IgZWFjaCBzdWJ0cmVlIGRpc2NvdmVyZWQgZHVyaW5nIERGUywgcmVjb3JkIGl0cyBjb25uZWN0aW9ucyB0byBvdGhlcgorICAvLyBzdWJ0cmVlcy4KKyAgc3RkOjp2ZWN0b3I8U21hbGxWZWN0b3I8Q29ubmVjdGlvbiwgND4+IFN1YnRyZWVDb25uZWN0aW9uczsKKworICAvLy8gQ2FjaGUgdGhlIGN1cnJlbnQgY29ubmVjdGlvbiBsZXZlbCBvZiBlYWNoIHN1YnRyZWUuCisgIC8vLyBUaGlzIG11dGFibGUgYXJyYXkgaXMgdXBkYXRlZCBkdXJpbmcgc2NoZWR1bGluZy4KKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IFN1YnRyZWVDb25uZWN0TGV2ZWxzOworCitwdWJsaWM6CisgIFNjaGVkREZTUmVzdWx0KGJvb2wgSXNCVSwgdW5zaWduZWQgbGltKQorICAgIDogSXNCb3R0b21VcChJc0JVKSwgU3VidHJlZUxpbWl0KGxpbSkge30KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbm9kZSBjdXRvZmYgYmVmb3JlIHN1YnRyZWVzIGFyZSBjb25zaWRlcmVkIHNpZ25pZmljYW50LgorICB1bnNpZ25lZCBnZXRTdWJ0cmVlTGltaXQoKSBjb25zdCB7IHJldHVybiBTdWJ0cmVlTGltaXQ7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgREZTUmVzdWx0IGlzIHVuaW5pdGlhbGl6ZWQuCisgIC8vLworICAvLy8gcmVzaXplKCkgaW5pdGlhbGl6ZXMgREZTUmVzdWx0LCB3aGlsZSBjb21wdXRlKCkgcG9wdWxhdGVzIGl0LgorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gREZTTm9kZURhdGEuZW1wdHkoKTsgfQorCisgIC8vLyBcYnJpZWYgQ2xlYXIgdGhlIHJlc3VsdHMuCisgIHZvaWQgY2xlYXIoKSB7CisgICAgREZTTm9kZURhdGEuY2xlYXIoKTsKKyAgICBERlNUcmVlRGF0YS5jbGVhcigpOworICAgIFN1YnRyZWVDb25uZWN0aW9ucy5jbGVhcigpOworICAgIFN1YnRyZWVDb25uZWN0TGV2ZWxzLmNsZWFyKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEluaXRpYWxpemUgdGhlIHJlc3VsdCBkYXRhIHdpdGggdGhlIHNpemUgb2YgdGhlIERBRy4KKyAgdm9pZCByZXNpemUodW5zaWduZWQgTnVtU1VuaXRzKSB7CisgICAgREZTTm9kZURhdGEucmVzaXplKE51bVNVbml0cyk7CisgIH0KKworICAvLy8gXGJyaWVmIENvbXB1dGUgdmFyaW91cyBtZXRyaWNzIGZvciB0aGUgREFHIHdpdGggZ2l2ZW4gcm9vdHMuCisgIHZvaWQgY29tcHV0ZShBcnJheVJlZjxTVW5pdD4gU1VuaXRzKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbiB0aGUgZ2l2ZW4gc3VidHJlZSBhbmQgaXRzCisgIC8vLyBjaGlsZHJlbi4KKyAgdW5zaWduZWQgZ2V0TnVtSW5zdHJzKGNvbnN0IFNVbml0ICpTVSkgY29uc3QgeworICAgIHJldHVybiBERlNOb2RlRGF0YVtTVS0+Tm9kZU51bV0uSW5zdHJDb3VudDsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIGluIHRoZSBnaXZlbiBzdWJ0cmVlIG5vdCBpbmNsdWRpbmcKKyAgLy8vIGNoaWxkcmVuLgorICB1bnNpZ25lZCBnZXROdW1TdWJJbnN0cnModW5zaWduZWQgU3VidHJlZUlEKSBjb25zdCB7CisgICAgcmV0dXJuIERGU1RyZWVEYXRhW1N1YnRyZWVJRF0uU3ViSW5zdHJDb3VudDsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBJTFAgdmFsdWUgZm9yIGEgREFHIG5vZGUuCisgIC8vLworICAvLy8gQSBsZWFmIG5vZGUgaGFzIGFuIElMUCBvZiAxLzEuCisgIElMUFZhbHVlIGdldElMUChjb25zdCBTVW5pdCAqU1UpIGNvbnN0IHsKKyAgICByZXR1cm4gSUxQVmFsdWUoREZTTm9kZURhdGFbU1UtPk5vZGVOdW1dLkluc3RyQ291bnQsIDEgKyBTVS0+Z2V0RGVwdGgoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2Ygc3VidHJlZXMgZGV0ZWN0ZWQgaW4gdGhpcyBEQUcuCisgIHVuc2lnbmVkIGdldE51bVN1YnRyZWVzKCkgY29uc3QgeyByZXR1cm4gU3VidHJlZUNvbm5lY3RMZXZlbHMuc2l6ZSgpOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIElEIG9mIHRoZSBzdWJ0cmVlIHRoZSBnaXZlbiBEQUcgbm9kZSBiZWxvbmdzIHRvLgorICAvLy8KKyAgLy8vIEZvciBjb252ZW5pZW5jZSwgaWYgREZTUmVzdWx0cyBoYXZlIG5vdCBiZWVuIGNvbXB1dGVkIHlldCwgZ2l2ZSBldmVyeXRoaW5nCisgIC8vLyB0cmVlIElEIDAuCisgIHVuc2lnbmVkIGdldFN1YnRyZWVJRChjb25zdCBTVW5pdCAqU1UpIGNvbnN0IHsKKyAgICBpZiAoZW1wdHkoKSkKKyAgICAgIHJldHVybiAwOworICAgIGFzc2VydChTVS0+Tm9kZU51bSA8IERGU05vZGVEYXRhLnNpemUoKSAmJiAgIk5ldyBOb2RlIik7CisgICAgcmV0dXJuIERGU05vZGVEYXRhW1NVLT5Ob2RlTnVtXS5TdWJ0cmVlSUQ7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgY29ubmVjdGlvbiBsZXZlbCBvZiBhIHN1YnRyZWUuCisgIC8vLworICAvLy8gRm9yIGJvdHRvbS11cCB0cmVlcywgdGhlIGNvbm5lY3Rpb24gbGV2ZWwgaXMgdGhlIGxhdGVuY3kgZGVwdGggKGluIGN5Y2xlcykKKyAgLy8vIG9mIHRoZSBkZWVwZXN0IGNvbm5lY3Rpb24gdG8gYW5vdGhlciBzdWJ0cmVlLgorICB1bnNpZ25lZCBnZXRTdWJ0cmVlTGV2ZWwodW5zaWduZWQgU3VidHJlZUlEKSBjb25zdCB7CisgICAgcmV0dXJuIFN1YnRyZWVDb25uZWN0TGV2ZWxzW1N1YnRyZWVJRF07CisgIH0KKworICAvLy8gXGJyaWVmIFNjaGVkdWxlciBjYWxsYmFjayB0byB1cGRhdGUgU3VidHJlZUNvbm5lY3RMZXZlbHMgd2hlbiBhIHRyZWUgaXMKKyAgLy8vIGluaXRpYWxseSBzY2hlZHVsZWQuCisgIHZvaWQgc2NoZWR1bGVUcmVlKHVuc2lnbmVkIFN1YnRyZWVJRCk7Cit9OworCityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IElMUFZhbHVlICZWYWwpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1NDSEVEVUxFREZTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TY2hlZHVsZUhhemFyZFJlY29nbml6ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TY2hlZHVsZUhhemFyZFJlY29nbml6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hY2U0YTJkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NjaGVkdWxlSGF6YXJkUmVjb2duaXplci5oCkBAIC0wLDAgKzEsMTIyIEBACisvLz0tIGxsdm0vQ29kZUdlbi9TY2hlZHVsZUhhemFyZFJlY29nbml6ZXIuaCAtIFNjaGVkdWxpbmcgU3VwcG9ydCAtKi0gQysrIC0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBTY2hlZHVsZUhhemFyZFJlY29nbml6ZXIgY2xhc3MsIHdoaWNoIGltcGxlbWVudHMKKy8vIGhhemFyZC1hdm9pZGFuY2UgaGV1cmlzdGljcyBmb3Igc2NoZWR1bGluZy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9TQ0hFRFVMRUhBWkFSRFJFQ09HTklaRVJfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fU0NIRURVTEVIQVpBUkRSRUNPR05JWkVSX0gKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBTVW5pdDsKKworLy8vIEhhemFyZFJlY29nbml6ZXIgLSBUaGlzIGRldGVybWluZXMgd2hldGhlciBvciBub3QgYW4gaW5zdHJ1Y3Rpb24gY2FuIGJlCisvLy8gaXNzdWVkIHRoaXMgY3ljbGUsIGFuZCB3aGV0aGVyIG9yIG5vdCBhIG5vb3AgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQgdG8gaGFuZGxlCisvLy8gdGhlIGhhemFyZC4KK2NsYXNzIFNjaGVkdWxlSGF6YXJkUmVjb2duaXplciB7Citwcm90ZWN0ZWQ6CisgIC8vLyBNYXhMb29rQWhlYWQgLSBJbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIGN5Y2xlcyBpbiB0aGUgc2NvcmVib2FyZAorICAvLy8gc3RhdGUuIEltcG9ydGFudCB0byByZXN0b3JlIHRoZSBzdGF0ZSBhZnRlciBiYWNrdHJhY2tpbmcuIEFkZGl0aW9uYWxseSwKKyAgLy8vIE1heExvb2tBaGVhZD0wIGlkZW50aWZpZXMgYSBmYWtlIHJlY29nbml6ZXIsIGFsbG93aW5nIHRoZSBjbGllbnQgdG8KKyAgLy8vIGJ5cGFzcyB2aXJ0dWFsIGNhbGxzLiBDdXJyZW50bHkgdGhlIFBvc3RSQSBzY2hlZHVsZXIgaWdub3JlcyBpdC4KKyAgdW5zaWduZWQgTWF4TG9va0FoZWFkID0gMDsKKworcHVibGljOgorICBTY2hlZHVsZUhhemFyZFJlY29nbml6ZXIoKSA9IGRlZmF1bHQ7CisgIHZpcnR1YWwgflNjaGVkdWxlSGF6YXJkUmVjb2duaXplcigpOworCisgIGVudW0gSGF6YXJkVHlwZSB7CisgICAgTm9IYXphcmQsICAgICAgLy8gVGhpcyBpbnN0cnVjdGlvbiBjYW4gYmUgZW1pdHRlZCBhdCB0aGlzIGN5Y2xlLgorICAgIEhhemFyZCwgICAgICAgIC8vIFRoaXMgaW5zdHJ1Y3Rpb24gY2FuJ3QgYmUgZW1pdHRlZCBhdCB0aGlzIGN5Y2xlLgorICAgIE5vb3BIYXphcmQgICAgIC8vIFRoaXMgaW5zdHJ1Y3Rpb24gY2FuJ3QgYmUgZW1pdHRlZCwgYW5kIG5lZWRzIG5vb3BzLgorICB9OworCisgIHVuc2lnbmVkIGdldE1heExvb2tBaGVhZCgpIGNvbnN0IHsgcmV0dXJuIE1heExvb2tBaGVhZDsgfQorCisgIGJvb2wgaXNFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gTWF4TG9va0FoZWFkICE9IDA7IH0KKworICAvLy8gYXRJc3N1ZUxpbWl0IC0gUmV0dXJuIHRydWUgaWYgbm8gbW9yZSBpbnN0cnVjdGlvbnMgbWF5IGJlIGlzc3VlZCBpbiB0aGlzCisgIC8vLyBjeWNsZS4KKyAgLy8vCisgIC8vLyBGSVhNRTogcmVtb3ZlIHRoaXMgb25jZSBNYWNoaW5lU2NoZWR1bGVyIGlzIHRoZSBvbmx5IGNsaWVudC4KKyAgdmlydHVhbCBib29sIGF0SXNzdWVMaW1pdCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIGdldEhhemFyZFR5cGUgLSBSZXR1cm4gdGhlIGhhemFyZCB0eXBlIG9mIGVtaXR0aW5nIHRoaXMgbm9kZS4gIFRoZXJlIGFyZQorICAvLy8gdGhyZWUgcG9zc2libGUgcmVzdWx0cy4gIEVpdGhlcjoKKyAgLy8vICAqIE5vSGF6YXJkOiBpdCBpcyBsZWdhbCB0byBpc3N1ZSB0aGlzIGluc3RydWN0aW9uIG9uIHRoaXMgY3ljbGUuCisgIC8vLyAgKiBIYXphcmQ6IGlzc3VpbmcgdGhpcyBpbnN0cnVjdGlvbiB3b3VsZCBzdGFsbCB0aGUgbWFjaGluZS4gIElmIHNvbWUKKyAgLy8vICAgICBvdGhlciBpbnN0cnVjdGlvbiBpcyBhdmFpbGFibGUsIGlzc3VlIGl0IGZpcnN0LgorICAvLy8gICogTm9vcEhhemFyZDogaXNzdWluZyB0aGlzIGluc3RydWN0aW9uIHdvdWxkIGJyZWFrIHRoZSBwcm9ncmFtLiAgSWYKKyAgLy8vICAgICBzb21lIG90aGVyIGluc3RydWN0aW9uIGNhbiBiZSBpc3N1ZWQsIGRvIHNvLCBvdGhlcndpc2UgaXNzdWUgYSBub29wLgorICB2aXJ0dWFsIEhhemFyZFR5cGUgZ2V0SGF6YXJkVHlwZShTVW5pdCAqbSwgaW50IFN0YWxscyA9IDApIHsKKyAgICByZXR1cm4gTm9IYXphcmQ7CisgIH0KKworICAvLy8gUmVzZXQgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIG5ldyBibG9jayBvZgorICAvLy8gaW5zdHJ1Y3Rpb25zIGlzIGFib3V0IHRvIGJlIHNjaGVkdWxlLiBUaGUgaGF6YXJkIHN0YXRlIHNob3VsZCBiZQorICAvLy8gc2V0IHRvIGFuIGluaXRpYWxpemVkIHN0YXRlLgorICB2aXJ0dWFsIHZvaWQgUmVzZXQoKSB7fQorCisgIC8vLyBFbWl0SW5zdHJ1Y3Rpb24gLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhbiBpbnN0cnVjdGlvbiBpcworICAvLy8gZW1pdHRlZCwgdG8gYWR2YW5jZSB0aGUgaGF6YXJkIHN0YXRlLgorICB2aXJ0dWFsIHZvaWQgRW1pdEluc3RydWN0aW9uKFNVbml0ICopIHt9CisKKyAgLy8vIFRoaXMgb3ZlcmxvYWQgd2lsbCBiZSB1c2VkIHdoZW4gdGhlIGhhemFyZCByZWNvZ25pemVyIGlzIGJlaW5nIHVzZWQKKyAgLy8vIGJ5IGEgbm9uLXNjaGVkdWxpbmcgcGFzcywgd2hpY2ggZG9lcyBub3QgdXNlIFNVbml0cy4KKyAgdmlydHVhbCB2b2lkIEVtaXRJbnN0cnVjdGlvbihNYWNoaW5lSW5zdHIgKikge30KKworICAvLy8gUHJlRW1pdE5vb3BzIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHByaW9yIHRvIGVtaXR0aW5nIGFuIGluc3RydWN0aW9uLgorICAvLy8gSXQgc2hvdWxkIHJldHVybiB0aGUgbnVtYmVyIG9mIG5vb3BzIHRvIGVtaXQgcHJpb3IgdG8gdGhlIHByb3ZpZGVkCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgLy8vIE5vdGU6IFRoaXMgaXMgb25seSB1c2VkIGR1cmluZyBQb3N0UkEgc2NoZWR1bGluZy4gRW1pdE5vb3AgaXMgbm90IGNhbGxlZAorICAvLy8gZm9yIHRoZXNlIG5vb3BzLgorICB2aXJ0dWFsIHVuc2lnbmVkIFByZUVtaXROb29wcyhTVW5pdCAqKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gVGhpcyBvdmVybG9hZCB3aWxsIGJlIHVzZWQgd2hlbiB0aGUgaGF6YXJkIHJlY29nbml6ZXIgaXMgYmVpbmcgdXNlZAorICAvLy8gYnkgYSBub24tc2NoZWR1bGluZyBwYXNzLCB3aGljaCBkb2VzIG5vdCB1c2UgU1VuaXRzLgorICB2aXJ0dWFsIHVuc2lnbmVkIFByZUVtaXROb29wcyhNYWNoaW5lSW5zdHIgKikgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIFNob3VsZFByZWZlckFub3RoZXIgLSBUaGlzIGNhbGxiYWNrIG1heSBiZSBpbnZva2VkIGlmIGdldEhhemFyZFR5cGUKKyAgLy8vIHJldHVybnMgTm9IYXphcmQuIElmLCBldmVuIHRob3VnaCB0aGVyZSBpcyBubyBoYXphcmQsIGl0IHdvdWxkIGJlIGJldHRlciB0bworICAvLy8gc2NoZWR1bGUgYW5vdGhlciBhdmFpbGFibGUgaW5zdHJ1Y3Rpb24sIHRoaXMgY2FsbGJhY2sgc2hvdWxkIHJldHVybiB0cnVlLgorICB2aXJ0dWFsIGJvb2wgU2hvdWxkUHJlZmVyQW5vdGhlcihTVW5pdCAqKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIEFkdmFuY2VDeWNsZSAtIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCB3aGVuZXZlciB0aGUgbmV4dCB0b3AtZG93bgorICAvLy8gaW5zdHJ1Y3Rpb24gdG8gYmUgc2NoZWR1bGVkIGNhbm5vdCBpc3N1ZSBpbiB0aGUgY3VycmVudCBjeWNsZSwgZWl0aGVyCisgIC8vLyBiZWNhdXNlIG9mIGxhdGVuY3kgb3IgcmVzb3VyY2UgY29uZmxpY3RzLiAgVGhpcyBzaG91bGQgaW5jcmVtZW50IHRoZQorICAvLy8gaW50ZXJuYWwgc3RhdGUgb2YgdGhlIGhhemFyZCByZWNvZ25pemVyIHNvIHRoYXQgcHJldmlvdXNseSAiSGF6YXJkIgorICAvLy8gaW5zdHJ1Y3Rpb25zIHdpbGwgbm93IG5vdCBiZSBoYXphcmRzLgorICB2aXJ0dWFsIHZvaWQgQWR2YW5jZUN5Y2xlKCkge30KKworICAvLy8gUmVjZWRlQ3ljbGUgLSBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbmV2ZXIgdGhlIG5leHQgYm90dG9tLXVwCisgIC8vLyBpbnN0cnVjdGlvbiB0byBiZSBzY2hlZHVsZWQgY2Fubm90IGlzc3VlIGluIHRoZSBjdXJyZW50IGN5Y2xlLCBlaXRoZXIKKyAgLy8vIGJlY2F1c2Ugb2YgbGF0ZW5jeSBvciByZXNvdXJjZSBjb25mbGljdHMuCisgIHZpcnR1YWwgdm9pZCBSZWNlZGVDeWNsZSgpIHt9CisKKyAgLy8vIEVtaXROb29wIC0gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIHdoZW4gYSBub29wIHdhcyBhZGRlZCB0byB0aGUKKyAgLy8vIGluc3RydWN0aW9uIHN0cmVhbS4KKyAgdmlydHVhbCB2b2lkIEVtaXROb29wKCkgeworICAgIC8vIERlZmF1bHQgaW1wbGVtZW50YXRpb246IGNvdW50IGl0IGFzIGEgY3ljbGUuCisgICAgQWR2YW5jZUN5Y2xlKCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fU0NIRURVTEVIQVpBUkRSRUNPR05JWkVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TY2hlZHVsZXJSZWdpc3RyeS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NjaGVkdWxlclJlZ2lzdHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFkZjkyNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TY2hlZHVsZXJSZWdpc3RyeS5oCkBAIC0wLDAgKzEsMTA1IEBACisvLz09PS0gbGx2bS9Db2RlR2VuL1NjaGVkdWxlclJlZ2lzdHJ5LmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gZm9yIGluc3RydWN0aW9uIHNjaGVkdWxlciBmdW5jdGlvbgorLy8gcGFzcyByZWdpc3RyeSAoUmVnaXN0ZXJTY2hlZHVsZXIpLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1NDSEVEVUxFUlJFR0lTVFJZX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1NDSEVEVUxFUlJFR0lTVFJZX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lUGFzc1JlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvZGVHZW4uaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gUmVnaXN0ZXJTY2hlZHVsZXIgY2xhc3MgLSBUcmFjayB0aGUgcmVnaXN0cmF0aW9uIG9mIGluc3RydWN0aW9uIHNjaGVkdWxlcnMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIFNjaGVkdWxlREFHU0ROb2RlczsKK2NsYXNzIFNlbGVjdGlvbkRBR0lTZWw7CisKK2NsYXNzIFJlZ2lzdGVyU2NoZWR1bGVyIDogcHVibGljIE1hY2hpbmVQYXNzUmVnaXN0cnlOb2RlIHsKK3B1YmxpYzoKKyAgdXNpbmcgRnVuY3Rpb25QYXNzQ3RvciA9IFNjaGVkdWxlREFHU0ROb2RlcyAqKCopKFNlbGVjdGlvbkRBR0lTZWwqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwpOworCisgIHN0YXRpYyBNYWNoaW5lUGFzc1JlZ2lzdHJ5IFJlZ2lzdHJ5OworCisgIFJlZ2lzdGVyU2NoZWR1bGVyKGNvbnN0IGNoYXIgKk4sIGNvbnN0IGNoYXIgKkQsIEZ1bmN0aW9uUGFzc0N0b3IgQykKKyAgOiBNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZShOLCBELCAoTWFjaGluZVBhc3NDdG9yKUMpCisgIHsgUmVnaXN0cnkuQWRkKHRoaXMpOyB9CisgIH5SZWdpc3RlclNjaGVkdWxlcigpIHsgUmVnaXN0cnkuUmVtb3ZlKHRoaXMpOyB9CisKKworICAvLyBBY2Nlc3NvcnMuCisgIFJlZ2lzdGVyU2NoZWR1bGVyICpnZXROZXh0KCkgY29uc3QgeworICAgIHJldHVybiAoUmVnaXN0ZXJTY2hlZHVsZXIgKilNYWNoaW5lUGFzc1JlZ2lzdHJ5Tm9kZTo6Z2V0TmV4dCgpOworICB9CisKKyAgc3RhdGljIFJlZ2lzdGVyU2NoZWR1bGVyICpnZXRMaXN0KCkgeworICAgIHJldHVybiAoUmVnaXN0ZXJTY2hlZHVsZXIgKilSZWdpc3RyeS5nZXRMaXN0KCk7CisgIH0KKworICBzdGF0aWMgdm9pZCBzZXRMaXN0ZW5lcihNYWNoaW5lUGFzc1JlZ2lzdHJ5TGlzdGVuZXIgKkwpIHsKKyAgICBSZWdpc3RyeS5zZXRMaXN0ZW5lcihMKTsKKyAgfQorfTsKKworLy8vIGNyZWF0ZUJVUlJMaXN0REFHU2NoZWR1bGVyIC0gVGhpcyBjcmVhdGVzIGEgYm90dG9tIHVwIHJlZ2lzdGVyIHVzYWdlCisvLy8gcmVkdWN0aW9uIGxpc3Qgc2NoZWR1bGVyLgorU2NoZWR1bGVEQUdTRE5vZGVzICpjcmVhdGVCVVJSTGlzdERBR1NjaGVkdWxlcihTZWxlY3Rpb25EQUdJU2VsICpJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpOworCisvLy8gY3JlYXRlQlVSUkxpc3REQUdTY2hlZHVsZXIgLSBUaGlzIGNyZWF0ZXMgYSBib3R0b20gdXAgbGlzdCBzY2hlZHVsZXIgdGhhdAorLy8vIHNjaGVkdWxlcyBub2RlcyBpbiBzb3VyY2UgY29kZSBvcmRlciB3aGVuIHBvc3NpYmxlLgorU2NoZWR1bGVEQUdTRE5vZGVzICpjcmVhdGVTb3VyY2VMaXN0REFHU2NoZWR1bGVyKFNlbGVjdGlvbkRBR0lTZWwgKklTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKTsKKworLy8vIGNyZWF0ZUh5YnJpZExpc3REQUdTY2hlZHVsZXIgLSBUaGlzIGNyZWF0ZXMgYSBib3R0b20gdXAgcmVnaXN0ZXIgcHJlc3N1cmUKKy8vLyBhd2FyZSBsaXN0IHNjaGVkdWxlciB0aGF0IG1ha2UgdXNlIG9mIGxhdGVuY3kgaW5mb3JtYXRpb24gdG8gYXZvaWQgc3RhbGxzCisvLy8gZm9yIGxvbmcgbGF0ZW5jeSBpbnN0cnVjdGlvbnMgaW4gbG93IHJlZ2lzdGVyIHByZXNzdXJlIG1vZGUuIEluIGhpZ2gKKy8vLyByZWdpc3RlciBwcmVzc3VyZSBtb2RlIGl0IHNjaGVkdWxlcyB0byByZWR1Y2UgcmVnaXN0ZXIgcHJlc3N1cmUuCitTY2hlZHVsZURBR1NETm9kZXMgKmNyZWF0ZUh5YnJpZExpc3REQUdTY2hlZHVsZXIoU2VsZWN0aW9uREFHSVNlbCAqSVMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwpOworCisvLy8gY3JlYXRlSUxQTGlzdERBR1NjaGVkdWxlciAtIFRoaXMgY3JlYXRlcyBhIGJvdHRvbSB1cCByZWdpc3RlciBwcmVzc3VyZQorLy8vIGF3YXJlIGxpc3Qgc2NoZWR1bGVyIHRoYXQgdHJpZXMgdG8gaW5jcmVhc2UgaW5zdHJ1Y3Rpb24gbGV2ZWwgcGFyYWxsZWxpc20KKy8vLyBpbiBsb3cgcmVnaXN0ZXIgcHJlc3N1cmUgbW9kZS4gSW4gaGlnaCByZWdpc3RlciBwcmVzc3VyZSBtb2RlIGl0IHNjaGVkdWxlcworLy8vIHRvIHJlZHVjZSByZWdpc3RlciBwcmVzc3VyZS4KK1NjaGVkdWxlREFHU0ROb2RlcyAqY3JlYXRlSUxQTGlzdERBR1NjaGVkdWxlcihTZWxlY3Rpb25EQUdJU2VsICpJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCk7CisKKy8vLyBjcmVhdGVGYXN0REFHU2NoZWR1bGVyIC0gVGhpcyBjcmVhdGVzIGEgImZhc3QiIHNjaGVkdWxlci4KKy8vLworU2NoZWR1bGVEQUdTRE5vZGVzICpjcmVhdGVGYXN0REFHU2NoZWR1bGVyKFNlbGVjdGlvbkRBR0lTZWwgKklTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKTsKKworLy8vIGNyZWF0ZVZMSVdEQUdTY2hlZHVsZXIgLSBTY2hlZHVsZXIgZm9yIFZMSVcgdGFyZ2V0cy4gVGhpcyBjcmVhdGVzIHRvcCBkb3duCisvLy8gREZBIGRyaXZlbiBsaXN0IHNjaGVkdWxlciB3aXRoIGNsdXN0ZXJpbmcgaGV1cmlzdGljIHRvIGNvbnRyb2wKKy8vLyByZWdpc3RlciBwcmVzc3VyZS4KK1NjaGVkdWxlREFHU0ROb2RlcyAqY3JlYXRlVkxJV0RBR1NjaGVkdWxlcihTZWxlY3Rpb25EQUdJU2VsICpJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7CisvLy8gY3JlYXRlRGVmYXVsdFNjaGVkdWxlciAtIFRoaXMgY3JlYXRlcyBhbiBpbnN0cnVjdGlvbiBzY2hlZHVsZXIgYXBwcm9wcmlhdGUKKy8vLyBmb3IgdGhlIHRhcmdldC4KK1NjaGVkdWxlREFHU0ROb2RlcyAqY3JlYXRlRGVmYXVsdFNjaGVkdWxlcihTZWxlY3Rpb25EQUdJU2VsICpJUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbCk7CisKKy8vLyBjcmVhdGVEQUdMaW5lYXJpemVyIC0gVGhpcyBjcmVhdGVzIGEgIm5vLXNjaGVkdWxpbmciIHNjaGVkdWxlciB3aGljaAorLy8vIGxpbmVhcml6ZSB0aGUgREFHIHVzaW5nIHRvcG9sb2dpY2FsIG9yZGVyLgorU2NoZWR1bGVEQUdTRE5vZGVzICpjcmVhdGVEQUdMaW5lYXJpemVyKFNlbGVjdGlvbkRBR0lTZWwgKklTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9TQ0hFRFVMRVJSRUdJU1RSWV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2NvcmVib2FyZEhhemFyZFJlY29nbml6ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TY29yZWJvYXJkSGF6YXJkUmVjb2duaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2NmFiNTMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2NvcmVib2FyZEhhemFyZFJlY29nbml6ZXIuaApAQCAtMCwwICsxLDEyOCBAQAorLy89LSBsbHZtL0NvZGVHZW4vU2NvcmVib2FyZEhhemFyZFJlY29nbml6ZXIuaCAtIFNjaGVkdWxlIFN1cHBvcnQgLSotIEMrKyAtKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgU2NvcmVib2FyZEhhemFyZFJlY29nbml6ZXIgY2xhc3MsIHdoaWNoCisvLyBlbmNhcHN1bGF0ZXMgaGF6YXJkLWF2b2lkYW5jZSBoZXVyaXN0aWNzIGZvciBzY2hlZHVsaW5nLCBiYXNlZCBvbiB0aGUKKy8vIHNjaGVkdWxpbmcgaXRpbmVyYXJpZXMgc3BlY2lmaWVkIGZvciB0aGUgdGFyZ2V0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1NDT1JFQk9BUkRIQVpBUkRSRUNPR05JWkVSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1NDT1JFQk9BUkRIQVpBUkRSRUNPR05JWkVSX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TY2hlZHVsZUhhemFyZFJlY29nbml6ZXIuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBJbnN0ckl0aW5lcmFyeURhdGE7CitjbGFzcyBTY2hlZHVsZURBRzsKK2NsYXNzIFNVbml0OworCitjbGFzcyBTY29yZWJvYXJkSGF6YXJkUmVjb2duaXplciA6IHB1YmxpYyBTY2hlZHVsZUhhemFyZFJlY29nbml6ZXIgeworICAvLyBTY29yZWJvYXJkIHRvIHRyYWNrIGZ1bmN0aW9uIHVuaXQgdXNhZ2UuIFNjb3JlYm9hcmRbMF0gaXMgYQorICAvLyBtYXNrIG9mIHRoZSBGVXMgaW4gdXNlIGluIHRoZSBjeWNsZSBjdXJyZW50bHkgYmVpbmcKKyAgLy8gc2NoZWR1bGUuIFNjb3JlYm9hcmRbMV0gaXMgYSBtYXNrIGZvciB0aGUgbmV4dCBjeWNsZS4gVGhlCisgIC8vIFNjb3JlYm9hcmQgaXMgdXNlZCBhcyBhIGNpcmN1bGFyIGJ1ZmZlciB3aXRoIHRoZSBjdXJyZW50IGN5Y2xlCisgIC8vIGluZGljYXRlZCBieSBIZWFkLgorICAvLworICAvLyBTY29yZWJvYXJkIGFsd2F5cyBjb3VudHMgY3ljbGVzIGluIGZvcndhcmQgZXhlY3V0aW9uIG9yZGVyLiBJZiB1c2VkIGJ5IGEKKyAgLy8gYm90dG9tLXVwIHNjaGVkdWxlciwgdGhlbiB0aGUgc2NvcmVib2FyZCBjeWNsZXMgYXJlIHRoZSBpbnZlcnNlIG9mIHRoZQorICAvLyBzY2hlZHVsZXIncyBjeWNsZXMuCisgIGNsYXNzIFNjb3JlYm9hcmQgeworICAgIHVuc2lnbmVkICpEYXRhID0gbnVsbHB0cjsKKworICAgIC8vIFRoZSBtYXhpbXVtIG51bWJlciBvZiBjeWNsZXMgbW9uaXRvcmVkIGJ5IHRoZSBTY29yZWJvYXJkLiBUaGlzCisgICAgLy8gdmFsdWUgaXMgZGV0ZXJtaW5lZCBiYXNlZCBvbiB0aGUgdGFyZ2V0IGl0aW5lcmFyaWVzIHRvIGVuc3VyZQorICAgIC8vIHRoYXQgYWxsIGhhemFyZHMgY2FuIGJlIHRyYWNrZWQuCisgICAgc2l6ZV90IERlcHRoID0gMDsKKworICAgIC8vIEluZGljZXMgaW50byB0aGUgU2NvcmVib2FyZCB0aGF0IHJlcHJlc2VudCB0aGUgY3VycmVudCBjeWNsZS4KKyAgICBzaXplX3QgSGVhZCA9IDA7CisKKyAgcHVibGljOgorICAgIFNjb3JlYm9hcmQoKSA9IGRlZmF1bHQ7CisKKyAgICB+U2NvcmVib2FyZCgpIHsKKyAgICAgIGRlbGV0ZVtdIERhdGE7CisgICAgfQorCisgICAgc2l6ZV90IGdldERlcHRoKCkgY29uc3QgeyByZXR1cm4gRGVwdGg7IH0KKworICAgIHVuc2lnbmVkJiBvcGVyYXRvcltdKHNpemVfdCBpZHgpIGNvbnN0IHsKKyAgICAgIC8vIERlcHRoIGlzIGV4cGVjdGVkIHRvIGJlIGEgcG93ZXItb2YtMi4KKyAgICAgIGFzc2VydChEZXB0aCAmJiAhKERlcHRoICYgKERlcHRoIC0gMSkpICYmCisgICAgICAgICAgICAgIlNjb3JlYm9hcmQgd2FzIG5vdCBpbml0aWFsaXplZCBwcm9wZXJseSEiKTsKKworICAgICAgcmV0dXJuIERhdGFbKEhlYWQgKyBpZHgpICYgKERlcHRoLTEpXTsKKyAgICB9CisKKyAgICB2b2lkIHJlc2V0KHNpemVfdCBkID0gMSkgeworICAgICAgaWYgKCFEYXRhKSB7CisgICAgICAgIERlcHRoID0gZDsKKyAgICAgICAgRGF0YSA9IG5ldyB1bnNpZ25lZFtEZXB0aF07CisgICAgICB9CisKKyAgICAgIG1lbXNldChEYXRhLCAwLCBEZXB0aCAqIHNpemVvZihEYXRhWzBdKSk7CisgICAgICBIZWFkID0gMDsKKyAgICB9CisKKyAgICB2b2lkIGFkdmFuY2UoKSB7CisgICAgICBIZWFkID0gKEhlYWQgKyAxKSAmIChEZXB0aC0xKTsKKyAgICB9CisKKyAgICB2b2lkIHJlY2VkZSgpIHsKKyAgICAgIEhlYWQgPSAoSGVhZCAtIDEpICYgKERlcHRoLTEpOworICAgIH0KKworICAgIC8vIFByaW50IHRoZSBzY29yZWJvYXJkLgorICAgIHZvaWQgZHVtcCgpIGNvbnN0OworICB9OworCisgIC8vIFN1cHBvcnQgZm9yIHRyYWNpbmcgU2NvcmVib2FyZEhhemFyZFJlY29nbml6ZXIgYXMgYSBjb21wb25lbnQgd2l0aGluCisgIC8vIGFub3RoZXIgbW9kdWxlLgorICBjb25zdCBjaGFyICpEZWJ1Z1R5cGU7CisKKyAgLy8gSXRpbmVyYXJ5IGRhdGEgZm9yIHRoZSB0YXJnZXQuCisgIGNvbnN0IEluc3RySXRpbmVyYXJ5RGF0YSAqSXRpbkRhdGE7CisKKyAgY29uc3QgU2NoZWR1bGVEQUcgKkRBRzsKKworICAvLy8gSXNzdWVXaWR0aCAtIE1heCBpc3N1ZSBwZXIgY3ljbGUuIDA9VW5rbm93bi4KKyAgdW5zaWduZWQgSXNzdWVXaWR0aCA9IDA7CisKKyAgLy8vIElzc3VlQ291bnQgLSBDb3VudCBpbnN0cnVjdGlvbnMgaXNzdWVkIGluIHRoaXMgY3ljbGUuCisgIHVuc2lnbmVkIElzc3VlQ291bnQgPSAwOworCisgIFNjb3JlYm9hcmQgUmVzZXJ2ZWRTY29yZWJvYXJkOworICBTY29yZWJvYXJkIFJlcXVpcmVkU2NvcmVib2FyZDsKKworcHVibGljOgorICBTY29yZWJvYXJkSGF6YXJkUmVjb2duaXplcihjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEgKkl0aW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTY2hlZHVsZURBRyAqREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpQYXJlbnREZWJ1Z1R5cGUgPSAiIik7CisKKyAgLy8vIGF0SXNzdWVMaW1pdCAtIFJldHVybiB0cnVlIGlmIG5vIG1vcmUgaW5zdHJ1Y3Rpb25zIG1heSBiZSBpc3N1ZWQgaW4gdGhpcworICAvLy8gY3ljbGUuCisgIGJvb2wgYXRJc3N1ZUxpbWl0KCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8gU3RhbGxzIHByb3ZpZGVzIGFuIGN5Y2xlIG9mZnNldCBhdCB3aGljaCBTVSB3aWxsIGJlIHNjaGVkdWxlZC4gSXQgd2lsbCBiZQorICAvLyBuZWdhdGl2ZSBmb3IgYm90dG9tLXVwIHNjaGVkdWxpbmcuCisgIEhhemFyZFR5cGUgZ2V0SGF6YXJkVHlwZShTVW5pdCAqU1UsIGludCBTdGFsbHMpIG92ZXJyaWRlOworICB2b2lkIFJlc2V0KCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdEluc3RydWN0aW9uKFNVbml0ICpTVSkgb3ZlcnJpZGU7CisgIHZvaWQgQWR2YW5jZUN5Y2xlKCkgb3ZlcnJpZGU7CisgIHZvaWQgUmVjZWRlQ3ljbGUoKSBvdmVycmlkZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fU0NPUkVCT0FSREhBWkFSRFJFQ09HTklaRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmNDNjOWIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgKQEAgLTAsMCArMSwxNjExIEBACisvLz09PS0gbGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBRy5oIC0gSW5zdFNlbGVjdGlvbiBEQUcgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgU2VsZWN0aW9uREFHIGNsYXNzLCBhbmQgdHJhbnNpdGl2ZWx5IGRlZmluZXMgdGhlCisvLyBTRE5vZGUgY2xhc3MgYW5kIHN1YmNsYXNzZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fU0VMRUNUSU9OREFHX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1NFTEVDVElPTkRBR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEZsb2F0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU2V0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0RpdmVyZ2VuY2VBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9EQUdDb21iaW5lLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0Z1bmN0aW9uTG93ZXJpbmdJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL0lTRE9wY29kZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVNZW1PcGVyYW5kLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR05vZGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RlYnVnTG9jLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01ldGFkYXRhLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BcnJheVJlY3ljbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0F0b21pY09yZGVyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29kZUdlbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hY2hpbmVWYWx1ZVR5cGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUmVjeWNsaW5nQWxsb2NhdG9yLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmxvY2tBZGRyZXNzOworY2xhc3MgQ29uc3RhbnQ7CitjbGFzcyBDb25zdGFudEZQOworY2xhc3MgQ29uc3RhbnRJbnQ7CitjbGFzcyBEYXRhTGF5b3V0Oworc3RydWN0IGZsdFNlbWFudGljczsKK2NsYXNzIEdsb2JhbFZhbHVlOworc3RydWN0IEtub3duQml0czsKK2NsYXNzIExMVk1Db250ZXh0OworY2xhc3MgTWFjaGluZUJhc2ljQmxvY2s7CitjbGFzcyBNYWNoaW5lQ29uc3RhbnRQb29sVmFsdWU7CitjbGFzcyBNQ1N5bWJvbDsKK2NsYXNzIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXI7CitjbGFzcyBTRERiZ1ZhbHVlOworY2xhc3MgU2VsZWN0aW9uREFHOworY2xhc3MgU2VsZWN0aW9uREFHVGFyZ2V0SW5mbzsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworY2xhc3MgVGFyZ2V0TG93ZXJpbmc7CitjbGFzcyBUYXJnZXRNYWNoaW5lOworY2xhc3MgVGFyZ2V0U3VidGFyZ2V0SW5mbzsKK2NsYXNzIFZhbHVlOworCitjbGFzcyBTRFZUTGlzdE5vZGUgOiBwdWJsaWMgRm9sZGluZ1NldE5vZGUgeworICBmcmllbmQgc3RydWN0IEZvbGRpbmdTZXRUcmFpdDxTRFZUTGlzdE5vZGU+OworCisgIC8vLyBBIHJlZmVyZW5jZSB0byBhbiBJbnRlcm5lZCBGb2xkaW5nU2V0Tm9kZUlEIGZvciB0aGlzIG5vZGUuCisgIC8vLyBUaGUgQWxsb2NhdG9yIGluIFNlbGVjdGlvbkRBRyBob2xkcyB0aGUgZGF0YS4KKyAgLy8vIFNEVlRMaXN0IGNvbnRhaW5zIGFsbCB0eXBlcyB3aGljaCBhcmUgZnJlcXVlbnRseSBhY2Nlc3NlZCBpbiBTZWxlY3Rpb25EQUcuCisgIC8vLyBUaGUgc2l6ZSBvZiB0aGlzIGxpc3QgaXMgbm90IGV4cGVjdGVkIHRvIGJlIGJpZyBzbyBpdCB3b24ndCBpbnRyb2R1Y2UKKyAgLy8vIGEgbWVtb3J5IHBlbmFsdHkuCisgIEZvbGRpbmdTZXROb2RlSURSZWYgRmFzdElEOworICBjb25zdCBFVlQgKlZUczsKKyAgdW5zaWduZWQgaW50IE51bVZUczsKKyAgLy8vIFRoZSBoYXNoIHZhbHVlIGZvciBTRFZUTGlzdCBpcyBmaXhlZCwgc28gY2FjaGUgaXQgdG8gYXZvaWQKKyAgLy8vIGhhc2ggY2FsY3VsYXRpb24uCisgIHVuc2lnbmVkIEhhc2hWYWx1ZTsKKworcHVibGljOgorICBTRFZUTGlzdE5vZGUoY29uc3QgRm9sZGluZ1NldE5vZGVJRFJlZiBJRCwgY29uc3QgRVZUICpWVCwgdW5zaWduZWQgaW50IE51bSkgOgorICAgICAgRmFzdElEKElEKSwgVlRzKFZUKSwgTnVtVlRzKE51bSkgeworICAgIEhhc2hWYWx1ZSA9IElELkNvbXB1dGVIYXNoKCk7CisgIH0KKworICBTRFZUTGlzdCBnZXRTRFZUTGlzdCgpIHsKKyAgICBTRFZUTGlzdCByZXN1bHQgPSB7VlRzLCBOdW1WVHN9OworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK307CisKKy8vLyBTcGVjaWFsaXplIEZvbGRpbmdTZXRUcmFpdCBmb3IgU0RWVExpc3ROb2RlCisvLy8gdG8gYXZvaWQgY29tcHV0aW5nIHRlbXAgRm9sZGluZ1NldE5vZGVJRCBhbmQgaGFzaCB2YWx1ZS4KK3RlbXBsYXRlPD4gc3RydWN0IEZvbGRpbmdTZXRUcmFpdDxTRFZUTGlzdE5vZGU+IDogRGVmYXVsdEZvbGRpbmdTZXRUcmFpdDxTRFZUTGlzdE5vZGU+IHsKKyAgc3RhdGljIHZvaWQgUHJvZmlsZShjb25zdCBTRFZUTGlzdE5vZGUgJlgsIEZvbGRpbmdTZXROb2RlSUQmIElEKSB7CisgICAgSUQgPSBYLkZhc3RJRDsKKyAgfQorCisgIHN0YXRpYyBib29sIEVxdWFscyhjb25zdCBTRFZUTGlzdE5vZGUgJlgsIGNvbnN0IEZvbGRpbmdTZXROb2RlSUQgJklELAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSURIYXNoLCBGb2xkaW5nU2V0Tm9kZUlEICZUZW1wSUQpIHsKKyAgICBpZiAoWC5IYXNoVmFsdWUgIT0gSURIYXNoKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBJRCA9PSBYLkZhc3RJRDsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBDb21wdXRlSGFzaChjb25zdCBTRFZUTGlzdE5vZGUgJlgsIEZvbGRpbmdTZXROb2RlSUQgJlRlbXBJRCkgeworICAgIHJldHVybiBYLkhhc2hWYWx1ZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlsaXN0X2FsbG9jX3RyYWl0czxTRE5vZGU+IHsKKyAgc3RhdGljIHZvaWQgZGVsZXRlTm9kZShTRE5vZGUgKikgeworICAgIGxsdm1fdW5yZWFjaGFibGUoImlsaXN0X3RyYWl0czxTRE5vZGU+IHNob3VsZG4ndCBzZWUgYSBkZWxldGVOb2RlIGNhbGwhIik7CisgIH0KK307CisKKy8vLyBLZWVwcyB0cmFjayBvZiBkYmdfdmFsdWUgaW5mb3JtYXRpb24gdGhyb3VnaCBTRElTZWwuICBXZSBkbworLy8vIG5vdCBidWlsZCBTRE5vZGVzIGZvciB0aGVzZSBzbyBhcyBub3QgdG8gcGVydHVyYiB0aGUgZ2VuZXJhdGVkIGNvZGU7CisvLy8gaW5zdGVhZCB0aGUgaW5mbyBpcyBrZXB0IG9mZiB0byB0aGUgc2lkZSBpbiB0aGlzIHN0cnVjdHVyZS4gRWFjaCBTRE5vZGUgbWF5CisvLy8gaGF2ZSBvbmUgb3IgbW9yZSBhc3NvY2lhdGVkIGRiZ192YWx1ZSBlbnRyaWVzLiBUaGlzIGluZm9ybWF0aW9uIGlzIGtlcHQgaW4KKy8vLyBEYmdWYWxNYXAuCisvLy8gQnl2YWwgcGFyYW1ldGVycyBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5IGJlY2F1c2UgdGhleSBkb24ndCB1c2UgYWxsb2NhJ3MsCisvLy8gd2hpY2ggYnVzdHMgdGhlIG5vcm1hbCBtZWNoYW5pc20uICBUaGVyZSBpcyBnb29kIHJlYXNvbiBmb3IgaGFuZGxpbmcgYWxsCisvLy8gcGFyYW1ldGVycyBzZXBhcmF0ZWx5OiAgdGhleSBtYXkgbm90IGhhdmUgY29kZSBnZW5lcmF0ZWQgZm9yIHRoZW0sIHRoZXkKKy8vLyBzaG91bGQgYWx3YXlzIGdvIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZ1bmN0aW9uIHJlZ2FyZGxlc3Mgb2Ygb3RoZXIgY29kZQorLy8vIG1vdGlvbiwgYW5kIGRlYnVnIGluZm8gZm9yIHRoZW0gaXMgcG90ZW50aWFsbHkgdXNlZnVsIGV2ZW4gaWYgdGhlIHBhcmFtZXRlcgorLy8vIGlzIHVudXNlZC4gIFJpZ2h0IG5vdyBvbmx5IGJ5dmFsIHBhcmFtZXRlcnMgYXJlIGhhbmRsZWQgc2VwYXJhdGVseS4KK2NsYXNzIFNERGJnSW5mbyB7CisgIEJ1bXBQdHJBbGxvY2F0b3IgQWxsb2M7CisgIFNtYWxsVmVjdG9yPFNERGJnVmFsdWUqLCAzMj4gRGJnVmFsdWVzOworICBTbWFsbFZlY3RvcjxTRERiZ1ZhbHVlKiwgMzI+IEJ5dmFsUGFybURiZ1ZhbHVlczsKKyAgdXNpbmcgRGJnVmFsTWFwVHlwZSA9IERlbnNlTWFwPGNvbnN0IFNETm9kZSAqLCBTbWFsbFZlY3RvcjxTRERiZ1ZhbHVlICosIDI+PjsKKyAgRGJnVmFsTWFwVHlwZSBEYmdWYWxNYXA7CisKK3B1YmxpYzoKKyAgU0REYmdJbmZvKCkgPSBkZWZhdWx0OworICBTRERiZ0luZm8oY29uc3QgU0REYmdJbmZvICYpID0gZGVsZXRlOworICBTRERiZ0luZm8gJm9wZXJhdG9yPShjb25zdCBTRERiZ0luZm8gJikgPSBkZWxldGU7CisKKyAgdm9pZCBhZGQoU0REYmdWYWx1ZSAqViwgY29uc3QgU0ROb2RlICpOb2RlLCBib29sIGlzUGFyYW1ldGVyKSB7CisgICAgaWYgKGlzUGFyYW1ldGVyKSB7CisgICAgICBCeXZhbFBhcm1EYmdWYWx1ZXMucHVzaF9iYWNrKFYpOworICAgIH0gZWxzZSAgICAgRGJnVmFsdWVzLnB1c2hfYmFjayhWKTsKKyAgICBpZiAoTm9kZSkKKyAgICAgIERiZ1ZhbE1hcFtOb2RlXS5wdXNoX2JhY2soVik7CisgIH0KKworICAvLy8gXGJyaWVmIEludmFsaWRhdGUgYWxsIERiZ1ZhbHVlcyBhdHRhY2hlZCB0byB0aGUgbm9kZSBhbmQgcmVtb3ZlCisgIC8vLyBpdCBmcm9tIHRoZSBOb2RlLXRvLURiZ1ZhbHVlcyBtYXAuCisgIHZvaWQgZXJhc2UoY29uc3QgU0ROb2RlICpOb2RlKTsKKworICB2b2lkIGNsZWFyKCkgeworICAgIERiZ1ZhbE1hcC5jbGVhcigpOworICAgIERiZ1ZhbHVlcy5jbGVhcigpOworICAgIEJ5dmFsUGFybURiZ1ZhbHVlcy5jbGVhcigpOworICAgIEFsbG9jLlJlc2V0KCk7CisgIH0KKworICBCdW1wUHRyQWxsb2NhdG9yICZnZXRBbGxvYygpIHsgcmV0dXJuIEFsbG9jOyB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRGJnVmFsdWVzLmVtcHR5KCkgJiYgQnl2YWxQYXJtRGJnVmFsdWVzLmVtcHR5KCk7CisgIH0KKworICBBcnJheVJlZjxTRERiZ1ZhbHVlKj4gZ2V0U0REYmdWYWx1ZXMoY29uc3QgU0ROb2RlICpOb2RlKSB7CisgICAgRGJnVmFsTWFwVHlwZTo6aXRlcmF0b3IgSSA9IERiZ1ZhbE1hcC5maW5kKE5vZGUpOworICAgIGlmIChJICE9IERiZ1ZhbE1hcC5lbmQoKSkKKyAgICAgIHJldHVybiBJLT5zZWNvbmQ7CisgICAgcmV0dXJuIEFycmF5UmVmPFNERGJnVmFsdWUqPigpOworICB9CisKKyAgdXNpbmcgRGJnSXRlcmF0b3IgPSBTbWFsbFZlY3RvckltcGw8U0REYmdWYWx1ZSo+OjppdGVyYXRvcjsKKworICBEYmdJdGVyYXRvciBEYmdCZWdpbigpIHsgcmV0dXJuIERiZ1ZhbHVlcy5iZWdpbigpOyB9CisgIERiZ0l0ZXJhdG9yIERiZ0VuZCgpICAgeyByZXR1cm4gRGJnVmFsdWVzLmVuZCgpOyB9CisgIERiZ0l0ZXJhdG9yIEJ5dmFsUGFybURiZ0JlZ2luKCkgeyByZXR1cm4gQnl2YWxQYXJtRGJnVmFsdWVzLmJlZ2luKCk7IH0KKyAgRGJnSXRlcmF0b3IgQnl2YWxQYXJtRGJnRW5kKCkgICB7IHJldHVybiBCeXZhbFBhcm1EYmdWYWx1ZXMuZW5kKCk7IH0KK307CisKK3ZvaWQgY2hlY2tGb3JDeWNsZXMoY29uc3QgU2VsZWN0aW9uREFHICpEQUcsIGJvb2wgZm9yY2UgPSBmYWxzZSk7CisKKy8vLyBUaGlzIGlzIHVzZWQgdG8gcmVwcmVzZW50IGEgcG9ydGlvbiBvZiBhbiBMTFZNIGZ1bmN0aW9uIGluIGEgbG93LWxldmVsCisvLy8gRGF0YSBEZXBlbmRlbmNlIERBRyByZXByZXNlbnRhdGlvbiBzdWl0YWJsZSBmb3IgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uLgorLy8vIFRoaXMgREFHIGlzIGNvbnN0cnVjdGVkIGFzIHRoZSBmaXJzdCBzdGVwIG9mIGluc3RydWN0aW9uIHNlbGVjdGlvbiBpbiBvcmRlcgorLy8vIHRvIGFsbG93IGltcGxlbWVudGF0aW9uIG9mIG1hY2hpbmUgc3BlY2lmaWMgb3B0aW1pemF0aW9ucworLy8vIGFuZCBjb2RlIHNpbXBsaWZpY2F0aW9ucy4KKy8vLworLy8vIFRoZSByZXByZXNlbnRhdGlvbiB1c2VkIGJ5IHRoZSBTZWxlY3Rpb25EQUcgaXMgYSB0YXJnZXQtaW5kZXBlbmRlbnQKKy8vLyByZXByZXNlbnRhdGlvbiwgd2hpY2ggaGFzIHNvbWUgc2ltaWxhcml0aWVzIHRvIHRoZSBHQ0MgUlRMIHJlcHJlc2VudGF0aW9uLAorLy8vIGJ1dCBpcyBzaWduaWZpY2FudGx5IG1vcmUgc2ltcGxlLCBwb3dlcmZ1bCwgYW5kIGlzIGEgZ3JhcGggZm9ybSBpbnN0ZWFkIG9mIGEKKy8vLyBsaW5lYXIgZm9ybS4KKy8vLworY2xhc3MgU2VsZWN0aW9uREFHIHsKKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE07CisgIGNvbnN0IFNlbGVjdGlvbkRBR1RhcmdldEluZm8gKlRTSSA9IG51bGxwdHI7CisgIGNvbnN0IFRhcmdldExvd2VyaW5nICpUTEkgPSBudWxscHRyOworICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqTGliSW5mbyA9IG51bGxwdHI7CisgIE1hY2hpbmVGdW5jdGlvbiAqTUY7CisgIFBhc3MgKlNEQUdJU2VsUGFzcyA9IG51bGxwdHI7CisgIExMVk1Db250ZXh0ICpDb250ZXh0OworICBDb2RlR2VuT3B0OjpMZXZlbCBPcHRMZXZlbDsKKworICBEaXZlcmdlbmNlQW5hbHlzaXMgKiBEQSA9IG51bGxwdHI7CisgIEZ1bmN0aW9uTG93ZXJpbmdJbmZvICogRkxJID0gbnVsbHB0cjsKKworICAvLy8gVGhlIGZ1bmN0aW9uLWxldmVsIG9wdGltaXphdGlvbiByZW1hcmsgZW1pdHRlci4gIFVzZWQgdG8gZW1pdCByZW1hcmtzCisgIC8vLyB3aGVuZXZlciBtYW5pcHVsYXRpbmcgdGhlIERBRy4KKyAgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciAqT1JFOworCisgIC8vLyBUaGUgc3RhcnRpbmcgdG9rZW4uCisgIFNETm9kZSBFbnRyeU5vZGU7CisKKyAgLy8vIFRoZSByb290IG9mIHRoZSBlbnRpcmUgREFHLgorICBTRFZhbHVlIFJvb3Q7CisKKyAgLy8vIEEgbGlua2VkIGxpc3Qgb2Ygbm9kZXMgaW4gdGhlIGN1cnJlbnQgREFHLgorICBpbGlzdDxTRE5vZGU+IEFsbE5vZGVzOworCisgIC8vLyBUaGUgQWxsb2NhdG9yVHlwZSBmb3IgYWxsb2NhdGluZyBTRE5vZGVzLiBXZSB1c2UKKyAgLy8vIHBvb2wgYWxsb2NhdGlvbiB3aXRoIHJlY3ljbGluZy4KKyAgdXNpbmcgTm9kZUFsbG9jYXRvclR5cGUgPSBSZWN5Y2xpbmdBbGxvY2F0b3I8QnVtcFB0ckFsbG9jYXRvciwgU0ROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoTGFyZ2VzdFNETm9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWdub2YoTW9zdEFsaWduZWRTRE5vZGUpPjsKKworICAvLy8gUG9vbCBhbGxvY2F0aW9uIGZvciBub2Rlcy4KKyAgTm9kZUFsbG9jYXRvclR5cGUgTm9kZUFsbG9jYXRvcjsKKworICAvLy8gVGhpcyBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBtZW1vaXplIG5vZGVzLCBhdXRvbWF0aWNhbGx5IHBlcmZvcm1pbmcKKyAgLy8vIENTRSB3aXRoIGV4aXN0aW5nIG5vZGVzIHdoZW4gYSBkdXBsaWNhdGUgaXMgcmVxdWVzdGVkLgorICBGb2xkaW5nU2V0PFNETm9kZT4gQ1NFTWFwOworCisgIC8vLyBQb29sIGFsbG9jYXRpb24gZm9yIG1hY2hpbmUtb3Bjb2RlIFNETm9kZSBvcGVyYW5kcy4KKyAgQnVtcFB0ckFsbG9jYXRvciBPcGVyYW5kQWxsb2NhdG9yOworICBBcnJheVJlY3ljbGVyPFNEVXNlPiBPcGVyYW5kUmVjeWNsZXI7CisKKyAgLy8vIFBvb2wgYWxsb2NhdGlvbiBmb3IgbWlzYy4gb2JqZWN0cyB0aGF0IGFyZSBjcmVhdGVkIG9uY2UgcGVyIFNlbGVjdGlvbkRBRy4KKyAgQnVtcFB0ckFsbG9jYXRvciBBbGxvY2F0b3I7CisKKyAgLy8vIFRyYWNrcyBkYmdfdmFsdWUgaW5mb3JtYXRpb24gdGhyb3VnaCBTRElTZWwuCisgIFNERGJnSW5mbyAqRGJnSW5mbzsKKworICB1aW50MTZfdCBOZXh0UGVyc2lzdGVudElkID0gMDsKKworcHVibGljOgorICAvLy8gQ2xpZW50cyBvZiB2YXJpb3VzIEFQSXMgdGhhdCBjYXVzZSBnbG9iYWwgZWZmZWN0cyBvbgorICAvLy8gdGhlIERBRyBjYW4gb3B0aW9uYWxseSBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuICBUaGlzIGFsbG93cyB0aGUgY2xpZW50cworICAvLy8gdG8gaGFuZGxlIHRoZSB2YXJpb3VzIHNvcnRzIG9mIHVwZGF0ZXMgdGhhdCBoYXBwZW4uCisgIC8vLworICAvLy8gQSBEQUdVcGRhdGVMaXN0ZW5lciBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVycyBpdHNlbGYgd2l0aCBEQUcgd2hlbiBpdCBpcworICAvLy8gY29uc3RydWN0ZWQsIGFuZCByZW1vdmVzIGl0c2VsZiB3aGVuIGRlc3Ryb3llZCBpbiBSQUlJIGZhc2hpb24uCisgIHN0cnVjdCBEQUdVcGRhdGVMaXN0ZW5lciB7CisgICAgREFHVXBkYXRlTGlzdGVuZXIgKmNvbnN0IE5leHQ7CisgICAgU2VsZWN0aW9uREFHICZEQUc7CisKKyAgICBleHBsaWNpdCBEQUdVcGRhdGVMaXN0ZW5lcihTZWxlY3Rpb25EQUcgJkQpCisgICAgICA6IE5leHQoRC5VcGRhdGVMaXN0ZW5lcnMpLCBEQUcoRCkgeworICAgICAgREFHLlVwZGF0ZUxpc3RlbmVycyA9IHRoaXM7CisgICAgfQorCisgICAgdmlydHVhbCB+REFHVXBkYXRlTGlzdGVuZXIoKSB7CisgICAgICBhc3NlcnQoREFHLlVwZGF0ZUxpc3RlbmVycyA9PSB0aGlzICYmCisgICAgICAgICAgICAgIkRBR1VwZGF0ZUxpc3RlbmVycyBtdXN0IGJlIGRlc3Ryb3llZCBpbiBMSUZPIG9yZGVyIik7CisgICAgICBEQUcuVXBkYXRlTGlzdGVuZXJzID0gTmV4dDsKKyAgICB9CisKKyAgICAvLy8gVGhlIG5vZGUgTiB0aGF0IHdhcyBkZWxldGVkIGFuZCwgaWYgRSBpcyBub3QgbnVsbCwgYW4KKyAgICAvLy8gZXF1aXZhbGVudCBub2RlIEUgdGhhdCByZXBsYWNlZCBpdC4KKyAgICB2aXJ0dWFsIHZvaWQgTm9kZURlbGV0ZWQoU0ROb2RlICpOLCBTRE5vZGUgKkUpOworCisgICAgLy8vIFRoZSBub2RlIE4gdGhhdCB3YXMgdXBkYXRlZC4KKyAgICB2aXJ0dWFsIHZvaWQgTm9kZVVwZGF0ZWQoU0ROb2RlICpOKTsKKyAgfTsKKworICBzdHJ1Y3QgREFHTm9kZURlbGV0ZWRMaXN0ZW5lciA6IHB1YmxpYyBEQUdVcGRhdGVMaXN0ZW5lciB7CisgICAgc3RkOjpmdW5jdGlvbjx2b2lkKFNETm9kZSAqLCBTRE5vZGUgKik+IENhbGxiYWNrOworCisgICAgREFHTm9kZURlbGV0ZWRMaXN0ZW5lcihTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChTRE5vZGUgKiwgU0ROb2RlICopPiBDYWxsYmFjaykKKyAgICAgICAgOiBEQUdVcGRhdGVMaXN0ZW5lcihEQUcpLCBDYWxsYmFjayhzdGQ6Om1vdmUoQ2FsbGJhY2spKSB7fQorCisgICAgdm9pZCBOb2RlRGVsZXRlZChTRE5vZGUgKk4sIFNETm9kZSAqRSkgb3ZlcnJpZGUgeyBDYWxsYmFjayhOLCBFKTsgfQorICB9OworCisgIC8vLyBXaGVuIHRydWUsIGFkZGl0aW9uYWwgc3RlcHMgYXJlIHRha2VuIHRvCisgIC8vLyBlbnN1cmUgdGhhdCBnZXRDb25zdGFudCgpIGFuZCBzaW1pbGFyIGZ1bmN0aW9ucyByZXR1cm4gREFHIG5vZGVzIHRoYXQKKyAgLy8vIGhhdmUgbGVnYWwgdHlwZXMuIFRoaXMgaXMgaW1wb3J0YW50IGFmdGVyIHR5cGUgbGVnYWxpemF0aW9uIHNpbmNlCisgIC8vLyBhbnkgaWxsZWdhbGx5IHR5cGVkIG5vZGVzIGdlbmVyYXRlZCBhZnRlciB0aGlzIHBvaW50IHdpbGwgbm90IGV4cGVyaWVuY2UKKyAgLy8vIHR5cGUgbGVnYWxpemF0aW9uLgorICBib29sIE5ld05vZGVzTXVzdEhhdmVMZWdhbFR5cGVzID0gZmFsc2U7CisKK3ByaXZhdGU6CisgIC8vLyBEQUdVcGRhdGVMaXN0ZW5lciBpcyBhIGZyaWVuZCBzbyBpdCBjYW4gbWFuaXB1bGF0ZSB0aGUgbGlzdGVuZXIgc3RhY2suCisgIGZyaWVuZCBzdHJ1Y3QgREFHVXBkYXRlTGlzdGVuZXI7CisKKyAgLy8vIExpbmtlZCBsaXN0IG9mIHJlZ2lzdGVyZWQgREFHVXBkYXRlTGlzdGVuZXIgaW5zdGFuY2VzLgorICAvLy8gVGhpcyBzdGFjayBpcyBtYWludGFpbmVkIGJ5IERBR1VwZGF0ZUxpc3RlbmVyIFJBSUkuCisgIERBR1VwZGF0ZUxpc3RlbmVyICpVcGRhdGVMaXN0ZW5lcnMgPSBudWxscHRyOworCisgIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiBzZXRTdWJncmFwaENvbG9yLgorICAvLy8gUmV0dXJuIHdoZXRoZXIgd2UgaGFkIHRvIHRydW5jYXRlIHRoZSBzZWFyY2guCisgIGJvb2wgc2V0U3ViZ3JhcGhDb2xvckhlbHBlcihTRE5vZGUgKk4sIGNvbnN0IGNoYXIgKkNvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VTZXQ8U0ROb2RlICo+ICZ2aXNpdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxldmVsLCBib29sICZwcmludGVkKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU0ROb2RlVCwgdHlwZW5hbWUuLi4gQXJnVHlwZXM+CisgIFNETm9kZVQgKm5ld1NETm9kZShBcmdUeXBlcyAmJi4uLiBBcmdzKSB7CisgICAgcmV0dXJuIG5ldyAoTm9kZUFsbG9jYXRvci50ZW1wbGF0ZSBBbGxvY2F0ZTxTRE5vZGVUPigpKQorICAgICAgICBTRE5vZGVUKHN0ZDo6Zm9yd2FyZDxBcmdUeXBlcz4oQXJncykuLi4pOworICB9CisKKyAgLy8vIEJ1aWxkIGEgc3ludGhldGljIFNETm9kZVQgd2l0aCB0aGUgZ2l2ZW4gYXJncyBhbmQgZXh0cmFjdCBpdHMgc3ViY2xhc3MKKyAgLy8vIGRhdGEgYXMgYW4gaW50ZWdlciAoZS5nLiBmb3IgdXNlIGluIGEgZm9sZGluZyBzZXQpLgorICAvLy8KKyAgLy8vIFRoZSBhcmdzIHRvIHRoaXMgZnVuY3Rpb24gYXJlIHRoZSBzYW1lIGFzIHRoZSBhcmdzIHRvIFNETm9kZVQncworICAvLy8gY29uc3RydWN0b3IsIGV4Y2VwdCB0aGUgc2Vjb25kIGFyZyAoYXNzdW1lZCB0byBiZSBhIGNvbnN0IERlYnVnTG9jJikgaXMKKyAgLy8vIG9taXR0ZWQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTRE5vZGVULCB0eXBlbmFtZS4uLiBBcmdUeXBlcz4KKyAgc3RhdGljIHVpbnQxNl90IGdldFN5bnRoZXRpY05vZGVTdWJjbGFzc0RhdGEodW5zaWduZWQgSVJPcmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnVHlwZXMgJiYuLi4gQXJncykgeworICAgIC8vIFRoZSBjb21waWxlciBjYW4gcmVkdWNlIHRoaXMgZXhwcmVzc2lvbiB0byBhIGNvbnN0YW50IGlmZiB3ZSBwYXNzIGFuCisgICAgLy8gZW1wdHkgRGVidWdMb2MuICBUaGFua2Z1bGx5LCB0aGUgZGVidWcgbG9jYXRpb24gZG9lc24ndCBoYXZlIGFueSBiZWFyaW5nCisgICAgLy8gb24gdGhlIHN1YmNsYXNzIGRhdGEuCisgICAgcmV0dXJuIFNETm9kZVQoSVJPcmRlciwgRGVidWdMb2MoKSwgc3RkOjpmb3J3YXJkPEFyZ1R5cGVzPihBcmdzKS4uLikKKyAgICAgICAgLmdldFJhd1N1YmNsYXNzRGF0YSgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFNETm9kZVR5PgorICBzdGF0aWMgdWludDE2X3QgZ2V0U3ludGhldGljTm9kZVN1YmNsYXNzRGF0YSh1bnNpZ25lZCBPcGMsIHVuc2lnbmVkIE9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWVExpc3QgVlRzLCBFVlQgTWVtb3J5VlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKSB7CisgICAgcmV0dXJuIFNETm9kZVR5KE9wYywgT3JkZXIsIERlYnVnTG9jKCksIFZUcywgTWVtb3J5VlQsIE1NTykKKyAgICAgICAgIC5nZXRSYXdTdWJjbGFzc0RhdGEoKTsKKyAgfQorCisgIHZvaWQgY3JlYXRlT3BlcmFuZHMoU0ROb2RlICpOb2RlLCBBcnJheVJlZjxTRFZhbHVlPiBWYWxzKTsKKworICB2b2lkIHJlbW92ZU9wZXJhbmRzKFNETm9kZSAqTm9kZSkgeworICAgIGlmICghTm9kZS0+T3BlcmFuZExpc3QpCisgICAgICByZXR1cm47CisgICAgT3BlcmFuZFJlY3ljbGVyLmRlYWxsb2NhdGUoCisgICAgICAgIEFycmF5UmVjeWNsZXI8U0RVc2U+OjpDYXBhY2l0eTo6Z2V0KE5vZGUtPk51bU9wZXJhbmRzKSwKKyAgICAgICAgTm9kZS0+T3BlcmFuZExpc3QpOworICAgIE5vZGUtPk51bU9wZXJhbmRzID0gMDsKKyAgICBOb2RlLT5PcGVyYW5kTGlzdCA9IG51bGxwdHI7CisgIH0KKyAgdm9pZCBDcmVhdGVUb3BvbG9naWNhbE9yZGVyKHN0ZDo6dmVjdG9yPFNETm9kZSo+JiBPcmRlcik7CitwdWJsaWM6CisgIGV4cGxpY2l0IFNlbGVjdGlvbkRBRyhjb25zdCBUYXJnZXRNYWNoaW5lICZUTSwgQ29kZUdlbk9wdDo6TGV2ZWwpOworICBTZWxlY3Rpb25EQUcoY29uc3QgU2VsZWN0aW9uREFHICYpID0gZGVsZXRlOworICBTZWxlY3Rpb25EQUcgJm9wZXJhdG9yPShjb25zdCBTZWxlY3Rpb25EQUcgJikgPSBkZWxldGU7CisgIH5TZWxlY3Rpb25EQUcoKTsKKworICAvLy8gUHJlcGFyZSB0aGlzIFNlbGVjdGlvbkRBRyB0byBwcm9jZXNzIGNvZGUgaW4gdGhlIGdpdmVuIE1hY2hpbmVGdW5jdGlvbi4KKyAgdm9pZCBpbml0KE1hY2hpbmVGdW5jdGlvbiAmTmV3TUYsIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgJk5ld09SRSwKKyAgICAgICAgICAgIFBhc3MgKlBhc3NQdHIsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpMaWJyYXJ5SW5mbywKKyAgICAgICAgICAgIERpdmVyZ2VuY2VBbmFseXNpcyAqIERBKTsKKworICB2b2lkIHNldEZ1bmN0aW9uTG93ZXJpbmdJbmZvKEZ1bmN0aW9uTG93ZXJpbmdJbmZvICogRnVuY0luZm8pIHsKKyAgICBGTEkgPSBGdW5jSW5mbzsKKyAgfQorCisgIC8vLyBDbGVhciBzdGF0ZSBhbmQgZnJlZSBtZW1vcnkgbmVjZXNzYXJ5IHRvIG1ha2UgdGhpcworICAvLy8gU2VsZWN0aW9uREFHIHJlYWR5IHRvIHByb2Nlc3MgYSBuZXcgYmxvY2suCisgIHZvaWQgY2xlYXIoKTsKKworICBNYWNoaW5lRnVuY3Rpb24gJmdldE1hY2hpbmVGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuICpNRjsgfQorICBjb25zdCBQYXNzICpnZXRQYXNzKCkgY29uc3QgeyByZXR1cm4gU0RBR0lTZWxQYXNzOyB9CisKKyAgY29uc3QgRGF0YUxheW91dCAmZ2V0RGF0YUxheW91dCgpIGNvbnN0IHsgcmV0dXJuIE1GLT5nZXREYXRhTGF5b3V0KCk7IH0KKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmZ2V0VGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gVE07IH0KKyAgY29uc3QgVGFyZ2V0U3VidGFyZ2V0SW5mbyAmZ2V0U3VidGFyZ2V0KCkgY29uc3QgeyByZXR1cm4gTUYtPmdldFN1YnRhcmdldCgpOyB9CisgIGNvbnN0IFRhcmdldExvd2VyaW5nICZnZXRUYXJnZXRMb3dlcmluZ0luZm8oKSBjb25zdCB7IHJldHVybiAqVExJOyB9CisgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICZnZXRMaWJJbmZvKCkgY29uc3QgeyByZXR1cm4gKkxpYkluZm87IH0KKyAgY29uc3QgU2VsZWN0aW9uREFHVGFyZ2V0SW5mbyAmZ2V0U2VsZWN0aW9uREFHSW5mbygpIGNvbnN0IHsgcmV0dXJuICpUU0k7IH0KKyAgTExWTUNvbnRleHQgKmdldENvbnRleHQoKSBjb25zdCB7cmV0dXJuIENvbnRleHQ7IH0KKyAgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciAmZ2V0T1JFKCkgY29uc3QgeyByZXR1cm4gKk9SRTsgfQorCisgIC8vLyBQb3AgdXAgYSBHcmFwaFZpei9ndiB3aW5kb3cgd2l0aCB0aGUgREFHIHJlbmRlcmVkIHVzaW5nICdkb3QnLgorICB2b2lkIHZpZXdHcmFwaChjb25zdCBzdGQ6OnN0cmluZyAmVGl0bGUpOworICB2b2lkIHZpZXdHcmFwaCgpOworCisjaWZuZGVmIE5ERUJVRworICBzdGQ6Om1hcDxjb25zdCBTRE5vZGUgKiwgc3RkOjpzdHJpbmc+IE5vZGVHcmFwaEF0dHJzOworI2VuZGlmCisKKyAgLy8vIENsZWFyIGFsbCBwcmV2aW91c2x5IGRlZmluZWQgbm9kZSBncmFwaCBhdHRyaWJ1dGVzLgorICAvLy8gSW50ZW5kZWQgdG8gYmUgdXNlZCBmcm9tIGEgZGVidWdnaW5nIHRvb2wgKGVnLiBnZGIpLgorICB2b2lkIGNsZWFyR3JhcGhBdHRycygpOworCisgIC8vLyBTZXQgZ3JhcGggYXR0cmlidXRlcyBmb3IgYSBub2RlLiAoZWcuICJjb2xvcj1yZWQiLikKKyAgdm9pZCBzZXRHcmFwaEF0dHJzKGNvbnN0IFNETm9kZSAqTiwgY29uc3QgY2hhciAqQXR0cnMpOworCisgIC8vLyBHZXQgZ3JhcGggYXR0cmlidXRlcyBmb3IgYSBub2RlLiAoZWcuICJjb2xvcj1yZWQiLikKKyAgLy8vIFVzZWQgZnJvbSBnZXROb2RlQXR0cmlidXRlcy4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgZ2V0R3JhcGhBdHRycyhjb25zdCBTRE5vZGUgKk4pIGNvbnN0OworCisgIC8vLyBDb252ZW5pZW5jZSBmb3Igc2V0dGluZyBub2RlIGNvbG9yIGF0dHJpYnV0ZS4KKyAgdm9pZCBzZXRHcmFwaENvbG9yKGNvbnN0IFNETm9kZSAqTiwgY29uc3QgY2hhciAqQ29sb3IpOworCisgIC8vLyBDb252ZW5pZW5jZSBmb3Igc2V0dGluZyBzdWJncmFwaCBjb2xvciBhdHRyaWJ1dGUuCisgIHZvaWQgc2V0U3ViZ3JhcGhDb2xvcihTRE5vZGUgKk4sIGNvbnN0IGNoYXIgKkNvbG9yKTsKKworICB1c2luZyBhbGxub2Rlc19jb25zdF9pdGVyYXRvciA9IGlsaXN0PFNETm9kZT46OmNvbnN0X2l0ZXJhdG9yOworCisgIGFsbG5vZGVzX2NvbnN0X2l0ZXJhdG9yIGFsbG5vZGVzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gQWxsTm9kZXMuYmVnaW4oKTsgfQorICBhbGxub2Rlc19jb25zdF9pdGVyYXRvciBhbGxub2Rlc19lbmQoKSBjb25zdCB7IHJldHVybiBBbGxOb2Rlcy5lbmQoKTsgfQorCisgIHVzaW5nIGFsbG5vZGVzX2l0ZXJhdG9yID0gaWxpc3Q8U0ROb2RlPjo6aXRlcmF0b3I7CisKKyAgYWxsbm9kZXNfaXRlcmF0b3IgYWxsbm9kZXNfYmVnaW4oKSB7IHJldHVybiBBbGxOb2Rlcy5iZWdpbigpOyB9CisgIGFsbG5vZGVzX2l0ZXJhdG9yIGFsbG5vZGVzX2VuZCgpIHsgcmV0dXJuIEFsbE5vZGVzLmVuZCgpOyB9CisKKyAgaWxpc3Q8U0ROb2RlPjo6c2l6ZV90eXBlIGFsbG5vZGVzX3NpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIEFsbE5vZGVzLnNpemUoKTsKKyAgfQorCisgIGl0ZXJhdG9yX3JhbmdlPGFsbG5vZGVzX2l0ZXJhdG9yPiBhbGxub2RlcygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShhbGxub2Rlc19iZWdpbigpLCBhbGxub2Rlc19lbmQoKSk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8YWxsbm9kZXNfY29uc3RfaXRlcmF0b3I+IGFsbG5vZGVzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGFsbG5vZGVzX2JlZ2luKCksIGFsbG5vZGVzX2VuZCgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHJvb3QgdGFnIG9mIHRoZSBTZWxlY3Rpb25EQUcuCisgIGNvbnN0IFNEVmFsdWUgJmdldFJvb3QoKSBjb25zdCB7IHJldHVybiBSb290OyB9CisKKyAgLy8vIFJldHVybiB0aGUgdG9rZW4gY2hhaW4gY29ycmVzcG9uZGluZyB0byB0aGUgZW50cnkgb2YgdGhlIGZ1bmN0aW9uLgorICBTRFZhbHVlIGdldEVudHJ5Tm9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU0RWYWx1ZShjb25zdF9jYXN0PFNETm9kZSAqPigmRW50cnlOb2RlKSwgMCk7CisgIH0KKworICAvLy8gU2V0IHRoZSBjdXJyZW50IHJvb3QgdGFnIG9mIHRoZSBTZWxlY3Rpb25EQUcuCisgIC8vLworICBjb25zdCBTRFZhbHVlICZzZXRSb290KFNEVmFsdWUgTikgeworICAgIGFzc2VydCgoIU4uZ2V0Tm9kZSgpIHx8IE4uZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpPdGhlcikgJiYKKyAgICAgICAgICAgIkRBRyByb290IHZhbHVlIGlzIG5vdCBhIGNoYWluISIpOworICAgIGlmIChOLmdldE5vZGUoKSkKKyAgICAgIGNoZWNrRm9yQ3ljbGVzKE4uZ2V0Tm9kZSgpLCB0aGlzKTsKKyAgICBSb290ID0gTjsKKyAgICBpZiAoTi5nZXROb2RlKCkpCisgICAgICBjaGVja0ZvckN5Y2xlcyh0aGlzKTsKKyAgICByZXR1cm4gUm9vdDsKKyAgfQorCisgIHZvaWQgVmVyaWZ5REFHRGl2ZXJlbmNlKCk7CisKKyAgLy8vIFRoaXMgaXRlcmF0ZXMgb3ZlciB0aGUgbm9kZXMgaW4gdGhlIFNlbGVjdGlvbkRBRywgZm9sZGluZworICAvLy8gY2VydGFpbiB0eXBlcyBvZiBub2RlcyB0b2dldGhlciwgb3IgZWxpbWluYXRpbmcgc3VwZXJmbHVvdXMgbm9kZXMuICBUaGUKKyAgLy8vIExldmVsIGFyZ3VtZW50IGNvbnRyb2xzIHdoZXRoZXIgQ29tYmluZSBpcyBhbGxvd2VkIHRvIHByb2R1Y2Ugbm9kZXMgYW5kCisgIC8vLyB0eXBlcyB0aGF0IGFyZSBpbGxlZ2FsIG9uIHRoZSB0YXJnZXQuCisgIHZvaWQgQ29tYmluZShDb21iaW5lTGV2ZWwgTGV2ZWwsIEFsaWFzQW5hbHlzaXMgKkFBLAorICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWwpOworCisgIC8vLyBUaGlzIHRyYW5zZm9ybXMgdGhlIFNlbGVjdGlvbkRBRyBpbnRvIGEgU2VsZWN0aW9uREFHIHRoYXQKKyAgLy8vIG9ubHkgdXNlcyB0eXBlcyBuYXRpdmVseSBzdXBwb3J0ZWQgYnkgdGhlIHRhcmdldC4KKyAgLy8vIFJldHVybnMgInRydWUiIGlmIGl0IG1hZGUgYW55IGNoYW5nZXMuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgaXMgYW4gaW52b2x2ZWQgcHJvY2VzcyB0aGF0IG1heSBpbnZhbGlkYXRlIHBvaW50ZXJzIGludG8KKyAgLy8vIHRoZSBncmFwaC4KKyAgYm9vbCBMZWdhbGl6ZVR5cGVzKCk7CisKKyAgLy8vIFRoaXMgdHJhbnNmb3JtcyB0aGUgU2VsZWN0aW9uREFHIGludG8gYSBTZWxlY3Rpb25EQUcgdGhhdCBpcworICAvLy8gY29tcGF0aWJsZSB3aXRoIHRoZSB0YXJnZXQgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IsIGFzIGluZGljYXRlZCBieSB0aGUKKyAgLy8vIFRhcmdldExvd2VyaW5nIG9iamVjdC4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBpcyBhbiBpbnZvbHZlZCBwcm9jZXNzIHRoYXQgbWF5IGludmFsaWRhdGUgcG9pbnRlcnMgaW50bworICAvLy8gdGhlIGdyYXBoLgorICB2b2lkIExlZ2FsaXplKCk7CisKKyAgLy8vIFxicmllZiBUcmFuc2Zvcm1zIGEgU2VsZWN0aW9uREFHIG5vZGUgYW5kIGFueSBvcGVyYW5kcyB0byBpdCBpbnRvIGEgbm9kZQorICAvLy8gdGhhdCBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHRhcmdldCBpbnN0cnVjdGlvbiBzZWxlY3RvciwgYXMgaW5kaWNhdGVkIGJ5CisgIC8vLyB0aGUgVGFyZ2V0TG93ZXJpbmcgb2JqZWN0LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgXGMgTiBpcyBhIHZhbGlkLCBsZWdhbCBub2RlIGFmdGVyIGNhbGxpbmcgdGhpcy4KKyAgLy8vCisgIC8vLyBUaGlzIGVzc2VudGlhbGx5IHJ1bnMgYSBzaW5nbGUgcmVjdXJzaXZlIHdhbGsgb2YgdGhlIFxjIExlZ2FsaXplIHByb2Nlc3MKKyAgLy8vIG92ZXIgdGhlIGdpdmVuIG5vZGUgKGFuZCBpdHMgb3BlcmFuZHMpLiBUaGlzIGNhbiBiZSB1c2VkIHRvIGluY3JlbWVudGFsbHkKKyAgLy8vIGxlZ2FsaXplIHRoZSBEQUcuIEFsbCBvZiB0aGUgbm9kZXMgd2hpY2ggYXJlIGRpcmVjdGx5IHJlcGxhY2VkLAorICAvLy8gcG90ZW50aWFsbHkgaW5jbHVkaW5nIE4sIGFyZSBhZGRlZCB0byB0aGUgb3V0cHV0IHBhcmFtZXRlciBcYworICAvLy8gVXBkYXRlZE5vZGVzIHNvIHRoYXQgdGhlIGRlbHRhIHRvIHRoZSBEQUcgY2FuIGJlIHVuZGVyc3Rvb2QgYnkgdGhlCisgIC8vLyBjYWxsZXIuCisgIC8vLworICAvLy8gV2hlbiB0aGlzIHJldHVybnMgZmFsc2UsIE4gaGFzIGJlZW4gbGVnYWxpemVkIGluIGEgd2F5IHRoYXQgbWFrZSB0aGUKKyAgLy8vIHBvaW50ZXIgcGFzc2VkIGluIG5vIGxvbmdlciB2YWxpZC4gSXQgbWF5IGhhdmUgZXZlbiBiZWVuIGRlbGV0ZWQgZnJvbSB0aGUKKyAgLy8vIERBRywgYW5kIHNvIGl0IHNob3VsZG4ndCBiZSB1c2VkIGZ1cnRoZXIuIFdoZW4gdGhpcyByZXR1cm5zIHRydWUsIHRoZQorICAvLy8gTiBwYXNzZWQgaW4gaXMgYSBsZWdhbCBub2RlLCBhbmQgY2FuIGJlIGltbWVkaWF0ZWx5IHByb2Nlc3NlZCBhcyBzdWNoLgorICAvLy8gVGhpcyBtYXkgc3RpbGwgaGF2ZSBkb25lIHNvbWUgd29yayBvbiB0aGUgREFHLCBhbmQgd2lsbCBzdGlsbCBwb3B1bGF0ZQorICAvLy8gVXBkYXRlZE5vZGVzIHdpdGggYW55IG5ldyBub2RlcyByZXBsYWNpbmcgdGhvc2Ugb3JpZ2luYWxseSBpbiB0aGUgREFHLgorICBib29sIExlZ2FsaXplT3AoU0ROb2RlICpOLCBTbWFsbFNldFZlY3RvcjxTRE5vZGUgKiwgMTY+ICZVcGRhdGVkTm9kZXMpOworCisgIC8vLyBUaGlzIHRyYW5zZm9ybXMgdGhlIFNlbGVjdGlvbkRBRyBpbnRvIGEgU2VsZWN0aW9uREFHCisgIC8vLyB0aGF0IG9ubHkgdXNlcyB2ZWN0b3IgbWF0aCBvcGVyYXRpb25zIHN1cHBvcnRlZCBieSB0aGUgdGFyZ2V0LiAgVGhpcyBpcworICAvLy8gbmVjZXNzYXJ5IGFzIGEgc2VwYXJhdGUgc3RlcCBmcm9tIExlZ2FsaXplIGJlY2F1c2UgdW5yb2xsaW5nIGEgdmVjdG9yCisgIC8vLyBvcGVyYXRpb24gY2FuIGludHJvZHVjZSBpbGxlZ2FsIHR5cGVzLCB3aGljaCByZXF1aXJlcyBydW5uaW5nCisgIC8vLyBMZWdhbGl6ZVR5cGVzIGFnYWluLgorICAvLy8KKyAgLy8vIFRoaXMgcmV0dXJucyB0cnVlIGlmIGl0IG1hZGUgYW55IGNoYW5nZXM7IGluIHRoYXQgY2FzZSwgTGVnYWxpemVUeXBlcworICAvLy8gaXMgY2FsbGVkIGFnYWluIGJlZm9yZSBMZWdhbGl6ZS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBpcyBhbiBpbnZvbHZlZCBwcm9jZXNzIHRoYXQgbWF5IGludmFsaWRhdGUgcG9pbnRlcnMgaW50bworICAvLy8gdGhlIGdyYXBoLgorICBib29sIExlZ2FsaXplVmVjdG9ycygpOworCisgIC8vLyBUaGlzIG1ldGhvZCBkZWxldGVzIGFsbCB1bnJlYWNoYWJsZSBub2RlcyBpbiB0aGUgU2VsZWN0aW9uREFHLgorICB2b2lkIFJlbW92ZURlYWROb2RlcygpOworCisgIC8vLyBSZW1vdmUgdGhlIHNwZWNpZmllZCBub2RlIGZyb20gdGhlIHN5c3RlbS4gIFRoaXMgbm9kZSBtdXN0CisgIC8vLyBoYXZlIG5vIHJlZmVycmVycy4KKyAgdm9pZCBEZWxldGVOb2RlKFNETm9kZSAqTik7CisKKyAgLy8vIFJldHVybiBhbiBTRFZUTGlzdCB0aGF0IHJlcHJlc2VudHMgdGhlIGxpc3Qgb2YgdmFsdWVzIHNwZWNpZmllZC4KKyAgU0RWVExpc3QgZ2V0VlRMaXN0KEVWVCBWVCk7CisgIFNEVlRMaXN0IGdldFZUTGlzdChFVlQgVlQxLCBFVlQgVlQyKTsKKyAgU0RWVExpc3QgZ2V0VlRMaXN0KEVWVCBWVDEsIEVWVCBWVDIsIEVWVCBWVDMpOworICBTRFZUTGlzdCBnZXRWVExpc3QoRVZUIFZUMSwgRVZUIFZUMiwgRVZUIFZUMywgRVZUIFZUNCk7CisgIFNEVlRMaXN0IGdldFZUTGlzdChBcnJheVJlZjxFVlQ+IFZUcyk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE5vZGUgY3JlYXRpb24gbWV0aG9kcy4KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIENvbnN0YW50U0ROb2RlIHdyYXBwaW5nIGEgY29uc3RhbnQgdmFsdWUuCisgIC8vLyBJZiBWVCBpcyBhIHZlY3RvciB0eXBlLCB0aGUgY29uc3RhbnQgaXMgc3BsYXR0ZWQgaW50byBhIEJVSUxEX1ZFQ1RPUi4KKyAgLy8vCisgIC8vLyBJZiBvbmx5IGxlZ2FsIHR5cGVzIGNhbiBiZSBwcm9kdWNlZCwgdGhpcyBkb2VzIHRoZSBuZWNlc3NhcnkKKyAgLy8vIHRyYW5zZm9ybWF0aW9ucyAoZS5nLiwgaWYgdGhlIHZlY3RvciBlbGVtZW50IHR5cGUgaXMgaWxsZWdhbCkuCisgIC8vLyBAeworICBTRFZhbHVlIGdldENvbnN0YW50KHVpbnQ2NF90IFZhbCwgY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1RhcmdldCA9IGZhbHNlLCBib29sIGlzT3BhcXVlID0gZmFsc2UpOworICBTRFZhbHVlIGdldENvbnN0YW50KGNvbnN0IEFQSW50ICZWYWwsIGNvbnN0IFNETG9jICZETCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNUYXJnZXQgPSBmYWxzZSwgYm9vbCBpc09wYXF1ZSA9IGZhbHNlKTsKKworICBTRFZhbHVlIGdldEFsbE9uZXNDb25zdGFudChjb25zdCBTRExvYyAmREwsIEVWVCBWVCwgYm9vbCBJc1RhcmdldCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzT3BhcXVlID0gZmFsc2UpIHsKKyAgICByZXR1cm4gZ2V0Q29uc3RhbnQoQVBJbnQ6OmdldEFsbE9uZXNWYWx1ZShWVC5nZXRTY2FsYXJTaXplSW5CaXRzKCkpLCBETCwKKyAgICAgICAgICAgICAgICAgICAgICAgVlQsIElzVGFyZ2V0LCBJc09wYXF1ZSk7CisgIH0KKworICBTRFZhbHVlIGdldENvbnN0YW50KGNvbnN0IENvbnN0YW50SW50ICZWYWwsIGNvbnN0IFNETG9jICZETCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNUYXJnZXQgPSBmYWxzZSwgYm9vbCBpc09wYXF1ZSA9IGZhbHNlKTsKKyAgU0RWYWx1ZSBnZXRJbnRQdHJDb25zdGFudCh1aW50NjRfdCBWYWwsIGNvbnN0IFNETG9jICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVGFyZ2V0ID0gZmFsc2UpOworICBTRFZhbHVlIGdldFRhcmdldENvbnN0YW50KHVpbnQ2NF90IFZhbCwgY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc09wYXF1ZSA9IGZhbHNlKSB7CisgICAgcmV0dXJuIGdldENvbnN0YW50KFZhbCwgREwsIFZULCB0cnVlLCBpc09wYXF1ZSk7CisgIH0KKyAgU0RWYWx1ZSBnZXRUYXJnZXRDb25zdGFudChjb25zdCBBUEludCAmVmFsLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzT3BhcXVlID0gZmFsc2UpIHsKKyAgICByZXR1cm4gZ2V0Q29uc3RhbnQoVmFsLCBETCwgVlQsIHRydWUsIGlzT3BhcXVlKTsKKyAgfQorICBTRFZhbHVlIGdldFRhcmdldENvbnN0YW50KGNvbnN0IENvbnN0YW50SW50ICZWYWwsIGNvbnN0IFNETG9jICZETCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNPcGFxdWUgPSBmYWxzZSkgeworICAgIHJldHVybiBnZXRDb25zdGFudChWYWwsIERMLCBWVCwgdHJ1ZSwgaXNPcGFxdWUpOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSB0cnVlIG9yIGZhbHNlIGNvbnN0YW50IG9mIHR5cGUgXHAgVlQgdXNpbmcgdGhlIHRhcmdldCdzCisgIC8vLyBCb29sZWFuQ29udGVudCBmb3IgdHlwZSBccCBPcFZULgorICBTRFZhbHVlIGdldEJvb2xDb25zdGFudChib29sIFYsIGNvbnN0IFNETG9jICZETCwgRVZUIFZULCBFVlQgT3BWVCk7CisgIC8vLyBAfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgQ29uc3RhbnRGUFNETm9kZSB3cmFwcGluZyBhIGNvbnN0YW50IHZhbHVlLgorICAvLy8gSWYgVlQgaXMgYSB2ZWN0b3IgdHlwZSwgdGhlIGNvbnN0YW50IGlzIHNwbGF0dGVkIGludG8gYSBCVUlMRF9WRUNUT1IuCisgIC8vLworICAvLy8gSWYgb25seSBsZWdhbCB0eXBlcyBjYW4gYmUgcHJvZHVjZWQsIHRoaXMgZG9lcyB0aGUgbmVjZXNzYXJ5CisgIC8vLyB0cmFuc2Zvcm1hdGlvbnMgKGUuZy4sIGlmIHRoZSB2ZWN0b3IgZWxlbWVudCB0eXBlIGlzIGlsbGVnYWwpLgorICAvLy8gVGhlIGZvcm1zIHRoYXQgdGFrZSBhIGRvdWJsZSBzaG91bGQgb25seSBiZSB1c2VkIGZvciBzaW1wbGUgY29uc3RhbnRzCisgIC8vLyB0aGF0IGNhbiBiZSBleGFjdGx5IHJlcHJlc2VudGVkIGluIFZULiAgTm8gY2hlY2tzIGFyZSBtYWRlLgorICAvLy8gQHsKKyAgU0RWYWx1ZSBnZXRDb25zdGFudEZQKGRvdWJsZSBWYWwsIGNvbnN0IFNETG9jICZETCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1RhcmdldCA9IGZhbHNlKTsKKyAgU0RWYWx1ZSBnZXRDb25zdGFudEZQKGNvbnN0IEFQRmxvYXQgJlZhbCwgY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVGFyZ2V0ID0gZmFsc2UpOworICBTRFZhbHVlIGdldENvbnN0YW50RlAoY29uc3QgQ29uc3RhbnRGUCAmQ0YsIGNvbnN0IFNETG9jICZETCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1RhcmdldCA9IGZhbHNlKTsKKyAgU0RWYWx1ZSBnZXRUYXJnZXRDb25zdGFudEZQKGRvdWJsZSBWYWwsIGNvbnN0IFNETG9jICZETCwgRVZUIFZUKSB7CisgICAgcmV0dXJuIGdldENvbnN0YW50RlAoVmFsLCBETCwgVlQsIHRydWUpOworICB9CisgIFNEVmFsdWUgZ2V0VGFyZ2V0Q29uc3RhbnRGUChjb25zdCBBUEZsb2F0ICZWYWwsIGNvbnN0IFNETG9jICZETCwgRVZUIFZUKSB7CisgICAgcmV0dXJuIGdldENvbnN0YW50RlAoVmFsLCBETCwgVlQsIHRydWUpOworICB9CisgIFNEVmFsdWUgZ2V0VGFyZ2V0Q29uc3RhbnRGUChjb25zdCBDb25zdGFudEZQICZWYWwsIGNvbnN0IFNETG9jICZETCwgRVZUIFZUKSB7CisgICAgcmV0dXJuIGdldENvbnN0YW50RlAoVmFsLCBETCwgVlQsIHRydWUpOworICB9CisgIC8vLyBAfQorCisgIFNEVmFsdWUgZ2V0R2xvYmFsQWRkcmVzcyhjb25zdCBHbG9iYWxWYWx1ZSAqR1YsIGNvbnN0IFNETG9jICZETCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBvZmZzZXQgPSAwLCBib29sIGlzVGFyZ2V0R0EgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKTsKKyAgU0RWYWx1ZSBnZXRUYXJnZXRHbG9iYWxBZGRyZXNzKGNvbnN0IEdsb2JhbFZhbHVlICpHViwgY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCkgeworICAgIHJldHVybiBnZXRHbG9iYWxBZGRyZXNzKEdWLCBETCwgVlQsIG9mZnNldCwgdHJ1ZSwgVGFyZ2V0RmxhZ3MpOworICB9CisgIFNEVmFsdWUgZ2V0RnJhbWVJbmRleChpbnQgRkksIEVWVCBWVCwgYm9vbCBpc1RhcmdldCA9IGZhbHNlKTsKKyAgU0RWYWx1ZSBnZXRUYXJnZXRGcmFtZUluZGV4KGludCBGSSwgRVZUIFZUKSB7CisgICAgcmV0dXJuIGdldEZyYW1lSW5kZXgoRkksIFZULCB0cnVlKTsKKyAgfQorICBTRFZhbHVlIGdldEp1bXBUYWJsZShpbnQgSlRJLCBFVlQgVlQsIGJvb2wgaXNUYXJnZXQgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFncyA9IDApOworICBTRFZhbHVlIGdldFRhcmdldEp1bXBUYWJsZShpbnQgSlRJLCBFVlQgVlQsIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKSB7CisgICAgcmV0dXJuIGdldEp1bXBUYWJsZShKVEksIFZULCB0cnVlLCBUYXJnZXRGbGFncyk7CisgIH0KKyAgU0RWYWx1ZSBnZXRDb25zdGFudFBvb2woY29uc3QgQ29uc3RhbnQgKkMsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ24gPSAwLCBpbnQgT2ZmcyA9IDAsIGJvb2wgaXNUPWZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCk7CisgIFNEVmFsdWUgZ2V0VGFyZ2V0Q29uc3RhbnRQb29sKGNvbnN0IENvbnN0YW50ICpDLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduID0gMCwgaW50IE9mZnNldCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKSB7CisgICAgcmV0dXJuIGdldENvbnN0YW50UG9vbChDLCBWVCwgQWxpZ24sIE9mZnNldCwgdHJ1ZSwgVGFyZ2V0RmxhZ3MpOworICB9CisgIFNEVmFsdWUgZ2V0Q29uc3RhbnRQb29sKE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZSAqQywgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbiA9IDAsIGludCBPZmZzID0gMCwgYm9vbCBpc1Q9ZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKTsKKyAgU0RWYWx1ZSBnZXRUYXJnZXRDb25zdGFudFBvb2woTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVCwgdW5zaWduZWQgQWxpZ24gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBPZmZzZXQgPSAwLCB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzPTApIHsKKyAgICByZXR1cm4gZ2V0Q29uc3RhbnRQb29sKEMsIFZULCBBbGlnbiwgT2Zmc2V0LCB0cnVlLCBUYXJnZXRGbGFncyk7CisgIH0KKyAgU0RWYWx1ZSBnZXRUYXJnZXRJbmRleChpbnQgSW5kZXgsIEVWVCBWVCwgaW50NjRfdCBPZmZzZXQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKTsKKyAgLy8gV2hlbiBnZW5lcmF0aW5nIGEgYnJhbmNoIHRvIGEgQkIsIHdlIGRvbid0IGluIGdlbmVyYWwga25vdyBlbm91Z2gKKyAgLy8gdG8gcHJvdmlkZSBkZWJ1ZyBpbmZvIGZvciB0aGUgQkIgYXQgdGhhdCB0aW1lLCBzbyBrZWVwIHRoaXMgb25lIGFyb3VuZC4KKyAgU0RWYWx1ZSBnZXRCYXNpY0Jsb2NrKE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpOworICBTRFZhbHVlIGdldEJhc2ljQmxvY2soTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwgU0RMb2MgZGwpOworICBTRFZhbHVlIGdldEV4dGVybmFsU3ltYm9sKGNvbnN0IGNoYXIgKlN5bSwgRVZUIFZUKTsKKyAgU0RWYWx1ZSBnZXRFeHRlcm5hbFN5bWJvbChjb25zdCBjaGFyICpTeW0sIGNvbnN0IFNETG9jICZkbCwgRVZUIFZUKTsKKyAgU0RWYWx1ZSBnZXRUYXJnZXRFeHRlcm5hbFN5bWJvbChjb25zdCBjaGFyICpTeW0sIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzID0gMCk7CisgIFNEVmFsdWUgZ2V0TUNTeW1ib2woTUNTeW1ib2wgKlN5bSwgRVZUIFZUKTsKKworICBTRFZhbHVlIGdldFZhbHVlVHlwZShFVlQpOworICBTRFZhbHVlIGdldFJlZ2lzdGVyKHVuc2lnbmVkIFJlZywgRVZUIFZUKTsKKyAgU0RWYWx1ZSBnZXRSZWdpc3Rlck1hc2soY29uc3QgdWludDMyX3QgKlJlZ01hc2spOworICBTRFZhbHVlIGdldEVITGFiZWwoY29uc3QgU0RMb2MgJmRsLCBTRFZhbHVlIFJvb3QsIE1DU3ltYm9sICpMYWJlbCk7CisgIFNEVmFsdWUgZ2V0TGFiZWxOb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJmRsLCBTRFZhbHVlIFJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgIE1DU3ltYm9sICpMYWJlbCk7CisgIFNEVmFsdWUgZ2V0QmxvY2tBZGRyZXNzKGNvbnN0IEJsb2NrQWRkcmVzcyAqQkEsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBPZmZzZXQgPSAwLCBib29sIGlzVGFyZ2V0ID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKTsKKyAgU0RWYWx1ZSBnZXRUYXJnZXRCbG9ja0FkZHJlc3MoY29uc3QgQmxvY2tBZGRyZXNzICpCQSwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IE9mZnNldCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MgPSAwKSB7CisgICAgcmV0dXJuIGdldEJsb2NrQWRkcmVzcyhCQSwgVlQsIE9mZnNldCwgdHJ1ZSwgVGFyZ2V0RmxhZ3MpOworICB9CisKKyAgU0RWYWx1ZSBnZXRDb3B5VG9SZWcoU0RWYWx1ZSBDaGFpbiwgY29uc3QgU0RMb2MgJmRsLCB1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgTikgeworICAgIHJldHVybiBnZXROb2RlKElTRDo6Q29weVRvUmVnLCBkbCwgTVZUOjpPdGhlciwgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgZ2V0UmVnaXN0ZXIoUmVnLCBOLmdldFZhbHVlVHlwZSgpKSwgTik7CisgIH0KKworICAvLyBUaGlzIHZlcnNpb24gb2YgdGhlIGdldENvcHlUb1JlZyBtZXRob2QgdGFrZXMgYW4gZXh0cmEgb3BlcmFuZCwgd2hpY2gKKyAgLy8gaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgcG90ZW50aWFsbHkgYW4gaW5jb21pbmcgZ2x1ZSB2YWx1ZSAoaWYgR2x1ZSBpcyBub3QKKyAgLy8gbnVsbCkgYW5kIHRoYXQgdGhlcmUgc2hvdWxkIGJlIGEgZ2x1ZSByZXN1bHQuCisgIFNEVmFsdWUgZ2V0Q29weVRvUmVnKFNEVmFsdWUgQ2hhaW4sIGNvbnN0IFNETG9jICZkbCwgdW5zaWduZWQgUmVnLCBTRFZhbHVlIE4sCisgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgR2x1ZSkgeworICAgIFNEVlRMaXN0IFZUcyA9IGdldFZUTGlzdChNVlQ6Ok90aGVyLCBNVlQ6OkdsdWUpOworICAgIFNEVmFsdWUgT3BzW10gPSB7IENoYWluLCBnZXRSZWdpc3RlcihSZWcsIE4uZ2V0VmFsdWVUeXBlKCkpLCBOLCBHbHVlIH07CisgICAgcmV0dXJuIGdldE5vZGUoSVNEOjpDb3B5VG9SZWcsIGRsLCBWVHMsCisgICAgICAgICAgICAgICAgICAgbWFrZUFycmF5UmVmKE9wcywgR2x1ZS5nZXROb2RlKCkgPyA0IDogMykpOworICB9CisKKyAgLy8gU2ltaWxhciB0byBsYXN0IGdldENvcHlUb1JlZygpIGV4Y2VwdCBwYXJhbWV0ZXIgUmVnIGlzIGEgU0RWYWx1ZQorICBTRFZhbHVlIGdldENvcHlUb1JlZyhTRFZhbHVlIENoYWluLCBjb25zdCBTRExvYyAmZGwsIFNEVmFsdWUgUmVnLCBTRFZhbHVlIE4sCisgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgR2x1ZSkgeworICAgIFNEVlRMaXN0IFZUcyA9IGdldFZUTGlzdChNVlQ6Ok90aGVyLCBNVlQ6OkdsdWUpOworICAgIFNEVmFsdWUgT3BzW10gPSB7IENoYWluLCBSZWcsIE4sIEdsdWUgfTsKKyAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OkNvcHlUb1JlZywgZGwsIFZUcywKKyAgICAgICAgICAgICAgICAgICBtYWtlQXJyYXlSZWYoT3BzLCBHbHVlLmdldE5vZGUoKSA/IDQgOiAzKSk7CisgIH0KKworICBTRFZhbHVlIGdldENvcHlGcm9tUmVnKFNEVmFsdWUgQ2hhaW4sIGNvbnN0IFNETG9jICZkbCwgdW5zaWduZWQgUmVnLCBFVlQgVlQpIHsKKyAgICBTRFZUTGlzdCBWVHMgPSBnZXRWVExpc3QoVlQsIE1WVDo6T3RoZXIpOworICAgIFNEVmFsdWUgT3BzW10gPSB7IENoYWluLCBnZXRSZWdpc3RlcihSZWcsIFZUKSB9OworICAgIHJldHVybiBnZXROb2RlKElTRDo6Q29weUZyb21SZWcsIGRsLCBWVHMsIE9wcyk7CisgIH0KKworICAvLyBUaGlzIHZlcnNpb24gb2YgdGhlIGdldENvcHlGcm9tUmVnIG1ldGhvZCB0YWtlcyBhbiBleHRyYSBvcGVyYW5kLCB3aGljaAorICAvLyBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBwb3RlbnRpYWxseSBhbiBpbmNvbWluZyBnbHVlIHZhbHVlIChpZiBHbHVlIGlzIG5vdAorICAvLyBudWxsKSBhbmQgdGhhdCB0aGVyZSBzaG91bGQgYmUgYSBnbHVlIHJlc3VsdC4KKyAgU0RWYWx1ZSBnZXRDb3B5RnJvbVJlZyhTRFZhbHVlIENoYWluLCBjb25zdCBTRExvYyAmZGwsIHVuc2lnbmVkIFJlZywgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgR2x1ZSkgeworICAgIFNEVlRMaXN0IFZUcyA9IGdldFZUTGlzdChWVCwgTVZUOjpPdGhlciwgTVZUOjpHbHVlKTsKKyAgICBTRFZhbHVlIE9wc1tdID0geyBDaGFpbiwgZ2V0UmVnaXN0ZXIoUmVnLCBWVCksIEdsdWUgfTsKKyAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OkNvcHlGcm9tUmVnLCBkbCwgVlRzLAorICAgICAgICAgICAgICAgICAgIG1ha2VBcnJheVJlZihPcHMsIEdsdWUuZ2V0Tm9kZSgpID8gMyA6IDIpKTsKKyAgfQorCisgIFNEVmFsdWUgZ2V0Q29uZENvZGUoSVNEOjpDb25kQ29kZSBDb25kKTsKKworICAvLy8gUmV0dXJuIGFuIElTRDo6VkVDVE9SX1NIVUZGTEUgbm9kZS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBWVCwKKyAgLy8vIHdoaWNoIG11c3QgYmUgYSB2ZWN0b3IgdHlwZSwgbXVzdCBtYXRjaCB0aGUgbnVtYmVyIG9mIG1hc2sgZWxlbWVudHMKKyAgLy8vIE51bUVsdHMuIEFuIGludGVnZXIgbWFzayBlbGVtZW50IGVxdWFsIHRvIC0xIGlzIHRyZWF0ZWQgYXMgdW5kZWZpbmVkLgorICBTRFZhbHVlIGdldFZlY3RvclNodWZmbGUoRVZUIFZULCBjb25zdCBTRExvYyAmZGwsIFNEVmFsdWUgTjEsIFNEVmFsdWUgTjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxpbnQ+IE1hc2spOworCisgIC8vLyBSZXR1cm4gYW4gSVNEOjpCVUlMRF9WRUNUT1Igbm9kZS4gVGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBWVCwKKyAgLy8vIHdoaWNoIG11c3QgYmUgYSB2ZWN0b3IgdHlwZSwgbXVzdCBtYXRjaCB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIGluIE9wcy4KKyAgLy8vIFRoZSBvcGVyYW5kcyBtdXN0IGhhdmUgdGhlIHNhbWUgdHlwZSBhcyAob3IsIGZvciBpbnRlZ2VycywgYSB0eXBlIHdpZGVyCisgIC8vLyB0aGFuKSBWVCdzIGVsZW1lbnQgdHlwZS4KKyAgU0RWYWx1ZSBnZXRCdWlsZFZlY3RvcihFVlQgVlQsIGNvbnN0IFNETG9jICZETCwgQXJyYXlSZWY8U0RWYWx1ZT4gT3BzKSB7CisgICAgLy8gVmVyaWZ5U0ROb2RlICh2aWEgSW5zZXJ0Tm9kZSkgY2hlY2tzIEJVSUxEX1ZFQ1RPUiBsYXRlci4KKyAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgREwsIFZULCBPcHMpOworICB9CisKKyAgLy8vIFJldHVybiBhbiBJU0Q6OkJVSUxEX1ZFQ1RPUiBub2RlLiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIFZULAorICAvLy8gd2hpY2ggbXVzdCBiZSBhIHZlY3RvciB0eXBlLCBtdXN0IG1hdGNoIHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgaW4gT3BzLgorICAvLy8gVGhlIG9wZXJhbmRzIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlIGFzIChvciwgZm9yIGludGVnZXJzLCBhIHR5cGUgd2lkZXIKKyAgLy8vIHRoYW4pIFZUJ3MgZWxlbWVudCB0eXBlLgorICBTRFZhbHVlIGdldEJ1aWxkVmVjdG9yKEVWVCBWVCwgY29uc3QgU0RMb2MgJkRMLCBBcnJheVJlZjxTRFVzZT4gT3BzKSB7CisgICAgLy8gVmVyaWZ5U0ROb2RlICh2aWEgSW5zZXJ0Tm9kZSkgY2hlY2tzIEJVSUxEX1ZFQ1RPUiBsYXRlci4KKyAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgREwsIFZULCBPcHMpOworICB9CisKKyAgLy8vIFJldHVybiBhIHNwbGF0IElTRDo6QlVJTERfVkVDVE9SIG5vZGUsIGNvbnNpc3Rpbmcgb2YgT3Agc3BsYXR0ZWQgdG8gYWxsCisgIC8vLyBlbGVtZW50cy4gVlQgbXVzdCBiZSBhIHZlY3RvciB0eXBlLiBPcCdzIHR5cGUgbXVzdCBiZSB0aGUgc2FtZSBhcyAob3IsCisgIC8vLyBmb3IgaW50ZWdlcnMsIGEgdHlwZSB3aWRlciB0aGFuKSBWVCdzIGVsZW1lbnQgdHlwZS4KKyAgU0RWYWx1ZSBnZXRTcGxhdEJ1aWxkVmVjdG9yKEVWVCBWVCwgY29uc3QgU0RMb2MgJkRMLCBTRFZhbHVlIE9wKSB7CisgICAgLy8gVmVyaWZ5U0ROb2RlICh2aWEgSW5zZXJ0Tm9kZSkgY2hlY2tzIEJVSUxEX1ZFQ1RPUiBsYXRlci4KKyAgICBpZiAoT3AuZ2V0T3Bjb2RlKCkgPT0gSVNEOjpVTkRFRikgeworICAgICAgYXNzZXJ0KChWVC5nZXRWZWN0b3JFbGVtZW50VHlwZSgpID09IE9wLmdldFZhbHVlVHlwZSgpIHx8CisgICAgICAgICAgICAgIChWVC5pc0ludGVnZXIoKSAmJgorICAgICAgICAgICAgICAgVlQuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKS5iaXRzTEUoT3AuZ2V0VmFsdWVUeXBlKCkpKSkgJiYKKyAgICAgICAgICAgICAiQSBzcGxhdHRlZCB2YWx1ZSBtdXN0IGhhdmUgYSB3aWR0aCBlcXVhbCBvciAoZm9yIGludGVnZXJzKSAiCisgICAgICAgICAgICAgImdyZWF0ZXIgdGhhbiB0aGUgdmVjdG9yIGVsZW1lbnQgdHlwZSEiKTsKKyAgICAgIHJldHVybiBnZXROb2RlKElTRDo6VU5ERUYsIFNETG9jKCksIFZUKTsKKyAgICB9CisKKyAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCAxNj4gT3BzKFZULmdldFZlY3Rvck51bUVsZW1lbnRzKCksIE9wKTsKKyAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OkJVSUxEX1ZFQ1RPUiwgREwsIFZULCBPcHMpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGFuIElTRDo6VkVDVE9SX1NIVUZGTEUgbm9kZSBzZW1hbnRpY2FsbHkgZXF1aXZhbGVudCB0bworICAvLy8gdGhlIHNodWZmbGUgbm9kZSBpbiBpbnB1dCBidXQgd2l0aCBzd2FwcGVkIG9wZXJhbmRzLgorICAvLy8KKyAgLy8vIEV4YW1wbGU6IHNodWZmbGUgQSwgQiwgPDAsNSwyLDc+IC0+IHNodWZmbGUgQiwgQSwgPDQsMSw2LDM+CisgIFNEVmFsdWUgZ2V0Q29tbXV0ZWRWZWN0b3JTaHVmZmxlKGNvbnN0IFNodWZmbGVWZWN0b3JTRE5vZGUgJlNWKTsKKworICAvLy8gQ29udmVydCBPcCwgd2hpY2ggbXVzdCBiZSBvZiBmbG9hdCB0eXBlLCB0byB0aGUKKyAgLy8vIGZsb2F0IHR5cGUgVlQsIGJ5IGVpdGhlciBleHRlbmRpbmcgb3Igcm91bmRpbmcgKGJ5IHRydW5jYXRpb24pLgorICBTRFZhbHVlIGdldEZQRXh0ZW5kT3JSb3VuZChTRFZhbHVlIE9wLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCk7CisKKyAgLy8vIENvbnZlcnQgT3AsIHdoaWNoIG11c3QgYmUgb2YgaW50ZWdlciB0eXBlLCB0byB0aGUKKyAgLy8vIGludGVnZXIgdHlwZSBWVCwgYnkgZWl0aGVyIGFueS1leHRlbmRpbmcgb3IgdHJ1bmNhdGluZyBpdC4KKyAgU0RWYWx1ZSBnZXRBbnlFeHRPclRydW5jKFNEVmFsdWUgT3AsIGNvbnN0IFNETG9jICZETCwgRVZUIFZUKTsKKworICAvLy8gQ29udmVydCBPcCwgd2hpY2ggbXVzdCBiZSBvZiBpbnRlZ2VyIHR5cGUsIHRvIHRoZQorICAvLy8gaW50ZWdlciB0eXBlIFZULCBieSBlaXRoZXIgc2lnbi1leHRlbmRpbmcgb3IgdHJ1bmNhdGluZyBpdC4KKyAgU0RWYWx1ZSBnZXRTRXh0T3JUcnVuYyhTRFZhbHVlIE9wLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCk7CisKKyAgLy8vIENvbnZlcnQgT3AsIHdoaWNoIG11c3QgYmUgb2YgaW50ZWdlciB0eXBlLCB0byB0aGUKKyAgLy8vIGludGVnZXIgdHlwZSBWVCwgYnkgZWl0aGVyIHplcm8tZXh0ZW5kaW5nIG9yIHRydW5jYXRpbmcgaXQuCisgIFNEVmFsdWUgZ2V0WkV4dE9yVHJ1bmMoU0RWYWx1ZSBPcCwgY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQpOworCisgIC8vLyBSZXR1cm4gdGhlIGV4cHJlc3Npb24gcmVxdWlyZWQgdG8gemVybyBleHRlbmQgdGhlIE9wCisgIC8vLyB2YWx1ZSBhc3N1bWluZyBpdCB3YXMgdGhlIHNtYWxsZXIgU3JjVHkgdmFsdWUuCisgIFNEVmFsdWUgZ2V0WmVyb0V4dGVuZEluUmVnKFNEVmFsdWUgT3AsIGNvbnN0IFNETG9jICZETCwgRVZUIFNyY1R5KTsKKworICAvLy8gUmV0dXJuIGFuIG9wZXJhdGlvbiB3aGljaCB3aWxsIGFueS1leHRlbmQgdGhlIGxvdyBsYW5lcyBvZiB0aGUgb3BlcmFuZAorICAvLy8gaW50byB0aGUgc3BlY2lmaWVkIHZlY3RvciB0eXBlLiBGb3IgZXhhbXBsZSwKKyAgLy8vIHRoaXMgY2FuIGNvbnZlcnQgYSB2MTZpOCBpbnRvIGEgdjRpMzIgYnkgYW55LWV4dGVuZGluZyB0aGUgbG93IGZvdXIKKyAgLy8vIGxhbmVzIG9mIHRoZSBvcGVyYW5kIGZyb20gaTggdG8gaTMyLgorICBTRFZhbHVlIGdldEFueUV4dGVuZFZlY3RvckluUmVnKFNEVmFsdWUgT3AsIGNvbnN0IFNETG9jICZETCwgRVZUIFZUKTsKKworICAvLy8gUmV0dXJuIGFuIG9wZXJhdGlvbiB3aGljaCB3aWxsIHNpZ24gZXh0ZW5kIHRoZSBsb3cgbGFuZXMgb2YgdGhlIG9wZXJhbmQKKyAgLy8vIGludG8gdGhlIHNwZWNpZmllZCB2ZWN0b3IgdHlwZS4gRm9yIGV4YW1wbGUsCisgIC8vLyB0aGlzIGNhbiBjb252ZXJ0IGEgdjE2aTggaW50byBhIHY0aTMyIGJ5IHNpZ24gZXh0ZW5kaW5nIHRoZSBsb3cgZm91cgorICAvLy8gbGFuZXMgb2YgdGhlIG9wZXJhbmQgZnJvbSBpOCB0byBpMzIuCisgIFNEVmFsdWUgZ2V0U2lnbkV4dGVuZFZlY3RvckluUmVnKFNEVmFsdWUgT3AsIGNvbnN0IFNETG9jICZETCwgRVZUIFZUKTsKKworICAvLy8gUmV0dXJuIGFuIG9wZXJhdGlvbiB3aGljaCB3aWxsIHplcm8gZXh0ZW5kIHRoZSBsb3cgbGFuZXMgb2YgdGhlIG9wZXJhbmQKKyAgLy8vIGludG8gdGhlIHNwZWNpZmllZCB2ZWN0b3IgdHlwZS4gRm9yIGV4YW1wbGUsCisgIC8vLyB0aGlzIGNhbiBjb252ZXJ0IGEgdjE2aTggaW50byBhIHY0aTMyIGJ5IHplcm8gZXh0ZW5kaW5nIHRoZSBsb3cgZm91cgorICAvLy8gbGFuZXMgb2YgdGhlIG9wZXJhbmQgZnJvbSBpOCB0byBpMzIuCisgIFNEVmFsdWUgZ2V0WmVyb0V4dGVuZFZlY3RvckluUmVnKFNEVmFsdWUgT3AsIGNvbnN0IFNETG9jICZETCwgRVZUIFZUKTsKKworICAvLy8gQ29udmVydCBPcCwgd2hpY2ggbXVzdCBiZSBvZiBpbnRlZ2VyIHR5cGUsIHRvIHRoZSBpbnRlZ2VyIHR5cGUgVlQsCisgIC8vLyBieSB1c2luZyBhbiBleHRlbnNpb24gYXBwcm9wcmlhdGUgZm9yIHRoZSB0YXJnZXQncworICAvLy8gQm9vbGVhbkNvbnRlbnQgZm9yIHR5cGUgT3BWVCBvciB0cnVuY2F0aW5nIGl0LgorICBTRFZhbHVlIGdldEJvb2xFeHRPclRydW5jKFNEVmFsdWUgT3AsIGNvbnN0IFNETG9jICZTTCwgRVZUIFZULCBFVlQgT3BWVCk7CisKKyAgLy8vIENyZWF0ZSBhIGJpdHdpc2UgTk9UIG9wZXJhdGlvbiBhcyAoWE9SIFZhbCwgLTEpLgorICBTRFZhbHVlIGdldE5PVChjb25zdCBTRExvYyAmREwsIFNEVmFsdWUgVmFsLCBFVlQgVlQpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgbG9naWNhbCBOT1Qgb3BlcmF0aW9uIGFzIChYT1IgVmFsLCBCb29sZWFuT25lKS4KKyAgU0RWYWx1ZSBnZXRMb2dpY2FsTk9UKGNvbnN0IFNETG9jICZETCwgU0RWYWx1ZSBWYWwsIEVWVCBWVCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYW4gYWRkIGluc3RydWN0aW9uIHdpdGggYXBwcm9wcmlhdGUgZmxhZ3Mgd2hlbiB1c2VkIGZvcgorICAvLy8gYWRkcmVzc2luZyBzb21lIG9mZnNldCBvZiBhbiBvYmplY3QuIGkuZS4gaWYgYSBsb2FkIGlzIHNwbGl0IGludG8gbXVsdGlwbGUKKyAgLy8vIGNvbXBvbmVudHMsIGNyZWF0ZSBhbiBhZGQgbnV3IGZyb20gdGhlIGJhc2UgcG9pbnRlciB0byB0aGUgb2Zmc2V0LgorICBTRFZhbHVlIGdldE9iamVjdFB0ck9mZnNldChjb25zdCBTRExvYyAmU0wsIFNEVmFsdWUgT3AsIGludDY0X3QgT2Zmc2V0KSB7CisgICAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisgICAgcmV0dXJuIGdldE9iamVjdFB0ck9mZnNldChTTCwgT3AsIGdldENvbnN0YW50KE9mZnNldCwgU0wsIFZUKSk7CisgIH0KKworICBTRFZhbHVlIGdldE9iamVjdFB0ck9mZnNldChjb25zdCBTRExvYyAmU0wsIFNEVmFsdWUgT3AsIFNEVmFsdWUgT2Zmc2V0KSB7CisgICAgRVZUIFZUID0gT3AuZ2V0VmFsdWVUeXBlKCk7CisKKyAgICAvLyBUaGUgb2JqZWN0IGl0c2VsZiBjYW4ndCB3cmFwIGFyb3VuZCB0aGUgYWRkcmVzcyBzcGFjZSwgc28gaXQgc2hvdWxkbid0IGJlCisgICAgLy8gcG9zc2libGUgZm9yIHRoZSBhZGRzIG9mIHRoZSBvZmZzZXRzIHRvIHRoZSBzcGxpdCBwYXJ0cyB0byBvdmVyZmxvdy4KKyAgICBTRE5vZGVGbGFncyBGbGFnczsKKyAgICBGbGFncy5zZXROb1Vuc2lnbmVkV3JhcCh0cnVlKTsKKyAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OkFERCwgU0wsIFZULCBPcCwgT2Zmc2V0LCBGbGFncyk7CisgIH0KKworICAvLy8gUmV0dXJuIGEgbmV3IENBTExTRVFfU1RBUlQgbm9kZSwgdGhhdCBzdGFydHMgbmV3IGNhbGwgZnJhbWUsIGluIHdoaWNoCisgIC8vLyBJblNpemUgYnl0ZXMgYXJlIHNldCB1cCBpbnNpZGUgQ0FMTFNFUV9TVEFSVC4uQ0FMTFNFUV9FTkQgc2VxdWVuY2UgYW5kCisgIC8vLyBPdXRTaXplIHNwZWNpZmllcyBwYXJ0IG9mIHRoZSBmcmFtZSBzZXQgdXAgcHJpb3IgdG8gdGhlIHNlcXVlbmNlLgorICBTRFZhbHVlIGdldENBTExTRVFfU1RBUlQoU0RWYWx1ZSBDaGFpbiwgdWludDY0X3QgSW5TaXplLCB1aW50NjRfdCBPdXRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RMb2MgJkRMKSB7CisgICAgU0RWVExpc3QgVlRzID0gZ2V0VlRMaXN0KE1WVDo6T3RoZXIsIE1WVDo6R2x1ZSk7CisgICAgU0RWYWx1ZSBPcHNbXSA9IHsgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgZ2V0SW50UHRyQ29uc3RhbnQoSW5TaXplLCBETCwgdHJ1ZSksCisgICAgICAgICAgICAgICAgICAgICAgZ2V0SW50UHRyQ29uc3RhbnQoT3V0U2l6ZSwgREwsIHRydWUpIH07CisgICAgcmV0dXJuIGdldE5vZGUoSVNEOjpDQUxMU0VRX1NUQVJULCBETCwgVlRzLCBPcHMpOworICB9CisKKyAgLy8vIFJldHVybiBhIG5ldyBDQUxMU0VRX0VORCBub2RlLCB3aGljaCBhbHdheXMgbXVzdCBoYXZlIGEKKyAgLy8vIGdsdWUgcmVzdWx0ICh0byBlbnN1cmUgaXQncyBub3QgQ1NFJ2QpLgorICAvLy8gQ0FMTFNFUV9FTkQgZG9lcyBub3QgaGF2ZSBhIHVzZWZ1bCBTRExvYy4KKyAgU0RWYWx1ZSBnZXRDQUxMU0VRX0VORChTRFZhbHVlIENoYWluLCBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBJbkdsdWUsIGNvbnN0IFNETG9jICZETCkgeworICAgIFNEVlRMaXN0IE5vZGVUeXMgPSBnZXRWVExpc3QoTVZUOjpPdGhlciwgTVZUOjpHbHVlKTsKKyAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA0PiBPcHM7CisgICAgT3BzLnB1c2hfYmFjayhDaGFpbik7CisgICAgT3BzLnB1c2hfYmFjayhPcDEpOworICAgIE9wcy5wdXNoX2JhY2soT3AyKTsKKyAgICBpZiAoSW5HbHVlLmdldE5vZGUoKSkKKyAgICAgIE9wcy5wdXNoX2JhY2soSW5HbHVlKTsKKyAgICByZXR1cm4gZ2V0Tm9kZShJU0Q6OkNBTExTRVFfRU5ELCBETCwgTm9kZVR5cywgT3BzKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVzdWx0IG9mIHRoaXMgb3BlcmF0aW9uIGlzIGFsd2F5cyB1bmRlZmluZWQuCisgIGJvb2wgaXNVbmRlZih1bnNpZ25lZCBPcGNvZGUsIEFycmF5UmVmPFNEVmFsdWU+IE9wcyk7CisKKyAgLy8vIFJldHVybiBhbiBVTkRFRiBub2RlLiBVTkRFRiBkb2VzIG5vdCBoYXZlIGEgdXNlZnVsIFNETG9jLgorICBTRFZhbHVlIGdldFVOREVGKEVWVCBWVCkgeworICAgIHJldHVybiBnZXROb2RlKElTRDo6VU5ERUYsIFNETG9jKCksIFZUKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSBHTE9CQUxfT0ZGU0VUX1RBQkxFIG5vZGUuIFRoaXMgZG9lcyBub3QgaGF2ZSBhIHVzZWZ1bCBTRExvYy4KKyAgU0RWYWx1ZSBnZXRHTE9CQUxfT0ZGU0VUX1RBQkxFKEVWVCBWVCkgeworICAgIHJldHVybiBnZXROb2RlKElTRDo6R0xPQkFMX09GRlNFVF9UQUJMRSwgU0RMb2MoKSwgVlQpOworICB9CisKKyAgLy8vIEdldHMgb3IgY3JlYXRlcyB0aGUgc3BlY2lmaWVkIG5vZGUuCisgIC8vLworICBTRFZhbHVlIGdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNEVXNlPiBPcHMpOworICBTRFZhbHVlIGdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNEVmFsdWU+IE9wcywgY29uc3QgU0ROb2RlRmxhZ3MgRmxhZ3MgPSBTRE5vZGVGbGFncygpKTsKKyAgU0RWYWx1ZSBnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJkRMLCBBcnJheVJlZjxFVlQ+IFJlc3VsdFR5cywKKyAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNEVmFsdWU+IE9wcyk7CisgIFNEVmFsdWUgZ2V0Tm9kZSh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFNETG9jICZETCwgU0RWVExpc3QgVlRzLAorICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U0RWYWx1ZT4gT3BzKTsKKworICAvLyBTcGVjaWFsaXplIGJhc2VkIG9uIG51bWJlciBvZiBvcGVyYW5kcy4KKyAgU0RWYWx1ZSBnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQpOworICBTRFZhbHVlIGdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCwgU0RWYWx1ZSBOLAorICAgICAgICAgICAgICAgICAgY29uc3QgU0ROb2RlRmxhZ3MgRmxhZ3MgPSBTRE5vZGVGbGFncygpKTsKKyAgU0RWYWx1ZSBnZXROb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJkRMLCBFVlQgVlQsIFNEVmFsdWUgTjEsCisgICAgICAgICAgICAgICAgICBTRFZhbHVlIE4yLCBjb25zdCBTRE5vZGVGbGFncyBGbGFncyA9IFNETm9kZUZsYWdzKCkpOworICBTRFZhbHVlIGdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCwgU0RWYWx1ZSBOMSwKKyAgICAgICAgICAgICAgICAgIFNEVmFsdWUgTjIsIFNEVmFsdWUgTjMpOworICBTRFZhbHVlIGdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCwgU0RWYWx1ZSBOMSwKKyAgICAgICAgICAgICAgICAgIFNEVmFsdWUgTjIsIFNEVmFsdWUgTjMsIFNEVmFsdWUgTjQpOworICBTRFZhbHVlIGdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCwgU0RWYWx1ZSBOMSwKKyAgICAgICAgICAgICAgICAgIFNEVmFsdWUgTjIsIFNEVmFsdWUgTjMsIFNEVmFsdWUgTjQsIFNEVmFsdWUgTjUpOworCisgIC8vIFNwZWNpYWxpemUgYWdhaW4gYmFzZWQgb24gbnVtYmVyIG9mIG9wZXJhbmRzIGZvciBub2RlcyB3aXRoIGEgVlRMaXN0CisgIC8vIHJhdGhlciB0aGFuIGEgc2luZ2xlIFZULgorICBTRFZhbHVlIGdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmREwsIFNEVlRMaXN0IFZUcyk7CisgIFNEVmFsdWUgZ2V0Tm9kZSh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFNETG9jICZETCwgU0RWVExpc3QgVlRzLCBTRFZhbHVlIE4pOworICBTRFZhbHVlIGdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmREwsIFNEVlRMaXN0IFZUcywgU0RWYWx1ZSBOMSwKKyAgICAgICAgICAgICAgICAgIFNEVmFsdWUgTjIpOworICBTRFZhbHVlIGdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmREwsIFNEVlRMaXN0IFZUcywgU0RWYWx1ZSBOMSwKKyAgICAgICAgICAgICAgICAgIFNEVmFsdWUgTjIsIFNEVmFsdWUgTjMpOworICBTRFZhbHVlIGdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmREwsIFNEVlRMaXN0IFZUcywgU0RWYWx1ZSBOMSwKKyAgICAgICAgICAgICAgICAgIFNEVmFsdWUgTjIsIFNEVmFsdWUgTjMsIFNEVmFsdWUgTjQpOworICBTRFZhbHVlIGdldE5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmREwsIFNEVlRMaXN0IFZUcywgU0RWYWx1ZSBOMSwKKyAgICAgICAgICAgICAgICAgIFNEVmFsdWUgTjIsIFNEVmFsdWUgTjMsIFNEVmFsdWUgTjQsIFNEVmFsdWUgTjUpOworCisgIC8vLyBDb21wdXRlIGEgVG9rZW5GYWN0b3IgdG8gZm9yY2UgYWxsIHRoZSBpbmNvbWluZyBzdGFjayBhcmd1bWVudHMgdG8gYmUKKyAgLy8vIGxvYWRlZCBmcm9tIHRoZSBzdGFjay4gVGhpcyBpcyB1c2VkIGluIHRhaWwgY2FsbCBsb3dlcmluZyB0byBwcm90ZWN0CisgIC8vLyBzdGFjayBhcmd1bWVudHMgZnJvbSBiZWluZyBjbG9iYmVyZWQuCisgIFNEVmFsdWUgZ2V0U3RhY2tBcmd1bWVudFRva2VuRmFjdG9yKFNEVmFsdWUgQ2hhaW4pOworCisgIFNEVmFsdWUgZ2V0TWVtY3B5KFNEVmFsdWUgQ2hhaW4sIGNvbnN0IFNETG9jICZkbCwgU0RWYWx1ZSBEc3QsIFNEVmFsdWUgU3JjLAorICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFNpemUsIHVuc2lnbmVkIEFsaWduLCBib29sIGlzVm9sLCBib29sIEFsd2F5c0lubGluZSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1RhaWxDYWxsLCBNYWNoaW5lUG9pbnRlckluZm8gRHN0UHRySW5mbywKKyAgICAgICAgICAgICAgICAgICAgTWFjaGluZVBvaW50ZXJJbmZvIFNyY1B0ckluZm8pOworCisgIFNEVmFsdWUgZ2V0TWVtbW92ZShTRFZhbHVlIENoYWluLCBjb25zdCBTRExvYyAmZGwsIFNEVmFsdWUgRHN0LCBTRFZhbHVlIFNyYywKKyAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgU2l6ZSwgdW5zaWduZWQgQWxpZ24sIGJvb2wgaXNWb2wsIGJvb2wgaXNUYWlsQ2FsbCwKKyAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVQb2ludGVySW5mbyBEc3RQdHJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgTWFjaGluZVBvaW50ZXJJbmZvIFNyY1B0ckluZm8pOworCisgIFNEVmFsdWUgZ2V0TWVtc2V0KFNEVmFsdWUgQ2hhaW4sIGNvbnN0IFNETG9jICZkbCwgU0RWYWx1ZSBEc3QsIFNEVmFsdWUgU3JjLAorICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFNpemUsIHVuc2lnbmVkIEFsaWduLCBib29sIGlzVm9sLCBib29sIGlzVGFpbENhbGwsCisgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVQb2ludGVySW5mbyBEc3RQdHJJbmZvKTsKKworICAvLy8gSGVscGVyIGZ1bmN0aW9uIHRvIG1ha2UgaXQgZWFzaWVyIHRvIGJ1aWxkIFNldENDJ3MgaWYgeW91IGp1c3QKKyAgLy8vIGhhdmUgYW4gSVNEOjpDb25kQ29kZSBpbnN0ZWFkIG9mIGFuIFNEVmFsdWUuCisgIC8vLworICBTRFZhbHVlIGdldFNldENDKGNvbnN0IFNETG9jICZETCwgRVZUIFZULCBTRFZhbHVlIExIUywgU0RWYWx1ZSBSSFMsCisgICAgICAgICAgICAgICAgICAgSVNEOjpDb25kQ29kZSBDb25kKSB7CisgICAgYXNzZXJ0KExIUy5nZXRWYWx1ZVR5cGUoKS5pc1ZlY3RvcigpID09IFJIUy5nZXRWYWx1ZVR5cGUoKS5pc1ZlY3RvcigpICYmCisgICAgICAiQ2Fubm90IGNvbXBhcmUgc2NhbGFycyB0byB2ZWN0b3JzIik7CisgICAgYXNzZXJ0KExIUy5nZXRWYWx1ZVR5cGUoKS5pc1ZlY3RvcigpID09IFZULmlzVmVjdG9yKCkgJiYKKyAgICAgICJDYW5ub3QgY29tcGFyZSBzY2FsYXJzIHRvIHZlY3RvcnMiKTsKKyAgICBhc3NlcnQoQ29uZCAhPSBJU0Q6OlNFVENDX0lOVkFMSUQgJiYKKyAgICAgICAgIkNhbm5vdCBjcmVhdGUgYSBzZXRDQyBvZiBhbiBpbnZhbGlkIG5vZGUuIik7CisgICAgcmV0dXJuIGdldE5vZGUoSVNEOjpTRVRDQywgREwsIFZULCBMSFMsIFJIUywgZ2V0Q29uZENvZGUoQ29uZCkpOworICB9CisKKyAgLy8vIEhlbHBlciBmdW5jdGlvbiB0byBtYWtlIGl0IGVhc2llciB0byBidWlsZCBTZWxlY3QncyBpZiB5b3UganVzdAorICAvLy8gaGF2ZSBvcGVyYW5kcyBhbmQgZG9uJ3Qgd2FudCB0byBjaGVjayBmb3IgdmVjdG9yLgorICBTRFZhbHVlIGdldFNlbGVjdChjb25zdCBTRExvYyAmREwsIEVWVCBWVCwgU0RWYWx1ZSBDb25kLCBTRFZhbHVlIExIUywKKyAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBSSFMpIHsKKyAgICBhc3NlcnQoTEhTLmdldFZhbHVlVHlwZSgpID09IFJIUy5nZXRWYWx1ZVR5cGUoKSAmJgorICAgICAgICAgICAiQ2Fubm90IHVzZSBzZWxlY3Qgb24gZGlmZmVyaW5nIHR5cGVzIik7CisgICAgYXNzZXJ0KFZULmlzVmVjdG9yKCkgPT0gTEhTLmdldFZhbHVlVHlwZSgpLmlzVmVjdG9yKCkgJiYKKyAgICAgICAgICAgIkNhbm5vdCBtaXggdmVjdG9ycyBhbmQgc2NhbGFycyIpOworICAgIHJldHVybiBnZXROb2RlKENvbmQuZ2V0VmFsdWVUeXBlKCkuaXNWZWN0b3IoKSA/IElTRDo6VlNFTEVDVCA6IElTRDo6U0VMRUNULCBETCwgVlQsCisgICAgICAgICAgICAgICAgICAgQ29uZCwgTEhTLCBSSFMpOworICB9CisKKyAgLy8vIEhlbHBlciBmdW5jdGlvbiB0byBtYWtlIGl0IGVhc2llciB0byBidWlsZCBTZWxlY3RDQydzIGlmIHlvdQorICAvLy8ganVzdCBoYXZlIGFuIElTRDo6Q29uZENvZGUgaW5zdGVhZCBvZiBhbiBTRFZhbHVlLgorICAvLy8KKyAgU0RWYWx1ZSBnZXRTZWxlY3RDQyhjb25zdCBTRExvYyAmREwsIFNEVmFsdWUgTEhTLCBTRFZhbHVlIFJIUywgU0RWYWx1ZSBUcnVlLAorICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgRmFsc2UsIElTRDo6Q29uZENvZGUgQ29uZCkgeworICAgIHJldHVybiBnZXROb2RlKElTRDo6U0VMRUNUX0NDLCBETCwgVHJ1ZS5nZXRWYWx1ZVR5cGUoKSwKKyAgICAgICAgICAgICAgICAgICBMSFMsIFJIUywgVHJ1ZSwgRmFsc2UsIGdldENvbmRDb2RlKENvbmQpKTsKKyAgfQorCisgIC8vLyBWQUFyZyBwcm9kdWNlcyBhIHJlc3VsdCBhbmQgdG9rZW4gY2hhaW4sIGFuZCB0YWtlcyBhIHBvaW50ZXIKKyAgLy8vIGFuZCBhIHNvdXJjZSB2YWx1ZSBhcyBpbnB1dC4KKyAgU0RWYWx1ZSBnZXRWQUFyZyhFVlQgVlQsIGNvbnN0IFNETG9jICZkbCwgU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBQdHIsCisgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBTViwgdW5zaWduZWQgQWxpZ24pOworCisgIC8vLyBHZXRzIGEgbm9kZSBmb3IgYW4gYXRvbWljIGNtcHhjaGcgb3AuIFRoZXJlIGFyZSB0d28KKyAgLy8vIHZhbGlkIE9wY29kZXMuIElTRDo6QVRPTUlDX0NNT19TV0FQIHByb2R1Y2VzIHRoZSB2YWx1ZSBsb2FkZWQgYW5kIGEKKyAgLy8vIGNoYWluIHJlc3VsdC4gSVNEOjpBVE9NSUNfQ01QX1NXQVBfV0lUSF9TVUNDRVNTIHByb2R1Y2VzIHRoZSB2YWx1ZSBsb2FkZWQsCisgIC8vLyBhIHN1Y2Nlc3MgZmxhZyAoaW5pdGlhbGx5IGkxKSwgYW5kIGEgY2hhaW4uCisgIFNEVmFsdWUgZ2V0QXRvbWljQ21wU3dhcCh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFNETG9jICZkbCwgRVZUIE1lbVZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWVExpc3QgVlRzLCBTRFZhbHVlIENoYWluLCBTRFZhbHVlIFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgQ21wLCBTRFZhbHVlIFN3cCwgTWFjaGluZVBvaW50ZXJJbmZvIFB0ckluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbm1lbnQsIEF0b21pY09yZGVyaW5nIFN1Y2Nlc3NPcmRlcmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY09yZGVyaW5nIEZhaWx1cmVPcmRlcmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bmNTY29wZTo6SUQgU1NJRCk7CisgIFNEVmFsdWUgZ2V0QXRvbWljQ21wU3dhcCh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFNETG9jICZkbCwgRVZUIE1lbVZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWVExpc3QgVlRzLCBTRFZhbHVlIENoYWluLCBTRFZhbHVlIFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgQ21wLCBTRFZhbHVlIFN3cCwgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisKKyAgLy8vIEdldHMgYSBub2RlIGZvciBhbiBhdG9taWMgb3AsIHByb2R1Y2VzIHJlc3VsdCAoaWYgcmVsZXZhbnQpCisgIC8vLyBhbmQgY2hhaW4gYW5kIHRha2VzIDIgb3BlcmFuZHMuCisgIFNEVmFsdWUgZ2V0QXRvbWljKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJmRsLCBFVlQgTWVtVlQsIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgUHRyLCBTRFZhbHVlIFZhbCwgY29uc3QgVmFsdWUgKlB0clZhbCwKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ25tZW50LCBBdG9taWNPcmRlcmluZyBPcmRlcmluZywKKyAgICAgICAgICAgICAgICAgICAgU3luY1Njb3BlOjpJRCBTU0lEKTsKKyAgU0RWYWx1ZSBnZXRBdG9taWModW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmZGwsIEVWVCBNZW1WVCwgU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBQdHIsIFNEVmFsdWUgVmFsLCBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKTsKKworICAvLy8gR2V0cyBhIG5vZGUgZm9yIGFuIGF0b21pYyBvcCwgcHJvZHVjZXMgcmVzdWx0IGFuZCBjaGFpbiBhbmQKKyAgLy8vIHRha2VzIDEgb3BlcmFuZC4KKyAgU0RWYWx1ZSBnZXRBdG9taWModW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmZGwsIEVWVCBNZW1WVCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIENoYWluLCBTRFZhbHVlIFB0ciwgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisKKyAgLy8vIEdldHMgYSBub2RlIGZvciBhbiBhdG9taWMgb3AsIHByb2R1Y2VzIHJlc3VsdCBhbmQgY2hhaW4gYW5kIHRha2VzIE4KKyAgLy8vIG9wZXJhbmRzLgorICBTRFZhbHVlIGdldEF0b21pYyh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFNETG9jICZkbCwgRVZUIE1lbVZULAorICAgICAgICAgICAgICAgICAgICBTRFZUTGlzdCBWVExpc3QsIEFycmF5UmVmPFNEVmFsdWU+IE9wcywKKyAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisKKyAgLy8vIENyZWF0ZXMgYSBNZW1JbnRyaW5zaWNOb2RlIHRoYXQgbWF5IHByb2R1Y2UgYQorICAvLy8gcmVzdWx0IGFuZCB0YWtlcyBhIGxpc3Qgb2Ygb3BlcmFuZHMuIE9wY29kZSBtYXkgYmUgSU5UUklOU0lDX1ZPSUQsCisgIC8vLyBJTlRSSU5TSUNfV19DSEFJTiwgb3IgYSB0YXJnZXQtc3BlY2lmaWMgb3Bjb2RlIHdpdGggYSB2YWx1ZSBub3QKKyAgLy8vIGxlc3MgdGhhbiBGSVJTVF9UQVJHRVRfTUVNT1JZX09QQ09ERS4KKyAgU0RWYWx1ZSBnZXRNZW1JbnRyaW5zaWNOb2RlKAorICAgIHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJmRsLCBTRFZUTGlzdCBWVExpc3QsCisgICAgQXJyYXlSZWY8U0RWYWx1ZT4gT3BzLCBFVlQgTWVtVlQsCisgICAgTWFjaGluZVBvaW50ZXJJbmZvIFB0ckluZm8sCisgICAgdW5zaWduZWQgQWxpZ24gPSAwLAorICAgIE1hY2hpbmVNZW1PcGVyYW5kOjpGbGFncyBGbGFncworICAgID0gTWFjaGluZU1lbU9wZXJhbmQ6Ok1PTG9hZCB8IE1hY2hpbmVNZW1PcGVyYW5kOjpNT1N0b3JlLAorICAgIHVuc2lnbmVkIFNpemUgPSAwKTsKKworICBTRFZhbHVlIGdldE1lbUludHJpbnNpY05vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmZGwsIFNEVlRMaXN0IFZUTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNEVmFsdWU+IE9wcywgRVZUIE1lbVZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisKKyAgLy8vIENyZWF0ZSBhIE1FUkdFX1ZBTFVFUyBub2RlIGZyb20gdGhlIGdpdmVuIG9wZXJhbmRzLgorICBTRFZhbHVlIGdldE1lcmdlVmFsdWVzKEFycmF5UmVmPFNEVmFsdWU+IE9wcywgY29uc3QgU0RMb2MgJmRsKTsKKworICAvLy8gTG9hZHMgYXJlIG5vdCBub3JtYWwgYmluYXJ5IG9wZXJhdG9yczogdGhlaXIgcmVzdWx0IHR5cGUgaXMgbm90CisgIC8vLyBkZXRlcm1pbmVkIGJ5IHRoZWlyIG9wZXJhbmRzLCBhbmQgdGhleSBwcm9kdWNlIGEgdmFsdWUgQU5EIGEgdG9rZW4gY2hhaW4uCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHNldCB0aGUgTU9Mb2FkIGZsYWcgb24gTU1PRmxhZ3MsIGJ1dCB5b3UgY2FuIHNldCBpdCBpZgorICAvLy8geW91IHdhbnQuICBUaGUgTU9TdG9yZSBmbGFnIG11c3Qgbm90IGJlIHNldC4KKyAgU0RWYWx1ZSBnZXRMb2FkKEVWVCBWVCwgY29uc3QgU0RMb2MgJmRsLCBTRFZhbHVlIENoYWluLCBTRFZhbHVlIFB0ciwKKyAgICAgICAgICAgICAgICAgIE1hY2hpbmVQb2ludGVySW5mbyBQdHJJbmZvLCB1bnNpZ25lZCBBbGlnbm1lbnQgPSAwLAorICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQ6OkZsYWdzIE1NT0ZsYWdzID0gTWFjaGluZU1lbU9wZXJhbmQ6Ok1PTm9uZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEFBTUROb2RlcyAmQUFJbmZvID0gQUFNRE5vZGVzKCksCisgICAgICAgICAgICAgICAgICBjb25zdCBNRE5vZGUgKlJhbmdlcyA9IG51bGxwdHIpOworICBTRFZhbHVlIGdldExvYWQoRVZUIFZULCBjb25zdCBTRExvYyAmZGwsIFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgUHRyLAorICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisgIFNEVmFsdWUKKyAgZ2V0RXh0TG9hZChJU0Q6OkxvYWRFeHRUeXBlIEV4dFR5cGUsIGNvbnN0IFNETG9jICZkbCwgRVZUIFZULCBTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgIFNEVmFsdWUgUHRyLCBNYWNoaW5lUG9pbnRlckluZm8gUHRySW5mbywgRVZUIE1lbVZULAorICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCA9IDAsCisgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQ6OkZsYWdzIE1NT0ZsYWdzID0gTWFjaGluZU1lbU9wZXJhbmQ6Ok1PTm9uZSwKKyAgICAgICAgICAgICBjb25zdCBBQU1ETm9kZXMgJkFBSW5mbyA9IEFBTUROb2RlcygpKTsKKyAgU0RWYWx1ZSBnZXRFeHRMb2FkKElTRDo6TG9hZEV4dFR5cGUgRXh0VHlwZSwgY29uc3QgU0RMb2MgJmRsLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIENoYWluLCBTRFZhbHVlIFB0ciwgRVZUIE1lbVZULAorICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisgIFNEVmFsdWUgZ2V0SW5kZXhlZExvYWQoU0RWYWx1ZSBPcmlnTG9hZCwgY29uc3QgU0RMb2MgJmRsLCBTRFZhbHVlIEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPZmZzZXQsIElTRDo6TWVtSW5kZXhlZE1vZGUgQU0pOworICBTRFZhbHVlIGdldExvYWQoSVNEOjpNZW1JbmRleGVkTW9kZSBBTSwgSVNEOjpMb2FkRXh0VHlwZSBFeHRUeXBlLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICBjb25zdCBTRExvYyAmZGwsIFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgUHRyLCBTRFZhbHVlIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgIE1hY2hpbmVQb2ludGVySW5mbyBQdHJJbmZvLCBFVlQgTWVtVlQsIHVuc2lnbmVkIEFsaWdubWVudCA9IDAsCisgICAgICAgICAgICAgICAgICBNYWNoaW5lTWVtT3BlcmFuZDo6RmxhZ3MgTU1PRmxhZ3MgPSBNYWNoaW5lTWVtT3BlcmFuZDo6TU9Ob25lLAorICAgICAgICAgICAgICAgICAgY29uc3QgQUFNRE5vZGVzICZBQUluZm8gPSBBQU1ETm9kZXMoKSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IE1ETm9kZSAqUmFuZ2VzID0gbnVsbHB0cik7CisgIFNEVmFsdWUgZ2V0TG9hZChJU0Q6Ok1lbUluZGV4ZWRNb2RlIEFNLCBJU0Q6OkxvYWRFeHRUeXBlIEV4dFR5cGUsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFNETG9jICZkbCwgU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBQdHIsIFNEVmFsdWUgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgRVZUIE1lbVZULCBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKTsKKworICAvLy8gSGVscGVyIGZ1bmN0aW9uIHRvIGJ1aWxkIElTRDo6U1RPUkUgbm9kZXMuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHNldCB0aGUgTU9TdG9yZSBmbGFnIG9uIE1NT0ZsYWdzLCBidXQgeW91IGNhbiBzZXQgaXQgaWYKKyAgLy8vIHlvdSB3YW50LiAgVGhlIE1PTG9hZCBhbmQgTU9JbnZhcmlhbnQgZmxhZ3MgbXVzdCBub3QgYmUgc2V0LgorICBTRFZhbHVlCisgIGdldFN0b3JlKFNEVmFsdWUgQ2hhaW4sIGNvbnN0IFNETG9jICZkbCwgU0RWYWx1ZSBWYWwsIFNEVmFsdWUgUHRyLAorICAgICAgICAgICBNYWNoaW5lUG9pbnRlckluZm8gUHRySW5mbywgdW5zaWduZWQgQWxpZ25tZW50ID0gMCwKKyAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQ6OkZsYWdzIE1NT0ZsYWdzID0gTWFjaGluZU1lbU9wZXJhbmQ6Ok1PTm9uZSwKKyAgICAgICAgICAgY29uc3QgQUFNRE5vZGVzICZBQUluZm8gPSBBQU1ETm9kZXMoKSk7CisgIFNEVmFsdWUgZ2V0U3RvcmUoU0RWYWx1ZSBDaGFpbiwgY29uc3QgU0RMb2MgJmRsLCBTRFZhbHVlIFZhbCwgU0RWYWx1ZSBQdHIsCisgICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisgIFNEVmFsdWUKKyAgZ2V0VHJ1bmNTdG9yZShTRFZhbHVlIENoYWluLCBjb25zdCBTRExvYyAmZGwsIFNEVmFsdWUgVmFsLCBTRFZhbHVlIFB0ciwKKyAgICAgICAgICAgICAgICBNYWNoaW5lUG9pbnRlckluZm8gUHRySW5mbywgRVZUIFRWVCwgdW5zaWduZWQgQWxpZ25tZW50ID0gMCwKKyAgICAgICAgICAgICAgICBNYWNoaW5lTWVtT3BlcmFuZDo6RmxhZ3MgTU1PRmxhZ3MgPSBNYWNoaW5lTWVtT3BlcmFuZDo6TU9Ob25lLAorICAgICAgICAgICAgICAgIGNvbnN0IEFBTUROb2RlcyAmQUFJbmZvID0gQUFNRE5vZGVzKCkpOworICBTRFZhbHVlIGdldFRydW5jU3RvcmUoU0RWYWx1ZSBDaGFpbiwgY29uc3QgU0RMb2MgJmRsLCBTRFZhbHVlIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgUHRyLCBFVlQgVFZULCBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKTsKKyAgU0RWYWx1ZSBnZXRJbmRleGVkU3RvcmUoU0RWYWx1ZSBPcmlnU3RvZSwgY29uc3QgU0RMb2MgJmRsLCBTRFZhbHVlIEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT2Zmc2V0LCBJU0Q6Ok1lbUluZGV4ZWRNb2RlIEFNKTsKKworICAvLy8gUmV0dXJucyBzdW0gb2YgdGhlIGJhc2UgcG9pbnRlciBhbmQgb2Zmc2V0LgorICBTRFZhbHVlIGdldE1lbUJhc2VQbHVzT2Zmc2V0KFNEVmFsdWUgQmFzZSwgdW5zaWduZWQgT2Zmc2V0LCBjb25zdCBTRExvYyAmREwpOworCisgIFNEVmFsdWUgZ2V0TWFza2VkTG9hZChFVlQgVlQsIGNvbnN0IFNETG9jICZkbCwgU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE1hc2ssIFNEVmFsdWUgU3JjMCwgRVZUIE1lbVZULAorICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTywgSVNEOjpMb2FkRXh0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNFeHBhbmRpbmcgPSBmYWxzZSk7CisgIFNEVmFsdWUgZ2V0TWFza2VkU3RvcmUoU0RWYWx1ZSBDaGFpbiwgY29uc3QgU0RMb2MgJmRsLCBTRFZhbHVlIFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFB0ciwgU0RWYWx1ZSBNYXNrLCBFVlQgTWVtVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTywgYm9vbCBJc1RydW5jYXRpbmcgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQ29tcHJlc3NpbmcgPSBmYWxzZSk7CisgIFNEVmFsdWUgZ2V0TWFza2VkR2F0aGVyKFNEVlRMaXN0IFZUcywgRVZUIFZULCBjb25zdCBTRExvYyAmZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNEVmFsdWU+IE9wcywgTWFjaGluZU1lbU9wZXJhbmQgKk1NTyk7CisgIFNEVmFsdWUgZ2V0TWFza2VkU2NhdHRlcihTRFZUTGlzdCBWVHMsIEVWVCBWVCwgY29uc3QgU0RMb2MgJmRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U0RWYWx1ZT4gT3BzLCBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKTsKKworICAvLy8gUmV0dXJuIChjcmVhdGUgYSBuZXcgb3IgZmluZCBleGlzdGluZykgYSB0YXJnZXQtc3BlY2lmaWMgbm9kZS4KKyAgLy8vIFRhcmdldE1lbVNETm9kZSBzaG91bGQgYmUgZGVyaXZlZCBjbGFzcyBmcm9tIE1lbVNETm9kZS4KKyAgdGVtcGxhdGUgPGNsYXNzIFRhcmdldE1lbVNETm9kZT4KKyAgU0RWYWx1ZSBnZXRUYXJnZXRNZW1TRE5vZGUoU0RWVExpc3QgVlRzLCBBcnJheVJlZjxTRFZhbHVlPiBPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNETG9jICZkbCwgRVZUIE1lbVZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKTsKKworICAvLy8gQ29uc3RydWN0IGEgbm9kZSB0byB0cmFjayBhIFZhbHVlKiB0aHJvdWdoIHRoZSBiYWNrZW5kLgorICBTRFZhbHVlIGdldFNyY1ZhbHVlKGNvbnN0IFZhbHVlICp2KTsKKworICAvLy8gUmV0dXJuIGFuIE1ETm9kZVNETm9kZSB3aGljaCBob2xkcyBhbiBNRE5vZGUuCisgIFNEVmFsdWUgZ2V0TUROb2RlKGNvbnN0IE1ETm9kZSAqTUQpOworCisgIC8vLyBSZXR1cm4gYSBiaXRjYXN0IHVzaW5nIHRoZSBTRExvYyBvZiB0aGUgdmFsdWUgb3BlcmFuZCwgYW5kIGNhc3RpbmcgdG8gdGhlCisgIC8vLyBwcm92aWRlZCB0eXBlLiBVc2UgZ2V0Tm9kZSB0byBzZXQgYSBjdXN0b20gU0RMb2MuCisgIFNEVmFsdWUgZ2V0Qml0Y2FzdChFVlQgVlQsIFNEVmFsdWUgVik7CisKKyAgLy8vIFJldHVybiBhbiBBZGRyU3BhY2VDYXN0U0ROb2RlLgorICBTRFZhbHVlIGdldEFkZHJTcGFjZUNhc3QoY29uc3QgU0RMb2MgJmRsLCBFVlQgVlQsIFNEVmFsdWUgUHRyLCB1bnNpZ25lZCBTcmNBUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RBUyk7CisKKyAgLy8vIFJldHVybiB0aGUgc3BlY2lmaWVkIHZhbHVlIGNhc3RlZCB0bworICAvLy8gdGhlIHRhcmdldCdzIGRlc2lyZWQgc2hpZnQgYW1vdW50IHR5cGUuCisgIFNEVmFsdWUgZ2V0U2hpZnRBbW91bnRPcGVyYW5kKEVWVCBMSFNUeSwgU0RWYWx1ZSBPcCk7CisKKyAgLy8vIEV4cGFuZCB0aGUgc3BlY2lmaWVkIFxjIElTRDo6VkFBUkcgbm9kZSBhcyB0aGUgTGVnYWxpemUgcGFzcyB3b3VsZC4KKyAgU0RWYWx1ZSBleHBhbmRWQUFyZyhTRE5vZGUgKk5vZGUpOworCisgIC8vLyBFeHBhbmQgdGhlIHNwZWNpZmllZCBcYyBJU0Q6OlZBQ09QWSBub2RlIGFzIHRoZSBMZWdhbGl6ZSBwYXNzIHdvdWxkLgorICBTRFZhbHVlIGV4cGFuZFZBQ29weShTRE5vZGUgKk5vZGUpOworCisgIC8vLyAqTXV0YXRlKiB0aGUgc3BlY2lmaWVkIG5vZGUgaW4tcGxhY2UgdG8gaGF2ZSB0aGUKKyAgLy8vIHNwZWNpZmllZCBvcGVyYW5kcy4gIElmIHRoZSByZXN1bHRhbnQgbm9kZSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgREFHLAorICAvLy8gdGhpcyBkb2VzIG5vdCBtb2RpZnkgdGhlIHNwZWNpZmllZCBub2RlLCBpbnN0ZWFkIGl0IHJldHVybnMgdGhlIG5vZGUgdGhhdAorICAvLy8gYWxyZWFkeSBleGlzdHMuICBJZiB0aGUgcmVzdWx0YW50IG5vZGUgZG9lcyBub3QgZXhpc3QgaW4gdGhlIERBRywgdGhlCisgIC8vLyBpbnB1dCBub2RlIGlzIHJldHVybmVkLiAgQXMgYSBkZWdlbmVyYXRlIGNhc2UsIGlmIHlvdSBzcGVjaWZ5IHRoZSBzYW1lCisgIC8vLyBpbnB1dCBvcGVyYW5kcyBhcyB0aGUgbm9kZSBhbHJlYWR5IGhhcywgdGhlIGlucHV0IG5vZGUgaXMgcmV0dXJuZWQuCisgIFNETm9kZSAqVXBkYXRlTm9kZU9wZXJhbmRzKFNETm9kZSAqTiwgU0RWYWx1ZSBPcCk7CisgIFNETm9kZSAqVXBkYXRlTm9kZU9wZXJhbmRzKFNETm9kZSAqTiwgU0RWYWx1ZSBPcDEsIFNEVmFsdWUgT3AyKTsKKyAgU0ROb2RlICpVcGRhdGVOb2RlT3BlcmFuZHMoU0ROb2RlICpOLCBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcDMpOworICBTRE5vZGUgKlVwZGF0ZU5vZGVPcGVyYW5kcyhTRE5vZGUgKk4sIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wMywgU0RWYWx1ZSBPcDQpOworICBTRE5vZGUgKlVwZGF0ZU5vZGVPcGVyYW5kcyhTRE5vZGUgKk4sIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wMywgU0RWYWx1ZSBPcDQsIFNEVmFsdWUgT3A1KTsKKyAgU0ROb2RlICpVcGRhdGVOb2RlT3BlcmFuZHMoU0ROb2RlICpOLCBBcnJheVJlZjxTRFZhbHVlPiBPcHMpOworCisgIC8vIFByb3BhZ2F0ZXMgdGhlIGNoYW5nZSBpbiBkaXZlcmdlbmNlIHRvIHVzZXJzCisgIHZvaWQgdXBkYXRlRGl2ZXJnZW5jZShTRE5vZGUgKiBOKTsKKworICAvLy8gVGhlc2UgYXJlIHVzZWQgZm9yIHRhcmdldCBzZWxlY3RvcnMgdG8gKm11dGF0ZSogdGhlCisgIC8vLyBzcGVjaWZpZWQgbm9kZSB0byBoYXZlIHRoZSBzcGVjaWZpZWQgcmV0dXJuIHR5cGUsIFRhcmdldCBvcGNvZGUsIGFuZAorICAvLy8gb3BlcmFuZHMuICBOb3RlIHRoYXQgdGFyZ2V0IG9wY29kZXMgYXJlIHN0b3JlZCBhcworICAvLy8gflRhcmdldE9wY29kZSBpbiB0aGUgbm9kZSBvcGNvZGUgZmllbGQuICBUaGUgcmVzdWx0YW50IG5vZGUgaXMgcmV0dXJuZWQuCisgIFNETm9kZSAqU2VsZWN0Tm9kZVRvKFNETm9kZSAqTiwgdW5zaWduZWQgVGFyZ2V0T3BjLCBFVlQgVlQpOworICBTRE5vZGUgKlNlbGVjdE5vZGVUbyhTRE5vZGUgKk4sIHVuc2lnbmVkIFRhcmdldE9wYywgRVZUIFZULCBTRFZhbHVlIE9wMSk7CisgIFNETm9kZSAqU2VsZWN0Tm9kZVRvKFNETm9kZSAqTiwgdW5zaWduZWQgVGFyZ2V0T3BjLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMik7CisgIFNETm9kZSAqU2VsZWN0Tm9kZVRvKFNETm9kZSAqTiwgdW5zaWduZWQgVGFyZ2V0T3BjLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMiwgU0RWYWx1ZSBPcDMpOworICBTRE5vZGUgKlNlbGVjdE5vZGVUbyhTRE5vZGUgKk4sIHVuc2lnbmVkIFRhcmdldE9wYywgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTRFZhbHVlPiBPcHMpOworICBTRE5vZGUgKlNlbGVjdE5vZGVUbyhTRE5vZGUgKk4sIHVuc2lnbmVkIFRhcmdldE9wYywgRVZUIFZUMSwgRVZUIFZUMik7CisgIFNETm9kZSAqU2VsZWN0Tm9kZVRvKFNETm9kZSAqTiwgdW5zaWduZWQgVGFyZ2V0T3BjLCBFVlQgVlQxLAorICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQyLCBBcnJheVJlZjxTRFZhbHVlPiBPcHMpOworICBTRE5vZGUgKlNlbGVjdE5vZGVUbyhTRE5vZGUgKk4sIHVuc2lnbmVkIFRhcmdldE9wYywgRVZUIFZUMSwKKyAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUMiwgRVZUIFZUMywgQXJyYXlSZWY8U0RWYWx1ZT4gT3BzKTsKKyAgU0ROb2RlICpTZWxlY3ROb2RlVG8oU0ROb2RlICpOLCB1bnNpZ25lZCBUYXJnZXRPcGMsIEVWVCBWVDEsCisgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVDIsIFNEVmFsdWUgT3AxKTsKKyAgU0ROb2RlICpTZWxlY3ROb2RlVG8oU0ROb2RlICpOLCB1bnNpZ25lZCBUYXJnZXRPcGMsIEVWVCBWVDEsCisgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVDIsIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMik7CisgIFNETm9kZSAqU2VsZWN0Tm9kZVRvKFNETm9kZSAqTiwgdW5zaWduZWQgVGFyZ2V0T3BjLCBTRFZUTGlzdCBWVHMsCisgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNEVmFsdWU+IE9wcyk7CisKKyAgLy8vIFRoaXMgKm11dGF0ZXMqIHRoZSBzcGVjaWZpZWQgbm9kZSB0byBoYXZlIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHJldHVybiB0eXBlLCBvcGNvZGUsIGFuZCBvcGVyYW5kcy4KKyAgU0ROb2RlICpNb3JwaE5vZGVUbyhTRE5vZGUgKk4sIHVuc2lnbmVkIE9wYywgU0RWVExpc3QgVlRzLAorICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNEVmFsdWU+IE9wcyk7CisKKyAgLy8vIE11dGF0ZSB0aGUgc3BlY2lmaWVkIHN0cmljdCBGUCBub2RlIHRvIGl0cyBub24tc3RyaWN0IGVxdWl2YWxlbnQsCisgIC8vLyB1bmxpbmtpbmcgdGhlIG5vZGUgZnJvbSBpdHMgY2hhaW4gYW5kIGRyb3BwaW5nIHRoZSBtZXRhZGF0YSBhcmd1bWVudHMuCisgIC8vLyBUaGUgbm9kZSBtdXN0IGJlIGEgc3RyaWN0IEZQIG5vZGUuCisgIFNETm9kZSAqbXV0YXRlU3RyaWN0RlBUb0ZQKFNETm9kZSAqTm9kZSk7CisKKyAgLy8vIFRoZXNlIGFyZSB1c2VkIGZvciB0YXJnZXQgc2VsZWN0b3JzIHRvIGNyZWF0ZSBhIG5ldyBub2RlCisgIC8vLyB3aXRoIHNwZWNpZmllZCByZXR1cm4gdHlwZShzKSwgTWFjaGluZUluc3RyIG9wY29kZSwgYW5kIG9wZXJhbmRzLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBnZXRNYWNoaW5lTm9kZSByZXR1cm5zIHRoZSByZXN1bHRhbnQgbm9kZS4gIElmIHRoZXJlIGlzIGFscmVhZHkKKyAgLy8vIGEgbm9kZSBvZiB0aGUgc3BlY2lmaWVkIG9wY29kZSBhbmQgb3BlcmFuZHMsIGl0IHJldHVybnMgdGhhdCBub2RlIGluc3RlYWQKKyAgLy8vIG9mIHRoZSBjdXJyZW50IG9uZS4KKyAgTWFjaGluZVNETm9kZSAqZ2V0TWFjaGluZU5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmZGwsIEVWVCBWVCk7CisgIE1hY2hpbmVTRE5vZGUgKmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJmRsLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AxKTsKKyAgTWFjaGluZVNETm9kZSAqZ2V0TWFjaGluZU5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmZGwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcDEsIFNEVmFsdWUgT3AyKTsKKyAgTWFjaGluZVNETm9kZSAqZ2V0TWFjaGluZU5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmZGwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcDEsIFNEVmFsdWUgT3AyLCBTRFZhbHVlIE9wMyk7CisgIE1hY2hpbmVTRE5vZGUgKmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJmRsLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNEVmFsdWU+IE9wcyk7CisgIE1hY2hpbmVTRE5vZGUgKmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJmRsLCBFVlQgVlQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQyLCBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIpOworICBNYWNoaW5lU0ROb2RlICpnZXRNYWNoaW5lTm9kZSh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFNETG9jICZkbCwgRVZUIFZUMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUMiwgU0RWYWx1ZSBPcDEsIFNEVmFsdWUgT3AyLCBTRFZhbHVlIE9wMyk7CisgIE1hY2hpbmVTRE5vZGUgKmdldE1hY2hpbmVOb2RlKHVuc2lnbmVkIE9wY29kZSwgY29uc3QgU0RMb2MgJmRsLCBFVlQgVlQxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgVlQyLCBBcnJheVJlZjxTRFZhbHVlPiBPcHMpOworICBNYWNoaW5lU0ROb2RlICpnZXRNYWNoaW5lTm9kZSh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFNETG9jICZkbCwgRVZUIFZUMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUMiwgRVZUIFZUMywgU0RWYWx1ZSBPcDEsIFNEVmFsdWUgT3AyKTsKKyAgTWFjaGluZVNETm9kZSAqZ2V0TWFjaGluZU5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmZGwsIEVWVCBWVDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVDIsIEVWVCBWVDMsIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcDMpOworICBNYWNoaW5lU0ROb2RlICpnZXRNYWNoaW5lTm9kZSh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFNETG9jICZkbCwgRVZUIFZUMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUMiwgRVZUIFZUMywgQXJyYXlSZWY8U0RWYWx1ZT4gT3BzKTsKKyAgTWFjaGluZVNETm9kZSAqZ2V0TWFjaGluZU5vZGUodW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmZGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEVWVD4gUmVzdWx0VHlzLCBBcnJheVJlZjxTRFZhbHVlPiBPcHMpOworICBNYWNoaW5lU0ROb2RlICpnZXRNYWNoaW5lTm9kZSh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFNETG9jICZkbCwgU0RWVExpc3QgVlRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTRFZhbHVlPiBPcHMpOworCisgIC8vLyBBIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBjcmVhdGluZyBUYXJnZXRJbnN0ckluZm86OkVYVFJBQ1RfU1VCUkVHIG5vZGVzLgorICBTRFZhbHVlIGdldFRhcmdldEV4dHJhY3RTdWJyZWcoaW50IFNSSWR4LCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3BlcmFuZCk7CisKKyAgLy8vIEEgY29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGNyZWF0aW5nIFRhcmdldEluc3RySW5mbzo6SU5TRVJUX1NVQlJFRyBub2Rlcy4KKyAgU0RWYWx1ZSBnZXRUYXJnZXRJbnNlcnRTdWJyZWcoaW50IFNSSWR4LCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcGVyYW5kLCBTRFZhbHVlIFN1YnJlZyk7CisKKyAgLy8vIEdldCB0aGUgc3BlY2lmaWVkIG5vZGUgaWYgaXQncyBhbHJlYWR5IGF2YWlsYWJsZSwgb3IgZWxzZSByZXR1cm4gTlVMTC4KKyAgU0ROb2RlICpnZXROb2RlSWZFeGlzdHModW5zaWduZWQgT3Bjb2RlLCBTRFZUTGlzdCBWVHMsIEFycmF5UmVmPFNEVmFsdWU+IE9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0ROb2RlRmxhZ3MgRmxhZ3MgPSBTRE5vZGVGbGFncygpKTsKKworICAvLy8gQ3JlYXRlcyBhIFNERGJnVmFsdWUgbm9kZS4KKyAgU0REYmdWYWx1ZSAqZ2V0RGJnVmFsdWUoRElWYXJpYWJsZSAqVmFyLCBESUV4cHJlc3Npb24gKkV4cHIsIFNETm9kZSAqTiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUiwgYm9vbCBJc0luZGlyZWN0LCBjb25zdCBEZWJ1Z0xvYyAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE8pOworCisgIC8vLyBDcmVhdGVzIGEgY29uc3RhbnQgU0REYmdWYWx1ZSBub2RlLgorICBTRERiZ1ZhbHVlICpnZXRDb25zdGFudERiZ1ZhbHVlKERJVmFyaWFibGUgKlZhciwgRElFeHByZXNzaW9uICpFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpDLCBjb25zdCBEZWJ1Z0xvYyAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTyk7CisKKyAgLy8vIENyZWF0ZXMgYSBGcmFtZUluZGV4IFNERGJnVmFsdWUgbm9kZS4KKyAgU0REYmdWYWx1ZSAqZ2V0RnJhbWVJbmRleERiZ1ZhbHVlKERJVmFyaWFibGUgKlZhciwgRElFeHByZXNzaW9uICpFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRkksIGNvbnN0IERlYnVnTG9jICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE8pOworCisgIC8vLyBUcmFuc2ZlciBkZWJ1ZyB2YWx1ZXMgZnJvbSBvbmUgbm9kZSB0byBhbm90aGVyLCB3aGlsZSBvcHRpb25hbGx5CisgIC8vLyBnZW5lcmF0aW5nIGZyYWdtZW50IGV4cHJlc3Npb25zIGZvciBzcGxpdC11cCB2YWx1ZXMuIElmIFxwIEludmFsaWRhdGVEYmcKKyAgLy8vIGlzIHNldCwgZGVidWcgdmFsdWVzIGFyZSBpbnZhbGlkYXRlZCBhZnRlciB0aGV5IGFyZSB0cmFuc2ZlcnJlZC4KKyAgdm9pZCB0cmFuc2ZlckRiZ1ZhbHVlcyhTRFZhbHVlIEZyb20sIFNEVmFsdWUgVG8sIHVuc2lnbmVkIE9mZnNldEluQml0cyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZUluQml0cyA9IDAsIGJvb2wgSW52YWxpZGF0ZURiZyA9IHRydWUpOworCisgIC8vLyBSZW1vdmUgdGhlIHNwZWNpZmllZCBub2RlIGZyb20gdGhlIHN5c3RlbS4gSWYgYW55IG9mIGl0cworICAvLy8gb3BlcmFuZHMgdGhlbiBiZWNvbWVzIGRlYWQsIHJlbW92ZSB0aGVtIGFzIHdlbGwuIEluZm9ybSBVcGRhdGVMaXN0ZW5lcgorICAvLy8gZm9yIGVhY2ggbm9kZSBkZWxldGVkLgorICB2b2lkIFJlbW92ZURlYWROb2RlKFNETm9kZSAqTik7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGRlbGV0ZXMgdGhlIHVucmVhY2hhYmxlIG5vZGVzIGluIHRoZQorICAvLy8gZ2l2ZW4gbGlzdCwgYW5kIGFueSBub2RlcyB0aGF0IGJlY29tZSB1bnJlYWNoYWJsZSBhcyBhIHJlc3VsdC4KKyAgdm9pZCBSZW1vdmVEZWFkTm9kZXMoU21hbGxWZWN0b3JJbXBsPFNETm9kZSAqPiAmRGVhZE5vZGVzKTsKKworICAvLy8gTW9kaWZ5IGFueXRoaW5nIHVzaW5nICdGcm9tJyB0byB1c2UgJ1RvJyBpbnN0ZWFkLgorICAvLy8gVGhpcyBjYW4gY2F1c2UgcmVjdXJzaXZlIG1lcmdpbmcgb2Ygbm9kZXMgaW4gdGhlIERBRy4gIFVzZSB0aGUgZmlyc3QKKyAgLy8vIHZlcnNpb24gaWYgJ0Zyb20nIGlzIGtub3duIHRvIGhhdmUgYSBzaW5nbGUgcmVzdWx0LCB1c2UgdGhlIHNlY29uZAorICAvLy8gaWYgeW91IGhhdmUgdHdvIG5vZGVzIHdpdGggaWRlbnRpY2FsIHJlc3VsdHMgKG9yIGlmICdUbycgaGFzIGEgc3VwZXJzZXQKKyAgLy8vIG9mIHRoZSByZXN1bHRzIG9mICdGcm9tJyksIHVzZSB0aGUgdGhpcmQgb3RoZXJ3aXNlLgorICAvLy8KKyAgLy8vIFRoZXNlIG1ldGhvZHMgYWxsIHRha2UgYW4gb3B0aW9uYWwgVXBkYXRlTGlzdGVuZXIsIHdoaWNoIChpZiBub3QgbnVsbCkgaXMKKyAgLy8vIGluZm9ybWVkIGFib3V0IG5vZGVzIHRoYXQgYXJlIGRlbGV0ZWQgYW5kIG1vZGlmaWVkIGR1ZSB0byByZWN1cnNpdmUKKyAgLy8vIGNoYW5nZXMgaW4gdGhlIGRhZy4KKyAgLy8vCisgIC8vLyBUaGVzZSBmdW5jdGlvbnMgb25seSByZXBsYWNlIGFsbCBleGlzdGluZyB1c2VzLiBJdCdzIHBvc3NpYmxlIHRoYXQgYXMKKyAgLy8vIHRoZXNlIHJlcGxhY2VtZW50cyBhcmUgYmVpbmcgcGVyZm9ybWVkLCBDU0UgbWF5IGNhdXNlIHRoZSBGcm9tIG5vZGUKKyAgLy8vIHRvIGJlIGdpdmVuIG5ldyB1c2VzLiBUaGVzZSBuZXcgdXNlcyBvZiBGcm9tIGFyZSBsZWZ0IGluIHBsYWNlLCBhbmQKKyAgLy8vIG5vdCBhdXRvbWF0aWNhbGx5IHRyYW5zZmVycmVkIHRvIFRvLgorICAvLy8KKyAgdm9pZCBSZXBsYWNlQWxsVXNlc1dpdGgoU0RWYWx1ZSBGcm9tLCBTRFZhbHVlIE9wKTsKKyAgdm9pZCBSZXBsYWNlQWxsVXNlc1dpdGgoU0ROb2RlICpGcm9tLCBTRE5vZGUgKlRvKTsKKyAgdm9pZCBSZXBsYWNlQWxsVXNlc1dpdGgoU0ROb2RlICpGcm9tLCBjb25zdCBTRFZhbHVlICpUbyk7CisKKyAgLy8vIFJlcGxhY2UgYW55IHVzZXMgb2YgRnJvbSB3aXRoIFRvLCBsZWF2aW5nCisgIC8vLyB1c2VzIG9mIG90aGVyIHZhbHVlcyBwcm9kdWNlZCBieSBGcm9tLmdldE5vZGUoKSBhbG9uZS4KKyAgdm9pZCBSZXBsYWNlQWxsVXNlc09mVmFsdWVXaXRoKFNEVmFsdWUgRnJvbSwgU0RWYWx1ZSBUbyk7CisKKyAgLy8vIExpa2UgUmVwbGFjZUFsbFVzZXNPZlZhbHVlV2l0aCwgYnV0IGZvciBtdWx0aXBsZSB2YWx1ZXMgYXQgb25jZS4KKyAgLy8vIFRoaXMgY29ycmVjdGx5IGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUKKyAgLy8vIHRoZXJlIGlzIGFuIG92ZXJsYXAgYmV0d2VlbiB0aGUgRnJvbSB2YWx1ZXMgYW5kIHRoZSBUbyB2YWx1ZXMuCisgIHZvaWQgUmVwbGFjZUFsbFVzZXNPZlZhbHVlc1dpdGgoY29uc3QgU0RWYWx1ZSAqRnJvbSwgY29uc3QgU0RWYWx1ZSAqVG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtKTsKKworICAvLy8gSWYgYW4gZXhpc3RpbmcgbG9hZCBoYXMgdXNlcyBvZiBpdHMgY2hhaW4sIGNyZWF0ZSBhIHRva2VuIGZhY3RvciBub2RlIHdpdGgKKyAgLy8vIHRoYXQgY2hhaW4gYW5kIHRoZSBuZXcgbWVtb3J5IG5vZGUncyBjaGFpbiBhbmQgdXBkYXRlIHVzZXJzIG9mIHRoZSBvbGQKKyAgLy8vIGNoYWluIHRvIHRoZSB0b2tlbiBmYWN0b3IuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZSBuZXcgbWVtb3J5IG5vZGUgd2lsbCBoYXZlCisgIC8vLyB0aGUgc2FtZSByZWxhdGl2ZSBtZW1vcnkgZGVwZW5kZW5jeSBwb3NpdGlvbiBhcyB0aGUgb2xkIGxvYWQuIFJldHVybnMgdGhlCisgIC8vLyBuZXcgbWVyZ2VkIGxvYWQgY2hhaW4uCisgIFNEVmFsdWUgbWFrZUVxdWl2YWxlbnRNZW1vcnlPcmRlcmluZyhMb2FkU0ROb2RlICpPbGQsIFNEVmFsdWUgTmV3KTsKKworICAvLy8gVG9wb2xvZ2ljYWwtc29ydCB0aGUgQWxsTm9kZXMgbGlzdCBhbmQgYQorICAvLy8gYXNzaWduIGEgdW5pcXVlIG5vZGUgaWQgZm9yIGVhY2ggbm9kZSBpbiB0aGUgREFHIGJhc2VkIG9uIHRoZWlyCisgIC8vLyB0b3BvbG9naWNhbCBvcmRlci4gUmV0dXJucyB0aGUgbnVtYmVyIG9mIG5vZGVzLgorICB1bnNpZ25lZCBBc3NpZ25Ub3BvbG9naWNhbE9yZGVyKCk7CisKKyAgLy8vIE1vdmUgbm9kZSBOIGluIHRoZSBBbGxOb2RlcyBsaXN0IHRvIGJlIGltbWVkaWF0ZWx5CisgIC8vLyBiZWZvcmUgdGhlIGdpdmVuIGl0ZXJhdG9yIFBvc2l0aW9uLiBUaGlzIG1heSBiZSB1c2VkIHRvIHVwZGF0ZSB0aGUKKyAgLy8vIHRvcG9sb2dpY2FsIG9yZGVyaW5nIHdoZW4gdGhlIGxpc3Qgb2Ygbm9kZXMgaXMgbW9kaWZpZWQuCisgIHZvaWQgUmVwb3NpdGlvbk5vZGUoYWxsbm9kZXNfaXRlcmF0b3IgUG9zaXRpb24sIFNETm9kZSAqTikgeworICAgIEFsbE5vZGVzLmluc2VydChQb3NpdGlvbiwgQWxsTm9kZXMucmVtb3ZlKE4pKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGFuIEFQRmxvYXQgc2VtYW50aWNzIHRhZyBhcHByb3ByaWF0ZSBmb3IgdGhlIGdpdmVuIHR5cGUuIElmIFZUIGlzCisgIC8vLyBhIHZlY3RvciB0eXBlLCB0aGUgZWxlbWVudCBzZW1hbnRpY3MgYXJlIHJldHVybmVkLgorICBzdGF0aWMgY29uc3QgZmx0U2VtYW50aWNzICZFVlRUb0FQRmxvYXRTZW1hbnRpY3MoRVZUIFZUKSB7CisgICAgc3dpdGNoIChWVC5nZXRTY2FsYXJUeXBlKCkuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeSkgeworICAgIGRlZmF1bHQ6IGxsdm1fdW5yZWFjaGFibGUoIlVua25vd24gRlAgZm9ybWF0Iik7CisgICAgY2FzZSBNVlQ6OmYxNjogICAgIHJldHVybiBBUEZsb2F0OjpJRUVFaGFsZigpOworICAgIGNhc2UgTVZUOjpmMzI6ICAgICByZXR1cm4gQVBGbG9hdDo6SUVFRXNpbmdsZSgpOworICAgIGNhc2UgTVZUOjpmNjQ6ICAgICByZXR1cm4gQVBGbG9hdDo6SUVFRWRvdWJsZSgpOworICAgIGNhc2UgTVZUOjpmODA6ICAgICByZXR1cm4gQVBGbG9hdDo6eDg3RG91YmxlRXh0ZW5kZWQoKTsKKyAgICBjYXNlIE1WVDo6ZjEyODogICAgcmV0dXJuIEFQRmxvYXQ6OklFRUVxdWFkKCk7CisgICAgY2FzZSBNVlQ6OnBwY2YxMjg6IHJldHVybiBBUEZsb2F0OjpQUENEb3VibGVEb3VibGUoKTsKKyAgICB9CisgIH0KKworICAvLy8gQWRkIGEgZGJnX3ZhbHVlIFNETm9kZS4gSWYgU0QgaXMgbm9uLW51bGwgdGhhdCBtZWFucyB0aGUKKyAgLy8vIHZhbHVlIGlzIHByb2R1Y2VkIGJ5IFNELgorICB2b2lkIEFkZERiZ1ZhbHVlKFNERGJnVmFsdWUgKkRCLCBTRE5vZGUgKlNELCBib29sIGlzUGFyYW1ldGVyKTsKKworICAvLy8gR2V0IHRoZSBkZWJ1ZyB2YWx1ZXMgd2hpY2ggcmVmZXJlbmNlIHRoZSBnaXZlbiBTRE5vZGUuCisgIEFycmF5UmVmPFNERGJnVmFsdWUqPiBHZXREYmdWYWx1ZXMoY29uc3QgU0ROb2RlKiBTRCkgeworICAgIHJldHVybiBEYmdJbmZvLT5nZXRTRERiZ1ZhbHVlcyhTRCk7CisgIH0KKworcHVibGljOgorICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlcmUgYXJlIGFueSBTRERiZ1ZhbHVlIG5vZGVzIGFzc29jaWF0ZWQKKyAgLy8vIHdpdGggdGhpcyBTZWxlY3Rpb25EQUcuCisgIGJvb2wgaGFzRGVidWdWYWx1ZXMoKSBjb25zdCB7IHJldHVybiAhRGJnSW5mby0+ZW1wdHkoKTsgfQorCisgIFNERGJnSW5mbzo6RGJnSXRlcmF0b3IgRGJnQmVnaW4oKSB7IHJldHVybiBEYmdJbmZvLT5EYmdCZWdpbigpOyB9CisgIFNERGJnSW5mbzo6RGJnSXRlcmF0b3IgRGJnRW5kKCkgICB7IHJldHVybiBEYmdJbmZvLT5EYmdFbmQoKTsgfQorCisgIFNERGJnSW5mbzo6RGJnSXRlcmF0b3IgQnl2YWxQYXJtRGJnQmVnaW4oKSB7CisgICAgcmV0dXJuIERiZ0luZm8tPkJ5dmFsUGFybURiZ0JlZ2luKCk7CisgIH0KKworICBTRERiZ0luZm86OkRiZ0l0ZXJhdG9yIEJ5dmFsUGFybURiZ0VuZCgpICAgeworICAgIHJldHVybiBEYmdJbmZvLT5CeXZhbFBhcm1EYmdFbmQoKTsKKyAgfQorCisgIC8vLyBUbyBiZSBpbnZva2VkIG9uIGFuIFNETm9kZSB0aGF0IGlzIHNsYXRlZCB0byBiZSBlcmFzZWQuIFRoaXMKKyAgLy8vIGZ1bmN0aW9uIG1pcnJvcnMgXGMgbGx2bTo6c2FsdmFnZURlYnVnSW5mby4KKyAgdm9pZCBzYWx2YWdlRGVidWdJbmZvKFNETm9kZSAmTik7CisKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8vIENyZWF0ZSBhIHN0YWNrIHRlbXBvcmFyeSwgc3VpdGFibGUgZm9yIGhvbGRpbmcgdGhlIHNwZWNpZmllZCB2YWx1ZSB0eXBlLgorICAvLy8gSWYgbWluQWxpZ24gaXMgc3BlY2lmaWVkLCB0aGUgc2xvdCBzaXplIHdpbGwgaGF2ZSBhdCBsZWFzdCB0aGF0IGFsaWdubWVudC4KKyAgU0RWYWx1ZSBDcmVhdGVTdGFja1RlbXBvcmFyeShFVlQgVlQsIHVuc2lnbmVkIG1pbkFsaWduID0gMSk7CisKKyAgLy8vIENyZWF0ZSBhIHN0YWNrIHRlbXBvcmFyeSBzdWl0YWJsZSBmb3IgaG9sZGluZyBlaXRoZXIgb2YgdGhlIHNwZWNpZmllZAorICAvLy8gdmFsdWUgdHlwZXMuCisgIFNEVmFsdWUgQ3JlYXRlU3RhY2tUZW1wb3JhcnkoRVZUIFZUMSwgRVZUIFZUMik7CisKKyAgU0RWYWx1ZSBGb2xkU3ltYm9sT2Zmc2V0KHVuc2lnbmVkIE9wY29kZSwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR2xvYmFsQWRkcmVzc1NETm9kZSAqR0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRE5vZGUgKk4yKTsKKworICBTRFZhbHVlIEZvbGRDb25zdGFudEFyaXRobWV0aWModW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNETm9kZSAqQ3N0MSwgU0ROb2RlICpDc3QyKTsKKworICBTRFZhbHVlIEZvbGRDb25zdGFudEFyaXRobWV0aWModW5zaWduZWQgT3Bjb2RlLCBjb25zdCBTRExvYyAmREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnN0YW50U0ROb2RlICpDc3QxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29uc3RhbnRTRE5vZGUgKkNzdDIpOworCisgIFNEVmFsdWUgRm9sZENvbnN0YW50VmVjdG9yQXJpdGhtZXRpYyh1bnNpZ25lZCBPcGNvZGUsIGNvbnN0IFNETG9jICZETCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U0RWYWx1ZT4gT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0ROb2RlRmxhZ3MgRmxhZ3MgPSBTRE5vZGVGbGFncygpKTsKKworICAvLy8gQ29uc3RhbnQgZm9sZCBhIHNldGNjIHRvIHRydWUgb3IgZmFsc2UuCisgIFNEVmFsdWUgRm9sZFNldENDKEVWVCBWVCwgU0RWYWx1ZSBOMSwgU0RWYWx1ZSBOMiwgSVNEOjpDb25kQ29kZSBDb25kLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBTRExvYyAmZGwpOworCisgIC8vLyBTZWUgaWYgdGhlIHNwZWNpZmllZCBvcGVyYW5kIGNhbiBiZSBzaW1wbGlmaWVkIHdpdGggdGhlIGtub3dsZWRnZSB0aGF0IG9ubHkKKyAgLy8vIHRoZSBiaXRzIHNwZWNpZmllZCBieSBNYXNrIGFyZSB1c2VkLiAgSWYgc28sIHJldHVybiB0aGUgc2ltcGxlciBvcGVyYW5kLAorICAvLy8gb3RoZXJ3aXNlIHJldHVybiBhIG51bGwgU0RWYWx1ZS4KKyAgLy8vCisgIC8vLyAoVGhpcyBleGlzdHMgYWxvbmdzaWRlIFNpbXBsaWZ5RGVtYW5kZWRCaXRzIGJlY2F1c2UgR2V0RGVtYW5kZWRCaXRzIGNhbgorICAvLy8gc2ltcGxpZnkgbm9kZXMgd2l0aCBtdWx0aXBsZSB1c2VzIG1vcmUgYWdncmVzc2l2ZWx5LikKKyAgU0RWYWx1ZSBHZXREZW1hbmRlZEJpdHMoU0RWYWx1ZSBWLCBjb25zdCBBUEludCAmTWFzayk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzaWduIGJpdCBvZiBPcCBpcyBrbm93biB0byBiZSB6ZXJvLgorICAvLy8gV2UgdXNlIHRoaXMgcHJlZGljYXRlIHRvIHNpbXBsaWZ5IG9wZXJhdGlvbnMgZG93bnN0cmVhbS4KKyAgYm9vbCBTaWduQml0SXNaZXJvKFNEVmFsdWUgT3AsIHVuc2lnbmVkIERlcHRoID0gMCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmICdPcCAmIE1hc2snIGlzIGtub3duIHRvIGJlIHplcm8uICBXZQorICAvLy8gdXNlIHRoaXMgcHJlZGljYXRlIHRvIHNpbXBsaWZ5IG9wZXJhdGlvbnMgZG93bnN0cmVhbS4gIE9wIGFuZCBNYXNrIGFyZQorICAvLy8ga25vd24gdG8gYmUgdGhlIHNhbWUgdHlwZS4KKyAgYm9vbCBNYXNrZWRWYWx1ZUlzWmVybyhTRFZhbHVlIE9wLCBjb25zdCBBUEludCAmTWFzaywgdW5zaWduZWQgRGVwdGggPSAwKQorICAgIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmUgd2hpY2ggYml0cyBvZiBPcCBhcmUga25vd24gdG8gYmUgZWl0aGVyIHplcm8gb3Igb25lIGFuZCByZXR1cm4KKyAgLy8vIHRoZW0gaW4gS25vd24uIEZvciB2ZWN0b3JzLCB0aGUga25vd24gYml0cyBhcmUgdGhvc2UgdGhhdCBhcmUgc2hhcmVkIGJ5CisgIC8vLyBldmVyeSB2ZWN0b3IgZWxlbWVudC4KKyAgLy8vIFRhcmdldHMgY2FuIGltcGxlbWVudCB0aGUgY29tcHV0ZUtub3duQml0c0ZvclRhcmdldE5vZGUgbWV0aG9kIGluIHRoZQorICAvLy8gVGFyZ2V0TG93ZXJpbmcgY2xhc3MgdG8gYWxsb3cgdGFyZ2V0IG5vZGVzIHRvIGJlIHVuZGVyc3Rvb2QuCisgIHZvaWQgY29tcHV0ZUtub3duQml0cyhTRFZhbHVlIE9wLCBLbm93bkJpdHMgJktub3duLCB1bnNpZ25lZCBEZXB0aCA9IDApIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmUgd2hpY2ggYml0cyBvZiBPcCBhcmUga25vd24gdG8gYmUgZWl0aGVyIHplcm8gb3Igb25lIGFuZCByZXR1cm4KKyAgLy8vIHRoZW0gaW4gS25vd24uIFRoZSBEZW1hbmRlZEVsdHMgYXJndW1lbnQgYWxsb3dzIHVzIHRvIG9ubHkgY29sbGVjdCB0aGUKKyAgLy8vIGtub3duIGJpdHMgdGhhdCBhcmUgc2hhcmVkIGJ5IHRoZSByZXF1ZXN0ZWQgdmVjdG9yIGVsZW1lbnRzLgorICAvLy8gVGFyZ2V0cyBjYW4gaW1wbGVtZW50IHRoZSBjb21wdXRlS25vd25CaXRzRm9yVGFyZ2V0Tm9kZSBtZXRob2QgaW4gdGhlCisgIC8vLyBUYXJnZXRMb3dlcmluZyBjbGFzcyB0byBhbGxvdyB0YXJnZXQgbm9kZXMgdG8gYmUgdW5kZXJzdG9vZC4KKyAgdm9pZCBjb21wdXRlS25vd25CaXRzKFNEVmFsdWUgT3AsIEtub3duQml0cyAmS25vd24sIGNvbnN0IEFQSW50ICZEZW1hbmRlZEVsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDApIGNvbnN0OworCisgIC8vLyBVc2VkIHRvIHJlcHJlc2VudCB0aGUgcG9zc2libGUgb3ZlcmZsb3cgYmVoYXZpb3Igb2YgYW4gb3BlcmF0aW9uLgorICAvLy8gTmV2ZXI6IHRoZSBvcGVyYXRpb24gY2Fubm90IG92ZXJmbG93LgorICAvLy8gQWx3YXlzOiB0aGUgb3BlcmF0aW9uIHdpbGwgYWx3YXlzIG92ZXJmbG93LgorICAvLy8gU29tZXRpbWU6IHRoZSBvcGVyYXRpb24gbWF5IG9yIG1heSBub3Qgb3ZlcmZsb3cuCisgIGVudW0gT3ZlcmZsb3dLaW5kIHsKKyAgICBPRktfTmV2ZXIsCisgICAgT0ZLX1NvbWV0aW1lLAorICAgIE9GS19BbHdheXMsCisgIH07CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgcmVzdWx0IG9mIHRoZSBhZGRpdGlvbiBvZiAyIG5vZGUgY2FuIG92ZXJmbG93LgorICBPdmVyZmxvd0tpbmQgY29tcHV0ZU92ZXJmbG93S2luZChTRFZhbHVlIE4wLCBTRFZhbHVlIE4xKSBjb25zdDsKKworICAvLy8gVGVzdCBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMga25vd24gdG8gaGF2ZSBleGFjdGx5IG9uZSBiaXQgc2V0LiBUaGlzIGRpZmZlcnMKKyAgLy8vIGZyb20gY29tcHV0ZUtub3duQml0cyBpbiB0aGF0IGl0IGRvZXNuJ3QgbmVjZXNzYXJpbHkgZGV0ZXJtaW5lIHdoaWNoIGJpdAorICAvLy8gaXMgc2V0LgorICBib29sIGlzS25vd25Ub0JlQVBvd2VyT2ZUd28oU0RWYWx1ZSBWYWwpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgc2lnbiBiaXQgb2YgdGhlIHJlZ2lzdGVyIGlzIHJlcGxpY2F0ZWQgaW50bworICAvLy8gdGhlIG90aGVyIGJpdHMuIFdlIGtub3cgdGhhdCBhdCBsZWFzdCAxIGJpdCBpcyBhbHdheXMgZXF1YWwgdG8gdGhlIHNpZ24KKyAgLy8vIGJpdCAoaXRzZWxmKSwgYnV0IG90aGVyIGNhc2VzIGNhbiBnaXZlIHVzIGluZm9ybWF0aW9uLiBGb3IgZXhhbXBsZSwKKyAgLy8vIGltbWVkaWF0ZWx5IGFmdGVyIGFuICJTUkEgWCwgMiIsIHdlIGtub3cgdGhhdCB0aGUgdG9wIDMgYml0cyBhcmUgYWxsIGVxdWFsCisgIC8vLyB0byBlYWNoIG90aGVyLCBzbyB3ZSByZXR1cm4gMy4gVGFyZ2V0cyBjYW4gaW1wbGVtZW50IHRoZQorICAvLy8gQ29tcHV0ZU51bVNpZ25CaXRzRm9yVGFyZ2V0IG1ldGhvZCBpbiB0aGUgVGFyZ2V0TG93ZXJpbmcgY2xhc3MgdG8gYWxsb3cKKyAgLy8vIHRhcmdldCBub2RlcyB0byBiZSB1bmRlcnN0b29kLgorICB1bnNpZ25lZCBDb21wdXRlTnVtU2lnbkJpdHMoU0RWYWx1ZSBPcCwgdW5zaWduZWQgRGVwdGggPSAwKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHNpZ24gYml0IG9mIHRoZSByZWdpc3RlciBpcyByZXBsaWNhdGVkIGludG8KKyAgLy8vIHRoZSBvdGhlciBiaXRzLiBXZSBrbm93IHRoYXQgYXQgbGVhc3QgMSBiaXQgaXMgYWx3YXlzIGVxdWFsIHRvIHRoZSBzaWduCisgIC8vLyBiaXQgKGl0c2VsZiksIGJ1dCBvdGhlciBjYXNlcyBjYW4gZ2l2ZSB1cyBpbmZvcm1hdGlvbi4gRm9yIGV4YW1wbGUsCisgIC8vLyBpbW1lZGlhdGVseSBhZnRlciBhbiAiU1JBIFgsIDIiLCB3ZSBrbm93IHRoYXQgdGhlIHRvcCAzIGJpdHMgYXJlIGFsbCBlcXVhbAorICAvLy8gdG8gZWFjaCBvdGhlciwgc28gd2UgcmV0dXJuIDMuIFRoZSBEZW1hbmRlZEVsdHMgYXJndW1lbnQgYWxsb3dzCisgIC8vLyB1cyB0byBvbmx5IGNvbGxlY3QgdGhlIG1pbmltdW0gc2lnbiBiaXRzIG9mIHRoZSByZXF1ZXN0ZWQgdmVjdG9yIGVsZW1lbnRzLgorICAvLy8gVGFyZ2V0cyBjYW4gaW1wbGVtZW50IHRoZSBDb21wdXRlTnVtU2lnbkJpdHNGb3JUYXJnZXQgbWV0aG9kIGluIHRoZQorICAvLy8gVGFyZ2V0TG93ZXJpbmcgY2xhc3MgdG8gYWxsb3cgdGFyZ2V0IG5vZGVzIHRvIGJlIHVuZGVyc3Rvb2QuCisgIHVuc2lnbmVkIENvbXB1dGVOdW1TaWduQml0cyhTRFZhbHVlIE9wLCBjb25zdCBBUEludCAmRGVtYW5kZWRFbHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBvcGVyYW5kIGlzIGFuIElTRDo6QUREIHdpdGggYSBDb25zdGFudFNETm9kZQorICAvLy8gb24gdGhlIHJpZ2h0LWhhbmQgc2lkZSwgb3IgaWYgaXQgaXMgYW4gSVNEOjpPUiB3aXRoIGEgQ29uc3RhbnRTRE5vZGUgdGhhdAorICAvLy8gaXMgZ3VhcmFudGVlZCB0byBoYXZlIHRoZSBzYW1lIHNlbWFudGljcyBhcyBhbiBBREQuIFRoaXMgaGFuZGxlcyB0aGUKKyAgLy8vIGVxdWl2YWxlbmNlOgorICAvLy8gICAgIFh8Q3N0ID09IFgrQ3N0IGlmZiBYJkNzdCA9IDAuCisgIGJvb2wgaXNCYXNlV2l0aENvbnN0YW50T2Zmc2V0KFNEVmFsdWUgT3ApIGNvbnN0OworCisgIC8vLyBUZXN0IHdoZXRoZXIgdGhlIGdpdmVuIFNEVmFsdWUgaXMga25vd24gdG8gbmV2ZXIgYmUgTmFOLgorICBib29sIGlzS25vd25OZXZlck5hTihTRFZhbHVlIE9wKSBjb25zdDsKKworICAvLy8gVGVzdCB3aGV0aGVyIHRoZSBnaXZlbiBTRFZhbHVlIGlzIGtub3duIHRvIG5ldmVyIGJlIHBvc2l0aXZlIG9yIG5lZ2F0aXZlCisgIC8vLyB6ZXJvLgorICBib29sIGlzS25vd25OZXZlclplcm8oU0RWYWx1ZSBPcCkgY29uc3Q7CisKKyAgLy8vIFRlc3Qgd2hldGhlciB0d28gU0RWYWx1ZXMgYXJlIGtub3duIHRvIGNvbXBhcmUgZXF1YWwuIFRoaXMKKyAgLy8vIGlzIHRydWUgaWYgdGhleSBhcmUgdGhlIHNhbWUgdmFsdWUsIG9yIGlmIG9uZSBpcyBuZWdhdGl2ZSB6ZXJvIGFuZCB0aGUKKyAgLy8vIG90aGVyIHBvc2l0aXZlIHplcm8uCisgIGJvb2wgaXNFcXVhbFRvKFNEVmFsdWUgQSwgU0RWYWx1ZSBCKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgQSBhbmQgQiBoYXZlIG5vIGNvbW1vbiBiaXRzIHNldC4gQXMgYW4gZXhhbXBsZSwgdGhpcyBjYW4KKyAgLy8vIGFsbG93IGFuICdhZGQnIHRvIGJlIHRyYW5zZm9ybWVkIGludG8gYW4gJ29yJy4KKyAgYm9vbCBoYXZlTm9Db21tb25CaXRzU2V0KFNEVmFsdWUgQSwgU0RWYWx1ZSBCKSBjb25zdDsKKworICAvLy8gVXRpbGl0eSBmdW5jdGlvbiB1c2VkIGJ5IGxlZ2FsaXplIGFuZCBsb3dlcmluZyB0bworICAvLy8gInVucm9sbCIgYSB2ZWN0b3Igb3BlcmF0aW9uIGJ5IHNwbGl0dGluZyBvdXQgdGhlIHNjYWxhcnMgYW5kIG9wZXJhdGluZworICAvLy8gb24gZWFjaCBlbGVtZW50IGluZGl2aWR1YWxseS4gIElmIHRoZSBSZXNORSBpcyAwLCBmdWxseSB1bnJvbGwgdGhlIHZlY3RvcgorICAvLy8gb3AuIElmIFJlc05FIGlzIGxlc3MgdGhhbiB0aGUgd2lkdGggb2YgdGhlIHZlY3RvciBvcCwgdW5yb2xsIHVwIHRvIFJlc05FLgorICAvLy8gSWYgdGhlICBSZXNORSBpcyBncmVhdGVyIHRoYW4gdGhlIHdpZHRoIG9mIHRoZSB2ZWN0b3Igb3AsIHVucm9sbCB0aGUKKyAgLy8vIHZlY3RvciBvcCBhbmQgZmlsbCB0aGUgZW5kIG9mIHRoZSByZXN1bHRpbmcgdmVjdG9yIHdpdGggVU5ERUZTLgorICBTRFZhbHVlIFVucm9sbFZlY3Rvck9wKFNETm9kZSAqTiwgdW5zaWduZWQgUmVzTkUgPSAwKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgbG9hZHMgYXJlIG5leHQgdG8gZWFjaCBvdGhlciBhbmQgY2FuIGJlCisgIC8vLyBtZXJnZWQuIENoZWNrIHRoYXQgYm90aCBhcmUgbm9udm9sYXRpbGUgYW5kIGlmIExEIGlzIGxvYWRpbmcKKyAgLy8vICdCeXRlcycgYnl0ZXMgZnJvbSBhIGxvY2F0aW9uIHRoYXQgaXMgJ0Rpc3QnIHVuaXRzIGF3YXkgZnJvbSB0aGUKKyAgLy8vIGxvY2F0aW9uIHRoYXQgdGhlICdCYXNlJyBsb2FkIGlzIGxvYWRpbmcgZnJvbS4KKyAgYm9vbCBhcmVOb25Wb2xhdGlsZUNvbnNlY3V0aXZlTG9hZHMoTG9hZFNETm9kZSAqTEQsIExvYWRTRE5vZGUgKkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJ5dGVzLCBpbnQgRGlzdCkgY29uc3Q7CisKKyAgLy8vIEluZmVyIGFsaWdubWVudCBvZiBhIGxvYWQgLyBzdG9yZSBhZGRyZXNzLiBSZXR1cm4gMCBpZgorICAvLy8gaXQgY2Fubm90IGJlIGluZmVycmVkLgorICB1bnNpZ25lZCBJbmZlclB0ckFsaWdubWVudChTRFZhbHVlIFB0cikgY29uc3Q7CisKKyAgLy8vIENvbXB1dGUgdGhlIFZUcyBuZWVkZWQgZm9yIHRoZSBsb3cvaGkgcGFydHMgb2YgYSB0eXBlCisgIC8vLyB3aGljaCBpcyBzcGxpdCAob3IgZXhwYW5kZWQpIGludG8gdHdvIG5vdCBuZWNlc3NhcmlseSBpZGVudGljYWwgcGllY2VzLgorICBzdGQ6OnBhaXI8RVZULCBFVlQ+IEdldFNwbGl0RGVzdFZUcyhjb25zdCBFVlQgJlZUKSBjb25zdDsKKworICAvLy8gU3BsaXQgdGhlIHZlY3RvciB3aXRoIEVYVFJBQ1RfU1VCVkVDVE9SIHVzaW5nIHRoZSBwcm92aWRlcworICAvLy8gVlRzIGFuZCByZXR1cm4gdGhlIGxvdy9oaWdoIHBhcnQuCisgIHN0ZDo6cGFpcjxTRFZhbHVlLCBTRFZhbHVlPiBTcGxpdFZlY3Rvcihjb25zdCBTRFZhbHVlICZOLCBjb25zdCBTRExvYyAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFVlQgJkxvVlQsIGNvbnN0IEVWVCAmSGlWVCk7CisKKyAgLy8vIFNwbGl0IHRoZSB2ZWN0b3Igd2l0aCBFWFRSQUNUX1NVQlZFQ1RPUiBhbmQgcmV0dXJuIHRoZSBsb3cvaGlnaCBwYXJ0LgorICBzdGQ6OnBhaXI8U0RWYWx1ZSwgU0RWYWx1ZT4gU3BsaXRWZWN0b3IoY29uc3QgU0RWYWx1ZSAmTiwgY29uc3QgU0RMb2MgJkRMKSB7CisgICAgRVZUIExvVlQsIEhpVlQ7CisgICAgc3RkOjp0aWUoTG9WVCwgSGlWVCkgPSBHZXRTcGxpdERlc3RWVHMoTi5nZXRWYWx1ZVR5cGUoKSk7CisgICAgcmV0dXJuIFNwbGl0VmVjdG9yKE4sIERMLCBMb1ZULCBIaVZUKTsKKyAgfQorCisgIC8vLyBTcGxpdCB0aGUgbm9kZSdzIG9wZXJhbmQgd2l0aCBFWFRSQUNUX1NVQlZFQ1RPUiBhbmQKKyAgLy8vIHJldHVybiB0aGUgbG93L2hpZ2ggcGFydC4KKyAgc3RkOjpwYWlyPFNEVmFsdWUsIFNEVmFsdWU+IFNwbGl0VmVjdG9yT3BlcmFuZChjb25zdCBTRE5vZGUgKk4sIHVuc2lnbmVkIE9wTm8pCisgIHsKKyAgICByZXR1cm4gU3BsaXRWZWN0b3IoTi0+Z2V0T3BlcmFuZChPcE5vKSwgU0RMb2MoTikpOworICB9CisKKyAgLy8vIEFwcGVuZCB0aGUgZXh0cmFjdGVkIGVsZW1lbnRzIGZyb20gU3RhcnQgdG8gQ291bnQgb3V0IG9mIHRoZSB2ZWN0b3IgT3AKKyAgLy8vIGluIEFyZ3MuIElmIENvdW50IGlzIDAsIGFsbCBvZiB0aGUgZWxlbWVudHMgd2lsbCBiZSBleHRyYWN0ZWQuCisgIHZvaWQgRXh0cmFjdFZlY3RvckVsZW1lbnRzKFNEVmFsdWUgT3AsIFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3RhcnQgPSAwLCB1bnNpZ25lZCBDb3VudCA9IDApOworCisgIC8vLyBDb21wdXRlIHRoZSBkZWZhdWx0IGFsaWdubWVudCB2YWx1ZSBmb3IgdGhlIGdpdmVuIHR5cGUuCisgIHVuc2lnbmVkIGdldEVWVEFsaWdubWVudChFVlQgTWVtb3J5VlQpIGNvbnN0OworCisgIC8vLyBUZXN0IHdoZXRoZXIgdGhlIGdpdmVuIHZhbHVlIGlzIGEgY29uc3RhbnQgaW50IG9yIHNpbWlsYXIgbm9kZS4KKyAgU0ROb2RlICppc0NvbnN0YW50SW50QnVpbGRWZWN0b3JPckNvbnN0YW50SW50KFNEVmFsdWUgTik7CisKKyAgLy8vIFRlc3Qgd2hldGhlciB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBjb25zdGFudCBGUCBvciBzaW1pbGFyIG5vZGUuCisgIFNETm9kZSAqaXNDb25zdGFudEZQQnVpbGRWZWN0b3JPckNvbnN0YW50RlAoU0RWYWx1ZSBOKTsKKworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBccCBOIGlzIGFueSBraW5kIG9mIGNvbnN0YW50IG9yIGJ1aWxkX3ZlY3RvciBvZgorICAvLy8gY29uc3RhbnRzLCBpbnQgb3IgZmxvYXQuIElmIGEgdmVjdG9yLCBpdCBtYXkgbm90IG5lY2Vzc2FyaWx5IGJlIGEgc3BsYXQuCisgIGlubGluZSBib29sIGlzQ29uc3RhbnRWYWx1ZU9mQW55VHlwZShTRFZhbHVlIE4pIHsKKyAgICByZXR1cm4gaXNDb25zdGFudEludEJ1aWxkVmVjdG9yT3JDb25zdGFudEludChOKSB8fAorICAgICAgICAgICBpc0NvbnN0YW50RlBCdWlsZFZlY3Rvck9yQ29uc3RhbnRGUChOKTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIEluc2VydE5vZGUoU0ROb2RlICpOKTsKKyAgYm9vbCBSZW1vdmVOb2RlRnJvbUNTRU1hcHMoU0ROb2RlICpOKTsKKyAgdm9pZCBBZGRNb2RpZmllZE5vZGVUb0NTRU1hcHMoU0ROb2RlICpOKTsKKyAgU0ROb2RlICpGaW5kTW9kaWZpZWROb2RlU2xvdChTRE5vZGUgKk4sIFNEVmFsdWUgT3AsIHZvaWQgKiZJbnNlcnRQb3MpOworICBTRE5vZGUgKkZpbmRNb2RpZmllZE5vZGVTbG90KFNETm9kZSAqTiwgU0RWYWx1ZSBPcDEsIFNEVmFsdWUgT3AyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiZJbnNlcnRQb3MpOworICBTRE5vZGUgKkZpbmRNb2RpZmllZE5vZGVTbG90KFNETm9kZSAqTiwgQXJyYXlSZWY8U0RWYWx1ZT4gT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiZJbnNlcnRQb3MpOworICBTRE5vZGUgKlVwZGF0ZVNETG9jT25NZXJnZVNETm9kZShTRE5vZGUgKk4sIGNvbnN0IFNETG9jICZsb2MpOworCisgIHZvaWQgRGVsZXRlTm9kZU5vdEluQ1NFTWFwcyhTRE5vZGUgKk4pOworICB2b2lkIERlYWxsb2NhdGVOb2RlKFNETm9kZSAqTik7CisKKyAgdm9pZCBhbGxub2Rlc19jbGVhcigpOworCisgIC8vLyBMb29rIHVwIHRoZSBub2RlIHNwZWNpZmllZCBieSBJRCBpbiBDU0VNYXAuICBJZiBpdCBleGlzdHMsIHJldHVybiBpdC4gIElmCisgIC8vLyBub3QsIHJldHVybiB0aGUgaW5zZXJ0aW9uIHRva2VuIHRoYXQgd2lsbCBtYWtlIGluc2VydGlvbiBmYXN0ZXIuICBUaGlzCisgIC8vLyBvdmVybG9hZCBpcyBmb3Igbm9kZXMgb3RoZXIgdGhhbiBDb25zdGFudCBvciBDb25zdGFudEZQLCB1c2UgdGhlIG90aGVyIG9uZQorICAvLy8gZm9yIHRob3NlLgorICBTRE5vZGUgKkZpbmROb2RlT3JJbnNlcnRQb3MoY29uc3QgRm9sZGluZ1NldE5vZGVJRCAmSUQsIHZvaWQgKiZJbnNlcnRQb3MpOworCisgIC8vLyBMb29rIHVwIHRoZSBub2RlIHNwZWNpZmllZCBieSBJRCBpbiBDU0VNYXAuICBJZiBpdCBleGlzdHMsIHJldHVybiBpdC4gIElmCisgIC8vLyBub3QsIHJldHVybiB0aGUgaW5zZXJ0aW9uIHRva2VuIHRoYXQgd2lsbCBtYWtlIGluc2VydGlvbiBmYXN0ZXIuICBQZXJmb3JtcworICAvLy8gYWRkaXRpb25hbCBwcm9jZXNzaW5nIGZvciBjb25zdGFudCBub2Rlcy4KKyAgU0ROb2RlICpGaW5kTm9kZU9ySW5zZXJ0UG9zKGNvbnN0IEZvbGRpbmdTZXROb2RlSUQgJklELCBjb25zdCBTRExvYyAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkIComSW5zZXJ0UG9zKTsKKworICAvLy8gTGlzdCBvZiBub24tc2luZ2xlIHZhbHVlIHR5cGVzLgorICBGb2xkaW5nU2V0PFNEVlRMaXN0Tm9kZT4gVlRMaXN0TWFwOworCisgIC8vLyBNYXBzIHRvIGF1dG8tQ1NFIG9wZXJhdGlvbnMuCisgIHN0ZDo6dmVjdG9yPENvbmRDb2RlU0ROb2RlKj4gQ29uZENvZGVOb2RlczsKKworICBzdGQ6OnZlY3RvcjxTRE5vZGUqPiBWYWx1ZVR5cGVOb2RlczsKKyAgc3RkOjptYXA8RVZULCBTRE5vZGUqLCBFVlQ6OmNvbXBhcmVSYXdCaXRzPiBFeHRlbmRlZFZhbHVlVHlwZU5vZGVzOworICBTdHJpbmdNYXA8U0ROb2RlKj4gRXh0ZXJuYWxTeW1ib2xzOworCisgIHN0ZDo6bWFwPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgdW5zaWduZWQgY2hhcj4sU0ROb2RlKj4gVGFyZ2V0RXh0ZXJuYWxTeW1ib2xzOworICBEZW5zZU1hcDxNQ1N5bWJvbCAqLCBTRE5vZGUgKj4gTUNTeW1ib2xzOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPFNlbGVjdGlvbkRBRyo+IDogcHVibGljIEdyYXBoVHJhaXRzPFNETm9kZSo+IHsKKyAgdXNpbmcgbm9kZXNfaXRlcmF0b3IgPSBwb2ludGVyX2l0ZXJhdG9yPFNlbGVjdGlvbkRBRzo6YWxsbm9kZXNfaXRlcmF0b3I+OworCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihTZWxlY3Rpb25EQUcgKkcpIHsKKyAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3IoRy0+YWxsbm9kZXNfYmVnaW4oKSk7CisgIH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kKFNlbGVjdGlvbkRBRyAqRykgeworICAgIHJldHVybiBub2Rlc19pdGVyYXRvcihHLT5hbGxub2Rlc19lbmQoKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBUYXJnZXRNZW1TRE5vZGU+CitTRFZhbHVlIFNlbGVjdGlvbkRBRzo6Z2V0VGFyZ2V0TWVtU0ROb2RlKFNEVlRMaXN0IFZUcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U0RWYWx1ZT4gT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRExvYyAmZGwsIEVWVCBNZW1WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTykgeworICAvLy8gQ29tcG9zZSBub2RlIElEIGFuZCB0cnkgdG8gZmluZCBhbiBleGlzdGluZyBub2RlLgorICBGb2xkaW5nU2V0Tm9kZUlEIElEOworICB1bnNpZ25lZCBPcGNvZGUgPQorICAgIFRhcmdldE1lbVNETm9kZShkbC5nZXRJUk9yZGVyKCksIERlYnVnTG9jKCksIFZUcywgTWVtVlQsIE1NTykuZ2V0T3Bjb2RlKCk7CisgIElELkFkZEludGVnZXIoT3Bjb2RlKTsKKyAgSUQuQWRkUG9pbnRlcihWVHMuVlRzKTsKKyAgZm9yIChhdXRvJiBPcCA6IE9wcykgeworICAgIElELkFkZFBvaW50ZXIoT3AuZ2V0Tm9kZSgpKTsKKyAgICBJRC5BZGRJbnRlZ2VyKE9wLmdldFJlc05vKCkpOworICB9CisgIElELkFkZEludGVnZXIoTWVtVlQuZ2V0UmF3Qml0cygpKTsKKyAgSUQuQWRkSW50ZWdlcihNTU8tPmdldFBvaW50ZXJJbmZvKCkuZ2V0QWRkclNwYWNlKCkpOworICBJRC5BZGRJbnRlZ2VyKGdldFN5bnRoZXRpY05vZGVTdWJjbGFzc0RhdGE8VGFyZ2V0TWVtU0ROb2RlPigKKyAgICBkbC5nZXRJUk9yZGVyKCksIFZUcywgTWVtVlQsIE1NTykpOworCisgIHZvaWQgKklQID0gbnVsbHB0cjsKKyAgaWYgKFNETm9kZSAqRSA9IEZpbmROb2RlT3JJbnNlcnRQb3MoSUQsIGRsLCBJUCkpIHsKKyAgICBjYXN0PFRhcmdldE1lbVNETm9kZT4oRSktPnJlZmluZUFsaWdubWVudChNTU8pOworICAgIHJldHVybiBTRFZhbHVlKEUsIDApOworICB9CisKKyAgLy8vIEV4aXN0aW5nIG5vZGUgd2FzIG5vdCBmb3VuZC4gQ3JlYXRlIGEgbmV3IG9uZS4KKyAgYXV0byAqTiA9IG5ld1NETm9kZTxUYXJnZXRNZW1TRE5vZGU+KGRsLmdldElST3JkZXIoKSwgZGwuZ2V0RGVidWdMb2MoKSwgVlRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtVlQsIE1NTyk7CisgIGNyZWF0ZU9wZXJhbmRzKE4sIE9wcyk7CisgIENTRU1hcC5JbnNlcnROb2RlKE4sIElQKTsKKyAgSW5zZXJ0Tm9kZShOKTsKKyAgcmV0dXJuIFNEVmFsdWUoTiwgMCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fU0VMRUNUSU9OREFHX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdBZGRyZXNzQW5hbHlzaXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdBZGRyZXNzQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODA2MDY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR0FkZHJlc3NBbmFseXNpcy5oCkBAIC0wLDAgKzEsNjQgQEAKKy8vPT09LSBTZWxlY3Rpb25EQUdBZGRyZXNzQW5hbHlzaXMuaCAtIERBRyBBZGRyZXNzIEFuYWx5c2lzIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1NFTEVDVElPTkRBR0FERFJFU1NBTkFMWVNJU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9TRUxFQ1RJT05EQUdBRERSRVNTQU5BTFlTSVNfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR05vZGVzLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBTZWxlY3Rpb25EQUc7CisKKy8vLyBIZWxwZXIgc3RydWN0IHRvIHBhcnNlIGFuZCBzdG9yZSBhIG1lbW9yeSBhZGRyZXNzIGFzIGJhc2UgKyBpbmRleCArIG9mZnNldC4KKy8vLyBXZSBpZ25vcmUgc2lnbiBleHRlbnNpb25zIHdoZW4gaXQgaXMgc2FmZSB0byBkbyBzby4KKy8vLyBUaGUgZm9sbG93aW5nIHR3byBleHByZXNzaW9ucyBhcmUgbm90IGVxdWl2YWxlbnQuIFRvIGRpZmZlcmVudGlhdGUgd2UgbmVlZAorLy8vIHRvIHN0b3JlIHdoZXRoZXIgdGhlcmUgd2FzIGEgc2lnbiBleHRlbnNpb24gaW52b2x2ZWQgaW4gdGhlIGluZGV4CisvLy8gY29tcHV0YXRpb24uCisvLy8gIChsb2FkIChpNjQgYWRkIChpNjQgY29weWZyb21yZWcgJWMpCisvLy8gICAgICAgICAgICAgICAgIChpNjQgc2lnbmV4dGVuZCAoYWRkIChpOCBsb2FkICVpbmRleCkKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGk4IDEpKSkpCisvLy8gdnMKKy8vLworLy8vIChsb2FkIChpNjQgYWRkIChpNjQgY29weWZyb21yZWcgJWMpCisvLy8gICAgICAgICAgICAgICAgKGk2NCBzaWduZXh0ZW5kIChpMzIgYWRkIChpMzIgc2lnbmV4dGVuZCAoaTggbG9hZCAlaW5kZXgpKQorLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaTMyIDEpKSkpKQorY2xhc3MgQmFzZUluZGV4T2Zmc2V0IHsKK3ByaXZhdGU6CisgIFNEVmFsdWUgQmFzZTsKKyAgU0RWYWx1ZSBJbmRleDsKKyAgaW50NjRfdCBPZmZzZXQgPSAwOworICBib29sIElzSW5kZXhTaWduRXh0ID0gZmFsc2U7CisKK3B1YmxpYzoKKyAgQmFzZUluZGV4T2Zmc2V0KCkgPSBkZWZhdWx0OworICBCYXNlSW5kZXhPZmZzZXQoU0RWYWx1ZSBCYXNlLCBTRFZhbHVlIEluZGV4LCBpbnQ2NF90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgIGJvb2wgSXNJbmRleFNpZ25FeHQpCisgICAgICA6IEJhc2UoQmFzZSksIEluZGV4KEluZGV4KSwgT2Zmc2V0KE9mZnNldCksCisgICAgICAgIElzSW5kZXhTaWduRXh0KElzSW5kZXhTaWduRXh0KSB7fQorCisgIFNEVmFsdWUgZ2V0QmFzZSgpIHsgcmV0dXJuIEJhc2U7IH0KKyAgU0RWYWx1ZSBnZXRJbmRleCgpIHsgcmV0dXJuIEluZGV4OyB9CisKKyAgYm9vbCBlcXVhbEJhc2VJbmRleChCYXNlSW5kZXhPZmZzZXQgJk90aGVyLCBjb25zdCBTZWxlY3Rpb25EQUcgJkRBRykgeworICAgIGludDY0X3QgT2ZmOworICAgIHJldHVybiBlcXVhbEJhc2VJbmRleChPdGhlciwgREFHLCBPZmYpOworICB9CisKKyAgYm9vbCBlcXVhbEJhc2VJbmRleChCYXNlSW5kZXhPZmZzZXQgJk90aGVyLCBjb25zdCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICZPZmYpOworCisgIC8vLyBQYXJzZXMgdHJlZSBpbiBQdHIgZm9yIGJhc2UsIGluZGV4LCBvZmZzZXQgYWRkcmVzc2VzLgorICBzdGF0aWMgQmFzZUluZGV4T2Zmc2V0IG1hdGNoKExTQmFzZVNETm9kZSAqTiwgY29uc3QgU2VsZWN0aW9uREFHICZEQUcpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9TRUxFQ1RJT05EQUdBRERSRVNTQU5BTFlTSVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR0lTZWwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdJU2VsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU2ZWFmYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdJU2VsLmgKQEAgLTAsMCArMSwzNDggQEAKKy8vPT09LS0gbGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR0lTZWwuaCAtIENvbW1vbiBCYXNlIENsYXNzLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFNlbGVjdGlvbkRBR0lTZWwgY2xhc3MsIHdoaWNoIGlzIHVzZWQgYXMgdGhlIGNvbW1vbgorLy8gYmFzZSBjbGFzcyBmb3IgU2VsZWN0aW9uREFHLWJhc2VkIGluc3RydWN0aW9uIHNlbGVjdG9ycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9TRUxFQ1RJT05EQUdJU0VMX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1NFTEVDVElPTkRBR0lTRUxfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvblBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldFN1YnRhcmdldEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgRmFzdElTZWw7CisgIGNsYXNzIFNlbGVjdGlvbkRBR0J1aWxkZXI7CisgIGNsYXNzIFNEVmFsdWU7CisgIGNsYXNzIE1hY2hpbmVSZWdpc3RlckluZm87CisgIGNsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworICBjbGFzcyBNYWNoaW5lRnVuY3Rpb247CisgIGNsYXNzIE1hY2hpbmVJbnN0cjsKKyAgY2xhc3MgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlcjsKKyAgY2xhc3MgVGFyZ2V0TG93ZXJpbmc7CisgIGNsYXNzIFRhcmdldExpYnJhcnlJbmZvOworICBjbGFzcyBGdW5jdGlvbkxvd2VyaW5nSW5mbzsKKyAgY2xhc3MgU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyOworICBjbGFzcyBHQ0Z1bmN0aW9uSW5mbzsKKyAgY2xhc3MgU2NoZWR1bGVEQUdTRE5vZGVzOworICBjbGFzcyBMb2FkSW5zdDsKKworLy8vIFNlbGVjdGlvbkRBR0lTZWwgLSBUaGlzIGlzIHRoZSBjb21tb24gYmFzZSBjbGFzcyB1c2VkIGZvciBTZWxlY3Rpb25EQUctYmFzZWQKKy8vLyBwYXR0ZXJuLW1hdGNoaW5nIGluc3RydWN0aW9uIHNlbGVjdG9ycy4KK2NsYXNzIFNlbGVjdGlvbkRBR0lTZWwgOiBwdWJsaWMgTWFjaGluZUZ1bmN0aW9uUGFzcyB7CitwdWJsaWM6CisgIFRhcmdldE1hY2hpbmUgJlRNOworICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqTGliSW5mbzsKKyAgRnVuY3Rpb25Mb3dlcmluZ0luZm8gKkZ1bmNJbmZvOworICBNYWNoaW5lRnVuY3Rpb24gKk1GOworICBNYWNoaW5lUmVnaXN0ZXJJbmZvICpSZWdJbmZvOworICBTZWxlY3Rpb25EQUcgKkN1ckRBRzsKKyAgU2VsZWN0aW9uREFHQnVpbGRlciAqU0RCOworICBBbGlhc0FuYWx5c2lzICpBQTsKKyAgR0NGdW5jdGlvbkluZm8gKkdGSTsKKyAgQ29kZUdlbk9wdDo6TGV2ZWwgT3B0TGV2ZWw7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJOworICBjb25zdCBUYXJnZXRMb3dlcmluZyAqVExJOworICBib29sIEZhc3RJU2VsRmFpbGVkOworICBTbWFsbFB0clNldDxjb25zdCBJbnN0cnVjdGlvbiAqLCA0PiBFbGlkZWRBcmdDb3B5SW5zdHJzOworCisgIC8vLyBDdXJyZW50IG9wdGltaXphdGlvbiByZW1hcmsgZW1pdHRlci4KKyAgLy8vIFVzZWQgdG8gcmVwb3J0IHRoaW5ncyBsaWtlIGNvbWJpbmVzIGFuZCBGYXN0SVNlbCBmYWlsdXJlcy4KKyAgc3RkOjp1bmlxdWVfcHRyPE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXI+IE9SRTsKKworICBzdGF0aWMgY2hhciBJRDsKKworICBleHBsaWNpdCBTZWxlY3Rpb25EQUdJU2VsKFRhcmdldE1hY2hpbmUgJnRtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9MID0gQ29kZUdlbk9wdDo6RGVmYXVsdCk7CisgIH5TZWxlY3Rpb25EQUdJU2VsKCkgb3ZlcnJpZGU7CisKKyAgY29uc3QgVGFyZ2V0TG93ZXJpbmcgKmdldFRhcmdldExvd2VyaW5nKCkgY29uc3QgeyByZXR1cm4gVExJOyB9CisKKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkFVKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmTUYpIG92ZXJyaWRlOworCisgIHZpcnR1YWwgdm9pZCBFbWl0RnVuY3Rpb25FbnRyeUNvZGUoKSB7fQorCisgIC8vLyBQcmVwcm9jZXNzSVNlbERBRyAtIFRoaXMgaG9vayBhbGxvd3MgdGFyZ2V0cyB0byBoYWNrIG9uIHRoZSBncmFwaCBiZWZvcmUKKyAgLy8vIGluc3RydWN0aW9uIHNlbGVjdGlvbiBzdGFydHMuCisgIHZpcnR1YWwgdm9pZCBQcmVwcm9jZXNzSVNlbERBRygpIHt9CisKKyAgLy8vIFBvc3Rwcm9jZXNzSVNlbERBRygpIC0gVGhpcyBob29rIGFsbG93cyB0aGUgdGFyZ2V0IHRvIGhhY2sgb24gdGhlIGdyYXBoCisgIC8vLyByaWdodCBhZnRlciBzZWxlY3Rpb24uCisgIHZpcnR1YWwgdm9pZCBQb3N0cHJvY2Vzc0lTZWxEQUcoKSB7fQorCisgIC8vLyBNYWluIGhvb2sgZm9yIHRhcmdldHMgdG8gdHJhbnNmb3JtIG5vZGVzIGludG8gbWFjaGluZSBub2Rlcy4KKyAgdmlydHVhbCB2b2lkIFNlbGVjdChTRE5vZGUgKk4pID0gMDsKKworICAvLy8gU2VsZWN0SW5saW5lQXNtTWVtb3J5T3BlcmFuZCAtIFNlbGVjdCB0aGUgc3BlY2lmaWVkIGFkZHJlc3MgYXMgYSB0YXJnZXQKKyAgLy8vIGFkZHJlc3NpbmcgbW9kZSwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgY29uc3RyYWludC4gIElmIHRoaXMgZG9lcworICAvLy8gbm90IG1hdGNoIG9yIGlzIG5vdCBpbXBsZW1lbnRlZCwgcmV0dXJuIHRydWUuICBUaGUgcmVzdWx0YW50IG9wZXJhbmRzCisgIC8vLyAod2hpY2ggd2lsbCBhcHBlYXIgaW4gdGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb24pIHNob3VsZCBiZSBhZGRlZCB0byB0aGUKKyAgLy8vIE91dE9wcyB2ZWN0b3IuCisgIHZpcnR1YWwgYm9vbCBTZWxlY3RJbmxpbmVBc21NZW1vcnlPcGVyYW5kKGNvbnN0IFNEVmFsdWUgJk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb25zdHJhaW50SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNEVmFsdWU+ICZPdXRPcHMpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBJc1Byb2ZpdGFibGVUb0ZvbGQgLSBSZXR1cm5zIHRydWUgaWYgaXQncyBwcm9maXRhYmxlIHRvIGZvbGQgdGhlIHNwZWNpZmljCisgIC8vLyBvcGVyYW5kIG5vZGUgTiBvZiBVIGR1cmluZyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gdGhhdCBzdGFydHMgYXQgUm9vdC4KKyAgdmlydHVhbCBib29sIElzUHJvZml0YWJsZVRvRm9sZChTRFZhbHVlIE4sIFNETm9kZSAqVSwgU0ROb2RlICpSb290KSBjb25zdDsKKworICAvLy8gSXNMZWdhbFRvRm9sZCAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWMgb3BlcmFuZCBub2RlIE4gb2YKKyAgLy8vIFUgY2FuIGJlIGZvbGRlZCBkdXJpbmcgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIHRoYXQgc3RhcnRzIGF0IFJvb3QuCisgIC8vLyBGSVhNRTogVGhpcyBpcyBhIHN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gYmVjYXVzZSB0aGUgTVNQNDMwL1g4NgorICAvLy8gdGFyZ2V0cywgd2hpY2ggdXNlcyBpdCBkdXJpbmcgaXNlbC4gIFRoaXMgY291bGQgYmVjb21lIGEgcHJvcGVyIG1lbWJlci4KKyAgc3RhdGljIGJvb2wgSXNMZWdhbFRvRm9sZChTRFZhbHVlIE4sIFNETm9kZSAqVSwgU0ROb2RlICpSb290LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSWdub3JlQ2hhaW5zID0gZmFsc2UpOworCisgIHN0YXRpYyB2b2lkIEludmFsaWRhdGVOb2RlSWQoU0ROb2RlICpOKTsKKyAgc3RhdGljIGludCBnZXRVbmludmFsaWRhdGVkTm9kZUlkKFNETm9kZSAqTik7CisKKyAgc3RhdGljIHZvaWQgRW5mb3JjZU5vZGVJZEludmFyaWFudChTRE5vZGUgKk4pOworCisgIC8vIE9wY29kZXMgdXNlZCBieSB0aGUgREFHIHN0YXRlIG1hY2hpbmU6CisgIGVudW0gQnVpbHRpbk9wY29kZXMgeworICAgIE9QQ19TY29wZSwKKyAgICBPUENfUmVjb3JkTm9kZSwKKyAgICBPUENfUmVjb3JkQ2hpbGQwLCBPUENfUmVjb3JkQ2hpbGQxLCBPUENfUmVjb3JkQ2hpbGQyLCBPUENfUmVjb3JkQ2hpbGQzLAorICAgIE9QQ19SZWNvcmRDaGlsZDQsIE9QQ19SZWNvcmRDaGlsZDUsIE9QQ19SZWNvcmRDaGlsZDYsIE9QQ19SZWNvcmRDaGlsZDcsCisgICAgT1BDX1JlY29yZE1lbVJlZiwKKyAgICBPUENfQ2FwdHVyZUdsdWVJbnB1dCwKKyAgICBPUENfTW92ZUNoaWxkLAorICAgIE9QQ19Nb3ZlQ2hpbGQwLCBPUENfTW92ZUNoaWxkMSwgT1BDX01vdmVDaGlsZDIsIE9QQ19Nb3ZlQ2hpbGQzLAorICAgIE9QQ19Nb3ZlQ2hpbGQ0LCBPUENfTW92ZUNoaWxkNSwgT1BDX01vdmVDaGlsZDYsIE9QQ19Nb3ZlQ2hpbGQ3LAorICAgIE9QQ19Nb3ZlUGFyZW50LAorICAgIE9QQ19DaGVja1NhbWUsCisgICAgT1BDX0NoZWNrQ2hpbGQwU2FtZSwgT1BDX0NoZWNrQ2hpbGQxU2FtZSwKKyAgICBPUENfQ2hlY2tDaGlsZDJTYW1lLCBPUENfQ2hlY2tDaGlsZDNTYW1lLAorICAgIE9QQ19DaGVja1BhdHRlcm5QcmVkaWNhdGUsCisgICAgT1BDX0NoZWNrUHJlZGljYXRlLAorICAgIE9QQ19DaGVja09wY29kZSwKKyAgICBPUENfU3dpdGNoT3Bjb2RlLAorICAgIE9QQ19DaGVja1R5cGUsCisgICAgT1BDX0NoZWNrVHlwZVJlcywKKyAgICBPUENfU3dpdGNoVHlwZSwKKyAgICBPUENfQ2hlY2tDaGlsZDBUeXBlLCBPUENfQ2hlY2tDaGlsZDFUeXBlLCBPUENfQ2hlY2tDaGlsZDJUeXBlLAorICAgIE9QQ19DaGVja0NoaWxkM1R5cGUsIE9QQ19DaGVja0NoaWxkNFR5cGUsIE9QQ19DaGVja0NoaWxkNVR5cGUsCisgICAgT1BDX0NoZWNrQ2hpbGQ2VHlwZSwgT1BDX0NoZWNrQ2hpbGQ3VHlwZSwKKyAgICBPUENfQ2hlY2tJbnRlZ2VyLAorICAgIE9QQ19DaGVja0NoaWxkMEludGVnZXIsIE9QQ19DaGVja0NoaWxkMUludGVnZXIsIE9QQ19DaGVja0NoaWxkMkludGVnZXIsCisgICAgT1BDX0NoZWNrQ2hpbGQzSW50ZWdlciwgT1BDX0NoZWNrQ2hpbGQ0SW50ZWdlciwKKyAgICBPUENfQ2hlY2tDb25kQ29kZSwKKyAgICBPUENfQ2hlY2tWYWx1ZVR5cGUsCisgICAgT1BDX0NoZWNrQ29tcGxleFBhdCwKKyAgICBPUENfQ2hlY2tBbmRJbW0sIE9QQ19DaGVja09ySW1tLAorICAgIE9QQ19DaGVja0ZvbGRhYmxlQ2hhaW5Ob2RlLAorCisgICAgT1BDX0VtaXRJbnRlZ2VyLAorICAgIE9QQ19FbWl0UmVnaXN0ZXIsCisgICAgT1BDX0VtaXRSZWdpc3RlcjIsCisgICAgT1BDX0VtaXRDb252ZXJ0VG9UYXJnZXQsCisgICAgT1BDX0VtaXRNZXJnZUlucHV0Q2hhaW5zLAorICAgIE9QQ19FbWl0TWVyZ2VJbnB1dENoYWluczFfMCwKKyAgICBPUENfRW1pdE1lcmdlSW5wdXRDaGFpbnMxXzEsCisgICAgT1BDX0VtaXRNZXJnZUlucHV0Q2hhaW5zMV8yLAorICAgIE9QQ19FbWl0Q29weVRvUmVnLAorICAgIE9QQ19FbWl0Tm9kZVhGb3JtLAorICAgIE9QQ19FbWl0Tm9kZSwKKyAgICAvLyBTcGFjZS1vcHRpbWl6ZWQgZm9ybXMgdGhhdCBpbXBsaWNpdGx5IGVuY29kZSBudW1iZXIgb2YgcmVzdWx0IFZUcy4KKyAgICBPUENfRW1pdE5vZGUwLCBPUENfRW1pdE5vZGUxLCBPUENfRW1pdE5vZGUyLAorICAgIE9QQ19Nb3JwaE5vZGVUbywKKyAgICAvLyBTcGFjZS1vcHRpbWl6ZWQgZm9ybXMgdGhhdCBpbXBsaWNpdGx5IGVuY29kZSBudW1iZXIgb2YgcmVzdWx0IFZUcy4KKyAgICBPUENfTW9ycGhOb2RlVG8wLCBPUENfTW9ycGhOb2RlVG8xLCBPUENfTW9ycGhOb2RlVG8yLAorICAgIE9QQ19Db21wbGV0ZU1hdGNoLAorICAgIC8vIENvbnRhaW5zIG9mZnNldCBpbiB0YWJsZSBmb3IgcGF0dGVybiBiZWluZyBzZWxlY3RlZAorICAgIE9QQ19Db3ZlcmFnZQorICB9OworCisgIGVudW0geworICAgIE9QRkxfTm9uZSAgICAgICA9IDAsICAvLyBOb2RlIGhhcyBubyBjaGFpbiBvciBnbHVlIGlucHV0IGFuZCBpc24ndCB2YXJpYWRpYy4KKyAgICBPUEZMX0NoYWluICAgICAgPSAxLCAgICAgLy8gTm9kZSBoYXMgYSBjaGFpbiBpbnB1dC4KKyAgICBPUEZMX0dsdWVJbnB1dCAgPSAyLCAgICAgLy8gTm9kZSBoYXMgYSBnbHVlIGlucHV0LgorICAgIE9QRkxfR2x1ZU91dHB1dCA9IDQsICAgICAvLyBOb2RlIGhhcyBhIGdsdWUgb3V0cHV0LgorICAgIE9QRkxfTWVtUmVmcyAgICA9IDgsICAgICAvLyBOb2RlIGdldHMgYWNjdW11bGF0ZWQgTWVtUmVmcy4KKyAgICBPUEZMX1ZhcmlhZGljMCAgPSAxPDw0LCAgLy8gTm9kZSBpcyB2YXJpYWRpYywgcm9vdCBoYXMgMCBmaXhlZCBpbnB1dHMuCisgICAgT1BGTF9WYXJpYWRpYzEgID0gMjw8NCwgIC8vIE5vZGUgaXMgdmFyaWFkaWMsIHJvb3QgaGFzIDEgZml4ZWQgaW5wdXRzLgorICAgIE9QRkxfVmFyaWFkaWMyICA9IDM8PDQsICAvLyBOb2RlIGlzIHZhcmlhZGljLCByb290IGhhcyAyIGZpeGVkIGlucHV0cy4KKyAgICBPUEZMX1ZhcmlhZGljMyAgPSA0PDw0LCAgLy8gTm9kZSBpcyB2YXJpYWRpYywgcm9vdCBoYXMgMyBmaXhlZCBpbnB1dHMuCisgICAgT1BGTF9WYXJpYWRpYzQgID0gNTw8NCwgIC8vIE5vZGUgaXMgdmFyaWFkaWMsIHJvb3QgaGFzIDQgZml4ZWQgaW5wdXRzLgorICAgIE9QRkxfVmFyaWFkaWM1ICA9IDY8PDQsICAvLyBOb2RlIGlzIHZhcmlhZGljLCByb290IGhhcyA1IGZpeGVkIGlucHV0cy4KKyAgICBPUEZMX1ZhcmlhZGljNiAgPSA3PDw0LCAgLy8gTm9kZSBpcyB2YXJpYWRpYywgcm9vdCBoYXMgNiBmaXhlZCBpbnB1dHMuCisKKyAgICBPUEZMX1ZhcmlhZGljSW5mbyA9IE9QRkxfVmFyaWFkaWM2CisgIH07CisKKyAgLy8vIGdldE51bUZpeGVkRnJvbVZhcmlhZGljSW5mbyAtIFRyYW5zZm9ybSBhbiBFbWl0Tm9kZSBmbGFncyB3b3JkIGludG8gdGhlCisgIC8vLyBudW1iZXIgb2YgZml4ZWQgYXJpdHkgdmFsdWVzIHRoYXQgc2hvdWxkIGJlIHNraXBwZWQgd2hlbiBjb3B5aW5nIGZyb20gdGhlCisgIC8vLyByb290LgorICBzdGF0aWMgaW5saW5lIGludCBnZXROdW1GaXhlZEZyb21WYXJpYWRpY0luZm8odW5zaWduZWQgRmxhZ3MpIHsKKyAgICByZXR1cm4gKChGbGFncyZPUEZMX1ZhcmlhZGljSW5mbykgPj4gNCktMTsKKyAgfQorCisKK3Byb3RlY3RlZDoKKyAgLy8vIERBR1NpemUgLSBTaXplIG9mIERBRyBiZWluZyBpbnN0cnVjdGlvbiBzZWxlY3RlZC4KKyAgLy8vCisgIHVuc2lnbmVkIERBR1NpemU7CisKKyAgLy8vIFJlcGxhY2VVc2VzIC0gcmVwbGFjZSBhbGwgdXNlcyBvZiB0aGUgb2xkIG5vZGUgRiB3aXRoIHRoZSB1c2UKKyAgLy8vIG9mIHRoZSBuZXcgbm9kZSBULgorICB2b2lkIFJlcGxhY2VVc2VzKFNEVmFsdWUgRiwgU0RWYWx1ZSBUKSB7CisgICAgQ3VyREFHLT5SZXBsYWNlQWxsVXNlc09mVmFsdWVXaXRoKEYsIFQpOworICAgIEVuZm9yY2VOb2RlSWRJbnZhcmlhbnQoVC5nZXROb2RlKCkpOworICB9CisKKyAgLy8vIFJlcGxhY2VVc2VzIC0gcmVwbGFjZSBhbGwgdXNlcyBvZiB0aGUgb2xkIG5vZGVzIEYgd2l0aCB0aGUgdXNlCisgIC8vLyBvZiB0aGUgbmV3IG5vZGVzIFQuCisgIHZvaWQgUmVwbGFjZVVzZXMoY29uc3QgU0RWYWx1ZSAqRiwgY29uc3QgU0RWYWx1ZSAqVCwgdW5zaWduZWQgTnVtKSB7CisgICAgQ3VyREFHLT5SZXBsYWNlQWxsVXNlc09mVmFsdWVzV2l0aChGLCBULCBOdW0pOworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBOdW07ICsraSkKKyAgICAgIEVuZm9yY2VOb2RlSWRJbnZhcmlhbnQoVFtpXS5nZXROb2RlKCkpOworICB9CisKKyAgLy8vIFJlcGxhY2VVc2VzIC0gcmVwbGFjZSBhbGwgdXNlcyBvZiB0aGUgb2xkIG5vZGUgRiB3aXRoIHRoZSB1c2UKKyAgLy8vIG9mIHRoZSBuZXcgbm9kZSBULgorICB2b2lkIFJlcGxhY2VVc2VzKFNETm9kZSAqRiwgU0ROb2RlICpUKSB7CisgICAgQ3VyREFHLT5SZXBsYWNlQWxsVXNlc1dpdGgoRiwgVCk7CisgICAgRW5mb3JjZU5vZGVJZEludmFyaWFudChUKTsKKyAgfQorCisgIC8vLyBSZXBsYWNlIGFsbCB1c2VzIG9mIFxjIEYgd2l0aCBcYyBULCB0aGVuIHJlbW92ZSBcYyBGIGZyb20gdGhlIERBRy4KKyAgdm9pZCBSZXBsYWNlTm9kZShTRE5vZGUgKkYsIFNETm9kZSAqVCkgeworICAgIEN1ckRBRy0+UmVwbGFjZUFsbFVzZXNXaXRoKEYsIFQpOworICAgIEVuZm9yY2VOb2RlSWRJbnZhcmlhbnQoVCk7CisgICAgQ3VyREFHLT5SZW1vdmVEZWFkTm9kZShGKTsKKyAgfQorCisgIC8vLyBTZWxlY3RJbmxpbmVBc21NZW1vcnlPcGVyYW5kcyAtIENhbGxzIHRvIHRoaXMgYXJlIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkCisgIC8vLyBieSB0YmxnZW4uICBPdGhlcnMgc2hvdWxkIG5vdCBjYWxsIGl0LgorICB2b2lkIFNlbGVjdElubGluZUFzbU1lbW9yeU9wZXJhbmRzKHN0ZDo6dmVjdG9yPFNEVmFsdWU+ICZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RMb2MgJkRMKTsKKworICAvLy8gZ2V0UGF0dGVybkZvckluZGV4IC0gUGF0dGVybnMgc2VsZWN0ZWQgYnkgdGFibGVnZW4gZHVyaW5nIElTRUwKKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0UGF0dGVybkZvckluZGV4KHVuc2lnbmVkIGluZGV4KSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVGJsZ2VuIHNob3VsZCBnZW5lcmF0ZSB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhpcyEiKTsKKyAgfQorCisgIC8vLyBnZXRJbmNsdWRlUGF0aEZvckluZGV4IC0gZ2V0IHRoZSB0ZCBzb3VyY2UgbG9jYXRpb24gb2YgcGF0dGVybiBpbnN0YW50aWF0aW9uCisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldEluY2x1ZGVQYXRoRm9ySW5kZXgodW5zaWduZWQgaW5kZXgpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJUYmxnZW4gc2hvdWxkIGdlbmVyYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzISIpOworICB9CitwdWJsaWM6CisgIC8vIENhbGxzIHRvIHRoZXNlIHByZWRpY2F0ZXMgYXJlIGdlbmVyYXRlZCBieSB0YmxnZW4uCisgIGJvb2wgQ2hlY2tBbmRNYXNrKFNEVmFsdWUgTEhTLCBDb25zdGFudFNETm9kZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IERlc2lyZWRNYXNrUykgY29uc3Q7CisgIGJvb2wgQ2hlY2tPck1hc2soU0RWYWx1ZSBMSFMsIENvbnN0YW50U0ROb2RlICpSSFMsCisgICAgICAgICAgICAgICAgICAgIGludDY0X3QgRGVzaXJlZE1hc2tTKSBjb25zdDsKKworCisgIC8vLyBDaGVja1BhdHRlcm5QcmVkaWNhdGUgLSBUaGlzIGZ1bmN0aW9uIGlzIGdlbmVyYXRlZCBieSB0YmxnZW4gaW4gdGhlCisgIC8vLyB0YXJnZXQuICBJdCBydW5zIHRoZSBzcGVjaWZpZWQgcGF0dGVybiBwcmVkaWNhdGUgYW5kIHJldHVybnMgdHJ1ZSBpZiBpdAorICAvLy8gc3VjY2VlZHMgb3IgZmFsc2UgaWYgaXQgZmFpbHMuICBUaGUgbnVtYmVyIGlzIGEgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbgorICAvLy8gZGV0YWlsIHRvIHRoZSBjb2RlIHRibGdlbiBwcm9kdWNlcy4KKyAgdmlydHVhbCBib29sIENoZWNrUGF0dGVyblByZWRpY2F0ZSh1bnNpZ25lZCBQcmVkTm8pIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJUYmxnZW4gc2hvdWxkIGdlbmVyYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzISIpOworICB9CisKKyAgLy8vIENoZWNrTm9kZVByZWRpY2F0ZSAtIFRoaXMgZnVuY3Rpb24gaXMgZ2VuZXJhdGVkIGJ5IHRibGdlbiBpbiB0aGUgdGFyZ2V0LgorICAvLy8gSXQgcnVucyBub2RlIHByZWRpY2F0ZSBudW1iZXIgUHJlZE5vIGFuZCByZXR1cm5zIHRydWUgaWYgaXQgc3VjY2VlZHMgb3IKKyAgLy8vIGZhbHNlIGlmIGl0IGZhaWxzLiAgVGhlIG51bWJlciBpcyBhIHByaXZhdGUgaW1wbGVtZW50YXRpb24KKyAgLy8vIGRldGFpbCB0byB0aGUgY29kZSB0YmxnZW4gcHJvZHVjZXMuCisgIHZpcnR1YWwgYm9vbCBDaGVja05vZGVQcmVkaWNhdGUoU0ROb2RlICpOLCB1bnNpZ25lZCBQcmVkTm8pIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJUYmxnZW4gc2hvdWxkIGdlbmVyYXRlIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzISIpOworICB9CisKKyAgdmlydHVhbCBib29sIENoZWNrQ29tcGxleFBhdHRlcm4oU0ROb2RlICpSb290LCBTRE5vZGUgKlBhcmVudCwgU0RWYWx1ZSBOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQYXR0ZXJuTm8sCisgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPFNEVmFsdWUsIFNETm9kZSo+ID4gJlJlc3VsdCkgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlRibGdlbiBzaG91bGQgZ2VuZXJhdGUgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMhIik7CisgIH0KKworICB2aXJ0dWFsIFNEVmFsdWUgUnVuU0ROb2RlWEZvcm0oU0RWYWx1ZSBWLCB1bnNpZ25lZCBYRm9ybU5vKSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVGJsZ2VuIHNob3VsZCBnZW5lcmF0ZSB0aGlzISIpOworICB9CisKKyAgdm9pZCBTZWxlY3RDb2RlQ29tbW9uKFNETm9kZSAqTm9kZVRvTWF0Y2gsIGNvbnN0IHVuc2lnbmVkIGNoYXIgKk1hdGNoZXJUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFRhYmxlU2l6ZSk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBjb21wbGV4IHBhdHRlcm5zIGZvciB0aGlzIHRhcmdldCBjYW4gbXV0YXRlIHRoZQorICAvLy8gREFHLgorICB2aXJ0dWFsIGJvb2wgQ29tcGxleFBhdHRlcm5GdW5jTXV0YXRlc0RBRygpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBib29sIGlzT3JFcXVpdmFsZW50VG9BZGQoY29uc3QgU0ROb2RlICpOKSBjb25zdDsKKworcHJpdmF0ZToKKworICAvLyBDYWxscyB0byB0aGVzZSBmdW5jdGlvbnMgYXJlIGdlbmVyYXRlZCBieSB0YmxnZW4uCisgIHZvaWQgU2VsZWN0X0lOTElORUFTTShTRE5vZGUgKk4pOworICB2b2lkIFNlbGVjdF9SRUFEX1JFR0lTVEVSKFNETm9kZSAqTik7CisgIHZvaWQgU2VsZWN0X1dSSVRFX1JFR0lTVEVSKFNETm9kZSAqTik7CisgIHZvaWQgU2VsZWN0X1VOREVGKFNETm9kZSAqTik7CisgIHZvaWQgQ2Fubm90WWV0U2VsZWN0KFNETm9kZSAqTik7CisKK3ByaXZhdGU6CisgIHZvaWQgRG9JbnN0cnVjdGlvblNlbGVjdGlvbigpOworICBTRE5vZGUgKk1vcnBoTm9kZShTRE5vZGUgKk5vZGUsIHVuc2lnbmVkIFRhcmdldE9wYywgU0RWVExpc3QgVlRzLAorICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTRFZhbHVlPiBPcHMsIHVuc2lnbmVkIEVtaXROb2RlSW5mbyk7CisKKyAgU0ROb2RlICpNdXRhdGVTdHJpY3RGUFRvRlAoU0ROb2RlICpOb2RlLCB1bnNpZ25lZCBOZXdPcGMpOworCisgIC8vLyBQcmVwYXJlcyB0aGUgbGFuZGluZyBwYWQgdG8gdGFrZSBpbmNvbWluZyB2YWx1ZXMgb3IgZG8gb3RoZXIgRUgKKyAgLy8vIHBlcnNvbmFsaXR5IHNwZWNpZmljIHRhc2tzLiBSZXR1cm5zIHRydWUgaWYgdGhlIGJsb2NrIHNob3VsZCBiZQorICAvLy8gaW5zdHJ1Y3Rpb24gc2VsZWN0ZWQsIGZhbHNlIGlmIG5vIGNvZGUgc2hvdWxkIGJlIGVtaXR0ZWQgZm9yIGl0LgorICBib29sIFByZXBhcmVFSExhbmRpbmdQYWQoKTsKKworICAvLy8gXGJyaWVmIFBlcmZvcm0gaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIG9uIGFsbCBiYXNpYyBibG9ja3MgaW4gdGhlIGZ1bmN0aW9uLgorICB2b2lkIFNlbGVjdEFsbEJhc2ljQmxvY2tzKGNvbnN0IEZ1bmN0aW9uICZGbik7CisKKyAgLy8vIFxicmllZiBQZXJmb3JtIGluc3RydWN0aW9uIHNlbGVjdGlvbiBvbiBhIHNpbmdsZSBiYXNpYyBibG9jaywgZm9yCisgIC8vLyBpbnN0cnVjdGlvbnMgYmV0d2VlbiBccCBCZWdpbiBhbmQgXHAgRW5kLiAgXHAgSGFkVGFpbENhbGwgd2lsbCBiZSBzZXQKKyAgLy8vIHRvIHRydWUgaWYgYSBjYWxsIGluIHRoZSBibG9jayB3YXMgdHJhbnNsYXRlZCBhcyBhIHRhaWwgY2FsbC4KKyAgdm9pZCBTZWxlY3RCYXNpY0Jsb2NrKEJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmSGFkVGFpbENhbGwpOworICB2b2lkIEZpbmlzaEJhc2ljQmxvY2soKTsKKworICB2b2lkIENvZGVHZW5BbmRFbWl0REFHKCk7CisKKyAgLy8vIFxicmllZiBHZW5lcmF0ZSBpbnN0cnVjdGlvbnMgZm9yIGxvd2VyaW5nIHRoZSBpbmNvbWluZyBhcmd1bWVudHMgb2YgdGhlCisgIC8vLyBnaXZlbiBmdW5jdGlvbi4KKyAgdm9pZCBMb3dlckFyZ3VtZW50cyhjb25zdCBGdW5jdGlvbiAmRik7CisKKyAgdm9pZCBDb21wdXRlTGl2ZU91dFZSZWdJbmZvKCk7CisKKyAgLy8vIENyZWF0ZSB0aGUgc2NoZWR1bGVyLiBJZiBhIHNwZWNpZmljIHNjaGVkdWxlciB3YXMgc3BlY2lmaWVkCisgIC8vLyB2aWEgdGhlIFNjaGVkdWxlclJlZ2lzdHJ5LCB1c2UgaXQsIG90aGVyd2lzZSBzZWxlY3QgdGhlCisgIC8vLyBvbmUgcHJlZmVycmVkIGJ5IHRoZSB0YXJnZXQuCisgIC8vLworICBTY2hlZHVsZURBR1NETm9kZXMgKkNyZWF0ZVNjaGVkdWxlcigpOworCisgIC8vLyBPcGNvZGVPZmZzZXQgLSBUaGlzIGlzIGEgY2FjaGUgdXNlZCB0byBkaXNwYXRjaCBlZmZpY2llbnRseSBpbnRvIGlzZWwKKyAgLy8vIHN0YXRlIG1hY2hpbmVzIHRoYXQgc3RhcnQgd2l0aCBhIE9QQ19Td2l0Y2hPcGNvZGUgbm9kZS4KKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IE9wY29kZU9mZnNldDsKKworICB2b2lkIFVwZGF0ZUNoYWlucyhTRE5vZGUgKk5vZGVUb01hdGNoLCBTRFZhbHVlIElucHV0Q2hhaW4sCisgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxTRE5vZGUgKj4gJkNoYWluTm9kZXNNYXRjaGVkLAorICAgICAgICAgICAgICAgICAgICBib29sIGlzTW9ycGhOb2RlVG8pOworfTsKKworfQorCisjZW5kaWYgLyogTExWTV9DT0RFR0VOX1NFTEVDVElPTkRBR0lTRUxfSCAqLwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR05vZGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHTm9kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmI1YzAwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR05vZGVzLmgKQEAgLTAsMCArMSwyMzk5IEBACisvLz09PS0gbGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR05vZGVzLmggLSBTZWxlY3Rpb25EQUcgTm9kZXMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgU0ROb2RlIGNsYXNzIGFuZCBkZXJpdmVkIGNsYXNzZXMsIHdoaWNoIGFyZSB1c2VkIHRvCisvLyByZXByZXNlbnQgdGhlIG5vZGVzIGFuZCBvcGVyYXRpb25zIHByZXNlbnQgaW4gYSBTZWxlY3Rpb25EQUcuICBUaGVzZSBub2RlcworLy8gYW5kIG9wZXJhdGlvbnMgYXJlIG1hY2hpbmUgY29kZSBsZXZlbCBvcGVyYXRpb25zLCB3aXRoIHNvbWUgc2ltaWxhcml0aWVzIHRvCisvLyB0aGUgR0NDIFJUTCByZXByZXNlbnRhdGlvbi4KKy8vCisvLyBDbGllbnRzIHNob3VsZCBpbmNsdWRlIHRoZSBTZWxlY3Rpb25EQUcuaCBmaWxlIGluc3RlYWQgb2YgdGhpcyBmaWxlIGRpcmVjdGx5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1NFTEVDVElPTkRBR05PREVTX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1NFTEVDVElPTkRBR05PREVTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FQRmxvYXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0JpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ZvbGRpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdF9ub2RlLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9JU0RPcGNvZGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVNZW1PcGVyYW5kLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGVidWdMb2MuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01ldGFkYXRhLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsaWduT2YuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQXRvbWljT3JkZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hY2hpbmVWYWx1ZVR5cGUuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0dXBsZT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBUEludDsKK2NsYXNzIENvbnN0YW50OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBEZW5zZU1hcEluZm87CitjbGFzcyBHbG9iYWxWYWx1ZTsKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworY2xhc3MgTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlOworY2xhc3MgTUNTeW1ib2w7CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFNETm9kZTsKK2NsYXNzIFNlbGVjdGlvbkRBRzsKK2NsYXNzIFR5cGU7CitjbGFzcyBWYWx1ZTsKKwordm9pZCBjaGVja0ZvckN5Y2xlcyhjb25zdCBTRE5vZGUgKk4sIGNvbnN0IFNlbGVjdGlvbkRBRyAqREFHID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBmb3JjZSA9IGZhbHNlKTsKKworLy8vIFRoaXMgcmVwcmVzZW50cyBhIGxpc3Qgb2YgVmFsdWVUeXBlJ3MgdGhhdCBoYXMgYmVlbiBpbnRlcm4nZCBieQorLy8vIGEgU2VsZWN0aW9uREFHLiAgSW5zdGFuY2VzIG9mIHRoaXMgc2ltcGxlIHZhbHVlIGNsYXNzIGFyZSByZXR1cm5lZCBieQorLy8vIFNlbGVjdGlvbkRBRzo6Z2V0VlRMaXN0KC4uLikuCisvLy8KK3N0cnVjdCBTRFZUTGlzdCB7CisgIGNvbnN0IEVWVCAqVlRzOworICB1bnNpZ25lZCBpbnQgTnVtVlRzOworfTsKKworbmFtZXNwYWNlIElTRCB7CisKKyAgLy8vIE5vZGUgcHJlZGljYXRlcworCisgIC8vLyBJZiBOIGlzIGEgQlVJTERfVkVDVE9SIG5vZGUgd2hvc2UgZWxlbWVudHMgYXJlIGFsbCB0aGUgc2FtZSBjb25zdGFudCBvcgorICAvLy8gdW5kZWZpbmVkLCByZXR1cm4gdHJ1ZSBhbmQgcmV0dXJuIHRoZSBjb25zdGFudCB2YWx1ZSBpbiBccCBTcGxhdFZhbHVlLgorICBib29sIGlzQ29uc3RhbnRTcGxhdFZlY3Rvcihjb25zdCBTRE5vZGUgKk4sIEFQSW50ICZTcGxhdFZhbHVlKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBub2RlIGlzIGEgQlVJTERfVkVDVE9SIHdoZXJlIGFsbCBvZiB0aGUKKyAgLy8vIGVsZW1lbnRzIGFyZSB+MCBvciB1bmRlZi4KKyAgYm9vbCBpc0J1aWxkVmVjdG9yQWxsT25lcyhjb25zdCBTRE5vZGUgKk4pOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgYSBCVUlMRF9WRUNUT1Igd2hlcmUgYWxsIG9mIHRoZQorICAvLy8gZWxlbWVudHMgYXJlIDAgb3IgdW5kZWYuCisgIGJvb2wgaXNCdWlsZFZlY3RvckFsbFplcm9zKGNvbnN0IFNETm9kZSAqTik7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBhIEJVSUxEX1ZFQ1RPUiBub2RlIG9mIGFsbAorICAvLy8gQ29uc3RhbnRTRE5vZGUgb3IgdW5kZWYuCisgIGJvb2wgaXNCdWlsZFZlY3Rvck9mQ29uc3RhbnRTRE5vZGVzKGNvbnN0IFNETm9kZSAqTik7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBhIEJVSUxEX1ZFQ1RPUiBub2RlIG9mIGFsbAorICAvLy8gQ29uc3RhbnRGUFNETm9kZSBvciB1bmRlZi4KKyAgYm9vbCBpc0J1aWxkVmVjdG9yT2ZDb25zdGFudEZQU0ROb2Rlcyhjb25zdCBTRE5vZGUgKk4pOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgbm9kZSBoYXMgYXQgbGVhc3Qgb25lIG9wZXJhbmQgYW5kIGFsbCBvcGVyYW5kcyBvZiB0aGUKKyAgLy8vIHNwZWNpZmllZCBub2RlIGFyZSBJU0Q6OlVOREVGLgorICBib29sIGFsbE9wZXJhbmRzVW5kZWYoY29uc3QgU0ROb2RlICpOKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIElTRAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFVubGlrZSBMTFZNIHZhbHVlcywgU2VsZWN0aW9uIERBRyBub2RlcyBtYXkgcmV0dXJuIG11bHRpcGxlCisvLy8gdmFsdWVzIGFzIHRoZSByZXN1bHQgb2YgYSBjb21wdXRhdGlvbi4gIE1hbnkgbm9kZXMgcmV0dXJuIG11bHRpcGxlIHZhbHVlcywKKy8vLyBmcm9tIGxvYWRzICh3aGljaCBkZWZpbmUgYSB0b2tlbiBhbmQgYSByZXR1cm4gdmFsdWUpIHRvIEFEREMgKHdoaWNoIHJldHVybnMKKy8vLyBhIHJlc3VsdCBhbmQgYSBjYXJyeSB2YWx1ZSksIHRvIGNhbGxzICh3aGljaCBtYXkgcmV0dXJuIGFuIGFyYml0cmFyeSBudW1iZXIKKy8vLyBvZiB2YWx1ZXMpLgorLy8vCisvLy8gQXMgc3VjaCwgZWFjaCB1c2Ugb2YgYSBTZWxlY3Rpb25EQUcgY29tcHV0YXRpb24gbXVzdCBpbmRpY2F0ZSB0aGUgbm9kZSB0aGF0CisvLy8gY29tcHV0ZXMgaXQgYXMgd2VsbCBhcyB3aGljaCByZXR1cm4gdmFsdWUgdG8gdXNlIGZyb20gdGhhdCBub2RlLiAgVGhpcyBwYWlyCisvLy8gb2YgaW5mb3JtYXRpb24gaXMgcmVwcmVzZW50ZWQgd2l0aCB0aGUgU0RWYWx1ZSB2YWx1ZSB0eXBlLgorLy8vCitjbGFzcyBTRFZhbHVlIHsKKyAgZnJpZW5kIHN0cnVjdCBEZW5zZU1hcEluZm88U0RWYWx1ZT47CisKKyAgU0ROb2RlICpOb2RlID0gbnVsbHB0cjsgLy8gVGhlIG5vZGUgZGVmaW5pbmcgdGhlIHZhbHVlIHdlIGFyZSB1c2luZy4KKyAgdW5zaWduZWQgUmVzTm8gPSAwOyAgICAgLy8gV2hpY2ggcmV0dXJuIHZhbHVlIG9mIHRoZSBub2RlIHdlIGFyZSB1c2luZy4KKworcHVibGljOgorICBTRFZhbHVlKCkgPSBkZWZhdWx0OworICBTRFZhbHVlKFNETm9kZSAqbm9kZSwgdW5zaWduZWQgcmVzbm8pOworCisgIC8vLyBnZXQgdGhlIGluZGV4IHdoaWNoIHNlbGVjdHMgYSBzcGVjaWZpYyByZXN1bHQgaW4gdGhlIFNETm9kZQorICB1bnNpZ25lZCBnZXRSZXNObygpIGNvbnN0IHsgcmV0dXJuIFJlc05vOyB9CisKKyAgLy8vIGdldCB0aGUgU0ROb2RlIHdoaWNoIGhvbGRzIHRoZSBkZXNpcmVkIHJlc3VsdAorICBTRE5vZGUgKmdldE5vZGUoKSBjb25zdCB7IHJldHVybiBOb2RlOyB9CisKKyAgLy8vIHNldCB0aGUgU0ROb2RlCisgIHZvaWQgc2V0Tm9kZShTRE5vZGUgKk4pIHsgTm9kZSA9IE47IH0KKworICBpbmxpbmUgU0ROb2RlICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gTm9kZTsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTRFZhbHVlICZPKSBjb25zdCB7CisgICAgcmV0dXJuIE5vZGUgPT0gTy5Ob2RlICYmIFJlc05vID09IE8uUmVzTm87CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNEVmFsdWUgJk8pIGNvbnN0IHsKKyAgICByZXR1cm4gIW9wZXJhdG9yPT0oTyk7CisgIH0KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgU0RWYWx1ZSAmTykgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShOb2RlLCBSZXNObykgPCBzdGQ6OnRpZShPLk5vZGUsIE8uUmVzTm8pOworICB9CisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgcmV0dXJuIE5vZGUgIT0gbnVsbHB0cjsKKyAgfQorCisgIFNEVmFsdWUgZ2V0VmFsdWUodW5zaWduZWQgUikgY29uc3QgeworICAgIHJldHVybiBTRFZhbHVlKE5vZGUsIFIpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgbm9kZSBpcyBhbiBvcGVyYW5kIG9mIE4uCisgIGJvb2wgaXNPcGVyYW5kT2YoY29uc3QgU0ROb2RlICpOKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBWYWx1ZVR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgcmV0dXJuIHZhbHVlLgorICBpbmxpbmUgRVZUIGdldFZhbHVlVHlwZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIHNpbXBsZSBWYWx1ZVR5cGUgb2YgdGhlIHJlZmVyZW5jZWQgcmV0dXJuIHZhbHVlLgorICBNVlQgZ2V0U2ltcGxlVmFsdWVUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRWYWx1ZVR5cGUoKS5nZXRTaW1wbGVWVCgpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHZhbHVlIGluIGJpdHMuCisgIHVuc2lnbmVkIGdldFZhbHVlU2l6ZUluQml0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmFsdWVUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworICB9CisKKyAgdW5zaWduZWQgZ2V0U2NhbGFyVmFsdWVTaXplSW5CaXRzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRWYWx1ZVR5cGUoKS5nZXRTY2FsYXJUeXBlKCkuZ2V0U2l6ZUluQml0cygpOworICB9CisKKyAgLy8gRm9yd2FyZGluZyBtZXRob2RzIC0gVGhlc2UgZm9yd2FyZCB0byB0aGUgY29ycmVzcG9uZGluZyBtZXRob2RzIGluIFNETm9kZS4KKyAgaW5saW5lIHVuc2lnbmVkIGdldE9wY29kZSgpIGNvbnN0OworICBpbmxpbmUgdW5zaWduZWQgZ2V0TnVtT3BlcmFuZHMoKSBjb25zdDsKKyAgaW5saW5lIGNvbnN0IFNEVmFsdWUgJmdldE9wZXJhbmQodW5zaWduZWQgaSkgY29uc3Q7CisgIGlubGluZSB1aW50NjRfdCBnZXRDb25zdGFudE9wZXJhbmRWYWwodW5zaWduZWQgaSkgY29uc3Q7CisgIGlubGluZSBib29sIGlzVGFyZ2V0TWVtb3J5T3Bjb2RlKCkgY29uc3Q7CisgIGlubGluZSBib29sIGlzVGFyZ2V0T3Bjb2RlKCkgY29uc3Q7CisgIGlubGluZSBib29sIGlzTWFjaGluZU9wY29kZSgpIGNvbnN0OworICBpbmxpbmUgYm9vbCBpc1VuZGVmKCkgY29uc3Q7CisgIGlubGluZSB1bnNpZ25lZCBnZXRNYWNoaW5lT3Bjb2RlKCkgY29uc3Q7CisgIGlubGluZSBjb25zdCBEZWJ1Z0xvYyAmZ2V0RGVidWdMb2MoKSBjb25zdDsKKyAgaW5saW5lIHZvaWQgZHVtcCgpIGNvbnN0OworICBpbmxpbmUgdm9pZCBkdW1wKGNvbnN0IFNlbGVjdGlvbkRBRyAqRykgY29uc3Q7CisgIGlubGluZSB2b2lkIGR1bXByKCkgY29uc3Q7CisgIGlubGluZSB2b2lkIGR1bXByKGNvbnN0IFNlbGVjdGlvbkRBRyAqRykgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgb3BlcmFuZCAod2hpY2ggbXVzdCBiZSBhIGNoYWluKSByZWFjaGVzIHRoZQorICAvLy8gc3BlY2lmaWVkIG9wZXJhbmQgd2l0aG91dCBjcm9zc2luZyBhbnkgc2lkZS1lZmZlY3RpbmcgaW5zdHJ1Y3Rpb25zLgorICAvLy8gSW4gcHJhY3RpY2UsIHRoaXMgbG9va3MgdGhyb3VnaCB0b2tlbiBmYWN0b3JzIGFuZCBub24tdm9sYXRpbGUgbG9hZHMuCisgIC8vLyBJbiBvcmRlciB0byByZW1haW4gZWZmaWNpZW50LCB0aGlzIG9ubHkKKyAgLy8vIGxvb2tzIGEgY291cGxlIG9mIG5vZGVzIGluLCBpdCBkb2VzIG5vdCBkbyBhbiBleGhhdXN0aXZlIHNlYXJjaC4KKyAgYm9vbCByZWFjaGVzQ2hhaW5XaXRob3V0U2lkZUVmZmVjdHMoU0RWYWx1ZSBEZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgbm8gbm9kZXMgdXNpbmcgdmFsdWUgUmVzTm8gb2YgTm9kZS4KKyAgaW5saW5lIGJvb2wgdXNlX2VtcHR5KCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGV4YWN0bHkgb25lIG5vZGUgdXNpbmcgdmFsdWUgUmVzTm8gb2YgTm9kZS4KKyAgaW5saW5lIGJvb2wgaGFzT25lVXNlKCkgY29uc3Q7Cit9OworCit0ZW1wbGF0ZTw+IHN0cnVjdCBEZW5zZU1hcEluZm88U0RWYWx1ZT4geworICBzdGF0aWMgaW5saW5lIFNEVmFsdWUgZ2V0RW1wdHlLZXkoKSB7CisgICAgU0RWYWx1ZSBWOworICAgIFYuUmVzTm8gPSAtMVU7CisgICAgcmV0dXJuIFY7CisgIH0KKworICBzdGF0aWMgaW5saW5lIFNEVmFsdWUgZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIFNEVmFsdWUgVjsKKyAgICBWLlJlc05vID0gLTJVOworICAgIHJldHVybiBWOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBTRFZhbHVlICZWYWwpIHsKKyAgICByZXR1cm4gKCh1bnNpZ25lZCkoKHVpbnRwdHJfdClWYWwuZ2V0Tm9kZSgpID4+IDQpIF4KKyAgICAgICAgICAgICh1bnNpZ25lZCkoKHVpbnRwdHJfdClWYWwuZ2V0Tm9kZSgpID4+IDkpKSArIFZhbC5nZXRSZXNObygpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBTRFZhbHVlICZMSFMsIGNvbnN0IFNEVmFsdWUgJlJIUykgeworICAgIHJldHVybiBMSFMgPT0gUkhTOworICB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IGlzUG9kTGlrZTxTRFZhbHVlPiB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworLy8vIEFsbG93IGNhc3Rpbmcgb3BlcmF0b3JzIHRvIHdvcmsgZGlyZWN0bHkgb24KKy8vLyBTRFZhbHVlcyBhcyBpZiB0aGV5IHdlcmUgU0ROb2RlKidzLgordGVtcGxhdGU8PiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxTRFZhbHVlPiB7CisgIHVzaW5nIFNpbXBsZVR5cGUgPSBTRE5vZGUgKjsKKworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoU0RWYWx1ZSAmVmFsKSB7CisgICAgcmV0dXJuIFZhbC5nZXROb2RlKCk7CisgIH0KK307Cit0ZW1wbGF0ZTw+IHN0cnVjdCBzaW1wbGlmeV90eXBlPGNvbnN0IFNEVmFsdWU+IHsKKyAgdXNpbmcgU2ltcGxlVHlwZSA9IC8qY29uc3QqLyBTRE5vZGUgKjsKKworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoY29uc3QgU0RWYWx1ZSAmVmFsKSB7CisgICAgcmV0dXJuIFZhbC5nZXROb2RlKCk7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGEgdXNlIG9mIGEgU0ROb2RlLiBUaGlzIGNsYXNzIGhvbGRzIGFuIFNEVmFsdWUsCisvLy8gd2hpY2ggcmVjb3JkcyB0aGUgU0ROb2RlIGJlaW5nIHVzZWQgYW5kIHRoZSByZXN1bHQgbnVtYmVyLCBhCisvLy8gcG9pbnRlciB0byB0aGUgU0ROb2RlIHVzaW5nIHRoZSB2YWx1ZSwgYW5kIE5leHQgYW5kIFByZXYgcG9pbnRlcnMsCisvLy8gd2hpY2ggbGluayB0b2dldGhlciBhbGwgdGhlIHVzZXMgb2YgYW4gU0ROb2RlLgorLy8vCitjbGFzcyBTRFVzZSB7CisgIC8vLyBWYWwgLSBUaGUgdmFsdWUgYmVpbmcgdXNlZC4KKyAgU0RWYWx1ZSBWYWw7CisgIC8vLyBVc2VyIC0gVGhlIHVzZXIgb2YgdGhpcyB2YWx1ZS4KKyAgU0ROb2RlICpVc2VyID0gbnVsbHB0cjsKKyAgLy8vIFByZXYsIE5leHQgLSBQb2ludGVycyB0byB0aGUgdXNlcyBsaXN0IG9mIHRoZSBTRE5vZGUgcmVmZXJyZWQgYnkKKyAgLy8vIHRoaXMgb3BlcmFuZC4KKyAgU0RVc2UgKipQcmV2ID0gbnVsbHB0cjsKKyAgU0RVc2UgKk5leHQgPSBudWxscHRyOworCitwdWJsaWM6CisgIFNEVXNlKCkgPSBkZWZhdWx0OworICBTRFVzZShjb25zdCBTRFVzZSAmVSkgPSBkZWxldGU7CisgIFNEVXNlICZvcGVyYXRvcj0oY29uc3QgU0RVc2UgJikgPSBkZWxldGU7CisKKyAgLy8vIE5vcm1hbGx5IFNEVXNlIHdpbGwganVzdCBpbXBsaWNpdGx5IGNvbnZlcnQgdG8gYW4gU0RWYWx1ZSB0aGF0IGl0IGhvbGRzLgorICBvcGVyYXRvciBjb25zdCBTRFZhbHVlJigpIGNvbnN0IHsgcmV0dXJuIFZhbDsgfQorCisgIC8vLyBJZiBpbXBsaWNpdCBjb252ZXJzaW9uIHRvIFNEVmFsdWUgZG9lc24ndCB3b3JrLCB0aGUgZ2V0KCkgbWV0aG9kIHJldHVybnMKKyAgLy8vIHRoZSBTRFZhbHVlLgorICBjb25zdCBTRFZhbHVlICZnZXQoKSBjb25zdCB7IHJldHVybiBWYWw7IH0KKworICAvLy8gVGhpcyByZXR1cm5zIHRoZSBTRE5vZGUgdGhhdCBjb250YWlucyB0aGlzIFVzZS4KKyAgU0ROb2RlICpnZXRVc2VyKCkgeyByZXR1cm4gVXNlcjsgfQorCisgIC8vLyBHZXQgdGhlIG5leHQgU0RVc2UgaW4gdGhlIHVzZSBsaXN0LgorICBTRFVzZSAqZ2V0TmV4dCgpIGNvbnN0IHsgcmV0dXJuIE5leHQ7IH0KKworICAvLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGdldCgpLmdldE5vZGUoKS4KKyAgU0ROb2RlICpnZXROb2RlKCkgY29uc3QgeyByZXR1cm4gVmFsLmdldE5vZGUoKTsgfQorICAvLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGdldCgpLmdldFJlc05vKCkuCisgIHVuc2lnbmVkIGdldFJlc05vKCkgY29uc3QgeyByZXR1cm4gVmFsLmdldFJlc05vKCk7IH0KKyAgLy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBnZXQoKS5nZXRWYWx1ZVR5cGUoKS4KKyAgRVZUIGdldFZhbHVlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFZhbC5nZXRWYWx1ZVR5cGUoKTsgfQorCisgIC8vLyBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgZ2V0KCkub3BlcmF0b3I9PQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgU0RWYWx1ZSAmVikgY29uc3QgeworICAgIHJldHVybiBWYWwgPT0gVjsKKyAgfQorCisgIC8vLyBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgZ2V0KCkub3BlcmF0b3IhPQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgU0RWYWx1ZSAmVikgY29uc3QgeworICAgIHJldHVybiBWYWwgIT0gVjsKKyAgfQorCisgIC8vLyBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgZ2V0KCkub3BlcmF0b3I8CisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFNEVmFsdWUgJlYpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsIDwgVjsKKyAgfQorCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworICBmcmllbmQgY2xhc3MgU0ROb2RlOworICAvLyBUT0RPOiB1bmZyaWVuZCBIYW5kbGVTRE5vZGUgb25jZSB3ZSBmaXggaXRzIG9wZXJhbmQgaGFuZGxpbmcuCisgIGZyaWVuZCBjbGFzcyBIYW5kbGVTRE5vZGU7CisKKyAgdm9pZCBzZXRVc2VyKFNETm9kZSAqcCkgeyBVc2VyID0gcDsgfQorCisgIC8vLyBSZW1vdmUgdGhpcyB1c2UgZnJvbSBpdHMgZXhpc3RpbmcgdXNlIGxpc3QsIGFzc2lnbiBpdCB0aGUKKyAgLy8vIGdpdmVuIHZhbHVlLCBhbmQgYWRkIGl0IHRvIHRoZSBuZXcgdmFsdWUncyBub2RlJ3MgdXNlIGxpc3QuCisgIGlubGluZSB2b2lkIHNldChjb25zdCBTRFZhbHVlICZWKTsKKyAgLy8vIExpa2Ugc2V0LCBidXQgb25seSBzdXBwb3J0cyBpbml0aWFsaXppbmcgYSBuZXdseS1hbGxvY2F0ZWQKKyAgLy8vIFNEVXNlIHdpdGggYSBub24tbnVsbCB2YWx1ZS4KKyAgaW5saW5lIHZvaWQgc2V0SW5pdGlhbChjb25zdCBTRFZhbHVlICZWKTsKKyAgLy8vIExpa2Ugc2V0LCBidXQgb25seSBzZXRzIHRoZSBOb2RlIHBvcnRpb24gb2YgdGhlIHZhbHVlLAorICAvLy8gbGVhdmluZyB0aGUgUmVzTm8gcG9ydGlvbiB1bm1vZGlmaWVkLgorICBpbmxpbmUgdm9pZCBzZXROb2RlKFNETm9kZSAqTik7CisKKyAgdm9pZCBhZGRUb0xpc3QoU0RVc2UgKipMaXN0KSB7CisgICAgTmV4dCA9ICpMaXN0OworICAgIGlmIChOZXh0KSBOZXh0LT5QcmV2ID0gJk5leHQ7CisgICAgUHJldiA9IExpc3Q7CisgICAgKkxpc3QgPSB0aGlzOworICB9CisKKyAgdm9pZCByZW1vdmVGcm9tTGlzdCgpIHsKKyAgICAqUHJldiA9IE5leHQ7CisgICAgaWYgKE5leHQpIE5leHQtPlByZXYgPSBQcmV2OworICB9Cit9OworCisvLy8gc2ltcGxpZnlfdHlwZSBzcGVjaWFsaXphdGlvbnMgLSBBbGxvdyBjYXN0aW5nIG9wZXJhdG9ycyB0byB3b3JrIGRpcmVjdGx5IG9uCisvLy8gU0RWYWx1ZXMgYXMgaWYgdGhleSB3ZXJlIFNETm9kZSoncy4KK3RlbXBsYXRlPD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8U0RVc2U+IHsKKyAgdXNpbmcgU2ltcGxlVHlwZSA9IFNETm9kZSAqOworCisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShTRFVzZSAmVmFsKSB7CisgICAgcmV0dXJuIFZhbC5nZXROb2RlKCk7CisgIH0KK307CisKKy8vLyBUaGVzZSBhcmUgSVItbGV2ZWwgb3B0aW1pemF0aW9uIGZsYWdzIHRoYXQgbWF5IGJlIHByb3BhZ2F0ZWQgdG8gU0ROb2Rlcy4KKy8vLyBUT0RPOiBUaGlzIGRhdGEgc3RydWN0dXJlIHNob3VsZCBiZSBzaGFyZWQgYnkgdGhlIElSIG9wdGltaXplciBhbmQgdGhlCisvLy8gdGhlIGJhY2tlbmQuCitzdHJ1Y3QgU0ROb2RlRmxhZ3MgeworcHJpdmF0ZToKKyAgLy8gVGhpcyBiaXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGZsYWdzIGFyZSBpbiBhIGRlZmluZWQgc3RhdGUuCisgIC8vIEZsYWcgYml0cyBjYW4gb25seSBiZSBtYXNrZWQgb3V0IGR1cmluZyBpbnRlcnNlY3Rpb24gaWYgdGhlIG1hc2tpbmcgZmxhZ3MKKyAgLy8gYXJlIGRlZmluZWQuCisgIGJvb2wgQW55RGVmaW5lZCA6IDE7CisKKyAgYm9vbCBOb1Vuc2lnbmVkV3JhcCA6IDE7CisgIGJvb2wgTm9TaWduZWRXcmFwIDogMTsKKyAgYm9vbCBFeGFjdCA6IDE7CisgIGJvb2wgVW5zYWZlQWxnZWJyYSA6IDE7CisgIGJvb2wgTm9OYU5zIDogMTsKKyAgYm9vbCBOb0luZnMgOiAxOworICBib29sIE5vU2lnbmVkWmVyb3MgOiAxOworICBib29sIEFsbG93UmVjaXByb2NhbCA6IDE7CisgIGJvb2wgVmVjdG9yUmVkdWN0aW9uIDogMTsKKyAgYm9vbCBBbGxvd0NvbnRyYWN0IDogMTsKKworcHVibGljOgorICAvLy8gRGVmYXVsdCBjb25zdHJ1Y3RvciB0dXJucyBvZmYgYWxsIG9wdGltaXphdGlvbiBmbGFncy4KKyAgU0ROb2RlRmxhZ3MoKQorICAgICAgOiBBbnlEZWZpbmVkKGZhbHNlKSwgTm9VbnNpZ25lZFdyYXAoZmFsc2UpLCBOb1NpZ25lZFdyYXAoZmFsc2UpLAorICAgICAgICBFeGFjdChmYWxzZSksIFVuc2FmZUFsZ2VicmEoZmFsc2UpLCBOb05hTnMoZmFsc2UpLCBOb0luZnMoZmFsc2UpLAorICAgICAgICBOb1NpZ25lZFplcm9zKGZhbHNlKSwgQWxsb3dSZWNpcHJvY2FsKGZhbHNlKSwgVmVjdG9yUmVkdWN0aW9uKGZhbHNlKSwKKyAgICAgICAgQWxsb3dDb250cmFjdChmYWxzZSkge30KKworICAvLy8gU2V0cyB0aGUgc3RhdGUgb2YgdGhlIGZsYWdzIHRvIHRoZSBkZWZpbmVkIHN0YXRlLgorICB2b2lkIHNldERlZmluZWQoKSB7IEFueURlZmluZWQgPSB0cnVlOyB9CisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGZsYWdzIGFyZSBpbiBhIGRlZmluZWQgc3RhdGUuCisgIGJvb2wgaXNEZWZpbmVkKCkgY29uc3QgeyByZXR1cm4gQW55RGVmaW5lZDsgfQorCisgIC8vIFRoZXNlIGFyZSBtdXRhdG9ycyBmb3IgZWFjaCBmbGFnLgorICB2b2lkIHNldE5vVW5zaWduZWRXcmFwKGJvb2wgYikgeworICAgIHNldERlZmluZWQoKTsKKyAgICBOb1Vuc2lnbmVkV3JhcCA9IGI7CisgIH0KKyAgdm9pZCBzZXROb1NpZ25lZFdyYXAoYm9vbCBiKSB7CisgICAgc2V0RGVmaW5lZCgpOworICAgIE5vU2lnbmVkV3JhcCA9IGI7CisgIH0KKyAgdm9pZCBzZXRFeGFjdChib29sIGIpIHsKKyAgICBzZXREZWZpbmVkKCk7CisgICAgRXhhY3QgPSBiOworICB9CisgIHZvaWQgc2V0VW5zYWZlQWxnZWJyYShib29sIGIpIHsKKyAgICBzZXREZWZpbmVkKCk7CisgICAgVW5zYWZlQWxnZWJyYSA9IGI7CisgIH0KKyAgdm9pZCBzZXROb05hTnMoYm9vbCBiKSB7CisgICAgc2V0RGVmaW5lZCgpOworICAgIE5vTmFOcyA9IGI7CisgIH0KKyAgdm9pZCBzZXROb0luZnMoYm9vbCBiKSB7CisgICAgc2V0RGVmaW5lZCgpOworICAgIE5vSW5mcyA9IGI7CisgIH0KKyAgdm9pZCBzZXROb1NpZ25lZFplcm9zKGJvb2wgYikgeworICAgIHNldERlZmluZWQoKTsKKyAgICBOb1NpZ25lZFplcm9zID0gYjsKKyAgfQorICB2b2lkIHNldEFsbG93UmVjaXByb2NhbChib29sIGIpIHsKKyAgICBzZXREZWZpbmVkKCk7CisgICAgQWxsb3dSZWNpcHJvY2FsID0gYjsKKyAgfQorICB2b2lkIHNldFZlY3RvclJlZHVjdGlvbihib29sIGIpIHsKKyAgICBzZXREZWZpbmVkKCk7CisgICAgVmVjdG9yUmVkdWN0aW9uID0gYjsKKyAgfQorICB2b2lkIHNldEFsbG93Q29udHJhY3QoYm9vbCBiKSB7CisgICAgc2V0RGVmaW5lZCgpOworICAgIEFsbG93Q29udHJhY3QgPSBiOworICB9CisKKyAgLy8gVGhlc2UgYXJlIGFjY2Vzc29ycyBmb3IgZWFjaCBmbGFnLgorICBib29sIGhhc05vVW5zaWduZWRXcmFwKCkgY29uc3QgeyByZXR1cm4gTm9VbnNpZ25lZFdyYXA7IH0KKyAgYm9vbCBoYXNOb1NpZ25lZFdyYXAoKSBjb25zdCB7IHJldHVybiBOb1NpZ25lZFdyYXA7IH0KKyAgYm9vbCBoYXNFeGFjdCgpIGNvbnN0IHsgcmV0dXJuIEV4YWN0OyB9CisgIGJvb2wgaGFzVW5zYWZlQWxnZWJyYSgpIGNvbnN0IHsgcmV0dXJuIFVuc2FmZUFsZ2VicmE7IH0KKyAgYm9vbCBoYXNOb05hTnMoKSBjb25zdCB7IHJldHVybiBOb05hTnM7IH0KKyAgYm9vbCBoYXNOb0luZnMoKSBjb25zdCB7IHJldHVybiBOb0luZnM7IH0KKyAgYm9vbCBoYXNOb1NpZ25lZFplcm9zKCkgY29uc3QgeyByZXR1cm4gTm9TaWduZWRaZXJvczsgfQorICBib29sIGhhc0FsbG93UmVjaXByb2NhbCgpIGNvbnN0IHsgcmV0dXJuIEFsbG93UmVjaXByb2NhbDsgfQorICBib29sIGhhc1ZlY3RvclJlZHVjdGlvbigpIGNvbnN0IHsgcmV0dXJuIFZlY3RvclJlZHVjdGlvbjsgfQorICBib29sIGhhc0FsbG93Q29udHJhY3QoKSBjb25zdCB7IHJldHVybiBBbGxvd0NvbnRyYWN0OyB9CisKKyAgLy8vIENsZWFyIGFueSBmbGFncyBpbiB0aGlzIGZsYWcgc2V0IHRoYXQgYXJlbid0IGFsc28gc2V0IGluIEZsYWdzLgorICAvLy8gSWYgdGhlIGdpdmVuIEZsYWdzIGFyZSB1bmRlZmluZWQgdGhlbiBkb24ndCBkbyBhbnl0aGluZy4KKyAgdm9pZCBpbnRlcnNlY3RXaXRoKGNvbnN0IFNETm9kZUZsYWdzIEZsYWdzKSB7CisgICAgaWYgKCFGbGFncy5pc0RlZmluZWQoKSkKKyAgICAgIHJldHVybjsKKyAgICBOb1Vuc2lnbmVkV3JhcCAmPSBGbGFncy5Ob1Vuc2lnbmVkV3JhcDsKKyAgICBOb1NpZ25lZFdyYXAgJj0gRmxhZ3MuTm9TaWduZWRXcmFwOworICAgIEV4YWN0ICY9IEZsYWdzLkV4YWN0OworICAgIFVuc2FmZUFsZ2VicmEgJj0gRmxhZ3MuVW5zYWZlQWxnZWJyYTsKKyAgICBOb05hTnMgJj0gRmxhZ3MuTm9OYU5zOworICAgIE5vSW5mcyAmPSBGbGFncy5Ob0luZnM7CisgICAgTm9TaWduZWRaZXJvcyAmPSBGbGFncy5Ob1NpZ25lZFplcm9zOworICAgIEFsbG93UmVjaXByb2NhbCAmPSBGbGFncy5BbGxvd1JlY2lwcm9jYWw7CisgICAgVmVjdG9yUmVkdWN0aW9uICY9IEZsYWdzLlZlY3RvclJlZHVjdGlvbjsKKyAgICBBbGxvd0NvbnRyYWN0ICY9IEZsYWdzLkFsbG93Q29udHJhY3Q7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIG9uZSBub2RlIGluIHRoZSBTZWxlY3Rpb25EQUcuCisvLy8KK2NsYXNzIFNETm9kZSA6IHB1YmxpYyBGb2xkaW5nU2V0Tm9kZSwgcHVibGljIGlsaXN0X25vZGU8U0ROb2RlPiB7Citwcml2YXRlOgorICAvLy8gVGhlIG9wZXJhdGlvbiB0aGF0IHRoaXMgbm9kZSBwZXJmb3Jtcy4KKyAgaW50MTZfdCBOb2RlVHlwZTsKKworcHJvdGVjdGVkOgorICAvLyBXZSBkZWZpbmUgYSBzZXQgb2YgbWluaS1oZWxwZXIgY2xhc3NlcyB0byBoZWxwIHVzIGludGVycHJldCB0aGUgYml0cyBpbiBvdXIKKyAgLy8gU3ViY2xhc3NEYXRhLiAgVGhlc2UgYXJlIGRlc2lnbmVkIHRvIGZpdCB3aXRoaW4gYSB1aW50MTZfdCBzbyB0aGV5IHBhY2sKKyAgLy8gd2l0aCBOb2RlVHlwZS4KKworICBjbGFzcyBTRE5vZGVCaXRmaWVsZHMgeworICAgIGZyaWVuZCBjbGFzcyBTRE5vZGU7CisgICAgZnJpZW5kIGNsYXNzIE1lbUludHJpbnNpY1NETm9kZTsKKyAgICBmcmllbmQgY2xhc3MgTWVtU0ROb2RlOworICAgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisKKyAgICB1aW50MTZfdCBIYXNEZWJ1Z1ZhbHVlIDogMTsKKyAgICB1aW50MTZfdCBJc01lbUludHJpbnNpYyA6IDE7CisgICAgdWludDE2X3QgSXNEaXZlcmdlbnQgOiAxOworICB9OworICBlbnVtIHsgTnVtU0ROb2RlQml0cyA9IDMgfTsKKworICBjbGFzcyBDb25zdGFudFNETm9kZUJpdGZpZWxkcyB7CisgICAgZnJpZW5kIGNsYXNzIENvbnN0YW50U0ROb2RlOworCisgICAgdWludDE2X3QgOiBOdW1TRE5vZGVCaXRzOworCisgICAgdWludDE2X3QgSXNPcGFxdWUgOiAxOworICB9OworCisgIGNsYXNzIE1lbVNETm9kZUJpdGZpZWxkcyB7CisgICAgZnJpZW5kIGNsYXNzIE1lbVNETm9kZTsKKyAgICBmcmllbmQgY2xhc3MgTWVtSW50cmluc2ljU0ROb2RlOworICAgIGZyaWVuZCBjbGFzcyBBdG9taWNTRE5vZGU7CisKKyAgICB1aW50MTZfdCA6IE51bVNETm9kZUJpdHM7CisKKyAgICB1aW50MTZfdCBJc1ZvbGF0aWxlIDogMTsKKyAgICB1aW50MTZfdCBJc05vblRlbXBvcmFsIDogMTsKKyAgICB1aW50MTZfdCBJc0RlcmVmZXJlbmNlYWJsZSA6IDE7CisgICAgdWludDE2X3QgSXNJbnZhcmlhbnQgOiAxOworICB9OworICBlbnVtIHsgTnVtTWVtU0ROb2RlQml0cyA9IE51bVNETm9kZUJpdHMgKyA0IH07CisKKyAgY2xhc3MgTFNCYXNlU0ROb2RlQml0ZmllbGRzIHsKKyAgICBmcmllbmQgY2xhc3MgTFNCYXNlU0ROb2RlOworCisgICAgdWludDE2X3QgOiBOdW1NZW1TRE5vZGVCaXRzOworCisgICAgdWludDE2X3QgQWRkcmVzc2luZ01vZGUgOiAzOyAvLyBlbnVtIElTRDo6TWVtSW5kZXhlZE1vZGUKKyAgfTsKKyAgZW51bSB7IE51bUxTQmFzZVNETm9kZUJpdHMgPSBOdW1NZW1TRE5vZGVCaXRzICsgMyB9OworCisgIGNsYXNzIExvYWRTRE5vZGVCaXRmaWVsZHMgeworICAgIGZyaWVuZCBjbGFzcyBMb2FkU0ROb2RlOworICAgIGZyaWVuZCBjbGFzcyBNYXNrZWRMb2FkU0ROb2RlOworCisgICAgdWludDE2X3QgOiBOdW1MU0Jhc2VTRE5vZGVCaXRzOworCisgICAgdWludDE2X3QgRXh0VHkgOiAyOyAvLyBlbnVtIElTRDo6TG9hZEV4dFR5cGUKKyAgICB1aW50MTZfdCBJc0V4cGFuZGluZyA6IDE7CisgIH07CisKKyAgY2xhc3MgU3RvcmVTRE5vZGVCaXRmaWVsZHMgeworICAgIGZyaWVuZCBjbGFzcyBTdG9yZVNETm9kZTsKKyAgICBmcmllbmQgY2xhc3MgTWFza2VkU3RvcmVTRE5vZGU7CisKKyAgICB1aW50MTZfdCA6IE51bUxTQmFzZVNETm9kZUJpdHM7CisKKyAgICB1aW50MTZfdCBJc1RydW5jYXRpbmcgOiAxOworICAgIHVpbnQxNl90IElzQ29tcHJlc3NpbmcgOiAxOworICB9OworCisgIHVuaW9uIHsKKyAgICBjaGFyIFJhd1NETm9kZUJpdHNbc2l6ZW9mKHVpbnQxNl90KV07CisgICAgU0ROb2RlQml0ZmllbGRzIFNETm9kZUJpdHM7CisgICAgQ29uc3RhbnRTRE5vZGVCaXRmaWVsZHMgQ29uc3RhbnRTRE5vZGVCaXRzOworICAgIE1lbVNETm9kZUJpdGZpZWxkcyBNZW1TRE5vZGVCaXRzOworICAgIExTQmFzZVNETm9kZUJpdGZpZWxkcyBMU0Jhc2VTRE5vZGVCaXRzOworICAgIExvYWRTRE5vZGVCaXRmaWVsZHMgTG9hZFNETm9kZUJpdHM7CisgICAgU3RvcmVTRE5vZGVCaXRmaWVsZHMgU3RvcmVTRE5vZGVCaXRzOworICB9OworCisgIC8vIFJhd1NETm9kZUJpdHMgbXVzdCBjb3ZlciB0aGUgZW50aXJldHkgb2YgdGhlIHVuaW9uLiAgVGhpcyBtZWFucyB0aGF0IGFsbCBvZgorICAvLyB0aGUgdW5pb24ncyBtZW1iZXJzIG11c3QgaGF2ZSBzaXplIDw9IFJhd1NETm9kZUJpdHMuICBXZSB3cml0ZSB0aGUgUkhTIGFzCisgIC8vICIyIiBpbnN0ZWFkIG9mIHNpemVvZihSYXdTRE5vZGVCaXRzKSBiZWNhdXNlIE1TVkMgY2FuJ3QgaGFuZGxlIHRoZSBsYXR0ZXIuCisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKFNETm9kZUJpdGZpZWxkcykgPD0gMiwgImZpZWxkIHRvbyB3aWRlIik7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKENvbnN0YW50U0ROb2RlQml0ZmllbGRzKSA8PSAyLCAiZmllbGQgdG9vIHdpZGUiKTsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoTWVtU0ROb2RlQml0ZmllbGRzKSA8PSAyLCAiZmllbGQgdG9vIHdpZGUiKTsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoTFNCYXNlU0ROb2RlQml0ZmllbGRzKSA8PSAyLCAiZmllbGQgdG9vIHdpZGUiKTsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoTG9hZFNETm9kZUJpdGZpZWxkcykgPD0gNCwgImZpZWxkIHRvbyB3aWRlIik7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKFN0b3JlU0ROb2RlQml0ZmllbGRzKSA8PSAyLCAiZmllbGQgdG9vIHdpZGUiKTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKyAgLy8gVE9ETzogdW5mcmllbmQgSGFuZGxlU0ROb2RlIG9uY2Ugd2UgZml4IGl0cyBvcGVyYW5kIGhhbmRsaW5nLgorICBmcmllbmQgY2xhc3MgSGFuZGxlU0ROb2RlOworCisgIC8vLyBVbmlxdWUgaWQgcGVyIFNETm9kZSBpbiB0aGUgREFHLgorICBpbnQgTm9kZUlkID0gLTE7CisKKyAgLy8vIFRoZSB2YWx1ZXMgdGhhdCBhcmUgdXNlZCBieSB0aGlzIG9wZXJhdGlvbi4KKyAgU0RVc2UgKk9wZXJhbmRMaXN0ID0gbnVsbHB0cjsKKworICAvLy8gVGhlIHR5cGVzIG9mIHRoZSB2YWx1ZXMgdGhpcyBub2RlIGRlZmluZXMuICBTRE5vZGUncyBtYXkKKyAgLy8vIGRlZmluZSBtdWx0aXBsZSB2YWx1ZXMgc2ltdWx0YW5lb3VzbHkuCisgIGNvbnN0IEVWVCAqVmFsdWVMaXN0OworCisgIC8vLyBMaXN0IG9mIHVzZXMgZm9yIHRoaXMgU0ROb2RlLgorICBTRFVzZSAqVXNlTGlzdCA9IG51bGxwdHI7CisKKyAgLy8vIFRoZSBudW1iZXIgb2YgZW50cmllcyBpbiB0aGUgT3BlcmFuZC9WYWx1ZSBsaXN0LgorICB1bnNpZ25lZCBzaG9ydCBOdW1PcGVyYW5kcyA9IDA7CisgIHVuc2lnbmVkIHNob3J0IE51bVZhbHVlczsKKworICAvLyBUaGUgb3JkZXJpbmcgb2YgdGhlIFNETm9kZXMuIEl0IHJvdWdobHkgY29ycmVzcG9uZHMgdG8gdGhlIG9yZGVyaW5nIG9mIHRoZQorICAvLyBvcmlnaW5hbCBMTFZNIGluc3RydWN0aW9ucy4KKyAgLy8gVGhpcyBpcyB1c2VkIGZvciB0dXJuaW5nIG9mZiBzY2hlZHVsaW5nLCBiZWNhdXNlIHdlJ2xsIGZvcmdvCisgIC8vIHRoZSBub3JtYWwgc2NoZWR1bGluZyBhbGdvcml0aG1zIGFuZCBvdXRwdXQgdGhlIGluc3RydWN0aW9ucyBhY2NvcmRpbmcgdG8KKyAgLy8gdGhpcyBvcmRlcmluZy4KKyAgdW5zaWduZWQgSVJPcmRlcjsKKworICAvLy8gU291cmNlIGxpbmUgaW5mb3JtYXRpb24uCisgIERlYnVnTG9jIGRlYnVnTG9jOworCisgIC8vLyBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBzcGVjaWZpZWQgdmFsdWUgdHlwZS4KKyAgc3RhdGljIGNvbnN0IEVWVCAqZ2V0VmFsdWVUeXBlTGlzdChFVlQgVlQpOworCisgIFNETm9kZUZsYWdzIEZsYWdzOworCitwdWJsaWM6CisgIC8vLyBVbmlxdWUgYW5kIHBlcnNpc3RlbnQgaWQgcGVyIFNETm9kZSBpbiB0aGUgREFHLgorICAvLy8gVXNlZCBmb3IgZGVidWcgcHJpbnRpbmcuCisgIHVpbnQxNl90IFBlcnNpc3RlbnRJZDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gIEFjY2Vzc29ycworICAvLworCisgIC8vLyBSZXR1cm4gdGhlIFNlbGVjdGlvbkRBRyBvcGNvZGUgdmFsdWUgZm9yIHRoaXMgbm9kZS4gRm9yCisgIC8vLyBwcmUtaXNlbCBub2RlcyAodGhvc2UgZm9yIHdoaWNoIGlzTWFjaGluZU9wY29kZSByZXR1cm5zIGZhbHNlKSwgdGhlc2UKKyAgLy8vIGFyZSB0aGUgb3Bjb2RlIHZhbHVlcyBpbiB0aGUgSVNEIGFuZCA8dGFyZ2V0PklTRCBuYW1lc3BhY2VzLiBGb3IKKyAgLy8vIHBvc3QtaXNlbCBvcGNvZGVzLCBzZWUgZ2V0TWFjaGluZU9wY29kZS4KKyAgdW5zaWduZWQgZ2V0T3Bjb2RlKCkgIGNvbnN0IHsgcmV0dXJuICh1bnNpZ25lZCBzaG9ydClOb2RlVHlwZTsgfQorCisgIC8vLyBUZXN0IGlmIHRoaXMgbm9kZSBoYXMgYSB0YXJnZXQtc3BlY2lmaWMgb3Bjb2RlIChpbiB0aGUKKyAgLy8vIFw8dGFyZ2V0XD5JU0QgbmFtZXNwYWNlKS4KKyAgYm9vbCBpc1RhcmdldE9wY29kZSgpIGNvbnN0IHsgcmV0dXJuIE5vZGVUeXBlID49IElTRDo6QlVJTFRJTl9PUF9FTkQ7IH0KKworICAvLy8gVGVzdCBpZiB0aGlzIG5vZGUgaGFzIGEgdGFyZ2V0LXNwZWNpZmljCisgIC8vLyBtZW1vcnktcmVmZXJlbmNpbmcgb3Bjb2RlIChpbiB0aGUgXDx0YXJnZXRcPklTRCBuYW1lc3BhY2UgYW5kCisgIC8vLyBncmVhdGVyIHRoYW4gRklSU1RfVEFSR0VUX01FTU9SWV9PUENPREUpLgorICBib29sIGlzVGFyZ2V0TWVtb3J5T3Bjb2RlKCkgY29uc3QgeworICAgIHJldHVybiBOb2RlVHlwZSA+PSBJU0Q6OkZJUlNUX1RBUkdFVF9NRU1PUllfT1BDT0RFOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB0eXBlIG9mIHRoZSBub2RlIHR5cGUgdW5kZWZpbmVkLgorICBib29sIGlzVW5kZWYoKSBjb25zdCB7IHJldHVybiBOb2RlVHlwZSA9PSBJU0Q6OlVOREVGOyB9CisKKyAgLy8vIFRlc3QgaWYgdGhpcyBub2RlIGlzIGEgbWVtb3J5IGludHJpbnNpYyAod2l0aCB2YWxpZCBwb2ludGVyIGluZm9ybWF0aW9uKS4KKyAgLy8vIElOVFJJTlNJQ19XX0NIQUlOIGFuZCBJTlRSSU5TSUNfVk9JRCBub2RlcyBhcmUgc29tZXRpbWVzIGNyZWF0ZWQgZm9yCisgIC8vLyBub24tbWVtb3J5IGludHJpbnNpY3MgKHdpdGggY2hhaW5zKSB0aGF0IGFyZSBub3QgcmVhbGx5IGluc3RhbmNlcyBvZgorICAvLy8gTWVtU0ROb2RlLiBGb3Igc3VjaCBub2Rlcywgd2UgbmVlZCBzb21lIGV4dHJhIHN0YXRlIHRvIGRldGVybWluZSB0aGUKKyAgLy8vIHByb3BlciBjbGFzc29mIHJlbGF0aW9uc2hpcC4KKyAgYm9vbCBpc01lbUludHJpbnNpYygpIGNvbnN0IHsKKyAgICByZXR1cm4gKE5vZGVUeXBlID09IElTRDo6SU5UUklOU0lDX1dfQ0hBSU4gfHwKKyAgICAgICAgICAgIE5vZGVUeXBlID09IElTRDo6SU5UUklOU0lDX1ZPSUQpICYmCisgICAgICAgICAgIFNETm9kZUJpdHMuSXNNZW1JbnRyaW5zaWM7CisgIH0KKworICAvLy8gVGVzdCBpZiB0aGlzIG5vZGUgaXMgYSBzdHJpY3QgZmxvYXRpbmcgcG9pbnQgcHNldWRvLW9wLgorICBib29sIGlzU3RyaWN0RlBPcGNvZGUoKSB7CisgICAgc3dpdGNoIChOb2RlVHlwZSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgY2FzZSBJU0Q6OlNUUklDVF9GQUREOgorICAgICAgY2FzZSBJU0Q6OlNUUklDVF9GU1VCOgorICAgICAgY2FzZSBJU0Q6OlNUUklDVF9GTVVMOgorICAgICAgY2FzZSBJU0Q6OlNUUklDVF9GRElWOgorICAgICAgY2FzZSBJU0Q6OlNUUklDVF9GUkVNOgorICAgICAgY2FzZSBJU0Q6OlNUUklDVF9GTUE6CisgICAgICBjYXNlIElTRDo6U1RSSUNUX0ZTUVJUOgorICAgICAgY2FzZSBJU0Q6OlNUUklDVF9GUE9XOgorICAgICAgY2FzZSBJU0Q6OlNUUklDVF9GUE9XSToKKyAgICAgIGNhc2UgSVNEOjpTVFJJQ1RfRlNJTjoKKyAgICAgIGNhc2UgSVNEOjpTVFJJQ1RfRkNPUzoKKyAgICAgIGNhc2UgSVNEOjpTVFJJQ1RfRkVYUDoKKyAgICAgIGNhc2UgSVNEOjpTVFJJQ1RfRkVYUDI6CisgICAgICBjYXNlIElTRDo6U1RSSUNUX0ZMT0c6CisgICAgICBjYXNlIElTRDo6U1RSSUNUX0ZMT0cxMDoKKyAgICAgIGNhc2UgSVNEOjpTVFJJQ1RfRkxPRzI6CisgICAgICBjYXNlIElTRDo6U1RSSUNUX0ZSSU5UOgorICAgICAgY2FzZSBJU0Q6OlNUUklDVF9GTkVBUkJZSU5UOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworICAvLy8gVGVzdCBpZiB0aGlzIG5vZGUgaGFzIGEgcG9zdC1pc2VsIG9wY29kZSwgZGlyZWN0bHkKKyAgLy8vIGNvcnJlc3BvbmRpbmcgdG8gYSBNYWNoaW5lSW5zdHIgb3Bjb2RlLgorICBib29sIGlzTWFjaGluZU9wY29kZSgpIGNvbnN0IHsgcmV0dXJuIE5vZGVUeXBlIDwgMDsgfQorCisgIC8vLyBUaGlzIG1heSBvbmx5IGJlIGNhbGxlZCBpZiBpc01hY2hpbmVPcGNvZGUgcmV0dXJucworICAvLy8gdHJ1ZS4gSXQgcmV0dXJucyB0aGUgTWFjaGluZUluc3RyIG9wY29kZSB2YWx1ZSB0aGF0IHRoZSBub2RlJ3Mgb3Bjb2RlCisgIC8vLyBjb3JyZXNwb25kcyB0by4KKyAgdW5zaWduZWQgZ2V0TWFjaGluZU9wY29kZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNNYWNoaW5lT3Bjb2RlKCkgJiYgIk5vdCBhIE1hY2hpbmVJbnN0ciBvcGNvZGUhIik7CisgICAgcmV0dXJuIH5Ob2RlVHlwZTsKKyAgfQorCisgIGJvb2wgZ2V0SGFzRGVidWdWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFNETm9kZUJpdHMuSGFzRGVidWdWYWx1ZTsgfQorICB2b2lkIHNldEhhc0RlYnVnVmFsdWUoYm9vbCBiKSB7IFNETm9kZUJpdHMuSGFzRGVidWdWYWx1ZSA9IGI7IH0KKworICBib29sIGlzRGl2ZXJnZW50KCkgY29uc3QgeyByZXR1cm4gU0ROb2RlQml0cy5Jc0RpdmVyZ2VudDsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgbm8gdXNlcyBvZiB0aGlzIG5vZGUuCisgIGJvb2wgdXNlX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gVXNlTGlzdCA9PSBudWxscHRyOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZXJlIGlzIGV4YWN0bHkgb25lIHVzZSBvZiB0aGlzIG5vZGUuCisgIGJvb2wgaGFzT25lVXNlKCkgY29uc3QgeworICAgIHJldHVybiAhdXNlX2VtcHR5KCkgJiYgc3RkOjpuZXh0KHVzZV9iZWdpbigpKSA9PSB1c2VfZW5kKCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgdXNlcyBvZiB0aGlzIG5vZGUuIFRoaXMgbWV0aG9kIHRha2VzCisgIC8vLyB0aW1lIHByb3BvcnRpb25hbCB0byB0aGUgbnVtYmVyIG9mIHVzZXMuCisgIHNpemVfdCB1c2Vfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHN0ZDo6ZGlzdGFuY2UodXNlX2JlZ2luKCksIHVzZV9lbmQoKSk7IH0KKworICAvLy8gUmV0dXJuIHRoZSB1bmlxdWUgbm9kZSBpZC4KKyAgaW50IGdldE5vZGVJZCgpIGNvbnN0IHsgcmV0dXJuIE5vZGVJZDsgfQorCisgIC8vLyBTZXQgdW5pcXVlIG5vZGUgaWQuCisgIHZvaWQgc2V0Tm9kZUlkKGludCBJZCkgeyBOb2RlSWQgPSBJZDsgfQorCisgIC8vLyBSZXR1cm4gdGhlIG5vZGUgb3JkZXJpbmcuCisgIHVuc2lnbmVkIGdldElST3JkZXIoKSBjb25zdCB7IHJldHVybiBJUk9yZGVyOyB9CisKKyAgLy8vIFNldCB0aGUgbm9kZSBvcmRlcmluZy4KKyAgdm9pZCBzZXRJUk9yZGVyKHVuc2lnbmVkIE9yZGVyKSB7IElST3JkZXIgPSBPcmRlcjsgfQorCisgIC8vLyBSZXR1cm4gdGhlIHNvdXJjZSBsb2NhdGlvbiBpbmZvLgorICBjb25zdCBEZWJ1Z0xvYyAmZ2V0RGVidWdMb2MoKSBjb25zdCB7IHJldHVybiBkZWJ1Z0xvYzsgfQorCisgIC8vLyBTZXQgc291cmNlIGxvY2F0aW9uIGluZm8uICBUcnkgdG8gYXZvaWQgdGhpcywgcHV0dGluZworICAvLy8gaXQgaW4gdGhlIGNvbnN0cnVjdG9yIGlzIHByZWZlcmFibGUuCisgIHZvaWQgc2V0RGVidWdMb2MoRGVidWdMb2MgZGwpIHsgZGVidWdMb2MgPSBzdGQ6Om1vdmUoZGwpOyB9CisKKyAgLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgaXRlcmF0b3Igc3VwcG9ydCBmb3IgU0RVc2UKKyAgLy8vIG9wZXJhbmRzIHRoYXQgdXNlIGEgc3BlY2lmaWMgU0ROb2RlLgorICBjbGFzcyB1c2VfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIFNEVXNlLCBwdHJkaWZmX3Q+IHsKKyAgICBmcmllbmQgY2xhc3MgU0ROb2RlOworCisgICAgU0RVc2UgKk9wID0gbnVsbHB0cjsKKworICAgIGV4cGxpY2l0IHVzZV9pdGVyYXRvcihTRFVzZSAqb3ApIDogT3Aob3ApIHt9CisKKyAgcHVibGljOgorICAgIHVzaW5nIHJlZmVyZW5jZSA9IHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVXNlLCBwdHJkaWZmX3Q+OjpyZWZlcmVuY2U7CisgICAgdXNpbmcgcG9pbnRlciA9IHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFVzZSwgcHRyZGlmZl90Pjo6cG9pbnRlcjsKKworICAgIHVzZV9pdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgICB1c2VfaXRlcmF0b3IoY29uc3QgdXNlX2l0ZXJhdG9yICZJKSA6IE9wKEkuT3ApIHt9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgdXNlX2l0ZXJhdG9yICZ4KSBjb25zdCB7CisgICAgICByZXR1cm4gT3AgPT0geC5PcDsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHVzZV9pdGVyYXRvciAmeCkgY29uc3QgeworICAgICAgcmV0dXJuICFvcGVyYXRvcj09KHgpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGl0ZXJhdG9yIGlzIGF0IHRoZSBlbmQgb2YgdXNlcyBsaXN0LgorICAgIGJvb2wgYXRFbmQoKSBjb25zdCB7IHJldHVybiBPcCA9PSBudWxscHRyOyB9CisKKyAgICAvLyBJdGVyYXRvciB0cmF2ZXJzYWw6IGZvcndhcmQgaXRlcmF0aW9uIG9ubHkuCisgICAgdXNlX2l0ZXJhdG9yICZvcGVyYXRvcisrKCkgeyAgICAgICAgICAvLyBQcmVpbmNyZW1lbnQKKyAgICAgIGFzc2VydChPcCAmJiAiQ2Fubm90IGluY3JlbWVudCBlbmQgaXRlcmF0b3IhIik7CisgICAgICBPcCA9IE9wLT5nZXROZXh0KCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdXNlX2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7ICAgICAgICAvLyBQb3N0aW5jcmVtZW50CisgICAgICB1c2VfaXRlcmF0b3IgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7CisgICAgfQorCisgICAgLy8vIFJldHJpZXZlIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCB1c2VyIG5vZGUuCisgICAgU0ROb2RlICpvcGVyYXRvciooKSBjb25zdCB7CisgICAgICBhc3NlcnQoT3AgJiYgIkNhbm5vdCBkZXJlZmVyZW5jZSBlbmQgaXRlcmF0b3IhIik7CisgICAgICByZXR1cm4gT3AtPmdldFVzZXIoKTsKKyAgICB9CisKKyAgICBTRE5vZGUgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBvcGVyYXRvciooKTsgfQorCisgICAgU0RVc2UgJmdldFVzZSgpIGNvbnN0IHsgcmV0dXJuICpPcDsgfQorCisgICAgLy8vIFJldHJpZXZlIHRoZSBvcGVyYW5kICMgb2YgdGhpcyB1c2UgaW4gaXRzIHVzZXIuCisgICAgdW5zaWduZWQgZ2V0T3BlcmFuZE5vKCkgY29uc3QgeworICAgICAgYXNzZXJ0KE9wICYmICJDYW5ub3QgZGVyZWZlcmVuY2UgZW5kIGl0ZXJhdG9yISIpOworICAgICAgcmV0dXJuICh1bnNpZ25lZCkoT3AgLSBPcC0+Z2V0VXNlcigpLT5PcGVyYW5kTGlzdCk7CisgICAgfQorICB9OworCisgIC8vLyBQcm92aWRlIGl0ZXJhdGlvbiBzdXBwb3J0IHRvIHdhbGsgb3ZlciBhbGwgdXNlcyBvZiBhbiBTRE5vZGUuCisgIHVzZV9pdGVyYXRvciB1c2VfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIHVzZV9pdGVyYXRvcihVc2VMaXN0KTsKKyAgfQorCisgIHN0YXRpYyB1c2VfaXRlcmF0b3IgdXNlX2VuZCgpIHsgcmV0dXJuIHVzZV9pdGVyYXRvcihudWxscHRyKTsgfQorCisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTx1c2VfaXRlcmF0b3I+IHVzZXMoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UodXNlX2JlZ2luKCksIHVzZV9lbmQoKSk7CisgIH0KKyAgaW5saW5lIGl0ZXJhdG9yX3JhbmdlPHVzZV9pdGVyYXRvcj4gdXNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZSh1c2VfYmVnaW4oKSwgdXNlX2VuZCgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgZXhhY3RseSBOVVNFUyB1c2VzIG9mIHRoZSBpbmRpY2F0ZWQgdmFsdWUuCisgIC8vLyBUaGlzIG1ldGhvZCBpZ25vcmVzIHVzZXMgb2Ygb3RoZXIgdmFsdWVzIGRlZmluZWQgYnkgdGhpcyBvcGVyYXRpb24uCisgIGJvb2wgaGFzTlVzZXNPZlZhbHVlKHVuc2lnbmVkIE5Vc2VzLCB1bnNpZ25lZCBWYWx1ZSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgdXNlIG9mIHRoZSBpbmRpY2F0ZWQgdmFsdWUuCisgIC8vLyBUaGlzIG1ldGhvZCBpZ25vcmVzIHVzZXMgb2Ygb3RoZXIgdmFsdWVzIGRlZmluZWQgYnkgdGhpcyBvcGVyYXRpb24uCisgIGJvb2wgaGFzQW55VXNlT2ZWYWx1ZSh1bnNpZ25lZCBWYWx1ZSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgbm9kZSBpcyB0aGUgb25seSB1c2Ugb2YgTi4KKyAgYm9vbCBpc09ubHlVc2VyT2YoY29uc3QgU0ROb2RlICpOKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBub2RlIGlzIGFuIG9wZXJhbmQgb2YgTi4KKyAgYm9vbCBpc09wZXJhbmRPZihjb25zdCBTRE5vZGUgKk4pIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG5vZGUgaXMgYSBwcmVkZWNlc3NvciBvZiBOLgorICAvLy8gTk9URTogSW1wbGVtZW50ZWQgb24gdG9wIG9mIGhhc1ByZWRlY2Vzc29yIGFuZCBldmVyeSBiaXQgYXMKKyAgLy8vIGV4cGVuc2l2ZS4gVXNlIGNhcmVmdWxseS4KKyAgYm9vbCBpc1ByZWRlY2Vzc29yT2YoY29uc3QgU0ROb2RlICpOKSBjb25zdCB7CisgICAgcmV0dXJuIE4tPmhhc1ByZWRlY2Vzc29yKHRoaXMpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIE4gaXMgYSBwcmVkZWNlc3NvciBvZiB0aGlzIG5vZGUuCisgIC8vLyBOIGlzIGVpdGhlciBhbiBvcGVyYW5kIG9mIHRoaXMgbm9kZSwgb3IgY2FuIGJlIHJlYWNoZWQgYnkgcmVjdXJzaXZlbHkKKyAgLy8vIHRyYXZlcnNpbmcgdXAgdGhlIG9wZXJhbmRzLgorICAvLy8gTk9URTogVGhpcyBpcyBhbiBleHBlbnNpdmUgbWV0aG9kLiBVc2UgaXQgY2FyZWZ1bGx5LgorICBib29sIGhhc1ByZWRlY2Vzc29yKGNvbnN0IFNETm9kZSAqTikgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBOIGlzIGEgcHJlZGVjZXNzb3Igb2YgYW55IG5vZGUgaW4gV29ya2xpc3QuIFRoaXMKKyAgLy8vIGhlbHBlciBrZWVwcyBWaXNpdGVkIGFuZCBXb3JrbGlzdCBzZXRzIGV4dGVybmFsbHkgdG8gYWxsb3cgdW5pb25zCisgIC8vLyBzZWFyY2hlcyB0byBiZSBwZXJmb3JtZWQgaW4gcGFyYWxsZWwsIGNhY2hpbmcgb2YgcmVzdWx0cyBhY3Jvc3MKKyAgLy8vIHF1ZXJpZXMgYW5kIGluY3JlbWVudGFsIGFkZGl0aW9uIHRvIFdvcmtsaXN0LiBTdG9wcyBlYXJseSBpZiBOIGlzCisgIC8vLyBmb3VuZCBidXQgd2lsbCByZXN1bWUuIFJlbWVtYmVyIHRvIGNsZWFyIFZpc2l0ZWQgYW5kIFdvcmtsaXN0cworICAvLy8gaWYgREFHIGNoYW5nZXMuIE1heFN0ZXBzIGdpdmVzIGEgbWF4aW11bSBudW1iZXIgb2Ygbm9kZXMgdG8gdmlzaXQgYmVmb3JlCisgIC8vLyBnaXZpbmcgdXAuIFRoZSBUb3BvbG9naWNhbFBydW5lIGZsYWcgc2lnbmFscyB0aGF0IHBvc2l0aXZlIE5vZGVJZHMgYXJlCisgIC8vLyB0b3BvbG9naWNhbGx5IG9yZGVyZWQgKE9wZXJhbmRzIGhhdmUgc3RyaWN0bHkgc21hbGxlciBub2RlIGlkKSBhbmQgc2VhcmNoCisgIC8vLyBjYW4gYmUgcHJ1bmVkIGxldmVyYWdpbmcgdGhpcy4KKyAgc3RhdGljIGJvb2wgaGFzUHJlZGVjZXNzb3JIZWxwZXIoY29uc3QgU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldEltcGw8Y29uc3QgU0ROb2RlICo+ICZWaXNpdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgU0ROb2RlICo+ICZXb3JrbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IE1heFN0ZXBzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBUb3BvbG9naWNhbFBydW5lID0gZmFsc2UpIHsKKyAgICBTbWFsbFZlY3Rvcjxjb25zdCBTRE5vZGUgKiwgOD4gRGVmZXJyZWROb2RlczsKKyAgICBpZiAoVmlzaXRlZC5jb3VudChOKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gTm9kZSBJZCdzIGFyZSBhc3NpZ25lZCBpbiB0aHJlZSBwbGFjZXM6IEFzIGEgdG9wb2xvZ2ljYWwKKyAgICAvLyBvcmRlcmluZyAoPiAwKSwgZHVyaW5nIGxlZ2FsaXphdGlvbiAocmVzdWx0cyBpbiB2YWx1ZXMgc2V0IHRvCisgICAgLy8gMCksIG5ldyBub2RlcyAoc2V0IHRvIC0xKS4gSWYgTiBoYXMgYSB0b3BvbGdpY2FsIGlkIHRoZW4gd2UKKyAgICAvLyBrbm93IHRoYXQgYWxsIG5vZGVzIHdpdGggaWRzIHNtYWxsZXIgdGhhbiBpdCBjYW5ub3QgYmUKKyAgICAvLyBzdWNjZXNzb3JzIGFuZCB3ZSBuZWVkIG5vdCBjaGVjayB0aGVtLiBGaWx0ZXIgb3V0IGFsbCBub2RlCisgICAgLy8gdGhhdCBjYW4ndCBiZSBtYXRjaGVzLiBXZSBhZGQgdGhlbSB0byB0aGUgd29ya2xpc3QgYmVmb3JlIGV4aXQKKyAgICAvLyBpbiBjYXNlIG9mIG11bHRpcGxlIGNhbGxzLiBOb3RlIHRoYXQgZHVyaW5nIHNlbGVjdGlvbiB0aGUgdG9wb2xvZ2ljYWwgaWQKKyAgICAvLyBtYXkgYmUgdmlvbGF0ZWQgaWYgYSBub2RlJ3MgcHJlZGVjZXNzb3IgaXMgc2VsZWN0ZWQgYmVmb3JlIGl0LiBXZSBtYXJrCisgICAgLy8gdGhpcyBhdCBzZWxlY3Rpb24gbmVnYXRpbmcgdGhlIGlkIG9mIHVuc2VsZWN0ZWQgc3VjY2Vzc29ycyBhbmQKKyAgICAvLyByZXN0cmljdGluZyB0b3BvbG9naWNhbCBwcnVuaW5nIHRvIHBvc2l0aXZlIGlkcy4KKworICAgIGludCBOSWQgPSBOLT5nZXROb2RlSWQoKTsKKyAgICAvLyBJZiB3ZSBJbnZhbGlkYXRlZCB0aGUgSWQsIHJlY29uc3RydWN0IG9yaWdpbmFsIE5JZC4KKyAgICBpZiAoTklkIDwgLTEpCisgICAgICBOSWQgPSAtKE5JZCArIDEpOworCisgICAgYm9vbCBGb3VuZCA9IGZhbHNlOworICAgIHdoaWxlICghV29ya2xpc3QuZW1wdHkoKSkgeworICAgICAgY29uc3QgU0ROb2RlICpNID0gV29ya2xpc3QucG9wX2JhY2tfdmFsKCk7CisgICAgICBpbnQgTUlkID0gTS0+Z2V0Tm9kZUlkKCk7CisgICAgICBpZiAoVG9wb2xvZ2ljYWxQcnVuZSAmJiBNLT5nZXRPcGNvZGUoKSAhPSBJU0Q6OlRva2VuRmFjdG9yICYmIChOSWQgPiAwKSAmJgorICAgICAgICAgIChNSWQgPiAwKSAmJiAoTUlkIDwgTklkKSkgeworICAgICAgICBEZWZlcnJlZE5vZGVzLnB1c2hfYmFjayhNKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBmb3IgKGNvbnN0IFNEVmFsdWUgJk9wViA6IE0tPm9wX3ZhbHVlcygpKSB7CisgICAgICAgIFNETm9kZSAqT3AgPSBPcFYuZ2V0Tm9kZSgpOworICAgICAgICBpZiAoVmlzaXRlZC5pbnNlcnQoT3ApLnNlY29uZCkKKyAgICAgICAgICBXb3JrbGlzdC5wdXNoX2JhY2soT3ApOworICAgICAgICBpZiAoT3AgPT0gTikKKyAgICAgICAgICBGb3VuZCA9IHRydWU7CisgICAgICB9CisgICAgICBpZiAoRm91bmQpCisgICAgICAgIGJyZWFrOworICAgICAgaWYgKE1heFN0ZXBzICE9IDAgJiYgVmlzaXRlZC5zaXplKCkgPj0gTWF4U3RlcHMpCisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAvLyBQdXNoIGRlZmVycmVkIG5vZGVzIGJhY2sgb24gd29ya2xpc3QuCisgICAgV29ya2xpc3QuYXBwZW5kKERlZmVycmVkTm9kZXMuYmVnaW4oKSwgRGVmZXJyZWROb2Rlcy5lbmQoKSk7CisgICAgLy8gSWYgd2UgYmFpbGVkIGVhcmx5LCBjb25zZXJ2YXRpdmVseSByZXR1cm4gZm91bmQuCisgICAgaWYgKE1heFN0ZXBzICE9IDAgJiYgVmlzaXRlZC5zaXplKCkgPj0gTWF4U3RlcHMpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gRm91bmQ7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgYWxsIHRoZSB1c2VycyBvZiBOIGFyZSBjb250YWluZWQgaW4gTm9kZXMuCisgIC8vLyBOT1RFOiBSZXF1aXJlcyBhdCBsZWFzdCBvbmUgbWF0Y2gsIGJ1dCBkb2Vzbid0IHJlcXVpcmUgdGhlbSBhbGwuCisgIHN0YXRpYyBib29sIGFyZU9ubHlVc2Vyc09mKEFycmF5UmVmPGNvbnN0IFNETm9kZSAqPiBOb2RlcywgY29uc3QgU0ROb2RlICpOKTsKKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgdmFsdWVzIHVzZWQgYnkgdGhpcyBvcGVyYXRpb24uCisgIHVuc2lnbmVkIGdldE51bU9wZXJhbmRzKCkgY29uc3QgeyByZXR1cm4gTnVtT3BlcmFuZHM7IH0KKworICAvLy8gSGVscGVyIG1ldGhvZCByZXR1cm5zIHRoZSBpbnRlZ2VyIHZhbHVlIG9mIGEgQ29uc3RhbnRTRE5vZGUgb3BlcmFuZC4KKyAgaW5saW5lIHVpbnQ2NF90IGdldENvbnN0YW50T3BlcmFuZFZhbCh1bnNpZ25lZCBOdW0pIGNvbnN0OworCisgIGNvbnN0IFNEVmFsdWUgJmdldE9wZXJhbmQodW5zaWduZWQgTnVtKSBjb25zdCB7CisgICAgYXNzZXJ0KE51bSA8IE51bU9wZXJhbmRzICYmICJJbnZhbGlkIGNoaWxkICMgb2YgU0ROb2RlISIpOworICAgIHJldHVybiBPcGVyYW5kTGlzdFtOdW1dOworICB9CisKKyAgdXNpbmcgb3BfaXRlcmF0b3IgPSBTRFVzZSAqOworCisgIG9wX2l0ZXJhdG9yIG9wX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gT3BlcmFuZExpc3Q7IH0KKyAgb3BfaXRlcmF0b3Igb3BfZW5kKCkgY29uc3QgeyByZXR1cm4gT3BlcmFuZExpc3QrTnVtT3BlcmFuZHM7IH0KKyAgQXJyYXlSZWY8U0RVc2U+IG9wcygpIGNvbnN0IHsgcmV0dXJuIG1ha2VBcnJheVJlZihvcF9iZWdpbigpLCBvcF9lbmQoKSk7IH0KKworICAvLy8gSXRlcmF0b3IgZm9yIGRpcmVjdGx5IGl0ZXJhdGluZyBvdmVyIHRoZSBvcGVyYW5kIFNEVmFsdWUncy4KKyAgc3RydWN0IHZhbHVlX29wX2l0ZXJhdG9yCisgICAgICA6IGl0ZXJhdG9yX2FkYXB0b3JfYmFzZTx2YWx1ZV9vcF9pdGVyYXRvciwgb3BfaXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBTRFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90LCB2YWx1ZV9vcF9pdGVyYXRvciAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfb3BfaXRlcmF0b3IgKj4geworICAgIGV4cGxpY2l0IHZhbHVlX29wX2l0ZXJhdG9yKFNEVXNlICpVID0gbnVsbHB0cikKKyAgICAgIDogaXRlcmF0b3JfYWRhcHRvcl9iYXNlKFUpIHt9CisKKyAgICBjb25zdCBTRFZhbHVlICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBJLT5nZXQoKTsgfQorICB9OworCisgIGl0ZXJhdG9yX3JhbmdlPHZhbHVlX29wX2l0ZXJhdG9yPiBvcF92YWx1ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UodmFsdWVfb3BfaXRlcmF0b3Iob3BfYmVnaW4oKSksCisgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfb3BfaXRlcmF0b3Iob3BfZW5kKCkpKTsKKyAgfQorCisgIFNEVlRMaXN0IGdldFZUTGlzdCgpIGNvbnN0IHsKKyAgICBTRFZUTGlzdCBYID0geyBWYWx1ZUxpc3QsIE51bVZhbHVlcyB9OworICAgIHJldHVybiBYOworICB9CisKKyAgLy8vIElmIHRoaXMgbm9kZSBoYXMgYSBnbHVlIG9wZXJhbmQsIHJldHVybiB0aGUgbm9kZQorICAvLy8gdG8gd2hpY2ggdGhlIGdsdWUgb3BlcmFuZCBwb2ludHMuIE90aGVyd2lzZSByZXR1cm4gTlVMTC4KKyAgU0ROb2RlICpnZXRHbHVlZE5vZGUoKSBjb25zdCB7CisgICAgaWYgKGdldE51bU9wZXJhbmRzKCkgIT0gMCAmJgorICAgICAgICBnZXRPcGVyYW5kKGdldE51bU9wZXJhbmRzKCktMSkuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpHbHVlKQorICAgICAgcmV0dXJuIGdldE9wZXJhbmQoZ2V0TnVtT3BlcmFuZHMoKS0xKS5nZXROb2RlKCk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gSWYgdGhpcyBub2RlIGhhcyBhIGdsdWUgdmFsdWUgd2l0aCBhIHVzZXIsIHJldHVybgorICAvLy8gdGhlIHVzZXIgKHRoZXJlIGlzIGF0IG1vc3Qgb25lKS4gT3RoZXJ3aXNlIHJldHVybiBOVUxMLgorICBTRE5vZGUgKmdldEdsdWVkVXNlcigpIGNvbnN0IHsKKyAgICBmb3IgKHVzZV9pdGVyYXRvciBVSSA9IHVzZV9iZWdpbigpLCBVRSA9IHVzZV9lbmQoKTsgVUkgIT0gVUU7ICsrVUkpCisgICAgICBpZiAoVUkuZ2V0VXNlKCkuZ2V0KCkuZ2V0VmFsdWVUeXBlKCkgPT0gTVZUOjpHbHVlKQorICAgICAgICByZXR1cm4gKlVJOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgY29uc3QgU0ROb2RlRmxhZ3MgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBGbGFnczsgfQorICB2b2lkIHNldEZsYWdzKFNETm9kZUZsYWdzIE5ld0ZsYWdzKSB7IEZsYWdzID0gTmV3RmxhZ3M7IH0KKworICAvLy8gQ2xlYXIgYW55IGZsYWdzIGluIHRoaXMgbm9kZSB0aGF0IGFyZW4ndCBhbHNvIHNldCBpbiBGbGFncy4KKyAgLy8vIElmIEZsYWdzIGlzIG5vdCBpbiBhIGRlZmluZWQgc3RhdGUgdGhlbiB0aGlzIGhhcyBubyBlZmZlY3QuCisgIHZvaWQgaW50ZXJzZWN0RmxhZ3NXaXRoKGNvbnN0IFNETm9kZUZsYWdzIEZsYWdzKTsKKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgdmFsdWVzIGRlZmluZWQvcmV0dXJuZWQgYnkgdGhpcyBvcGVyYXRvci4KKyAgdW5zaWduZWQgZ2V0TnVtVmFsdWVzKCkgY29uc3QgeyByZXR1cm4gTnVtVmFsdWVzOyB9CisKKyAgLy8vIFJldHVybiB0aGUgdHlwZSBvZiBhIHNwZWNpZmllZCByZXN1bHQuCisgIEVWVCBnZXRWYWx1ZVR5cGUodW5zaWduZWQgUmVzTm8pIGNvbnN0IHsKKyAgICBhc3NlcnQoUmVzTm8gPCBOdW1WYWx1ZXMgJiYgIklsbGVnYWwgcmVzdWx0IG51bWJlciEiKTsKKyAgICByZXR1cm4gVmFsdWVMaXN0W1Jlc05vXTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHR5cGUgb2YgYSBzcGVjaWZpZWQgcmVzdWx0IGFzIGEgc2ltcGxlIHR5cGUuCisgIE1WVCBnZXRTaW1wbGVWYWx1ZVR5cGUodW5zaWduZWQgUmVzTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmFsdWVUeXBlKFJlc05vKS5nZXRTaW1wbGVWVCgpOworICB9CisKKyAgLy8vIFJldHVybnMgTVZUOjpnZXRTaXplSW5CaXRzKGdldFZhbHVlVHlwZShSZXNObykpLgorICB1bnNpZ25lZCBnZXRWYWx1ZVNpemVJbkJpdHModW5zaWduZWQgUmVzTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmFsdWVUeXBlKFJlc05vKS5nZXRTaXplSW5CaXRzKCk7CisgIH0KKworICB1c2luZyB2YWx1ZV9pdGVyYXRvciA9IGNvbnN0IEVWVCAqOworCisgIHZhbHVlX2l0ZXJhdG9yIHZhbHVlX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gVmFsdWVMaXN0OyB9CisgIHZhbHVlX2l0ZXJhdG9yIHZhbHVlX2VuZCgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlTGlzdCtOdW1WYWx1ZXM7IH0KKworICAvLy8gUmV0dXJuIHRoZSBvcGNvZGUgb2YgdGhpcyBvcGVyYXRpb24gZm9yIHByaW50aW5nLgorICBzdGQ6OnN0cmluZyBnZXRPcGVyYXRpb25OYW1lKGNvbnN0IFNlbGVjdGlvbkRBRyAqRyA9IG51bGxwdHIpIGNvbnN0OworICBzdGF0aWMgY29uc3QgY2hhciogZ2V0SW5kZXhlZE1vZGVOYW1lKElTRDo6TWVtSW5kZXhlZE1vZGUgQU0pOworICB2b2lkIHByaW50X3R5cGVzKHJhd19vc3RyZWFtICZPUywgY29uc3QgU2VsZWN0aW9uREFHICpHKSBjb25zdDsKKyAgdm9pZCBwcmludF9kZXRhaWxzKHJhd19vc3RyZWFtICZPUywgY29uc3QgU2VsZWN0aW9uREFHICpHKSBjb25zdDsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFNlbGVjdGlvbkRBRyAqRyA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIHByaW50cihyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFNlbGVjdGlvbkRBRyAqRyA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBQcmludCBhIFNlbGVjdGlvbkRBRyBub2RlIGFuZCBhbGwgY2hpbGRyZW4gZG93biB0bworICAvLy8gdGhlIGxlYXZlcy4gIFRoZSBnaXZlbiBTZWxlY3Rpb25EQUcgYWxsb3dzIHRhcmdldC1zcGVjaWZpYyBub2RlcworICAvLy8gdG8gYmUgcHJpbnRlZCBpbiBodW1hbi1yZWFkYWJsZSBmb3JtLiAgVW5saWtlIHByaW50ciwgdGhpcyB3aWxsCisgIC8vLyBwcmludCB0aGUgd2hvbGUgREFHLCBpbmNsdWRpbmcgY2hpbGRyZW4gdGhhdCBhcHBlYXIgbXVsdGlwbGUKKyAgLy8vIHRpbWVzLgorICAvLy8KKyAgdm9pZCBwcmludHJGdWxsKHJhd19vc3RyZWFtICZPLCBjb25zdCBTZWxlY3Rpb25EQUcgKkcgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gUHJpbnQgYSBTZWxlY3Rpb25EQUcgbm9kZSBhbmQgY2hpbGRyZW4gdXAgdG8KKyAgLy8vIGRlcHRoICJkZXB0aC4iICBUaGUgZ2l2ZW4gU2VsZWN0aW9uREFHIGFsbG93cyB0YXJnZXQtc3BlY2lmaWMKKyAgLy8vIG5vZGVzIHRvIGJlIHByaW50ZWQgaW4gaHVtYW4tcmVhZGFibGUgZm9ybS4gIFVubGlrZSBwcmludHIsIHRoaXMKKyAgLy8vIHdpbGwgcHJpbnQgY2hpbGRyZW4gdGhhdCBhcHBlYXIgbXVsdGlwbGUgdGltZXMgd2hlcmV2ZXIgdGhleSBhcmUKKyAgLy8vIHVzZWQuCisgIC8vLworICB2b2lkIHByaW50cldpdGhEZXB0aChyYXdfb3N0cmVhbSAmTywgY29uc3QgU2VsZWN0aW9uREFHICpHID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZGVwdGggPSAxMDApIGNvbnN0OworCisgIC8vLyBEdW1wIHRoaXMgbm9kZSwgZm9yIGRlYnVnZ2luZy4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8vIER1bXAgKHJlY3Vyc2l2ZWx5KSB0aGlzIG5vZGUgYW5kIGl0cyB1c2UtZGVmIHN1YmdyYXBoLgorICB2b2lkIGR1bXByKCkgY29uc3Q7CisKKyAgLy8vIER1bXAgdGhpcyBub2RlLCBmb3IgZGVidWdnaW5nLgorICAvLy8gVGhlIGdpdmVuIFNlbGVjdGlvbkRBRyBhbGxvd3MgdGFyZ2V0LXNwZWNpZmljIG5vZGVzIHRvIGJlIHByaW50ZWQKKyAgLy8vIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0uCisgIHZvaWQgZHVtcChjb25zdCBTZWxlY3Rpb25EQUcgKkcpIGNvbnN0OworCisgIC8vLyBEdW1wIChyZWN1cnNpdmVseSkgdGhpcyBub2RlIGFuZCBpdHMgdXNlLWRlZiBzdWJncmFwaC4KKyAgLy8vIFRoZSBnaXZlbiBTZWxlY3Rpb25EQUcgYWxsb3dzIHRhcmdldC1zcGVjaWZpYyBub2RlcyB0byBiZSBwcmludGVkCisgIC8vLyBpbiBodW1hbi1yZWFkYWJsZSBmb3JtLgorICB2b2lkIGR1bXByKGNvbnN0IFNlbGVjdGlvbkRBRyAqRykgY29uc3Q7CisKKyAgLy8vIHByaW50ckZ1bGwgdG8gZGJncygpLiAgVGhlIGdpdmVuIFNlbGVjdGlvbkRBRyBhbGxvd3MKKyAgLy8vIHRhcmdldC1zcGVjaWZpYyBub2RlcyB0byBiZSBwcmludGVkIGluIGh1bWFuLXJlYWRhYmxlIGZvcm0uCisgIC8vLyBVbmxpa2UgZHVtcHIsIHRoaXMgd2lsbCBwcmludCB0aGUgd2hvbGUgREFHLCBpbmNsdWRpbmcgY2hpbGRyZW4KKyAgLy8vIHRoYXQgYXBwZWFyIG11bHRpcGxlIHRpbWVzLgorICB2b2lkIGR1bXByRnVsbChjb25zdCBTZWxlY3Rpb25EQUcgKkcgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gcHJpbnRyV2l0aERlcHRoIHRvIGRiZ3MoKS4gIFRoZSBnaXZlbgorICAvLy8gU2VsZWN0aW9uREFHIGFsbG93cyB0YXJnZXQtc3BlY2lmaWMgbm9kZXMgdG8gYmUgcHJpbnRlZCBpbgorICAvLy8gaHVtYW4tcmVhZGFibGUgZm9ybS4gIFVubGlrZSBkdW1wciwgdGhpcyB3aWxsIHByaW50IGNoaWxkcmVuCisgIC8vLyB0aGF0IGFwcGVhciBtdWx0aXBsZSB0aW1lcyB3aGVyZXZlciB0aGV5IGFyZSB1c2VkLgorICAvLy8KKyAgdm9pZCBkdW1wcldpdGhEZXB0aChjb25zdCBTZWxlY3Rpb25EQUcgKkcgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGRlcHRoID0gMTAwKSBjb25zdDsKKworICAvLy8gR2F0aGVyIHVuaXF1ZSBkYXRhIGZvciB0aGUgbm9kZS4KKyAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSB0aGUgU0RVc2UgY2xhc3MuCisgIHZvaWQgYWRkVXNlKFNEVXNlICZVKSB7IFUuYWRkVG9MaXN0KCZVc2VMaXN0KTsgfQorCitwcm90ZWN0ZWQ6CisgIHN0YXRpYyBTRFZUTGlzdCBnZXRTRFZUTGlzdChFVlQgVlQpIHsKKyAgICBTRFZUTGlzdCBSZXQgPSB7IGdldFZhbHVlVHlwZUxpc3QoVlQpLCAxIH07CisgICAgcmV0dXJuIFJldDsKKyAgfQorCisgIC8vLyBDcmVhdGUgYW4gU0ROb2RlLgorICAvLy8KKyAgLy8vIFNETm9kZXMgYXJlIGNyZWF0ZWQgd2l0aG91dCBhbnkgb3BlcmFuZHMsIGFuZCBuZXZlciBvd24gdGhlIG9wZXJhbmQKKyAgLy8vIHN0b3JhZ2UuIFRvIGFkZCBvcGVyYW5kcywgc2VlIFNlbGVjdGlvbkRBRzo6Y3JlYXRlT3BlcmFuZHMuCisgIFNETm9kZSh1bnNpZ25lZCBPcGMsIHVuc2lnbmVkIE9yZGVyLCBEZWJ1Z0xvYyBkbCwgU0RWVExpc3QgVlRzKQorICAgICAgOiBOb2RlVHlwZShPcGMpLCBWYWx1ZUxpc3QoVlRzLlZUcyksIE51bVZhbHVlcyhWVHMuTnVtVlRzKSwKKyAgICAgICAgSVJPcmRlcihPcmRlciksIGRlYnVnTG9jKHN0ZDo6bW92ZShkbCkpIHsKKyAgICBtZW1zZXQoJlJhd1NETm9kZUJpdHMsIDAsIHNpemVvZihSYXdTRE5vZGVCaXRzKSk7CisgICAgYXNzZXJ0KGRlYnVnTG9jLmhhc1RyaXZpYWxEZXN0cnVjdG9yKCkgJiYgIkV4cGVjdGVkIHRyaXZpYWwgZGVzdHJ1Y3RvciIpOworICAgIGFzc2VydChOdW1WYWx1ZXMgPT0gVlRzLk51bVZUcyAmJgorICAgICAgICAgICAiTnVtVmFsdWVzIHdhc24ndCB3aWRlIGVub3VnaCBmb3IgaXRzIG9wZXJhbmRzISIpOworICB9CisKKyAgLy8vIFJlbGVhc2UgdGhlIG9wZXJhbmRzIGFuZCBzZXQgdGhpcyBub2RlIHRvIGhhdmUgemVybyBvcGVyYW5kcy4KKyAgdm9pZCBEcm9wT3BlcmFuZHMoKTsKK307CisKKy8vLyBXcmFwcGVyIGNsYXNzIGZvciBJUiBsb2NhdGlvbiBpbmZvIChJUiBvcmRlcmluZyBhbmQgRGVidWdMb2MpIHRvIGJlIHBhc3NlZAorLy8vIGludG8gU0ROb2RlIGNyZWF0aW9uIGZ1bmN0aW9ucy4KKy8vLyBXaGVuIGFuIFNETm9kZSBpcyBjcmVhdGVkIGZyb20gdGhlIERBR0J1aWxkZXIsIHRoZSBEZWJ1Z0xvYyBpcyBleHRyYWN0ZWQKKy8vLyBmcm9tIHRoZSBvcmlnaW5hbCBJbnN0cnVjdGlvbiwgYW5kIElST3JkZXIgaXMgdGhlIG9yZGluYWwgcG9zaXRpb24gb2YKKy8vLyB0aGUgaW5zdHJ1Y3Rpb24uCisvLy8gV2hlbiBhbiBTRE5vZGUgaXMgY3JlYXRlZCBhZnRlciB0aGUgREFHIGlzIGJlaW5nIGJ1aWx0LCBib3RoIERlYnVnTG9jIGFuZAorLy8vIHRoZSBJUk9yZGVyIGFyZSBwcm9wYWdhdGVkIGZyb20gdGhlIG9yaWdpbmFsIFNETm9kZS4KKy8vLyBTbyBTRExvYyBjbGFzcyBwcm92aWRlcyB0d28gY29uc3RydWN0b3JzIGJlc2lkZXMgdGhlIGRlZmF1bHQgb25lLCBvbmUgdG8KKy8vLyBiZSB1c2VkIGJ5IHRoZSBEQUdCdWlsZGVyLCB0aGUgb3RoZXIgdG8gYmUgdXNlZCBieSBvdGhlcnMuCitjbGFzcyBTRExvYyB7Citwcml2YXRlOgorICBEZWJ1Z0xvYyBETDsKKyAgaW50IElST3JkZXIgPSAwOworCitwdWJsaWM6CisgIFNETG9jKCkgPSBkZWZhdWx0OworICBTRExvYyhjb25zdCBTRE5vZGUgKk4pIDogREwoTi0+Z2V0RGVidWdMb2MoKSksIElST3JkZXIoTi0+Z2V0SVJPcmRlcigpKSB7fQorICBTRExvYyhjb25zdCBTRFZhbHVlIFYpIDogU0RMb2MoVi5nZXROb2RlKCkpIHt9CisgIFNETG9jKGNvbnN0IEluc3RydWN0aW9uICpJLCBpbnQgT3JkZXIpIDogSVJPcmRlcihPcmRlcikgeworICAgIGFzc2VydChPcmRlciA+PSAwICYmICJiYWQgSVJPcmRlciIpOworICAgIGlmIChJKQorICAgICAgREwgPSBJLT5nZXREZWJ1Z0xvYygpOworICB9CisKKyAgdW5zaWduZWQgZ2V0SVJPcmRlcigpIGNvbnN0IHsgcmV0dXJuIElST3JkZXI7IH0KKyAgY29uc3QgRGVidWdMb2MgJmdldERlYnVnTG9jKCkgY29uc3QgeyByZXR1cm4gREw7IH0KK307CisKKy8vIERlZmluZSBpbmxpbmUgZnVuY3Rpb25zIGZyb20gdGhlIFNEVmFsdWUgY2xhc3MuCisKK2lubGluZSBTRFZhbHVlOjpTRFZhbHVlKFNETm9kZSAqbm9kZSwgdW5zaWduZWQgcmVzbm8pCisgICAgOiBOb2RlKG5vZGUpLCBSZXNObyhyZXNubykgeworICAvLyBFeHBsaWNpdGx5IGNoZWNrIGZvciAhUmVzTm8gdG8gYXZvaWQgdXNlLWFmdGVyLWZyZWUsIGJlY2F1c2UgdGhlcmUgYXJlCisgIC8vIGNhbGxlcnMgdGhhdCB1c2UgU0RWYWx1ZShOLCAwKSB3aXRoIGEgZGVsZXRlZCBOIHRvIGluZGljYXRlIHN1Y2Nlc3NmdWwKKyAgLy8gY29tYmluZXMuCisgIGFzc2VydCgoIU5vZGUgfHwgIVJlc05vIHx8IFJlc05vIDwgTm9kZS0+Z2V0TnVtVmFsdWVzKCkpICYmCisgICAgICAgICAiSW52YWxpZCByZXN1bHQgbnVtYmVyIGZvciB0aGUgZ2l2ZW4gbm9kZSEiKTsKKyAgYXNzZXJ0KFJlc05vIDwgLTJVICYmICJDYW5ub3QgdXNlIHJlc3VsdCBudW1iZXJzIHJlc2VydmVkIGZvciBEZW5zZU1hcHMuIik7Cit9CisKK2lubGluZSB1bnNpZ25lZCBTRFZhbHVlOjpnZXRPcGNvZGUoKSBjb25zdCB7CisgIHJldHVybiBOb2RlLT5nZXRPcGNvZGUoKTsKK30KKworaW5saW5lIEVWVCBTRFZhbHVlOjpnZXRWYWx1ZVR5cGUoKSBjb25zdCB7CisgIHJldHVybiBOb2RlLT5nZXRWYWx1ZVR5cGUoUmVzTm8pOworfQorCitpbmxpbmUgdW5zaWduZWQgU0RWYWx1ZTo6Z2V0TnVtT3BlcmFuZHMoKSBjb25zdCB7CisgIHJldHVybiBOb2RlLT5nZXROdW1PcGVyYW5kcygpOworfQorCitpbmxpbmUgY29uc3QgU0RWYWx1ZSAmU0RWYWx1ZTo6Z2V0T3BlcmFuZCh1bnNpZ25lZCBpKSBjb25zdCB7CisgIHJldHVybiBOb2RlLT5nZXRPcGVyYW5kKGkpOworfQorCitpbmxpbmUgdWludDY0X3QgU0RWYWx1ZTo6Z2V0Q29uc3RhbnRPcGVyYW5kVmFsKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgcmV0dXJuIE5vZGUtPmdldENvbnN0YW50T3BlcmFuZFZhbChpKTsKK30KKworaW5saW5lIGJvb2wgU0RWYWx1ZTo6aXNUYXJnZXRPcGNvZGUoKSBjb25zdCB7CisgIHJldHVybiBOb2RlLT5pc1RhcmdldE9wY29kZSgpOworfQorCitpbmxpbmUgYm9vbCBTRFZhbHVlOjppc1RhcmdldE1lbW9yeU9wY29kZSgpIGNvbnN0IHsKKyAgcmV0dXJuIE5vZGUtPmlzVGFyZ2V0TWVtb3J5T3Bjb2RlKCk7Cit9CisKK2lubGluZSBib29sIFNEVmFsdWU6OmlzTWFjaGluZU9wY29kZSgpIGNvbnN0IHsKKyAgcmV0dXJuIE5vZGUtPmlzTWFjaGluZU9wY29kZSgpOworfQorCitpbmxpbmUgdW5zaWduZWQgU0RWYWx1ZTo6Z2V0TWFjaGluZU9wY29kZSgpIGNvbnN0IHsKKyAgcmV0dXJuIE5vZGUtPmdldE1hY2hpbmVPcGNvZGUoKTsKK30KKworaW5saW5lIGJvb2wgU0RWYWx1ZTo6aXNVbmRlZigpIGNvbnN0IHsKKyAgcmV0dXJuIE5vZGUtPmlzVW5kZWYoKTsKK30KKworaW5saW5lIGJvb2wgU0RWYWx1ZTo6dXNlX2VtcHR5KCkgY29uc3QgeworICByZXR1cm4gIU5vZGUtPmhhc0FueVVzZU9mVmFsdWUoUmVzTm8pOworfQorCitpbmxpbmUgYm9vbCBTRFZhbHVlOjpoYXNPbmVVc2UoKSBjb25zdCB7CisgIHJldHVybiBOb2RlLT5oYXNOVXNlc09mVmFsdWUoMSwgUmVzTm8pOworfQorCitpbmxpbmUgY29uc3QgRGVidWdMb2MgJlNEVmFsdWU6OmdldERlYnVnTG9jKCkgY29uc3QgeworICByZXR1cm4gTm9kZS0+Z2V0RGVidWdMb2MoKTsKK30KKworaW5saW5lIHZvaWQgU0RWYWx1ZTo6ZHVtcCgpIGNvbnN0IHsKKyAgcmV0dXJuIE5vZGUtPmR1bXAoKTsKK30KKworaW5saW5lIHZvaWQgU0RWYWx1ZTo6ZHVtcChjb25zdCBTZWxlY3Rpb25EQUcgKkcpIGNvbnN0IHsKKyAgcmV0dXJuIE5vZGUtPmR1bXAoRyk7Cit9CisKK2lubGluZSB2b2lkIFNEVmFsdWU6OmR1bXByKCkgY29uc3QgeworICByZXR1cm4gTm9kZS0+ZHVtcHIoKTsKK30KKworaW5saW5lIHZvaWQgU0RWYWx1ZTo6ZHVtcHIoY29uc3QgU2VsZWN0aW9uREFHICpHKSBjb25zdCB7CisgIHJldHVybiBOb2RlLT5kdW1wcihHKTsKK30KKworLy8gRGVmaW5lIGlubGluZSBmdW5jdGlvbnMgZnJvbSB0aGUgU0RVc2UgY2xhc3MuCisKK2lubGluZSB2b2lkIFNEVXNlOjpzZXQoY29uc3QgU0RWYWx1ZSAmVikgeworICBpZiAoVmFsLmdldE5vZGUoKSkgcmVtb3ZlRnJvbUxpc3QoKTsKKyAgVmFsID0gVjsKKyAgaWYgKFYuZ2V0Tm9kZSgpKSBWLmdldE5vZGUoKS0+YWRkVXNlKCp0aGlzKTsKK30KKworaW5saW5lIHZvaWQgU0RVc2U6OnNldEluaXRpYWwoY29uc3QgU0RWYWx1ZSAmVikgeworICBWYWwgPSBWOworICBWLmdldE5vZGUoKS0+YWRkVXNlKCp0aGlzKTsKK30KKworaW5saW5lIHZvaWQgU0RVc2U6OnNldE5vZGUoU0ROb2RlICpOKSB7CisgIGlmIChWYWwuZ2V0Tm9kZSgpKSByZW1vdmVGcm9tTGlzdCgpOworICBWYWwuc2V0Tm9kZShOKTsKKyAgaWYgKE4pIE4tPmFkZFVzZSgqdGhpcyk7Cit9CisKKy8vLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gZm9ybSBhIGhhbmRsZSBhcm91bmQgYW5vdGhlciBub2RlIHRoYXQKKy8vLyBpcyBwZXJzaXN0ZW50IGFuZCBpcyB1cGRhdGVkIGFjcm9zcyBpbnZvY2F0aW9ucyBvZiByZXBsYWNlQWxsVXNlc1dpdGggb24gaXRzCisvLy8gb3BlcmFuZC4gIFRoaXMgbm9kZSBzaG91bGQgYmUgZGlyZWN0bHkgY3JlYXRlZCBieSBlbmQtdXNlcnMgYW5kIG5vdCBhZGRlZCB0bworLy8vIHRoZSBBbGxOb2RlcyBsaXN0LgorY2xhc3MgSGFuZGxlU0ROb2RlIDogcHVibGljIFNETm9kZSB7CisgIFNEVXNlIE9wOworCitwdWJsaWM6CisgIGV4cGxpY2l0IEhhbmRsZVNETm9kZShTRFZhbHVlIFgpCisgICAgOiBTRE5vZGUoSVNEOjpIQU5ETEVOT0RFLCAwLCBEZWJ1Z0xvYygpLCBnZXRTRFZUTGlzdChNVlQ6Ok90aGVyKSkgeworICAgIC8vIEhhbmRsZVNETm9kZXMgYXJlIG5ldmVyIGluc2VydGVkIGludG8gdGhlIERBRywgc28gdGhleSB3b24ndCBiZQorICAgIC8vIGF1dG8tbnVtYmVyZWQuIFVzZSBJRCA2NTUzNSBhcyBhIHNlbnRpbmVsLgorICAgIFBlcnNpc3RlbnRJZCA9IDB4ZmZmZjsKKworICAgIC8vIE1hbnVhbGx5IHNldCB1cCB0aGUgb3BlcmFuZCBsaXN0LiBUaGlzIG5vZGUgdHlwZSBpcyBzcGVjaWFsIGluIHRoYXQgaXQncworICAgIC8vIGFsd2F5cyBzdGFjayBhbGxvY2F0ZWQgYW5kIFNlbGVjdGlvbkRBRyBkb2VzIG5vdCBtYW5hZ2UgaXRzIG9wZXJhbmRzLgorICAgIC8vIFRPRE86IFRoaXMgc2hvdWxkIGVpdGhlciAoYSkgbm90IGJlIGluIHRoZSBTRE5vZGUgaGllcmFyY2h5LCBvciAoYikgbm90CisgICAgLy8gYmUgc28gc3BlY2lhbC4KKyAgICBPcC5zZXRVc2VyKHRoaXMpOworICAgIE9wLnNldEluaXRpYWwoWCk7CisgICAgTnVtT3BlcmFuZHMgPSAxOworICAgIE9wZXJhbmRMaXN0ID0gJk9wOworICB9CisgIH5IYW5kbGVTRE5vZGUoKTsKKworICBjb25zdCBTRFZhbHVlICZnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIE9wOyB9Cit9OworCitjbGFzcyBBZGRyU3BhY2VDYXN0U0ROb2RlIDogcHVibGljIFNETm9kZSB7Citwcml2YXRlOgorICB1bnNpZ25lZCBTcmNBZGRyU3BhY2U7CisgIHVuc2lnbmVkIERlc3RBZGRyU3BhY2U7CisKK3B1YmxpYzoKKyAgQWRkclNwYWNlQ2FzdFNETm9kZSh1bnNpZ25lZCBPcmRlciwgY29uc3QgRGVidWdMb2MgJmRsLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjQVMsIHVuc2lnbmVkIERlc3RBUyk7CisKKyAgdW5zaWduZWQgZ2V0U3JjQWRkcmVzc1NwYWNlKCkgY29uc3QgeyByZXR1cm4gU3JjQWRkclNwYWNlOyB9CisgIHVuc2lnbmVkIGdldERlc3RBZGRyZXNzU3BhY2UoKSBjb25zdCB7IHJldHVybiBEZXN0QWRkclNwYWNlOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBRERSU1BBQ0VDQVNUOworICB9Cit9OworCisvLy8gVGhpcyBpcyBhbiBhYnN0cmFjdCB2aXJ0dWFsIGNsYXNzIGZvciBtZW1vcnkgb3BlcmF0aW9ucy4KK2NsYXNzIE1lbVNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworcHJpdmF0ZToKKyAgLy8gVlQgb2YgaW4tbWVtb3J5IHZhbHVlLgorICBFVlQgTWVtb3J5VlQ7CisKK3Byb3RlY3RlZDoKKyAgLy8vIE1lbW9yeSByZWZlcmVuY2UgaW5mb3JtYXRpb24uCisgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU87CisKK3B1YmxpYzoKKyAgTWVtU0ROb2RlKHVuc2lnbmVkIE9wYywgdW5zaWduZWQgT3JkZXIsIGNvbnN0IERlYnVnTG9jICZkbCwgU0RWVExpc3QgVlRzLAorICAgICAgICAgICAgRVZUIE1lbW9yeVZULCBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKTsKKworICBib29sIHJlYWRNZW0oKSBjb25zdCB7IHJldHVybiBNTU8tPmlzTG9hZCgpOyB9CisgIGJvb2wgd3JpdGVNZW0oKSBjb25zdCB7IHJldHVybiBNTU8tPmlzU3RvcmUoKTsgfQorCisgIC8vLyBSZXR1cm5zIGFsaWdubWVudCBhbmQgdm9sYXRpbGl0eSBvZiB0aGUgbWVtb3J5IGFjY2VzcworICB1bnNpZ25lZCBnZXRPcmlnaW5hbEFsaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gTU1PLT5nZXRCYXNlQWxpZ25tZW50KCk7CisgIH0KKyAgdW5zaWduZWQgZ2V0QWxpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBNTU8tPmdldEFsaWdubWVudCgpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgU3ViY2xhc3NEYXRhIHZhbHVlLCB3aXRob3V0IEhhc0RlYnVnVmFsdWUuIFRoaXMgY29udGFpbnMgYW4KKyAgLy8vIGVuY29kaW5nIG9mIHRoZSB2b2xhdGlsZSBmbGFnLCBhcyB3ZWxsIGFzIGJpdHMgdXNlZCBieSBzdWJjbGFzc2VzLiBUaGlzCisgIC8vLyBmdW5jdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIHRvIGNvbXB1dGUgYSBGb2xkaW5nU2V0Tm9kZUlEIHZhbHVlLgorICAvLy8gVGhlIEhhc0RlYnVnVmFsdWUgYml0IGlzIG1hc2tlZCBvdXQgYmVjYXVzZSBDU0UgbWFwIG5lZWRzIHRvIG1hdGNoCisgIC8vLyBub2RlcyB3aXRoIGRlYnVnIGluZm8gd2l0aCBub2RlcyB3aXRob3V0IGRlYnVnIGluZm8uIFNhbWUgaXMgYWJvdXQKKyAgLy8vIGlzRGl2ZXJnZW50IGJpdC4KKyAgdW5zaWduZWQgZ2V0UmF3U3ViY2xhc3NEYXRhKCkgY29uc3QgeworICAgIHVpbnQxNl90IERhdGE7CisgICAgdW5pb24geworICAgICAgY2hhciBSYXdTRE5vZGVCaXRzW3NpemVvZih1aW50MTZfdCldOworICAgICAgU0ROb2RlQml0ZmllbGRzIFNETm9kZUJpdHM7CisgICAgfTsKKyAgICBtZW1jcHkoJlJhd1NETm9kZUJpdHMsICZ0aGlzLT5SYXdTRE5vZGVCaXRzLCBzaXplb2YodGhpcy0+UmF3U0ROb2RlQml0cykpOworICAgIFNETm9kZUJpdHMuSGFzRGVidWdWYWx1ZSA9IDA7CisgICAgU0ROb2RlQml0cy5Jc0RpdmVyZ2VudCA9IGZhbHNlOworICAgIG1lbWNweSgmRGF0YSwgJlJhd1NETm9kZUJpdHMsIHNpemVvZihSYXdTRE5vZGVCaXRzKSk7CisgICAgcmV0dXJuIERhdGE7CisgIH0KKworICBib29sIGlzVm9sYXRpbGUoKSBjb25zdCB7IHJldHVybiBNZW1TRE5vZGVCaXRzLklzVm9sYXRpbGU7IH0KKyAgYm9vbCBpc05vblRlbXBvcmFsKCkgY29uc3QgeyByZXR1cm4gTWVtU0ROb2RlQml0cy5Jc05vblRlbXBvcmFsOyB9CisgIGJvb2wgaXNEZXJlZmVyZW5jZWFibGUoKSBjb25zdCB7IHJldHVybiBNZW1TRE5vZGVCaXRzLklzRGVyZWZlcmVuY2VhYmxlOyB9CisgIGJvb2wgaXNJbnZhcmlhbnQoKSBjb25zdCB7IHJldHVybiBNZW1TRE5vZGVCaXRzLklzSW52YXJpYW50OyB9CisKKyAgLy8gUmV0dXJucyB0aGUgb2Zmc2V0IGZyb20gdGhlIGxvY2F0aW9uIG9mIHRoZSBhY2Nlc3MuCisgIGludDY0X3QgZ2V0U3JjVmFsdWVPZmZzZXQoKSBjb25zdCB7IHJldHVybiBNTU8tPmdldE9mZnNldCgpOyB9CisKKyAgLy8vIFJldHVybnMgdGhlIEFBIGluZm8gdGhhdCBkZXNjcmliZXMgdGhlIGRlcmVmZXJlbmNlLgorICBBQU1ETm9kZXMgZ2V0QUFJbmZvKCkgY29uc3QgeyByZXR1cm4gTU1PLT5nZXRBQUluZm8oKTsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBSYW5nZXMgdGhhdCBkZXNjcmliZXMgdGhlIGRlcmVmZXJlbmNlLgorICBjb25zdCBNRE5vZGUgKmdldFJhbmdlcygpIGNvbnN0IHsgcmV0dXJuIE1NTy0+Z2V0UmFuZ2VzKCk7IH0KKworICAvLy8gUmV0dXJucyB0aGUgc3luY2hyb25pemF0aW9uIHNjb3BlIElEIGZvciB0aGlzIG1lbW9yeSBvcGVyYXRpb24uCisgIFN5bmNTY29wZTo6SUQgZ2V0U3luY1Njb3BlSUQoKSBjb25zdCB7IHJldHVybiBNTU8tPmdldFN5bmNTY29wZUlEKCk7IH0KKworICAvLy8gUmV0dXJuIHRoZSBhdG9taWMgb3JkZXJpbmcgcmVxdWlyZW1lbnRzIGZvciB0aGlzIG1lbW9yeSBvcGVyYXRpb24uIEZvcgorICAvLy8gY21weGNoZyBhdG9taWMgb3BlcmF0aW9ucywgcmV0dXJuIHRoZSBhdG9taWMgb3JkZXJpbmcgcmVxdWlyZW1lbnRzIHdoZW4KKyAgLy8vIHN0b3JlIG9jY3Vycy4KKyAgQXRvbWljT3JkZXJpbmcgZ2V0T3JkZXJpbmcoKSBjb25zdCB7IHJldHVybiBNTU8tPmdldE9yZGVyaW5nKCk7IH0KKworICAvLy8gUmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBpbi1tZW1vcnkgdmFsdWUuCisgIEVWVCBnZXRNZW1vcnlWVCgpIGNvbnN0IHsgcmV0dXJuIE1lbW9yeVZUOyB9CisKKyAgLy8vIFJldHVybiBhIE1hY2hpbmVNZW1PcGVyYW5kIG9iamVjdCBkZXNjcmliaW5nIHRoZSBtZW1vcnkKKyAgLy8vIHJlZmVyZW5jZSBwZXJmb3JtZWQgYnkgb3BlcmF0aW9uLgorICBNYWNoaW5lTWVtT3BlcmFuZCAqZ2V0TWVtT3BlcmFuZCgpIGNvbnN0IHsgcmV0dXJuIE1NTzsgfQorCisgIGNvbnN0IE1hY2hpbmVQb2ludGVySW5mbyAmZ2V0UG9pbnRlckluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuIE1NTy0+Z2V0UG9pbnRlckluZm8oKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGFkZHJlc3Mgc3BhY2UgZm9yIHRoZSBhc3NvY2lhdGVkIHBvaW50ZXIKKyAgdW5zaWduZWQgZ2V0QWRkcmVzc1NwYWNlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQb2ludGVySW5mbygpLmdldEFkZHJTcGFjZSgpOworICB9CisKKyAgLy8vIFVwZGF0ZSB0aGlzIE1lbVNETm9kZSdzIE1hY2hpbmVNZW1PcGVyYW5kIGluZm9ybWF0aW9uCisgIC8vLyB0byByZWZsZWN0IHRoZSBhbGlnbm1lbnQgb2YgTmV3TU1PLCBpZiBpdCBoYXMgYSBncmVhdGVyIGFsaWdubWVudC4KKyAgLy8vIFRoaXMgbXVzdCBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgbmV3IGFsaWdubWVudCBhcHBsaWVzIHRvIGFsbCB1c2VycyBvZgorICAvLy8gdGhpcyBNYWNoaW5lTWVtT3BlcmFuZC4KKyAgdm9pZCByZWZpbmVBbGlnbm1lbnQoY29uc3QgTWFjaGluZU1lbU9wZXJhbmQgKk5ld01NTykgeworICAgIE1NTy0+cmVmaW5lQWxpZ25tZW50KE5ld01NTyk7CisgIH0KKworICBjb25zdCBTRFZhbHVlICZnZXRDaGFpbigpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMCk7IH0KKyAgY29uc3QgU0RWYWx1ZSAmZ2V0QmFzZVB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZChnZXRPcGNvZGUoKSA9PSBJU0Q6OlNUT1JFID8gMiA6IDEpOworICB9CisKKyAgLy8gTWV0aG9kcyB0byBzdXBwb3J0IGlzYSBhbmQgZHluX2Nhc3QKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICAvLyBGb3Igc29tZSB0YXJnZXRzLCB3ZSBsb3dlciBzb21lIHRhcmdldCBpbnRyaW5zaWNzIHRvIGEgTWVtSW50cmluc2ljTm9kZQorICAgIC8vIHdpdGggZWl0aGVyIGFuIGludHJpbnNpYyBvciBhIHRhcmdldCBvcGNvZGUuCisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6TE9BRCAgICAgICAgICAgICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNUT1JFICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpQUkVGRVRDSCAgICAgICAgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0NNUF9TV0FQICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19DTVBfU1dBUF9XSVRIX1NVQ0NFU1MgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfU1dBUCAgICAgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfQUREICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX1NVQiAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9BTkQgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfQ0xSICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX09SICAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9YT1IgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfTkFORCAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX01JTiAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9NQVggICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfVU1JTiAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX1VNQVggICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRCAgICAgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX1NUT1JFICAgICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6Ok1MT0FEICAgICAgICAgICAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpNU1RPUkUgICAgICAgICAgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6TUdBVEhFUiAgICAgICAgICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6Ok1TQ0FUVEVSICAgICAgICAgICAgfHwKKyAgICAgICAgICAgTi0+aXNNZW1JbnRyaW5zaWMoKSAgICAgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgIE4tPmlzVGFyZ2V0TWVtb3J5T3Bjb2RlKCk7CisgIH0KK307CisKKy8vLyBUaGlzIGlzIGFuIFNETm9kZSByZXByZXNlbnRpbmcgYXRvbWljIG9wZXJhdGlvbnMuCitjbGFzcyBBdG9taWNTRE5vZGUgOiBwdWJsaWMgTWVtU0ROb2RlIHsKK3B1YmxpYzoKKyAgQXRvbWljU0ROb2RlKHVuc2lnbmVkIE9wYywgdW5zaWduZWQgT3JkZXIsIGNvbnN0IERlYnVnTG9jICZkbCwgU0RWVExpc3QgVlRMLAorICAgICAgICAgICAgICAgRVZUIE1lbVZULCBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKQorICAgICAgOiBNZW1TRE5vZGUoT3BjLCBPcmRlciwgZGwsIFZUTCwgTWVtVlQsIE1NTykge30KKworICBjb25zdCBTRFZhbHVlICZnZXRCYXNlUHRyKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgxKTsgfQorICBjb25zdCBTRFZhbHVlICZnZXRWYWwoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDIpOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIFNETm9kZSByZXByZXNlbnRzIGNtcHhjaGcgYXRvbWljIG9wZXJhdGlvbiwgZmFsc2UKKyAgLy8vIG90aGVyd2lzZS4KKyAgYm9vbCBpc0NvbXBhcmVBbmRTd2FwKCkgY29uc3QgeworICAgIHVuc2lnbmVkIE9wID0gZ2V0T3Bjb2RlKCk7CisgICAgcmV0dXJuIE9wID09IElTRDo6QVRPTUlDX0NNUF9TV0FQIHx8CisgICAgICAgICAgIE9wID09IElTRDo6QVRPTUlDX0NNUF9TV0FQX1dJVEhfU1VDQ0VTUzsKKyAgfQorCisgIC8vLyBGb3IgY21weGNoZyBhdG9taWMgb3BlcmF0aW9ucywgcmV0dXJuIHRoZSBhdG9taWMgb3JkZXJpbmcgcmVxdWlyZW1lbnRzCisgIC8vLyB3aGVuIHN0b3JlIGRvZXMgbm90IG9jY3VyLgorICBBdG9taWNPcmRlcmluZyBnZXRGYWlsdXJlT3JkZXJpbmcoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQ29tcGFyZUFuZFN3YXAoKSAmJiAiTXVzdCBiZSBjbXB4Y2hnIG9wZXJhdGlvbiIpOworICAgIHJldHVybiBNTU8tPmdldEZhaWx1cmVPcmRlcmluZygpOworICB9CisKKyAgLy8gTWV0aG9kcyB0byBzdXBwb3J0IGlzYSBhbmQgZHluX2Nhc3QKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfQ01QX1NXQVAgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0NNUF9TV0FQX1dJVEhfU1VDQ0VTUyB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19TV0FQICAgICAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9BREQgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfU1VCICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX0FORCAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9DTFIgICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfT1IgICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX1hPUiAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9OQU5EICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfTUlOICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEX01BWCAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfTE9BRF9VTUlOICAgIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6QVRPTUlDX0xPQURfVU1BWCAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFUT01JQ19MT0FEICAgICAgICAgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpBVE9NSUNfU1RPUkU7CisgIH0KK307CisKKy8vLyBUaGlzIFNETm9kZSBpcyB1c2VkIGZvciB0YXJnZXQgaW50cmluc2ljcyB0aGF0IHRvdWNoCisvLy8gbWVtb3J5IGFuZCBuZWVkIGFuIGFzc29jaWF0ZWQgTWFjaGluZU1lbU9wZXJhbmQuIEl0cyBvcGNvZGUgbWF5IGJlCisvLy8gSU5UUklOU0lDX1ZPSUQsIElOVFJJTlNJQ19XX0NIQUlOLCBQUkVGRVRDSCwgb3IgYSB0YXJnZXQtc3BlY2lmaWMgb3Bjb2RlCisvLy8gd2l0aCBhIHZhbHVlIG5vdCBsZXNzIHRoYW4gRklSU1RfVEFSR0VUX01FTU9SWV9PUENPREUuCitjbGFzcyBNZW1JbnRyaW5zaWNTRE5vZGUgOiBwdWJsaWMgTWVtU0ROb2RlIHsKK3B1YmxpYzoKKyAgTWVtSW50cmluc2ljU0ROb2RlKHVuc2lnbmVkIE9wYywgdW5zaWduZWQgT3JkZXIsIGNvbnN0IERlYnVnTG9jICZkbCwKKyAgICAgICAgICAgICAgICAgICAgIFNEVlRMaXN0IFZUcywgRVZUIE1lbW9yeVZULCBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKQorICAgICAgOiBNZW1TRE5vZGUoT3BjLCBPcmRlciwgZGwsIFZUcywgTWVtb3J5VlQsIE1NTykgeworICAgIFNETm9kZUJpdHMuSXNNZW1JbnRyaW5zaWMgPSB0cnVlOworICB9CisKKyAgLy8gTWV0aG9kcyB0byBzdXBwb3J0IGlzYSBhbmQgZHluX2Nhc3QKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICAvLyBXZSBsb3dlciBzb21lIHRhcmdldCBpbnRyaW5zaWNzIHRvIHRoZWlyIHRhcmdldCBvcGNvZGUKKyAgICAvLyBlYXJseSBhIG5vZGUgd2l0aCBhIHRhcmdldCBvcGNvZGUgY2FuIGJlIG9mIHRoaXMgY2xhc3MKKyAgICByZXR1cm4gTi0+aXNNZW1JbnRyaW5zaWMoKSAgICAgICAgICAgICB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlBSRUZFVENIIHx8CisgICAgICAgICAgIE4tPmlzVGFyZ2V0TWVtb3J5T3Bjb2RlKCk7CisgIH0KK307CisKKy8vLyBUaGlzIFNETm9kZSBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgY29kZSBnZW5lcmF0b3IKKy8vLyBzdXBwb3J0IGZvciB0aGUgbGx2bSBJUiBzaHVmZmxldmVjdG9yIGluc3RydWN0aW9uLiAgSXQgY29tYmluZXMgZWxlbWVudHMKKy8vLyBmcm9tIHR3byBpbnB1dCB2ZWN0b3JzIGludG8gYSBuZXcgaW5wdXQgdmVjdG9yLCB3aXRoIHRoZSBzZWxlY3Rpb24gYW5kCisvLy8gb3JkZXJpbmcgb2YgZWxlbWVudHMgZGV0ZXJtaW5lZCBieSBhbiBhcnJheSBvZiBpbnRlZ2VycywgcmVmZXJyZWQgdG8gYXMKKy8vLyB0aGUgc2h1ZmZsZSBtYXNrLiAgRm9yIGlucHV0IHZlY3RvcnMgb2Ygd2lkdGggTiwgbWFzayBpbmRpY2VzIG9mIDAuLk4tMQorLy8vIHJlZmVyIHRvIGVsZW1lbnRzIGZyb20gdGhlIExIUyBpbnB1dCwgYW5kIGluZGljZXMgZnJvbSBOIHRvIDJOLTEgdGhlIFJIUy4KKy8vLyBBbiBpbmRleCBvZiAtMSBpcyB0cmVhdGVkIGFzIHVuZGVmLCBzdWNoIHRoYXQgdGhlIGNvZGUgZ2VuZXJhdG9yIG1heSBwdXQKKy8vLyBhbnkgdmFsdWUgaW4gdGhlIGNvcnJlc3BvbmRpbmcgZWxlbWVudCBvZiB0aGUgcmVzdWx0LgorY2xhc3MgU2h1ZmZsZVZlY3RvclNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICAvLyBUaGUgbWVtb3J5IGZvciBNYXNrIGlzIG93bmVkIGJ5IHRoZSBTZWxlY3Rpb25EQUcncyBPcGVyYW5kQWxsb2NhdG9yLCBhbmQKKyAgLy8gaXMgZnJlZWQgd2hlbiB0aGUgU2VsZWN0aW9uREFHIG9iamVjdCBpcyBkZXN0cm95ZWQuCisgIGNvbnN0IGludCAqTWFzazsKKworcHJvdGVjdGVkOgorICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworCisgIFNodWZmbGVWZWN0b3JTRE5vZGUoRVZUIFZULCB1bnNpZ25lZCBPcmRlciwgY29uc3QgRGVidWdMb2MgJmRsLCBjb25zdCBpbnQgKk0pCisgICAgICA6IFNETm9kZShJU0Q6OlZFQ1RPUl9TSFVGRkxFLCBPcmRlciwgZGwsIGdldFNEVlRMaXN0KFZUKSksIE1hc2soTSkge30KKworcHVibGljOgorICBBcnJheVJlZjxpbnQ+IGdldE1hc2soKSBjb25zdCB7CisgICAgRVZUIFZUID0gZ2V0VmFsdWVUeXBlKDApOworICAgIHJldHVybiBtYWtlQXJyYXlSZWYoTWFzaywgVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSk7CisgIH0KKworICBpbnQgZ2V0TWFza0VsdCh1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSWR4IDwgZ2V0VmFsdWVUeXBlKDApLmdldFZlY3Rvck51bUVsZW1lbnRzKCkgJiYgIklkeCBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIE1hc2tbSWR4XTsKKyAgfQorCisgIGJvb2wgaXNTcGxhdCgpIGNvbnN0IHsgcmV0dXJuIGlzU3BsYXRNYXNrKE1hc2ssIGdldFZhbHVlVHlwZSgwKSk7IH0KKworICBpbnQgIGdldFNwbGF0SW5kZXgoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzU3BsYXQoKSAmJiAiQ2Fubm90IGdldCBzcGxhdCBpbmRleCBmb3Igbm9uLXNwbGF0ISIpOworICAgIEVWVCBWVCA9IGdldFZhbHVlVHlwZSgwKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVlQuZ2V0VmVjdG9yTnVtRWxlbWVudHMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChNYXNrW2ldID49IDApCisgICAgICAgIHJldHVybiBNYXNrW2ldOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJTcGxhdCB3aXRoIGFsbCB1bmRlZiBpbmRpY2VzPyIpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNTcGxhdE1hc2soY29uc3QgaW50ICpNYXNrLCBFVlQgVlQpOworCisgIC8vLyBDaGFuZ2UgdmFsdWVzIGluIGEgc2h1ZmZsZSBwZXJtdXRlIG1hc2sgYXNzdW1pbmcKKyAgLy8vIHRoZSB0d28gdmVjdG9yIG9wZXJhbmRzIGhhdmUgc3dhcHBlZCBwb3NpdGlvbi4KKyAgc3RhdGljIHZvaWQgY29tbXV0ZU1hc2soTXV0YWJsZUFycmF5UmVmPGludD4gTWFzaykgeworICAgIHVuc2lnbmVkIE51bUVsZW1zID0gTWFzay5zaXplKCk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1FbGVtczsgKytpKSB7CisgICAgICBpbnQgaWR4ID0gTWFza1tpXTsKKyAgICAgIGlmIChpZHggPCAwKQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGVsc2UgaWYgKGlkeCA8IChpbnQpTnVtRWxlbXMpCisgICAgICAgIE1hc2tbaV0gPSBpZHggKyBOdW1FbGVtczsKKyAgICAgIGVsc2UKKyAgICAgICAgTWFza1tpXSA9IGlkeCAtIE51bUVsZW1zOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6VkVDVE9SX1NIVUZGTEU7CisgIH0KK307CisKK2NsYXNzIENvbnN0YW50U0ROb2RlIDogcHVibGljIFNETm9kZSB7CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisKKyAgY29uc3QgQ29uc3RhbnRJbnQgKlZhbHVlOworCisgIENvbnN0YW50U0ROb2RlKGJvb2wgaXNUYXJnZXQsIGJvb2wgaXNPcGFxdWUsIGNvbnN0IENvbnN0YW50SW50ICp2YWwsCisgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnTG9jICZETCwgRVZUIFZUKQorICAgICAgOiBTRE5vZGUoaXNUYXJnZXQgPyBJU0Q6OlRhcmdldENvbnN0YW50IDogSVNEOjpDb25zdGFudCwgMCwgREwsCisgICAgICAgICAgICAgICBnZXRTRFZUTGlzdChWVCkpLAorICAgICAgICBWYWx1ZSh2YWwpIHsKKyAgICBDb25zdGFudFNETm9kZUJpdHMuSXNPcGFxdWUgPSBpc09wYXF1ZTsKKyAgfQorCitwdWJsaWM6CisgIGNvbnN0IENvbnN0YW50SW50ICpnZXRDb25zdGFudEludFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKyAgY29uc3QgQVBJbnQgJmdldEFQSW50VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZS0+Z2V0VmFsdWUoKTsgfQorICB1aW50NjRfdCBnZXRaRXh0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZS0+Z2V0WkV4dFZhbHVlKCk7IH0KKyAgaW50NjRfdCBnZXRTRXh0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZS0+Z2V0U0V4dFZhbHVlKCk7IH0KKyAgdWludDY0X3QgZ2V0TGltaXRlZFZhbHVlKHVpbnQ2NF90IExpbWl0ID0gVUlOVDY0X01BWCkgeworICAgIHJldHVybiBWYWx1ZS0+Z2V0TGltaXRlZFZhbHVlKExpbWl0KTsKKyAgfQorCisgIGJvb2wgaXNPbmUoKSBjb25zdCB7IHJldHVybiBWYWx1ZS0+aXNPbmUoKTsgfQorICBib29sIGlzTnVsbFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWUtPmlzWmVybygpOyB9CisgIGJvb2wgaXNBbGxPbmVzVmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZS0+aXNNaW51c09uZSgpOyB9CisKKyAgYm9vbCBpc09wYXF1ZSgpIGNvbnN0IHsgcmV0dXJuIENvbnN0YW50U0ROb2RlQml0cy5Jc09wYXF1ZTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnQgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpUYXJnZXRDb25zdGFudDsKKyAgfQorfTsKKwordWludDY0X3QgU0ROb2RlOjpnZXRDb25zdGFudE9wZXJhbmRWYWwodW5zaWduZWQgTnVtKSBjb25zdCB7CisgIHJldHVybiBjYXN0PENvbnN0YW50U0ROb2RlPihnZXRPcGVyYW5kKE51bSkpLT5nZXRaRXh0VmFsdWUoKTsKK30KKworY2xhc3MgQ29uc3RhbnRGUFNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworCisgIGNvbnN0IENvbnN0YW50RlAgKlZhbHVlOworCisgIENvbnN0YW50RlBTRE5vZGUoYm9vbCBpc1RhcmdldCwgY29uc3QgQ29uc3RhbnRGUCAqdmFsLCBjb25zdCBEZWJ1Z0xvYyAmREwsCisgICAgICAgICAgICAgICAgICAgRVZUIFZUKQorICAgICAgOiBTRE5vZGUoaXNUYXJnZXQgPyBJU0Q6OlRhcmdldENvbnN0YW50RlAgOiBJU0Q6OkNvbnN0YW50RlAsIDAsIERMLAorICAgICAgICAgICAgICAgZ2V0U0RWVExpc3QoVlQpKSwKKyAgICAgICAgVmFsdWUodmFsKSB7fQorCitwdWJsaWM6CisgIGNvbnN0IEFQRmxvYXQmIGdldFZhbHVlQVBGKCkgY29uc3QgeyByZXR1cm4gVmFsdWUtPmdldFZhbHVlQVBGKCk7IH0KKyAgY29uc3QgQ29uc3RhbnRGUCAqZ2V0Q29uc3RhbnRGUFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIHBvc2l0aXZlIG9yIG5lZ2F0aXZlIHplcm8uCisgIGJvb2wgaXNaZXJvKCkgY29uc3QgeyByZXR1cm4gVmFsdWUtPmlzWmVybygpOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhIE5hTi4KKyAgYm9vbCBpc05hTigpIGNvbnN0IHsgcmV0dXJuIFZhbHVlLT5pc05hTigpOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBhbiBpbmZpbml0eQorICBib29sIGlzSW5maW5pdHkoKSBjb25zdCB7IHJldHVybiBWYWx1ZS0+aXNJbmZpbml0eSgpOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBuZWdhdGl2ZS4KKyAgYm9vbCBpc05lZ2F0aXZlKCkgY29uc3QgeyByZXR1cm4gVmFsdWUtPmlzTmVnYXRpdmUoKTsgfQorCisgIC8vLyBXZSBkb24ndCByZWx5IG9uIG9wZXJhdG9yPT0gd29ya2luZyBvbiBkb3VibGUgdmFsdWVzLCBhcworICAvLy8gaXQgcmV0dXJucyB0cnVlIGZvciB0aGluZ3MgdGhhdCBhcmUgY2xlYXJseSBub3QgZXF1YWwsIGxpa2UgLTAuMCBhbmQgMC4wLgorICAvLy8gQXMgc3VjaCwgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZG8gYW4gZXhhY3QgYml0LWZvci1iaXQgY29tcGFyaXNvbiBvZgorICAvLy8gdHdvIGZsb2F0aW5nIHBvaW50IHZhbHVlcy4KKworICAvLy8gV2UgbGVhdmUgdGhlIHZlcnNpb24gd2l0aCB0aGUgZG91YmxlIGFyZ3VtZW50IGhlcmUgYmVjYXVzZSBpdCdzIGp1c3Qgc28KKyAgLy8vIGNvbnZlbmllbnQgdG8gd3JpdGUgIjIuMCIgYW5kIHRoZSBsaWtlLiAgV2l0aG91dCB0aGlzIGZ1bmN0aW9uIHdlJ2QKKyAgLy8vIGhhdmUgdG8gZHVwbGljYXRlIGl0cyBsb2dpYyBldmVyeXdoZXJlIGl0J3MgY2FsbGVkLgorICBib29sIGlzRXhhY3RseVZhbHVlKGRvdWJsZSBWKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlLT5nZXRWYWx1ZUFQRigpLmlzRXhhY3RseVZhbHVlKFYpOworICB9CisgIGJvb2wgaXNFeGFjdGx5VmFsdWUoY29uc3QgQVBGbG9hdCYgVikgY29uc3Q7CisKKyAgc3RhdGljIGJvb2wgaXNWYWx1ZVZhbGlkRm9yVHlwZShFVlQgVlQsIGNvbnN0IEFQRmxvYXQmIFZhbCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpDb25zdGFudEZQIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0Q29uc3RhbnRGUDsKKyAgfQorfTsKKworLy8vIFJldHVybnMgdHJ1ZSBpZiBccCBWIGlzIGEgY29uc3RhbnQgaW50ZWdlciB6ZXJvLgorYm9vbCBpc051bGxDb25zdGFudChTRFZhbHVlIFYpOworCisvLy8gUmV0dXJucyB0cnVlIGlmIFxwIFYgaXMgYW4gRlAgY29uc3RhbnQgd2l0aCBhIHZhbHVlIG9mIHBvc2l0aXZlIHplcm8uCitib29sIGlzTnVsbEZQQ29uc3RhbnQoU0RWYWx1ZSBWKTsKKworLy8vIFJldHVybnMgdHJ1ZSBpZiBccCBWIGlzIGFuIGludGVnZXIgY29uc3RhbnQgd2l0aCBhbGwgYml0cyBzZXQuCitib29sIGlzQWxsT25lc0NvbnN0YW50KFNEVmFsdWUgVik7CisKKy8vLyBSZXR1cm5zIHRydWUgaWYgXHAgViBpcyBhIGNvbnN0YW50IGludGVnZXIgb25lLgorYm9vbCBpc09uZUNvbnN0YW50KFNEVmFsdWUgVik7CisKKy8vLyBSZXR1cm5zIHRydWUgaWYgXHAgViBpcyBhIGJpdHdpc2Ugbm90IG9wZXJhdGlvbi4gQXNzdW1lcyB0aGF0IGFuIGFsbCBvbmVzCisvLy8gY29uc3RhbnQgaXMgY2Fub25pY2FsaXplZCB0byBiZSBvcGVyYW5kIDEuCitib29sIGlzQml0d2lzZU5vdChTRFZhbHVlIFYpOworCisvLy8gUmV0dXJucyB0aGUgU0ROb2RlIGlmIGl0IGlzIGEgY29uc3RhbnQgc3BsYXQgQnVpbGRWZWN0b3Igb3IgY29uc3RhbnQgaW50LgorQ29uc3RhbnRTRE5vZGUgKmlzQ29uc3RPckNvbnN0U3BsYXQoU0RWYWx1ZSBWKTsKKworLy8vIFJldHVybnMgdGhlIFNETm9kZSBpZiBpdCBpcyBhIGNvbnN0YW50IHNwbGF0IEJ1aWxkVmVjdG9yIG9yIGNvbnN0YW50IGZsb2F0LgorQ29uc3RhbnRGUFNETm9kZSAqaXNDb25zdE9yQ29uc3RTcGxhdEZQKFNEVmFsdWUgVik7CisKK2NsYXNzIEdsb2JhbEFkZHJlc3NTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKworICBjb25zdCBHbG9iYWxWYWx1ZSAqVGhlR2xvYmFsOworICBpbnQ2NF90IE9mZnNldDsKKyAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFnczsKKworICBHbG9iYWxBZGRyZXNzU0ROb2RlKHVuc2lnbmVkIE9wYywgdW5zaWduZWQgT3JkZXIsIGNvbnN0IERlYnVnTG9jICZETCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHbG9iYWxWYWx1ZSAqR0EsIEVWVCBWVCwgaW50NjRfdCBvLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3MpOworCitwdWJsaWM6CisgIGNvbnN0IEdsb2JhbFZhbHVlICpnZXRHbG9iYWwoKSBjb25zdCB7IHJldHVybiBUaGVHbG9iYWw7IH0KKyAgaW50NjRfdCBnZXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBPZmZzZXQ7IH0KKyAgdW5zaWduZWQgY2hhciBnZXRUYXJnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIFRhcmdldEZsYWdzOyB9CisgIC8vIFJldHVybiB0aGUgYWRkcmVzcyBzcGFjZSB0aGlzIEdsb2JhbEFkZHJlc3MgYmVsb25ncyB0by4KKyAgdW5zaWduZWQgZ2V0QWRkcmVzc1NwYWNlKCkgY29uc3Q7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpHbG9iYWxBZGRyZXNzIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0R2xvYmFsQWRkcmVzcyB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6Okdsb2JhbFRMU0FkZHJlc3MgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpUYXJnZXRHbG9iYWxUTFNBZGRyZXNzOworICB9Cit9OworCitjbGFzcyBGcmFtZUluZGV4U0ROb2RlIDogcHVibGljIFNETm9kZSB7CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisKKyAgaW50IEZJOworCisgIEZyYW1lSW5kZXhTRE5vZGUoaW50IGZpLCBFVlQgVlQsIGJvb2wgaXNUYXJnKQorICAgIDogU0ROb2RlKGlzVGFyZyA/IElTRDo6VGFyZ2V0RnJhbWVJbmRleCA6IElTRDo6RnJhbWVJbmRleCwKKyAgICAgIDAsIERlYnVnTG9jKCksIGdldFNEVlRMaXN0KFZUKSksIEZJKGZpKSB7CisgIH0KKworcHVibGljOgorICBpbnQgZ2V0SW5kZXgoKSBjb25zdCB7IHJldHVybiBGSTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6RnJhbWVJbmRleCB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlRhcmdldEZyYW1lSW5kZXg7CisgIH0KK307CisKK2NsYXNzIEp1bXBUYWJsZVNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworCisgIGludCBKVEk7CisgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3M7CisKKyAgSnVtcFRhYmxlU0ROb2RlKGludCBqdGksIEVWVCBWVCwgYm9vbCBpc1RhcmcsIHVuc2lnbmVkIGNoYXIgVEYpCisgICAgOiBTRE5vZGUoaXNUYXJnID8gSVNEOjpUYXJnZXRKdW1wVGFibGUgOiBJU0Q6Okp1bXBUYWJsZSwKKyAgICAgIDAsIERlYnVnTG9jKCksIGdldFNEVlRMaXN0KFZUKSksIEpUSShqdGkpLCBUYXJnZXRGbGFncyhURikgeworICB9CisKK3B1YmxpYzoKKyAgaW50IGdldEluZGV4KCkgY29uc3QgeyByZXR1cm4gSlRJOyB9CisgIHVuc2lnbmVkIGNoYXIgZ2V0VGFyZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBUYXJnZXRGbGFnczsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6SnVtcFRhYmxlIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0SnVtcFRhYmxlOworICB9Cit9OworCitjbGFzcyBDb25zdGFudFBvb2xTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKworICB1bmlvbiB7CisgICAgY29uc3QgQ29uc3RhbnQgKkNvbnN0VmFsOworICAgIE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZSAqTWFjaGluZUNQVmFsOworICB9IFZhbDsKKyAgaW50IE9mZnNldDsgIC8vIEl0J3MgYSBNYWNoaW5lQ29uc3RhbnRQb29sVmFsdWUgaWYgdG9wIGJpdCBpcyBzZXQuCisgIHVuc2lnbmVkIEFsaWdubWVudDsgIC8vIE1pbmltdW0gYWxpZ25tZW50IHJlcXVpcmVtZW50IG9mIENQIChub3QgbG9nMiB2YWx1ZSkuCisgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3M7CisKKyAgQ29uc3RhbnRQb29sU0ROb2RlKGJvb2wgaXNUYXJnZXQsIGNvbnN0IENvbnN0YW50ICpjLCBFVlQgVlQsIGludCBvLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ24sIHVuc2lnbmVkIGNoYXIgVEYpCisgICAgOiBTRE5vZGUoaXNUYXJnZXQgPyBJU0Q6OlRhcmdldENvbnN0YW50UG9vbCA6IElTRDo6Q29uc3RhbnRQb29sLCAwLAorICAgICAgICAgICAgIERlYnVnTG9jKCksIGdldFNEVlRMaXN0KFZUKSksIE9mZnNldChvKSwgQWxpZ25tZW50KEFsaWduKSwKKyAgICAgICAgICAgICBUYXJnZXRGbGFncyhURikgeworICAgIGFzc2VydChPZmZzZXQgPj0gMCAmJiAiT2Zmc2V0IGlzIHRvbyBsYXJnZSIpOworICAgIFZhbC5Db25zdFZhbCA9IGM7CisgIH0KKworICBDb25zdGFudFBvb2xTRE5vZGUoYm9vbCBpc1RhcmdldCwgTWFjaGluZUNvbnN0YW50UG9vbFZhbHVlICp2LAorICAgICAgICAgICAgICAgICAgICAgRVZUIFZULCBpbnQgbywgdW5zaWduZWQgQWxpZ24sIHVuc2lnbmVkIGNoYXIgVEYpCisgICAgOiBTRE5vZGUoaXNUYXJnZXQgPyBJU0Q6OlRhcmdldENvbnN0YW50UG9vbCA6IElTRDo6Q29uc3RhbnRQb29sLCAwLAorICAgICAgICAgICAgIERlYnVnTG9jKCksIGdldFNEVlRMaXN0KFZUKSksIE9mZnNldChvKSwgQWxpZ25tZW50KEFsaWduKSwKKyAgICAgICAgICAgICBUYXJnZXRGbGFncyhURikgeworICAgIGFzc2VydChPZmZzZXQgPj0gMCAmJiAiT2Zmc2V0IGlzIHRvbyBsYXJnZSIpOworICAgIFZhbC5NYWNoaW5lQ1BWYWwgPSB2OworICAgIE9mZnNldCB8PSAxIDw8IChzaXplb2YodW5zaWduZWQpKkNIQVJfQklULTEpOworICB9CisKK3B1YmxpYzoKKyAgYm9vbCBpc01hY2hpbmVDb25zdGFudFBvb2xFbnRyeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gT2Zmc2V0IDwgMDsKKyAgfQorCisgIGNvbnN0IENvbnN0YW50ICpnZXRDb25zdFZhbCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzTWFjaGluZUNvbnN0YW50UG9vbEVudHJ5KCkgJiYgIldyb25nIGNvbnN0YW50cG9vbCB0eXBlIik7CisgICAgcmV0dXJuIFZhbC5Db25zdFZhbDsKKyAgfQorCisgIE1hY2hpbmVDb25zdGFudFBvb2xWYWx1ZSAqZ2V0TWFjaGluZUNQVmFsKCkgY29uc3QgeworICAgIGFzc2VydChpc01hY2hpbmVDb25zdGFudFBvb2xFbnRyeSgpICYmICJXcm9uZyBjb25zdGFudHBvb2wgdHlwZSIpOworICAgIHJldHVybiBWYWwuTWFjaGluZUNQVmFsOworICB9CisKKyAgaW50IGdldE9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gT2Zmc2V0ICYgfigxIDw8IChzaXplb2YodW5zaWduZWQpKkNIQVJfQklULTEpKTsKKyAgfQorCisgIC8vIFJldHVybiB0aGUgYWxpZ25tZW50IG9mIHRoaXMgY29uc3RhbnQgcG9vbCBvYmplY3QsIHdoaWNoIGlzIGVpdGhlciAwIChmb3IKKyAgLy8gZGVmYXVsdCBhbGlnbm1lbnQpIG9yIHRoZSBkZXNpcmVkIHZhbHVlLgorICB1bnNpZ25lZCBnZXRBbGlnbm1lbnQoKSBjb25zdCB7IHJldHVybiBBbGlnbm1lbnQ7IH0KKyAgdW5zaWduZWQgY2hhciBnZXRUYXJnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIFRhcmdldEZsYWdzOyB9CisKKyAgVHlwZSAqZ2V0VHlwZSgpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6Q29uc3RhbnRQb29sIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0Q29uc3RhbnRQb29sOworICB9Cit9OworCisvLy8gQ29tcGxldGVseSB0YXJnZXQtZGVwZW5kZW50IG9iamVjdCByZWZlcmVuY2UuCitjbGFzcyBUYXJnZXRJbmRleFNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworCisgIHVuc2lnbmVkIGNoYXIgVGFyZ2V0RmxhZ3M7CisgIGludCBJbmRleDsKKyAgaW50NjRfdCBPZmZzZXQ7CisKK3B1YmxpYzoKKyAgVGFyZ2V0SW5kZXhTRE5vZGUoaW50IElkeCwgRVZUIFZULCBpbnQ2NF90IE9mcywgdW5zaWduZWQgY2hhciBURikKKyAgICA6IFNETm9kZShJU0Q6OlRhcmdldEluZGV4LCAwLCBEZWJ1Z0xvYygpLCBnZXRTRFZUTGlzdChWVCkpLAorICAgICAgVGFyZ2V0RmxhZ3MoVEYpLCBJbmRleChJZHgpLCBPZmZzZXQoT2ZzKSB7fQorCisgIHVuc2lnbmVkIGNoYXIgZ2V0VGFyZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBUYXJnZXRGbGFnczsgfQorICBpbnQgZ2V0SW5kZXgoKSBjb25zdCB7IHJldHVybiBJbmRleDsgfQorICBpbnQ2NF90IGdldE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIE9mZnNldDsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0SW5kZXg7CisgIH0KK307CisKK2NsYXNzIEJhc2ljQmxvY2tTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKworICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCOworCisgIC8vLyBEZWJ1ZyBpbmZvIGlzIG1lYW5pbmdmdWwgYW5kIHBvdGVudGlhbGx5IHVzZWZ1bCBoZXJlLCBidXQgd2UgY3JlYXRlCisgIC8vLyBibG9ja3Mgb3V0IG9mIG9yZGVyIHdoZW4gdGhleSdyZSBqdW1wZWQgdG8sIHdoaWNoIG1ha2VzIGl0IGEgYml0CisgIC8vLyBoYXJkZXIuICBMZXQncyBzZWUgaWYgd2UgbmVlZCBpdCBmaXJzdC4KKyAgZXhwbGljaXQgQmFzaWNCbG9ja1NETm9kZShNYWNoaW5lQmFzaWNCbG9jayAqbWJiKQorICAgIDogU0ROb2RlKElTRDo6QmFzaWNCbG9jaywgMCwgRGVidWdMb2MoKSwgZ2V0U0RWVExpc3QoTVZUOjpPdGhlcikpLCBNQkIobWJiKQorICB7fQorCitwdWJsaWM6CisgIE1hY2hpbmVCYXNpY0Jsb2NrICpnZXRCYXNpY0Jsb2NrKCkgY29uc3QgeyByZXR1cm4gTUJCOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpCYXNpY0Jsb2NrOworICB9Cit9OworCisvLy8gQSAicHNldWRvLWNsYXNzIiB3aXRoIG1ldGhvZHMgZm9yIG9wZXJhdGluZyBvbiBCVUlMRF9WRUNUT1JzLgorY2xhc3MgQnVpbGRWZWN0b3JTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKK3B1YmxpYzoKKyAgLy8gVGhlc2UgYXJlIGNvbnN0cnVjdGVkIGFzIFNETm9kZXMgYW5kIHRoZW4gY2FzdCB0byBCdWlsZFZlY3RvclNETm9kZXMuCisgIGV4cGxpY2l0IEJ1aWxkVmVjdG9yU0ROb2RlKCkgPSBkZWxldGU7CisKKyAgLy8vIENoZWNrIGlmIHRoaXMgaXMgYSBjb25zdGFudCBzcGxhdCwgYW5kIGlmIHNvLCBmaW5kIHRoZQorICAvLy8gc21hbGxlc3QgZWxlbWVudCBzaXplIHRoYXQgc3BsYXRzIHRoZSB2ZWN0b3IuICBJZiBNaW5TcGxhdEJpdHMgaXMKKyAgLy8vIG5vbnplcm8sIHRoZSBlbGVtZW50IHNpemUgbXVzdCBiZSBhdCBsZWFzdCB0aGF0IGxhcmdlLiAgTm90ZSB0aGF0IHRoZQorICAvLy8gc3BsYXQgZWxlbWVudCBtYXkgYmUgdGhlIGVudGlyZSB2ZWN0b3IgKGkuZS4sIGEgb25lIGVsZW1lbnQgdmVjdG9yKS4KKyAgLy8vIFJldHVybnMgdGhlIHNwbGF0IGVsZW1lbnQgdmFsdWUgaW4gU3BsYXRWYWx1ZS4gIEFueSB1bmRlZmluZWQgYml0cyBpbgorICAvLy8gdGhhdCB2YWx1ZSBhcmUgemVybywgYW5kIHRoZSBjb3JyZXNwb25kaW5nIGJpdHMgaW4gdGhlIFNwbGF0VW5kZWYgbWFzaworICAvLy8gYXJlIHNldC4gIFRoZSBTcGxhdEJpdFNpemUgdmFsdWUgaXMgc2V0IHRvIHRoZSBzcGxhdCBlbGVtZW50IHNpemUgaW4KKyAgLy8vIGJpdHMuICBIYXNBbnlVbmRlZnMgaXMgc2V0IHRvIHRydWUgaWYgYW55IGJpdHMgaW4gdGhlIHZlY3RvciBhcmUKKyAgLy8vIHVuZGVmaW5lZC4gIGlzQmlnRW5kaWFuIGRlc2NyaWJlcyB0aGUgZW5kaWFubmVzcyBvZiB0aGUgdGFyZ2V0LgorICBib29sIGlzQ29uc3RhbnRTcGxhdChBUEludCAmU3BsYXRWYWx1ZSwgQVBJbnQgJlNwbGF0VW5kZWYsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZTcGxhdEJpdFNpemUsIGJvb2wgJkhhc0FueVVuZGVmcywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWluU3BsYXRCaXRzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0JpZ0VuZGlhbiA9IGZhbHNlKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHNwbGF0dGVkIHZhbHVlIG9yIGEgbnVsbCB2YWx1ZSBpZiB0aGlzIGlzIG5vdCBhIHNwbGF0LgorICAvLy8KKyAgLy8vIElmIHBhc3NlZCBhIG5vbi1udWxsIFVuZGVmRWxlbWVudHMgYml0dmVjdG9yLCBpdCB3aWxsIHJlc2l6ZSBpdCB0byBtYXRjaAorICAvLy8gdGhlIHZlY3RvciB3aWR0aCBhbmQgc2V0IHRoZSBiaXRzIHdoZXJlIGVsZW1lbnRzIGFyZSB1bmRlZi4KKyAgU0RWYWx1ZSBnZXRTcGxhdFZhbHVlKEJpdFZlY3RvciAqVW5kZWZFbGVtZW50cyA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgc3BsYXR0ZWQgY29uc3RhbnQgb3IgbnVsbCBpZiB0aGlzIGlzIG5vdCBhIGNvbnN0YW50CisgIC8vLyBzcGxhdC4KKyAgLy8vCisgIC8vLyBJZiBwYXNzZWQgYSBub24tbnVsbCBVbmRlZkVsZW1lbnRzIGJpdHZlY3RvciwgaXQgd2lsbCByZXNpemUgaXQgdG8gbWF0Y2gKKyAgLy8vIHRoZSB2ZWN0b3Igd2lkdGggYW5kIHNldCB0aGUgYml0cyB3aGVyZSBlbGVtZW50cyBhcmUgdW5kZWYuCisgIENvbnN0YW50U0ROb2RlICoKKyAgZ2V0Q29uc3RhbnRTcGxhdE5vZGUoQml0VmVjdG9yICpVbmRlZkVsZW1lbnRzID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBzcGxhdHRlZCBjb25zdGFudCBGUCBvciBudWxsIGlmIHRoaXMgaXMgbm90IGEgY29uc3RhbnQKKyAgLy8vIEZQIHNwbGF0LgorICAvLy8KKyAgLy8vIElmIHBhc3NlZCBhIG5vbi1udWxsIFVuZGVmRWxlbWVudHMgYml0dmVjdG9yLCBpdCB3aWxsIHJlc2l6ZSBpdCB0byBtYXRjaAorICAvLy8gdGhlIHZlY3RvciB3aWR0aCBhbmQgc2V0IHRoZSBiaXRzIHdoZXJlIGVsZW1lbnRzIGFyZSB1bmRlZi4KKyAgQ29uc3RhbnRGUFNETm9kZSAqCisgIGdldENvbnN0YW50RlBTcGxhdE5vZGUoQml0VmVjdG9yICpVbmRlZkVsZW1lbnRzID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJZiB0aGlzIGlzIGEgY29uc3RhbnQgRlAgc3BsYXQgYW5kIHRoZSBzcGxhdHRlZCBjb25zdGFudCBGUCBpcyBhbgorICAvLy8gZXhhY3QgcG93ZXIgb3IgMiwgcmV0dXJuIHRoZSBsb2cgYmFzZSAyIGludGVnZXIgdmFsdWUuICBPdGhlcndpc2UsCisgIC8vLyByZXR1cm4gLTEuCisgIC8vLworICAvLy8gVGhlIEJpdFdpZHRoIHNwZWNpZmllcyB0aGUgbmVjZXNzYXJ5IGJpdCBwcmVjaXNpb24uCisgIGludDMyX3QgZ2V0Q29uc3RhbnRGUFNwbGF0UG93MlRvTG9nMkludChCaXRWZWN0b3IgKlVuZGVmRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBCaXRXaWR0aCkgY29uc3Q7CisKKyAgYm9vbCBpc0NvbnN0YW50KCkgY29uc3Q7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpCVUlMRF9WRUNUT1I7CisgIH0KK307CisKKy8vLyBBbiBTRE5vZGUgdGhhdCBob2xkcyBhbiBhcmJpdHJhcnkgTExWTSBJUiBWYWx1ZS4gVGhpcyBpcworLy8vIHVzZWQgd2hlbiB0aGUgU2VsZWN0aW9uREFHIG5lZWRzIHRvIG1ha2UgYSBzaW1wbGUgcmVmZXJlbmNlIHRvIHNvbWV0aGluZworLy8vIGluIHRoZSBMTFZNIElSIHJlcHJlc2VudGF0aW9uLgorLy8vCitjbGFzcyBTcmNWYWx1ZVNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworCisgIGNvbnN0IFZhbHVlICpWOworCisgIC8vLyBDcmVhdGUgYSBTcmNWYWx1ZSBmb3IgYSBnZW5lcmFsIHZhbHVlLgorICBleHBsaWNpdCBTcmNWYWx1ZVNETm9kZShjb25zdCBWYWx1ZSAqdikKKyAgICA6IFNETm9kZShJU0Q6OlNSQ1ZBTFVFLCAwLCBEZWJ1Z0xvYygpLCBnZXRTRFZUTGlzdChNVlQ6Ok90aGVyKSksIFYodikge30KKworcHVibGljOgorICAvLy8gUmV0dXJuIHRoZSBjb250YWluZWQgVmFsdWUuCisgIGNvbnN0IFZhbHVlICpnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFY7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNSQ1ZBTFVFOworICB9Cit9OworCitjbGFzcyBNRE5vZGVTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKworICBjb25zdCBNRE5vZGUgKk1EOworCisgIGV4cGxpY2l0IE1ETm9kZVNETm9kZShjb25zdCBNRE5vZGUgKm1kKQorICA6IFNETm9kZShJU0Q6Ok1ETk9ERV9TRE5PREUsIDAsIERlYnVnTG9jKCksIGdldFNEVlRMaXN0KE1WVDo6T3RoZXIpKSwgTUQobWQpCisgIHt9CisKK3B1YmxpYzoKKyAgY29uc3QgTUROb2RlICpnZXRNRCgpIGNvbnN0IHsgcmV0dXJuIE1EOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpNRE5PREVfU0ROT0RFOworICB9Cit9OworCitjbGFzcyBSZWdpc3RlclNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworCisgIHVuc2lnbmVkIFJlZzsKKworICBSZWdpc3RlclNETm9kZSh1bnNpZ25lZCByZWcsIEVWVCBWVCkKKyAgICA6IFNETm9kZShJU0Q6OlJlZ2lzdGVyLCAwLCBEZWJ1Z0xvYygpLCBnZXRTRFZUTGlzdChWVCkpLCBSZWcocmVnKSB7fQorCitwdWJsaWM6CisgIHVuc2lnbmVkIGdldFJlZygpIGNvbnN0IHsgcmV0dXJuIFJlZzsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6UmVnaXN0ZXI7CisgIH0KK307CisKK2NsYXNzIFJlZ2lzdGVyTWFza1NETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworCisgIC8vIFRoZSBtZW1vcnkgZm9yIFJlZ01hc2sgaXMgbm90IG93bmVkIGJ5IHRoZSBub2RlLgorICBjb25zdCB1aW50MzJfdCAqUmVnTWFzazsKKworICBSZWdpc3Rlck1hc2tTRE5vZGUoY29uc3QgdWludDMyX3QgKm1hc2spCisgICAgOiBTRE5vZGUoSVNEOjpSZWdpc3Rlck1hc2ssIDAsIERlYnVnTG9jKCksIGdldFNEVlRMaXN0KE1WVDo6VW50eXBlZCkpLAorICAgICAgUmVnTWFzayhtYXNrKSB7fQorCitwdWJsaWM6CisgIGNvbnN0IHVpbnQzMl90ICpnZXRSZWdNYXNrKCkgY29uc3QgeyByZXR1cm4gUmVnTWFzazsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6UmVnaXN0ZXJNYXNrOworICB9Cit9OworCitjbGFzcyBCbG9ja0FkZHJlc3NTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKworICBjb25zdCBCbG9ja0FkZHJlc3MgKkJBOworICBpbnQ2NF90IE9mZnNldDsKKyAgdW5zaWduZWQgY2hhciBUYXJnZXRGbGFnczsKKworICBCbG9ja0FkZHJlc3NTRE5vZGUodW5zaWduZWQgTm9kZVR5LCBFVlQgVlQsIGNvbnN0IEJsb2NrQWRkcmVzcyAqYmEsCisgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IG8sIHVuc2lnbmVkIGNoYXIgRmxhZ3MpCisgICAgOiBTRE5vZGUoTm9kZVR5LCAwLCBEZWJ1Z0xvYygpLCBnZXRTRFZUTGlzdChWVCkpLAorICAgICAgICAgICAgIEJBKGJhKSwgT2Zmc2V0KG8pLCBUYXJnZXRGbGFncyhGbGFncykge30KKworcHVibGljOgorICBjb25zdCBCbG9ja0FkZHJlc3MgKmdldEJsb2NrQWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIEJBOyB9CisgIGludDY0X3QgZ2V0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gT2Zmc2V0OyB9CisgIHVuc2lnbmVkIGNoYXIgZ2V0VGFyZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBUYXJnZXRGbGFnczsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6QmxvY2tBZGRyZXNzIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0QmxvY2tBZGRyZXNzOworICB9Cit9OworCitjbGFzcyBMYWJlbFNETm9kZSA6IHB1YmxpYyBTRE5vZGUgeworICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworCisgIE1DU3ltYm9sICpMYWJlbDsKKworICBMYWJlbFNETm9kZSh1bnNpZ25lZCBPcmRlciwgY29uc3QgRGVidWdMb2MgJmRsLCBNQ1N5bWJvbCAqTCkKKyAgICAgIDogU0ROb2RlKElTRDo6RUhfTEFCRUwsIE9yZGVyLCBkbCwgZ2V0U0RWVExpc3QoTVZUOjpPdGhlcikpLCBMYWJlbChMKSB7fQorCitwdWJsaWM6CisgIE1DU3ltYm9sICpnZXRMYWJlbCgpIGNvbnN0IHsgcmV0dXJuIExhYmVsOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpFSF9MQUJFTCB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkFOTk9UQVRJT05fTEFCRUw7CisgIH0KK307CisKK2NsYXNzIEV4dGVybmFsU3ltYm9sU0ROb2RlIDogcHVibGljIFNETm9kZSB7CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisKKyAgY29uc3QgY2hhciAqU3ltYm9sOworICB1bnNpZ25lZCBjaGFyIFRhcmdldEZsYWdzOworCisgIEV4dGVybmFsU3ltYm9sU0ROb2RlKGJvb2wgaXNUYXJnZXQsIGNvbnN0IGNoYXIgKlN5bSwgdW5zaWduZWQgY2hhciBURiwgRVZUIFZUKQorICAgIDogU0ROb2RlKGlzVGFyZ2V0ID8gSVNEOjpUYXJnZXRFeHRlcm5hbFN5bWJvbCA6IElTRDo6RXh0ZXJuYWxTeW1ib2wsCisgICAgICAgICAgICAgMCwgRGVidWdMb2MoKSwgZ2V0U0RWVExpc3QoVlQpKSwgU3ltYm9sKFN5bSksIFRhcmdldEZsYWdzKFRGKSB7fQorCitwdWJsaWM6CisgIGNvbnN0IGNoYXIgKmdldFN5bWJvbCgpIGNvbnN0IHsgcmV0dXJuIFN5bWJvbDsgfQorICB1bnNpZ25lZCBjaGFyIGdldFRhcmdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gVGFyZ2V0RmxhZ3M7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OkV4dGVybmFsU3ltYm9sIHx8CisgICAgICAgICAgIE4tPmdldE9wY29kZSgpID09IElTRDo6VGFyZ2V0RXh0ZXJuYWxTeW1ib2w7CisgIH0KK307CisKK2NsYXNzIE1DU3ltYm9sU0ROb2RlIDogcHVibGljIFNETm9kZSB7CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisKKyAgTUNTeW1ib2wgKlN5bWJvbDsKKworICBNQ1N5bWJvbFNETm9kZShNQ1N5bWJvbCAqU3ltYm9sLCBFVlQgVlQpCisgICAgICA6IFNETm9kZShJU0Q6Ok1DU3ltYm9sLCAwLCBEZWJ1Z0xvYygpLCBnZXRTRFZUTGlzdChWVCkpLCBTeW1ib2woU3ltYm9sKSB7fQorCitwdWJsaWM6CisgIE1DU3ltYm9sICpnZXRNQ1N5bWJvbCgpIGNvbnN0IHsgcmV0dXJuIFN5bWJvbDsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6TUNTeW1ib2w7CisgIH0KK307CisKK2NsYXNzIENvbmRDb2RlU0ROb2RlIDogcHVibGljIFNETm9kZSB7CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisKKyAgSVNEOjpDb25kQ29kZSBDb25kaXRpb247CisKKyAgZXhwbGljaXQgQ29uZENvZGVTRE5vZGUoSVNEOjpDb25kQ29kZSBDb25kKQorICAgIDogU0ROb2RlKElTRDo6Q09ORENPREUsIDAsIERlYnVnTG9jKCksIGdldFNEVlRMaXN0KE1WVDo6T3RoZXIpKSwKKyAgICAgIENvbmRpdGlvbihDb25kKSB7fQorCitwdWJsaWM6CisgIElTRDo6Q29uZENvZGUgZ2V0KCkgY29uc3QgeyByZXR1cm4gQ29uZGl0aW9uOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpDT05EQ09ERTsKKyAgfQorfTsKKworLy8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgRVZUJ3MsIHdoaWNoIGFyZSB1c2VkCisvLy8gdG8gcGFyYW1ldGVyaXplIHNvbWUgb3BlcmF0aW9ucy4KK2NsYXNzIFZUU0ROb2RlIDogcHVibGljIFNETm9kZSB7CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisKKyAgRVZUIFZhbHVlVHlwZTsKKworICBleHBsaWNpdCBWVFNETm9kZShFVlQgVlQpCisgICAgOiBTRE5vZGUoSVNEOjpWQUxVRVRZUEUsIDAsIERlYnVnTG9jKCksIGdldFNEVlRMaXN0KE1WVDo6T3RoZXIpKSwKKyAgICAgIFZhbHVlVHlwZShWVCkge30KKworcHVibGljOgorICBFVlQgZ2V0VlQoKSBjb25zdCB7IHJldHVybiBWYWx1ZVR5cGU7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlZBTFVFVFlQRTsKKyAgfQorfTsKKworLy8vIEJhc2UgY2xhc3MgZm9yIExvYWRTRE5vZGUgYW5kIFN0b3JlU0ROb2RlCitjbGFzcyBMU0Jhc2VTRE5vZGUgOiBwdWJsaWMgTWVtU0ROb2RlIHsKK3B1YmxpYzoKKyAgTFNCYXNlU0ROb2RlKElTRDo6Tm9kZVR5cGUgTm9kZVR5LCB1bnNpZ25lZCBPcmRlciwgY29uc3QgRGVidWdMb2MgJmRsLAorICAgICAgICAgICAgICAgU0RWVExpc3QgVlRzLCBJU0Q6Ok1lbUluZGV4ZWRNb2RlIEFNLCBFVlQgTWVtVlQsCisgICAgICAgICAgICAgICBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKQorICAgICAgOiBNZW1TRE5vZGUoTm9kZVR5LCBPcmRlciwgZGwsIFZUcywgTWVtVlQsIE1NTykgeworICAgIExTQmFzZVNETm9kZUJpdHMuQWRkcmVzc2luZ01vZGUgPSBBTTsKKyAgICBhc3NlcnQoZ2V0QWRkcmVzc2luZ01vZGUoKSA9PSBBTSAmJiAiVmFsdWUgdHJ1bmNhdGVkIik7CisgIH0KKworICBjb25zdCBTRFZhbHVlICZnZXRPZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wZXJhbmQoZ2V0T3Bjb2RlKCkgPT0gSVNEOjpMT0FEID8gMiA6IDMpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgYWRkcmVzc2luZyBtb2RlIGZvciB0aGlzIGxvYWQgb3Igc3RvcmU6CisgIC8vLyB1bmluZGV4ZWQsIHByZS1pbmMsIHByZS1kZWMsIHBvc3QtaW5jLCBvciBwb3N0LWRlYy4KKyAgSVNEOjpNZW1JbmRleGVkTW9kZSBnZXRBZGRyZXNzaW5nTW9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SVNEOjpNZW1JbmRleGVkTW9kZT4oTFNCYXNlU0ROb2RlQml0cy5BZGRyZXNzaW5nTW9kZSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHByZS9wb3N0IGluYy9kZWMgbG9hZC9zdG9yZS4KKyAgYm9vbCBpc0luZGV4ZWQoKSBjb25zdCB7IHJldHVybiBnZXRBZGRyZXNzaW5nTW9kZSgpICE9IElTRDo6VU5JTkRFWEVEOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgTk9UIGEgcHJlL3Bvc3QgaW5jL2RlYyBsb2FkL3N0b3JlLgorICBib29sIGlzVW5pbmRleGVkKCkgY29uc3QgeyByZXR1cm4gZ2V0QWRkcmVzc2luZ01vZGUoKSA9PSBJU0Q6OlVOSU5ERVhFRDsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6TE9BRCB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6OlNUT1JFOworICB9Cit9OworCisvLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBJU0Q6OkxPQUQgbm9kZXMuCitjbGFzcyBMb2FkU0ROb2RlIDogcHVibGljIExTQmFzZVNETm9kZSB7CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisKKyAgTG9hZFNETm9kZSh1bnNpZ25lZCBPcmRlciwgY29uc3QgRGVidWdMb2MgJmRsLCBTRFZUTGlzdCBWVHMsCisgICAgICAgICAgICAgSVNEOjpNZW1JbmRleGVkTW9kZSBBTSwgSVNEOjpMb2FkRXh0VHlwZSBFVHksIEVWVCBNZW1WVCwKKyAgICAgICAgICAgICBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKQorICAgICAgOiBMU0Jhc2VTRE5vZGUoSVNEOjpMT0FELCBPcmRlciwgZGwsIFZUcywgQU0sIE1lbVZULCBNTU8pIHsKKyAgICBMb2FkU0ROb2RlQml0cy5FeHRUeSA9IEVUeTsKKyAgICBhc3NlcnQocmVhZE1lbSgpICYmICJMb2FkIE1hY2hpbmVNZW1PcGVyYW5kIGlzIG5vdCBhIGxvYWQhIik7CisgICAgYXNzZXJ0KCF3cml0ZU1lbSgpICYmICJMb2FkIE1hY2hpbmVNZW1PcGVyYW5kIGlzIGEgc3RvcmUhIik7CisgIH0KKworcHVibGljOgorICAvLy8gUmV0dXJuIHdoZXRoZXIgdGhpcyBpcyBhIHBsYWluIG5vZGUsCisgIC8vLyBvciBvbmUgb2YgdGhlIHZhcmlldGllcyBvZiB2YWx1ZS1leHRlbmRpbmcgbG9hZHMuCisgIElTRDo6TG9hZEV4dFR5cGUgZ2V0RXh0ZW5zaW9uVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SVNEOjpMb2FkRXh0VHlwZT4oTG9hZFNETm9kZUJpdHMuRXh0VHkpOworICB9CisKKyAgY29uc3QgU0RWYWx1ZSAmZ2V0QmFzZVB0cigpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMSk7IH0KKyAgY29uc3QgU0RWYWx1ZSAmZ2V0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgyKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6TE9BRDsKKyAgfQorfTsKKworLy8vIFRoaXMgY2xhc3MgaXMgdXNlZCB0byByZXByZXNlbnQgSVNEOjpTVE9SRSBub2Rlcy4KK2NsYXNzIFN0b3JlU0ROb2RlIDogcHVibGljIExTQmFzZVNETm9kZSB7CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisKKyAgU3RvcmVTRE5vZGUodW5zaWduZWQgT3JkZXIsIGNvbnN0IERlYnVnTG9jICZkbCwgU0RWVExpc3QgVlRzLAorICAgICAgICAgICAgICBJU0Q6Ok1lbUluZGV4ZWRNb2RlIEFNLCBib29sIGlzVHJ1bmMsIEVWVCBNZW1WVCwKKyAgICAgICAgICAgICAgTWFjaGluZU1lbU9wZXJhbmQgKk1NTykKKyAgICAgIDogTFNCYXNlU0ROb2RlKElTRDo6U1RPUkUsIE9yZGVyLCBkbCwgVlRzLCBBTSwgTWVtVlQsIE1NTykgeworICAgIFN0b3JlU0ROb2RlQml0cy5Jc1RydW5jYXRpbmcgPSBpc1RydW5jOworICAgIGFzc2VydCghcmVhZE1lbSgpICYmICJTdG9yZSBNYWNoaW5lTWVtT3BlcmFuZCBpcyBhIGxvYWQhIik7CisgICAgYXNzZXJ0KHdyaXRlTWVtKCkgJiYgIlN0b3JlIE1hY2hpbmVNZW1PcGVyYW5kIGlzIG5vdCBhIHN0b3JlISIpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBvcCBkb2VzIGEgdHJ1bmNhdGlvbiBiZWZvcmUgc3RvcmUuCisgIC8vLyBGb3IgaW50ZWdlcnMgdGhpcyBpcyB0aGUgc2FtZSBhcyBkb2luZyBhIFRSVU5DQVRFIGFuZCBzdG9yaW5nIHRoZSByZXN1bHQuCisgIC8vLyBGb3IgZmxvYXRzLCBpdCBpcyB0aGUgc2FtZSBhcyBkb2luZyBhbiBGUF9ST1VORCBhbmQgc3RvcmluZyB0aGUgcmVzdWx0LgorICBib29sIGlzVHJ1bmNhdGluZ1N0b3JlKCkgY29uc3QgeyByZXR1cm4gU3RvcmVTRE5vZGVCaXRzLklzVHJ1bmNhdGluZzsgfQorICB2b2lkIHNldFRydW5jYXRpbmdTdG9yZShib29sIFRydW5jYXRpbmcpIHsKKyAgICBTdG9yZVNETm9kZUJpdHMuSXNUcnVuY2F0aW5nID0gVHJ1bmNhdGluZzsKKyAgfQorCisgIGNvbnN0IFNEVmFsdWUgJmdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgxKTsgfQorICBjb25zdCBTRFZhbHVlICZnZXRCYXNlUHRyKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgyKTsgfQorICBjb25zdCBTRFZhbHVlICZnZXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDMpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpTVE9SRTsKKyAgfQorfTsKKworLy8vIFRoaXMgYmFzZSBjbGFzcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBNTE9BRCBhbmQgTVNUT1JFIG5vZGVzCitjbGFzcyBNYXNrZWRMb2FkU3RvcmVTRE5vZGUgOiBwdWJsaWMgTWVtU0ROb2RlIHsKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKworICBNYXNrZWRMb2FkU3RvcmVTRE5vZGUoSVNEOjpOb2RlVHlwZSBOb2RlVHksIHVuc2lnbmVkIE9yZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdMb2MgJmRsLCBTRFZUTGlzdCBWVHMsIEVWVCBNZW1WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pCisgICAgICA6IE1lbVNETm9kZShOb2RlVHksIE9yZGVyLCBkbCwgVlRzLCBNZW1WVCwgTU1PKSB7fQorCisgIC8vIEluIHRoZSBib3RoIG5vZGVzIGFkZHJlc3MgaXMgT3AxLCBtYXNrIGlzIE9wMjoKKyAgLy8gTWFza2VkTG9hZFNETm9kZSAoQ2hhaW4sIHB0ciwgbWFzaywgc3JjMCksIHNyYzAgaXMgYSBwYXNzdGhydSB2YWx1ZQorICAvLyBNYXNrZWRTdG9yZVNETm9kZSAoQ2hhaW4sIHB0ciwgbWFzaywgZGF0YSkKKyAgLy8gTWFzayBpcyBhIHZlY3RvciBvZiBpMSBlbGVtZW50cworICBjb25zdCBTRFZhbHVlICZnZXRCYXNlUHRyKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgxKTsgfQorICBjb25zdCBTRFZhbHVlICZnZXRNYXNrKCkgY29uc3QgICAgeyByZXR1cm4gZ2V0T3BlcmFuZCgyKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6TUxPQUQgfHwKKyAgICAgICAgICAgTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpNU1RPUkU7CisgIH0KK307CisKKy8vLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVwcmVzZW50IGFuIE1MT0FEIG5vZGUKK2NsYXNzIE1hc2tlZExvYWRTRE5vZGUgOiBwdWJsaWMgTWFza2VkTG9hZFN0b3JlU0ROb2RlIHsKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKworICBNYXNrZWRMb2FkU0ROb2RlKHVuc2lnbmVkIE9yZGVyLCBjb25zdCBEZWJ1Z0xvYyAmZGwsIFNEVlRMaXN0IFZUcywKKyAgICAgICAgICAgICAgICAgICBJU0Q6OkxvYWRFeHRUeXBlIEVUeSwgYm9vbCBJc0V4cGFuZGluZywgRVZUIE1lbVZULAorICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pCisgICAgICA6IE1hc2tlZExvYWRTdG9yZVNETm9kZShJU0Q6Ok1MT0FELCBPcmRlciwgZGwsIFZUcywgTWVtVlQsIE1NTykgeworICAgIExvYWRTRE5vZGVCaXRzLkV4dFR5ID0gRVR5OworICAgIExvYWRTRE5vZGVCaXRzLklzRXhwYW5kaW5nID0gSXNFeHBhbmRpbmc7CisgIH0KKworICBJU0Q6OkxvYWRFeHRUeXBlIGdldEV4dGVuc2lvblR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PElTRDo6TG9hZEV4dFR5cGU+KExvYWRTRE5vZGVCaXRzLkV4dFR5KTsKKyAgfQorCisgIGNvbnN0IFNEVmFsdWUgJmdldFNyYzAoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDMpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6TUxPQUQ7CisgIH0KKworICBib29sIGlzRXhwYW5kaW5nTG9hZCgpIGNvbnN0IHsgcmV0dXJuIExvYWRTRE5vZGVCaXRzLklzRXhwYW5kaW5nOyB9Cit9OworCisvLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhbiBNU1RPUkUgbm9kZQorY2xhc3MgTWFza2VkU3RvcmVTRE5vZGUgOiBwdWJsaWMgTWFza2VkTG9hZFN0b3JlU0ROb2RlIHsKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKworICBNYXNrZWRTdG9yZVNETm9kZSh1bnNpZ25lZCBPcmRlciwgY29uc3QgRGVidWdMb2MgJmRsLCBTRFZUTGlzdCBWVHMsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNUcnVuYywgYm9vbCBpc0NvbXByZXNzaW5nLCBFVlQgTWVtVlQsCisgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pCisgICAgICA6IE1hc2tlZExvYWRTdG9yZVNETm9kZShJU0Q6Ok1TVE9SRSwgT3JkZXIsIGRsLCBWVHMsIE1lbVZULCBNTU8pIHsKKyAgICBTdG9yZVNETm9kZUJpdHMuSXNUcnVuY2F0aW5nID0gaXNUcnVuYzsKKyAgICBTdG9yZVNETm9kZUJpdHMuSXNDb21wcmVzc2luZyA9IGlzQ29tcHJlc3Npbmc7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIG9wIGRvZXMgYSB0cnVuY2F0aW9uIGJlZm9yZSBzdG9yZS4KKyAgLy8vIEZvciBpbnRlZ2VycyB0aGlzIGlzIHRoZSBzYW1lIGFzIGRvaW5nIGEgVFJVTkNBVEUgYW5kIHN0b3JpbmcgdGhlIHJlc3VsdC4KKyAgLy8vIEZvciBmbG9hdHMsIGl0IGlzIHRoZSBzYW1lIGFzIGRvaW5nIGFuIEZQX1JPVU5EIGFuZCBzdG9yaW5nIHRoZSByZXN1bHQuCisgIGJvb2wgaXNUcnVuY2F0aW5nU3RvcmUoKSBjb25zdCB7IHJldHVybiBTdG9yZVNETm9kZUJpdHMuSXNUcnVuY2F0aW5nOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgb3AgZG9lcyBhIGNvbXByZXNzaW9uIHRvIHRoZSB2ZWN0b3IgYmVmb3JlIHN0b3JpbmcuCisgIC8vLyBUaGUgbm9kZSBjb250aWd1b3VzbHkgc3RvcmVzIHRoZSBhY3RpdmUgZWxlbWVudHMgKGludGVnZXJzIG9yIGZsb2F0cykKKyAgLy8vIGluIHNyYyAodGhvc2Ugd2l0aCB0aGVpciByZXNwZWN0aXZlIGJpdCBzZXQgaW4gd3JpdGVtYXNrIGspIHRvIHVuYWxpZ25lZAorICAvLy8gbWVtb3J5IGF0IGJhc2VfYWRkci4KKyAgYm9vbCBpc0NvbXByZXNzaW5nU3RvcmUoKSBjb25zdCB7IHJldHVybiBTdG9yZVNETm9kZUJpdHMuSXNDb21wcmVzc2luZzsgfQorCisgIGNvbnN0IFNEVmFsdWUgJmdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgzKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6TVNUT1JFOworICB9Cit9OworCisvLy8gVGhpcyBpcyBhIGJhc2UgY2xhc3MgdXNlZCB0byByZXByZXNlbnQKKy8vLyBNR0FUSEVSIGFuZCBNU0NBVFRFUiBub2RlcworLy8vCitjbGFzcyBNYXNrZWRHYXRoZXJTY2F0dGVyU0ROb2RlIDogcHVibGljIE1lbVNETm9kZSB7CitwdWJsaWM6CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisKKyAgTWFza2VkR2F0aGVyU2NhdHRlclNETm9kZShJU0Q6Ok5vZGVUeXBlIE5vZGVUeSwgdW5zaWduZWQgT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdMb2MgJmRsLCBTRFZUTGlzdCBWVHMsIEVWVCBNZW1WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTWVtT3BlcmFuZCAqTU1PKQorICAgICAgOiBNZW1TRE5vZGUoTm9kZVR5LCBPcmRlciwgZGwsIFZUcywgTWVtVlQsIE1NTykge30KKworICAvLyBJbiB0aGUgYm90aCBub2RlcyBhZGRyZXNzIGlzIE9wMSwgbWFzayBpcyBPcDI6CisgIC8vIE1hc2tlZEdhdGhlclNETm9kZSAgKENoYWluLCBwYXNzdGhydSwgbWFzaywgYmFzZSwgaW5kZXgsIHNjYWxlKQorICAvLyBNYXNrZWRTY2F0dGVyU0ROb2RlIChDaGFpbiwgdmFsdWUsIG1hc2ssIGJhc2UsIGluZGV4LCBzY2FsZSkKKyAgLy8gTWFzayBpcyBhIHZlY3RvciBvZiBpMSBlbGVtZW50cworICBjb25zdCBTRFZhbHVlICZnZXRCYXNlUHRyKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgzKTsgfQorICBjb25zdCBTRFZhbHVlICZnZXRJbmRleCgpICAgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCg0KTsgfQorICBjb25zdCBTRFZhbHVlICZnZXRNYXNrKCkgICAgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgyKTsgfQorICBjb25zdCBTRFZhbHVlICZnZXRWYWx1ZSgpICAgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgxKTsgfQorICBjb25zdCBTRFZhbHVlICZnZXRTY2FsZSgpICAgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCg1KTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldE9wY29kZSgpID09IElTRDo6TUdBVEhFUiB8fAorICAgICAgICAgICBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6Ok1TQ0FUVEVSOworICB9Cit9OworCisvLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhbiBNR0FUSEVSIG5vZGUKKy8vLworY2xhc3MgTWFza2VkR2F0aGVyU0ROb2RlIDogcHVibGljIE1hc2tlZEdhdGhlclNjYXR0ZXJTRE5vZGUgeworcHVibGljOgorICBmcmllbmQgY2xhc3MgU2VsZWN0aW9uREFHOworCisgIE1hc2tlZEdhdGhlclNETm9kZSh1bnNpZ25lZCBPcmRlciwgY29uc3QgRGVidWdMb2MgJmRsLCBTRFZUTGlzdCBWVHMsCisgICAgICAgICAgICAgICAgICAgICBFVlQgTWVtVlQsIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pCisgICAgICA6IE1hc2tlZEdhdGhlclNjYXR0ZXJTRE5vZGUoSVNEOjpNR0FUSEVSLCBPcmRlciwgZGwsIFZUcywgTWVtVlQsIE1NTykge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRPcGNvZGUoKSA9PSBJU0Q6Ok1HQVRIRVI7CisgIH0KK307CisKKy8vLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gcmVwcmVzZW50IGFuIE1TQ0FUVEVSIG5vZGUKKy8vLworY2xhc3MgTWFza2VkU2NhdHRlclNETm9kZSA6IHB1YmxpYyBNYXNrZWRHYXRoZXJTY2F0dGVyU0ROb2RlIHsKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIFNlbGVjdGlvbkRBRzsKKworICBNYXNrZWRTY2F0dGVyU0ROb2RlKHVuc2lnbmVkIE9yZGVyLCBjb25zdCBEZWJ1Z0xvYyAmZGwsIFNEVlRMaXN0IFZUcywKKyAgICAgICAgICAgICAgICAgICAgICBFVlQgTWVtVlQsIE1hY2hpbmVNZW1PcGVyYW5kICpNTU8pCisgICAgICA6IE1hc2tlZEdhdGhlclNjYXR0ZXJTRE5vZGUoSVNEOjpNU0NBVFRFUiwgT3JkZXIsIGRsLCBWVHMsIE1lbVZULCBNTU8pIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0T3Bjb2RlKCkgPT0gSVNEOjpNU0NBVFRFUjsKKyAgfQorfTsKKworLy8vIEFuIFNETm9kZSB0aGF0IHJlcHJlc2VudHMgZXZlcnl0aGluZyB0aGF0IHdpbGwgYmUgbmVlZGVkCisvLy8gdG8gY29uc3RydWN0IGEgTWFjaGluZUluc3RyLiBUaGVzZSBub2RlcyBhcmUgY3JlYXRlZCBkdXJpbmcgdGhlCisvLy8gaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIHByb3BlciBwaGFzZS4KK2NsYXNzIE1hY2hpbmVTRE5vZGUgOiBwdWJsaWMgU0ROb2RlIHsKK3B1YmxpYzoKKyAgdXNpbmcgbW1vX2l0ZXJhdG9yID0gTWFjaGluZU1lbU9wZXJhbmQgKio7CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBTZWxlY3Rpb25EQUc7CisKKyAgTWFjaGluZVNETm9kZSh1bnNpZ25lZCBPcGMsIHVuc2lnbmVkIE9yZGVyLCBjb25zdCBEZWJ1Z0xvYyAmREwsIFNEVlRMaXN0IFZUcykKKyAgICAgIDogU0ROb2RlKE9wYywgT3JkZXIsIERMLCBWVHMpIHt9CisKKyAgLy8vIE1lbW9yeSByZWZlcmVuY2UgZGVzY3JpcHRpb25zIGZvciB0aGlzIGluc3RydWN0aW9uLgorICBtbW9faXRlcmF0b3IgTWVtUmVmcyA9IG51bGxwdHI7CisgIG1tb19pdGVyYXRvciBNZW1SZWZzRW5kID0gbnVsbHB0cjsKKworcHVibGljOgorICBtbW9faXRlcmF0b3IgbWVtb3BlcmFuZHNfYmVnaW4oKSBjb25zdCB7IHJldHVybiBNZW1SZWZzOyB9CisgIG1tb19pdGVyYXRvciBtZW1vcGVyYW5kc19lbmQoKSBjb25zdCB7IHJldHVybiBNZW1SZWZzRW5kOyB9CisgIGJvb2wgbWVtb3BlcmFuZHNfZW1wdHkoKSBjb25zdCB7IHJldHVybiBNZW1SZWZzRW5kID09IE1lbVJlZnM7IH0KKworICAvLy8gQXNzaWduIHRoaXMgTWFjaGluZVNETm9kZXMncyBtZW1vcnkgcmVmZXJlbmNlIGRlc2NyaXB0b3IKKyAgLy8vIGxpc3QuIFRoaXMgZG9lcyBub3QgdHJhbnNmZXIgb3duZXJzaGlwLgorICB2b2lkIHNldE1lbVJlZnMobW1vX2l0ZXJhdG9yIE5ld01lbVJlZnMsIG1tb19pdGVyYXRvciBOZXdNZW1SZWZzRW5kKSB7CisgICAgZm9yIChtbW9faXRlcmF0b3IgTU1JID0gTmV3TWVtUmVmcywgTU1FID0gTmV3TWVtUmVmc0VuZDsgTU1JICE9IE1NRTsgKytNTUkpCisgICAgICBhc3NlcnQoKk1NSSAmJiAiTnVsbCBtZW0gcmVmIGRldGVjdGVkISIpOworICAgIE1lbVJlZnMgPSBOZXdNZW1SZWZzOworICAgIE1lbVJlZnNFbmQgPSBOZXdNZW1SZWZzRW5kOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+aXNNYWNoaW5lT3Bjb2RlKCk7CisgIH0KK307CisKK2NsYXNzIFNETm9kZUl0ZXJhdG9yIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ROb2RlLCBwdHJkaWZmX3Q+IHsKKyAgY29uc3QgU0ROb2RlICpOb2RlOworICB1bnNpZ25lZCBPcGVyYW5kOworCisgIFNETm9kZUl0ZXJhdG9yKGNvbnN0IFNETm9kZSAqTiwgdW5zaWduZWQgT3ApIDogTm9kZShOKSwgT3BlcmFuZChPcCkge30KKworcHVibGljOgorICBib29sIG9wZXJhdG9yPT0oY29uc3QgU0ROb2RlSXRlcmF0b3ImIHgpIGNvbnN0IHsKKyAgICByZXR1cm4gT3BlcmFuZCA9PSB4Lk9wZXJhbmQ7CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNETm9kZUl0ZXJhdG9yJiB4KSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3I9PSh4KTsgfQorCisgIHBvaW50ZXIgb3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiBOb2RlLT5nZXRPcGVyYW5kKE9wZXJhbmQpLmdldE5vZGUoKTsKKyAgfQorICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBvcGVyYXRvciooKTsgfQorCisgIFNETm9kZUl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyAgICAgICAgICAgICAgICAvLyBQcmVpbmNyZW1lbnQKKyAgICArK09wZXJhbmQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIFNETm9kZUl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7IC8vIFBvc3RpbmNyZW1lbnQKKyAgICBTRE5vZGVJdGVyYXRvciB0bXAgPSAqdGhpczsgKysqdGhpczsgcmV0dXJuIHRtcDsKKyAgfQorICBzaXplX3Qgb3BlcmF0b3ItKFNETm9kZUl0ZXJhdG9yIE90aGVyKSBjb25zdCB7CisgICAgYXNzZXJ0KE5vZGUgPT0gT3RoZXIuTm9kZSAmJgorICAgICAgICAgICAiQ2Fubm90IGNvbXBhcmUgaXRlcmF0b3JzIG9mIHR3byBkaWZmZXJlbnQgbm9kZXMhIik7CisgICAgcmV0dXJuIE9wZXJhbmQgLSBPdGhlci5PcGVyYW5kOworICB9CisKKyAgc3RhdGljIFNETm9kZUl0ZXJhdG9yIGJlZ2luKGNvbnN0IFNETm9kZSAqTikgeyByZXR1cm4gU0ROb2RlSXRlcmF0b3IoTiwgMCk7IH0KKyAgc3RhdGljIFNETm9kZUl0ZXJhdG9yIGVuZCAgKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBTRE5vZGVJdGVyYXRvcihOLCBOLT5nZXROdW1PcGVyYW5kcygpKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE9wZXJhbmQoKSBjb25zdCB7IHJldHVybiBPcGVyYW5kOyB9CisgIGNvbnN0IFNETm9kZSAqZ2V0Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIE5vZGU7IH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxTRE5vZGUqPiB7CisgIHVzaW5nIE5vZGVSZWYgPSBTRE5vZGUgKjsKKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSBTRE5vZGVJdGVyYXRvcjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoU0ROb2RlICpOKSB7IHJldHVybiBOOyB9CisKKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeworICAgIHJldHVybiBTRE5vZGVJdGVyYXRvcjo6YmVnaW4oTik7CisgIH0KKworICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeworICAgIHJldHVybiBTRE5vZGVJdGVyYXRvcjo6ZW5kKE4pOworICB9Cit9OworCisvLy8gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbGFyZ2VzdCBTRE5vZGUsIGZvciB1c2UgaW4gc2l6ZW9mKCkuCisvLy8KKy8vLyBUaGlzIG5lZWRzIHRvIGJlIGEgdW5pb24gYmVjYXVzZSB0aGUgbGFyZ2VzdCBub2RlIGRpZmZlcnMgb24gMzIgYml0IHN5c3RlbXMKKy8vLyB3aXRoIDQgYW5kIDggYnl0ZSBwb2ludGVyIGFsaWdubWVudCwgcmVzcGVjdGl2ZWx5LgordXNpbmcgTGFyZ2VzdFNETm9kZSA9IEFsaWduZWRDaGFyQXJyYXlVbmlvbjxBdG9taWNTRE5vZGUsIFRhcmdldEluZGV4U0ROb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0FkZHJlc3NTRE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbEFkZHJlc3NTRE5vZGU+OworCisvLy8gVGhlIFNETm9kZSBjbGFzcyB3aXRoIHRoZSBncmVhdGVzdCBhbGlnbm1lbnQgcmVxdWlyZW1lbnQuCit1c2luZyBNb3N0QWxpZ25lZFNETm9kZSA9IEdsb2JhbEFkZHJlc3NTRE5vZGU7CisKK25hbWVzcGFjZSBJU0QgeworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBub2RlIGlzIGEgbm9uLWV4dGVuZGluZyBhbmQgdW5pbmRleGVkIGxvYWQuCisgIGlubGluZSBib29sIGlzTm9ybWFsTG9hZChjb25zdCBTRE5vZGUgKk4pIHsKKyAgICBjb25zdCBMb2FkU0ROb2RlICpMZCA9IGR5bl9jYXN0PExvYWRTRE5vZGU+KE4pOworICAgIHJldHVybiBMZCAmJiBMZC0+Z2V0RXh0ZW5zaW9uVHlwZSgpID09IElTRDo6Tk9OX0VYVExPQUQgJiYKKyAgICAgIExkLT5nZXRBZGRyZXNzaW5nTW9kZSgpID09IElTRDo6VU5JTkRFWEVEOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgYSBub24tZXh0ZW5kaW5nIGxvYWQuCisgIGlubGluZSBib29sIGlzTk9OX0VYVExvYWQoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIGlzYTxMb2FkU0ROb2RlPihOKSAmJgorICAgICAgY2FzdDxMb2FkU0ROb2RlPihOKS0+Z2V0RXh0ZW5zaW9uVHlwZSgpID09IElTRDo6Tk9OX0VYVExPQUQ7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBhIEVYVExPQUQuCisgIGlubGluZSBib29sIGlzRVhUTG9hZChjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gaXNhPExvYWRTRE5vZGU+KE4pICYmCisgICAgICBjYXN0PExvYWRTRE5vZGU+KE4pLT5nZXRFeHRlbnNpb25UeXBlKCkgPT0gSVNEOjpFWFRMT0FEOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgYSBTRVhUTE9BRC4KKyAgaW5saW5lIGJvb2wgaXNTRVhUTG9hZChjb25zdCBTRE5vZGUgKk4pIHsKKyAgICByZXR1cm4gaXNhPExvYWRTRE5vZGU+KE4pICYmCisgICAgICBjYXN0PExvYWRTRE5vZGU+KE4pLT5nZXRFeHRlbnNpb25UeXBlKCkgPT0gSVNEOjpTRVhUTE9BRDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBub2RlIGlzIGEgWkVYVExPQUQuCisgIGlubGluZSBib29sIGlzWkVYVExvYWQoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIGlzYTxMb2FkU0ROb2RlPihOKSAmJgorICAgICAgY2FzdDxMb2FkU0ROb2RlPihOKS0+Z2V0RXh0ZW5zaW9uVHlwZSgpID09IElTRDo6WkVYVExPQUQ7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBhbiB1bmluZGV4ZWQgbG9hZC4KKyAgaW5saW5lIGJvb2wgaXNVTklOREVYRURMb2FkKGNvbnN0IFNETm9kZSAqTikgeworICAgIHJldHVybiBpc2E8TG9hZFNETm9kZT4oTikgJiYKKyAgICAgIGNhc3Q8TG9hZFNETm9kZT4oTiktPmdldEFkZHJlc3NpbmdNb2RlKCkgPT0gSVNEOjpVTklOREVYRUQ7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBhIG5vbi10cnVuY2F0aW5nCisgIC8vLyBhbmQgdW5pbmRleGVkIHN0b3JlLgorICBpbmxpbmUgYm9vbCBpc05vcm1hbFN0b3JlKGNvbnN0IFNETm9kZSAqTikgeworICAgIGNvbnN0IFN0b3JlU0ROb2RlICpTdCA9IGR5bl9jYXN0PFN0b3JlU0ROb2RlPihOKTsKKyAgICByZXR1cm4gU3QgJiYgIVN0LT5pc1RydW5jYXRpbmdTdG9yZSgpICYmCisgICAgICBTdC0+Z2V0QWRkcmVzc2luZ01vZGUoKSA9PSBJU0Q6OlVOSU5ERVhFRDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBub2RlIGlzIGEgbm9uLXRydW5jYXRpbmcgc3RvcmUuCisgIGlubGluZSBib29sIGlzTk9OX1RSVU5DU3RvcmUoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIGlzYTxTdG9yZVNETm9kZT4oTikgJiYgIWNhc3Q8U3RvcmVTRE5vZGU+KE4pLT5pc1RydW5jYXRpbmdTdG9yZSgpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG5vZGUgaXMgYSB0cnVuY2F0aW5nIHN0b3JlLgorICBpbmxpbmUgYm9vbCBpc1RSVU5DU3RvcmUoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIGlzYTxTdG9yZVNETm9kZT4oTikgJiYgY2FzdDxTdG9yZVNETm9kZT4oTiktPmlzVHJ1bmNhdGluZ1N0b3JlKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyBhbiB1bmluZGV4ZWQgc3RvcmUuCisgIGlubGluZSBib29sIGlzVU5JTkRFWEVEU3RvcmUoY29uc3QgU0ROb2RlICpOKSB7CisgICAgcmV0dXJuIGlzYTxTdG9yZVNETm9kZT4oTikgJiYKKyAgICAgIGNhc3Q8U3RvcmVTRE5vZGU+KE4pLT5nZXRBZGRyZXNzaW5nTW9kZSgpID09IElTRDo6VU5JTkRFWEVEOworICB9CisKKyAgLy8vIEF0dGVtcHQgdG8gbWF0Y2ggYSB1bmFyeSBwcmVkaWNhdGUgYWdhaW5zdCBhIHNjYWxhci9zcGxhdCBjb25zdGFudCBvcgorICAvLy8gZXZlcnkgZWxlbWVudCBvZiBhIGNvbnN0YW50IEJVSUxEX1ZFQ1RPUi4KKyAgYm9vbCBtYXRjaFVuYXJ5UHJlZGljYXRlKFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woQ29uc3RhbnRTRE5vZGUgKik+IE1hdGNoKTsKKworICAvLy8gQXR0ZW1wdCB0byBtYXRjaCBhIGJpbmFyeSBwcmVkaWNhdGUgYWdhaW5zdCBhIHBhaXIgb2Ygc2NhbGFyL3NwbGF0CisgIC8vLyBjb25zdGFudHMgb3IgZXZlcnkgZWxlbWVudCBvZiBhIHBhaXIgb2YgY29uc3RhbnQgQlVJTERfVkVDVE9Scy4KKyAgYm9vbCBtYXRjaEJpbmFyeVByZWRpY2F0ZSgKKyAgICAgIFNEVmFsdWUgTEhTLCBTRFZhbHVlIFJIUywKKyAgICAgIHN0ZDo6ZnVuY3Rpb248Ym9vbChDb25zdGFudFNETm9kZSAqLCBDb25zdGFudFNETm9kZSAqKT4gTWF0Y2gpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgSVNECisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fU0VMRUNUSU9OREFHTk9ERVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR1RhcmdldEluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdUYXJnZXRJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVjMWRmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdUYXJnZXRJbmZvLmgKQEAgLTAsMCArMSwxNjAgQEAKKy8vPT0tIGxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUdUYXJnZXRJbmZvLmggLSBTZWxlY3Rpb25EQUcgSW5mbyAtLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBTZWxlY3Rpb25EQUdUYXJnZXRJbmZvIGNsYXNzLCB3aGljaCB0YXJnZXRzIGNhbgorLy8gc3ViY2xhc3MgdG8gcGFyYW1ldGVyaXplIHRoZSBTZWxlY3Rpb25EQUcgbG93ZXJpbmcgYW5kIGluc3RydWN0aW9uCisvLyBzZWxlY3Rpb24gcHJvY2Vzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9TRUxFQ1RJT05EQUdUQVJHRVRJTkZPX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1NFTEVDVElPTkRBR1RBUkdFVElORk9fSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVNZW1PcGVyYW5kLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NlbGVjdGlvbkRBR05vZGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvZGVHZW4uaCIKKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFNlbGVjdGlvbkRBRzsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBUYXJnZXRzIGNhbiBzdWJjbGFzcyB0aGlzIHRvIHBhcmFtZXRlcml6ZSB0aGUKKy8vLyBTZWxlY3Rpb25EQUcgbG93ZXJpbmcgYW5kIGluc3RydWN0aW9uIHNlbGVjdGlvbiBwcm9jZXNzLgorLy8vCitjbGFzcyBTZWxlY3Rpb25EQUdUYXJnZXRJbmZvIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgU2VsZWN0aW9uREFHVGFyZ2V0SW5mbygpID0gZGVmYXVsdDsKKyAgU2VsZWN0aW9uREFHVGFyZ2V0SW5mbyhjb25zdCBTZWxlY3Rpb25EQUdUYXJnZXRJbmZvICYpID0gZGVsZXRlOworICBTZWxlY3Rpb25EQUdUYXJnZXRJbmZvICZvcGVyYXRvcj0oY29uc3QgU2VsZWN0aW9uREFHVGFyZ2V0SW5mbyAmKSA9IGRlbGV0ZTsKKyAgdmlydHVhbCB+U2VsZWN0aW9uREFHVGFyZ2V0SW5mbygpOworCisgIC8vLyBFbWl0IHRhcmdldC1zcGVjaWZpYyBjb2RlIHRoYXQgcGVyZm9ybXMgYSBtZW1jcHkuCisgIC8vLyBUaGlzIGNhbiBiZSB1c2VkIGJ5IHRhcmdldHMgdG8gcHJvdmlkZSBjb2RlIHNlcXVlbmNlcyBmb3IgY2FzZXMKKyAgLy8vIHRoYXQgZG9uJ3QgZml0IHRoZSB0YXJnZXQncyBwYXJhbWV0ZXJzIGZvciBzaW1wbGUgbG9hZHMvc3RvcmVzIGFuZCBjYW4gYmUKKyAgLy8vIG1vcmUgZWZmaWNpZW50IHRoYW4gdXNpbmcgYSBsaWJyYXJ5IGNhbGwuIFRoaXMgZnVuY3Rpb24gY2FuIHJldHVybiBhIG51bGwKKyAgLy8vIFNEVmFsdWUgaWYgdGhlIHRhcmdldCBkZWNsaW5lcyB0byB1c2UgY3VzdG9tIGNvZGUgYW5kIGEgZGlmZmVyZW50CisgIC8vLyBsb3dlcmluZyBzdHJhdGVneSBzaG91bGQgYmUgdXNlZC4KKyAgLy8vCisgIC8vLyBJZiBBbHdheXNJbmxpbmUgaXMgdHJ1ZSwgdGhlIHNpemUgaXMgY29uc3RhbnQgYW5kIHRoZSB0YXJnZXQgc2hvdWxkIG5vdAorICAvLy8gZW1pdCBhbnkgY2FsbHMgYW5kIGlzIHN0cm9uZ2x5IGVuY291cmFnZWQgdG8gYXR0ZW1wdCB0byBlbWl0IGlubGluZSBjb2RlCisgIC8vLyBldmVuIGlmIGl0IGlzIGJleW9uZCB0aGUgdXN1YWwgdGhyZXNob2xkIGJlY2F1c2UgdGhpcyBpbnRyaW5zaWMgaXMgYmVpbmcKKyAgLy8vIGV4cGFuZGVkIGluIGEgcGxhY2Ugd2hlcmUgY2FsbHMgYXJlIG5vdCBmZWFzaWJsZSAoZS5nLiB3aXRoaW4gdGhlIHByb2xvZ3VlCisgIC8vLyBmb3IgYW5vdGhlciBjYWxsKS4gSWYgdGhlIHRhcmdldCBjaG9vc2VzIHRvIGRlY2xpbmUgYW4gQWx3YXlzSW5saW5lCisgIC8vLyByZXF1ZXN0IGhlcmUsIGxlZ2FsaXplIHdpbGwgcmVzb3J0IHRvIHVzaW5nIHNpbXBsZSBsb2FkcyBhbmQgc3RvcmVzLgorICB2aXJ0dWFsIFNEVmFsdWUgRW1pdFRhcmdldENvZGVGb3JNZW1jcHkoU2VsZWN0aW9uREFHICZEQUcsIGNvbnN0IFNETG9jICZkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgT3AxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcDIsIFNEVmFsdWUgT3AzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ24sIGJvb2wgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWx3YXlzSW5saW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZVBvaW50ZXJJbmZvIERzdFB0ckluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lUG9pbnRlckluZm8gU3JjUHRySW5mbykgY29uc3QgeworICAgIHJldHVybiBTRFZhbHVlKCk7CisgIH0KKworICAvLy8gRW1pdCB0YXJnZXQtc3BlY2lmaWMgY29kZSB0aGF0IHBlcmZvcm1zIGEgbWVtbW92ZS4KKyAgLy8vIFRoaXMgY2FuIGJlIHVzZWQgYnkgdGFyZ2V0cyB0byBwcm92aWRlIGNvZGUgc2VxdWVuY2VzIGZvciBjYXNlcworICAvLy8gdGhhdCBkb24ndCBmaXQgdGhlIHRhcmdldCdzIHBhcmFtZXRlcnMgZm9yIHNpbXBsZSBsb2Fkcy9zdG9yZXMgYW5kIGNhbiBiZQorICAvLy8gbW9yZSBlZmZpY2llbnQgdGhhbiB1c2luZyBhIGxpYnJhcnkgY2FsbC4gVGhpcyBmdW5jdGlvbiBjYW4gcmV0dXJuIGEgbnVsbAorICAvLy8gU0RWYWx1ZSBpZiB0aGUgdGFyZ2V0IGRlY2xpbmVzIHRvIHVzZSBjdXN0b20gY29kZSBhbmQgYSBkaWZmZXJlbnQKKyAgLy8vIGxvd2VyaW5nIHN0cmF0ZWd5IHNob3VsZCBiZSB1c2VkLgorICB2aXJ0dWFsIFNEVmFsdWUgRW1pdFRhcmdldENvZGVGb3JNZW1tb3ZlKAorICAgICAgU2VsZWN0aW9uREFHICZEQUcsIGNvbnN0IFNETG9jICZkbCwgU0RWYWx1ZSBDaGFpbiwgU0RWYWx1ZSBPcDEsCisgICAgICBTRFZhbHVlIE9wMiwgU0RWYWx1ZSBPcDMsIHVuc2lnbmVkIEFsaWduLCBib29sIGlzVm9sYXRpbGUsCisgICAgICBNYWNoaW5lUG9pbnRlckluZm8gRHN0UHRySW5mbywgTWFjaGluZVBvaW50ZXJJbmZvIFNyY1B0ckluZm8pIGNvbnN0IHsKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworICB9CisKKyAgLy8vIEVtaXQgdGFyZ2V0LXNwZWNpZmljIGNvZGUgdGhhdCBwZXJmb3JtcyBhIG1lbXNldC4KKyAgLy8vIFRoaXMgY2FuIGJlIHVzZWQgYnkgdGFyZ2V0cyB0byBwcm92aWRlIGNvZGUgc2VxdWVuY2VzIGZvciBjYXNlcworICAvLy8gdGhhdCBkb24ndCBmaXQgdGhlIHRhcmdldCdzIHBhcmFtZXRlcnMgZm9yIHNpbXBsZSBzdG9yZXMgYW5kIGNhbiBiZSBtb3JlCisgIC8vLyBlZmZpY2llbnQgdGhhbiB1c2luZyBhIGxpYnJhcnkgY2FsbC4gVGhpcyBmdW5jdGlvbiBjYW4gcmV0dXJuIGEgbnVsbAorICAvLy8gU0RWYWx1ZSBpZiB0aGUgdGFyZ2V0IGRlY2xpbmVzIHRvIHVzZSBjdXN0b20gY29kZSBhbmQgYSBkaWZmZXJlbnQKKyAgLy8vIGxvd2VyaW5nIHN0cmF0ZWd5IHNob3VsZCBiZSB1c2VkLgorICB2aXJ0dWFsIFNEVmFsdWUgRW1pdFRhcmdldENvZGVGb3JNZW1zZXQoU2VsZWN0aW9uREFHICZEQUcsIGNvbnN0IFNETG9jICZkbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgQ2hhaW4sIFNEVmFsdWUgT3AxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBPcDIsIFNEVmFsdWUgT3AzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWxpZ24sIGJvb2wgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVQb2ludGVySW5mbyBEc3RQdHJJbmZvKSBjb25zdCB7CisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgfQorCisgIC8vLyBFbWl0IHRhcmdldC1zcGVjaWZpYyBjb2RlIHRoYXQgcGVyZm9ybXMgYSBtZW1jbXAsIGluIGNhc2VzIHdoZXJlIHRoYXQgaXMKKyAgLy8vIGZhc3RlciB0aGFuIGEgbGliY2FsbC4gVGhlIGZpcnN0IHJldHVybmVkIFNEVmFsdWUgaXMgdGhlIHJlc3VsdCBvZiB0aGUKKyAgLy8vIG1lbWNtcCBhbmQgdGhlIHNlY29uZCBpcyB0aGUgY2hhaW4uIEJvdGggU0RWYWx1ZXMgY2FuIGJlIG51bGwgaWYgYSBub3JtYWwKKyAgLy8vIGxpYmNhbGwgc2hvdWxkIGJlIHVzZWQuCisgIHZpcnR1YWwgc3RkOjpwYWlyPFNEVmFsdWUsIFNEVmFsdWU+CisgIEVtaXRUYXJnZXRDb2RlRm9yTWVtY21wKFNlbGVjdGlvbkRBRyAmREFHLCBjb25zdCBTRExvYyAmZGwsIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgT3AxLCBTRFZhbHVlIE9wMiwgU0RWYWx1ZSBPcDMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVQb2ludGVySW5mbyBPcDFQdHJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lUG9pbnRlckluZm8gT3AyUHRySW5mbykgY29uc3QgeworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihTRFZhbHVlKCksIFNEVmFsdWUoKSk7CisgIH0KKworICAvLy8gRW1pdCB0YXJnZXQtc3BlY2lmaWMgY29kZSB0aGF0IHBlcmZvcm1zIGEgbWVtY2hyLCBpbiBjYXNlcyB3aGVyZSB0aGF0IGlzCisgIC8vLyBmYXN0ZXIgdGhhbiBhIGxpYmNhbGwuIFRoZSBmaXJzdCByZXR1cm5lZCBTRFZhbHVlIGlzIHRoZSByZXN1bHQgb2YgdGhlCisgIC8vLyBtZW1jaHIgYW5kIHRoZSBzZWNvbmQgaXMgdGhlIGNoYWluLiBCb3RoIFNEVmFsdWVzIGNhbiBiZSBudWxsIGlmIGEgbm9ybWFsCisgIC8vLyBsaWJjYWxsIHNob3VsZCBiZSB1c2VkLgorICB2aXJ0dWFsIHN0ZDo6cGFpcjxTRFZhbHVlLCBTRFZhbHVlPgorICBFbWl0VGFyZ2V0Q29kZUZvck1lbWNocihTZWxlY3Rpb25EQUcgJkRBRywgY29uc3QgU0RMb2MgJmRsLCBTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFNyYywgU0RWYWx1ZSBDaGFyLCBTRFZhbHVlIExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZVBvaW50ZXJJbmZvIFNyY1B0ckluZm8pIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoU0RWYWx1ZSgpLCBTRFZhbHVlKCkpOworICB9CisKKyAgLy8vIEVtaXQgdGFyZ2V0LXNwZWNpZmljIGNvZGUgdGhhdCBwZXJmb3JtcyBhIHN0cmNweSBvciBzdHBjcHksIGluIGNhc2VzCisgIC8vLyB3aGVyZSB0aGF0IGlzIGZhc3RlciB0aGFuIGEgbGliY2FsbC4KKyAgLy8vIFRoZSBmaXJzdCByZXR1cm5lZCBTRFZhbHVlIGlzIHRoZSByZXN1bHQgb2YgdGhlIGNvcHkgKHRoZSBzdGFydAorICAvLy8gb2YgdGhlIGRlc3RpbmF0aW9uIHN0cmluZyBmb3Igc3RyY3B5LCBhIHBvaW50ZXIgdG8gdGhlIG51bGwgdGVybWluYXRvcgorICAvLy8gZm9yIHN0cGNweSkgYW5kIHRoZSBzZWNvbmQgaXMgdGhlIGNoYWluLiAgQm90aCBTRFZhbHVlcyBjYW4gYmUgbnVsbAorICAvLy8gaWYgYSBub3JtYWwgbGliY2FsbCBzaG91bGQgYmUgdXNlZC4KKyAgdmlydHVhbCBzdGQ6OnBhaXI8U0RWYWx1ZSwgU0RWYWx1ZT4KKyAgRW1pdFRhcmdldENvZGVGb3JTdHJjcHkoU2VsZWN0aW9uREFHICZEQUcsIGNvbnN0IFNETG9jICZETCwgU0RWYWx1ZSBDaGFpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBEZXN0LCBTRFZhbHVlIFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZVBvaW50ZXJJbmZvIERlc3RQdHJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lUG9pbnRlckluZm8gU3JjUHRySW5mbywgYm9vbCBpc1N0cGNweSkgY29uc3QgeworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihTRFZhbHVlKCksIFNEVmFsdWUoKSk7CisgIH0KKworICAvLy8gRW1pdCB0YXJnZXQtc3BlY2lmaWMgY29kZSB0aGF0IHBlcmZvcm1zIGEgc3RyY21wLCBpbiBjYXNlcyB3aGVyZSB0aGF0IGlzCisgIC8vLyBmYXN0ZXIgdGhhbiBhIGxpYmNhbGwuCisgIC8vLyBUaGUgZmlyc3QgcmV0dXJuZWQgU0RWYWx1ZSBpcyB0aGUgcmVzdWx0IG9mIHRoZSBzdHJjbXAgYW5kIHRoZSBzZWNvbmQgaXMKKyAgLy8vIHRoZSBjaGFpbi4gQm90aCBTRFZhbHVlcyBjYW4gYmUgbnVsbCBpZiBhIG5vcm1hbCBsaWJjYWxsIHNob3VsZCBiZSB1c2VkLgorICB2aXJ0dWFsIHN0ZDo6cGFpcjxTRFZhbHVlLCBTRFZhbHVlPgorICBFbWl0VGFyZ2V0Q29kZUZvclN0cmNtcChTZWxlY3Rpb25EQUcgJkRBRywgY29uc3QgU0RMb2MgJmRsLCBTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wMSwgU0RWYWx1ZSBPcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVQb2ludGVySW5mbyBPcDFQdHJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lUG9pbnRlckluZm8gT3AyUHRySW5mbykgY29uc3QgeworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihTRFZhbHVlKCksIFNEVmFsdWUoKSk7CisgIH0KKworICB2aXJ0dWFsIHN0ZDo6cGFpcjxTRFZhbHVlLCBTRFZhbHVlPgorICBFbWl0VGFyZ2V0Q29kZUZvclN0cmxlbihTZWxlY3Rpb25EQUcgJkRBRywgY29uc3QgU0RMb2MgJkRMLCBTRFZhbHVlIENoYWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFNyYywgTWFjaGluZVBvaW50ZXJJbmZvIFNyY1B0ckluZm8pIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoU0RWYWx1ZSgpLCBTRFZhbHVlKCkpOworICB9CisKKyAgdmlydHVhbCBzdGQ6OnBhaXI8U0RWYWx1ZSwgU0RWYWx1ZT4KKyAgRW1pdFRhcmdldENvZGVGb3JTdHJubGVuKFNlbGVjdGlvbkRBRyAmREFHLCBjb25zdCBTRExvYyAmREwsIFNEVmFsdWUgQ2hhaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFNyYywgU0RWYWx1ZSBNYXhMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lUG9pbnRlckluZm8gU3JjUHRySW5mbykgY29uc3QgeworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihTRFZhbHVlKCksIFNEVmFsdWUoKSk7CisgIH0KKworICAvLyBSZXR1cm4gdHJ1ZSB3aGVuIHRoZSBkZWNpc2lvbiB0byBnZW5lcmF0ZSBGTUEncyAob3IgRk1TLCBGTUxBIGV0YykgcmF0aGVyCisgIC8vIHRoYW4gRk1VTCBhbmQgQUREIGlzIGRlbGVnYXRlZCB0byB0aGUgbWFjaGluZSBjb21iaW5lci4KKyAgdmlydHVhbCBib29sIGdlbmVyYXRlRk1Bc0luTWFjaGluZUNvbWJpbmVyKENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1NFTEVDVElPTkRBR1RBUkdFVElORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1Nsb3RJbmRleGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU2xvdEluZGV4ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTkxZTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1Nsb3RJbmRleGVzLmgKQEAgLTAsMCArMSw3MTQgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vU2xvdEluZGV4ZXMuaCAtIFNsb3QgaW5kZXhlcyByZXByZXNlbnRhdGlvbiAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgU2xvdEluZGV4IGFuZCByZWxhdGVkIGNsYXNzZXMuIFRoZSBwdXJwb3NlIG9mIFNsb3RJbmRleAorLy8gaXMgdG8gZGVzY3JpYmUgYSBwb3NpdGlvbiBhdCB3aGljaCBhIHJlZ2lzdGVyIGNhbiBiZWNvbWUgbGl2ZSwgb3IgY2Vhc2UgdG8KKy8vIGJlIGxpdmUuCisvLworLy8gU2xvdEluZGV4IGlzIG1vc3RseSBhIHByb3h5IGZvciBlbnRyaWVzIG9mIHRoZSBTbG90SW5kZXhMaXN0LCBhIGNsYXNzIHdoaWNoCisvLyBpcyBoZWxkIGlzIExpdmVJbnRlcnZhbHMgYW5kIHByb3ZpZGVzIHRoZSByZWFsIG51bWJlcmluZy4gVGhpcyBhbGxvd3MKKy8vIExpdmVJbnRlcnZhbHMgdG8gcGVyZm9ybSBsYXJnZWx5IHRyYW5zcGFyZW50IHJlbnVtYmVyaW5nLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fU0xPVElOREVYRVNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fU0xPVElOREVYRVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9JbnRlcnZhbE1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyQnVuZGxlLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKKyAgLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBlbnRyeSBpbiB0aGUgc2xvdCBpbmRleCBsaXN0IGhlbGQgaW4gdGhlCisgIC8vLyBTbG90SW5kZXhlcyBwYXNzLiBJdCBzaG91bGQgbm90IGJlIHVzZWQgZGlyZWN0bHkuIFNlZSB0aGUKKyAgLy8vIFNsb3RJbmRleCAmIFNsb3RJbmRleGVzIGNsYXNzZXMgZm9yIHRoZSBwdWJsaWMgaW50ZXJmYWNlIHRvIHRoaXMKKyAgLy8vIGluZm9ybWF0aW9uLgorICBjbGFzcyBJbmRleExpc3RFbnRyeSA6IHB1YmxpYyBpbGlzdF9ub2RlPEluZGV4TGlzdEVudHJ5PiB7CisgICAgTWFjaGluZUluc3RyICptaTsKKyAgICB1bnNpZ25lZCBpbmRleDsKKworICBwdWJsaWM6CisgICAgSW5kZXhMaXN0RW50cnkoTWFjaGluZUluc3RyICptaSwgdW5zaWduZWQgaW5kZXgpIDogbWkobWkpLCBpbmRleChpbmRleCkge30KKworICAgIE1hY2hpbmVJbnN0ciogZ2V0SW5zdHIoKSBjb25zdCB7IHJldHVybiBtaTsgfQorICAgIHZvaWQgc2V0SW5zdHIoTWFjaGluZUluc3RyICptaSkgeworICAgICAgdGhpcy0+bWkgPSBtaTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBnZXRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIGluZGV4OyB9CisgICAgdm9pZCBzZXRJbmRleCh1bnNpZ25lZCBpbmRleCkgeworICAgICAgdGhpcy0+aW5kZXggPSBpbmRleDsKKyAgICB9CisKKyNpZmRlZiBFWFBFTlNJVkVfQ0hFQ0tTCisgICAgLy8gV2hlbiBFWFBFTlNJVkVfQ0hFQ0tTIGlzIGRlZmluZWQsICJlcmFzZWQiIGluZGV4IGxpc3QgZW50cmllcyB3aWxsCisgICAgLy8gYWN0dWFsbHkgYmUgbW92ZWQgdG8gYSAiZ3JhdmV5YXJkIiBsaXN0LCBhbmQgaGF2ZSB0aGVpciBwb2ludGVycworICAgIC8vIHBvaXNvbmVkLCBzbyB0aGF0IGRhbmdsaW5nIFNsb3RJbmRleCBhY2Nlc3MgY2FuIGJlIHJlbGlhYmx5IGRldGVjdGVkLgorICAgIHZvaWQgc2V0UG9pc29uKCkgeworICAgICAgaW50cHRyX3QgdG1wID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4obWkpOworICAgICAgYXNzZXJ0KCgodG1wICYgMHgxKSA9PSAweDApICYmICJQb2ludGVyIGFscmVhZHkgcG9pc29uZWQ/Iik7CisgICAgICB0bXAgfD0gMHgxOworICAgICAgbWkgPSByZWludGVycHJldF9jYXN0PE1hY2hpbmVJbnN0cio+KHRtcCk7CisgICAgfQorCisgICAgYm9vbCBpc1BvaXNvbmVkKCkgY29uc3QgeyByZXR1cm4gKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KG1pKSAmIDB4MSkgPT0gMHgxOyB9CisjZW5kaWYgLy8gRVhQRU5TSVZFX0NIRUNLUworICB9OworCisgIHRlbXBsYXRlIDw+CisgIHN0cnVjdCBpbGlzdF9hbGxvY190cmFpdHM8SW5kZXhMaXN0RW50cnk+CisgICAgICA6IHB1YmxpYyBpbGlzdF9ub2FsbG9jX3RyYWl0czxJbmRleExpc3RFbnRyeT4ge307CisKKyAgLy8vIFNsb3RJbmRleCAtIEFuIG9wYXF1ZSB3cmFwcGVyIGFyb3VuZCBtYWNoaW5lIGluZGV4ZXMuCisgIGNsYXNzIFNsb3RJbmRleCB7CisgICAgZnJpZW5kIGNsYXNzIFNsb3RJbmRleGVzOworCisgICAgZW51bSBTbG90IHsKKyAgICAgIC8vLyBCYXNpYyBibG9jayBib3VuZGFyeS4gIFVzZWQgZm9yIGxpdmUgcmFuZ2VzIGVudGVyaW5nIGFuZCBsZWF2aW5nIGEKKyAgICAgIC8vLyBibG9jayB3aXRob3V0IGJlaW5nIGxpdmUgaW4gdGhlIGxheW91dCBuZWlnaGJvci4gIEFsc28gdXNlZCBhcyB0aGUKKyAgICAgIC8vLyBkZWYgc2xvdCBvZiBQSEktZGVmcy4KKyAgICAgIFNsb3RfQmxvY2ssCisKKyAgICAgIC8vLyBFYXJseS1jbG9iYmVyIHJlZ2lzdGVyIHVzZS9kZWYgc2xvdC4gIEEgbGl2ZSByYW5nZSBkZWZpbmVkIGF0CisgICAgICAvLy8gU2xvdF9FYXJseUNsb2JiZXIgaW50ZXJmZXJlcyB3aXRoIG5vcm1hbCBsaXZlIHJhbmdlcyBraWxsZWQgYXQKKyAgICAgIC8vLyBTbG90X1JlZ2lzdGVyLiAgQWxzbyB1c2VkIGFzIHRoZSBraWxsIHNsb3QgZm9yIGxpdmUgcmFuZ2VzIHRpZWQgdG8gYW4KKyAgICAgIC8vLyBlYXJseS1jbG9iYmVyIGRlZi4KKyAgICAgIFNsb3RfRWFybHlDbG9iYmVyLAorCisgICAgICAvLy8gTm9ybWFsIHJlZ2lzdGVyIHVzZS9kZWYgc2xvdC4gIE5vcm1hbCBpbnN0cnVjdGlvbnMga2lsbCBhbmQgZGVmaW5lCisgICAgICAvLy8gcmVnaXN0ZXIgbGl2ZSByYW5nZXMgYXQgdGhpcyBzbG90LgorICAgICAgU2xvdF9SZWdpc3RlciwKKworICAgICAgLy8vIERlYWQgZGVmIGtpbGwgcG9pbnQuICBLaWxsIHNsb3QgZm9yIGEgbGl2ZSByYW5nZSB0aGF0IGlzIGRlZmluZWQgYnkKKyAgICAgIC8vLyB0aGUgc2FtZSBpbnN0cnVjdGlvbiAoU2xvdF9SZWdpc3RlciBvciBTbG90X0Vhcmx5Q2xvYmJlciksIGJ1dCBpc24ndAorICAgICAgLy8vIHVzZWQgYW55d2hlcmUuCisgICAgICBTbG90X0RlYWQsCisKKyAgICAgIFNsb3RfQ291bnQKKyAgICB9OworCisgICAgUG9pbnRlckludFBhaXI8SW5kZXhMaXN0RW50cnkqLCAyLCB1bnNpZ25lZD4gbGllOworCisgICAgU2xvdEluZGV4KEluZGV4TGlzdEVudHJ5ICplbnRyeSwgdW5zaWduZWQgc2xvdCkKKyAgICAgIDogbGllKGVudHJ5LCBzbG90KSB7fQorCisgICAgSW5kZXhMaXN0RW50cnkqIGxpc3RFbnRyeSgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIkF0dGVtcHQgdG8gY29tcGFyZSByZXNlcnZlZCBpbmRleC4iKTsKKyNpZmRlZiBFWFBFTlNJVkVfQ0hFQ0tTCisgICAgICBhc3NlcnQoIWxpZS5nZXRQb2ludGVyKCktPmlzUG9pc29uZWQoKSAmJgorICAgICAgICAgICAgICJBdHRlbXB0IHRvIGFjY2VzcyBkZWxldGVkIGxpc3QtZW50cnkuIik7CisjZW5kaWYgLy8gRVhQRU5TSVZFX0NIRUNLUworICAgICAgcmV0dXJuIGxpZS5nZXRQb2ludGVyKCk7CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0SW5kZXgoKSBjb25zdCB7CisgICAgICByZXR1cm4gbGlzdEVudHJ5KCktPmdldEluZGV4KCkgfCBnZXRTbG90KCk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIHNsb3QgZm9yIHRoaXMgU2xvdEluZGV4LgorICAgIFNsb3QgZ2V0U2xvdCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxTbG90PihsaWUuZ2V0SW50KCkpOworICAgIH0KKworICBwdWJsaWM6CisgICAgZW51bSB7CisgICAgICAvLy8gVGhlIGRlZmF1bHQgZGlzdGFuY2UgYmV0d2VlbiBpbnN0cnVjdGlvbnMgYXMgcmV0dXJuZWQgYnkgZGlzdGFuY2UoKS4KKyAgICAgIC8vLyBUaGlzIG1heSB2YXJ5IGFzIGluc3RydWN0aW9ucyBhcmUgaW5zZXJ0ZWQgYW5kIHJlbW92ZWQuCisgICAgICBJbnN0ckRpc3QgPSA0ICogU2xvdF9Db3VudAorICAgIH07CisKKyAgICAvLy8gQ29uc3RydWN0IGFuIGludmFsaWQgaW5kZXguCisgICAgU2xvdEluZGV4KCkgPSBkZWZhdWx0OworCisgICAgLy8gQ29uc3RydWN0IGEgbmV3IHNsb3QgaW5kZXggZnJvbSB0aGUgZ2l2ZW4gb25lLCBhbmQgc2V0IHRoZSBzbG90LgorICAgIFNsb3RJbmRleChjb25zdCBTbG90SW5kZXggJmxpLCBTbG90IHMpIDogbGllKGxpLmxpc3RFbnRyeSgpLCB1bnNpZ25lZChzKSkgeworICAgICAgYXNzZXJ0KGxpZS5nZXRQb2ludGVyKCkgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAgICJBdHRlbXB0IHRvIGNvbnN0cnVjdCBpbmRleCB3aXRoIDAgcG9pbnRlci4iKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSB2YWxpZCBpbmRleC4gSW52YWxpZCBpbmRpY2VzIGRvCisgICAgLy8vIG5vdCBwb2ludCBpbnRvIGFuIGluZGV4IHRhYmxlLCBhbmQgY2Fubm90IGJlIGNvbXBhcmVkLgorICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBsaWUuZ2V0UG9pbnRlcigpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBmb3IgYSB2YWxpZCBpbmRleC4KKyAgICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gaXNWYWxpZCgpOyB9CisKKyAgICAvLy8gUHJpbnQgdGhpcyBpbmRleCB0byB0aGUgZ2l2ZW4gcmF3X29zdHJlYW0uCisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmb3MpIGNvbnN0OworCisgICAgLy8vIER1bXAgdGhpcyBpbmRleCB0byBzdGRlcnIuCisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgICAvLy8gQ29tcGFyZSB0d28gU2xvdEluZGV4IG9iamVjdHMgZm9yIGVxdWFsaXR5LgorICAgIGJvb2wgb3BlcmF0b3I9PShTbG90SW5kZXggb3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBsaWUgPT0gb3RoZXIubGllOworICAgIH0KKyAgICAvLy8gQ29tcGFyZSB0d28gU2xvdEluZGV4IG9iamVjdHMgZm9yIGluZXF1YWxpdHkuCisgICAgYm9vbCBvcGVyYXRvciE9KFNsb3RJbmRleCBvdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIGxpZSAhPSBvdGhlci5saWU7CisgICAgfQorCisgICAgLy8vIENvbXBhcmUgdHdvIFNsb3RJbmRleCBvYmplY3RzLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmlyc3QgaW5kZXgKKyAgICAvLy8gaXMgc3RyaWN0bHkgbG93ZXIgdGhhbiB0aGUgc2Vjb25kLgorICAgIGJvb2wgb3BlcmF0b3I8KFNsb3RJbmRleCBvdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIGdldEluZGV4KCkgPCBvdGhlci5nZXRJbmRleCgpOworICAgIH0KKyAgICAvLy8gQ29tcGFyZSB0d28gU2xvdEluZGV4IG9iamVjdHMuIFJldHVybiB0cnVlIGlmIHRoZSBmaXJzdCBpbmRleAorICAgIC8vLyBpcyBsb3dlciB0aGFuLCBvciBlcXVhbCB0bywgdGhlIHNlY29uZC4KKyAgICBib29sIG9wZXJhdG9yPD0oU2xvdEluZGV4IG90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0SW5kZXgoKSA8PSBvdGhlci5nZXRJbmRleCgpOworICAgIH0KKworICAgIC8vLyBDb21wYXJlIHR3byBTbG90SW5kZXggb2JqZWN0cy4gUmV0dXJuIHRydWUgaWYgdGhlIGZpcnN0IGluZGV4CisgICAgLy8vIGlzIGdyZWF0ZXIgdGhhbiB0aGUgc2Vjb25kLgorICAgIGJvb2wgb3BlcmF0b3I+KFNsb3RJbmRleCBvdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIGdldEluZGV4KCkgPiBvdGhlci5nZXRJbmRleCgpOworICAgIH0KKworICAgIC8vLyBDb21wYXJlIHR3byBTbG90SW5kZXggb2JqZWN0cy4gUmV0dXJuIHRydWUgaWYgdGhlIGZpcnN0IGluZGV4CisgICAgLy8vIGlzIGdyZWF0ZXIgdGhhbiwgb3IgZXF1YWwgdG8sIHRoZSBzZWNvbmQuCisgICAgYm9vbCBvcGVyYXRvcj49KFNsb3RJbmRleCBvdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIGdldEluZGV4KCkgPj0gb3RoZXIuZ2V0SW5kZXgoKTsKKyAgICB9CisKKyAgICAvLy8gaXNTYW1lSW5zdHIgLSBSZXR1cm4gdHJ1ZSBpZiBBIGFuZCBCIHJlZmVyIHRvIHRoZSBzYW1lIGluc3RydWN0aW9uLgorICAgIHN0YXRpYyBib29sIGlzU2FtZUluc3RyKFNsb3RJbmRleCBBLCBTbG90SW5kZXggQikgeworICAgICAgcmV0dXJuIEEubGllLmdldFBvaW50ZXIoKSA9PSBCLmxpZS5nZXRQb2ludGVyKCk7CisgICAgfQorCisgICAgLy8vIGlzRWFybGllckluc3RyIC0gUmV0dXJuIHRydWUgaWYgQSByZWZlcnMgdG8gYW4gaW5zdHJ1Y3Rpb24gZWFybGllciB0aGFuCisgICAgLy8vIEIuIFRoaXMgaXMgZXF1aXZhbGVudCB0byBBIDwgQiAmJiAhaXNTYW1lSW5zdHIoQSwgQikuCisgICAgc3RhdGljIGJvb2wgaXNFYXJsaWVySW5zdHIoU2xvdEluZGV4IEEsIFNsb3RJbmRleCBCKSB7CisgICAgICByZXR1cm4gQS5saXN0RW50cnkoKS0+Z2V0SW5kZXgoKSA8IEIubGlzdEVudHJ5KCktPmdldEluZGV4KCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIEEgcmVmZXJzIHRvIHRoZSBzYW1lIGluc3RydWN0aW9uIGFzIEIgb3IgYW4gZWFybGllciBvbmUuCisgICAgLy8vIFRoaXMgaXMgZXF1aXZhbGVudCB0byAhaXNFYXJsaWVySW5zdHIoQiwgQSkuCisgICAgc3RhdGljIGJvb2wgaXNFYXJsaWVyRXF1YWxJbnN0cihTbG90SW5kZXggQSwgU2xvdEluZGV4IEIpIHsKKyAgICAgIHJldHVybiAhaXNFYXJsaWVySW5zdHIoQiwgQSk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0aGUgZGlzdGFuY2UgZnJvbSB0aGlzIGluZGV4IHRvIHRoZSBnaXZlbiBvbmUuCisgICAgaW50IGRpc3RhbmNlKFNsb3RJbmRleCBvdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIG90aGVyLmdldEluZGV4KCkgLSBnZXRJbmRleCgpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdGhlIHNjYWxlZCBkaXN0YW5jZSBmcm9tIHRoaXMgaW5kZXggdG8gdGhlIGdpdmVuIG9uZSwgd2hlcmUgYWxsCisgICAgLy8vIHNsb3RzIG9uIHRoZSBzYW1lIGluc3RydWN0aW9uIGhhdmUgemVybyBkaXN0YW5jZS4KKyAgICBpbnQgZ2V0SW5zdHJEaXN0YW5jZShTbG90SW5kZXggb3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiAob3RoZXIubGlzdEVudHJ5KCktPmdldEluZGV4KCkgLSBsaXN0RW50cnkoKS0+Z2V0SW5kZXgoKSkKKyAgICAgICAgLyBTbG90X0NvdW50OworICAgIH0KKworICAgIC8vLyBpc0Jsb2NrIC0gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBibG9jayBib3VuZGFyeSBzbG90LgorICAgIGJvb2wgaXNCbG9jaygpIGNvbnN0IHsgcmV0dXJuIGdldFNsb3QoKSA9PSBTbG90X0Jsb2NrOyB9CisKKyAgICAvLy8gaXNFYXJseUNsb2JiZXIgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhbiBlYXJseS1jbG9iYmVyIHNsb3QuCisgICAgYm9vbCBpc0Vhcmx5Q2xvYmJlcigpIGNvbnN0IHsgcmV0dXJuIGdldFNsb3QoKSA9PSBTbG90X0Vhcmx5Q2xvYmJlcjsgfQorCisgICAgLy8vIGlzUmVnaXN0ZXIgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIG5vcm1hbCByZWdpc3RlciB1c2UvZGVmIHNsb3QuCisgICAgLy8vIE5vdGUgdGhhdCBlYXJseS1jbG9iYmVyIHNsb3RzIG1heSBhbHNvIGJlIHVzZWQgZm9yIHVzZXMgYW5kIGRlZnMuCisgICAgYm9vbCBpc1JlZ2lzdGVyKCkgY29uc3QgeyByZXR1cm4gZ2V0U2xvdCgpID09IFNsb3RfUmVnaXN0ZXI7IH0KKworICAgIC8vLyBpc0RlYWQgLSBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIGRlYWQgZGVmIGtpbGwgc2xvdC4KKyAgICBib29sIGlzRGVhZCgpIGNvbnN0IHsgcmV0dXJuIGdldFNsb3QoKSA9PSBTbG90X0RlYWQ7IH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBiYXNlIGluZGV4IGZvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbmRleC4gVGhlIGJhc2UgaW5kZXgKKyAgICAvLy8gaXMgdGhlIG9uZSBhc3NvY2lhdGVkIHdpdGggdGhlIFNsb3RfQmxvY2sgc2xvdCBmb3IgdGhlIGluc3RydWN0aW9uCisgICAgLy8vIHBvaW50ZWQgdG8gYnkgdGhpcyBpbmRleC4KKyAgICBTbG90SW5kZXggZ2V0QmFzZUluZGV4KCkgY29uc3QgeworICAgICAgcmV0dXJuIFNsb3RJbmRleChsaXN0RW50cnkoKSwgU2xvdF9CbG9jayk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIGJvdW5kYXJ5IGluZGV4IGZvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBpbmRleC4gVGhlIGJvdW5kYXJ5CisgICAgLy8vIGluZGV4IGlzIHRoZSBvbmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBTbG90X0Jsb2NrIHNsb3QgZm9yIHRoZSBpbnN0cnVjdGlvbgorICAgIC8vLyBwb2ludGVkIHRvIGJ5IHRoaXMgaW5kZXguCisgICAgU2xvdEluZGV4IGdldEJvdW5kYXJ5SW5kZXgoKSBjb25zdCB7CisgICAgICByZXR1cm4gU2xvdEluZGV4KGxpc3RFbnRyeSgpLCBTbG90X0RlYWQpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSByZWdpc3RlciB1c2UvZGVmIHNsb3QgaW4gdGhlIGN1cnJlbnQgaW5zdHJ1Y3Rpb24gZm9yIGEKKyAgICAvLy8gbm9ybWFsIG9yIGVhcmx5LWNsb2JiZXIgZGVmLgorICAgIFNsb3RJbmRleCBnZXRSZWdTbG90KGJvb2wgRUMgPSBmYWxzZSkgY29uc3QgeworICAgICAgcmV0dXJuIFNsb3RJbmRleChsaXN0RW50cnkoKSwgRUMgPyBTbG90X0Vhcmx5Q2xvYmJlciA6IFNsb3RfUmVnaXN0ZXIpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBkZWFkIGRlZiBraWxsIHNsb3QgZm9yIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLgorICAgIFNsb3RJbmRleCBnZXREZWFkU2xvdCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBTbG90SW5kZXgobGlzdEVudHJ5KCksIFNsb3RfRGVhZCk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIG5leHQgc2xvdCBpbiB0aGUgaW5kZXggbGlzdC4gVGhpcyBjb3VsZCBiZSBlaXRoZXIgdGhlCisgICAgLy8vIG5leHQgc2xvdCBmb3IgdGhlIGluc3RydWN0aW9uIHBvaW50ZWQgdG8gYnkgdGhpcyBpbmRleCBvciwgaWYgdGhpcworICAgIC8vLyBpbmRleCBpcyBhIFNUT1JFLCB0aGUgZmlyc3Qgc2xvdCBmb3IgdGhlIG5leHQgaW5zdHJ1Y3Rpb24uCisgICAgLy8vIFdBUk5JTkc6IFRoaXMgbWV0aG9kIGlzIGNvbnNpZGVyYWJseSBtb3JlIGV4cGVuc2l2ZSB0aGFuIHRoZSBtZXRob2RzCisgICAgLy8vIHRoYXQgcmV0dXJuIHNwZWNpZmljIHNsb3RzIChnZXRVc2VJbmRleCgpLCBldGMpLiBJZiB5b3UgY2FuIC0gcGxlYXNlCisgICAgLy8vIHVzZSBvbmUgb2YgdGhvc2UgbWV0aG9kcy4KKyAgICBTbG90SW5kZXggZ2V0TmV4dFNsb3QoKSBjb25zdCB7CisgICAgICBTbG90IHMgPSBnZXRTbG90KCk7CisgICAgICBpZiAocyA9PSBTbG90X0RlYWQpIHsKKyAgICAgICAgcmV0dXJuIFNsb3RJbmRleCgmKisrbGlzdEVudHJ5KCktPmdldEl0ZXJhdG9yKCksIFNsb3RfQmxvY2spOworICAgICAgfQorICAgICAgcmV0dXJuIFNsb3RJbmRleChsaXN0RW50cnkoKSwgcyArIDEpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBuZXh0IGluZGV4LiBUaGlzIGlzIHRoZSBpbmRleCBjb3JyZXNwb25kaW5nIHRvIHRoZSB0aGlzCisgICAgLy8vIGluZGV4J3Mgc2xvdCwgYnV0IGZvciB0aGUgbmV4dCBpbnN0cnVjdGlvbi4KKyAgICBTbG90SW5kZXggZ2V0TmV4dEluZGV4KCkgY29uc3QgeworICAgICAgcmV0dXJuIFNsb3RJbmRleCgmKisrbGlzdEVudHJ5KCktPmdldEl0ZXJhdG9yKCksIGdldFNsb3QoKSk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIHByZXZpb3VzIHNsb3QgaW4gdGhlIGluZGV4IGxpc3QuIFRoaXMgY291bGQgYmUgZWl0aGVyIHRoZQorICAgIC8vLyBwcmV2aW91cyBzbG90IGZvciB0aGUgaW5zdHJ1Y3Rpb24gcG9pbnRlZCB0byBieSB0aGlzIGluZGV4IG9yLCBpZiB0aGlzCisgICAgLy8vIGluZGV4IGlzIGEgU2xvdF9CbG9jaywgdGhlIGxhc3Qgc2xvdCBmb3IgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLgorICAgIC8vLyBXQVJOSU5HOiBUaGlzIG1ldGhvZCBpcyBjb25zaWRlcmFibHkgbW9yZSBleHBlbnNpdmUgdGhhbiB0aGUgbWV0aG9kcworICAgIC8vLyB0aGF0IHJldHVybiBzcGVjaWZpYyBzbG90cyAoZ2V0VXNlSW5kZXgoKSwgZXRjKS4gSWYgeW91IGNhbiAtIHBsZWFzZQorICAgIC8vLyB1c2Ugb25lIG9mIHRob3NlIG1ldGhvZHMuCisgICAgU2xvdEluZGV4IGdldFByZXZTbG90KCkgY29uc3QgeworICAgICAgU2xvdCBzID0gZ2V0U2xvdCgpOworICAgICAgaWYgKHMgPT0gU2xvdF9CbG9jaykgeworICAgICAgICByZXR1cm4gU2xvdEluZGV4KCYqLS1saXN0RW50cnkoKS0+Z2V0SXRlcmF0b3IoKSwgU2xvdF9EZWFkKTsKKyAgICAgIH0KKyAgICAgIHJldHVybiBTbG90SW5kZXgobGlzdEVudHJ5KCksIHMgLSAxKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgcHJldmlvdXMgaW5kZXguIFRoaXMgaXMgdGhlIGluZGV4IGNvcnJlc3BvbmRpbmcgdG8gdGhpcworICAgIC8vLyBpbmRleCdzIHNsb3QsIGJ1dCBmb3IgdGhlIHByZXZpb3VzIGluc3RydWN0aW9uLgorICAgIFNsb3RJbmRleCBnZXRQcmV2SW5kZXgoKSBjb25zdCB7CisgICAgICByZXR1cm4gU2xvdEluZGV4KCYqLS1saXN0RW50cnkoKS0+Z2V0SXRlcmF0b3IoKSwgZ2V0U2xvdCgpKTsKKyAgICB9CisgIH07CisKKyAgdGVtcGxhdGUgPD4gc3RydWN0IGlzUG9kTGlrZTxTbG90SW5kZXg+IHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCisgIGlubGluZSByYXdfb3N0cmVhbSYgb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmb3MsIFNsb3RJbmRleCBsaSkgeworICAgIGxpLnByaW50KG9zKTsKKyAgICByZXR1cm4gb3M7CisgIH0KKworICB1c2luZyBJZHhNQkJQYWlyID0gc3RkOjpwYWlyPFNsb3RJbmRleCwgTWFjaGluZUJhc2ljQmxvY2sgKj47CisKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KFNsb3RJbmRleCBWLCBjb25zdCBJZHhNQkJQYWlyICZJTSkgeworICAgIHJldHVybiBWIDwgSU0uZmlyc3Q7CisgIH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgSWR4TUJCUGFpciAmSU0sIFNsb3RJbmRleCBWKSB7CisgICAgcmV0dXJuIElNLmZpcnN0IDwgVjsKKyAgfQorCisgIHN0cnVjdCBJZHgyTUJCQ29tcGFyZSB7CisgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IElkeE1CQlBhaXIgJkxIUywgY29uc3QgSWR4TUJCUGFpciAmUkhTKSBjb25zdCB7CisgICAgICByZXR1cm4gTEhTLmZpcnN0IDwgUkhTLmZpcnN0OworICAgIH0KKyAgfTsKKworICAvLy8gU2xvdEluZGV4ZXMgcGFzcy4KKyAgLy8vCisgIC8vLyBUaGlzIHBhc3MgYXNzaWducyBpbmRleGVzIHRvIGVhY2ggaW5zdHJ1Y3Rpb24uCisgIGNsYXNzIFNsb3RJbmRleGVzIDogcHVibGljIE1hY2hpbmVGdW5jdGlvblBhc3MgeworICBwcml2YXRlOgorICAgIC8vIEluZGV4TGlzdEVudHJ5IGFsbG9jYXRvci4KKyAgICBCdW1wUHRyQWxsb2NhdG9yIGlsZUFsbG9jYXRvcjsKKworICAgIHVzaW5nIEluZGV4TGlzdCA9IGlsaXN0PEluZGV4TGlzdEVudHJ5PjsKKyAgICBJbmRleExpc3QgaW5kZXhMaXN0OworCisjaWZkZWYgRVhQRU5TSVZFX0NIRUNLUworICAgIEluZGV4TGlzdCBncmF2ZXlhcmRMaXN0OworI2VuZGlmIC8vIEVYUEVOU0lWRV9DSEVDS1MKKworICAgIE1hY2hpbmVGdW5jdGlvbiAqbWY7CisKKyAgICB1c2luZyBNaTJJbmRleE1hcCA9IERlbnNlTWFwPGNvbnN0IE1hY2hpbmVJbnN0ciAqLCBTbG90SW5kZXg+OworICAgIE1pMkluZGV4TWFwIG1pMmlNYXA7CisKKyAgICAvLy8gTUJCUmFuZ2VzIC0gTWFwIE1CQiBudW1iZXIgdG8gKHN0YXJ0LCBzdG9wKSBpbmRleGVzLgorICAgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxTbG90SW5kZXgsIFNsb3RJbmRleD4sIDg+IE1CQlJhbmdlczsKKworICAgIC8vLyBJZHgyTUJCTWFwIC0gU29ydGVkIGxpc3Qgb2YgcGFpcnMgb2YgaW5kZXggb2YgZmlyc3QgaW5zdHJ1Y3Rpb24KKyAgICAvLy8gYW5kIE1CQiBpZC4KKyAgICBTbWFsbFZlY3RvcjxJZHhNQkJQYWlyLCA4PiBpZHgyTUJCTWFwOworCisgICAgSW5kZXhMaXN0RW50cnkqIGNyZWF0ZUVudHJ5KE1hY2hpbmVJbnN0ciAqbWksIHVuc2lnbmVkIGluZGV4KSB7CisgICAgICBJbmRleExpc3RFbnRyeSAqZW50cnkgPQorICAgICAgICAgIHN0YXRpY19jYXN0PEluZGV4TGlzdEVudHJ5ICo+KGlsZUFsbG9jYXRvci5BbGxvY2F0ZSgKKyAgICAgICAgICAgICAgc2l6ZW9mKEluZGV4TGlzdEVudHJ5KSwgYWxpZ25vZihJbmRleExpc3RFbnRyeSkpKTsKKworICAgICAgbmV3IChlbnRyeSkgSW5kZXhMaXN0RW50cnkobWksIGluZGV4KTsKKworICAgICAgcmV0dXJuIGVudHJ5OworICAgIH0KKworICAgIC8vLyBSZW51bWJlciBsb2NhbGx5IGFmdGVyIGluc2VydGluZyBjdXJJdHIuCisgICAgdm9pZCByZW51bWJlckluZGV4ZXMoSW5kZXhMaXN0OjppdGVyYXRvciBjdXJJdHIpOworCisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY2hhciBJRDsKKworICAgIFNsb3RJbmRleGVzKCkgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSB7CisgICAgICBpbml0aWFsaXplU2xvdEluZGV4ZXNQYXNzKCpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpKTsKKyAgICB9CisKKyAgICB+U2xvdEluZGV4ZXMoKSBvdmVycmlkZSB7CisgICAgICAvLyBUaGUgaW5kZXhMaXN0J3Mgbm9kZXMgYXJlIGFsbCBhbGxvY2F0ZWQgaW4gdGhlIEJ1bXBQdHJBbGxvY2F0b3IuCisgICAgICBpbmRleExpc3QuY2xlYXJBbmRMZWFrTm9kZXNVbnNhZmVseSgpOworICAgIH0KKworICAgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZhdSkgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGU7CisKKyAgICBib29sIHJ1bk9uTWFjaGluZUZ1bmN0aW9uKE1hY2hpbmVGdW5jdGlvbiAmZm4pIG92ZXJyaWRlOworCisgICAgLy8vIER1bXAgdGhlIGluZGV4ZXMuCisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgICAvLy8gUmVudW1iZXIgdGhlIGluZGV4IGxpc3QsIHByb3ZpZGluZyBzcGFjZSBmb3IgbmV3IGluc3RydWN0aW9ucy4KKyAgICB2b2lkIHJlbnVtYmVySW5kZXhlcygpOworCisgICAgLy8vIFJlcGFpciBpbmRleGVzIGFmdGVyIGFkZGluZyBhbmQgcmVtb3ZpbmcgaW5zdHJ1Y3Rpb25zLgorICAgIHZvaWQgcmVwYWlySW5kZXhlc0luUmFuZ2UoTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBFbmQpOworCisgICAgLy8vIFJldHVybnMgdGhlIHplcm8gaW5kZXggZm9yIHRoaXMgYW5hbHlzaXMuCisgICAgU2xvdEluZGV4IGdldFplcm9JbmRleCgpIHsKKyAgICAgIGFzc2VydChpbmRleExpc3QuZnJvbnQoKS5nZXRJbmRleCgpID09IDAgJiYgIkZpcnN0IGluZGV4IGlzIG5vdCAwPyIpOworICAgICAgcmV0dXJuIFNsb3RJbmRleCgmaW5kZXhMaXN0LmZyb250KCksIDApOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBiYXNlIGluZGV4IG9mIHRoZSBsYXN0IHNsb3QgaW4gdGhpcyBhbmFseXNpcy4KKyAgICBTbG90SW5kZXggZ2V0TGFzdEluZGV4KCkgeworICAgICAgcmV0dXJuIFNsb3RJbmRleCgmaW5kZXhMaXN0LmJhY2soKSwgMCk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gbWFjaGluZSBpbnN0ciBpcyBtYXBwZWQgdG8gYW4gaW5kZXgsCisgICAgLy8vIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlLgorICAgIGJvb2wgaGFzSW5kZXgoY29uc3QgTWFjaGluZUluc3RyICZpbnN0cikgY29uc3QgeworICAgICAgcmV0dXJuIG1pMmlNYXAuY291bnQoJmluc3RyKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgYmFzZSBpbmRleCBmb3IgdGhlIGdpdmVuIGluc3RydWN0aW9uLgorICAgIFNsb3RJbmRleCBnZXRJbnN0cnVjdGlvbkluZGV4KGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIGNvbnN0IHsKKyAgICAgIC8vIEluc3RydWN0aW9ucyBpbnNpZGUgYSBidW5kbGUgaGF2ZSB0aGUgc2FtZSBudW1iZXIgYXMgdGhlIGJ1bmRsZSBpdHNlbGYuCisgICAgICBjb25zdCBNYWNoaW5lSW5zdHIgJkJ1bmRsZVN0YXJ0ID0gKmdldEJ1bmRsZVN0YXJ0KE1JLmdldEl0ZXJhdG9yKCkpOworICAgICAgTWkySW5kZXhNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ciA9IG1pMmlNYXAuZmluZCgmQnVuZGxlU3RhcnQpOworICAgICAgYXNzZXJ0KGl0ciAhPSBtaTJpTWFwLmVuZCgpICYmICJJbnN0cnVjdGlvbiBub3QgZm91bmQgaW4gbWFwcy4iKTsKKyAgICAgIHJldHVybiBpdHItPnNlY29uZDsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgaW5zdHJ1Y3Rpb24gZm9yIHRoZSBnaXZlbiBpbmRleCwgb3IgbnVsbCBpZiB0aGUgZ2l2ZW4KKyAgICAvLy8gaW5kZXggaGFzIG5vIGluc3RydWN0aW9uIGFzc29jaWF0ZWQgd2l0aCBpdC4KKyAgICBNYWNoaW5lSW5zdHIqIGdldEluc3RydWN0aW9uRnJvbUluZGV4KFNsb3RJbmRleCBpbmRleCkgY29uc3QgeworICAgICAgcmV0dXJuIGluZGV4LmlzVmFsaWQoKSA/IGluZGV4Lmxpc3RFbnRyeSgpLT5nZXRJbnN0cigpIDogbnVsbHB0cjsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgbmV4dCBub24tbnVsbCBpbmRleCwgaWYgb25lIGV4aXN0cy4KKyAgICAvLy8gT3RoZXJ3aXNlIHJldHVybnMgZ2V0TGFzdEluZGV4KCkuCisgICAgU2xvdEluZGV4IGdldE5leHROb25OdWxsSW5kZXgoU2xvdEluZGV4IEluZGV4KSB7CisgICAgICBJbmRleExpc3Q6Oml0ZXJhdG9yIEkgPSBJbmRleC5saXN0RW50cnkoKS0+Z2V0SXRlcmF0b3IoKTsKKyAgICAgIEluZGV4TGlzdDo6aXRlcmF0b3IgRSA9IGluZGV4TGlzdC5lbmQoKTsKKyAgICAgIHdoaWxlICgrK0kgIT0gRSkKKyAgICAgICAgaWYgKEktPmdldEluc3RyKCkpCisgICAgICAgICAgcmV0dXJuIFNsb3RJbmRleCgmKkksIEluZGV4LmdldFNsb3QoKSk7CisgICAgICAvLyBXZSByZWFjaGVkIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLgorICAgICAgcmV0dXJuIGdldExhc3RJbmRleCgpOworICAgIH0KKworICAgIC8vLyBnZXRJbmRleEJlZm9yZSAtIFJldHVybnMgdGhlIGluZGV4IG9mIHRoZSBsYXN0IGluZGV4ZWQgaW5zdHJ1Y3Rpb24KKyAgICAvLy8gYmVmb3JlIE1JLCBvciB0aGUgc3RhcnQgaW5kZXggb2YgaXRzIGJhc2ljIGJsb2NrLgorICAgIC8vLyBNSSBpcyBub3QgcmVxdWlyZWQgdG8gaGF2ZSBhbiBpbmRleC4KKyAgICBTbG90SW5kZXggZ2V0SW5kZXhCZWZvcmUoY29uc3QgTWFjaGluZUluc3RyICZNSSkgY29uc3QgeworICAgICAgY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiA9IE1JLmdldFBhcmVudCgpOworICAgICAgYXNzZXJ0KE1CQiAmJiAiTUkgbXVzdCBiZSBpbnNlcnRlZCBpbm5hIGJhc2ljIGJsb2NrIik7CisgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3IgSSA9IE1JLCBCID0gTUJCLT5iZWdpbigpOworICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKEkgPT0gQikKKyAgICAgICAgICByZXR1cm4gZ2V0TUJCU3RhcnRJZHgoTUJCKTsKKyAgICAgICAgLS1JOworICAgICAgICBNaTJJbmRleE1hcDo6Y29uc3RfaXRlcmF0b3IgTWFwSXRyID0gbWkyaU1hcC5maW5kKCYqSSk7CisgICAgICAgIGlmIChNYXBJdHIgIT0gbWkyaU1hcC5lbmQoKSkKKyAgICAgICAgICByZXR1cm4gTWFwSXRyLT5zZWNvbmQ7CisgICAgICB9CisgICAgfQorCisgICAgLy8vIGdldEluZGV4QWZ0ZXIgLSBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZmlyc3QgaW5kZXhlZCBpbnN0cnVjdGlvbgorICAgIC8vLyBhZnRlciBNSSwgb3IgdGhlIGVuZCBpbmRleCBvZiBpdHMgYmFzaWMgYmxvY2suCisgICAgLy8vIE1JIGlzIG5vdCByZXF1aXJlZCB0byBoYXZlIGFuIGluZGV4LgorICAgIFNsb3RJbmRleCBnZXRJbmRleEFmdGVyKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIGNvbnN0IHsKKyAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIgPSBNSS5nZXRQYXJlbnQoKTsKKyAgICAgIGFzc2VydChNQkIgJiYgIk1JIG11c3QgYmUgaW5zZXJ0ZWQgaW5uYSBiYXNpYyBibG9jayIpOworICAgICAgTWFjaGluZUJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yIEkgPSBNSSwgRSA9IE1CQi0+ZW5kKCk7CisgICAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgICArK0k7CisgICAgICAgIGlmIChJID09IEUpCisgICAgICAgICAgcmV0dXJuIGdldE1CQkVuZElkeChNQkIpOworICAgICAgICBNaTJJbmRleE1hcDo6Y29uc3RfaXRlcmF0b3IgTWFwSXRyID0gbWkyaU1hcC5maW5kKCYqSSk7CisgICAgICAgIGlmIChNYXBJdHIgIT0gbWkyaU1hcC5lbmQoKSkKKyAgICAgICAgICByZXR1cm4gTWFwSXRyLT5zZWNvbmQ7CisgICAgICB9CisgICAgfQorCisgICAgLy8vIFJldHVybiB0aGUgKHN0YXJ0LGVuZCkgcmFuZ2Ugb2YgdGhlIGdpdmVuIGJhc2ljIGJsb2NrIG51bWJlci4KKyAgICBjb25zdCBzdGQ6OnBhaXI8U2xvdEluZGV4LCBTbG90SW5kZXg+ICYKKyAgICBnZXRNQkJSYW5nZSh1bnNpZ25lZCBOdW0pIGNvbnN0IHsKKyAgICAgIHJldHVybiBNQkJSYW5nZXNbTnVtXTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSAoc3RhcnQsZW5kKSByYW5nZSBvZiB0aGUgZ2l2ZW4gYmFzaWMgYmxvY2suCisgICAgY29uc3Qgc3RkOjpwYWlyPFNsb3RJbmRleCwgU2xvdEluZGV4PiAmCisgICAgZ2V0TUJCUmFuZ2UoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgKk1CQikgY29uc3QgeworICAgICAgcmV0dXJuIGdldE1CQlJhbmdlKE1CQi0+Z2V0TnVtYmVyKCkpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBmaXJzdCBpbmRleCBpbiB0aGUgZ2l2ZW4gYmFzaWMgYmxvY2sgbnVtYmVyLgorICAgIFNsb3RJbmRleCBnZXRNQkJTdGFydElkeCh1bnNpZ25lZCBOdW0pIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRNQkJSYW5nZShOdW0pLmZpcnN0OworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBmaXJzdCBpbmRleCBpbiB0aGUgZ2l2ZW4gYmFzaWMgYmxvY2suCisgICAgU2xvdEluZGV4IGdldE1CQlN0YXJ0SWR4KGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICptYmIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRNQkJSYW5nZShtYmIpLmZpcnN0OworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBsYXN0IGluZGV4IGluIHRoZSBnaXZlbiBiYXNpYyBibG9jayBudW1iZXIuCisgICAgU2xvdEluZGV4IGdldE1CQkVuZElkeCh1bnNpZ25lZCBOdW0pIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRNQkJSYW5nZShOdW0pLnNlY29uZDsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgbGFzdCBpbmRleCBpbiB0aGUgZ2l2ZW4gYmFzaWMgYmxvY2suCisgICAgU2xvdEluZGV4IGdldE1CQkVuZElkeChjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqbWJiKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0TUJCUmFuZ2UobWJiKS5zZWNvbmQ7CisgICAgfQorCisgICAgLy8vIEl0ZXJhdG9yIG92ZXIgdGhlIGlkeDJNQkJNYXAgKHNvcnRlZCBwYWlycyBvZiBzbG90IGluZGV4IG9mIGJhc2ljIGJsb2NrCisgICAgLy8vIGJlZ2luIGFuZCBiYXNpYyBibG9jaykKKyAgICB1c2luZyBNQkJJbmRleEl0ZXJhdG9yID0gU21hbGxWZWN0b3JJbXBsPElkeE1CQlBhaXI+Ojpjb25zdF9pdGVyYXRvcjsKKworICAgIC8vLyBNb3ZlIGl0ZXJhdG9yIHRvIHRoZSBuZXh0IElkeE1CQlBhaXIgd2hlcmUgdGhlIFNsb3RJbmRleCBpcyBncmVhdGVyIG9yCisgICAgLy8vIGVxdWFsIHRvIFxwIFRvLgorICAgIE1CQkluZGV4SXRlcmF0b3IgYWR2YW5jZU1CQkluZGV4KE1CQkluZGV4SXRlcmF0b3IgSSwgU2xvdEluZGV4IFRvKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjpsb3dlcl9ib3VuZChJLCBpZHgyTUJCTWFwLmVuZCgpLCBUbyk7CisgICAgfQorCisgICAgLy8vIEdldCBhbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgSWR4TUJCUGFpciB3aXRoIHRoZSBiaWdnZXN0IFNsb3RJbmRleAorICAgIC8vLyB0aGF0IGlzIGdyZWF0ZXIgb3IgZXF1YWwgdG8gXHAgSWR4LgorICAgIE1CQkluZGV4SXRlcmF0b3IgZmluZE1CQkluZGV4KFNsb3RJbmRleCBJZHgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBhZHZhbmNlTUJCSW5kZXgoaWR4Mk1CQk1hcC5iZWdpbigpLCBJZHgpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciB0aGUgYmVnaW4gb2YgdGhlIGlkeDJNQkJNYXAuCisgICAgTUJCSW5kZXhJdGVyYXRvciBNQkJJbmRleEJlZ2luKCkgY29uc3QgeworICAgICAgcmV0dXJuIGlkeDJNQkJNYXAuYmVnaW4oKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIGFuIGl0ZXJhdG9yIGZvciB0aGUgZW5kIG9mIHRoZSBpZHgyTUJCTWFwLgorICAgIE1CQkluZGV4SXRlcmF0b3IgTUJCSW5kZXhFbmQoKSBjb25zdCB7CisgICAgICByZXR1cm4gaWR4Mk1CQk1hcC5lbmQoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgYmFzaWMgYmxvY2sgd2hpY2ggdGhlIGdpdmVuIGluZGV4IGZhbGxzIGluLgorICAgIE1hY2hpbmVCYXNpY0Jsb2NrKiBnZXRNQkJGcm9tSW5kZXgoU2xvdEluZGV4IGluZGV4KSBjb25zdCB7CisgICAgICBpZiAoTWFjaGluZUluc3RyICpNSSA9IGdldEluc3RydWN0aW9uRnJvbUluZGV4KGluZGV4KSkKKyAgICAgICAgcmV0dXJuIE1JLT5nZXRQYXJlbnQoKTsKKworICAgICAgTUJCSW5kZXhJdGVyYXRvciBJID0gZmluZE1CQkluZGV4KGluZGV4KTsKKyAgICAgIC8vIFRha2UgdGhlIHBhaXIgY29udGFpbmluZyB0aGUgaW5kZXgKKyAgICAgIE1CQkluZGV4SXRlcmF0b3IgSiA9CisgICAgICAgICgoSSAhPSBNQkJJbmRleEVuZCgpICYmIEktPmZpcnN0ID4gaW5kZXgpIHx8CisgICAgICAgICAoSSA9PSBNQkJJbmRleEVuZCgpICYmICFpZHgyTUJCTWFwLmVtcHR5KCkpKSA/IHN0ZDo6cHJldihJKSA6IEk7CisKKyAgICAgIGFzc2VydChKICE9IE1CQkluZGV4RW5kKCkgJiYgSi0+Zmlyc3QgPD0gaW5kZXggJiYKKyAgICAgICAgICAgICBpbmRleCA8IGdldE1CQkVuZElkeChKLT5zZWNvbmQpICYmCisgICAgICAgICAgICAgImluZGV4IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYW4gTUJCIik7CisgICAgICByZXR1cm4gSi0+c2Vjb25kOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBNQkIgY292ZXJpbmcgdGhlIGdpdmVuIHJhbmdlLCBvciBudWxsIGlmIHRoZSByYW5nZSBjb3ZlcnMKKyAgICAvLy8gbW9yZSB0aGFuIG9uZSBiYXNpYyBibG9jay4KKyAgICBNYWNoaW5lQmFzaWNCbG9jayogZ2V0TUJCQ292ZXJpbmdSYW5nZShTbG90SW5kZXggc3RhcnQsIFNsb3RJbmRleCBlbmQpIGNvbnN0IHsKKworICAgICAgYXNzZXJ0KHN0YXJ0IDwgZW5kICYmICJCYWNrd2FyZHMgcmFuZ2VzIG5vdCBhbGxvd2VkLiIpOworICAgICAgTUJCSW5kZXhJdGVyYXRvciBpdHIgPSBmaW5kTUJCSW5kZXgoc3RhcnQpOworICAgICAgaWYgKGl0ciA9PSBNQkJJbmRleEVuZCgpKSB7CisgICAgICAgIGl0ciA9IHN0ZDo6cHJldihpdHIpOworICAgICAgICByZXR1cm4gaXRyLT5zZWNvbmQ7CisgICAgICB9CisKKyAgICAgIC8vIENoZWNrIHRoYXQgd2UgZG9uJ3QgY3Jvc3MgdGhlIGJvdW5kYXJ5IGludG8gdGhpcyBibG9jay4KKyAgICAgIGlmIChpdHItPmZpcnN0IDwgZW5kKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgICAgaXRyID0gc3RkOjpwcmV2KGl0cik7CisKKyAgICAgIGlmIChpdHItPmZpcnN0IDw9IHN0YXJ0KQorICAgICAgICByZXR1cm4gaXRyLT5zZWNvbmQ7CisKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIC8vLyBJbnNlcnQgdGhlIGdpdmVuIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gaW50byB0aGUgbWFwcGluZy4gUmV0dXJucyB0aGUKKyAgICAvLy8gYXNzaWduZWQgaW5kZXguCisgICAgLy8vIElmIExhdGUgaXMgc2V0IGFuZCB0aGVyZSBhcmUgbnVsbCBpbmRleGVzIGJldHdlZW4gbWkncyBuZWlnaGJvcmluZworICAgIC8vLyBpbnN0cnVjdGlvbnMsIGNyZWF0ZSB0aGUgbmV3IGluZGV4IGFmdGVyIHRoZSBudWxsIGluZGV4ZXMgaW5zdGVhZCBvZgorICAgIC8vLyBiZWZvcmUgdGhlbS4KKyAgICBTbG90SW5kZXggaW5zZXJ0TWFjaGluZUluc3RySW5NYXBzKE1hY2hpbmVJbnN0ciAmTUksIGJvb2wgTGF0ZSA9IGZhbHNlKSB7CisgICAgICBhc3NlcnQoIU1JLmlzSW5zaWRlQnVuZGxlKCkgJiYKKyAgICAgICAgICAgICAiSW5zdHJ1Y3Rpb25zIGluc2lkZSBidW5kbGVzIHNob3VsZCB1c2UgYnVuZGxlIHN0YXJ0J3Mgc2xvdC4iKTsKKyAgICAgIGFzc2VydChtaTJpTWFwLmZpbmQoJk1JKSA9PSBtaTJpTWFwLmVuZCgpICYmICJJbnN0ciBhbHJlYWR5IGluZGV4ZWQuIik7CisgICAgICAvLyBOdW1iZXJpbmcgREJHX1ZBTFVFIGluc3RydWN0aW9ucyBjb3VsZCBjYXVzZSBjb2RlIGdlbmVyYXRpb24gdG8gYmUKKyAgICAgIC8vIGFmZmVjdGVkIGJ5IGRlYnVnIGluZm9ybWF0aW9uLgorICAgICAgYXNzZXJ0KCFNSS5pc0RlYnVnVmFsdWUoKSAmJiAiQ2Fubm90IG51bWJlciBEQkdfVkFMVUUgaW5zdHJ1Y3Rpb25zLiIpOworCisgICAgICBhc3NlcnQoTUkuZ2V0UGFyZW50KCkgIT0gbnVsbHB0ciAmJiAiSW5zdHIgbXVzdCBiZSBhZGRlZCB0byBmdW5jdGlvbi4iKTsKKworICAgICAgLy8gR2V0IHRoZSBlbnRyaWVzIHdoZXJlIE1JIHNob3VsZCBiZSBpbnNlcnRlZC4KKyAgICAgIEluZGV4TGlzdDo6aXRlcmF0b3IgcHJldkl0ciwgbmV4dEl0cjsKKyAgICAgIGlmIChMYXRlKSB7CisgICAgICAgIC8vIEluc2VydCBNSSdzIGluZGV4IGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgZm9sbG93aW5nIGluc3RydWN0aW9uLgorICAgICAgICBuZXh0SXRyID0gZ2V0SW5kZXhBZnRlcihNSSkubGlzdEVudHJ5KCktPmdldEl0ZXJhdG9yKCk7CisgICAgICAgIHByZXZJdHIgPSBzdGQ6OnByZXYobmV4dEl0cik7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBJbnNlcnQgTUkncyBpbmRleCBpbW1lZGlhdGVseSBhZnRlciB0aGUgcHJlY2VkaW5nIGluc3RydWN0aW9uLgorICAgICAgICBwcmV2SXRyID0gZ2V0SW5kZXhCZWZvcmUoTUkpLmxpc3RFbnRyeSgpLT5nZXRJdGVyYXRvcigpOworICAgICAgICBuZXh0SXRyID0gc3RkOjpuZXh0KHByZXZJdHIpOworICAgICAgfQorCisgICAgICAvLyBHZXQgYSBudW1iZXIgZm9yIHRoZSBuZXcgaW5zdHIsIG9yIDAgaWYgdGhlcmUncyBubyByb29tIGN1cnJlbnRseS4KKyAgICAgIC8vIEluIHRoZSBsYXR0ZXIgY2FzZSB3ZSdsbCBmb3JjZSBhIHJlbnVtYmVyIGxhdGVyLgorICAgICAgdW5zaWduZWQgZGlzdCA9ICgobmV4dEl0ci0+Z2V0SW5kZXgoKSAtIHByZXZJdHItPmdldEluZGV4KCkpLzIpICYgfjN1OworICAgICAgdW5zaWduZWQgbmV3TnVtYmVyID0gcHJldkl0ci0+Z2V0SW5kZXgoKSArIGRpc3Q7CisKKyAgICAgIC8vIEluc2VydCBhIG5ldyBsaXN0IGVudHJ5IGZvciBNSS4KKyAgICAgIEluZGV4TGlzdDo6aXRlcmF0b3IgbmV3SXRyID0KKyAgICAgICAgICBpbmRleExpc3QuaW5zZXJ0KG5leHRJdHIsIGNyZWF0ZUVudHJ5KCZNSSwgbmV3TnVtYmVyKSk7CisKKyAgICAgIC8vIFJlbnVtYmVyIGxvY2FsbHkgaWYgd2UgbmVlZCB0by4KKyAgICAgIGlmIChkaXN0ID09IDApCisgICAgICAgIHJlbnVtYmVySW5kZXhlcyhuZXdJdHIpOworCisgICAgICBTbG90SW5kZXggbmV3SW5kZXgoJipuZXdJdHIsIFNsb3RJbmRleDo6U2xvdF9CbG9jayk7CisgICAgICBtaTJpTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcigmTUksIG5ld0luZGV4KSk7CisgICAgICByZXR1cm4gbmV3SW5kZXg7CisgICAgfQorCisgICAgLy8vIFJlbW92ZXMgbWFjaGluZSBpbnN0cnVjdGlvbiAoYnVuZGxlKSBccCBNSSBmcm9tIHRoZSBtYXBwaW5nLgorICAgIC8vLyBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIE1hY2hpbmVJbnN0cjo6ZXJhc2VGcm9tUGFyZW50KCkgaXMgdXNlZCB0bworICAgIC8vLyByZW1vdmUgYSB3aG9sZSBidW5kbGUgb3IgYW4gdW5idW5kbGVkIGluc3RydWN0aW9uLgorICAgIHZvaWQgcmVtb3ZlTWFjaGluZUluc3RyRnJvbU1hcHMoTWFjaGluZUluc3RyICZNSSk7CisKKyAgICAvLy8gUmVtb3ZlcyBhIHNpbmdsZSBtYWNoaW5lIGluc3RydWN0aW9uIFxwIE1JIGZyb20gdGhlIG1hcHBpbmcuCisgICAgLy8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgTWFjaGluZUluc3RyOjplcmFzZUZyb21CdW5kbGUoKSBpcyB1c2VkIHRvCisgICAgLy8vIHJlbW92ZSBhIHNpbmdsZSBpbnN0cnVjdGlvbiAob3V0IG9mIGEgYnVuZGxlKS4KKyAgICB2b2lkIHJlbW92ZVNpbmdsZU1hY2hpbmVJbnN0ckZyb21NYXBzKE1hY2hpbmVJbnN0ciAmTUkpOworCisgICAgLy8vIFJlcGxhY2VNYWNoaW5lSW5zdHJJbk1hcHMgLSBSZXBsYWNpbmcgYSBtYWNoaW5lIGluc3RyIHdpdGggYSBuZXcgb25lIGluCisgICAgLy8vIG1hcHMgdXNlZCBieSByZWdpc3RlciBhbGxvY2F0b3IuIFxyZXR1cm5zIHRoZSBpbmRleCB3aGVyZSB0aGUgbmV3CisgICAgLy8vIGluc3RydWN0aW9uIHdhcyBpbnNlcnRlZC4KKyAgICBTbG90SW5kZXggcmVwbGFjZU1hY2hpbmVJbnN0ckluTWFwcyhNYWNoaW5lSW5zdHIgJk1JLCBNYWNoaW5lSW5zdHIgJk5ld01JKSB7CisgICAgICBNaTJJbmRleE1hcDo6aXRlcmF0b3IgbWkyaUl0ciA9IG1pMmlNYXAuZmluZCgmTUkpOworICAgICAgaWYgKG1pMmlJdHIgPT0gbWkyaU1hcC5lbmQoKSkKKyAgICAgICAgcmV0dXJuIFNsb3RJbmRleCgpOworICAgICAgU2xvdEluZGV4IHJlcGxhY2VCYXNlSW5kZXggPSBtaTJpSXRyLT5zZWNvbmQ7CisgICAgICBJbmRleExpc3RFbnRyeSAqbWlFbnRyeShyZXBsYWNlQmFzZUluZGV4Lmxpc3RFbnRyeSgpKTsKKyAgICAgIGFzc2VydChtaUVudHJ5LT5nZXRJbnN0cigpID09ICZNSSAmJgorICAgICAgICAgICAgICJNaXNtYXRjaGVkIGluc3RydWN0aW9uIGluIGluZGV4IHRhYmxlcy4iKTsKKyAgICAgIG1pRW50cnktPnNldEluc3RyKCZOZXdNSSk7CisgICAgICBtaTJpTWFwLmVyYXNlKG1pMmlJdHIpOworICAgICAgbWkyaU1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoJk5ld01JLCByZXBsYWNlQmFzZUluZGV4KSk7CisgICAgICByZXR1cm4gcmVwbGFjZUJhc2VJbmRleDsKKyAgICB9CisKKyAgICAvLy8gQWRkIHRoZSBnaXZlbiBNYWNoaW5lQmFzaWNCbG9jayBpbnRvIHRoZSBtYXBzLgorICAgIHZvaWQgaW5zZXJ0TUJCSW5NYXBzKE1hY2hpbmVCYXNpY0Jsb2NrICptYmIpIHsKKyAgICAgIE1hY2hpbmVGdW5jdGlvbjo6aXRlcmF0b3IgbmV4dE1CQiA9CisgICAgICAgIHN0ZDo6bmV4dChNYWNoaW5lRnVuY3Rpb246Oml0ZXJhdG9yKG1iYikpOworCisgICAgICBJbmRleExpc3RFbnRyeSAqc3RhcnRFbnRyeSA9IG51bGxwdHI7CisgICAgICBJbmRleExpc3RFbnRyeSAqZW5kRW50cnkgPSBudWxscHRyOworICAgICAgSW5kZXhMaXN0OjppdGVyYXRvciBuZXdJdHI7CisgICAgICBpZiAobmV4dE1CQiA9PSBtYmItPmdldFBhcmVudCgpLT5lbmQoKSkgeworICAgICAgICBzdGFydEVudHJ5ID0gJmluZGV4TGlzdC5iYWNrKCk7CisgICAgICAgIGVuZEVudHJ5ID0gY3JlYXRlRW50cnkobnVsbHB0ciwgMCk7CisgICAgICAgIG5ld0l0ciA9IGluZGV4TGlzdC5pbnNlcnRBZnRlcihzdGFydEVudHJ5LT5nZXRJdGVyYXRvcigpLCBlbmRFbnRyeSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzdGFydEVudHJ5ID0gY3JlYXRlRW50cnkobnVsbHB0ciwgMCk7CisgICAgICAgIGVuZEVudHJ5ID0gZ2V0TUJCU3RhcnRJZHgoJipuZXh0TUJCKS5saXN0RW50cnkoKTsKKyAgICAgICAgbmV3SXRyID0gaW5kZXhMaXN0Lmluc2VydChlbmRFbnRyeS0+Z2V0SXRlcmF0b3IoKSwgc3RhcnRFbnRyeSk7CisgICAgICB9CisKKyAgICAgIFNsb3RJbmRleCBzdGFydElkeChzdGFydEVudHJ5LCBTbG90SW5kZXg6OlNsb3RfQmxvY2spOworICAgICAgU2xvdEluZGV4IGVuZElkeChlbmRFbnRyeSwgU2xvdEluZGV4OjpTbG90X0Jsb2NrKTsKKworICAgICAgTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciBwcmV2TUJCKG1iYik7CisgICAgICBhc3NlcnQocHJldk1CQiAhPSBtYmItPmdldFBhcmVudCgpLT5lbmQoKSAmJgorICAgICAgICAgICAgICJDYW4ndCBpbnNlcnQgYSBuZXcgYmxvY2sgYXQgdGhlIGJlZ2lubmluZyBvZiBhIGZ1bmN0aW9uLiIpOworICAgICAgLS1wcmV2TUJCOworICAgICAgTUJCUmFuZ2VzW3ByZXZNQkItPmdldE51bWJlcigpXS5zZWNvbmQgPSBzdGFydElkeDsKKworICAgICAgYXNzZXJ0KHVuc2lnbmVkKG1iYi0+Z2V0TnVtYmVyKCkpID09IE1CQlJhbmdlcy5zaXplKCkgJiYKKyAgICAgICAgICAgICAiQmxvY2tzIG11c3QgYmUgYWRkZWQgaW4gb3JkZXIiKTsKKyAgICAgIE1CQlJhbmdlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoc3RhcnRJZHgsIGVuZElkeCkpOworICAgICAgaWR4Mk1CQk1hcC5wdXNoX2JhY2soSWR4TUJCUGFpcihzdGFydElkeCwgbWJiKSk7CisKKyAgICAgIHJlbnVtYmVySW5kZXhlcyhuZXdJdHIpOworICAgICAgc3RkOjpzb3J0KGlkeDJNQkJNYXAuYmVnaW4oKSwgaWR4Mk1CQk1hcC5lbmQoKSwgSWR4Mk1CQkNvbXBhcmUoKSk7CisgICAgfQorCisgICAgLy8vIFxicmllZiBGcmVlIHRoZSByZXNvdXJjZXMgdGhhdCB3ZXJlIHJlcXVpcmVkIHRvIG1haW50YWluIGEgU2xvdEluZGV4LgorICAgIC8vLworICAgIC8vLyBPbmNlIGFuIGluZGV4IGlzIG5vIGxvbmdlciBuZWVkZWQgKGZvciBpbnN0YW5jZSBiZWNhdXNlIHRoZSBpbnN0cnVjdGlvbgorICAgIC8vLyBhdCB0aGF0IGluZGV4IGhhcyBiZWVuIG1vdmVkKSwgdGhlIHJlc291cmNlcyByZXF1aXJlZCB0byBtYWludGFpbiB0aGUKKyAgICAvLy8gaW5kZXggY2FuIGJlIHJlbGlucXVpc2hlZCB0byByZWR1Y2UgbWVtb3J5IHVzZSBhbmQgaW1wcm92ZSByZW51bWJlcmluZworICAgIC8vLyBwZXJmb3JtYW5jZS4gQW55IHJlbWFpbmluZyBTbG90SW5kZXggb2JqZWN0cyB0aGF0IHBvaW50IHRvIHRoZSBzYW1lCisgICAgLy8vIGluZGV4IGFyZSBsZWZ0ICdkYW5nbGluZycgKG11Y2ggdGhlIHNhbWUgYXMgYSBkYW5nbGluZyBwb2ludGVyIHRvIGEKKyAgICAvLy8gZnJlZWQgb2JqZWN0KSBhbmQgc2hvdWxkIG5vdCBiZSBhY2Nlc3NlZCwgZXhjZXB0IHRvIGRlc3RydWN0IHRoZW0uCisgICAgLy8vCisgICAgLy8vIExpa2UgZGFuZ2xpbmcgcG9pbnRlcnMsIGFjY2VzcyB0byBkYW5nbGluZyBTbG90SW5kZXhlcyBjYW4gY2F1c2UKKyAgICAvLy8gcGFpbmZ1bC10by10cmFjay1kb3duIGJ1Z3MsIGVzcGVjaWFsbHkgaWYgdGhlIG1lbW9yeSBmb3IgdGhlIGluZGV4CisgICAgLy8vIHByZXZpb3VzbHkgcG9pbnRlZCB0byBoYXMgYmVlbiByZS11c2VkLiBUbyBkZXRlY3QgZGFuZ2xpbmcgU2xvdEluZGV4CisgICAgLy8vIGJ1Z3MsIGJ1aWxkIHdpdGggRVhQRU5TSVZFX0NIRUNLUz0xLiBUaGlzIHdpbGwgY2F1c2UgImVyYXNlZCIgaW5kZXhlcyB0bworICAgIC8vLyBiZSByZXRhaW5lZCBpbiBhIGdyYXZleWFyZCBpbnN0ZWFkIG9mIGJlaW5nIGZyZWVkLiBPcGVyYXRpb25zIG9uIGluZGV4ZXMKKyAgICAvLy8gaW4gdGhlIGdyYXZleWFyZCB3aWxsIHRyaWdnZXIgYW4gYXNzZXJ0aW9uLgorICAgIHZvaWQgZXJhc2VJbmRleChTbG90SW5kZXggaW5kZXgpIHsKKyAgICAgIEluZGV4TGlzdEVudHJ5ICplbnRyeSA9IGluZGV4Lmxpc3RFbnRyeSgpOworI2lmZGVmIEVYUEVOU0lWRV9DSEVDS1MKKyAgICAgIGluZGV4TGlzdC5yZW1vdmUoZW50cnkpOworICAgICAgZ3JhdmV5YXJkTGlzdC5wdXNoX2JhY2soZW50cnkpOworICAgICAgZW50cnktPnNldFBvaXNvbigpOworI2Vsc2UKKyAgICAgIGluZGV4TGlzdC5lcmFzZShlbnRyeSk7CisjZW5kaWYKKyAgICB9CisgIH07CisKKyAgLy8gU3BlY2lhbGl6ZSBJbnRlcnZhbE1hcEluZm8gZm9yIGhhbGYtb3BlbiBzbG90IGluZGV4IGludGVydmFscy4KKyAgdGVtcGxhdGUgPD4KKyAgc3RydWN0IEludGVydmFsTWFwSW5mbzxTbG90SW5kZXg+IDogSW50ZXJ2YWxNYXBIYWxmT3BlbkluZm88U2xvdEluZGV4PiB7CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fU0xPVElOREVYRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1N0YWNrTWFwcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1N0YWNrTWFwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0MDcxMTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU3RhY2tNYXBzLmgKQEAgLTAsMCArMSwzMzIgQEAKKy8vPT09LSBTdGFja01hcHMuaCAtIFN0YWNrTWFwcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1NUQUNLTUFQU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9TVEFDS01BUFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvTWFwVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUluc3RyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsaW5nQ29udi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBc21QcmludGVyOworY2xhc3MgTUNFeHByOworY2xhc3MgTUNTdHJlYW1lcjsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworCisvLy8gXGJyaWVmIE1JLWxldmVsIHN0YWNrbWFwIG9wZXJhbmRzLgorLy8vCisvLy8gTUkgc3RhY2ttYXAgb3BlcmF0aW9ucyB0YWtlIHRoZSBmb3JtOgorLy8vIDxpZD4sIDxudW1CeXRlcz4sIGxpdmUgYXJncy4uLgorY2xhc3MgU3RhY2tNYXBPcGVycyB7CitwdWJsaWM6CisgIC8vLyBFbnVtZXJhdGUgdGhlIG1ldGEgb3BlcmFuZHMuCisgIGVudW0geyBJRFBvcywgTkJ5dGVzUG9zIH07CisKK3ByaXZhdGU6CisgIGNvbnN0IE1hY2hpbmVJbnN0ciogTUk7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgU3RhY2tNYXBPcGVycyhjb25zdCBNYWNoaW5lSW5zdHIgKk1JKTsKKworICAvLy8gUmV0dXJuIHRoZSBJRCBmb3IgdGhlIGdpdmVuIHN0YWNrbWFwCisgIHVpbnQ2NF90IGdldElEKCkgY29uc3QgeyByZXR1cm4gTUktPmdldE9wZXJhbmQoSURQb3MpLmdldEltbSgpOyB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHBhdGNoYWJsZSBieXRlcyB0aGUgZ2l2ZW4gc3RhY2ttYXAgc2hvdWxkIGVtaXQuCisgIHVpbnQzMl90IGdldE51bVBhdGNoQnl0ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIE1JLT5nZXRPcGVyYW5kKE5CeXRlc1BvcykuZ2V0SW1tKCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBvcGVyYW5kIGluZGV4IG9mIHRoZSB2YXJpYWJsZSBsaXN0IG9mIG5vbi1hcmd1bWVudCBvcGVyYW5kcy4KKyAgLy8vIFRoZXNlIGhvbGQgdGhlICJsaXZlIHN0YXRlIi4KKyAgdW5zaWduZWQgZ2V0VmFySWR4KCkgY29uc3QgeworICAgIC8vIFNraXAgSUQsIG5TaGFkb3dCeXRlcy4KKyAgICByZXR1cm4gMjsKKyAgfQorfTsKKworLy8vIFxicmllZiBNSS1sZXZlbCBwYXRjaHBvaW50IG9wZXJhbmRzLgorLy8vCisvLy8gTUkgcGF0Y2hwb2ludCBvcGVyYXRpb25zIHRha2UgdGhlIGZvcm06CisvLy8gWzxkZWY+XSwgPGlkPiwgPG51bUJ5dGVzPiwgPHRhcmdldD4sIDxudW1BcmdzPiwgPGNjPiwgLi4uCisvLy8KKy8vLyBJUiBwYXRjaHBvaW50IGludHJpbnNpY3MgZG8gbm90IGhhdmUgdGhlIDxjYz4gb3BlcmFuZCBiZWNhdXNlIGNhbGxpbmcKKy8vLyBjb252ZW50aW9uIGlzIHBhcnQgb2YgdGhlIHN1YmNsYXNzIGRhdGEuCisvLy8KKy8vLyBTRCBwYXRjaHBvaW50IG5vZGVzIGRvIG5vdCBoYXZlIGEgZGVmIG9wZXJhbmQgYmVjYXVzZSBpdCBpcyBwYXJ0IG9mIHRoZQorLy8vIFNEVmFsdWUuCisvLy8KKy8vLyBQYXRjaHBvaW50cyBmb2xsb3dpbmcgdGhlIGFueXJlZ2NjIGNvbnZlbnRpb24gYXJlIGhhbmRsZWQgc3BlY2lhbGx5LiBGb3IKKy8vLyB0aGVzZSwgdGhlIHN0YWNrIG1hcCBhbHNvIHJlY29yZHMgdGhlIGxvY2F0aW9uIG9mIHRoZSByZXR1cm4gdmFsdWUgYW5kCisvLy8gYXJndW1lbnRzLgorY2xhc3MgUGF0Y2hQb2ludE9wZXJzIHsKK3B1YmxpYzoKKyAgLy8vIEVudW1lcmF0ZSB0aGUgbWV0YSBvcGVyYW5kcy4KKyAgZW51bSB7IElEUG9zLCBOQnl0ZXNQb3MsIFRhcmdldFBvcywgTkFyZ1BvcywgQ0NQb3MsIE1ldGFFbmQgfTsKKworcHJpdmF0ZToKKyAgY29uc3QgTWFjaGluZUluc3RyICpNSTsKKyAgYm9vbCBIYXNEZWY7CisKKyAgdW5zaWduZWQgZ2V0TWV0YUlkeCh1bnNpZ25lZCBQb3MgPSAwKSBjb25zdCB7CisgICAgYXNzZXJ0KFBvcyA8IE1ldGFFbmQgJiYgIk1ldGEgb3BlcmFuZCBpbmRleCBvdXQgb2YgcmFuZ2UuIik7CisgICAgcmV0dXJuIChIYXNEZWYgPyAxIDogMCkgKyBQb3M7CisgIH0KKworICBjb25zdCBNYWNoaW5lT3BlcmFuZCAmZ2V0TWV0YU9wZXIodW5zaWduZWQgUG9zKSBjb25zdCB7CisgICAgcmV0dXJuIE1JLT5nZXRPcGVyYW5kKGdldE1ldGFJZHgoUG9zKSk7CisgIH0KKworcHVibGljOgorICBleHBsaWNpdCBQYXRjaFBvaW50T3BlcnMoY29uc3QgTWFjaGluZUluc3RyICpNSSk7CisKKyAgYm9vbCBpc0FueVJlZygpIGNvbnN0IHsgcmV0dXJuIChnZXRDYWxsaW5nQ29udigpID09IENhbGxpbmdDb252OjpBbnlSZWcpOyB9CisgIGJvb2wgaGFzRGVmKCkgY29uc3QgeyByZXR1cm4gSGFzRGVmOyB9CisKKyAgLy8vIFJldHVybiB0aGUgSUQgZm9yIHRoZSBnaXZlbiBwYXRjaHBvaW50LgorICB1aW50NjRfdCBnZXRJRCgpIGNvbnN0IHsgcmV0dXJuIGdldE1ldGFPcGVyKElEUG9zKS5nZXRJbW0oKTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBwYXRjaGFibGUgYnl0ZXMgdGhlIGdpdmVuIHBhdGNocG9pbnQgc2hvdWxkIGVtaXQuCisgIHVpbnQzMl90IGdldE51bVBhdGNoQnl0ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE1ldGFPcGVyKE5CeXRlc1BvcykuZ2V0SW1tKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgdGFyZ2V0IG9mIHRoZSB1bmRlcmx5aW5nIGNhbGwuCisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZnZXRDYWxsVGFyZ2V0KCkgY29uc3QgeworICAgIHJldHVybiBnZXRNZXRhT3BlcihUYXJnZXRQb3MpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIGNhbGxpbmcgY29udmVudGlvbgorICBDYWxsaW5nQ29udjo6SUQgZ2V0Q2FsbGluZ0NvbnYoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE1ldGFPcGVyKENDUG9zKS5nZXRJbW0oKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldEFyZ0lkeCgpIGNvbnN0IHsgcmV0dXJuIGdldE1ldGFJZHgoKSArIE1ldGFFbmQ7IH0KKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgY2FsbCBhcmd1bWVudHMKKyAgdWludDMyX3QgZ2V0TnVtQ2FsbEFyZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIE1JLT5nZXRPcGVyYW5kKGdldE1ldGFJZHgoTkFyZ1BvcykpLmdldEltbSgpOworICB9CisKKyAgLy8vIEdldCB0aGUgb3BlcmFuZCBpbmRleCBvZiB0aGUgdmFyaWFibGUgbGlzdCBvZiBub24tYXJndW1lbnQgb3BlcmFuZHMuCisgIC8vLyBUaGVzZSBob2xkIHRoZSAibGl2ZSBzdGF0ZSIuCisgIHVuc2lnbmVkIGdldFZhcklkeCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TWV0YUlkeCgpICsgTWV0YUVuZCArIGdldE51bUNhbGxBcmdzKCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBpbmRleCBhdCB3aGljaCBzdGFjayBtYXAgbG9jYXRpb25zIHdpbGwgYmUgcmVjb3JkZWQuCisgIC8vLyBBcmd1bWVudHMgYXJlIG5vdCByZWNvcmRlZCB1bmxlc3MgdGhlIGFueXJlZ2NjIGNvbnZlbnRpb24gaXMgdXNlZC4KKyAgdW5zaWduZWQgZ2V0U3RhY2tNYXBTdGFydElkeCgpIGNvbnN0IHsKKyAgICBpZiAoaXNBbnlSZWcoKSkKKyAgICAgIHJldHVybiBnZXRBcmdJZHgoKTsKKyAgICByZXR1cm4gZ2V0VmFySWR4KCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbmV4dCBzY3JhdGNoIHJlZ2lzdGVyIG9wZXJhbmQgaW5kZXguCisgIHVuc2lnbmVkIGdldE5leHRTY3JhdGNoSWR4KHVuc2lnbmVkIFN0YXJ0SWR4ID0gMCkgY29uc3Q7Cit9OworCisvLy8gTUktbGV2ZWwgU3RhdGVwb2ludCBvcGVyYW5kcworLy8vCisvLy8gU3RhdGVwb2ludCBvcGVyYW5kcyB0YWtlIHRoZSBmb3JtOgorLy8vICAgPGlkPiwgPG51bSBwYXRjaCBieXRlcyA+LCA8bnVtIGNhbGwgYXJndW1lbnRzPiwgPGNhbGwgdGFyZ2V0PiwKKy8vLyAgIFtjYWxsIGFyZ3VtZW50cy4uLl0sCisvLy8gICA8U3RhY2tNYXBzOjpDb25zdGFudE9wPiwgPGNhbGxpbmcgY29udmVudGlvbj4sCisvLy8gICA8U3RhY2tNYXBzOjpDb25zdGFudE9wPiwgPHN0YXRlcG9pbnQgZmxhZ3M+LAorLy8vICAgPFN0YWNrTWFwczo6Q29uc3RhbnRPcD4sIDxudW0gZGVvcHQgYXJncz4sIFtkZW9wdCBhcmdzLi4uXSwKKy8vLyAgIDxnYyBiYXNlL2Rlcml2ZWQgcGFpcnMuLi4+IDxnYyBhbGxvY2FzLi4uPgorLy8vIE5vdGUgdGhhdCB0aGUgbGFzdCB0d28gc2V0cyBvZiBhcmd1bWVudHMgYXJlIG5vdCBjdXJyZW50bHkgbGVuZ3RoCisvLy8gICBwcmVmaXhlZC4KK2NsYXNzIFN0YXRlcG9pbnRPcGVycyB7CisgIC8vIFRPRE86OiB3ZSBzaG91bGQgY2hhbmdlIHRoZSBTVEFURVBPSU5UIHJlcHJlc2VudGF0aW9uIHNvIHRoYXQgQ0MgYW5kCisgIC8vIEZsYWdzIHNob3VsZCBiZSBwYXJ0IG9mIG1ldGEgb3BlcmFuZHMsIHdpdGggYXJncyBhbmQgZGVvcHQgb3BlcmFuZHMsIGFuZAorICAvLyBnYyBvcGVyYW5kcyBhbGwgcHJlZml4ZWQgYnkgdGhlaXIgbGVuZ3RoIGFuZCBhIHR5cGUgY29kZS4gVGhpcyB3b3VsZCBiZQorICAvLyBtdWNoIG1vcmUgY29uc2lzdGVudC4gCitwdWJsaWM6CisgIC8vIFRoZXNlIHZhbHVlcyBhcmUgYWJvb2x1dGUgb2Zmc2V0cyBpbnRvIHRoZSBvcGVyYW5kcyBvZiB0aGUgc3RhdGVwb2ludAorICAvLyBpbnN0cnVjdGlvbi4KKyAgZW51bSB7IElEUG9zLCBOQnl0ZXNQb3MsIE5DYWxsQXJnc1BvcywgQ2FsbFRhcmdldFBvcywgTWV0YUVuZCB9OworCisgIC8vIFRoZXNlIHZhbHVlcyBhcmUgcmVsYXRpdmUgb2ZmZXN0cyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgc3RhdGVwb2ludCBtZXRhCisgIC8vIGFyZ3VtZW50cyAoaS5lLiB0aGUgZW5kIG9mIHRoZSBjYWxsIGFyZ3VtZW50cykuCisgIGVudW0geyBDQ09mZnNldCA9IDEsIEZsYWdzT2Zmc2V0ID0gMywgTnVtRGVvcHRPcGVyYW5kc09mZnNldCA9IDUgfTsKKworICBleHBsaWNpdCBTdGF0ZXBvaW50T3BlcnMoY29uc3QgTWFjaGluZUluc3RyICpNSSkgOiBNSShNSSkge30KKworICAvLy8gR2V0IHN0YXJ0aW5nIGluZGV4IG9mIG5vbiBjYWxsIHJlbGF0ZWQgYXJndW1lbnRzCisgIC8vLyAoY2FsbGluZyBjb252ZW50aW9uLCBzdGF0ZXBvaW50IGZsYWdzLCB2bSBzdGF0ZSBhbmQgZ2Mgc3RhdGUpLgorICB1bnNpZ25lZCBnZXRWYXJJZHgoKSBjb25zdCB7CisgICAgcmV0dXJuIE1JLT5nZXRPcGVyYW5kKE5DYWxsQXJnc1BvcykuZ2V0SW1tKCkgKyBNZXRhRW5kOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgSUQgZm9yIHRoZSBnaXZlbiBzdGF0ZXBvaW50LgorICB1aW50NjRfdCBnZXRJRCgpIGNvbnN0IHsgcmV0dXJuIE1JLT5nZXRPcGVyYW5kKElEUG9zKS5nZXRJbW0oKTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBwYXRjaGFibGUgYnl0ZXMgdGhlIGdpdmVuIHN0YXRlcG9pbnQgc2hvdWxkIGVtaXQuCisgIHVpbnQzMl90IGdldE51bVBhdGNoQnl0ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIE1JLT5nZXRPcGVyYW5kKE5CeXRlc1BvcykuZ2V0SW1tKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgdGFyZ2V0IG9mIHRoZSB1bmRlcmx5aW5nIGNhbGwuCisgIGNvbnN0IE1hY2hpbmVPcGVyYW5kICZnZXRDYWxsVGFyZ2V0KCkgY29uc3QgeworICAgIHJldHVybiBNSS0+Z2V0T3BlcmFuZChDYWxsVGFyZ2V0UG9zKTsKKyAgfQorCitwcml2YXRlOgorICBjb25zdCBNYWNoaW5lSW5zdHIgKk1JOworfTsKKworY2xhc3MgU3RhY2tNYXBzIHsKK3B1YmxpYzoKKyAgc3RydWN0IExvY2F0aW9uIHsKKyAgICBlbnVtIExvY2F0aW9uVHlwZSB7CisgICAgICBVbnByb2Nlc3NlZCwKKyAgICAgIFJlZ2lzdGVyLAorICAgICAgRGlyZWN0LAorICAgICAgSW5kaXJlY3QsCisgICAgICBDb25zdGFudCwKKyAgICAgIENvbnN0YW50SW5kZXgKKyAgICB9OworICAgIExvY2F0aW9uVHlwZSBUeXBlID0gVW5wcm9jZXNzZWQ7CisgICAgdW5zaWduZWQgU2l6ZSA9IDA7CisgICAgdW5zaWduZWQgUmVnID0gMDsKKyAgICBpbnQ2NF90IE9mZnNldCA9IDA7CisKKyAgICBMb2NhdGlvbigpID0gZGVmYXVsdDsKKyAgICBMb2NhdGlvbihMb2NhdGlvblR5cGUgVHlwZSwgdW5zaWduZWQgU2l6ZSwgdW5zaWduZWQgUmVnLCBpbnQ2NF90IE9mZnNldCkKKyAgICAgICAgOiBUeXBlKFR5cGUpLCBTaXplKFNpemUpLCBSZWcoUmVnKSwgT2Zmc2V0KE9mZnNldCkge30KKyAgfTsKKworICBzdHJ1Y3QgTGl2ZU91dFJlZyB7CisgICAgdW5zaWduZWQgc2hvcnQgUmVnID0gMDsKKyAgICB1bnNpZ25lZCBzaG9ydCBEd2FyZlJlZ051bSA9IDA7CisgICAgdW5zaWduZWQgc2hvcnQgU2l6ZSA9IDA7CisKKyAgICBMaXZlT3V0UmVnKCkgPSBkZWZhdWx0OworICAgIExpdmVPdXRSZWcodW5zaWduZWQgc2hvcnQgUmVnLCB1bnNpZ25lZCBzaG9ydCBEd2FyZlJlZ051bSwKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IFNpemUpCisgICAgICAgIDogUmVnKFJlZyksIER3YXJmUmVnTnVtKER3YXJmUmVnTnVtKSwgU2l6ZShTaXplKSB7fQorICB9OworCisgIC8vIE9wVHlwZXMgYXJlIHVzZWQgdG8gZW5jb2RlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBmb2xsb3dpbmcgbG9naWNhbAorICAvLyBvcGVyYW5kICh3aGljaCBtYXkgY29uc2lzdCBvZiBzZXZlcmFsIE1hY2hpbmVPcGVyYW5kcykgZm9yIHRoZQorICAvLyBPcFBhcnNlci4KKyAgdXNpbmcgT3BUeXBlID0gZW51bSB7IERpcmVjdE1lbVJlZk9wLCBJbmRpcmVjdE1lbVJlZk9wLCBDb25zdGFudE9wIH07CisKKyAgU3RhY2tNYXBzKEFzbVByaW50ZXIgJkFQKTsKKworICB2b2lkIHJlc2V0KCkgeworICAgIENTSW5mb3MuY2xlYXIoKTsKKyAgICBDb25zdFBvb2wuY2xlYXIoKTsKKyAgICBGbkluZm9zLmNsZWFyKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdlbmVyYXRlIGEgc3RhY2ttYXAgcmVjb3JkIGZvciBhIHN0YWNrbWFwIGluc3RydWN0aW9uLgorICAvLy8KKyAgLy8vIE1JIG11c3QgYmUgYSByYXcgU1RBQ0tNQVAsIG5vdCBhIFBBVENIUE9JTlQuCisgIHZvaWQgcmVjb3JkU3RhY2tNYXAoY29uc3QgTWFjaGluZUluc3RyICZNSSk7CisKKyAgLy8vIFxicmllZiBHZW5lcmF0ZSBhIHN0YWNrbWFwIHJlY29yZCBmb3IgYSBwYXRjaHBvaW50IGluc3RydWN0aW9uLgorICB2b2lkIHJlY29yZFBhdGNoUG9pbnQoY29uc3QgTWFjaGluZUluc3RyICZNSSk7CisKKyAgLy8vIFxicmllZiBHZW5lcmF0ZSBhIHN0YWNrbWFwIHJlY29yZCBmb3IgYSBzdGF0ZXBvaW50IGluc3RydWN0aW9uLgorICB2b2lkIHJlY29yZFN0YXRlcG9pbnQoY29uc3QgTWFjaGluZUluc3RyICZNSSk7CisKKyAgLy8vIElmIHRoZXJlIGlzIGFueSBzdGFjayBtYXAgZGF0YSwgY3JlYXRlIGEgc3RhY2sgbWFwIHNlY3Rpb24gYW5kIHNlcmlhbGl6ZQorICAvLy8gdGhlIG1hcCBpbmZvIGludG8gaXQuIFRoaXMgY2xlYXJzIHRoZSBzdGFjayBtYXAgZGF0YSBzdHJ1Y3R1cmVzCisgIC8vLyBhZnRlcndhcmRzLgorICB2b2lkIHNlcmlhbGl6ZVRvU3RhY2tNYXBTZWN0aW9uKCk7CisKK3ByaXZhdGU6CisgIHN0YXRpYyBjb25zdCBjaGFyICpXU01QOworCisgIHVzaW5nIExvY2F0aW9uVmVjID0gU21hbGxWZWN0b3I8TG9jYXRpb24sIDg+OworICB1c2luZyBMaXZlT3V0VmVjID0gU21hbGxWZWN0b3I8TGl2ZU91dFJlZywgOD47CisgIHVzaW5nIENvbnN0YW50UG9vbCA9IE1hcFZlY3Rvcjx1aW50NjRfdCwgdWludDY0X3Q+OworCisgIHN0cnVjdCBGdW5jdGlvbkluZm8geworICAgIHVpbnQ2NF90IFN0YWNrU2l6ZSA9IDA7CisgICAgdWludDY0X3QgUmVjb3JkQ291bnQgPSAxOworCisgICAgRnVuY3Rpb25JbmZvKCkgPSBkZWZhdWx0OworICAgIGV4cGxpY2l0IEZ1bmN0aW9uSW5mbyh1aW50NjRfdCBTdGFja1NpemUpIDogU3RhY2tTaXplKFN0YWNrU2l6ZSkge30KKyAgfTsKKworICBzdHJ1Y3QgQ2FsbHNpdGVJbmZvIHsKKyAgICBjb25zdCBNQ0V4cHIgKkNTT2Zmc2V0RXhwciA9IG51bGxwdHI7CisgICAgdWludDY0X3QgSUQgPSAwOworICAgIExvY2F0aW9uVmVjIExvY2F0aW9uczsKKyAgICBMaXZlT3V0VmVjIExpdmVPdXRzOworCisgICAgQ2FsbHNpdGVJbmZvKCkgPSBkZWZhdWx0OworICAgIENhbGxzaXRlSW5mbyhjb25zdCBNQ0V4cHIgKkNTT2Zmc2V0RXhwciwgdWludDY0X3QgSUQsCisgICAgICAgICAgICAgICAgIExvY2F0aW9uVmVjICYmTG9jYXRpb25zLCBMaXZlT3V0VmVjICYmTGl2ZU91dHMpCisgICAgICAgIDogQ1NPZmZzZXRFeHByKENTT2Zmc2V0RXhwciksIElEKElEKSwgTG9jYXRpb25zKHN0ZDo6bW92ZShMb2NhdGlvbnMpKSwKKyAgICAgICAgICBMaXZlT3V0cyhzdGQ6Om1vdmUoTGl2ZU91dHMpKSB7fQorICB9OworCisgIHVzaW5nIEZuSW5mb01hcCA9IE1hcFZlY3Rvcjxjb25zdCBNQ1N5bWJvbCAqLCBGdW5jdGlvbkluZm8+OworICB1c2luZyBDYWxsc2l0ZUluZm9MaXN0ID0gc3RkOjp2ZWN0b3I8Q2FsbHNpdGVJbmZvPjsKKworICBBc21QcmludGVyICZBUDsKKyAgQ2FsbHNpdGVJbmZvTGlzdCBDU0luZm9zOworICBDb25zdGFudFBvb2wgQ29uc3RQb29sOworICBGbkluZm9NYXAgRm5JbmZvczsKKworICBNYWNoaW5lSW5zdHI6OmNvbnN0X21vcF9pdGVyYXRvcgorICBwYXJzZU9wZXJhbmQoTWFjaGluZUluc3RyOjpjb25zdF9tb3BfaXRlcmF0b3IgTU9JLAorICAgICAgICAgICAgICAgTWFjaGluZUluc3RyOjpjb25zdF9tb3BfaXRlcmF0b3IgTU9FLCBMb2NhdGlvblZlYyAmTG9jcywKKyAgICAgICAgICAgICAgIExpdmVPdXRWZWMgJkxpdmVPdXRzKSBjb25zdDsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIGxpdmUtb3V0IHJlZ2lzdGVyIHJlY29yZCBmb3IgdGhlIGdpdmVuIHJlZ2lzdGVyIEBwIFJlZy4KKyAgTGl2ZU91dFJlZyBjcmVhdGVMaXZlT3V0UmVnKHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFBhcnNlIHRoZSByZWdpc3RlciBsaXZlLW91dCBtYXNrIGFuZCByZXR1cm4gYSB2ZWN0b3Igb2YgbGl2ZS1vdXQKKyAgLy8vIHJlZ2lzdGVycyB0aGF0IG5lZWQgdG8gYmUgcmVjb3JkZWQgaW4gdGhlIHN0YWNrbWFwLgorICBMaXZlT3V0VmVjIHBhcnNlUmVnaXN0ZXJMaXZlT3V0TWFzayhjb25zdCB1aW50MzJfdCAqTWFzaykgY29uc3Q7CisKKyAgLy8vIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgTUMgbG93ZXJpbmcgY29kZSBfaW1tZWRpYXRlbHlfIGJlZm9yZQorICAvLy8gbG93ZXJpbmcgdGhlIE1JIHRvIGFuIE1DSW5zdC4gSXQgcmVjb3JkcyB3aGVyZSB0aGUgb3BlcmFuZHMgZm9yIHRoZQorICAvLy8gaW5zdHJ1Y3Rpb24gYXJlIHN0b3JlZCwgYW5kIG91dHB1dHMgYSBsYWJlbCB0byByZWNvcmQgdGhlIG9mZnNldCBvZgorICAvLy8gdGhlIGNhbGwgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHRleHQgc2VjdGlvbi4gSW4gc3BlY2lhbCBjYXNlcyAoZS5nLiBBbnlSZWcKKyAgLy8vIGNhbGxpbmcgY29udmVudGlvbikgdGhlIHJldHVybiByZWdpc3RlciBpcyBhbHNvIHJlY29yZGVkIGlmIHJlcXVlc3RlZC4KKyAgdm9pZCByZWNvcmRTdGFja01hcE9wZXJzKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksIHVpbnQ2NF90IElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyOjpjb25zdF9tb3BfaXRlcmF0b3IgTU9JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyOjpjb25zdF9tb3BfaXRlcmF0b3IgTU9FLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCByZWNvcmRSZXN1bHQgPSBmYWxzZSk7CisKKyAgLy8vIFxicmllZiBFbWl0IHRoZSBzdGFja21hcCBoZWFkZXIuCisgIHZvaWQgZW1pdFN0YWNrbWFwSGVhZGVyKE1DU3RyZWFtZXIgJk9TKTsKKworICAvLy8gXGJyaWVmIEVtaXQgdGhlIGZ1bmN0aW9uIGZyYW1lIHJlY29yZCBmb3IgZWFjaCBmdW5jdGlvbi4KKyAgdm9pZCBlbWl0RnVuY3Rpb25GcmFtZVJlY29yZHMoTUNTdHJlYW1lciAmT1MpOworCisgIC8vLyBcYnJpZWYgRW1pdCB0aGUgY29uc3RhbnQgcG9vbC4KKyAgdm9pZCBlbWl0Q29uc3RhbnRQb29sRW50cmllcyhNQ1N0cmVhbWVyICZPUyk7CisKKyAgLy8vIFxicmllZiBFbWl0IHRoZSBjYWxsc2l0ZSBpbmZvIGZvciBlYWNoIHN0YWNrbWFwL3BhdGNocG9pbnQgaW50cmluc2ljIGNhbGwuCisgIHZvaWQgZW1pdENhbGxzaXRlRW50cmllcyhNQ1N0cmVhbWVyICZPUyk7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpOworICB2b2lkIGRlYnVnKCkgeyBwcmludChkYmdzKCkpOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1NUQUNLTUFQU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU3RhY2tQcm90ZWN0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9TdGFja1Byb3RlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyZGUyMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vU3RhY2tQcm90ZWN0b3IuaApAQCAtMCwwICsxLDEzOCBAQAorLy89PT0tIFN0YWNrUHJvdGVjdG9yLmggLSBTdGFjayBQcm90ZWN0b3IgSW5zZXJ0aW9uIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgaW5zZXJ0cyBzdGFjayBwcm90ZWN0b3JzIGludG8gZnVuY3Rpb25zIHdoaWNoIG5lZWQgdGhlbS4gQSB2YXJpYWJsZQorLy8gd2l0aCBhIHJhbmRvbSB2YWx1ZSBpbiBpdCBpcyBzdG9yZWQgb250byB0aGUgc3RhY2sgYmVmb3JlIHRoZSBsb2NhbCB2YXJpYWJsZXMKKy8vIGFyZSBhbGxvY2F0ZWQuIFVwb24gZXhpdGluZyB0aGUgYmxvY2ssIHRoZSBzdG9yZWQgdmFsdWUgaXMgY2hlY2tlZC4gSWYgaXQncworLy8gY2hhbmdlZCwgdGhlbiB0aGVyZSB3YXMgc29tZSBzb3J0IG9mIHZpb2xhdGlvbiBhbmQgdGhlIHByb2dyYW0gYWJvcnRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1NUQUNLUFJPVEVDVE9SX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1NUQUNLUFJPVEVDVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHJpcGxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgTW9kdWxlOworY2xhc3MgVGFyZ2V0TG93ZXJpbmdCYXNlOworY2xhc3MgVGFyZ2V0TWFjaGluZTsKK2NsYXNzIFR5cGU7CisKK2NsYXNzIFN0YWNrUHJvdGVjdG9yIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CitwdWJsaWM6CisgIC8vLyBTU1BMYXlvdXRLaW5kLiAgU3RhY2sgU21hc2hpbmcgUHJvdGVjdGlvbiAoU1NQKSBydWxlcyByZXF1aXJlIHRoYXQKKyAgLy8vIHZ1bG5lcmFibGUgc3RhY2sgYWxsb2NhdGlvbnMgYXJlIGxvY2F0ZWQgY2xvc2UgdGhlIHN0YWNrIHByb3RlY3Rvci4KKyAgZW51bSBTU1BMYXlvdXRLaW5kIHsKKyAgICBTU1BMS19Ob25lLCAgICAgICAvLy88IERpZCBub3QgdHJpZ2dlciBhIHN0YWNrIHByb3RlY3Rvci4gIE5vIGVmZmVjdCBvbiBkYXRhCisgICAgICAgICAgICAgICAgICAgICAgLy8vPCBsYXlvdXQuCisgICAgU1NQTEtfTGFyZ2VBcnJheSwgLy8vPCBBcnJheSBvciBuZXN0ZWQgYXJyYXkgPj0gU1NQLWJ1ZmZlci1zaXplLiAgQ2xvc2VzdAorICAgICAgICAgICAgICAgICAgICAgIC8vLzwgdG8gdGhlIHN0YWNrIHByb3RlY3Rvci4KKyAgICBTU1BMS19TbWFsbEFycmF5LCAvLy88IEFycmF5IG9yIG5lc3RlZCBhcnJheSA8IFNTUC1idWZmZXItc2l6ZS4gMm5kIGNsb3Nlc3QKKyAgICAgICAgICAgICAgICAgICAgICAvLy88IHRvIHRoZSBzdGFjayBwcm90ZWN0b3IuCisgICAgU1NQTEtfQWRkck9mICAgICAgLy8vPCBUaGUgYWRkcmVzcyBvZiB0aGlzIGFsbG9jYXRpb24gaXMgZXhwb3NlZCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAvLy88IHRyaWdnZXJlZCBwcm90ZWN0aW9uLiAgM3JkIGNsb3Nlc3QgdG8gdGhlIHByb3RlY3Rvci4KKyAgfTsKKworICAvLy8gQSBtYXBwaW5nIG9mIEFsbG9jYUluc3RzIHRvIHRoZWlyIHJlcXVpcmVkIFNTUCBsYXlvdXQuCisgIHVzaW5nIFNTUExheW91dE1hcCA9IFZhbHVlTWFwPGNvbnN0IEFsbG9jYUluc3QgKiwgU1NQTGF5b3V0S2luZD47CisKK3ByaXZhdGU6CisgIGNvbnN0IFRhcmdldE1hY2hpbmUgKlRNID0gbnVsbHB0cjsKKworICAvLy8gVExJIC0gS2VlcCBhIHBvaW50ZXIgb2YgYSBUYXJnZXRMb3dlcmluZyB0byBjb25zdWx0IGZvciBkZXRlcm1pbmluZworICAvLy8gdGFyZ2V0IHR5cGUgc2l6ZXMuCisgIGNvbnN0IFRhcmdldExvd2VyaW5nQmFzZSAqVExJID0gbnVsbHB0cjsKKyAgVHJpcGxlIFRyaXA7CisKKyAgRnVuY3Rpb24gKkY7CisgIE1vZHVsZSAqTTsKKworICBEb21pbmF0b3JUcmVlICpEVDsKKworICAvLy8gTGF5b3V0IC0gTWFwcGluZyBvZiBhbGxvY2F0aW9ucyB0byB0aGUgcmVxdWlyZWQgU1NQTGF5b3V0S2luZC4KKyAgLy8vIFN0YWNrUHJvdGVjdG9yIGFuYWx5c2lzIHdpbGwgdXBkYXRlIHRoaXMgbWFwIHdoZW4gZGV0ZXJtaW5pbmcgaWYgYW4KKyAgLy8vIEFsbG9jYUluc3QgdHJpZ2dlcnMgYSBzdGFjayBwcm90ZWN0b3IuCisgIFNTUExheW91dE1hcCBMYXlvdXQ7CisKKyAgLy8vIFxicmllZiBUaGUgbWluaW11bSBzaXplIG9mIGJ1ZmZlcnMgdGhhdCB3aWxsIHJlY2VpdmUgc3RhY2sgc21hc2hpbmcKKyAgLy8vIHByb3RlY3Rpb24gd2hlbiAtZnN0YWNrLXByb3RlY3Rpb24gaXMgdXNlZC4KKyAgdW5zaWduZWQgU1NQQnVmZmVyU2l6ZSA9IDA7CisKKyAgLy8vIFZpc2l0ZWRQSElzIC0gVGhlIHNldCBvZiBQSEkgbm9kZXMgdmlzaXRlZCB3aGVuIGRldGVybWluaW5nCisgIC8vLyBpZiBhIHZhcmlhYmxlJ3MgcmVmZXJlbmNlIGhhcyBiZWVuIHRha2VuLiAgVGhpcyBzZXQKKyAgLy8vIGlzIG1haW50YWluZWQgdG8gZW5zdXJlIHdlIGRvbid0IHZpc2l0IHRoZSBzYW1lIFBISSBub2RlIG11bHRpcGxlCisgIC8vLyB0aW1lcy4KKyAgU21hbGxQdHJTZXQ8Y29uc3QgUEhJTm9kZSAqLCAxNj4gVmlzaXRlZFBISXM7CisKKyAgLy8gQSBwcm9sb2d1ZSBpcyBnZW5lcmF0ZWQuCisgIGJvb2wgSGFzUHJvbG9ndWUgPSBmYWxzZTsKKworICAvLyBJUiBjaGVja2luZyBjb2RlIGlzIGdlbmVyYXRlZC4KKyAgYm9vbCBIYXNJUkNoZWNrID0gZmFsc2U7CisKKyAgLy8vIEluc2VydFN0YWNrUHJvdGVjdG9ycyAtIEluc2VydCBjb2RlIGludG8gdGhlIHByb2xvZ3VlIGFuZCBlcGlsb2d1ZSBvZgorICAvLy8gdGhlIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vICAtIFRoZSBwcm9sb2d1ZSBjb2RlIGxvYWRzIGFuZCBzdG9yZXMgdGhlIHN0YWNrIGd1YXJkIG9udG8gdGhlIHN0YWNrLgorICAvLy8gIC0gVGhlIGVwaWxvZ3VlIGNoZWNrcyB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBwcm9sb2d1ZSBhZ2FpbnN0IHRoZQorICAvLy8gICAgb3JpZ2luYWwgdmFsdWUuIEl0IGNhbGxzIF9fc3RhY2tfY2hrX2ZhaWwgaWYgdGhleSBkaWZmZXIuCisgIGJvb2wgSW5zZXJ0U3RhY2tQcm90ZWN0b3JzKCk7CisKKyAgLy8vIENyZWF0ZUZhaWxCQiAtIENyZWF0ZSBhIGJhc2ljIGJsb2NrIHRvIGp1bXAgdG8gd2hlbiB0aGUgc3RhY2sgcHJvdGVjdG9yCisgIC8vLyBjaGVjayBmYWlscy4KKyAgQmFzaWNCbG9jayAqQ3JlYXRlRmFpbEJCKCk7CisKKyAgLy8vIENvbnRhaW5zUHJvdGVjdGFibGVBcnJheSAtIENoZWNrIHdoZXRoZXIgdGhlIHR5cGUgZWl0aGVyIGlzIGFuIGFycmF5IG9yCisgIC8vLyBjb250YWlucyBhbiBhcnJheSBvZiBzdWZmaWNpZW50IHNpemUgc28gdGhhdCB3ZSBuZWVkIHN0YWNrIHByb3RlY3RvcnMKKyAgLy8vIGZvciBpdC4KKyAgLy8vIFxwYXJhbSBbb3V0XSBJc0xhcmdlIGlzIHNldCB0byB0cnVlIGlmIGEgcHJvdGVjdGFibGUgYXJyYXkgaXMgZm91bmQgYW5kCisgIC8vLyBpdCBpcyAibGFyZ2UiICggPj0gc3NwLWJ1ZmZlci1zaXplKS4gIEluIHRoZSBjYXNlIG9mIGEgc3RydWN0dXJlIHdpdGgKKyAgLy8vIG11bHRpcGxlIGFycmF5cywgdGhpcyBnZXRzIHNldCBpZiBhbnkgb2YgdGhlbSBpcyBsYXJnZS4KKyAgYm9vbCBDb250YWluc1Byb3RlY3RhYmxlQXJyYXkoVHlwZSAqVHksIGJvb2wgJklzTGFyZ2UsIGJvb2wgU3Ryb25nID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5TdHJ1Y3QgPSBmYWxzZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDaGVjayB3aGV0aGVyIGEgc3RhY2sgYWxsb2NhdGlvbiBoYXMgaXRzIGFkZHJlc3MgdGFrZW4uCisgIGJvb2wgSGFzQWRkcmVzc1Rha2VuKGNvbnN0IEluc3RydWN0aW9uICpBSSk7CisKKyAgLy8vIFJlcXVpcmVzU3RhY2tQcm90ZWN0b3IgLSBDaGVjayB3aGV0aGVyIG9yIG5vdCB0aGlzIGZ1bmN0aW9uIG5lZWRzIGEKKyAgLy8vIHN0YWNrIHByb3RlY3RvciBiYXNlZCB1cG9uIHRoZSBzdGFjayBwcm90ZWN0b3IgbGV2ZWwuCisgIGJvb2wgUmVxdWlyZXNTdGFja1Byb3RlY3RvcigpOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkLgorCisgIFN0YWNrUHJvdGVjdG9yKCkgOiBGdW5jdGlvblBhc3MoSUQpLCBTU1BCdWZmZXJTaXplKDgpIHsKKyAgICBpbml0aWFsaXplU3RhY2tQcm90ZWN0b3JQYXNzKCpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpKTsKKyAgfQorCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgU1NQTGF5b3V0S2luZCBnZXRTU1BMYXlvdXQoY29uc3QgQWxsb2NhSW5zdCAqQUkpIGNvbnN0OworCisgIC8vIFJldHVybiB0cnVlIGlmIFN0YWNrUHJvdGVjdG9yIGlzIHN1cHBvc2VkIHRvIGJlIGhhbmRsZWQgYnkgU2VsZWN0aW9uREFHLgorICBib29sIHNob3VsZEVtaXRTRENoZWNrKGNvbnN0IEJhc2ljQmxvY2sgJkJCKSBjb25zdDsKKworICB2b2lkIGFkanVzdEZvckNvbG9yaW5nKGNvbnN0IEFsbG9jYUluc3QgKkZyb20sIGNvbnN0IEFsbG9jYUluc3QgKlRvKTsKKworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkZuKSBvdmVycmlkZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fU1RBQ0tQUk9URUNUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhaWxEdXBsaWNhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVGFpbER1cGxpY2F0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTY1NjJjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhaWxEdXBsaWNhdG9yLmgKQEAgLTAsMCArMSwxMjggQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vVGFpbER1cGxpY2F0b3IuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFRhaWxEdXBsaWNhdG9yIGNsYXNzLiBVc2VkIGJ5IHRoZQorLy8gVGFpbER1cGxpY2F0aW9uIHBhc3MsIGFuZCBNYWNoaW5lQmxvY2tQbGFjZW1lbnQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fVEFJTERVUExJQ0FUT1JfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fVEFJTERVUExJQ0FUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1RhcmdldEluc3RySW5mby5oIgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hpbmVCYXNpY0Jsb2NrOworY2xhc3MgTWFjaGluZUJyYW5jaFByb2JhYmlsaXR5SW5mbzsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIE1hY2hpbmVNb2R1bGVJbmZvOworY2xhc3MgTWFjaGluZVJlZ2lzdGVySW5mbzsKK2NsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKKworLy8vIFV0aWxpdHkgY2xhc3MgdG8gcGVyZm9ybSB0YWlsIGR1cGxpY2F0aW9uLgorY2xhc3MgVGFpbER1cGxpY2F0b3IgeworICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSTsKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkk7CisgIGNvbnN0IE1hY2hpbmVCcmFuY2hQcm9iYWJpbGl0eUluZm8gKk1CUEk7CisgIGNvbnN0IE1hY2hpbmVNb2R1bGVJbmZvICpNTUk7CisgIE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSTsKKyAgTWFjaGluZUZ1bmN0aW9uICpNRjsKKyAgYm9vbCBQcmVSZWdBbGxvYzsKKyAgYm9vbCBMYXlvdXRNb2RlOworICB1bnNpZ25lZCBUYWlsRHVwU2l6ZTsKKworICAvLyBBIGxpc3Qgb2YgdmlydHVhbCByZWdpc3RlcnMgZm9yIHdoaWNoIHRvIHVwZGF0ZSBTU0EgZm9ybS4KKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDE2PiBTU0FVcGRhdGVWUnM7CisKKyAgLy8gRm9yIGVhY2ggdmlydHVhbCByZWdpc3RlciBpbiBTU0FVcGRhdGVWYWxzIGtlZXAgYSBsaXN0IG9mIHNvdXJjZSB2aXJ0dWFsCisgIC8vIHJlZ2lzdGVycy4KKyAgdXNpbmcgQXZhaWxhYmxlVmFsc1R5ID0gc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPE1hY2hpbmVCYXNpY0Jsb2NrICosIHVuc2lnbmVkPj47CisKKyAgRGVuc2VNYXA8dW5zaWduZWQsIEF2YWlsYWJsZVZhbHNUeT4gU1NBVXBkYXRlVmFsczsKKworcHVibGljOgorICAvLy8gUHJlcGFyZSB0byBydW4gb24gYSBzcGVjaWZpYyBtYWNoaW5lIGZ1bmN0aW9uLgorICAvLy8gQHBhcmFtIE1GIC0gRnVuY3Rpb24gdGhhdCB3aWxsIGJlIHByb2Nlc3NlZAorICAvLy8gQHBhcmFtIFByZVJlZ0FsbG9jIC0gdHJ1ZSBpZiB1c2VkIGJlZm9yZSByZWdpc3RlciBhbGxvY2F0aW9uCisgIC8vLyBAcGFyYW0gTUJQSSAtIEJyYW5jaCBQcm9iYWJpbGl0eSBJbmZvLiBVc2VkIHRvIHByb3BhZ2F0ZSBjb3JyZWN0CisgIC8vLyAgICAgcHJvYmFiaWxpdGllcyB3aGVuIG1vZGlmeWluZyB0aGUgQ0ZHLgorICAvLy8gQHBhcmFtIExheW91dE1vZGUgLSBXaGVuIHRydWUsIGRvbid0IHVzZSB0aGUgZXhpc3RpbmcgbGF5b3V0IHRvIG1ha2UKKyAgLy8vICAgICBkZWNpc2lvbnMuCisgIC8vLyBAcGFyYW0gVGFpbER1cFNpemUgLSBNYXhtaW11bSBzaXplIG9mIGJsb2NrcyB0byB0YWlsLWR1cGxpY2F0ZS4gWmVybworICAvLy8gICAgIGRlZmF1bHQgaW1wbGllcyB1c2luZyB0aGUgY29tbWFuZCBsaW5lIHZhbHVlIFRhaWxEdXBTaXplLgorICB2b2lkIGluaXRNRihNYWNoaW5lRnVuY3Rpb24gJk1GLCBib29sIFByZVJlZ0FsbG9jLAorICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQnJhbmNoUHJvYmFiaWxpdHlJbmZvICpNQlBJLAorICAgICAgICAgICAgICBib29sIExheW91dE1vZGUsIHVuc2lnbmVkIFRhaWxEdXBTaXplID0gMCk7CisKKyAgYm9vbCB0YWlsRHVwbGljYXRlQmxvY2tzKCk7CisgIHN0YXRpYyBib29sIGlzU2ltcGxlQkIoTWFjaGluZUJhc2ljQmxvY2sgKlRhaWxCQik7CisgIGJvb2wgc2hvdWxkVGFpbER1cGxpY2F0ZShib29sIElzU2ltcGxlLCBNYWNoaW5lQmFzaWNCbG9jayAmVGFpbEJCKTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIFRhaWxCQiBjYW4gc3VjY2Vzc2Z1bGx5IGJlIGR1cGxpY2F0ZWQgaW50byBQcmVkQkIKKyAgYm9vbCBjYW5UYWlsRHVwbGljYXRlKE1hY2hpbmVCYXNpY0Jsb2NrICpUYWlsQkIsIE1hY2hpbmVCYXNpY0Jsb2NrICpQcmVkQkIpOworCisgIC8vLyBUYWlsIGR1cGxpY2F0ZSBhIHNpbmdsZSBiYXNpYyBibG9jayBpbnRvIGl0cyBwcmVkZWNlc3NvcnMsIGFuZCB0aGVuIGNsZWFuCisgIC8vLyB1cC4KKyAgLy8vIElmIFxwIER1cGxpY2F0ZVByZWRzIGlzIG5vdCBudWxsLCBpdCB3aWxsIGJlIHVwZGF0ZWQgdG8gY29udGFpbiB0aGUgbGlzdAorICAvLy8gb2YgcHJlZGVjZXNzb3JzIHRoYXQgcmVjZWl2ZWQgYSBjb3B5IG9mIFxwIE1CQi4KKyAgLy8vIElmIFxwIFJlbW92YWxDYWxsYmFjayBpcyBub24tbnVsbC4gSXQgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIE1CQiBpcworICAvLy8gZGVsZXRlZC4KKyAgYm9vbCB0YWlsRHVwbGljYXRlQW5kVXBkYXRlKAorICAgICAgYm9vbCBJc1NpbXBsZSwgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpGb3JjZWRMYXlvdXRQcmVkLAorICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVCYXNpY0Jsb2NrKj4gKkR1cGxpY2F0ZWRQcmVkcyA9IG51bGxwdHIsCisgICAgICBmdW5jdGlvbl9yZWY8dm9pZChNYWNoaW5lQmFzaWNCbG9jayAqKT4gKlJlbW92YWxDYWxsYmFjayA9IG51bGxwdHIpOworCitwcml2YXRlOgorICB1c2luZyBSZWdTdWJSZWdQYWlyID0gVGFyZ2V0SW5zdHJJbmZvOjpSZWdTdWJSZWdQYWlyOworCisgIHZvaWQgYWRkU1NBVXBkYXRlRW50cnkodW5zaWduZWQgT3JpZ1JlZywgdW5zaWduZWQgTmV3UmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpCQik7CisgIHZvaWQgcHJvY2Vzc1BISShNYWNoaW5lSW5zdHIgKk1JLCBNYWNoaW5lQmFzaWNCbG9jayAqVGFpbEJCLAorICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKlByZWRCQiwKKyAgICAgICAgICAgICAgICAgIERlbnNlTWFwPHVuc2lnbmVkLCBSZWdTdWJSZWdQYWlyPiAmTG9jYWxWUk1hcCwKKyAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8dW5zaWduZWQsIFJlZ1N1YlJlZ1BhaXI+PiAmQ29waWVzLAorICAgICAgICAgICAgICAgICAgY29uc3QgRGVuc2VTZXQ8dW5zaWduZWQ+ICZVc2VkQnlQaGksIGJvb2wgUmVtb3ZlKTsKKyAgdm9pZCBkdXBsaWNhdGVJbnN0cnVjdGlvbihNYWNoaW5lSW5zdHIgKk1JLCBNYWNoaW5lQmFzaWNCbG9jayAqVGFpbEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpQcmVkQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVuc2VNYXA8dW5zaWduZWQsIFJlZ1N1YlJlZ1BhaXI+ICZMb2NhbFZSTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlbnNlU2V0PHVuc2lnbmVkPiAmVXNlZEJ5UGhpKTsKKyAgdm9pZCB1cGRhdGVTdWNjZXNzb3JzUEhJcyhNYWNoaW5lQmFzaWNCbG9jayAqRnJvbUJCLCBib29sIGlzRGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUJhc2ljQmxvY2sgKj4gJlREQkJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsU2V0VmVjdG9yPE1hY2hpbmVCYXNpY0Jsb2NrICosIDg+ICZTdWNjcyk7CisgIGJvb2wgY2FuQ29tcGxldGVseUR1cGxpY2F0ZUJCKE1hY2hpbmVCYXNpY0Jsb2NrICZCQik7CisgIGJvb2wgZHVwbGljYXRlU2ltcGxlQkIoTWFjaGluZUJhc2ljQmxvY2sgKlRhaWxCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUJhc2ljQmxvY2sgKj4gJlREQkJzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlbnNlU2V0PHVuc2lnbmVkPiAmUmVnc1VzZWRCeVBoaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUluc3RyICo+ICZDb3BpZXMpOworICBib29sIHRhaWxEdXBsaWNhdGUoYm9vbCBJc1NpbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpUYWlsQkIsCisgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRm9yY2VkTGF5b3V0UHJlZCwKKyAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lQmFzaWNCbG9jayAqPiAmVERCQnMsCisgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUluc3RyICo+ICZDb3BpZXMpOworICB2b2lkIGFwcGVuZENvcGllcyhNYWNoaW5lQmFzaWNCbG9jayAqTUJCLAorICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPHVuc2lnbmVkLFJlZ1N1YlJlZ1BhaXI+PiAmQ29weUluZm9zLAorICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUluc3RyICo+ICZDb3BpZXMpOworCisgIHZvaWQgcmVtb3ZlRGVhZEJsb2NrKAorICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgIGZ1bmN0aW9uX3JlZjx2b2lkKE1hY2hpbmVCYXNpY0Jsb2NrICopPiAqUmVtb3ZhbENhbGxiYWNrID0gbnVsbHB0cik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1RBSUxEVVBMSUNBVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYXJnZXRDYWxsaW5nQ29udi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldENhbGxpbmdDb252LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2QxMzhmNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYXJnZXRDYWxsaW5nQ29udi5oCkBAIC0wLDAgKzEsMjA0IEBACisvLz09PS0tIGxsdm0vQ29kZUdlbi9UYXJnZXRDYWxsaW5nQ29udi5oIC0gQ2FsbGluZyBDb252ZW50aW9uIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHR5cGVzIGZvciB3b3JraW5nIHdpdGggY2FsbGluZy1jb252ZW50aW9uIGluZm9ybWF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1RBUkdFVENBTExJTkdDT05WX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1RBUkdFVENBTExJTkdDT05WX0gKKworI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9WYWx1ZVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hY2hpbmVWYWx1ZVR5cGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgSVNEIHsKKworICBzdHJ1Y3QgQXJnRmxhZ3NUeSB7CisgIHByaXZhdGU6CisgICAgdW5zaWduZWQgSXNaRXh0IDogMTsgICAgIC8vLzwgWmVybyBleHRlbmRlZAorICAgIHVuc2lnbmVkIElzU0V4dCA6IDE7ICAgICAvLy88IFNpZ24gZXh0ZW5kZWQKKyAgICB1bnNpZ25lZCBJc0luUmVnIDogMTsgICAgLy8vPCBQYXNzZWQgaW4gcmVnaXN0ZXIKKyAgICB1bnNpZ25lZCBJc1NSZXQgOiAxOyAgICAgLy8vPCBIaWRkZW4gc3RydWN0LXJldCBwdHIKKyAgICB1bnNpZ25lZCBJc0J5VmFsIDogMTsgICAgLy8vPCBTdHJ1Y3QgcGFzc2VkIGJ5IHZhbHVlCisgICAgdW5zaWduZWQgSXNOZXN0IDogMTsgICAgIC8vLzwgTmVzdGVkIGZuIHN0YXRpYyBjaGFpbgorICAgIHVuc2lnbmVkIElzUmV0dXJuZWQgOiAxOyAvLy88IEFsd2F5cyByZXR1cm5lZAorICAgIHVuc2lnbmVkIElzU3BsaXQgOiAxOworICAgIHVuc2lnbmVkIElzSW5BbGxvY2EgOiAxOyAgIC8vLzwgUGFzc2VkIHdpdGggaW5hbGxvY2EKKyAgICB1bnNpZ25lZCBJc1NwbGl0RW5kIDogMTsgICAvLy88IExhc3QgcGFydCBvZiBhIHNwbGl0CisgICAgdW5zaWduZWQgSXNTd2lmdFNlbGYgOiAxOyAgLy8vPCBTd2lmdCBzZWxmIHBhcmFtZXRlcgorICAgIHVuc2lnbmVkIElzU3dpZnRFcnJvciA6IDE7IC8vLzwgU3dpZnQgZXJyb3IgcGFyYW1ldGVyCisgICAgdW5zaWduZWQgSXNIdmEgOiAxOyAgICAgICAgLy8vPCBIVkEgZmllbGQgZm9yCisgICAgdW5zaWduZWQgSXNIdmFTdGFydCA6IDE7ICAgLy8vPCBIVkEgc3RydWN0dXJlIHN0YXJ0CisgICAgdW5zaWduZWQgSXNTZWNBcmdQYXNzIDogMTsgLy8vPCBTZWNvbmQgYXJndW1lbnQKKyAgICB1bnNpZ25lZCBCeVZhbEFsaWduIDogNDsgICAvLy88IExvZyAyIG9mIGJ5dmFsIGFsaWdubWVudAorICAgIHVuc2lnbmVkIE9yaWdBbGlnbiA6IDU7ICAgIC8vLzwgTG9nIDIgb2Ygb3JpZ2luYWwgYWxpZ25tZW50CisgICAgdW5zaWduZWQgSXNJbkNvbnNlY3V0aXZlUmVnc0xhc3QgOiAxOworICAgIHVuc2lnbmVkIElzSW5Db25zZWN1dGl2ZVJlZ3MgOiAxOworICAgIHVuc2lnbmVkIElzQ29weUVsaXNpb25DYW5kaWRhdGUgOiAxOyAvLy88IEFyZ3VtZW50IGNvcHkgZWxpc2lvbiBjYW5kaWRhdGUKKworICAgIHVuc2lnbmVkIEJ5VmFsU2l6ZTsgLy8vPCBCeXZhbCBzdHJ1Y3Qgc2l6ZQorCisgIHB1YmxpYzoKKyAgICBBcmdGbGFnc1R5KCkKKyAgICAgICAgOiBJc1pFeHQoMCksIElzU0V4dCgwKSwgSXNJblJlZygwKSwgSXNTUmV0KDApLCBJc0J5VmFsKDApLCBJc05lc3QoMCksCisgICAgICAgICAgSXNSZXR1cm5lZCgwKSwgSXNTcGxpdCgwKSwgSXNJbkFsbG9jYSgwKSwgSXNTcGxpdEVuZCgwKSwKKyAgICAgICAgICBJc1N3aWZ0U2VsZigwKSwgSXNTd2lmdEVycm9yKDApLCBJc0h2YSgwKSwgSXNIdmFTdGFydCgwKSwKKyAgICAgICAgICBJc1NlY0FyZ1Bhc3MoMCksIEJ5VmFsQWxpZ24oMCksIE9yaWdBbGlnbigwKSwKKyAgICAgICAgICBJc0luQ29uc2VjdXRpdmVSZWdzTGFzdCgwKSwgSXNJbkNvbnNlY3V0aXZlUmVncygwKSwKKyAgICAgICAgICBJc0NvcHlFbGlzaW9uQ2FuZGlkYXRlKDApLCBCeVZhbFNpemUoMCkgeworICAgICAgc3RhdGljX2Fzc2VydChzaXplb2YoKnRoaXMpID09IDIgKiBzaXplb2YodW5zaWduZWQpLCAiZmxhZ3MgYXJlIHRvbyBiaWciKTsKKyAgICB9CisKKyAgICBib29sIGlzWkV4dCgpIGNvbnN0IHsgcmV0dXJuIElzWkV4dDsgfQorICAgIHZvaWQgc2V0WkV4dCgpIHsgSXNaRXh0ID0gMTsgfQorCisgICAgYm9vbCBpc1NFeHQoKSBjb25zdCB7IHJldHVybiBJc1NFeHQ7IH0KKyAgICB2b2lkIHNldFNFeHQoKSB7IElzU0V4dCA9IDE7IH0KKworICAgIGJvb2wgaXNJblJlZygpIGNvbnN0IHsgcmV0dXJuIElzSW5SZWc7IH0KKyAgICB2b2lkIHNldEluUmVnKCkgeyBJc0luUmVnID0gMTsgfQorCisgICAgYm9vbCBpc1NSZXQoKSBjb25zdCB7IHJldHVybiBJc1NSZXQ7IH0KKyAgICB2b2lkIHNldFNSZXQoKSB7IElzU1JldCA9IDE7IH0KKworICAgIGJvb2wgaXNCeVZhbCgpIGNvbnN0IHsgcmV0dXJuIElzQnlWYWw7IH0KKyAgICB2b2lkIHNldEJ5VmFsKCkgeyBJc0J5VmFsID0gMTsgfQorCisgICAgYm9vbCBpc0luQWxsb2NhKCkgY29uc3QgeyByZXR1cm4gSXNJbkFsbG9jYTsgfQorICAgIHZvaWQgc2V0SW5BbGxvY2EoKSB7IElzSW5BbGxvY2EgPSAxOyB9CisKKyAgICBib29sIGlzU3dpZnRTZWxmKCkgY29uc3QgeyByZXR1cm4gSXNTd2lmdFNlbGY7IH0KKyAgICB2b2lkIHNldFN3aWZ0U2VsZigpIHsgSXNTd2lmdFNlbGYgPSAxOyB9CisKKyAgICBib29sIGlzU3dpZnRFcnJvcigpIGNvbnN0IHsgcmV0dXJuIElzU3dpZnRFcnJvcjsgfQorICAgIHZvaWQgc2V0U3dpZnRFcnJvcigpIHsgSXNTd2lmdEVycm9yID0gMTsgfQorCisgICAgYm9vbCBpc0h2YSgpIGNvbnN0IHsgcmV0dXJuIElzSHZhOyB9CisgICAgdm9pZCBzZXRIdmEoKSB7IElzSHZhID0gMTsgfQorCisgICAgYm9vbCBpc0h2YVN0YXJ0KCkgY29uc3QgeyByZXR1cm4gSXNIdmFTdGFydDsgfQorICAgIHZvaWQgc2V0SHZhU3RhcnQoKSB7IElzSHZhU3RhcnQgPSAxOyB9CisKKyAgICBib29sIGlzU2VjQXJnUGFzcygpIGNvbnN0IHsgcmV0dXJuIElzU2VjQXJnUGFzczsgfQorICAgIHZvaWQgc2V0U2VjQXJnUGFzcygpIHsgSXNTZWNBcmdQYXNzID0gMTsgfQorCisgICAgYm9vbCBpc05lc3QoKSBjb25zdCB7IHJldHVybiBJc05lc3Q7IH0KKyAgICB2b2lkIHNldE5lc3QoKSB7IElzTmVzdCA9IDE7IH0KKworICAgIGJvb2wgaXNSZXR1cm5lZCgpIGNvbnN0IHsgcmV0dXJuIElzUmV0dXJuZWQ7IH0KKyAgICB2b2lkIHNldFJldHVybmVkKCkgeyBJc1JldHVybmVkID0gMTsgfQorCisgICAgYm9vbCBpc0luQ29uc2VjdXRpdmVSZWdzKCkgIGNvbnN0IHsgcmV0dXJuIElzSW5Db25zZWN1dGl2ZVJlZ3M7IH0KKyAgICB2b2lkIHNldEluQ29uc2VjdXRpdmVSZWdzKCkgeyBJc0luQ29uc2VjdXRpdmVSZWdzID0gMTsgfQorCisgICAgYm9vbCBpc0luQ29uc2VjdXRpdmVSZWdzTGFzdCgpIGNvbnN0IHsgcmV0dXJuIElzSW5Db25zZWN1dGl2ZVJlZ3NMYXN0OyB9CisgICAgdm9pZCBzZXRJbkNvbnNlY3V0aXZlUmVnc0xhc3QoKSB7IElzSW5Db25zZWN1dGl2ZVJlZ3NMYXN0ID0gMTsgfQorCisgICAgYm9vbCBpc1NwbGl0KCkgICBjb25zdCB7IHJldHVybiBJc1NwbGl0OyB9CisgICAgdm9pZCBzZXRTcGxpdCgpICB7IElzU3BsaXQgPSAxOyB9CisKKyAgICBib29sIGlzU3BsaXRFbmQoKSAgIGNvbnN0IHsgcmV0dXJuIElzU3BsaXRFbmQ7IH0KKyAgICB2b2lkIHNldFNwbGl0RW5kKCkgIHsgSXNTcGxpdEVuZCA9IDE7IH0KKworICAgIGJvb2wgaXNDb3B5RWxpc2lvbkNhbmRpZGF0ZSgpICBjb25zdCB7IHJldHVybiBJc0NvcHlFbGlzaW9uQ2FuZGlkYXRlOyB9CisgICAgdm9pZCBzZXRDb3B5RWxpc2lvbkNhbmRpZGF0ZSgpIHsgSXNDb3B5RWxpc2lvbkNhbmRpZGF0ZSA9IDE7IH0KKworICAgIHVuc2lnbmVkIGdldEJ5VmFsQWxpZ24oKSBjb25zdCB7IHJldHVybiAoMVUgPDwgQnlWYWxBbGlnbikgLyAyOyB9CisgICAgdm9pZCBzZXRCeVZhbEFsaWduKHVuc2lnbmVkIEEpIHsKKyAgICAgIEJ5VmFsQWxpZ24gPSBMb2cyXzMyKEEpICsgMTsKKyAgICAgIGFzc2VydChnZXRCeVZhbEFsaWduKCkgPT0gQSAmJiAiYml0ZmllbGQgb3ZlcmZsb3ciKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBnZXRPcmlnQWxpZ24oKSBjb25zdCB7IHJldHVybiAoMVUgPDwgT3JpZ0FsaWduKSAvIDI7IH0KKyAgICB2b2lkIHNldE9yaWdBbGlnbih1bnNpZ25lZCBBKSB7CisgICAgICBPcmlnQWxpZ24gPSBMb2cyXzMyKEEpICsgMTsKKyAgICAgIGFzc2VydChnZXRPcmlnQWxpZ24oKSA9PSBBICYmICJiaXRmaWVsZCBvdmVyZmxvdyIpOworICAgIH0KKworICAgIHVuc2lnbmVkIGdldEJ5VmFsU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEJ5VmFsU2l6ZTsgfQorICAgIHZvaWQgc2V0QnlWYWxTaXplKHVuc2lnbmVkIFMpIHsgQnlWYWxTaXplID0gUzsgfQorICB9OworCisgIC8vLyBJbnB1dEFyZyAtIFRoaXMgc3RydWN0IGNhcnJpZXMgZmxhZ3MgYW5kIHR5cGUgaW5mb3JtYXRpb24gYWJvdXQgYQorICAvLy8gc2luZ2xlIGluY29taW5nIChmb3JtYWwpIGFyZ3VtZW50IG9yIGluY29taW5nIChmcm9tIHRoZSBwZXJzcGVjdGl2ZQorICAvLy8gb2YgdGhlIGNhbGxlcikgcmV0dXJuIHZhbHVlIHZpcnR1YWwgcmVnaXN0ZXIuCisgIC8vLworICBzdHJ1Y3QgSW5wdXRBcmcgeworICAgIEFyZ0ZsYWdzVHkgRmxhZ3M7CisgICAgTVZUIFZUID0gTVZUOjpPdGhlcjsKKyAgICBFVlQgQXJnVlQ7CisgICAgYm9vbCBVc2VkID0gZmFsc2U7CisKKyAgICAvLy8gSW5kZXggb3JpZ2luYWwgRnVuY3Rpb24ncyBhcmd1bWVudC4KKyAgICB1bnNpZ25lZCBPcmlnQXJnSW5kZXg7CisgICAgLy8vIFNlbnRpbmVsIHZhbHVlIGZvciBpbXBsaWNpdCBtYWNoaW5lLWxldmVsIGlucHV0IGFyZ3VtZW50cy4KKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgTm9BcmdJbmRleCA9IFVJTlRfTUFYOworCisgICAgLy8vIE9mZnNldCBpbiBieXRlcyBvZiBjdXJyZW50IGlucHV0IHZhbHVlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YKKyAgICAvLy8gb3JpZ2luYWwgYXJndW1lbnQuIEUuZy4gaWYgYXJndW1lbnQgd2FzIHNwbGl0dGVkIGludG8gZm91ciAzMiBiaXQKKyAgICAvLy8gcmVnaXN0ZXJzLCB3ZSBnb3QgNCBJbnB1dEFyZ3Mgd2l0aCBQYXJ0T2Zmc2V0cyAwLCA0LCA4IGFuZCAxMi4KKyAgICB1bnNpZ25lZCBQYXJ0T2Zmc2V0OworCisgICAgSW5wdXRBcmcoKSA9IGRlZmF1bHQ7CisgICAgSW5wdXRBcmcoQXJnRmxhZ3NUeSBmbGFncywgRVZUIHZ0LCBFVlQgYXJndnQsIGJvb2wgdXNlZCwKKyAgICAgICAgICAgICB1bnNpZ25lZCBvcmlnSWR4LCB1bnNpZ25lZCBwYXJ0T2ZmcykKKyAgICAgIDogRmxhZ3MoZmxhZ3MpLCBVc2VkKHVzZWQpLCBPcmlnQXJnSW5kZXgob3JpZ0lkeCksIFBhcnRPZmZzZXQocGFydE9mZnMpIHsKKyAgICAgIFZUID0gdnQuZ2V0U2ltcGxlVlQoKTsKKyAgICAgIEFyZ1ZUID0gYXJndnQ7CisgICAgfQorCisgICAgYm9vbCBpc09yaWdBcmcoKSBjb25zdCB7CisgICAgICByZXR1cm4gT3JpZ0FyZ0luZGV4ICE9IE5vQXJnSW5kZXg7CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0T3JpZ0FyZ0luZGV4KCkgY29uc3QgeworICAgICAgYXNzZXJ0KE9yaWdBcmdJbmRleCAhPSBOb0FyZ0luZGV4ICYmICJJbXBsaWNpdCBtYWNoaW5lLWxldmVsIGFyZ3VtZW50Iik7CisgICAgICByZXR1cm4gT3JpZ0FyZ0luZGV4OworICAgIH0KKyAgfTsKKworICAvLy8gT3V0cHV0QXJnIC0gVGhpcyBzdHJ1Y3QgY2FycmllcyBmbGFncyBhbmQgYSB2YWx1ZSBmb3IgYQorICAvLy8gc2luZ2xlIG91dGdvaW5nIChhY3R1YWwpIGFyZ3VtZW50IG9yIG91dGdvaW5nIChmcm9tIHRoZSBwZXJzcGVjdGl2ZQorICAvLy8gb2YgdGhlIGNhbGxlcikgcmV0dXJuIHZhbHVlIHZpcnR1YWwgcmVnaXN0ZXIuCisgIC8vLworICBzdHJ1Y3QgT3V0cHV0QXJnIHsKKyAgICBBcmdGbGFnc1R5IEZsYWdzOworICAgIE1WVCBWVDsKKyAgICBFVlQgQXJnVlQ7CisKKyAgICAvLy8gSXNGaXhlZCAtIElzIHRoaXMgYSAiZml4ZWQiIHZhbHVlLCBpZSBub3QgcGFzc2VkIHRocm91Z2ggYSB2YXJhcmcgIi4uLiIuCisgICAgYm9vbCBJc0ZpeGVkID0gZmFsc2U7CisKKyAgICAvLy8gSW5kZXggb3JpZ2luYWwgRnVuY3Rpb24ncyBhcmd1bWVudC4KKyAgICB1bnNpZ25lZCBPcmlnQXJnSW5kZXg7CisKKyAgICAvLy8gT2Zmc2V0IGluIGJ5dGVzIG9mIGN1cnJlbnQgb3V0cHV0IHZhbHVlIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcgb2YKKyAgICAvLy8gb3JpZ2luYWwgYXJndW1lbnQuIEUuZy4gaWYgYXJndW1lbnQgd2FzIHNwbGl0dGVkIGludG8gZm91ciAzMiBiaXQKKyAgICAvLy8gcmVnaXN0ZXJzLCB3ZSBnb3QgNCBPdXRwdXRBcmdzIHdpdGggUGFydE9mZnNldHMgMCwgNCwgOCBhbmQgMTIuCisgICAgdW5zaWduZWQgUGFydE9mZnNldDsKKworICAgIE91dHB1dEFyZygpID0gZGVmYXVsdDsKKyAgICBPdXRwdXRBcmcoQXJnRmxhZ3NUeSBmbGFncywgRVZUIHZ0LCBFVlQgYXJndnQsIGJvb2wgaXNmaXhlZCwKKyAgICAgICAgICAgICAgdW5zaWduZWQgb3JpZ0lkeCwgdW5zaWduZWQgcGFydE9mZnMpCisgICAgICA6IEZsYWdzKGZsYWdzKSwgSXNGaXhlZChpc2ZpeGVkKSwgT3JpZ0FyZ0luZGV4KG9yaWdJZHgpLAorICAgICAgICBQYXJ0T2Zmc2V0KHBhcnRPZmZzKSB7CisgICAgICBWVCA9IHZ0LmdldFNpbXBsZVZUKCk7CisgICAgICBBcmdWVCA9IGFyZ3Z0OworICAgIH0KKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIElTRAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9UQVJHRVRDQUxMSU5HQ09OVl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVGFyZ2V0RnJhbWVMb3dlcmluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldEZyYW1lTG93ZXJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWYxY2YwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldEZyYW1lTG93ZXJpbmcuaApAQCAtMCwwICsxLDM0OCBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vVGFyZ2V0RnJhbWVMb3dlcmluZy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBJbnRlcmZhY2UgdG8gZGVzY3JpYmUgdGhlIGxheW91dCBvZiBhIHN0YWNrIGZyYW1lIG9uIHRoZSB0YXJnZXQgbWFjaGluZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9UQVJHRVRGUkFNRUxPV0VSSU5HX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1RBUkdFVEZSQU1FTE9XRVJJTkdfSAorCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVCYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgQml0VmVjdG9yOworICBjbGFzcyBDYWxsZWVTYXZlZEluZm87CisgIGNsYXNzIE1hY2hpbmVGdW5jdGlvbjsKKyAgY2xhc3MgUmVnU2NhdmVuZ2VyOworCisvLy8gSW5mb3JtYXRpb24gYWJvdXQgc3RhY2sgZnJhbWUgbGF5b3V0IG9uIHRoZSB0YXJnZXQuICBJdCBob2xkcyB0aGUgZGlyZWN0aW9uCisvLy8gb2Ygc3RhY2sgZ3Jvd3RoLCB0aGUga25vd24gc3RhY2sgYWxpZ25tZW50IG9uIGVudHJ5IHRvIGVhY2ggZnVuY3Rpb24sIGFuZAorLy8vIHRoZSBvZmZzZXQgdG8gdGhlIGxvY2FscyBhcmVhLgorLy8vCisvLy8gVGhlIG9mZnNldCB0byB0aGUgbG9jYWwgYXJlYSBpcyB0aGUgb2Zmc2V0IGZyb20gdGhlIHN0YWNrIHBvaW50ZXIgb24KKy8vLyBmdW5jdGlvbiBlbnRyeSB0byB0aGUgZmlyc3QgbG9jYXRpb24gd2hlcmUgZnVuY3Rpb24gZGF0YSAobG9jYWwgdmFyaWFibGVzLAorLy8vIHNwaWxsIGxvY2F0aW9ucykgY2FuIGJlIHN0b3JlZC4KK2NsYXNzIFRhcmdldEZyYW1lTG93ZXJpbmcgeworcHVibGljOgorICBlbnVtIFN0YWNrRGlyZWN0aW9uIHsKKyAgICBTdGFja0dyb3dzVXAsICAgICAgICAvLyBBZGRpbmcgdG8gdGhlIHN0YWNrIGluY3JlYXNlcyB0aGUgc3RhY2sgYWRkcmVzcworICAgIFN0YWNrR3Jvd3NEb3duICAgICAgIC8vIEFkZGluZyB0byB0aGUgc3RhY2sgZGVjcmVhc2VzIHRoZSBzdGFjayBhZGRyZXNzCisgIH07CisKKyAgLy8gTWFwcyBhIGNhbGxlZSBzYXZlZCByZWdpc3RlciB0byBhIHN0YWNrIHNsb3Qgd2l0aCBhIGZpeGVkIG9mZnNldC4KKyAgc3RydWN0IFNwaWxsU2xvdCB7CisgICAgdW5zaWduZWQgUmVnOworICAgIGludCBPZmZzZXQ7IC8vIE9mZnNldCByZWxhdGl2ZSB0byBzdGFjayBwb2ludGVyIG9uIGZ1bmN0aW9uIGVudHJ5LgorICB9OworcHJpdmF0ZToKKyAgU3RhY2tEaXJlY3Rpb24gU3RhY2tEaXI7CisgIHVuc2lnbmVkIFN0YWNrQWxpZ25tZW50OworICB1bnNpZ25lZCBUcmFuc2llbnRTdGFja0FsaWdubWVudDsKKyAgaW50IExvY2FsQXJlYU9mZnNldDsKKyAgYm9vbCBTdGFja1JlYWxpZ25hYmxlOworcHVibGljOgorICBUYXJnZXRGcmFtZUxvd2VyaW5nKFN0YWNrRGlyZWN0aW9uIEQsIHVuc2lnbmVkIFN0YWNrQWwsIGludCBMQU8sCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVHJhbnNBbCA9IDEsIGJvb2wgU3RhY2tSZWFsID0gdHJ1ZSkKKyAgICA6IFN0YWNrRGlyKEQpLCBTdGFja0FsaWdubWVudChTdGFja0FsKSwgVHJhbnNpZW50U3RhY2tBbGlnbm1lbnQoVHJhbnNBbCksCisgICAgICBMb2NhbEFyZWFPZmZzZXQoTEFPKSwgU3RhY2tSZWFsaWduYWJsZShTdGFja1JlYWwpIHt9CisKKyAgdmlydHVhbCB+VGFyZ2V0RnJhbWVMb3dlcmluZygpOworCisgIC8vIFRoZXNlIG1ldGhvZHMgcmV0dXJuIGluZm9ybWF0aW9uIHRoYXQgZGVzY3JpYmVzIHRoZSBhYnN0cmFjdCBzdGFjayBsYXlvdXQKKyAgLy8gb2YgdGhlIHRhcmdldCBtYWNoaW5lLgorCisgIC8vLyBnZXRTdGFja0dyb3d0aERpcmVjdGlvbiAtIFJldHVybiB0aGUgZGlyZWN0aW9uIHRoZSBzdGFjayBncm93cworICAvLy8KKyAgU3RhY2tEaXJlY3Rpb24gZ2V0U3RhY2tHcm93dGhEaXJlY3Rpb24oKSBjb25zdCB7IHJldHVybiBTdGFja0RpcjsgfQorCisgIC8vLyBnZXRTdGFja0FsaWdubWVudCAtIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0byB3aGljaCB0aGUKKyAgLy8vIHN0YWNrIHBvaW50ZXIgbXVzdCBiZSBhbGlnbmVkIG9uIGVudHJ5IHRvIGEgZnVuY3Rpb24uICBUeXBpY2FsbHksIHRoaXMKKyAgLy8vIGlzIHRoZSBsYXJnZXN0IGFsaWdubWVudCBmb3IgYW55IGRhdGEgb2JqZWN0IGluIHRoZSB0YXJnZXQuCisgIC8vLworICB1bnNpZ25lZCBnZXRTdGFja0FsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuIFN0YWNrQWxpZ25tZW50OyB9CisKKyAgLy8vIGFsaWduU1BBZGp1c3QgLSBUaGlzIG1ldGhvZCBhbGlnbnMgdGhlIHN0YWNrIGFkanVzdG1lbnQgdG8gdGhlIGNvcnJlY3QKKyAgLy8vIGFsaWdubWVudC4KKyAgLy8vCisgIGludCBhbGlnblNQQWRqdXN0KGludCBTUEFkaikgY29uc3QgeworICAgIGlmIChTUEFkaiA8IDApIHsKKyAgICAgIFNQQWRqID0gLWFsaWduVG8oLVNQQWRqLCBTdGFja0FsaWdubWVudCk7CisgICAgfSBlbHNlIHsKKyAgICAgIFNQQWRqID0gYWxpZ25UbyhTUEFkaiwgU3RhY2tBbGlnbm1lbnQpOworICAgIH0KKyAgICByZXR1cm4gU1BBZGo7CisgIH0KKworICAvLy8gZ2V0VHJhbnNpZW50U3RhY2tBbGlnbm1lbnQgLSBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8KKyAgLy8vIHdoaWNoIHRoZSBzdGFjayBwb2ludGVyIG11c3QgYmUgYWxpZ25lZCBhdCBhbGwgdGltZXMsIGV2ZW4gYmV0d2VlbgorICAvLy8gY2FsbHMuCisgIC8vLworICB1bnNpZ25lZCBnZXRUcmFuc2llbnRTdGFja0FsaWdubWVudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVHJhbnNpZW50U3RhY2tBbGlnbm1lbnQ7CisgIH0KKworICAvLy8gaXNTdGFja1JlYWxpZ25hYmxlIC0gVGhpcyBtZXRob2QgcmV0dXJucyB3aGV0aGVyIHRoZSBzdGFjayBjYW4gYmUKKyAgLy8vIHJlYWxpZ25lZC4KKyAgYm9vbCBpc1N0YWNrUmVhbGlnbmFibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIFN0YWNrUmVhbGlnbmFibGU7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBza2V3IHRoYXQgaGFzIHRvIGJlIGFwcGxpZWQgdG8gc3RhY2sgYWxpZ25tZW50IHVuZGVyCisgIC8vLyBjZXJ0YWluIGNvbmRpdGlvbnMgKGUuZy4gc3RhY2sgd2FzIGFkanVzdGVkIGJlZm9yZSBmdW5jdGlvbiBccCBNRgorICAvLy8gd2FzIGNhbGxlZCkuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0U3RhY2tBbGlnbm1lbnRTa2V3KGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIC8vLyBnZXRPZmZzZXRPZkxvY2FsQXJlYSAtIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgbG9jYWwgYXJlYQorICAvLy8gZnJvbSB0aGUgc3RhY2sgcG9pbnRlciBvbiBlbnRyYW5jZSB0byBhIGZ1bmN0aW9uLgorICAvLy8KKyAgaW50IGdldE9mZnNldE9mTG9jYWxBcmVhKCkgY29uc3QgeyByZXR1cm4gTG9jYWxBcmVhT2Zmc2V0OyB9CisKKyAgLy8vIGlzRlBDbG9zZVRvSW5jb21pbmdTUCAtIFJldHVybiB0cnVlIGlmIHRoZSBmcmFtZSBwb2ludGVyIGlzIGNsb3NlIHRvCisgIC8vLyB0aGUgaW5jb21pbmcgc3RhY2sgcG9pbnRlciwgZmFsc2UgaWYgaXQgaXMgY2xvc2UgdG8gdGhlIHBvc3QtcHJvbG9ndWUKKyAgLy8vIHN0YWNrIHBvaW50ZXIuCisgIHZpcnR1YWwgYm9vbCBpc0ZQQ2xvc2VUb0luY29taW5nU1AoKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8vIGFzc2lnbkNhbGxlZVNhdmVkU3BpbGxTbG90cyAtIEFsbG93cyB0YXJnZXQgdG8gb3ZlcnJpZGUgc3BpbGwgc2xvdAorICAvLy8gYXNzaWdubWVudCBsb2dpYy4gIElmIGltcGxlbWVudGVkLCBhc3NpZ25DYWxsZWVTYXZlZFNwaWxsU2xvdHMoKSBzaG91bGQKKyAgLy8vIGFzc2lnbiBmcmFtZSBzbG90cyB0byBhbGwgQ1NJIGVudHJpZXMgYW5kIHJldHVybiB0cnVlLiAgSWYgdGhpcyBtZXRob2QKKyAgLy8vIHJldHVybnMgZmFsc2UsIHNwaWxsIHNsb3RzIHdpbGwgYmUgYXNzaWduZWQgdXNpbmcgZ2VuZXJpYyBpbXBsZW1lbnRhdGlvbi4KKyAgLy8vIGFzc2lnbkNhbGxlZVNhdmVkU3BpbGxTbG90cygpIG1heSBhZGQsIGRlbGV0ZSBvciByZWFycmFuZ2UgZWxlbWVudHMgb2YKKyAgLy8vIENTSS4KKyAgdmlydHVhbCBib29sCisgIGFzc2lnbkNhbGxlZVNhdmVkU3BpbGxTbG90cyhNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDYWxsZWVTYXZlZEluZm8+ICZDU0kpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gZ2V0Q2FsbGVlU2F2ZWRTcGlsbFNsb3RzIC0gVGhpcyBtZXRob2QgcmV0dXJucyBhIHBvaW50ZXIgdG8gYW4gYXJyYXkgb2YKKyAgLy8vIHBhaXJzLCB0aGF0IGNvbnRhaW5zIGFuIGVudHJ5IGZvciBlYWNoIGNhbGxlZSBzYXZlZCByZWdpc3RlciB0aGF0IG11c3QgYmUKKyAgLy8vIHNwaWxsZWQgdG8gYSBwYXJ0aWN1bGFyIHN0YWNrIGxvY2F0aW9uIGlmIGl0IGlzIHNwaWxsZWQuCisgIC8vLworICAvLy8gRWFjaCBlbnRyeSBpbiB0aGlzIGFycmF5IGNvbnRhaW5zIGEgPHJlZ2lzdGVyLG9mZnNldD4gcGFpciwgaW5kaWNhdGluZyB0aGUKKyAgLy8vIGZpeGVkIG9mZnNldCBmcm9tIHRoZSBpbmNvbWluZyBzdGFjayBwb2ludGVyIHRoYXQgZWFjaCByZWdpc3RlciBzaG91bGQgYmUKKyAgLy8vIHNwaWxsZWQgYXQuIElmIGEgcmVnaXN0ZXIgaXMgbm90IGxpc3RlZCBoZXJlLCB0aGUgY29kZSBnZW5lcmF0b3IgaXMKKyAgLy8vIGFsbG93ZWQgdG8gc3BpbGwgaXQgYW55d2hlcmUgaXQgY2hvb3Nlcy4KKyAgLy8vCisgIHZpcnR1YWwgY29uc3QgU3BpbGxTbG90ICoKKyAgZ2V0Q2FsbGVlU2F2ZWRTcGlsbFNsb3RzKHVuc2lnbmVkICZOdW1FbnRyaWVzKSBjb25zdCB7CisgICAgTnVtRW50cmllcyA9IDA7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gdGFyZ2V0SGFuZGxlc1N0YWNrRnJhbWVSb3VuZGluZyAtIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGFyZ2V0IGlzCisgIC8vLyByZXNwb25zaWJsZSBmb3Igcm91bmRpbmcgdXAgdGhlIHN0YWNrIGZyYW1lIChwcm9iYWJseSBhdCBlbWl0UHJvbG9ndWUKKyAgLy8vIHRpbWUpLgorICB2aXJ0dWFsIGJvb2wgdGFyZ2V0SGFuZGxlc1N0YWNrRnJhbWVSb3VuZGluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0YXJnZXQgd2lsbCBjb3JyZWN0bHkgaGFuZGxlIHNocmluayB3cmFwcGluZy4KKyAgdmlydHVhbCBib29sIGVuYWJsZVNocmlua1dyYXBwaW5nKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzdGFjayBzbG90IGhvbGVzIGluIHRoZSBmaXhlZCBhbmQgY2FsbGVlLXNhdmUgc3RhY2sKKyAgLy8vIGFyZWEgc2hvdWxkIGJlIHVzZWQgd2hlbiBhbGxvY2F0aW5nIG90aGVyIHN0YWNrIGxvY2F0aW9ucyB0byByZWR1Y2Ugc3RhY2sKKyAgLy8vIHNpemUuCisgIHZpcnR1YWwgYm9vbCBlbmFibGVTdGFja1Nsb3RTY2F2ZW5naW5nKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gZW1pdFByb2xvZy9lbWl0RXBpbG9nIC0gVGhlc2UgbWV0aG9kcyBpbnNlcnQgcHJvbG9nIGFuZCBlcGlsb2cgY29kZSBpbnRvCisgIC8vLyB0aGUgZnVuY3Rpb24uCisgIHZpcnR1YWwgdm9pZCBlbWl0UHJvbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBlbWl0RXBpbG9ndWUoTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSBjb25zdCA9IDA7CisKKyAgLy8vIFJlcGxhY2UgYSBTdGFja1Byb2JlIHN0dWIgKGlmIGFueSkgd2l0aCB0aGUgYWN0dWFsIHByb2JlIGNvZGUgaW5saW5lCisgIHZpcnR1YWwgdm9pZCBpbmxpbmVTdGFja1Byb2JlKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZQcm9sb2d1ZU1CQikgY29uc3Qge30KKworICAvLy8gQWRqdXN0IHRoZSBwcm9sb2d1ZSB0byBoYXZlIHRoZSBmdW5jdGlvbiB1c2Ugc2VnbWVudGVkIHN0YWNrcy4gVGhpcyB3b3JrcworICAvLy8gYnkgYWRkaW5nIGEgY2hlY2sgZXZlbiBiZWZvcmUgdGhlICJub3JtYWwiIGZ1bmN0aW9uIHByb2xvZ3VlLgorICB2aXJ0dWFsIHZvaWQgYWRqdXN0Rm9yU2VnbWVudGVkU3RhY2tzKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJlByb2xvZ3VlTUJCKSBjb25zdCB7fQorCisgIC8vLyBBZGp1c3QgdGhlIHByb2xvZ3VlIHRvIGFkZCBFcmxhbmcgUnVuLVRpbWUgU3lzdGVtIChFUlRTKSBzcGVjaWZpYyBjb2RlIGluCisgIC8vLyB0aGUgYXNzZW1ibHkgcHJvbG9ndWUgdG8gZXhwbGljaXRseSBoYW5kbGUgdGhlIHN0YWNrLgorICB2aXJ0dWFsIHZvaWQgYWRqdXN0Rm9ySGlQRVByb2xvZ3VlKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgJlByb2xvZ3VlTUJCKSBjb25zdCB7fQorCisgIC8vLyBzcGlsbENhbGxlZVNhdmVkUmVnaXN0ZXJzIC0gSXNzdWVzIGluc3RydWN0aW9uKHMpIHRvIHNwaWxsIGFsbCBjYWxsZWUKKyAgLy8vIHNhdmVkIHJlZ2lzdGVycyBhbmQgcmV0dXJucyB0cnVlIGlmIGl0IGlzbid0IHBvc3NpYmxlIC8gcHJvZml0YWJsZSB0byBkbworICAvLy8gc28gYnkgaXNzdWluZyBhIHNlcmllcyBvZiBzdG9yZSBpbnN0cnVjdGlvbnMgdmlhCisgIC8vLyBzdG9yZVJlZ1RvU3RhY2tTbG90KCkuIFJldHVybnMgZmFsc2Ugb3RoZXJ3aXNlLgorICB2aXJ0dWFsIGJvb2wgc3BpbGxDYWxsZWVTYXZlZFJlZ2lzdGVycyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Q2FsbGVlU2F2ZWRJbmZvPiAmQ1NJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyByZXN0b3JlQ2FsbGVlU2F2ZWRSZWdpc3RlcnMgLSBJc3N1ZXMgaW5zdHJ1Y3Rpb24ocykgdG8gcmVzdG9yZSBhbGwgY2FsbGVlCisgIC8vLyBzYXZlZCByZWdpc3RlcnMgYW5kIHJldHVybnMgdHJ1ZSBpZiBpdCBpc24ndCBwb3NzaWJsZSAvIHByb2ZpdGFibGUgdG8gZG8KKyAgLy8vIHNvIGJ5IGlzc3VpbmcgYSBzZXJpZXMgb2YgbG9hZCBpbnN0cnVjdGlvbnMgdmlhIGxvYWRSZWdUb1N0YWNrU2xvdCgpLgorICAvLy8gSWYgaXQgcmV0dXJucyB0cnVlLCBhbmQgYW55IG9mIHRoZSByZWdpc3RlcnMgaW4gQ1NJIGlzIG5vdCByZXN0b3JlZCwKKyAgLy8vIGl0IHNldHMgdGhlIGNvcnJlc3BvbmRpbmcgUmVzdG9yZWQgZmxhZyBpbiBDU0kgdG8gZmFsc2UuCisgIC8vLyBSZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KKyAgdmlydHVhbCBib29sIHJlc3RvcmVDYWxsZWVTYXZlZFJlZ2lzdGVycyhNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDYWxsZWVTYXZlZEluZm8+ICZDU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBuZWVkcyB0byBkaXNhYmxlIGZyYW1lIHBvaW50ZXIgZWxpbWluYXRpb24uCisgIHZpcnR1YWwgYm9vbCBub0ZyYW1lUG9pbnRlckVsaW0oY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgLy8vIGhhc0ZQIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBzaG91bGQgaGF2ZSBhIGRlZGljYXRlZAorICAvLy8gZnJhbWUgcG9pbnRlciByZWdpc3Rlci4gRm9yIG1vc3QgdGFyZ2V0cyB0aGlzIGlzIHRydWUgb25seSBpZiB0aGUgZnVuY3Rpb24KKyAgLy8vIGhhcyB2YXJpYWJsZSBzaXplZCBhbGxvY2FzIG9yIGlmIGZyYW1lIHBvaW50ZXIgZWxpbWluYXRpb24gaXMgZGlzYWJsZWQuCisgIHZpcnR1YWwgYm9vbCBoYXNGUChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCA9IDA7CisKKyAgLy8vIGhhc1Jlc2VydmVkQ2FsbEZyYW1lIC0gVW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMsIHdoZW4gYSBmcmFtZSBwb2ludGVyIGlzCisgIC8vLyBub3QgcmVxdWlyZWQsIHdlIHJlc2VydmUgYXJndW1lbnQgc3BhY2UgZm9yIGNhbGwgc2l0ZXMgaW4gdGhlIGZ1bmN0aW9uCisgIC8vLyBpbW1lZGlhdGVseSBvbiBlbnRyeSB0byB0aGUgY3VycmVudCBmdW5jdGlvbi4gVGhpcyBlbGltaW5hdGVzIHRoZSBuZWVkIGZvcgorICAvLy8gYWRkL3N1YiBzcCBicmFja2V0cyBhcm91bmQgY2FsbCBzaXRlcy4gUmV0dXJucyB0cnVlIGlmIHRoZSBjYWxsIGZyYW1lIGlzCisgIC8vLyBpbmNsdWRlZCBhcyBwYXJ0IG9mIHRoZSBzdGFjayBmcmFtZS4KKyAgdmlydHVhbCBib29sIGhhc1Jlc2VydmVkQ2FsbEZyYW1lKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICByZXR1cm4gIWhhc0ZQKE1GKTsKKyAgfQorCisgIC8vLyBjYW5TaW1wbGlmeUNhbGxGcmFtZVBzZXVkb3MgLSBXaGVuIHBvc3NpYmxlLCBpdCdzIGJlc3QgdG8gc2ltcGxpZnkgdGhlCisgIC8vLyBjYWxsIGZyYW1lIHBzZXVkbyBvcHMgYmVmb3JlIGRvaW5nIGZyYW1lIGluZGV4IGVsaW1pbmF0aW9uLiBUaGlzIGlzCisgIC8vLyBwb3NzaWJsZSBvbmx5IHdoZW4gZnJhbWUgaW5kZXggcmVmZXJlbmNlcyBiZXR3ZWVuIHRoZSBwc2V1ZG9zIHdvbid0CisgIC8vLyBuZWVkIGFkanVzdGluZyBmb3IgdGhlIGNhbGwgZnJhbWUgYWRqdXN0bWVudHMuIE5vcm1hbGx5LCB0aGF0J3MgdHJ1ZQorICAvLy8gaWYgdGhlIGZ1bmN0aW9uIGhhcyBhIHJlc2VydmVkIGNhbGwgZnJhbWUgb3IgYSBmcmFtZSBwb2ludGVyLiBTb21lCisgIC8vLyB0YXJnZXRzIChUaHVtYjIsIGZvciBleGFtcGxlKSBtYXkgaGF2ZSBtb3JlIGNvbXBsaWNhdGVkIGNyaXRlcmlhLAorICAvLy8gaG93ZXZlciwgYW5kIGNhbiBvdmVycmlkZSB0aGlzIGJlaGF2aW9yLgorICB2aXJ0dWFsIGJvb2wgY2FuU2ltcGxpZnlDYWxsRnJhbWVQc2V1ZG9zKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzUmVzZXJ2ZWRDYWxsRnJhbWUoTUYpIHx8IGhhc0ZQKE1GKTsKKyAgfQorCisgIC8vIG5lZWRzRnJhbWVJbmRleFJlc29sdXRpb24gLSBEbyB3ZSBuZWVkIHRvIHBlcmZvcm0gRkkgcmVzb2x1dGlvbiBmb3IKKyAgLy8gdGhpcyBmdW5jdGlvbi4gTm9ybWFsbHksIHRoaXMgaXMgcmVxdWlyZWQgb25seSB3aGVuIHRoZSBmdW5jdGlvbgorICAvLyBoYXMgYW55IHN0YWNrIG9iamVjdHMuIEhvd2V2ZXIsIHRhcmdldHMgbWF5IHdhbnQgdG8gb3ZlcnJpZGUgdGhpcy4KKyAgdmlydHVhbCBib29sIG5lZWRzRnJhbWVJbmRleFJlc29sdXRpb24oY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgLy8vIGdldEZyYW1lSW5kZXhSZWZlcmVuY2UgLSBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSBiYXNlIHJlZ2lzdGVyCisgIC8vLyBhbmQgb2Zmc2V0IHVzZWQgdG8gcmVmZXJlbmNlIGEgZnJhbWUgaW5kZXggbG9jYXRpb24uIFRoZSBvZmZzZXQgaXMKKyAgLy8vIHJldHVybmVkIGRpcmVjdGx5LCBhbmQgdGhlIGJhc2UgcmVnaXN0ZXIgaXMgcmV0dXJuZWQgdmlhIEZyYW1lUmVnLgorICB2aXJ0dWFsIGludCBnZXRGcmFtZUluZGV4UmVmZXJlbmNlKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsIGludCBGSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmRnJhbWVSZWcpIGNvbnN0OworCisgIC8vLyBTYW1lIGFzIFxjIGdldEZyYW1lSW5kZXhSZWZlcmVuY2UsIGV4Y2VwdCB0aGF0IHRoZSBzdGFjayBwb2ludGVyIChhcworICAvLy8gb3Bwb3NlZCB0byB0aGUgZnJhbWUgcG9pbnRlcikgd2lsbCBiZSB0aGUgcHJlZmVycmVkIHZhbHVlIGZvciBccAorICAvLy8gRnJhbWVSZWcuIFRoaXMgaXMgZ2VuZXJhbGx5IHVzZWQgZm9yIGVtaXR0aW5nIHN0YXRlcG9pbnQgb3IgRUggdGFibGVzIHRoYXQKKyAgLy8vIHVzZSBvZmZzZXRzIGZyb20gUlNQLiAgSWYgXHAgSWdub3JlU1BVcGRhdGVzIGlzIHRydWUsIHRoZSByZXR1cm5lZAorICAvLy8gb2Zmc2V0IGlzIG9ubHkgZ3VhcmFudGVlZCB0byBiZSB2YWxpZCB3aXRoIHJlc3BlY3QgdG8gdGhlIHZhbHVlIG9mIFNQIGF0CisgIC8vLyB0aGUgZW5kIG9mIHRoZSBwcm9sb2d1ZS4KKyAgdmlydHVhbCBpbnQgZ2V0RnJhbWVJbmRleFJlZmVyZW5jZVByZWZlclNQKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsIGludCBGSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZGcmFtZVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSWdub3JlU1BVcGRhdGVzKSBjb25zdCB7CisgICAgLy8gQWx3YXlzIHNhZmUgdG8gZGlzcGF0Y2ggdG8gZ2V0RnJhbWVJbmRleFJlZmVyZW5jZS4KKyAgICByZXR1cm4gZ2V0RnJhbWVJbmRleFJlZmVyZW5jZShNRiwgRkksIEZyYW1lUmVnKTsKKyAgfQorCisgIC8vLyBUaGlzIG1ldGhvZCBkZXRlcm1pbmVzIHdoaWNoIG9mIHRoZSByZWdpc3RlcnMgcmVwb3J0ZWQgYnkKKyAgLy8vIFRhcmdldFJlZ2lzdGVySW5mbzo6Z2V0Q2FsbGVlU2F2ZWRSZWdzKCkgc2hvdWxkIGFjdHVhbGx5IGdldCBzYXZlZC4KKyAgLy8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGNoZWNrcyBwb3B1bGF0ZXMgdGhlIFxwIFNhdmVkUmVncyBiaXRzZXQgd2l0aAorICAvLy8gYWxsIHJlZ2lzdGVycyB3aGljaCBhcmUgbW9kaWZpZWQgaW4gdGhlIGZ1bmN0aW9uLCB0YXJnZXRzIG1heSBvdmVycmlkZQorICAvLy8gdGhpcyBmdW5jdGlvbiB0byBzYXZlIGFkZGl0aW9uYWwgcmVnaXN0ZXJzLgorICAvLy8gVGhpcyBtZXRob2QgYWxzbyBzZXRzIHVwIHRoZSByZWdpc3RlciBzY2F2ZW5nZXIgZW5zdXJpbmcgdGhlcmUgaXMgYSBmcmVlCisgIC8vLyByZWdpc3RlciBvciBhIGZyYW1laW5kZXggYXZhaWxhYmxlLgorICB2aXJ0dWFsIHZvaWQgZGV0ZXJtaW5lQ2FsbGVlU2F2ZXMoTWFjaGluZUZ1bmN0aW9uICZNRiwgQml0VmVjdG9yICZTYXZlZFJlZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdTY2F2ZW5nZXIgKlJTID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIHByb2Nlc3NGdW5jdGlvbkJlZm9yZUZyYW1lRmluYWxpemVkIC0gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGltbWVkaWF0ZWx5CisgIC8vLyBiZWZvcmUgdGhlIHNwZWNpZmllZCBmdW5jdGlvbidzIGZyYW1lIGxheW91dCAoTUYuZ2V0RnJhbWVJbmZvKCkpIGlzCisgIC8vLyBmaW5hbGl6ZWQuICBPbmNlIHRoZSBmcmFtZSBpcyBmaW5hbGl6ZWQsIE1PX0ZyYW1lSW5kZXggb3BlcmFuZHMgYXJlCisgIC8vLyByZXBsYWNlZCB3aXRoIGRpcmVjdCBjb25zdGFudHMuICBUaGlzIG1ldGhvZCBpcyBvcHRpb25hbC4KKyAgLy8vCisgIHZpcnR1YWwgdm9pZCBwcm9jZXNzRnVuY3Rpb25CZWZvcmVGcmFtZUZpbmFsaXplZChNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUyA9IG51bGxwdHIpIGNvbnN0IHsKKyAgfQorCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0V2luRUhQYXJlbnRGcmFtZU9mZnNldChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJXaW5FSCBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgdGFyZ2V0Iik7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGR1cmluZyBwcm9sb2cvZXBpbG9nIGNvZGUgaW5zZXJ0aW9uIHRvIGVsaW1pbmF0ZQorICAvLy8gY2FsbCBmcmFtZSBzZXR1cCBhbmQgZGVzdHJveSBwc2V1ZG8gaW5zdHJ1Y3Rpb25zIChidXQgb25seSBpZiB0aGUgVGFyZ2V0CisgIC8vLyBpcyB1c2luZyB0aGVtKS4gIEl0IGlzIHJlc3BvbnNpYmxlIGZvciBlbGltaW5hdGluZyB0aGVzZSBpbnN0cnVjdGlvbnMsCisgIC8vLyByZXBsYWNpbmcgdGhlbSB3aXRoIGNvbmNyZXRlIGluc3RydWN0aW9ucy4gIFRoaXMgbWV0aG9kIG5lZWQgb25seSBiZQorICAvLy8gaW1wbGVtZW50ZWQgaWYgdXNpbmcgY2FsbCBmcmFtZSBzZXR1cC9kZXN0cm95IHBzZXVkbyBpbnN0cnVjdGlvbnMuCisgIC8vLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBpbnN0cnVjdGlvbiBhZnRlciB0aGUgcmVwbGFjZWQgb25lLgorICB2aXJ0dWFsIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvcgorICBlbGltaW5hdGVDYWxsRnJhbWVQc2V1ZG9JbnN0cihNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUkpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJDYWxsIEZyYW1lIFBzZXVkbyBJbnN0cnVjdGlvbnMgZG8gbm90IGV4aXN0IG9uIHRoaXMgIgorICAgICAgICAgICAgICAgICAgICAgInRhcmdldCEiKTsKKyAgfQorCisKKyAgLy8vIE9yZGVyIHRoZSBzeW1ib2xzIGluIHRoZSBsb2NhbCBzdGFjayBmcmFtZS4KKyAgLy8vIFRoZSBsaXN0IG9mIG9iamVjdHMgdGhhdCB3ZSB3YW50IHRvIG9yZGVyIGlzIGluIFxwIG9iamVjdHNUb0FsbG9jYXRlIGFzCisgIC8vLyBpbmRpY2VzIGludG8gdGhlIE1hY2hpbmVGcmFtZUluZm8uIFRoZSBhcnJheSBjYW4gYmUgcmVvcmRlcmVkIGluIGFueSB3YXkKKyAgLy8vIHVwb24gcmV0dXJuLiBUaGUgY29udGVudHMgb2YgdGhlIGFycmF5LCBob3dldmVyLCBtYXkgbm90IGJlIG1vZGlmaWVkIChpLmUuCisgIC8vLyBvbmx5IHRoZWlyIG9yZGVyIG1heSBiZSBjaGFuZ2VkKS4KKyAgLy8vIEJ5IGRlZmF1bHQsIGp1c3QgbWFpbnRhaW4gdGhlIG9yaWdpbmFsIG9yZGVyLgorICB2aXJ0dWFsIHZvaWQKKyAgb3JkZXJGcmFtZU9iamVjdHMoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGludD4gJm9iamVjdHNUb0FsbG9jYXRlKSBjb25zdCB7CisgIH0KKworICAvLy8gQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIFxwIE1CQiBjYW4gYmUgdXNlZCBhcyBhIHByb2xvZ3VlCisgIC8vLyBmb3IgdGhlIHRhcmdldC4KKyAgLy8vIFRoZSBwcm9sb2d1ZSB3aWxsIGJlIGluc2VydGVkIGZpcnN0IGluIHRoaXMgYmFzaWMgYmxvY2suCisgIC8vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSBzaHJpbmstd3JhcHBpbmcgcGFzcyB0byBkZWNpZGUgaWYKKyAgLy8vIFxwIE1CQiB3aWxsIGJlIGNvcnJlY3RseSBoYW5kbGVkIGJ5IHRoZSB0YXJnZXQuCisgIC8vLyBBcyBzb29uIGFzIHRoZSB0YXJnZXQgZW5hYmxlIHNocmluay13cmFwcGluZyB3aXRob3V0IG92ZXJyaWRpbmcKKyAgLy8vIHRoaXMgbWV0aG9kLCB3ZSBhc3N1bWUgdGhhdCBlYWNoIGJhc2ljIGJsb2NrIGlzIGEgdmFsaWQKKyAgLy8vIHByb2xvZ3VlLgorICB2aXJ0dWFsIGJvb2wgY2FuVXNlQXNQcm9sb2d1ZShjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAmTUJCKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gQ2hlY2sgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIFxwIE1CQiBjYW4gYmUgdXNlZCBhcyBhIGVwaWxvZ3VlCisgIC8vLyBmb3IgdGhlIHRhcmdldC4KKyAgLy8vIFRoZSBlcGlsb2d1ZSB3aWxsIGJlIGluc2VydGVkIGJlZm9yZSB0aGUgZmlyc3QgdGVybWluYXRvciBvZiB0aGF0IGJsb2NrLgorICAvLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBieSB0aGUgc2hyaW5rLXdyYXBwaW5nIHBhc3MgdG8gZGVjaWRlIGlmCisgIC8vLyBccCBNQkIgd2lsbCBiZSBjb3JyZWN0bHkgaGFuZGxlZCBieSB0aGUgdGFyZ2V0LgorICAvLy8gQXMgc29vbiBhcyB0aGUgdGFyZ2V0IGVuYWJsZSBzaHJpbmstd3JhcHBpbmcgd2l0aG91dCBvdmVycmlkaW5nCisgIC8vLyB0aGlzIG1ldGhvZCwgd2UgYXNzdW1lIHRoYXQgZWFjaCBiYXNpYyBibG9jayBpcyBhIHZhbGlkCisgIC8vLyBlcGlsb2d1ZS4KKyAgdmlydHVhbCBib29sIGNhblVzZUFzRXBpbG9ndWUoY29uc3QgTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIENoZWNrIGlmIGdpdmVuIGZ1bmN0aW9uIGlzIHNhZmUgZm9yIG5vdCBoYXZpbmcgY2FsbGVlIHNhdmVkIHJlZ2lzdGVycy4KKyAgLy8vIFRoaXMgaXMgdXNlZCB3aGVuIGludGVycHJvY2VkdXJhbCByZWdpc3RlciBhbGxvY2F0aW9uIGlzIGVuYWJsZWQuCisgIHN0YXRpYyBib29sIGlzU2FmZUZvck5vQ1NST3B0KGNvbnN0IEZ1bmN0aW9uICZGKSB7CisgICAgaWYgKCFGLmhhc0xvY2FsTGlua2FnZSgpIHx8IEYuaGFzQWRkcmVzc1Rha2VuKCkgfHwKKyAgICAgICAgIUYuaGFzRm5BdHRyaWJ1dGUoQXR0cmlidXRlOjpOb1JlY3Vyc2UpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIEZ1bmN0aW9uIHNob3VsZCBub3QgYmUgb3B0aW1pemVkIGFzIHRhaWwgY2FsbC4KKyAgICBmb3IgKGNvbnN0IFVzZXIgKlUgOiBGLnVzZXJzKCkpCisgICAgICBpZiAoYXV0byBDUyA9IEltbXV0YWJsZUNhbGxTaXRlKFUpKQorICAgICAgICBpZiAoQ1MuaXNUYWlsQ2FsbCgpKQorICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVGFyZ2V0SW5zdHJJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVGFyZ2V0SW5zdHJJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMyYTUzMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYXJnZXRJbnN0ckluZm8uaApAQCAtMCwwICsxLDE3MTAgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vVGFyZ2V0SW5zdHJJbmZvLmggLSBJbnN0cnVjdGlvbiBJbmZvIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgdGFyZ2V0IG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0IHRvIHRoZSBjb2RlIGdlbmVyYXRvci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFSR0VUX1RBUkdFVElOU1RSSU5GT19ICisjZGVmaW5lIExMVk1fVEFSR0VUX1RBUkdFVElOU1RSSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXBJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lQ29tYmluZXJQYXR0ZXJuLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVGdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9NYWNoaW5lSW5zdHIuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUxvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL01hY2hpbmVPcGVyYW5kLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1BzZXVkb1NvdXJjZVZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3RySW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CcmFuY2hQcm9iYWJpbGl0eS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgREZBUGFja2V0aXplcjsKK2NsYXNzIEluc3RySXRpbmVyYXJ5RGF0YTsKK2NsYXNzIExpdmVJbnRlcnZhbHM7CitjbGFzcyBMaXZlVmFyaWFibGVzOworY2xhc3MgTWFjaGluZU1lbU9wZXJhbmQ7CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworY2xhc3MgTUNBc21JbmZvOworY2xhc3MgTUNJbnN0Oworc3RydWN0IE1DU2NoZWRNb2RlbDsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIFNjaGVkdWxlREFHOworY2xhc3MgU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyOworY2xhc3MgU0ROb2RlOworY2xhc3MgU2VsZWN0aW9uREFHOworY2xhc3MgUmVnU2NhdmVuZ2VyOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJDbGFzczsKK2NsYXNzIFRhcmdldFJlZ2lzdGVySW5mbzsKK2NsYXNzIFRhcmdldFNjaGVkTW9kZWw7CitjbGFzcyBUYXJnZXRTdWJ0YXJnZXRJbmZvOworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgU21hbGxWZWN0b3JJbXBsOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vCisvLy8gVGFyZ2V0SW5zdHJJbmZvIC0gSW50ZXJmYWNlIHRvIGRlc2NyaXB0aW9uIG9mIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0CisvLy8KK2NsYXNzIFRhcmdldEluc3RySW5mbyA6IHB1YmxpYyBNQ0luc3RySW5mbyB7CitwdWJsaWM6CisgIFRhcmdldEluc3RySW5mbyh1bnNpZ25lZCBDRlNldHVwT3Bjb2RlID0gfjB1LCB1bnNpZ25lZCBDRkRlc3Ryb3lPcGNvZGUgPSB+MHUsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDYXRjaFJldE9wY29kZSA9IH4wdSwgdW5zaWduZWQgUmV0dXJuT3Bjb2RlID0gfjB1KQorICAgICAgOiBDYWxsRnJhbWVTZXR1cE9wY29kZShDRlNldHVwT3Bjb2RlKSwKKyAgICAgICAgQ2FsbEZyYW1lRGVzdHJveU9wY29kZShDRkRlc3Ryb3lPcGNvZGUpLCBDYXRjaFJldE9wY29kZShDYXRjaFJldE9wY29kZSksCisgICAgICAgIFJldHVybk9wY29kZShSZXR1cm5PcGNvZGUpIHt9CisgIFRhcmdldEluc3RySW5mbyhjb25zdCBUYXJnZXRJbnN0ckluZm8gJikgPSBkZWxldGU7CisgIFRhcmdldEluc3RySW5mbyAmb3BlcmF0b3I9KGNvbnN0IFRhcmdldEluc3RySW5mbyAmKSA9IGRlbGV0ZTsKKyAgdmlydHVhbCB+VGFyZ2V0SW5zdHJJbmZvKCk7CisKKyAgc3RhdGljIGJvb2wgaXNHZW5lcmljT3Bjb2RlKHVuc2lnbmVkIE9wYykgeworICAgIHJldHVybiBPcGMgPD0gVGFyZ2V0T3Bjb2RlOjpHRU5FUklDX09QX0VORDsKKyAgfQorCisgIC8vLyBHaXZlbiBhIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gZGVzY3JpcHRvciwgcmV0dXJucyB0aGUgcmVnaXN0ZXIKKyAgLy8vIGNsYXNzIGNvbnN0cmFpbnQgZm9yIE9wTnVtLCBvciBOVUxMLgorICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpnZXRSZWdDbGFzcyhjb25zdCBNQ0luc3RyRGVzYyAmVElELCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgdHJpdmlhbGx5IHJlbWF0ZXJpYWxpemFibGUsIG1lYW5pbmcgaXQKKyAgLy8vIGhhcyBubyBzaWRlIGVmZmVjdHMgYW5kIHJlcXVpcmVzIG5vIG9wZXJhbmRzIHRoYXQgYXJlbid0IGFsd2F5cyBhdmFpbGFibGUuCisgIC8vLyBUaGlzIG1lYW5zIHRoZSBvbmx5IGFsbG93ZWQgdXNlcyBhcmUgY29uc3RhbnRzIGFuZCB1bmFsbG9jYXRhYmxlIHBoeXNpY2FsCisgIC8vLyByZWdpc3RlcnMgc28gdGhhdCB0aGUgaW5zdHJ1Y3Rpb25zIHJlc3VsdCBpcyBpbmRlcGVuZGVudCBvZiB0aGUgcGxhY2UKKyAgLy8vIGluIHRoZSBmdW5jdGlvbi4KKyAgYm9vbCBpc1RyaXZpYWxseVJlTWF0ZXJpYWxpemFibGUoY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNBbmFseXNpcyAqQUEgPSBudWxscHRyKSBjb25zdCB7CisgICAgcmV0dXJuIE1JLmdldE9wY29kZSgpID09IFRhcmdldE9wY29kZTo6SU1QTElDSVRfREVGIHx8CisgICAgICAgICAgIChNSS5nZXREZXNjKCkuaXNSZW1hdGVyaWFsaXphYmxlKCkgJiYKKyAgICAgICAgICAgIChpc1JlYWxseVRyaXZpYWxseVJlTWF0ZXJpYWxpemFibGUoTUksIEFBKSB8fAorICAgICAgICAgICAgIGlzUmVhbGx5VHJpdmlhbGx5UmVNYXRlcmlhbGl6YWJsZUdlbmVyaWMoTUksIEFBKSkpOworICB9CisKK3Byb3RlY3RlZDoKKyAgLy8vIEZvciBpbnN0cnVjdGlvbnMgd2l0aCBvcGNvZGVzIGZvciB3aGljaCB0aGUgTV9SRU1BVEVSSUFMSVpBQkxFIGZsYWcgaXMKKyAgLy8vIHNldCwgdGhpcyBob29rIGxldHMgdGhlIHRhcmdldCBzcGVjaWZ5IHdoZXRoZXIgdGhlIGluc3RydWN0aW9uIGlzIGFjdHVhbGx5CisgIC8vLyB0cml2aWFsbHkgcmVtYXRlcmlhbGl6YWJsZSwgdGFraW5nIGludG8gY29uc2lkZXJhdGlvbiBpdHMgb3BlcmFuZHMuIFRoaXMKKyAgLy8vIHByZWRpY2F0ZSBtdXN0IHJldHVybiBmYWxzZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIGFueSBzaWRlIGVmZmVjdHMgb3RoZXIKKyAgLy8vIHRoYW4gcHJvZHVjaW5nIGEgdmFsdWUsIG9yIGlmIGl0IHJlcXVyZXMgYW55IGFkZHJlc3MgcmVnaXN0ZXJzIHRoYXQgYXJlCisgIC8vLyBub3QgYWx3YXlzIGF2YWlsYWJsZS4KKyAgLy8vIFJlcXVpcmVtZW50cyBtdXN0IGJlIGNoZWNrIGFzIHN0YXRlZCBpbiBpc1RyaXZpYWxseVJlTWF0ZXJpYWxpemFibGUoKSAuCisgIHZpcnR1YWwgYm9vbCBpc1JlYWxseVRyaXZpYWxseVJlTWF0ZXJpYWxpemFibGUoY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGlhc0FuYWx5c2lzICpBQSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBUaGlzIG1ldGhvZCBjb21tdXRlcyB0aGUgb3BlcmFuZHMgb2YgdGhlIGdpdmVuIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gTUkuCisgIC8vLyBUaGUgb3BlcmFuZHMgdG8gYmUgY29tbXV0ZWQgYXJlIHNwZWNpZmllZCBieSB0aGVpciBpbmRpY2VzIE9wSWR4MSBhbmQKKyAgLy8vIE9wSWR4Mi4KKyAgLy8vCisgIC8vLyBJZiBhIHRhcmdldCBoYXMgYW55IGluc3RydWN0aW9ucyB0aGF0IGFyZSBjb21tdXRhYmxlIGJ1dCByZXF1aXJlCisgIC8vLyBjb252ZXJ0aW5nIHRvIGRpZmZlcmVudCBpbnN0cnVjdGlvbnMgb3IgbWFraW5nIG5vbi10cml2aWFsIGNoYW5nZXMKKyAgLy8vIHRvIGNvbW11dGUgdGhlbSwgdGhpcyBtZXRob2QgY2FuIGJlIG92ZXJsb2FkZWQgdG8gZG8gdGhhdC4KKyAgLy8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHNpbXBseSBzd2FwcyB0aGUgY29tbXV0YWJsZSBvcGVyYW5kcy4KKyAgLy8vCisgIC8vLyBJZiBOZXdNSSBpcyBmYWxzZSwgTUkgaXMgbW9kaWZpZWQgaW4gcGxhY2UgYW5kIHJldHVybmVkOyBvdGhlcndpc2UsIGEKKyAgLy8vIG5ldyBtYWNoaW5lIGluc3RydWN0aW9uIGlzIGNyZWF0ZWQgYW5kIHJldHVybmVkLgorICAvLy8KKyAgLy8vIERvIG5vdCBjYWxsIHRoaXMgbWV0aG9kIGZvciBhIG5vbi1jb21tdXRhYmxlIGluc3RydWN0aW9uLgorICAvLy8gRXZlbiB0aG91Z2ggdGhlIGluc3RydWN0aW9uIGlzIGNvbW11dGFibGUsIHRoZSBtZXRob2QgbWF5IHN0aWxsCisgIC8vLyBmYWlsIHRvIGNvbW11dGUgdGhlIG9wZXJhbmRzLCBudWxsIHBvaW50ZXIgaXMgcmV0dXJuZWQgaW4gc3VjaCBjYXNlcy4KKyAgdmlydHVhbCBNYWNoaW5lSW5zdHIgKmNvbW11dGVJbnN0cnVjdGlvbkltcGwoTWFjaGluZUluc3RyICZNSSwgYm9vbCBOZXdNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BJZHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcElkeDIpIGNvbnN0OworCisgIC8vLyBBc3NpZ25zIHRoZSAoQ29tbXV0YWJsZU9wSWR4MSwgQ29tbXV0YWJsZU9wSWR4MikgcGFpciBvZiBjb21tdXRhYmxlCisgIC8vLyBvcGVyYW5kIGluZGljZXMgdG8gKFJlc3VsdElkeDEsIFJlc3VsdElkeDIpLgorICAvLy8gT25lIG9yIGJvdGggaW5wdXQgdmFsdWVzIG9mIHRoZSBwYWlyOiAoUmVzdWx0SWR4MSwgUmVzdWx0SWR4MikgbWF5IGJlCisgIC8vLyBwcmVkZWZpbmVkIHRvIHNvbWUgaW5kaWNlcyBvciBiZSB1bmRlZmluZWQgKGRlc2lnbmF0ZWQgYnkgdGhlIHNwZWNpYWwKKyAgLy8vIHZhbHVlICdDb21tdXRlQW55T3BlcmFuZEluZGV4JykuCisgIC8vLyBUaGUgcHJlZGVmaW5lZCByZXN1bHQgaW5kaWNlcyBjYW5ub3QgYmUgcmUtZGVmaW5lZC4KKyAgLy8vIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWZmIGFmdGVyIHRoZSByZXN1bHQgcGFpciByZWRlZmluaXRpb24KKyAgLy8vIHRoZSBmaXhlZCByZXN1bHQgcGFpciBpcyBlcXVhbCB0byBvciBlcXVpdmFsZW50IHRvIHRoZSBzb3VyY2UgcGFpciBvZgorICAvLy8gaW5kaWNlczogKENvbW11dGFibGVPcElkeDEsIENvbW11dGFibGVPcElkeDIpLiBJdCBpcyBhc3N1bWVkIGhlcmUgdGhhdAorICAvLy8gdGhlIHBhaXJzICh4LHkpIGFuZCAoeSx4KSBhcmUgZXF1aXZhbGVudC4KKyAgc3RhdGljIGJvb2wgZml4Q29tbXV0ZWRPcEluZGljZXModW5zaWduZWQgJlJlc3VsdElkeDEsIHVuc2lnbmVkICZSZXN1bHRJZHgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb21tdXRhYmxlT3BJZHgxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb21tdXRhYmxlT3BJZHgyKTsKKworcHJpdmF0ZToKKyAgLy8vIEZvciBpbnN0cnVjdGlvbnMgd2l0aCBvcGNvZGVzIGZvciB3aGljaCB0aGUgTV9SRU1BVEVSSUFMSVpBQkxFIGZsYWcgaXMKKyAgLy8vIHNldCBhbmQgdGhlIHRhcmdldCBob29rIGlzUmVhbGx5VHJpdmlhbGx5UmVNYXRlcmlhbGl6YWJsZSByZXR1cm5zIGZhbHNlLAorICAvLy8gdGhpcyBmdW5jdGlvbiBkb2VzIHRhcmdldC1pbmRlcGVuZGVudCB0ZXN0cyB0byBkZXRlcm1pbmUgaWYgdGhlCisgIC8vLyBpbnN0cnVjdGlvbiBpcyByZWFsbHkgdHJpdmlhbGx5IHJlbWF0ZXJpYWxpemFibGUuCisgIGJvb2wgaXNSZWFsbHlUcml2aWFsbHlSZU1hdGVyaWFsaXphYmxlR2VuZXJpYyhjb25zdCBNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWxpYXNBbmFseXNpcyAqQUEpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBUaGVzZSBtZXRob2RzIHJldHVybiB0aGUgb3Bjb2RlIG9mIHRoZSBmcmFtZSBzZXR1cC9kZXN0cm95IGluc3RydWN0aW9ucworICAvLy8gaWYgdGhleSBleGlzdCAoLTEgb3RoZXJ3aXNlKS4gIFNvbWUgdGFyZ2V0cyB1c2UgcHNldWRvIGluc3RydWN0aW9ucyBpbgorICAvLy8gb3JkZXIgdG8gYWJzdHJhY3QgYXdheSB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9wZXJhdGluZyB3aXRoIGEgZnJhbWUKKyAgLy8vIHBvaW50ZXIgYW5kIG9wZXJhdGluZyB3aXRob3V0LCB0aHJvdWdoIHRoZSB1c2Ugb2YgdGhlc2UgdHdvIGluc3RydWN0aW9ucy4KKyAgLy8vCisgIHVuc2lnbmVkIGdldENhbGxGcmFtZVNldHVwT3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gQ2FsbEZyYW1lU2V0dXBPcGNvZGU7IH0KKyAgdW5zaWduZWQgZ2V0Q2FsbEZyYW1lRGVzdHJveU9wY29kZSgpIGNvbnN0IHsgcmV0dXJuIENhbGxGcmFtZURlc3Ryb3lPcGNvZGU7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBhcmd1bWVudCBpcyBhIGZyYW1lIHBzZXVkbyBpbnN0cnVjdGlvbi4KKyAgYm9vbCBpc0ZyYW1lSW5zdHIoY29uc3QgTWFjaGluZUluc3RyICZJKSBjb25zdCB7CisgICAgcmV0dXJuIEkuZ2V0T3Bjb2RlKCkgPT0gZ2V0Q2FsbEZyYW1lU2V0dXBPcGNvZGUoKSB8fAorICAgICAgICAgICBJLmdldE9wY29kZSgpID09IGdldENhbGxGcmFtZURlc3Ryb3lPcGNvZGUoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgZnJhbWUgc2V0dXAgcHNldWRvIGluc3RydWN0aW9uLgorICBib29sIGlzRnJhbWVTZXR1cChjb25zdCBNYWNoaW5lSW5zdHIgJkkpIGNvbnN0IHsKKyAgICByZXR1cm4gSS5nZXRPcGNvZGUoKSA9PSBnZXRDYWxsRnJhbWVTZXR1cE9wY29kZSgpOworICB9CisKKyAgLy8vIFJldHVybnMgc2l6ZSBvZiB0aGUgZnJhbWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBmcmFtZSBpbnN0cnVjdGlvbi4KKyAgLy8vIEZvciBmcmFtZSBzZXR1cCBpbnN0cnVjdGlvbiB0aGlzIGlzIGZyYW1lIHRoYXQgaXMgc2V0IHVwIHNwYWNlIHNldCB1cAorICAvLy8gYWZ0ZXIgdGhlIGluc3RydWN0aW9uLiBGb3IgZnJhbWUgZGVzdHJveSBpbnN0cnVjdGlvbiB0aGlzIGlzIHRoZSBmcmFtZQorICAvLy8gZnJlZWQgYnkgdGhlIGNhbGxlci4KKyAgLy8vIE5vdGUsIGluIHNvbWUgY2FzZXMgYSBjYWxsIGZyYW1lIChvciBhIHBhcnQgb2YgaXQpIG1heSBiZSBwcmVwYXJlZCBwcmlvcgorICAvLy8gdG8gdGhlIGZyYW1lIHNldHVwIGluc3RydWN0aW9uLiBJdCBvY2N1cnMgaW4gdGhlIGNhbGxzIHRoYXQgaW52b2x2ZQorICAvLy8gaW5hbGxvY2EgYXJndW1lbnRzLiBUaGlzIGZ1bmN0aW9uIHJlcG9ydHMgb25seSB0aGUgc2l6ZSBvZiB0aGUgZnJhbWUgcGFydAorICAvLy8gdGhhdCBpcyBzZXQgdXAgYmV0d2VlbiB0aGUgZnJhbWUgc2V0dXAgYW5kIGRlc3Ryb3kgcHNldWRvIGluc3RydWN0aW9ucy4KKyAgaW50NjRfdCBnZXRGcmFtZVNpemUoY29uc3QgTWFjaGluZUluc3RyICZJKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzRnJhbWVJbnN0cihJKSAmJiAiTm90IGEgZnJhbWUgaW5zdHJ1Y3Rpb24iKTsKKyAgICBhc3NlcnQoSS5nZXRPcGVyYW5kKDApLmdldEltbSgpID49IDApOworICAgIHJldHVybiBJLmdldE9wZXJhbmQoMCkuZ2V0SW1tKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgdG90YWwgZnJhbWUgc2l6ZSwgd2hpY2ggaXMgbWFkZSB1cCBvZiB0aGUgc3BhY2Ugc2V0IHVwIGluc2lkZQorICAvLy8gdGhlIHBhaXIgb2YgZnJhbWUgc3RhcnQtc3RvcCBpbnN0cnVjdGlvbnMgYW5kIHRoZSBzcGFjZSB0aGF0IGlzIHNldCB1cAorICAvLy8gcHJpb3IgdG8gdGhlIHBhaXIuCisgIGludDY0X3QgZ2V0RnJhbWVUb3RhbFNpemUoY29uc3QgTWFjaGluZUluc3RyICZJKSBjb25zdCB7CisgICAgaWYgKGlzRnJhbWVTZXR1cChJKSkgeworICAgICAgYXNzZXJ0KEkuZ2V0T3BlcmFuZCgxKS5nZXRJbW0oKSA+PSAwICYmCisgICAgICAgICAgICAgIkZyYW1lIHNpemUgbXVzdCBub3QgYmUgbmVnYXRpdmUiKTsKKyAgICAgIHJldHVybiBnZXRGcmFtZVNpemUoSSkgKyBJLmdldE9wZXJhbmQoMSkuZ2V0SW1tKCk7CisgICAgfQorICAgIHJldHVybiBnZXRGcmFtZVNpemUoSSk7CisgIH0KKworICB1bnNpZ25lZCBnZXRDYXRjaFJldHVybk9wY29kZSgpIGNvbnN0IHsgcmV0dXJuIENhdGNoUmV0T3Bjb2RlOyB9CisgIHVuc2lnbmVkIGdldFJldHVybk9wY29kZSgpIGNvbnN0IHsgcmV0dXJuIFJldHVybk9wY29kZTsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBhY3R1YWwgc3RhY2sgcG9pbnRlciBhZGp1c3RtZW50IG1hZGUgYnkgYW4gaW5zdHJ1Y3Rpb24KKyAgLy8vIGFzIHBhcnQgb2YgYSBjYWxsIHNlcXVlbmNlLiBCeSBkZWZhdWx0LCBvbmx5IGNhbGwgZnJhbWUgc2V0dXAvZGVzdHJveQorICAvLy8gaW5zdHJ1Y3Rpb25zIGFkanVzdCB0aGUgc3RhY2ssIGJ1dCB0YXJnZXRzIG1heSB3YW50IHRvIG92ZXJyaWRlIHRoaXMKKyAgLy8vIHRvIGVuYWJsZSBtb3JlIGZpbmUtZ3JhaW5lZCBhZGp1c3RtZW50LCBvciBhZGp1c3QgYnkgYSBkaWZmZXJlbnQgdmFsdWUuCisgIHZpcnR1YWwgaW50IGdldFNQQWRqdXN0KGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYSAiY29hbGVzY2FibGUiIGV4dGVuc2lvbiBpbnN0cnVjdGlvbi4KKyAgLy8vIFRoYXQgaXMsIGl0J3MgbGlrZSBhIGNvcHkgd2hlcmUgaXQncyBsZWdhbCBmb3IgdGhlIHNvdXJjZSB0byBvdmVybGFwIHRoZQorICAvLy8gZGVzdGluYXRpb24uIGUuZy4gWDg2OjpNT1ZTWDY0cnIzMi4gSWYgdGhpcyByZXR1cm5zIHRydWUsIHRoZW4gaXQncworICAvLy8gZXhwZWN0ZWQgdGhlIHByZS1leHRlbnNpb24gdmFsdWUgaXMgYXZhaWxhYmxlIGFzIGEgc3VicmVnIG9mIHRoZSByZXN1bHQKKyAgLy8vIHJlZ2lzdGVyLiBUaGlzIGFsc28gcmV0dXJucyB0aGUgc3ViLXJlZ2lzdGVyIGluZGV4IGluIFN1YklkeC4KKyAgdmlydHVhbCBib29sIGlzQ29hbGVzY2FibGVFeHRJbnN0cihjb25zdCBNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCAmU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZEc3RSZWcsIHVuc2lnbmVkICZTdWJJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gSWYgdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RydWN0aW9uIGlzIGEgZGlyZWN0CisgIC8vLyBsb2FkIGZyb20gYSBzdGFjayBzbG90LCByZXR1cm4gdGhlIHZpcnR1YWwgb3IgcGh5c2ljYWwgcmVnaXN0ZXIgbnVtYmVyIG9mCisgIC8vLyB0aGUgZGVzdGluYXRpb24gYWxvbmcgd2l0aCB0aGUgRnJhbWVJbmRleCBvZiB0aGUgbG9hZGVkIHN0YWNrIHNsb3QuICBJZgorICAvLy8gbm90LCByZXR1cm4gMC4gIFRoaXMgcHJlZGljYXRlIG11c3QgcmV0dXJuIDAgaWYgdGhlIGluc3RydWN0aW9uIGhhcworICAvLy8gYW55IHNpZGUgZWZmZWN0cyBvdGhlciB0aGFuIGxvYWRpbmcgZnJvbSB0aGUgc3RhY2sgc2xvdC4KKyAgdmlydHVhbCB1bnNpZ25lZCBpc0xvYWRGcm9tU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBDaGVjayBmb3IgcG9zdC1mcmFtZSBwdHIgZWxpbWluYXRpb24gc3RhY2sgbG9jYXRpb25zIGFzIHdlbGwuCisgIC8vLyBUaGlzIHVzZXMgYSBoZXVyaXN0aWMgc28gaXQgaXNuJ3QgcmVsaWFibGUgZm9yIGNvcnJlY3RuZXNzLgorICB2aXJ0dWFsIHVuc2lnbmVkIGlzTG9hZEZyb21TdGFja1Nsb3RQb3N0RkUoY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3QgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIElmIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0cnVjdGlvbiBoYXMgYSBsb2FkIGZyb20gYSBzdGFjayBzbG90LAorICAvLy8gcmV0dXJuIHRydWUgYWxvbmcgd2l0aCB0aGUgRnJhbWVJbmRleCBvZiB0aGUgbG9hZGVkIHN0YWNrIHNsb3QgYW5kIHRoZQorICAvLy8gbWFjaGluZSBtZW0gb3BlcmFuZCBjb250YWluaW5nIHRoZSByZWZlcmVuY2UuCisgIC8vLyBJZiBub3QsIHJldHVybiBmYWxzZS4gIFVubGlrZSBpc0xvYWRGcm9tU3RhY2tTbG90LCB0aGlzIHJldHVybnMgdHJ1ZSBmb3IKKyAgLy8vIGFueSBpbnN0cnVjdGlvbnMgdGhhdCBsb2FkcyBmcm9tIHRoZSBzdGFjay4gIFRoaXMgaXMganVzdCBhIGhpbnQsIGFzIHNvbWUKKyAgLy8vIGNhc2VzIG1heSBiZSBtaXNzZWQuCisgIHZpcnR1YWwgYm9vbCBoYXNMb2FkRnJvbVN0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZU1lbU9wZXJhbmQgKiZNTU8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0OworCisgIC8vLyBJZiB0aGUgc3BlY2lmaWVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gaXMgYSBkaXJlY3QKKyAgLy8vIHN0b3JlIHRvIGEgc3RhY2sgc2xvdCwgcmV0dXJuIHRoZSB2aXJ0dWFsIG9yIHBoeXNpY2FsIHJlZ2lzdGVyIG51bWJlciBvZgorICAvLy8gdGhlIHNvdXJjZSByZWcgYWxvbmcgd2l0aCB0aGUgRnJhbWVJbmRleCBvZiB0aGUgbG9hZGVkIHN0YWNrIHNsb3QuICBJZgorICAvLy8gbm90LCByZXR1cm4gMC4gIFRoaXMgcHJlZGljYXRlIG11c3QgcmV0dXJuIDAgaWYgdGhlIGluc3RydWN0aW9uIGhhcworICAvLy8gYW55IHNpZGUgZWZmZWN0cyBvdGhlciB0aGFuIHN0b3JpbmcgdG8gdGhlIHN0YWNrIHNsb3QuCisgIHZpcnR1YWwgdW5zaWduZWQgaXNTdG9yZVRvU3RhY2tTbG90KGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmRnJhbWVJbmRleCkgY29uc3QgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIENoZWNrIGZvciBwb3N0LWZyYW1lIHB0ciBlbGltaW5hdGlvbiBzdGFjayBsb2NhdGlvbnMgYXMgd2VsbC4KKyAgLy8vIFRoaXMgdXNlcyBhIGhldXJpc3RpYywgc28gaXQgaXNuJ3QgcmVsaWFibGUgZm9yIGNvcnJlY3RuZXNzLgorICB2aXJ0dWFsIHVuc2lnbmVkIGlzU3RvcmVUb1N0YWNrU2xvdFBvc3RGRShjb25zdCBNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBJZiB0aGUgc3BlY2lmaWVkIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gaGFzIGEgc3RvcmUgdG8gYSBzdGFjayBzbG90LAorICAvLy8gcmV0dXJuIHRydWUgYWxvbmcgd2l0aCB0aGUgRnJhbWVJbmRleCBvZiB0aGUgbG9hZGVkIHN0YWNrIHNsb3QgYW5kIHRoZQorICAvLy8gbWFjaGluZSBtZW0gb3BlcmFuZCBjb250YWluaW5nIHRoZSByZWZlcmVuY2UuCisgIC8vLyBJZiBub3QsIHJldHVybiBmYWxzZS4gIFVubGlrZSBpc1N0b3JlVG9TdGFja1Nsb3QsCisgIC8vLyB0aGlzIHJldHVybnMgdHJ1ZSBmb3IgYW55IGluc3RydWN0aW9ucyB0aGF0IHN0b3JlcyB0byB0aGUKKyAgLy8vIHN0YWNrLiAgVGhpcyBpcyBqdXN0IGEgaGludCwgYXMgc29tZSBjYXNlcyBtYXkgYmUgbWlzc2VkLgorICB2aXJ0dWFsIGJvb2wgaGFzU3RvcmVUb1N0YWNrU2xvdChjb25zdCBNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lTWVtT3BlcmFuZCAqJk1NTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZGcmFtZUluZGV4KSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RydWN0aW9uCisgIC8vLyBpcyBhIGNvcHkgb2Ygb25lIHN0YWNrIHNsb3QgdG8gYW5vdGhlciBhbmQgaGFzIG5vIG90aGVyIGVmZmVjdC4KKyAgLy8vIFByb3ZpZGUgdGhlIGlkZW50aXR5IG9mIHRoZSB0d28gZnJhbWUgaW5kaWNlcy4KKyAgdmlydHVhbCBib29sIGlzU3RhY2tTbG90Q29weShjb25zdCBNYWNoaW5lSW5zdHIgJk1JLCBpbnQgJkRlc3RGcmFtZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAmU3JjRnJhbWVJbmRleCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBDb21wdXRlIHRoZSBzaXplIGluIGJ5dGVzIGFuZCBvZmZzZXQgd2l0aGluIGEgc3RhY2sgc2xvdCBvZiBhIHNwaWxsZWQKKyAgLy8vIHJlZ2lzdGVyIG9yIHN1YnJlZ2lzdGVyLgorICAvLy8KKyAgLy8vIFxwYXJhbSBbb3V0XSBTaXplIGluIGJ5dGVzIG9mIHRoZSBzcGlsbGVkIHZhbHVlLgorICAvLy8gXHBhcmFtIFtvdXRdIE9mZnNldCBpbiBieXRlcyB3aXRoaW4gdGhlIHN0YWNrIHNsb3QuCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGJvdGggU2l6ZSBhbmQgT2Zmc2V0IGFyZSBzdWNjZXNzZnVsbHkgY29tcHV0ZWQuCisgIC8vLworICAvLy8gTm90IGFsbCBzdWJyZWdpc3RlcnMgaGF2ZSBjb21wdXRhYmxlIHNwaWxsIHNsb3RzLiBGb3IgZXhhbXBsZSwKKyAgLy8vIHN1YnJlZ2lzdGVycyByZWdpc3RlcnMgbWF5IG5vdCBiZSBieXRlLXNpemVkLCBhbmQgYSBwYWlyIG9mIGRpc2NvbnRpZ3VvdXMKKyAgLy8vIHN1YnJlZ2lzdGVycyBoYXMgbm8gc2luZ2xlIG9mZnNldC4KKyAgLy8vCisgIC8vLyBUYXJnZXRzIHdpdGggbm9udHJpdmlhbCBiaWdlbmRpYW4gaW1wbGVtZW50YXRpb25zIG1heSBuZWVkIHRvIG92ZXJyaWRlCisgIC8vLyB0aGlzLCBwYXJ0aWN1bGFybHkgdG8gc3VwcG9ydCBzcGlsbGVkIHZlY3RvciByZWdpc3RlcnMuCisgIHZpcnR1YWwgYm9vbCBnZXRTdGFja1Nsb3RSYW5nZShjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywgdW5zaWduZWQgU3ViSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJlNpemUsIHVuc2lnbmVkICZPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc3BlY2lmaWVkIE1hY2hpbmVJbnN0ciwgb3IgfjBVCisgIC8vLyB3aGVuIHRoaXMgZnVuY3Rpb24gaXMgbm90IGltcGxlbWVudGVkIGJ5IGEgdGFyZ2V0LgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldEluc3RTaXplSW5CeXRlcyhjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSBjb25zdCB7CisgICAgcmV0dXJuIH4wVTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYXMgY2hlYXAgYXMgYSBtb3ZlIGluc3RydWN0aW9uLgorICAvLy8KKyAgLy8vIFRhcmdldHMgZm9yIGRpZmZlcmVudCBhcmNocyBuZWVkIHRvIG92ZXJyaWRlIHRoaXMsIGFuZCBkaWZmZXJlbnQKKyAgLy8vIG1pY3JvLWFyY2hpdGVjdHVyZXMgY2FuIGFsc28gYmUgZmluZWx5IHR1bmVkIGluc2lkZS4KKyAgdmlydHVhbCBib29sIGlzQXNDaGVhcEFzQU1vdmUoY29uc3QgTWFjaGluZUluc3RyICZNSSkgY29uc3QgeworICAgIHJldHVybiBNSS5pc0FzQ2hlYXBBc0FNb3ZlKCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIHNob3VsZCBiZSBzdW5rIGJ5IE1hY2hpbmVTaW5rLgorICAvLy8KKyAgLy8vIE1hY2hpbmVTaW5rIGRldGVybWluZXMgb24gaXRzIG93biB3aGV0aGVyIHRoZSBpbnN0cnVjdGlvbiBpcyBzYWZlIHRvIHNpbms7CisgIC8vLyB0aGlzIGdpdmVzIHRoZSB0YXJnZXQgYSBob29rIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yIHdpdGggcmVnYXJkcworICAvLy8gdG8gd2hpY2ggaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBzdW5rLgorICB2aXJ0dWFsIGJvb2wgc2hvdWxkU2luayhjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8vIFJlLWlzc3VlIHRoZSBzcGVjaWZpZWQgJ29yaWdpbmFsJyBpbnN0cnVjdGlvbiBhdCB0aGUKKyAgLy8vIHNwZWNpZmljIGxvY2F0aW9uIHRhcmdldGluZyBhIG5ldyBkZXN0aW5hdGlvbiByZWdpc3Rlci4KKyAgLy8vIFRoZSByZWdpc3RlciBpbiBPcmlnLT5nZXRPcGVyYW5kKDApLmdldFJlZygpIHdpbGwgYmUgc3Vic3RpdHV0ZWQgYnkKKyAgLy8vIERlc3RSZWc6U3ViSWR4LiBBbnkgZXhpc3Rpbmcgc3VicmVnIGluZGV4IGlzIHByZXNlcnZlZCBvciBjb21wb3NlZCB3aXRoCisgIC8vLyBTdWJJZHguCisgIHZpcnR1YWwgdm9pZCByZU1hdGVyaWFsaXplKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSwgdW5zaWduZWQgRGVzdFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3ViSWR4LCBjb25zdCBNYWNoaW5lSW5zdHIgJk9yaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJKSBjb25zdDsKKworICAvLy8gXGJyaWVmIENsb25lcyBpbnN0cnVjdGlvbiBvciB0aGUgd2hvbGUgaW5zdHJ1Y3Rpb24gYnVuZGxlIFxwIE9yaWcgYW5kCisgIC8vLyBpbnNlcnQgaW50byBccCBNQkIgYmVmb3JlIFxwIEluc2VydEJlZm9yZS4gVGhlIHRhcmdldCBtYXkgdXBkYXRlIG9wZXJhbmRzCisgIC8vLyB0aGF0IGFyZSByZXF1aXJlZCB0byBiZSB1bmlxdWUuCisgIC8vLworICAvLy8gXHAgT3JpZyBtdXN0IG5vdCByZXR1cm4gdHJ1ZSBmb3IgTWFjaGluZUluc3RyOjppc05vdER1cGxpY2FibGUoKS4KKyAgdmlydHVhbCBNYWNoaW5lSW5zdHIgJmR1cGxpY2F0ZShNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRCZWZvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICZPcmlnKSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0YXJnZXRzIHRoYXQKKyAgLy8vIHNldCB0aGUgTV9DT05WRVJUSUJMRV9UT18zX0FERFIgZmxhZy4gIFdoZW4gdGhpcyBmbGFnIGlzIHNldCwgdGhlIHRhcmdldAorICAvLy8gbWF5IGJlIGFibGUgdG8gY29udmVydCBhIHR3by1hZGRyZXNzIGluc3RydWN0aW9uIGludG8gb25lIG9yIG1vcmUgdHJ1ZQorICAvLy8gdGhyZWUtYWRkcmVzcyBpbnN0cnVjdGlvbnMgb24gZGVtYW5kLiAgVGhpcyBhbGxvd3MgdGhlIFg4NiB0YXJnZXQgKGZvcgorICAvLy8gZXhhbXBsZSkgdG8gY29udmVydCBBREQgYW5kIFNITCBpbnN0cnVjdGlvbnMgaW50byBMRUEgaW5zdHJ1Y3Rpb25zIGlmIHRoZXkKKyAgLy8vIHdvdWxkIHJlcXVpcmUgcmVnaXN0ZXIgY29waWVzIGR1ZSB0byB0d28tYWRkcmVzc25lc3MuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgcmV0dXJucyBhIG51bGwgcG9pbnRlciBpZiB0aGUgdHJhbnNmb3JtYXRpb24gY2Fubm90IGJlCisgIC8vLyBwZXJmb3JtZWQsIG90aGVyd2lzZSBpdCByZXR1cm5zIHRoZSBsYXN0IG5ldyBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIHZpcnR1YWwgTWFjaGluZUluc3RyICpjb252ZXJ0VG9UaHJlZUFkZHJlc3MoTWFjaGluZUZ1bmN0aW9uOjppdGVyYXRvciAmTUZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAmTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZVZhcmlhYmxlcyAqTFYpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vIFRoaXMgY29uc3RhbnQgY2FuIGJlIHVzZWQgYXMgYW4gaW5wdXQgdmFsdWUgb2Ygb3BlcmFuZCBpbmRleCBwYXNzZWQgdG8KKyAgLy8gdGhlIG1ldGhvZCBmaW5kQ29tbXV0ZWRPcEluZGljZXMoKSB0byB0ZWxsIHRoZSBtZXRob2QgdGhhdCB0aGUKKyAgLy8gY29ycmVzcG9uZGluZyBvcGVyYW5kIGluZGV4IGlzIG5vdCBwcmUtZGVmaW5lZCBhbmQgdGhhdCB0aGUgbWV0aG9kCisgIC8vIGNhbiBwaWNrIGFueSBjb21tdXRhYmxlIG9wZXJhbmQuCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBDb21tdXRlQW55T3BlcmFuZEluZGV4ID0gfjBVOworCisgIC8vLyBUaGlzIG1ldGhvZCBjb21tdXRlcyB0aGUgb3BlcmFuZHMgb2YgdGhlIGdpdmVuIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gTUkuCisgIC8vLworICAvLy8gVGhlIG9wZXJhbmRzIHRvIGJlIGNvbW11dGVkIGFyZSBzcGVjaWZpZWQgYnkgdGhlaXIgaW5kaWNlcyBPcElkeDEgYW5kCisgIC8vLyBPcElkeDIuIE9wSWR4MSBhbmQgT3BJZHgyIGFyZ3VtZW50cyBtYXkgYmUgc2V0IHRvIGEgc3BlY2lhbCB2YWx1ZQorICAvLy8gJ0NvbW11dGVBbnlPcGVyYW5kSW5kZXgnLCB3aGljaCBtZWFucyB0aGF0IHRoZSBtZXRob2QgaXMgZnJlZSB0byBjaG9vc2UKKyAgLy8vIGFueSBhcmJpdHJhcmlseSBjaG9zZW4gY29tbXV0YWJsZSBvcGVyYW5kLiBJZiBib3RoIGFyZ3VtZW50cyBhcmUgc2V0IHRvCisgIC8vLyAnQ29tbXV0ZUFueU9wZXJhbmRJbmRleCcgdGhlbiB0aGUgbWV0aG9kIGxvb2tzIGZvciAyIGRpZmZlcmVudCBjb21tdXRhYmxlCisgIC8vLyBvcGVyYW5kczsgdGhlbiBjb21tdXRlcyB0aGVtIGlmIHN1Y2ggb3BlcmFuZHMgY291bGQgYmUgZm91bmQuCisgIC8vLworICAvLy8gSWYgTmV3TUkgaXMgZmFsc2UsIE1JIGlzIG1vZGlmaWVkIGluIHBsYWNlIGFuZCByZXR1cm5lZDsgb3RoZXJ3aXNlLCBhCisgIC8vLyBuZXcgbWFjaGluZSBpbnN0cnVjdGlvbiBpcyBjcmVhdGVkIGFuZCByZXR1cm5lZC4KKyAgLy8vCisgIC8vLyBEbyBub3QgY2FsbCB0aGlzIG1ldGhvZCBmb3IgYSBub24tY29tbXV0YWJsZSBpbnN0cnVjdGlvbiBvcgorICAvLy8gZm9yIG5vbi1jb21tdWFibGUgb3BlcmFuZHMuCisgIC8vLyBFdmVuIHRob3VnaCB0aGUgaW5zdHJ1Y3Rpb24gaXMgY29tbXV0YWJsZSwgdGhlIG1ldGhvZCBtYXkgc3RpbGwKKyAgLy8vIGZhaWwgdG8gY29tbXV0ZSB0aGUgb3BlcmFuZHMsIG51bGwgcG9pbnRlciBpcyByZXR1cm5lZCBpbiBzdWNoIGNhc2VzLgorICBNYWNoaW5lSW5zdHIgKgorICBjb21tdXRlSW5zdHJ1Y3Rpb24oTWFjaGluZUluc3RyICZNSSwgYm9vbCBOZXdNSSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BJZHgxID0gQ29tbXV0ZUFueU9wZXJhbmRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wSWR4MiA9IENvbW11dGVBbnlPcGVyYW5kSW5kZXgpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRydWUgaWZmIHRoZSByb3V0aW5lIGNvdWxkIGZpbmQgdHdvIGNvbW11dGFibGUgb3BlcmFuZHMgaW4gdGhlCisgIC8vLyBnaXZlbiBtYWNoaW5lIGluc3RydWN0aW9uLgorICAvLy8gVGhlICdTcmNPcElkeDEnIGFuZCAnU3JjT3BJZHgyJyBhcmUgSU5QVVQgYW5kIE9VVFBVVCBhcmd1bWVudHMuCisgIC8vLyBJZiBhbnkgb2YgdGhlIElOUFVUIHZhbHVlcyBpcyBzZXQgdG8gdGhlIHNwZWNpYWwgdmFsdWUKKyAgLy8vICdDb21tdXRlQW55T3BlcmFuZEluZGV4JyB0aGVuIHRoZSBtZXRob2QgYXJiaXRyYXJpbHkgcGlja3MgYSBjb21tdXRhYmxlCisgIC8vLyBvcGVyYW5kLCB0aGVuIHJldHVybnMgaXRzIGluZGV4IGluIHRoZSBjb3JyZXNwb25kaW5nIGFyZ3VtZW50LgorICAvLy8gSWYgYm90aCBvZiBJTlBVVCB2YWx1ZXMgYXJlIHNldCB0byAnQ29tbXV0ZUFueU9wZXJhbmRJbmRleCcgdGhlbiBtZXRob2QKKyAgLy8vIGxvb2tzIGZvciAyIGNvbW11dGFibGUgb3BlcmFuZHMuCisgIC8vLyBJZiBJTlBVVCB2YWx1ZXMgcmVmZXIgdG8gc29tZSBvcGVyYW5kcyBvZiBNSSwgdGhlbiB0aGUgbWV0aG9kIHNpbXBseQorICAvLy8gcmV0dXJucyB0cnVlIGlmIHRoZSBjb3JyZXNwb25kaW5nIG9wZXJhbmRzIGFyZSBjb21tdXRhYmxlIGFuZCByZXR1cm5zCisgIC8vLyBmYWxzZSBvdGhlcndpc2UuCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUsIGNhbGxpbmcgdGhpcyBtZXRob2QgdGhpcyB3YXk6CisgIC8vLyAgICAgdW5zaWduZWQgT3AxID0gMSwgT3AyID0gQ29tbXV0ZUFueU9wZXJhbmRJbmRleDsKKyAgLy8vICAgICBmaW5kQ29tbXV0ZWRPcEluZGljZXMoTUksIE9wMSwgT3AyKTsKKyAgLy8vIGNhbiBiZSBpbnRlcnByZXRlZCBhcyBhIHF1ZXJ5IGFza2luZyB0byBmaW5kIGFuIG9wZXJhbmQgdGhhdCB3b3VsZCBiZQorICAvLy8gY29tbXV0YWJsZSB3aXRoIHRoZSBvcGVyYW5kIzEuCisgIHZpcnR1YWwgYm9vbCBmaW5kQ29tbXV0ZWRPcEluZGljZXMoTWFjaGluZUluc3RyICZNSSwgdW5zaWduZWQgJlNyY09wSWR4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmU3JjT3BJZHgyKSBjb25zdDsKKworICAvLy8gQSBwYWlyIGNvbXBvc2VkIG9mIGEgcmVnaXN0ZXIgYW5kIGEgc3ViLXJlZ2lzdGVyIGluZGV4LgorICAvLy8gVXNlZCB0byBnaXZlIHNvbWUgdHlwZSBjaGVja2luZyB3aGVuIG1vZGVsaW5nIFJlZzpTdWJSZWcuCisgIHN0cnVjdCBSZWdTdWJSZWdQYWlyIHsKKyAgICB1bnNpZ25lZCBSZWc7CisgICAgdW5zaWduZWQgU3ViUmVnOworCisgICAgUmVnU3ViUmVnUGFpcih1bnNpZ25lZCBSZWcgPSAwLCB1bnNpZ25lZCBTdWJSZWcgPSAwKQorICAgICAgICA6IFJlZyhSZWcpLCBTdWJSZWcoU3ViUmVnKSB7fQorICB9OworCisgIC8vLyBBIHBhaXIgY29tcG9zZWQgb2YgYSBwYWlyIG9mIGEgcmVnaXN0ZXIgYW5kIGEgc3ViLXJlZ2lzdGVyIGluZGV4LAorICAvLy8gYW5kIGFub3RoZXIgc3ViLXJlZ2lzdGVyIGluZGV4LgorICAvLy8gVXNlZCB0byBnaXZlIHNvbWUgdHlwZSBjaGVja2luZyB3aGVuIG1vZGVsaW5nIFJlZzpTdWJSZWcxLCBTdWJSZWcyLgorICBzdHJ1Y3QgUmVnU3ViUmVnUGFpckFuZElkeCA6IFJlZ1N1YlJlZ1BhaXIgeworICAgIHVuc2lnbmVkIFN1YklkeDsKKworICAgIFJlZ1N1YlJlZ1BhaXJBbmRJZHgodW5zaWduZWQgUmVnID0gMCwgdW5zaWduZWQgU3ViUmVnID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFN1YklkeCA9IDApCisgICAgICAgIDogUmVnU3ViUmVnUGFpcihSZWcsIFN1YlJlZyksIFN1YklkeChTdWJJZHgpIHt9CisgIH07CisKKyAgLy8vIEJ1aWxkIHRoZSBlcXVpdmFsZW50IGlucHV0cyBvZiBhIFJFR19TRVFVRU5DRSBmb3IgdGhlIGdpdmVuIFxwIE1JCisgIC8vLyBhbmQgXHAgRGVmSWR4LgorICAvLy8gXHAgW291dF0gSW5wdXRSZWdzIG9mIHRoZSBlcXVpdmFsZW50IFJFR19TRVFVRU5DRS4gRWFjaCBlbGVtZW50IG9mCisgIC8vLyB0aGUgbGlzdCBpcyBtb2RlbGVkIGFzIDxSZWc6U3ViUmVnLCBTdWJJZHg+LiBPcGVyYW5kcyB3aXRoIHRoZSB1bmRlZgorICAvLy8gZmxhZyBhcmUgbm90IGFkZGVkIHRvIHRoaXMgbGlzdC4KKyAgLy8vIEUuZy4sIFJFR19TRVFVRU5DRSAlMTpzdWIxLCBzdWIwLCAlMiwgc3ViMSB3b3VsZCBwcm9kdWNlCisgIC8vLyB0d28gZWxlbWVudHM6CisgIC8vLyAtICUxOnN1YjEsIHN1YjAKKyAgLy8vIC0gJTI8OjA+LCBzdWIxCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSB0byBidWlsZCBzdWNoIGFuIGlucHV0IHNlcXVlbmNlCisgIC8vLyB3aXRoIHRoZSBwYWlyIFxwIE1JLCBccCBEZWZJZHguIEZhbHNlIG90aGVyd2lzZS4KKyAgLy8vCisgIC8vLyBccHJlIE1JLmlzUmVnU2VxdWVuY2UoKSBvciBNSS5pc1JlZ1NlcXVlbmNlTGlrZSgpLgorICAvLy8KKyAgLy8vIFxub3RlIFRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHByb3ZpZGUgYW55IHN1cHBvcnQgZm9yCisgIC8vLyBNSS5pc1JlZ1NlcXVlbmNlTGlrZSgpLiBJbiBvdGhlciB3b3Jkcywgb25lIGhhcyB0byBvdmVycmlkZQorICAvLy8gZ2V0UmVnU2VxdWVuY2VMaWtlSW5wdXRzIGZvciB0YXJnZXQgc3BlY2lmaWMgaW5zdHJ1Y3Rpb25zLgorICBib29sCisgIGdldFJlZ1NlcXVlbmNlSW5wdXRzKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksIHVuc2lnbmVkIERlZklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFJlZ1N1YlJlZ1BhaXJBbmRJZHg+ICZJbnB1dFJlZ3MpIGNvbnN0OworCisgIC8vLyBCdWlsZCB0aGUgZXF1aXZhbGVudCBpbnB1dHMgb2YgYSBFWFRSQUNUX1NVQlJFRyBmb3IgdGhlIGdpdmVuIFxwIE1JCisgIC8vLyBhbmQgXHAgRGVmSWR4LgorICAvLy8gXHAgW291dF0gSW5wdXRSZWcgb2YgdGhlIGVxdWl2YWxlbnQgRVhUUkFDVF9TVUJSRUcuCisgIC8vLyBFLmcuLCBFWFRSQUNUX1NVQlJFRyAlMTpzdWIxLCBzdWIwLCBzdWIxIHdvdWxkIHByb2R1Y2U6CisgIC8vLyAtICUxOnN1YjEsIHN1YjAKKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGJ1aWxkIHN1Y2ggYW4gaW5wdXQgc2VxdWVuY2UKKyAgLy8vIHdpdGggdGhlIHBhaXIgXHAgTUksIFxwIERlZklkeCBhbmQgdGhlIG9wZXJhbmQgaGFzIG5vIHVuZGVmIGZsYWcgc2V0LgorICAvLy8gRmFsc2Ugb3RoZXJ3aXNlLgorICAvLy8KKyAgLy8vIFxwcmUgTUkuaXNFeHRyYWN0U3VicmVnKCkgb3IgTUkuaXNFeHRyYWN0U3VicmVnTGlrZSgpLgorICAvLy8KKyAgLy8vIFxub3RlIFRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHByb3ZpZGUgYW55IHN1cHBvcnQgZm9yCisgIC8vLyBNSS5pc0V4dHJhY3RTdWJyZWdMaWtlKCkuIEluIG90aGVyIHdvcmRzLCBvbmUgaGFzIHRvIG92ZXJyaWRlCisgIC8vLyBnZXRFeHRyYWN0U3VicmVnTGlrZUlucHV0cyBmb3IgdGFyZ2V0IHNwZWNpZmljIGluc3RydWN0aW9ucy4KKyAgYm9vbCBnZXRFeHRyYWN0U3VicmVnSW5wdXRzKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksIHVuc2lnbmVkIERlZklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1N1YlJlZ1BhaXJBbmRJZHggJklucHV0UmVnKSBjb25zdDsKKworICAvLy8gQnVpbGQgdGhlIGVxdWl2YWxlbnQgaW5wdXRzIG9mIGEgSU5TRVJUX1NVQlJFRyBmb3IgdGhlIGdpdmVuIFxwIE1JCisgIC8vLyBhbmQgXHAgRGVmSWR4LgorICAvLy8gXHAgW291dF0gQmFzZVJlZyBhbmQgXHAgW291dF0gSW5zZXJ0ZWRSZWcgY29udGFpbgorICAvLy8gdGhlIGVxdWl2YWxlbnQgaW5wdXRzIG9mIElOU0VSVF9TVUJSRUcuCisgIC8vLyBFLmcuLCBJTlNFUlRfU1VCUkVHICUwOnN1YjAsICUxOnN1YjEsIHN1YjMgd291bGQgcHJvZHVjZToKKyAgLy8vIC0gQmFzZVJlZzogJTA6c3ViMAorICAvLy8gLSBJbnNlcnRlZFJlZzogJTE6c3ViMSwgc3ViMworICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQgc3VjaCBhbiBpbnB1dCBzZXF1ZW5jZQorICAvLy8gd2l0aCB0aGUgcGFpciBccCBNSSwgXHAgRGVmSWR4IGFuZCB0aGUgb3BlcmFuZCBoYXMgbm8gdW5kZWYgZmxhZyBzZXQuCisgIC8vLyBGYWxzZSBvdGhlcndpc2UuCisgIC8vLworICAvLy8gXHByZSBNSS5pc0luc2VydFN1YnJlZygpIG9yIE1JLmlzSW5zZXJ0U3VicmVnTGlrZSgpLgorICAvLy8KKyAgLy8vIFxub3RlIFRoZSBnZW5lcmljIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IHByb3ZpZGUgYW55IHN1cHBvcnQgZm9yCisgIC8vLyBNSS5pc0luc2VydFN1YnJlZ0xpa2UoKS4gSW4gb3RoZXIgd29yZHMsIG9uZSBoYXMgdG8gb3ZlcnJpZGUKKyAgLy8vIGdldEluc2VydFN1YnJlZ0xpa2VJbnB1dHMgZm9yIHRhcmdldCBzcGVjaWZpYyBpbnN0cnVjdGlvbnMuCisgIGJvb2wgZ2V0SW5zZXJ0U3VicmVnSW5wdXRzKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksIHVuc2lnbmVkIERlZklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU3ViUmVnUGFpciAmQmFzZVJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU3ViUmVnUGFpckFuZElkeCAmSW5zZXJ0ZWRSZWcpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0d28gbWFjaGluZSBpbnN0cnVjdGlvbnMgd291bGQgcHJvZHVjZSBpZGVudGljYWwgdmFsdWVzLgorICAvLy8gQnkgZGVmYXVsdCwgdGhpcyBpcyBvbmx5IHRydWUgd2hlbiB0aGUgdHdvIGluc3RydWN0aW9ucworICAvLy8gYXJlIGRlZW1lZCBpZGVudGljYWwgZXhjZXB0IGZvciBkZWZzLiBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIHRoZQorICAvLy8gSVIgaXMgc3RpbGwgaW4gU1NBIGZvcm0sIHRoZSBjYWxsZXIgY2FuIHBhc3MgdGhlIE1hY2hpbmVSZWdpc3RlckluZm8gZm9yCisgIC8vLyBhZ2dyZXNzaXZlIGNoZWNrcy4KKyAgdmlydHVhbCBib29sIHByb2R1Y2VTYW1lVmFsdWUoY29uc3QgTWFjaGluZUluc3RyICZNSTAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkkgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBhIGJyYW5jaCBmcm9tIGFuIGluc3RydWN0aW9uIHdpdGggb3Bjb2RlIFxwIEJyYW5jaE9wYworICAvLy8gIGJ5dGVzIGlzIGNhcGFibGUgb2YganVtcGluZyB0byBhIHBvc2l0aW9uIFxwIEJyT2Zmc2V0IGJ5dGVzIGF3YXkuCisgIHZpcnR1YWwgYm9vbCBpc0JyYW5jaE9mZnNldEluUmFuZ2UodW5zaWduZWQgQnJhbmNoT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgQnJPZmZzZXQpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJ0YXJnZXQgZGlkIG5vdCBpbXBsZW1lbnQiKTsKKyAgfQorCisgIC8vLyBccmV0dXJucyBUaGUgYmxvY2sgdGhhdCBicmFuY2ggaW5zdHJ1Y3Rpb24gXHAgTUkganVtcHMgdG8uCisgIHZpcnR1YWwgTWFjaGluZUJhc2ljQmxvY2sgKmdldEJyYW5jaERlc3RCbG9jayhjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgidGFyZ2V0IGRpZCBub3QgaW1wbGVtZW50Iik7CisgIH0KKworICAvLy8gSW5zZXJ0IGFuIHVuY29uZGl0aW9uYWwgaW5kaXJlY3QgYnJhbmNoIGF0IHRoZSBlbmQgb2YgXHAgTUJCIHRvIFxwCisgIC8vLyBOZXdEZXN0QkIuICBccCBCck9mZnNldCBpbmRpY2F0ZXMgdGhlIG9mZnNldCBvZiBccCBOZXdEZXN0QkIgcmVsYXRpdmUgdG8KKyAgLy8vIHRoZSBvZmZzZXQgb2YgdGhlIHBvc2l0aW9uIHRvIGluc2VydCB0aGUgbmV3IGJyYW5jaC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFkZGVkIHRvIHRoZSBibG9jay4KKyAgdmlydHVhbCB1bnNpZ25lZCBpbnNlcnRJbmRpcmVjdEJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZOZXdEZXN0QkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdMb2MgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgQnJPZmZzZXQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1NjYXZlbmdlciAqUlMgPSBudWxscHRyKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgidGFyZ2V0IGRpZCBub3QgaW1wbGVtZW50Iik7CisgIH0KKworICAvLy8gQW5hbHl6ZSB0aGUgYnJhbmNoaW5nIGNvZGUgYXQgdGhlIGVuZCBvZiBNQkIsIHJldHVybmluZworICAvLy8gdHJ1ZSBpZiBpdCBjYW5ub3QgYmUgdW5kZXJzdG9vZCAoZS5nLiBpdCdzIGEgc3dpdGNoIGRpc3BhdGNoIG9yIGlzbid0CisgIC8vLyBpbXBsZW1lbnRlZCBmb3IgYSB0YXJnZXQpLiAgVXBvbiBzdWNjZXNzLCB0aGlzIHJldHVybnMgZmFsc2UgYW5kIHJldHVybnMKKyAgLy8vIHdpdGggdGhlIGZvbGxvd2luZyBpbmZvcm1hdGlvbiBpbiB2YXJpb3VzIGNhc2VzOgorICAvLy8KKyAgLy8vIDEuIElmIHRoaXMgYmxvY2sgZW5kcyB3aXRoIG5vIGJyYW5jaGVzIChpdCBqdXN0IGZhbGxzIHRocm91Z2ggdG8gaXRzIHN1Y2MpCisgIC8vLyAgICBqdXN0IHJldHVybiBmYWxzZSwgbGVhdmluZyBUQkIvRkJCIG51bGwuCisgIC8vLyAyLiBJZiB0aGlzIGJsb2NrIGVuZHMgd2l0aCBvbmx5IGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoLCBpdCBzZXRzIFRCQiB0byBiZQorICAvLy8gICAgdGhlIGRlc3RpbmF0aW9uIGJsb2NrLgorICAvLy8gMy4gSWYgdGhpcyBibG9jayBlbmRzIHdpdGggYSBjb25kaXRpb25hbCBicmFuY2ggYW5kIGl0IGZhbGxzIHRocm91Z2ggdG8gYQorICAvLy8gICAgc3VjY2Vzc29yIGJsb2NrLCBpdCBzZXRzIFRCQiB0byBiZSB0aGUgYnJhbmNoIGRlc3RpbmF0aW9uIGJsb2NrIGFuZCBhCisgIC8vLyAgICBsaXN0IG9mIG9wZXJhbmRzIHRoYXQgZXZhbHVhdGUgdGhlIGNvbmRpdGlvbi4gVGhlc2Ugb3BlcmFuZHMgY2FuIGJlCisgIC8vLyAgICBwYXNzZWQgdG8gb3RoZXIgVGFyZ2V0SW5zdHJJbmZvIG1ldGhvZHMgdG8gY3JlYXRlIG5ldyBicmFuY2hlcy4KKyAgLy8vIDQuIElmIHRoaXMgYmxvY2sgZW5kcyB3aXRoIGEgY29uZGl0aW9uYWwgYnJhbmNoIGZvbGxvd2VkIGJ5IGFuCisgIC8vLyAgICB1bmNvbmRpdGlvbmFsIGJyYW5jaCwgaXQgcmV0dXJucyB0aGUgJ3RydWUnIGRlc3RpbmF0aW9uIGluIFRCQiwgdGhlCisgIC8vLyAgICAnZmFsc2UnIGRlc3RpbmF0aW9uIGluIEZCQiwgYW5kIGEgbGlzdCBvZiBvcGVyYW5kcyB0aGF0IGV2YWx1YXRlIHRoZQorICAvLy8gICAgY29uZGl0aW9uLiAgVGhlc2Ugb3BlcmFuZHMgY2FuIGJlIHBhc3NlZCB0byBvdGhlciBUYXJnZXRJbnN0ckluZm8KKyAgLy8vICAgIG1ldGhvZHMgdG8gY3JlYXRlIG5ldyBicmFuY2hlcy4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgcmVtb3ZlQnJhbmNoIGFuZCBpbnNlcnRCcmFuY2ggbXVzdCBiZSBpbXBsZW1lbnRlZCB0byBzdXBwb3J0CisgIC8vLyBjYXNlcyB3aGVyZSB0aGlzIG1ldGhvZCByZXR1cm5zIHN1Y2Nlc3MuCisgIC8vLworICAvLy8gSWYgQWxsb3dNb2RpZnkgaXMgdHJ1ZSwgdGhlbiB0aGlzIHJvdXRpbmUgaXMgYWxsb3dlZCB0byBtb2RpZnkgdGhlIGJhc2ljCisgIC8vLyBibG9jayAoZS5nLiBkZWxldGUgaW5zdHJ1Y3Rpb25zIGFmdGVyIHRoZSB1bmNvbmRpdGlvbmFsIGJyYW5jaCkuCisgIC8vLworICAvLy8gVGhlIENGRyBpbmZvcm1hdGlvbiBpbiBNQkIuUHJlZGVjZXNzb3JzIGFuZCBNQkIuU3VjY2Vzc29ycyBtdXN0IGJlIHZhbGlkCisgIC8vLyBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICB2aXJ0dWFsIGJvb2wgYW5hbHl6ZUJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBNYWNoaW5lQmFzaWNCbG9jayAqJlRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKiZGQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dNb2RpZnkgPSBmYWxzZSkgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFJlcHJlc2VudHMgYSBwcmVkaWNhdGUgYXQgdGhlIE1hY2hpbmVGdW5jdGlvbiBsZXZlbC4gIFRoZSBjb250cm9sIGZsb3cgYQorICAvLy8gTWFjaGluZUJyYW5jaFByZWRpY2F0ZSByZXByZXNlbnRzIGlzOgorICAvLy8KKyAgLy8vICBSZWcgPSBMSFMgYFByZWRpY2F0ZWAgUkhTICAgICAgICAgPT0gQ29uZGl0aW9uRGVmCisgIC8vLyAgaWYgUmVnIHRoZW4gZ290byBUcnVlRGVzdCBlbHNlIGdvdG8gRmFsc2VEZXN0CisgIC8vLworICBzdHJ1Y3QgTWFjaGluZUJyYW5jaFByZWRpY2F0ZSB7CisgICAgZW51bSBDb21wYXJlUHJlZGljYXRlIHsKKyAgICAgIFBSRURfRVEsICAgICAvLyBUcnVlIGlmIHR3byB2YWx1ZXMgYXJlIGVxdWFsCisgICAgICBQUkVEX05FLCAgICAgLy8gVHJ1ZSBpZiB0d28gdmFsdWVzIGFyZSBub3QgZXF1YWwKKyAgICAgIFBSRURfSU5WQUxJRCAvLyBTZW50aW5lbCB2YWx1ZQorICAgIH07CisKKyAgICBDb21wYXJlUHJlZGljYXRlIFByZWRpY2F0ZSA9IFBSRURfSU5WQUxJRDsKKyAgICBNYWNoaW5lT3BlcmFuZCBMSFMgPSBNYWNoaW5lT3BlcmFuZDo6Q3JlYXRlSW1tKDApOworICAgIE1hY2hpbmVPcGVyYW5kIFJIUyA9IE1hY2hpbmVPcGVyYW5kOjpDcmVhdGVJbW0oMCk7CisgICAgTWFjaGluZUJhc2ljQmxvY2sgKlRydWVEZXN0ID0gbnVsbHB0cjsKKyAgICBNYWNoaW5lQmFzaWNCbG9jayAqRmFsc2VEZXN0ID0gbnVsbHB0cjsKKyAgICBNYWNoaW5lSW5zdHIgKkNvbmRpdGlvbkRlZiA9IG51bGxwdHI7CisKKyAgICAvLy8gU2luZ2xlVXNlQ29uZGl0aW9uIGlzIHRydWUgaWYgQ29uZGl0aW9uRGVmIGlzIGRlYWQgZXhjZXB0IGZvciB0aGUKKyAgICAvLy8gYnJhbmNoKGVzKSBhdCB0aGUgZW5kIG9mIHRoZSBiYXNpYyBibG9jay4KKyAgICAvLy8KKyAgICBib29sIFNpbmdsZVVzZUNvbmRpdGlvbiA9IGZhbHNlOworCisgICAgZXhwbGljaXQgTWFjaGluZUJyYW5jaFByZWRpY2F0ZSgpID0gZGVmYXVsdDsKKyAgfTsKKworICAvLy8gQW5hbHl6ZSB0aGUgYnJhbmNoaW5nIGNvZGUgYXQgdGhlIGVuZCBvZiBNQkIgYW5kIHBhcnNlIGl0IGludG8gdGhlCisgIC8vLyBNYWNoaW5lQnJhbmNoUHJlZGljYXRlIHN0cnVjdHVyZSBpZiBwb3NzaWJsZS4gIFJldHVybnMgZmFsc2Ugb24gc3VjY2VzcworICAvLy8gYW5kIHRydWUgb24gZmFpbHVyZS4KKyAgLy8vCisgIC8vLyBJZiBBbGxvd01vZGlmeSBpcyB0cnVlLCB0aGVuIHRoaXMgcm91dGluZSBpcyBhbGxvd2VkIHRvIG1vZGlmeSB0aGUgYmFzaWMKKyAgLy8vIGJsb2NrIChlLmcuIGRlbGV0ZSBpbnN0cnVjdGlvbnMgYWZ0ZXIgdGhlIHVuY29uZGl0aW9uYWwgYnJhbmNoKS4KKyAgLy8vCisgIHZpcnR1YWwgYm9vbCBhbmFseXplQnJhbmNoUHJlZGljYXRlKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCcmFuY2hQcmVkaWNhdGUgJk1CUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd01vZGlmeSA9IGZhbHNlKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gUmVtb3ZlIHRoZSBicmFuY2hpbmcgY29kZSBhdCB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpYyBNQkIuCisgIC8vLyBUaGlzIGlzIG9ubHkgaW52b2tlZCBpbiBjYXNlcyB3aGVyZSBBbmFseXplQnJhbmNoIHJldHVybnMgc3VjY2Vzcy4gSXQKKyAgLy8vIHJldHVybnMgdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdGhhdCB3ZXJlIHJlbW92ZWQuCisgIC8vLyBJZiBccCBCeXRlc1JlbW92ZWQgaXMgbm9uLW51bGwsIHJlcG9ydCB0aGUgY2hhbmdlIGluIGNvZGUgc2l6ZSBmcm9tIHRoZQorICAvLy8gcmVtb3ZlZCBpbnN0cnVjdGlvbnMuCisgIHZpcnR1YWwgdW5zaWduZWQgcmVtb3ZlQnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqQnl0ZXNSZW1vdmVkID0gbnVsbHB0cikgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlRhcmdldCBkaWRuJ3QgaW1wbGVtZW50IFRhcmdldEluc3RySW5mbzo6cmVtb3ZlQnJhbmNoISIpOworICB9CisKKyAgLy8vIEluc2VydCBicmFuY2ggY29kZSBpbnRvIHRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCBNYWNoaW5lQmFzaWNCbG9jay4gVGhlCisgIC8vLyBvcGVyYW5kcyB0byB0aGlzIG1ldGhvZCBhcmUgdGhlIHNhbWUgYXMgdGhvc2UgcmV0dXJuZWQgYnkgQW5hbHl6ZUJyYW5jaC4KKyAgLy8vIFRoaXMgaXMgb25seSBpbnZva2VkIGluIGNhc2VzIHdoZXJlIEFuYWx5emVCcmFuY2ggcmV0dXJucyBzdWNjZXNzLiBJdAorICAvLy8gcmV0dXJucyB0aGUgbnVtYmVyIG9mIGluc3RydWN0aW9ucyBpbnNlcnRlZC4gSWYgXHAgQnl0ZXNBZGRlZCBpcyBub24tbnVsbCwKKyAgLy8vIHJlcG9ydCB0aGUgY2hhbmdlIGluIGNvZGUgc2l6ZSBmcm9tIHRoZSBhZGRlZCBpbnN0cnVjdGlvbnMuCisgIC8vLworICAvLy8gSXQgaXMgYWxzbyBpbnZva2VkIGJ5IHRhaWwgbWVyZ2luZyB0byBhZGQgdW5jb25kaXRpb25hbCBicmFuY2hlcyBpbgorICAvLy8gY2FzZXMgd2hlcmUgQW5hbHl6ZUJyYW5jaCBkb2Vzbid0IGFwcGx5IGJlY2F1c2UgdGhlcmUgd2FzIG5vIG9yaWdpbmFsCisgIC8vLyBicmFuY2ggdG8gYW5hbHl6ZS4gIEF0IGxlYXN0IHRoaXMgbXVjaCBtdXN0IGJlIGltcGxlbWVudGVkLCBlbHNlIHRhaWwKKyAgLy8vIG1lcmdpbmcgbmVlZHMgdG8gYmUgZGlzYWJsZWQuCisgIC8vLworICAvLy8gVGhlIENGRyBpbmZvcm1hdGlvbiBpbiBNQkIuUHJlZGVjZXNzb3JzIGFuZCBNQkIuU3VjY2Vzc29ycyBtdXN0IGJlIHZhbGlkCisgIC8vLyBiZWZvcmUgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICB2aXJ0dWFsIHVuc2lnbmVkIGluc2VydEJyYW5jaChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCBNYWNoaW5lQmFzaWNCbG9jayAqVEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxNYWNoaW5lT3BlcmFuZD4gQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdMb2MgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKkJ5dGVzQWRkZWQgPSBudWxscHRyKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVGFyZ2V0IGRpZG4ndCBpbXBsZW1lbnQgVGFyZ2V0SW5zdHJJbmZvOjppbnNlcnRCcmFuY2ghIik7CisgIH0KKworICB1bnNpZ25lZCBpbnNlcnRVbmNvbmRpdGlvbmFsQnJhbmNoKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2sgKkRlc3RCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z0xvYyAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICpCeXRlc0FkZGVkID0gbnVsbHB0cikgY29uc3QgeworICAgIHJldHVybiBpbnNlcnRCcmFuY2goTUJCLCBEZXN0QkIsIG51bGxwdHIsIEFycmF5UmVmPE1hY2hpbmVPcGVyYW5kPigpLCBETCwKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVzQWRkZWQpOworICB9CisKKyAgLy8vIEFuYWx5emUgdGhlIGxvb3AgY29kZSwgcmV0dXJuIHRydWUgaWYgaXQgY2Fubm90IGJlIHVuZGVyc3Rvby4gVXBvbgorICAvLy8gc3VjY2VzcywgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIGFuZCByZXR1cm5zIGluZm9ybWF0aW9uIGFib3V0IHRoZQorICAvLy8gaW5kdWN0aW9uIHZhcmlhYmxlIGFuZCBjb21wYXJlIGluc3RydWN0aW9uIHVzZWQgYXQgdGhlIGVuZC4KKyAgdmlydHVhbCBib29sIGFuYWx5emVMb29wKE1hY2hpbmVMb29wICZMLCBNYWNoaW5lSW5zdHIgKiZJbmRWYXJJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyIComQ21wSW5zdCkgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIEdlbmVyYXRlIGNvZGUgdG8gcmVkdWNlIHRoZSBsb29wIGl0ZXJhdGlvbiBieSBvbmUgYW5kIGNoZWNrIGlmIHRoZSBsb29wCisgIC8vLyBpcyBmaW5pc2hlZC4gIFJldHVybiB0aGUgdmFsdWUvcmVnaXN0ZXIgb2YgdGhlIG5ldyBsb29wIGNvdW50LiAgV2UgbmVlZAorICAvLy8gdGhpcyBmdW5jdGlvbiB3aGVuIHBlZWxpbmcgb2ZmIG9uZSBvciBtb3JlIGl0ZXJhdGlvbnMgb2YgYSBsb29wLiBUaGlzCisgIC8vLyBmdW5jdGlvbiBhc3N1bWVzIHRoZSBudGggaXRlcmF0aW9uIGlzIHBlZWxlZCBmaXJzdC4KKyAgdmlydHVhbCB1bnNpZ25lZCByZWR1Y2VMb29wQ291bnQoTWFjaGluZUJhc2ljQmxvY2sgJk1CQiwgTWFjaGluZUluc3RyICpJbmRWYXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVJbnN0ciAmQ21wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUluc3RyICo+ICZQcmV2SW5zdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEl0ZXIsIHVuc2lnbmVkIE1heEl0ZXIpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJUYXJnZXQgZGlkbid0IGltcGxlbWVudCBSZWR1Y2VMb29wQ291bnQiKTsKKyAgfQorCisgIC8vLyBEZWxldGUgdGhlIGluc3RydWN0aW9uIE9sZEluc3QgYW5kIGV2ZXJ5dGhpbmcgYWZ0ZXIgaXQsIHJlcGxhY2luZyBpdCB3aXRoCisgIC8vLyBhbiB1bmNvbmRpdGlvbmFsIGJyYW5jaCB0byBOZXdEZXN0LiBUaGlzIGlzIHVzZWQgYnkgdGhlIHRhaWwgbWVyZ2luZyBwYXNzLgorICB2aXJ0dWFsIHZvaWQgUmVwbGFjZVRhaWxXaXRoQnJhbmNoVG8oTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIFRhaWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTmV3RGVzdCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGl0J3MgbGVnYWwgdG8gc3BsaXQgdGhlIGdpdmVuIGJhc2ljCisgIC8vLyBibG9jayBhdCB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIChpLmUuIGluc3RydWN0aW9uIHdvdWxkIGJlIHRoZSBzdGFydAorICAvLy8gb2YgYSBuZXcgYmFzaWMgYmxvY2spLgorICB2aXJ0dWFsIGJvb2wgaXNMZWdhbFRvU3BsaXRNQkJBdChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUJCSSkgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGl0J3MgcHJvZml0YWJsZSB0byBwcmVkaWNhdGUKKyAgLy8vIGluc3RydWN0aW9ucyB3aXRoIGFjY3VtdWxhdGVkIGluc3RydWN0aW9uIGxhdGVuY3kgb2YgIk51bUN5Y2xlcyIKKyAgLy8vIG9mIHRoZSBzcGVjaWZpZWQgYmFzaWMgYmxvY2ssIHdoZXJlIHRoZSBwcm9iYWJpbGl0eSBvZiB0aGUgaW5zdHJ1Y3Rpb25zCisgIC8vLyBiZWluZyBleGVjdXRlZCBpcyBnaXZlbiBieSBQcm9iYWJpbGl0eSwgYW5kIENvbmZpZGVuY2UgaXMgYSBtZWFzdXJlCisgIC8vLyBvZiBvdXIgY29uZmlkZW5jZSB0aGF0IGl0IHdpbGwgYmUgcHJvcGVybHkgcHJlZGljdGVkLgorICB2aXJ0dWFsIGJvb2wgaXNQcm9maXRhYmxlVG9JZkN2dChNYWNoaW5lQmFzaWNCbG9jayAmTUJCLCB1bnNpZ25lZCBOdW1DeWNsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEV4dHJhUHJlZEN5Y2xlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnJhbmNoUHJvYmFiaWxpdHkgUHJvYmFiaWxpdHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gU2Vjb25kIHZhcmlhbnQgb2YgaXNQcm9maXRhYmxlVG9JZkN2dC4gVGhpcyBvbmUKKyAgLy8vIGNoZWNrcyBmb3IgdGhlIGNhc2Ugd2hlcmUgdHdvIGJhc2ljIGJsb2NrcyBmcm9tIHRydWUgYW5kIGZhbHNlIHBhdGgKKyAgLy8vIG9mIGEgaWYtdGhlbi1lbHNlIChkaWFtb25kKSBhcmUgcHJlZGljYXRlZCBvbiBtdXRhbGx5IGV4Y2x1c2l2ZQorICAvLy8gcHJlZGljYXRlcywgd2hlcmUgdGhlIHByb2JhYmlsaXR5IG9mIHRoZSB0cnVlIHBhdGggYmVpbmcgdGFrZW4gaXMgZ2l2ZW4KKyAgLy8vIGJ5IFByb2JhYmlsaXR5LCBhbmQgQ29uZmlkZW5jZSBpcyBhIG1lYXN1cmUgb2Ygb3VyIGNvbmZpZGVuY2UgdGhhdCBpdAorICAvLy8gd2lsbCBiZSBwcm9wZXJseSBwcmVkaWN0ZWQuCisgIHZpcnR1YWwgYm9vbCBpc1Byb2ZpdGFibGVUb0lmQ3Z0KE1hY2hpbmVCYXNpY0Jsb2NrICZUTUJCLCB1bnNpZ25lZCBOdW1UQ3ljbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFeHRyYVRDeWNsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZGTUJCLCB1bnNpZ25lZCBOdW1GQ3ljbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFeHRyYUZDeWNsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJyYW5jaFByb2JhYmlsaXR5IFByb2JhYmlsaXR5KSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGl0J3MgcHJvZml0YWJsZSBmb3IgaWYtY29udmVydGVyIHRvIGR1cGxpY2F0ZSBpbnN0cnVjdGlvbnMKKyAgLy8vIG9mIHNwZWNpZmllZCBhY2N1bXVsYXRlZCBpbnN0cnVjdGlvbiBsYXRlbmNpZXMgaW4gdGhlIHNwZWNpZmllZCBNQkIgdG8KKyAgLy8vIGVuYWJsZSBpZi1jb252ZXJzaW9uLgorICAvLy8gVGhlIHByb2JhYmlsaXR5IG9mIHRoZSBpbnN0cnVjdGlvbnMgYmVpbmcgZXhlY3V0ZWQgaXMgZ2l2ZW4gYnkKKyAgLy8vIFByb2JhYmlsaXR5LCBhbmQgQ29uZmlkZW5jZSBpcyBhIG1lYXN1cmUgb2Ygb3VyIGNvbmZpZGVuY2UgdGhhdCBpdAorICAvLy8gd2lsbCBiZSBwcm9wZXJseSBwcmVkaWN0ZWQuCisgIHZpcnR1YWwgYm9vbCBpc1Byb2ZpdGFibGVUb0R1cEZvcklmQ3Z0KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUN5Y2xlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnJhbmNoUHJvYmFiaWxpdHkgUHJvYmFiaWxpdHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgaXQncyBwcm9maXRhYmxlIHRvIHVucHJlZGljYXRlCisgIC8vLyBvbmUgc2lkZSBvZiBhICdkaWFtb25kJywgaS5lLiB0d28gc2lkZXMgb2YgaWYtZWxzZSBwcmVkaWNhdGVkIG9uIG11dHVhbGx5CisgIC8vLyBleGNsdXNpdmUgcHJlZGljYXRlcy4KKyAgLy8vIGUuZy4KKyAgLy8vICAgc3ViZXEgIHIwLCByMSwgIzEKKyAgLy8vICAgYWRkbmUgIHIwLCByMSwgIzEKKyAgLy8vID0+CisgIC8vLyAgIHN1YiAgICByMCwgcjEsICMxCisgIC8vLyAgIGFkZG5lICByMCwgcjEsICMxCisgIC8vLworICAvLy8gVGhpcyBtYXkgYmUgcHJvZml0YWJsZSBpcyBjb25kaXRpb25hbCBpbnN0cnVjdGlvbnMgYXJlIGFsd2F5cyBleGVjdXRlZC4KKyAgdmlydHVhbCBib29sIGlzUHJvZml0YWJsZVRvVW5wcmVkaWNhdGUoTWFjaGluZUJhc2ljQmxvY2sgJlRNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICZGTUJCKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGluc2VydCBhIHNlbGVjdAorICAvLy8gaW5zdHJ1Y3Rpb24gdGhhdCBjaG9vc2VzIGJldHdlZW4gVHJ1ZVJlZyBhbmQgRmFsc2VSZWcgYmFzZWQgb24gdGhlCisgIC8vLyBjb25kaXRpb24gY29kZSBpbiBDb25kLgorICAvLy8KKyAgLy8vIFdoZW4gc3VjY2Vzc2Z1bCwgYWxzbyByZXR1cm4gdGhlIGxhdGVuY3kgaW4gY3ljbGVzIGZyb20gVHJ1ZVJlZywKKyAgLy8vIEZhbHNlUmVnLCBhbmQgQ29uZCB0byB0aGUgZGVzdGluYXRpb24gcmVnaXN0ZXIuIEluIG1vc3QgY2FzZXMsIGEgc2VsZWN0CisgIC8vLyBpbnN0cnVjdGlvbiB3aWxsIGJlIDEgY3ljbGUsIHNvIENvbmRDeWNsZXMgPSBUcnVlQ3ljbGVzID0gRmFsc2VDeWNsZXMgPSAxCisgIC8vLworICAvLy8gU29tZSB4ODYgaW1wbGVtZW50YXRpb25zIGhhdmUgMi1jeWNsZSBjbW92IGluc3RydWN0aW9ucy4KKyAgLy8vCisgIC8vLyBAcGFyYW0gTUJCICAgICAgICAgQmxvY2sgd2hlcmUgc2VsZWN0IGluc3RydWN0aW9uIHdvdWxkIGJlIGluc2VydGVkLgorICAvLy8gQHBhcmFtIENvbmQgICAgICAgIENvbmRpdGlvbiByZXR1cm5lZCBieSBBbmFseXplQnJhbmNoLgorICAvLy8gQHBhcmFtIFRydWVSZWcgICAgIFZpcnR1YWwgcmVnaXN0ZXIgdG8gc2VsZWN0IHdoZW4gQ29uZCBpcyB0cnVlLgorICAvLy8gQHBhcmFtIEZhbHNlUmVnICAgIFZpcnR1YWwgcmVnaXN0ZXIgdG8gc2VsZWN0IHdoZW4gQ29uZCBpcyBmYWxzZS4KKyAgLy8vIEBwYXJhbSBDb25kQ3ljbGVzICBMYXRlbmN5IGZyb20gQ29uZCtCcmFuY2ggdG8gc2VsZWN0IG91dHB1dC4KKyAgLy8vIEBwYXJhbSBUcnVlQ3ljbGVzICBMYXRlbmN5IGZyb20gVHJ1ZVJlZyB0byBzZWxlY3Qgb3V0cHV0LgorICAvLy8gQHBhcmFtIEZhbHNlQ3ljbGVzIExhdGVuY3kgZnJvbSBGYWxzZVJlZyB0byBzZWxlY3Qgb3V0cHV0LgorICB2aXJ0dWFsIGJvb2wgY2FuSW5zZXJ0U2VsZWN0KGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8TWFjaGluZU9wZXJhbmQ+IENvbmQsIHVuc2lnbmVkIFRydWVSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmFsc2VSZWcsIGludCAmQ29uZEN5Y2xlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJlRydWVDeWNsZXMsIGludCAmRmFsc2VDeWNsZXMpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gSW5zZXJ0IGEgc2VsZWN0IGluc3RydWN0aW9uIGludG8gTUJCIGJlZm9yZSBJIHRoYXQgd2lsbCBjb3B5IFRydWVSZWcgdG8KKyAgLy8vIERzdFJlZyB3aGVuIENvbmQgaXMgdHJ1ZSwgYW5kIEZhbHNlUmVnIHRvIERzdFJlZyB3aGVuIENvbmQgaXMgZmFsc2UuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgY2FuSW5zZXJ0U2VsZWN0KCkgcmV0dXJuZWQgdHJ1ZS4KKyAgLy8vIFRoZSBjb25kaXRpb24gaW4gQ29uZCBjb21lcyBmcm9tIEFuYWx5emVCcmFuY2gsIGFuZCBpdCBjYW4gYmUgYXNzdW1lZAorICAvLy8gdGhhdCB0aGUgc2FtZSBmbGFncyBvciByZWdpc3RlcnMgcmVxdWlyZWQgYnkgQ29uZCBhcmUgYXZhaWxhYmxlIGF0IHRoZQorICAvLy8gaW5zZXJ0aW9uIHBvaW50LgorICAvLy8KKyAgLy8vIEBwYXJhbSBNQkIgICAgICBCbG9jayB3aGVyZSBzZWxlY3QgaW5zdHJ1Y3Rpb24gc2hvdWxkIGJlIGluc2VydGVkLgorICAvLy8gQHBhcmFtIEkgICAgICAgIEluc2VydGlvbiBwb2ludC4KKyAgLy8vIEBwYXJhbSBETCAgICAgICBTb3VyY2UgbG9jYXRpb24gZm9yIGRlYnVnZ2luZy4KKyAgLy8vIEBwYXJhbSBEc3RSZWcgICBWaXJ0dWFsIHJlZ2lzdGVyIHRvIGJlIGRlZmluZWQgYnkgc2VsZWN0IGluc3RydWN0aW9uLgorICAvLy8gQHBhcmFtIENvbmQgICAgIENvbmRpdGlvbiBhcyBjb21wdXRlZCBieSBBbmFseXplQnJhbmNoLgorICAvLy8gQHBhcmFtIFRydWVSZWcgIFZpcnR1YWwgcmVnaXN0ZXIgdG8gY29weSB3aGVuIENvbmQgaXMgdHJ1ZS4KKyAgLy8vIEBwYXJhbSBGYWxzZVJlZyBWaXJ0dWFsIHJlZ2lzdGVyIHRvIGNvcHkgd2hlbiBDb25zIGlzIGZhbHNlLgorICB2aXJ0dWFsIHZvaWQgaW5zZXJ0U2VsZWN0KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksIGNvbnN0IERlYnVnTG9jICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEc3RSZWcsIEFycmF5UmVmPE1hY2hpbmVPcGVyYW5kPiBDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFRydWVSZWcsIHVuc2lnbmVkIEZhbHNlUmVnKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVGFyZ2V0IGRpZG4ndCBpbXBsZW1lbnQgVGFyZ2V0SW5zdHJJbmZvOjppbnNlcnRTZWxlY3QhIik7CisgIH0KKworICAvLy8gQW5hbHl6ZSB0aGUgZ2l2ZW4gc2VsZWN0IGluc3RydWN0aW9uLCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLy8gaXQgY2Fubm90IGJlIHVuZGVyc3Rvb2QuIEl0IGlzIGFzc3VtZWQgdGhhdCBNSS0+aXNTZWxlY3QoKSBpcyB0cnVlLgorICAvLy8KKyAgLy8vIFdoZW4gc3VjY2Vzc2Z1bCwgcmV0dXJuIHRoZSBjb250cm9sbGluZyBjb25kaXRpb24gYW5kIHRoZSBvcGVyYW5kcyB0aGF0CisgIC8vLyBkZXRlcm1pbmUgdGhlIHRydWUgYW5kIGZhbHNlIHJlc3VsdCB2YWx1ZXMuCisgIC8vLworICAvLy8gICBSZXN1bHQgPSBTRUxFQ1QgQ29uZCwgVHJ1ZU9wLCBGYWxzZU9wCisgIC8vLworICAvLy8gU29tZSB0YXJnZXRzIGNhbiBvcHRpbWl6ZSBzZWxlY3QgaW5zdHJ1Y3Rpb25zLCBmb3IgZXhhbXBsZSBieSBwcmVkaWNhdGluZworICAvLy8gdGhlIGluc3RydWN0aW9uIGRlZmluaW5nIG9uZSBvZiB0aGUgb3BlcmFuZHMuIFN1Y2ggdGFyZ2V0cyBzaG91bGQgc2V0CisgIC8vLyBPcHRpbWl6YWJsZS4KKyAgLy8vCisgIC8vLyBAcGFyYW0gICAgICAgICBNSSBTZWxlY3QgaW5zdHJ1Y3Rpb24gdG8gYW5hbHl6ZS4KKyAgLy8vIEBwYXJhbSBDb25kICAgIENvbmRpdGlvbiBjb250cm9sbGluZyB0aGUgc2VsZWN0LgorICAvLy8gQHBhcmFtIFRydWVPcCAgT3BlcmFuZCBudW1iZXIgb2YgdGhlIHZhbHVlIHNlbGVjdGVkIHdoZW4gQ29uZCBpcyB0cnVlLgorICAvLy8gQHBhcmFtIEZhbHNlT3AgT3BlcmFuZCBudW1iZXIgb2YgdGhlIHZhbHVlIHNlbGVjdGVkIHdoZW4gQ29uZCBpcyBmYWxzZS4KKyAgLy8vIEBwYXJhbSBPcHRpbWl6YWJsZSBSZXR1cm5lZCBhcyB0cnVlIGlmIE1JIGlzIG9wdGltaXphYmxlLgorICAvLy8gQHJldHVybnMgRmFsc2Ugb24gc3VjY2Vzcy4KKyAgdmlydHVhbCBib29sIGFuYWx5emVTZWxlY3QoY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJlRydWVPcCwgdW5zaWduZWQgJkZhbHNlT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgJk9wdGltaXphYmxlKSBjb25zdCB7CisgICAgYXNzZXJ0KE1JLmdldERlc2MoKS5pc1NlbGVjdCgpICYmICJNSSBtdXN0IGJlIGEgc2VsZWN0IGluc3RydWN0aW9uIik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gR2l2ZW4gYSBzZWxlY3QgaW5zdHJ1Y3Rpb24gdGhhdCB3YXMgdW5kZXJzdG9vZCBieQorICAvLy8gYW5hbHl6ZVNlbGVjdCBhbmQgcmV0dXJuZWQgT3B0aW1pemFibGUgPSB0cnVlLCBhdHRlbXB0IHRvIG9wdGltaXplIE1JIGJ5CisgIC8vLyBtZXJnaW5nIGl0IHdpdGggb25lIG9mIGl0cyBvcGVyYW5kcy4gUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUuCisgIC8vLworICAvLy8gV2hlbiBzdWNjZXNzZnVsLCByZXR1cm5zIHRoZSBuZXcgc2VsZWN0IGluc3RydWN0aW9uLiBUaGUgY2xpZW50IGlzCisgIC8vLyByZXNwb25zaWJsZSBmb3IgZGVsZXRpbmcgTUkuCisgIC8vLworICAvLy8gSWYgYm90aCBzaWRlcyBvZiB0aGUgc2VsZWN0IGNhbiBiZSBvcHRpbWl6ZWQsIFByZWZlckZhbHNlIGlzIHVzZWQgdG8gcGljaworICAvLy8gYSBzaWRlLgorICAvLy8KKyAgLy8vIEBwYXJhbSBNSSAgICAgICAgICBPcHRpbWl6YWJsZSBzZWxlY3QgaW5zdHJ1Y3Rpb24uCisgIC8vLyBAcGFyYW0gTmV3TUlzICAgICBTZXQgdGhhdCByZWNvcmQgYWxsIE1JcyBpbiB0aGUgYmFzaWMgYmxvY2sgdXAgdG8gXHAKKyAgLy8vIE1JLiBIYXMgdG8gYmUgdXBkYXRlZCB3aXRoIGFueSBuZXdseSBjcmVhdGVkIE1JIG9yIGRlbGV0ZWQgb25lcy4KKyAgLy8vIEBwYXJhbSBQcmVmZXJGYWxzZSBUcnkgdG8gb3B0aW1pemUgRmFsc2VPcCBpbnN0ZWFkIG9mIFRydWVPcC4KKyAgLy8vIEByZXR1cm5zIE9wdGltaXplZCBpbnN0cnVjdGlvbiBvciBOVUxMLgorICB2aXJ0dWFsIE1hY2hpbmVJbnN0ciAqb3B0aW1pemVTZWxlY3QoTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsUHRyU2V0SW1wbDxNYWNoaW5lSW5zdHIgKj4gJk5ld01JcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUHJlZmVyRmFsc2UgPSBmYWxzZSkgY29uc3QgeworICAgIC8vIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBpbXBsZW1lbnRlZCBpZiBPcHRpbWl6YWJsZSBpcyBldmVyIHNldC4KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJUYXJnZXQgbXVzdCBpbXBsZW1lbnQgVGFyZ2V0SW5zdHJJbmZvOjpvcHRpbWl6ZVNlbGVjdCEiKTsKKyAgfQorCisgIC8vLyBFbWl0IGluc3RydWN0aW9ucyB0byBjb3B5IGEgcGFpciBvZiBwaHlzaWNhbCByZWdpc3RlcnMuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgc3VwcG9ydCBjb3BpZXMgd2l0aGluIGFueSBsZWdhbCByZWdpc3RlciBjbGFzcyBhcworICAvLy8gd2VsbCBhcyBhbnkgY3Jvc3MtY2xhc3MgY29waWVzIGNyZWF0ZWQgZHVyaW5nIGluc3RydWN0aW9uIHNlbGVjdGlvbi4KKyAgLy8vCisgIC8vLyBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiByZWdpc3RlcnMgbWF5IG92ZXJsYXAsIHdoaWNoIG1heSByZXF1aXJlIGEKKyAgLy8vIGNhcmVmdWwgaW1wbGVtZW50YXRpb24gd2hlbiBtdWx0aXBsZSBjb3B5IGluc3RydWN0aW9ucyBhcmUgcmVxdWlyZWQgZm9yCisgIC8vLyBsYXJnZSByZWdpc3RlcnMuIFNlZSBmb3IgZXhhbXBsZSB0aGUgQVJNIHRhcmdldC4KKyAgdmlydHVhbCB2b2lkIGNvcHlQaHlzUmVnKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksIGNvbnN0IERlYnVnTG9jICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlc3RSZWcsIHVuc2lnbmVkIFNyY1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgS2lsbFNyYykgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlRhcmdldCBkaWRuJ3QgaW1wbGVtZW50IFRhcmdldEluc3RySW5mbzo6Y29weVBoeXNSZWchIik7CisgIH0KKworICAvLy8gU3RvcmUgdGhlIHNwZWNpZmllZCByZWdpc3RlciBvZiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgY2xhc3MgdG8gdGhlIHNwZWNpZmllZAorICAvLy8gc3RhY2sgZnJhbWUgaW5kZXguIFRoZSBzdG9yZSBpbnN0cnVjdGlvbiBpcyB0byBiZSBhZGRlZCB0byB0aGUgZ2l2ZW4KKyAgLy8vIG1hY2hpbmUgYmFzaWMgYmxvY2sgYmVmb3JlIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0cnVjdGlvbi4gSWYgaXNLaWxsCisgIC8vLyBpcyB0cnVlLCB0aGUgcmVnaXN0ZXIgb3BlcmFuZCBpcyB0aGUgbGFzdCB1c2UgYW5kIG11c3QgYmUgbWFya2VkIGtpbGwuCisgIHZpcnR1YWwgdm9pZCBzdG9yZVJlZ1RvU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjUmVnLCBib29sIGlzS2lsbCwgaW50IEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlRhcmdldCBkaWRuJ3QgaW1wbGVtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICJUYXJnZXRJbnN0ckluZm86OnN0b3JlUmVnVG9TdGFja1Nsb3QhIik7CisgIH0KKworICAvLy8gTG9hZCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIG9mIHRoZSBnaXZlbiByZWdpc3RlciBjbGFzcyBmcm9tIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHN0YWNrIGZyYW1lIGluZGV4LiBUaGUgbG9hZCBpbnN0cnVjdGlvbiBpcyB0byBiZSBhZGRlZCB0byB0aGUgZ2l2ZW4KKyAgLy8vIG1hY2hpbmUgYmFzaWMgYmxvY2sgYmVmb3JlIHRoZSBzcGVjaWZpZWQgbWFjaGluZSBpbnN0cnVjdGlvbi4KKyAgdmlydHVhbCB2b2lkIGxvYWRSZWdGcm9tU3RhY2tTbG90KE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXN0UmVnLCBpbnQgRnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJUYXJnZXQgZGlkbid0IGltcGxlbWVudCAiCisgICAgICAgICAgICAgICAgICAgICAiVGFyZ2V0SW5zdHJJbmZvOjpsb2FkUmVnRnJvbVN0YWNrU2xvdCEiKTsKKyAgfQorCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBmb3IgYWxsIHBzZXVkbyBpbnN0cnVjdGlvbnMKKyAgLy8vIHRoYXQgcmVtYWluIGFmdGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24uIE1hbnkgcHNldWRvIGluc3RydWN0aW9ucyBhcmUKKyAgLy8vIGNyZWF0ZWQgdG8gaGVscCByZWdpc3RlciBhbGxvY2F0aW9uLiBUaGlzIGlzIHRoZSBwbGFjZSB0byBjb252ZXJ0IHRoZW0KKyAgLy8vIGludG8gcmVhbCBpbnN0cnVjdGlvbnMuIFRoZSB0YXJnZXQgY2FuIGVkaXQgTUkgaW4gcGxhY2UsIG9yIGl0IGNhbiBpbnNlcnQKKyAgLy8vIG5ldyBpbnN0cnVjdGlvbnMgYW5kIGVyYXNlIE1JLiBUaGUgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB0cnVlIGlmCisgIC8vLyBhbnl0aGluZyB3YXMgY2hhbmdlZC4KKyAgdmlydHVhbCBib29sIGV4cGFuZFBvc3RSQVBzZXVkbyhNYWNoaW5lSW5zdHIgJk1JKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBDaGVjayB3aGV0aGVyIHRoZSB0YXJnZXQgY2FuIGZvbGQgYSBsb2FkIHRoYXQgZmVlZHMgYSBzdWJyZWcgb3BlcmFuZAorICAvLy8gKG9yIGEgc3VicmVnIG9wZXJhbmQgdGhhdCBmZWVkcyBhIHN0b3JlKS4KKyAgLy8vIEZvciBleGFtcGxlLCBYODYgbWF5IHdhbnQgdG8gcmV0dXJuIHRydWUgaWYgaXQgY2FuIGZvbGQKKyAgLy8vIG1vdmwgKCVlc3ApLCAlZWF4CisgIC8vLyBzdWJiLCAlYWwsIC4uLgorICAvLy8gSW50bzoKKyAgLy8vIHN1YmIgKCVlc3ApLCAuLi4KKyAgLy8vCisgIC8vLyBJZGVhbGx5LCB3ZSdkIGxpa2UgdGhlIHRhcmdldCBpbXBsZW1lbnRhdGlvbiBvZiBmb2xkTWVtb3J5T3BlcmFuZCgpIHRvCisgIC8vLyByZWplY3Qgc3VicmVncyAtIGJ1dCBzaW5jZSB0aGlzIGJlaGF2aW9yIHVzZWQgdG8gYmUgZW5mb3JjZWQgaW4gdGhlCisgIC8vLyB0YXJnZXQtaW5kZXBlbmRlbnQgY29kZSwgbW92aW5nIHRoaXMgcmVzcG9uc2liaWxpdHkgdG8gdGhlIHRhcmdldHMKKyAgLy8vIGhhcyB0aGUgcG90ZW50aWFsIG9mIGNhdXNpbmcgbmFzdHkgc2lsZW50IGJyZWFrYWdlIGluIG91dC1vZi10cmVlIHRhcmdldHMuCisgIHZpcnR1YWwgYm9vbCBpc1N1YnJlZ0ZvbGRhYmxlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gQXR0ZW1wdCB0byBmb2xkIGEgbG9hZCBvciBzdG9yZSBvZiB0aGUgc3BlY2lmaWVkIHN0YWNrCisgIC8vLyBzbG90IGludG8gdGhlIHNwZWNpZmllZCBtYWNoaW5lIGluc3RydWN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIG9wZXJhbmQocykuCisgIC8vLyBJZiB0aGlzIGlzIHBvc3NpYmxlLCBhIG5ldyBpbnN0cnVjdGlvbiBpcyByZXR1cm5lZCB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgLy8vIG9wZXJhbmQgZm9sZGVkLCBvdGhlcndpc2UgTlVMTCBpcyByZXR1cm5lZC4KKyAgLy8vIFRoZSBuZXcgaW5zdHJ1Y3Rpb24gaXMgaW5zZXJ0ZWQgYmVmb3JlIE1JLCBhbmQgdGhlIGNsaWVudCBpcyByZXNwb25zaWJsZQorICAvLy8gZm9yIHJlbW92aW5nIHRoZSBvbGQgaW5zdHJ1Y3Rpb24uCisgIE1hY2hpbmVJbnN0ciAqZm9sZE1lbW9yeU9wZXJhbmQoTWFjaGluZUluc3RyICZNSSwgQXJyYXlSZWY8dW5zaWduZWQ+IE9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRnJhbWVJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXZlSW50ZXJ2YWxzICpMSVMgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gU2FtZSBhcyB0aGUgcHJldmlvdXMgdmVyc2lvbiBleGNlcHQgaXQgYWxsb3dzIGZvbGRpbmcgb2YgYW55IGxvYWQgYW5kCisgIC8vLyBzdG9yZSBmcm9tIC8gdG8gYW55IGFkZHJlc3MsIG5vdCBqdXN0IGZyb20gYSBzcGVjaWZpYyBzdGFjayBzbG90LgorICBNYWNoaW5lSW5zdHIgKmZvbGRNZW1vcnlPcGVyYW5kKE1hY2hpbmVJbnN0ciAmTUksIEFycmF5UmVmPHVuc2lnbmVkPiBPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICZMb2FkTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZUludGVydmFscyAqTElTID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIHdoZW4gdGhlcmUgaXMgcG90ZW50aWFsbHkgYSBmYXN0ZXIgY29kZSBzZXF1ZW5jZQorICAvLy8gZm9yIGFuIGluc3RydWN0aW9uIGNoYWluIGVuZGluZyBpbiBccCBSb290LiBBbGwgcG90ZW50aWFsIHBhdHRlcm5zIGFyZQorICAvLy8gcmV0dXJuZWQgaW4gdGhlIFxwIFBhdHRlcm4gdmVjdG9yLiBQYXR0ZXJuIHNob3VsZCBiZSBzb3J0ZWQgaW4gcHJpb3JpdHkKKyAgLy8vIG9yZGVyIHNpbmNlIHRoZSBwYXR0ZXJuIGV2YWx1YXRvciBzdG9wcyBjaGVja2luZyBhcyBzb29uIGFzIGl0IGZpbmRzIGEKKyAgLy8vIGZhc3RlciBzZXF1ZW5jZS4KKyAgLy8vIFxwYXJhbSBSb290IC0gSW5zdHJ1Y3Rpb24gdGhhdCBjb3VsZCBiZSBjb21iaW5lZCB3aXRoIG9uZSBvZiBpdHMgb3BlcmFuZHMKKyAgLy8vIFxwYXJhbSBQYXR0ZXJucyAtIFZlY3RvciBvZiBwb3NzaWJsZSBjb21iaW5hdGlvbiBwYXR0ZXJucworICB2aXJ0dWFsIGJvb2wgZ2V0TWFjaGluZUNvbWJpbmVyUGF0dGVybnMoCisgICAgICBNYWNoaW5lSW5zdHIgJlJvb3QsCisgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUNvbWJpbmVyUGF0dGVybj4gJlBhdHRlcm5zKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgd2hlbiBhIGNvZGUgc2VxdWVuY2UgY2FuIGltcHJvdmUgdGhyb3VnaHB1dC4gSXQKKyAgLy8vIHNob3VsZCBiZSBjYWxsZWQgb25seSBmb3IgaW5zdHJ1Y3Rpb25zIGluIGxvb3BzLgorICAvLy8gXHBhcmFtIFBhdHRlcm4gLSBjb21iaW5lciBwYXR0ZXJuCisgIHZpcnR1YWwgYm9vbCBpc1Rocm91Z2hwdXRQYXR0ZXJuKE1hY2hpbmVDb21iaW5lclBhdHRlcm4gUGF0dGVybikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBpbnB1dCBcUCBJbnN0IGlzIHBhcnQgb2YgYSBjaGFpbiBvZiBkZXBlbmRlbnQgb3BzCisgIC8vLyB0aGF0IGFyZSBzdWl0YWJsZSBmb3IgcmVhc3NvY2lhdGlvbiwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KKyAgLy8vIElmIHRoZSBpbnN0cnVjdGlvbidzIG9wZXJhbmRzIG11c3QgYmUgY29tbXV0ZWQgdG8gaGF2ZSBhIHByZXZpb3VzCisgIC8vLyBpbnN0cnVjdGlvbiBvZiB0aGUgc2FtZSB0eXBlIGRlZmluZSB0aGUgZmlyc3Qgc291cmNlIG9wZXJhbmQsIFxQIENvbW11dGVkCisgIC8vLyB3aWxsIGJlIHNldCB0byB0cnVlLgorICBib29sIGlzUmVhc3NvY2lhdGlvbkNhbmRpZGF0ZShjb25zdCBNYWNoaW5lSW5zdHIgJkluc3QsIGJvb2wgJkNvbW11dGVkKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgd2hlbiBcUCBJbnN0IGlzIGJvdGggYXNzb2NpYXRpdmUgYW5kIGNvbW11dGF0aXZlLgorICB2aXJ0dWFsIGJvb2wgaXNBc3NvY2lhdGl2ZUFuZENvbW11dGF0aXZlKGNvbnN0IE1hY2hpbmVJbnN0ciAmSW5zdCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSB3aGVuIFxQIEluc3QgaGFzIHJlYXNzb2NpYWJsZSBvcGVyYW5kcyBpbiB0aGUgc2FtZSBcUCBNQkIuCisgIHZpcnR1YWwgYm9vbCBoYXNSZWFzc29jaWFibGVPcGVyYW5kcyhjb25zdCBNYWNoaW5lSW5zdHIgJkluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgd2hlbiBcUCBJbnN0IGhhcyByZWFzc29jaWFibGUgc2libGluZy4KKyAgYm9vbCBoYXNSZWFzc29jaWFibGVTaWJsaW5nKGNvbnN0IE1hY2hpbmVJbnN0ciAmSW5zdCwgYm9vbCAmQ29tbXV0ZWQpIGNvbnN0OworCisgIC8vLyBXaGVuIGdldE1hY2hpbmVDb21iaW5lclBhdHRlcm5zKCkgZmluZHMgcGF0dGVybnMsIHRoaXMgZnVuY3Rpb24gZ2VuZXJhdGVzCisgIC8vLyB0aGUgaW5zdHJ1Y3Rpb25zIHRoYXQgY291bGQgcmVwbGFjZSB0aGUgb3JpZ2luYWwgY29kZSBzZXF1ZW5jZS4gVGhlIGNsaWVudAorICAvLy8gaGFzIHRvIGRlY2lkZSB3aGV0aGVyIHRoZSBhY3R1YWwgcmVwbGFjZW1lbnQgaXMgYmVuZWZpY2lhbCBvciBub3QuCisgIC8vLyBccGFyYW0gUm9vdCAtIEluc3RydWN0aW9uIHRoYXQgY291bGQgYmUgY29tYmluZWQgd2l0aCBvbmUgb2YgaXRzIG9wZXJhbmRzCisgIC8vLyBccGFyYW0gUGF0dGVybiAtIENvbWJpbmF0aW9uIHBhdHRlcm4gZm9yIFJvb3QKKyAgLy8vIFxwYXJhbSBJbnNJbnN0cnMgLSBWZWN0b3Igb2YgbmV3IGluc3RydWN0aW9ucyB0aGF0IGltcGxlbWVudCBQCisgIC8vLyBccGFyYW0gRGVsSW5zdHJzIC0gT2xkIGluc3RydWN0aW9ucywgaW5jbHVkaW5nIFJvb3QsIHRoYXQgY291bGQgYmUKKyAgLy8vIHJlcGxhY2VkIGJ5IEluc0luc3RyCisgIC8vLyBccGFyYW0gSW5zdHJJZHhGb3JWaXJ0UmVnIC0gbWFwIG9mIHZpcnR1YWwgcmVnaXN0ZXIgdG8gaW5zdHJ1Y3Rpb24gaW4KKyAgLy8vIEluc0luc3RyIHRoYXQgZGVmaW5lcyBpdAorICB2aXJ0dWFsIHZvaWQgZ2VuQWx0ZXJuYXRpdmVDb2RlU2VxdWVuY2UoCisgICAgICBNYWNoaW5lSW5zdHIgJlJvb3QsIE1hY2hpbmVDb21iaW5lclBhdHRlcm4gUGF0dGVybiwKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIgKj4gJkluc0luc3RycywKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lSW5zdHIgKj4gJkRlbEluc3RycywKKyAgICAgIERlbnNlTWFwPHVuc2lnbmVkLCB1bnNpZ25lZD4gJkluc3RySWR4Rm9yVmlydFJlZykgY29uc3Q7CisKKyAgLy8vIEF0dGVtcHQgdG8gcmVhc3NvY2lhdGUgXFAgUm9vdCBhbmQgXFAgUHJldiBhY2NvcmRpbmcgdG8gXFAgUGF0dGVybiB0bworICAvLy8gcmVkdWNlIGNyaXRpY2FsIHBhdGggbGVuZ3RoLgorICB2b2lkIHJlYXNzb2NpYXRlT3BzKE1hY2hpbmVJbnN0ciAmUm9vdCwgTWFjaGluZUluc3RyICZQcmV2LAorICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVDb21iaW5lclBhdHRlcm4gUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUluc3RyICo+ICZJbnNJbnN0cnMsCisgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVJbnN0ciAqPiAmRGVsSW5zdHJzLAorICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPHVuc2lnbmVkLCB1bnNpZ25lZD4gJkluc3RySWR4Rm9yVmlydFJlZykgY29uc3Q7CisKKyAgLy8vIFRoaXMgaXMgYW4gYXJjaGl0ZWN0dXJlLXNwZWNpZmljIGhlbHBlciBmdW5jdGlvbiBvZiByZWFzc29jaWF0ZU9wcy4KKyAgLy8vIFNldCBzcGVjaWFsIG9wZXJhbmQgYXR0cmlidXRlcyBmb3IgbmV3IGluc3RydWN0aW9ucyBhZnRlciByZWFzc29jaWF0aW9uLgorICB2aXJ0dWFsIHZvaWQgc2V0U3BlY2lhbE9wZXJhbmRBdHRyKE1hY2hpbmVJbnN0ciAmT2xkTUkxLCBNYWNoaW5lSW5zdHIgJk9sZE1JMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgJk5ld01JMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgJk5ld01JMikgY29uc3Qge30KKworICAvLy8gUmV0dXJuIHRydWUgd2hlbiBhIHRhcmdldCBzdXBwb3J0cyBNYWNoaW5lQ29tYmluZXIuCisgIHZpcnR1YWwgYm9vbCB1c2VNYWNoaW5lQ29tYmluZXIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gU0ROb2RlIGNhbiBiZSBjb3BpZWQgZHVyaW5nIHNjaGVkdWxpbmcKKyAgLy8vIGV2ZW4gaWYgaXQgaGFzIGdsdWUuCisgIHZpcnR1YWwgYm9vbCBjYW5Db3B5R2x1ZWROb2RlRHVyaW5nU2NoZWR1bGUoU0ROb2RlICpOKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBSZW1lbWJlciB3aGF0IHJlZ2lzdGVycyB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIHVzZXMgYW5kIG1vZGlmaWVzLgorICB2aXJ0dWFsIHZvaWQgdHJhY2tSZWdEZWZzVXNlcyhjb25zdCBNYWNoaW5lSW5zdHIgJk1JLCBCaXRWZWN0b3IgJk1vZGlmaWVkUmVncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQml0VmVjdG9yICZVc2VkUmVncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgIC8vLyBUYXJnZXQtZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIGZvciBmb2xkTWVtb3J5T3BlcmFuZC4KKyAgLy8vIFRhcmdldC1pbmRlcGVuZGVudCBjb2RlIGluIGZvbGRNZW1vcnlPcGVyYW5kIHdpbGwKKyAgLy8vIHRha2UgY2FyZSBvZiBhZGRpbmcgYSBNYWNoaW5lTWVtT3BlcmFuZCB0byB0aGUgbmV3bHkgY3JlYXRlZCBpbnN0cnVjdGlvbi4KKyAgLy8vIFRoZSBpbnN0cnVjdGlvbiBhbmQgYW55IGF1eGlsaWFyeSBpbnN0cnVjdGlvbnMgbmVjZXNzYXJ5IHdpbGwgYmUgaW5zZXJ0ZWQKKyAgLy8vIGF0IEluc2VydFB0LgorICB2aXJ0dWFsIE1hY2hpbmVJbnN0ciAqCisgIGZvbGRNZW1vcnlPcGVyYW5kSW1wbChNYWNoaW5lRnVuY3Rpb24gJk1GLCBNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IE9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRQdCwgaW50IEZyYW1lSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBMaXZlSW50ZXJ2YWxzICpMSVMgPSBudWxscHRyKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gVGFyZ2V0LWRlcGVuZGVudCBpbXBsZW1lbnRhdGlvbiBmb3IgZm9sZE1lbW9yeU9wZXJhbmQuCisgIC8vLyBUYXJnZXQtaW5kZXBlbmRlbnQgY29kZSBpbiBmb2xkTWVtb3J5T3BlcmFuZCB3aWxsCisgIC8vLyB0YWtlIGNhcmUgb2YgYWRkaW5nIGEgTWFjaGluZU1lbU9wZXJhbmQgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIC8vLyBUaGUgaW5zdHJ1Y3Rpb24gYW5kIGFueSBhdXhpbGlhcnkgaW5zdHJ1Y3Rpb25zIG5lY2Vzc2FyeSB3aWxsIGJlIGluc2VydGVkCisgIC8vLyBhdCBJbnNlcnRQdC4KKyAgdmlydHVhbCBNYWNoaW5lSW5zdHIgKmZvbGRNZW1vcnlPcGVyYW5kSW1wbCgKKyAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYsIE1hY2hpbmVJbnN0ciAmTUksIEFycmF5UmVmPHVuc2lnbmVkPiBPcHMsCisgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0UHQsIE1hY2hpbmVJbnN0ciAmTG9hZE1JLAorICAgICAgTGl2ZUludGVydmFscyAqTElTID0gbnVsbHB0cikgY29uc3QgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIFxicmllZiBUYXJnZXQtZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIG9mIGdldFJlZ1NlcXVlbmNlSW5wdXRzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQgdGhlIGVxdWl2YWxlbnQKKyAgLy8vIFJFR19TRVFVRU5DRSBpbnB1dHMgd2l0aCB0aGUgcGFpciBccCBNSSwgXHAgRGVmSWR4LiBGYWxzZSBvdGhlcndpc2UuCisgIC8vLworICAvLy8gXHByZSBNSS5pc1JlZ1NlcXVlbmNlTGlrZSgpLgorICAvLy8KKyAgLy8vIFxzZWUgVGFyZ2V0SW5zdHJJbmZvOjpnZXRSZWdTZXF1ZW5jZUlucHV0cy4KKyAgdmlydHVhbCBib29sIGdldFJlZ1NlcXVlbmNlTGlrZUlucHV0cygKKyAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksIHVuc2lnbmVkIERlZklkeCwKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxSZWdTdWJSZWdQYWlyQW5kSWR4PiAmSW5wdXRSZWdzKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBUYXJnZXQtZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIG9mIGdldEV4dHJhY3RTdWJyZWdJbnB1dHMuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiBpdCBpcyBwb3NzaWJsZSB0byBidWlsZCB0aGUgZXF1aXZhbGVudAorICAvLy8gRVhUUkFDVF9TVUJSRUcgaW5wdXRzIHdpdGggdGhlIHBhaXIgXHAgTUksIFxwIERlZklkeC4gRmFsc2Ugb3RoZXJ3aXNlLgorICAvLy8KKyAgLy8vIFxwcmUgTUkuaXNFeHRyYWN0U3VicmVnTGlrZSgpLgorICAvLy8KKyAgLy8vIFxzZWUgVGFyZ2V0SW5zdHJJbmZvOjpnZXRFeHRyYWN0U3VicmVnSW5wdXRzLgorICB2aXJ0dWFsIGJvb2wgZ2V0RXh0cmFjdFN1YnJlZ0xpa2VJbnB1dHMoY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlZklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1N1YlJlZ1BhaXJBbmRJZHggJklucHV0UmVnKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBUYXJnZXQtZGVwZW5kZW50IGltcGxlbWVudGF0aW9uIG9mIGdldEluc2VydFN1YnJlZ0lucHV0cy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGl0IGlzIHBvc3NpYmxlIHRvIGJ1aWxkIHRoZSBlcXVpdmFsZW50CisgIC8vLyBJTlNFUlRfU1VCUkVHIGlucHV0cyB3aXRoIHRoZSBwYWlyIFxwIE1JLCBccCBEZWZJZHguIEZhbHNlIG90aGVyd2lzZS4KKyAgLy8vCisgIC8vLyBccHJlIE1JLmlzSW5zZXJ0U3VicmVnTGlrZSgpLgorICAvLy8KKyAgLy8vIFxzZWUgVGFyZ2V0SW5zdHJJbmZvOjpnZXRJbnNlcnRTdWJyZWdJbnB1dHMuCisgIHZpcnR1YWwgYm9vbAorICBnZXRJbnNlcnRTdWJyZWdMaWtlSW5wdXRzKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksIHVuc2lnbmVkIERlZklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdTdWJSZWdQYWlyICZCYXNlUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ1N1YlJlZ1BhaXJBbmRJZHggJkluc2VydGVkUmVnKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKK3B1YmxpYzoKKyAgLy8vIGdldEFkZHJlc3NTcGFjZUZvclBzZXVkb1NvdXJjZUtpbmQgLSBHaXZlbiB0aGUga2luZCBvZiBtZW1vcnkKKyAgLy8vIChlLmcuIHN0YWNrKSB0aGUgdGFyZ2V0IHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgYWRkcmVzcyBzcGFjZS4KKyAgdmlydHVhbCB1bnNpZ25lZAorICBnZXRBZGRyZXNzU3BhY2VGb3JQc2V1ZG9Tb3VyY2VLaW5kKFBzZXVkb1NvdXJjZVZhbHVlOjpQU1ZLaW5kIEtpbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyB1bmZvbGRNZW1vcnlPcGVyYW5kIC0gU2VwYXJhdGUgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24gd2hpY2ggZm9sZGVkIGEgbG9hZCBvcgorICAvLy8gYSBzdG9yZSBvciBhIGxvYWQgYW5kIGEgc3RvcmUgaW50byB0d28gb3IgbW9yZSBpbnN0cnVjdGlvbi4gSWYgdGhpcyBpcworICAvLy8gcG9zc2libGUsIHJldHVybnMgdHJ1ZSBhcyB3ZWxsIGFzIHRoZSBuZXcgaW5zdHJ1Y3Rpb25zIGJ5IHJlZmVyZW5jZS4KKyAgdmlydHVhbCBib29sCisgIHVuZm9sZE1lbW9yeU9wZXJhbmQoTWFjaGluZUZ1bmN0aW9uICZNRiwgTWFjaGluZUluc3RyICZNSSwgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVW5mb2xkTG9hZCwgYm9vbCBVbmZvbGRTdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8TWFjaGluZUluc3RyICo+ICZOZXdNSXMpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgdW5mb2xkTWVtb3J5T3BlcmFuZChTZWxlY3Rpb25EQUcgJkRBRywgU0ROb2RlICpOLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0ROb2RlICo+ICZOZXdOb2RlcykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBvcGNvZGUgb2YgdGhlIHdvdWxkIGJlIG5ldworICAvLy8gaW5zdHJ1Y3Rpb24gYWZ0ZXIgbG9hZCAvIHN0b3JlIGFyZSB1bmZvbGRlZCBmcm9tIGFuIGluc3RydWN0aW9uIG9mIHRoZQorICAvLy8gc3BlY2lmaWVkIG9wY29kZS4gSXQgcmV0dXJucyB6ZXJvIGlmIHRoZSBzcGVjaWZpZWQgdW5mb2xkaW5nIGlzIG5vdAorICAvLy8gcG9zc2libGUuIElmIExvYWRSZWdJbmRleCBpcyBub24tbnVsbCwgaXQgaXMgZmlsbGVkIGluIHdpdGggdGhlIG9wZXJhbmQKKyAgLy8vIGluZGV4IG9mIHRoZSBvcGVyYW5kIHdoaWNoIHdpbGwgaG9sZCB0aGUgcmVnaXN0ZXIgaG9sZGluZyB0aGUgbG9hZGVkCisgIC8vLyB2YWx1ZS4KKyAgdmlydHVhbCB1bnNpZ25lZAorICBnZXRPcGNvZGVBZnRlck1lbW9yeVVuZm9sZCh1bnNpZ25lZCBPcGMsIGJvb2wgVW5mb2xkTG9hZCwgYm9vbCBVbmZvbGRTdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKkxvYWRSZWdJbmRleCA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBUaGlzIGlzIHVzZWQgYnkgdGhlIHByZS1yZWdhbGxvYyBzY2hlZHVsZXIgdG8gZGV0ZXJtaW5lIGlmIHR3byBsb2FkcyBhcmUKKyAgLy8vIGxvYWRpbmcgZnJvbSB0aGUgc2FtZSBiYXNlIGFkZHJlc3MuIEl0IHNob3VsZCBvbmx5IHJldHVybiB0cnVlIGlmIHRoZSBiYXNlCisgIC8vLyBwb2ludGVycyBhcmUgdGhlIHNhbWUgYW5kIHRoZSBvbmx5IGRpZmZlcmVuY2VzIGJldHdlZW4gdGhlIHR3byBhZGRyZXNzZXMKKyAgLy8vIGFyZSB0aGUgb2Zmc2V0LiBJdCBhbHNvIHJldHVybnMgdGhlIG9mZnNldHMgYnkgcmVmZXJlbmNlLgorICB2aXJ0dWFsIGJvb2wgYXJlTG9hZHNGcm9tU2FtZUJhc2VQdHIoU0ROb2RlICpMb2FkMSwgU0ROb2RlICpMb2FkMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgJk9mZnNldDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICZPZmZzZXQyKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFRoaXMgaXMgYSB1c2VkIGJ5IHRoZSBwcmUtcmVnYWxsb2Mgc2NoZWR1bGVyIHRvIGRldGVybWluZSAoaW4gY29uanVuY3Rpb24KKyAgLy8vIHdpdGggYXJlTG9hZHNGcm9tU2FtZUJhc2VQdHIpIGlmIHR3byBsb2FkcyBzaG91bGQgYmUgc2NoZWR1bGVkIHRvZ2V0aGVyLgorICAvLy8gT24gc29tZSB0YXJnZXRzIGlmIHR3byBsb2FkcyBhcmUgbG9hZGluZyBmcm9tCisgIC8vLyBhZGRyZXNzZXMgaW4gdGhlIHNhbWUgY2FjaGUgbGluZSwgaXQncyBiZXR0ZXIgaWYgdGhleSBhcmUgc2NoZWR1bGVkCisgIC8vLyB0b2dldGhlci4gVGhpcyBmdW5jdGlvbiB0YWtlcyB0d28gaW50ZWdlcnMgdGhhdCByZXByZXNlbnQgdGhlIGxvYWQgb2Zmc2V0cworICAvLy8gZnJvbSB0aGUgY29tbW9uIGJhc2UgYWRkcmVzcy4gSXQgcmV0dXJucyB0cnVlIGlmIGl0IGRlY2lkZXMgaXQncyBkZXNpcmFibGUKKyAgLy8vIHRvIHNjaGVkdWxlIHRoZSB0d28gbG9hZHMgdG9nZXRoZXIuICJOdW1Mb2FkcyIgaXMgdGhlIG51bWJlciBvZiBsb2FkcyB0aGF0CisgIC8vLyBoYXZlIGFscmVhZHkgYmVlbiBzY2hlZHVsZWQgYWZ0ZXIgTG9hZDEuCisgIHZpcnR1YWwgYm9vbCBzaG91bGRTY2hlZHVsZUxvYWRzTmVhcihTRE5vZGUgKkxvYWQxLCBTRE5vZGUgKkxvYWQyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBPZmZzZXQxLCBpbnQ2NF90IE9mZnNldDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1Mb2FkcykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGJhc2UgcmVnaXN0ZXIgYW5kIGJ5dGUgb2Zmc2V0IG9mIGFuIGluc3RydWN0aW9uIHRoYXQgcmVhZHMvd3JpdGVzCisgIC8vLyBtZW1vcnkuCisgIHZpcnR1YWwgYm9vbCBnZXRNZW1PcEJhc2VSZWdJbW1PZnMoTWFjaGluZUluc3RyICZNZW1PcCwgdW5zaWduZWQgJkJhc2VSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbiBjb250YWlucyBhIGJhc2UgcmVnaXN0ZXIgYW5kIG9mZnNldC4gSWYKKyAgLy8vIHRydWUsIHRoZSBmdW5jdGlvbiBhbHNvIHNldHMgdGhlIG9wZXJhbmQgcG9zaXRpb24gaW4gdGhlIGluc3RydWN0aW9uCisgIC8vLyBmb3IgdGhlIGJhc2UgcmVnaXN0ZXIgYW5kIG9mZnNldC4KKyAgdmlydHVhbCBib29sIGdldEJhc2VBbmRPZmZzZXRQb3NpdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZCYXNlUG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZPZmZzZXRQb3MpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gSWYgdGhlIGluc3RydWN0aW9uIGlzIGFuIGluY3JlbWVudCBvZiBhIGNvbnN0YW50IHZhbHVlLCByZXR1cm4gdGhlIGFtb3VudC4KKyAgdmlydHVhbCBib29sIGdldEluY3JlbWVudFZhbHVlKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUksIGludCAmVmFsdWUpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gZ2l2ZW4gbWVtb3J5IG9wZXJhdGlvbnMgc2hvdWxkIGJlIHNjaGVkdWxlZAorICAvLy8gYWRqYWNlbnQuIE5vdGUgdGhhdCB5b3UgaGF2ZSB0byBhZGQ6CisgIC8vLyAgIERBRy0+YWRkTXV0YXRpb24oY3JlYXRlTG9hZENsdXN0ZXJEQUdNdXRhdGlvbihEQUctPlRJSSwgREFHLT5UUkkpKTsKKyAgLy8vIG9yCisgIC8vLyAgIERBRy0+YWRkTXV0YXRpb24oY3JlYXRlU3RvcmVDbHVzdGVyREFHTXV0YXRpb24oREFHLT5USUksIERBRy0+VFJJKSk7CisgIC8vLyB0byBUYXJnZXRQYXNzQ29uZmlnOjpjcmVhdGVNYWNoaW5lU2NoZWR1bGVyKCkgdG8gaGF2ZSBhbiBlZmZlY3QuCisgIHZpcnR1YWwgYm9vbCBzaG91bGRDbHVzdGVyTWVtT3BzKE1hY2hpbmVJbnN0ciAmRmlyc3RMZFN0LCB1bnNpZ25lZCBCYXNlUmVnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUluc3RyICZTZWNvbmRMZFN0LCB1bnNpZ25lZCBCYXNlUmVnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtTG9hZHMpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJ0YXJnZXQgZGlkIG5vdCBpbXBsZW1lbnQgc2hvdWxkQ2x1c3Rlck1lbU9wcygpIik7CisgIH0KKworICAvLy8gUmV2ZXJzZXMgdGhlIGJyYW5jaCBjb25kaXRpb24gb2YgdGhlIHNwZWNpZmllZCBjb25kaXRpb24gbGlzdCwKKyAgLy8vIHJldHVybmluZyBmYWxzZSBvbiBzdWNjZXNzIGFuZCB0cnVlIGlmIGl0IGNhbm5vdCBiZSByZXZlcnNlZC4KKyAgdmlydHVhbCBib29sCisgIHJldmVyc2VCcmFuY2hDb25kaXRpb24oU21hbGxWZWN0b3JJbXBsPE1hY2hpbmVPcGVyYW5kPiAmQ29uZCkgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIEluc2VydCBhIG5vb3AgaW50byB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtIGF0IHRoZSBzcGVjaWZpZWQgcG9pbnQuCisgIHZpcnR1YWwgdm9pZCBpbnNlcnROb29wKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciBNSSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgbm9vcCBpbnN0cnVjdGlvbiB0byB1c2UgZm9yIGEgbm9vcC4KKyAgdmlydHVhbCB2b2lkIGdldE5vb3AoTUNJbnN0ICZOb3BJbnN0KSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgZm9yIHBvc3QtaW5jcmVtZW50ZWQgaW5zdHJ1Y3Rpb25zLgorICB2aXJ0dWFsIGJvb2wgaXNQb3N0SW5jcmVtZW50KGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYWxyZWFkeSBwcmVkaWNhdGVkLgorICB2aXJ0dWFsIGJvb2wgaXNQcmVkaWNhdGVkKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYQorICAvLy8gdGVybWluYXRvciBpbnN0cnVjdGlvbiB0aGF0IGhhcyBub3QgYmVlbiBwcmVkaWNhdGVkLgorICB2aXJ0dWFsIGJvb2wgaXNVbnByZWRpY2F0ZWRUZXJtaW5hdG9yKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgTUkgaXMgYW4gdW5jb25kaXRpb25hbCB0YWlsIGNhbGwuCisgIHZpcnR1YWwgYm9vbCBpc1VuY29uZGl0aW9uYWxUYWlsQ2FsbChjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGFpbCBjYWxsIGNhbiBiZSBtYWRlIGNvbmRpdGlvbmFsIG9uIEJyYW5jaENvbmQuCisgIHZpcnR1YWwgYm9vbCBjYW5NYWtlVGFpbENhbGxDb25kaXRpb25hbChTbWFsbFZlY3RvckltcGw8TWFjaGluZU9wZXJhbmQ+ICZDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICZUYWlsQ2FsbCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXBsYWNlIHRoZSBjb25kaXRpb25hbCBicmFuY2ggaW4gTUJCIHdpdGggYSBjb25kaXRpb25hbCB0YWlsIGNhbGwuCisgIHZpcnR1YWwgdm9pZCByZXBsYWNlQnJhbmNoV2l0aFRhaWxDYWxsKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxNYWNoaW5lT3BlcmFuZD4gJkNvbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAmVGFpbENhbGwpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJUYXJnZXQgZGlkbid0IGltcGxlbWVudCByZXBsYWNlQnJhbmNoV2l0aFRhaWxDYWxsISIpOworICB9CisKKyAgLy8vIENvbnZlcnQgdGhlIGluc3RydWN0aW9uIGludG8gYSBwcmVkaWNhdGVkIGluc3RydWN0aW9uLgorICAvLy8gSXQgcmV0dXJucyB0cnVlIGlmIHRoZSBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwuCisgIHZpcnR1YWwgYm9vbCBQcmVkaWNhdGVJbnN0cnVjdGlvbihNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8TWFjaGluZU9wZXJhbmQ+IFByZWQpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGZpcnN0IHNwZWNpZmllZCBwcmVkaWNhdGUKKyAgLy8vIHN1YnN1bWVzIHRoZSBzZWNvbmQsIGUuZy4gR0Ugc3Vic3VtZXMgR1QuCisgIHZpcnR1YWwgYm9vbCBTdWJzdW1lc1ByZWRpY2F0ZShBcnJheVJlZjxNYWNoaW5lT3BlcmFuZD4gUHJlZDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxNYWNoaW5lT3BlcmFuZD4gUHJlZDIpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gSWYgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBkZWZpbmVzIGFueSBwcmVkaWNhdGUKKyAgLy8vIG9yIGNvbmRpdGlvbiBjb2RlIHJlZ2lzdGVyKHMpIHVzZWQgZm9yIHByZWRpY2F0aW9uLCByZXR1cm5zIHRydWUgYXMgd2VsbAorICAvLy8gYXMgdGhlIGRlZmluaXRpb24gcHJlZGljYXRlKHMpIGJ5IHJlZmVyZW5jZS4KKyAgdmlydHVhbCBib29sIERlZmluZXNQcmVkaWNhdGUoTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaGluZU9wZXJhbmQ+ICZQcmVkKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gY2FuIGJlIHByZWRpY2F0ZWQuCisgIC8vLyBCeSBkZWZhdWx0LCB0aGlzIHJldHVybnMgdHJ1ZSBmb3IgZXZlcnkgaW5zdHJ1Y3Rpb24gd2l0aCBhCisgIC8vLyBQcmVkaWNhdGVPcGVyYW5kLgorICB2aXJ0dWFsIGJvb2wgaXNQcmVkaWNhYmxlKGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIGNvbnN0IHsKKyAgICByZXR1cm4gTUkuZ2V0RGVzYygpLmlzUHJlZGljYWJsZSgpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGl0J3Mgc2FmZSB0byBtb3ZlIGEgbWFjaGluZQorICAvLy8gaW5zdHJ1Y3Rpb24gdGhhdCBkZWZpbmVzIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIgY2xhc3MuCisgIHZpcnR1YWwgYm9vbCBpc1NhZmVUb01vdmVSZWdDbGFzc0RlZnMoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBUZXN0IGlmIHRoZSBnaXZlbiBpbnN0cnVjdGlvbiBzaG91bGQgYmUgY29uc2lkZXJlZCBhIHNjaGVkdWxpbmcgYm91bmRhcnkuCisgIC8vLyBUaGlzIHByaW1hcmlseSBpbmNsdWRlcyBsYWJlbHMgYW5kIHRlcm1pbmF0b3JzLgorICB2aXJ0dWFsIGJvb2wgaXNTY2hlZHVsaW5nQm91bmRhcnkoY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICAvLy8gTWVhc3VyZSB0aGUgc3BlY2lmaWVkIGlubGluZSBhc20gdG8gZGV0ZXJtaW5lIGFuIGFwcHJveGltYXRpb24gb2YgaXRzCisgIC8vLyBsZW5ndGguCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SW5saW5lQXNtTGVuZ3RoKGNvbnN0IGNoYXIgKlN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21JbmZvICZNQUkpIGNvbnN0OworCisgIC8vLyBBbGxvY2F0ZSBhbmQgcmV0dXJuIGEgaGF6YXJkIHJlY29nbml6ZXIgdG8gdXNlIGZvciB0aGlzIHRhcmdldCB3aGVuCisgIC8vLyBzY2hlZHVsaW5nIHRoZSBtYWNoaW5lIGluc3RydWN0aW9ucyBiZWZvcmUgcmVnaXN0ZXIgYWxsb2NhdGlvbi4KKyAgdmlydHVhbCBTY2hlZHVsZUhhemFyZFJlY29nbml6ZXIgKgorICBDcmVhdGVUYXJnZXRIYXphcmRSZWNvZ25pemVyKGNvbnN0IFRhcmdldFN1YnRhcmdldEluZm8gKlNUSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTY2hlZHVsZURBRyAqREFHKSBjb25zdDsKKworICAvLy8gQWxsb2NhdGUgYW5kIHJldHVybiBhIGhhemFyZCByZWNvZ25pemVyIHRvIHVzZSBmb3IgdGhpcyB0YXJnZXQgd2hlbgorICAvLy8gc2NoZWR1bGluZyB0aGUgbWFjaGluZSBpbnN0cnVjdGlvbnMgYmVmb3JlIHJlZ2lzdGVyIGFsbG9jYXRpb24uCisgIHZpcnR1YWwgU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyICoKKyAgQ3JlYXRlVGFyZ2V0TUlIYXphcmRSZWNvZ25pemVyKGNvbnN0IEluc3RySXRpbmVyYXJ5RGF0YSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2NoZWR1bGVEQUcgKkRBRykgY29uc3Q7CisKKyAgLy8vIEFsbG9jYXRlIGFuZCByZXR1cm4gYSBoYXphcmQgcmVjb2duaXplciB0byB1c2UgZm9yIHRoaXMgdGFyZ2V0IHdoZW4KKyAgLy8vIHNjaGVkdWxpbmcgdGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb25zIGFmdGVyIHJlZ2lzdGVyIGFsbG9jYXRpb24uCisgIHZpcnR1YWwgU2NoZWR1bGVIYXphcmRSZWNvZ25pemVyICoKKyAgQ3JlYXRlVGFyZ2V0UG9zdFJBSGF6YXJkUmVjb2duaXplcihjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTY2hlZHVsZURBRyAqREFHKSBjb25zdDsKKworICAvLy8gQWxsb2NhdGUgYW5kIHJldHVybiBhIGhhemFyZCByZWNvZ25pemVyIHRvIHVzZSBmb3IgYnkgbm9uLXNjaGVkdWxpbmcKKyAgLy8vIHBhc3Nlcy4KKyAgdmlydHVhbCBTY2hlZHVsZUhhemFyZFJlY29nbml6ZXIgKgorICBDcmVhdGVUYXJnZXRQb3N0UkFIYXphcmRSZWNvZ25pemVyKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBQcm92aWRlIGEgZ2xvYmFsIGZsYWcgZm9yIGRpc2FibGluZyB0aGUgUHJlUkEgaGF6YXJkIHJlY29nbml6ZXIgdGhhdAorICAvLy8gdGFyZ2V0cyBtYXkgY2hvb3NlIHRvIGhvbm9yLgorICBib29sIHVzZVByZVJBSGF6YXJkUmVjb2duaXplcigpIGNvbnN0OworCisgIC8vLyBGb3IgYSBjb21wYXJpc29uIGluc3RydWN0aW9uLCByZXR1cm4gdGhlIHNvdXJjZSByZWdpc3RlcnMKKyAgLy8vIGluIFNyY1JlZyBhbmQgU3JjUmVnMiBpZiBoYXZpbmcgdHdvIHJlZ2lzdGVyIG9wZXJhbmRzLCBhbmQgdGhlIHZhbHVlIGl0CisgIC8vLyBjb21wYXJlcyBhZ2FpbnN0IGluIENtcFZhbHVlLiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY29tcGFyaXNvbiBpbnN0cnVjdGlvbgorICAvLy8gY2FuIGJlIGFuYWx5emVkLgorICB2aXJ0dWFsIGJvb2wgYW5hbHl6ZUNvbXBhcmUoY29uc3QgTWFjaGluZUluc3RyICZNSSwgdW5zaWduZWQgJlNyY1JlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZTcmNSZWcyLCBpbnQgJk1hc2ssIGludCAmVmFsdWUpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gU2VlIGlmIHRoZSBjb21wYXJpc29uIGluc3RydWN0aW9uIGNhbiBiZSBjb252ZXJ0ZWQKKyAgLy8vIGludG8gc29tZXRoaW5nIG1vcmUgZWZmaWNpZW50LiBFLmcuLCBvbiBBUk0gbW9zdCBpbnN0cnVjdGlvbnMgY2FuIHNldCB0aGUKKyAgLy8vIGZsYWdzIHJlZ2lzdGVyLCBvYnZpYXRpbmcgdGhlIG5lZWQgZm9yIGEgc2VwYXJhdGUgQ01QLgorICB2aXJ0dWFsIGJvb2wgb3B0aW1pemVDb21wYXJlSW5zdHIoTWFjaGluZUluc3RyICZDbXBJbnN0ciwgdW5zaWduZWQgU3JjUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjUmVnMiwgaW50IE1hc2ssIGludCBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICB2aXJ0dWFsIGJvb2wgb3B0aW1pemVDb25kQnJhbmNoKE1hY2hpbmVJbnN0ciAmTUkpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFRyeSB0byByZW1vdmUgdGhlIGxvYWQgYnkgZm9sZGluZyBpdCB0byBhIHJlZ2lzdGVyIG9wZXJhbmQgYXQgdGhlIHVzZS4KKyAgLy8vIFdlIGZvbGQgdGhlIGxvYWQgaW5zdHJ1Y3Rpb25zIGlmIGFuZCBvbmx5IGlmIHRoZQorICAvLy8gZGVmIGFuZCB1c2UgYXJlIGluIHRoZSBzYW1lIEJCLiBXZSBvbmx5IGxvb2sgYXQgb25lIGxvYWQgYW5kIHNlZQorICAvLy8gd2hldGhlciBpdCBjYW4gYmUgZm9sZGVkIGludG8gTUkuIEZvbGRBc0xvYWREZWZSZWcgaXMgdGhlIHZpcnR1YWwgcmVnaXN0ZXIKKyAgLy8vIGRlZmluZWQgYnkgdGhlIGxvYWQgd2UgYXJlIHRyeWluZyB0byBmb2xkLiBEZWZNSSByZXR1cm5zIHRoZSBtYWNoaW5lCisgIC8vLyBpbnN0cnVjdGlvbiB0aGF0IGRlZmluZXMgRm9sZEFzTG9hZERlZlJlZywgYW5kIHRoZSBmdW5jdGlvbiByZXR1cm5zCisgIC8vLyB0aGUgbWFjaGluZSBpbnN0cnVjdGlvbiBnZW5lcmF0ZWQgZHVlIHRvIGZvbGRpbmcuCisgIHZpcnR1YWwgTWFjaGluZUluc3RyICpvcHRpbWl6ZUxvYWRJbnN0cihNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkZvbGRBc0xvYWREZWZSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lSW5zdHIgKiZEZWZNSSkgY29uc3QgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vICdSZWcnIGlzIGtub3duIHRvIGJlIGRlZmluZWQgYnkgYSBtb3ZlIGltbWVkaWF0ZSBpbnN0cnVjdGlvbiwKKyAgLy8vIHRyeSB0byBmb2xkIHRoZSBpbW1lZGlhdGUgaW50byB0aGUgdXNlIGluc3RydWN0aW9uLgorICAvLy8gSWYgTVJJLT5oYXNPbmVOb25EQkdVc2UoUmVnKSBpcyB0cnVlLCBhbmQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUsCisgIC8vLyB0aGVuIHRoZSBjYWxsZXIgbWF5IGFzc3VtZSB0aGF0IERlZk1JIGhhcyBiZWVuIGVyYXNlZCBmcm9tIGl0cyBwYXJlbnQKKyAgLy8vIGJsb2NrLiBUaGUgY2FsbGVyIG1heSBhc3N1bWUgdGhhdCBpdCB3aWxsIG5vdCBiZSBlcmFzZWQgYnkgdGhpcworICAvLy8gZnVuY3Rpb24gb3RoZXJ3aXNlLgorICB2aXJ0dWFsIGJvb2wgRm9sZEltbWVkaWF0ZShNYWNoaW5lSW5zdHIgJlVzZU1JLCBNYWNoaW5lSW5zdHIgJkRlZk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWcsIE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiB1LW9wZXJhdGlvbnMgdGhlIGdpdmVuIG1hY2hpbmUKKyAgLy8vIGluc3RydWN0aW9uIHdpbGwgYmUgZGVjb2RlZCB0byBvbiB0aGUgdGFyZ2V0IGNwdS4gVGhlIGl0aW5lcmFyeSdzCisgIC8vLyBJc3N1ZVdpZHRoIGlzIHRoZSBudW1iZXIgb2YgbWljcm9vcHMgdGhhdCBjYW4gYmUgZGlzcGF0Y2hlZCBlYWNoCisgIC8vLyBjeWNsZS4gQW4gaW5zdHJ1Y3Rpb24gd2l0aCB6ZXJvIG1pY3Jvb3BzIHRha2VzIG5vIGRpc3BhdGNoIHJlc291cmNlcy4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXROdW1NaWNyb09wcyhjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEgKkl0aW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBmb3IgcHNldWRvIGluc3RydWN0aW9ucyB0aGF0IGRvbid0IGNvbnN1bWUgYW55CisgIC8vLyBtYWNoaW5lIHJlc291cmNlcyBpbiB0aGVpciBjdXJyZW50IGZvcm0uIFRoZXNlIGFyZSBjb21tb24gY2FzZXMgdGhhdCB0aGUKKyAgLy8vIHNjaGVkdWxlciBzaG91bGQgY29uc2lkZXIgZnJlZSwgcmF0aGVyIHRoYW4gY29uc2VydmF0aXZlbHkgaGFuZGxpbmcgdGhlbQorICAvLy8gYXMgaW5zdHJ1Y3Rpb25zIHdpdGggbm8gaXRpbmVyYXJ5LgorICBib29sIGlzWmVyb0Nvc3QodW5zaWduZWQgT3Bjb2RlKSBjb25zdCB7CisgICAgcmV0dXJuIE9wY29kZSA8PSBUYXJnZXRPcGNvZGU6OkNPUFk7CisgIH0KKworICB2aXJ0dWFsIGludCBnZXRPcGVyYW5kTGF0ZW5jeShjb25zdCBJbnN0ckl0aW5lcmFyeURhdGEgKkl0aW5EYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRE5vZGUgKkRlZk5vZGUsIHVuc2lnbmVkIERlZklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ROb2RlICpVc2VOb2RlLCB1bnNpZ25lZCBVc2VJZHgpIGNvbnN0OworCisgIC8vLyBDb21wdXRlIGFuZCByZXR1cm4gdGhlIHVzZSBvcGVyYW5kIGxhdGVuY3kgb2YgYSBnaXZlbiBwYWlyIG9mIGRlZiBhbmQgdXNlLgorICAvLy8gSW4gbW9zdCBjYXNlcywgdGhlIHN0YXRpYyBzY2hlZHVsaW5nIGl0aW5lcmFyeSB3YXMgZW5vdWdoIHRvIGRldGVybWluZSB0aGUKKyAgLy8vIG9wZXJhbmQgbGF0ZW5jeS4gQnV0IGl0IG1heSBub3QgYmUgcG9zc2libGUgZm9yIGluc3RydWN0aW9ucyB3aXRoIHZhcmlhYmxlCisgIC8vLyBudW1iZXIgb2YgZGVmcyAvIHVzZXMuCisgIC8vLworICAvLy8gVGhpcyBpcyBhIHJhdyBpbnRlcmZhY2UgdG8gdGhlIGl0aW5lcmFyeSB0aGF0IG1heSBiZSBkaXJlY3RseSBvdmVycmlkZGVuCisgIC8vLyBieSBhIHRhcmdldC4gVXNlIGNvbXB1dGVPcGVyYW5kTGF0ZW5jeSB0byBnZXQgdGhlIGJlc3QgZXN0aW1hdGUgb2YKKyAgLy8vIGxhdGVuY3kuCisgIHZpcnR1YWwgaW50IGdldE9wZXJhbmRMYXRlbmN5KGNvbnN0IEluc3RySXRpbmVyYXJ5RGF0YSAqSXRpbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAmRGVmTUksIHVuc2lnbmVkIERlZklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICZVc2VNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVXNlSWR4KSBjb25zdDsKKworICAvLy8gQ29tcHV0ZSB0aGUgaW5zdHJ1Y3Rpb24gbGF0ZW5jeSBvZiBhIGdpdmVuIGluc3RydWN0aW9uLgorICAvLy8gSWYgdGhlIGluc3RydWN0aW9uIGhhcyBoaWdoZXIgY29zdCB3aGVuIHByZWRpY2F0ZWQsIGl0J3MgcmV0dXJuZWQgdmlhCisgIC8vLyBQcmVkQ29zdC4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRJbnN0ckxhdGVuY3koY29uc3QgSW5zdHJJdGluZXJhcnlEYXRhICpJdGluRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgKlByZWRDb3N0ID0gbnVsbHB0cikgY29uc3Q7CisKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRQcmVkaWNhdGlvbkNvc3QoY29uc3QgTWFjaGluZUluc3RyICZNSSkgY29uc3Q7CisKKyAgdmlydHVhbCBpbnQgZ2V0SW5zdHJMYXRlbmN5KGNvbnN0IEluc3RySXRpbmVyYXJ5RGF0YSAqSXRpbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRE5vZGUgKk5vZGUpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIGRlZmF1bHQgZXhwZWN0ZWQgbGF0ZW5jeSBmb3IgYSBkZWYgYmFzZWQgb24gaXRzIG9wY29kZS4KKyAgdW5zaWduZWQgZGVmYXVsdERlZkxhdGVuY3koY29uc3QgTUNTY2hlZE1vZGVsICZTY2hlZE1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHIgJkRlZk1JKSBjb25zdDsKKworICBpbnQgY29tcHV0ZURlZk9wZXJhbmRMYXRlbmN5KGNvbnN0IEluc3RySXRpbmVyYXJ5RGF0YSAqSXRpbkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICZEZWZNSSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgb3Bjb2RlIGhhcyBoaWdoIGxhdGVuY3kgdG8gaXRzIHJlc3VsdC4KKyAgdmlydHVhbCBib29sIGlzSGlnaExhdGVuY3lEZWYoaW50IG9wYykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gQ29tcHV0ZSBvcGVyYW5kIGxhdGVuY3kgYmV0d2VlbiBhIGRlZiBvZiAnUmVnJworICAvLy8gYW5kIGEgdXNlIGluIHRoZSBjdXJyZW50IGxvb3AuIFJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgY29uc2lkZXJlZAorICAvLy8gaXQgJ2hpZ2gnLiBUaGlzIGlzIHVzZWQgYnkgb3B0aW1pemF0aW9uIHBhc3NlcyBzdWNoIGFzIG1hY2hpbmUgTElDTSB0bworICAvLy8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQgbWFrZXMgc2Vuc2UgdG8gaG9pc3QgYW4gaW5zdHJ1Y3Rpb24gb3V0IGV2ZW4gaW4gYQorICAvLy8gaGlnaCByZWdpc3RlciBwcmVzc3VyZSBzaXR1YXRpb24uCisgIHZpcnR1YWwgYm9vbCBoYXNIaWdoT3BlcmFuZExhdGVuY3koY29uc3QgVGFyZ2V0U2NoZWRNb2RlbCAmU2NoZWRNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICZEZWZNSSwgdW5zaWduZWQgRGVmSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVJbnN0ciAmVXNlTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVXNlSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIENvbXB1dGUgb3BlcmFuZCBsYXRlbmN5IG9mIGEgZGVmIG9mICdSZWcnLiBSZXR1cm4gdHJ1ZQorICAvLy8gaWYgdGhlIHRhcmdldCBjb25zaWRlcmVkIGl0ICdsb3cnLgorICB2aXJ0dWFsIGJvb2wgaGFzTG93RGVmTGF0ZW5jeShjb25zdCBUYXJnZXRTY2hlZE1vZGVsICZTY2hlZE1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lSW5zdHIgJkRlZk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZWZJZHgpIGNvbnN0OworCisgIC8vLyBQZXJmb3JtIHRhcmdldC1zcGVjaWZpYyBpbnN0cnVjdGlvbiB2ZXJpZmljYXRpb24uCisgIHZpcnR1YWwgYm9vbCB2ZXJpZnlJbnN0cnVjdGlvbihjb25zdCBNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmICZFcnJJbmZvKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBjdXJyZW50IGV4ZWN1dGlvbiBkb21haW4gYW5kIGJpdCBtYXNrIG9mCisgIC8vLyBwb3NzaWJsZSBkb21haW5zIGZvciBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBTb21lIG1pY3JvLWFyY2hpdGVjdHVyZXMgaGF2ZSBtdWx0aXBsZSBleGVjdXRpb24gZG9tYWlucywgYW5kIG11bHRpcGxlCisgIC8vLyBvcGNvZGVzIHRoYXQgcGVyZm9ybSB0aGUgc2FtZSBvcGVyYXRpb24gaW4gZGlmZmVyZW50IGRvbWFpbnMuICBGb3IKKyAgLy8vIGV4YW1wbGUsIHRoZSB4ODYgYXJjaGl0ZWN0dXJlIHByb3ZpZGVzIHRoZSBwb3IsIG9ycHMsIGFuZCBvcnBkCisgIC8vLyBpbnN0cnVjdGlvbnMgdGhhdCBhbGwgZG8gdGhlIHNhbWUgdGhpbmcuICBUaGVyZSBpcyBhIGxhdGVuY3kgcGVuYWx0eSBpZiBhCisgIC8vLyByZWdpc3RlciBpcyB3cml0dGVuIGluIG9uZSBkb21haW4gYW5kIHJlYWQgaW4gYW5vdGhlci4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBwYWlyIChkb21haW4sIG1hc2spIGNvbnRhaW5pbmcgdGhlIGV4ZWN1dGlvbgorICAvLy8gZG9tYWluIG9mIE1JLCBhbmQgYSBiaXQgbWFzayBvZiBwb3NzaWJsZSBkb21haW5zLiAgVGhlIHNldEV4ZWN1dGlvbkRvbWFpbgorICAvLy8gZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gY2hhbmdlIHRoZSBvcGNvZGUgdG8gb25lIG9mIHRoZSBkb21haW5zIGluIHRoZQorICAvLy8gYml0IG1hc2suICBJbnN0cnVjdGlvbnMgd2hvc2UgZXhlY3V0aW9uIGRvbWFpbiBjYW4ndCBiZSBjaGFuZ2VkIHNob3VsZAorICAvLy8gcmV0dXJuIGEgMCBtYXNrLgorICAvLy8KKyAgLy8vIFRoZSBleGVjdXRpb24gZG9tYWluIG51bWJlcnMgZG9uJ3QgaGF2ZSBhbnkgc3BlY2lhbCBtZWFuaW5nIGV4Y2VwdCBkb21haW4KKyAgLy8vIDAgaXMgdXNlZCBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgYXJlIG5vdCBhc3NvY2lhdGVkIHdpdGggYW55IGludGVyZXN0aW5nCisgIC8vLyBleGVjdXRpb24gZG9tYWluLgorICAvLy8KKyAgdmlydHVhbCBzdGQ6OnBhaXI8dWludDE2X3QsIHVpbnQxNl90PgorICBnZXRFeGVjdXRpb25Eb21haW4oY29uc3QgTWFjaGluZUluc3RyICZNSSkgY29uc3QgeworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigwLCAwKTsKKyAgfQorCisgIC8vLyBDaGFuZ2UgdGhlIG9wY29kZSBvZiBNSSB0byBleGVjdXRlIGluIERvbWFpbi4KKyAgLy8vCisgIC8vLyBUaGUgYml0ICgxIDw8IERvbWFpbikgbXVzdCBiZSBzZXQgaW4gdGhlIG1hc2sgcmV0dXJuZWQgZnJvbQorICAvLy8gZ2V0RXhlY3V0aW9uRG9tYWluKE1JKS4KKyAgdmlydHVhbCB2b2lkIHNldEV4ZWN1dGlvbkRvbWFpbihNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBEb21haW4pIGNvbnN0IHt9CisKKyAgLy8vIFJldHVybnMgdGhlIHByZWZlcnJlZCBtaW5pbXVtIGNsZWFyYW5jZQorICAvLy8gYmVmb3JlIGFuIGluc3RydWN0aW9uIHdpdGggYW4gdW53YW50ZWQgcGFydGlhbCByZWdpc3RlciB1cGRhdGUuCisgIC8vLworICAvLy8gU29tZSBpbnN0cnVjdGlvbnMgb25seSB3cml0ZSBwYXJ0IG9mIGEgcmVnaXN0ZXIsIGFuZCBpbXBsaWNpdGx5IG5lZWQgdG8KKyAgLy8vIHJlYWQgdGhlIG90aGVyIHBhcnRzIG9mIHRoZSByZWdpc3Rlci4gIFRoaXMgbWF5IGNhdXNlIHVud2FudGVkIHN0YWxscworICAvLy8gcHJldmVudGluZyBvdGhlcndpc2UgdW5yZWxhdGVkIGluc3RydWN0aW9ucyBmcm9tIGV4ZWN1dGluZyBpbiBwYXJhbGxlbCBpbgorICAvLy8gYW4gb3V0LW9mLW9yZGVyIENQVS4KKyAgLy8vCisgIC8vLyBGb3IgZXhhbXBsZSwgdGhlIHg4NiBpbnN0cnVjdGlvbiBjdnRzaTJzcyB3cml0ZXMgaXRzIHJlc3VsdCB0byBiaXRzCisgIC8vLyBbMzE6MF0gb2YgdGhlIGRlc3RpbmF0aW9uIHhtbSByZWdpc3Rlci4gQml0cyBbMTI3OjMyXSBhcmUgdW5hZmZlY3RlZCwgc28KKyAgLy8vIHRoZSBpbnN0cnVjdGlvbiBuZWVkcyB0byB3YWl0IGZvciB0aGUgb2xkIHZhbHVlIG9mIHRoZSByZWdpc3RlciB0byBiZWNvbWUKKyAgLy8vIGF2YWlsYWJsZToKKyAgLy8vCisgIC8vLyAgIGFkZHBzICV4bW0xLCAleG1tMAorICAvLy8gICBtb3ZhcHMgJXhtbTAsICglcmF4KQorICAvLy8gICBjdnRzaTJzcyAlcmJ4LCAleG1tMAorICAvLy8KKyAgLy8vIEluIHRoZSBjb2RlIGFib3ZlLCB0aGUgY3Z0c2kyc3MgaW5zdHJ1Y3Rpb24gbmVlZHMgdG8gd2FpdCBmb3IgdGhlIGFkZHBzCisgIC8vLyBpbnN0cnVjdGlvbiBiZWZvcmUgaXQgY2FuIGlzc3VlLCBldmVuIHRob3VnaCB0aGUgaGlnaCBiaXRzIG9mICV4bW0wCisgIC8vLyBwcm9iYWJseSBhcmVuJ3QgbmVlZGVkLgorICAvLy8KKyAgLy8vIFRoaXMgaG9vayByZXR1cm5zIHRoZSBwcmVmZXJyZWQgY2xlYXJhbmNlIGJlZm9yZSBNSSwgbWVhc3VyZWQgaW4KKyAgLy8vIGluc3RydWN0aW9ucy4gIE90aGVyIGRlZnMgb2YgTUkncyBvcGVyYW5kIE9wTnVtIGFyZSBhdm9pZGVkIGluIHRoZSBsYXN0IE4KKyAgLy8vIGluc3RydWN0aW9ucyBiZWZvcmUgTUkuICBJdCBzaG91bGQgb25seSByZXR1cm4gYSBwb3NpdGl2ZSB2YWx1ZSBmb3IKKyAgLy8vIHVud2FudGVkIGRlcGVuZGVuY2llcy4gIElmIHRoZSBvbGQgYml0cyBvZiB0aGUgZGVmaW5lZCByZWdpc3RlciBoYXZlCisgIC8vLyB1c2VmdWwgdmFsdWVzLCBvciBpZiBNSSBpcyBkZXRlcm1pbmVkIHRvIG90aGVyd2lzZSByZWFkIHRoZSBkZXBlbmRlbmN5LAorICAvLy8gdGhlIGhvb2sgc2hvdWxkIHJldHVybiAwLgorICAvLy8KKyAgLy8vIFRoZSB1bndhbnRlZCBkZXBlbmRlbmN5IG1heSBiZSBoYW5kbGVkIGJ5OgorICAvLy8KKyAgLy8vIDEuIEFsbG9jYXRpbmcgdGhlIHNhbWUgcmVnaXN0ZXIgZm9yIGFuIE1JIGRlZiBhbmQgdXNlLiAgVGhhdCBtYWtlcyB0aGUKKyAgLy8vICAgIHVud2FudGVkIGRlcGVuZGVuY3kgaWRlbnRpY2FsIHRvIGEgcmVxdWlyZWQgZGVwZW5kZW5jeS4KKyAgLy8vCisgIC8vLyAyLiBBbGxvY2F0aW5nIGEgcmVnaXN0ZXIgZm9yIHRoZSBkZWYgdGhhdCBoYXMgbm8gZGVmcyBpbiB0aGUgcHJldmlvdXMgTgorICAvLy8gICAgaW5zdHJ1Y3Rpb25zLgorICAvLy8KKyAgLy8vIDMuIENhbGxpbmcgYnJlYWtQYXJ0aWFsUmVnRGVwZW5kZW5jeSgpIHdpdGggdGhlIHNhbWUgYXJndW1lbnRzLiAgVGhpcworICAvLy8gICAgYWxsb3dzIHRoZSB0YXJnZXQgdG8gaW5zZXJ0IGEgZGVwZW5kZW5jeSBicmVha2luZyBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIHZpcnR1YWwgdW5zaWduZWQKKyAgZ2V0UGFydGlhbFJlZ1VwZGF0ZUNsZWFyYW5jZShjb25zdCBNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSkgY29uc3QgeworICAgIC8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHJldHVybnMgMCBmb3Igbm8gcGFydGlhbCByZWdpc3RlciBkZXBlbmRlbmN5LgorICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG1pbmltdW0gY2xlYXJhbmNlIGJlZm9yZSBhbiBpbnN0cnVjdGlvbiB0aGF0IHJlYWRzIGFuCisgIC8vLyB1bnVzZWQgcmVnaXN0ZXIuCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUsIEFWWCBpbnN0cnVjdGlvbnMgbWF5IGNvcHkgcGFydCBvZiBhIHJlZ2lzdGVyIG9wZXJhbmQgaW50bworICAvLy8gdGhlIHVudXNlZCBoaWdoIGJpdHMgb2YgdGhlIGRlc3RpbmF0aW9uIHJlZ2lzdGVyLgorICAvLy8KKyAgLy8vIHZjdnRzaTJzZHEgJXJheCwgdW5kZWYgJXhtbTAsICV4bW0xNAorICAvLy8KKyAgLy8vIEluIHRoZSBjb2RlIGFib3ZlLCB2Y3Z0c2kyc2RxIGNvcGllcyAleG1tMFsxMjc6NjRdIGludG8gJXhtbTE0IGNyZWF0aW5nIGEKKyAgLy8vIGZhbHNlIGRlcGVuZGVuY2Ugb24gYW55IHByZXZpb3VzIHdyaXRlIHRvICV4bW0wLgorICAvLy8KKyAgLy8vIFRoaXMgaG9vayB3b3JrcyBzaW1pbGFybHkgdG8gZ2V0UGFydGlhbFJlZ1VwZGF0ZUNsZWFyYW5jZSwgZXhjZXB0IHRoYXQgaXQKKyAgLy8vIGRvZXMgbm90IHRha2UgYW4gb3BlcmFuZCBpbmRleC4gSW5zdGVhZCBzZXRzIFxwIE9wTnVtIHRvIHRoZSBpbmRleCBvZiB0aGUKKyAgLy8vIHVudXNlZCByZWdpc3Rlci4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRVbmRlZlJlZ0NsZWFyYW5jZShjb25zdCBNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCAmT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHsKKyAgICAvLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiByZXR1cm5zIDAgZm9yIG5vIHVuZGVmIHJlZ2lzdGVyIGRlcGVuZGVuY3kuCisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gSW5zZXJ0IGEgZGVwZW5kZW5jeS1icmVha2luZyBpbnN0cnVjdGlvbgorICAvLy8gYmVmb3JlIE1JIHRvIGVsaW1pbmF0ZSBhbiB1bndhbnRlZCBkZXBlbmRlbmN5IG9uIE9wTnVtLgorICAvLy8KKyAgLy8vIElmIGl0IHdhc24ndCBwb3NzaWJsZSB0byBhdm9pZCBhIGRlZiBpbiB0aGUgbGFzdCBOIGluc3RydWN0aW9ucyBiZWZvcmUgTUkKKyAgLy8vIChzZWUgZ2V0UGFydGlhbFJlZ1VwZGF0ZUNsZWFyYW5jZSksIHRoaXMgaG9vayB3aWxsIGJlIGNhbGxlZCB0byBicmVhayB0aGUKKyAgLy8vIHVud2FudGVkIGRlcGVuZGVuY3kuCisgIC8vLworICAvLy8gT24geDg2LCBhbiB4b3JwcyBpbnN0cnVjdGlvbiBjYW4gYmUgdXNlZCBhcyBhIGRlcGVuZGVuY3kgYnJlYWtlcjoKKyAgLy8vCisgIC8vLyAgIGFkZHBzICV4bW0xLCAleG1tMAorICAvLy8gICBtb3ZhcHMgJXhtbTAsICglcmF4KQorICAvLy8gICB4b3JwcyAleG1tMCwgJXhtbTAKKyAgLy8vICAgY3Z0c2kyc3MgJXJieCwgJXhtbTAKKyAgLy8vCisgIC8vLyBBbiA8aW1wLWtpbGw+IG9wZXJhbmQgc2hvdWxkIGJlIGFkZGVkIHRvIE1JIGlmIGFuIGluc3RydWN0aW9uIHdhcworICAvLy8gaW5zZXJ0ZWQuICBUaGlzIHRpZXMgdGhlIGluc3RydWN0aW9ucyB0b2dldGhlciBpbiB0aGUgcG9zdC1yYSBzY2hlZHVsZXIuCisgIC8vLworICB2aXJ0dWFsIHZvaWQgYnJlYWtQYXJ0aWFsUmVnRGVwZW5kZW5jeShNYWNoaW5lSW5zdHIgJk1JLCB1bnNpZ25lZCBPcE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkpIGNvbnN0IHt9CisKKyAgLy8vIENyZWF0ZSBtYWNoaW5lIHNwZWNpZmljIG1vZGVsIGZvciBzY2hlZHVsaW5nLgorICB2aXJ0dWFsIERGQVBhY2tldGl6ZXIgKgorICBDcmVhdGVUYXJnZXRTY2hlZHVsZVN0YXRlKGNvbnN0IFRhcmdldFN1YnRhcmdldEluZm8gJikgY29uc3QgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIFNvbWV0aW1lcywgaXQgaXMgcG9zc2libGUgZm9yIHRoZSB0YXJnZXQKKyAgLy8vIHRvIHRlbGwsIGV2ZW4gd2l0aG91dCBhbGlhc2luZyBpbmZvcm1hdGlvbiwgdGhhdCB0d28gTUlzIGFjY2VzcyBkaWZmZXJlbnQKKyAgLy8vIG1lbW9yeSBhZGRyZXNzZXMuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHR3byBNSXMgYWNjZXNzIGRpZmZlcmVudAorICAvLy8gbWVtb3J5IGFkZHJlc3NlcyBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAvLy8KKyAgLy8vIEFzc3VtZXMgYW55IHBoeXNpY2FsIHJlZ2lzdGVycyB1c2VkIHRvIGNvbXB1dGUgYWRkcmVzc2VzIGhhdmUgdGhlIHNhbWUKKyAgLy8vIHZhbHVlIGZvciBib3RoIGluc3RydWN0aW9ucy4gKFRoaXMgaXMgdGhlIG1vc3QgdXNlZnVsIGFzc3VtcHRpb24gZm9yCisgIC8vLyBwb3N0LVJBIHNjaGVkdWxpbmcuKQorICAvLy8KKyAgLy8vIFNlZSBhbHNvIE1hY2hpbmVJbnN0cjo6bWF5QWxpYXMsIHdoaWNoIGlzIGltcGxlbWVudGVkIG9uIHRvcCBvZiB0aGlzCisgIC8vLyBmdW5jdGlvbi4KKyAgdmlydHVhbCBib29sCisgIGFyZU1lbUFjY2Vzc2VzVHJpdmlhbGx5RGlzam9pbnQoTWFjaGluZUluc3RyICZNSWEsIE1hY2hpbmVJbnN0ciAmTUliLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsaWFzQW5hbHlzaXMgKkFBID0gbnVsbHB0cikgY29uc3QgeworICAgIGFzc2VydCgoTUlhLm1heUxvYWQoKSB8fCBNSWEubWF5U3RvcmUoKSkgJiYKKyAgICAgICAgICAgIk1JYSBtdXN0IGxvYWQgZnJvbSBvciBtb2RpZnkgYSBtZW1vcnkgbG9jYXRpb24iKTsKKyAgICBhc3NlcnQoKE1JYi5tYXlMb2FkKCkgfHwgTUliLm1heVN0b3JlKCkpICYmCisgICAgICAgICAgICJNSWIgbXVzdCBsb2FkIGZyb20gb3IgbW9kaWZ5IGEgbWVtb3J5IGxvY2F0aW9uIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHZhbHVlIHRvIHVzZSBmb3IgdGhlIE1hY2hpbmVDU0UncyBMb29rQWhlYWRMaW1pdCwKKyAgLy8vIHdoaWNoIGlzIGEgaGV1cmlzdGljIHVzZWQgZm9yIENTRSdpbmcgcGh5cyByZWcgZGVmcy4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRNYWNoaW5lQ1NFTG9va0FoZWFkTGltaXQoKSBjb25zdCB7CisgICAgLy8gVGhlIGRlZmF1bHQgbG9va2FoZWFkIGlzIHNtYWxsIHRvIHByZXZlbnQgdW5wcm9maXRhYmxlIHF1YWRyYXRpYworICAgIC8vIGJlaGF2aW9yLgorICAgIHJldHVybiA1OworICB9CisKKyAgLy8vIFJldHVybiBhbiBhcnJheSB0aGF0IGNvbnRhaW5zIHRoZSBpZHMgb2YgdGhlIHRhcmdldCBpbmRpY2VzICh1c2VkIGZvciB0aGUKKyAgLy8vIFRhcmdldEluZGV4IG1hY2hpbmUgb3BlcmFuZCkgYW5kIHRoZWlyIG5hbWVzLgorICAvLy8KKyAgLy8vIE1JUiBTZXJpYWxpemF0aW9uIGlzIGFibGUgdG8gc2VyaWFsaXplIG9ubHkgdGhlIHRhcmdldCBpbmRpY2VzIHRoYXQgYXJlCisgIC8vLyBkZWZpbmVkIGJ5IHRoaXMgbWV0aG9kLgorICB2aXJ0dWFsIEFycmF5UmVmPHN0ZDo6cGFpcjxpbnQsIGNvbnN0IGNoYXIgKj4+CisgIGdldFNlcmlhbGl6YWJsZVRhcmdldEluZGljZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIE5vbmU7CisgIH0KKworICAvLy8gRGVjb21wb3NlIHRoZSBtYWNoaW5lIG9wZXJhbmQncyB0YXJnZXQgZmxhZ3MgaW50byB0d28gdmFsdWVzIC0gdGhlIGRpcmVjdAorICAvLy8gdGFyZ2V0IGZsYWcgdmFsdWUgYW5kIGFueSBvZiBiaXQgZmxhZ3MgdGhhdCBhcmUgYXBwbGllZC4KKyAgdmlydHVhbCBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPgorICBkZWNvbXBvc2VNYWNoaW5lT3BlcmFuZHNUYXJnZXRGbGFncyh1bnNpZ25lZCAvKlRGKi8pIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMHUsIDB1KTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYW4gYXJyYXkgdGhhdCBjb250YWlucyB0aGUgZGlyZWN0IHRhcmdldCBmbGFnIHZhbHVlcyBhbmQgdGhlaXIKKyAgLy8vIG5hbWVzLgorICAvLy8KKyAgLy8vIE1JUiBTZXJpYWxpemF0aW9uIGlzIGFibGUgdG8gc2VyaWFsaXplIG9ubHkgdGhlIHRhcmdldCBmbGFncyB0aGF0IGFyZQorICAvLy8gZGVmaW5lZCBieSB0aGlzIG1ldGhvZC4KKyAgdmlydHVhbCBBcnJheVJlZjxzdGQ6OnBhaXI8dW5zaWduZWQsIGNvbnN0IGNoYXIgKj4+CisgIGdldFNlcmlhbGl6YWJsZURpcmVjdE1hY2hpbmVPcGVyYW5kVGFyZ2V0RmxhZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIE5vbmU7CisgIH0KKworICAvLy8gUmV0dXJuIGFuIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIGJpdG1hc2sgdGFyZ2V0IGZsYWcgdmFsdWVzIGFuZCB0aGVpcgorICAvLy8gbmFtZXMuCisgIC8vLworICAvLy8gTUlSIFNlcmlhbGl6YXRpb24gaXMgYWJsZSB0byBzZXJpYWxpemUgb25seSB0aGUgdGFyZ2V0IGZsYWdzIHRoYXQgYXJlCisgIC8vLyBkZWZpbmVkIGJ5IHRoaXMgbWV0aG9kLgorICB2aXJ0dWFsIEFycmF5UmVmPHN0ZDo6cGFpcjx1bnNpZ25lZCwgY29uc3QgY2hhciAqPj4KKyAgZ2V0U2VyaWFsaXphYmxlQml0bWFza01hY2hpbmVPcGVyYW5kVGFyZ2V0RmxhZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIE5vbmU7CisgIH0KKworICAvLy8gUmV0dXJuIGFuIGFycmF5IHRoYXQgY29udGFpbnMgdGhlIE1NTyB0YXJnZXQgZmxhZyB2YWx1ZXMgYW5kIHRoZWlyCisgIC8vLyBuYW1lcy4KKyAgLy8vCisgIC8vLyBNSVIgU2VyaWFsaXphdGlvbiBpcyBhYmxlIHRvIHNlcmlhbGl6ZSBvbmx5IHRoZSBNTU8gdGFyZ2V0IGZsYWdzIHRoYXQgYXJlCisgIC8vLyBkZWZpbmVkIGJ5IHRoaXMgbWV0aG9kLgorICB2aXJ0dWFsIEFycmF5UmVmPHN0ZDo6cGFpcjxNYWNoaW5lTWVtT3BlcmFuZDo6RmxhZ3MsIGNvbnN0IGNoYXIgKj4+CisgIGdldFNlcmlhbGl6YWJsZU1hY2hpbmVNZW1PcGVyYW5kVGFyZ2V0RmxhZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIE5vbmU7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIFxwIEluc3QgaXMgYSB0YWlsIGNhbGwgaW5zdHJ1Y3Rpb24uIE92ZXJyaWRlIHRoaXMKKyAgLy8vIG1ldGhvZCBvbiB0YXJnZXRzIHRoYXQgZG8gbm90IHByb3Blcmx5IHNldCBNQ0lEOjpSZXR1cm4gYW5kIE1DSUQ6OkNhbGwgb24KKyAgLy8vIHRhaWwgY2FsbCBpbnN0cnVjdGlvbnMuIgorICB2aXJ0dWFsIGJvb2wgaXNUYWlsQ2FsbChjb25zdCBNYWNoaW5lSW5zdHIgJkluc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5zdC5pc1JldHVybigpICYmIEluc3QuaXNDYWxsKCk7CisgIH0KKworICAvLy8gVHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYm91bmQgdG8gdGhlIHRvcCBvZiBpdHMgYmFzaWMgYmxvY2sgYW5kIG5vCisgIC8vLyBvdGhlciBpbnN0cnVjdGlvbnMgc2hhbGwgYmUgaW5zZXJ0ZWQgYmVmb3JlIGl0LiBUaGlzIGNhbiBiZSBpbXBsZW1lbnRlZAorICAvLy8gdG8gcHJldmVudCByZWdpc3RlciBhbGxvY2F0b3IgdG8gaW5zZXJ0IHNwaWxscyBiZWZvcmUgc3VjaCBpbnN0cnVjdGlvbnMuCisgIHZpcnR1YWwgYm9vbCBpc0Jhc2ljQmxvY2tQcm9sb2d1ZShjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBEZXNjcmliZXMgdGhlIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdGhhdCBpdCB3aWxsIHRha2UgdG8gY2FsbCBhbmQKKyAgLy8vIGNvbnN0cnVjdCBhIGZyYW1lIGZvciBhIGdpdmVuIG91dGxpbmluZyBjYW5kaWRhdGUuCisgIHN0cnVjdCBNYWNoaW5lT3V0bGluZXJJbmZvIHsKKyAgICAvLy8gTnVtYmVyIG9mIGluc3RydWN0aW9ucyB0byBjYWxsIGFuIG91dGxpbmVkIGZ1bmN0aW9uIGZvciB0aGlzIGNhbmRpZGF0ZS4KKyAgICB1bnNpZ25lZCBDYWxsT3ZlcmhlYWQ7CisKKyAgICAvLy8gXGJyaWVmIE51bWJlciBvZiBpbnN0cnVjdGlvbnMgdG8gY29uc3RydWN0IGFuIG91dGxpbmVkIGZ1bmN0aW9uIGZyYW1lCisgICAgLy8vIGZvciB0aGlzIGNhbmRpZGF0ZS4KKyAgICB1bnNpZ25lZCBGcmFtZU92ZXJoZWFkOworCisgICAgLy8vIFxicmllZiBSZXByZXNlbnRzIHRoZSBzcGVjaWZpYyBpbnN0cnVjdGlvbnMgdGhhdCBtdXN0IGJlIGVtaXR0ZWQgdG8KKyAgICAvLy8gY29uc3RydWN0IGEgY2FsbCB0byB0aGlzIGNhbmRpZGF0ZS4KKyAgICB1bnNpZ25lZCBDYWxsQ29uc3RydWN0aW9uSUQ7CisKKyAgICAvLy8gXGJyaWVmIFJlcHJlc2VudHMgdGhlIHNwZWNpZmljIGluc3RydWN0aW9ucyB0aGF0IG11c3QgYmUgZW1pdHRlZCB0bworICAgIC8vLyBjb25zdHJ1Y3QgYSBmcmFtZSBmb3IgdGhpcyBjYW5kaWRhdGUncyBvdXRsaW5lZCBmdW5jdGlvbi4KKyAgICB1bnNpZ25lZCBGcmFtZUNvbnN0cnVjdGlvbklEOworCisgICAgTWFjaGluZU91dGxpbmVySW5mbygpIHt9CisgICAgTWFjaGluZU91dGxpbmVySW5mbyh1bnNpZ25lZCBDYWxsT3ZlcmhlYWQsIHVuc2lnbmVkIEZyYW1lT3ZlcmhlYWQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDYWxsQ29uc3RydWN0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGcmFtZUNvbnN0cnVjdGlvbklEKQorICAgICAgICA6IENhbGxPdmVyaGVhZChDYWxsT3ZlcmhlYWQpLCBGcmFtZU92ZXJoZWFkKEZyYW1lT3ZlcmhlYWQpLAorICAgICAgICAgIENhbGxDb25zdHJ1Y3Rpb25JRChDYWxsQ29uc3RydWN0aW9uSUQpLAorICAgICAgICAgIEZyYW1lQ29uc3RydWN0aW9uSUQoRnJhbWVDb25zdHJ1Y3Rpb25JRCkge30KKyAgfTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgYSBccCBNYWNoaW5lT3V0bGluZXJJbmZvIHN0cnVjdCBjb250YWluaW5nIHRhcmdldC1zcGVjaWZpYworICAvLy8gaW5mb3JtYXRpb24gZm9yIGEgc2V0IG9mIG91dGxpbmluZyBjYW5kaWRhdGVzLgorICB2aXJ0dWFsIE1hY2hpbmVPdXRsaW5lckluZm8gZ2V0T3V0bGluaW5pbmdDYW5kaWRhdGVJbmZvKAorICAgICAgc3RkOjp2ZWN0b3I8CisgICAgICAgICAgc3RkOjpwYWlyPE1hY2hpbmVCYXNpY0Jsb2NrOjppdGVyYXRvciwgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yPj4KKyAgICAgICAgICAmUmVwZWF0ZWRTZXF1ZW5jZUxvY3MpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKAorICAgICAgICAiVGFyZ2V0IGRpZG4ndCBpbXBsZW1lbnQgVGFyZ2V0SW5zdHJJbmZvOjpnZXRPdXRsaW5pbmdPdmVyaGVhZCEiKTsKKyAgfQorCisgIC8vLyBSZXByZXNlbnRzIGhvdyBhbiBpbnN0cnVjdGlvbiBzaG91bGQgYmUgbWFwcGVkIGJ5IHRoZSBvdXRsaW5lci4KKyAgLy8vIFxwIExlZ2FsIGluc3RydWN0aW9ucyBhcmUgdGhvc2Ugd2hpY2ggYXJlIHNhZmUgdG8gb3V0bGluZS4KKyAgLy8vIFxwIElsbGVnYWwgaW5zdHJ1Y3Rpb25zIGFyZSB0aG9zZSB3aGljaCBjYW5ub3QgYmUgb3V0bGluZWQuCisgIC8vLyBccCBJbnZpc2libGUgaW5zdHJ1Y3Rpb25zIGFyZSBpbnN0cnVjdGlvbnMgd2hpY2ggY2FuIGJlIG91dGxpbmVkLCBidXQKKyAgLy8vIHNob3VsZG4ndCBhY3R1YWxseSBpbXBhY3QgdGhlIG91dGxpbmluZyByZXN1bHQuCisgIGVudW0gTWFjaGluZU91dGxpbmVySW5zdHJUeXBlIHsgTGVnYWwsIElsbGVnYWwsIEludmlzaWJsZSB9OworCisgIC8vLyBSZXR1cm5zIGhvdyBvciBpZiBccCBNSSBzaG91bGQgYmUgb3V0bGluZWQuCisgIHZpcnR1YWwgTWFjaGluZU91dGxpbmVySW5zdHJUeXBlCisgIGdldE91dGxpbmluZ1R5cGUoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZNSVQsIHVuc2lnbmVkIEZsYWdzKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgKKyAgICAgICAgIlRhcmdldCBkaWRuJ3QgaW1wbGVtZW50IFRhcmdldEluc3RySW5mbzo6Z2V0T3V0bGluaW5nVHlwZSEiKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0YXJnZXQtZGVmaW5lZCBmbGFncyBkZWZpbmluZyBwcm9wZXJ0aWVzIG9mIHRoZSBNQkIgZm9yCisgIC8vLyB0aGUgb3V0bGluZXIuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TWFjaGluZU91dGxpbmVyTUJCRmxhZ3MoTWFjaGluZUJhc2ljQmxvY2sgJk1CQikgY29uc3QgeworICAgIHJldHVybiAweDA7CisgIH0KKworICAvLy8gSW5zZXJ0IGEgY3VzdG9tIGVwaWxvZ3VlIGZvciBvdXRsaW5lZCBmdW5jdGlvbnMuCisgIC8vLyBUaGlzIG1heSBiZSBlbXB0eSwgaW4gd2hpY2ggY2FzZSBubyBlcGlsb2d1ZSBvciByZXR1cm4gc3RhdGVtZW50IHdpbGwgYmUKKyAgLy8vIGVtaXR0ZWQuCisgIHZpcnR1YWwgdm9pZCBpbnNlcnRPdXRsaW5lckVwaWxvZ3VlKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVPdXRsaW5lckluZm8gJk1JbmZvKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgKKyAgICAgICAgIlRhcmdldCBkaWRuJ3QgaW1wbGVtZW50IFRhcmdldEluc3RySW5mbzo6aW5zZXJ0T3V0bGluZXJFcGlsb2d1ZSEiKTsKKyAgfQorCisgIC8vLyBJbnNlcnQgYSBjYWxsIHRvIGFuIG91dGxpbmVkIGZ1bmN0aW9uIGludG8gdGhlIHByb2dyYW0uCisgIC8vLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBzcG90IHdoZXJlIHdlIGluc2VydGVkIHRoZSBjYWxsLiBUaGlzIG11c3QgYmUKKyAgLy8vIGltcGxlbWVudGVkIGJ5IHRoZSB0YXJnZXQuCisgIHZpcnR1YWwgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yCisgIGluc2VydE91dGxpbmVkQ2FsbChNb2R1bGUgJk0sIE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jazo6aXRlcmF0b3IgJkl0LCBNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZU91dGxpbmVySW5mbyAmTUluZm8pIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKAorICAgICAgICAiVGFyZ2V0IGRpZG4ndCBpbXBsZW1lbnQgVGFyZ2V0SW5zdHJJbmZvOjppbnNlcnRPdXRsaW5lZENhbGwhIik7CisgIH0KKworICAvLy8gSW5zZXJ0IGEgY3VzdG9tIHByb2xvZ3VlIGZvciBvdXRsaW5lZCBmdW5jdGlvbnMuCisgIC8vLyBUaGlzIG1heSBiZSBlbXB0eSwgaW4gd2hpY2ggY2FzZSBubyBwcm9sb2d1ZSB3aWxsIGJlIGVtaXR0ZWQuCisgIHZpcnR1YWwgdm9pZCBpbnNlcnRPdXRsaW5lclByb2xvZ3VlKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVPdXRsaW5lckluZm8gJk1JbmZvKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgKKyAgICAgICAgIlRhcmdldCBkaWRuJ3QgaW1wbGVtZW50IFRhcmdldEluc3RySW5mbzo6aW5zZXJ0T3V0bGluZXJQcm9sb2d1ZSEiKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZnVuY3Rpb24gY2FuIHNhZmVseSBiZSBvdXRsaW5lZCBmcm9tLgorICAvLy8gQSBmdW5jdGlvbiBccCBNRiBpcyBjb25zaWRlcmVkIHNhZmUgZm9yIG91dGxpbmluZyBpZiBhbiBvdXRsaW5lZCBmdW5jdGlvbgorICAvLy8gcHJvZHVjZWQgZnJvbSBpbnN0cnVjdGlvbnMgaW4gRiB3aWxsIHByb2R1Y2UgYSBwcm9ncmFtIHdoaWNoIHByb2R1Y2VzIHRoZQorICAvLy8gc2FtZSBvdXRwdXQgZm9yIGFueSBzZXQgb2YgZ2l2ZW4gaW5wdXRzLgorICB2aXJ0dWFsIGJvb2wgaXNGdW5jdGlvblNhZmVUb091dGxpbmVGcm9tKE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPdXRsaW5lRnJvbUxpbmtPbmNlT0RScykgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlRhcmdldCBkaWRuJ3QgaW1wbGVtZW50ICIKKyAgICAgICAgICAgICAgICAgICAgICJUYXJnZXRJbnN0ckluZm86OmlzRnVuY3Rpb25TYWZlVG9PdXRsaW5lRnJvbSEiKTsKKyAgfQorCitwcml2YXRlOgorICB1bnNpZ25lZCBDYWxsRnJhbWVTZXR1cE9wY29kZSwgQ2FsbEZyYW1lRGVzdHJveU9wY29kZTsKKyAgdW5zaWduZWQgQ2F0Y2hSZXRPcGNvZGU7CisgIHVuc2lnbmVkIFJldHVybk9wY29kZTsKK307CisKKy8vLyBcYnJpZWYgUHJvdmlkZSBEZW5zZU1hcEluZm8gZm9yIFRhcmdldEluc3RySW5mbzo6UmVnU3ViUmVnUGFpci4KK3RlbXBsYXRlIDw+IHN0cnVjdCBEZW5zZU1hcEluZm88VGFyZ2V0SW5zdHJJbmZvOjpSZWdTdWJSZWdQYWlyPiB7CisgIHVzaW5nIFJlZ0luZm8gPSBEZW5zZU1hcEluZm88dW5zaWduZWQ+OworCisgIHN0YXRpYyBpbmxpbmUgVGFyZ2V0SW5zdHJJbmZvOjpSZWdTdWJSZWdQYWlyIGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiBUYXJnZXRJbnN0ckluZm86OlJlZ1N1YlJlZ1BhaXIoUmVnSW5mbzo6Z2V0RW1wdHlLZXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ0luZm86OmdldEVtcHR5S2V5KCkpOworICB9CisKKyAgc3RhdGljIGlubGluZSBUYXJnZXRJbnN0ckluZm86OlJlZ1N1YlJlZ1BhaXIgZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiBUYXJnZXRJbnN0ckluZm86OlJlZ1N1YlJlZ1BhaXIoUmVnSW5mbzo6Z2V0VG9tYnN0b25lS2V5KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdJbmZvOjpnZXRUb21ic3RvbmVLZXkoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldXNlIGdldEhhc2hWYWx1ZSBpbXBsZW1lbnRhdGlvbiBmcm9tCisgIC8vLyBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPi4KKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBUYXJnZXRJbnN0ckluZm86OlJlZ1N1YlJlZ1BhaXIgJlZhbCkgeworICAgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+IFBhaXJWYWwgPSBzdGQ6Om1ha2VfcGFpcihWYWwuUmVnLCBWYWwuU3ViUmVnKTsKKyAgICByZXR1cm4gRGVuc2VNYXBJbmZvPHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+Pjo6Z2V0SGFzaFZhbHVlKFBhaXJWYWwpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBUYXJnZXRJbnN0ckluZm86OlJlZ1N1YlJlZ1BhaXIgJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRJbnN0ckluZm86OlJlZ1N1YlJlZ1BhaXIgJlJIUykgeworICAgIHJldHVybiBSZWdJbmZvOjppc0VxdWFsKExIUy5SZWcsIFJIUy5SZWcpICYmCisgICAgICAgICAgIFJlZ0luZm86OmlzRXF1YWwoTEhTLlN1YlJlZywgUkhTLlN1YlJlZyk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RBUkdFVF9UQVJHRVRJTlNUUklORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldExvd2VyaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVGFyZ2V0TG93ZXJpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODMyMjNhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldExvd2VyaW5nLmgKQEAgLTAsMCArMSwzNjE1IEBACisvLz09PS0gbGx2bS9Db2RlR2VuL1RhcmdldExvd2VyaW5nLmggLSBUYXJnZXQgTG93ZXJpbmcgSW5mbyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgZGVzY3JpYmVzIGhvdyB0byBsb3dlciBMTFZNIGNvZGUgdG8gbWFjaGluZSBjb2RlLiAgVGhpcyBoYXMgdHdvCisvLy8gbWFpbiBjb21wb25lbnRzOgorLy8vCisvLy8gIDEuIFdoaWNoIFZhbHVlVHlwZXMgYXJlIG5hdGl2ZWx5IHN1cHBvcnRlZCBieSB0aGUgdGFyZ2V0LgorLy8vICAyLiBXaGljaCBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQgZm9yIHN1cHBvcnRlZCBWYWx1ZVR5cGVzLgorLy8vICAzLiBDb3N0IHRocmVzaG9sZHMgZm9yIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9ucyBvZiBjZXJ0YWluIG9wZXJhdGlvbnMuCisvLy8KKy8vLyBJbiBhZGRpdGlvbiBpdCBoYXMgYSBmZXcgb3RoZXIgY29tcG9uZW50cywgbGlrZSBpbmZvcm1hdGlvbiBhYm91dCBGUAorLy8vIGltbWVkaWF0ZXMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1RBUkdFVExPV0VSSU5HX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1RBUkdFVExPV0VSSU5HX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FQSW50LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9EaXZlcmdlbmNlQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vREFHQ29tYmluZS5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9JU0RPcGNvZGVzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1J1bnRpbWVMaWJjYWxscy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TZWxlY3Rpb25EQUcuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vU2VsZWN0aW9uREFHTm9kZXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVGFyZ2V0Q2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vVmFsdWVUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvQXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxpbmdDb252LmgiCisjaW5jbHVkZSAibGx2bS9JUi9EYXRhTGF5b3V0LmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JUkJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0lubGluZUFzbS5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSVIvVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQXRvbWljT3JkZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hY2hpbmVWYWx1ZVR5cGUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRNYWNoaW5lLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQnJhbmNoUHJvYmFiaWxpdHk7CitjbGFzcyBDQ1N0YXRlOworY2xhc3MgQ0NWYWxBc3NpZ247CitjbGFzcyBDb25zdGFudDsKK2NsYXNzIEZhc3RJU2VsOworY2xhc3MgRnVuY3Rpb25Mb3dlcmluZ0luZm87CitjbGFzcyBHbG9iYWxWYWx1ZTsKK2NsYXNzIEludHJpbnNpY0luc3Q7CitzdHJ1Y3QgS25vd25CaXRzOworY2xhc3MgTExWTUNvbnRleHQ7CitjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIE1hY2hpbmVKdW1wVGFibGVJbmZvOworY2xhc3MgTWFjaGluZUxvb3A7CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNFeHByOworY2xhc3MgTW9kdWxlOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJDbGFzczsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworY2xhc3MgVGFyZ2V0UmVnaXN0ZXJJbmZvOworY2xhc3MgVmFsdWU7CisKK25hbWVzcGFjZSBTY2hlZCB7CisKKyAgZW51bSBQcmVmZXJlbmNlIHsKKyAgICBOb25lLCAgICAgICAgICAgICAvLyBObyBwcmVmZXJlbmNlCisgICAgU291cmNlLCAgICAgICAgICAgLy8gRm9sbG93IHNvdXJjZSBvcmRlci4KKyAgICBSZWdQcmVzc3VyZSwgICAgICAvLyBTY2hlZHVsaW5nIGZvciBsb3dlc3QgcmVnaXN0ZXIgcHJlc3N1cmUuCisgICAgSHlicmlkLCAgICAgICAgICAgLy8gU2NoZWR1bGluZyBmb3IgYm90aCBsYXRlbmN5IGFuZCByZWdpc3RlciBwcmVzc3VyZS4KKyAgICBJTFAsICAgICAgICAgICAgICAvLyBTY2hlZHVsaW5nIGZvciBJTFAgaW4gbG93IHJlZ2lzdGVyIHByZXNzdXJlIG1vZGUuCisgICAgVkxJVyAgICAgICAgICAgICAgLy8gU2NoZWR1bGluZyBmb3IgVkxJVyB0YXJnZXRzLgorICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgU2NoZWQKKworLy8vIFRoaXMgYmFzZSBjbGFzcyBmb3IgVGFyZ2V0TG93ZXJpbmcgY29udGFpbnMgdGhlIFNlbGVjdGlvbkRBRy1pbmRlcGVuZGVudAorLy8vIHBhcnRzIHRoYXQgY2FuIGJlIHVzZWQgZnJvbSB0aGUgcmVzdCBvZiBDb2RlR2VuLgorY2xhc3MgVGFyZ2V0TG93ZXJpbmdCYXNlIHsKK3B1YmxpYzoKKyAgLy8vIFRoaXMgZW51bSBpbmRpY2F0ZXMgd2hldGhlciBvcGVyYXRpb25zIGFyZSB2YWxpZCBmb3IgYSB0YXJnZXQsIGFuZCBpZiBub3QsCisgIC8vLyB3aGF0IGFjdGlvbiBzaG91bGQgYmUgdXNlZCB0byBtYWtlIHRoZW0gdmFsaWQuCisgIGVudW0gTGVnYWxpemVBY3Rpb24gOiB1aW50OF90IHsKKyAgICBMZWdhbCwgICAgICAvLyBUaGUgdGFyZ2V0IG5hdGl2ZWx5IHN1cHBvcnRzIHRoaXMgb3BlcmF0aW9uLgorICAgIFByb21vdGUsICAgIC8vIFRoaXMgb3BlcmF0aW9uIHNob3VsZCBiZSBleGVjdXRlZCBpbiBhIGxhcmdlciB0eXBlLgorICAgIEV4cGFuZCwgICAgIC8vIFRyeSB0byBleHBhbmQgdGhpcyB0byBvdGhlciBvcHMsIG90aGVyd2lzZSB1c2UgYSBsaWJjYWxsLgorICAgIExpYkNhbGwsICAgIC8vIERvbid0IHRyeSB0byBleHBhbmQgdGhpcyB0byBvdGhlciBvcHMsIGFsd2F5cyB1c2UgYSBsaWJjYWxsLgorICAgIEN1c3RvbSAgICAgIC8vIFVzZSB0aGUgTG93ZXJPcGVyYXRpb24gaG9vayB0byBpbXBsZW1lbnQgY3VzdG9tIGxvd2VyaW5nLgorICB9OworCisgIC8vLyBUaGlzIGVudW0gaW5kaWNhdGVzIHdoZXRoZXIgYSB0eXBlcyBhcmUgbGVnYWwgZm9yIGEgdGFyZ2V0LCBhbmQgaWYgbm90LAorICAvLy8gd2hhdCBhY3Rpb24gc2hvdWxkIGJlIHVzZWQgdG8gbWFrZSB0aGVtIHZhbGlkLgorICBlbnVtIExlZ2FsaXplVHlwZUFjdGlvbiA6IHVpbnQ4X3QgeworICAgIFR5cGVMZWdhbCwgICAgICAgICAgIC8vIFRoZSB0YXJnZXQgbmF0aXZlbHkgc3VwcG9ydHMgdGhpcyB0eXBlLgorICAgIFR5cGVQcm9tb3RlSW50ZWdlciwgIC8vIFJlcGxhY2UgdGhpcyBpbnRlZ2VyIHdpdGggYSBsYXJnZXIgb25lLgorICAgIFR5cGVFeHBhbmRJbnRlZ2VyLCAgIC8vIFNwbGl0IHRoaXMgaW50ZWdlciBpbnRvIHR3byBvZiBoYWxmIHRoZSBzaXplLgorICAgIFR5cGVTb2Z0ZW5GbG9hdCwgICAgIC8vIENvbnZlcnQgdGhpcyBmbG9hdCB0byBhIHNhbWUgc2l6ZSBpbnRlZ2VyIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgYW4gb3BlcmF0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgaW4gdGFyZ2V0IEhXLgorICAgIFR5cGVFeHBhbmRGbG9hdCwgICAgIC8vIFNwbGl0IHRoaXMgZmxvYXQgaW50byB0d28gb2YgaGFsZiB0aGUgc2l6ZS4KKyAgICBUeXBlU2NhbGFyaXplVmVjdG9yLCAvLyBSZXBsYWNlIHRoaXMgb25lLWVsZW1lbnQgdmVjdG9yIHdpdGggaXRzIGVsZW1lbnQuCisgICAgVHlwZVNwbGl0VmVjdG9yLCAgICAgLy8gU3BsaXQgdGhpcyB2ZWN0b3IgaW50byB0d28gb2YgaGFsZiB0aGUgc2l6ZS4KKyAgICBUeXBlV2lkZW5WZWN0b3IsICAgICAvLyBUaGlzIHZlY3RvciBzaG91bGQgYmUgd2lkZW5lZCBpbnRvIGEgbGFyZ2VyIHZlY3Rvci4KKyAgICBUeXBlUHJvbW90ZUZsb2F0ICAgICAvLyBSZXBsYWNlIHRoaXMgZmxvYXQgd2l0aCBhIGxhcmdlciBvbmUuCisgIH07CisKKyAgLy8vIExlZ2FsaXplS2luZCBob2xkcyB0aGUgbGVnYWxpemF0aW9uIGtpbmQgdGhhdCBuZWVkcyB0byBoYXBwZW4gdG8gRVZUCisgIC8vLyBpbiBvcmRlciB0byB0eXBlLWxlZ2FsaXplIGl0LgorICB1c2luZyBMZWdhbGl6ZUtpbmQgPSBzdGQ6OnBhaXI8TGVnYWxpemVUeXBlQWN0aW9uLCBFVlQ+OworCisgIC8vLyBFbnVtIHRoYXQgZGVzY3JpYmVzIGhvdyB0aGUgdGFyZ2V0IHJlcHJlc2VudHMgdHJ1ZS9mYWxzZSB2YWx1ZXMuCisgIGVudW0gQm9vbGVhbkNvbnRlbnQgeworICAgIFVuZGVmaW5lZEJvb2xlYW5Db250ZW50LCAgICAvLyBPbmx5IGJpdCAwIGNvdW50cywgdGhlIHJlc3QgY2FuIGhvbGQgZ2FyYmFnZS4KKyAgICBaZXJvT3JPbmVCb29sZWFuQ29udGVudCwgICAgICAgIC8vIEFsbCBiaXRzIHplcm8gZXhjZXB0IGZvciBiaXQgMC4KKyAgICBaZXJvT3JOZWdhdGl2ZU9uZUJvb2xlYW5Db250ZW50IC8vIEFsbCBiaXRzIGVxdWFsIHRvIGJpdCAwLgorICB9OworCisgIC8vLyBFbnVtIHRoYXQgZGVzY3JpYmVzIHdoYXQgdHlwZSBvZiBzdXBwb3J0IGZvciBzZWxlY3RzIHRoZSB0YXJnZXQgaGFzLgorICBlbnVtIFNlbGVjdFN1cHBvcnRLaW5kIHsKKyAgICBTY2FsYXJWYWxTZWxlY3QsICAgICAgLy8gVGhlIHRhcmdldCBzdXBwb3J0cyBzY2FsYXIgc2VsZWN0cyAoZXg6IGNtb3YpLgorICAgIFNjYWxhckNvbmRWZWN0b3JWYWwsICAvLyBUaGUgdGFyZ2V0IHN1cHBvcnRzIHNlbGVjdHMgd2l0aCBhIHNjYWxhciBjb25kaXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHZlY3RvciB2YWx1ZXMgKGV4OiBjbW92KS4KKyAgICBWZWN0b3JNYXNrU2VsZWN0ICAgICAgLy8gVGhlIHRhcmdldCBzdXBwb3J0cyB2ZWN0b3Igc2VsZWN0cyB3aXRoIGEgdmVjdG9yCisgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1hc2sgKGV4OiB4ODYgYmxlbmRzKS4KKyAgfTsKKworICAvLy8gRW51bSB0aGF0IHNwZWNpZmllcyB3aGF0IGFuIGF0b21pYyBsb2FkL0F0b21pY1JNV0luc3QgaXMgZXhwYW5kZWQKKyAgLy8vIHRvLCBpZiBhdCBhbGwuIEV4aXN0cyBiZWNhdXNlIGRpZmZlcmVudCB0YXJnZXRzIGhhdmUgZGlmZmVyZW50IGxldmVscyBvZgorICAvLy8gc3VwcG9ydCBmb3IgdGhlc2UgYXRvbWljIGluc3RydWN0aW9ucywgYW5kIGFsc28gaGF2ZSBkaWZmZXJlbnQgb3B0aW9ucworICAvLy8gdy5yLnQuIHdoYXQgdGhleSBzaG91bGQgZXhwYW5kIHRvLgorICBlbnVtIGNsYXNzIEF0b21pY0V4cGFuc2lvbktpbmQgeworICAgIE5vbmUsICAgIC8vIERvbid0IGV4cGFuZCB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgTExTQywgICAgLy8gRXhwYW5kIHRoZSBpbnN0cnVjdGlvbiBpbnRvIGxvYWRsaW5rZWQvc3RvcmVjb25kaXRpb25hbDsgdXNlZAorICAgICAgICAgICAgIC8vIGJ5IEFSTS9BQXJjaDY0LgorICAgIExMT25seSwgIC8vIEV4cGFuZCB0aGUgKGxvYWQpIGluc3RydWN0aW9uIGludG8ganVzdCBhIGxvYWQtbGlua2VkLCB3aGljaCBoYXMKKyAgICAgICAgICAgICAvLyBncmVhdGVyIGF0b21pYyBndWFyYW50ZWVzIHRoYW4gYSBub3JtYWwgbG9hZC4KKyAgICBDbXBYQ2hnLCAvLyBFeHBhbmQgdGhlIGluc3RydWN0aW9uIGludG8gY21weGNoZzsgdXNlZCBieSBhdCBsZWFzdCBYODYuCisgIH07CisKKyAgLy8vIEVudW0gdGhhdCBzcGVjaWZpZXMgd2hlbiBhIG11bHRpcGxpY2F0aW9uIHNob3VsZCBiZSBleHBhbmRlZC4KKyAgZW51bSBjbGFzcyBNdWxFeHBhbnNpb25LaW5kIHsKKyAgICBBbHdheXMsICAgICAgICAgICAgLy8gQWx3YXlzIGV4cGFuZCB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgT25seUxlZ2FsT3JDdXN0b20sIC8vIE9ubHkgZXhwYW5kIHdoZW4gdGhlIHJlc3VsdGluZyBpbnN0cnVjdGlvbnMgYXJlIGxlZ2FsCisgICAgICAgICAgICAgICAgICAgICAgIC8vIG9yIGN1c3RvbS4KKyAgfTsKKworICBjbGFzcyBBcmdMaXN0RW50cnkgeworICBwdWJsaWM6CisgICAgVmFsdWUgKlZhbCA9IG51bGxwdHI7CisgICAgU0RWYWx1ZSBOb2RlID0gU0RWYWx1ZSgpOworICAgIFR5cGUgKlR5ID0gbnVsbHB0cjsKKyAgICBib29sIElzU0V4dCA6IDE7CisgICAgYm9vbCBJc1pFeHQgOiAxOworICAgIGJvb2wgSXNJblJlZyA6IDE7CisgICAgYm9vbCBJc1NSZXQgOiAxOworICAgIGJvb2wgSXNOZXN0IDogMTsKKyAgICBib29sIElzQnlWYWwgOiAxOworICAgIGJvb2wgSXNJbkFsbG9jYSA6IDE7CisgICAgYm9vbCBJc1JldHVybmVkIDogMTsKKyAgICBib29sIElzU3dpZnRTZWxmIDogMTsKKyAgICBib29sIElzU3dpZnRFcnJvciA6IDE7CisgICAgdWludDE2X3QgQWxpZ25tZW50ID0gMDsKKworICAgIEFyZ0xpc3RFbnRyeSgpCisgICAgICAgIDogSXNTRXh0KGZhbHNlKSwgSXNaRXh0KGZhbHNlKSwgSXNJblJlZyhmYWxzZSksIElzU1JldChmYWxzZSksCisgICAgICAgICAgSXNOZXN0KGZhbHNlKSwgSXNCeVZhbChmYWxzZSksIElzSW5BbGxvY2EoZmFsc2UpLCBJc1JldHVybmVkKGZhbHNlKSwKKyAgICAgICAgICBJc1N3aWZ0U2VsZihmYWxzZSksIElzU3dpZnRFcnJvcihmYWxzZSkge30KKworICAgIHZvaWQgc2V0QXR0cmlidXRlcyhJbW11dGFibGVDYWxsU2l0ZSAqQ1MsIHVuc2lnbmVkIEFyZ0lkeCk7CisgIH07CisgIHVzaW5nIEFyZ0xpc3RUeSA9IHN0ZDo6dmVjdG9yPEFyZ0xpc3RFbnRyeT47CisKKyAgdmlydHVhbCB2b2lkIG1hcmtMaWJDYWxsQXR0cmlidXRlcyhNYWNoaW5lRnVuY3Rpb24gKk1GLCB1bnNpZ25lZCBDQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmdMaXN0VHkgJkFyZ3MpIGNvbnN0IHt9OworCisgIHN0YXRpYyBJU0Q6Ok5vZGVUeXBlIGdldEV4dGVuZEZvckNvbnRlbnQoQm9vbGVhbkNvbnRlbnQgQ29udGVudCkgeworICAgIHN3aXRjaCAoQ29udGVudCkgeworICAgIGNhc2UgVW5kZWZpbmVkQm9vbGVhbkNvbnRlbnQ6CisgICAgICAvLyBFeHRlbmQgYnkgYWRkaW5nIHJ1YmJpc2ggYml0cy4KKyAgICAgIHJldHVybiBJU0Q6OkFOWV9FWFRFTkQ7CisgICAgY2FzZSBaZXJvT3JPbmVCb29sZWFuQ29udGVudDoKKyAgICAgIC8vIEV4dGVuZCBieSBhZGRpbmcgemVybyBiaXRzLgorICAgICAgcmV0dXJuIElTRDo6WkVST19FWFRFTkQ7CisgICAgY2FzZSBaZXJvT3JOZWdhdGl2ZU9uZUJvb2xlYW5Db250ZW50OgorICAgICAgLy8gRXh0ZW5kIGJ5IGNvcHlpbmcgdGhlIHNpZ24gYml0LgorICAgICAgcmV0dXJuIElTRDo6U0lHTl9FWFRFTkQ7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoIkludmFsaWQgY29udGVudCBraW5kIik7CisgIH0KKworICAvLy8gTk9URTogVGhlIFRhcmdldE1hY2hpbmUgb3ducyBUTE9GLgorICBleHBsaWNpdCBUYXJnZXRMb3dlcmluZ0Jhc2UoY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pOworICBUYXJnZXRMb3dlcmluZ0Jhc2UoY29uc3QgVGFyZ2V0TG93ZXJpbmdCYXNlICYpID0gZGVsZXRlOworICBUYXJnZXRMb3dlcmluZ0Jhc2UgJm9wZXJhdG9yPShjb25zdCBUYXJnZXRMb3dlcmluZ0Jhc2UgJikgPSBkZWxldGU7CisgIHZpcnR1YWwgflRhcmdldExvd2VyaW5nQmFzZSgpID0gZGVmYXVsdDsKKworcHJvdGVjdGVkOgorICAvLy8gXGJyaWVmIEluaXRpYWxpemUgYWxsIG9mIHRoZSBhY3Rpb25zIHRvIGRlZmF1bHQgdmFsdWVzLgorICB2b2lkIGluaXRBY3Rpb25zKCk7CisKK3B1YmxpYzoKKyAgY29uc3QgVGFyZ2V0TWFjaGluZSAmZ2V0VGFyZ2V0TWFjaGluZSgpIGNvbnN0IHsgcmV0dXJuIFRNOyB9CisKKyAgdmlydHVhbCBib29sIHVzZVNvZnRGbG9hdCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFJldHVybiB0aGUgcG9pbnRlciB0eXBlIGZvciB0aGUgZ2l2ZW4gYWRkcmVzcyBzcGFjZSwgZGVmYXVsdHMgdG8KKyAgLy8vIHRoZSBwb2ludGVyIHR5cGUgZnJvbSB0aGUgZGF0YSBsYXlvdXQuCisgIC8vLyBGSVhNRTogVGhlIGRlZmF1bHQgbmVlZHMgdG8gYmUgcmVtb3ZlZCBvbmNlIGFsbCB0aGUgY29kZSBpcyB1cGRhdGVkLgorICBNVlQgZ2V0UG9pbnRlclR5KGNvbnN0IERhdGFMYXlvdXQgJkRMLCB1aW50MzJfdCBBUyA9IDApIGNvbnN0IHsKKyAgICByZXR1cm4gTVZUOjpnZXRJbnRlZ2VyVlQoREwuZ2V0UG9pbnRlclNpemVJbkJpdHMoQVMpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHR5cGUgZm9yIGZyYW1lIGluZGV4LCB3aGljaCBpcyBkZXRlcm1pbmVkIGJ5CisgIC8vLyB0aGUgYWxsb2NhIGFkZHJlc3Mgc3BhY2Ugc3BlY2lmaWVkIHRocm91Z2ggdGhlIGRhdGEgbGF5b3V0LgorICBNVlQgZ2V0RnJhbWVJbmRleFR5KGNvbnN0IERhdGFMYXlvdXQgJkRMKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFBvaW50ZXJUeShETCwgREwuZ2V0QWxsb2NhQWRkclNwYWNlKCkpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgdHlwZSBmb3Igb3BlcmFuZHMgb2YgZmVuY2UuCisgIC8vLyBUT0RPOiBMZXQgZmVuY2Ugb3BlcmFuZHMgYmUgb2YgaTMyIHR5cGUgYW5kIHJlbW92ZSB0aGlzLgorICB2aXJ0dWFsIE1WVCBnZXRGZW5jZU9wZXJhbmRUeShjb25zdCBEYXRhTGF5b3V0ICZETCkgY29uc3QgeworICAgIHJldHVybiBnZXRQb2ludGVyVHkoREwpOworICB9CisKKyAgLy8vIEVWVCBpcyBub3QgdXNlZCBpbi10cmVlLCBidXQgaXMgdXNlZCBieSBvdXQtb2YtdHJlZSB0YXJnZXQuCisgIC8vLyBBIGRvY3VtZW50YXRpb24gZm9yIHRoaXMgZnVuY3Rpb24gd291bGQgYmUgbmljZS4uLgorICB2aXJ0dWFsIE1WVCBnZXRTY2FsYXJTaGlmdEFtb3VudFR5KGNvbnN0IERhdGFMYXlvdXQgJiwgRVZUKSBjb25zdDsKKworICBFVlQgZ2V0U2hpZnRBbW91bnRUeShFVlQgTEhTVHksIGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIExlZ2FsVHlwZXMgPSB0cnVlKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgdHlwZSB0byBiZSB1c2VkIGZvciB0aGUgaW5kZXggb3BlcmFuZCBvZjoKKyAgLy8vIElTRDo6SU5TRVJUX1ZFQ1RPUl9FTFQsIElTRDo6RVhUUkFDVF9WRUNUT1JfRUxULAorICAvLy8gSVNEOjpJTlNFUlRfU1VCVkVDVE9SLCBhbmQgSVNEOjpFWFRSQUNUX1NVQlZFQ1RPUgorICB2aXJ0dWFsIE1WVCBnZXRWZWN0b3JJZHhUeShjb25zdCBEYXRhTGF5b3V0ICZETCkgY29uc3QgeworICAgIHJldHVybiBnZXRQb2ludGVyVHkoREwpOworICB9CisKKyAgdmlydHVhbCBib29sIGlzU2VsZWN0U3VwcG9ydGVkKFNlbGVjdFN1cHBvcnRLaW5kIC8qa2luZCovKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgbXVsdGlwbGUgY29uZGl0aW9uIHJlZ2lzdGVycyBhcmUgYXZhaWxhYmxlLgorICBib29sIGhhc011bHRpcGxlQ29uZGl0aW9uUmVnaXN0ZXJzKCkgY29uc3QgeworICAgIHJldHVybiBIYXNNdWx0aXBsZUNvbmRpdGlvblJlZ2lzdGVyczsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IGhhcyBCaXRFeHRyYWN0IGluc3RydWN0aW9ucy4KKyAgYm9vbCBoYXNFeHRyYWN0Qml0c0luc24oKSBjb25zdCB7IHJldHVybiBIYXNFeHRyYWN0Qml0c0luc247IH0KKworICAvLy8gUmV0dXJuIHRoZSBwcmVmZXJyZWQgdmVjdG9yIHR5cGUgbGVnYWxpemF0aW9uIGFjdGlvbi4KKyAgdmlydHVhbCBUYXJnZXRMb3dlcmluZ0Jhc2U6OkxlZ2FsaXplVHlwZUFjdGlvbgorICBnZXRQcmVmZXJyZWRWZWN0b3JBY3Rpb24oRVZUIFZUKSBjb25zdCB7CisgICAgLy8gVGhlIGRlZmF1bHQgYWN0aW9uIGZvciBvbmUgZWxlbWVudCB2ZWN0b3JzIGlzIHRvIHNjYWxhcml6ZQorICAgIGlmIChWVC5nZXRWZWN0b3JOdW1FbGVtZW50cygpID09IDEpCisgICAgICByZXR1cm4gVHlwZVNjYWxhcml6ZVZlY3RvcjsKKyAgICAvLyBUaGUgZGVmYXVsdCBhY3Rpb24gZm9yIG90aGVyIHZlY3RvcnMgaXMgdG8gcHJvbW90ZQorICAgIHJldHVybiBUeXBlUHJvbW90ZUludGVnZXI7CisgIH0KKworICAvLyBUaGVyZSBhcmUgdHdvIGdlbmVyYWwgbWV0aG9kcyBmb3IgZXhwYW5kaW5nIGEgQlVJTERfVkVDVE9SIG5vZGU6CisgIC8vICAxLiBVc2UgU0NBTEFSX1RPX1ZFQ1RPUiBvbiB0aGUgZGVmaW5lZCBzY2FsYXIgdmFsdWVzIGFuZCB0aGVuIHNodWZmbGUKKyAgLy8gICAgIHRoZW0gdG9nZXRoZXIuCisgIC8vICAyLiBCdWlsZCB0aGUgdmVjdG9yIG9uIHRoZSBzdGFjayBhbmQgdGhlbiBsb2FkIGl0LgorICAvLyBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgdGhlbiBtZXRob2QgKDEpIHdpbGwgYmUgdXNlZCwgc3ViamVjdCB0bworICAvLyB0aGUgY29uc3RyYWludCB0aGF0IGFsbCBvZiB0aGUgbmVjZXNzYXJ5IHNodWZmbGVzIGFyZSBsZWdhbCAoYXMgZGV0ZXJtaW5lZAorICAvLyBieSBpc1NodWZmbGVNYXNrTGVnYWwpLiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UsIHRoZW4gbWV0aG9kICgyKSBpcworICAvLyBhbHdheXMgdXNlZC4gVGhlIHZlY3RvciB0eXBlLCBhbmQgdGhlIG51bWJlciBvZiBkZWZpbmVkIHZhbHVlcywgYXJlCisgIC8vIHByb3ZpZGVkLgorICB2aXJ0dWFsIGJvb2wKKyAgc2hvdWxkRXhwYW5kQnVpbGRWZWN0b3JXaXRoU2h1ZmZsZXMoRVZUIC8qIFZUICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZWZpbmVkVmFsdWVzKSBjb25zdCB7CisgICAgcmV0dXJuIERlZmluZWRWYWx1ZXMgPCAzOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGludGVnZXIgZGl2aWRlIGlzIHVzdWFsbHkgY2hlYXBlciB0aGFuIGEgc2VxdWVuY2Ugb2YKKyAgLy8vIHNldmVyYWwgc2hpZnRzLCBhZGRzLCBhbmQgbXVsdGlwbGllcyBmb3IgdGhpcyB0YXJnZXQuCisgIC8vLyBUaGUgZGVmaW5pdGlvbiBvZiAiY2hlYXBlciIgbWF5IGRlcGVuZCBvbiB3aGV0aGVyIHdlJ3JlIG9wdGltaXppbmcKKyAgLy8vIGZvciBzcGVlZCBvciBmb3Igc2l6ZS4KKyAgdmlydHVhbCBib29sIGlzSW50RGl2Q2hlYXAoRVZUIFZULCBBdHRyaWJ1dGVMaXN0IEF0dHIpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgY2FuIGhhbmRsZSBhIHN0YW5kYWxvbmUgcmVtYWluZGVyIG9wZXJhdGlvbi4KKyAgdmlydHVhbCBib29sIGhhc1N0YW5kYWxvbmVSZW0oRVZUIFZUKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgU1FSVChYKSBzaG91bGRuJ3QgYmUgcmVwbGFjZWQgd2l0aCBYKlJTUVJUKFgpLgorICB2aXJ0dWFsIGJvb2wgaXNGc3FydENoZWFwKFNEVmFsdWUgWCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgICAvLyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIHJlcGxhY2UgU1FSVChYKSB3aXRoIFgqUlNRUlQoWCkuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJlY2lwcm9jYWwgZXN0aW1hdGUgc3RhdHVzIHZhbHVlcyB1c2VkIGJ5IHRoZSBmdW5jdGlvbnMgYmVsb3cuCisgIGVudW0gUmVjaXByb2NhbEVzdGltYXRlIDogaW50IHsKKyAgICBVbnNwZWNpZmllZCA9IC0xLAorICAgIERpc2FibGVkID0gMCwKKyAgICBFbmFibGVkID0gMQorICB9OworCisgIC8vLyBSZXR1cm4gYSBSZWNpcHJvY2FsRXN0aW1hdGUgZW51bSB2YWx1ZSBmb3IgYSBzcXVhcmUgcm9vdCBvZiB0aGUgZ2l2ZW4gdHlwZQorICAvLy8gYmFzZWQgb24gdGhlIGZ1bmN0aW9uJ3MgYXR0cmlidXRlcy4gSWYgdGhlIG9wZXJhdGlvbiBpcyBub3Qgb3ZlcnJpZGRlbiBieQorICAvLy8gdGhlIGZ1bmN0aW9uJ3MgYXR0cmlidXRlcywgIlVuc3BlY2lmaWVkIiBpcyByZXR1cm5lZCBhbmQgdGFyZ2V0IGRlZmF1bHRzCisgIC8vLyBhcmUgZXhwZWN0ZWQgdG8gYmUgdXNlZCBmb3IgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uLgorICBpbnQgZ2V0UmVjaXBFc3RpbWF0ZVNxcnRFbmFibGVkKEVWVCBWVCwgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgLy8vIFJldHVybiBhIFJlY2lwcm9jYWxFc3RpbWF0ZSBlbnVtIHZhbHVlIGZvciBhIGRpdmlzaW9uIG9mIHRoZSBnaXZlbiB0eXBlCisgIC8vLyBiYXNlZCBvbiB0aGUgZnVuY3Rpb24ncyBhdHRyaWJ1dGVzLiBJZiB0aGUgb3BlcmF0aW9uIGlzIG5vdCBvdmVycmlkZGVuIGJ5CisgIC8vLyB0aGUgZnVuY3Rpb24ncyBhdHRyaWJ1dGVzLCAiVW5zcGVjaWZpZWQiIGlzIHJldHVybmVkIGFuZCB0YXJnZXQgZGVmYXVsdHMKKyAgLy8vIGFyZSBleHBlY3RlZCB0byBiZSB1c2VkIGZvciBpbnN0cnVjdGlvbiBzZWxlY3Rpb24uCisgIGludCBnZXRSZWNpcEVzdGltYXRlRGl2RW5hYmxlZChFVlQgVlQsIE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIHJlZmluZW1lbnQgc3RlcCBjb3VudCBmb3IgYSBzcXVhcmUgcm9vdCBvZiB0aGUgZ2l2ZW4gdHlwZSBiYXNlZAorICAvLy8gb24gdGhlIGZ1bmN0aW9uJ3MgYXR0cmlidXRlcy4gSWYgdGhlIG9wZXJhdGlvbiBpcyBub3Qgb3ZlcnJpZGRlbiBieQorICAvLy8gdGhlIGZ1bmN0aW9uJ3MgYXR0cmlidXRlcywgIlVuc3BlY2lmaWVkIiBpcyByZXR1cm5lZCBhbmQgdGFyZ2V0IGRlZmF1bHRzCisgIC8vLyBhcmUgZXhwZWN0ZWQgdG8gYmUgdXNlZCBmb3IgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uLgorICBpbnQgZ2V0U3FydFJlZmluZW1lbnRTdGVwcyhFVlQgVlQsIE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIHJlZmluZW1lbnQgc3RlcCBjb3VudCBmb3IgYSBkaXZpc2lvbiBvZiB0aGUgZ2l2ZW4gdHlwZSBiYXNlZAorICAvLy8gb24gdGhlIGZ1bmN0aW9uJ3MgYXR0cmlidXRlcy4gSWYgdGhlIG9wZXJhdGlvbiBpcyBub3Qgb3ZlcnJpZGRlbiBieQorICAvLy8gdGhlIGZ1bmN0aW9uJ3MgYXR0cmlidXRlcywgIlVuc3BlY2lmaWVkIiBpcyByZXR1cm5lZCBhbmQgdGFyZ2V0IGRlZmF1bHRzCisgIC8vLyBhcmUgZXhwZWN0ZWQgdG8gYmUgdXNlZCBmb3IgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uLgorICBpbnQgZ2V0RGl2UmVmaW5lbWVudFN0ZXBzKEVWVCBWVCwgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0YXJnZXQgaGFzIGluZGljYXRlZCBhdCBsZWFzdCBvbmUgdHlwZSBzaG91bGQgYmUgYnlwYXNzZWQuCisgIGJvb2wgaXNTbG93RGl2QnlwYXNzZWQoKSBjb25zdCB7IHJldHVybiAhQnlwYXNzU2xvd0RpdldpZHRocy5lbXB0eSgpOyB9CisKKyAgLy8vIFJldHVybnMgbWFwIG9mIHNsb3cgdHlwZXMgZm9yIGRpdmlzaW9uIG9yIHJlbWFpbmRlciB3aXRoIGNvcnJlc3BvbmRpbmcKKyAgLy8vIGZhc3QgdHlwZXMKKyAgY29uc3QgRGVuc2VNYXA8dW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQ+ICZnZXRCeXBhc3NTbG93RGl2V2lkdGhzKCkgY29uc3QgeworICAgIHJldHVybiBCeXBhc3NTbG93RGl2V2lkdGhzOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIEZsb3cgQ29udHJvbCBpcyBhbiBleHBlbnNpdmUgb3BlcmF0aW9uIHRoYXQgc2hvdWxkIGJlCisgIC8vLyBhdm9pZGVkLgorICBib29sIGlzSnVtcEV4cGVuc2l2ZSgpIGNvbnN0IHsgcmV0dXJuIEp1bXBJc0V4cGVuc2l2ZTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBzZWxlY3RzIGFyZSBvbmx5IGNoZWFwZXIgdGhhbiBicmFuY2hlcyBpZiB0aGUgYnJhbmNoIGlzCisgIC8vLyB1bmxpa2VseSB0byBiZSBwcmVkaWN0ZWQgcmlnaHQuCisgIGJvb2wgaXNQcmVkaWN0YWJsZVNlbGVjdEV4cGVuc2l2ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZGljdGFibGVTZWxlY3RJc0V4cGVuc2l2ZTsKKyAgfQorCisgIC8vLyBJZiBhIGJyYW5jaCBvciBhIHNlbGVjdCBjb25kaXRpb24gaXMgc2tld2VkIGluIG9uZSBkaXJlY3Rpb24gYnkgbW9yZSB0aGFuCisgIC8vLyB0aGlzIGZhY3RvciwgaXQgaXMgdmVyeSBsaWtlbHkgdG8gYmUgcHJlZGljdGVkIGNvcnJlY3RseS4KKyAgdmlydHVhbCBCcmFuY2hQcm9iYWJpbGl0eSBnZXRQcmVkaWN0YWJsZUJyYW5jaFRocmVzaG9sZCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZm9sbG93aW5nIHRyYW5zZm9ybSBpcyBiZW5lZmljaWFsOgorICAvLy8gZm9sZCAoY29udiAobG9hZCB4KSkgLT4gKGxvYWQgKGNvbnYqKXgpCisgIC8vLyBPbiBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgbmF0aXZlbHkgc3VwcG9ydCBzb21lIHZlY3RvciBsb2FkcworICAvLy8gZWZmaWNpZW50bHksIGNhc3RpbmcgdGhlIGxvYWQgdG8gYSBzbWFsbGVyIHZlY3RvciBvZiBsYXJnZXIgdHlwZXMgYW5kCisgIC8vLyBsb2FkaW5nIGlzIG1vcmUgZWZmaWNpZW50LCBob3dldmVyLCB0aGlzIGNhbiBiZSB1bmRvbmUgYnkgb3B0aW1pemF0aW9ucyBpbgorICAvLy8gZGFnIGNvbWJpbmVyLgorICB2aXJ0dWFsIGJvb2wgaXNMb2FkQml0Q2FzdEJlbmVmaWNpYWwoRVZUIExvYWRWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBCaXRjYXN0VlQpIGNvbnN0IHsKKyAgICAvLyBEb24ndCBkbyBpZiB3ZSBjb3VsZCBkbyBhbiBpbmRleGVkIGxvYWQgb24gdGhlIG9yaWdpbmFsIHR5cGUsIGJ1dCBub3Qgb24KKyAgICAvLyB0aGUgbmV3IG9uZS4KKyAgICBpZiAoIUxvYWRWVC5pc1NpbXBsZSgpIHx8ICFCaXRjYXN0VlQuaXNTaW1wbGUoKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgTVZUIExvYWRNVlQgPSBMb2FkVlQuZ2V0U2ltcGxlVlQoKTsKKworICAgIC8vIERvbid0IGJvdGhlciBkb2luZyB0aGlzIGlmIGl0J3MganVzdCBnb2luZyB0byBiZSBwcm9tb3RlZCBhZ2FpbiBsYXRlciwgYXMKKyAgICAvLyBkb2luZyBzbyBtaWdodCBpbnRlcmZlcmUgd2l0aCBvdGhlciBjb21iaW5lcy4KKyAgICBpZiAoZ2V0T3BlcmF0aW9uQWN0aW9uKElTRDo6TE9BRCwgTG9hZE1WVCkgPT0gUHJvbW90ZSAmJgorICAgICAgICBnZXRUeXBlVG9Qcm9tb3RlVG8oSVNEOjpMT0FELCBMb2FkTVZUKSA9PSBCaXRjYXN0VlQuZ2V0U2ltcGxlVlQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBmb2xsb3dpbmcgdHJhbnNmb3JtIGlzIGJlbmVmaWNpYWw6CisgIC8vLyAoc3RvcmUgKHkgKGNvbnYgeCkpLCB5KikpIC0+IChzdG9yZSB4LCAoeCopKQorICB2aXJ0dWFsIGJvb2wgaXNTdG9yZUJpdENhc3RCZW5lZmljaWFsKEVWVCBTdG9yZVZULCBFVlQgQml0Y2FzdFZUKSBjb25zdCB7CisgICAgLy8gRGVmYXVsdCB0byB0aGUgc2FtZSBsb2dpYyBhcyBsb2Fkcy4KKyAgICByZXR1cm4gaXNMb2FkQml0Q2FzdEJlbmVmaWNpYWwoU3RvcmVWVCwgQml0Y2FzdFZUKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBleHBlY3RlZCB0byBiZSBjaGVhcGVyIHRvIGRvIGEgc3RvcmUgb2YgYSBub24temVybworICAvLy8gdmVjdG9yIGNvbnN0YW50IHdpdGggdGhlIGdpdmVuIHNpemUgYW5kIHR5cGUgZm9yIHRoZSBhZGRyZXNzIHNwYWNlIHRoYW4gdG8KKyAgLy8vIHN0b3JlIHRoZSBpbmRpdmlkdWFsIHNjYWxhciBlbGVtZW50IGNvbnN0YW50cy4KKyAgdmlydHVhbCBib29sIHN0b3JlT2ZWZWN0b3JDb25zdGFudElzQ2hlYXAoRVZUIE1lbVZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1FbGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBZGRyU3BhY2UpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gQWxsb3cgc3RvcmUgbWVyZ2luZyBhZnRlciBsZWdhbGl6YXRpb24gaW4gYWRkaXRpb24gdG8gYmVmb3JlIGxlZ2FsaXphdGlvbi4KKyAgLy8vIFRoaXMgbWF5IGNhdGNoIHN0b3JlcyB0aGF0IGRvIG5vdCBleGlzdCBlYXJsaWVyIChlZywgc3RvcmVzIGNyZWF0ZWQgZnJvbQorICAvLy8gaW50cmluc2ljcykuCisgIHZpcnR1YWwgYm9vbCBtZXJnZVN0b3Jlc0FmdGVyTGVnYWxpemF0aW9uKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vLyBSZXR1cm5zIGlmIGl0J3MgcmVhc29uYWJsZSB0byBtZXJnZSBzdG9yZXMgdG8gTWVtVlQgc2l6ZS4KKyAgdmlydHVhbCBib29sIGNhbk1lcmdlU3RvcmVzVG8odW5zaWduZWQgQVMsIEVWVCBNZW1WVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgaXQgaXMgY2hlYXAgdG8gc3BlY3VsYXRlIGEgY2FsbCB0byBpbnRyaW5zaWMgY3R0ei4KKyAgdmlydHVhbCBib29sIGlzQ2hlYXBUb1NwZWN1bGF0ZUN0dHooKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBjaGVhcCB0byBzcGVjdWxhdGUgYSBjYWxsIHRvIGludHJpbnNpYyBjdGx6LgorICB2aXJ0dWFsIGJvb2wgaXNDaGVhcFRvU3BlY3VsYXRlQ3RseigpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIGN0bHogaW5zdHJ1Y3Rpb24gaXMgZmFzdC4KKyAgdmlydHVhbCBib29sIGlzQ3RsekZhc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGl0IGlzIHNhZmUgdG8gdHJhbnNmb3JtIGFuIGludGVnZXItZG9tYWluIGJpdHdpc2Ugb3BlcmF0aW9uCisgIC8vLyBpbnRvIHRoZSBlcXVpdmFsZW50IGZsb2F0aW5nLXBvaW50IG9wZXJhdGlvbi4gVGhpcyBzaG91bGQgYmUgc2V0IHRvIHRydWUKKyAgLy8vIGlmIHRoZSB0YXJnZXQgaGFzIElFRUUtNzU0LWNvbXBsaWFudCBmYWJzL2ZuZWcgb3BlcmF0aW9ucyBmb3IgdGhlIGlucHV0CisgIC8vLyB0eXBlLgorICB2aXJ0dWFsIGJvb2wgaGFzQml0UHJlc2VydmluZ0ZQTG9naWMoRVZUIFZUKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBjaGVhcGVyIHRvIHNwbGl0IHRoZSBzdG9yZSBvZiBhIG1lcmdlZCBpbnQgdmFsCisgIC8vLyBmcm9tIGEgcGFpciBvZiBzbWFsbGVyIHZhbHVlcyBpbnRvIG11bHRpcGxlIHN0b3Jlcy4KKyAgdmlydHVhbCBib29sIGlzTXVsdGlTdG9yZXNDaGVhcGVyVGhhbkJpdHNNZXJnZShFVlQgTFR5LCBFVlQgSFR5KSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gaWYgdGhlIHRhcmdldCBzdXBwb3J0cyBjb21iaW5pbmcgYQorICAvLy8gY2hhaW4gbGlrZToKKyAgLy8vIFxjb2RlCisgIC8vLyAgICVhbmRSZXN1bHQgPSBhbmQgJXZhbDEsICNtYXNrCisgIC8vLyAgICVpY21wUmVzdWx0ID0gaWNtcCAlYW5kUmVzdWx0LCAwCisgIC8vLyBcZW5kY29kZQorICAvLy8gaW50byBhIHNpbmdsZSBtYWNoaW5lIGluc3RydWN0aW9uIG9mIGEgZm9ybSBsaWtlOgorICAvLy8gXGNvZGUKKyAgLy8vICAgY2MgPSB0ZXN0ICVyZWdpc3RlciwgI21hc2sKKyAgLy8vIFxlbmRjb2RlCisgIHZpcnR1YWwgYm9vbCBpc01hc2tBbmRDbXAwRm9sZGluZ0JlbmVmaWNpYWwoY29uc3QgSW5zdHJ1Y3Rpb24gJkFuZEkpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gVXNlIGJpdHdpc2UgbG9naWMgdG8gbWFrZSBwYWlycyBvZiBjb21wYXJlcyBtb3JlIGVmZmljaWVudC4gRm9yIGV4YW1wbGU6CisgIC8vLyBhbmQgKHNldGVxIEEsIEIpLCAoc2V0ZXEgQywgRCkgLS0+IHNldGVxIChvciAoeG9yIEEsIEIpLCAoeG9yIEMsIEQpKSwgMAorICAvLy8gVGhpcyBzaG91bGQgYmUgdHJ1ZSB3aGVuIGl0IHRha2VzIG1vcmUgdGhhbiBvbmUgaW5zdHJ1Y3Rpb24gdG8gbG93ZXIKKyAgLy8vIHNldGNjIChjbXArc2V0IG9uIHg4NiBzY2FsYXIpLCB3aGVuIGJpdHdpc2Ugb3BzIGFyZSBmYXN0ZXIgdGhhbiBsb2dpYyBvbgorICAvLy8gY29uZGl0aW9uIGJpdHMgKGNyYW5kIG9uIFBvd2VyUEMpLCBhbmQvb3Igd2hlbiByZWR1Y2luZyBjbXArYnIgaXMgYSB3aW4uCisgIHZpcnR1YWwgYm9vbCBjb252ZXJ0U2V0Q0NMb2dpY1RvQml0d2lzZUxvZ2ljKEVWVCBWVCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHByZWZlcnJlZCBvcGVyYW5kIHR5cGUgaWYgdGhlIHRhcmdldCBoYXMgYSBxdWljayB3YXkgdG8gY29tcGFyZQorICAvLy8gaW50ZWdlciB2YWx1ZXMgb2YgdGhlIGdpdmVuIHNpemUuIEFzc3VtZSB0aGF0IGFueSBsZWdhbCBpbnRlZ2VyIHR5cGUgY2FuCisgIC8vLyBiZSBjb21wYXJlZCBlZmZpY2llbnRseS4gVGFyZ2V0cyBtYXkgb3ZlcnJpZGUgdGhpcyB0byBhbGxvdyBpbGxlZ2FsIHdpZGUKKyAgLy8vIHR5cGVzIHRvIHJldHVybiBhIHZlY3RvciB0eXBlIGlmIHRoZXJlIGlzIHN1cHBvcnQgdG8gY29tcGFyZSB0aGF0IHR5cGUuCisgIHZpcnR1YWwgTVZUIGhhc0Zhc3RFcXVhbGl0eUNvbXBhcmUodW5zaWduZWQgTnVtQml0cykgY29uc3QgeworICAgIE1WVCBWVCA9IE1WVDo6Z2V0SW50ZWdlclZUKE51bUJpdHMpOworICAgIHJldHVybiBpc1R5cGVMZWdhbChWVCkgPyBWVCA6IE1WVDo6SU5WQUxJRF9TSU1QTEVfVkFMVUVfVFlQRTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IHNob3VsZCB0cmFuc2Zvcm06CisgIC8vLyAoWCAmIFkpID09IFkgLS0tPiAoflggJiBZKSA9PSAwCisgIC8vLyAoWCAmIFkpICE9IFkgLS0tPiAoflggJiBZKSAhPSAwCisgIC8vLworICAvLy8gVGhpcyBtYXkgYmUgcHJvZml0YWJsZSBpZiB0aGUgdGFyZ2V0IGhhcyBhIGJpdHdpc2UgYW5kLW5vdCBvcGVyYXRpb24gdGhhdAorICAvLy8gc2V0cyBjb21wYXJpc29uIGZsYWdzLiBBIHRhcmdldCBtYXkgd2FudCB0byBsaW1pdCB0aGUgdHJhbnNmb3JtYXRpb24gYmFzZWQKKyAgLy8vIG9uIHRoZSB0eXBlIG9mIFkgb3IgaWYgWSBpcyBhIGNvbnN0YW50LgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGUgdHJhbnNmb3JtIHdpbGwgbm90IG9jY3VyIGlmIFkgaXMga25vd24gdG8gYmUgYSBwb3dlci1vZi0yCisgIC8vLyBiZWNhdXNlIGEgbWFzayBhbmQgY29tcGFyZSBvZiBhIHNpbmdsZSBiaXQgY2FuIGJlIGhhbmRsZWQgYnkgaW52ZXJ0aW5nIHRoZQorICAvLy8gcHJlZGljYXRlLCBmb3IgZXhhbXBsZToKKyAgLy8vIChYICYgOCkgPT0gOCAtLS0+IChYICYgOCkgIT0gMAorICB2aXJ0dWFsIGJvb2wgaGFzQW5kTm90Q29tcGFyZShTRFZhbHVlIFkpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBoYXMgYSBiaXR3aXNlIGFuZC1ub3Qgb3BlcmF0aW9uOgorICAvLy8gWCA9IH5BICYgQgorICAvLy8gVGhpcyBjYW4gYmUgdXNlZCB0byBzaW1wbGlmeSBzZWxlY3Qgb3Igb3RoZXIgaW5zdHJ1Y3Rpb25zLgorICB2aXJ0dWFsIGJvb2wgaGFzQW5kTm90KFNEVmFsdWUgWCkgY29uc3QgeworICAgIC8vIElmIHRoZSB0YXJnZXQgaGFzIHRoZSBtb3JlIGNvbXBsZXggdmVyc2lvbiBvZiB0aGlzIG9wZXJhdGlvbiwgYXNzdW1lIHRoYXQKKyAgICAvLyBpdCBoYXMgdGhpcyBvcGVyYXRpb24gdG9vLgorICAgIHJldHVybiBoYXNBbmROb3RDb21wYXJlKFgpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IHdhbnRzIHRvIHVzZSB0aGUgb3B0aW1pemF0aW9uIHRoYXQKKyAgLy8vIHR1cm5zIGV4dChwcm9tb3RhYmxlSW5zdDEoLi4uKHByb21vdGFibGVJbnN0Tihsb2FkKSkpKSBpbnRvCisgIC8vLyBwcm9tb3RlZEluc3QxKC4uLihwcm9tb3RlZEluc3ROKGV4dChsb2FkKSkpKS4KKyAgYm9vbCBlbmFibGVFeHRMZFByb21vdGlvbigpIGNvbnN0IHsgcmV0dXJuIEVuYWJsZUV4dExkUHJvbW90aW9uOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgY2FuIGNvbWJpbmUgc3RvcmUoZXh0cmFjdGVsZW1lbnQgVmVjdG9yVHksCisgIC8vLyBJZHgpLgorICAvLy8gXHAgQ29zdFtvdXRdIGdpdmVzIHRoZSBjb3N0IG9mIHRoYXQgdHJhbnNmb3JtYXRpb24gd2hlbiB0aGlzIGlzIHRydWUuCisgIHZpcnR1YWwgYm9vbCBjYW5Db21iaW5lU3RvcmVBbmRFeHRyYWN0KFR5cGUgKlZlY3RvclR5LCBWYWx1ZSAqSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmQ29zdCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0YXJnZXQgc3VwcG9ydHMgZmxvYXRpbmcgcG9pbnQgZXhjZXB0aW9ucy4KKyAgYm9vbCBoYXNGbG9hdGluZ1BvaW50RXhjZXB0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gSGFzRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGFyZ2V0IGFsd2F5cyBiZW5lZmljaWF0ZXMgZnJvbSBjb21iaW5pbmcgaW50byBGTUEgZm9yIGEKKyAgLy8vIGdpdmVuIHZhbHVlIHR5cGUuIFRoaXMgbXVzdCB0eXBpY2FsbHkgcmV0dXJuIGZhbHNlIG9uIHRhcmdldHMgd2hlcmUgRk1BCisgIC8vLyB0YWtlcyBtb3JlIGN5Y2xlcyB0byBleGVjdXRlIHRoYW4gRkFERC4KKyAgdmlydHVhbCBib29sIGVuYWJsZUFnZ3Jlc3NpdmVGTUFGdXNpb24oRVZUIFZUKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgVmFsdWVUeXBlIG9mIHRoZSByZXN1bHQgb2YgU0VUQ0Mgb3BlcmF0aW9ucy4KKyAgdmlydHVhbCBFVlQgZ2V0U2V0Q0NSZXN1bHRUeXBlKGNvbnN0IERhdGFMYXlvdXQgJkRMLCBMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgVmFsdWVUeXBlIGZvciBjb21wYXJpc29uIGxpYmNhbGxzLiBDb21wYXJpb25zIGxpYmNhbGxzIGluY2x1ZGUKKyAgLy8vIGZsb2F0aW5nIHBvaW50IGNvbXBhcmlvbiBjYWxscywgYW5kIE9yZGVyZWQvVW5vcmRlcmVkIGNoZWNrIGNhbGxzIG9uCisgIC8vLyBmbG9hdGluZyBwb2ludCBudW1iZXJzLgorICB2aXJ0dWFsCisgIE1WVDo6U2ltcGxlVmFsdWVUeXBlIGdldENtcExpYmNhbGxSZXR1cm5UeXBlKCkgY29uc3Q7CisKKyAgLy8vIEZvciB0YXJnZXRzIHdpdGhvdXQgaTEgcmVnaXN0ZXJzLCB0aGlzIGdpdmVzIHRoZSBuYXR1cmUgb2YgdGhlIGhpZ2gtYml0cworICAvLy8gb2YgYm9vbGVhbiB2YWx1ZXMgaGVsZCBpbiB0eXBlcyB3aWRlciB0aGFuIGkxLgorICAvLy8KKyAgLy8vICJCb29sZWFuIHZhbHVlcyIgYXJlIHNwZWNpYWwgdHJ1ZS9mYWxzZSB2YWx1ZXMgcHJvZHVjZWQgYnkgbm9kZXMgbGlrZQorICAvLy8gU0VUQ0MgYW5kIGNvbnN1bWVkIChhcyB0aGUgY29uZGl0aW9uKSBieSBub2RlcyBsaWtlIFNFTEVDVCBhbmQgQlJDT05ELgorICAvLy8gTm90IHRvIGJlIGNvbmZ1c2VkIHdpdGggZ2VuZXJhbCB2YWx1ZXMgcHJvbW90ZWQgZnJvbSBpMS4gIFNvbWUgY3B1cworICAvLy8gZGlzdGluZ3Vpc2ggYmV0d2VlbiB2ZWN0b3JzIG9mIGJvb2xlYW4gYW5kIHNjYWxhcnM7IHRoZSBpc1ZlYyBwYXJhbWV0ZXIKKyAgLy8vIHNlbGVjdHMgYmV0d2VlbiB0aGUgdHdvIGtpbmRzLiAgRm9yIGV4YW1wbGUgb24gWDg2IGEgc2NhbGFyIGJvb2xlYW4gc2hvdWxkCisgIC8vLyBiZSB6ZXJvIGV4dGVuZGVkIGZyb20gaTEsIHdoaWxlIHRoZSBlbGVtZW50cyBvZiBhIHZlY3RvciBvZiBib29sZWFucworICAvLy8gc2hvdWxkIGJlIHNpZ24gZXh0ZW5kZWQgZnJvbSBpMS4KKyAgLy8vCisgIC8vLyBTb21lIGNwdXMgYWxzbyB0cmVhdCBmbG9hdGluZyBwb2ludCB0eXBlcyB0aGUgc2FtZSB3YXkgYXMgdGhleSB0cmVhdAorICAvLy8gdmVjdG9ycyBpbnN0ZWFkIG9mIHRoZSB3YXkgdGhleSB0cmVhdCBzY2FsYXJzLgorICBCb29sZWFuQ29udGVudCBnZXRCb29sZWFuQ29udGVudHMoYm9vbCBpc1ZlYywgYm9vbCBpc0Zsb2F0KSBjb25zdCB7CisgICAgaWYgKGlzVmVjKQorICAgICAgcmV0dXJuIEJvb2xlYW5WZWN0b3JDb250ZW50czsKKyAgICByZXR1cm4gaXNGbG9hdCA/IEJvb2xlYW5GbG9hdENvbnRlbnRzIDogQm9vbGVhbkNvbnRlbnRzOworICB9CisKKyAgQm9vbGVhbkNvbnRlbnQgZ2V0Qm9vbGVhbkNvbnRlbnRzKEVWVCBUeXBlKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEJvb2xlYW5Db250ZW50cyhUeXBlLmlzVmVjdG9yKCksIFR5cGUuaXNGbG9hdGluZ1BvaW50KCkpOworICB9CisKKyAgLy8vIFJldHVybiB0YXJnZXQgc2NoZWR1bGluZyBwcmVmZXJlbmNlLgorICBTY2hlZDo6UHJlZmVyZW5jZSBnZXRTY2hlZHVsaW5nUHJlZmVyZW5jZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU2NoZWRQcmVmZXJlbmNlSW5mbzsKKyAgfQorCisgIC8vLyBTb21lIHNjaGVkdWxlciwgZS5nLiBoeWJyaWQsIGNhbiBzd2l0Y2ggdG8gZGlmZmVyZW50IHNjaGVkdWxpbmcgaGV1cmlzdGljcworICAvLy8gZm9yIGRpZmZlcmVudCBub2Rlcy4gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBwcmVmZXJlbmNlIChvciBub25lKSBmb3IKKyAgLy8vIHRoZSBnaXZlbiBub2RlLgorICB2aXJ0dWFsIFNjaGVkOjpQcmVmZXJlbmNlIGdldFNjaGVkdWxpbmdQcmVmZXJlbmNlKFNETm9kZSAqKSBjb25zdCB7CisgICAgcmV0dXJuIFNjaGVkOjpOb25lOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgcmVnaXN0ZXIgY2xhc3MgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZQorICAvLy8gdHlwZS4KKyAgdmlydHVhbCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpnZXRSZWdDbGFzc0ZvcihNVlQgVlQpIGNvbnN0IHsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQyA9IFJlZ0NsYXNzRm9yVlRbVlQuU2ltcGxlVHldOworICAgIGFzc2VydChSQyAmJiAiVGhpcyB2YWx1ZSB0eXBlIGlzIG5vdCBuYXRpdmVseSBzdXBwb3J0ZWQhIik7CisgICAgcmV0dXJuIFJDOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgJ3JlcHJlc2VudGF0aXZlJyByZWdpc3RlciBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCB2YWx1ZQorICAvLy8gdHlwZS4KKyAgLy8vCisgIC8vLyBUaGUgJ3JlcHJlc2VudGF0aXZlJyByZWdpc3RlciBjbGFzcyBpcyB0aGUgbGFyZ2VzdCBsZWdhbCBzdXBlci1yZWcKKyAgLy8vIHJlZ2lzdGVyIGNsYXNzIGZvciB0aGUgcmVnaXN0ZXIgY2xhc3Mgb2YgdGhlIHZhbHVlIHR5cGUuICBGb3IgZXhhbXBsZSwgb24KKyAgLy8vIGkzODYgdGhlIHJlcCByZWdpc3RlciBjbGFzcyBmb3IgaTgsIGkxNiwgYW5kIGkzMiBhcmUgR1IzMjsgd2hpbGUgdGhlIHJlcAorICAvLy8gcmVnaXN0ZXIgY2xhc3MgaXMgR1I2NCBvbiB4ODZfNjQuCisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqZ2V0UmVwUmVnQ2xhc3NGb3IoTVZUIFZUKSBjb25zdCB7CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBSZXBSZWdDbGFzc0ZvclZUW1ZULlNpbXBsZVR5XTsKKyAgICByZXR1cm4gUkM7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBjb3N0IG9mIHRoZSAncmVwcmVzZW50YXRpdmUnIHJlZ2lzdGVyIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkCisgIC8vLyB2YWx1ZSB0eXBlLgorICB2aXJ0dWFsIHVpbnQ4X3QgZ2V0UmVwUmVnQ2xhc3NDb3N0Rm9yKE1WVCBWVCkgY29uc3QgeworICAgIHJldHVybiBSZXBSZWdDbGFzc0Nvc3RGb3JWVFtWVC5TaW1wbGVUeV07CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBoYXMgbmF0aXZlIHN1cHBvcnQgZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgdHlwZS4KKyAgLy8vIFRoaXMgbWVhbnMgdGhhdCBpdCBoYXMgYSByZWdpc3RlciB0aGF0IGRpcmVjdGx5IGhvbGRzIGl0IHdpdGhvdXQKKyAgLy8vIHByb21vdGlvbnMgb3IgZXhwYW5zaW9ucy4KKyAgYm9vbCBpc1R5cGVMZWdhbChFVlQgVlQpIGNvbnN0IHsKKyAgICBhc3NlcnQoIVZULmlzU2ltcGxlKCkgfHwKKyAgICAgICAgICAgKHVuc2lnbmVkKVZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHkgPCBhcnJheV9sZW5ndGhvZihSZWdDbGFzc0ZvclZUKSk7CisgICAgcmV0dXJuIFZULmlzU2ltcGxlKCkgJiYgUmVnQ2xhc3NGb3JWVFtWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5XSAhPSBudWxscHRyOworICB9CisKKyAgY2xhc3MgVmFsdWVUeXBlQWN0aW9uSW1wbCB7CisgICAgLy8vIFZhbHVlVHlwZUFjdGlvbnMgLSBGb3IgZWFjaCB2YWx1ZSB0eXBlLCBrZWVwIGEgTGVnYWxpemVUeXBlQWN0aW9uIGVudW0KKyAgICAvLy8gdGhhdCBpbmRpY2F0ZXMgaG93IGluc3RydWN0aW9uIHNlbGVjdGlvbiBzaG91bGQgZGVhbCB3aXRoIHRoZSB0eXBlLgorICAgIExlZ2FsaXplVHlwZUFjdGlvbiBWYWx1ZVR5cGVBY3Rpb25zW01WVDo6TEFTVF9WQUxVRVRZUEVdOworCisgIHB1YmxpYzoKKyAgICBWYWx1ZVR5cGVBY3Rpb25JbXBsKCkgeworICAgICAgc3RkOjpmaWxsKHN0ZDo6YmVnaW4oVmFsdWVUeXBlQWN0aW9ucyksIHN0ZDo6ZW5kKFZhbHVlVHlwZUFjdGlvbnMpLAorICAgICAgICAgICAgICAgIFR5cGVMZWdhbCk7CisgICAgfQorCisgICAgTGVnYWxpemVUeXBlQWN0aW9uIGdldFR5cGVBY3Rpb24oTVZUIFZUKSBjb25zdCB7CisgICAgICByZXR1cm4gVmFsdWVUeXBlQWN0aW9uc1tWVC5TaW1wbGVUeV07CisgICAgfQorCisgICAgdm9pZCBzZXRUeXBlQWN0aW9uKE1WVCBWVCwgTGVnYWxpemVUeXBlQWN0aW9uIEFjdGlvbikgeworICAgICAgVmFsdWVUeXBlQWN0aW9uc1tWVC5TaW1wbGVUeV0gPSBBY3Rpb247CisgICAgfQorICB9OworCisgIGNvbnN0IFZhbHVlVHlwZUFjdGlvbkltcGwgJmdldFZhbHVlVHlwZUFjdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlVHlwZUFjdGlvbnM7CisgIH0KKworICAvLy8gUmV0dXJuIGhvdyB3ZSBzaG91bGQgbGVnYWxpemUgdmFsdWVzIG9mIHRoaXMgdHlwZSwgZWl0aGVyIGl0IGlzIGFscmVhZHkKKyAgLy8vIGxlZ2FsIChyZXR1cm4gJ0xlZ2FsJykgb3Igd2UgbmVlZCB0byBwcm9tb3RlIGl0IHRvIGEgbGFyZ2VyIHR5cGUgKHJldHVybgorICAvLy8gJ1Byb21vdGUnKSwgb3Igd2UgbmVlZCB0byBleHBhbmQgaXQgaW50byBtdWx0aXBsZSByZWdpc3RlcnMgb2Ygc21hbGxlcgorICAvLy8gaW50ZWdlciB0eXBlIChyZXR1cm4gJ0V4cGFuZCcpLiAgJ0N1c3RvbScgaXMgbm90IGFuIG9wdGlvbi4KKyAgTGVnYWxpemVUeXBlQWN0aW9uIGdldFR5cGVBY3Rpb24oTExWTUNvbnRleHQgJkNvbnRleHQsIEVWVCBWVCkgY29uc3QgeworICAgIHJldHVybiBnZXRUeXBlQ29udmVyc2lvbihDb250ZXh0LCBWVCkuZmlyc3Q7CisgIH0KKyAgTGVnYWxpemVUeXBlQWN0aW9uIGdldFR5cGVBY3Rpb24oTVZUIFZUKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlVHlwZUFjdGlvbnMuZ2V0VHlwZUFjdGlvbihWVCk7CisgIH0KKworICAvLy8gRm9yIHR5cGVzIHN1cHBvcnRlZCBieSB0aGUgdGFyZ2V0LCB0aGlzIGlzIGFuIGlkZW50aXR5IGZ1bmN0aW9uLiAgRm9yCisgIC8vLyB0eXBlcyB0aGF0IG11c3QgYmUgcHJvbW90ZWQgdG8gbGFyZ2VyIHR5cGVzLCB0aGlzIHJldHVybnMgdGhlIGxhcmdlciB0eXBlCisgIC8vLyB0byBwcm9tb3RlIHRvLiAgRm9yIGludGVnZXIgdHlwZXMgdGhhdCBhcmUgbGFyZ2VyIHRoYW4gdGhlIGxhcmdlc3QgaW50ZWdlcgorICAvLy8gcmVnaXN0ZXIsIHRoaXMgY29udGFpbnMgb25lIHN0ZXAgaW4gdGhlIGV4cGFuc2lvbiB0byBnZXQgdG8gdGhlIHNtYWxsZXIKKyAgLy8vIHJlZ2lzdGVyLiBGb3IgaWxsZWdhbCBmbG9hdGluZyBwb2ludCB0eXBlcywgdGhpcyByZXR1cm5zIHRoZSBpbnRlZ2VyIHR5cGUKKyAgLy8vIHRvIHRyYW5zZm9ybSB0by4KKyAgRVZUIGdldFR5cGVUb1RyYW5zZm9ybVRvKExMVk1Db250ZXh0ICZDb250ZXh0LCBFVlQgVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VHlwZUNvbnZlcnNpb24oQ29udGV4dCwgVlQpLnNlY29uZDsKKyAgfQorCisgIC8vLyBGb3IgdHlwZXMgc3VwcG9ydGVkIGJ5IHRoZSB0YXJnZXQsIHRoaXMgaXMgYW4gaWRlbnRpdHkgZnVuY3Rpb24uICBGb3IKKyAgLy8vIHR5cGVzIHRoYXQgbXVzdCBiZSBleHBhbmRlZCAoaS5lLiBpbnRlZ2VyIHR5cGVzIHRoYXQgYXJlIGxhcmdlciB0aGFuIHRoZQorICAvLy8gbGFyZ2VzdCBpbnRlZ2VyIHJlZ2lzdGVyIG9yIGlsbGVnYWwgZmxvYXRpbmcgcG9pbnQgdHlwZXMpLCB0aGlzIHJldHVybnMKKyAgLy8vIHRoZSBsYXJnZXN0IGxlZ2FsIHR5cGUgaXQgd2lsbCBiZSBleHBhbmRlZCB0by4KKyAgRVZUIGdldFR5cGVUb0V4cGFuZFRvKExMVk1Db250ZXh0ICZDb250ZXh0LCBFVlQgVlQpIGNvbnN0IHsKKyAgICBhc3NlcnQoIVZULmlzVmVjdG9yKCkpOworICAgIHdoaWxlICh0cnVlKSB7CisgICAgICBzd2l0Y2ggKGdldFR5cGVBY3Rpb24oQ29udGV4dCwgVlQpKSB7CisgICAgICBjYXNlIFR5cGVMZWdhbDoKKyAgICAgICAgcmV0dXJuIFZUOworICAgICAgY2FzZSBUeXBlRXhwYW5kSW50ZWdlcjoKKyAgICAgICAgVlQgPSBnZXRUeXBlVG9UcmFuc2Zvcm1UbyhDb250ZXh0LCBWVCk7CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVHlwZSBpcyBub3QgbGVnYWwgbm9yIGlzIGl0IHRvIGJlIGV4cGFuZGVkISIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vLyBWZWN0b3IgdHlwZXMgYXJlIGJyb2tlbiBkb3duIGludG8gc29tZSBudW1iZXIgb2YgbGVnYWwgZmlyc3QgY2xhc3MgdHlwZXMuCisgIC8vLyBGb3IgZXhhbXBsZSwgRVZUOjp2OGYzMiBtYXBzIHRvIDIgRVZUOjp2NGYzMiB3aXRoIEFsdGl2ZWMgb3IgU1NFMSwgb3IgOAorICAvLy8gcHJvbW90ZWQgRVZUOjpmNjQgdmFsdWVzIHdpdGggdGhlIFg4NiBGUCBzdGFjay4gIFNpbWlsYXJseSwgRVZUOjp2Mmk2NAorICAvLy8gdHVybnMgaW50byA0IEVWVDo6aTMyIHZhbHVlcyB3aXRoIGJvdGggUFBDIGFuZCBYODYuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBuZWVkZWQsIGFuZCB0aGUgVlQgZm9yIGVhY2gKKyAgLy8vIHJlZ2lzdGVyLiAgSXQgYWxzbyByZXR1cm5zIHRoZSBWVCBhbmQgcXVhbnRpdHkgb2YgdGhlIGludGVybWVkaWF0ZSB2YWx1ZXMKKyAgLy8vIGJlZm9yZSB0aGV5IGFyZSBwcm9tb3RlZC9leHBhbmRlZC4KKyAgdW5zaWduZWQgZ2V0VmVjdG9yVHlwZUJyZWFrZG93bihMTFZNQ29udGV4dCAmQ29udGV4dCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCAmSW50ZXJtZWRpYXRlVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJk51bUludGVybWVkaWF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVZUICZSZWdpc3RlclZUKSBjb25zdDsKKworICAvLy8gQ2VydGFpbiB0YXJnZXRzIHN1Y2ggYXMgTUlQUyByZXF1aXJlIHRoYXQgc29tZSB0eXBlcyBzdWNoIGFzIHZlY3RvcnMgYXJlCisgIC8vLyBhbHdheXMgYnJva2VuIGRvd24gaW50byBzY2FsYXJzIGluIHNvbWUgY29udGV4dHMuIFRoaXMgb2NjdXJzIGV2ZW4gaWYgdGhlCisgIC8vLyB2ZWN0b3IgdHlwZSBpcyBsZWdhbC4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRWZWN0b3JUeXBlQnJlYWtkb3duRm9yQ2FsbGluZ0NvbnYoCisgICAgICBMTFZNQ29udGV4dCAmQ29udGV4dCwgRVZUIFZULCBFVlQgJkludGVybWVkaWF0ZVZULAorICAgICAgdW5zaWduZWQgJk51bUludGVybWVkaWF0ZXMsIE1WVCAmUmVnaXN0ZXJWVCkgY29uc3QgeworICAgIHJldHVybiBnZXRWZWN0b3JUeXBlQnJlYWtkb3duKENvbnRleHQsIFZULCBJbnRlcm1lZGlhdGVWVCwgTnVtSW50ZXJtZWRpYXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWdpc3RlclZUKTsKKyAgfQorCisgIHN0cnVjdCBJbnRyaW5zaWNJbmZvIHsKKyAgICB1bnNpZ25lZCAgICAgb3BjID0gMDsgICAgICAgICAgLy8gdGFyZ2V0IG9wY29kZQorICAgIEVWVCAgICAgICAgICBtZW1WVDsgICAgICAgICAgICAvLyBtZW1vcnkgVlQKKworICAgIC8vIHZhbHVlIHJlcHJlc2VudGluZyBtZW1vcnkgbG9jYXRpb24KKyAgICBQb2ludGVyVW5pb248Y29uc3QgVmFsdWUgKiwgY29uc3QgUHNldWRvU291cmNlVmFsdWUgKj4gcHRyVmFsOworCisgICAgaW50ICAgICAgICAgIG9mZnNldCA9IDA7ICAgICAgIC8vIG9mZnNldCBvZmYgb2YgcHRyVmFsCisgICAgdW5zaWduZWQgICAgIHNpemUgPSAwOyAgICAgICAgIC8vIHRoZSBzaXplIG9mIHRoZSBtZW1vcnkgbG9jYXRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKHRha2VuIGZyb20gbWVtVlQgaWYgemVybykKKyAgICB1bnNpZ25lZCAgICAgYWxpZ24gPSAxOyAgICAgICAgLy8gYWxpZ25tZW50CisKKyAgICBNYWNoaW5lTWVtT3BlcmFuZDo6RmxhZ3MgZmxhZ3MgPSBNYWNoaW5lTWVtT3BlcmFuZDo6TU9Ob25lOworICAgIEludHJpbnNpY0luZm8oKSA9IGRlZmF1bHQ7CisgIH07CisKKyAgLy8vIEdpdmVuIGFuIGludHJpbnNpYywgY2hlY2tzIGlmIG9uIHRoZSB0YXJnZXQgdGhlIGludHJpbnNpYyB3aWxsIG5lZWQgdG8gbWFwCisgIC8vLyB0byBhIE1lbUludHJpbnNpY05vZGUgKHRvdWNoZXMgbWVtb3J5KS4gSWYgdGhpcyBpcyB0aGUgY2FzZSwgaXQgcmV0dXJucworICAvLy8gdHJ1ZSBhbmQgc3RvcmUgdGhlIGludHJpbnNpYyBpbmZvcm1hdGlvbiBpbnRvIHRoZSBJbnRyaW5zaWNJbmZvIHRoYXQgd2FzCisgIC8vLyBwYXNzZWQgdG8gdGhlIGZ1bmN0aW9uLgorICB2aXJ0dWFsIGJvb2wgZ2V0VGd0TWVtSW50cmluc2ljKEludHJpbnNpY0luZm8gJiwgY29uc3QgQ2FsbEluc3QgJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lRnVuY3Rpb24gJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAvKkludHJpbnNpYyovKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGFyZ2V0IGNhbiBpbnN0cnVjdGlvbiBzZWxlY3QgdGhlIHNwZWNpZmllZCBGUAorICAvLy8gaW1tZWRpYXRlIG5hdGl2ZWx5LiBJZiBmYWxzZSwgdGhlIGxlZ2FsaXplciB3aWxsIG1hdGVyaWFsaXplIHRoZSBGUAorICAvLy8gaW1tZWRpYXRlIGFzIGEgbG9hZCBmcm9tIGEgY29uc3RhbnQgcG9vbC4KKyAgdmlydHVhbCBib29sIGlzRlBJbW1MZWdhbChjb25zdCBBUEZsb2F0ICYvKkltbSovLCBFVlQgLypWVCovKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFRhcmdldHMgY2FuIHVzZSB0aGlzIHRvIGluZGljYXRlIHRoYXQgdGhleSBvbmx5IHN1cHBvcnQgKnNvbWUqCisgIC8vLyBWRUNUT1JfU0hVRkZMRSBvcGVyYXRpb25zLCB0aG9zZSB3aXRoIHNwZWNpZmljIG1hc2tzLiAgQnkgZGVmYXVsdCwgaWYgYQorICAvLy8gdGFyZ2V0IHN1cHBvcnRzIHRoZSBWRUNUT1JfU0hVRkZMRSBub2RlLCBhbGwgbWFzayB2YWx1ZXMgYXJlIGFzc3VtZWQgdG8gYmUKKyAgLy8vIGxlZ2FsLgorICB2aXJ0dWFsIGJvb2wgaXNTaHVmZmxlTWFza0xlZ2FsKEFycmF5UmVmPGludD4gLypNYXNrKi8sIEVWVCAvKlZUKi8pIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIG9wZXJhdGlvbiBjYW4gdHJhcCBmb3IgdGhlIHZhbHVlIHR5cGUuCisgIC8vLworICAvLy8gVlQgbXVzdCBiZSBhIGxlZ2FsIHR5cGUuIEJ5IGRlZmF1bHQsIHdlIG9wdGltaXN0aWNhbGx5IGFzc3VtZSBtb3N0CisgIC8vLyBvcGVyYXRpb25zIGRvbid0IHRyYXAgZXhjZXB0IGZvciBpbnRlZ2VyIGRpdmlkZSBhbmQgcmVtYWluZGVyLgorICB2aXJ0dWFsIGJvb2wgY2FuT3BUcmFwKHVuc2lnbmVkIE9wLCBFVlQgVlQpIGNvbnN0OworCisgIC8vLyBTaW1pbGFyIHRvIGlzU2h1ZmZsZU1hc2tMZWdhbC4gVGhpcyBpcyB1c2VkIGJ5IFRhcmdldHMgY2FuIHVzZSB0aGlzIHRvCisgIC8vLyBpbmRpY2F0ZSBpZiB0aGVyZSBpcyBhIHN1aXRhYmxlIFZFQ1RPUl9TSFVGRkxFIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVwbGFjZQorICAvLy8gYSBWQU5EIHdpdGggYSBjb25zdGFudCBwb29sIGVudHJ5LgorICB2aXJ0dWFsIGJvb2wgaXNWZWN0b3JDbGVhck1hc2tMZWdhbChjb25zdCBTbWFsbFZlY3RvckltcGw8aW50PiAmLypNYXNrKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCAvKlZUKi8pIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJuIGhvdyB0aGlzIG9wZXJhdGlvbiBzaG91bGQgYmUgdHJlYXRlZDogZWl0aGVyIGl0IGlzIGxlZ2FsLCBuZWVkcyB0bworICAvLy8gYmUgcHJvbW90ZWQgdG8gYSBsYXJnZXIgc2l6ZSwgbmVlZHMgdG8gYmUgZXhwYW5kZWQgdG8gc29tZSBvdGhlciBjb2RlCisgIC8vLyBzZXF1ZW5jZSwgb3IgdGhlIHRhcmdldCBoYXMgYSBjdXN0b20gZXhwYW5kZXIgZm9yIGl0LgorICBMZWdhbGl6ZUFjdGlvbiBnZXRPcGVyYXRpb25BY3Rpb24odW5zaWduZWQgT3AsIEVWVCBWVCkgY29uc3QgeworICAgIGlmIChWVC5pc0V4dGVuZGVkKCkpIHJldHVybiBFeHBhbmQ7CisgICAgLy8gSWYgYSB0YXJnZXQtc3BlY2lmaWMgU0ROb2RlIHJlcXVpcmVzIGxlZ2FsaXphdGlvbiwgcmVxdWlyZSB0aGUgdGFyZ2V0CisgICAgLy8gdG8gcHJvdmlkZSBjdXN0b20gbGVnYWxpemF0aW9uIGZvciBpdC4KKyAgICBpZiAoT3AgPj0gYXJyYXlfbGVuZ3Rob2YoT3BBY3Rpb25zWzBdKSkgcmV0dXJuIEN1c3RvbTsKKyAgICByZXR1cm4gT3BBY3Rpb25zWyh1bnNpZ25lZClWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5XVtPcF07CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gaXMgbGVnYWwgb24gdGhpcyB0YXJnZXQgb3IgY2FuIGJlCisgIC8vLyBtYWRlIGxlZ2FsIHdpdGggY3VzdG9tIGxvd2VyaW5nLiBUaGlzIGlzIHVzZWQgdG8gaGVscCBndWlkZSBoaWdoLWxldmVsCisgIC8vLyBsb3dlcmluZyBkZWNpc2lvbnMuCisgIGJvb2wgaXNPcGVyYXRpb25MZWdhbE9yQ3VzdG9tKHVuc2lnbmVkIE9wLCBFVlQgVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gKFZUID09IE1WVDo6T3RoZXIgfHwgaXNUeXBlTGVnYWwoVlQpKSAmJgorICAgICAgKGdldE9wZXJhdGlvbkFjdGlvbihPcCwgVlQpID09IExlZ2FsIHx8CisgICAgICAgZ2V0T3BlcmF0aW9uQWN0aW9uKE9wLCBWVCkgPT0gQ3VzdG9tKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiBpcyBsZWdhbCBvbiB0aGlzIHRhcmdldCBvciBjYW4gYmUKKyAgLy8vIG1hZGUgbGVnYWwgdXNpbmcgcHJvbW90aW9uLiBUaGlzIGlzIHVzZWQgdG8gaGVscCBndWlkZSBoaWdoLWxldmVsIGxvd2VyaW5nCisgIC8vLyBkZWNpc2lvbnMuCisgIGJvb2wgaXNPcGVyYXRpb25MZWdhbE9yUHJvbW90ZSh1bnNpZ25lZCBPcCwgRVZUIFZUKSBjb25zdCB7CisgICAgcmV0dXJuIChWVCA9PSBNVlQ6Ok90aGVyIHx8IGlzVHlwZUxlZ2FsKFZUKSkgJiYKKyAgICAgIChnZXRPcGVyYXRpb25BY3Rpb24oT3AsIFZUKSA9PSBMZWdhbCB8fAorICAgICAgIGdldE9wZXJhdGlvbkFjdGlvbihPcCwgVlQpID09IFByb21vdGUpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIGlzIGxlZ2FsIG9uIHRoaXMgdGFyZ2V0IG9yIGNhbiBiZQorICAvLy8gbWFkZSBsZWdhbCB3aXRoIGN1c3RvbSBsb3dlcmluZyBvciB1c2luZyBwcm9tb3Rpb24uIFRoaXMgaXMgdXNlZCB0byBoZWxwCisgIC8vLyBndWlkZSBoaWdoLWxldmVsIGxvd2VyaW5nIGRlY2lzaW9ucy4KKyAgYm9vbCBpc09wZXJhdGlvbkxlZ2FsT3JDdXN0b21PclByb21vdGUodW5zaWduZWQgT3AsIEVWVCBWVCkgY29uc3QgeworICAgIHJldHVybiAoVlQgPT0gTVZUOjpPdGhlciB8fCBpc1R5cGVMZWdhbChWVCkpICYmCisgICAgICAoZ2V0T3BlcmF0aW9uQWN0aW9uKE9wLCBWVCkgPT0gTGVnYWwgfHwKKyAgICAgICBnZXRPcGVyYXRpb25BY3Rpb24oT3AsIFZUKSA9PSBDdXN0b20gfHwKKyAgICAgICBnZXRPcGVyYXRpb25BY3Rpb24oT3AsIFZUKSA9PSBQcm9tb3RlKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgb3BlcmF0aW9uIHVzZXMgY3VzdG9tIGxvd2VyaW5nLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIKKyAgLy8vIHRoZSB0eXBlIGlzIGxlZ2FsIG9yIG5vdC4KKyAgYm9vbCBpc09wZXJhdGlvbkN1c3RvbSh1bnNpZ25lZCBPcCwgRVZUIFZUKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wZXJhdGlvbkFjdGlvbihPcCwgVlQpID09IEN1c3RvbTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBsb3dlcmluZyB0byBhIGp1bXAgdGFibGUgaXMgYWxsb3dlZC4KKyAgdmlydHVhbCBib29sIGFyZUpUc0FsbG93ZWQoY29uc3QgRnVuY3Rpb24gKkZuKSBjb25zdCB7CisgICAgaWYgKEZuLT5nZXRGbkF0dHJpYnV0ZSgibm8tanVtcC10YWJsZXMiKS5nZXRWYWx1ZUFzU3RyaW5nKCkgPT0gInRydWUiKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIGlzT3BlcmF0aW9uTGVnYWxPckN1c3RvbShJU0Q6OkJSX0pULCBNVlQ6Ok90aGVyKSB8fAorICAgICAgICAgICBpc09wZXJhdGlvbkxlZ2FsT3JDdXN0b20oSVNEOjpCUklORCwgTVZUOjpPdGhlcik7CisgIH0KKworICAvLy8gQ2hlY2sgd2hldGhlciB0aGUgcmFuZ2UgW0xvdyxIaWdoXSBmaXRzIGluIGEgbWFjaGluZSB3b3JkLgorICBib29sIHJhbmdlRml0c0luV29yZChjb25zdCBBUEludCAmTG93LCBjb25zdCBBUEludCAmSGlnaCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwpIGNvbnN0IHsKKyAgICAvLyBGSVhNRTogVXNpbmcgdGhlIHBvaW50ZXIgdHlwZSBkb2Vzbid0IHNlZW0gaWRlYWwuCisgICAgdWludDY0X3QgQlcgPSBETC5nZXRJbmRleFNpemVJbkJpdHMoMHUpOworICAgIHVpbnQ2NF90IFJhbmdlID0gKEhpZ2ggLSBMb3cpLmdldExpbWl0ZWRWYWx1ZShVSU5UNjRfTUFYIC0gMSkgKyAxOworICAgIHJldHVybiBSYW5nZSA8PSBCVzsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBsb3dlcmluZyB0byBhIGp1bXAgdGFibGUgaXMgc3VpdGFibGUgZm9yIGEgc2V0IG9mIGNhc2UKKyAgLy8vIGNsdXN0ZXJzIHdoaWNoIG1heSBjb250YWluIFxwIE51bUNhc2VzIGNhc2VzLCBccCBSYW5nZSByYW5nZSBvZiB2YWx1ZXMuCisgIC8vLyBGSVhNRTogVGhpcyBmdW5jdGlvbiBjaGVjayB0aGUgbWF4aW11bSB0YWJsZSBzaXplIGFuZCBkZW5zaXR5LCBidXQgdGhlCisgIC8vLyBtaW5pbXVtIHNpemUgaXMgbm90IGNoZWNrZWQuIEl0IHdvdWxkIGJlIG5pY2UgaWYgdGhlIG1pbmltdW0gc2l6ZSBpcworICAvLy8gYWxzbyBjb21iaW5lZCB3aXRoaW4gdGhpcyBmdW5jdGlvbi4gQ3VycmVudGx5LCB0aGUgbWluaW11bSBzaXplIGNoZWNrIGlzCisgIC8vLyBwZXJmb3JtZWQgaW4gZmluZEp1bXBUYWJsZSgpIGluIFNlbGVjdGlvbkRBR0J1aWxlciBhbmQKKyAgLy8vIGdldEVzdGltYXRlZE51bWJlck9mQ2FzZUNsdXN0ZXJzKCkgaW4gQmFzaWNUVElJbXBsLgorICB2aXJ0dWFsIGJvb2wgaXNTdWl0YWJsZUZvckp1bXBUYWJsZShjb25zdCBTd2l0Y2hJbnN0ICpTSSwgdWludDY0X3QgTnVtQ2FzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFJhbmdlKSBjb25zdCB7CisgICAgY29uc3QgYm9vbCBPcHRGb3JTaXplID0gU0ktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKS0+b3B0Rm9yU2l6ZSgpOworICAgIGNvbnN0IHVuc2lnbmVkIE1pbkRlbnNpdHkgPSBnZXRNaW5pbXVtSnVtcFRhYmxlRGVuc2l0eShPcHRGb3JTaXplKTsKKyAgICBjb25zdCB1bnNpZ25lZCBNYXhKdW1wVGFibGVTaXplID0KKyAgICAgICAgT3B0Rm9yU2l6ZSB8fCBnZXRNYXhpbXVtSnVtcFRhYmxlU2l6ZSgpID09IDAKKyAgICAgICAgICAgID8gVUlOVF9NQVgKKyAgICAgICAgICAgIDogZ2V0TWF4aW11bUp1bXBUYWJsZVNpemUoKTsKKyAgICAvLyBDaGVjayB3aGV0aGVyIGEgcmFuZ2Ugb2YgY2x1c3RlcnMgaXMgZGVuc2UgZW5vdWdoIGZvciBhIGp1bXAgdGFibGUuCisgICAgaWYgKFJhbmdlIDw9IE1heEp1bXBUYWJsZVNpemUgJiYKKyAgICAgICAgKE51bUNhc2VzICogMTAwID49IFJhbmdlICogTWluRGVuc2l0eSkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgbG93ZXJpbmcgdG8gYSBiaXQgdGVzdCBpcyBzdWl0YWJsZSBmb3IgYSBzZXQgb2YgY2FzZQorICAvLy8gY2x1c3RlcnMgd2hpY2ggY29udGFpbnMgXHAgTnVtRGVzdHMgdW5pcXVlIGRlc3RpbmF0aW9ucywgXHAgTG93IGFuZAorICAvLy8gXHAgSGlnaCBhcyBpdHMgbG93ZXN0IGFuZCBoaWdoZXN0IGNhc2UgdmFsdWVzLCBhbmQgZXhwZWN0cyBccCBOdW1DbXBzCisgIC8vLyBjYXNlIHZhbHVlIGNvbXBhcmlzb25zLiBDaGVjayBpZiB0aGUgbnVtYmVyIG9mIGRlc3RpbmF0aW9ucywgY29tcGFyaXNvbgorICAvLy8gbWV0cmljLCBhbmQgcmFuZ2UgYXJlIGFsbCBzdWl0YWJsZS4KKyAgYm9vbCBpc1N1aXRhYmxlRm9yQml0VGVzdHModW5zaWduZWQgTnVtRGVzdHMsIHVuc2lnbmVkIE51bUNtcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFQSW50ICZMb3csIGNvbnN0IEFQSW50ICZIaWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCkgY29uc3QgeworICAgIC8vIEZJWE1FOiBJIGRvbid0IHRoaW5rIE51bUNtcHMgaXMgdGhlIGNvcnJlY3QgbWV0cmljOiBhIHNpbmdsZSBjYXNlIGFuZCBhCisgICAgLy8gcmFuZ2Ugb2YgY2FzZXMgYm90aCByZXF1aXJlIG9ubHkgb25lIGJyYW5jaCB0byBsb3dlci4gSnVzdCBsb29raW5nIGF0IHRoZQorICAgIC8vIG51bWJlciBvZiBjbHVzdGVycyBhbmQgZGVzdGluYXRpb25zIHNob3VsZCBiZSBlbm91Z2ggdG8gZGVjaWRlIHdoZXRoZXIgdG8KKyAgICAvLyBidWlsZCBiaXQgdGVzdHMuCisKKyAgICAvLyBUbyBsb3dlciBhIHJhbmdlIHdpdGggYml0IHRlc3RzLCB0aGUgcmFuZ2UgbXVzdCBmaXQgdGhlIGJpdHdpZHRoIG9mIGEKKyAgICAvLyBtYWNoaW5lIHdvcmQuCisgICAgaWYgKCFyYW5nZUZpdHNJbldvcmQoTG93LCBIaWdoLCBETCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBEZWNpZGUgd2hldGhlciBpdCdzIHByb2ZpdGFibGUgdG8gbG93ZXIgdGhpcyByYW5nZSB3aXRoIGJpdCB0ZXN0cy4gRWFjaAorICAgIC8vIGRlc3RpbmF0aW9uIHJlcXVpcmVzIGEgYml0IHRlc3QgYW5kIGJyYW5jaCwgYW5kIHRoZXJlIGlzIGFuIG92ZXJhbGwgcmFuZ2UKKyAgICAvLyBjaGVjayBicmFuY2guIEZvciBhIHNtYWxsIG51bWJlciBvZiBjbHVzdGVycywgc2VwYXJhdGUgY29tcGFyaXNvbnMgbWlnaHQKKyAgICAvLyBiZSBjaGVhcGVyLCBhbmQgZm9yIG1hbnkgZGVzdGluYXRpb25zLCBzcGxpdHRpbmcgdGhlIHJhbmdlIG1pZ2h0IGJlCisgICAgLy8gYmV0dGVyLgorICAgIHJldHVybiAoTnVtRGVzdHMgPT0gMSAmJiBOdW1DbXBzID49IDMpIHx8IChOdW1EZXN0cyA9PSAyICYmIE51bUNtcHMgPj0gNSkgfHwKKyAgICAgICAgICAgKE51bURlc3RzID09IDMgJiYgTnVtQ21wcyA+PSA2KTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIG9wZXJhdGlvbiBpcyBpbGxlZ2FsIG9uIHRoaXMgdGFyZ2V0IG9yCisgIC8vLyB1bmxpa2VseSB0byBiZSBtYWRlIGxlZ2FsIHdpdGggY3VzdG9tIGxvd2VyaW5nLiBUaGlzIGlzIHVzZWQgdG8gaGVscCBndWlkZQorICAvLy8gaGlnaC1sZXZlbCBsb3dlcmluZyBkZWNpc2lvbnMuCisgIGJvb2wgaXNPcGVyYXRpb25FeHBhbmQodW5zaWduZWQgT3AsIEVWVCBWVCkgY29uc3QgeworICAgIHJldHVybiAoIWlzVHlwZUxlZ2FsKFZUKSB8fCBnZXRPcGVyYXRpb25BY3Rpb24oT3AsIFZUKSA9PSBFeHBhbmQpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgb3BlcmF0aW9uIGlzIGxlZ2FsIG9uIHRoaXMgdGFyZ2V0LgorICBib29sIGlzT3BlcmF0aW9uTGVnYWwodW5zaWduZWQgT3AsIEVWVCBWVCkgY29uc3QgeworICAgIHJldHVybiAoVlQgPT0gTVZUOjpPdGhlciB8fCBpc1R5cGVMZWdhbChWVCkpICYmCisgICAgICAgICAgIGdldE9wZXJhdGlvbkFjdGlvbihPcCwgVlQpID09IExlZ2FsOworICB9CisKKyAgLy8vIFJldHVybiBob3cgdGhpcyBsb2FkIHdpdGggZXh0ZW5zaW9uIHNob3VsZCBiZSB0cmVhdGVkOiBlaXRoZXIgaXQgaXMgbGVnYWwsCisgIC8vLyBuZWVkcyB0byBiZSBwcm9tb3RlZCB0byBhIGxhcmdlciBzaXplLCBuZWVkcyB0byBiZSBleHBhbmRlZCB0byBzb21lIG90aGVyCisgIC8vLyBjb2RlIHNlcXVlbmNlLCBvciB0aGUgdGFyZ2V0IGhhcyBhIGN1c3RvbSBleHBhbmRlciBmb3IgaXQuCisgIExlZ2FsaXplQWN0aW9uIGdldExvYWRFeHRBY3Rpb24odW5zaWduZWQgRXh0VHlwZSwgRVZUIFZhbFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBNZW1WVCkgY29uc3QgeworICAgIGlmIChWYWxWVC5pc0V4dGVuZGVkKCkgfHwgTWVtVlQuaXNFeHRlbmRlZCgpKSByZXR1cm4gRXhwYW5kOworICAgIHVuc2lnbmVkIFZhbEkgPSAodW5zaWduZWQpIFZhbFZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHk7CisgICAgdW5zaWduZWQgTWVtSSA9ICh1bnNpZ25lZCkgTWVtVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeTsKKyAgICBhc3NlcnQoRXh0VHlwZSA8IElTRDo6TEFTVF9MT0FERVhUX1RZUEUgJiYgVmFsSSA8IE1WVDo6TEFTVF9WQUxVRVRZUEUgJiYKKyAgICAgICAgICAgTWVtSSA8IE1WVDo6TEFTVF9WQUxVRVRZUEUgJiYgIlRhYmxlIGlzbid0IGJpZyBlbm91Z2ghIik7CisgICAgdW5zaWduZWQgU2hpZnQgPSA0ICogRXh0VHlwZTsKKyAgICByZXR1cm4gKExlZ2FsaXplQWN0aW9uKSgoTG9hZEV4dEFjdGlvbnNbVmFsSV1bTWVtSV0gPj4gU2hpZnQpICYgMHhmKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGxvYWQgd2l0aCBleHRlbnNpb24gaXMgbGVnYWwgb24gdGhpcyB0YXJnZXQuCisgIGJvb2wgaXNMb2FkRXh0TGVnYWwodW5zaWduZWQgRXh0VHlwZSwgRVZUIFZhbFZULCBFVlQgTWVtVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TG9hZEV4dEFjdGlvbihFeHRUeXBlLCBWYWxWVCwgTWVtVlQpID09IExlZ2FsOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgbG9hZCB3aXRoIGV4dGVuc2lvbiBpcyBsZWdhbCBvciBjdXN0b20KKyAgLy8vIG9uIHRoaXMgdGFyZ2V0LgorICBib29sIGlzTG9hZEV4dExlZ2FsT3JDdXN0b20odW5zaWduZWQgRXh0VHlwZSwgRVZUIFZhbFZULCBFVlQgTWVtVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TG9hZEV4dEFjdGlvbihFeHRUeXBlLCBWYWxWVCwgTWVtVlQpID09IExlZ2FsIHx8CisgICAgICAgICAgIGdldExvYWRFeHRBY3Rpb24oRXh0VHlwZSwgVmFsVlQsIE1lbVZUKSA9PSBDdXN0b207CisgIH0KKworICAvLy8gUmV0dXJuIGhvdyB0aGlzIHN0b3JlIHdpdGggdHJ1bmNhdGlvbiBzaG91bGQgYmUgdHJlYXRlZDogZWl0aGVyIGl0IGlzCisgIC8vLyBsZWdhbCwgbmVlZHMgdG8gYmUgcHJvbW90ZWQgdG8gYSBsYXJnZXIgc2l6ZSwgbmVlZHMgdG8gYmUgZXhwYW5kZWQgdG8gc29tZQorICAvLy8gb3RoZXIgY29kZSBzZXF1ZW5jZSwgb3IgdGhlIHRhcmdldCBoYXMgYSBjdXN0b20gZXhwYW5kZXIgZm9yIGl0LgorICBMZWdhbGl6ZUFjdGlvbiBnZXRUcnVuY1N0b3JlQWN0aW9uKEVWVCBWYWxWVCwgRVZUIE1lbVZUKSBjb25zdCB7CisgICAgaWYgKFZhbFZULmlzRXh0ZW5kZWQoKSB8fCBNZW1WVC5pc0V4dGVuZGVkKCkpIHJldHVybiBFeHBhbmQ7CisgICAgdW5zaWduZWQgVmFsSSA9ICh1bnNpZ25lZCkgVmFsVlQuZ2V0U2ltcGxlVlQoKS5TaW1wbGVUeTsKKyAgICB1bnNpZ25lZCBNZW1JID0gKHVuc2lnbmVkKSBNZW1WVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5OworICAgIGFzc2VydChWYWxJIDwgTVZUOjpMQVNUX1ZBTFVFVFlQRSAmJiBNZW1JIDwgTVZUOjpMQVNUX1ZBTFVFVFlQRSAmJgorICAgICAgICAgICAiVGFibGUgaXNuJ3QgYmlnIGVub3VnaCEiKTsKKyAgICByZXR1cm4gVHJ1bmNTdG9yZUFjdGlvbnNbVmFsSV1bTWVtSV07CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBzdG9yZSB3aXRoIHRydW5jYXRpb24gaXMgbGVnYWwgb24gdGhpcworICAvLy8gdGFyZ2V0LgorICBib29sIGlzVHJ1bmNTdG9yZUxlZ2FsKEVWVCBWYWxWVCwgRVZUIE1lbVZUKSBjb25zdCB7CisgICAgcmV0dXJuIGlzVHlwZUxlZ2FsKFZhbFZUKSAmJiBnZXRUcnVuY1N0b3JlQWN0aW9uKFZhbFZULCBNZW1WVCkgPT0gTGVnYWw7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBzdG9yZSB3aXRoIHRydW5jYXRpb24gaGFzIHNvbHV0aW9uIG9uIHRoaXMKKyAgLy8vIHRhcmdldC4KKyAgYm9vbCBpc1RydW5jU3RvcmVMZWdhbE9yQ3VzdG9tKEVWVCBWYWxWVCwgRVZUIE1lbVZUKSBjb25zdCB7CisgICAgcmV0dXJuIGlzVHlwZUxlZ2FsKFZhbFZUKSAmJgorICAgICAgKGdldFRydW5jU3RvcmVBY3Rpb24oVmFsVlQsIE1lbVZUKSA9PSBMZWdhbCB8fAorICAgICAgIGdldFRydW5jU3RvcmVBY3Rpb24oVmFsVlQsIE1lbVZUKSA9PSBDdXN0b20pOworICB9CisKKyAgLy8vIFJldHVybiBob3cgdGhlIGluZGV4ZWQgbG9hZCBzaG91bGQgYmUgdHJlYXRlZDogZWl0aGVyIGl0IGlzIGxlZ2FsLCBuZWVkcworICAvLy8gdG8gYmUgcHJvbW90ZWQgdG8gYSBsYXJnZXIgc2l6ZSwgbmVlZHMgdG8gYmUgZXhwYW5kZWQgdG8gc29tZSBvdGhlciBjb2RlCisgIC8vLyBzZXF1ZW5jZSwgb3IgdGhlIHRhcmdldCBoYXMgYSBjdXN0b20gZXhwYW5kZXIgZm9yIGl0LgorICBMZWdhbGl6ZUFjdGlvbgorICBnZXRJbmRleGVkTG9hZEFjdGlvbih1bnNpZ25lZCBJZHhNb2RlLCBNVlQgVlQpIGNvbnN0IHsKKyAgICBhc3NlcnQoSWR4TW9kZSA8IElTRDo6TEFTVF9JTkRFWEVEX01PREUgJiYgVlQuaXNWYWxpZCgpICYmCisgICAgICAgICAgICJUYWJsZSBpc24ndCBiaWcgZW5vdWdoISIpOworICAgIHVuc2lnbmVkIFR5ID0gKHVuc2lnbmVkKVZULlNpbXBsZVR5OworICAgIHJldHVybiAoTGVnYWxpemVBY3Rpb24pKChJbmRleGVkTW9kZUFjdGlvbnNbVHldW0lkeE1vZGVdICYgMHhmMCkgPj4gNCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBpbmRleGVkIGxvYWQgaXMgbGVnYWwgb24gdGhpcyB0YXJnZXQuCisgIGJvb2wgaXNJbmRleGVkTG9hZExlZ2FsKHVuc2lnbmVkIElkeE1vZGUsIEVWVCBWVCkgY29uc3QgeworICAgIHJldHVybiBWVC5pc1NpbXBsZSgpICYmCisgICAgICAoZ2V0SW5kZXhlZExvYWRBY3Rpb24oSWR4TW9kZSwgVlQuZ2V0U2ltcGxlVlQoKSkgPT0gTGVnYWwgfHwKKyAgICAgICBnZXRJbmRleGVkTG9hZEFjdGlvbihJZHhNb2RlLCBWVC5nZXRTaW1wbGVWVCgpKSA9PSBDdXN0b20pOworICB9CisKKyAgLy8vIFJldHVybiBob3cgdGhlIGluZGV4ZWQgc3RvcmUgc2hvdWxkIGJlIHRyZWF0ZWQ6IGVpdGhlciBpdCBpcyBsZWdhbCwgbmVlZHMKKyAgLy8vIHRvIGJlIHByb21vdGVkIHRvIGEgbGFyZ2VyIHNpemUsIG5lZWRzIHRvIGJlIGV4cGFuZGVkIHRvIHNvbWUgb3RoZXIgY29kZQorICAvLy8gc2VxdWVuY2UsIG9yIHRoZSB0YXJnZXQgaGFzIGEgY3VzdG9tIGV4cGFuZGVyIGZvciBpdC4KKyAgTGVnYWxpemVBY3Rpb24KKyAgZ2V0SW5kZXhlZFN0b3JlQWN0aW9uKHVuc2lnbmVkIElkeE1vZGUsIE1WVCBWVCkgY29uc3QgeworICAgIGFzc2VydChJZHhNb2RlIDwgSVNEOjpMQVNUX0lOREVYRURfTU9ERSAmJiBWVC5pc1ZhbGlkKCkgJiYKKyAgICAgICAgICAgIlRhYmxlIGlzbid0IGJpZyBlbm91Z2ghIik7CisgICAgdW5zaWduZWQgVHkgPSAodW5zaWduZWQpVlQuU2ltcGxlVHk7CisgICAgcmV0dXJuIChMZWdhbGl6ZUFjdGlvbikoSW5kZXhlZE1vZGVBY3Rpb25zW1R5XVtJZHhNb2RlXSAmIDB4MGYpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5kZXhlZCBsb2FkIGlzIGxlZ2FsIG9uIHRoaXMgdGFyZ2V0LgorICBib29sIGlzSW5kZXhlZFN0b3JlTGVnYWwodW5zaWduZWQgSWR4TW9kZSwgRVZUIFZUKSBjb25zdCB7CisgICAgcmV0dXJuIFZULmlzU2ltcGxlKCkgJiYKKyAgICAgIChnZXRJbmRleGVkU3RvcmVBY3Rpb24oSWR4TW9kZSwgVlQuZ2V0U2ltcGxlVlQoKSkgPT0gTGVnYWwgfHwKKyAgICAgICBnZXRJbmRleGVkU3RvcmVBY3Rpb24oSWR4TW9kZSwgVlQuZ2V0U2ltcGxlVlQoKSkgPT0gQ3VzdG9tKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gaG93IHRoZSBjb25kaXRpb24gY29kZSBzaG91bGQgYmUgdHJlYXRlZDogZWl0aGVyIGl0IGlzIGxlZ2FsLCBuZWVkcworICAvLy8gdG8gYmUgZXhwYW5kZWQgdG8gc29tZSBvdGhlciBjb2RlIHNlcXVlbmNlLCBvciB0aGUgdGFyZ2V0IGhhcyBhIGN1c3RvbQorICAvLy8gZXhwYW5kZXIgZm9yIGl0LgorICBMZWdhbGl6ZUFjdGlvbgorICBnZXRDb25kQ29kZUFjdGlvbihJU0Q6OkNvbmRDb2RlIENDLCBNVlQgVlQpIGNvbnN0IHsKKyAgICBhc3NlcnQoKHVuc2lnbmVkKUNDIDwgYXJyYXlfbGVuZ3Rob2YoQ29uZENvZGVBY3Rpb25zKSAmJgorICAgICAgICAgICAoKHVuc2lnbmVkKVZULlNpbXBsZVR5ID4+IDMpIDwgYXJyYXlfbGVuZ3Rob2YoQ29uZENvZGVBY3Rpb25zWzBdKSAmJgorICAgICAgICAgICAiVGFibGUgaXNuJ3QgYmlnIGVub3VnaCEiKTsKKyAgICAvLyBTZWUgc2V0Q29uZENvZGVBY3Rpb24gZm9yIGhvdyB0aGlzIGlzIGVuY29kZWQuCisgICAgdWludDMyX3QgU2hpZnQgPSA0ICogKFZULlNpbXBsZVR5ICYgMHg3KTsKKyAgICB1aW50MzJfdCBWYWx1ZSA9IENvbmRDb2RlQWN0aW9uc1tDQ11bVlQuU2ltcGxlVHkgPj4gM107CisgICAgTGVnYWxpemVBY3Rpb24gQWN0aW9uID0gKExlZ2FsaXplQWN0aW9uKSAoKFZhbHVlID4+IFNoaWZ0KSAmIDB4Rik7CisgICAgYXNzZXJ0KEFjdGlvbiAhPSBQcm9tb3RlICYmICJDYW4ndCBwcm9tb3RlIGNvbmRpdGlvbiBjb2RlISIpOworICAgIHJldHVybiBBY3Rpb247CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjb25kaXRpb24gY29kZSBpcyBsZWdhbCBvbiB0aGlzIHRhcmdldC4KKyAgYm9vbCBpc0NvbmRDb2RlTGVnYWwoSVNEOjpDb25kQ29kZSBDQywgTVZUIFZUKSBjb25zdCB7CisgICAgcmV0dXJuIGdldENvbmRDb2RlQWN0aW9uKENDLCBWVCkgPT0gTGVnYWw7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCBjb25kaXRpb24gY29kZSBpcyBsZWdhbCBvciBjdXN0b20gb24gdGhpcworICAvLy8gdGFyZ2V0LgorICBib29sIGlzQ29uZENvZGVMZWdhbE9yQ3VzdG9tKElTRDo6Q29uZENvZGUgQ0MsIE1WVCBWVCkgY29uc3QgeworICAgIHJldHVybiBnZXRDb25kQ29kZUFjdGlvbihDQywgVlQpID09IExlZ2FsIHx8CisgICAgICAgICAgIGdldENvbmRDb2RlQWN0aW9uKENDLCBWVCkgPT0gQ3VzdG9tOworICB9CisKKyAgLy8vIElmIHRoZSBhY3Rpb24gZm9yIHRoaXMgb3BlcmF0aW9uIGlzIHRvIHByb21vdGUsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlCisgIC8vLyBWYWx1ZVR5cGUgdG8gcHJvbW90ZSB0by4KKyAgTVZUIGdldFR5cGVUb1Byb21vdGVUbyh1bnNpZ25lZCBPcCwgTVZUIFZUKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldE9wZXJhdGlvbkFjdGlvbihPcCwgVlQpID09IFByb21vdGUgJiYKKyAgICAgICAgICAgIlRoaXMgb3BlcmF0aW9uIGlzbid0IHByb21vdGVkISIpOworCisgICAgLy8gU2VlIGlmIHRoaXMgaGFzIGFuIGV4cGxpY2l0IHR5cGUgc3BlY2lmaWVkLgorICAgIHN0ZDo6bWFwPHN0ZDo6cGFpcjx1bnNpZ25lZCwgTVZUOjpTaW1wbGVWYWx1ZVR5cGU+LAorICAgICAgICAgICAgIE1WVDo6U2ltcGxlVmFsdWVUeXBlPjo6Y29uc3RfaXRlcmF0b3IgUFRUSSA9CisgICAgICBQcm9tb3RlVG9UeXBlLmZpbmQoc3RkOjptYWtlX3BhaXIoT3AsIFZULlNpbXBsZVR5KSk7CisgICAgaWYgKFBUVEkgIT0gUHJvbW90ZVRvVHlwZS5lbmQoKSkgcmV0dXJuIFBUVEktPnNlY29uZDsKKworICAgIGFzc2VydCgoVlQuaXNJbnRlZ2VyKCkgfHwgVlQuaXNGbG9hdGluZ1BvaW50KCkpICYmCisgICAgICAgICAgICJDYW5ub3QgYXV0b3Byb21vdGUgdGhpcyB0eXBlLCBhZGQgaXQgd2l0aCBBZGRQcm9tb3RlZFRvVHlwZS4iKTsKKworICAgIE1WVCBOVlQgPSBWVDsKKyAgICBkbyB7CisgICAgICBOVlQgPSAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpKE5WVC5TaW1wbGVUeSsxKTsKKyAgICAgIGFzc2VydChOVlQuaXNJbnRlZ2VyKCkgPT0gVlQuaXNJbnRlZ2VyKCkgJiYgTlZUICE9IE1WVDo6aXNWb2lkICYmCisgICAgICAgICAgICAgIkRpZG4ndCBmaW5kIHR5cGUgdG8gcHJvbW90ZSB0byEiKTsKKyAgICB9IHdoaWxlICghaXNUeXBlTGVnYWwoTlZUKSB8fAorICAgICAgICAgICAgICBnZXRPcGVyYXRpb25BY3Rpb24oT3AsIE5WVCkgPT0gUHJvbW90ZSk7CisgICAgcmV0dXJuIE5WVDsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIEVWVCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgTExWTSB0eXBlLiAgVGhpcyBpcyBmaXhlZCBieSB0aGUgTExWTQorICAvLy8gb3BlcmF0aW9ucyBleGNlcHQgZm9yIHRoZSBwb2ludGVyIHNpemUuICBJZiBBbGxvd1Vua25vd24gaXMgdHJ1ZSwgdGhpcworICAvLy8gd2lsbCByZXR1cm4gTVZUOjpPdGhlciBmb3IgdHlwZXMgd2l0aCBubyBFVlQgY291bnRlcnBhcnQgKGUuZy4gc3RydWN0cyksCisgIC8vLyBvdGhlcndpc2UgaXQgd2lsbCBhc3NlcnQuCisgIEVWVCBnZXRWYWx1ZVR5cGUoY29uc3QgRGF0YUxheW91dCAmREwsIFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dVbmtub3duID0gZmFsc2UpIGNvbnN0IHsKKyAgICAvLyBMb3dlciBzY2FsYXIgcG9pbnRlcnMgdG8gbmF0aXZlIHBvaW50ZXIgdHlwZXMuCisgICAgaWYgKFBvaW50ZXJUeXBlICpQVHkgPSBkeW5fY2FzdDxQb2ludGVyVHlwZT4oVHkpKQorICAgICAgcmV0dXJuIGdldFBvaW50ZXJUeShETCwgUFR5LT5nZXRBZGRyZXNzU3BhY2UoKSk7CisKKyAgICBpZiAoVHktPmlzVmVjdG9yVHkoKSkgeworICAgICAgVmVjdG9yVHlwZSAqVlR5ID0gY2FzdDxWZWN0b3JUeXBlPihUeSk7CisgICAgICBUeXBlICpFbG0gPSBWVHktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgICAvLyBMb3dlciB2ZWN0b3JzIG9mIHBvaW50ZXJzIHRvIG5hdGl2ZSBwb2ludGVyIHR5cGVzLgorICAgICAgaWYgKFBvaW50ZXJUeXBlICpQVCA9IGR5bl9jYXN0PFBvaW50ZXJUeXBlPihFbG0pKSB7CisgICAgICAgIEVWVCBQb2ludGVyVHkoZ2V0UG9pbnRlclR5KERMLCBQVC0+Z2V0QWRkcmVzc1NwYWNlKCkpKTsKKyAgICAgICAgRWxtID0gUG9pbnRlclR5LmdldFR5cGVGb3JFVlQoVHktPmdldENvbnRleHQoKSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBFVlQ6OmdldFZlY3RvclZUKFR5LT5nZXRDb250ZXh0KCksIEVWVDo6Z2V0RVZUKEVsbSwgZmFsc2UpLAorICAgICAgICAgICAgICAgICAgICAgICBWVHktPmdldE51bUVsZW1lbnRzKCkpOworICAgIH0KKyAgICByZXR1cm4gRVZUOjpnZXRFVlQoVHksIEFsbG93VW5rbm93bik7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBNVlQgY29ycmVzcG9uZGluZyB0byB0aGlzIExMVk0gdHlwZS4gU2VlIGdldFZhbHVlVHlwZS4KKyAgTVZUIGdldFNpbXBsZVZhbHVlVHlwZShjb25zdCBEYXRhTGF5b3V0ICZETCwgVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd1Vua25vd24gPSBmYWxzZSkgY29uc3QgeworICAgIHJldHVybiBnZXRWYWx1ZVR5cGUoREwsIFR5LCBBbGxvd1Vua25vd24pLmdldFNpbXBsZVZUKCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBkZXNpcmVkIGFsaWdubWVudCBmb3IgQnlWYWwgb3IgSW5BbGxvY2EgYWdncmVnYXRlIGZ1bmN0aW9uCisgIC8vLyBhcmd1bWVudHMgaW4gdGhlIGNhbGxlciBwYXJhbWV0ZXIgYXJlYS4gIFRoaXMgaXMgdGhlIGFjdHVhbCBhbGlnbm1lbnQsIG5vdAorICAvLy8gaXRzIGxvZ2FyaXRobS4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRCeVZhbFR5cGVBbGlnbm1lbnQoVHlwZSAqVHksIGNvbnN0IERhdGFMYXlvdXQgJkRMKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSB0eXBlIG9mIHJlZ2lzdGVycyB0aGF0IHRoaXMgVmFsdWVUeXBlIHdpbGwgZXZlbnR1YWxseSByZXF1aXJlLgorICBNVlQgZ2V0UmVnaXN0ZXJUeXBlKE1WVCBWVCkgY29uc3QgeworICAgIGFzc2VydCgodW5zaWduZWQpVlQuU2ltcGxlVHkgPCBhcnJheV9sZW5ndGhvZihSZWdpc3RlclR5cGVGb3JWVCkpOworICAgIHJldHVybiBSZWdpc3RlclR5cGVGb3JWVFtWVC5TaW1wbGVUeV07CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSB0eXBlIG9mIHJlZ2lzdGVycyB0aGF0IHRoaXMgVmFsdWVUeXBlIHdpbGwgZXZlbnR1YWxseSByZXF1aXJlLgorICBNVlQgZ2V0UmVnaXN0ZXJUeXBlKExMVk1Db250ZXh0ICZDb250ZXh0LCBFVlQgVlQpIGNvbnN0IHsKKyAgICBpZiAoVlQuaXNTaW1wbGUoKSkgeworICAgICAgYXNzZXJ0KCh1bnNpZ25lZClWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5IDwKKyAgICAgICAgICAgICAgICBhcnJheV9sZW5ndGhvZihSZWdpc3RlclR5cGVGb3JWVCkpOworICAgICAgcmV0dXJuIFJlZ2lzdGVyVHlwZUZvclZUW1ZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHldOworICAgIH0KKyAgICBpZiAoVlQuaXNWZWN0b3IoKSkgeworICAgICAgRVZUIFZUMTsKKyAgICAgIE1WVCBSZWdpc3RlclZUOworICAgICAgdW5zaWduZWQgTnVtSW50ZXJtZWRpYXRlczsKKyAgICAgICh2b2lkKWdldFZlY3RvclR5cGVCcmVha2Rvd24oQ29udGV4dCwgVlQsIFZUMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtSW50ZXJtZWRpYXRlcywgUmVnaXN0ZXJWVCk7CisgICAgICByZXR1cm4gUmVnaXN0ZXJWVDsKKyAgICB9CisgICAgaWYgKFZULmlzSW50ZWdlcigpKSB7CisgICAgICByZXR1cm4gZ2V0UmVnaXN0ZXJUeXBlKENvbnRleHQsIGdldFR5cGVUb1RyYW5zZm9ybVRvKENvbnRleHQsIFZUKSk7CisgICAgfQorICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuc3VwcG9ydGVkIGV4dGVuZGVkIHR5cGUhIik7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXJzIHRoYXQgdGhpcyBWYWx1ZVR5cGUgd2lsbCBldmVudHVhbGx5CisgIC8vLyByZXF1aXJlLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgb25lIGZvciBhbnkgdHlwZXMgcHJvbW90ZWQgdG8gbGl2ZSBpbiBsYXJnZXIgcmVnaXN0ZXJzLCBidXQgbWF5IGJlCisgIC8vLyBtb3JlIHRoYW4gb25lIGZvciB0eXBlcyAobGlrZSBpNjQpIHRoYXQgYXJlIHNwbGl0IGludG8gcGllY2VzLiAgRm9yIHR5cGVzCisgIC8vLyBsaWtlIGkxNDAsIHdoaWNoIGFyZSBmaXJzdCBwcm9tb3RlZCB0aGVuIGV4cGFuZGVkLCBpdCBpcyB0aGUgbnVtYmVyIG9mCisgIC8vLyByZWdpc3RlcnMgbmVlZGVkIHRvIGhvbGQgYWxsIHRoZSBiaXRzIG9mIHRoZSBvcmlnaW5hbCB0eXBlLiAgRm9yIGFuIGkxNDAKKyAgLy8vIG9uIGEgMzIgYml0IG1hY2hpbmUgdGhpcyBtZWFucyA1IHJlZ2lzdGVycy4KKyAgdW5zaWduZWQgZ2V0TnVtUmVnaXN0ZXJzKExMVk1Db250ZXh0ICZDb250ZXh0LCBFVlQgVlQpIGNvbnN0IHsKKyAgICBpZiAoVlQuaXNTaW1wbGUoKSkgeworICAgICAgYXNzZXJ0KCh1bnNpZ25lZClWVC5nZXRTaW1wbGVWVCgpLlNpbXBsZVR5IDwKKyAgICAgICAgICAgICAgICBhcnJheV9sZW5ndGhvZihOdW1SZWdpc3RlcnNGb3JWVCkpOworICAgICAgcmV0dXJuIE51bVJlZ2lzdGVyc0ZvclZUW1ZULmdldFNpbXBsZVZUKCkuU2ltcGxlVHldOworICAgIH0KKyAgICBpZiAoVlQuaXNWZWN0b3IoKSkgeworICAgICAgRVZUIFZUMTsKKyAgICAgIE1WVCBWVDI7CisgICAgICB1bnNpZ25lZCBOdW1JbnRlcm1lZGlhdGVzOworICAgICAgcmV0dXJuIGdldFZlY3RvclR5cGVCcmVha2Rvd24oQ29udGV4dCwgVlQsIFZUMSwgTnVtSW50ZXJtZWRpYXRlcywgVlQyKTsKKyAgICB9CisgICAgaWYgKFZULmlzSW50ZWdlcigpKSB7CisgICAgICB1bnNpZ25lZCBCaXRXaWR0aCA9IFZULmdldFNpemVJbkJpdHMoKTsKKyAgICAgIHVuc2lnbmVkIFJlZ1dpZHRoID0gZ2V0UmVnaXN0ZXJUeXBlKENvbnRleHQsIFZUKS5nZXRTaXplSW5CaXRzKCk7CisgICAgICByZXR1cm4gKEJpdFdpZHRoICsgUmVnV2lkdGggLSAxKSAvIFJlZ1dpZHRoOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJVbnN1cHBvcnRlZCBleHRlbmRlZCB0eXBlISIpOworICB9CisKKyAgLy8vIENlcnRhaW4gY29tYmluYXRpb25zIG9mIEFCSXMsIFRhcmdldHMgYW5kIGZlYXR1cmVzIHJlcXVpcmUgdGhhdCB0eXBlcworICAvLy8gYXJlIGxlZ2FsIGZvciBzb21lIG9wZXJhdGlvbnMgYW5kIG5vdCBmb3Igb3RoZXIgb3BlcmF0aW9ucy4KKyAgLy8vIEZvciBNSVBTIGFsbCB2ZWN0b3IgdHlwZXMgbXVzdCBiZSBwYXNzZWQgdGhyb3VnaCB0aGUgaW50ZWdlciByZWdpc3RlciBzZXQuCisgIHZpcnR1YWwgTVZUIGdldFJlZ2lzdGVyVHlwZUZvckNhbGxpbmdDb252KE1WVCBWVCkgY29uc3QgeworICAgIHJldHVybiBnZXRSZWdpc3RlclR5cGUoVlQpOworICB9CisKKyAgdmlydHVhbCBNVlQgZ2V0UmVnaXN0ZXJUeXBlRm9yQ2FsbGluZ0NvbnYoTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBWVCkgY29uc3QgeworICAgIHJldHVybiBnZXRSZWdpc3RlclR5cGUoQ29udGV4dCwgVlQpOworICB9CisKKyAgLy8vIENlcnRhaW4gdGFyZ2V0cyByZXF1aXJlIHVudXN1YWwgYnJlYWtkb3ducyBvZiBjZXJ0YWluIHR5cGVzLiBGb3IgTUlQUywKKyAgLy8vIHRoaXMgb2NjdXJzIHdoZW4gYSB2ZWN0b3IgdHlwZSBpcyB1c2VkLCBhcyB2ZWN0b3IgYXJlIHBhc3NlZCB0aHJvdWdoIHRoZQorICAvLy8gaW50ZWdlciByZWdpc3RlciBzZXQuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TnVtUmVnaXN0ZXJzRm9yQ2FsbGluZ0NvbnYoTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE51bVJlZ2lzdGVycyhDb250ZXh0LCBWVCk7CisgIH0KKworICAvLy8gQ2VydGFpbiB0YXJnZXRzIGhhdmUgY29udGV4dCBzZW5zdGl2ZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnRzLCB3aGVyZSBvbmUKKyAgLy8vIHR5cGUgaGFzIHRoZSBhbGlnbm1lbnQgcmVxdWlyZW1lbnQgb2YgYW5vdGhlciB0eXBlLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldEFCSUFsaWdubWVudEZvckNhbGxpbmdDb252KFR5cGUgKkFyZ1R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFMYXlvdXQgREwpIGNvbnN0IHsKKyAgICByZXR1cm4gREwuZ2V0QUJJVHlwZUFsaWdubWVudChBcmdUeSk7CisgIH0KKworICAvLy8gSWYgdHJ1ZSwgdGhlbiBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gc2hvdWxkIHNlZWsgdG8gc2hyaW5rIHRoZSBGUCBjb25zdGFudAorICAvLy8gb2YgdGhlIHNwZWNpZmllZCB0eXBlIHRvIGEgc21hbGxlciB0eXBlIGluIG9yZGVyIHRvIHNhdmUgc3BhY2UgYW5kIC8gb3IKKyAgLy8vIHJlZHVjZSBydW50aW1lLgorICB2aXJ0dWFsIGJvb2wgU2hvdWxkU2hyaW5rRlBDb25zdGFudChFVlQpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAvLyBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIHJlZHVjZSB0aGUgZ2l2ZW4gbG9hZCBub2RlIHRvIGEgc21hbGxlcgorICAvLyB0eXBlLgorICAvLworICAvLyBlLmcuIChpMTYgKHRydW5jIChpMzIgKGxvYWQgeCkpKSAtPiBpMTYgbG9hZCB4IHNob3VsZCBiZSBwZXJmb3JtZWQKKyAgdmlydHVhbCBib29sIHNob3VsZFJlZHVjZUxvYWRXaWR0aChTRE5vZGUgKkxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpMb2FkRXh0VHlwZSBFeHRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFVlQgTmV3VlQpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBXaGVuIHNwbGl0dGluZyBhIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBpbnRvIHBhcnRzLCBkb2VzIHRoZSBMbworICAvLy8gb3IgSGkgcGFydCBjb21lIGZpcnN0PyAgVGhpcyB1c3VhbGx5IGZvbGxvd3MgdGhlIGVuZGlhbm5lc3MsIGV4Y2VwdAorICAvLy8gZm9yIHBwY2YxMjgsIHdoZXJlIHRoZSBIaSBwYXJ0IGFsd2F5cyBjb21lcyBmaXJzdC4KKyAgYm9vbCBoYXNCaWdFbmRpYW5QYXJ0T3JkZXJpbmcoRVZUIFZULCBjb25zdCBEYXRhTGF5b3V0ICZETCkgY29uc3QgeworICAgIHJldHVybiBETC5pc0JpZ0VuZGlhbigpIHx8IFZUID09IE1WVDo6cHBjZjEyODsKKyAgfQorCisgIC8vLyBJZiB0cnVlLCB0aGUgdGFyZ2V0IGhhcyBjdXN0b20gREFHIGNvbWJpbmUgdHJhbnNmb3JtYXRpb25zIHRoYXQgaXQgY2FuCisgIC8vLyBwZXJmb3JtIGZvciB0aGUgc3BlY2lmaWVkIG5vZGUuCisgIGJvb2wgaGFzVGFyZ2V0REFHQ29tYmluZShJU0Q6Ok5vZGVUeXBlIE5UKSBjb25zdCB7CisgICAgYXNzZXJ0KHVuc2lnbmVkKE5UID4+IDMpIDwgYXJyYXlfbGVuZ3Rob2YoVGFyZ2V0REFHQ29tYmluZUFycmF5KSk7CisgICAgcmV0dXJuIFRhcmdldERBR0NvbWJpbmVBcnJheVtOVCA+PiAzXSAmICgxIDw8IChOVCY3KSk7CisgIH0KKworICB1bnNpZ25lZCBnZXRHYXRoZXJBbGxBbGlhc2VzTWF4RGVwdGgoKSBjb25zdCB7CisgICAgcmV0dXJuIEdhdGhlckFsbEFsaWFzZXNNYXhEZXB0aDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBzaXplIG9mIHRoZSBwbGF0Zm9ybSdzIHZhX2xpc3Qgb2JqZWN0LgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldFZhTGlzdFNpemVJbkJpdHMoY29uc3QgRGF0YUxheW91dCAmREwpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UG9pbnRlclR5KERMKS5nZXRTaXplSW5CaXRzKCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCBtYXhpbXVtICMgb2Ygc3RvcmUgb3BlcmF0aW9ucyBwZXJtaXR0ZWQgZm9yIGxsdm0ubWVtc2V0CisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzdG9yZSBvcGVyYXRpb25zIHBlcm1pdHRlZAorICAvLy8gdG8gcmVwbGFjZSBhIGNhbGwgdG8gbGx2bS5tZW1zZXQuIFRoZSB2YWx1ZSBpcyBzZXQgYnkgdGhlIHRhcmdldCBhdCB0aGUKKyAgLy8vIHBlcmZvcm1hbmNlIHRocmVzaG9sZCBmb3Igc3VjaCBhIHJlcGxhY2VtZW50LiBJZiBPcHRTaXplIGlzIHRydWUsCisgIC8vLyByZXR1cm4gdGhlIGxpbWl0IGZvciBmdW5jdGlvbnMgdGhhdCBoYXZlIE9wdFNpemUgYXR0cmlidXRlLgorICB1bnNpZ25lZCBnZXRNYXhTdG9yZXNQZXJNZW1zZXQoYm9vbCBPcHRTaXplKSBjb25zdCB7CisgICAgcmV0dXJuIE9wdFNpemUgPyBNYXhTdG9yZXNQZXJNZW1zZXRPcHRTaXplIDogTWF4U3RvcmVzUGVyTWVtc2V0OworICB9CisKKyAgLy8vIFxicmllZiBHZXQgbWF4aW11bSAjIG9mIHN0b3JlIG9wZXJhdGlvbnMgcGVybWl0dGVkIGZvciBsbHZtLm1lbWNweQorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2Ygc3RvcmUgb3BlcmF0aW9ucyBwZXJtaXR0ZWQKKyAgLy8vIHRvIHJlcGxhY2UgYSBjYWxsIHRvIGxsdm0ubWVtY3B5LiBUaGUgdmFsdWUgaXMgc2V0IGJ5IHRoZSB0YXJnZXQgYXQgdGhlCisgIC8vLyBwZXJmb3JtYW5jZSB0aHJlc2hvbGQgZm9yIHN1Y2ggYSByZXBsYWNlbWVudC4gSWYgT3B0U2l6ZSBpcyB0cnVlLAorICAvLy8gcmV0dXJuIHRoZSBsaW1pdCBmb3IgZnVuY3Rpb25zIHRoYXQgaGF2ZSBPcHRTaXplIGF0dHJpYnV0ZS4KKyAgdW5zaWduZWQgZ2V0TWF4U3RvcmVzUGVyTWVtY3B5KGJvb2wgT3B0U2l6ZSkgY29uc3QgeworICAgIHJldHVybiBPcHRTaXplID8gTWF4U3RvcmVzUGVyTWVtY3B5T3B0U2l6ZSA6IE1heFN0b3Jlc1Blck1lbWNweTsKKyAgfQorCisgIC8vLyBHZXQgbWF4aW11bSAjIG9mIGxvYWQgb3BlcmF0aW9ucyBwZXJtaXR0ZWQgZm9yIG1lbWNtcAorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbG9hZCBvcGVyYXRpb25zIHBlcm1pdHRlZAorICAvLy8gdG8gcmVwbGFjZSBhIGNhbGwgdG8gbWVtY21wLiBUaGUgdmFsdWUgaXMgc2V0IGJ5IHRoZSB0YXJnZXQgYXQgdGhlCisgIC8vLyBwZXJmb3JtYW5jZSB0aHJlc2hvbGQgZm9yIHN1Y2ggYSByZXBsYWNlbWVudC4gSWYgT3B0U2l6ZSBpcyB0cnVlLAorICAvLy8gcmV0dXJuIHRoZSBsaW1pdCBmb3IgZnVuY3Rpb25zIHRoYXQgaGF2ZSBPcHRTaXplIGF0dHJpYnV0ZS4KKyAgdW5zaWduZWQgZ2V0TWF4RXhwYW5kU2l6ZU1lbWNtcChib29sIE9wdFNpemUpIGNvbnN0IHsKKyAgICByZXR1cm4gT3B0U2l6ZSA/IE1heExvYWRzUGVyTWVtY21wT3B0U2l6ZSA6IE1heExvYWRzUGVyTWVtY21wOworICB9CisKKyAgLy8vIEZvciBtZW1jbXAgZXhwYW5zaW9uIHdoZW4gdGhlIG1lbWNtcCByZXN1bHQgaXMgb25seSBjb21wYXJlZCBlcXVhbCBvcgorICAvLy8gbm90LWVxdWFsIHRvIDAsIGFsbG93IHVwIHRvIHRoaXMgbnVtYmVyIG9mIGxvYWQgcGFpcnMgcGVyIGJsb2NrLiBBcyBhbgorICAvLy8gZXhhbXBsZSwgdGhpcyBtYXkgYWxsb3cgJ21lbWNtcChhLCBiLCAzKSA9PSAwJyBpbiBhIHNpbmdsZSBibG9jazoKKyAgLy8vICAgYTAgPSBsb2FkMmJ5dGVzICZhWzBdCisgIC8vLyAgIGIwID0gbG9hZDJieXRlcyAmYlswXQorICAvLy8gICBhMiA9IGxvYWQxYnl0ZSAgJmFbMl0KKyAgLy8vICAgYjIgPSBsb2FkMWJ5dGUgICZiWzJdCisgIC8vLyAgIHIgID0gY21wIGVxIChhMCBeIGIwIHwgYTIgXiBiMiksIDAKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRNZW1jbXBFcVplcm9Mb2Fkc1BlckJsb2NrKCkgY29uc3QgeworICAgIHJldHVybiAxOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgbWF4aW11bSAjIG9mIHN0b3JlIG9wZXJhdGlvbnMgcGVybWl0dGVkIGZvciBsbHZtLm1lbW1vdmUKKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHN0b3JlIG9wZXJhdGlvbnMgcGVybWl0dGVkCisgIC8vLyB0byByZXBsYWNlIGEgY2FsbCB0byBsbHZtLm1lbW1vdmUuIFRoZSB2YWx1ZSBpcyBzZXQgYnkgdGhlIHRhcmdldCBhdCB0aGUKKyAgLy8vIHBlcmZvcm1hbmNlIHRocmVzaG9sZCBmb3Igc3VjaCBhIHJlcGxhY2VtZW50LiBJZiBPcHRTaXplIGlzIHRydWUsCisgIC8vLyByZXR1cm4gdGhlIGxpbWl0IGZvciBmdW5jdGlvbnMgdGhhdCBoYXZlIE9wdFNpemUgYXR0cmlidXRlLgorICB1bnNpZ25lZCBnZXRNYXhTdG9yZXNQZXJNZW1tb3ZlKGJvb2wgT3B0U2l6ZSkgY29uc3QgeworICAgIHJldHVybiBPcHRTaXplID8gTWF4U3RvcmVzUGVyTWVtbW92ZU9wdFNpemUgOiBNYXhTdG9yZXNQZXJNZW1tb3ZlOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgaWYgdGhlIHRhcmdldCBzdXBwb3J0cyB1bmFsaWduZWQgbWVtb3J5IGFjY2Vzc2VzLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlIGlmIHRoZSB0YXJnZXQgYWxsb3dzIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzZXMKKyAgLy8vIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBpbiB0aGUgZ2l2ZW4gYWRkcmVzcyBzcGFjZS4gSWYgdHJ1ZSwgaXQgYWxzbyByZXR1cm5zCisgIC8vLyB3aGV0aGVyIHRoZSB1bmFsaWduZWQgbWVtb3J5IGFjY2VzcyBpcyAiZmFzdCIgaW4gdGhlIGxhc3QgYXJndW1lbnQgYnkKKyAgLy8vIHJlZmVyZW5jZS4gVGhpcyBpcyB1c2VkLCBmb3IgZXhhbXBsZSwgaW4gc2l0dWF0aW9ucyB3aGVyZSBhbiBhcnJheQorICAvLy8gY29weS9tb3ZlL3NldCBpcyBjb252ZXJ0ZWQgdG8gYSBzZXF1ZW5jZSBvZiBzdG9yZSBvcGVyYXRpb25zLiBJdHMgdXNlCisgIC8vLyBoZWxwcyB0byBlbnN1cmUgdGhhdCBzdWNoIHJlcGxhY2VtZW50cyBkb24ndCBnZW5lcmF0ZSBjb2RlIHRoYXQgY2F1c2VzIGFuCisgIC8vLyBhbGlnbm1lbnQgZXJyb3IgKHRyYXApIG9uIHRoZSB0YXJnZXQgbWFjaGluZS4KKyAgdmlydHVhbCBib29sIGFsbG93c01pc2FsaWduZWRNZW1vcnlBY2Nlc3NlcyhFVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkclNwYWNlID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbiA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqIC8qRmFzdCovID0gbnVsbHB0cikgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0IHN1cHBvcnRzIGEgbWVtb3J5IGFjY2VzcyBvZiB0aGlzIHR5cGUgZm9yIHRoZQorICAvLy8gZ2l2ZW4gYWRkcmVzcyBzcGFjZSBhbmQgYWxpZ25tZW50LiBJZiB0aGUgYWNjZXNzIGlzIGFsbG93ZWQsIHRoZSBvcHRpb25hbAorICAvLy8gZmluYWwgcGFyYW1ldGVyIHJldHVybnMgaWYgdGhlIGFjY2VzcyBpcyBhbHNvIGZhc3QgKGFzIGRlZmluZWQgYnkgdGhlCisgIC8vLyB0YXJnZXQpLgorICBib29sIGFsbG93c01lbW9yeUFjY2VzcyhMTFZNQ29udGV4dCAmQ29udGV4dCwgY29uc3QgRGF0YUxheW91dCAmREwsIEVWVCBWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkclNwYWNlID0gMCwgdW5zaWduZWQgQWxpZ25tZW50ID0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqRmFzdCA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSB0YXJnZXQgc3BlY2lmaWMgb3B0aW1hbCB0eXBlIGZvciBsb2FkIGFuZCBzdG9yZSBvcGVyYXRpb25zIGFzCisgIC8vLyBhIHJlc3VsdCBvZiBtZW1zZXQsIG1lbWNweSwgYW5kIG1lbW1vdmUgbG93ZXJpbmcuCisgIC8vLworICAvLy8gSWYgRHN0QWxpZ24gaXMgemVybyB0aGF0IG1lYW5zIGl0J3Mgc2FmZSB0byBkZXN0aW5hdGlvbiBhbGlnbm1lbnQgY2FuCisgIC8vLyBzYXRpc2Z5IGFueSBjb25zdHJhaW50LiBTaW1pbGFybHkgaWYgU3JjQWxpZ24gaXMgemVybyBpdCBtZWFucyB0aGVyZSBpc24ndAorICAvLy8gYSBuZWVkIHRvIGNoZWNrIGl0IGFnYWluc3QgYWxpZ25tZW50IHJlcXVpcmVtZW50LCBwcm9iYWJseSBiZWNhdXNlIHRoZQorICAvLy8gc291cmNlIGRvZXMgbm90IG5lZWQgdG8gYmUgbG9hZGVkLiBJZiAnSXNNZW1zZXQnIGlzIHRydWUsIHRoYXQgbWVhbnMgaXQncworICAvLy8gZXhwYW5kaW5nIGEgbWVtc2V0LiBJZiAnWmVyb01lbXNldCcgaXMgdHJ1ZSwgdGhhdCBtZWFucyBpdCdzIGEgbWVtc2V0IG9mCisgIC8vLyB6ZXJvLiAnTWVtY3B5U3RyU3JjJyBpbmRpY2F0ZXMgd2hldGhlciB0aGUgbWVtY3B5IHNvdXJjZSBpcyBjb25zdGFudCBzbyBpdAorICAvLy8gZG9lcyBub3QgbmVlZCB0byBiZSBsb2FkZWQuICBJdCByZXR1cm5zIEVWVDo6T3RoZXIgaWYgdGhlIHR5cGUgc2hvdWxkIGJlCisgIC8vLyBkZXRlcm1pbmVkIHVzaW5nIGdlbmVyaWMgdGFyZ2V0LWluZGVwZW5kZW50IGxvZ2ljLgorICB2aXJ0dWFsIEVWVCBnZXRPcHRpbWFsTWVtT3BUeXBlKHVpbnQ2NF90IC8qU2l6ZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIC8qRHN0QWxpZ24qLywgdW5zaWduZWQgLypTcmNBbGlnbiovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLypJc01lbXNldCovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLypaZXJvTWVtc2V0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKk1lbWNweVN0clNyYyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAmLypNRiovKSBjb25zdCB7CisgICAgcmV0dXJuIE1WVDo6T3RoZXI7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIGl0J3Mgc2FmZSB0byB1c2UgbG9hZCAvIHN0b3JlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSB0bworICAvLy8gZXhwYW5kIG1lbWNweSAvIG1lbXNldCBpbmxpbmUuCisgIC8vLworICAvLy8gVGhpcyBpcyBtb3N0bHkgdHJ1ZSBmb3IgYWxsIHR5cGVzIGV4Y2VwdCBmb3Igc29tZSBzcGVjaWFsIGNhc2VzLiBGb3IKKyAgLy8vIGV4YW1wbGUsIG9uIFg4NiB0YXJnZXRzIHdpdGhvdXQgU1NFMiBmNjQgbG9hZCAvIHN0b3JlIGFyZSBkb25lIHdpdGggZmxkbCAvCisgIC8vLyBmc3RwbCB3aGljaCBhbHNvIGRvZXMgdHlwZSBjb252ZXJzaW9uLiBOb3RlIHRoZSBzcGVjaWZpZWQgdHlwZSBkb2Vzbid0CisgIC8vLyBoYXZlIHRvIGJlIGxlZ2FsIGFzIHRoZSBob29rIGlzIHVzZWQgYmVmb3JlIHR5cGUgbGVnYWxpemF0aW9uLgorICB2aXJ0dWFsIGJvb2wgaXNTYWZlTWVtT3BUeXBlKE1WVCAvKlZUKi8pIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHdlIHNob3VsZCB1c2UgX3NldGptcCBvciBzZXRqbXAgdG8gaW1wbGVtZW50IGxsdm0uc2V0am1wLgorICBib29sIHVzZXNVbmRlcnNjb3JlU2V0Sm1wKCkgY29uc3QgeworICAgIHJldHVybiBVc2VVbmRlcnNjb3JlU2V0Sm1wOworICB9CisKKyAgLy8vIERldGVybWluZSBpZiB3ZSBzaG91bGQgdXNlIF9sb25nam1wIG9yIGxvbmdqbXAgdG8gaW1wbGVtZW50IGxsdm0ubG9uZ2ptcC4KKyAgYm9vbCB1c2VzVW5kZXJzY29yZUxvbmdKbXAoKSBjb25zdCB7CisgICAgcmV0dXJuIFVzZVVuZGVyc2NvcmVMb25nSm1wOworICB9CisKKyAgLy8vIFJldHVybiBsb3dlciBsaW1pdCBmb3IgbnVtYmVyIG9mIGJsb2NrcyBpbiBhIGp1bXAgdGFibGUuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TWluaW11bUp1bXBUYWJsZUVudHJpZXMoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGxvd2VyIGxpbWl0IG9mIHRoZSBkZW5zaXR5IGluIGEganVtcCB0YWJsZS4KKyAgdW5zaWduZWQgZ2V0TWluaW11bUp1bXBUYWJsZURlbnNpdHkoYm9vbCBPcHRGb3JTaXplKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHVwcGVyIGxpbWl0IGZvciBudW1iZXIgb2YgZW50cmllcyBpbiBhIGp1bXAgdGFibGUuCisgIC8vLyBaZXJvIGlmIG5vIGxpbWl0LgorICB1bnNpZ25lZCBnZXRNYXhpbXVtSnVtcFRhYmxlU2l6ZSgpIGNvbnN0OworCisgIHZpcnR1YWwgYm9vbCBpc0p1bXBUYWJsZVJlbGF0aXZlKCkgY29uc3QgeworICAgIHJldHVybiBUTS5pc1Bvc2l0aW9uSW5kZXBlbmRlbnQoKTsKKyAgfQorCisgIC8vLyBJZiBhIHBoeXNpY2FsIHJlZ2lzdGVyLCB0aGlzIHNwZWNpZmllcyB0aGUgcmVnaXN0ZXIgdGhhdAorICAvLy8gbGx2bS5zYXZlc3RhY2svbGx2bS5yZXN0b3Jlc3RhY2sgc2hvdWxkIHNhdmUgYW5kIHJlc3RvcmUuCisgIHVuc2lnbmVkIGdldFN0YWNrUG9pbnRlclJlZ2lzdGVyVG9TYXZlUmVzdG9yZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RhY2tQb2ludGVyUmVnaXN0ZXJUb1NhdmVSZXN0b3JlOworICB9CisKKyAgLy8vIElmIGEgcGh5c2ljYWwgcmVnaXN0ZXIsIHRoaXMgcmV0dXJucyB0aGUgcmVnaXN0ZXIgdGhhdCByZWNlaXZlcyB0aGUKKyAgLy8vIGV4Y2VwdGlvbiBhZGRyZXNzIG9uIGVudHJ5IHRvIGFuIEVIIHBhZC4KKyAgdmlydHVhbCB1bnNpZ25lZAorICBnZXRFeGNlcHRpb25Qb2ludGVyUmVnaXN0ZXIoY29uc3QgQ29uc3RhbnQgKlBlcnNvbmFsaXR5Rm4pIGNvbnN0IHsKKyAgICAvLyAwIGlzIGd1YXJhbnRlZWQgdG8gYmUgdGhlIE5vUmVnaXN0ZXIgdmFsdWUgb24gYWxsIHRhcmdldHMKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBJZiBhIHBoeXNpY2FsIHJlZ2lzdGVyLCB0aGlzIHJldHVybnMgdGhlIHJlZ2lzdGVyIHRoYXQgcmVjZWl2ZXMgdGhlCisgIC8vLyBleGNlcHRpb24gdHlwZWlkIG9uIGVudHJ5IHRvIGEgbGFuZGluZyBwYWQuCisgIHZpcnR1YWwgdW5zaWduZWQKKyAgZ2V0RXhjZXB0aW9uU2VsZWN0b3JSZWdpc3Rlcihjb25zdCBDb25zdGFudCAqUGVyc29uYWxpdHlGbikgY29uc3QgeworICAgIC8vIDAgaXMgZ3VhcmFudGVlZCB0byBiZSB0aGUgTm9SZWdpc3RlciB2YWx1ZSBvbiBhbGwgdGFyZ2V0cworICAgIHJldHVybiAwOworICB9CisKKyAgdmlydHVhbCBib29sIG5lZWRzRml4ZWRDYXRjaE9iamVjdHMoKSBjb25zdCB7CisgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJGdW5jbGV0IEVIIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyB0YXJnZXQiKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSB0YXJnZXQncyBqbXBfYnVmIHNpemUgaW4gYnl0ZXMgKGlmIG5ldmVyIHNldCwgdGhlIGRlZmF1bHQgaXMKKyAgLy8vIDIwMCkKKyAgdW5zaWduZWQgZ2V0SnVtcEJ1ZlNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIEp1bXBCdWZTaXplOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHRhcmdldCdzIGptcF9idWYgYWxpZ25tZW50IGluIGJ5dGVzIChpZiBuZXZlciBzZXQsIHRoZSBkZWZhdWx0CisgIC8vLyBpcyAwKQorICB1bnNpZ25lZCBnZXRKdW1wQnVmQWxpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBKdW1wQnVmQWxpZ25tZW50OworICB9CisKKyAgLy8vIFJldHVybiB0aGUgbWluaW11bSBzdGFjayBhbGlnbm1lbnQgb2YgYW4gYXJndW1lbnQuCisgIHVuc2lnbmVkIGdldE1pblN0YWNrQXJndW1lbnRBbGlnbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIE1pblN0YWNrQXJndW1lbnRBbGlnbm1lbnQ7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBtaW5pbXVtIGZ1bmN0aW9uIGFsaWdubWVudC4KKyAgdW5zaWduZWQgZ2V0TWluRnVuY3Rpb25BbGlnbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIE1pbkZ1bmN0aW9uQWxpZ25tZW50OworICB9CisKKyAgLy8vIFJldHVybiB0aGUgcHJlZmVycmVkIGZ1bmN0aW9uIGFsaWdubWVudC4KKyAgdW5zaWduZWQgZ2V0UHJlZkZ1bmN0aW9uQWxpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiBQcmVmRnVuY3Rpb25BbGlnbm1lbnQ7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBwcmVmZXJyZWQgbG9vcCBhbGlnbm1lbnQuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0UHJlZkxvb3BBbGlnbm1lbnQoTWFjaGluZUxvb3AgKk1MID0gbnVsbHB0cikgY29uc3QgeworICAgIHJldHVybiBQcmVmTG9vcEFsaWdubWVudDsKKyAgfQorCisgIC8vLyBJZiB0aGUgdGFyZ2V0IGhhcyBhIHN0YW5kYXJkIGxvY2F0aW9uIGZvciB0aGUgc3RhY2sgcHJvdGVjdG9yIGd1YXJkLAorICAvLy8gcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGF0IGxvY2F0aW9uLiBPdGhlcndpc2UsIHJldHVybnMgbnVsbHB0ci4KKyAgLy8vIERFUFJFQ0FURUQ6IHBsZWFzZSBvdmVycmlkZSB1c2VMb2FkU3RhY2tHdWFyZE5vZGUgYW5kIGN1c3RvbWl6ZQorICAvLy8gICAgICAgICAgICAgTE9BRF9TVEFDS19HVUFSRCwgb3IgY3VzdG9taXplIEBsbHZtLnN0YWNrZ3VhcmQoKS4KKyAgdmlydHVhbCBWYWx1ZSAqZ2V0SVJTdGFja0d1YXJkKElSQnVpbGRlcjw+ICZJUkIpIGNvbnN0OworCisgIC8vLyBJbnNlcnRzIG5lY2Vzc2FyeSBkZWNsYXJhdGlvbnMgZm9yIFNTUCAoc3RhY2sgcHJvdGVjdGlvbikgcHVycG9zZS4KKyAgLy8vIFNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbiBnZXRJUlN0YWNrR3VhcmQgcmV0dXJucyBudWxscHRyLgorICB2aXJ0dWFsIHZvaWQgaW5zZXJ0U1NQRGVjbGFyYXRpb25zKE1vZHVsZSAmTSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgdmFyaWFibGUgdGhhdCdzIHByZXZpb3VzbHkgaW5zZXJ0ZWQgYnkgaW5zZXJ0U1NQRGVjbGFyYXRpb25zLAorICAvLy8gaWYgYW55LCBvdGhlcndpc2UgcmV0dXJuIG51bGxwdHIuIFNob3VsZCBiZSB1c2VkIG9ubHkgd2hlbgorICAvLy8gZ2V0SVJTdGFja0d1YXJkIHJldHVybnMgbnVsbHB0ci4KKyAgdmlydHVhbCBWYWx1ZSAqZ2V0U0RhZ1N0YWNrR3VhcmQoY29uc3QgTW9kdWxlICZNKSBjb25zdDsKKworICAvLy8gSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUsIHN0YWNrIHByb3RlY3Rpb24gY2hlY2tzIHNob3VsZCBYT1IgdGhlCisgIC8vLyBmcmFtZSBwb2ludGVyIChvciB3aGljaGV2ZXIgcG9pbnRlciBpcyB1c2VkIHRvIGFkZHJlc3MgbG9jYWxzKSBpbnRvIHRoZQorICAvLy8gc3RhY2sgZ3VhcmQgdmFsdWUgYmVmb3JlIGNoZWNraW5nIGl0LiBnZXRJUlN0YWNrR3VhcmQgbXVzdCByZXR1cm4gbnVsbHB0cgorICAvLy8gaWYgdGhpcyByZXR1cm5zIHRydWUuCisgIHZpcnR1YWwgYm9vbCB1c2VTdGFja0d1YXJkWG9yRlAoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBJZiB0aGUgdGFyZ2V0IGhhcyBhIHN0YW5kYXJkIHN0YWNrIHByb3RlY3Rpb24gY2hlY2sgZnVuY3Rpb24gdGhhdAorICAvLy8gcGVyZm9ybXMgdmFsaWRhdGlvbiBhbmQgZXJyb3IgaGFuZGxpbmcsIHJldHVybnMgdGhlIGZ1bmN0aW9uLiBPdGhlcndpc2UsCisgIC8vLyByZXR1cm5zIG51bGxwdHIuIE11c3QgYmUgcHJldmlvdXNseSBpbnNlcnRlZCBieSBpbnNlcnRTU1BEZWNsYXJhdGlvbnMuCisgIC8vLyBTaG91bGQgYmUgdXNlZCBvbmx5IHdoZW4gZ2V0SVJTdGFja0d1YXJkIHJldHVybnMgbnVsbHB0ci4KKyAgdmlydHVhbCBWYWx1ZSAqZ2V0U1NQU3RhY2tHdWFyZENoZWNrKGNvbnN0IE1vZHVsZSAmTSkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgVmFsdWUgKmdldERlZmF1bHRTYWZlU3RhY2tQb2ludGVyTG9jYXRpb24oSVJCdWlsZGVyPD4gJklSQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVc2VUTFMpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBSZXR1cm5zIHRoZSB0YXJnZXQtc3BlY2lmaWMgYWRkcmVzcyBvZiB0aGUgdW5zYWZlIHN0YWNrIHBvaW50ZXIuCisgIHZpcnR1YWwgVmFsdWUgKmdldFNhZmVTdGFja1BvaW50ZXJMb2NhdGlvbihJUkJ1aWxkZXI8PiAmSVJCKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIHVzZWQgdG8gZW1pdCBzdGFjayBwcm9iZXMgb3IgdGhlIGVtcHR5CisgIC8vLyBzdHJpbmcgaWYgbm90IGFwcGxpY2FibGUuCisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldFN0YWNrUHJvYmVTeW1ib2xOYW1lKE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIGEgY2FzdCBiZXR3ZWVuIFNyY0FTIGFuZCBEZXN0QVMgaXMgYSBub29wLgorICB2aXJ0dWFsIGJvb2wgaXNOb29wQWRkclNwYWNlQ2FzdCh1bnNpZ25lZCBTcmNBUywgdW5zaWduZWQgRGVzdEFTKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhIGNhc3QgZnJvbSBTcmNBUyB0byBEZXN0QVMgaXMgImNoZWFwIiwgc3VjaCB0aGF0IGUuZy4gd2UKKyAgLy8vIGFyZSBoYXBweSB0byBzaW5rIGl0IGludG8gYmFzaWMgYmxvY2tzLgorICB2aXJ0dWFsIGJvb2wgaXNDaGVhcEFkZHJTcGFjZUNhc3QodW5zaWduZWQgU3JjQVMsIHVuc2lnbmVkIERlc3RBUykgY29uc3QgeworICAgIHJldHVybiBpc05vb3BBZGRyU3BhY2VDYXN0KFNyY0FTLCBEZXN0QVMpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBwb2ludGVyIGFyZ3VtZW50cyB0byBDSSBzaG91bGQgYmUgYWxpZ25lZCBieSBhbGlnbmluZworICAvLy8gdGhlIG9iamVjdCB3aG9zZSBhZGRyZXNzIGlzIGJlaW5nIHBhc3NlZC4gSWYgc28gdGhlbiBNaW5TaXplIGlzIHNldCB0byB0aGUKKyAgLy8vIG1pbmltdW0gc2l6ZSB0aGUgb2JqZWN0IG11c3QgYmUgdG8gYmUgYWxpZ25lZCBhbmQgUHJlZkFsaWduIGlzIHNldCB0byB0aGUKKyAgLy8vIHByZWZlcnJlZCBhbGlnbm1lbnQuCisgIHZpcnR1YWwgYm9vbCBzaG91bGRBbGlnblBvaW50ZXJBcmdzKENhbGxJbnN0ICogLypDSSovLCB1bnNpZ25lZCAmIC8qTWluU2l6ZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmIC8qUHJlZkFsaWduKi8pIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIFxuYW1lIEhlbHBlcnMgZm9yIFRhcmdldFRyYW5zZm9ybUluZm8gaW1wbGVtZW50YXRpb25zCisgIC8vLyBAeworCisgIC8vLyBHZXQgdGhlIElTRCBub2RlIHRoYXQgY29ycmVzcG9uZHMgdG8gdGhlIEluc3RydWN0aW9uIGNsYXNzIG9wY29kZS4KKyAgaW50IEluc3RydWN0aW9uT3Bjb2RlVG9JU0QodW5zaWduZWQgT3Bjb2RlKSBjb25zdDsKKworICAvLy8gRXN0aW1hdGUgdGhlIGNvc3Qgb2YgdHlwZS1sZWdhbGl6YXRpb24gYW5kIHRoZSBsZWdhbGl6ZWQgdHlwZS4KKyAgc3RkOjpwYWlyPGludCwgTVZUPiBnZXRUeXBlTGVnYWxpemF0aW9uQ29zdChjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpUeSkgY29uc3Q7CisKKyAgLy8vIEB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBcbmFtZSBIZWxwZXJzIGZvciBhdG9taWMgZXhwYW5zaW9uLgorICAvLy8gQHsKKworICAvLy8gUmV0dXJucyB0aGUgbWF4aW11bSBhdG9taWMgb3BlcmF0aW9uIHNpemUgKGluIGJpdHMpIHN1cHBvcnRlZCBieQorICAvLy8gdGhlIGJhY2tlbmQuIEF0b21pYyBvcGVyYXRpb25zIGdyZWF0ZXIgdGhhbiB0aGlzIHNpemUgKGFzIHdlbGwKKyAgLy8vIGFzIG9uZXMgdGhhdCBhcmUgbm90IG5hdHVyYWxseSBhbGlnbmVkKSwgd2lsbCBiZSBleHBhbmRlZCBieQorICAvLy8gQXRvbWljRXhwYW5kUGFzcyBpbnRvIGFuIF9fYXRvbWljXyogbGlicmFyeSBjYWxsLgorICB1bnNpZ25lZCBnZXRNYXhBdG9taWNTaXplSW5CaXRzU3VwcG9ydGVkKCkgY29uc3QgeworICAgIHJldHVybiBNYXhBdG9taWNTaXplSW5CaXRzU3VwcG9ydGVkOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHNpemUgb2YgdGhlIHNtYWxsZXN0IGNtcHhjaGcgb3IgbGwvc2MgaW5zdHJ1Y3Rpb24KKyAgLy8vIHRoZSBiYWNrZW5kIHN1cHBvcnRzLiAgQW55IHNtYWxsZXIgb3BlcmF0aW9ucyBhcmUgd2lkZW5lZCBpbgorICAvLy8gQXRvbWljRXhwYW5kUGFzcy4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgKnVubGlrZSogb3BlcmF0aW9ucyBhYm92ZSB0aGUgbWF4aW11bSBzaXplLCBhdG9taWMgb3BzCisgIC8vLyBhcmUgc3RpbGwgbmF0aXZlbHkgc3VwcG9ydGVkIGJlbG93IHRoZSBtaW5pbXVtOyB0aGV5IGp1c3QKKyAgLy8vIHJlcXVpcmUgYSBtb3JlIGNvbXBsZXggZXhwYW5zaW9uLgorICB1bnNpZ25lZCBnZXRNaW5DbXBYY2hnU2l6ZUluQml0cygpIGNvbnN0IHsgcmV0dXJuIE1pbkNtcFhjaGdTaXplSW5CaXRzOyB9CisKKyAgLy8vIFdoZXRoZXIgdGhlIHRhcmdldCBzdXBwb3J0cyB1bmFsaWduZWQgYXRvbWljIG9wZXJhdGlvbnMuCisgIGJvb2wgc3VwcG9ydHNVbmFsaWduZWRBdG9taWNzKCkgY29uc3QgeyByZXR1cm4gU3VwcG9ydHNVbmFsaWduZWRBdG9taWNzOyB9CisKKyAgLy8vIFdoZXRoZXIgQXRvbWljRXhwYW5kUGFzcyBzaG91bGQgYXV0b21hdGljYWxseSBpbnNlcnQgZmVuY2VzIGFuZCByZWR1Y2UKKyAgLy8vIG9yZGVyaW5nIGZvciB0aGlzIGF0b21pYy4gVGhpcyBzaG91bGQgYmUgdHJ1ZSBmb3IgbW9zdCBhcmNoaXRlY3R1cmVzIHdpdGgKKyAgLy8vIHdlYWsgbWVtb3J5IG9yZGVyaW5nLiBEZWZhdWx0cyB0byBmYWxzZS4KKyAgdmlydHVhbCBib29sIHNob3VsZEluc2VydEZlbmNlc0ZvckF0b21pYyhjb25zdCBJbnN0cnVjdGlvbiAqSSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBQZXJmb3JtIGEgbG9hZC1saW5rZWQgb3BlcmF0aW9uIG9uIEFkZHIsIHJldHVybmluZyBhICJWYWx1ZSAqIiB3aXRoIHRoZQorICAvLy8gY29ycmVzcG9uZGluZyBwb2ludGVlIHR5cGUuIFRoaXMgbWF5IGVudGFpbCBzb21lIG5vbi10cml2aWFsIG9wZXJhdGlvbnMgdG8KKyAgLy8vIHRydW5jYXRlIG9yIHJlY29uc3RydWN0IHR5cGVzIHRoYXQgd2lsbCBiZSBpbGxlZ2FsIGluIHRoZSBiYWNrZW5kLiBTZWUKKyAgLy8vIEFSTUlTZWxMb3dlcmluZyBmb3IgYW4gZXhhbXBsZSBpbXBsZW1lbnRhdGlvbi4KKyAgdmlydHVhbCBWYWx1ZSAqZW1pdExvYWRMaW5rZWQoSVJCdWlsZGVyPD4gJkJ1aWxkZXIsIFZhbHVlICpBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNPcmRlcmluZyBPcmQpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJMb2FkIGxpbmtlZCB1bmltcGxlbWVudGVkIG9uIHRoaXMgdGFyZ2V0Iik7CisgIH0KKworICAvLy8gUGVyZm9ybSBhIHN0b3JlLWNvbmRpdGlvbmFsIG9wZXJhdGlvbiB0byBBZGRyLiBSZXR1cm4gdGhlIHN0YXR1cyBvZiB0aGUKKyAgLy8vIHN0b3JlLiBUaGlzIHNob3VsZCBiZSAwIGlmIHRoZSBzdG9yZSBzdWNjZWVkZWQsIG5vbi16ZXJvIG90aGVyd2lzZS4KKyAgdmlydHVhbCBWYWx1ZSAqZW1pdFN0b3JlQ29uZGl0aW9uYWwoSVJCdWlsZGVyPD4gJkJ1aWxkZXIsIFZhbHVlICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpBZGRyLCBBdG9taWNPcmRlcmluZyBPcmQpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJTdG9yZSBjb25kaXRpb25hbCB1bmltcGxlbWVudGVkIG9uIHRoaXMgdGFyZ2V0Iik7CisgIH0KKworICAvLy8gSW5zZXJ0cyBpbiB0aGUgSVIgYSB0YXJnZXQtc3BlY2lmaWMgaW50cmluc2ljIHNwZWNpZnlpbmcgYSBmZW5jZS4KKyAgLy8vIEl0IGlzIGNhbGxlZCBieSBBdG9taWNFeHBhbmRQYXNzIGJlZm9yZSBleHBhbmRpbmcgYW4KKyAgLy8vICAgQXRvbWljUk1XL0F0b21pY0NtcFhjaGcvQXRvbWljU3RvcmUvQXRvbWljTG9hZAorICAvLy8gICBpZiBzaG91bGRJbnNlcnRGZW5jZXNGb3JBdG9taWMgcmV0dXJucyB0cnVlLgorICAvLy8KKyAgLy8vIEluc3QgaXMgdGhlIG9yaWdpbmFsIGF0b21pYyBpbnN0cnVjdGlvbiwgcHJpb3IgdG8gb3RoZXIgZXhwYW5zaW9ucyB0aGF0CisgIC8vLyBtYXkgYmUgcGVyZm9ybWVkLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGVpdGhlciByZXR1cm4gYSBudWxscHRyLCBvciBhIHBvaW50ZXIgdG8gYW4gSVItbGV2ZWwKKyAgLy8vICAgSW5zdHJ1Y3Rpb24qLiBFdmVuIGNvbXBsZXggZmVuY2Ugc2VxdWVuY2VzIGNhbiBiZSByZXByZXNlbnRlZCBieSBhCisgIC8vLyAgIHNpbmdsZSBJbnN0cnVjdGlvbiogdGhyb3VnaCBhbiBpbnRyaW5zaWMgdG8gYmUgbG93ZXJlZCBsYXRlci4KKyAgLy8vIEJhY2tlbmRzIHNob3VsZCBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBwcm9kdWNlIHRhcmdldC1zcGVjaWZpYyBpbnRyaW5zaWMKKyAgLy8vICAgZm9yIHRoZWlyIGZlbmNlcy4KKyAgLy8vIEZJWE1FOiBQbGVhc2Ugbm90ZSB0aGF0IHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGhlcmUgaW4gdGVybXMgb2YKKyAgLy8vICAgSVItbGV2ZWwgZmVuY2VzIGV4aXN0cyBmb3IgaGlzdG9yaWNhbC9jb21wYXRpYmlsaXR5IHJlYXNvbnMgYW5kIGlzCisgIC8vLyAgICp1bnNvdW5kKiAhIEZlbmNlcyBjYW5ub3QsIGluIGdlbmVyYWwsIGJlIHVzZWQgdG8gcmVzdG9yZSBzZXF1ZW50aWFsCisgIC8vLyAgIGNvbnNpc3RlbmN5LiBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBleGFtcGxlOgorICAvLy8gYXRvbWljPGludD4geCA9IHkgPSAwOworICAvLy8gaW50IHIxLCByMiwgcjMsIHI0OworICAvLy8gVGhyZWFkIDA6CisgIC8vLyAgIHguc3RvcmUoMSk7CisgIC8vLyBUaHJlYWQgMToKKyAgLy8vICAgeS5zdG9yZSgxKTsKKyAgLy8vIFRocmVhZCAyOgorICAvLy8gICByMSA9IHgubG9hZCgpOworICAvLy8gICByMiA9IHkubG9hZCgpOworICAvLy8gVGhyZWFkIDM6CisgIC8vLyAgIHIzID0geS5sb2FkKCk7CisgIC8vLyAgIHI0ID0geC5sb2FkKCk7CisgIC8vLyAgcjEgPSByMyA9IDEgYW5kIHIyID0gcjQgPSAwIGlzIGltcG9zc2libGUgYXMgbG9uZyBhcyB0aGUgYWNjZXNzZXMgYXJlIGFsbAorICAvLy8gIHNlcV9jc3QuIEJ1dCBpZiB0aGV5IGFyZSBsb3dlcmVkIHRvIG1vbm90b25pYyBhY2Nlc3Nlcywgbm8gYW1vdW50IG9mCisgIC8vLyAgSVItbGV2ZWwgZmVuY2VzIGNhbiBwcmV2ZW50IGl0LgorICAvLy8gQHsKKyAgdmlydHVhbCBJbnN0cnVjdGlvbiAqZW1pdExlYWRpbmdGZW5jZShJUkJ1aWxkZXI8PiAmQnVpbGRlciwgSW5zdHJ1Y3Rpb24gKkluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljT3JkZXJpbmcgT3JkKSBjb25zdCB7CisgICAgaWYgKGlzUmVsZWFzZU9yU3Ryb25nZXIoT3JkKSAmJiBJbnN0LT5oYXNBdG9taWNTdG9yZSgpKQorICAgICAgcmV0dXJuIEJ1aWxkZXIuQ3JlYXRlRmVuY2UoT3JkKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHZpcnR1YWwgSW5zdHJ1Y3Rpb24gKmVtaXRUcmFpbGluZ0ZlbmNlKElSQnVpbGRlcjw+ICZCdWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljT3JkZXJpbmcgT3JkKSBjb25zdCB7CisgICAgaWYgKGlzQWNxdWlyZU9yU3Ryb25nZXIoT3JkKSkKKyAgICAgIHJldHVybiBCdWlsZGVyLkNyZWF0ZUZlbmNlKE9yZCk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgLy8vIEB9CisKKyAgLy8gRW1pdHMgY29kZSB0aGF0IGV4ZWN1dGVzIHdoZW4gdGhlIGNvbXBhcmlzb24gcmVzdWx0IGluIHRoZSBsbC9zYworICAvLyBleHBhbnNpb24gb2YgYSBjbXB4Y2hnIGluc3RydWN0aW9uIGlzIHN1Y2ggdGhhdCB0aGUgc3RvcmUtY29uZGl0aW9uYWwgd2lsbAorICAvLyBub3QgZXhlY3V0ZS4gIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gYmFsYW5jZSBvdXQgdGhlIGxvYWQtbGlua2VkIHdpdGgKKyAgLy8gYSBkZWRpY2F0ZWQgaW5zdHJ1Y3Rpb24sIGlmIGRlc2lyZWQuCisgIC8vIEUuZy4sIG9uIEFSTSwgaWYgbGRyZXggaXNuJ3QgZm9sbG93ZWQgYnkgc3RyZXgsIHRoZSBleGNsdXNpdmUgbW9uaXRvciB3b3VsZAorICAvLyBiZSB1bm5lY2Vzc2FyaWx5IGhlbGQsIGV4Y2VwdCBpZiBjbHJleCwgaW5zZXJ0ZWQgYnkgdGhpcyBob29rLCBpcyBleGVjdXRlZC4KKyAgdmlydHVhbCB2b2lkIGVtaXRBdG9taWNDbXBYY2hnTm9TdG9yZUxMQmFsYW5jZShJUkJ1aWxkZXI8PiAmQnVpbGRlcikgY29uc3Qge30KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiAoYXRvbWljKSBzdG9yZSBzaG91bGQgYmUgZXhwYW5kZWQgYnkgdGhlCisgIC8vLyBJUi1sZXZlbCBBdG9taWNFeHBhbmQgcGFzcyBpbnRvIGFuICJhdG9taWMgeGNoZyIgd2hpY2ggaWdub3JlcyBpdHMgaW5wdXQuCisgIHZpcnR1YWwgYm9vbCBzaG91bGRFeHBhbmRBdG9taWNTdG9yZUluSVIoU3RvcmVJbnN0ICpTSSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYXJndW1lbnRzIHNob3VsZCBiZSBzaWduLWV4dGVuZGVkIGluIGxpYiBjYWxscy4KKyAgdmlydHVhbCBib29sIHNob3VsZFNpZ25FeHRlbmRUeXBlSW5MaWJDYWxsKEVWVCBUeXBlLCBib29sIElzU2lnbmVkKSBjb25zdCB7CisgICAgcmV0dXJuIElzU2lnbmVkOworICB9CisKKyAgLy8vIFJldHVybnMgaG93IHRoZSBnaXZlbiAoYXRvbWljKSBsb2FkIHNob3VsZCBiZSBleHBhbmRlZCBieSB0aGUKKyAgLy8vIElSLWxldmVsIEF0b21pY0V4cGFuZCBwYXNzLgorICB2aXJ0dWFsIEF0b21pY0V4cGFuc2lvbktpbmQgc2hvdWxkRXhwYW5kQXRvbWljTG9hZEluSVIoTG9hZEluc3QgKkxJKSBjb25zdCB7CisgICAgcmV0dXJuIEF0b21pY0V4cGFuc2lvbktpbmQ6Ok5vbmU7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBhdG9taWMgY21weGNoZyBzaG91bGQgYmUgZXhwYW5kZWQgYnkgdGhlCisgIC8vLyBJUi1sZXZlbCBBdG9taWNFeHBhbmQgcGFzcyBpbnRvIGEgbG9hZC1saW5rZWQvc3RvcmUtY29uZGl0aW9uYWwgc2VxdWVuY2UKKyAgLy8vICh0aHJvdWdoIGVtaXRMb2FkTGlua2VkKCkgYW5kIGVtaXRTdG9yZUNvbmRpdGlvbmFsKCkpLgorICB2aXJ0dWFsIGJvb2wgc2hvdWxkRXhwYW5kQXRvbWljQ21wWGNoZ0luSVIoQXRvbWljQ21wWGNoZ0luc3QgKkFJKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybnMgaG93IHRoZSBJUi1sZXZlbCBBdG9taWNFeHBhbmQgcGFzcyBzaG91bGQgZXhwYW5kIHRoZSBnaXZlbgorICAvLy8gQXRvbWljUk1XLCBpZiBhdCBhbGwuIERlZmF1bHQgaXMgdG8gbmV2ZXIgZXhwYW5kLgorICB2aXJ0dWFsIEF0b21pY0V4cGFuc2lvbktpbmQgc2hvdWxkRXhwYW5kQXRvbWljUk1XSW5JUihBdG9taWNSTVdJbnN0ICopIGNvbnN0IHsKKyAgICByZXR1cm4gQXRvbWljRXhwYW5zaW9uS2luZDo6Tm9uZTsKKyAgfQorCisgIC8vLyBPbiBzb21lIHBsYXRmb3JtcywgYW4gQXRvbWljUk1XIHRoYXQgbmV2ZXIgYWN0dWFsbHkgbW9kaWZpZXMgdGhlIHZhbHVlCisgIC8vLyAoc3VjaCBhcyBmZXRjaF9hZGQgb2YgMCkgY2FuIGJlIHR1cm5lZCBpbnRvIGEgZmVuY2UgZm9sbG93ZWQgYnkgYW4KKyAgLy8vIGF0b21pYyBsb2FkLiBUaGlzIG1heSBzb3VuZCB1c2VsZXNzLCBidXQgaXQgbWFrZXMgaXQgcG9zc2libGUgZm9yIHRoZQorICAvLy8gcHJvY2Vzc29yIHRvIGtlZXAgdGhlIGNhY2hlbGluZSBzaGFyZWQsIGRyYW1hdGljYWxseSBpbXByb3ZpbmcKKyAgLy8vIHBlcmZvcm1hbmNlLiBBbmQgc3VjaCBpZGVtcG90ZW50IFJNV3MgYXJlIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIHNvbWUKKyAgLy8vIGtpbmRzIG9mIGxvY2tzLCBzZWUgZm9yIGV4YW1wbGUgKGp1c3RpZmljYXRpb24gKyBiZW5jaG1hcmtzKToKKyAgLy8vIGh0dHA6Ly93d3cuaHBsLmhwLmNvbS90ZWNocmVwb3J0cy8yMDEyL0hQTC0yMDEyLTY4LnBkZgorICAvLy8gVGhpcyBtZXRob2QgdHJpZXMgZG9pbmcgdGhhdCB0cmFuc2Zvcm1hdGlvbiwgcmV0dXJuaW5nIHRoZSBhdG9taWMgbG9hZCBpZgorICAvLy8gaXQgc3VjY2VlZHMsIGFuZCBudWxscHRyIG90aGVyd2lzZS4KKyAgLy8vIElmIHNob3VsZEV4cGFuZEF0b21pY0xvYWRJbklSIHJldHVybnMgdHJ1ZSBvbiB0aGF0IGxvYWQsIGl0IHdpbGwgdW5kZXJnbworICAvLy8gYW5vdGhlciByb3VuZCBvZiBleHBhbnNpb24uCisgIHZpcnR1YWwgTG9hZEluc3QgKgorICBsb3dlcklkZW1wb3RlbnRSTVdJbnRvRmVuY2VkTG9hZChBdG9taWNSTVdJbnN0ICpSTVdJKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gUmV0dXJucyBob3cgdGhlIHBsYXRmb3JtJ3MgYXRvbWljIG9wZXJhdGlvbnMgYXJlIGV4dGVuZGVkIChaRVJPX0VYVEVORCwKKyAgLy8vIFNJR05fRVhURU5ELCBvciBBTllfRVhURU5EKS4KKyAgdmlydHVhbCBJU0Q6Ok5vZGVUeXBlIGdldEV4dGVuZEZvckF0b21pY09wcygpIGNvbnN0IHsKKyAgICByZXR1cm4gSVNEOjpaRVJPX0VYVEVORDsKKyAgfQorCisgIC8vLyBAfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgd2Ugc2hvdWxkIG5vcm1hbGl6ZQorICAvLy8gc2VsZWN0KE4wJk4xLCBYLCBZKSA9PiBzZWxlY3QoTjAsIHNlbGVjdChOMSwgWCwgWSksIFkpIGFuZAorICAvLy8gc2VsZWN0KE4wfE4xLCBYLCBZKSA9PiBzZWxlY3QoTjAsIHNlbGVjdChOMSwgWCwgWSwgWSkpIGlmIGl0IGlzIGxpa2VseQorICAvLy8gdGhhdCBpdCBzYXZlcyB1cyBmcm9tIG1hdGVyaWFsaXppbmcgTjAgYW5kIE4xIGluIGFuIGludGVnZXIgcmVnaXN0ZXIuCisgIC8vLyBUYXJnZXRzIHRoYXQgYXJlIGFibGUgdG8gcGVyZm9ybSBhbmQvb3Igb24gZmxhZ3Mgc2hvdWxkIHJldHVybiBmYWxzZSBoZXJlLgorICB2aXJ0dWFsIGJvb2wgc2hvdWxkTm9ybWFsaXplVG9TZWxlY3RTZXF1ZW5jZShMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIFZUKSBjb25zdCB7CisgICAgLy8gSWYgYSB0YXJnZXQgaGFzIG11bHRpcGxlIGNvbmRpdGlvbiByZWdpc3RlcnMsIHRoZW4gaXQgbGlrZWx5IGhhcyBsb2dpY2FsCisgICAgLy8gb3BlcmF0aW9ucyBvbiB0aG9zZSByZWdpc3RlcnMuCisgICAgaWYgKGhhc011bHRpcGxlQ29uZGl0aW9uUmVnaXN0ZXJzKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gT25seSBkbyB0aGUgdHJhbnNmb3JtIGlmIHRoZSB2YWx1ZSB3b24ndCBiZSBzcGxpdCBpbnRvIG11bHRpcGxlCisgICAgLy8gcmVnaXN0ZXJzLgorICAgIExlZ2FsaXplVHlwZUFjdGlvbiBBY3Rpb24gPSBnZXRUeXBlQWN0aW9uKENvbnRleHQsIFZUKTsKKyAgICByZXR1cm4gQWN0aW9uICE9IFR5cGVFeHBhbmRJbnRlZ2VyICYmIEFjdGlvbiAhPSBUeXBlRXhwYW5kRmxvYXQgJiYKKyAgICAgIEFjdGlvbiAhPSBUeXBlU3BsaXRWZWN0b3I7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgYSBzZWxlY3Qgb2YgY29uc3RhbnRzIChzZWxlY3QgQ29uZCwgQzEsIEMyKSBzaG91bGQgYmUKKyAgLy8vIHRyYW5zZm9ybWVkIGludG8gc2ltcGxlIG1hdGggb3BzIHdpdGggdGhlIGNvbmRpdGlvbiB2YWx1ZS4gRm9yIGV4YW1wbGU6CisgIC8vLyBzZWxlY3QgQ29uZCwgQzEsIEMxLTEgLS0+IGFkZCAoemV4dCBDb25kKSwgQzEtMQorICB2aXJ0dWFsIGJvb2wgY29udmVydFNlbGVjdE9mQ29uc3RhbnRzVG9NYXRoKEVWVCBWVCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBUYXJnZXRMb3dlcmluZyBDb25maWd1cmF0aW9uIE1ldGhvZHMgLSBUaGVzZSBtZXRob2RzIHNob3VsZCBiZSBpbnZva2VkIGJ5CisgIC8vIHRoZSBkZXJpdmVkIGNsYXNzIGNvbnN0cnVjdG9yIHRvIGNvbmZpZ3VyZSB0aGlzIG9iamVjdCBmb3IgdGhlIHRhcmdldC4KKyAgLy8KK3Byb3RlY3RlZDoKKyAgLy8vIFNwZWNpZnkgaG93IHRoZSB0YXJnZXQgZXh0ZW5kcyB0aGUgcmVzdWx0IG9mIGludGVnZXIgYW5kIGZsb2F0aW5nIHBvaW50CisgIC8vLyBib29sZWFuIHZhbHVlcyBmcm9tIGkxIHRvIGEgd2lkZXIgdHlwZS4gIFNlZSBnZXRCb29sZWFuQ29udGVudHMuCisgIHZvaWQgc2V0Qm9vbGVhbkNvbnRlbnRzKEJvb2xlYW5Db250ZW50IFR5KSB7CisgICAgQm9vbGVhbkNvbnRlbnRzID0gVHk7CisgICAgQm9vbGVhbkZsb2F0Q29udGVudHMgPSBUeTsKKyAgfQorCisgIC8vLyBTcGVjaWZ5IGhvdyB0aGUgdGFyZ2V0IGV4dGVuZHMgdGhlIHJlc3VsdCBvZiBpbnRlZ2VyIGFuZCBmbG9hdGluZyBwb2ludAorICAvLy8gYm9vbGVhbiB2YWx1ZXMgZnJvbSBpMSB0byBhIHdpZGVyIHR5cGUuICBTZWUgZ2V0Qm9vbGVhbkNvbnRlbnRzLgorICB2b2lkIHNldEJvb2xlYW5Db250ZW50cyhCb29sZWFuQ29udGVudCBJbnRUeSwgQm9vbGVhbkNvbnRlbnQgRmxvYXRUeSkgeworICAgIEJvb2xlYW5Db250ZW50cyA9IEludFR5OworICAgIEJvb2xlYW5GbG9hdENvbnRlbnRzID0gRmxvYXRUeTsKKyAgfQorCisgIC8vLyBTcGVjaWZ5IGhvdyB0aGUgdGFyZ2V0IGV4dGVuZHMgdGhlIHJlc3VsdCBvZiBhIHZlY3RvciBib29sZWFuIHZhbHVlIGZyb20gYQorICAvLy8gdmVjdG9yIG9mIGkxIHRvIGEgd2lkZXIgdHlwZS4gIFNlZSBnZXRCb29sZWFuQ29udGVudHMuCisgIHZvaWQgc2V0Qm9vbGVhblZlY3RvckNvbnRlbnRzKEJvb2xlYW5Db250ZW50IFR5KSB7CisgICAgQm9vbGVhblZlY3RvckNvbnRlbnRzID0gVHk7CisgIH0KKworICAvLy8gU3BlY2lmeSB0aGUgdGFyZ2V0IHNjaGVkdWxpbmcgcHJlZmVyZW5jZS4KKyAgdm9pZCBzZXRTY2hlZHVsaW5nUHJlZmVyZW5jZShTY2hlZDo6UHJlZmVyZW5jZSBQcmVmKSB7CisgICAgU2NoZWRQcmVmZXJlbmNlSW5mbyA9IFByZWY7CisgIH0KKworICAvLy8gSW5kaWNhdGUgd2hldGhlciB0aGlzIHRhcmdldCBwcmVmZXJzIHRvIHVzZSBfc2V0am1wIHRvIGltcGxlbWVudAorICAvLy8gbGx2bS5zZXRqbXAgb3IgdGhlIHZlcnNpb24gd2l0aG91dCBfLiAgRGVmYXVsdHMgdG8gZmFsc2UuCisgIHZvaWQgc2V0VXNlVW5kZXJzY29yZVNldEptcChib29sIFZhbCkgeworICAgIFVzZVVuZGVyc2NvcmVTZXRKbXAgPSBWYWw7CisgIH0KKworICAvLy8gSW5kaWNhdGUgd2hldGhlciB0aGlzIHRhcmdldCBwcmVmZXJzIHRvIHVzZSBfbG9uZ2ptcCB0byBpbXBsZW1lbnQKKyAgLy8vIGxsdm0ubG9uZ2ptcCBvciB0aGUgdmVyc2lvbiB3aXRob3V0IF8uICBEZWZhdWx0cyB0byBmYWxzZS4KKyAgdm9pZCBzZXRVc2VVbmRlcnNjb3JlTG9uZ0ptcChib29sIFZhbCkgeworICAgIFVzZVVuZGVyc2NvcmVMb25nSm1wID0gVmFsOworICB9CisKKyAgLy8vIEluZGljYXRlIHRoZSBtaW5pbXVtIG51bWJlciBvZiBibG9ja3MgdG8gZ2VuZXJhdGUganVtcCB0YWJsZXMuCisgIHZvaWQgc2V0TWluaW11bUp1bXBUYWJsZUVudHJpZXModW5zaWduZWQgVmFsKTsKKworICAvLy8gSW5kaWNhdGUgdGhlIG1heGltdW0gbnVtYmVyIG9mIGVudHJpZXMgaW4ganVtcCB0YWJsZXMuCisgIC8vLyBTZXQgdG8gemVybyB0byBnZW5lcmF0ZSB1bmxpbWl0ZWQganVtcCB0YWJsZXMuCisgIHZvaWQgc2V0TWF4aW11bUp1bXBUYWJsZVNpemUodW5zaWduZWQpOworCisgIC8vLyBJZiBzZXQgdG8gYSBwaHlzaWNhbCByZWdpc3RlciwgdGhpcyBzcGVjaWZpZXMgdGhlIHJlZ2lzdGVyIHRoYXQKKyAgLy8vIGxsdm0uc2F2ZXN0YWNrL2xsdm0ucmVzdG9yZXN0YWNrIHNob3VsZCBzYXZlIGFuZCByZXN0b3JlLgorICB2b2lkIHNldFN0YWNrUG9pbnRlclJlZ2lzdGVyVG9TYXZlUmVzdG9yZSh1bnNpZ25lZCBSKSB7CisgICAgU3RhY2tQb2ludGVyUmVnaXN0ZXJUb1NhdmVSZXN0b3JlID0gUjsKKyAgfQorCisgIC8vLyBUZWxscyB0aGUgY29kZSBnZW5lcmF0b3IgdGhhdCB0aGUgdGFyZ2V0IGhhcyBtdWx0aXBsZSAoYWxsb2NhdGFibGUpCisgIC8vLyBjb25kaXRpb24gcmVnaXN0ZXJzIHRoYXQgY2FuIGJlIHVzZWQgdG8gc3RvcmUgdGhlIHJlc3VsdHMgb2YgY29tcGFyaXNvbnMKKyAgLy8vIGZvciB1c2UgYnkgc2VsZWN0cyBhbmQgY29uZGl0aW9uYWwgYnJhbmNoZXMuIFdpdGggbXVsdGlwbGUgY29uZGl0aW9uCisgIC8vLyByZWdpc3RlcnMsIHRoZSBjb2RlIGdlbmVyYXRvciB3aWxsIG5vdCBhZ2dyZXNzaXZlbHkgc2luayBjb21wYXJpc29ucyBpbnRvCisgIC8vLyB0aGUgYmxvY2tzIG9mIHRoZWlyIHVzZXJzLgorICB2b2lkIHNldEhhc011bHRpcGxlQ29uZGl0aW9uUmVnaXN0ZXJzKGJvb2wgaGFzTWFueVJlZ3MgPSB0cnVlKSB7CisgICAgSGFzTXVsdGlwbGVDb25kaXRpb25SZWdpc3RlcnMgPSBoYXNNYW55UmVnczsKKyAgfQorCisgIC8vLyBUZWxscyB0aGUgY29kZSBnZW5lcmF0b3IgdGhhdCB0aGUgdGFyZ2V0IGhhcyBCaXRFeHRyYWN0IGluc3RydWN0aW9ucy4KKyAgLy8vIFRoZSBjb2RlIGdlbmVyYXRvciB3aWxsIGFnZ3Jlc3NpdmVseSBzaW5rICJzaGlmdCJzIGludG8gdGhlIGJsb2NrcyBvZgorICAvLy8gdGhlaXIgdXNlcnMgaWYgdGhlIHVzZXJzIHdpbGwgZ2VuZXJhdGUgImFuZCIgaW5zdHJ1Y3Rpb25zIHdoaWNoIGNhbiBiZQorICAvLy8gY29tYmluZWQgd2l0aCAic2hpZnQiIHRvIEJpdEV4dHJhY3QgaW5zdHJ1Y3Rpb25zLgorICB2b2lkIHNldEhhc0V4dHJhY3RCaXRzSW5zbihib29sIGhhc0V4dHJhY3RJbnNuID0gdHJ1ZSkgeworICAgIEhhc0V4dHJhY3RCaXRzSW5zbiA9IGhhc0V4dHJhY3RJbnNuOworICB9CisKKyAgLy8vIFRlbGxzIHRoZSBjb2RlIGdlbmVyYXRvciBub3QgdG8gZXhwYW5kIGxvZ2ljIG9wZXJhdGlvbnMgb24gY29tcGFyaXNvbgorICAvLy8gcHJlZGljYXRlcyBpbnRvIHNlcGFyYXRlIHNlcXVlbmNlcyB0aGF0IGluY3JlYXNlIHRoZSBhbW91bnQgb2YgZmxvdworICAvLy8gY29udHJvbC4KKyAgdm9pZCBzZXRKdW1wSXNFeHBlbnNpdmUoYm9vbCBpc0V4cGVuc2l2ZSA9IHRydWUpOworCisgIC8vLyBUZWxscyB0aGUgY29kZSBnZW5lcmF0b3IgdGhhdCB0aGlzIHRhcmdldCBzdXBwb3J0cyBmbG9hdGluZyBwb2ludAorICAvLy8gZXhjZXB0aW9ucyBhbmQgY2FyZXMgYWJvdXQgcHJlc2VydmluZyBmbG9hdGluZyBwb2ludCBleGNlcHRpb24gYmVoYXZpb3IuCisgIHZvaWQgc2V0SGFzRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnMoYm9vbCBGUEV4Y2VwdGlvbnMgPSB0cnVlKSB7CisgICAgSGFzRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnMgPSBGUEV4Y2VwdGlvbnM7CisgIH0KKworICAvLy8gVGVsbHMgdGhlIGNvZGUgZ2VuZXJhdG9yIHdoaWNoIGJpdHdpZHRocyB0byBieXBhc3MuCisgIHZvaWQgYWRkQnlwYXNzU2xvd0Rpdih1bnNpZ25lZCBpbnQgU2xvd0JpdFdpZHRoLCB1bnNpZ25lZCBpbnQgRmFzdEJpdFdpZHRoKSB7CisgICAgQnlwYXNzU2xvd0RpdldpZHRoc1tTbG93Qml0V2lkdGhdID0gRmFzdEJpdFdpZHRoOworICB9CisKKyAgLy8vIEFkZCB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGNsYXNzIGFzIGFuIGF2YWlsYWJsZSByZWdjbGFzcyBmb3IgdGhlCisgIC8vLyBzcGVjaWZpZWQgdmFsdWUgdHlwZS4gVGhpcyBpbmRpY2F0ZXMgdGhlIHNlbGVjdG9yIGNhbiBoYW5kbGUgdmFsdWVzIG9mCisgIC8vLyB0aGF0IGNsYXNzIG5hdGl2ZWx5LgorICB2b2lkIGFkZFJlZ2lzdGVyQ2xhc3MoTVZUIFZULCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgeworICAgIGFzc2VydCgodW5zaWduZWQpVlQuU2ltcGxlVHkgPCBhcnJheV9sZW5ndGhvZihSZWdDbGFzc0ZvclZUKSk7CisgICAgUmVnQ2xhc3NGb3JWVFtWVC5TaW1wbGVUeV0gPSBSQzsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGxhcmdlc3QgbGVnYWwgc3VwZXItcmVnIHJlZ2lzdGVyIGNsYXNzIG9mIHRoZSByZWdpc3RlciBjbGFzcworICAvLy8gZm9yIHRoZSBzcGVjaWZpZWQgdHlwZSBhbmQgaXRzIGFzc29jaWF0ZWQgImNvc3QiLgorICB2aXJ0dWFsIHN0ZDo6cGFpcjxjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICosIHVpbnQ4X3Q+CisgIGZpbmRSZXByZXNlbnRhdGl2ZUNsYXNzKGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJLCBNVlQgVlQpIGNvbnN0OworCisgIC8vLyBPbmNlIGFsbCBvZiB0aGUgcmVnaXN0ZXIgY2xhc3NlcyBhcmUgYWRkZWQsIHRoaXMgYWxsb3dzIHVzIHRvIGNvbXB1dGUKKyAgLy8vIGRlcml2ZWQgcHJvcGVydGllcyB3ZSBleHBvc2UuCisgIHZvaWQgY29tcHV0ZVJlZ2lzdGVyUHJvcGVydGllcyhjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSk7CisKKyAgLy8vIEluZGljYXRlIHRoYXQgdGhlIHNwZWNpZmllZCBvcGVyYXRpb24gZG9lcyBub3Qgd29yayB3aXRoIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHR5cGUgYW5kIGluZGljYXRlIHdoYXQgdG8gZG8gYWJvdXQgaXQuIE5vdGUgdGhhdCBWVCBtYXkgcmVmZXIgdG8gZWl0aGVyCisgIC8vLyB0aGUgdHlwZSBvZiBhIHJlc3VsdCBvciB0aGF0IG9mIGFuIG9wZXJhbmQgb2YgT3AuCisgIHZvaWQgc2V0T3BlcmF0aW9uQWN0aW9uKHVuc2lnbmVkIE9wLCBNVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIExlZ2FsaXplQWN0aW9uIEFjdGlvbikgeworICAgIGFzc2VydChPcCA8IGFycmF5X2xlbmd0aG9mKE9wQWN0aW9uc1swXSkgJiYgIlRhYmxlIGlzbid0IGJpZyBlbm91Z2ghIik7CisgICAgT3BBY3Rpb25zWyh1bnNpZ25lZClWVC5TaW1wbGVUeV1bT3BdID0gQWN0aW9uOworICB9CisKKyAgLy8vIEluZGljYXRlIHRoYXQgdGhlIHNwZWNpZmllZCBsb2FkIHdpdGggZXh0ZW5zaW9uIGRvZXMgbm90IHdvcmsgd2l0aCB0aGUKKyAgLy8vIHNwZWNpZmllZCB0eXBlIGFuZCBpbmRpY2F0ZSB3aGF0IHRvIGRvIGFib3V0IGl0LgorICB2b2lkIHNldExvYWRFeHRBY3Rpb24odW5zaWduZWQgRXh0VHlwZSwgTVZUIFZhbFZULCBNVlQgTWVtVlQsCisgICAgICAgICAgICAgICAgICAgICAgICBMZWdhbGl6ZUFjdGlvbiBBY3Rpb24pIHsKKyAgICBhc3NlcnQoRXh0VHlwZSA8IElTRDo6TEFTVF9MT0FERVhUX1RZUEUgJiYgVmFsVlQuaXNWYWxpZCgpICYmCisgICAgICAgICAgIE1lbVZULmlzVmFsaWQoKSAmJiAiVGFibGUgaXNuJ3QgYmlnIGVub3VnaCEiKTsKKyAgICBhc3NlcnQoKHVuc2lnbmVkKUFjdGlvbiA8IDB4MTAgJiYgInRvbyBtYW55IGJpdHMgZm9yIGJpdGZpZWxkIGFycmF5Iik7CisgICAgdW5zaWduZWQgU2hpZnQgPSA0ICogRXh0VHlwZTsKKyAgICBMb2FkRXh0QWN0aW9uc1tWYWxWVC5TaW1wbGVUeV1bTWVtVlQuU2ltcGxlVHldICY9IH4oKHVpbnQxNl90KTB4RiA8PCBTaGlmdCk7CisgICAgTG9hZEV4dEFjdGlvbnNbVmFsVlQuU2ltcGxlVHldW01lbVZULlNpbXBsZVR5XSB8PSAodWludDE2X3QpQWN0aW9uIDw8IFNoaWZ0OworICB9CisKKyAgLy8vIEluZGljYXRlIHRoYXQgdGhlIHNwZWNpZmllZCB0cnVuY2F0aW5nIHN0b3JlIGRvZXMgbm90IHdvcmsgd2l0aCB0aGUKKyAgLy8vIHNwZWNpZmllZCB0eXBlIGFuZCBpbmRpY2F0ZSB3aGF0IHRvIGRvIGFib3V0IGl0LgorICB2b2lkIHNldFRydW5jU3RvcmVBY3Rpb24oTVZUIFZhbFZULCBNVlQgTWVtVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMZWdhbGl6ZUFjdGlvbiBBY3Rpb24pIHsKKyAgICBhc3NlcnQoVmFsVlQuaXNWYWxpZCgpICYmIE1lbVZULmlzVmFsaWQoKSAmJiAiVGFibGUgaXNuJ3QgYmlnIGVub3VnaCEiKTsKKyAgICBUcnVuY1N0b3JlQWN0aW9uc1sodW5zaWduZWQpVmFsVlQuU2ltcGxlVHldW01lbVZULlNpbXBsZVR5XSA9IEFjdGlvbjsKKyAgfQorCisgIC8vLyBJbmRpY2F0ZSB0aGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhlZCBsb2FkIGRvZXMgb3IgZG9lcyBub3Qgd29yayB3aXRoIHRoZQorICAvLy8gc3BlY2lmaWVkIHR5cGUgYW5kIGluZGljYXRlIHdoYXQgdG8gZG8gYWJvcnQgaXQuCisgIC8vLworICAvLy8gTk9URTogQWxsIGluZGV4ZWQgbW9kZSBsb2FkcyBhcmUgaW5pdGlhbGl6ZWQgdG8gRXhwYW5kIGluCisgIC8vLyBUYXJnZXRMb3dlcmluZy5jcHAKKyAgdm9pZCBzZXRJbmRleGVkTG9hZEFjdGlvbih1bnNpZ25lZCBJZHhNb2RlLCBNVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWxpemVBY3Rpb24gQWN0aW9uKSB7CisgICAgYXNzZXJ0KFZULmlzVmFsaWQoKSAmJiBJZHhNb2RlIDwgSVNEOjpMQVNUX0lOREVYRURfTU9ERSAmJgorICAgICAgICAgICAodW5zaWduZWQpQWN0aW9uIDwgMHhmICYmICJUYWJsZSBpc24ndCBiaWcgZW5vdWdoISIpOworICAgIC8vIExvYWQgYWN0aW9uIGFyZSBrZXB0IGluIHRoZSB1cHBlciBoYWxmLgorICAgIEluZGV4ZWRNb2RlQWN0aW9uc1sodW5zaWduZWQpVlQuU2ltcGxlVHldW0lkeE1vZGVdICY9IH4weGYwOworICAgIEluZGV4ZWRNb2RlQWN0aW9uc1sodW5zaWduZWQpVlQuU2ltcGxlVHldW0lkeE1vZGVdIHw9ICgodWludDhfdClBY3Rpb24pIDw8NDsKKyAgfQorCisgIC8vLyBJbmRpY2F0ZSB0aGF0IHRoZSBzcGVjaWZpZWQgaW5kZXhlZCBzdG9yZSBkb2VzIG9yIGRvZXMgbm90IHdvcmsgd2l0aCB0aGUKKyAgLy8vIHNwZWNpZmllZCB0eXBlIGFuZCBpbmRpY2F0ZSB3aGF0IHRvIGRvIGFib3V0IGl0LgorICAvLy8KKyAgLy8vIE5PVEU6IEFsbCBpbmRleGVkIG1vZGUgc3RvcmVzIGFyZSBpbml0aWFsaXplZCB0byBFeHBhbmQgaW4KKyAgLy8vIFRhcmdldExvd2VyaW5nLmNwcAorICB2b2lkIHNldEluZGV4ZWRTdG9yZUFjdGlvbih1bnNpZ25lZCBJZHhNb2RlLCBNVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExlZ2FsaXplQWN0aW9uIEFjdGlvbikgeworICAgIGFzc2VydChWVC5pc1ZhbGlkKCkgJiYgSWR4TW9kZSA8IElTRDo6TEFTVF9JTkRFWEVEX01PREUgJiYKKyAgICAgICAgICAgKHVuc2lnbmVkKUFjdGlvbiA8IDB4ZiAmJiAiVGFibGUgaXNuJ3QgYmlnIGVub3VnaCEiKTsKKyAgICAvLyBTdG9yZSBhY3Rpb24gYXJlIGtlcHQgaW4gdGhlIGxvd2VyIGhhbGYuCisgICAgSW5kZXhlZE1vZGVBY3Rpb25zWyh1bnNpZ25lZClWVC5TaW1wbGVUeV1bSWR4TW9kZV0gJj0gfjB4MGY7CisgICAgSW5kZXhlZE1vZGVBY3Rpb25zWyh1bnNpZ25lZClWVC5TaW1wbGVUeV1bSWR4TW9kZV0gfD0gKCh1aW50OF90KUFjdGlvbik7CisgIH0KKworICAvLy8gSW5kaWNhdGUgdGhhdCB0aGUgc3BlY2lmaWVkIGNvbmRpdGlvbiBjb2RlIGlzIG9yIGlzbid0IHN1cHBvcnRlZCBvbiB0aGUKKyAgLy8vIHRhcmdldCBhbmQgaW5kaWNhdGUgd2hhdCB0byBkbyBhYm91dCBpdC4KKyAgdm9pZCBzZXRDb25kQ29kZUFjdGlvbihJU0Q6OkNvbmRDb2RlIENDLCBNVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgTGVnYWxpemVBY3Rpb24gQWN0aW9uKSB7CisgICAgYXNzZXJ0KFZULmlzVmFsaWQoKSAmJiAodW5zaWduZWQpQ0MgPCBhcnJheV9sZW5ndGhvZihDb25kQ29kZUFjdGlvbnMpICYmCisgICAgICAgICAgICJUYWJsZSBpc24ndCBiaWcgZW5vdWdoISIpOworICAgIGFzc2VydCgodW5zaWduZWQpQWN0aW9uIDwgMHgxMCAmJiAidG9vIG1hbnkgYml0cyBmb3IgYml0ZmllbGQgYXJyYXkiKTsKKyAgICAvLy8gVGhlIGxvd2VyIDMgYml0cyBvZiB0aGUgU2ltcGxlVHkgaW5kZXggaW50byBOdGggNGJpdCBzZXQgZnJvbSB0aGUgMzItYml0CisgICAgLy8vIHZhbHVlIGFuZCB0aGUgdXBwZXIgMjkgYml0cyBpbmRleCBpbnRvIHRoZSBzZWNvbmQgZGltZW5zaW9uIG9mIHRoZSBhcnJheQorICAgIC8vLyB0byBzZWxlY3Qgd2hhdCAzMi1iaXQgdmFsdWUgdG8gdXNlLgorICAgIHVpbnQzMl90IFNoaWZ0ID0gNCAqIChWVC5TaW1wbGVUeSAmIDB4Nyk7CisgICAgQ29uZENvZGVBY3Rpb25zW0NDXVtWVC5TaW1wbGVUeSA+PiAzXSAmPSB+KCh1aW50MzJfdCkweEYgPDwgU2hpZnQpOworICAgIENvbmRDb2RlQWN0aW9uc1tDQ11bVlQuU2ltcGxlVHkgPj4gM10gfD0gKHVpbnQzMl90KUFjdGlvbiA8PCBTaGlmdDsKKyAgfQorCisgIC8vLyBJZiBPcGMvT3JpZ1ZUIGlzIHNwZWNpZmllZCBhcyBiZWluZyBwcm9tb3RlZCwgdGhlIHByb21vdGlvbiBjb2RlIGRlZmF1bHRzCisgIC8vLyB0byB0cnlpbmcgYSBsYXJnZXIgaW50ZWdlci9mcCB1bnRpbCBpdCBjYW4gZmluZCBvbmUgdGhhdCB3b3Jrcy4gSWYgdGhhdAorICAvLy8gZGVmYXVsdCBpcyBpbnN1ZmZpY2llbnQsIHRoaXMgbWV0aG9kIGNhbiBiZSB1c2VkIGJ5IHRoZSB0YXJnZXQgdG8gb3ZlcnJpZGUKKyAgLy8vIHRoZSBkZWZhdWx0LgorICB2b2lkIEFkZFByb21vdGVkVG9UeXBlKHVuc2lnbmVkIE9wYywgTVZUIE9yaWdWVCwgTVZUIERlc3RWVCkgeworICAgIFByb21vdGVUb1R5cGVbc3RkOjptYWtlX3BhaXIoT3BjLCBPcmlnVlQuU2ltcGxlVHkpXSA9IERlc3RWVC5TaW1wbGVUeTsKKyAgfQorCisgIC8vLyBDb252ZW5pZW5jZSBtZXRob2QgdG8gc2V0IGFuIG9wZXJhdGlvbiB0byBQcm9tb3RlIGFuZCBzcGVjaWZ5IHRoZSB0eXBlCisgIC8vLyBpbiBhIHNpbmdsZSBjYWxsLgorICB2b2lkIHNldE9wZXJhdGlvblByb21vdGVkVG9UeXBlKHVuc2lnbmVkIE9wYywgTVZUIE9yaWdWVCwgTVZUIERlc3RWVCkgeworICAgIHNldE9wZXJhdGlvbkFjdGlvbihPcGMsIE9yaWdWVCwgUHJvbW90ZSk7CisgICAgQWRkUHJvbW90ZWRUb1R5cGUoT3BjLCBPcmlnVlQsIERlc3RWVCk7CisgIH0KKworICAvLy8gVGFyZ2V0cyBzaG91bGQgaW52b2tlIHRoaXMgbWV0aG9kIGZvciBlYWNoIHRhcmdldCBpbmRlcGVuZGVudCBub2RlIHRoYXQKKyAgLy8vIHRoZXkgd2FudCB0byBwcm92aWRlIGEgY3VzdG9tIERBRyBjb21iaW5lciBmb3IgYnkgaW1wbGVtZW50aW5nIHRoZQorICAvLy8gUGVyZm9ybURBR0NvbWJpbmUgdmlydHVhbCBtZXRob2QuCisgIHZvaWQgc2V0VGFyZ2V0REFHQ29tYmluZShJU0Q6Ok5vZGVUeXBlIE5UKSB7CisgICAgYXNzZXJ0KHVuc2lnbmVkKE5UID4+IDMpIDwgYXJyYXlfbGVuZ3Rob2YoVGFyZ2V0REFHQ29tYmluZUFycmF5KSk7CisgICAgVGFyZ2V0REFHQ29tYmluZUFycmF5W05UID4+IDNdIHw9IDEgPDwgKE5UJjcpOworICB9CisKKyAgLy8vIFNldCB0aGUgdGFyZ2V0J3MgcmVxdWlyZWQgam1wX2J1ZiBidWZmZXIgc2l6ZSAoaW4gYnl0ZXMpOyBkZWZhdWx0IGlzIDIwMAorICB2b2lkIHNldEp1bXBCdWZTaXplKHVuc2lnbmVkIFNpemUpIHsKKyAgICBKdW1wQnVmU2l6ZSA9IFNpemU7CisgIH0KKworICAvLy8gU2V0IHRoZSB0YXJnZXQncyByZXF1aXJlZCBqbXBfYnVmIGJ1ZmZlciBhbGlnbm1lbnQgKGluIGJ5dGVzKTsgZGVmYXVsdCBpcworICAvLy8gMAorICB2b2lkIHNldEp1bXBCdWZBbGlnbm1lbnQodW5zaWduZWQgQWxpZ24pIHsKKyAgICBKdW1wQnVmQWxpZ25tZW50ID0gQWxpZ247CisgIH0KKworICAvLy8gU2V0IHRoZSB0YXJnZXQncyBtaW5pbXVtIGZ1bmN0aW9uIGFsaWdubWVudCAoaW4gbG9nMihieXRlcykpCisgIHZvaWQgc2V0TWluRnVuY3Rpb25BbGlnbm1lbnQodW5zaWduZWQgQWxpZ24pIHsKKyAgICBNaW5GdW5jdGlvbkFsaWdubWVudCA9IEFsaWduOworICB9CisKKyAgLy8vIFNldCB0aGUgdGFyZ2V0J3MgcHJlZmVycmVkIGZ1bmN0aW9uIGFsaWdubWVudC4gIFRoaXMgc2hvdWxkIGJlIHNldCBpZgorICAvLy8gdGhlcmUgaXMgYSBwZXJmb3JtYW5jZSBiZW5lZml0IHRvIGhpZ2hlci10aGFuLW1pbmltdW0gYWxpZ25tZW50IChpbgorICAvLy8gbG9nMihieXRlcykpCisgIHZvaWQgc2V0UHJlZkZ1bmN0aW9uQWxpZ25tZW50KHVuc2lnbmVkIEFsaWduKSB7CisgICAgUHJlZkZ1bmN0aW9uQWxpZ25tZW50ID0gQWxpZ247CisgIH0KKworICAvLy8gU2V0IHRoZSB0YXJnZXQncyBwcmVmZXJyZWQgbG9vcCBhbGlnbm1lbnQuIERlZmF1bHQgYWxpZ25tZW50IGlzIHplcm8sIGl0CisgIC8vLyBtZWFucyB0aGUgdGFyZ2V0IGRvZXMgbm90IGNhcmUgYWJvdXQgbG9vcCBhbGlnbm1lbnQuICBUaGUgYWxpZ25tZW50IGlzCisgIC8vLyBzcGVjaWZpZWQgaW4gbG9nMihieXRlcykuIFRoZSB0YXJnZXQgbWF5IGFsc28gb3ZlcnJpZGUKKyAgLy8vIGdldFByZWZMb29wQWxpZ25tZW50IHRvIHByb3ZpZGUgcGVyLWxvb3AgdmFsdWVzLgorICB2b2lkIHNldFByZWZMb29wQWxpZ25tZW50KHVuc2lnbmVkIEFsaWduKSB7CisgICAgUHJlZkxvb3BBbGlnbm1lbnQgPSBBbGlnbjsKKyAgfQorCisgIC8vLyBTZXQgdGhlIG1pbmltdW0gc3RhY2sgYWxpZ25tZW50IG9mIGFuIGFyZ3VtZW50IChpbiBsb2cyKGJ5dGVzKSkuCisgIHZvaWQgc2V0TWluU3RhY2tBcmd1bWVudEFsaWdubWVudCh1bnNpZ25lZCBBbGlnbikgeworICAgIE1pblN0YWNrQXJndW1lbnRBbGlnbm1lbnQgPSBBbGlnbjsKKyAgfQorCisgIC8vLyBTZXQgdGhlIG1heGltdW0gYXRvbWljIG9wZXJhdGlvbiBzaXplIHN1cHBvcnRlZCBieSB0aGUKKyAgLy8vIGJhY2tlbmQuIEF0b21pYyBvcGVyYXRpb25zIGdyZWF0ZXIgdGhhbiB0aGlzIHNpemUgKGFzIHdlbGwgYXMKKyAgLy8vIG9uZXMgdGhhdCBhcmUgbm90IG5hdHVyYWxseSBhbGlnbmVkKSwgd2lsbCBiZSBleHBhbmRlZCBieQorICAvLy8gQXRvbWljRXhwYW5kUGFzcyBpbnRvIGFuIF9fYXRvbWljXyogbGlicmFyeSBjYWxsLgorICB2b2lkIHNldE1heEF0b21pY1NpemVJbkJpdHNTdXBwb3J0ZWQodW5zaWduZWQgU2l6ZUluQml0cykgeworICAgIE1heEF0b21pY1NpemVJbkJpdHNTdXBwb3J0ZWQgPSBTaXplSW5CaXRzOworICB9CisKKyAgLy8vIFNldHMgdGhlIG1pbmltdW0gY21weGNoZyBvciBsbC9zYyBzaXplIHN1cHBvcnRlZCBieSB0aGUgYmFja2VuZC4KKyAgdm9pZCBzZXRNaW5DbXBYY2hnU2l6ZUluQml0cyh1bnNpZ25lZCBTaXplSW5CaXRzKSB7CisgICAgTWluQ21wWGNoZ1NpemVJbkJpdHMgPSBTaXplSW5CaXRzOworICB9CisKKyAgLy8vIFNldHMgd2hldGhlciB1bmFsaWduZWQgYXRvbWljIG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZC4KKyAgdm9pZCBzZXRTdXBwb3J0c1VuYWxpZ25lZEF0b21pY3MoYm9vbCBVbmFsaWduZWRTdXBwb3J0ZWQpIHsKKyAgICBTdXBwb3J0c1VuYWxpZ25lZEF0b21pY3MgPSBVbmFsaWduZWRTdXBwb3J0ZWQ7CisgIH0KKworcHVibGljOgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQWRkcmVzc2luZyBtb2RlIGRlc2NyaXB0aW9uIGhvb2tzICh1c2VkIGJ5IExTUiBldGMpLgorICAvLworCisgIC8vLyBDb2RlR2VuUHJlcGFyZSBzaW5rcyBhZGRyZXNzIGNhbGN1bGF0aW9ucyBpbnRvIHRoZSBzYW1lIEJCIGFzIExvYWQvU3RvcmUKKyAgLy8vIGluc3RydWN0aW9ucyByZWFkaW5nIHRoZSBhZGRyZXNzLiBUaGlzIGFsbG93cyBhcyBtdWNoIGNvbXB1dGF0aW9uIGFzCisgIC8vLyBwb3NzaWJsZSB0byBiZSBkb25lIGluIHRoZSBhZGRyZXNzIG1vZGUgZm9yIHRoYXQgb3BlcmFuZC4gVGhpcyBob29rIGxldHMKKyAgLy8vIHRhcmdldHMgYWxzbyBwYXNzIGJhY2sgd2hlbiB0aGlzIHNob3VsZCBiZSBkb25lIG9uIGludHJpbnNpY3Mgd2hpY2gKKyAgLy8vIGxvYWQvc3RvcmUuCisgIHZpcnR1YWwgYm9vbCBnZXRBZGRyTW9kZUFyZ3VtZW50cyhJbnRyaW5zaWNJbnN0ICogLypJKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VmFsdWUqPiAmLypPcHMqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKiYvKkFjY2Vzc1R5Ki8pIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gVGhpcyByZXByZXNlbnRzIGFuIGFkZHJlc3NpbmcgbW9kZSBvZjoKKyAgLy8vICAgIEJhc2VHViArIEJhc2VPZmZzICsgQmFzZVJlZyArIFNjYWxlKlNjYWxlUmVnCisgIC8vLyBJZiBCYXNlR1YgaXMgbnVsbCwgIHRoZXJlIGlzIG5vIEJhc2VHVi4KKyAgLy8vIElmIEJhc2VPZmZzIGlzIHplcm8sIHRoZXJlIGlzIG5vIGJhc2Ugb2Zmc2V0LgorICAvLy8gSWYgSGFzQmFzZVJlZyBpcyBmYWxzZSwgdGhlcmUgaXMgbm8gYmFzZSByZWdpc3Rlci4KKyAgLy8vIElmIFNjYWxlIGlzIHplcm8sIHRoZXJlIGlzIG5vIFNjYWxlUmVnLiAgU2NhbGUgb2YgMSBpbmRpY2F0ZXMgYSByZWcgd2l0aAorICAvLy8gbm8gc2NhbGUuCisgIHN0cnVjdCBBZGRyTW9kZSB7CisgICAgR2xvYmFsVmFsdWUgKkJhc2VHViA9IG51bGxwdHI7CisgICAgaW50NjRfdCAgICAgIEJhc2VPZmZzID0gMDsKKyAgICBib29sICAgICAgICAgSGFzQmFzZVJlZyA9IGZhbHNlOworICAgIGludDY0X3QgICAgICBTY2FsZSA9IDA7CisgICAgQWRkck1vZGUoKSA9IGRlZmF1bHQ7CisgIH07CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBhZGRyZXNzaW5nIG1vZGUgcmVwcmVzZW50ZWQgYnkgQU0gaXMgbGVnYWwgZm9yIHRoaXMKKyAgLy8vIHRhcmdldCwgZm9yIGEgbG9hZC9zdG9yZSBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCisgIC8vLworICAvLy8gVGhlIHR5cGUgbWF5IGJlIFZvaWRUeSwgaW4gd2hpY2ggY2FzZSBvbmx5IHJldHVybiB0cnVlIGlmIHRoZSBhZGRyZXNzaW5nCisgIC8vLyBtb2RlIGlzIGxlZ2FsIGZvciBhIGxvYWQvc3RvcmUgb2YgYW55IGxlZ2FsIHR5cGUuICBUT0RPOiBIYW5kbGUKKyAgLy8vIHByZS9wb3N0aW5jIGFzIHdlbGwuCisgIC8vLworICAvLy8gSWYgdGhlIGFkZHJlc3Mgc3BhY2UgY2Fubm90IGJlIGRldGVybWluZWQsIGl0IHdpbGwgYmUgLTEuCisgIC8vLworICAvLy8gVE9ETzogUmVtb3ZlIGRlZmF1bHQgYXJndW1lbnQKKyAgdmlydHVhbCBib29sIGlzTGVnYWxBZGRyZXNzaW5nTW9kZShjb25zdCBEYXRhTGF5b3V0ICZETCwgY29uc3QgQWRkck1vZGUgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKlR5LCB1bnNpZ25lZCBBZGRyU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkkgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgY29zdCBvZiB0aGUgc2NhbGluZyBmYWN0b3IgdXNlZCBpbiB0aGUgYWRkcmVzc2luZyBtb2RlCisgIC8vLyByZXByZXNlbnRlZCBieSBBTSBmb3IgdGhpcyB0YXJnZXQsIGZvciBhIGxvYWQvc3RvcmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorICAvLy8KKyAgLy8vIElmIHRoZSBBTSBpcyBzdXBwb3J0ZWQsIHRoZSByZXR1cm4gdmFsdWUgbXVzdCBiZSA+PSAwLgorICAvLy8gSWYgdGhlIEFNIGlzIG5vdCBzdXBwb3J0ZWQsIGl0IHJldHVybnMgYSBuZWdhdGl2ZSB2YWx1ZS4KKyAgLy8vIFRPRE86IEhhbmRsZSBwcmUvcG9zdGluYyBhcyB3ZWxsLgorICAvLy8gVE9ETzogUmVtb3ZlIGRlZmF1bHQgYXJndW1lbnQKKyAgdmlydHVhbCBpbnQgZ2V0U2NhbGluZ0ZhY3RvckNvc3QoY29uc3QgRGF0YUxheW91dCAmREwsIGNvbnN0IEFkZHJNb2RlICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqVHksIHVuc2lnbmVkIEFTID0gMCkgY29uc3QgeworICAgIC8vIERlZmF1bHQ6IGFzc3VtZSB0aGF0IGFueSBzY2FsaW5nIGZhY3RvciB1c2VkIGluIGEgbGVnYWwgQU0gaXMgZnJlZS4KKyAgICBpZiAoaXNMZWdhbEFkZHJlc3NpbmdNb2RlKERMLCBBTSwgVHksIEFTKSkKKyAgICAgIHJldHVybiAwOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGltbWVkaWF0ZSBpcyBsZWdhbCBpY21wIGltbWVkaWF0ZSwgdGhhdCBpcworICAvLy8gdGhlIHRhcmdldCBoYXMgaWNtcCBpbnN0cnVjdGlvbnMgd2hpY2ggY2FuIGNvbXBhcmUgYSByZWdpc3RlciBhZ2FpbnN0IHRoZQorICAvLy8gaW1tZWRpYXRlIHdpdGhvdXQgaGF2aW5nIHRvIG1hdGVyaWFsaXplIHRoZSBpbW1lZGlhdGUgaW50byBhIHJlZ2lzdGVyLgorICB2aXJ0dWFsIGJvb2wgaXNMZWdhbElDbXBJbW1lZGlhdGUoaW50NjRfdCkgY29uc3QgeworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW1tZWRpYXRlIGlzIGxlZ2FsIGFkZCBpbW1lZGlhdGUsIHRoYXQgaXMgdGhlCisgIC8vLyB0YXJnZXQgaGFzIGFkZCBpbnN0cnVjdGlvbnMgd2hpY2ggY2FuIGFkZCBhIHJlZ2lzdGVyIHdpdGggdGhlIGltbWVkaWF0ZQorICAvLy8gd2l0aG91dCBoYXZpbmcgdG8gbWF0ZXJpYWxpemUgdGhlIGltbWVkaWF0ZSBpbnRvIGEgcmVnaXN0ZXIuCisgIHZpcnR1YWwgYm9vbCBpc0xlZ2FsQWRkSW1tZWRpYXRlKGludDY0X3QpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBpdCdzIHNpZ25pZmljYW50bHkgY2hlYXBlciB0byBzaGlmdCBhIHZlY3RvciBieSBhIHVuaWZvcm0KKyAgLy8vIHNjYWxhciB0aGFuIGJ5IGFuIGFtb3VudCB3aGljaCB3aWxsIHZhcnkgYWNyb3NzIGVhY2ggbGFuZS4gT24geDg2LCBmb3IKKyAgLy8vIGV4YW1wbGUsIHRoZXJlIGlzIGEgInBzbGx3IiBpbnN0cnVjdGlvbiBmb3IgdGhlIGZvcm1lciBjYXNlLCBidXQgbm8gc2ltcGxlCisgIC8vLyBpbnN0cnVjdGlvbiBmb3IgYSBnZW5lcmFsICJhIDw8IGIiIG9wZXJhdGlvbiBvbiB2ZWN0b3JzLgorICB2aXJ0dWFsIGJvb2wgaXNWZWN0b3JTaGlmdEJ5U2NhbGFyQ2hlYXAoVHlwZSAqVHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBvcGNvZGUgaXMgYSBjb21tdXRhdGl2ZSBiaW5hcnkgb3BlcmF0aW9uLgorICB2aXJ0dWFsIGJvb2wgaXNDb21tdXRhdGl2ZUJpbk9wKHVuc2lnbmVkIE9wY29kZSkgY29uc3QgeworICAgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBnZXQgaXRzIGluZm8gZnJvbSB0aGUgdGQgZmlsZS4KKyAgICBzd2l0Y2ggKE9wY29kZSkgeworICAgIGNhc2UgSVNEOjpBREQ6CisgICAgY2FzZSBJU0Q6OlNNSU46CisgICAgY2FzZSBJU0Q6OlNNQVg6CisgICAgY2FzZSBJU0Q6OlVNSU46CisgICAgY2FzZSBJU0Q6OlVNQVg6CisgICAgY2FzZSBJU0Q6Ok1VTDoKKyAgICBjYXNlIElTRDo6TVVMSFU6CisgICAgY2FzZSBJU0Q6Ok1VTEhTOgorICAgIGNhc2UgSVNEOjpTTVVMX0xPSEk6CisgICAgY2FzZSBJU0Q6OlVNVUxfTE9ISToKKyAgICBjYXNlIElTRDo6RkFERDoKKyAgICBjYXNlIElTRDo6Rk1VTDoKKyAgICBjYXNlIElTRDo6QU5EOgorICAgIGNhc2UgSVNEOjpPUjoKKyAgICBjYXNlIElTRDo6WE9SOgorICAgIGNhc2UgSVNEOjpTQURETzoKKyAgICBjYXNlIElTRDo6VUFERE86CisgICAgY2FzZSBJU0Q6OkFEREM6CisgICAgY2FzZSBJU0Q6OkFEREU6CisgICAgY2FzZSBJU0Q6OkZNSU5OVU06CisgICAgY2FzZSBJU0Q6OkZNQVhOVU06CisgICAgY2FzZSBJU0Q6OkZNSU5OQU46CisgICAgY2FzZSBJU0Q6OkZNQVhOQU46CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGl0J3MgZnJlZSB0byB0cnVuY2F0ZSBhIHZhbHVlIG9mIHR5cGUgRnJvbVR5IHRvIHR5cGUKKyAgLy8vIFRvVHkuIGUuZy4gT24geDg2IGl0J3MgZnJlZSB0byB0cnVuY2F0ZSBhIGkzMiB2YWx1ZSBpbiByZWdpc3RlciBFQVggdG8gaTE2CisgIC8vLyBieSByZWZlcmVuY2luZyBpdHMgc3ViLXJlZ2lzdGVyIEFYLgorICAvLy8gVGFyZ2V0cyBtdXN0IHJldHVybiBmYWxzZSB3aGVuIEZyb21UeSA8PSBUb1R5LgorICB2aXJ0dWFsIGJvb2wgaXNUcnVuY2F0ZUZyZWUoVHlwZSAqRnJvbVR5LCBUeXBlICpUb1R5KSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGEgdHJ1bmNhdGlvbiBmcm9tIEZyb21UeSB0byBUb1R5IGlzIHBlcm1pdHRlZCB3aGVuIGRlY2lkaW5nCisgIC8vLyB3aGV0aGVyIGEgY2FsbCBpcyBpbiB0YWlsIHBvc2l0aW9uLiBUeXBpY2FsbHkgdGhpcyBtZWFucyB0aGF0IGJvdGggcmVzdWx0cworICAvLy8gd291bGQgYmUgYXNzaWduZWQgdG8gdGhlIHNhbWUgcmVnaXN0ZXIgb3Igc3RhY2sgc2xvdCwgYnV0IGl0IGNvdWxkIG1lYW4KKyAgLy8vIHRoZSB0YXJnZXQgcGVyZm9ybXMgYWRlcXVhdGUgY2hlY2tzIG9mIGl0cyBvd24gYmVmb3JlIHByb2NlZWRpbmcgd2l0aCB0aGUKKyAgLy8vIHRhaWwgY2FsbC4gIFRhcmdldHMgbXVzdCByZXR1cm4gZmFsc2Ugd2hlbiBGcm9tVHkgPD0gVG9UeS4KKyAgdmlydHVhbCBib29sIGFsbG93VHJ1bmNhdGVGb3JUYWlsQ2FsbChUeXBlICpGcm9tVHksIFR5cGUgKlRvVHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgaXNUcnVuY2F0ZUZyZWUoRVZUIEZyb21WVCwgRVZUIFRvVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgaXNQcm9maXRhYmxlVG9Ib2lzdChJbnN0cnVjdGlvbiAqSSkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZXh0ZW5zaW9uIHJlcHJlc2VudGVkIGJ5IFxwIEkgaXMgZnJlZS4KKyAgLy8vIFVubGlrZWx5IHRoZSBpc1tafEZQXUV4dEZyZWUgZmFtaWx5IHdoaWNoIGlzIGJhc2VkIG9uIHR5cGVzLAorICAvLy8gdGhpcyBtZXRob2QgY2FuIHVzZSB0aGUgY29udGV4dCBwcm92aWRlZCBieSBccCBJIHRvIGRlY2lkZQorICAvLy8gd2hldGhlciBvciBub3QgXHAgSSBpcyBmcmVlLgorICAvLy8gVGhpcyBtZXRob2QgZXh0ZW5kcyB0aGUgYmVoYXZpb3Igb2YgdGhlIGlzW1p8RlBdRXh0RnJlZSBmYW1pbHkuCisgIC8vLyBJbiBvdGhlciB3b3JkcywgaWYgaXNbWnxGUF1GcmVlIHJldHVybnMgdHJ1ZSwgdGhlbiB0aGlzIG1ldGhvZAorICAvLy8gcmV0dXJucyB0cnVlIGFzIHdlbGwuIFRoZSBjb252ZXJzZSBpcyBub3QgdHJ1ZS4KKyAgLy8vIFRoZSB0YXJnZXQgY2FuIHBlcmZvcm0gdGhlIGFkZXF1YXRlIGNoZWNrcyBieSBvdmVycmlkaW5nIGlzRXh0RnJlZUltcGwuCisgIC8vLyBccHJlIFxwIEkgbXVzdCBiZSBhIHNpZ24sIHplcm8sIG9yIGZwIGV4dGVuc2lvbi4KKyAgYm9vbCBpc0V4dEZyZWUoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKEktPmdldE9wY29kZSgpKSB7CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6RlBFeHQ6CisgICAgICBpZiAoaXNGUEV4dEZyZWUoRVZUOjpnZXRFVlQoSS0+Z2V0VHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBFVlQ6OmdldEVWVChJLT5nZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkpKSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBicmVhazsKKyAgICBjYXNlIEluc3RydWN0aW9uOjpaRXh0OgorICAgICAgaWYgKGlzWkV4dEZyZWUoSS0+Z2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLCBJLT5nZXRUeXBlKCkpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlNFeHQ6CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiSW5zdHJ1Y3Rpb24gaXMgbm90IGFuIGV4dGVuc2lvbiIpOworICAgIH0KKyAgICByZXR1cm4gaXNFeHRGcmVlSW1wbChJKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBccCBMb2FkIGFuZCBccCBFeHQgY2FuIGZvcm0gYW4gRXh0TG9hZC4KKyAgLy8vIEZvciBleGFtcGxlLCBpbiBBQXJjaDY0CisgIC8vLyAgICVMID0gbG9hZCBpOCwgaTgqICVwdHIKKyAgLy8vICAgJUUgPSB6ZXh0IGk4ICVMIHRvIGkzMgorICAvLy8gY2FuIGJlIGxvd2VyZWQgaW50byBvbmUgbG9hZCBpbnN0cnVjdGlvbgorICAvLy8gICBsZHJiIHcwLCBbeDBdCisgIGJvb2wgaXNFeHRMb2FkKGNvbnN0IExvYWRJbnN0ICpMb2FkLCBjb25zdCBJbnN0cnVjdGlvbiAqRXh0LAorICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCkgY29uc3QgeworICAgIEVWVCBWVCA9IGdldFZhbHVlVHlwZShETCwgRXh0LT5nZXRUeXBlKCkpOworICAgIEVWVCBMb2FkVlQgPSBnZXRWYWx1ZVR5cGUoREwsIExvYWQtPmdldFR5cGUoKSk7CisKKyAgICAvLyBJZiB0aGUgbG9hZCBoYXMgb3RoZXIgdXNlcnMgYW5kIHRoZSB0cnVuY2F0ZSBpcyBub3QgZnJlZSwgdGhlIGV4dAorICAgIC8vIHByb2JhYmx5IGlzbid0IGZyZWUuCisgICAgaWYgKCFMb2FkLT5oYXNPbmVVc2UoKSAmJiAoaXNUeXBlTGVnYWwoTG9hZFZUKSB8fCAhaXNUeXBlTGVnYWwoVlQpKSAmJgorICAgICAgICAhaXNUcnVuY2F0ZUZyZWUoRXh0LT5nZXRUeXBlKCksIExvYWQtPmdldFR5cGUoKSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBDaGVjayB3aGV0aGVyIHRoZSB0YXJnZXQgc3VwcG9ydHMgY2FzdHMgZm9sZGVkIGludG8gbG9hZHMuCisgICAgdW5zaWduZWQgTFR5cGU7CisgICAgaWYgKGlzYTxaRXh0SW5zdD4oRXh0KSkKKyAgICAgIExUeXBlID0gSVNEOjpaRVhUTE9BRDsKKyAgICBlbHNlIHsKKyAgICAgIGFzc2VydChpc2E8U0V4dEluc3Q+KEV4dCkgJiYgIlVuZXhwZWN0ZWQgZXh0IHR5cGUhIik7CisgICAgICBMVHlwZSA9IElTRDo6U0VYVExPQUQ7CisgICAgfQorCisgICAgcmV0dXJuIGlzTG9hZEV4dExlZ2FsKExUeXBlLCBWVCwgTG9hZFZUKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhbnkgYWN0dWFsIGluc3RydWN0aW9uIHRoYXQgZGVmaW5lcyBhIHZhbHVlIG9mIHR5cGUgRnJvbVR5CisgIC8vLyBpbXBsaWNpdGx5IHplcm8tZXh0ZW5kcyB0aGUgdmFsdWUgdG8gVG9UeSBpbiB0aGUgcmVzdWx0IHJlZ2lzdGVyLgorICAvLy8KKyAgLy8vIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRydWUgd2hlbiBpdCBpcyBsaWtlbHkgdGhhdCB0aGUgdHJ1bmNhdGUgY2FuCisgIC8vLyBiZSBmcmVlbHkgZm9sZGVkIHdpdGggYW4gaW5zdHJ1Y3Rpb24gZGVmaW5pbmcgYSB2YWx1ZSBvZiBGcm9tVHkuIElmCisgIC8vLyB0aGUgZGVmaW5pbmcgaW5zdHJ1Y3Rpb24gaXMgdW5rbm93biAoYmVjYXVzZSB5b3UncmUgbG9va2luZyBhdCBhCisgIC8vLyBmdW5jdGlvbiBhcmd1bWVudCwgUEhJLCBldGMuKSB0aGVuIHRoZSB0YXJnZXQgbWF5IHJlcXVpcmUgYW4KKyAgLy8vIGV4cGxpY2l0IHRydW5jYXRlLCB3aGljaCBpcyBub3QgbmVjZXNzYXJpbHkgZnJlZSwgYnV0IHRoaXMgZnVuY3Rpb24KKyAgLy8vIGRvZXMgbm90IGRlYWwgd2l0aCB0aG9zZSBjYXNlcy4KKyAgLy8vIFRhcmdldHMgbXVzdCByZXR1cm4gZmFsc2Ugd2hlbiBGcm9tVHkgPj0gVG9UeS4KKyAgdmlydHVhbCBib29sIGlzWkV4dEZyZWUoVHlwZSAqRnJvbVR5LCBUeXBlICpUb1R5KSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdmlydHVhbCBib29sIGlzWkV4dEZyZWUoRVZUIEZyb21UeSwgRVZUIFRvVHkpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBzdXBwbGllcyBhbmQgY29tYmluZXMgdG8gYSBwYWlyZWQgbG9hZAorICAvLy8gdHdvIGxvYWRlZCB2YWx1ZXMgb2YgdHlwZSBMb2FkZWRUeXBlIG5leHQgdG8gZWFjaCBvdGhlciBpbiBtZW1vcnkuCisgIC8vLyBSZXF1aXJlZEFsaWdubWVudCBnaXZlcyB0aGUgbWluaW1hbCBhbGlnbm1lbnQgY29uc3RyYWludHMgdGhhdCBtdXN0IGJlIG1ldAorICAvLy8gdG8gYmUgYWJsZSB0byBzZWxlY3QgdGhpcyBwYWlyZWQgbG9hZC4KKyAgLy8vCisgIC8vLyBUaGlzIGluZm9ybWF0aW9uIGlzICpub3QqIHVzZWQgdG8gZ2VuZXJhdGUgYWN0dWFsIHBhaXJlZCBsb2FkcywgYnV0IGl0IGlzCisgIC8vLyB1c2VkIHRvIGdlbmVyYXRlIGEgc2VxdWVuY2Ugb2YgbG9hZHMgdGhhdCBpcyBlYXNpZXIgdG8gY29tYmluZSBpbnRvIGEKKyAgLy8vIHBhaXJlZCBsb2FkLgorICAvLy8gRm9yIGluc3RhbmNlLCBzb21ldGhpbmcgbGlrZSB0aGlzOgorICAvLy8gYSA9IGxvYWQgaTY0KiBhZGRyCisgIC8vLyBiID0gdHJ1bmMgaTY0IGEgdG8gaTMyCisgIC8vLyBjID0gbHNociBpNjQgYSwgMzIKKyAgLy8vIGQgPSB0cnVuYyBpNjQgYyB0byBpMzIKKyAgLy8vIHdpbGwgYmUgb3B0aW1pemVkIGludG86CisgIC8vLyBiID0gbG9hZCBpMzIqIGFkZHIxCisgIC8vLyBkID0gbG9hZCBpMzIqIGFkZHIyCisgIC8vLyBXaGVyZSBhZGRyMSA9IGFkZHIyICsvLSBzaXplb2YoaTMyKS4KKyAgLy8vCisgIC8vLyBJbiBvdGhlciB3b3JkcywgdW5sZXNzIHRoZSB0YXJnZXQgcGVyZm9ybXMgYSBwb3N0LWlzZWwgbG9hZCBjb21iaW5pbmcsCisgIC8vLyB0aGlzIGluZm9ybWF0aW9uIHNob3VsZCBub3QgYmUgcHJvdmlkZWQgYmVjYXVzZSBpdCB3aWxsIGdlbmVyYXRlIG1vcmUKKyAgLy8vIGxvYWRzLgorICB2aXJ0dWFsIGJvb2wgaGFzUGFpcmVkTG9hZChFVlQgLypMb2FkZWRUeXBlKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICYgLypSZXF1aXJlZEFsaWdubWVudCovKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgaGFzIGEgdmVjdG9yIGJsZW5kIGluc3RydWN0aW9uLgorICB2aXJ0dWFsIGJvb2wgaGFzVmVjdG9yQmxlbmQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBtYXhpbXVtIHN1cHBvcnRlZCBmYWN0b3IgZm9yIGludGVybGVhdmVkIG1lbW9yeSBhY2Nlc3Nlcy4KKyAgLy8vIERlZmF1bHQgdG8gYmUgdGhlIG1pbmltdW0gaW50ZXJsZWF2ZSBmYWN0b3I6IDIuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TWF4U3VwcG9ydGVkSW50ZXJsZWF2ZUZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIDI7IH0KKworICAvLy8gXGJyaWVmIExvd2VyIGFuIGludGVybGVhdmVkIGxvYWQgdG8gdGFyZ2V0IHNwZWNpZmljIGludHJpbnNpY3MuIFJldHVybgorICAvLy8gdHJ1ZSBvbiBzdWNjZXNzLgorICAvLy8KKyAgLy8vIFxwIExJIGlzIHRoZSB2ZWN0b3IgbG9hZCBpbnN0cnVjdGlvbi4KKyAgLy8vIFxwIFNodWZmbGVzIGlzIHRoZSBzaHVmZmxldmVjdG9yIGxpc3QgdG8gREUtaW50ZXJsZWF2ZSB0aGUgbG9hZGVkIHZlY3Rvci4KKyAgLy8vIFxwIEluZGljZXMgaXMgdGhlIGNvcnJlc3BvbmRpbmcgaW5kaWNlcyBmb3IgZWFjaCBzaHVmZmxldmVjdG9yLgorICAvLy8gXHAgRmFjdG9yIGlzIHRoZSBpbnRlcmxlYXZlIGZhY3Rvci4KKyAgdmlydHVhbCBib29sIGxvd2VySW50ZXJsZWF2ZWRMb2FkKExvYWRJbnN0ICpMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNodWZmbGVWZWN0b3JJbnN0ICo+IFNodWZmbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IEluZGljZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGYWN0b3IpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gXGJyaWVmIExvd2VyIGFuIGludGVybGVhdmVkIHN0b3JlIHRvIHRhcmdldCBzcGVjaWZpYyBpbnRyaW5zaWNzLiBSZXR1cm4KKyAgLy8vIHRydWUgb24gc3VjY2Vzcy4KKyAgLy8vCisgIC8vLyBccCBTSSBpcyB0aGUgdmVjdG9yIHN0b3JlIGluc3RydWN0aW9uLgorICAvLy8gXHAgU1ZJIGlzIHRoZSBzaHVmZmxldmVjdG9yIHRvIFJFLWludGVybGVhdmUgdGhlIHN0b3JlZCB2ZWN0b3IuCisgIC8vLyBccCBGYWN0b3IgaXMgdGhlIGludGVybGVhdmUgZmFjdG9yLgorICB2aXJ0dWFsIGJvb2wgbG93ZXJJbnRlcmxlYXZlZFN0b3JlKFN0b3JlSW5zdCAqU0ksIFNodWZmbGVWZWN0b3JJbnN0ICpTVkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmFjdG9yKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHplcm8tZXh0ZW5kaW5nIHRoZSBzcGVjaWZpYyBub2RlIFZhbCB0byB0eXBlIFZUMiBpcyBmcmVlCisgIC8vLyAoZWl0aGVyIGJlY2F1c2UgaXQncyBpbXBsaWNpdGx5IHplcm8tZXh0ZW5kZWQgc3VjaCBhcyBBUk0gbGRyYiAvIGxkcmggb3IKKyAgLy8vIGJlY2F1c2UgaXQncyBmb2xkZWQgc3VjaCBhcyBYODYgemVyby1leHRlbmRpbmcgbG9hZHMpLgorICB2aXJ0dWFsIGJvb2wgaXNaRXh0RnJlZShTRFZhbHVlIFZhbCwgRVZUIFZUMikgY29uc3QgeworICAgIHJldHVybiBpc1pFeHRGcmVlKFZhbC5nZXRWYWx1ZVR5cGUoKSwgVlQyKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhbiBmcGV4dCBvcGVyYXRpb24gaXMgZnJlZSAoZm9yIGluc3RhbmNlLCBiZWNhdXNlCisgIC8vLyBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgYXJlIGltcGxpY2l0bHkgZXh0ZW5kZWQgdG8KKyAgLy8vIGRvdWJsZS1wcmVjaXNpb24pLgorICB2aXJ0dWFsIGJvb2wgaXNGUEV4dEZyZWUoRVZUIERlc3RWVCwgRVZUIFNyY1ZUKSBjb25zdCB7CisgICAgYXNzZXJ0KFNyY1ZULmlzRmxvYXRpbmdQb2ludCgpICYmIERlc3RWVC5pc0Zsb2F0aW5nUG9pbnQoKSAmJgorICAgICAgICAgICAiaW52YWxpZCBmcGV4dCB0eXBlcyIpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhbiBmcGV4dCBvcGVyYXRpb24gaW5wdXQgdG8gYW4gXHAgT3Bjb2RlIG9wZXJhdGlvbiBpcyBmcmVlCisgIC8vLyAoZm9yIGluc3RhbmNlLCBiZWNhdXNlIGhhbGYtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IG51bWJlcnMgYXJlCisgIC8vLyBpbXBsaWNpdGx5IGV4dGVuZGVkIHRvIGZsb2F0LXByZWNpc2lvbikgZm9yIGFuIEZNQSBpbnN0cnVjdGlvbi4KKyAgdmlydHVhbCBib29sIGlzRlBFeHRGb2xkYWJsZSh1bnNpZ25lZCBPcGNvZGUsIEVWVCBEZXN0VlQsIEVWVCBTcmNWVCkgY29uc3QgeworICAgIGFzc2VydChEZXN0VlQuaXNGbG9hdGluZ1BvaW50KCkgJiYgU3JjVlQuaXNGbG9hdGluZ1BvaW50KCkgJiYKKyAgICAgICAgICAgImludmFsaWQgZnBleHQgdHlwZXMiKTsKKyAgICByZXR1cm4gaXNGUEV4dEZyZWUoRGVzdFZULCBTcmNWVCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgZm9sZGluZyBhIHZlY3RvciBsb2FkIGludG8gRXh0VmFsIChhIHNpZ24sIHplcm8sIG9yIGFueQorICAvLy8gZXh0ZW5kIG5vZGUpIGlzIHByb2ZpdGFibGUuCisgIHZpcnR1YWwgYm9vbCBpc1ZlY3RvckxvYWRFeHREZXNpcmFibGUoU0RWYWx1ZSBFeHRWYWwpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGFuIGZuZWcgb3BlcmF0aW9uIGlzIGZyZWUgdG8gdGhlIHBvaW50IHdoZXJlIGl0IGlzIG5ldmVyCisgIC8vLyB3b3J0aHdoaWxlIHRvIHJlcGxhY2UgaXQgd2l0aCBhIGJpdHdpc2Ugb3BlcmF0aW9uLgorICB2aXJ0dWFsIGJvb2wgaXNGTmVnRnJlZShFVlQgVlQpIGNvbnN0IHsKKyAgICBhc3NlcnQoVlQuaXNGbG9hdGluZ1BvaW50KCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhbiBmYWJzIG9wZXJhdGlvbiBpcyBmcmVlIHRvIHRoZSBwb2ludCB3aGVyZSBpdCBpcyBuZXZlcgorICAvLy8gd29ydGh3aGlsZSB0byByZXBsYWNlIGl0IHdpdGggYSBiaXR3aXNlIG9wZXJhdGlvbi4KKyAgdmlydHVhbCBib29sIGlzRkFic0ZyZWUoRVZUIFZUKSBjb25zdCB7CisgICAgYXNzZXJ0KFZULmlzRmxvYXRpbmdQb2ludCgpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgYW4gRk1BIG9wZXJhdGlvbiBpcyBmYXN0ZXIgdGhhbiBhIHBhaXIgb2YgZm11bCBhbmQgZmFkZAorICAvLy8gaW5zdHJ1Y3Rpb25zLiBmbXVsYWRkIGludHJpbnNpY3Mgd2lsbCBiZSBleHBhbmRlZCB0byBGTUFzIHdoZW4gdGhpcyBtZXRob2QKKyAgLy8vIHJldHVybnMgdHJ1ZSwgb3RoZXJ3aXNlIGZtdWxhZGQgaXMgZXhwYW5kZWQgdG8gZm11bCArIGZhZGQuCisgIC8vLworICAvLy8gTk9URTogVGhpcyBtYXkgYmUgY2FsbGVkIGJlZm9yZSBsZWdhbGl6YXRpb24gb24gdHlwZXMgZm9yIHdoaWNoIEZNQXMgYXJlCisgIC8vLyBub3QgbGVnYWwsIGJ1dCBzaG91bGQgcmV0dXJuIHRydWUgaWYgdGhvc2UgdHlwZXMgd2lsbCBldmVudHVhbGx5IGxlZ2FsaXplCisgIC8vLyB0byB0eXBlcyB0aGF0IHN1cHBvcnQgRk1Bcy4gQWZ0ZXIgbGVnYWxpemF0aW9uLCBpdCB3aWxsIG9ubHkgYmUgY2FsbGVkIG9uCisgIC8vLyB0eXBlcyB0aGF0IHN1cHBvcnQgRk1BcyAodmlhIExlZ2FsIG9yIEN1c3RvbSBhY3Rpb25zKQorICB2aXJ0dWFsIGJvb2wgaXNGTUFGYXN0ZXJUaGFuRk11bEFuZEZBZGQoRVZUKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGl0J3MgcHJvZml0YWJsZSB0byBuYXJyb3cgb3BlcmF0aW9ucyBvZiB0eXBlIFZUMSB0bworICAvLy8gVlQyLiBlLmcuIG9uIHg4NiwgaXQncyBwcm9maXRhYmxlIHRvIG5hcnJvdyBmcm9tIGkzMiB0byBpOCBidXQgbm90IGZyb20KKyAgLy8vIGkzMiB0byBpMTYuCisgIHZpcnR1YWwgYm9vbCBpc05hcnJvd2luZ1Byb2ZpdGFibGUoRVZUIC8qVlQxKi8sIEVWVCAvKlZUMiovKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBiZW5lZmljaWFsIHRvIGNvbnZlcnQgYSBsb2FkIG9mIGEgY29uc3RhbnQgdG8KKyAgLy8vIGp1c3QgdGhlIGNvbnN0YW50IGl0c2VsZi4KKyAgLy8vIE9uIHNvbWUgdGFyZ2V0cyBpdCBtaWdodCBiZSBtb3JlIGVmZmljaWVudCB0byB1c2UgYSBjb21iaW5hdGlvbiBvZgorICAvLy8gYXJpdGhtZXRpYyBpbnN0cnVjdGlvbnMgdG8gbWF0ZXJpYWxpemUgdGhlIGNvbnN0YW50IGluc3RlYWQgb2YgbG9hZGluZyBpdAorICAvLy8gZnJvbSBhIGNvbnN0YW50IHBvb2wuCisgIHZpcnR1YWwgYm9vbCBzaG91bGRDb252ZXJ0Q29uc3RhbnRMb2FkVG9JbnRJbW0oY29uc3QgQVBJbnQgJkltbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpUeSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBFWFRSQUNUX1NVQlZFQ1RPUiBpcyBjaGVhcCBmb3IgZXh0cmFjdGluZyB0aGlzIHJlc3VsdCB0eXBlCisgIC8vLyBmcm9tIHRoaXMgc291cmNlIHR5cGUgd2l0aCB0aGlzIGluZGV4LiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlCisgIC8vLyBFWFRSQUNUX1NVQlZFQ1RPUiB1c3VhbGx5IGhhcyBjdXN0b20gbG93ZXJpbmcgdGhhdCBkZXBlbmRzIG9uIHRoZSBpbmRleCBvZgorICAvLy8gdGhlIGZpcnN0IGVsZW1lbnQsIGFuZCBvbmx5IHRoZSB0YXJnZXQga25vd3Mgd2hpY2ggbG93ZXJpbmcgaXMgY2hlYXAuCisgIHZpcnR1YWwgYm9vbCBpc0V4dHJhY3RTdWJ2ZWN0b3JDaGVhcChFVlQgUmVzVlQsIEVWVCBTcmNWVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gUmV0dXJuIHRydWUgaWYgaXQgaXMgcHJvZml0YWJsZSB0byB1c2UgYSBzY2FsYXIgaW5wdXQgdG8gYSBCVUlMRF9WRUNUT1IKKyAgLy8gZXZlbiBpZiB0aGUgdmVjdG9yIGl0c2VsZiBoYXMgbXVsdGlwbGUgdXNlcy4KKyAgdmlydHVhbCBib29sIGFnZ3Jlc3NpdmVseVByZWZlckJ1aWxkVmVjdG9yU291cmNlcyhFVlQgVmVjVlQpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUnVudGltZSBMaWJyYXJ5IGhvb2tzCisgIC8vCisKKyAgLy8vIFJlbmFtZSB0aGUgZGVmYXVsdCBsaWJjYWxsIHJvdXRpbmUgbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBsaWJjYWxsLgorICB2b2lkIHNldExpYmNhbGxOYW1lKFJUTElCOjpMaWJjYWxsIENhbGwsIGNvbnN0IGNoYXIgKk5hbWUpIHsKKyAgICBMaWJjYWxsUm91dGluZU5hbWVzW0NhbGxdID0gTmFtZTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGxpYmNhbGwgcm91dGluZSBuYW1lIGZvciB0aGUgc3BlY2lmaWVkIGxpYmNhbGwuCisgIGNvbnN0IGNoYXIgKmdldExpYmNhbGxOYW1lKFJUTElCOjpMaWJjYWxsIENhbGwpIGNvbnN0IHsKKyAgICByZXR1cm4gTGliY2FsbFJvdXRpbmVOYW1lc1tDYWxsXTsKKyAgfQorCisgIC8vLyBPdmVycmlkZSB0aGUgZGVmYXVsdCBDb25kQ29kZSB0byBiZSB1c2VkIHRvIHRlc3QgdGhlIHJlc3VsdCBvZiB0aGUKKyAgLy8vIGNvbXBhcmlzb24gbGliY2FsbCBhZ2FpbnN0IHplcm8uCisgIHZvaWQgc2V0Q21wTGliY2FsbENDKFJUTElCOjpMaWJjYWxsIENhbGwsIElTRDo6Q29uZENvZGUgQ0MpIHsKKyAgICBDbXBMaWJjYWxsQ0NzW0NhbGxdID0gQ0M7CisgIH0KKworICAvLy8gR2V0IHRoZSBDb25kQ29kZSB0aGF0J3MgdG8gYmUgdXNlZCB0byB0ZXN0IHRoZSByZXN1bHQgb2YgdGhlIGNvbXBhcmlzb24KKyAgLy8vIGxpYmNhbGwgYWdhaW5zdCB6ZXJvLgorICBJU0Q6OkNvbmRDb2RlIGdldENtcExpYmNhbGxDQyhSVExJQjo6TGliY2FsbCBDYWxsKSBjb25zdCB7CisgICAgcmV0dXJuIENtcExpYmNhbGxDQ3NbQ2FsbF07CisgIH0KKworICAvLy8gU2V0IHRoZSBDYWxsaW5nQ29udiB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgc3BlY2lmaWVkIGxpYmNhbGwuCisgIHZvaWQgc2V0TGliY2FsbENhbGxpbmdDb252KFJUTElCOjpMaWJjYWxsIENhbGwsIENhbGxpbmdDb252OjpJRCBDQykgeworICAgIExpYmNhbGxDYWxsaW5nQ29udnNbQ2FsbF0gPSBDQzsKKyAgfQorCisgIC8vLyBHZXQgdGhlIENhbGxpbmdDb252IHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBzcGVjaWZpZWQgbGliY2FsbC4KKyAgQ2FsbGluZ0NvbnY6OklEIGdldExpYmNhbGxDYWxsaW5nQ29udihSVExJQjo6TGliY2FsbCBDYWxsKSBjb25zdCB7CisgICAgcmV0dXJuIExpYmNhbGxDYWxsaW5nQ29udnNbQ2FsbF07CisgIH0KKworICAvLy8gRXhlY3V0ZSB0YXJnZXQgc3BlY2lmaWMgYWN0aW9ucyB0byBmaW5hbGl6ZSB0YXJnZXQgbG93ZXJpbmcuCisgIC8vLyBUaGlzIGlzIHVzZWQgdG8gc2V0IGV4dHJhIGZsYWdzIGluIE1hY2hpbmVGcmFtZUluZm9ybWF0aW9uIGFuZCBmcmVlemluZworICAvLy8gdGhlIHNldCBvZiByZXNlcnZlZCByZWdpc3RlcnMuCisgIC8vLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBqdXN0IGZyZWV6ZXMgdGhlIHNldCBvZiByZXNlcnZlZCByZWdpc3RlcnMuCisgIHZpcnR1YWwgdm9pZCBmaW5hbGl6ZUxvd2VyaW5nKE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCitwcml2YXRlOgorICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTTsKKworICAvLy8gVGVsbHMgdGhlIGNvZGUgZ2VuZXJhdG9yIHRoYXQgdGhlIHRhcmdldCBoYXMgbXVsdGlwbGUgKGFsbG9jYXRhYmxlKQorICAvLy8gY29uZGl0aW9uIHJlZ2lzdGVycyB0aGF0IGNhbiBiZSB1c2VkIHRvIHN0b3JlIHRoZSByZXN1bHRzIG9mIGNvbXBhcmlzb25zCisgIC8vLyBmb3IgdXNlIGJ5IHNlbGVjdHMgYW5kIGNvbmRpdGlvbmFsIGJyYW5jaGVzLiBXaXRoIG11bHRpcGxlIGNvbmRpdGlvbgorICAvLy8gcmVnaXN0ZXJzLCB0aGUgY29kZSBnZW5lcmF0b3Igd2lsbCBub3QgYWdncmVzc2l2ZWx5IHNpbmsgY29tcGFyaXNvbnMgaW50bworICAvLy8gdGhlIGJsb2NrcyBvZiB0aGVpciB1c2Vycy4KKyAgYm9vbCBIYXNNdWx0aXBsZUNvbmRpdGlvblJlZ2lzdGVyczsKKworICAvLy8gVGVsbHMgdGhlIGNvZGUgZ2VuZXJhdG9yIHRoYXQgdGhlIHRhcmdldCBoYXMgQml0RXh0cmFjdCBpbnN0cnVjdGlvbnMuCisgIC8vLyBUaGUgY29kZSBnZW5lcmF0b3Igd2lsbCBhZ2dyZXNzaXZlbHkgc2luayAic2hpZnQicyBpbnRvIHRoZSBibG9ja3Mgb2YKKyAgLy8vIHRoZWlyIHVzZXJzIGlmIHRoZSB1c2VycyB3aWxsIGdlbmVyYXRlICJhbmQiIGluc3RydWN0aW9ucyB3aGljaCBjYW4gYmUKKyAgLy8vIGNvbWJpbmVkIHdpdGggInNoaWZ0IiB0byBCaXRFeHRyYWN0IGluc3RydWN0aW9ucy4KKyAgYm9vbCBIYXNFeHRyYWN0Qml0c0luc247CisKKyAgLy8vIFRlbGxzIHRoZSBjb2RlIGdlbmVyYXRvciB0byBieXBhc3Mgc2xvdyBkaXZpZGUgb3IgcmVtYWluZGVyCisgIC8vLyBpbnN0cnVjdGlvbnMuIEZvciBleGFtcGxlLCBCeXBhc3NTbG93RGl2V2lkdGhzWzMyLDhdIHRlbGxzIHRoZSBjb2RlCisgIC8vLyBnZW5lcmF0b3IgdG8gYnlwYXNzIDMyLWJpdCBpbnRlZ2VyIGRpdi9yZW0gd2l0aCBhbiA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyCisgIC8vLyBkaXYvcmVtIHdoZW4gdGhlIG9wZXJhbmRzIGFyZSBwb3NpdGl2ZSBhbmQgbGVzcyB0aGFuIDI1Ni4KKyAgRGVuc2VNYXAgPHVuc2lnbmVkIGludCwgdW5zaWduZWQgaW50PiBCeXBhc3NTbG93RGl2V2lkdGhzOworCisgIC8vLyBUZWxscyB0aGUgY29kZSBnZW5lcmF0b3IgdGhhdCBpdCBzaG91bGRuJ3QgZ2VuZXJhdGUgZXh0cmEgZmxvdyBjb250cm9sCisgIC8vLyBpbnN0cnVjdGlvbnMgYW5kIHNob3VsZCBhdHRlbXB0IHRvIGNvbWJpbmUgZmxvdyBjb250cm9sIGluc3RydWN0aW9ucyB2aWEKKyAgLy8vIHByZWRpY2F0aW9uLgorICBib29sIEp1bXBJc0V4cGVuc2l2ZTsKKworICAvLy8gV2hldGhlciB0aGUgdGFyZ2V0IHN1cHBvcnRzIG9yIGNhcmVzIGFib3V0IHByZXNlcnZpbmcgZmxvYXRpbmcgcG9pbnQKKyAgLy8vIGV4Y2VwdGlvbiBiZWhhdmlvci4KKyAgYm9vbCBIYXNGbG9hdGluZ1BvaW50RXhjZXB0aW9uczsKKworICAvLy8gVGhpcyB0YXJnZXQgcHJlZmVycyB0byB1c2UgX3NldGptcCB0byBpbXBsZW1lbnQgbGx2bS5zZXRqbXAuCisgIC8vLworICAvLy8gRGVmYXVsdHMgdG8gZmFsc2UuCisgIGJvb2wgVXNlVW5kZXJzY29yZVNldEptcDsKKworICAvLy8gVGhpcyB0YXJnZXQgcHJlZmVycyB0byB1c2UgX2xvbmdqbXAgdG8gaW1wbGVtZW50IGxsdm0ubG9uZ2ptcC4KKyAgLy8vCisgIC8vLyBEZWZhdWx0cyB0byBmYWxzZS4KKyAgYm9vbCBVc2VVbmRlcnNjb3JlTG9uZ0ptcDsKKworICAvLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBoaWdoLWJpdHMgaW4gYm9vbGVhbiB2YWx1ZXMgaGVsZCBpbgorICAvLy8gYSB0eXBlIHdpZGVyIHRoYW4gaTEuIFNlZSBnZXRCb29sZWFuQ29udGVudHMuCisgIEJvb2xlYW5Db250ZW50IEJvb2xlYW5Db250ZW50czsKKworICAvLy8gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBoaWdoLWJpdHMgaW4gYm9vbGVhbiB2YWx1ZXMgaGVsZCBpbgorICAvLy8gYSB0eXBlIHdpZGVyIHRoYW4gaTEuIFNlZSBnZXRCb29sZWFuQ29udGVudHMuCisgIEJvb2xlYW5Db250ZW50IEJvb2xlYW5GbG9hdENvbnRlbnRzOworCisgIC8vLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29udGVudHMgb2YgdGhlIGhpZ2gtYml0cyBpbiBib29sZWFuIHZlY3RvciB2YWx1ZXMKKyAgLy8vIHdoZW4gdGhlIGVsZW1lbnQgdHlwZSBpcyB3aWRlciB0aGFuIGkxLiBTZWUgZ2V0Qm9vbGVhbkNvbnRlbnRzLgorICBCb29sZWFuQ29udGVudCBCb29sZWFuVmVjdG9yQ29udGVudHM7CisKKyAgLy8vIFRoZSB0YXJnZXQgc2NoZWR1bGluZyBwcmVmZXJlbmNlOiBzaG9ydGVzdCBwb3NzaWJsZSB0b3RhbCBjeWNsZXMgb3IgbG93ZXN0CisgIC8vLyByZWdpc3RlciB1c2FnZS4KKyAgU2NoZWQ6OlByZWZlcmVuY2UgU2NoZWRQcmVmZXJlbmNlSW5mbzsKKworICAvLy8gVGhlIHNpemUsIGluIGJ5dGVzLCBvZiB0aGUgdGFyZ2V0J3Mgam1wX2J1ZiBidWZmZXJzCisgIHVuc2lnbmVkIEp1bXBCdWZTaXplOworCisgIC8vLyBUaGUgYWxpZ25tZW50LCBpbiBieXRlcywgb2YgdGhlIHRhcmdldCdzIGptcF9idWYgYnVmZmVycworICB1bnNpZ25lZCBKdW1wQnVmQWxpZ25tZW50OworCisgIC8vLyBUaGUgbWluaW11bSBhbGlnbm1lbnQgdGhhdCBhbnkgYXJndW1lbnQgb24gdGhlIHN0YWNrIG5lZWRzIHRvIGhhdmUuCisgIHVuc2lnbmVkIE1pblN0YWNrQXJndW1lbnRBbGlnbm1lbnQ7CisKKyAgLy8vIFRoZSBtaW5pbXVtIGZ1bmN0aW9uIGFsaWdubWVudCAodXNlZCB3aGVuIG9wdGltaXppbmcgZm9yIHNpemUsIGFuZCB0bworICAvLy8gcHJldmVudCBleHBsaWNpdGx5IHByb3ZpZGVkIGFsaWdubWVudCBmcm9tIGxlYWRpbmcgdG8gaW5jb3JyZWN0IGNvZGUpLgorICB1bnNpZ25lZCBNaW5GdW5jdGlvbkFsaWdubWVudDsKKworICAvLy8gVGhlIHByZWZlcnJlZCBmdW5jdGlvbiBhbGlnbm1lbnQgKHVzZWQgd2hlbiBhbGlnbm1lbnQgdW5zcGVjaWZpZWQgYW5kCisgIC8vLyBvcHRpbWl6aW5nIGZvciBzcGVlZCkuCisgIHVuc2lnbmVkIFByZWZGdW5jdGlvbkFsaWdubWVudDsKKworICAvLy8gVGhlIHByZWZlcnJlZCBsb29wIGFsaWdubWVudC4KKyAgdW5zaWduZWQgUHJlZkxvb3BBbGlnbm1lbnQ7CisKKyAgLy8vIFNpemUgaW4gYml0cyBvZiB0aGUgbWF4aW11bSBhdG9taWNzIHNpemUgdGhlIGJhY2tlbmQgc3VwcG9ydHMuCisgIC8vLyBBY2Nlc3NlcyBsYXJnZXIgdGhhbiB0aGlzIHdpbGwgYmUgZXhwYW5kZWQgYnkgQXRvbWljRXhwYW5kUGFzcy4KKyAgdW5zaWduZWQgTWF4QXRvbWljU2l6ZUluQml0c1N1cHBvcnRlZDsKKworICAvLy8gU2l6ZSBpbiBiaXRzIG9mIHRoZSBtaW5pbXVtIGNtcHhjaGcgb3IgbGwvc2Mgb3BlcmF0aW9uIHRoZQorICAvLy8gYmFja2VuZCBzdXBwb3J0cy4KKyAgdW5zaWduZWQgTWluQ21wWGNoZ1NpemVJbkJpdHM7CisKKyAgLy8vIFRoaXMgaW5kaWNhdGVzIGlmIHRoZSB0YXJnZXQgc3VwcG9ydHMgdW5hbGlnbmVkIGF0b21pYyBvcGVyYXRpb25zLgorICBib29sIFN1cHBvcnRzVW5hbGlnbmVkQXRvbWljczsKKworICAvLy8gSWYgc2V0IHRvIGEgcGh5c2ljYWwgcmVnaXN0ZXIsIHRoaXMgc3BlY2lmaWVzIHRoZSByZWdpc3RlciB0aGF0CisgIC8vLyBsbHZtLnNhdmVzdGFjay9sbHZtLnJlc3RvcmVzdGFjayBzaG91bGQgc2F2ZSBhbmQgcmVzdG9yZS4KKyAgdW5zaWduZWQgU3RhY2tQb2ludGVyUmVnaXN0ZXJUb1NhdmVSZXN0b3JlOworCisgIC8vLyBUaGlzIGluZGljYXRlcyB0aGUgZGVmYXVsdCByZWdpc3RlciBjbGFzcyB0byB1c2UgZm9yIGVhY2ggVmFsdWVUeXBlIHRoZQorICAvLy8gdGFyZ2V0IHN1cHBvcnRzIG5hdGl2ZWx5LgorICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSZWdDbGFzc0ZvclZUW01WVDo6TEFTVF9WQUxVRVRZUEVdOworICB1bnNpZ25lZCBjaGFyIE51bVJlZ2lzdGVyc0ZvclZUW01WVDo6TEFTVF9WQUxVRVRZUEVdOworICBNVlQgUmVnaXN0ZXJUeXBlRm9yVlRbTVZUOjpMQVNUX1ZBTFVFVFlQRV07CisKKyAgLy8vIFRoaXMgaW5kaWNhdGVzIHRoZSAicmVwcmVzZW50YXRpdmUiIHJlZ2lzdGVyIGNsYXNzIHRvIHVzZSBmb3IgZWFjaAorICAvLy8gVmFsdWVUeXBlIHRoZSB0YXJnZXQgc3VwcG9ydHMgbmF0aXZlbHkuIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCBieSB0aGUKKyAgLy8vIHNjaGVkdWxlciB0byB0cmFjayByZWdpc3RlciBwcmVzc3VyZS4gQnkgZGVmYXVsdCwgdGhlIHJlcHJlc2VudGF0aXZlCisgIC8vLyByZWdpc3RlciBjbGFzcyBpcyB0aGUgbGFyZ2VzdCBsZWdhbCBzdXBlci1yZWcgcmVnaXN0ZXIgY2xhc3Mgb2YgdGhlCisgIC8vLyByZWdpc3RlciBjbGFzcyBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuIGUuZy4gT24geDg2LCBpOCwgaTE2LCBhbmQgaTMyJ3MKKyAgLy8vIHJlcHJlc2VudGF0aXZlIGNsYXNzIHdvdWxkIGJlIEdSMzIuCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJlcFJlZ0NsYXNzRm9yVlRbTVZUOjpMQVNUX1ZBTFVFVFlQRV07CisKKyAgLy8vIFRoaXMgaW5kaWNhdGVzIHRoZSAiY29zdCIgb2YgdGhlICJyZXByZXNlbnRhdGl2ZSIgcmVnaXN0ZXIgY2xhc3MgZm9yIGVhY2gKKyAgLy8vIFZhbHVlVHlwZS4gVGhlIGNvc3QgaXMgdXNlZCBieSB0aGUgc2NoZWR1bGVyIHRvIGFwcHJveGltYXRlIHJlZ2lzdGVyCisgIC8vLyBwcmVzc3VyZS4KKyAgdWludDhfdCBSZXBSZWdDbGFzc0Nvc3RGb3JWVFtNVlQ6OkxBU1RfVkFMVUVUWVBFXTsKKworICAvLy8gRm9yIGFueSB2YWx1ZSB0eXBlcyB3ZSBhcmUgcHJvbW90aW5nIG9yIGV4cGFuZGluZywgdGhpcyBjb250YWlucyB0aGUgdmFsdWUKKyAgLy8vIHR5cGUgdGhhdCB3ZSBhcmUgY2hhbmdpbmcgdG8uICBGb3IgRXhwYW5kZWQgdHlwZXMsIHRoaXMgY29udGFpbnMgb25lIHN0ZXAKKyAgLy8vIG9mIHRoZSBleHBhbmQgKGUuZy4gaTY0IC0+IGkzMiksIGV2ZW4gaWYgdGhlcmUgYXJlIG11bHRpcGxlIHN0ZXBzIHJlcXVpcmVkCisgIC8vLyAoZS5nLiBpNjQgLT4gaTE2KS4gIEZvciB0eXBlcyBuYXRpdmVseSBzdXBwb3J0ZWQgYnkgdGhlIHN5c3RlbSwgdGhpcyBob2xkcworICAvLy8gdGhlIHNhbWUgdHlwZSAoZS5nLiBpMzIgLT4gaTMyKS4KKyAgTVZUIFRyYW5zZm9ybVRvVHlwZVtNVlQ6OkxBU1RfVkFMVUVUWVBFXTsKKworICAvLy8gRm9yIGVhY2ggb3BlcmF0aW9uIGFuZCBlYWNoIHZhbHVlIHR5cGUsIGtlZXAgYSBMZWdhbGl6ZUFjdGlvbiB0aGF0CisgIC8vLyBpbmRpY2F0ZXMgaG93IGluc3RydWN0aW9uIHNlbGVjdGlvbiBzaG91bGQgZGVhbCB3aXRoIHRoZSBvcGVyYXRpb24uICBNb3N0CisgIC8vLyBvcGVyYXRpb25zIGFyZSBMZWdhbCAoYWthLCBzdXBwb3J0ZWQgbmF0aXZlbHkgYnkgdGhlIHRhcmdldCksIGJ1dAorICAvLy8gb3BlcmF0aW9ucyB0aGF0IGFyZSBub3Qgc2hvdWxkIGJlIGRlc2NyaWJlZC4gIE5vdGUgdGhhdCBvcGVyYXRpb25zIG9uCisgIC8vLyBub24tbGVnYWwgdmFsdWUgdHlwZXMgYXJlIG5vdCBkZXNjcmliZWQgaGVyZS4KKyAgTGVnYWxpemVBY3Rpb24gT3BBY3Rpb25zW01WVDo6TEFTVF9WQUxVRVRZUEVdW0lTRDo6QlVJTFRJTl9PUF9FTkRdOworCisgIC8vLyBGb3IgZWFjaCBsb2FkIGV4dGVuc2lvbiB0eXBlIGFuZCBlYWNoIHZhbHVlIHR5cGUsIGtlZXAgYSBMZWdhbGl6ZUFjdGlvbgorICAvLy8gdGhhdCBpbmRpY2F0ZXMgaG93IGluc3RydWN0aW9uIHNlbGVjdGlvbiBzaG91bGQgZGVhbCB3aXRoIGEgbG9hZCBvZiBhCisgIC8vLyBzcGVjaWZpYyB2YWx1ZSB0eXBlIGFuZCBleHRlbnNpb24gdHlwZS4gVXNlcyA0LWJpdHMgdG8gc3RvcmUgdGhlIGFjdGlvbgorICAvLy8gZm9yIGVhY2ggb2YgdGhlIDQgbG9hZCBleHQgdHlwZXMuCisgIHVpbnQxNl90IExvYWRFeHRBY3Rpb25zW01WVDo6TEFTVF9WQUxVRVRZUEVdW01WVDo6TEFTVF9WQUxVRVRZUEVdOworCisgIC8vLyBGb3IgZWFjaCB2YWx1ZSB0eXBlIHBhaXIga2VlcCBhIExlZ2FsaXplQWN0aW9uIHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgYQorICAvLy8gdHJ1bmNhdGluZyBzdG9yZSBvZiBhIHNwZWNpZmljIHZhbHVlIHR5cGUgYW5kIHRydW5jYXRpbmcgdHlwZSBpcyBsZWdhbC4KKyAgTGVnYWxpemVBY3Rpb24gVHJ1bmNTdG9yZUFjdGlvbnNbTVZUOjpMQVNUX1ZBTFVFVFlQRV1bTVZUOjpMQVNUX1ZBTFVFVFlQRV07CisKKyAgLy8vIEZvciBlYWNoIGluZGV4ZWQgbW9kZSBhbmQgZWFjaCB2YWx1ZSB0eXBlLCBrZWVwIGEgcGFpciBvZiBMZWdhbGl6ZUFjdGlvbgorICAvLy8gdGhhdCBpbmRpY2F0ZXMgaG93IGluc3RydWN0aW9uIHNlbGVjdGlvbiBzaG91bGQgZGVhbCB3aXRoIHRoZSBsb2FkIC8KKyAgLy8vIHN0b3JlLgorICAvLy8KKyAgLy8vIFRoZSBmaXJzdCBkaW1lbnNpb24gaXMgdGhlIHZhbHVlX3R5cGUgZm9yIHRoZSByZWZlcmVuY2UuIFRoZSBzZWNvbmQKKyAgLy8vIGRpbWVuc2lvbiByZXByZXNlbnRzIHRoZSB2YXJpb3VzIG1vZGVzIGZvciBsb2FkIHN0b3JlLgorICB1aW50OF90IEluZGV4ZWRNb2RlQWN0aW9uc1tNVlQ6OkxBU1RfVkFMVUVUWVBFXVtJU0Q6OkxBU1RfSU5ERVhFRF9NT0RFXTsKKworICAvLy8gRm9yIGVhY2ggY29uZGl0aW9uIGNvZGUgKElTRDo6Q29uZENvZGUpIGtlZXAgYSBMZWdhbGl6ZUFjdGlvbiB0aGF0CisgIC8vLyBpbmRpY2F0ZXMgaG93IGluc3RydWN0aW9uIHNlbGVjdGlvbiBzaG91bGQgZGVhbCB3aXRoIHRoZSBjb25kaXRpb24gY29kZS4KKyAgLy8vCisgIC8vLyBCZWNhdXNlIGVhY2ggQ0MgYWN0aW9uIHRha2VzIHVwIDQgYml0cywgd2UgbmVlZCB0byBoYXZlIHRoZSBhcnJheSBzaXplIGJlCisgIC8vLyBsYXJnZSBlbm91Z2ggdG8gZml0IGFsbCBvZiB0aGUgdmFsdWUgdHlwZXMuIFRoaXMgY2FuIGJlIGRvbmUgYnkgcm91bmRpbmcKKyAgLy8vIHVwIHRoZSBNVlQ6OkxBU1RfVkFMVUVUWVBFIHZhbHVlIHRvIHRoZSBuZXh0IG11bHRpcGxlIG9mIDguCisgIHVpbnQzMl90IENvbmRDb2RlQWN0aW9uc1tJU0Q6OlNFVENDX0lOVkFMSURdWyhNVlQ6OkxBU1RfVkFMVUVUWVBFICsgNykgLyA4XTsKKworcHJvdGVjdGVkOgorICBWYWx1ZVR5cGVBY3Rpb25JbXBsIFZhbHVlVHlwZUFjdGlvbnM7CisKK3ByaXZhdGU6CisgIExlZ2FsaXplS2luZCBnZXRUeXBlQ29udmVyc2lvbihMTFZNQ29udGV4dCAmQ29udGV4dCwgRVZUIFZUKSBjb25zdDsKKworICAvLy8gVGFyZ2V0cyBjYW4gc3BlY2lmeSBJU0Qgbm9kZXMgdGhhdCB0aGV5IHdvdWxkIGxpa2UgUGVyZm9ybURBR0NvbWJpbmUKKyAgLy8vIGNhbGxiYWNrcyBmb3IgYnkgY2FsbGluZyBzZXRUYXJnZXREQUdDb21iaW5lKCksIHdoaWNoIHNldHMgYSBiaXQgaW4gdGhpcworICAvLy8gYXJyYXkuCisgIHVuc2lnbmVkIGNoYXIKKyAgVGFyZ2V0REFHQ29tYmluZUFycmF5WyhJU0Q6OkJVSUxUSU5fT1BfRU5EK0NIQVJfQklULTEpL0NIQVJfQklUXTsKKworICAvLy8gRm9yIG9wZXJhdGlvbnMgdGhhdCBtdXN0IGJlIHByb21vdGVkIHRvIGEgc3BlY2lmaWMgdHlwZSwgdGhpcyBob2xkcyB0aGUKKyAgLy8vIGRlc3RpbmF0aW9uIHR5cGUuICBUaGlzIG1hcCBzaG91bGQgYmUgc3BhcnNlLCBzbyBkb24ndCBob2xkIGl0IGFzIGFuCisgIC8vLyBhcnJheS4KKyAgLy8vCisgIC8vLyBUYXJnZXRzIGFkZCBlbnRyaWVzIHRvIHRoaXMgbWFwIHdpdGggQWRkUHJvbW90ZWRUb1R5cGUoLi4pLCBjbGllbnRzIGFjY2VzcworICAvLy8gdGhpcyB3aXRoIGdldFR5cGVUb1Byb21vdGVUbyguLikuCisgIHN0ZDo6bWFwPHN0ZDo6cGFpcjx1bnNpZ25lZCwgTVZUOjpTaW1wbGVWYWx1ZVR5cGU+LCBNVlQ6OlNpbXBsZVZhbHVlVHlwZT4KKyAgICBQcm9tb3RlVG9UeXBlOworCisgIC8vLyBTdG9yZXMgdGhlIG5hbWUgZWFjaCBsaWJjYWxsLgorICBjb25zdCBjaGFyICpMaWJjYWxsUm91dGluZU5hbWVzW1JUTElCOjpVTktOT1dOX0xJQkNBTEwgKyAxXTsKKworICAvLy8gVGhlIElTRDo6Q29uZENvZGUgdGhhdCBzaG91bGQgYmUgdXNlZCB0byB0ZXN0IHRoZSByZXN1bHQgb2YgZWFjaCBvZiB0aGUKKyAgLy8vIGNvbXBhcmlzb24gbGliY2FsbCBhZ2FpbnN0IHplcm8uCisgIElTRDo6Q29uZENvZGUgQ21wTGliY2FsbENDc1tSVExJQjo6VU5LTk9XTl9MSUJDQUxMXTsKKworICAvLy8gU3RvcmVzIHRoZSBDYWxsaW5nQ29udiB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBlYWNoIGxpYmNhbGwuCisgIENhbGxpbmdDb252OjpJRCBMaWJjYWxsQ2FsbGluZ0NvbnZzW1JUTElCOjpVTktOT1dOX0xJQkNBTExdOworCisgIC8vLyBTZXQgZGVmYXVsdCBsaWJjYWxsIG5hbWVzIGFuZCBjYWxsaW5nIGNvbnZlbnRpb25zLgorICB2b2lkIEluaXRMaWJjYWxscyhjb25zdCBUcmlwbGUgJlRUKTsKKworcHJvdGVjdGVkOgorICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGV4dGVuc2lvbiByZXByZXNlbnRlZCBieSBccCBJIGlzIGZyZWUuCisgIC8vLyBccHJlIFxwIEkgaXMgYSBzaWduLCB6ZXJvLCBvciBmcCBleHRlbnNpb24gYW5kCisgIC8vLyAgICAgIGlzW1p8RlBdRXh0RnJlZSBvZiB0aGUgcmVsYXRlZCB0eXBlcyBpcyBub3QgdHJ1ZS4KKyAgdmlydHVhbCBib29sIGlzRXh0RnJlZUltcGwoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIERlcHRoIHRoYXQgR2F0aGVyQWxsQWxpYXNlcyBzaG91bGQgc2hvdWxkIGNvbnRpbnVlIGxvb2tpbmcgZm9yIGNoYWluCisgIC8vLyBkZXBlbmRlbmNpZXMgd2hlbiB0cnlpbmcgdG8gZmluZCBhIG1vcmUgcHJlZmVyYWJsZSBjaGFpbi4gQXMgYW4KKyAgLy8vIGFwcHJveGltYXRpb24sIHRoaXMgc2hvdWxkIGJlIG1vcmUgdGhhbiB0aGUgbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHN0b3JlcworICAvLy8gZXhwZWN0ZWQgdG8gYmUgbWVyZ2VkLgorICB1bnNpZ25lZCBHYXRoZXJBbGxBbGlhc2VzTWF4RGVwdGg7CisKKyAgLy8vIFxicmllZiBTcGVjaWZ5IG1heGltdW0gbnVtYmVyIG9mIHN0b3JlIGluc3RydWN0aW9ucyBwZXIgbWVtc2V0IGNhbGwuCisgIC8vLworICAvLy8gV2hlbiBsb3dlcmluZyBcQGxsdm0ubWVtc2V0IHRoaXMgZmllbGQgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZgorICAvLy8gc3RvcmUgb3BlcmF0aW9ucyB0aGF0IG1heSBiZSBzdWJzdGl0dXRlZCBmb3IgdGhlIGNhbGwgdG8gbWVtc2V0LiBUYXJnZXRzCisgIC8vLyBtdXN0IHNldCB0aGlzIHZhbHVlIGJhc2VkIG9uIHRoZSBjb3N0IHRocmVzaG9sZCBmb3IgdGhhdCB0YXJnZXQuIFRhcmdldHMKKyAgLy8vIHNob3VsZCBhc3N1bWUgdGhhdCB0aGUgbWVtc2V0IHdpbGwgYmUgZG9uZSB1c2luZyBhcyBtYW55IG9mIHRoZSBsYXJnZXN0CisgIC8vLyBzdG9yZSBvcGVyYXRpb25zIGZpcnN0LCBmb2xsb3dlZCBieSBzbWFsbGVyIG9uZXMsIGlmIG5lY2Vzc2FyeSwgcGVyCisgIC8vLyBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zLiBGb3IgZXhhbXBsZSwgc3RvcmluZyA5IGJ5dGVzIG9uIGEgMzItYml0IG1hY2hpbmUKKyAgLy8vIHdpdGggMTYtYml0IGFsaWdubWVudCB3b3VsZCByZXN1bHQgaW4gZm91ciAyLWJ5dGUgc3RvcmVzIGFuZCBvbmUgMS1ieXRlCisgIC8vLyBzdG9yZS4gIFRoaXMgb25seSBhcHBsaWVzIHRvIHNldHRpbmcgYSBjb25zdGFudCBhcnJheSBvZiBhIGNvbnN0YW50IHNpemUuCisgIHVuc2lnbmVkIE1heFN0b3Jlc1Blck1lbXNldDsKKworICAvLy8gTWF4aW11bSBudW1iZXIgb2Ygc3RvcmVzIG9wZXJhdGlvbnMgdGhhdCBtYXkgYmUgc3Vic3RpdHV0ZWQgZm9yIHRoZSBjYWxsCisgIC8vLyB0byBtZW1zZXQsIHVzZWQgZm9yIGZ1bmN0aW9ucyB3aXRoIE9wdFNpemUgYXR0cmlidXRlLgorICB1bnNpZ25lZCBNYXhTdG9yZXNQZXJNZW1zZXRPcHRTaXplOworCisgIC8vLyBcYnJpZWYgU3BlY2lmeSBtYXhpbXVtIGJ5dGVzIG9mIHN0b3JlIGluc3RydWN0aW9ucyBwZXIgbWVtY3B5IGNhbGwuCisgIC8vLworICAvLy8gV2hlbiBsb3dlcmluZyBcQGxsdm0ubWVtY3B5IHRoaXMgZmllbGQgc3BlY2lmaWVzIHRoZSBtYXhpbXVtIG51bWJlciBvZgorICAvLy8gc3RvcmUgb3BlcmF0aW9ucyB0aGF0IG1heSBiZSBzdWJzdGl0dXRlZCBmb3IgYSBjYWxsIHRvIG1lbWNweS4gVGFyZ2V0cworICAvLy8gbXVzdCBzZXQgdGhpcyB2YWx1ZSBiYXNlZCBvbiB0aGUgY29zdCB0aHJlc2hvbGQgZm9yIHRoYXQgdGFyZ2V0LiBUYXJnZXRzCisgIC8vLyBzaG91bGQgYXNzdW1lIHRoYXQgdGhlIG1lbWNweSB3aWxsIGJlIGRvbmUgdXNpbmcgYXMgbWFueSBvZiB0aGUgbGFyZ2VzdAorICAvLy8gc3RvcmUgb3BlcmF0aW9ucyBmaXJzdCwgZm9sbG93ZWQgYnkgc21hbGxlciBvbmVzLCBpZiBuZWNlc3NhcnksIHBlcgorICAvLy8gYWxpZ25tZW50IHJlc3RyaWN0aW9ucy4gRm9yIGV4YW1wbGUsIHN0b3JpbmcgNyBieXRlcyBvbiBhIDMyLWJpdCBtYWNoaW5lCisgIC8vLyB3aXRoIDMyLWJpdCBhbGlnbm1lbnQgd291bGQgcmVzdWx0IGluIG9uZSA0LWJ5dGUgc3RvcmUsIGEgb25lIDItYnl0ZSBzdG9yZQorICAvLy8gYW5kIG9uZSAxLWJ5dGUgc3RvcmUuIFRoaXMgb25seSBhcHBsaWVzIHRvIGNvcHlpbmcgYSBjb25zdGFudCBhcnJheSBvZgorICAvLy8gY29uc3RhbnQgc2l6ZS4KKyAgdW5zaWduZWQgTWF4U3RvcmVzUGVyTWVtY3B5OworCisgIC8vLyBNYXhpbXVtIG51bWJlciBvZiBzdG9yZSBvcGVyYXRpb25zIHRoYXQgbWF5IGJlIHN1YnN0aXR1dGVkIGZvciBhIGNhbGwgdG8KKyAgLy8vIG1lbWNweSwgdXNlZCBmb3IgZnVuY3Rpb25zIHdpdGggT3B0U2l6ZSBhdHRyaWJ1dGUuCisgIHVuc2lnbmVkIE1heFN0b3Jlc1Blck1lbWNweU9wdFNpemU7CisgIHVuc2lnbmVkIE1heExvYWRzUGVyTWVtY21wOworICB1bnNpZ25lZCBNYXhMb2Fkc1Blck1lbWNtcE9wdFNpemU7CisKKyAgLy8vIFxicmllZiBTcGVjaWZ5IG1heGltdW0gYnl0ZXMgb2Ygc3RvcmUgaW5zdHJ1Y3Rpb25zIHBlciBtZW1tb3ZlIGNhbGwuCisgIC8vLworICAvLy8gV2hlbiBsb3dlcmluZyBcQGxsdm0ubWVtbW92ZSB0aGlzIGZpZWxkIHNwZWNpZmllcyB0aGUgbWF4aW11bSBudW1iZXIgb2YKKyAgLy8vIHN0b3JlIGluc3RydWN0aW9ucyB0aGF0IG1heSBiZSBzdWJzdGl0dXRlZCBmb3IgYSBjYWxsIHRvIG1lbW1vdmUuIFRhcmdldHMKKyAgLy8vIG11c3Qgc2V0IHRoaXMgdmFsdWUgYmFzZWQgb24gdGhlIGNvc3QgdGhyZXNob2xkIGZvciB0aGF0IHRhcmdldC4gVGFyZ2V0cworICAvLy8gc2hvdWxkIGFzc3VtZSB0aGF0IHRoZSBtZW1tb3ZlIHdpbGwgYmUgZG9uZSB1c2luZyBhcyBtYW55IG9mIHRoZSBsYXJnZXN0CisgIC8vLyBzdG9yZSBvcGVyYXRpb25zIGZpcnN0LCBmb2xsb3dlZCBieSBzbWFsbGVyIG9uZXMsIGlmIG5lY2Vzc2FyeSwgcGVyCisgIC8vLyBhbGlnbm1lbnQgcmVzdHJpY3Rpb25zLiBGb3IgZXhhbXBsZSwgbW92aW5nIDkgYnl0ZXMgb24gYSAzMi1iaXQgbWFjaGluZQorICAvLy8gd2l0aCA4LWJpdCBhbGlnbm1lbnQgd291bGQgcmVzdWx0IGluIG5pbmUgMS1ieXRlIHN0b3Jlcy4gIFRoaXMgb25seQorICAvLy8gYXBwbGllcyB0byBjb3B5aW5nIGEgY29uc3RhbnQgYXJyYXkgb2YgY29uc3RhbnQgc2l6ZS4KKyAgdW5zaWduZWQgTWF4U3RvcmVzUGVyTWVtbW92ZTsKKworICAvLy8gTWF4aW11bSBudW1iZXIgb2Ygc3RvcmUgaW5zdHJ1Y3Rpb25zIHRoYXQgbWF5IGJlIHN1YnN0aXR1dGVkIGZvciBhIGNhbGwgdG8KKyAgLy8vIG1lbW1vdmUsIHVzZWQgZm9yIGZ1bmN0aW9ucyB3aXRoIE9wdFNpemUgYXR0cmlidXRlLgorICB1bnNpZ25lZCBNYXhTdG9yZXNQZXJNZW1tb3ZlT3B0U2l6ZTsKKworICAvLy8gVGVsbHMgdGhlIGNvZGUgZ2VuZXJhdG9yIHRoYXQgc2VsZWN0IGlzIG1vcmUgZXhwZW5zaXZlIHRoYW4gYSBicmFuY2ggaWYKKyAgLy8vIHRoZSBicmFuY2ggaXMgdXN1YWxseSBwcmVkaWN0ZWQgcmlnaHQuCisgIGJvb2wgUHJlZGljdGFibGVTZWxlY3RJc0V4cGVuc2l2ZTsKKworICAvLy8gXHNlZSBlbmFibGVFeHRMZFByb21vdGlvbi4KKyAgYm9vbCBFbmFibGVFeHRMZFByb21vdGlvbjsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIHR5cGVzIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IHRoZSBzcGVjaWZpZWQKKyAgLy8vIHJlZ2lzdGVyIGNsYXNzIGFyZSBhbGwgbGVnYWwuCisgIGJvb2wgaXNMZWdhbFJDKGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAmVFJJLAorICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICZSQykgY29uc3Q7CisKKyAgLy8vIFJlcGxhY2UvbW9kaWZ5IGFueSBUYXJnZXRGcmFtZUluZGV4IG9wZXJhbmRzIHdpdGggYSB0YXJndGUtZGVwZW5kZW50CisgIC8vLyBzZXF1ZW5jZSBvZiBtZW1vcnkgb3BlcmFuZHMgdGhhdCBpcyByZWNvZ25pemVkIGJ5IFByb2xvZ0VwaWxvZ0luc2VydGVyLgorICBNYWNoaW5lQmFzaWNCbG9jayAqZW1pdFBhdGNoUG9pbnQoTWFjaGluZUluc3RyICZNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVCYXNpY0Jsb2NrICpNQkIpIGNvbnN0OworCisgIC8vLyBSZXBsYWNlL21vZGlmeSB0aGUgWFJheSBjdXN0b20gZXZlbnQgb3BlcmFuZHMgd2l0aCB0YXJnZXQtZGVwZW5kZW50CisgIC8vLyBkZXRhaWxzLgorICBNYWNoaW5lQmFzaWNCbG9jayAqZW1pdFhSYXlDdXN0b21FdmVudChNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdDsKK307CisKKy8vLyBUaGlzIGNsYXNzIGRlZmluZXMgaW5mb3JtYXRpb24gdXNlZCB0byBsb3dlciBMTFZNIGNvZGUgdG8gbGVnYWwgU2VsZWN0aW9uREFHCisvLy8gb3BlcmF0b3JzIHRoYXQgdGhlIHRhcmdldCBpbnN0cnVjdGlvbiBzZWxlY3RvciBjYW4gYWNjZXB0IG5hdGl2ZWx5LgorLy8vCisvLy8gVGhpcyBjbGFzcyBhbHNvIGRlZmluZXMgY2FsbGJhY2tzIHRoYXQgdGFyZ2V0cyBtdXN0IGltcGxlbWVudCB0byBsb3dlcgorLy8vIHRhcmdldC1zcGVjaWZpYyBjb25zdHJ1Y3RzIHRvIFNlbGVjdGlvbkRBRyBvcGVyYXRvcnMuCitjbGFzcyBUYXJnZXRMb3dlcmluZyA6IHB1YmxpYyBUYXJnZXRMb3dlcmluZ0Jhc2UgeworcHVibGljOgorICBzdHJ1Y3QgREFHQ29tYmluZXJJbmZvOworCisgIFRhcmdldExvd2VyaW5nKGNvbnN0IFRhcmdldExvd2VyaW5nICYpID0gZGVsZXRlOworICBUYXJnZXRMb3dlcmluZyAmb3BlcmF0b3I9KGNvbnN0IFRhcmdldExvd2VyaW5nICYpID0gZGVsZXRlOworCisgIC8vLyBOT1RFOiBUaGUgVGFyZ2V0TWFjaGluZSBvd25zIFRMT0YuCisgIGV4cGxpY2l0IFRhcmdldExvd2VyaW5nKGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKTsKKworICBib29sIGlzUG9zaXRpb25JbmRlcGVuZGVudCgpIGNvbnN0OworCisgIHZpcnR1YWwgYm9vbCBpc1NETm9kZVNvdXJjZU9mRGl2ZXJnZW5jZShjb25zdCBTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkxvd2VyaW5nSW5mbyAqRkxJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGl2ZXJnZW5jZUFuYWx5c2lzICpEQSkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBpc1NETm9kZUFsd2F5c1VuaWZvcm0oY29uc3QgU0ROb2RlICogTikgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgYnkgdmFsdWUsIGJhc2UgcG9pbnRlciBhbmQgb2Zmc2V0IHBvaW50ZXIgYW5kIGFkZHJlc3NpbmcgbW9kZQorICAvLy8gYnkgcmVmZXJlbmNlIGlmIHRoZSBub2RlJ3MgYWRkcmVzcyBjYW4gYmUgbGVnYWxseSByZXByZXNlbnRlZCBhcworICAvLy8gcHJlLWluZGV4ZWQgbG9hZCAvIHN0b3JlIGFkZHJlc3MuCisgIHZpcnR1YWwgYm9vbCBnZXRQcmVJbmRleGVkQWRkcmVzc1BhcnRzKFNETm9kZSAqIC8qTiovLCBTRFZhbHVlICYvKkJhc2UqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmLypPZmZzZXQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpNZW1JbmRleGVkTW9kZSAmLypBTSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJi8qREFHKi8pIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGJ5IHZhbHVlLCBiYXNlIHBvaW50ZXIgYW5kIG9mZnNldCBwb2ludGVyIGFuZCBhZGRyZXNzaW5nIG1vZGUKKyAgLy8vIGJ5IHJlZmVyZW5jZSBpZiB0aGlzIG5vZGUgY2FuIGJlIGNvbWJpbmVkIHdpdGggYSBsb2FkIC8gc3RvcmUgdG8gZm9ybSBhCisgIC8vLyBwb3N0LWluZGV4ZWQgbG9hZCAvIHN0b3JlLgorICB2aXJ0dWFsIGJvb2wgZ2V0UG9zdEluZGV4ZWRBZGRyZXNzUGFydHMoU0ROb2RlICogLypOKi8sIFNETm9kZSAqIC8qT3AqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgJi8qQmFzZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmLypPZmZzZXQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTRDo6TWVtSW5kZXhlZE1vZGUgJi8qQU0qLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmLypEQUcqLykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGVudHJ5IGVuY29kaW5nIGZvciBhIGp1bXAgdGFibGUgaW4gdGhlIGN1cnJlbnQgZnVuY3Rpb24uICBUaGUKKyAgLy8vIHJldHVybmVkIHZhbHVlIGlzIGEgbWVtYmVyIG9mIHRoZSBNYWNoaW5lSnVtcFRhYmxlSW5mbzo6SlRFbnRyeUtpbmQgZW51bS4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRKdW1wVGFibGVFbmNvZGluZygpIGNvbnN0OworCisgIHZpcnR1YWwgY29uc3QgTUNFeHByICoKKyAgTG93ZXJDdXN0b21KdW1wVGFibGVFbnRyeShjb25zdCBNYWNoaW5lSnVtcFRhYmxlSW5mbyAqIC8qTUpUSSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVCYXNpY0Jsb2NrICogLypNQkIqLywgdW5zaWduZWQgLyp1aWQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJi8qQ3R4Ki8pIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJOZWVkIHRvIGltcGxlbWVudCB0aGlzIGhvb2sgaWYgdGFyZ2V0IGhhcyBjdXN0b20gSlRJcyIpOworICB9CisKKyAgLy8vIFJldHVybnMgcmVsb2NhdGlvbiBiYXNlIGZvciB0aGUgZ2l2ZW4gUElDIGp1bXB0YWJsZS4KKyAgdmlydHVhbCBTRFZhbHVlIGdldFBJQ0p1bXBUYWJsZVJlbG9jQmFzZShTRFZhbHVlIFRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAvLy8gVGhpcyByZXR1cm5zIHRoZSByZWxvY2F0aW9uIGJhc2UgZm9yIHRoZSBnaXZlbiBQSUMganVtcHRhYmxlLCB0aGUgc2FtZSBhcworICAvLy8gZ2V0UElDSnVtcFRhYmxlUmVsb2NCYXNlLCBidXQgYXMgYW4gTUNFeHByLgorICB2aXJ0dWFsIGNvbnN0IE1DRXhwciAqCisgIGdldFBJQ0p1bXBUYWJsZVJlbG9jQmFzZUV4cHIoY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBKVEksIE1DQ29udGV4dCAmQ3R4KSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgZm9sZGluZyBhIGNvbnN0YW50IG9mZnNldCB3aXRoIHRoZSBnaXZlbiBHbG9iYWxBZGRyZXNzIGlzCisgIC8vLyBsZWdhbC4gIEl0IGlzIGZyZXF1ZW50bHkgbm90IGxlZ2FsIGluIFBJQyByZWxvY2F0aW9uIG1vZGVscy4KKyAgdmlydHVhbCBib29sIGlzT2Zmc2V0Rm9sZGluZ0xlZ2FsKGNvbnN0IEdsb2JhbEFkZHJlc3NTRE5vZGUgKkdBKSBjb25zdDsKKworICBib29sIGlzSW5UYWlsQ2FsbFBvc2l0aW9uKFNlbGVjdGlvbkRBRyAmREFHLCBTRE5vZGUgKk5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSAmQ2hhaW4pIGNvbnN0OworCisgIHZvaWQgc29mdGVuU2V0Q0NPcGVyYW5kcyhTZWxlY3Rpb25EQUcgJkRBRywgRVZUIFZULCBTRFZhbHVlICZOZXdMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlICZOZXdSSFMsIElTRDo6Q29uZENvZGUgJkNDQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNETG9jICZETCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgYSBwYWlyIG9mIChyZXR1cm4gdmFsdWUsIGNoYWluKS4KKyAgLy8vIEl0IGlzIGFuIGVycm9yIHRvIHBhc3MgUlRMSUI6OlVOS05PV05fTElCQ0FMTCBhcyBccCBMQy4KKyAgc3RkOjpwYWlyPFNEVmFsdWUsIFNEVmFsdWU+IG1ha2VMaWJDYWxsKFNlbGVjdGlvbkRBRyAmREFHLCBSVExJQjo6TGliY2FsbCBMQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBSZXRWVCwgQXJyYXlSZWY8U0RWYWx1ZT4gT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1NpZ25lZCwgY29uc3QgU0RMb2MgJmRsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb2VzTm90UmV0dXJuID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUmV0dXJuVmFsdWVVc2VkID0gdHJ1ZSkgY29uc3Q7CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgcGFyYW1ldGVycyB0byBhIGNhbGwgdGhhdCBhcmUgcGFzc2VkIGluIGNhbGxlZSBzYXZlZAorICAvLy8gcmVnaXN0ZXJzIGFyZSB0aGUgc2FtZSBhcyBmcm9tIHRoZSBjYWxsaW5nIGZ1bmN0aW9uLiAgVGhpcyBuZWVkcyB0byBiZQorICAvLy8gY2hlY2tlZCBmb3IgdGFpbCBjYWxsIGVsaWdpYmlsaXR5LgorICBib29sIHBhcmFtZXRlcnNJbkNTUk1hdGNoKGNvbnN0IE1hY2hpbmVSZWdpc3RlckluZm8gJk1SSSwKKyAgICAgIGNvbnN0IHVpbnQzMl90ICpDYWxsZXJQcmVzZXJ2ZWRNYXNrLAorICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPENDVmFsQXNzaWduPiAmQXJnTG9jcywKKyAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmT3V0VmFscykgY29uc3Q7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFRhcmdldExvd2VyaW5nIE9wdGltaXphdGlvbiBNZXRob2RzCisgIC8vCisKKyAgLy8vIEEgY29udmVuaWVuY2Ugc3RydWN0IHRoYXQgZW5jYXBzdWxhdGVzIGEgREFHLCBhbmQgdHdvIFNEVmFsdWVzIGZvcgorICAvLy8gcmV0dXJuaW5nIGluZm9ybWF0aW9uIGZyb20gVGFyZ2V0TG93ZXJpbmcgdG8gaXRzIGNsaWVudHMgdGhhdCB3YW50IHRvCisgIC8vLyBjb21iaW5lLgorICBzdHJ1Y3QgVGFyZ2V0TG93ZXJpbmdPcHQgeworICAgIFNlbGVjdGlvbkRBRyAmREFHOworICAgIGJvb2wgTGVnYWxUeXM7CisgICAgYm9vbCBMZWdhbE9wczsKKyAgICBTRFZhbHVlIE9sZDsKKyAgICBTRFZhbHVlIE5ldzsKKworICAgIGV4cGxpY2l0IFRhcmdldExvd2VyaW5nT3B0KFNlbGVjdGlvbkRBRyAmSW5EQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBMVCwgYm9vbCBMTykgOgorICAgICAgREFHKEluREFHKSwgTGVnYWxUeXMoTFQpLCBMZWdhbE9wcyhMTykge30KKworICAgIGJvb2wgTGVnYWxUeXBlcygpIGNvbnN0IHsgcmV0dXJuIExlZ2FsVHlzOyB9CisgICAgYm9vbCBMZWdhbE9wZXJhdGlvbnMoKSBjb25zdCB7IHJldHVybiBMZWdhbE9wczsgfQorCisgICAgYm9vbCBDb21iaW5lVG8oU0RWYWx1ZSBPLCBTRFZhbHVlIE4pIHsKKyAgICAgIE9sZCA9IE87CisgICAgICBOZXcgPSBOOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9OworCisgIC8vLyBDaGVjayB0byBzZWUgaWYgdGhlIHNwZWNpZmllZCBvcGVyYW5kIG9mIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gaXMgYQorICAvLy8gY29uc3RhbnQgaW50ZWdlci4gIElmIHNvLCBjaGVjayB0byBzZWUgaWYgdGhlcmUgYXJlIGFueSBiaXRzIHNldCBpbiB0aGUKKyAgLy8vIGNvbnN0YW50IHRoYXQgYXJlIG5vdCBkZW1hbmRlZC4gIElmIHNvLCBzaHJpbmsgdGhlIGNvbnN0YW50IGFuZCByZXR1cm4KKyAgLy8vIHRydWUuCisgIGJvb2wgU2hyaW5rRGVtYW5kZWRDb25zdGFudChTRFZhbHVlIE9wLCBjb25zdCBBUEludCAmRGVtYW5kZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRMb3dlcmluZ09wdCAmVExPKSBjb25zdDsKKworICAvLyBUYXJnZXQgaG9vayB0byBkbyB0YXJnZXQtc3BlY2lmaWMgY29uc3Qgb3B0aW1pemF0aW9uLCB3aGljaCBpcyBjYWxsZWQgYnkKKyAgLy8gU2hyaW5rRGVtYW5kZWRDb25zdGFudC4gVGhpcyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldAorICAvLyBkb2Vzbid0IHdhbnQgU2hyaW5rRGVtYW5kZWRDb25zdGFudCB0byBmdXJ0aGVyIG9wdGltaXplIHRoZSBjb25zdGFudC4KKyAgdmlydHVhbCBib29sIHRhcmdldFNocmlua0RlbWFuZGVkQ29uc3RhbnQoU0RWYWx1ZSBPcCwgY29uc3QgQVBJbnQgJkRlbWFuZGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRMb3dlcmluZ09wdCAmVExPKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIENvbnZlcnQgeCt5IHRvIChWVCkoKFNtYWxsVlQpeCsoU21hbGxWVCl5KSBpZiB0aGUgY2FzdHMgYXJlIGZyZWUuICBUaGlzCisgIC8vLyB1c2VzIGlzWkV4dEZyZWUgYW5kIFpFUk9fRVhURU5EIGZvciB0aGUgd2lkZW5pbmcgY2FzdCwgYnV0IGl0IGNvdWxkIGJlCisgIC8vLyBnZW5lcmFsaXplZCBmb3IgdGFyZ2V0cyB3aXRoIG90aGVyIHR5cGVzIG9mIGltcGxpY2l0IHdpZGVuaW5nIGNhc3RzLgorICBib29sIFNocmlua0RlbWFuZGVkT3AoU0RWYWx1ZSBPcCwgdW5zaWduZWQgQml0V2lkdGgsIGNvbnN0IEFQSW50ICZEZW1hbmRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldExvd2VyaW5nT3B0ICZUTE8pIGNvbnN0OworCisgIC8vLyBIZWxwZXIgZm9yIFNpbXBsaWZ5RGVtYW5kZWRCaXRzIHRoYXQgY2FuIHNpbXBsaWZ5IGFuIG9wZXJhdGlvbiB3aXRoCisgIC8vLyBtdWx0aXBsZSB1c2VzLiAgVGhpcyBmdW5jdGlvbiBzaW1wbGlmaWVzIG9wZXJhbmQgXHAgT3BJZHggb2YgXHAgVXNlciBhbmQKKyAgLy8vIHRoZW4gdXBkYXRlcyBccCBVc2VyIHdpdGggdGhlIHNpbXBsaWZpZWQgdmVyc2lvbi4gTm8gb3RoZXIgdXNlcyBvZgorICAvLy8gXHAgT3BJZHggYXJlIHVwZGF0ZWQuIElmIFxwIFVzZXIgaXMgdGhlIG9ubHkgdXNlciBvZiBccCBPcElkeCwgdGhpcworICAvLy8gZnVuY3Rpb24gYmVoYXZlcyBleGFjdGx5IGxpa2UgZnVuY3Rpb24gU2ltcGxpZnlEZW1hbmRlZEJpdHMgZGVjbGFyZWQKKyAgLy8vIGJlbG93IGV4Y2VwdCB0aGF0IGl0IGFsc28gdXBkYXRlcyB0aGUgREFHIGJ5IGNhbGxpbmcKKyAgLy8vIERDSS5Db21taXRUYXJnZXRMb3dlcmluZ09wdC4KKyAgYm9vbCBTaW1wbGlmeURlbWFuZGVkQml0cyhTRE5vZGUgKlVzZXIsIHVuc2lnbmVkIE9wSWR4LCBjb25zdCBBUEludCAmRGVtYW5kZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHQ29tYmluZXJJbmZvICZEQ0ksIFRhcmdldExvd2VyaW5nT3B0ICZUTE8pIGNvbnN0OworCisgIC8vLyBMb29rIGF0IE9wLiAgQXQgdGhpcyBwb2ludCwgd2Uga25vdyB0aGF0IG9ubHkgdGhlIERlbWFuZGVkTWFzayBiaXRzIG9mIHRoZQorICAvLy8gcmVzdWx0IG9mIE9wIGFyZSBldmVyIHVzZWQgZG93bnN0cmVhbS4gIElmIHdlIGNhbiB1c2UgdGhpcyBpbmZvcm1hdGlvbiB0bworICAvLy8gc2ltcGxpZnkgT3AsIGNyZWF0ZSBhIG5ldyBzaW1wbGlmaWVkIERBRyBub2RlIGFuZCByZXR1cm4gdHJ1ZSwgcmV0dXJuaW5nCisgIC8vLyB0aGUgb3JpZ2luYWwgYW5kIG5ldyBub2RlcyBpbiBPbGQgYW5kIE5ldy4gIE90aGVyd2lzZSwgYW5hbHl6ZSB0aGUKKyAgLy8vIGV4cHJlc3Npb24gYW5kIHJldHVybiBhIG1hc2sgb2YgS25vd25PbmUgYW5kIEtub3duWmVybyBiaXRzIGZvciB0aGUKKyAgLy8vIGV4cHJlc3Npb24gKHVzZWQgdG8gc2ltcGxpZnkgdGhlIGNhbGxlcikuICBUaGUgS25vd25aZXJvL09uZSBiaXRzIG1heSBvbmx5CisgIC8vLyBiZSBhY2N1cmF0ZSBmb3IgdGhvc2UgYml0cyBpbiB0aGUgRGVtYW5kZWRNYXNrLgorICAvLy8gXHAgQXNzdW1lU2luZ2xlVXNlIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgdGhpcyBmdW5jdGlvbiB3aWxsCisgIC8vLyAgICBhdHRlbXB0IHRvIHNpbXBsaWZ5IFxwIE9wIGV2ZW4gaWYgdGhlcmUgYXJlIG11bHRpcGxlIHVzZXMuCisgIC8vLyAgICBDYWxsZXJzIGFyZSByZXNwb25zaWJsZSBmb3IgY29ycmVjdGx5IHVwZGF0aW5nIHRoZSBEQUcgYmFzZWQgb24gdGhlCisgIC8vLyAgICByZXN1bHRzIG9mIHRoaXMgZnVuY3Rpb24sIGJlY2F1c2Ugc2ltcGx5IHJlcGxhY2luZyByZXBsYWNpbmcgVExPLk9sZAorICAvLy8gICAgd2l0aCBUTE8uTmV3IHdpbGwgYmUgaW5jb3JyZWN0IHdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSBhbmQgVExPLk9sZAorICAvLy8gICAgaGFzIG11bHRpcGxlIHVzZXMuCisgIGJvb2wgU2ltcGxpZnlEZW1hbmRlZEJpdHMoU0RWYWx1ZSBPcCwgY29uc3QgQVBJbnQgJkRlbWFuZGVkTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLbm93bkJpdHMgJktub3duLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldExvd2VyaW5nT3B0ICZUTE8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQXNzdW1lU2luZ2xlVXNlID0gZmFsc2UpIGNvbnN0OworCisgIC8vLyBIZWxwZXIgd3JhcHBlciBhcm91bmQgU2ltcGxpZnlEZW1hbmRlZEJpdHMKKyAgYm9vbCBTaW1wbGlmeURlbWFuZGVkQml0cyhTRFZhbHVlIE9wLCBjb25zdCBBUEludCAmRGVtYW5kZWRNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERBR0NvbWJpbmVySW5mbyAmRENJKSBjb25zdDsKKworICAvLy8gTG9vayBhdCBWZWN0b3IgT3AuIEF0IHRoaXMgcG9pbnQsIHdlIGtub3cgdGhhdCBvbmx5IHRoZSBEZW1hbmRlZEVsdHMKKyAgLy8vIGVsZW1lbnRzIG9mIHRoZSByZXN1bHQgb2YgT3AgYXJlIGV2ZXIgdXNlZCBkb3duc3RyZWFtLiAgSWYgd2UgY2FuIHVzZQorICAvLy8gdGhpcyBpbmZvcm1hdGlvbiB0byBzaW1wbGlmeSBPcCwgY3JlYXRlIGEgbmV3IHNpbXBsaWZpZWQgREFHIG5vZGUgYW5kCisgIC8vLyByZXR1cm4gdHJ1ZSwgc3RvcmluZyB0aGUgb3JpZ2luYWwgYW5kIG5ldyBub2RlcyBpbiBUTE8uCisgIC8vLyBPdGhlcndpc2UsIGFuYWx5emUgdGhlIGV4cHJlc3Npb24gYW5kIHJldHVybiBhIG1hc2sgb2YgS25vd25VbmRlZiBhbmQKKyAgLy8vIEtub3duWmVybyBlbGVtZW50cyBmb3IgdGhlIGV4cHJlc3Npb24gKHVzZWQgdG8gc2ltcGxpZnkgdGhlIGNhbGxlcikuCisgIC8vLyBUaGUgS25vd25VbmRlZi9aZXJvIGVsZW1lbnRzIG1heSBvbmx5IGJlIGFjY3VyYXRlIGZvciB0aG9zZSBiaXRzCisgIC8vLyBpbiB0aGUgRGVtYW5kZWRNYXNrLgorICAvLy8gXHAgQXNzdW1lU2luZ2xlVXNlIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSwgdGhpcyBmdW5jdGlvbiB3aWxsCisgIC8vLyAgICBhdHRlbXB0IHRvIHNpbXBsaWZ5IFxwIE9wIGV2ZW4gaWYgdGhlcmUgYXJlIG11bHRpcGxlIHVzZXMuCisgIC8vLyAgICBDYWxsZXJzIGFyZSByZXNwb25zaWJsZSBmb3IgY29ycmVjdGx5IHVwZGF0aW5nIHRoZSBEQUcgYmFzZWQgb24gdGhlCisgIC8vLyAgICByZXN1bHRzIG9mIHRoaXMgZnVuY3Rpb24sIGJlY2F1c2Ugc2ltcGx5IHJlcGxhY2luZyByZXBsYWNpbmcgVExPLk9sZAorICAvLy8gICAgd2l0aCBUTE8uTmV3IHdpbGwgYmUgaW5jb3JyZWN0IHdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgdHJ1ZSBhbmQgVExPLk9sZAorICAvLy8gICAgaGFzIG11bHRpcGxlIHVzZXMuCisgIGJvb2wgU2ltcGxpZnlEZW1hbmRlZFZlY3RvckVsdHMoU0RWYWx1ZSBPcCwgY29uc3QgQVBJbnQgJkRlbWFuZGVkRWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludCAmS25vd25VbmRlZiwgQVBJbnQgJktub3duWmVybywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRMb3dlcmluZ09wdCAmVExPLCB1bnNpZ25lZCBEZXB0aCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBc3N1bWVTaW5nbGVVc2UgPSBmYWxzZSkgY29uc3Q7CisKKyAgLy8vIEhlbHBlciB3cmFwcGVyIGFyb3VuZCBTaW1wbGlmeURlbWFuZGVkVmVjdG9yRWx0cworICBib29sIFNpbXBsaWZ5RGVtYW5kZWRWZWN0b3JFbHRzKFNEVmFsdWUgT3AsIGNvbnN0IEFQSW50ICZEZW1hbmRlZEVsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgJktub3duVW5kZWYsIEFQSW50ICZLbm93blplcm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREFHQ29tYmluZXJJbmZvICZEQ0kpIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmUgd2hpY2ggb2YgdGhlIGJpdHMgc3BlY2lmaWVkIGluIE1hc2sgYXJlIGtub3duIHRvIGJlIGVpdGhlciB6ZXJvCisgIC8vLyBvciBvbmUgYW5kIHJldHVybiB0aGVtIGluIHRoZSBLbm93blplcm8vS25vd25PbmUgYml0c2V0cy4gVGhlIERlbWFuZGVkRWx0cworICAvLy8gYXJndW1lbnQgYWxsb3dzIHVzIHRvIG9ubHkgY29sbGVjdCB0aGUga25vd24gYml0cyB0aGF0IGFyZSBzaGFyZWQgYnkgdGhlCisgIC8vLyByZXF1ZXN0ZWQgdmVjdG9yIGVsZW1lbnRzLgorICB2aXJ0dWFsIHZvaWQgY29tcHV0ZUtub3duQml0c0ZvclRhcmdldE5vZGUoY29uc3QgU0RWYWx1ZSBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duQml0cyAmS25vd24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBUEludCAmRGVtYW5kZWRFbHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEZXB0aCA9IDApIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmUgd2hpY2ggb2YgdGhlIGJpdHMgb2YgRnJhbWVJbmRleCBccCBGSU9wIGFyZSBrbm93biB0byBiZSAwLgorICAvLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjb21wdXRlcyBsb3cgYml0cyBiYXNlZCBvbiBhbGlnbm1lbnQKKyAgLy8vIGluZm9ybWF0aW9uLiBUaGlzIHNob3VsZCBwcmVzZXJ2ZSBrbm93biBiaXRzIHBhc3NlZCBpbnRvIGl0LgorICB2aXJ0dWFsIHZvaWQgY29tcHV0ZUtub3duQml0c0ZvckZyYW1lSW5kZXgoY29uc3QgU0RWYWx1ZSBGSU9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS25vd25CaXRzICZLbm93biwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFQSW50ICZEZW1hbmRlZEVsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlcHRoID0gMCkgY29uc3Q7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGNhbiBiZSBpbXBsZW1lbnRlZCBieSB0YXJnZXRzIHRoYXQgd2FudCB0byBleHBvc2UgYWRkaXRpb25hbAorICAvLy8gaW5mb3JtYXRpb24gYWJvdXQgc2lnbiBiaXRzIHRvIHRoZSBEQUcgQ29tYmluZXIuIFRoZSBEZW1hbmRlZEVsdHMKKyAgLy8vIGFyZ3VtZW50IGFsbG93cyB1cyB0byBvbmx5IGNvbGxlY3QgdGhlIG1pbmltdW0gc2lnbiBiaXRzIHRoYXQgYXJlIHNoYXJlZAorICAvLy8gYnkgdGhlIHJlcXVlc3RlZCB2ZWN0b3IgZWxlbWVudHMuCisgIHZpcnR1YWwgdW5zaWduZWQgQ29tcHV0ZU51bVNpZ25CaXRzRm9yVGFyZ2V0Tm9kZShTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBJbnQgJkRlbWFuZGVkRWx0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVwdGggPSAwKSBjb25zdDsKKworICAvLy8gQXR0ZW1wdCB0byBzaW1wbGlmeSBhbnkgdGFyZ2V0IG5vZGVzIGJhc2VkIG9uIHRoZSBkZW1hbmRlZCB2ZWN0b3IKKyAgLy8vIGVsZW1lbnRzLCByZXR1cm5pbmcgdHJ1ZSBvbiBzdWNjZXNzLiBPdGhlcndpc2UsIGFuYWx5emUgdGhlIGV4cHJlc3Npb24gYW5kCisgIC8vLyByZXR1cm4gYSBtYXNrIG9mIEtub3duVW5kZWYgYW5kIEtub3duWmVybyBlbGVtZW50cyBmb3IgdGhlIGV4cHJlc3Npb24KKyAgLy8vICh1c2VkIHRvIHNpbXBsaWZ5IHRoZSBjYWxsZXIpLiBUaGUgS25vd25VbmRlZi9aZXJvIGVsZW1lbnRzIG1heSBvbmx5IGJlCisgIC8vLyBhY2N1cmF0ZSBmb3IgdGhvc2UgYml0cyBpbiB0aGUgRGVtYW5kZWRNYXNrCisgIHZpcnR1YWwgYm9vbCBTaW1wbGlmeURlbWFuZGVkVmVjdG9yRWx0c0ZvclRhcmdldE5vZGUoCisgICAgICBTRFZhbHVlIE9wLCBjb25zdCBBUEludCAmRGVtYW5kZWRFbHRzLCBBUEludCAmS25vd25VbmRlZiwKKyAgICAgIEFQSW50ICZLbm93blplcm8sIFRhcmdldExvd2VyaW5nT3B0ICZUTE8sIHVuc2lnbmVkIERlcHRoID0gMCkgY29uc3Q7CisKKyAgc3RydWN0IERBR0NvbWJpbmVySW5mbyB7CisgICAgdm9pZCAqREM7ICAvLyBUaGUgREFHIENvbWJpbmVyIG9iamVjdC4KKyAgICBDb21iaW5lTGV2ZWwgTGV2ZWw7CisgICAgYm9vbCBDYWxsZWRCeUxlZ2FsaXplcjsKKworICBwdWJsaWM6CisgICAgU2VsZWN0aW9uREFHICZEQUc7CisKKyAgICBEQUdDb21iaW5lckluZm8oU2VsZWN0aW9uREFHICZkYWcsIENvbWJpbmVMZXZlbCBsZXZlbCwgIGJvb2wgY2wsIHZvaWQgKmRjKQorICAgICAgOiBEQyhkYyksIExldmVsKGxldmVsKSwgQ2FsbGVkQnlMZWdhbGl6ZXIoY2wpLCBEQUcoZGFnKSB7fQorCisgICAgYm9vbCBpc0JlZm9yZUxlZ2FsaXplKCkgY29uc3QgeyByZXR1cm4gTGV2ZWwgPT0gQmVmb3JlTGVnYWxpemVUeXBlczsgfQorICAgIGJvb2wgaXNCZWZvcmVMZWdhbGl6ZU9wcygpIGNvbnN0IHsgcmV0dXJuIExldmVsIDwgQWZ0ZXJMZWdhbGl6ZVZlY3Rvck9wczsgfQorICAgIGJvb2wgaXNBZnRlckxlZ2FsaXplREFHKCkgY29uc3QgeworICAgICAgcmV0dXJuIExldmVsID09IEFmdGVyTGVnYWxpemVEQUc7CisgICAgfQorICAgIENvbWJpbmVMZXZlbCBnZXREQUdDb21iaW5lTGV2ZWwoKSB7IHJldHVybiBMZXZlbDsgfQorICAgIGJvb2wgaXNDYWxsZWRCeUxlZ2FsaXplcigpIGNvbnN0IHsgcmV0dXJuIENhbGxlZEJ5TGVnYWxpemVyOyB9CisKKyAgICB2b2lkIEFkZFRvV29ya2xpc3QoU0ROb2RlICpOKTsKKyAgICBTRFZhbHVlIENvbWJpbmVUbyhTRE5vZGUgKk4sIEFycmF5UmVmPFNEVmFsdWU+IFRvLCBib29sIEFkZFRvID0gdHJ1ZSk7CisgICAgU0RWYWx1ZSBDb21iaW5lVG8oU0ROb2RlICpOLCBTRFZhbHVlIFJlcywgYm9vbCBBZGRUbyA9IHRydWUpOworICAgIFNEVmFsdWUgQ29tYmluZVRvKFNETm9kZSAqTiwgU0RWYWx1ZSBSZXMwLCBTRFZhbHVlIFJlczEsIGJvb2wgQWRkVG8gPSB0cnVlKTsKKworICAgIHZvaWQgQ29tbWl0VGFyZ2V0TG93ZXJpbmdPcHQoY29uc3QgVGFyZ2V0TG93ZXJpbmdPcHQgJlRMTyk7CisgIH07CisKKyAgLy8vIFJldHVybiBpZiB0aGUgTiBpcyBhIGNvbnN0YW50IG9yIGNvbnN0YW50IHZlY3RvciBlcXVhbCB0byB0aGUgdHJ1ZSB2YWx1ZQorICAvLy8gZnJvbSBnZXRCb29sZWFuQ29udGVudHMoKS4KKyAgYm9vbCBpc0NvbnN0VHJ1ZVZhbChjb25zdCBTRE5vZGUgKk4pIGNvbnN0OworCisgIC8vLyBSZXR1cm4gaWYgdGhlIE4gaXMgYSBjb25zdGFudCBvciBjb25zdGFudCB2ZWN0b3IgZXF1YWwgdG8gdGhlIGZhbHNlIHZhbHVlCisgIC8vLyBmcm9tIGdldEJvb2xlYW5Db250ZW50cygpLgorICBib29sIGlzQ29uc3RGYWxzZVZhbChjb25zdCBTRE5vZGUgKk4pIGNvbnN0OworCisgIC8vLyBSZXR1cm4gaWYgXHAgTiBpcyBhIFRydWUgdmFsdWUgd2hlbiBleHRlbmRlZCB0byBccCBWVC4KKyAgYm9vbCBpc0V4dGVuZGVkVHJ1ZVZhbChjb25zdCBDb25zdGFudFNETm9kZSAqTiwgRVZUIFZULCBib29sIFNpZ25lZCkgY29uc3Q7CisKKyAgLy8vIFRyeSB0byBzaW1wbGlmeSBhIHNldGNjIGJ1aWx0IHdpdGggdGhlIHNwZWNpZmllZCBvcGVyYW5kcyBhbmQgY2MuIElmIGl0IGlzCisgIC8vLyB1bmFibGUgdG8gc2ltcGxpZnkgaXQsIHJldHVybiBhIG51bGwgU0RWYWx1ZS4KKyAgU0RWYWx1ZSBTaW1wbGlmeVNldENDKEVWVCBWVCwgU0RWYWx1ZSBOMCwgU0RWYWx1ZSBOMSwgSVNEOjpDb25kQ29kZSBDb25kLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb2xkQm9vbGVhbnMsIERBR0NvbWJpbmVySW5mbyAmRENJLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RMb2MgJmRsKSBjb25zdDsKKworICAvLyBGb3IgdGFyZ2V0cyB3aGljaCB3cmFwIGFkZHJlc3MsIHVud3JhcCBmb3IgYW5hbHlzaXMuCisgIHZpcnR1YWwgU0RWYWx1ZSB1bndyYXBBZGRyZXNzKFNEVmFsdWUgTikgY29uc3QgeyByZXR1cm4gTjsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgKGFuZCB0aGUgR2xvYmFsVmFsdWUgYW5kIHRoZSBvZmZzZXQpIGlmIHRoZSBub2RlIGlzIGEKKyAgLy8vIEdsb2JhbEFkZHJlc3MgKyBvZmZzZXQuCisgIHZpcnR1YWwgYm9vbAorICBpc0dBUGx1c09mZnNldChTRE5vZGUgKk4sIGNvbnN0IEdsb2JhbFZhbHVlKiAmR0EsIGludDY0X3QgJk9mZnNldCkgY29uc3Q7CisKKyAgLy8vIFRoaXMgbWV0aG9kIHdpbGwgYmUgaW52b2tlZCBmb3IgYWxsIHRhcmdldCBub2RlcyBhbmQgZm9yIGFueQorICAvLy8gdGFyZ2V0LWluZGVwZW5kZW50IG5vZGVzIHRoYXQgdGhlIHRhcmdldCBoYXMgcmVnaXN0ZXJlZCB3aXRoIGludm9rZSBpdAorICAvLy8gZm9yLgorICAvLy8KKyAgLy8vIFRoZSBzZW1hbnRpY3MgYXJlIGFzIGZvbGxvd3M6CisgIC8vLyBSZXR1cm4gVmFsdWU6CisgIC8vLyAgIFNEVmFsdWUuVmFsID09IDAgICAtIE5vIGNoYW5nZSB3YXMgbWFkZQorICAvLy8gICBTRFZhbHVlLlZhbCA9PSBOICAgLSBOIHdhcyByZXBsYWNlZCwgaXMgZGVhZCwgYW5kIGlzIGFscmVhZHkgaGFuZGxlZC4KKyAgLy8vICAgb3RoZXJ3aXNlICAgICAgICAgIC0gTiBzaG91bGQgYmUgcmVwbGFjZWQgYnkgdGhlIHJldHVybmVkIE9wZXJhbmQuCisgIC8vLworICAvLy8gSW4gYWRkaXRpb24sIG1ldGhvZHMgcHJvdmlkZWQgYnkgREFHQ29tYmluZXJJbmZvIG1heSBiZSB1c2VkIHRvIHBlcmZvcm0KKyAgLy8vIG1vcmUgY29tcGxleCB0cmFuc2Zvcm1hdGlvbnMuCisgIC8vLworICB2aXJ0dWFsIFNEVmFsdWUgUGVyZm9ybURBR0NvbWJpbmUoU0ROb2RlICpOLCBEQUdDb21iaW5lckluZm8gJkRDSSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGl0IGlzIHByb2ZpdGFibGUgdG8gbW92ZSBhIGZvbGxvd2luZyBzaGlmdCB0aHJvdWdoIHRoaXMKKyAgLy8gIG5vZGUsIGFkanVzdGluZyBhbnkgaW1tZWRpYXRlIG9wZXJhbmRzIGFzIG5lY2Vzc2FyeSB0byBwcmVzZXJ2ZSBzZW1hbnRpY3MuCisgIC8vICBUaGlzIHRyYW5zZm9ybWF0aW9uIG1heSBub3QgYmUgZGVzaXJhYmxlIGlmIGl0IGRpc3J1cHRzIGEgcGFydGljdWxhcmx5CisgIC8vICBhdXNwaWNpb3VzIHRhcmdldC1zcGVjaWZpYyB0cmVlIChlLmcuIGJpdGZpZWxkIGV4dHJhY3Rpb24gaW4gQUFyY2g2NCkuCisgIC8vICBCeSBkZWZhdWx0LCBpdCByZXR1cm5zIHRydWUuCisgIHZpcnR1YWwgYm9vbCBpc0Rlc2lyYWJsZVRvQ29tbXV0ZVdpdGhTaGlmdChjb25zdCBTRE5vZGUgKk4pIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFJldHVybiB0cnVlIGlmIGl0IGlzIHByb2ZpdGFibGUgdG8gY29tYmluZSBhIEJVSUxEX1ZFQ1RPUiB3aXRoIGEgc3RyaWRlLXBhdHRlcm4KKyAgLy8gdG8gYSBzaHVmZmxlIGFuZCBhIHRydW5jYXRlLgorICAvLyBFeGFtcGxlIG9mIHN1Y2ggYSBjb21iaW5lOgorICAvLyB2NGkzMiBidWlsZF92ZWN0b3IoKGV4dHJhY3RfZWx0IFYsIDEpLAorICAvLyAgICAgICAgICAgICAgICAgICAgKGV4dHJhY3RfZWx0IFYsIDMpLAorICAvLyAgICAgICAgICAgICAgICAgICAgKGV4dHJhY3RfZWx0IFYsIDUpLAorICAvLyAgICAgICAgICAgICAgICAgICAgKGV4dHJhY3RfZWx0IFYsIDcpKQorICAvLyAgLS0+CisgIC8vIHY0aTMyIHRydW5jYXRlIChiaXRjYXN0IChzaHVmZmxlPDEsdSwzLHUsNSx1LDcsdT4gViwgdSkgdG8gdjRpNjQpCisgIHZpcnR1YWwgYm9vbCBpc0Rlc2lyYWJsZVRvQ29tYmluZUJ1aWxkVmVjdG9yVG9TaHVmZmxlVHJ1bmNhdGUoCisgICAgICBBcnJheVJlZjxpbnQ+IFNodWZmbGVNYXNrLCBFVlQgU3JjVlQsIEVWVCBUcnVuY1ZUKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgaGFzIG5hdGl2ZSBzdXBwb3J0IGZvciB0aGUgc3BlY2lmaWVkIHZhbHVlIHR5cGUKKyAgLy8vIGFuZCBpdCBpcyAnZGVzaXJhYmxlJyB0byB1c2UgdGhlIHR5cGUgZm9yIHRoZSBnaXZlbiBub2RlIHR5cGUuIGUuZy4gT24geDg2CisgIC8vLyBpMTYgaXMgbGVnYWwsIGJ1dCB1bmRlc2lyYWJsZSBzaW5jZSBpMTYgaW5zdHJ1Y3Rpb24gZW5jb2RpbmdzIGFyZSBsb25nZXIKKyAgLy8vIGFuZCBzb21lIGkxNiBpbnN0cnVjdGlvbnMgYXJlIHNsb3cuCisgIHZpcnR1YWwgYm9vbCBpc1R5cGVEZXNpcmFibGVGb3JPcCh1bnNpZ25lZCAvKk9wYyovLCBFVlQgVlQpIGNvbnN0IHsKKyAgICAvLyBCeSBkZWZhdWx0LCBhc3N1bWUgYWxsIGxlZ2FsIHR5cGVzIGFyZSBkZXNpcmFibGUuCisgICAgcmV0dXJuIGlzVHlwZUxlZ2FsKFZUKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBpdCBpcyBwcm9maXRhYmxlIGZvciBkYWcgY29tYmluZXIgdG8gdHJhbnNmb3JtIGEgZmxvYXRpbmcKKyAgLy8vIHBvaW50IG9wIG9mIHNwZWNpZmllZCBvcGNvZGUgdG8gYSBlcXVpdmFsZW50IG9wIG9mIGFuIGludGVnZXIKKyAgLy8vIHR5cGUuIGUuZy4gZjMyIGxvYWQgLT4gaTMyIGxvYWQgY2FuIGJlIHByb2ZpdGFibGUgb24gQVJNLgorICB2aXJ0dWFsIGJvb2wgaXNEZXNpcmFibGVUb1RyYW5zZm9ybVRvSW50ZWdlck9wKHVuc2lnbmVkIC8qT3BjKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRVZUIC8qVlQqLykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBUaGlzIG1ldGhvZCBxdWVyeSB0aGUgdGFyZ2V0IHdoZXRoZXIgaXQgaXMgYmVuZWZpY2lhbCBmb3IgZGFnIGNvbWJpbmVyIHRvCisgIC8vLyBwcm9tb3RlIHRoZSBzcGVjaWZpZWQgbm9kZS4gSWYgdHJ1ZSwgaXQgc2hvdWxkIHJldHVybiB0aGUgZGVzaXJlZAorICAvLy8gcHJvbW90aW9uIHR5cGUgYnkgcmVmZXJlbmNlLgorICB2aXJ0dWFsIGJvb2wgSXNEZXNpcmFibGVUb1Byb21vdGVPcChTRFZhbHVlIC8qT3AqLywgRVZUICYvKlBWVCovKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgc3VwcG9ydHMgc3dpZnRlcnJvciBhdHRyaWJ1dGUuIEl0IG9wdGltaXplcworICAvLy8gbG9hZHMgYW5kIHN0b3JlcyB0byByZWFkaW5nIGFuZCB3cml0aW5nIGEgc3BlY2lmaWMgcmVnaXN0ZXIuCisgIHZpcnR1YWwgYm9vbCBzdXBwb3J0U3dpZnRFcnJvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHRhcmdldCBzdXBwb3J0cyB0aGF0IGEgc3Vic2V0IG9mIENTUnMgZm9yIHRoZSBnaXZlbgorICAvLy8gbWFjaGluZSBmdW5jdGlvbiBpcyBoYW5kbGVkIGV4cGxpY2l0bHkgdmlhIGNvcGllcy4KKyAgdmlydHVhbCBib29sIHN1cHBvcnRTcGxpdENTUihNYWNoaW5lRnVuY3Rpb24gKk1GKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFBlcmZvcm0gbmVjZXNzYXJ5IGluaXRpYWxpemF0aW9uIHRvIGhhbmRsZSBhIHN1YnNldCBvZiBDU1JzIGV4cGxpY2l0bHkKKyAgLy8vIHZpYSBjb3BpZXMuIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgaW5zdHJ1Y3Rpb24KKyAgLy8vIHNlbGVjdGlvbi4KKyAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVTcGxpdENTUihNYWNoaW5lQmFzaWNCbG9jayAqRW50cnkpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJOb3QgSW1wbGVtZW50ZWQiKTsKKyAgfQorCisgIC8vLyBJbnNlcnQgZXhwbGljaXQgY29waWVzIGluIGVudHJ5IGFuZCBleGl0IGJsb2Nrcy4gV2UgY29weSBhIHN1YnNldCBvZgorICAvLy8gQ1NScyB0byB2aXJ0dWFsIHJlZ2lzdGVycyBpbiB0aGUgZW50cnkgYmxvY2ssIGFuZCBjb3B5IHRoZW0gYmFjayB0bworICAvLy8gcGh5c2ljYWwgcmVnaXN0ZXJzIGluIHRoZSBleGl0IGJsb2Nrcy4gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgYXQgdGhlIGVuZAorICAvLy8gb2YgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uLgorICB2aXJ0dWFsIHZvaWQgaW5zZXJ0Q29waWVzU3BsaXRDU1IoCisgICAgICBNYWNoaW5lQmFzaWNCbG9jayAqRW50cnksCisgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8TWFjaGluZUJhc2ljQmxvY2sgKj4gJkV4aXRzKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiTm90IEltcGxlbWVudGVkIik7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTG93ZXJpbmcgbWV0aG9kcyAtIFRoZXNlIG1ldGhvZHMgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSB0YXJnZXRzIHNvIHRoYXQKKyAgLy8gdGhlIFNlbGVjdGlvbkRBR0J1aWxkZXIgY29kZSBrbm93cyBob3cgdG8gbG93ZXIgdGhlc2UuCisgIC8vCisKKyAgLy8vIFRoaXMgaG9vayBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGxvd2VyIHRoZSBpbmNvbWluZyAoZm9ybWFsKSBhcmd1bWVudHMsCisgIC8vLyBkZXNjcmliZWQgYnkgdGhlIElucyBhcnJheSwgaW50byB0aGUgc3BlY2lmaWVkIERBRy4gVGhlIGltcGxlbWVudGF0aW9uCisgIC8vLyBzaG91bGQgZmlsbCBpbiB0aGUgSW5WYWxzIGFycmF5IHdpdGggbGVnYWwtdHlwZSBhcmd1bWVudCB2YWx1ZXMsIGFuZAorICAvLy8gcmV0dXJuIHRoZSByZXN1bHRpbmcgdG9rZW4gY2hhaW4gdmFsdWUuCisgIHZpcnR1YWwgU0RWYWx1ZSBMb3dlckZvcm1hbEFyZ3VtZW50cygKKyAgICAgIFNEVmFsdWUgLypDaGFpbiovLCBDYWxsaW5nQ29udjo6SUQgLypDYWxsQ29udiovLCBib29sIC8qaXNWYXJBcmcqLywKKyAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6OklucHV0QXJnPiAmIC8qSW5zKi8sIGNvbnN0IFNETG9jICYgLypkbCovLAorICAgICAgU2VsZWN0aW9uREFHICYgLypEQUcqLywgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICYgLypJblZhbHMqLykgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIk5vdCBJbXBsZW1lbnRlZCIpOworICB9CisKKyAgLy8vIFRoaXMgc3RydWN0dXJlIGNvbnRhaW5zIGFsbCBpbmZvcm1hdGlvbiB0aGF0IGlzIG5lY2Vzc2FyeSBmb3IgbG93ZXJpbmcKKyAgLy8vIGNhbGxzLiBJdCBpcyBwYXNzZWQgdG8gVExJOjpMb3dlckNhbGxUbyB3aGVuIHRoZSBTZWxlY3Rpb25EQUcgYnVpbGRlcgorICAvLy8gbmVlZHMgdG8gbG93ZXIgYSBjYWxsLCBhbmQgdGFyZ2V0cyB3aWxsIHNlZSB0aGlzIHN0cnVjdCBpbiB0aGVpciBMb3dlckNhbGwKKyAgLy8vIGltcGxlbWVudGF0aW9uLgorICBzdHJ1Y3QgQ2FsbExvd2VyaW5nSW5mbyB7CisgICAgU0RWYWx1ZSBDaGFpbjsKKyAgICBUeXBlICpSZXRUeSA9IG51bGxwdHI7CisgICAgYm9vbCBSZXRTRXh0ICAgICAgICAgICA6IDE7CisgICAgYm9vbCBSZXRaRXh0ICAgICAgICAgICA6IDE7CisgICAgYm9vbCBJc1ZhckFyZyAgICAgICAgICA6IDE7CisgICAgYm9vbCBJc0luUmVnICAgICAgICAgICA6IDE7CisgICAgYm9vbCBEb2VzTm90UmV0dXJuICAgICA6IDE7CisgICAgYm9vbCBJc1JldHVyblZhbHVlVXNlZCA6IDE7CisgICAgYm9vbCBJc0NvbnZlcmdlbnQgICAgICA6IDE7CisgICAgYm9vbCBJc1BhdGNoUG9pbnQgICAgICA6IDE7CisKKyAgICAvLyBJc1RhaWxDYWxsIHNob3VsZCBiZSBtb2RpZmllZCBieSBpbXBsZW1lbnRhdGlvbnMgb2YKKyAgICAvLyBUYXJnZXRMb3dlcmluZzo6TG93ZXJDYWxsIHRoYXQgcGVyZm9ybSB0YWlsIGNhbGwgY29udmVyc2lvbnMuCisgICAgYm9vbCBJc1RhaWxDYWxsID0gZmFsc2U7CisKKyAgICAvLyBJcyBDYWxsIGxvd2VyaW5nIGRvbmUgcG9zdCBTZWxlY3Rpb25EQUcgdHlwZSBsZWdhbGl6YXRpb24uCisgICAgYm9vbCBJc1Bvc3RUeXBlTGVnYWxpemF0aW9uID0gZmFsc2U7CisKKyAgICB1bnNpZ25lZCBOdW1GaXhlZEFyZ3MgPSAtMTsKKyAgICBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYgPSBDYWxsaW5nQ29udjo6QzsKKyAgICBTRFZhbHVlIENhbGxlZTsKKyAgICBBcmdMaXN0VHkgQXJnczsKKyAgICBTZWxlY3Rpb25EQUcgJkRBRzsKKyAgICBTRExvYyBETDsKKyAgICBJbW11dGFibGVDYWxsU2l0ZSBDUzsKKyAgICBTbWFsbFZlY3RvcjxJU0Q6Ok91dHB1dEFyZywgMzI+IE91dHM7CisgICAgU21hbGxWZWN0b3I8U0RWYWx1ZSwgMzI+IE91dFZhbHM7CisgICAgU21hbGxWZWN0b3I8SVNEOjpJbnB1dEFyZywgMzI+IEluczsKKyAgICBTbWFsbFZlY3RvcjxTRFZhbHVlLCA0PiBJblZhbHM7CisKKyAgICBDYWxsTG93ZXJpbmdJbmZvKFNlbGVjdGlvbkRBRyAmREFHKQorICAgICAgICA6IFJldFNFeHQoZmFsc2UpLCBSZXRaRXh0KGZhbHNlKSwgSXNWYXJBcmcoZmFsc2UpLCBJc0luUmVnKGZhbHNlKSwKKyAgICAgICAgICBEb2VzTm90UmV0dXJuKGZhbHNlKSwgSXNSZXR1cm5WYWx1ZVVzZWQodHJ1ZSksIElzQ29udmVyZ2VudChmYWxzZSksCisgICAgICAgICAgSXNQYXRjaFBvaW50KGZhbHNlKSwgREFHKERBRykge30KKworICAgIENhbGxMb3dlcmluZ0luZm8gJnNldERlYnVnTG9jKGNvbnN0IFNETG9jICZkbCkgeworICAgICAgREwgPSBkbDsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDYWxsTG93ZXJpbmdJbmZvICZzZXRDaGFpbihTRFZhbHVlIEluQ2hhaW4pIHsKKyAgICAgIENoYWluID0gSW5DaGFpbjsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLyBzZXRDYWxsZWUgd2l0aCB0YXJnZXQvbW9kdWxlLXNwZWNpZmljIGF0dHJpYnV0ZXMKKyAgICBDYWxsTG93ZXJpbmdJbmZvICZzZXRMaWJDYWxsZWUoQ2FsbGluZ0NvbnY6OklEIENDLCBUeXBlICpSZXN1bHRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFRhcmdldCwgQXJnTGlzdFR5ICYmQXJnc0xpc3QpIHsKKyAgICAgIFJldFR5ID0gUmVzdWx0VHlwZTsKKyAgICAgIENhbGxlZSA9IFRhcmdldDsKKyAgICAgIENhbGxDb252ID0gQ0M7CisgICAgICBOdW1GaXhlZEFyZ3MgPSBBcmdzTGlzdC5zaXplKCk7CisgICAgICBBcmdzID0gc3RkOjptb3ZlKEFyZ3NMaXN0KTsKKworICAgICAgREFHLmdldFRhcmdldExvd2VyaW5nSW5mbygpLm1hcmtMaWJDYWxsQXR0cmlidXRlcygKKyAgICAgICAgICAmKERBRy5nZXRNYWNoaW5lRnVuY3Rpb24oKSksIENDLCBBcmdzKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDYWxsTG93ZXJpbmdJbmZvICZzZXRDYWxsZWUoQ2FsbGluZ0NvbnY6OklEIENDLCBUeXBlICpSZXN1bHRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIFRhcmdldCwgQXJnTGlzdFR5ICYmQXJnc0xpc3QpIHsKKyAgICAgIFJldFR5ID0gUmVzdWx0VHlwZTsKKyAgICAgIENhbGxlZSA9IFRhcmdldDsKKyAgICAgIENhbGxDb252ID0gQ0M7CisgICAgICBOdW1GaXhlZEFyZ3MgPSBBcmdzTGlzdC5zaXplKCk7CisgICAgICBBcmdzID0gc3RkOjptb3ZlKEFyZ3NMaXN0KTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDYWxsTG93ZXJpbmdJbmZvICZzZXRDYWxsZWUoVHlwZSAqUmVzdWx0VHlwZSwgRnVuY3Rpb25UeXBlICpGVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgVGFyZ2V0LCBBcmdMaXN0VHkgJiZBcmdzTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1tdXRhYmxlQ2FsbFNpdGUgQ2FsbCkgeworICAgICAgUmV0VHkgPSBSZXN1bHRUeXBlOworCisgICAgICBJc0luUmVnID0gQ2FsbC5oYXNSZXRBdHRyKEF0dHJpYnV0ZTo6SW5SZWcpOworICAgICAgRG9lc05vdFJldHVybiA9CisgICAgICAgICAgQ2FsbC5kb2VzTm90UmV0dXJuKCkgfHwKKyAgICAgICAgICAoIUNhbGwuaXNJbnZva2UoKSAmJgorICAgICAgICAgICBpc2E8VW5yZWFjaGFibGVJbnN0PihDYWxsLmdldEluc3RydWN0aW9uKCktPmdldE5leHROb2RlKCkpKTsKKyAgICAgIElzVmFyQXJnID0gRlR5LT5pc1ZhckFyZygpOworICAgICAgSXNSZXR1cm5WYWx1ZVVzZWQgPSAhQ2FsbC5nZXRJbnN0cnVjdGlvbigpLT51c2VfZW1wdHkoKTsKKyAgICAgIFJldFNFeHQgPSBDYWxsLmhhc1JldEF0dHIoQXR0cmlidXRlOjpTRXh0KTsKKyAgICAgIFJldFpFeHQgPSBDYWxsLmhhc1JldEF0dHIoQXR0cmlidXRlOjpaRXh0KTsKKworICAgICAgQ2FsbGVlID0gVGFyZ2V0OworCisgICAgICBDYWxsQ29udiA9IENhbGwuZ2V0Q2FsbGluZ0NvbnYoKTsKKyAgICAgIE51bUZpeGVkQXJncyA9IEZUeS0+Z2V0TnVtUGFyYW1zKCk7CisgICAgICBBcmdzID0gc3RkOjptb3ZlKEFyZ3NMaXN0KTsKKworICAgICAgQ1MgPSBDYWxsOworCisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ2FsbExvd2VyaW5nSW5mbyAmc2V0SW5SZWdpc3Rlcihib29sIFZhbHVlID0gdHJ1ZSkgeworICAgICAgSXNJblJlZyA9IFZhbHVlOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENhbGxMb3dlcmluZ0luZm8gJnNldE5vUmV0dXJuKGJvb2wgVmFsdWUgPSB0cnVlKSB7CisgICAgICBEb2VzTm90UmV0dXJuID0gVmFsdWU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ2FsbExvd2VyaW5nSW5mbyAmc2V0VmFyQXJnKGJvb2wgVmFsdWUgPSB0cnVlKSB7CisgICAgICBJc1ZhckFyZyA9IFZhbHVlOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENhbGxMb3dlcmluZ0luZm8gJnNldFRhaWxDYWxsKGJvb2wgVmFsdWUgPSB0cnVlKSB7CisgICAgICBJc1RhaWxDYWxsID0gVmFsdWU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ2FsbExvd2VyaW5nSW5mbyAmc2V0RGlzY2FyZFJlc3VsdChib29sIFZhbHVlID0gdHJ1ZSkgeworICAgICAgSXNSZXR1cm5WYWx1ZVVzZWQgPSAhVmFsdWU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ2FsbExvd2VyaW5nSW5mbyAmc2V0Q29udmVyZ2VudChib29sIFZhbHVlID0gdHJ1ZSkgeworICAgICAgSXNDb252ZXJnZW50ID0gVmFsdWU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQ2FsbExvd2VyaW5nSW5mbyAmc2V0U0V4dFJlc3VsdChib29sIFZhbHVlID0gdHJ1ZSkgeworICAgICAgUmV0U0V4dCA9IFZhbHVlOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENhbGxMb3dlcmluZ0luZm8gJnNldFpFeHRSZXN1bHQoYm9vbCBWYWx1ZSA9IHRydWUpIHsKKyAgICAgIFJldFpFeHQgPSBWYWx1ZTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBDYWxsTG93ZXJpbmdJbmZvICZzZXRJc1BhdGNoUG9pbnQoYm9vbCBWYWx1ZSA9IHRydWUpIHsKKyAgICAgIElzUGF0Y2hQb2ludCA9IFZhbHVlOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIENhbGxMb3dlcmluZ0luZm8gJnNldElzUG9zdFR5cGVMZWdhbGl6YXRpb24oYm9vbCBWYWx1ZT10cnVlKSB7CisgICAgICBJc1Bvc3RUeXBlTGVnYWxpemF0aW9uID0gVmFsdWU7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgQXJnTGlzdFR5ICZnZXRBcmdzKCkgeworICAgICAgcmV0dXJuIEFyZ3M7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGxvd2VycyBhbiBhYnN0cmFjdCBjYWxsIHRvIGEgZnVuY3Rpb24gaW50byBhbiBhY3R1YWwgY2FsbC4KKyAgLy8vIFRoaXMgcmV0dXJucyBhIHBhaXIgb2Ygb3BlcmFuZHMuICBUaGUgZmlyc3QgZWxlbWVudCBpcyB0aGUgcmV0dXJuIHZhbHVlCisgIC8vLyBmb3IgdGhlIGZ1bmN0aW9uIChpZiBSZXRUeSBpcyBub3QgVm9pZFR5KS4gIFRoZSBzZWNvbmQgZWxlbWVudCBpcyB0aGUKKyAgLy8vIG91dGdvaW5nIHRva2VuIGNoYWluLiBJdCBjYWxscyBMb3dlckNhbGwgdG8gZG8gdGhlIGFjdHVhbCBsb3dlcmluZy4KKyAgc3RkOjpwYWlyPFNEVmFsdWUsIFNEVmFsdWU+IExvd2VyQ2FsbFRvKENhbGxMb3dlcmluZ0luZm8gJkNMSSkgY29uc3Q7CisKKyAgLy8vIFRoaXMgaG9vayBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGxvd2VyIGNhbGxzIGludG8gdGhlIHNwZWNpZmllZAorICAvLy8gREFHLiBUaGUgb3V0Z29pbmcgYXJndW1lbnRzIHRvIHRoZSBjYWxsIGFyZSBkZXNjcmliZWQgYnkgdGhlIE91dHMgYXJyYXksCisgIC8vLyBhbmQgdGhlIHZhbHVlcyB0byBiZSByZXR1cm5lZCBieSB0aGUgY2FsbCBhcmUgZGVzY3JpYmVkIGJ5IHRoZSBJbnMKKyAgLy8vIGFycmF5LiBUaGUgaW1wbGVtZW50YXRpb24gc2hvdWxkIGZpbGwgaW4gdGhlIEluVmFscyBhcnJheSB3aXRoIGxlZ2FsLXR5cGUKKyAgLy8vIHJldHVybiB2YWx1ZXMgZnJvbSB0aGUgY2FsbCwgYW5kIHJldHVybiB0aGUgcmVzdWx0aW5nIHRva2VuIGNoYWluIHZhbHVlLgorICB2aXJ0dWFsIFNEVmFsdWUKKyAgICBMb3dlckNhbGwoQ2FsbExvd2VyaW5nSW5mbyAmLypDTEkqLywKKyAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICYvKkluVmFscyovKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiTm90IEltcGxlbWVudGVkIik7CisgIH0KKworICAvLy8gVGFyZ2V0LXNwZWNpZmljIGNsZWFudXAgZm9yIGZvcm1hbCBCeVZhbCBwYXJhbWV0ZXJzLgorICB2aXJ0dWFsIHZvaWQgSGFuZGxlQnlWYWwoQ0NTdGF0ZSAqLCB1bnNpZ25lZCAmLCB1bnNpZ25lZCkgY29uc3Qge30KKworICAvLy8gVGhpcyBob29rIHNob3VsZCBiZSBpbXBsZW1lbnRlZCB0byBjaGVjayB3aGV0aGVyIHRoZSByZXR1cm4gdmFsdWVzCisgIC8vLyBkZXNjcmliZWQgYnkgdGhlIE91dHMgYXJyYXkgY2FuIGZpdCBpbnRvIHRoZSByZXR1cm4gcmVnaXN0ZXJzLiAgSWYgZmFsc2UKKyAgLy8vIGlzIHJldHVybmVkLCBhbiBzcmV0LWRlbW90aW9uIGlzIHBlcmZvcm1lZC4KKyAgdmlydHVhbCBib29sIENhbkxvd2VyUmV0dXJuKENhbGxpbmdDb252OjpJRCAvKkNhbGxDb252Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lRnVuY3Rpb24gJi8qTUYqLywgYm9vbCAvKmlzVmFyQXJnKi8sCisgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SVNEOjpPdXRwdXRBcmc+ICYvKk91dHMqLywKKyAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICYvKkNvbnRleHQqLykgY29uc3QKKyAgeworICAgIC8vIFJldHVybiB0cnVlIGJ5IGRlZmF1bHQgdG8gZ2V0IHByZWV4aXN0aW5nIGJlaGF2aW9yLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIFRoaXMgaG9vayBtdXN0IGJlIGltcGxlbWVudGVkIHRvIGxvd2VyIG91dGdvaW5nIHJldHVybiB2YWx1ZXMsIGRlc2NyaWJlZAorICAvLy8gYnkgdGhlIE91dHMgYXJyYXksIGludG8gdGhlIHNwZWNpZmllZCBEQUcuIFRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQKKyAgLy8vIHJldHVybiB0aGUgcmVzdWx0aW5nIHRva2VuIGNoYWluIHZhbHVlLgorICB2aXJ0dWFsIFNEVmFsdWUgTG93ZXJSZXR1cm4oU0RWYWx1ZSAvKkNoYWluKi8sIENhbGxpbmdDb252OjpJRCAvKkNhbGxDb252Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qaXNWYXJBcmcqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJU0Q6Ok91dHB1dEFyZz4gJiAvKk91dHMqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxTRFZhbHVlPiAmIC8qT3V0VmFscyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0RMb2MgJiAvKmRsKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJiAvKkRBRyovKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiTm90IEltcGxlbWVudGVkIik7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgcmVzdWx0IG9mIHRoZSBzcGVjaWZpZWQgbm9kZSBpcyB1c2VkIGJ5IGEgcmV0dXJuIG5vZGUKKyAgLy8vIG9ubHkuIEl0IGFsc28gY29tcHV0ZSBhbmQgcmV0dXJuIHRoZSBpbnB1dCBjaGFpbiBmb3IgdGhlIHRhaWwgY2FsbC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgaXQgaXMgcG9zc2libGUgdG8gY29kZWdlbiBhIGxpYmNhbGwgYXMKKyAgLy8vIHRhaWwgY2FsbCBhdCBsZWdhbGl6YXRpb24gdGltZS4KKyAgdmlydHVhbCBib29sIGlzVXNlZEJ5UmV0dXJuT25seShTRE5vZGUgKiwgU0RWYWx1ZSAmLypDaGFpbiovKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB0YXJnZXQgbWF5IGJlIGFibGUgZW1pdCB0aGUgY2FsbCBpbnN0cnVjdGlvbiBhcyBhIHRhaWwKKyAgLy8vIGNhbGwuIFRoaXMgaXMgdXNlZCBieSBvcHRpbWl6YXRpb24gcGFzc2VzIHRvIGRldGVybWluZSBpZiBpdCdzIHByb2ZpdGFibGUKKyAgLy8vIHRvIGR1cGxpY2F0ZSByZXR1cm4gaW5zdHJ1Y3Rpb25zIHRvIGVuYWJsZSB0YWlsY2FsbCBvcHRpbWl6YXRpb24uCisgIHZpcnR1YWwgYm9vbCBtYXlCZUVtaXR0ZWRBc1RhaWxDYWxsKGNvbnN0IENhbGxJbnN0ICopIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBidWlsdGluIG5hbWUgZm9yIHRoZSBfX2J1aWx0aW5fX19jbGVhcl9jYWNoZSBpbnRyaW5zaWMKKyAgLy8vIERlZmF1bHQgaXMgdG8gaW52b2tlIHRoZSBjbGVhciBjYWNoZSBsaWJyYXJ5IGNhbGwKKyAgdmlydHVhbCBjb25zdCBjaGFyICogZ2V0Q2xlYXJDYWNoZUJ1aWx0aW5OYW1lKCkgY29uc3QgeworICAgIHJldHVybiAiX19jbGVhcl9jYWNoZSI7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSByZWdpc3RlciBJRCBvZiB0aGUgbmFtZSBwYXNzZWQgaW4uIFVzZWQgYnkgbmFtZWQgcmVnaXN0ZXIKKyAgLy8vIGdsb2JhbCB2YXJpYWJsZXMgZXh0ZW5zaW9uLiBUaGVyZSBpcyBubyB0YXJnZXQtaW5kZXBlbmRlbnQgYmVoYXZpb3VyCisgIC8vLyBzbyB0aGUgZGVmYXVsdCBhY3Rpb24gaXMgdG8gYmFpbC4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRSZWdpc3RlckJ5TmFtZShjb25zdCBjaGFyKiBSZWdOYW1lLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgICByZXBvcnRfZmF0YWxfZXJyb3IoIk5hbWVkIHJlZ2lzdGVycyBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgdGFyZ2V0Iik7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSB0eXBlIHRoYXQgc2hvdWxkIGJlIHVzZWQgdG8gemVybyBvciBzaWduIGV4dGVuZCBhCisgIC8vLyB6ZXJvZXh0L3NpZ25leHQgaW50ZWdlciByZXR1cm4gdmFsdWUuICBGSVhNRTogU29tZSBDIGNhbGxpbmcgY29udmVudGlvbnMKKyAgLy8vIHJlcXVpcmUgdGhlIHJldHVybiB0eXBlIHRvIGJlIHByb21vdGVkLCBidXQgdGhpcyBpcyBub3QgdHJ1ZSBhbGwgdGhlIHRpbWUsCisgIC8vLyBlLmcuIGkxL2k4L2kxNiBvbiB4ODYveDg2XzY0LiBJdCBpcyBhbHNvIG5vdCBuZWNlc3NhcnkgZm9yIG5vbi1DIGNhbGxpbmcKKyAgLy8vIGNvbnZlbnRpb25zLiBUaGUgZnJvbnRlbmQgc2hvdWxkIGhhbmRsZSB0aGlzIGFuZCBpbmNsdWRlIGFsbCBvZiB0aGUKKyAgLy8vIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbi4KKyAgdmlydHVhbCBFVlQgZ2V0VHlwZUZvckV4dFJldHVybihMTFZNQ29udGV4dCAmQ29udGV4dCwgRVZUIFZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpOb2RlVHlwZSAvKkV4dGVuZEtpbmQqLykgY29uc3QgeworICAgIEVWVCBNaW5WVCA9IGdldFJlZ2lzdGVyVHlwZShDb250ZXh0LCBNVlQ6OmkzMik7CisgICAgcmV0dXJuIFZULmJpdHNMVChNaW5WVCkgPyBNaW5WVCA6IFZUOworICB9CisKKyAgLy8vIEZvciBzb21lIHRhcmdldHMsIGFuIExMVk0gc3RydWN0IHR5cGUgbXVzdCBiZSBicm9rZW4gZG93biBpbnRvIG11bHRpcGxlCisgIC8vLyBzaW1wbGUgdHlwZXMsIGJ1dCB0aGUgY2FsbGluZyBjb252ZW50aW9uIHNwZWNpZmllcyB0aGF0IHRoZSBlbnRpcmUgc3RydWN0CisgIC8vLyBtdXN0IGJlIHBhc3NlZCBpbiBhIGJsb2NrIG9mIGNvbnNlY3V0aXZlIHJlZ2lzdGVycy4KKyAgdmlydHVhbCBib29sCisgIGZ1bmN0aW9uQXJndW1lbnROZWVkc0NvbnNlY3V0aXZlUmVnaXN0ZXJzKFR5cGUgKlR5LCBDYWxsaW5nQ29udjo6SUQgQ2FsbENvbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNWYXJBcmcpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJucyBhIDAgdGVybWluYXRlZCBhcnJheSBvZiByZWdpc3RlcnMgdGhhdCBjYW4gYmUgc2FmZWx5IHVzZWQgYXMKKyAgLy8vIHNjcmF0Y2ggcmVnaXN0ZXJzLgorICB2aXJ0dWFsIGNvbnN0IE1DUGh5c1JlZyAqZ2V0U2NyYXRjaFJlZ2lzdGVycyhDYWxsaW5nQ29udjo6SUQgQ0MpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBUaGlzIGNhbGxiYWNrIGlzIHVzZWQgdG8gcHJlcGFyZSBmb3IgYSB2b2xhdGlsZSBvciBhdG9taWMgbG9hZC4KKyAgLy8vIEl0IHRha2VzIGEgY2hhaW4gbm9kZSBhcyBpbnB1dCBhbmQgcmV0dXJucyB0aGUgY2hhaW4gZm9yIHRoZSBsb2FkIGl0c2VsZi4KKyAgLy8vCisgIC8vLyBIYXZpbmcgYSBjYWxsYmFjayBsaWtlIHRoaXMgaXMgbmVjZXNzYXJ5IGZvciB0YXJnZXRzIGxpa2UgU3lzdGVtWiwKKyAgLy8vIHdoaWNoIGFsbG93cyBhIENQVSB0byByZXVzZSB0aGUgcmVzdWx0IG9mIGEgcHJldmlvdXMgbG9hZCBpbmRlZmluaXRlbHksCisgIC8vLyBldmVuIGlmIGEgY2FjaGUtY29oZXJlbnQgc3RvcmUgaXMgcGVyZm9ybWVkIGJ5IGFub3RoZXIgQ1BVLiAgVGhlIGRlZmF1bHQKKyAgLy8vIGltcGxlbWVudGF0aW9uIGRvZXMgbm90aGluZy4KKyAgdmlydHVhbCBTRFZhbHVlIHByZXBhcmVWb2xhdGlsZU9yQXRvbWljTG9hZChTRFZhbHVlIENoYWluLCBjb25zdCBTRExvYyAmREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2hhaW47CisgIH0KKworICAvLy8gVGhpcyBjYWxsYmFjayBpcyB1c2VkIHRvIGluc3BlY3QgbG9hZC9zdG9yZSBpbnN0cnVjdGlvbnMgYW5kIGFkZAorICAvLy8gdGFyZ2V0LXNwZWNpZmljIE1hY2hpbmVNZW1PcGVyYW5kIGZsYWdzIHRvIHRoZW0uICBUaGUgZGVmYXVsdAorICAvLy8gaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLgorICB2aXJ0dWFsIE1hY2hpbmVNZW1PcGVyYW5kOjpGbGFncyBnZXRNTU9GbGFncyhjb25zdCBJbnN0cnVjdGlvbiAmSSkgY29uc3QgeworICAgIHJldHVybiBNYWNoaW5lTWVtT3BlcmFuZDo6TU9Ob25lOworICB9CisKKyAgLy8vIFRoaXMgY2FsbGJhY2sgaXMgaW52b2tlZCBieSB0aGUgdHlwZSBsZWdhbGl6ZXIgdG8gbGVnYWxpemUgbm9kZXMgd2l0aCBhbgorICAvLy8gaWxsZWdhbCBvcGVyYW5kIHR5cGUgYnV0IGxlZ2FsIHJlc3VsdCB0eXBlcy4gIEl0IHJlcGxhY2VzIHRoZQorICAvLy8gTG93ZXJPcGVyYXRpb24gY2FsbGJhY2sgaW4gdGhlIHR5cGUgTGVnYWxpemVyLiAgVGhlIHJlYXNvbiB3ZSBjYW4gbm90IGRvCisgIC8vLyBhd2F5IHdpdGggTG93ZXJPcGVyYXRpb24gZW50aXJlbHkgaXMgdGhhdCBMZWdhbGl6ZURBRyBpc24ndCB5ZXQgcmVhZHkgdG8KKyAgLy8vIHVzZSB0aGlzIGNhbGxiYWNrLgorICAvLy8KKyAgLy8vIFRPRE86IENvbnNpZGVyIG1lcmdpbmcgd2l0aCBSZXBsYWNlTm9kZVJlc3VsdHMuCisgIC8vLworICAvLy8gVGhlIHRhcmdldCBwbGFjZXMgbmV3IHJlc3VsdCB2YWx1ZXMgZm9yIHRoZSBub2RlIGluIFJlc3VsdHMgKHRoZWlyIG51bWJlcgorICAvLy8gYW5kIHR5cGVzIG11c3QgZXhhY3RseSBtYXRjaCB0aG9zZSBvZiB0aGUgb3JpZ2luYWwgcmV0dXJuIHZhbHVlcyBvZgorICAvLy8gdGhlIG5vZGUpLCBvciBsZWF2ZXMgUmVzdWx0cyBlbXB0eSwgd2hpY2ggaW5kaWNhdGVzIHRoYXQgdGhlIG5vZGUgaXMgbm90CisgIC8vLyB0byBiZSBjdXN0b20gbG93ZXJlZCBhZnRlciBhbGwuCisgIC8vLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBjYWxscyBMb3dlck9wZXJhdGlvbi4KKyAgdmlydHVhbCB2b2lkIExvd2VyT3BlcmF0aW9uV3JhcHBlcihTRE5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFNEVmFsdWU+ICZSZXN1bHRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAvLy8gVGhpcyBjYWxsYmFjayBpcyBpbnZva2VkIGZvciBvcGVyYXRpb25zIHRoYXQgYXJlIHVuc3VwcG9ydGVkIGJ5IHRoZQorICAvLy8gdGFyZ2V0LCB3aGljaCBhcmUgcmVnaXN0ZXJlZCB0byB1c2UgJ2N1c3RvbScgbG93ZXJpbmcsIGFuZCB3aG9zZSBkZWZpbmVkCisgIC8vLyB2YWx1ZXMgYXJlIGFsbCBsZWdhbC4gIElmIHRoZSB0YXJnZXQgaGFzIG5vIG9wZXJhdGlvbnMgdGhhdCByZXF1aXJlIGN1c3RvbQorICAvLy8gbG93ZXJpbmcsIGl0IG5lZWQgbm90IGltcGxlbWVudCB0aGlzLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgdGhpcworICAvLy8gYWJvcnRzLgorICB2aXJ0dWFsIFNEVmFsdWUgTG93ZXJPcGVyYXRpb24oU0RWYWx1ZSBPcCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgIC8vLyBUaGlzIGNhbGxiYWNrIGlzIGludm9rZWQgd2hlbiBhIG5vZGUgcmVzdWx0IHR5cGUgaXMgaWxsZWdhbCBmb3IgdGhlCisgIC8vLyB0YXJnZXQsIGFuZCB0aGUgb3BlcmF0aW9uIHdhcyByZWdpc3RlcmVkIHRvIHVzZSAnY3VzdG9tJyBsb3dlcmluZyBmb3IgdGhhdAorICAvLy8gcmVzdWx0IHR5cGUuICBUaGUgdGFyZ2V0IHBsYWNlcyBuZXcgcmVzdWx0IHZhbHVlcyBmb3IgdGhlIG5vZGUgaW4gUmVzdWx0cworICAvLy8gKHRoZWlyIG51bWJlciBhbmQgdHlwZXMgbXVzdCBleGFjdGx5IG1hdGNoIHRob3NlIG9mIHRoZSBvcmlnaW5hbCByZXR1cm4KKyAgLy8vIHZhbHVlcyBvZiB0aGUgbm9kZSksIG9yIGxlYXZlcyBSZXN1bHRzIGVtcHR5LCB3aGljaCBpbmRpY2F0ZXMgdGhhdCB0aGUKKyAgLy8vIG5vZGUgaXMgbm90IHRvIGJlIGN1c3RvbSBsb3dlcmVkIGFmdGVyIGFsbC4KKyAgLy8vCisgIC8vLyBJZiB0aGUgdGFyZ2V0IGhhcyBubyBvcGVyYXRpb25zIHRoYXQgcmVxdWlyZSBjdXN0b20gbG93ZXJpbmcsIGl0IG5lZWQgbm90CisgIC8vLyBpbXBsZW1lbnQgdGhpcy4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFib3J0cy4KKyAgdmlydHVhbCB2b2lkIFJlcGxhY2VOb2RlUmVzdWx0cyhTRE5vZGUgKiAvKk4qLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJi8qUmVzdWx0cyovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmLypEQUcqLykgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlJlcGxhY2VOb2RlUmVzdWx0cyBub3QgaW1wbGVtZW50ZWQgZm9yIHRoaXMgdGFyZ2V0ISIpOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG5hbWUgb2YgYSB0YXJnZXQgc3BlY2lmaWMgREFHIG5vZGUuCisgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0VGFyZ2V0Tm9kZU5hbWUodW5zaWduZWQgT3Bjb2RlKSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2QgcmV0dXJucyBhIHRhcmdldCBzcGVjaWZpYyBGYXN0SVNlbCBvYmplY3QsIG9yIG51bGwgaWYgdGhlCisgIC8vLyB0YXJnZXQgZG9lcyBub3Qgc3VwcG9ydCAiZmFzdCIgSVNlbC4KKyAgdmlydHVhbCBGYXN0SVNlbCAqY3JlYXRlRmFzdElTZWwoRnVuY3Rpb25Mb3dlcmluZ0luZm8gJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKikgY29uc3QgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgYm9vbCB2ZXJpZnlSZXR1cm5BZGRyZXNzQXJndW1lbnRJc0NvbnN0YW50KFNEVmFsdWUgT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIElubGluZSBBc20gU3VwcG9ydCBob29rcworICAvLworCisgIC8vLyBUaGlzIGhvb2sgYWxsb3dzIHRoZSB0YXJnZXQgdG8gZXhwYW5kIGFuIGlubGluZSBhc20gY2FsbCB0byBiZSBleHBsaWNpdAorICAvLy8gbGx2bSBjb2RlIGlmIGl0IHdhbnRzIHRvLiAgVGhpcyBpcyB1c2VmdWwgZm9yIHR1cm5pbmcgc2ltcGxlIGlubGluZSBhc21zCisgIC8vLyBpbnRvIExMVk0gaW50cmluc2ljcywgd2hpY2ggZ2l2ZXMgdGhlIGNvbXBpbGVyIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisgIC8vLyBiZWhhdmlvciBvZiB0aGUgY29kZS4KKyAgdmlydHVhbCBib29sIEV4cGFuZElubGluZUFzbShDYWxsSW5zdCAqKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZW51bSBDb25zdHJhaW50VHlwZSB7CisgICAgQ19SZWdpc3RlciwgICAgICAgICAgICAvLyBDb25zdHJhaW50IHJlcHJlc2VudHMgc3BlY2lmaWMgcmVnaXN0ZXIocykuCisgICAgQ19SZWdpc3RlckNsYXNzLCAgICAgICAvLyBDb25zdHJhaW50IHJlcHJlc2VudHMgYW55IG9mIHJlZ2lzdGVyKHMpIGluIGNsYXNzLgorICAgIENfTWVtb3J5LCAgICAgICAgICAgICAgLy8gTWVtb3J5IGNvbnN0cmFpbnQuCisgICAgQ19PdGhlciwgICAgICAgICAgICAgICAvLyBTb21ldGhpbmcgZWxzZS4KKyAgICBDX1Vua25vd24gICAgICAgICAgICAgIC8vIFVuc3VwcG9ydGVkIGNvbnN0cmFpbnQuCisgIH07CisKKyAgZW51bSBDb25zdHJhaW50V2VpZ2h0IHsKKyAgICAvLyBHZW5lcmljIHdlaWdodHMuCisgICAgQ1dfSW52YWxpZCAgPSAtMSwgICAgIC8vIE5vIG1hdGNoLgorICAgIENXX09rYXkgICAgID0gMCwgICAgICAvLyBBY2NlcHRhYmxlLgorICAgIENXX0dvb2QgICAgID0gMSwgICAgICAvLyBHb29kIHdlaWdodC4KKyAgICBDV19CZXR0ZXIgICA9IDIsICAgICAgLy8gQmV0dGVyIHdlaWdodC4KKyAgICBDV19CZXN0ICAgICA9IDMsICAgICAgLy8gQmVzdCB3ZWlnaHQuCisKKyAgICAvLyBXZWxsLWtub3duIHdlaWdodHMuCisgICAgQ1dfU3BlY2lmaWNSZWcgID0gQ1dfT2theSwgICAgLy8gU3BlY2lmaWMgcmVnaXN0ZXIgb3BlcmFuZHMuCisgICAgQ1dfUmVnaXN0ZXIgICAgID0gQ1dfR29vZCwgICAgLy8gUmVnaXN0ZXIgb3BlcmFuZHMuCisgICAgQ1dfTWVtb3J5ICAgICAgID0gQ1dfQmV0dGVyLCAgLy8gTWVtb3J5IG9wZXJhbmRzLgorICAgIENXX0NvbnN0YW50ICAgICA9IENXX0Jlc3QsICAgIC8vIENvbnN0YW50IG9wZXJhbmQuCisgICAgQ1dfRGVmYXVsdCAgICAgID0gQ1dfT2theSAgICAgLy8gRGVmYXVsdCBvciBkb24ndCBrbm93IHR5cGUuCisgIH07CisKKyAgLy8vIFRoaXMgY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIGVhY2ggY29uc3RyYWludCB0aGF0IHdlIGFyZSBsb3dlcmluZy4KKyAgc3RydWN0IEFzbU9wZXJhbmRJbmZvIDogcHVibGljIElubGluZUFzbTo6Q29uc3RyYWludEluZm8geworICAgIC8vLyBUaGlzIGNvbnRhaW5zIHRoZSBhY3R1YWwgc3RyaW5nIGZvciB0aGUgY29kZSwgbGlrZSAibSIuICBUYXJnZXRMb3dlcmluZworICAgIC8vLyBwaWNrcyB0aGUgJ2Jlc3QnIGNvZGUgZnJvbSBDb25zdHJhaW50SW5mbzo6Q29kZXMgdGhhdCBtb3N0IGNsb3NlbHkKKyAgICAvLy8gbWF0Y2hlcyB0aGUgb3BlcmFuZC4KKyAgICBzdGQ6OnN0cmluZyBDb25zdHJhaW50Q29kZTsKKworICAgIC8vLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY29uc3RyYWludCBjb2RlLCBlLmcuIFJlZ2lzdGVyLCBSZWdpc3RlckNsYXNzLAorICAgIC8vLyBNZW1vcnksIE90aGVyLCBVbmtub3duLgorICAgIFRhcmdldExvd2VyaW5nOjpDb25zdHJhaW50VHlwZSBDb25zdHJhaW50VHlwZSA9IFRhcmdldExvd2VyaW5nOjpDX1Vua25vd247CisKKyAgICAvLy8gSWYgdGhpcyBpcyB0aGUgcmVzdWx0IG91dHB1dCBvcGVyYW5kIG9yIGEgY2xvYmJlciwgdGhpcyBpcyBudWxsLAorICAgIC8vLyBvdGhlcndpc2UgaXQgaXMgdGhlIGluY29taW5nIG9wZXJhbmQgdG8gdGhlIENhbGxJbnN0LiAgVGhpcyBnZXRzCisgICAgLy8vIG1vZGlmaWVkIGFzIHRoZSBhc20gaXMgcHJvY2Vzc2VkLgorICAgIFZhbHVlICpDYWxsT3BlcmFuZFZhbCA9IG51bGxwdHI7CisKKyAgICAvLy8gVGhlIFZhbHVlVHlwZSBmb3IgdGhlIG9wZXJhbmQgdmFsdWUuCisgICAgTVZUIENvbnN0cmFpbnRWVCA9IE1WVDo6T3RoZXI7CisKKyAgICAvLy8gQ29weSBjb25zdHJ1Y3RvciBmb3IgY29weWluZyBmcm9tIGEgQ29uc3RyYWludEluZm8uCisgICAgQXNtT3BlcmFuZEluZm8oSW5saW5lQXNtOjpDb25zdHJhaW50SW5mbyBJbmZvKQorICAgICAgICA6IElubGluZUFzbTo6Q29uc3RyYWludEluZm8oc3RkOjptb3ZlKEluZm8pKSB7fQorCisgICAgLy8vIFJldHVybiB0cnVlIG9mIHRoaXMgaXMgYW4gaW5wdXQgb3BlcmFuZCB0aGF0IGlzIGEgbWF0Y2hpbmcgY29uc3RyYWludAorICAgIC8vLyBsaWtlICI0Ii4KKyAgICBib29sIGlzTWF0Y2hpbmdJbnB1dENvbnN0cmFpbnQoKSBjb25zdDsKKworICAgIC8vLyBJZiB0aGlzIGlzIGFuIGlucHV0IG1hdGNoaW5nIGNvbnN0cmFpbnQsIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG91dHB1dAorICAgIC8vLyBvcGVyYW5kIGl0IG1hdGNoZXMuCisgICAgdW5zaWduZWQgZ2V0TWF0Y2hlZE9wZXJhbmQoKSBjb25zdDsKKyAgfTsKKworICB1c2luZyBBc21PcGVyYW5kSW5mb1ZlY3RvciA9IHN0ZDo6dmVjdG9yPEFzbU9wZXJhbmRJbmZvPjsKKworICAvLy8gU3BsaXQgdXAgdGhlIGNvbnN0cmFpbnQgc3RyaW5nIGZyb20gdGhlIGlubGluZSBhc3NlbWJseSB2YWx1ZSBpbnRvIHRoZQorICAvLy8gc3BlY2lmaWMgY29uc3RyYWludHMgYW5kIHRoZWlyIHByZWZpeGVzLCBhbmQgYWxzbyB0aWUgaW4gdGhlIGFzc29jaWF0ZWQKKyAgLy8vIG9wZXJhbmQgdmFsdWVzLiAgSWYgdGhpcyByZXR1cm5zIGFuIGVtcHR5IHZlY3RvciwgYW5kIGlmIHRoZSBjb25zdHJhaW50CisgIC8vLyBzdHJpbmcgaXRzZWxmIGlzbid0IGVtcHR5LCB0aGVyZSB3YXMgYW4gZXJyb3IgcGFyc2luZy4KKyAgdmlydHVhbCBBc21PcGVyYW5kSW5mb1ZlY3RvciBQYXJzZUNvbnN0cmFpbnRzKGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVDYWxsU2l0ZSBDUykgY29uc3Q7CisKKyAgLy8vIEV4YW1pbmUgY29uc3RyYWludCB0eXBlIGFuZCBvcGVyYW5kIHR5cGUgYW5kIGRldGVybWluZSBhIHdlaWdodCB2YWx1ZS4KKyAgLy8vIFRoZSBvcGVyYW5kIG9iamVjdCBtdXN0IGFscmVhZHkgaGF2ZSBiZWVuIHNldCB1cCB3aXRoIHRoZSBvcGVyYW5kIHR5cGUuCisgIHZpcnR1YWwgQ29uc3RyYWludFdlaWdodCBnZXRNdWx0aXBsZUNvbnN0cmFpbnRNYXRjaFdlaWdodCgKKyAgICAgIEFzbU9wZXJhbmRJbmZvICZpbmZvLCBpbnQgbWFJbmRleCkgY29uc3Q7CisKKyAgLy8vIEV4YW1pbmUgY29uc3RyYWludCBzdHJpbmcgYW5kIG9wZXJhbmQgdHlwZSBhbmQgZGV0ZXJtaW5lIGEgd2VpZ2h0IHZhbHVlLgorICAvLy8gVGhlIG9wZXJhbmQgb2JqZWN0IG11c3QgYWxyZWFkeSBoYXZlIGJlZW4gc2V0IHVwIHdpdGggdGhlIG9wZXJhbmQgdHlwZS4KKyAgdmlydHVhbCBDb25zdHJhaW50V2VpZ2h0IGdldFNpbmdsZUNvbnN0cmFpbnRNYXRjaFdlaWdodCgKKyAgICAgIEFzbU9wZXJhbmRJbmZvICZpbmZvLCBjb25zdCBjaGFyICpjb25zdHJhaW50KSBjb25zdDsKKworICAvLy8gRGV0ZXJtaW5lcyB0aGUgY29uc3RyYWludCBjb2RlIGFuZCBjb25zdHJhaW50IHR5cGUgdG8gdXNlIGZvciB0aGUgc3BlY2lmaWMKKyAgLy8vIEFzbU9wZXJhbmRJbmZvLCBzZXR0aW5nIE9wSW5mby5Db25zdHJhaW50Q29kZSBhbmQgT3BJbmZvLkNvbnN0cmFpbnRUeXBlLgorICAvLy8gSWYgdGhlIGFjdHVhbCBvcGVyYW5kIGJlaW5nIHBhc3NlZCBpbiBpcyBhdmFpbGFibGUsIGl0IGNhbiBiZSBwYXNzZWQgaW4gYXMKKyAgLy8vIE9wLCBvdGhlcndpc2UgYW4gZW1wdHkgU0RWYWx1ZSBjYW4gYmUgcGFzc2VkLgorICB2aXJ0dWFsIHZvaWQgQ29tcHV0ZUNvbnN0cmFpbnRUb1VzZShBc21PcGVyYW5kSW5mbyAmT3BJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFZhbHVlIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgKkRBRyA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBHaXZlbiBhIGNvbnN0cmFpbnQsIHJldHVybiB0aGUgdHlwZSBvZiBjb25zdHJhaW50IGl0IGlzIGZvciB0aGlzIHRhcmdldC4KKyAgdmlydHVhbCBDb25zdHJhaW50VHlwZSBnZXRDb25zdHJhaW50VHlwZShTdHJpbmdSZWYgQ29uc3RyYWludCkgY29uc3Q7CisKKyAgLy8vIEdpdmVuIGEgcGh5c2ljYWwgcmVnaXN0ZXIgY29uc3RyYWludCAoZS5nLiAge2VkeH0pLCByZXR1cm4gdGhlIHJlZ2lzdGVyCisgIC8vLyBudW1iZXIgYW5kIHRoZSByZWdpc3RlciBjbGFzcyBmb3IgdGhlIHJlZ2lzdGVyLgorICAvLy8KKyAgLy8vIEdpdmVuIGEgcmVnaXN0ZXIgY2xhc3MgY29uc3RyYWludCwgbGlrZSAncicsIGlmIHRoaXMgY29ycmVzcG9uZHMgZGlyZWN0bHkKKyAgLy8vIHRvIGFuIExMVk0gcmVnaXN0ZXIgY2xhc3MsIHJldHVybiBhIHJlZ2lzdGVyIG9mIDAgYW5kIHRoZSByZWdpc3RlciBjbGFzcworICAvLy8gcG9pbnRlci4KKyAgLy8vCisgIC8vLyBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yIENfUmVnaXN0ZXIgY29uc3RyYWludHMuICBPbiBlcnJvciwgdGhpcworICAvLy8gcmV0dXJucyBhIHJlZ2lzdGVyIG51bWJlciBvZiAwIGFuZCBhIG51bGwgcmVnaXN0ZXIgY2xhc3MgcG9pbnRlci4KKyAgdmlydHVhbCBzdGQ6OnBhaXI8dW5zaWduZWQsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKj4KKyAgZ2V0UmVnRm9ySW5saW5lQXNtQ29uc3RyYWludChjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQ29uc3RyYWludCwgTVZUIFZUKSBjb25zdDsKKworICB2aXJ0dWFsIHVuc2lnbmVkIGdldElubGluZUFzbU1lbUNvbnN0cmFpbnQoU3RyaW5nUmVmIENvbnN0cmFpbnRDb2RlKSBjb25zdCB7CisgICAgaWYgKENvbnN0cmFpbnRDb2RlID09ICJpIikKKyAgICAgIHJldHVybiBJbmxpbmVBc206OkNvbnN0cmFpbnRfaTsKKyAgICBlbHNlIGlmIChDb25zdHJhaW50Q29kZSA9PSAibSIpCisgICAgICByZXR1cm4gSW5saW5lQXNtOjpDb25zdHJhaW50X207CisgICAgcmV0dXJuIElubGluZUFzbTo6Q29uc3RyYWludF9Vbmtub3duOworICB9CisKKyAgLy8vIFRyeSB0byByZXBsYWNlIGFuIFggY29uc3RyYWludCwgd2hpY2ggbWF0Y2hlcyBhbnl0aGluZywgd2l0aCBhbm90aGVyIHRoYXQKKyAgLy8vIGhhcyBtb3JlIHNwZWNpZmljIHJlcXVpcmVtZW50cyBiYXNlZCBvbiB0aGUgdHlwZSBvZiB0aGUgY29ycmVzcG9uZGluZworICAvLy8gb3BlcmFuZC4gIFRoaXMgcmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIHJlcGxhY2VtZW50IHRvIG1ha2UuCisgIHZpcnR1YWwgY29uc3QgY2hhciAqTG93ZXJYQ29uc3RyYWludChFVlQgQ29uc3RyYWludFZUKSBjb25zdDsKKworICAvLy8gTG93ZXIgdGhlIHNwZWNpZmllZCBvcGVyYW5kIGludG8gdGhlIE9wcyB2ZWN0b3IuICBJZiBpdCBpcyBpbnZhbGlkLCBkb24ndAorICAvLy8gYWRkIGFueXRoaW5nIHRvIE9wcy4KKyAgdmlydHVhbCB2b2lkIExvd2VyQXNtT3BlcmFuZEZvckNvbnN0cmFpbnQoU0RWYWx1ZSBPcCwgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNEVmFsdWU+ICZPcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gRGl2IHV0aWxpdHkgZnVuY3Rpb25zCisgIC8vCisgIFNEVmFsdWUgQnVpbGRTRElWKFNETm9kZSAqTiwgY29uc3QgQVBJbnQgJkRpdmlzb3IsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICBib29sIElzQWZ0ZXJMZWdhbGl6YXRpb24sCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNETm9kZSAqPiAqQ3JlYXRlZCkgY29uc3Q7CisgIFNEVmFsdWUgQnVpbGRVRElWKFNETm9kZSAqTiwgY29uc3QgQVBJbnQgJkRpdmlzb3IsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICBib29sIElzQWZ0ZXJMZWdhbGl6YXRpb24sCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNETm9kZSAqPiAqQ3JlYXRlZCkgY29uc3Q7CisKKyAgLy8vIFRhcmdldHMgbWF5IG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gdG8gcHJvdmlkZSBjdXN0b20gU0RJViBsb3dlcmluZyBmb3IKKyAgLy8vIHBvd2VyLW9mLTIgZGVub21pbmF0b3JzLiAgSWYgdGhlIHRhcmdldCByZXR1cm5zIGFuIGVtcHR5IFNEVmFsdWUsIExMVk0KKyAgLy8vIGFzc3VtZXMgU0RJViBpcyBleHBlbnNpdmUgYW5kIHJlcGxhY2VzIGl0IHdpdGggYSBzZXJpZXMgb2Ygb3RoZXIgaW50ZWdlcgorICAvLy8gb3BlcmF0aW9ucy4KKyAgdmlydHVhbCBTRFZhbHVlIEJ1aWxkU0RJVlBvdzIoU0ROb2RlICpOLCBjb25zdCBBUEludCAmRGl2aXNvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFNETm9kZSAqPiAqQ3JlYXRlZCkgY29uc3Q7CisKKyAgLy8vIEluZGljYXRlIHdoZXRoZXIgdGhpcyB0YXJnZXQgcHJlZmVycyB0byBjb21iaW5lIEZESVZzIHdpdGggdGhlIHNhbWUKKyAgLy8vIGRpdmlzb3IuIElmIHRoZSB0cmFuc2Zvcm0gc2hvdWxkIG5ldmVyIGJlIGRvbmUsIHJldHVybiB6ZXJvLiBJZiB0aGUKKyAgLy8vIHRyYW5zZm9ybSBzaG91bGQgYmUgZG9uZSwgcmV0dXJuIHRoZSBtaW5pbXVtIG51bWJlciBvZiBkaXZpc29yIHVzZXMKKyAgLy8vIHRoYXQgbXVzdCBleGlzdC4KKyAgdmlydHVhbCB1bnNpZ25lZCBjb21iaW5lUmVwZWF0ZWRGUERpdmlzb3JzKCkgY29uc3QgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIEhvb2tzIGZvciBidWlsZGluZyBlc3RpbWF0ZXMgaW4gcGxhY2Ugb2Ygc2xvd2VyIGRpdmlzaW9ucyBhbmQgc3F1YXJlCisgIC8vLyByb290cy4KKworICAvLy8gUmV0dXJuIGVpdGhlciBhIHNxdWFyZSByb290IG9yIGl0cyByZWNpcHJvY2FsIGVzdGltYXRlIHZhbHVlIGZvciB0aGUgaW5wdXQKKyAgLy8vIG9wZXJhbmQuCisgIC8vLyBccCBFbmFibGVkIGlzIGEgUmVjaXByb2NhbEVzdGltYXRlIGVudW0gd2l0aCB2YWx1ZSBlaXRoZXIgJ1Vuc3BlY2lmaWVkJyBvcgorICAvLy8gJ0VuYWJsZWQnIGFzIHNldCBieSBhIHBvdGVudGlhbCBkZWZhdWx0IG92ZXJyaWRlIGF0dHJpYnV0ZS4KKyAgLy8vIElmIFxwIFJlZmluZW1lbnRTdGVwcyBpcyAnVW5zcGVjaWZpZWQnLCB0aGUgbnVtYmVyIG9mIE5ld3Rvbi1SYXBoc29uCisgIC8vLyByZWZpbmVtZW50IGl0ZXJhdGlvbnMgcmVxdWlyZWQgdG8gZ2VuZXJhdGUgYSBzdWZmaWNpZW50ICh0aG91Z2ggbm90CisgIC8vLyBuZWNlc3NhcmlseSBJRUVFLTc1NCBjb21wbGlhbnQpIGVzdGltYXRlIGlzIHJldHVybmVkIGluIHRoYXQgcGFyYW1ldGVyLgorICAvLy8gVGhlIGJvb2xlYW4gVXNlT25lQ29uc3ROUiBvdXRwdXQgaXMgdXNlZCB0byBzZWxlY3QgYSBOZXd0b24tUmFwaHNvbgorICAvLy8gYWxnb3JpdGhtIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyBlaXRoZXIgb25lIG9yIHR3byBjb25zdGFudHMuCisgIC8vLyBUaGUgYm9vbGVhbiBSZWNpcHJvY2FsIGlzIHVzZWQgdG8gc2VsZWN0IHdoZXRoZXIgdGhlIGVzdGltYXRlIGlzIGZvciB0aGUKKyAgLy8vIHNxdWFyZSByb290IG9mIHRoZSBpbnB1dCBvcGVyYW5kIG9yIHRoZSByZWNpcHJvY2FsIG9mIGl0cyBzcXVhcmUgcm9vdC4KKyAgLy8vIEEgdGFyZ2V0IG1heSBjaG9vc2UgdG8gaW1wbGVtZW50IGl0cyBvd24gcmVmaW5lbWVudCB3aXRoaW4gdGhpcyBmdW5jdGlvbi4KKyAgLy8vIElmIHRoYXQncyB0cnVlLCB0aGVuIHJldHVybiAnMCcgYXMgdGhlIG51bWJlciBvZiBSZWZpbmVtZW50U3RlcHMgdG8gYXZvaWQKKyAgLy8vIGFueSBmdXJ0aGVyIHJlZmluZW1lbnQgb2YgdGhlIGVzdGltYXRlLgorICAvLy8gQW4gZW1wdHkgU0RWYWx1ZSByZXR1cm4gbWVhbnMgbm8gZXN0aW1hdGUgc2VxdWVuY2UgY2FuIGJlIGNyZWF0ZWQuCisgIHZpcnR1YWwgU0RWYWx1ZSBnZXRTcXJ0RXN0aW1hdGUoU0RWYWx1ZSBPcGVyYW5kLCBTZWxlY3Rpb25EQUcgJkRBRywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRW5hYmxlZCwgaW50ICZSZWZpbmVtZW50U3RlcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmVXNlT25lQ29uc3ROUiwgYm9vbCBSZWNpcHJvY2FsKSBjb25zdCB7CisgICAgcmV0dXJuIFNEVmFsdWUoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSByZWNpcHJvY2FsIGVzdGltYXRlIHZhbHVlIGZvciB0aGUgaW5wdXQgb3BlcmFuZC4KKyAgLy8vIFxwIEVuYWJsZWQgaXMgYSBSZWNpcHJvY2FsRXN0aW1hdGUgZW51bSB3aXRoIHZhbHVlIGVpdGhlciAnVW5zcGVjaWZpZWQnIG9yCisgIC8vLyAnRW5hYmxlZCcgYXMgc2V0IGJ5IGEgcG90ZW50aWFsIGRlZmF1bHQgb3ZlcnJpZGUgYXR0cmlidXRlLgorICAvLy8gSWYgXHAgUmVmaW5lbWVudFN0ZXBzIGlzICdVbnNwZWNpZmllZCcsIHRoZSBudW1iZXIgb2YgTmV3dG9uLVJhcGhzb24KKyAgLy8vIHJlZmluZW1lbnQgaXRlcmF0aW9ucyByZXF1aXJlZCB0byBnZW5lcmF0ZSBhIHN1ZmZpY2llbnQgKHRob3VnaCBub3QKKyAgLy8vIG5lY2Vzc2FyaWx5IElFRUUtNzU0IGNvbXBsaWFudCkgZXN0aW1hdGUgaXMgcmV0dXJuZWQgaW4gdGhhdCBwYXJhbWV0ZXIuCisgIC8vLyBBIHRhcmdldCBtYXkgY2hvb3NlIHRvIGltcGxlbWVudCBpdHMgb3duIHJlZmluZW1lbnQgd2l0aGluIHRoaXMgZnVuY3Rpb24uCisgIC8vLyBJZiB0aGF0J3MgdHJ1ZSwgdGhlbiByZXR1cm4gJzAnIGFzIHRoZSBudW1iZXIgb2YgUmVmaW5lbWVudFN0ZXBzIHRvIGF2b2lkCisgIC8vLyBhbnkgZnVydGhlciByZWZpbmVtZW50IG9mIHRoZSBlc3RpbWF0ZS4KKyAgLy8vIEFuIGVtcHR5IFNEVmFsdWUgcmV0dXJuIG1lYW5zIG5vIGVzdGltYXRlIHNlcXVlbmNlIGNhbiBiZSBjcmVhdGVkLgorICB2aXJ0dWFsIFNEVmFsdWUgZ2V0UmVjaXBFc3RpbWF0ZShTRFZhbHVlIE9wZXJhbmQsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRW5hYmxlZCwgaW50ICZSZWZpbmVtZW50U3RlcHMpIGNvbnN0IHsKKyAgICByZXR1cm4gU0RWYWx1ZSgpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIExlZ2FsaXphdGlvbiB1dGlsaXR5IGZ1bmN0aW9ucworICAvLworCisgIC8vLyBFeHBhbmQgYSBNVUwgb3IgW1VTXU1VTF9MT0hJIG9mIG4tYml0IHZhbHVlcyBpbnRvIHR3byBvciBmb3VyIG5vZGVzLAorICAvLy8gcmVzcGVjdGl2ZWx5LCBlYWNoIGNvbXB1dGluZyBhbiBuLzItYml0IHBhcnQgb2YgdGhlIHJlc3VsdC4KKyAgLy8vIFxwYXJhbSBSZXN1bHQgQSB2ZWN0b3IgdGhhdCB3aWxsIGJlIGZpbGxlZCB3aXRoIHRoZSBwYXJ0cyBvZiB0aGUgcmVzdWx0CisgIC8vLyAgICAgICAgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci4KKyAgLy8vIFxwYXJhbSBMTCBMb3cgYml0cyBvZiB0aGUgTEhTIG9mIHRoZSBNVUwuICBZb3UgY2FuIHVzZSB0aGlzIHBhcmFtZXRlcgorICAvLy8gICAgICAgIGlmIHlvdSB3YW50IHRvIGNvbnRyb2wgaG93IGxvdyBiaXRzIGFyZSBleHRyYWN0ZWQgZnJvbSB0aGUgTEhTLgorICAvLy8gXHBhcmFtIExIIEhpZ2ggYml0cyBvZiB0aGUgTEhTIG9mIHRoZSBNVUwuICBTZWUgTEwgZm9yIG1lYW5pbmcuCisgIC8vLyBccGFyYW0gUkwgTG93IGJpdHMgb2YgdGhlIFJIUyBvZiB0aGUgTVVMLiAgU2VlIExMIGZvciBtZWFuaW5nCisgIC8vLyBccGFyYW0gUkggSGlnaCBiaXRzIG9mIHRoZSBSSFMgb2YgdGhlIE1VTC4gIFNlZSBMTCBmb3IgbWVhbmluZy4KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhlIG5vZGUgaGFzIGJlZW4gZXhwYW5kZWQsIGZhbHNlIGlmIGl0IGhhcyBub3QKKyAgYm9vbCBleHBhbmRNVUxfTE9ISSh1bnNpZ25lZCBPcGNvZGUsIEVWVCBWVCwgU0RMb2MgZGwsIFNEVmFsdWUgTEhTLAorICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgUkhTLCBTbWFsbFZlY3RvckltcGw8U0RWYWx1ZT4gJlJlc3VsdCwgRVZUIEhpTG9WVCwKKyAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRywgTXVsRXhwYW5zaW9uS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgIFNEVmFsdWUgTEwgPSBTRFZhbHVlKCksIFNEVmFsdWUgTEggPSBTRFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBSTCA9IFNEVmFsdWUoKSwgU0RWYWx1ZSBSSCA9IFNEVmFsdWUoKSkgY29uc3Q7CisKKyAgLy8vIEV4cGFuZCBhIE1VTCBpbnRvIHR3byBub2Rlcy4gIE9uZSB0aGF0IGNvbXB1dGVzIHRoZSBoaWdoIGJpdHMgb2YKKyAgLy8vIHRoZSByZXN1bHQgYW5kIG9uZSB0aGF0IGNvbXB1dGVzIHRoZSBsb3cgYml0cy4KKyAgLy8vIFxwYXJhbSBIaUxvVlQgVGhlIHZhbHVlIHR5cGUgdG8gdXNlIGZvciB0aGUgTG8gYW5kIEhpIG5vZGVzLgorICAvLy8gXHBhcmFtIExMIExvdyBiaXRzIG9mIHRoZSBMSFMgb2YgdGhlIE1VTC4gIFlvdSBjYW4gdXNlIHRoaXMgcGFyYW1ldGVyCisgIC8vLyAgICAgICAgaWYgeW91IHdhbnQgdG8gY29udHJvbCBob3cgbG93IGJpdHMgYXJlIGV4dHJhY3RlZCBmcm9tIHRoZSBMSFMuCisgIC8vLyBccGFyYW0gTEggSGlnaCBiaXRzIG9mIHRoZSBMSFMgb2YgdGhlIE1VTC4gIFNlZSBMTCBmb3IgbWVhbmluZy4KKyAgLy8vIFxwYXJhbSBSTCBMb3cgYml0cyBvZiB0aGUgUkhTIG9mIHRoZSBNVUwuICBTZWUgTEwgZm9yIG1lYW5pbmcKKyAgLy8vIFxwYXJhbSBSSCBIaWdoIGJpdHMgb2YgdGhlIFJIUyBvZiB0aGUgTVVMLiAgU2VlIExMIGZvciBtZWFuaW5nLgorICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGUgbm9kZSBoYXMgYmVlbiBleHBhbmRlZC4gZmFsc2UgaWYgaXQgaGFzIG5vdAorICBib29sIGV4cGFuZE1VTChTRE5vZGUgKk4sIFNEVmFsdWUgJkxvLCBTRFZhbHVlICZIaSwgRVZUIEhpTG9WVCwKKyAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcsIE11bEV4cGFuc2lvbktpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgU0RWYWx1ZSBMTCA9IFNEVmFsdWUoKSwgU0RWYWx1ZSBMSCA9IFNEVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgU0RWYWx1ZSBSTCA9IFNEVmFsdWUoKSwgU0RWYWx1ZSBSSCA9IFNEVmFsdWUoKSkgY29uc3Q7CisKKyAgLy8vIEV4cGFuZCBmbG9hdChmMzIpIHRvIFNJTlQoaTY0KSBjb252ZXJzaW9uCisgIC8vLyBccGFyYW0gTiBOb2RlIHRvIGV4cGFuZAorICAvLy8gXHBhcmFtIFJlc3VsdCBvdXRwdXQgYWZ0ZXIgY29udmVyc2lvbgorICAvLy8gXHJldHVybnMgVHJ1ZSwgaWYgdGhlIGV4cGFuc2lvbiB3YXMgc3VjY2Vzc2Z1bCwgZmFsc2Ugb3RoZXJ3aXNlCisgIGJvb2wgZXhwYW5kRlBfVE9fU0lOVChTRE5vZGUgKk4sIFNEVmFsdWUgJlJlc3VsdCwgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgIC8vLyBUdXJuIGxvYWQgb2YgdmVjdG9yIHR5cGUgaW50byBhIGxvYWQgb2YgdGhlIGluZGl2aWR1YWwgZWxlbWVudHMuCisgIC8vLyBccGFyYW0gTEQgbG9hZCB0byBleHBhbmQKKyAgLy8vIFxyZXR1cm5zIE1FUkdFX1ZBTFVFcyBvZiB0aGUgc2NhbGFyIGxvYWRzIHdpdGggdGhlaXIgY2hhaW5zLgorICBTRFZhbHVlIHNjYWxhcml6ZVZlY3RvckxvYWQoTG9hZFNETm9kZSAqTEQsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAvLyBUdXJuIGEgc3RvcmUgb2YgYSB2ZWN0b3IgdHlwZSBpbnRvIHN0b3JlcyBvZiB0aGUgaW5kaXZpZHVhbCBlbGVtZW50cy4KKyAgLy8vIFxwYXJhbSBTVCBTdG9yZSB3aXRoIGEgdmVjdG9yIHZhbHVlIHR5cGUKKyAgLy8vIFxyZXR1cm5zIE1FUkdFX1ZBTFVzIG9mIHRoZSBpbmRpdmlkdWFsIHN0b3JlIGNoYWlucy4KKyAgU0RWYWx1ZSBzY2FsYXJpemVWZWN0b3JTdG9yZShTdG9yZVNETm9kZSAqU1QsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworICAvLy8gRXhwYW5kcyBhbiB1bmFsaWduZWQgbG9hZCB0byAyIGhhbGYtc2l6ZSBsb2FkcyBmb3IgYW4gaW50ZWdlciwgYW5kCisgIC8vLyBwb3NzaWJseSBtb3JlIGZvciB2ZWN0b3JzLgorICBzdGQ6OnBhaXI8U0RWYWx1ZSwgU0RWYWx1ZT4gZXhwYW5kVW5hbGlnbmVkTG9hZChMb2FkU0ROb2RlICpMRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0OworCisgIC8vLyBFeHBhbmRzIGFuIHVuYWxpZ25lZCBzdG9yZSB0byAyIGhhbGYtc2l6ZSBzdG9yZXMgZm9yIGludGVnZXIgdmFsdWVzLCBhbmQKKyAgLy8vIHBvc3NpYmx5IG1vcmUgZm9yIHZlY3RvcnMuCisgIFNEVmFsdWUgZXhwYW5kVW5hbGlnbmVkU3RvcmUoU3RvcmVTRE5vZGUgKlNULCBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgLy8vIEluY3JlbWVudHMgbWVtb3J5IGFkZHJlc3MgXHAgQWRkciBhY2NvcmRpbmcgdG8gdGhlIHR5cGUgb2YgdGhlIHZhbHVlCisgIC8vLyBccCBEYXRhVlQgdGhhdCBzaG91bGQgYmUgc3RvcmVkLiBJZiB0aGUgZGF0YSBpcyBzdG9yZWQgaW4gY29tcHJlc3NlZAorICAvLy8gZm9ybSwgdGhlIG1lbW9yeSBhZGRyZXNzIHNob3VsZCBiZSBpbmNyZW1lbnRlZCBhY2NvcmRpbmcgdG8gdGhlIG51bWJlciBvZgorICAvLy8gdGhlIHN0b3JlZCBlbGVtZW50cy4gVGhpcyBudW1iZXIgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZiAnMSdzIGJpdHMKKyAgLy8vIGluIHRoZSBccCBNYXNrLgorICAvLy8gXHAgRGF0YVZUIGlzIGEgdmVjdG9yIHR5cGUuIFxwIE1hc2sgaXMgYSB2ZWN0b3IgdmFsdWUuCisgIC8vLyBccCBEYXRhVlQgYW5kIFxwIE1hc2sgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgdmVjdG9yIGVsZW1lbnRzLgorICBTRFZhbHVlIEluY3JlbWVudE1lbW9yeUFkZHJlc3MoU0RWYWx1ZSBBZGRyLCBTRFZhbHVlIE1hc2ssIGNvbnN0IFNETG9jICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVWVCBEYXRhVlQsIFNlbGVjdGlvbkRBRyAmREFHLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0NvbXByZXNzZWRNZW1vcnkpIGNvbnN0OworCisgIC8vLyBHZXQgYSBwb2ludGVyIHRvIHZlY3RvciBlbGVtZW50IFxwIElkeCBsb2NhdGVkIGluIG1lbW9yeSBmb3IgYSB2ZWN0b3Igb2YKKyAgLy8vIHR5cGUgXHAgVmVjVlQgc3RhcnRpbmcgYXQgYSBiYXNlIGFkZHJlc3Mgb2YgXHAgVmVjUHRyLiBJZiBccCBJZHggaXMgb3V0IG9mCisgIC8vLyBib3VuZHMgdGhlIHJldHVybmVkIHBvaW50ZXIgaXMgdW5zcGVjaWZpZWQsIGJ1dCB3aWxsIGJlIHdpdGhpbiB0aGUgdmVjdG9yCisgIC8vLyBib3VuZHMuCisgIFNEVmFsdWUgZ2V0VmVjdG9yRWxlbWVudFBvaW50ZXIoU2VsZWN0aW9uREFHICZEQUcsIFNEVmFsdWUgVmVjUHRyLCBFVlQgVmVjVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RWYWx1ZSBJZHgpIGNvbnN0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJbnN0cnVjdGlvbiBFbWl0dGluZyBIb29rcworICAvLworCisgIC8vLyBUaGlzIG1ldGhvZCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgdGFyZ2V0cyB0aGF0IG1hcmsgaW5zdHJ1Y3Rpb25zIHdpdGgKKyAgLy8vIHRoZSAndXNlc0N1c3RvbUluc2VydGVyJyBmbGFnLiAgVGhlc2UgaW5zdHJ1Y3Rpb25zIGFyZSBzcGVjaWFsIGluIHZhcmlvdXMKKyAgLy8vIHdheXMsIHdoaWNoIHJlcXVpcmUgc3BlY2lhbCBzdXBwb3J0IHRvIGluc2VydC4gIFRoZSBzcGVjaWZpZWQgTWFjaGluZUluc3RyCisgIC8vLyBpcyBjcmVhdGVkIGJ1dCBub3QgaW5zZXJ0ZWQgaW50byBhbnkgYmFzaWMgYmxvY2tzLCBhbmQgdGhpcyBtZXRob2QgaXMKKyAgLy8vIGNhbGxlZCB0byBleHBhbmQgaXQgaW50byBhIHNlcXVlbmNlIG9mIGluc3RydWN0aW9ucywgcG90ZW50aWFsbHkgYWxzbworICAvLy8gY3JlYXRpbmcgbmV3IGJhc2ljIGJsb2NrcyBhbmQgY29udHJvbCBmbG93LgorICAvLy8gQXMgbG9uZyBhcyB0aGUgcmV0dXJuZWQgYmFzaWMgYmxvY2sgaXMgZGlmZmVyZW50IChpLmUuLCB3ZSBjcmVhdGVkIGEgbmV3CisgIC8vLyBvbmUpLCB0aGUgY3VzdG9tIGluc2VydGVyIGlzIGZyZWUgdG8gbW9kaWZ5IHRoZSByZXN0IG9mIFxwIE1CQi4KKyAgdmlydHVhbCBNYWNoaW5lQmFzaWNCbG9jayAqCisgIEVtaXRJbnN0cldpdGhDdXN0b21JbnNlcnRlcihNYWNoaW5lSW5zdHIgJk1JLCBNYWNoaW5lQmFzaWNCbG9jayAqTUJCKSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIGltcGxlbWVudGVkIGJ5IHRhcmdldHMgdGhhdCBtYXJrIGluc3RydWN0aW9ucyB3aXRoCisgIC8vLyB0aGUgJ2hhc1Bvc3RJU2VsSG9vaycgZmxhZy4gVGhlc2UgaW5zdHJ1Y3Rpb25zIG11c3QgYmUgYWRqdXN0ZWQgYWZ0ZXIKKyAgLy8vIGluc3RydWN0aW9uIHNlbGVjdGlvbiBieSB0YXJnZXQgaG9va3MuICBlLmcuIFRvIGZpbGwgaW4gb3B0aW9uYWwgZGVmcyBmb3IKKyAgLy8vIEFSTSAncycgc2V0dGluZyBpbnN0cnVjdGlvbnMuCisgIHZpcnR1YWwgdm9pZCBBZGp1c3RJbnN0clBvc3RJbnN0clNlbGVjdGlvbihNYWNoaW5lSW5zdHIgJk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0ROb2RlICpOb2RlKSBjb25zdDsKKworICAvLy8gSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUsIFNlbGVjdGlvbkRBR0J1aWxkZXIgZW1pdHMgYQorICAvLy8gTE9BRF9TVEFDS19HVUFSRCBub2RlIHdoZW4gaXQgaXMgbG93ZXJpbmcgSW50cmluc2ljOjpzdGFja3Byb3RlY3Rvci4KKyAgdmlydHVhbCBib29sIHVzZUxvYWRTdGFja0d1YXJkTm9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2aXJ0dWFsIFNEVmFsdWUgZW1pdFN0YWNrR3VhcmRYb3JGUChTZWxlY3Rpb25EQUcgJkRBRywgU0RWYWx1ZSBWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNETG9jICZETCkgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIm5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyB0YXJnZXQiKTsKKyAgfQorCisgIC8vLyBMb3dlciBUTFMgZ2xvYmFsIGFkZHJlc3MgU0ROb2RlIGZvciB0YXJnZXQgaW5kZXBlbmRlbnQgZW11bGF0ZWQgVExTIG1vZGVsLgorICB2aXJ0dWFsIFNEVmFsdWUgTG93ZXJUb1RMU0VtdWxhdGVkTW9kZWwoY29uc3QgR2xvYmFsQWRkcmVzc1NETm9kZSAqR0EsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3Rpb25EQUcgJkRBRykgY29uc3Q7CisKKyAgLy8vIEV4cGFuZHMgdGFyZ2V0IHNwZWNpZmljIGluZGlyZWN0IGJyYW5jaCBmb3IgdGhlIGNhc2Ugb2YgSnVtcFRhYmxlCisgIC8vLyBleHBhbmFzaW9uLgorICB2aXJ0dWFsIFNEVmFsdWUgZXhwYW5kSW5kaXJlY3RKVEJyYW5jaChjb25zdCBTRExvYyYgZGwsIFNEVmFsdWUgVmFsdWUsIFNEVmFsdWUgQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VsZWN0aW9uREFHICZEQUcpIGNvbnN0IHsKKyAgICByZXR1cm4gREFHLmdldE5vZGUoSVNEOjpCUklORCwgZGwsIE1WVDo6T3RoZXIsIFZhbHVlLCBBZGRyKTsKKyAgfQorCisgIC8vIHNldGVxKHgsIDApIC0+IHRydW5jYXRlKHNybChjdGx6KHpleHQoeCkpLCBsb2cyKCNiaXRzKSkpCisgIC8vIElmIHdlJ3JlIGNvbXBhcmluZyBmb3IgZXF1YWxpdHkgdG8gemVybyBhbmQgaXNDdGx6RmFzdCBpcyB0cnVlLCBleHBvc2UgdGhlCisgIC8vIGZhY3QgdGhhdCB0aGlzIGNhbiBiZSBpbXBsZW1lbnRlZCBhcyBhIGN0bHovc3JsIHBhaXIsIHNvIHRoYXQgdGhlIGRhZworICAvLyBjb21iaW5lciBjYW4gZm9sZCB0aGUgbmV3IG5vZGVzLgorICBTRFZhbHVlIGxvd2VyQ21wRXFaZXJvVG9DdGx6U3JsKFNEVmFsdWUgT3AsIFNlbGVjdGlvbkRBRyAmREFHKSBjb25zdDsKKworcHJpdmF0ZToKKyAgU0RWYWx1ZSBzaW1wbGlmeVNldENDV2l0aEFuZChFVlQgVlQsIFNEVmFsdWUgTjAsIFNEVmFsdWUgTjEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVNEOjpDb25kQ29kZSBDb25kLCBEQUdDb21iaW5lckluZm8gJkRDSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTRExvYyAmREwpIGNvbnN0OworfTsKKworLy8vIEdpdmVuIGFuIExMVk0gSVIgdHlwZSBhbmQgcmV0dXJuIHR5cGUgYXR0cmlidXRlcywgY29tcHV0ZSB0aGUgcmV0dXJuIHZhbHVlCisvLy8gRVZUcyBhbmQgZmxhZ3MsIGFuZCBvcHRpb25hbGx5IGFsc28gdGhlIG9mZnNldHMsIGlmIHRoZSByZXR1cm4gdmFsdWUgaXMKKy8vLyBiZWluZyBsb3dlcmVkIHRvIG1lbW9yeS4KK3ZvaWQgR2V0UmV0dXJuSW5mbyhUeXBlICpSZXR1cm5UeXBlLCBBdHRyaWJ1dGVMaXN0IGF0dHIsCisgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPElTRDo6T3V0cHV0QXJnPiAmT3V0cywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMb3dlcmluZyAmVExJLCBjb25zdCBEYXRhTGF5b3V0ICZETCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fVEFSR0VUTE9XRVJJTkdfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldExvd2VyaW5nT2JqZWN0RmlsZUltcGwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYXJnZXRMb3dlcmluZ09iamVjdEZpbGVJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzhkYTc3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYXJnZXRMb3dlcmluZ09iamVjdEZpbGVJbXBsLmgKQEAgLTAsMCArMSwyMDAgQEAKKy8vPT0tIGxsdm0vQ29kZUdlbi9UYXJnZXRMb3dlcmluZ09iamVjdEZpbGVJbXBsLmggLSBPYmplY3QgSW5mbyAtLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgY2xhc3NlcyB1c2VkIHRvIGhhbmRsZSBsb3dlcmluZ3Mgc3BlY2lmaWMgdG8gY29tbW9uCisvLyBvYmplY3QgZmlsZSBmb3JtYXRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1RBUkdFVExPV0VSSU5HT0JKRUNURklMRUlNUExfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fVEFSR0VUTE9XRVJJTkdPQkpFQ1RGSUxFSU1QTF9ICisKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNFeHByLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBNYWNoaW5lTW9kdWxlSW5mbzsKK2NsYXNzIE1hbmdsZXI7CitjbGFzcyBNQ0NvbnRleHQ7CitjbGFzcyBNQ1NlY3Rpb247CitjbGFzcyBNQ1N5bWJvbDsKK2NsYXNzIFRhcmdldE1hY2hpbmU7CisKK2NsYXNzIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZUVMRiA6IHB1YmxpYyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGUgeworICBib29sIFVzZUluaXRBcnJheSA9IGZhbHNlOworICBtdXRhYmxlIHVuc2lnbmVkIE5leHRVbmlxdWVJRCA9IDE7ICAvLyBJRCAwIGlzIHJlc2VydmVkIGZvciBleGVjdXRlLW9ubHkgc2VjdGlvbnMKKworcHJvdGVjdGVkOgorICBNQ1N5bWJvbFJlZkV4cHI6OlZhcmlhbnRLaW5kIFBMVFJlbGF0aXZlVmFyaWFudEtpbmQgPQorICAgICAgTUNTeW1ib2xSZWZFeHByOjpWS19Ob25lOworCitwdWJsaWM6CisgIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZUVMRigpID0gZGVmYXVsdDsKKyAgflRhcmdldExvd2VyaW5nT2JqZWN0RmlsZUVMRigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICAvLy8gRW1pdCBPYmotQyBnYXJiYWdlIGNvbGxlY3Rpb24gYW5kIGxpbmtlciBvcHRpb25zLgorICB2b2lkIGVtaXRNb2R1bGVNZXRhZGF0YShNQ1N0cmVhbWVyICZTdHJlYW1lciwgTW9kdWxlICZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBlbWl0UGVyc29uYWxpdHlWYWx1ZShNQ1N0cmVhbWVyICZTdHJlYW1lciwgY29uc3QgRGF0YUxheW91dCAmVE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKlN5bSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIEdpdmVuIGEgY29uc3RhbnQgd2l0aCB0aGUgU2VjdGlvbktpbmQsIHJldHVybiBhIHNlY3Rpb24gdGhhdCBpdCBzaG91bGQgYmUKKyAgLy8vIHBsYWNlZCBpbi4KKyAgTUNTZWN0aW9uICpnZXRTZWN0aW9uRm9yQ29uc3RhbnQoY29uc3QgRGF0YUxheW91dCAmREwsIFNlY3Rpb25LaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmQWxpZ24pIGNvbnN0IG92ZXJyaWRlOworCisgIE1DU2VjdGlvbiAqZ2V0RXhwbGljaXRTZWN0aW9uR2xvYmFsKGNvbnN0IEdsb2JhbE9iamVjdCAqR08sIFNlY3Rpb25LaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBjb25zdCBvdmVycmlkZTsKKworICBNQ1NlY3Rpb24gKlNlbGVjdFNlY3Rpb25Gb3JHbG9iYWwoY29uc3QgR2xvYmFsT2JqZWN0ICpHTywgU2VjdGlvbktpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBjb25zdCBvdmVycmlkZTsKKworICBNQ1NlY3Rpb24gKmdldFNlY3Rpb25Gb3JKdW1wVGFibGUoY29uc3QgRnVuY3Rpb24gJkYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBzaG91bGRQdXRKdW1wVGFibGVJbkZ1bmN0aW9uU2VjdGlvbihib29sIFVzZXNMYWJlbERpZmZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb24gJkYpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vLyBSZXR1cm4gYW4gTUNFeHByIHRvIHVzZSBmb3IgYSByZWZlcmVuY2UgdG8gdGhlIHNwZWNpZmllZCB0eXBlIGluZm8gZ2xvYmFsCisgIC8vLyB2YXJpYWJsZSBmcm9tIGV4Y2VwdGlvbiBoYW5kbGluZyBpbmZvcm1hdGlvbi4KKyAgY29uc3QgTUNFeHByICpnZXRUVHlwZUdsb2JhbFJlZmVyZW5jZShjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1vZHVsZUluZm8gKk1NSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1N0cmVhbWVyICZTdHJlYW1lcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8gVGhlIHN5bWJvbCB0aGF0IGdldHMgcGFzc2VkIHRvIC5jZmlfcGVyc29uYWxpdHkuCisgIE1DU3ltYm9sICpnZXRDRklQZXJzb25hbGl0eVN5bWJvbChjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNb2R1bGVJbmZvICpNTUkpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgSW5pdGlhbGl6ZUVMRihib29sIFVzZUluaXRBcnJheV8pOworICBNQ1NlY3Rpb24gKmdldFN0YXRpY0N0b3JTZWN0aW9uKHVuc2lnbmVkIFByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICpLZXlTeW0pIGNvbnN0IG92ZXJyaWRlOworICBNQ1NlY3Rpb24gKmdldFN0YXRpY0R0b3JTZWN0aW9uKHVuc2lnbmVkIFByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICpLZXlTeW0pIGNvbnN0IG92ZXJyaWRlOworCisgIGNvbnN0IE1DRXhwciAqbG93ZXJSZWxhdGl2ZVJlZmVyZW5jZShjb25zdCBHbG9iYWxWYWx1ZSAqTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR2xvYmFsVmFsdWUgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBjb25zdCBvdmVycmlkZTsKK307CisKK2NsYXNzIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZU1hY2hPIDogcHVibGljIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZSB7CitwdWJsaWM6CisgIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZU1hY2hPKCk7CisgIH5UYXJnZXRMb3dlcmluZ09iamVjdEZpbGVNYWNoTygpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICB2b2lkIEluaXRpYWxpemUoTUNDb250ZXh0ICZDdHgsIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBvdmVycmlkZTsKKworICAvLy8gRW1pdCB0aGUgbW9kdWxlIGZsYWdzIHRoYXQgc3BlY2lmeSB0aGUgZ2FyYmFnZSBjb2xsZWN0aW9uIGluZm9ybWF0aW9uLgorICB2b2lkIGVtaXRNb2R1bGVNZXRhZGF0YShNQ1N0cmVhbWVyICZTdHJlYW1lciwgTW9kdWxlICZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgTUNTZWN0aW9uICpTZWxlY3RTZWN0aW9uRm9yR2xvYmFsKGNvbnN0IEdsb2JhbE9iamVjdCAqR08sIFNlY3Rpb25LaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgTUNTZWN0aW9uICpnZXRFeHBsaWNpdFNlY3Rpb25HbG9iYWwoY29uc3QgR2xvYmFsT2JqZWN0ICpHTywgU2VjdGlvbktpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0IG92ZXJyaWRlOworCisgIE1DU2VjdGlvbiAqZ2V0U2VjdGlvbkZvckNvbnN0YW50KGNvbnN0IERhdGFMYXlvdXQgJkRMLCBTZWN0aW9uS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkFsaWduKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gVGhlIG1hY2gtbyB2ZXJzaW9uIG9mIHRoaXMgbWV0aG9kIGRlZmF1bHRzIHRvIHJldHVybmluZyBhIHN0dWIgcmVmZXJlbmNlLgorICBjb25zdCBNQ0V4cHIgKmdldFRUeXBlR2xvYmFsUmVmZXJlbmNlKGNvbnN0IEdsb2JhbFZhbHVlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFbmNvZGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTW9kdWxlSW5mbyAqTU1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU3RyZWFtZXIgJlN0cmVhbWVyKSBjb25zdCBvdmVycmlkZTsKKworICAvLyBUaGUgc3ltYm9sIHRoYXQgZ2V0cyBwYXNzZWQgdG8gLmNmaV9wZXJzb25hbGl0eS4KKyAgTUNTeW1ib2wgKmdldENGSVBlcnNvbmFsaXR5U3ltYm9sKGNvbnN0IEdsb2JhbFZhbHVlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1vZHVsZUluZm8gKk1NSSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIEdldCBNYWNoTyBQQyByZWxhdGl2ZSBHT1QgZW50cnkgcmVsb2NhdGlvbgorICBjb25zdCBNQ0V4cHIgKmdldEluZGlyZWN0U3ltVmlhR09UUENSZWwoY29uc3QgTUNTeW1ib2wgKlN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DVmFsdWUgJk1WLCBpbnQ2NF90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNb2R1bGVJbmZvICpNTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1N0cmVhbWVyICZTdHJlYW1lcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBnZXROYW1lV2l0aFByZWZpeChTbWFsbFZlY3RvckltcGw8Y2hhcj4gJk91dE5hbWUsIGNvbnN0IEdsb2JhbFZhbHVlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGVDT0ZGIDogcHVibGljIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZSB7CisgIG11dGFibGUgdW5zaWduZWQgTmV4dFVuaXF1ZUlEID0gMDsKKworcHVibGljOgorICB+VGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlQ09GRigpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICB2b2lkIEluaXRpYWxpemUoTUNDb250ZXh0ICZDdHgsIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBvdmVycmlkZTsKKyAgTUNTZWN0aW9uICpnZXRFeHBsaWNpdFNlY3Rpb25HbG9iYWwoY29uc3QgR2xvYmFsT2JqZWN0ICpHTywgU2VjdGlvbktpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0IG92ZXJyaWRlOworCisgIE1DU2VjdGlvbiAqU2VsZWN0U2VjdGlvbkZvckdsb2JhbChjb25zdCBHbG9iYWxPYmplY3QgKkdPLCBTZWN0aW9uS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgZ2V0TmFtZVdpdGhQcmVmaXgoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZPdXROYW1lLCBjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0IG92ZXJyaWRlOworCisgIE1DU2VjdGlvbiAqZ2V0U2VjdGlvbkZvckp1bXBUYWJsZShjb25zdCBGdW5jdGlvbiAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gRW1pdCBPYmotQyBnYXJiYWdlIGNvbGxlY3Rpb24gYW5kIGxpbmtlciBvcHRpb25zLgorICB2b2lkIGVtaXRNb2R1bGVNZXRhZGF0YShNQ1N0cmVhbWVyICZTdHJlYW1lciwgTW9kdWxlICZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgTUNTZWN0aW9uICpnZXRTdGF0aWNDdG9yU2VjdGlvbih1bnNpZ25lZCBQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqS2V5U3ltKSBjb25zdCBvdmVycmlkZTsKKyAgTUNTZWN0aW9uICpnZXRTdGF0aWNEdG9yU2VjdGlvbih1bnNpZ25lZCBQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqS2V5U3ltKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGVtaXRMaW5rZXJGbGFnc0Zvckdsb2JhbChyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdsb2JhbFZhbHVlICpHVikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBlbWl0TGlua2VyRmxhZ3NGb3JVc2VkKHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdsb2JhbFZhbHVlICpHVikgY29uc3Qgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGVXYXNtIDogcHVibGljIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZSB7CisgIG11dGFibGUgdW5zaWduZWQgTmV4dFVuaXF1ZUlEID0gMDsKKworcHVibGljOgorICBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGVXYXNtKCkgPSBkZWZhdWx0OworICB+VGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlV2FzbSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICBNQ1NlY3Rpb24gKmdldEV4cGxpY2l0U2VjdGlvbkdsb2JhbChjb25zdCBHbG9iYWxPYmplY3QgKkdPLCBTZWN0aW9uS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgTUNTZWN0aW9uICpTZWxlY3RTZWN0aW9uRm9yR2xvYmFsKGNvbnN0IEdsb2JhbE9iamVjdCAqR08sIFNlY3Rpb25LaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBzaG91bGRQdXRKdW1wVGFibGVJbkZ1bmN0aW9uU2VjdGlvbihib29sIFVzZXNMYWJlbERpZmZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb24gJkYpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgSW5pdGlhbGl6ZVdhc20oKTsKKyAgTUNTZWN0aW9uICpnZXRTdGF0aWNDdG9yU2VjdGlvbih1bnNpZ25lZCBQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqS2V5U3ltKSBjb25zdCBvdmVycmlkZTsKKyAgTUNTZWN0aW9uICpnZXRTdGF0aWNEdG9yU2VjdGlvbih1bnNpZ25lZCBQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqS2V5U3ltKSBjb25zdCBvdmVycmlkZTsKKworICBjb25zdCBNQ0V4cHIgKmxvd2VyUmVsYXRpdmVSZWZlcmVuY2UoY29uc3QgR2xvYmFsVmFsdWUgKkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdsb2JhbFZhbHVlICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1RBUkdFVExPV0VSSU5HT0JKRUNURklMRUlNUExfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldE9wY29kZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYXJnZXRPcGNvZGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBkOTU5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYXJnZXRPcGNvZGVzLmgKQEAgLTAsMCArMSw0MiBAQAorLy89PT0tLSBsbHZtL0NvZGVHZW4vVGFyZ2V0T3Bjb2Rlcy5oIC0gVGFyZ2V0IEluZGVwIE9wY29kZXMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgdGFyZ2V0IGluZGVwZW5kZW50IGluc3RydWN0aW9uIG9wY29kZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fVEFSR0VUT1BDT0RFU19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9UQVJHRVRPUENPREVTX0gKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gSW52YXJpYW50IG9wY29kZXM6IEFsbCBpbnN0cnVjdGlvbiBzZXRzIGhhdmUgdGhlc2UgYXMgdGhlaXIgbG93IG9wY29kZXMuCisvLy8KK25hbWVzcGFjZSBUYXJnZXRPcGNvZGUgeworZW51bSB7CisjZGVmaW5lIEhBTkRMRV9UQVJHRVRfT1BDT0RFKE9QQykgT1BDLAorI2RlZmluZSBIQU5ETEVfVEFSR0VUX09QQ09ERV9NQVJLRVIoSURFTlQsIE9QQykgSURFTlQgPSBPUEMsCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1RhcmdldE9wY29kZXMuZGVmIgorfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBUYXJnZXRPcGNvZGUKKworLy8vIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIE9wY29kZSBpcyBhIGdlbmVyaWMgb3Bjb2RlIHRoYXQgaXMgbm90IHN1cHBvc2VkCisvLy8gdG8gYXBwZWFyIGFmdGVyIElTZWwuCitpbmxpbmUgYm9vbCBpc1ByZUlTZWxHZW5lcmljT3Bjb2RlKHVuc2lnbmVkIE9wY29kZSkgeworICByZXR1cm4gT3Bjb2RlID49IFRhcmdldE9wY29kZTo6UFJFX0lTRUxfR0VORVJJQ19PUENPREVfU1RBUlQgJiYKKyAgICAgICAgIE9wY29kZSA8PSBUYXJnZXRPcGNvZGU6OlBSRV9JU0VMX0dFTkVSSUNfT1BDT0RFX0VORDsKK30KKworLy8vIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIE9wY29kZSBpcyBhIHRhcmdldC1zcGVjaWZpYyBvcGNvZGUuCitpbmxpbmUgYm9vbCBpc1RhcmdldFNwZWNpZmljT3Bjb2RlKHVuc2lnbmVkIE9wY29kZSkgeworICByZXR1cm4gT3Bjb2RlID4gVGFyZ2V0T3Bjb2RlOjpQUkVfSVNFTF9HRU5FUklDX09QQ09ERV9FTkQ7Cit9Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYXJnZXRQYXNzQ29uZmlnLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVGFyZ2V0UGFzc0NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5MThjNTIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVGFyZ2V0UGFzc0NvbmZpZy5oCkBAIC0wLDAgKzEsNDMzIEBACisvLz09PS0gVGFyZ2V0UGFzc0NvbmZpZy5oIC0gQ29kZSBHZW5lcmF0aW9uIHBhc3Mgb3B0aW9ucyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBUYXJnZXQtSW5kZXBlbmRlbnQgQ29kZSBHZW5lcmF0b3IgUGFzcyBDb25maWd1cmF0aW9uIE9wdGlvbnMgcGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9UQVJHRVRQQVNTQ09ORklHX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1RBUkdFVFBBU1NDT05GSUdfSAorCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvZGVHZW4uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PiAKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTExWTVRhcmdldE1hY2hpbmU7CitzdHJ1Y3QgTWFjaGluZVNjaGVkQ29udGV4dDsKK2NsYXNzIFBhc3NDb25maWdJbXBsOworY2xhc3MgU2NoZWR1bGVEQUdJbnN0cnM7CisKKy8vIFRoZSBvbGQgcGFzcyBtYW5hZ2VyIGluZnJhc3RydWN0dXJlIGlzIGhpZGRlbiBpbiBhIGxlZ2FjeSBuYW1lc3BhY2Ugbm93LgorbmFtZXNwYWNlIGxlZ2FjeSB7CisKK2NsYXNzIFBhc3NNYW5hZ2VyQmFzZTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxlZ2FjeQorCit1c2luZyBsZWdhY3k6OlBhc3NNYW5hZ2VyQmFzZTsKKworLy8vIERpc2NyaW1pbmF0ZWQgdW5pb24gb2YgUGFzcyBJRCB0eXBlcy4KKy8vLworLy8vIFRoZSBQYXNzQ29uZmlnIEFQSSBwcmVmZXJzIGRlYWxpbmcgd2l0aCBJRHMgYmVjYXVzZSB0aGV5IGFyZSBzYWZlciBhbmQgbW9yZQorLy8vIGVmZmljaWVudC4gSURzIGRlY291cGxlIGNvbmZpZ3VyYXRpb24gZnJvbSBpbnN0YW50aWF0aW9uLiBUaGlzIHdheSwgd2hlbiBhCisvLy8gcGFzcyBpcyBvdmVycmlkZW4sIGl0IGlzbid0IHVubmVjZXNzYXJpbHkgaW5zdGFudGlhdGVkLiBJdCBpcyBhbHNvIHVuc2FmZSB0bworLy8vIHJlZmVyIHRvIGEgUGFzcyBwb2ludGVyIGFmdGVyIGFkZGluZyBpdCB0byBhIHBhc3MgbWFuYWdlciwgd2hpY2ggZGVsZXRlcworLy8vIHJlZHVuZGFudCBwYXNzIGluc3RhbmNlcy4KKy8vLworLy8vIEhvd2V2ZXIsIGl0IGlzIGNvbnZpZW50IHRvIGRpcmVjdGx5IGluc3RhbnRpYXRlIHRhcmdldCBwYXNzZXMgd2l0aAorLy8vIG5vbi1kZWZhdWx0IGN0b3JzLiBUaGVzZSBvZnRlbiBkb24ndCBoYXZlIGEgcmVnaXN0ZXJlZCBQYXNzSW5mby4gUmF0aGVyIHRoYW4KKy8vLyBmb3JjZSBhbGwgdGFyZ2V0IHBhc3NlcyB0byBpbXBsZW1lbnQgdGhlIHBhc3MgcmVnaXN0cnkgYm9pbGVycGxhdGUsIGFsbG93CisvLy8gdGhlIFBhc3NDb25maWcgQVBJIHRvIGhhbmRsZSBlaXRoZXIgdHlwZS4KKy8vLworLy8vIEFuYWx5c2lzSUQgaXMgc2FkbHkgY2hhciosIHNvIFBvaW50ZXJJbnRQYWlyIHdvbid0IHdvcmsuCitjbGFzcyBJZGVudGlmeWluZ1Bhc3NQdHIgeworICB1bmlvbiB7CisgICAgQW5hbHlzaXNJRCBJRDsKKyAgICBQYXNzICpQOworICB9OworICBib29sIElzSW5zdGFuY2UgPSBmYWxzZTsKKworcHVibGljOgorICBJZGVudGlmeWluZ1Bhc3NQdHIoKSA6IFAobnVsbHB0cikge30KKyAgSWRlbnRpZnlpbmdQYXNzUHRyKEFuYWx5c2lzSUQgSURQdHIpIDogSUQoSURQdHIpIHt9CisgIElkZW50aWZ5aW5nUGFzc1B0cihQYXNzICpJbnN0YW5jZVB0cikgOiBQKEluc3RhbmNlUHRyKSwgSXNJbnN0YW5jZSh0cnVlKSB7fQorCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIFA7IH0KKyAgYm9vbCBpc0luc3RhbmNlKCkgY29uc3QgeyByZXR1cm4gSXNJbnN0YW5jZTsgfQorCisgIEFuYWx5c2lzSUQgZ2V0SUQoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFJc0luc3RhbmNlICYmICJOb3QgYSBQYXNzIElEIik7CisgICAgcmV0dXJuIElEOworICB9CisKKyAgUGFzcyAqZ2V0SW5zdGFuY2UoKSBjb25zdCB7CisgICAgYXNzZXJ0KElzSW5zdGFuY2UgJiYgIk5vdCBhIFBhc3MgSW5zdGFuY2UiKTsKKyAgICByZXR1cm4gUDsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlzUG9kTGlrZTxJZGVudGlmeWluZ1Bhc3NQdHI+IHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworfTsKKworLy8vIFRhcmdldC1JbmRlcGVuZGVudCBDb2RlIEdlbmVyYXRvciBQYXNzIENvbmZpZ3VyYXRpb24gT3B0aW9ucy4KKy8vLworLy8vIFRoaXMgaXMgYW4gSW1tdXRhYmxlUGFzcyBzb2xlbHkgZm9yIHRoZSBwdXJwb3NlIG9mIGV4cG9zaW5nIENvZGVHZW4gb3B0aW9ucworLy8vIHRvIHRoZSBpbnRlcm5hbHMgb2Ygb3RoZXIgQ29kZUdlbiBwYXNzZXMuCitjbGFzcyBUYXJnZXRQYXNzQ29uZmlnIDogcHVibGljIEltbXV0YWJsZVBhc3MgeworcHJpdmF0ZToKKyAgUGFzc01hbmFnZXJCYXNlICpQTSA9IG51bGxwdHI7CisgIEFuYWx5c2lzSUQgU3RhcnRCZWZvcmUgPSBudWxscHRyOworICBBbmFseXNpc0lEIFN0YXJ0QWZ0ZXIgPSBudWxscHRyOworICBBbmFseXNpc0lEIFN0b3BCZWZvcmUgPSBudWxscHRyOworICBBbmFseXNpc0lEIFN0b3BBZnRlciA9IG51bGxwdHI7CisgIGJvb2wgU3RhcnRlZCA9IHRydWU7CisgIGJvb2wgU3RvcHBlZCA9IGZhbHNlOworICBib29sIEFkZGluZ01hY2hpbmVQYXNzZXMgPSBmYWxzZTsKKworICAvLy8gU2V0IHRoZSBTdGFydEFmdGVyLCBTdGFydEJlZm9yZSBhbmQgU3RvcEFmdGVyIHBhc3NlcyB0byBhbGxvdyBydW5uaW5nIG9ubHkKKyAgLy8vIGEgcG9ydGlvbiBvZiB0aGUgbm9ybWFsIGNvZGUtZ2VuIHBhc3Mgc2VxdWVuY2UuCisgIC8vLworICAvLy8gSWYgdGhlIFN0YXJ0QWZ0ZXIgYW5kIFN0YXJ0QmVmb3JlIHBhc3MgSUQgaXMgemVybywgdGhlbiBjb21waWxhdGlvbiB3aWxsCisgIC8vLyBiZWdpbiBhdCB0aGUgbm9ybWFsIHBvaW50OyBvdGhlcndpc2UsIGNsZWFyIHRoZSBTdGFydGVkIGZsYWcgdG8gaW5kaWNhdGUKKyAgLy8vIHRoYXQgcGFzc2VzIHNob3VsZCBub3QgYmUgYWRkZWQgdW50aWwgdGhlIHN0YXJ0aW5nIHBhc3MgaXMgc2Vlbi4gIElmIHRoZQorICAvLy8gU3RvcCBwYXNzIElEIGlzIHplcm8sIHRoZW4gY29tcGlsYXRpb24gd2lsbCBjb250aW51ZSB0byB0aGUgZW5kLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0aGF0IGF0IGxlYXN0IG9uZSBvZiB0aGUgU3RhcnRBZnRlciBvciB0aGUKKyAgLy8vIFN0YXJ0QmVmb3JlIHBhc3MgSURzIGlzIG51bGwuCisgIHZvaWQgc2V0U3RhcnRTdG9wUGFzc2VzKCk7CisKK3Byb3RlY3RlZDoKKyAgTExWTVRhcmdldE1hY2hpbmUgKlRNOworICBQYXNzQ29uZmlnSW1wbCAqSW1wbCA9IG51bGxwdHI7IC8vIEludGVybmFsIGRhdGEgc3RydWN0dXJlcworICBib29sIEluaXRpYWxpemVkID0gZmFsc2U7IC8vIEZsYWdnZWQgYWZ0ZXIgYWxsIHBhc3NlcyBhcmUgY29uZmlndXJlZC4KKworICAvLyBUYXJnZXQgUGFzcyBPcHRpb25zCisgIC8vIFRhcmdldHMgcHJvdmlkZSBhIGRlZmF1bHQgc2V0dGluZywgdXNlciBmbGFncyBvdmVycmlkZS4KKyAgYm9vbCBEaXNhYmxlVmVyaWZ5ID0gZmFsc2U7CisKKyAgLy8vIERlZmF1bHQgc2V0dGluZyBmb3IgLWVuYWJsZS10YWlsLW1lcmdlIG9uIHRoaXMgdGFyZ2V0LgorICBib29sIEVuYWJsZVRhaWxNZXJnZSA9IHRydWU7CisKKyAgLy8vIFJlcXVpcmUgcHJvY2Vzc2luZyBvZiBmdW5jdGlvbnMgc3VjaCB0aGF0IGNhbGxlZXMgYXJlIGdlbmVyYXRlZCBiZWZvcmUKKyAgLy8vIGNhbGxlcnMuCisgIGJvb2wgUmVxdWlyZUNvZGVHZW5TQ0NPcmRlciA9IGZhbHNlOworCisgIC8vLyBBZGQgdGhlIGFjdHVhbCBpbnN0cnVjdGlvbiBzZWxlY3Rpb24gcGFzc2VzLiBUaGlzIGRvZXMgbm90IGluY2x1ZGUKKyAgLy8vIHByZXBhcmF0aW9uIHBhc3NlcyBvbiBJUi4KKyAgYm9vbCBhZGRDb3JlSVNlbFBhc3NlcygpOworCitwdWJsaWM6CisgIFRhcmdldFBhc3NDb25maWcoTExWTVRhcmdldE1hY2hpbmUgJlRNLCBQYXNzTWFuYWdlckJhc2UgJnBtKTsKKyAgLy8gRHVtbXkgY29uc3RydWN0b3IuCisgIFRhcmdldFBhc3NDb25maWcoKTsKKworICB+VGFyZ2V0UGFzc0NvbmZpZygpIG92ZXJyaWRlOworCisgIHN0YXRpYyBjaGFyIElEOworCisgIC8vLyBHZXQgdGhlIHJpZ2h0IHR5cGUgb2YgVGFyZ2V0TWFjaGluZSBmb3IgdGhpcyB0YXJnZXQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFRNQz4gVE1DICZnZXRUTSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKnN0YXRpY19jYXN0PFRNQyo+KFRNKTsKKyAgfQorCisgIC8vCisgIHZvaWQgc2V0SW5pdGlhbGl6ZWQoKSB7IEluaXRpYWxpemVkID0gdHJ1ZTsgfQorCisgIENvZGVHZW5PcHQ6OkxldmVsIGdldE9wdExldmVsKCkgY29uc3Q7CisKKyAgLy8vIERlc2NyaWJlIHRoZSBzdGF0dXMgb2YgdGhlIGNvZGVnZW4KKyAgLy8vIHBpcGVsaW5lIHNldCBieSB0aGlzIHRhcmdldCBwYXNzIGNvbmZpZy4KKyAgLy8vIEhhdmluZyBhIGxpbWl0ZWQgY29kZWdlbiBwaXBlbGluZSBtZWFucyB0aGF0IG9wdGlvbnMKKyAgLy8vIGhhdmUgYmVlbiB1c2VkIHRvIHJlc3RyaWN0IHdoYXQgY29kZWdlbiBpcyBkb2luZy4KKyAgLy8vIEluIHBhcnRpY3VsYXIsIHRoYXQgbWVhbnMgdGhhdCBjb2RlZ2VuIHdvbid0IGVtaXQKKyAgLy8vIGFzc2VtYmx5IGNvZGUuCisgIGJvb2wgaGFzTGltaXRlZENvZGVHZW5QaXBlbGluZSgpIGNvbnN0OworCisgIC8vLyBJZiBoYXNMaW1pdGVkQ29kZUdlblBpcGVsaW5lIGlzIHRydWUsIHRoaXMgbWV0aG9kCisgIC8vLyByZXR1cm5zIGEgc3RyaW5nIHdpdGggdGhlIG5hbWUgb2YgdGhlIG9wdGlvbnMsIHNlcGFyYXRlZAorICAvLy8gYnkgXHAgU2VwYXJhdG9yIHRoYXQgY2F1c2VkIHRoaXMgcGlwZWxpbmUgdG8gYmUgbGltaXRlZC4KKyAgc3RkOjpzdHJpbmcKKyAgZ2V0TGltaXRlZENvZGVHZW5QaXBlbGluZVJlYXNvbihjb25zdCBjaGFyICpTZXBhcmF0b3IgPSAiLyIpIGNvbnN0OworCisgIC8vLyBDaGVjayBpZiB0aGUgY29kZWdlbiBwaXBlbGluZSBpcyBsaW1pdGVkIGluIHN1Y2ggYSB3YXkgdGhhdCBpdAorICAvLy8gd29uJ3QgYmUgY29tcGxldGUuIFdoZW4gdGhlIGNvZGVnZW4gcGlwZWxpbmUgaXMgbm90IGNvbXBsZXRlLAorICAvLy8gdGhpcyBtZWFucyBpdCBtYXkgbm90IGJlIHBvc3NpYmxlIHRvIGdlbmVyYXRlIGFzc2VtYmx5IGZyb20gaXQuCisgIGJvb2wgd2lsbENvbXBsZXRlQ29kZUdlblBpcGVsaW5lKCkgY29uc3QgeworICAgIHJldHVybiAhaGFzTGltaXRlZENvZGVHZW5QaXBlbGluZSgpIHx8ICghU3RvcEFmdGVyICYmICFTdG9wQmVmb3JlKTsKKyAgfQorCisgIHZvaWQgc2V0RGlzYWJsZVZlcmlmeShib29sIERpc2FibGUpIHsgc2V0T3B0KERpc2FibGVWZXJpZnksIERpc2FibGUpOyB9CisKKyAgYm9vbCBnZXRFbmFibGVUYWlsTWVyZ2UoKSBjb25zdCB7IHJldHVybiBFbmFibGVUYWlsTWVyZ2U7IH0KKyAgdm9pZCBzZXRFbmFibGVUYWlsTWVyZ2UoYm9vbCBFbmFibGUpIHsgc2V0T3B0KEVuYWJsZVRhaWxNZXJnZSwgRW5hYmxlKTsgfQorCisgIGJvb2wgcmVxdWlyZXNDb2RlR2VuU0NDT3JkZXIoKSBjb25zdCB7IHJldHVybiBSZXF1aXJlQ29kZUdlblNDQ09yZGVyOyB9CisgIHZvaWQgc2V0UmVxdWlyZXNDb2RlR2VuU0NDT3JkZXIoYm9vbCBFbmFibGUgPSB0cnVlKSB7CisgICAgc2V0T3B0KFJlcXVpcmVDb2RlR2VuU0NDT3JkZXIsIEVuYWJsZSk7CisgIH0KKworICAvLy8gQWxsb3cgdGhlIHRhcmdldCB0byBvdmVycmlkZSBhIHNwZWNpZmljIHBhc3Mgd2l0aG91dCBvdmVycmlkaW5nIHRoZSBwYXNzCisgIC8vLyBwaXBlbGluZS4gV2hlbiBwYXNzZXMgYXJlIGFkZGVkIHRvIHRoZSBzdGFuZGFyZCBwaXBlbGluZSBhdCB0aGUKKyAgLy8vIHBvaW50IHdoZXJlIFN0YW5kYXJkSUQgaXMgZXhwZWN0ZWQsIGFkZCBUYXJnZXRJRCBpbiBpdHMgcGxhY2UuCisgIHZvaWQgc3Vic3RpdHV0ZVBhc3MoQW5hbHlzaXNJRCBTdGFuZGFyZElELCBJZGVudGlmeWluZ1Bhc3NQdHIgVGFyZ2V0SUQpOworCisgIC8vLyBJbnNlcnQgSW5zZXJ0ZWRQYXNzSUQgcGFzcyBhZnRlciBUYXJnZXRQYXNzSUQgcGFzcy4KKyAgdm9pZCBpbnNlcnRQYXNzKEFuYWx5c2lzSUQgVGFyZ2V0UGFzc0lELCBJZGVudGlmeWluZ1Bhc3NQdHIgSW5zZXJ0ZWRQYXNzSUQsCisgICAgICAgICAgICAgICAgICBib29sIFZlcmlmeUFmdGVyID0gdHJ1ZSwgYm9vbCBQcmludEFmdGVyID0gdHJ1ZSk7CisKKyAgLy8vIEFsbG93IHRoZSB0YXJnZXQgdG8gZW5hYmxlIGEgc3BlY2lmaWMgc3RhbmRhcmQgcGFzcyBieSBkZWZhdWx0LgorICB2b2lkIGVuYWJsZVBhc3MoQW5hbHlzaXNJRCBQYXNzSUQpIHsgc3Vic3RpdHV0ZVBhc3MoUGFzc0lELCBQYXNzSUQpOyB9CisKKyAgLy8vIEFsbG93IHRoZSB0YXJnZXQgdG8gZGlzYWJsZSBhIHNwZWNpZmljIHN0YW5kYXJkIHBhc3MgYnkgZGVmYXVsdC4KKyAgdm9pZCBkaXNhYmxlUGFzcyhBbmFseXNpc0lEIFBhc3NJRCkgeworICAgIHN1YnN0aXR1dGVQYXNzKFBhc3NJRCwgSWRlbnRpZnlpbmdQYXNzUHRyKCkpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgcGFzcyBzdWJzdGl0dXRlZCBmb3IgU3RhbmRhcmRJRCBieSB0aGUgdGFyZ2V0LgorICAvLy8gSWYgbm8gc3Vic3RpdHV0aW9uIGV4aXN0cywgcmV0dXJuIFN0YW5kYXJkSUQuCisgIElkZW50aWZ5aW5nUGFzc1B0ciBnZXRQYXNzU3Vic3RpdHV0aW9uKEFuYWx5c2lzSUQgU3RhbmRhcmRJRCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBwYXNzIGhhcyBiZWVuIHN1YnN0aXR1dGVkIGJ5IHRoZSB0YXJnZXQgb3IKKyAgLy8vIG92ZXJyaWRkZW4gb24gdGhlIGNvbW1hbmQgbGluZS4KKyAgYm9vbCBpc1Bhc3NTdWJzdGl0dXRlZE9yT3ZlcnJpZGRlbihBbmFseXNpc0lEIElEKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIG9wdGltaXplZCByZWdhbGxvYyBwaXBlbGluZSBpcyBlbmFibGVkLgorICBib29sIGdldE9wdGltaXplUmVnQWxsb2MoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGRlZmF1bHQgZ2xvYmFsIHJlZ2lzdGVyIGFsbG9jYXRvciBpcyBpbiB1c2UgYW5kCisgIC8vLyBoYXMgbm90IGJlIG92ZXJyaWRlbiBvbiB0aGUgY29tbWFuZCBsaW5lIHdpdGggJy1yZWdhbGxvYz0uLi4nCisgIGJvb2wgdXNpbmdEZWZhdWx0UmVnQWxsb2MoKSBjb25zdDsKKworICAvLy8gSGlnaCBsZXZlbCBmdW5jdGlvbiB0aGF0IGFkZHMgYWxsIHBhc3NlcyBuZWNlc3NhcnkgdG8gZ28gZnJvbSBsbHZtIElSCisgIC8vLyByZXByZXNlbnRhdGlvbiB0byB0aGUgTUkgcmVwcmVzZW50YXRpb24uCisgIC8vLyBBZGRzIElSIGJhc2VkIGxvd2VyaW5nIGFuZCB0YXJnZXQgc3BlY2lmaWMgb3B0aW1pemF0aW9uIHBhc3NlcyBhbmQgZmluYWxseQorICAvLy8gdGhlIGNvcmUgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIHBhc3Nlcy4KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBhZGRJU2VsUGFzc2VzKCk7CisKKyAgLy8vIEFkZCBjb21tb24gdGFyZ2V0IGNvbmZpZ3VyYWJsZSBwYXNzZXMgdGhhdCBwZXJmb3JtIExMVk0gSVIgdG8gSVIKKyAgLy8vIHRyYW5zZm9ybXMgZm9sbG93aW5nIG1hY2hpbmUgaW5kZXBlbmRlbnQgb3B0aW1pemF0aW9uLgorICB2aXJ0dWFsIHZvaWQgYWRkSVJQYXNzZXMoKTsKKworICAvLy8gQWRkIHBhc3NlcyB0byBsb3dlciBleGNlcHRpb24gaGFuZGxpbmcgZm9yIHRoZSBjb2RlIGdlbmVyYXRvci4KKyAgdm9pZCBhZGRQYXNzZXNUb0hhbmRsZUV4Y2VwdGlvbnMoKTsKKworICAvLy8gQWRkIHBhc3MgdG8gcHJlcGFyZSB0aGUgTExWTSBJUiBmb3IgY29kZSBnZW5lcmF0aW9uLiBUaGlzIHNob3VsZCBiZSBkb25lCisgIC8vLyBiZWZvcmUgZXhjZXB0aW9uIGhhbmRsaW5nIHByZXBhcmF0aW9uIHBhc3Nlcy4KKyAgdmlydHVhbCB2b2lkIGFkZENvZGVHZW5QcmVwYXJlKCk7CisKKyAgLy8vIEFkZCBjb21tb24gcGFzc2VzIHRoYXQgcGVyZm9ybSBMTFZNIElSIHRvIElSIHRyYW5zZm9ybXMgaW4gcHJlcGFyYXRpb24gZm9yCisgIC8vLyBpbnN0cnVjdGlvbiBzZWxlY3Rpb24uCisgIHZpcnR1YWwgdm9pZCBhZGRJU2VsUHJlcGFyZSgpOworCisgIC8vLyBhZGRJbnN0U2VsZWN0b3IgLSBUaGlzIG1ldGhvZCBzaG91bGQgaW5zdGFsbCBhbiBpbnN0cnVjdGlvbiBzZWxlY3RvciBwYXNzLAorICAvLy8gd2hpY2ggY29udmVydHMgZnJvbSBMTFZNIGNvZGUgdG8gbWFjaGluZSBpbnN0cnVjdGlvbnMuCisgIHZpcnR1YWwgYm9vbCBhZGRJbnN0U2VsZWN0b3IoKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGluc3RhbGwgYW4gSVIgdHJhbnNsYXRvciBwYXNzLCB3aGljaCBjb252ZXJ0cyBmcm9tCisgIC8vLyBMTFZNIGNvZGUgdG8gbWFjaGluZSBpbnN0cnVjdGlvbnMgd2l0aCBwb3NzaWJseSBnZW5lcmljIG9wY29kZXMuCisgIHZpcnR1YWwgYm9vbCBhZGRJUlRyYW5zbGF0b3IoKSB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIG1heSBiZSBpbXBsZW1lbnRlZCBieSB0YXJnZXRzIHRoYXQgd2FudCB0byBydW4gcGFzc2VzCisgIC8vLyBpbW1lZGlhdGVseSBiZWZvcmUgbGVnYWxpemF0aW9uLgorICB2aXJ0dWFsIHZvaWQgYWRkUHJlTGVnYWxpemVNYWNoaW5lSVIoKSB7fQorCisgIC8vLyBUaGlzIG1ldGhvZCBzaG91bGQgaW5zdGFsbCBhIGxlZ2FsaXplIHBhc3MsIHdoaWNoIGNvbnZlcnRzIHRoZSBpbnN0cnVjdGlvbgorICAvLy8gc2VxdWVuY2UgaW50byBvbmUgdGhhdCBjYW4gYmUgc2VsZWN0ZWQgYnkgdGhlIHRhcmdldC4KKyAgdmlydHVhbCBib29sIGFkZExlZ2FsaXplTWFjaGluZUlSKCkgeyByZXR1cm4gdHJ1ZTsgfQorCisgIC8vLyBUaGlzIG1ldGhvZCBtYXkgYmUgaW1wbGVtZW50ZWQgYnkgdGFyZ2V0cyB0aGF0IHdhbnQgdG8gcnVuIHBhc3NlcworICAvLy8gaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSByZWdpc3RlciBiYW5rIHNlbGVjdGlvbi4KKyAgdmlydHVhbCB2b2lkIGFkZFByZVJlZ0JhbmtTZWxlY3QoKSB7fQorCisgIC8vLyBUaGlzIG1ldGhvZCBzaG91bGQgaW5zdGFsbCBhIHJlZ2lzdGVyIGJhbmsgc2VsZWN0b3IgcGFzcywgd2hpY2gKKyAgLy8vIGFzc2lnbnMgcmVnaXN0ZXIgYmFua3MgdG8gdmlydHVhbCByZWdpc3RlcnMgd2l0aG91dCBhIHJlZ2lzdGVyCisgIC8vLyBjbGFzcyBvciByZWdpc3RlciBiYW5rcy4KKyAgdmlydHVhbCBib29sIGFkZFJlZ0JhbmtTZWxlY3QoKSB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIG1heSBiZSBpbXBsZW1lbnRlZCBieSB0YXJnZXRzIHRoYXQgd2FudCB0byBydW4gcGFzc2VzCisgIC8vLyBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIChnbG9iYWwpIGluc3RydWN0aW9uIHNlbGVjdGlvbi4KKyAgdmlydHVhbCB2b2lkIGFkZFByZUdsb2JhbEluc3RydWN0aW9uU2VsZWN0KCkge30KKworICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIGluc3RhbGwgYSAoZ2xvYmFsKSBpbnN0cnVjdGlvbiBzZWxlY3RvciBwYXNzLCB3aGljaAorICAvLy8gY29udmVydHMgcG9zc2libHkgZ2VuZXJpYyBpbnN0cnVjdGlvbnMgdG8gZnVsbHkgdGFyZ2V0LXNwZWNpZmljCisgIC8vLyBpbnN0cnVjdGlvbnMsIHRoZXJlYnkgY29uc3RyYWluaW5nIGFsbCBnZW5lcmljIHZpcnR1YWwgcmVnaXN0ZXJzIHRvCisgIC8vLyByZWdpc3RlciBjbGFzc2VzLgorICB2aXJ0dWFsIGJvb2wgYWRkR2xvYmFsSW5zdHJ1Y3Rpb25TZWxlY3QoKSB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8vIEFkZCB0aGUgY29tcGxldGUsIHN0YW5kYXJkIHNldCBvZiBMTFZNIENvZGVHZW4gcGFzc2VzLgorICAvLy8gRnVsbHkgZGV2ZWxvcGVkIHRhcmdldHMgd2lsbCBub3QgZ2VuZXJhbGx5IG92ZXJyaWRlIHRoaXMuCisgIHZpcnR1YWwgdm9pZCBhZGRNYWNoaW5lUGFzc2VzKCk7CisKKyAgLy8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBTY2hlZHVsZURBR0luc3RycyB0byBiZSBydW4gd2l0aGluIHRoZSBzdGFuZGFyZAorICAvLy8gTWFjaGluZVNjaGVkdWxlciBwYXNzIGZvciB0aGlzIGZ1bmN0aW9uIGFuZCB0YXJnZXQgYXQgdGhlIGN1cnJlbnQKKyAgLy8vIG9wdGltaXphdGlvbiBsZXZlbC4KKyAgLy8vCisgIC8vLyBUaGlzIGNhbiBhbHNvIGJlIHVzZWQgdG8gcGx1ZyBhIG5ldyBNYWNoaW5lU2NoZWRTdHJhdGVneSBpbnRvIGFuIGluc3RhbmNlCisgIC8vLyBvZiB0aGUgc3RhbmRhcmQgU2NoZWR1bGVEQUdNSToKKyAgLy8vICAgcmV0dXJuIG5ldyBTY2hlZHVsZURBR01JKEMsIG1ha2VfdW5pcXVlPE15U3RyYXRlZ3k+KEMpLCAvKlJlbW92ZUtpbGxGbGFncz0qL2ZhbHNlKQorICAvLy8KKyAgLy8vIFJldHVybiBOVUxMIHRvIHNlbGVjdCB0aGUgZGVmYXVsdCAoZ2VuZXJpYykgbWFjaGluZSBzY2hlZHVsZXIuCisgIHZpcnR1YWwgU2NoZWR1bGVEQUdJbnN0cnMgKgorICBjcmVhdGVNYWNoaW5lU2NoZWR1bGVyKE1hY2hpbmVTY2hlZENvbnRleHQgKkMpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBTaW1pbGFyIHRvIGNyZWF0ZU1hY2hpbmVTY2hlZHVsZXIgYnV0IHVzZWQgd2hlbiBwb3N0UkEgbWFjaGluZSBzY2hlZHVsaW5nCisgIC8vLyBpcyBlbmFibGVkLgorICB2aXJ0dWFsIFNjaGVkdWxlREFHSW5zdHJzICoKKyAgY3JlYXRlUG9zdE1hY2hpbmVTY2hlZHVsZXIoTWFjaGluZVNjaGVkQ29udGV4dCAqQykgY29uc3QgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIHByaW50QW5kVmVyaWZ5IC0gQWRkIGEgcGFzcyB0byBkdW1wIHRoZW4gdmVyaWZ5IHRoZSBtYWNoaW5lIGZ1bmN0aW9uLCBpZgorICAvLy8gdGhvc2Ugc3RlcHMgYXJlIGVuYWJsZWQuCisgIHZvaWQgcHJpbnRBbmRWZXJpZnkoY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lcik7CisKKyAgLy8vIEFkZCBhIHBhc3MgdG8gcHJpbnQgdGhlIG1hY2hpbmUgZnVuY3Rpb24gaWYgcHJpbnRpbmcgaXMgZW5hYmxlZC4KKyAgdm9pZCBhZGRQcmludFBhc3MoY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lcik7CisKKyAgLy8vIEFkZCBhIHBhc3MgdG8gcGVyZm9ybSBiYXNpYyB2ZXJpZmljYXRpb24gb2YgdGhlIG1hY2hpbmUgZnVuY3Rpb24gaWYKKyAgLy8vIHZlcmlmaWNhdGlvbiBpcyBlbmFibGVkLgorICB2b2lkIGFkZFZlcmlmeVBhc3MoY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lcik7CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgb3Igbm90IEdsb2JhbElTZWwgc2hvdWxkIGFib3J0IG9uIGVycm9yLgorICAvLy8gV2hlbiB0aGlzIGlzIGRpc2FibGVkLCBHbG9iYWxJU2VsIHdpbGwgZmFsbCBiYWNrIG9uIFNESVNlbCBpbnN0ZWFkIG9mCisgIC8vLyBlcnJvcmluZyBvdXQuCisgIGJvb2wgaXNHbG9iYWxJU2VsQWJvcnRFbmFibGVkKCkgY29uc3Q7CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgb3Igbm90IGEgZGlhZ25vc3RpYyBzaG91bGQgYmUgZW1pdHRlZCB3aGVuIEdsb2JhbElTZWwKKyAgLy8vIHVzZXMgdGhlIGZhbGxiYWNrIHBhdGguIEluIG90aGVyIHdvcmRzLCBpdCB3aWxsIGVtaXQgYSBkaWFnbm9zdGljCisgIC8vLyB3aGVuIEdsb2JhbElTZWwgZmFpbGVkIGFuZCBpc0dsb2JhbElTZWxBYm9ydEVuYWJsZWQgaXMgZmFsc2UuCisgIHZpcnR1YWwgYm9vbCByZXBvcnREaWFnbm9zdGljV2hlbkdsb2JhbElTZWxGYWxsYmFjaygpIGNvbnN0OworCitwcm90ZWN0ZWQ6CisgIC8vIEhlbHBlciB0byB2ZXJpZnkgdGhlIGFuYWx5c2lzIGlzIHJlYWxseSBpbW11dGFibGUuCisgIHZvaWQgc2V0T3B0KGJvb2wgJk9wdCwgYm9vbCBWYWwpOworCisgIC8vLyBNZXRob2RzIHdpdGggdHJpdmlhbCBpbmxpbmUgcmV0dXJucyBhcmUgY29udmVuaWVudCBwb2ludHMgaW4gdGhlIGNvbW1vbgorICAvLy8gY29kZWdlbiBwYXNzIHBpcGVsaW5lIHdoZXJlIHRhcmdldHMgbWF5IGluc2VydCBwYXNzZXMuIE1ldGhvZHMgd2l0aAorICAvLy8gb3V0LW9mLWxpbmUgc3RhbmRhcmQgaW1wbGVtZW50YXRpb25zIGFyZSBtYWpvciBDb2RlR2VuIHN0YWdlcyBjYWxsZWQgYnkKKyAgLy8vIGFkZE1hY2hpbmVQYXNzZXMuIFNvbWUgdGFyZ2V0cyBtYXkgb3ZlcnJpZGUgbWFqb3Igc3RhZ2VzIHdoZW4gaW5zZXJ0aW5nCisgIC8vLyBwYXNzZXMgaXMgaW5zdWZmaWNpZW50LCBidXQgbWFpbnRhaW5pbmcgb3ZlcnJpZGVuIHN0YWdlcyBpcyBtb3JlIHdvcmsuCisgIC8vLworCisgIC8vLyBhZGRQcmVJU2VsUGFzc2VzIC0gVGhpcyBtZXRob2Qgc2hvdWxkIGFkZCBhbnkgImxhc3QgbWludXRlIiBMTFZNLT5MTFZNCisgIC8vLyBwYXNzZXMgKHdoaWNoIGFyZSBydW4ganVzdCBiZWZvcmUgaW5zdHJ1Y3Rpb24gc2VsZWN0b3IpLgorICB2aXJ0dWFsIGJvb2wgYWRkUHJlSVNlbCgpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBhZGRNYWNoaW5lU1NBT3B0aW1pemF0aW9uIC0gQWRkIHN0YW5kYXJkIHBhc3NlcyB0aGF0IG9wdGltaXplIG1hY2hpbmUKKyAgLy8vIGluc3RydWN0aW9ucyBpbiBTU0EgZm9ybS4KKyAgdmlydHVhbCB2b2lkIGFkZE1hY2hpbmVTU0FPcHRpbWl6YXRpb24oKTsKKworICAvLy8gQWRkIHBhc3NlcyB0aGF0IG9wdGltaXplIGluc3RydWN0aW9uIGxldmVsIHBhcmFsbGVsaXNtIGZvciBvdXQtb2Ytb3JkZXIKKyAgLy8vIHRhcmdldHMuIFRoZXNlIHBhc3NlcyBhcmUgcnVuIHdoaWxlIHRoZSBtYWNoaW5lIGNvZGUgaXMgc3RpbGwgaW4gU1NBCisgIC8vLyBmb3JtLCBzbyB0aGV5IGNhbiB1c2UgTWFjaGluZVRyYWNlTWV0cmljcyB0byBjb250cm9sIHRoZWlyIGhldXJpc3RpY3MuCisgIC8vLworICAvLy8gQWxsIHBhc3NlcyBhZGRlZCBoZXJlIHNob3VsZCBwcmVzZXJ2ZSB0aGUgTWFjaGluZURvbWluYXRvclRyZWUsCisgIC8vLyBNYWNoaW5lTG9vcEluZm8sIGFuZCBNYWNoaW5lVHJhY2VNZXRyaWNzIGFuYWx5c2VzLgorICB2aXJ0dWFsIGJvb2wgYWRkSUxQT3B0cygpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgbWF5IGJlIGltcGxlbWVudGVkIGJ5IHRhcmdldHMgdGhhdCB3YW50IHRvIHJ1biBwYXNzZXMKKyAgLy8vIGltbWVkaWF0ZWx5IGJlZm9yZSByZWdpc3RlciBhbGxvY2F0aW9uLgorICB2aXJ0dWFsIHZvaWQgYWRkUHJlUmVnQWxsb2MoKSB7IH0KKworICAvLy8gY3JlYXRlVGFyZ2V0UmVnaXN0ZXJBbGxvY2F0b3IgLSBDcmVhdGUgdGhlIHJlZ2lzdGVyIGFsbG9jYXRvciBwYXNzIGZvcgorICAvLy8gdGhpcyB0YXJnZXQgYXQgdGhlIGN1cnJlbnQgb3B0aW1pemF0aW9uIGxldmVsLgorICB2aXJ0dWFsIEZ1bmN0aW9uUGFzcyAqY3JlYXRlVGFyZ2V0UmVnaXN0ZXJBbGxvY2F0b3IoYm9vbCBPcHRpbWl6ZWQpOworCisgIC8vLyBhZGRGYXN0UmVnQWxsb2MgLSBBZGQgdGhlIG1pbmltdW0gc2V0IG9mIHRhcmdldC1pbmRlcGVuZGVudCBwYXNzZXMgdGhhdAorICAvLy8gYXJlIHJlcXVpcmVkIGZvciBmYXN0IHJlZ2lzdGVyIGFsbG9jYXRpb24uCisgIHZpcnR1YWwgdm9pZCBhZGRGYXN0UmVnQWxsb2MoRnVuY3Rpb25QYXNzICpSZWdBbGxvY1Bhc3MpOworCisgIC8vLyBhZGRPcHRpbWl6ZWRSZWdBbGxvYyAtIEFkZCBwYXNzZXMgcmVsYXRlZCB0byByZWdpc3RlciBhbGxvY2F0aW9uLgorICAvLy8gTExWTVRhcmdldE1hY2hpbmUgcHJvdmlkZXMgc3RhbmRhcmQgcmVnYWxsb2MgcGFzc2VzIGZvciBtb3N0IHRhcmdldHMuCisgIHZpcnR1YWwgdm9pZCBhZGRPcHRpbWl6ZWRSZWdBbGxvYyhGdW5jdGlvblBhc3MgKlJlZ0FsbG9jUGFzcyk7CisKKyAgLy8vIGFkZFByZVJld3JpdGUgLSBBZGQgcGFzc2VzIHRvIHRoZSBvcHRpbWl6ZWQgcmVnaXN0ZXIgYWxsb2NhdGlvbiBwaXBlbGluZQorICAvLy8gYWZ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbiBpcyBjb21wbGV0ZSwgYnV0IGJlZm9yZSB2aXJ0dWFsIHJlZ2lzdGVycyBhcmUKKyAgLy8vIHJld3JpdHRlbiB0byBwaHlzaWNhbCByZWdpc3RlcnMuCisgIC8vLworICAvLy8gVGhlc2UgcGFzc2VzIG11c3QgcHJlc2VydmUgVmlydFJlZ01hcCBhbmQgTGl2ZUludGVydmFscywgYW5kIHdoZW4gcnVubmluZworICAvLy8gYWZ0ZXIgUkFCYXNpYyBvciBSQUdyZWVkeSwgdGhleSBzaG91bGQgdGFrZSBhZHZhbnRhZ2Ugb2YgTGl2ZVJlZ01hdHJpeC4KKyAgLy8vIFdoZW4gdGhlc2UgcGFzc2VzIHJ1biwgVmlydFJlZ01hcCBjb250YWlucyBsZWdhbCBwaHlzcmVnIGFzc2lnbm1lbnRzIGZvcgorICAvLy8gYWxsIHZpcnR1YWwgcmVnaXN0ZXJzLgorICB2aXJ0dWFsIGJvb2wgYWRkUHJlUmV3cml0ZSgpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgbWF5IGJlIGltcGxlbWVudGVkIGJ5IHRhcmdldHMgdGhhdCB3YW50IHRvIHJ1biBwYXNzZXMgYWZ0ZXIKKyAgLy8vIHJlZ2lzdGVyIGFsbG9jYXRpb24gcGFzcyBwaXBlbGluZSBidXQgYmVmb3JlIHByb2xvZy1lcGlsb2cgaW5zZXJ0aW9uLgorICB2aXJ0dWFsIHZvaWQgYWRkUG9zdFJlZ0FsbG9jKCkgeyB9CisKKyAgLy8vIEFkZCBwYXNzZXMgdGhhdCBvcHRpbWl6ZSBtYWNoaW5lIGluc3RydWN0aW9ucyBhZnRlciByZWdpc3RlciBhbGxvY2F0aW9uLgorICB2aXJ0dWFsIHZvaWQgYWRkTWFjaGluZUxhdGVPcHRpbWl6YXRpb24oKTsKKworICAvLy8gVGhpcyBtZXRob2QgbWF5IGJlIGltcGxlbWVudGVkIGJ5IHRhcmdldHMgdGhhdCB3YW50IHRvIHJ1biBwYXNzZXMgYWZ0ZXIKKyAgLy8vIHByb2xvZy1lcGlsb2cgaW5zZXJ0aW9uIGFuZCBiZWZvcmUgdGhlIHNlY29uZCBpbnN0cnVjdGlvbiBzY2hlZHVsaW5nIHBhc3MuCisgIHZpcnR1YWwgdm9pZCBhZGRQcmVTY2hlZDIoKSB7IH0KKworICAvLy8gYWRkR0NQYXNzZXMgLSBBZGQgbGF0ZSBjb2RlZ2VuIHBhc3NlcyB0aGF0IGFuYWx5emUgY29kZSBmb3IgZ2FyYmFnZQorICAvLy8gY29sbGVjdGlvbi4gVGhpcyBzaG91bGQgcmV0dXJuIHRydWUgaWYgR0MgaW5mbyBzaG91bGQgYmUgcHJpbnRlZCBhZnRlcgorICAvLy8gdGhlc2UgcGFzc2VzLgorICB2aXJ0dWFsIGJvb2wgYWRkR0NQYXNzZXMoKTsKKworICAvLy8gQWRkIHN0YW5kYXJkIGJhc2ljIGJsb2NrIHBsYWNlbWVudCBwYXNzZXMuCisgIHZpcnR1YWwgdm9pZCBhZGRCbG9ja1BsYWNlbWVudCgpOworCisgIC8vLyBUaGlzIHBhc3MgbWF5IGJlIGltcGxlbWVudGVkIGJ5IHRhcmdldHMgdGhhdCB3YW50IHRvIHJ1biBwYXNzZXMKKyAgLy8vIGltbWVkaWF0ZWx5IGJlZm9yZSBtYWNoaW5lIGNvZGUgaXMgZW1pdHRlZC4KKyAgdmlydHVhbCB2b2lkIGFkZFByZUVtaXRQYXNzKCkgeyB9CisKKyAgLy8vIFRhcmdldHMgbWF5IGFkZCBwYXNzZXMgaW1tZWRpYXRlbHkgYmVmb3JlIG1hY2hpbmUgY29kZSBpcyBlbWl0dGVkIGluIHRoaXMKKyAgLy8vIGNhbGxiYWNrLiBUaGlzIGlzIGNhbGxlZCBldmVuIGxhdGVyIHRoYW4gYGFkZFByZUVtaXRQYXNzYC4KKyAgLy8gRklYTUU6IFJlbmFtZSBgYWRkUHJlRW1pdFBhc3NgIHRvIHNvbWV0aGluZyBtb3JlIHNlbnNpYmxlIGdpdmVuIGl0cyBhY3R1YWwKKyAgLy8gcG9zaXRpb24gYW5kIHJlbW92ZSB0aGUgYDJgIHN1ZmZpeCBoZXJlIGFzIHRoaXMgY2FsbGJhY2sgaXMgd2hhdAorICAvLyBgYWRkUHJlRW1pdFBhc3NgICpzaG91bGQqIGJlIGJ1dCBpbiByZWFsaXR5IGlzbid0LgorICB2aXJ0dWFsIHZvaWQgYWRkUHJlRW1pdFBhc3MyKCkge30KKworICAvLy8gVXRpbGl0aWVzIGZvciB0YXJnZXRzIHRvIGFkZCBwYXNzZXMgdG8gdGhlIHBhc3MgbWFuYWdlci4KKyAgLy8vCisKKyAgLy8vIEFkZCBhIENvZGVHZW4gcGFzcyBhdCB0aGlzIHBvaW50IGluIHRoZSBwaXBlbGluZSBhZnRlciBjaGVja2luZyBvdmVycmlkZXMuCisgIC8vLyBSZXR1cm4gdGhlIHBhc3MgdGhhdCB3YXMgYWRkZWQsIG9yIHplcm8gaWYgbm8gcGFzcyB3YXMgYWRkZWQuCisgIC8vLyBAcCBwcmludEFmdGVyICAgIGlmIHRydWUgYW5kIGFkZGluZyBhIG1hY2hpbmUgZnVuY3Rpb24gcGFzcyBhZGQgYW4gZXh0cmEKKyAgLy8vICAgICAgICAgICAgICAgICAgbWFjaGluZSBwcmludGVyIHBhc3MgYWZ0ZXJ3YXJkcworICAvLy8gQHAgdmVyaWZ5QWZ0ZXIgICBpZiB0cnVlIGFuZCBhZGRpbmcgYSBtYWNoaW5lIGZ1bmN0aW9uIHBhc3MgYWRkIGFuIGV4dHJhCisgIC8vLyAgICAgICAgICAgICAgICAgIG1hY2hpbmUgdmVyaWZpY2F0aW9uIHBhc3MgYWZ0ZXJ3YXJkcy4KKyAgQW5hbHlzaXNJRCBhZGRQYXNzKEFuYWx5c2lzSUQgUGFzc0lELCBib29sIHZlcmlmeUFmdGVyID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJpbnRBZnRlciA9IHRydWUpOworCisgIC8vLyBBZGQgYSBwYXNzIHRvIHRoZSBQYXNzTWFuYWdlciBpZiB0aGF0IHBhc3MgaXMgc3VwcG9zZWQgdG8gYmUgcnVuLCBhcworICAvLy8gZGV0ZXJtaW5lZCBieSB0aGUgU3RhcnRBZnRlciBhbmQgU3RvcEFmdGVyIG9wdGlvbnMuIFRha2VzIG93bmVyc2hpcCBvZiB0aGUKKyAgLy8vIHBhc3MuCisgIC8vLyBAcCBwcmludEFmdGVyICAgIGlmIHRydWUgYW5kIGFkZGluZyBhIG1hY2hpbmUgZnVuY3Rpb24gcGFzcyBhZGQgYW4gZXh0cmEKKyAgLy8vICAgICAgICAgICAgICAgICAgbWFjaGluZSBwcmludGVyIHBhc3MgYWZ0ZXJ3YXJkcworICAvLy8gQHAgdmVyaWZ5QWZ0ZXIgICBpZiB0cnVlIGFuZCBhZGRpbmcgYSBtYWNoaW5lIGZ1bmN0aW9uIHBhc3MgYWRkIGFuIGV4dHJhCisgIC8vLyAgICAgICAgICAgICAgICAgIG1hY2hpbmUgdmVyaWZpY2F0aW9uIHBhc3MgYWZ0ZXJ3YXJkcy4KKyAgdm9pZCBhZGRQYXNzKFBhc3MgKlAsIGJvb2wgdmVyaWZ5QWZ0ZXIgPSB0cnVlLCBib29sIHByaW50QWZ0ZXIgPSB0cnVlKTsKKworICAvLy8gYWRkTWFjaGluZVBhc3NlcyBoZWxwZXIgdG8gY3JlYXRlIHRoZSB0YXJnZXQtc2VsZWN0ZWQgb3Igb3ZlcnJpZGVuCisgIC8vLyByZWdhbGxvYyBwYXNzLgorICBGdW5jdGlvblBhc3MgKmNyZWF0ZVJlZ0FsbG9jUGFzcyhib29sIE9wdGltaXplZCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1RBUkdFVFBBU1NDT05GSUdfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldFJlZ2lzdGVySW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldFJlZ2lzdGVySW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhNDdhMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVGFyZ2V0UmVnaXN0ZXJJbmZvLmgKQEAgLTAsMCArMSwxMTg4IEBACisvLz09LSBDb2RlR2VuL1RhcmdldFJlZ2lzdGVySW5mby5oIC0gVGFyZ2V0IFJlZ2lzdGVyIEluZm9ybWF0aW9uIC0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgYW4gYWJzdHJhY3QgaW50ZXJmYWNlIHVzZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IGEKKy8vIHRhcmdldCBtYWNoaW5lcyByZWdpc3RlciBmaWxlLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGZvciBhIHZhcmlldHkgb2YKKy8vIHB1cnBvc2VkLCBlc3BlY2lhbGx5IHJlZ2lzdGVyIGFsbG9jYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fVEFSR0VUUkVHSVNURVJJTkZPX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1RBUkdFVFJFR0lTVEVSSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUJhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxpbmdDb252LmgiCisjaW5jbHVkZSAibGx2bS9NQy9MYW5lQml0bWFzay5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYWNoaW5lVmFsdWVUeXBlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUHJpbnRhYmxlLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQml0VmVjdG9yOworY2xhc3MgTGl2ZVJlZ01hdHJpeDsKK2NsYXNzIE1hY2hpbmVGdW5jdGlvbjsKK2NsYXNzIE1hY2hpbmVJbnN0cjsKK2NsYXNzIFJlZ1NjYXZlbmdlcjsKK2NsYXNzIFZpcnRSZWdNYXA7CitjbGFzcyBMaXZlSW50ZXJ2YWxzOworCitjbGFzcyBUYXJnZXRSZWdpc3RlckNsYXNzIHsKK3B1YmxpYzoKKyAgdXNpbmcgaXRlcmF0b3IgPSBjb25zdCBNQ1BoeXNSZWcgKjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBjb25zdCBNQ1BoeXNSZWcgKjsKKyAgdXNpbmcgc2NfaXRlcmF0b3IgPSBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzKiBjb25zdCAqOworCisgIC8vIEluc3RhbmNlIHZhcmlhYmxlcyBmaWxsZWQgYnkgdGFibGVnZW4sIGRvIG5vdCB1c2UhCisgIGNvbnN0IE1DUmVnaXN0ZXJDbGFzcyAqTUM7CisgIGNvbnN0IHVpbnQzMl90ICpTdWJDbGFzc01hc2s7CisgIGNvbnN0IHVpbnQxNl90ICpTdXBlclJlZ0luZGljZXM7CisgIGNvbnN0IExhbmVCaXRtYXNrIExhbmVNYXNrOworICAvLy8gQ2xhc3NlcyB3aXRoIGEgaGlnaGVyIHByaW9yaXR5IHZhbHVlIGFyZSBhc3NpZ25lZCBmaXJzdCBieSByZWdpc3RlcgorICAvLy8gYWxsb2NhdG9ycyB1c2luZyBhIGdyZWVkeSBoZXVyaXN0aWMuIFRoZSB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2UgWzAsNjNdLgorICBjb25zdCB1aW50OF90IEFsbG9jYXRpb25Qcmlvcml0eTsKKyAgLy8vIFdoZXRoZXIgdGhlIGNsYXNzIHN1cHBvcnRzIHR3byAob3IgbW9yZSkgZGlzanVuY3Qgc3VicmVnaXN0ZXIgaW5kaWNlcy4KKyAgY29uc3QgYm9vbCBIYXNEaXNqdW5jdFN1YlJlZ3M7CisgIC8vLyBXaGV0aGVyIGEgY29tYmluYXRpb24gb2Ygc3VicmVnaXN0ZXJzIGNhbiBjb3ZlciBldmVyeSByZWdpc3RlciBpbiB0aGUKKyAgLy8vIGNsYXNzLiBTZWUgYWxzbyB0aGUgQ292ZXJlZEJ5U3ViUmVncyBkZXNjcmlwdGlvbiBpbiBUYXJnZXQudGQuCisgIGNvbnN0IGJvb2wgQ292ZXJlZEJ5U3ViUmVnczsKKyAgY29uc3Qgc2NfaXRlcmF0b3IgU3VwZXJDbGFzc2VzOworICBBcnJheVJlZjxNQ1BoeXNSZWc+ICgqT3JkZXJGdW5jKShjb25zdCBNYWNoaW5lRnVuY3Rpb24mKTsKKworICAvLy8gUmV0dXJuIHRoZSByZWdpc3RlciBjbGFzcyBJRCBudW1iZXIuCisgIHVuc2lnbmVkIGdldElEKCkgY29uc3QgeyByZXR1cm4gTUMtPmdldElEKCk7IH0KKworICAvLy8gYmVnaW4vZW5kIC0gUmV0dXJuIGFsbCBvZiB0aGUgcmVnaXN0ZXJzIGluIHRoaXMgY2xhc3MuCisgIC8vLworICBpdGVyYXRvciAgICAgICBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIE1DLT5iZWdpbigpOyB9CisgIGl0ZXJhdG9yICAgICAgICAgZW5kKCkgY29uc3QgeyByZXR1cm4gTUMtPmVuZCgpOyB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVycyBpbiB0aGlzIGNsYXNzLgorICB1bnNpZ25lZCBnZXROdW1SZWdzKCkgY29uc3QgeyByZXR1cm4gTUMtPmdldE51bVJlZ3MoKTsgfQorCisgIGl0ZXJhdG9yX3JhbmdlPFNtYWxsVmVjdG9ySW1wbDxNQ1BoeXNSZWc+Ojpjb25zdF9pdGVyYXRvcj4KKyAgZ2V0UmVnaXN0ZXJzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKE1DLT5iZWdpbigpLCBNQy0+ZW5kKCkpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGluIHRoZSBjbGFzcy4KKyAgdW5zaWduZWQgZ2V0UmVnaXN0ZXIodW5zaWduZWQgaSkgY29uc3QgeworICAgIHJldHVybiBNQy0+Z2V0UmVnaXN0ZXIoaSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCByZWdpc3RlciBpcyBpbmNsdWRlZCBpbiB0aGlzIHJlZ2lzdGVyIGNsYXNzLgorICAvLy8gVGhpcyBkb2VzIG5vdCBpbmNsdWRlIHZpcnR1YWwgcmVnaXN0ZXJzLgorICBib29sIGNvbnRhaW5zKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIHJldHVybiBNQy0+Y29udGFpbnMoUmVnKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBib3RoIHJlZ2lzdGVycyBhcmUgaW4gdGhpcyBjbGFzcy4KKyAgYm9vbCBjb250YWlucyh1bnNpZ25lZCBSZWcxLCB1bnNpZ25lZCBSZWcyKSBjb25zdCB7CisgICAgcmV0dXJuIE1DLT5jb250YWlucyhSZWcxLCBSZWcyKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGNvc3Qgb2YgY29weWluZyBhIHZhbHVlIGJldHdlZW4gdHdvIHJlZ2lzdGVycyBpbiB0aGlzIGNsYXNzLgorICAvLy8gQSBuZWdhdGl2ZSBudW1iZXIgbWVhbnMgdGhlIHJlZ2lzdGVyIGNsYXNzIGlzIHZlcnkgZXhwZW5zaXZlCisgIC8vLyB0byBjb3B5IGUuZy4gc3RhdHVzIGZsYWcgcmVnaXN0ZXIgY2xhc3Nlcy4KKyAgaW50IGdldENvcHlDb3N0KCkgY29uc3QgeyByZXR1cm4gTUMtPmdldENvcHlDb3N0KCk7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyByZWdpc3RlciBjbGFzcyBtYXkgYmUgdXNlZCB0byBjcmVhdGUgdmlydHVhbAorICAvLy8gcmVnaXN0ZXJzLgorICBib29sIGlzQWxsb2NhdGFibGUoKSBjb25zdCB7IHJldHVybiBNQy0+aXNBbGxvY2F0YWJsZSgpOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgVGFyZ2V0UmVnaXN0ZXJDbGFzcworICAvLy8gaXMgYSBwcm9wZXIgc3ViLWNsYXNzIG9mIHRoaXMgVGFyZ2V0UmVnaXN0ZXJDbGFzcy4KKyAgYm9vbCBoYXNTdWJDbGFzcyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgY29uc3QgeworICAgIHJldHVybiBSQyAhPSB0aGlzICYmIGhhc1N1YkNsYXNzRXEoUkMpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBSQyBpcyBhIHN1Yi1jbGFzcyBvZiBvciBlcXVhbCB0byB0aGlzIGNsYXNzLgorICBib29sIGhhc1N1YkNsYXNzRXEoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBJRCA9IFJDLT5nZXRJRCgpOworICAgIHJldHVybiAoU3ViQ2xhc3NNYXNrW0lEIC8gMzJdID4+IChJRCAlIDMyKSkgJiAxOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgVGFyZ2V0UmVnaXN0ZXJDbGFzcyBpcyBhCisgIC8vLyBwcm9wZXIgc3VwZXItY2xhc3Mgb2YgdGhpcyBUYXJnZXRSZWdpc3RlckNsYXNzLgorICBib29sIGhhc1N1cGVyQ2xhc3MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMpIGNvbnN0IHsKKyAgICByZXR1cm4gUkMtPmhhc1N1YkNsYXNzKHRoaXMpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBSQyBpcyBhIHN1cGVyLWNsYXNzIG9mIG9yIGVxdWFsIHRvIHRoaXMgY2xhc3MuCisgIGJvb2wgaGFzU3VwZXJDbGFzc0VxKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSBjb25zdCB7CisgICAgcmV0dXJuIFJDLT5oYXNTdWJDbGFzc0VxKHRoaXMpOworICB9CisKKyAgLy8vIFJldHVybnMgYSBiaXQgdmVjdG9yIG9mIHN1YmNsYXNzZXMsIGluY2x1ZGluZyB0aGlzIG9uZS4KKyAgLy8vIFRoZSB2ZWN0b3IgaXMgaW5kZXhlZCBieSBjbGFzcyBJRHMuCisgIC8vLworICAvLy8gVG8gdXNlIGl0LCBjb25zaWRlciB0aGUgcmV0dXJuZWQgYXJyYXkgYXMgYSBjaHVuayBvZiBtZW1vcnkgdGhhdAorICAvLy8gY29udGFpbnMgYW4gYXJyYXkgb2YgYml0cyBvZiBzaXplIE51bVJlZ0NsYXNzZXMuIEVhY2ggMzItYml0IGNodW5rCisgIC8vLyBjb250YWlucyBhIGJpdHNldCBvZiB0aGUgSUQgb2YgdGhlIHN1YmNsYXNzZXMgaW4gYmlnLWVuZGlhbiBzdHlsZS4KKworICAvLy8gSS5lLiwgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZW1vcnkgZnJvbSBsZWZ0IHRvIHJpZ2h0IGF0IHRoZQorICAvLy8gYml0IGxldmVsIGxvb2tzIGxpa2U6CisgIC8vLyBbMzEgMzAgLi4uIDEgMF0gWyA2MyA2MiAuLi4gMzMgMzJdIC4uLgorICAvLy8gICAgICAgICAgICAgICAgICAgICBbIFhYWCBOdW1SZWdDbGFzc2VzIE51bVJlZ0NsYXNzZXMgLSAxIC4uLiBdCisgIC8vLyBXaGVyZSB0aGUgbnVtYmVyIHJlcHJlc2VudHMgdGhlIGNsYXNzIElEIGFuZCBYWFggYml0cyB0aGF0CisgIC8vLyBzaG91bGQgYmUgaWdub3JlZC4KKyAgLy8vCisgIC8vLyBTZWUgdGhlIGltcGxlbWVudGF0aW9uIG9mIGhhc1N1YkNsYXNzRXEgZm9yIGFuIGV4YW1wbGUgb2YgaG93IGl0CisgIC8vLyBjYW4gYmUgdXNlZC4KKyAgY29uc3QgdWludDMyX3QgKmdldFN1YkNsYXNzTWFzaygpIGNvbnN0IHsKKyAgICByZXR1cm4gU3ViQ2xhc3NNYXNrOworICB9CisKKyAgLy8vIFJldHVybnMgYSAwLXRlcm1pbmF0ZWQgbGlzdCBvZiBzdWItcmVnaXN0ZXIgaW5kaWNlcyB0aGF0IHByb2plY3Qgc29tZQorICAvLy8gc3VwZXItcmVnaXN0ZXIgY2xhc3MgaW50byB0aGlzIHJlZ2lzdGVyIGNsYXNzLiBUaGUgbGlzdCBoYXMgYW4gZW50cnkgZm9yCisgIC8vLyBlYWNoIElkeCBzdWNoIHRoYXQ6CisgIC8vLworICAvLy8gICBUaGVyZSBleGlzdHMgU3VwZXJSQyB3aGVyZToKKyAgLy8vICAgICBGb3IgYWxsIFJlZyBpbiBTdXBlclJDOgorICAvLy8gICAgICAgdGhpcy0+Y29udGFpbnMoUmVnOklkeCkKKyAgY29uc3QgdWludDE2X3QgKmdldFN1cGVyUmVnSW5kaWNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gU3VwZXJSZWdJbmRpY2VzOworICB9CisKKyAgLy8vIFJldHVybnMgYSBOVUxMLXRlcm1pbmF0ZWQgbGlzdCBvZiBzdXBlci1jbGFzc2VzLiAgVGhlCisgIC8vLyBjbGFzc2VzIGFyZSBvcmRlcmVkIGJ5IElEIHdoaWNoIGlzIGFsc28gYSB0b3BvbG9naWNhbCBvcmRlcmluZyBmcm9tIGxhcmdlCisgIC8vLyB0byBzbWFsbCBjbGFzc2VzLiAgVGhlIGxpc3QgZG9lcyBOT1QgaW5jbHVkZSB0aGUgY3VycmVudCBjbGFzcy4KKyAgc2NfaXRlcmF0b3IgZ2V0U3VwZXJDbGFzc2VzKCkgY29uc3QgeworICAgIHJldHVybiBTdXBlckNsYXNzZXM7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBUYXJnZXRSZWdpc3RlckNsYXNzIGlzIGEgc3Vic2V0CisgIC8vLyBjbGFzcyBvZiBhdCBsZWFzdCBvbmUgb3RoZXIgVGFyZ2V0UmVnaXN0ZXJDbGFzcy4KKyAgYm9vbCBpc0FTdWJDbGFzcygpIGNvbnN0IHsKKyAgICByZXR1cm4gU3VwZXJDbGFzc2VzWzBdICE9IG51bGxwdHI7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgcHJlZmVycmVkIG9yZGVyIGZvciBhbGxvY2F0aW5nIHJlZ2lzdGVycyBmcm9tIHRoaXMgcmVnaXN0ZXIKKyAgLy8vIGNsYXNzIGluIE1GLiBUaGUgcmF3IG9yZGVyIGNvbWVzIGRpcmVjdGx5IGZyb20gdGhlIC50ZCBmaWxlIGFuZCBtYXkKKyAgLy8vIGluY2x1ZGUgcmVzZXJ2ZWQgcmVnaXN0ZXJzIHRoYXQgYXJlIG5vdCBhbGxvY2F0YWJsZS4KKyAgLy8vIFJlZ2lzdGVyIGFsbG9jYXRvcnMgc2hvdWxkIGFsc28gbWFrZSBzdXJlIHRvIGFsbG9jYXRlCisgIC8vLyBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzIG9ubHkgYWZ0ZXIgYWxsIHRoZSB2b2xhdGlsZXMgYXJlIHVzZWQuIFRoZQorICAvLy8gUmVnaXN0ZXJDbGFzc0luZm8gY2xhc3MgcHJvdmlkZXMgZmlsdGVyZWQgYWxsb2NhdGlvbiBvcmRlcnMgd2l0aAorICAvLy8gY2FsbGVlLXNhdmVkIHJlZ2lzdGVycyBtb3ZlZCB0byB0aGUgZW5kLgorICAvLy8KKyAgLy8vIFRoZSBNYWNoaW5lRnVuY3Rpb24gYXJndW1lbnQgY2FuIGJlIHVzZWQgdG8gdHVuZSB0aGUgYWxsb2NhdGFibGUKKyAgLy8vIHJlZ2lzdGVycyBiYXNlZCBvbiB0aGUgY2hhcmFjdGVyaXN0aWNzIG9mIHRoZSBmdW5jdGlvbiwgc3VidGFyZ2V0LCBvcgorICAvLy8gb3RoZXIgY3JpdGVyaWEuCisgIC8vLworICAvLy8gQnkgZGVmYXVsdCwgdGhpcyBtZXRob2QgcmV0dXJucyBhbGwgcmVnaXN0ZXJzIGluIHRoZSBjbGFzcy4KKyAgQXJyYXlSZWY8TUNQaHlzUmVnPiBnZXRSYXdBbGxvY2F0aW9uT3JkZXIoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgIHJldHVybiBPcmRlckZ1bmMgPyBPcmRlckZ1bmMoTUYpIDogbWFrZUFycmF5UmVmKGJlZ2luKCksIGdldE51bVJlZ3MoKSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgY29tYmluYXRpb24gb2YgYWxsIGxhbmUgbWFza3Mgb2YgcmVnaXN0ZXIgaW4gdGhpcyBjbGFzcy4KKyAgLy8vIFRoZSBsYW5lIG1hc2tzIG9mIHRoZSByZWdpc3RlcnMgYXJlIHRoZSBjb21iaW5hdGlvbiBvZiBhbGwgbGFuZSBtYXNrcworICAvLy8gb2YgdGhlaXIgc3VicmVnaXN0ZXJzLiBSZXR1cm5zIDEgaWYgdGhlcmUgYXJlIG5vIHN1YnJlZ2lzdGVycy4KKyAgTGFuZUJpdG1hc2sgZ2V0TGFuZU1hc2soKSBjb25zdCB7CisgICAgcmV0dXJuIExhbmVNYXNrOworICB9Cit9OworCisvLy8gRXh0cmEgaW5mb3JtYXRpb24sIG5vdCBpbiBNQ1JlZ2lzdGVyRGVzYywgYWJvdXQgcmVnaXN0ZXJzLgorLy8vIFRoZXNlIGFyZSB1c2VkIGJ5IGNvZGVnZW4sIG5vdCBieSBNQy4KK3N0cnVjdCBUYXJnZXRSZWdpc3RlckluZm9EZXNjIHsKKyAgdW5zaWduZWQgQ29zdFBlclVzZTsgICAgICAgICAgLy8gRXh0cmEgY29zdCBvZiBpbnN0cnVjdGlvbnMgdXNpbmcgcmVnaXN0ZXIuCisgIGJvb2wgaW5BbGxvY2F0YWJsZUNsYXNzOyAgICAgIC8vIFJlZ2lzdGVyIGJlbG9uZ3MgdG8gYW4gYWxsb2NhdGFibGUgcmVnY2xhc3MuCit9OworCisvLy8gRWFjaCBUYXJnZXRSZWdpc3RlckNsYXNzIGhhcyBhIHBlciByZWdpc3RlciB3ZWlnaHQsIGFuZCB3ZWlnaHQKKy8vLyBsaW1pdCB3aGljaCBtdXN0IGJlIGxlc3MgdGhhbiB0aGUgbGltaXRzIG9mIGl0cyBwcmVzc3VyZSBzZXRzLgorc3RydWN0IFJlZ0NsYXNzV2VpZ2h0IHsKKyAgdW5zaWduZWQgUmVnV2VpZ2h0OworICB1bnNpZ25lZCBXZWlnaHRMaW1pdDsKK307CisKKy8vLyBUYXJnZXRSZWdpc3RlckluZm8gYmFzZSBjbGFzcyAtIFdlIGFzc3VtZSB0aGF0IHRoZSB0YXJnZXQgZGVmaW5lcyBhIHN0YXRpYworLy8vIGFycmF5IG9mIFRhcmdldFJlZ2lzdGVyRGVzYyBvYmplY3RzIHRoYXQgcmVwcmVzZW50IGFsbCBvZiB0aGUgbWFjaGluZQorLy8vIHJlZ2lzdGVycyB0aGF0IHRoZSB0YXJnZXQgaGFzLiAgQXMgc3VjaCwgd2Ugc2ltcGx5IGhhdmUgdG8gdHJhY2sgYSBwb2ludGVyCisvLy8gdG8gdGhpcyBhcnJheSBzbyB0aGF0IHdlIGNhbiB0dXJuIHJlZ2lzdGVyIG51bWJlciBpbnRvIGEgcmVnaXN0ZXIKKy8vLyBkZXNjcmlwdG9yLgorLy8vCitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm8gOiBwdWJsaWMgTUNSZWdpc3RlckluZm8geworcHVibGljOgorICB1c2luZyByZWdjbGFzc19pdGVyYXRvciA9IGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKiBjb25zdCAqOworICB1c2luZyB2dF9pdGVyYXRvciA9IGNvbnN0IE1WVDo6U2ltcGxlVmFsdWVUeXBlICo7CisgIHN0cnVjdCBSZWdDbGFzc0luZm8geworICAgIHVuc2lnbmVkIFJlZ1NpemUsIFNwaWxsU2l6ZSwgU3BpbGxBbGlnbm1lbnQ7CisgICAgdnRfaXRlcmF0b3IgVlRMaXN0OworICB9OworcHJpdmF0ZToKKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvRGVzYyAqSW5mb0Rlc2M7ICAgICAvLyBFeHRyYSBkZXNjIGFycmF5IGZvciBjb2RlZ2VuCisgIGNvbnN0IGNoYXIgKmNvbnN0ICpTdWJSZWdJbmRleE5hbWVzOyAgICAgICAgLy8gTmFtZXMgb2Ygc3VicmVnIGluZGV4ZXMuCisgIC8vIFBvaW50ZXIgdG8gYXJyYXkgb2YgbGFuZSBtYXNrcywgb25lIHBlciBzdWItcmVnIGluZGV4LgorICBjb25zdCBMYW5lQml0bWFzayAqU3ViUmVnSW5kZXhMYW5lTWFza3M7CisKKyAgcmVnY2xhc3NfaXRlcmF0b3IgUmVnQ2xhc3NCZWdpbiwgUmVnQ2xhc3NFbmQ7ICAgLy8gTGlzdCBvZiByZWdjbGFzc2VzCisgIExhbmVCaXRtYXNrIENvdmVyaW5nTGFuZXM7CisgIGNvbnN0IFJlZ0NsYXNzSW5mbyAqY29uc3QgUkNJbmZvczsKKyAgdW5zaWduZWQgSHdNb2RlOworCitwcm90ZWN0ZWQ6CisgIFRhcmdldFJlZ2lzdGVySW5mbyhjb25zdCBUYXJnZXRSZWdpc3RlckluZm9EZXNjICpJRCwKKyAgICAgICAgICAgICAgICAgICAgIHJlZ2NsYXNzX2l0ZXJhdG9yIFJlZ0NsYXNzQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICByZWdjbGFzc19pdGVyYXRvciBSZWdDbGFzc0VuZCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNvbnN0ICpTUklOYW1lcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmVCaXRtYXNrICpTUklMYW5lTWFza3MsCisgICAgICAgICAgICAgICAgICAgICBMYW5lQml0bWFzayBDb3ZlcmluZ0xhbmVzLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVnQ2xhc3NJbmZvICpjb25zdCBSU0ksCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNb2RlID0gMCk7CisgIHZpcnR1YWwgflRhcmdldFJlZ2lzdGVySW5mbygpOworCitwdWJsaWM6CisgIC8vIFJlZ2lzdGVyIG51bWJlcnMgY2FuIHJlcHJlc2VudCBwaHlzaWNhbCByZWdpc3RlcnMsIHZpcnR1YWwgcmVnaXN0ZXJzLCBhbmQKKyAgLy8gc29tZXRpbWVzIHN0YWNrIHNsb3RzLiBUaGUgdW5zaWduZWQgdmFsdWVzIGFyZSBkaXZpZGVkIGludG8gdGhlc2UgcmFuZ2VzOgorICAvLworICAvLyAgIDAgICAgICAgICAgIE5vdCBhIHJlZ2lzdGVyLCBjYW4gYmUgdXNlZCBhcyBhIHNlbnRpbmVsLgorICAvLyAgIFsxOzJeMzApICAgIFBoeXNpY2FsIHJlZ2lzdGVycyBhc3NpZ25lZCBieSBUYWJsZUdlbi4KKyAgLy8gICBbMl4zMDsyXjMxKSBTdGFjayBzbG90cy4gKFJhcmVseSB1c2VkLikKKyAgLy8gICBbMl4zMTsyXjMyKSBWaXJ0dWFsIHJlZ2lzdGVycyBhc3NpZ25lZCBieSBNYWNoaW5lUmVnaXN0ZXJJbmZvLgorICAvLworICAvLyBGdXJ0aGVyIHNlbnRpbmVscyBjYW4gYmUgYWxsb2NhdGVkIGZyb20gdGhlIHNtYWxsIG5lZ2F0aXZlIGludGVnZXJzLgorICAvLyBEZW5zZU1hcEluZm88dW5zaWduZWQ+IHVzZXMgLTF1IGFuZCAtMnUuCisKKyAgLy8vIGlzU3RhY2tTbG90IC0gU29tZXRpbWVzIGl0IGlzIHVzZWZ1bCB0aGUgYmUgYWJsZSB0byBzdG9yZSBhIG5vbi1uZWdhdGl2ZQorICAvLy8gZnJhbWUgaW5kZXggaW4gYSB2YXJpYWJsZSB0aGF0IG5vcm1hbGx5IGhvbGRzIGEgcmVnaXN0ZXIuIGlzU3RhY2tTbG90KCkKKyAgLy8vIHJldHVybnMgdHJ1ZSBpZiBSZWcgaXMgaW4gdGhlIHJhbmdlIHVzZWQgZm9yIHN0YWNrIHNsb3RzLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBpc1ZpcnR1YWxSZWdpc3RlcigpIGFuZCBpc1BoeXNpY2FsUmVnaXN0ZXIoKSBjYW5ub3QgaGFuZGxlIHN0YWNrCisgIC8vLyBzbG90cywgc28gaWYgYSB2YXJpYWJsZSBtYXkgY29udGFpbnMgYSBzdGFjayBzbG90LCBhbHdheXMgY2hlY2sKKyAgLy8vIGlzU3RhY2tTbG90KCkgZmlyc3QuCisgIC8vLworICBzdGF0aWMgYm9vbCBpc1N0YWNrU2xvdCh1bnNpZ25lZCBSZWcpIHsKKyAgICByZXR1cm4gaW50KFJlZykgPj0gKDEgPDwgMzApOworICB9CisKKyAgLy8vIENvbXB1dGUgdGhlIGZyYW1lIGluZGV4IGZyb20gYSByZWdpc3RlciB2YWx1ZSByZXByZXNlbnRpbmcgYSBzdGFjayBzbG90LgorICBzdGF0aWMgaW50IHN0YWNrU2xvdDJJbmRleCh1bnNpZ25lZCBSZWcpIHsKKyAgICBhc3NlcnQoaXNTdGFja1Nsb3QoUmVnKSAmJiAiTm90IGEgc3RhY2sgc2xvdCIpOworICAgIHJldHVybiBpbnQoUmVnIC0gKDF1IDw8IDMwKSk7CisgIH0KKworICAvLy8gQ29udmVydCBhIG5vbi1uZWdhdGl2ZSBmcmFtZSBpbmRleCB0byBhIHN0YWNrIHNsb3QgcmVnaXN0ZXIgdmFsdWUuCisgIHN0YXRpYyB1bnNpZ25lZCBpbmRleDJTdGFja1Nsb3QoaW50IEZJKSB7CisgICAgYXNzZXJ0KEZJID49IDAgJiYgIkNhbm5vdCBob2xkIGEgbmVnYXRpdmUgZnJhbWUgaW5kZXguIik7CisgICAgcmV0dXJuIEZJICsgKDF1IDw8IDMwKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIG51bWJlciBpcyBpbgorICAvLy8gdGhlIHBoeXNpY2FsIHJlZ2lzdGVyIG5hbWVzcGFjZS4KKyAgc3RhdGljIGJvb2wgaXNQaHlzaWNhbFJlZ2lzdGVyKHVuc2lnbmVkIFJlZykgeworICAgIGFzc2VydCghaXNTdGFja1Nsb3QoUmVnKSAmJiAiTm90IGEgcmVnaXN0ZXIhIENoZWNrIGlzU3RhY2tTbG90KCkgZmlyc3QuIik7CisgICAgcmV0dXJuIGludChSZWcpID4gMDsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIG51bWJlciBpcyBpbgorICAvLy8gdGhlIHZpcnR1YWwgcmVnaXN0ZXIgbmFtZXNwYWNlLgorICBzdGF0aWMgYm9vbCBpc1ZpcnR1YWxSZWdpc3Rlcih1bnNpZ25lZCBSZWcpIHsKKyAgICBhc3NlcnQoIWlzU3RhY2tTbG90KFJlZykgJiYgIk5vdCBhIHJlZ2lzdGVyISBDaGVjayBpc1N0YWNrU2xvdCgpIGZpcnN0LiIpOworICAgIHJldHVybiBpbnQoUmVnKSA8IDA7CisgIH0KKworICAvLy8gQ29udmVydCBhIHZpcnR1YWwgcmVnaXN0ZXIgbnVtYmVyIHRvIGEgMC1iYXNlZCBpbmRleC4KKyAgLy8vIFRoZSBmaXJzdCB2aXJ0dWFsIHJlZ2lzdGVyIGluIGEgZnVuY3Rpb24gd2lsbCBnZXQgdGhlIGluZGV4IDAuCisgIHN0YXRpYyB1bnNpZ25lZCB2aXJ0UmVnMkluZGV4KHVuc2lnbmVkIFJlZykgeworICAgIGFzc2VydChpc1ZpcnR1YWxSZWdpc3RlcihSZWcpICYmICJOb3QgYSB2aXJ0dWFsIHJlZ2lzdGVyIik7CisgICAgcmV0dXJuIFJlZyAmIH4oMXUgPDwgMzEpOworICB9CisKKyAgLy8vIENvbnZlcnQgYSAwLWJhc2VkIGluZGV4IHRvIGEgdmlydHVhbCByZWdpc3RlciBudW1iZXIuCisgIC8vLyBUaGlzIGlzIHRoZSBpbnZlcnNlIG9wZXJhdGlvbiBvZiBWaXJ0UmVnMkluZGV4RnVuY3RvciBiZWxvdy4KKyAgc3RhdGljIHVuc2lnbmVkIGluZGV4MlZpcnRSZWcodW5zaWduZWQgSW5kZXgpIHsKKyAgICByZXR1cm4gSW5kZXggfCAoMXUgPDwgMzEpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgc2l6ZSBpbiBiaXRzIG9mIGEgcmVnaXN0ZXIgZnJvbSBjbGFzcyBSQy4KKyAgdW5zaWduZWQgZ2V0UmVnU2l6ZUluQml0cyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICZSQykgY29uc3QgeworICAgIHJldHVybiBnZXRSZWdDbGFzc0luZm8oUkMpLlJlZ1NpemU7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBzaXplIGluIGJ5dGVzIG9mIHRoZSBzdGFjayBzbG90IGFsbG9jYXRlZCB0byBob2xkIGEgc3BpbGxlZAorICAvLy8gY29weSBvZiBhIHJlZ2lzdGVyIGZyb20gY2xhc3MgUkMuCisgIHVuc2lnbmVkIGdldFNwaWxsU2l6ZShjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICZSQykgY29uc3QgeworICAgIHJldHVybiBnZXRSZWdDbGFzc0luZm8oUkMpLlNwaWxsU2l6ZSAvIDg7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBtaW5pbXVtIHJlcXVpcmVkIGFsaWdubWVudCBpbiBieXRlcyBmb3IgYSBzcGlsbCBzbG90IGZvcgorICAvLy8gYSByZWdpc3RlciBvZiB0aGlzIGNsYXNzLgorICB1bnNpZ25lZCBnZXRTcGlsbEFsaWdubWVudChjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICZSQykgY29uc3QgeworICAgIHJldHVybiBnZXRSZWdDbGFzc0luZm8oUkMpLlNwaWxsQWxpZ25tZW50IC8gODsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gVGFyZ2V0UmVnaXN0ZXJDbGFzcyBoYXMgdGhlIFZhbHVlVHlwZSBULgorICBib29sIGlzVHlwZUxlZ2FsRm9yQ2xhc3MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAmUkMsIE1WVCBUKSBjb25zdCB7CisgICAgZm9yIChhdXRvIEkgPSBsZWdhbGNsYXNzdHlwZXNfYmVnaW4oUkMpOyAqSSAhPSBNVlQ6Ok90aGVyOyArK0kpCisgICAgICBpZiAoTVZUKCpJKSA9PSBUKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gTG9vcCBvdmVyIGFsbCBvZiB0aGUgdmFsdWUgdHlwZXMgdGhhdCBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgdmFsdWVzCisgIC8vLyBpbiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgY2xhc3MuCisgIHZ0X2l0ZXJhdG9yIGxlZ2FsY2xhc3N0eXBlc19iZWdpbihjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICZSQykgY29uc3QgeworICAgIHJldHVybiBnZXRSZWdDbGFzc0luZm8oUkMpLlZUTGlzdDsKKyAgfQorCisgIHZ0X2l0ZXJhdG9yIGxlZ2FsY2xhc3N0eXBlc19lbmQoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAmUkMpIGNvbnN0IHsKKyAgICB2dF9pdGVyYXRvciBJID0gbGVnYWxjbGFzc3R5cGVzX2JlZ2luKFJDKTsKKyAgICB3aGlsZSAoKkkgIT0gTVZUOjpPdGhlcikKKyAgICAgICsrSTsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBSZWdpc3RlciBDbGFzcyBvZiBhIHBoeXNpY2FsIHJlZ2lzdGVyIG9mIHRoZSBnaXZlbiB0eXBlLAorICAvLy8gcGlja2luZyB0aGUgbW9zdCBzdWIgcmVnaXN0ZXIgY2xhc3Mgb2YgdGhlIHJpZ2h0IHR5cGUgdGhhdCBjb250YWlucyB0aGlzCisgIC8vLyBwaHlzcmVnLgorICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICoKKyAgICBnZXRNaW5pbWFsUGh5c1JlZ0NsYXNzKHVuc2lnbmVkIFJlZywgTVZUIFZUID0gTVZUOjpPdGhlcikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgbWF4aW1hbCBzdWJjbGFzcyBvZiB0aGUgZ2l2ZW4gcmVnaXN0ZXIgY2xhc3MgdGhhdCBpcworICAvLy8gYWxsb2NhdGFibGUgb3IgTlVMTC4KKyAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqCisgICAgZ2V0QWxsb2NhdGFibGVDbGFzcyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgYSBiaXRzZXQgaW5kZXhlZCBieSByZWdpc3RlciBudW1iZXIgaW5kaWNhdGluZyBpZiBhIHJlZ2lzdGVyIGlzCisgIC8vLyBhbGxvY2F0YWJsZSBvciBub3QuIElmIGEgcmVnaXN0ZXIgY2xhc3MgaXMgc3BlY2lmaWVkLCByZXR1cm5zIHRoZSBzdWJzZXQKKyAgLy8vIGZvciB0aGUgY2xhc3MuCisgIEJpdFZlY3RvciBnZXRBbGxvY2F0YWJsZVNldChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkMgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBhZGRpdGlvbmFsIGNvc3Qgb2YgdXNpbmcgdGhpcyByZWdpc3RlciBpbnN0ZWFkCisgIC8vLyBvZiBvdGhlciByZWdpc3RlcnMgaW4gaXRzIGNsYXNzLgorICB1bnNpZ25lZCBnZXRDb3N0UGVyVXNlKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIEluZm9EZXNjW1JlZ05vXS5Db3N0UGVyVXNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSByZWdpc3RlciBpcyBpbiB0aGUgYWxsb2NhdGlvbiBvZiBhbnkgcmVnaXN0ZXIgY2xhc3MuCisgIGJvb2wgaXNJbkFsbG9jYXRhYmxlQ2xhc3ModW5zaWduZWQgUmVnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gSW5mb0Rlc2NbUmVnTm9dLmluQWxsb2NhdGFibGVDbGFzczsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGh1bWFuLXJlYWRhYmxlIHN5bWJvbGljIHRhcmdldC1zcGVjaWZpYworICAvLy8gbmFtZSBmb3IgdGhlIHNwZWNpZmllZCBTdWJSZWdJbmRleC4KKyAgY29uc3QgY2hhciAqZ2V0U3ViUmVnSW5kZXhOYW1lKHVuc2lnbmVkIFN1YklkeCkgY29uc3QgeworICAgIGFzc2VydChTdWJJZHggJiYgU3ViSWR4IDwgZ2V0TnVtU3ViUmVnSW5kaWNlcygpICYmCisgICAgICAgICAgICJUaGlzIGlzIG5vdCBhIHN1YnJlZ2lzdGVyIGluZGV4Iik7CisgICAgcmV0dXJuIFN1YlJlZ0luZGV4TmFtZXNbU3ViSWR4LTFdOworICB9CisKKyAgLy8vIFJldHVybiBhIGJpdG1hc2sgcmVwcmVzZW50aW5nIHRoZSBwYXJ0cyBvZiBhIHJlZ2lzdGVyIHRoYXQgYXJlIGNvdmVyZWQgYnkKKyAgLy8vIFN1YklkeCBcc2VlIExhbmVCaXRtYXNrLgorICAvLy8KKyAgLy8vIFN1YklkeCA9PSAwIGlzIGFsbG93ZWQsIGl0IGhhcyB0aGUgbGFuZSBtYXNrIH4wdS4KKyAgTGFuZUJpdG1hc2sgZ2V0U3ViUmVnSW5kZXhMYW5lTWFzayh1bnNpZ25lZCBTdWJJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoU3ViSWR4IDwgZ2V0TnVtU3ViUmVnSW5kaWNlcygpICYmICJUaGlzIGlzIG5vdCBhIHN1YnJlZ2lzdGVyIGluZGV4Iik7CisgICAgcmV0dXJuIFN1YlJlZ0luZGV4TGFuZU1hc2tzW1N1YklkeF07CisgIH0KKworICAvLy8gVGhlIGxhbmUgbWFza3MgcmV0dXJuZWQgYnkgZ2V0U3ViUmVnSW5kZXhMYW5lTWFzaygpIGFib3ZlIGNhbiBvbmx5IGJlCisgIC8vLyB1c2VkIHRvIGRldGVybWluZSBpZiBzdWItcmVnaXN0ZXJzIG92ZXJsYXAgLSB0aGV5IGNhbid0IGJlIHVzZWQgdG8KKyAgLy8vIGRldGVybWluZSBpZiBhIHNldCBvZiBzdWItcmVnaXN0ZXJzIGNvbXBsZXRlbHkgY292ZXIgYW5vdGhlcgorICAvLy8gc3ViLXJlZ2lzdGVyLgorICAvLy8KKyAgLy8vIFRoZSBYODYgZ2VuZXJhbCBwdXJwb3NlIHJlZ2lzdGVycyBoYXZlIHR3byBsYW5lcyBjb3JyZXNwb25kaW5nIHRvIHRoZQorICAvLy8gc3ViXzhiaXQgYW5kIHN1Yl84Yml0X2hpIHN1Yi1yZWdpc3RlcnMuIEJvdGggc3ViXzMyYml0IGFuZCBzdWJfMTZiaXQgaGF2ZQorICAvLy8gbGFuZSBtYXNrcyAnMycsIGJ1dCB0aGUgc3ViXzE2Yml0IHN1Yi1yZWdpc3RlciBkb2Vzbid0IGZ1bGx5IGNvdmVyIHRoZQorICAvLy8gc3ViXzMyYml0IHN1Yi1yZWdpc3Rlci4KKyAgLy8vCisgIC8vLyBPbiB0aGUgb3RoZXIgaGFuZCwgdGhlIEFSTSBORU9OIGxhbmVzIGZ1bGx5IGNvdmVyIHRoZWlyIHJlZ2lzdGVyczogVGhlCisgIC8vLyBkc3ViXzAgc3ViLXJlZ2lzdGVyIGlzIGNvbXBsZXRlbHkgY292ZXJlZCBieSB0aGUgc3N1Yl8wIGFuZCBzc3ViXzEgbGFuZXMuCisgIC8vLyBUaGlzIGlzIHJlbGF0ZWQgdG8gdGhlIENvdmVyZWRCeVN1YlJlZ3MgcHJvcGVydHkgb24gcmVnaXN0ZXIgZGVmaW5pdGlvbnMuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgYml0IG1hc2sgb2YgbGFuZXMgdGhhdCBjb21wbGV0ZWx5IGNvdmVyIHRoZWlyCisgIC8vLyBzdWItcmVnaXN0ZXJzLiBNb3JlIHByZWNpc2VseSwgZ2l2ZW46CisgIC8vLworICAvLy8gICBDb3ZlcmluZyA9IGdldENvdmVyaW5nTGFuZXMoKTsKKyAgLy8vICAgTWFza0EgPSBnZXRTdWJSZWdJbmRleExhbmVNYXNrKFN1YkEpOworICAvLy8gICBNYXNrQiA9IGdldFN1YlJlZ0luZGV4TGFuZU1hc2soU3ViQik7CisgIC8vLworICAvLy8gSWYgKE1hc2tBICYgfihNYXNrQiAmIENvdmVyaW5nKSkgPT0gMCwgdGhlbiBTdWJBIGlzIGNvbXBsZXRlbHkgY292ZXJlZCBieQorICAvLy8gU3ViQi4KKyAgTGFuZUJpdG1hc2sgZ2V0Q292ZXJpbmdMYW5lcygpIGNvbnN0IHsgcmV0dXJuIENvdmVyaW5nTGFuZXM7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gcmVnaXN0ZXJzIGFyZSBlcXVhbCBvciBhbGlhcyBlYWNoIG90aGVyLgorICAvLy8gVGhlIHJlZ2lzdGVycyBtYXkgYmUgdmlydHVhbCByZWdpc3RlcnMuCisgIGJvb2wgcmVnc092ZXJsYXAodW5zaWduZWQgcmVnQSwgdW5zaWduZWQgcmVnQikgY29uc3QgeworICAgIGlmIChyZWdBID09IHJlZ0IpIHJldHVybiB0cnVlOworICAgIGlmIChpc1ZpcnR1YWxSZWdpc3RlcihyZWdBKSB8fCBpc1ZpcnR1YWxSZWdpc3RlcihyZWdCKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIC8vIFJlZ3VuaXRzIGFyZSBudW1lcmljYWxseSBvcmRlcmVkLiBGaW5kIGEgY29tbW9uIHVuaXQuCisgICAgTUNSZWdVbml0SXRlcmF0b3IgUlVBKHJlZ0EsIHRoaXMpOworICAgIE1DUmVnVW5pdEl0ZXJhdG9yIFJVQihyZWdCLCB0aGlzKTsKKyAgICBkbyB7CisgICAgICBpZiAoKlJVQSA9PSAqUlVCKSByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmICgqUlVBIDwgKlJVQikgKytSVUE7CisgICAgICBlbHNlICAgICAgICAgICAgICsrUlVCOworICAgIH0gd2hpbGUgKFJVQS5pc1ZhbGlkKCkgJiYgUlVCLmlzVmFsaWQoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBSZWcgY29udGFpbnMgUmVnVW5pdC4KKyAgYm9vbCBoYXNSZWdVbml0KHVuc2lnbmVkIFJlZywgdW5zaWduZWQgUmVnVW5pdCkgY29uc3QgeworICAgIGZvciAoTUNSZWdVbml0SXRlcmF0b3IgVW5pdHMoUmVnLCB0aGlzKTsgVW5pdHMuaXNWYWxpZCgpOyArK1VuaXRzKQorICAgICAgaWYgKCpVbml0cyA9PSBSZWdVbml0KQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgb3JpZ2luYWwgU3JjUmVnIHVubGVzcyBpdCBpcyB0aGUgdGFyZ2V0IG9mIGEgY29weS1saWtlCisgIC8vLyBvcGVyYXRpb24sIGluIHdoaWNoIGNhc2Ugd2UgY2hhaW4gYmFja3dhcmRzIHRocm91Z2ggYWxsIHN1Y2ggb3BlcmF0aW9ucworICAvLy8gdG8gdGhlIHVsdGltYXRlIHNvdXJjZSByZWdpc3Rlci4gIElmIGEgcGh5c2ljYWwgcmVnaXN0ZXIgaXMgZW5jb3VudGVyZWQsCisgIC8vLyB3ZSBzdG9wIHRoZSBzZWFyY2guCisgIHZpcnR1YWwgdW5zaWduZWQgbG9va1RocnVDb3B5TGlrZSh1bnNpZ25lZCBTcmNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICpNUkkpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBudWxsLXRlcm1pbmF0ZWQgbGlzdCBvZiBhbGwgb2YgdGhlIGNhbGxlZS1zYXZlZCByZWdpc3RlcnMgb24KKyAgLy8vIHRoaXMgdGFyZ2V0LiBUaGUgcmVnaXN0ZXIgc2hvdWxkIGJlIGluIHRoZSBvcmRlciBvZiBkZXNpcmVkIGNhbGxlZS1zYXZlCisgIC8vLyBzdGFjayBmcmFtZSBvZmZzZXQuIFRoZSBmaXJzdCByZWdpc3RlciBpcyBjbG9zZXN0IHRvIHRoZSBpbmNvbWluZyBzdGFjaworICAvLy8gcG9pbnRlciBpZiBzdGFjayBncm93cyBkb3duLCBhbmQgdmljZSB2ZXJzYS4KKyAgLy8vIE5vdGljZTogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCB0YWtlIGludG8gYWNjb3VudCBkaXNhYmxlZCBDU1JzLgorICAvLy8gICAgICAgICBJbiBtb3N0IGNhc2VzIHlvdSB3aWxsIHdhbnQgdG8gdXNlIGluc3RlYWQgdGhlIGZ1bmN0aW9uIAorICAvLy8gICAgICAgICBnZXRDYWxsZWVTYXZlZFJlZ3MgdGhhdCBpcyBpbXBsZW1lbnRlZCBpbiBNYWNoaW5lUmVnaXN0ZXJJbmZvLgorICB2aXJ0dWFsIGNvbnN0IE1DUGh5c1JlZyoKKyAgZ2V0Q2FsbGVlU2F2ZWRSZWdzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAqTUYpIGNvbnN0ID0gMDsKKworICAvLy8gUmV0dXJuIGEgbWFzayBvZiBjYWxsLXByZXNlcnZlZCByZWdpc3RlcnMgZm9yIHRoZSBnaXZlbiBjYWxsaW5nIGNvbnZlbnRpb24KKyAgLy8vIG9uIHRoZSBjdXJyZW50IGZ1bmN0aW9uLiBUaGUgbWFzayBzaG91bGQgaW5jbHVkZSBhbGwgY2FsbC1wcmVzZXJ2ZWQKKyAgLy8vIGFsaWFzZXMuIFRoaXMgaXMgdXNlZCBieSB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9yIHRvIGRldGVybWluZSB3aGljaAorICAvLy8gcmVnaXN0ZXJzIGNhbiBiZSBsaXZlIGFjcm9zcyBhIGNhbGwuCisgIC8vLworICAvLy8gVGhlIG1hc2sgaXMgYW4gYXJyYXkgY29udGFpbmluZyAoVFJJOjpnZXROdW1SZWdzKCkrMzEpLzMyIGVudHJpZXMuCisgIC8vLyBBIHNldCBiaXQgaW5kaWNhdGVzIHRoYXQgYWxsIGJpdHMgb2YgdGhlIGNvcnJlc3BvbmRpbmcgcmVnaXN0ZXIgYXJlCisgIC8vLyBwcmVzZXJ2ZWQgYWNyb3NzIHRoZSBmdW5jdGlvbiBjYWxsLiAgVGhlIGJpdCBtYXNrIGlzIGV4cGVjdGVkIHRvIGJlCisgIC8vLyBzdWItcmVnaXN0ZXIgY29tcGxldGUsIGkuZS4gaWYgQSBpcyBwcmVzZXJ2ZWQsIHNvIGFyZSBhbGwgaXRzCisgIC8vLyBzdWItcmVnaXN0ZXJzLgorICAvLy8KKyAgLy8vIEJpdHMgYXJlIG51bWJlcmVkIGZyb20gdGhlIExTQiwgc28gdGhlIGJpdCBmb3IgcGh5c2ljYWwgcmVnaXN0ZXIgUmVnIGNhbgorICAvLy8gYmUgZm91bmQgYXMgKE1hc2tbUmVnIC8gMzJdID4+IFJlZyAlIDMyKSAmIDEuCisgIC8vLworICAvLy8gQSBOVUxMIHBvaW50ZXIgbWVhbnMgdGhhdCBubyByZWdpc3RlciBtYXNrIHdpbGwgYmUgdXNlZCwgYW5kIGNhbGwKKyAgLy8vIGluc3RydWN0aW9ucyBzaG91bGQgdXNlIGltcGxpY2l0LWRlZiBvcGVyYW5kcyB0byBpbmRpY2F0ZSBjYWxsIGNsb2JiZXJlZAorICAvLy8gcmVnaXN0ZXJzLgorICAvLy8KKyAgdmlydHVhbCBjb25zdCB1aW50MzJfdCAqZ2V0Q2FsbFByZXNlcnZlZE1hc2soY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGluZ0NvbnY6OklEKSBjb25zdCB7CisgICAgLy8gVGhlIGRlZmF1bHQgbWFzayBjbG9iYmVycyBldmVyeXRoaW5nLiAgQWxsIHRhcmdldHMgc2hvdWxkIG92ZXJyaWRlLgorICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIFJldHVybiBhIHJlZ2lzdGVyIG1hc2sgdGhhdCBjbG9iYmVycyBldmVyeXRoaW5nLgorICB2aXJ0dWFsIGNvbnN0IHVpbnQzMl90ICpnZXROb1ByZXNlcnZlZE1hc2soKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgidGFyZ2V0IGRvZXMgbm90IHByb3ZpZGUgbm8gcHJlc2VydmVkIG1hc2siKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhbGwgYml0cyB0aGF0IGFyZSBzZXQgaW4gbWFzayBccCBtYXNrMCBhcmUgYWxzbyBzZXQgaW4KKyAgLy8vIFxwIG1hc2sxLgorICBib29sIHJlZ21hc2tTdWJzZXRFcXVhbChjb25zdCB1aW50MzJfdCAqbWFzazAsIGNvbnN0IHVpbnQzMl90ICptYXNrMSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiBhbGwgdGhlIGNhbGwtcHJlc2VydmVkIHJlZ2lzdGVyIG1hc2tzIGRlZmluZWQgZm9yIHRoaXMgdGFyZ2V0LgorICB2aXJ0dWFsIEFycmF5UmVmPGNvbnN0IHVpbnQzMl90ICo+IGdldFJlZ01hc2tzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIEFycmF5UmVmPGNvbnN0IGNoYXIgKj4gZ2V0UmVnTWFza05hbWVzKCkgY29uc3QgPSAwOworCisgIC8vLyBSZXR1cm5zIGEgYml0c2V0IGluZGV4ZWQgYnkgcGh5c2ljYWwgcmVnaXN0ZXIgbnVtYmVyIGluZGljYXRpbmcgaWYgYQorICAvLy8gcmVnaXN0ZXIgaXMgYSBzcGVjaWFsIHJlZ2lzdGVyIHRoYXQgaGFzIHBhcnRpY3VsYXIgdXNlcyBhbmQgc2hvdWxkIGJlCisgIC8vLyBjb25zaWRlcmVkIHVuYXZhaWxhYmxlIGF0IGFsbCB0aW1lcywgZS5nLiBzdGFjayBwb2ludGVyLCByZXR1cm4gYWRkcmVzcy4KKyAgLy8vIEEgcmVzZXJ2ZWQgcmVnaXN0ZXI6CisgIC8vLyAtIGlzIG5vdCBhbGxvY2F0YWJsZQorICAvLy8gLSBpcyBjb25zaWRlcmVkIGFsd2F5cyBsaXZlCisgIC8vLyAtIGlzIGlnbm9yZWQgYnkgbGl2ZW5lc3MgdHJhY2tpbmcKKyAgLy8vIEl0IGlzIG9mdGVuIG5lY2Vzc2FyeSB0byByZXNlcnZlIHRoZSBzdXBlciByZWdpc3RlcnMgb2YgYSByZXNlcnZlZAorICAvLy8gcmVnaXN0ZXIgYXMgd2VsbCwgdG8gYXZvaWQgdGhlbSBnZXR0aW5nIGFsbG9jYXRlZCBpbmRpcmVjdGx5LiBZb3UgbWF5IHVzZQorICAvLy8gbWFya1N1cGVyUmVncygpIGFuZCBjaGVja0FsbFN1cGVyUmVnc01hcmtlZCgpIGluIHRoaXMgY2FzZS4KKyAgdmlydHVhbCBCaXRWZWN0b3IgZ2V0UmVzZXJ2ZWRSZWdzKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0ID0gMDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIFBoeXNSZWcgaXMgdW5hbGxvY2F0YWJsZSBhbmQgY29uc3RhbnQgdGhyb3VnaG91dCB0aGUKKyAgLy8vIGZ1bmN0aW9uLiAgVXNlZCBieSBNYWNoaW5lUmVnaXN0ZXJJbmZvOjppc0NvbnN0YW50UGh5c1JlZygpLgorICB2aXJ0dWFsIGJvb2wgaXNDb25zdGFudFBoeXNSZWcodW5zaWduZWQgUGh5c1JlZykgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gUGh5c2ljYWwgcmVnaXN0ZXJzIHRoYXQgbWF5IGJlIG1vZGlmaWVkIHdpdGhpbiBhIGZ1bmN0aW9uIGJ1dCBhcmUKKyAgLy8vIGd1YXJhbnRlZWQgdG8gYmUgcmVzdG9yZWQgYmVmb3JlIGFueSB1c2VzLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGFyZ2V0cyB0aGF0CisgIC8vLyBoYXZlIGNhbGwgc2VxdWVuY2VzIHdoZXJlIGEgR09UIHJlZ2lzdGVyIG1heSBiZSB1cGRhdGVkIGJ5IHRoZSBjYWxsZXIKKyAgLy8vIHByaW9yIHRvIGEgY2FsbCBhbmQgaXMgZ3VhcmFudGVlZCB0byBiZSByZXN0b3JlZCAoYWxzbyBieSB0aGUgY2FsbGVyKQorICAvLy8gYWZ0ZXIgdGhlIGNhbGwuIAorICB2aXJ0dWFsIGJvb2wgaXNDYWxsZXJQcmVzZXJ2ZWRQaHlzUmVnKHVuc2lnbmVkIFBoeXNSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBQcmlvciB0byBhZGRpbmcgdGhlIGxpdmUtb3V0IG1hc2sgdG8gYSBzdGFja21hcCBvciBwYXRjaHBvaW50CisgIC8vLyBpbnN0cnVjdGlvbiwgcHJvdmlkZSB0aGUgdGFyZ2V0IHRoZSBvcHBvcnR1bml0eSB0byBhZGp1c3QgaXQgKG1haW5seSB0bworICAvLy8gcmVtb3ZlIHBzZXVkby1yZWdpc3RlcnMgdGhhdCBzaG91bGQgYmUgaWdub3JlZCkuCisgIHZpcnR1YWwgdm9pZCBhZGp1c3RTdGFja01hcExpdmVPdXRNYXNrKHVpbnQzMl90ICpNYXNrKSBjb25zdCB7fQorCisgIC8vLyBSZXR1cm4gYSBzdXBlci1yZWdpc3RlciBvZiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyCisgIC8vLyBSZWcgc28gaXRzIHN1Yi1yZWdpc3RlciBvZiBpbmRleCBTdWJJZHggaXMgUmVnLgorICB1bnNpZ25lZCBnZXRNYXRjaGluZ1N1cGVyUmVnKHVuc2lnbmVkIFJlZywgdW5zaWduZWQgU3ViSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSBjb25zdCB7CisgICAgcmV0dXJuIE1DUmVnaXN0ZXJJbmZvOjpnZXRNYXRjaGluZ1N1cGVyUmVnKFJlZywgU3ViSWR4LCBSQy0+TUMpOworICB9CisKKyAgLy8vIFJldHVybiBhIHN1YmNsYXNzIG9mIHRoZSBzcGVjaWZpZWQgcmVnaXN0ZXIKKyAgLy8vIGNsYXNzIEEgc28gdGhhdCBlYWNoIHJlZ2lzdGVyIGluIGl0IGhhcyBhIHN1Yi1yZWdpc3RlciBvZiB0aGUKKyAgLy8vIHNwZWNpZmllZCBzdWItcmVnaXN0ZXIgaW5kZXggd2hpY2ggaXMgaW4gdGhlIHNwZWNpZmllZCByZWdpc3RlciBjbGFzcyBCLgorICAvLy8KKyAgLy8vIFRhYmxlR2VuIHdpbGwgc3ludGhlc2l6ZSBtaXNzaW5nIEEgc3ViLWNsYXNzZXMuCisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqCisgIGdldE1hdGNoaW5nU3VwZXJSZWdDbGFzcyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqQiwgdW5zaWduZWQgSWR4KSBjb25zdDsKKworICAvLyBGb3IgYSBjb3B5LWxpa2UgaW5zdHJ1Y3Rpb24gdGhhdCBkZWZpbmVzIGEgcmVnaXN0ZXIgb2YgY2xhc3MgRGVmUkMgd2l0aAorICAvLyBzdWJyZWcgaW5kZXggRGVmU3ViUmVnLCByZWFkaW5nIGZyb20gYW5vdGhlciBzb3VyY2Ugd2l0aCBjbGFzcyBTcmNSQyBhbmQKKyAgLy8gc3VicmVnaXN0ZXIgU3JjU3ViUmVnIHJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBwcmVmZXJhYmxlIGNvcHkKKyAgLy8gaW5zdHJ1Y3Rpb24gb3IgYW4gZWFybGllciB1c2Ugc2hvdWxkIGJlIHVzZWQuCisgIHZpcnR1YWwgYm9vbCBzaG91bGRSZXdyaXRlQ29weVNyYyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpEZWZSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERlZlN1YlJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlNyY1JDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjU3ViUmVnKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgbGFyZ2VzdCBsZWdhbCBzdWItY2xhc3Mgb2YgUkMgdGhhdAorICAvLy8gc3VwcG9ydHMgdGhlIHN1Yi1yZWdpc3RlciBpbmRleCBJZHguCisgIC8vLyBJZiBubyBzdWNoIHN1Yi1jbGFzcyBleGlzdHMsIHJldHVybiBOVUxMLgorICAvLy8gSWYgYWxsIHJlZ2lzdGVycyBpbiBSQyBhbHJlYWR5IGhhdmUgYW4gSWR4IHN1Yi1yZWdpc3RlciwgcmV0dXJuIFJDLgorICAvLy8KKyAgLy8vIFRhYmxlR2VuIGdlbmVyYXRlcyBhIHZlcnNpb24gb2YgdGhpcyBmdW5jdGlvbiB0aGF0IGlzIGdvb2QgZW5vdWdoIGluIG1vc3QKKyAgLy8vIGNhc2VzLiAgVGFyZ2V0cyBjYW4gb3ZlcnJpZGUgaWYgdGhleSBoYXZlIGNvbnN0cmFpbnRzIHRoYXQgVGFibGVHZW4KKyAgLy8vIGRvZXNuJ3QgdW5kZXJzdGFuZC4gIEZvciBleGFtcGxlLCB0aGUgeDg2IHN1Yl84Yml0IHN1Yi1yZWdpc3RlciBpbmRleCBpcworICAvLy8gc3VwcG9ydGVkIGJ5IHRoZSBmdWxsIEdSMzIgcmVnaXN0ZXIgY2xhc3MgaW4gNjQtYml0IG1vZGUsIGJ1dCBvbmx5IGJ5IHRoZQorICAvLy8gR1IzMl9BQkNEIHJlZ2lpc3RlciBjbGFzcyBpbiAzMi1iaXQgbW9kZS4KKyAgLy8vCisgIC8vLyBUYWJsZUdlbiB3aWxsIHN5bnRoZXNpemUgbWlzc2luZyBSQyBzdWItY2xhc3Nlcy4KKyAgdmlydHVhbCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICoKKyAgZ2V0U3ViQ2xhc3NXaXRoU3ViUmVnKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLCB1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSWR4ID09IDAgJiYgIlRhcmdldCBoYXMgbm8gc3ViLXJlZ2lzdGVycyIpOworICAgIHJldHVybiBSQzsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHN1YnJlZ2lzdGVyIGluZGV4IHlvdSBnZXQgZnJvbSBjb21wb3NpbmcKKyAgLy8vIHR3byBzdWJyZWdpc3RlciBpbmRpY2VzLgorICAvLy8KKyAgLy8vIFRoZSBzcGVjaWFsIG51bGwgc3ViLXJlZ2lzdGVyIGluZGV4IGNvbXBvc2VzIGFzIHRoZSBpZGVudGl0eS4KKyAgLy8vCisgIC8vLyBJZiBSOmE6YiBpcyB0aGUgc2FtZSByZWdpc3RlciBhcyBSOmMsIHRoZW4gY29tcG9zZVN1YlJlZ0luZGljZXMoYSwgYikKKyAgLy8vIHJldHVybnMgYy4gTm90ZSB0aGF0IGNvbXBvc2VTdWJSZWdJbmRpY2VzIGRvZXMgbm90IHRlbGwgeW91IGFib3V0IGlsbGVnYWwKKyAgLy8vIGNvbXBvc2l0aW9ucy4gSWYgUiBkb2VzIG5vdCBoYXZlIGEgc3VicmVnIGEsIG9yIFI6YSBkb2VzIG5vdCBoYXZlIGEgc3VicmVnCisgIC8vLyBiLCBjb21wb3NlU3ViUmVnSW5kaWNlcyBkb2Vzbid0IHRlbGwgeW91LgorICAvLy8KKyAgLy8vIFRoZSBBUk0gcmVnaXN0ZXIgUTAgaGFzIHR3byBEIHN1YnJlZ3MgZHN1Yl8wOkQwIGFuZCBkc3ViXzE6RDEuIEl0IGFsc28gaGFzCisgIC8vLyBzc3ViXzA6UzAgLSBzc3ViXzM6UzMgc3VicmVncy4KKyAgLy8vIElmIHlvdSBjb21wb3NlIHN1YnJlZyBpbmRpY2VzIGRzdWJfMSwgc3N1Yl8wIHlvdSBnZXQgc3N1Yl8yLgorICB1bnNpZ25lZCBjb21wb3NlU3ViUmVnSW5kaWNlcyh1bnNpZ25lZCBhLCB1bnNpZ25lZCBiKSBjb25zdCB7CisgICAgaWYgKCFhKSByZXR1cm4gYjsKKyAgICBpZiAoIWIpIHJldHVybiBhOworICAgIHJldHVybiBjb21wb3NlU3ViUmVnSW5kaWNlc0ltcGwoYSwgYik7CisgIH0KKworICAvLy8gVHJhbnNmb3JtcyBhIExhbmVNYXNrIGNvbXB1dGVkIGZvciBvbmUgc3VicmVnaXN0ZXIgdG8gdGhlIGxhbmVtYXNrIHRoYXQKKyAgLy8vIHdvdWxkIGhhdmUgYmVlbiBjb21wdXRlZCB3aGVuIGNvbXBvc2luZyB0aGUgc3Vic3VicmVnaXN0ZXJzIHdpdGggSWR4QQorICAvLy8gZmlyc3QuIEBzYSBjb21wb3NlU3ViUmVnSW5kaWNlcygpCisgIExhbmVCaXRtYXNrIGNvbXBvc2VTdWJSZWdJbmRleExhbmVNYXNrKHVuc2lnbmVkIElkeEEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhbmVCaXRtYXNrIE1hc2spIGNvbnN0IHsKKyAgICBpZiAoIUlkeEEpCisgICAgICByZXR1cm4gTWFzazsKKyAgICByZXR1cm4gY29tcG9zZVN1YlJlZ0luZGV4TGFuZU1hc2tJbXBsKElkeEEsIE1hc2spOworICB9CisKKyAgLy8vIFRyYW5zZm9ybSBhIGxhbmVtYXNrIGdpdmVuIGZvciBhIHZpcnR1YWwgcmVnaXN0ZXIgdG8gdGhlIGNvcnJlc3BvbmRpbmcKKyAgLy8vIGxhbmVtYXNrIGJlZm9yZSB1c2luZyBzdWJyZWdpc3RlciB3aXRoIGluZGV4IFxwIElkeEEuCisgIC8vLyBUaGlzIGlzIHRoZSByZXZlcnNlIG9mIGNvbXBvc2VTdWJSZWdJbmRleExhbmVNYXNrKCksIGFzc3VtaW5nIE1hc2sgaXMgYQorICAvLy8gdmFsaWUgbGFuZSBtYXNrIChubyBpbnZhbGlkIGJpdHMgc2V0KSB0aGUgZm9sbG93aW5nIGhvbGRzOgorICAvLy8gWDAgPSBjb21wb3NlU3ViUmVnSW5kZXhMYW5lTWFzayhJZHgsIE1hc2spCisgIC8vLyBYMSA9IHJldmVyc2VDb21wb3NlU3ViUmVnSW5kZXhMYW5lTWFzayhJZHgsIFgwKQorICAvLy8gPT4gWDEgPT0gTWFzaworICBMYW5lQml0bWFzayByZXZlcnNlQ29tcG9zZVN1YlJlZ0luZGV4TGFuZU1hc2sodW5zaWduZWQgSWR4QSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExhbmVCaXRtYXNrIExhbmVNYXNrKSBjb25zdCB7CisgICAgaWYgKCFJZHhBKQorICAgICAgcmV0dXJuIExhbmVNYXNrOworICAgIHJldHVybiByZXZlcnNlQ29tcG9zZVN1YlJlZ0luZGV4TGFuZU1hc2tJbXBsKElkeEEsIExhbmVNYXNrKTsKKyAgfQorCisgIC8vLyBEZWJ1Z2dpbmcgaGVscGVyOiBkdW1wIHJlZ2lzdGVyIGluIGh1bWFuIHJlYWRhYmxlIGZvcm0gdG8gZGJncygpIHN0cmVhbS4KKyAgc3RhdGljIHZvaWQgZHVtcFJlZyh1bnNpZ25lZCBSZWcsIHVuc2lnbmVkIFN1YlJlZ0luZGV4ID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8qIFRSSSA9IG51bGxwdHIpOworCitwcm90ZWN0ZWQ6CisgIC8vLyBPdmVycmlkZGVuIGJ5IFRhYmxlR2VuIGluIHRhcmdldHMgdGhhdCBoYXZlIHN1Yi1yZWdpc3RlcnMuCisgIHZpcnR1YWwgdW5zaWduZWQgY29tcG9zZVN1YlJlZ0luZGljZXNJbXBsKHVuc2lnbmVkLCB1bnNpZ25lZCkgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlRhcmdldCBoYXMgbm8gc3ViLXJlZ2lzdGVycyIpOworICB9CisKKyAgLy8vIE92ZXJyaWRkZW4gYnkgVGFibGVHZW4gaW4gdGFyZ2V0cyB0aGF0IGhhdmUgc3ViLXJlZ2lzdGVycy4KKyAgdmlydHVhbCBMYW5lQml0bWFzaworICBjb21wb3NlU3ViUmVnSW5kZXhMYW5lTWFza0ltcGwodW5zaWduZWQsIExhbmVCaXRtYXNrKSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVGFyZ2V0IGhhcyBubyBzdWItcmVnaXN0ZXJzIik7CisgIH0KKworICB2aXJ0dWFsIExhbmVCaXRtYXNrIHJldmVyc2VDb21wb3NlU3ViUmVnSW5kZXhMYW5lTWFza0ltcGwodW5zaWduZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMYW5lQml0bWFzaykgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlRhcmdldCBoYXMgbm8gc3ViLXJlZ2lzdGVycyIpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIEZpbmQgYSBjb21tb24gc3VwZXItcmVnaXN0ZXIgY2xhc3MgaWYgaXQgZXhpc3RzLgorICAvLy8KKyAgLy8vIEZpbmQgYSByZWdpc3RlciBjbGFzcywgU3VwZXJSQyBhbmQgdHdvIHN1Yi1yZWdpc3RlciBpbmRpY2VzLCBQcmVBIGFuZAorICAvLy8gUHJlQiwgc3VjaCB0aGF0OgorICAvLy8KKyAgLy8vICAgMS4gUHJlQSArIFN1YkEgPT0gUHJlQiArIFN1YkIgICh1c2luZyBjb21wb3NlU3ViUmVnSW5kaWNlcygpKSwgYW5kCisgIC8vLworICAvLy8gICAyLiBGb3IgYWxsIFJlZyBpbiBTdXBlclJDOiBSZWc6UHJlQSBpbiBSQ0EgYW5kIFJlZzpQcmVCIGluIFJDQiwgYW5kCisgIC8vLworICAvLy8gICAzLiBTdXBlclJDLT5nZXRTaXplKCkgPj0gbWF4KFJDQS0+Z2V0U2l6ZSgpLCBSQ0ItPmdldFNpemUoKSkuCisgIC8vLworICAvLy8gU3VwZXJSQyB3aWxsIGJlIGNob3NlbiBzdWNoIHRoYXQgbm8gc3VwZXItY2xhc3Mgb2YgU3VwZXJSQyBzYXRpc2ZpZXMgdGhlCisgIC8vLyByZXF1aXJlbWVudHMsIGFuZCB0aGVyZSBpcyBubyByZWdpc3RlciBjbGFzcyB3aXRoIGEgc21hbGxlciBzcGlsbCBzaXplCisgIC8vLyB0aGF0IHNhdGlzZmllcyB0aGUgcmVxdWlyZW1lbnRzLgorICAvLy8KKyAgLy8vIFN1YkEgYW5kIFN1YkIgbXVzdCBub3QgYmUgMC4gVXNlIGdldE1hdGNoaW5nU3VwZXJSZWdDbGFzcygpIGluc3RlYWQuCisgIC8vLworICAvLy8gRWl0aGVyIG9mIHRoZSBQcmVBIGFuZCBQcmVCIHN1Yi1yZWdpc3RlciBpbmRpY2VzIG1heSBiZSByZXR1cm5lZCBhcyAwLiBJbgorICAvLy8gdGhhdCBjYXNlLCB0aGUgcmV0dXJuZWQgcmVnaXN0ZXIgY2xhc3Mgd2lsbCBiZSBhIHN1Yi1jbGFzcyBvZiB0aGUKKyAgLy8vIGNvcnJlc3BvbmRpbmcgYXJndW1lbnQgcmVnaXN0ZXIgY2xhc3MuCisgIC8vLworICAvLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgTlVMTCBpZiBubyByZWdpc3RlciBjbGFzcyBjYW4gYmUgZm91bmQuCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MqCisgIGdldENvbW1vblN1cGVyUmVnQ2xhc3MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqUkNBLCB1bnNpZ25lZCBTdWJBLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDQiwgdW5zaWduZWQgU3ViQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAmUHJlQSwgdW5zaWduZWQgJlByZUIpIGNvbnN0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBSZWdpc3RlciBDbGFzcyBJbmZvcm1hdGlvbgorICAvLworcHJvdGVjdGVkOgorICBjb25zdCBSZWdDbGFzc0luZm8gJmdldFJlZ0NsYXNzSW5mbyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICZSQykgY29uc3QgeworICAgIHJldHVybiBSQ0luZm9zW2dldE51bVJlZ0NsYXNzZXMoKSAqIEh3TW9kZSArIFJDLmdldElEKCldOworICB9CisKK3B1YmxpYzoKKyAgLy8vIFJlZ2lzdGVyIGNsYXNzIGl0ZXJhdG9ycworICByZWdjbGFzc19pdGVyYXRvciByZWdjbGFzc19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIFJlZ0NsYXNzQmVnaW47IH0KKyAgcmVnY2xhc3NfaXRlcmF0b3IgcmVnY2xhc3NfZW5kKCkgY29uc3QgeyByZXR1cm4gUmVnQ2xhc3NFbmQ7IH0KKyAgaXRlcmF0b3JfcmFuZ2U8cmVnY2xhc3NfaXRlcmF0b3I+IHJlZ2NsYXNzZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UocmVnY2xhc3NfYmVnaW4oKSwgcmVnY2xhc3NfZW5kKCkpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtUmVnQ2xhc3NlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gKHVuc2lnbmVkKShyZWdjbGFzc19lbmQoKS1yZWdjbGFzc19iZWdpbigpKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSByZWdpc3RlciBjbGFzcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVudW1lcmF0aW9uIHZhbHVlLgorICAvLy8gU2VlIGNsYXNzIE1DT3BlcmFuZEluZm8uCisgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKmdldFJlZ0NsYXNzKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IGdldE51bVJlZ0NsYXNzZXMoKSAmJiAiUmVnaXN0ZXIgQ2xhc3MgSUQgb3V0IG9mIHJhbmdlIik7CisgICAgcmV0dXJuIFJlZ0NsYXNzQmVnaW5baV07CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgcmVnaXN0ZXIgY2xhc3MuCisgIGNvbnN0IGNoYXIgKmdldFJlZ0NsYXNzTmFtZShjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpDbGFzcykgY29uc3QgeworICAgIHJldHVybiBNQ1JlZ2lzdGVySW5mbzo6Z2V0UmVnQ2xhc3NOYW1lKENsYXNzLT5NQyk7CisgIH0KKworICAvLy8gRmluZCB0aGUgbGFyZ2VzdCBjb21tb24gc3ViY2xhc3Mgb2YgQSBhbmQgQi4KKyAgLy8vIFJldHVybiBOVUxMIGlmIHRoZXJlIGlzIG5vIGNvbW1vbiBzdWJjbGFzcy4KKyAgLy8vIFRoZSBjb21tb24gc3ViY2xhc3Mgc2hvdWxkIGNvbnRhaW4KKyAgLy8vIHNpbXBsZSB2YWx1ZSB0eXBlIFNWVCBpZiBpdCBpcyBub3QgdGhlIEFueSB0eXBlLgorICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICoKKyAgZ2V0Q29tbW9uU3ViQ2xhc3MoY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqQSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqQiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgTVZUOjpTaW1wbGVWYWx1ZVR5cGUgU1ZUID0KKyAgICAgICAgICAgICAgICAgICAgTVZUOjpTaW1wbGVWYWx1ZVR5cGU6OkFueSkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgYSBUYXJnZXRSZWdpc3RlckNsYXNzIHVzZWQgZm9yIHBvaW50ZXIgdmFsdWVzLgorICAvLy8gSWYgYSB0YXJnZXQgc3VwcG9ydHMgbXVsdGlwbGUgZGlmZmVyZW50IHBvaW50ZXIgcmVnaXN0ZXIgY2xhc3NlcywKKyAgLy8vIGtpbmQgc3BlY2lmaWVzIHdoaWNoIG9uZSBpcyBpbmRpY2F0ZWQuCisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqCisgIGdldFBvaW50ZXJSZWdDbGFzcyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GLCB1bnNpZ25lZCBLaW5kPTApIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJUYXJnZXQgZGlkbid0IGltcGxlbWVudCBnZXRQb2ludGVyUmVnQ2xhc3MhIik7CisgIH0KKworICAvLy8gUmV0dXJucyBhIGxlZ2FsIHJlZ2lzdGVyIGNsYXNzIHRvIGNvcHkgYSByZWdpc3RlciBpbiB0aGUgc3BlY2lmaWVkIGNsYXNzCisgIC8vLyB0byBvciBmcm9tLiBJZiBpdCBpcyBwb3NzaWJsZSB0byBjb3B5IHRoZSByZWdpc3RlciBkaXJlY3RseSB3aXRob3V0IHVzaW5nCisgIC8vLyBhIGNyb3NzIHJlZ2lzdGVyIGNsYXNzIGNvcHksIHJldHVybiB0aGUgc3BlY2lmaWVkIFJDLiBSZXR1cm5zIE5VTEwgaWYgaXQKKyAgLy8vIGlzIG5vdCBwb3NzaWJsZSB0byBjb3B5IGJldHdlZW4gdHdvIHJlZ2lzdGVycyBvZiB0aGUgc3BlY2lmaWVkIGNsYXNzLgorICB2aXJ0dWFsIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKgorICBnZXRDcm9zc0NvcHlSZWdDbGFzcyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQykgY29uc3QgeworICAgIHJldHVybiBSQzsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBsYXJnZXN0IHN1cGVyIGNsYXNzIG9mIFJDIHRoYXQgaXMgbGVnYWwgdG8gdXNlIGluIHRoZSBjdXJyZW50CisgIC8vLyBzdWItdGFyZ2V0IGFuZCBoYXMgdGhlIHNhbWUgc3BpbGwgc2l6ZS4KKyAgLy8vIFRoZSByZXR1cm5lZCByZWdpc3RlciBjbGFzcyBjYW4gYmUgdXNlZCB0byBjcmVhdGUgdmlydHVhbCByZWdpc3RlcnMgd2hpY2gKKyAgLy8vIG1lYW5zIHRoYXQgYWxsIGl0cyByZWdpc3RlcnMgY2FuIGJlIGNvcGllZCBhbmQgc3BpbGxlZC4KKyAgdmlydHVhbCBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICoKKyAgZ2V0TGFyZ2VzdExlZ2FsU3VwZXJDbGFzcyhjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gJikgY29uc3QgeworICAgIC8vLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyB2ZXJ5IGNvbnNlcnZhdGl2ZSBhbmQgZG9lc24ndCBhbGxvdyB0aGUKKyAgICAvLy8gcmVnaXN0ZXIgYWxsb2NhdG9yIHRvIGluZmxhdGUgcmVnaXN0ZXIgY2xhc3Nlcy4KKyAgICByZXR1cm4gUkM7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSByZWdpc3RlciBwcmVzc3VyZSAiaGlnaCB3YXRlciBtYXJrIiBmb3IgdGhlIHNwZWNpZmljIHJlZ2lzdGVyCisgIC8vLyBjbGFzcy4gVGhlIHNjaGVkdWxlciBpcyBpbiBoaWdoIHJlZ2lzdGVyIHByZXNzdXJlIG1vZGUgKGZvciB0aGUgc3BlY2lmaWMKKyAgLy8vIHJlZ2lzdGVyIGNsYXNzKSBpZiBpdCBnb2VzIG92ZXIgdGhlIGxpbWl0LgorICAvLy8KKyAgLy8vIE5vdGU6IHRoaXMgaXMgdGhlIG9sZCByZWdpc3RlciBwcmVzc3VyZSBtb2RlbCB0aGF0IHJlbGllcyBvbiBhIG1hbnVhbGx5CisgIC8vLyBzcGVjaWZpZWQgcmVwcmVzZW50YXRpdmUgcmVnaXN0ZXIgY2xhc3MgcGVyIHZhbHVlIHR5cGUuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0UmVnUHJlc3N1cmVMaW1pdChjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSBoZXVyaXN0aWMgZm9yIHRoZSBtYWNoaW5lIHNjaGVkdWxlciB0byBjb21wYXJlIHRoZSBwcm9maXRhYmlsaXR5CisgIC8vLyBvZiBpbmNyZWFzaW5nIG9uZSByZWdpc3RlciBwcmVzc3VyZSBzZXQgdmVyc3VzIGFub3RoZXIuICBUaGUgc2NoZWR1bGVyCisgIC8vLyB3aWxsIHByZWZlciBpbmNyZWFzaW5nIHRoZSByZWdpc3RlciBwcmVzc3VyZSBvZiB0aGUgc2V0IHdoaWNoIHJldHVybnMKKyAgLy8vIHRoZSBsYXJnZXN0IHZhbHVlIGZvciB0aGlzIGZ1bmN0aW9uLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldFJlZ1ByZXNzdXJlU2V0U2NvcmUoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFBTZXRJRCkgY29uc3QgeworICAgIHJldHVybiBQU2V0SUQ7CisgIH0KKworICAvLy8gR2V0IHRoZSB3ZWlnaHQgaW4gdW5pdHMgb2YgcHJlc3N1cmUgZm9yIHRoaXMgcmVnaXN0ZXIgY2xhc3MuCisgIHZpcnR1YWwgY29uc3QgUmVnQ2xhc3NXZWlnaHQgJmdldFJlZ0NsYXNzV2VpZ2h0KAorICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSBjb25zdCA9IDA7CisKKyAgLy8vIFJldHVybnMgc2l6ZSBpbiBiaXRzIG9mIGEgcGh5cy92aXJ0dWFsL2dlbmVyaWMgcmVnaXN0ZXIuCisgIHVuc2lnbmVkIGdldFJlZ1NpemVJbkJpdHModW5zaWduZWQgUmVnLCBjb25zdCBNYWNoaW5lUmVnaXN0ZXJJbmZvICZNUkkpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIHdlaWdodCBpbiB1bml0cyBvZiBwcmVzc3VyZSBmb3IgdGhpcyByZWdpc3RlciB1bml0LgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldFJlZ1VuaXRXZWlnaHQodW5zaWduZWQgUmVnVW5pdCkgY29uc3QgPSAwOworCisgIC8vLyBHZXQgdGhlIG51bWJlciBvZiBkaW1lbnNpb25zIG9mIHJlZ2lzdGVyIHByZXNzdXJlLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldE51bVJlZ1ByZXNzdXJlU2V0cygpIGNvbnN0ID0gMDsKKworICAvLy8gR2V0IHRoZSBuYW1lIG9mIHRoaXMgcmVnaXN0ZXIgdW5pdCBwcmVzc3VyZSBzZXQuCisgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0UmVnUHJlc3N1cmVTZXROYW1lKHVuc2lnbmVkIElkeCkgY29uc3QgPSAwOworCisgIC8vLyBHZXQgdGhlIHJlZ2lzdGVyIHVuaXQgcHJlc3N1cmUgbGltaXQgZm9yIHRoaXMgZGltZW5zaW9uLgorICAvLy8gVGhpcyBsaW1pdCBtdXN0IGJlIGFkanVzdGVkIGR5bmFtaWNhbGx5IGZvciByZXNlcnZlZCByZWdpc3RlcnMuCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0UmVnUHJlc3N1cmVTZXRMaW1pdChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSWR4KSBjb25zdCA9IDA7CisKKyAgLy8vIEdldCB0aGUgZGltZW5zaW9ucyBvZiByZWdpc3RlciBwcmVzc3VyZSBpbXBhY3RlZCBieSB0aGlzIHJlZ2lzdGVyIGNsYXNzLgorICAvLy8gUmV0dXJucyBhIC0xIHRlcm1pbmF0ZWQgYXJyYXkgb2YgcHJlc3N1cmUgc2V0IElEcy4KKyAgdmlydHVhbCBjb25zdCBpbnQgKmdldFJlZ0NsYXNzUHJlc3N1cmVTZXRzKAorICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKSBjb25zdCA9IDA7CisKKyAgLy8vIEdldCB0aGUgZGltZW5zaW9ucyBvZiByZWdpc3RlciBwcmVzc3VyZSBpbXBhY3RlZCBieSB0aGlzIHJlZ2lzdGVyIHVuaXQuCisgIC8vLyBSZXR1cm5zIGEgLTEgdGVybWluYXRlZCBhcnJheSBvZiBwcmVzc3VyZSBzZXQgSURzLgorICB2aXJ0dWFsIGNvbnN0IGludCAqZ2V0UmVnVW5pdFByZXNzdXJlU2V0cyh1bnNpZ25lZCBSZWdVbml0KSBjb25zdCA9IDA7CisKKyAgLy8vIEdldCBhIGxpc3Qgb2YgJ2hpbnQnIHJlZ2lzdGVycyB0aGF0IHRoZSByZWdpc3RlciBhbGxvY2F0b3Igc2hvdWxkIHRyeQorICAvLy8gZmlyc3Qgd2hlbiBhbGxvY2F0aW5nIGEgcGh5c2ljYWwgcmVnaXN0ZXIgZm9yIHRoZSB2aXJ0dWFsIHJlZ2lzdGVyCisgIC8vLyBWaXJ0UmVnLiBUaGVzZSByZWdpc3RlcnMgYXJlIGVmZmVjdGl2ZWx5IG1vdmVkIHRvIHRoZSBmcm9udCBvZiB0aGUKKyAgLy8vIGFsbG9jYXRpb24gb3JkZXIuIElmIHRydWUgaXMgcmV0dXJuZWQsIHJlZ2FsbG9jIHdpbGwgdHJ5IHRvIG9ubHkgdXNlCisgIC8vLyBoaW50cyB0byB0aGUgZ3JlYXRlc3QgZXh0ZW50IHBvc3NpYmxlIGV2ZW4gaWYgaXQgbWVhbnMgc3BpbGxpbmcuCisgIC8vLworICAvLy8gVGhlIE9yZGVyIGFyZ3VtZW50IGlzIHRoZSBhbGxvY2F0aW9uIG9yZGVyIGZvciBWaXJ0UmVnJ3MgcmVnaXN0ZXIgY2xhc3MKKyAgLy8vIGFzIHJldHVybmVkIGZyb20gUmVnaXN0ZXJDbGFzc0luZm86OmdldE9yZGVyKCkuIFRoZSBoaW50IHJlZ2lzdGVycyBtdXN0CisgIC8vLyBjb21lIGZyb20gT3JkZXIsIGFuZCB0aGV5IG11c3Qgbm90IGJlIHJlc2VydmVkLgorICAvLy8KKyAgLy8vIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoaXMgZnVuY3Rpb24gd2lsbCBvbmx5IGFkZCB0YXJnZXQKKyAgLy8vIGluZGVwZW5kZW50IHJlZ2lzdGVyIGFsbG9jYXRpb24gaGludHMuIFRhcmdldHMgdGhhdCBvdmVycmlkZSB0aGlzCisgIC8vLyBmdW5jdGlvbiBzaG91bGQgdHlwaWNhbGx5IGNhbGwgdGhpcyBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGFzIHdlbGwgYW5kCisgIC8vLyBleHBlY3QgdG8gc2VlIGdlbmVyaWMgY29weSBoaW50cyBhZGRlZC4KKyAgdmlydHVhbCBib29sIGdldFJlZ0FsbG9jYXRpb25IaW50cyh1bnNpZ25lZCBWaXJ0UmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE1DUGh5c1JlZz4gT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1DUGh5c1JlZz4gJkhpbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmlydFJlZ01hcCAqVlJNID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMaXZlUmVnTWF0cml4ICpNYXRyaXggPSBudWxscHRyKQorICAgIGNvbnN0OworCisgIC8vLyBBIGNhbGxiYWNrIHRvIGFsbG93IHRhcmdldCBhIGNoYW5jZSB0byB1cGRhdGUgcmVnaXN0ZXIgYWxsb2NhdGlvbiBoaW50cworICAvLy8gd2hlbiBhIHJlZ2lzdGVyIGlzICJjaGFuZ2VkIiAoZS5nLiBjb2FsZXNjZWQpIHRvIGFub3RoZXIgcmVnaXN0ZXIuCisgIC8vLyBlLmcuIE9uIEFSTSwgc29tZSB2aXJ0dWFsIHJlZ2lzdGVycyBzaG91bGQgdGFyZ2V0IHJlZ2lzdGVyIHBhaXJzLAorICAvLy8gaWYgb25lIG9mIHBhaXIgaXMgY29hbGVzY2VkIHRvIGFub3RoZXIgcmVnaXN0ZXIsIHRoZSBhbGxvY2F0aW9uIGhpbnQgb2YKKyAgLy8vIHRoZSBvdGhlciBoYWxmIG9mIHRoZSBwYWlyIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHBvaW50IHRvIHRoZSBuZXcgcmVnaXN0ZXIuCisgIHZpcnR1YWwgdm9pZCB1cGRhdGVSZWdBbGxvY0hpbnQodW5zaWduZWQgUmVnLCB1bnNpZ25lZCBOZXdSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgIC8vIERvIG5vdGhpbmcuCisgIH0KKworICAvLy8gVGhlIGNyZWF0aW9uIG9mIG11bHRpcGxlIGNvcHkgaGludHMgaGF2ZSBiZWVuIGltcGxlbWVudGVkIGluCisgIC8vLyB3ZWlnaHRDYWxjSGVscGVyKCksIGJ1dCBzaW5jZSB0aGlzIGFmZmVjdHMgc28gbWFueSB0ZXN0cyBmb3IgbWFueQorICAvLy8gdGFyZ2V0cywgdGhpcyBpcyB0ZW1wb3JhcmlseSBkaXNhYmxlZCBwZXIgZGVmYXVsdC4gVEhJUyBTSE9VTEQgQkUKKyAgLy8vICJHRU5FUkFMIEdPT0RORVNTIiBhbmQgaG9wZWZ1bGx5IGFsbCB0YXJnZXRzIHdpbGwgdXBkYXRlIHRoZWlyIHRlc3RzCisgIC8vLyBhbmQgZW5hYmxlIHRoaXMgc29vbi4gVGhpcyBob29rIHNob3VsZCB0aGVuIGJlIHJlbW92ZWQuCisgIHZpcnR1YWwgYm9vbCBlbmFibGVNdWx0aXBsZUNvcHlIaW50cygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIEFsbG93IHRoZSB0YXJnZXQgdG8gcmV2ZXJzZSBhbGxvY2F0aW9uIG9yZGVyIG9mIGxvY2FsIGxpdmUgcmFuZ2VzLiBUaGlzCisgIC8vLyB3aWxsIGdlbmVyYWxseSBhbGxvY2F0ZSBzaG9ydGVyIGxvY2FsIGxpdmUgcmFuZ2VzIGZpcnN0LiBGb3IgdGFyZ2V0cyB3aXRoCisgIC8vLyBtYW55IHJlZ2lzdGVycywgdGhpcyBjb3VsZCByZWR1Y2UgcmVnYWxsb2MgY29tcGlsZSB0aW1lIGJ5IGEgbGFyZ2UKKyAgLy8vIGZhY3Rvci4gSXQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCBmb3IgdGhyZWUgcmVhc29uczoKKyAgLy8vICgxKSBUb3AtZG93biBhbGxvY2F0aW9uIGlzIHNpbXBsZXIgYW5kIGVhc2llciB0byBkZWJ1ZyBmb3IgdGFyZ2V0cyB0aGF0CisgIC8vLyBkb24ndCBiZW5lZml0IGZyb20gcmV2ZXJzaW5nIHRoZSBvcmRlci4KKyAgLy8vICgyKSBCb3R0b20tdXAgYWxsb2NhdGlvbiBjb3VsZCByZXN1bHQgaW4gcG9vciBldmljaXRpb24gZGVjaXNpb25zIG9uIHNvbWUKKyAgLy8vIHRhcmdldHMgYWZmZWN0aW5nIHRoZSBwZXJmb3JtYW5jZSBvZiBjb21waWxlZCBjb2RlLgorICAvLy8gKDMpIEJvdHRvbS11cCBhbGxvY2F0aW9uIGlzIG5vIGxvbmdlciBndWFyYW50ZWVkIHRvIG9wdGltYWxseSBjb2xvci4KKyAgdmlydHVhbCBib29sIHJldmVyc2VMb2NhbEFzc2lnbm1lbnQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBBbGxvdyB0aGUgdGFyZ2V0IHRvIG92ZXJyaWRlIHRoZSBjb3N0IG9mIHVzaW5nIGEgY2FsbGVlLXNhdmVkIHJlZ2lzdGVyIGZvcgorICAvLy8gdGhlIGZpcnN0IHRpbWUuIERlZmF1bHQgdmFsdWUgb2YgMCBtZWFucyB3ZSB3aWxsIHVzZSBhIGNhbGxlZS1zYXZlZAorICAvLy8gcmVnaXN0ZXIgaWYgaXQgaXMgYXZhaWxhYmxlLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldENTUkZpcnN0VXNlQ29zdCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0YXJnZXQgcmVxdWlyZXMgKGFuZCBjYW4gbWFrZSB1c2Ugb2YpIHRoZSByZWdpc3RlcgorICAvLy8gc2NhdmVuZ2VyLgorICB2aXJ0dWFsIGJvb2wgcmVxdWlyZXNSZWdpc3RlclNjYXZlbmdpbmcoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRhcmdldCB3YW50cyB0byB1c2UgZnJhbWUgcG9pbnRlciBiYXNlZCBhY2Nlc3NlcyB0bworICAvLy8gc3BpbGwgdG8gdGhlIHNjYXZlbmdlciBlbWVyZ2VuY3kgc3BpbGwgc2xvdC4KKyAgdmlydHVhbCBib29sIHVzZUZQRm9yU2NhdmVuZ2luZ0luZGV4KGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRhcmdldCByZXF1aXJlcyBwb3N0IFBFSSBzY2F2ZW5naW5nIG9mIHJlZ2lzdGVycyBmb3IKKyAgLy8vIG1hdGVyaWFsaXppbmcgZnJhbWUgaW5kZXggY29uc3RhbnRzLgorICB2aXJ0dWFsIGJvb2wgcmVxdWlyZXNGcmFtZUluZGV4U2NhdmVuZ2luZyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGFyZ2V0IHJlcXVpcmVzIHVzaW5nIHRoZSBSZWdTY2F2ZW5nZXIgZGlyZWN0bHkgZm9yCisgIC8vLyBmcmFtZSBlbGltaW5hdGlvbiBkZXNwaXRlIHVzaW5nIHJlcXVpcmVzRnJhbWVJbmRleFNjYXZlbmdpbmcuCisgIHZpcnR1YWwgYm9vbCByZXF1aXJlc0ZyYW1lSW5kZXhSZXBsYWNlbWVudFNjYXZlbmdpbmcoCisgICAgICBjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdGFyZ2V0IHdhbnRzIHRoZSBMb2NhbFN0YWNrQWxsb2NhdGlvbiBwYXNzIHRvIGJlIHJ1bgorICAvLy8gYW5kIHZpcnR1YWwgYmFzZSByZWdpc3RlcnMgdXNlZCBmb3IgbW9yZSBlZmZpY2llbnQgc3RhY2sgYWNjZXNzLgorICB2aXJ0dWFsIGJvb2wgcmVxdWlyZXNWaXJ0dWFsQmFzZVJlZ2lzdGVycyhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRhcmdldCBoYXMgcmVzZXJ2ZWQgYSBzcGlsbCBzbG90IGluIHRoZSBzdGFjayBmcmFtZSBvZgorICAvLy8gdGhlIGdpdmVuIGZ1bmN0aW9uIGZvciB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyLiBlLmcuIE9uIHg4NiwgaWYgdGhlIGZyYW1lCisgIC8vLyByZWdpc3RlciBpcyByZXF1aXJlZCwgdGhlIGZpcnN0IGZpeGVkIHN0YWNrIG9iamVjdCBpcyByZXNlcnZlZCBhcyBpdHMKKyAgLy8vIHNwaWxsIHNsb3QuIFRoaXMgdGVsbHMgUEVJIG5vdCB0byBjcmVhdGUgYSBuZXcgc3RhY2sgZnJhbWUKKyAgLy8vIG9iamVjdCBmb3IgdGhlIGdpdmVuIHJlZ2lzdGVyLiBJdCBzaG91bGQgYmUgY2FsbGVkIG9ubHkgYWZ0ZXIKKyAgLy8vIGRldGVybWluZUNhbGxlZVNhdmVzKCkuCisgIHZpcnR1YWwgYm9vbCBoYXNSZXNlcnZlZFNwaWxsU2xvdChjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GLCB1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgJkZyYW1lSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbGl2ZS1pbnMgc2hvdWxkIGJlIHRyYWNrZWQgYWZ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbi4KKyAgdmlydHVhbCBib29sIHRyYWNrTGl2ZW5lc3NBZnRlclJlZ0FsbG9jKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gVHJ1ZSBpZiB0aGUgc3RhY2sgY2FuIGJlIHJlYWxpZ25lZCBmb3IgdGhlIHRhcmdldC4KKyAgdmlydHVhbCBib29sIGNhblJlYWxpZ25TdGFjayhjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSBjb25zdDsKKworICAvLy8gVHJ1ZSBpZiBzdG9yYWdlIHdpdGhpbiB0aGUgZnVuY3Rpb24gcmVxdWlyZXMgdGhlIHN0YWNrIHBvaW50ZXIgdG8gYmUKKyAgLy8vIGFsaWduZWQgbW9yZSB0aGFuIHRoZSBub3JtYWwgY2FsbGluZyBjb252ZW50aW9uIGNhbGxzIGZvci4KKyAgLy8vIFRoaXMgY2Fubm90IGJlIG92ZXJyaWRlbiBieSB0aGUgdGFyZ2V0LCBidXQgY2FuUmVhbGlnblN0YWNrIGNhbiBiZQorICAvLy8gb3ZlcnJpZGRlbi4KKyAgYm9vbCBuZWVkc1N0YWNrUmVhbGlnbm1lbnQoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgb2Zmc2V0IGZyb20gdGhlIHJlZmVyZW5jZWQgZnJhbWUgaW5kZXggaW4gdGhlIGluc3RydWN0aW9uLAorICAvLy8gaWYgdGhlcmUgaXMgb25lLgorICB2aXJ0dWFsIGludDY0X3QgZ2V0RnJhbWVJbmRleEluc3RyT2Zmc2V0KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IElkeCkgY29uc3QgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24ncyBmcmFtZSBpbmRleCByZWZlcmVuY2Ugd291bGQgYmUgYmV0dGVyCisgIC8vLyBzZXJ2ZWQgYnkgYSBiYXNlIHJlZ2lzdGVyIG90aGVyIHRoYW4gRlAgb3IgU1AuCisgIC8vLyBVc2VkIGJ5IExvY2FsU3RhY2tGcmFtZUFsbG9jYXRpb24gdG8gZGV0ZXJtaW5lIHdoaWNoIGZyYW1lIGluZGV4CisgIC8vLyByZWZlcmVuY2VzIGl0IHNob3VsZCBjcmVhdGUgbmV3IGJhc2UgcmVnaXN0ZXJzIGZvci4KKyAgdmlydHVhbCBib29sIG5lZWRzRnJhbWVCYXNlUmVnKE1hY2hpbmVJbnN0ciAqTUksIGludDY0X3QgT2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIEluc2VydCBkZWZpbmluZyBpbnN0cnVjdGlvbihzKSBmb3IgQmFzZVJlZyB0byBiZSBhIHBvaW50ZXIgdG8gRnJhbWVJZHgKKyAgLy8vIGJlZm9yZSBpbnNlcnRpb24gcG9pbnQgSS4KKyAgdmlydHVhbCB2b2lkIG1hdGVyaWFsaXplRnJhbWVCYXNlUmVnaXN0ZXIoTWFjaGluZUJhc2ljQmxvY2sgKk1CQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQmFzZVJlZywgaW50IEZyYW1lSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IE9mZnNldCkgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIm1hdGVyaWFsaXplRnJhbWVCYXNlUmVnaXN0ZXIgZG9lcyBub3QgZXhpc3Qgb24gdGhpcyAiCisgICAgICAgICAgICAgICAgICAgICAidGFyZ2V0Iik7CisgIH0KKworICAvLy8gUmVzb2x2ZSBhIGZyYW1lIGluZGV4IG9wZXJhbmQgb2YgYW4gaW5zdHJ1Y3Rpb24KKyAgLy8vIHRvIHJlZmVyZW5jZSB0aGUgaW5kaWNhdGVkIGJhc2UgcmVnaXN0ZXIgcGx1cyBvZmZzZXQgaW5zdGVhZC4KKyAgdmlydHVhbCB2b2lkIHJlc29sdmVGcmFtZUluZGV4KE1hY2hpbmVJbnN0ciAmTUksIHVuc2lnbmVkIEJhc2VSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IE9mZnNldCkgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoInJlc29sdmVGcmFtZUluZGV4IGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgdGFyZ2V0Iik7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgYSBnaXZlbiBiYXNlIHJlZ2lzdGVyIHBsdXMgb2Zmc2V0IGltbWVkaWF0ZSBpcworICAvLy8gZW5jb2RhYmxlIHRvIHJlc29sdmUgYSBmcmFtZSBpbmRleC4KKyAgdmlydHVhbCBib29sIGlzRnJhbWVPZmZzZXRMZWdhbChjb25zdCBNYWNoaW5lSW5zdHIgKk1JLCB1bnNpZ25lZCBCYXNlUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgT2Zmc2V0KSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiaXNGcmFtZU9mZnNldExlZ2FsIGRvZXMgbm90IGV4aXN0IG9uIHRoaXMgdGFyZ2V0Iik7CisgIH0KKworICAvLy8gU3BpbGwgdGhlIHJlZ2lzdGVyIHNvIGl0IGNhbiBiZSB1c2VkIGJ5IHRoZSByZWdpc3RlciBzY2F2ZW5nZXIuCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmVnaXN0ZXIgd2FzIHNwaWxsZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgLy8vIElmIHRoaXMgZnVuY3Rpb24gZG9lcyBub3Qgc3BpbGwgdGhlIHJlZ2lzdGVyLCB0aGUgc2NhdmVuZ2VyCisgIC8vLyB3aWxsIGluc3RlYWQgc3BpbGwgaXQgdG8gdGhlIGVtZXJnZW5jeSBzcGlsbCBzbG90LgorICB2aXJ0dWFsIGJvb2wgc2F2ZVNjYXZlbmdlclJlZ2lzdGVyKE1hY2hpbmVCYXNpY0Jsb2NrICZNQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yICZVc2VNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgbXVzdCBiZSBvdmVycmlkZW4gdG8gZWxpbWluYXRlIGFic3RyYWN0IGZyYW1lIGluZGljZXMgZnJvbQorICAvLy8gaW5zdHJ1Y3Rpb25zIHdoaWNoIG1heSB1c2UgdGhlbS4gVGhlIGluc3RydWN0aW9uIHJlZmVyZW5jZWQgYnkgdGhlCisgIC8vLyBpdGVyYXRvciBjb250YWlucyBhbiBNT19GcmFtZUluZGV4IG9wZXJhbmQgd2hpY2ggbXVzdCBiZSBlbGltaW5hdGVkIGJ5CisgIC8vLyB0aGlzIG1ldGhvZC4gVGhpcyBtZXRob2QgbWF5IG1vZGlmeSBvciByZXBsYWNlIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24sCisgIC8vLyBhcyBsb25nIGFzIGl0IGtlZXBzIHRoZSBpdGVyYXRvciBwb2ludGluZyBhdCB0aGUgZmluaXNoZWQgcHJvZHVjdC4KKyAgLy8vIFNQQWRqIGlzIHRoZSBTUCBhZGp1c3RtZW50IGR1ZSB0byBjYWxsIGZyYW1lIHNldHVwIGluc3RydWN0aW9uLgorICAvLy8gRklPcGVyYW5kTnVtIGlzIHRoZSBGSSBvcGVyYW5kIG51bWJlci4KKyAgdmlydHVhbCB2b2lkIGVsaW1pbmF0ZUZyYW1lSW5kZXgoTWFjaGluZUJhc2ljQmxvY2s6Oml0ZXJhdG9yIE1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgU1BBZGosIHVuc2lnbmVkIEZJT3BlcmFuZE51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVnU2NhdmVuZ2VyICpSUyA9IG51bGxwdHIpIGNvbnN0ID0gMDsKKworICAvLy8gUmV0dXJuIHRoZSBhc3NlbWJseSBuYW1lIGZvciBccCBSZWcuCisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldFJlZ0FzbU5hbWUodW5zaWduZWQgUmVnKSBjb25zdCB7CisgICAgLy8gRklYTUU6IFdlIGFyZSBhc3N1bWluZyB0aGF0IHRoZSBhc3NlbWJseSBuYW1lIGlzIGVxdWFsIHRvIHRoZSBUYWJsZUdlbgorICAgIC8vIG5hbWUgY29udmVydGVkIHRvIGxvd2VyIGNhc2UKKyAgICAvLworICAgIC8vIFRoZSBUYWJsZUdlbiBuYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBkZWZpbml0aW9uIGZvciB0aGlzIHJlZ2lzdGVyIGluIHRoZQorICAgIC8vIHRhcmdldCdzIHRhYmxlZ2VuIGZpbGVzLiAgRm9yIGV4YW1wbGUsIHRoZSBUYWJsZUdlbiBuYW1lIG9mCisgICAgLy8gZGVmIEVBWCA6IFJlZ2lzdGVyIDwuLi4+OyBpcyAiRUFYIgorICAgIHJldHVybiBTdHJpbmdSZWYoZ2V0TmFtZShSZWcpKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gU3VidGFyZ2V0IEhvb2tzCisKKyAgLy8vIFxicmllZiBTcmNSQyBhbmQgRHN0UkMgd2lsbCBiZSBtb3JwaGVkIGludG8gTmV3UkMgaWYgdGhpcyByZXR1cm5zIHRydWUuCisgIHZpcnR1YWwgYm9vbCBzaG91bGRDb2FsZXNjZShNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJDbGFzcyAqU3JjUkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTdWJSZWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRSZWdpc3RlckNsYXNzICpEc3RSQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERzdFN1YlJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKk5ld1JDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGl2ZUludGVydmFscyAmTElTKSBjb25zdAorICB7IHJldHVybiB0cnVlOyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vLyBEZWJ1ZyBpbmZvcm1hdGlvbiBxdWVyaWVzLgorCisgIC8vLyBnZXRGcmFtZVJlZ2lzdGVyIC0gVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgcmVnaXN0ZXIgdXNlZCBhcyBhIGJhc2UKKyAgLy8vIGZvciB2YWx1ZXMgYWxsb2NhdGVkIGluIHRoZSBjdXJyZW50IHN0YWNrIGZyYW1lLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldEZyYW1lUmVnaXN0ZXIoY29uc3QgTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3QgPSAwOworCisgIC8vLyBNYXJrIGEgcmVnaXN0ZXIgYW5kIGFsbCBpdHMgYWxpYXNlcyBhcyByZXNlcnZlZCBpbiB0aGUgZ2l2ZW4gc2V0LgorICB2b2lkIG1hcmtTdXBlclJlZ3MoQml0VmVjdG9yICZSZWdpc3RlclNldCwgdW5zaWduZWQgUmVnKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIGZvciBldmVyeSByZWdpc3RlciBpbiB0aGUgc2V0IGFsbCBzdXBlciByZWdpc3RlcnMgYXJlIHBhcnQKKyAgLy8vIG9mIHRoZSBzZXQgYXMgd2VsbC4KKyAgYm9vbCBjaGVja0FsbFN1cGVyUmVnc01hcmtlZChjb25zdCBCaXRWZWN0b3IgJlJlZ2lzdGVyU2V0LAorICAgICAgQXJyYXlSZWY8TUNQaHlzUmVnPiBFeGNlcHRpb25zID0gQXJyYXlSZWY8TUNQaHlzUmVnPigpKSBjb25zdDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1cGVyUmVnQ2xhc3NJdGVyYXRvcgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBJdGVyYXRlIG92ZXIgdGhlIHBvc3NpYmxlIHN1cGVyLXJlZ2lzdGVycyBmb3IgYSBnaXZlbiByZWdpc3RlciBjbGFzcy4gVGhlCisvLyBpdGVyYXRvciB3aWxsIHZpc2l0IGEgbGlzdCBvZiBwYWlycyAoSWR4LCBNYXNrKSBjb3JyZXNwb25kaW5nIHRvIHRoZQorLy8gcG9zc2libGUgY2xhc3NlcyBvZiBzdXBlci1yZWdpc3RlcnMuCisvLworLy8gRWFjaCBiaXQgbWFzayB3aWxsIGhhdmUgYXQgbGVhc3Qgb25lIHNldCBiaXQsIGFuZCBlYWNoIHNldCBiaXQgaW4gTWFzaworLy8gY29ycmVzcG9uZHMgdG8gYSBTdXBlclJDIHN1Y2ggdGhhdDoKKy8vCisvLyAgIEZvciBhbGwgUmVnIGluIFN1cGVyUkM6IFJlZzpJZHggaXMgaW4gUkMuCisvLworLy8gVGhlIGl0ZXJhdG9yIGNhbiBpbmNsdWRlIChPLCBSQy0+Z2V0U3ViQ2xhc3NNYXNrKCkpIGFzIHRoZSBmaXJzdCBlbnRyeSB3aGljaAorLy8gYWxzbyBzYXRpc2ZpZXMgdGhlIGFib3ZlIHJlcXVpcmVtZW50LCBhc3N1bWluZyBSZWc6MCA9PSBSZWcuCisvLworY2xhc3MgU3VwZXJSZWdDbGFzc0l0ZXJhdG9yIHsKKyAgY29uc3QgdW5zaWduZWQgUkNNYXNrV29yZHM7CisgIHVuc2lnbmVkIFN1YlJlZyA9IDA7CisgIGNvbnN0IHVpbnQxNl90ICpJZHg7CisgIGNvbnN0IHVpbnQzMl90ICpNYXNrOworCitwdWJsaWM6CisgIC8vLyBDcmVhdGUgYSBTdXBlclJlZ0NsYXNzSXRlcmF0b3IgdGhhdCB2aXNpdHMgYWxsIHRoZSBzdXBlci1yZWdpc3RlciBjbGFzc2VzCisgIC8vLyBvZiBSQy4gV2hlbiBJbmNsdWRlU2VsZiBpcyBzZXQsIGFsc28gaW5jbHVkZSB0aGUgKDAsIHN1Yi1jbGFzc2VzKSBlbnRyeS4KKyAgU3VwZXJSZWdDbGFzc0l0ZXJhdG9yKGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkksCisgICAgICAgICAgICAgICAgICAgICAgICBib29sIEluY2x1ZGVTZWxmID0gZmFsc2UpCisgICAgOiBSQ01hc2tXb3JkcygoVFJJLT5nZXROdW1SZWdDbGFzc2VzKCkgKyAzMSkgLyAzMiksCisgICAgICBJZHgoUkMtPmdldFN1cGVyUmVnSW5kaWNlcygpKSwgTWFzayhSQy0+Z2V0U3ViQ2xhc3NNYXNrKCkpIHsKKyAgICBpZiAoIUluY2x1ZGVTZWxmKQorICAgICAgKysqdGhpczsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpdGVyYXRvciBpcyBzdGlsbCBwb2ludGluZyBhdCBhIHZhbGlkIGVudHJ5LgorICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBJZHg7IH0KKworICAvLy8gUmV0dXJucyB0aGUgY3VycmVudCBzdWItcmVnaXN0ZXIgaW5kZXguCisgIHVuc2lnbmVkIGdldFN1YlJlZygpIGNvbnN0IHsgcmV0dXJuIFN1YlJlZzsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBiaXQgbWFzayBvZiByZWdpc3RlciBjbGFzc2VzIHRoYXQgZ2V0U3ViUmVnKCkgcHJvamVjdHMgaW50bworICAvLy8gUkMuCisgIC8vLyBTZWUgVGFyZ2V0UmVnaXN0ZXJDbGFzczo6Z2V0U3ViQ2xhc3NNYXNrKCkgZm9yIGhvdyB0byB1c2UgaXQuCisgIGNvbnN0IHVpbnQzMl90ICpnZXRNYXNrKCkgY29uc3QgeyByZXR1cm4gTWFzazsgfQorCisgIC8vLyBBZHZhbmNlIGl0ZXJhdG9yIHRvIHRoZSBuZXh0IGVudHJ5LgorICB2b2lkIG9wZXJhdG9yKysoKSB7CisgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiQ2Fubm90IG1vdmUgaXRlcmF0b3IgcGFzdCBlbmQuIik7CisgICAgTWFzayArPSBSQ01hc2tXb3JkczsKKyAgICBTdWJSZWcgPSAqSWR4Kys7CisgICAgaWYgKCFTdWJSZWcpCisgICAgICBJZHggPSBudWxscHRyOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBCaXRNYXNrQ2xhc3NJdGVyYXRvcgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBUaGlzIGNsYXNzIGVuY2FwdXNsYXRlcyB0aGUgbG9naWMgdG8gaXRlcmF0ZSBvdmVyIGJpdG1hc2sgcmV0dXJuZWQgYnkKKy8vLyB0aGUgdmFyaW91cyBSZWdDbGFzcyByZWxhdGVkIEFQSXMuCisvLy8gRS5nLiwgdGhpcyBjbGFzcyBjYW4gYmUgdXNlZCB0byBpdGVyYXRlIG92ZXIgdGhlIHN1YmNsYXNzZXMgcHJvdmlkZWQgYnkKKy8vLyBUYXJnZXRSZWdpc3RlckNsYXNzOjpnZXRTdWJDbGFzc01hc2sgb3IgU3VwZXJSZWdDbGFzc0l0ZXJhdG9yOjpnZXRNYXNrLgorY2xhc3MgQml0TWFza0NsYXNzSXRlcmF0b3IgeworICAvLy8gVG90YWwgbnVtYmVyIG9mIHJlZ2lzdGVyIGNsYXNzZXMuCisgIGNvbnN0IHVuc2lnbmVkIE51bVJlZ0NsYXNzZXM7CisgIC8vLyBCYXNlIGluZGV4IG9mIEN1cnJlbnRDaHVuay4KKyAgLy8vIEluIG90aGVyIHdvcmRzLCB0aGUgbnVtYmVyIG9mIGJpdCB3ZSByZWFkIHRvIGdldCBhdCB0aGUKKyAgLy8vIGJlZ2lubmluZyBvZiB0aGF0IGNodW5jay4KKyAgdW5zaWduZWQgQmFzZSA9IDA7CisgIC8vLyBBZGp1c3QgYmFzZSBpbmRleCBvZiBDdXJyZW50Q2h1bmsuCisgIC8vLyBCYXNlIGluZGV4ICsgaG93IG1hbnkgYml0IHdlIHJlYWQgd2l0aGluIEN1cnJlbnRDaHVuay4KKyAgdW5zaWduZWQgSWR4ID0gMDsKKyAgLy8vIEN1cnJlbnQgcmVnaXN0ZXIgY2xhc3MgSUQuCisgIHVuc2lnbmVkIElEID0gMDsKKyAgLy8vIE1hc2sgd2UgYXJlIGl0ZXJhdGluZyBvdmVyLgorICBjb25zdCB1aW50MzJfdCAqTWFzazsKKyAgLy8vIEN1cnJlbnQgY2h1bmsgb2YgdGhlIE1hc2sgd2UgYXJlIHRyYXZlcnNpbmcuCisgIHVpbnQzMl90IEN1cnJlbnRDaHVuazsKKworICAvLy8gTW92ZSBJRCB0byB0aGUgbmV4dCBzZXQgYml0LgorICB2b2lkIG1vdmVUb05leHRJRCgpIHsKKyAgICAvLyBJZiB0aGUgY3VycmVudCBjaHVuayBvZiBtZW1vcnkgaXMgZW1wdHksIG1vdmUgdG8gdGhlIG5leHQgb25lLAorICAgIC8vIHdoaWxlIG1ha2luZyBzdXJlIHdlIGRvIG5vdCBnbyBwYXNzIHRoZSBudW1iZXIgb2YgcmVnaXN0ZXIKKyAgICAvLyBjbGFzc2VzLgorICAgIHdoaWxlICghQ3VycmVudENodW5rKSB7CisgICAgICAvLyBNb3ZlIHRvIHRoZSBuZXh0IGNodW5rLgorICAgICAgQmFzZSArPSAzMjsKKyAgICAgIGlmIChCYXNlID49IE51bVJlZ0NsYXNzZXMpIHsKKyAgICAgICAgSUQgPSBOdW1SZWdDbGFzc2VzOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICBDdXJyZW50Q2h1bmsgPSAqKytNYXNrOworICAgICAgSWR4ID0gQmFzZTsKKyAgICB9CisgICAgLy8gT3RoZXJ3aXNlIGxvb2sgZm9yIHRoZSBmaXJzdCBiaXQgc2V0IGZyb20gdGhlIHJpZ2h0CisgICAgLy8gKHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjbGFzcyBJRCBpcyBiaWcgZW5kaWFuKS4KKyAgICAvLyBTZWUgZ2V0U3ViQ2xhc3NNYXNrIGZvciBtb3JlIGRldGFpbHMgb24gdGhlIHJlcHJlc2VudGF0aW9uLgorICAgIHVuc2lnbmVkIE9mZnNldCA9IGNvdW50VHJhaWxpbmdaZXJvcyhDdXJyZW50Q2h1bmspOworICAgIC8vIEFkZCB0aGUgT2Zmc2V0IHRvIHRoZSBhZGp1c3RlZCBiYXNlIG51bWJlciBvZiB0aGlzIGNodW5rOiBJZHguCisgICAgLy8gVGhpcyBpcyB0aGUgSUQgb2YgdGhlIHJlZ2lzdGVyIGNsYXNzLgorICAgIElEID0gSWR4ICsgT2Zmc2V0OworCisgICAgLy8gQ29uc3VtZSB0aGUgemVyb3MsIGlmIGFueSwgYW5kIHRoZSBiaXQgd2UganVzdCByZWFkCisgICAgLy8gc28gdGhhdCB3ZSBhcmUgYXQgdGhlIHJpZ2h0IHNwb3QgZm9yIHRoZSBuZXh0IGNhbGwuCisgICAgLy8gRG8gbm90IGRvIE9mZnNldCArIDEgYmVjYXVzZSBPZmZzZXQgbWF5IGJlIDMxIGFuZCAzMgorICAgIC8vIHdpbGwgYmUgVUIgZm9yIHRoZSBzaGlmdCwgdGhvdWdoIGluIHRoYXQgY2FzZSB3ZSBjb3VsZAorICAgIC8vIGhhdmUgbWFrZSB0aGUgY2h1bmsgYmVpbmcgZXF1YWwgdG8gMCwgYnV0IHRoYXQgd291bGQKKyAgICAvLyBoYXZlIGludHJvZHVjZWQgYSBpZiBzdGF0ZW1lbnQuCisgICAgbW92ZU5CaXRzKE9mZnNldCk7CisgICAgbW92ZU5CaXRzKDEpOworICB9CisKKyAgLy8vIE1vdmUgXHAgTnVtQml0cyBCaXRzIGZvcndhcmQgaW4gQ3VycmVudENodW5rLgorICB2b2lkIG1vdmVOQml0cyh1bnNpZ25lZCBOdW1CaXRzKSB7CisgICAgYXNzZXJ0KE51bUJpdHMgPCAzMiAmJiAiVW5kZWZpbmVkIGJlaGF2aW9yIHNwb3R0ZWQhIik7CisgICAgLy8gQ29uc3VtZSB0aGUgYml0IHdlIHJlYWQgZm9yIHRoZSBuZXh0IGNhbGwuCisgICAgQ3VycmVudENodW5rID4+PSBOdW1CaXRzOworICAgIC8vIEFkanVzdCB0aGUgYmFzZSBmb3IgdGhlIGNodW5rLgorICAgIElkeCArPSBOdW1CaXRzOworICB9CisKK3B1YmxpYzoKKyAgLy8vIENyZWF0ZSBhIEJpdE1hc2tDbGFzc0l0ZXJhdG9yIHRoYXQgdmlzaXRzIGFsbCB0aGUgcmVnaXN0ZXIgY2xhc3NlcworICAvLy8gcmVwcmVzZW50ZWQgYnkgXHAgTWFzay4KKyAgLy8vCisgIC8vLyBccHJlIFxwIE1hc2sgIT0gbnVsbHB0cgorICBCaXRNYXNrQ2xhc3NJdGVyYXRvcihjb25zdCB1aW50MzJfdCAqTWFzaywgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZUUkkpCisgICAgICA6IE51bVJlZ0NsYXNzZXMoVFJJLmdldE51bVJlZ0NsYXNzZXMoKSksIE1hc2soTWFzayksIEN1cnJlbnRDaHVuaygqTWFzaykgeworICAgIC8vIE1vdmUgdG8gdGhlIGZpcnN0IElELgorICAgIG1vdmVUb05leHRJRCgpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGl0ZXJhdG9yIGlzIHN0aWxsIHBvaW50aW5nIGF0IGEgdmFsaWQgZW50cnkuCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIGdldElEKCkgIT0gTnVtUmVnQ2xhc3NlczsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBjdXJyZW50IHJlZ2lzdGVyIGNsYXNzIElELgorICB1bnNpZ25lZCBnZXRJRCgpIGNvbnN0IHsgcmV0dXJuIElEOyB9CisKKyAgLy8vIEFkdmFuY2UgaXRlcmF0b3IgdG8gdGhlIG5leHQgZW50cnkuCisgIHZvaWQgb3BlcmF0b3IrKygpIHsKKyAgICBhc3NlcnQoaXNWYWxpZCgpICYmICJDYW5ub3QgbW92ZSBpdGVyYXRvciBwYXN0IGVuZC4iKTsKKyAgICBtb3ZlVG9OZXh0SUQoKTsKKyAgfQorfTsKKworLy8gVGhpcyBpcyB1c2VmdWwgd2hlbiBidWlsZGluZyBJbmRleGVkTWFwcyBrZXllZCBvbiB2aXJ0dWFsIHJlZ2lzdGVycworc3RydWN0IFZpcnRSZWcySW5kZXhGdW5jdG9yIHsKKyAgdXNpbmcgYXJndW1lbnRfdHlwZSA9IHVuc2lnbmVkOworICB1bnNpZ25lZCBvcGVyYXRvcigpKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIHJldHVybiBUYXJnZXRSZWdpc3RlckluZm86OnZpcnRSZWcySW5kZXgoUmVnKTsKKyAgfQorfTsKKworLy8vIFByaW50cyB2aXJ0dWFsIGFuZCBwaHlzaWNhbCByZWdpc3RlcnMgd2l0aCBvciB3aXRob3V0IGEgVFJJIGluc3RhbmNlLgorLy8vCisvLy8gVGhlIGZvcm1hdCBpczoKKy8vLyAgICVub3JlZyAgICAgICAgICAtIE5vUmVnaXN0ZXIKKy8vLyAgICU1ICAgICAgICAgICAgICAtIGEgdmlydHVhbCByZWdpc3Rlci4KKy8vLyAgICU1OnN1Yl84Yml0ICAgICAtIGEgdmlydHVhbCByZWdpc3RlciB3aXRoIHN1Yi1yZWdpc3RlciBpbmRleCAod2l0aCBUUkkpLgorLy8vICAgJWVheCAgICAgICAgICAgIC0gYSBwaHlzaWNhbCByZWdpc3RlcgorLy8vICAgJXBoeXNyZWcxNyAgICAgIC0gYSBwaHlzaWNhbCByZWdpc3RlciB3aGVuIG5vIFRSSSBpbnN0YW5jZSBnaXZlbi4KKy8vLworLy8vIFVzYWdlOiBPUyA8PCBwcmludFJlZyhSZWcsIFRSSSwgU3ViUmVnSWR4KSA8PCAnXG4nOworUHJpbnRhYmxlIHByaW50UmVnKHVuc2lnbmVkIFJlZywgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpUUkkgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFN1YlJlZ0lkeCA9IDAsCisgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAqTVJJID0gbnVsbHB0cik7CisKKy8vLyBDcmVhdGUgUHJpbnRhYmxlIG9iamVjdCB0byBwcmludCByZWdpc3RlciB1bml0cyBvbiBhIFxyZWYgcmF3X29zdHJlYW0uCisvLy8KKy8vLyBSZWdpc3RlciB1bml0cyBhcmUgbmFtZWQgYWZ0ZXIgdGhlaXIgcm9vdCByZWdpc3RlcnM6CisvLy8KKy8vLyAgIGFsICAgICAgLSBTaW5nbGUgcm9vdC4KKy8vLyAgIGZwMH5zdDcgLSBEdWFsIHJvb3RzLgorLy8vCisvLy8gVXNhZ2U6IE9TIDw8IHByaW50UmVnVW5pdChVbml0LCBUUkkpIDw8ICdcbic7CitQcmludGFibGUgcHJpbnRSZWdVbml0KHVuc2lnbmVkIFVuaXQsIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKTsKKworLy8vIFxicmllZiBDcmVhdGUgUHJpbnRhYmxlIG9iamVjdCB0byBwcmludCB2aXJ0dWFsIHJlZ2lzdGVycyBhbmQgcGh5c2ljYWwKKy8vLyByZWdpc3RlcnMgb24gYSBccmVmIHJhd19vc3RyZWFtLgorUHJpbnRhYmxlIHByaW50VlJlZ09yVW5pdCh1bnNpZ25lZCBWUmVnT3JVbml0LCBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSSk7CisKKy8vLyBcYnJpZWYgQ3JlYXRlIFByaW50YWJsZSBvYmplY3QgdG8gcHJpbnQgcmVnaXN0ZXIgY2xhc3NlcyBvciByZWdpc3RlciBiYW5rcworLy8vIG9uIGEgXHJlZiByYXdfb3N0cmVhbS4KK1ByaW50YWJsZSBwcmludFJlZ0NsYXNzT3JCYW5rKHVuc2lnbmVkIFJlZywgY29uc3QgTWFjaGluZVJlZ2lzdGVySW5mbyAmUmVnSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFJlZ2lzdGVySW5mbyAqVFJJKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9UQVJHRVRSRUdJU1RFUklORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldFNjaGVkdWxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVGFyZ2V0U2NoZWR1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMDQ0ZjBiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1RhcmdldFNjaGVkdWxlLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vVGFyZ2V0U2NoZWR1bGUuaCAtIFNjaGVkIE1hY2hpbmUgTW9kZWwgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSB3cmFwcGVyIGFyb3VuZCBNQ1NjaGVkTW9kZWwgdGhhdCBhbGxvd3MgdGhlIGludGVyZmFjZSB0bworLy8gYmVuZWZpdCBmcm9tIGluZm9ybWF0aW9uIGN1cnJlbnRseSBvbmx5IGF2YWlsYWJsZSBpbiBUYXJnZXRJbnN0ckluZm8uCisvLyBJZGVhbGx5LCB0aGUgc2NoZWR1bGluZyBpbnRlcmZhY2Ugd291bGQgYmUgZnVsbHkgZGVmaW5lZCBpbiB0aGUgTUMgbGF5ZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fVEFSR0VUU0NIRURVTEVfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fVEFSR0VUU0NIRURVTEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRTdWJ0YXJnZXRJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3RySXRpbmVyYXJpZXMuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU2NoZWR1bGUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lSW5zdHI7CitjbGFzcyBUYXJnZXRJbnN0ckluZm87CisKKy8vLyBQcm92aWRlIGFuIGluc3RydWN0aW9uIHNjaGVkdWxpbmcgbWFjaGluZSBtb2RlbCB0byBDb2RlR2VuIHBhc3Nlcy4KK2NsYXNzIFRhcmdldFNjaGVkTW9kZWwgeworICAvLyBGb3IgZWZmaWNpZW5jeSwgaG9sZCBhIGNvcHkgb2YgdGhlIHN0YXRpY2FsbHkgZGVmaW5lZCBNQ1NjaGVkTW9kZWwgZm9yIHRoaXMKKyAgLy8gcHJvY2Vzc29yLgorICBNQ1NjaGVkTW9kZWwgU2NoZWRNb2RlbDsKKyAgSW5zdHJJdGluZXJhcnlEYXRhIEluc3RySXRpbnM7CisgIGNvbnN0IFRhcmdldFN1YnRhcmdldEluZm8gKlNUSSA9IG51bGxwdHI7CisgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqVElJID0gbnVsbHB0cjsKKworICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgMTY+IFJlc291cmNlRmFjdG9yczsKKyAgdW5zaWduZWQgTWljcm9PcEZhY3RvcjsgLy8gTXVsdGlwbHkgdG8gbm9ybWFsaXplIG1pY3Jvb3BzIHRvIHJlc291cmNlIHVuaXRzLgorICB1bnNpZ25lZCBSZXNvdXJjZUxDTTsgICAvLyBSZXNvdXJjZSB1bml0cyBwZXIgY3ljbGUuIExhdGVuY3kgbm9ybWFsaXphdGlvbiBmYWN0b3IuCisKKyAgdW5zaWduZWQgY29tcHV0ZUluc3RyTGF0ZW5jeShjb25zdCBNQ1NjaGVkQ2xhc3NEZXNjICZTQ0Rlc2MpIGNvbnN0OworCitwdWJsaWM6CisgIFRhcmdldFNjaGVkTW9kZWwoKSA6IFNjaGVkTW9kZWwoTUNTY2hlZE1vZGVsOjpHZXREZWZhdWx0U2NoZWRNb2RlbCgpKSB7fQorCisgIC8vLyBcYnJpZWYgSW5pdGlhbGl6ZSB0aGUgbWFjaGluZSBtb2RlbCBmb3IgaW5zdHJ1Y3Rpb24gc2NoZWR1bGluZy4KKyAgLy8vCisgIC8vLyBUaGUgbWFjaGluZSBtb2RlbCBBUEkga2VlcHMgYSBjb3B5IG9mIHRoZSB0b3AtbGV2ZWwgTUNTY2hlZE1vZGVsIHRhYmxlCisgIC8vLyBpbmRpY2VzIGFuZCBtYXkgcXVlcnkgVGFyZ2V0U3VidGFyZ2V0SW5mbyBhbmQgVGFyZ2V0SW5zdHJJbmZvIHRvIHJlc29sdmUKKyAgLy8vIGR5bmFtaWMgcHJvcGVydGllcy4KKyAgdm9pZCBpbml0KGNvbnN0IE1DU2NoZWRNb2RlbCAmc20sIGNvbnN0IFRhcmdldFN1YnRhcmdldEluZm8gKnN0aSwKKyAgICAgICAgICAgIGNvbnN0IFRhcmdldEluc3RySW5mbyAqdGlpKTsKKworICAvLy8gUmV0dXJuIHRoZSBNQ1NjaGVkQ2xhc3NEZXNjIGZvciB0aGlzIGluc3RydWN0aW9uLgorICBjb25zdCBNQ1NjaGVkQ2xhc3NEZXNjICpyZXNvbHZlU2NoZWRDbGFzcyhjb25zdCBNYWNoaW5lSW5zdHIgKk1JKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFRhcmdldFN1YnRhcmdldEluZm8gZ2V0dGVyLgorICBjb25zdCBUYXJnZXRTdWJ0YXJnZXRJbmZvICpnZXRTdWJ0YXJnZXRJbmZvKCkgY29uc3QgeyByZXR1cm4gU1RJOyB9CisKKyAgLy8vIFxicmllZiBUYXJnZXRJbnN0ckluZm8gZ2V0dGVyLgorICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKmdldEluc3RySW5mbygpIGNvbnN0IHsgcmV0dXJuIFRJSTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBtYWNoaW5lIG1vZGVsIGluY2x1ZGVzIGFuIGluc3RydWN0aW9uLWxldmVsCisgIC8vLyBzY2hlZHVsaW5nIG1vZGVsLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgbW9yZSBkZXRhaWxlZCB0aGFuIHRoZSBjb3Vyc2UgZ3JhaW4gSXNzdWVXaWR0aCBhbmQgZGVmYXVsdAorICAvLy8gbGF0ZW5jeSBwcm9wZXJ0aWVzLCBidXQgc2VwYXJhdGUgZnJvbSB0aGUgcGVyLWN5Y2xlIGl0aW5lcmFyeSBkYXRhLgorICBib29sIGhhc0luc3RyU2NoZWRNb2RlbCgpIGNvbnN0OworCisgIGNvbnN0IE1DU2NoZWRNb2RlbCAqZ2V0TUNTY2hlZE1vZGVsKCkgY29uc3QgeyByZXR1cm4gJlNjaGVkTW9kZWw7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgbWFjaGluZSBtb2RlbCBpbmNsdWRlcyBjeWNsZS10by1jeWNsZSBpdGluZXJhcnkKKyAgLy8vIGRhdGEuCisgIC8vLworICAvLy8gVGhpcyBtb2RlbHMgc2NoZWR1bGluZyBhdCBlYWNoIHN0YWdlIGluIHRoZSBwcm9jZXNzb3IgcGlwZWxpbmUuCisgIGJvb2wgaGFzSW5zdHJJdGluZXJhcmllcygpIGNvbnN0OworCisgIGNvbnN0IEluc3RySXRpbmVyYXJ5RGF0YSAqZ2V0SW5zdHJJdGluZXJhcmllcygpIGNvbnN0IHsKKyAgICBpZiAoaGFzSW5zdHJJdGluZXJhcmllcygpKQorICAgICAgcmV0dXJuICZJbnN0ckl0aW5zOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG1hY2hpbmUgbW9kZWwgaW5jbHVkZXMgYW4gaW5zdHJ1Y3Rpb24tbGV2ZWwKKyAgLy8vIHNjaGVkdWxpbmcgbW9kZWwgb3IgY3ljbGUtdG8tY3ljbGUgaXRpbmVyYXJ5IGRhdGEuCisgIGJvb2wgaGFzSW5zdHJTY2hlZE1vZGVsT3JJdGluZXJhcmllcygpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzSW5zdHJTY2hlZE1vZGVsKCkgfHwgaGFzSW5zdHJJdGluZXJhcmllcygpOworICB9CisKKyAgLy8vIFxicmllZiBJZGVudGlmeSB0aGUgcHJvY2Vzc29yIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgc3VidGFyZ2V0LgorICB1bnNpZ25lZCBnZXRQcm9jZXNzb3JJRCgpIGNvbnN0IHsgcmV0dXJuIFNjaGVkTW9kZWwuZ2V0UHJvY2Vzc29ySUQoKTsgfQorCisgIC8vLyBcYnJpZWYgTWF4aW11bSBudW1iZXIgb2YgbWljcm8tb3BzIHRoYXQgbWF5IGJlIHNjaGVkdWxlZCBwZXIgY3ljbGUuCisgIHVuc2lnbmVkIGdldElzc3VlV2lkdGgoKSBjb25zdCB7IHJldHVybiBTY2hlZE1vZGVsLklzc3VlV2lkdGg7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIG5ldyBncm91cCBtdXN0IGJlZ2luLgorICBib29sIG11c3RCZWdpbkdyb3VwKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU2NoZWRDbGFzc0Rlc2MgKlNDID0gbnVsbHB0cikgY29uc3Q7CisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgY3VycmVudCBncm91cCBtdXN0IGVuZC4KKyAgYm9vbCBtdXN0RW5kR3JvdXAoY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTY2hlZENsYXNzRGVzYyAqU0MgPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGlzc3VlIHNsb3RzIHJlcXVpcmVkIGZvciB0aGlzIE1JLgorICB1bnNpZ25lZCBnZXROdW1NaWNyb09wcyhjb25zdCBNYWNoaW5lSW5zdHIgKk1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1NjaGVkQ2xhc3NEZXNjICpTQyA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBudW1iZXIgb2Yga2luZHMgb2YgcmVzb3VyY2VzIGZvciB0aGlzIHRhcmdldC4KKyAgdW5zaWduZWQgZ2V0TnVtUHJvY1Jlc291cmNlS2luZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIFNjaGVkTW9kZWwuZ2V0TnVtUHJvY1Jlc291cmNlS2luZHMoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGEgcHJvY2Vzc29yIHJlc291cmNlIGJ5IElEIGZvciBjb252ZW5pZW5jZS4KKyAgY29uc3QgTUNQcm9jUmVzb3VyY2VEZXNjICpnZXRQcm9jUmVzb3VyY2UodW5zaWduZWQgUElkeCkgY29uc3QgeworICAgIHJldHVybiBTY2hlZE1vZGVsLmdldFByb2NSZXNvdXJjZShQSWR4KTsKKyAgfQorCisjaWYgIWRlZmluZWQoTkRFQlVHKSB8fCBkZWZpbmVkKExMVk1fRU5BQkxFX0RVTVApCisgIGNvbnN0IGNoYXIgKmdldFJlc291cmNlTmFtZSh1bnNpZ25lZCBQSWR4KSBjb25zdCB7CisgICAgaWYgKCFQSWR4KQorICAgICAgcmV0dXJuICJNT3BzIjsKKyAgICByZXR1cm4gU2NoZWRNb2RlbC5nZXRQcm9jUmVzb3VyY2UoUElkeCktPk5hbWU7CisgIH0KKyNlbmRpZgorCisgIHVzaW5nIFByb2NSZXNJdGVyID0gY29uc3QgTUNXcml0ZVByb2NSZXNFbnRyeSAqOworCisgIC8vIFxicmllZiBHZXQgYW4gaXRlcmF0b3IgaW50byB0aGUgcHJvY2Vzc29yIHJlc291cmNlcyBjb25zdW1lZCBieSB0aGlzCisgIC8vIHNjaGVkdWxpbmcgY2xhc3MuCisgIFByb2NSZXNJdGVyIGdldFdyaXRlUHJvY1Jlc0JlZ2luKGNvbnN0IE1DU2NoZWRDbGFzc0Rlc2MgKlNDKSBjb25zdCB7CisgICAgLy8gVGhlIHN1YnRhcmdldCBob2xkcyBhIHNpbmdsZSByZXNvdXJjZSB0YWJsZSBmb3IgYWxsIHByb2Nlc3NvcnMuCisgICAgcmV0dXJuIFNUSS0+Z2V0V3JpdGVQcm9jUmVzQmVnaW4oU0MpOworICB9CisgIFByb2NSZXNJdGVyIGdldFdyaXRlUHJvY1Jlc0VuZChjb25zdCBNQ1NjaGVkQ2xhc3NEZXNjICpTQykgY29uc3QgeworICAgIHJldHVybiBTVEktPmdldFdyaXRlUHJvY1Jlc0VuZChTQyk7CisgIH0KKworICAvLy8gXGJyaWVmIE11bHRpcGx5IHRoZSBudW1iZXIgb2YgdW5pdHMgY29uc3VtZWQgZm9yIGEgcmVzb3VyY2UgYnkgdGhpcyBmYWN0b3IKKyAgLy8vIHRvIG5vcm1hbGl6ZSBpdCByZWxhdGl2ZSB0byBvdGhlciByZXNvdXJjZXMuCisgIHVuc2lnbmVkIGdldFJlc291cmNlRmFjdG9yKHVuc2lnbmVkIFJlc0lkeCkgY29uc3QgeworICAgIHJldHVybiBSZXNvdXJjZUZhY3RvcnNbUmVzSWR4XTsKKyAgfQorCisgIC8vLyBcYnJpZWYgTXVsdGlwbHkgbnVtYmVyIG9mIG1pY3JvLW9wcyBieSB0aGlzIGZhY3RvciB0byBub3JtYWxpemUgaXQKKyAgLy8vIHJlbGF0aXZlIHRvIG90aGVyIHJlc291cmNlcy4KKyAgdW5zaWduZWQgZ2V0TWljcm9PcEZhY3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gTWljcm9PcEZhY3RvcjsKKyAgfQorCisgIC8vLyBcYnJpZWYgTXVsdGlwbHkgY3ljbGUgY291bnQgYnkgdGhpcyBmYWN0b3IgdG8gbm9ybWFsaXplIGl0IHJlbGF0aXZlIHRvCisgIC8vLyBvdGhlciByZXNvdXJjZXMuIFRoaXMgaXMgdGhlIG51bWJlciBvZiByZXNvdXJjZSB1bml0cyBwZXIgY3ljbGUuCisgIHVuc2lnbmVkIGdldExhdGVuY3lGYWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIFJlc291cmNlTENNOworICB9CisKKyAgLy8vIFxicmllZiBOdW1iZXIgb2YgbWljcm8tb3BzIHRoYXQgbWF5IGJlIGJ1ZmZlcmVkIGZvciBPT08gZXhlY3V0aW9uLgorICB1bnNpZ25lZCBnZXRNaWNyb09wQnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNjaGVkTW9kZWwuTWljcm9PcEJ1ZmZlclNpemU7IH0KKworICAvLy8gXGJyaWVmIE51bWJlciBvZiByZXNvdXJjZSB1bml0cyB0aGF0IG1heSBiZSBidWZmZXJlZCBmb3IgT09PIGV4ZWN1dGlvbi4KKyAgLy8vIFxyZXR1cm4gVGhlIGJ1ZmZlciBzaXplIGluIHJlc291cmNlIHVuaXRzIG9yIC0xIGZvciB1bmxpbWl0ZWQuCisgIGludCBnZXRSZXNvdXJjZUJ1ZmZlclNpemUodW5zaWduZWQgUElkeCkgY29uc3QgeworICAgIHJldHVybiBTY2hlZE1vZGVsLmdldFByb2NSZXNvdXJjZShQSWR4KS0+QnVmZmVyU2l6ZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ29tcHV0ZSBvcGVyYW5kIGxhdGVuY3kgYmFzZWQgb24gdGhlIGF2YWlsYWJsZSBtYWNoaW5lIG1vZGVsLgorICAvLy8KKyAgLy8vIENvbXB1dGUgYW5kIHJldHVybiB0aGUgbGF0ZW5jeSBvZiB0aGUgZ2l2ZW4gZGF0YSBkZXBlbmRlbnQgZGVmIGFuZCB1c2UKKyAgLy8vIHdoZW4gdGhlIG9wZXJhbmQgaW5kaWNlcyBhcmUgYWxyZWFkeSBrbm93bi4gVXNlTUkgbWF5IGJlIE5VTEwgZm9yIGFuCisgIC8vLyB1bmtub3duIHVzZXIuCisgIHVuc2lnbmVkIGNvbXB1dGVPcGVyYW5kTGF0ZW5jeShjb25zdCBNYWNoaW5lSW5zdHIgKkRlZk1JLCB1bnNpZ25lZCBEZWZPcGVySWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICpVc2VNSSwgdW5zaWduZWQgVXNlT3BlcklkeCkKKyAgICBjb25zdDsKKworICAvLy8gXGJyaWVmIENvbXB1dGUgdGhlIGluc3RydWN0aW9uIGxhdGVuY3kgYmFzZWQgb24gdGhlIGF2YWlsYWJsZSBtYWNoaW5lCisgIC8vLyBtb2RlbC4KKyAgLy8vCisgIC8vLyBDb21wdXRlIGFuZCByZXR1cm4gdGhlIGV4cGVjdGVkIGxhdGVuY3kgb2YgdGhpcyBpbnN0cnVjdGlvbiBpbmRlcGVuZGVudCBvZgorICAvLy8gYSBwYXJ0aWN1bGFyIHVzZS4gY29tcHV0ZU9wZXJhbmRMYXRlbmN5IGlzIHRoZSBwcmVmZXJyZWQgQVBJLCBidXQgdGhpcyBpcworICAvLy8gb2NjYXNpb25hbGx5IHVzZWZ1bCB0byBoZWxwIGVzdGltYXRlIGluc3RydWN0aW9uIGNvc3QuCisgIC8vLworICAvLy8gSWYgVXNlRGVmYXVsdERlZkxhdGVuY3kgaXMgZmFsc2UgYW5kIG5vIG5ldyBtYWNoaW5lIHNjaGVkIG1vZGVsIGlzCisgIC8vLyBwcmVzZW50IHRoaXMgbWV0aG9kIGZhbGxzIGJhY2sgdG8gVElJLT5nZXRJbnN0ckxhdGVuY3kgd2l0aCBhbiBlbXB0eQorICAvLy8gaW5zdHJ1Y3Rpb24gaXRpbmVyYXJ5ICh0aGlzIGlzIHNvIHdlIHByZXNlcnZlIHRoZSBwcmV2aW91cyBiZWhhdmlvciBvZiB0aGUKKyAgLy8vIGlmIGNvbnZlcnRlciBhZnRlciBtb3ZpbmcgaXQgdG8gVGFyZ2V0U2NoZWRNb2RlbCkuCisgIHVuc2lnbmVkIGNvbXB1dGVJbnN0ckxhdGVuY3koY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVzZURlZmF1bHREZWZMYXRlbmN5ID0gdHJ1ZSkgY29uc3Q7CisgIHVuc2lnbmVkIGNvbXB1dGVJbnN0ckxhdGVuY3kodW5zaWduZWQgT3Bjb2RlKSBjb25zdDsKKworCisgIC8vLyBcYnJpZWYgT3V0cHV0IGRlcGVuZGVuY3kgbGF0ZW5jeSBvZiBhIHBhaXIgb2YgZGVmcyBvZiB0aGUgc2FtZSByZWdpc3Rlci4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHR5cGljYWxseSBvbmUgY3ljbGUuCisgIHVuc2lnbmVkIGNvbXB1dGVPdXRwdXRMYXRlbmN5KGNvbnN0IE1hY2hpbmVJbnN0ciAqRGVmTUksIHVuc2lnbmVkIERlZklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICpEZXBNSSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDb21wdXRlIHRoZSByZWNpcHJvY2FsIHRocm91Z2hwdXQgb2YgdGhlIGdpdmVuIGluc3RydWN0aW9uLgorICBPcHRpb25hbDxkb3VibGU+IGNvbXB1dGVJbnN0clJUaHJvdWdocHV0KGNvbnN0IE1hY2hpbmVJbnN0ciAqTUkpIGNvbnN0OworICBPcHRpb25hbDxkb3VibGU+IGNvbXB1dGVJbnN0clJUaHJvdWdocHV0KHVuc2lnbmVkIE9wY29kZSkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1RBUkdFVFNDSEVEVUxFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9UYXJnZXRTdWJ0YXJnZXRJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVGFyZ2V0U3VidGFyZ2V0SW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlNWZhYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVGFyZ2V0U3VidGFyZ2V0SW5mby5oCkBAIC0wLDAgKzEsMjYxIEBACisvLz09PS0gbGx2bS9Db2RlR2VuL1RhcmdldFN1YnRhcmdldEluZm8uaCAtIFRhcmdldCBJbmZvcm1hdGlvbiAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHN1YnRhcmdldCBvcHRpb25zIG9mIGEgVGFyZ2V0IG1hY2hpbmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fVEFSR0VUU1VCVEFSR0VUSU5GT19ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9UQVJHRVRTVUJUQVJHRVRJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vUEJRUFJBQ29uc3RyYWludC5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9TY2hlZHVsZURBR011dGF0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1NjaGVkdWxlclJlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N1YnRhcmdldEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29kZUdlbi5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBDYWxsTG93ZXJpbmc7CitjbGFzcyBJbnN0ckl0aW5lcmFyeURhdGE7CitzdHJ1Y3QgSW5zdHJTdGFnZTsKK2NsYXNzIEluc3RydWN0aW9uU2VsZWN0b3I7CitjbGFzcyBMZWdhbGl6ZXJJbmZvOworY2xhc3MgTWFjaGluZUluc3RyOworc3RydWN0IE1hY2hpbmVTY2hlZFBvbGljeTsKK3N0cnVjdCBNQ1JlYWRBZHZhbmNlRW50cnk7CitzdHJ1Y3QgTUNXcml0ZUxhdGVuY3lFbnRyeTsKK3N0cnVjdCBNQ1dyaXRlUHJvY1Jlc0VudHJ5OworY2xhc3MgUmVnaXN0ZXJCYW5rSW5mbzsKK2NsYXNzIFNEZXA7CitjbGFzcyBTZWxlY3Rpb25EQUdUYXJnZXRJbmZvOworc3RydWN0IFN1YnRhcmdldEZlYXR1cmVLVjsKK3N0cnVjdCBTdWJ0YXJnZXRJbmZvS1Y7CitjbGFzcyBTVW5pdDsKK2NsYXNzIFRhcmdldEZyYW1lTG93ZXJpbmc7CitjbGFzcyBUYXJnZXRJbnN0ckluZm87CitjbGFzcyBUYXJnZXRMb3dlcmluZzsKK2NsYXNzIFRhcmdldFJlZ2lzdGVyQ2xhc3M7CitjbGFzcyBUYXJnZXRSZWdpc3RlckluZm87CitjbGFzcyBUYXJnZXRTY2hlZE1vZGVsOworY2xhc3MgVHJpcGxlOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gVGFyZ2V0U3VidGFyZ2V0SW5mbyAtIEdlbmVyaWMgYmFzZSBjbGFzcyBmb3IgYWxsIHRhcmdldCBzdWJ0YXJnZXRzLiAgQWxsCisvLy8gVGFyZ2V0LXNwZWNpZmljIG9wdGlvbnMgdGhhdCBjb250cm9sIGNvZGUgZ2VuZXJhdGlvbiBhbmQgcHJpbnRpbmcgc2hvdWxkCisvLy8gYmUgZXhwb3NlZCB0aHJvdWdoIGEgVGFyZ2V0U3VidGFyZ2V0SW5mby1kZXJpdmVkIGNsYXNzLgorLy8vCitjbGFzcyBUYXJnZXRTdWJ0YXJnZXRJbmZvIDogcHVibGljIE1DU3VidGFyZ2V0SW5mbyB7Citwcm90ZWN0ZWQ6IC8vIENhbiBvbmx5IGNyZWF0ZSBzdWJjbGFzc2VzLi4uCisgIFRhcmdldFN1YnRhcmdldEluZm8oY29uc3QgVHJpcGxlICZUVCwgU3RyaW5nUmVmIENQVSwgU3RyaW5nUmVmIEZTLAorICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFN1YnRhcmdldEZlYXR1cmVLVj4gUEYsCisgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U3VidGFyZ2V0RmVhdHVyZUtWPiBQRCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdWJ0YXJnZXRJbmZvS1YgKlByb2NTY2hlZCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1dyaXRlUHJvY1Jlc0VudHJ5ICpXUFIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNXcml0ZUxhdGVuY3lFbnRyeSAqV0wsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNSZWFkQWR2YW5jZUVudHJ5ICpSQSwgY29uc3QgSW5zdHJTdGFnZSAqSVMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgKk9DLCBjb25zdCB1bnNpZ25lZCAqRlApOworCitwdWJsaWM6CisgIC8vIEFudGlEZXBCcmVha01vZGUgLSBUeXBlIG9mIGFudGktZGVwZW5kZW5jZSBicmVha2luZyB0aGF0IHNob3VsZAorICAvLyBiZSBwZXJmb3JtZWQgYmVmb3JlIHBvc3QtUkEgc2NoZWR1bGluZy4KKyAgdXNpbmcgQW50aURlcEJyZWFrTW9kZSA9IGVudW0geyBBTlRJREVQX05PTkUsIEFOVElERVBfQ1JJVElDQUwsIEFOVElERVBfQUxMIH07CisgIHVzaW5nIFJlZ0NsYXNzVmVjdG9yID0gU21hbGxWZWN0b3JJbXBsPGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKj47CisKKyAgVGFyZ2V0U3VidGFyZ2V0SW5mbygpID0gZGVsZXRlOworICBUYXJnZXRTdWJ0YXJnZXRJbmZvKGNvbnN0IFRhcmdldFN1YnRhcmdldEluZm8gJikgPSBkZWxldGU7CisgIFRhcmdldFN1YnRhcmdldEluZm8gJm9wZXJhdG9yPShjb25zdCBUYXJnZXRTdWJ0YXJnZXRJbmZvICYpID0gZGVsZXRlOworICB+VGFyZ2V0U3VidGFyZ2V0SW5mbygpIG92ZXJyaWRlOworCisgIHZpcnR1YWwgYm9vbCBpc1hSYXlTdXBwb3J0ZWQoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vIEludGVyZmFjZXMgdG8gdGhlIG1ham9yIGFzcGVjdHMgb2YgdGFyZ2V0IG1hY2hpbmUgaW5mb3JtYXRpb246CisgIC8vCisgIC8vIC0tIEluc3RydWN0aW9uIG9wY29kZSBhbmQgb3BlcmFuZCBpbmZvcm1hdGlvbgorICAvLyAtLSBQaXBlbGluZXMgYW5kIHNjaGVkdWxpbmcgaW5mb3JtYXRpb24KKyAgLy8gLS0gU3RhY2sgZnJhbWUgaW5mb3JtYXRpb24KKyAgLy8gLS0gU2VsZWN0aW9uIERBRyBsb3dlcmluZyBpbmZvcm1hdGlvbgorICAvLyAtLSBDYWxsIGxvd2VyaW5nIGluZm9ybWF0aW9uCisgIC8vCisgIC8vIE4uQi4gVGhlc2Ugb2JqZWN0cyBtYXkgY2hhbmdlIGR1cmluZyBjb21waWxhdGlvbi4gSXQncyBub3Qgc2FmZSB0byBjYWNoZQorICAvLyB0aGVtIGJldHdlZW4gZnVuY3Rpb25zLgorICB2aXJ0dWFsIGNvbnN0IFRhcmdldEluc3RySW5mbyAqZ2V0SW5zdHJJbmZvKCkgY29uc3QgeyByZXR1cm4gbnVsbHB0cjsgfQorICB2aXJ0dWFsIGNvbnN0IFRhcmdldEZyYW1lTG93ZXJpbmcgKmdldEZyYW1lTG93ZXJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgdmlydHVhbCBjb25zdCBUYXJnZXRMb3dlcmluZyAqZ2V0VGFyZ2V0TG93ZXJpbmcoKSBjb25zdCB7IHJldHVybiBudWxscHRyOyB9CisgIHZpcnR1YWwgY29uc3QgU2VsZWN0aW9uREFHVGFyZ2V0SW5mbyAqZ2V0U2VsZWN0aW9uREFHSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICB2aXJ0dWFsIGNvbnN0IENhbGxMb3dlcmluZyAqZ2V0Q2FsbExvd2VyaW5nKCkgY29uc3QgeyByZXR1cm4gbnVsbHB0cjsgfQorCisgIC8vIEZJWE1FOiBUaGlzIGxldHMgdGFyZ2V0cyBzcGVjaWFsaXplIHRoZSBzZWxlY3RvciBieSBzdWJ0YXJnZXQgKHdoaWNoIGxldHMKKyAgLy8gdXMgZG8gdGhpbmdzIGxpa2UgYSBkZWRpY2F0ZWQgYXZ4NTEyIHNlbGVjdG9yKS4gIEhvd2V2ZXIsIHdlIG1pZ2h0IHdhbnQKKyAgLy8gdG8gYWxzbyBzcGVjaWFsaXplIHNlbGVjdG9ycyBieSBNYWNoaW5lRnVuY3Rpb24sIHdoaWNoIHdvdWxkIGxldCB1cyBiZQorICAvLyBhd2FyZSBvZiBvcHRzaXplL29wdG5vbmUgYW5kIHN1Y2guCisgIHZpcnR1YWwgY29uc3QgSW5zdHJ1Y3Rpb25TZWxlY3RvciAqZ2V0SW5zdHJ1Y3Rpb25TZWxlY3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0SHdNb2RlKCkgY29uc3QgeyByZXR1cm4gMDsgfQorCisgIC8vLyBUYXJnZXQgY2FuIHN1YmNsYXNzIHRoaXMgaG9vayB0byBzZWxlY3QgYSBkaWZmZXJlbnQgREFHIHNjaGVkdWxlci4KKyAgdmlydHVhbCBSZWdpc3RlclNjaGVkdWxlcjo6RnVuY3Rpb25QYXNzQ3RvcgorICAgICAgZ2V0REFHU2NoZWR1bGVyKENvZGVHZW5PcHQ6OkxldmVsKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB2aXJ0dWFsIGNvbnN0IExlZ2FsaXplckluZm8gKmdldExlZ2FsaXplckluZm8oKSBjb25zdCB7IHJldHVybiBudWxscHRyOyB9CisKKyAgLy8vIGdldFJlZ2lzdGVySW5mbyAtIElmIHJlZ2lzdGVyIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSwgcmV0dXJuIGl0LiAgSWYKKyAgLy8vIG5vdCwgcmV0dXJuIG51bGwuCisgIHZpcnR1YWwgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICpnZXRSZWdpc3RlckluZm8oKSBjb25zdCB7IHJldHVybiBudWxscHRyOyB9CisKKyAgLy8vIElmIHRoZSBpbmZvcm1hdGlvbiBmb3IgdGhlIHJlZ2lzdGVyIGJhbmtzIGlzIGF2YWlsYWJsZSwgcmV0dXJuIGl0LgorICAvLy8gT3RoZXJ3aXNlIHJldHVybiBudWxscHRyLgorICB2aXJ0dWFsIGNvbnN0IFJlZ2lzdGVyQmFua0luZm8gKmdldFJlZ0JhbmtJbmZvKCkgY29uc3QgeyByZXR1cm4gbnVsbHB0cjsgfQorCisgIC8vLyBnZXRJbnN0ckl0aW5lcmFyeURhdGEgLSBSZXR1cm5zIGluc3RydWN0aW9uIGl0aW5lcmFyeSBkYXRhIGZvciB0aGUgdGFyZ2V0CisgIC8vLyBvciBzcGVjaWZpYyBzdWJ0YXJnZXQuCisgIHZpcnR1YWwgY29uc3QgSW5zdHJJdGluZXJhcnlEYXRhICpnZXRJbnN0ckl0aW5lcmFyeURhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gUmVzb2x2ZSBhIFNjaGVkQ2xhc3MgYXQgcnVudGltZSwgd2hlcmUgU2NoZWRDbGFzcyBpZGVudGlmaWVzIGFuCisgIC8vLyBNQ1NjaGVkQ2xhc3NEZXNjIHdpdGggdGhlIGlzVmFyaWFudCBwcm9wZXJ0eS4gVGhpcyBtYXkgcmV0dXJuIHRoZSBJRCBvZgorICAvLy8gYW5vdGhlciB2YXJpYW50IFNjaGVkQ2xhc3MsIGJ1dCByZXBlYXRlZCBpbnZvY2F0aW9uIG11c3QgcXVpY2tseSB0ZXJtaW5hdGUKKyAgLy8vIGluIGEgbm9udmFyaWFudCBTY2hlZENsYXNzLgorICB2aXJ0dWFsIHVuc2lnbmVkIHJlc29sdmVTY2hlZENsYXNzKHVuc2lnbmVkIFNjaGVkQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaGluZUluc3RyICpNSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRTY2hlZE1vZGVsICpTY2hlZE1vZGVsKSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhlIHN1YnRhcmdldCBzaG91bGQgcnVuIE1hY2hpbmVTY2hlZHVsZXIgYWZ0ZXIgYWdncmVzc2l2ZQorICAvLy8gY29hbGVzY2luZy4KKyAgLy8vCisgIC8vLyBUaGlzIGN1cnJlbnRseSByZXBsYWNlcyB0aGUgU2VsZWN0aW9uREFHIHNjaGVkdWxlciB3aXRoIHRoZSAic291cmNlIiBvcmRlcgorICAvLy8gc2NoZWR1bGVyICh0aG91Z2ggc2VlIGJlbG93IGZvciBhbiBvcHRpb24gdG8gdHVybiB0aGlzIG9mZiBhbmQgdXNlIHRoZQorICAvLy8gVGFyZ2V0TG93ZXJpbmcgcHJlZmVyZW5jZSkuIEl0IGRvZXMgbm90IHlldCBkaXNhYmxlIHRoZSBwb3N0UkEgc2NoZWR1bGVyLgorICB2aXJ0dWFsIGJvb2wgZW5hYmxlTWFjaGluZVNjaGVkdWxlcigpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgU3VwcG9ydCBwcmludGluZyBvZiBbbGF0ZW5jeTp0aHJvdWdocHV0XSBjb21tZW50IGluIG91dHB1dCAuUyBmaWxlLgorICB2aXJ0dWFsIGJvb2wgc3VwcG9ydFByaW50U2NoZWRJbmZvKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhlIG1hY2hpbmUgc2NoZWR1bGVyIHNob3VsZCBkaXNhYmxlIHRoZSBUTEkgcHJlZmVyZW5jZQorICAvLy8gZm9yIHByZVJBIHNjaGVkdWxpbmcgd2l0aCB0aGUgc291cmNlIGxldmVsIHNjaGVkdWxlci4KKyAgdmlydHVhbCBib29sIGVuYWJsZU1hY2hpbmVTY2hlZERlZmF1bHRTY2hlZCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhlIHN1YnRhcmdldCBzaG91bGQgZW5hYmxlIGpvaW5pbmcgZ2xvYmFsIGNvcGllcy4KKyAgLy8vCisgIC8vLyBCeSBkZWZhdWx0IHRoaXMgaXMgZW5hYmxlZCBpZiB0aGUgbWFjaGluZSBzY2hlZHVsZXIgaXMgZW5hYmxlZCwgYnV0CisgIC8vLyBjYW4gYmUgb3ZlcnJpZGRlbi4KKyAgdmlydHVhbCBib29sIGVuYWJsZUpvaW5HbG9iYWxDb3BpZXMoKSBjb25zdDsKKworICAvLy8gVHJ1ZSBpZiB0aGUgc3VidGFyZ2V0IHNob3VsZCBydW4gYSBzY2hlZHVsZXIgYWZ0ZXIgcmVnaXN0ZXIgYWxsb2NhdGlvbi4KKyAgLy8vCisgIC8vLyBCeSBkZWZhdWx0IHRoaXMgcXVlcmllcyB0aGUgUG9zdFJBU2NoZWR1bGluZyBiaXQgaW4gdGhlIHNjaGVkdWxpbmcgbW9kZWwKKyAgLy8vIHdoaWNoIGlzIHRoZSBwcmVmZXJyZWQgd2F5IHRvIGluZmx1ZW5jZSB0aGlzLgorICB2aXJ0dWFsIGJvb2wgZW5hYmxlUG9zdFJBU2NoZWR1bGVyKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoZSBzdWJ0YXJnZXQgc2hvdWxkIHJ1biB0aGUgYXRvbWljIGV4cGFuc2lvbiBwYXNzLgorICB2aXJ0dWFsIGJvb2wgZW5hYmxlQXRvbWljRXhwYW5kKCkgY29uc3Q7CisKKyAgLy8vIFRydWUgaWYgdGhlIHN1YnRhcmdldCBzaG91bGQgcnVuIHRoZSBpbmRpcmVjdGJyIGV4cGFuc2lvbiBwYXNzLgorICB2aXJ0dWFsIGJvb2wgZW5hYmxlSW5kaXJlY3RCckV4cGFuZCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgT3ZlcnJpZGUgZ2VuZXJpYyBzY2hlZHVsaW5nIHBvbGljeSB3aXRoaW4gYSByZWdpb24uCisgIC8vLworICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbnQgd2F5IGZvciB0YXJnZXRzIHRoYXQgZG9uJ3QgcHJvdmlkZSBhbnkgY3VzdG9tCisgIC8vLyBzY2hlZHVsaW5nIGhldXJpc3RpY3MgKG5vIGN1c3RvbSBNYWNoaW5lU2NoZWRTdHJhdGVneSkgdG8gbWFrZQorICAvLy8gY2hhbmdlcyB0byB0aGUgZ2VuZXJpYyBzY2hlZHVsaW5nIHBvbGljeS4KKyAgdmlydHVhbCB2b2lkIG92ZXJyaWRlU2NoZWRQb2xpY3koTWFjaGluZVNjaGVkUG9saWN5ICZQb2xpY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bVJlZ2lvbkluc3RycykgY29uc3Qge30KKworICAvLyBcYnJpZWYgUGVyZm9ybSB0YXJnZXQgc3BlY2lmaWMgYWRqdXN0bWVudHMgdG8gdGhlIGxhdGVuY3kgb2YgYSBzY2hlZHVsZQorICAvLyBkZXBlbmRlbmN5LgorICB2aXJ0dWFsIHZvaWQgYWRqdXN0U2NoZWREZXBlbmRlbmN5KFNVbml0ICpkZWYsIFNVbml0ICp1c2UsIFNEZXAgJmRlcCkgY29uc3Qge30KKworICAvLyBGb3IgdXNlIHdpdGggUG9zdFJBU2NoZWR1bGluZzogZ2V0IHRoZSBhbnRpLWRlcGVuZGVuY2UgYnJlYWtpbmcgdGhhdCBzaG91bGQKKyAgLy8gYmUgcGVyZm9ybWVkIGJlZm9yZSBwb3N0LVJBIHNjaGVkdWxpbmcuCisgIHZpcnR1YWwgQW50aURlcEJyZWFrTW9kZSBnZXRBbnRpRGVwQnJlYWtNb2RlKCkgY29uc3QgeyByZXR1cm4gQU5USURFUF9OT05FOyB9CisKKyAgLy8gRm9yIHVzZSB3aXRoIFBvc3RSQVNjaGVkdWxpbmc6IGluIENyaXRpY2FsUGF0aFJDcywgcmV0dXJuIGFueSByZWdpc3RlcgorICAvLyBjbGFzc2VzIHRoYXQgc2hvdWxkIG9ubHkgYmUgY29uc2lkZXJlZCBmb3IgYW50aS1kZXBlbmRlbmNlIGJyZWFraW5nIGlmIHRoZXkKKyAgLy8gYXJlIG9uIHRoZSBjcml0aWNhbCBwYXRoLgorICB2aXJ0dWFsIHZvaWQgZ2V0Q3JpdGljYWxQYXRoUkNzKFJlZ0NsYXNzVmVjdG9yICZDcml0aWNhbFBhdGhSQ3MpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3JpdGljYWxQYXRoUkNzLmNsZWFyKCk7CisgIH0KKworICAvLyBcYnJpZWYgUHJvdmlkZSBhbiBvcmRlcmVkIGxpc3Qgb2Ygc2NoZWR1bGUgREFHIG11dGF0aW9ucyBmb3IgdGhlIHBvc3QtUkEKKyAgLy8gc2NoZWR1bGVyLgorICB2aXJ0dWFsIHZvaWQgZ2V0UG9zdFJBTXV0YXRpb25zKAorICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFNjaGVkdWxlREFHTXV0YXRpb24+PiAmTXV0YXRpb25zKSBjb25zdCB7CisgIH0KKworICAvLyBcYnJpZWYgUHJvdmlkZSBhbiBvcmRlcmVkIGxpc3Qgb2Ygc2NoZWR1bGUgREFHIG11dGF0aW9ucyBmb3IgdGhlIG1hY2hpbmUKKyAgLy8gcGlwZWxpbmVyLgorICB2aXJ0dWFsIHZvaWQgZ2V0U01TTXV0YXRpb25zKAorICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFNjaGVkdWxlREFHTXV0YXRpb24+PiAmTXV0YXRpb25zKSBjb25zdCB7CisgIH0KKworICAvLyBGb3IgdXNlIHdpdGggUG9zdFJBU2NoZWR1bGluZzogZ2V0IHRoZSBtaW5pbXVtIG9wdGltaXphdGlvbiBsZXZlbCBuZWVkZWQKKyAgLy8gdG8gZW5hYmxlIHBvc3QtUkEgc2NoZWR1bGluZy4KKyAgdmlydHVhbCBDb2RlR2VuT3B0OjpMZXZlbCBnZXRPcHRMZXZlbFRvRW5hYmxlUG9zdFJBU2NoZWR1bGVyKCkgY29uc3QgeworICAgIHJldHVybiBDb2RlR2VuT3B0OjpEZWZhdWx0OworICB9CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoZSBzdWJ0YXJnZXQgc2hvdWxkIHJ1biB0aGUgbG9jYWwgcmVhc3NpZ25tZW50CisgIC8vLyBoZXVyaXN0aWMgb2YgdGhlIHJlZ2lzdGVyIGFsbG9jYXRvci4KKyAgLy8vIFRoaXMgaGV1cmlzdGljIG1heSBiZSBjb21waWxlIHRpbWUgaW50ZW5zaXZlLCBccCBPcHRMZXZlbCBwcm92aWRlcworICAvLy8gYSBmaW5lciBncmFpbiB0byB0dW5lIHRoZSByZWdpc3RlciBhbGxvY2F0b3IuCisgIHZpcnR1YWwgYm9vbCBlbmFibGVSQUxvY2FsUmVhc3NpZ25tZW50KENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhlIHN1YnRhcmdldCBzaG91bGQgY29uc2lkZXIgdGhlIGNvc3Qgb2YgbG9jYWwgaW50ZXJ2YWxzCisgIC8vLyBjcmVhdGVkIGJ5IGEgc3BsaXQgY2FuZGlkYXRlIHdoZW4gY2hvb3NpbmcgdGhlIGJlc3Qgc3BsaXQgY2FuZGlkYXRlLiBUaGlzCisgIC8vLyBoZXVyaXN0aWMgbWF5IGJlIGNvbXBpbGUgdGltZSBpbnRlbnNpdmUuCisgIHZpcnR1YWwgYm9vbCBlbmFibGVBZHZhbmNlZFJBU3BsaXRDb3N0KCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBFbmFibGUgdXNlIG9mIGFsaWFzIGFuYWx5c2lzIGR1cmluZyBjb2RlIGdlbmVyYXRpb24gKGR1cmluZyBNSQorICAvLy8gc2NoZWR1bGluZywgREFHQ29tYmluZSwgZXRjLikuCisgIHZpcnR1YWwgYm9vbCB1c2VBQSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRW5hYmxlIHRoZSB1c2Ugb2YgdGhlIGVhcmx5IGlmIGNvbnZlcnNpb24gcGFzcy4KKyAgdmlydHVhbCBib29sIGVuYWJsZUVhcmx5SWZDb252ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiBQQlFQQ29uc3RyYWludChzKSBmb3IgdGhlIHRhcmdldC4KKyAgLy8vCisgIC8vLyBPdmVycmlkZSB0byBwcm92aWRlIGN1c3RvbSBQQlFQIGNvbnN0cmFpbnRzLgorICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxQQlFQUkFDb25zdHJhaW50PiBnZXRDdXN0b21QQlFQQ29uc3RyYWludHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gRW5hYmxlIHRyYWNraW5nIG9mIHN1YnJlZ2lzdGVyIGxpdmVuZXNzIGluIHJlZ2lzdGVyIGFsbG9jYXRvci4KKyAgLy8vIFBsZWFzZSB1c2UgTWFjaGluZVJlZ2lzdGVySW5mbzo6c3ViUmVnTGl2ZW5lc3NFbmFibGVkKCkgaW5zdGVhZCB3aGVyZQorICAvLy8gcG9zc2libGUuCisgIHZpcnR1YWwgYm9vbCBlbmFibGVTdWJSZWdMaXZlbmVzcygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFJldHVybnMgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHNjaGVkdWxlciBjb21tZW50CisgIHN0ZDo6c3RyaW5nIGdldFNjaGVkSW5mb1N0cihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0U2NoZWRJbmZvU3RyKE1DSW5zdCBjb25zdCAmTUNJKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gVGhpcyBpcyBjYWxsZWQgYWZ0ZXIgYSAubWlyIGZpbGUgd2FzIGxvYWRlZC4KKyAgdmlydHVhbCB2b2lkIG1pckZpbGVMb2FkZWQoTWFjaGluZUZ1bmN0aW9uICZNRikgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9DT0RFR0VOX1RBUkdFVFNVQlRBUkdFVElORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1VucmVhY2hhYmxlQmxvY2tFbGltLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vVW5yZWFjaGFibGVCbG9ja0VsaW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTdhZmQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1VucmVhY2hhYmxlQmxvY2tFbGltLmgKQEAgLTAsMCArMSwzNyBAQAorLy89PT0tLSBVbnJlYWNoYWJsZUJsb2NrRWxpbS5oIC0gUmVtb3ZlIHVucmVhY2hhYmxlIGJsb2NrcyBmb3IgY29kZWdlbiAtLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIGlzIGFuIGV4dHJlbWVseSBzaW1wbGUgdmVyc2lvbiBvZiB0aGUgU2ltcGxpZnlDRkcgcGFzcy4gIEl0cyBzb2xlCisvLyBqb2IgaXMgdG8gZGVsZXRlIExMVk0gYmFzaWMgYmxvY2tzIHRoYXQgYXJlIG5vdCByZWFjaGFibGUgZnJvbSB0aGUgZW50cnkKKy8vIG5vZGUuICBUbyBkbyB0aGlzLCBpdCBwZXJmb3JtcyBhIHNpbXBsZSBkZXB0aCBmaXJzdCB0cmF2ZXJzYWwgb2YgdGhlIENGRywKKy8vIHRoZW4gZGVsZXRlcyBhbnkgdW52aXNpdGVkIG5vZGVzLgorLy8KKy8vIE5vdGUgdGhhdCB0aGlzIHBhc3MgaXMgcmVhbGx5IGEgaGFjay4gIEluIHBhcnRpY3VsYXIsIHRoZSBpbnN0cnVjdGlvbgorLy8gc2VsZWN0b3JzIGZvciB2YXJpb3VzIHRhcmdldHMgc2hvdWxkIGp1c3Qgbm90IGdlbmVyYXRlIGNvZGUgZm9yIHVucmVhY2hhYmxlCisvLyBibG9ja3MuICBVbnRpbCBMTFZNIGhhcyBhIG1vcmUgc3lzdGVtYXRpYyB3YXkgb2YgZGVmaW5pbmcgaW5zdHJ1Y3Rpb24KKy8vIHNlbGVjdG9ycywgaG93ZXZlciwgd2UgY2Fubm90IHJlYWxseSBleHBlY3QgdGhlbSB0byBoYW5kbGUgYWRkaXRpb25hbAorLy8gY29tcGxleGl0eS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTElCX0NPREVHRU5fVU5SRUFDSEFCTEVCTE9DS0VMSU1fSAorI2RlZmluZSBMTFZNX0xJQl9DT0RFR0VOX1VOUkVBQ0hBQkxFQkxPQ0tFTElNX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBVbnJlYWNoYWJsZUJsb2NrRWxpbVBhc3MKKyAgICA6IHB1YmxpYyBQYXNzSW5mb01peGluPFVucmVhY2hhYmxlQmxvY2tFbGltUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTElCX0NPREVHRU5fVU5SRUFDSEFCTEVCTE9DS0VMSU1fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9WYWx1ZVR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlZjRhOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9WYWx1ZVR5cGVzLmgKQEAgLTAsMCArMSw0MzcgQEAKKy8vPT09LSBDb2RlR2VuL1ZhbHVlVHlwZXMuaCAtIExvdy1MZXZlbCBUYXJnZXQgaW5kZXBlbmQuIHR5cGVzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIHNldCBvZiBsb3ctbGV2ZWwgdGFyZ2V0IGluZGVwZW5kZW50IHR5cGVzIHdoaWNoIHZhcmlvdXMKKy8vIHZhbHVlcyBpbiB0aGUgY29kZSBnZW5lcmF0b3IgYXJlLiAgVGhpcyBhbGxvd3MgdGhlIHRhcmdldCBzcGVjaWZpYyBiZWhhdmlvcgorLy8gb2YgaW5zdHJ1Y3Rpb25zIHRvIGJlIGRlc2NyaWJlZCB0byB0YXJnZXQgaW5kZXBlbmRlbnQgcGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1ZBTFVFVFlQRVNfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fVkFMVUVUWVBFU19ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWFjaGluZVZhbHVlVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCisgIGNsYXNzIExMVk1Db250ZXh0OworICBjbGFzcyBUeXBlOworCisgIC8vLyBFeHRlbmRlZCBWYWx1ZSBUeXBlLiBDYXBhYmxlIG9mIGhvbGRpbmcgdmFsdWUgdHlwZXMgd2hpY2ggYXJlIG5vdCBuYXRpdmUKKyAgLy8vIGZvciBhbnkgcHJvY2Vzc29yIChzdWNoIGFzIHRoZSBpMTIzNDUgdHlwZSksIGFzIHdlbGwgYXMgdGhlIHR5cGVzIGFuIE1WVAorICAvLy8gY2FuIHJlcHJlc2VudC4KKyAgc3RydWN0IEVWVCB7CisgIHByaXZhdGU6CisgICAgTVZUIFYgPSBNVlQ6OklOVkFMSURfU0lNUExFX1ZBTFVFX1RZUEU7CisgICAgVHlwZSAqTExWTVR5ID0gbnVsbHB0cjsKKworICBwdWJsaWM6CisgICAgY29uc3RleHByIEVWVCgpID0gZGVmYXVsdDsKKyAgICBjb25zdGV4cHIgRVZUKE1WVDo6U2ltcGxlVmFsdWVUeXBlIFNWVCkgOiBWKFNWVCkge30KKyAgICBjb25zdGV4cHIgRVZUKE1WVCBTKSA6IFYoUykge30KKworICAgIGJvb2wgb3BlcmF0b3I9PShFVlQgVlQpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhKCp0aGlzICE9IFZUKTsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciE9KEVWVCBWVCkgY29uc3QgeworICAgICAgaWYgKFYuU2ltcGxlVHkgIT0gVlQuVi5TaW1wbGVUeSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBpZiAoVi5TaW1wbGVUeSA9PSBNVlQ6OklOVkFMSURfU0lNUExFX1ZBTFVFX1RZUEUpCisgICAgICAgIHJldHVybiBMTFZNVHkgIT0gVlQuTExWTVR5OworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBFVlQgdGhhdCByZXByZXNlbnRzIGEgZmxvYXRpbmctcG9pbnQgdHlwZSB3aXRoIHRoZSBnaXZlbgorICAgIC8vLyBudW1iZXIgb2YgYml0cy4gVGhlcmUgYXJlIHR3byBmbG9hdGluZy1wb2ludCB0eXBlcyB3aXRoIDEyOCBiaXRzIC0gdGhpcworICAgIC8vLyByZXR1cm5zIGYxMjggcmF0aGVyIHRoYW4gcHBjZjEyOC4KKyAgICBzdGF0aWMgRVZUIGdldEZsb2F0aW5nUG9pbnRWVCh1bnNpZ25lZCBCaXRXaWR0aCkgeworICAgICAgcmV0dXJuIE1WVDo6Z2V0RmxvYXRpbmdQb2ludFZUKEJpdFdpZHRoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgRVZUIHRoYXQgcmVwcmVzZW50cyBhbiBpbnRlZ2VyIHdpdGggdGhlIGdpdmVuIG51bWJlciBvZgorICAgIC8vLyBiaXRzLgorICAgIHN0YXRpYyBFVlQgZ2V0SW50ZWdlclZUKExMVk1Db250ZXh0ICZDb250ZXh0LCB1bnNpZ25lZCBCaXRXaWR0aCkgeworICAgICAgTVZUIE0gPSBNVlQ6OmdldEludGVnZXJWVChCaXRXaWR0aCk7CisgICAgICBpZiAoTS5TaW1wbGVUeSAhPSBNVlQ6OklOVkFMSURfU0lNUExFX1ZBTFVFX1RZUEUpCisgICAgICAgIHJldHVybiBNOworICAgICAgcmV0dXJuIGdldEV4dGVuZGVkSW50ZWdlclZUKENvbnRleHQsIEJpdFdpZHRoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgRVZUIHRoYXQgcmVwcmVzZW50cyBhIHZlY3RvciBOdW1FbGVtZW50cyBpbiBsZW5ndGgsIHdoZXJlCisgICAgLy8vIGVhY2ggZWxlbWVudCBpcyBvZiB0eXBlIFZULgorICAgIHN0YXRpYyBFVlQgZ2V0VmVjdG9yVlQoTExWTUNvbnRleHQgJkNvbnRleHQsIEVWVCBWVCwgdW5zaWduZWQgTnVtRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzU2NhbGFibGUgPSBmYWxzZSkgeworICAgICAgTVZUIE0gPSBNVlQ6OmdldFZlY3RvclZUKFZULlYsIE51bUVsZW1lbnRzLCBJc1NjYWxhYmxlKTsKKyAgICAgIGlmIChNLlNpbXBsZVR5ICE9IE1WVDo6SU5WQUxJRF9TSU1QTEVfVkFMVUVfVFlQRSkKKyAgICAgICAgcmV0dXJuIE07CisKKyAgICAgIGFzc2VydCghSXNTY2FsYWJsZSAmJiAiV2UgZG9uJ3Qgc3VwcG9ydCBleHRlbmRlZCBzY2FsYWJsZSB0eXBlcyB5ZXQiKTsKKyAgICAgIHJldHVybiBnZXRFeHRlbmRlZFZlY3RvclZUKENvbnRleHQsIFZULCBOdW1FbGVtZW50cyk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdGhlIEVWVCB0aGF0IHJlcHJlc2VudHMgYSB2ZWN0b3IgRUMuTWluIGVsZW1lbnRzIGluIGxlbmd0aCwKKyAgICAvLy8gd2hlcmUgZWFjaCBlbGVtZW50IGlzIG9mIHR5cGUgVlQuCisgICAgc3RhdGljIEVWVCBnZXRWZWN0b3JWVChMTFZNQ29udGV4dCAmQ29udGV4dCwgRVZUIFZULCBNVlQ6OkVsZW1lbnRDb3VudCBFQykgeworICAgICAgTVZUIE0gPSBNVlQ6OmdldFZlY3RvclZUKFZULlYsIEVDKTsKKyAgICAgIGlmIChNLlNpbXBsZVR5ICE9IE1WVDo6SU5WQUxJRF9TSU1QTEVfVkFMVUVfVFlQRSkKKyAgICAgICAgcmV0dXJuIE07CisgICAgICBhc3NlcnQgKCFFQy5TY2FsYWJsZSAmJiAiV2UgZG9uJ3Qgc3VwcG9ydCBleHRlbmRlZCBzY2FsYWJsZSB0eXBlcyB5ZXQiKTsKKyAgICAgIHJldHVybiBnZXRFeHRlbmRlZFZlY3RvclZUKENvbnRleHQsIFZULCBFQy5NaW4pOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gYSB2ZWN0b3Igd2l0aCB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMgYXMgdGhpcyB2ZWN0b3IsIGJ1dAorICAgIC8vLyB3aXRoIHRoZSBlbGVtZW50IHR5cGUgY29udmVydGVkIHRvIGFuIGludGVnZXIgdHlwZSB3aXRoIHRoZSBzYW1lCisgICAgLy8vIGJpdHdpZHRoLgorICAgIEVWVCBjaGFuZ2VWZWN0b3JFbGVtZW50VHlwZVRvSW50ZWdlcigpIGNvbnN0IHsKKyAgICAgIGlmICghaXNTaW1wbGUoKSkgeworICAgICAgICBhc3NlcnQgKCFpc1NjYWxhYmxlVmVjdG9yKCkgJiYKKyAgICAgICAgICAgICAgICAiV2UgZG9uJ3Qgc3VwcG9ydCBleHRlbmRlZCBzY2FsYWJsZSB0eXBlcyB5ZXQiKTsKKyAgICAgICAgcmV0dXJuIGNoYW5nZUV4dGVuZGVkVmVjdG9yRWxlbWVudFR5cGVUb0ludGVnZXIoKTsKKyAgICAgIH0KKyAgICAgIE1WVCBFbHRUeSA9IGdldFNpbXBsZVZUKCkuZ2V0VmVjdG9yRWxlbWVudFR5cGUoKTsKKyAgICAgIHVuc2lnbmVkIEJpdFdpZHRoID0gRWx0VHkuZ2V0U2l6ZUluQml0cygpOworICAgICAgTVZUIEludFR5ID0gTVZUOjpnZXRJbnRlZ2VyVlQoQml0V2lkdGgpOworICAgICAgTVZUIFZlY1R5ID0gTVZUOjpnZXRWZWN0b3JWVChJbnRUeSwgZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNTY2FsYWJsZVZlY3RvcigpKTsKKyAgICAgIGFzc2VydChWZWNUeS5TaW1wbGVUeSAhPSBNVlQ6OklOVkFMSURfU0lNUExFX1ZBTFVFX1RZUEUgJiYKKyAgICAgICAgICAgICAiU2ltcGxlIHZlY3RvciBWVCBub3QgcmVwcmVzZW50YWJsZSBieSBzaW1wbGUgaW50ZWdlciB2ZWN0b3IgVlQhIik7CisgICAgICByZXR1cm4gVmVjVHk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0aGUgdHlwZSBjb252ZXJ0ZWQgdG8gYW4gZXF1aXZhbGVudGx5IHNpemVkIGludGVnZXIgb3IgdmVjdG9yCisgICAgLy8vIHdpdGggaW50ZWdlciBlbGVtZW50IHR5cGUuIFNpbWlsYXIgdG8gY2hhbmdlVmVjdG9yRWxlbWVudFR5cGVUb0ludGVnZXIsCisgICAgLy8vIGJ1dCBhbHNvIGhhbmRsZXMgc2NhbGFycy4KKyAgICBFVlQgY2hhbmdlVHlwZVRvSW50ZWdlcigpIHsKKyAgICAgIGlmIChpc1ZlY3RvcigpKQorICAgICAgICByZXR1cm4gY2hhbmdlVmVjdG9yRWxlbWVudFR5cGVUb0ludGVnZXIoKTsKKworICAgICAgaWYgKGlzU2ltcGxlKCkpCisgICAgICAgIHJldHVybiBNVlQ6OmdldEludGVnZXJWVChnZXRTaXplSW5CaXRzKCkpOworCisgICAgICByZXR1cm4gY2hhbmdlRXh0ZW5kZWRUeXBlVG9JbnRlZ2VyKCk7CisgICAgfQorCisgICAgLy8vIFRlc3QgaWYgdGhlIGdpdmVuIEVWVCBpcyBzaW1wbGUgKGFzIG9wcG9zZWQgdG8gYmVpbmcgZXh0ZW5kZWQpLgorICAgIGJvb2wgaXNTaW1wbGUoKSBjb25zdCB7CisgICAgICByZXR1cm4gVi5TaW1wbGVUeSAhPSBNVlQ6OklOVkFMSURfU0lNUExFX1ZBTFVFX1RZUEU7CisgICAgfQorCisgICAgLy8vIFRlc3QgaWYgdGhlIGdpdmVuIEVWVCBpcyBleHRlbmRlZCAoYXMgb3Bwb3NlZCB0byBiZWluZyBzaW1wbGUpLgorICAgIGJvb2wgaXNFeHRlbmRlZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhaXNTaW1wbGUoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIEZQIG9yIGEgdmVjdG9yIEZQIHR5cGUuCisgICAgYm9vbCBpc0Zsb2F0aW5nUG9pbnQoKSBjb25zdCB7CisgICAgICByZXR1cm4gaXNTaW1wbGUoKSA/IFYuaXNGbG9hdGluZ1BvaW50KCkgOiBpc0V4dGVuZGVkRmxvYXRpbmdQb2ludCgpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIGludGVnZXIgb3IgYSB2ZWN0b3IgaW50ZWdlciB0eXBlLgorICAgIGJvb2wgaXNJbnRlZ2VyKCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzU2ltcGxlKCkgPyBWLmlzSW50ZWdlcigpIDogaXNFeHRlbmRlZEludGVnZXIoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBpbnRlZ2VyLCBidXQgbm90IGEgdmVjdG9yLgorICAgIGJvb2wgaXNTY2FsYXJJbnRlZ2VyKCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzU2ltcGxlKCkgPyBWLmlzU2NhbGFySW50ZWdlcigpIDogaXNFeHRlbmRlZFNjYWxhckludGVnZXIoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHZlY3RvciB2YWx1ZSB0eXBlLgorICAgIGJvb2wgaXNWZWN0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gaXNTaW1wbGUoKSA/IFYuaXNWZWN0b3IoKSA6IGlzRXh0ZW5kZWRWZWN0b3IoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHZlY3RvciB0eXBlIHdoZXJlIHRoZSBydW50aW1lCisgICAgLy8vIGxlbmd0aCBpcyBtYWNoaW5lIGRlcGVuZGVudAorICAgIGJvb2wgaXNTY2FsYWJsZVZlY3RvcigpIGNvbnN0IHsKKyAgICAgIC8vIEZJWE1FOiBXZSBkb24ndCBzdXBwb3J0IGV4dGVuZGVkIHNjYWxhYmxlIHR5cGVzIHlldCwgYmVjYXVzZSB0aGUKKyAgICAgIC8vIG1hdGNoaW5nIElSIHR5cGUgZG9lc24ndCBleGlzdC4gT25jZSBpdCBoYXMgYmVlbiBhZGRlZCwgdGhpcyBjYW4KKyAgICAgIC8vIGJlIGNoYW5nZWQgdG8gY2FsbCBpc0V4dGVuZGVkU2NhbGFibGVWZWN0b3IuCisgICAgICBpZiAoIWlzU2ltcGxlKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHJldHVybiBWLmlzU2NhbGFibGVWZWN0b3IoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIDE2LWJpdCB2ZWN0b3IgdHlwZS4KKyAgICBib29sIGlzMTZCaXRWZWN0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gaXNTaW1wbGUoKSA/IFYuaXMxNkJpdFZlY3RvcigpIDogaXNFeHRlbmRlZDE2Qml0VmVjdG9yKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSAzMi1iaXQgdmVjdG9yIHR5cGUuCisgICAgYm9vbCBpczMyQml0VmVjdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzU2ltcGxlKCkgPyBWLmlzMzJCaXRWZWN0b3IoKSA6IGlzRXh0ZW5kZWQzMkJpdFZlY3RvcigpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgNjQtYml0IHZlY3RvciB0eXBlLgorICAgIGJvb2wgaXM2NEJpdFZlY3RvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpc1NpbXBsZSgpID8gVi5pczY0Qml0VmVjdG9yKCkgOiBpc0V4dGVuZGVkNjRCaXRWZWN0b3IoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIDEyOC1iaXQgdmVjdG9yIHR5cGUuCisgICAgYm9vbCBpczEyOEJpdFZlY3RvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpc1NpbXBsZSgpID8gVi5pczEyOEJpdFZlY3RvcigpIDogaXNFeHRlbmRlZDEyOEJpdFZlY3RvcigpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgMjU2LWJpdCB2ZWN0b3IgdHlwZS4KKyAgICBib29sIGlzMjU2Qml0VmVjdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzU2ltcGxlKCkgPyBWLmlzMjU2Qml0VmVjdG9yKCkgOiBpc0V4dGVuZGVkMjU2Qml0VmVjdG9yKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSA1MTItYml0IHZlY3RvciB0eXBlLgorICAgIGJvb2wgaXM1MTJCaXRWZWN0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gaXNTaW1wbGUoKSA/IFYuaXM1MTJCaXRWZWN0b3IoKSA6IGlzRXh0ZW5kZWQ1MTJCaXRWZWN0b3IoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIDEwMjQtYml0IHZlY3RvciB0eXBlLgorICAgIGJvb2wgaXMxMDI0Qml0VmVjdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzU2ltcGxlKCkgPyBWLmlzMTAyNEJpdFZlY3RvcigpIDogaXNFeHRlbmRlZDEwMjRCaXRWZWN0b3IoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIDIwNDgtYml0IHZlY3RvciB0eXBlLgorICAgIGJvb2wgaXMyMDQ4Qml0VmVjdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzU2ltcGxlKCkgPyBWLmlzMjA0OEJpdFZlY3RvcigpIDogaXNFeHRlbmRlZDIwNDhCaXRWZWN0b3IoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBvdmVybG9hZGVkIHR5cGUgZm9yIFRhYmxlR2VuLgorICAgIGJvb2wgaXNPdmVybG9hZGVkKCkgY29uc3QgeworICAgICAgcmV0dXJuIChWPT1NVlQ6OmlBbnkgfHwgVj09TVZUOjpmQW55IHx8IFY9PU1WVDo6dkFueSB8fCBWPT1NVlQ6OmlQVFJBbnkpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgYml0IHNpemUgaXMgYSBtdWx0aXBsZSBvZiA4LgorICAgIGJvb2wgaXNCeXRlU2l6ZWQoKSBjb25zdCB7CisgICAgICByZXR1cm4gKGdldFNpemVJbkJpdHMoKSAmIDcpID09IDA7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzaXplIGlzIGEgcG93ZXItb2YtdHdvIG51bWJlciBvZiBieXRlcy4KKyAgICBib29sIGlzUm91bmQoKSBjb25zdCB7CisgICAgICB1bnNpZ25lZCBCaXRTaXplID0gZ2V0U2l6ZUluQml0cygpOworICAgICAgcmV0dXJuIEJpdFNpemUgPj0gOCAmJiAhKEJpdFNpemUgJiAoQml0U2l6ZSAtIDEpKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBoYXMgdGhlIHNhbWUgbnVtYmVyIG9mIGJpdHMgYXMgVlQuCisgICAgYm9vbCBiaXRzRXEoRVZUIFZUKSBjb25zdCB7CisgICAgICBpZiAoRVZUOjpvcGVyYXRvcj09KFZUKSkgcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gZ2V0U2l6ZUluQml0cygpID09IFZULmdldFNpemVJbkJpdHMoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBoYXMgbW9yZSBiaXRzIHRoYW4gVlQuCisgICAgYm9vbCBiaXRzR1QoRVZUIFZUKSBjb25zdCB7CisgICAgICBpZiAoRVZUOjpvcGVyYXRvcj09KFZUKSkgcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIGdldFNpemVJbkJpdHMoKSA+IFZULmdldFNpemVJbkJpdHMoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBoYXMgbm8gbGVzcyBiaXRzIHRoYW4gVlQuCisgICAgYm9vbCBiaXRzR0UoRVZUIFZUKSBjb25zdCB7CisgICAgICBpZiAoRVZUOjpvcGVyYXRvcj09KFZUKSkgcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gZ2V0U2l6ZUluQml0cygpID49IFZULmdldFNpemVJbkJpdHMoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBoYXMgbGVzcyBiaXRzIHRoYW4gVlQuCisgICAgYm9vbCBiaXRzTFQoRVZUIFZUKSBjb25zdCB7CisgICAgICBpZiAoRVZUOjpvcGVyYXRvcj09KFZUKSkgcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIGdldFNpemVJbkJpdHMoKSA8IFZULmdldFNpemVJbkJpdHMoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBoYXMgbm8gbW9yZSBiaXRzIHRoYW4gVlQuCisgICAgYm9vbCBiaXRzTEUoRVZUIFZUKSBjb25zdCB7CisgICAgICBpZiAoRVZUOjpvcGVyYXRvcj09KFZUKSkgcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gZ2V0U2l6ZUluQml0cygpIDw9IFZULmdldFNpemVJbkJpdHMoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSBTaW1wbGVWYWx1ZVR5cGUgaGVsZCBpbiB0aGUgc3BlY2lmaWVkIHNpbXBsZSBFVlQuCisgICAgTVZUIGdldFNpbXBsZVZUKCkgY29uc3QgeworICAgICAgYXNzZXJ0KGlzU2ltcGxlKCkgJiYgIkV4cGVjdGVkIGEgU2ltcGxlVmFsdWVUeXBlISIpOworICAgICAgcmV0dXJuIFY7CisgICAgfQorCisgICAgLy8vIElmIHRoaXMgaXMgYSB2ZWN0b3IgdHlwZSwgcmV0dXJuIHRoZSBlbGVtZW50IHR5cGUsIG90aGVyd2lzZSByZXR1cm4KKyAgICAvLy8gdGhpcy4KKyAgICBFVlQgZ2V0U2NhbGFyVHlwZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBpc1ZlY3RvcigpID8gZ2V0VmVjdG9yRWxlbWVudFR5cGUoKSA6ICp0aGlzOworICAgIH0KKworICAgIC8vLyBHaXZlbiBhIHZlY3RvciB0eXBlLCByZXR1cm4gdGhlIHR5cGUgb2YgZWFjaCBlbGVtZW50LgorICAgIEVWVCBnZXRWZWN0b3JFbGVtZW50VHlwZSgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChpc1ZlY3RvcigpICYmICJJbnZhbGlkIHZlY3RvciB0eXBlISIpOworICAgICAgaWYgKGlzU2ltcGxlKCkpCisgICAgICAgIHJldHVybiBWLmdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgICAgICByZXR1cm4gZ2V0RXh0ZW5kZWRWZWN0b3JFbGVtZW50VHlwZSgpOworICAgIH0KKworICAgIC8vLyBHaXZlbiBhIHZlY3RvciB0eXBlLCByZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpdCBjb250YWlucy4KKyAgICB1bnNpZ25lZCBnZXRWZWN0b3JOdW1FbGVtZW50cygpIGNvbnN0IHsKKyAgICAgIGFzc2VydChpc1ZlY3RvcigpICYmICJJbnZhbGlkIHZlY3RvciB0eXBlISIpOworICAgICAgaWYgKGlzU2ltcGxlKCkpCisgICAgICAgIHJldHVybiBWLmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgICAgICByZXR1cm4gZ2V0RXh0ZW5kZWRWZWN0b3JOdW1FbGVtZW50cygpOworICAgIH0KKworICAgIC8vIEdpdmVuIGEgKHBvc3NpYmx5IHNjYWxhYmxlKSB2ZWN0b3IgdHlwZSwgcmV0dXJuIHRoZSBFbGVtZW50Q291bnQKKyAgICBNVlQ6OkVsZW1lbnRDb3VudCBnZXRWZWN0b3JFbGVtZW50Q291bnQoKSBjb25zdCB7CisgICAgICBhc3NlcnQoKGlzVmVjdG9yKCkpICYmICJJbnZhbGlkIHZlY3RvciB0eXBlISIpOworICAgICAgaWYgKGlzU2ltcGxlKCkpCisgICAgICAgIHJldHVybiBWLmdldFZlY3RvckVsZW1lbnRDb3VudCgpOworCisgICAgICBhc3NlcnQoIWlzU2NhbGFibGVWZWN0b3IoKSAmJgorICAgICAgICAgICAgICJXZSBkb24ndCBzdXBwb3J0IGV4dGVuZGVkIHNjYWxhYmxlIHR5cGVzIHlldCIpOworICAgICAgcmV0dXJuIHtnZXRFeHRlbmRlZFZlY3Rvck51bUVsZW1lbnRzKCksIGZhbHNlfTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUgdHlwZSBpbiBiaXRzLgorICAgIHVuc2lnbmVkIGdldFNpemVJbkJpdHMoKSBjb25zdCB7CisgICAgICBpZiAoaXNTaW1wbGUoKSkKKyAgICAgICAgcmV0dXJuIFYuZ2V0U2l6ZUluQml0cygpOworICAgICAgcmV0dXJuIGdldEV4dGVuZGVkU2l6ZUluQml0cygpOworICAgIH0KKworICAgIHVuc2lnbmVkIGdldFNjYWxhclNpemVJbkJpdHMoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0U2NhbGFyVHlwZSgpLmdldFNpemVJbkJpdHMoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgb3ZlcndyaXR0ZW4gYnkgYSBzdG9yZSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlCisgICAgLy8vIHR5cGUuCisgICAgdW5zaWduZWQgZ2V0U3RvcmVTaXplKCkgY29uc3QgeworICAgICAgcmV0dXJuIChnZXRTaXplSW5CaXRzKCkgKyA3KSAvIDg7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGJpdHMgb3ZlcndyaXR0ZW4gYnkgYSBzdG9yZSBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlCisgICAgLy8vIHR5cGUuCisgICAgdW5zaWduZWQgZ2V0U3RvcmVTaXplSW5CaXRzKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldFN0b3JlU2l6ZSgpICogODsKKyAgICB9CisKKyAgICAvLy8gUm91bmRzIHRoZSBiaXQtd2lkdGggb2YgdGhlIGdpdmVuIGludGVnZXIgRVZUIHVwIHRvIHRoZSBuZWFyZXN0IHBvd2VyIG9mCisgICAgLy8vIHR3byAoYW5kIGF0IGxlYXN0IHRvIGVpZ2h0KSwgYW5kIHJldHVybnMgdGhlIGludGVnZXIgRVZUIHdpdGggdGhhdAorICAgIC8vLyBudW1iZXIgb2YgYml0cy4KKyAgICBFVlQgZ2V0Um91bmRJbnRlZ2VyVHlwZShMTFZNQ29udGV4dCAmQ29udGV4dCkgY29uc3QgeworICAgICAgYXNzZXJ0KGlzSW50ZWdlcigpICYmICFpc1ZlY3RvcigpICYmICJJbnZhbGlkIGludGVnZXIgdHlwZSEiKTsKKyAgICAgIHVuc2lnbmVkIEJpdFdpZHRoID0gZ2V0U2l6ZUluQml0cygpOworICAgICAgaWYgKEJpdFdpZHRoIDw9IDgpCisgICAgICAgIHJldHVybiBFVlQoTVZUOjppOCk7CisgICAgICByZXR1cm4gZ2V0SW50ZWdlclZUKENvbnRleHQsIDEgPDwgTG9nMl8zMl9DZWlsKEJpdFdpZHRoKSk7CisgICAgfQorCisgICAgLy8vIEZpbmRzIHRoZSBzbWFsbGVzdCBzaW1wbGUgdmFsdWUgdHlwZSB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bworICAgIC8vLyBoYWxmIHRoZSB3aWR0aCBvZiB0aGlzIEVWVC4gSWYgbm8gc2ltcGxlIHZhbHVlIHR5cGUgY2FuIGJlIGZvdW5kLCBhbgorICAgIC8vLyBleHRlbmRlZCBpbnRlZ2VyIHZhbHVlIHR5cGUgb2YgaGFsZiB0aGUgc2l6ZSAocm91bmRlZCB1cCkgaXMgcmV0dXJuZWQuCisgICAgRVZUIGdldEhhbGZTaXplZEludGVnZXJWVChMTFZNQ29udGV4dCAmQ29udGV4dCkgY29uc3QgeworICAgICAgYXNzZXJ0KGlzSW50ZWdlcigpICYmICFpc1ZlY3RvcigpICYmICJJbnZhbGlkIGludGVnZXIgdHlwZSEiKTsKKyAgICAgIHVuc2lnbmVkIEVWVFNpemUgPSBnZXRTaXplSW5CaXRzKCk7CisgICAgICBmb3IgKHVuc2lnbmVkIEludFZUID0gTVZUOjpGSVJTVF9JTlRFR0VSX1ZBTFVFVFlQRTsKKyAgICAgICAgICBJbnRWVCA8PSBNVlQ6OkxBU1RfSU5URUdFUl9WQUxVRVRZUEU7ICsrSW50VlQpIHsKKyAgICAgICAgRVZUIEhhbGZWVCA9IEVWVCgoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpSW50VlQpOworICAgICAgICBpZiAoSGFsZlZULmdldFNpemVJbkJpdHMoKSAqIDIgPj0gRVZUU2l6ZSkKKyAgICAgICAgICByZXR1cm4gSGFsZlZUOworICAgICAgfQorICAgICAgcmV0dXJuIGdldEludGVnZXJWVChDb250ZXh0LCAoRVZUU2l6ZSArIDEpIC8gMik7CisgICAgfQorCisgICAgLy8vIFJldHVybiBhIFZUIGZvciBhbiBpbnRlZ2VyIHZlY3RvciB0eXBlIHdpdGggdGhlIHNpemUgb2YgdGhlCisgICAgLy8vIGVsZW1lbnRzIGRvdWJsZWQuIFRoZSB0eXBlZCByZXR1cm5lZCBtYXkgYmUgYW4gZXh0ZW5kZWQgdHlwZS4KKyAgICBFVlQgd2lkZW5JbnRlZ2VyVmVjdG9yRWxlbWVudFR5cGUoTExWTUNvbnRleHQgJkNvbnRleHQpIGNvbnN0IHsKKyAgICAgIEVWVCBFbHRWVCA9IGdldFZlY3RvckVsZW1lbnRUeXBlKCk7CisgICAgICBFbHRWVCA9IEVWVDo6Z2V0SW50ZWdlclZUKENvbnRleHQsIDIgKiBFbHRWVC5nZXRTaXplSW5CaXRzKCkpOworICAgICAgcmV0dXJuIEVWVDo6Z2V0VmVjdG9yVlQoQ29udGV4dCwgRWx0VlQsIGdldFZlY3RvckVsZW1lbnRDb3VudCgpKTsKKyAgICB9CisKKyAgICAvLyBSZXR1cm4gYSBWVCBmb3IgYSB2ZWN0b3IgdHlwZSB3aXRoIHRoZSBzYW1lIGVsZW1lbnQgdHlwZSBidXQKKyAgICAvLyBoYWxmIHRoZSBudW1iZXIgb2YgZWxlbWVudHMuIFRoZSB0eXBlIHJldHVybmVkIG1heSBiZSBhbgorICAgIC8vIGV4dGVuZGVkIHR5cGUuCisgICAgRVZUIGdldEhhbGZOdW1WZWN0b3JFbGVtZW50c1ZUKExMVk1Db250ZXh0ICZDb250ZXh0KSBjb25zdCB7CisgICAgICBFVlQgRWx0VlQgPSBnZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICAgICAgYXV0byBFbHRDbnQgPSBnZXRWZWN0b3JFbGVtZW50Q291bnQoKTsKKyAgICAgIGFzc2VydCghKEVsdENudC5NaW4gJiAxKSAmJiAiU3BsaXR0aW5nIHZlY3RvciwgYnV0IG5vdCBpbiBoYWxmISIpOworICAgICAgcmV0dXJuIEVWVDo6Z2V0VmVjdG9yVlQoQ29udGV4dCwgRWx0VlQsIEVsdENudCAvIDIpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIHZlY3RvciBpcyBhIHBvd2VyIG9mIDIuCisgICAgYm9vbCBpc1BvdzJWZWN0b3JUeXBlKCkgY29uc3QgeworICAgICAgdW5zaWduZWQgTkVsdHMgPSBnZXRWZWN0b3JOdW1FbGVtZW50cygpOworICAgICAgcmV0dXJuICEoTkVsdHMgJiAoTkVsdHMgLSAxKSk7CisgICAgfQorCisgICAgLy8vIFdpZGVucyB0aGUgbGVuZ3RoIG9mIHRoZSBnaXZlbiB2ZWN0b3IgRVZUIHVwIHRvIHRoZSBuZWFyZXN0IHBvd2VyIG9mIDIKKyAgICAvLy8gYW5kIHJldHVybnMgdGhhdCB0eXBlLgorICAgIEVWVCBnZXRQb3cyVmVjdG9yVHlwZShMTFZNQ29udGV4dCAmQ29udGV4dCkgY29uc3QgeworICAgICAgaWYgKCFpc1BvdzJWZWN0b3JUeXBlKCkpIHsKKyAgICAgICAgdW5zaWduZWQgTkVsdHMgPSBnZXRWZWN0b3JOdW1FbGVtZW50cygpOworICAgICAgICB1bnNpZ25lZCBQb3cyTkVsdHMgPSAxIDw8ICBMb2cyXzMyX0NlaWwoTkVsdHMpOworICAgICAgICByZXR1cm4gRVZUOjpnZXRWZWN0b3JWVChDb250ZXh0LCBnZXRWZWN0b3JFbGVtZW50VHlwZSgpLCBQb3cyTkVsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzU2NhbGFibGVWZWN0b3IoKSk7CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorICAgIH0KKworICAgIC8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdmFsdWUgdHlwZSBhcyBhIHN0cmluZywgZS5nLiAiaTMyIi4KKyAgICBzdGQ6OnN0cmluZyBnZXRFVlRTdHJpbmcoKSBjb25zdDsKKworICAgIC8vLyBUaGlzIG1ldGhvZCByZXR1cm5zIGFuIExMVk0gdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgRVZULgorICAgIC8vLyBGb3IgaW50ZWdlciB0eXBlcywgdGhpcyByZXR1cm5zIGFuIHVuc2lnbmVkIHR5cGUuIE5vdGUgdGhhdCB0aGlzIHdpbGwKKyAgICAvLy8gYWJvcnQgZm9yIHR5cGVzIHRoYXQgY2Fubm90IGJlIHJlcHJlc2VudGVkLgorICAgIFR5cGUgKmdldFR5cGVGb3JFVlQoTExWTUNvbnRleHQgJkNvbnRleHQpIGNvbnN0OworCisgICAgLy8vIFJldHVybiB0aGUgdmFsdWUgdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgICAvLy8gVGhpcyByZXR1cm5zIGFsbCBwb2ludGVycyBhcyBpUFRSLiAgSWYgSGFuZGxlVW5rbm93biBpcyB0cnVlLCB1bmtub3duCisgICAgLy8vIHR5cGVzIGFyZSByZXR1cm5lZCBhcyBPdGhlciwgb3RoZXJ3aXNlIHRoZXkgYXJlIGludmFsaWQuCisgICAgc3RhdGljIEVWVCBnZXRFVlQoVHlwZSAqVHksIGJvb2wgSGFuZGxlVW5rbm93biA9IGZhbHNlKTsKKworICAgIGludHB0cl90IGdldFJhd0JpdHMoKSBjb25zdCB7CisgICAgICBpZiAoaXNTaW1wbGUoKSkKKyAgICAgICAgcmV0dXJuIFYuU2ltcGxlVHk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiAoaW50cHRyX3QpKExMVk1UeSk7CisgICAgfQorCisgICAgLy8vIEEgbWVhbmluZ2xlc3MgYnV0IHdlbGwtYmVoYXZlZCBvcmRlciwgdXNlZnVsIGZvciBjb25zdHJ1Y3RpbmcKKyAgICAvLy8gY29udGFpbmVycy4KKyAgICBzdHJ1Y3QgY29tcGFyZVJhd0JpdHMgeworICAgICAgYm9vbCBvcGVyYXRvcigpKEVWVCBMLCBFVlQgUikgY29uc3QgeworICAgICAgICBpZiAoTC5WLlNpbXBsZVR5ID09IFIuVi5TaW1wbGVUeSkKKyAgICAgICAgICByZXR1cm4gTC5MTFZNVHkgPCBSLkxMVk1UeTsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBMLlYuU2ltcGxlVHkgPCBSLlYuU2ltcGxlVHk7CisgICAgICB9CisgICAgfTsKKworICBwcml2YXRlOgorICAgIC8vIE1ldGhvZHMgZm9yIGhhbmRsaW5nIHRoZSBFeHRlbmRlZC10eXBlIGNhc2UgaW4gZnVuY3Rpb25zIGFib3ZlLgorICAgIC8vIFRoZXNlIGFyZSBhbGwgb3V0LW9mLWxpbmUgdG8gcHJldmVudCB1c2VycyBvZiB0aGlzIGhlYWRlciBmaWxlCisgICAgLy8gZnJvbSBoYXZpbmcgYSBkZXBlbmRlbmN5IG9uIFR5cGUuaC4KKyAgICBFVlQgY2hhbmdlRXh0ZW5kZWRUeXBlVG9JbnRlZ2VyKCkgY29uc3Q7CisgICAgRVZUIGNoYW5nZUV4dGVuZGVkVmVjdG9yRWxlbWVudFR5cGVUb0ludGVnZXIoKSBjb25zdDsKKyAgICBzdGF0aWMgRVZUIGdldEV4dGVuZGVkSW50ZWdlclZUKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBCaXRXaWR0aCk7CisgICAgc3RhdGljIEVWVCBnZXRFeHRlbmRlZFZlY3RvclZUKExMVk1Db250ZXh0ICZDLCBFVlQgVlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUVsZW1lbnRzKTsKKyAgICBib29sIGlzRXh0ZW5kZWRGbG9hdGluZ1BvaW50KCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgICBib29sIGlzRXh0ZW5kZWRJbnRlZ2VyKCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgICBib29sIGlzRXh0ZW5kZWRTY2FsYXJJbnRlZ2VyKCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgICBib29sIGlzRXh0ZW5kZWRWZWN0b3IoKSBjb25zdCBMTFZNX1JFQURPTkxZOworICAgIGJvb2wgaXNFeHRlbmRlZDE2Qml0VmVjdG9yKCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgICBib29sIGlzRXh0ZW5kZWQzMkJpdFZlY3RvcigpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisgICAgYm9vbCBpc0V4dGVuZGVkNjRCaXRWZWN0b3IoKSBjb25zdCBMTFZNX1JFQURPTkxZOworICAgIGJvb2wgaXNFeHRlbmRlZDEyOEJpdFZlY3RvcigpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisgICAgYm9vbCBpc0V4dGVuZGVkMjU2Qml0VmVjdG9yKCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgICBib29sIGlzRXh0ZW5kZWQ1MTJCaXRWZWN0b3IoKSBjb25zdCBMTFZNX1JFQURPTkxZOworICAgIGJvb2wgaXNFeHRlbmRlZDEwMjRCaXRWZWN0b3IoKSBjb25zdCBMTFZNX1JFQURPTkxZOworICAgIGJvb2wgaXNFeHRlbmRlZDIwNDhCaXRWZWN0b3IoKSBjb25zdCBMTFZNX1JFQURPTkxZOworICAgIEVWVCBnZXRFeHRlbmRlZFZlY3RvckVsZW1lbnRUeXBlKCkgY29uc3Q7CisgICAgdW5zaWduZWQgZ2V0RXh0ZW5kZWRWZWN0b3JOdW1FbGVtZW50cygpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisgICAgdW5zaWduZWQgZ2V0RXh0ZW5kZWRTaXplSW5CaXRzKCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9WQUxVRVRZUEVTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9WYWx1ZVR5cGVzLnRkIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjczZWVjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9WYWx1ZVR5cGVzLnRkCkBAIC0wLDAgKzEsMTY5IEBACisvLz09PS0gVmFsdWVUeXBlcy50ZCAtIFZhbHVlVHlwZSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFZhbHVlIHR5cGVzIC0gVGhlc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIHJlZ2lzdGVyIHR5cGVzIGRlZmluZWQgaW4gdGhlCisvLyBWYWx1ZVR5cGVzLmggZmlsZS4gIElmIHlvdSB1cGRhdGUgYW55dGhpbmcgaGVyZSwgeW91IG11c3QgdXBkYXRlIGl0IHRoZXJlIGFzCisvLyB3ZWxsIQorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIFZhbHVlVHlwZTxpbnQgc2l6ZSwgaW50IHZhbHVlPiB7CisgIHN0cmluZyBOYW1lc3BhY2UgPSAiTVZUIjsKKyAgaW50IFNpemUgPSBzaXplOworICBpbnQgVmFsdWUgPSB2YWx1ZTsKK30KKworZGVmIE90aGVyVlQ6IFZhbHVlVHlwZTwwICAsICAxPjsgICAvLyAiT3RoZXIiIHZhbHVlCitkZWYgaTEgICAgIDogVmFsdWVUeXBlPDEgICwgIDI+OyAgIC8vIE9uZSBiaXQgYm9vbGVhbiB2YWx1ZQorZGVmIGk4ICAgICA6IFZhbHVlVHlwZTw4ICAsICAzPjsgICAvLyA4LWJpdCBpbnRlZ2VyIHZhbHVlCitkZWYgaTE2ICAgIDogVmFsdWVUeXBlPDE2ICwgIDQ+OyAgIC8vIDE2LWJpdCBpbnRlZ2VyIHZhbHVlCitkZWYgaTMyICAgIDogVmFsdWVUeXBlPDMyICwgIDU+OyAgIC8vIDMyLWJpdCBpbnRlZ2VyIHZhbHVlCitkZWYgaTY0ICAgIDogVmFsdWVUeXBlPDY0ICwgIDY+OyAgIC8vIDY0LWJpdCBpbnRlZ2VyIHZhbHVlCitkZWYgaTEyOCAgIDogVmFsdWVUeXBlPDEyOCwgIDc+OyAgIC8vIDEyOC1iaXQgaW50ZWdlciB2YWx1ZQorZGVmIGYxNiAgICA6IFZhbHVlVHlwZTwxNiAsICA4PjsgICAvLyAxNi1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUKK2RlZiBmMzIgICAgOiBWYWx1ZVR5cGU8MzIgLCAgOT47ICAgLy8gMzItYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlCitkZWYgZjY0ICAgIDogVmFsdWVUeXBlPDY0ICwgMTA+OyAgIC8vIDY0LWJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZQorZGVmIGY4MCAgICA6IFZhbHVlVHlwZTw4MCAsIDExPjsgICAvLyA4MC1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUKK2RlZiBmMTI4ICAgOiBWYWx1ZVR5cGU8MTI4LCAxMj47ICAgLy8gMTI4LWJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZQorZGVmIHBwY2YxMjg6IFZhbHVlVHlwZTwxMjgsIDEzPjsgICAvLyBQUEMgMTI4LWJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZQorCitkZWYgdjFpMSAgIDogVmFsdWVUeXBlPDEgLCAgMTQ+OyAgIC8vICAgMSB4IGkxIHZlY3RvciB2YWx1ZQorZGVmIHYyaTEgICA6IFZhbHVlVHlwZTwyICwgIDE1PjsgICAvLyAgIDIgeCBpMSB2ZWN0b3IgdmFsdWUKK2RlZiB2NGkxICAgOiBWYWx1ZVR5cGU8NCAsICAxNj47ICAgLy8gICA0IHggaTEgdmVjdG9yIHZhbHVlCitkZWYgdjhpMSAgIDogVmFsdWVUeXBlPDggLCAgMTc+OyAgIC8vICAgOCB4IGkxIHZlY3RvciB2YWx1ZQorZGVmIHYxNmkxICA6IFZhbHVlVHlwZTwxNiwgIDE4PjsgICAvLyAgMTYgeCBpMSB2ZWN0b3IgdmFsdWUKK2RlZiB2MzJpMSAgOiBWYWx1ZVR5cGU8MzIgLCAxOT47ICAgLy8gIDMyIHggaTEgdmVjdG9yIHZhbHVlCitkZWYgdjY0aTEgIDogVmFsdWVUeXBlPDY0ICwgMjA+OyAgIC8vICA2NCB4IGkxIHZlY3RvciB2YWx1ZQorZGVmIHYxMjhpMSA6IFZhbHVlVHlwZTwxMjgsIDIxPjsgICAvLyAxMjggeCBpMSB2ZWN0b3IgdmFsdWUKK2RlZiB2NTEyaTEgOiBWYWx1ZVR5cGU8NTEyLCAyMj47ICAgLy8gNTEyIHggaTEgdmVjdG9yIHZhbHVlCitkZWYgdjEwMjRpMTogVmFsdWVUeXBlPDEwMjQsMjM+OyAgIC8vMTAyNCB4IGkxIHZlY3RvciB2YWx1ZQorCitkZWYgdjFpOCAgIDogVmFsdWVUeXBlPDgsICAgMjQ+OyAgIC8vICAxIHggaTggIHZlY3RvciB2YWx1ZQorZGVmIHYyaTggICA6IFZhbHVlVHlwZTwxNiAsIDI1PjsgICAvLyAgMiB4IGk4ICB2ZWN0b3IgdmFsdWUKK2RlZiB2NGk4ICAgOiBWYWx1ZVR5cGU8MzIgLCAyNj47ICAgLy8gIDQgeCBpOCAgdmVjdG9yIHZhbHVlCitkZWYgdjhpOCAgIDogVmFsdWVUeXBlPDY0ICwgMjc+OyAgIC8vICA4IHggaTggIHZlY3RvciB2YWx1ZQorZGVmIHYxNmk4ICA6IFZhbHVlVHlwZTwxMjgsIDI4PjsgICAvLyAxNiB4IGk4ICB2ZWN0b3IgdmFsdWUKK2RlZiB2MzJpOCAgOiBWYWx1ZVR5cGU8MjU2LCAyOT47ICAgLy8gMzIgeCBpOCAgdmVjdG9yIHZhbHVlCitkZWYgdjY0aTggIDogVmFsdWVUeXBlPDUxMiwgMzA+OyAgIC8vIDY0IHggaTggIHZlY3RvciB2YWx1ZQorZGVmIHYxMjhpOCA6IFZhbHVlVHlwZTwxMDI0LDMxPjsgICAvLzEyOCB4IGk4ICB2ZWN0b3IgdmFsdWUKK2RlZiB2MjU2aTggOiBWYWx1ZVR5cGU8MjA0OCwzMj47ICAgLy8yNTYgeCBpOCAgdmVjdG9yIHZhbHVlCisKK2RlZiB2MWkxNiAgOiBWYWx1ZVR5cGU8MTYgLCAzMz47ICAgLy8gIDEgeCBpMTYgdmVjdG9yIHZhbHVlCitkZWYgdjJpMTYgIDogVmFsdWVUeXBlPDMyICwgMzQ+OyAgIC8vICAyIHggaTE2IHZlY3RvciB2YWx1ZQorZGVmIHY0aTE2ICA6IFZhbHVlVHlwZTw2NCAsIDM1PjsgICAvLyAgNCB4IGkxNiB2ZWN0b3IgdmFsdWUKK2RlZiB2OGkxNiAgOiBWYWx1ZVR5cGU8MTI4LCAzNj47ICAgLy8gIDggeCBpMTYgdmVjdG9yIHZhbHVlCitkZWYgdjE2aTE2IDogVmFsdWVUeXBlPDI1NiwgMzc+OyAgIC8vIDE2IHggaTE2IHZlY3RvciB2YWx1ZQorZGVmIHYzMmkxNiA6IFZhbHVlVHlwZTw1MTIsIDM4PjsgICAvLyAzMiB4IGkxNiB2ZWN0b3IgdmFsdWUKK2RlZiB2NjRpMTYgOiBWYWx1ZVR5cGU8MTAyNCwzOT47ICAgLy8gNjQgeCBpMTYgdmVjdG9yIHZhbHVlCitkZWYgdjEyOGkxNjogVmFsdWVUeXBlPDIwNDgsNDA+OyAgIC8vMTI4IHggaTE2IHZlY3RvciB2YWx1ZQorCitkZWYgdjFpMzIgIDogVmFsdWVUeXBlPDMyICwgNDE+OyAgIC8vICAxIHggaTMyIHZlY3RvciB2YWx1ZQorZGVmIHYyaTMyICA6IFZhbHVlVHlwZTw2NCAsIDQyPjsgICAvLyAgMiB4IGkzMiB2ZWN0b3IgdmFsdWUKK2RlZiB2NGkzMiAgOiBWYWx1ZVR5cGU8MTI4LCA0Mz47ICAgLy8gIDQgeCBpMzIgdmVjdG9yIHZhbHVlCitkZWYgdjhpMzIgIDogVmFsdWVUeXBlPDI1NiwgNDQ+OyAgIC8vICA4IHggaTMyIHZlY3RvciB2YWx1ZQorZGVmIHYxNmkzMiA6IFZhbHVlVHlwZTw1MTIsIDQ1PjsgICAvLyAxNiB4IGkzMiB2ZWN0b3IgdmFsdWUKK2RlZiB2MzJpMzIgOiBWYWx1ZVR5cGU8MTAyNCw0Nj47ICAgLy8gMzIgeCBpMzIgdmVjdG9yIHZhbHVlCitkZWYgdjY0aTMyIDogVmFsdWVUeXBlPDIwNDgsNDc+OyAgIC8vIDY0IHggaTMyIHZlY3RvciB2YWx1ZQorCitkZWYgdjFpNjQgIDogVmFsdWVUeXBlPDY0ICwgNDg+OyAgIC8vICAxIHggaTY0IHZlY3RvciB2YWx1ZQorZGVmIHYyaTY0ICA6IFZhbHVlVHlwZTwxMjgsIDQ5PjsgICAvLyAgMiB4IGk2NCB2ZWN0b3IgdmFsdWUKK2RlZiB2NGk2NCAgOiBWYWx1ZVR5cGU8MjU2LCA1MD47ICAgLy8gIDQgeCBpNjQgdmVjdG9yIHZhbHVlCitkZWYgdjhpNjQgIDogVmFsdWVUeXBlPDUxMiwgNTE+OyAgIC8vICA4IHggaTY0IHZlY3RvciB2YWx1ZQorZGVmIHYxNmk2NCA6IFZhbHVlVHlwZTwxMDI0LDUyPjsgICAvLyAxNiB4IGk2NCB2ZWN0b3IgdmFsdWUKK2RlZiB2MzJpNjQgOiBWYWx1ZVR5cGU8MjA0OCw1Mz47ICAgLy8gMzIgeCBpNjQgdmVjdG9yIHZhbHVlCisKK2RlZiB2MWkxMjggOiBWYWx1ZVR5cGU8MTI4LCA1ND47ICAgLy8gIDEgeCBpMTI4IHZlY3RvciB2YWx1ZQorCitkZWYgbnh2MWkxICA6IFZhbHVlVHlwZTwxLCAgIDU1PjsgIC8vIG4geCAgMSB4IGkxICB2ZWN0b3IgdmFsdWUKK2RlZiBueHYyaTEgIDogVmFsdWVUeXBlPDIsICAgNTY+OyAgLy8gbiB4ICAyIHggaTEgIHZlY3RvciB2YWx1ZQorZGVmIG54djRpMSAgOiBWYWx1ZVR5cGU8NCwgICA1Nz47ICAvLyBuIHggIDQgeCBpMSAgdmVjdG9yIHZhbHVlCitkZWYgbnh2OGkxICA6IFZhbHVlVHlwZTw4LCAgIDU4PjsgIC8vIG4geCAgOCB4IGkxICB2ZWN0b3IgdmFsdWUKK2RlZiBueHYxNmkxIDogVmFsdWVUeXBlPDE2LCAgNTk+OyAgLy8gbiB4IDE2IHggaTEgIHZlY3RvciB2YWx1ZQorZGVmIG54djMyaTEgOiBWYWx1ZVR5cGU8MzIsICA2MD47ICAvLyBuIHggMzIgeCBpMSAgdmVjdG9yIHZhbHVlCisKK2RlZiBueHYxaTggIDogVmFsdWVUeXBlPDgsICAgNjE+OyAgLy8gbiB4ICAxIHggaTggIHZlY3RvciB2YWx1ZQorZGVmIG54djJpOCAgOiBWYWx1ZVR5cGU8MTYsICA2Mj47ICAvLyBuIHggIDIgeCBpOCAgdmVjdG9yIHZhbHVlCitkZWYgbnh2NGk4ICA6IFZhbHVlVHlwZTwzMiwgIDYzPjsgIC8vIG4geCAgNCB4IGk4ICB2ZWN0b3IgdmFsdWUKK2RlZiBueHY4aTggIDogVmFsdWVUeXBlPDY0LCAgNjQ+OyAgLy8gbiB4ICA4IHggaTggIHZlY3RvciB2YWx1ZQorZGVmIG54djE2aTggOiBWYWx1ZVR5cGU8MTI4LCA2NT47ICAvLyBuIHggMTYgeCBpOCAgdmVjdG9yIHZhbHVlCitkZWYgbnh2MzJpOCA6IFZhbHVlVHlwZTwyNTYsIDY2PjsgIC8vIG4geCAzMiB4IGk4ICB2ZWN0b3IgdmFsdWUKKworZGVmIG54djFpMTYgOiBWYWx1ZVR5cGU8MTYsICA2Nz47ICAvLyBuIHggIDEgeCBpMTYgdmVjdG9yIHZhbHVlCitkZWYgbnh2MmkxNiA6IFZhbHVlVHlwZTwzMiwgIDY4PjsgIC8vIG4geCAgMiB4IGkxNiB2ZWN0b3IgdmFsdWUKK2RlZiBueHY0aTE2IDogVmFsdWVUeXBlPDY0LCAgNjk+OyAgLy8gbiB4ICA0IHggaTE2IHZlY3RvciB2YWx1ZQorZGVmIG54djhpMTYgOiBWYWx1ZVR5cGU8MTI4LCA3MD47ICAvLyBuIHggIDggeCBpMTYgdmVjdG9yIHZhbHVlCitkZWYgbnh2MTZpMTY6IFZhbHVlVHlwZTwyNTYsIDcxPjsgIC8vIG4geCAxNiB4IGkxNiB2ZWN0b3IgdmFsdWUKK2RlZiBueHYzMmkxNjogVmFsdWVUeXBlPDUxMiwgNzI+OyAgLy8gbiB4IDMyIHggaTE2IHZlY3RvciB2YWx1ZQorCitkZWYgbnh2MWkzMiA6IFZhbHVlVHlwZTwzMiwgIDczPjsgIC8vIG4geCAgMSB4IGkzMiB2ZWN0b3IgdmFsdWUKK2RlZiBueHYyaTMyIDogVmFsdWVUeXBlPDY0LCAgNzQ+OyAgLy8gbiB4ICAyIHggaTMyIHZlY3RvciB2YWx1ZQorZGVmIG54djRpMzIgOiBWYWx1ZVR5cGU8MTI4LCA3NT47ICAvLyBuIHggIDQgeCBpMzIgdmVjdG9yIHZhbHVlCitkZWYgbnh2OGkzMiA6IFZhbHVlVHlwZTwyNTYsIDc2PjsgIC8vIG4geCAgOCB4IGkzMiB2ZWN0b3IgdmFsdWUKK2RlZiBueHYxNmkzMjogVmFsdWVUeXBlPDUxMiwgNzc+OyAgLy8gbiB4IDE2IHggaTMyIHZlY3RvciB2YWx1ZQorZGVmIG54djMyaTMyOiBWYWx1ZVR5cGU8MTAyNCw3OD47ICAvLyBuIHggMzIgeCBpMzIgdmVjdG9yIHZhbHVlCisKK2RlZiBueHYxaTY0IDogVmFsdWVUeXBlPDY0LCAgNzk+OyAgLy8gbiB4ICAxIHggaTY0IHZlY3RvciB2YWx1ZQorZGVmIG54djJpNjQgOiBWYWx1ZVR5cGU8MTI4LCA4MD47ICAvLyBuIHggIDIgeCBpNjQgdmVjdG9yIHZhbHVlCitkZWYgbnh2NGk2NCA6IFZhbHVlVHlwZTwyNTYsIDgxPjsgIC8vIG4geCAgNCB4IGk2NCB2ZWN0b3IgdmFsdWUKK2RlZiBueHY4aTY0IDogVmFsdWVUeXBlPDUxMiwgODI+OyAgLy8gbiB4ICA4IHggaTY0IHZlY3RvciB2YWx1ZQorZGVmIG54djE2aTY0OiBWYWx1ZVR5cGU8MTAyNCw4Mz47ICAvLyBuIHggMTYgeCBpNjQgdmVjdG9yIHZhbHVlCitkZWYgbnh2MzJpNjQ6IFZhbHVlVHlwZTwyMDQ4LDg0PjsgIC8vIG4geCAzMiB4IGk2NCB2ZWN0b3IgdmFsdWUKKworZGVmIHYyZjE2ICA6IFZhbHVlVHlwZTwzMiAsIDg1PjsgICAvLyAgMiB4IGYxNiB2ZWN0b3IgdmFsdWUKK2RlZiB2NGYxNiAgOiBWYWx1ZVR5cGU8NjQgLCA4Nj47ICAgLy8gIDQgeCBmMTYgdmVjdG9yIHZhbHVlCitkZWYgdjhmMTYgIDogVmFsdWVUeXBlPDEyOCwgODc+OyAgIC8vICA4IHggZjE2IHZlY3RvciB2YWx1ZQorZGVmIHYxZjMyICA6IFZhbHVlVHlwZTwzMiAsIDg4PjsgICAvLyAgMSB4IGYzMiB2ZWN0b3IgdmFsdWUKK2RlZiB2MmYzMiAgOiBWYWx1ZVR5cGU8NjQgLCA4OT47ICAgLy8gIDIgeCBmMzIgdmVjdG9yIHZhbHVlCitkZWYgdjRmMzIgIDogVmFsdWVUeXBlPDEyOCwgOTA+OyAgIC8vICA0IHggZjMyIHZlY3RvciB2YWx1ZQorZGVmIHY4ZjMyICA6IFZhbHVlVHlwZTwyNTYsIDkxPjsgICAvLyAgOCB4IGYzMiB2ZWN0b3IgdmFsdWUKK2RlZiB2MTZmMzIgOiBWYWx1ZVR5cGU8NTEyLCA5Mj47ICAgLy8gMTYgeCBmMzIgdmVjdG9yIHZhbHVlCitkZWYgdjFmNjQgIDogVmFsdWVUeXBlPDY0LCAgOTM+OyAgIC8vICAxIHggZjY0IHZlY3RvciB2YWx1ZQorZGVmIHYyZjY0ICA6IFZhbHVlVHlwZTwxMjgsIDk0PjsgICAvLyAgMiB4IGY2NCB2ZWN0b3IgdmFsdWUKK2RlZiB2NGY2NCAgOiBWYWx1ZVR5cGU8MjU2LCA5NT47ICAgLy8gIDQgeCBmNjQgdmVjdG9yIHZhbHVlCitkZWYgdjhmNjQgIDogVmFsdWVUeXBlPDUxMiwgOTY+OyAgIC8vICA4IHggZjY0IHZlY3RvciB2YWx1ZQorCitkZWYgbnh2MmYxNiAgOiBWYWx1ZVR5cGU8MzIgLCAgOTc+OyAvLyBuIHggIDIgeCBmMTYgdmVjdG9yIHZhbHVlCitkZWYgbnh2NGYxNiAgOiBWYWx1ZVR5cGU8NjQgLCAgOTg+OyAvLyBuIHggIDQgeCBmMTYgdmVjdG9yIHZhbHVlCitkZWYgbnh2OGYxNiAgOiBWYWx1ZVR5cGU8MTI4LCAgOTk+OyAvLyBuIHggIDggeCBmMTYgdmVjdG9yIHZhbHVlCitkZWYgbnh2MWYzMiAgOiBWYWx1ZVR5cGU8MzIgLCAxMDA+OyAvLyBuIHggIDEgeCBmMzIgdmVjdG9yIHZhbHVlCitkZWYgbnh2MmYzMiAgOiBWYWx1ZVR5cGU8NjQgLCAxMDE+OyAvLyBuIHggIDIgeCBmMzIgdmVjdG9yIHZhbHVlCitkZWYgbnh2NGYzMiAgOiBWYWx1ZVR5cGU8MTI4LCAxMDI+OyAvLyBuIHggIDQgeCBmMzIgdmVjdG9yIHZhbHVlCitkZWYgbnh2OGYzMiAgOiBWYWx1ZVR5cGU8MjU2LCAxMDM+OyAvLyBuIHggIDggeCBmMzIgdmVjdG9yIHZhbHVlCitkZWYgbnh2MTZmMzIgOiBWYWx1ZVR5cGU8NTEyLCAxMDQ+OyAvLyBuIHggMTYgeCBmMzIgdmVjdG9yIHZhbHVlCitkZWYgbnh2MWY2NCAgOiBWYWx1ZVR5cGU8NjQsICAxMDU+OyAvLyBuIHggIDEgeCBmNjQgdmVjdG9yIHZhbHVlCitkZWYgbnh2MmY2NCAgOiBWYWx1ZVR5cGU8MTI4LCAxMDY+OyAvLyBuIHggIDIgeCBmNjQgdmVjdG9yIHZhbHVlCitkZWYgbnh2NGY2NCAgOiBWYWx1ZVR5cGU8MjU2LCAxMDc+OyAvLyBuIHggIDQgeCBmNjQgdmVjdG9yIHZhbHVlCitkZWYgbnh2OGY2NCAgOiBWYWx1ZVR5cGU8NTEyLCAxMDg+OyAvLyBuIHggIDggeCBmNjQgdmVjdG9yIHZhbHVlCisKK2RlZiB4ODZtbXggOiBWYWx1ZVR5cGU8NjQgLCAxMDk+OyAgIC8vIFg4NiBNTVggdmFsdWUKK2RlZiBGbGFnVlQgOiBWYWx1ZVR5cGU8MCAgLCAxMTA+OyAgIC8vIFByZS1SQSBzY2hlZCBnbHVlCitkZWYgaXNWb2lkIDogVmFsdWVUeXBlPDAgICwgMTExPjsgICAvLyBQcm9kdWNlcyBubyB2YWx1ZQorZGVmIHVudHlwZWQ6IFZhbHVlVHlwZTw4ICAsIDExMj47ICAgLy8gUHJvZHVjZXMgYW4gdW50eXBlZCB2YWx1ZQorZGVmIEV4Y2VwdFJlZjogVmFsdWVUeXBlPDAsIDExMz47ICAgLy8gV2ViQXNzZW1ibHkncyBleGNlcHRfcmVmIHR5cGUKK2RlZiB0b2tlbiAgOiBWYWx1ZVR5cGU8MCAgLCAyNDg+OyAgIC8vIFRva2VuVHkKK2RlZiBNZXRhZGF0YVZUOiBWYWx1ZVR5cGU8MCwgMjQ5PjsgIC8vIE1ldGFkYXRhCisKKy8vIFBzZXVkbyB2YWx1ZXR5cGUgbWFwcGVkIHRvIHRoZSBjdXJyZW50IHBvaW50ZXIgc2l6ZSB0byBhbnkgYWRkcmVzcyBzcGFjZS4KKy8vIFNob3VsZCBvbmx5IGJlIHVzZWQgaW4gVGFibGVHZW4uCitkZWYgaVBUUkFueSAgIDogVmFsdWVUeXBlPDAsIDI1MD47CisKKy8vIFBzZXVkbyB2YWx1ZXR5cGUgdG8gcmVwcmVzZW50ICJ2ZWN0b3Igb2YgYW55IHNpemUiCitkZWYgdkFueSAgIDogVmFsdWVUeXBlPDAgICwgMjUxPjsKKworLy8gUHNldWRvIHZhbHVldHlwZSB0byByZXByZXNlbnQgImZsb2F0IG9mIGFueSBmb3JtYXQiCitkZWYgZkFueSAgIDogVmFsdWVUeXBlPDAgICwgMjUyPjsKKworLy8gUHNldWRvIHZhbHVldHlwZSB0byByZXByZXNlbnQgImludGVnZXIgb2YgYW55IGJpdCB3aWR0aCIKK2RlZiBpQW55ICAgOiBWYWx1ZVR5cGU8MCAgLCAyNTM+OworCisvLyBQc2V1ZG8gdmFsdWV0eXBlIG1hcHBlZCB0byB0aGUgY3VycmVudCBwb2ludGVyIHNpemUuCitkZWYgaVBUUiAgIDogVmFsdWVUeXBlPDAgICwgMjU0PjsKKworLy8gUHNldWRvIHZhbHVldHlwZSB0byByZXByZXNlbnQgImFueSB0eXBlIG9mIGFueSBzaXplIi4KK2RlZiBBbnkgICAgOiBWYWx1ZVR5cGU8MCAgLCAyNTU+OwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db2RlR2VuL1ZpcnRSZWdNYXAuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9WaXJ0UmVnTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IwNmYwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9WaXJ0UmVnTWFwLmgKQEAgLTAsMCArMSwxODggQEAKKy8vPT09LSBsbHZtL0NvZGVHZW4vVmlydFJlZ01hcC5oIC0gVmlydHVhbCBSZWdpc3RlciBNYXAgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSB2aXJ0dWFsIHJlZ2lzdGVyIG1hcC4gVGhpcyBtYXBzIHZpcnR1YWwgcmVnaXN0ZXJzIHRvCisvLyBwaHlzaWNhbCByZWdpc3RlcnMgYW5kIHZpcnR1YWwgcmVnaXN0ZXJzIHRvIHN0YWNrIHNsb3RzLiBJdCBpcyBjcmVhdGVkIGFuZAorLy8gdXBkYXRlZCBieSBhIHJlZ2lzdGVyIGFsbG9jYXRvciBhbmQgdGhlbiB1c2VkIGJ5IGEgbWFjaGluZSBjb2RlIHJld3JpdGVyIHRoYXQKKy8vIGFkZHMgc3BpbGwgY29kZSBhbmQgcmV3cml0ZXMgdmlydHVhbCBpbnRvIHBoeXNpY2FsIHJlZ2lzdGVyIHJlZmVyZW5jZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0NPREVHRU5fVklSVFJFR01BUF9ICisjZGVmaW5lIExMVk1fQ09ERUdFTl9WSVJUUkVHTUFQX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0luZGV4ZWRNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0NvZGVHZW4vTWFjaGluZUZ1bmN0aW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQ29kZUdlbi9UYXJnZXRSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DUmVnaXN0ZXJJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lRnVuY3Rpb247CitjbGFzcyBNYWNoaW5lUmVnaXN0ZXJJbmZvOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBUYXJnZXRJbnN0ckluZm87CisKKyAgY2xhc3MgVmlydFJlZ01hcCA6IHB1YmxpYyBNYWNoaW5lRnVuY3Rpb25QYXNzIHsKKyAgcHVibGljOgorICAgIGVudW0geworICAgICAgTk9fUEhZU19SRUcgPSAwLAorICAgICAgTk9fU1RBQ0tfU0xPVCA9ICgxTCA8PCAzMCktMSwKKyAgICAgIE1BWF9TVEFDS19TTE9UID0gKDFMIDw8IDE4KS0xCisgICAgfTsKKworICBwcml2YXRlOgorICAgIE1hY2hpbmVSZWdpc3RlckluZm8gKk1SSTsKKyAgICBjb25zdCBUYXJnZXRJbnN0ckluZm8gKlRJSTsKKyAgICBjb25zdCBUYXJnZXRSZWdpc3RlckluZm8gKlRSSTsKKyAgICBNYWNoaW5lRnVuY3Rpb24gKk1GOworCisgICAgLy8vIFZpcnQyUGh5c01hcCAtIFRoaXMgaXMgYSB2aXJ0dWFsIHRvIHBoeXNpY2FsIHJlZ2lzdGVyCisgICAgLy8vIG1hcHBpbmcuIEVhY2ggdmlydHVhbCByZWdpc3RlciBpcyByZXF1aXJlZCB0byBoYXZlIGFuIGVudHJ5IGluCisgICAgLy8vIGl0OyBldmVuIHNwaWxsZWQgdmlydHVhbCByZWdpc3RlcnMgKHRoZSByZWdpc3RlciBtYXBwZWQgdG8gYQorICAgIC8vLyBzcGlsbGVkIHJlZ2lzdGVyIGlzIHRoZSB0ZW1wb3JhcnkgdXNlZCB0byBsb2FkIGl0IGZyb20gdGhlCisgICAgLy8vIHN0YWNrKS4KKyAgICBJbmRleGVkTWFwPHVuc2lnbmVkLCBWaXJ0UmVnMkluZGV4RnVuY3Rvcj4gVmlydDJQaHlzTWFwOworCisgICAgLy8vIFZpcnQyU3RhY2tTbG90TWFwIC0gVGhpcyBpcyB2aXJ0dWFsIHJlZ2lzdGVyIHRvIHN0YWNrIHNsb3QKKyAgICAvLy8gbWFwcGluZy4gRWFjaCBzcGlsbGVkIHZpcnR1YWwgcmVnaXN0ZXIgaGFzIGFuIGVudHJ5IGluIGl0CisgICAgLy8vIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBzdGFjayBzbG90IHRoaXMgcmVnaXN0ZXIgaXMgc3BpbGxlZAorICAgIC8vLyBhdC4KKyAgICBJbmRleGVkTWFwPGludCwgVmlydFJlZzJJbmRleEZ1bmN0b3I+IFZpcnQyU3RhY2tTbG90TWFwOworCisgICAgLy8vIFZpcnQyU3BsaXRNYXAgLSBUaGlzIGlzIHZpcnR1YWwgcmVnaXN0ZXIgdG8gc3BsaXR0ZWQgdmlydHVhbCByZWdpc3RlcgorICAgIC8vLyBtYXBwaW5nLgorICAgIEluZGV4ZWRNYXA8dW5zaWduZWQsIFZpcnRSZWcySW5kZXhGdW5jdG9yPiBWaXJ0MlNwbGl0TWFwOworCisgICAgLy8vIGNyZWF0ZVNwaWxsU2xvdCAtIEFsbG9jYXRlIGEgc3BpbGwgc2xvdCBmb3IgUkMgZnJvbSBNRkkuCisgICAgdW5zaWduZWQgY3JlYXRlU3BpbGxTbG90KGNvbnN0IFRhcmdldFJlZ2lzdGVyQ2xhc3MgKlJDKTsKKworICBwdWJsaWM6CisgICAgc3RhdGljIGNoYXIgSUQ7CisKKyAgICBWaXJ0UmVnTWFwKCkgOiBNYWNoaW5lRnVuY3Rpb25QYXNzKElEKSwgVmlydDJQaHlzTWFwKE5PX1BIWVNfUkVHKSwKKyAgICAgICAgICAgICAgICAgICBWaXJ0MlN0YWNrU2xvdE1hcChOT19TVEFDS19TTE9UKSwgVmlydDJTcGxpdE1hcCgwKSB7fQorICAgIFZpcnRSZWdNYXAoY29uc3QgVmlydFJlZ01hcCAmKSA9IGRlbGV0ZTsKKyAgICBWaXJ0UmVnTWFwICZvcGVyYXRvcj0oY29uc3QgVmlydFJlZ01hcCAmKSA9IGRlbGV0ZTsKKworICAgIGJvb2wgcnVuT25NYWNoaW5lRnVuY3Rpb24oTWFjaGluZUZ1bmN0aW9uICZNRikgb3ZlcnJpZGU7CisKKyAgICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgIEFVLnNldFByZXNlcnZlc0FsbCgpOworICAgICAgTWFjaGluZUZ1bmN0aW9uUGFzczo6Z2V0QW5hbHlzaXNVc2FnZShBVSk7CisgICAgfQorCisgICAgTWFjaGluZUZ1bmN0aW9uICZnZXRNYWNoaW5lRnVuY3Rpb24oKSBjb25zdCB7CisgICAgICBhc3NlcnQoTUYgJiYgImdldE1hY2hpbmVGdW5jdGlvbiBjYWxsZWQgYmVmb3JlIHJ1bk9uTWFjaGluZUZ1bmN0aW9uIik7CisgICAgICByZXR1cm4gKk1GOworICAgIH0KKworICAgIE1hY2hpbmVSZWdpc3RlckluZm8gJmdldFJlZ0luZm8oKSBjb25zdCB7IHJldHVybiAqTVJJOyB9CisgICAgY29uc3QgVGFyZ2V0UmVnaXN0ZXJJbmZvICZnZXRUYXJnZXRSZWdJbmZvKCkgY29uc3QgeyByZXR1cm4gKlRSSTsgfQorCisgICAgdm9pZCBncm93KCk7CisKKyAgICAvLy8gQGJyaWVmIHJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgcmVnaXN0ZXIgaXMKKyAgICAvLy8gbWFwcGVkIHRvIGEgcGh5c2ljYWwgcmVnaXN0ZXIKKyAgICBib29sIGhhc1BoeXModW5zaWduZWQgdmlydFJlZykgY29uc3QgeworICAgICAgcmV0dXJuIGdldFBoeXModmlydFJlZykgIT0gTk9fUEhZU19SRUc7CisgICAgfQorCisgICAgLy8vIEBicmllZiByZXR1cm5zIHRoZSBwaHlzaWNhbCByZWdpc3RlciBtYXBwZWQgdG8gdGhlIHNwZWNpZmllZAorICAgIC8vLyB2aXJ0dWFsIHJlZ2lzdGVyCisgICAgdW5zaWduZWQgZ2V0UGh5cyh1bnNpZ25lZCB2aXJ0UmVnKSBjb25zdCB7CisgICAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3Rlcih2aXJ0UmVnKSk7CisgICAgICByZXR1cm4gVmlydDJQaHlzTWFwW3ZpcnRSZWddOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgY3JlYXRlcyBhIG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZpZWQgdmlydHVhbCByZWdpc3RlciB0bworICAgIC8vLyB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsIHJlZ2lzdGVyCisgICAgdm9pZCBhc3NpZ25WaXJ0MlBoeXModW5zaWduZWQgdmlydFJlZywgTUNQaHlzUmVnIHBoeXNSZWcpOworCisgICAgLy8vIEBicmllZiBjbGVhcnMgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIHJlZ2lzdGVyJ3MsIHBoeXNpY2FsCisgICAgLy8vIHJlZ2lzdGVyIG1hcHBpbmcKKyAgICB2b2lkIGNsZWFyVmlydCh1bnNpZ25lZCB2aXJ0UmVnKSB7CisgICAgICBhc3NlcnQoVGFyZ2V0UmVnaXN0ZXJJbmZvOjppc1ZpcnR1YWxSZWdpc3Rlcih2aXJ0UmVnKSk7CisgICAgICBhc3NlcnQoVmlydDJQaHlzTWFwW3ZpcnRSZWddICE9IE5PX1BIWVNfUkVHICYmCisgICAgICAgICAgICAgImF0dGVtcHQgdG8gY2xlYXIgYSBub3QgYXNzaWduZWQgdmlydHVhbCByZWdpc3RlciIpOworICAgICAgVmlydDJQaHlzTWFwW3ZpcnRSZWddID0gTk9fUEhZU19SRUc7CisgICAgfQorCisgICAgLy8vIEBicmllZiBjbGVhcnMgYWxsIHZpcnR1YWwgdG8gcGh5c2ljYWwgcmVnaXN0ZXIgbWFwcGluZ3MKKyAgICB2b2lkIGNsZWFyQWxsVmlydCgpIHsKKyAgICAgIFZpcnQyUGh5c01hcC5jbGVhcigpOworICAgICAgZ3JvdygpOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgcmV0dXJucyB0cnVlIGlmIFZpcnRSZWcgaXMgYXNzaWduZWQgdG8gaXRzIHByZWZlcnJlZCBwaHlzcmVnLgorICAgIGJvb2wgaGFzUHJlZmVycmVkUGh5cyh1bnNpZ25lZCBWaXJ0UmVnKTsKKworICAgIC8vLyBAYnJpZWYgcmV0dXJucyB0cnVlIGlmIFZpcnRSZWcgaGFzIGEga25vd24gcHJlZmVycmVkIHJlZ2lzdGVyLgorICAgIC8vLyBUaGlzIHJldHVybnMgZmFsc2UgaWYgVmlydFJlZyBoYXMgYSBwcmVmZXJlbmNlIHRoYXQgaXMgYSB2aXJ0dWFsCisgICAgLy8vIHJlZ2lzdGVyIHRoYXQgaGFzbid0IGJlZW4gYXNzaWduZWQgeWV0LgorICAgIGJvb2wgaGFzS25vd25QcmVmZXJlbmNlKHVuc2lnbmVkIFZpcnRSZWcpOworCisgICAgLy8vIEBicmllZiByZWNvcmRzIHZpcnRSZWcgaXMgYSBzcGxpdCBsaXZlIGludGVydmFsIGZyb20gU1JlZy4KKyAgICB2b2lkIHNldElzU3BsaXRGcm9tUmVnKHVuc2lnbmVkIHZpcnRSZWcsIHVuc2lnbmVkIFNSZWcpIHsKKyAgICAgIFZpcnQyU3BsaXRNYXBbdmlydFJlZ10gPSBTUmVnOworICAgIH0KKworICAgIC8vLyBAYnJpZWYgcmV0dXJucyB0aGUgbGl2ZSBpbnRlcnZhbCB2aXJ0UmVnIGlzIHNwbGl0IGZyb20uCisgICAgdW5zaWduZWQgZ2V0UHJlU3BsaXRSZWcodW5zaWduZWQgdmlydFJlZykgY29uc3QgeworICAgICAgcmV0dXJuIFZpcnQyU3BsaXRNYXBbdmlydFJlZ107CisgICAgfQorCisgICAgLy8vIGdldE9yaWdpbmFsIC0gUmV0dXJuIHRoZSBvcmlnaW5hbCB2aXJ0dWFsIHJlZ2lzdGVyIHRoYXQgVmlydFJlZyBkZXNjZW5kcworICAgIC8vLyBmcm9tIHRocm91Z2ggc3BsaXR0aW5nLgorICAgIC8vLyBBIHJlZ2lzdGVyIHRoYXQgd2FzIG5vdCBjcmVhdGVkIGJ5IHNwbGl0dGluZyBpcyBpdHMgb3duIG9yaWdpbmFsLgorICAgIC8vLyBUaGlzIG9wZXJhdGlvbiBpcyBpZGVtcG90ZW50LgorICAgIHVuc2lnbmVkIGdldE9yaWdpbmFsKHVuc2lnbmVkIFZpcnRSZWcpIGNvbnN0IHsKKyAgICAgIHVuc2lnbmVkIE9yaWcgPSBnZXRQcmVTcGxpdFJlZyhWaXJ0UmVnKTsKKyAgICAgIHJldHVybiBPcmlnID8gT3JpZyA6IFZpcnRSZWc7CisgICAgfQorCisgICAgLy8vIEBicmllZiByZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2aXJ0dWFsIHJlZ2lzdGVyIGlzIG5vdAorICAgIC8vLyBtYXBwZWQgdG8gYSBzdGFjayBzbG90IG9yIHJlbWF0ZXJpYWxpemVkLgorICAgIGJvb2wgaXNBc3NpZ25lZFJlZyh1bnNpZ25lZCB2aXJ0UmVnKSBjb25zdCB7CisgICAgICBpZiAoZ2V0U3RhY2tTbG90KHZpcnRSZWcpID09IE5PX1NUQUNLX1NMT1QpCisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgLy8gU3BsaXQgcmVnaXN0ZXIgY2FuIGJlIGFzc2lnbmVkIGEgcGh5c2ljYWwgcmVnaXN0ZXIgYXMgd2VsbCBhcyBhCisgICAgICAvLyBzdGFjayBzbG90IG9yIHJlbWF0IGlkLgorICAgICAgcmV0dXJuIChWaXJ0MlNwbGl0TWFwW3ZpcnRSZWddICYmIFZpcnQyUGh5c01hcFt2aXJ0UmVnXSAhPSBOT19QSFlTX1JFRyk7CisgICAgfQorCisgICAgLy8vIEBicmllZiByZXR1cm5zIHRoZSBzdGFjayBzbG90IG1hcHBlZCB0byB0aGUgc3BlY2lmaWVkIHZpcnR1YWwKKyAgICAvLy8gcmVnaXN0ZXIKKyAgICBpbnQgZ2V0U3RhY2tTbG90KHVuc2lnbmVkIHZpcnRSZWcpIGNvbnN0IHsKKyAgICAgIGFzc2VydChUYXJnZXRSZWdpc3RlckluZm86OmlzVmlydHVhbFJlZ2lzdGVyKHZpcnRSZWcpKTsKKyAgICAgIHJldHVybiBWaXJ0MlN0YWNrU2xvdE1hcFt2aXJ0UmVnXTsKKyAgICB9CisKKyAgICAvLy8gQGJyaWVmIGNyZWF0ZSBhIG1hcHBpbmcgZm9yIHRoZSBzcGVjaWZlZCB2aXJ0dWFsIHJlZ2lzdGVyIHRvCisgICAgLy8vIHRoZSBuZXh0IGF2YWlsYWJsZSBzdGFjayBzbG90CisgICAgaW50IGFzc2lnblZpcnQyU3RhY2tTbG90KHVuc2lnbmVkIHZpcnRSZWcpOworCisgICAgLy8vIEBicmllZiBjcmVhdGUgYSBtYXBwaW5nIGZvciB0aGUgc3BlY2lmaWVkIHZpcnR1YWwgcmVnaXN0ZXIgdG8KKyAgICAvLy8gdGhlIHNwZWNpZmllZCBzdGFjayBzbG90CisgICAgdm9pZCBhc3NpZ25WaXJ0MlN0YWNrU2xvdCh1bnNpZ25lZCB2aXJ0UmVnLCBpbnQgZnJhbWVJbmRleCk7CisKKyAgICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlKiBNID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7CisgICAgdm9pZCBkdW1wKCkgY29uc3Q7CisgIH07CisKKyAgaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgVmlydFJlZ01hcCAmVlJNKSB7CisgICAgVlJNLnByaW50KE9TKTsKKyAgICByZXR1cm4gT1M7CisgIH0KKworfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9WSVJUUkVHTUFQX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29kZUdlbi9XaW5FSEZ1bmNJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vV2luRUhGdW5jSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwNDMwMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvZGVHZW4vV2luRUhGdW5jSW5mby5oCkBAIC0wLDAgKzEsMTI5IEBACisvLz09PS0gbGx2bS9Db2RlR2VuL1dpbkVIRnVuY0luZm8uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIERhdGEgc3RydWN0dXJlcyBhbmQgYXNzb2NpYXRlZCBzdGF0ZSBmb3IgV2luZG93cyBleGNlcHRpb24gaGFuZGxpbmcgc2NoZW1lcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9XSU5FSEZVTkNJTkZPX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1dJTkVIRlVOQ0lORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVyVW5pb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQWxsb2NhSW5zdDsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBGdW5jbGV0UGFkSW5zdDsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgR2xvYmFsVmFyaWFibGU7CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIEludm9rZUluc3Q7CitjbGFzcyBNYWNoaW5lQmFzaWNCbG9jazsKK2NsYXNzIE1DU3ltYm9sOworCisvLyBUaGUgZm9sbG93aW5nIHN0cnVjdHMgcmVzcHJlc2VudCB0aGUgLnhkYXRhIHRhYmxlcyBmb3IgdmFyaW91cworLy8gV2luZG93cy1yZWxhdGVkIEVIIHBlcnNvbmFsaXRpZXMuCisKK3VzaW5nIE1CQk9yQmFzaWNCbG9jayA9IFBvaW50ZXJVbmlvbjxjb25zdCBCYXNpY0Jsb2NrICosIE1hY2hpbmVCYXNpY0Jsb2NrICo+OworCitzdHJ1Y3QgQ3h4VW53aW5kTWFwRW50cnkgeworICBpbnQgVG9TdGF0ZTsKKyAgTUJCT3JCYXNpY0Jsb2NrIENsZWFudXA7Cit9OworCisvLy8gU2ltaWxhciB0byBDeHhVbndpbmRNYXBFbnRyeSwgYnV0IHN1cHBvcnRzIFNFSCBmaWx0ZXJzLgorc3RydWN0IFNFSFVud2luZE1hcEVudHJ5IHsKKyAgLy8vIElmIHVud2luZGluZyBjb250aW51ZXMgdGhyb3VnaCB0aGlzIGhhbmRsZXIsIHRyYW5zaXRpb24gdG8gdGhlIGhhbmRsZXIgYXQKKyAgLy8vIHRoaXMgc3RhdGUuIFRoaXMgaW5kZXhlcyBpbnRvIFNFSFVud2luZE1hcC4KKyAgaW50IFRvU3RhdGUgPSAtMTsKKworICBib29sIElzRmluYWxseSA9IGZhbHNlOworCisgIC8vLyBIb2xkcyB0aGUgZmlsdGVyIGV4cHJlc3Npb24gZnVuY3Rpb24uCisgIGNvbnN0IEZ1bmN0aW9uICpGaWx0ZXIgPSBudWxscHRyOworCisgIC8vLyBIb2xkcyB0aGUgX19leGNlcHQgb3IgX19maW5hbGx5IGJhc2ljIGJsb2NrLgorICBNQkJPckJhc2ljQmxvY2sgSGFuZGxlcjsKK307CisKK3N0cnVjdCBXaW5FSEhhbmRsZXJUeXBlIHsKKyAgaW50IEFkamVjdGl2ZXM7CisgIC8vLyBUaGUgQ2F0Y2hPYmogc3RhcnRzIG91dCBsaWZlIGFzIGFuIExMVk0gYWxsb2NhIGFuZCBpcyBldmVudHVhbGx5IHR1cm5lZAorICAvLy8gZnJhbWUgaW5kZXguCisgIHVuaW9uIHsKKyAgICBjb25zdCBBbGxvY2FJbnN0ICpBbGxvY2E7CisgICAgaW50IEZyYW1lSW5kZXg7CisgIH0gQ2F0Y2hPYmogPSB7fTsKKyAgR2xvYmFsVmFyaWFibGUgKlR5cGVEZXNjcmlwdG9yOworICBNQkJPckJhc2ljQmxvY2sgSGFuZGxlcjsKK307CisKK3N0cnVjdCBXaW5FSFRyeUJsb2NrTWFwRW50cnkgeworICBpbnQgVHJ5TG93ID0gLTE7CisgIGludCBUcnlIaWdoID0gLTE7CisgIGludCBDYXRjaEhpZ2ggPSAtMTsKKyAgU21hbGxWZWN0b3I8V2luRUhIYW5kbGVyVHlwZSwgMT4gSGFuZGxlckFycmF5OworfTsKKworZW51bSBjbGFzcyBDbHJIYW5kbGVyVHlwZSB7IENhdGNoLCBGaW5hbGx5LCBGYXVsdCwgRmlsdGVyIH07CisKK3N0cnVjdCBDbHJFSFVud2luZE1hcEVudHJ5IHsKKyAgTUJCT3JCYXNpY0Jsb2NrIEhhbmRsZXI7CisgIHVpbnQzMl90IFR5cGVUb2tlbjsKKyAgaW50IEhhbmRsZXJQYXJlbnRTdGF0ZTsgLy8vPCBPdXRlciBoYW5kbGVyIGVuY2xvc2luZyB0aGlzIGVudHJ5J3MgaGFuZGxlcgorICBpbnQgVHJ5UGFyZW50U3RhdGU7IC8vLzwgT3V0ZXIgdHJ5IHJlZ2lvbiBlbmNsb3NpbmcgdGhpcyBlbnRyeSdzIHRyeSByZWdpb24sCisgICAgICAgICAgICAgICAgICAgICAgLy8vPCB0cmVhdGluZyBsYXRlciBjYXRjaGVzIG9uIHNhbWUgdHJ5IGFzICJvdXRlciIKKyAgQ2xySGFuZGxlclR5cGUgSGFuZGxlclR5cGU7Cit9OworCitzdHJ1Y3QgV2luRUhGdW5jSW5mbyB7CisgIERlbnNlTWFwPGNvbnN0IEluc3RydWN0aW9uICosIGludD4gRUhQYWRTdGF0ZU1hcDsKKyAgRGVuc2VNYXA8Y29uc3QgRnVuY2xldFBhZEluc3QgKiwgaW50PiBGdW5jbGV0QmFzZVN0YXRlTWFwOworICBEZW5zZU1hcDxjb25zdCBJbnZva2VJbnN0ICosIGludD4gSW52b2tlU3RhdGVNYXA7CisgIERlbnNlTWFwPE1DU3ltYm9sICosIHN0ZDo6cGFpcjxpbnQsIE1DU3ltYm9sICo+PiBMYWJlbFRvU3RhdGVNYXA7CisgIFNtYWxsVmVjdG9yPEN4eFVud2luZE1hcEVudHJ5LCA0PiBDeHhVbndpbmRNYXA7CisgIFNtYWxsVmVjdG9yPFdpbkVIVHJ5QmxvY2tNYXBFbnRyeSwgND4gVHJ5QmxvY2tNYXA7CisgIFNtYWxsVmVjdG9yPFNFSFVud2luZE1hcEVudHJ5LCA0PiBTRUhVbndpbmRNYXA7CisgIFNtYWxsVmVjdG9yPENsckVIVW53aW5kTWFwRW50cnksIDQ+IENsckVIVW53aW5kTWFwOworICBpbnQgVW53aW5kSGVscEZyYW1lSWR4ID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKKyAgaW50IFBTUFN5bUZyYW1lSWR4ID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKKworICBpbnQgZ2V0TGFzdFN0YXRlTnVtYmVyKCkgY29uc3QgeyByZXR1cm4gQ3h4VW53aW5kTWFwLnNpemUoKSAtIDE7IH0KKworICB2b2lkIGFkZElQVG9TdGF0ZVJhbmdlKGNvbnN0IEludm9rZUluc3QgKklJLCBNQ1N5bWJvbCAqSW52b2tlQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgTUNTeW1ib2wgKkludm9rZUVuZCk7CisKKyAgaW50IEVIUmVnTm9kZUZyYW1lSW5kZXggPSBzdGQ6Om51bWVyaWNfbGltaXRzPGludD46Om1heCgpOworICBpbnQgRUhSZWdOb2RlRW5kT2Zmc2V0ID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKKyAgaW50IEVIR3VhcmRGcmFtZUluZGV4ID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKKyAgaW50IFNFSFNldEZyYW1lT2Zmc2V0ID0gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKTsKKworICBXaW5FSEZ1bmNJbmZvKCk7Cit9OworCisvLy8gQW5hbHl6ZSB0aGUgSVIgaW4gUGFyZW50Rm4gYW5kIGl0J3MgaGFuZGxlcnMgdG8gYnVpbGQgV2luRUhGdW5jSW5mbywgd2hpY2gKKy8vLyBkZXNjcmliZXMgdGhlIHN0YXRlIG51bWJlcnMgYW5kIHRhYmxlcyB1c2VkIGJ5IF9fQ3h4RnJhbWVIYW5kbGVyMy4gVGhpcworLy8vIGFuYWx5c2lzIGFzc3VtZXMgdGhhdCBXaW5FSFByZXBhcmUgaGFzIGFscmVhZHkgYmVlbiBydW4uCit2b2lkIGNhbGN1bGF0ZVdpbkNYWEVIU3RhdGVOdW1iZXJzKGNvbnN0IEZ1bmN0aW9uICpQYXJlbnRGbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2luRUhGdW5jSW5mbyAmRnVuY0luZm8pOworCit2b2lkIGNhbGN1bGF0ZVNFSFN0YXRlTnVtYmVycyhjb25zdCBGdW5jdGlvbiAqUGFyZW50Rm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaW5FSEZ1bmNJbmZvICZGdW5jSW5mbyk7CisKK3ZvaWQgY2FsY3VsYXRlQ2xyRUhTdGF0ZU51bWJlcnMoY29uc3QgRnVuY3Rpb24gKkZuLCBXaW5FSEZ1bmNJbmZvICZGdW5jSW5mbyk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fV0lORUhGVU5DSU5GT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvbmZpZy9Bc21QYXJzZXJzLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29uZmlnL0FzbVBhcnNlcnMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMTg4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvbmZpZy9Bc21QYXJzZXJzLmRlZgpAQCAtMCwwICsxLDMzIEBACisvKj09PS0gbGx2bS9Db25maWcvQXNtUGFyc2Vycy5kZWYgLSBMTFZNIEFzc2VtYmx5IFBhcnNlcnMgLS0tLS0tLSotIEMrKyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgZW51bWVyYXRlcyBhbGwgb2YgdGhlIGFzc2VtYmx5LWxhbmd1YWdlIHBhcnNlcnMgICAgICAgICAgICAgICAgICAqfAorfCogc3VwcG9ydGVkIGJ5IHRoaXMgYnVpbGQgb2YgTExWTS4gQ2xpZW50cyBvZiB0aGlzIGZpbGUgc2hvdWxkIGRlZmluZSAgICAgICAgKnwKK3wqIHRoZSBMTFZNX0FTTV9QQVJTRVIgbWFjcm8gdG8gYmUgYSBmdW5jdGlvbi1saWtlIG1hY3JvIHdpdGggYSAgICAgICAgICAgICAgICp8Cit8KiBzaW5nbGUgcGFyYW1ldGVyICh0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IHdob3NlIGFzc2VtYmx5IGNhbiBiZSAgICAgICAgICAgICAqfAorfCogZ2VuZXJhdGVkKTsgaW5jbHVkaW5nIHRoaXMgZmlsZSB3aWxsIHRoZW4gZW51bWVyYXRlIGFsbCBvZiB0aGUgICAgICAgICAgICAgKnwKK3wqIHRhcmdldHMgd2l0aCBhc3NlbWJseSBwYXJzZXJzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhlIHNldCBvZiB0YXJnZXRzIHN1cHBvcnRlZCBieSBMTFZNIGlzIGdlbmVyYXRlZCBhdCBjb25maWd1cmF0aW9uICAgICAgICAgKnwKK3wqIHRpbWUsIGF0IHdoaWNoIHBvaW50IHRoaXMgaGVhZGVyIGlzIGdlbmVyYXRlZC4gRG8gbm90IG1vZGlmeSB0aGlzICAgICAgICAgICp8Cit8KiBoZWFkZXIgZGlyZWN0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgTExWTV9BU01fUEFSU0VSCisjICBlcnJvciBQbGVhc2UgZGVmaW5lIHRoZSBtYWNybyBMTFZNX0FTTV9QQVJTRVIoVGFyZ2V0TmFtZSkKKyNlbmRpZgorCitMTFZNX0FTTV9QQVJTRVIoQUFyY2g2NCkKK0xMVk1fQVNNX1BBUlNFUihBUk0pCitMTFZNX0FTTV9QQVJTRVIoQlBGKQorTExWTV9BU01fUEFSU0VSKFg4NikKKworCisjdW5kZWYgTExWTV9BU01fUEFSU0VSCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvbmZpZy9Bc21QcmludGVycy5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvbmZpZy9Bc21QcmludGVycy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAxZmUyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29uZmlnL0FzbVByaW50ZXJzLmRlZgpAQCAtMCwwICsxLDMzIEBACisvKj09PS0gbGx2bS9Db25maWcvQXNtUHJpbnRlcnMuZGVmIC0gTExWTSBBc3NlbWJseSBQcmludGVycyAtLS0tLSotIEMrKyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgZW51bWVyYXRlcyBhbGwgb2YgdGhlIGFzc2VtYmx5LWxhbmd1YWdlIHByaW50ZXJzICAgICAgICAgICAgICAgICAqfAorfCogc3VwcG9ydGVkIGJ5IHRoaXMgYnVpbGQgb2YgTExWTS4gQ2xpZW50cyBvZiB0aGlzIGZpbGUgc2hvdWxkIGRlZmluZSAgICAgICAgKnwKK3wqIHRoZSBMTFZNX0FTTV9QUklOVEVSIG1hY3JvIHRvIGJlIGEgZnVuY3Rpb24tbGlrZSBtYWNybyB3aXRoIGEgICAgICAgICAgICAgICp8Cit8KiBzaW5nbGUgcGFyYW1ldGVyICh0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IHdob3NlIGFzc2VtYmx5IGNhbiBiZSAgICAgICAgICAgICAqfAorfCogZ2VuZXJhdGVkKTsgaW5jbHVkaW5nIHRoaXMgZmlsZSB3aWxsIHRoZW4gZW51bWVyYXRlIGFsbCBvZiB0aGUgICAgICAgICAgICAgKnwKK3wqIHRhcmdldHMgd2l0aCBhc3NlbWJseSBwcmludGVycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhlIHNldCBvZiB0YXJnZXRzIHN1cHBvcnRlZCBieSBMTFZNIGlzIGdlbmVyYXRlZCBhdCBjb25maWd1cmF0aW9uICAgICAgICAgKnwKK3wqIHRpbWUsIGF0IHdoaWNoIHBvaW50IHRoaXMgaGVhZGVyIGlzIGdlbmVyYXRlZC4gRG8gbm90IG1vZGlmeSB0aGlzICAgICAgICAgICp8Cit8KiBoZWFkZXIgZGlyZWN0bHkuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgTExWTV9BU01fUFJJTlRFUgorIyAgZXJyb3IgUGxlYXNlIGRlZmluZSB0aGUgbWFjcm8gTExWTV9BU01fUFJJTlRFUihUYXJnZXROYW1lKQorI2VuZGlmCisKK0xMVk1fQVNNX1BSSU5URVIoQUFyY2g2NCkKK0xMVk1fQVNNX1BSSU5URVIoQVJNKQorTExWTV9BU01fUFJJTlRFUihCUEYpCitMTFZNX0FTTV9QUklOVEVSKFg4NikKKworCisjdW5kZWYgTExWTV9BU01fUFJJTlRFUgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db25maWcvRGlzYXNzZW1ibGVycy5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvbmZpZy9EaXNhc3NlbWJsZXJzLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMWY0YjBjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db25maWcvRGlzYXNzZW1ibGVycy5kZWYKQEAgLTAsMCArMSwzMyBAQAorLyo9PT0tIGxsdm0vQ29uZmlnL0Rpc2Fzc2VtYmxlcnMuZGVmIC0gTExWTSBBc3NlbWJseSBQYXJzZXJzIC0tLS0qLSBDKysgLSotPT09KlwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZSAgICAgICp8Cit8KiBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGVudW1lcmF0ZXMgYWxsIG9mIHRoZSBhc3NlbWJseS1sYW5ndWFnZSBwYXJzZXJzICAgICAgICAgICAgICAgICAgKnwKK3wqIHN1cHBvcnRlZCBieSB0aGlzIGJ1aWxkIG9mIExMVk0uIENsaWVudHMgb2YgdGhpcyBmaWxlIHNob3VsZCBkZWZpbmUgICAgICAgICp8Cit8KiB0aGUgTExWTV9ESVNBU1NFTUJMRVIgbWFjcm8gdG8gYmUgYSBmdW5jdGlvbi1saWtlIG1hY3JvIHdpdGggYSAgICAgICAgICAgICAqfAorfCogc2luZ2xlIHBhcmFtZXRlciAodGhlIG5hbWUgb2YgdGhlIHRhcmdldCB3aG9zZSBhc3NlbWJseSBjYW4gYmUgICAgICAgICAgICAgKnwKK3wqIGdlbmVyYXRlZCk7IGluY2x1ZGluZyB0aGlzIGZpbGUgd2lsbCB0aGVuIGVudW1lcmF0ZSBhbGwgb2YgdGhlICAgICAgICAgICAgICp8Cit8KiB0YXJnZXRzIHdpdGggYXNzZW1ibHkgcGFyc2Vycy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqIFRoZSBzZXQgb2YgdGFyZ2V0cyBzdXBwb3J0ZWQgYnkgTExWTSBpcyBnZW5lcmF0ZWQgYXQgY29uZmlndXJhdGlvbiAgICAgICAgICp8Cit8KiB0aW1lLCBhdCB3aGljaCBwb2ludCB0aGlzIGhlYWRlciBpcyBnZW5lcmF0ZWQuIERvIG5vdCBtb2RpZnkgdGhpcyAgICAgICAgICAqfAorfCogaGVhZGVyIGRpcmVjdGx5LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8CitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisjaWZuZGVmIExMVk1fRElTQVNTRU1CTEVSCisjICBlcnJvciBQbGVhc2UgZGVmaW5lIHRoZSBtYWNybyBMTFZNX0RJU0FTU0VNQkxFUihUYXJnZXROYW1lKQorI2VuZGlmCisKK0xMVk1fRElTQVNTRU1CTEVSKEFBcmNoNjQpCitMTFZNX0RJU0FTU0VNQkxFUihBUk0pCitMTFZNX0RJU0FTU0VNQkxFUihCUEYpCitMTFZNX0RJU0FTU0VNQkxFUihYODYpCisKKworI3VuZGVmIExMVk1fRElTQVNTRU1CTEVSCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvbmZpZy9UYXJnZXRzLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29uZmlnL1RhcmdldHMuZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyNzI1ZjMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvbmZpZy9UYXJnZXRzLmRlZgpAQCAtMCwwICsxLDMyIEBACisvKj09PS0gbGx2bS9Db25maWcvVGFyZ2V0cy5kZWYgLSBMTFZNIFRhcmdldCBBcmNoaXRlY3R1cmVzIC0tLS0tLSotIEMrKyAtKi09PT0qXAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlICAgICAgKnwKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09KnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGlzIGZpbGUgZW51bWVyYXRlcyBhbGwgb2YgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmVzIHN1cHBvcnRlZCBieSAgICAgICAgICAqfAorfCogdGhpcyBidWlsZCBvZiBMTFZNLiBDbGllbnRzIG9mIHRoaXMgZmlsZSBzaG91bGQgZGVmaW5lIHRoZSAgICAgICAgICAgICAgICAgKnwKK3wqIExMVk1fVEFSR0VUIG1hY3JvIHRvIGJlIGEgZnVuY3Rpb24tbGlrZSBtYWNybyB3aXRoIGEgc2luZ2xlICAgICAgICAgICAgICAgICp8Cit8KiBwYXJhbWV0ZXIgKHRoZSBuYW1lIG9mIHRoZSB0YXJnZXQpOyBpbmNsdWRpbmcgdGhpcyBmaWxlIHdpbGwgdGhlbiAgICAgICAgICAqfAorfCogZW51bWVyYXRlIGFsbCBvZiB0aGUgdGFyZ2V0cy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBUaGUgc2V0IG9mIHRhcmdldHMgc3VwcG9ydGVkIGJ5IExMVk0gaXMgZ2VuZXJhdGVkIGF0IGNvbmZpZ3VyYXRpb24gICAgICAgICAqfAorfCogdGltZSwgYXQgd2hpY2ggcG9pbnQgdGhpcyBoZWFkZXIgaXMgZ2VuZXJhdGVkLiBEbyBub3QgbW9kaWZ5IHRoaXMgICAgICAgICAgKnwKK3wqIGhlYWRlciBkaXJlY3RseS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorXCo9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ki8KKworI2lmbmRlZiBMTFZNX1RBUkdFVAorIyAgZXJyb3IgUGxlYXNlIGRlZmluZSB0aGUgbWFjcm8gTExWTV9UQVJHRVQoVGFyZ2V0TmFtZSkKKyNlbmRpZgorCitMTFZNX1RBUkdFVChBQXJjaDY0KQorTExWTV9UQVJHRVQoQVJNKQorTExWTV9UQVJHRVQoQlBGKQorTExWTV9UQVJHRVQoWDg2KQorCisKKyN1bmRlZiBMTFZNX1RBUkdFVApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db25maWcvYWJpLWJyZWFraW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvbmZpZy9hYmktYnJlYWtpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kN2Y4MmUxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Db25maWcvYWJpLWJyZWFraW5nLmgKQEAgLTAsMCArMSw1MCBAQAorLyo9PT0tLS0tLS0tIGxsdm0vQ29uZmlnL2FiaS1icmVha2luZy5oIC0gbGx2bSBjb25maWd1cmF0aW9uIC0tLS0tLS0qLSBDIC0qLT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqLworLyogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisvKiBUaGlzIGZpbGUgY29udHJvbHMgdGhlIEMrKyBBQkkgYnJlYWsgaW50cm9kdWNlZCBpbiBMTFZNIHB1YmxpYyBoZWFkZXIuICovCisKKyNpZm5kZWYgTExWTV9BQklfQlJFQUtJTkdfQ0hFQ0tTX0gKKyNkZWZpbmUgTExWTV9BQklfQlJFQUtJTkdfQ0hFQ0tTX0gKKworLyogRGVmaW5lIHRvIGVuYWJsZSBjaGVja3MgdGhhdCBhbHRlciB0aGUgTExWTSBDKysgQUJJICovCisjZGVmaW5lIExMVk1fRU5BQkxFX0FCSV9CUkVBS0lOR19DSEVDS1MgMAorCisvKiBEZWZpbmUgdG8gZW5hYmxlIHJldmVyc2UgaXRlcmF0aW9uIG9mIHVub3JkZXJlZCBsbHZtIGNvbnRhaW5lcnMgKi8KKyNkZWZpbmUgTExWTV9FTkFCTEVfUkVWRVJTRV9JVEVSQVRJT04gMAorCisvKiBBbGxvdyBzZWxlY3RpdmVseSBkaXNhYmxpbmcgbGluay10aW1lIG1pc21hdGNoIGNoZWNraW5nIHNvIHRoYXQgaGVhZGVyLW9ubHkKKyAgIEFEVCBjb250ZW50IGZyb20gTExWTSBjYW4gYmUgdXNlZCB3aXRob3V0IGxpbmtpbmcgbGliU3VwcG9ydC4gKi8KKyNpZiAhTExWTV9ESVNBQkxFX0FCSV9CUkVBS0lOR19DSEVDS1NfRU5GT1JDSU5HCisKKy8vIEFCSV9CUkVBS0lOR19DSEVDS1MgcHJvdGVjdGlvbjogcHJvdmlkZXMgbGluay10aW1lIGZhaWx1cmUgd2hlbiBjbGllbnRzIGJ1aWxkCisvLyBtaXNtYXRjaCB3aXRoIExMVk0KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKQorLy8gVXNlIHByYWdtYSB3aXRoIE1TVkMKKyNkZWZpbmUgTExWTV9YU1RSKHMpIExMVk1fU1RSKHMpCisjZGVmaW5lIExMVk1fU1RSKHMpICNzCisjcHJhZ21hIGRldGVjdF9taXNtYXRjaCgiTExWTV9FTkFCTEVfQUJJX0JSRUFLSU5HX0NIRUNLUyIsIExMVk1fWFNUUihMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTKSkKKyN1bmRlZiBMTFZNX1hTVFIKKyN1bmRlZiBMTFZNX1NUUgorI2VsaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykgLy8gV2luMzIgdy9vICNwcmFnbWEgZGV0ZWN0X21pc21hdGNoCisvLyBGSVhNRTogSW1wbGVtZW50IGNoZWNrcyB3aXRob3V0IHdlYWsuCisjZWxpZiBkZWZpbmVkKF9fY3BsdXNwbHVzKQorbmFtZXNwYWNlIGxsdm0geworI2lmIExMVk1fRU5BQkxFX0FCSV9CUkVBS0lOR19DSEVDS1MKK2V4dGVybiBpbnQgRW5hYmxlQUJJQnJlYWtpbmdDaGVja3M7CitfX2F0dHJpYnV0ZV9fKCh3ZWFrLCB2aXNpYmlsaXR5ICgiaGlkZGVuIikpKSBpbnQgKlZlcmlmeUVuYWJsZUFCSUJyZWFraW5nQ2hlY2tzID0gJkVuYWJsZUFCSUJyZWFraW5nQ2hlY2tzOworI2Vsc2UKK2V4dGVybiBpbnQgRGlzYWJsZUFCSUJyZWFraW5nQ2hlY2tzOworX19hdHRyaWJ1dGVfXygod2VhaywgdmlzaWJpbGl0eSAoImhpZGRlbiIpKSkgaW50ICpWZXJpZnlEaXNhYmxlQUJJQnJlYWtpbmdDaGVja3MgPSAmRGlzYWJsZUFCSUJyZWFraW5nQ2hlY2tzOworI2VuZGlmCit9CisjZW5kaWYgLy8gX01TQ19WRVIKKworI2VuZGlmIC8vIExMVk1fRElTQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTX0VORk9SQ0lORworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vQ29uZmlnL2xsdm0tY29uZmlnLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvbmZpZy9sbHZtLWNvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3ZmExYzgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0NvbmZpZy9sbHZtLWNvbmZpZy5oCkBAIC0wLDAgKzEsODUgQEAKKy8qPT09LS0tLS0tLSBsbHZtL0NvbmZpZy9sbHZtLWNvbmZpZy5oIC0gbGx2bSBjb25maWd1cmF0aW9uIC0tLS0tLS0qLSBDIC0qLT09PSovCisvKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZSAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UgICAgICAqLworLyogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworCisvKiBUaGlzIGZpbGUgZW51bWVyYXRlcyB2YXJpYWJsZXMgZnJvbSB0aGUgTExWTSBjb25maWd1cmF0aW9uIHNvIHRoYXQgdGhleQorICAgY2FuIGJlIGluIGV4cG9ydGVkIGhlYWRlcnMgYW5kIHdvbid0IG92ZXJyaWRlIHBhY2thZ2Ugc3BlY2lmaWMgZGlyZWN0aXZlcy4KKyAgIFRoaXMgaXMgYSBDIGhlYWRlciB0aGF0IGNhbiBiZSBpbmNsdWRlZCBpbiB0aGUgbGx2bS1jIGhlYWRlcnMuICovCisKKyNpZm5kZWYgTExWTV9DT05GSUdfSAorI2RlZmluZSBMTFZNX0NPTkZJR19ICisKKy8qIERlZmluZSBpZiBMTFZNX0VOQUJMRV9EVU1QIGlzIGVuYWJsZWQgKi8KKy8qICN1bmRlZiBMTFZNX0VOQUJMRV9EVU1QICovCisKKy8qIERlZmluZSBpZiB3ZSBsaW5rIFBvbGx5IHRvIHRoZSB0b29scyAqLworLyogI3VuZGVmIExJTktfUE9MTFlfSU5UT19UT09MUyAqLworCisvKiBUYXJnZXQgdHJpcGxlIExMVk0gd2lsbCBnZW5lcmF0ZSBjb2RlIGZvciBieSBkZWZhdWx0ICovCisjZGVmaW5lIExMVk1fREVGQVVMVF9UQVJHRVRfVFJJUExFICJ4ODZfNjQtdW5rbm93bi1saW51eC1nbnUiCisKKy8qIERlZmluZSBpZiB0aHJlYWRzIGVuYWJsZWQgKi8KKyNkZWZpbmUgTExWTV9FTkFCTEVfVEhSRUFEUyAxCisKKy8qIEhhcyBnY2MvTVNWQyBhdG9taWMgaW50cmluc2ljcyAqLworI2RlZmluZSBMTFZNX0hBU19BVE9NSUNTIDEKKworLyogSG9zdCB0cmlwbGUgTExWTSB3aWxsIGJlIGV4ZWN1dGVkIG9uICovCisjZGVmaW5lIExMVk1fSE9TVF9UUklQTEUgIng4Nl82NC11bmtub3duLWxpbnV4LWdudSIKKworLyogTExWTSBhcmNoaXRlY3R1cmUgbmFtZSBmb3IgdGhlIG5hdGl2ZSBhcmNoaXRlY3R1cmUsIGlmIGF2YWlsYWJsZSAqLworI2RlZmluZSBMTFZNX05BVElWRV9BUkNIIFg4NgorCisvKiBMTFZNIG5hbWUgZm9yIHRoZSBuYXRpdmUgQXNtUGFyc2VyIGluaXQgZnVuY3Rpb24sIGlmIGF2YWlsYWJsZSAqLworI2RlZmluZSBMTFZNX05BVElWRV9BU01QQVJTRVIgTExWTUluaXRpYWxpemVYODZBc21QYXJzZXIKKworLyogTExWTSBuYW1lIGZvciB0aGUgbmF0aXZlIEFzbVByaW50ZXIgaW5pdCBmdW5jdGlvbiwgaWYgYXZhaWxhYmxlICovCisjZGVmaW5lIExMVk1fTkFUSVZFX0FTTVBSSU5URVIgTExWTUluaXRpYWxpemVYODZBc21QcmludGVyCisKKy8qIExMVk0gbmFtZSBmb3IgdGhlIG5hdGl2ZSBEaXNhc3NlbWJsZXIgaW5pdCBmdW5jdGlvbiwgaWYgYXZhaWxhYmxlICovCisjZGVmaW5lIExMVk1fTkFUSVZFX0RJU0FTU0VNQkxFUiBMTFZNSW5pdGlhbGl6ZVg4NkRpc2Fzc2VtYmxlcgorCisvKiBMTFZNIG5hbWUgZm9yIHRoZSBuYXRpdmUgVGFyZ2V0IGluaXQgZnVuY3Rpb24sIGlmIGF2YWlsYWJsZSAqLworI2RlZmluZSBMTFZNX05BVElWRV9UQVJHRVQgTExWTUluaXRpYWxpemVYODZUYXJnZXQKKworLyogTExWTSBuYW1lIGZvciB0aGUgbmF0aXZlIFRhcmdldEluZm8gaW5pdCBmdW5jdGlvbiwgaWYgYXZhaWxhYmxlICovCisjZGVmaW5lIExMVk1fTkFUSVZFX1RBUkdFVElORk8gTExWTUluaXRpYWxpemVYODZUYXJnZXRJbmZvCisKKy8qIExMVk0gbmFtZSBmb3IgdGhlIG5hdGl2ZSB0YXJnZXQgTUMgaW5pdCBmdW5jdGlvbiwgaWYgYXZhaWxhYmxlICovCisjZGVmaW5lIExMVk1fTkFUSVZFX1RBUkdFVE1DIExMVk1Jbml0aWFsaXplWDg2VGFyZ2V0TUMKKworLyogRGVmaW5lIGlmIHRoaXMgaXMgVW5peGlzaCBwbGF0Zm9ybSAqLworI2RlZmluZSBMTFZNX09OX1VOSVggMQorCisvKiBEZWZpbmUgaWYgdGhpcyBpcyBXaW4zMmlzaCBwbGF0Zm9ybSAqLworLyogI3VuZGVmIExMVk1fT05fV0lOMzIgKi8KKworLyogRGVmaW5lIGlmIHdlIGhhdmUgdGhlIEludGVsIEpJVCBBUEkgcnVudGltZSBzdXBwb3J0IGxpYnJhcnkgKi8KKyNkZWZpbmUgTExWTV9VU0VfSU5URUxfSklURVZFTlRTIDAKKworLyogRGVmaW5lIGlmIHdlIGhhdmUgdGhlIG9wcm9maWxlIEpJVC1zdXBwb3J0IGxpYnJhcnkgKi8KKyNkZWZpbmUgTExWTV9VU0VfT1BST0ZJTEUgMAorCisvKiBNYWpvciB2ZXJzaW9uIG9mIHRoZSBMTFZNIEFQSSAqLworI2RlZmluZSBMTFZNX1ZFUlNJT05fTUFKT1IgNworCisvKiBNaW5vciB2ZXJzaW9uIG9mIHRoZSBMTFZNIEFQSSAqLworI2RlZmluZSBMTFZNX1ZFUlNJT05fTUlOT1IgMAorCisvKiBQYXRjaCB2ZXJzaW9uIG9mIHRoZSBMTFZNIEFQSSAqLworI2RlZmluZSBMTFZNX1ZFUlNJT05fUEFUQ0ggMgorCisvKiBMTFZNIHZlcnNpb24gc3RyaW5nICovCisjZGVmaW5lIExMVk1fVkVSU0lPTl9TVFJJTkcgIjcuMC4yc3ZuIgorCisvKiBXaGV0aGVyIExMVk0gcmVjb3JkcyBzdGF0aXN0aWNzIGZvciB1c2Ugd2l0aCBHZXRTdGF0aXN0aWNzKCksCisgKiBQcmludFN0YXRpc3RpY3MoKSBvciBQcmludFN0YXRpc3RpY3NKU09OKCkKKyAqLworI2RlZmluZSBMTFZNX0ZPUkNFX0VOQUJMRV9TVEFUUyAwCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQXBwZW5kaW5nVHlwZVRhYmxlQnVpbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQXBwZW5kaW5nVHlwZVRhYmxlQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkMTc0MzUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9BcHBlbmRpbmdUeXBlVGFibGVCdWlsZGVyLmgKQEAgLTAsMCArMSw3MCBAQAorLy89PT0tIEFwcGVuZGluZ1R5cGVUYWJsZUJ1aWxkZXIuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19BUFBFTkRJTkdUWVBFVEFCTEVCVUlMREVSX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfQVBQRU5ESU5HVFlQRVRBQkxFQlVJTERFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TaW1wbGVUeXBlU2VyaWFsaXplci5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUluZGV4LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworCitjbGFzcyBDb250aW51YXRpb25SZWNvcmRCdWlsZGVyOworCitjbGFzcyBBcHBlbmRpbmdUeXBlVGFibGVCdWlsZGVyIDogcHVibGljIFR5cGVDb2xsZWN0aW9uIHsKKworICBCdW1wUHRyQWxsb2NhdG9yICZSZWNvcmRTdG9yYWdlOworICBTaW1wbGVUeXBlU2VyaWFsaXplciBTaW1wbGVTZXJpYWxpemVyOworCisgIC8vLyBDb250YWlucyBhIGxpc3Qgb2YgYWxsIHJlY29yZHMgaW5kZXhlZCBieSBUeXBlSW5kZXgudG9BcnJheUluZGV4KCkuCisgIFNtYWxsVmVjdG9yPEFycmF5UmVmPHVpbnQ4X3Q+LCAyPiBTZWVuUmVjb3JkczsKKworcHVibGljOgorICBleHBsaWNpdCBBcHBlbmRpbmdUeXBlVGFibGVCdWlsZGVyKEJ1bXBQdHJBbGxvY2F0b3IgJlN0b3JhZ2UpOworICB+QXBwZW5kaW5nVHlwZVRhYmxlQnVpbGRlcigpOworCisgIC8vIFR5cGVUYWJsZUNvbGxlY3Rpb24gb3ZlcnJpZGVzCisgIE9wdGlvbmFsPFR5cGVJbmRleD4gZ2V0Rmlyc3QoKSBvdmVycmlkZTsKKyAgT3B0aW9uYWw8VHlwZUluZGV4PiBnZXROZXh0KFR5cGVJbmRleCBQcmV2KSBvdmVycmlkZTsKKyAgQ1ZUeXBlIGdldFR5cGUoVHlwZUluZGV4IEluZGV4KSBvdmVycmlkZTsKKyAgU3RyaW5nUmVmIGdldFR5cGVOYW1lKFR5cGVJbmRleCBJbmRleCkgb3ZlcnJpZGU7CisgIGJvb2wgY29udGFpbnMoVHlwZUluZGV4IEluZGV4KSBvdmVycmlkZTsKKyAgdWludDMyX3Qgc2l6ZSgpIG92ZXJyaWRlOworICB1aW50MzJfdCBjYXBhY2l0eSgpIG92ZXJyaWRlOworCisgIC8vIHB1YmxpYyBpbnRlcmZhY2UKKyAgdm9pZCByZXNldCgpOworICBUeXBlSW5kZXggbmV4dFR5cGVJbmRleCgpIGNvbnN0OworCisgIEJ1bXBQdHJBbGxvY2F0b3IgJmdldEFsbG9jYXRvcigpIHsgcmV0dXJuIFJlY29yZFN0b3JhZ2U7IH0KKworICBBcnJheVJlZjxBcnJheVJlZjx1aW50OF90Pj4gcmVjb3JkcygpIGNvbnN0OworICBUeXBlSW5kZXggaW5zZXJ0UmVjb3JkQnl0ZXMoQXJyYXlSZWY8dWludDhfdD4gJlJlY29yZCk7CisgIFR5cGVJbmRleCBpbnNlcnRSZWNvcmQoQ29udGludWF0aW9uUmVjb3JkQnVpbGRlciAmQnVpbGRlcik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFR5cGVJbmRleCB3cml0ZUxlYWZUeXBlKFQgJlJlY29yZCkgeworICAgIEFycmF5UmVmPHVpbnQ4X3Q+IERhdGEgPSBTaW1wbGVTZXJpYWxpemVyLnNlcmlhbGl6ZShSZWNvcmQpOworICAgIHJldHVybiBpbnNlcnRSZWNvcmRCeXRlcyhEYXRhKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRVRBQkxFQlVJTERFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9DVlJlY29yZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ1ZSZWNvcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGJlYjQzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ1ZSZWNvcmQuaApAQCAtMCwwICsxLDEyNiBAQAorLy89PT0tIFJlY29yZEl0ZXJhdG9yLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19SRUNPUkRJVEVSQVRPUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1JFQ09SRElURVJBVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlld0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvUmVjb3JkU2VyaWFsaXphdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVJbmRleC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWFkZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEtpbmQ+IGNsYXNzIENWUmVjb3JkIHsKK3B1YmxpYzoKKyAgQ1ZSZWNvcmQoKSA6IFR5cGUoc3RhdGljX2Nhc3Q8S2luZD4oMCkpIHt9CisKKyAgQ1ZSZWNvcmQoS2luZCBLLCBBcnJheVJlZjx1aW50OF90PiBEYXRhKSA6IFR5cGUoSyksIFJlY29yZERhdGEoRGF0YSkge30KKworICBib29sIHZhbGlkKCkgY29uc3QgeyByZXR1cm4gVHlwZSAhPSBzdGF0aWNfY2FzdDxLaW5kPigwKTsgfQorCisgIHVpbnQzMl90IGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIFJlY29yZERhdGEuc2l6ZSgpOyB9CisgIEtpbmQga2luZCgpIGNvbnN0IHsgcmV0dXJuIFR5cGU7IH0KKyAgQXJyYXlSZWY8dWludDhfdD4gZGF0YSgpIGNvbnN0IHsgcmV0dXJuIFJlY29yZERhdGE7IH0KKyAgU3RyaW5nUmVmIHN0cl9kYXRhKCkgY29uc3QgeworICAgIHJldHVybiBTdHJpbmdSZWYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KFJlY29yZERhdGEuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgIFJlY29yZERhdGEuc2l6ZSgpKTsKKyAgfQorCisgIEFycmF5UmVmPHVpbnQ4X3Q+IGNvbnRlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIFJlY29yZERhdGEuZHJvcF9mcm9udChzaXplb2YoUmVjb3JkUHJlZml4KSk7CisgIH0KKworICBPcHRpb25hbDx1aW50MzJfdD4gaGFzaCgpIGNvbnN0IHsgcmV0dXJuIEhhc2g7IH0KKworICB2b2lkIHNldEhhc2godWludDMyX3QgVmFsdWUpIHsgSGFzaCA9IFZhbHVlOyB9CisKKyAgS2luZCBUeXBlOworICBBcnJheVJlZjx1aW50OF90PiBSZWNvcmREYXRhOworICBPcHRpb25hbDx1aW50MzJfdD4gSGFzaDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLaW5kPiBzdHJ1Y3QgUmVtYXBwZWRSZWNvcmQgeworICBleHBsaWNpdCBSZW1hcHBlZFJlY29yZChjb25zdCBDVlJlY29yZDxLaW5kPiAmUikgOiBPcmlnaW5hbFJlY29yZChSKSB7fQorCisgIENWUmVjb3JkPEtpbmQ+IE9yaWdpbmFsUmVjb3JkOworICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8dWludDMyX3QsIFR5cGVJbmRleD4sIDg+IE1hcHBpbmdzOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFJlY29yZCwgdHlwZW5hbWUgRnVuYz4KK0Vycm9yIGZvckVhY2hDb2RlVmlld1JlY29yZChBcnJheVJlZjx1aW50OF90PiBTdHJlYW1CdWZmZXIsIEZ1bmMgRikgeworICB3aGlsZSAoIVN0cmVhbUJ1ZmZlci5lbXB0eSgpKSB7CisgICAgaWYgKFN0cmVhbUJ1ZmZlci5zaXplKCkgPCBzaXplb2YoUmVjb3JkUHJlZml4KSkKKyAgICAgIHJldHVybiBtYWtlX2Vycm9yPENvZGVWaWV3RXJyb3I+KGN2X2Vycm9yX2NvZGU6OmNvcnJ1cHRfcmVjb3JkKTsKKworICAgIGNvbnN0IFJlY29yZFByZWZpeCAqUHJlZml4ID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBSZWNvcmRQcmVmaXggKj4oU3RyZWFtQnVmZmVyLmRhdGEoKSk7CisKKyAgICBzaXplX3QgUmVhbExlbiA9IFByZWZpeC0+UmVjb3JkTGVuICsgMjsKKyAgICBpZiAoU3RyZWFtQnVmZmVyLnNpemUoKSA8IFJlYWxMZW4pCisgICAgICByZXR1cm4gbWFrZV9lcnJvcjxDb2RlVmlld0Vycm9yPihjdl9lcnJvcl9jb2RlOjpjb3JydXB0X3JlY29yZCk7CisKKyAgICBBcnJheVJlZjx1aW50OF90PiBEYXRhID0gU3RyZWFtQnVmZmVyLnRha2VfZnJvbnQoUmVhbExlbik7CisgICAgU3RyZWFtQnVmZmVyID0gU3RyZWFtQnVmZmVyLmRyb3BfZnJvbnQoUmVhbExlbik7CisKKyAgICBSZWNvcmQgUihzdGF0aWNfY2FzdDxkZWNsdHlwZShSZWNvcmQ6OlR5cGUpPigodWludDE2X3QpUHJlZml4LT5SZWNvcmRLaW5kKSwKKyAgICAgICAgICAgICBEYXRhKTsKKyAgICBpZiAoYXV0byBFQyA9IEYoUikpCisgICAgICByZXR1cm4gRUM7CisgIH0KKyAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7Cit9CisKKy8vLyBSZWFkIGEgY29tcGxldGUgcmVjb3JkIGZyb20gYSBzdHJlYW0gYXQgYSByYW5kb20gb2Zmc2V0LgordGVtcGxhdGUgPHR5cGVuYW1lIEtpbmQ+CitpbmxpbmUgRXhwZWN0ZWQ8Q1ZSZWNvcmQ8S2luZD4+IHJlYWRDVlJlY29yZEZyb21TdHJlYW0oQmluYXJ5U3RyZWFtUmVmIFN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPZmZzZXQpIHsKKyAgY29uc3QgUmVjb3JkUHJlZml4ICpQcmVmaXggPSBudWxscHRyOworICBCaW5hcnlTdHJlYW1SZWFkZXIgUmVhZGVyKFN0cmVhbSk7CisgIFJlYWRlci5zZXRPZmZzZXQoT2Zmc2V0KTsKKworICBpZiAoYXV0byBFQyA9IFJlYWRlci5yZWFkT2JqZWN0KFByZWZpeCkpCisgICAgcmV0dXJuIHN0ZDo6bW92ZShFQyk7CisgIGlmIChQcmVmaXgtPlJlY29yZExlbiA8IDIpCisgICAgcmV0dXJuIG1ha2VfZXJyb3I8Q29kZVZpZXdFcnJvcj4oY3ZfZXJyb3JfY29kZTo6Y29ycnVwdF9yZWNvcmQpOworICBLaW5kIEsgPSBzdGF0aWNfY2FzdDxLaW5kPih1aW50MTZfdChQcmVmaXgtPlJlY29yZEtpbmQpKTsKKworICBSZWFkZXIuc2V0T2Zmc2V0KE9mZnNldCk7CisgIEFycmF5UmVmPHVpbnQ4X3Q+IFJhd0RhdGE7CisgIGlmIChhdXRvIEVDID0gUmVhZGVyLnJlYWRCeXRlcyhSYXdEYXRhLCBQcmVmaXgtPlJlY29yZExlbiArIHNpemVvZih1aW50MTZfdCkpKQorICAgIHJldHVybiBzdGQ6Om1vdmUoRUMpOworICByZXR1cm4gY29kZXZpZXc6OkNWUmVjb3JkPEtpbmQ+KEssIFJhd0RhdGEpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKKwordGVtcGxhdGUgPHR5cGVuYW1lIEtpbmQ+CitzdHJ1Y3QgVmFyU3RyZWFtQXJyYXlFeHRyYWN0b3I8Y29kZXZpZXc6OkNWUmVjb3JkPEtpbmQ+PiB7CisgIEVycm9yIG9wZXJhdG9yKCkoQmluYXJ5U3RyZWFtUmVmIFN0cmVhbSwgdWludDMyX3QgJkxlbiwKKyAgICAgICAgICAgICAgICAgICBjb2Rldmlldzo6Q1ZSZWNvcmQ8S2luZD4gJkl0ZW0pIHsKKyAgICBhdXRvIEV4cGVjdGVkUmVjID0gY29kZXZpZXc6OnJlYWRDVlJlY29yZEZyb21TdHJlYW08S2luZD4oU3RyZWFtLCAwKTsKKyAgICBpZiAoIUV4cGVjdGVkUmVjKQorICAgICAgcmV0dXJuIEV4cGVjdGVkUmVjLnRha2VFcnJvcigpOworICAgIEl0ZW0gPSAqRXhwZWN0ZWRSZWM7CisgICAgTGVuID0gRXhwZWN0ZWRSZWMtPmxlbmd0aCgpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfUkVDT1JESVRFUkFUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ1ZTeW1ib2xWaXNpdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9DVlN5bWJvbFZpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YzhjZDEyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ1ZTeW1ib2xWaXNpdG9yLmgKQEAgLTAsMCArMSwzOSBAQAorLy89PT0tIENWU3ltYm9sVmlzaXRvci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19DVlNZTUJPTFZJU0lUT1JfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19DVlNZTUJPTFZJU0lUT1JfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ1ZSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFZpc2l0b3JEZWxlZ2F0ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvck9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CitjbGFzcyBTeW1ib2xWaXNpdG9yQ2FsbGJhY2tzOworCitjbGFzcyBDVlN5bWJvbFZpc2l0b3IgeworcHVibGljOgorICBDVlN5bWJvbFZpc2l0b3IoU3ltYm9sVmlzaXRvckNhbGxiYWNrcyAmQ2FsbGJhY2tzKTsKKworICBFcnJvciB2aXNpdFN5bWJvbFJlY29yZChDVlN5bWJvbCAmUmVjb3JkKTsKKyAgRXJyb3IgdmlzaXRTeW1ib2xSZWNvcmQoQ1ZTeW1ib2wgJlJlY29yZCwgdWludDMyX3QgT2Zmc2V0KTsKKyAgRXJyb3IgdmlzaXRTeW1ib2xTdHJlYW0oY29uc3QgQ1ZTeW1ib2xBcnJheSAmU3ltYm9scyk7CisgIEVycm9yIHZpc2l0U3ltYm9sU3RyZWFtKGNvbnN0IENWU3ltYm9sQXJyYXkgJlN5bWJvbHMsIHVpbnQzMl90IEluaXRpYWxPZmZzZXQpOworCitwcml2YXRlOgorICBTeW1ib2xWaXNpdG9yQ2FsbGJhY2tzICZDYWxsYmFja3M7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19DVlNZTUJPTFZJU0lUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ1ZUeXBlVmlzaXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ1ZUeXBlVmlzaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NjViYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9DVlR5cGVWaXNpdG9yLmgKQEAgLTAsMCArMSw1MyBAQAorLy89PT0tIENWVHlwZVZpc2l0b3IuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19DVlRZUEVWSVNJVE9SX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfQ1ZUWVBFVklTSVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9DVlJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKK2NsYXNzIFR5cGVDb2xsZWN0aW9uOworY2xhc3MgVHlwZVZpc2l0b3JDYWxsYmFja3M7CisKK2VudW0gVmlzaXRvckRhdGFTb3VyY2UgeworICBWRFNfQnl0ZXNQcmVzZW50LCAvLyBUaGUgcmVjb3JkIGJ5dGVzIGFyZSBwYXNzZWQgaW50byB0aGUgdmlzaXRhdGlvbgorICAgICAgICAgICAgICAgICAgICAvLyBmdW5jdGlvbi4gIFRoZSBhbGdvcml0aG0gc2hvdWxkIGZpcnN0IGRlc2VyaWFsaXplIHRoZW0KKyAgICAgICAgICAgICAgICAgICAgLy8gYmVmb3JlIHBhc3NpbmcgdGhlbSBvbiB0aHJvdWdoIHRoZSBwaXBlbGluZS4KKyAgVkRTX0J5dGVzRXh0ZXJuYWwgLy8gVGhlIHJlY29yZCBieXRlcyBhcmUgbm90IHByZXNlbnQsIGFuZCBpdCBpcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVzcG9uc2liaWxpdHkgb2YgdGhlIHZpc2l0b3IgY2FsbGJhY2sgaW50ZXJmYWNlIHRvCisgICAgICAgICAgICAgICAgICAgIC8vIHN1cHBseSB0aGUgYnl0ZXMuCit9OworCitFcnJvciB2aXNpdFR5cGVSZWNvcmQoQ1ZUeXBlICZSZWNvcmQsIFR5cGVJbmRleCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBUeXBlVmlzaXRvckNhbGxiYWNrcyAmQ2FsbGJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgIFZpc2l0b3JEYXRhU291cmNlIFNvdXJjZSA9IFZEU19CeXRlc1ByZXNlbnQpOworRXJyb3IgdmlzaXRUeXBlUmVjb3JkKENWVHlwZSAmUmVjb3JkLCBUeXBlVmlzaXRvckNhbGxiYWNrcyAmQ2FsbGJhY2tzLAorICAgICAgICAgICAgICAgICAgICAgIFZpc2l0b3JEYXRhU291cmNlIFNvdXJjZSA9IFZEU19CeXRlc1ByZXNlbnQpOworCitFcnJvciB2aXNpdE1lbWJlclJlY29yZChDVk1lbWJlclJlY29yZCBSZWNvcmQsIFR5cGVWaXNpdG9yQ2FsbGJhY2tzICZDYWxsYmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgICBWaXNpdG9yRGF0YVNvdXJjZSBTb3VyY2UgPSBWRFNfQnl0ZXNQcmVzZW50KTsKK0Vycm9yIHZpc2l0TWVtYmVyUmVjb3JkKFR5cGVMZWFmS2luZCBLaW5kLCBBcnJheVJlZjx1aW50OF90PiBSZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICBUeXBlVmlzaXRvckNhbGxiYWNrcyAmQ2FsbGJhY2tzKTsKKworRXJyb3IgdmlzaXRNZW1iZXJSZWNvcmRTdHJlYW0oQXJyYXlSZWY8dWludDhfdD4gRmllbGRMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZVZpc2l0b3JDYWxsYmFja3MgJkNhbGxiYWNrcyk7CisKK0Vycm9yIHZpc2l0VHlwZVN0cmVhbShjb25zdCBDVlR5cGVBcnJheSAmVHlwZXMsIFR5cGVWaXNpdG9yQ2FsbGJhY2tzICZDYWxsYmFja3MsCisgICAgICAgICAgICAgICAgICAgICAgVmlzaXRvckRhdGFTb3VyY2UgU291cmNlID0gVkRTX0J5dGVzUHJlc2VudCk7CitFcnJvciB2aXNpdFR5cGVTdHJlYW0oQ1ZUeXBlUmFuZ2UgVHlwZXMsIFR5cGVWaXNpdG9yQ2FsbGJhY2tzICZDYWxsYmFja3MpOworRXJyb3IgdmlzaXRUeXBlU3RyZWFtKFR5cGVDb2xsZWN0aW9uICZUeXBlcywgVHlwZVZpc2l0b3JDYWxsYmFja3MgJkNhbGxiYWNrcyk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0NWVFlQRVZJU0lUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzAxZTRmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgKQEAgLTAsMCArMSw1ODAgQEAKKy8vPT09LSBDb2RlVmlldy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGVmaW5lcyBjb25zdGFudHMgYW5kIGJhc2ljIHR5cGVzIGRlc2NyaWJpbmcgQ29kZVZpZXcgZGVidWcgaW5mb3JtYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19DT0RFVklFV19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0NPREVWSUVXX0gKKworI2luY2x1ZGUgPGNpbnR0eXBlcz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworLy8vIERpc3Rpbmd1aXNoZXMgaW5kaXZpZHVhbCByZWNvcmRzIGluIC5kZWJ1ZyRUIHNlY3Rpb24gb3IgUERCIHR5cGUgc3RyZWFtLiBUaGUKKy8vLyBkb2N1bWVudGF0aW9uIGFuZCBoZWFkZXJzIHRhbGsgYWJvdXQgdGhpcyBhcyB0aGUgImxlYWYiIHR5cGUuCitlbnVtIGNsYXNzIFR5cGVSZWNvcmRLaW5kIDogdWludDE2X3QgeworI2RlZmluZSBUWVBFX1JFQ09SRChsZl9lbmFtZSwgdmFsdWUsIG5hbWUpIG5hbWUgPSB2YWx1ZSwKKyNpbmNsdWRlICJDb2RlVmlld1R5cGVzLmRlZiIKK307CisKKy8vLyBEdXBsaWNhdGUgY29weSBvZiB0aGUgYWJvdmUgZW51bSwgYnV0IHVzaW5nIHRoZSBvZmZpY2lhbCBDViBuYW1lcy4gVXNlZnVsCisvLy8gZm9yIHJlZmVyZW5jZSBwdXJwb3NlcyBhbmQgd2hlbiBkZWFsaW5nIHdpdGggdW5rbm93biByZWNvcmQgdHlwZXMuCitlbnVtIFR5cGVMZWFmS2luZCA6IHVpbnQxNl90IHsKKyNkZWZpbmUgQ1ZfVFlQRShuYW1lLCB2YWwpIG5hbWUgPSB2YWwsCisjaW5jbHVkZSAiQ29kZVZpZXdUeXBlcy5kZWYiCit9OworCisvLy8gRGlzdGluZ3Vpc2hlcyBpbmRpdmlkdWFsIHJlY29yZHMgaW4gdGhlIFN5bWJvbHMgc3Vic2VjdGlvbiBvZiBhIC5kZWJ1ZyRTCisvLy8gc2VjdGlvbi4gRXF1aXZhbGVudCB0byBTWU1fRU5VTV9lIGluIGN2aW5mby5oLgorZW51bSBjbGFzcyBTeW1ib2xSZWNvcmRLaW5kIDogdWludDE2X3QgeworI2RlZmluZSBTWU1CT0xfUkVDT1JEKGxmX2VuYW1lLCB2YWx1ZSwgbmFtZSkgbmFtZSA9IHZhbHVlLAorI2luY2x1ZGUgIkNvZGVWaWV3U3ltYm9scy5kZWYiCit9OworCisvLy8gRHVwbGljYXRlIGNvcHkgb2YgdGhlIGFib3ZlIGVudW0sIGJ1dCB1c2luZyB0aGUgb2ZmaWNpYWwgQ1YgbmFtZXMuIFVzZWZ1bAorLy8vIGZvciByZWZlcmVuY2UgcHVycG9zZXMgYW5kIHdoZW4gZGVhbGluZyB3aXRoIHVua25vd24gcmVjb3JkIHR5cGVzLgorZW51bSBTeW1ib2xLaW5kIDogdWludDE2X3QgeworI2RlZmluZSBDVl9TWU1CT0wobmFtZSwgdmFsKSBuYW1lID0gdmFsLAorI2luY2x1ZGUgIkNvZGVWaWV3U3ltYm9scy5kZWYiCit9OworCisjZGVmaW5lIENWX0RFRklORV9FTlVNX0NMQVNTX0ZMQUdTX09QRVJBVE9SUyhDbGFzcykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgQ2xhc3Mgb3BlcmF0b3J8KENsYXNzIGEsIENsYXNzIGIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2xhc3M+KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRpY19jYXN0PHN0ZDo6dW5kZXJseWluZ190eXBlPENsYXNzPjo6dHlwZT4oYSkgfCAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdGF0aWNfY2FzdDxzdGQ6OnVuZGVybHlpbmdfdHlwZTxDbGFzcz46OnR5cGU+KGIpKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBDbGFzcyBvcGVyYXRvciYoQ2xhc3MgYSwgQ2xhc3MgYikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBzdGF0aWNfY2FzdDxDbGFzcz4oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RhdGljX2Nhc3Q8c3RkOjp1bmRlcmx5aW5nX3R5cGU8Q2xhc3M+Ojp0eXBlPihhKSAmICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXRpY19jYXN0PHN0ZDo6dW5kZXJseWluZ190eXBlPENsYXNzPjo6dHlwZT4oYikpOyAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIENsYXNzIG9wZXJhdG9yfihDbGFzcyBhKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PENsYXNzPiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB+c3RhdGljX2Nhc3Q8c3RkOjp1bmRlcmx5aW5nX3R5cGU8Q2xhc3M+Ojp0eXBlPihhKSk7ICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBDbGFzcyAmb3BlcmF0b3J8PShDbGFzcyAmYSwgQ2xhc3MgYikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGEgPSBhIHwgYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gYTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgQ2xhc3MgJm9wZXJhdG9yJj0oQ2xhc3MgJmEsIENsYXNzIGIpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhID0gYSAmIGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8vLyBUaGVzZSB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgQ1ZfQ1BVX1RZUEVfZSBlbnVtZXJhdGlvbiwgYW5kIGFyZSBkb2N1bWVudGVkCisvLy8gaGVyZTogaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9iMmZjNjRlay5hc3B4CitlbnVtIGNsYXNzIENQVVR5cGUgOiB1aW50MTZfdCB7CisgIEludGVsODA4MCA9IDB4MCwKKyAgSW50ZWw4MDg2ID0gMHgxLAorICBJbnRlbDgwMjg2ID0gMHgyLAorICBJbnRlbDgwMzg2ID0gMHgzLAorICBJbnRlbDgwNDg2ID0gMHg0LAorICBQZW50aXVtID0gMHg1LAorICBQZW50aXVtUHJvID0gMHg2LAorICBQZW50aXVtMyA9IDB4NywKKyAgTUlQUyA9IDB4MTAsCisgIE1JUFMxNiA9IDB4MTEsCisgIE1JUFMzMiA9IDB4MTIsCisgIE1JUFM2NCA9IDB4MTMsCisgIE1JUFNJID0gMHgxNCwKKyAgTUlQU0lJID0gMHgxNSwKKyAgTUlQU0lJSSA9IDB4MTYsCisgIE1JUFNJViA9IDB4MTcsCisgIE1JUFNWID0gMHgxOCwKKyAgTTY4MDAwID0gMHgyMCwKKyAgTTY4MDEwID0gMHgyMSwKKyAgTTY4MDIwID0gMHgyMiwKKyAgTTY4MDMwID0gMHgyMywKKyAgTTY4MDQwID0gMHgyNCwKKyAgQWxwaGEgPSAweDMwLAorICBBbHBoYTIxMTY0ID0gMHgzMSwKKyAgQWxwaGEyMTE2NEEgPSAweDMyLAorICBBbHBoYTIxMjY0ID0gMHgzMywKKyAgQWxwaGEyMTM2NCA9IDB4MzQsCisgIFBQQzYwMSA9IDB4NDAsCisgIFBQQzYwMyA9IDB4NDEsCisgIFBQQzYwNCA9IDB4NDIsCisgIFBQQzYyMCA9IDB4NDMsCisgIFBQQ0ZQID0gMHg0NCwKKyAgUFBDQkUgPSAweDQ1LAorICBTSDMgPSAweDUwLAorICBTSDNFID0gMHg1MSwKKyAgU0gzRFNQID0gMHg1MiwKKyAgU0g0ID0gMHg1MywKKyAgU0hNZWRpYSA9IDB4NTQsCisgIEFSTTMgPSAweDYwLAorICBBUk00ID0gMHg2MSwKKyAgQVJNNFQgPSAweDYyLAorICBBUk01ID0gMHg2MywKKyAgQVJNNVQgPSAweDY0LAorICBBUk02ID0gMHg2NSwKKyAgQVJNX1hNQUMgPSAweDY2LAorICBBUk1fV01NWCA9IDB4NjcsCisgIEFSTTcgPSAweDY4LAorICBBUk02NCA9IDB4NjksCisgIE9tbmkgPSAweDcwLAorICBJYTY0ID0gMHg4MCwKKyAgSWE2NF8yID0gMHg4MSwKKyAgQ0VFID0gMHg5MCwKKyAgQU0zMyA9IDB4YTAsCisgIE0zMlIgPSAweGIwLAorICBUcmlDb3JlID0gMHhjMCwKKyAgWDY0ID0gMHhkMCwKKyAgRUJDID0gMHhlMCwKKyAgVGh1bWIgPSAweGYwLAorICBBUk1OVCA9IDB4ZjQsCisgIEQzRDExX1NoYWRlciA9IDB4MTAwLAorfTsKKworLy8vIFRoZXNlIHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBDVl9DRkxfTEFORyBlbnVtZXJhdGlvbiwgYW5kIGFyZSBkb2N1bWVudGVkCisvLy8gaGVyZTogaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9idzNhZWt3Ni5hc3B4CitlbnVtIFNvdXJjZUxhbmd1YWdlIDogdWludDhfdCB7CisgIEMgPSAweDAwLAorICBDcHAgPSAweDAxLAorICBGb3J0cmFuID0gMHgwMiwKKyAgTWFzbSA9IDB4MDMsCisgIFBhc2NhbCA9IDB4MDQsCisgIEJhc2ljID0gMHgwNSwKKyAgQ29ib2wgPSAweDA2LAorICBMaW5rID0gMHgwNywKKyAgQ3Z0cmVzID0gMHgwOCwKKyAgQ3Z0cGdkID0gMHgwOSwKKyAgQ1NoYXJwID0gMHgwYSwKKyAgVkIgPSAweDBiLAorICBJTEFzbSA9IDB4MGMsCisgIEphdmEgPSAweDBkLAorICBKU2NyaXB0ID0gMHgwZSwKKyAgTVNJTCA9IDB4MGYsCisgIEhMU0wgPSAweDEwLAorCisgIC8vLyBUaGUgRE1EIGNvbXBpbGVyIGVtaXRzICdEJyBmb3IgdGhlIENWIHNvdXJjZSBsYW5ndWFnZS4gTWljcm9zb2Z0IGRvZXNuJ3QKKyAgLy8vIGhhdmUgYW4gZW51bWVyYXRvciBmb3IgaXQgeWV0LgorICBEID0gJ0QnLAorfTsKKworLy8vIFRoZXNlIHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBDVl9jYWxsX2UgZW51bWVyYXRpb24sIGFuZCBhcmUgZG9jdW1lbnRlZAorLy8vIGF0IHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgorLy8vICAgaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9iMmZjNjRlay5hc3B4CisvLy8gICBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9tczY4MDIwNyh2PXZzLjg1KS5hc3B4CisvLy8KK2VudW0gY2xhc3MgQ2FsbGluZ0NvbnZlbnRpb24gOiB1aW50OF90IHsKKyAgTmVhckMgPSAweDAwLCAgICAgICAvLyBuZWFyIHJpZ2h0IHRvIGxlZnQgcHVzaCwgY2FsbGVyIHBvcHMgc3RhY2sKKyAgRmFyQyA9IDB4MDEsICAgICAgICAvLyBmYXIgcmlnaHQgdG8gbGVmdCBwdXNoLCBjYWxsZXIgcG9wcyBzdGFjaworICBOZWFyUGFzY2FsID0gMHgwMiwgIC8vIG5lYXIgbGVmdCB0byByaWdodCBwdXNoLCBjYWxsZWUgcG9wcyBzdGFjaworICBGYXJQYXNjYWwgPSAweDAzLCAgIC8vIGZhciBsZWZ0IHRvIHJpZ2h0IHB1c2gsIGNhbGxlZSBwb3BzIHN0YWNrCisgIE5lYXJGYXN0ID0gMHgwNCwgICAgLy8gbmVhciBsZWZ0IHRvIHJpZ2h0IHB1c2ggd2l0aCByZWdzLCBjYWxsZWUgcG9wcyBzdGFjaworICBGYXJGYXN0ID0gMHgwNSwgICAgIC8vIGZhciBsZWZ0IHRvIHJpZ2h0IHB1c2ggd2l0aCByZWdzLCBjYWxsZWUgcG9wcyBzdGFjaworICBOZWFyU3RkQ2FsbCA9IDB4MDcsIC8vIG5lYXIgc3RhbmRhcmQgY2FsbAorICBGYXJTdGRDYWxsID0gMHgwOCwgIC8vIGZhciBzdGFuZGFyZCBjYWxsCisgIE5lYXJTeXNDYWxsID0gMHgwOSwgLy8gbmVhciBzeXMgY2FsbAorICBGYXJTeXNDYWxsID0gMHgwYSwgIC8vIGZhciBzeXMgY2FsbAorICBUaGlzQ2FsbCA9IDB4MGIsICAgIC8vIHRoaXMgY2FsbCAodGhpcyBwYXNzZWQgaW4gcmVnaXN0ZXIpCisgIE1pcHNDYWxsID0gMHgwYywgICAgLy8gTWlwcyBjYWxsCisgIEdlbmVyaWMgPSAweDBkLCAgICAgLy8gR2VuZXJpYyBjYWxsIHNlcXVlbmNlCisgIEFscGhhQ2FsbCA9IDB4MGUsICAgLy8gQWxwaGEgY2FsbAorICBQcGNDYWxsID0gMHgwZiwgICAgIC8vIFBQQyBjYWxsCisgIFNIQ2FsbCA9IDB4MTAsICAgICAgLy8gSGl0YWNoaSBTdXBlckggY2FsbAorICBBcm1DYWxsID0gMHgxMSwgICAgIC8vIEFSTSBjYWxsCisgIEFNMzNDYWxsID0gMHgxMiwgICAgLy8gQU0zMyBjYWxsCisgIFRyaUNhbGwgPSAweDEzLCAgICAgLy8gVHJpQ29yZSBDYWxsCisgIFNINUNhbGwgPSAweDE0LCAgICAgLy8gSGl0YWNoaSBTdXBlckgtNSBjYWxsCisgIE0zMlJDYWxsID0gMHgxNSwgICAgLy8gTTMyUiBDYWxsCisgIENsckNhbGwgPSAweDE2LCAgICAgLy8gY2xyIGNhbGwKKyAgSW5saW5lID0KKyAgICAgIDB4MTcsIC8vIE1hcmtlciBmb3Igcm91dGluZXMgYWx3YXlzIGlubGluZWQgYW5kIHRodXMgbGFja2luZyBhIGNvbnZlbnRpb24KKyAgTmVhclZlY3RvciA9IDB4MTggLy8gbmVhciBsZWZ0IHRvIHJpZ2h0IHB1c2ggd2l0aCByZWdzLCBjYWxsZWUgcG9wcyBzdGFjaworfTsKKworZW51bSBjbGFzcyBDbGFzc09wdGlvbnMgOiB1aW50MTZfdCB7CisgIE5vbmUgPSAweDAwMDAsCisgIFBhY2tlZCA9IDB4MDAwMSwKKyAgSGFzQ29uc3RydWN0b3JPckRlc3RydWN0b3IgPSAweDAwMDIsCisgIEhhc092ZXJsb2FkZWRPcGVyYXRvciA9IDB4MDAwNCwKKyAgTmVzdGVkID0gMHgwMDA4LAorICBDb250YWluc05lc3RlZENsYXNzID0gMHgwMDEwLAorICBIYXNPdmVybG9hZGVkQXNzaWdubWVudE9wZXJhdG9yID0gMHgwMDIwLAorICBIYXNDb252ZXJzaW9uT3BlcmF0b3IgPSAweDAwNDAsCisgIEZvcndhcmRSZWZlcmVuY2UgPSAweDAwODAsCisgIFNjb3BlZCA9IDB4MDEwMCwKKyAgSGFzVW5pcXVlTmFtZSA9IDB4MDIwMCwKKyAgU2VhbGVkID0gMHgwNDAwLAorICBJbnRyaW5zaWMgPSAweDIwMDAKK307CitDVl9ERUZJTkVfRU5VTV9DTEFTU19GTEFHU19PUEVSQVRPUlMoQ2xhc3NPcHRpb25zKQorCitlbnVtIGNsYXNzIEZyYW1lUHJvY2VkdXJlT3B0aW9ucyA6IHVpbnQzMl90IHsKKyAgTm9uZSA9IDB4MDAwMDAwMDAsCisgIEhhc0FsbG9jYSA9IDB4MDAwMDAwMDEsCisgIEhhc1NldEptcCA9IDB4MDAwMDAwMDIsCisgIEhhc0xvbmdKbXAgPSAweDAwMDAwMDA0LAorICBIYXNJbmxpbmVBc3NlbWJseSA9IDB4MDAwMDAwMDgsCisgIEhhc0V4Y2VwdGlvbkhhbmRsaW5nID0gMHgwMDAwMDAxMCwKKyAgTWFya2VkSW5saW5lID0gMHgwMDAwMDAyMCwKKyAgSGFzU3RydWN0dXJlZEV4Y2VwdGlvbkhhbmRsaW5nID0gMHgwMDAwMDA0MCwKKyAgTmFrZWQgPSAweDAwMDAwMDgwLAorICBTZWN1cml0eUNoZWNrcyA9IDB4MDAwMDAxMDAsCisgIEFzeW5jaHJvbm91c0V4Y2VwdGlvbkhhbmRsaW5nID0gMHgwMDAwMDIwMCwKKyAgTm9TdGFja09yZGVyaW5nRm9yU2VjdXJpdHlDaGVja3MgPSAweDAwMDAwNDAwLAorICBJbmxpbmVkID0gMHgwMDAwMDgwMCwKKyAgU3RyaWN0U2VjdXJpdHlDaGVja3MgPSAweDAwMDAxMDAwLAorICBTYWZlQnVmZmVycyA9IDB4MDAwMDIwMDAsCisgIFByb2ZpbGVHdWlkZWRPcHRpbWl6YXRpb24gPSAweDAwMDQwMDAwLAorICBWYWxpZFByb2ZpbGVDb3VudHMgPSAweDAwMDgwMDAwLAorICBPcHRpbWl6ZWRGb3JTcGVlZCA9IDB4MDAxMDAwMDAsCisgIEd1YXJkQ2ZnID0gMHgwMDIwMDAwMCwKKyAgR3VhcmRDZncgPSAweDAwNDAwMDAwCit9OworQ1ZfREVGSU5FX0VOVU1fQ0xBU1NfRkxBR1NfT1BFUkFUT1JTKEZyYW1lUHJvY2VkdXJlT3B0aW9ucykKKworZW51bSBjbGFzcyBGdW5jdGlvbk9wdGlvbnMgOiB1aW50OF90IHsKKyAgTm9uZSA9IDB4MDAsCisgIEN4eFJldHVyblVkdCA9IDB4MDEsCisgIENvbnN0cnVjdG9yID0gMHgwMiwKKyAgQ29uc3RydWN0b3JXaXRoVmlydHVhbEJhc2VzID0gMHgwNAorfTsKK0NWX0RFRklORV9FTlVNX0NMQVNTX0ZMQUdTX09QRVJBVE9SUyhGdW5jdGlvbk9wdGlvbnMpCisKK2VudW0gY2xhc3MgSGZhS2luZCA6IHVpbnQ4X3QgeworICBOb25lID0gMHgwMCwKKyAgRmxvYXQgPSAweDAxLAorICBEb3VibGUgPSAweDAyLAorICBPdGhlciA9IDB4MDMKK307CisKKy8vLyBTb3VyY2UtbGV2ZWwgYWNjZXNzIHNwZWNpZmllci4gKENWX2FjY2Vzc19lKQorZW51bSBjbGFzcyBNZW1iZXJBY2Nlc3MgOiB1aW50OF90IHsKKyAgTm9uZSA9IDAsCisgIFByaXZhdGUgPSAxLAorICBQcm90ZWN0ZWQgPSAyLAorICBQdWJsaWMgPSAzCit9OworCisvLy8gUGFydCBvZiBtZW1iZXIgYXR0cmlidXRlIGZsYWdzLiAoQ1ZfbWV0aG9kcHJvcF9lKQorZW51bSBjbGFzcyBNZXRob2RLaW5kIDogdWludDhfdCB7CisgIFZhbmlsbGEgPSAweDAwLAorICBWaXJ0dWFsID0gMHgwMSwKKyAgU3RhdGljID0gMHgwMiwKKyAgRnJpZW5kID0gMHgwMywKKyAgSW50cm9kdWNpbmdWaXJ0dWFsID0gMHgwNCwKKyAgUHVyZVZpcnR1YWwgPSAweDA1LAorICBQdXJlSW50cm9kdWNpbmdWaXJ0dWFsID0gMHgwNgorfTsKKworLy8vIEVxdWl2YWxlbnQgdG8gQ1ZfZmxkYXR0cl90IGJpdGZpZWxkLgorZW51bSBjbGFzcyBNZXRob2RPcHRpb25zIDogdWludDE2X3QgeworICBOb25lID0gMHgwMDAwLAorICBBY2Nlc3NNYXNrID0gMHgwMDAzLAorICBNZXRob2RLaW5kTWFzayA9IDB4MDAxYywKKyAgUHNldWRvID0gMHgwMDIwLAorICBOb0luaGVyaXQgPSAweDAwNDAsCisgIE5vQ29uc3RydWN0ID0gMHgwMDgwLAorICBDb21waWxlckdlbmVyYXRlZCA9IDB4MDEwMCwKKyAgU2VhbGVkID0gMHgwMjAwCit9OworQ1ZfREVGSU5FX0VOVU1fQ0xBU1NfRkxBR1NfT1BFUkFUT1JTKE1ldGhvZE9wdGlvbnMpCisKKy8vLyBFcXVpdmFsZW50IHRvIENWX0xBQkVMX1RZUEVfZS4KK2VudW0gY2xhc3MgTGFiZWxUeXBlIDogdWludDE2X3QgeworICBOZWFyID0gMHgwLAorICBGYXIgPSAweDQsCit9OworCisvLy8gRXF1aXZhbGVudCB0byBDVl9tb2RpZmllcl90LgorLy8vIFRPRE86IEFkZCBmbGFnIGZvciBfQXRvbWljIG1vZGlmaWVyCitlbnVtIGNsYXNzIE1vZGlmaWVyT3B0aW9ucyA6IHVpbnQxNl90IHsKKyAgTm9uZSA9IDB4MDAwMCwKKyAgQ29uc3QgPSAweDAwMDEsCisgIFZvbGF0aWxlID0gMHgwMDAyLAorICBVbmFsaWduZWQgPSAweDAwMDQKK307CitDVl9ERUZJTkVfRU5VTV9DTEFTU19GTEFHU19PUEVSQVRPUlMoTW9kaWZpZXJPcHRpb25zKQorCitlbnVtIGNsYXNzIERlYnVnU3Vic2VjdGlvbktpbmQgOiB1aW50MzJfdCB7CisgIE5vbmUgPSAwLAorICBTeW1ib2xzID0gMHhmMSwKKyAgTGluZXMgPSAweGYyLAorICBTdHJpbmdUYWJsZSA9IDB4ZjMsCisgIEZpbGVDaGVja3N1bXMgPSAweGY0LAorICBGcmFtZURhdGEgPSAweGY1LAorICBJbmxpbmVlTGluZXMgPSAweGY2LAorICBDcm9zc1Njb3BlSW1wb3J0cyA9IDB4ZjcsCisgIENyb3NzU2NvcGVFeHBvcnRzID0gMHhmOCwKKworICAvLyBUaGVzZSBhcHBlYXIgdG8gcmVsYXRlIHRvIC5OZXQgYXNzZW1ibHkgaW5mby4KKyAgSUxMaW5lcyA9IDB4ZjksCisgIEZ1bmNNRFRva2VuTWFwID0gMHhmYSwKKyAgVHlwZU1EVG9rZW5NYXAgPSAweGZiLAorICBNZXJnZWRBc3NlbWJseUlucHV0ID0gMHhmYywKKworICBDb2ZmU3ltYm9sUlZBID0gMHhmZCwKK307CisKKy8vLyBFcXVpdmFsZW50IHRvIENWX3B0cnR5cGVfZS4KK2VudW0gY2xhc3MgUG9pbnRlcktpbmQgOiB1aW50OF90IHsKKyAgTmVhcjE2ID0gMHgwMCwgICAgICAgICAgICAgICAgLy8gMTYgYml0IHBvaW50ZXIKKyAgRmFyMTYgPSAweDAxLCAgICAgICAgICAgICAgICAgLy8gMTY6MTYgZmFyIHBvaW50ZXIKKyAgSHVnZTE2ID0gMHgwMiwgICAgICAgICAgICAgICAgLy8gMTY6MTYgaHVnZSBwb2ludGVyCisgIEJhc2VkT25TZWdtZW50ID0gMHgwMywgICAgICAgIC8vIGJhc2VkIG9uIHNlZ21lbnQKKyAgQmFzZWRPblZhbHVlID0gMHgwNCwgICAgICAgICAgLy8gYmFzZWQgb24gdmFsdWUgb2YgYmFzZQorICBCYXNlZE9uU2VnbWVudFZhbHVlID0gMHgwNSwgICAvLyBiYXNlZCBvbiBzZWdtZW50IHZhbHVlIG9mIGJhc2UKKyAgQmFzZWRPbkFkZHJlc3MgPSAweDA2LCAgICAgICAgLy8gYmFzZWQgb24gYWRkcmVzcyBvZiBiYXNlCisgIEJhc2VkT25TZWdtZW50QWRkcmVzcyA9IDB4MDcsIC8vIGJhc2VkIG9uIHNlZ21lbnQgYWRkcmVzcyBvZiBiYXNlCisgIEJhc2VkT25UeXBlID0gMHgwOCwgICAgICAgICAgIC8vIGJhc2VkIG9uIHR5cGUKKyAgQmFzZWRPblNlbGYgPSAweDA5LCAgICAgICAgICAgLy8gYmFzZWQgb24gc2VsZgorICBOZWFyMzIgPSAweDBhLCAgICAgICAgICAgICAgICAvLyAzMiBiaXQgcG9pbnRlcgorICBGYXIzMiA9IDB4MGIsICAgICAgICAgICAgICAgICAvLyAxNjozMiBwb2ludGVyCisgIE5lYXI2NCA9IDB4MGMgICAgICAgICAgICAgICAgIC8vIDY0IGJpdCBwb2ludGVyCit9OworCisvLy8gRXF1aXZhbGVudCB0byBDVl9wdHJtb2RlX2UuCitlbnVtIGNsYXNzIFBvaW50ZXJNb2RlIDogdWludDhfdCB7CisgIFBvaW50ZXIgPSAweDAwLCAgICAgICAgICAgICAgICAgLy8gIm5vcm1hbCIgcG9pbnRlcgorICBMVmFsdWVSZWZlcmVuY2UgPSAweDAxLCAgICAgICAgIC8vICJvbGQiIHJlZmVyZW5jZQorICBQb2ludGVyVG9EYXRhTWVtYmVyID0gMHgwMiwgICAgIC8vIHBvaW50ZXIgdG8gZGF0YSBtZW1iZXIKKyAgUG9pbnRlclRvTWVtYmVyRnVuY3Rpb24gPSAweDAzLCAvLyBwb2ludGVyIHRvIG1lbWJlciBmdW5jdGlvbgorICBSVmFsdWVSZWZlcmVuY2UgPSAweDA0ICAgICAgICAgIC8vIHItdmFsdWUgcmVmZXJlbmNlCit9OworCisvLy8gRXF1aXZhbGVudCB0byBtaXNjIGxmUG9pbnRlckF0dHIgYml0ZmllbGRzLgorZW51bSBjbGFzcyBQb2ludGVyT3B0aW9ucyA6IHVpbnQzMl90IHsKKyAgTm9uZSA9IDB4MDAwMDAwMDAsCisgIEZsYXQzMiA9IDB4MDAwMDAxMDAsCisgIFZvbGF0aWxlID0gMHgwMDAwMDIwMCwKKyAgQ29uc3QgPSAweDAwMDAwNDAwLAorICBVbmFsaWduZWQgPSAweDAwMDAwODAwLAorICBSZXN0cmljdCA9IDB4MDAwMDEwMDAsCisgIFdpblJUU21hcnRQb2ludGVyID0gMHgwMDA4MDAwMAorfTsKK0NWX0RFRklORV9FTlVNX0NMQVNTX0ZMQUdTX09QRVJBVE9SUyhQb2ludGVyT3B0aW9ucykKKworLy8vIEVxdWl2YWxlbnQgdG8gQ1ZfcG10eXBlX2UuCitlbnVtIGNsYXNzIFBvaW50ZXJUb01lbWJlclJlcHJlc2VudGF0aW9uIDogdWludDE2X3QgeworICBVbmtub3duID0gMHgwMCwgICAgICAgICAgICAgICAgICAgICAvLyBub3Qgc3BlY2lmaWVkIChwcmUgVkM4KQorICBTaW5nbGVJbmhlcml0YW5jZURhdGEgPSAweDAxLCAgICAgICAvLyBtZW1iZXIgZGF0YSwgc2luZ2xlIGluaGVyaXRhbmNlCisgIE11bHRpcGxlSW5oZXJpdGFuY2VEYXRhID0gMHgwMiwgICAgIC8vIG1lbWJlciBkYXRhLCBtdWx0aXBsZSBpbmhlcml0YW5jZQorICBWaXJ0dWFsSW5oZXJpdGFuY2VEYXRhID0gMHgwMywgICAgICAvLyBtZW1iZXIgZGF0YSwgdmlydHVhbCBpbmhlcml0YW5jZQorICBHZW5lcmFsRGF0YSA9IDB4MDQsICAgICAgICAgICAgICAgICAvLyBtZW1iZXIgZGF0YSwgbW9zdCBnZW5lcmFsCisgIFNpbmdsZUluaGVyaXRhbmNlRnVuY3Rpb24gPSAweDA1LCAgIC8vIG1lbWJlciBmdW5jdGlvbiwgc2luZ2xlIGluaGVyaXRhbmNlCisgIE11bHRpcGxlSW5oZXJpdGFuY2VGdW5jdGlvbiA9IDB4MDYsIC8vIG1lbWJlciBmdW5jdGlvbiwgbXVsdGlwbGUgaW5oZXJpdGFuY2UKKyAgVmlydHVhbEluaGVyaXRhbmNlRnVuY3Rpb24gPSAweDA3LCAgLy8gbWVtYmVyIGZ1bmN0aW9uLCB2aXJ0dWFsIGluaGVyaXRhbmNlCisgIEdlbmVyYWxGdW5jdGlvbiA9IDB4MDggICAgICAgICAgICAgIC8vIG1lbWJlciBmdW5jdGlvbiwgbW9zdCBnZW5lcmFsCit9OworCitlbnVtIGNsYXNzIFZGVGFibGVTbG90S2luZCA6IHVpbnQ4X3QgeworICBOZWFyMTYgPSAweDAwLAorICBGYXIxNiA9IDB4MDEsCisgIFRoaXMgPSAweDAyLAorICBPdXRlciA9IDB4MDMsCisgIE1ldGEgPSAweDA0LAorICBOZWFyID0gMHgwNSwKKyAgRmFyID0gMHgwNgorfTsKKworZW51bSBjbGFzcyBXaW5kb3dzUlRDbGFzc0tpbmQgOiB1aW50OF90IHsKKyAgTm9uZSA9IDB4MDAsCisgIFJlZkNsYXNzID0gMHgwMSwKKyAgVmFsdWVDbGFzcyA9IDB4MDIsCisgIEludGVyZmFjZSA9IDB4MDMKK307CisKKy8vLyBDb3JyZXNwb25kcyB0byBDVl9MVkFSRkxBR1MgYml0ZmllbGQuCitlbnVtIGNsYXNzIExvY2FsU3ltRmxhZ3MgOiB1aW50MTZfdCB7CisgIE5vbmUgPSAwLAorICBJc1BhcmFtZXRlciA9IDEgPDwgMCwKKyAgSXNBZGRyZXNzVGFrZW4gPSAxIDw8IDEsCisgIElzQ29tcGlsZXJHZW5lcmF0ZWQgPSAxIDw8IDIsCisgIElzQWdncmVnYXRlID0gMSA8PCAzLAorICBJc0FnZ3JlZ2F0ZWQgPSAxIDw8IDQsCisgIElzQWxpYXNlZCA9IDEgPDwgNSwKKyAgSXNBbGlhcyA9IDEgPDwgNiwKKyAgSXNSZXR1cm5WYWx1ZSA9IDEgPDwgNywKKyAgSXNPcHRpbWl6ZWRPdXQgPSAxIDw8IDgsCisgIElzRW5yZWdpc3RlcmVkR2xvYmFsID0gMSA8PCA5LAorICBJc0VucmVnaXN0ZXJlZFN0YXRpYyA9IDEgPDwgMTAsCit9OworQ1ZfREVGSU5FX0VOVU1fQ0xBU1NfRkxBR1NfT1BFUkFUT1JTKExvY2FsU3ltRmxhZ3MpCisKKy8vLyBDb3JyZXNwb25kcyB0byB0aGUgQ1ZfUFVCU1lNRkxBR1MgYml0ZmllbGQuCitlbnVtIGNsYXNzIFB1YmxpY1N5bUZsYWdzIDogdWludDMyX3QgeworICBOb25lID0gMCwKKyAgQ29kZSA9IDEgPDwgMCwKKyAgRnVuY3Rpb24gPSAxIDw8IDEsCisgIE1hbmFnZWQgPSAxIDw8IDIsCisgIE1TSUwgPSAxIDw8IDMsCit9OworQ1ZfREVGSU5FX0VOVU1fQ0xBU1NfRkxBR1NfT1BFUkFUT1JTKFB1YmxpY1N5bUZsYWdzKQorCisvLy8gQ29ycmVzcG9uZHMgdG8gdGhlIENWX1BST0NGTEFHUyBiaXRmaWVsZC4KK2VudW0gY2xhc3MgUHJvY1N5bUZsYWdzIDogdWludDhfdCB7CisgIE5vbmUgPSAwLAorICBIYXNGUCA9IDEgPDwgMCwKKyAgSGFzSVJFVCA9IDEgPDwgMSwKKyAgSGFzRlJFVCA9IDEgPDwgMiwKKyAgSXNOb1JldHVybiA9IDEgPDwgMywKKyAgSXNVbnJlYWNoYWJsZSA9IDEgPDwgNCwKKyAgSGFzQ3VzdG9tQ2FsbGluZ0NvbnYgPSAxIDw8IDUsCisgIElzTm9JbmxpbmUgPSAxIDw8IDYsCisgIEhhc09wdGltaXplZERlYnVnSW5mbyA9IDEgPDwgNywKK307CitDVl9ERUZJTkVfRU5VTV9DTEFTU19GTEFHU19PUEVSQVRPUlMoUHJvY1N5bUZsYWdzKQorCisvLy8gQ29ycmVzcG9uZHMgdG8gQ09NUElMRVNZTTI6OkZsYWdzIGJpdGZpZWxkLgorZW51bSBjbGFzcyBDb21waWxlU3ltMkZsYWdzIDogdWludDMyX3QgeworICBOb25lID0gMCwKKyAgU291cmNlTGFuZ3VhZ2VNYXNrID0gMHhGRiwKKyAgRUMgPSAxIDw8IDgsCisgIE5vRGJnSW5mbyA9IDEgPDwgOSwKKyAgTFRDRyA9IDEgPDwgMTAsCisgIE5vRGF0YUFsaWduID0gMSA8PCAxMSwKKyAgTWFuYWdlZFByZXNlbnQgPSAxIDw8IDEyLAorICBTZWN1cml0eUNoZWNrcyA9IDEgPDwgMTMsCisgIEhvdFBhdGNoID0gMSA8PCAxNCwKKyAgQ1ZUQ0lMID0gMSA8PCAxNSwKKyAgTVNJTE1vZHVsZSA9IDEgPDwgMTYsCit9OworQ1ZfREVGSU5FX0VOVU1fQ0xBU1NfRkxBR1NfT1BFUkFUT1JTKENvbXBpbGVTeW0yRmxhZ3MpCisKKy8vLyBDb3JyZXNwb25kcyB0byBDT01QSUxFU1lNMzo6RmxhZ3MgYml0ZmllbGQuCitlbnVtIGNsYXNzIENvbXBpbGVTeW0zRmxhZ3MgOiB1aW50MzJfdCB7CisgIE5vbmUgPSAwLAorICBTb3VyY2VMYW5ndWFnZU1hc2sgPSAweEZGLAorICBFQyA9IDEgPDwgOCwKKyAgTm9EYmdJbmZvID0gMSA8PCA5LAorICBMVENHID0gMSA8PCAxMCwKKyAgTm9EYXRhQWxpZ24gPSAxIDw8IDExLAorICBNYW5hZ2VkUHJlc2VudCA9IDEgPDwgMTIsCisgIFNlY3VyaXR5Q2hlY2tzID0gMSA8PCAxMywKKyAgSG90UGF0Y2ggPSAxIDw8IDE0LAorICBDVlRDSUwgPSAxIDw8IDE1LAorICBNU0lMTW9kdWxlID0gMSA8PCAxNiwKKyAgU2RsID0gMSA8PCAxNywKKyAgUEdPID0gMSA8PCAxOCwKKyAgRXhwID0gMSA8PCAxOSwKK307CitDVl9ERUZJTkVfRU5VTV9DTEFTU19GTEFHU19PUEVSQVRPUlMoQ29tcGlsZVN5bTNGbGFncykKKworZW51bSBjbGFzcyBFeHBvcnRGbGFncyA6IHVpbnQxNl90IHsKKyAgTm9uZSA9IDAsCisgIElzQ29uc3RhbnQgPSAxIDw8IDAsCisgIElzRGF0YSA9IDEgPDwgMSwKKyAgSXNQcml2YXRlID0gMSA8PCAyLAorICBIYXNOb05hbWUgPSAxIDw8IDMsCisgIEhhc0V4cGxpY2l0T3JkaW5hbCA9IDEgPDwgNCwKKyAgSXNGb3J3YXJkZXIgPSAxIDw8IDUKK307CitDVl9ERUZJTkVfRU5VTV9DTEFTU19GTEFHU19PUEVSQVRPUlMoRXhwb3J0RmxhZ3MpCisKKy8vIENvcnJlc3BvbmRzIHRvIEJpbmFyeUFubm90YXRpb25PcGNvZGUgZW51bS4KK2VudW0gY2xhc3MgQmluYXJ5QW5ub3RhdGlvbnNPcENvZGUgOiB1aW50MzJfdCB7CisgIEludmFsaWQsCisgIENvZGVPZmZzZXQsCisgIENoYW5nZUNvZGVPZmZzZXRCYXNlLAorICBDaGFuZ2VDb2RlT2Zmc2V0LAorICBDaGFuZ2VDb2RlTGVuZ3RoLAorICBDaGFuZ2VGaWxlLAorICBDaGFuZ2VMaW5lT2Zmc2V0LAorICBDaGFuZ2VMaW5lRW5kRGVsdGEsCisgIENoYW5nZVJhbmdlS2luZCwKKyAgQ2hhbmdlQ29sdW1uU3RhcnQsCisgIENoYW5nZUNvbHVtbkVuZERlbHRhLAorICBDaGFuZ2VDb2RlT2Zmc2V0QW5kTGluZU9mZnNldCwKKyAgQ2hhbmdlQ29kZUxlbmd0aEFuZENvZGVPZmZzZXQsCisgIENoYW5nZUNvbHVtbkVuZCwKK307CisKKy8vIENvcnJlc3BvbmRzIHRvIENWX2Nvb2tpZXR5cGVfZSBlbnVtLgorZW51bSBjbGFzcyBGcmFtZUNvb2tpZUtpbmQgOiB1aW50OF90IHsKKyAgQ29weSwKKyAgWG9yU3RhY2tQb2ludGVyLAorICBYb3JGcmFtZVBvaW50ZXIsCisgIFhvclIxMywKK307CisKKy8vIENvcnJlc3BvbmRzIHRvIENWX0hSRUdfZSBlbnVtLgorZW51bSBjbGFzcyBSZWdpc3RlcklkIDogdWludDE2X3QgeworI2RlZmluZSBDVl9SRUdJU1RFUihuYW1lLCB2YWx1ZSkgbmFtZSA9IHZhbHVlLAorI2luY2x1ZGUgIkNvZGVWaWV3UmVnaXN0ZXJzLmRlZiIKKyN1bmRlZiBDVl9SRUdJU1RFUgorfTsKKworLy8vIFRoZXNlIHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBUSFVOS19PUkRJTkFMIGVudW1lcmF0aW9uLgorZW51bSBjbGFzcyBUaHVua09yZGluYWwgOiB1aW50OF90IHsKKyAgU3RhbmRhcmQsCisgIFRoaXNBZGp1c3RvciwKKyAgVmNhbGwsCisgIFBjb2RlLAorICBVbmtub3duTG9hZCwKKyAgVHJhbXBJbmNyZW1lbnRhbCwKKyAgQnJhbmNoSXNsYW5kCit9OworCitlbnVtIGNsYXNzIFRyYW1wb2xpbmVUeXBlIDogdWludDE2X3QgeyBUcmFtcEluY3JlbWVudGFsLCBCcmFuY2hJc2xhbmQgfTsKKworLy8gVGhlc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIENWX1NvdXJjZUNoa3N1bV90IGVudW1lcmF0aW9uLgorZW51bSBjbGFzcyBGaWxlQ2hlY2tzdW1LaW5kIDogdWludDhfdCB7IE5vbmUsIE1ENSwgU0hBMSwgU0hBMjU2IH07CisKK2VudW0gTGluZUZsYWdzIDogdWludDE2X3QgeworICBMRl9Ob25lID0gMCwKKyAgTEZfSGF2ZUNvbHVtbnMgPSAxLCAvLyBDVl9MSU5FU19IQVZFX0NPTFVNTlMKK307CisKKy8vLyBEYXRhIGluIHRoZSBTVUJTRUNfRlJBTUVEQVRBIHN1YmVjdGlvbi4KK3N0cnVjdCBGcmFtZURhdGEgeworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBSdmFTdGFydDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQ29kZVNpemU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IExvY2FsU2l6ZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUGFyYW1zU2l6ZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTWF4U3RhY2tTaXplOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBGcmFtZUZ1bmM7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFByb2xvZ1NpemU7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFNhdmVkUmVnc1NpemU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEZsYWdzOworICBlbnVtIDogdWludDMyX3QgeworICAgIEhhc1NFSCA9IDEgPDwgMCwKKyAgICBIYXNFSCA9IDEgPDwgMSwKKyAgICBJc0Z1bmN0aW9uU3RhcnQgPSAxIDw8IDIsCisgIH07Cit9OworCisvLyBDb3JyZXNwb25kcyB0byBMb2NhbElkQW5kR2xvYmFsSWRQYWlyIHN0cnVjdHVyZS4KKy8vIFRoaXMgc3RydWN0dXJlIGluZm9ybWF0aW9uIGFsbG93cyBjcm9zcy1yZWZlcmVuY2luZyBiZXR3ZWVuIFBEQnMuICBGb3IKKy8vIGV4YW1wbGUsIHdoZW4gYSBQREIgaXMgYmVpbmcgYnVpbHQgZHVyaW5nIGNvbXBpbGF0aW9uIGl0IGlzIG5vdCB5ZXQga25vd24KKy8vIHdoYXQgb3RoZXIgbW9kdWxlcyBtYXkgZW5kIHVwIGluIHRoZSBQREIgYXQgbGluayB0aW1lLiAgU28gY2VydGFpbiB0eXBlcyBvZgorLy8gSURzIG1heSBjbGFzaCBiZXR3ZWVuIHRoZSB2YXJpb3VzIGNvbXBpbGUgdGltZSBQREJzLiAgRm9yIGVhY2ggYWZmZWN0ZWQKKy8vIG1vZHVsZSwgYSBzdWJzZWN0aW9uIHdvdWxkIGJlIHB1dCBpbnRvIHRoZSBQREIgY29udGFpbmluZyBhIG1hcHBpbmcgZnJvbSBpdHMKKy8vIGxvY2FsIElEcyB0byBhIHNpbmdsZSBJRCBuYW1lc3BhY2UgZm9yIGFsbCBpdGVtcyBpbiB0aGUgUERCIGZpbGUuCitzdHJ1Y3QgQ3Jvc3NNb2R1bGVFeHBvcnQgeworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBMb2NhbDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgR2xvYmFsOworfTsKKworc3RydWN0IENyb3NzTW9kdWxlSW1wb3J0IHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTW9kdWxlTmFtZU9mZnNldDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQ291bnQ7IC8vIE51bWJlciBvZiBlbGVtZW50cworICAvLyBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBpZHNbQ291bnRdOyAvLyBpZCBmcm9tIHJlZmVyZW5jZWQgbW9kdWxlCit9OworCitlbnVtIGNsYXNzIENvZGVWaWV3Q29udGFpbmVyIHsgT2JqZWN0RmlsZSwgUGRiIH07CisKK2lubGluZSB1aW50MzJfdCBhbGlnbk9mKENvZGVWaWV3Q29udGFpbmVyIENvbnRhaW5lcikgeworICBpZiAoQ29udGFpbmVyID09IENvZGVWaWV3Q29udGFpbmVyOjpPYmplY3RGaWxlKQorICAgIHJldHVybiAxOworICByZXR1cm4gNDsKK30KK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlld0Vycm9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlld0Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg2YTcyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3RXJyb3IuaApAQCAtMCwwICsxLDQ2IEBACisvLz09PS0gQ29kZVZpZXdFcnJvci5oIC0gRXJyb3IgZXh0ZW5zaW9ucyBmb3IgQ29kZVZpZXcgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9DT0RFVklFV19DT0RFVklFV0VSUk9SX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0NPREVWSUVXX0NPREVWSUVXRVJST1JfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CitlbnVtIGNsYXNzIGN2X2Vycm9yX2NvZGUgeworICB1bnNwZWNpZmllZCA9IDEsCisgIGluc3VmZmljaWVudF9idWZmZXIsCisgIG9wZXJhdGlvbl91bnN1cHBvcnRlZCwKKyAgY29ycnVwdF9yZWNvcmQsCisgIG5vX3JlY29yZHMsCisgIHVua25vd25fbWVtYmVyX3JlY29yZCwKK307CisKKy8vLyBCYXNlIGNsYXNzIGZvciBlcnJvcnMgb3JpZ2luYXRpbmcgd2hlbiBwYXJzaW5nIHJhdyBQREIgZmlsZXMKK2NsYXNzIENvZGVWaWV3RXJyb3IgOiBwdWJsaWMgRXJyb3JJbmZvPENvZGVWaWV3RXJyb3I+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisgIENvZGVWaWV3RXJyb3IoY3ZfZXJyb3JfY29kZSBDKTsKKyAgQ29kZVZpZXdFcnJvcihjb25zdCBzdGQ6OnN0cmluZyAmQ29udGV4dCk7CisgIENvZGVWaWV3RXJyb3IoY3ZfZXJyb3JfY29kZSBDLCBjb25zdCBzdGQ6OnN0cmluZyAmQ29udGV4dCk7CisKKyAgdm9pZCBsb2cocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldEVycm9yTWVzc2FnZSgpIGNvbnN0OworICBzdGQ6OmVycm9yX2NvZGUgY29udmVydFRvRXJyb3JDb2RlKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIEVyck1zZzsKKyAgY3ZfZXJyb3JfY29kZSBDb2RlOworfTsKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdSZWNvcmRJTy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdSZWNvcmRJTy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0ZjEwNGYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlld1JlY29yZElPLmgKQEAgLTAsMCArMSwxNzEgQEAKKy8vPT09LSBDb2RlVmlld1JlY29yZElPLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfQ09ERVZJRVdSRUNPUkRJT19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0NPREVWSUVXUkVDT1JESU9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQVBTSW50LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlld0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWFkZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtV3JpdGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworCitjbGFzcyBDb2RlVmlld1JlY29yZElPIHsKKyAgdWludDMyX3QgZ2V0Q3VycmVudE9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGlzV3JpdGluZygpKSA/IFdyaXRlci0+Z2V0T2Zmc2V0KCkgOiBSZWFkZXItPmdldE9mZnNldCgpOworICB9CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgQ29kZVZpZXdSZWNvcmRJTyhCaW5hcnlTdHJlYW1SZWFkZXIgJlJlYWRlcikgOiBSZWFkZXIoJlJlYWRlcikge30KKyAgZXhwbGljaXQgQ29kZVZpZXdSZWNvcmRJTyhCaW5hcnlTdHJlYW1Xcml0ZXIgJldyaXRlcikgOiBXcml0ZXIoJldyaXRlcikge30KKworICBFcnJvciBiZWdpblJlY29yZChPcHRpb25hbDx1aW50MzJfdD4gTWF4TGVuZ3RoKTsKKyAgRXJyb3IgZW5kUmVjb3JkKCk7CisKKyAgRXJyb3IgbWFwSW50ZWdlcihUeXBlSW5kZXggJlR5cGVJbmQpOworCisgIGJvb2wgaXNSZWFkaW5nKCkgY29uc3QgeyByZXR1cm4gUmVhZGVyICE9IG51bGxwdHI7IH0KKyAgYm9vbCBpc1dyaXRpbmcoKSBjb25zdCB7IHJldHVybiAhaXNSZWFkaW5nKCk7IH0KKworICB1aW50MzJfdCBtYXhGaWVsZExlbmd0aCgpIGNvbnN0OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBFcnJvciBtYXBPYmplY3QoVCAmVmFsdWUpIHsKKyAgICBpZiAoaXNXcml0aW5nKCkpCisgICAgICByZXR1cm4gV3JpdGVyLT53cml0ZU9iamVjdChWYWx1ZSk7CisKKyAgICBjb25zdCBUICpWYWx1ZVB0cjsKKyAgICBpZiAoYXV0byBFQyA9IFJlYWRlci0+cmVhZE9iamVjdChWYWx1ZVB0cikpCisgICAgICByZXR1cm4gRUM7CisgICAgVmFsdWUgPSAqVmFsdWVQdHI7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gRXJyb3IgbWFwSW50ZWdlcihUICZWYWx1ZSkgeworICAgIGlmIChpc1dyaXRpbmcoKSkKKyAgICAgIHJldHVybiBXcml0ZXItPndyaXRlSW50ZWdlcihWYWx1ZSk7CisKKyAgICByZXR1cm4gUmVhZGVyLT5yZWFkSW50ZWdlcihWYWx1ZSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gRXJyb3IgbWFwRW51bShUICZWYWx1ZSkgeworICAgIGlmIChzaXplb2YoVmFsdWUpID4gbWF4RmllbGRMZW5ndGgoKSkKKyAgICAgIHJldHVybiBtYWtlX2Vycm9yPENvZGVWaWV3RXJyb3I+KGN2X2Vycm9yX2NvZGU6Omluc3VmZmljaWVudF9idWZmZXIpOworCisgICAgdXNpbmcgVSA9IHR5cGVuYW1lIHN0ZDo6dW5kZXJseWluZ190eXBlPFQ+Ojp0eXBlOworICAgIFUgWDsKKyAgICBpZiAoaXNXcml0aW5nKCkpCisgICAgICBYID0gc3RhdGljX2Nhc3Q8VT4oVmFsdWUpOworCisgICAgaWYgKGF1dG8gRUMgPSBtYXBJbnRlZ2VyKFgpKQorICAgICAgcmV0dXJuIEVDOworICAgIGlmIChpc1JlYWRpbmcoKSkKKyAgICAgIFZhbHVlID0gc3RhdGljX2Nhc3Q8VD4oWCk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBFcnJvciBtYXBFbmNvZGVkSW50ZWdlcihpbnQ2NF90ICZWYWx1ZSk7CisgIEVycm9yIG1hcEVuY29kZWRJbnRlZ2VyKHVpbnQ2NF90ICZWYWx1ZSk7CisgIEVycm9yIG1hcEVuY29kZWRJbnRlZ2VyKEFQU0ludCAmVmFsdWUpOworICBFcnJvciBtYXBTdHJpbmdaKFN0cmluZ1JlZiAmVmFsdWUpOworICBFcnJvciBtYXBHdWlkKEdVSUQgJkd1aWQpOworCisgIEVycm9yIG1hcFN0cmluZ1pWZWN0b3JaKHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gJlZhbHVlKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2l6ZVR5cGUsIHR5cGVuYW1lIFQsIHR5cGVuYW1lIEVsZW1lbnRNYXBwZXI+CisgIEVycm9yIG1hcFZlY3Rvck4oVCAmSXRlbXMsIGNvbnN0IEVsZW1lbnRNYXBwZXIgJk1hcHBlcikgeworICAgIFNpemVUeXBlIFNpemU7CisgICAgaWYgKGlzV3JpdGluZygpKSB7CisgICAgICBTaXplID0gc3RhdGljX2Nhc3Q8U2l6ZVR5cGU+KEl0ZW1zLnNpemUoKSk7CisgICAgICBpZiAoYXV0byBFQyA9IFdyaXRlci0+d3JpdGVJbnRlZ2VyKFNpemUpKQorICAgICAgICByZXR1cm4gRUM7CisKKyAgICAgIGZvciAoYXV0byAmWCA6IEl0ZW1zKSB7CisgICAgICAgIGlmIChhdXRvIEVDID0gTWFwcGVyKCp0aGlzLCBYKSkKKyAgICAgICAgICByZXR1cm4gRUM7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChhdXRvIEVDID0gUmVhZGVyLT5yZWFkSW50ZWdlcihTaXplKSkKKyAgICAgICAgcmV0dXJuIEVDOworICAgICAgZm9yIChTaXplVHlwZSBJID0gMDsgSSA8IFNpemU7ICsrSSkgeworICAgICAgICB0eXBlbmFtZSBUOjp2YWx1ZV90eXBlIEl0ZW07CisgICAgICAgIGlmIChhdXRvIEVDID0gTWFwcGVyKCp0aGlzLCBJdGVtKSkKKyAgICAgICAgICByZXR1cm4gRUM7CisgICAgICAgIEl0ZW1zLnB1c2hfYmFjayhJdGVtKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBFbGVtZW50TWFwcGVyPgorICBFcnJvciBtYXBWZWN0b3JUYWlsKFQgJkl0ZW1zLCBjb25zdCBFbGVtZW50TWFwcGVyICZNYXBwZXIpIHsKKyAgICBpZiAoaXNXcml0aW5nKCkpIHsKKyAgICAgIGZvciAoYXV0byAmSXRlbSA6IEl0ZW1zKSB7CisgICAgICAgIGlmIChhdXRvIEVDID0gTWFwcGVyKCp0aGlzLCBJdGVtKSkKKyAgICAgICAgICByZXR1cm4gRUM7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGUgRmllbGQ7CisgICAgICAvLyBTdG9wIHdoZW4gd2UgcnVuIG91dCBvZiBieXRlcyBvciB3ZSBoaXQgcmVjb3JkIHBhZGRpbmcgYnl0ZXMuCisgICAgICB3aGlsZSAoIVJlYWRlci0+ZW1wdHkoKSAmJiBSZWFkZXItPnBlZWsoKSA8IDB4ZjAgLyogTEZfUEFEMCAqLykgeworICAgICAgICBpZiAoYXV0byBFQyA9IE1hcHBlcigqdGhpcywgRmllbGQpKQorICAgICAgICAgIHJldHVybiBFQzsKKyAgICAgICAgSXRlbXMucHVzaF9iYWNrKEZpZWxkKTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBFcnJvciBtYXBCeXRlVmVjdG9yVGFpbChBcnJheVJlZjx1aW50OF90PiAmQnl0ZXMpOworICBFcnJvciBtYXBCeXRlVmVjdG9yVGFpbChzdGQ6OnZlY3Rvcjx1aW50OF90PiAmQnl0ZXMpOworCisgIEVycm9yIHBhZFRvQWxpZ25tZW50KHVpbnQzMl90IEFsaWduKTsKKyAgRXJyb3Igc2tpcFBhZGRpbmcoKTsKKworcHJpdmF0ZToKKyAgRXJyb3Igd3JpdGVFbmNvZGVkU2lnbmVkSW50ZWdlcihjb25zdCBpbnQ2NF90ICZWYWx1ZSk7CisgIEVycm9yIHdyaXRlRW5jb2RlZFVuc2lnbmVkSW50ZWdlcihjb25zdCB1aW50NjRfdCAmVmFsdWUpOworCisgIHN0cnVjdCBSZWNvcmRMaW1pdCB7CisgICAgdWludDMyX3QgQmVnaW5PZmZzZXQ7CisgICAgT3B0aW9uYWw8dWludDMyX3Q+IE1heExlbmd0aDsKKworICAgIE9wdGlvbmFsPHVpbnQzMl90PiBieXRlc1JlbWFpbmluZyh1aW50MzJfdCBDdXJyZW50T2Zmc2V0KSBjb25zdCB7CisgICAgICBpZiAoIU1heExlbmd0aC5oYXNWYWx1ZSgpKQorICAgICAgICByZXR1cm4gTm9uZTsKKyAgICAgIGFzc2VydChDdXJyZW50T2Zmc2V0ID49IEJlZ2luT2Zmc2V0KTsKKworICAgICAgdWludDMyX3QgQnl0ZXNVc2VkID0gQ3VycmVudE9mZnNldCAtIEJlZ2luT2Zmc2V0OworICAgICAgaWYgKEJ5dGVzVXNlZCA+PSAqTWF4TGVuZ3RoKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIHJldHVybiAqTWF4TGVuZ3RoIC0gQnl0ZXNVc2VkOworICAgIH0KKyAgfTsKKworICBTbWFsbFZlY3RvcjxSZWNvcmRMaW1pdCwgMj4gTGltaXRzOworCisgIEJpbmFyeVN0cmVhbVJlYWRlciAqUmVhZGVyID0gbnVsbHB0cjsKKyAgQmluYXJ5U3RyZWFtV3JpdGVyICpXcml0ZXIgPSBudWxscHRyOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfQ09ERVZJRVdSRUNPUkRJT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlld1JlZ2lzdGVycy5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlld1JlZ2lzdGVycy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2YwNjYwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3UmVnaXN0ZXJzLmRlZgpAQCAtMCwwICsxLDI2OCBAQAorLy89PT0tLSBDb2RlVmlld1JlZ2lzdGVycy5kZWYgLSBDb2RlVmlldyByZWdpc3RlcnMgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBTZWUgQ1ZfSFJFR19lIGluIGN2Y29uc3QuaC4gVGhpcyBzaG91bGQgbWF0Y2ggdGhlIGNvbnN0YW50cyB0aGVyZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIENWX1JFR0lTVEVSCisjZGVmaW5lIENWX1JFR0lTVEVSKG5hbWUsIHZhbHVlKQorI2VuZGlmCisKKy8vIFRoaXMgY3VycmVudGx5IG9ubHkgY29udGFpbnMgdGhlICJyZWdpc3RlciBzdWJzZXQgc2hyYWVkIGJ5IGFsbCBwcm9jZXNzb3IKKy8vIHR5cGVzIiAoRVJSIGV0Yy4pIGFuZCB0aGUgeDg2IHJlZ2lzdGVycy4KKworQ1ZfUkVHSVNURVIoRVJSLCAzMDAwMCkKK0NWX1JFR0lTVEVSKFRFQiwgMzAwMDEpCitDVl9SRUdJU1RFUihUSU1FUiwgMzAwMDIpCitDVl9SRUdJU1RFUihFRkFEMSwgMzAwMDMpCitDVl9SRUdJU1RFUihFRkFEMiwgMzAwMDQpCitDVl9SRUdJU1RFUihFRkFEMywgMzAwMDUpCitDVl9SRUdJU1RFUihWRlJBTUUsIDMwMDA2KQorQ1ZfUkVHSVNURVIoSEFORExFLCAzMDAwNykKK0NWX1JFR0lTVEVSKFBBUkFNUywgMzAwMDgpCitDVl9SRUdJU1RFUihMT0NBTFMsIDMwMDA5KQorQ1ZfUkVHSVNURVIoVElELCAzMDAxMCkKK0NWX1JFR0lTVEVSKEVOViwgMzAwMTEpCitDVl9SRUdJU1RFUihDTURMTiwgMzAwMTIpCisKK0NWX1JFR0lTVEVSKE5PTkUsIDApCitDVl9SRUdJU1RFUihBTCwgMSkKK0NWX1JFR0lTVEVSKENMLCAyKQorQ1ZfUkVHSVNURVIoREwsIDMpCitDVl9SRUdJU1RFUihCTCwgNCkKK0NWX1JFR0lTVEVSKEFILCA1KQorQ1ZfUkVHSVNURVIoQ0gsIDYpCitDVl9SRUdJU1RFUihESCwgNykKK0NWX1JFR0lTVEVSKEJILCA4KQorQ1ZfUkVHSVNURVIoQVgsIDkpCitDVl9SRUdJU1RFUihDWCwgMTApCitDVl9SRUdJU1RFUihEWCwgMTEpCitDVl9SRUdJU1RFUihCWCwgMTIpCitDVl9SRUdJU1RFUihTUCwgMTMpCitDVl9SRUdJU1RFUihCUCwgMTQpCitDVl9SRUdJU1RFUihTSSwgMTUpCitDVl9SRUdJU1RFUihESSwgMTYpCitDVl9SRUdJU1RFUihFQVgsIDE3KQorQ1ZfUkVHSVNURVIoRUNYLCAxOCkKK0NWX1JFR0lTVEVSKEVEWCwgMTkpCitDVl9SRUdJU1RFUihFQlgsIDIwKQorQ1ZfUkVHSVNURVIoRVNQLCAyMSkKK0NWX1JFR0lTVEVSKEVCUCwgMjIpCitDVl9SRUdJU1RFUihFU0ksIDIzKQorQ1ZfUkVHSVNURVIoRURJLCAyNCkKK0NWX1JFR0lTVEVSKEVTLCAyNSkKK0NWX1JFR0lTVEVSKENTLCAyNikKK0NWX1JFR0lTVEVSKFNTLCAyNykKK0NWX1JFR0lTVEVSKERTLCAyOCkKK0NWX1JFR0lTVEVSKEZTLCAyOSkKK0NWX1JFR0lTVEVSKEdTLCAzMCkKK0NWX1JFR0lTVEVSKElQLCAzMSkKK0NWX1JFR0lTVEVSKEZMQUdTLCAzMikKK0NWX1JFR0lTVEVSKEVJUCwgMzMpCitDVl9SRUdJU1RFUihFRkxBR1MsIDM0KQorQ1ZfUkVHSVNURVIoVEVNUCwgNDApCitDVl9SRUdJU1RFUihURU1QSCwgNDEpCitDVl9SRUdJU1RFUihRVU9URSwgNDIpCitDVl9SRUdJU1RFUihQQ0RSMywgNDMpCitDVl9SRUdJU1RFUihQQ0RSNCwgNDQpCitDVl9SRUdJU1RFUihQQ0RSNSwgNDUpCitDVl9SRUdJU1RFUihQQ0RSNiwgNDYpCitDVl9SRUdJU1RFUihQQ0RSNywgNDcpCitDVl9SRUdJU1RFUihDUjAsIDgwKQorQ1ZfUkVHSVNURVIoQ1IxLCA4MSkKK0NWX1JFR0lTVEVSKENSMiwgODIpCitDVl9SRUdJU1RFUihDUjMsIDgzKQorQ1ZfUkVHSVNURVIoQ1I0LCA4NCkKK0NWX1JFR0lTVEVSKERSMCwgOTApCitDVl9SRUdJU1RFUihEUjEsIDkxKQorQ1ZfUkVHSVNURVIoRFIyLCA5MikKK0NWX1JFR0lTVEVSKERSMywgOTMpCitDVl9SRUdJU1RFUihEUjQsIDk0KQorQ1ZfUkVHSVNURVIoRFI1LCA5NSkKK0NWX1JFR0lTVEVSKERSNiwgOTYpCitDVl9SRUdJU1RFUihEUjcsIDk3KQorQ1ZfUkVHSVNURVIoR0RUUiwgMTEwKQorQ1ZfUkVHSVNURVIoR0RUTCwgMTExKQorQ1ZfUkVHSVNURVIoSURUUiwgMTEyKQorQ1ZfUkVHSVNURVIoSURUTCwgMTEzKQorQ1ZfUkVHSVNURVIoTERUUiwgMTE0KQorQ1ZfUkVHSVNURVIoVFIsIDExNSkKKworQ1ZfUkVHSVNURVIoUFNFVURPMSwgMTE2KQorQ1ZfUkVHSVNURVIoUFNFVURPMiwgMTE3KQorQ1ZfUkVHSVNURVIoUFNFVURPMywgMTE4KQorQ1ZfUkVHSVNURVIoUFNFVURPNCwgMTE5KQorQ1ZfUkVHSVNURVIoUFNFVURPNSwgMTIwKQorQ1ZfUkVHSVNURVIoUFNFVURPNiwgMTIxKQorQ1ZfUkVHSVNURVIoUFNFVURPNywgMTIyKQorQ1ZfUkVHSVNURVIoUFNFVURPOCwgMTIzKQorQ1ZfUkVHSVNURVIoUFNFVURPOSwgMTI0KQorCitDVl9SRUdJU1RFUihTVDAsIDEyOCkKK0NWX1JFR0lTVEVSKFNUMSwgMTI5KQorQ1ZfUkVHSVNURVIoU1QyLCAxMzApCitDVl9SRUdJU1RFUihTVDMsIDEzMSkKK0NWX1JFR0lTVEVSKFNUNCwgMTMyKQorQ1ZfUkVHSVNURVIoU1Q1LCAxMzMpCitDVl9SRUdJU1RFUihTVDYsIDEzNCkKK0NWX1JFR0lTVEVSKFNUNywgMTM1KQorQ1ZfUkVHSVNURVIoQ1RSTCwgMTM2KQorQ1ZfUkVHSVNURVIoU1RBVCwgMTM3KQorQ1ZfUkVHSVNURVIoVEFHLCAxMzgpCitDVl9SRUdJU1RFUihGUElQLCAxMzkpCitDVl9SRUdJU1RFUihGUENTLCAxNDApCitDVl9SRUdJU1RFUihGUERPLCAxNDEpCitDVl9SRUdJU1RFUihGUERTLCAxNDIpCitDVl9SRUdJU1RFUihJU0VNLCAxNDMpCitDVl9SRUdJU1RFUihGUEVJUCwgMTQ0KQorQ1ZfUkVHSVNURVIoRlBFRE8sIDE0NSkKKworQ1ZfUkVHSVNURVIoTU0wLCAxNDYpCitDVl9SRUdJU1RFUihNTTEsIDE0NykKK0NWX1JFR0lTVEVSKE1NMiwgMTQ4KQorQ1ZfUkVHSVNURVIoTU0zLCAxNDkpCitDVl9SRUdJU1RFUihNTTQsIDE1MCkKK0NWX1JFR0lTVEVSKE1NNSwgMTUxKQorQ1ZfUkVHSVNURVIoTU02LCAxNTIpCitDVl9SRUdJU1RFUihNTTcsIDE1MykKKworQ1ZfUkVHSVNURVIoWE1NMCwgMTU0KQorQ1ZfUkVHSVNURVIoWE1NMSwgMTU1KQorQ1ZfUkVHSVNURVIoWE1NMiwgMTU2KQorQ1ZfUkVHSVNURVIoWE1NMywgMTU3KQorQ1ZfUkVHSVNURVIoWE1NNCwgMTU4KQorQ1ZfUkVHSVNURVIoWE1NNSwgMTU5KQorQ1ZfUkVHSVNURVIoWE1NNiwgMTYwKQorQ1ZfUkVHSVNURVIoWE1NNywgMTYxKQorCitDVl9SRUdJU1RFUihNWENTUiwgMjExKQorCitDVl9SRUdJU1RFUihFRFhFQVgsIDIxMikKKworQ1ZfUkVHSVNURVIoRU1NMEwsIDIyMCkKK0NWX1JFR0lTVEVSKEVNTTFMLCAyMjEpCitDVl9SRUdJU1RFUihFTU0yTCwgMjIyKQorQ1ZfUkVHSVNURVIoRU1NM0wsIDIyMykKK0NWX1JFR0lTVEVSKEVNTTRMLCAyMjQpCitDVl9SRUdJU1RFUihFTU01TCwgMjI1KQorQ1ZfUkVHSVNURVIoRU1NNkwsIDIyNikKK0NWX1JFR0lTVEVSKEVNTTdMLCAyMjcpCisKK0NWX1JFR0lTVEVSKEVNTTBILCAyMjgpCitDVl9SRUdJU1RFUihFTU0xSCwgMjI5KQorQ1ZfUkVHSVNURVIoRU1NMkgsIDIzMCkKK0NWX1JFR0lTVEVSKEVNTTNILCAyMzEpCitDVl9SRUdJU1RFUihFTU00SCwgMjMyKQorQ1ZfUkVHSVNURVIoRU1NNUgsIDIzMykKK0NWX1JFR0lTVEVSKEVNTTZILCAyMzQpCitDVl9SRUdJU1RFUihFTU03SCwgMjM1KQorCitDVl9SRUdJU1RFUihNTTAwLCAyMzYpCitDVl9SRUdJU1RFUihNTTAxLCAyMzcpCitDVl9SRUdJU1RFUihNTTEwLCAyMzgpCitDVl9SRUdJU1RFUihNTTExLCAyMzkpCitDVl9SRUdJU1RFUihNTTIwLCAyNDApCitDVl9SRUdJU1RFUihNTTIxLCAyNDEpCitDVl9SRUdJU1RFUihNTTMwLCAyNDIpCitDVl9SRUdJU1RFUihNTTMxLCAyNDMpCitDVl9SRUdJU1RFUihNTTQwLCAyNDQpCitDVl9SRUdJU1RFUihNTTQxLCAyNDUpCitDVl9SRUdJU1RFUihNTTUwLCAyNDYpCitDVl9SRUdJU1RFUihNTTUxLCAyNDcpCitDVl9SRUdJU1RFUihNTTYwLCAyNDgpCitDVl9SRUdJU1RFUihNTTYxLCAyNDkpCitDVl9SRUdJU1RFUihNTTcwLCAyNTApCitDVl9SRUdJU1RFUihNTTcxLCAyNTEpCisKK0NWX1JFR0lTVEVSKEJORDAsIDM5NikKK0NWX1JFR0lTVEVSKEJORDEsIDM5NykKK0NWX1JFR0lTVEVSKEJORDIsIDM5OCkKKworCitDVl9SRUdJU1RFUihYTU04LCAyNTIpCitDVl9SRUdJU1RFUihYTU05LCAyNTMpCitDVl9SRUdJU1RFUihYTU0xMCwgMjU0KQorQ1ZfUkVHSVNURVIoWE1NMTEsIDI1NSkKK0NWX1JFR0lTVEVSKFhNTTEyLCAyNTYpCitDVl9SRUdJU1RFUihYTU0xMywgMjU3KQorQ1ZfUkVHSVNURVIoWE1NMTQsIDI1OCkKK0NWX1JFR0lTVEVSKFhNTTE1LCAyNTkpCisKKworQ1ZfUkVHSVNURVIoU0lMLCAzMjQpCitDVl9SRUdJU1RFUihESUwsIDMyNSkKK0NWX1JFR0lTVEVSKEJQTCwgMzI2KQorQ1ZfUkVHSVNURVIoU1BMLCAzMjcpCisKK0NWX1JFR0lTVEVSKFJBWCwgMzI4KQorQ1ZfUkVHSVNURVIoUkJYLCAzMjkpCitDVl9SRUdJU1RFUihSQ1gsIDMzMCkKK0NWX1JFR0lTVEVSKFJEWCwgMzMxKQorQ1ZfUkVHSVNURVIoUlNJLCAzMzIpCitDVl9SRUdJU1RFUihSREksIDMzMykKK0NWX1JFR0lTVEVSKFJCUCwgMzM0KQorQ1ZfUkVHSVNURVIoUlNQLCAzMzUpCisKK0NWX1JFR0lTVEVSKFI4LCAzMzYpCitDVl9SRUdJU1RFUihSOSwgMzM3KQorQ1ZfUkVHSVNURVIoUjEwLCAzMzgpCitDVl9SRUdJU1RFUihSMTEsIDMzOSkKK0NWX1JFR0lTVEVSKFIxMiwgMzQwKQorQ1ZfUkVHSVNURVIoUjEzLCAzNDEpCitDVl9SRUdJU1RFUihSMTQsIDM0MikKK0NWX1JFR0lTVEVSKFIxNSwgMzQzKQorCitDVl9SRUdJU1RFUihSOEIsIDM0NCkKK0NWX1JFR0lTVEVSKFI5QiwgMzQ1KQorQ1ZfUkVHSVNURVIoUjEwQiwgMzQ2KQorQ1ZfUkVHSVNURVIoUjExQiwgMzQ3KQorQ1ZfUkVHSVNURVIoUjEyQiwgMzQ4KQorQ1ZfUkVHSVNURVIoUjEzQiwgMzQ5KQorQ1ZfUkVHSVNURVIoUjE0QiwgMzUwKQorQ1ZfUkVHSVNURVIoUjE1QiwgMzUxKQorCitDVl9SRUdJU1RFUihSOFcsIDM1MikKK0NWX1JFR0lTVEVSKFI5VywgMzUzKQorQ1ZfUkVHSVNURVIoUjEwVywgMzU0KQorQ1ZfUkVHSVNURVIoUjExVywgMzU1KQorQ1ZfUkVHSVNURVIoUjEyVywgMzU2KQorQ1ZfUkVHSVNURVIoUjEzVywgMzU3KQorQ1ZfUkVHSVNURVIoUjE0VywgMzU4KQorQ1ZfUkVHSVNURVIoUjE1VywgMzU5KQorCitDVl9SRUdJU1RFUihSOEQsIDM2MCkKK0NWX1JFR0lTVEVSKFI5RCwgMzYxKQorQ1ZfUkVHSVNURVIoUjEwRCwgMzYyKQorQ1ZfUkVHSVNURVIoUjExRCwgMzYzKQorQ1ZfUkVHSVNURVIoUjEyRCwgMzY0KQorQ1ZfUkVHSVNURVIoUjEzRCwgMzY1KQorQ1ZfUkVHSVNURVIoUjE0RCwgMzY2KQorQ1ZfUkVHSVNURVIoUjE1RCwgMzY3KQorCisKKy8vIGN2Y29uc3QuaCBkZWZpbmVzIGJvdGggQ1ZfUkVHX1lNTTAgKDI1MikgYW5kIENWX0FNRDY0X1lNTTAgKDM2OCkuIEtlZXAgdGhlCisvLyBvcmlnaW5hbCBwcmVmaXggdG8gZGlzdGluZ3Vpc2ggdGhlbS4KKworQ1ZfUkVHSVNURVIoQU1ENjRfWU1NMCwgMzY4KQorQ1ZfUkVHSVNURVIoQU1ENjRfWU1NMSwgMzY5KQorQ1ZfUkVHSVNURVIoQU1ENjRfWU1NMiwgMzcwKQorQ1ZfUkVHSVNURVIoQU1ENjRfWU1NMywgMzcxKQorQ1ZfUkVHSVNURVIoQU1ENjRfWU1NNCwgMzcyKQorQ1ZfUkVHSVNURVIoQU1ENjRfWU1NNSwgMzczKQorQ1ZfUkVHSVNURVIoQU1ENjRfWU1NNiwgMzc0KQorQ1ZfUkVHSVNURVIoQU1ENjRfWU1NNywgMzc1KQorQ1ZfUkVHSVNURVIoQU1ENjRfWU1NOCwgMzc2KQorQ1ZfUkVHSVNURVIoQU1ENjRfWU1NOSwgMzc3KQorQ1ZfUkVHSVNURVIoQU1ENjRfWU1NMTAsIDM3OCkKK0NWX1JFR0lTVEVSKEFNRDY0X1lNTTExLCAzNzkpCitDVl9SRUdJU1RFUihBTUQ2NF9ZTU0xMiwgMzgwKQorQ1ZfUkVHSVNURVIoQU1ENjRfWU1NMTMsIDM4MSkKK0NWX1JFR0lTVEVSKEFNRDY0X1lNTTE0LCAzODIpCitDVl9SRUdJU1RFUihBTUQ2NF9ZTU0xNSwgMzgzKQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdTeW1ib2xzLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3U3ltYm9scy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDFjNTM4MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3U3ltYm9scy5kZWYKQEAgLTAsMCArMSwyNjEgQEAKKy8vPT09LS0gQ29kZVZpZXdTeW1ib2xzLmRlZiAtIEFsbCBDb2RlVmlldyBsZWFmIHR5cGVzIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gU2VlIExFQUZfRU5VTV9lIGluIGN2aW5mby5oLiBUaGlzIHNob3VsZCBtYXRjaCB0aGUgY29uc3RhbnRzIHRoZXJlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgQ1ZfU1lNQk9MCisjZGVmaW5lIENWX1NZTUJPTChlbmFtZSwgdmFsdWUpCisjZW5kaWYKKworI2lmbmRlZiBTWU1CT0xfUkVDT1JECisjZGVmaW5lIFNZTUJPTF9SRUNPUkQobGZfZW5hbWUsIHZhbHVlLCBuYW1lKSBDVl9TWU1CT0wobGZfZW5hbWUsIHZhbHVlKQorI2VuZGlmCisKKyNpZm5kZWYgU1lNQk9MX1JFQ09SRF9BTElBUworI2RlZmluZSBTWU1CT0xfUkVDT1JEX0FMSUFTKGxmX2VuYW1lLCB2YWx1ZSwgbmFtZSwgYWxpYXNfbmFtZSkgICAgICAgICAgICAgICAgICAgXAorICBTWU1CT0xfUkVDT1JEKGxmX2VuYW1lLCB2YWx1ZSwgbmFtZSkKKyNlbmRpZgorCisvLyAxNiBiaXQgc3ltYm9sIHR5cGVzLiBOb3QgdmVyeSB1c2VmdWwsIHByb3ZpZGVkIG9ubHkgZm9yIHJlZmVyZW5jZS4KK0NWX1NZTUJPTChTX0NPTVBJTEUgICAgICAgLCAweDAwMDEpCitDVl9TWU1CT0woU19SRUdJU1RFUl8xNnQgICwgMHgwMDAyKQorQ1ZfU1lNQk9MKFNfQ09OU1RBTlRfMTZ0ICAsIDB4MDAwMykKK0NWX1NZTUJPTChTX1VEVF8xNnQgICAgICAgLCAweDAwMDQpCitDVl9TWU1CT0woU19TU0VBUkNIICAgICAgICwgMHgwMDA1KQorQ1ZfU1lNQk9MKFNfU0tJUCAgICAgICAgICAsIDB4MDAwNykKK0NWX1NZTUJPTChTX0NWUkVTRVJWRSAgICAgLCAweDAwMDgpCitDVl9TWU1CT0woU19PQkpOQU1FX1NUICAgICwgMHgwMDA5KQorQ1ZfU1lNQk9MKFNfRU5EQVJHICAgICAgICAsIDB4MDAwYSkKK0NWX1NZTUJPTChTX0NPQk9MVURUXzE2dCAgLCAweDAwMGIpCitDVl9TWU1CT0woU19NQU5ZUkVHXzE2dCAgICwgMHgwMDBjKQorQ1ZfU1lNQk9MKFNfUkVUVVJOICAgICAgICAsIDB4MDAwZCkKK0NWX1NZTUJPTChTX0VOVFJZVEhJUyAgICAgLCAweDAwMGUpCitDVl9TWU1CT0woU19CUFJFTDE2ICAgICAgICwgMHgwMTAwKQorQ1ZfU1lNQk9MKFNfTERBVEExNiAgICAgICAsIDB4MDEwMSkKK0NWX1NZTUJPTChTX0dEQVRBMTYgICAgICAgLCAweDAxMDIpCitDVl9TWU1CT0woU19QVUIxNiAgICAgICAgICwgMHgwMTAzKQorQ1ZfU1lNQk9MKFNfTFBST0MxNiAgICAgICAsIDB4MDEwNCkKK0NWX1NZTUJPTChTX0dQUk9DMTYgICAgICAgLCAweDAxMDUpCitDVl9TWU1CT0woU19USFVOSzE2ICAgICAgICwgMHgwMTA2KQorQ1ZfU1lNQk9MKFNfQkxPQ0sxNiAgICAgICAsIDB4MDEwNykKK0NWX1NZTUJPTChTX1dJVEgxNiAgICAgICAgLCAweDAxMDgpCitDVl9TWU1CT0woU19MQUJFTDE2ICAgICAgICwgMHgwMTA5KQorQ1ZfU1lNQk9MKFNfQ0VYTU9ERUwxNiAgICAsIDB4MDEwYSkKK0NWX1NZTUJPTChTX1ZGVEFCTEUxNiAgICAgLCAweDAxMGIpCitDVl9TWU1CT0woU19SRUdSRUwxNiAgICAgICwgMHgwMTBjKQorQ1ZfU1lNQk9MKFNfQlBSRUwzMl8xNnQgICAsIDB4MDIwMCkKK0NWX1NZTUJPTChTX0xEQVRBMzJfMTZ0ICAgLCAweDAyMDEpCitDVl9TWU1CT0woU19HREFUQTMyXzE2dCAgICwgMHgwMjAyKQorQ1ZfU1lNQk9MKFNfUFVCMzJfMTZ0ICAgICAsIDB4MDIwMykKK0NWX1NZTUJPTChTX0xQUk9DMzJfMTZ0ICAgLCAweDAyMDQpCitDVl9TWU1CT0woU19HUFJPQzMyXzE2dCAgICwgMHgwMjA1KQorQ1ZfU1lNQk9MKFNfVEhVTkszMl9TVCAgICAsIDB4MDIwNikKK0NWX1NZTUJPTChTX0JMT0NLMzJfU1QgICAgLCAweDAyMDcpCitDVl9TWU1CT0woU19XSVRIMzJfU1QgICAgICwgMHgwMjA4KQorQ1ZfU1lNQk9MKFNfTEFCRUwzMl9TVCAgICAsIDB4MDIwOSkKK0NWX1NZTUJPTChTX0NFWE1PREVMMzIgICAgLCAweDAyMGEpCitDVl9TWU1CT0woU19WRlRBQkxFMzJfMTZ0ICwgMHgwMjBiKQorQ1ZfU1lNQk9MKFNfUkVHUkVMMzJfMTZ0ICAsIDB4MDIwYykKK0NWX1NZTUJPTChTX0xUSFJFQUQzMl8xNnQgLCAweDAyMGQpCitDVl9TWU1CT0woU19HVEhSRUFEMzJfMTZ0ICwgMHgwMjBlKQorQ1ZfU1lNQk9MKFNfU0xJTkszMiAgICAgICAsIDB4MDIwZikKK0NWX1NZTUJPTChTX0xQUk9DTUlQU18xNnQgLCAweDAzMDApCitDVl9TWU1CT0woU19HUFJPQ01JUFNfMTZ0ICwgMHgwMzAxKQorQ1ZfU1lNQk9MKFNfUFJPQ1JFRl9TVCAgICAsIDB4MDQwMCkKK0NWX1NZTUJPTChTX0RBVEFSRUZfU1QgICAgLCAweDA0MDEpCitDVl9TWU1CT0woU19BTElHTiAgICAgICAgICwgMHgwNDAyKQorQ1ZfU1lNQk9MKFNfTFBST0NSRUZfU1QgICAsIDB4MDQwMykKK0NWX1NZTUJPTChTX09FTSAgICAgICAgICAgLCAweDA0MDQpCisKKy8vIEFsbCBwb3N0IDE2IGJpdCBzeW1ib2wgdHlwZXMgaGF2ZSB0aGUgMHgxMDAwIGJpdCBzZXQuCitDVl9TWU1CT0woU19USTE2X01BWCAgICAgICwgMHgxMDAwKQorCisvLyBNb3N0bHkgdW51c2VkICJzdGFydCIgc3ltYm9sIHR5cGVzLgorQ1ZfU1lNQk9MKFNfUkVHSVNURVJfU1QgICAsIDB4MTAwMSkKK0NWX1NZTUJPTChTX0NPTlNUQU5UX1NUICAgLCAweDEwMDIpCitDVl9TWU1CT0woU19VRFRfU1QgICAgICAgICwgMHgxMDAzKQorQ1ZfU1lNQk9MKFNfQ09CT0xVRFRfU1QgICAsIDB4MTAwNCkKK0NWX1NZTUJPTChTX01BTllSRUdfU1QgICAgLCAweDEwMDUpCitDVl9TWU1CT0woU19CUFJFTDMyX1NUICAgICwgMHgxMDA2KQorQ1ZfU1lNQk9MKFNfTERBVEEzMl9TVCAgICAsIDB4MTAwNykKK0NWX1NZTUJPTChTX0dEQVRBMzJfU1QgICAgLCAweDEwMDgpCitDVl9TWU1CT0woU19QVUIzMl9TVCAgICAgICwgMHgxMDA5KQorQ1ZfU1lNQk9MKFNfTFBST0MzMl9TVCAgICAsIDB4MTAwYSkKK0NWX1NZTUJPTChTX0dQUk9DMzJfU1QgICAgLCAweDEwMGIpCitDVl9TWU1CT0woU19WRlRBQkxFMzIgICAgICwgMHgxMDBjKQorQ1ZfU1lNQk9MKFNfUkVHUkVMMzJfU1QgICAsIDB4MTAwZCkKK0NWX1NZTUJPTChTX0xUSFJFQUQzMl9TVCAgLCAweDEwMGUpCitDVl9TWU1CT0woU19HVEhSRUFEMzJfU1QgICwgMHgxMDBmKQorQ1ZfU1lNQk9MKFNfTFBST0NNSVBTX1NUICAsIDB4MTAxMCkKK0NWX1NZTUJPTChTX0dQUk9DTUlQU19TVCAgLCAweDEwMTEpCisKK0NWX1NZTUJPTChTX0NPTVBJTEUyX1NUICAgLCAweDEwMTMpCitDVl9TWU1CT0woU19NQU5ZUkVHMl9TVCAgICwgMHgxMDE0KQorQ1ZfU1lNQk9MKFNfTFBST0NJQTY0X1NUICAsIDB4MTAxNSkKK0NWX1NZTUJPTChTX0dQUk9DSUE2NF9TVCAgLCAweDEwMTYpCitDVl9TWU1CT0woU19MT0NBTFNMT1RfU1QgICwgMHgxMDE3KQorQ1ZfU1lNQk9MKFNfUEFSQU1TTE9UX1NUICAsIDB4MTAxOCkKK0NWX1NZTUJPTChTX0FOTk9UQVRJT04gICAgLCAweDEwMTkpCitDVl9TWU1CT0woU19HTUFOUFJPQ19TVCAgICwgMHgxMDFhKQorQ1ZfU1lNQk9MKFNfTE1BTlBST0NfU1QgICAsIDB4MTAxYikKK0NWX1NZTUJPTChTX1JFU0VSVkVEMSAgICAgLCAweDEwMWMpCitDVl9TWU1CT0woU19SRVNFUlZFRDIgICAgICwgMHgxMDFkKQorQ1ZfU1lNQk9MKFNfUkVTRVJWRUQzICAgICAsIDB4MTAxZSkKK0NWX1NZTUJPTChTX1JFU0VSVkVENCAgICAgLCAweDEwMWYpCitDVl9TWU1CT0woU19MTUFOREFUQV9TVCAgICwgMHgxMDIwKQorQ1ZfU1lNQk9MKFNfR01BTkRBVEFfU1QgICAsIDB4MTAyMSkKK0NWX1NZTUJPTChTX01BTkZSQU1FUkVMX1NULCAweDEwMjIpCitDVl9TWU1CT0woU19NQU5SRUdJU1RFUl9TVCwgMHgxMDIzKQorQ1ZfU1lNQk9MKFNfTUFOU0xPVF9TVCAgICAsIDB4MTAyNCkKK0NWX1NZTUJPTChTX01BTk1BTllSRUdfU1QgLCAweDEwMjUpCitDVl9TWU1CT0woU19NQU5SRUdSRUxfU1QgICwgMHgxMDI2KQorQ1ZfU1lNQk9MKFNfTUFOTUFOWVJFRzJfU1QsIDB4MTAyNykKK0NWX1NZTUJPTChTX01BTlRZUFJFRiAgICAgLCAweDEwMjgpCitDVl9TWU1CT0woU19VTkFNRVNQQUNFX1NUICwgMHgxMDI5KQorCisvLyBFbmQgb2YgU18qX1NUIHN5bWJvbHMsIHdoaWNoIGRvIG5vdCBhcHBlYXIgdG8gYmUgZ2VuZXJhdGVkIGJ5IG1vZGVybgorLy8gY29tcGlsZXJzLgorQ1ZfU1lNQk9MKFNfU1RfTUFYICAgICAgICAsIDB4MTEwMCkKKworCitDVl9TWU1CT0woU19XSVRIMzIgICAgICAgICwgMHgxMTA0KQorQ1ZfU1lNQk9MKFNfTUFOWVJFRyAgICAgICAsIDB4MTEwYSkKK0NWX1NZTUJPTChTX0xQUk9DTUlQUyAgICAgLCAweDExMTQpCitDVl9TWU1CT0woU19HUFJPQ01JUFMgICAgICwgMHgxMTE1KQorQ1ZfU1lNQk9MKFNfTUFOWVJFRzIgICAgICAsIDB4MTExNykKK0NWX1NZTUJPTChTX0xQUk9DSUE2NCAgICAgLCAweDExMTgpCitDVl9TWU1CT0woU19HUFJPQ0lBNjQgICAgICwgMHgxMTE5KQorQ1ZfU1lNQk9MKFNfTE9DQUxTTE9UICAgICAsIDB4MTExYSkKK0NWX1NZTUJPTChTX1BBUkFNU0xPVCAgICAgLCAweDExMWIpCisKKy8vIE1hbmFnZWQgY29kZSBzeW1ib2xzLgorQ1ZfU1lNQk9MKFNfTUFORlJBTUVSRUwgICAsIDB4MTExZSkKK0NWX1NZTUJPTChTX01BTlJFR0lTVEVSICAgLCAweDExMWYpCitDVl9TWU1CT0woU19NQU5TTE9UICAgICAgICwgMHgxMTIwKQorQ1ZfU1lNQk9MKFNfTUFOTUFOWVJFRyAgICAsIDB4MTEyMSkKK0NWX1NZTUJPTChTX01BTlJFR1JFTCAgICAgLCAweDExMjIpCitDVl9TWU1CT0woU19NQU5NQU5ZUkVHMiAgICwgMHgxMTIzKQorQ1ZfU1lNQk9MKFNfVU5BTUVTUEFDRSAgICAsIDB4MTEyNCkKK0NWX1NZTUJPTChTX0RBVEFSRUYgICAgICAgLCAweDExMjYpCitDVl9TWU1CT0woU19BTk5PVEFUSU9OUkVGICwgMHgxMTI4KQorQ1ZfU1lNQk9MKFNfVE9LRU5SRUYgICAgICAsIDB4MTEyOSkKK0NWX1NZTUJPTChTX0dNQU5QUk9DICAgICAgLCAweDExMmEpCitDVl9TWU1CT0woU19MTUFOUFJPQyAgICAgICwgMHgxMTJiKQorQ1ZfU1lNQk9MKFNfQVRUUl9GUkFNRVJFTCAsIDB4MTEyZSkKK0NWX1NZTUJPTChTX0FUVFJfUkVHSVNURVIgLCAweDExMmYpCitDVl9TWU1CT0woU19BVFRSX1JFR1JFTCAgICwgMHgxMTMwKQorQ1ZfU1lNQk9MKFNfQVRUUl9NQU5ZUkVHICAsIDB4MTEzMSkKKworCitDVl9TWU1CT0woU19TRVBDT0RFICAgICAgICwgMHgxMTMyKQorQ1ZfU1lNQk9MKFNfTE9DQUxfMjAwNSAgICAsIDB4MTEzMykKK0NWX1NZTUJPTChTX0RFRlJBTkdFXzIwMDUgLCAweDExMzQpCitDVl9TWU1CT0woU19ERUZSQU5HRTJfMjAwNSwgMHgxMTM1KQorQ1ZfU1lNQk9MKFNfRElTQ0FSREVEICAgICAsIDB4MTEzYikKKworLy8gQ3VycmVudCBzeW1ib2wgdHlwZXMgZm9yIG1vc3QgcHJvY2VkdXJlcyBhcyBvZiB0aGlzIHdyaXRpbmcuCitDVl9TWU1CT0woU19MUFJPQ01JUFNfSUQgICAsIDB4MTE0OCkKK0NWX1NZTUJPTChTX0dQUk9DTUlQU19JRCAgICwgMHgxMTQ5KQorQ1ZfU1lNQk9MKFNfTFBST0NJQTY0X0lEICAgLCAweDExNGEpCitDVl9TWU1CT0woU19HUFJPQ0lBNjRfSUQgICAsIDB4MTE0YikKKworQ1ZfU1lNQk9MKFNfREVGUkFOR0VfSExTTCAgLCAweDExNTApCitDVl9TWU1CT0woU19HREFUQV9ITFNMICAgICAsIDB4MTE1MSkKK0NWX1NZTUJPTChTX0xEQVRBX0hMU0wgICAgICwgMHgxMTUyKQorQ1ZfU1lNQk9MKFNfTE9DQUxfRFBDX0dST1VQU0hBUkVELCAweDExNTQpCitDVl9TWU1CT0woU19ERUZSQU5HRV9EUENfUFRSX1RBRywgMHgxMTU3KQorQ1ZfU1lNQk9MKFNfRFBDX1NZTV9UQUdfTUFQLCAweDExNTgpCitDVl9TWU1CT0woU19BUk1TV0lUQ0hUQUJMRSAsIDB4MTE1OSkKK0NWX1NZTUJPTChTX1BPR09EQVRBICAgICAgICwgMHgxMTVjKQorQ1ZfU1lNQk9MKFNfSU5MSU5FU0lURTIgICAgLCAweDExNWQpCitDVl9TWU1CT0woU19NT0RfVFlQRVJFRiAgICAsIDB4MTE1ZikKK0NWX1NZTUJPTChTX1JFRl9NSU5JUERCICAgICwgMHgxMTYwKQorQ1ZfU1lNQk9MKFNfUERCTUFQICAgICAgICAgLCAweDExNjEpCitDVl9TWU1CT0woU19HREFUQV9ITFNMMzIgICAsIDB4MTE2MikKK0NWX1NZTUJPTChTX0xEQVRBX0hMU0wzMiAgICwgMHgxMTYzKQorQ1ZfU1lNQk9MKFNfR0RBVEFfSExTTDMyX0VYLCAweDExNjQpCitDVl9TWU1CT0woU19MREFUQV9ITFNMMzJfRVgsIDB4MTE2NSkKKworQ1ZfU1lNQk9MKFNfRkFTVExJTkssIDB4MTE2NykgLy8gVW5kb2N1bWVudGVkCitTWU1CT0xfUkVDT1JEX0FMSUFTKFNfSU5MSU5FRVMsIDB4MTE2OCwgSW5saW5lZXNTeW0sIENhbGxlclN5bSkgLy8gVW5kb2N1bWVudGVkCisKKy8vIEtub3duIHN5bWJvbCB0eXBlcworU1lNQk9MX1JFQ09SRChTX0VORCAgICAgICAgICAgICAgICAgICwgMHgwMDA2LCBTY29wZUVuZFN5bSkKK1NZTUJPTF9SRUNPUkRfQUxJQVMoU19JTkxJTkVTSVRFX0VORCAsIDB4MTE0ZSwgSW5saW5lU2l0ZUVuZCwgU2NvcGVFbmRTeW0pCitTWU1CT0xfUkVDT1JEX0FMSUFTKFNfUFJPQ19JRF9FTkQgICAgLCAweDExNGYsIFByb2NFbmQsIFNjb3BlRW5kU3ltKQorCitTWU1CT0xfUkVDT1JEKFNfVEhVTkszMiAgICAgICAsIDB4MTEwMiwgVGh1bmszMlN5bSkKK1NZTUJPTF9SRUNPUkQoU19UUkFNUE9MSU5FICAgICwgMHgxMTJjLCBUcmFtcG9saW5lU3ltKQorU1lNQk9MX1JFQ09SRChTX1NFQ1RJT04gICAgICAgLCAweDExMzYsIFNlY3Rpb25TeW0pCitTWU1CT0xfUkVDT1JEKFNfQ09GRkdST1VQICAgICAsIDB4MTEzNywgQ29mZkdyb3VwU3ltKQorU1lNQk9MX1JFQ09SRChTX0VYUE9SVCAgICAgICAgLCAweDExMzgsIEV4cG9ydFN5bSkKKworU1lNQk9MX1JFQ09SRChTX0xQUk9DMzIgICAgICAgLCAweDExMGYsIFByb2NTeW0pCitTWU1CT0xfUkVDT1JEX0FMSUFTKFNfR1BST0MzMiAgICAgICAsIDB4MTExMCwgR2xvYmFsUHJvY1N5bSwgUHJvY1N5bSkKK1NZTUJPTF9SRUNPUkRfQUxJQVMoU19MUFJPQzMyX0lEICAgICAsIDB4MTE0NiwgUHJvY0lkU3ltLCBQcm9jU3ltKQorU1lNQk9MX1JFQ09SRF9BTElBUyhTX0dQUk9DMzJfSUQgICAgICwgMHgxMTQ3LCBHbG9iYWxQcm9jSWRTeW0sIFByb2NTeW0pCitTWU1CT0xfUkVDT1JEX0FMSUFTKFNfTFBST0MzMl9EUEMgICAgLCAweDExNTUsIERQQ1Byb2NTeW0sIFByb2NTeW0pCitTWU1CT0xfUkVDT1JEX0FMSUFTKFNfTFBST0MzMl9EUENfSUQgLCAweDExNTYsIERQQ1Byb2NJZFN5bSwgUHJvY1N5bSkKKworU1lNQk9MX1JFQ09SRChTX1JFR0lTVEVSICAgICAgLCAweDExMDYsIFJlZ2lzdGVyU3ltKQorU1lNQk9MX1JFQ09SRChTX1BVQjMyICAgICAgICAgLCAweDExMGUsIFB1YmxpY1N5bTMyKQorCitTWU1CT0xfUkVDT1JEKFNfUFJPQ1JFRiAgICAgICAsIDB4MTEyNSwgUHJvY1JlZlN5bSkKK1NZTUJPTF9SRUNPUkRfQUxJQVMoU19MUFJPQ1JFRiwgMHgxMTI3LCBMb2NhbFByb2NSZWYsIFByb2NSZWZTeW0pCisKKworU1lNQk9MX1JFQ09SRChTX0VOVkJMT0NLICAgICAgLCAweDExM2QsIEVudkJsb2NrU3ltKQorCitTWU1CT0xfUkVDT1JEKFNfSU5MSU5FU0lURSAgICAgLCAweDExNGQsIElubGluZVNpdGVTeW0pCitTWU1CT0xfUkVDT1JEKFNfTE9DQUwgICAgICAgICAsIDB4MTEzZSwgTG9jYWxTeW0pCitTWU1CT0xfUkVDT1JEKFNfREVGUkFOR0UgICAgICAsIDB4MTEzZiwgRGVmUmFuZ2VTeW0pCitTWU1CT0xfUkVDT1JEKFNfREVGUkFOR0VfU1VCRklFTEQsIDB4MTE0MCwgRGVmUmFuZ2VTdWJmaWVsZFN5bSkKK1NZTUJPTF9SRUNPUkQoU19ERUZSQU5HRV9SRUdJU1RFUiwgMHgxMTQxLCBEZWZSYW5nZVJlZ2lzdGVyU3ltKQorU1lNQk9MX1JFQ09SRChTX0RFRlJBTkdFX0ZSQU1FUE9JTlRFUl9SRUwsIDB4MTE0MiwgRGVmUmFuZ2VGcmFtZVBvaW50ZXJSZWxTeW0pCitTWU1CT0xfUkVDT1JEKFNfREVGUkFOR0VfU1VCRklFTERfUkVHSVNURVIsIDB4MTE0MywgRGVmUmFuZ2VTdWJmaWVsZFJlZ2lzdGVyU3ltKQorU1lNQk9MX1JFQ09SRChTX0RFRlJBTkdFX0ZSQU1FUE9JTlRFUl9SRUxfRlVMTF9TQ09QRSwgMHgxMTQ0LCBEZWZSYW5nZUZyYW1lUG9pbnRlclJlbEZ1bGxTY29wZVN5bSkKK1NZTUJPTF9SRUNPUkQoU19ERUZSQU5HRV9SRUdJU1RFUl9SRUwsIDB4MTE0NSwgRGVmUmFuZ2VSZWdpc3RlclJlbFN5bSkKK1NZTUJPTF9SRUNPUkQoU19CTE9DSzMyICAgICAgICwgMHgxMTAzLCBCbG9ja1N5bSkKK1NZTUJPTF9SRUNPUkQoU19MQUJFTDMyICAgICAgICwgMHgxMTA1LCBMYWJlbFN5bSkKK1NZTUJPTF9SRUNPUkQoU19PQkpOQU1FICAgICAgICwgMHgxMTAxLCBPYmpOYW1lU3ltKQorU1lNQk9MX1JFQ09SRChTX0NPTVBJTEUyICAgICAgLCAweDExMTYsIENvbXBpbGUyU3ltKQorU1lNQk9MX1JFQ09SRChTX0NPTVBJTEUzICAgICAgLCAweDExM2MsIENvbXBpbGUzU3ltKQorU1lNQk9MX1JFQ09SRChTX0ZSQU1FUFJPQyAgICAgLCAweDEwMTIsIEZyYW1lUHJvY1N5bSkKK1NZTUJPTF9SRUNPUkQoU19DQUxMU0lURUlORk8gICwgMHgxMTM5LCBDYWxsU2l0ZUluZm9TeW0pCitTWU1CT0xfUkVDT1JEKFNfRklMRVNUQVRJQyAgICAgLCAweDExNTMsIEZpbGVTdGF0aWNTeW0pCitTWU1CT0xfUkVDT1JEKFNfSEVBUEFMTE9DU0lURSAgLCAweDExNWUsIEhlYXBBbGxvY2F0aW9uU2l0ZVN5bSkKK1NZTUJPTF9SRUNPUkQoU19GUkFNRUNPT0tJRSAgICwgMHgxMTNhLCBGcmFtZUNvb2tpZVN5bSkKKworU1lNQk9MX1JFQ09SRChTX0NBTExFRVMgICAgICAgICwgMHgxMTVhLCBDYWxsZXJTeW0pCitTWU1CT0xfUkVDT1JEX0FMSUFTKFNfQ0FMTEVSUywgMHgxMTViLCBDYWxsZWVTeW0sIENhbGxlclN5bSkKKworU1lNQk9MX1JFQ09SRChTX1VEVCAgICAgICAgICAgLCAweDExMDgsIFVEVFN5bSkKK1NZTUJPTF9SRUNPUkRfQUxJQVMoU19DT0JPTFVEVCAgICAgICwgMHgxMTA5LCBDb2JvbFVEVCwgVURUU3ltKQorCitTWU1CT0xfUkVDT1JEKFNfQlVJTERJTkZPICAgICAgLCAweDExNGMsIEJ1aWxkSW5mb1N5bSkKK1NZTUJPTF9SRUNPUkQoU19CUFJFTDMyICAgICAgICwgMHgxMTBiLCBCUFJlbGF0aXZlU3ltKQorU1lNQk9MX1JFQ09SRChTX1JFR1JFTDMyICAgICAgLCAweDExMTEsIFJlZ1JlbGF0aXZlU3ltKQorCitTWU1CT0xfUkVDT1JEKFNfQ09OU1RBTlQgICAgICAsIDB4MTEwNywgQ29uc3RhbnRTeW0pCitTWU1CT0xfUkVDT1JEX0FMSUFTKFNfTUFOQ09OU1RBTlQgICAsIDB4MTEyZCwgTWFuYWdlZENvbnN0YW50LCBDb25zdGFudFN5bSkKKworU1lNQk9MX1JFQ09SRChTX0xEQVRBMzIgICAgICAgLCAweDExMGMsIERhdGFTeW0pCitTWU1CT0xfUkVDT1JEX0FMSUFTKFNfR0RBVEEzMiAgICAgICAsIDB4MTEwZCwgR2xvYmFsRGF0YSwgRGF0YVN5bSkKK1NZTUJPTF9SRUNPUkRfQUxJQVMoU19MTUFOREFUQSAgICAgICwgMHgxMTFjLCBNYW5hZ2VkTG9jYWxEYXRhLCBEYXRhU3ltKQorU1lNQk9MX1JFQ09SRF9BTElBUyhTX0dNQU5EQVRBICAgICAgLCAweDExMWQsIE1hbmFnZWRHbG9iYWxEYXRhLCBEYXRhU3ltKQorCitTWU1CT0xfUkVDT1JEKFNfTFRIUkVBRDMyICAgICAsIDB4MTExMiwgVGhyZWFkTG9jYWxEYXRhU3ltKQorU1lNQk9MX1JFQ09SRF9BTElBUyhTX0dUSFJFQUQzMiAgICAgLCAweDExMTMsIEdsb2JhbFRMUywgVGhyZWFkTG9jYWxEYXRhU3ltKQorCisKKyN1bmRlZiBDVl9TWU1CT0wKKyN1bmRlZiBTWU1CT0xfUkVDT1JECisjdW5kZWYgU1lNQk9MX1JFQ09SRF9BTElBUwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdUeXBlcy5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlld1R5cGVzLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OWNlOTYwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdUeXBlcy5kZWYKQEAgLTAsMCArMSwyNTAgQEAKKy8vPT09LS0gQ29kZVZpZXdUeXBlcy5kZWYgLSBBbGwgQ29kZVZpZXcgbGVhZiB0eXBlcyAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gU2VlIExFQUZfRU5VTV9lIGluIGN2aW5mby5oLiBUaGlzIHNob3VsZCBtYXRjaCB0aGUgY29uc3RhbnRzIHRoZXJlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIElmIHRoZSB0eXBlIGlzIGtub3duLCB0aGVuIHdlIGhhdmUgYSByZWNvcmQgZGVzY3JpYmluZyBpdCBpbiBUeXBlUmVjb3JkLmguCisKKyNpZm5kZWYgQ1ZfVFlQRQorI2RlZmluZSBDVl9UWVBFKGxmX2VuYW1lLCB2YWx1ZSkKKyNlbmRpZgorCisvLyBJZiB0aGUgdHlwZSBpcyBrbm93biwgdGhlbiB3ZSBoYXZlIGEgcmVjb3JkIGRlc2NyaWJpbmcgaXQgaW4gVHlwZVJlY29yZC5oLgorI2lmbmRlZiBUWVBFX1JFQ09SRAorI2RlZmluZSBUWVBFX1JFQ09SRChsZl9lbmFtZSwgdmFsdWUsIG5hbWUpIENWX1RZUEUobGZfZW5hbWUsIHZhbHVlKQorI2VuZGlmCisKKyNpZm5kZWYgVFlQRV9SRUNPUkRfQUxJQVMKKyNkZWZpbmUgVFlQRV9SRUNPUkRfQUxJQVMobGZfZW5hbWUsIHZhbHVlLCBuYW1lLCBhbGlhc19uYW1lKSAgICAgICAgICAgICAgICAgICBcCisgIFRZUEVfUkVDT1JEKGxmX2VuYW1lLCB2YWx1ZSwgbmFtZSkKKyNlbmRpZgorCisjaWZuZGVmIE1FTUJFUl9SRUNPUkQKKyNkZWZpbmUgTUVNQkVSX1JFQ09SRChsZl9lbmFtZSwgdmFsdWUsIG5hbWUpIFRZUEVfUkVDT1JEKGxmX2VuYW1lLCB2YWx1ZSwgbmFtZSkKKyNlbmRpZgorCisjaWZuZGVmIE1FTUJFUl9SRUNPUkRfQUxJQVMKKyNkZWZpbmUgTUVNQkVSX1JFQ09SRF9BTElBUyhsZl9lbmFtZSwgdmFsdWUsIG5hbWUsIGFsaWFzX25hbWUpICAgICAgICAgICAgICAgICBcCisgIE1FTUJFUl9SRUNPUkQobGZfZW5hbWUsIHZhbHVlLCBuYW1lKQorI2VuZGlmCisKK1RZUEVfUkVDT1JEKExGX1BPSU5URVIsIDB4MTAwMiwgUG9pbnRlcikKK1RZUEVfUkVDT1JEKExGX01PRElGSUVSLCAweDEwMDEsIE1vZGlmaWVyKQorVFlQRV9SRUNPUkQoTEZfUFJPQ0VEVVJFLCAweDEwMDgsIFByb2NlZHVyZSkKK1RZUEVfUkVDT1JEKExGX01GVU5DVElPTiwgMHgxMDA5LCBNZW1iZXJGdW5jdGlvbikKK1RZUEVfUkVDT1JEKExGX0xBQkVMLCAweDAwMGUsIExhYmVsKQorVFlQRV9SRUNPUkQoTEZfQVJHTElTVCwgMHgxMjAxLCBBcmdMaXN0KQorCitUWVBFX1JFQ09SRChMRl9GSUVMRExJU1QsIDB4MTIwMywgRmllbGRMaXN0KQorCitUWVBFX1JFQ09SRChMRl9BUlJBWSwgMHgxNTAzLCBBcnJheSkKK1RZUEVfUkVDT1JEKExGX0NMQVNTLCAweDE1MDQsIENsYXNzKQorVFlQRV9SRUNPUkRfQUxJQVMoTEZfU1RSVUNUVVJFLCAweDE1MDUsIFN0cnVjdCwgQ2xhc3MpCitUWVBFX1JFQ09SRF9BTElBUyhMRl9JTlRFUkZBQ0UsIDB4MTUxOSwgSW50ZXJmYWNlLCBDbGFzcykKK1RZUEVfUkVDT1JEKExGX1VOSU9OLCAweDE1MDYsIFVuaW9uKQorVFlQRV9SRUNPUkQoTEZfRU5VTSwgMHgxNTA3LCBFbnVtKQorVFlQRV9SRUNPUkQoTEZfVFlQRVNFUlZFUjIsIDB4MTUxNSwgVHlwZVNlcnZlcjIpCitUWVBFX1JFQ09SRChMRl9WRlRBQkxFLCAweDE1MWQsIFZGVGFibGUpCitUWVBFX1JFQ09SRChMRl9WVFNIQVBFLCAweDAwMGEsIFZGVGFibGVTaGFwZSkKKworVFlQRV9SRUNPUkQoTEZfQklURklFTEQsIDB4MTIwNSwgQml0RmllbGQpCisKKy8vIE1lbWJlciB0eXBlIHJlY29yZHMuIFRoZXNlIGFyZSBnZW5lcmFsbHkgbm90IGxlbmd0aCBwcmVmaXhlZCwgYW5kIGFwcGVhcgorLy8gaW5zaWRlIG9mIGEgZmllbGQgbGlzdCByZWNvcmQuCitNRU1CRVJfUkVDT1JEKExGX0JDTEFTUywgMHgxNDAwLCBCYXNlQ2xhc3MpCitNRU1CRVJfUkVDT1JEX0FMSUFTKExGX0JJTlRFUkZBQ0UsIDB4MTUxYSwgQmFzZUludGVyZmFjZSwgQmFzZUNsYXNzKQorCitNRU1CRVJfUkVDT1JEKExGX1ZCQ0xBU1MsIDB4MTQwMSwgVmlydHVhbEJhc2VDbGFzcykKK01FTUJFUl9SRUNPUkRfQUxJQVMoTEZfSVZCQ0xBU1MsIDB4MTQwMiwgSW5kaXJlY3RWaXJ0dWFsQmFzZUNsYXNzLAorICAgICAgICAgICAgICAgICAgICBWaXJ0dWFsQmFzZUNsYXNzKQorCitNRU1CRVJfUkVDT1JEKExGX1ZGVU5DVEFCLCAweDE0MDksIFZGUHRyKQorTUVNQkVSX1JFQ09SRChMRl9TVE1FTUJFUiwgMHgxNTBlLCBTdGF0aWNEYXRhTWVtYmVyKQorTUVNQkVSX1JFQ09SRChMRl9NRVRIT0QsIDB4MTUwZiwgT3ZlcmxvYWRlZE1ldGhvZCkKK01FTUJFUl9SRUNPUkQoTEZfTUVNQkVSLCAweDE1MGQsIERhdGFNZW1iZXIpCitNRU1CRVJfUkVDT1JEKExGX05FU1RUWVBFLCAweDE1MTAsIE5lc3RlZFR5cGUpCitNRU1CRVJfUkVDT1JEKExGX09ORU1FVEhPRCwgMHgxNTExLCBPbmVNZXRob2QpCitNRU1CRVJfUkVDT1JEKExGX0VOVU1FUkFURSwgMHgxNTAyLCBFbnVtZXJhdG9yKQorTUVNQkVSX1JFQ09SRChMRl9JTkRFWCwgMHgxNDA0LCBMaXN0Q29udGludWF0aW9uKQorCisvLyBJRCBsZWFmIHJlY29yZHMuIFN1YnNlcXVlbnQgbGVhZiB0eXBlcyBtYXkgYmUgcmVmZXJlbmNlZCBmcm9tIC5kZWJ1ZyRTLgorVFlQRV9SRUNPUkQoTEZfRlVOQ19JRCwgMHgxNjAxLCBGdW5jSWQpCitUWVBFX1JFQ09SRChMRl9NRlVOQ19JRCwgMHgxNjAyLCBNZW1iZXJGdW5jSWQpCitUWVBFX1JFQ09SRChMRl9CVUlMRElORk8sIDB4MTYwMywgQnVpbGRJbmZvKQorVFlQRV9SRUNPUkQoTEZfU1VCU1RSX0xJU1QsIDB4MTYwNCwgU3RyaW5nTGlzdCkKK1RZUEVfUkVDT1JEKExGX1NUUklOR19JRCwgMHgxNjA1LCBTdHJpbmdJZCkKK1RZUEVfUkVDT1JEKExGX1VEVF9TUkNfTElORSwgMHgxNjA2LCBVZHRTb3VyY2VMaW5lKQorVFlQRV9SRUNPUkQoTEZfVURUX01PRF9TUkNfTElORSwgMHgxNjA3LCBVZHRNb2RTb3VyY2VMaW5lKQorCisKK1RZUEVfUkVDT1JEKExGX01FVEhPRExJU1QsIDB4MTIwNiwgTWV0aG9kT3ZlcmxvYWRMaXN0KQorCisKKy8vIDE2IGJpdCB0eXBlIHJlY29yZHMuCitDVl9UWVBFKExGX01PRElGSUVSXzE2dCwgMHgwMDAxKQorQ1ZfVFlQRShMRl9QT0lOVEVSXzE2dCwgMHgwMDAyKQorQ1ZfVFlQRShMRl9BUlJBWV8xNnQsIDB4MDAwMykKK0NWX1RZUEUoTEZfQ0xBU1NfMTZ0LCAweDAwMDQpCitDVl9UWVBFKExGX1NUUlVDVFVSRV8xNnQsIDB4MDAwNSkKK0NWX1RZUEUoTEZfVU5JT05fMTZ0LCAweDAwMDYpCitDVl9UWVBFKExGX0VOVU1fMTZ0LCAweDAwMDcpCitDVl9UWVBFKExGX1BST0NFRFVSRV8xNnQsIDB4MDAwOCkKK0NWX1RZUEUoTEZfTUZVTkNUSU9OXzE2dCwgMHgwMDA5KQorQ1ZfVFlQRShMRl9DT0JPTDBfMTZ0LCAweDAwMGIpCitDVl9UWVBFKExGX0NPQk9MMSwgMHgwMDBjKQorQ1ZfVFlQRShMRl9CQVJSQVlfMTZ0LCAweDAwMGQpCitDVl9UWVBFKExGX05VTExMRUFGLCAweDAwMGYpIC8vIExGX05VTEwKK0NWX1RZUEUoTEZfTk9UVFJBTiwgMHgwMDEwKQorQ1ZfVFlQRShMRl9ESU1BUlJBWV8xNnQsIDB4MDAxMSkKK0NWX1RZUEUoTEZfVkZUUEFUSF8xNnQsIDB4MDAxMikKK0NWX1RZUEUoTEZfUFJFQ09NUF8xNnQsIDB4MDAxMykKK0NWX1RZUEUoTEZfRU5EUFJFQ09NUCwgMHgwMDE0KQorQ1ZfVFlQRShMRl9PRU1fMTZ0LCAweDAwMTUpCitDVl9UWVBFKExGX1RZUEVTRVJWRVJfU1QsIDB4MDAxNikKKworQ1ZfVFlQRShMRl9TS0lQXzE2dCwgMHgwMjAwKQorQ1ZfVFlQRShMRl9BUkdMSVNUXzE2dCwgMHgwMjAxKQorQ1ZfVFlQRShMRl9ERUZBUkdfMTZ0LCAweDAyMDIpCitDVl9UWVBFKExGX0xJU1QsIDB4MDIwMykKK0NWX1RZUEUoTEZfRklFTERMSVNUXzE2dCwgMHgwMjA0KQorQ1ZfVFlQRShMRl9ERVJJVkVEXzE2dCwgMHgwMjA1KQorQ1ZfVFlQRShMRl9CSVRGSUVMRF8xNnQsIDB4MDIwNikKK0NWX1RZUEUoTEZfTUVUSE9ETElTVF8xNnQsIDB4MDIwNykKK0NWX1RZUEUoTEZfRElNQ09OVV8xNnQsIDB4MDIwOCkKK0NWX1RZUEUoTEZfRElNQ09OTFVfMTZ0LCAweDAyMDkpCitDVl9UWVBFKExGX0RJTVZBUlVfMTZ0LCAweDAyMGEpCitDVl9UWVBFKExGX0RJTVZBUkxVXzE2dCwgMHgwMjBiKQorQ1ZfVFlQRShMRl9SRUZTWU0sIDB4MDIwYykKKworLy8gMTYgYml0IG1lbWJlciB0eXBlcy4gR2VuZXJhbGx5IG5vdCBsZW5ndGggcHJlZml4ZWQuCitDVl9UWVBFKExGX0JDTEFTU18xNnQsIDB4MDQwMCkKK0NWX1RZUEUoTEZfVkJDTEFTU18xNnQsIDB4MDQwMSkKK0NWX1RZUEUoTEZfSVZCQ0xBU1NfMTZ0LCAweDA0MDIpCitDVl9UWVBFKExGX0VOVU1FUkFURV9TVCwgMHgwNDAzKQorQ1ZfVFlQRShMRl9GUklFTkRGQ05fMTZ0LCAweDA0MDQpCitDVl9UWVBFKExGX0lOREVYXzE2dCwgMHgwNDA1KQorQ1ZfVFlQRShMRl9NRU1CRVJfMTZ0LCAweDA0MDYpCitDVl9UWVBFKExGX1NUTUVNQkVSXzE2dCwgMHgwNDA3KQorQ1ZfVFlQRShMRl9NRVRIT0RfMTZ0LCAweDA0MDgpCitDVl9UWVBFKExGX05FU1RUWVBFXzE2dCwgMHgwNDA5KQorQ1ZfVFlQRShMRl9WRlVOQ1RBQl8xNnQsIDB4MDQwYSkKK0NWX1RZUEUoTEZfRlJJRU5EQ0xTXzE2dCwgMHgwNDBiKQorQ1ZfVFlQRShMRl9PTkVNRVRIT0RfMTZ0LCAweDA0MGMpCitDVl9UWVBFKExGX1ZGVU5DT0ZGXzE2dCwgMHgwNDBkKQorCitDVl9UWVBFKExGX1RJMTZfTUFYLCAweDEwMDApCisKK0NWX1RZUEUoTEZfQVJSQVlfU1QsIDB4MTAwMykKK0NWX1RZUEUoTEZfQ0xBU1NfU1QsIDB4MTAwNCkKK0NWX1RZUEUoTEZfU1RSVUNUVVJFX1NULCAweDEwMDUpCitDVl9UWVBFKExGX1VOSU9OX1NULCAweDEwMDYpCitDVl9UWVBFKExGX0VOVU1fU1QsIDB4MTAwNykKK0NWX1RZUEUoTEZfQ09CT0wwLCAweDEwMGEpCitDVl9UWVBFKExGX0JBUlJBWSwgMHgxMDBiKQorQ1ZfVFlQRShMRl9ESU1BUlJBWV9TVCwgMHgxMDBjKQorQ1ZfVFlQRShMRl9WRlRQQVRILCAweDEwMGQpCitDVl9UWVBFKExGX1BSRUNPTVBfU1QsIDB4MTAwZSkKK0NWX1RZUEUoTEZfT0VNLCAweDEwMGYpCitDVl9UWVBFKExGX0FMSUFTX1NULCAweDEwMTApCitDVl9UWVBFKExGX09FTTIsIDB4MTAxMSkKKworQ1ZfVFlQRShMRl9TS0lQLCAweDEyMDApCitDVl9UWVBFKExGX0RFRkFSR19TVCwgMHgxMjAyKQorQ1ZfVFlQRShMRl9ERVJJVkVELCAweDEyMDQpCitDVl9UWVBFKExGX0RJTUNPTlUsIDB4MTIwNykKK0NWX1RZUEUoTEZfRElNQ09OTFUsIDB4MTIwOCkKK0NWX1RZUEUoTEZfRElNVkFSVSwgMHgxMjA5KQorQ1ZfVFlQRShMRl9ESU1WQVJMVSwgMHgxMjBhKQorCisvLyBNZW1iZXIgdHlwZSByZWNvcmRzLiBUaGVzZSBhcmUgZ2VuZXJhbGx5IG5vdCBsZW5ndGggcHJlZml4ZWQsIGFuZCBhcHBlYXIKKy8vIGluc2lkZSBvZiBhIGZpZWxkIGxpc3QgcmVjb3JkLgorQ1ZfVFlQRShMRl9GUklFTkRGQ05fU1QsIDB4MTQwMykKK0NWX1RZUEUoTEZfTUVNQkVSX1NULCAweDE0MDUpCitDVl9UWVBFKExGX1NUTUVNQkVSX1NULCAweDE0MDYpCitDVl9UWVBFKExGX01FVEhPRF9TVCwgMHgxNDA3KQorQ1ZfVFlQRShMRl9ORVNUVFlQRV9TVCwgMHgxNDA4KQorQ1ZfVFlQRShMRl9GUklFTkRDTFMsIDB4MTQwYSkKK0NWX1RZUEUoTEZfT05FTUVUSE9EX1NULCAweDE0MGIpCitDVl9UWVBFKExGX1ZGVU5DT0ZGLCAweDE0MGMpCitDVl9UWVBFKExGX05FU1RUWVBFRVhfU1QsIDB4MTQwZCkKK0NWX1RZUEUoTEZfTUVNQkVSTU9ESUZZX1NULCAweDE0MGUpCitDVl9UWVBFKExGX01BTkFHRURfU1QsIDB4MTQwZikKKworQ1ZfVFlQRShMRl9TVF9NQVgsIDB4MTUwMCkKK0NWX1RZUEUoTEZfVFlQRVNFUlZFUiwgMHgxNTAxKQorQ1ZfVFlQRShMRl9ESU1BUlJBWSwgMHgxNTA4KQorQ1ZfVFlQRShMRl9QUkVDT01QLCAweDE1MDkpCitDVl9UWVBFKExGX0FMSUFTLCAweDE1MGEpCitDVl9UWVBFKExGX0RFRkFSRywgMHgxNTBiKQorQ1ZfVFlQRShMRl9GUklFTkRGQ04sIDB4MTUwYykKK0NWX1RZUEUoTEZfTkVTVFRZUEVFWCwgMHgxNTEyKQorQ1ZfVFlQRShMRl9NRU1CRVJNT0RJRlksIDB4MTUxMykKK0NWX1RZUEUoTEZfTUFOQUdFRCwgMHgxNTE0KQorQ1ZfVFlQRShMRl9TVFJJREVEX0FSUkFZLCAweDE1MTYpCitDVl9UWVBFKExGX0hMU0wsIDB4MTUxNykKK0NWX1RZUEUoTEZfTU9ESUZJRVJfRVgsIDB4MTUxOCkKK0NWX1RZUEUoTEZfVkVDVE9SLCAweDE1MWIpCitDVl9UWVBFKExGX01BVFJJWCwgMHgxNTFjKQorCisvLyBJRCBsZWFmIHJlY29yZHMuIFN1YnNlcXVlbnQgbGVhZiB0eXBlcyBtYXkgYmUgcmVmZXJlbmNlZCBmcm9tIC5kZWJ1ZyRTLgorCisvLyBOdW1lcmljIGxlYWYgdHlwZXMuIFRoZXNlIGFyZSBnZW5lcmFsbHkgY29udGFpbmVkIGluIG90aGVyIHJlY29yZHMsIGFuZCBub3QKKy8vIGVuY291bnRlcmVkIGluIHRoZSBtYWluIHR5cGUgc3RyZWFtLgorCitDVl9UWVBFKExGX05VTUVSSUMsIDB4ODAwMCkKK0NWX1RZUEUoTEZfQ0hBUiwgMHg4MDAwKQorQ1ZfVFlQRShMRl9TSE9SVCwgMHg4MDAxKQorQ1ZfVFlQRShMRl9VU0hPUlQsIDB4ODAwMikKK0NWX1RZUEUoTEZfTE9ORywgMHg4MDAzKQorQ1ZfVFlQRShMRl9VTE9ORywgMHg4MDA0KQorQ1ZfVFlQRShMRl9SRUFMMzIsIDB4ODAwNSkKK0NWX1RZUEUoTEZfUkVBTDY0LCAweDgwMDYpCitDVl9UWVBFKExGX1JFQUw4MCwgMHg4MDA3KQorQ1ZfVFlQRShMRl9SRUFMMTI4LCAweDgwMDgpCitDVl9UWVBFKExGX1FVQURXT1JELCAweDgwMDkpCitDVl9UWVBFKExGX1VRVUFEV09SRCwgMHg4MDBhKQorQ1ZfVFlQRShMRl9SRUFMNDgsIDB4ODAwYikKK0NWX1RZUEUoTEZfQ09NUExFWDMyLCAweDgwMGMpCitDVl9UWVBFKExGX0NPTVBMRVg2NCwgMHg4MDBkKQorQ1ZfVFlQRShMRl9DT01QTEVYODAsIDB4ODAwZSkKK0NWX1RZUEUoTEZfQ09NUExFWDEyOCwgMHg4MDBmKQorQ1ZfVFlQRShMRl9WQVJTVFJJTkcsIDB4ODAxMCkKK0NWX1RZUEUoTEZfT0NUV09SRCwgMHg4MDE3KQorQ1ZfVFlQRShMRl9VT0NUV09SRCwgMHg4MDE4KQorQ1ZfVFlQRShMRl9ERUNJTUFMLCAweDgwMTkpCitDVl9UWVBFKExGX0RBVEUsIDB4ODAxYSkKK0NWX1RZUEUoTEZfVVRGOFNUUklORywgMHg4MDFiKQorQ1ZfVFlQRShMRl9SRUFMMTYsIDB4ODAxYykKKworLy8gUGFkZGluZyBieXRlcy4gVGhlc2UgYXJlIGVtaXR0ZWQgaW50byBhbGlnbm1lbnQgYnl0ZXMgaW4gdGhlIHR5cGUgc3RyZWFtLgorCitDVl9UWVBFKExGX1BBRDAsIDB4ZjApCitDVl9UWVBFKExGX1BBRDEsIDB4ZjEpCitDVl9UWVBFKExGX1BBRDIsIDB4ZjIpCitDVl9UWVBFKExGX1BBRDMsIDB4ZjMpCitDVl9UWVBFKExGX1BBRDQsIDB4ZjQpCitDVl9UWVBFKExGX1BBRDUsIDB4ZjUpCitDVl9UWVBFKExGX1BBRDYsIDB4ZjYpCitDVl9UWVBFKExGX1BBRDcsIDB4ZjcpCitDVl9UWVBFKExGX1BBRDgsIDB4ZjgpCitDVl9UWVBFKExGX1BBRDksIDB4ZjkpCitDVl9UWVBFKExGX1BBRDEwLCAweGZhKQorQ1ZfVFlQRShMRl9QQUQxMSwgMHhmYikKK0NWX1RZUEUoTEZfUEFEMTIsIDB4ZmMpCitDVl9UWVBFKExGX1BBRDEzLCAweGZkKQorQ1ZfVFlQRShMRl9QQUQxNCwgMHhmZSkKK0NWX1RZUEUoTEZfUEFEMTUsIDB4ZmYpCisKKyN1bmRlZiBDVl9UWVBFCisjdW5kZWYgVFlQRV9SRUNPUkQKKyN1bmRlZiBUWVBFX1JFQ09SRF9BTElBUworI3VuZGVmIE1FTUJFUl9SRUNPUkQKKyN1bmRlZiBNRU1CRVJfUkVDT1JEX0FMSUFTCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db250aW51YXRpb25SZWNvcmRCdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db250aW51YXRpb25SZWNvcmRCdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y4NTFhMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvbnRpbnVhdGlvblJlY29yZEJ1aWxkZXIuaApAQCAtMCwwICsxLDY1IEBACisvLz09PS0gQ29udGludWF0aW9uUmVjb3JkQnVpbGRlci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0NPTlRJTlVBVElPTlJFQ09SREJVSUxERVJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19DT05USU5VQVRJT05SRUNPUkRCVUlMREVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvUmVjb3JkU2VyaWFsaXphdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVJbmRleC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlUmVjb3JkTWFwcGluZy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVWaXNpdG9yQ2FsbGJhY2tzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlCeXRlU3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVdyaXRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworZW51bSBjbGFzcyBDb250aW51YXRpb25SZWNvcmRLaW5kIHsgRmllbGRMaXN0LCBNZXRob2RPdmVybG9hZExpc3QgfTsKKworY2xhc3MgQ29udGludWF0aW9uUmVjb3JkQnVpbGRlciB7CisgIFNtYWxsVmVjdG9yPHVpbnQzMl90LCA0PiBTZWdtZW50T2Zmc2V0czsKKyAgT3B0aW9uYWw8Q29udGludWF0aW9uUmVjb3JkS2luZD4gS2luZDsKKyAgQXBwZW5kaW5nQmluYXJ5Qnl0ZVN0cmVhbSBCdWZmZXI7CisgIEJpbmFyeVN0cmVhbVdyaXRlciBTZWdtZW50V3JpdGVyOworICBUeXBlUmVjb3JkTWFwcGluZyBNYXBwaW5nOworICBBcnJheVJlZjx1aW50OF90PiBJbmplY3RlZFNlZ21lbnRCeXRlczsKKworICB1aW50MzJfdCBnZXRDdXJyZW50U2VnbWVudExlbmd0aCgpIGNvbnN0OworCisgIHZvaWQgaW5zZXJ0U2VnbWVudEVuZCh1aW50MzJfdCBPZmZzZXQpOworICBDVlR5cGUgY3JlYXRlU2VnbWVudFJlY29yZCh1aW50MzJfdCBPZmZCZWdpbiwgdWludDMyX3QgT2ZmRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxUeXBlSW5kZXg+IFJlZmVyc1RvKTsKKworcHVibGljOgorICBDb250aW51YXRpb25SZWNvcmRCdWlsZGVyKCk7CisgIH5Db250aW51YXRpb25SZWNvcmRCdWlsZGVyKCk7CisKKyAgdm9pZCBiZWdpbihDb250aW51YXRpb25SZWNvcmRLaW5kIFJlY29yZEtpbmQpOworCisgIC8vIFRoaXMgdGVtcGxhdGUgaXMgZXhwbGljaXRseSBpbnN0YW50aWF0ZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIGZpbGUgZm9yIGFsbAorICAvLyBzdXBwb3J0ZWQgdHlwZXMuICBUaGUgbWV0aG9kIGl0c2VsZiBpcyB1Z2x5LCBzbyBpbmxpbmluZyBpdCBpbnRvIHRoZSBoZWFkZXIKKyAgLy8gZmlsZSBjbHV0dGVycyBhbiBvdGhlcndpc2Ugc3RyYWlnaHRmb3J3YXJkIGludGVyZmFjZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlY29yZFR5cGU+IHZvaWQgd3JpdGVNZW1iZXJUeXBlKFJlY29yZFR5cGUgJlJlY29yZCk7CisKKyAgc3RkOjp2ZWN0b3I8Q1ZUeXBlPiBlbmQoVHlwZUluZGV4IEluZGV4KTsKK307Cit9IC8vIG5hbWVzcGFjZSBjb2RldmlldworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnQ2hlY2tzdW1zU3Vic2VjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4YjI4NDUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb24uaApAQCAtMCwwICsxLDEwNCBAQAorLy89PT0tIERlYnVnQ2hlY2tzdW1zU3Vic2VjdGlvbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR0NIRUNLU1VNU1NVQlNFQ1RJT05fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR0NIRUNLU1VNU1NVQlNFQ1RJT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTdWJzZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1BcnJheS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWFkZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb247CisKK3N0cnVjdCBGaWxlQ2hlY2tzdW1FbnRyeSB7CisgIHVpbnQzMl90IEZpbGVOYW1lT2Zmc2V0OyAgICAvLyBCeXRlIG9mZnNldCBvZiBmaWxlbmFtZSBpbiBnbG9iYWwgc3RyaW5ndGFibGUuCisgIEZpbGVDaGVja3N1bUtpbmQgS2luZDsgICAgICAvLyBUaGUgdHlwZSBvZiBjaGVja3N1bS4KKyAgQXJyYXlSZWY8dWludDhfdD4gQ2hlY2tzdW07IC8vIFRoZSBieXRlcyBvZiB0aGUgY2hlY2tzdW0uCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKKwordGVtcGxhdGUgPD4gc3RydWN0IFZhclN0cmVhbUFycmF5RXh0cmFjdG9yPGNvZGV2aWV3OjpGaWxlQ2hlY2tzdW1FbnRyeT4geworcHVibGljOgorICB1c2luZyBDb250ZXh0VHlwZSA9IHZvaWQ7CisKKyAgRXJyb3Igb3BlcmF0b3IoKShCaW5hcnlTdHJlYW1SZWYgU3RyZWFtLCB1aW50MzJfdCAmTGVuLAorICAgICAgICAgICAgICAgICAgIGNvZGV2aWV3OjpGaWxlQ2hlY2tzdW1FbnRyeSAmSXRlbSk7Cit9OworCituYW1lc3BhY2UgY29kZXZpZXcgeworCitjbGFzcyBEZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb25SZWYgZmluYWwgOiBwdWJsaWMgRGVidWdTdWJzZWN0aW9uUmVmIHsKKyAgdXNpbmcgRmlsZUNoZWNrc3VtQXJyYXkgPSBWYXJTdHJlYW1BcnJheTxjb2Rldmlldzo6RmlsZUNoZWNrc3VtRW50cnk+OworICB1c2luZyBJdGVyYXRvciA9IEZpbGVDaGVja3N1bUFycmF5OjpJdGVyYXRvcjsKKworcHVibGljOgorICBEZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb25SZWYoKQorICAgICAgOiBEZWJ1Z1N1YnNlY3Rpb25SZWYoRGVidWdTdWJzZWN0aW9uS2luZDo6RmlsZUNoZWNrc3Vtcykge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlYnVnU3Vic2VjdGlvblJlZiAqUykgeworICAgIHJldHVybiBTLT5raW5kKCkgPT0gRGVidWdTdWJzZWN0aW9uS2luZDo6RmlsZUNoZWNrc3VtczsKKyAgfQorCisgIGJvb2wgdmFsaWQoKSBjb25zdCB7IHJldHVybiBDaGVja3N1bXMudmFsaWQoKTsgfQorCisgIEVycm9yIGluaXRpYWxpemUoQmluYXJ5U3RyZWFtUmVhZGVyIFJlYWRlcik7CisgIEVycm9yIGluaXRpYWxpemUoQmluYXJ5U3RyZWFtUmVmIFN0cmVhbSk7CisKKyAgSXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBDaGVja3N1bXMuYmVnaW4oKTsgfQorICBJdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBDaGVja3N1bXMuZW5kKCk7IH0KKworICBjb25zdCBGaWxlQ2hlY2tzdW1BcnJheSAmZ2V0QXJyYXkoKSBjb25zdCB7IHJldHVybiBDaGVja3N1bXM7IH0KKworcHJpdmF0ZToKKyAgRmlsZUNoZWNrc3VtQXJyYXkgQ2hlY2tzdW1zOworfTsKKworY2xhc3MgRGVidWdDaGVja3N1bXNTdWJzZWN0aW9uIGZpbmFsIDogcHVibGljIERlYnVnU3Vic2VjdGlvbiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IERlYnVnQ2hlY2tzdW1zU3Vic2VjdGlvbihEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvbiAmU3RyaW5ncyk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWJ1Z1N1YnNlY3Rpb24gKlMpIHsKKyAgICByZXR1cm4gUy0+a2luZCgpID09IERlYnVnU3Vic2VjdGlvbktpbmQ6OkZpbGVDaGVja3N1bXM7CisgIH0KKworICB2b2lkIGFkZENoZWNrc3VtKFN0cmluZ1JlZiBGaWxlTmFtZSwgRmlsZUNoZWNrc3VtS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+IEJ5dGVzKTsKKworICB1aW50MzJfdCBjYWxjdWxhdGVTZXJpYWxpemVkU2l6ZSgpIGNvbnN0IG92ZXJyaWRlOworICBFcnJvciBjb21taXQoQmluYXJ5U3RyZWFtV3JpdGVyICZXcml0ZXIpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBtYXBDaGVja3N1bU9mZnNldChTdHJpbmdSZWYgRmlsZU5hbWUpIGNvbnN0OworCitwcml2YXRlOgorICBEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvbiAmU3RyaW5nczsKKworICBEZW5zZU1hcDx1aW50MzJfdCwgdWludDMyX3Q+IE9mZnNldE1hcDsKKyAgdWludDMyX3QgU2VyaWFsaXplZFNpemUgPSAwOworICBCdW1wUHRyQWxsb2NhdG9yIFN0b3JhZ2U7CisgIHN0ZDo6dmVjdG9yPEZpbGVDaGVja3N1bUVudHJ5PiBDaGVja3N1bXM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0RFQlVHQ0hFQ0tTVU1TU1VCU0VDVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z0Nyb3NzRXhTdWJzZWN0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z0Nyb3NzRXhTdWJzZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmY5ZTk4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnQ3Jvc3NFeFN1YnNlY3Rpb24uaApAQCAtMCwwICsxLDY4IEBACisvLz09PS0gRGVidWdDcm9zc0V4U3Vic2VjdGlvbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0RFQlVHQ1JPU1NFWFNVQlNFQ1RJT05fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR0NST1NTRVhTVUJTRUNUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTdWJzZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbUFycmF5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlYWRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgRGVidWdDcm9zc01vZHVsZUV4cG9ydHNTdWJzZWN0aW9uUmVmIGZpbmFsIDogcHVibGljIERlYnVnU3Vic2VjdGlvblJlZiB7CisgIHVzaW5nIFJlZmVyZW5jZUFycmF5ID0gRml4ZWRTdHJlYW1BcnJheTxDcm9zc01vZHVsZUV4cG9ydD47CisgIHVzaW5nIEl0ZXJhdG9yID0gUmVmZXJlbmNlQXJyYXk6Okl0ZXJhdG9yOworCitwdWJsaWM6CisgIERlYnVnQ3Jvc3NNb2R1bGVFeHBvcnRzU3Vic2VjdGlvblJlZigpCisgICAgICA6IERlYnVnU3Vic2VjdGlvblJlZihEZWJ1Z1N1YnNlY3Rpb25LaW5kOjpDcm9zc1Njb3BlRXhwb3J0cykge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlYnVnU3Vic2VjdGlvblJlZiAqUykgeworICAgIHJldHVybiBTLT5raW5kKCkgPT0gRGVidWdTdWJzZWN0aW9uS2luZDo6Q3Jvc3NTY29wZUV4cG9ydHM7CisgIH0KKworICBFcnJvciBpbml0aWFsaXplKEJpbmFyeVN0cmVhbVJlYWRlciBSZWFkZXIpOworICBFcnJvciBpbml0aWFsaXplKEJpbmFyeVN0cmVhbVJlZiBTdHJlYW0pOworCisgIEl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gUmVmZXJlbmNlcy5iZWdpbigpOyB9CisgIEl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIFJlZmVyZW5jZXMuZW5kKCk7IH0KKworcHJpdmF0ZToKKyAgRml4ZWRTdHJlYW1BcnJheTxDcm9zc01vZHVsZUV4cG9ydD4gUmVmZXJlbmNlczsKK307CisKK2NsYXNzIERlYnVnQ3Jvc3NNb2R1bGVFeHBvcnRzU3Vic2VjdGlvbiBmaW5hbCA6IHB1YmxpYyBEZWJ1Z1N1YnNlY3Rpb24geworcHVibGljOgorICBEZWJ1Z0Nyb3NzTW9kdWxlRXhwb3J0c1N1YnNlY3Rpb24oKQorICAgICAgOiBEZWJ1Z1N1YnNlY3Rpb24oRGVidWdTdWJzZWN0aW9uS2luZDo6Q3Jvc3NTY29wZUV4cG9ydHMpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWJ1Z1N1YnNlY3Rpb24gKlMpIHsKKyAgICByZXR1cm4gUy0+a2luZCgpID09IERlYnVnU3Vic2VjdGlvbktpbmQ6OkNyb3NzU2NvcGVFeHBvcnRzOworICB9CisKKyAgdm9pZCBhZGRNYXBwaW5nKHVpbnQzMl90IExvY2FsLCB1aW50MzJfdCBHbG9iYWwpOworCisgIHVpbnQzMl90IGNhbGN1bGF0ZVNlcmlhbGl6ZWRTaXplKCkgY29uc3Qgb3ZlcnJpZGU7CisgIEVycm9yIGNvbW1pdChCaW5hcnlTdHJlYW1Xcml0ZXIgJldyaXRlcikgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIHN0ZDo6bWFwPHVpbnQzMl90LCB1aW50MzJfdD4gTWFwcGluZ3M7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR0NST1NTRVhTVUJTRUNUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnQ3Jvc3NJbXBTdWJzZWN0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z0Nyb3NzSW1wU3Vic2VjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhiZTdlZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z0Nyb3NzSW1wU3Vic2VjdGlvbi5oCkBAIC0wLDAgKzEsOTUgQEAKKy8vPT09LSBEZWJ1Z0Nyb3NzRXhTdWJzZWN0aW9uLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfREVCVUdDUk9TU0lNUFNVQlNFQ1RJT05fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR0NST1NTSU1QU1VCU0VDVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3Vic2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1BcnJheS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWFkZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK3N0cnVjdCBDcm9zc01vZHVsZUltcG9ydEl0ZW0geworICBjb25zdCBDcm9zc01vZHVsZUltcG9ydCAqSGVhZGVyID0gbnVsbHB0cjsKKyAgRml4ZWRTdHJlYW1BcnJheTxzdXBwb3J0Ojp1bGl0dGxlMzJfdD4gSW1wb3J0czsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVmFyU3RyZWFtQXJyYXlFeHRyYWN0b3I8Y29kZXZpZXc6OkNyb3NzTW9kdWxlSW1wb3J0SXRlbT4geworcHVibGljOgorICB1c2luZyBDb250ZXh0VHlwZSA9IHZvaWQ7CisKKyAgRXJyb3Igb3BlcmF0b3IoKShCaW5hcnlTdHJlYW1SZWYgU3RyZWFtLCB1aW50MzJfdCAmTGVuLAorICAgICAgICAgICAgICAgICAgIGNvZGV2aWV3OjpDcm9zc01vZHVsZUltcG9ydEl0ZW0gJkl0ZW0pOworfTsKKworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb247CisKK2NsYXNzIERlYnVnQ3Jvc3NNb2R1bGVJbXBvcnRzU3Vic2VjdGlvblJlZiBmaW5hbCA6IHB1YmxpYyBEZWJ1Z1N1YnNlY3Rpb25SZWYgeworICB1c2luZyBSZWZlcmVuY2VBcnJheSA9IFZhclN0cmVhbUFycmF5PENyb3NzTW9kdWxlSW1wb3J0SXRlbT47CisgIHVzaW5nIEl0ZXJhdG9yID0gUmVmZXJlbmNlQXJyYXk6Okl0ZXJhdG9yOworCitwdWJsaWM6CisgIERlYnVnQ3Jvc3NNb2R1bGVJbXBvcnRzU3Vic2VjdGlvblJlZigpCisgICAgICA6IERlYnVnU3Vic2VjdGlvblJlZihEZWJ1Z1N1YnNlY3Rpb25LaW5kOjpDcm9zc1Njb3BlSW1wb3J0cykge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlYnVnU3Vic2VjdGlvblJlZiAqUykgeworICAgIHJldHVybiBTLT5raW5kKCkgPT0gRGVidWdTdWJzZWN0aW9uS2luZDo6Q3Jvc3NTY29wZUltcG9ydHM7CisgIH0KKworICBFcnJvciBpbml0aWFsaXplKEJpbmFyeVN0cmVhbVJlYWRlciBSZWFkZXIpOworICBFcnJvciBpbml0aWFsaXplKEJpbmFyeVN0cmVhbVJlZiBTdHJlYW0pOworCisgIEl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gUmVmZXJlbmNlcy5iZWdpbigpOyB9CisgIEl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIFJlZmVyZW5jZXMuZW5kKCk7IH0KKworcHJpdmF0ZToKKyAgUmVmZXJlbmNlQXJyYXkgUmVmZXJlbmNlczsKK307CisKK2NsYXNzIERlYnVnQ3Jvc3NNb2R1bGVJbXBvcnRzU3Vic2VjdGlvbiBmaW5hbCA6IHB1YmxpYyBEZWJ1Z1N1YnNlY3Rpb24geworcHVibGljOgorICBleHBsaWNpdCBEZWJ1Z0Nyb3NzTW9kdWxlSW1wb3J0c1N1YnNlY3Rpb24oCisgICAgICBEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvbiAmU3RyaW5ncykKKyAgICAgIDogRGVidWdTdWJzZWN0aW9uKERlYnVnU3Vic2VjdGlvbktpbmQ6OkNyb3NzU2NvcGVJbXBvcnRzKSwKKyAgICAgICAgU3RyaW5ncyhTdHJpbmdzKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVidWdTdWJzZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPmtpbmQoKSA9PSBEZWJ1Z1N1YnNlY3Rpb25LaW5kOjpDcm9zc1Njb3BlSW1wb3J0czsKKyAgfQorCisgIHZvaWQgYWRkSW1wb3J0KFN0cmluZ1JlZiBNb2R1bGUsIHVpbnQzMl90IEltcG9ydElkKTsKKworICB1aW50MzJfdCBjYWxjdWxhdGVTZXJpYWxpemVkU2l6ZSgpIGNvbnN0IG92ZXJyaWRlOworICBFcnJvciBjb21taXQoQmluYXJ5U3RyZWFtV3JpdGVyICZXcml0ZXIpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvbiAmU3RyaW5nczsKKyAgU3RyaW5nTWFwPHN0ZDo6dmVjdG9yPHN1cHBvcnQ6OnVsaXR0bGUzMl90Pj4gTWFwcGluZ3M7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0RFQlVHQ1JPU1NJTVBTVUJTRUNUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnRnJhbWVEYXRhU3Vic2VjdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdGcmFtZURhdGFTdWJzZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWUzMjljNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnRnJhbWVEYXRhU3Vic2VjdGlvbi5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vPT09LSBEZWJ1Z0ZyYW1lRGF0YVN1YnNlY3Rpb24uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR0ZSQU1FREFUQVNVQlNFQ1RJT05fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR0ZSQU1FREFUQVNVQlNFQ1RJT05fSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N1YnNlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVhZGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CitjbGFzcyBEZWJ1Z0ZyYW1lRGF0YVN1YnNlY3Rpb25SZWYgZmluYWwgOiBwdWJsaWMgRGVidWdTdWJzZWN0aW9uUmVmIHsKK3B1YmxpYzoKKyAgRGVidWdGcmFtZURhdGFTdWJzZWN0aW9uUmVmKCkKKyAgICAgIDogRGVidWdTdWJzZWN0aW9uUmVmKERlYnVnU3Vic2VjdGlvbktpbmQ6OkZyYW1lRGF0YSkge30KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWJ1Z1N1YnNlY3Rpb24gKlMpIHsKKyAgICByZXR1cm4gUy0+a2luZCgpID09IERlYnVnU3Vic2VjdGlvbktpbmQ6OkZyYW1lRGF0YTsKKyAgfQorCisgIEVycm9yIGluaXRpYWxpemUoQmluYXJ5U3RyZWFtUmVhZGVyIFJlYWRlcik7CisKKyAgRml4ZWRTdHJlYW1BcnJheTxGcmFtZURhdGE+OjpJdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEZyYW1lcy5iZWdpbigpOyB9CisgIEZpeGVkU3RyZWFtQXJyYXk8RnJhbWVEYXRhPjo6SXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gRnJhbWVzLmVuZCgpOyB9CisKKyAgY29uc3Qgdm9pZCAqZ2V0UmVsb2NQdHIoKSBjb25zdCB7IHJldHVybiBSZWxvY1B0cjsgfQorCitwcml2YXRlOgorICBjb25zdCB1aW50MzJfdCAqUmVsb2NQdHIgPSBudWxscHRyOworICBGaXhlZFN0cmVhbUFycmF5PEZyYW1lRGF0YT4gRnJhbWVzOworfTsKKworY2xhc3MgRGVidWdGcmFtZURhdGFTdWJzZWN0aW9uIGZpbmFsIDogcHVibGljIERlYnVnU3Vic2VjdGlvbiB7CitwdWJsaWM6CisgIERlYnVnRnJhbWVEYXRhU3Vic2VjdGlvbigpCisgICAgICA6IERlYnVnU3Vic2VjdGlvbihEZWJ1Z1N1YnNlY3Rpb25LaW5kOjpGcmFtZURhdGEpIHt9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVidWdTdWJzZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPmtpbmQoKSA9PSBEZWJ1Z1N1YnNlY3Rpb25LaW5kOjpGcmFtZURhdGE7CisgIH0KKworICB1aW50MzJfdCBjYWxjdWxhdGVTZXJpYWxpemVkU2l6ZSgpIGNvbnN0IG92ZXJyaWRlOworICBFcnJvciBjb21taXQoQmluYXJ5U3RyZWFtV3JpdGVyICZXcml0ZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgYWRkRnJhbWVEYXRhKGNvbnN0IEZyYW1lRGF0YSAmRnJhbWUpOworICB2b2lkIHNldEZyYW1lcyhBcnJheVJlZjxGcmFtZURhdGE+IEZyYW1lcyk7CisKK3ByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPEZyYW1lRGF0YT4gRnJhbWVzOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z0lubGluZWVMaW5lc1N1YnNlY3Rpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnSW5saW5lZUxpbmVzU3Vic2VjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OGMwZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z0lubGluZWVMaW5lc1N1YnNlY3Rpb24uaApAQCAtMCwwICsxLDEyMSBAQAorLy89PT0tIERlYnVnSW5saW5lZUxpbmVzU3Vic2VjdGlvbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR0lOTElORUVMSU5FU1NVQlNFQ1RJT05fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR0lOTElORUVMSU5FU1NVQlNFQ1RJT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N1YnNlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9MaW5lLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUluZGV4LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbUFycmF5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlYWRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgRGVidWdDaGVja3N1bXNTdWJzZWN0aW9uOworCitlbnVtIGNsYXNzIElubGluZWVMaW5lc1NpZ25hdHVyZSA6IHVpbnQzMl90IHsKKyAgTm9ybWFsLCAgICAvLyBDVl9JTkxJTkVFX1NPVVJDRV9MSU5FX1NJR05BVFVSRQorICBFeHRyYUZpbGVzIC8vIENWX0lOTElORUVfU09VUkNFX0xJTkVfU0lHTkFUVVJFX0VYCit9OworCitzdHJ1Y3QgSW5saW5lZVNvdXJjZUxpbmVIZWFkZXIgeworICBUeXBlSW5kZXggSW5saW5lZTsgICAgICAgICAgICAgICAgICAvLyBJRCBvZiB0aGUgZnVuY3Rpb24gdGhhdCB3YXMgaW5saW5lZC4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRmlsZUlEOyAgICAgICAgLy8gT2Zmc2V0IGludG8gRmlsZUNoZWNrc3VtcyBzdWJzZWN0aW9uLgorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTb3VyY2VMaW5lTnVtOyAvLyBGaXJzdCBsaW5lIG9mIGlubGluZWQgY29kZS4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWYgZXh0cmEgZmlsZXMgcHJlc2VudDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB1bGl0dGxlMzJfdCBFeHRyYUZpbGVDb3VudDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICB1bGl0dGxlMzJfdCBGaWxlc1tdOworfTsKKworc3RydWN0IElubGluZWVTb3VyY2VMaW5lIHsKKyAgY29uc3QgSW5saW5lZVNvdXJjZUxpbmVIZWFkZXIgKkhlYWRlcjsKKyAgRml4ZWRTdHJlYW1BcnJheTxzdXBwb3J0Ojp1bGl0dGxlMzJfdD4gRXh0cmFGaWxlczsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgVmFyU3RyZWFtQXJyYXlFeHRyYWN0b3I8Y29kZXZpZXc6OklubGluZWVTb3VyY2VMaW5lPiB7CisgIEVycm9yIG9wZXJhdG9yKCkoQmluYXJ5U3RyZWFtUmVmIFN0cmVhbSwgdWludDMyX3QgJkxlbiwKKyAgICAgICAgICAgICAgICAgICBjb2Rldmlldzo6SW5saW5lZVNvdXJjZUxpbmUgJkl0ZW0pOworCisgIGJvb2wgSGFzRXh0cmFGaWxlcyA9IGZhbHNlOworfTsKKworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgRGVidWdJbmxpbmVlTGluZXNTdWJzZWN0aW9uUmVmIGZpbmFsIDogcHVibGljIERlYnVnU3Vic2VjdGlvblJlZiB7CisgIHVzaW5nIExpbmVzQXJyYXkgPSBWYXJTdHJlYW1BcnJheTxJbmxpbmVlU291cmNlTGluZT47CisgIHVzaW5nIEl0ZXJhdG9yID0gTGluZXNBcnJheTo6SXRlcmF0b3I7CisKK3B1YmxpYzoKKyAgRGVidWdJbmxpbmVlTGluZXNTdWJzZWN0aW9uUmVmKCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWJ1Z1N1YnNlY3Rpb25SZWYgKlMpIHsKKyAgICByZXR1cm4gUy0+a2luZCgpID09IERlYnVnU3Vic2VjdGlvbktpbmQ6OklubGluZWVMaW5lczsKKyAgfQorCisgIEVycm9yIGluaXRpYWxpemUoQmluYXJ5U3RyZWFtUmVhZGVyIFJlYWRlcik7CisgIGJvb2wgaGFzRXh0cmFGaWxlcygpIGNvbnN0OworCisgIEl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gTGluZXMuYmVnaW4oKTsgfQorICBJdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBMaW5lcy5lbmQoKTsgfQorCitwcml2YXRlOgorICBJbmxpbmVlTGluZXNTaWduYXR1cmUgU2lnbmF0dXJlOworICBWYXJTdHJlYW1BcnJheTxJbmxpbmVlU291cmNlTGluZT4gTGluZXM7Cit9OworCitjbGFzcyBEZWJ1Z0lubGluZWVMaW5lc1N1YnNlY3Rpb24gZmluYWwgOiBwdWJsaWMgRGVidWdTdWJzZWN0aW9uIHsKK3B1YmxpYzoKKyAgc3RydWN0IEVudHJ5IHsKKyAgICBzdGQ6OnZlY3RvcjxzdXBwb3J0Ojp1bGl0dGxlMzJfdD4gRXh0cmFGaWxlczsKKyAgICBJbmxpbmVlU291cmNlTGluZUhlYWRlciBIZWFkZXI7CisgIH07CisKKyAgRGVidWdJbmxpbmVlTGluZXNTdWJzZWN0aW9uKERlYnVnQ2hlY2tzdW1zU3Vic2VjdGlvbiAmQ2hlY2tzdW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNFeHRyYUZpbGVzID0gZmFsc2UpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVidWdTdWJzZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPmtpbmQoKSA9PSBEZWJ1Z1N1YnNlY3Rpb25LaW5kOjpJbmxpbmVlTGluZXM7CisgIH0KKworICBFcnJvciBjb21taXQoQmluYXJ5U3RyZWFtV3JpdGVyICZXcml0ZXIpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBjYWxjdWxhdGVTZXJpYWxpemVkU2l6ZSgpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgYWRkSW5saW5lU2l0ZShUeXBlSW5kZXggRnVuY0lkLCBTdHJpbmdSZWYgRmlsZU5hbWUsIHVpbnQzMl90IFNvdXJjZUxpbmUpOworICB2b2lkIGFkZEV4dHJhRmlsZShTdHJpbmdSZWYgRmlsZU5hbWUpOworCisgIGJvb2wgaGFzRXh0cmFGaWxlcygpIGNvbnN0IHsgcmV0dXJuIEhhc0V4dHJhRmlsZXM7IH0KKyAgdm9pZCBzZXRIYXNFeHRyYUZpbGVzKGJvb2wgSGFzKSB7IEhhc0V4dHJhRmlsZXMgPSBIYXM7IH0KKworICBzdGQ6OnZlY3RvcjxFbnRyeT46OmNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gRW50cmllcy5iZWdpbigpOyB9CisgIHN0ZDo6dmVjdG9yPEVudHJ5Pjo6Y29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gRW50cmllcy5lbmQoKTsgfQorCitwcml2YXRlOgorICBEZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb24gJkNoZWNrc3VtczsKKyAgYm9vbCBIYXNFeHRyYUZpbGVzID0gZmFsc2U7CisgIHVpbnQzMl90IEV4dHJhRmlsZUNvdW50ID0gMDsKKyAgc3RkOjp2ZWN0b3I8RW50cnk+IEVudHJpZXM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0RFQlVHSU5MSU5FRUxJTkVTU1VCU0VDVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z0xpbmVzU3Vic2VjdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdMaW5lc1N1YnNlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzA0NGI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdMaW5lc1N1YnNlY3Rpb24uaApAQCAtMCwwICsxLDE1MCBAQAorLy89PT0tIERlYnVnTGluZXNTdWJzZWN0aW9uLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR0xJTkVTU1VCU0VDVElPTl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0RFQlVHTElORVNTVUJTRUNUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTdWJzZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1BcnJheS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWFkZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworCitjbGFzcyBEZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb247CitjbGFzcyBEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvbjsKKworLy8gQ29ycmVzcG9uZHMgdG8gdGhlIGBDVl9EZWJ1Z1NMaW5lc0hlYWRlcl90YCBzdHJ1Y3R1cmUuCitzdHJ1Y3QgTGluZUZyYWdtZW50SGVhZGVyIHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUmVsb2NPZmZzZXQ7ICAvLyBDb2RlIG9mZnNldCBvZiBsaW5lIGNvbnRyaWJ1dGlvbi4KKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgUmVsb2NTZWdtZW50OyAvLyBDb2RlIHNlZ21lbnQgb2YgbGluZSBjb250cmlidXRpb24uCisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IEZsYWdzOyAgICAgICAgLy8gU2VlIExpbmVGbGFncyBlbnVtZXJhdGlvbi4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQ29kZVNpemU7ICAgICAvLyBDb2RlIHNpemUgb2YgdGhpcyBsaW5lIGNvbnRyaWJ1dGlvbi4KK307CisKKy8vIENvcnJlc3BvbmRzIHRvIHRoZSBgQ1ZfRGVidWdTTGluZXNGaWxlQmxvY2tIZWFkZXJfdGAgc3RydWN0dXJlLgorc3RydWN0IExpbmVCbG9ja0ZyYWdtZW50SGVhZGVyIHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTmFtZUluZGV4OyAvLyBPZmZzZXQgb2YgRmlsZUNoZWNrc3VtIGVudHJ5IGluIEZpbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjaGVja3N1bXMgYnVmZmVyLiAgVGhlIGNoZWNrc3VtIGVudHJ5IHRoZW4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb250YWlucyBhbm90aGVyIG9mZnNldCBpbnRvIHRoZSBzdHJpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWJsZSBvZiB0aGUgYWN0dWFsIG5hbWUuCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE51bUxpbmVzOyAgLy8gTnVtYmVyIG9mIGxpbmVzCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEJsb2NrU2l6ZTsgLy8gQ29kZSBzaXplIG9mIGJsb2NrLCBpbiBieXRlcy4KKyAgLy8gVGhlIGZvbGxvd2luZyB0d28gdmFyaWFibGUgbGVuZ3RoIGFycmF5cyBhcHBlYXIgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlCisgIC8vIGhlYWRlci4gIFRoZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgZm9sbG93LgorICAvLyBMaW5lTnVtYmVyRW50cnkgICBMaW5lc1tOdW1MaW5lc107CisgIC8vIENvbHVtbk51bWJlckVudHJ5IENvbHVtbnNbTnVtTGluZXNdOworfTsKKworLy8gQ29ycmVzcG9uZHMgdG8gYENWX0xpbmVfdGAgc3RydWN0dXJlCitzdHJ1Y3QgTGluZU51bWJlckVudHJ5IHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgT2Zmc2V0OyAvLyBPZmZzZXQgdG8gc3RhcnQgb2YgY29kZSBieXRlcyBmb3IgbGluZSBudW1iZXIKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRmxhZ3M7ICAvLyBTdGFydDoyNCwgRW5kOjcsIElzU3RhdGVtZW50OjEKK307CisKKy8vIENvcnJlc3BvbmRzIHRvIGBDVl9Db2x1bW5fdGAgc3RydWN0dXJlCitzdHJ1Y3QgQ29sdW1uTnVtYmVyRW50cnkgeworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBTdGFydENvbHVtbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgRW5kQ29sdW1uOworfTsKKworc3RydWN0IExpbmVDb2x1bW5FbnRyeSB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE5hbWVJbmRleDsKKyAgRml4ZWRTdHJlYW1BcnJheTxMaW5lTnVtYmVyRW50cnk+IExpbmVOdW1iZXJzOworICBGaXhlZFN0cmVhbUFycmF5PENvbHVtbk51bWJlckVudHJ5PiBDb2x1bW5zOworfTsKKworY2xhc3MgTGluZUNvbHVtbkV4dHJhY3RvciB7CitwdWJsaWM6CisgIEVycm9yIG9wZXJhdG9yKCkoQmluYXJ5U3RyZWFtUmVmIFN0cmVhbSwgdWludDMyX3QgJkxlbiwKKyAgICAgICAgICAgICAgICAgICBMaW5lQ29sdW1uRW50cnkgJkl0ZW0pOworCisgIGNvbnN0IExpbmVGcmFnbWVudEhlYWRlciAqSGVhZGVyID0gbnVsbHB0cjsKK307CisKK2NsYXNzIERlYnVnTGluZXNTdWJzZWN0aW9uUmVmIGZpbmFsIDogcHVibGljIERlYnVnU3Vic2VjdGlvblJlZiB7CisgIGZyaWVuZCBjbGFzcyBMaW5lQ29sdW1uRXh0cmFjdG9yOworCisgIHVzaW5nIExpbmVJbmZvQXJyYXkgPSBWYXJTdHJlYW1BcnJheTxMaW5lQ29sdW1uRW50cnksIExpbmVDb2x1bW5FeHRyYWN0b3I+OworICB1c2luZyBJdGVyYXRvciA9IExpbmVJbmZvQXJyYXk6Okl0ZXJhdG9yOworCitwdWJsaWM6CisgIERlYnVnTGluZXNTdWJzZWN0aW9uUmVmKCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWJ1Z1N1YnNlY3Rpb25SZWYgKlMpIHsKKyAgICByZXR1cm4gUy0+a2luZCgpID09IERlYnVnU3Vic2VjdGlvbktpbmQ6OkxpbmVzOworICB9CisKKyAgRXJyb3IgaW5pdGlhbGl6ZShCaW5hcnlTdHJlYW1SZWFkZXIgUmVhZGVyKTsKKworICBJdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIExpbmVzQW5kQ29sdW1ucy5iZWdpbigpOyB9CisgIEl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIExpbmVzQW5kQ29sdW1ucy5lbmQoKTsgfQorCisgIGNvbnN0IExpbmVGcmFnbWVudEhlYWRlciAqaGVhZGVyKCkgY29uc3QgeyByZXR1cm4gSGVhZGVyOyB9CisKKyAgYm9vbCBoYXNDb2x1bW5JbmZvKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIGNvbnN0IExpbmVGcmFnbWVudEhlYWRlciAqSGVhZGVyID0gbnVsbHB0cjsKKyAgTGluZUluZm9BcnJheSBMaW5lc0FuZENvbHVtbnM7Cit9OworCitjbGFzcyBEZWJ1Z0xpbmVzU3Vic2VjdGlvbiBmaW5hbCA6IHB1YmxpYyBEZWJ1Z1N1YnNlY3Rpb24geworICBzdHJ1Y3QgQmxvY2sgeworICAgIEJsb2NrKHVpbnQzMl90IENoZWNrc3VtQnVmZmVyT2Zmc2V0KQorICAgICAgICA6IENoZWNrc3VtQnVmZmVyT2Zmc2V0KENoZWNrc3VtQnVmZmVyT2Zmc2V0KSB7fQorCisgICAgdWludDMyX3QgQ2hlY2tzdW1CdWZmZXJPZmZzZXQ7CisgICAgc3RkOjp2ZWN0b3I8TGluZU51bWJlckVudHJ5PiBMaW5lczsKKyAgICBzdGQ6OnZlY3RvcjxDb2x1bW5OdW1iZXJFbnRyeT4gQ29sdW1uczsKKyAgfTsKKworcHVibGljOgorICBEZWJ1Z0xpbmVzU3Vic2VjdGlvbihEZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb24gJkNoZWNrc3VtcywKKyAgICAgICAgICAgICAgICAgICAgICAgRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb24gJlN0cmluZ3MpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVidWdTdWJzZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPmtpbmQoKSA9PSBEZWJ1Z1N1YnNlY3Rpb25LaW5kOjpMaW5lczsKKyAgfQorCisgIHZvaWQgY3JlYXRlQmxvY2soU3RyaW5nUmVmIEZpbGVOYW1lKTsKKyAgdm9pZCBhZGRMaW5lSW5mbyh1aW50MzJfdCBPZmZzZXQsIGNvbnN0IExpbmVJbmZvICZMaW5lKTsKKyAgdm9pZCBhZGRMaW5lQW5kQ29sdW1uSW5mbyh1aW50MzJfdCBPZmZzZXQsIGNvbnN0IExpbmVJbmZvICZMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENvbFN0YXJ0LCB1aW50MzJfdCBDb2xFbmQpOworCisgIHVpbnQzMl90IGNhbGN1bGF0ZVNlcmlhbGl6ZWRTaXplKCkgY29uc3Qgb3ZlcnJpZGU7CisgIEVycm9yIGNvbW1pdChCaW5hcnlTdHJlYW1Xcml0ZXIgJldyaXRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBzZXRSZWxvY2F0aW9uQWRkcmVzcyh1aW50MTZfdCBTZWdtZW50LCB1aW50MzJfdCBPZmZzZXQpOworICB2b2lkIHNldENvZGVTaXplKHVpbnQzMl90IFNpemUpOworICB2b2lkIHNldEZsYWdzKExpbmVGbGFncyBGbGFncyk7CisKKyAgYm9vbCBoYXNDb2x1bW5JbmZvKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIERlYnVnQ2hlY2tzdW1zU3Vic2VjdGlvbiAmQ2hlY2tzdW1zOworICB1aW50MzJfdCBSZWxvY09mZnNldCA9IDA7CisgIHVpbnQxNl90IFJlbG9jU2VnbWVudCA9IDA7CisgIHVpbnQzMl90IENvZGVTaXplID0gMDsKKyAgTGluZUZsYWdzIEZsYWdzID0gTEZfTm9uZTsKKyAgc3RkOjp2ZWN0b3I8QmxvY2s+IEJsb2NrczsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0RFQlVHTElORVNTVUJTRUNUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlYmM5NjAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvbi5oCkBAIC0wLDAgKzEsOTcgQEAKKy8vPT09LSBEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvbi5oIC0gQ29kZVZpZXcgU3RyaW5nIFRhYmxlIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfREVCVUdTVFJJTkdUQUJMRVNVQlNFQ1RJT05fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR1NUUklOR1RBQkxFU1VCU0VDVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTdWJzZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmluYXJ5U3RyZWFtUmVhZGVyOworCituYW1lc3BhY2UgY29kZXZpZXcgeworCisvLy8gUmVwcmVzZW50cyBhIHJlYWQtb25seSB2aWV3IG9mIGEgQ29kZVZpZXcgc3RyaW5nIHRhYmxlLiAgVGhpcyBpcyBhIHZlcnkKKy8vLyBzaW1wbGUgZmxhdCBidWZmZXIgY29uc2lzdGluZyBvZiBudWxsLXRlcm1pbmF0ZWQgc3RyaW5ncywgd2hlcmUgc3RyaW5ncworLy8vIGFyZSByZXRyaWV2ZWQgYnkgdGhlaXIgb2Zmc2V0IGluIHRoZSBidWZmZXIuICBEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvblJlZgorLy8vIGRvZXMgbm90IG93biB0aGUgdW5kZXJseWluZyBzdG9yYWdlIGZvciB0aGUgYnVmZmVyLgorY2xhc3MgRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb25SZWYgOiBwdWJsaWMgRGVidWdTdWJzZWN0aW9uUmVmIHsKK3B1YmxpYzoKKyAgRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb25SZWYoKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlYnVnU3Vic2VjdGlvblJlZiAqUykgeworICAgIHJldHVybiBTLT5raW5kKCkgPT0gRGVidWdTdWJzZWN0aW9uS2luZDo6U3RyaW5nVGFibGU7CisgIH0KKworICBFcnJvciBpbml0aWFsaXplKEJpbmFyeVN0cmVhbVJlZiBDb250ZW50cyk7CisgIEVycm9yIGluaXRpYWxpemUoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIpOworCisgIEV4cGVjdGVkPFN0cmluZ1JlZj4gZ2V0U3RyaW5nKHVpbnQzMl90IE9mZnNldCkgY29uc3Q7CisKKyAgYm9vbCB2YWxpZCgpIGNvbnN0IHsgcmV0dXJuIFN0cmVhbS52YWxpZCgpOyB9CisKKyAgQmluYXJ5U3RyZWFtUmVmIGdldEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIFN0cmVhbTsgfQorCitwcml2YXRlOgorICBCaW5hcnlTdHJlYW1SZWYgU3RyZWFtOworfTsKKworLy8vIFJlcHJlc2VudHMgYSByZWFkLXdyaXRlIHZpZXcgb2YgYSBDb2RlVmlldyBzdHJpbmcgdGFibGUuCisvLy8gRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb24gb3ducyB0aGUgdW5kZXJseWluZyBzdG9yYWdlIGZvciB0aGUgdGFibGUsIGFuZCBpcworLy8vIGNhcGFibGUgb2Ygc2VyaWFsaXppbmcgdGhlIHN0cmluZyB0YWJsZSBpbnRvIGEgZm9ybWF0IHVuZGVyc3Rvb2QgYnkKKy8vLyBEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvblJlZi4KK2NsYXNzIERlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uIDogcHVibGljIERlYnVnU3Vic2VjdGlvbiB7CitwdWJsaWM6CisgIERlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uKCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWJ1Z1N1YnNlY3Rpb24gKlMpIHsKKyAgICByZXR1cm4gUy0+a2luZCgpID09IERlYnVnU3Vic2VjdGlvbktpbmQ6OlN0cmluZ1RhYmxlOworICB9CisKKyAgLy8gSWYgc3RyaW5nIFMgZG9lcyBub3QgZXhpc3QgaW4gdGhlIHN0cmluZyB0YWJsZSwgaW5zZXJ0IGl0LgorICAvLyBSZXR1cm5zIHRoZSBJRCBmb3IgUy4KKyAgdWludDMyX3QgaW5zZXJ0KFN0cmluZ1JlZiBTKTsKKworICAvLyBSZXR1cm4gdGhlIElEIGZvciBzdHJpbmcgUy4gIEFzc3VtZXMgUyBleGlzdHMgaW4gdGhlIHRhYmxlLgorICB1aW50MzJfdCBnZXRJZEZvclN0cmluZyhTdHJpbmdSZWYgUykgY29uc3Q7CisKKyAgU3RyaW5nUmVmIGdldFN0cmluZ0ZvcklkKHVpbnQzMl90IElkKSBjb25zdDsKKworICB1aW50MzJfdCBjYWxjdWxhdGVTZXJpYWxpemVkU2l6ZSgpIGNvbnN0IG92ZXJyaWRlOworICBFcnJvciBjb21taXQoQmluYXJ5U3RyZWFtV3JpdGVyICZXcml0ZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIHVpbnQzMl90IHNpemUoKSBjb25zdDsKKworICBTdHJpbmdNYXA8dWludDMyX3Q+Ojpjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RyaW5nVG9JZC5iZWdpbigpOworICB9CisKKyAgU3RyaW5nTWFwPHVpbnQzMl90Pjo6Y29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gU3RyaW5nVG9JZC5lbmQoKTsgfQorCisgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBzb3J0ZWRJZHMoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgRGVuc2VNYXA8dWludDMyX3QsIFN0cmluZ1JlZj4gSWRUb1N0cmluZzsKKyAgU3RyaW5nTWFwPHVpbnQzMl90PiBTdHJpbmdUb0lkOworICB1aW50MzJfdCBTdHJpbmdTaXplID0gMTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfREVCVUdTVFJJTkdUQUJMRVNVQlNFQ1RJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTdWJzZWN0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N1YnNlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNDI3ZTAwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTdWJzZWN0aW9uLmgKQEAgLTAsMCArMSw1MiBAQAorLy89PT0tIERlYnVnU3Vic2VjdGlvbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX01PRFVMRURFQlVHRlJBR01FTlRfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19NT0RVTEVERUJVR0ZSQUdNRU5UX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVdyaXRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIERlYnVnU3Vic2VjdGlvblJlZiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IERlYnVnU3Vic2VjdGlvblJlZihEZWJ1Z1N1YnNlY3Rpb25LaW5kIEtpbmQpIDogS2luZChLaW5kKSB7fQorICB2aXJ0dWFsIH5EZWJ1Z1N1YnNlY3Rpb25SZWYoKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlYnVnU3Vic2VjdGlvblJlZiAqUykgeyByZXR1cm4gdHJ1ZTsgfQorCisgIERlYnVnU3Vic2VjdGlvbktpbmQga2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworcHJvdGVjdGVkOgorICBEZWJ1Z1N1YnNlY3Rpb25LaW5kIEtpbmQ7Cit9OworCitjbGFzcyBEZWJ1Z1N1YnNlY3Rpb24geworcHVibGljOgorICBleHBsaWNpdCBEZWJ1Z1N1YnNlY3Rpb24oRGVidWdTdWJzZWN0aW9uS2luZCBLaW5kKSA6IEtpbmQoS2luZCkge30KKyAgdmlydHVhbCB+RGVidWdTdWJzZWN0aW9uKCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEZWJ1Z1N1YnNlY3Rpb24gKlMpIHsgcmV0dXJuIHRydWU7IH0KKworICBEZWJ1Z1N1YnNlY3Rpb25LaW5kIGtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKKyAgdmlydHVhbCBFcnJvciBjb21taXQoQmluYXJ5U3RyZWFtV3JpdGVyICZXcml0ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBjYWxjdWxhdGVTZXJpYWxpemVkU2l6ZSgpIGNvbnN0ID0gMDsKKworcHJvdGVjdGVkOgorICBEZWJ1Z1N1YnNlY3Rpb25LaW5kIEtpbmQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBjb2RldmlldworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfTU9EVUxFREVCVUdGUkFHTUVOVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N1YnNlY3Rpb25SZWNvcmQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3Vic2VjdGlvblJlY29yZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMGNmMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N1YnNlY3Rpb25SZWNvcmQuaApAQCAtMCwwICsxLDEwMyBAQAorLy89PT0tIERlYnVnU3Vic2VjdGlvblJlY29yZC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR1NVQlNFQ1RJT05SRUNPUkRfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR1NVQlNFQ1RJT05SRUNPUkRfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtQXJyYXkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmluYXJ5U3RyZWFtV3JpdGVyOworCituYW1lc3BhY2UgY29kZXZpZXcgeworCitjbGFzcyBEZWJ1Z1N1YnNlY3Rpb247CisKKy8vIENvcnJlc3BvbmRzIHRvIHRoZSBgQ1ZfRGVidWdTU3Vic2VjdGlvbkhlYWRlcl90YCBzdHJ1Y3R1cmUuCitzdHJ1Y3QgRGVidWdTdWJzZWN0aW9uSGVhZGVyIHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgS2luZDsgICAvLyBjb2Rldmlldzo6RGVidWdTdWJzZWN0aW9uS2luZCBlbnVtCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IExlbmd0aDsgLy8gbnVtYmVyIG9mIGJ5dGVzIG9jY3VwaWVkIGJ5IHRoaXMgcmVjb3JkLgorfTsKKworY2xhc3MgRGVidWdTdWJzZWN0aW9uUmVjb3JkIHsKK3B1YmxpYzoKKyAgRGVidWdTdWJzZWN0aW9uUmVjb3JkKCk7CisgIERlYnVnU3Vic2VjdGlvblJlY29yZChEZWJ1Z1N1YnNlY3Rpb25LaW5kIEtpbmQsIEJpbmFyeVN0cmVhbVJlZiBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQ29kZVZpZXdDb250YWluZXIgQ29udGFpbmVyKTsKKworICBzdGF0aWMgRXJyb3IgaW5pdGlhbGl6ZShCaW5hcnlTdHJlYW1SZWYgU3RyZWFtLCBEZWJ1Z1N1YnNlY3Rpb25SZWNvcmQgJkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVWaWV3Q29udGFpbmVyIENvbnRhaW5lcik7CisKKyAgdWludDMyX3QgZ2V0UmVjb3JkTGVuZ3RoKCkgY29uc3Q7CisgIERlYnVnU3Vic2VjdGlvbktpbmQga2luZCgpIGNvbnN0OworICBCaW5hcnlTdHJlYW1SZWYgZ2V0UmVjb3JkRGF0YSgpIGNvbnN0OworCitwcml2YXRlOgorICBDb2RlVmlld0NvbnRhaW5lciBDb250YWluZXIgPSBDb2RlVmlld0NvbnRhaW5lcjo6T2JqZWN0RmlsZTsKKyAgRGVidWdTdWJzZWN0aW9uS2luZCBLaW5kID0gRGVidWdTdWJzZWN0aW9uS2luZDo6Tm9uZTsKKyAgQmluYXJ5U3RyZWFtUmVmIERhdGE7Cit9OworCitjbGFzcyBEZWJ1Z1N1YnNlY3Rpb25SZWNvcmRCdWlsZGVyIHsKK3B1YmxpYzoKKyAgRGVidWdTdWJzZWN0aW9uUmVjb3JkQnVpbGRlcihzdGQ6OnNoYXJlZF9wdHI8RGVidWdTdWJzZWN0aW9uPiBTdWJzZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVWaWV3Q29udGFpbmVyIENvbnRhaW5lcik7CisKKyAgLy8vIFVzZSB0aGlzIHRvIGNvcHkgZXhpc3Rpbmcgc3Vic2VjdGlvbnMgZGlyZWN0bHkgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24uCisgIC8vLyBGb3IgZXhhbXBsZSwgbGluZSB0YWJsZSBzdWJzZWN0aW9ucyBpbiBhbiBvYmplY3QgZmlsZSBvbmx5IG5lZWQgdG8gYmUKKyAgLy8vIHJlbG9jYXRlZCBiZWZvcmUgYmVpbmcgY29waWVkIGludG8gdGhlIFBEQi4KKyAgRGVidWdTdWJzZWN0aW9uUmVjb3JkQnVpbGRlcihjb25zdCBEZWJ1Z1N1YnNlY3Rpb25SZWNvcmQgJkNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVWaWV3Q29udGFpbmVyIENvbnRhaW5lcik7CisKKyAgdWludDMyX3QgY2FsY3VsYXRlU2VyaWFsaXplZExlbmd0aCgpOworICBFcnJvciBjb21taXQoQmluYXJ5U3RyZWFtV3JpdGVyICZXcml0ZXIpIGNvbnN0OworCitwcml2YXRlOgorICAvLy8gVGhlIHN1YnNlY3Rpb24gdG8gYnVpbGQuIFdpbGwgYmUgbnVsbCBpZiBDb250ZW50cyBpcyBub24tZW1wdHkuCisgIHN0ZDo6c2hhcmVkX3B0cjxEZWJ1Z1N1YnNlY3Rpb24+IFN1YnNlY3Rpb247CisKKyAgLy8vIFRoZSBieXRlcyBvZiB0aGUgc3Vic2VjdGlvbi4gT25seSBub24tZW1wdHkgaWYgU3Vic2VjdGlvbiBpcyBudWxsLgorICBEZWJ1Z1N1YnNlY3Rpb25SZWNvcmQgQ29udGVudHM7CisKKyAgQ29kZVZpZXdDb250YWluZXIgQ29udGFpbmVyOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBWYXJTdHJlYW1BcnJheUV4dHJhY3Rvcjxjb2Rldmlldzo6RGVidWdTdWJzZWN0aW9uUmVjb3JkPiB7CisgIEVycm9yIG9wZXJhdG9yKCkoQmluYXJ5U3RyZWFtUmVmIFN0cmVhbSwgdWludDMyX3QgJkxlbmd0aCwKKyAgICAgICAgICAgICAgICAgICBjb2Rldmlldzo6RGVidWdTdWJzZWN0aW9uUmVjb3JkICZJbmZvKSB7CisgICAgLy8gRklYTUU6IFdlIG5lZWQgdG8gcGFzcyB0aGUgY29udGFpbmVyIHR5cGUgdGhyb3VnaCB0byB0aGlzIGZ1bmN0aW9uLiAgSW4KKyAgICAvLyBwcmFjdGljZSB0aGlzIGlzbid0IHN1cGVyIGltcG9ydGFudCBzaW5jZSB0aGUgc3Vic2VjdGlvbiBoZWFkZXIgZGVzY3JpYmVzCisgICAgLy8gaXRzIGxlbmd0aCBhbmQgd2UgY2FuIGp1c3Qgc2tpcCBpdC4gIEl0J3MgbW9yZSBpbXBvcnRhbnQgd2hlbiB3cml0aW5nLgorICAgIGlmIChhdXRvIEVDID0gY29kZXZpZXc6OkRlYnVnU3Vic2VjdGlvblJlY29yZDo6aW5pdGlhbGl6ZSgKKyAgICAgICAgICAgIFN0cmVhbSwgSW5mbywgY29kZXZpZXc6OkNvZGVWaWV3Q29udGFpbmVyOjpQZGIpKQorICAgICAgcmV0dXJuIEVDOworICAgIExlbmd0aCA9IGFsaWduVG8oSW5mby5nZXRSZWNvcmRMZW5ndGgoKSwgNCk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KK307CisKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK3VzaW5nIERlYnVnU3Vic2VjdGlvbkFycmF5ID0gVmFyU3RyZWFtQXJyYXk8RGVidWdTdWJzZWN0aW9uUmVjb3JkPjsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19ERUJVR1NVQlNFQ1RJT05SRUNPUkRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTdWJzZWN0aW9uVmlzaXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTdWJzZWN0aW9uVmlzaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1Zjc0OWQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N1YnNlY3Rpb25WaXNpdG9yLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8vPT09LSBEZWJ1Z1N1YnNlY3Rpb25WaXNpdG9yLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19NT0RVTEVERUJVR0ZSQUdNRU5UVklTSVRPUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX01PRFVMRURFQlVHRlJBR01FTlRWSVNJVE9SX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTdWJzZWN0aW9uUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3RyaW5nc0FuZENoZWNrc3Vtcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgRGVidWdDaGVja3N1bXNTdWJzZWN0aW9uUmVmOworY2xhc3MgRGVidWdTdWJzZWN0aW9uUmVjb3JkOworY2xhc3MgRGVidWdJbmxpbmVlTGluZXNTdWJzZWN0aW9uUmVmOworY2xhc3MgRGVidWdDcm9zc01vZHVsZUV4cG9ydHNTdWJzZWN0aW9uUmVmOworY2xhc3MgRGVidWdDcm9zc01vZHVsZUltcG9ydHNTdWJzZWN0aW9uUmVmOworY2xhc3MgRGVidWdGcmFtZURhdGFTdWJzZWN0aW9uUmVmOworY2xhc3MgRGVidWdMaW5lc1N1YnNlY3Rpb25SZWY7CitjbGFzcyBEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvblJlZjsKK2NsYXNzIERlYnVnU3ltYm9sUlZBU3Vic2VjdGlvblJlZjsKK2NsYXNzIERlYnVnU3ltYm9sc1N1YnNlY3Rpb25SZWY7CitjbGFzcyBEZWJ1Z1Vua25vd25TdWJzZWN0aW9uUmVmOworY2xhc3MgU3RyaW5nc0FuZENoZWNrc3Vtc1JlZjsKKworY2xhc3MgRGVidWdTdWJzZWN0aW9uVmlzaXRvciB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkRlYnVnU3Vic2VjdGlvblZpc2l0b3IoKSA9IGRlZmF1bHQ7CisKKyAgdmlydHVhbCBFcnJvciB2aXNpdFVua25vd24oRGVidWdVbmtub3duU3Vic2VjdGlvblJlZiAmVW5rbm93bikgeworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisgIHZpcnR1YWwgRXJyb3IgdmlzaXRMaW5lcyhEZWJ1Z0xpbmVzU3Vic2VjdGlvblJlZiAmTGluZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdzQW5kQ2hlY2tzdW1zUmVmICZTdGF0ZSkgPSAwOworICB2aXJ0dWFsIEVycm9yIHZpc2l0RmlsZUNoZWNrc3VtcyhEZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb25SZWYgJkNoZWNrc3VtcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nc0FuZENoZWNrc3Vtc1JlZiAmU3RhdGUpID0gMDsKKyAgdmlydHVhbCBFcnJvciB2aXNpdElubGluZWVMaW5lcyhEZWJ1Z0lubGluZWVMaW5lc1N1YnNlY3Rpb25SZWYgJklubGluZWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ3NBbmRDaGVja3N1bXNSZWYgJlN0YXRlKSA9IDA7CisgIHZpcnR1YWwgRXJyb3IKKyAgdmlzaXRDcm9zc01vZHVsZUV4cG9ydHMoRGVidWdDcm9zc01vZHVsZUV4cG9ydHNTdWJzZWN0aW9uUmVmICZDU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ3NBbmRDaGVja3N1bXNSZWYgJlN0YXRlKSA9IDA7CisgIHZpcnR1YWwgRXJyb3IKKyAgdmlzaXRDcm9zc01vZHVsZUltcG9ydHMoRGVidWdDcm9zc01vZHVsZUltcG9ydHNTdWJzZWN0aW9uUmVmICZDU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ3NBbmRDaGVja3N1bXNSZWYgJlN0YXRlKSA9IDA7CisKKyAgdmlydHVhbCBFcnJvciB2aXNpdFN0cmluZ1RhYmxlKERlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uUmVmICZTVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ3NBbmRDaGVja3N1bXNSZWYgJlN0YXRlKSA9IDA7CisKKyAgdmlydHVhbCBFcnJvciB2aXNpdFN5bWJvbHMoRGVidWdTeW1ib2xzU3Vic2VjdGlvblJlZiAmQ1NFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdzQW5kQ2hlY2tzdW1zUmVmICZTdGF0ZSkgPSAwOworCisgIHZpcnR1YWwgRXJyb3IgdmlzaXRGcmFtZURhdGEoRGVidWdGcmFtZURhdGFTdWJzZWN0aW9uUmVmICZGRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdzQW5kQ2hlY2tzdW1zUmVmICZTdGF0ZSkgPSAwOworICB2aXJ0dWFsIEVycm9yIHZpc2l0Q09GRlN5bWJvbFJWQXMoRGVidWdTeW1ib2xSVkFTdWJzZWN0aW9uUmVmICZSVkFzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nc0FuZENoZWNrc3Vtc1JlZiAmU3RhdGUpID0gMDsKK307CisKK0Vycm9yIHZpc2l0RGVidWdTdWJzZWN0aW9uKGNvbnN0IERlYnVnU3Vic2VjdGlvblJlY29yZCAmUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlYnVnU3Vic2VjdGlvblZpc2l0b3IgJlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdzQW5kQ2hlY2tzdW1zUmVmICZTdGF0ZSk7CisKK25hbWVzcGFjZSBkZXRhaWwgewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitFcnJvciB2aXNpdERlYnVnU3Vic2VjdGlvbnMoVCAmJkZyYWdtZW50UmFuZ2UsIERlYnVnU3Vic2VjdGlvblZpc2l0b3IgJlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nc0FuZENoZWNrc3Vtc1JlZiAmU3RhdGUpIHsKKyAgU3RhdGUuaW5pdGlhbGl6ZShzdGQ6OmZvcndhcmQ8VD4oRnJhZ21lbnRSYW5nZSkpOworCisgIGZvciAoY29uc3QgRGVidWdTdWJzZWN0aW9uUmVjb3JkICZMIDogRnJhZ21lbnRSYW5nZSkgeworICAgIGlmIChhdXRvIEVDID0gdmlzaXREZWJ1Z1N1YnNlY3Rpb24oTCwgViwgU3RhdGUpKQorICAgICAgcmV0dXJuIEVDOworICB9CisgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworfQorfSAvLyBuYW1lc3BhY2UgZGV0YWlsCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorRXJyb3IgdmlzaXREZWJ1Z1N1YnNlY3Rpb25zKFQgJiZGcmFnbWVudFJhbmdlLCBEZWJ1Z1N1YnNlY3Rpb25WaXNpdG9yICZWKSB7CisgIFN0cmluZ3NBbmRDaGVja3N1bXNSZWYgU3RhdGU7CisgIHJldHVybiBkZXRhaWw6OnZpc2l0RGVidWdTdWJzZWN0aW9ucyhzdGQ6OmZvcndhcmQ8VD4oRnJhZ21lbnRSYW5nZSksIFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorRXJyb3IgdmlzaXREZWJ1Z1N1YnNlY3Rpb25zKFQgJiZGcmFnbWVudFJhbmdlLCBEZWJ1Z1N1YnNlY3Rpb25WaXNpdG9yICZWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uUmVmICZTdHJpbmdzKSB7CisgIFN0cmluZ3NBbmRDaGVja3N1bXNSZWYgU3RhdGUoU3RyaW5ncyk7CisgIHJldHVybiBkZXRhaWw6OnZpc2l0RGVidWdTdWJzZWN0aW9ucyhzdGQ6OmZvcndhcmQ8VD4oRnJhZ21lbnRSYW5nZSksIFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0ZSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorRXJyb3IgdmlzaXREZWJ1Z1N1YnNlY3Rpb25zKFQgJiZGcmFnbWVudFJhbmdlLCBEZWJ1Z1N1YnNlY3Rpb25WaXNpdG9yICZWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uUmVmICZTdHJpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnQ2hlY2tzdW1zU3Vic2VjdGlvblJlZiAmQ2hlY2tzdW1zKSB7CisgIFN0cmluZ3NBbmRDaGVja3N1bXNSZWYgU3RhdGUoU3RyaW5ncywgQ2hlY2tzdW1zKTsKKyAgcmV0dXJuIGRldGFpbDo6dmlzaXREZWJ1Z1N1YnNlY3Rpb25zKHN0ZDo6Zm9yd2FyZDxUPihGcmFnbWVudFJhbmdlKSwgViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXRlKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19NT0RVTEVERUJVR0ZSQUdNRU5UVklTSVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N5bWJvbFJWQVN1YnNlY3Rpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3ltYm9sUlZBU3Vic2VjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YzA0YjUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N5bWJvbFJWQVN1YnNlY3Rpb24uaApAQCAtMCwwICsxLDY3IEBACisvLz09PS0gRGVidWdTeW1ib2xSVkFTdWJzZWN0aW9uLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0RFQlVHU1lNQk9MUlZBU1VCU0VDVElPTl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0RFQlVHU1lNQk9MUlZBU1VCU0VDVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3Vic2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1BcnJheS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCaW5hcnlTdHJlYW1SZWFkZXI7CisKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIERlYnVnU3ltYm9sUlZBU3Vic2VjdGlvblJlZiBmaW5hbCA6IHB1YmxpYyBEZWJ1Z1N1YnNlY3Rpb25SZWYgeworcHVibGljOgorICB1c2luZyBBcnJheVR5cGUgPSBGaXhlZFN0cmVhbUFycmF5PHN1cHBvcnQ6OnVsaXR0bGUzMl90PjsKKworICBEZWJ1Z1N5bWJvbFJWQVN1YnNlY3Rpb25SZWYoKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlYnVnU3Vic2VjdGlvblJlZiAqUykgeworICAgIHJldHVybiBTLT5raW5kKCkgPT0gRGVidWdTdWJzZWN0aW9uS2luZDo6Q29mZlN5bWJvbFJWQTsKKyAgfQorCisgIEFycmF5VHlwZTo6SXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBSVkFzLmJlZ2luKCk7IH0KKyAgQXJyYXlUeXBlOjpJdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBSVkFzLmVuZCgpOyB9CisKKyAgRXJyb3IgaW5pdGlhbGl6ZShCaW5hcnlTdHJlYW1SZWFkZXIgJlJlYWRlcik7CisKK3ByaXZhdGU6CisgIEFycmF5VHlwZSBSVkFzOworfTsKKworY2xhc3MgRGVidWdTeW1ib2xSVkFTdWJzZWN0aW9uIGZpbmFsIDogcHVibGljIERlYnVnU3Vic2VjdGlvbiB7CitwdWJsaWM6CisgIERlYnVnU3ltYm9sUlZBU3Vic2VjdGlvbigpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGVidWdTdWJzZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPmtpbmQoKSA9PSBEZWJ1Z1N1YnNlY3Rpb25LaW5kOjpDb2ZmU3ltYm9sUlZBOworICB9CisKKyAgRXJyb3IgY29tbWl0KEJpbmFyeVN0cmVhbVdyaXRlciAmV3JpdGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgY2FsY3VsYXRlU2VyaWFsaXplZFNpemUoKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGFkZFJWQSh1aW50MzJfdCBSVkEpIHsgUlZBcy5wdXNoX2JhY2soc3VwcG9ydDo6dWxpdHRsZTMyX3QoUlZBKSk7IH0KKworcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8c3VwcG9ydDo6dWxpdHRsZTMyX3Q+IFJWQXM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0RFQlVHU1lNQk9MUlZBU1VCU0VDVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N5bWJvbHNTdWJzZWN0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N5bWJvbHNTdWJzZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGZkYTdkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3ltYm9sc1N1YnNlY3Rpb24uaApAQCAtMCwwICsxLDU2IEBACisvLz09PS0gRGVidWdTeW1ib2xzU3Vic2VjdGlvbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfREVCVUdTWU1CT0xTU1VCU0VDVElPTl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0RFQlVHU1lNQk9MU1NVQlNFQ1RJT05fSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTdWJzZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CitjbGFzcyBEZWJ1Z1N5bWJvbHNTdWJzZWN0aW9uUmVmIGZpbmFsIDogcHVibGljIERlYnVnU3Vic2VjdGlvblJlZiB7CitwdWJsaWM6CisgIERlYnVnU3ltYm9sc1N1YnNlY3Rpb25SZWYoKQorICAgICAgOiBEZWJ1Z1N1YnNlY3Rpb25SZWYoRGVidWdTdWJzZWN0aW9uS2luZDo6U3ltYm9scykge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlYnVnU3Vic2VjdGlvblJlZiAqUykgeworICAgIHJldHVybiBTLT5raW5kKCkgPT0gRGVidWdTdWJzZWN0aW9uS2luZDo6U3ltYm9sczsKKyAgfQorCisgIEVycm9yIGluaXRpYWxpemUoQmluYXJ5U3RyZWFtUmVhZGVyIFJlYWRlcik7CisKKyAgQ1ZTeW1ib2xBcnJheTo6SXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBSZWNvcmRzLmJlZ2luKCk7IH0KKyAgQ1ZTeW1ib2xBcnJheTo6SXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gUmVjb3Jkcy5lbmQoKTsgfQorCitwcml2YXRlOgorICBDVlN5bWJvbEFycmF5IFJlY29yZHM7Cit9OworCitjbGFzcyBEZWJ1Z1N5bWJvbHNTdWJzZWN0aW9uIGZpbmFsIDogcHVibGljIERlYnVnU3Vic2VjdGlvbiB7CitwdWJsaWM6CisgIERlYnVnU3ltYm9sc1N1YnNlY3Rpb24oKSA6IERlYnVnU3Vic2VjdGlvbihEZWJ1Z1N1YnNlY3Rpb25LaW5kOjpTeW1ib2xzKSB7fQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERlYnVnU3Vic2VjdGlvbiAqUykgeworICAgIHJldHVybiBTLT5raW5kKCkgPT0gRGVidWdTdWJzZWN0aW9uS2luZDo6U3ltYm9sczsKKyAgfQorCisgIHVpbnQzMl90IGNhbGN1bGF0ZVNlcmlhbGl6ZWRTaXplKCkgY29uc3Qgb3ZlcnJpZGU7CisgIEVycm9yIGNvbW1pdChCaW5hcnlTdHJlYW1Xcml0ZXIgJldyaXRlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBhZGRTeW1ib2woQ1ZTeW1ib2wgU3ltYm9sKTsKKworcHJpdmF0ZToKKyAgdWludDMyX3QgTGVuZ3RoID0gMDsKKyAgc3RkOjp2ZWN0b3I8Q1ZTeW1ib2w+IFJlY29yZHM7Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnVW5rbm93blN1YnNlY3Rpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnVW5rbm93blN1YnNlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTlhOTZjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdVbmtub3duU3Vic2VjdGlvbi5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vPT09LSBEZWJ1Z1Vua25vd25TdWJzZWN0aW9uLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19NT0RVTEVERUJVR1VOS05PV05GUkFHTUVOVF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX01PRFVMRURFQlVHVU5LTk9XTkZSQUdNRU5UX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3Vic2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWYuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgRGVidWdVbmtub3duU3Vic2VjdGlvblJlZiBmaW5hbCA6IHB1YmxpYyBEZWJ1Z1N1YnNlY3Rpb25SZWYgeworcHVibGljOgorICBEZWJ1Z1Vua25vd25TdWJzZWN0aW9uUmVmKERlYnVnU3Vic2VjdGlvbktpbmQgS2luZCwgQmluYXJ5U3RyZWFtUmVmIERhdGEpCisgICAgICA6IERlYnVnU3Vic2VjdGlvblJlZihLaW5kKSwgRGF0YShEYXRhKSB7fQorCisgIEJpbmFyeVN0cmVhbVJlZiBnZXREYXRhKCkgY29uc3QgeyByZXR1cm4gRGF0YTsgfQorCitwcml2YXRlOgorICBCaW5hcnlTdHJlYW1SZWYgRGF0YTsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRW51bVRhYmxlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRW51bVRhYmxlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlMGYwZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9FbnVtVGFibGVzLmgKQEAgLTAsMCArMSw0NSBAQAorLy89PT0tIEVudW1UYWJsZXMuaCAtIEVudW0gdG8gc3RyaW5nIGNvbnZlcnNpb24gdGFibGVzIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19FTlVNVEFCTEVTX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfRU5VTVRBQkxFU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0NPRkYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TY29wZWRQcmludGVyLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworQXJyYXlSZWY8RW51bUVudHJ5PFN5bWJvbEtpbmQ+PiBnZXRTeW1ib2xUeXBlTmFtZXMoKTsKK0FycmF5UmVmPEVudW1FbnRyeTxUeXBlTGVhZktpbmQ+PiBnZXRUeXBlTGVhZk5hbWVzKCk7CitBcnJheVJlZjxFbnVtRW50cnk8dWludDE2X3Q+PiBnZXRSZWdpc3Rlck5hbWVzKCk7CitBcnJheVJlZjxFbnVtRW50cnk8dWludDMyX3Q+PiBnZXRQdWJsaWNTeW1GbGFnTmFtZXMoKTsKK0FycmF5UmVmPEVudW1FbnRyeTx1aW50OF90Pj4gZ2V0UHJvY1N5bUZsYWdOYW1lcygpOworQXJyYXlSZWY8RW51bUVudHJ5PHVpbnQxNl90Pj4gZ2V0TG9jYWxGbGFnTmFtZXMoKTsKK0FycmF5UmVmPEVudW1FbnRyeTx1aW50OF90Pj4gZ2V0RnJhbWVDb29raWVLaW5kTmFtZXMoKTsKK0FycmF5UmVmPEVudW1FbnRyeTxTb3VyY2VMYW5ndWFnZT4+IGdldFNvdXJjZUxhbmd1YWdlTmFtZXMoKTsKK0FycmF5UmVmPEVudW1FbnRyeTx1aW50MzJfdD4+IGdldENvbXBpbGVTeW0yRmxhZ05hbWVzKCk7CitBcnJheVJlZjxFbnVtRW50cnk8dWludDMyX3Q+PiBnZXRDb21waWxlU3ltM0ZsYWdOYW1lcygpOworQXJyYXlSZWY8RW51bUVudHJ5PHVpbnQzMl90Pj4gZ2V0RmlsZUNoZWNrc3VtTmFtZXMoKTsKK0FycmF5UmVmPEVudW1FbnRyeTx1bnNpZ25lZD4+IGdldENQVVR5cGVOYW1lcygpOworQXJyYXlSZWY8RW51bUVudHJ5PHVpbnQzMl90Pj4gZ2V0RnJhbWVQcm9jU3ltRmxhZ05hbWVzKCk7CitBcnJheVJlZjxFbnVtRW50cnk8dWludDE2X3Q+PiBnZXRFeHBvcnRTeW1GbGFnTmFtZXMoKTsKK0FycmF5UmVmPEVudW1FbnRyeTx1aW50MzJfdD4+IGdldE1vZHVsZVN1YnN0cmVhbUtpbmROYW1lcygpOworQXJyYXlSZWY8RW51bUVudHJ5PHVpbnQ4X3Q+PiBnZXRUaHVua09yZGluYWxOYW1lcygpOworQXJyYXlSZWY8RW51bUVudHJ5PHVpbnQxNl90Pj4gZ2V0VHJhbXBvbGluZU5hbWVzKCk7CitBcnJheVJlZjxFbnVtRW50cnk8Q09GRjo6U2VjdGlvbkNoYXJhY3RlcmlzdGljcz4+CitnZXRJbWFnZVNlY3Rpb25DaGFyYWN0ZXJpc3RpY05hbWVzKCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0VOVU1UQUJMRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRm9ybWF0dGVycy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRm9ybWF0dGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OGFkMDIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Gb3JtYXR0ZXJzLmgKQEAgLTAsMCArMSw3MyBAQAorLy89PT0tIEZvcm1hdHRlcnMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19GT1JNQVRURVJTX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfRk9STUFUVEVSU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0dVSUQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSW5kZXguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0QWRhcHRlcnMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0VmFyaWFkaWMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK25hbWVzcGFjZSBkZXRhaWwgeworCitjbGFzcyBHdWlkQWRhcHRlciBmaW5hbCA6IHB1YmxpYyBGb3JtYXRBZGFwdGVyPEFycmF5UmVmPHVpbnQ4X3Q+PiB7CisgIEFycmF5UmVmPHVpbnQ4X3Q+IEd1aWQ7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgR3VpZEFkYXB0ZXIoQXJyYXlSZWY8dWludDhfdD4gR3VpZCk7CisgIGV4cGxpY2l0IEd1aWRBZGFwdGVyKFN0cmluZ1JlZiBHdWlkKTsKKworICB2b2lkIGZvcm1hdChyYXdfb3N0cmVhbSAmU3RyZWFtLCBTdHJpbmdSZWYgU3R5bGUpIG92ZXJyaWRlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAorCitpbmxpbmUgZGV0YWlsOjpHdWlkQWRhcHRlciBmbXRfZ3VpZChTdHJpbmdSZWYgSXRlbSkgeworICByZXR1cm4gZGV0YWlsOjpHdWlkQWRhcHRlcihJdGVtKTsKK30KKworaW5saW5lIGRldGFpbDo6R3VpZEFkYXB0ZXIgZm10X2d1aWQoQXJyYXlSZWY8dWludDhfdD4gSXRlbSkgeworICByZXR1cm4gZGV0YWlsOjpHdWlkQWRhcHRlcihJdGVtKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBmb3JtYXRfcHJvdmlkZXI8Y29kZXZpZXc6OlR5cGVJbmRleD4geworcHVibGljOgorICBzdGF0aWMgdm9pZCBmb3JtYXQoY29uc3QgY29kZXZpZXc6OlR5cGVJbmRleCAmViwgcmF3X29zdHJlYW0gJlN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTdHlsZSkgeworICAgIGlmIChWLmlzTm9uZVR5cGUoKSkKKyAgICAgIFN0cmVhbSA8PCAiPG5vIHR5cGU+IjsKKyAgICBlbHNlIHsKKyAgICAgIFN0cmVhbSA8PCBmb3JtYXR2KCJ7MDpYKzR9IiwgVi5nZXRJbmRleCgpKTsKKyAgICAgIGlmIChWLmlzU2ltcGxlKCkpCisgICAgICAgIFN0cmVhbSA8PCAiICgiIDw8IGNvZGV2aWV3OjpUeXBlSW5kZXg6OnNpbXBsZVR5cGVOYW1lKFYpIDw8ICIpIjsKKyAgICB9CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBmb3JtYXRfcHJvdmlkZXI8Y29kZXZpZXc6OkdVSUQ+IHsKKyAgc3RhdGljIHZvaWQgZm9ybWF0KGNvbnN0IGNvZGV2aWV3OjpHVUlEICZWLCBsbHZtOjpyYXdfb3N0cmVhbSAmU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFN0eWxlKSB7CisgICAgU3RyZWFtIDw8IFY7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19GT1JNQVRURVJTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0Z1bmN0aW9uSWQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0Z1bmN0aW9uSWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWYzZGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRnVuY3Rpb25JZC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8vPT09LSBGdW5jdGlvbklkLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfRlVOQ1RJT05JRF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0ZVTkNUSU9OSURfSAorCisjaW5jbHVkZSA8Y2ludHR5cGVzPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworCitjbGFzcyBGdW5jdGlvbklkIHsKK3B1YmxpYzoKKyAgRnVuY3Rpb25JZCgpIDogSW5kZXgoMCkge30KKworICBleHBsaWNpdCBGdW5jdGlvbklkKHVpbnQzMl90IEluZGV4KSA6IEluZGV4KEluZGV4KSB7fQorCisgIHVpbnQzMl90IGdldEluZGV4KCkgY29uc3QgeyByZXR1cm4gSW5kZXg7IH0KKworcHJpdmF0ZToKKyAgdWludDMyX3QgSW5kZXg7Cit9OworCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZ1bmN0aW9uSWQgJkEsIGNvbnN0IEZ1bmN0aW9uSWQgJkIpIHsKKyAgcmV0dXJuIEEuZ2V0SW5kZXgoKSA9PSBCLmdldEluZGV4KCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRnVuY3Rpb25JZCAmQSwgY29uc3QgRnVuY3Rpb25JZCAmQikgeworICByZXR1cm4gQS5nZXRJbmRleCgpICE9IEIuZ2V0SW5kZXgoKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEZ1bmN0aW9uSWQgJkEsIGNvbnN0IEZ1bmN0aW9uSWQgJkIpIHsKKyAgcmV0dXJuIEEuZ2V0SW5kZXgoKSA8IEIuZ2V0SW5kZXgoKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBGdW5jdGlvbklkICZBLCBjb25zdCBGdW5jdGlvbklkICZCKSB7CisgIHJldHVybiBBLmdldEluZGV4KCkgPD0gQi5nZXRJbmRleCgpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgRnVuY3Rpb25JZCAmQSwgY29uc3QgRnVuY3Rpb25JZCAmQikgeworICByZXR1cm4gQS5nZXRJbmRleCgpID4gQi5nZXRJbmRleCgpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KGNvbnN0IEZ1bmN0aW9uSWQgJkEsIGNvbnN0IEZ1bmN0aW9uSWQgJkIpIHsKKyAgcmV0dXJuIEEuZ2V0SW5kZXgoKSA+PSBCLmdldEluZGV4KCk7Cit9Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvR1VJRC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvR1VJRC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwNTVjZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9HVUlELmgKQEAgLTAsMCArMSw1NSBAQAorLy89PT0tIEdVSUQuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19HVUlEX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfR1VJRF9ICisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIHJhd19vc3RyZWFtOworCituYW1lc3BhY2UgY29kZXZpZXcgeworCisvLy8gVGhpcyByZXByZXNlbnRzIHRoZSAnR1VJRCcgdHlwZSBmcm9tIHdpbmRvd3MuaC4KK3N0cnVjdCBHVUlEIHsKKyAgdWludDhfdCBHdWlkWzE2XTsKK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgR1VJRCAmTEhTLCBjb25zdCBHVUlEICZSSFMpIHsKKyAgcmV0dXJuIDAgPT0gOjptZW1jbXAoTEhTLkd1aWQsIFJIUy5HdWlkLCBzaXplb2YoTEhTLkd1aWQpKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEdVSUQgJkxIUywgY29uc3QgR1VJRCAmUkhTKSB7CisgIHJldHVybiA6Om1lbWNtcChMSFMuR3VpZCwgUkhTLkd1aWQsIHNpemVvZihMSFMuR3VpZCkpIDwgMDsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBHVUlEICZMSFMsIGNvbnN0IEdVSUQgJlJIUykgeworICByZXR1cm4gOjptZW1jbXAoTEhTLkd1aWQsIFJIUy5HdWlkLCBzaXplb2YoTEhTLkd1aWQpKSA8PSAwOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj4oY29uc3QgR1VJRCAmTEhTLCBjb25zdCBHVUlEICZSSFMpIHsKKyAgcmV0dXJuICEoTEhTIDw9IFJIUyk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgR1VJRCAmTEhTLCBjb25zdCBHVUlEICZSSFMpIHsKKyAgcmV0dXJuICEoTEhTIDwgUkhTKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBHVUlEICZMSFMsIGNvbnN0IEdVSUQgJlJIUykgeworICByZXR1cm4gIShMSFMgPT0gUkhTKTsKK30KKworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBHVUlEICZHdWlkKTsKKworfSAvLyBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9HbG9iYWxUeXBlVGFibGVCdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9HbG9iYWxUeXBlVGFibGVCdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQ3MDQxNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0dsb2JhbFR5cGVUYWJsZUJ1aWxkZXIuaApAQCAtMCwwICsxLDEwMCBAQAorLy89PT0tIEdsb2JhbFR5cGVUYWJsZUJ1aWxkZXIuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19HTE9CQUxUWVBFVEFCTEVCVUlMREVSX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfR0xPQkFMVFlQRVRBQkxFQlVJTERFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1NpbXBsZVR5cGVTZXJpYWxpemVyLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUNvbGxlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSGFzaGluZy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVJbmRleC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgQ29udGludWF0aW9uUmVjb3JkQnVpbGRlcjsKKworY2xhc3MgR2xvYmFsVHlwZVRhYmxlQnVpbGRlciA6IHB1YmxpYyBUeXBlQ29sbGVjdGlvbiB7CisgIC8vLyBTdG9yYWdlIGZvciByZWNvcmRzLiAgVGhlc2UgbmVlZCB0byBvdXRsaXZlIHRoZSBUeXBlVGFibGVCdWlsZGVyLgorICBCdW1wUHRyQWxsb2NhdG9yICZSZWNvcmRTdG9yYWdlOworCisgIC8vLyBBIHNlcmlhbGl6ZXIgdGhhdCBjYW4gd3JpdGUgbm9uLWNvbnRpbnVhdGlvbiBsZWFmIHR5cGVzLiAgT25seSB1c2VkIGFzCisgIC8vLyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHNvIHRoYXQgd2UgY2FuIHByb3ZpZGUgYW4gaW50ZXJmYWNlIG1ldGhvZCB0bworICAvLy8gd3JpdGUgYW4gdW5zZXJpYWxpemVkIHJlY29yZC4KKyAgU2ltcGxlVHlwZVNlcmlhbGl6ZXIgU2ltcGxlU2VyaWFsaXplcjsKKworICAvLy8gSGFzaCB0YWJsZS4KKyAgRGVuc2VNYXA8R2xvYmFsbHlIYXNoZWRUeXBlLCBUeXBlSW5kZXg+IEhhc2hlZFJlY29yZHM7CisKKyAgLy8vIENvbnRhaW5zIGEgbGlzdCBvZiBhbGwgcmVjb3JkcyBpbmRleGVkIGJ5IFR5cGVJbmRleC50b0FycmF5SW5kZXgoKS4KKyAgU21hbGxWZWN0b3I8QXJyYXlSZWY8dWludDhfdD4sIDI+IFNlZW5SZWNvcmRzOworCisgIC8vLyBDb250YWlucyBhIGxpc3Qgb2YgYWxsIGhhc2ggdmFsdWVzIGluZXhlZCBieSBUeXBlSW5kZXgudG9BcnJheUluZGV4KCkuCisgIFNtYWxsVmVjdG9yPEdsb2JhbGx5SGFzaGVkVHlwZSwgMj4gU2Vlbkhhc2hlczsKKworcHVibGljOgorICBleHBsaWNpdCBHbG9iYWxUeXBlVGFibGVCdWlsZGVyKEJ1bXBQdHJBbGxvY2F0b3IgJlN0b3JhZ2UpOworICB+R2xvYmFsVHlwZVRhYmxlQnVpbGRlcigpOworCisgIC8vIFR5cGVUYWJsZUNvbGxlY3Rpb24gb3ZlcnJpZGVzCisgIE9wdGlvbmFsPFR5cGVJbmRleD4gZ2V0Rmlyc3QoKSBvdmVycmlkZTsKKyAgT3B0aW9uYWw8VHlwZUluZGV4PiBnZXROZXh0KFR5cGVJbmRleCBQcmV2KSBvdmVycmlkZTsKKyAgQ1ZUeXBlIGdldFR5cGUoVHlwZUluZGV4IEluZGV4KSBvdmVycmlkZTsKKyAgU3RyaW5nUmVmIGdldFR5cGVOYW1lKFR5cGVJbmRleCBJbmRleCkgb3ZlcnJpZGU7CisgIGJvb2wgY29udGFpbnMoVHlwZUluZGV4IEluZGV4KSBvdmVycmlkZTsKKyAgdWludDMyX3Qgc2l6ZSgpIG92ZXJyaWRlOworICB1aW50MzJfdCBjYXBhY2l0eSgpIG92ZXJyaWRlOworCisgIC8vIHB1YmxpYyBpbnRlcmZhY2UKKyAgdm9pZCByZXNldCgpOworICBUeXBlSW5kZXggbmV4dFR5cGVJbmRleCgpIGNvbnN0OworCisgIEJ1bXBQdHJBbGxvY2F0b3IgJmdldEFsbG9jYXRvcigpIHsgcmV0dXJuIFJlY29yZFN0b3JhZ2U7IH0KKworICBBcnJheVJlZjxBcnJheVJlZjx1aW50OF90Pj4gcmVjb3JkcygpIGNvbnN0OworICBBcnJheVJlZjxHbG9iYWxseUhhc2hlZFR5cGU+IGhhc2hlcygpIGNvbnN0OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDcmVhdGVGdW5jPgorICBUeXBlSW5kZXggaW5zZXJ0UmVjb3JkQXMoR2xvYmFsbHlIYXNoZWRUeXBlIEhhc2gsIHNpemVfdCBSZWNvcmRTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JlYXRlRnVuYyBDcmVhdGUpIHsKKyAgICBhdXRvIFJlc3VsdCA9IEhhc2hlZFJlY29yZHMudHJ5X2VtcGxhY2UoSGFzaCwgbmV4dFR5cGVJbmRleCgpKTsKKworICAgIGlmIChMTFZNX1VOTElLRUxZKFJlc3VsdC5zZWNvbmQpKSB7CisgICAgICB1aW50OF90ICpTdGFibGUgPSBSZWNvcmRTdG9yYWdlLkFsbG9jYXRlPHVpbnQ4X3Q+KFJlY29yZFNpemUpOworICAgICAgTXV0YWJsZUFycmF5UmVmPHVpbnQ4X3Q+IERhdGEoU3RhYmxlLCBSZWNvcmRTaXplKTsKKyAgICAgIFNlZW5SZWNvcmRzLnB1c2hfYmFjayhDcmVhdGUoRGF0YSkpOworICAgICAgU2Vlbkhhc2hlcy5wdXNoX2JhY2soSGFzaCk7CisgICAgfQorCisgICAgLy8gVXBkYXRlIHRoZSBjYWxsZXIncyBjb3B5IG9mIFJlY29yZCB0byBwb2ludCBhIHN0YWJsZSBjb3B5LgorICAgIHJldHVybiBSZXN1bHQuZmlyc3QtPnNlY29uZDsKKyAgfQorCisgIFR5cGVJbmRleCBpbnNlcnRSZWNvcmRCeXRlcyhBcnJheVJlZjx1aW50OF90PiBEYXRhKTsKKyAgVHlwZUluZGV4IGluc2VydFJlY29yZChDb250aW51YXRpb25SZWNvcmRCdWlsZGVyICZCdWlsZGVyKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVHlwZUluZGV4IHdyaXRlTGVhZlR5cGUoVCAmUmVjb3JkKSB7CisgICAgQXJyYXlSZWY8dWludDhfdD4gRGF0YSA9IFNpbXBsZVNlcmlhbGl6ZXIuc2VyaWFsaXplKFJlY29yZCk7CisgICAgcmV0dXJuIGluc2VydFJlY29yZEJ5dGVzKERhdGEpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19NRVJHSU5HVFlQRVRBQkxFQlVJTERFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9MYXp5UmFuZG9tVHlwZUNvbGxlY3Rpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0xhenlSYW5kb21UeXBlQ29sbGVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2ZDc4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9MYXp5UmFuZG9tVHlwZUNvbGxlY3Rpb24uaApAQCAtMCwwICsxLDExNiBAQAorLy89PT0tIExhenlSYW5kb21UeXBlQ29sbGVjdGlvbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19MQVpZUkFORE9NVFlQRUNPTExFQ1RJT05fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19MQVpZUkFORE9NVFlQRUNPTExFQ1RJT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUluZGV4LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtQXJyYXkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU3RyaW5nU2F2ZXIuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworLy8vIFxicmllZiBQcm92aWRlcyBhbW9ydGl6ZWQgTygxKSByYW5kb20gYWNjZXNzIHRvIGEgQ29kZVZpZXcgdHlwZSBzdHJlYW0uCisvLy8gTm9ybWFsbHkgdG8gYWNjZXNzIGEgdHlwZSBmcm9tIGEgdHlwZSBzdHJlYW0sIHlvdSBtdXN0IGtub3cgaXRzIGJ5dGUKKy8vLyBvZmZzZXQgaW50byB0aGUgdHlwZSBzdHJlYW0sIGJlY2F1c2UgdHlwZSByZWNvcmRzIGFyZSB2YXJpYWJsZS1sZW5ndGhlZC4KKy8vLyBIb3dldmVyLCB0aGlzIGlzIG5vdCB0aGUgd2F5IHdlIHByZWZlciB0byBhY2Nlc3MgdGhlbS4gIEZvciBleGFtcGxlLCBnaXZlbgorLy8vIGEgc3ltYm9sIHJlY29yZCBvbmUgb2YgdGhlIGZpZWxkcyBtYXkgYmUgdGhlIFR5cGVJbmRleCBvZiB0aGUgc3ltYm9sJ3MKKy8vLyB0eXBlIHJlY29yZC4gIE9yIGdpdmVuIGEgdHlwZSByZWNvcmQgc3VjaCBhcyBhbiBhcnJheSB0eXBlLCB0aGVyZSBtaWdodAorLy8vIGJlIGEgVHlwZUluZGV4IGZvciB0aGUgZWxlbWVudCB0eXBlLiAgU2VxdWVudGlhbCBhY2Nlc3MgaXMgcGVyZmVjdCB3aGVuCisvLy8gd2UncmUganVzdCBkdW1waW5nIGV2ZXJ5IGVudHJ5LCBidXQgaXQncyB2ZXJ5IHBvb3IgZm9yIHJlYWwgd29ybGQgdXNhZ2UuCisvLy8KKy8vLyBUeXBlIHN0cmVhbXMgaW4gUERCcyBjb250YWluIGFuIGFkZGl0aW9uYWwgZmllbGQgd2hpY2ggaXMgYSBsaXN0IG9mIHBhaXJzCisvLy8gY29udGFpbmluZyBpbmRpY2VzIGFuZCB0aGVpciBjb3JyZXNwb25kaW5nIG9mZnNldHMsIHJvdWdobHkgZXZlcnkgfjhLQiBvZgorLy8vIHJlY29yZCBkYXRhLiAgVGhpcyBnZW5lcmFsIGlkZWEgbmVlZCBub3QgYmUgY29uZmluZWQgdG8gUERCcyB0aG91Z2guICBCeQorLy8vIHN1cHBseWluZyBzdWNoIGFuIGFycmF5LCB0aGUgcHJvZHVjZXIgb2YgYSB0eXBlIHN0cmVhbSBjYW4gYWxsb3cgdGhlCisvLy8gY29uc3VtZXIgbXVjaCBiZXR0ZXIgYWNjZXNzIHRpbWUsIGJlY2F1c2UgdGhlIGNvbnN1bWVyIGNhbiBmaW5kIHRoZSBuZWFyZXN0CisvLy8gaW5kZXggaW4gdGhpcyBhcnJheSwgYW5kIGRvIGEgbGluZWFyIHNjYW4gZm9yd2FyZCBvbmx5IGZyb20gdGhlcmUuCisvLy8KKy8vLyBMYXp5UmFuZG9tVHlwZUNvbGxlY3Rpb24gaW1wbGVtZW50cyB0aGlzIGFsZ29yaXRobSwgYnV0IGFkZGl0aW9uYWxseSBnb2VzCisvLy8gb25lIHN0ZXAgZnVydGhlciBieSBjYWNoaW5nIG9mZnNldHMgb2YgZXZlcnkgcmVjb3JkIHRoYXQgaGFzIGJlZW4gdmlzaXRlZCBhdAorLy8vIGxlYXN0IG9uY2UuICBUaGlzIHdheSwgZXZlbiByZXBlYXRlZCB2aXNpdHMgb2YgdGhlIHNhbWUgcmVjb3JkIHdpbGwgbmV2ZXIKKy8vLyByZXF1aXJlIG1vcmUgdGhhbiBvbmUgbGluZWFyIHNjYW4uICBGb3IgYSB0eXBlIHN0cmVhbSBvZiBOIGVsZW1lbnRzIGRpdmlkZWQKKy8vLyBpbnRvIE0gY2h1bmtzIG9mIHJvdWdobHkgZXF1YWwgc2l6ZSwgdGhpcyB5aWVsZHMgYSB3b3JzdCBjYXNlIGxvb2t1cCB0aW1lCisvLy8gb2YgTyhOL00pIGFuZCBhbiBhbW9ydGl6ZWQgdGltZSBvZiBPKDEpLgorY2xhc3MgTGF6eVJhbmRvbVR5cGVDb2xsZWN0aW9uIDogcHVibGljIFR5cGVDb2xsZWN0aW9uIHsKKyAgdXNpbmcgUGFydGlhbE9mZnNldEFycmF5ID0gRml4ZWRTdHJlYW1BcnJheTxUeXBlSW5kZXhPZmZzZXQ+OworCisgIHN0cnVjdCBDYWNoZUVudHJ5IHsKKyAgICBDVlR5cGUgVHlwZTsKKyAgICB1aW50MzJfdCBPZmZzZXQ7CisgICAgU3RyaW5nUmVmIE5hbWU7CisgIH07CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgTGF6eVJhbmRvbVR5cGVDb2xsZWN0aW9uKHVpbnQzMl90IFJlY29yZENvdW50SGludCk7CisgIExhenlSYW5kb21UeXBlQ29sbGVjdGlvbihTdHJpbmdSZWYgRGF0YSwgdWludDMyX3QgUmVjb3JkQ291bnRIaW50KTsKKyAgTGF6eVJhbmRvbVR5cGVDb2xsZWN0aW9uKEFycmF5UmVmPHVpbnQ4X3Q+IERhdGEsIHVpbnQzMl90IFJlY29yZENvdW50SGludCk7CisgIExhenlSYW5kb21UeXBlQ29sbGVjdGlvbihjb25zdCBDVlR5cGVBcnJheSAmVHlwZXMsIHVpbnQzMl90IFJlY29yZENvdW50SGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpYWxPZmZzZXRBcnJheSBQYXJ0aWFsT2Zmc2V0cyk7CisgIExhenlSYW5kb21UeXBlQ29sbGVjdGlvbihjb25zdCBDVlR5cGVBcnJheSAmVHlwZXMsIHVpbnQzMl90IFJlY29yZENvdW50SGludCk7CisKKyAgdm9pZCByZXNldChBcnJheVJlZjx1aW50OF90PiBEYXRhLCB1aW50MzJfdCBSZWNvcmRDb3VudEhpbnQpOworICB2b2lkIHJlc2V0KFN0cmluZ1JlZiBEYXRhLCB1aW50MzJfdCBSZWNvcmRDb3VudEhpbnQpOworICB2b2lkIHJlc2V0KEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyLCB1aW50MzJfdCBSZWNvcmRDb3VudEhpbnQpOworCisgIHVpbnQzMl90IGdldE9mZnNldE9mVHlwZShUeXBlSW5kZXggSW5kZXgpOworCisgIE9wdGlvbmFsPENWVHlwZT4gdHJ5R2V0VHlwZShUeXBlSW5kZXggSW5kZXgpOworCisgIENWVHlwZSBnZXRUeXBlKFR5cGVJbmRleCBJbmRleCkgb3ZlcnJpZGU7CisgIFN0cmluZ1JlZiBnZXRUeXBlTmFtZShUeXBlSW5kZXggSW5kZXgpIG92ZXJyaWRlOworICBib29sIGNvbnRhaW5zKFR5cGVJbmRleCBJbmRleCkgb3ZlcnJpZGU7CisgIHVpbnQzMl90IHNpemUoKSBvdmVycmlkZTsKKyAgdWludDMyX3QgY2FwYWNpdHkoKSBvdmVycmlkZTsKKyAgT3B0aW9uYWw8VHlwZUluZGV4PiBnZXRGaXJzdCgpIG92ZXJyaWRlOworICBPcHRpb25hbDxUeXBlSW5kZXg+IGdldE5leHQoVHlwZUluZGV4IFByZXYpIG92ZXJyaWRlOworCitwcml2YXRlOgorICBFcnJvciBlbnN1cmVUeXBlRXhpc3RzKFR5cGVJbmRleCBJbmRleCk7CisgIHZvaWQgZW5zdXJlQ2FwYWNpdHlGb3IoVHlwZUluZGV4IEluZGV4KTsKKworICBFcnJvciB2aXNpdFJhbmdlRm9yVHlwZShUeXBlSW5kZXggVEkpOworICBFcnJvciBmdWxsU2NhbkZvclR5cGUoVHlwZUluZGV4IFRJKTsKKyAgdm9pZCB2aXNpdFJhbmdlKFR5cGVJbmRleCBCZWdpbiwgdWludDMyX3QgQmVnaW5PZmZzZXQsIFR5cGVJbmRleCBFbmQpOworCisgIC8vLyBOdW1iZXIgb2YgYWN0dWFsIHJlY29yZHMuCisgIHVpbnQzMl90IENvdW50ID0gMDsKKworICAvLy8gVGhlIGxhcmdlc3QgdHlwZSBpbmRleCB3aGljaCB3ZSd2ZSB2aXNpdGVkLgorICBUeXBlSW5kZXggTGFyZ2VzdFR5cGVJbmRleCA9IFR5cGVJbmRleDo6Tm9uZSgpOworCisgIEJ1bXBQdHJBbGxvY2F0b3IgQWxsb2NhdG9yOworICBTdHJpbmdTYXZlciBOYW1lU3RvcmFnZTsKKworICAvLy8gVGhlIHR5cGUgYXJyYXkgdG8gYWxsb3cgcmFuZG9tIGFjY2VzcyB2aXNpdGF0aW9uIG9mLgorICBDVlR5cGVBcnJheSBUeXBlczsKKworICBzdGQ6OnZlY3RvcjxDYWNoZUVudHJ5PiBSZWNvcmRzOworCisgIC8vLyBBbiBhcnJheSBvZiBpbmRleCBvZmZzZXRzIGZvciB0aGUgZ2l2ZW4gdHlwZSBzdHJlYW0sIGFsbG93aW5nIGxvZyhOKQorICAvLy8gbG9va3VwcyBvZiBhIHR5cGUgcmVjb3JkIGJ5IGluZGV4LiAgU2ltaWxhciB0byBLbm93bk9mZnNldHMgYnV0IG9ubHkKKyAgLy8vIGNvbnRhaW5zIG9mZnNldHMgZm9yIHNvbWUgdHlwZSBpbmRpY2VzLCBzb21lIG9mIHdoaWNoIG1heSBub3QgaGF2ZQorICAvLy8gZXZlciBiZWVuIHZpc2l0ZWQuCisgIFBhcnRpYWxPZmZzZXRBcnJheSBQYXJ0aWFsT2Zmc2V0czsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX0xBWllSQU5ET01UWVBFQ09MTEVDVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9MaW5lLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9MaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWMyMjljMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0xpbmUuaApAQCAtMCwwICsxLDEzMyBAQAorLy89PT0tIExpbmUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19MSU5FX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfTElORV9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSW5kZXguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSA8Y2ludHR5cGVzPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworCit1c2luZyBsbHZtOjpzdXBwb3J0Ojp1bGl0dGxlMzJfdDsKKworY2xhc3MgTGluZUluZm8geworcHVibGljOgorICBlbnVtIDogdWludDMyX3QgeworICAgIEFsd2F5c1N0ZXBJbnRvTGluZU51bWJlciA9IDB4ZmVlZmVlLAorICAgIE5ldmVyU3RlcEludG9MaW5lTnVtYmVyID0gMHhmMDBmMDAKKyAgfTsKKworICBlbnVtIDogaW50IHsgRW5kTGluZURlbHRhU2hpZnQgPSAyNCB9OworCisgIGVudW0gOiB1aW50MzJfdCB7CisgICAgU3RhcnRMaW5lTWFzayA9IDB4MDBmZmZmZmYsCisgICAgRW5kTGluZURlbHRhTWFzayA9IDB4N2YwMDAwMDAsCisgICAgU3RhdGVtZW50RmxhZyA9IDB4ODAwMDAwMDB1CisgIH07CisKKyAgTGluZUluZm8odWludDMyX3QgU3RhcnRMaW5lLCB1aW50MzJfdCBFbmRMaW5lLCBib29sIElzU3RhdGVtZW50KTsKKyAgTGluZUluZm8odWludDMyX3QgTGluZURhdGEpIDogTGluZURhdGEoTGluZURhdGEpIHt9CisKKyAgdWludDMyX3QgZ2V0U3RhcnRMaW5lKCkgY29uc3QgeyByZXR1cm4gTGluZURhdGEgJiBTdGFydExpbmVNYXNrOyB9CisKKyAgdWludDMyX3QgZ2V0TGluZURlbHRhKCkgY29uc3QgeworICAgIHJldHVybiAoTGluZURhdGEgJiBFbmRMaW5lRGVsdGFNYXNrKSA+PiBFbmRMaW5lRGVsdGFTaGlmdDsKKyAgfQorCisgIHVpbnQzMl90IGdldEVuZExpbmUoKSBjb25zdCB7IHJldHVybiBnZXRTdGFydExpbmUoKSArIGdldExpbmVEZWx0YSgpOyB9CisKKyAgYm9vbCBpc1N0YXRlbWVudCgpIGNvbnN0IHsgcmV0dXJuIChMaW5lRGF0YSAmIFN0YXRlbWVudEZsYWcpICE9IDA7IH0KKworICB1aW50MzJfdCBnZXRSYXdEYXRhKCkgY29uc3QgeyByZXR1cm4gTGluZURhdGE7IH0KKworICBib29sIGlzQWx3YXlzU3RlcEludG8oKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN0YXJ0TGluZSgpID09IEFsd2F5c1N0ZXBJbnRvTGluZU51bWJlcjsKKyAgfQorCisgIGJvb2wgaXNOZXZlclN0ZXBJbnRvKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdGFydExpbmUoKSA9PSBOZXZlclN0ZXBJbnRvTGluZU51bWJlcjsKKyAgfQorCitwcml2YXRlOgorICB1aW50MzJfdCBMaW5lRGF0YTsKK307CisKK2NsYXNzIENvbHVtbkluZm8geworcHJpdmF0ZToKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IFN0YXJ0Q29sdW1uTWFzayA9IDB4MDAwMGZmZmZ1OworICBzdGF0aWMgY29uc3QgdWludDMyX3QgRW5kQ29sdW1uTWFzayA9IDB4ZmZmZjAwMDB1OworICBzdGF0aWMgY29uc3QgaW50IEVuZENvbHVtblNoaWZ0ID0gMTY7CisKK3B1YmxpYzoKKyAgQ29sdW1uSW5mbyh1aW50MTZfdCBTdGFydENvbHVtbiwgdWludDE2X3QgRW5kQ29sdW1uKSB7CisgICAgQ29sdW1uRGF0YSA9CisgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzJfdD4oU3RhcnRDb2x1bW4pICYgU3RhcnRDb2x1bW5NYXNrKSB8CisgICAgICAgICgoc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEVuZENvbHVtbikgPDwgRW5kQ29sdW1uU2hpZnQpICYgRW5kQ29sdW1uTWFzayk7CisgIH0KKworICB1aW50MTZfdCBnZXRTdGFydENvbHVtbigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KENvbHVtbkRhdGEgJiBTdGFydENvbHVtbk1hc2spOworICB9CisKKyAgdWludDE2X3QgZ2V0RW5kQ29sdW1uKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTZfdD4oKENvbHVtbkRhdGEgJiBFbmRDb2x1bW5NYXNrKSA+PgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW5kQ29sdW1uU2hpZnQpOworICB9CisKKyAgdWludDMyX3QgZ2V0UmF3RGF0YSgpIGNvbnN0IHsgcmV0dXJuIENvbHVtbkRhdGE7IH0KKworcHJpdmF0ZToKKyAgdWludDMyX3QgQ29sdW1uRGF0YTsKK307CisKK2NsYXNzIExpbmUgeworcHJpdmF0ZToKKyAgaW50MzJfdCBDb2RlT2Zmc2V0OworICBMaW5lSW5mbyBMaW5lSW5mOworICBDb2x1bW5JbmZvIENvbHVtbkluZjsKKworcHVibGljOgorICBMaW5lKGludDMyX3QgQ29kZU9mZnNldCwgdWludDMyX3QgU3RhcnRMaW5lLCB1aW50MzJfdCBFbmRMaW5lLAorICAgICAgIHVpbnQxNl90IFN0YXJ0Q29sdW1uLCB1aW50MTZfdCBFbmRDb2x1bW4sIGJvb2wgSXNTdGF0ZW1lbnQpCisgICAgICA6IENvZGVPZmZzZXQoQ29kZU9mZnNldCksIExpbmVJbmYoU3RhcnRMaW5lLCBFbmRMaW5lLCBJc1N0YXRlbWVudCksCisgICAgICAgIENvbHVtbkluZihTdGFydENvbHVtbiwgRW5kQ29sdW1uKSB7fQorCisgIExpbmUoaW50MzJfdCBDb2RlT2Zmc2V0LCBMaW5lSW5mbyBMaW5lSW5mLCBDb2x1bW5JbmZvIENvbHVtbkluZikKKyAgICAgIDogQ29kZU9mZnNldChDb2RlT2Zmc2V0KSwgTGluZUluZihMaW5lSW5mKSwgQ29sdW1uSW5mKENvbHVtbkluZikge30KKworICBMaW5lSW5mbyBnZXRMaW5lSW5mbygpIGNvbnN0IHsgcmV0dXJuIExpbmVJbmY7IH0KKworICBDb2x1bW5JbmZvIGdldENvbHVtbkluZm8oKSBjb25zdCB7IHJldHVybiBDb2x1bW5JbmY7IH0KKworICBpbnQzMl90IGdldENvZGVPZmZzZXQoKSBjb25zdCB7IHJldHVybiBDb2RlT2Zmc2V0OyB9CisKKyAgdWludDMyX3QgZ2V0U3RhcnRMaW5lKCkgY29uc3QgeyByZXR1cm4gTGluZUluZi5nZXRTdGFydExpbmUoKTsgfQorCisgIHVpbnQzMl90IGdldExpbmVEZWx0YSgpIGNvbnN0IHsgcmV0dXJuIExpbmVJbmYuZ2V0TGluZURlbHRhKCk7IH0KKworICB1aW50MzJfdCBnZXRFbmRMaW5lKCkgY29uc3QgeyByZXR1cm4gTGluZUluZi5nZXRFbmRMaW5lKCk7IH0KKworICB1aW50MTZfdCBnZXRTdGFydENvbHVtbigpIGNvbnN0IHsgcmV0dXJuIENvbHVtbkluZi5nZXRTdGFydENvbHVtbigpOyB9CisKKyAgdWludDE2X3QgZ2V0RW5kQ29sdW1uKCkgY29uc3QgeyByZXR1cm4gQ29sdW1uSW5mLmdldEVuZENvbHVtbigpOyB9CisKKyAgYm9vbCBpc1N0YXRlbWVudCgpIGNvbnN0IHsgcmV0dXJuIExpbmVJbmYuaXNTdGF0ZW1lbnQoKTsgfQorCisgIGJvb2wgaXNBbHdheXNTdGVwSW50bygpIGNvbnN0IHsgcmV0dXJuIExpbmVJbmYuaXNBbHdheXNTdGVwSW50bygpOyB9CisKKyAgYm9vbCBpc05ldmVyU3RlcEludG8oKSBjb25zdCB7IHJldHVybiBMaW5lSW5mLmlzTmV2ZXJTdGVwSW50bygpOyB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBjb2RldmlldworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L01lcmdpbmdUeXBlVGFibGVCdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9NZXJnaW5nVHlwZVRhYmxlQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkwMzA5MTgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9NZXJnaW5nVHlwZVRhYmxlQnVpbGRlci5oCkBAIC0wLDAgKzEsODEgQEAKKy8vPT09LSBNZXJnaW5nVHlwZVRhYmxlQnVpbGRlci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKy0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfTUVSR0lOR1RZUEVUQUJMRUJVSUxERVJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19NRVJHSU5HVFlQRVRBQkxFQlVJTERFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1NpbXBsZVR5cGVTZXJpYWxpemVyLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUNvbGxlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSGFzaGluZy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVJbmRleC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgQ29udGludWF0aW9uUmVjb3JkQnVpbGRlcjsKKworY2xhc3MgTWVyZ2luZ1R5cGVUYWJsZUJ1aWxkZXIgOiBwdWJsaWMgVHlwZUNvbGxlY3Rpb24geworICAvLy8gU3RvcmFnZSBmb3IgcmVjb3Jkcy4gIFRoZXNlIG5lZWQgdG8gb3V0bGl2ZSB0aGUgVHlwZVRhYmxlQnVpbGRlci4KKyAgQnVtcFB0ckFsbG9jYXRvciAmUmVjb3JkU3RvcmFnZTsKKworICAvLy8gQSBzZXJpYWxpemVyIHRoYXQgY2FuIHdyaXRlIG5vbi1jb250aW51YXRpb24gbGVhZiB0eXBlcy4gIE9ubHkgdXNlZCBhcworICAvLy8gYSBjb252ZW5pZW5jZSBmdW5jdGlvbiBzbyB0aGF0IHdlIGNhbiBwcm92aWRlIGFuIGludGVyZmFjZSBtZXRob2QgdG8KKyAgLy8vIHdyaXRlIGFuIHVuc2VyaWFsaXplZCByZWNvcmQuCisgIFNpbXBsZVR5cGVTZXJpYWxpemVyIFNpbXBsZVNlcmlhbGl6ZXI7CisKKyAgLy8vIEhhc2ggdGFibGUuCisgIERlbnNlTWFwPExvY2FsbHlIYXNoZWRUeXBlLCBUeXBlSW5kZXg+IEhhc2hlZFJlY29yZHM7CisKKyAgLy8vIENvbnRhaW5zIGEgbGlzdCBvZiBhbGwgcmVjb3JkcyBpbmRleGVkIGJ5IFR5cGVJbmRleC50b0FycmF5SW5kZXgoKS4KKyAgU21hbGxWZWN0b3I8QXJyYXlSZWY8dWludDhfdD4sIDI+IFNlZW5SZWNvcmRzOworCitwdWJsaWM6CisgIGV4cGxpY2l0IE1lcmdpbmdUeXBlVGFibGVCdWlsZGVyKEJ1bXBQdHJBbGxvY2F0b3IgJlN0b3JhZ2UpOworICB+TWVyZ2luZ1R5cGVUYWJsZUJ1aWxkZXIoKTsKKworICAvLyBUeXBlVGFibGVDb2xsZWN0aW9uIG92ZXJyaWRlcworICBPcHRpb25hbDxUeXBlSW5kZXg+IGdldEZpcnN0KCkgb3ZlcnJpZGU7CisgIE9wdGlvbmFsPFR5cGVJbmRleD4gZ2V0TmV4dChUeXBlSW5kZXggUHJldikgb3ZlcnJpZGU7CisgIENWVHlwZSBnZXRUeXBlKFR5cGVJbmRleCBJbmRleCkgb3ZlcnJpZGU7CisgIFN0cmluZ1JlZiBnZXRUeXBlTmFtZShUeXBlSW5kZXggSW5kZXgpIG92ZXJyaWRlOworICBib29sIGNvbnRhaW5zKFR5cGVJbmRleCBJbmRleCkgb3ZlcnJpZGU7CisgIHVpbnQzMl90IHNpemUoKSBvdmVycmlkZTsKKyAgdWludDMyX3QgY2FwYWNpdHkoKSBvdmVycmlkZTsKKworICAvLyBwdWJsaWMgaW50ZXJmYWNlCisgIHZvaWQgcmVzZXQoKTsKKyAgVHlwZUluZGV4IG5leHRUeXBlSW5kZXgoKSBjb25zdDsKKworICBCdW1wUHRyQWxsb2NhdG9yICZnZXRBbGxvY2F0b3IoKSB7IHJldHVybiBSZWNvcmRTdG9yYWdlOyB9CisKKyAgQXJyYXlSZWY8QXJyYXlSZWY8dWludDhfdD4+IHJlY29yZHMoKSBjb25zdDsKKworICBUeXBlSW5kZXggaW5zZXJ0UmVjb3JkQXMoaGFzaF9jb2RlIEhhc2gsIEFycmF5UmVmPHVpbnQ4X3Q+ICZSZWNvcmQpOworICBUeXBlSW5kZXggaW5zZXJ0UmVjb3JkQnl0ZXMoQXJyYXlSZWY8dWludDhfdD4gJlJlY29yZCk7CisgIFR5cGVJbmRleCBpbnNlcnRSZWNvcmQoQ29udGludWF0aW9uUmVjb3JkQnVpbGRlciAmQnVpbGRlcik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFR5cGVJbmRleCB3cml0ZUxlYWZUeXBlKFQgJlJlY29yZCkgeworICAgIEFycmF5UmVmPHVpbnQ4X3Q+IERhdGEgPSBTaW1wbGVTZXJpYWxpemVyLnNlcmlhbGl6ZShSZWNvcmQpOworICAgIHJldHVybiBpbnNlcnRSZWNvcmRCeXRlcyhEYXRhKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfTUVSR0lOR1RZUEVUQUJMRUJVSUxERVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvUmVjb3JkTmFtZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvUmVjb3JkTmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwMjIxMDgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9SZWNvcmROYW1lLmgKQEAgLTAsMCArMSwyNCBAQAorLy89PT0tIFJlY29yZE5hbWUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICotIEMrKyAtLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19SRUNPUkROQU1FX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfUkVDT1JETkFNRV9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlQ29sbGVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVJbmRleC5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworc3RkOjpzdHJpbmcgY29tcHV0ZVR5cGVOYW1lKFR5cGVDb2xsZWN0aW9uICZUeXBlcywgVHlwZUluZGV4IEluZGV4KTsKK1N0cmluZ1JlZiBnZXRTeW1ib2xOYW1lKENWU3ltYm9sIFN5bSk7Cit9IC8vIG5hbWVzcGFjZSBjb2RldmlldworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1JlY29yZFNlcmlhbGl6YXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1JlY29yZFNlcmlhbGl6YXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODQ0OWMyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvUmVjb3JkU2VyaWFsaXphdGlvbi5oCkBAIC0wLDAgKzEsMjUxIEBACisvLz09PS0gUmVjb3JkU2VyaWFsaXphdGlvbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1JFQ09SRFNFUklBTElaQVRJT05fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19SRUNPUkRTRVJJQUxJWkFUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FQU0ludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlld0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlYWRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjaW50dHlwZXM+CisjaW5jbHVkZSA8dHVwbGU+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7Cit1c2luZyBsbHZtOjpzdXBwb3J0OjpsaXR0bGUzMl90OwordXNpbmcgbGx2bTo6c3VwcG9ydDo6dWxpdHRsZTE2X3Q7Cit1c2luZyBsbHZtOjpzdXBwb3J0Ojp1bGl0dGxlMzJfdDsKKworLy8vIExpbWl0IG9uIHRoZSBzaXplIG9mIGFsbCBjb2RldmlldyBzeW1ib2wgYW5kIHR5cGUgcmVjb3JkcywgaW5jbHVkaW5nIHRoZQorLy8vIFJlY29yZFByZWZpeC4gTVNWQyBkb2VzIG5vdCBlbWl0IGFueSByZWNvcmRzIGxhcmdlciB0aGFuIHRoaXMuCitlbnVtIDogdW5zaWduZWQgeyBNYXhSZWNvcmRMZW5ndGggPSAweEZGMDAgfTsKKworc3RydWN0IFJlY29yZFByZWZpeCB7CisgIHVsaXR0bGUxNl90IFJlY29yZExlbjsgIC8vIFJlY29yZCBsZW5ndGgsIHN0YXJ0aW5nIGZyb20gJlJlY29yZEtpbmQuCisgIHVsaXR0bGUxNl90IFJlY29yZEtpbmQ7IC8vIFJlY29yZCBraW5kIGVudW0gKFN5bVJlY29yZEtpbmQgb3IgVHlwZVJlY29yZEtpbmQpCit9OworCisvLy8gUmVpbnRlcnByZXQgYSBieXRlIGFycmF5IGFzIGFuIGFycmF5IG9mIGNoYXJhY3RlcnMuIERvZXMgbm90IGludGVycHJldCBhcworLy8vIGEgQyBzdHJpbmcsIGFzIFN0cmluZ1JlZiBoYXMgc2V2ZXJhbCBoZWxwZXJzIChzcGxpdCkgdGhhdCBtYWtlIHRoYXQgZWFzeS4KK1N0cmluZ1JlZiBnZXRCeXRlc0FzQ2hhcmFjdGVycyhBcnJheVJlZjx1aW50OF90PiBMZWFmRGF0YSk7CitTdHJpbmdSZWYgZ2V0Qnl0ZXNBc0NTdHJpbmcoQXJyYXlSZWY8dWludDhfdD4gTGVhZkRhdGEpOworCitpbmxpbmUgRXJyb3IgY29uc3VtZShCaW5hcnlTdHJlYW1SZWFkZXIgJlJlYWRlcikgeyByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsgfQorCisvLy8gRGVjb2RlcyBhIG51bWVyaWMgImxlYWYiIHZhbHVlLiBUaGVzZSBhcmUgaW50ZWdlciBsaXRlcmFscyBlbmNvdW50ZXJlZCBpbgorLy8vIHRoZSB0eXBlIHN0cmVhbS4gSWYgdGhlIHZhbHVlIGlzIHBvc2l0aXZlIGFuZCBsZXNzIHRoYW4gTEZfTlVNRVJJQyAoMSA8PAorLy8vIDE1KSwgaXQgaXMgZW1pdHRlZCBkaXJlY3RseSBpbiBEYXRhLiBPdGhlcndpc2UsIGl0IGhhcyBhIHRhZyBsaWtlIExGX0NIQVIKKy8vLyB0aGF0IGluZGljYXRlcyB0aGUgYml0d2lkdGggYW5kIHNpZ24gb2YgdGhlIG51bWVyaWMgZGF0YS4KK0Vycm9yIGNvbnN1bWUoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIsIEFQU0ludCAmTnVtKTsKKworLy8vIERlY29kZXMgYSBudW1lcmljIGxlYWYgdmFsdWUgdGhhdCBpcyBrbm93biB0byBiZSBhIHBhcnRpY3VsYXIgdHlwZS4KK0Vycm9yIGNvbnN1bWVfbnVtZXJpYyhCaW5hcnlTdHJlYW1SZWFkZXIgJlJlYWRlciwgdWludDY0X3QgJlZhbHVlKTsKKworLy8vIERlY29kZXMgc2lnbmVkIGFuZCB1bnNpZ25lZCBmaXhlZC1sZW5ndGggaW50ZWdlcnMuCitFcnJvciBjb25zdW1lKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyLCB1aW50MzJfdCAmSXRlbSk7CitFcnJvciBjb25zdW1lKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyLCBpbnQzMl90ICZJdGVtKTsKKworLy8vIERlY29kZXMgYSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nLgorRXJyb3IgY29uc3VtZShCaW5hcnlTdHJlYW1SZWFkZXIgJlJlYWRlciwgU3RyaW5nUmVmICZJdGVtKTsKKworRXJyb3IgY29uc3VtZShTdHJpbmdSZWYgJkRhdGEsIEFQU0ludCAmTnVtKTsKK0Vycm9yIGNvbnN1bWUoU3RyaW5nUmVmICZEYXRhLCB1aW50MzJfdCAmSXRlbSk7CisKKy8vLyBEZWNvZGVzIGFuIGFyYml0cmFyeSBvYmplY3Qgd2hvc2UgbGF5b3V0IG1hdGNoZXMgdGhhdCBvZiB0aGUgdW5kZXJseWluZworLy8vIGJ5dGUgc2VxdWVuY2UsIGFuZCByZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgb2JqZWN0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEVycm9yIGNvbnN1bWUoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIsIFQgKiZJdGVtKSB7CisgIHJldHVybiBSZWFkZXIucmVhZE9iamVjdChJdGVtKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IHN0cnVjdCBzZXJpYWxpemVfY29uZGl0aW9uYWxfaW1wbCB7CisgIHNlcmlhbGl6ZV9jb25kaXRpb25hbF9pbXBsKFQgJkl0ZW0sIFUgRnVuYykgOiBJdGVtKEl0ZW0pLCBGdW5jKEZ1bmMpIHt9CisKKyAgRXJyb3IgZGVzZXJpYWxpemUoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIpIGNvbnN0IHsKKyAgICBpZiAoIUZ1bmMoKSkKKyAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICAgIHJldHVybiBjb25zdW1lKFJlYWRlciwgSXRlbSk7CisgIH0KKworICBUICZJdGVtOworICBVIEZ1bmM7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3NlcmlhbGl6ZV9jb25kaXRpb25hbF9pbXBsPFQsIFU+IHNlcmlhbGl6ZV9jb25kaXRpb25hbChUICZJdGVtLCBVIEZ1bmMpIHsKKyAgcmV0dXJuIHNlcmlhbGl6ZV9jb25kaXRpb25hbF9pbXBsPFQsIFU+KEl0ZW0sIEZ1bmMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4gc3RydWN0IHNlcmlhbGl6ZV9hcnJheV9pbXBsIHsKKyAgc2VyaWFsaXplX2FycmF5X2ltcGwoQXJyYXlSZWY8VD4gJkl0ZW0sIFUgRnVuYykgOiBJdGVtKEl0ZW0pLCBGdW5jKEZ1bmMpIHt9CisKKyAgRXJyb3IgZGVzZXJpYWxpemUoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVhZGVyLnJlYWRBcnJheShJdGVtLCBGdW5jKCkpOworICB9CisKKyAgQXJyYXlSZWY8VD4gJkl0ZW07CisgIFUgRnVuYzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3Qgc2VyaWFsaXplX3ZlY3Rvcl90YWlsX2ltcGwgeworICBzZXJpYWxpemVfdmVjdG9yX3RhaWxfaW1wbChzdGQ6OnZlY3RvcjxUPiAmSXRlbSkgOiBJdGVtKEl0ZW0pIHt9CisKKyAgRXJyb3IgZGVzZXJpYWxpemUoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIpIGNvbnN0IHsKKyAgICBUIEZpZWxkOworICAgIC8vIFN0b3Agd2hlbiB3ZSBydW4gb3V0IG9mIGJ5dGVzIG9yIHdlIGhpdCByZWNvcmQgcGFkZGluZyBieXRlcy4KKyAgICB3aGlsZSAoIVJlYWRlci5lbXB0eSgpICYmIFJlYWRlci5wZWVrKCkgPCBMRl9QQUQwKSB7CisgICAgICBpZiAoYXV0byBFQyA9IGNvbnN1bWUoUmVhZGVyLCBGaWVsZCkpCisgICAgICAgIHJldHVybiBFQzsKKyAgICAgIEl0ZW0ucHVzaF9iYWNrKEZpZWxkKTsKKyAgICB9CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBzdGQ6OnZlY3RvcjxUPiAmSXRlbTsKK307CisKK3N0cnVjdCBzZXJpYWxpemVfbnVsbF90ZXJtX3N0cmluZ19hcnJheV9pbXBsIHsKKyAgc2VyaWFsaXplX251bGxfdGVybV9zdHJpbmdfYXJyYXlfaW1wbChzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+ICZJdGVtKQorICAgICAgOiBJdGVtKEl0ZW0pIHt9CisKKyAgRXJyb3IgZGVzZXJpYWxpemUoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIpIGNvbnN0IHsKKyAgICBpZiAoUmVhZGVyLmVtcHR5KCkpCisgICAgICByZXR1cm4gbWFrZV9lcnJvcjxDb2RlVmlld0Vycm9yPihjdl9lcnJvcl9jb2RlOjppbnN1ZmZpY2llbnRfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk51bGwgdGVybWluYXRlZCBzdHJpbmcgaXMgZW1wdHkhIik7CisKKyAgICB3aGlsZSAoUmVhZGVyLnBlZWsoKSAhPSAwKSB7CisgICAgICBTdHJpbmdSZWYgRmllbGQ7CisgICAgICBpZiAoYXV0byBFQyA9IFJlYWRlci5yZWFkQ1N0cmluZyhGaWVsZCkpCisgICAgICAgIHJldHVybiBFQzsKKyAgICAgIEl0ZW0ucHVzaF9iYWNrKEZpZWxkKTsKKyAgICB9CisgICAgcmV0dXJuIFJlYWRlci5za2lwKDEpOworICB9CisKKyAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiAmSXRlbTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3Qgc2VyaWFsaXplX2FycmF5cmVmX3RhaWxfaW1wbCB7CisgIHNlcmlhbGl6ZV9hcnJheXJlZl90YWlsX2ltcGwoQXJyYXlSZWY8VD4gJkl0ZW0pIDogSXRlbShJdGVtKSB7fQorCisgIEVycm9yIGRlc2VyaWFsaXplKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyKSBjb25zdCB7CisgICAgdWludDMyX3QgQ291bnQgPSBSZWFkZXIuYnl0ZXNSZW1haW5pbmcoKSAvIHNpemVvZihUKTsKKyAgICByZXR1cm4gUmVhZGVyLnJlYWRBcnJheShJdGVtLCBDb3VudCk7CisgIH0KKworICBBcnJheVJlZjxUPiAmSXRlbTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3Qgc2VyaWFsaXplX251bWVyaWNfaW1wbCB7CisgIHNlcmlhbGl6ZV9udW1lcmljX2ltcGwoVCAmSXRlbSkgOiBJdGVtKEl0ZW0pIHt9CisKKyAgRXJyb3IgZGVzZXJpYWxpemUoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3VtZV9udW1lcmljKFJlYWRlciwgSXRlbSk7CisgIH0KKworICBUICZJdGVtOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitzZXJpYWxpemVfYXJyYXlfaW1wbDxULCBVPiBzZXJpYWxpemVfYXJyYXkoQXJyYXlSZWY8VD4gJkl0ZW0sIFUgRnVuYykgeworICByZXR1cm4gc2VyaWFsaXplX2FycmF5X2ltcGw8VCwgVT4oSXRlbSwgRnVuYyk7Cit9CisKK2lubGluZSBzZXJpYWxpemVfbnVsbF90ZXJtX3N0cmluZ19hcnJheV9pbXBsCitzZXJpYWxpemVfbnVsbF90ZXJtX3N0cmluZ19hcnJheShzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+ICZJdGVtKSB7CisgIHJldHVybiBzZXJpYWxpemVfbnVsbF90ZXJtX3N0cmluZ19hcnJheV9pbXBsKEl0ZW0pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3NlcmlhbGl6ZV92ZWN0b3JfdGFpbF9pbXBsPFQ+IHNlcmlhbGl6ZV9hcnJheV90YWlsKHN0ZDo6dmVjdG9yPFQ+ICZJdGVtKSB7CisgIHJldHVybiBzZXJpYWxpemVfdmVjdG9yX3RhaWxfaW1wbDxUPihJdGVtKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzZXJpYWxpemVfYXJyYXlyZWZfdGFpbF9pbXBsPFQ+IHNlcmlhbGl6ZV9hcnJheV90YWlsKEFycmF5UmVmPFQ+ICZJdGVtKSB7CisgIHJldHVybiBzZXJpYWxpemVfYXJyYXlyZWZfdGFpbF9pbXBsPFQ+KEl0ZW0pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc2VyaWFsaXplX251bWVyaWNfaW1wbDxUPiBzZXJpYWxpemVfbnVtZXJpYyhUICZJdGVtKSB7CisgIHJldHVybiBzZXJpYWxpemVfbnVtZXJpY19pbXBsPFQ+KEl0ZW0pOworfQorCisvLyBUaGlzIGZpZWxkIGlzIG9ubHkgcHJlc2VudCBpbiB0aGUgYnl0ZSByZWNvcmQgaWYgdGhlIGNvbmRpdGlvbiBpcyB0cnVlLiAgVGhlCisvLyBjb25kaXRpb24gaXMgZXZhbHVhdGVkIGxhemlseSwgc28gaXQgY2FuIGRlcGVuZCBvbiBpdGVtcyB0aGF0IHdlcmUKKy8vIGRlc2VyaWFsaXplZAorLy8gZWFybGllci4KKyNkZWZpbmUgQ1ZfQ09ORElUSU9OQUxfRklFTEQoSSwgQykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHNlcmlhbGl6ZV9jb25kaXRpb25hbChJLCBbJl0oKSB7IHJldHVybiAhIShDKTsgfSkKKworLy8gVGhpcyBpcyBhbiBhcnJheSBvZiBOIGl0ZW1zLCB3aGVyZSBOIGlzIGV2YWx1YXRlZCBsYXppbHksIHNvIGl0IGNhbiByZWZlcgorLy8gdG8gYSBmaWVsZCBkZXNlcmlhbGl6ZWQgZWFybGllci4KKyNkZWZpbmUgQ1ZfQVJSQVlfRklFTERfTihJLCBOKSBzZXJpYWxpemVfYXJyYXkoSSwgWyZdKCkgeyByZXR1cm4gTjsgfSkKKworLy8gVGhpcyBpcyBhbiBhcnJheSB0aGF0IGV4aGF1c3RzIHRoZSByZW1haW5kZXIgb2YgdGhlIGlucHV0IGJ1ZmZlci4KKyNkZWZpbmUgQ1ZfQVJSQVlfRklFTERfVEFJTChJKSBzZXJpYWxpemVfYXJyYXlfdGFpbChJKQorCisvLyBUaGlzIGlzIGFuIGFycmF5IHRoYXQgY29uc3VtZXMgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZ3MgdW50aWwgYSBkb3VibGUgbnVsbAorLy8gaXMgZW5jb3VudGVyZWQuCisjZGVmaW5lIENWX1NUUklOR19BUlJBWV9OVUxMX1RFUk0oSSkgc2VyaWFsaXplX251bGxfdGVybV9zdHJpbmdfYXJyYXkoSSkKKworI2RlZmluZSBDVl9OVU1FUklDX0ZJRUxEKEkpIHNlcmlhbGl6ZV9udW1lcmljKEkpCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorRXJyb3IgY29uc3VtZShCaW5hcnlTdHJlYW1SZWFkZXIgJlJlYWRlciwKKyAgICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplX2NvbmRpdGlvbmFsX2ltcGw8VCwgVT4gJkl0ZW0pIHsKKyAgcmV0dXJuIEl0ZW0uZGVzZXJpYWxpemUoUmVhZGVyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitFcnJvciBjb25zdW1lKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyLAorICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVfYXJyYXlfaW1wbDxULCBVPiAmSXRlbSkgeworICByZXR1cm4gSXRlbS5kZXNlcmlhbGl6ZShSZWFkZXIpOworfQorCitpbmxpbmUgRXJyb3IgY29uc3VtZShCaW5hcnlTdHJlYW1SZWFkZXIgJlJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZV9udWxsX3Rlcm1fc3RyaW5nX2FycmF5X2ltcGwgJkl0ZW0pIHsKKyAgcmV0dXJuIEl0ZW0uZGVzZXJpYWxpemUoUmVhZGVyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitFcnJvciBjb25zdW1lKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyLAorICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVfdmVjdG9yX3RhaWxfaW1wbDxUPiAmSXRlbSkgeworICByZXR1cm4gSXRlbS5kZXNlcmlhbGl6ZShSZWFkZXIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK0Vycm9yIGNvbnN1bWUoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIsCisgICAgICAgICAgICAgIGNvbnN0IHNlcmlhbGl6ZV9hcnJheXJlZl90YWlsX2ltcGw8VD4gJkl0ZW0pIHsKKyAgcmV0dXJuIEl0ZW0uZGVzZXJpYWxpemUoUmVhZGVyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitFcnJvciBjb25zdW1lKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyLAorICAgICAgICAgICAgICBjb25zdCBzZXJpYWxpemVfbnVtZXJpY19pbXBsPFQ+ICZJdGVtKSB7CisgIHJldHVybiBJdGVtLmRlc2VyaWFsaXplKFJlYWRlcik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVLCB0eXBlbmFtZS4uLiBBcmdzPgorRXJyb3IgY29uc3VtZShCaW5hcnlTdHJlYW1SZWFkZXIgJlJlYWRlciwgVCAmJlgsIFUgJiZZLCBBcmdzICYmLi4uIFJlc3QpIHsKKyAgaWYgKGF1dG8gRUMgPSBjb25zdW1lKFJlYWRlciwgWCkpCisgICAgcmV0dXJuIEVDOworICByZXR1cm4gY29uc3VtZShSZWFkZXIsIFksIHN0ZDo6Zm9yd2FyZDxBcmdzPihSZXN0KS4uLik7Cit9CisKKyNkZWZpbmUgQ1ZfREVTRVJJQUxJWkUoLi4uKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlmIChhdXRvIEVDID0gY29uc3VtZShfX1ZBX0FSR1NfXykpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBzdGQ6Om1vdmUoRUMpOworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1NpbXBsZVR5cGVTZXJpYWxpemVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TaW1wbGVUeXBlU2VyaWFsaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NWQ5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TaW1wbGVUeXBlU2VyaWFsaXplci5oCkBAIC0wLDAgKzEsNTMgQEAKKy8vPT09LSBTaW1wbGVUeXBlU2VyaWFsaXplci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfU0lNUExFVFlQRVNFUklBTElaRVJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TSU1QTEVUWVBFU0VSSUFMSVpFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1JlY29yZFNlcmlhbGl6YXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSW5kZXguaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVJlY29yZE1hcHBpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlVmlzaXRvckNhbGxiYWNrcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5Qnl0ZVN0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1Xcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgU2ltcGxlVHlwZVNlcmlhbGl6ZXIgeworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBTY3JhdGNoQnVmZmVyOworCitwdWJsaWM6CisgIFNpbXBsZVR5cGVTZXJpYWxpemVyKCk7CisgIH5TaW1wbGVUeXBlU2VyaWFsaXplcigpOworCisgIC8vIFRoaXMgdGVtcGxhdGUgaXMgZXhwbGljaXRseSBpbnN0YW50aWF0ZWQgaW4gdGhlIGltcGxlbWVudGF0aW9uIGZpbGUgZm9yIGFsbAorICAvLyBzdXBwb3J0ZWQgdHlwZXMuICBUaGUgbWV0aG9kIGl0c2VsZiBpcyB1Z2x5LCBzbyBpbmxpbmluZyBpdCBpbnRvIHRoZSBoZWFkZXIKKyAgLy8gZmlsZSBjbHV0dGVycyBhbiBvdGhlcndpc2Ugc3RyYWlnaHRmb3J3YXJkIGludGVyZmFjZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEFycmF5UmVmPHVpbnQ4X3Q+IHNlcmlhbGl6ZShUICZSZWNvcmQpOworCisgIC8vIERvbid0IGFsbG93IHNlcmlhbGl6YXRpb24gb2YgZmllbGQgbGlzdCByZWNvcmRzIHVzaW5nIHRoaXMgaW50ZXJmYWNlLgorICBBcnJheVJlZjx1aW50OF90PiBzZXJpYWxpemUoY29uc3QgRmllbGRMaXN0UmVjb3JkICZSZWNvcmQpID0gZGVsZXRlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfU0lNUExFVFlQRVNFUklBTElaRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3RyaW5nc0FuZENoZWNrc3Vtcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3RyaW5nc0FuZENoZWNrc3Vtcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYTMzM2UKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TdHJpbmdzQW5kQ2hlY2tzdW1zLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8vPT09LSBTdHJpbmdzQW5kQ2hlY2tzdW1zLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfU1RSSU5HU0FORENIRUNLU1VNU19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1NUUklOR1NBTkRDSEVDS1NVTVNfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9EZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3Vic2VjdGlvblJlY29yZC5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgU3RyaW5nc0FuZENoZWNrc3Vtc1JlZiB7CitwdWJsaWM6CisgIC8vIElmIG5vIHN1YnNlY3Rpb25zIGFyZSBrbm93biBhYm91dCBpbml0aWFsbHksIHdlIGZpbmQgYXMgbXVjaCBhcyB3ZSBjYW4uCisgIFN0cmluZ3NBbmRDaGVja3N1bXNSZWYoKTsKKworICAvLyBJZiBvbmx5IGEgc3RyaW5nIHRhYmxlIHN1YnNlY3Rpb24gaXMgZ2l2ZW4sIHdlIGZpbmQgYSBjaGVja3N1bXMgc3Vic2VjdGlvbi4KKyAgZXhwbGljaXQgU3RyaW5nc0FuZENoZWNrc3Vtc1JlZihjb25zdCBEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvblJlZiAmU3RyaW5ncyk7CisKKyAgLy8gSWYgYm90aCBzdWJzZWN0aW9ucyBhcmUgZ2l2ZW4sIHdlIGRvbid0IG5lZWQgdG8gZmluZCBhbnl0aGluZy4KKyAgU3RyaW5nc0FuZENoZWNrc3Vtc1JlZihjb25zdCBEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvblJlZiAmU3RyaW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb25SZWYgJkNoZWNrc3Vtcyk7CisKKyAgdm9pZCBzZXRTdHJpbmdzKGNvbnN0IERlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uUmVmICZTdHJpbmdzKTsKKyAgdm9pZCBzZXRDaGVja3N1bXMoY29uc3QgRGVidWdDaGVja3N1bXNTdWJzZWN0aW9uUmVmICZDUyk7CisKKyAgdm9pZCByZXNldCgpOworICB2b2lkIHJlc2V0U3RyaW5ncygpOworICB2b2lkIHJlc2V0Q2hlY2tzdW1zKCk7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgaW5pdGlhbGl6ZShUICYmRnJhZ21lbnRSYW5nZSkgeworICAgIGZvciAoY29uc3QgRGVidWdTdWJzZWN0aW9uUmVjb3JkICZSIDogRnJhZ21lbnRSYW5nZSkgeworICAgICAgaWYgKFN0cmluZ3MgJiYgQ2hlY2tzdW1zKQorICAgICAgICByZXR1cm47CisgICAgICBpZiAoUi5raW5kKCkgPT0gRGVidWdTdWJzZWN0aW9uS2luZDo6RmlsZUNoZWNrc3VtcykgeworICAgICAgICBpbml0aWFsaXplQ2hlY2tzdW1zKFIpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChSLmtpbmQoKSA9PSBEZWJ1Z1N1YnNlY3Rpb25LaW5kOjpTdHJpbmdUYWJsZSAmJiAhU3RyaW5ncykgeworICAgICAgICAvLyBXaGlsZSBpbiBwcmFjdGljZSB3ZSBzaG91bGQgbmV2ZXIgZW5jb3VudGVyIGEgc3RyaW5nIHRhYmxlIGV2ZW4KKyAgICAgICAgLy8gdGhvdWdoIHRoZSBzdHJpbmcgdGFibGUgaXMgYWxyZWFkeSBpbml0aWFsaXplZCwgaW4gdGhlb3J5IGl0J3MKKyAgICAgICAgLy8gcG9zc2libGUuICBQREJzIGFyZSBzdXBwb3NlZCB0byBoYXZlIG9uZSBnbG9iYWwgc3RyaW5nIHRhYmxlIGFuZAorICAgICAgICAvLyB0aGVuIHRoaXMgc3Vic2VjdGlvbiBzaG91bGQgbm90IGFwcGVhci4gIFdoZXJlYXMgb2JqZWN0IGZpbGVzIGFyZQorICAgICAgICAvLyBzdXBwb3NlZCB0byBoYXZlIHRoaXMgc3Vic2VjdGlvbiBhcHBlYXIgZXhhY3RseSBvbmNlLiAgSG93ZXZlciwKKyAgICAgICAgLy8gZm9yIHRlc3RpbmcgcHVycG9zZXMgaXQncyBuaWNlIHRvIGJlIGFibGUgdG8gdGVzdCB0aGlzIHN1YnNlY3Rpb24KKyAgICAgICAgLy8gaW5kZXBlbmRlbnRseSBvZiBvbmUgZm9ybWF0IG9yIHRoZSBvdGhlciwgc28gZm9yIHNvbWUgdGVzdHMgd2UKKyAgICAgICAgLy8gbWFudWFsbHkgY29uc3RydWN0IGEgUERCIHRoYXQgY29udGFpbnMgdGhpcyBzdWJzZWN0aW9uIGluIGFkZGl0aW9uCisgICAgICAgIC8vIHRvIGEgZ2xvYmFsIHN0cmluZyB0YWJsZS4KKyAgICAgICAgaW5pdGlhbGl6ZVN0cmluZ3MoUik7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGNvbnN0IERlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uUmVmICZzdHJpbmdzKCkgY29uc3QgeyByZXR1cm4gKlN0cmluZ3M7IH0KKyAgY29uc3QgRGVidWdDaGVja3N1bXNTdWJzZWN0aW9uUmVmICZjaGVja3N1bXMoKSBjb25zdCB7IHJldHVybiAqQ2hlY2tzdW1zOyB9CisKKyAgYm9vbCBoYXNTdHJpbmdzKCkgY29uc3QgeyByZXR1cm4gU3RyaW5ncyAhPSBudWxscHRyOyB9CisgIGJvb2wgaGFzQ2hlY2tzdW1zKCkgY29uc3QgeyByZXR1cm4gQ2hlY2tzdW1zICE9IG51bGxwdHI7IH0KKworcHJpdmF0ZToKKyAgdm9pZCBpbml0aWFsaXplU3RyaW5ncyhjb25zdCBEZWJ1Z1N1YnNlY3Rpb25SZWNvcmQgJlNSKTsKKyAgdm9pZCBpbml0aWFsaXplQ2hlY2tzdW1zKGNvbnN0IERlYnVnU3Vic2VjdGlvblJlY29yZCAmRkNSKTsKKworICBzdGQ6OnNoYXJlZF9wdHI8RGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb25SZWY+IE93bmVkU3RyaW5nczsKKyAgc3RkOjpzaGFyZWRfcHRyPERlYnVnQ2hlY2tzdW1zU3Vic2VjdGlvblJlZj4gT3duZWRDaGVja3N1bXM7CisKKyAgY29uc3QgRGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb25SZWYgKlN0cmluZ3MgPSBudWxscHRyOworICBjb25zdCBEZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb25SZWYgKkNoZWNrc3VtcyA9IG51bGxwdHI7Cit9OworCitjbGFzcyBTdHJpbmdzQW5kQ2hlY2tzdW1zIHsKK3B1YmxpYzoKKyAgdXNpbmcgU3RyaW5nc1B0ciA9IHN0ZDo6c2hhcmVkX3B0cjxEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvbj47CisgIHVzaW5nIENoZWNrc3Vtc1B0ciA9IHN0ZDo6c2hhcmVkX3B0cjxEZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb24+OworCisgIC8vIElmIG5vIHN1YnNlY3Rpb25zIGFyZSBrbm93biBhYm91dCBpbml0aWFsbHksIHdlIGZpbmQgYXMgbXVjaCBhcyB3ZSBjYW4uCisgIFN0cmluZ3NBbmRDaGVja3N1bXMoKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBzZXRTdHJpbmdzKGNvbnN0IFN0cmluZ3NQdHIgJlNQKSB7IFN0cmluZ3MgPSBTUDsgfQorICB2b2lkIHNldENoZWNrc3Vtcyhjb25zdCBDaGVja3N1bXNQdHIgJkNQKSB7IENoZWNrc3VtcyA9IENQOyB9CisKKyAgY29uc3QgU3RyaW5nc1B0ciAmc3RyaW5ncygpIGNvbnN0IHsgcmV0dXJuIFN0cmluZ3M7IH0KKyAgY29uc3QgQ2hlY2tzdW1zUHRyICZjaGVja3N1bXMoKSBjb25zdCB7IHJldHVybiBDaGVja3N1bXM7IH0KKworICBib29sIGhhc1N0cmluZ3MoKSBjb25zdCB7IHJldHVybiBTdHJpbmdzICE9IG51bGxwdHI7IH0KKyAgYm9vbCBoYXNDaGVja3N1bXMoKSBjb25zdCB7IHJldHVybiBDaGVja3N1bXMgIT0gbnVsbHB0cjsgfQorCitwcml2YXRlOgorICBTdHJpbmdzUHRyIFN0cmluZ3M7CisgIENoZWNrc3Vtc1B0ciBDaGVja3N1bXM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TVFJJTkdTQU5EQ0hFQ0tTVU1TX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbERlc2VyaWFsaXplci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sRGVzZXJpYWxpemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjU0NzlkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbERlc2VyaWFsaXplci5oCkBAIC0wLDAgKzEsMTAwIEBACisvLz09PS0gU3ltYm9sRGVzZXJpYWxpemVyLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1NZTUJPTERFU0VSSUFMSVpFUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1NZTUJPTERFU0VSSUFMSVpFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFJlY29yZE1hcHBpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xWaXNpdG9yQ2FsbGJhY2tzLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sVmlzaXRvckRlbGVnYXRlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeUJ5dGVTdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVhZGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CitjbGFzcyBTeW1ib2xWaXNpdG9yRGVsZWdhdGU7CitjbGFzcyBTeW1ib2xEZXNlcmlhbGl6ZXIgOiBwdWJsaWMgU3ltYm9sVmlzaXRvckNhbGxiYWNrcyB7CisgIHN0cnVjdCBNYXBwaW5nSW5mbyB7CisgICAgTWFwcGluZ0luZm8oQXJyYXlSZWY8dWludDhfdD4gUmVjb3JkRGF0YSwgQ29kZVZpZXdDb250YWluZXIgQ29udGFpbmVyKQorICAgICAgICA6IFN0cmVhbShSZWNvcmREYXRhLCBsbHZtOjpzdXBwb3J0OjpsaXR0bGUpLCBSZWFkZXIoU3RyZWFtKSwKKyAgICAgICAgICBNYXBwaW5nKFJlYWRlciwgQ29udGFpbmVyKSB7fQorCisgICAgQmluYXJ5Qnl0ZVN0cmVhbSBTdHJlYW07CisgICAgQmluYXJ5U3RyZWFtUmVhZGVyIFJlYWRlcjsKKyAgICBTeW1ib2xSZWNvcmRNYXBwaW5nIE1hcHBpbmc7CisgIH07CisKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0YXRpYyBFcnJvciBkZXNlcmlhbGl6ZUFzKENWU3ltYm9sIFN5bWJvbCwgVCAmUmVjb3JkKSB7CisgICAgLy8gSWYgd2UncmUganVzdCBkZXNlcmlhbGl6aW5nIG9uZSByZWNvcmQsIHRoZW4gZG9uJ3Qgd29ycnkgYWJvdXQgYWxpZ25tZW50CisgICAgLy8gYXMgdGhlcmUncyBub3RoaW5nIHRoYXQgY29tZXMgYWZ0ZXIuCisgICAgU3ltYm9sRGVzZXJpYWxpemVyIFMobnVsbHB0ciwgQ29kZVZpZXdDb250YWluZXI6Ok9iamVjdEZpbGUpOworICAgIGlmIChhdXRvIEVDID0gUy52aXNpdFN5bWJvbEJlZ2luKFN5bWJvbCkpCisgICAgICByZXR1cm4gRUM7CisgICAgaWYgKGF1dG8gRUMgPSBTLnZpc2l0S25vd25SZWNvcmQoU3ltYm9sLCBSZWNvcmQpKQorICAgICAgcmV0dXJuIEVDOworICAgIGlmIChhdXRvIEVDID0gUy52aXNpdFN5bWJvbEVuZChTeW1ib2wpKQorICAgICAgcmV0dXJuIEVDOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGF0aWMgRXhwZWN0ZWQ8VD4gZGVzZXJpYWxpemVBcyhDVlN5bWJvbCBTeW1ib2wpIHsKKyAgICBUIFJlY29yZChTeW1ib2wua2luZCgpKTsKKyAgICBpZiAoYXV0byBFQyA9IGRlc2VyaWFsaXplQXM8VD4oU3ltYm9sLCBSZWNvcmQpKQorICAgICAgcmV0dXJuIHN0ZDo6bW92ZShFQyk7CisgICAgcmV0dXJuIFJlY29yZDsKKyAgfQorCisgIGV4cGxpY2l0IFN5bWJvbERlc2VyaWFsaXplcihTeW1ib2xWaXNpdG9yRGVsZWdhdGUgKkRlbGVnYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZVZpZXdDb250YWluZXIgQ29udGFpbmVyKQorICAgICAgOiBEZWxlZ2F0ZShEZWxlZ2F0ZSksIENvbnRhaW5lcihDb250YWluZXIpIHt9CisKKyAgRXJyb3IgdmlzaXRTeW1ib2xCZWdpbihDVlN5bWJvbCAmUmVjb3JkLCB1aW50MzJfdCBPZmZzZXQpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gdmlzaXRTeW1ib2xCZWdpbihSZWNvcmQpOworICB9CisKKyAgRXJyb3IgdmlzaXRTeW1ib2xCZWdpbihDVlN5bWJvbCAmUmVjb3JkKSBvdmVycmlkZSB7CisgICAgYXNzZXJ0KCFNYXBwaW5nICYmICJBbHJlYWR5IGluIGEgc3ltYm9sIG1hcHBpbmchIik7CisgICAgTWFwcGluZyA9IGxsdm06Om1ha2VfdW5pcXVlPE1hcHBpbmdJbmZvPihSZWNvcmQuY29udGVudCgpLCBDb250YWluZXIpOworICAgIHJldHVybiBNYXBwaW5nLT5NYXBwaW5nLnZpc2l0U3ltYm9sQmVnaW4oUmVjb3JkKTsKKyAgfQorICBFcnJvciB2aXNpdFN5bWJvbEVuZChDVlN5bWJvbCAmUmVjb3JkKSBvdmVycmlkZSB7CisgICAgYXNzZXJ0KE1hcHBpbmcgJiYgIk5vdCBpbiBhIHN5bWJvbCBtYXBwaW5nISIpOworICAgIGF1dG8gRUMgPSBNYXBwaW5nLT5NYXBwaW5nLnZpc2l0U3ltYm9sRW5kKFJlY29yZCk7CisgICAgTWFwcGluZy5yZXNldCgpOworICAgIHJldHVybiBFQzsKKyAgfQorCisjZGVmaW5lIFNZTUJPTF9SRUNPUkQoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFcnJvciB2aXNpdEtub3duUmVjb3JkKENWU3ltYm9sICZDVlIsIE5hbWUgJlJlY29yZCkgb3ZlcnJpZGUgeyAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gdmlzaXRLbm93blJlY29yZEltcGwoQ1ZSLCBSZWNvcmQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgU1lNQk9MX1JFQ09SRF9BTElBUyhFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSwgQWxpYXNOYW1lKQorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3U3ltYm9scy5kZWYiCisKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBFcnJvciB2aXNpdEtub3duUmVjb3JkSW1wbChDVlN5bWJvbCAmQ1ZSLCBUICZSZWNvcmQpIHsKKworICAgIFJlY29yZC5SZWNvcmRPZmZzZXQgPQorICAgICAgICBEZWxlZ2F0ZSA/IERlbGVnYXRlLT5nZXRSZWNvcmRPZmZzZXQoTWFwcGluZy0+UmVhZGVyKSA6IDA7CisgICAgaWYgKGF1dG8gRUMgPSBNYXBwaW5nLT5NYXBwaW5nLnZpc2l0S25vd25SZWNvcmQoQ1ZSLCBSZWNvcmQpKQorICAgICAgcmV0dXJuIEVDOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgU3ltYm9sVmlzaXRvckRlbGVnYXRlICpEZWxlZ2F0ZTsKKyAgQ29kZVZpZXdDb250YWluZXIgQ29udGFpbmVyOworICBzdGQ6OnVuaXF1ZV9wdHI8TWFwcGluZ0luZm8+IE1hcHBpbmc7Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbER1bXBEZWxlZ2F0ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sRHVtcERlbGVnYXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIzNjM2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbER1bXBEZWxlZ2F0ZS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vPT09LS0gU3ltYm9sRHVtcERlbGVnYXRlLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfU1lNQk9MRFVNUERFTEVHQVRFX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfU1lNQk9MRFVNUERFTEVHQVRFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sVmlzaXRvckRlbGVnYXRlLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgU3ltYm9sRHVtcERlbGVnYXRlIDogcHVibGljIFN5bWJvbFZpc2l0b3JEZWxlZ2F0ZSB7CitwdWJsaWM6CisgIH5TeW1ib2xEdW1wRGVsZWdhdGUoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgdmlydHVhbCB2b2lkIHByaW50UmVsb2NhdGVkRmllbGQoU3RyaW5nUmVmIExhYmVsLCB1aW50MzJfdCBSZWxvY09mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgKlJlbG9jU3ltID0gbnVsbHB0cikgPSAwOworICB2aXJ0dWFsIHZvaWQgcHJpbnRCaW5hcnlCbG9ja1dpdGhSZWxvY3MoU3RyaW5nUmVmIExhYmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gQmxvY2spID0gMDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1NZTUJPTERVTVBERUxFR0FURV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xEdW1wZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbER1bXBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5M2RhYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xEdW1wZXIuaApAQCAtMCwwICsxLDU3IEBACisvLz09PS0tIFN5bWJvbER1bXBlci5oIC0gQ29kZVZpZXcgc3ltYm9sIGluZm8gZHVtcGVyIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1NZTUJPTERVTVBFUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1NZTUJPTERVTVBFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbER1bXBEZWxlZ2F0ZS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVJbmRleC5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBTY29wZWRQcmludGVyOworCituYW1lc3BhY2UgY29kZXZpZXcgeworY2xhc3MgVHlwZUNvbGxlY3Rpb247CisKKy8vLyBEdW1wZXIgZm9yIENvZGVWaWV3IHN5bWJvbCBzdHJlYW1zIGZvdW5kIGluIENPRkYgb2JqZWN0IGZpbGVzIGFuZCBQREIgZmlsZXMuCitjbGFzcyBDVlN5bWJvbER1bXBlciB7CitwdWJsaWM6CisgIENWU3ltYm9sRHVtcGVyKFNjb3BlZFByaW50ZXIgJlcsIFR5cGVDb2xsZWN0aW9uICZUeXBlcywKKyAgICAgICAgICAgICAgICAgQ29kZVZpZXdDb250YWluZXIgQ29udGFpbmVyLAorICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8U3ltYm9sRHVtcERlbGVnYXRlPiBPYmpEZWxlZ2F0ZSwKKyAgICAgICAgICAgICAgICAgYm9vbCBQcmludFJlY29yZEJ5dGVzKQorICAgICAgOiBXKFcpLCBUeXBlcyhUeXBlcyksIENvbnRhaW5lcihDb250YWluZXIpLAorICAgICAgICBPYmpEZWxlZ2F0ZShzdGQ6Om1vdmUoT2JqRGVsZWdhdGUpKSwKKyAgICAgICAgUHJpbnRSZWNvcmRCeXRlcyhQcmludFJlY29yZEJ5dGVzKSB7fQorCisgIC8vLyBEdW1wcyBvbmUgdHlwZSByZWNvcmQuICBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIHdhcyBhIHR5cGUgcGFyc2luZyBlcnJvciwKKyAgLy8vIGFuZCB0cnVlIG90aGVyd2lzZS4gIFRoaXMgc2hvdWxkIGJlIGNhbGxlZCBpbiBvcmRlciwgc2luY2UgdGhlIGR1bXBlcgorICAvLy8gbWFpbnRhaW5zIHN0YXRlIGFib3V0IHByZXZpb3VzIHJlY29yZHMgd2hpY2ggYXJlIG5lY2Vzc2FyeSBmb3IgY3Jvc3MKKyAgLy8vIHR5cGUgcmVmZXJlbmNlcy4KKyAgRXJyb3IgZHVtcChDVlJlY29yZDxTeW1ib2xLaW5kPiAmUmVjb3JkKTsKKworICAvLy8gRHVtcHMgdGhlIHR5cGUgcmVjb3JkcyBpbiBEYXRhLiBSZXR1cm5zIGZhbHNlIGlmIHRoZXJlIHdhcyBhIHR5cGUgc3RyZWFtCisgIC8vLyBwYXJzZSBlcnJvciwgYW5kIHRydWUgb3RoZXJ3aXNlLgorICBFcnJvciBkdW1wKGNvbnN0IENWU3ltYm9sQXJyYXkgJlN5bWJvbHMpOworCitwcml2YXRlOgorICBTY29wZWRQcmludGVyICZXOworICBUeXBlQ29sbGVjdGlvbiAmVHlwZXM7CisgIENvZGVWaWV3Q29udGFpbmVyIENvbnRhaW5lcjsKKyAgc3RkOjp1bmlxdWVfcHRyPFN5bWJvbER1bXBEZWxlZ2F0ZT4gT2JqRGVsZWdhdGU7CisKKyAgYm9vbCBQcmludFJlY29yZEJ5dGVzOworfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1NZTUJPTERVTVBFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFJlY29yZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMjY3ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmQuaApAQCAtMCwwICsxLDk1NiBAQAorLy89PT0tIFN5bWJvbFJlY29yZC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xSRUNPUkRfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xSRUNPUkRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQVBTSW50LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ1ZSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1JlY29yZFNlcmlhbGl6YXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSW5kZXguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtQXJyYXkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIFN5bWJvbFJlY29yZCB7Citwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogS2luZChLaW5kKSB7fQorCitwdWJsaWM6CisgIFN5bWJvbFJlY29yZEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICBTeW1ib2xSZWNvcmRLaW5kIEtpbmQ7Cit9OworCisvLyBTX0dQUk9DMzIsIFNfTFBST0MzMiwgU19HUFJPQzMyX0lELCBTX0xQUk9DMzJfSUQsIFNfTFBST0MzMl9EUEMgb3IKKy8vIFNfTFBST0MzMl9EUENfSUQKK2NsYXNzIFByb2NTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBSZWxvY2F0aW9uT2Zmc2V0ID0gMzI7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgUHJvY1N5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIFByb2NTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kLCB1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChLaW5kKSwgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICB1aW50MzJfdCBnZXRSZWxvY2F0aW9uT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBSZWNvcmRPZmZzZXQgKyBSZWxvY2F0aW9uT2Zmc2V0OworICB9CisKKyAgdWludDMyX3QgUGFyZW50ID0gMDsKKyAgdWludDMyX3QgRW5kID0gMDsKKyAgdWludDMyX3QgTmV4dCA9IDA7CisgIHVpbnQzMl90IENvZGVTaXplID0gMDsKKyAgdWludDMyX3QgRGJnU3RhcnQgPSAwOworICB1aW50MzJfdCBEYmdFbmQgPSAwOworICBUeXBlSW5kZXggRnVuY3Rpb25UeXBlOworICB1aW50MzJfdCBDb2RlT2Zmc2V0ID0gMDsKKyAgdWludDE2X3QgU2VnbWVudCA9IDA7CisgIFByb2NTeW1GbGFncyBGbGFncyA9IFByb2NTeW1GbGFnczo6Tm9uZTsKKyAgU3RyaW5nUmVmIE5hbWU7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0ID0gMDsKK307CisKKy8vIFNfVEhVTkszMgorY2xhc3MgVGh1bmszMlN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworcHVibGljOgorICBleHBsaWNpdCBUaHVuazMyU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgVGh1bmszMlN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQsIHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKEtpbmQpLCBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIHVpbnQzMl90IFBhcmVudDsKKyAgdWludDMyX3QgRW5kOworICB1aW50MzJfdCBOZXh0OworICB1aW50MzJfdCBPZmZzZXQ7CisgIHVpbnQxNl90IFNlZ21lbnQ7CisgIHVpbnQxNl90IExlbmd0aDsKKyAgVGh1bmtPcmRpbmFsIFRodW5rOworICBTdHJpbmdSZWYgTmFtZTsKKyAgQXJyYXlSZWY8dWludDhfdD4gVmFyaWFudERhdGE7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19UUkFNUE9MSU5FCitjbGFzcyBUcmFtcG9saW5lU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFRyYW1wb2xpbmVTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBUcmFtcG9saW5lU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCwgdWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoS2luZCksIFJlY29yZE9mZnNldChSZWNvcmRPZmZzZXQpIHt9CisKKyAgVHJhbXBvbGluZVR5cGUgVHlwZTsKKyAgdWludDE2X3QgU2l6ZTsKKyAgdWludDMyX3QgVGh1bmtPZmZzZXQ7CisgIHVpbnQzMl90IFRhcmdldE9mZnNldDsKKyAgdWludDE2X3QgVGh1bmtTZWN0aW9uOworICB1aW50MTZfdCBUYXJnZXRTZWN0aW9uOworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKKy8vIFNfU0VDVElPTgorY2xhc3MgU2VjdGlvblN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworcHVibGljOgorICBleHBsaWNpdCBTZWN0aW9uU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgU2VjdGlvblN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQsIHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKEtpbmQpLCBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIHVpbnQxNl90IFNlY3Rpb25OdW1iZXI7CisgIHVpbnQ4X3QgQWxpZ25tZW50OworICB1aW50MzJfdCBSdmE7CisgIHVpbnQzMl90IExlbmd0aDsKKyAgdWludDMyX3QgQ2hhcmFjdGVyaXN0aWNzOworICBTdHJpbmdSZWYgTmFtZTsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX0NPRkZHUk9VUAorY2xhc3MgQ29mZkdyb3VwU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IENvZmZHcm91cFN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIENvZmZHcm91cFN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQsIHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKEtpbmQpLCBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIHVpbnQzMl90IFNpemU7CisgIHVpbnQzMl90IENoYXJhY3RlcmlzdGljczsKKyAgdWludDMyX3QgT2Zmc2V0OworICB1aW50MTZfdCBTZWdtZW50OworICBTdHJpbmdSZWYgTmFtZTsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCitjbGFzcyBTY29wZUVuZFN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworcHVibGljOgorICBleHBsaWNpdCBTY29wZUVuZFN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIFNjb3BlRW5kU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCwgdWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoS2luZCksIFJlY29yZE9mZnNldChSZWNvcmRPZmZzZXQpIHt9CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworY2xhc3MgQ2FsbGVyU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IENhbGxlclN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIENhbGxlclN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQsIHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKEtpbmQpLCBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIHN0ZDo6dmVjdG9yPFR5cGVJbmRleD4gSW5kaWNlczsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCitzdHJ1Y3QgQmluYXJ5QW5ub3RhdGlvbkl0ZXJhdG9yIHsKKyAgc3RydWN0IEFubm90YXRpb25EYXRhIHsKKyAgICBCaW5hcnlBbm5vdGF0aW9uc09wQ29kZSBPcENvZGU7CisgICAgU3RyaW5nUmVmIE5hbWU7CisgICAgdWludDMyX3QgVTE7CisgICAgdWludDMyX3QgVTI7CisgICAgaW50MzJfdCBTMTsKKyAgfTsKKworICBCaW5hcnlBbm5vdGF0aW9uSXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgIEJpbmFyeUFubm90YXRpb25JdGVyYXRvcihBcnJheVJlZjx1aW50OF90PiBBbm5vdGF0aW9ucykgOiBEYXRhKEFubm90YXRpb25zKSB7fQorICBCaW5hcnlBbm5vdGF0aW9uSXRlcmF0b3IoY29uc3QgQmluYXJ5QW5ub3RhdGlvbkl0ZXJhdG9yICZPdGhlcikKKyAgICAgIDogRGF0YShPdGhlci5EYXRhKSB7fQorCisgIGJvb2wgb3BlcmF0b3I9PShCaW5hcnlBbm5vdGF0aW9uSXRlcmF0b3IgT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gRGF0YSA9PSBPdGhlci5EYXRhOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEJpbmFyeUFubm90YXRpb25JdGVyYXRvciAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSBPdGhlcik7CisgIH0KKworICBCaW5hcnlBbm5vdGF0aW9uSXRlcmF0b3IgJm9wZXJhdG9yPShjb25zdCBCaW5hcnlBbm5vdGF0aW9uSXRlcmF0b3IgT3RoZXIpIHsKKyAgICBEYXRhID0gT3RoZXIuRGF0YTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBCaW5hcnlBbm5vdGF0aW9uSXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgaWYgKCFQYXJzZUN1cnJlbnRBbm5vdGF0aW9uKCkpIHsKKyAgICAgICp0aGlzID0gQmluYXJ5QW5ub3RhdGlvbkl0ZXJhdG9yKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIERhdGEgPSBOZXh0OworICAgIE5leHQgPSBBcnJheVJlZjx1aW50OF90PigpOworICAgIEN1cnJlbnQucmVzZXQoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBCaW5hcnlBbm5vdGF0aW9uSXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBCaW5hcnlBbm5vdGF0aW9uSXRlcmF0b3IgT3JpZygqdGhpcyk7CisgICAgKysoKnRoaXMpOworICAgIHJldHVybiBPcmlnOworICB9CisKKyAgY29uc3QgQW5ub3RhdGlvbkRhdGEgJm9wZXJhdG9yKigpIHsKKyAgICBQYXJzZUN1cnJlbnRBbm5vdGF0aW9uKCk7CisgICAgcmV0dXJuIEN1cnJlbnQuZ2V0VmFsdWUoKTsKKyAgfQorCitwcml2YXRlOgorICBzdGF0aWMgdWludDMyX3QgR2V0Q29tcHJlc3NlZEFubm90YXRpb24oQXJyYXlSZWY8dWludDhfdD4gJkFubm90YXRpb25zKSB7CisgICAgaWYgKEFubm90YXRpb25zLmVtcHR5KCkpCisgICAgICByZXR1cm4gLTE7CisKKyAgICB1aW50OF90IEZpcnN0Qnl0ZSA9IEFubm90YXRpb25zLmZyb250KCk7CisgICAgQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9ucy5kcm9wX2Zyb250KCk7CisKKyAgICBpZiAoKEZpcnN0Qnl0ZSAmIDB4ODApID09IDB4MDApCisgICAgICByZXR1cm4gRmlyc3RCeXRlOworCisgICAgaWYgKEFubm90YXRpb25zLmVtcHR5KCkpCisgICAgICByZXR1cm4gLTE7CisKKyAgICB1aW50OF90IFNlY29uZEJ5dGUgPSBBbm5vdGF0aW9ucy5mcm9udCgpOworICAgIEFubm90YXRpb25zID0gQW5ub3RhdGlvbnMuZHJvcF9mcm9udCgpOworCisgICAgaWYgKChGaXJzdEJ5dGUgJiAweEMwKSA9PSAweDgwKQorICAgICAgcmV0dXJuICgoRmlyc3RCeXRlICYgMHgzRikgPDwgOCkgfCBTZWNvbmRCeXRlOworCisgICAgaWYgKEFubm90YXRpb25zLmVtcHR5KCkpCisgICAgICByZXR1cm4gLTE7CisKKyAgICB1aW50OF90IFRoaXJkQnl0ZSA9IEFubm90YXRpb25zLmZyb250KCk7CisgICAgQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9ucy5kcm9wX2Zyb250KCk7CisKKyAgICBpZiAoQW5ub3RhdGlvbnMuZW1wdHkoKSkKKyAgICAgIHJldHVybiAtMTsKKworICAgIHVpbnQ4X3QgRm91cnRoQnl0ZSA9IEFubm90YXRpb25zLmZyb250KCk7CisgICAgQW5ub3RhdGlvbnMgPSBBbm5vdGF0aW9ucy5kcm9wX2Zyb250KCk7CisKKyAgICBpZiAoKEZpcnN0Qnl0ZSAmIDB4RTApID09IDB4QzApCisgICAgICByZXR1cm4gKChGaXJzdEJ5dGUgJiAweDFGKSA8PCAyNCkgfCAoU2Vjb25kQnl0ZSA8PCAxNikgfAorICAgICAgICAgICAgIChUaGlyZEJ5dGUgPDwgOCkgfCBGb3VydGhCeXRlOworCisgICAgcmV0dXJuIC0xOworICB9OworCisgIHN0YXRpYyBpbnQzMl90IERlY29kZVNpZ25lZE9wZXJhbmQodWludDMyX3QgT3BlcmFuZCkgeworICAgIGlmIChPcGVyYW5kICYgMSkKKyAgICAgIHJldHVybiAtKE9wZXJhbmQgPj4gMSk7CisgICAgcmV0dXJuIE9wZXJhbmQgPj4gMTsKKyAgfTsKKworICBzdGF0aWMgaW50MzJfdCBEZWNvZGVTaWduZWRPcGVyYW5kKEFycmF5UmVmPHVpbnQ4X3Q+ICZBbm5vdGF0aW9ucykgeworICAgIHJldHVybiBEZWNvZGVTaWduZWRPcGVyYW5kKEdldENvbXByZXNzZWRBbm5vdGF0aW9uKEFubm90YXRpb25zKSk7CisgIH07CisKKyAgYm9vbCBQYXJzZUN1cnJlbnRBbm5vdGF0aW9uKCkgeworICAgIGlmIChDdXJyZW50Lmhhc1ZhbHVlKCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIE5leHQgPSBEYXRhOworICAgIHVpbnQzMl90IE9wID0gR2V0Q29tcHJlc3NlZEFubm90YXRpb24oTmV4dCk7CisgICAgQW5ub3RhdGlvbkRhdGEgUmVzdWx0OworICAgIFJlc3VsdC5PcENvZGUgPSBzdGF0aWNfY2FzdDxCaW5hcnlBbm5vdGF0aW9uc09wQ29kZT4oT3ApOworICAgIHN3aXRjaCAoUmVzdWx0Lk9wQ29kZSkgeworICAgIGNhc2UgQmluYXJ5QW5ub3RhdGlvbnNPcENvZGU6OkludmFsaWQ6CisgICAgICBSZXN1bHQuTmFtZSA9ICJJbnZhbGlkIjsKKyAgICAgIE5leHQgPSBBcnJheVJlZjx1aW50OF90PigpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlBbm5vdGF0aW9uc09wQ29kZTo6Q29kZU9mZnNldDoKKyAgICAgIFJlc3VsdC5OYW1lID0gIkNvZGVPZmZzZXQiOworICAgICAgUmVzdWx0LlUxID0gR2V0Q29tcHJlc3NlZEFubm90YXRpb24oTmV4dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpbmFyeUFubm90YXRpb25zT3BDb2RlOjpDaGFuZ2VDb2RlT2Zmc2V0QmFzZToKKyAgICAgIFJlc3VsdC5OYW1lID0gIkNoYW5nZUNvZGVPZmZzZXRCYXNlIjsKKyAgICAgIFJlc3VsdC5VMSA9IEdldENvbXByZXNzZWRBbm5vdGF0aW9uKE5leHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlBbm5vdGF0aW9uc09wQ29kZTo6Q2hhbmdlQ29kZU9mZnNldDoKKyAgICAgIFJlc3VsdC5OYW1lID0gIkNoYW5nZUNvZGVPZmZzZXQiOworICAgICAgUmVzdWx0LlUxID0gR2V0Q29tcHJlc3NlZEFubm90YXRpb24oTmV4dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpbmFyeUFubm90YXRpb25zT3BDb2RlOjpDaGFuZ2VDb2RlTGVuZ3RoOgorICAgICAgUmVzdWx0Lk5hbWUgPSAiQ2hhbmdlQ29kZUxlbmd0aCI7CisgICAgICBSZXN1bHQuVTEgPSBHZXRDb21wcmVzc2VkQW5ub3RhdGlvbihOZXh0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQmluYXJ5QW5ub3RhdGlvbnNPcENvZGU6OkNoYW5nZUZpbGU6CisgICAgICBSZXN1bHQuTmFtZSA9ICJDaGFuZ2VGaWxlIjsKKyAgICAgIFJlc3VsdC5VMSA9IEdldENvbXByZXNzZWRBbm5vdGF0aW9uKE5leHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlBbm5vdGF0aW9uc09wQ29kZTo6Q2hhbmdlTGluZUVuZERlbHRhOgorICAgICAgUmVzdWx0Lk5hbWUgPSAiQ2hhbmdlTGluZUVuZERlbHRhIjsKKyAgICAgIFJlc3VsdC5VMSA9IEdldENvbXByZXNzZWRBbm5vdGF0aW9uKE5leHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlBbm5vdGF0aW9uc09wQ29kZTo6Q2hhbmdlUmFuZ2VLaW5kOgorICAgICAgUmVzdWx0Lk5hbWUgPSAiQ2hhbmdlUmFuZ2VLaW5kIjsKKyAgICAgIFJlc3VsdC5VMSA9IEdldENvbXByZXNzZWRBbm5vdGF0aW9uKE5leHQpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBCaW5hcnlBbm5vdGF0aW9uc09wQ29kZTo6Q2hhbmdlQ29sdW1uU3RhcnQ6CisgICAgICBSZXN1bHQuTmFtZSA9ICJDaGFuZ2VDb2x1bW5TdGFydCI7CisgICAgICBSZXN1bHQuVTEgPSBHZXRDb21wcmVzc2VkQW5ub3RhdGlvbihOZXh0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQmluYXJ5QW5ub3RhdGlvbnNPcENvZGU6OkNoYW5nZUNvbHVtbkVuZDoKKyAgICAgIFJlc3VsdC5OYW1lID0gIkNoYW5nZUNvbHVtbkVuZCI7CisgICAgICBSZXN1bHQuVTEgPSBHZXRDb21wcmVzc2VkQW5ub3RhdGlvbihOZXh0KTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgQmluYXJ5QW5ub3RhdGlvbnNPcENvZGU6OkNoYW5nZUxpbmVPZmZzZXQ6CisgICAgICBSZXN1bHQuTmFtZSA9ICJDaGFuZ2VMaW5lT2Zmc2V0IjsKKyAgICAgIFJlc3VsdC5TMSA9IERlY29kZVNpZ25lZE9wZXJhbmQoTmV4dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpbmFyeUFubm90YXRpb25zT3BDb2RlOjpDaGFuZ2VDb2x1bW5FbmREZWx0YToKKyAgICAgIFJlc3VsdC5OYW1lID0gIkNoYW5nZUNvbHVtbkVuZERlbHRhIjsKKyAgICAgIFJlc3VsdC5TMSA9IERlY29kZVNpZ25lZE9wZXJhbmQoTmV4dCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEJpbmFyeUFubm90YXRpb25zT3BDb2RlOjpDaGFuZ2VDb2RlT2Zmc2V0QW5kTGluZU9mZnNldDogeworICAgICAgUmVzdWx0Lk5hbWUgPSAiQ2hhbmdlQ29kZU9mZnNldEFuZExpbmVPZmZzZXQiOworICAgICAgdWludDMyX3QgQW5ub3RhdGlvbiA9IEdldENvbXByZXNzZWRBbm5vdGF0aW9uKE5leHQpOworICAgICAgUmVzdWx0LlMxID0gRGVjb2RlU2lnbmVkT3BlcmFuZChBbm5vdGF0aW9uID4+IDQpOworICAgICAgUmVzdWx0LlUxID0gQW5ub3RhdGlvbiAmIDB4ZjsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIEJpbmFyeUFubm90YXRpb25zT3BDb2RlOjpDaGFuZ2VDb2RlTGVuZ3RoQW5kQ29kZU9mZnNldDogeworICAgICAgUmVzdWx0Lk5hbWUgPSAiQ2hhbmdlQ29kZUxlbmd0aEFuZENvZGVPZmZzZXQiOworICAgICAgUmVzdWx0LlUxID0gR2V0Q29tcHJlc3NlZEFubm90YXRpb24oTmV4dCk7CisgICAgICBSZXN1bHQuVTIgPSBHZXRDb21wcmVzc2VkQW5ub3RhdGlvbihOZXh0KTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICB9CisgICAgQ3VycmVudCA9IFJlc3VsdDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE9wdGlvbmFsPEFubm90YXRpb25EYXRhPiBDdXJyZW50OworICBBcnJheVJlZjx1aW50OF90PiBEYXRhOworICBBcnJheVJlZjx1aW50OF90PiBOZXh0OworfTsKKworLy8gU19JTkxJTkVTSVRFCitjbGFzcyBJbmxpbmVTaXRlU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IElubGluZVNpdGVTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBJbmxpbmVTaXRlU3ltKHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKFN5bWJvbFJlY29yZEtpbmQ6OklubGluZVNpdGVTeW0pLAorICAgICAgICBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIGl0ZXJhdG9yX3JhbmdlPEJpbmFyeUFubm90YXRpb25JdGVyYXRvcj4gYW5ub3RhdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoQmluYXJ5QW5ub3RhdGlvbkl0ZXJhdG9yKEFubm90YXRpb25EYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlBbm5vdGF0aW9uSXRlcmF0b3IoKSk7CisgIH0KKworICB1aW50MzJfdCBQYXJlbnQ7CisgIHVpbnQzMl90IEVuZDsKKyAgVHlwZUluZGV4IElubGluZWU7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEFubm90YXRpb25EYXRhOworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKKy8vIFNfUFVCMzIKK2NsYXNzIFB1YmxpY1N5bTMyIDogcHVibGljIFN5bWJvbFJlY29yZCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFB1YmxpY1N5bTMyKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgZXhwbGljaXQgUHVibGljU3ltMzIodWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoU3ltYm9sUmVjb3JkS2luZDo6UHVibGljU3ltMzIpLAorICAgICAgICBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIFB1YmxpY1N5bUZsYWdzIEZsYWdzID0gUHVibGljU3ltRmxhZ3M6Ok5vbmU7CisgIHVpbnQzMl90IE9mZnNldCA9IDA7CisgIHVpbnQxNl90IFNlZ21lbnQgPSAwOworICBTdHJpbmdSZWYgTmFtZTsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQgPSAwOworfTsKKworLy8gU19SRUdJU1RFUgorY2xhc3MgUmVnaXN0ZXJTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgUmVnaXN0ZXJTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBSZWdpc3RlclN5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpSZWdpc3RlclN5bSksCisgICAgICAgIFJlY29yZE9mZnNldChSZWNvcmRPZmZzZXQpIHt9CisKKyAgVHlwZUluZGV4IEluZGV4OworICBSZWdpc3RlcklkIFJlZ2lzdGVyOworICBTdHJpbmdSZWYgTmFtZTsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX1BST0NSRUYsIFNfTFBST0NSRUYKK2NsYXNzIFByb2NSZWZTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgUHJvY1JlZlN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIGV4cGxpY2l0IFByb2NSZWZTeW0odWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoU3ltYm9sUmVjb3JkS2luZDo6UHJvY1JlZlN5bSksIFJlY29yZE9mZnNldChSZWNvcmRPZmZzZXQpIHsKKyAgfQorCisgIHVpbnQzMl90IFN1bU5hbWU7CisgIHVpbnQzMl90IFN5bU9mZnNldDsKKyAgdWludDE2X3QgTW9kdWxlOworICBTdHJpbmdSZWYgTmFtZTsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX0xPQ0FMCitjbGFzcyBMb2NhbFN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworcHVibGljOgorICBleHBsaWNpdCBMb2NhbFN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIGV4cGxpY2l0IExvY2FsU3ltKHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKFN5bWJvbFJlY29yZEtpbmQ6OkxvY2FsU3ltKSwgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICBUeXBlSW5kZXggVHlwZTsKKyAgTG9jYWxTeW1GbGFncyBGbGFnczsKKyAgU3RyaW5nUmVmIE5hbWU7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworc3RydWN0IExvY2FsVmFyaWFibGVBZGRyUmFuZ2UgeworICB1aW50MzJfdCBPZmZzZXRTdGFydDsKKyAgdWludDE2X3QgSVNlY3RTdGFydDsKKyAgdWludDE2X3QgUmFuZ2U7Cit9OworCitzdHJ1Y3QgTG9jYWxWYXJpYWJsZUFkZHJHYXAgeworICB1aW50MTZfdCBHYXBTdGFydE9mZnNldDsKKyAgdWludDE2X3QgUmFuZ2U7Cit9OworCitlbnVtIDogdWludDE2X3QgeyBNYXhEZWZSYW5nZSA9IDB4ZjAwMCB9OworCisvLyBTX0RFRlJBTkdFCitjbGFzcyBEZWZSYW5nZVN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFJlbG9jYXRpb25PZmZzZXQgPSA4OworCitwdWJsaWM6CisgIGV4cGxpY2l0IERlZlJhbmdlU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgZXhwbGljaXQgRGVmUmFuZ2VTeW0odWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoU3ltYm9sUmVjb3JkS2luZDo6RGVmUmFuZ2VTeW0pLAorICAgICAgICBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIHVpbnQzMl90IGdldFJlbG9jYXRpb25PZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIFJlY29yZE9mZnNldCArIFJlbG9jYXRpb25PZmZzZXQ7CisgIH0KKworICB1aW50MzJfdCBQcm9ncmFtOworICBMb2NhbFZhcmlhYmxlQWRkclJhbmdlIFJhbmdlOworICBzdGQ6OnZlY3RvcjxMb2NhbFZhcmlhYmxlQWRkckdhcD4gR2FwczsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX0RFRlJBTkdFX1NVQkZJRUxECitjbGFzcyBEZWZSYW5nZVN1YmZpZWxkU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgUmVsb2NhdGlvbk9mZnNldCA9IDEyOworCitwdWJsaWM6CisgIGV4cGxpY2l0IERlZlJhbmdlU3ViZmllbGRTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBEZWZSYW5nZVN1YmZpZWxkU3ltKHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKFN5bWJvbFJlY29yZEtpbmQ6OkRlZlJhbmdlU3ViZmllbGRTeW0pLAorICAgICAgICBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIHVpbnQzMl90IGdldFJlbG9jYXRpb25PZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIFJlY29yZE9mZnNldCArIFJlbG9jYXRpb25PZmZzZXQ7CisgIH0KKworICB1aW50MzJfdCBQcm9ncmFtOworICB1aW50MTZfdCBPZmZzZXRJblBhcmVudDsKKyAgTG9jYWxWYXJpYWJsZUFkZHJSYW5nZSBSYW5nZTsKKyAgc3RkOjp2ZWN0b3I8TG9jYWxWYXJpYWJsZUFkZHJHYXA+IEdhcHM7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19ERUZSQU5HRV9SRUdJU1RFUgorY2xhc3MgRGVmUmFuZ2VSZWdpc3RlclN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworcHVibGljOgorICBzdHJ1Y3QgSGVhZGVyIHsKKyAgICB1bGl0dGxlMTZfdCBSZWdpc3RlcjsKKyAgICB1bGl0dGxlMTZfdCBNYXlIYXZlTm9OYW1lOworICB9OworCisgIGV4cGxpY2l0IERlZlJhbmdlUmVnaXN0ZXJTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBEZWZSYW5nZVJlZ2lzdGVyU3ltKHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKFN5bWJvbFJlY29yZEtpbmQ6OkRlZlJhbmdlUmVnaXN0ZXJTeW0pLAorICAgICAgICBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIHVpbnQzMl90IGdldFJlbG9jYXRpb25PZmZzZXQoKSBjb25zdCB7IHJldHVybiBSZWNvcmRPZmZzZXQgKyBzaXplb2YoSGVhZGVyKTsgfQorCisgIEhlYWRlciBIZHI7CisgIExvY2FsVmFyaWFibGVBZGRyUmFuZ2UgUmFuZ2U7CisgIHN0ZDo6dmVjdG9yPExvY2FsVmFyaWFibGVBZGRyR2FwPiBHYXBzOworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKKy8vIFNfREVGUkFOR0VfU1VCRklFTERfUkVHSVNURVIKK2NsYXNzIERlZlJhbmdlU3ViZmllbGRSZWdpc3RlclN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworcHVibGljOgorICBzdHJ1Y3QgSGVhZGVyIHsKKyAgICB1bGl0dGxlMTZfdCBSZWdpc3RlcjsKKyAgICB1bGl0dGxlMTZfdCBNYXlIYXZlTm9OYW1lOworICAgIHVsaXR0bGUzMl90IE9mZnNldEluUGFyZW50OworICB9OworCisgIGV4cGxpY2l0IERlZlJhbmdlU3ViZmllbGRSZWdpc3RlclN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpCisgICAgICA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBEZWZSYW5nZVN1YmZpZWxkUmVnaXN0ZXJTeW0odWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoU3ltYm9sUmVjb3JkS2luZDo6RGVmUmFuZ2VTdWJmaWVsZFJlZ2lzdGVyU3ltKSwKKyAgICAgICAgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICB1aW50MzJfdCBnZXRSZWxvY2F0aW9uT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gUmVjb3JkT2Zmc2V0ICsgc2l6ZW9mKEhlYWRlcik7IH0KKworICBIZWFkZXIgSGRyOworICBMb2NhbFZhcmlhYmxlQWRkclJhbmdlIFJhbmdlOworICBzdGQ6OnZlY3RvcjxMb2NhbFZhcmlhYmxlQWRkckdhcD4gR2FwczsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX0RFRlJBTkdFX0ZSQU1FUE9JTlRFUl9SRUwKK2NsYXNzIERlZlJhbmdlRnJhbWVQb2ludGVyUmVsU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgUmVsb2NhdGlvbk9mZnNldCA9IDg7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgRGVmUmFuZ2VGcmFtZVBvaW50ZXJSZWxTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKQorICAgICAgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgRGVmUmFuZ2VGcmFtZVBvaW50ZXJSZWxTeW0odWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoU3ltYm9sUmVjb3JkS2luZDo6RGVmUmFuZ2VGcmFtZVBvaW50ZXJSZWxTeW0pLAorICAgICAgICBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIHVpbnQzMl90IGdldFJlbG9jYXRpb25PZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIFJlY29yZE9mZnNldCArIFJlbG9jYXRpb25PZmZzZXQ7CisgIH0KKworICBpbnQzMl90IE9mZnNldDsKKyAgTG9jYWxWYXJpYWJsZUFkZHJSYW5nZSBSYW5nZTsKKyAgc3RkOjp2ZWN0b3I8TG9jYWxWYXJpYWJsZUFkZHJHYXA+IEdhcHM7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19ERUZSQU5HRV9SRUdJU1RFUl9SRUwKK2NsYXNzIERlZlJhbmdlUmVnaXN0ZXJSZWxTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKK3B1YmxpYzoKKyAgc3RydWN0IEhlYWRlciB7CisgICAgdWxpdHRsZTE2X3QgUmVnaXN0ZXI7CisgICAgdWxpdHRsZTE2X3QgRmxhZ3M7CisgICAgbGl0dGxlMzJfdCBCYXNlUG9pbnRlck9mZnNldDsKKyAgfTsKKworICBleHBsaWNpdCBEZWZSYW5nZVJlZ2lzdGVyUmVsU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgZXhwbGljaXQgRGVmUmFuZ2VSZWdpc3RlclJlbFN5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpEZWZSYW5nZVJlZ2lzdGVyUmVsU3ltKSwKKyAgICAgICAgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICAvLyBUaGUgZmxhZ3MgaW1wbGVtZW50IHRoaXMgbm90aW9uYWwgYml0ZmllbGQ6CisgIC8vICAgdWludDE2X3QgSXNTdWJmaWVsZCA6IDE7CisgIC8vICAgdWludDE2X3QgUGFkZGluZyA6IDM7CisgIC8vICAgdWludDE2X3QgT2Zmc2V0SW5QYXJlbnQgOiAxMjsKKyAgZW51bSA6IHVpbnQxNl90IHsKKyAgICBJc1N1YmZpZWxkRmxhZyA9IDEsCisgICAgT2Zmc2V0SW5QYXJlbnRTaGlmdCA9IDQsCisgIH07CisKKyAgYm9vbCBoYXNTcGlsbGVkVURUTWVtYmVyKCkgY29uc3QgeyByZXR1cm4gSGRyLkZsYWdzICYgSXNTdWJmaWVsZEZsYWc7IH0KKyAgdWludDE2X3Qgb2Zmc2V0SW5QYXJlbnQoKSBjb25zdCB7IHJldHVybiBIZHIuRmxhZ3MgPj4gT2Zmc2V0SW5QYXJlbnRTaGlmdDsgfQorCisgIHVpbnQzMl90IGdldFJlbG9jYXRpb25PZmZzZXQoKSBjb25zdCB7IHJldHVybiBSZWNvcmRPZmZzZXQgKyBzaXplb2YoSGVhZGVyKTsgfQorCisgIEhlYWRlciBIZHI7CisgIExvY2FsVmFyaWFibGVBZGRyUmFuZ2UgUmFuZ2U7CisgIHN0ZDo6dmVjdG9yPExvY2FsVmFyaWFibGVBZGRyR2FwPiBHYXBzOworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKKy8vIFNfREVGUkFOR0VfRlJBTUVQT0lOVEVSX1JFTF9GVUxMX1NDT1BFCitjbGFzcyBEZWZSYW5nZUZyYW1lUG9pbnRlclJlbEZ1bGxTY29wZVN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworcHVibGljOgorICBleHBsaWNpdCBEZWZSYW5nZUZyYW1lUG9pbnRlclJlbEZ1bGxTY29wZVN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpCisgICAgICA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBleHBsaWNpdCBEZWZSYW5nZUZyYW1lUG9pbnRlclJlbEZ1bGxTY29wZVN5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpEZWZSYW5nZUZyYW1lUG9pbnRlclJlbEZ1bGxTY29wZVN5bSksCisgICAgICAgIFJlY29yZE9mZnNldChSZWNvcmRPZmZzZXQpIHt9CisKKyAgaW50MzJfdCBPZmZzZXQ7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19CTE9DSzMyCitjbGFzcyBCbG9ja1N5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFJlbG9jYXRpb25PZmZzZXQgPSAxNjsKKworcHVibGljOgorICBleHBsaWNpdCBCbG9ja1N5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIGV4cGxpY2l0IEJsb2NrU3ltKHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKFN5bWJvbFJlY29yZEtpbmQ6OkJsb2NrU3ltKSwgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICB1aW50MzJfdCBnZXRSZWxvY2F0aW9uT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBSZWNvcmRPZmZzZXQgKyBSZWxvY2F0aW9uT2Zmc2V0OworICB9CisKKyAgdWludDMyX3QgUGFyZW50OworICB1aW50MzJfdCBFbmQ7CisgIHVpbnQzMl90IENvZGVTaXplOworICB1aW50MzJfdCBDb2RlT2Zmc2V0OworICB1aW50MTZfdCBTZWdtZW50OworICBTdHJpbmdSZWYgTmFtZTsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX0xBQkVMMzIKK2NsYXNzIExhYmVsU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgUmVsb2NhdGlvbk9mZnNldCA9IDQ7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgTGFiZWxTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBleHBsaWNpdCBMYWJlbFN5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpMYWJlbFN5bSksIFJlY29yZE9mZnNldChSZWNvcmRPZmZzZXQpIHt9CisKKyAgdWludDMyX3QgZ2V0UmVsb2NhdGlvbk9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVjb3JkT2Zmc2V0ICsgUmVsb2NhdGlvbk9mZnNldDsKKyAgfQorCisgIHVpbnQzMl90IENvZGVPZmZzZXQ7CisgIHVpbnQxNl90IFNlZ21lbnQ7CisgIFByb2NTeW1GbGFncyBGbGFnczsKKyAgU3RyaW5nUmVmIE5hbWU7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19PQkpOQU1FCitjbGFzcyBPYmpOYW1lU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IE9iak5hbWVTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBPYmpOYW1lU3ltKHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKFN5bWJvbFJlY29yZEtpbmQ6Ok9iak5hbWVTeW0pLCBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7CisgIH0KKworICB1aW50MzJfdCBTaWduYXR1cmU7CisgIFN0cmluZ1JlZiBOYW1lOworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKKy8vIFNfRU5WQkxPQ0sKK2NsYXNzIEVudkJsb2NrU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IEVudkJsb2NrU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgRW52QmxvY2tTeW0odWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoU3ltYm9sUmVjb3JkS2luZDo6RW52QmxvY2tTeW0pLAorICAgICAgICBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gRmllbGRzOworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKKy8vIFNfRVhQT1JUCitjbGFzcyBFeHBvcnRTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRXhwb3J0U3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgRXhwb3J0U3ltKHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKFN5bWJvbFJlY29yZEtpbmQ6OkV4cG9ydFN5bSksIFJlY29yZE9mZnNldChSZWNvcmRPZmZzZXQpIHt9CisKKyAgdWludDE2X3QgT3JkaW5hbDsKKyAgRXhwb3J0RmxhZ3MgRmxhZ3M7CisgIFN0cmluZ1JlZiBOYW1lOworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKKy8vIFNfRklMRVNUQVRJQworY2xhc3MgRmlsZVN0YXRpY1N5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworcHVibGljOgorICBleHBsaWNpdCBGaWxlU3RhdGljU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgRmlsZVN0YXRpY1N5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpGaWxlU3RhdGljU3ltKSwKKyAgICAgICAgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICBUeXBlSW5kZXggSW5kZXg7CisgIHVpbnQzMl90IE1vZEZpbGVuYW1lT2Zmc2V0OworICBMb2NhbFN5bUZsYWdzIEZsYWdzOworICBTdHJpbmdSZWYgTmFtZTsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX0NPTVBJTEUyCitjbGFzcyBDb21waWxlMlN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworcHVibGljOgorICBleHBsaWNpdCBDb21waWxlMlN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIENvbXBpbGUyU3ltKHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKFN5bWJvbFJlY29yZEtpbmQ6OkNvbXBpbGUyU3ltKSwKKyAgICAgICAgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICBDb21waWxlU3ltMkZsYWdzIEZsYWdzOworICBDUFVUeXBlIE1hY2hpbmU7CisgIHVpbnQxNl90IFZlcnNpb25Gcm9udGVuZE1ham9yOworICB1aW50MTZfdCBWZXJzaW9uRnJvbnRlbmRNaW5vcjsKKyAgdWludDE2X3QgVmVyc2lvbkZyb250ZW5kQnVpbGQ7CisgIHVpbnQxNl90IFZlcnNpb25CYWNrZW5kTWFqb3I7CisgIHVpbnQxNl90IFZlcnNpb25CYWNrZW5kTWlub3I7CisgIHVpbnQxNl90IFZlcnNpb25CYWNrZW5kQnVpbGQ7CisgIFN0cmluZ1JlZiBWZXJzaW9uOworICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IEV4dHJhU3RyaW5nczsKKworICB1aW50OF90IGdldExhbmd1YWdlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEZsYWdzKSAmIDB4RkY7IH0KKyAgdWludDMyX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oRmxhZ3MpICYgfjB4RkY7IH0KKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX0NPTVBJTEUzCitjbGFzcyBDb21waWxlM1N5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworcHVibGljOgorICBleHBsaWNpdCBDb21waWxlM1N5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIENvbXBpbGUzU3ltKHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKFN5bWJvbFJlY29yZEtpbmQ6OkNvbXBpbGUzU3ltKSwKKyAgICAgICAgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICBDb21waWxlU3ltM0ZsYWdzIEZsYWdzOworICBDUFVUeXBlIE1hY2hpbmU7CisgIHVpbnQxNl90IFZlcnNpb25Gcm9udGVuZE1ham9yOworICB1aW50MTZfdCBWZXJzaW9uRnJvbnRlbmRNaW5vcjsKKyAgdWludDE2X3QgVmVyc2lvbkZyb250ZW5kQnVpbGQ7CisgIHVpbnQxNl90IFZlcnNpb25Gcm9udGVuZFFGRTsKKyAgdWludDE2X3QgVmVyc2lvbkJhY2tlbmRNYWpvcjsKKyAgdWludDE2X3QgVmVyc2lvbkJhY2tlbmRNaW5vcjsKKyAgdWludDE2X3QgVmVyc2lvbkJhY2tlbmRCdWlsZDsKKyAgdWludDE2X3QgVmVyc2lvbkJhY2tlbmRRRkU7CisgIFN0cmluZ1JlZiBWZXJzaW9uOworCisgIHZvaWQgc2V0TGFuZ3VhZ2UoU291cmNlTGFuZ3VhZ2UgTGFuZykgeworICAgIEZsYWdzID0gQ29tcGlsZVN5bTNGbGFncygodWludDMyX3QoRmxhZ3MpICYgMHhGRkZGRkYwMCkgfCB1aW50MzJfdChMYW5nKSk7CisgIH0KKworICB1aW50OF90IGdldExhbmd1YWdlKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEZsYWdzKSAmIDB4RkY7IH0KKyAgdWludDMyX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oRmxhZ3MpICYgfjB4RkY7IH0KKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX0ZSQU1FUFJPQworY2xhc3MgRnJhbWVQcm9jU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IEZyYW1lUHJvY1N5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIGV4cGxpY2l0IEZyYW1lUHJvY1N5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpGcmFtZVByb2NTeW0pLAorICAgICAgICBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIHVpbnQzMl90IFRvdGFsRnJhbWVCeXRlczsKKyAgdWludDMyX3QgUGFkZGluZ0ZyYW1lQnl0ZXM7CisgIHVpbnQzMl90IE9mZnNldFRvUGFkZGluZzsKKyAgdWludDMyX3QgQnl0ZXNPZkNhbGxlZVNhdmVkUmVnaXN0ZXJzOworICB1aW50MzJfdCBPZmZzZXRPZkV4Y2VwdGlvbkhhbmRsZXI7CisgIHVpbnQxNl90IFNlY3Rpb25JZE9mRXhjZXB0aW9uSGFuZGxlcjsKKyAgRnJhbWVQcm9jZWR1cmVPcHRpb25zIEZsYWdzOworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKKy8vIFNfQ0FMTFNJVEVJTkZPCitjbGFzcyBDYWxsU2l0ZUluZm9TeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBSZWxvY2F0aW9uT2Zmc2V0ID0gNDsKKworcHVibGljOgorICBleHBsaWNpdCBDYWxsU2l0ZUluZm9TeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBleHBsaWNpdCBDYWxsU2l0ZUluZm9TeW0odWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoU3ltYm9sUmVjb3JkS2luZDo6Q2FsbFNpdGVJbmZvU3ltKSB7fQorCisgIHVpbnQzMl90IGdldFJlbG9jYXRpb25PZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIFJlY29yZE9mZnNldCArIFJlbG9jYXRpb25PZmZzZXQ7CisgIH0KKworICB1aW50MzJfdCBDb2RlT2Zmc2V0OworICB1aW50MTZfdCBTZWdtZW50OworICBUeXBlSW5kZXggVHlwZTsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX0hFQVBBTExPQ1NJVEUKK2NsYXNzIEhlYXBBbGxvY2F0aW9uU2l0ZVN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFJlbG9jYXRpb25PZmZzZXQgPSA0OworCitwdWJsaWM6CisgIGV4cGxpY2l0IEhlYXBBbGxvY2F0aW9uU2l0ZVN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIGV4cGxpY2l0IEhlYXBBbGxvY2F0aW9uU2l0ZVN5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpIZWFwQWxsb2NhdGlvblNpdGVTeW0pLAorICAgICAgICBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIHVpbnQzMl90IGdldFJlbG9jYXRpb25PZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIFJlY29yZE9mZnNldCArIFJlbG9jYXRpb25PZmZzZXQ7CisgIH0KKworICB1aW50MzJfdCBDb2RlT2Zmc2V0OworICB1aW50MTZfdCBTZWdtZW50OworICB1aW50MTZfdCBDYWxsSW5zdHJ1Y3Rpb25TaXplOworICBUeXBlSW5kZXggVHlwZTsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX0ZSQU1FQ09PS0lFCitjbGFzcyBGcmFtZUNvb2tpZVN5bSA6IHB1YmxpYyBTeW1ib2xSZWNvcmQgeworICBzdGF0aWMgY29uc3RleHByIHVpbnQzMl90IFJlbG9jYXRpb25PZmZzZXQgPSA0OworCitwdWJsaWM6CisgIGV4cGxpY2l0IEZyYW1lQ29va2llU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgZXhwbGljaXQgRnJhbWVDb29raWVTeW0odWludDMyX3QgUmVjb3JkT2Zmc2V0KQorICAgICAgOiBTeW1ib2xSZWNvcmQoU3ltYm9sUmVjb3JkS2luZDo6RnJhbWVDb29raWVTeW0pIHt9CisKKyAgdWludDMyX3QgZ2V0UmVsb2NhdGlvbk9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVjb3JkT2Zmc2V0ICsgUmVsb2NhdGlvbk9mZnNldDsKKyAgfQorCisgIHVpbnQzMl90IENvZGVPZmZzZXQ7CisgIHVpbnQxNl90IFJlZ2lzdGVyOworICBGcmFtZUNvb2tpZUtpbmQgQ29va2llS2luZDsKKyAgdWludDhfdCBGbGFnczsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX1VEVCwgU19DT0JPTFVEVAorY2xhc3MgVURUU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFVEVFN5bShTeW1ib2xSZWNvcmRLaW5kIEtpbmQpIDogU3ltYm9sUmVjb3JkKEtpbmQpIHt9CisgIGV4cGxpY2l0IFVEVFN5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpVRFRTeW0pIHt9CisKKyAgVHlwZUluZGV4IFR5cGU7CisgIFN0cmluZ1JlZiBOYW1lOworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKKy8vIFNfQlVJTERJTkZPCitjbGFzcyBCdWlsZEluZm9TeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgQnVpbGRJbmZvU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgQnVpbGRJbmZvU3ltKHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKFN5bWJvbFJlY29yZEtpbmQ6OkJ1aWxkSW5mb1N5bSksCisgICAgICAgIFJlY29yZE9mZnNldChSZWNvcmRPZmZzZXQpIHt9CisKKyAgVHlwZUluZGV4IEJ1aWxkSWQ7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19CUFJFTDMyCitjbGFzcyBCUFJlbGF0aXZlU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CitwdWJsaWM6CisgIGV4cGxpY2l0IEJQUmVsYXRpdmVTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBleHBsaWNpdCBCUFJlbGF0aXZlU3ltKHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKFN5bWJvbFJlY29yZEtpbmQ6OkJQUmVsYXRpdmVTeW0pLAorICAgICAgICBSZWNvcmRPZmZzZXQoUmVjb3JkT2Zmc2V0KSB7fQorCisgIGludDMyX3QgT2Zmc2V0OworICBUeXBlSW5kZXggVHlwZTsKKyAgU3RyaW5nUmVmIE5hbWU7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19SRUdSRUwzMgorY2xhc3MgUmVnUmVsYXRpdmVTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgUmVnUmVsYXRpdmVTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBleHBsaWNpdCBSZWdSZWxhdGl2ZVN5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpSZWdSZWxhdGl2ZVN5bSksCisgICAgICAgIFJlY29yZE9mZnNldChSZWNvcmRPZmZzZXQpIHt9CisKKyAgdWludDMyX3QgT2Zmc2V0OworICBUeXBlSW5kZXggVHlwZTsKKyAgUmVnaXN0ZXJJZCBSZWdpc3RlcjsKKyAgU3RyaW5nUmVmIE5hbWU7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19DT05TVEFOVCwgU19NQU5DT05TVEFOVAorY2xhc3MgQ29uc3RhbnRTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgQ29uc3RhbnRTeW0oU3ltYm9sUmVjb3JkS2luZCBLaW5kKSA6IFN5bWJvbFJlY29yZChLaW5kKSB7fQorICBDb25zdGFudFN5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpDb25zdGFudFN5bSksCisgICAgICAgIFJlY29yZE9mZnNldChSZWNvcmRPZmZzZXQpIHt9CisKKyAgVHlwZUluZGV4IFR5cGU7CisgIEFQU0ludCBWYWx1ZTsKKyAgU3RyaW5nUmVmIE5hbWU7CisKKyAgdWludDMyX3QgUmVjb3JkT2Zmc2V0OworfTsKKworLy8gU19MREFUQTMyLCBTX0dEQVRBMzIsIFNfTE1BTkRBVEEsIFNfR01BTkRBVEEKK2NsYXNzIERhdGFTeW0gOiBwdWJsaWMgU3ltYm9sUmVjb3JkIHsKKyAgc3RhdGljIGNvbnN0ZXhwciB1aW50MzJfdCBSZWxvY2F0aW9uT2Zmc2V0ID0gODsKKworcHVibGljOgorICBleHBsaWNpdCBEYXRhU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgRGF0YVN5bSh1aW50MzJfdCBSZWNvcmRPZmZzZXQpCisgICAgICA6IFN5bWJvbFJlY29yZChTeW1ib2xSZWNvcmRLaW5kOjpEYXRhU3ltKSwgUmVjb3JkT2Zmc2V0KFJlY29yZE9mZnNldCkge30KKworICB1aW50MzJfdCBnZXRSZWxvY2F0aW9uT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBSZWNvcmRPZmZzZXQgKyBSZWxvY2F0aW9uT2Zmc2V0OworICB9CisKKyAgVHlwZUluZGV4IFR5cGU7CisgIHVpbnQzMl90IERhdGFPZmZzZXQ7CisgIHVpbnQxNl90IFNlZ21lbnQ7CisgIFN0cmluZ1JlZiBOYW1lOworCisgIHVpbnQzMl90IFJlY29yZE9mZnNldDsKK307CisKKy8vIFNfTFRIUkVBRDMyLCBTX0dUSFJFQUQzMgorY2xhc3MgVGhyZWFkTG9jYWxEYXRhU3ltIDogcHVibGljIFN5bWJvbFJlY29yZCB7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDMyX3QgUmVsb2NhdGlvbk9mZnNldCA9IDg7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgVGhyZWFkTG9jYWxEYXRhU3ltKFN5bWJvbFJlY29yZEtpbmQgS2luZCkgOiBTeW1ib2xSZWNvcmQoS2luZCkge30KKyAgZXhwbGljaXQgVGhyZWFkTG9jYWxEYXRhU3ltKHVpbnQzMl90IFJlY29yZE9mZnNldCkKKyAgICAgIDogU3ltYm9sUmVjb3JkKFN5bWJvbFJlY29yZEtpbmQ6OlRocmVhZExvY2FsRGF0YVN5bSksCisgICAgICAgIFJlY29yZE9mZnNldChSZWNvcmRPZmZzZXQpIHt9CisKKyAgdWludDMyX3QgZ2V0UmVsb2NhdGlvbk9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVjb3JkT2Zmc2V0ICsgUmVsb2NhdGlvbk9mZnNldDsKKyAgfQorCisgIFR5cGVJbmRleCBUeXBlOworICB1aW50MzJfdCBEYXRhT2Zmc2V0OworICB1aW50MTZfdCBTZWdtZW50OworICBTdHJpbmdSZWYgTmFtZTsKKworICB1aW50MzJfdCBSZWNvcmRPZmZzZXQ7Cit9OworCisvLyBTX0FOTk9UQVRJT04KKwordXNpbmcgQ1ZTeW1ib2wgPSBDVlJlY29yZDxTeW1ib2xLaW5kPjsKK3VzaW5nIENWU3ltYm9sQXJyYXkgPSBWYXJTdHJlYW1BcnJheTxDVlN5bWJvbD47CisKK0V4cGVjdGVkPENWU3ltYm9sPiByZWFkU3ltYm9sRnJvbVN0cmVhbShCaW5hcnlTdHJlYW1SZWYgU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9mZnNldCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1NZTUJPTFJFQ09SRF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmRNYXBwaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmRNYXBwaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkxZThmMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFJlY29yZE1hcHBpbmcuaApAQCAtMCwwICsxLDQ3IEBACisvLz09PS0gU3ltYm9sUmVjb3JkTWFwcGluZy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1NZTUJPTFJFQ09SRE1BUFBJTkdfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xSRUNPUkRNQVBQSU5HX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3UmVjb3JkSU8uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xWaXNpdG9yQ2FsbGJhY2tzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEJpbmFyeVN0cmVhbVJlYWRlcjsKK2NsYXNzIEJpbmFyeVN0cmVhbVdyaXRlcjsKKworbmFtZXNwYWNlIGNvZGV2aWV3IHsKK2NsYXNzIFN5bWJvbFJlY29yZE1hcHBpbmcgOiBwdWJsaWMgU3ltYm9sVmlzaXRvckNhbGxiYWNrcyB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFN5bWJvbFJlY29yZE1hcHBpbmcoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZVZpZXdDb250YWluZXIgQ29udGFpbmVyKQorICAgICAgOiBJTyhSZWFkZXIpLCBDb250YWluZXIoQ29udGFpbmVyKSB7fQorICBleHBsaWNpdCBTeW1ib2xSZWNvcmRNYXBwaW5nKEJpbmFyeVN0cmVhbVdyaXRlciAmV3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVWaWV3Q29udGFpbmVyIENvbnRhaW5lcikKKyAgICAgIDogSU8oV3JpdGVyKSwgQ29udGFpbmVyKENvbnRhaW5lcikge30KKworICBFcnJvciB2aXNpdFN5bWJvbEJlZ2luKENWU3ltYm9sICZSZWNvcmQpIG92ZXJyaWRlOworICBFcnJvciB2aXNpdFN5bWJvbEVuZChDVlN5bWJvbCAmUmVjb3JkKSBvdmVycmlkZTsKKworI2RlZmluZSBTWU1CT0xfUkVDT1JEKEVudW1OYW1lLCBFbnVtVmFsLCBOYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRXJyb3IgdmlzaXRLbm93blJlY29yZChDVlN5bWJvbCAmQ1ZSLCBOYW1lICZSZWNvcmQpIG92ZXJyaWRlOworI2RlZmluZSBTWU1CT0xfUkVDT1JEX0FMSUFTKEVudW1OYW1lLCBFbnVtVmFsLCBOYW1lLCBBbGlhc05hbWUpCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdTeW1ib2xzLmRlZiIKKworcHJpdmF0ZToKKyAgT3B0aW9uYWw8U3ltYm9sS2luZD4gS2luZDsKKworICBDb2RlVmlld1JlY29yZElPIElPOworICBDb2RlVmlld0NvbnRhaW5lciBDb250YWluZXI7Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFNlcmlhbGl6ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFNlcmlhbGl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGQ4YWIwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sU2VyaWFsaXplci5oCkBAIC0wLDAgKzEsODQgQEAKKy8vPT09LSBTeW1ib2xTZXJpYWxpemVyLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfU1lNQk9MU0VSSUFMSVpFUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1NZTUJPTFNFUklBTElaRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1JlY29yZFNlcmlhbGl6YXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmRNYXBwaW5nLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sVmlzaXRvckNhbGxiYWNrcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5Qnl0ZVN0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1Xcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgU3ltYm9sU2VyaWFsaXplciA6IHB1YmxpYyBTeW1ib2xWaXNpdG9yQ2FsbGJhY2tzIHsKKyAgQnVtcFB0ckFsbG9jYXRvciAmU3RvcmFnZTsKKyAgLy8gU2luY2UgdGhpcyBpcyBhIGZpeGVkIHNpemUgYnVmZmVyLCB1c2UgYSBzdGFjayBhbGxvY2F0ZWQgYnVmZmVyLiAgVGhpcworICAvLyB5aWVsZHMgbWVhc3VyYWJsZSBwZXJmb3JtYW5jZSBpbmNyZWFzZSBvdmVyIHRoZSByZXBlYXRlZCBoZWFwIGFsbG9jYXRpb25zCisgIC8vIHdoZW4gc2VyaWFsaXppbmcgbWFueSBpbmRlcGVuZGVudCByZWNvcmRzIHZpYSB3cml0ZU9uZVN5bWJvbC4KKyAgc3RkOjphcnJheTx1aW50OF90LCBNYXhSZWNvcmRMZW5ndGg+IFJlY29yZEJ1ZmZlcjsKKyAgTXV0YWJsZUJpbmFyeUJ5dGVTdHJlYW0gU3RyZWFtOworICBCaW5hcnlTdHJlYW1Xcml0ZXIgV3JpdGVyOworICBTeW1ib2xSZWNvcmRNYXBwaW5nIE1hcHBpbmc7CisgIE9wdGlvbmFsPFN5bWJvbEtpbmQ+IEN1cnJlbnRTeW1ib2w7CisKKyAgRXJyb3Igd3JpdGVSZWNvcmRQcmVmaXgoU3ltYm9sS2luZCBLaW5kKSB7CisgICAgUmVjb3JkUHJlZml4IFByZWZpeDsKKyAgICBQcmVmaXguUmVjb3JkS2luZCA9IEtpbmQ7CisgICAgUHJlZml4LlJlY29yZExlbiA9IDA7CisgICAgaWYgKGF1dG8gRUMgPSBXcml0ZXIud3JpdGVPYmplY3QoUHJlZml4KSkKKyAgICAgIHJldHVybiBFQzsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCitwdWJsaWM6CisgIFN5bWJvbFNlcmlhbGl6ZXIoQnVtcFB0ckFsbG9jYXRvciAmU3RvcmFnZSwgQ29kZVZpZXdDb250YWluZXIgQ29udGFpbmVyKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU3ltVHlwZT4KKyAgc3RhdGljIENWU3ltYm9sIHdyaXRlT25lU3ltYm9sKFN5bVR5cGUgJlN5bSwgQnVtcFB0ckFsbG9jYXRvciAmU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVWaWV3Q29udGFpbmVyIENvbnRhaW5lcikgeworICAgIENWU3ltYm9sIFJlc3VsdDsKKyAgICBSZXN1bHQuVHlwZSA9IHN0YXRpY19jYXN0PFN5bWJvbEtpbmQ+KFN5bS5LaW5kKTsKKyAgICBTeW1ib2xTZXJpYWxpemVyIFNlcmlhbGl6ZXIoU3RvcmFnZSwgQ29udGFpbmVyKTsKKyAgICBjb25zdW1lRXJyb3IoU2VyaWFsaXplci52aXNpdFN5bWJvbEJlZ2luKFJlc3VsdCkpOworICAgIGNvbnN1bWVFcnJvcihTZXJpYWxpemVyLnZpc2l0S25vd25SZWNvcmQoUmVzdWx0LCBTeW0pKTsKKyAgICBjb25zdW1lRXJyb3IoU2VyaWFsaXplci52aXNpdFN5bWJvbEVuZChSZXN1bHQpKTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgRXJyb3IgdmlzaXRTeW1ib2xCZWdpbihDVlN5bWJvbCAmUmVjb3JkKSBvdmVycmlkZTsKKyAgRXJyb3IgdmlzaXRTeW1ib2xFbmQoQ1ZTeW1ib2wgJlJlY29yZCkgb3ZlcnJpZGU7CisKKyNkZWZpbmUgU1lNQk9MX1JFQ09SRChFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVycm9yIHZpc2l0S25vd25SZWNvcmQoQ1ZTeW1ib2wgJkNWUiwgTmFtZSAmUmVjb3JkKSBvdmVycmlkZSB7ICAgICAgICAgICAgICAgXAorICAgIHJldHVybiB2aXNpdEtub3duUmVjb3JkSW1wbChDVlIsIFJlY29yZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2RlZmluZSBTWU1CT0xfUkVDT1JEX0FMSUFTKEVudW1OYW1lLCBFbnVtVmFsLCBOYW1lLCBBbGlhc05hbWUpCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdTeW1ib2xzLmRlZiIKKworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlY29yZEtpbmQ+CisgIEVycm9yIHZpc2l0S25vd25SZWNvcmRJbXBsKENWU3ltYm9sICZDVlIsIFJlY29yZEtpbmQgJlJlY29yZCkgeworICAgIHJldHVybiBNYXBwaW5nLnZpc2l0S25vd25SZWNvcmQoQ1ZSLCBSZWNvcmQpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xTRVJJQUxJWkVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFZpc2l0b3JDYWxsYmFja1BpcGVsaW5lLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xWaXNpdG9yQ2FsbGJhY2tQaXBlbGluZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyOTUxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xWaXNpdG9yQ2FsbGJhY2tQaXBlbGluZS5oCkBAIC0wLDAgKzEsNzkgQEAKKy8vPT09LSBTeW1ib2xWaXNpdG9yQ2FsbGJhY2tQaXBlbGluZS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfU1lNQk9MVklTSVRPUkNBTExCQUNLUElQRUxJTkVfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xWSVNJVE9SQ0FMTEJBQ0tQSVBFTElORV9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xWaXNpdG9yQ2FsbGJhY2tzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworCitjbGFzcyBTeW1ib2xWaXNpdG9yQ2FsbGJhY2tQaXBlbGluZSA6IHB1YmxpYyBTeW1ib2xWaXNpdG9yQ2FsbGJhY2tzIHsKK3B1YmxpYzoKKyAgU3ltYm9sVmlzaXRvckNhbGxiYWNrUGlwZWxpbmUoKSA9IGRlZmF1bHQ7CisKKyAgRXJyb3IgdmlzaXRVbmtub3duU3ltYm9sKENWU3ltYm9sICZSZWNvcmQpIG92ZXJyaWRlIHsKKyAgICBmb3IgKGF1dG8gVmlzaXRvciA6IFBpcGVsaW5lKSB7CisgICAgICBpZiAoYXV0byBFQyA9IFZpc2l0b3ItPnZpc2l0VW5rbm93blN5bWJvbChSZWNvcmQpKQorICAgICAgICByZXR1cm4gRUM7CisgICAgfQorICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXJyb3IgdmlzaXRTeW1ib2xCZWdpbihDVlN5bWJvbCAmUmVjb3JkLCB1aW50MzJfdCBPZmZzZXQpIG92ZXJyaWRlIHsKKyAgICBmb3IgKGF1dG8gVmlzaXRvciA6IFBpcGVsaW5lKSB7CisgICAgICBpZiAoYXV0byBFQyA9IFZpc2l0b3ItPnZpc2l0U3ltYm9sQmVnaW4oUmVjb3JkLCBPZmZzZXQpKQorICAgICAgICByZXR1cm4gRUM7CisgICAgfQorICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXJyb3IgdmlzaXRTeW1ib2xCZWdpbihDVlN5bWJvbCAmUmVjb3JkKSBvdmVycmlkZSB7CisgICAgZm9yIChhdXRvIFZpc2l0b3IgOiBQaXBlbGluZSkgeworICAgICAgaWYgKGF1dG8gRUMgPSBWaXNpdG9yLT52aXNpdFN5bWJvbEJlZ2luKFJlY29yZCkpCisgICAgICAgIHJldHVybiBFQzsKKyAgICB9CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBFcnJvciB2aXNpdFN5bWJvbEVuZChDVlN5bWJvbCAmUmVjb3JkKSBvdmVycmlkZSB7CisgICAgZm9yIChhdXRvIFZpc2l0b3IgOiBQaXBlbGluZSkgeworICAgICAgaWYgKGF1dG8gRUMgPSBWaXNpdG9yLT52aXNpdFN5bWJvbEVuZChSZWNvcmQpKQorICAgICAgICByZXR1cm4gRUM7CisgICAgfQorICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgdm9pZCBhZGRDYWxsYmFja1RvUGlwZWxpbmUoU3ltYm9sVmlzaXRvckNhbGxiYWNrcyAmQ2FsbGJhY2tzKSB7CisgICAgUGlwZWxpbmUucHVzaF9iYWNrKCZDYWxsYmFja3MpOworICB9CisKKyNkZWZpbmUgU1lNQk9MX1JFQ09SRChFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVycm9yIHZpc2l0S25vd25SZWNvcmQoQ1ZTeW1ib2wgJkNWUiwgTmFtZSAmUmVjb3JkKSBvdmVycmlkZSB7ICAgICAgICAgICAgICAgXAorICAgIGZvciAoYXV0byBWaXNpdG9yIDogUGlwZWxpbmUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGlmIChhdXRvIEVDID0gVmlzaXRvci0+dmlzaXRLbm93blJlY29yZChDVlIsIFJlY29yZCkpICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBFQzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgU1lNQk9MX1JFQ09SRF9BTElBUyhFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSwgQWxpYXNOYW1lKQorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3U3ltYm9scy5kZWYiCisKK3ByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPFN5bWJvbFZpc2l0b3JDYWxsYmFja3MgKj4gUGlwZWxpbmU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xWSVNJVE9SQ0FMTEJBQ0tQSVBFTElORV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xWaXNpdG9yQ2FsbGJhY2tzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xWaXNpdG9yQ2FsbGJhY2tzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgxNmY3YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFZpc2l0b3JDYWxsYmFja3MuaApAQCAtMCwwICsxLDUwIEBACisvLz09PS0gU3ltYm9sVmlzaXRvckNhbGxiYWNrcy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1NZTUJPTFZJU0lUT1JDQUxMQkFDS1NfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xWSVNJVE9SQ0FMTEJBQ0tTX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworCitjbGFzcyBTeW1ib2xWaXNpdG9yQ2FsbGJhY2tzIHsKKyAgZnJpZW5kIGNsYXNzIENWU3ltYm9sVmlzaXRvcjsKKworcHVibGljOgorICB2aXJ0dWFsIH5TeW1ib2xWaXNpdG9yQ2FsbGJhY2tzKCkgPSBkZWZhdWx0OworCisgIC8vLyBBY3Rpb24gdG8gdGFrZSBvbiB1bmtub3duIHN5bWJvbHMuIEJ5IGRlZmF1bHQsIHRoZXkgYXJlIGlnbm9yZWQuCisgIHZpcnR1YWwgRXJyb3IgdmlzaXRVbmtub3duU3ltYm9sKENWU3ltYm9sICZSZWNvcmQpIHsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIC8vLyBQYWlyZWQgYmVnaW4vZW5kIGFjdGlvbnMgZm9yIGFsbCBzeW1ib2xzLiBSZWNlaXZlcyBhbGwgcmVjb3JkIGRhdGEsCisgIC8vLyBpbmNsdWRpbmcgdGhlIGZpeGVkLWxlbmd0aCByZWNvcmQgcHJlZml4LiAgdmlzaXRTeW1ib2xCZWdpbigpIHNob3VsZAorICAvLy8gcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBTeW1ib2wsIG9yIGFuIGVycm9yIGlmIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkLgorICB2aXJ0dWFsIEVycm9yIHZpc2l0U3ltYm9sQmVnaW4oQ1ZTeW1ib2wgJlJlY29yZCwgdWludDMyX3QgT2Zmc2V0KSB7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKyAgdmlydHVhbCBFcnJvciB2aXNpdFN5bWJvbEJlZ2luKENWU3ltYm9sICZSZWNvcmQpIHsgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7IH0KKyAgdmlydHVhbCBFcnJvciB2aXNpdFN5bWJvbEVuZChDVlN5bWJvbCAmUmVjb3JkKSB7IHJldHVybiBFcnJvcjo6c3VjY2VzcygpOyB9CisKKyNkZWZpbmUgU1lNQk9MX1JFQ09SRChFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZpcnR1YWwgRXJyb3IgdmlzaXRLbm93blJlY29yZChDVlN5bWJvbCAmQ1ZSLCBOYW1lICZSZWNvcmQpIHsgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2RlZmluZSBTWU1CT0xfUkVDT1JEX0FMSUFTKEVudW1OYW1lLCBFbnVtVmFsLCBOYW1lLCBBbGlhc05hbWUpCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdTeW1ib2xzLmRlZiIKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1NZTUJPTFZJU0lUT1JDQUxMQkFDS1NfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sVmlzaXRvckRlbGVnYXRlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xWaXNpdG9yRGVsZWdhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmEzYzZmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sVmlzaXRvckRlbGVnYXRlLmgKQEAgLTAsMCArMSwzNyBAQAorLy89PT0tLSBTeW1ib2xWaXNpdG9yRGVsZWdhdGUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xWSVNJVE9SREVMRUdBVEVfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xWSVNJVE9SREVMRUdBVEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCaW5hcnlTdHJlYW1SZWFkZXI7CisKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIERlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uUmVmOworCitjbGFzcyBTeW1ib2xWaXNpdG9yRGVsZWdhdGUgeworcHVibGljOgorICB2aXJ0dWFsIH5TeW1ib2xWaXNpdG9yRGVsZWdhdGUoKSA9IGRlZmF1bHQ7CisKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRSZWNvcmRPZmZzZXQoQmluYXJ5U3RyZWFtUmVhZGVyIFJlYWRlcikgPSAwOworICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRGaWxlTmFtZUZvckZpbGVPZmZzZXQodWludDMyX3QgRmlsZU9mZnNldCkgPSAwOworICB2aXJ0dWFsIERlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uUmVmIGdldFN0cmluZ1RhYmxlKCkgPSAwOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19TWU1CT0xWSVNJVE9SREVMRUdBVEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUNvbGxlY3Rpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVDb2xsZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTlmYzliMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVDb2xsZWN0aW9uLmgKQEAgLTAsMCArMSw0OCBAQAorLy89PT0tIFR5cGVDb2xsZWN0aW9uLmggLSBBIGNvbGxlY3Rpb24gb2YgQ29kZVZpZXcgdHlwZSByZWNvcmRzIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19UWVBFQ09MTEVDVElPTl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVDT0xMRUNUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUluZGV4LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVJlY29yZC5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworY2xhc3MgVHlwZUNvbGxlY3Rpb24geworcHVibGljOgorICB2aXJ0dWFsIH5UeXBlQ29sbGVjdGlvbigpID0gZGVmYXVsdDsKKworICBib29sIGVtcHR5KCkgeyByZXR1cm4gc2l6ZSgpID09IDA7IH0KKworICB2aXJ0dWFsIE9wdGlvbmFsPFR5cGVJbmRleD4gZ2V0Rmlyc3QoKSA9IDA7CisgIHZpcnR1YWwgT3B0aW9uYWw8VHlwZUluZGV4PiBnZXROZXh0KFR5cGVJbmRleCBQcmV2KSA9IDA7CisKKyAgdmlydHVhbCBDVlR5cGUgZ2V0VHlwZShUeXBlSW5kZXggSW5kZXgpID0gMDsKKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0VHlwZU5hbWUoVHlwZUluZGV4IEluZGV4KSA9IDA7CisgIHZpcnR1YWwgYm9vbCBjb250YWlucyhUeXBlSW5kZXggSW5kZXgpID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBzaXplKCkgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGNhcGFjaXR5KCkgPSAwOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBURnVuYz4gdm9pZCBGb3JFYWNoUmVjb3JkKFRGdW5jIEZ1bmMpIHsKKyAgICBPcHRpb25hbDxUeXBlSW5kZXg+IE5leHQgPSBnZXRGaXJzdCgpOworCisgICAgd2hpbGUgKE5leHQuaGFzVmFsdWUoKSkgeworICAgICAgVHlwZUluZGV4IE4gPSAqTmV4dDsKKyAgICAgIEZ1bmMoTiwgZ2V0VHlwZShOKSk7CisgICAgICBOZXh0ID0gZ2V0TmV4dChOKTsKKyAgICB9CisgIH0KK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZURlc2VyaWFsaXplci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZURlc2VyaWFsaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk4ODdkOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlRGVzZXJpYWxpemVyLmgKQEAgLTAsMCArMSwxNjYgQEAKKy8vPT09LSBUeXBlRGVzZXJpYWxpemVyLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRURFU0VSSUFMSVpFUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVERVNFUklBTElaRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlUmVjb3JkTWFwcGluZy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVWaXNpdG9yQ2FsbGJhY2tzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeUJ5dGVTdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVhZGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgVHlwZURlc2VyaWFsaXplciA6IHB1YmxpYyBUeXBlVmlzaXRvckNhbGxiYWNrcyB7CisgIHN0cnVjdCBNYXBwaW5nSW5mbyB7CisgICAgZXhwbGljaXQgTWFwcGluZ0luZm8oQXJyYXlSZWY8dWludDhfdD4gUmVjb3JkRGF0YSkKKyAgICAgICAgOiBTdHJlYW0oUmVjb3JkRGF0YSwgbGx2bTo6c3VwcG9ydDo6bGl0dGxlKSwgUmVhZGVyKFN0cmVhbSksCisgICAgICAgICAgTWFwcGluZyhSZWFkZXIpIHt9CisKKyAgICBCaW5hcnlCeXRlU3RyZWFtIFN0cmVhbTsKKyAgICBCaW5hcnlTdHJlYW1SZWFkZXIgUmVhZGVyOworICAgIFR5cGVSZWNvcmRNYXBwaW5nIE1hcHBpbmc7CisgIH07CisKK3B1YmxpYzoKKyAgVHlwZURlc2VyaWFsaXplcigpID0gZGVmYXVsdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RhdGljIEVycm9yIGRlc2VyaWFsaXplQXMoQ1ZUeXBlICZDVlQsIFQgJlJlY29yZCkgeworICAgIFJlY29yZC5LaW5kID0gc3RhdGljX2Nhc3Q8VHlwZVJlY29yZEtpbmQ+KENWVC5raW5kKCkpOworICAgIE1hcHBpbmdJbmZvIEkoQ1ZULmNvbnRlbnQoKSk7CisgICAgaWYgKGF1dG8gRUMgPSBJLk1hcHBpbmcudmlzaXRUeXBlQmVnaW4oQ1ZUKSkKKyAgICAgIHJldHVybiBFQzsKKyAgICBpZiAoYXV0byBFQyA9IEkuTWFwcGluZy52aXNpdEtub3duUmVjb3JkKENWVCwgUmVjb3JkKSkKKyAgICAgIHJldHVybiBFQzsKKyAgICBpZiAoYXV0byBFQyA9IEkuTWFwcGluZy52aXNpdFR5cGVFbmQoQ1ZUKSkKKyAgICAgIHJldHVybiBFQzsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgRXhwZWN0ZWQ8VD4gZGVzZXJpYWxpemVBcyhBcnJheVJlZjx1aW50OF90PiBEYXRhKSB7CisgICAgY29uc3QgUmVjb3JkUHJlZml4ICpQcmVmaXggPQorICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IFJlY29yZFByZWZpeCAqPihEYXRhLmRhdGEoKSk7CisgICAgVHlwZVJlY29yZEtpbmQgSyA9CisgICAgICAgIHN0YXRpY19jYXN0PFR5cGVSZWNvcmRLaW5kPih1aW50MTZfdChQcmVmaXgtPlJlY29yZEtpbmQpKTsKKyAgICBUIFJlY29yZChLKTsKKyAgICBDVlR5cGUgQ1ZUKHN0YXRpY19jYXN0PFR5cGVMZWFmS2luZD4oSyksIERhdGEpOworICAgIGlmIChhdXRvIEVDID0gZGVzZXJpYWxpemVBczxUPihDVlQsIFJlY29yZCkpCisgICAgICByZXR1cm4gc3RkOjptb3ZlKEVDKTsKKyAgICByZXR1cm4gUmVjb3JkOworICB9CisKKyAgRXJyb3IgdmlzaXRUeXBlQmVnaW4oQ1ZUeXBlICZSZWNvcmQpIG92ZXJyaWRlIHsKKyAgICBhc3NlcnQoIU1hcHBpbmcgJiYgIkFscmVhZHkgaW4gYSB0eXBlIG1hcHBpbmchIik7CisgICAgTWFwcGluZyA9IGxsdm06Om1ha2VfdW5pcXVlPE1hcHBpbmdJbmZvPihSZWNvcmQuY29udGVudCgpKTsKKyAgICByZXR1cm4gTWFwcGluZy0+TWFwcGluZy52aXNpdFR5cGVCZWdpbihSZWNvcmQpOworICB9CisKKyAgRXJyb3IgdmlzaXRUeXBlQmVnaW4oQ1ZUeXBlICZSZWNvcmQsIFR5cGVJbmRleCBJbmRleCkgb3ZlcnJpZGUgeworICAgIHJldHVybiB2aXNpdFR5cGVCZWdpbihSZWNvcmQpOworICB9CisKKyAgRXJyb3IgdmlzaXRUeXBlRW5kKENWVHlwZSAmUmVjb3JkKSBvdmVycmlkZSB7CisgICAgYXNzZXJ0KE1hcHBpbmcgJiYgIk5vdCBpbiBhIHR5cGUgbWFwcGluZyEiKTsKKyAgICBhdXRvIEVDID0gTWFwcGluZy0+TWFwcGluZy52aXNpdFR5cGVFbmQoUmVjb3JkKTsKKyAgICBNYXBwaW5nLnJlc2V0KCk7CisgICAgcmV0dXJuIEVDOworICB9CisKKyNkZWZpbmUgVFlQRV9SRUNPUkQoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVycm9yIHZpc2l0S25vd25SZWNvcmQoQ1ZUeXBlICZDVlIsIE5hbWUjI1JlY29yZCAmUmVjb3JkKSBvdmVycmlkZSB7ICAgICAgICAgXAorICAgIHJldHVybiB2aXNpdEtub3duUmVjb3JkSW1wbDxOYW1lIyNSZWNvcmQ+KENWUiwgUmVjb3JkKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2RlZmluZSBNRU1CRVJfUkVDT1JEKEVudW1OYW1lLCBFbnVtVmFsLCBOYW1lKQorI2RlZmluZSBUWVBFX1JFQ09SRF9BTElBUyhFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSwgQWxpYXNOYW1lKQorI2RlZmluZSBNRU1CRVJfUkVDT1JEX0FMSUFTKEVudW1OYW1lLCBFbnVtVmFsLCBOYW1lLCBBbGlhc05hbWUpCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdUeXBlcy5kZWYiCisKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZWNvcmRUeXBlPgorICBFcnJvciB2aXNpdEtub3duUmVjb3JkSW1wbChDVlR5cGUgJkNWUiwgUmVjb3JkVHlwZSAmUmVjb3JkKSB7CisgICAgcmV0dXJuIE1hcHBpbmctPk1hcHBpbmcudmlzaXRLbm93blJlY29yZChDVlIsIFJlY29yZCk7CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8TWFwcGluZ0luZm8+IE1hcHBpbmc7Cit9OworCitjbGFzcyBGaWVsZExpc3REZXNlcmlhbGl6ZXIgOiBwdWJsaWMgVHlwZVZpc2l0b3JDYWxsYmFja3MgeworICBzdHJ1Y3QgTWFwcGluZ0luZm8geworICAgIGV4cGxpY2l0IE1hcHBpbmdJbmZvKEJpbmFyeVN0cmVhbVJlYWRlciAmUikKKyAgICAgICAgOiBSZWFkZXIoUiksIE1hcHBpbmcoUmVhZGVyKSwgU3RhcnRPZmZzZXQoMCkge30KKworICAgIEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyOworICAgIFR5cGVSZWNvcmRNYXBwaW5nIE1hcHBpbmc7CisgICAgdWludDMyX3QgU3RhcnRPZmZzZXQ7CisgIH07CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgRmllbGRMaXN0RGVzZXJpYWxpemVyKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyKSA6IE1hcHBpbmcoUmVhZGVyKSB7CisgICAgQ1ZUeXBlIEZpZWxkTGlzdDsKKyAgICBGaWVsZExpc3QuVHlwZSA9IFR5cGVMZWFmS2luZDo6TEZfRklFTERMSVNUOworICAgIGNvbnN1bWVFcnJvcihNYXBwaW5nLk1hcHBpbmcudmlzaXRUeXBlQmVnaW4oRmllbGRMaXN0KSk7CisgIH0KKworICB+RmllbGRMaXN0RGVzZXJpYWxpemVyKCkgb3ZlcnJpZGUgeworICAgIENWVHlwZSBGaWVsZExpc3Q7CisgICAgRmllbGRMaXN0LlR5cGUgPSBUeXBlTGVhZktpbmQ6OkxGX0ZJRUxETElTVDsKKyAgICBjb25zdW1lRXJyb3IoTWFwcGluZy5NYXBwaW5nLnZpc2l0VHlwZUVuZChGaWVsZExpc3QpKTsKKyAgfQorCisgIEVycm9yIHZpc2l0TWVtYmVyQmVnaW4oQ1ZNZW1iZXJSZWNvcmQgJlJlY29yZCkgb3ZlcnJpZGUgeworICAgIE1hcHBpbmcuU3RhcnRPZmZzZXQgPSBNYXBwaW5nLlJlYWRlci5nZXRPZmZzZXQoKTsKKyAgICByZXR1cm4gTWFwcGluZy5NYXBwaW5nLnZpc2l0TWVtYmVyQmVnaW4oUmVjb3JkKTsKKyAgfQorCisgIEVycm9yIHZpc2l0TWVtYmVyRW5kKENWTWVtYmVyUmVjb3JkICZSZWNvcmQpIG92ZXJyaWRlIHsKKyAgICBpZiAoYXV0byBFQyA9IE1hcHBpbmcuTWFwcGluZy52aXNpdE1lbWJlckVuZChSZWNvcmQpKQorICAgICAgcmV0dXJuIEVDOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyNkZWZpbmUgVFlQRV9SRUNPUkQoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUpCisjZGVmaW5lIE1FTUJFUl9SRUNPUkQoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFcnJvciB2aXNpdEtub3duTWVtYmVyKENWTWVtYmVyUmVjb3JkICZDVlIsIE5hbWUjI1JlY29yZCAmUmVjb3JkKSBvdmVycmlkZSB7IFwKKyAgICByZXR1cm4gdmlzaXRLbm93bk1lbWJlckltcGw8TmFtZSMjUmVjb3JkPihDVlIsIFJlY29yZCk7ICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgVFlQRV9SRUNPUkRfQUxJQVMoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUsIEFsaWFzTmFtZSkKKyNkZWZpbmUgTUVNQkVSX1JFQ09SRF9BTElBUyhFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSwgQWxpYXNOYW1lKQorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3VHlwZXMuZGVmIgorCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVjb3JkVHlwZT4KKyAgRXJyb3IgdmlzaXRLbm93bk1lbWJlckltcGwoQ1ZNZW1iZXJSZWNvcmQgJkNWUiwgUmVjb3JkVHlwZSAmUmVjb3JkKSB7CisgICAgaWYgKGF1dG8gRUMgPSBNYXBwaW5nLk1hcHBpbmcudmlzaXRLbm93bk1lbWJlcihDVlIsIFJlY29yZCkpCisgICAgICByZXR1cm4gRUM7CisKKyAgICB1aW50MzJfdCBFbmRPZmZzZXQgPSBNYXBwaW5nLlJlYWRlci5nZXRPZmZzZXQoKTsKKyAgICB1aW50MzJfdCBSZWNvcmRMZW5ndGggPSBFbmRPZmZzZXQgLSBNYXBwaW5nLlN0YXJ0T2Zmc2V0OworICAgIE1hcHBpbmcuUmVhZGVyLnNldE9mZnNldChNYXBwaW5nLlN0YXJ0T2Zmc2V0KTsKKyAgICBpZiAoYXV0byBFQyA9IE1hcHBpbmcuUmVhZGVyLnJlYWRCeXRlcyhDVlIuRGF0YSwgUmVjb3JkTGVuZ3RoKSkKKyAgICAgIHJldHVybiBFQzsKKyAgICBhc3NlcnQoTWFwcGluZy5SZWFkZXIuZ2V0T2Zmc2V0KCkgPT0gRW5kT2Zmc2V0KTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorICBNYXBwaW5nSW5mbyBNYXBwaW5nOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRURFU0VSSUFMSVpFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlRHVtcFZpc2l0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVEdW1wVmlzaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFmYjhiMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlRHVtcFZpc2l0b3IuaApAQCAtMCwwICsxLDg2IEBACisvLz09PS0tIFR5cGVEdW1wVmlzaXRvci5oIC0gQ29kZVZpZXcgdHlwZSBpbmZvIGR1bXBlciAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVEVU1QVklTSVRPUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVEVU1QVklTSVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVJbmRleC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlVmlzaXRvckNhbGxiYWNrcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBTY29wZWRQcmludGVyOworCituYW1lc3BhY2UgY29kZXZpZXcgeworCitjbGFzcyBUeXBlQ29sbGVjdGlvbjsKKworLy8vIER1bXBlciBmb3IgQ29kZVZpZXcgdHlwZSBzdHJlYW1zIGZvdW5kIGluIENPRkYgb2JqZWN0IGZpbGVzIGFuZCBQREIgZmlsZXMuCitjbGFzcyBUeXBlRHVtcFZpc2l0b3IgOiBwdWJsaWMgVHlwZVZpc2l0b3JDYWxsYmFja3MgeworcHVibGljOgorICBUeXBlRHVtcFZpc2l0b3IoVHlwZUNvbGxlY3Rpb24gJlRwaVR5cGVzLCBTY29wZWRQcmludGVyICpXLAorICAgICAgICAgICAgICAgICAgYm9vbCBQcmludFJlY29yZEJ5dGVzKQorICAgICAgOiBXKFcpLCBQcmludFJlY29yZEJ5dGVzKFByaW50UmVjb3JkQnl0ZXMpLCBUcGlUeXBlcyhUcGlUeXBlcykge30KKworICAvLy8gV2hlbiBkdW1waW5nIHR5cGVzIGZyb20gYW4gSVBJIHN0cmVhbSBpbiBhIFBEQiwgYSB0eXBlIGluZGV4IG1heSByZWZlciB0bworICAvLy8gYSB0eXBlIG9yIGFuIGl0ZW0gSUQuIFRoZSBkdW1wZXIgd2lsbCBsb29rdXAgdGhlICJuYW1lIiBvZiB0aGUgaW5kZXggaW4KKyAgLy8vIHRoZSBpdGVtIGRhdGFiYXNlIGlmIGFwcHJvcHJpYXRlLiBJZiBJdGVtREIgaXMgbnVsbCwgaXQgd2lsbCB1c2UgVHlwZURCLAorICAvLy8gd2hpY2ggaXMgY29ycmVjdCB3aGVuIGR1bXBpbmcgdHlwZXMgZnJvbSBhbiBvYmplY3QgZmlsZSAoL1o3KS4KKyAgdm9pZCBzZXRJcGlUeXBlcyhUeXBlQ29sbGVjdGlvbiAmVHlwZXMpIHsgSXBpVHlwZXMgPSAmVHlwZXM7IH0KKworICB2b2lkIHByaW50VHlwZUluZGV4KFN0cmluZ1JlZiBGaWVsZE5hbWUsIFR5cGVJbmRleCBUSSkgY29uc3Q7CisKKyAgdm9pZCBwcmludEl0ZW1JbmRleChTdHJpbmdSZWYgRmllbGROYW1lLCBUeXBlSW5kZXggVEkpIGNvbnN0OworCisgIC8vLyBBY3Rpb24gdG8gdGFrZSBvbiB1bmtub3duIHR5cGVzLiBCeSBkZWZhdWx0LCB0aGV5IGFyZSBpZ25vcmVkLgorICBFcnJvciB2aXNpdFVua25vd25UeXBlKENWVHlwZSAmUmVjb3JkKSBvdmVycmlkZTsKKyAgRXJyb3IgdmlzaXRVbmtub3duTWVtYmVyKENWTWVtYmVyUmVjb3JkICZSZWNvcmQpIG92ZXJyaWRlOworCisgIC8vLyBQYWlyZWQgYmVnaW4vZW5kIGFjdGlvbnMgZm9yIGFsbCB0eXBlcy4gUmVjZWl2ZXMgYWxsIHJlY29yZCBkYXRhLAorICAvLy8gaW5jbHVkaW5nIHRoZSBmaXhlZC1sZW5ndGggcmVjb3JkIHByZWZpeC4KKyAgRXJyb3IgdmlzaXRUeXBlQmVnaW4oQ1ZUeXBlICZSZWNvcmQpIG92ZXJyaWRlOworICBFcnJvciB2aXNpdFR5cGVCZWdpbihDVlR5cGUgJlJlY29yZCwgVHlwZUluZGV4IEluZGV4KSBvdmVycmlkZTsKKyAgRXJyb3IgdmlzaXRUeXBlRW5kKENWVHlwZSAmUmVjb3JkKSBvdmVycmlkZTsKKyAgRXJyb3IgdmlzaXRNZW1iZXJCZWdpbihDVk1lbWJlclJlY29yZCAmUmVjb3JkKSBvdmVycmlkZTsKKyAgRXJyb3IgdmlzaXRNZW1iZXJFbmQoQ1ZNZW1iZXJSZWNvcmQgJlJlY29yZCkgb3ZlcnJpZGU7CisKKyNkZWZpbmUgVFlQRV9SRUNPUkQoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVycm9yIHZpc2l0S25vd25SZWNvcmQoQ1ZUeXBlICZDVlIsIE5hbWUjI1JlY29yZCAmUmVjb3JkKSBvdmVycmlkZTsKKyNkZWZpbmUgTUVNQkVSX1JFQ09SRChFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVycm9yIHZpc2l0S25vd25NZW1iZXIoQ1ZNZW1iZXJSZWNvcmQgJkNWUiwgTmFtZSMjUmVjb3JkICZSZWNvcmQpIG92ZXJyaWRlOworI2RlZmluZSBUWVBFX1JFQ09SRF9BTElBUyhFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSwgQWxpYXNOYW1lKQorI2RlZmluZSBNRU1CRVJfUkVDT1JEX0FMSUFTKEVudW1OYW1lLCBFbnVtVmFsLCBOYW1lLCBBbGlhc05hbWUpCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdUeXBlcy5kZWYiCisKK3ByaXZhdGU6CisgIHZvaWQgcHJpbnRNZW1iZXJBdHRyaWJ1dGVzKE1lbWJlckF0dHJpYnV0ZXMgQXR0cnMpOworICB2b2lkIHByaW50TWVtYmVyQXR0cmlidXRlcyhNZW1iZXJBY2Nlc3MgQWNjZXNzLCBNZXRob2RLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZE9wdGlvbnMgT3B0aW9ucyk7CisKKyAgLy8vIEdldCB0aGUgZGF0YWJhc2Ugb2YgaW5kaWNlcyBmb3IgdGhlIHN0cmVhbSB0aGF0IHdlIGFyZSBkdW1waW5nLiBJZiBJdGVtREIKKyAgLy8vIGlzIHNldCwgdGhlbiB3ZSBtdXN0IGJlIGR1bXBpbmcgYW4gaXRlbSAoSVBJKSBzdHJlYW0uIFRoaXMgd2lsbCBhbHNvCisgIC8vLyBhbHdheXMgZ2V0IHRoZSBhcHByb3ByaWF0ZSBEQiBmb3IgcHJpbnRpbmcgaXRlbSBuYW1lcy4KKyAgVHlwZUNvbGxlY3Rpb24gJmdldFNvdXJjZVR5cGVzKCkgY29uc3QgeworICAgIHJldHVybiBJcGlUeXBlcyA/ICpJcGlUeXBlcyA6IFRwaVR5cGVzOworICB9CisKKyAgU2NvcGVkUHJpbnRlciAqVzsKKworICBib29sIFByaW50UmVjb3JkQnl0ZXMgPSBmYWxzZTsKKworICBUeXBlQ29sbGVjdGlvbiAmVHBpVHlwZXM7CisgIFR5cGVDb2xsZWN0aW9uICpJcGlUeXBlcyA9IG51bGxwdHI7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUhhc2hpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVIYXNoaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzQxMzM3NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVIYXNoaW5nLmgKQEAgLTAsMCArMSwyMDQgQEAKKy8vPT09LSBUeXBlSGFzaGluZy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKy0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRUhBU0hJTkdfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19UWVBFSEFTSElOR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9IYXNoaW5nLmgiCisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUluZGV4LmgiCisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0UHJvdmlkZXJzLmgiCisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworLy8vIEEgbG9jYWxseSBoYXNoZWQgdHlwZSByZXByZXNlbnRzIGEgc3RyYWlnaHRmb3J3YXJkIGhhc2ggY29kZSBvZiBhIHNlcmlhbGl6ZWQKKy8vLyByZWNvcmQuICBUaGUgcmVjb3JkIGlzIHNpbXBseSBzZXJpYWxpemVkLCBhbmQgdGhlbiB0aGUgYnl0ZXMgYXJlIGhhc2hlZCBieQorLy8vIGEgc3RhbmRhcmQgYWxnb3JpdGhtLiAgVGhpcyBpcyBzdWZmaWNpZW50IGZvciB0aGUgY2FzZSBvZiBkZS1kdXBsaWNhdGluZworLy8vIHJlY29yZHMgd2l0aGluIGEgc2luZ2xlIHNlcXVlbmNlIG9mIHR5cGVzLCBiZWNhdXNlIGlmIHR3byByZWNvcmRzIGJvdGggaGF2ZQorLy8vIGEgYmFjay1yZWZlcmVuY2UgdG8gdGhlIHNhbWUgdHlwZSBpbiB0aGUgc2FtZSBzdHJlYW0sIHRoZXkgd2lsbCBib3RoIGhhdmUKKy8vLyB0aGUgc2FtZSBudW1lcmljIHZhbHVlIGZvciB0aGUgVHlwZUluZGV4IG9mIHRoZSBiYWNrIHJlZmVyZW5jZS4KK3N0cnVjdCBMb2NhbGx5SGFzaGVkVHlwZSB7CisgIGhhc2hfY29kZSBIYXNoOworICBBcnJheVJlZjx1aW50OF90PiBSZWNvcmREYXRhOworCisgIC8vLyBHaXZlbiBhIHR5cGUsIGNvbXB1dGUgaXRzIGxvY2FsIGhhc2guCisgIHN0YXRpYyBMb2NhbGx5SGFzaGVkVHlwZSBoYXNoVHlwZShBcnJheVJlZjx1aW50OF90PiBSZWNvcmREYXRhKTsKKworICAvLy8gR2l2ZW4gYSBzZXF1ZW5jZSBvZiB0eXBlcywgY29tcHV0ZSBhbGwgb2YgdGhlIGxvY2FsIGhhc2hlcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJhbmdlPgorICBzdGF0aWMgc3RkOjp2ZWN0b3I8TG9jYWxseUhhc2hlZFR5cGU+IGhhc2hUeXBlcyhSYW5nZSAmJlJlY29yZHMpIHsKKyAgICBzdGQ6OnZlY3RvcjxMb2NhbGx5SGFzaGVkVHlwZT4gSGFzaGVzOworICAgIEhhc2hlcy5yZXNlcnZlKHN0ZDo6ZGlzdGFuY2Uoc3RkOjpiZWdpbihSZWNvcmRzKSwgc3RkOjplbmQoUmVjb3JkcykpKTsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJlIgOiBSZWNvcmRzKQorICAgICAgSGFzaGVzLnB1c2hfYmFjayhoYXNoVHlwZShSKSk7CisKKyAgICByZXR1cm4gSGFzaGVzOworICB9CisKKyAgc3RhdGljIHN0ZDo6dmVjdG9yPExvY2FsbHlIYXNoZWRUeXBlPgorICBoYXNoVHlwZUNvbGxlY3Rpb24oVHlwZUNvbGxlY3Rpb24gJlR5cGVzKSB7CisgICAgc3RkOjp2ZWN0b3I8TG9jYWxseUhhc2hlZFR5cGU+IEhhc2hlczsKKyAgICBUeXBlcy5Gb3JFYWNoUmVjb3JkKFsmSGFzaGVzXShUeXBlSW5kZXggVEksIGNvbnN0IENWVHlwZSAmVHlwZSkgeworICAgICAgSGFzaGVzLnB1c2hfYmFjayhoYXNoVHlwZShUeXBlLlJlY29yZERhdGEpKTsKKyAgICB9KTsKKyAgICByZXR1cm4gSGFzaGVzOworICB9Cit9OworCitlbnVtIGNsYXNzIEdsb2JhbFR5cGVIYXNoQWxnIDogdWludDE2X3QgeyBTSEExID0gMCB9OworCisvLy8gQSBnbG9iYWxseSBoYXNoZWQgdHlwZSByZXByZXNlbnRzIGEgaGFzaCB2YWx1ZSB0aGF0IGlzIHN1ZmZpY2llbnQgdG8KKy8vLyB1bmlxdWVseSBpZGVudGlmeSBhIHJlY29yZCBhY3Jvc3MgbXVsdGlwbGUgdHlwZSBzdHJlYW1zIG9yIHR5cGUgc2VxdWVuY2VzLgorLy8vIFRoaXMgd29ya3MgYnksIGZvciBhbnkgZ2l2ZW4gcmVjb3JkIEEgd2hpY2ggcmVmZXJlbmNlcyBCLCByZXBsYWNpbmcgdGhlCisvLy8gVHlwZUluZGV4IHRoYXQgcmVmZXJzIHRvIEIgd2l0aCBhIHByZXZpb3VzbHktY29tcHV0ZWQgZ2xvYmFsIGhhc2ggZm9yIEIuICBBcworLy8vIHRoaXMgaXMgYSByZWN1cnNpdmUgYWxnb3JpdGhtIChlLmcuIHRoZSBnbG9iYWwgaGFzaCBvZiBCIGFsc28gZGVwZW5kcyBvbiB0aGUKKy8vLyBnbG9iYWwgaGFzaGVzIG9mIHRoZSB0eXBlcyB0aGF0IEIgcmVmZXJzIHRvKSwgYSBnbG9iYWwgaGFzaCBjYW4gdW5pcXVlbHkKKy8vLyBpZGVudGlmeSBpZGVudGlmeSB0aGF0IEEgb2NjdXJzIGluIGFub3RoZXIgc3RyZWFtIHRoYXQgaGFzIGEgY29tcGxldGVseQorLy8vIGRpZmZlcmVudCBncmFwaCBzdHJ1Y3R1cmUuICBBbHRob3VnaCB0aGUgaGFzaCBpdHNlbGYgaXMgc2xvd2VyIHRvIGNvbXB1dGUsCisvLy8gcHJvYmluZyBpcyBtdWNoIGZhc3RlciB3aXRoIGEgZ2xvYmFsbHkgaGFzaGVkIHR5cGUsIGJlY2F1c2UgdGhlIGhhc2ggaXRzZWxmCisvLy8gaXMgY29uc2lkZXJlZCAiYXMgZ29vZCBhcyIgdGhlIG9yaWdpbmFsIHR5cGUuICBTaW5jZSB0eXBlIHJlY29yZHMgY2FuIGJlCisvLy8gcXVpdGUgbGFyZ2UsIHRoaXMgbWFrZXMgdGhlIGVxdWFsaXR5IGNvbXBhcmlzb24gb2YgdGhlIGhhc2ggbXVjaCBmYXN0ZXIgdGhhbgorLy8vIGVxdWFsaXR5IGNvbXBhcmlzb24gb2YgYSBmdWxsIHJlY29yZC4KK3N0cnVjdCBHbG9iYWxseUhhc2hlZFR5cGUgeworICBHbG9iYWxseUhhc2hlZFR5cGUoKSA9IGRlZmF1bHQ7CisgIEdsb2JhbGx5SGFzaGVkVHlwZShTdHJpbmdSZWYgSCkKKyAgICAgIDogR2xvYmFsbHlIYXNoZWRUeXBlKEFycmF5UmVmPHVpbnQ4X3Q+KEguYnl0ZXNfYmVnaW4oKSwgSC5ieXRlc19lbmQoKSkpIHt9CisgIEdsb2JhbGx5SGFzaGVkVHlwZShBcnJheVJlZjx1aW50OF90PiBIKSB7CisgICAgYXNzZXJ0KEguc2l6ZSgpID09IDIwKTsKKyAgICA6Om1lbWNweShIYXNoLmRhdGEoKSwgSC5kYXRhKCksIDIwKTsKKyAgfQorICBzdGQ6OmFycmF5PHVpbnQ4X3QsIDIwPiBIYXNoOworCisgIC8vLyBHaXZlbiBhIHNlcXVlbmNlIG9mIGJ5dGVzIHJlcHJlc2VudGluZyBhIHJlY29yZCwgY29tcHV0ZSBhIGdsb2JhbCBoYXNoIGZvcgorICAvLy8gdGhpcyByZWNvcmQuICBEdWUgdG8gdGhlIG5hdHVyZSBvZiBnbG9iYWwgaGFzaGVzIGluY29ycG9yYXRpbmcgdGhlIGhhc2hlcworICAvLy8gb2YgcmVmZXJlbmNlZCByZWNvcmRzLCB0aGlzIGZ1bmN0aW9uIHJlcXVpcmVzIGEgbGlzdCBvZiB0eXBlcyBhbmQgaWRzCisgIC8vLyB0aGF0IFJlY29yZERhdGEgbWlnaHQgcmVmZXJlbmNlLCBpbmRleGFibGUgYnkgVHlwZUluZGV4LgorICBzdGF0aWMgR2xvYmFsbHlIYXNoZWRUeXBlIGhhc2hUeXBlKEFycmF5UmVmPHVpbnQ4X3Q+IFJlY29yZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8R2xvYmFsbHlIYXNoZWRUeXBlPiBQcmV2aW91c1R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEdsb2JhbGx5SGFzaGVkVHlwZT4gUHJldmlvdXNJZHMpOworCisgIC8vLyBHaXZlbiBhIHNlcXVlbmNlIG9mIGJ5dGVzIHJlcHJlc2VudGluZyBhIHJlY29yZCwgY29tcHV0ZSBhIGdsb2JhbCBoYXNoIGZvcgorICAvLy8gdGhpcyByZWNvcmQuICBEdWUgdG8gdGhlIG5hdHVyZSBvZiBnbG9iYWwgaGFzaGVzIGluY29ycG9yYXRpbmcgdGhlIGhhc2hlcworICAvLy8gb2YgcmVmZXJlbmNlZCByZWNvcmRzLCB0aGlzIGZ1bmN0aW9uIHJlcXVpcmVzIGEgbGlzdCBvZiB0eXBlcyBhbmQgaWRzCisgIC8vLyB0aGF0IFJlY29yZERhdGEgbWlnaHQgcmVmZXJlbmNlLCBpbmRleGFibGUgYnkgVHlwZUluZGV4LgorICBzdGF0aWMgR2xvYmFsbHlIYXNoZWRUeXBlIGhhc2hUeXBlKENWVHlwZSBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEdsb2JhbGx5SGFzaGVkVHlwZT4gUHJldmlvdXNUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxHbG9iYWxseUhhc2hlZFR5cGU+IFByZXZpb3VzSWRzKSB7CisgICAgcmV0dXJuIGhhc2hUeXBlKFR5cGUuUmVjb3JkRGF0YSwgUHJldmlvdXNUeXBlcywgUHJldmlvdXNJZHMpOworICB9CisKKyAgLy8vIEdpdmVuIGEgc2VxdWVuY2Ugb2YgY29tYmluZWQgdHlwZSBhbmQgSUQgcmVjb3JkcywgY29tcHV0ZSBnbG9iYWwgaGFzaGVzCisgIC8vLyBmb3IgZWFjaCBvZiB0aGVtLCByZXR1cm5pbmcgdGhlIHJlc3VsdHMgaW4gYSB2ZWN0b3Igb2YgaGFzaGVkIHR5cGVzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmFuZ2U+CisgIHN0YXRpYyBzdGQ6OnZlY3RvcjxHbG9iYWxseUhhc2hlZFR5cGU+IGhhc2hUeXBlcyhSYW5nZSAmJlJlY29yZHMpIHsKKyAgICBzdGQ6OnZlY3RvcjxHbG9iYWxseUhhc2hlZFR5cGU+IEhhc2hlczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJlIgOiBSZWNvcmRzKQorICAgICAgSGFzaGVzLnB1c2hfYmFjayhoYXNoVHlwZShSLCBIYXNoZXMsIEhhc2hlcykpOworCisgICAgcmV0dXJuIEhhc2hlczsKKyAgfQorCisgIC8vLyBHaXZlbiBhIHNlcXVlbmNlIG9mIGNvbWJpbmVkIHR5cGUgYW5kIElEIHJlY29yZHMsIGNvbXB1dGUgZ2xvYmFsIGhhc2hlcworICAvLy8gZm9yIGVhY2ggb2YgdGhlbSwgcmV0dXJuaW5nIHRoZSByZXN1bHRzIGluIGEgdmVjdG9yIG9mIGhhc2hlZCB0eXBlcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJhbmdlPgorICBzdGF0aWMgc3RkOjp2ZWN0b3I8R2xvYmFsbHlIYXNoZWRUeXBlPgorICBoYXNoSWRzKFJhbmdlICYmUmVjb3JkcywgQXJyYXlSZWY8R2xvYmFsbHlIYXNoZWRUeXBlPiBUeXBlSGFzaGVzKSB7CisgICAgc3RkOjp2ZWN0b3I8R2xvYmFsbHlIYXNoZWRUeXBlPiBJZEhhc2hlczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJlIgOiBSZWNvcmRzKQorICAgICAgSWRIYXNoZXMucHVzaF9iYWNrKGhhc2hUeXBlKFIsIFR5cGVIYXNoZXMsIElkSGFzaGVzKSk7CisKKyAgICByZXR1cm4gSWRIYXNoZXM7CisgIH0KKworICBzdGF0aWMgc3RkOjp2ZWN0b3I8R2xvYmFsbHlIYXNoZWRUeXBlPgorICBoYXNoVHlwZUNvbGxlY3Rpb24oVHlwZUNvbGxlY3Rpb24gJlR5cGVzKSB7CisgICAgc3RkOjp2ZWN0b3I8R2xvYmFsbHlIYXNoZWRUeXBlPiBIYXNoZXM7CisgICAgVHlwZXMuRm9yRWFjaFJlY29yZChbJkhhc2hlc10oVHlwZUluZGV4IFRJLCBjb25zdCBDVlR5cGUgJlR5cGUpIHsKKyAgICAgIEhhc2hlcy5wdXNoX2JhY2soaGFzaFR5cGUoVHlwZS5SZWNvcmREYXRhLCBIYXNoZXMsIEhhc2hlcykpOworICAgIH0pOworICAgIHJldHVybiBIYXNoZXM7CisgIH0KK307CisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKy8vIGlzX3RyaXZpYWxseV9jb3B5YWJsZSBpcyBub3QgYXZhaWxhYmxlIGluIG9sZGVyIHZlcnNpb25zIG9mIGxpYmMrKywgYnV0IGl0IGlzCisvLyBhdmFpbGFibGUgaW4gYWxsIHN1cHBvcnRlZCB2ZXJzaW9ucyBvZiBNU1ZDLCBzbyBhdCBsZWFzdCB0aGlzIGdpdmVzIHVzIHNvbWUKKy8vIGNvdmVyYWdlLgorc3RhdGljX2Fzc2VydChzdGQ6OmlzX3RyaXZpYWxseV9jb3B5YWJsZTxHbG9iYWxseUhhc2hlZFR5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgIkdsb2JhbGx5SGFzaGVkVHlwZSBtdXN0IGJlIHRyaXZpYWxseSBjb3B5YWJsZSBzbyB0aGF0IHdlIGNhbiAiCisgICAgICAgICAgICAgICJyZWludGVycHJldF9jYXN0IGFycmF5cyBvZiBoYXNoIGRhdGEgdG8gYXJyYXlzIG9mICIKKyAgICAgICAgICAgICAgIkdsb2JhbGx5SGFzaGVkVHlwZSIpOworI2VuZGlmCit9IC8vIG5hbWVzcGFjZSBjb2RldmlldworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPGNvZGV2aWV3OjpMb2NhbGx5SGFzaGVkVHlwZT4geworICBzdGF0aWMgY29kZXZpZXc6OkxvY2FsbHlIYXNoZWRUeXBlIEVtcHR5OworICBzdGF0aWMgY29kZXZpZXc6OkxvY2FsbHlIYXNoZWRUeXBlIFRvbWJzdG9uZTsKKworICBzdGF0aWMgY29kZXZpZXc6OkxvY2FsbHlIYXNoZWRUeXBlIGdldEVtcHR5S2V5KCkgeyByZXR1cm4gRW1wdHk7IH0KKworICBzdGF0aWMgY29kZXZpZXc6OkxvY2FsbHlIYXNoZWRUeXBlIGdldFRvbWJzdG9uZUtleSgpIHsgcmV0dXJuIFRvbWJzdG9uZTsgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29kZXZpZXc6OkxvY2FsbHlIYXNoZWRUeXBlIFZhbCkgeworICAgIHJldHVybiBWYWwuSGFzaDsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29kZXZpZXc6OkxvY2FsbHlIYXNoZWRUeXBlIExIUywKKyAgICAgICAgICAgICAgICAgICAgICBjb2Rldmlldzo6TG9jYWxseUhhc2hlZFR5cGUgUkhTKSB7CisgICAgaWYgKExIUy5IYXNoICE9IFJIUy5IYXNoKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBMSFMuUmVjb3JkRGF0YSA9PSBSSFMuUmVjb3JkRGF0YTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IERlbnNlTWFwSW5mbzxjb2Rldmlldzo6R2xvYmFsbHlIYXNoZWRUeXBlPiB7CisgIHN0YXRpYyBjb2Rldmlldzo6R2xvYmFsbHlIYXNoZWRUeXBlIEVtcHR5OworICBzdGF0aWMgY29kZXZpZXc6Okdsb2JhbGx5SGFzaGVkVHlwZSBUb21ic3RvbmU7CisKKyAgc3RhdGljIGNvZGV2aWV3OjpHbG9iYWxseUhhc2hlZFR5cGUgZ2V0RW1wdHlLZXkoKSB7IHJldHVybiBFbXB0eTsgfQorCisgIHN0YXRpYyBjb2Rldmlldzo6R2xvYmFsbHlIYXNoZWRUeXBlIGdldFRvbWJzdG9uZUtleSgpIHsgcmV0dXJuIFRvbWJzdG9uZTsgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29kZXZpZXc6Okdsb2JhbGx5SGFzaGVkVHlwZSBWYWwpIHsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgKj4oVmFsLkhhc2guZGF0YSgpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29kZXZpZXc6Okdsb2JhbGx5SGFzaGVkVHlwZSBMSFMsCisgICAgICAgICAgICAgICAgICAgICAgY29kZXZpZXc6Okdsb2JhbGx5SGFzaGVkVHlwZSBSSFMpIHsKKyAgICByZXR1cm4gTEhTLkhhc2ggPT0gUkhTLkhhc2g7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBmb3JtYXRfcHJvdmlkZXI8Y29kZXZpZXc6OkxvY2FsbHlIYXNoZWRUeXBlPiB7CitwdWJsaWM6CisgIHN0YXRpYyB2b2lkIGZvcm1hdChjb25zdCBjb2Rldmlldzo6TG9jYWxseUhhc2hlZFR5cGUgJlYsCisgICAgICAgICAgICAgICAgICAgICBsbHZtOjpyYXdfb3N0cmVhbSAmU3RyZWFtLCBTdHJpbmdSZWYgU3R5bGUpIHsKKyAgICB3cml0ZV9oZXgoU3RyZWFtLCBWLkhhc2gsIEhleFByaW50U3R5bGU6OlVwcGVyLCA4KTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGZvcm1hdF9wcm92aWRlcjxjb2Rldmlldzo6R2xvYmFsbHlIYXNoZWRUeXBlPiB7CitwdWJsaWM6CisgIHN0YXRpYyB2b2lkIGZvcm1hdChjb25zdCBjb2Rldmlldzo6R2xvYmFsbHlIYXNoZWRUeXBlICZWLAorICAgICAgICAgICAgICAgICAgICAgbGx2bTo6cmF3X29zdHJlYW0gJlN0cmVhbSwgU3RyaW5nUmVmIFN0eWxlKSB7CisgICAgZm9yICh1aW50OF90IEIgOiBWLkhhc2gpIHsKKyAgICAgIHdyaXRlX2hleChTdHJlYW0sIEIsIEhleFByaW50U3R5bGU6OlVwcGVyLCAyKTsKKyAgICB9CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSW5kZXguaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVJbmRleC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MTI4MWQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSW5kZXguaApAQCAtMCwwICsxLDI5MSBAQAorLy89PT0tIFR5cGVJbmRleC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19UWVBFSU5ERVhfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19UWVBFSU5ERVhfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXBJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y2ludHR5cGVzPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgU2NvcGVkUHJpbnRlcjsKKworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKworY2xhc3MgVHlwZUNvbGxlY3Rpb247CisKK2VudW0gY2xhc3MgU2ltcGxlVHlwZUtpbmQgOiB1aW50MzJfdCB7CisgIE5vbmUgPSAweDAwMDAsICAgICAgICAgIC8vIHVuY2hhcmFjdGVyaXplZCB0eXBlIChubyB0eXBlKQorICBWb2lkID0gMHgwMDAzLCAgICAgICAgICAvLyB2b2lkCisgIE5vdFRyYW5zbGF0ZWQgPSAweDAwMDcsIC8vIHR5cGUgbm90IHRyYW5zbGF0ZWQgYnkgY3ZwYWNrCisgIEhSZXN1bHQgPSAweDAwMDgsICAgICAgIC8vIE9MRS9DT00gSFJFU1VMVAorCisgIFNpZ25lZENoYXJhY3RlciA9IDB4MDAxMCwgICAvLyA4IGJpdCBzaWduZWQKKyAgVW5zaWduZWRDaGFyYWN0ZXIgPSAweDAwMjAsIC8vIDggYml0IHVuc2lnbmVkCisgIE5hcnJvd0NoYXJhY3RlciA9IDB4MDA3MCwgICAvLyByZWFsbHkgYSBjaGFyCisgIFdpZGVDaGFyYWN0ZXIgPSAweDAwNzEsICAgICAvLyB3aWRlIGNoYXIKKyAgQ2hhcmFjdGVyMTYgPSAweDAwN2EsICAgICAgIC8vIGNoYXIxNl90CisgIENoYXJhY3RlcjMyID0gMHgwMDdiLCAgICAgICAvLyBjaGFyMzJfdAorCisgIFNCeXRlID0gMHgwMDY4LCAgICAgICAvLyA4IGJpdCBzaWduZWQgaW50CisgIEJ5dGUgPSAweDAwNjksICAgICAgICAvLyA4IGJpdCB1bnNpZ25lZCBpbnQKKyAgSW50MTZTaG9ydCA9IDB4MDAxMSwgIC8vIDE2IGJpdCBzaWduZWQKKyAgVUludDE2U2hvcnQgPSAweDAwMjEsIC8vIDE2IGJpdCB1bnNpZ25lZAorICBJbnQxNiA9IDB4MDA3MiwgICAgICAgLy8gMTYgYml0IHNpZ25lZCBpbnQKKyAgVUludDE2ID0gMHgwMDczLCAgICAgIC8vIDE2IGJpdCB1bnNpZ25lZCBpbnQKKyAgSW50MzJMb25nID0gMHgwMDEyLCAgIC8vIDMyIGJpdCBzaWduZWQKKyAgVUludDMyTG9uZyA9IDB4MDAyMiwgIC8vIDMyIGJpdCB1bnNpZ25lZAorICBJbnQzMiA9IDB4MDA3NCwgICAgICAgLy8gMzIgYml0IHNpZ25lZCBpbnQKKyAgVUludDMyID0gMHgwMDc1LCAgICAgIC8vIDMyIGJpdCB1bnNpZ25lZCBpbnQKKyAgSW50NjRRdWFkID0gMHgwMDEzLCAgIC8vIDY0IGJpdCBzaWduZWQKKyAgVUludDY0UXVhZCA9IDB4MDAyMywgIC8vIDY0IGJpdCB1bnNpZ25lZAorICBJbnQ2NCA9IDB4MDA3NiwgICAgICAgLy8gNjQgYml0IHNpZ25lZCBpbnQKKyAgVUludDY0ID0gMHgwMDc3LCAgICAgIC8vIDY0IGJpdCB1bnNpZ25lZCBpbnQKKyAgSW50MTI4T2N0ID0gMHgwMDE0LCAgIC8vIDEyOCBiaXQgc2lnbmVkIGludAorICBVSW50MTI4T2N0ID0gMHgwMDI0LCAgLy8gMTI4IGJpdCB1bnNpZ25lZCBpbnQKKyAgSW50MTI4ID0gMHgwMDc4LCAgICAgIC8vIDEyOCBiaXQgc2lnbmVkIGludAorICBVSW50MTI4ID0gMHgwMDc5LCAgICAgLy8gMTI4IGJpdCB1bnNpZ25lZCBpbnQKKworICBGbG9hdDE2ID0gMHgwMDQ2LCAgICAgICAgICAgICAgICAgLy8gMTYgYml0IHJlYWwKKyAgRmxvYXQzMiA9IDB4MDA0MCwgICAgICAgICAgICAgICAgIC8vIDMyIGJpdCByZWFsCisgIEZsb2F0MzJQYXJ0aWFsUHJlY2lzaW9uID0gMHgwMDQ1LCAvLyAzMiBiaXQgUFAgcmVhbAorICBGbG9hdDQ4ID0gMHgwMDQ0LCAgICAgICAgICAgICAgICAgLy8gNDggYml0IHJlYWwKKyAgRmxvYXQ2NCA9IDB4MDA0MSwgICAgICAgICAgICAgICAgIC8vIDY0IGJpdCByZWFsCisgIEZsb2F0ODAgPSAweDAwNDIsICAgICAgICAgICAgICAgICAvLyA4MCBiaXQgcmVhbAorICBGbG9hdDEyOCA9IDB4MDA0MywgICAgICAgICAgICAgICAgLy8gMTI4IGJpdCByZWFsCisKKyAgQ29tcGxleDE2ID0gMHgwMDU2LCAgICAgICAgICAgICAgICAgLy8gMTYgYml0IGNvbXBsZXgKKyAgQ29tcGxleDMyID0gMHgwMDUwLCAgICAgICAgICAgICAgICAgLy8gMzIgYml0IGNvbXBsZXgKKyAgQ29tcGxleDMyUGFydGlhbFByZWNpc2lvbiA9IDB4MDA1NSwgLy8gMzIgYml0IFBQIGNvbXBsZXgKKyAgQ29tcGxleDQ4ID0gMHgwMDU0LCAgICAgICAgICAgICAgICAgLy8gNDggYml0IGNvbXBsZXgKKyAgQ29tcGxleDY0ID0gMHgwMDUxLCAgICAgICAgICAgICAgICAgLy8gNjQgYml0IGNvbXBsZXgKKyAgQ29tcGxleDgwID0gMHgwMDUyLCAgICAgICAgICAgICAgICAgLy8gODAgYml0IGNvbXBsZXgKKyAgQ29tcGxleDEyOCA9IDB4MDA1MywgICAgICAgICAgICAgICAgLy8gMTI4IGJpdCBjb21wbGV4CisKKyAgQm9vbGVhbjggPSAweDAwMzAsICAgLy8gOCBiaXQgYm9vbGVhbgorICBCb29sZWFuMTYgPSAweDAwMzEsICAvLyAxNiBiaXQgYm9vbGVhbgorICBCb29sZWFuMzIgPSAweDAwMzIsICAvLyAzMiBiaXQgYm9vbGVhbgorICBCb29sZWFuNjQgPSAweDAwMzMsICAvLyA2NCBiaXQgYm9vbGVhbgorICBCb29sZWFuMTI4ID0gMHgwMDM0LCAvLyAxMjggYml0IGJvb2xlYW4KK307CisKK2VudW0gY2xhc3MgU2ltcGxlVHlwZU1vZGUgOiB1aW50MzJfdCB7CisgIERpcmVjdCA9IDB4MDAwMDAwMDAsICAgICAgICAvLyBOb3QgYSBwb2ludGVyCisgIE5lYXJQb2ludGVyID0gMHgwMDAwMDEwMCwgICAvLyBOZWFyIHBvaW50ZXIKKyAgRmFyUG9pbnRlciA9IDB4MDAwMDAyMDAsICAgIC8vIEZhciBwb2ludGVyCisgIEh1Z2VQb2ludGVyID0gMHgwMDAwMDMwMCwgICAvLyBIdWdlIHBvaW50ZXIKKyAgTmVhclBvaW50ZXIzMiA9IDB4MDAwMDA0MDAsIC8vIDMyIGJpdCBuZWFyIHBvaW50ZXIKKyAgRmFyUG9pbnRlcjMyID0gMHgwMDAwMDUwMCwgIC8vIDMyIGJpdCBmYXIgcG9pbnRlcgorICBOZWFyUG9pbnRlcjY0ID0gMHgwMDAwMDYwMCwgLy8gNjQgYml0IG5lYXIgcG9pbnRlcgorICBOZWFyUG9pbnRlcjEyOCA9IDB4MDAwMDA3MDAgLy8gMTI4IGJpdCBuZWFyIHBvaW50ZXIKK307CisKKy8vLyBBIDMyLWJpdCB0eXBlIHJlZmVyZW5jZS4gVHlwZXMgYXJlIGluZGV4ZWQgYnkgdGhlaXIgb3JkZXIgb2YgYXBwZWFyYW5jZSBpbgorLy8vIC5kZWJ1ZyRUIHBsdXMgMHgxMDAwLiBUeXBlIGluZGljZXMgbGVzcyB0aGFuIDB4MTAwMCBhcmUgInNpbXBsZSIgdHlwZXMsCisvLy8gY29tcG9zZWQgb2YgYSBTaW1wbGVUeXBlTW9kZSBieXRlIGZvbGxvd2VkIGJ5IGEgU2ltcGxlVHlwZUtpbmQgYnl0ZS4KK2NsYXNzIFR5cGVJbmRleCB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBGaXJzdE5vblNpbXBsZUluZGV4ID0gMHgxMDAwOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgU2ltcGxlS2luZE1hc2sgPSAweDAwMDAwMGZmOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgU2ltcGxlTW9kZU1hc2sgPSAweDAwMDAwNzAwOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgRGVjb3JhdGVkSXRlbUlkTWFzayA9IDB4ODAwMDAwMDA7CisKK3B1YmxpYzoKKyAgVHlwZUluZGV4KCkgOiBJbmRleChzdGF0aWNfY2FzdDx1aW50MzJfdD4oU2ltcGxlVHlwZUtpbmQ6Ok5vbmUpKSB7fQorICBleHBsaWNpdCBUeXBlSW5kZXgodWludDMyX3QgSW5kZXgpIDogSW5kZXgoSW5kZXgpIHt9CisgIGV4cGxpY2l0IFR5cGVJbmRleChTaW1wbGVUeXBlS2luZCBLaW5kKQorICAgICAgOiBJbmRleChzdGF0aWNfY2FzdDx1aW50MzJfdD4oS2luZCkpIHt9CisgIFR5cGVJbmRleChTaW1wbGVUeXBlS2luZCBLaW5kLCBTaW1wbGVUeXBlTW9kZSBNb2RlKQorICAgICAgOiBJbmRleChzdGF0aWNfY2FzdDx1aW50MzJfdD4oS2luZCkgfCBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTW9kZSkpIHt9CisKKyAgdWludDMyX3QgZ2V0SW5kZXgoKSBjb25zdCB7IHJldHVybiBJbmRleDsgfQorICB2b2lkIHNldEluZGV4KHVpbnQzMl90IEkpIHsgSW5kZXggPSBJOyB9CisgIGJvb2wgaXNTaW1wbGUoKSBjb25zdCB7IHJldHVybiBJbmRleCA8IEZpcnN0Tm9uU2ltcGxlSW5kZXg7IH0KKyAgYm9vbCBpc0RlY29yYXRlZEl0ZW1JZCgpIGNvbnN0IHsgcmV0dXJuICEhKEluZGV4ICYgRGVjb3JhdGVkSXRlbUlkTWFzayk7IH0KKworICBib29sIGlzTm9uZVR5cGUoKSBjb25zdCB7IHJldHVybiAqdGhpcyA9PSBOb25lKCk7IH0KKworICB1aW50MzJfdCB0b0FycmF5SW5kZXgoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFpc1NpbXBsZSgpKTsKKyAgICByZXR1cm4gZ2V0SW5kZXgoKSAtIEZpcnN0Tm9uU2ltcGxlSW5kZXg7CisgIH0KKworICBzdGF0aWMgVHlwZUluZGV4IGZyb21BcnJheUluZGV4KHVpbnQzMl90IEluZGV4KSB7CisgICAgcmV0dXJuIFR5cGVJbmRleChJbmRleCArIEZpcnN0Tm9uU2ltcGxlSW5kZXgpOworICB9CisKKyAgU2ltcGxlVHlwZUtpbmQgZ2V0U2ltcGxlS2luZCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNTaW1wbGUoKSk7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFNpbXBsZVR5cGVLaW5kPihJbmRleCAmIFNpbXBsZUtpbmRNYXNrKTsKKyAgfQorCisgIFNpbXBsZVR5cGVNb2RlIGdldFNpbXBsZU1vZGUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzU2ltcGxlKCkpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxTaW1wbGVUeXBlTW9kZT4oSW5kZXggJiBTaW1wbGVNb2RlTWFzayk7CisgIH0KKworICBzdGF0aWMgVHlwZUluZGV4IE5vbmUoKSB7IHJldHVybiBUeXBlSW5kZXgoU2ltcGxlVHlwZUtpbmQ6Ok5vbmUpOyB9CisgIHN0YXRpYyBUeXBlSW5kZXggVm9pZCgpIHsgcmV0dXJuIFR5cGVJbmRleChTaW1wbGVUeXBlS2luZDo6Vm9pZCk7IH0KKyAgc3RhdGljIFR5cGVJbmRleCBWb2lkUG9pbnRlcjMyKCkgeworICAgIHJldHVybiBUeXBlSW5kZXgoU2ltcGxlVHlwZUtpbmQ6OlZvaWQsIFNpbXBsZVR5cGVNb2RlOjpOZWFyUG9pbnRlcjMyKTsKKyAgfQorICBzdGF0aWMgVHlwZUluZGV4IFZvaWRQb2ludGVyNjQoKSB7CisgICAgcmV0dXJuIFR5cGVJbmRleChTaW1wbGVUeXBlS2luZDo6Vm9pZCwgU2ltcGxlVHlwZU1vZGU6Ok5lYXJQb2ludGVyNjQpOworICB9CisKKyAgc3RhdGljIFR5cGVJbmRleCBTaWduZWRDaGFyYWN0ZXIoKSB7CisgICAgcmV0dXJuIFR5cGVJbmRleChTaW1wbGVUeXBlS2luZDo6U2lnbmVkQ2hhcmFjdGVyKTsKKyAgfQorICBzdGF0aWMgVHlwZUluZGV4IFVuc2lnbmVkQ2hhcmFjdGVyKCkgeworICAgIHJldHVybiBUeXBlSW5kZXgoU2ltcGxlVHlwZUtpbmQ6OlVuc2lnbmVkQ2hhcmFjdGVyKTsKKyAgfQorICBzdGF0aWMgVHlwZUluZGV4IE5hcnJvd0NoYXJhY3RlcigpIHsKKyAgICByZXR1cm4gVHlwZUluZGV4KFNpbXBsZVR5cGVLaW5kOjpOYXJyb3dDaGFyYWN0ZXIpOworICB9CisgIHN0YXRpYyBUeXBlSW5kZXggV2lkZUNoYXJhY3RlcigpIHsKKyAgICByZXR1cm4gVHlwZUluZGV4KFNpbXBsZVR5cGVLaW5kOjpXaWRlQ2hhcmFjdGVyKTsKKyAgfQorICBzdGF0aWMgVHlwZUluZGV4IEludDE2U2hvcnQoKSB7CisgICAgcmV0dXJuIFR5cGVJbmRleChTaW1wbGVUeXBlS2luZDo6SW50MTZTaG9ydCk7CisgIH0KKyAgc3RhdGljIFR5cGVJbmRleCBVSW50MTZTaG9ydCgpIHsKKyAgICByZXR1cm4gVHlwZUluZGV4KFNpbXBsZVR5cGVLaW5kOjpVSW50MTZTaG9ydCk7CisgIH0KKyAgc3RhdGljIFR5cGVJbmRleCBJbnQzMigpIHsgcmV0dXJuIFR5cGVJbmRleChTaW1wbGVUeXBlS2luZDo6SW50MzIpOyB9CisgIHN0YXRpYyBUeXBlSW5kZXggVUludDMyKCkgeyByZXR1cm4gVHlwZUluZGV4KFNpbXBsZVR5cGVLaW5kOjpVSW50MzIpOyB9CisgIHN0YXRpYyBUeXBlSW5kZXggSW50MzJMb25nKCkgeyByZXR1cm4gVHlwZUluZGV4KFNpbXBsZVR5cGVLaW5kOjpJbnQzMkxvbmcpOyB9CisgIHN0YXRpYyBUeXBlSW5kZXggVUludDMyTG9uZygpIHsKKyAgICByZXR1cm4gVHlwZUluZGV4KFNpbXBsZVR5cGVLaW5kOjpVSW50MzJMb25nKTsKKyAgfQorICBzdGF0aWMgVHlwZUluZGV4IEludDY0KCkgeyByZXR1cm4gVHlwZUluZGV4KFNpbXBsZVR5cGVLaW5kOjpJbnQ2NCk7IH0KKyAgc3RhdGljIFR5cGVJbmRleCBVSW50NjQoKSB7IHJldHVybiBUeXBlSW5kZXgoU2ltcGxlVHlwZUtpbmQ6OlVJbnQ2NCk7IH0KKyAgc3RhdGljIFR5cGVJbmRleCBJbnQ2NFF1YWQoKSB7IHJldHVybiBUeXBlSW5kZXgoU2ltcGxlVHlwZUtpbmQ6OkludDY0UXVhZCk7IH0KKyAgc3RhdGljIFR5cGVJbmRleCBVSW50NjRRdWFkKCkgeworICAgIHJldHVybiBUeXBlSW5kZXgoU2ltcGxlVHlwZUtpbmQ6OlVJbnQ2NFF1YWQpOworICB9CisKKyAgc3RhdGljIFR5cGVJbmRleCBGbG9hdDMyKCkgeyByZXR1cm4gVHlwZUluZGV4KFNpbXBsZVR5cGVLaW5kOjpGbG9hdDMyKTsgfQorICBzdGF0aWMgVHlwZUluZGV4IEZsb2F0NjQoKSB7IHJldHVybiBUeXBlSW5kZXgoU2ltcGxlVHlwZUtpbmQ6OkZsb2F0NjQpOyB9CisKKyAgVHlwZUluZGV4ICZvcGVyYXRvcis9KHVuc2lnbmVkIE4pIHsKKyAgICBJbmRleCArPSBOOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFR5cGVJbmRleCAmb3BlcmF0b3IrKygpIHsKKyAgICBJbmRleCArPSAxOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFR5cGVJbmRleCBvcGVyYXRvcisrKGludCkgeworICAgIFR5cGVJbmRleCBDb3B5ID0gKnRoaXM7CisgICAgb3BlcmF0b3IrKygpOworICAgIHJldHVybiBDb3B5OworICB9CisKKyAgVHlwZUluZGV4ICZvcGVyYXRvci09KHVuc2lnbmVkIE4pIHsKKyAgICBhc3NlcnQoSW5kZXggPj0gTik7CisgICAgSW5kZXggLT0gTjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUeXBlSW5kZXggJm9wZXJhdG9yLS0oKSB7CisgICAgSW5kZXggLT0gMTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUeXBlSW5kZXggb3BlcmF0b3ItLShpbnQpIHsKKyAgICBUeXBlSW5kZXggQ29weSA9ICp0aGlzOworICAgIG9wZXJhdG9yLS0oKTsKKyAgICByZXR1cm4gQ29weTsKKyAgfQorCisgIGZyaWVuZCBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFR5cGVJbmRleCAmQSwgY29uc3QgVHlwZUluZGV4ICZCKSB7CisgICAgcmV0dXJuIEEuZ2V0SW5kZXgoKSA9PSBCLmdldEluZGV4KCk7CisgIH0KKworICBmcmllbmQgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUeXBlSW5kZXggJkEsIGNvbnN0IFR5cGVJbmRleCAmQikgeworICAgIHJldHVybiBBLmdldEluZGV4KCkgIT0gQi5nZXRJbmRleCgpOworICB9CisKKyAgZnJpZW5kIGlubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBUeXBlSW5kZXggJkEsIGNvbnN0IFR5cGVJbmRleCAmQikgeworICAgIHJldHVybiBBLmdldEluZGV4KCkgPCBCLmdldEluZGV4KCk7CisgIH0KKworICBmcmllbmQgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBUeXBlSW5kZXggJkEsIGNvbnN0IFR5cGVJbmRleCAmQikgeworICAgIHJldHVybiBBLmdldEluZGV4KCkgPD0gQi5nZXRJbmRleCgpOworICB9CisKKyAgZnJpZW5kIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBUeXBlSW5kZXggJkEsIGNvbnN0IFR5cGVJbmRleCAmQikgeworICAgIHJldHVybiBBLmdldEluZGV4KCkgPiBCLmdldEluZGV4KCk7CisgIH0KKworICBmcmllbmQgaW5saW5lIGJvb2wgb3BlcmF0b3I+PShjb25zdCBUeXBlSW5kZXggJkEsIGNvbnN0IFR5cGVJbmRleCAmQikgeworICAgIHJldHVybiBBLmdldEluZGV4KCkgPj0gQi5nZXRJbmRleCgpOworICB9CisKKyAgZnJpZW5kIGlubGluZSBUeXBlSW5kZXggb3BlcmF0b3IrKGNvbnN0IFR5cGVJbmRleCAmQSwgdWludDMyX3QgTikgeworICAgIFR5cGVJbmRleCBSZXN1bHQoQSk7CisgICAgUmVzdWx0ICs9IE47CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIGZyaWVuZCBpbmxpbmUgVHlwZUluZGV4IG9wZXJhdG9yLShjb25zdCBUeXBlSW5kZXggJkEsIHVpbnQzMl90IE4pIHsKKyAgICBhc3NlcnQoQS5nZXRJbmRleCgpID49IE4pOworICAgIFR5cGVJbmRleCBSZXN1bHQoQSk7CisgICAgUmVzdWx0IC09IE47CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIGZyaWVuZCBpbmxpbmUgdWludDMyX3Qgb3BlcmF0b3ItKGNvbnN0IFR5cGVJbmRleCAmQSwgY29uc3QgVHlwZUluZGV4ICZCKSB7CisgICAgYXNzZXJ0KEEgPj0gQik7CisgICAgcmV0dXJuIEEudG9BcnJheUluZGV4KCkgLSBCLnRvQXJyYXlJbmRleCgpOworICB9CisKKyAgc3RhdGljIFN0cmluZ1JlZiBzaW1wbGVUeXBlTmFtZShUeXBlSW5kZXggVEkpOworCitwcml2YXRlOgorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBJbmRleDsKK307CisKKy8vIFVzZWQgZm9yIHBzZXVkby1pbmRleGluZyBhbiBhcnJheSBvZiB0eXBlIHJlY29yZHMuICBBbiBhcnJheSBvZiBzdWNoIHJlY29yZHMKKy8vIHNvcnRlZCBieSBUeXBlSW5kZXggY2FuIGFsbG93IGxvZyhOKSBsb29rdXBzIGV2ZW4gdGhvdWdoIHN1Y2ggYSB0eXBlIHJlY29yZAorLy8gc3RyZWFtIGRvZXMgbm90IHByb3ZpZGUgcmFuZG9tIGFjY2Vzcy4KK3N0cnVjdCBUeXBlSW5kZXhPZmZzZXQgeworICBUeXBlSW5kZXggVHlwZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgT2Zmc2V0OworfTsKKwordm9pZCBwcmludFR5cGVJbmRleChTY29wZWRQcmludGVyICZQcmludGVyLCBTdHJpbmdSZWYgRmllbGROYW1lLCBUeXBlSW5kZXggVEksCisgICAgICAgICAgICAgICAgICAgIFR5cGVDb2xsZWN0aW9uICZUeXBlcyk7Cit9CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBEZW5zZU1hcEluZm88Y29kZXZpZXc6OlR5cGVJbmRleD4geworICBzdGF0aWMgaW5saW5lIGNvZGV2aWV3OjpUeXBlSW5kZXggZ2V0RW1wdHlLZXkoKSB7CisgICAgcmV0dXJuIGNvZGV2aWV3OjpUeXBlSW5kZXh7RGVuc2VNYXBJbmZvPHVpbnQzMl90Pjo6Z2V0RW1wdHlLZXkoKX07CisgIH0KKyAgc3RhdGljIGlubGluZSBjb2Rldmlldzo6VHlwZUluZGV4IGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gY29kZXZpZXc6OlR5cGVJbmRleHtEZW5zZU1hcEluZm88dWludDMyX3Q+OjpnZXRUb21ic3RvbmVLZXkoKX07CisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBjb2Rldmlldzo6VHlwZUluZGV4ICZUSSkgeworICAgIHJldHVybiBEZW5zZU1hcEluZm88dWludDMyX3Q+OjpnZXRIYXNoVmFsdWUoVEkuZ2V0SW5kZXgoKSk7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBjb2Rldmlldzo6VHlwZUluZGV4ICZMSFMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZXZpZXc6OlR5cGVJbmRleCAmUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSW5kZXhEaXNjb3ZlcnkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVJbmRleERpc2NvdmVyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MjRhMDkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlSW5kZXhEaXNjb3ZlcnkuaApAQCAtMCwwICsxLDQ3IEBACisvLz09PS0gVHlwZUluZGV4RGlzY292ZXJ5LmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVJTkRFWERJU0NPVkVSWV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVJTkRFWERJU0NPVkVSWV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKK2VudW0gY2xhc3MgVGlSZWZLaW5kIHsgVHlwZVJlZiwgSW5kZXhSZWYgfTsKK3N0cnVjdCBUaVJlZmVyZW5jZSB7CisgIFRpUmVmS2luZCBLaW5kOworICB1aW50MzJfdCBPZmZzZXQ7CisgIHVpbnQzMl90IENvdW50OworfTsKKwordm9pZCBkaXNjb3ZlclR5cGVJbmRpY2VzKEFycmF5UmVmPHVpbnQ4X3Q+IFJlY29yZERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFRpUmVmZXJlbmNlPiAmUmVmcyk7Cit2b2lkIGRpc2NvdmVyVHlwZUluZGljZXMoY29uc3QgQ1ZUeXBlICZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxUaVJlZmVyZW5jZT4gJlJlZnMpOwordm9pZCBkaXNjb3ZlclR5cGVJbmRpY2VzKGNvbnN0IENWVHlwZSAmVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VHlwZUluZGV4PiAmSW5kaWNlcyk7Cit2b2lkIGRpc2NvdmVyVHlwZUluZGljZXMoQXJyYXlSZWY8dWludDhfdD4gUmVjb3JkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VHlwZUluZGV4PiAmSW5kaWNlcyk7CisKKy8vLyBEaXNjb3ZlciB0eXBlIGluZGljZXMgaW4gc3ltYm9sIHJlY29yZHMuIFJldHVybnMgZmFsc2UgaWYgdGhpcyBpcyBhbiB1bmtub3duCisvLy8gcmVjb3JkLgorYm9vbCBkaXNjb3ZlclR5cGVJbmRpY2VzSW5TeW1ib2woY29uc3QgQ1ZTeW1ib2wgJlN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxUaVJlZmVyZW5jZT4gJlJlZnMpOworYm9vbCBkaXNjb3ZlclR5cGVJbmRpY2VzSW5TeW1ib2woQXJyYXlSZWY8dWludDhfdD4gUmVjb3JkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxUaVJlZmVyZW5jZT4gJlJlZnMpOworYm9vbCBkaXNjb3ZlclR5cGVJbmRpY2VzSW5TeW1ib2woQXJyYXlSZWY8dWludDhfdD4gUmVjb3JkRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxUeXBlSW5kZXg+ICZJbmRpY2VzKTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlUmVjb3JkLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlUmVjb3JkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVmMjgyMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVSZWNvcmQuaApAQCAtMCwwICsxLDkwMiBAQAorLy89PT0tIFR5cGVSZWNvcmQuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19UWVBFUkVDT1JEX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRVJFQ09SRF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUFNJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NWUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9HVUlELmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUluZGV4LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbUFycmF5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGNvZGV2aWV3IHsKKwordXNpbmcgc3VwcG9ydDo6bGl0dGxlMzJfdDsKK3VzaW5nIHN1cHBvcnQ6OnVsaXR0bGUxNl90OwordXNpbmcgc3VwcG9ydDo6dWxpdHRsZTMyX3Q7CisKK3VzaW5nIENWVHlwZSA9IENWUmVjb3JkPFR5cGVMZWFmS2luZD47Cit1c2luZyBSZW1hcHBlZFR5cGUgPSBSZW1hcHBlZFJlY29yZDxUeXBlTGVhZktpbmQ+OworCitzdHJ1Y3QgQ1ZNZW1iZXJSZWNvcmQgeworICBUeXBlTGVhZktpbmQgS2luZDsKKyAgQXJyYXlSZWY8dWludDhfdD4gRGF0YTsKK307Cit1c2luZyBDVlR5cGVBcnJheSA9IFZhclN0cmVhbUFycmF5PENWVHlwZT47Cit1c2luZyBDVlR5cGVSYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPENWVHlwZUFycmF5OjpJdGVyYXRvcj47CisKKy8vLyBFcXV2YWxlbnQgdG8gQ1ZfZmxkYXR0cl90IGluIGN2aW5mby5oLgorc3RydWN0IE1lbWJlckF0dHJpYnV0ZXMgeworICB1aW50MTZfdCBBdHRycyA9IDA7CisKKyAgZW51bSB7CisgICAgTWV0aG9kS2luZFNoaWZ0ID0gMiwKKyAgfTsKKworICBNZW1iZXJBdHRyaWJ1dGVzKCkgPSBkZWZhdWx0OworCisgIGV4cGxpY2l0IE1lbWJlckF0dHJpYnV0ZXMoTWVtYmVyQWNjZXNzIEFjY2VzcykKKyAgICAgIDogQXR0cnMoc3RhdGljX2Nhc3Q8dWludDE2X3Q+KEFjY2VzcykpIHt9CisKKyAgTWVtYmVyQXR0cmlidXRlcyhNZW1iZXJBY2Nlc3MgQWNjZXNzLCBNZXRob2RLaW5kIEtpbmQsIE1ldGhvZE9wdGlvbnMgRmxhZ3MpIHsKKyAgICBBdHRycyA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihBY2Nlc3MpOworICAgIEF0dHJzIHw9IChzdGF0aWNfY2FzdDx1aW50MTZfdD4oS2luZCkgPDwgTWV0aG9kS2luZFNoaWZ0KTsKKyAgICBBdHRycyB8PSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oRmxhZ3MpOworICB9CisKKyAgLy8vIEdldCB0aGUgYWNjZXNzIHNwZWNpZmllci4gVmFsaWQgZm9yIGFueSBraW5kIG9mIG1lbWJlci4KKyAgTWVtYmVyQWNjZXNzIGdldEFjY2VzcygpIGNvbnN0IHsKKyAgICByZXR1cm4gTWVtYmVyQWNjZXNzKHVuc2lnbmVkKEF0dHJzKSAmIHVuc2lnbmVkKE1ldGhvZE9wdGlvbnM6OkFjY2Vzc01hc2spKTsKKyAgfQorCisgIC8vLyBJbmRpY2F0ZXMgaWYgYSBtZXRob2QgaXMgZGVmaW5lZCB3aXRoIGZyaWVuZCwgdmlydHVhbCwgc3RhdGljLCBldGMuCisgIE1ldGhvZEtpbmQgZ2V0TWV0aG9kS2luZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gTWV0aG9kS2luZCgKKyAgICAgICAgKHVuc2lnbmVkKEF0dHJzKSAmIHVuc2lnbmVkKE1ldGhvZE9wdGlvbnM6Ok1ldGhvZEtpbmRNYXNrKSkgPj4KKyAgICAgICAgTWV0aG9kS2luZFNoaWZ0KTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGZsYWdzIHRoYXQgYXJlIG5vdCBpbmNsdWRlZCBpbiBhY2Nlc3MgY29udHJvbCBvciBtZXRob2QKKyAgLy8vIHByb3BlcnRpZXMuCisgIE1ldGhvZE9wdGlvbnMgZ2V0RmxhZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIE1ldGhvZE9wdGlvbnMoCisgICAgICAgIHVuc2lnbmVkKEF0dHJzKSAmCisgICAgICAgIH51bnNpZ25lZChNZXRob2RPcHRpb25zOjpBY2Nlc3NNYXNrIHwgTWV0aG9kT3B0aW9uczo6TWV0aG9kS2luZE1hc2spKTsKKyAgfQorCisgIC8vLyBJcyB0aGlzIG1ldGhvZCB2aXJ0dWFsLgorICBib29sIGlzVmlydHVhbCgpIGNvbnN0IHsKKyAgICBhdXRvIE1QID0gZ2V0TWV0aG9kS2luZCgpOworICAgIHJldHVybiBNUCAhPSBNZXRob2RLaW5kOjpWYW5pbGxhICYmIE1QICE9IE1ldGhvZEtpbmQ6OkZyaWVuZCAmJgorICAgICAgICAgICBNUCAhPSBNZXRob2RLaW5kOjpTdGF0aWM7CisgIH0KKworICAvLy8gRG9lcyB0aGlzIG1lbWJlciBpbnRyb2R1Y2UgYSBuZXcgdmlydHVhbCBtZXRob2QuCisgIGJvb2wgaXNJbnRyb2R1Y2VkVmlydHVhbCgpIGNvbnN0IHsKKyAgICBhdXRvIE1QID0gZ2V0TWV0aG9kS2luZCgpOworICAgIHJldHVybiBNUCA9PSBNZXRob2RLaW5kOjpJbnRyb2R1Y2luZ1ZpcnR1YWwgfHwKKyAgICAgICAgICAgTVAgPT0gTWV0aG9kS2luZDo6UHVyZUludHJvZHVjaW5nVmlydHVhbDsKKyAgfQorfTsKKworLy8gRG9lcyBub3QgY29ycmVzcG9uZCB0byBhbnkgdGFnLCB0aGlzIGlzIHRoZSB0YWlsIG9mIGFuIExGX1BPSU5URVIgcmVjb3JkCisvLyBpZiBpdCByZXByZXNlbnRzIGEgbWVtYmVyIHBvaW50ZXIuCitjbGFzcyBNZW1iZXJQb2ludGVySW5mbyB7CitwdWJsaWM6CisgIE1lbWJlclBvaW50ZXJJbmZvKCkgPSBkZWZhdWx0OworCisgIE1lbWJlclBvaW50ZXJJbmZvKFR5cGVJbmRleCBDb250YWluaW5nVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgUG9pbnRlclRvTWVtYmVyUmVwcmVzZW50YXRpb24gUmVwcmVzZW50YXRpb24pCisgICAgICA6IENvbnRhaW5pbmdUeXBlKENvbnRhaW5pbmdUeXBlKSwgUmVwcmVzZW50YXRpb24oUmVwcmVzZW50YXRpb24pIHt9CisKKyAgVHlwZUluZGV4IGdldENvbnRhaW5pbmdUeXBlKCkgY29uc3QgeyByZXR1cm4gQ29udGFpbmluZ1R5cGU7IH0KKyAgUG9pbnRlclRvTWVtYmVyUmVwcmVzZW50YXRpb24gZ2V0UmVwcmVzZW50YXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIFJlcHJlc2VudGF0aW9uOworICB9CisKKyAgVHlwZUluZGV4IENvbnRhaW5pbmdUeXBlOworICBQb2ludGVyVG9NZW1iZXJSZXByZXNlbnRhdGlvbiBSZXByZXNlbnRhdGlvbjsKK307CisKK2NsYXNzIFR5cGVSZWNvcmQgeworcHJvdGVjdGVkOgorICBUeXBlUmVjb3JkKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogS2luZChLaW5kKSB7fQorCitwdWJsaWM6CisgIFR5cGVSZWNvcmRLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKKyAgVHlwZVJlY29yZEtpbmQgS2luZDsKK307CisKKy8vIExGX01PRElGSUVSCitjbGFzcyBNb2RpZmllclJlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgTW9kaWZpZXJSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IE1vZGlmaWVyUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorICBNb2RpZmllclJlY29yZChUeXBlSW5kZXggTW9kaWZpZWRUeXBlLCBNb2RpZmllck9wdGlvbnMgTW9kaWZpZXJzKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpNb2RpZmllciksIE1vZGlmaWVkVHlwZShNb2RpZmllZFR5cGUpLAorICAgICAgICBNb2RpZmllcnMoTW9kaWZpZXJzKSB7fQorCisgIFR5cGVJbmRleCBnZXRNb2RpZmllZFR5cGUoKSBjb25zdCB7IHJldHVybiBNb2RpZmllZFR5cGU7IH0KKyAgTW9kaWZpZXJPcHRpb25zIGdldE1vZGlmaWVycygpIGNvbnN0IHsgcmV0dXJuIE1vZGlmaWVyczsgfQorCisgIFR5cGVJbmRleCBNb2RpZmllZFR5cGU7CisgIE1vZGlmaWVyT3B0aW9ucyBNb2RpZmllcnM7Cit9OworCisvLyBMRl9QUk9DRURVUkUKK2NsYXNzIFByb2NlZHVyZVJlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgUHJvY2VkdXJlUmVjb3JkKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBQcm9jZWR1cmVSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisgIFByb2NlZHVyZVJlY29yZChUeXBlSW5kZXggUmV0dXJuVHlwZSwgQ2FsbGluZ0NvbnZlbnRpb24gQ2FsbENvbnYsCisgICAgICAgICAgICAgICAgICBGdW5jdGlvbk9wdGlvbnMgT3B0aW9ucywgdWludDE2X3QgUGFyYW1ldGVyQ291bnQsCisgICAgICAgICAgICAgICAgICBUeXBlSW5kZXggQXJndW1lbnRMaXN0KQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpQcm9jZWR1cmUpLCBSZXR1cm5UeXBlKFJldHVyblR5cGUpLAorICAgICAgICBDYWxsQ29udihDYWxsQ29udiksIE9wdGlvbnMoT3B0aW9ucyksIFBhcmFtZXRlckNvdW50KFBhcmFtZXRlckNvdW50KSwKKyAgICAgICAgQXJndW1lbnRMaXN0KEFyZ3VtZW50TGlzdCkge30KKworICBUeXBlSW5kZXggZ2V0UmV0dXJuVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFJldHVyblR5cGU7IH0KKyAgQ2FsbGluZ0NvbnZlbnRpb24gZ2V0Q2FsbENvbnYoKSBjb25zdCB7IHJldHVybiBDYWxsQ29udjsgfQorICBGdW5jdGlvbk9wdGlvbnMgZ2V0T3B0aW9ucygpIGNvbnN0IHsgcmV0dXJuIE9wdGlvbnM7IH0KKyAgdWludDE2X3QgZ2V0UGFyYW1ldGVyQ291bnQoKSBjb25zdCB7IHJldHVybiBQYXJhbWV0ZXJDb3VudDsgfQorICBUeXBlSW5kZXggZ2V0QXJndW1lbnRMaXN0KCkgY29uc3QgeyByZXR1cm4gQXJndW1lbnRMaXN0OyB9CisKKyAgVHlwZUluZGV4IFJldHVyblR5cGU7CisgIENhbGxpbmdDb252ZW50aW9uIENhbGxDb252OworICBGdW5jdGlvbk9wdGlvbnMgT3B0aW9uczsKKyAgdWludDE2X3QgUGFyYW1ldGVyQ291bnQ7CisgIFR5cGVJbmRleCBBcmd1bWVudExpc3Q7Cit9OworCisvLyBMRl9NRlVOQ1RJT04KK2NsYXNzIE1lbWJlckZ1bmN0aW9uUmVjb3JkIDogcHVibGljIFR5cGVSZWNvcmQgeworcHVibGljOgorICBNZW1iZXJGdW5jdGlvblJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgTWVtYmVyRnVuY3Rpb25SZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisKKyAgTWVtYmVyRnVuY3Rpb25SZWNvcmQoVHlwZUluZGV4IFJldHVyblR5cGUsIFR5cGVJbmRleCBDbGFzc1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIFR5cGVJbmRleCBUaGlzVHlwZSwgQ2FsbGluZ0NvbnZlbnRpb24gQ2FsbENvbnYsCisgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uT3B0aW9ucyBPcHRpb25zLCB1aW50MTZfdCBQYXJhbWV0ZXJDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgVHlwZUluZGV4IEFyZ3VtZW50TGlzdCwgaW50MzJfdCBUaGlzUG9pbnRlckFkanVzdG1lbnQpCisgICAgICA6IFR5cGVSZWNvcmQoVHlwZVJlY29yZEtpbmQ6Ok1lbWJlckZ1bmN0aW9uKSwgUmV0dXJuVHlwZShSZXR1cm5UeXBlKSwKKyAgICAgICAgQ2xhc3NUeXBlKENsYXNzVHlwZSksIFRoaXNUeXBlKFRoaXNUeXBlKSwgQ2FsbENvbnYoQ2FsbENvbnYpLAorICAgICAgICBPcHRpb25zKE9wdGlvbnMpLCBQYXJhbWV0ZXJDb3VudChQYXJhbWV0ZXJDb3VudCksCisgICAgICAgIEFyZ3VtZW50TGlzdChBcmd1bWVudExpc3QpLAorICAgICAgICBUaGlzUG9pbnRlckFkanVzdG1lbnQoVGhpc1BvaW50ZXJBZGp1c3RtZW50KSB7fQorCisgIFR5cGVJbmRleCBnZXRSZXR1cm5UeXBlKCkgY29uc3QgeyByZXR1cm4gUmV0dXJuVHlwZTsgfQorICBUeXBlSW5kZXggZ2V0Q2xhc3NUeXBlKCkgY29uc3QgeyByZXR1cm4gQ2xhc3NUeXBlOyB9CisgIFR5cGVJbmRleCBnZXRUaGlzVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFRoaXNUeXBlOyB9CisgIENhbGxpbmdDb252ZW50aW9uIGdldENhbGxDb252KCkgY29uc3QgeyByZXR1cm4gQ2FsbENvbnY7IH0KKyAgRnVuY3Rpb25PcHRpb25zIGdldE9wdGlvbnMoKSBjb25zdCB7IHJldHVybiBPcHRpb25zOyB9CisgIHVpbnQxNl90IGdldFBhcmFtZXRlckNvdW50KCkgY29uc3QgeyByZXR1cm4gUGFyYW1ldGVyQ291bnQ7IH0KKyAgVHlwZUluZGV4IGdldEFyZ3VtZW50TGlzdCgpIGNvbnN0IHsgcmV0dXJuIEFyZ3VtZW50TGlzdDsgfQorICBpbnQzMl90IGdldFRoaXNQb2ludGVyQWRqdXN0bWVudCgpIGNvbnN0IHsgcmV0dXJuIFRoaXNQb2ludGVyQWRqdXN0bWVudDsgfQorCisgIFR5cGVJbmRleCBSZXR1cm5UeXBlOworICBUeXBlSW5kZXggQ2xhc3NUeXBlOworICBUeXBlSW5kZXggVGhpc1R5cGU7CisgIENhbGxpbmdDb252ZW50aW9uIENhbGxDb252OworICBGdW5jdGlvbk9wdGlvbnMgT3B0aW9uczsKKyAgdWludDE2X3QgUGFyYW1ldGVyQ291bnQ7CisgIFR5cGVJbmRleCBBcmd1bWVudExpc3Q7CisgIGludDMyX3QgVGhpc1BvaW50ZXJBZGp1c3RtZW50OworfTsKKworLy8gTEZfTEFCRUwKK2NsYXNzIExhYmVsUmVjb3JkIDogcHVibGljIFR5cGVSZWNvcmQgeworcHVibGljOgorICBMYWJlbFJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgTGFiZWxSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisKKyAgTGFiZWxSZWNvcmQoTGFiZWxUeXBlIE1vZGUpIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6TGFiZWwpLCBNb2RlKE1vZGUpIHt9CisKKyAgTGFiZWxUeXBlIE1vZGU7Cit9OworCisvLyBMRl9NRlVOQ19JRAorY2xhc3MgTWVtYmVyRnVuY0lkUmVjb3JkIDogcHVibGljIFR5cGVSZWNvcmQgeworcHVibGljOgorICBNZW1iZXJGdW5jSWRSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IE1lbWJlckZ1bmNJZFJlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFR5cGVSZWNvcmQoS2luZCkge30KKyAgTWVtYmVyRnVuY0lkUmVjb3JkKFR5cGVJbmRleCBDbGFzc1R5cGUsIFR5cGVJbmRleCBGdW5jdGlvblR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUpCisgICAgICA6IFR5cGVSZWNvcmQoVHlwZVJlY29yZEtpbmQ6Ok1lbWJlckZ1bmNJZCksIENsYXNzVHlwZShDbGFzc1R5cGUpLAorICAgICAgICBGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlKSwgTmFtZShOYW1lKSB7fQorCisgIFR5cGVJbmRleCBnZXRDbGFzc1R5cGUoKSBjb25zdCB7IHJldHVybiBDbGFzc1R5cGU7IH0KKyAgVHlwZUluZGV4IGdldEZ1bmN0aW9uVHlwZSgpIGNvbnN0IHsgcmV0dXJuIEZ1bmN0aW9uVHlwZTsgfQorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICBUeXBlSW5kZXggQ2xhc3NUeXBlOworICBUeXBlSW5kZXggRnVuY3Rpb25UeXBlOworICBTdHJpbmdSZWYgTmFtZTsKK307CisKKy8vIExGX0FSR0xJU1QKK2NsYXNzIEFyZ0xpc3RSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIEFyZ0xpc3RSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IEFyZ0xpc3RSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisKKyAgQXJnTGlzdFJlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kLCBBcnJheVJlZjxUeXBlSW5kZXg+IEluZGljZXMpCisgICAgICA6IFR5cGVSZWNvcmQoS2luZCksIEFyZ0luZGljZXMoSW5kaWNlcykge30KKworICBBcnJheVJlZjxUeXBlSW5kZXg+IGdldEluZGljZXMoKSBjb25zdCB7IHJldHVybiBBcmdJbmRpY2VzOyB9CisKKyAgc3RkOjp2ZWN0b3I8VHlwZUluZGV4PiBBcmdJbmRpY2VzOworfTsKKworLy8gTEZfU1VCU1RSX0xJU1QKK2NsYXNzIFN0cmluZ0xpc3RSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIFN0cmluZ0xpc3RSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IFN0cmluZ0xpc3RSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisKKyAgU3RyaW5nTGlzdFJlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kLCBBcnJheVJlZjxUeXBlSW5kZXg+IEluZGljZXMpCisgICAgICA6IFR5cGVSZWNvcmQoS2luZCksIFN0cmluZ0luZGljZXMoSW5kaWNlcykge30KKworICBBcnJheVJlZjxUeXBlSW5kZXg+IGdldEluZGljZXMoKSBjb25zdCB7IHJldHVybiBTdHJpbmdJbmRpY2VzOyB9CisKKyAgc3RkOjp2ZWN0b3I8VHlwZUluZGV4PiBTdHJpbmdJbmRpY2VzOworfTsKKworLy8gTEZfUE9JTlRFUgorY2xhc3MgUG9pbnRlclJlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IFBvaW50ZXJLaW5kU2hpZnQgPSAwOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgUG9pbnRlcktpbmRNYXNrID0gMHgxRjsKKworICBzdGF0aWMgY29uc3QgdWludDMyX3QgUG9pbnRlck1vZGVTaGlmdCA9IDU7CisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBQb2ludGVyTW9kZU1hc2sgPSAweDA3OworCisgIHN0YXRpYyBjb25zdCB1aW50MzJfdCBQb2ludGVyT3B0aW9uTWFzayA9IDB4RkY7CisKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IFBvaW50ZXJTaXplU2hpZnQgPSAxMzsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IFBvaW50ZXJTaXplTWFzayA9IDB4RkY7CisKKyAgUG9pbnRlclJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgUG9pbnRlclJlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFR5cGVSZWNvcmQoS2luZCkge30KKworICBQb2ludGVyUmVjb3JkKFR5cGVJbmRleCBSZWZlcmVudFR5cGUsIHVpbnQzMl90IEF0dHJzKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpQb2ludGVyKSwgUmVmZXJlbnRUeXBlKFJlZmVyZW50VHlwZSksCisgICAgICAgIEF0dHJzKEF0dHJzKSB7fQorCisgIFBvaW50ZXJSZWNvcmQoVHlwZUluZGV4IFJlZmVyZW50VHlwZSwgUG9pbnRlcktpbmQgUEssIFBvaW50ZXJNb2RlIFBNLAorICAgICAgICAgICAgICAgIFBvaW50ZXJPcHRpb25zIFBPLCB1aW50OF90IFNpemUpCisgICAgICA6IFR5cGVSZWNvcmQoVHlwZVJlY29yZEtpbmQ6OlBvaW50ZXIpLCBSZWZlcmVudFR5cGUoUmVmZXJlbnRUeXBlKSwKKyAgICAgICAgQXR0cnMoY2FsY0F0dHJzKFBLLCBQTSwgUE8sIFNpemUpKSB7fQorCisgIFBvaW50ZXJSZWNvcmQoVHlwZUluZGV4IFJlZmVyZW50VHlwZSwgUG9pbnRlcktpbmQgUEssIFBvaW50ZXJNb2RlIFBNLAorICAgICAgICAgICAgICAgIFBvaW50ZXJPcHRpb25zIFBPLCB1aW50OF90IFNpemUsIGNvbnN0IE1lbWJlclBvaW50ZXJJbmZvICZNUEkpCisgICAgICA6IFR5cGVSZWNvcmQoVHlwZVJlY29yZEtpbmQ6OlBvaW50ZXIpLCBSZWZlcmVudFR5cGUoUmVmZXJlbnRUeXBlKSwKKyAgICAgICAgQXR0cnMoY2FsY0F0dHJzKFBLLCBQTSwgUE8sIFNpemUpKSwgTWVtYmVySW5mbyhNUEkpIHt9CisKKyAgVHlwZUluZGV4IGdldFJlZmVyZW50VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFJlZmVyZW50VHlwZTsgfQorCisgIFBvaW50ZXJLaW5kIGdldFBvaW50ZXJLaW5kKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQb2ludGVyS2luZD4oKEF0dHJzID4+IFBvaW50ZXJLaW5kU2hpZnQpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJLaW5kTWFzayk7CisgIH0KKworICBQb2ludGVyTW9kZSBnZXRNb2RlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQb2ludGVyTW9kZT4oKEF0dHJzID4+IFBvaW50ZXJNb2RlU2hpZnQpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJNb2RlTWFzayk7CisgIH0KKworICBQb2ludGVyT3B0aW9ucyBnZXRPcHRpb25zKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxQb2ludGVyT3B0aW9ucz4oQXR0cnMpOworICB9CisKKyAgdWludDhfdCBnZXRTaXplKCkgY29uc3QgeworICAgIHJldHVybiAoQXR0cnMgPj4gUG9pbnRlclNpemVTaGlmdCkgJiBQb2ludGVyU2l6ZU1hc2s7CisgIH0KKworICBNZW1iZXJQb2ludGVySW5mbyBnZXRNZW1iZXJJbmZvKCkgY29uc3QgeyByZXR1cm4gKk1lbWJlckluZm87IH0KKworICBib29sIGlzUG9pbnRlclRvTWVtYmVyKCkgY29uc3QgeworICAgIHJldHVybiBnZXRNb2RlKCkgPT0gUG9pbnRlck1vZGU6OlBvaW50ZXJUb0RhdGFNZW1iZXIgfHwKKyAgICAgICAgICAgZ2V0TW9kZSgpID09IFBvaW50ZXJNb2RlOjpQb2ludGVyVG9NZW1iZXJGdW5jdGlvbjsKKyAgfQorCisgIGJvb2wgaXNGbGF0KCkgY29uc3QgeyByZXR1cm4gISEoQXR0cnMgJiB1aW50MzJfdChQb2ludGVyT3B0aW9uczo6RmxhdDMyKSk7IH0KKyAgYm9vbCBpc0NvbnN0KCkgY29uc3QgeyByZXR1cm4gISEoQXR0cnMgJiB1aW50MzJfdChQb2ludGVyT3B0aW9uczo6Q29uc3QpKTsgfQorCisgIGJvb2wgaXNWb2xhdGlsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gISEoQXR0cnMgJiB1aW50MzJfdChQb2ludGVyT3B0aW9uczo6Vm9sYXRpbGUpKTsKKyAgfQorCisgIGJvb2wgaXNVbmFsaWduZWQoKSBjb25zdCB7CisgICAgcmV0dXJuICEhKEF0dHJzICYgdWludDMyX3QoUG9pbnRlck9wdGlvbnM6OlVuYWxpZ25lZCkpOworICB9CisKKyAgYm9vbCBpc1Jlc3RyaWN0KCkgY29uc3QgeworICAgIHJldHVybiAhIShBdHRycyAmIHVpbnQzMl90KFBvaW50ZXJPcHRpb25zOjpSZXN0cmljdCkpOworICB9CisKKyAgVHlwZUluZGV4IFJlZmVyZW50VHlwZTsKKyAgdWludDMyX3QgQXR0cnM7CisgIE9wdGlvbmFsPE1lbWJlclBvaW50ZXJJbmZvPiBNZW1iZXJJbmZvOworCisgIHZvaWQgc2V0QXR0cnMoUG9pbnRlcktpbmQgUEssIFBvaW50ZXJNb2RlIFBNLCBQb2ludGVyT3B0aW9ucyBQTywKKyAgICAgICAgICAgICAgICB1aW50OF90IFNpemUpIHsKKyAgICBBdHRycyA9IGNhbGNBdHRycyhQSywgUE0sIFBPLCBTaXplKTsKKyAgfQorCitwcml2YXRlOgorICBzdGF0aWMgdWludDMyX3QgY2FsY0F0dHJzKFBvaW50ZXJLaW5kIFBLLCBQb2ludGVyTW9kZSBQTSwgUG9pbnRlck9wdGlvbnMgUE8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBTaXplKSB7CisgICAgdWludDMyX3QgQSA9IDA7CisgICAgQSB8PSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oUEspOworICAgIEEgfD0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFBPKTsKKyAgICBBIHw9IChzdGF0aWNfY2FzdDx1aW50MzJfdD4oUE0pIDw8IFBvaW50ZXJNb2RlU2hpZnQpOworICAgIEEgfD0gKHN0YXRpY19jYXN0PHVpbnQzMl90PihTaXplKSA8PCBQb2ludGVyU2l6ZVNoaWZ0KTsKKyAgICByZXR1cm4gQTsKKyAgfQorfTsKKworLy8gTEZfTkVTVFRZUEUKK2NsYXNzIE5lc3RlZFR5cGVSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIE5lc3RlZFR5cGVSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IE5lc3RlZFR5cGVSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisgIE5lc3RlZFR5cGVSZWNvcmQoVHlwZUluZGV4IFR5cGUsIFN0cmluZ1JlZiBOYW1lKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpOZXN0ZWRUeXBlKSwgVHlwZShUeXBlKSwgTmFtZShOYW1lKSB7fQorCisgIFR5cGVJbmRleCBnZXROZXN0ZWRUeXBlKCkgY29uc3QgeyByZXR1cm4gVHlwZTsgfQorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICBUeXBlSW5kZXggVHlwZTsKKyAgU3RyaW5nUmVmIE5hbWU7Cit9OworCisvLyBMRl9GSUVMRExJU1QKK2NsYXNzIEZpZWxkTGlzdFJlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgRmllbGRMaXN0UmVjb3JkKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBGaWVsZExpc3RSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisgIGV4cGxpY2l0IEZpZWxkTGlzdFJlY29yZChBcnJheVJlZjx1aW50OF90PiBEYXRhKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpGaWVsZExpc3QpLCBEYXRhKERhdGEpIHt9CisKKyAgQXJyYXlSZWY8dWludDhfdD4gRGF0YTsKK307CisKKy8vIExGX0FSUkFZCitjbGFzcyBBcnJheVJlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgQXJyYXlSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IEFycmF5UmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorICBBcnJheVJlY29yZChUeXBlSW5kZXggRWxlbWVudFR5cGUsIFR5cGVJbmRleCBJbmRleFR5cGUsIHVpbnQ2NF90IFNpemUsCisgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpBcnJheSksIEVsZW1lbnRUeXBlKEVsZW1lbnRUeXBlKSwKKyAgICAgICAgSW5kZXhUeXBlKEluZGV4VHlwZSksIFNpemUoU2l6ZSksIE5hbWUoTmFtZSkge30KKworICBUeXBlSW5kZXggZ2V0RWxlbWVudFR5cGUoKSBjb25zdCB7IHJldHVybiBFbGVtZW50VHlwZTsgfQorICBUeXBlSW5kZXggZ2V0SW5kZXhUeXBlKCkgY29uc3QgeyByZXR1cm4gSW5kZXhUeXBlOyB9CisgIHVpbnQ2NF90IGdldFNpemUoKSBjb25zdCB7IHJldHVybiBTaXplOyB9CisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorCisgIFR5cGVJbmRleCBFbGVtZW50VHlwZTsKKyAgVHlwZUluZGV4IEluZGV4VHlwZTsKKyAgdWludDY0X3QgU2l6ZTsKKyAgU3RyaW5nUmVmIE5hbWU7Cit9OworCitjbGFzcyBUYWdSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7Citwcm90ZWN0ZWQ6CisgIFRhZ1JlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgVGFnUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorICBUYWdSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCwgdWludDE2X3QgTWVtYmVyQ291bnQsIENsYXNzT3B0aW9ucyBPcHRpb25zLAorICAgICAgICAgICAgVHlwZUluZGV4IEZpZWxkTGlzdCwgU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBVbmlxdWVOYW1lKQorICAgICAgOiBUeXBlUmVjb3JkKEtpbmQpLCBNZW1iZXJDb3VudChNZW1iZXJDb3VudCksIE9wdGlvbnMoT3B0aW9ucyksCisgICAgICAgIEZpZWxkTGlzdChGaWVsZExpc3QpLCBOYW1lKE5hbWUpLCBVbmlxdWVOYW1lKFVuaXF1ZU5hbWUpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGludCBIZmFLaW5kU2hpZnQgPSAxMTsKKyAgc3RhdGljIGNvbnN0IGludCBIZmFLaW5kTWFzayA9IDB4MTgwMDsKKyAgc3RhdGljIGNvbnN0IGludCBXaW5SVEtpbmRTaGlmdCA9IDE0OworICBzdGF0aWMgY29uc3QgaW50IFdpblJUS2luZE1hc2sgPSAweEMwMDA7CisKKyAgYm9vbCBoYXNVbmlxdWVOYW1lKCkgY29uc3QgeworICAgIHJldHVybiAoT3B0aW9ucyAmIENsYXNzT3B0aW9uczo6SGFzVW5pcXVlTmFtZSkgIT0gQ2xhc3NPcHRpb25zOjpOb25lOworICB9CisKKyAgYm9vbCBpc05lc3RlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKE9wdGlvbnMgJiBDbGFzc09wdGlvbnM6Ok5lc3RlZCkgIT0gQ2xhc3NPcHRpb25zOjpOb25lOworICB9CisKKyAgYm9vbCBpc0ZvcndhcmRSZWYoKSBjb25zdCB7CisgICAgcmV0dXJuIChPcHRpb25zICYgQ2xhc3NPcHRpb25zOjpGb3J3YXJkUmVmZXJlbmNlKSAhPSBDbGFzc09wdGlvbnM6Ok5vbmU7CisgIH0KKworICB1aW50MTZfdCBnZXRNZW1iZXJDb3VudCgpIGNvbnN0IHsgcmV0dXJuIE1lbWJlckNvdW50OyB9CisgIENsYXNzT3B0aW9ucyBnZXRPcHRpb25zKCkgY29uc3QgeyByZXR1cm4gT3B0aW9uczsgfQorICBUeXBlSW5kZXggZ2V0RmllbGRMaXN0KCkgY29uc3QgeyByZXR1cm4gRmllbGRMaXN0OyB9CisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorICBTdHJpbmdSZWYgZ2V0VW5pcXVlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIFVuaXF1ZU5hbWU7IH0KKworICB1aW50MTZfdCBNZW1iZXJDb3VudDsKKyAgQ2xhc3NPcHRpb25zIE9wdGlvbnM7CisgIFR5cGVJbmRleCBGaWVsZExpc3Q7CisgIFN0cmluZ1JlZiBOYW1lOworICBTdHJpbmdSZWYgVW5pcXVlTmFtZTsKK307CisKKy8vIExGX0NMQVNTLCBMRl9TVFJVQ1RVUkUsIExGX0lOVEVSRkFDRQorY2xhc3MgQ2xhc3NSZWNvcmQgOiBwdWJsaWMgVGFnUmVjb3JkIHsKK3B1YmxpYzoKKyAgQ2xhc3NSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IENsYXNzUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVGFnUmVjb3JkKEtpbmQpIHt9CisgIENsYXNzUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQsIHVpbnQxNl90IE1lbWJlckNvdW50LCBDbGFzc09wdGlvbnMgT3B0aW9ucywKKyAgICAgICAgICAgICAgVHlwZUluZGV4IEZpZWxkTGlzdCwgVHlwZUluZGV4IERlcml2YXRpb25MaXN0LAorICAgICAgICAgICAgICBUeXBlSW5kZXggVlRhYmxlU2hhcGUsIHVpbnQ2NF90IFNpemUsIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICBTdHJpbmdSZWYgVW5pcXVlTmFtZSkKKyAgICAgIDogVGFnUmVjb3JkKEtpbmQsIE1lbWJlckNvdW50LCBPcHRpb25zLCBGaWVsZExpc3QsIE5hbWUsIFVuaXF1ZU5hbWUpLAorICAgICAgICBEZXJpdmF0aW9uTGlzdChEZXJpdmF0aW9uTGlzdCksIFZUYWJsZVNoYXBlKFZUYWJsZVNoYXBlKSwgU2l6ZShTaXplKSB7fQorCisgIEhmYUtpbmQgZ2V0SGZhKCkgY29uc3QgeworICAgIHVpbnQxNl90IFZhbHVlID0gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KE9wdGlvbnMpOworICAgIFZhbHVlID0gKFZhbHVlICYgSGZhS2luZE1hc2spID4+IEhmYUtpbmRTaGlmdDsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SGZhS2luZD4oVmFsdWUpOworICB9CisKKyAgV2luZG93c1JUQ2xhc3NLaW5kIGdldFdpblJUS2luZCgpIGNvbnN0IHsKKyAgICB1aW50MTZfdCBWYWx1ZSA9IHN0YXRpY19jYXN0PHVpbnQxNl90PihPcHRpb25zKTsKKyAgICBWYWx1ZSA9IChWYWx1ZSAmIFdpblJUS2luZE1hc2spID4+IFdpblJUS2luZFNoaWZ0OworICAgIHJldHVybiBzdGF0aWNfY2FzdDxXaW5kb3dzUlRDbGFzc0tpbmQ+KFZhbHVlKTsKKyAgfQorCisgIFR5cGVJbmRleCBnZXREZXJpdmF0aW9uTGlzdCgpIGNvbnN0IHsgcmV0dXJuIERlcml2YXRpb25MaXN0OyB9CisgIFR5cGVJbmRleCBnZXRWVGFibGVTaGFwZSgpIGNvbnN0IHsgcmV0dXJuIFZUYWJsZVNoYXBlOyB9CisgIHVpbnQ2NF90IGdldFNpemUoKSBjb25zdCB7IHJldHVybiBTaXplOyB9CisKKyAgVHlwZUluZGV4IERlcml2YXRpb25MaXN0OworICBUeXBlSW5kZXggVlRhYmxlU2hhcGU7CisgIHVpbnQ2NF90IFNpemU7Cit9OworCisvLyBMRl9VTklPTgorc3RydWN0IFVuaW9uUmVjb3JkIDogcHVibGljIFRhZ1JlY29yZCB7CisgIFVuaW9uUmVjb3JkKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBVbmlvblJlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFRhZ1JlY29yZChLaW5kKSB7fQorICBVbmlvblJlY29yZCh1aW50MTZfdCBNZW1iZXJDb3VudCwgQ2xhc3NPcHRpb25zIE9wdGlvbnMsIFR5cGVJbmRleCBGaWVsZExpc3QsCisgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUsIFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgVW5pcXVlTmFtZSkKKyAgICAgIDogVGFnUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpVbmlvbiwgTWVtYmVyQ291bnQsIE9wdGlvbnMsIEZpZWxkTGlzdCwgTmFtZSwKKyAgICAgICAgICAgICAgICAgIFVuaXF1ZU5hbWUpLAorICAgICAgICBTaXplKFNpemUpIHt9CisKKyAgSGZhS2luZCBnZXRIZmEoKSBjb25zdCB7CisgICAgdWludDE2X3QgVmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oT3B0aW9ucyk7CisgICAgVmFsdWUgPSAoVmFsdWUgJiBIZmFLaW5kTWFzaykgPj4gSGZhS2luZFNoaWZ0OworICAgIHJldHVybiBzdGF0aWNfY2FzdDxIZmFLaW5kPihWYWx1ZSk7CisgIH0KKworICB1aW50NjRfdCBnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gU2l6ZTsgfQorCisgIHVpbnQ2NF90IFNpemU7Cit9OworCisvLyBMRl9FTlVNCitjbGFzcyBFbnVtUmVjb3JkIDogcHVibGljIFRhZ1JlY29yZCB7CitwdWJsaWM6CisgIEVudW1SZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IEVudW1SZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUYWdSZWNvcmQoS2luZCkge30KKyAgRW51bVJlY29yZCh1aW50MTZfdCBNZW1iZXJDb3VudCwgQ2xhc3NPcHRpb25zIE9wdGlvbnMsIFR5cGVJbmRleCBGaWVsZExpc3QsCisgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBVbmlxdWVOYW1lLCBUeXBlSW5kZXggVW5kZXJseWluZ1R5cGUpCisgICAgICA6IFRhZ1JlY29yZChUeXBlUmVjb3JkS2luZDo6RW51bSwgTWVtYmVyQ291bnQsIE9wdGlvbnMsIEZpZWxkTGlzdCwgTmFtZSwKKyAgICAgICAgICAgICAgICAgIFVuaXF1ZU5hbWUpLAorICAgICAgICBVbmRlcmx5aW5nVHlwZShVbmRlcmx5aW5nVHlwZSkge30KKworICBUeXBlSW5kZXggZ2V0VW5kZXJseWluZ1R5cGUoKSBjb25zdCB7IHJldHVybiBVbmRlcmx5aW5nVHlwZTsgfQorCisgIFR5cGVJbmRleCBVbmRlcmx5aW5nVHlwZTsKK307CisKKy8vIExGX0JJVEZJRUxECitjbGFzcyBCaXRGaWVsZFJlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgQml0RmllbGRSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IEJpdEZpZWxkUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorICBCaXRGaWVsZFJlY29yZChUeXBlSW5kZXggVHlwZSwgdWludDhfdCBCaXRTaXplLCB1aW50OF90IEJpdE9mZnNldCkKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6Qml0RmllbGQpLCBUeXBlKFR5cGUpLCBCaXRTaXplKEJpdFNpemUpLAorICAgICAgICBCaXRPZmZzZXQoQml0T2Zmc2V0KSB7fQorCisgIFR5cGVJbmRleCBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gVHlwZTsgfQorICB1aW50OF90IGdldEJpdE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIEJpdE9mZnNldDsgfQorICB1aW50OF90IGdldEJpdFNpemUoKSBjb25zdCB7IHJldHVybiBCaXRTaXplOyB9CisKKyAgVHlwZUluZGV4IFR5cGU7CisgIHVpbnQ4X3QgQml0U2l6ZTsKKyAgdWludDhfdCBCaXRPZmZzZXQ7Cit9OworCisvLyBMRl9WVFNIQVBFCitjbGFzcyBWRlRhYmxlU2hhcGVSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIFZGVGFibGVTaGFwZVJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgVkZUYWJsZVNoYXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorICBleHBsaWNpdCBWRlRhYmxlU2hhcGVSZWNvcmQoQXJyYXlSZWY8VkZUYWJsZVNsb3RLaW5kPiBTbG90cykKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6VkZUYWJsZVNoYXBlKSwgU2xvdHNSZWYoU2xvdHMpIHt9CisgIGV4cGxpY2l0IFZGVGFibGVTaGFwZVJlY29yZChzdGQ6OnZlY3RvcjxWRlRhYmxlU2xvdEtpbmQ+IFNsb3RzKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpWRlRhYmxlU2hhcGUpLCBTbG90cyhzdGQ6Om1vdmUoU2xvdHMpKSB7fQorCisgIEFycmF5UmVmPFZGVGFibGVTbG90S2luZD4gZ2V0U2xvdHMoKSBjb25zdCB7CisgICAgaWYgKCFTbG90c1JlZi5lbXB0eSgpKQorICAgICAgcmV0dXJuIFNsb3RzUmVmOworICAgIHJldHVybiBTbG90czsKKyAgfQorCisgIHVpbnQzMl90IGdldEVudHJ5Q291bnQoKSBjb25zdCB7IHJldHVybiBnZXRTbG90cygpLnNpemUoKTsgfQorCisgIEFycmF5UmVmPFZGVGFibGVTbG90S2luZD4gU2xvdHNSZWY7CisgIHN0ZDo6dmVjdG9yPFZGVGFibGVTbG90S2luZD4gU2xvdHM7Cit9OworCisvLyBMRl9UWVBFU0VSVkVSMgorY2xhc3MgVHlwZVNlcnZlcjJSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIFR5cGVTZXJ2ZXIyUmVjb3JkKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBUeXBlU2VydmVyMlJlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFR5cGVSZWNvcmQoS2luZCkge30KKyAgVHlwZVNlcnZlcjJSZWNvcmQoU3RyaW5nUmVmIEd1aWRTdHIsIHVpbnQzMl90IEFnZSwgU3RyaW5nUmVmIE5hbWUpCisgICAgICA6IFR5cGVSZWNvcmQoVHlwZVJlY29yZEtpbmQ6OlR5cGVTZXJ2ZXIyKSwgQWdlKEFnZSksIE5hbWUoTmFtZSkgeworICAgIGFzc2VydChHdWlkU3RyLnNpemUoKSA9PSAxNiAmJiAiZ3VpZCBpc24ndCAxNiBieXRlcyIpOworICAgIDo6bWVtY3B5KEd1aWQuR3VpZCwgR3VpZFN0ci5kYXRhKCksIDE2KTsKKyAgfQorCisgIGNvbnN0IEdVSUQgJmdldEd1aWQoKSBjb25zdCB7IHJldHVybiBHdWlkOyB9CisgIHVpbnQzMl90IGdldEFnZSgpIGNvbnN0IHsgcmV0dXJuIEFnZTsgfQorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICBHVUlEIEd1aWQ7CisgIHVpbnQzMl90IEFnZTsKKyAgU3RyaW5nUmVmIE5hbWU7Cit9OworCisvLyBMRl9TVFJJTkdfSUQKK2NsYXNzIFN0cmluZ0lkUmVjb3JkIDogcHVibGljIFR5cGVSZWNvcmQgeworcHVibGljOgorICBTdHJpbmdJZFJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgU3RyaW5nSWRSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisgIFN0cmluZ0lkUmVjb3JkKFR5cGVJbmRleCBJZCwgU3RyaW5nUmVmIFN0cmluZykKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6U3RyaW5nSWQpLCBJZChJZCksIFN0cmluZyhTdHJpbmcpIHt9CisKKyAgVHlwZUluZGV4IGdldElkKCkgY29uc3QgeyByZXR1cm4gSWQ7IH0KKyAgU3RyaW5nUmVmIGdldFN0cmluZygpIGNvbnN0IHsgcmV0dXJuIFN0cmluZzsgfQorCisgIFR5cGVJbmRleCBJZDsKKyAgU3RyaW5nUmVmIFN0cmluZzsKK307CisKKy8vIExGX0ZVTkNfSUQKK2NsYXNzIEZ1bmNJZFJlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgRnVuY0lkUmVjb3JkKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBGdW5jSWRSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisgIEZ1bmNJZFJlY29yZChUeXBlSW5kZXggUGFyZW50U2NvcGUsIFR5cGVJbmRleCBGdW5jdGlvblR5cGUsIFN0cmluZ1JlZiBOYW1lKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpGdW5jSWQpLCBQYXJlbnRTY29wZShQYXJlbnRTY29wZSksCisgICAgICAgIEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUpLCBOYW1lKE5hbWUpIHt9CisKKyAgVHlwZUluZGV4IGdldFBhcmVudFNjb3BlKCkgY29uc3QgeyByZXR1cm4gUGFyZW50U2NvcGU7IH0KKyAgVHlwZUluZGV4IGdldEZ1bmN0aW9uVHlwZSgpIGNvbnN0IHsgcmV0dXJuIEZ1bmN0aW9uVHlwZTsgfQorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICBUeXBlSW5kZXggUGFyZW50U2NvcGU7CisgIFR5cGVJbmRleCBGdW5jdGlvblR5cGU7CisgIFN0cmluZ1JlZiBOYW1lOworfTsKKworLy8gTEZfVURUX1NSQ19MSU5FCitjbGFzcyBVZHRTb3VyY2VMaW5lUmVjb3JkIDogcHVibGljIFR5cGVSZWNvcmQgeworcHVibGljOgorICBVZHRTb3VyY2VMaW5lUmVjb3JkKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBVZHRTb3VyY2VMaW5lUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorICBVZHRTb3VyY2VMaW5lUmVjb3JkKFR5cGVJbmRleCBVRFQsIFR5cGVJbmRleCBTb3VyY2VGaWxlLCB1aW50MzJfdCBMaW5lTnVtYmVyKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpVZHRTb3VyY2VMaW5lKSwgVURUKFVEVCksCisgICAgICAgIFNvdXJjZUZpbGUoU291cmNlRmlsZSksIExpbmVOdW1iZXIoTGluZU51bWJlcikge30KKworICBUeXBlSW5kZXggZ2V0VURUKCkgY29uc3QgeyByZXR1cm4gVURUOyB9CisgIFR5cGVJbmRleCBnZXRTb3VyY2VGaWxlKCkgY29uc3QgeyByZXR1cm4gU291cmNlRmlsZTsgfQorICB1aW50MzJfdCBnZXRMaW5lTnVtYmVyKCkgY29uc3QgeyByZXR1cm4gTGluZU51bWJlcjsgfQorCisgIFR5cGVJbmRleCBVRFQ7CisgIFR5cGVJbmRleCBTb3VyY2VGaWxlOworICB1aW50MzJfdCBMaW5lTnVtYmVyOworfTsKKworLy8gTEZfVURUX01PRF9TUkNfTElORQorY2xhc3MgVWR0TW9kU291cmNlTGluZVJlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgVWR0TW9kU291cmNlTGluZVJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgVWR0TW9kU291cmNlTGluZVJlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFR5cGVSZWNvcmQoS2luZCkge30KKyAgVWR0TW9kU291cmNlTGluZVJlY29yZChUeXBlSW5kZXggVURULCBUeXBlSW5kZXggU291cmNlRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBMaW5lTnVtYmVyLCB1aW50MTZfdCBNb2R1bGUpCisgICAgICA6IFR5cGVSZWNvcmQoVHlwZVJlY29yZEtpbmQ6OlVkdFNvdXJjZUxpbmUpLCBVRFQoVURUKSwKKyAgICAgICAgU291cmNlRmlsZShTb3VyY2VGaWxlKSwgTGluZU51bWJlcihMaW5lTnVtYmVyKSwgTW9kdWxlKE1vZHVsZSkge30KKworICBUeXBlSW5kZXggZ2V0VURUKCkgY29uc3QgeyByZXR1cm4gVURUOyB9CisgIFR5cGVJbmRleCBnZXRTb3VyY2VGaWxlKCkgY29uc3QgeyByZXR1cm4gU291cmNlRmlsZTsgfQorICB1aW50MzJfdCBnZXRMaW5lTnVtYmVyKCkgY29uc3QgeyByZXR1cm4gTGluZU51bWJlcjsgfQorICB1aW50MTZfdCBnZXRNb2R1bGUoKSBjb25zdCB7IHJldHVybiBNb2R1bGU7IH0KKworICBUeXBlSW5kZXggVURUOworICBUeXBlSW5kZXggU291cmNlRmlsZTsKKyAgdWludDMyX3QgTGluZU51bWJlcjsKKyAgdWludDE2X3QgTW9kdWxlOworfTsKKworLy8gTEZfQlVJTERJTkZPCitjbGFzcyBCdWlsZEluZm9SZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIEJ1aWxkSW5mb1JlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgQnVpbGRJbmZvUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorICBCdWlsZEluZm9SZWNvcmQoQXJyYXlSZWY8VHlwZUluZGV4PiBBcmdJbmRpY2VzKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpCdWlsZEluZm8pLAorICAgICAgICBBcmdJbmRpY2VzKEFyZ0luZGljZXMuYmVnaW4oKSwgQXJnSW5kaWNlcy5lbmQoKSkge30KKworICBBcnJheVJlZjxUeXBlSW5kZXg+IGdldEFyZ3MoKSBjb25zdCB7IHJldHVybiBBcmdJbmRpY2VzOyB9CisKKyAgU21hbGxWZWN0b3I8VHlwZUluZGV4LCA0PiBBcmdJbmRpY2VzOworfTsKKworLy8gTEZfVkZUQUJMRQorY2xhc3MgVkZUYWJsZVJlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgVkZUYWJsZVJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgVkZUYWJsZVJlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFR5cGVSZWNvcmQoS2luZCkge30KKyAgVkZUYWJsZVJlY29yZChUeXBlSW5kZXggQ29tcGxldGVDbGFzcywgVHlwZUluZGV4IE92ZXJyaWRkZW5WRlRhYmxlLAorICAgICAgICAgICAgICAgIHVpbnQzMl90IFZGUHRyT2Zmc2V0LCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICBBcnJheVJlZjxTdHJpbmdSZWY+IE1ldGhvZHMpCisgICAgICA6IFR5cGVSZWNvcmQoVHlwZVJlY29yZEtpbmQ6OlZGVGFibGUpLCBDb21wbGV0ZUNsYXNzKENvbXBsZXRlQ2xhc3MpLAorICAgICAgICBPdmVycmlkZGVuVkZUYWJsZShPdmVycmlkZGVuVkZUYWJsZSksIFZGUHRyT2Zmc2V0KFZGUHRyT2Zmc2V0KSB7CisgICAgTWV0aG9kTmFtZXMucHVzaF9iYWNrKE5hbWUpOworICAgIE1ldGhvZE5hbWVzLmluc2VydChNZXRob2ROYW1lcy5lbmQoKSwgTWV0aG9kcy5iZWdpbigpLCBNZXRob2RzLmVuZCgpKTsKKyAgfQorCisgIFR5cGVJbmRleCBnZXRDb21wbGV0ZUNsYXNzKCkgY29uc3QgeyByZXR1cm4gQ29tcGxldGVDbGFzczsgfQorICBUeXBlSW5kZXggZ2V0T3ZlcnJpZGRlblZUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIE92ZXJyaWRkZW5WRlRhYmxlOyB9CisgIHVpbnQzMl90IGdldFZGUHRyT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gVkZQdHJPZmZzZXQ7IH0KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBtYWtlQXJyYXlSZWYoTWV0aG9kTmFtZXMpLmZyb250KCk7IH0KKworICBBcnJheVJlZjxTdHJpbmdSZWY+IGdldE1ldGhvZE5hbWVzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlQXJyYXlSZWYoTWV0aG9kTmFtZXMpLmRyb3BfZnJvbnQoKTsKKyAgfQorCisgIFR5cGVJbmRleCBDb21wbGV0ZUNsYXNzOworICBUeXBlSW5kZXggT3ZlcnJpZGRlblZGVGFibGU7CisgIHVpbnQzMl90IFZGUHRyT2Zmc2V0OworICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IE1ldGhvZE5hbWVzOworfTsKKworLy8gTEZfT05FTUVUSE9ECitjbGFzcyBPbmVNZXRob2RSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIE9uZU1ldGhvZFJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgT25lTWV0aG9kUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorICBPbmVNZXRob2RSZWNvcmQoVHlwZUluZGV4IFR5cGUsIE1lbWJlckF0dHJpYnV0ZXMgQXR0cnMsIGludDMyX3QgVkZUYWJsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpPbmVNZXRob2QpLCBUeXBlKFR5cGUpLCBBdHRycyhBdHRycyksCisgICAgICAgIFZGVGFibGVPZmZzZXQoVkZUYWJsZU9mZnNldCksIE5hbWUoTmFtZSkge30KKyAgT25lTWV0aG9kUmVjb3JkKFR5cGVJbmRleCBUeXBlLCBNZW1iZXJBY2Nlc3MgQWNjZXNzLCBNZXRob2RLaW5kIE1LLAorICAgICAgICAgICAgICAgICAgTWV0aG9kT3B0aW9ucyBPcHRpb25zLCBpbnQzMl90IFZGVGFibGVPZmZzZXQsIFN0cmluZ1JlZiBOYW1lKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpPbmVNZXRob2QpLCBUeXBlKFR5cGUpLAorICAgICAgICBBdHRycyhBY2Nlc3MsIE1LLCBPcHRpb25zKSwgVkZUYWJsZU9mZnNldChWRlRhYmxlT2Zmc2V0KSwgTmFtZShOYW1lKSB7fQorCisgIFR5cGVJbmRleCBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gVHlwZTsgfQorICBNZXRob2RLaW5kIGdldE1ldGhvZEtpbmQoKSBjb25zdCB7IHJldHVybiBBdHRycy5nZXRNZXRob2RLaW5kKCk7IH0KKyAgTWV0aG9kT3B0aW9ucyBnZXRPcHRpb25zKCkgY29uc3QgeyByZXR1cm4gQXR0cnMuZ2V0RmxhZ3MoKTsgfQorICBNZW1iZXJBY2Nlc3MgZ2V0QWNjZXNzKCkgY29uc3QgeyByZXR1cm4gQXR0cnMuZ2V0QWNjZXNzKCk7IH0KKyAgaW50MzJfdCBnZXRWRlRhYmxlT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gVkZUYWJsZU9mZnNldDsgfQorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICBib29sIGlzSW50cm9kdWNpbmdWaXJ0dWFsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRNZXRob2RLaW5kKCkgPT0gTWV0aG9kS2luZDo6SW50cm9kdWNpbmdWaXJ0dWFsIHx8CisgICAgICAgICAgIGdldE1ldGhvZEtpbmQoKSA9PSBNZXRob2RLaW5kOjpQdXJlSW50cm9kdWNpbmdWaXJ0dWFsOworICB9CisKKyAgVHlwZUluZGV4IFR5cGU7CisgIE1lbWJlckF0dHJpYnV0ZXMgQXR0cnM7CisgIGludDMyX3QgVkZUYWJsZU9mZnNldDsKKyAgU3RyaW5nUmVmIE5hbWU7Cit9OworCisvLyBMRl9NRVRIT0RMSVNUCitjbGFzcyBNZXRob2RPdmVybG9hZExpc3RSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIE1ldGhvZE92ZXJsb2FkTGlzdFJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgTWV0aG9kT3ZlcmxvYWRMaXN0UmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorICBNZXRob2RPdmVybG9hZExpc3RSZWNvcmQoQXJyYXlSZWY8T25lTWV0aG9kUmVjb3JkPiBNZXRob2RzKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpNZXRob2RPdmVybG9hZExpc3QpLCBNZXRob2RzKE1ldGhvZHMpIHt9CisKKyAgQXJyYXlSZWY8T25lTWV0aG9kUmVjb3JkPiBnZXRNZXRob2RzKCkgY29uc3QgeyByZXR1cm4gTWV0aG9kczsgfQorCisgIHN0ZDo6dmVjdG9yPE9uZU1ldGhvZFJlY29yZD4gTWV0aG9kczsKK307CisKKy8vLyBGb3IgbWV0aG9kIG92ZXJsb2FkIHNldHMuICBMRl9NRVRIT0QKK2NsYXNzIE92ZXJsb2FkZWRNZXRob2RSZWNvcmQgOiBwdWJsaWMgVHlwZVJlY29yZCB7CitwdWJsaWM6CisgIE92ZXJsb2FkZWRNZXRob2RSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IE92ZXJsb2FkZWRNZXRob2RSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisgIE92ZXJsb2FkZWRNZXRob2RSZWNvcmQodWludDE2X3QgTnVtT3ZlcmxvYWRzLCBUeXBlSW5kZXggTWV0aG9kTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSkKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6T3ZlcmxvYWRlZE1ldGhvZCksCisgICAgICAgIE51bU92ZXJsb2FkcyhOdW1PdmVybG9hZHMpLCBNZXRob2RMaXN0KE1ldGhvZExpc3QpLCBOYW1lKE5hbWUpIHt9CisKKyAgdWludDE2X3QgZ2V0TnVtT3ZlcmxvYWRzKCkgY29uc3QgeyByZXR1cm4gTnVtT3ZlcmxvYWRzOyB9CisgIFR5cGVJbmRleCBnZXRNZXRob2RMaXN0KCkgY29uc3QgeyByZXR1cm4gTWV0aG9kTGlzdDsgfQorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICB1aW50MTZfdCBOdW1PdmVybG9hZHM7CisgIFR5cGVJbmRleCBNZXRob2RMaXN0OworICBTdHJpbmdSZWYgTmFtZTsKK307CisKKy8vIExGX01FTUJFUgorY2xhc3MgRGF0YU1lbWJlclJlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgRGF0YU1lbWJlclJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgRGF0YU1lbWJlclJlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFR5cGVSZWNvcmQoS2luZCkge30KKyAgRGF0YU1lbWJlclJlY29yZChNZW1iZXJBdHRyaWJ1dGVzIEF0dHJzLCBUeXBlSW5kZXggVHlwZSwgdWludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpEYXRhTWVtYmVyKSwgQXR0cnMoQXR0cnMpLCBUeXBlKFR5cGUpLAorICAgICAgICBGaWVsZE9mZnNldChPZmZzZXQpLCBOYW1lKE5hbWUpIHt9CisgIERhdGFNZW1iZXJSZWNvcmQoTWVtYmVyQWNjZXNzIEFjY2VzcywgVHlwZUluZGV4IFR5cGUsIHVpbnQ2NF90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSkKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6RGF0YU1lbWJlciksIEF0dHJzKEFjY2VzcyksIFR5cGUoVHlwZSksCisgICAgICAgIEZpZWxkT2Zmc2V0KE9mZnNldCksIE5hbWUoTmFtZSkge30KKworICBNZW1iZXJBY2Nlc3MgZ2V0QWNjZXNzKCkgY29uc3QgeyByZXR1cm4gQXR0cnMuZ2V0QWNjZXNzKCk7IH0KKyAgVHlwZUluZGV4IGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBUeXBlOyB9CisgIHVpbnQ2NF90IGdldEZpZWxkT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gRmllbGRPZmZzZXQ7IH0KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisKKyAgTWVtYmVyQXR0cmlidXRlcyBBdHRyczsKKyAgVHlwZUluZGV4IFR5cGU7CisgIHVpbnQ2NF90IEZpZWxkT2Zmc2V0OworICBTdHJpbmdSZWYgTmFtZTsKK307CisKKy8vIExGX1NUTUVNQkVSCitjbGFzcyBTdGF0aWNEYXRhTWVtYmVyUmVjb3JkIDogcHVibGljIFR5cGVSZWNvcmQgeworcHVibGljOgorICBTdGF0aWNEYXRhTWVtYmVyUmVjb3JkKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBTdGF0aWNEYXRhTWVtYmVyUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQpIDogVHlwZVJlY29yZChLaW5kKSB7fQorICBTdGF0aWNEYXRhTWVtYmVyUmVjb3JkKE1lbWJlckF0dHJpYnV0ZXMgQXR0cnMsIFR5cGVJbmRleCBUeXBlLCBTdHJpbmdSZWYgTmFtZSkKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6U3RhdGljRGF0YU1lbWJlciksIEF0dHJzKEF0dHJzKSwgVHlwZShUeXBlKSwKKyAgICAgICAgTmFtZShOYW1lKSB7fQorICBTdGF0aWNEYXRhTWVtYmVyUmVjb3JkKE1lbWJlckFjY2VzcyBBY2Nlc3MsIFR5cGVJbmRleCBUeXBlLCBTdHJpbmdSZWYgTmFtZSkKKyAgICAgIDogVHlwZVJlY29yZChUeXBlUmVjb3JkS2luZDo6U3RhdGljRGF0YU1lbWJlciksIEF0dHJzKEFjY2VzcyksIFR5cGUoVHlwZSksCisgICAgICAgIE5hbWUoTmFtZSkge30KKworICBNZW1iZXJBY2Nlc3MgZ2V0QWNjZXNzKCkgY29uc3QgeyByZXR1cm4gQXR0cnMuZ2V0QWNjZXNzKCk7IH0KKyAgVHlwZUluZGV4IGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBUeXBlOyB9CisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorCisgIE1lbWJlckF0dHJpYnV0ZXMgQXR0cnM7CisgIFR5cGVJbmRleCBUeXBlOworICBTdHJpbmdSZWYgTmFtZTsKK307CisKKy8vIExGX0VOVU1FUkFURQorY2xhc3MgRW51bWVyYXRvclJlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgRW51bWVyYXRvclJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgRW51bWVyYXRvclJlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFR5cGVSZWNvcmQoS2luZCkge30KKyAgRW51bWVyYXRvclJlY29yZChNZW1iZXJBdHRyaWJ1dGVzIEF0dHJzLCBBUFNJbnQgVmFsdWUsIFN0cmluZ1JlZiBOYW1lKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpFbnVtZXJhdG9yKSwgQXR0cnMoQXR0cnMpLAorICAgICAgICBWYWx1ZShzdGQ6Om1vdmUoVmFsdWUpKSwgTmFtZShOYW1lKSB7fQorICBFbnVtZXJhdG9yUmVjb3JkKE1lbWJlckFjY2VzcyBBY2Nlc3MsIEFQU0ludCBWYWx1ZSwgU3RyaW5nUmVmIE5hbWUpCisgICAgICA6IFR5cGVSZWNvcmQoVHlwZVJlY29yZEtpbmQ6OkVudW1lcmF0b3IpLCBBdHRycyhBY2Nlc3MpLAorICAgICAgICBWYWx1ZShzdGQ6Om1vdmUoVmFsdWUpKSwgTmFtZShOYW1lKSB7fQorCisgIE1lbWJlckFjY2VzcyBnZXRBY2Nlc3MoKSBjb25zdCB7IHJldHVybiBBdHRycy5nZXRBY2Nlc3MoKTsgfQorICBBUFNJbnQgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZTsgfQorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICBNZW1iZXJBdHRyaWJ1dGVzIEF0dHJzOworICBBUFNJbnQgVmFsdWU7CisgIFN0cmluZ1JlZiBOYW1lOworfTsKKworLy8gTEZfVkZVTkNUQUIKK2NsYXNzIFZGUHRyUmVjb3JkIDogcHVibGljIFR5cGVSZWNvcmQgeworcHVibGljOgorICBWRlB0clJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgVkZQdHJSZWNvcmQoVHlwZVJlY29yZEtpbmQgS2luZCkgOiBUeXBlUmVjb3JkKEtpbmQpIHt9CisgIFZGUHRyUmVjb3JkKFR5cGVJbmRleCBUeXBlKQorICAgICAgOiBUeXBlUmVjb3JkKFR5cGVSZWNvcmRLaW5kOjpWRlB0ciksIFR5cGUoVHlwZSkge30KKworICBUeXBlSW5kZXggZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5cGU7IH0KKworICBUeXBlSW5kZXggVHlwZTsKK307CisKKy8vIExGX0JDTEFTUywgTEZfQklOVEVSRkFDRQorY2xhc3MgQmFzZUNsYXNzUmVjb3JkIDogcHVibGljIFR5cGVSZWNvcmQgeworcHVibGljOgorICBCYXNlQ2xhc3NSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IEJhc2VDbGFzc1JlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFR5cGVSZWNvcmQoS2luZCkge30KKyAgQmFzZUNsYXNzUmVjb3JkKE1lbWJlckF0dHJpYnV0ZXMgQXR0cnMsIFR5cGVJbmRleCBUeXBlLCB1aW50NjRfdCBPZmZzZXQpCisgICAgICA6IFR5cGVSZWNvcmQoVHlwZVJlY29yZEtpbmQ6OkJhc2VDbGFzcyksIEF0dHJzKEF0dHJzKSwgVHlwZShUeXBlKSwKKyAgICAgICAgT2Zmc2V0KE9mZnNldCkge30KKyAgQmFzZUNsYXNzUmVjb3JkKE1lbWJlckFjY2VzcyBBY2Nlc3MsIFR5cGVJbmRleCBUeXBlLCB1aW50NjRfdCBPZmZzZXQpCisgICAgICA6IFR5cGVSZWNvcmQoVHlwZVJlY29yZEtpbmQ6OkJhc2VDbGFzcyksIEF0dHJzKEFjY2VzcyksIFR5cGUoVHlwZSksCisgICAgICAgIE9mZnNldChPZmZzZXQpIHt9CisKKyAgTWVtYmVyQWNjZXNzIGdldEFjY2VzcygpIGNvbnN0IHsgcmV0dXJuIEF0dHJzLmdldEFjY2VzcygpOyB9CisgIFR5cGVJbmRleCBnZXRCYXNlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5cGU7IH0KKyAgdWludDY0X3QgZ2V0QmFzZU9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIE9mZnNldDsgfQorCisgIE1lbWJlckF0dHJpYnV0ZXMgQXR0cnM7CisgIFR5cGVJbmRleCBUeXBlOworICB1aW50NjRfdCBPZmZzZXQ7Cit9OworCisvLyBMRl9WQkNMQVNTLCBMRl9JVkJDTEFTUworY2xhc3MgVmlydHVhbEJhc2VDbGFzc1JlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgVmlydHVhbEJhc2VDbGFzc1JlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgVmlydHVhbEJhc2VDbGFzc1JlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFR5cGVSZWNvcmQoS2luZCkge30KKyAgVmlydHVhbEJhc2VDbGFzc1JlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kLCBNZW1iZXJBdHRyaWJ1dGVzIEF0dHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGVJbmRleCBCYXNlVHlwZSwgVHlwZUluZGV4IFZCUHRyVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXQsIHVpbnQ2NF90IEluZGV4KQorICAgICAgOiBUeXBlUmVjb3JkKEtpbmQpLCBBdHRycyhBdHRycyksIEJhc2VUeXBlKEJhc2VUeXBlKSwKKyAgICAgICAgVkJQdHJUeXBlKFZCUHRyVHlwZSksIFZCUHRyT2Zmc2V0KE9mZnNldCksIFZUYWJsZUluZGV4KEluZGV4KSB7fQorICBWaXJ0dWFsQmFzZUNsYXNzUmVjb3JkKFR5cGVSZWNvcmRLaW5kIEtpbmQsIE1lbWJlckFjY2VzcyBBY2Nlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZUluZGV4IEJhc2VUeXBlLCBUeXBlSW5kZXggVkJQdHJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldCwgdWludDY0X3QgSW5kZXgpCisgICAgICA6IFR5cGVSZWNvcmQoS2luZCksIEF0dHJzKEFjY2VzcyksIEJhc2VUeXBlKEJhc2VUeXBlKSwKKyAgICAgICAgVkJQdHJUeXBlKFZCUHRyVHlwZSksIFZCUHRyT2Zmc2V0KE9mZnNldCksIFZUYWJsZUluZGV4KEluZGV4KSB7fQorCisgIE1lbWJlckFjY2VzcyBnZXRBY2Nlc3MoKSBjb25zdCB7IHJldHVybiBBdHRycy5nZXRBY2Nlc3MoKTsgfQorICBUeXBlSW5kZXggZ2V0QmFzZVR5cGUoKSBjb25zdCB7IHJldHVybiBCYXNlVHlwZTsgfQorICBUeXBlSW5kZXggZ2V0VkJQdHJUeXBlKCkgY29uc3QgeyByZXR1cm4gVkJQdHJUeXBlOyB9CisgIHVpbnQ2NF90IGdldFZCUHRyT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gVkJQdHJPZmZzZXQ7IH0KKyAgdWludDY0X3QgZ2V0VlRhYmxlSW5kZXgoKSBjb25zdCB7IHJldHVybiBWVGFibGVJbmRleDsgfQorCisgIE1lbWJlckF0dHJpYnV0ZXMgQXR0cnM7CisgIFR5cGVJbmRleCBCYXNlVHlwZTsKKyAgVHlwZUluZGV4IFZCUHRyVHlwZTsKKyAgdWludDY0X3QgVkJQdHJPZmZzZXQ7CisgIHVpbnQ2NF90IFZUYWJsZUluZGV4OworfTsKKworLy8vIExGX0lOREVYIC0gVXNlZCB0byBjaGFpbiB0d28gbGFyZ2UgTEZfRklFTERMSVNUIG9yIExGX01FVEhPRExJU1QgcmVjb3JkcworLy8vIHRvZ2V0aGVyLiBUaGUgZmlyc3Qgd2lsbCBlbmQgaW4gYW4gTEZfSU5ERVggcmVjb3JkIHRoYXQgcG9pbnRzIHRvIHRoZSBuZXh0LgorY2xhc3MgTGlzdENvbnRpbnVhdGlvblJlY29yZCA6IHB1YmxpYyBUeXBlUmVjb3JkIHsKK3B1YmxpYzoKKyAgTGlzdENvbnRpbnVhdGlvblJlY29yZCgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgTGlzdENvbnRpbnVhdGlvblJlY29yZChUeXBlUmVjb3JkS2luZCBLaW5kKSA6IFR5cGVSZWNvcmQoS2luZCkge30KKyAgTGlzdENvbnRpbnVhdGlvblJlY29yZChUeXBlSW5kZXggQ29udGludWF0aW9uSW5kZXgpCisgICAgICA6IFR5cGVSZWNvcmQoVHlwZVJlY29yZEtpbmQ6Okxpc3RDb250aW51YXRpb24pLAorICAgICAgICBDb250aW51YXRpb25JbmRleChDb250aW51YXRpb25JbmRleCkge30KKworICBUeXBlSW5kZXggZ2V0Q29udGludWF0aW9uSW5kZXgoKSBjb25zdCB7IHJldHVybiBDb250aW51YXRpb25JbmRleDsgfQorCisgIFR5cGVJbmRleCBDb250aW51YXRpb25JbmRleDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVSRUNPUkRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVJlY29yZE1hcHBpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVSZWNvcmRNYXBwaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JlOGQ2MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVSZWNvcmRNYXBwaW5nLmgKQEAgLTAsMCArMSw1MiBAQAorLy89PT0tIFR5cGVSZWNvcmRNYXBwaW5nLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19UWVBFUkVDT1JETUFQUElOR19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVSRUNPUkRNQVBQSU5HX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdSZWNvcmRJTy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVWaXNpdG9yQ2FsbGJhY2tzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEJpbmFyeVN0cmVhbVJlYWRlcjsKK2NsYXNzIEJpbmFyeVN0cmVhbVdyaXRlcjsKKworbmFtZXNwYWNlIGNvZGV2aWV3IHsKK2NsYXNzIFR5cGVSZWNvcmRNYXBwaW5nIDogcHVibGljIFR5cGVWaXNpdG9yQ2FsbGJhY2tzIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgVHlwZVJlY29yZE1hcHBpbmcoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIpIDogSU8oUmVhZGVyKSB7fQorICBleHBsaWNpdCBUeXBlUmVjb3JkTWFwcGluZyhCaW5hcnlTdHJlYW1Xcml0ZXIgJldyaXRlcikgOiBJTyhXcml0ZXIpIHt9CisKKyAgdXNpbmcgVHlwZVZpc2l0b3JDYWxsYmFja3M6OnZpc2l0VHlwZUJlZ2luOworICBFcnJvciB2aXNpdFR5cGVCZWdpbihDVlR5cGUgJlJlY29yZCkgb3ZlcnJpZGU7CisgIEVycm9yIHZpc2l0VHlwZUVuZChDVlR5cGUgJlJlY29yZCkgb3ZlcnJpZGU7CisKKyAgRXJyb3IgdmlzaXRNZW1iZXJCZWdpbihDVk1lbWJlclJlY29yZCAmUmVjb3JkKSBvdmVycmlkZTsKKyAgRXJyb3IgdmlzaXRNZW1iZXJFbmQoQ1ZNZW1iZXJSZWNvcmQgJlJlY29yZCkgb3ZlcnJpZGU7CisKKyNkZWZpbmUgVFlQRV9SRUNPUkQoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVycm9yIHZpc2l0S25vd25SZWNvcmQoQ1ZUeXBlICZDVlIsIE5hbWUjI1JlY29yZCAmUmVjb3JkKSBvdmVycmlkZTsKKyNkZWZpbmUgTUVNQkVSX1JFQ09SRChFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVycm9yIHZpc2l0S25vd25NZW1iZXIoQ1ZNZW1iZXJSZWNvcmQgJkNWUiwgTmFtZSMjUmVjb3JkICZSZWNvcmQpIG92ZXJyaWRlOworI2RlZmluZSBUWVBFX1JFQ09SRF9BTElBUyhFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSwgQWxpYXNOYW1lKQorI2RlZmluZSBNRU1CRVJfUkVDT1JEX0FMSUFTKEVudW1OYW1lLCBFbnVtVmFsLCBOYW1lLCBBbGlhc05hbWUpCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXdUeXBlcy5kZWYiCisKK3ByaXZhdGU6CisgIE9wdGlvbmFsPFR5cGVMZWFmS2luZD4gVHlwZUtpbmQ7CisgIE9wdGlvbmFsPFR5cGVMZWFmS2luZD4gTWVtYmVyS2luZDsKKworICBDb2RlVmlld1JlY29yZElPIElPOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlU3RyZWFtTWVyZ2VyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlU3RyZWFtTWVyZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTllMjE2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVTdHJlYW1NZXJnZXIuaApAQCAtMCwwICsxLDEwNyBAQAorLy89PT0tIFR5cGVTdHJlYW1NZXJnZXIuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19UWVBFU1RSRUFNTUVSR0VSX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRVNUUkVBTU1FUkdFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworCitjbGFzcyBUeXBlSW5kZXg7CitzdHJ1Y3QgR2xvYmFsbHlIYXNoZWRUeXBlOworY2xhc3MgR2xvYmFsVHlwZVRhYmxlQnVpbGRlcjsKK2NsYXNzIE1lcmdpbmdUeXBlVGFibGVCdWlsZGVyOworCisvLy8gXGJyaWVmIE1lcmdlIG9uZSBzZXQgb2YgdHlwZSByZWNvcmRzIGludG8gYW5vdGhlci4gIFRoaXMgbWV0aG9kIGFzc3VtZXMKKy8vLyB0aGF0IGFsbCByZWNvcmRzIGFyZSB0eXBlIHJlY29yZHMsIGFuZCB0aGVyZSBhcmUgbm8gSWQgcmVjb3JkcyBwcmVzZW50LgorLy8vCisvLy8gXHBhcmFtIERlc3QgVGhlIHRhYmxlIHRvIHN0b3JlIHRoZSByZS13cml0dGVuIHR5cGUgcmVjb3JkcyBpbnRvLgorLy8vCisvLy8gXHBhcmFtIFNvdXJjZVRvRGVzdCBBIHZlY3RvciwgaW5kZXhlZCBieSB0aGUgVHlwZUluZGV4IGluIHRoZSBzb3VyY2UKKy8vLyB0eXBlIHN0cmVhbSwgdGhhdCBjb250YWlucyB0aGUgaW5kZXggb2YgdGhlIGNvcnJlc3BvbmRpbmcgdHlwZSByZWNvcmQKKy8vLyBpbiB0aGUgZGVzdGluYXRpb24gc3RyZWFtLgorLy8vCisvLy8gXHBhcmFtIFR5cGVzIFRoZSBjb2xsZWN0aW9uIG9mIHR5cGVzIHRvIG1lcmdlIGluLgorLy8vCisvLy8gXHJldHVybnMgRXJyb3I6OnN1Y2Nlc3MoKSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCwgb3RoZXJ3aXNlIGFuCisvLy8gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KK0Vycm9yIG1lcmdlVHlwZVJlY29yZHMoTWVyZ2luZ1R5cGVUYWJsZUJ1aWxkZXIgJkRlc3QsCisgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxUeXBlSW5kZXg+ICZTb3VyY2VUb0Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENWVHlwZUFycmF5ICZUeXBlcyk7CisKKy8vLyBcYnJpZWYgTWVyZ2Ugb25lIHNldCBvZiBpZCByZWNvcmRzIGludG8gYW5vdGhlci4gIFRoaXMgbWV0aG9kIGFzc3VtZXMKKy8vLyB0aGF0IGFsbCByZWNvcmRzIGFyZSBpZCByZWNvcmRzLCBhbmQgdGhlcmUgYXJlIG5vIFR5cGUgcmVjb3JkcyBwcmVzZW50LgorLy8vIEhvd2V2ZXIsIHNpbmNlIElkIHJlY29yZHMgY2FuIHJlZmVyIGJhY2sgdG8gVHlwZSByZWNvcmRzLCB0aGlzIG1ldGhvZAorLy8vIGFzc3VtZXMgdGhhdCB0aGUgcmVmZXJlbmNlZCB0eXBlIHJlY29yZHMgaGF2ZSBhbHNvIGJlZW4gbWVyZ2VkIGludG8KKy8vLyBhbm90aGVyIHR5cGUgc3RyZWFtIChmb3IgZXhhbXBsZSB1c2luZyB0aGUgYWJvdmUgbWV0aG9kKSwgYW5kIGFjY2VwdHMKKy8vLyB0aGUgbWFwcGluZyBmcm9tIHNvdXJjZSB0byBkZXN0IGZvciB0aGF0IHN0cmVhbSBzbyB0aGF0IGl0IGNhbiByZS13cml0ZQorLy8vIHRoZSB0eXBlIHJlY29yZCBtYXBwaW5ncyBhY2NvcmRpbmdseS4KKy8vLworLy8vIFxwYXJhbSBEZXN0IFRoZSB0YWJsZSB0byBzdG9yZSB0aGUgcmUtd3JpdHRlbiBpZCByZWNvcmRzIGludG8uCisvLy8KKy8vLyBccGFyYW0gVHlwZXMgVGhlIG1hcHBpbmcgdG8gdXNlIGZvciB0aGUgdHlwZSByZWNvcmRzIHRoYXQgdGhlc2UgaWQKKy8vLyByZWNvcmRzIHJlZmVyIHRvLgorLy8vCisvLy8gXHBhcmFtIFNvdXJjZVRvRGVzdCBBIHZlY3RvciwgaW5kZXhlZCBieSB0aGUgVHlwZUluZGV4IGluIHRoZSBzb3VyY2UKKy8vLyBpZCBzdHJlYW0sIHRoYXQgY29udGFpbnMgdGhlIGluZGV4IG9mIHRoZSBjb3JyZXNwb25kaW5nIGlkIHJlY29yZAorLy8vIGluIHRoZSBkZXN0aW5hdGlvbiBzdHJlYW0uCisvLy8KKy8vLyBccGFyYW0gSWRzIFRoZSBjb2xsZWN0aW9uIG9mIGlkIHJlY29yZHMgdG8gbWVyZ2UgaW4uCisvLy8KKy8vLyBccmV0dXJucyBFcnJvcjo6c3VjY2VzcygpIGlmIHRoZSBvcGVyYXRpb24gc3VjY2VlZGVkLCBvdGhlcndpc2UgYW4KKy8vLyBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorRXJyb3IgbWVyZ2VJZFJlY29yZHMoTWVyZ2luZ1R5cGVUYWJsZUJ1aWxkZXIgJkRlc3QsIEFycmF5UmVmPFR5cGVJbmRleD4gVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VHlwZUluZGV4PiAmU291cmNlVG9EZXN0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1ZUeXBlQXJyYXkgJklkcyk7CisKKy8vLyBcYnJpZWYgTWVyZ2UgYSB1bmlmaWVkIHNldCBvZiB0eXBlIGFuZCBpZCByZWNvcmRzLCBzcGxpdHRpbmcgdGhlbSBpbnRvCisvLy8gc2VwYXJhdGUgb3V0cHV0IHN0cmVhbXMuCisvLy8KKy8vLyBccGFyYW0gRGVzdElkcyBUaGUgdGFibGUgdG8gc3RvcmUgdGhlIHJlLXdyaXR0ZW4gaWQgcmVjb3JkcyBpbnRvLgorLy8vCisvLy8gXHBhcmFtIERlc3RUeXBlcyB0aGUgdGFibGUgdG8gc3RvcmUgdGhlIHJlLXdyaXR0ZW4gdHlwZSByZWNvcmRzIGludG8uCisvLy8KKy8vLyBccGFyYW0gU291cmNlVG9EZXN0IEEgdmVjdG9yLCBpbmRleGVkIGJ5IHRoZSBUeXBlSW5kZXggaW4gdGhlIHNvdXJjZQorLy8vIGlkIHN0cmVhbSwgdGhhdCBjb250YWlucyB0aGUgaW5kZXggb2YgdGhlIGNvcnJlc3BvbmRpbmcgaWQgcmVjb3JkCisvLy8gaW4gdGhlIGRlc3RpbmF0aW9uIHN0cmVhbS4KKy8vLworLy8vIFxwYXJhbSBJZHNBbmRUeXBlcyBUaGUgY29sbGVjdGlvbiBvZiBpZCByZWNvcmRzIHRvIG1lcmdlIGluLgorLy8vCisvLy8gXHJldHVybnMgRXJyb3I6OnN1Y2Nlc3MoKSBpZiB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCwgb3RoZXJ3aXNlIGFuCisvLy8gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KK0Vycm9yIG1lcmdlVHlwZUFuZElkUmVjb3JkcyhNZXJnaW5nVHlwZVRhYmxlQnVpbGRlciAmRGVzdElkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXJnaW5nVHlwZVRhYmxlQnVpbGRlciAmRGVzdFR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxUeXBlSW5kZXg+ICZTb3VyY2VUb0Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1ZUeXBlQXJyYXkgJklkc0FuZFR5cGVzKTsKKworRXJyb3IgbWVyZ2VUeXBlQW5kSWRSZWNvcmRzKEdsb2JhbFR5cGVUYWJsZUJ1aWxkZXIgJkRlc3RJZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVHlwZVRhYmxlQnVpbGRlciAmRGVzdFR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxUeXBlSW5kZXg+ICZTb3VyY2VUb0Rlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ1ZUeXBlQXJyYXkgJklkc0FuZFR5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEdsb2JhbGx5SGFzaGVkVHlwZT4gSGFzaGVzKTsKKworRXJyb3IgbWVyZ2VUeXBlUmVjb3JkcyhHbG9iYWxUeXBlVGFibGVCdWlsZGVyICZEZXN0LAorICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VHlwZUluZGV4PiAmU291cmNlVG9EZXN0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDVlR5cGVBcnJheSAmVHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEdsb2JhbGx5SGFzaGVkVHlwZT4gSGFzaGVzKTsKKworRXJyb3IgbWVyZ2VJZFJlY29yZHMoR2xvYmFsVHlwZVRhYmxlQnVpbGRlciAmRGVzdCwgQXJyYXlSZWY8VHlwZUluZGV4PiBUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxUeXBlSW5kZXg+ICZTb3VyY2VUb0Rlc3QsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBDVlR5cGVBcnJheSAmSWRzLAorICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8R2xvYmFsbHlIYXNoZWRUeXBlPiBIYXNoZXMpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19UWVBFU1RSRUFNTUVSR0VSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVTeW1ib2xFbWl0dGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlU3ltYm9sRW1pdHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYmE4M2QKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlU3ltYm9sRW1pdHRlci5oCkBAIC0wLDAgKzEsMzggQEAKKy8vPT09LSBUeXBlU3ltYm9sRW1pdHRlci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRVNZTUJPTEVNSVRURVJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19UWVBFU1lNQk9MRU1JVFRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVJbmRleC5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBTdHJpbmdSZWY7CisKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIFR5cGVTeW1ib2xFbWl0dGVyIHsKK3ByaXZhdGU6CisgIFR5cGVTeW1ib2xFbWl0dGVyKGNvbnN0IFR5cGVTeW1ib2xFbWl0dGVyICYpID0gZGVsZXRlOworICBUeXBlU3ltYm9sRW1pdHRlciAmb3BlcmF0b3I9KGNvbnN0IFR5cGVTeW1ib2xFbWl0dGVyICYpID0gZGVsZXRlOworCitwcm90ZWN0ZWQ6CisgIFR5cGVTeW1ib2xFbWl0dGVyKCkge30KKworcHVibGljOgorICB2aXJ0dWFsIH5UeXBlU3ltYm9sRW1pdHRlcigpIHt9CisKK3B1YmxpYzoKKyAgdmlydHVhbCB2b2lkIHdyaXRlVXNlckRlZmluZWRUeXBlKFR5cGVJbmRleCBUSSwgU3RyaW5nUmVmIE5hbWUpID0gMDsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVRhYmxlQ29sbGVjdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVRhYmxlQ29sbGVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwMzI2YTAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlVGFibGVDb2xsZWN0aW9uLmgKQEAgLTAsMCArMSw0MyBAQAorLy89PT0tIFR5cGVUYWJsZUNvbGxlY3Rpb24uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICotIEMrKyAtLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19UWVBFVEFCTEVDT0xMRUNUSU9OX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRVRBQkxFQ09MTEVDVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlQ29sbGVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TdHJpbmdTYXZlci5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworCitjbGFzcyBUeXBlVGFibGVDb2xsZWN0aW9uIDogcHVibGljIFR5cGVDb2xsZWN0aW9uIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgVHlwZVRhYmxlQ29sbGVjdGlvbihBcnJheVJlZjxBcnJheVJlZjx1aW50OF90Pj4gUmVjb3Jkcyk7CisKKyAgT3B0aW9uYWw8VHlwZUluZGV4PiBnZXRGaXJzdCgpIG92ZXJyaWRlOworICBPcHRpb25hbDxUeXBlSW5kZXg+IGdldE5leHQoVHlwZUluZGV4IFByZXYpIG92ZXJyaWRlOworCisgIENWVHlwZSBnZXRUeXBlKFR5cGVJbmRleCBJbmRleCkgb3ZlcnJpZGU7CisgIFN0cmluZ1JlZiBnZXRUeXBlTmFtZShUeXBlSW5kZXggSW5kZXgpIG92ZXJyaWRlOworICBib29sIGNvbnRhaW5zKFR5cGVJbmRleCBJbmRleCkgb3ZlcnJpZGU7CisgIHVpbnQzMl90IHNpemUoKSBvdmVycmlkZTsKKyAgdWludDMyX3QgY2FwYWNpdHkoKSBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgQnVtcFB0ckFsbG9jYXRvciBBbGxvY2F0b3I7CisgIFN0cmluZ1NhdmVyIE5hbWVTdG9yYWdlOworICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IE5hbWVzOworICBBcnJheVJlZjxBcnJheVJlZjx1aW50OF90Pj4gUmVjb3JkczsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVZpc2l0b3JDYWxsYmFja1BpcGVsaW5lLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlVmlzaXRvckNhbGxiYWNrUGlwZWxpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjZmYjhhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVZpc2l0b3JDYWxsYmFja1BpcGVsaW5lLmgKQEAgLTAsMCArMSwxMjIgQEAKKy8vPT09LSBUeXBlVmlzaXRvckNhbGxiYWNrUGlwZWxpbmUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRVZJU0lUT1JDQUxMQkFDS1BJUEVMSU5FX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRVZJU0lUT1JDQUxMQkFDS1BJUEVMSU5FX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVWaXNpdG9yQ2FsbGJhY2tzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY29kZXZpZXcgeworCitjbGFzcyBUeXBlVmlzaXRvckNhbGxiYWNrUGlwZWxpbmUgOiBwdWJsaWMgVHlwZVZpc2l0b3JDYWxsYmFja3MgeworcHVibGljOgorICBUeXBlVmlzaXRvckNhbGxiYWNrUGlwZWxpbmUoKSA9IGRlZmF1bHQ7CisKKyAgRXJyb3IgdmlzaXRVbmtub3duVHlwZShDVlJlY29yZDxUeXBlTGVhZktpbmQ+ICZSZWNvcmQpIG92ZXJyaWRlIHsKKyAgICBmb3IgKGF1dG8gVmlzaXRvciA6IFBpcGVsaW5lKSB7CisgICAgICBpZiAoYXV0byBFQyA9IFZpc2l0b3ItPnZpc2l0VW5rbm93blR5cGUoUmVjb3JkKSkKKyAgICAgICAgcmV0dXJuIEVDOworICAgIH0KKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIEVycm9yIHZpc2l0VW5rbm93bk1lbWJlcihDVk1lbWJlclJlY29yZCAmUmVjb3JkKSBvdmVycmlkZSB7CisgICAgZm9yIChhdXRvIFZpc2l0b3IgOiBQaXBlbGluZSkgeworICAgICAgaWYgKGF1dG8gRUMgPSBWaXNpdG9yLT52aXNpdFVua25vd25NZW1iZXIoUmVjb3JkKSkKKyAgICAgICAgcmV0dXJuIEVDOworICAgIH0KKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIEVycm9yIHZpc2l0VHlwZUJlZ2luKENWVHlwZSAmUmVjb3JkKSBvdmVycmlkZSB7CisgICAgZm9yIChhdXRvIFZpc2l0b3IgOiBQaXBlbGluZSkgeworICAgICAgaWYgKGF1dG8gRUMgPSBWaXNpdG9yLT52aXNpdFR5cGVCZWdpbihSZWNvcmQpKQorICAgICAgICByZXR1cm4gRUM7CisgICAgfQorICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXJyb3IgdmlzaXRUeXBlQmVnaW4oQ1ZUeXBlICZSZWNvcmQsIFR5cGVJbmRleCBJbmRleCkgb3ZlcnJpZGUgeworICAgIGZvciAoYXV0byBWaXNpdG9yIDogUGlwZWxpbmUpIHsKKyAgICAgIGlmIChhdXRvIEVDID0gVmlzaXRvci0+dmlzaXRUeXBlQmVnaW4oUmVjb3JkLCBJbmRleCkpCisgICAgICAgIHJldHVybiBFQzsKKyAgICB9CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBFcnJvciB2aXNpdFR5cGVFbmQoQ1ZUeXBlICZSZWNvcmQpIG92ZXJyaWRlIHsKKyAgICBmb3IgKGF1dG8gVmlzaXRvciA6IFBpcGVsaW5lKSB7CisgICAgICBpZiAoYXV0byBFQyA9IFZpc2l0b3ItPnZpc2l0VHlwZUVuZChSZWNvcmQpKQorICAgICAgICByZXR1cm4gRUM7CisgICAgfQorICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXJyb3IgdmlzaXRNZW1iZXJCZWdpbihDVk1lbWJlclJlY29yZCAmUmVjb3JkKSBvdmVycmlkZSB7CisgICAgZm9yIChhdXRvIFZpc2l0b3IgOiBQaXBlbGluZSkgeworICAgICAgaWYgKGF1dG8gRUMgPSBWaXNpdG9yLT52aXNpdE1lbWJlckJlZ2luKFJlY29yZCkpCisgICAgICAgIHJldHVybiBFQzsKKyAgICB9CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBFcnJvciB2aXNpdE1lbWJlckVuZChDVk1lbWJlclJlY29yZCAmUmVjb3JkKSBvdmVycmlkZSB7CisgICAgZm9yIChhdXRvIFZpc2l0b3IgOiBQaXBlbGluZSkgeworICAgICAgaWYgKGF1dG8gRUMgPSBWaXNpdG9yLT52aXNpdE1lbWJlckVuZChSZWNvcmQpKQorICAgICAgICByZXR1cm4gRUM7CisgICAgfQorICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgdm9pZCBhZGRDYWxsYmFja1RvUGlwZWxpbmUoVHlwZVZpc2l0b3JDYWxsYmFja3MgJkNhbGxiYWNrcykgeworICAgIFBpcGVsaW5lLnB1c2hfYmFjaygmQ2FsbGJhY2tzKTsKKyAgfQorCisjZGVmaW5lIFRZUEVfUkVDT1JEKEVudW1OYW1lLCBFbnVtVmFsLCBOYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFcnJvciB2aXNpdEtub3duUmVjb3JkKENWVHlwZSAmQ1ZSLCBOYW1lIyNSZWNvcmQgJlJlY29yZCkgb3ZlcnJpZGUgeyAgICAgICAgIFwKKyAgICByZXR1cm4gdmlzaXRLbm93blJlY29yZEltcGwoQ1ZSLCBSZWNvcmQpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgTUVNQkVSX1JFQ09SRChFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVycm9yIHZpc2l0S25vd25NZW1iZXIoQ1ZNZW1iZXJSZWNvcmQgJkNWTVIsIE5hbWUjI1JlY29yZCAmUmVjb3JkKSAgICAgICAgICAgXAorICAgICAgb3ZlcnJpZGUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gdmlzaXRLbm93bk1lbWJlckltcGwoQ1ZNUiwgUmVjb3JkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgVFlQRV9SRUNPUkRfQUxJQVMoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUsIEFsaWFzTmFtZSkKKyNkZWZpbmUgTUVNQkVSX1JFQ09SRF9BTElBUyhFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSwgQWxpYXNOYW1lKQorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3VHlwZXMuZGVmIgorCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gRXJyb3IgdmlzaXRLbm93blJlY29yZEltcGwoQ1ZUeXBlICZDVlIsIFQgJlJlY29yZCkgeworICAgIGZvciAoYXV0byBWaXNpdG9yIDogUGlwZWxpbmUpIHsKKyAgICAgIGlmIChhdXRvIEVDID0gVmlzaXRvci0+dmlzaXRLbm93blJlY29yZChDVlIsIFJlY29yZCkpCisgICAgICAgIHJldHVybiBFQzsKKyAgICB9CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgRXJyb3IgdmlzaXRLbm93bk1lbWJlckltcGwoQ1ZNZW1iZXJSZWNvcmQgJkNWTVIsIFQgJlJlY29yZCkgeworICAgIGZvciAoYXV0byBWaXNpdG9yIDogUGlwZWxpbmUpIHsKKyAgICAgIGlmIChhdXRvIEVDID0gVmlzaXRvci0+dmlzaXRLbm93bk1lbWJlcihDVk1SLCBSZWNvcmQpKQorICAgICAgICByZXR1cm4gRUM7CisgICAgfQorICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisgIHN0ZDo6dmVjdG9yPFR5cGVWaXNpdG9yQ2FsbGJhY2tzICo+IFBpcGVsaW5lOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvZGV2aWV3Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRVZJU0lUT1JDQUxMQkFDS1BJUEVMSU5FX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVWaXNpdG9yQ2FsbGJhY2tzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlVmlzaXRvckNhbGxiYWNrcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3YTQ3MzMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlVmlzaXRvckNhbGxiYWNrcy5oCkBAIC0wLDAgKzEsNzEgQEAKKy8vPT09LSBUeXBlVmlzaXRvckNhbGxiYWNrcy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fQ09ERVZJRVdfVFlQRVZJU0lUT1JDQUxMQkFDS1NfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19DT0RFVklFV19UWVBFVklTSVRPUkNBTExCQUNLU19ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIFR5cGVWaXNpdG9yQ2FsbGJhY2tzIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VHlwZVZpc2l0b3JDYWxsYmFja3MoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIEFjdGlvbiB0byB0YWtlIG9uIHVua25vd24gdHlwZXMuIEJ5IGRlZmF1bHQsIHRoZXkgYXJlIGlnbm9yZWQuCisgIHZpcnR1YWwgRXJyb3IgdmlzaXRVbmtub3duVHlwZShDVlR5cGUgJlJlY29yZCkgeyByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsgfQorICAvLy8gUGFpcmVkIGJlZ2luL2VuZCBhY3Rpb25zIGZvciBhbGwgdHlwZXMuIFJlY2VpdmVzIGFsbCByZWNvcmQgZGF0YSwKKyAgLy8vIGluY2x1ZGluZyB0aGUgZml4ZWQtbGVuZ3RoIHJlY29yZCBwcmVmaXguICB2aXNpdFR5cGVCZWdpbigpIHNob3VsZCByZXR1cm4KKyAgLy8vIHRoZSB0eXBlIG9mIHRoZSBSZWNvcmQsIG9yIGFuIGVycm9yIGlmIGl0IGNhbm5vdCBiZSBkZXRlcm1pbmVkLiAgRXhhY3RseQorICAvLy8gb25lIG9mIHRoZSB0d28gdmlzaXRUeXBlQmVnaW4gbWV0aG9kcyB3aWxsIGJlIGNhbGxlZCwgZGVwZW5kaW5nIG9uIHdoZXRoZXIKKyAgLy8vIHJlY29yZHMgYXJlIGJlaW5nIHZpc2l0ZWQgc2VxdWVudGlhbGx5IG9yIHJhbmRvbWx5LiAgQW4gaW1wbGVtZW50YXRpb24KKyAgLy8vIHNob3VsZCBiZSBwcmVwYXJlZCB0byBoYW5kbGUgYm90aCAob3IgYXNzZXJ0IGlmIGl0IGNhbid0IGhhbmRsZSByYW5kb20KKyAgLy8vIGFjY2VzcyB2aXNpdGF0aW9uKS4KKyAgdmlydHVhbCBFcnJvciB2aXNpdFR5cGVCZWdpbihDVlR5cGUgJlJlY29yZCkgeyByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsgfQorICB2aXJ0dWFsIEVycm9yIHZpc2l0VHlwZUJlZ2luKENWVHlwZSAmUmVjb3JkLCBUeXBlSW5kZXggSW5kZXgpIHsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorICB2aXJ0dWFsIEVycm9yIHZpc2l0VHlwZUVuZChDVlR5cGUgJlJlY29yZCkgeyByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsgfQorCisgIHZpcnR1YWwgRXJyb3IgdmlzaXRVbmtub3duTWVtYmVyKENWTWVtYmVyUmVjb3JkICZSZWNvcmQpIHsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIHZpcnR1YWwgRXJyb3IgdmlzaXRNZW1iZXJCZWdpbihDVk1lbWJlclJlY29yZCAmUmVjb3JkKSB7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICB2aXJ0dWFsIEVycm9yIHZpc2l0TWVtYmVyRW5kKENWTWVtYmVyUmVjb3JkICZSZWNvcmQpIHsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisjZGVmaW5lIFRZUEVfUkVDT1JEKEVudW1OYW1lLCBFbnVtVmFsLCBOYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2aXJ0dWFsIEVycm9yIHZpc2l0S25vd25SZWNvcmQoQ1ZUeXBlICZDVlIsIE5hbWUjI1JlY29yZCAmUmVjb3JkKSB7ICAgICAgICAgIFwKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKyNkZWZpbmUgTUVNQkVSX1JFQ09SRChFbnVtTmFtZSwgRW51bVZhbCwgTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHZpcnR1YWwgRXJyb3IgdmlzaXRLbm93bk1lbWJlcihDVk1lbWJlclJlY29yZCAmQ1ZNLCBOYW1lIyNSZWNvcmQgJlJlY29yZCkgeyAgXAorICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIFRZUEVfUkVDT1JEX0FMSUFTKEVudW1OYW1lLCBFbnVtVmFsLCBOYW1lLCBBbGlhc05hbWUpCisjZGVmaW5lIE1FTUJFUl9SRUNPUkRfQUxJQVMoRW51bU5hbWUsIEVudW1WYWwsIE5hbWUsIEFsaWFzTmFtZSkKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlld1R5cGVzLmRlZiIKKyN1bmRlZiBUWVBFX1JFQ09SRAorI3VuZGVmIFRZUEVfUkVDT1JEX0FMSUFTCisjdW5kZWYgTUVNQkVSX1JFQ09SRAorI3VuZGVmIE1FTUJFUl9SRUNPUkRfQUxJQVMKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb2RldmlldworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0NPREVWSUVXX1RZUEVWSVNJVE9SQ0FMTEJBQ0tTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RJQ29udGV4dC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRElDb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg5ZWIzNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RJQ29udGV4dC5oCkBAIC0wLDAgKzEsMjczIEBACisvLz09PS0gRElDb250ZXh0LmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIERJQ29udGV4dCwgYW4gYWJzdHJhY3QgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBob2xkcworLy8gZGVidWcgaW5mb3JtYXRpb24gZGF0YS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0RJQ09OVEVYVF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0RJQ09OVEVYVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L09iamVjdEZpbGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBIGZvcm1hdC1uZXV0cmFsIGNvbnRhaW5lciBmb3Igc291cmNlIGxpbmUgaW5mb3JtYXRpb24uCitzdHJ1Y3QgRElMaW5lSW5mbyB7CisgIHN0ZDo6c3RyaW5nIEZpbGVOYW1lOworICBzdGQ6OnN0cmluZyBGdW5jdGlvbk5hbWU7CisgIE9wdGlvbmFsPFN0cmluZ1JlZj4gU291cmNlOworICB1aW50MzJfdCBMaW5lID0gMDsKKyAgdWludDMyX3QgQ29sdW1uID0gMDsKKyAgdWludDMyX3QgU3RhcnRMaW5lID0gMDsKKworICAvLyBEV0FSRi1zcGVjaWZpYy4KKyAgdWludDMyX3QgRGlzY3JpbWluYXRvciA9IDA7CisKKyAgRElMaW5lSW5mbygpIDogRmlsZU5hbWUoIjxpbnZhbGlkPiIpLCBGdW5jdGlvbk5hbWUoIjxpbnZhbGlkPiIpIHt9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IERJTGluZUluZm8gJlJIUykgY29uc3QgeworICAgIHJldHVybiBMaW5lID09IFJIUy5MaW5lICYmIENvbHVtbiA9PSBSSFMuQ29sdW1uICYmCisgICAgICAgICAgIEZpbGVOYW1lID09IFJIUy5GaWxlTmFtZSAmJiBGdW5jdGlvbk5hbWUgPT0gUkhTLkZ1bmN0aW9uTmFtZSAmJgorICAgICAgICAgICBTdGFydExpbmUgPT0gUkhTLlN0YXJ0TGluZSAmJiBEaXNjcmltaW5hdG9yID09IFJIUy5EaXNjcmltaW5hdG9yOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IERJTGluZUluZm8gJlJIUykgY29uc3QgeworICAgIHJldHVybiAhKCp0aGlzID09IFJIUyk7CisgIH0KKworICBib29sIG9wZXJhdG9yPChjb25zdCBESUxpbmVJbmZvICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjp0aWUoRmlsZU5hbWUsIEZ1bmN0aW9uTmFtZSwgTGluZSwgQ29sdW1uLCBTdGFydExpbmUsCisgICAgICAgICAgICAgICAgICAgIERpc2NyaW1pbmF0b3IpIDwKKyAgICAgICAgICAgc3RkOjp0aWUoUkhTLkZpbGVOYW1lLCBSSFMuRnVuY3Rpb25OYW1lLCBSSFMuTGluZSwgUkhTLkNvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgUkhTLlN0YXJ0TGluZSwgUkhTLkRpc2NyaW1pbmF0b3IpOworICB9CisKKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuICp0aGlzICE9IERJTGluZUluZm8oKTsgfQorCisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MpIHsKKyAgICBPUyA8PCAiTGluZSBpbmZvOiAiOworICAgIGlmIChGaWxlTmFtZSAhPSAiPGludmFsaWQ+IikKKyAgICAgIE9TIDw8ICJmaWxlICciIDw8IEZpbGVOYW1lIDw8ICInLCAiOworICAgIGlmIChGdW5jdGlvbk5hbWUgIT0gIjxpbnZhbGlkPiIpCisgICAgICBPUyA8PCAiZnVuY3Rpb24gJyIgPDwgRnVuY3Rpb25OYW1lIDw8ICInLCAiOworICAgIE9TIDw8ICJsaW5lICIgPDwgTGluZSA8PCAiLCAiOworICAgIE9TIDw8ICJjb2x1bW4gIiA8PCBDb2x1bW4gPDwgIiwgIjsKKyAgICBPUyA8PCAic3RhcnQgbGluZSAiIDw8IFN0YXJ0TGluZSA8PCAnXG4nOworICB9Cit9OworCit1c2luZyBESUxpbmVJbmZvVGFibGUgPSBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8dWludDY0X3QsIERJTGluZUluZm8+LCAxNj47CisKKy8vLyBBIGZvcm1hdC1uZXV0cmFsIGNvbnRhaW5lciBmb3IgaW5saW5lZCBjb2RlIGRlc2NyaXB0aW9uLgorY2xhc3MgRElJbmxpbmluZ0luZm8geworICBTbWFsbFZlY3RvcjxESUxpbmVJbmZvLCA0PiBGcmFtZXM7CisKK3B1YmxpYzoKKyAgRElJbmxpbmluZ0luZm8oKSA9IGRlZmF1bHQ7CisKKyAgRElMaW5lSW5mbyBnZXRGcmFtZSh1bnNpZ25lZCBJbmRleCkgY29uc3QgeworICAgIGFzc2VydChJbmRleCA8IEZyYW1lcy5zaXplKCkpOworICAgIHJldHVybiBGcmFtZXNbSW5kZXhdOworICB9CisKKyAgRElMaW5lSW5mbyAqZ2V0TXV0YWJsZUZyYW1lKHVuc2lnbmVkIEluZGV4KSB7CisgICAgYXNzZXJ0KEluZGV4IDwgRnJhbWVzLnNpemUoKSk7CisgICAgcmV0dXJuICZGcmFtZXNbSW5kZXhdOworICB9CisKKyAgdWludDMyX3QgZ2V0TnVtYmVyT2ZGcmFtZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEZyYW1lcy5zaXplKCk7CisgIH0KKworICB2b2lkIGFkZEZyYW1lKGNvbnN0IERJTGluZUluZm8gJkZyYW1lKSB7CisgICAgRnJhbWVzLnB1c2hfYmFjayhGcmFtZSk7CisgIH0KK307CisKKy8vLyBDb250YWluZXIgZm9yIGRlc2NyaXB0aW9uIG9mIGEgZ2xvYmFsIHZhcmlhYmxlLgorc3RydWN0IERJR2xvYmFsIHsKKyAgc3RkOjpzdHJpbmcgTmFtZTsKKyAgdWludDY0X3QgU3RhcnQgPSAwOworICB1aW50NjRfdCBTaXplID0gMDsKKworICBESUdsb2JhbCgpIDogTmFtZSgiPGludmFsaWQ+Iikge30KK307CisKKy8vLyBBIERJTmFtZUtpbmQgaXMgcGFzc2VkIHRvIG5hbWUgc2VhcmNoIG1ldGhvZHMgdG8gc3BlY2lmeSBhCisvLy8gcHJlZmVyZW5jZSByZWdhcmRpbmcgdGhlIHR5cGUgb2YgbmFtZSByZXNvbHV0aW9uIHRoZSBjYWxsZXIgd2FudHMuCitlbnVtIGNsYXNzIERJTmFtZUtpbmQgeyBOb25lLCBTaG9ydE5hbWUsIExpbmthZ2VOYW1lIH07CisKKy8vLyBDb250cm9scyB3aGljaCBmaWVsZHMgb2YgRElMaW5lSW5mbyBjb250YWluZXIgc2hvdWxkIGJlIGZpbGxlZAorLy8vIHdpdGggZGF0YS4KK3N0cnVjdCBESUxpbmVJbmZvU3BlY2lmaWVyIHsKKyAgZW51bSBjbGFzcyBGaWxlTGluZUluZm9LaW5kIHsgTm9uZSwgRGVmYXVsdCwgQWJzb2x1dGVGaWxlUGF0aCB9OworICB1c2luZyBGdW5jdGlvbk5hbWVLaW5kID0gRElOYW1lS2luZDsKKworICBGaWxlTGluZUluZm9LaW5kIEZMSUtpbmQ7CisgIEZ1bmN0aW9uTmFtZUtpbmQgRk5LaW5kOworCisgIERJTGluZUluZm9TcGVjaWZpZXIoRmlsZUxpbmVJbmZvS2luZCBGTElLaW5kID0gRmlsZUxpbmVJbmZvS2luZDo6RGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbk5hbWVLaW5kIEZOS2luZCA9IEZ1bmN0aW9uTmFtZUtpbmQ6Ok5vbmUpCisgICAgICA6IEZMSUtpbmQoRkxJS2luZCksIEZOS2luZChGTktpbmQpIHt9Cit9OworCisvLy8gVGhpcyBpcyBqdXN0IGEgaGVscGVyIHRvIHByb2dyYW1tYXRpY2FsbHkgY29uc3RydWN0IERJRHVtcFR5cGUuCitlbnVtIERJRHVtcFR5cGVDb3VudGVyIHsKKyNkZWZpbmUgSEFORExFX0RXQVJGX1NFQ1RJT04oRU5VTV9OQU1FLCBFTEZfTkFNRSwgQ01ETElORV9OQU1FKSBcCisgIERJRFRfSURfIyNFTlVNX05BTUUsCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuZGVmIgorI3VuZGVmIEhBTkRMRV9EV0FSRl9TRUNUSU9OCisgIERJRFRfSURfVVVJRCwKKyAgRElEVF9JRF9Db3VudAorfTsKK3N0YXRpY19hc3NlcnQoRElEVF9JRF9Db3VudCA8PSAzMiwgInNlY3Rpb24gdHlwZXMgb3ZlcmZsb3cgc3RvcmFnZSIpOworCisvLy8gU2VsZWN0cyB3aGljaCBkZWJ1ZyBzZWN0aW9ucyBnZXQgZHVtcGVkLgorZW51bSBESUR1bXBUeXBlIDogdW5zaWduZWQgeworICBESURUX051bGwsCisgIERJRFRfQWxsICAgICAgICAgICAgID0gfjBVLAorI2RlZmluZSBIQU5ETEVfRFdBUkZfU0VDVElPTihFTlVNX05BTUUsIEVMRl9OQU1FLCBDTURMSU5FX05BTUUpIFwKKyAgRElEVF8jI0VOVU1fTkFNRSA9IDFVIDw8IERJRFRfSURfIyNFTlVNX05BTUUsCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuZGVmIgorI3VuZGVmIEhBTkRMRV9EV0FSRl9TRUNUSU9OCisgIERJRFRfVVVJRCA9IDEgPDwgRElEVF9JRF9VVUlELAorfTsKKworLy8vIENvbnRhaW5lciBmb3IgZHVtcCBvcHRpb25zIHRoYXQgY29udHJvbCB3aGljaCBkZWJ1ZyBpbmZvcm1hdGlvbiB3aWxsIGJlCisvLy8gZHVtcGVkLgorc3RydWN0IERJRHVtcE9wdGlvbnMgeworICB1bnNpZ25lZCBEdW1wVHlwZSA9IERJRFRfQWxsOworICB1bnNpZ25lZCBSZWN1cnNlRGVwdGggPSAtMVU7CisgIGJvb2wgU2hvd0FkZHJlc3NlcyA9IHRydWU7CisgIGJvb2wgU2hvd0NoaWxkcmVuID0gZmFsc2U7CisgIGJvb2wgU2hvd1BhcmVudHMgPSBmYWxzZTsKKyAgYm9vbCBTaG93Rm9ybSA9IGZhbHNlOworICBib29sIFN1bW1hcml6ZVR5cGVzID0gZmFsc2U7CisgIGJvb2wgVmVyYm9zZSA9IGZhbHNlOworICBib29sIERpc3BsYXlSYXdDb250ZW50cyA9IGZhbHNlOworCisgIC8vLyBSZXR1cm4gZGVmYXVsdCBvcHRpb24gc2V0IGZvciBwcmludGluZyBhIHNpbmdsZSBESUUgd2l0aG91dCBjaGlsZHJlbi4KKyAgc3RhdGljIERJRHVtcE9wdGlvbnMgZ2V0Rm9yU2luZ2xlRElFKCkgeworICAgIERJRHVtcE9wdGlvbnMgT3B0czsKKyAgICBPcHRzLlJlY3Vyc2VEZXB0aCA9IDA7CisgICAgcmV0dXJuIE9wdHM7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBvcHRpb25zIHdpdGggUmVjdXJzZURlcHRoIHNldCB0byAwIHVubGVzcyBleHBsaWNpdGx5IHJlcXVpcmVkLgorICBESUR1bXBPcHRpb25zIG5vSW1wbGljaXRSZWN1cnNpb24oKSBjb25zdCB7CisgICAgRElEdW1wT3B0aW9ucyBPcHRzID0gKnRoaXM7CisgICAgaWYgKFJlY3Vyc2VEZXB0aCA9PSAtMVUgJiYgIVNob3dDaGlsZHJlbikKKyAgICAgIE9wdHMuUmVjdXJzZURlcHRoID0gMDsKKyAgICByZXR1cm4gT3B0czsKKyAgfQorfTsKKworY2xhc3MgRElDb250ZXh0IHsKK3B1YmxpYzoKKyAgZW51bSBESUNvbnRleHRLaW5kIHsKKyAgICBDS19EV0FSRiwKKyAgICBDS19QREIKKyAgfTsKKworICBESUNvbnRleHQoRElDb250ZXh0S2luZCBLKSA6IEtpbmQoSykge30KKyAgdmlydHVhbCB+RElDb250ZXh0KCkgPSBkZWZhdWx0OworCisgIERJQ29udGV4dEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICB2aXJ0dWFsIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MsIERJRHVtcE9wdGlvbnMgRHVtcE9wdHMpID0gMDsKKworICB2aXJ0dWFsIGJvb2wgdmVyaWZ5KHJhd19vc3RyZWFtICZPUywgRElEdW1wT3B0aW9ucyBEdW1wT3B0cyA9IHt9KSB7CisgICAgLy8gTm8gdmVyaWZpZXI/IEp1c3Qgc2F5IHRoaW5ncyB3ZW50IHdlbGwuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB2aXJ0dWFsIERJTGluZUluZm8gZ2V0TGluZUluZm9Gb3JBZGRyZXNzKHVpbnQ2NF90IEFkZHJlc3MsCisgICAgICBESUxpbmVJbmZvU3BlY2lmaWVyIFNwZWNpZmllciA9IERJTGluZUluZm9TcGVjaWZpZXIoKSkgPSAwOworICB2aXJ0dWFsIERJTGluZUluZm9UYWJsZSBnZXRMaW5lSW5mb0ZvckFkZHJlc3NSYW5nZSh1aW50NjRfdCBBZGRyZXNzLAorICAgICAgdWludDY0X3QgU2l6ZSwgRElMaW5lSW5mb1NwZWNpZmllciBTcGVjaWZpZXIgPSBESUxpbmVJbmZvU3BlY2lmaWVyKCkpID0gMDsKKyAgdmlydHVhbCBESUlubGluaW5nSW5mbyBnZXRJbmxpbmluZ0luZm9Gb3JBZGRyZXNzKHVpbnQ2NF90IEFkZHJlc3MsCisgICAgICBESUxpbmVJbmZvU3BlY2lmaWVyIFNwZWNpZmllciA9IERJTGluZUluZm9TcGVjaWZpZXIoKSkgPSAwOworCitwcml2YXRlOgorICBjb25zdCBESUNvbnRleHRLaW5kIEtpbmQ7Cit9OworCisvLy8gQW4gaW5mZXJmYWNlIGZvciBpbnF1aXJpbmcgdGhlIGxvYWQgYWRkcmVzcyBvZiBhIGxvYWRlZCBvYmplY3QgZmlsZQorLy8vIHRvIGJlIHVzZWQgYnkgdGhlIERJQ29udGV4dCBpbXBsZW1lbnRhdGlvbnMgd2hlbiBhcHBseWluZyByZWxvY2F0aW9ucworLy8vIG9uIHRoZSBmbHkuCitjbGFzcyBMb2FkZWRPYmplY3RJbmZvIHsKK3Byb3RlY3RlZDoKKyAgTG9hZGVkT2JqZWN0SW5mbygpID0gZGVmYXVsdDsKKyAgTG9hZGVkT2JqZWN0SW5mbyhjb25zdCBMb2FkZWRPYmplY3RJbmZvICYpID0gZGVmYXVsdDsKKworcHVibGljOgorICB2aXJ0dWFsIH5Mb2FkZWRPYmplY3RJbmZvKCkgPSBkZWZhdWx0OworCisgIC8vLyBPYnRhaW4gdGhlIExvYWQgQWRkcmVzcyBvZiBhIHNlY3Rpb24gYnkgU2VjdGlvblJlZi4KKyAgLy8vCisgIC8vLyBDYWxjdWxhdGUgdGhlIGFkZHJlc3Mgb2YgdGhlIGdpdmVuIHNlY3Rpb24uCisgIC8vLyBUaGUgc2VjdGlvbiBuZWVkIG5vdCBiZSBwcmVzZW50IGluIHRoZSBsb2NhbCBhZGRyZXNzIHNwYWNlLiBUaGUgYWRkcmVzc2VzCisgIC8vLyBuZWVkIHRvIGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgYWRkcmVzc2VzIHVzZWQgdG8gcXVlcnkgdGhlIERJQ29udGV4dCBhbmQKKyAgLy8vIHRoZSBvdXRwdXQgb2YgdGhpcyBmdW5jdGlvbiBzaG91bGQgYmUgZGV0ZXJtaW5pc3RpYywgaS5lLiByZXBlYXRlZCBjYWxscworICAvLy8gd2l0aCB0aGUgc2FtZSBTZWMgc2hvdWxkIGdpdmUgdGhlIHNhbWUgYWRkcmVzcy4KKyAgdmlydHVhbCB1aW50NjRfdCBnZXRTZWN0aW9uTG9hZEFkZHJlc3MoY29uc3Qgb2JqZWN0OjpTZWN0aW9uUmVmICZTZWMpIGNvbnN0IHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBJZiBjb252ZW5pZW50bHkgYXZhaWxhYmxlLCByZXR1cm4gdGhlIGNvbnRlbnQgb2YgdGhlIGdpdmVuIFNlY3Rpb24uCisgIC8vLworICAvLy8gV2hlbiB0aGUgc2VjdGlvbiBpcyBhdmFpbGFibGUgaW4gdGhlIGxvY2FsIGFkZHJlc3Mgc3BhY2UsIGluIHJlbG9jYXRlZAorICAvLy8gKGxvYWRlZCkgZm9ybSwgZS5nLiBiZWNhdXNlIGl0IHdhcyByZWxvY2F0ZWQgYnkgYSBKSVQgZm9yIGV4ZWN1dGlvbiwgdGhpcworICAvLy8gZnVuY3Rpb24gc2hvdWxkIHByb3ZpZGUgdGhlIGNvbnRlbnRzIG9mIHNhaWQgc2VjdGlvbiBpbiBgRGF0YWAuIElmIHRoZQorICAvLy8gbG9hZGVkIHNlY3Rpb24gaXMgbm90IGF2YWlsYWJsZSwgb3IgdGhlIGNvc3Qgb2YgcmV0cmlldmluZyBpdCB3b3VsZCBiZQorICAvLy8gcHJvaGliaXRpdmUsIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiBmYWxzZS4gSW4gdGhhdCBjYXNlLCByZWxvY2F0aW9ucworICAvLy8gd2lsbCBiZSByZWFkIGZyb20gdGhlIGxvY2FsICh1bnJlbG9jYXRlZCkgb2JqZWN0IGZpbGUgYW5kIGFwcGxpZWQgb24gdGhlCisgIC8vLyBmbHkuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyB1c2VkIHB1cmVseSBmb3Igb3B0aW16YXRpb24gcHVycG9zZXMgaW4gdGhlCisgIC8vLyBjb21tb24gY2FzZSBvZiBKSVR0aW5nIGluIHRoZSBsb2NhbCBhZGRyZXNzIHNwYWNlLCBzbyByZXR1cm5pbmcgZmFsc2UKKyAgLy8vIHNob3VsZCBhbHdheXMgYmUgY29ycmVjdC4KKyAgdmlydHVhbCBib29sIGdldExvYWRlZFNlY3Rpb25Db250ZW50cyhjb25zdCBvYmplY3Q6OlNlY3Rpb25SZWYgJlNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgJkRhdGEpIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBGSVhNRTogVGhpcyBpcyB1bnRlc3RlZCBhbmQgdW51c2VkIGFueXdoZXJlIGluIHRoZSBMTFZNIHByb2plY3QsIGl0J3MKKyAgLy8gdXNlZC9uZWVkZWQgYnkgSnVsaWEgKGFuIGV4dGVybmFsIHByb2plY3QpLiBJdCBzaG91bGQgaGF2ZSBzb21lIGNvdmVyYWdlCisgIC8vIChhdCBsZWFzdCB0ZXN0cywgYnV0IGlkZWFsbHkgZXhhbXBsZSBmdW5jdGlvbmFsaXR5KS4KKyAgLy8vIE9idGFpbiBhIGNvcHkgb2YgdGhpcyBMb2FkZWRPYmplY3RJbmZvLgorICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxMb2FkZWRPYmplY3RJbmZvPiBjbG9uZSgpIGNvbnN0ID0gMDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBCYXNlID0gTG9hZGVkT2JqZWN0SW5mbz4KK3N0cnVjdCBMb2FkZWRPYmplY3RJbmZvSGVscGVyIDogQmFzZSB7Citwcm90ZWN0ZWQ6CisgIExvYWRlZE9iamVjdEluZm9IZWxwZXIoY29uc3QgTG9hZGVkT2JqZWN0SW5mb0hlbHBlciAmKSA9IGRlZmF1bHQ7CisgIExvYWRlZE9iamVjdEluZm9IZWxwZXIoKSA9IGRlZmF1bHQ7CisKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFRzPgorICBMb2FkZWRPYmplY3RJbmZvSGVscGVyKFRzICYmLi4uIEFyZ3MpIDogQmFzZShzdGQ6OmZvcndhcmQ8VHM+KEFyZ3MpLi4uKSB7fQorCisgIHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpMb2FkZWRPYmplY3RJbmZvPiBjbG9uZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gbGx2bTo6bWFrZV91bmlxdWU8RGVyaXZlZD4oc3RhdGljX2Nhc3Q8Y29uc3QgRGVyaXZlZCAmPigqdGhpcykpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fRElDT05URVhUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGIyMzM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZBYmJyZXZpYXRpb25EZWNsYXJhdGlvbi5oCkBAIC0wLDAgKzEsMTg0IEBACisvLz09PS0gRFdBUkZBYmJyZXZpYXRpb25EZWNsYXJhdGlvbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0RXQVJGQUJCUkVWSUFUSU9OREVDTEFSQVRJT05fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRkFCQlJFVklBVElPTkRFQ0xBUkFUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFFeHRyYWN0b3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBEV0FSRkZvcm1WYWx1ZTsKK2NsYXNzIERXQVJGVW5pdDsKK2NsYXNzIHJhd19vc3RyZWFtOworCitjbGFzcyBEV0FSRkFiYnJldmlhdGlvbkRlY2xhcmF0aW9uIHsKK3B1YmxpYzoKKyAgc3RydWN0IEF0dHJpYnV0ZVNwZWMgeworICAgIEF0dHJpYnV0ZVNwZWMoZHdhcmY6OkF0dHJpYnV0ZSBBLCBkd2FyZjo6Rm9ybSBGLCBpbnQ2NF90IFZhbHVlKQorICAgICAgICA6IEF0dHIoQSksIEZvcm0oRiksIFZhbHVlKFZhbHVlKSB7CisgICAgICBhc3NlcnQoaXNJbXBsaWNpdENvbnN0KCkpOworICAgIH0KKyAgICBBdHRyaWJ1dGVTcGVjKGR3YXJmOjpBdHRyaWJ1dGUgQSwgZHdhcmY6OkZvcm0gRiwgT3B0aW9uYWw8dWludDhfdD4gQnl0ZVNpemUpCisgICAgICAgIDogQXR0cihBKSwgRm9ybShGKSB7CisgICAgICBhc3NlcnQoIWlzSW1wbGljaXRDb25zdCgpKTsKKyAgICAgIHRoaXMtPkJ5dGVTaXplLkhhc0J5dGVTaXplID0gQnl0ZVNpemUuaGFzVmFsdWUoKTsKKyAgICAgIGlmICh0aGlzLT5CeXRlU2l6ZS5IYXNCeXRlU2l6ZSkKKyAgICAgICAgdGhpcy0+Qnl0ZVNpemUuQnl0ZVNpemUgPSAqQnl0ZVNpemU7CisgICAgfQorCisgICAgZHdhcmY6OkF0dHJpYnV0ZSBBdHRyOworICAgIGR3YXJmOjpGb3JtIEZvcm07CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gVGhlIGZvbGxvd2luZyBmaWVsZCBpcyB1c2VkIGZvciBCeXRlU2l6ZSBmb3Igbm9uLWltcGxpY2l0X2NvbnN0CisgICAgLy8vIGF0dHJpYnV0ZXMgYW5kIGFzIHZhbHVlIGZvciBpbXBsaWNpdF9jb25zdCBvbmVzLCBpbmRpY2F0ZWQgYnkKKyAgICAvLy8gRm9ybSA9PSBEV19GT1JNX2ltcGxpY2l0X2NvbnN0LgorICAgIC8vLyBUaGUgZm9sbG93aW5nIGNhc2VzIGFyZSBkaXN0aW5ndWlzaGVkOgorICAgIC8vLyAqIEZvcm0gIT0gRFdfRk9STV9pbXBsaWNpdF9jb25zdCBhbmQgSGFzQnl0ZVNpemUgaXMgdHJ1ZToKKyAgICAvLy8gICAgIEJ5dGVTaXplIGNvbnRhaW5zIHRoZSBmaXhlZCBzaXplIGluIGJ5dGVzIGZvciB0aGUgRm9ybSBpbiB0aGlzCisgICAgLy8vICAgICBvYmplY3QuCisgICAgLy8vICogRm9ybSAhPSBEV19GT1JNX2ltcGxpY2l0X2NvbnN0IGFuZCBIYXNCeXRlU2l6ZSBpcyBmYWxzZToKKyAgICAvLy8gICAgIGJ5dGUgc2l6ZSBvZiBGb3JtIGVpdGhlciB2YXJpZXMgYWNjb3JkaW5nIHRvIHRoZSBEV0FSRlVuaXQKKyAgICAvLy8gICAgIHRoYXQgaXQgaXMgY29udGFpbmVkIGluIG9yIHRoZSB2YWx1ZSBzaXplIHZhcmllcyBhbmQgbXVzdCBiZQorICAgIC8vLyAgICAgZGVjb2RlZCBmcm9tIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiBpbiBvcmRlciB0byBkZXRlcm1pbmUgaXRzIHNpemUuCisgICAgLy8vICogRm9ybSA9PSBEV19GT1JNX2ltcGxpY2l0X2NvbnN0OgorICAgIC8vLyAgICAgVmFsdWUgY29udGFpbnMgdmFsdWUgZm9yIHRoZSBpbXBsaWNpdF9jb25zdCBhdHRyaWJ1dGUuCisgICAgc3RydWN0IEJ5dGVTaXplU3RvcmFnZSB7CisgICAgICBib29sIEhhc0J5dGVTaXplOworICAgICAgdWludDhfdCBCeXRlU2l6ZTsKKyAgICB9OworICAgIHVuaW9uIHsKKyAgICAgIEJ5dGVTaXplU3RvcmFnZSBCeXRlU2l6ZTsKKyAgICAgIGludDY0X3QgVmFsdWU7CisgICAgfTsKKworICBwdWJsaWM6CisgICAgYm9vbCBpc0ltcGxpY2l0Q29uc3QoKSBjb25zdCB7CisgICAgICByZXR1cm4gRm9ybSA9PSBkd2FyZjo6RFdfRk9STV9pbXBsaWNpdF9jb25zdDsKKyAgICB9CisKKyAgICBpbnQ2NF90IGdldEltcGxpY2l0Q29uc3RWYWx1ZSgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChpc0ltcGxpY2l0Q29uc3QoKSk7CisgICAgICByZXR1cm4gVmFsdWU7CisgICAgfQorCisgICAgLy8vIEdldCB0aGUgZml4ZWQgYnl0ZSBzaXplIG9mIHRoaXMgRm9ybSBpZiBwb3NzaWJsZS4gVGhpcyBmdW5jdGlvbiBtaWdodAorICAgIC8vLyB1c2UgdGhlIERXQVJGVW5pdCB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgdGhlIEZvcm0sIGxpa2UgZm9yCisgICAgLy8vIERXX0FUX2FkZHJlc3MgYW5kIERXX0FUX3JlZl9hZGRyLCBzbyB0aGlzIGlzbid0IGp1c3QgYW4gYWNjZXNzb3IgZm9yCisgICAgLy8vIHRoZSBCeXRlU2l6ZSBtZW1iZXIuCisgICAgT3B0aW9uYWw8aW50NjRfdD4gZ2V0Qnl0ZVNpemUoY29uc3QgRFdBUkZVbml0ICZVKSBjb25zdDsKKyAgfTsKKyAgdXNpbmcgQXR0cmlidXRlU3BlY1ZlY3RvciA9IFNtYWxsVmVjdG9yPEF0dHJpYnV0ZVNwZWMsIDg+OworCisgIERXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb24oKTsKKworICB1aW50MzJfdCBnZXRDb2RlKCkgY29uc3QgeyByZXR1cm4gQ29kZTsgfQorICB1aW50OF90IGdldENvZGVCeXRlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIENvZGVCeXRlU2l6ZTsgfQorICBkd2FyZjo6VGFnIGdldFRhZygpIGNvbnN0IHsgcmV0dXJuIFRhZzsgfQorICBib29sIGhhc0NoaWxkcmVuKCkgY29uc3QgeyByZXR1cm4gSGFzQ2hpbGRyZW47IH0KKworICB1c2luZyBhdHRyX2l0ZXJhdG9yX3JhbmdlID0KKyAgICAgIGl0ZXJhdG9yX3JhbmdlPEF0dHJpYnV0ZVNwZWNWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yPjsKKworICBhdHRyX2l0ZXJhdG9yX3JhbmdlIGF0dHJpYnV0ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGF0dHJfaXRlcmF0b3JfcmFuZ2UoQXR0cmlidXRlU3BlY3MuYmVnaW4oKSwgQXR0cmlidXRlU3BlY3MuZW5kKCkpOworICB9CisKKyAgZHdhcmY6OkZvcm0gZ2V0Rm9ybUJ5SW5kZXgodWludDMyX3QgaWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KGlkeCA8IEF0dHJpYnV0ZVNwZWNzLnNpemUoKSk7CisgICAgcmV0dXJuIEF0dHJpYnV0ZVNwZWNzW2lkeF0uRm9ybTsKKyAgfQorCisgIHNpemVfdCBnZXROdW1BdHRyaWJ1dGVzKCkgY29uc3QgeworICAgIHJldHVybiBBdHRyaWJ1dGVTcGVjcy5zaXplKCk7CisgIH0KKworICBkd2FyZjo6QXR0cmlidXRlIGdldEF0dHJCeUluZGV4KHVpbnQzMl90IGlkeCkgY29uc3QgeworICAgIGFzc2VydChpZHggPCBBdHRyaWJ1dGVTcGVjcy5zaXplKCkpOworICAgIHJldHVybiBBdHRyaWJ1dGVTcGVjc1tpZHhdLkF0dHI7CisgIH0KKworICAvLy8gR2V0IHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZS4KKyAgLy8vCisgIC8vLyBTZWFyY2hlcyB0aGUgdGhpcyBhYmJyZXZpYXRpb24gZGVjbGFyYXRpb24gZm9yIHRoZSBpbmRleCBvZiB0aGUgc3BlY2lmaWVkCisgIC8vLyBhdHRyaWJ1dGUuCisgIC8vLworICAvLy8gXHBhcmFtIGF0dHIgRFdBUkYgYXR0cmlidXRlIHRvIHNlYXJjaCBmb3IuCisgIC8vLyBccmV0dXJucyBPcHRpb25hbCBpbmRleCBvZiB0aGUgYXR0cmlidXRlIGlmIGZvdW5kLCBOb25lIG90aGVyd2lzZS4KKyAgT3B0aW9uYWw8dWludDMyX3Q+IGZpbmRBdHRyaWJ1dGVJbmRleChkd2FyZjo6QXR0cmlidXRlIGF0dHIpIGNvbnN0OworCisgIC8vLyBFeHRyYWN0IGEgRFdBUkYgZm9ybSB2YWx1ZSBmcm9tIGEgRElFIHNwZWNpZmllZCBieSBESUUgb2Zmc2V0LgorICAvLy8KKyAgLy8vIEV4dHJhY3QgYW4gYXR0cmlidXRlIHZhbHVlIGZvciBhIERXQVJGVW5pdCBnaXZlbiB0aGUgRElFIG9mZnNldCBhbmQgdGhlCisgIC8vLyBhdHRyaWJ1dGUuCisgIC8vLworICAvLy8gXHBhcmFtIERJRU9mZnNldCB0aGUgRElFIG9mZnNldCB0aGF0IHBvaW50cyB0byB0aGUgVUxFQjEyOCBhYmJyZXZpYXRpb24KKyAgLy8vIGNvZGUgaW4gdGhlIC5kZWJ1Z19pbmZvIGRhdGEuCisgIC8vLyBccGFyYW0gQXR0ciBEV0FSRiBhdHRyaWJ1dGUgdG8gc2VhcmNoIGZvci4KKyAgLy8vIFxwYXJhbSBVIHRoZSBEV0FSRlVuaXQgdGhlIGNvbnRhaW5zIHRoZSBESUUuCisgIC8vLyBccmV0dXJucyBPcHRpb25hbCBEV0FSRiBmb3JtIHZhbHVlIGlmIHRoZSBhdHRyaWJ1dGUgd2FzIGV4dHJhY3RlZC4KKyAgT3B0aW9uYWw8RFdBUkZGb3JtVmFsdWU+IGdldEF0dHJpYnV0ZVZhbHVlKGNvbnN0IHVpbnQzMl90IERJRU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGR3YXJmOjpBdHRyaWJ1dGUgQXR0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGVW5pdCAmVSkgY29uc3Q7CisKKyAgYm9vbCBleHRyYWN0KERhdGFFeHRyYWN0b3IgRGF0YSwgdWludDMyX3QqIE9mZnNldFB0cik7CisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIC8vIFJldHVybiBhbiBvcHRpb25hbCBieXRlIHNpemUgb2YgYWxsIGF0dHJpYnV0ZSBkYXRhIGluIHRoaXMgYWJicmV2aWF0aW9uCisgIC8vIGlmIGEgY29uc3RhbnQgYnl0ZSBzaXplIGNhbiBiZSBjYWxjdWxhdGVkIGdpdmVuIGEgRFdBUkZVbml0LiBUaGlzIGFsbG93cworICAvLyBEV0FSRiBwYXJzaW5nIHRvIGJlIGZhc3RlciBhcyBtYW55IERXQVJGIERJRXMgaGF2ZSBhIGZpeGVkIGJ5dGUgc2l6ZS4KKyAgT3B0aW9uYWw8c2l6ZV90PiBnZXRGaXhlZEF0dHJpYnV0ZXNCeXRlU2l6ZShjb25zdCBEV0FSRlVuaXQgJlUpIGNvbnN0OworCitwcml2YXRlOgorICB2b2lkIGNsZWFyKCk7CisKKyAgLy8vIEEgaGVscGVyIHN0cnVjdHVyZSB0aGF0IGNhbiBxdWlja2x5IGRldGVybWluZSB0aGUgc2l6ZSBpbiBieXRlcyBvZiBhbgorICAvLy8gYWJicmV2aWF0aW9uIGRlY2xhcmF0aW9uLgorICBzdHJ1Y3QgRml4ZWRTaXplSW5mbyB7CisgICAgLy8vIFRoZSBmaXhlZCBieXRlIHNpemUgZm9yIGZpeGVkIHNpemUgZm9ybXMuCisgICAgdWludDE2X3QgTnVtQnl0ZXMgPSAwOworICAgIC8vLyBOdW1iZXIgb2YgRFdfRk9STV9hZGRyZXNzIGZvcm1zIGluIHRoaXMgYWJicmV2YXRpb24gZGVjbGFyYXRpb24uCisgICAgdWludDhfdCBOdW1BZGRycyA9IDA7CisgICAgLy8vIE51bWJlciBvZiBEV19GT1JNX3JlZl9hZGRyIGZvcm1zIGluIHRoaXMgYWJicmV2YXRpb24gZGVjbGFyYXRpb24uCisgICAgdWludDhfdCBOdW1SZWZBZGRycyA9IDA7CisgICAgLy8vIE51bWJlciBvZiA0IGJ5dGUgaW4gRFdBUkYzMiBhbmQgOCBieXRlIGluIERXQVJGNjQgZm9ybXMuCisgICAgdWludDhfdCBOdW1Ed2FyZk9mZnNldHMgPSAwOworCisgICAgRml4ZWRTaXplSW5mbygpID0gZGVmYXVsdDsKKworICAgIC8vLyBDYWxjdWxhdGUgdGhlIGZpeGVkIHNpemUgaW4gYnl0ZXMgZ2l2ZW4gYSBEV0FSRlVuaXQuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBVIHRoZSBEV0FSRlVuaXQgdG8gdXNlIHdoZW4gZGV0ZXJtaW5nIHRoZSBieXRlIHNpemUuCisgICAgLy8vIFxyZXR1cm5zIHRoZSBzaXplIGluIGJ5dGVzIGZvciBhbGwgYXR0cmlidXRlIGRhdGEgaW4gdGhpcyBhYmJyZXZpYXRpb24uCisgICAgLy8vIFRoZSByZXR1cm5lZCBzaXplIGRvZXMgbm90IGluY2x1ZGUgYnl0ZXMgZm9yIHRoZSAgVUxFQjEyOCBhYmJyZXZpYXRpb24KKyAgICAvLy8gY29kZQorICAgIHNpemVfdCBnZXRCeXRlU2l6ZShjb25zdCBEV0FSRlVuaXQgJlUpIGNvbnN0OworICB9OworCisgIHVpbnQzMl90IENvZGU7CisgIGR3YXJmOjpUYWcgVGFnOworICB1aW50OF90IENvZGVCeXRlU2l6ZTsKKyAgYm9vbCBIYXNDaGlsZHJlbjsKKyAgQXR0cmlidXRlU3BlY1ZlY3RvciBBdHRyaWJ1dGVTcGVjczsKKyAgLy8vIElmIHRoaXMgYWJicmV2aWF0aW9uIGhhcyBhIGZpeGVkIGJ5dGUgc2l6ZSB0aGVuIEZpeGVkQXR0cmlidXRlU2l6ZSBtZW1iZXIKKyAgLy8vIHZhcmlhYmxlIGJlbG93IHdpbGwgaGF2ZSBhIHZhbHVlLgorICBPcHRpb25hbDxGaXhlZFNpemVJbmZvPiBGaXhlZEF0dHJpYnV0ZVNpemU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fRFdBUkZBQkJSRVZJQVRJT05ERUNMQVJBVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkFjY2VsZXJhdG9yVGFibGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGQWNjZWxlcmF0b3JUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3ZjExY2EKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkFjY2VsZXJhdG9yVGFibGUuaApAQCAtMCwwICsxLDUxMCBAQAorLy89PT0tIERXQVJGQWNjZWxlcmF0b3JUYWJsZS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRkFDQ0VMRVJBVE9SVEFCTEVfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRkFDQ0VMRVJBVE9SVEFCTEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEYXRhRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZGb3JtVmFsdWUuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBTY29wZWRQcmludGVyOworCisvLy8gVGhlIGFjY2VsZXJhdG9yIHRhYmxlcyBhcmUgZGVzaWduZWQgdG8gYWxsb3cgZWZmaWNpZW50IHJhbmRvbSBhY2Nlc3MKKy8vLyAodXNpbmcgYSBzeW1ib2wgbmFtZSBhcyBhIGtleSkgaW50byBkZWJ1ZyBpbmZvIGJ5IHByb3ZpZGluZyBhbiBpbmRleCBvZiB0aGUKKy8vLyBkZWJ1ZyBpbmZvIERJRXMuIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgY29tbW9uIGZ1bmN0aW9uYWxpdHkgb2YgQXBwbGUgYW5kCisvLy8gRFdBUkYgNSBhY2NlbGVyYXRvciB0YWJsZXMuCisvLy8gVE9ETzogR2VuZXJhbGl6ZSB0aGUgcmVzdCBvZiB0aGUgQXBwbGVBY2NlbGVyYXRvclRhYmxlIGludGVyZmFjZSBhbmQgbW92ZSBpdAorLy8vIHRvIHRoaXMgY2xhc3MuCitjbGFzcyBEV0FSRkFjY2VsZXJhdG9yVGFibGUgeworcHJvdGVjdGVkOgorICBEV0FSRkRhdGFFeHRyYWN0b3IgQWNjZWxTZWN0aW9uOworICBEYXRhRXh0cmFjdG9yIFN0cmluZ1NlY3Rpb247CisKK3B1YmxpYzoKKyAgLy8vIEFuIGFic3RyYWN0IGNsYXNzIHJlcHJlc2VudGluZyBhIHNpbmdsZSBlbnRyeSBpbiB0aGUgYWNjZWxlcmF0b3IgdGFibGVzLgorICBjbGFzcyBFbnRyeSB7CisgIHByb3RlY3RlZDoKKyAgICBTbWFsbFZlY3RvcjxEV0FSRkZvcm1WYWx1ZSwgMz4gVmFsdWVzOworCisgICAgRW50cnkoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBNYWtlIHRoZXNlIHByb3RlY3RlZCBzbyBvbmx5IChmaW5hbCkgc3ViY2xhc3NlcyBjYW4gYmUgY29waWVkIGFyb3VuZC4KKyAgICBFbnRyeShjb25zdCBFbnRyeSAmKSA9IGRlZmF1bHQ7CisgICAgRW50cnkoRW50cnkgJiYpID0gZGVmYXVsdDsKKyAgICBFbnRyeSAmb3BlcmF0b3I9KGNvbnN0IEVudHJ5ICYpID0gZGVmYXVsdDsKKyAgICBFbnRyeSAmb3BlcmF0b3I9KEVudHJ5ICYmKSA9IGRlZmF1bHQ7CisgICAgfkVudHJ5KCkgPSBkZWZhdWx0OworCisKKyAgcHVibGljOgorICAgIC8vLyBSZXR1cm5zIHRoZSBPZmZzZXQgb2YgdGhlIENvbXBpbGF0aW9uIFVuaXQgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAvLy8gQWNjZWxlcmF0b3IgRW50cnkgb3IgTm9uZSBpZiB0aGUgQ29tcGlsYXRpb24gVW5pdCBvZmZzZXQgaXMgbm90IHJlY29yZGVkCisgICAgLy8vIGluIHRoaXMgQWNjZWxlcmF0b3IgRW50cnkuCisgICAgdmlydHVhbCBPcHRpb25hbDx1aW50NjRfdD4gZ2V0Q1VPZmZzZXQoKSBjb25zdCA9IDA7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgU2VjdGlvbiBPZmZzZXQgb2YgdGhlIERlYnVnIEluZm8gRW50cnkgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgICAvLy8gQWNjZWxlcmF0b3IgRW50cnkgb3IgTm9uZSBpZiB0aGUgRElFIG9mZnNldCBpcyBub3QgcmVjb3JkZWQgaW4gdGhpcworICAgIC8vLyBBY2NlbGVyYXRvciBFbnRyeS4gVGhlIHJldHVybmVkIG9mZnNldCBpcyByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlCisgICAgLy8vIFNlY3Rpb24gY29udGFpbmluZyB0aGUgRElFLgorICAgIHZpcnR1YWwgT3B0aW9uYWw8dWludDY0X3Q+IGdldERJRVNlY3Rpb25PZmZzZXQoKSBjb25zdCA9IDA7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgVGFnIG9mIHRoZSBEZWJ1ZyBJbmZvIEVudHJ5IGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgICAgLy8vIEFjY2VsZXJhdG9yIEVudHJ5IG9yIE5vbmUgaWYgdGhlIFRhZyBpcyBub3QgcmVjb3JkZWQgaW4gdGhpcworICAgIC8vLyBBY2NlbGVyYXRvciBFbnRyeS4KKyAgICB2aXJ0dWFsIE9wdGlvbmFsPGR3YXJmOjpUYWc+IGdldFRhZygpIGNvbnN0ID0gMDsKKworICAgIC8vLyBSZXR1cm5zIHRoZSByYXcgdmFsdWVzIG9mIGZpZWxkcyBpbiB0aGUgQWNjZWxlcmF0b3IgRW50cnkuIEluIGdlbmVyYWwsCisgICAgLy8vIHRoZXNlIGNhbiBvbmx5IGJlIGludGVycHJldGVkIHdpdGggdGhlIGhlbHAgb2YgdGhlIG1ldGFkYXRhIGluIHRoZQorICAgIC8vLyBvd25pbmcgQWNjZWxlcmF0b3IgVGFibGUuCisgICAgQXJyYXlSZWY8RFdBUkZGb3JtVmFsdWU+IGdldFZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIFZhbHVlczsgfQorICB9OworCisgIERXQVJGQWNjZWxlcmF0b3JUYWJsZShjb25zdCBEV0FSRkRhdGFFeHRyYWN0b3IgJkFjY2VsU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIERhdGFFeHRyYWN0b3IgU3RyaW5nU2VjdGlvbikKKyAgICAgIDogQWNjZWxTZWN0aW9uKEFjY2VsU2VjdGlvbiksIFN0cmluZ1NlY3Rpb24oU3RyaW5nU2VjdGlvbikge30KKyAgdmlydHVhbCB+RFdBUkZBY2NlbGVyYXRvclRhYmxlKCk7CisKKyAgdmlydHVhbCBsbHZtOjpFcnJvciBleHRyYWN0KCkgPSAwOworICB2aXJ0dWFsIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0ID0gMDsKKworICBEV0FSRkFjY2VsZXJhdG9yVGFibGUoY29uc3QgRFdBUkZBY2NlbGVyYXRvclRhYmxlICYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBEV0FSRkFjY2VsZXJhdG9yVGFibGUgJikgPSBkZWxldGU7Cit9OworCisvLy8gVGhpcyBpbXBsZW1lbnRzIHRoZSBBcHBsZSBhY2NlbGVyYXRvciB0YWJsZSBmb3JtYXQsIGEgcHJlY3Vyc29yIG9mIHRoZQorLy8vIERXQVJGIDUgYWNjZWxlcmF0b3IgdGFibGUgZm9ybWF0LgorY2xhc3MgQXBwbGVBY2NlbGVyYXRvclRhYmxlIDogcHVibGljIERXQVJGQWNjZWxlcmF0b3JUYWJsZSB7CisgIHN0cnVjdCBIZWFkZXIgeworICAgIHVpbnQzMl90IE1hZ2ljOworICAgIHVpbnQxNl90IFZlcnNpb247CisgICAgdWludDE2X3QgSGFzaEZ1bmN0aW9uOworICAgIHVpbnQzMl90IEJ1Y2tldENvdW50OworICAgIHVpbnQzMl90IEhhc2hDb3VudDsKKyAgICB1aW50MzJfdCBIZWFkZXJEYXRhTGVuZ3RoOworCisgICAgdm9pZCBkdW1wKFNjb3BlZFByaW50ZXIgJlcpIGNvbnN0OworICB9OworCisgIHN0cnVjdCBIZWFkZXJEYXRhIHsKKyAgICB1c2luZyBBdG9tVHlwZSA9IHVpbnQxNl90OworICAgIHVzaW5nIEZvcm0gPSBkd2FyZjo6Rm9ybTsKKworICAgIHVpbnQzMl90IERJRU9mZnNldEJhc2U7CisgICAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPEF0b21UeXBlLCBGb3JtPiwgMz4gQXRvbXM7CisKKyAgICBPcHRpb25hbDx1aW50NjRfdD4gZXh0cmFjdE9mZnNldChPcHRpb25hbDxEV0FSRkZvcm1WYWx1ZT4gVmFsdWUpIGNvbnN0OworICB9OworCisgIHN0cnVjdCBIZWFkZXIgSGRyOworICBzdHJ1Y3QgSGVhZGVyRGF0YSBIZHJEYXRhOworICBib29sIElzVmFsaWQgPSBmYWxzZTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHdlIHNob3VsZCBjb250aW51ZSBzY2FubmluZyBmb3IgZW50cmllcyBvciBmYWxzZSBpZiB3ZSd2ZQorICAvLy8gcmVhY2hlZCB0aGUgbGFzdCAoc2VudGluZWwpIGVudHJ5IG9mIGVuY291bnRlcmVkIGEgcGFyc2luZyBlcnJvci4KKyAgYm9vbCBkdW1wTmFtZShTY29wZWRQcmludGVyICZXLCBTbWFsbFZlY3RvckltcGw8RFdBUkZGb3JtVmFsdWU+ICZBdG9tRm9ybXMsCisgICAgICAgICAgICAgICAgdWludDMyX3QgKkRhdGFPZmZzZXQpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBBcHBsZS1zcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBhbiBBY2NlbGVyYXRvciBFbnRyeS4KKyAgY2xhc3MgRW50cnkgZmluYWwgOiBwdWJsaWMgRFdBUkZBY2NlbGVyYXRvclRhYmxlOjpFbnRyeSB7CisgICAgY29uc3QgSGVhZGVyRGF0YSAqSGRyRGF0YSA9IG51bGxwdHI7CisKKyAgICBFbnRyeShjb25zdCBIZWFkZXJEYXRhICZEYXRhKTsKKyAgICBFbnRyeSgpID0gZGVmYXVsdDsKKworICAgIHZvaWQgZXh0cmFjdChjb25zdCBBcHBsZUFjY2VsZXJhdG9yVGFibGUgJkFjY2VsVGFibGUsIHVpbnQzMl90ICpPZmZzZXQpOworCisgIHB1YmxpYzoKKyAgICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0Q1VPZmZzZXQoKSBjb25zdCBvdmVycmlkZTsKKyAgICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0RElFU2VjdGlvbk9mZnNldCgpIGNvbnN0IG92ZXJyaWRlOworICAgIE9wdGlvbmFsPGR3YXJmOjpUYWc+IGdldFRhZygpIGNvbnN0IG92ZXJyaWRlOworCisgICAgLy8vIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBBdG9tIGluIHRoaXMgQWNjZWxlcmF0b3IgRW50cnksIGlmIHRoZSBFbnRyeQorICAgIC8vLyBjb250YWlucyBzdWNoIEF0b20uCisgICAgT3B0aW9uYWw8RFdBUkZGb3JtVmFsdWU+IGxvb2t1cChIZWFkZXJEYXRhOjpBdG9tVHlwZSBBdG9tKSBjb25zdDsKKworICAgIGZyaWVuZCBjbGFzcyBBcHBsZUFjY2VsZXJhdG9yVGFibGU7CisgICAgZnJpZW5kIGNsYXNzIFZhbHVlSXRlcmF0b3I7CisgIH07CisKKyAgY2xhc3MgVmFsdWVJdGVyYXRvciA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnLCBFbnRyeT4geworICAgIGNvbnN0IEFwcGxlQWNjZWxlcmF0b3JUYWJsZSAqQWNjZWxUYWJsZSA9IG51bGxwdHI7CisgICAgRW50cnkgQ3VycmVudDsgICAgICAgICAgIC8vLzwgVGhlIGN1cnJlbnQgZW50cnkuCisgICAgdW5zaWduZWQgRGF0YU9mZnNldCA9IDA7IC8vLzwgT2Zmc2V0IGludG8gdGhlIHNlY3Rpb24uCisgICAgdW5zaWduZWQgRGF0YSA9IDA7IC8vLzwgQ3VycmVudCBkYXRhIGVudHJ5LgorICAgIHVuc2lnbmVkIE51bURhdGEgPSAwOyAvLy88IE51bWJlciBvZiBkYXRhIGVudHJpZXMuCisKKyAgICAvLy8gQWR2YW5jZSB0aGUgaXRlcmF0b3IuCisgICAgdm9pZCBOZXh0KCk7CisgIHB1YmxpYzoKKyAgICAvLy8gQ29uc3RydWN0IGEgbmV3IGl0ZXJhdG9yIGZvciB0aGUgZW50cmllcyBhdCBccCBEYXRhT2Zmc2V0LgorICAgIFZhbHVlSXRlcmF0b3IoY29uc3QgQXBwbGVBY2NlbGVyYXRvclRhYmxlICZBY2NlbFRhYmxlLCB1bnNpZ25lZCBEYXRhT2Zmc2V0KTsKKyAgICAvLy8gRW5kIG1hcmtlci4KKyAgICBWYWx1ZUl0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgICAgY29uc3QgRW50cnkgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIEN1cnJlbnQ7IH0KKyAgICBWYWx1ZUl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeyBOZXh0KCk7IHJldHVybiAqdGhpczsgfQorICAgIFZhbHVlSXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsKKyAgICAgIFZhbHVlSXRlcmF0b3IgSSA9ICp0aGlzOworICAgICAgTmV4dCgpOworICAgICAgcmV0dXJuIEk7CisgICAgfQorICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgVmFsdWVJdGVyYXRvciAmQSwgY29uc3QgVmFsdWVJdGVyYXRvciAmQikgeworICAgICAgcmV0dXJuIEEuTnVtRGF0YSA9PSBCLk51bURhdGEgJiYgQS5EYXRhT2Zmc2V0ID09IEIuRGF0YU9mZnNldDsKKyAgICB9CisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShjb25zdCBWYWx1ZUl0ZXJhdG9yICZBLCBjb25zdCBWYWx1ZUl0ZXJhdG9yICZCKSB7CisgICAgICByZXR1cm4gIShBID09IEIpOworICAgIH0KKyAgfTsKKworICBBcHBsZUFjY2VsZXJhdG9yVGFibGUoY29uc3QgRFdBUkZEYXRhRXh0cmFjdG9yICZBY2NlbFNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBEYXRhRXh0cmFjdG9yIFN0cmluZ1NlY3Rpb24pCisgICAgICA6IERXQVJGQWNjZWxlcmF0b3JUYWJsZShBY2NlbFNlY3Rpb24sIFN0cmluZ1NlY3Rpb24pIHt9CisKKyAgbGx2bTo6RXJyb3IgZXh0cmFjdCgpIG92ZXJyaWRlOworICB1aW50MzJfdCBnZXROdW1CdWNrZXRzKCk7CisgIHVpbnQzMl90IGdldE51bUhhc2hlcygpOworICB1aW50MzJfdCBnZXRTaXplSGRyKCk7CisgIHVpbnQzMl90IGdldEhlYWRlckRhdGFMZW5ndGgoKTsKKworICAvLy8gUmV0dXJuIHRoZSBBdG9tIGRlc2NyaXB0aW9uLCB3aGljaCBjYW4gYmUgdXNlZCB0byBpbnRlcnByZXQgdGhlIHJhdyB2YWx1ZXMKKyAgLy8vIG9mIHRoZSBBY2NlbGVyYXRvciBFbnRyaWVzIGluIHRoaXMgdGFibGUuCisgIEFycmF5UmVmPHN0ZDo6cGFpcjxIZWFkZXJEYXRhOjpBdG9tVHlwZSwgSGVhZGVyRGF0YTo6Rm9ybT4+IGdldEF0b21zRGVzYygpOworICBib29sIHZhbGlkYXRlRm9ybXMoKTsKKworICAvLy8gUmV0dXJuIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gdGhlIERXQVJGIERJRSB3ZSdyZSBsb29raW5nIGZvciB3aGVuCisgIC8vLyBwZXJmb3JtaW5nIGEgbG9va3VwIGJ5IG5hbWUuCisgIC8vLworICAvLy8gXHBhcmFtIEhhc2hEYXRhT2Zmc2V0IGFuIG9mZnNldCBpbnRvIHRoZSBoYXNoIGRhdGEgdGFibGUKKyAgLy8vIFxyZXR1cm5zIDxEaWVPZmZzZXQsIERpZVRhZz4KKyAgLy8vIERpZU9mZnNldCBpcyB0aGUgb2Zmc2V0IGludG8gdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24gZm9yIHRoZSBESUUKKyAgLy8vIHJlbGF0ZWQgdG8gdGhlIGlucHV0IGhhc2ggZGF0YSBvZmZzZXQuCisgIC8vLyBEaWVUYWcgaXMgdGhlIHRhZyBvZiB0aGUgRElFCisgIHN0ZDo6cGFpcjx1aW50MzJfdCwgZHdhcmY6OlRhZz4gcmVhZEF0b21zKHVpbnQzMl90ICZIYXNoRGF0YU9mZnNldCk7CisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vLyBMb29rIHVwIGFsbCBlbnRyaWVzIGluIHRoZSBhY2NlbGVyYXRvciB0YWJsZSBtYXRjaGluZyBcYyBLZXkuCisgIGl0ZXJhdG9yX3JhbmdlPFZhbHVlSXRlcmF0b3I+IGVxdWFsX3JhbmdlKFN0cmluZ1JlZiBLZXkpIGNvbnN0OworfTsKKworLy8vIC5kZWJ1Z19uYW1lcyBzZWN0aW9uIGNvbnNpc3RzIG9mIG9uZSBvciBtb3JlIHVuaXRzLiBFYWNoIHVuaXQgc3RhcnRzIHdpdGggYQorLy8vIGhlYWRlciwgd2hpY2ggaXMgZm9sbG93ZWQgYnkgYSBsaXN0IG9mIGNvbXBpbGF0aW9uIHVuaXRzLCBsb2NhbCBhbmQgZm9yZWlnbgorLy8vIHR5cGUgdW5pdHMuCisvLy8KKy8vLyBUaGVzZSBtYXkgYmUgZm9sbG93ZWQgYnkgYW4gKG9wdGlvbmFsKSBoYXNoIGxvb2t1cCB0YWJsZSwgd2hpY2ggY29uc2lzdHMgb2YKKy8vLyBhbiBhcnJheSBvZiBidWNrZXRzIGFuZCBoYXNoZXMgc2ltaWxhciB0byB0aGUgYXBwbGUgdGFibGVzIGFib3ZlLiBUaGUgb25seQorLy8vIGRpZmZlcmVuY2UgaXMgdGhhdCB0aGUgaGFzaGVzIGFycmF5IGlzIDEtYmFzZWQsIGFuZCBjb25zZXF1ZW50bHkgYW4gZW1wdHkKKy8vLyBidWNrZXQgaXMgZGVub3RlZCBieSAwIGFuZCBub3QgVUlOVDMyX01BWC4KKy8vLworLy8vIE5leHQgaXMgdGhlIG5hbWUgdGFibGUsIHdoaWNoIGNvbnNpc3RzIG9mIGFuIGFycmF5IG9mIG5hbWVzIGFuZCBhcnJheSBvZgorLy8vIGVudHJ5IG9mZnNldHMuIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIGFwcGxlIHRhYmxlcywgd2hpY2ggc3RvcmUgbmFtZXMKKy8vLyBuZXh0IHRvIHRoZSBhY3R1YWwgZW50cmllcy4KKy8vLworLy8vIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGVudHJpZXMgaXMgZGVzY3JpYmVkIGJ5IGFuIGFiYnJldmlhdGlvbnMgdGFibGUsIHdoaWNoCisvLy8gY29tZXMgYWZ0ZXIgdGhlIG5hbWUgdGFibGUuIFVubGlrZSB0aGUgYXBwbGUgdGFibGVzLCB3aGljaCBoYXZlIGEgdW5pZm9ybQorLy8vIGVudHJ5IHN0cnVjdHVyZSBkZXNjcmliZWQgaW4gdGhlIGhlYWRlciwgZWFjaCAuZGVidWdfbmFtZXMgZW50cnkgbWF5IGhhdmUKKy8vLyBkaWZmZXJlbnQgaW5kZXggYXR0cmlidXRlcyAoRFdfSURYXz8/PykgYXR0YWNoZWQgdG8gaXQuCisvLy8KKy8vLyBUaGUgbGFzdCBzZWdtZW50IGNvbnNpc3RzIG9mIGEgbGlzdCBvZiBlbnRyaWVzLCB3aGljaCBpcyBhIDAtdGVybWluYXRlZCBsaXN0CisvLy8gcmVmZXJlbmNlZCBieSB0aGUgbmFtZSB0YWJsZSBhbmQgaW50ZXJwcmV0ZWQgd2l0aCB0aGUgaGVscCBvZiB0aGUKKy8vLyBhYmJyZXZpYXRpb24gdGFibGUuCitjbGFzcyBEV0FSRkRlYnVnTmFtZXMgOiBwdWJsaWMgRFdBUkZBY2NlbGVyYXRvclRhYmxlIHsKKyAgLy8vIFRoZSBmaXhlZC1zaXplIHBhcnQgb2YgYSBEd2FyZiA1IE5hbWUgSW5kZXggaGVhZGVyCisgIHN0cnVjdCBIZWFkZXJQT0QgeworICAgIHVpbnQzMl90IFVuaXRMZW5ndGg7CisgICAgdWludDE2X3QgVmVyc2lvbjsKKyAgICB1aW50MTZfdCBQYWRkaW5nOworICAgIHVpbnQzMl90IENvbXBVbml0Q291bnQ7CisgICAgdWludDMyX3QgTG9jYWxUeXBlVW5pdENvdW50OworICAgIHVpbnQzMl90IEZvcmVpZ25UeXBlVW5pdENvdW50OworICAgIHVpbnQzMl90IEJ1Y2tldENvdW50OworICAgIHVpbnQzMl90IE5hbWVDb3VudDsKKyAgICB1aW50MzJfdCBBYmJyZXZUYWJsZVNpemU7CisgICAgdWludDMyX3QgQXVnbWVudGF0aW9uU3RyaW5nU2l6ZTsKKyAgfTsKKworcHVibGljOgorICBjbGFzcyBOYW1lSW5kZXg7CisgIGNsYXNzIFZhbHVlSXRlcmF0b3I7CisKKyAgLy8vIER3YXJmIDUgTmFtZSBJbmRleCBoZWFkZXIuCisgIHN0cnVjdCBIZWFkZXIgOiBwdWJsaWMgSGVhZGVyUE9EIHsKKyAgICBTbWFsbFN0cmluZzw4PiBBdWdtZW50YXRpb25TdHJpbmc7CisKKyAgICBFcnJvciBleHRyYWN0KGNvbnN0IERXQVJGRGF0YUV4dHJhY3RvciAmQVMsIHVpbnQzMl90ICpPZmZzZXQpOworICAgIHZvaWQgZHVtcChTY29wZWRQcmludGVyICZXKSBjb25zdDsKKyAgfTsKKworICAvLy8gSW5kZXggYXR0cmlidXRlIGFuZCBpdHMgZW5jb2RpbmcuCisgIHN0cnVjdCBBdHRyaWJ1dGVFbmNvZGluZyB7CisgICAgZHdhcmY6OkluZGV4IEluZGV4OworICAgIGR3YXJmOjpGb3JtIEZvcm07CisKKyAgICBjb25zdGV4cHIgQXR0cmlidXRlRW5jb2RpbmcoZHdhcmY6OkluZGV4IEluZGV4LCBkd2FyZjo6Rm9ybSBGb3JtKQorICAgICAgICA6IEluZGV4KEluZGV4KSwgRm9ybShGb3JtKSB7fQorCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBdHRyaWJ1dGVFbmNvZGluZyAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0cmlidXRlRW5jb2RpbmcgJlJIUykgeworICAgICAgcmV0dXJuIExIUy5JbmRleCA9PSBSSFMuSW5kZXggJiYgTEhTLkZvcm0gPT0gUkhTLkZvcm07CisgICAgfQorICB9OworCisgIC8vLyBBYmJyZXZpYXRpb24gZGVzY3JpYmluZyB0aGUgZW5jb2Rpbmcgb2YgTmFtZSBJbmRleCBlbnRyaWVzLgorICBzdHJ1Y3QgQWJicmV2IHsKKyAgICB1aW50MzJfdCBDb2RlOyAgLy8vPCBBYmJyZXZpYXRpb24gY29kZQorICAgIGR3YXJmOjpUYWcgVGFnOyAvLy88IER3YXJmIFRhZyBvZiB0aGUgZGVzY3JpYmVkIGVudGl0eS4KKyAgICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGVFbmNvZGluZz4gQXR0cmlidXRlczsgLy8vPCBMaXN0IG9mIGluZGV4IGF0dHJpYnV0ZXMuCisKKyAgICBBYmJyZXYodWludDMyX3QgQ29kZSwgZHdhcmY6OlRhZyBUYWcsCisgICAgICAgICAgIHN0ZDo6dmVjdG9yPEF0dHJpYnV0ZUVuY29kaW5nPiBBdHRyaWJ1dGVzKQorICAgICAgICA6IENvZGUoQ29kZSksIFRhZyhUYWcpLCBBdHRyaWJ1dGVzKHN0ZDo6bW92ZShBdHRyaWJ1dGVzKSkge30KKworICAgIHZvaWQgZHVtcChTY29wZWRQcmludGVyICZXKSBjb25zdDsKKyAgfTsKKworICAvLy8gRFdBUkYgdjUtc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gb2YgYW4gQWNjZWxlcmF0b3IgRW50cnkuCisgIGNsYXNzIEVudHJ5IGZpbmFsIDogcHVibGljIERXQVJGQWNjZWxlcmF0b3JUYWJsZTo6RW50cnkgeworICAgIGNvbnN0IE5hbWVJbmRleCAqTmFtZUlkeDsKKyAgICBjb25zdCBBYmJyZXYgKkFiYnI7CisKKyAgICBFbnRyeShjb25zdCBOYW1lSW5kZXggJk5hbWVJZHgsIGNvbnN0IEFiYnJldiAmQWJicik7CisKKyAgICAvLy8gUmV0dXJucyB0aGUgSW5kZXggaW50byB0aGUgQ29tcGlsYXRpb24gVW5pdCBsaXN0IG9mIHRoZSBvd25pbmcgTmFtZQorICAgIC8vLyBJbmRleCBvciBOb25lIGlmIHRoaXMgQWNjZWxlcmF0b3IgRW50cnkgZG9lcyBub3QgaGF2ZSBhbiBhc3NvY2lhdGVkCisgICAgLy8vIENvbXBpbGF0aW9uIFVuaXQuIEl0IGlzIHVwIHRvIHRoZSB1c2VyIHRvIHZlcmlmeSB0aGF0IHRoZSByZXR1cm5lZCBJbmRleAorICAgIC8vLyBpcyB2YWxpZCBpbiB0aGUgb3duaW5nIE5hbWVJbmRleCAob3IgdXNlIGdldENVT2Zmc2V0KCksIHdoaWNoIHdpbGwKKyAgICAvLy8gaGFuZGxlIHRoYXQgY2hlY2sgaXRzZWxmKS4gTm90ZSB0aGF0IGVudHJpZXMgaW4gTmFtZUluZGV4ZXMgd2hpY2ggaW5kZXgKKyAgICAvLy8ganVzdCBhIHNpbmdsZSBDb21waWxhdGlvbiBVbml0IGFyZSBpbXBsaWNpdGx5IGFzc29jaWF0ZWQgd2l0aCB0aGF0IHVuaXQsCisgICAgLy8vIHNvIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gMCBldmVuIHdpdGhvdXQgYW4gZXhwbGljaXQKKyAgICAvLy8gRFdfSURYX2NvbXBpbGVfdW5pdCBhdHRyaWJ1dGUuCisgICAgT3B0aW9uYWw8dWludDY0X3Q+IGdldENVSW5kZXgoKSBjb25zdDsKKworICBwdWJsaWM6CisgICAgT3B0aW9uYWw8dWludDY0X3Q+IGdldENVT2Zmc2V0KCkgY29uc3Qgb3ZlcnJpZGU7CisgICAgT3B0aW9uYWw8dWludDY0X3Q+IGdldERJRVNlY3Rpb25PZmZzZXQoKSBjb25zdCBvdmVycmlkZTsKKyAgICBPcHRpb25hbDxkd2FyZjo6VGFnPiBnZXRUYWcoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0YWcoKTsgfQorCisgICAgLy8vIC5kZWJ1Z19uYW1lcy1zcGVjaWZpYyBnZXR0ZXIsIHdoaWNoIGFsd2F5cyBzdWNjZWVkcyAoRFdBUkYgdjUgaW5kZXgKKyAgICAvLy8gZW50cmllcyBhbHdheXMgaGF2ZSBhIHRhZykuCisgICAgZHdhcmY6OlRhZyB0YWcoKSBjb25zdCB7IHJldHVybiBBYmJyLT5UYWc7IH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSBPZmZzZXQgb2YgdGhlIERJRSB3aXRoaW4gdGhlIGNvbnRhaW5pbmcgQ1Ugb3IgVFUuCisgICAgT3B0aW9uYWw8dWludDY0X3Q+IGdldERJRVVuaXRPZmZzZXQoKSBjb25zdDsKKworICAgIC8vLyBSZXR1cm4gdGhlIEFiYnJldmlhdGlvbiB0aGF0IGNhbiBiZSB1c2VkIHRvIGludGVycHJldCB0aGUgcmF3IHZhbHVlcyBvZgorICAgIC8vLyB0aGlzIEFjY2VsZXJhdG9yIEVudHJ5LgorICAgIGNvbnN0IEFiYnJldiAmZ2V0QWJicmV2KCkgY29uc3QgeyByZXR1cm4gKkFiYnI7IH0KKworICAgIC8vLyBSZXR1cm5zIHRoZSB2YWx1ZSBvZiB0aGUgSW5kZXggQXR0cmlidXRlIGluIHRoaXMgQWNjZWxlcmF0b3IgRW50cnksIGlmCisgICAgLy8vIHRoZSBFbnRyeSBjb250YWlucyBzdWNoIEF0dHJpYnV0ZS4KKyAgICBPcHRpb25hbDxEV0FSRkZvcm1WYWx1ZT4gbG9va3VwKGR3YXJmOjpJbmRleCBJbmRleCkgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAoU2NvcGVkUHJpbnRlciAmVykgY29uc3Q7CisKKyAgICBmcmllbmQgY2xhc3MgTmFtZUluZGV4OworICAgIGZyaWVuZCBjbGFzcyBWYWx1ZUl0ZXJhdG9yOworICB9OworCitwcml2YXRlOgorICAvLy8gRXJyb3IgcmV0dXJuZWQgYnkgTmFtZUluZGV4OjpnZXRFbnRyeSB0byByZXBvcnQgaXQgaGFzIHJlYWNoZWQgdGhlIGVuZCBvZgorICAvLy8gdGhlIGVudHJ5IGxpc3QuCisgIGNsYXNzIFNlbnRpbmVsRXJyb3IgOiBwdWJsaWMgRXJyb3JJbmZvPFNlbnRpbmVsRXJyb3I+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjaGFyIElEOworCisgICAgdm9pZCBsb2cocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7IE9TIDw8ICJTZW50aW5lbCI7IH0KKyAgICBzdGQ6OmVycm9yX2NvZGUgY29udmVydFRvRXJyb3JDb2RlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIH07CisKKyAgLy8vIERlbnNlTWFwSW5mbyBmb3Igc3RydWN0IEFiYnJldi4KKyAgc3RydWN0IEFiYnJldk1hcEluZm8geworICAgIHN0YXRpYyBBYmJyZXYgZ2V0RW1wdHlLZXkoKTsKKyAgICBzdGF0aWMgQWJicmV2IGdldFRvbWJzdG9uZUtleSgpOworICAgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUodWludDMyX3QgQ29kZSkgeworICAgICAgcmV0dXJuIERlbnNlTWFwSW5mbzx1aW50MzJfdD46OmdldEhhc2hWYWx1ZShDb2RlKTsKKyAgICB9CisgICAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBBYmJyZXYgJkFiYnIpIHsKKyAgICAgIHJldHVybiBnZXRIYXNoVmFsdWUoQWJici5Db2RlKTsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgaXNFcXVhbCh1aW50MzJfdCBMSFMsIGNvbnN0IEFiYnJldiAmUkhTKSB7CisgICAgICByZXR1cm4gTEhTID09IFJIUy5Db2RlOworICAgIH0KKyAgICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IEFiYnJldiAmTEhTLCBjb25zdCBBYmJyZXYgJlJIUykgeworICAgICAgcmV0dXJuIExIUy5Db2RlID09IFJIUy5Db2RlOworICAgIH0KKyAgfTsKKworcHVibGljOgorICAvLy8gQSBzaW5nbGUgZW50cnkgaW4gdGhlIE5hbWUgVGFibGUgKER3YXJmIDUgc2VjdC4gNi4xLjEuNC42KSBvZiB0aGUgTmFtZQorICAvLy8gSW5kZXguCisgIHN0cnVjdCBOYW1lVGFibGVFbnRyeSB7CisgICAgdWludDMyX3QgU3RyaW5nT2Zmc2V0OyAvLy88IE9mZnNldCBvZiB0aGUgbmFtZSBvZiB0aGUgZGVzY3JpYmVkIGVudGl0aWVzLgorICAgIHVpbnQzMl90IEVudHJ5T2Zmc2V0OyAgLy8vPCBPZmZzZXQgb2YgdGhlIGZpcnN0IEVudHJ5IGluIHRoZSBsaXN0LgorICB9OworCisgIC8vLyBSZXByZXNlbnRzIGEgc2luZ2xlIGFjY2VsZXJhdG9yIHRhYmxlIHdpdGhpbiB0aGUgRHdhcmYgNSAuZGVidWdfbmFtZXMKKyAgLy8vIHNlY3Rpb24uCisgIGNsYXNzIE5hbWVJbmRleCB7CisgICAgRGVuc2VTZXQ8QWJicmV2LCBBYmJyZXZNYXBJbmZvPiBBYmJyZXZzOworICAgIHN0cnVjdCBIZWFkZXIgSGRyOworICAgIGNvbnN0IERXQVJGRGVidWdOYW1lcyAmU2VjdGlvbjsKKworICAgIC8vIEJhc2Ugb2YgdGhlIHdob2xlIHVuaXQgYW5kIG9mIHZhcmlvdXMgaW1wb3J0YW50IHRhYmxlcywgYXMgb2Zmc2V0cyBmcm9tCisgICAgLy8gdGhlIHN0YXJ0IG9mIHRoZSBzZWN0aW9uLgorICAgIHVpbnQzMl90IEJhc2U7CisgICAgdWludDMyX3QgQ1VzQmFzZTsKKyAgICB1aW50MzJfdCBCdWNrZXRzQmFzZTsKKyAgICB1aW50MzJfdCBIYXNoZXNCYXNlOworICAgIHVpbnQzMl90IFN0cmluZ09mZnNldHNCYXNlOworICAgIHVpbnQzMl90IEVudHJ5T2Zmc2V0c0Jhc2U7CisgICAgdWludDMyX3QgRW50cmllc0Jhc2U7CisKKyAgICBFeHBlY3RlZDxFbnRyeT4gZ2V0RW50cnkodWludDMyX3QgKk9mZnNldCkgY29uc3Q7CisKKyAgICB2b2lkIGR1bXBDVXMoU2NvcGVkUHJpbnRlciAmVykgY29uc3Q7CisgICAgdm9pZCBkdW1wTG9jYWxUVXMoU2NvcGVkUHJpbnRlciAmVykgY29uc3Q7CisgICAgdm9pZCBkdW1wRm9yZWlnblRVcyhTY29wZWRQcmludGVyICZXKSBjb25zdDsKKyAgICB2b2lkIGR1bXBBYmJyZXZpYXRpb25zKFNjb3BlZFByaW50ZXIgJlcpIGNvbnN0OworICAgIGJvb2wgZHVtcEVudHJ5KFNjb3BlZFByaW50ZXIgJlcsIHVpbnQzMl90ICpPZmZzZXQpIGNvbnN0OworICAgIHZvaWQgZHVtcE5hbWUoU2NvcGVkUHJpbnRlciAmVywgdWludDMyX3QgSW5kZXgsCisgICAgICAgICAgICAgICAgICBPcHRpb25hbDx1aW50MzJfdD4gSGFzaCkgY29uc3Q7CisgICAgdm9pZCBkdW1wQnVja2V0KFNjb3BlZFByaW50ZXIgJlcsIHVpbnQzMl90IEJ1Y2tldCkgY29uc3Q7CisKKyAgICBFeHBlY3RlZDxBdHRyaWJ1dGVFbmNvZGluZz4gZXh0cmFjdEF0dHJpYnV0ZUVuY29kaW5nKHVpbnQzMl90ICpPZmZzZXQpOworCisgICAgRXhwZWN0ZWQ8c3RkOjp2ZWN0b3I8QXR0cmlidXRlRW5jb2Rpbmc+PgorICAgIGV4dHJhY3RBdHRyaWJ1dGVFbmNvZGluZ3ModWludDMyX3QgKk9mZnNldCk7CisKKyAgICBFeHBlY3RlZDxBYmJyZXY+IGV4dHJhY3RBYmJyZXYodWludDMyX3QgKk9mZnNldCk7CisKKyAgcHVibGljOgorICAgIE5hbWVJbmRleChjb25zdCBEV0FSRkRlYnVnTmFtZXMgJlNlY3Rpb24sIHVpbnQzMl90IEJhc2UpCisgICAgICAgIDogU2VjdGlvbihTZWN0aW9uKSwgQmFzZShCYXNlKSB7fQorCisgICAgLy8vIFJlYWRzIG9mZnNldCBvZiBjb21waWxhdGlvbiB1bml0IENVLiBDVSBpcyAwLWJhc2VkLgorICAgIHVpbnQzMl90IGdldENVT2Zmc2V0KHVpbnQzMl90IENVKSBjb25zdDsKKyAgICB1aW50MzJfdCBnZXRDVUNvdW50KCkgY29uc3QgeyByZXR1cm4gSGRyLkNvbXBVbml0Q291bnQ7IH0KKworICAgIC8vLyBSZWFkcyBvZmZzZXQgb2YgbG9jYWwgdHlwZSB1bml0IFRVLCBUVSBpcyAwLWJhc2VkLgorICAgIHVpbnQzMl90IGdldExvY2FsVFVPZmZzZXQodWludDMyX3QgVFUpIGNvbnN0OworICAgIHVpbnQzMl90IGdldExvY2FsVFVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIEhkci5Mb2NhbFR5cGVVbml0Q291bnQ7IH0KKworICAgIC8vLyBSZWFkcyBzaWduYXR1cmUgb2YgZm9yZWlnbiB0eXBlIHVuaXQgVFUuIFRVIGlzIDAtYmFzZWQuCisgICAgdWludDY0X3QgZ2V0Rm9yZWlnblRVU2lnbmF0dXJlKHVpbnQzMl90IFRVKSBjb25zdDsKKyAgICB1aW50MzJfdCBnZXRGb3JlaWduVFVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIEhkci5Gb3JlaWduVHlwZVVuaXRDb3VudDsgfQorCisgICAgLy8vIFJlYWRzIGFuIGVudHJ5IGluIHRoZSBCdWNrZXQgQXJyYXkgZm9yIHRoZSBnaXZlbiBCdWNrZXQuIFRoZSByZXR1cm5lZAorICAgIC8vLyB2YWx1ZSBpcyBhICgxLWJhc2VkKSBpbmRleCBpbnRvIHRoZSBOYW1lcywgU3RyaW5nT2Zmc2V0cyBhbmQKKyAgICAvLy8gRW50cnlPZmZzZXRzIGFycmF5cy4gVGhlIGlucHV0IEJ1Y2tldCBpbmRleCBpcyAwLWJhc2VkLgorICAgIHVpbnQzMl90IGdldEJ1Y2tldEFycmF5RW50cnkodWludDMyX3QgQnVja2V0KSBjb25zdDsKKyAgICB1aW50MzJfdCBnZXRCdWNrZXRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIEhkci5CdWNrZXRDb3VudDsgfQorCisgICAgLy8vIFJlYWRzIGFuIGVudHJ5IGluIHRoZSBIYXNoIEFycmF5IGZvciB0aGUgZ2l2ZW4gSW5kZXguIFRoZSBpbnB1dCBJbmRleAorICAgIC8vLyBpcyAxLWJhc2VkLgorICAgIHVpbnQzMl90IGdldEhhc2hBcnJheUVudHJ5KHVpbnQzMl90IEluZGV4KSBjb25zdDsKKworICAgIC8vLyBSZWFkcyBhbiBlbnRyeSBpbiB0aGUgTmFtZSBUYWJsZSBmb3IgdGhlIGdpdmVuIEluZGV4LiBUaGUgTmFtZSBUYWJsZQorICAgIC8vLyBjb25zaXN0cyBvZiB0d28gYXJyYXlzIC0tIFN0cmluZyBPZmZzZXRzIGFuZCBFbnRyeSBPZmZzZXRzLiBUaGUgcmV0dXJuZWQKKyAgICAvLy8gb2Zmc2V0cyBhcmUgcmVsYXRpdmUgdG8gdGhlIHN0YXJ0cyBvZiByZXNwZWN0aXZlIHNlY3Rpb25zLiBJbnB1dCBJbmRleAorICAgIC8vLyBpcyAxLWJhc2VkLgorICAgIE5hbWVUYWJsZUVudHJ5IGdldE5hbWVUYWJsZUVudHJ5KHVpbnQzMl90IEluZGV4KSBjb25zdDsKKworICAgIHVpbnQzMl90IGdldE5hbWVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIEhkci5OYW1lQ291bnQ7IH0KKworICAgIGNvbnN0IERlbnNlU2V0PEFiYnJldiwgQWJicmV2TWFwSW5mbz4gJmdldEFiYnJldnMoKSBjb25zdCB7CisgICAgICByZXR1cm4gQWJicmV2czsKKyAgICB9CisKKyAgICBsbHZtOjpFcnJvciBleHRyYWN0KCk7CisgICAgdWludDMyX3QgZ2V0VW5pdE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIEJhc2U7IH0KKyAgICB1aW50MzJfdCBnZXROZXh0VW5pdE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIEJhc2UgKyA0ICsgSGRyLlVuaXRMZW5ndGg7IH0KKyAgICB2b2lkIGR1bXAoU2NvcGVkUHJpbnRlciAmVykgY29uc3Q7CisKKyAgICBmcmllbmQgY2xhc3MgRFdBUkZEZWJ1Z05hbWVzOworICB9OworCisgIGNsYXNzIFZhbHVlSXRlcmF0b3IgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZywgRW50cnk+IHsKKworICAgIC8vLyBUaGUgTmFtZSBJbmRleCB3ZSBhcmUgY3VycmVudGx5IGl0ZXJhdGluZyB0aHJvdWdoLiBUaGUgaW1wbGVtZW50YXRpb24KKyAgICAvLy8gcmVsaWVzIG9uIHRoZSBmYWN0IHRoYXQgdGhpcyBjYW4gYWxzbyBiZSB1c2VkIGFzIGFuIGl0ZXJhdG9yIGludG8gdGhlCisgICAgLy8vICJOYW1lSW5kaWNlcyIgdmVjdG9yIGluIHRoZSBBY2NlbGVyYXRvciBzZWN0aW9uLgorICAgIGNvbnN0IE5hbWVJbmRleCAqQ3VycmVudEluZGV4ID0gbnVsbHB0cjsKKworICAgIE9wdGlvbmFsPEVudHJ5PiBDdXJyZW50RW50cnk7CisgICAgdW5zaWduZWQgRGF0YU9mZnNldCA9IDA7IC8vLzwgT2Zmc2V0IGludG8gdGhlIHNlY3Rpb24uCisgICAgc3RkOjpzdHJpbmcgS2V5OyAgICAgICAgIC8vLzwgVGhlIEtleSB3ZSBhcmUgc2VhcmNoaW5nIGZvci4KKyAgICBPcHRpb25hbDx1aW50MzJfdD4gSGFzaDsgLy8vPCBIYXNoIG9mIEtleSwgaWYgaXQgaGFzIGJlZW4gY29tcHV0ZWQuCisKKyAgICBib29sIGdldEVudHJ5QXRDdXJyZW50T2Zmc2V0KCk7CisgICAgT3B0aW9uYWw8dWludDMyX3Q+IGZpbmRFbnRyeU9mZnNldEluQ3VycmVudEluZGV4KCk7CisgICAgYm9vbCBmaW5kSW5DdXJyZW50SW5kZXgoKTsKKyAgICB2b2lkIHNlYXJjaEZyb21TdGFydE9mQ3VycmVudEluZGV4KCk7CisgICAgdm9pZCBuZXh0KCk7CisKKyAgICAvLy8gU2V0IHRoZSBpdGVyYXRvciB0byB0aGUgImVuZCIgc3RhdGUuCisgICAgdm9pZCBzZXRFbmQoKSB7ICp0aGlzID0gVmFsdWVJdGVyYXRvcigpOyB9CisKKyAgcHVibGljOgorICAgIC8vLyBDcmVhdGUgYSAiYmVnaW4iIGl0ZXJhdG9yIGZvciBsb29waW5nIG92ZXIgYWxsIGVudHJpZXMgaW4gdGhlCisgICAgLy8vIGFjY2VsZXJhdG9yIHRhYmxlIG1hdGNoaW5nIEtleS4gVGhlIGl0ZXJhdG9yIHdpbGwgcnVuIHRocm91Z2ggYWxsIE5hbWUKKyAgICAvLy8gSW5kZXhlcyBpbiB0aGUgc2VjdGlvbiBpbiBzZXF1ZW5jZS4KKyAgICBWYWx1ZUl0ZXJhdG9yKGNvbnN0IERXQVJGRGVidWdOYW1lcyAmQWNjZWxUYWJsZSwgU3RyaW5nUmVmIEtleSk7CisKKyAgICAvLy8gRW5kIG1hcmtlci4KKyAgICBWYWx1ZUl0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgICAgY29uc3QgRW50cnkgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpDdXJyZW50RW50cnk7IH0KKyAgICBWYWx1ZUl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgICAgbmV4dCgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBWYWx1ZUl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7CisgICAgICBWYWx1ZUl0ZXJhdG9yIEkgPSAqdGhpczsKKyAgICAgIG5leHQoKTsKKyAgICAgIHJldHVybiBJOworICAgIH0KKworICAgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgVmFsdWVJdGVyYXRvciAmQSwgY29uc3QgVmFsdWVJdGVyYXRvciAmQikgeworICAgICAgcmV0dXJuIEEuQ3VycmVudEluZGV4ID09IEIuQ3VycmVudEluZGV4ICYmIEEuRGF0YU9mZnNldCA9PSBCLkRhdGFPZmZzZXQ7CisgICAgfQorICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgVmFsdWVJdGVyYXRvciAmQSwgY29uc3QgVmFsdWVJdGVyYXRvciAmQikgeworICAgICAgcmV0dXJuICEoQSA9PSBCKTsKKyAgICB9CisgIH07CisKK3ByaXZhdGU6CisgIFNtYWxsVmVjdG9yPE5hbWVJbmRleCwgMD4gTmFtZUluZGljZXM7CisKK3B1YmxpYzoKKyAgRFdBUkZEZWJ1Z05hbWVzKGNvbnN0IERXQVJGRGF0YUV4dHJhY3RvciAmQWNjZWxTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgRGF0YUV4dHJhY3RvciBTdHJpbmdTZWN0aW9uKQorICAgICAgOiBEV0FSRkFjY2VsZXJhdG9yVGFibGUoQWNjZWxTZWN0aW9uLCBTdHJpbmdTZWN0aW9uKSB7fQorCisgIGxsdm06OkVycm9yIGV4dHJhY3QoKSBvdmVycmlkZTsKKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIExvb2sgdXAgYWxsIGVudHJpZXMgaW4gdGhlIGFjY2VsZXJhdG9yIHRhYmxlIG1hdGNoaW5nIFxjIEtleS4KKyAgaXRlcmF0b3JfcmFuZ2U8VmFsdWVJdGVyYXRvcj4gZXF1YWxfcmFuZ2UoU3RyaW5nUmVmIEtleSkgY29uc3Q7CisKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBTbWFsbFZlY3RvcjxOYW1lSW5kZXgsIDA+Ojpjb25zdF9pdGVyYXRvcjsKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBOYW1lSW5kaWNlcy5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIE5hbWVJbmRpY2VzLmVuZCgpOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fRFdBUkZBQ0NFTEVSQVRPUlRBQkxFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGQWRkcmVzc1JhbmdlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkFkZHJlc3NSYW5nZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVhN2RmNWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkFkZHJlc3NSYW5nZS5oCkBAIC0wLDAgKzEsNjggQEAKKy8vPT09LSBEV0FSRkFkZHJlc3NSYW5nZS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZBRERSRVNTUkFOR0VfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkFERFJFU1NSQU5HRV9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9ESUNvbnRleHQuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworc3RydWN0IERXQVJGQWRkcmVzc1JhbmdlIHsKKyAgdWludDY0X3QgTG93UEM7CisgIHVpbnQ2NF90IEhpZ2hQQzsKKyAgdWludDY0X3QgU2VjdGlvbkluZGV4OworCisgIERXQVJGQWRkcmVzc1JhbmdlKCkgPSBkZWZhdWx0OworCisgIC8vLyBVc2VkIGZvciB1bml0IHRlc3RpbmcuCisgIERXQVJGQWRkcmVzc1JhbmdlKHVpbnQ2NF90IExvd1BDLCB1aW50NjRfdCBIaWdoUEMsIHVpbnQ2NF90IFNlY3Rpb25JbmRleCA9IDApCisgICAgICA6IExvd1BDKExvd1BDKSwgSGlnaFBDKEhpZ2hQQyksIFNlY3Rpb25JbmRleChTZWN0aW9uSW5kZXgpIHt9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBMb3dQQyBpcyBzbWFsbGVyIG9yIGVxdWFsIHRvIEhpZ2hQQy4gVGhpcyBhY2NvdW50cyBmb3IKKyAgLy8vIGRlYWQtc3RyaXBwZWQgcmFuZ2VzLgorICBib29sIHZhbGlkKCkgY29uc3QgeyByZXR1cm4gTG93UEMgPD0gSGlnaFBDOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBbTG93UEMsIEhpZ2hQQykgaW50ZXJzZWN0cyB3aXRoIFtSSFMuTG93UEMsIFJIUy5IaWdoUEMpLgorICBib29sIGludGVyc2VjdHMoY29uc3QgRFdBUkZBZGRyZXNzUmFuZ2UgJlJIUykgY29uc3QgeworICAgIGFzc2VydCh2YWxpZCgpICYmIFJIUy52YWxpZCgpKTsKKyAgICAvLyBFbXB0eSByYW5nZXMgY2FuJ3QgaW50ZXJzZWN0LgorICAgIGlmIChMb3dQQyA9PSBIaWdoUEMgfHwgUkhTLkxvd1BDID09IFJIUy5IaWdoUEMpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIExvd1BDIDwgUkhTLkhpZ2hQQyAmJiBSSFMuTG93UEMgPCBIaWdoUEM7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIFtMb3dQQywgSGlnaFBDKSBmdWxseSBjb250YWlucyBbUkhTLkxvd1BDLCBSSFMuSGlnaFBDKS4KKyAgYm9vbCBjb250YWlucyhjb25zdCBEV0FSRkFkZHJlc3NSYW5nZSAmUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KHZhbGlkKCkgJiYgUkhTLnZhbGlkKCkpOworICAgIHJldHVybiBMb3dQQyA8PSBSSFMuTG93UEMgJiYgUkhTLkhpZ2hQQyA8PSBIaWdoUEM7CisgIH0KKworICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCB1aW50MzJfdCBBZGRyZXNzU2l6ZSwKKyAgICAgICAgICAgIERJRHVtcE9wdGlvbnMgRHVtcE9wdHMgPSB7fSkgY29uc3Q7Cit9OworCitzdGF0aWMgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IERXQVJGQWRkcmVzc1JhbmdlICZMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGQWRkcmVzc1JhbmdlICZSSFMpIHsKKyAgcmV0dXJuIHN0ZDo6dGllKExIUy5Mb3dQQywgTEhTLkhpZ2hQQykgPCBzdGQ6OnRpZShSSFMuTG93UEMsIFJIUy5IaWdoUEMpOworfQorCityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IERXQVJGQWRkcmVzc1JhbmdlICZSKTsKKworLy8vIERXQVJGQWRkcmVzc1Jhbmdlc1ZlY3RvciAtIHJlcHJlc2VudHMgYSBzZXQgb2YgYWJzb2x1dGUgYWRkcmVzcyByYW5nZXMuCit1c2luZyBEV0FSRkFkZHJlc3NSYW5nZXNWZWN0b3IgPSBzdGQ6OnZlY3RvcjxEV0FSRkFkZHJlc3NSYW5nZT47CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkFERFJFU1NSQU5HRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkF0dHJpYnV0ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZBdHRyaWJ1dGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDY3MmJiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZBdHRyaWJ1dGUuaApAQCAtMCwwICsxLDU2IEBACisvLz09PS0gRFdBUkZBdHRyaWJ1dGUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0RXQVJGQVRUUklCVVRFX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fRFdBUkZBVFRSSUJVVEVfSAorCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkZvcm1WYWx1ZS5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBFbmNhcHN1bGF0ZXMgYSBEV0FSRiBhdHRyaWJ1dGUgdmFsdWUgYW5kIGFsbCBvZiB0aGUgZGF0YSByZXF1aXJlZCB0bworLy8vIGRlc2NyaWJlIHRoZSBhdHRyaWJ1dGUgdmFsdWUuCisvLy8KKy8vLyBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGJlIHVzZWQgYnkgY2xpZW50cyB0aGF0IHdhbnQgdG8gaXRlcmF0ZSBhY3Jvc3MgYWxsCisvLy8gYXR0cmlidXRlcyBpbiBhIERXQVJGRGllLgorc3RydWN0IERXQVJGQXR0cmlidXRlIHsKKyAgLy8vIFRoZSBkZWJ1ZyBpbmZvL3R5cGVzIG9mZnNldCBmb3IgdGhpcyBhdHRyaWJ1dGUuCisgIHVpbnQzMl90IE9mZnNldCA9IDA7CisgIC8vLyBUaGUgZGVidWcgaW5mby90eXBlcyBzZWN0aW9uIGJ5dGUgc2l6ZSBvZiB0aGUgZGF0YSBmb3IgdGhpcyBhdHRyaWJ1dGUuCisgIHVpbnQzMl90IEJ5dGVTaXplID0gMDsKKyAgLy8vIFRoZSBhdHRyaWJ1dGUgZW51bWVyYXRpb24gb2YgdGhpcyBhdHRyaWJ1dGUuCisgIGR3YXJmOjpBdHRyaWJ1dGUgQXR0cjsKKyAgLy8vIFRoZSBmb3JtIGFuZCB2YWx1ZSBmb3IgdGhpcyBhdHRyaWJ1dGUuCisgIERXQVJGRm9ybVZhbHVlIFZhbHVlOworCisgIERXQVJGQXR0cmlidXRlKHVpbnQzMl90IE8sIGR3YXJmOjpBdHRyaWJ1dGUgQSA9IGR3YXJmOjpBdHRyaWJ1dGUoMCksCisgICAgICAgICAgICAgICAgIGR3YXJmOjpGb3JtIEYgPSBkd2FyZjo6Rm9ybSgwKSkgOiBBdHRyKEEpLCBWYWx1ZShGKSB7fQorCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gT2Zmc2V0ICE9IDAgJiYgQXR0ciAhPSBkd2FyZjo6QXR0cmlidXRlKDApOworICB9CisKKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNWYWxpZCgpOworICB9CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBPZmZzZXQgPSAwOworICAgIEJ5dGVTaXplID0gMDsKKyAgICBBdHRyID0gZHdhcmY6OkF0dHJpYnV0ZSgwKTsKKyAgICBWYWx1ZSA9IERXQVJGRm9ybVZhbHVlKCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19EV0FSRkFUVFJJQlVURV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkNvbXBpbGVVbml0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkNvbXBpbGVVbml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE4YWRmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGQ29tcGlsZVVuaXQuaApAQCAtMCwwICsxLDM5IEBACisvLz09PS0gRFdBUkZDb21waWxlVW5pdC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0RXQVJGQ09NUElMRVVOSVRfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRkNPTVBJTEVVTklUX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGVW5pdC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGVW5pdEluZGV4LmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRFdBUkZDb21waWxlVW5pdCA6IHB1YmxpYyBEV0FSRlVuaXQgeworcHVibGljOgorICBEV0FSRkNvbXBpbGVVbml0KERXQVJGQ29udGV4dCAmQ29udGV4dCwgY29uc3QgRFdBUkZTZWN0aW9uICZTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGRGVidWdBYmJyZXYgKkRBLCBjb25zdCBEV0FSRlNlY3Rpb24gKlJTLAorICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTUywgY29uc3QgRFdBUkZTZWN0aW9uICZTT1MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRFdBUkZTZWN0aW9uICpBT1MsIGNvbnN0IERXQVJGU2VjdGlvbiAmTFMsIGJvb2wgTEUsCisgICAgICAgICAgICAgICAgICAgYm9vbCBJc0RXTywgY29uc3QgRFdBUkZVbml0U2VjdGlvbkJhc2UgJlVuaXRTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGVW5pdEluZGV4OjpFbnRyeSAqRW50cnkpCisgICAgICA6IERXQVJGVW5pdChDb250ZXh0LCBTZWN0aW9uLCBEQSwgUlMsIFNTLCBTT1MsIEFPUywgTFMsIExFLCBJc0RXTywKKyAgICAgICAgICAgICAgICAgIFVuaXRTZWN0aW9uLCBFbnRyeSkge30KKworICAvLyBWVGFibGUgYW5jaG9yLgorICB+RFdBUkZDb21waWxlVW5pdCgpIG92ZXJyaWRlOworCisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MsIERJRHVtcE9wdGlvbnMgRHVtcE9wdHMpOworCisgIHN0YXRpYyBjb25zdCBEV0FSRlNlY3Rpb25LaW5kIFNlY3Rpb24gPSBEV19TRUNUX0lORk87Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fRFdBUkZDT01QSUxFVU5JVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkNvbnRleHQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGQ29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NDJjZjIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkNvbnRleHQuaApAQCAtMCwwICsxLDMyNyBAQAorLy89PT0tIERXQVJGQ29udGV4dC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09LworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGQ09OVEVYVF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGQ09OVEVYVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9NYXBWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9ESUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkFjY2VsZXJhdG9yVGFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkNvbXBpbGVVbml0LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z0FiYnJldi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdBcmFuZ2VzLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z0ZyYW1lLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z0xpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnTG9jLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z01hY3JvLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEaWUuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkdkYkluZGV4LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZPYmplY3QuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlNlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlR5cGVVbml0LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZVbml0LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZVbml0SW5kZXguaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9CaW5hcnkuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9PYmplY3RGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFFeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvSG9zdC5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ1JlZ2lzdGVySW5mbzsKK2NsYXNzIE1lbW9yeUJ1ZmZlcjsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gVXNlZCBhcyBhIHJldHVybiB2YWx1ZSBmb3IgYSBlcnJvciBjYWxsYmFjayBwYXNzZWQgdG8gRFdBUkYgY29udGV4dC4KKy8vLyBDYWxsYmFjayBzaG91bGQgcmV0dXJuIEhhbHQgaWYgY2xpZW50IGFwcGxpY2F0aW9uIHdhbnRzIHRvIHN0b3AKKy8vLyBvYmplY3QgcGFyc2luZywgb3Igc2hvdWxkIHJldHVybiBDb250aW51ZSBvdGhlcndpc2UuCitlbnVtIGNsYXNzIEVycm9yUG9saWN5IHsgSGFsdCwgQ29udGludWUgfTsKKworLy8vIERXQVJGQ29udGV4dAorLy8vIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgdGhlIHRvcCBsZXZlbCBlbnRpdHkgdGhhdCBkZWFscyB3aXRoIGR3YXJmIGRlYnVnCisvLy8gaW5mb3JtYXRpb24gcGFyc2luZy4gVGhlIGFjdHVhbCBkYXRhIGlzIHN1cHBsaWVkIHRocm91Z2ggRFdBUkZPYmouCitjbGFzcyBEV0FSRkNvbnRleHQgOiBwdWJsaWMgRElDb250ZXh0IHsKKyAgRFdBUkZVbml0U2VjdGlvbjxEV0FSRkNvbXBpbGVVbml0PiBDVXM7CisgIHN0ZDo6ZGVxdWU8RFdBUkZVbml0U2VjdGlvbjxEV0FSRlR5cGVVbml0Pj4gVFVzOworICBzdGQ6OnVuaXF1ZV9wdHI8RFdBUkZVbml0SW5kZXg+IENVSW5kZXg7CisgIHN0ZDo6dW5pcXVlX3B0cjxEV0FSRkdkYkluZGV4PiBHZGJJbmRleDsKKyAgc3RkOjp1bmlxdWVfcHRyPERXQVJGVW5pdEluZGV4PiBUVUluZGV4OworICBzdGQ6OnVuaXF1ZV9wdHI8RFdBUkZEZWJ1Z0FiYnJldj4gQWJicmV2OworICBzdGQ6OnVuaXF1ZV9wdHI8RFdBUkZEZWJ1Z0xvYz4gTG9jOworICBzdGQ6OnVuaXF1ZV9wdHI8RFdBUkZEZWJ1Z0FyYW5nZXM+IEFyYW5nZXM7CisgIHN0ZDo6dW5pcXVlX3B0cjxEV0FSRkRlYnVnTGluZT4gTGluZTsKKyAgc3RkOjp1bmlxdWVfcHRyPERXQVJGRGVidWdGcmFtZT4gRGVidWdGcmFtZTsKKyAgc3RkOjp1bmlxdWVfcHRyPERXQVJGRGVidWdGcmFtZT4gRUhGcmFtZTsKKyAgc3RkOjp1bmlxdWVfcHRyPERXQVJGRGVidWdNYWNybz4gTWFjcm87CisgIHN0ZDo6dW5pcXVlX3B0cjxEV0FSRkRlYnVnTmFtZXM+IE5hbWVzOworICBzdGQ6OnVuaXF1ZV9wdHI8QXBwbGVBY2NlbGVyYXRvclRhYmxlPiBBcHBsZU5hbWVzOworICBzdGQ6OnVuaXF1ZV9wdHI8QXBwbGVBY2NlbGVyYXRvclRhYmxlPiBBcHBsZVR5cGVzOworICBzdGQ6OnVuaXF1ZV9wdHI8QXBwbGVBY2NlbGVyYXRvclRhYmxlPiBBcHBsZU5hbWVzcGFjZXM7CisgIHN0ZDo6dW5pcXVlX3B0cjxBcHBsZUFjY2VsZXJhdG9yVGFibGU+IEFwcGxlT2JqQzsKKworICBEV0FSRlVuaXRTZWN0aW9uPERXQVJGQ29tcGlsZVVuaXQ+IERXT0NVczsKKyAgc3RkOjpkZXF1ZTxEV0FSRlVuaXRTZWN0aW9uPERXQVJGVHlwZVVuaXQ+PiBEV09UVXM7CisgIHN0ZDo6dW5pcXVlX3B0cjxEV0FSRkRlYnVnQWJicmV2PiBBYmJyZXZEV087CisgIHN0ZDo6dW5pcXVlX3B0cjxEV0FSRkRlYnVnTG9jRFdPPiBMb2NEV087CisKKyAgLy8vIFRoZSBtYXhpbXVtIERXQVJGIHZlcnNpb24gb2YgYWxsIHVuaXRzLgorICB1bnNpZ25lZCBNYXhWZXJzaW9uID0gMDsKKworICBzdHJ1Y3QgRFdPRmlsZSB7CisgICAgb2JqZWN0OjpPd25pbmdCaW5hcnk8b2JqZWN0OjpPYmplY3RGaWxlPiBGaWxlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxEV0FSRkNvbnRleHQ+IENvbnRleHQ7CisgIH07CisgIFN0cmluZ01hcDxzdGQ6OndlYWtfcHRyPERXT0ZpbGU+PiBEV09GaWxlczsKKyAgc3RkOjp3ZWFrX3B0cjxEV09GaWxlPiBEV1A7CisgIGJvb2wgQ2hlY2tlZEZvckRXUCA9IGZhbHNlOworICBzdGQ6OnN0cmluZyBEV1BOYW1lOworCisgIHN0ZDo6dW5pcXVlX3B0cjxNQ1JlZ2lzdGVySW5mbz4gUmVnSW5mbzsKKworICAvLy8gUmVhZCBjb21waWxlIHVuaXRzIGZyb20gdGhlIGRlYnVnX2luZm8gc2VjdGlvbiAoaWYgbmVjZXNzYXJ5KQorICAvLy8gYW5kIHN0b3JlIHRoZW0gaW4gQ1VzLgorICB2b2lkIHBhcnNlQ29tcGlsZVVuaXRzKCk7CisKKyAgLy8vIFJlYWQgdHlwZSB1bml0cyBmcm9tIHRoZSBkZWJ1Z190eXBlcyBzZWN0aW9ucyAoaWYgbmVjZXNzYXJ5KQorICAvLy8gYW5kIHN0b3JlIHRoZW0gaW4gVFVzLgorICB2b2lkIHBhcnNlVHlwZVVuaXRzKCk7CisKKyAgLy8vIFJlYWQgY29tcGlsZSB1bml0cyBmcm9tIHRoZSBkZWJ1Z19pbmZvLmR3byBzZWN0aW9uIChpZiBuZWNlc3NhcnkpCisgIC8vLyBhbmQgc3RvcmUgdGhlbSBpbiBEV09DVXMuCisgIHZvaWQgcGFyc2VEV09Db21waWxlVW5pdHMoKTsKKworICAvLy8gUmVhZCB0eXBlIHVuaXRzIGZyb20gdGhlIGRlYnVnX3R5cGVzLmR3byBzZWN0aW9uIChpZiBuZWNlc3NhcnkpCisgIC8vLyBhbmQgc3RvcmUgdGhlbSBpbiBEV09UVXMuCisgIHZvaWQgcGFyc2VEV09UeXBlVW5pdHMoKTsKKworcHJvdGVjdGVkOgorICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgRFdBUkZPYmplY3Q+IERPYmo7CisKK3B1YmxpYzoKKyAgRFdBUkZDb250ZXh0KHN0ZDo6dW5pcXVlX3B0cjxjb25zdCBEV0FSRk9iamVjdD4gRE9iaiwKKyAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nIERXUE5hbWUgPSAiIik7CisgIH5EV0FSRkNvbnRleHQoKTsKKworICBEV0FSRkNvbnRleHQoRFdBUkZDb250ZXh0ICYpID0gZGVsZXRlOworICBEV0FSRkNvbnRleHQgJm9wZXJhdG9yPShEV0FSRkNvbnRleHQgJikgPSBkZWxldGU7CisKKyAgY29uc3QgRFdBUkZPYmplY3QgJmdldERXQVJGT2JqKCkgY29uc3QgeyByZXR1cm4gKkRPYmo7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERJQ29udGV4dCAqRElDdHgpIHsKKyAgICByZXR1cm4gRElDdHgtPmdldEtpbmQoKSA9PSBDS19EV0FSRjsKKyAgfQorCisgIC8vLyBEdW1wIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiB0byBccCBPUy4gSWYgYW55IFxwIER1bXBPZmZzZXRzIGFyZSBwcmVzZW50LAorICAvLy8gZHVtcCBvbmx5IHRoZSByZWNvcmQgYXQgdGhlIHNwZWNpZmllZCBvZmZzZXQuCisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MsIERJRHVtcE9wdGlvbnMgRHVtcE9wdHMsCisgICAgICAgICAgICBzdGQ6OmFycmF5PE9wdGlvbmFsPHVpbnQ2NF90PiwgRElEVF9JRF9Db3VudD4gRHVtcE9mZnNldHMpOworCisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MsIERJRHVtcE9wdGlvbnMgRHVtcE9wdHMpIG92ZXJyaWRlIHsKKyAgICBzdGQ6OmFycmF5PE9wdGlvbmFsPHVpbnQ2NF90PiwgRElEVF9JRF9Db3VudD4gRHVtcE9mZnNldHM7CisgICAgZHVtcChPUywgRHVtcE9wdHMsIER1bXBPZmZzZXRzKTsKKyAgfQorCisgIGJvb2wgdmVyaWZ5KHJhd19vc3RyZWFtICZPUywgRElEdW1wT3B0aW9ucyBEdW1wT3B0cyA9IHt9KSBvdmVycmlkZTsKKworICB1c2luZyBjdV9pdGVyYXRvcl9yYW5nZSA9IERXQVJGVW5pdFNlY3Rpb248RFdBUkZDb21waWxlVW5pdD46Oml0ZXJhdG9yX3JhbmdlOworICB1c2luZyB0dV9pdGVyYXRvcl9yYW5nZSA9IERXQVJGVW5pdFNlY3Rpb248RFdBUkZUeXBlVW5pdD46Oml0ZXJhdG9yX3JhbmdlOworICB1c2luZyB0dV9zZWN0aW9uX2l0ZXJhdG9yX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8ZGVjbHR5cGUoVFVzKTo6aXRlcmF0b3I+OworCisgIC8vLyBHZXQgY29tcGlsZSB1bml0cyBpbiB0aGlzIGNvbnRleHQuCisgIGN1X2l0ZXJhdG9yX3JhbmdlIGNvbXBpbGVfdW5pdHMoKSB7CisgICAgcGFyc2VDb21waWxlVW5pdHMoKTsKKyAgICByZXR1cm4gY3VfaXRlcmF0b3JfcmFuZ2UoQ1VzLmJlZ2luKCksIENVcy5lbmQoKSk7CisgIH0KKworICAvLy8gR2V0IHR5cGUgdW5pdHMgaW4gdGhpcyBjb250ZXh0LgorICB0dV9zZWN0aW9uX2l0ZXJhdG9yX3JhbmdlIHR5cGVfdW5pdF9zZWN0aW9ucygpIHsKKyAgICBwYXJzZVR5cGVVbml0cygpOworICAgIHJldHVybiB0dV9zZWN0aW9uX2l0ZXJhdG9yX3JhbmdlKFRVcy5iZWdpbigpLCBUVXMuZW5kKCkpOworICB9CisKKyAgLy8vIEdldCBjb21waWxlIHVuaXRzIGluIHRoZSBEV08gY29udGV4dC4KKyAgY3VfaXRlcmF0b3JfcmFuZ2UgZHdvX2NvbXBpbGVfdW5pdHMoKSB7CisgICAgcGFyc2VEV09Db21waWxlVW5pdHMoKTsKKyAgICByZXR1cm4gY3VfaXRlcmF0b3JfcmFuZ2UoRFdPQ1VzLmJlZ2luKCksIERXT0NVcy5lbmQoKSk7CisgIH0KKworICAvLy8gR2V0IHR5cGUgdW5pdHMgaW4gdGhlIERXTyBjb250ZXh0LgorICB0dV9zZWN0aW9uX2l0ZXJhdG9yX3JhbmdlIGR3b190eXBlX3VuaXRfc2VjdGlvbnMoKSB7CisgICAgcGFyc2VEV09UeXBlVW5pdHMoKTsKKyAgICByZXR1cm4gdHVfc2VjdGlvbl9pdGVyYXRvcl9yYW5nZShEV09UVXMuYmVnaW4oKSwgRFdPVFVzLmVuZCgpKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIG51bWJlciBvZiBjb21waWxlIHVuaXRzIGluIHRoaXMgY29udGV4dC4KKyAgdW5zaWduZWQgZ2V0TnVtQ29tcGlsZVVuaXRzKCkgeworICAgIHBhcnNlQ29tcGlsZVVuaXRzKCk7CisgICAgcmV0dXJuIENVcy5zaXplKCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBudW1iZXIgb2YgY29tcGlsZSB1bml0cyBpbiB0aGlzIGNvbnRleHQuCisgIHVuc2lnbmVkIGdldE51bVR5cGVVbml0cygpIHsKKyAgICBwYXJzZVR5cGVVbml0cygpOworICAgIHJldHVybiBUVXMuc2l6ZSgpOworICB9CisKKyAgLy8vIEdldCB0aGUgbnVtYmVyIG9mIGNvbXBpbGUgdW5pdHMgaW4gdGhlIERXTyBjb250ZXh0LgorICB1bnNpZ25lZCBnZXROdW1EV09Db21waWxlVW5pdHMoKSB7CisgICAgcGFyc2VEV09Db21waWxlVW5pdHMoKTsKKyAgICByZXR1cm4gRFdPQ1VzLnNpemUoKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIG51bWJlciBvZiBjb21waWxlIHVuaXRzIGluIHRoZSBEV08gY29udGV4dC4KKyAgdW5zaWduZWQgZ2V0TnVtRFdPVHlwZVVuaXRzKCkgeworICAgIHBhcnNlRFdPVHlwZVVuaXRzKCk7CisgICAgcmV0dXJuIERXT1RVcy5zaXplKCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBjb21waWxlIHVuaXQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBmb3IgdGhpcyBjb21waWxlIHVuaXQuCisgIERXQVJGQ29tcGlsZVVuaXQgKmdldENvbXBpbGVVbml0QXRJbmRleCh1bnNpZ25lZCBpbmRleCkgeworICAgIHBhcnNlQ29tcGlsZVVuaXRzKCk7CisgICAgcmV0dXJuIENVc1tpbmRleF0uZ2V0KCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBjb21waWxlIHVuaXQgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBmb3IgdGhlIERXTyBjb21waWxlIHVuaXRzLgorICBEV0FSRkNvbXBpbGVVbml0ICpnZXREV09Db21waWxlVW5pdEF0SW5kZXgodW5zaWduZWQgaW5kZXgpIHsKKyAgICBwYXJzZURXT0NvbXBpbGVVbml0cygpOworICAgIHJldHVybiBEV09DVXNbaW5kZXhdLmdldCgpOworICB9CisKKyAgRFdBUkZDb21waWxlVW5pdCAqZ2V0RFdPQ29tcGlsZVVuaXRGb3JIYXNoKHVpbnQ2NF90IEhhc2gpOworCisgIC8vLyBHZXQgYSBESUUgZ2l2ZW4gYW4gZXhhY3Qgb2Zmc2V0LgorICBEV0FSRkRpZSBnZXRESUVGb3JPZmZzZXQodWludDMyX3QgT2Zmc2V0KTsKKworICB1bnNpZ25lZCBnZXRNYXhWZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gTWF4VmVyc2lvbjsgfQorCisgIHZvaWQgc2V0TWF4VmVyc2lvbklmR3JlYXRlcih1bnNpZ25lZCBWZXJzaW9uKSB7CisgICAgaWYgKFZlcnNpb24gPiBNYXhWZXJzaW9uKQorICAgICAgTWF4VmVyc2lvbiA9IFZlcnNpb247CisgIH0KKworICBjb25zdCBEV0FSRlVuaXRJbmRleCAmZ2V0Q1VJbmRleCgpOworICBEV0FSRkdkYkluZGV4ICZnZXRHZGJJbmRleCgpOworICBjb25zdCBEV0FSRlVuaXRJbmRleCAmZ2V0VFVJbmRleCgpOworCisgIC8vLyBHZXQgYSBwb2ludGVyIHRvIHRoZSBwYXJzZWQgRGVidWdBYmJyZXYgb2JqZWN0LgorICBjb25zdCBEV0FSRkRlYnVnQWJicmV2ICpnZXREZWJ1Z0FiYnJldigpOworCisgIC8vLyBHZXQgYSBwb2ludGVyIHRvIHRoZSBwYXJzZWQgRGVidWdMb2Mgb2JqZWN0LgorICBjb25zdCBEV0FSRkRlYnVnTG9jICpnZXREZWJ1Z0xvYygpOworCisgIC8vLyBHZXQgYSBwb2ludGVyIHRvIHRoZSBwYXJzZWQgZHdvIGFiYnJldmlhdGlvbnMgb2JqZWN0LgorICBjb25zdCBEV0FSRkRlYnVnQWJicmV2ICpnZXREZWJ1Z0FiYnJldkRXTygpOworCisgIC8vLyBHZXQgYSBwb2ludGVyIHRvIHRoZSBwYXJzZWQgRGVidWdMb2Mgb2JqZWN0LgorICBjb25zdCBEV0FSRkRlYnVnTG9jRFdPICpnZXREZWJ1Z0xvY0RXTygpOworCisgIC8vLyBHZXQgYSBwb2ludGVyIHRvIHRoZSBwYXJzZWQgRGVidWdBcmFuZ2VzIG9iamVjdC4KKyAgY29uc3QgRFdBUkZEZWJ1Z0FyYW5nZXMgKmdldERlYnVnQXJhbmdlcygpOworCisgIC8vLyBHZXQgYSBwb2ludGVyIHRvIHRoZSBwYXJzZWQgZnJhbWUgaW5mb3JtYXRpb24gb2JqZWN0LgorICBjb25zdCBEV0FSRkRlYnVnRnJhbWUgKmdldERlYnVnRnJhbWUoKTsKKworICAvLy8gR2V0IGEgcG9pbnRlciB0byB0aGUgcGFyc2VkIGVoIGZyYW1lIGluZm9ybWF0aW9uIG9iamVjdC4KKyAgY29uc3QgRFdBUkZEZWJ1Z0ZyYW1lICpnZXRFSEZyYW1lKCk7CisKKyAgLy8vIEdldCBhIHBvaW50ZXIgdG8gdGhlIHBhcnNlZCBEZWJ1Z01hY3JvIG9iamVjdC4KKyAgY29uc3QgRFdBUkZEZWJ1Z01hY3JvICpnZXREZWJ1Z01hY3JvKCk7CisKKyAgLy8vIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgcGFyc2VkIGFjY2VsZXJhdG9yIHRhYmxlIG9iamVjdC4KKyAgY29uc3QgRFdBUkZEZWJ1Z05hbWVzICZnZXREZWJ1Z05hbWVzKCk7CisKKyAgLy8vIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgcGFyc2VkIGFjY2VsZXJhdG9yIHRhYmxlIG9iamVjdC4KKyAgY29uc3QgQXBwbGVBY2NlbGVyYXRvclRhYmxlICZnZXRBcHBsZU5hbWVzKCk7CisKKyAgLy8vIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgcGFyc2VkIGFjY2VsZXJhdG9yIHRhYmxlIG9iamVjdC4KKyAgY29uc3QgQXBwbGVBY2NlbGVyYXRvclRhYmxlICZnZXRBcHBsZVR5cGVzKCk7CisKKyAgLy8vIEdldCBhIHJlZmVyZW5jZSB0byB0aGUgcGFyc2VkIGFjY2VsZXJhdG9yIHRhYmxlIG9iamVjdC4KKyAgY29uc3QgQXBwbGVBY2NlbGVyYXRvclRhYmxlICZnZXRBcHBsZU5hbWVzcGFjZXMoKTsKKworICAvLy8gR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBwYXJzZWQgYWNjZWxlcmF0b3IgdGFibGUgb2JqZWN0LgorICBjb25zdCBBcHBsZUFjY2VsZXJhdG9yVGFibGUgJmdldEFwcGxlT2JqQygpOworCisgIC8vLyBHZXQgYSBwb2ludGVyIHRvIGEgcGFyc2VkIGxpbmUgdGFibGUgY29ycmVzcG9uZGluZyB0byBhIGNvbXBpbGUgdW5pdC4KKyAgY29uc3QgRFdBUkZEZWJ1Z0xpbmU6OkxpbmVUYWJsZSAqZ2V0TGluZVRhYmxlRm9yVW5pdChEV0FSRlVuaXQgKmN1KTsKKworICBEYXRhRXh0cmFjdG9yIGdldFN0cmluZ0V4dHJhY3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gRGF0YUV4dHJhY3RvcihET2JqLT5nZXRTdHJpbmdTZWN0aW9uKCksIGZhbHNlLCAwKTsKKyAgfQorICBEYXRhRXh0cmFjdG9yIGdldExpbmVTdHJpbmdFeHRyYWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIERhdGFFeHRyYWN0b3IoRE9iai0+Z2V0TGluZVN0cmluZ1NlY3Rpb24oKSwgZmFsc2UsIDApOworICB9CisKKyAgLy8vIFdyYXBzIHRoZSByZXR1cm5lZCBESUVzIGZvciBhIGdpdmVuIGFkZHJlc3MuCisgIHN0cnVjdCBESUVzRm9yQWRkcmVzcyB7CisgICAgRFdBUkZDb21waWxlVW5pdCAqQ29tcGlsZVVuaXQgPSBudWxscHRyOworICAgIERXQVJGRGllIEZ1bmN0aW9uRElFOworICAgIERXQVJGRGllIEJsb2NrRElFOworICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBDb21waWxlVW5pdCAhPSBudWxscHRyOyB9CisgIH07CisKKyAgLy8vIEdldCB0aGUgY29tcGlsYXRpb24gdW5pdCwgdGhlIGZ1bmN0aW9uIERJRSBhbmQgbGV4aWNhbCBibG9jayBESUUgZm9yIHRoZQorICAvLy8gZ2l2ZW4gYWRkcmVzcyB3aGVyZSBhcHBsaWNhYmxlLgorICBESUVzRm9yQWRkcmVzcyBnZXRESUVzRm9yQWRkcmVzcyh1aW50NjRfdCBBZGRyZXNzKTsKKworICBESUxpbmVJbmZvIGdldExpbmVJbmZvRm9yQWRkcmVzcyh1aW50NjRfdCBBZGRyZXNzLAorICAgICAgRElMaW5lSW5mb1NwZWNpZmllciBTcGVjaWZpZXIgPSBESUxpbmVJbmZvU3BlY2lmaWVyKCkpIG92ZXJyaWRlOworICBESUxpbmVJbmZvVGFibGUgZ2V0TGluZUluZm9Gb3JBZGRyZXNzUmFuZ2UodWludDY0X3QgQWRkcmVzcywgdWludDY0X3QgU2l6ZSwKKyAgICAgIERJTGluZUluZm9TcGVjaWZpZXIgU3BlY2lmaWVyID0gRElMaW5lSW5mb1NwZWNpZmllcigpKSBvdmVycmlkZTsKKyAgRElJbmxpbmluZ0luZm8gZ2V0SW5saW5pbmdJbmZvRm9yQWRkcmVzcyh1aW50NjRfdCBBZGRyZXNzLAorICAgICAgRElMaW5lSW5mb1NwZWNpZmllciBTcGVjaWZpZXIgPSBESUxpbmVJbmZvU3BlY2lmaWVyKCkpIG92ZXJyaWRlOworCisgIGJvb2wgaXNMaXR0bGVFbmRpYW4oKSBjb25zdCB7IHJldHVybiBET2JqLT5pc0xpdHRsZUVuZGlhbigpOyB9CisgIHN0YXRpYyBib29sIGlzU3VwcG9ydGVkVmVyc2lvbih1bnNpZ25lZCB2ZXJzaW9uKSB7CisgICAgcmV0dXJuIHZlcnNpb24gPT0gMiB8fCB2ZXJzaW9uID09IDMgfHwgdmVyc2lvbiA9PSA0IHx8IHZlcnNpb24gPT0gNTsKKyAgfQorCisgIHN0ZDo6c2hhcmVkX3B0cjxEV0FSRkNvbnRleHQ+IGdldERXT0NvbnRleHQoU3RyaW5nUmVmIEFic29sdXRlUGF0aCk7CisKKyAgY29uc3QgTUNSZWdpc3RlckluZm8gKmdldFJlZ2lzdGVySW5mbygpIGNvbnN0IHsgcmV0dXJuIFJlZ0luZm8uZ2V0KCk7IH0KKworICAvLy8gRnVuY3Rpb24gdXNlZCB0byBoYW5kbGUgZGVmYXVsdCBlcnJvciByZXBvcnRpbmcgcG9saWN5LiBQcmludHMgYSBlcnJvcgorICAvLy8gbWVzc2FnZSBhbmQgcmV0dXJucyBDb250aW51ZSwgc28gRFdBUkYgY29udGV4dCBpZ25vcmVzIHRoZSBlcnJvci4KKyAgc3RhdGljIEVycm9yUG9saWN5IGRlZmF1bHRFcnJvckhhbmRsZXIoRXJyb3IgRSk7CisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8RFdBUkZDb250ZXh0PgorICBjcmVhdGUoY29uc3Qgb2JqZWN0OjpPYmplY3RGaWxlICZPYmosIGNvbnN0IExvYWRlZE9iamVjdEluZm8gKkwgPSBudWxscHRyLAorICAgICAgICAgZnVuY3Rpb25fcmVmPEVycm9yUG9saWN5KEVycm9yKT4gSGFuZGxlRXJyb3IgPSBkZWZhdWx0RXJyb3JIYW5kbGVyLAorICAgICAgICAgc3RkOjpzdHJpbmcgRFdQTmFtZSA9ICIiKTsKKworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPERXQVJGQ29udGV4dD4KKyAgY3JlYXRlKGNvbnN0IFN0cmluZ01hcDxzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPj4gJlNlY3Rpb25zLAorICAgICAgICAgdWludDhfdCBBZGRyU2l6ZSwgYm9vbCBpc0xpdHRsZUVuZGlhbiA9IHN5czo6SXNMaXR0bGVFbmRpYW5Ib3N0KTsKKworICAvLy8gTG9hZHMgcmVnaXN0ZXIgaW5mbyBmb3IgdGhlIGFyY2hpdGVjdHVyZSBvZiB0aGUgcHJvdmlkZWQgb2JqZWN0IGZpbGUuCisgIC8vLyBJbXByb3ZlcyByZWFkYWJpbGl0eSBvZiBkdW1wZWQgRFdBUkYgZXhwcmVzc2lvbnMuIFJlcXVpcmVzIHRoZSBjYWxsZXIgdG8KKyAgLy8vIGhhdmUgaW5pdGlhbGl6ZWQgdGhlIHJlbGV2YW50IHRhcmdldCBkZXNjcmlwdGlvbnMuCisgIEVycm9yIGxvYWRSZWdpc3RlckluZm8oY29uc3Qgb2JqZWN0OjpPYmplY3RGaWxlICZPYmopOworCitwcml2YXRlOgorICAvLy8gUmV0dXJuIHRoZSBjb21waWxlIHVuaXQgdGhhdCBpbmNsdWRlcyBhbiBvZmZzZXQgKHJlbGF0aXZlIHRvIC5kZWJ1Z19pbmZvKS4KKyAgRFdBUkZDb21waWxlVW5pdCAqZ2V0Q29tcGlsZVVuaXRGb3JPZmZzZXQodWludDMyX3QgT2Zmc2V0KTsKKworICAvLy8gUmV0dXJuIHRoZSBjb21waWxlIHVuaXQgd2hpY2ggY29udGFpbnMgaW5zdHJ1Y3Rpb24gd2l0aCBwcm92aWRlZAorICAvLy8gYWRkcmVzcy4KKyAgRFdBUkZDb21waWxlVW5pdCAqZ2V0Q29tcGlsZVVuaXRGb3JBZGRyZXNzKHVpbnQ2NF90IEFkZHJlc3MpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGQ09OVEVYVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRhdGFFeHRyYWN0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGF0YUV4dHJhY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZTE0NmIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRhdGFFeHRyYWN0b3IuaApAQCAtMCwwICsxLDU4IEBACisvLz09PS0gRFdBUkZEYXRhRXh0cmFjdG9yLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0RXQVJGREFUQUVYVFJBQ1RPUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0RXQVJGREFUQUVYVFJBQ1RPUl9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlNlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YUV4dHJhY3Rvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBEV0FSRk9iamVjdDsKKworLy8vIEEgRGF0YUV4dHJhY3RvciAodHlwaWNhbGx5IGZvciBhbiBpbi1tZW1vcnkgY29weSBvZiBhbiBvYmplY3QtZmlsZSBzZWN0aW9uKQorLy8vIHBsdXMgYSByZWxvY2F0aW9uIG1hcCBmb3IgdGhhdCBzZWN0aW9uLCBpZiB0aGVyZSBpcyBvbmUuCitjbGFzcyBEV0FSRkRhdGFFeHRyYWN0b3IgOiBwdWJsaWMgRGF0YUV4dHJhY3RvciB7CisgIGNvbnN0IERXQVJGT2JqZWN0ICpPYmogPSBudWxscHRyOworICBjb25zdCBEV0FSRlNlY3Rpb24gKlNlY3Rpb24gPSBudWxscHRyOworCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3RvciBmb3IgdGhlIG5vcm1hbCBjYXNlIG9mIGV4dHJhY3RpbmcgZGF0YSBmcm9tIGEgRFdBUkYgc2VjdGlvbi4KKyAgLy8vIFRoZSBEV0FSRlNlY3Rpb24ncyBsaWZldGltZSBtdXN0IGJlIGF0IGxlYXN0IGFzIGxvbmcgYXMgdGhlIGV4dHJhY3RvcidzLgorICBEV0FSRkRhdGFFeHRyYWN0b3IoY29uc3QgRFdBUkZPYmplY3QgJk9iaiwgY29uc3QgRFdBUkZTZWN0aW9uICZTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0xpdHRsZUVuZGlhbiwgdWludDhfdCBBZGRyZXNzU2l6ZSkKKyAgICAgIDogRGF0YUV4dHJhY3RvcihTZWN0aW9uLkRhdGEsIElzTGl0dGxlRW5kaWFuLCBBZGRyZXNzU2l6ZSksIE9iaigmT2JqKSwKKyAgICAgICAgU2VjdGlvbigmU2VjdGlvbikge30KKworICAvLy8gQ29uc3RydWN0b3IgZm9yIGNhc2VzIHdoZW4gdGhlcmUgYXJlIG5vIHJlbG9jYXRpb25zLgorICBEV0FSRkRhdGFFeHRyYWN0b3IoU3RyaW5nUmVmIERhdGEsIGJvb2wgSXNMaXR0bGVFbmRpYW4sIHVpbnQ4X3QgQWRkcmVzc1NpemUpCisgICAgOiBEYXRhRXh0cmFjdG9yKERhdGEsIElzTGl0dGxlRW5kaWFuLCBBZGRyZXNzU2l6ZSkge30KKworICAvLy8gRXh0cmFjdHMgYSB2YWx1ZSBhbmQgYXBwbGllcyBhIHJlbG9jYXRpb24gdG8gdGhlIHJlc3VsdCBpZgorICAvLy8gb25lIGV4aXN0cyBmb3IgdGhlIGdpdmVuIG9mZnNldC4KKyAgdWludDY0X3QgZ2V0UmVsb2NhdGVkVmFsdWUodWludDMyX3QgU2l6ZSwgdWludDMyX3QgKk9mZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgKlNlY3Rpb25JbmRleCA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBFeHRyYWN0cyBhbiBhZGRyZXNzLXNpemVkIHZhbHVlIGFuZCBhcHBsaWVzIGEgcmVsb2NhdGlvbiB0byB0aGUgcmVzdWx0IGlmCisgIC8vLyBvbmUgZXhpc3RzIGZvciB0aGUgZ2l2ZW4gb2Zmc2V0LgorICB1aW50NjRfdCBnZXRSZWxvY2F0ZWRBZGRyZXNzKHVpbnQzMl90ICpPZmYsIHVpbnQ2NF90ICpTZWNJeCA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UmVsb2NhdGVkVmFsdWUoZ2V0QWRkcmVzc1NpemUoKSwgT2ZmLCBTZWNJeCk7CisgIH0KKworICAvLy8gRXh0cmFjdHMgYSBEV0FSRi1lbmNvZGVkIHBvaW50ZXIgaW4gXHAgT2Zmc2V0IHVzaW5nIFxwIEVuY29kaW5nLgorICAvLy8gVGhlcmUgaXMgYSBEV0FSRiBlbmNvZGluZyB0aGF0IHVzZXMgYSBQQy1yZWxhdGl2ZSBhZGp1c3RtZW50LgorICAvLy8gRm9yIHRoZXNlIHZhbHVlcywgXHAgQWJzUG9zT2Zmc2V0IGlzIHVzZWQgdG8gZml4IHRoZW0sIHdoaWNoIHNob3VsZAorICAvLy8gcmVmbGVjdCB0aGUgYWJzb2x1dGUgYWRkcmVzcyBvZiB0aGlzIHBvaW50ZXIuCisgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRFbmNvZGVkUG9pbnRlcih1aW50MzJfdCAqT2Zmc2V0LCB1aW50OF90IEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgQWJzUG9zT2Zmc2V0ID0gMCkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fRFdBUkZEQVRBRVhUUkFDVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdBYmJyZXYuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdBYmJyZXYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjc3ZWMzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z0FiYnJldi5oCkBAIC0wLDAgKzEsODggQEAKKy8vPT09LSBEV0FSRkRlYnVnQWJicmV2LmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fRFdBUkZERUJVR0FCQlJFVl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0RXQVJGREVCVUdBQkJSRVZfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZBYmJyZXZpYXRpb25EZWNsYXJhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhRXh0cmFjdG9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCitjbGFzcyBEV0FSRkFiYnJldmlhdGlvbkRlY2xhcmF0aW9uU2V0IHsKKyAgdWludDMyX3QgT2Zmc2V0OworICAvLy8gQ29kZSBvZiB0aGUgZmlyc3QgYWJicmV2aWF0aW9uLCBpZiBhbGwgYWJicmV2aWF0aW9ucyBpbiB0aGUgc2V0IGhhdmUKKyAgLy8vIGNvbnNlY3V0aXZlIGNvZGVzLiBVSU5UMzJfTUFYIG90aGVyd2lzZS4KKyAgdWludDMyX3QgRmlyc3RBYmJyQ29kZTsKKyAgc3RkOjp2ZWN0b3I8RFdBUkZBYmJyZXZpYXRpb25EZWNsYXJhdGlvbj4gRGVjbHM7CisKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPQorICAgICAgc3RkOjp2ZWN0b3I8RFdBUkZBYmJyZXZpYXRpb25EZWNsYXJhdGlvbj46OmNvbnN0X2l0ZXJhdG9yOworCitwdWJsaWM6CisgIERXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb25TZXQoKTsKKworICB1aW50MzJfdCBnZXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBPZmZzZXQ7IH0KKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIGJvb2wgZXh0cmFjdChEYXRhRXh0cmFjdG9yIERhdGEsIHVpbnQzMl90ICpPZmZzZXRQdHIpOworCisgIGNvbnN0IERXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb24gKgorICBnZXRBYmJyZXZpYXRpb25EZWNsYXJhdGlvbih1aW50MzJfdCBBYmJyQ29kZSkgY29uc3Q7CisKKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIERlY2xzLmJlZ2luKCk7CisgIH0KKworICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIERlY2xzLmVuZCgpOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgY2xlYXIoKTsKK307CisKK2NsYXNzIERXQVJGRGVidWdBYmJyZXYgeworICB1c2luZyBEV0FSRkFiYnJldmlhdGlvbkRlY2xhcmF0aW9uU2V0TWFwID0KKyAgICAgIHN0ZDo6bWFwPHVpbnQ2NF90LCBEV0FSRkFiYnJldmlhdGlvbkRlY2xhcmF0aW9uU2V0PjsKKworICBtdXRhYmxlIERXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb25TZXRNYXAgQWJickRlY2xTZXRzOworICBtdXRhYmxlIERXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb25TZXRNYXA6OmNvbnN0X2l0ZXJhdG9yIFByZXZBYmJyT2Zmc2V0UG9zOworICBtdXRhYmxlIE9wdGlvbmFsPERhdGFFeHRyYWN0b3I+IERhdGE7CisKK3B1YmxpYzoKKyAgRFdBUkZEZWJ1Z0FiYnJldigpOworCisgIGNvbnN0IERXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb25TZXQgKgorICBnZXRBYmJyZXZpYXRpb25EZWNsYXJhdGlvblNldCh1aW50NjRfdCBDVUFiYnJPZmZzZXQpIGNvbnN0OworCisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIHBhcnNlKCkgY29uc3Q7CisgIHZvaWQgZXh0cmFjdChEYXRhRXh0cmFjdG9yIERhdGEpOworCisgIERXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb25TZXRNYXA6OmNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeworICAgIHBhcnNlKCk7CisgICAgcmV0dXJuIEFiYnJEZWNsU2V0cy5iZWdpbigpOworICB9CisKKyAgRFdBUkZBYmJyZXZpYXRpb25EZWNsYXJhdGlvblNldE1hcDo6Y29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeworICAgIHJldHVybiBBYmJyRGVjbFNldHMuZW5kKCk7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBjbGVhcigpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGREVCVUdBQkJSRVZfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z0FyYW5nZVNldC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z0FyYW5nZVNldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiNDZmYWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnQXJhbmdlU2V0LmgKQEAgLTAsMCArMSw3NiBAQAorLy89PT0tIERXQVJGRGVidWdBcmFuZ2VTZXQuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRkRFQlVHQVJBTkdFU0VUX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fRFdBUkZERUJVR0FSQU5HRVNFVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhRXh0cmFjdG9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK2NsYXNzIERXQVJGRGVidWdBcmFuZ2VTZXQgeworcHVibGljOgorICBzdHJ1Y3QgSGVhZGVyIHsKKyAgICAvLy8gVGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgZW50cmllcyBmb3IgdGhhdCBzZXQsIG5vdCBpbmNsdWRpbmcgdGhlIGxlbmd0aAorICAgIC8vLyBmaWVsZCBpdHNlbGYuCisgICAgdWludDMyX3QgTGVuZ3RoOworICAgIC8vLyBUaGUgb2Zmc2V0IGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbiBvZiB0aGUKKyAgICAvLy8gY29tcGlsYXRpb24gdW5pdCBlbnRyeSByZWZlcmVuY2VkIGJ5IHRoZSB0YWJsZS4KKyAgICB1aW50MzJfdCBDdU9mZnNldDsKKyAgICAvLy8gVGhlIERXQVJGIHZlcnNpb24gbnVtYmVyLgorICAgIHVpbnQxNl90IFZlcnNpb247CisgICAgLy8vIFRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIGFkZHJlc3Mgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuIEZvciBzZWdtZW50ZWQKKyAgICAvLy8gYWRkcmVzc2luZywgdGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUgb2Zmc2V0IHBvcnRpb24gb2YgdGhlIGFkZHJlc3MuCisgICAgdWludDhfdCBBZGRyU2l6ZTsKKyAgICAvLy8gVGhlIHNpemUgaW4gYnl0ZXMgb2YgYSBzZWdtZW50IGRlc2NyaXB0b3Igb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCisgICAgLy8vIElmIHRoZSB0YXJnZXQgc3lzdGVtIHVzZXMgYSBmbGF0IGFkZHJlc3Mgc3BhY2UsIHRoaXMgdmFsdWUgaXMgMC4KKyAgICB1aW50OF90IFNlZ1NpemU7CisgIH07CisKKyAgc3RydWN0IERlc2NyaXB0b3IgeworICAgIHVpbnQ2NF90IEFkZHJlc3M7CisgICAgdWludDY0X3QgTGVuZ3RoOworCisgICAgdWludDY0X3QgZ2V0RW5kQWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIEFkZHJlc3MgKyBMZW5ndGg7IH0KKyAgICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCB1aW50MzJfdCBBZGRyZXNzU2l6ZSkgY29uc3Q7CisgIH07CisKK3ByaXZhdGU6CisgIHVzaW5nIERlc2NyaXB0b3JDb2xsID0gc3RkOjp2ZWN0b3I8RGVzY3JpcHRvcj47CisgIHVzaW5nIGRlc2NfaXRlcmF0b3JfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxEZXNjcmlwdG9yQ29sbDo6Y29uc3RfaXRlcmF0b3I+OworCisgIHVpbnQzMl90IE9mZnNldDsKKyAgSGVhZGVyIEhlYWRlckRhdGE7CisgIERlc2NyaXB0b3JDb2xsIEFyYW5nZURlc2NyaXB0b3JzOworCitwdWJsaWM6CisgIERXQVJGRGVidWdBcmFuZ2VTZXQoKSB7IGNsZWFyKCk7IH0KKworICB2b2lkIGNsZWFyKCk7CisgIGJvb2wgZXh0cmFjdChEYXRhRXh0cmFjdG9yIGRhdGEsIHVpbnQzMl90ICpvZmZzZXRfcHRyKTsKKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgdWludDMyX3QgZ2V0Q29tcGlsZVVuaXRESUVPZmZzZXQoKSBjb25zdCB7IHJldHVybiBIZWFkZXJEYXRhLkN1T2Zmc2V0OyB9CisKKyAgY29uc3QgSGVhZGVyICZnZXRIZWFkZXIoKSBjb25zdCB7IHJldHVybiBIZWFkZXJEYXRhOyB9CisKKyAgZGVzY19pdGVyYXRvcl9yYW5nZSBkZXNjcmlwdG9ycygpIGNvbnN0IHsKKyAgICByZXR1cm4gZGVzY19pdGVyYXRvcl9yYW5nZShBcmFuZ2VEZXNjcmlwdG9ycy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyYW5nZURlc2NyaXB0b3JzLmVuZCgpKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGREVCVUdBUkFOR0VTRVRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z0FyYW5nZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdBcmFuZ2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE3MWE1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdBcmFuZ2VzLmgKQEAgLTAsMCArMSw4OSBAQAorLy89PT0tIERXQVJGRGVidWdBcmFuZ2VzLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRkRFQlVHQVJBTkdFU19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0RXQVJGREVCVUdBUkFOR0VTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFFeHRyYWN0b3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBEV0FSRkNvbnRleHQ7CisKK2NsYXNzIERXQVJGRGVidWdBcmFuZ2VzIHsKK3B1YmxpYzoKKyAgdm9pZCBnZW5lcmF0ZShEV0FSRkNvbnRleHQgKkNUWCk7CisgIHVpbnQzMl90IGZpbmRBZGRyZXNzKHVpbnQ2NF90IEFkZHJlc3MpIGNvbnN0OworCitwcml2YXRlOgorICB2b2lkIGNsZWFyKCk7CisgIHZvaWQgZXh0cmFjdChEYXRhRXh0cmFjdG9yIERlYnVnQXJhbmdlc0RhdGEpOworCisgIC8vLyBDYWxsIGFwcGVuZFJhbmdlIG11bHRpcGxlIHRpbWVzIGFuZCB0aGVuIGNhbGwgY29uc3RydWN0LgorICB2b2lkIGFwcGVuZFJhbmdlKHVpbnQzMl90IENVT2Zmc2V0LCB1aW50NjRfdCBMb3dQQywgdWludDY0X3QgSGlnaFBDKTsKKyAgdm9pZCBjb25zdHJ1Y3QoKTsKKworICBzdHJ1Y3QgUmFuZ2UgeworICAgIGV4cGxpY2l0IFJhbmdlKHVpbnQ2NF90IExvd1BDID0gLTFVTEwsIHVpbnQ2NF90IEhpZ2hQQyA9IC0xVUxMLAorICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENVT2Zmc2V0ID0gLTFVKQorICAgICAgOiBMb3dQQyhMb3dQQyksIExlbmd0aChIaWdoUEMgLSBMb3dQQyksIENVT2Zmc2V0KENVT2Zmc2V0KSB7fQorCisgICAgdm9pZCBzZXRIaWdoUEModWludDY0X3QgSGlnaFBDKSB7CisgICAgICBpZiAoSGlnaFBDID09IC0xVUxMIHx8IEhpZ2hQQyA8PSBMb3dQQykKKyAgICAgICAgTGVuZ3RoID0gMDsKKyAgICAgIGVsc2UKKyAgICAgICAgTGVuZ3RoID0gSGlnaFBDIC0gTG93UEM7CisgICAgfQorCisgICAgdWludDY0X3QgSGlnaFBDKCkgY29uc3QgeworICAgICAgaWYgKExlbmd0aCkKKyAgICAgICAgcmV0dXJuIExvd1BDICsgTGVuZ3RoOworICAgICAgcmV0dXJuIC0xVUxMOworICAgIH0KKworICAgIGJvb2wgY29udGFpbnNBZGRyZXNzKHVpbnQ2NF90IEFkZHJlc3MpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMb3dQQyA8PSBBZGRyZXNzICYmIEFkZHJlc3MgPCBIaWdoUEMoKTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBSYW5nZSAmb3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMb3dQQyA8IG90aGVyLkxvd1BDOworICAgIH0KKworICAgIHVpbnQ2NF90IExvd1BDOyAvLy8gU3RhcnQgb2YgYWRkcmVzcyByYW5nZS4KKyAgICB1aW50MzJfdCBMZW5ndGg7IC8vLyBFbmQgb2YgYWRkcmVzcyByYW5nZSAobm90IGluY2x1ZGluZyB0aGlzIGFkZHJlc3MpLgorICAgIHVpbnQzMl90IENVT2Zmc2V0OyAvLy8gT2Zmc2V0IG9mIHRoZSBjb21waWxlIHVuaXQgb3IgZGllLgorICB9OworCisgIHN0cnVjdCBSYW5nZUVuZHBvaW50IHsKKyAgICB1aW50NjRfdCBBZGRyZXNzOworICAgIHVpbnQzMl90IENVT2Zmc2V0OworICAgIGJvb2wgSXNSYW5nZVN0YXJ0OworCisgICAgUmFuZ2VFbmRwb2ludCh1aW50NjRfdCBBZGRyZXNzLCB1aW50MzJfdCBDVU9mZnNldCwgYm9vbCBJc1JhbmdlU3RhcnQpCisgICAgICAgIDogQWRkcmVzcyhBZGRyZXNzKSwgQ1VPZmZzZXQoQ1VPZmZzZXQpLCBJc1JhbmdlU3RhcnQoSXNSYW5nZVN0YXJ0KSB7fQorCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUmFuZ2VFbmRwb2ludCAmT3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiBBZGRyZXNzIDwgT3RoZXIuQWRkcmVzczsKKyAgICB9CisgIH07CisKKyAgdXNpbmcgUmFuZ2VDb2xsID0gc3RkOjp2ZWN0b3I8UmFuZ2U+OworICB1c2luZyBSYW5nZUNvbGxJdGVyYXRvciA9IFJhbmdlQ29sbDo6Y29uc3RfaXRlcmF0b3I7CisKKyAgc3RkOjp2ZWN0b3I8UmFuZ2VFbmRwb2ludD4gRW5kcG9pbnRzOworICBSYW5nZUNvbGwgQXJhbmdlczsKKyAgRGVuc2VTZXQ8dWludDMyX3Q+IFBhcnNlZENVT2Zmc2V0czsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19EV0FSRkRFQlVHQVJBTkdFU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnRnJhbWUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdGcmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmMWM3ZmIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnRnJhbWUuaApAQCAtMCwwICsxLDMwMSBAQAorLy89PT0tIERXQVJGRGVidWdGcmFtZS5oIC0gUGFyc2luZyBvZiAuZGVidWdfZnJhbWUgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkRFQlVHRlJBTUVfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkRFQlVHRlJBTUVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEYXRhRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZFeHByZXNzaW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworbmFtZXNwYWNlIGR3YXJmIHsKKworLy8vIFJlcHJlc2VudCBhIHNlcXVlbmNlIG9mIENhbGwgRnJhbWUgSW5mb3JtYXRpb24gaW5zdHJ1Y3Rpb25zIHRoYXQsIHdoZW4gcmVhZAorLy8vIGluIG9yZGVyLCBjb25zdHJ1Y3QgYSB0YWJsZSBtYXBwaW5nIFBDIHRvIGZyYW1lIHN0YXRlLiBUaGlzIGNhbiBhbHNvIGJlCisvLy8gcmVmZXJyZWQgdG8gYXMgIkNGSSBydWxlcyIgaW4gRFdBUkYgbGl0ZXJhdHVyZSB0byBhdm9pZCBjb25mdXNpb24gd2l0aAorLy8vIGNvbXB1dGVyIHByb2dyYW1zIGluIHRoZSBicm9hZGVyIHNlbnNlLCBhbmQgaW4gdGhpcyBjb250ZXh0IGVhY2ggaW5zdHJ1Y3Rpb24KKy8vLyB3b3VsZCBiZSBhIHJ1bGUgdG8gZXN0YWJsaXNoIHRoZSBtYXBwaW5nLiBSZWZlciB0byBwZy4gMTcyIGluIHRoZSBEV0FSRjUKKy8vLyBtYW51YWwsICI2LjQuMSBTdHJ1Y3R1cmUgb2YgQ2FsbCBGcmFtZSBJbmZvcm1hdGlvbiIuCitjbGFzcyBDRklQcm9ncmFtIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBTbWFsbFZlY3Rvcjx1aW50NjRfdCwgMj4gT3BlcmFuZHM7CisKKyAgLy8vIEFuIGluc3RydWN0aW9uIGNvbnNpc3RzIG9mIGEgRFdBUkYgQ0ZJIG9wY29kZSBhbmQgYW4gb3B0aW9uYWwgc2VxdWVuY2Ugb2YKKyAgLy8vIG9wZXJhbmRzLiBJZiBpdCByZWZlcnMgdG8gYW4gZXhwcmVzc2lvbiwgdGhlbiB0aGlzIGV4cHJlc3Npb24gaGFzIGl0cyBvd24KKyAgLy8vIHNlcXVlbmNlIG9mIG9wZXJhdGlvbnMgYW5kIG9wZXJhbmRzIGhhbmRsZWQgc2VwYXJhdGVseSBieSBEV0FSRkV4cHJlc3Npb24uCisgIHN0cnVjdCBJbnN0cnVjdGlvbiB7CisgICAgSW5zdHJ1Y3Rpb24odWludDhfdCBPcGNvZGUpIDogT3Bjb2RlKE9wY29kZSkge30KKworICAgIHVpbnQ4X3QgT3Bjb2RlOworICAgIE9wZXJhbmRzIE9wczsKKyAgICAvLyBBc3NvY2lhdGVkIERXQVJGIGV4cHJlc3Npb24gaW4gY2FzZSB0aGlzIGluc3RydWN0aW9uIHJlZmVycyB0byBvbmUKKyAgICBPcHRpb25hbDxEV0FSRkV4cHJlc3Npb24+IEV4cHJlc3Npb247CisgIH07CisKKyAgdXNpbmcgSW5zdHJMaXN0ID0gc3RkOjp2ZWN0b3I8SW5zdHJ1Y3Rpb24+OworICB1c2luZyBpdGVyYXRvciA9IEluc3RyTGlzdDo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gSW5zdHJMaXN0Ojpjb25zdF9pdGVyYXRvcjsKKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIEluc3RydWN0aW9ucy5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gSW5zdHJ1Y3Rpb25zLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gSW5zdHJ1Y3Rpb25zLmVuZCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEluc3RydWN0aW9ucy5lbmQoKTsgfQorCisgIHVuc2lnbmVkIHNpemUoKSBjb25zdCB7IHJldHVybiAodW5zaWduZWQpSW5zdHJ1Y3Rpb25zLnNpemUoKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gSW5zdHJ1Y3Rpb25zLmVtcHR5KCk7IH0KKworICBDRklQcm9ncmFtKHVpbnQ2NF90IENvZGVBbGlnbm1lbnRGYWN0b3IsIGludDY0X3QgRGF0YUFsaWdubWVudEZhY3RvcikKKyAgICAgIDogQ29kZUFsaWdubWVudEZhY3RvcihDb2RlQWxpZ25tZW50RmFjdG9yKSwKKyAgICAgICAgRGF0YUFsaWdubWVudEZhY3RvcihEYXRhQWxpZ25tZW50RmFjdG9yKSB7fQorCisgIC8vLyBQYXJzZSBhbmQgc3RvcmUgYSBzZXF1ZW5jZSBvZiBDRkkgaW5zdHJ1Y3Rpb25zIGZyb20gRGF0YSwKKyAgLy8vIHN0YXJ0aW5nIGF0ICpPZmZzZXQgYW5kIGVuZGluZyBhdCBFbmRPZmZzZXQuICpPZmZzZXQgaXMgdXBkYXRlZAorICAvLy8gdG8gRW5kT2Zmc2V0IHVwb24gc3VjY2Vzc2Z1bCBwYXJzaW5nLCBvciBpbmRpY2F0ZXMgdGhlIG9mZnNldAorICAvLy8gd2hlcmUgYSBwcm9ibGVtIG9jY3VycmVkIGluIGNhc2UgYW4gZXJyb3IgaXMgcmV0dXJuZWQuCisgIEVycm9yIHBhcnNlKERhdGFFeHRyYWN0b3IgRGF0YSwgdWludDMyX3QgKk9mZnNldCwgdWludDMyX3QgRW5kT2Zmc2V0KTsKKworICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNQ1JlZ2lzdGVySW5mbyAqTVJJLCBib29sIElzRUgsCisgICAgICAgICAgICB1bnNpZ25lZCBJbmRlbnRMZXZlbCA9IDEpIGNvbnN0OworCitwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxJbnN0cnVjdGlvbj4gSW5zdHJ1Y3Rpb25zOworICBjb25zdCB1aW50NjRfdCBDb2RlQWxpZ25tZW50RmFjdG9yOworICBjb25zdCBpbnQ2NF90IERhdGFBbGlnbm1lbnRGYWN0b3I7CisKKyAgLy8vIENvbnZlbmllbmNlIG1ldGhvZCB0byBhZGQgYSBuZXcgaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgZ2l2ZW4gb3Bjb2RlLgorICB2b2lkIGFkZEluc3RydWN0aW9uKHVpbnQ4X3QgT3Bjb2RlKSB7CisgICAgSW5zdHJ1Y3Rpb25zLnB1c2hfYmFjayhJbnN0cnVjdGlvbihPcGNvZGUpKTsKKyAgfQorCisgIC8vLyBBZGQgYSBuZXcgc2luZ2xlLW9wZXJhbmQgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgYWRkSW5zdHJ1Y3Rpb24odWludDhfdCBPcGNvZGUsIHVpbnQ2NF90IE9wZXJhbmQxKSB7CisgICAgSW5zdHJ1Y3Rpb25zLnB1c2hfYmFjayhJbnN0cnVjdGlvbihPcGNvZGUpKTsKKyAgICBJbnN0cnVjdGlvbnMuYmFjaygpLk9wcy5wdXNoX2JhY2soT3BlcmFuZDEpOworICB9CisKKyAgLy8vIEFkZCBhIG5ldyBpbnN0cnVjdGlvbiB0aGF0IGhhcyB0d28gb3BlcmFuZHMuCisgIHZvaWQgYWRkSW5zdHJ1Y3Rpb24odWludDhfdCBPcGNvZGUsIHVpbnQ2NF90IE9wZXJhbmQxLCB1aW50NjRfdCBPcGVyYW5kMikgeworICAgIEluc3RydWN0aW9ucy5wdXNoX2JhY2soSW5zdHJ1Y3Rpb24oT3Bjb2RlKSk7CisgICAgSW5zdHJ1Y3Rpb25zLmJhY2soKS5PcHMucHVzaF9iYWNrKE9wZXJhbmQxKTsKKyAgICBJbnN0cnVjdGlvbnMuYmFjaygpLk9wcy5wdXNoX2JhY2soT3BlcmFuZDIpOworICB9CisKKyAgLy8vIFR5cGVzIG9mIG9wZXJhbmRzIHRvIENGSSBpbnN0cnVjdGlvbnMKKyAgLy8vIEluIERXQVJGLCB0aGlzIHR5cGUgaXMgaW1wbGljaXRseSB0aWVkIHRvIGEgQ0ZJIGluc3RydWN0aW9uIG9wY29kZSBhbmQKKyAgLy8vIHRodXMgdGhpcyB0eXBlIGRvZXNuJ3QgbmVlZCB0byBiZSBleHBsaWN0bHkgd3JpdHRlbiB0byB0aGUgZmlsZSAodGhpcyBpcworICAvLy8gbm90IGEgRFdBUkYgZW5jb2RpbmcpLiBUaGUgcmVsYXRpb25zaGlwIG9mIGluc3RycyB0byBvcGVyYW5kIHR5cGVzIGNhbgorICAvLy8gYmUgb2J0YWluZWQgZnJvbSBnZXRPcGVyYW5kVHlwZXMoKSBhbmQgaXMgb25seSB1c2VkIHRvIHNpbXBsaWZ5CisgIC8vLyBpbnN0cnVjdGlvbiBwcmludGluZy4KKyAgZW51bSBPcGVyYW5kVHlwZSB7CisgICAgT1RfVW5zZXQsCisgICAgT1RfTm9uZSwKKyAgICBPVF9BZGRyZXNzLAorICAgIE9UX09mZnNldCwKKyAgICBPVF9GYWN0b3JlZENvZGVPZmZzZXQsCisgICAgT1RfU2lnbmVkRmFjdERhdGFPZmZzZXQsCisgICAgT1RfVW5zaWduZWRGYWN0RGF0YU9mZnNldCwKKyAgICBPVF9SZWdpc3RlciwKKyAgICBPVF9FeHByZXNzaW9uCisgIH07CisKKyAgLy8vIFJldHJpZXZlIHRoZSBhcnJheSBkZXNjcmliaW5nIHRoZSB0eXBlcyBvZiBvcGVyYW5kcyBhY2NvcmRpbmcgdG8gdGhlIGVudW0KKyAgLy8vIGFib3ZlLiBUaGlzIGlzIGluZGV4ZWQgYnkgb3Bjb2RlLgorICBzdGF0aWMgQXJyYXlSZWY8T3BlcmFuZFR5cGVbMl0+IGdldE9wZXJhbmRUeXBlcygpOworCisgIC8vLyBQcmludCBccCBPcGNvZGUncyBvcGVyYW5kIG51bWJlciBccCBPcGVyYW5kSWR4IHdoaWNoIGhhcyB2YWx1ZSBccCBPcGVyYW5kLgorICB2b2lkIHByaW50T3BlcmFuZChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICpNUkksIGJvb2wgSXNFSCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gJkluc3RyLCB1bnNpZ25lZCBPcGVyYW5kSWR4LAorICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBPcGVyYW5kKSBjb25zdDsKK307CisKKy8vLyBBbiBlbnRyeSBpbiBlaXRoZXIgZGVidWdfZnJhbWUgb3IgZWhfZnJhbWUuIFRoaXMgZW50cnkgY2FuIGJlIGEgQ0lFIG9yIGFuCisvLy8gRkRFLgorY2xhc3MgRnJhbWVFbnRyeSB7CitwdWJsaWM6CisgIGVudW0gRnJhbWVLaW5kIHsgRktfQ0lFLCBGS19GREUgfTsKKworICBGcmFtZUVudHJ5KEZyYW1lS2luZCBLLCB1aW50NjRfdCBPZmZzZXQsIHVpbnQ2NF90IExlbmd0aCwgdWludDY0X3QgQ29kZUFsaWduLAorICAgICAgICAgICAgIGludDY0X3QgRGF0YUFsaWduKQorICAgICAgOiBLaW5kKEspLCBPZmZzZXQoT2Zmc2V0KSwgTGVuZ3RoKExlbmd0aCksIENGSXMoQ29kZUFsaWduLCBEYXRhQWxpZ24pIHt9CisKKyAgdmlydHVhbCB+RnJhbWVFbnRyeSgpIHt9CisKKyAgRnJhbWVLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisgIHVpbnQ2NF90IGdldE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIE9mZnNldDsgfQorICB1aW50NjRfdCBnZXRMZW5ndGgoKSBjb25zdCB7IHJldHVybiBMZW5ndGg7IH0KKyAgY29uc3QgQ0ZJUHJvZ3JhbSAmY2ZpcygpIGNvbnN0IHsgcmV0dXJuIENGSXM7IH0KKyAgQ0ZJUHJvZ3JhbSAmY2ZpcygpIHsgcmV0dXJuIENGSXM7IH0KKworICAvLy8gRHVtcCB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoaXMgQ0ZJIGZyYWdtZW50CisgIHZpcnR1YWwgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUywgY29uc3QgTUNSZWdpc3RlckluZm8gKk1SSSwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0VIKSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgY29uc3QgRnJhbWVLaW5kIEtpbmQ7CisKKyAgLy8vIE9mZnNldCBvZiB0aGlzIGVudHJ5IGluIHRoZSBzZWN0aW9uLgorICBjb25zdCB1aW50NjRfdCBPZmZzZXQ7CisKKyAgLy8vIEVudHJ5IGxlbmd0aCBhcyBzcGVjaWZpZWQgaW4gRFdBUkYuCisgIGNvbnN0IHVpbnQ2NF90IExlbmd0aDsKKworICBDRklQcm9ncmFtIENGSXM7Cit9OworCisvLy8gRFdBUkYgQ29tbW9uIEluZm9ybWF0aW9uIEVudHJ5IChDSUUpCitjbGFzcyBDSUUgOiBwdWJsaWMgRnJhbWVFbnRyeSB7CitwdWJsaWM6CisgIC8vIENJRXMgKGFuZCBGREVzKSBhcmUgc2ltcGx5IGNvbnRhaW5lciBjbGFzc2VzLCBzbyB0aGUgb25seSBzZW5zaWJsZSB3YXkgdG8KKyAgLy8gY3JlYXRlIHRoZW0gaXMgYnkgcHJvdmlkaW5nIHRoZSBmdWxsIHBhcnNlZCBjb250ZW50cyBpbiB0aGUgY29uc3RydWN0b3IuCisgIENJRSh1aW50NjRfdCBPZmZzZXQsIHVpbnQ2NF90IExlbmd0aCwgdWludDhfdCBWZXJzaW9uLAorICAgICAgU21hbGxTdHJpbmc8OD4gQXVnbWVudGF0aW9uLCB1aW50OF90IEFkZHJlc3NTaXplLAorICAgICAgdWludDhfdCBTZWdtZW50RGVzY3JpcHRvclNpemUsIHVpbnQ2NF90IENvZGVBbGlnbm1lbnRGYWN0b3IsCisgICAgICBpbnQ2NF90IERhdGFBbGlnbm1lbnRGYWN0b3IsIHVpbnQ2NF90IFJldHVybkFkZHJlc3NSZWdpc3RlciwKKyAgICAgIFNtYWxsU3RyaW5nPDg+IEF1Z21lbnRhdGlvbkRhdGEsIHVpbnQzMl90IEZERVBvaW50ZXJFbmNvZGluZywKKyAgICAgIHVpbnQzMl90IExTREFQb2ludGVyRW5jb2RpbmcsIE9wdGlvbmFsPHVpbnQ2NF90PiBQZXJzb25hbGl0eSwKKyAgICAgIE9wdGlvbmFsPHVpbnQzMl90PiBQZXJzb25hbGl0eUVuYykKKyAgICAgIDogRnJhbWVFbnRyeShGS19DSUUsIE9mZnNldCwgTGVuZ3RoLCBDb2RlQWxpZ25tZW50RmFjdG9yLAorICAgICAgICAgICAgICAgICAgIERhdGFBbGlnbm1lbnRGYWN0b3IpLAorICAgICAgICBWZXJzaW9uKFZlcnNpb24pLCBBdWdtZW50YXRpb24oc3RkOjptb3ZlKEF1Z21lbnRhdGlvbikpLAorICAgICAgICBBZGRyZXNzU2l6ZShBZGRyZXNzU2l6ZSksIFNlZ21lbnREZXNjcmlwdG9yU2l6ZShTZWdtZW50RGVzY3JpcHRvclNpemUpLAorICAgICAgICBDb2RlQWxpZ25tZW50RmFjdG9yKENvZGVBbGlnbm1lbnRGYWN0b3IpLAorICAgICAgICBEYXRhQWxpZ25tZW50RmFjdG9yKERhdGFBbGlnbm1lbnRGYWN0b3IpLAorICAgICAgICBSZXR1cm5BZGRyZXNzUmVnaXN0ZXIoUmV0dXJuQWRkcmVzc1JlZ2lzdGVyKSwKKyAgICAgICAgQXVnbWVudGF0aW9uRGF0YShzdGQ6Om1vdmUoQXVnbWVudGF0aW9uRGF0YSkpLAorICAgICAgICBGREVQb2ludGVyRW5jb2RpbmcoRkRFUG9pbnRlckVuY29kaW5nKSwKKyAgICAgICAgTFNEQVBvaW50ZXJFbmNvZGluZyhMU0RBUG9pbnRlckVuY29kaW5nKSwgUGVyc29uYWxpdHkoUGVyc29uYWxpdHkpLAorICAgICAgICBQZXJzb25hbGl0eUVuYyhQZXJzb25hbGl0eUVuYykge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEZyYW1lRW50cnkgKkZFKSB7IHJldHVybiBGRS0+Z2V0S2luZCgpID09IEZLX0NJRTsgfQorCisgIFN0cmluZ1JlZiBnZXRBdWdtZW50YXRpb25TdHJpbmcoKSBjb25zdCB7IHJldHVybiBBdWdtZW50YXRpb247IH0KKyAgdWludDY0X3QgZ2V0Q29kZUFsaWdubWVudEZhY3RvcigpIGNvbnN0IHsgcmV0dXJuIENvZGVBbGlnbm1lbnRGYWN0b3I7IH0KKyAgaW50NjRfdCBnZXREYXRhQWxpZ25tZW50RmFjdG9yKCkgY29uc3QgeyByZXR1cm4gRGF0YUFsaWdubWVudEZhY3RvcjsgfQorICB1aW50OF90IGdldFZlcnNpb24oKSBjb25zdCB7IHJldHVybiBWZXJzaW9uOyB9CisgIHVpbnQ2NF90IGdldFJldHVybkFkZHJlc3NSZWdpc3RlcigpIGNvbnN0IHsgcmV0dXJuIFJldHVybkFkZHJlc3NSZWdpc3RlcjsgfQorICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0UGVyc29uYWxpdHlBZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gUGVyc29uYWxpdHk7IH0KKyAgT3B0aW9uYWw8dWludDMyX3Q+IGdldFBlcnNvbmFsaXR5RW5jb2RpbmcoKSBjb25zdCB7IHJldHVybiBQZXJzb25hbGl0eUVuYzsgfQorCisgIHVpbnQzMl90IGdldEZERVBvaW50ZXJFbmNvZGluZygpIGNvbnN0IHsgcmV0dXJuIEZERVBvaW50ZXJFbmNvZGluZzsgfQorCisgIHVpbnQzMl90IGdldExTREFQb2ludGVyRW5jb2RpbmcoKSBjb25zdCB7IHJldHVybiBMU0RBUG9pbnRlckVuY29kaW5nOyB9CisKKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUywgY29uc3QgTUNSZWdpc3RlckluZm8gKk1SSSwKKyAgICAgICAgICAgIGJvb2wgSXNFSCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIC8vLyBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgZGVmaW5lZCBpbiBzZWN0aW9uIDYuNC4xIG9mIHRoZSBEV0FSRiBzdGFuZGFyZCB2NAorICBjb25zdCB1aW50OF90IFZlcnNpb247CisgIGNvbnN0IFNtYWxsU3RyaW5nPDg+IEF1Z21lbnRhdGlvbjsKKyAgY29uc3QgdWludDhfdCBBZGRyZXNzU2l6ZTsKKyAgY29uc3QgdWludDhfdCBTZWdtZW50RGVzY3JpcHRvclNpemU7CisgIGNvbnN0IHVpbnQ2NF90IENvZGVBbGlnbm1lbnRGYWN0b3I7CisgIGNvbnN0IGludDY0X3QgRGF0YUFsaWdubWVudEZhY3RvcjsKKyAgY29uc3QgdWludDY0X3QgUmV0dXJuQWRkcmVzc1JlZ2lzdGVyOworCisgIC8vIFRoZSBmb2xsb3dpbmcgYXJlIHVzZWQgd2hlbiB0aGUgQ0lFIHJlcHJlc2VudHMgYW4gRUggZnJhbWUgZW50cnkuCisgIGNvbnN0IFNtYWxsU3RyaW5nPDg+IEF1Z21lbnRhdGlvbkRhdGE7CisgIGNvbnN0IHVpbnQzMl90IEZERVBvaW50ZXJFbmNvZGluZzsKKyAgY29uc3QgdWludDMyX3QgTFNEQVBvaW50ZXJFbmNvZGluZzsKKyAgY29uc3QgT3B0aW9uYWw8dWludDY0X3Q+IFBlcnNvbmFsaXR5OworICBjb25zdCBPcHRpb25hbDx1aW50MzJfdD4gUGVyc29uYWxpdHlFbmM7Cit9OworCisvLy8gRFdBUkYgRnJhbWUgRGVzY3JpcHRpb24gRW50cnkgKEZERSkKK2NsYXNzIEZERSA6IHB1YmxpYyBGcmFtZUVudHJ5IHsKK3B1YmxpYzoKKyAgLy8gRWFjaCBGREUgaGFzIGEgQ0lFIGl0J3MgImxpbmtlZCB0byIuIE91ciBGREUgY29udGFpbnMgaXMgY29uc3RydWN0ZWQgd2l0aAorICAvLyBhbiBvZmZzZXQgdG8gdGhlIENJRSAocHJvdmlkZWQgYnkgcGFyc2luZyB0aGUgRkRFIGhlYWRlcikuIFRoZSBDSUUgaXRzZWxmCisgIC8vIGlzIG9idGFpbmVkIGxhemlseSBvbmNlIGl0J3MgYWN0dWFsbHkgcmVxdWlyZWQuCisgIEZERSh1aW50NjRfdCBPZmZzZXQsIHVpbnQ2NF90IExlbmd0aCwgaW50NjRfdCBMaW5rZWRDSUVPZmZzZXQsCisgICAgICB1aW50NjRfdCBJbml0aWFsTG9jYXRpb24sIHVpbnQ2NF90IEFkZHJlc3NSYW5nZSwgQ0lFICpDaWUsCisgICAgICBPcHRpb25hbDx1aW50NjRfdD4gTFNEQUFkZHJlc3MpCisgICAgICA6IEZyYW1lRW50cnkoRktfRkRFLCBPZmZzZXQsIExlbmd0aCwKKyAgICAgICAgICAgICAgICAgICBDaWUgPyBDaWUtPmdldENvZGVBbGlnbm1lbnRGYWN0b3IoKSA6IDAsCisgICAgICAgICAgICAgICAgICAgQ2llID8gQ2llLT5nZXREYXRhQWxpZ25tZW50RmFjdG9yKCkgOiAwKSwKKyAgICAgICAgTGlua2VkQ0lFT2Zmc2V0KExpbmtlZENJRU9mZnNldCksIEluaXRpYWxMb2NhdGlvbihJbml0aWFsTG9jYXRpb24pLAorICAgICAgICBBZGRyZXNzUmFuZ2UoQWRkcmVzc1JhbmdlKSwgTGlua2VkQ0lFKENpZSksIExTREFBZGRyZXNzKExTREFBZGRyZXNzKSB7fQorCisgIH5GREUoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgY29uc3QgQ0lFICpnZXRMaW5rZWRDSUUoKSBjb25zdCB7IHJldHVybiBMaW5rZWRDSUU7IH0KKyAgdWludDY0X3QgZ2V0SW5pdGlhbExvY2F0aW9uKCkgY29uc3QgeyByZXR1cm4gSW5pdGlhbExvY2F0aW9uOyB9CisgIHVpbnQ2NF90IGdldEFkZHJlc3NSYW5nZSgpIGNvbnN0IHsgcmV0dXJuIEFkZHJlc3NSYW5nZTsgfQorICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0TFNEQUFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBMU0RBQWRkcmVzczsgfQorCisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICpNUkksCisgICAgICAgICAgICBib29sIElzRUgpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRnJhbWVFbnRyeSAqRkUpIHsgcmV0dXJuIEZFLT5nZXRLaW5kKCkgPT0gRktfRkRFOyB9CisKK3ByaXZhdGU6CisgIC8vLyBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgZGVmaW5lZCBpbiBzZWN0aW9uIDYuNC4xIG9mIHRoZSBEV0FSRiBzdGFuZGFyZCB2MworICBjb25zdCB1aW50NjRfdCBMaW5rZWRDSUVPZmZzZXQ7CisgIGNvbnN0IHVpbnQ2NF90IEluaXRpYWxMb2NhdGlvbjsKKyAgY29uc3QgdWludDY0X3QgQWRkcmVzc1JhbmdlOworICBjb25zdCBDSUUgKkxpbmtlZENJRTsKKyAgY29uc3QgT3B0aW9uYWw8dWludDY0X3Q+IExTREFBZGRyZXNzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGR3YXJmCisKKy8vLyBBIHBhcnNlZCAuZGVidWdfZnJhbWUgb3IgLmVoX2ZyYW1lIHNlY3Rpb24KK2NsYXNzIERXQVJGRGVidWdGcmFtZSB7CisgIC8vIFRydWUgaWYgdGhpcyBpcyBwYXJzaW5nIGFuIGVoX2ZyYW1lIHNlY3Rpb24uCisgIGNvbnN0IGJvb2wgSXNFSDsKKyAgLy8gTm90IHplcm8gZm9yIHNhbmUgcG9pbnRlciB2YWx1ZXMgY29taW5nIG91dCBvZiBlaF9mcmFtZQorICBjb25zdCB1aW50NjRfdCBFSEZyYW1lQWRkcmVzczsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8ZHdhcmY6OkZyYW1lRW50cnk+PiBFbnRyaWVzOworICB1c2luZyBpdGVyYXRvciA9IHBvaW50ZWVfaXRlcmF0b3I8ZGVjbHR5cGUoRW50cmllcyk6OmNvbnN0X2l0ZXJhdG9yPjsKKworICAvLy8gUmV0dXJuIHRoZSBlbnRyeSBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IG9yIG51bGxwdHIuCisgIGR3YXJmOjpGcmFtZUVudHJ5ICpnZXRFbnRyeUF0T2Zmc2V0KHVpbnQ2NF90IE9mZnNldCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8gSWYgSXNFSCBpcyB0cnVlLCBhc3N1bWUgaXQgaXMgYSAuZWhfZnJhbWUgc2VjdGlvbi4gT3RoZXJ3aXNlLAorICAvLyBpdCBpcyBhIC5kZWJ1Z19mcmFtZSBzZWN0aW9uLiBFSEZyYW1lQWRkcmVzcyBzaG91bGQgYmUgZGlmZmVyZW50CisgIC8vIHRoYW4gemVybyBmb3IgY29ycmVjdCBwYXJzaW5nIG9mIC5laF9mcmFtZSBhZGRyZXNzZXMgd2hlbiB0aGV5CisgIC8vIHVzZSBhIFBDLXJlbGF0aXZlIGVuY29kaW5nLgorICBEV0FSRkRlYnVnRnJhbWUoYm9vbCBJc0VIID0gZmFsc2UsIHVpbnQ2NF90IEVIRnJhbWVBZGRyZXNzID0gMCk7CisgIH5EV0FSRkRlYnVnRnJhbWUoKTsKKworICAvLy8gRHVtcCB0aGUgc2VjdGlvbiBkYXRhIGludG8gdGhlIGdpdmVuIHN0cmVhbS4KKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUywgY29uc3QgTUNSZWdpc3RlckluZm8gKk1SSSwKKyAgICAgICAgICAgIE9wdGlvbmFsPHVpbnQ2NF90PiBPZmZzZXQpIGNvbnN0OworCisgIC8vLyBQYXJzZSB0aGUgc2VjdGlvbiBmcm9tIHJhdyBkYXRhLiBccCBEYXRhIGlzIGFzc3VtZWQgdG8gY29udGFpbiB0aGUgd2hvbGUKKyAgLy8vIGZyYW1lIHNlY3Rpb24gY29udGVudHMgdG8gYmUgcGFyc2VkLgorICB2b2lkIHBhcnNlKERXQVJGRGF0YUV4dHJhY3RvciBEYXRhKTsKKworICAvLy8gUmV0dXJuIHdoZXRoZXIgdGhlIHNlY3Rpb24gaGFzIGFueSBlbnRyaWVzLgorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gRW50cmllcy5lbXB0eSgpOyB9CisKKyAgLy8vIERXQVJGIEZyYW1lIGVudHJpZXMgYWNjZXNzb3JzCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gRW50cmllcy5iZWdpbigpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEVudHJpZXMuZW5kKCk7IH0KKyAgaXRlcmF0b3JfcmFuZ2U8aXRlcmF0b3I+IGVudHJpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGl0ZXJhdG9yX3JhbmdlPGl0ZXJhdG9yPihFbnRyaWVzLmJlZ2luKCksIEVudHJpZXMuZW5kKCkpOworICB9CisKKyAgdWludDY0X3QgZ2V0RUhGcmFtZUFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBFSEZyYW1lQWRkcmVzczsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGREVCVUdGUkFNRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnSW5mb0VudHJ5LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnSW5mb0VudHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhjOGY1NwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdJbmZvRW50cnkuaApAQCAtMCwwICsxLDYzIEBACisvLz09PS0gRFdBUkZEZWJ1Z0luZm9FbnRyeS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0RXQVJGREVCVUdJTkZPRU5UUllfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRkRFQlVHSU5GT0VOVFJZX0gKKworI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZBYmJyZXZpYXRpb25EZWNsYXJhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGF0YUV4dHJhY3Rvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRGF0YUV4dHJhY3RvcjsKK2NsYXNzIERXQVJGVW5pdDsKKworLy8vIERXQVJGRGVidWdJbmZvRW50cnkgLSBBIERJRSB3aXRoIG9ubHkgdGhlIG1pbmltdW0gcmVxdWlyZWQgZGF0YS4KK2NsYXNzIERXQVJGRGVidWdJbmZvRW50cnkgeworICAvLy8gT2Zmc2V0IHdpdGhpbiB0aGUgLmRlYnVnX2luZm8gb2YgdGhlIHN0YXJ0IG9mIHRoaXMgZW50cnkuCisgIHVpbnQzMl90IE9mZnNldCA9IDA7CisKKyAgLy8vIFRoZSBpbnRlZ2VyIGRlcHRoIG9mIHRoaXMgRElFIHdpdGhpbiB0aGUgY29tcGlsZSB1bml0IERJRXMgd2hlcmUgdGhlCisgIC8vLyBjb21waWxlL3R5cGUgdW5pdCBESUUgaGFzIGEgZGVwdGggb2YgemVyby4KKyAgdWludDMyX3QgRGVwdGggPSAwOworCisgIGNvbnN0IERXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb24gKkFiYnJldkRlY2wgPSBudWxscHRyOworCitwdWJsaWM6CisgIERXQVJGRGVidWdJbmZvRW50cnkoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIEV4dHJhY3RzIGEgZGVidWcgaW5mbyBlbnRyeSwgd2hpY2ggaXMgYSBjaGlsZCBvZiBhIGdpdmVuIHVuaXQsCisgIC8vLyBzdGFydGluZyBhdCBhIGdpdmVuIG9mZnNldC4gSWYgRElFIGNhbid0IGJlIGV4dHJhY3RlZCwgcmV0dXJucyBmYWxzZSBhbmQKKyAgLy8vIGRvZXNuJ3QgY2hhbmdlIE9mZnNldFB0ci4KKyAgYm9vbCBleHRyYWN0RmFzdChjb25zdCBEV0FSRlVuaXQgJlUsIHVpbnQzMl90ICpPZmZzZXRQdHIpOworCisgIC8vLyBIaWdoIHBlcmZvcm1hbmNlIGV4dHJhY3Rpb24gc2hvdWxkIHVzZSB0aGlzIGNhbGwuCisgIGJvb2wgZXh0cmFjdEZhc3QoY29uc3QgRFdBUkZVbml0ICZVLCB1aW50MzJfdCAqT2Zmc2V0UHRyLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGRGF0YUV4dHJhY3RvciAmRGVidWdJbmZvRGF0YSwgdWludDMyX3QgVUVuZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEZXB0aCk7CisKKyAgdWludDMyX3QgZ2V0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gT2Zmc2V0OyB9CisgIHVpbnQzMl90IGdldERlcHRoKCkgY29uc3QgeyByZXR1cm4gRGVwdGg7IH0KKworICBkd2FyZjo6VGFnIGdldFRhZygpIGNvbnN0IHsKKyAgICByZXR1cm4gQWJicmV2RGVjbCA/IEFiYnJldkRlY2wtPmdldFRhZygpIDogZHdhcmY6OkRXX1RBR19udWxsOworICB9CisKKyAgYm9vbCBoYXNDaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIEFiYnJldkRlY2wgJiYgQWJicmV2RGVjbC0+aGFzQ2hpbGRyZW4oKTsgfQorCisgIGNvbnN0IERXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb24gKmdldEFiYnJldmlhdGlvbkRlY2xhcmF0aW9uUHRyKCkgY29uc3QgeworICAgIHJldHVybiBBYmJyZXZEZWNsOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fRFdBUkZERUJVR0lORk9FTlRSWV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnTGluZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z0xpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjQzNjRhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z0xpbmUuaApAQCAtMCwwICsxLDI5NiBAQAorLy89PT0tIERXQVJGRGVidWdMaW5lLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRkRFQlVHTElORV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0RXQVJGREVCVUdMSU5FX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRElDb250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEYXRhRXh0cmFjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZGb3JtVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlJlbG9jTWFwLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01ENS5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRFdBUkZVbml0OworY2xhc3MgcmF3X29zdHJlYW07CisKK2NsYXNzIERXQVJGRGVidWdMaW5lIHsKK3B1YmxpYzoKKyAgc3RydWN0IEZpbGVOYW1lRW50cnkgeworICAgIEZpbGVOYW1lRW50cnkoKSA9IGRlZmF1bHQ7CisKKyAgICBEV0FSRkZvcm1WYWx1ZSBOYW1lOworICAgIHVpbnQ2NF90IERpcklkeCA9IDA7CisgICAgdWludDY0X3QgTW9kVGltZSA9IDA7CisgICAgdWludDY0X3QgTGVuZ3RoID0gMDsKKyAgICBNRDU6Ok1ENVJlc3VsdCBDaGVja3N1bTsKKyAgICBEV0FSRkZvcm1WYWx1ZSBTb3VyY2U7CisgIH07CisKKyAgLy8vIFRyYWNrcyB3aGljaCBvcHRpb25hbCBjb250ZW50IHR5cGVzIGFyZSBwcmVzZW50IGluIGEgRFdBUkYgZmlsZSBuYW1lCisgIC8vLyBlbnRyeSBmb3JtYXQuCisgIHN0cnVjdCBDb250ZW50VHlwZVRyYWNrZXIgeworICAgIENvbnRlbnRUeXBlVHJhY2tlcigpID0gZGVmYXVsdDsKKworICAgIC8vLyBXaGV0aGVyIGZpbGVuYW1lIGVudHJpZXMgcHJvdmlkZSBhIG1vZGlmaWNhdGlvbiB0aW1lc3RhbXAuCisgICAgYm9vbCBIYXNNb2RUaW1lID0gZmFsc2U7CisgICAgLy8vIFdoZXRoZXIgZmlsZW5hbWUgZW50cmllcyBwcm92aWRlIGEgZmlsZSBzaXplLgorICAgIGJvb2wgSGFzTGVuZ3RoID0gZmFsc2U7CisgICAgLy8vIEZvciB2NSwgd2hldGhlciBmaWxlbmFtZSBlbnRyaWVzIHByb3ZpZGUgYW4gTUQ1IGNoZWNrc3VtLgorICAgIGJvb2wgSGFzTUQ1ID0gZmFsc2U7CisgICAgLy8vIEZvciB2NSwgd2hldGhlciBmaWxlbmFtZSBlbnRyaWVzIHByb3ZpZGUgc291cmNlIHRleHQuCisgICAgYm9vbCBIYXNTb3VyY2UgPSBmYWxzZTsKKworICAgIC8vLyBVcGRhdGUgdHJhY2tlZCBjb250ZW50IHR5cGVzIHdpdGggXHAgQ29udGVudFR5cGUuCisgICAgdm9pZCB0cmFja0NvbnRlbnRUeXBlKGR3YXJmOjpMaW5lTnVtYmVyRW50cnlGb3JtYXQgQ29udGVudFR5cGUpOworICB9OworCisgIHN0cnVjdCBQcm9sb2d1ZSB7CisgICAgUHJvbG9ndWUoKTsKKworICAgIC8vLyBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc3RhdGVtZW50IGluZm9ybWF0aW9uIGZvciB0aGlzIGNvbXBpbGF0aW9uIHVuaXQKKyAgICAvLy8gKG5vdCBpbmNsdWRpbmcgdGhlIHRvdGFsX2xlbmd0aCBmaWVsZCBpdHNlbGYpLgorICAgIHVpbnQ2NF90IFRvdGFsTGVuZ3RoOworICAgIC8vLyBWZXJzaW9uLCBhZGRyZXNzIHNpemUgKHN0YXJ0aW5nIGluIHY1KSwgYW5kIERXQVJGMzIvNjQgZm9ybWF0OyB0aGVzZQorICAgIC8vLyBwYXJhbWV0ZXJzIGFmZmVjdCBpbnRlcnByZXRhdGlvbiBvZiBmb3JtcyAodXNlZCBpbiB0aGUgZGlyZWN0b3J5IGFuZAorICAgIC8vLyBmaWxlIHRhYmxlcyBzdGFydGluZyB3aXRoIHY1KS4KKyAgICBkd2FyZjo6Rm9ybVBhcmFtcyBGb3JtUGFyYW1zOworICAgIC8vLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGZvbGxvd2luZyB0aGUgcHJvbG9ndWVfbGVuZ3RoIGZpZWxkIHRvIHRoZSBiZWdpbm5pbmcKKyAgICAvLy8gb2YgdGhlIGZpcnN0IGJ5dGUgb2YgdGhlIHN0YXRlbWVudCBwcm9ncmFtIGl0c2VsZi4KKyAgICB1aW50NjRfdCBQcm9sb2d1ZUxlbmd0aDsKKyAgICAvLy8gSW4gdjUsIHNpemUgaW4gYnl0ZXMgb2YgYSBzZWdtZW50IHNlbGVjdG9yLgorICAgIHVpbnQ4X3QgU2VnU2VsZWN0b3JTaXplOworICAgIC8vLyBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgc21hbGxlc3QgdGFyZ2V0IG1hY2hpbmUgaW5zdHJ1Y3Rpb24uIFN0YXRlbWVudAorICAgIC8vLyBwcm9ncmFtIG9wY29kZXMgdGhhdCBhbHRlciB0aGUgYWRkcmVzcyByZWdpc3RlciBmaXJzdCBtdWx0aXBseSB0aGVpcgorICAgIC8vLyBvcGVyYW5kcyBieSB0aGlzIHZhbHVlLgorICAgIHVpbnQ4X3QgTWluSW5zdExlbmd0aDsKKyAgICAvLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIGluZGl2aWR1YWwgb3BlcmF0aW9ucyB0aGF0IG1heSBiZSBlbmNvZGVkIGluIGFuCisgICAgLy8vIGluc3RydWN0aW9uLgorICAgIHVpbnQ4X3QgTWF4T3BzUGVySW5zdDsKKyAgICAvLy8gVGhlIGluaXRpYWwgdmFsdWUgb2YgdGhlaXNfc3RtdHJlZ2lzdGVyLgorICAgIHVpbnQ4X3QgRGVmYXVsdElzU3RtdDsKKyAgICAvLy8gVGhpcyBwYXJhbWV0ZXIgYWZmZWN0cyB0aGUgbWVhbmluZyBvZiB0aGUgc3BlY2lhbCBvcGNvZGVzLiBTZWUgYmVsb3cuCisgICAgaW50OF90IExpbmVCYXNlOworICAgIC8vLyBUaGlzIHBhcmFtZXRlciBhZmZlY3RzIHRoZSBtZWFuaW5nIG9mIHRoZSBzcGVjaWFsIG9wY29kZXMuIFNlZSBiZWxvdy4KKyAgICB1aW50OF90IExpbmVSYW5nZTsKKyAgICAvLy8gVGhlIG51bWJlciBhc3NpZ25lZCB0byB0aGUgZmlyc3Qgc3BlY2lhbCBvcGNvZGUuCisgICAgdWludDhfdCBPcGNvZGVCYXNlOworICAgIC8vLyBUaGlzIHRyYWNrcyB3aGljaCBvcHRpb25hbCBmaWxlIGZvcm1hdCBjb250ZW50IHR5cGVzIGFyZSBwcmVzZW50LgorICAgIENvbnRlbnRUeXBlVHJhY2tlciBDb250ZW50VHlwZXM7CisgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4gU3RhbmRhcmRPcGNvZGVMZW5ndGhzOworICAgIHN0ZDo6dmVjdG9yPERXQVJGRm9ybVZhbHVlPiBJbmNsdWRlRGlyZWN0b3JpZXM7CisgICAgc3RkOjp2ZWN0b3I8RmlsZU5hbWVFbnRyeT4gRmlsZU5hbWVzOworCisgICAgY29uc3QgZHdhcmY6OkZvcm1QYXJhbXMgZ2V0Rm9ybVBhcmFtcygpIGNvbnN0IHsgcmV0dXJuIEZvcm1QYXJhbXM7IH0KKyAgICB1aW50MTZfdCBnZXRWZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gRm9ybVBhcmFtcy5WZXJzaW9uOyB9CisgICAgdWludDhfdCBnZXRBZGRyZXNzU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEZvcm1QYXJhbXMuQWRkclNpemU7IH0KKyAgICBib29sIGlzRFdBUkY2NCgpIGNvbnN0IHsgcmV0dXJuIEZvcm1QYXJhbXMuRm9ybWF0ID09IGR3YXJmOjpEV0FSRjY0OyB9CisKKyAgICB1aW50MzJfdCBzaXplb2ZUb3RhbExlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIGlzRFdBUkY2NCgpID8gMTIgOiA0OyB9CisKKyAgICB1aW50MzJfdCBzaXplb2ZQcm9sb2d1ZUxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIGlzRFdBUkY2NCgpID8gOCA6IDQ7IH0KKworICAgIC8vLyBMZW5ndGggb2YgdGhlIHByb2xvZ3VlIGluIGJ5dGVzLgorICAgIHVpbnQzMl90IGdldExlbmd0aCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBQcm9sb2d1ZUxlbmd0aCArIHNpemVvZlRvdGFsTGVuZ3RoKCkgKyBzaXplb2YoZ2V0VmVyc2lvbigpKSArCisgICAgICAgICAgICAgc2l6ZW9mUHJvbG9ndWVMZW5ndGgoKTsKKyAgICB9CisKKyAgICAvLy8gTGVuZ3RoIG9mIHRoZSBsaW5lIHRhYmxlIGRhdGEgaW4gYnl0ZXMgKG5vdCBpbmNsdWRpbmcgdGhlIHByb2xvZ3VlKS4KKyAgICB1aW50MzJfdCBnZXRTdGF0ZW1lbnRUYWJsZUxlbmd0aCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBUb3RhbExlbmd0aCArIHNpemVvZlRvdGFsTGVuZ3RoKCkgLSBnZXRMZW5ndGgoKTsKKyAgICB9CisKKyAgICBpbnQzMl90IGdldE1heExpbmVJbmNyZW1lbnRGb3JTcGVjaWFsT3Bjb2RlKCkgY29uc3QgeworICAgICAgcmV0dXJuIExpbmVCYXNlICsgKGludDhfdClMaW5lUmFuZ2UgLSAxOworICAgIH0KKworICAgIHZvaWQgY2xlYXIoKTsKKyAgICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCBESUR1bXBPcHRpb25zIER1bXBPcHRpb25zKSBjb25zdDsKKyAgICBib29sIHBhcnNlKGNvbnN0IERXQVJGRGF0YUV4dHJhY3RvciAmRGVidWdMaW5lRGF0YSwgdWludDMyX3QgKk9mZnNldFB0ciwKKyAgICAgICAgICAgICAgIGNvbnN0IERXQVJGQ29udGV4dCAmQ3R4LCBjb25zdCBEV0FSRlVuaXQgKlUgPSBudWxscHRyKTsKKyAgfTsKKworICAvLy8gU3RhbmRhcmQgLmRlYnVnX2xpbmUgc3RhdGUgbWFjaGluZSBzdHJ1Y3R1cmUuCisgIHN0cnVjdCBSb3cgeworICAgIGV4cGxpY2l0IFJvdyhib29sIERlZmF1bHRJc1N0bXQgPSBmYWxzZSk7CisKKyAgICAvLy8gQ2FsbGVkIGFmdGVyIGEgcm93IGlzIGFwcGVuZGVkIHRvIHRoZSBtYXRyaXguCisgICAgdm9pZCBwb3N0QXBwZW5kKCk7CisgICAgdm9pZCByZXNldChib29sIERlZmF1bHRJc1N0bXQpOworICAgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgICAgc3RhdGljIHZvaWQgZHVtcFRhYmxlSGVhZGVyKHJhd19vc3RyZWFtICZPUyk7CisKKyAgICBzdGF0aWMgYm9vbCBvcmRlckJ5QWRkcmVzcyhjb25zdCBSb3cgJkxIUywgY29uc3QgUm93ICZSSFMpIHsKKyAgICAgIHJldHVybiBMSFMuQWRkcmVzcyA8IFJIUy5BZGRyZXNzOworICAgIH0KKworICAgIC8vLyBUaGUgcHJvZ3JhbS1jb3VudGVyIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gYSBtYWNoaW5lIGluc3RydWN0aW9uCisgICAgLy8vIGdlbmVyYXRlZCBieSB0aGUgY29tcGlsZXIuCisgICAgdWludDY0X3QgQWRkcmVzczsKKyAgICAvLy8gQW4gdW5zaWduZWQgaW50ZWdlciBpbmRpY2F0aW5nIGEgc291cmNlIGxpbmUgbnVtYmVyLiBMaW5lcyBhcmUgbnVtYmVyZWQKKyAgICAvLy8gYmVnaW5uaW5nIGF0IDEuIFRoZSBjb21waWxlciBtYXkgZW1pdCB0aGUgdmFsdWUgMCBpbiBjYXNlcyB3aGVyZSBhbgorICAgIC8vLyBpbnN0cnVjdGlvbiBjYW5ub3QgYmUgYXR0cmlidXRlZCB0byBhbnkgc291cmNlIGxpbmUuCisgICAgdWludDMyX3QgTGluZTsKKyAgICAvLy8gQW4gdW5zaWduZWQgaW50ZWdlciBpbmRpY2F0aW5nIGEgY29sdW1uIG51bWJlciB3aXRoaW4gYSBzb3VyY2UgbGluZS4KKyAgICAvLy8gQ29sdW1ucyBhcmUgbnVtYmVyZWQgYmVnaW5uaW5nIGF0IDEuIFRoZSB2YWx1ZSAwIGlzIHJlc2VydmVkIHRvIGluZGljYXRlCisgICAgLy8vIHRoYXQgYSBzdGF0ZW1lbnQgYmVnaW5zIGF0IHRoZSAnbGVmdCBlZGdlJyBvZiB0aGUgbGluZS4KKyAgICB1aW50MTZfdCBDb2x1bW47CisgICAgLy8vIEFuIHVuc2lnbmVkIGludGVnZXIgaW5kaWNhdGluZyB0aGUgaWRlbnRpdHkgb2YgdGhlIHNvdXJjZSBmaWxlCisgICAgLy8vIGNvcnJlc3BvbmRpbmcgdG8gYSBtYWNoaW5lIGluc3RydWN0aW9uLgorICAgIHVpbnQxNl90IEZpbGU7CisgICAgLy8vIEFuIHVuc2lnbmVkIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZSBEV0FSRiBwYXRoIGRpc2NyaW1pbmF0b3IgdmFsdWUKKyAgICAvLy8gZm9yIHRoaXMgbG9jYXRpb24uCisgICAgdWludDMyX3QgRGlzY3JpbWluYXRvcjsKKyAgICAvLy8gQW4gdW5zaWduZWQgaW50ZWdlciB3aG9zZSB2YWx1ZSBlbmNvZGVzIHRoZSBhcHBsaWNhYmxlIGluc3RydWN0aW9uIHNldAorICAgIC8vLyBhcmNoaXRlY3R1cmUgZm9yIHRoZSBjdXJyZW50IGluc3RydWN0aW9uLgorICAgIHVpbnQ4X3QgSXNhOworICAgIC8vLyBBIGJvb2xlYW4gaW5kaWNhdGluZyB0aGF0IHRoZSBjdXJyZW50IGluc3RydWN0aW9uIGlzIHRoZSBiZWdpbm5pbmcgb2YgYQorICAgIC8vLyBzdGF0ZW1lbnQuCisgICAgdWludDhfdCBJc1N0bXQgOiAxLAorICAgICAgICAvLy8gQSBib29sZWFuIGluZGljYXRpbmcgdGhhdCB0aGUgY3VycmVudCBpbnN0cnVjdGlvbiBpcyB0aGUKKyAgICAgICAgLy8vIGJlZ2lubmluZyBvZiBhIGJhc2ljIGJsb2NrLgorICAgICAgICBCYXNpY0Jsb2NrIDogMSwKKyAgICAgICAgLy8vIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHRoYXQgdGhlIGN1cnJlbnQgYWRkcmVzcyBpcyB0aGF0IG9mIHRoZQorICAgICAgICAvLy8gZmlyc3QgYnl0ZSBhZnRlciB0aGUgZW5kIG9mIGEgc2VxdWVuY2Ugb2YgdGFyZ2V0IG1hY2hpbmUKKyAgICAgICAgLy8vIGluc3RydWN0aW9ucy4KKyAgICAgICAgRW5kU2VxdWVuY2UgOiAxLAorICAgICAgICAvLy8gQSBib29sZWFuIGluZGljYXRpbmcgdGhhdCB0aGUgY3VycmVudCBhZGRyZXNzIGlzIG9uZSAob2YgcG9zc2libHkKKyAgICAgICAgLy8vIG1hbnkpIHdoZXJlIGV4ZWN1dGlvbiBzaG91bGQgYmUgc3VzcGVuZGVkIGZvciBhbiBlbnRyeSBicmVha3BvaW50CisgICAgICAgIC8vLyBvZiBhIGZ1bmN0aW9uLgorICAgICAgICBQcm9sb2d1ZUVuZCA6IDEsCisgICAgICAgIC8vLyBBIGJvb2xlYW4gaW5kaWNhdGluZyB0aGF0IHRoZSBjdXJyZW50IGFkZHJlc3MgaXMgb25lIChvZiBwb3NzaWJseQorICAgICAgICAvLy8gbWFueSkgd2hlcmUgZXhlY3V0aW9uIHNob3VsZCBiZSBzdXNwZW5kZWQgZm9yIGFuIGV4aXQgYnJlYWtwb2ludAorICAgICAgICAvLy8gb2YgYSBmdW5jdGlvbi4KKyAgICAgICAgRXBpbG9ndWVCZWdpbiA6IDE7CisgIH07CisKKyAgLy8vIFJlcHJlc2VudHMgYSBzZXJpZXMgb2YgY29udGlndW91cyBtYWNoaW5lIGluc3RydWN0aW9ucy4gTGluZSB0YWJsZSBmb3IKKyAgLy8vIGVhY2ggY29tcGlsYXRpb24gdW5pdCBtYXkgY29uc2lzdCBvZiBtdWx0aXBsZSBzZXF1ZW5jZXMsIHdoaWNoIGFyZSBub3QKKyAgLy8vIGd1YXJhbnRlZWQgdG8gYmUgaW4gdGhlIG9yZGVyIG9mIGFzY2VuZGluZyBpbnN0cnVjdGlvbiBhZGRyZXNzLgorICBzdHJ1Y3QgU2VxdWVuY2UgeworICAgIFNlcXVlbmNlKCk7CisKKyAgICAvLy8gU2VxdWVuY2UgZGVzY3JpYmVzIGluc3RydWN0aW9ucyBhdCBhZGRyZXNzIHJhbmdlIFtMb3dQQywgSGlnaFBDKQorICAgIC8vLyBhbmQgaXMgZGVzY3JpYmVkIGJ5IGxpbmUgdGFibGUgcm93cyBbRmlyc3RSb3dJbmRleCwgTGFzdFJvd0luZGV4KS4KKyAgICB1aW50NjRfdCBMb3dQQzsKKyAgICB1aW50NjRfdCBIaWdoUEM7CisgICAgdW5zaWduZWQgRmlyc3RSb3dJbmRleDsKKyAgICB1bnNpZ25lZCBMYXN0Um93SW5kZXg7CisgICAgYm9vbCBFbXB0eTsKKworICAgIHZvaWQgcmVzZXQoKTsKKworICAgIHN0YXRpYyBib29sIG9yZGVyQnlMb3dQQyhjb25zdCBTZXF1ZW5jZSAmTEhTLCBjb25zdCBTZXF1ZW5jZSAmUkhTKSB7CisgICAgICByZXR1cm4gTEhTLkxvd1BDIDwgUkhTLkxvd1BDOworICAgIH0KKworICAgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhRW1wdHkgJiYgKExvd1BDIDwgSGlnaFBDKSAmJiAoRmlyc3RSb3dJbmRleCA8IExhc3RSb3dJbmRleCk7CisgICAgfQorCisgICAgYm9vbCBjb250YWluc1BDKHVpbnQ2NF90IFBDKSBjb25zdCB7IHJldHVybiAoTG93UEMgPD0gUEMgJiYgUEMgPCBIaWdoUEMpOyB9CisgIH07CisKKyAgc3RydWN0IExpbmVUYWJsZSB7CisgICAgTGluZVRhYmxlKCk7CisKKyAgICAvLy8gUmVwcmVzZW50cyBhbiBpbnZhbGlkIHJvdworICAgIGNvbnN0IHVpbnQzMl90IFVua25vd25Sb3dJbmRleCA9IFVJTlQzMl9NQVg7CisKKyAgICB2b2lkIGFwcGVuZFJvdyhjb25zdCBEV0FSRkRlYnVnTGluZTo6Um93ICZSKSB7IFJvd3MucHVzaF9iYWNrKFIpOyB9CisKKyAgICB2b2lkIGFwcGVuZFNlcXVlbmNlKGNvbnN0IERXQVJGRGVidWdMaW5lOjpTZXF1ZW5jZSAmUykgeworICAgICAgU2VxdWVuY2VzLnB1c2hfYmFjayhTKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0aGUgaW5kZXggb2YgdGhlIHJvdyB3aXRoIGZpbGUvbGluZSBpbmZvIGZvciBhIGdpdmVuIGFkZHJlc3MsCisgICAgLy8vIG9yIFVua25vd25Sb3dJbmRleCBpZiB0aGVyZSBpcyBubyBzdWNoIHJvdy4KKyAgICB1aW50MzJfdCBsb29rdXBBZGRyZXNzKHVpbnQ2NF90IEFkZHJlc3MpIGNvbnN0OworCisgICAgYm9vbCBsb29rdXBBZGRyZXNzUmFuZ2UodWludDY0X3QgQWRkcmVzcywgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gJlJlc3VsdCkgY29uc3Q7CisKKyAgICBib29sIGhhc0ZpbGVBdEluZGV4KHVpbnQ2NF90IEZpbGVJbmRleCkgY29uc3Q7CisKKyAgICAvLy8gRXh0cmFjdHMgZmlsZW5hbWUgYnkgaXRzIGluZGV4IGluIGZpbGVuYW1lIHRhYmxlIGluIHByb2xvZ3VlLgorICAgIC8vLyBSZXR1cm5zIHRydWUgb24gc3VjY2Vzcy4KKyAgICBib29sIGdldEZpbGVOYW1lQnlJbmRleCh1aW50NjRfdCBGaWxlSW5kZXgsIGNvbnN0IGNoYXIgKkNvbXBEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElMaW5lSW5mb1NwZWNpZmllcjo6RmlsZUxpbmVJbmZvS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZSZXN1bHQpIGNvbnN0OworCisgICAgLy8vIEZpbGxzIHRoZSBSZXN1bHQgYXJndW1lbnQgd2l0aCB0aGUgZmlsZSBhbmQgbGluZSBpbmZvcm1hdGlvbgorICAgIC8vLyBjb3JyZXNwb25kaW5nIHRvIEFkZHJlc3MuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgorICAgIGJvb2wgZ2V0RmlsZUxpbmVJbmZvRm9yQWRkcmVzcyh1aW50NjRfdCBBZGRyZXNzLCBjb25zdCBjaGFyICpDb21wRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUxpbmVJbmZvU3BlY2lmaWVyOjpGaWxlTGluZUluZm9LaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJTGluZUluZm8gJlJlc3VsdCkgY29uc3Q7CisKKyAgICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCBESUR1bXBPcHRpb25zIER1bXBPcHRpb25zKSBjb25zdDsKKyAgICB2b2lkIGNsZWFyKCk7CisKKyAgICAvLy8gUGFyc2UgcHJvbG9ndWUgYW5kIGFsbCByb3dzLgorICAgIGJvb2wgcGFyc2UoRFdBUkZEYXRhRXh0cmFjdG9yICZEZWJ1Z0xpbmVEYXRhLCB1aW50MzJfdCAqT2Zmc2V0UHRyLAorICAgICAgICAgICAgICAgY29uc3QgRFdBUkZDb250ZXh0ICZDdHgsIGNvbnN0IERXQVJGVW5pdCAqVSwKKyAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICpPUyA9IG51bGxwdHIpOworCisgICAgdXNpbmcgUm93VmVjdG9yID0gc3RkOjp2ZWN0b3I8Um93PjsKKyAgICB1c2luZyBSb3dJdGVyID0gUm93VmVjdG9yOjpjb25zdF9pdGVyYXRvcjsKKyAgICB1c2luZyBTZXF1ZW5jZVZlY3RvciA9IHN0ZDo6dmVjdG9yPFNlcXVlbmNlPjsKKyAgICB1c2luZyBTZXF1ZW5jZUl0ZXIgPSBTZXF1ZW5jZVZlY3Rvcjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgICBzdHJ1Y3QgUHJvbG9ndWUgUHJvbG9ndWU7CisgICAgUm93VmVjdG9yIFJvd3M7CisgICAgU2VxdWVuY2VWZWN0b3IgU2VxdWVuY2VzOworCisgIHByaXZhdGU6CisgICAgdWludDMyX3QgZmluZFJvd0luU2VxKGNvbnN0IERXQVJGRGVidWdMaW5lOjpTZXF1ZW5jZSAmU2VxLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBBZGRyZXNzKSBjb25zdDsKKyAgICBPcHRpb25hbDxTdHJpbmdSZWY+IGdldFNvdXJjZUJ5SW5kZXgodWludDY0X3QgRmlsZUluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUxpbmVJbmZvU3BlY2lmaWVyOjpGaWxlTGluZUluZm9LaW5kIEtpbmQpIGNvbnN0OworICB9OworCisgIGNvbnN0IExpbmVUYWJsZSAqZ2V0TGluZVRhYmxlKHVpbnQzMl90IE9mZnNldCkgY29uc3Q7CisgIGNvbnN0IExpbmVUYWJsZSAqZ2V0T3JQYXJzZUxpbmVUYWJsZShEV0FSRkRhdGFFeHRyYWN0b3IgJkRlYnVnTGluZURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBPZmZzZXQsIGNvbnN0IERXQVJGQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGVW5pdCAqVSk7CisKK3ByaXZhdGU6CisgIHN0cnVjdCBQYXJzaW5nU3RhdGUgeworICAgIFBhcnNpbmdTdGF0ZShzdHJ1Y3QgTGluZVRhYmxlICpMVCk7CisKKyAgICB2b2lkIHJlc2V0Um93QW5kU2VxdWVuY2UoKTsKKyAgICB2b2lkIGFwcGVuZFJvd1RvTWF0cml4KHVpbnQzMl90IE9mZnNldCk7CisKKyAgICAvLy8gTGluZSB0YWJsZSB3ZSdyZSBjdXJyZW50bHkgcGFyc2luZy4KKyAgICBzdHJ1Y3QgTGluZVRhYmxlICpMaW5lVGFibGU7CisgICAgLy8vIFRoZSByb3cgbnVtYmVyIHRoYXQgc3RhcnRzIGF0IHplcm8gZm9yIHRoZSBwcm9sb2d1ZSwgYW5kIGluY3JlYXNlcyBmb3IKKyAgICAvLy8gZWFjaCByb3cgYWRkZWQgdG8gdGhlIG1hdHJpeC4KKyAgICB1bnNpZ25lZCBSb3dOdW1iZXIgPSAwOworICAgIHN0cnVjdCBSb3cgUm93OworICAgIHN0cnVjdCBTZXF1ZW5jZSBTZXF1ZW5jZTsKKyAgfTsKKworICB1c2luZyBMaW5lVGFibGVNYXBUeSA9IHN0ZDo6bWFwPHVpbnQzMl90LCBMaW5lVGFibGU+OworICB1c2luZyBMaW5lVGFibGVJdGVyID0gTGluZVRhYmxlTWFwVHk6Oml0ZXJhdG9yOworICB1c2luZyBMaW5lVGFibGVDb25zdEl0ZXIgPSBMaW5lVGFibGVNYXBUeTo6Y29uc3RfaXRlcmF0b3I7CisKKyAgTGluZVRhYmxlTWFwVHkgTGluZVRhYmxlTWFwOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGREVCVUdMSU5FX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdMb2MuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdMb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNmQzMTlhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z0xvYy5oCkBAIC0wLDAgKzEsMTEzIEBACisvLz09PS0gRFdBUkZEZWJ1Z0xvYy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGREVCVUdMT0NfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkRFQlVHTE9DX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRhdGFFeHRyYWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlJlbG9jTWFwLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgRFdBUkZVbml0OworY2xhc3MgTUNSZWdpc3RlckluZm87CitjbGFzcyByYXdfb3N0cmVhbTsKKworY2xhc3MgRFdBUkZEZWJ1Z0xvYyB7CitwdWJsaWM6CisgIC8vLyBBIHNpbmdsZSBsb2NhdGlvbiB3aXRoaW4gYSBsb2NhdGlvbiBsaXN0LgorICBzdHJ1Y3QgRW50cnkgeworICAgIC8vLyBUaGUgYmVnaW5uaW5nIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uIHJhbmdlLgorICAgIHVpbnQ2NF90IEJlZ2luOworICAgIC8vLyBUaGUgZW5kaW5nIGFkZHJlc3Mgb2YgdGhlIGluc3RydWN0aW9uIHJhbmdlLgorICAgIHVpbnQ2NF90IEVuZDsKKyAgICAvLy8gVGhlIGxvY2F0aW9uIG9mIHRoZSB2YXJpYWJsZSB3aXRoaW4gdGhlIHNwZWNpZmllZCByYW5nZS4KKyAgICBTbWFsbFZlY3RvcjxjaGFyLCA0PiBMb2M7CisgIH07CisKKyAgLy8vIEEgbGlzdCBvZiBsb2NhdGlvbnMgdGhhdCBjb250YWluIG9uZSB2YXJpYWJsZS4KKyAgc3RydWN0IExvY2F0aW9uTGlzdCB7CisgICAgLy8vIFRoZSBiZWdpbm5pbmcgb2Zmc2V0IHdoZXJlIHRoaXMgbG9jYXRpb24gbGlzdCBpcyBzdG9yZWQgaW4gdGhlIGRlYnVnX2xvYworICAgIC8vLyBzZWN0aW9uLgorICAgIHVuc2lnbmVkIE9mZnNldDsKKyAgICAvLy8gQWxsIHRoZSBsb2NhdGlvbnMgaW4gd2hpY2ggdGhlIHZhcmlhYmxlIGlzIHN0b3JlZC4KKyAgICBTbWFsbFZlY3RvcjxFbnRyeSwgMj4gRW50cmllczsKKyAgICAvLy8gRHVtcCB0aGlzIGxpc3Qgb24gT1MuCisgICAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUywgYm9vbCBJc0xpdHRsZUVuZGlhbiwgdW5zaWduZWQgQWRkcmVzc1NpemUsCisgICAgICAgICAgICAgIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICpNUkksIHVuc2lnbmVkIEluZGVudCkgY29uc3Q7CisgIH07CisKK3ByaXZhdGU6CisgIHVzaW5nIExvY2F0aW9uTGlzdHMgPSBTbWFsbFZlY3RvcjxMb2NhdGlvbkxpc3QsIDQ+OworCisgIC8vLyBBIGxpc3Qgb2YgYWxsIHRoZSB2YXJpYWJsZXMgaW4gdGhlIGRlYnVnX2xvYyBzZWN0aW9uLCBlYWNoIG9uZSBkZXNjcmliaW5nCisgIC8vLyB0aGUgbG9jYXRpb25zIGluIHdoaWNoIHRoZSB2YXJpYWJsZSBpcyBzdG9yZWQuCisgIExvY2F0aW9uTGlzdHMgTG9jYXRpb25zOworCisgIHVuc2lnbmVkIEFkZHJlc3NTaXplOworCisgIGJvb2wgSXNMaXR0bGVFbmRpYW47CisKK3B1YmxpYzoKKyAgLy8vIFByaW50IHRoZSBsb2NhdGlvbiBsaXN0cyBmb3VuZCB3aXRoaW4gdGhlIGRlYnVnX2xvYyBzZWN0aW9uLgorICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNQ1JlZ2lzdGVySW5mbyAqUmVnSW5mbywKKyAgICAgICAgICAgIE9wdGlvbmFsPHVpbnQ2NF90PiBPZmZzZXQpIGNvbnN0OworCisgIC8vLyBQYXJzZSB0aGUgZGVidWdfbG9jIHNlY3Rpb24gYWNjZXNzaWJsZSB2aWEgdGhlICdkYXRhJyBwYXJhbWV0ZXIgdXNpbmcgdGhlCisgIC8vLyBhZGRyZXNzIHNpemUgYWxzbyBnaXZlbiBpbiAnZGF0YScgdG8gaW50ZXJwcmV0IHRoZSBhZGRyZXNzIHJhbmdlcy4KKyAgdm9pZCBwYXJzZShjb25zdCBEV0FSRkRhdGFFeHRyYWN0b3IgJmRhdGEpOworCisgIC8vLyBSZXR1cm4gdGhlIGxvY2F0aW9uIGxpc3QgYXQgdGhlIGdpdmVuIG9mZnNldCBvciBudWxscHRyLgorICBMb2NhdGlvbkxpc3QgY29uc3QgKmdldExvY2F0aW9uTGlzdEF0T2Zmc2V0KHVpbnQ2NF90IE9mZnNldCkgY29uc3Q7CisKKyAgT3B0aW9uYWw8TG9jYXRpb25MaXN0PiBwYXJzZU9uZUxvY2F0aW9uTGlzdChEV0FSRkRhdGFFeHRyYWN0b3IgRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqT2Zmc2V0KTsKK307CisKK2NsYXNzIERXQVJGRGVidWdMb2NEV08geworcHVibGljOgorICBzdHJ1Y3QgRW50cnkgeworICAgIHVpbnQ2NF90IFN0YXJ0OworICAgIHVpbnQzMl90IExlbmd0aDsKKyAgICBTbWFsbFZlY3RvcjxjaGFyLCA0PiBMb2M7CisgIH07CisKKyAgc3RydWN0IExvY2F0aW9uTGlzdCB7CisgICAgdW5zaWduZWQgT2Zmc2V0OworICAgIFNtYWxsVmVjdG9yPEVudHJ5LCAyPiBFbnRyaWVzOworICAgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MsIGJvb2wgSXNMaXR0bGVFbmRpYW4sIHVuc2lnbmVkIEFkZHJlc3NTaXplLAorICAgICAgICAgICAgICBjb25zdCBNQ1JlZ2lzdGVySW5mbyAqUmVnSW5mbywgdW5zaWduZWQgSW5kZW50KSBjb25zdDsKKyAgfTsKKworcHJpdmF0ZToKKyAgdXNpbmcgTG9jYXRpb25MaXN0cyA9IFNtYWxsVmVjdG9yPExvY2F0aW9uTGlzdCwgND47CisKKyAgTG9jYXRpb25MaXN0cyBMb2NhdGlvbnM7CisKKyAgdW5zaWduZWQgQWRkcmVzc1NpemU7CisKKyAgYm9vbCBJc0xpdHRsZUVuZGlhbjsKKworcHVibGljOgorICB2b2lkIHBhcnNlKERhdGFFeHRyYWN0b3IgZGF0YSk7CisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICpSZWdJbmZvLAorICAgICAgICAgICAgT3B0aW9uYWw8dWludDY0X3Q+IE9mZnNldCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgbG9jYXRpb24gbGlzdCBhdCB0aGUgZ2l2ZW4gb2Zmc2V0IG9yIG51bGxwdHIuCisgIExvY2F0aW9uTGlzdCBjb25zdCAqZ2V0TG9jYXRpb25MaXN0QXRPZmZzZXQodWludDY0X3QgT2Zmc2V0KSBjb25zdDsKKworICBzdGF0aWMgT3B0aW9uYWw8TG9jYXRpb25MaXN0PiBwYXJzZU9uZUxvY2F0aW9uTGlzdChEYXRhRXh0cmFjdG9yIERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICpPZmZzZXQpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGREVCVUdMT0NfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z01hY3JvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnTWFjcm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmUyZmMzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z01hY3JvLmgKQEAgLTAsMCArMSw2MyBAQAorLy89PT0tIERXQVJGRGVidWdNYWNyby5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkRFQlVHTUFDUk9fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkRFQlVHTUFDUk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YUV4dHJhY3Rvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK2NsYXNzIERXQVJGRGVidWdNYWNybyB7CisgIC8vLyBBIHNpbmdsZSBtYWNybyBlbnRyeSB3aXRoaW4gYSBtYWNybyBsaXN0LgorICBzdHJ1Y3QgRW50cnkgeworICAgIC8vLyBUaGUgdHlwZSBvZiB0aGUgbWFjcm8gZW50cnkuCisgICAgdWludDMyX3QgVHlwZTsKKyAgICB1bmlvbiB7CisgICAgICAvLy8gVGhlIHNvdXJjZSBsaW5lIHdoZXJlIHRoZSBtYWNybyBpcyBkZWZpbmVkLgorICAgICAgdWludDY0X3QgTGluZTsKKyAgICAgIC8vLyBWZW5kb3IgZXh0ZW5zaW9uIGNvbnN0YW50IHZhbHVlLgorICAgICAgdWludDY0X3QgRXh0Q29uc3RhbnQ7CisgICAgfTsKKworICAgIHVuaW9uIHsKKyAgICAgIC8vLyBUaGUgc3RyaW5nIChuYW1lLCB2YWx1ZSkgb2YgdGhlIG1hY3JvIGVudHJ5LgorICAgICAgY29uc3QgY2hhciAqTWFjcm9TdHI7CisgICAgICAvLyBBbiB1bnNpZ25lZCBpbnRlZ2VyIGluZGljYXRpbmcgdGhlIGlkZW50aXR5IG9mIHRoZSBzb3VyY2UgZmlsZS4KKyAgICAgIHVpbnQ2NF90IEZpbGU7CisgICAgICAvLy8gVmVuZG9yIGV4dGVuc2lvbiBzdHJpbmcuCisgICAgICBjb25zdCBjaGFyICpFeHRTdHI7CisgICAgfTsKKyAgfTsKKworICB1c2luZyBNYWNyb0xpc3QgPSBTbWFsbFZlY3RvcjxFbnRyeSwgND47CisKKyAgLy8vIEEgbGlzdCBvZiBhbGwgdGhlIG1hY3JvIGVudHJpZXMgaW4gdGhlIGRlYnVnX21hY2luZm8gc2VjdGlvbi4KKyAgTWFjcm9MaXN0IE1hY3JvczsKKworcHVibGljOgorICBEV0FSRkRlYnVnTWFjcm8oKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFByaW50IHRoZSBtYWNybyBsaXN0IGZvdW5kIHdpdGhpbiB0aGUgZGVidWdfbWFjaW5mbyBzZWN0aW9uLgorICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLy8gUGFyc2UgdGhlIGRlYnVnX21hY2luZm8gc2VjdGlvbiBhY2Nlc3NpYmxlIHZpYSB0aGUgJ2RhdGEnIHBhcmFtZXRlci4KKyAgdm9pZCBwYXJzZShEYXRhRXh0cmFjdG9yIGRhdGEpOworCisgIC8vLyBSZXR1cm4gd2hldGhlciB0aGUgc2VjdGlvbiBoYXMgYW55IGVudHJpZXMuCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBNYWNyb3MuZW1wdHkoKTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGREVCVUdNQUNST19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnUHViVGFibGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdQdWJUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MTg3MWQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnUHViVGFibGUuaApAQCAtMCwwICsxLDc5IEBACisvLz09PS0gRFdBUkZEZWJ1Z1B1YlRhYmxlLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGREVCVUdQVUJUQUJMRV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGREVCVUdQVUJUQUJMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vLyBSZXByZXNlbnRzIHN0cnVjdHVyZSBmb3IgaG9sZGluZyBhbmQgcGFyc2luZyAuZGVidWdfcHViKiB0YWJsZXMuCitjbGFzcyBEV0FSRkRlYnVnUHViVGFibGUgeworcHVibGljOgorICBzdHJ1Y3QgRW50cnkgeworICAgIC8vLyBTZWN0aW9uIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQuCisgICAgdWludDMyX3QgU2VjT2Zmc2V0OworCisgICAgLy8vIEFuIGVudHJ5IG9mIHRoZSB2YXJpb3VzIGdudV9wdWIqIGRlYnVnIHNlY3Rpb25zLgorICAgIGR3YXJmOjpQdWJJbmRleEVudHJ5RGVzY3JpcHRvciBEZXNjcmlwdG9yOworCisgICAgLy8vIFRoZSBuYW1lIG9mIHRoZSBvYmplY3QgYXMgZ2l2ZW4gYnkgdGhlIERXX0FUX25hbWUgYXR0cmlidXRlIG9mIHRoZQorICAgIC8vLyByZWZlcmVuY2VkIERJRS4KKyAgICBjb25zdCBjaGFyICpOYW1lOworICB9OworCisgIC8vLyBFYWNoIHRhYmxlIGNvbnNpc3RzIG9mIHNldHMgb2YgdmFyaWFibGUgbGVuZ3RoIGVudHJpZXMuIEVhY2ggc2V0IGRlc2NyaWJlcworICAvLy8gdGhlIG5hbWVzIG9mIGdsb2JhbCBvYmplY3RzIGFuZCBmdW5jdGlvbnMsIG9yIGdsb2JhbCB0eXBlcywgcmVzcGVjdGl2ZWx5LAorICAvLy8gd2hvc2UgZGVmaW5pdGlvbnMgYXJlIHJlcHJlc2VudGVkIGJ5IGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBlbnRyaWVzIG93bmVkCisgIC8vLyBieSBhIHNpbmdsZSBjb21waWxhdGlvbiB1bml0LgorICBzdHJ1Y3QgU2V0IHsKKyAgICAvLy8gVGhlIHRvdGFsIGxlbmd0aCBvZiB0aGUgZW50cmllcyBmb3IgdGhhdCBzZXQsIG5vdCBpbmNsdWRpbmcgdGhlIGxlbmd0aAorICAgIC8vLyBmaWVsZCBpdHNlbGYuCisgICAgdWludDMyX3QgTGVuZ3RoOworCisgICAgLy8vIFRoaXMgbnVtYmVyIGlzIHNwZWNpZmljIHRvIHRoZSBuYW1lIGxvb2t1cCB0YWJsZSBhbmQgaXMgaW5kZXBlbmRlbnQgb2YKKyAgICAvLy8gdGhlIERXQVJGIHZlcnNpb24gbnVtYmVyLgorICAgIHVpbnQxNl90IFZlcnNpb247CisKKyAgICAvLy8gVGhlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24gb2YgdGhlCisgICAgLy8vIGNvbXBpbGF0aW9uIHVuaXQgaGVhZGVyIHJlZmVyZW5jZWQgYnkgdGhlIHNldC4KKyAgICB1aW50MzJfdCBPZmZzZXQ7CisKKyAgICAvLy8gVGhlIHNpemUgaW4gYnl0ZXMgb2YgdGhlIGNvbnRlbnRzIG9mIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uIGdlbmVyYXRlZAorICAgIC8vLyB0byByZXByZXNlbnQgdGhhdCBjb21waWxhdGlvbiB1bml0LgorICAgIHVpbnQzMl90IFNpemU7CisKKyAgICBzdGQ6OnZlY3RvcjxFbnRyeT4gRW50cmllczsKKyAgfTsKKworcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8U2V0PiBTZXRzOworCisgIC8vLyBnbnUgc3R5bGVkIHRhYmxlcyBjb250YWlucyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uLgorICAvLy8gVGhpcyBmbGFnIGRldGVybWluZXMgd2hldGhlciBvciBub3Qgc2VjdGlvbiB3ZSBwYXJzZSBpcyBkZWJ1Z19nbnUqIHRhYmxlLgorICBib29sIEdudVN0eWxlOworCitwdWJsaWM6CisgIERXQVJGRGVidWdQdWJUYWJsZShTdHJpbmdSZWYgRGF0YSwgYm9vbCBMaXR0bGVFbmRpYW4sIGJvb2wgR251U3R5bGUpOworCisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIEFycmF5UmVmPFNldD4gZ2V0RGF0YSgpIHsgcmV0dXJuIFNldHM7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkRFQlVHUFVCVEFCTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z1JhbmdlTGlzdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z1JhbmdlTGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4YjdmMjIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnUmFuZ2VMaXN0LmgKQEAgLTAsMCArMSw4NiBAQAorLy89PT0tIERXQVJGRGVidWdSYW5nZUxpc3QuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkRFQlVHUkFOR0VMSVNUX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZERUJVR1JBTkdFTElTVF9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkFkZHJlc3NSYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGF0YUV4dHJhY3Rvci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworc3RydWN0IEJhc2VBZGRyZXNzOworY2xhc3MgcmF3X29zdHJlYW07CisKK2NsYXNzIERXQVJGRGVidWdSYW5nZUxpc3QgeworcHVibGljOgorICBzdHJ1Y3QgUmFuZ2VMaXN0RW50cnkgeworICAgIC8vLyBBIGJlZ2lubmluZyBhZGRyZXNzIG9mZnNldC4gVGhpcyBhZGRyZXNzIG9mZnNldCBoYXMgdGhlIHNpemUgb2YgYW4KKyAgICAvLy8gYWRkcmVzcyBhbmQgaXMgcmVsYXRpdmUgdG8gdGhlIGFwcGxpY2FibGUgYmFzZSBhZGRyZXNzIG9mIHRoZQorICAgIC8vLyBjb21waWxhdGlvbiB1bml0IHJlZmVyZW5jaW5nIHRoaXMgcmFuZ2UgbGlzdC4gSXQgbWFya3MgdGhlIGJlZ2lubmluZworICAgIC8vLyBvZiBhbiBhZGRyZXNzIHJhbmdlLgorICAgIHVpbnQ2NF90IFN0YXJ0QWRkcmVzczsKKyAgICAvLy8gQW4gZW5kaW5nIGFkZHJlc3Mgb2Zmc2V0LiBUaGlzIGFkZHJlc3Mgb2Zmc2V0IGFnYWluIGhhcyB0aGUgc2l6ZSBvZgorICAgIC8vLyBhbiBhZGRyZXNzIGFuZCBpcyByZWxhdGl2ZSB0byB0aGUgYXBwbGljYWJsZSBiYXNlIGFkZHJlc3Mgb2YgdGhlCisgICAgLy8vIGNvbXBpbGF0aW9uIHVuaXQgcmVmZXJlbmNpbmcgdGhpcyByYW5nZSBsaXN0LiBJdCBtYXJrcyB0aGUgZmlyc3QKKyAgICAvLy8gYWRkcmVzcyBwYXN0IHRoZSBlbmQgb2YgdGhlIGFkZHJlc3MgcmFuZ2UuIFRoZSBlbmRpbmcgYWRkcmVzcyBtdXN0CisgICAgLy8vIGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgYmVnaW5uaW5nIGFkZHJlc3MuCisgICAgdWludDY0X3QgRW5kQWRkcmVzczsKKyAgICAvLy8gQSBzZWN0aW9uIGluZGV4IHRoaXMgcmFuZ2UgYmVsb25ncyB0by4KKyAgICB1aW50NjRfdCBTZWN0aW9uSW5kZXg7CisKKyAgICAvLy8gVGhlIGVuZCBvZiBhbnkgZ2l2ZW4gcmFuZ2UgbGlzdCBpcyBtYXJrZWQgYnkgYW4gZW5kIG9mIGxpc3QgZW50cnksCisgICAgLy8vIHdoaWNoIGNvbnNpc3RzIG9mIGEgMCBmb3IgdGhlIGJlZ2lubmluZyBhZGRyZXNzIG9mZnNldAorICAgIC8vLyBhbmQgYSAwIGZvciB0aGUgZW5kaW5nIGFkZHJlc3Mgb2Zmc2V0LgorICAgIGJvb2wgaXNFbmRPZkxpc3RFbnRyeSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoU3RhcnRBZGRyZXNzID09IDApICYmIChFbmRBZGRyZXNzID09IDApOworICAgIH0KKworICAgIC8vLyBBIGJhc2UgYWRkcmVzcyBzZWxlY3Rpb24gZW50cnkgY29uc2lzdHMgb2Y6CisgICAgLy8vIDEuIFRoZSB2YWx1ZSBvZiB0aGUgbGFyZ2VzdCByZXByZXNlbnRhYmxlIGFkZHJlc3Mgb2Zmc2V0CisgICAgLy8vIChmb3IgZXhhbXBsZSwgMHhmZmZmZmZmZiB3aGVuIHRoZSBzaXplIG9mIGFuIGFkZHJlc3MgaXMgMzIgYml0cykuCisgICAgLy8vIDIuIEFuIGFkZHJlc3MsIHdoaWNoIGRlZmluZXMgdGhlIGFwcHJvcHJpYXRlIGJhc2UgYWRkcmVzcyBmb3IKKyAgICAvLy8gdXNlIGluIGludGVycHJldGluZyB0aGUgYmVnaW5uaW5nIGFuZCBlbmRpbmcgYWRkcmVzcyBvZmZzZXRzIG9mCisgICAgLy8vIHN1YnNlcXVlbnQgZW50cmllcyBvZiB0aGUgbG9jYXRpb24gbGlzdC4KKyAgICBib29sIGlzQmFzZUFkZHJlc3NTZWxlY3Rpb25FbnRyeSh1aW50OF90IEFkZHJlc3NTaXplKSBjb25zdCB7CisgICAgICBhc3NlcnQoQWRkcmVzc1NpemUgPT0gNCB8fCBBZGRyZXNzU2l6ZSA9PSA4KTsKKyAgICAgIGlmIChBZGRyZXNzU2l6ZSA9PSA0KQorICAgICAgICByZXR1cm4gU3RhcnRBZGRyZXNzID09IC0xVTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFN0YXJ0QWRkcmVzcyA9PSAtMVVMTDsKKyAgICB9CisgIH07CisKK3ByaXZhdGU6CisgIC8vLyBPZmZzZXQgaW4gLmRlYnVnX3JhbmdlcyBzZWN0aW9uLgorICB1aW50MzJfdCBPZmZzZXQ7CisgIHVpbnQ4X3QgQWRkcmVzc1NpemU7CisgIHN0ZDo6dmVjdG9yPFJhbmdlTGlzdEVudHJ5PiBFbnRyaWVzOworCitwdWJsaWM6CisgIERXQVJGRGVidWdSYW5nZUxpc3QoKSB7IGNsZWFyKCk7IH0KKworICB2b2lkIGNsZWFyKCk7CisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICBib29sIGV4dHJhY3QoY29uc3QgRFdBUkZEYXRhRXh0cmFjdG9yICZkYXRhLCB1aW50MzJfdCAqb2Zmc2V0X3B0cik7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPFJhbmdlTGlzdEVudHJ5PiAmZ2V0RW50cmllcygpIHsgcmV0dXJuIEVudHJpZXM7IH0KKworICAvLy8gZ2V0QWJzb2x1dGVSYW5nZXMgLSBSZXR1cm5zIGFic29sdXRlIGFkZHJlc3MgcmFuZ2VzIGRlZmluZWQgYnkgdGhpcyByYW5nZQorICAvLy8gbGlzdC4gSGFzIHRvIGJlIHBhc3NlZCBiYXNlIGFkZHJlc3Mgb2YgdGhlIGNvbXBpbGUgdW5pdCByZWZlcmVuY2luZyB0aGlzCisgIC8vLyByYW5nZSBsaXN0LgorICBEV0FSRkFkZHJlc3NSYW5nZXNWZWN0b3IKKyAgZ2V0QWJzb2x1dGVSYW5nZXMobGx2bTo6T3B0aW9uYWw8QmFzZUFkZHJlc3M+IEJhc2VBZGRyKSBjb25zdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRkRFQlVHUkFOR0VMSVNUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdSbmdsaXN0cy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z1JuZ2xpc3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzU3OWRlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdSbmdsaXN0cy5oCkBAIC0wLDAgKzEsODEgQEAKKy8vPT09LSBEV0FSRkRlYnVnUm5nbGlzdHMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fRFdBUkZERUJVR1JOR0xJU1RTX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fRFdBUkZERUJVR1JOR0xJU1RTX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RJQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGF0YUV4dHJhY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGVidWdSYW5nZUxpc3QuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBFcnJvcjsKK2NsYXNzIHJhd19vc3RyZWFtOworCitjbGFzcyBEV0FSRkRlYnVnUm5nbGlzdHMgeworcHJpdmF0ZToKKyAgc3RydWN0IEhlYWRlciB7CisgICAgLy8vIFRoZSB0b3RhbCBsZW5ndGggb2YgdGhlIGVudHJpZXMgZm9yIHRoaXMgdGFibGUsIG5vdCBpbmNsdWRpbmcgdGhlIGxlbmd0aAorICAgIC8vLyBmaWVsZCBpdHNlbGYuCisgICAgdWludDMyX3QgTGVuZ3RoID0gMDsKKyAgICAvLy8gVGhlIERXQVJGIHZlcnNpb24gbnVtYmVyLgorICAgIHVpbnQxNl90IFZlcnNpb247CisgICAgLy8vIFRoZSBzaXplIGluIGJ5dGVzIG9mIGFuIGFkZHJlc3Mgb24gdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuIEZvcgorICAgIC8vLyBzZWdtZW50ZWQgYWRkcmVzc2luZywgdGhpcyBpcyB0aGUgc2l6ZSBvZiB0aGUgb2Zmc2V0IHBvcnRpb24gb2YgdGhlCisgICAgLy8vIGFkZHJlc3MuCisgICAgdWludDhfdCBBZGRyU2l6ZTsKKyAgICAvLy8gVGhlIHNpemUgaW4gYnl0ZXMgb2YgYSBzZWdtZW50IHNlbGVjdG9yIG9uIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLgorICAgIC8vLyBJZiB0aGUgdGFyZ2V0IHN5c3RlbSB1c2VzIGEgZmxhdCBhZGRyZXNzIHNwYWNlLCB0aGlzIHZhbHVlIGlzIDAuCisgICAgdWludDhfdCBTZWdTaXplOworICAgIC8vLyBUaGUgbnVtYmVyIG9mIG9mZnNldHMgdGhhdCBmb2xsb3cgdGhlIGhlYWRlciBiZWZvcmUgdGhlIHJhbmdlIGxpc3RzLgorICAgIHVpbnQzMl90IE9mZnNldEVudHJ5Q291bnQ7CisgIH07CisKK3B1YmxpYzoKKyAgc3RydWN0IFJhbmdlTGlzdEVudHJ5IHsKKyAgICAvLy8gVGhlIG9mZnNldCBhdCB3aGljaCB0aGUgZW50cnkgaXMgbG9jYXRlZCBpbiB0aGUgc2VjdGlvbi4KKyAgICBjb25zdCB1aW50MzJfdCBPZmZzZXQ7CisgICAgLy8vIFRoZSBEV0FSRiBlbmNvZGluZyAoRFdfUkxFXyopLgorICAgIGNvbnN0IHVpbnQ4X3QgRW50cnlLaW5kOworICAgIC8vLyBUaGUgdmFsdWVzIG1ha2luZyB1cCB0aGUgcmFuZ2UgbGlzdCBlbnRyeS4gTW9zdCByZXByZXNlbnQgYSByYW5nZSB3aXRoCisgICAgLy8vIGEgc3RhcnQgYW5kIGVuZCBhZGRyZXNzIG9yIGEgc3RhcnQgYWRkcmVzcyBhbmQgYSBsZW5ndGguIE90aGVycyBhcmUKKyAgICAvLy8gc2luZ2xlIHZhbHVlIGJhc2UgYWRkcmVzc2VzIG9yIGVuZC1vZi1saXN0IHdpdGggbm8gdmFsdWVzLiBUaGUgdW5uZWVkZWQKKyAgICAvLy8gdmFsdWVzIGFyZSBzZW1hbnRpY2FsbHkgdW5kZWZpbmVkLCBidXQgaW5pdGlhbGl6ZWQgdG8gMC4KKyAgICBjb25zdCB1aW50NjRfdCBWYWx1ZTA7CisgICAgY29uc3QgdWludDY0X3QgVmFsdWUxOworICB9OworCisgIHVzaW5nIERXQVJGUmFuZ2VMaXN0ID0gc3RkOjp2ZWN0b3I8UmFuZ2VMaXN0RW50cnk+OworCitwcml2YXRlOgorICB1aW50MzJfdCBIZWFkZXJPZmZzZXQ7CisgIEhlYWRlciBIZWFkZXJEYXRhOworICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gT2Zmc2V0czsKKyAgc3RkOjp2ZWN0b3I8RFdBUkZSYW5nZUxpc3Q+IFJhbmdlczsKKyAgLy8gVGhlIGxlbmd0aCBvZiB0aGUgbG9uZ2VzdCBlbmNvZGluZyBzdHJpbmcgd2UgZW5jb3VudGVyZWQgZHVyaW5nIHBhcnNpbmcuCisgIHVpbnQ4X3QgTWF4RW5jb2RpbmdTdHJpbmdMZW5ndGggPSAwOworCitwdWJsaWM6CisgIHZvaWQgY2xlYXIoKTsKKyAgRXJyb3IgZXh0cmFjdChEV0FSRkRhdGFFeHRyYWN0b3IgRGF0YSwgdWludDMyX3QgKk9mZnNldFB0cik7CisgIHVpbnQzMl90IGdldEhlYWRlck9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIEhlYWRlck9mZnNldDsgfQorICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCBESUR1bXBPcHRpb25zIER1bXBPcHRzKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoaXMgdGFibGUsIGluY2x1ZGluZyB0aGUgbGVuZ3RoIGZpZWxkLCBvciAwIGlmIHRoZQorICAvLy8gbGVuZ3RoIGhhcyBub3QgYmVlbiBkZXRlcm1pbmVkIChlLmcuIGJlY2F1c2UgdGhlIHRhYmxlIGhhcyBub3QgeWV0IGJlZW4KKyAgLy8vIHBhcnNlZCwgb3IgdGhlcmUgd2FzIGEgcHJvYmxlbSBpbiBwYXJzaW5nKS4KKyAgdWludDMyX3QgbGVuZ3RoKCkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fRFdBUkZERUJVR1JOR0xJU1RTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGllLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRpZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5YTNkZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRpZS5oCkBAIC0wLDAgKzEsMzUzIEBACisvLz09PS0gRFdBUkZEaWUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0RXQVJGRElFX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fRFdBUkZESUVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RJQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGQWRkcmVzc1JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZBdHRyaWJ1dGUuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnSW5mb0VudHJ5LmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIERXQVJGVW5pdDsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFV0aWxpdHkgY2xhc3MgdGhhdCBjYXJyaWVzIHRoZSBEV0FSRiBjb21waWxlL3R5cGUgdW5pdCBhbmQgdGhlIGRlYnVnIGluZm8KKy8vLyBlbnRyeSBpbiBhbiBvYmplY3QuCisvLy8KKy8vLyBXaGVuIGFjY2Vzc2luZyBpbmZvcm1hdGlvbiBmcm9tIGEgZGVidWcgaW5mbyBlbnRyeSB3ZSBhbHdheXMgbmVlZCB0byBEV0FSRgorLy8vIGNvbXBpbGUvdHlwZSB1bml0IGluIG9yZGVyIHRvIGV4dHJhY3QgdGhlIGluZm8gY29ycmVjdGx5IGFzIHNvbWUgaW5mb3JtYXRpb24KKy8vLyBpcyByZWxhdGl2ZSB0byB0aGUgY29tcGlsZS90eXBlIHVuaXQuIFByaW9yIHRvIHRoaXMgY2xhc3MgdGhlIERXQVJGVW5pdCBhbmQKKy8vLyB0aGUgRFdBUkZEZWJ1Z0luZm9FbnRyeSB3YXMgcGFzc2VkIGFyb3VuZCBzZXBhcmF0ZWx5IGFuZCB0aGVyZSB3YXMgdGhlCisvLy8gcG9zc2liaWxpdHkgZm9yIGVycm9yIGlmIHRoZSB3cm9uZyBEV0FSRlVuaXQgd2FzIHVzZWQgdG8gZXh0cmFjdCBhIHVuaXQKKy8vLyByZWxhdGl2ZSBvZmZzZXQuIFRoaXMgY2xhc3MgaGVscHMgdG8gZW5zdXJlIHRoYXQgdGhpcyBkb2Vzbid0IGhhcHBlbiBhbmQKKy8vLyBhbHNvIHNpbXBsaWZpZXMgdGhlIGF0dHJpYnV0ZSBleHRyYWN0aW9uIGNhbGxzIGJ5IG5vdCBoYXZpbmcgdG8gc3BlY2lmeSB0aGUKKy8vLyBEV0FSRlVuaXQgZm9yIGVhY2ggY2FsbC4KK2NsYXNzIERXQVJGRGllIHsKKyAgRFdBUkZVbml0ICpVID0gbnVsbHB0cjsKKyAgY29uc3QgRFdBUkZEZWJ1Z0luZm9FbnRyeSAqRGllID0gbnVsbHB0cjsKKworcHVibGljOgorICBEV0FSRkRpZSgpID0gZGVmYXVsdDsKKyAgRFdBUkZEaWUoRFdBUkZVbml0ICpVbml0LCBjb25zdCBEV0FSRkRlYnVnSW5mb0VudHJ5ICogRCkgOiBVKFVuaXQpLCBEaWUoRCkge30KKworICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBVICYmIERpZTsgfQorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gaXNWYWxpZCgpOyB9CisgIGNvbnN0IERXQVJGRGVidWdJbmZvRW50cnkgKmdldERlYnVnSW5mb0VudHJ5KCkgY29uc3QgeyByZXR1cm4gRGllOyB9CisgIERXQVJGVW5pdCAqZ2V0RHdhcmZVbml0KCkgY29uc3QgeyByZXR1cm4gVTsgfQorCisgIC8vLyBHZXQgdGhlIGFiYnJldmlhdGlvbiBkZWNsYXJhdGlvbiBmb3IgdGhpcyBESUUuCisgIC8vLworICAvLy8gXHJldHVybnMgdGhlIGFiYnJldmlhdGlvbiBkZWNsYXJhdGlvbiBvciBOVUxMIGZvciBudWxsIHRhZ3MuCisgIGNvbnN0IERXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb24gKmdldEFiYnJldmlhdGlvbkRlY2xhcmF0aW9uUHRyKCkgY29uc3QgeworICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIm11c3QgY2hlY2sgdmFsaWRpdHkgcHJpb3IgdG8gY2FsbGluZyIpOworICAgIHJldHVybiBEaWUtPmdldEFiYnJldmlhdGlvbkRlY2xhcmF0aW9uUHRyKCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBhYnNvbHV0ZSBvZmZzZXQgaW50byB0aGUgZGVidWcgaW5mbyBvciB0eXBlcyBzZWN0aW9uLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSBESUUgb2Zmc2V0IG9yIC0xVSBpZiBpbnZhbGlkLgorICB1aW50MzJfdCBnZXRPZmZzZXQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAibXVzdCBjaGVjayB2YWxpZGl0eSBwcmlvciB0byBjYWxsaW5nIik7CisgICAgcmV0dXJuIERpZS0+Z2V0T2Zmc2V0KCk7CisgIH0KKworICBkd2FyZjo6VGFnIGdldFRhZygpIGNvbnN0IHsKKyAgICBhdXRvIEFiYnJldkRlY2wgPSBnZXRBYmJyZXZpYXRpb25EZWNsYXJhdGlvblB0cigpOworICAgIGlmIChBYmJyZXZEZWNsKQorICAgICAgcmV0dXJuIEFiYnJldkRlY2wtPmdldFRhZygpOworICAgIHJldHVybiBkd2FyZjo6RFdfVEFHX251bGw7CisgIH0KKworICBib29sIGhhc0NoaWxkcmVuKCkgY29uc3QgeworICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIm11c3QgY2hlY2sgdmFsaWRpdHkgcHJpb3IgdG8gY2FsbGluZyIpOworICAgIHJldHVybiBEaWUtPmhhc0NoaWxkcmVuKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGZvciBhIHZhbGlkIERJRSB0aGF0IHRlcm1pbmF0ZXMgYSBzaWJsaW5nIGNoYWluLgorICBib29sIGlzTlVMTCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QWJicmV2aWF0aW9uRGVjbGFyYXRpb25QdHIoKSA9PSBudWxscHRyOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBESUUgcmVwcmVzZW50cyBhIHN1YnByb2dyYW0gKG5vdCBpbmxpbmVkKS4KKyAgYm9vbCBpc1N1YnByb2dyYW1ESUUoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIERJRSByZXByZXNlbnRzIGEgc3VicHJvZ3JhbSBvciBhbiBpbmxpbmVkIHN1YnJvdXRpbmUuCisgIGJvb2wgaXNTdWJyb3V0aW5lRElFKCkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgcGFyZW50IG9mIHRoaXMgRElFIG9iamVjdC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHZhbGlkIERXQVJGRGllIGluc3RhbmNlIGlmIHRoaXMgb2JqZWN0IGhhcyBhIHBhcmVudCBvciBhbgorICAvLy8gaW52YWxpZCBEV0FSRkRpZSBpbnN0YW5jZSBpZiBpdCBkb2Vzbid0LgorICBEV0FSRkRpZSBnZXRQYXJlbnQoKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSBzaWJsaW5nIG9mIHRoaXMgRElFIG9iamVjdC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHZhbGlkIERXQVJGRGllIGluc3RhbmNlIGlmIHRoaXMgb2JqZWN0IGhhcyBhIHNpYmxpbmcgb3IgYW4KKyAgLy8vIGludmFsaWQgRFdBUkZEaWUgaW5zdGFuY2UgaWYgaXQgZG9lc24ndC4KKyAgRFdBUkZEaWUgZ2V0U2libGluZygpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIGZpcnN0IGNoaWxkIG9mIHRoaXMgRElFIG9iamVjdC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHZhbGlkIERXQVJGRGllIGluc3RhbmNlIGlmIHRoaXMgb2JqZWN0IGhhcyBjaGlsZHJlbiBvciBhbgorICAvLy8gaW52YWxpZCBEV0FSRkRpZSBpbnN0YW5jZSBpZiBpdCBkb2Vzbid0LgorICBEV0FSRkRpZSBnZXRGaXJzdENoaWxkKCkgY29uc3Q7CisKKyAgLy8vIER1bXAgdGhlIERJRSBhbmQgYWxsIG9mIGl0cyBhdHRyaWJ1dGVzIHRvIHRoZSBzdXBwbGllZCBzdHJlYW0uCisgIC8vLworICAvLy8gXHBhcmFtIE9TIHRoZSBzdHJlYW0gdG8gdXNlIGZvciBvdXRwdXQuCisgIC8vLyBccGFyYW0gaW5kZW50IHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byBpbmRlbnQgZWFjaCBsaW5lIHRoYXQgaXMgb3V0cHV0LgorICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBpbmRlbnQgPSAwLAorICAgICAgICAgICAgRElEdW1wT3B0aW9ucyBEdW1wT3B0cyA9IERJRHVtcE9wdGlvbnMoKSkgY29uc3Q7CisKKworICAvLy8gQ29udmVuaWVuY2UgemVyby1hcmd1bWVudCBvdmVybG9hZCBmb3IgZGVidWdnaW5nLgorICBMTFZNX0RVTVBfTUVUSE9EIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyBFeHRyYWN0IHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGZyb20gdGhpcyBESUUuCisgIC8vLworICAvLy8gRXh0cmFjdCBhbiBhdHRyaWJ1dGUgdmFsdWUgZnJvbSB0aGlzIERJRSBvbmx5LiBUaGlzIGNhbGwgZG9lc24ndCBsb29rCisgIC8vLyBmb3IgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpbiBhbnkgRFdfQVRfc3BlY2lmaWNhdGlvbiBvcgorICAvLy8gRFdfQVRfYWJzdHJhY3Rfb3JpZ2luIHJlZmVyZW5jZWQgRElFcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQXR0ciB0aGUgYXR0cmlidXRlIHRvIGV4dHJhY3QuCisgIC8vLyBccmV0dXJucyBhbiBvcHRpb25hbCBEV0FSRkZvcm1WYWx1ZSB0aGF0IHdpbGwgaGF2ZSB0aGUgZm9ybSB2YWx1ZSBpZiB0aGUKKyAgLy8vIGF0dHJpYnV0ZSB3YXMgc3VjY2Vzc2Z1bGx5IGV4dHJhY3RlZC4KKyAgT3B0aW9uYWw8RFdBUkZGb3JtVmFsdWU+IGZpbmQoZHdhcmY6OkF0dHJpYnV0ZSBBdHRyKSBjb25zdDsKKworICAvLy8gRXh0cmFjdCB0aGUgZmlyc3QgdmFsdWUgb2YgYW55IGF0dHJpYnV0ZSBpbiBBdHRycyBmcm9tIHRoaXMgRElFLgorICAvLy8KKyAgLy8vIEV4dHJhY3QgdGhlIGZpcnN0IGF0dHJpYnV0ZSB0aGF0IG1hdGNoZXMgZnJvbSB0aGlzIERJRSBvbmx5LiBUaGlzIGNhbGwKKyAgLy8vIGRvZXNuJ3QgbG9vayBmb3IgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpbiBhbnkgRFdfQVRfc3BlY2lmaWNhdGlvbiBvcgorICAvLy8gRFdfQVRfYWJzdHJhY3Rfb3JpZ2luIHJlZmVyZW5jZWQgRElFcy4gVGhlIGF0dHJpYnV0ZXMgd2lsbCBiZSBzZWFyY2hlZAorICAvLy8gbGluZWFybHkgaW4gdGhlIG9yZGVyIHRoZXkgYXJlIHNwZWNpZmllZCB3aXRoaW4gQXR0cnMuCisgIC8vLworICAvLy8gXHBhcmFtIEF0dHJzIGFuIGFycmF5IG9mIERXQVJGIGF0dHJpYnV0ZSB0byBsb29rIGZvci4KKyAgLy8vIFxyZXR1cm5zIGFuIG9wdGlvbmFsIHRoYXQgaGFzIGEgdmFsaWQgRFdBUkZGb3JtVmFsdWUgZm9yIHRoZSBmaXJzdAorICAvLy8gbWF0Y2hpbmcgYXR0cmlidXRlIGluIEF0dHJzLCBvciBOb25lIGlmIG5vbmUgb2YgdGhlIGF0dHJpYnV0ZXMgaW4gQXR0cnMKKyAgLy8vIGV4aXN0IGluIHRoaXMgRElFLgorICBPcHRpb25hbDxEV0FSRkZvcm1WYWx1ZT4gZmluZChBcnJheVJlZjxkd2FyZjo6QXR0cmlidXRlPiBBdHRycykgY29uc3Q7CisKKyAgLy8vIEV4dHJhY3QgdGhlIGZpcnN0IHZhbHVlIG9mIGFueSBhdHRyaWJ1dGUgaW4gQXR0cnMgZnJvbSB0aGlzIERJRSBhbmQKKyAgLy8vIHJlY3Vyc2UgaW50byBhbnkgRFdfQVRfc3BlY2lmaWNhdGlvbiBvciBEV19BVF9hYnN0cmFjdF9vcmlnaW4gcmVmZXJlbmNlZAorICAvLy8gRElFcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gQXR0cnMgYW4gYXJyYXkgb2YgRFdBUkYgYXR0cmlidXRlIHRvIGxvb2sgZm9yLgorICAvLy8gXHJldHVybnMgYW4gb3B0aW9uYWwgdGhhdCBoYXMgYSB2YWxpZCBEV0FSRkZvcm1WYWx1ZSBmb3IgdGhlIGZpcnN0CisgIC8vLyBtYXRjaGluZyBhdHRyaWJ1dGUgaW4gQXR0cnMsIG9yIE5vbmUgaWYgbm9uZSBvZiB0aGUgYXR0cmlidXRlcyBpbiBBdHRycworICAvLy8gZXhpc3QgaW4gdGhpcyBESUUgb3IgaW4gYW55IERXX0FUX3NwZWNpZmljYXRpb24gb3IgRFdfQVRfYWJzdHJhY3Rfb3JpZ2luCisgIC8vLyBESUVzLgorICBPcHRpb25hbDxEV0FSRkZvcm1WYWx1ZT4KKyAgZmluZFJlY3Vyc2l2ZWx5KEFycmF5UmVmPGR3YXJmOjpBdHRyaWJ1dGU+IEF0dHJzKSBjb25zdDsKKworICAvLy8gRXh0cmFjdCB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBmcm9tIHRoaXMgRElFIGFzIHRoZSByZWZlcmVuY2VkIERJRS4KKyAgLy8vCisgIC8vLyBSZWdhcmRsZXNzIG9mIHRoZSByZWZlcmVuY2UgdHlwZSwgcmV0dXJuIHRoZSBjb3JyZWN0IERXQVJGRGllIGluc3RhbmNlIGlmCisgIC8vLyB0aGUgYXR0cmlidXRlIGV4aXN0cy4gVGhlIHJldHVybmVkIERXQVJGRGllIG9iamVjdCBtaWdodCBiZSBmcm9tIGFub3RoZXIKKyAgLy8vIERXQVJGVW5pdCwgYnV0IHRoYXQgaXMgYWxsIGVuY2Fwc3VsYXRlZCBpbiB0aGUgbmV3IERXQVJGRGllIG9iamVjdC4KKyAgLy8vCisgIC8vLyBFeHRyYWN0IGFuIGF0dHJpYnV0ZSB2YWx1ZSBmcm9tIHRoaXMgRElFIG9ubHkuIFRoaXMgY2FsbCBkb2Vzbid0IGxvb2sKKyAgLy8vIGZvciB0aGUgYXR0cmlidXRlIHZhbHVlIGluIGFueSBEV19BVF9zcGVjaWZpY2F0aW9uIG9yCisgIC8vLyBEV19BVF9hYnN0cmFjdF9vcmlnaW4gcmVmZXJlbmNlZCBESUVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBBdHRyIHRoZSBhdHRyaWJ1dGUgdG8gZXh0cmFjdC4KKyAgLy8vIFxyZXR1cm5zIGEgdmFsaWQgRFdBUkZEaWUgaW5zdGFuY2UgaWYgdGhlIGF0dHJpYnV0ZSBleGlzdHMsIG9yIGFuIGludmFsaWQKKyAgLy8vIERXQVJGRGllIG9iamVjdCBpZiBpdCBkb2Vzbid0LgorICBEV0FSRkRpZSBnZXRBdHRyaWJ1dGVWYWx1ZUFzUmVmZXJlbmNlZERpZShkd2FyZjo6QXR0cmlidXRlIEF0dHIpIGNvbnN0OworCisgIC8vLyBFeHRyYWN0IHRoZSByYW5nZSBiYXNlIGF0dHJpYnV0ZSBmcm9tIHRoaXMgRElFIGFzIGFic29sdXRlIHNlY3Rpb24gb2Zmc2V0LgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYSB1dGlsaXR5IGZ1bmN0aW9uIHRoYXQgY2hlY2tzIGZvciBlaXRoZXIgdGhlIERXX0FUX3JuZ2xpc3RzX2Jhc2UKKyAgLy8vIG9yIERXX0FUX0dOVV9yYW5nZXNfYmFzZSBhdHRyaWJ1dGUuCisgIC8vLworICAvLy8gXHJldHVybnMgYW5tIG9wdGlvbmFsIGFic29sdXRlIHNlY3Rpb24gb2Zmc2V0IHZhbHVlIGZvciB0aGUgYXR0cmlidXRlLgorICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0UmFuZ2VzQmFzZUF0dHJpYnV0ZSgpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIERXX0FUX2hpZ2hfcGMgYXR0cmlidXRlIHZhbHVlIGFzIGFuIGFkZHJlc3MuCisgIC8vLworICAvLy8gSW4gRFdBUkYgdmVyc2lvbiA0IGFuZCBsYXRlciB0aGUgaGlnaCBQQyBjYW4gYmUgZW5jb2RlZCBhcyBhbiBvZmZzZXQgZnJvbQorICAvLy8gdGhlIERXX0FUX2xvd19wYy4gVGhpcyBmdW5jdGlvbiB0YWtlcyBjYXJlIG9mIGV4dHJhY3RpbmcgdGhlIHZhbHVlIGFzIGFuCisgIC8vLyBhZGRyZXNzIG9yIG9mZnNldCBhbmQgYWRkcyBpdCB0byB0aGUgbG93IFBDIGlmIG5lZWRlZCBhbmQgcmV0dXJucyB0aGUKKyAgLy8vIHZhbHVlIGFzIGFuIG9wdGlvbmFsIGluIGNhc2UgdGhlIERJRSBkb2Vzbid0IGhhdmUgYSBEV19BVF9oaWdoX3BjCisgIC8vLyBhdHRyaWJ1dGUuCisgIC8vLworICAvLy8gXHBhcmFtIExvd1BDIHRoZSBsb3cgUEMgdGhhdCBtaWdodCBiZSBuZWVkZWQgdG8gY2FsY3VsYXRlIHRoZSBoaWdoIFBDLgorICAvLy8gXHJldHVybnMgYW4gb3B0aW9uYWwgYWRkcmVzcyB2YWx1ZSBmb3IgdGhlIGF0dHJpYnV0ZS4KKyAgT3B0aW9uYWw8dWludDY0X3Q+IGdldEhpZ2hQQyh1aW50NjRfdCBMb3dQQykgY29uc3Q7CisKKyAgLy8vIFJldHJpZXZlcyBEV19BVF9sb3dfcGMgYW5kIERXX0FUX2hpZ2hfcGMgZnJvbSBDVS4KKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBib3RoIGF0dHJpYnV0ZXMgYXJlIHByZXNlbnQuCisgIGJvb2wgZ2V0TG93QW5kSGlnaFBDKHVpbnQ2NF90ICZMb3dQQywgdWludDY0X3QgJkhpZ2hQQywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgJlNlY3Rpb25JbmRleCkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgYWRkcmVzcyByYW5nZXMgZm9yIHRoaXMgRElFLgorICAvLy8KKyAgLy8vIEdldCB0aGUgaGkvbG93IFBDIHJhbmdlIGlmIGJvdGggYXR0cmlidXRlcyBhcmUgYXZhaWxhYmxlIG9yIGV4cnRyYWN0cyB0aGUKKyAgLy8vIG5vbi1jb250aWd1b3VzIGFkZHJlc3MgcmFuZ2VzIGZyb20gdGhlIERXX0FUX3JhbmdlcyBhdHRyaWJ1dGUuCisgIC8vLworICAvLy8gRXh0cmFjdHMgdGhlIHJhbmdlIGluZm9ybWF0aW9uIGZyb20gdGhpcyBESUUgb25seS4gVGhpcyBjYWxsIGRvZXNuJ3QgbG9vaworICAvLy8gZm9yIHRoZSByYW5nZSBpbiBhbnkgRFdfQVRfc3BlY2lmaWNhdGlvbiBvciBEV19BVF9hYnN0cmFjdF9vcmlnaW4gRElFcy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIGFkZHJlc3MgcmFuZ2UgdmVjdG9yIHRoYXQgbWlnaHQgYmUgZW1wdHkgaWYgbm8gYWRkcmVzcyByYW5nZQorICAvLy8gaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLgorICBEV0FSRkFkZHJlc3NSYW5nZXNWZWN0b3IgZ2V0QWRkcmVzc1JhbmdlcygpIGNvbnN0OworCisgIC8vLyBHZXQgYWxsIGFkZHJlc3MgcmFuZ2VzIGZvciBhbnkgRFdfVEFHX3N1YnByb2dyYW0gRElFcyBpbiB0aGlzIERJRSBvciBhbnkKKyAgLy8vIG9mIGl0cyBjaGlsZHJlbi4KKyAgLy8vCisgIC8vLyBHZXQgdGhlIGhpL2xvdyBQQyByYW5nZSBpZiBib3RoIGF0dHJpYnV0ZXMgYXJlIGF2YWlsYWJsZSBvciBleHJ0cmFjdHMgdGhlCisgIC8vLyBub24tY29udGlndW91cyBhZGRyZXNzIHJhbmdlcyBmcm9tIHRoZSBEV19BVF9yYW5nZXMgYXR0cmlidXRlIGZvciB0aGlzIERJRQorICAvLy8gYW5kIGFsbCBjaGlsZHJlbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gUmFuZ2VzIHRoZSBhZGRyZXMgcmFuZ2UgdmVjdG9yIHRvIGZpbGwgaW4uCisgIHZvaWQgY29sbGVjdENoaWxkcmVuQWRkcmVzc1JhbmdlcyhEV0FSRkFkZHJlc3NSYW5nZXNWZWN0b3IgJlJhbmdlcykgY29uc3Q7CisKKyAgYm9vbCBhZGRyZXNzUmFuZ2VDb250YWluc0FkZHJlc3MoY29uc3QgdWludDY0X3QgQWRkcmVzcykgY29uc3Q7CisKKyAgLy8vIElmIGEgRElFIHJlcHJlc2VudHMgYSBzdWJwcm9ncmFtIChvciBpbmxpbmVkIHN1YnJvdXRpbmUpLCByZXR1cm5zIGl0cworICAvLy8gbWFuZ2xlZCBuYW1lIChvciBzaG9ydCBuYW1lLCBpZiBtYW5nbGVkIGlzIG1pc3NpbmcpLiBUaGlzIG5hbWUgbWF5IGJlCisgIC8vLyBmZXRjaGVkIGZyb20gc3BlY2lmaWNhdGlvbiBvciBhYnN0cmFjdCBvcmlnaW4gZm9yIHRoaXMgc3VicHJvZ3JhbS4KKyAgLy8vIFJldHVybnMgbnVsbCBpZiBubyBuYW1lIGlzIGZvdW5kLgorICBjb25zdCBjaGFyICpnZXRTdWJyb3V0aW5lTmFtZShESU5hbWVLaW5kIEtpbmQpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIERJRSBuYW1lIHJlc29sdmluZyBEV19BVF9zZXBjaWZpY2F0aW9uIG9yIERXX0FUX2Fic3RyYWN0X29yaWdpbgorICAvLy8gcmVmZXJlbmNlcyBpZiBuZWNlc3NhcnkuIFJldHVybnMgbnVsbCBpZiBubyBuYW1lIGlzIGZvdW5kLgorICBjb25zdCBjaGFyICpnZXROYW1lKERJTmFtZUtpbmQgS2luZCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIGRlY2xhcmF0aW9uIGxpbmUgKHN0YXJ0IGxpbmUpIGZvciBhIERJRSwgYXNzdW1pbmcgaXQgc3BlY2lmaWVzCisgIC8vLyBhIHN1YnByb2dyYW0uIFRoaXMgbWF5IGJlIGZldGNoZWQgZnJvbSBzcGVjaWZpY2F0aW9uIG9yIGFic3RyYWN0IG9yaWdpbgorICAvLy8gZm9yIHRoaXMgc3VicHJvZ3JhbSBieSByZXNvbHZpbmcgRFdfQVRfc2VwY2lmaWNhdGlvbiBvcgorICAvLy8gRFdfQVRfYWJzdHJhY3Rfb3JpZ2luIHJlZmVyZW5jZXMgaWYgbmVjZXNzYXJ5LgorICB1aW50NjRfdCBnZXREZWNsTGluZSgpIGNvbnN0OworCisgIC8vLyBSZXRyaWV2ZXMgdmFsdWVzIG9mIERXX0FUX2NhbGxfZmlsZSwgRFdfQVRfY2FsbF9saW5lIGFuZCBEV19BVF9jYWxsX2NvbHVtbgorICAvLy8gZnJvbSBESUUgKG9yIHplcm9lcyBpZiB0aGV5IGFyZSBtaXNzaW5nKS4gVGhpcyBmdW5jdGlvbiBsb29rcyBmb3IKKyAgLy8vIERXX0FUX2NhbGwgYXR0cmlidXRlcyBpbiB0aGlzIERJRSBvbmx5LCBpdCB3aWxsIG5vdCByZXNvbHZlIHRoZSBhdHRyaWJ1dGUKKyAgLy8vIHZhbHVlcyBpbiBhbnkgRFdfQVRfc3BlY2lmaWNhdGlvbiBvciBEV19BVF9hYnN0cmFjdF9vcmlnaW4gRElFcy4KKyAgLy8vIFxwYXJhbSBDYWxsRmlsZSBmaWxsZWQgaW4gd2l0aCBub24temVybyBpZiBzdWNjZXNzZnVsLCB6ZXJvIGlmIHRoZXJlIGlzIG5vCisgIC8vLyBEV19BVF9jYWxsX2ZpbGUgYXR0cmlidXRlIGluIHRoaXMgRElFLgorICAvLy8gXHBhcmFtIENhbGxMaW5lIGZpbGxlZCBpbiB3aXRoIG5vbi16ZXJvIGlmIHN1Y2Nlc3NmdWwsIHplcm8gaWYgdGhlcmUgaXMgbm8KKyAgLy8vIERXX0FUX2NhbGxfbGluZSBhdHRyaWJ1dGUgaW4gdGhpcyBESUUuCisgIC8vLyBccGFyYW0gQ2FsbENvbHVtbiBmaWxsZWQgaW4gd2l0aCBub24temVybyBpZiBzdWNjZXNzZnVsLCB6ZXJvIGlmIHRoZXJlIGlzCisgIC8vLyBubyBEV19BVF9jYWxsX2NvbHVtbiBhdHRyaWJ1dGUgaW4gdGhpcyBESUUuCisgIC8vLyBccGFyYW0gQ2FsbERpc2NyaW1pbmF0b3IgZmlsbGVkIGluIHdpdGggbm9uLXplcm8gaWYgc3VjY2Vzc2Z1bCwgemVybyBpZgorICAvLy8gdGhlcmUgaXMgbm8gRFdfQVRfR05VX2Rpc2NyaW1pbmF0b3IgYXR0cmlidXRlIGluIHRoaXMgRElFLgorICB2b2lkIGdldENhbGxlckZyYW1lKHVpbnQzMl90ICZDYWxsRmlsZSwgdWludDMyX3QgJkNhbGxMaW5lLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZDYWxsQ29sdW1uLCB1aW50MzJfdCAmQ2FsbERpc2NyaW1pbmF0b3IpIGNvbnN0OworCisgIGNsYXNzIGF0dHJpYnV0ZV9pdGVyYXRvcjsKKworICAvLy8gR2V0IGFuIGl0ZXJhdG9yIHJhbmdlIHRvIGFsbCBhdHRyaWJ1dGVzIGluIHRoZSBjdXJyZW50IERJRSBvbmx5LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGFuIGl0ZXJhdG9yIHJhbmdlIGZvciB0aGUgYXR0cmlidXRlcyBvZiB0aGUgY3VycmVudCBESUUuCisgIGl0ZXJhdG9yX3JhbmdlPGF0dHJpYnV0ZV9pdGVyYXRvcj4gYXR0cmlidXRlcygpIGNvbnN0OworCisgIGNsYXNzIGl0ZXJhdG9yOworCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0OworICBpdGVyYXRvcl9yYW5nZTxpdGVyYXRvcj4gY2hpbGRyZW4oKSBjb25zdDsKK307CisKK2NsYXNzIERXQVJGRGllOjphdHRyaWJ1dGVfaXRlcmF0b3IgOgorICAgIHB1YmxpYyBpdGVyYXRvcl9mYWNhZGVfYmFzZTxhdHRyaWJ1dGVfaXRlcmF0b3IsIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGQXR0cmlidXRlPiB7CisgIC8vLyBUaGUgRFdBUkYgRElFIHdlIGFyZSBleHRyYWN0aW5nIGF0dHJpYnV0ZXMgZnJvbS4KKyAgRFdBUkZEaWUgRGllOworICAvLy8gVGhlIHZhbHVlIHZlbmRlZCB0byBjbGllbnRzIHZpYSB0aGUgb3BlcmF0b3IqKCkgb3Igb3BlcmF0b3ItPigpLgorICBEV0FSRkF0dHJpYnV0ZSBBdHRyVmFsdWU7CisgIC8vLyBUaGUgYXR0cmlidXRlIGluZGV4IHdpdGhpbiB0aGUgYWJicmV2aWF0aW9uIGRlY2xhcmF0aW9uIGluIERpZS4KKyAgdWludDMyX3QgSW5kZXg7CisKKyAgLy8vIFVwZGF0ZSB0aGUgYXR0cmlidXRlIGluZGV4IGFuZCBhdHRlbXB0IHRvIHJlYWQgdGhlIGF0dHJpYnV0ZSB2YWx1ZS4gSWYgdGhlCisgIC8vLyBhdHRyaWJ1dGUgaXMgYWJsZSB0byBiZSByZWFkLCB1cGRhdGUgQXR0clZhbHVlIGFuZCB0aGUgSW5kZXggbWVtYmVyCisgIC8vLyB2YXJpYWJsZS4gSWYgdGhlIGF0dHJpYnV0ZSB2YWx1ZSBpcyBub3QgYWJsZSB0byBiZSByZWFkLCBhbiBhcHByb3ByaWF0ZQorICAvLy8gZXJyb3Igd2lsbCBiZSBzZXQgaWYgdGhlIEVyciBtZW1iZXIgdmFyaWFibGUgaXMgbm9uLU5VTEwgYW5kIHRoZSBpdGVyYXRvcgorICAvLy8gd2lsbCBiZSBzZXQgdG8gdGhlIGVuZCB2YWx1ZSBzbyBpdGVyYXRpb24gc3RvcHMuCisgIHZvaWQgdXBkYXRlRm9ySW5kZXgoY29uc3QgRFdBUkZBYmJyZXZpYXRpb25EZWNsYXJhdGlvbiAmQWJickRlY2wsIHVpbnQzMl90IEkpOworCitwdWJsaWM6CisgIGF0dHJpYnV0ZV9pdGVyYXRvcigpID0gZGVsZXRlOworICBleHBsaWNpdCBhdHRyaWJ1dGVfaXRlcmF0b3IoRFdBUkZEaWUgRCwgYm9vbCBFbmQpOworCisgIGF0dHJpYnV0ZV9pdGVyYXRvciAmb3BlcmF0b3IrKygpOworICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gQXR0clZhbHVlLmlzVmFsaWQoKTsgfQorICBjb25zdCBEV0FSRkF0dHJpYnV0ZSAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gQXR0clZhbHVlOyB9CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBhdHRyaWJ1dGVfaXRlcmF0b3IgJlgpIGNvbnN0IHsgcmV0dXJuIEluZGV4ID09IFguSW5kZXg7IH0KK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgRFdBUkZEaWUgJkxIUywgY29uc3QgRFdBUkZEaWUgJlJIUykgeworICByZXR1cm4gTEhTLmdldERlYnVnSW5mb0VudHJ5KCkgPT0gUkhTLmdldERlYnVnSW5mb0VudHJ5KCkgJiYKKyAgICAgIExIUy5nZXREd2FyZlVuaXQoKSA9PSBSSFMuZ2V0RHdhcmZVbml0KCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgRFdBUkZEaWUgJkxIUywgY29uc3QgRFdBUkZEaWUgJlJIUykgeworICByZXR1cm4gIShMSFMgPT0gUkhTKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IERXQVJGRGllICZMSFMsIGNvbnN0IERXQVJGRGllICZSSFMpIHsKKyAgcmV0dXJuIExIUy5nZXRPZmZzZXQoKSA8IFJIUy5nZXRPZmZzZXQoKTsKK30KKworY2xhc3MgRFdBUkZEaWU6Oml0ZXJhdG9yIDogcHVibGljIGl0ZXJhdG9yX2ZhY2FkZV9iYXNlPGl0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGRGllPiB7CisgIERXQVJGRGllIERpZTsKKyAgdm9pZCBza2lwTnVsbCgpIHsKKyAgICBpZiAoRGllICYmIERpZS5pc05VTEwoKSkKKyAgICAgIERpZSA9IERXQVJGRGllKCk7CisgIH0KK3B1YmxpYzoKKyAgaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgZXhwbGljaXQgaXRlcmF0b3IoRFdBUkZEaWUgRCkgOiBEaWUoRCkgeworICAgIC8vIElmIHdlIHN0YXJ0IG91dCB3aXRoIG9ubHkgYSBOdWxsIERJRSB0aGVuIGludmFsaWRhdGUuCisgICAgc2tpcE51bGwoKTsKKyAgfQorCisgIGl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgIERpZSA9IERpZS5nZXRTaWJsaW5nKCk7CisgICAgLy8gRG9uJ3QgaW5jbHVkZSB0aGUgTlVMTCBkaWUgd2hlbiBpdGVyYXRpbmcuCisgICAgc2tpcE51bGwoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gRGllLmlzVmFsaWQoKTsgfQorICBjb25zdCBEV0FSRkRpZSAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gRGllOyB9CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciAmWCkgY29uc3QgeyByZXR1cm4gRGllID09IFguRGllOyB9Cit9OworCisvLyBUaGVzZSBpbmxpbmUgZnVuY3Rpb25zIG11c3QgZm9sbG93IHRoZSBEV0FSRkRpZTo6aXRlcmF0b3IgZGVmaW5pdGlvbiBhYm92ZQorLy8gYXMgdGhleSB1c2UgZnVuY3Rpb25zIGZyb20gdGhhdCBjbGFzcy4KK2lubGluZSBEV0FSRkRpZTo6aXRlcmF0b3IgRFdBUkZEaWU6OmJlZ2luKCkgY29uc3QgeworICByZXR1cm4gaXRlcmF0b3IoZ2V0Rmlyc3RDaGlsZCgpKTsKK30KKworaW5saW5lIERXQVJGRGllOjppdGVyYXRvciBEV0FSRkRpZTo6ZW5kKCkgY29uc3QgeworICByZXR1cm4gaXRlcmF0b3IoKTsKK30KKworaW5saW5lIGl0ZXJhdG9yX3JhbmdlPERXQVJGRGllOjppdGVyYXRvcj4gRFdBUkZEaWU6OmNoaWxkcmVuKCkgY29uc3QgeworICByZXR1cm4gbWFrZV9yYW5nZShiZWdpbigpLCBlbmQoKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19EV0FSRkRJRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkV4cHJlc3Npb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRXhwcmVzc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYWQ2OGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkV4cHJlc3Npb24uaApAQCAtMCwwICsxLDE1MyBAQAorLy89PT0tLS0gRFdBUkZFeHByZXNzaW9uLmggLSBEV0FSRiBFeHByZXNzaW9uIGhhbmRsaW5nIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRkVYUFJFU1NJT05fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRkVYUFJFU1NJT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFFeHRyYWN0b3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgRFdBUkZVbml0OworY2xhc3MgTUNSZWdpc3RlckluZm87CitjbGFzcyByYXdfb3N0cmVhbTsKKworY2xhc3MgRFdBUkZFeHByZXNzaW9uIHsKK3B1YmxpYzoKKyAgY2xhc3MgaXRlcmF0b3I7CisKKyAgLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBPcGVyYXRpb24gaW4gdGhlIEV4cHJlc3Npb24uIEVhY2ggb3BlcmF0aW9uIGNhbgorICAvLy8gaGF2ZSB1cCB0byAyIG9wcmVyYW5kcy4KKyAgLy8vCisgIC8vLyBBbiBPcGVyYXRpb24gY2FuIGJlIGluIEVycm9yIHN0YXRlIChjaGVjayB3aXRoIGlzRXJyb3IoKSkuIFRoaXMKKyAgLy8vIG1lYW5zIHRoYXQgaXQgY291bGRuJ3QgYmUgZGVjb2RlZCBzdWNjZXNzZnVsbHkgYW5kIGlmIGl0IGlzIHRoZQorICAvLy8gY2FzZSwgYWxsIG90aGVycyBmaWVsZHMgY29udGFpbiB1bmRlZmluZWQgdmFsdWVzLgorICBjbGFzcyBPcGVyYXRpb24geworICBwdWJsaWM6CisgICAgLy8vIFNpemUgYW5kIHNpZ25lZG5lc3Mgb2YgZXhwcmVzc2lvbiBvcGVyYXRpb25zJyBvcGVyYW5kcy4KKyAgICBlbnVtIEVuY29kaW5nIDogdWludDhfdCB7CisgICAgICBTaXplMSA9IDAsCisgICAgICBTaXplMiA9IDEsCisgICAgICBTaXplNCA9IDIsCisgICAgICBTaXplOCA9IDMsCisgICAgICBTaXplTEVCID0gNCwKKyAgICAgIFNpemVBZGRyID0gNSwKKyAgICAgIFNpemVSZWZBZGRyID0gNiwKKyAgICAgIFNpemVCbG9jayA9IDcsIC8vLzwgUHJlY2VkaW5nIG9wZXJhbmQgY29udGFpbnMgYmxvY2sgc2l6ZQorICAgICAgU2lnbkJpdCA9IDB4OCwKKyAgICAgIFNpZ25lZFNpemUxID0gU2lnbkJpdCB8IFNpemUxLAorICAgICAgU2lnbmVkU2l6ZTIgPSBTaWduQml0IHwgU2l6ZTIsCisgICAgICBTaWduZWRTaXplNCA9IFNpZ25CaXQgfCBTaXplNCwKKyAgICAgIFNpZ25lZFNpemU4ID0gU2lnbkJpdCB8IFNpemU4LAorICAgICAgU2lnbmVkU2l6ZUxFQiA9IFNpZ25CaXQgfCBTaXplTEVCLAorICAgICAgU2l6ZU5BID0gMHhGRiAvLy88IFVudXNlZCBvcGVyYW5kcyBnZXQgdGhpcyBlbmNvZGluZy4KKyAgICB9OworCisgICAgZW51bSBEd2FyZlZlcnNpb24gOiB1aW50OF90IHsKKyAgICAgIER3YXJmTkEsIC8vLzwgU2VydmVzIGFzIGEgbWFya2VyIGZvciB1bnVzZWQgZW50cmllcworICAgICAgRHdhcmYyID0gMiwKKyAgICAgIER3YXJmMywKKyAgICAgIER3YXJmNAorICAgIH07CisKKyAgICAvLy8gRGVzY3JpcHRpb24gb2YgdGhlIGVuY29kaW5nIG9mIG9uZSBleHByZXNzaW9uIE9wLgorICAgIHN0cnVjdCBEZXNjcmlwdGlvbiB7CisgICAgICBEd2FyZlZlcnNpb24gVmVyc2lvbjsgLy8vPCBEd2FyZiB2ZXJzaW9uIHdoZXJlIHRoZSBPcCB3YXMgaW50cm9kdWNlZC4KKyAgICAgIEVuY29kaW5nIE9wWzJdOyAgICAgICAvLy88IEVuY29kaW5nIGZvciBPcCBvcGVyYW5kcywgb3IgU2l6ZU5BLgorCisgICAgICBEZXNjcmlwdGlvbihEd2FyZlZlcnNpb24gVmVyc2lvbiA9IER3YXJmTkEsIEVuY29kaW5nIE9wMSA9IFNpemVOQSwKKyAgICAgICAgICAgICAgICAgIEVuY29kaW5nIE9wMiA9IFNpemVOQSkKKyAgICAgICAgICA6IFZlcnNpb24oVmVyc2lvbikgeworICAgICAgICBPcFswXSA9IE9wMTsKKyAgICAgICAgT3BbMV0gPSBPcDI7CisgICAgICB9CisgICAgfTsKKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBEV0FSRkV4cHJlc3Npb246Oml0ZXJhdG9yOworICAgIHVpbnQ4X3QgT3Bjb2RlOyAvLy88IFRoZSBPcCBPcGNvZGUsIERXX09QXzxzb21ldGhpbmc+LgorICAgIERlc2NyaXB0aW9uIERlc2M7CisgICAgYm9vbCBFcnJvcjsKKyAgICB1aW50MzJfdCBFbmRPZmZzZXQ7CisgICAgdWludDY0X3QgT3BlcmFuZHNbMl07CisKKyAgcHVibGljOgorICAgIERlc2NyaXB0aW9uICZnZXREZXNjcmlwdGlvbigpIHsgcmV0dXJuIERlc2M7IH0KKyAgICB1aW50OF90IGdldENvZGUoKSB7IHJldHVybiBPcGNvZGU7IH0KKyAgICB1aW50NjRfdCBnZXRSYXdPcGVyYW5kKHVuc2lnbmVkIElkeCkgeyByZXR1cm4gT3BlcmFuZHNbSWR4XTsgfQorICAgIHVpbnQzMl90IGdldEVuZE9mZnNldCgpIHsgcmV0dXJuIEVuZE9mZnNldDsgfQorICAgIGJvb2wgZXh0cmFjdChEYXRhRXh0cmFjdG9yIERhdGEsIHVpbnQxNl90IFZlcnNpb24sIHVpbnQ4X3QgQWRkcmVzc1NpemUsCisgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9mZnNldCk7CisgICAgYm9vbCBpc0Vycm9yKCkgeyByZXR1cm4gRXJyb3I7IH0KKyAgICBib29sIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgRFdBUkZFeHByZXNzaW9uICpVLAorICAgICAgICAgICAgICAgY29uc3QgTUNSZWdpc3RlckluZm8gKlJlZ0luZm8sIGJvb2wgaXNFSCk7CisgIH07CisKKyAgLy8vIEFuIGl0ZXJhdG9yIHRvIGdvIHRocm91Z2ggdGhlIGV4cHJlc3Npb24gb3BlcmF0aW9ucy4KKyAgY2xhc3MgaXRlcmF0b3IKKyAgICAgIDogcHVibGljIGl0ZXJhdG9yX2ZhY2FkZV9iYXNlPGl0ZXJhdG9yLCBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uPiB7CisgICAgZnJpZW5kIGNsYXNzIERXQVJGRXhwcmVzc2lvbjsKKyAgICBjb25zdCBEV0FSRkV4cHJlc3Npb24gKkV4cHI7CisgICAgdWludDMyX3QgT2Zmc2V0OworICAgIE9wZXJhdGlvbiBPcDsKKyAgICBpdGVyYXRvcihjb25zdCBEV0FSRkV4cHJlc3Npb24gKkV4cHIsIHVpbnQzMl90IE9mZnNldCkKKyAgICAgICAgOiBFeHByKEV4cHIpLCBPZmZzZXQoT2Zmc2V0KSB7CisgICAgICBPcC5FcnJvciA9CisgICAgICAgICAgT2Zmc2V0ID49IEV4cHItPkRhdGEuZ2V0RGF0YSgpLnNpemUoKSB8fAorICAgICAgICAgICFPcC5leHRyYWN0KEV4cHItPkRhdGEsIEV4cHItPlZlcnNpb24sIEV4cHItPkFkZHJlc3NTaXplLCBPZmZzZXQpOworICAgIH0KKworICBwdWJsaWM6CisgICAgY2xhc3MgT3BlcmF0aW9uICZvcGVyYXRvcisrKCkgeworICAgICAgT2Zmc2V0ID0gT3AuaXNFcnJvcigpID8gRXhwci0+RGF0YS5nZXREYXRhKCkuc2l6ZSgpIDogT3AuRW5kT2Zmc2V0OworICAgICAgT3AuRXJyb3IgPQorICAgICAgICAgIE9mZnNldCA+PSBFeHByLT5EYXRhLmdldERhdGEoKS5zaXplKCkgfHwKKyAgICAgICAgICAhT3AuZXh0cmFjdChFeHByLT5EYXRhLCBFeHByLT5WZXJzaW9uLCBFeHByLT5BZGRyZXNzU2l6ZSwgT2Zmc2V0KTsKKyAgICAgIHJldHVybiBPcDsKKyAgICB9CisKKyAgICBjbGFzcyBPcGVyYXRpb24gJm9wZXJhdG9yKigpIHsKKyAgICAgIHJldHVybiBPcDsKKyAgICB9CisKKyAgICAvLyBDb21wYXJpc29uIG9wZXJhdG9ycyBhcmUgcHJvdmlkZWQgb3V0IG9mIGxpbmUuCisgICAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciAmLCBjb25zdCBpdGVyYXRvciAmKTsKKyAgfTsKKworICBEV0FSRkV4cHJlc3Npb24oRGF0YUV4dHJhY3RvciBEYXRhLCB1aW50MTZfdCBWZXJzaW9uLCB1aW50OF90IEFkZHJlc3NTaXplKQorICAgICAgOiBEYXRhKERhdGEpLCBWZXJzaW9uKFZlcnNpb24pLCBBZGRyZXNzU2l6ZShBZGRyZXNzU2l6ZSkgeworICAgIGFzc2VydChBZGRyZXNzU2l6ZSA9PSA4IHx8IEFkZHJlc3NTaXplID09IDQpOworICB9CisKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcih0aGlzLCAwKTsgfQorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcih0aGlzLCBEYXRhLmdldERhdGEoKS5zaXplKCkpOyB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICpSZWdJbmZvLAorICAgICAgICAgICAgIGJvb2wgSXNFSCA9IGZhbHNlKSBjb25zdDsKKworcHJpdmF0ZToKKyAgRGF0YUV4dHJhY3RvciBEYXRhOworICB1aW50MTZfdCBWZXJzaW9uOworICB1aW50OF90IEFkZHJlc3NTaXplOworfTsKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEV0FSRkV4cHJlc3Npb246Oml0ZXJhdG9yICZMSFMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGRXhwcmVzc2lvbjo6aXRlcmF0b3IgJlJIUykgeworICByZXR1cm4gTEhTLkV4cHIgPT0gUkhTLkV4cHIgJiYgTEhTLk9mZnNldCA9PSBSSFMuT2Zmc2V0OworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IERXQVJGRXhwcmVzc2lvbjo6aXRlcmF0b3IgJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRFdBUkZFeHByZXNzaW9uOjppdGVyYXRvciAmUkhTKSB7CisgIHJldHVybiAhKExIUyA9PSBSSFMpOworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkZvcm1WYWx1ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZGb3JtVmFsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjVmNzFjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZGb3JtVmFsdWUuaApAQCAtMCwwICsxLDI4OCBAQAorLy89PT0tIERXQVJGRm9ybVZhbHVlLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRkZPUk1WQUxVRV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0RXQVJGRk9STVZBTFVFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9ESUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRhdGFFeHRyYWN0b3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIERXQVJGQ29udGV4dDsKK2NsYXNzIERXQVJGVW5pdDsKK2NsYXNzIHJhd19vc3RyZWFtOworCitjbGFzcyBEV0FSRkZvcm1WYWx1ZSB7CitwdWJsaWM6CisgIGVudW0gRm9ybUNsYXNzIHsKKyAgICBGQ19Vbmtub3duLAorICAgIEZDX0FkZHJlc3MsCisgICAgRkNfQmxvY2ssCisgICAgRkNfQ29uc3RhbnQsCisgICAgRkNfU3RyaW5nLAorICAgIEZDX0ZsYWcsCisgICAgRkNfUmVmZXJlbmNlLAorICAgIEZDX0luZGlyZWN0LAorICAgIEZDX1NlY3Rpb25PZmZzZXQsCisgICAgRkNfRXhwcmxvYworICB9OworCitwcml2YXRlOgorICBzdHJ1Y3QgVmFsdWVUeXBlIHsKKyAgICBWYWx1ZVR5cGUoKSB7IHV2YWwgPSAwOyB9CisKKyAgICB1bmlvbiB7CisgICAgICB1aW50NjRfdCB1dmFsOworICAgICAgaW50NjRfdCBzdmFsOworICAgICAgY29uc3QgY2hhciAqY3N0cjsKKyAgICB9OworICAgIGNvbnN0IHVpbnQ4X3QgKmRhdGEgPSBudWxscHRyOworICAgIHVpbnQ2NF90IFNlY3Rpb25JbmRleDsgICAgICAvLy8gU2VjdGlvbiBpbmRleCBmb3IgcmVmZXJlbmNlIGZvcm1zLgorICB9OworCisgIGR3YXJmOjpGb3JtIEZvcm07ICAgICAgICAgICAgIC8vLyBGb3JtIGZvciB0aGlzIHZhbHVlLgorICBWYWx1ZVR5cGUgVmFsdWU7ICAgICAgICAgICAgICAvLy8gQ29udGFpbnMgYWxsIGRhdGEgZm9yIHRoZSBmb3JtLgorICBjb25zdCBEV0FSRlVuaXQgKlUgPSBudWxscHRyOyAvLy8gUmVtZW1iZXIgdGhlIERXQVJGVW5pdCBhdCBleHRyYWN0IHRpbWUuCisgIGNvbnN0IERXQVJGQ29udGV4dCAqQyA9IG51bGxwdHI7IC8vLyBDb250ZXh0IGZvciBleHRyYWN0IHRpbWUuCitwdWJsaWM6CisgIERXQVJGRm9ybVZhbHVlKGR3YXJmOjpGb3JtIEYgPSBkd2FyZjo6Rm9ybSgwKSkgOiBGb3JtKEYpIHt9CisKKyAgZHdhcmY6OkZvcm0gZ2V0Rm9ybSgpIGNvbnN0IHsgcmV0dXJuIEZvcm07IH0KKyAgdWludDY0X3QgZ2V0UmF3VVZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWUudXZhbDsgfQorICB1aW50NjRfdCBnZXRTZWN0aW9uSW5kZXgoKSBjb25zdCB7IHJldHVybiBWYWx1ZS5TZWN0aW9uSW5kZXg7IH0KKyAgdm9pZCBzZXRGb3JtKGR3YXJmOjpGb3JtIEYpIHsgRm9ybSA9IEY7IH0KKyAgdm9pZCBzZXRVVmFsdWUodWludDY0X3QgVikgeyBWYWx1ZS51dmFsID0gVjsgfQorICB2b2lkIHNldFNWYWx1ZShpbnQ2NF90IFYpIHsgVmFsdWUuc3ZhbCA9IFY7IH0KKyAgdm9pZCBzZXRQVmFsdWUoY29uc3QgY2hhciAqVikgeyBWYWx1ZS5jc3RyID0gVjsgfQorCisgIHZvaWQgc2V0QmxvY2tWYWx1ZShjb25zdCBBcnJheVJlZjx1aW50OF90PiAmRGF0YSkgeworICAgIFZhbHVlLmRhdGEgPSBEYXRhLmRhdGEoKTsKKyAgICBzZXRVVmFsdWUoRGF0YS5zaXplKCkpOworICB9CisKKyAgYm9vbCBpc0Zvcm1DbGFzcyhGb3JtQ2xhc3MgRkMpIGNvbnN0OworICBjb25zdCBEV0FSRlVuaXQgKmdldFVuaXQoKSBjb25zdCB7IHJldHVybiBVOyB9CisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MsIERJRHVtcE9wdGlvbnMgRHVtcE9wdHMgPSBESUR1bXBPcHRpb25zKCkpIGNvbnN0OworCisgIC8vLyBFeHRyYWN0cyBhIHZhbHVlIGluIFxwIERhdGEgYXQgb2Zmc2V0IFxwICpPZmZzZXRQdHIuIFRoZSBpbmZvcm1hdGlvbgorICAvLy8gaW4gXHAgRm9ybVBhcmFtcyBpcyBuZWVkZWQgdG8gaW50ZXJwcmV0IHNvbWUgZm9ybXMuIFRoZSBvcHRpb25hbAorICAvLy8gXHAgQ29udGV4dCBhbmQgXHAgVW5pdCBhbGxvd3MgZXh0cmFjdGluZyBpbmZvcm1hdGlvbiBpZiB0aGUgZm9ybSByZWZlcnMKKyAgLy8vIHRvIG90aGVyIHNlY3Rpb25zIChlLmcuLCAuZGVidWdfc3RyKS4KKyAgYm9vbCBleHRyYWN0VmFsdWUoY29uc3QgRFdBUkZEYXRhRXh0cmFjdG9yICZEYXRhLCB1aW50MzJfdCAqT2Zmc2V0UHRyLAorICAgICAgICAgICAgICAgICAgICBkd2FyZjo6Rm9ybVBhcmFtcyBGb3JtUGFyYW1zLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEV0FSRkNvbnRleHQgKkNvbnRleHQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEV0FSRlVuaXQgKlVuaXQgPSBudWxscHRyKTsKKworICBib29sIGV4dHJhY3RWYWx1ZShjb25zdCBEV0FSRkRhdGFFeHRyYWN0b3IgJkRhdGEsIHVpbnQzMl90ICpPZmZzZXRQdHIsCisgICAgICAgICAgICAgICAgICAgIGR3YXJmOjpGb3JtUGFyYW1zIEZvcm1QYXJhbXMsIGNvbnN0IERXQVJGVW5pdCAqVSkgeworICAgIHJldHVybiBleHRyYWN0VmFsdWUoRGF0YSwgT2Zmc2V0UHRyLCBGb3JtUGFyYW1zLCBudWxscHRyLCBVKTsKKyAgfQorCisgIGJvb2wgaXNJbmxpbmVkQ1N0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWUuZGF0YSAhPSBudWxscHRyICYmIFZhbHVlLmRhdGEgPT0gKGNvbnN0IHVpbnQ4X3QgKilWYWx1ZS5jc3RyOworICB9CisKKyAgLy8vIGdldEFzRm9vIGZ1bmN0aW9ucyBiZWxvdyByZXR1cm4gdGhlIGV4dHJhY3RlZCB2YWx1ZSBhcyBGb28gaWYgb25seQorICAvLy8gRFdBUkZGb3JtVmFsdWUgaGFzIGZvcm0gY2xhc3MgaXMgc3VpdGFibGUgZm9yIHJlcHJlc2VudGluZyBGb28uCisgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRBc1JlZmVyZW5jZSgpIGNvbnN0OworICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0QXNVbnNpZ25lZENvbnN0YW50KCkgY29uc3Q7CisgIE9wdGlvbmFsPGludDY0X3Q+IGdldEFzU2lnbmVkQ29uc3RhbnQoKSBjb25zdDsKKyAgT3B0aW9uYWw8Y29uc3QgY2hhciAqPiBnZXRBc0NTdHJpbmcoKSBjb25zdDsKKyAgT3B0aW9uYWw8dWludDY0X3Q+IGdldEFzQWRkcmVzcygpIGNvbnN0OworICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0QXNTZWN0aW9uT2Zmc2V0KCkgY29uc3Q7CisgIE9wdGlvbmFsPEFycmF5UmVmPHVpbnQ4X3Q+PiBnZXRBc0Jsb2NrKCkgY29uc3Q7CisgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRBc0NTdHJpbmdPZmZzZXQoKSBjb25zdDsKKyAgT3B0aW9uYWw8dWludDY0X3Q+IGdldEFzUmVmZXJlbmNlVVZhbCgpIGNvbnN0OworCisgIC8vLyBTa2lwIGEgZm9ybSdzIHZhbHVlIGluIFxwIERlYnVnSW5mb0RhdGEgYXQgdGhlIG9mZnNldCBzcGVjaWZpZWQgYnkKKyAgLy8vIFxwIE9mZnNldFB0ci4KKyAgLy8vCisgIC8vLyBTa2lwcyB0aGUgYnl0ZXMgZm9yIHRoZSBjdXJyZW50IGZvcm0gYW5kIHVwZGF0ZXMgdGhlIG9mZnNldC4KKyAgLy8vCisgIC8vLyBccGFyYW0gRGVidWdJbmZvRGF0YSBUaGUgZGF0YSB3aGVyZSB3ZSB3YW50IHRvIHNraXAgdGhlIHZhbHVlLgorICAvLy8gXHBhcmFtIE9mZnNldFB0ciBBIHJlZmVyZW5jZSB0byB0aGUgb2Zmc2V0IHRoYXQgd2lsbCBiZSB1cGRhdGVkLgorICAvLy8gXHBhcmFtIFBhcmFtcyBEV0FSRiBwYXJhbWV0ZXJzIHRvIGhlbHAgaW50ZXJwcmV0IGZvcm1zLgorICAvLy8gXHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiB0aGUgZm9ybSB3YXMgbm90IHNraXBwZWQuCisgIGJvb2wgc2tpcFZhbHVlKERhdGFFeHRyYWN0b3IgRGVidWdJbmZvRGF0YSwgdWludDMyX3QgKk9mZnNldFB0ciwKKyAgICAgICAgICAgICAgICAgY29uc3QgZHdhcmY6OkZvcm1QYXJhbXMgUGFyYW1zKSBjb25zdCB7CisgICAgcmV0dXJuIERXQVJGRm9ybVZhbHVlOjpza2lwVmFsdWUoRm9ybSwgRGVidWdJbmZvRGF0YSwgT2Zmc2V0UHRyLCBQYXJhbXMpOworICB9CisKKyAgLy8vIFNraXAgYSBmb3JtJ3MgdmFsdWUgaW4gXHAgRGVidWdJbmZvRGF0YSBhdCB0aGUgb2Zmc2V0IHNwZWNpZmllZCBieQorICAvLy8gXHAgT2Zmc2V0UHRyLgorICAvLy8KKyAgLy8vIFNraXBzIHRoZSBieXRlcyBmb3IgdGhlIHNwZWNpZmllZCBmb3JtIGFuZCB1cGRhdGVzIHRoZSBvZmZzZXQuCisgIC8vLworICAvLy8gXHBhcmFtIEZvcm0gVGhlIERXX0ZPUk0gZW51bWVyYXRpb24gdGhhdCBpbmRpY2F0ZXMgdGhlIGZvcm0gdG8gc2tpcC4KKyAgLy8vIFxwYXJhbSBEZWJ1Z0luZm9EYXRhIFRoZSBkYXRhIHdoZXJlIHdlIHdhbnQgdG8gc2tpcCB0aGUgdmFsdWUuCisgIC8vLyBccGFyYW0gT2Zmc2V0UHRyIEEgcmVmZXJlbmNlIHRvIHRoZSBvZmZzZXQgdGhhdCB3aWxsIGJlIHVwZGF0ZWQuCisgIC8vLyBccGFyYW0gRm9ybVBhcmFtcyBEV0FSRiBwYXJhbWV0ZXJzIHRvIGhlbHAgaW50ZXJwcmV0IGZvcm1zLgorICAvLy8gXHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLCBmYWxzZSBpZiB0aGUgZm9ybSB3YXMgbm90IHNraXBwZWQuCisgIHN0YXRpYyBib29sIHNraXBWYWx1ZShkd2FyZjo6Rm9ybSBGb3JtLCBEYXRhRXh0cmFjdG9yIERlYnVnSW5mb0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqT2Zmc2V0UHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZHdhcmY6OkZvcm1QYXJhbXMgRm9ybVBhcmFtcyk7CisKK3ByaXZhdGU6CisgIHZvaWQgZHVtcFN0cmluZyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworfTsKKworbmFtZXNwYWNlIGR3YXJmIHsKKworLy8vIFRha2UgYW4gb3B0aW9uYWwgRFdBUkZGb3JtVmFsdWUgYW5kIHRyeSB0byBleHRyYWN0IGEgc3RyaW5nIHZhbHVlIGZyb20gaXQuCisvLy8KKy8vLyBccGFyYW0gViBhbmQgb3B0aW9uYWwgRFdBUkZGb3JtVmFsdWUgdG8gYXR0ZW1wdCB0byBleHRyYWN0IHRoZSB2YWx1ZSBmcm9tLgorLy8vIFxyZXR1cm5zIGFuIG9wdGlvbmFsIHZhbHVlIHRoYXQgY29udGFpbnMgYSB2YWx1ZSBpZiB0aGUgZm9ybSB2YWx1ZQorLy8vIHdhcyB2YWxpZCBhbmQgd2FzIGEgc3RyaW5nLgoraW5saW5lIE9wdGlvbmFsPGNvbnN0IGNoYXIgKj4gdG9TdHJpbmcoY29uc3QgT3B0aW9uYWw8RFdBUkZGb3JtVmFsdWU+ICZWKSB7CisgIGlmIChWKQorICAgIHJldHVybiBWLT5nZXRBc0NTdHJpbmcoKTsKKyAgcmV0dXJuIE5vbmU7Cit9CisKKy8vLyBUYWtlIGFuIG9wdGlvbmFsIERXQVJGRm9ybVZhbHVlIGFuZCBleHRyYWN0IGEgc3RyaW5nIHZhbHVlIGZyb20gaXQuCisvLy8KKy8vLyBccGFyYW0gViBhbmQgb3B0aW9uYWwgRFdBUkZGb3JtVmFsdWUgdG8gYXR0ZW1wdCB0byBleHRyYWN0IHRoZSB2YWx1ZSBmcm9tLgorLy8vIFxwYXJhbSBEZWZhdWx0IHRoZSBkZWZhdWx0IHZhbHVlIHRvIHJldHVybiBpbiBjYXNlIG9mIGZhaWx1cmUuCisvLy8gXHJldHVybnMgdGhlIHN0cmluZyB2YWx1ZSBvciBEZWZhdWx0IGlmIHRoZSBWIGRvZXNuJ3QgaGF2ZSBhIHZhbHVlIG9yIHRoZQorLy8vIGZvcm0gdmFsdWUncyBlbmNvZGluZyB3YXNuJ3QgYSBzdHJpbmcuCitpbmxpbmUgY29uc3QgY2hhciAqdG9TdHJpbmcoY29uc3QgT3B0aW9uYWw8RFdBUkZGb3JtVmFsdWU+ICZWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkRlZmF1bHQpIHsKKyAgcmV0dXJuIHRvU3RyaW5nKFYpLmdldFZhbHVlT3IoRGVmYXVsdCk7Cit9CisKKy8vLyBUYWtlIGFuIG9wdGlvbmFsIERXQVJGRm9ybVZhbHVlIGFuZCB0cnkgdG8gZXh0cmFjdCBhbiB1bnNpZ25lZCBjb25zdGFudC4KKy8vLworLy8vIFxwYXJhbSBWIGFuZCBvcHRpb25hbCBEV0FSRkZvcm1WYWx1ZSB0byBhdHRlbXB0IHRvIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20uCisvLy8gXHJldHVybnMgYW4gb3B0aW9uYWwgdmFsdWUgdGhhdCBjb250YWlucyBhIHZhbHVlIGlmIHRoZSBmb3JtIHZhbHVlCisvLy8gd2FzIHZhbGlkIGFuZCBoYXMgYSB1bnNpZ25lZCBjb25zdGFudCBmb3JtLgoraW5saW5lIE9wdGlvbmFsPHVpbnQ2NF90PiB0b1Vuc2lnbmVkKGNvbnN0IE9wdGlvbmFsPERXQVJGRm9ybVZhbHVlPiAmVikgeworICBpZiAoVikKKyAgICByZXR1cm4gVi0+Z2V0QXNVbnNpZ25lZENvbnN0YW50KCk7CisgIHJldHVybiBOb25lOworfQorCisvLy8gVGFrZSBhbiBvcHRpb25hbCBEV0FSRkZvcm1WYWx1ZSBhbmQgZXh0cmFjdCBhIHVuc2lnbmVkIGNvbnN0YW50LgorLy8vCisvLy8gXHBhcmFtIFYgYW5kIG9wdGlvbmFsIERXQVJGRm9ybVZhbHVlIHRvIGF0dGVtcHQgdG8gZXh0cmFjdCB0aGUgdmFsdWUgZnJvbS4KKy8vLyBccGFyYW0gRGVmYXVsdCB0aGUgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaW4gY2FzZSBvZiBmYWlsdXJlLgorLy8vIFxyZXR1cm5zIHRoZSBleHRyYWN0ZWQgdW5zaWduZWQgdmFsdWUgb3IgRGVmYXVsdCBpZiB0aGUgViBkb2Vzbid0IGhhdmUgYQorLy8vIHZhbHVlIG9yIHRoZSBmb3JtIHZhbHVlJ3MgZW5jb2Rpbmcgd2Fzbid0IGFuIHVuc2lnbmVkIGNvbnN0YW50IGZvcm0uCitpbmxpbmUgdWludDY0X3QgdG9VbnNpZ25lZChjb25zdCBPcHRpb25hbDxEV0FSRkZvcm1WYWx1ZT4gJlYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBEZWZhdWx0KSB7CisgIHJldHVybiB0b1Vuc2lnbmVkKFYpLmdldFZhbHVlT3IoRGVmYXVsdCk7Cit9CisKKy8vLyBUYWtlIGFuIG9wdGlvbmFsIERXQVJGRm9ybVZhbHVlIGFuZCB0cnkgdG8gZXh0cmFjdCBhbiByZWZlcmVuY2UuCisvLy8KKy8vLyBccGFyYW0gViBhbmQgb3B0aW9uYWwgRFdBUkZGb3JtVmFsdWUgdG8gYXR0ZW1wdCB0byBleHRyYWN0IHRoZSB2YWx1ZSBmcm9tLgorLy8vIFxyZXR1cm5zIGFuIG9wdGlvbmFsIHZhbHVlIHRoYXQgY29udGFpbnMgYSB2YWx1ZSBpZiB0aGUgZm9ybSB2YWx1ZQorLy8vIHdhcyB2YWxpZCBhbmQgaGFzIGEgcmVmZXJlbmNlIGZvcm0uCitpbmxpbmUgT3B0aW9uYWw8dWludDY0X3Q+IHRvUmVmZXJlbmNlKGNvbnN0IE9wdGlvbmFsPERXQVJGRm9ybVZhbHVlPiAmVikgeworICBpZiAoVikKKyAgICByZXR1cm4gVi0+Z2V0QXNSZWZlcmVuY2UoKTsKKyAgcmV0dXJuIE5vbmU7Cit9CisKKy8vLyBUYWtlIGFuIG9wdGlvbmFsIERXQVJGRm9ybVZhbHVlIGFuZCBleHRyYWN0IGEgcmVmZXJlbmNlLgorLy8vCisvLy8gXHBhcmFtIFYgYW5kIG9wdGlvbmFsIERXQVJGRm9ybVZhbHVlIHRvIGF0dGVtcHQgdG8gZXh0cmFjdCB0aGUgdmFsdWUgZnJvbS4KKy8vLyBccGFyYW0gRGVmYXVsdCB0aGUgZGVmYXVsdCB2YWx1ZSB0byByZXR1cm4gaW4gY2FzZSBvZiBmYWlsdXJlLgorLy8vIFxyZXR1cm5zIHRoZSBleHRyYWN0ZWQgcmVmZXJlbmNlIHZhbHVlIG9yIERlZmF1bHQgaWYgdGhlIFYgZG9lc24ndCBoYXZlIGEKKy8vLyB2YWx1ZSBvciB0aGUgZm9ybSB2YWx1ZSdzIGVuY29kaW5nIHdhc24ndCBhIHJlZmVyZW5jZSBmb3JtLgoraW5saW5lIHVpbnQ2NF90IHRvUmVmZXJlbmNlKGNvbnN0IE9wdGlvbmFsPERXQVJGRm9ybVZhbHVlPiAmViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBEZWZhdWx0KSB7CisgIHJldHVybiB0b1JlZmVyZW5jZShWKS5nZXRWYWx1ZU9yKERlZmF1bHQpOworfQorCisvLy8gVGFrZSBhbiBvcHRpb25hbCBEV0FSRkZvcm1WYWx1ZSBhbmQgdHJ5IHRvIGV4dHJhY3QgYW4gc2lnbmVkIGNvbnN0YW50LgorLy8vCisvLy8gXHBhcmFtIFYgYW5kIG9wdGlvbmFsIERXQVJGRm9ybVZhbHVlIHRvIGF0dGVtcHQgdG8gZXh0cmFjdCB0aGUgdmFsdWUgZnJvbS4KKy8vLyBccmV0dXJucyBhbiBvcHRpb25hbCB2YWx1ZSB0aGF0IGNvbnRhaW5zIGEgdmFsdWUgaWYgdGhlIGZvcm0gdmFsdWUKKy8vLyB3YXMgdmFsaWQgYW5kIGhhcyBhIHNpZ25lZCBjb25zdGFudCBmb3JtLgoraW5saW5lIE9wdGlvbmFsPGludDY0X3Q+IHRvU2lnbmVkKGNvbnN0IE9wdGlvbmFsPERXQVJGRm9ybVZhbHVlPiAmVikgeworICBpZiAoVikKKyAgICByZXR1cm4gVi0+Z2V0QXNTaWduZWRDb25zdGFudCgpOworICByZXR1cm4gTm9uZTsKK30KKworLy8vIFRha2UgYW4gb3B0aW9uYWwgRFdBUkZGb3JtVmFsdWUgYW5kIGV4dHJhY3QgYSBzaWduZWQgaW50ZWdlci4KKy8vLworLy8vIFxwYXJhbSBWIGFuZCBvcHRpb25hbCBEV0FSRkZvcm1WYWx1ZSB0byBhdHRlbXB0IHRvIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20uCisvLy8gXHBhcmFtIERlZmF1bHQgdGhlIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGluIGNhc2Ugb2YgZmFpbHVyZS4KKy8vLyBccmV0dXJucyB0aGUgZXh0cmFjdGVkIHNpZ25lZCBpbnRlZ2VyIHZhbHVlIG9yIERlZmF1bHQgaWYgdGhlIFYgZG9lc24ndAorLy8vIGhhdmUgYSB2YWx1ZSBvciB0aGUgZm9ybSB2YWx1ZSdzIGVuY29kaW5nIHdhc24ndCBhIHNpZ25lZCBpbnRlZ2VyIGZvcm0uCitpbmxpbmUgaW50NjRfdCB0b1NpZ25lZChjb25zdCBPcHRpb25hbDxEV0FSRkZvcm1WYWx1ZT4gJlYsIGludDY0X3QgRGVmYXVsdCkgeworICByZXR1cm4gdG9TaWduZWQoVikuZ2V0VmFsdWVPcihEZWZhdWx0KTsKK30KKworLy8vIFRha2UgYW4gb3B0aW9uYWwgRFdBUkZGb3JtVmFsdWUgYW5kIHRyeSB0byBleHRyYWN0IGFuIGFkZHJlc3MuCisvLy8KKy8vLyBccGFyYW0gViBhbmQgb3B0aW9uYWwgRFdBUkZGb3JtVmFsdWUgdG8gYXR0ZW1wdCB0byBleHRyYWN0IHRoZSB2YWx1ZSBmcm9tLgorLy8vIFxyZXR1cm5zIGFuIG9wdGlvbmFsIHZhbHVlIHRoYXQgY29udGFpbnMgYSB2YWx1ZSBpZiB0aGUgZm9ybSB2YWx1ZQorLy8vIHdhcyB2YWxpZCBhbmQgaGFzIGEgYWRkcmVzcyBmb3JtLgoraW5saW5lIE9wdGlvbmFsPHVpbnQ2NF90PiB0b0FkZHJlc3MoY29uc3QgT3B0aW9uYWw8RFdBUkZGb3JtVmFsdWU+ICZWKSB7CisgIGlmIChWKQorICAgIHJldHVybiBWLT5nZXRBc0FkZHJlc3MoKTsKKyAgcmV0dXJuIE5vbmU7Cit9CisKKy8vLyBUYWtlIGFuIG9wdGlvbmFsIERXQVJGRm9ybVZhbHVlIGFuZCBleHRyYWN0IGEgYWRkcmVzcy4KKy8vLworLy8vIFxwYXJhbSBWIGFuZCBvcHRpb25hbCBEV0FSRkZvcm1WYWx1ZSB0byBhdHRlbXB0IHRvIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20uCisvLy8gXHBhcmFtIERlZmF1bHQgdGhlIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGluIGNhc2Ugb2YgZmFpbHVyZS4KKy8vLyBccmV0dXJucyB0aGUgZXh0cmFjdGVkIGFkZHJlc3MgdmFsdWUgb3IgRGVmYXVsdCBpZiB0aGUgViBkb2Vzbid0IGhhdmUgYQorLy8vIHZhbHVlIG9yIHRoZSBmb3JtIHZhbHVlJ3MgZW5jb2Rpbmcgd2Fzbid0IGFuIGFkZHJlc3MgZm9ybS4KK2lubGluZSB1aW50NjRfdCB0b0FkZHJlc3MoY29uc3QgT3B0aW9uYWw8RFdBUkZGb3JtVmFsdWU+ICZWLCB1aW50NjRfdCBEZWZhdWx0KSB7CisgIHJldHVybiB0b0FkZHJlc3MoVikuZ2V0VmFsdWVPcihEZWZhdWx0KTsKK30KKworLy8vIFRha2UgYW4gb3B0aW9uYWwgRFdBUkZGb3JtVmFsdWUgYW5kIHRyeSB0byBleHRyYWN0IGFuIHNlY3Rpb24gb2Zmc2V0LgorLy8vCisvLy8gXHBhcmFtIFYgYW5kIG9wdGlvbmFsIERXQVJGRm9ybVZhbHVlIHRvIGF0dGVtcHQgdG8gZXh0cmFjdCB0aGUgdmFsdWUgZnJvbS4KKy8vLyBccmV0dXJucyBhbiBvcHRpb25hbCB2YWx1ZSB0aGF0IGNvbnRhaW5zIGEgdmFsdWUgaWYgdGhlIGZvcm0gdmFsdWUKKy8vLyB3YXMgdmFsaWQgYW5kIGhhcyBhIHNlY3Rpb24gb2Zmc2V0IGZvcm0uCitpbmxpbmUgT3B0aW9uYWw8dWludDY0X3Q+IHRvU2VjdGlvbk9mZnNldChjb25zdCBPcHRpb25hbDxEV0FSRkZvcm1WYWx1ZT4gJlYpIHsKKyAgaWYgKFYpCisgICAgcmV0dXJuIFYtPmdldEFzU2VjdGlvbk9mZnNldCgpOworICByZXR1cm4gTm9uZTsKK30KKworLy8vIFRha2UgYW4gb3B0aW9uYWwgRFdBUkZGb3JtVmFsdWUgYW5kIGV4dHJhY3QgYSBzZWN0aW9uIG9mZnNldC4KKy8vLworLy8vIFxwYXJhbSBWIGFuZCBvcHRpb25hbCBEV0FSRkZvcm1WYWx1ZSB0byBhdHRlbXB0IHRvIGV4dHJhY3QgdGhlIHZhbHVlIGZyb20uCisvLy8gXHBhcmFtIERlZmF1bHQgdGhlIGRlZmF1bHQgdmFsdWUgdG8gcmV0dXJuIGluIGNhc2Ugb2YgZmFpbHVyZS4KKy8vLyBccmV0dXJucyB0aGUgZXh0cmFjdGVkIHNlY3Rpb24gb2Zmc2V0IHZhbHVlIG9yIERlZmF1bHQgaWYgdGhlIFYgZG9lc24ndAorLy8vIGhhdmUgYSB2YWx1ZSBvciB0aGUgZm9ybSB2YWx1ZSdzIGVuY29kaW5nIHdhc24ndCBhIHNlY3Rpb24gb2Zmc2V0IGZvcm0uCitpbmxpbmUgdWludDY0X3QgdG9TZWN0aW9uT2Zmc2V0KGNvbnN0IE9wdGlvbmFsPERXQVJGRm9ybVZhbHVlPiAmViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgRGVmYXVsdCkgeworICByZXR1cm4gdG9TZWN0aW9uT2Zmc2V0KFYpLmdldFZhbHVlT3IoRGVmYXVsdCk7Cit9CisKKy8vLyBUYWtlIGFuIG9wdGlvbmFsIERXQVJGRm9ybVZhbHVlIGFuZCB0cnkgdG8gZXh0cmFjdCBibG9jayBkYXRhLgorLy8vCisvLy8gXHBhcmFtIFYgYW5kIG9wdGlvbmFsIERXQVJGRm9ybVZhbHVlIHRvIGF0dGVtcHQgdG8gZXh0cmFjdCB0aGUgdmFsdWUgZnJvbS4KKy8vLyBccmV0dXJucyBhbiBvcHRpb25hbCB2YWx1ZSB0aGF0IGNvbnRhaW5zIGEgdmFsdWUgaWYgdGhlIGZvcm0gdmFsdWUKKy8vLyB3YXMgdmFsaWQgYW5kIGhhcyBhIGJsb2NrIGZvcm0uCitpbmxpbmUgT3B0aW9uYWw8QXJyYXlSZWY8dWludDhfdD4+IHRvQmxvY2soY29uc3QgT3B0aW9uYWw8RFdBUkZGb3JtVmFsdWU+ICZWKSB7CisgIGlmIChWKQorICAgIHJldHVybiBWLT5nZXRBc0Jsb2NrKCk7CisgIHJldHVybiBOb25lOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgZHdhcmYKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGRk9STVZBTFVFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGR2RiSW5kZXguaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGR2RiSW5kZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDFhYzVjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZHZGJJbmRleC5oCkBAIC0wLDAgKzEsNzQgQEAKKy8vPT09LSBEV0FSRkdkYkluZGV4LmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZHREJJTkRFWF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGR0RCSU5ERVhfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YUV4dHJhY3Rvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworY2xhc3MgRFdBUkZHZGJJbmRleCB7CisgIHVpbnQzMl90IFZlcnNpb247CisKKyAgdWludDMyX3QgQ3VMaXN0T2Zmc2V0OworICB1aW50MzJfdCBBZGRyZXNzQXJlYU9mZnNldDsKKyAgdWludDMyX3QgU3ltYm9sVGFibGVPZmZzZXQ7CisgIHVpbnQzMl90IENvbnN0YW50UG9vbE9mZnNldDsKKworICBzdHJ1Y3QgQ29tcFVuaXRFbnRyeSB7CisgICAgdWludDY0X3QgT2Zmc2V0OyAvLy8gT2Zmc2V0IG9mIGEgQ1UgaW4gdGhlIC5kZWJ1Z19pbmZvIHNlY3Rpb24uCisgICAgdWludDY0X3QgTGVuZ3RoOyAvLy8gTGVuZ3RoIG9mIHRoYXQgQ1UuCisgIH07CisgIFNtYWxsVmVjdG9yPENvbXBVbml0RW50cnksIDA+IEN1TGlzdDsKKworICBzdHJ1Y3QgQWRkcmVzc0VudHJ5IHsKKyAgICB1aW50NjRfdCBMb3dBZGRyZXNzOyAgLy8vIFRoZSBsb3cgYWRkcmVzcy4KKyAgICB1aW50NjRfdCBIaWdoQWRkcmVzczsgLy8vIFRoZSBoaWdoIGFkZHJlc3MuCisgICAgdWludDMyX3QgQ3VJbmRleDsgICAgIC8vLyBUaGUgQ1UgaW5kZXguCisgIH07CisgIFNtYWxsVmVjdG9yPEFkZHJlc3NFbnRyeSwgMD4gQWRkcmVzc0FyZWE7CisKKyAgc3RydWN0IFN5bVRhYmxlRW50cnkgeworICAgIHVpbnQzMl90IE5hbWVPZmZzZXQ7IC8vLyBPZmZzZXQgb2YgdGhlIHN5bWJvbCdzIG5hbWUgaW4gdGhlIGNvbnN0YW50IHBvb2wuCisgICAgdWludDMyX3QgVmVjT2Zmc2V0OyAgLy8vIE9mZnNldCBvZiB0aGUgQ1UgdmVjdG9yIGluIHRoZSBjb25zdGFudCBwb29sLgorICB9OworICBTbWFsbFZlY3RvcjxTeW1UYWJsZUVudHJ5LCAwPiBTeW1ib2xUYWJsZTsKKworICAvLy8gRWFjaCB2YWx1ZSBpcyBDVSBpbmRleCArIGF0dHJpYnV0ZXMuCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1aW50MzJfdCwgU21hbGxWZWN0b3I8dWludDMyX3QsIDA+PiwgMD4KKyAgICAgIENvbnN0YW50UG9vbFZlY3RvcnM7CisKKyAgU3RyaW5nUmVmIENvbnN0YW50UG9vbFN0cmluZ3M7CisgIHVpbnQzMl90IFN0cmluZ1Bvb2xPZmZzZXQ7CisKKyAgdm9pZCBkdW1wQ1VMaXN0KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcEFkZHJlc3NBcmVhKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcFN5bWJvbFRhYmxlKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcENvbnN0YW50UG9vbChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIGJvb2wgcGFyc2VJbXBsKERhdGFFeHRyYWN0b3IgRGF0YSk7CisKK3B1YmxpYzoKKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUyk7CisgIHZvaWQgcGFyc2UoRGF0YUV4dHJhY3RvciBEYXRhKTsKKworICBib29sIEhhc0NvbnRlbnQgPSBmYWxzZTsKKyAgYm9vbCBIYXNFcnJvciA9IGZhbHNlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGR0RCSU5ERVhfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZPYmplY3QuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGT2JqZWN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk1ZWRkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGT2JqZWN0LmgKQEAgLTAsMCArMSw4MiBAQAorLy89PT0tIERXQVJGT2JqZWN0LmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRk9CSkVDVF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGT0JKRUNUX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGUmVsb2NNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlNlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9PYmplY3RGaWxlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKy8vIFRoaXMgaXMgcmVzcG9uc2libGUgZm9yIGxvdyBsZXZlbCBhY2Nlc3MgdG8gdGhlIG9iamVjdCBmaWxlLiBJdAorLy8ga25vd3MgaG93IHRvIGZpbmQgdGhlIHJlcXVpcmVkIHNlY3Rpb25zIGFuZCBjb21wdXRlIHJlbG9jYXRlZAorLy8gdmFsdWVzLgorLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIG9mIHRoZSBnZXQ8U2VjdGlvbj4gbWV0aG9kcyByZXR1cm4gZHVtbXkgdmFsdWVzLgorLy8gVGhpcyBpcyB0byBhbGxvdyBjbGllbnRzIHRoYXQgb25seSBuZWVkIHNvbWUgb2YgdGhvc2UgdG8gaW1wbGVtZW50IGp1c3QgdGhlCisvLyBvbmVzIHRoZXkgbmVlZC4gV2UgY2FuJ3QgdXNlIHVucmVhY2hhYmxlIGZvciBhcyBtYW55IGNhc2VzIGJlY2F1c2UgdGhlIHBhcnNlcgorLy8gaW1wbGVtZW50YXRpb24gaXMgZWFnZXIgYW5kIHdpbGwgY2FsbCBzb21lIG9mIHRoZXNlIG1ldGhvZHMgZXZlbiBpZiB0aGUKKy8vIHJlc3VsdCBpcyBub3QgdXNlZC4KK2NsYXNzIERXQVJGT2JqZWN0IHsKKyAgRFdBUkZTZWN0aW9uIER1bW15OworCitwdWJsaWM6CisgIHZpcnR1YWwgfkRXQVJGT2JqZWN0KCkgPSBkZWZhdWx0OworICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRGaWxlTmFtZSgpIGNvbnN0IHsgbGx2bV91bnJlYWNoYWJsZSgidW5pbXBsZW1lbnRlZCIpOyB9CisgIHZpcnR1YWwgY29uc3Qgb2JqZWN0OjpPYmplY3RGaWxlICpnZXRGaWxlKCkgY29uc3QgeyByZXR1cm4gbnVsbHB0cjsgfQorICB2aXJ0dWFsIEFycmF5UmVmPFNlY3Rpb25OYW1lPiBnZXRTZWN0aW9uTmFtZXMoKSBjb25zdCB7IHJldHVybiB7fTsgfQorICB2aXJ0dWFsIGJvb2wgaXNMaXR0bGVFbmRpYW4oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDhfdCBnZXRBZGRyZXNzU2l6ZSgpIGNvbnN0IHsgbGx2bV91bnJlYWNoYWJsZSgidW5pbXBsZW1lbnRlZCIpOyB9CisgIHZpcnR1YWwgY29uc3QgRFdBUkZTZWN0aW9uICZnZXRJbmZvU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER1bW15OyB9CisgIHZpcnR1YWwgdm9pZAorICBmb3JFYWNoVHlwZXNTZWN0aW9ucyhmdW5jdGlvbl9yZWY8dm9pZChjb25zdCBEV0FSRlNlY3Rpb24gJik+IEYpIGNvbnN0IHt9CisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldEFiYnJldlNlY3Rpb24oKSBjb25zdCB7IHJldHVybiAiIjsgfQorICB2aXJ0dWFsIGNvbnN0IERXQVJGU2VjdGlvbiAmZ2V0TG9jU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER1bW15OyB9CisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldEFSYW5nZVNlY3Rpb24oKSBjb25zdCB7IHJldHVybiAiIjsgfQorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXREZWJ1Z0ZyYW1lU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuICIiOyB9CisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldEVIRnJhbWVTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gIiI7IH0KKyAgdmlydHVhbCBjb25zdCBEV0FSRlNlY3Rpb24gJmdldExpbmVTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHVtbXk7IH0KKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0TGluZVN0cmluZ1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiAiIjsgfQorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRTdHJpbmdTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gIiI7IH0KKyAgdmlydHVhbCBjb25zdCBEV0FSRlNlY3Rpb24gJmdldFJhbmdlU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER1bW15OyB9CisgIHZpcnR1YWwgY29uc3QgRFdBUkZTZWN0aW9uICZnZXRSbmdsaXN0c1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEdW1teTsgfQorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRNYWNpbmZvU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuICIiOyB9CisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldFB1Yk5hbWVzU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuICIiOyB9CisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldFB1YlR5cGVzU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuICIiOyB9CisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldEdudVB1Yk5hbWVzU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuICIiOyB9CisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldEdudVB1YlR5cGVzU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuICIiOyB9CisgIHZpcnR1YWwgY29uc3QgRFdBUkZTZWN0aW9uICZnZXRTdHJpbmdPZmZzZXRTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHVtbXk7IH0KKyAgdmlydHVhbCBjb25zdCBEV0FSRlNlY3Rpb24gJmdldEluZm9EV09TZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHVtbXk7IH0KKyAgdmlydHVhbCB2b2lkCisgIGZvckVhY2hUeXBlc0RXT1NlY3Rpb25zKGZ1bmN0aW9uX3JlZjx2b2lkKGNvbnN0IERXQVJGU2VjdGlvbiAmKT4gRikgY29uc3Qge30KKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0QWJicmV2RFdPU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuICIiOyB9CisgIHZpcnR1YWwgY29uc3QgRFdBUkZTZWN0aW9uICZnZXRMaW5lRFdPU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER1bW15OyB9CisgIHZpcnR1YWwgY29uc3QgRFdBUkZTZWN0aW9uICZnZXRMb2NEV09TZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHVtbXk7IH0KKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0U3RyaW5nRFdPU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuICIiOyB9CisgIHZpcnR1YWwgY29uc3QgRFdBUkZTZWN0aW9uICZnZXRTdHJpbmdPZmZzZXREV09TZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBEdW1teTsKKyAgfQorICB2aXJ0dWFsIGNvbnN0IERXQVJGU2VjdGlvbiAmZ2V0UmFuZ2VEV09TZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHVtbXk7IH0KKyAgdmlydHVhbCBjb25zdCBEV0FSRlNlY3Rpb24gJmdldEFkZHJTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHVtbXk7IH0KKyAgdmlydHVhbCBjb25zdCBEV0FSRlNlY3Rpb24gJmdldEFwcGxlTmFtZXNTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHVtbXk7IH0KKyAgdmlydHVhbCBjb25zdCBEV0FSRlNlY3Rpb24gJmdldEFwcGxlVHlwZXNTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHVtbXk7IH0KKyAgdmlydHVhbCBjb25zdCBEV0FSRlNlY3Rpb24gJmdldEFwcGxlTmFtZXNwYWNlc1NlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIER1bW15OworICB9CisgIHZpcnR1YWwgY29uc3QgRFdBUkZTZWN0aW9uICZnZXREZWJ1Z05hbWVzU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER1bW15OyB9CisgIHZpcnR1YWwgY29uc3QgRFdBUkZTZWN0aW9uICZnZXRBcHBsZU9iakNTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHVtbXk7IH0KKyAgdmlydHVhbCBTdHJpbmdSZWYgZ2V0Q1VJbmRleFNlY3Rpb24oKSBjb25zdCB7IHJldHVybiAiIjsgfQorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRHZGJJbmRleFNlY3Rpb24oKSBjb25zdCB7IHJldHVybiAiIjsgfQorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRUVUluZGV4U2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuICIiOyB9CisgIHZpcnR1YWwgT3B0aW9uYWw8UmVsb2NBZGRyRW50cnk+IGZpbmQoY29uc3QgRFdBUkZTZWN0aW9uICZTZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgUG9zKSBjb25zdCA9IDA7Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGUmVsb2NNYXAuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGUmVsb2NNYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTE4Mzg0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZSZWxvY01hcC5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vPT09LSBEV0FSRlJlbG9jTWFwLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZSRUxPQ01BUF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGUkVMT0NNQVBfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBSZWxvY0FkZHJFbnRyeSBjb250YWlucyByZWxvY2F0ZWQgdmFsdWUgYW5kIHNlY3Rpb24gaW5kZXguCisvLy8gU2VjdGlvbiBpbmRleCBpcyAtMUxMIGlmIHJlbG9jYXRpb24gcG9pbnRzIHRvIGFic29sdXRlIHN5bWJvbC4KK3N0cnVjdCBSZWxvY0FkZHJFbnRyeSB7CisgIHVpbnQ2NF90IFNlY3Rpb25JbmRleDsKKyAgdWludDY0X3QgVmFsdWU7Cit9OworCisvLy8gSW4gcGxhY2Ugb2YgYXBwbHlpbmcgdGhlIHJlbG9jYXRpb25zIHRvIHRoZSBkYXRhIHdlJ3ZlIHJlYWQgZnJvbSBkaXNrIHdlIHVzZQorLy8vIGEgc2VwYXJhdGUgbWFwcGluZyB0YWJsZSB0byB0aGUgc2lkZSBhbmQgY2hlY2tpbmcgdGhhdCBhdCBsb2NhdGlvbnMgaW4gdGhlCisvLy8gZHdhcmYgd2hlcmUgd2UgZXhwZWN0IHJlbG9jYXRlZCB2YWx1ZXMuIFRoaXMgYWRkcyBhIGJpdCBvZiBjb21wbGV4aXR5IHRvIHRoZQorLy8vIGR3YXJmIHBhcnNpbmcvZXh0cmFjdGlvbiBhdCB0aGUgYmVuZWZpdCBvZiBub3QgYWxsb2NhdGluZyBtZW1vcnkgZm9yIHRoZQorLy8vIGVudGlyZSBzaXplIG9mIHRoZSBkZWJ1ZyBpbmZvIHNlY3Rpb25zLgordXNpbmcgUmVsb2NBZGRyTWFwID0gRGVuc2VNYXA8dWludDY0X3QsIFJlbG9jQWRkckVudHJ5PjsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGUkVMT0NNQVBfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZTZWN0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlNlY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NzA0NWYwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZTZWN0aW9uLmgKQEAgLTAsMCArMSwyOCBAQAorLy89PT0tIERXQVJGU2VjdGlvbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRlNFQ1RJT05fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRlNFQ1RJT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworc3RydWN0IERXQVJGU2VjdGlvbiB7CisgIFN0cmluZ1JlZiBEYXRhOworfTsKKworc3RydWN0IFNlY3Rpb25OYW1lIHsKKyAgU3RyaW5nUmVmIE5hbWU7CisgIGJvb2wgSXNOYW1lVW5pcXVlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGU0VDVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlR5cGVVbml0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlR5cGVVbml0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY1OWE2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGVHlwZVVuaXQuaApAQCAtMCwwICsxLDU1IEBACisvLz09PS0gRFdBUkZUeXBlVW5pdC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGVFlQRVVOSVRfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRlRZUEVVTklUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGVW5pdC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGVW5pdEluZGV4LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFFeHRyYWN0b3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIERXQVJGQ29udGV4dDsKK2NsYXNzIERXQVJGRGVidWdBYmJyZXY7CitzdHJ1Y3QgRFdBUkZTZWN0aW9uOworY2xhc3MgcmF3X29zdHJlYW07CisKK2NsYXNzIERXQVJGVHlwZVVuaXQgOiBwdWJsaWMgRFdBUkZVbml0IHsKK3ByaXZhdGU6CisgIHVpbnQ2NF90IFR5cGVIYXNoOworICB1aW50MzJfdCBUeXBlT2Zmc2V0OworCitwdWJsaWM6CisgIERXQVJGVHlwZVVuaXQoRFdBUkZDb250ZXh0ICZDb250ZXh0LCBjb25zdCBEV0FSRlNlY3Rpb24gJlNlY3Rpb24sCisgICAgICAgICAgICAgICAgY29uc3QgRFdBUkZEZWJ1Z0FiYnJldiAqREEsIGNvbnN0IERXQVJGU2VjdGlvbiAqUlMsCisgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFNTLCBjb25zdCBEV0FSRlNlY3Rpb24gJlNPUywgY29uc3QgRFdBUkZTZWN0aW9uICpBT1MsCisgICAgICAgICAgICAgICAgY29uc3QgRFdBUkZTZWN0aW9uICZMUywgYm9vbCBMRSwgYm9vbCBJc0RXTywKKyAgICAgICAgICAgICAgICBjb25zdCBEV0FSRlVuaXRTZWN0aW9uQmFzZSAmVW5pdFNlY3Rpb24sCisgICAgICAgICAgICAgICAgY29uc3QgRFdBUkZVbml0SW5kZXg6OkVudHJ5ICpFbnRyeSkKKyAgICAgIDogRFdBUkZVbml0KENvbnRleHQsIFNlY3Rpb24sIERBLCBSUywgU1MsIFNPUywgQU9TLCBMUywgTEUsIElzRFdPLAorICAgICAgICAgICAgICAgICAgVW5pdFNlY3Rpb24sIEVudHJ5KSB7fQorCisgIHVpbnQzMl90IGdldEhlYWRlclNpemUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIERXQVJGVW5pdDo6Z2V0SGVhZGVyU2l6ZSgpICsgMTI7CisgIH0KKworICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCBESUR1bXBPcHRpb25zIER1bXBPcHRzID0ge30pOworICBzdGF0aWMgY29uc3QgRFdBUkZTZWN0aW9uS2luZCBTZWN0aW9uID0gRFdfU0VDVF9UWVBFUzsKKworcHJvdGVjdGVkOgorICBib29sIGV4dHJhY3RJbXBsKGNvbnN0IERXQVJGRGF0YUV4dHJhY3RvciAmZGVidWdfaW5mbywKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqb2Zmc2V0X3B0cikgb3ZlcnJpZGU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZUWVBFVU5JVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlVuaXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGVW5pdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlM2Y1NzMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlVuaXQuaApAQCAtMCwwICsxLDQ4OCBAQAorLy89PT0tIERXQVJGVW5pdC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRlVOSVRfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRlVOSVRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRkRlYnVnSW5mb0VudHJ5LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEZWJ1Z1JhbmdlTGlzdC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGRGllLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZGb3JtVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlJlbG9jTWFwLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZTZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZVbml0SW5kZXguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YUV4dHJhY3Rvci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIERXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb25TZXQ7CitjbGFzcyBEV0FSRkNvbnRleHQ7CitjbGFzcyBEV0FSRkRlYnVnQWJicmV2OworY2xhc3MgRFdBUkZVbml0OworCisvLy8gQmFzZSBjbGFzcyBmb3IgYWxsIERXQVJGVW5pdFNlY3Rpb24gY2xhc3Nlcy4gVGhpcyBwcm92aWRlcyB0aGUKKy8vLyBmdW5jdGlvbmFsaXR5IGNvbW1vbiB0byBhbGwgdW5pdCB0eXBlcy4KK2NsYXNzIERXQVJGVW5pdFNlY3Rpb25CYXNlIHsKK3B1YmxpYzoKKyAgLy8vIFJldHVybnMgdGhlIFVuaXQgdGhhdCBjb250YWlucyB0aGUgZ2l2ZW4gc2VjdGlvbiBvZmZzZXQgaW4gdGhlCisgIC8vLyBzYW1lIHNlY3Rpb24gdGhpcyBVbml0IG9yaWdpbmF0ZWQgZnJvbS4KKyAgdmlydHVhbCBEV0FSRlVuaXQgKmdldFVuaXRGb3JPZmZzZXQodWludDMyX3QgT2Zmc2V0KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgRFdBUkZVbml0ICpnZXRVbml0Rm9ySW5kZXhFbnRyeShjb25zdCBEV0FSRlVuaXRJbmRleDo6RW50cnkgJkUpID0gMDsKKworICB2b2lkIHBhcnNlKERXQVJGQ29udGV4dCAmQywgY29uc3QgRFdBUkZTZWN0aW9uICZTZWN0aW9uKTsKKyAgdm9pZCBwYXJzZURXTyhEV0FSRkNvbnRleHQgJkMsIGNvbnN0IERXQVJGU2VjdGlvbiAmRFdPU2VjdGlvbiwKKyAgICAgICAgICAgICAgICBib29sIExhenkgPSBmYWxzZSk7CisKK3Byb3RlY3RlZDoKKyAgfkRXQVJGVW5pdFNlY3Rpb25CYXNlKCkgPSBkZWZhdWx0OworCisgIHZpcnR1YWwgdm9pZCBwYXJzZUltcGwoRFdBUkZDb250ZXh0ICZDb250ZXh0LCBjb25zdCBEV0FSRk9iamVjdCAmT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGU2VjdGlvbiAmU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEV0FSRkRlYnVnQWJicmV2ICpEQSwgY29uc3QgRFdBUkZTZWN0aW9uICpSUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU1MsIGNvbnN0IERXQVJGU2VjdGlvbiAmU09TLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGU2VjdGlvbiAqQU9TLCBjb25zdCBEV0FSRlNlY3Rpb24gJkxTLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNMaXR0bGVFbmRpYW4sIGJvb2wgaXNEV08sIGJvb2wgTGF6eSkgPSAwOworfTsKKworY29uc3QgRFdBUkZVbml0SW5kZXggJmdldERXQVJGVW5pdEluZGV4KERXQVJGQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV0FSRlNlY3Rpb25LaW5kIEtpbmQpOworCisvLy8gQ29uY3JldGUgaW5zdGFuY2Ugb2YgRFdBUkZVbml0U2VjdGlvbiwgc3BlY2lhbGl6ZWQgZm9yIG9uZSBVbml0IHR5cGUuCit0ZW1wbGF0ZTx0eXBlbmFtZSBVbml0VHlwZT4KK2NsYXNzIERXQVJGVW5pdFNlY3Rpb24gZmluYWwgOiBwdWJsaWMgU21hbGxWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFVuaXRUeXBlPiwgMT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIERXQVJGVW5pdFNlY3Rpb25CYXNlIHsKKyAgYm9vbCBQYXJzZWQgPSBmYWxzZTsKKyAgc3RkOjpmdW5jdGlvbjxzdGQ6OnVuaXF1ZV9wdHI8VW5pdFR5cGU+KHVpbnQzMl90KT4gUGFyc2VyOworCitwdWJsaWM6CisgIHVzaW5nIFVuaXRWZWN0b3IgPSBTbWFsbFZlY3RvckltcGw8c3RkOjp1bmlxdWVfcHRyPFVuaXRUeXBlPj47CisgIHVzaW5nIGl0ZXJhdG9yID0gdHlwZW5hbWUgVW5pdFZlY3Rvcjo6aXRlcmF0b3I7CisgIHVzaW5nIGl0ZXJhdG9yX3JhbmdlID0gbGx2bTo6aXRlcmF0b3JfcmFuZ2U8dHlwZW5hbWUgVW5pdFZlY3Rvcjo6aXRlcmF0b3I+OworCisgIFVuaXRUeXBlICpnZXRVbml0Rm9yT2Zmc2V0KHVpbnQzMl90IE9mZnNldCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGF1dG8gKkNVID0gc3RkOjp1cHBlcl9ib3VuZCgKKyAgICAgICAgdGhpcy0+YmVnaW4oKSwgdGhpcy0+ZW5kKCksIE9mZnNldCwKKyAgICAgICAgW10odWludDMyX3QgTEhTLCBjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8VW5pdFR5cGU+ICZSSFMpIHsKKyAgICAgICAgICByZXR1cm4gTEhTIDwgUkhTLT5nZXROZXh0VW5pdE9mZnNldCgpOworICAgICAgICB9KTsKKyAgICBpZiAoQ1UgIT0gdGhpcy0+ZW5kKCkgJiYgKCpDVSktPmdldE9mZnNldCgpIDw9IE9mZnNldCkKKyAgICAgIHJldHVybiBDVS0+Z2V0KCk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgVW5pdFR5cGUgKmdldFVuaXRGb3JJbmRleEVudHJ5KGNvbnN0IERXQVJGVW5pdEluZGV4OjpFbnRyeSAmRSkgb3ZlcnJpZGUgeworICAgIGNvbnN0IGF1dG8gKkNVT2ZmID0gRS5nZXRPZmZzZXQoRFdfU0VDVF9JTkZPKTsKKyAgICBpZiAoIUNVT2ZmKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBhdXRvIE9mZnNldCA9IENVT2ZmLT5PZmZzZXQ7CisKKyAgICBhdXRvICpDVSA9IHN0ZDo6dXBwZXJfYm91bmQoCisgICAgICAgIHRoaXMtPmJlZ2luKCksIHRoaXMtPmVuZCgpLCBDVU9mZi0+T2Zmc2V0LAorICAgICAgICBbXSh1aW50MzJfdCBMSFMsIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxVbml0VHlwZT4gJlJIUykgeworICAgICAgICAgIHJldHVybiBMSFMgPCBSSFMtPmdldE5leHRVbml0T2Zmc2V0KCk7CisgICAgICAgIH0pOworICAgIGlmIChDVSAhPSB0aGlzLT5lbmQoKSAmJiAoKkNVKS0+Z2V0T2Zmc2V0KCkgPD0gT2Zmc2V0KQorICAgICAgcmV0dXJuIENVLT5nZXQoKTsKKworICAgIGlmICghUGFyc2VyKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICBhdXRvIFUgPSBQYXJzZXIoT2Zmc2V0KTsKKyAgICBpZiAoIVUpCisgICAgICBVID0gbnVsbHB0cjsKKworICAgIGF1dG8gKk5ld0NVID0gVS5nZXQoKTsKKyAgICB0aGlzLT5pbnNlcnQoQ1UsIHN0ZDo6bW92ZShVKSk7CisgICAgcmV0dXJuIE5ld0NVOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgcGFyc2VJbXBsKERXQVJGQ29udGV4dCAmQ29udGV4dCwgY29uc3QgRFdBUkZPYmplY3QgJk9iaiwKKyAgICAgICAgICAgICAgICAgY29uc3QgRFdBUkZTZWN0aW9uICZTZWN0aW9uLCBjb25zdCBEV0FSRkRlYnVnQWJicmV2ICpEQSwKKyAgICAgICAgICAgICAgICAgY29uc3QgRFdBUkZTZWN0aW9uICpSUywgU3RyaW5nUmVmIFNTLCBjb25zdCBEV0FSRlNlY3Rpb24gJlNPUywKKyAgICAgICAgICAgICAgICAgY29uc3QgRFdBUkZTZWN0aW9uICpBT1MsIGNvbnN0IERXQVJGU2VjdGlvbiAmTFMsIGJvb2wgTEUsCisgICAgICAgICAgICAgICAgIGJvb2wgSXNEV08sIGJvb2wgTGF6eSkgb3ZlcnJpZGUgeworICAgIGlmIChQYXJzZWQpCisgICAgICByZXR1cm47CisgICAgRFdBUkZEYXRhRXh0cmFjdG9yIERhdGEoT2JqLCBTZWN0aW9uLCBMRSwgMCk7CisgICAgaWYgKCFQYXJzZXIpIHsKKyAgICAgIGNvbnN0IERXQVJGVW5pdEluZGV4ICpJbmRleCA9IG51bGxwdHI7CisgICAgICBpZiAoSXNEV08pCisgICAgICAgIEluZGV4ID0gJmdldERXQVJGVW5pdEluZGV4KENvbnRleHQsIFVuaXRUeXBlOjpTZWN0aW9uKTsKKyAgICAgIFBhcnNlciA9IFs9LCAmQ29udGV4dCwgJlNlY3Rpb24sICZTT1MsCisgICAgICAgICAgICAgICAgJkxTXSh1aW50MzJfdCBPZmZzZXQpIC0+IHN0ZDo6dW5pcXVlX3B0cjxVbml0VHlwZT4geworICAgICAgICBpZiAoIURhdGEuaXNWYWxpZE9mZnNldChPZmZzZXQpKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICBhdXRvIFUgPSBsbHZtOjptYWtlX3VuaXF1ZTxVbml0VHlwZT4oCisgICAgICAgICAgICBDb250ZXh0LCBTZWN0aW9uLCBEQSwgUlMsIFNTLCBTT1MsIEFPUywgTFMsIExFLCBJc0RXTywgKnRoaXMsCisgICAgICAgICAgICBJbmRleCA/IEluZGV4LT5nZXRGcm9tT2Zmc2V0KE9mZnNldCkgOiBudWxscHRyKTsKKyAgICAgICAgaWYgKCFVLT5leHRyYWN0KERhdGEsICZPZmZzZXQpKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICByZXR1cm4gVTsKKyAgICAgIH07CisgICAgfQorICAgIGlmIChMYXp5KQorICAgICAgcmV0dXJuOworICAgIGF1dG8gSSA9IHRoaXMtPmJlZ2luKCk7CisgICAgdWludDMyX3QgT2Zmc2V0ID0gMDsKKyAgICB3aGlsZSAoRGF0YS5pc1ZhbGlkT2Zmc2V0KE9mZnNldCkpIHsKKyAgICAgIGlmIChJICE9IHRoaXMtPmVuZCgpICYmICgqSSktPmdldE9mZnNldCgpID09IE9mZnNldCkgeworICAgICAgICArK0k7CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorICAgICAgYXV0byBVID0gUGFyc2VyKE9mZnNldCk7CisgICAgICBpZiAoIVUpCisgICAgICAgIGJyZWFrOworICAgICAgT2Zmc2V0ID0gVS0+Z2V0TmV4dFVuaXRPZmZzZXQoKTsKKyAgICAgIEkgPSBzdGQ6Om5leHQodGhpcy0+aW5zZXJ0KEksIHN0ZDo6bW92ZShVKSkpOworICAgIH0KKyAgICBQYXJzZWQgPSB0cnVlOworICB9Cit9OworCisvLy8gUmVwcmVzZW50cyBiYXNlIGFkZHJlc3Mgb2YgdGhlIENVLgorc3RydWN0IEJhc2VBZGRyZXNzIHsKKyAgdWludDY0X3QgQWRkcmVzczsKKyAgdWludDY0X3QgU2VjdGlvbkluZGV4OworfTsKKworLy8vIFJlcHJlc2VudHMgYSB1bml0J3MgY29udHJpYnV0aW9uIHRvIHRoZSBzdHJpbmcgb2Zmc2V0cyB0YWJsZS4KK3N0cnVjdCBTdHJPZmZzZXRzQ29udHJpYnV0aW9uRGVzY3JpcHRvciB7CisgIHVpbnQ2NF90IEJhc2UgPSAwOworICB1aW50NjRfdCBTaXplID0gMDsKKyAgLy8vIEZvcm1hdCBhbmQgdmVyc2lvbi4KKyAgZHdhcmY6OkZvcm1QYXJhbXMgRm9ybVBhcmFtcyA9IHswLCAwLCBkd2FyZjo6RHdhcmZGb3JtYXQ6OkRXQVJGMzJ9OworCisgIFN0ck9mZnNldHNDb250cmlidXRpb25EZXNjcmlwdG9yKHVpbnQ2NF90IEJhc2UsIHVpbnQ2NF90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgVmVyc2lvbiwgZHdhcmY6OkR3YXJmRm9ybWF0IEZvcm1hdCkKKyAgICAgIDogQmFzZShCYXNlKSwgU2l6ZShTaXplKSwgRm9ybVBhcmFtcyh7VmVyc2lvbiwgMCwgRm9ybWF0fSkge30KKworICB1aW50OF90IGdldFZlcnNpb24oKSBjb25zdCB7IHJldHVybiBGb3JtUGFyYW1zLlZlcnNpb247IH0KKyAgZHdhcmY6OkR3YXJmRm9ybWF0IGdldEZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIEZvcm1QYXJhbXMuRm9ybWF0OyB9CisgIHVpbnQ4X3QgZ2V0RHdhcmZPZmZzZXRCeXRlU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRm9ybVBhcmFtcy5nZXREd2FyZk9mZnNldEJ5dGVTaXplKCk7CisgIH0KKyAgLy8vIERldGVybWluZSB3aGV0aGVyIGEgY29udHJpYnV0aW9uIHRvIHRoZSBzdHJpbmcgb2Zmc2V0cyB0YWJsZSBpcworICAvLy8gY29uc2lzdGVudCB3aXRoIHRoZSByZWxldmFudCBzZWN0aW9uIHNpemUgYW5kIHRoYXQgaXRzIGxlbmd0aCBpcworICAvLy8gYSBtdWx0aXBsZSBvZiB0aGUgc2l6ZSBvZiBvbmUgb2YgaXRzIGVudHJpZXMuCisgIE9wdGlvbmFsPFN0ck9mZnNldHNDb250cmlidXRpb25EZXNjcmlwdG9yPgorICB2YWxpZGF0ZUNvbnRyaWJ1dGlvblNpemUoRFdBUkZEYXRhRXh0cmFjdG9yICZEQSk7Cit9OworCitjbGFzcyBEV0FSRlVuaXQgeworICBEV0FSRkNvbnRleHQgJkNvbnRleHQ7CisgIC8vLyBTZWN0aW9uIGNvbnRhaW5pbmcgdGhpcyBEV0FSRlVuaXQuCisgIGNvbnN0IERXQVJGU2VjdGlvbiAmSW5mb1NlY3Rpb247CisKKyAgY29uc3QgRFdBUkZEZWJ1Z0FiYnJldiAqQWJicmV2OworICBjb25zdCBEV0FSRlNlY3Rpb24gKlJhbmdlU2VjdGlvbjsKKyAgdWludDMyX3QgUmFuZ2VTZWN0aW9uQmFzZTsKKyAgY29uc3QgRFdBUkZTZWN0aW9uICZMaW5lU2VjdGlvbjsKKyAgU3RyaW5nUmVmIFN0cmluZ1NlY3Rpb247CisgIGNvbnN0IERXQVJGU2VjdGlvbiAmU3RyaW5nT2Zmc2V0U2VjdGlvbjsKKyAgY29uc3QgRFdBUkZTZWN0aW9uICpBZGRyT2Zmc2V0U2VjdGlvbjsKKyAgdWludDMyX3QgQWRkck9mZnNldFNlY3Rpb25CYXNlID0gMDsKKyAgYm9vbCBpc0xpdHRsZUVuZGlhbjsKKyAgYm9vbCBpc0RXTzsKKyAgY29uc3QgRFdBUkZVbml0U2VjdGlvbkJhc2UgJlVuaXRTZWN0aW9uOworCisgIC8vIFZlcnNpb24sIGFkZHJlc3Mgc2l6ZSwgYW5kIERXQVJGIGZvcm1hdC4KKyAgZHdhcmY6OkZvcm1QYXJhbXMgRm9ybVBhcmFtczsKKyAgLy8vIFN0YXJ0LCBsZW5ndGgsIGFuZCBEV0FSRiBmb3JtYXQgb2YgdGhlIHVuaXQncyBjb250cmlidXRpb24gdG8gdGhlIHN0cmluZworICAvLy8gb2Zmc2V0cyB0YWJsZSAoRFdBUkYgdjUpLgorICBPcHRpb25hbDxTdHJPZmZzZXRzQ29udHJpYnV0aW9uRGVzY3JpcHRvcj4gU3RyaW5nT2Zmc2V0c1RhYmxlQ29udHJpYnV0aW9uOworCisgIHVpbnQzMl90IE9mZnNldDsKKyAgdWludDMyX3QgTGVuZ3RoOworICBtdXRhYmxlIGNvbnN0IERXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb25TZXQgKkFiYnJldnM7CisgIHVpbnQ2NF90IEFiYnJPZmZzZXQ7CisgIHVpbnQ4X3QgVW5pdFR5cGU7CisgIGxsdm06Ok9wdGlvbmFsPEJhc2VBZGRyZXNzPiBCYXNlQWRkcjsKKyAgLy8vIFRoZSBjb21waWxlIHVuaXQgZGVidWcgaW5mb3JtYXRpb24gZW50cnkgaXRlbXMuCisgIHN0ZDo6dmVjdG9yPERXQVJGRGVidWdJbmZvRW50cnk+IERpZUFycmF5OworCisgIC8vLyBNYXAgZnJvbSByYW5nZSdzIHN0YXJ0IGFkZHJlc3MgdG8gZW5kIGFkZHJlc3MgYW5kIGNvcnJlc3BvbmRpbmcgRElFLgorICAvLy8gSW50ZXJ2YWxNYXAgZG9lcyBub3Qgc3VwcG9ydCByYW5nZSByZW1vdmFsLCBhcyBhIHJlc3VsdCwgd2UgdXNlIHRoZQorICAvLy8gc3RkOjptYXA6OnVwcGVyX2JvdW5kIGZvciBhZGRyZXNzIHJhbmdlIGxvb2t1cC4KKyAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6cGFpcjx1aW50NjRfdCwgRFdBUkZEaWU+PiBBZGRyRGllTWFwOworCisgIHVzaW5nIGRpZV9pdGVyYXRvcl9yYW5nZSA9CisgICAgICBpdGVyYXRvcl9yYW5nZTxzdGQ6OnZlY3RvcjxEV0FSRkRlYnVnSW5mb0VudHJ5Pjo6aXRlcmF0b3I+OworCisgIHN0ZDo6c2hhcmVkX3B0cjxEV0FSRlVuaXQ+IERXTzsKKworICBjb25zdCBEV0FSRlVuaXRJbmRleDo6RW50cnkgKkluZGV4RW50cnk7CisKKyAgdWludDMyX3QgZ2V0RElFSW5kZXgoY29uc3QgRFdBUkZEZWJ1Z0luZm9FbnRyeSAqRGllKSB7CisgICAgYXV0byBGaXJzdCA9IERpZUFycmF5LmRhdGEoKTsKKyAgICBhc3NlcnQoRGllID49IEZpcnN0ICYmIERpZSA8IEZpcnN0ICsgRGllQXJyYXkuc2l6ZSgpKTsKKyAgICByZXR1cm4gRGllIC0gRmlyc3Q7CisgIH0KKworcHJvdGVjdGVkOgorICB2aXJ0dWFsIGJvb2wgZXh0cmFjdEltcGwoY29uc3QgRFdBUkZEYXRhRXh0cmFjdG9yICZkZWJ1Z19pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgKm9mZnNldF9wdHIpOworCisgIC8vLyBTaXplIGluIGJ5dGVzIG9mIHRoZSB1bml0IGhlYWRlci4KKyAgdmlydHVhbCB1aW50MzJfdCBnZXRIZWFkZXJTaXplKCkgY29uc3QgeyByZXR1cm4gZ2V0VmVyc2lvbigpIDw9IDQgPyAxMSA6IDEyOyB9CisKKyAgLy8vIEZpbmQgdGhlIHVuaXQncyBjb250cmlidXRpb24gdG8gdGhlIHN0cmluZyBvZmZzZXRzIHRhYmxlIGFuZCBkZXRlcm1pbmUgaXRzCisgIC8vLyBsZW5ndGggYW5kIGZvcm0uIFRoZSBnaXZlbiBvZmZzZXQgaXMgZXhwZWN0ZWQgdG8gYmUgZGVyaXZlZCBmcm9tIHRoZSB1bml0CisgIC8vLyBESUUncyBEV19BVF9zdHJfb2Zmc2V0c19iYXNlIGF0dHJpYnV0ZS4KKyAgT3B0aW9uYWw8U3RyT2Zmc2V0c0NvbnRyaWJ1dGlvbkRlc2NyaXB0b3I+CisgIGRldGVybWluZVN0cmluZ09mZnNldHNUYWJsZUNvbnRyaWJ1dGlvbihEV0FSRkRhdGFFeHRyYWN0b3IgJkRBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0KTsKKworICAvLy8gRmluZCB0aGUgdW5pdCdzIGNvbnRyaWJ1dGlvbiB0byB0aGUgc3RyaW5nIG9mZnNldHMgdGFibGUgYW5kIGRldGVybWluZSBpdHMKKyAgLy8vIGxlbmd0aCBhbmQgZm9ybS4gVGhlIGdpdmVuIG9mZnNldCBpcyBleHBlY3RlZCB0byBiZSAwIGluIGEgZHdvIGZpbGUgb3IsCisgIC8vLyBpbiBhIGR3cCBmaWxlLCB0aGUgc3RhcnQgb2YgdGhlIHVuaXQncyBjb250cmlidXRpb24gdG8gdGhlIHN0cmluZyBvZmZzZXRzCisgIC8vLyB0YWJsZSBzZWN0aW9uIChhcyBkZXRlcm1pbmVkIGJ5IHRoZSBpbmRleCB0YWJsZSkuCisgIE9wdGlvbmFsPFN0ck9mZnNldHNDb250cmlidXRpb25EZXNjcmlwdG9yPgorICBkZXRlcm1pbmVTdHJpbmdPZmZzZXRzVGFibGVDb250cmlidXRpb25EV08oRFdBUkZEYXRhRXh0cmFjdG9yICZEQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldCk7CisKK3B1YmxpYzoKKyAgRFdBUkZVbml0KERXQVJGQ29udGV4dCAmQ29udGV4dCwgY29uc3QgRFdBUkZTZWN0aW9uICZTZWN0aW9uLAorICAgICAgICAgICAgY29uc3QgRFdBUkZEZWJ1Z0FiYnJldiAqREEsIGNvbnN0IERXQVJGU2VjdGlvbiAqUlMsIFN0cmluZ1JlZiBTUywKKyAgICAgICAgICAgIGNvbnN0IERXQVJGU2VjdGlvbiAmU09TLCBjb25zdCBEV0FSRlNlY3Rpb24gKkFPUywKKyAgICAgICAgICAgIGNvbnN0IERXQVJGU2VjdGlvbiAmTFMsIGJvb2wgTEUsIGJvb2wgSXNEV08sCisgICAgICAgICAgICBjb25zdCBEV0FSRlVuaXRTZWN0aW9uQmFzZSAmVW5pdFNlY3Rpb24sCisgICAgICAgICAgICBjb25zdCBEV0FSRlVuaXRJbmRleDo6RW50cnkgKkluZGV4RW50cnkgPSBudWxscHRyKTsKKworICB2aXJ0dWFsIH5EV0FSRlVuaXQoKTsKKworICBEV0FSRkNvbnRleHQmIGdldENvbnRleHQoKSBjb25zdCB7IHJldHVybiBDb250ZXh0OyB9CisKKyAgY29uc3QgRFdBUkZTZWN0aW9uICZnZXRMaW5lU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIExpbmVTZWN0aW9uOyB9CisgIFN0cmluZ1JlZiBnZXRTdHJpbmdTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gU3RyaW5nU2VjdGlvbjsgfQorICBjb25zdCBEV0FSRlNlY3Rpb24gJmdldFN0cmluZ09mZnNldFNlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIFN0cmluZ09mZnNldFNlY3Rpb247CisgIH0KKworICB2b2lkIHNldEFkZHJPZmZzZXRTZWN0aW9uKGNvbnN0IERXQVJGU2VjdGlvbiAqQU9TLCB1aW50MzJfdCBCYXNlKSB7CisgICAgQWRkck9mZnNldFNlY3Rpb24gPSBBT1M7CisgICAgQWRkck9mZnNldFNlY3Rpb25CYXNlID0gQmFzZTsKKyAgfQorCisgIC8vLyBSZWN1cnNpdmVseSB1cGRhdGUgYWRkcmVzcyB0byBEaWUgbWFwLgorICB2b2lkIHVwZGF0ZUFkZHJlc3NEaWVNYXAoRFdBUkZEaWUgRGllKTsKKworICB2b2lkIHNldFJhbmdlc1NlY3Rpb24oY29uc3QgRFdBUkZTZWN0aW9uICpSUywgdWludDMyX3QgQmFzZSkgeworICAgIFJhbmdlU2VjdGlvbiA9IFJTOworICAgIFJhbmdlU2VjdGlvbkJhc2UgPSBCYXNlOworICB9CisKKyAgYm9vbCBnZXRBZGRyT2Zmc2V0U2VjdGlvbkl0ZW0odWludDMyX3QgSW5kZXgsIHVpbnQ2NF90ICZSZXN1bHQpIGNvbnN0OworICBib29sIGdldFN0cmluZ09mZnNldFNlY3Rpb25JdGVtKHVpbnQzMl90IEluZGV4LCB1aW50NjRfdCAmUmVzdWx0KSBjb25zdDsKKworICBEV0FSRkRhdGFFeHRyYWN0b3IgZ2V0RGVidWdJbmZvRXh0cmFjdG9yKCkgY29uc3Q7CisKKyAgRGF0YUV4dHJhY3RvciBnZXRTdHJpbmdFeHRyYWN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIERhdGFFeHRyYWN0b3IoU3RyaW5nU2VjdGlvbiwgZmFsc2UsIDApOworICB9CisKKyAgYm9vbCBleHRyYWN0KGNvbnN0IERXQVJGRGF0YUV4dHJhY3RvciAmZGVidWdfaW5mbywgdWludDMyX3QgKm9mZnNldF9wdHIpOworCisgIC8vLyBleHRyYWN0UmFuZ2VMaXN0IC0gZXh0cmFjdHMgdGhlIHJhbmdlIGxpc3QgcmVmZXJlbmNlZCBieSB0aGlzIGNvbXBpbGUKKyAgLy8vIHVuaXQgZnJvbSAuZGVidWdfcmFuZ2VzIHNlY3Rpb24uIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgorICAvLy8gUmVxdWlyZXMgdGhhdCBjb21waWxlIHVuaXQgaXMgYWxyZWFkeSBleHRyYWN0ZWQuCisgIGJvb2wgZXh0cmFjdFJhbmdlTGlzdCh1aW50MzJfdCBSYW5nZUxpc3RPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICBEV0FSRkRlYnVnUmFuZ2VMaXN0ICZSYW5nZUxpc3QpIGNvbnN0OworICB2b2lkIGNsZWFyKCk7CisgIHVpbnQzMl90IGdldE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIE9mZnNldDsgfQorICB1aW50MzJfdCBnZXROZXh0VW5pdE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIE9mZnNldCArIExlbmd0aCArIDQ7IH0KKyAgdWludDMyX3QgZ2V0TGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gTGVuZ3RoOyB9CisKKyAgY29uc3QgT3B0aW9uYWw8U3RyT2Zmc2V0c0NvbnRyaWJ1dGlvbkRlc2NyaXB0b3I+ICYKKyAgZ2V0U3RyaW5nT2Zmc2V0c1RhYmxlQ29udHJpYnV0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBTdHJpbmdPZmZzZXRzVGFibGVDb250cmlidXRpb247CisgIH0KKyAgY29uc3QgZHdhcmY6OkZvcm1QYXJhbXMgJmdldEZvcm1QYXJhbXMoKSBjb25zdCB7IHJldHVybiBGb3JtUGFyYW1zOyB9CisgIHVpbnQxNl90IGdldFZlcnNpb24oKSBjb25zdCB7IHJldHVybiBGb3JtUGFyYW1zLlZlcnNpb247IH0KKyAgZHdhcmY6OkR3YXJmRm9ybWF0IGdldEZvcm1hdCgpIGNvbnN0IHsgcmV0dXJuIEZvcm1QYXJhbXMuRm9ybWF0OyB9CisgIHVpbnQ4X3QgZ2V0QWRkcmVzc0J5dGVTaXplKCkgY29uc3QgeyByZXR1cm4gRm9ybVBhcmFtcy5BZGRyU2l6ZTsgfQorICB1aW50OF90IGdldFJlZkFkZHJCeXRlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEZvcm1QYXJhbXMuZ2V0UmVmQWRkckJ5dGVTaXplKCk7IH0KKyAgdWludDhfdCBnZXREd2FyZk9mZnNldEJ5dGVTaXplKCkgY29uc3QgeworICAgIHJldHVybiBGb3JtUGFyYW1zLmdldER3YXJmT2Zmc2V0Qnl0ZVNpemUoKTsKKyAgfQorCisgIHVpbnQ4X3QgZ2V0RHdhcmZTdHJpbmdPZmZzZXRzQnl0ZVNpemUoKSBjb25zdCB7CisgICAgYXNzZXJ0KFN0cmluZ09mZnNldHNUYWJsZUNvbnRyaWJ1dGlvbik7CisgICAgcmV0dXJuIFN0cmluZ09mZnNldHNUYWJsZUNvbnRyaWJ1dGlvbi0+Z2V0RHdhcmZPZmZzZXRCeXRlU2l6ZSgpOworICB9CisKKyAgdWludDY0X3QgZ2V0U3RyaW5nT2Zmc2V0c0Jhc2UoKSBjb25zdCB7CisgICAgYXNzZXJ0KFN0cmluZ09mZnNldHNUYWJsZUNvbnRyaWJ1dGlvbik7CisgICAgcmV0dXJuIFN0cmluZ09mZnNldHNUYWJsZUNvbnRyaWJ1dGlvbi0+QmFzZTsKKyAgfQorCisgIGNvbnN0IERXQVJGQWJicmV2aWF0aW9uRGVjbGFyYXRpb25TZXQgKmdldEFiYnJldmlhdGlvbnMoKSBjb25zdDsKKworICB1aW50OF90IGdldFVuaXRUeXBlKCkgY29uc3QgeyByZXR1cm4gVW5pdFR5cGU7IH0KKworICBzdGF0aWMgYm9vbCBpc01hdGNoaW5nVW5pdFR5cGVBbmRUYWcodWludDhfdCBVbml0VHlwZSwgZHdhcmY6OlRhZyBUYWcpIHsKKyAgICBzd2l0Y2ggKFVuaXRUeXBlKSB7CisgICAgY2FzZSBkd2FyZjo6RFdfVVRfY29tcGlsZToKKyAgICAgIHJldHVybiBUYWcgPT0gZHdhcmY6OkRXX1RBR19jb21waWxlX3VuaXQ7CisgICAgY2FzZSBkd2FyZjo6RFdfVVRfdHlwZToKKyAgICAgIHJldHVybiBUYWcgPT0gZHdhcmY6OkRXX1RBR190eXBlX3VuaXQ7CisgICAgY2FzZSBkd2FyZjo6RFdfVVRfcGFydGlhbDoKKyAgICAgIHJldHVybiBUYWcgPT0gZHdhcmY6OkRXX1RBR19wYXJ0aWFsX3VuaXQ7CisgICAgY2FzZSBkd2FyZjo6RFdfVVRfc2tlbGV0b246CisgICAgICByZXR1cm4gVGFnID09IGR3YXJmOjpEV19UQUdfc2tlbGV0b25fdW5pdDsKKyAgICBjYXNlIGR3YXJmOjpEV19VVF9zcGxpdF9jb21waWxlOgorICAgIGNhc2UgZHdhcmY6OkRXX1VUX3NwbGl0X3R5cGU6CisgICAgICByZXR1cm4gZHdhcmY6OmlzVW5pdFR5cGUoVGFnKTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBmb3IgdGhlIGhlYWRlciBvZiBhIHVuaXQgb2YKKyAgLy8vIFVuaXRUeXBlIHR5cGUuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgdmFsaWQgdW5pdCB0eXBlIHdoaWNoIGluCisgIC8vLyBEV0FSRjUgaXMgZGVmaW5lZCBhcyBvbmUgb2YgdGhlIGZvbGxvd2luZyBzaXggdHlwZXMuCisgIHN0YXRpYyB1aW50MzJfdCBnZXREV0FSRjVIZWFkZXJTaXplKHVpbnQ4X3QgVW5pdFR5cGUpIHsKKyAgICBzd2l0Y2ggKFVuaXRUeXBlKSB7CisgICAgY2FzZSBkd2FyZjo6RFdfVVRfY29tcGlsZToKKyAgICBjYXNlIGR3YXJmOjpEV19VVF9wYXJ0aWFsOgorICAgICAgcmV0dXJuIDEyOworICAgIGNhc2UgZHdhcmY6OkRXX1VUX3NrZWxldG9uOgorICAgIGNhc2UgZHdhcmY6OkRXX1VUX3NwbGl0X2NvbXBpbGU6CisgICAgICByZXR1cm4gMjA7CisgICAgY2FzZSBkd2FyZjo6RFdfVVRfdHlwZToKKyAgICBjYXNlIGR3YXJmOjpEV19VVF9zcGxpdF90eXBlOgorICAgICAgcmV0dXJuIDI0OworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIFVuaXRUeXBlLiIpOworICB9CisKKyAgbGx2bTo6T3B0aW9uYWw8QmFzZUFkZHJlc3M+IGdldEJhc2VBZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gQmFzZUFkZHI7IH0KKworICB2b2lkIHNldEJhc2VBZGRyZXNzKEJhc2VBZGRyZXNzIEJhc2VBZGRyKSB7IHRoaXMtPkJhc2VBZGRyID0gQmFzZUFkZHI7IH0KKworICBEV0FSRkRpZSBnZXRVbml0RElFKGJvb2wgRXh0cmFjdFVuaXRESUVPbmx5ID0gdHJ1ZSkgeworICAgIGV4dHJhY3RESUVzSWZOZWVkZWQoRXh0cmFjdFVuaXRESUVPbmx5KTsKKyAgICBpZiAoRGllQXJyYXkuZW1wdHkoKSkKKyAgICAgIHJldHVybiBEV0FSRkRpZSgpOworICAgIHJldHVybiBEV0FSRkRpZSh0aGlzLCAmRGllQXJyYXlbMF0pOworICB9CisKKyAgY29uc3QgY2hhciAqZ2V0Q29tcGlsYXRpb25EaXIoKTsKKyAgT3B0aW9uYWw8dWludDY0X3Q+IGdldERXT0lkKCk7CisKKyAgdm9pZCBjb2xsZWN0QWRkcmVzc1JhbmdlcyhEV0FSRkFkZHJlc3NSYW5nZXNWZWN0b3IgJkNVUmFuZ2VzKTsKKworICAvLy8gUmV0dXJucyBzdWJwcm9ncmFtIERJRSB3aXRoIGFkZHJlc3MgcmFuZ2UgZW5jb21wYXNzaW5nIHRoZSBwcm92aWRlZAorICAvLy8gYWRkcmVzcy4gVGhlIHBvaW50ZXIgaXMgYWxpdmUgYXMgbG9uZyBhcyBwYXJzZWQgY29tcGlsZSB1bml0IERJRXMgYXJlIG5vdAorICAvLy8gY2xlYXJlZC4KKyAgRFdBUkZEaWUgZ2V0U3Vicm91dGluZUZvckFkZHJlc3ModWludDY0X3QgQWRkcmVzcyk7CisKKyAgLy8vIGdldElubGluZWRDaGFpbkZvckFkZHJlc3MgLSBmZXRjaGVzIGlubGluZWQgY2hhaW4gZm9yIGEgZ2l2ZW4gYWRkcmVzcy4KKyAgLy8vIFJldHVybnMgZW1wdHkgY2hhaW4gaWYgdGhlcmUgaXMgbm8gc3VicHJvZ3JhbSBjb250YWluaW5nIGFkZHJlc3MuIFRoZQorICAvLy8gY2hhaW4gaXMgdmFsaWQgYXMgbG9uZyBhcyBwYXJzZWQgY29tcGlsZSB1bml0IERJRXMgYXJlIG5vdCBjbGVhcmVkLgorICB2b2lkIGdldElubGluZWRDaGFpbkZvckFkZHJlc3ModWludDY0X3QgQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxEV0FSRkRpZT4gJklubGluZWRDaGFpbik7CisKKyAgLy8vIGdldFVuaXRTZWN0aW9uIC0gUmV0dXJuIHRoZSBEV0FSRlVuaXRTZWN0aW9uIGNvbnRhaW5pbmcgdGhpcyB1bml0LgorICBjb25zdCBEV0FSRlVuaXRTZWN0aW9uQmFzZSAmZ2V0VW5pdFNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBVbml0U2VjdGlvbjsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbnVtYmVyIG9mIERJRXMgaW4gdGhlIHVuaXQuIFBhcnNlcyB0aGUgdW5pdAorICAvLy8gaWYgbmVjZXNzYXJ5LgorICB1bnNpZ25lZCBnZXROdW1ESUVzKCkgeworICAgIGV4dHJhY3RESUVzSWZOZWVkZWQoZmFsc2UpOworICAgIHJldHVybiBEaWVBcnJheS5zaXplKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgaW5kZXggb2YgYSBESUUgaW5zaWRlIHRoZSB1bml0J3MgRElFIHZlY3Rvci4KKyAgLy8vCisgIC8vLyBJdCBpcyBpbGxlZ2FsIHRvIGNhbGwgdGhpcyBtZXRob2Qgd2l0aCBhIERJRSB0aGF0IGhhc24ndCBiZQorICAvLy8gY3JlYXRlZCBieSB0aGlzIHVuaXQuIEluIG90aGVyIHdvcmQsIGl0J3MgaWxsZWdhbCB0byBjYWxsIHRoaXMKKyAgLy8vIG1ldGhvZCBvbiBhIERJRSB0aGF0IGlzbid0IGFjY2Vzc2libGUgYnkgZm9sbG93aW5nCisgIC8vLyBjaGlsZHJlbi9zaWJsaW5nIGxpbmtzIHN0YXJ0aW5nIGZyb20gdGhpcyB1bml0J3MgZ2V0VW5pdERJRSgpLgorICB1aW50MzJfdCBnZXRESUVJbmRleChjb25zdCBEV0FSRkRpZSAmRCkgeworICAgIHJldHVybiBnZXRESUVJbmRleChELmdldERlYnVnSW5mb0VudHJ5KCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIERJRSBvYmplY3QgYXQgdGhlIGdpdmVuIGluZGV4LgorICBEV0FSRkRpZSBnZXRESUVBdEluZGV4KHVuc2lnbmVkIEluZGV4KSB7CisgICAgYXNzZXJ0KEluZGV4IDwgRGllQXJyYXkuc2l6ZSgpKTsKKyAgICByZXR1cm4gRFdBUkZEaWUodGhpcywgJkRpZUFycmF5W0luZGV4XSk7CisgIH0KKworICBEV0FSRkRpZSBnZXRQYXJlbnQoY29uc3QgRFdBUkZEZWJ1Z0luZm9FbnRyeSAqRGllKTsKKyAgRFdBUkZEaWUgZ2V0U2libGluZyhjb25zdCBEV0FSRkRlYnVnSW5mb0VudHJ5ICpEaWUpOworICBEV0FSRkRpZSBnZXRGaXJzdENoaWxkKGNvbnN0IERXQVJGRGVidWdJbmZvRW50cnkgKkRpZSk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIERJRSBvYmplY3QgZm9yIGEgZ2l2ZW4gb2Zmc2V0IGluc2lkZSB0aGUKKyAgLy8vIHVuaXQncyBESUUgdmVjdG9yLgorICAvLy8KKyAgLy8vIFRoZSB1bml0IG5lZWRzIHRvIGhhdmUgaXRzIERJRXMgZXh0cmFjdGVkIGZvciB0aGlzIG1ldGhvZCB0byB3b3JrLgorICBEV0FSRkRpZSBnZXRESUVGb3JPZmZzZXQodWludDMyX3QgT2Zmc2V0KSB7CisgICAgZXh0cmFjdERJRXNJZk5lZWRlZChmYWxzZSk7CisgICAgYXNzZXJ0KCFEaWVBcnJheS5lbXB0eSgpKTsKKyAgICBhdXRvIGl0ID0gc3RkOjpsb3dlcl9ib3VuZCgKKyAgICAgICAgRGllQXJyYXkuYmVnaW4oKSwgRGllQXJyYXkuZW5kKCksIE9mZnNldCwKKyAgICAgICAgW10oY29uc3QgRFdBUkZEZWJ1Z0luZm9FbnRyeSAmTEhTLCB1aW50MzJfdCBPZmZzZXQpIHsKKyAgICAgICAgICByZXR1cm4gTEhTLmdldE9mZnNldCgpIDwgT2Zmc2V0OworICAgICAgICB9KTsKKyAgICBpZiAoaXQgIT0gRGllQXJyYXkuZW5kKCkgJiYgaXQtPmdldE9mZnNldCgpID09IE9mZnNldCkKKyAgICAgIHJldHVybiBEV0FSRkRpZSh0aGlzLCAmKml0KTsKKyAgICByZXR1cm4gRFdBUkZEaWUoKTsKKyAgfQorCisgIHVpbnQzMl90IGdldExpbmVUYWJsZU9mZnNldCgpIGNvbnN0IHsKKyAgICBpZiAoSW5kZXhFbnRyeSkKKyAgICAgIGlmIChjb25zdCBhdXRvICpDb250cmliID0gSW5kZXhFbnRyeS0+Z2V0T2Zmc2V0KERXX1NFQ1RfTElORSkpCisgICAgICAgIHJldHVybiBDb250cmliLT5PZmZzZXQ7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBkaWVfaXRlcmF0b3JfcmFuZ2UgZGllcygpIHsKKyAgICBleHRyYWN0RElFc0lmTmVlZGVkKGZhbHNlKTsKKyAgICByZXR1cm4gZGllX2l0ZXJhdG9yX3JhbmdlKERpZUFycmF5LmJlZ2luKCksIERpZUFycmF5LmVuZCgpKTsKKyAgfQorCitwcml2YXRlOgorICAvLy8gU2l6ZSBpbiBieXRlcyBvZiB0aGUgLmRlYnVnX2luZm8gZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjb21waWxlIHVuaXQuCisgIHNpemVfdCBnZXREZWJ1Z0luZm9TaXplKCkgY29uc3QgeyByZXR1cm4gTGVuZ3RoICsgNCAtIGdldEhlYWRlclNpemUoKTsgfQorCisgIC8vLyBleHRyYWN0RElFc0lmTmVlZGVkIC0gUGFyc2VzIGEgY29tcGlsZSB1bml0IGFuZCBpbmRleGVzIGl0cyBESUVzIGlmIGl0CisgIC8vLyBoYXNuJ3QgYWxyZWFkeSBiZWVuIGRvbmUuIFJldHVybnMgdGhlIG51bWJlciBvZiBESUVzIHBhcnNlZCBhdCB0aGlzIGNhbGwuCisgIHNpemVfdCBleHRyYWN0RElFc0lmTmVlZGVkKGJvb2wgQ1VEaWVPbmx5KTsKKworICAvLy8gZXh0cmFjdERJRXNUb1ZlY3RvciAtIEFwcGVuZHMgYWxsIHBhcnNlZCBESUVzIHRvIGEgdmVjdG9yLgorICB2b2lkIGV4dHJhY3RESUVzVG9WZWN0b3IoYm9vbCBBcHBlbmRDVURpZSwgYm9vbCBBcHBlbmROb25DVURJRXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxEV0FSRkRlYnVnSW5mb0VudHJ5PiAmRElFcykgY29uc3Q7CisKKyAgLy8vIGNsZWFyRElFcyAtIENsZWFyIHBhcnNlZCBESUVzIHRvIGtlZXAgbWVtb3J5IHVzYWdlIGxvdy4KKyAgdm9pZCBjbGVhckRJRXMoYm9vbCBLZWVwQ1VEaWUpOworCisgIC8vLyBwYXJzZURXTyAtIFBhcnNlcyAuZHdvIGZpbGUgZm9yIGN1cnJlbnQgY29tcGlsZSB1bml0LiBSZXR1cm5zIHRydWUgaWYKKyAgLy8vIGl0IHdhcyBhY3R1YWxseSBjb25zdHJ1Y3RlZC4KKyAgYm9vbCBwYXJzZURXTygpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGVU5JVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9EV0FSRi9EV0FSRlVuaXRJbmRleC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZVbml0SW5kZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWVkNGJiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZVbml0SW5kZXguaApAQCAtMCwwICsxLDEwNSBAQAorLy89PT0tIERXQVJGVW5pdEluZGV4LmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRlVOSVRJTkRFWF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGVU5JVElOREVYX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFFeHRyYWN0b3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworZW51bSBEV0FSRlNlY3Rpb25LaW5kIHsKKyAgRFdfU0VDVF9JTkZPID0gMSwKKyAgRFdfU0VDVF9UWVBFUywKKyAgRFdfU0VDVF9BQkJSRVYsCisgIERXX1NFQ1RfTElORSwKKyAgRFdfU0VDVF9MT0MsCisgIERXX1NFQ1RfU1RSX09GRlNFVFMsCisgIERXX1NFQ1RfTUFDSU5GTywKKyAgRFdfU0VDVF9NQUNSTywKK307CisKK2NsYXNzIERXQVJGVW5pdEluZGV4IHsKKyAgc3RydWN0IEhlYWRlciB7CisgICAgdWludDMyX3QgVmVyc2lvbjsKKyAgICB1aW50MzJfdCBOdW1Db2x1bW5zOworICAgIHVpbnQzMl90IE51bVVuaXRzOworICAgIHVpbnQzMl90IE51bUJ1Y2tldHMgPSAwOworCisgICAgYm9vbCBwYXJzZShEYXRhRXh0cmFjdG9yIEluZGV4RGF0YSwgdWludDMyX3QgKk9mZnNldFB0cik7CisgICAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIH07CisKK3B1YmxpYzoKKyAgY2xhc3MgRW50cnkgeworICBwdWJsaWM6CisgICAgc3RydWN0IFNlY3Rpb25Db250cmlidXRpb24geworICAgICAgdWludDMyX3QgT2Zmc2V0OworICAgICAgdWludDMyX3QgTGVuZ3RoOworICAgIH07CisKKyAgcHJpdmF0ZToKKyAgICBjb25zdCBEV0FSRlVuaXRJbmRleCAqSW5kZXg7CisgICAgdWludDY0X3QgU2lnbmF0dXJlOworICAgIHN0ZDo6dW5pcXVlX3B0cjxTZWN0aW9uQ29udHJpYnV0aW9uW10+IENvbnRyaWJ1dGlvbnM7CisgICAgZnJpZW5kIGNsYXNzIERXQVJGVW5pdEluZGV4OworCisgIHB1YmxpYzoKKyAgICBjb25zdCBTZWN0aW9uQ29udHJpYnV0aW9uICpnZXRPZmZzZXQoRFdBUkZTZWN0aW9uS2luZCBTZWMpIGNvbnN0OworICAgIGNvbnN0IFNlY3Rpb25Db250cmlidXRpb24gKmdldE9mZnNldCgpIGNvbnN0OworCisgICAgY29uc3QgU2VjdGlvbkNvbnRyaWJ1dGlvbiAqZ2V0T2Zmc2V0cygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBDb250cmlidXRpb25zLmdldCgpOworICAgIH0KKworICAgIHVpbnQ2NF90IGdldFNpZ25hdHVyZSgpIGNvbnN0IHsgcmV0dXJuIFNpZ25hdHVyZTsgfQorICB9OworCitwcml2YXRlOgorICBzdHJ1Y3QgSGVhZGVyIEhlYWRlcjsKKworICBEV0FSRlNlY3Rpb25LaW5kIEluZm9Db2x1bW5LaW5kOworICBpbnQgSW5mb0NvbHVtbiA9IC0xOworICBzdGQ6OnVuaXF1ZV9wdHI8RFdBUkZTZWN0aW9uS2luZFtdPiBDb2x1bW5LaW5kczsKKyAgc3RkOjp1bmlxdWVfcHRyPEVudHJ5W10+IFJvd3M7CisKKyAgc3RhdGljIFN0cmluZ1JlZiBnZXRDb2x1bW5IZWFkZXIoRFdBUkZTZWN0aW9uS2luZCBEUyk7CisKKyAgYm9vbCBwYXJzZUltcGwoRGF0YUV4dHJhY3RvciBJbmRleERhdGEpOworCitwdWJsaWM6CisgIERXQVJGVW5pdEluZGV4KERXQVJGU2VjdGlvbktpbmQgSW5mb0NvbHVtbktpbmQpCisgICAgICA6IEluZm9Db2x1bW5LaW5kKEluZm9Db2x1bW5LaW5kKSB7fQorCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBIZWFkZXIuTnVtQnVja2V0czsgfQorCisgIGJvb2wgcGFyc2UoRGF0YUV4dHJhY3RvciBJbmRleERhdGEpOworICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICBjb25zdCBFbnRyeSAqZ2V0RnJvbU9mZnNldCh1aW50MzJfdCBPZmZzZXQpIGNvbnN0OworICBjb25zdCBFbnRyeSAqZ2V0RnJvbUhhc2godWludDY0X3QgT2Zmc2V0KSBjb25zdDsKKworICBBcnJheVJlZjxEV0FSRlNlY3Rpb25LaW5kPiBnZXRDb2x1bW5LaW5kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZUFycmF5UmVmKENvbHVtbktpbmRzLmdldCgpLCBIZWFkZXIuTnVtQ29sdW1ucyk7CisgIH0KKworICBBcnJheVJlZjxFbnRyeT4gZ2V0Um93cygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZUFycmF5UmVmKFJvd3MuZ2V0KCksIEhlYWRlci5OdW1CdWNrZXRzKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGVU5JVElOREVYX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGVmVyaWZpZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGVmVyaWZpZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmFhMjk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZWZXJpZmllci5oCkBAIC0wLDAgKzEsMzA5IEBACisvLz09PS0gRFdBUkZWZXJpZmllci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX0RXQVJGX0RXQVJGVkVSSUZJRVJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19EV0FSRl9EV0FSRlZFUklGSUVSX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RJQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGQWNjZWxlcmF0b3JUYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0RXQVJGL0RXQVJGQWRkcmVzc1JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRFdBUkYvRFdBUkZEaWUuaCIKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgcmF3X29zdHJlYW07CitzdHJ1Y3QgRFdBUkZBdHRyaWJ1dGU7CitjbGFzcyBEV0FSRkNvbnRleHQ7CitjbGFzcyBEV0FSRkRpZTsKK2NsYXNzIERXQVJGVW5pdDsKK2NsYXNzIERXQVJGRGF0YUV4dHJhY3RvcjsKK2NsYXNzIERXQVJGRGVidWdBYmJyZXY7CitjbGFzcyBEYXRhRXh0cmFjdG9yOworc3RydWN0IERXQVJGU2VjdGlvbjsKKworLy8vIEEgY2xhc3MgdGhhdCB2ZXJpZmllcyBEV0FSRiBkZWJ1ZyBpbmZvcm1hdGlvbiBnaXZlbiBhIERXQVJGIENvbnRleHQuCitjbGFzcyBEV0FSRlZlcmlmaWVyIHsKK3B1YmxpYzoKKyAgLy8vIEEgY2xhc3MgdGhhdCBrZWVwcyB0aGUgYWRkcmVzcyByYW5nZSBpbmZvcm1hdGlvbiBmb3IgYSBzaW5nbGUgRElFLgorICBzdHJ1Y3QgRGllUmFuZ2VJbmZvIHsKKyAgICBEV0FSRkRpZSBEaWU7CisKKyAgICAvLy8gU29ydGVkIERXQVJGQWRkcmVzc1Jhbmdlcy4KKyAgICBzdGQ6OnZlY3RvcjxEV0FSRkFkZHJlc3NSYW5nZT4gUmFuZ2VzOworCisgICAgLy8vIFNvcnRlZCBEV0FSRkFkZHJlc3NSYW5nZUluZm8uCisgICAgc3RkOjpzZXQ8RGllUmFuZ2VJbmZvPiBDaGlsZHJlbjsKKworICAgIERpZVJhbmdlSW5mbygpID0gZGVmYXVsdDsKKyAgICBEaWVSYW5nZUluZm8oRFdBUkZEaWUgRGllKSA6IERpZShEaWUpIHt9CisKKyAgICAvLy8gVXNlZCBmb3IgdW5pdCB0ZXN0aW5nLgorICAgIERpZVJhbmdlSW5mbyhzdGQ6OnZlY3RvcjxEV0FSRkFkZHJlc3NSYW5nZT4gUmFuZ2VzKQorICAgICAgICA6IFJhbmdlcyhzdGQ6Om1vdmUoUmFuZ2VzKSkge30KKworICAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8RFdBUkZBZGRyZXNzUmFuZ2U+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICBhZGRyZXNzX3JhbmdlX2l0ZXJhdG9yOworICAgIHR5cGVkZWYgc3RkOjpzZXQ8RGllUmFuZ2VJbmZvPjo6Y29uc3RfaXRlcmF0b3IgZGllX3JhbmdlX2luZm9faXRlcmF0b3I7CisKKyAgICAvLy8gSW5zZXJ0cyB0aGUgYWRkcmVzcyByYW5nZS4gSWYgdGhlIHJhbmdlIG92ZXJsYXBzIHdpdGggYW4gZXhpc3RpbmcKKyAgICAvLy8gcmFuZ2UsIHRoZSByYW5nZSBpcyAqbm90KiBhZGRlZCBhbmQgYW4gaXRlcmF0b3IgdG8gdGhlIG92ZXJsYXBwaW5nCisgICAgLy8vIHJhbmdlIGlzIHJldHVybmVkLgorICAgIC8vLworICAgIC8vLyBUaGlzIGlzIHVzZWQgZm9yIGZpbmRpbmcgb3ZlcmxhcHBpbmcgcmFuZ2VzIHdpdGhpbiB0aGUgc2FtZSBESUUuCisgICAgYWRkcmVzc19yYW5nZV9pdGVyYXRvciBpbnNlcnQoY29uc3QgRFdBUkZBZGRyZXNzUmFuZ2UgJlIpOworCisgICAgLy8vIEZpbmRzIGFuIGFkZHJlc3MgcmFuZ2UgaW4gdGhlIHNvcnRlZCB2ZWN0b3Igb2YgcmFuZ2VzLgorICAgIGFkZHJlc3NfcmFuZ2VfaXRlcmF0b3IgZmluZFJhbmdlKGNvbnN0IERXQVJGQWRkcmVzc1JhbmdlICZSKSBjb25zdCB7CisgICAgICBhdXRvIEJlZ2luID0gUmFuZ2VzLmJlZ2luKCk7CisgICAgICBhdXRvIEVuZCA9IFJhbmdlcy5lbmQoKTsKKyAgICAgIGF1dG8gSXRlciA9IHN0ZDo6dXBwZXJfYm91bmQoQmVnaW4sIEVuZCwgUik7CisgICAgICBpZiAoSXRlciAhPSBCZWdpbikKKyAgICAgICAgLS1JdGVyOworICAgICAgcmV0dXJuIEl0ZXI7CisgICAgfQorCisgICAgLy8vIEluc2VydHMgdGhlIGFkZHJlc3MgcmFuZ2UgaW5mby4gSWYgYW55IG9mIGl0cyByYW5nZXMgb3ZlcmxhcHMgd2l0aCBhCisgICAgLy8vIHJhbmdlIGluIGFuIGV4aXN0aW5nIHJhbmdlIGluZm8sIHRoZSByYW5nZSBpbmZvIGlzICpub3QqIGFkZGVkIGFuZCBhbgorICAgIC8vLyBpdGVyYXRvciB0byB0aGUgb3ZlcmxhcHBpbmcgcmFuZ2UgaW5mby4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyBpcyB1c2VkIGZvciBmaW5kaW5nIG92ZXJsYXBwaW5nIGNoaWxkcmVuIG9mIHRoZSBzYW1lIERJRS4KKyAgICBkaWVfcmFuZ2VfaW5mb19pdGVyYXRvciBpbnNlcnQoY29uc3QgRGllUmFuZ2VJbmZvICZSSSk7CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgcmFuZ2VzIGluIHRoaXMgb2JqZWN0IGNvbnRhaW5zIGFsbCByYW5nZXMgd2l0aGluIFJIUy4KKyAgICBib29sIGNvbnRhaW5zKGNvbnN0IERpZVJhbmdlSW5mbyAmUkhTKSBjb25zdDsKKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhbnkgcmFuZ2UgaW4gdGhpcyBvYmplY3QgaW50ZXJzZWN0cyB3aXRoIGFueSByYW5nZSBpbgorICAgIC8vLyBSSFMuCisgICAgYm9vbCBpbnRlcnNlY3RzKGNvbnN0IERpZVJhbmdlSW5mbyAmUkhTKSBjb25zdDsKKyAgfTsKKworcHJpdmF0ZToKKyAgcmF3X29zdHJlYW0gJk9TOworICBEV0FSRkNvbnRleHQgJkRDdHg7CisgIERJRHVtcE9wdGlvbnMgRHVtcE9wdHM7CisgIC8vLyBBIG1hcCB0aGF0IHRyYWNrcyBhbGwgcmVmZXJlbmNlcyAoY29udmVydGVkIGFic29sdXRlIHJlZmVyZW5jZXMpIHNvIHdlCisgIC8vLyBjYW4gdmVyaWZ5IGVhY2ggcmVmZXJlbmNlIHBvaW50cyB0byBhIHZhbGlkIERJRSBhbmQgbm90IGFuIG9mZnNldCB0aGF0CisgIC8vLyBsaWVzIGJldHdlZW4gdG8gdmFsaWQgRElFcy4KKyAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c2V0PHVpbnQzMl90Pj4gUmVmZXJlbmNlVG9ESUVPZmZzZXRzOworICB1aW50MzJfdCBOdW1EZWJ1Z0xpbmVFcnJvcnMgPSAwOworCisgIHJhd19vc3RyZWFtICZlcnJvcigpIGNvbnN0OworICByYXdfb3N0cmVhbSAmd2FybigpIGNvbnN0OworICByYXdfb3N0cmVhbSAmbm90ZSgpIGNvbnN0OworCisgIC8vLyBWZXJpZmllcyB0aGUgYWJicmV2aWF0aW9ucyBzZWN0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gY3VycmVudGx5IGNoZWNrcyB0aGF0OgorICAvLy8gLS1ObyBhYmJyZXZpYXRpb24gZGVjbGFyYXRpb24gaGFzIG1vcmUgdGhhbiBvbmUgYXR0cmlidXRlcyB3aXRoIHRoZSBzYW1lCisgIC8vLyBuYW1lLgorICAvLy8KKyAgLy8vIFxwYXJhbSBBYmJyZXYgUG9pbnRlciB0byB0aGUgYWJicmV2aWF0aW9ucyBzZWN0aW9uIHdlIGFyZSB2ZXJpZnlpbmcKKyAgLy8vIEFiYnJldiBjYW4gYmUgYSBwb2ludGVyIHRvIGVpdGhlciAuZGVidWdfYWJicmV2IG9yIGRlYnVnX2FiYnJldi5kd28uCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIG51bWJlciBvZiBlcnJvcnMgdGhhdCBvY2N1cnJlZCBkdXJpbmcgdmVyaWZpY2F0aW9uLgorICB1bnNpZ25lZCB2ZXJpZnlBYmJyZXZTZWN0aW9uKGNvbnN0IERXQVJGRGVidWdBYmJyZXYgKkFiYnJldik7CisKKyAgLy8vIFZlcmlmaWVzIHRoZSBoZWFkZXIgb2YgYSB1bml0IGluIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gY3VycmVudGx5IGNoZWNrcyBmb3I6CisgIC8vLyAtIFVuaXQgaXMgaW4gMzItYml0IERXQVJGIGZvcm1hdC4gVGhlIGZ1bmN0aW9uIGNhbiBiZSBtb2RpZmllZCB0bworICAvLy8gc3VwcG9ydCA2NC1iaXQgZm9ybWF0LgorICAvLy8gLSBUaGUgRFdBUkYgdmVyc2lvbiBpcyB2YWxpZAorICAvLy8gLSBUaGUgdW5pdCB0eXBlIGlzIHZhbGlkIChpZiB1bml0IGlzIGluIHZlcnNpb24gPj01KQorICAvLy8gLSBUaGUgdW5pdCBkb2Vzbid0IGV4dGVuZCBiZXlvbmQgLmRlYnVnX2luZm8gc2VjdGlvbgorICAvLy8gLSBUaGUgYWRkcmVzcyBzaXplIGlzIHZhbGlkCisgIC8vLyAtIFRoZSBvZmZzZXQgaW4gdGhlIC5kZWJ1Z19hYmJyZXYgc2VjdGlvbiBpcyB2YWxpZAorICAvLy8KKyAgLy8vIFxwYXJhbSBEZWJ1Z0luZm9EYXRhIFRoZSAuZGVidWdfaW5mbyBzZWN0aW9uIGRhdGEKKyAgLy8vIFxwYXJhbSBPZmZzZXQgQSByZWZlcmVuY2UgdG8gdGhlIG9mZnNldCBzdGFydCBvZiB0aGUgdW5pdC4gVGhlIG9mZnNldCB3aWxsCisgIC8vLyBiZSB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBuZXh0IHVuaXQgaW4gLmRlYnVnX2luZm8KKyAgLy8vIFxwYXJhbSBVbml0SW5kZXggVGhlIGluZGV4IG9mIHRoZSB1bml0IHRvIGJlIHZlcmlmaWVkCisgIC8vLyBccGFyYW0gVW5pdFR5cGUgQSByZWZlcmVuY2UgdG8gdGhlIHR5cGUgb2YgdGhlIHVuaXQKKyAgLy8vIFxwYXJhbSBpc1VuaXREV0FSRjY0IEEgcmVmZXJlbmNlIHRvIGEgZmxhZyB0aGF0IHNob3dzIHdoZXRoZXIgdGhlIHVuaXQgaXMKKyAgLy8vIGluIDY0LWJpdCBmb3JtYXQuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGUgaGVhZGVyIGlzIHZlcmlmaWVkIHN1Y2Nlc3NmdWxseSwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIHZlcmlmeVVuaXRIZWFkZXIoY29uc3QgRFdBUkZEYXRhRXh0cmFjdG9yIERlYnVnSW5mb0RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAqT2Zmc2V0LCB1bnNpZ25lZCBVbml0SW5kZXgsIHVpbnQ4X3QgJlVuaXRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmaXNVbml0RFdBUkY2NCk7CisKKyAgLy8vIFZlcmlmaWVzIHRoZSBoZWFkZXIgb2YgYSB1bml0IGluIHRoZSAuZGVidWdfaW5mbyBzZWN0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gY3VycmVudGx5IHZlcmlmaWVzOgorICAvLy8gIC0gVGhlIGRlYnVnIGluZm8gYXR0cmlidXRlcy4KKyAgLy8vICAtIFRoZSBkZWJ1ZyBpbmZvIGZvcm09cy4KKyAgLy8vICAtIFRoZSBwcmVzZW5jZSBvZiBhIHJvb3QgRElFLgorICAvLy8gIC0gVGhhdCB0aGUgcm9vdCBESUUgaXMgYSB1bml0IERJRS4KKyAgLy8vICAtIElmIGEgdW5pdCB0eXBlIGlzIHByb3ZpZGVkLCB0aGF0IHRoZSB1bml0IERJRSBtYXRjaGVzIHRoZSB1bml0IHR5cGUuCisgIC8vLyAgLSBUaGUgRElFIHJhbmdlcy4KKyAgLy8vCisgIC8vLyBccGFyYW0gVW5pdCAgICAgIFRoZSBEV0FSRiBVbml0IHRvIHZlcmlmaXkuCisgIC8vLyBccGFyYW0gVW5pdFR5cGUgIEFuIG9wdGlvbmFsIHVuaXQgdHlwZSB3aGljaCB3aWxsIGJlIHVzZWQgdG8gdmVyaWZ5IHRoZQorICAvLy8gICAgICAgICAgICAgICAgICB0eXBlIG9mIHRoZSB1bml0IERJRS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoZSBjb250ZW50IGlzIHZlcmlmaWVkIHN1Y2Nlc3NmdWxseSwgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIHZlcmlmeVVuaXRDb250ZW50cyhEV0FSRlVuaXQgVW5pdCwgdWludDhfdCBVbml0VHlwZSA9IDApOworCisgIC8vLyBWZXJpZnkgdGhhdCBhbGwgRGllIHJhbmdlcyBhcmUgdmFsaWQuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBjdXJyZW50bHkgY2hlY2tzIGZvcjoKKyAgLy8vIC0gY2FzZXMgaW4gd2hpY2ggbG93UEMgPj0gaGlnaFBDCisgIC8vLworICAvLy8gXHJldHVybnMgTnVtYmVyIG9mIGVycm9ycyB0aGF0IG9jY3VycmVkIGR1cmluZyB2ZXJpZmljYXRpb24uCisgIHVuc2lnbmVkIHZlcmlmeURpZVJhbmdlcyhjb25zdCBEV0FSRkRpZSAmRGllLCBEaWVSYW5nZUluZm8gJlBhcmVudFJJKTsKKworICAvLy8gVmVyaWZpZXMgdGhlIGF0dHJpYnV0ZSdzIERXQVJGIGF0dHJpYnV0ZSBhbmQgaXRzIHZhbHVlLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gY3VycmVudGx5IGNoZWNrcyBmb3I6CisgIC8vLyAtIERXX0FUX3JhbmdlcyB2YWx1ZXMgaXMgYSB2YWxpZCAuZGVidWdfcmFuZ2VzIG9mZnNldAorICAvLy8gLSBEV19BVF9zdG10X2xpc3QgaXMgYSB2YWxpZCAuZGVidWdfbGluZSBvZmZzZXQKKyAgLy8vCisgIC8vLyBccGFyYW0gRGllICAgICAgICAgIFRoZSBEV0FSRiBESUUgdGhhdCBvd25zIHRoZSBhdHRyaWJ1dGUgdmFsdWUKKyAgLy8vIFxwYXJhbSBBdHRyVmFsdWUgICAgVGhlIERXQVJGIGF0dHJpYnV0ZSB2YWx1ZSB0byBjaGVjaworICAvLy8KKyAgLy8vIFxyZXR1cm5zIE51bUVycm9ycyBUaGUgbnVtYmVyIG9mIGVycm9ycyBvY2N1cnJlZCBkdXJpbmcgdmVyaWZpY2F0aW9uIG9mCisgIC8vLyBhdHRyaWJ1dGVzJyB2YWx1ZXMgaW4gYSAuZGVidWdfaW5mbyBzZWN0aW9uIHVuaXQKKyAgdW5zaWduZWQgdmVyaWZ5RGVidWdJbmZvQXR0cmlidXRlKGNvbnN0IERXQVJGRGllICZEaWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV0FSRkF0dHJpYnV0ZSAmQXR0clZhbHVlKTsKKworICAvLy8gVmVyaWZpZXMgdGhlIGF0dHJpYnV0ZSdzIERXQVJGIGZvcm0uCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBjdXJyZW50bHkgY2hlY2tzIGZvcjoKKyAgLy8vIC0gQWxsIERXX0ZPUk1fcmVmIHZhbHVlcyB0aGF0IGFyZSBDVSByZWxhdGl2ZSBoYXZlIHZhbGlkIENVIG9mZnNldHMKKyAgLy8vIC0gQWxsIERXX0ZPUk1fcmVmX2FkZHIgdmFsdWVzIGhhdmUgdmFsaWQgLmRlYnVnX2luZm8gb2Zmc2V0cworICAvLy8gLSBBbGwgRFdfRk9STV9zdHJwIHZhbHVlcyBoYXZlIHZhbGlkIC5kZWJ1Z19zdHIgb2Zmc2V0cworICAvLy8KKyAgLy8vIFxwYXJhbSBEaWUgICAgICAgICAgVGhlIERXQVJGIERJRSB0aGF0IG93bnMgdGhlIGF0dHJpYnV0ZSB2YWx1ZQorICAvLy8gXHBhcmFtIEF0dHJWYWx1ZSAgICBUaGUgRFdBUkYgYXR0cmlidXRlIHZhbHVlIHRvIGNoZWNrCisgIC8vLworICAvLy8gXHJldHVybnMgTnVtRXJyb3JzIFRoZSBudW1iZXIgb2YgZXJyb3JzIG9jY3VycmVkIGR1cmluZyB2ZXJpZmljYXRpb24gb2YKKyAgLy8vIGF0dHJpYnV0ZXMnIGZvcm1zIGluIGEgLmRlYnVnX2luZm8gc2VjdGlvbiB1bml0CisgIHVuc2lnbmVkIHZlcmlmeURlYnVnSW5mb0Zvcm0oY29uc3QgRFdBUkZEaWUgJkRpZSwgRFdBUkZBdHRyaWJ1dGUgJkF0dHJWYWx1ZSk7CisKKyAgLy8vIFZlcmlmaWVzIHRoZSBhbGwgdmFsaWQgcmVmZXJlbmNlcyB0aGF0IHdlcmUgZm91bmQgd2hlbiBpdGVyYXRpbmcgdGhyb3VnaAorICAvLy8gYWxsIG9mIHRoZSBESUUgYXR0cmlidXRlcy4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgdmVyaWZ5IHRoYXQgYWxsIHJlZmVyZW5jZXMgcG9pbnQgdG8gRElFcyB3aG9zZSBESUUKKyAgLy8vIG9mZnNldCBtYXRjaGVzLiBUaGlzIGhlbHBzIHRvIGVuc3VyZSBpZiBhIERXQVJGIGxpbmsgcGhhc2UgbW92ZWQgdGhpbmdzCisgIC8vLyBhcm91bmQsIHRoYXQgaXQgZG9lc24ndCBjcmVhdGUgaW52YWxpZCByZWZlcmVuY2VzIGJ5IGZhaWxpbmcgdG8gcmVsb2NhdGUKKyAgLy8vIENVIHJlbGF0aXZlIGFuZCBhYnNvbHV0ZSByZWZlcmVuY2VzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIE51bUVycm9ycyBUaGUgbnVtYmVyIG9mIGVycm9ycyBvY2N1cnJlZCBkdXJpbmcgdmVyaWZpY2F0aW9uIG9mCisgIC8vLyByZWZlcmVuY2VzIGZvciB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbgorICB1bnNpZ25lZCB2ZXJpZnlEZWJ1Z0luZm9SZWZlcmVuY2VzKCk7CisKKyAgLy8vIFZlcmlmeSB0aGUgRFdfQVRfc3RtdF9saXN0IGVuY29kaW5nIGFuZCB2YWx1ZSBhbmQgZW5zdXJlIHRoYXQgbm8KKyAgLy8vIGNvbXBpbGUgdW5pdHMgdGhhdCBoYXZlIHRoZSBzYW1lIERXX0FUX3N0bXRfbGlzdCB2YWx1ZS4KKyAgdm9pZCB2ZXJpZnlEZWJ1Z0xpbmVTdG10T2Zmc2V0cygpOworCisgIC8vLyBWZXJpZnkgdGhhdCBhbGwgb2YgdGhlIHJvd3MgaW4gdGhlIGxpbmUgdGFibGUgYXJlIHZhbGlkLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gY3VycmVudGx5IGNoZWNrcyBmb3I6CisgIC8vLyAtIGFkZHJlc3NlcyB3aXRoaW4gYSBzZXF1ZW5jZSB0aGF0IGRlY3JlYXNlIGluIHZhbHVlCisgIC8vLyAtIGludmFsaWQgZmlsZSBpbmRleGVzCisgIHZvaWQgdmVyaWZ5RGVidWdMaW5lUm93cygpOworCisgIC8vLyBWZXJpZnkgdGhhdCBhbiBBcHBsZS1zdHlsZSBhY2NlbGVyYXRvciB0YWJsZSBpcyB2YWxpZC4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGN1cnJlbnRseSBjaGVja3MgdGhhdDoKKyAgLy8vIC0gVGhlIGZpeGVkIHBhcnQgb2YgdGhlIGhlYWRlciBmaXRzIGluIHRoZSBzZWN0aW9uCisgIC8vLyAtIFRoZSBzaXplIG9mIHRoZSBzZWN0aW9uIGlzIGFzIGxhcmdlIGFzIHdoYXQgdGhlIGhlYWRlciBkZXNjcmliZXMKKyAgLy8vIC0gVGhlcmUgaXMgYXQgbGVhc3Qgb25lIGF0b20KKyAgLy8vIC0gVGhlIGZvcm0gZm9yIGVhY2ggYXRvbSBpcyB2YWxpZAorICAvLy8gLSBUaGUgdGFnIGZvciBlYWNoIERJRSBpbiB0aGUgdGFibGUgaXMgdmFsaWQKKyAgLy8vIC0gVGhlIGJ1Y2tldHMgaGF2ZSBhIHZhbGlkIGluZGV4LCBvciB0aGV5IGFyZSBlbXB0eQorICAvLy8gLSBFYWNoIGhhc2hkYXRhIG9mZnNldCBpcyB2YWxpZAorICAvLy8gLSBFYWNoIERJRSBpcyB2YWxpZAorICAvLy8KKyAgLy8vIFxwYXJhbSBBY2NlbFNlY3Rpb24gcG9pbnRlciB0byB0aGUgc2VjdGlvbiBjb250YWluaW5nIHRoZSBhY2NlbGVyYXRpb24gdGFibGUKKyAgLy8vIFxwYXJhbSBTdHJEYXRhIHBvaW50ZXIgdG8gdGhlIHN0cmluZyBzZWN0aW9uCisgIC8vLyBccGFyYW0gU2VjdGlvbk5hbWUgdGhlIG5hbWUgb2YgdGhlIHRhYmxlIHdlJ3JlIHZlcmlmeWluZworICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRoZSBudW1iZXIgb2YgZXJyb3JzIG9jY3VycmVkIGR1cmluZyB2ZXJpZmljYXRpb24KKyAgdW5zaWduZWQgdmVyaWZ5QXBwbGVBY2NlbFRhYmxlKGNvbnN0IERXQVJGU2VjdGlvbiAqQWNjZWxTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUV4dHJhY3RvciAqU3RyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKlNlY3Rpb25OYW1lKTsKKworICB1bnNpZ25lZCB2ZXJpZnlEZWJ1Z05hbWVzQ1VMaXN0cyhjb25zdCBEV0FSRkRlYnVnTmFtZXMgJkFjY2VsVGFibGUpOworICB1bnNpZ25lZCB2ZXJpZnlOYW1lSW5kZXhCdWNrZXRzKGNvbnN0IERXQVJGRGVidWdOYW1lczo6TmFtZUluZGV4ICZOSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhRXh0cmFjdG9yICZTdHJEYXRhKTsKKyAgdW5zaWduZWQgdmVyaWZ5TmFtZUluZGV4QWJicmV2cyhjb25zdCBEV0FSRkRlYnVnTmFtZXM6Ok5hbWVJbmRleCAmTkkpOworICB1bnNpZ25lZCB2ZXJpZnlOYW1lSW5kZXhBdHRyaWJ1dGUoY29uc3QgRFdBUkZEZWJ1Z05hbWVzOjpOYW1lSW5kZXggJk5JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRFdBUkZEZWJ1Z05hbWVzOjpBYmJyZXYgJkFiYnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEV0FSRkRlYnVnTmFtZXM6OkF0dHJpYnV0ZUVuY29kaW5nIEF0dHJFbmMpOworCisgIC8vLyBWZXJpZnkgdGhhdCB0aGUgRFdBUkYgdjUgYWNjZWxlcmF0b3IgdGFibGUgaXMgdmFsaWQuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBjdXJyZW50bHkgY2hlY2tzIHRoYXQ6CisgIC8vLyAtIEhlYWRlcnMgaW5kaXZpZHVhbCBOYW1lIEluZGljZXMgZml0IGludG8gdGhlIHNlY3Rpb24gYW5kIGNhbiBiZSBwYXJzZWQuCisgIC8vLyAtIEFiYnJldmlhdGlvbiB0YWJsZXMgY2FuIGJlIHBhcnNlZCBhbmQgY29udGFpbiB2YWxpZCBpbmRleCBhdHRyaWJ1dGVzCisgIC8vLyAgIHdpdGggY29ycmVjdCBmb3JtIGVuY29kaW5ncy4KKyAgLy8vIC0gVGhlIENVIGxpc3RzIHJlZmVyZW5jZSBleGlzdGluZyBjb21waWxlIHVuaXRzLgorICAvLy8gLSBUaGUgYnVja2V0cyBoYXZlIGEgdmFsaWQgaW5kZXgsIG9yIHRoZXkgYXJlIGVtcHR5LgorICAvLy8gLSBBbGwgbmFtZXMgYXJlIHJlYWNoYWJsZSB2aWEgdGhlIGhhc2ggdGFibGUgKHRoZXkgaGF2ZSB0aGUgY29ycmVjdCBoYXNoLAorICAvLy8gICBhbmQgdGhlIGhhc2ggaXMgaW4gdGhlIGNvcnJlY3QgYnVja2V0KS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQWNjZWxTZWN0aW9uIHNlY3Rpb24gY29udGFpbmluZyB0aGUgYWNjZWxlcmF0aW9uIHRhYmxlCisgIC8vLyBccGFyYW0gU3RyRGF0YSBzdHJpbmcgc2VjdGlvbgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRoZSBudW1iZXIgb2YgZXJyb3JzIG9jY3VycmVkIGR1cmluZyB2ZXJpZmljYXRpb24KKyAgdW5zaWduZWQgdmVyaWZ5RGVidWdOYW1lcyhjb25zdCBEV0FSRlNlY3Rpb24gJkFjY2VsU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhRXh0cmFjdG9yICZTdHJEYXRhKTsKKworcHVibGljOgorICBEV0FSRlZlcmlmaWVyKHJhd19vc3RyZWFtICZTLCBEV0FSRkNvbnRleHQgJkQsCisgICAgICAgICAgICAgICAgRElEdW1wT3B0aW9ucyBEdW1wT3B0cyA9IERJRHVtcE9wdGlvbnM6OmdldEZvclNpbmdsZURJRSgpKQorICAgICAgOiBPUyhTKSwgREN0eChEKSwgRHVtcE9wdHMoc3RkOjptb3ZlKER1bXBPcHRzKSkge30KKyAgLy8vIFZlcmlmeSB0aGUgaW5mb3JtYXRpb24gaW4gYW55IG9mIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnMsIGlmIGF2YWlsYWJsZToKKyAgLy8vIC5kZWJ1Z19hYmJyZXYsIGRlYnVnX2FiYnJldi5kd28KKyAgLy8vCisgIC8vLyBBbnkgZXJyb3JzIGFyZSByZXBvcnRlZCB0byB0aGUgc3RyZWFtIHRoYXQgd2FzIHRoaXMgb2JqZWN0IHdhcworICAvLy8gY29uc3RydWN0ZWQgd2l0aC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIC5kZWJ1Z19hYmJyZXYgYW5kIC5kZWJ1Z19hYmJyZXYuZHdvIHZlcmlmeSBzdWNjZXNzZnVsbHksCisgIC8vLyBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgaGFuZGxlRGVidWdBYmJyZXYoKTsKKworICAvLy8gVmVyaWZ5IHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgLmRlYnVnX2luZm8gc2VjdGlvbi4KKyAgLy8vCisgIC8vLyBBbnkgZXJyb3JzIGFyZSByZXBvcnRlZCB0byB0aGUgc3RyZWFtIHRoYXQgd2FzIHRoaXMgb2JqZWN0IHdhcworICAvLy8gY29uc3RydWN0ZWQgd2l0aC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoZSAuZGVidWdfaW5mbyB2ZXJpZmllcyBzdWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBoYW5kbGVEZWJ1Z0luZm8oKTsKKworICAvLy8gVmVyaWZ5IHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgLmRlYnVnX2xpbmUgc2VjdGlvbi4KKyAgLy8vCisgIC8vLyBBbnkgZXJyb3JzIGFyZSByZXBvcnRlZCB0byB0aGUgc3RyZWFtIHRoYXQgd2FzIHRoaXMgb2JqZWN0IHdhcworICAvLy8gY29uc3RydWN0ZWQgd2l0aC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIHRoZSAuZGVidWdfbGluZSB2ZXJpZmllcyBzdWNjZXNzZnVsbHksIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBoYW5kbGVEZWJ1Z0xpbmUoKTsKKworICAvLy8gVmVyaWZ5IHRoZSBpbmZvcm1hdGlvbiBpbiBhY2NlbGVyYXRvciB0YWJsZXMsIGlmIHRoZXkgZXhpc3QuCisgIC8vLworICAvLy8gQW55IGVycm9ycyBhcmUgcmVwb3J0ZWQgdG8gdGhlIHN0cmVhbSB0aGF0IHdhcyB0aGlzIG9iamVjdCB3YXMKKyAgLy8vIGNvbnN0cnVjdGVkIHdpdGguCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGUgZXhpc3RpbmcgQXBwbGUtc3R5bGUgYWNjZWxlcmF0b3IgdGFibGVzIHZlcmlmeQorICAvLy8gc3VjY2Vzc2Z1bGx5LCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgaGFuZGxlQWNjZWxUYWJsZXMoKTsKK307CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgRFdBUkZWZXJpZmllcjo6RGllUmFuZ2VJbmZvICZMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERXQVJGVmVyaWZpZXI6OkRpZVJhbmdlSW5mbyAmUkhTKSB7CisgIHJldHVybiBzdGQ6OnRpZShMSFMuUmFuZ2VzLCBMSFMuRGllKSA8IHN0ZDo6dGllKFJIUy5SYW5nZXMsIFJIUy5EaWUpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fRFdBUkZfRFdBUkZDT05URVhUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL01TRi9JTVNGRmlsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vTVNGL0lNU0ZGaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk4ZTcxNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL01TRi9JTVNGRmlsZS5oCkBAIC0wLDAgKzEsNDIgQEAKKy8vPT09LSBJTVNGRmlsZS5oIC0gQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYW4gTVNGIGZpbGUgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fTVNGX0lNU0ZGSUxFX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fTVNGX0lNU0ZGSUxFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBtc2YgeworCitjbGFzcyBJTVNGRmlsZSB7CitwdWJsaWM6CisgIHZpcnR1YWwgfklNU0ZGaWxlKCkgPSBkZWZhdWx0OworCisgIHZpcnR1YWwgdWludDMyX3QgZ2V0QmxvY2tTaXplKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldEJsb2NrQ291bnQoKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCBnZXROdW1TdHJlYW1zKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmVhbUJ5dGVTaXplKHVpbnQzMl90IFN0cmVhbUluZGV4KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgQXJyYXlSZWY8c3VwcG9ydDo6dWxpdHRsZTMyX3Q+CisgIGdldFN0cmVhbUJsb2NrTGlzdCh1aW50MzJfdCBTdHJlYW1JbmRleCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgRXhwZWN0ZWQ8QXJyYXlSZWY8dWludDhfdD4+IGdldEJsb2NrRGF0YSh1aW50MzJfdCBCbG9ja0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTnVtQnl0ZXMpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBFcnJvciBzZXRCbG9ja0RhdGEodWludDMyX3QgQmxvY2tJbmRleCwgdWludDMyX3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiBEYXRhKSBjb25zdCA9IDA7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbXNmCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fTVNGX0lNU0ZGSUxFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL01TRi9NU0ZCdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9NU0YvTVNGQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5ZTVjMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9NU0YvTVNGQnVpbGRlci5oCkBAIC0wLDAgKzEsMTQwIEBACisvLz09PS0gTVNGQnVpbGRlci5oIC0gTVNGIERpcmVjdG9yeSAmIE1ldGFkYXRhIEJ1aWxkZXIgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX01TRl9NU0ZCVUlMREVSX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fTVNGX01TRkJVSUxERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9NU0YvTVNGQ29tbW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBtc2YgeworCitjbGFzcyBNU0ZCdWlsZGVyIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBuZXcgYE1TRkJ1aWxkZXJgLgorICAvLy8KKyAgLy8vIFxwYXJhbSBCbG9ja1NpemUgVGhlIGludGVybmFsIGJsb2NrIHNpemUgdXNlZCBieSB0aGUgUERCIGZpbGUuICBTZWUKKyAgLy8vIGlzVmFsaWRCbG9ja1NpemUoKSBmb3IgYSBsaXN0IG9mIHZhbGlkIGJsb2NrIHNpemVzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBNaW5CbG9ja0NvdW50IENhdXNlcyB0aGUgYnVpbGRlciB0byByZXNlcnZlIHVwIGZyb250IHNwYWNlIGZvcgorICAvLy8gYXQgbGVhc3QgYE1pbkJsb2NrQ291bnRgIGJsb2Nrcy4gIFRoaXMgaXMgdXNlZnVsIHdoZW4gdXNpbmcgYE1TRkJ1aWxkZXJgCisgIC8vLyB0byByZWFkIGFuIGV4aXN0aW5nIE1TRiB0aGF0IHlvdSB3YW50IHRvIHdyaXRlIGJhY2sgb3V0IGxhdGVyLiAgVGhlCisgIC8vLyBvcmlnaW5hbCBNU0YgZmlsZSdzIFN1cGVyQmxvY2sgY29udGFpbnMgdGhlIGV4YWN0IG51bWJlciBvZiBibG9ja3MgdXNlZAorICAvLy8gYnkgdGhlIGZpbGUsIHNvIGlzIGEgZ29vZCBoaW50IGFzIHRvIGhvdyBtYW55IGJsb2NrcyB0aGUgbmV3IE1TRiBmaWxlCisgIC8vLyB3aWxsIGNvbnRhaW4uICBGdXJ0aGVybW9yZSwgaXQgaXMgYWN0dWFsbHkgbmVjZXNzYXJ5IGluIHRoaXMgY2FzZS4gIFRvCisgIC8vLyBwcmVzZXJ2ZSBzdGFiaWxpdHkgb2YgdGhlIGZpbGUncyBsYXlvdXQsIGl0IGlzIGhlbHBmdWwgdG8gdHJ5IHRvIGtlZXAKKyAgLy8vIGFsbCBzdHJlYW1zIG1hcHBlZCB0byB0aGVpciBvcmlnaW5hbCBibG9jayBudW1iZXJzLiAgVG8gZW5zdXJlIHRoYXQgdGhpcworICAvLy8gaXMgcG9zc2libGUsIHNwYWNlIGZvciBhbGwgYmxvY2tzIG11c3QgYmUgYWxsb2NhdGVkIGJlZm9yZWhhbmQgc28gdGhhdAorICAvLy8gc3RyZWFtcyBjYW4gYmUgYXNzaWduZWQgdG8gdGhlbS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQ2FuR3JvdyBJZiB0cnVlLCBhbnkgb3BlcmF0aW9uIHdoaWNoIHJlc3VsdHMgaW4gYW4gYXR0ZW1wdCB0bworICAvLy8gbG9jYXRlIGEgZnJlZSBibG9jayB3aGVuIGFsbCBhdmFpbGFibGUgYmxvY2tzIGhhdmUgYmVlbiBleGhhdXN0ZWQgd2lsbAorICAvLy8gYWxsb2NhdGUgYSBuZXcgYmxvY2ssIHRoZXJlYnkgZ3Jvd2luZyB0aGUgc2l6ZSBvZiB0aGUgZmluYWwgTVNGIGZpbGUuCisgIC8vLyBXaGVuIGZhbHNlLCBhbnkgc3VjaCBhdHRlbXB0IHdpbGwgcmVzdWx0IGluIGFuIGVycm9yLiAgVGhpcyBpcyBlc3BlY2lhbGx5CisgIC8vLyB1c2VmdWwgaW4gdGVzdGluZyBzY2VuYXJpb3Mgd2hlbiB5b3Uga25vdyB5b3VyIHRlc3QgaXNuJ3QgZ29pbmcgdG8gZG8KKyAgLy8vIGFueXRoaW5nIHRvIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBmaWxlLCBzbyBoYXZpbmcgYW4gRXJyb3IgcmV0dXJuZWQgaWYKKyAgLy8vIGl0IHdlcmUgdG8gaGFwcGVuIHdvdWxkIGNhdGNoIGEgcHJvZ3JhbW1pbmcgZXJyb3IKKyAgLy8vCisgIC8vLyBccmV0dXJucyBhbiBsbHZtOjpFcnJvciByZXByZXNlbnRpbmcgd2hldGhlciB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCBvcgorICAvLy8gZmFpbGVkLiAgQ3VycmVudGx5IHRoZSBvbmx5IHdheSB0aGlzIGNhbiBmYWlsIGlzIGlmIGFuIGludmFsaWQgYmxvY2sgc2l6ZQorICAvLy8gaXMgc3BlY2lmaWVkLCBvciBgTWluQmxvY2tDb3VudGAgZG9lcyBub3QgbGVhdmUgZW5vdWdoIHJvb20gZm9yIHRoZQorICAvLy8gbWFuZGF0b3J5IHJlc2VydmVkIGJsb2NrcyByZXF1aXJlZCBieSBhbiBNU0YgZmlsZS4KKyAgc3RhdGljIEV4cGVjdGVkPE1TRkJ1aWxkZXI+IGNyZWF0ZShCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE1pbkJsb2NrQ291bnQgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ2FuR3JvdyA9IHRydWUpOworCisgIC8vLyBSZXF1ZXN0IHRoZSBibG9jayBtYXAgdG8gYmUgYXQgYSBzcGVjaWZpYyBibG9jayBhZGRyZXNzLiAgVGhpcyBpcyB1c2VmdWwKKyAgLy8vIHdoZW4gZWRpdGluZyBhIE1TRiBhbmQgeW91IHdhbnQgdGhlIGxheW91dCB0byBiZSBhcyBzdGFibGUgYXMgcG9zc2libGUuCisgIEVycm9yIHNldEJsb2NrTWFwQWRkcih1aW50MzJfdCBBZGRyKTsKKyAgRXJyb3Igc2V0RGlyZWN0b3J5QmxvY2tzSGludChBcnJheVJlZjx1aW50MzJfdD4gRGlyQmxvY2tzKTsKKyAgdm9pZCBzZXRGcmVlUGFnZU1hcCh1aW50MzJfdCBGcG0pOworICB2b2lkIHNldFVua25vd24xKHVpbnQzMl90IFVuazEpOworCisgIC8vLyBBZGQgYSBzdHJlYW0gdG8gdGhlIE1TRiBmaWxlIHdpdGggdGhlIGdpdmVuIHNpemUsIG9jY3VweWluZyB0aGUgZ2l2ZW4KKyAgLy8vIGxpc3Qgb2YgYmxvY2tzLiAgVGhpcyBpcyB1c2VmdWwgd2hlbiByZWFkaW5nIGEgTVNGIGZpbGUgYW5kIHlvdSB3YW50IGEKKyAgLy8vIHBhcnRpY3VsYXIgc3RyZWFtIHRvIG9jY3VweSB0aGUgb3JpZ2luYWwgc2V0IG9mIGJsb2Nrcy4gIElmIHRoZSBnaXZlbgorICAvLy8gYmxvY2tzIGFyZSBhbHJlYWR5IGFsbG9jYXRlZCwgb3IgaWYgdGhlIG51bWJlciBvZiBibG9ja3Mgc3BlY2lmaWVkIGlzCisgIC8vLyBpbmNvcnJlY3QgZm9yIHRoZSBnaXZlbiBzdHJlYW0gc2l6ZSwgdGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiBhbiBFcnJvci4KKyAgRXhwZWN0ZWQ8dWludDMyX3Q+IGFkZFN0cmVhbSh1aW50MzJfdCBTaXplLCBBcnJheVJlZjx1aW50MzJfdD4gQmxvY2tzKTsKKworICAvLy8gQWRkIGEgc3RyZWFtIHRvIHRoZSBNU0YgZmlsZSB3aXRoIHRoZSBnaXZlbiBzaXplLCBvY2N1cHlpbmcgYW55IGF2YWlsYWJsZQorICAvLy8gYmxvY2tzIHRoYXQgdGhlIGJ1aWxkZXIgZGVjaWRlcyB0byB1c2UuICBUaGlzIGlzIHVzZWZ1bCB3aGVuIGJ1aWxkaW5nIGEKKyAgLy8vIG5ldyBQREIgZmlsZSBmcm9tIHNjcmF0Y2ggYW5kIHlvdSBkb24ndCBjYXJlIHdoYXQgYmxvY2tzIGEgc3RyZWFtIG9jY3VwaWVzCisgIC8vLyBidXQgeW91IGp1c3Qgd2FudCBpdCB0byB3b3JrLgorICBFeHBlY3RlZDx1aW50MzJfdD4gYWRkU3RyZWFtKHVpbnQzMl90IFNpemUpOworCisgIC8vLyBVcGRhdGUgdGhlIHNpemUgb2YgYW4gZXhpc3Rpbmcgc3RyZWFtLiAgVGhpcyB3aWxsIGFsbG9jYXRlIG9yIGRlYWxsb2NhdGUKKyAgLy8vIGJsb2NrcyBhcyBuZWVkZWQgdG8gbWF0Y2ggdGhlIHJlcXVlc3RlZCBzaXplLiAgVGhpcyBjYW4gZmFpbCBpZiBgQ2FuR3Jvd2AKKyAgLy8vIHdhcyBzZXQgdG8gZmFsc2Ugd2hlbiBpbml0aWFsaXppbmcgdGhlIGBNU0ZCdWlsZGVyYC4KKyAgRXJyb3Igc2V0U3RyZWFtU2l6ZSh1aW50MzJfdCBJZHgsIHVpbnQzMl90IFNpemUpOworCisgIC8vLyBHZXQgdGhlIHRvdGFsIG51bWJlciBvZiBzdHJlYW1zIGluIHRoZSBNU0YgbGF5b3V0LiAgVGhpcyBzaG91bGQgcmV0dXJuIDEKKyAgLy8vIGZvciBldmVyeSBjYWxsIHRvIGBhZGRTdHJlYW1gLgorICB1aW50MzJfdCBnZXROdW1TdHJlYW1zKCkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgc2l6ZSBvZiBhIHN0cmVhbSBieSBpbmRleC4KKyAgdWludDMyX3QgZ2V0U3RyZWFtU2l6ZSh1aW50MzJfdCBTdHJlYW1JZHgpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIGxpc3Qgb2YgYmxvY2tzIGFsbG9jYXRlZCB0byBhIHBhcnRpY3VsYXIgc3RyZWFtLgorICBBcnJheVJlZjx1aW50MzJfdD4gZ2V0U3RyZWFtQmxvY2tzKHVpbnQzMl90IFN0cmVhbUlkeCkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IHdpbGwgYmUgYWxsb2NhdGVkIHRvIGFjdHVhbCBkYXRhIGluCisgIC8vLyB0aGlzIE1TRiBmaWxlLgorICB1aW50MzJfdCBnZXROdW1Vc2VkQmxvY2tzKCkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIGJsb2NrcyB0aGF0IGV4aXN0IGluIHRoZSBNU0YgZmlsZSBidXQgYXJlIG5vdAorICAvLy8gYWxsb2NhdGVkIHRvIGFueSB2YWxpZCBkYXRhLgorICB1aW50MzJfdCBnZXROdW1GcmVlQmxvY2tzKCkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgdG90YWwgbnVtYmVyIG9mIGJsb2NrcyBpbiB0aGUgTVNGIGZpbGUuICBJbiBwcmFjdGljZSB0aGlzIGlzIGVxdWFsCisgIC8vLyB0byBgZ2V0TnVtVXNlZEJsb2NrcygpICsgZ2V0TnVtRnJlZUJsb2NrcygpYC4KKyAgdWludDMyX3QgZ2V0VG90YWxCbG9ja0NvdW50KCkgY29uc3Q7CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgYSBwYXJ0aWN1bGFyIGJsb2NrIGlzIGFsbG9jYXRlZCBvciBmcmVlLgorICBib29sIGlzQmxvY2tGcmVlKHVpbnQzMl90IElkeCkgY29uc3Q7CisKKyAgLy8vIEZpbmFsaXplIHRoZSBsYXlvdXQgYW5kIGJ1aWxkIHRoZSBoZWFkZXJzIGFuZCBzdHJ1Y3R1cmVzIHRoYXQgZGVzY3JpYmUgdGhlCisgIC8vLyBNU0YgbGF5b3V0IGFuZCBjYW4gYmUgd3JpdHRlbiBkaXJlY3RseSB0byB0aGUgTVNGIGZpbGUuCisgIEV4cGVjdGVkPE1TRkxheW91dD4gYnVpbGQoKTsKKworICBCdW1wUHRyQWxsb2NhdG9yICZnZXRBbGxvY2F0b3IoKSB7IHJldHVybiBBbGxvY2F0b3I7IH0KKworcHJpdmF0ZToKKyAgTVNGQnVpbGRlcih1aW50MzJfdCBCbG9ja1NpemUsIHVpbnQzMl90IE1pbkJsb2NrQ291bnQsIGJvb2wgQ2FuR3JvdywKKyAgICAgICAgICAgICBCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IpOworCisgIEVycm9yIGFsbG9jYXRlQmxvY2tzKHVpbnQzMl90IE51bUJsb2NrcywgTXV0YWJsZUFycmF5UmVmPHVpbnQzMl90PiBCbG9ja3MpOworICB1aW50MzJfdCBjb21wdXRlRGlyZWN0b3J5Qnl0ZVNpemUoKSBjb25zdDsKKworICB1c2luZyBCbG9ja0xpc3QgPSBzdGQ6OnZlY3Rvcjx1aW50MzJfdD47CisKKyAgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yOworCisgIGJvb2wgSXNHcm93YWJsZTsKKyAgdWludDMyX3QgRnJlZVBhZ2VNYXA7CisgIHVpbnQzMl90IFVua25vd24xID0gMDsKKyAgdWludDMyX3QgQmxvY2tTaXplOworICB1aW50MzJfdCBCbG9ja01hcEFkZHI7CisgIEJpdFZlY3RvciBGcmVlQmxvY2tzOworICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gRGlyZWN0b3J5QmxvY2tzOworICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8dWludDMyX3QsIEJsb2NrTGlzdD4+IFN0cmVhbURhdGE7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbXNmCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fTVNGX01TRkJVSUxERVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vTVNGL01TRkNvbW1vbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vTVNGL01TRkNvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkNTMyNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9NU0YvTVNGQ29tbW9uLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8vPT09LSBNU0ZDb21tb24uaCAtIENvbW1vbiB0eXBlcyBhbmQgZnVuY3Rpb25zIGZvciBNU0YgZmlsZXMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fTVNGX01TRkNPTU1PTl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX01TRl9NU0ZDT01NT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG1zZiB7CisKK3N0YXRpYyBjb25zdCBjaGFyIE1hZ2ljW10gPSB7J00nLCAgJ2knLCAgJ2MnLCAgICAncicsICdvJywgJ3MnLCAgJ28nLCAgJ2YnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAndCcsICAnICcsICAnQycsICAgICcvJywgJ0MnLCAnKycsICAnKycsICAnICcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdNJywgICdTJywgICdGJywgICAgJyAnLCAnNycsICcuJywgICcwJywgICcwJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1xyJywgJ1xuJywgJ1x4MWEnLCAnRCcsICdTJywgJ1wwJywgJ1wwJywgJ1wwJ307CisKKy8vIFRoZSBzdXBlcmJsb2NrIGlzIG92ZXJsYWlkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgKG9mZnNldCAwKS4KKy8vIEl0IHN0YXJ0cyB3aXRoIGEgbWFnaWMgaGVhZGVyIGFuZCBpcyBmb2xsb3dlZCBieSBpbmZvcm1hdGlvbiB3aGljaAorLy8gZGVzY3JpYmVzIHRoZSBsYXlvdXQgb2YgdGhlIGZpbGUgc3lzdGVtLgorc3RydWN0IFN1cGVyQmxvY2sgeworICBjaGFyIE1hZ2ljQnl0ZXNbc2l6ZW9mKE1hZ2ljKV07CisgIC8vIFRoZSBmaWxlIHN5c3RlbSBpcyBzcGxpdCBpbnRvIGEgdmFyaWFibGUgbnVtYmVyIG9mIGZpeGVkIHNpemUgZWxlbWVudHMuCisgIC8vIFRoZXNlIGVsZW1lbnRzIGFyZSByZWZlcnJlZCB0byBhcyBibG9ja3MuICBUaGUgc2l6ZSBvZiBhIGJsb2NrIG1heSB2YXJ5CisgIC8vIGZyb20gc3lzdGVtIHRvIHN5c3RlbS4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQmxvY2tTaXplOworICAvLyBUaGUgaW5kZXggb2YgdGhlIGZyZWUgYmxvY2sgbWFwLgorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBGcmVlQmxvY2tNYXBCbG9jazsKKyAgLy8gVGhpcyBjb250YWlucyB0aGUgbnVtYmVyIG9mIGJsb2NrcyByZXNpZGVudCBpbiB0aGUgZmlsZSBzeXN0ZW0uICBJbgorICAvLyBwcmFjdGljZSwgTnVtQmxvY2tzICogQmxvY2tTaXplIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHNpemUgb2YgdGhlIE1TRgorICAvLyBmaWxlLgorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBOdW1CbG9ja3M7CisgIC8vIFRoaXMgY29udGFpbnMgdGhlIG51bWJlciBvZiBieXRlcyB3aGljaCBtYWtlIHVwIHRoZSBkaXJlY3RvcnkuCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE51bURpcmVjdG9yeUJ5dGVzOworICAvLyBUaGlzIGZpZWxkJ3MgcHVycG9zZSBpcyBub3QgeWV0IGtub3duLgorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBVbmtub3duMTsKKyAgLy8gVGhpcyBjb250YWlucyB0aGUgYmxvY2sgIyBvZiB0aGUgYmxvY2sgbWFwLgorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBCbG9ja01hcEFkZHI7Cit9OworCitzdHJ1Y3QgTVNGTGF5b3V0IHsKKyAgTVNGTGF5b3V0KCkgPSBkZWZhdWx0OworCisgIHVpbnQzMl90IG1haW5GcG1CbG9jaygpIGNvbnN0IHsKKyAgICBhc3NlcnQoU0ItPkZyZWVCbG9ja01hcEJsb2NrID09IDEgfHwgU0ItPkZyZWVCbG9ja01hcEJsb2NrID09IDIpOworICAgIHJldHVybiBTQi0+RnJlZUJsb2NrTWFwQmxvY2s7CisgIH0KKworICB1aW50MzJfdCBhbHRlcm5hdGVGcG1CbG9jaygpIGNvbnN0IHsKKyAgICAvLyBJZiBtYWluRnBtQmxvY2sgaXMgMSwgdGhpcyBpcyAyLiAgSWYgbWFpbkZwbUJsb2NrIGlzIDIsIHRoaXMgaXMgMS4KKyAgICByZXR1cm4gM1UgLSBtYWluRnBtQmxvY2soKTsKKyAgfQorCisgIGNvbnN0IFN1cGVyQmxvY2sgKlNCID0gbnVsbHB0cjsKKyAgQml0VmVjdG9yIEZyZWVQYWdlTWFwOworICBBcnJheVJlZjxzdXBwb3J0Ojp1bGl0dGxlMzJfdD4gRGlyZWN0b3J5QmxvY2tzOworICBBcnJheVJlZjxzdXBwb3J0Ojp1bGl0dGxlMzJfdD4gU3RyZWFtU2l6ZXM7CisgIHN0ZDo6dmVjdG9yPEFycmF5UmVmPHN1cHBvcnQ6OnVsaXR0bGUzMl90Pj4gU3RyZWFtTWFwOworfTsKKworLy8vIFxicmllZiBEZXNjcmliZXMgdGhlIGxheW91dCBvZiBhIHN0cmVhbSBpbiBhbiBNU0YgbGF5b3V0LiAgQSAic3RyZWFtIiBoZXJlCisvLy8gaXMgZGVmaW5lZCBhcyBhbnkgbG9naWNhbCB1bml0IG9mIGRhdGEgd2hpY2ggbWF5IGJlIGFycmFuZ2VkIGluc2lkZSB0aGUgTVNGCisvLy8gZmlsZSBhcyBhIHNlcXVlbmNlIG9mIChwb3NzaWJseSBkaXNjb250aWd1b3VzKSBibG9ja3MuICBXaGVuIHdlIHdhbnQgdG8gcmVhZAorLy8vIGZyb20gYSBwYXJ0aWN1bGFyIE1TRiBTdHJlYW0sIHdlIGZpbGwgb3V0IGEgc3RyZWFtIGxheW91dCBzdHJ1Y3R1cmUgYW5kIHRoZQorLy8vIHJlYWRlciB1c2VzIGl0IHRvIGRldGVybWluZSB3aGljaCBibG9ja3MgaW4gdGhlIHVuZGVybHlpbmcgTVNGIGZpbGUgY29udGFpbgorLy8vIHRoZSBkYXRhLCBzbyB0aGF0IGl0IGNhbiBiZSBwaWVjZWQgdG9nZXRoZXIgaW4gdGhlIHJpZ2h0IG9yZGVyLgorY2xhc3MgTVNGU3RyZWFtTGF5b3V0IHsKK3B1YmxpYzoKKyAgdWludDMyX3QgTGVuZ3RoOworICBzdGQ6OnZlY3RvcjxzdXBwb3J0Ojp1bGl0dGxlMzJfdD4gQmxvY2tzOworfTsKKworLy8vIFxicmllZiBEZXRlcm1pbmUgdGhlIGxheW91dCBvZiB0aGUgRlBNIHN0cmVhbSwgZ2l2ZW4gdGhlIE1TRiBsYXlvdXQuICBBbiBGUE0KKy8vLyBzdHJlYW0gc3BhbnMgMSBvciBtb3JlIGJsb2NrcywgZWFjaCBhdCBlcXVhbGx5IHNwYWNlZCBpbnRlcnZhbHMgdGhyb3VnaG91dAorLy8vIHRoZSBmaWxlLgorTVNGU3RyZWFtTGF5b3V0IGdldEZwbVN0cmVhbUxheW91dChjb25zdCBNU0ZMYXlvdXQgJk1zZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNsdWRlVW51c2VkRnBtRGF0YSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsdEZwbSA9IGZhbHNlKTsKKworaW5saW5lIGJvb2wgaXNWYWxpZEJsb2NrU2l6ZSh1aW50MzJfdCBTaXplKSB7CisgIHN3aXRjaCAoU2l6ZSkgeworICBjYXNlIDUxMjoKKyAgY2FzZSAxMDI0OgorICBjYXNlIDIwNDg6CisgIGNhc2UgNDA5NjoKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIFN1cGVyIEJsb2NrLCBGcG0wLCBGcG0xLCBhbmQgQmxvY2sgTWFwCitpbmxpbmUgdWludDMyX3QgZ2V0TWluaW11bUJsb2NrQ291bnQoKSB7IHJldHVybiA0OyB9CisKKy8vIFN1cGVyIEJsb2NrLCBGcG0wLCBhbmQgRnBtMSBhcmUgcmVzZXJ2ZWQuICBUaGUgQmxvY2sgTWFwLCBhbHRob3VnaCByZXF1aXJlZAorLy8gbmVlZCBub3QgYmUgYXQgYmxvY2sgMy4KK2lubGluZSB1aW50MzJfdCBnZXRGaXJzdFVucmVzZXJ2ZWRCbG9jaygpIHsgcmV0dXJuIDM7IH0KKworaW5saW5lIHVpbnQ2NF90IGJ5dGVzVG9CbG9ja3ModWludDY0X3QgTnVtQnl0ZXMsIHVpbnQ2NF90IEJsb2NrU2l6ZSkgeworICByZXR1cm4gZGl2aWRlQ2VpbChOdW1CeXRlcywgQmxvY2tTaXplKTsKK30KKworaW5saW5lIHVpbnQ2NF90IGJsb2NrVG9PZmZzZXQodWludDY0X3QgQmxvY2tOdW1iZXIsIHVpbnQ2NF90IEJsb2NrU2l6ZSkgeworICByZXR1cm4gQmxvY2tOdW1iZXIgKiBCbG9ja1NpemU7Cit9CisKK2lubGluZSB1aW50MzJfdCBnZXRGcG1JbnRlcnZhbExlbmd0aChjb25zdCBNU0ZMYXlvdXQgJkwpIHsKKyAgcmV0dXJuIEwuU0ItPkJsb2NrU2l6ZTsKK30KKworLy8vIEdpdmVuIGFuIE1TRiB3aXRoIHRoZSBzcGVjaWZpZWQgYmxvY2sgc2l6ZSBhbmQgbnVtYmVyIG9mIGJsb2NrcywgZGV0ZXJtaW5lCisvLy8gaG93IG1hbnkgcGllY2VzIHRoZSBzcGVjaWZpZWQgRnBtIGlzIHNwbGl0IGludG8uCisvLy8gXHAgQmxvY2tTaXplIC0gdGhlIGJsb2NrIHNpemUgb2YgdGhlIE1TRgorLy8vIFxwIE51bUJsb2NrcyAtIHRoZSB0b3RhbCBudW1iZXIgb2YgYmxvY2tzIGluIHRoZSBNU0YKKy8vLyBccCBJbmNsdWRlVW51c2VkRnBtRGF0YSAtIFdoZW4gdHJ1ZSwgdGhpcyB3aWxsIGNvdW50IGV2ZXJ5IGJsb2NrIHRoYXQgaXMKKy8vLyAgICBib3RoIGluIHRoZSBmaWxlIGFuZCBtYXRjaGVzIHRoZSBmb3JtIG9mIGFuIEZQTSBibG9jaywgZXZlbiBpZiBzb21lIG9mCisvLy8gICAgdGhvc2UgRlBNIGJsb2NrcyBhcmUgdW51c2VkIChhIHNpbmdsZSBGUE0gYmxvY2sgY2FuIGRlc2NyaWJlIHRoZQorLy8vICAgIGFsbG9jYXRpb24gc3RhdHVzIG9mIHVwIHRvIDMyLDc2NyBibG9ja3MsIGFsdGhvdWdoIG9uZSBhcHBlYXJzIG9ubHkKKy8vLyAgICBldmVyeSA0LDA5NiBibG9ja3MpLiAgU28gdGhlcmUgYXJlIDh4IGFzIG1hbnkgYmxvY2tzIHRoYXQgbWF0Y2ggdGhlCisvLy8gICAgZm9ybSBhcyB0aGVyZSBhcmUgYmxvY2tzIHRoYXQgYXJlIG5lY2Vzc2FyeSB0byBkZXNjcmliZSB0aGUgYWxsb2NhdGlvbgorLy8vICAgIHN0YXR1cyBvZiB0aGUgZmlsZS4gIFdoZW4gdGhpcyBwYXJhbWV0ZXIgaXMgZmFsc2UsIHRoZXNlIGV4dHJhbmVvdXMKKy8vLyAgICB0cmFpbGluZyBibG9ja3MgYXJlIG5vdCBjb3VudGVkLgoraW5saW5lIHVpbnQzMl90IGdldE51bUZwbUludGVydmFscyh1aW50MzJfdCBCbG9ja1NpemUsIHVpbnQzMl90IE51bUJsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNsdWRlVW51c2VkRnBtRGF0YSwgaW50IEZwbU51bWJlcikgeworICBhc3NlcnQoRnBtTnVtYmVyID09IDEgfHwgRnBtTnVtYmVyID09IDIpOworICBpZiAoSW5jbHVkZVVudXNlZEZwbURhdGEpIHsKKyAgICAvLyBUaGlzIGNhbGN1bGF0aW9uIGRldGVybWluZXMgaG93IG1hbnkgdGltZXMgYSBudW1iZXIgb2YgdGhlIGZvcm0KKyAgICAvLyBCbG9ja1NpemUgKiBrICsgTiBhcHBlYXJzIGluIHRoZSByYW5nZSBbMCwgTnVtQmxvY2tzKS4gIFdlIG9ubHkgbmVlZCB0bworICAgIC8vIGRvIHRoaXMgd2hlbiB1bnVzZWQgZGF0YSBpcyBpbmNsdWRlZCwgc2luY2UgdGhlIG51bWJlciBvZiBibG9ja3MgZHdhcmZzCisgICAgLy8gdGhlIG51bWJlciBvZiBmcG0gYmxvY2tzLgorICAgIHJldHVybiBkaXZpZGVDZWlsKE51bUJsb2NrcyAtIEZwbU51bWJlciwgQmxvY2tTaXplKTsKKyAgfQorCisgIC8vIFdlIHdhbnQgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGludGVydmFscyByZXF1aXJlZCwgd2hlcmUgZWFjaCBpbnRlcnZhbCBjYW4KKyAgLy8gcmVwcmVzZW50IEJsb2NrU2l6ZSAqIDggYmxvY2tzLgorICByZXR1cm4gZGl2aWRlQ2VpbChOdW1CbG9ja3MsIDggKiBCbG9ja1NpemUpOworfQorCitpbmxpbmUgdWludDMyX3QgZ2V0TnVtRnBtSW50ZXJ2YWxzKGNvbnN0IE1TRkxheW91dCAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNsdWRlVW51c2VkRnBtRGF0YSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsdEZwbSA9IGZhbHNlKSB7CisgIHJldHVybiBnZXROdW1GcG1JbnRlcnZhbHMoTC5TQi0+QmxvY2tTaXplLCBMLlNCLT5OdW1CbG9ja3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5jbHVkZVVudXNlZEZwbURhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWx0RnBtID8gTC5hbHRlcm5hdGVGcG1CbG9jaygpIDogTC5tYWluRnBtQmxvY2soKSk7Cit9CisKK0Vycm9yIHZhbGlkYXRlU3VwZXJCbG9jayhjb25zdCBTdXBlckJsb2NrICZTQik7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBtc2YKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19NU0ZfTVNGQ09NTU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL01TRi9NU0ZFcnJvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vTVNGL01TRkVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2YWVjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL01TRi9NU0ZFcnJvci5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vPT09LSBNU0ZFcnJvci5oIC0gRXJyb3IgZXh0ZW5zaW9ucyBmb3IgTVNGIEZpbGVzIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fTVNGX01TRkVSUk9SX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fTVNGX01TRkVSUk9SX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgbXNmIHsKK2VudW0gY2xhc3MgbXNmX2Vycm9yX2NvZGUgeworICB1bnNwZWNpZmllZCA9IDEsCisgIGluc3VmZmljaWVudF9idWZmZXIsCisgIG5vdF93cml0YWJsZSwKKyAgbm9fc3RyZWFtLAorICBpbnZhbGlkX2Zvcm1hdCwKKyAgYmxvY2tfaW5fdXNlCit9OworCisvLy8gQmFzZSBjbGFzcyBmb3IgZXJyb3JzIG9yaWdpbmF0aW5nIHdoZW4gcGFyc2luZyByYXcgUERCIGZpbGVzCitjbGFzcyBNU0ZFcnJvciA6IHB1YmxpYyBFcnJvckluZm88TVNGRXJyb3I+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisgIE1TRkVycm9yKG1zZl9lcnJvcl9jb2RlIEMpOworICBNU0ZFcnJvcihjb25zdCBzdGQ6OnN0cmluZyAmQ29udGV4dCk7CisgIE1TRkVycm9yKG1zZl9lcnJvcl9jb2RlIEMsIGNvbnN0IHN0ZDo6c3RyaW5nICZDb250ZXh0KTsKKworICB2b2lkIGxvZyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOworICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0RXJyb3JNZXNzYWdlKCkgY29uc3Q7CisgIHN0ZDo6ZXJyb3JfY29kZSBjb252ZXJ0VG9FcnJvckNvZGUoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgRXJyTXNnOworICBtc2ZfZXJyb3JfY29kZSBDb2RlOworfTsKK30gLy8gbmFtZXNwYWNlIG1zZgorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fTVNGX01TRkVSUk9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL01TRi9NYXBwZWRCbG9ja1N0cmVhbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vTVNGL01hcHBlZEJsb2NrU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY1ZTUyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL01TRi9NYXBwZWRCbG9ja1N0cmVhbS5oCkBAIC0wLDAgKzEsMTYzIEBACisvLz09LSBNYXBwZWRCbG9ja1N0cmVhbS5oIC0gRGlzY29udGlndW91cyBzdHJlYW0gZGF0YSBpbiBhbiBNU0YgLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX01TRl9NQVBQRURCTE9DS1NUUkVBTV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX01TRl9NQVBQRURCTE9DS1NUUkVBTV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vTVNGL01TRkNvbW1vbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBtc2YgeworCitzdHJ1Y3QgTVNGTGF5b3V0OworCisvLy8gTWFwcGVkQmxvY2tTdHJlYW0gcmVwcmVzZW50cyBkYXRhIHN0b3JlZCBpbiBhbiBNU0YgZmlsZSBpbnRvIGNodW5rcyBvZiBhCisvLy8gcGFydGljdWxhciBzaXplIChjYWxsZWQgdGhlIEJsb2NrIFNpemUpLCBhbmQgd2hvc2UgY2h1bmtzIG1heSBub3QgYmUKKy8vLyBuZWNlc3NhcmlseSBjb250aWd1b3VzLiAgVGhlIGFycmFuZ2VtZW50IG9mIHRoZXNlIGNodW5rcyBNU0YgdGhlIGZpbGUKKy8vLyBpcyBkZXNjcmliZWQgYnkgc29tZSBvdGhlciBtZXRhZGF0YSBjb250YWluZWQgd2l0aGluIHRoZSBNU0YgZmlsZS4gIEluCisvLy8gdGhlIGNhc2Ugb2YgYSBzdGFuZGFyZCBNU0YgU3RyZWFtLCB0aGUgbGF5b3V0IG9mIHRoZSBzdHJlYW0ncyBibG9ja3MKKy8vLyBpcyBkZXNjcmliZWQgYnkgdGhlIE1TRiAiZGlyZWN0b3J5IiwgYnV0IGluIHRoZSBjYXNlIG9mIHRoZSBkaXJlY3RvcnkKKy8vLyBpdHNlbGYsIHRoZSBsYXlvdXQgaXMgZGVzY3JpYmVkIGJ5IGFuIGFycmF5IGF0IGEgZml4ZWQgbG9jYXRpb24gd2l0aGluCisvLy8gdGhlIE1TRi4gIE1hcHBlZEJsb2NrU3RyZWFtIHByb3ZpZGVzIG1ldGhvZHMgZm9yIHJlYWRpbmcgZnJvbSBhbmQgd3JpdGluZworLy8vIHRvIG9uZSBvZiB0aGVzZSBzdHJlYW1zIHRyYW5zcGFyZW50bHksIGFzIGlmIGl0IHdlcmUgYSBjb250aWd1b3VzIHNlcXVlbmNlCisvLy8gb2YgYnl0ZXMuCitjbGFzcyBNYXBwZWRCbG9ja1N0cmVhbSA6IHB1YmxpYyBCaW5hcnlTdHJlYW0geworICBmcmllbmQgY2xhc3MgV3JpdGFibGVNYXBwZWRCbG9ja1N0cmVhbTsKKworcHVibGljOgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPE1hcHBlZEJsb2NrU3RyZWFtPgorICBjcmVhdGVTdHJlYW0odWludDMyX3QgQmxvY2tTaXplLCBjb25zdCBNU0ZTdHJlYW1MYXlvdXQgJkxheW91dCwKKyAgICAgICAgICAgICAgIEJpbmFyeVN0cmVhbVJlZiBNc2ZEYXRhLCBCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IpOworCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8TWFwcGVkQmxvY2tTdHJlYW0+CisgIGNyZWF0ZUluZGV4ZWRTdHJlYW0oY29uc3QgTVNGTGF5b3V0ICZMYXlvdXQsIEJpbmFyeVN0cmVhbVJlZiBNc2ZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFN0cmVhbUluZGV4LCBCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IpOworCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8TWFwcGVkQmxvY2tTdHJlYW0+CisgIGNyZWF0ZUZwbVN0cmVhbShjb25zdCBNU0ZMYXlvdXQgJkxheW91dCwgQmluYXJ5U3RyZWFtUmVmIE1zZkRhdGEsCisgICAgICAgICAgICAgICAgICBCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IpOworCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8TWFwcGVkQmxvY2tTdHJlYW0+CisgIGNyZWF0ZURpcmVjdG9yeVN0cmVhbShjb25zdCBNU0ZMYXlvdXQgJkxheW91dCwgQmluYXJ5U3RyZWFtUmVmIE1zZkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IpOworCisgIHN1cHBvcnQ6OmVuZGlhbm5lc3MgZ2V0RW5kaWFuKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBzdXBwb3J0OjpsaXR0bGU7CisgIH0KKworICBFcnJvciByZWFkQnl0ZXModWludDMyX3QgT2Zmc2V0LCB1aW50MzJfdCBTaXplLAorICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gJkJ1ZmZlcikgb3ZlcnJpZGU7CisgIEVycm9yIHJlYWRMb25nZXN0Q29udGlndW91c0NodW5rKHVpbnQzMl90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gJkJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgdWludDMyX3QgZ2V0TGVuZ3RoKCkgb3ZlcnJpZGU7CisKKyAgQnVtcFB0ckFsbG9jYXRvciAmZ2V0QWxsb2NhdG9yKCkgeyByZXR1cm4gQWxsb2NhdG9yOyB9CisKKyAgdm9pZCBpbnZhbGlkYXRlQ2FjaGUoKTsKKworICB1aW50MzJfdCBnZXRCbG9ja1NpemUoKSBjb25zdCB7IHJldHVybiBCbG9ja1NpemU7IH0KKyAgdWludDMyX3QgZ2V0TnVtQmxvY2tzKCkgY29uc3QgeyByZXR1cm4gU3RyZWFtTGF5b3V0LkJsb2Nrcy5zaXplKCk7IH0KKyAgdWludDMyX3QgZ2V0U3RyZWFtTGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gU3RyZWFtTGF5b3V0Lkxlbmd0aDsgfQorCitwcm90ZWN0ZWQ6CisgIE1hcHBlZEJsb2NrU3RyZWFtKHVpbnQzMl90IEJsb2NrU2l6ZSwgY29uc3QgTVNGU3RyZWFtTGF5b3V0ICZTdHJlYW1MYXlvdXQsCisgICAgICAgICAgICAgICAgICAgIEJpbmFyeVN0cmVhbVJlZiBNc2ZEYXRhLCBCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IpOworCitwcml2YXRlOgorICBjb25zdCBNU0ZTdHJlYW1MYXlvdXQgJmdldFN0cmVhbUxheW91dCgpIGNvbnN0IHsgcmV0dXJuIFN0cmVhbUxheW91dDsgfQorICB2b2lkIGZpeENhY2hlQWZ0ZXJXcml0ZSh1aW50MzJfdCBPZmZzZXQsIEFycmF5UmVmPHVpbnQ4X3Q+IERhdGEpIGNvbnN0OworCisgIEVycm9yIHJlYWRCeXRlcyh1aW50MzJfdCBPZmZzZXQsIE11dGFibGVBcnJheVJlZjx1aW50OF90PiBCdWZmZXIpOworICBib29sIHRyeVJlYWRDb250aWd1b3VzbHkodWludDMyX3QgT2Zmc2V0LCB1aW50MzJfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gJkJ1ZmZlcik7CisKKyAgY29uc3QgdWludDMyX3QgQmxvY2tTaXplOworICBjb25zdCBNU0ZTdHJlYW1MYXlvdXQgU3RyZWFtTGF5b3V0OworICBCaW5hcnlTdHJlYW1SZWYgTXNmRGF0YTsKKworICB1c2luZyBDYWNoZUVudHJ5ID0gTXV0YWJsZUFycmF5UmVmPHVpbnQ4X3Q+OworCisgIC8vIFdlIGp1c3Qgc3RvcmUgdGhlIGFsbG9jYXRvciBieSByZWZlcmVuY2UuICBXZSB1c2UgdGhpcyB0byBhbGxvY2F0ZQorICAvLyBjb250aWd1b3VzIG1lbW9yeSBmb3IgdGhpbmdzIGxpa2UgYXJyYXlzIG9yIHN0cmluZ3MgdGhhdCBjcm9zcyBhIGJsb2NrCisgIC8vIGJvdW5kYXJ5LCBhbmQgdGhpcyBtZW1vcnkgaXMgZXhwZWN0ZWQgdG8gb3V0bGl2ZSB0aGUgc3RyZWFtLiAgRm9yIGV4YW1wbGUsCisgIC8vIHNvbWVvbmUgY291bGQgY3JlYXRlIGEgc3RyZWFtLCByZWFkIHNvbWUgc3R1ZmYsIHRoZW4gY2xvc2UgdGhlIHN0cmVhbSwgYW5kCisgIC8vIHdlIHdvdWxkIGxpa2Ugb3V0c3RhbmRpbmcgcmVmZXJlbmNlcyB0byBmaWVsZHMgdG8gcmVtYWluIHZhbGlkIHNpbmNlIHRoZQorICAvLyBlbnRpcmUgZmlsZSBpcyBtYXBwZWQgYW55d2F5LiAgQmVjYXVzZSBvZiB0aGF0LCB0aGUgdXNlciBtdXN0IHN1cHBseSB0aGUKKyAgLy8gYWxsb2NhdG9yIHRvIGFsbG9jYXRlIGJyb2tlbiByZWNvcmRzIGZyb20uCisgIEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvcjsKKyAgRGVuc2VNYXA8dWludDMyX3QsIHN0ZDo6dmVjdG9yPENhY2hlRW50cnk+PiBDYWNoZU1hcDsKK307CisKK2NsYXNzIFdyaXRhYmxlTWFwcGVkQmxvY2tTdHJlYW0gOiBwdWJsaWMgV3JpdGFibGVCaW5hcnlTdHJlYW0geworcHVibGljOgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFdyaXRhYmxlTWFwcGVkQmxvY2tTdHJlYW0+CisgIGNyZWF0ZVN0cmVhbSh1aW50MzJfdCBCbG9ja1NpemUsIGNvbnN0IE1TRlN0cmVhbUxheW91dCAmTGF5b3V0LAorICAgICAgICAgICAgICAgV3JpdGFibGVCaW5hcnlTdHJlYW1SZWYgTXNmRGF0YSwgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yKTsKKworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFdyaXRhYmxlTWFwcGVkQmxvY2tTdHJlYW0+CisgIGNyZWF0ZUluZGV4ZWRTdHJlYW0oY29uc3QgTVNGTGF5b3V0ICZMYXlvdXQsIFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmIE1zZkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU3RyZWFtSW5kZXgsIEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvcik7CisKKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxXcml0YWJsZU1hcHBlZEJsb2NrU3RyZWFtPgorICBjcmVhdGVEaXJlY3RvcnlTdHJlYW0oY29uc3QgTVNGTGF5b3V0ICZMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiBNc2ZEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yKTsKKworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFdyaXRhYmxlTWFwcGVkQmxvY2tTdHJlYW0+CisgIGNyZWF0ZUZwbVN0cmVhbShjb25zdCBNU0ZMYXlvdXQgJkxheW91dCwgV3JpdGFibGVCaW5hcnlTdHJlYW1SZWYgTXNmRGF0YSwKKyAgICAgICAgICAgICAgICAgIEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvciwgYm9vbCBBbHRGcG0gPSBmYWxzZSk7CisKKyAgc3VwcG9ydDo6ZW5kaWFubmVzcyBnZXRFbmRpYW4oKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIHN1cHBvcnQ6OmxpdHRsZTsKKyAgfQorCisgIEVycm9yIHJlYWRCeXRlcyh1aW50MzJfdCBPZmZzZXQsIHVpbnQzMl90IFNpemUsCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiAmQnVmZmVyKSBvdmVycmlkZTsKKyAgRXJyb3IgcmVhZExvbmdlc3RDb250aWd1b3VzQ2h1bmsodWludDMyX3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiAmQnVmZmVyKSBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TGVuZ3RoKCkgb3ZlcnJpZGU7CisKKyAgRXJyb3Igd3JpdGVCeXRlcyh1aW50MzJfdCBPZmZzZXQsIEFycmF5UmVmPHVpbnQ4X3Q+IEJ1ZmZlcikgb3ZlcnJpZGU7CisKKyAgRXJyb3IgY29tbWl0KCkgb3ZlcnJpZGU7CisKKyAgY29uc3QgTVNGU3RyZWFtTGF5b3V0ICZnZXRTdHJlYW1MYXlvdXQoKSBjb25zdCB7CisgICAgcmV0dXJuIFJlYWRJbnRlcmZhY2UuZ2V0U3RyZWFtTGF5b3V0KCk7CisgIH0KKworICB1aW50MzJfdCBnZXRCbG9ja1NpemUoKSBjb25zdCB7IHJldHVybiBSZWFkSW50ZXJmYWNlLmdldEJsb2NrU2l6ZSgpOyB9CisgIHVpbnQzMl90IGdldE51bUJsb2NrcygpIGNvbnN0IHsgcmV0dXJuIFJlYWRJbnRlcmZhY2UuZ2V0TnVtQmxvY2tzKCk7IH0KKyAgdWludDMyX3QgZ2V0U3RyZWFtTGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gUmVhZEludGVyZmFjZS5nZXRTdHJlYW1MZW5ndGgoKTsgfQorCitwcm90ZWN0ZWQ6CisgIFdyaXRhYmxlTWFwcGVkQmxvY2tTdHJlYW0odWludDMyX3QgQmxvY2tTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1TRlN0cmVhbUxheW91dCAmU3RyZWFtTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmIE1zZkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yKTsKKworcHJpdmF0ZToKKyAgTWFwcGVkQmxvY2tTdHJlYW0gUmVhZEludGVyZmFjZTsKKyAgV3JpdGFibGVCaW5hcnlTdHJlYW1SZWYgV3JpdGVJbnRlcmZhY2U7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgcGRiCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fTVNGX01BUFBFREJMT0NLU1RSRUFNX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9Db25jcmV0ZVN5bWJvbEVudW1lcmF0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9Db25jcmV0ZVN5bWJvbEVudW1lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzEzZGNlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0NvbmNyZXRlU3ltYm9sRW51bWVyYXRvci5oCkBAIC0wLDAgKzEsNTkgQEAKKy8vPT09LSBDb25jcmV0ZVN5bWJvbEVudW1lcmF0b3IuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX0NPTkNSRVRFU1lNQk9MRU5VTUVSQVRPUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9DT05DUkVURVNZTUJPTEVOVU1FUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL0lQREJFbnVtQ2hpbGRyZW4uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvUERCVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGlsZFR5cGU+CitjbGFzcyBDb25jcmV0ZVN5bWJvbEVudW1lcmF0b3IgOiBwdWJsaWMgSVBEQkVudW1DaGlsZHJlbjxDaGlsZFR5cGU+IHsKK3B1YmxpYzoKKyAgQ29uY3JldGVTeW1ib2xFbnVtZXJhdG9yKHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+IFN5bWJvbEVudW1lcmF0b3IpCisgICAgICA6IEVudW1lcmF0b3Ioc3RkOjptb3ZlKFN5bWJvbEVudW1lcmF0b3IpKSB7fQorCisgIH5Db25jcmV0ZVN5bWJvbEVudW1lcmF0b3IoKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgdWludDMyX3QgZ2V0Q2hpbGRDb3VudCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gRW51bWVyYXRvci0+Z2V0Q2hpbGRDb3VudCgpOworICB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPENoaWxkVHlwZT4gZ2V0Q2hpbGRBdEluZGV4KHVpbnQzMl90IEluZGV4KSBjb25zdCBvdmVycmlkZSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbD4gQ2hpbGQgPSBFbnVtZXJhdG9yLT5nZXRDaGlsZEF0SW5kZXgoSW5kZXgpOworICAgIHJldHVybiB1bmlxdWVfZHluX2Nhc3Rfb3JfbnVsbDxDaGlsZFR5cGU+KENoaWxkKTsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxDaGlsZFR5cGU+IGdldE5leHQoKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIHVuaXF1ZV9keW5fY2FzdF9vcl9udWxsPENoaWxkVHlwZT4oRW51bWVyYXRvci0+Z2V0TmV4dCgpKTsKKyAgfQorCisgIHZvaWQgcmVzZXQoKSBvdmVycmlkZSB7IEVudW1lcmF0b3ItPnJlc2V0KCk7IH0KKworICBDb25jcmV0ZVN5bWJvbEVudW1lcmF0b3I8Q2hpbGRUeXBlPiAqY2xvbmUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4gV3JhcHBlZENsb25lKEVudW1lcmF0b3ItPmNsb25lKCkpOworICAgIHJldHVybiBuZXcgQ29uY3JldGVTeW1ib2xFbnVtZXJhdG9yPENoaWxkVHlwZT4oc3RkOjptb3ZlKFdyYXBwZWRDbG9uZSkpOworICB9CisKK3ByaXZhdGU6CisKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4gRW51bWVyYXRvcjsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBwZGIKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfQ09OQ1JFVEVTWU1CT0xFTlVNRVJBVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBRGF0YVN0cmVhbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFEYXRhU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMwYmVhNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBRGF0YVN0cmVhbS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vPT09LSBESUFEYXRhU3RyZWFtLmggLSBESUEgaW1wbGVtZW50YXRpb24gb2YgSVBEQkRhdGFTdHJlYW0gLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFEQVRBU1RSRUFNX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFEQVRBU1RSRUFNX0gKKworI2luY2x1ZGUgIkRJQVN1cHBvcnQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvSVBEQkRhdGFTdHJlYW0uaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBESUFEYXRhU3RyZWFtIDogcHVibGljIElQREJEYXRhU3RyZWFtIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRElBRGF0YVN0cmVhbShDQ29tUHRyPElEaWFFbnVtRGVidWdTdHJlYW1EYXRhPiBEaWFTdHJlYW1EYXRhKTsKKworICB1aW50MzJfdCBnZXRSZWNvcmRDb3VudCgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGxsdm06Ok9wdGlvbmFsPFJlY29yZFR5cGU+IGdldEl0ZW1BdEluZGV4KHVpbnQzMl90IEluZGV4KSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBnZXROZXh0KFJlY29yZFR5cGUgJlJlY29yZCkgb3ZlcnJpZGU7CisgIHZvaWQgcmVzZXQoKSBvdmVycmlkZTsKKyAgRElBRGF0YVN0cmVhbSAqY2xvbmUoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgQ0NvbVB0cjxJRGlhRW51bURlYnVnU3RyZWFtRGF0YT4gU3RyZWFtRGF0YTsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFFbnVtRGVidWdTdHJlYW1zLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQUVudW1EZWJ1Z1N0cmVhbXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmFlNjY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFFbnVtRGVidWdTdHJlYW1zLmgKQEAgLTAsMCArMSwzOCBAQAorLy89PS0gRElBRW51bURlYnVnU3RyZWFtcy5oIC0gRElBIERlYnVnIFN0cmVhbSBFbnVtZXJhdG9yIGltcGwgLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQUVOVU1ERUJVR1NUUkVBTVNfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQUVOVU1ERUJVR1NUUkVBTVNfSAorCisjaW5jbHVkZSAiRElBU3VwcG9ydC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCRGF0YVN0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCRW51bUNoaWxkcmVuLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBJUERCRGF0YVN0cmVhbTsKKworY2xhc3MgRElBRW51bURlYnVnU3RyZWFtcyA6IHB1YmxpYyBJUERCRW51bUNoaWxkcmVuPElQREJEYXRhU3RyZWFtPiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IERJQUVudW1EZWJ1Z1N0cmVhbXMoQ0NvbVB0cjxJRGlhRW51bURlYnVnU3RyZWFtcz4gRGlhRW51bWVyYXRvcik7CisKKyAgdWludDMyX3QgZ2V0Q2hpbGRDb3VudCgpIGNvbnN0IG92ZXJyaWRlOworICBDaGlsZFR5cGVQdHIgZ2V0Q2hpbGRBdEluZGV4KHVpbnQzMl90IEluZGV4KSBjb25zdCBvdmVycmlkZTsKKyAgQ2hpbGRUeXBlUHRyIGdldE5leHQoKSBvdmVycmlkZTsKKyAgdm9pZCByZXNldCgpIG92ZXJyaWRlOworICBESUFFbnVtRGVidWdTdHJlYW1zICpjbG9uZSgpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBDQ29tUHRyPElEaWFFbnVtRGVidWdTdHJlYW1zPiBFbnVtZXJhdG9yOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQUVudW1JbmplY3RlZFNvdXJjZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBRW51bUluamVjdGVkU291cmNlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5NDkwYTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQUVudW1JbmplY3RlZFNvdXJjZXMuaApAQCAtMCwwICsxLDQwIEBACisvLz09LSBESUFFbnVtSW5qZWN0ZWRTb3VyY2VzLmggLSBESUEgSW5qZWN0ZWQgU291cmNlcyBFbnVtZXJhdG9yIC0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBRU5VTUlOSkVDVEVEU09VUkNFU19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBRU5VTUlOSkVDVEVEU09VUkNFU19ICisKKyNpbmNsdWRlICJESUFTdXBwb3J0LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL0lQREJFbnVtQ2hpbGRyZW4uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvSVBEQkluamVjdGVkU291cmNlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworY2xhc3MgRElBU2Vzc2lvbjsKKworY2xhc3MgRElBRW51bUluamVjdGVkU291cmNlcyA6IHB1YmxpYyBJUERCRW51bUNoaWxkcmVuPElQREJJbmplY3RlZFNvdXJjZT4geworcHVibGljOgorICBleHBsaWNpdCBESUFFbnVtSW5qZWN0ZWRTb3VyY2VzKAorICAgICAgY29uc3QgRElBU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgIENDb21QdHI8SURpYUVudW1JbmplY3RlZFNvdXJjZXM+IERpYUVudW1lcmF0b3IpOworCisgIHVpbnQzMl90IGdldENoaWxkQ291bnQoKSBjb25zdCBvdmVycmlkZTsKKyAgQ2hpbGRUeXBlUHRyIGdldENoaWxkQXRJbmRleCh1aW50MzJfdCBJbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisgIENoaWxkVHlwZVB0ciBnZXROZXh0KCkgb3ZlcnJpZGU7CisgIHZvaWQgcmVzZXQoKSBvdmVycmlkZTsKKyAgRElBRW51bUluamVjdGVkU291cmNlcyAqY2xvbmUoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgY29uc3QgRElBU2Vzc2lvbiAmU2Vzc2lvbjsKKyAgQ0NvbVB0cjxJRGlhRW51bUluamVjdGVkU291cmNlcz4gRW51bWVyYXRvcjsKK307Cit9IC8vIG5hbWVzcGFjZSBwZGIKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBRU5VTUlOSkVDVEVEU09VUkNFU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQUVudW1MaW5lTnVtYmVycy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFFbnVtTGluZU51bWJlcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGYwZGUxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFFbnVtTGluZU51bWJlcnMuaApAQCAtMCwwICsxLDM3IEBACisvLz09LSBESUFFbnVtTGluZU51bWJlcnMuaCAtIERJQSBMaW5lIE51bWJlciBFbnVtZXJhdG9yIGltcGwgLS0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBRU5VTUxJTkVOVU1CRVJTX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFFTlVNTElORU5VTUJFUlNfSAorCisjaW5jbHVkZSAiRElBU3VwcG9ydC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCRW51bUNoaWxkcmVuLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL0lQREJMaW5lTnVtYmVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworY2xhc3MgSVBEQkxpbmVOdW1iZXI7CisKK2NsYXNzIERJQUVudW1MaW5lTnVtYmVycyA6IHB1YmxpYyBJUERCRW51bUNoaWxkcmVuPElQREJMaW5lTnVtYmVyPiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IERJQUVudW1MaW5lTnVtYmVycyhDQ29tUHRyPElEaWFFbnVtTGluZU51bWJlcnM+IERpYUVudW1lcmF0b3IpOworCisgIHVpbnQzMl90IGdldENoaWxkQ291bnQoKSBjb25zdCBvdmVycmlkZTsKKyAgQ2hpbGRUeXBlUHRyIGdldENoaWxkQXRJbmRleCh1aW50MzJfdCBJbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisgIENoaWxkVHlwZVB0ciBnZXROZXh0KCkgb3ZlcnJpZGU7CisgIHZvaWQgcmVzZXQoKSBvdmVycmlkZTsKKyAgRElBRW51bUxpbmVOdW1iZXJzICpjbG9uZSgpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBDQ29tUHRyPElEaWFFbnVtTGluZU51bWJlcnM+IEVudW1lcmF0b3I7Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBRW51bVNlY3Rpb25Db250cmlicy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFFbnVtU2VjdGlvbkNvbnRyaWJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWMzN2Q5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBRW51bVNlY3Rpb25Db250cmlicy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vPT0tIERJQUVudW1TZWN0aW9uQ29udHJpYnMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFFTlVNU0VDVElPTkNPTlRSSUJTX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFFTlVNU0VDVElPTkNPTlRSSUJTX0gKKworI2luY2x1ZGUgIkRJQVN1cHBvcnQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvSVBEQkVudW1DaGlsZHJlbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCU2VjdGlvbkNvbnRyaWIuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBESUFTZXNzaW9uOworCitjbGFzcyBESUFFbnVtU2VjdGlvbkNvbnRyaWJzIDogcHVibGljIElQREJFbnVtQ2hpbGRyZW48SVBEQlNlY3Rpb25Db250cmliPiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IERJQUVudW1TZWN0aW9uQ29udHJpYnMoCisgICAgICBjb25zdCBESUFTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgQ0NvbVB0cjxJRGlhRW51bVNlY3Rpb25Db250cmlicz4gRGlhRW51bWVyYXRvcik7CisKKyAgdWludDMyX3QgZ2V0Q2hpbGRDb3VudCgpIGNvbnN0IG92ZXJyaWRlOworICBDaGlsZFR5cGVQdHIgZ2V0Q2hpbGRBdEluZGV4KHVpbnQzMl90IEluZGV4KSBjb25zdCBvdmVycmlkZTsKKyAgQ2hpbGRUeXBlUHRyIGdldE5leHQoKSBvdmVycmlkZTsKKyAgdm9pZCByZXNldCgpIG92ZXJyaWRlOworICBESUFFbnVtU2VjdGlvbkNvbnRyaWJzICpjbG9uZSgpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBjb25zdCBESUFTZXNzaW9uICZTZXNzaW9uOworICBDQ29tUHRyPElEaWFFbnVtU2VjdGlvbkNvbnRyaWJzPiBFbnVtZXJhdG9yOworfTsKK30KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBRU5VTVNFQ1RJT05DT05UUklCU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQUVudW1Tb3VyY2VGaWxlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFFbnVtU291cmNlRmlsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNjlkMThmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFFbnVtU291cmNlRmlsZXMuaApAQCAtMCwwICsxLDM5IEBACisvLz09LSBESUFFbnVtU291cmNlRmlsZXMuaCAtIERJQSBTb3VyY2UgRmlsZSBFbnVtZXJhdG9yIGltcGwgLS0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBRU5VTVNPVVJDRUZJTEVTX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFFTlVNU09VUkNFRklMRVNfSAorCisjaW5jbHVkZSAiRElBU3VwcG9ydC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCRW51bUNoaWxkcmVuLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL0lQREJTb3VyY2VGaWxlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworY2xhc3MgRElBU2Vzc2lvbjsKKworY2xhc3MgRElBRW51bVNvdXJjZUZpbGVzIDogcHVibGljIElQREJFbnVtQ2hpbGRyZW48SVBEQlNvdXJjZUZpbGU+IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRElBRW51bVNvdXJjZUZpbGVzKGNvbnN0IERJQVNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ29tUHRyPElEaWFFbnVtU291cmNlRmlsZXM+IERpYUVudW1lcmF0b3IpOworCisgIHVpbnQzMl90IGdldENoaWxkQ291bnQoKSBjb25zdCBvdmVycmlkZTsKKyAgQ2hpbGRUeXBlUHRyIGdldENoaWxkQXRJbmRleCh1aW50MzJfdCBJbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisgIENoaWxkVHlwZVB0ciBnZXROZXh0KCkgb3ZlcnJpZGU7CisgIHZvaWQgcmVzZXQoKSBvdmVycmlkZTsKKyAgRElBRW51bVNvdXJjZUZpbGVzICpjbG9uZSgpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBjb25zdCBESUFTZXNzaW9uICZTZXNzaW9uOworICBDQ29tUHRyPElEaWFFbnVtU291cmNlRmlsZXM+IEVudW1lcmF0b3I7Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBRW51bVN5bWJvbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBRW51bVN5bWJvbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNzc5Y2QxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFFbnVtU3ltYm9scy5oCkBAIC0wLDAgKzEsMzkgQEAKKy8vPT0tIERJQUVudW1TeW1ib2xzLmggLSBESUEgU3ltYm9sIEVudW1lcmF0b3IgaW1wbCAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFFTlVNU1lNQk9MU19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBRU5VTVNZTUJPTFNfSAorCisjaW5jbHVkZSAiRElBU3VwcG9ydC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCRW51bUNoaWxkcmVuLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbC5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKK2NsYXNzIERJQVNlc3Npb247CisKK2NsYXNzIERJQUVudW1TeW1ib2xzIDogcHVibGljIElQREJFbnVtQ2hpbGRyZW48UERCU3ltYm9sPiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IERJQUVudW1TeW1ib2xzKGNvbnN0IERJQVNlc3Npb24gJlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIENDb21QdHI8SURpYUVudW1TeW1ib2xzPiBEaWFFbnVtZXJhdG9yKTsKKworICB1aW50MzJfdCBnZXRDaGlsZENvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2w+IGdldENoaWxkQXRJbmRleCh1aW50MzJfdCBJbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2w+IGdldE5leHQoKSBvdmVycmlkZTsKKyAgdm9pZCByZXNldCgpIG92ZXJyaWRlOworICBESUFFbnVtU3ltYm9scyAqY2xvbmUoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgY29uc3QgRElBU2Vzc2lvbiAmU2Vzc2lvbjsKKyAgQ0NvbVB0cjxJRGlhRW51bVN5bWJvbHM+IEVudW1lcmF0b3I7Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBRW51bVRhYmxlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFFbnVtVGFibGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI2ZmNmZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBRW51bVRhYmxlcy5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vPT09LSBESUFFbnVtVGFibGVzLmggLSBESUEgVGFibGVzIEVudW1lcmF0b3IgSW1wbCAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFFTlVNVEFCTEVTX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFFTlVNVEFCTEVTX0gKKworI2luY2x1ZGUgIkRJQVN1cHBvcnQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvSVBEQkVudW1DaGlsZHJlbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCVGFibGUuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBJUERCVGFibGU7CisKK2NsYXNzIERJQUVudW1UYWJsZXMgOiBwdWJsaWMgSVBEQkVudW1DaGlsZHJlbjxJUERCVGFibGU+IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRElBRW51bVRhYmxlcyhDQ29tUHRyPElEaWFFbnVtVGFibGVzPiBEaWFFbnVtZXJhdG9yKTsKKworICB1aW50MzJfdCBnZXRDaGlsZENvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCVGFibGU+IGdldENoaWxkQXRJbmRleCh1aW50MzJfdCBJbmRleCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCVGFibGU+IGdldE5leHQoKSBvdmVycmlkZTsKKyAgdm9pZCByZXNldCgpIG92ZXJyaWRlOworICBESUFFbnVtVGFibGVzICpjbG9uZSgpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBDQ29tUHRyPElEaWFFbnVtVGFibGVzPiBFbnVtZXJhdG9yOworfTsKK30KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBRU5VTVRBQkxFU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQUVycm9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQUVycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzVhMzlhMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBRXJyb3IuaApAQCAtMCwwICsxLDQ1IEBACisvLz09PS0gRElBRXJyb3IuaCAtIEVycm9yIGV4dGVuc2lvbnMgZm9yIFBEQiBESUEgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBRVJST1JfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQUVSUk9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKK2VudW0gY2xhc3MgZGlhX2Vycm9yX2NvZGUgeworICB1bnNwZWNpZmllZCA9IDEsCisgIGNvdWxkX25vdF9jcmVhdGVfaW1wbCwKKyAgaW52YWxpZF9maWxlX2Zvcm1hdCwKKyAgaW52YWxpZF9wYXJhbWV0ZXIsCisgIGFscmVhZHlfbG9hZGVkLAorICBkZWJ1Z19pbmZvX21pc21hdGNoLAorfTsKKworLy8vIEJhc2UgY2xhc3MgZm9yIGVycm9ycyBvcmlnaW5hdGluZyBpbiBESUEgU0RLLCBlLmcuIENPTSBjYWxscworY2xhc3MgRElBRXJyb3IgOiBwdWJsaWMgRXJyb3JJbmZvPERJQUVycm9yPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworICBESUFFcnJvcihkaWFfZXJyb3JfY29kZSBDKTsKKyAgRElBRXJyb3IoU3RyaW5nUmVmIENvbnRleHQpOworICBESUFFcnJvcihkaWFfZXJyb3JfY29kZSBDLCBTdHJpbmdSZWYgQ29udGV4dCk7CisKKyAgdm9pZCBsb2cocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZTsKKyAgU3RyaW5nUmVmIGdldEVycm9yTWVzc2FnZSgpIGNvbnN0OworICBzdGQ6OmVycm9yX2NvZGUgY29udmVydFRvRXJyb3JDb2RlKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIEVyck1zZzsKKyAgZGlhX2Vycm9yX2NvZGUgQ29kZTsKK307Cit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBSW5qZWN0ZWRTb3VyY2UuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBSW5qZWN0ZWRTb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzU1MDhkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFJbmplY3RlZFNvdXJjZS5oCkBAIC0wLDAgKzEsMzggQEAKKy8vPT09LSBESUFJbmplY3RlZFNvdXJjZS5oIC0gRElBIGltcGwgZm9yIElQREJJbmplY3RlZFNvdXJjZSAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFJTkpFQ1RFRFNPVVJDRV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBSU5KRUNURURTT1VSQ0VfSAorCisjaW5jbHVkZSAiRElBU3VwcG9ydC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCSW5qZWN0ZWRTb3VyY2UuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBESUFTZXNzaW9uOworCitjbGFzcyBESUFJbmplY3RlZFNvdXJjZSA6IHB1YmxpYyBJUERCSW5qZWN0ZWRTb3VyY2UgeworcHVibGljOgorICBleHBsaWNpdCBESUFJbmplY3RlZFNvdXJjZShDQ29tUHRyPElEaWFJbmplY3RlZFNvdXJjZT4gRGlhU291cmNlRmlsZSk7CisKKyAgdWludDMyX3QgZ2V0Q3JjMzIoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0Q29kZUJ5dGVTaXplKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldEZpbGVOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldE9iamVjdEZpbGVOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldFZpcnR1YWxGaWxlTmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICBQREJfU291cmNlQ29tcHJlc3Npb24gZ2V0Q29tcHJlc3Npb24oKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0Q29kZSgpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBDQ29tUHRyPElEaWFJbmplY3RlZFNvdXJjZT4gU291cmNlRmlsZTsKK307Cit9IC8vIG5hbWVzcGFjZSBwZGIKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBSU5KRUNURURTT1VSQ0VfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFMaW5lTnVtYmVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQUxpbmVOdW1iZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTllM2ExCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFMaW5lTnVtYmVyLmgKQEAgLTAsMCArMSw0MCBAQAorLy89PT0tIERJQUxpbmVOdW1iZXIuaCAtIERJQSBpbXBsZW1lbnRhdGlvbiBvZiBJUERCTGluZU51bWJlciAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQUxJTkVOVU1CRVJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQUxJTkVOVU1CRVJfSAorCisjaW5jbHVkZSAiRElBU3VwcG9ydC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCTGluZU51bWJlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKK2NsYXNzIERJQUxpbmVOdW1iZXIgOiBwdWJsaWMgSVBEQkxpbmVOdW1iZXIgeworcHVibGljOgorICBleHBsaWNpdCBESUFMaW5lTnVtYmVyKENDb21QdHI8SURpYUxpbmVOdW1iZXI+IERpYUxpbmVOdW1iZXIpOworCisgIHVpbnQzMl90IGdldExpbmVOdW1iZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TGluZU51bWJlckVuZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRDb2x1bW5OdW1iZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0Q29sdW1uTnVtYmVyRW5kKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldEFkZHJlc3NTZWN0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldEFkZHJlc3NPZmZzZXQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0UmVsYXRpdmVWaXJ0dWFsQWRkcmVzcygpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRWaXJ0dWFsQWRkcmVzcygpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRMZW5ndGgoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0U291cmNlRmlsZUlkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldENvbXBpbGFuZElkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTdGF0ZW1lbnQoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgQ0NvbVB0cjxJRGlhTGluZU51bWJlcj4gTGluZU51bWJlcjsKK307Cit9Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBUmF3U3ltYm9sLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQVJhd1N5bWJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmYjM1NjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQVJhd1N5bWJvbC5oCkBAIC0wLDAgKzEsMjMzIEBACisvLz09PS0gRElBUmF3U3ltYm9sLmggLSBESUEgaW1wbGVtZW50YXRpb24gb2YgSVBEQlJhd1N5bWJvbCAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFSQVdTWU1CT0xfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQVJBV1NZTUJPTF9ICisKKyNpbmNsdWRlICJESUFTdXBwb3J0LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL0lQREJSYXdTeW1ib2wuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBESUFTZXNzaW9uOworY2xhc3MgRElBUmF3U3ltYm9sIDogcHVibGljIElQREJSYXdTeW1ib2wgeworcHVibGljOgorICBESUFSYXdTeW1ib2woY29uc3QgRElBU2Vzc2lvbiAmUERCU2Vzc2lvbiwgQ0NvbVB0cjxJRGlhU3ltYm9sPiBEaWFTeW1ib2wpOworCisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MsIGludCBJbmRlbnQpIGNvbnN0IG92ZXJyaWRlOworCisgIENDb21QdHI8SURpYVN5bWJvbD4gZ2V0RGlhU3ltYm9sKCkgY29uc3QgeyByZXR1cm4gU3ltYm9sOyB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4KKyAgZmluZENoaWxkcmVuKFBEQl9TeW1UeXBlIFR5cGUpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPgorICBmaW5kQ2hpbGRyZW4oUERCX1N5bVR5cGUgVHlwZSwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICBQREJfTmFtZVNlYXJjaEZsYWdzIEZsYWdzKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4KKyAgZmluZENoaWxkcmVuQnlBZGRyKFBEQl9TeW1UeXBlIFR5cGUsIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgUERCX05hbWVTZWFyY2hGbGFncyBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNlY3Rpb24sIHVpbnQzMl90IE9mZnNldCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+CisgIGZpbmRDaGlsZHJlbkJ5VkEoUERCX1N5bVR5cGUgVHlwZSwgU3RyaW5nUmVmIE5hbWUsIFBEQl9OYW1lU2VhcmNoRmxhZ3MgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgdWludDY0X3QgVkEpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPgorICBmaW5kQ2hpbGRyZW5CeVJWQShQREJfU3ltVHlwZSBUeXBlLCBTdHJpbmdSZWYgTmFtZSwgUERCX05hbWVTZWFyY2hGbGFncyBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUlZBKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPgorICBmaW5kSW5saW5lRnJhbWVzQnlBZGRyKHVpbnQzMl90IFNlY3Rpb24sIHVpbnQzMl90IE9mZnNldCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+CisgIGZpbmRJbmxpbmVGcmFtZXNCeVJWQSh1aW50MzJfdCBSVkEpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPgorICBmaW5kSW5saW5lRnJhbWVzQnlWQSh1aW50NjRfdCBWQSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtTGluZU51bWJlcnM+IGZpbmRJbmxpbmVlTGluZXMoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtTGluZU51bWJlcnM+CisgIGZpbmRJbmxpbmVlTGluZXNCeUFkZHIodWludDMyX3QgU2VjdGlvbiwgdWludDMyX3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IExlbmd0aCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUxpbmVOdW1iZXJzPgorICBmaW5kSW5saW5lZUxpbmVzQnlSVkEodWludDMyX3QgUlZBLCB1aW50MzJfdCBMZW5ndGgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1MaW5lTnVtYmVycz4KKyAgZmluZElubGluZWVMaW5lc0J5VkEodWludDY0X3QgVkEsIHVpbnQzMl90IExlbmd0aCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBnZXREYXRhQnl0ZXMobGx2bTo6U21hbGxWZWN0b3I8dWludDhfdCwgMzI+ICZieXRlcykgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0RnJvbnRFbmRWZXJzaW9uKFZlcnNpb25JbmZvICZWZXJzaW9uKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBnZXRCYWNrRW5kVmVyc2lvbihWZXJzaW9uSW5mbyAmVmVyc2lvbikgY29uc3Qgb3ZlcnJpZGU7CisgIFBEQl9NZW1iZXJBY2Nlc3MgZ2V0QWNjZXNzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldEFkZHJlc3NPZmZzZXQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0QWRkcmVzc1NlY3Rpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0QWdlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldEFycmF5SW5kZXhUeXBlSWQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0QmFzZURhdGFPZmZzZXQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0QmFzZURhdGFTbG90KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldEJhc2VTeW1ib2xJZCgpIGNvbnN0IG92ZXJyaWRlOworICBQREJfQnVpbHRpblR5cGUgZ2V0QnVpbHRpblR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0Qml0UG9zaXRpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgUERCX0NhbGxpbmdDb252IGdldENhbGxpbmdDb252ZW50aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldENsYXNzUGFyZW50SWQoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0Q29tcGlsZXJOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldENvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldENvdW50TGl2ZVJhbmdlcygpIGNvbnN0IG92ZXJyaWRlOworICBQREJfTGFuZyBnZXRMYW5ndWFnZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRMZXhpY2FsUGFyZW50SWQoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TGl2ZVJhbmdlU3RhcnRBZGRyZXNzT2Zmc2V0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldExpdmVSYW5nZVN0YXJ0QWRkcmVzc1NlY3Rpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TGl2ZVJhbmdlU3RhcnRSZWxhdGl2ZVZpcnR1YWxBZGRyZXNzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGNvZGV2aWV3OjpSZWdpc3RlcklkIGdldExvY2FsQmFzZVBvaW50ZXJSZWdpc3RlcklkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldExvd2VyQm91bmRJZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRNZW1vcnlTcGFjZUtpbmQoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXROdW1iZXJPZkFjY2VsZXJhdG9yUG9pbnRlclRhZ3MoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TnVtYmVyT2ZDb2x1bW5zKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldE51bWJlck9mTW9kaWZpZXJzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldE51bWJlck9mUmVnaXN0ZXJJbmRpY2VzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldE51bWJlck9mUm93cygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXRPYmplY3RGaWxlTmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRPZW1JZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRPZW1TeW1ib2xJZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRPZmZzZXRJblVkdCgpIGNvbnN0IG92ZXJyaWRlOworICBQREJfQ3B1IGdldFBsYXRmb3JtKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFJhbmsoKSBjb25zdCBvdmVycmlkZTsKKyAgY29kZXZpZXc6OlJlZ2lzdGVySWQgZ2V0UmVnaXN0ZXJJZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRSZWdpc3RlclR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0UmVsYXRpdmVWaXJ0dWFsQWRkcmVzcygpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRTYW1wbGVyU2xvdCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRTaWduYXR1cmUoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0U2l6ZUluVWR0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFNsb3QoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0U291cmNlRmlsZU5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJMaW5lTnVtYmVyPiBnZXRTcmNMaW5lT25UeXBlRGVmbigpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRTdHJpZGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0U3ViVHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldFN5bWJvbHNGaWxlTmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRTeW1JbmRleElkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFRhcmdldE9mZnNldCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRUYXJnZXRSZWxhdGl2ZVZpcnR1YWxBZGRyZXNzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldFRhcmdldFZpcnR1YWxBZGRyZXNzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFRhcmdldFNlY3Rpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0VGV4dHVyZVNsb3QoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0VGltZVN0YW1wKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFRva2VuKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRVYXZTbG90KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldFVuZGVjb3JhdGVkTmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXRVbmRlY29yYXRlZE5hbWVFeChQREJfVW5kbmFtZUZsYWdzIEZsYWdzKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0VW5tb2RpZmllZFR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRVcHBlckJvdW5kSWQoKSBjb25zdCBvdmVycmlkZTsKKyAgVmFyaWFudCBnZXRWYWx1ZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRWaXJ0dWFsQmFzZURpc3BJbmRleCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRWaXJ0dWFsQmFzZU9mZnNldCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRWaXJ0dWFsVGFibGVTaGFwZUlkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2xUeXBlQnVpbHRpbj4KKyAgZ2V0VmlydHVhbEJhc2VUYWJsZVR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgUERCX0RhdGFLaW5kIGdldERhdGFLaW5kKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFBEQl9TeW1UeXBlIGdldFN5bVRhZygpIGNvbnN0IG92ZXJyaWRlOworICBjb2Rldmlldzo6R1VJRCBnZXRHdWlkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGludDMyX3QgZ2V0T2Zmc2V0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGludDMyX3QgZ2V0VGhpc0FkanVzdCgpIGNvbnN0IG92ZXJyaWRlOworICBpbnQzMl90IGdldFZpcnR1YWxCYXNlUG9pbnRlck9mZnNldCgpIGNvbnN0IG92ZXJyaWRlOworICBQREJfTG9jVHlwZSBnZXRMb2NhdGlvblR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgUERCX01hY2hpbmUgZ2V0TWFjaGluZVR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgY29kZXZpZXc6OlRodW5rT3JkaW5hbCBnZXRUaHVua09yZGluYWwoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0TGVuZ3RoKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldExpdmVSYW5nZUxlbmd0aCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRWaXJ0dWFsQWRkcmVzcygpIGNvbnN0IG92ZXJyaWRlOworICBQREJfVWR0VHlwZSBnZXRVZHRLaW5kKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzQ29uc3RydWN0b3IoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNDdXN0b21DYWxsaW5nQ29udmVudGlvbigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0ZhclJldHVybigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzQ29kZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzQ29tcGlsZXJHZW5lcmF0ZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0NvbnN0VHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzRWRpdEFuZENvbnRpbnVlRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzRnVuY3Rpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBnZXRBZGRyZXNzVGFrZW4oKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBnZXROb1N0YWNrT3JkZXJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNBbGxvY2EoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNBc3NpZ25tZW50T3BlcmF0b3IoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNDVHlwZXMoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNDYXN0T3BlcmF0b3IoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNEZWJ1Z0luZm8oKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNFSCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0VIYSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0lubEFzbSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0lubGluZUF0dHJpYnV0ZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0ludGVycnVwdFJldHVybigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0ZyYW1lUG9pbnRlcigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0xvbmdKdW1wKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzTWFuYWdlZENvZGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNOZXN0ZWRUeXBlcygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc05vSW5saW5lQXR0cmlidXRlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzTm9SZXR1cm5BdHRyaWJ1dGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNPcHRpbWl6ZWRDb2RlRGVidWdJbmZvKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzT3ZlcmxvYWRlZE9wZXJhdG9yKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzU0VIKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzU2VjdXJpdHlDaGVja3MoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNTZXRKdW1wKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzU3RyaWN0R1NDaGVjaygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzQWNjZWxlcmF0b3JHcm91cFNoYXJlZExvY2FsKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNBY2NlbGVyYXRvclBvaW50ZXJUYWdMaXZlUmFuZ2UoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0FjY2VsZXJhdG9yU3R1YkZ1bmN0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNBZ2dyZWdhdGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNJbnRyb1ZpcnR1YWxGdW5jdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzQ1ZUQ0lMKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNDb25zdHJ1Y3RvclZpcnR1YWxCYXNlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNDeHhSZXR1cm5VZHQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0RhdGFBbGlnbmVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNITFNMRGF0YSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzSG90cGF0Y2hhYmxlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNJbmRpcmVjdFZpcnR1YWxCYXNlQ2xhc3MoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0ludGVyZmFjZVVkdCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzSW50cmluc2ljKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNMVENHKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNMb2NhdGlvbkNvbnRyb2xGbG93RGVwZW5kZW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNNU0lMTmV0bW9kdWxlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNNYXRyaXhSb3dNYWpvcigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzTWFuYWdlZENvZGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc01TSUxDb2RlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNNdWx0aXBsZUluaGVyaXRhbmNlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNOYWtlZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzTmVzdGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNPcHRpbWl6ZWRBd2F5KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNQYWNrZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1BvaW50ZXJCYXNlZE9uU3ltYm9sVmFsdWUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1BvaW50ZXJUb0RhdGFNZW1iZXIoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1BvaW50ZXJUb01lbWJlckZ1bmN0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNQdXJlVmlydHVhbCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUlZhbHVlUmVmZXJlbmNlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNSZWZVZHQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1JlZmVyZW5jZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUmVzdHJpY3RlZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1JldHVyblZhbHVlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTYWZlQnVmZmVycygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2NvcGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTZGwoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1NpbmdsZUluaGVyaXRhbmNlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTcGxpdHRlZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU3RhdGljKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzUHJpdmF0ZVN5bWJvbHMoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1VuYWxpZ25lZFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1VucmVhY2hlZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzVmFsdWVVZHQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1ZpcnR1YWwoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1ZpcnR1YWxCYXNlQ2xhc3MoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1ZpcnR1YWxJbmhlcml0YW5jZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzVm9sYXRpbGVUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgd2FzSW5saW5lZCgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXRVbnVzZWQoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgY29uc3QgRElBU2Vzc2lvbiAmU2Vzc2lvbjsKKyAgQ0NvbVB0cjxJRGlhU3ltYm9sPiBTeW1ib2w7Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBU2VjdGlvbkNvbnRyaWIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBU2VjdGlvbkNvbnRyaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmMyOGUzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFTZWN0aW9uQ29udHJpYi5oCkBAIC0wLDAgKzEsNTUgQEAKKy8vPT09LSBESUFTZWN0aW9uQ29udHJpYi5oIC0gRElBIEltcGwuIG9mIElQREJTZWN0aW9uQ29udHJpYiAtLS0tLS0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFTRUNUSU9OQ09OVFJJQl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBU0VDVElPTkNPTlRSSUJfSAorCisjaW5jbHVkZSAiRElBU3VwcG9ydC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCU2VjdGlvbkNvbnRyaWIuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBESUFTZXNzaW9uOworCitjbGFzcyBESUFTZWN0aW9uQ29udHJpYiA6IHB1YmxpYyBJUERCU2VjdGlvbkNvbnRyaWIgeworcHVibGljOgorICBleHBsaWNpdCBESUFTZWN0aW9uQ29udHJpYihjb25zdCBESUFTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDQ29tUHRyPElEaWFTZWN0aW9uQ29udHJpYj4gRGlhU2VjdGlvbik7CisKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbENvbXBpbGFuZD4gZ2V0Q29tcGlsYW5kKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldEFkZHJlc3NTZWN0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldEFkZHJlc3NPZmZzZXQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0UmVsYXRpdmVWaXJ0dWFsQWRkcmVzcygpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRWaXJ0dWFsQWRkcmVzcygpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRMZW5ndGgoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc05vdFBhZ2VkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzQ29kZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0NvZGUxNkJpdCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0luaXRpYWxpemVkRGF0YSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc1VuaW5pdGlhbGl6ZWREYXRhKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNSZW1vdmVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzQ29tZGF0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNEaXNjYXJkYWJsZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzTm90Q2FjaGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTaGFyZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0V4ZWN1dGFibGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1JlYWRhYmxlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNXcml0YWJsZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXREYXRhQ3JjMzIoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0UmVsb2NhdGlvbnNDcmMzMigpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRDb21waWxhbmRJZCgpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBjb25zdCBESUFTZXNzaW9uICZTZXNzaW9uOworICBDQ29tUHRyPElEaWFTZWN0aW9uQ29udHJpYj4gU2VjdGlvbjsKK307Cit9Cit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQVNFQ1RJT05DT05UUklCX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBU2Vzc2lvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFTZXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYzZDcyOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBU2Vzc2lvbi5oCkBAIC0wLDAgKzEsODggQEAKKy8vPT09LSBESUFTZXNzaW9uLmggLSBESUEgaW1wbGVtZW50YXRpb24gb2YgSVBEQlNlc3Npb24gLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFTRVNTSU9OX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFTRVNTSU9OX0gKKworI2luY2x1ZGUgIkRJQVN1cHBvcnQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvSVBEQlNlc3Npb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgU3RyaW5nUmVmOworCituYW1lc3BhY2UgcGRiIHsKK2NsYXNzIERJQVNlc3Npb24gOiBwdWJsaWMgSVBEQlNlc3Npb24geworcHVibGljOgorICBleHBsaWNpdCBESUFTZXNzaW9uKENDb21QdHI8SURpYVNlc3Npb24+IERpYVNlc3Npb24pOworCisgIHN0YXRpYyBFcnJvciBjcmVhdGVGcm9tUGRiKFN0cmluZ1JlZiBQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlNlc3Npb24+ICZTZXNzaW9uKTsKKyAgc3RhdGljIEVycm9yIGNyZWF0ZUZyb21FeGUoU3RyaW5nUmVmIFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCU2Vzc2lvbj4gJlNlc3Npb24pOworCisgIHVpbnQ2NF90IGdldExvYWRBZGRyZXNzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgc2V0TG9hZEFkZHJlc3ModWludDY0X3QgQWRkcmVzcykgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2xFeGU+IGdldEdsb2JhbFNjb3BlKCkgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2w+IGdldFN5bWJvbEJ5SWQodWludDMyX3QgU3ltYm9sSWQpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgYWRkcmVzc0ZvclZBKHVpbnQ2NF90IFZBLCB1aW50MzJfdCAmU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgYWRkcmVzc0ZvclJWQSh1aW50MzJfdCBSVkEsIHVpbnQzMl90ICZTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbD4KKyAgZmluZFN5bWJvbEJ5QWRkcmVzcyh1aW50NjRfdCBBZGRyZXNzLCBQREJfU3ltVHlwZSBUeXBlKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1MaW5lTnVtYmVycz4KKyAgZmluZExpbmVOdW1iZXJzKGNvbnN0IFBEQlN5bWJvbENvbXBpbGFuZCAmQ29tcGlsYW5kLAorICAgICAgICAgICAgICAgICAgY29uc3QgSVBEQlNvdXJjZUZpbGUgJkZpbGUpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1MaW5lTnVtYmVycz4KKyAgZmluZExpbmVOdW1iZXJzQnlBZGRyZXNzKHVpbnQ2NF90IEFkZHJlc3MsIHVpbnQzMl90IExlbmd0aCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUxpbmVOdW1iZXJzPgorICBmaW5kTGluZU51bWJlcnNCeVJWQSh1aW50MzJfdCBSVkEsIHVpbnQzMl90IExlbmd0aCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUxpbmVOdW1iZXJzPgorICBmaW5kTGluZU51bWJlcnNCeVNlY3RPZmZzZXQodWludDMyX3QgU2VjdGlvbiwgdWludDMyX3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTGVuZ3RoKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1Tb3VyY2VGaWxlcz4KKyAgZmluZFNvdXJjZUZpbGVzKGNvbnN0IFBEQlN5bWJvbENvbXBpbGFuZCAqQ29tcGlsYW5kLCBsbHZtOjpTdHJpbmdSZWYgUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgIFBEQl9OYW1lU2VhcmNoRmxhZ3MgRmxhZ3MpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlNvdXJjZUZpbGU+CisgIGZpbmRPbmVTb3VyY2VGaWxlKGNvbnN0IFBEQlN5bWJvbENvbXBpbGFuZCAqQ29tcGlsYW5kLAorICAgICAgICAgICAgICAgICAgICBsbHZtOjpTdHJpbmdSZWYgUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgUERCX05hbWVTZWFyY2hGbGFncyBGbGFncykgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUNoaWxkcmVuPFBEQlN5bWJvbENvbXBpbGFuZD4+CisgIGZpbmRDb21waWxhbmRzRm9yU291cmNlRmlsZShsbHZtOjpTdHJpbmdSZWYgUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBEQl9OYW1lU2VhcmNoRmxhZ3MgRmxhZ3MpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sQ29tcGlsYW5kPgorICBmaW5kT25lQ29tcGlsYW5kRm9yU291cmNlRmlsZShsbHZtOjpTdHJpbmdSZWYgUGF0dGVybiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERCX05hbWVTZWFyY2hGbGFncyBGbGFncykgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVNvdXJjZUZpbGVzPiBnZXRBbGxTb3VyY2VGaWxlcygpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1Tb3VyY2VGaWxlcz4gZ2V0U291cmNlRmlsZXNGb3JDb21waWxhbmQoCisgICAgICBjb25zdCBQREJTeW1ib2xDb21waWxhbmQgJkNvbXBpbGFuZCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCU291cmNlRmlsZT4KKyAgZ2V0U291cmNlRmlsZUJ5SWQodWludDMyX3QgRmlsZUlkKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1EYXRhU3RyZWFtcz4gZ2V0RGVidWdTdHJlYW1zKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtVGFibGVzPiBnZXRFbnVtVGFibGVzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtSW5qZWN0ZWRTb3VyY2VzPiBnZXRJbmplY3RlZFNvdXJjZXMoKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TZWN0aW9uQ29udHJpYnM+IGdldFNlY3Rpb25Db250cmlicygpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBDQ29tUHRyPElEaWFTZXNzaW9uPiBTZXNzaW9uOworfTsKK30gLy8gbmFtZXNwYWNlIHBkYgorfSAvLyBuYW1lc3BhY2UgbGx2bQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQVNvdXJjZUZpbGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBU291cmNlRmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwODhlYTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQVNvdXJjZUZpbGUuaApAQCAtMCwwICsxLDQxIEBACisvLz09PS0gRElBU291cmNlRmlsZS5oIC0gRElBIGltcGxlbWVudGF0aW9uIG9mIElQREJTb3VyY2VGaWxlIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBU09VUkNFRklMRV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBU09VUkNFRklMRV9ICisKKyNpbmNsdWRlICJESUFTdXBwb3J0LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL0lQREJTb3VyY2VGaWxlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworY2xhc3MgRElBU2Vzc2lvbjsKKworY2xhc3MgRElBU291cmNlRmlsZSA6IHB1YmxpYyBJUERCU291cmNlRmlsZSB7CitwdWJsaWM6CisgIGV4cGxpY2l0IERJQVNvdXJjZUZpbGUoY29uc3QgRElBU2Vzc2lvbiAmU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDQ29tUHRyPElEaWFTb3VyY2VGaWxlPiBEaWFTb3VyY2VGaWxlKTsKKworICBzdGQ6OnN0cmluZyBnZXRGaWxlTmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRVbmlxdWVJZCgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXRDaGVja3N1bSgpIGNvbnN0IG92ZXJyaWRlOworICBQREJfQ2hlY2tzdW0gZ2V0Q2hlY2tzdW1UeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUNoaWxkcmVuPFBEQlN5bWJvbENvbXBpbGFuZD4+CisgIGdldENvbXBpbGFuZHMoKSBjb25zdCBvdmVycmlkZTsKKworICBDQ29tUHRyPElEaWFTb3VyY2VGaWxlPiBnZXREaWFGaWxlKCkgY29uc3QgeyByZXR1cm4gU291cmNlRmlsZTsgfQorCitwcml2YXRlOgorICBjb25zdCBESUFTZXNzaW9uICZTZXNzaW9uOworICBDQ29tUHRyPElEaWFTb3VyY2VGaWxlPiBTb3VyY2VGaWxlOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQVN1cHBvcnQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9ESUEvRElBU3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiNGEzNDgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQVN1cHBvcnQuaApAQCAtMCwwICsxLDQ0IEBACisvLz09PS0gRElBU3VwcG9ydC5oIC0gQ29tbW9uIGhlYWRlciBpbmNsdWRlcyBmb3IgRElBIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ29tbW9uIGRlZmluZXMgYW5kIGhlYWRlciBpbmNsdWRlcyBmb3IgYWxsIExMVk1EZWJ1Z0luZm9QREJESUEuICBUaGUKKy8vIGRlZmluaXRpb25zIGhlcmUgY29uZmlndXJlIHRoZSBuZWNlc3NhcnkgI2RlZmluZXMgYW5kIGluY2x1ZGUgc3lzdGVtIGhlYWRlcnMKKy8vIGluIHRoZSBwcm9wZXIgb3JkZXIgZm9yIHVzaW5nIERJQS4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFTVVBQT1JUX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFTVVBQT1JUX0gKKworLy8gUmVxdWlyZSBhdCBsZWFzdCBWaXN0YQorI2RlZmluZSBOVERESV9WRVJTSU9OIE5URERJX1ZJU1RBCisjZGVmaW5lIF9XSU4zMl9XSU5OVCBfV0lOMzJfV0lOTlRfVklTVEEKKyNkZWZpbmUgV0lOVkVSIF9XSU4zMl9XSU5OVF9WSVNUQQorI2lmbmRlZiBOT01JTk1BWAorI2RlZmluZSBOT01JTk1BWAorI2VuZGlmCisKKy8vIGxsdm0vU3VwcG9ydC9EZWJ1Zy5oIHVuY29uZGl0aW9uYWxseSAjZGVmaW5lcyBERUJVRyBhcyBhIG1hY3JvLgorLy8gRElBIGhlYWRlcnMgI2RlZmluZSBpdCBpZiBpdCBpcyBub3QgYWxyZWFkeSBkZWZpbmVkLCBzbyB3ZSBoYXZlCisvLyBhbiBvcmRlciBvZiBpbmNsdWRlcyBwcm9ibGVtLiAgVGhlIHJlYWwgZml4IGlzIHRvIG1ha2UgTExWTSB1c2UKKy8vIHNvbWV0aGluZyBsZXNzIGdlbmVyaWMgdGhhbiBERUJVRywgc3VjaCBhcyBMTFZNX0RFQlVHKCksIGJ1dCBpdCdzCisvLyBmYWlybHkgcHJldmFsZW50LiAgU28gZm9yIG5vdywgd2Ugc2F2ZSB0aGUgZGVmaW5pdGlvbiBzdGF0ZSBhbmQKKy8vIHJlc3RvcmUgaXQuCisjcHJhZ21hIHB1c2hfbWFjcm8oIkRFQlVHIikKKworLy8gYXRsYmFzZS5oIGhhcyB0byBjb21lIGJlZm9yZSB3aW5kb3dzLmgKKyNpbmNsdWRlIDxhdGxiYXNlLmg+CisjaW5jbHVkZSA8d2luZG93cy5oPgorCisvLyBESUEgaGVhZGVycyBtdXN0IGNvbWUgYWZ0ZXIgd2luZG93cyBoZWFkZXJzLgorI2luY2x1ZGUgPGN2Y29uc3QuaD4KKyNpbmNsdWRlIDxkaWEyLmg+CisjaW5jbHVkZSA8ZGlhY3JlYXRlLmg+CisKKyNwcmFnbWEgcG9wX21hY3JvKCJERUJVRyIpCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQVNVUFBPUlRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFUYWJsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlOTNmYTAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQVRhYmxlLmgKQEAgLTAsMCArMSwzMiBAQAorLy89PT0tIERJQVRhYmxlLmggLSBESUEgaW1wbGVtZW50YXRpb24gb2YgSVBEQlRhYmxlIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQVRBQkxFX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFUQUJMRV9ICisKKyNpbmNsdWRlICJESUFTdXBwb3J0LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL0lQREJUYWJsZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKK2NsYXNzIERJQVRhYmxlIDogcHVibGljIElQREJUYWJsZSB7CitwdWJsaWM6CisgIGV4cGxpY2l0IERJQVRhYmxlKENDb21QdHI8SURpYVRhYmxlPiBEaWFUYWJsZSk7CisKKyAgdWludDMyX3QgZ2V0SXRlbUNvdW50KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldE5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgUERCX1RhYmxlVHlwZSBnZXRUYWJsZVR5cGUoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgQ0NvbVB0cjxJRGlhVGFibGU+IFRhYmxlOworfTsKK30KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9ESUFfRElBVEFCTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFVdGlscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0RJQS9ESUFVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhODQzZTAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvRElBL0RJQVV0aWxzLmgKQEAgLTAsMCArMSwzMSBAQAorLy89PT0tIERJQVV0aWxzLmggLSBVdGlsaXR5IGZ1bmN0aW9ucyBmb3Igd29ya2luZyB3aXRoIERJQSAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQVVUSUxTX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0RJQV9ESUFVVElMU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db252ZXJ0VVRGLmgiCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBPYmo+CitzdGQ6OnN0cmluZyBpbnZva2VCc3RyTWV0aG9kKE9iaiAmT2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIUkVTVUxUIChfX3N0ZGNhbGwgT2JqOjoqRnVuYykoQlNUUiAqKSkgeworICBDQ29tQlNUUiBTdHIxNjsKKyAgSFJFU1VMVCBSZXN1bHQgPSAoT2JqZWN0LipGdW5jKSgmU3RyMTYpOworICBpZiAoU19PSyAhPSBSZXN1bHQpCisgICAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7CisKKyAgc3RkOjpzdHJpbmcgU3RyODsKKyAgbGx2bTo6QXJyYXlSZWY8Y2hhcj4gU3RyQnl0ZXMocmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KFN0cjE2Lm1fc3RyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyMTYuQnl0ZUxlbmd0aCgpKTsKKyAgbGx2bTo6Y29udmVydFVURjE2VG9VVEY4U3RyaW5nKFN0ckJ5dGVzLCBTdHI4KTsKKyAgcmV0dXJuIFN0cjg7Cit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfRElBX0RJQVVUSUxTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9HZW5lcmljRXJyb3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9HZW5lcmljRXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzIwNWE5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0dlbmVyaWNFcnJvci5oCkBAIC0wLDAgKzEsNDQgQEAKKy8vPT09LSBFcnJvci5oIC0gc3lzdGVtX2Vycm9yIGV4dGVuc2lvbnMgZm9yIFBEQiAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX0VSUk9SX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0VSUk9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKKworZW51bSBjbGFzcyBnZW5lcmljX2Vycm9yX2NvZGUgeworICBpbnZhbGlkX3BhdGggPSAxLAorICBkaWFfc2RrX25vdF9wcmVzZW50LAorICB0eXBlX3NlcnZlcl9ub3RfZm91bmQsCisgIHVuc3BlY2lmaWVkLAorfTsKKworLy8vIEJhc2UgY2xhc3MgZm9yIGVycm9ycyBvcmlnaW5hdGluZyB3aGVuIHBhcnNpbmcgcmF3IFBEQiBmaWxlcworY2xhc3MgR2VuZXJpY0Vycm9yIDogcHVibGljIEVycm9ySW5mbzxHZW5lcmljRXJyb3I+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisgIEdlbmVyaWNFcnJvcihnZW5lcmljX2Vycm9yX2NvZGUgQyk7CisgIEdlbmVyaWNFcnJvcihTdHJpbmdSZWYgQ29udGV4dCk7CisgIEdlbmVyaWNFcnJvcihnZW5lcmljX2Vycm9yX2NvZGUgQywgU3RyaW5nUmVmIENvbnRleHQpOworCisgIHZvaWQgbG9nKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGU7CisgIFN0cmluZ1JlZiBnZXRFcnJvck1lc3NhZ2UoKSBjb25zdDsKKyAgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBFcnJNc2c7CisgIGdlbmVyaWNfZXJyb3JfY29kZSBDb2RlOworfTsKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0lQREJEYXRhU3RyZWFtLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQkRhdGFTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42N2I1YTA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0lQREJEYXRhU3RyZWFtLmgKQEAgLTAsMCArMSw0MSBAQAorLy89PT0tIElQREJEYXRhU3RyZWFtLmggLSBiYXNlIGludGVyZmFjZSBmb3IgY2hpbGQgZW51bWVyYXRvciAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfSVBEQkRBVEFTVFJFQU1fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfSVBEQkRBVEFTVFJFQU1fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKKworLy8vIElQREJEYXRhU3RyZWFtIGRlZmluZXMgYW4gaW50ZXJmYWNlIHVzZWQgdG8gcmVwcmVzZW50IGEgc3RyZWFtIGNvbnNpc3RpbmcKKy8vLyBvZiBhIG5hbWUgYW5kIGEgc2VyaWVzIG9mIHJlY29yZHMgd2hvc2UgZm9ybWF0cyBkZXBlbmQgb24gdGhlIHBhcnRpY3VsYXIKKy8vLyBzdHJlYW0gdHlwZS4KK2NsYXNzIElQREJEYXRhU3RyZWFtIHsKK3B1YmxpYzoKKyAgdXNpbmcgUmVjb3JkVHlwZSA9IFNtYWxsVmVjdG9yPHVpbnQ4X3QsIDMyPjsKKworICB2aXJ0dWFsIH5JUERCRGF0YVN0cmVhbSgpOworCisgIHZpcnR1YWwgdWludDMyX3QgZ2V0UmVjb3JkQ291bnQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0TmFtZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBPcHRpb25hbDxSZWNvcmRUeXBlPiBnZXRJdGVtQXRJbmRleCh1aW50MzJfdCBJbmRleCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgZ2V0TmV4dChSZWNvcmRUeXBlICZSZWNvcmQpID0gMDsKKyAgdmlydHVhbCB2b2lkIHJlc2V0KCkgPSAwOworICB2aXJ0dWFsIElQREJEYXRhU3RyZWFtICpjbG9uZSgpIGNvbnN0ID0gMDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBwZGIKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfSVBEQkRBVEFTVFJFQU1fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0lQREJFbnVtQ2hpbGRyZW4uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9JUERCRW51bUNoaWxkcmVuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjZiN2Q5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9JUERCRW51bUNoaWxkcmVuLmgKQEAgLTAsMCArMSwzNiBAQAorLy89PT0tIElQREJFbnVtQ2hpbGRyZW4uaCAtIGJhc2UgaW50ZXJmYWNlIGZvciBjaGlsZCBlbnVtZXJhdG9yIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfSVBEQkVOVU1DSElMRFJFTl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9JUERCRU5VTUNISUxEUkVOX0gKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENoaWxkVHlwZT4gY2xhc3MgSVBEQkVudW1DaGlsZHJlbiB7CitwdWJsaWM6CisgIHVzaW5nIENoaWxkVHlwZVB0ciA9IHN0ZDo6dW5pcXVlX3B0cjxDaGlsZFR5cGU+OworICB1c2luZyBNeVR5cGUgPSBJUERCRW51bUNoaWxkcmVuPENoaWxkVHlwZT47CisKKyAgdmlydHVhbCB+SVBEQkVudW1DaGlsZHJlbigpID0gZGVmYXVsdDsKKworICB2aXJ0dWFsIHVpbnQzMl90IGdldENoaWxkQ291bnQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgQ2hpbGRUeXBlUHRyIGdldENoaWxkQXRJbmRleCh1aW50MzJfdCBJbmRleCkgY29uc3QgPSAwOworICB2aXJ0dWFsIENoaWxkVHlwZVB0ciBnZXROZXh0KCkgPSAwOworICB2aXJ0dWFsIHZvaWQgcmVzZXQoKSA9IDA7CisgIHZpcnR1YWwgTXlUeXBlICpjbG9uZSgpIGNvbnN0ID0gMDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBwZGIKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfSVBEQkVOVU1DSElMRFJFTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQkluamVjdGVkU291cmNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQkluamVjdGVkU291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc1ZDY0YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9JUERCSW5qZWN0ZWRTb3VyY2UuaApAQCAtMCwwICsxLDQyIEBACisvLz09PS0gSVBEQkluamVjdGVkU291cmNlLmggLSBiYXNlIGNsYXNzIGZvciBQREIgaW5qZWN0ZWQgZmlsZSAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9JUERCSU5KRUNURURTT1VSQ0VfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfSVBEQklOSkVDVEVEU09VUkNFX0gKKworI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBwZGIgeworCisvLy8gSVBEQkluamVjdGVkU291cmNlIGRlZmluZXMgYW4gaW50ZXJmYWNlIHVzZWQgdG8gcmVwcmVzZW50IHNvdXJjZSBmaWxlcworLy8vIHdoaWNoIHdlcmUgaW5qZWN0ZWQgZGlyZWN0bHkgaW50byB0aGUgUERCIGZpbGUgZHVyaW5nIHRoZSBjb21waWxhdGlvbgorLy8vIHByb2Nlc3MuICBUaGlzIGlzIHVzZWQsIGZvciBleGFtcGxlLCB0byBhZGQgbmF0dmlzIGZpbGVzIHRvIGEgUERCLCBidXQKKy8vLyBpbiB0aGVvcnkgY291bGQgYmUgdXNlZCB0byBhZGQgYXJiaXRyYXJ5IHNvdXJjZSBjb2RlLgorY2xhc3MgSVBEQkluamVjdGVkU291cmNlIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+SVBEQkluamVjdGVkU291cmNlKCk7CisKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRDcmMzMigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50NjRfdCBnZXRDb2RlQnl0ZVNpemUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RmlsZU5hbWUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0T2JqZWN0RmlsZU5hbWUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0VmlydHVhbEZpbGVOYW1lKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIFBEQl9Tb3VyY2VDb21wcmVzc2lvbiBnZXRDb21wcmVzc2lvbigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRDb2RlKCkgY29uc3QgPSAwOworfTsKK30gLy8gbmFtZXNwYWNlIHBkYgorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX0lQREJJTkpFQ1RFRFNPVVJDRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQkxpbmVOdW1iZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9JUERCTGluZU51bWJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyMDA4MGYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQkxpbmVOdW1iZXIuaApAQCAtMCwwICsxLDM3IEBACisvLz09PS0gSVBEQkxpbmVOdW1iZXIuaCAtIGJhc2UgaW50ZXJmYWNlIGZvciBQREIgbGluZSBuby4gaW5mbyAtLS0qLSBDKystKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9JUERCTElORU5VTUJFUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9JUERCTElORU5VTUJFUl9ICisKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKK2NsYXNzIElQREJMaW5lTnVtYmVyIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+SVBEQkxpbmVOdW1iZXIoKTsKKworICB2aXJ0dWFsIHVpbnQzMl90IGdldExpbmVOdW1iZXIoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0TGluZU51bWJlckVuZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRDb2x1bW5OdW1iZXIoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0Q29sdW1uTnVtYmVyRW5kKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldEFkZHJlc3NTZWN0aW9uKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldEFkZHJlc3NPZmZzZXQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0UmVsYXRpdmVWaXJ0dWFsQWRkcmVzcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50NjRfdCBnZXRWaXJ0dWFsQWRkcmVzcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRMZW5ndGgoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0U291cmNlRmlsZUlkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldENvbXBpbGFuZElkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNTdGF0ZW1lbnQoKSBjb25zdCA9IDA7Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9JUERCUmF3U3ltYm9sLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQlJhd1N5bWJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjYjJlYWEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQlJhd1N5bWJvbC5oCkBAIC0wLDAgKzEsMjQzIEBACisvLz09PS0gSVBEQlJhd1N5bWJvbC5oIC0gYmFzZSBpbnRlcmZhY2UgZm9yIFBEQiBzeW1ib2wgdHlwZXMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9JUERCUkFXU1lNQk9MX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0lQREJSQVdTWU1CT0xfSAorCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyByYXdfb3N0cmVhbTsKKworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbFR5cGVWVGFibGU7CitjbGFzcyBQREJTeW1ib2xUeXBlVlRhYmxlU2hhcGU7CisKKy8vLyBJUERCUmF3U3ltYm9sIGRlZmluZXMgYW4gaW50ZXJmYWNlIHVzZWQgdG8gcmVwcmVzZW50IGFuIGFyYml0cmFyeSBzeW1ib2wuCisvLy8gSXQgZXhwb3NlcyBhIG1vbm9saXRoaWMgaW50ZXJmYWNlIGNvbnNpc3Rpbmcgb2YgYWNjZXNzb3JzIGZvciB0aGUgdW5pb24gb2YKKy8vLyBhbGwgcHJvcGVydGllcyB0aGF0IGFyZSB2YWxpZCBmb3IgYW55IHN5bWJvbCB0eXBlLiAgVGhpcyBpbnRlcmZhY2UgaXMgdGhlbgorLy8vIHdyYXBwZWQgYnkgYSBjb25jcmV0ZSBjbGFzcyB3aGljaCBleHBvc2VzIG9ubHkgdGhvc2Ugc2V0IG9mIG1ldGhvZHMgdmFsaWQKKy8vLyBmb3IgdGhpcyBwYXJ0aWN1bGFyIHN5bWJvbCB0eXBlLiAgU2VlIFBEQlN5bWJvbC5oIGZvciBtb3JlIGRldGFpbHMuCitjbGFzcyBJUERCUmF3U3ltYm9sIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+SVBEQlJhd1N5bWJvbCgpOworCisgIHZpcnR1YWwgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUywgaW50IEluZGVudCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4KKyAgZmluZENoaWxkcmVuKFBEQl9TeW1UeXBlIFR5cGUpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+CisgIGZpbmRDaGlsZHJlbihQREJfU3ltVHlwZSBUeXBlLCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgIFBEQl9OYW1lU2VhcmNoRmxhZ3MgRmxhZ3MpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPgorICBmaW5kQ2hpbGRyZW5CeUFkZHIoUERCX1N5bVR5cGUgVHlwZSwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICBQREJfTmFtZVNlYXJjaEZsYWdzIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2VjdGlvbiwgdWludDMyX3QgT2Zmc2V0KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4KKyAgZmluZENoaWxkcmVuQnlWQShQREJfU3ltVHlwZSBUeXBlLCBTdHJpbmdSZWYgTmFtZSwgUERCX05hbWVTZWFyY2hGbGFncyBGbGFncywKKyAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBWQSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+CisgIGZpbmRDaGlsZHJlbkJ5UlZBKFBEQl9TeW1UeXBlIFR5cGUsIFN0cmluZ1JlZiBOYW1lLCBQREJfTmFtZVNlYXJjaEZsYWdzIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSVkEpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+CisgIGZpbmRJbmxpbmVGcmFtZXNCeUFkZHIodWludDMyX3QgU2VjdGlvbiwgdWludDMyX3QgT2Zmc2V0KSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4KKyAgZmluZElubGluZUZyYW1lc0J5UlZBKHVpbnQzMl90IFJWQSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+CisgIGZpbmRJbmxpbmVGcmFtZXNCeVZBKHVpbnQ2NF90IFZBKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1MaW5lTnVtYmVycz4gZmluZElubGluZWVMaW5lcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1MaW5lTnVtYmVycz4KKyAgZmluZElubGluZWVMaW5lc0J5QWRkcih1aW50MzJfdCBTZWN0aW9uLCB1aW50MzJfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTGVuZ3RoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtTGluZU51bWJlcnM+CisgIGZpbmRJbmxpbmVlTGluZXNCeVJWQSh1aW50MzJfdCBSVkEsIHVpbnQzMl90IExlbmd0aCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUxpbmVOdW1iZXJzPgorICBmaW5kSW5saW5lZUxpbmVzQnlWQSh1aW50NjRfdCBWQSwgdWludDMyX3QgTGVuZ3RoKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCB2b2lkIGdldERhdGFCeXRlcyhsbHZtOjpTbWFsbFZlY3Rvcjx1aW50OF90LCAzMj4gJmJ5dGVzKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBnZXRCYWNrRW5kVmVyc2lvbihWZXJzaW9uSW5mbyAmVmVyc2lvbikgY29uc3QgPSAwOworICB2aXJ0dWFsIFBEQl9NZW1iZXJBY2Nlc3MgZ2V0QWNjZXNzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldEFkZHJlc3NPZmZzZXQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0QWRkcmVzc1NlY3Rpb24oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0QWdlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldEFycmF5SW5kZXhUeXBlSWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0QmFzZURhdGFPZmZzZXQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0QmFzZURhdGFTbG90KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldEJhc2VTeW1ib2xJZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBQREJfQnVpbHRpblR5cGUgZ2V0QnVpbHRpblR5cGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0Qml0UG9zaXRpb24oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgUERCX0NhbGxpbmdDb252IGdldENhbGxpbmdDb252ZW50aW9uKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldENsYXNzUGFyZW50SWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0Q29tcGlsZXJOYW1lKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldENvdW50KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldENvdW50TGl2ZVJhbmdlcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIGdldEZyb250RW5kVmVyc2lvbihWZXJzaW9uSW5mbyAmVmVyc2lvbikgY29uc3QgPSAwOworICB2aXJ0dWFsIFBEQl9MYW5nIGdldExhbmd1YWdlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldExleGljYWxQYXJlbnRJZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRMaWJyYXJ5TmFtZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRMaXZlUmFuZ2VTdGFydEFkZHJlc3NPZmZzZXQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0TGl2ZVJhbmdlU3RhcnRBZGRyZXNzU2VjdGlvbigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRMaXZlUmFuZ2VTdGFydFJlbGF0aXZlVmlydHVhbEFkZHJlc3MoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgY29kZXZpZXc6OlJlZ2lzdGVySWQgZ2V0TG9jYWxCYXNlUG9pbnRlclJlZ2lzdGVySWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0TG93ZXJCb3VuZElkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldE1lbW9yeVNwYWNlS2luZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXROYW1lKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldE51bWJlck9mQWNjZWxlcmF0b3JQb2ludGVyVGFncygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXROdW1iZXJPZkNvbHVtbnMoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0TnVtYmVyT2ZNb2RpZmllcnMoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0TnVtYmVyT2ZSZWdpc3RlckluZGljZXMoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0TnVtYmVyT2ZSb3dzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldE9iamVjdEZpbGVOYW1lKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldE9lbUlkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldE9lbVN5bWJvbElkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldE9mZnNldEluVWR0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIFBEQl9DcHUgZ2V0UGxhdGZvcm0oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0UmFuaygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBjb2Rldmlldzo6UmVnaXN0ZXJJZCBnZXRSZWdpc3RlcklkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFJlZ2lzdGVyVHlwZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRSZWxhdGl2ZVZpcnR1YWxBZGRyZXNzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFNhbXBsZXJTbG90KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFNpZ25hdHVyZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRTaXplSW5VZHQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0U2xvdCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRTb3VyY2VGaWxlTmFtZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkxpbmVOdW1iZXI+CisgIGdldFNyY0xpbmVPblR5cGVEZWZuKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFN0cmlkZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRTdWJUeXBlSWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0U3ltYm9sc0ZpbGVOYW1lKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFN5bUluZGV4SWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0VGFyZ2V0T2Zmc2V0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFRhcmdldFJlbGF0aXZlVmlydHVhbEFkZHJlc3MoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDY0X3QgZ2V0VGFyZ2V0VmlydHVhbEFkZHJlc3MoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0VGFyZ2V0U2VjdGlvbigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRUZXh0dXJlU2xvdCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRUaW1lU3RhbXAoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0VG9rZW4oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0VHlwZUlkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFVhdlNsb3QoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0VW5kZWNvcmF0ZWROYW1lKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldFVuZGVjb3JhdGVkTmFtZUV4KFBEQl9VbmRuYW1lRmxhZ3MgRmxhZ3MpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRVbm1vZGlmaWVkVHlwZUlkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFVwcGVyQm91bmRJZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBWYXJpYW50IGdldFZhbHVlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFZpcnR1YWxCYXNlRGlzcEluZGV4KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldFZpcnR1YWxCYXNlT2Zmc2V0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2xUeXBlQnVpbHRpbj4KKyAgZ2V0VmlydHVhbEJhc2VUYWJsZVR5cGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0VmlydHVhbFRhYmxlU2hhcGVJZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBQREJfRGF0YUtpbmQgZ2V0RGF0YUtpbmQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgUERCX1N5bVR5cGUgZ2V0U3ltVGFnKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGNvZGV2aWV3OjpHVUlEIGdldEd1aWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBnZXRPZmZzZXQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgaW50MzJfdCBnZXRUaGlzQWRqdXN0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGludDMyX3QgZ2V0VmlydHVhbEJhc2VQb2ludGVyT2Zmc2V0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIFBEQl9Mb2NUeXBlIGdldExvY2F0aW9uVHlwZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBQREJfTWFjaGluZSBnZXRNYWNoaW5lVHlwZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBjb2Rldmlldzo6VGh1bmtPcmRpbmFsIGdldFRodW5rT3JkaW5hbCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50NjRfdCBnZXRMZW5ndGgoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDY0X3QgZ2V0TGl2ZVJhbmdlTGVuZ3RoKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQ2NF90IGdldFZpcnR1YWxBZGRyZXNzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIFBEQl9VZHRUeXBlIGdldFVkdEtpbmQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNDb25zdHJ1Y3RvcigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc0N1c3RvbUNhbGxpbmdDb252ZW50aW9uKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaGFzRmFyUmV0dXJuKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNDb2RlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNDb21waWxlckdlbmVyYXRlZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzQ29uc3RUeXBlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNFZGl0QW5kQ29udGludWVFbmFibGVkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNGdW5jdGlvbigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGdldEFkZHJlc3NUYWtlbigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGdldE5vU3RhY2tPcmRlcmluZygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc0FsbG9jYSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc0Fzc2lnbm1lbnRPcGVyYXRvcigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc0NUeXBlcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc0Nhc3RPcGVyYXRvcigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc0RlYnVnSW5mbygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc0VIKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaGFzRUhhKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaGFzRnJhbWVQb2ludGVyKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaGFzSW5sQXNtKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaGFzSW5saW5lQXR0cmlidXRlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaGFzSW50ZXJydXB0UmV0dXJuKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaGFzTG9uZ0p1bXAoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNNYW5hZ2VkQ29kZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc05lc3RlZFR5cGVzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaGFzTm9JbmxpbmVBdHRyaWJ1dGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNOb1JldHVybkF0dHJpYnV0ZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc09wdGltaXplZENvZGVEZWJ1Z0luZm8oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNPdmVybG9hZGVkT3BlcmF0b3IoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNTRUgoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNTZWN1cml0eUNoZWNrcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc1NldEp1bXAoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNTdHJpY3RHU0NoZWNrKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNBY2NlbGVyYXRvckdyb3VwU2hhcmVkTG9jYWwoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0FjY2VsZXJhdG9yUG9pbnRlclRhZ0xpdmVSYW5nZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzQWNjZWxlcmF0b3JTdHViRnVuY3Rpb24oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0FnZ3JlZ2F0ZWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0ludHJvVmlydHVhbEZ1bmN0aW9uKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNDVlRDSUwoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0NvbnN0cnVjdG9yVmlydHVhbEJhc2UoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0N4eFJldHVyblVkdCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzRGF0YUFsaWduZWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0hMU0xEYXRhKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNIb3RwYXRjaGFibGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0luZGlyZWN0VmlydHVhbEJhc2VDbGFzcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzSW50ZXJmYWNlVWR0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNJbnRyaW5zaWMoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0xUQ0coKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0xvY2F0aW9uQ29udHJvbEZsb3dEZXBlbmRlbnQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc01TSUxOZXRtb2R1bGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc01hdHJpeFJvd01ham9yKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNNYW5hZ2VkQ29kZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzTVNJTENvZGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc011bHRpcGxlSW5oZXJpdGFuY2UoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc05ha2VkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNOZXN0ZWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc09wdGltaXplZEF3YXkoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1BhY2tlZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzUG9pbnRlckJhc2VkT25TeW1ib2xWYWx1ZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzUG9pbnRlclRvRGF0YU1lbWJlcigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzUG9pbnRlclRvTWVtYmVyRnVuY3Rpb24oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1B1cmVWaXJ0dWFsKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNSVmFsdWVSZWZlcmVuY2UoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1JlZlVkdCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzUmVmZXJlbmNlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNSZXN0cmljdGVkVHlwZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzUmV0dXJuVmFsdWUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1NhZmVCdWZmZXJzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNTY29wZWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1NkbCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzU2luZ2xlSW5oZXJpdGFuY2UoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1NwbGl0dGVkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNTdGF0aWMoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBoYXNQcml2YXRlU3ltYm9scygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzVW5hbGlnbmVkVHlwZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzVW5yZWFjaGVkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNWYWx1ZVVkdCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzVmlydHVhbCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzVmlydHVhbEJhc2VDbGFzcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzVmlydHVhbEluaGVyaXRhbmNlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNWb2xhdGlsZVR5cGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCB3YXNJbmxpbmVkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldFVudXNlZCgpIGNvbnN0ID0gMDsKK307CisKK30gLy8gbmFtZXNwYWNlIHBkYgorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9JUERCU2VjdGlvbkNvbnRyaWIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9JUERCU2VjdGlvbkNvbnRyaWIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZmRhNjI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0lQREJTZWN0aW9uQ29udHJpYi5oCkBAIC0wLDAgKzEsNTAgQEAKKy8vPT0tIElQREJTZWN0aW9uQ29udHJpYi5oIC0gSW50ZXJmYWNlcyBmb3IgUERCIFNlY3Rpb25Db250cmlicyAtLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX0lQREJTRUNUSU9OQ09OVFJJQl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9JUERCU0VDVElPTkNPTlRSSUJfSAorCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CisKKy8vLyBJUERCU2VjdGlvbkNvbnRyaWIgZGVmaW5lcyBhbiBpbnRlcmZhY2UgdXNlZCB0byByZXByZXNlbnQgc2VjdGlvbgorLy8vIGNvbnRyaWJ1dGlvbnMgd2hvc2UgaW5mb3JtYXRpb24gYXJlIHN0b3JlZCBpbiB0aGUgUERCLgorY2xhc3MgSVBEQlNlY3Rpb25Db250cmliIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+SVBEQlNlY3Rpb25Db250cmliKCk7CisKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sQ29tcGlsYW5kPiBnZXRDb21waWxhbmQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0QWRkcmVzc1NlY3Rpb24oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0QWRkcmVzc09mZnNldCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRSZWxhdGl2ZVZpcnR1YWxBZGRyZXNzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQ2NF90IGdldFZpcnR1YWxBZGRyZXNzKCkgY29uc3QgID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRMZW5ndGgoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc05vdFBhZ2VkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaGFzQ29kZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc0NvZGUxNkJpdCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc0luaXRpYWxpemVkRGF0YSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGhhc1VuaW5pdGlhbGl6ZWREYXRhKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNSZW1vdmVkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaGFzQ29tZGF0KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNEaXNjYXJkYWJsZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzTm90Q2FjaGVkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNTaGFyZWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc0V4ZWN1dGFibGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1JlYWRhYmxlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNXcml0YWJsZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXREYXRhQ3JjMzIoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0UmVsb2NhdGlvbnNDcmMzMigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRDb21waWxhbmRJZCgpIGNvbnN0ID0gMDsKK307Cit9Cit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfSVBEQlNFQ1RJT05DT05UUklCX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9JUERCU2Vzc2lvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0lQREJTZXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjk1ZDYyYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9JUERCU2Vzc2lvbi5oCkBAIC0wLDAgKzEsOTIgQEAKKy8vPT09LSBJUERCU2Vzc2lvbi5oIC0gYmFzZSBpbnRlcmZhY2UgZm9yIGEgUERCIHN5bWJvbCBjb250ZXh0IC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX0lQREJTRVNTSU9OX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0lQREJTRVNTSU9OX0gKKworI2luY2x1ZGUgIlBEQlN5bWJvbC5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworY2xhc3MgUERCU3ltYm9sQ29tcGlsYW5kOworY2xhc3MgUERCU3ltYm9sRXhlOworCisvLy8gSVBEQlNlc3Npb24gZGVmaW5lcyBhbiBpbnRlcmZhY2UgdXNlZCB0byBwcm92aWRlIGEgY29udGV4dCBmb3IgcXVlcnlpbmcKKy8vLyBkZWJ1ZyBpbmZvcm1hdGlvbiBmcm9tIGEgZGVidWcgZGF0YSBzb3VyY2UgKGZvciBleGFtcGxlLCBhIFBEQikuCitjbGFzcyBJUERCU2Vzc2lvbiB7CitwdWJsaWM6CisgIHZpcnR1YWwgfklQREJTZXNzaW9uKCk7CisKKyAgdmlydHVhbCB1aW50NjRfdCBnZXRMb2FkQWRkcmVzcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIHNldExvYWRBZGRyZXNzKHVpbnQ2NF90IEFkZHJlc3MpID0gMDsKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sRXhlPiBnZXRHbG9iYWxTY29wZSgpID0gMDsKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sPiBnZXRTeW1ib2xCeUlkKHVpbnQzMl90IFN5bWJvbElkKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBib29sIGFkZHJlc3NGb3JWQSh1aW50NjRfdCBWQSwgdWludDMyX3QgJlNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgYWRkcmVzc0ZvclJWQSh1aW50MzJfdCBSVkEsIHVpbnQzMl90ICZTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmT2Zmc2V0KSBjb25zdCA9IDA7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0ZDo6dW5pcXVlX3B0cjxUPiBnZXRDb25jcmV0ZVN5bWJvbEJ5SWQodWludDMyX3QgU3ltYm9sSWQpIGNvbnN0IHsKKyAgICByZXR1cm4gdW5pcXVlX2R5bl9jYXN0X29yX251bGw8VD4oZ2V0U3ltYm9sQnlJZChTeW1ib2xJZCkpOworICB9CisKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sPgorICBmaW5kU3ltYm9sQnlBZGRyZXNzKHVpbnQ2NF90IEFkZHJlc3MsIFBEQl9TeW1UeXBlIFR5cGUpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUxpbmVOdW1iZXJzPgorICBmaW5kTGluZU51bWJlcnMoY29uc3QgUERCU3ltYm9sQ29tcGlsYW5kICZDb21waWxhbmQsCisgICAgICAgICAgICAgICAgICBjb25zdCBJUERCU291cmNlRmlsZSAmRmlsZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUxpbmVOdW1iZXJzPgorICBmaW5kTGluZU51bWJlcnNCeUFkZHJlc3ModWludDY0X3QgQWRkcmVzcywgdWludDMyX3QgTGVuZ3RoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtTGluZU51bWJlcnM+CisgIGZpbmRMaW5lTnVtYmVyc0J5UlZBKHVpbnQzMl90IFJWQSwgdWludDMyX3QgTGVuZ3RoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtTGluZU51bWJlcnM+CisgIGZpbmRMaW5lTnVtYmVyc0J5U2VjdE9mZnNldCh1aW50MzJfdCBTZWN0aW9uLCB1aW50MzJfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBMZW5ndGgpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVNvdXJjZUZpbGVzPgorICBmaW5kU291cmNlRmlsZXMoY29uc3QgUERCU3ltYm9sQ29tcGlsYW5kICpDb21waWxhbmQsIGxsdm06OlN0cmluZ1JlZiBQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgUERCX05hbWVTZWFyY2hGbGFncyBGbGFncykgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJUERCU291cmNlRmlsZT4KKyAgZmluZE9uZVNvdXJjZUZpbGUoY29uc3QgUERCU3ltYm9sQ29tcGlsYW5kICpDb21waWxhbmQsCisgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICBQREJfTmFtZVNlYXJjaEZsYWdzIEZsYWdzKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtQ2hpbGRyZW48UERCU3ltYm9sQ29tcGlsYW5kPj4KKyAgZmluZENvbXBpbGFuZHNGb3JTb3VyY2VGaWxlKGxsdm06OlN0cmluZ1JlZiBQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERCX05hbWVTZWFyY2hGbGFncyBGbGFncykgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2xDb21waWxhbmQ+CisgIGZpbmRPbmVDb21waWxhbmRGb3JTb3VyY2VGaWxlKGxsdm06OlN0cmluZ1JlZiBQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREJfTmFtZVNlYXJjaEZsYWdzIEZsYWdzKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1Tb3VyY2VGaWxlcz4gZ2V0QWxsU291cmNlRmlsZXMoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU291cmNlRmlsZXM+CisgIGdldFNvdXJjZUZpbGVzRm9yQ29tcGlsYW5kKGNvbnN0IFBEQlN5bWJvbENvbXBpbGFuZCAmQ29tcGlsYW5kKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPElQREJTb3VyY2VGaWxlPgorICBnZXRTb3VyY2VGaWxlQnlJZCh1aW50MzJfdCBGaWxlSWQpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bURhdGFTdHJlYW1zPiBnZXREZWJ1Z1N0cmVhbXMoKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1UYWJsZXM+IGdldEVudW1UYWJsZXMoKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1JbmplY3RlZFNvdXJjZXM+CisgIGdldEluamVjdGVkU291cmNlcygpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVNlY3Rpb25Db250cmlicz4KKyAgZ2V0U2VjdGlvbkNvbnRyaWJzKCkgY29uc3QgPSAwOworfTsKK30gLy8gbmFtZXNwYWNlIHBkYgorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9JUERCU291cmNlRmlsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL0lQREJTb3VyY2VGaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY3NmM0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9JUERCU291cmNlRmlsZS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vPT09LSBJUERCU291cmNlRmlsZS5oIC0gYmFzZSBpbnRlcmZhY2UgZm9yIGEgUERCIHNvdXJjZSBmaWxlIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX0lQREJTT1VSQ0VGSUxFX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX0lQREJTT1VSQ0VGSUxFX0gKKworI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBwZGIgeworCisvLy8gSVBEQlNvdXJjZUZpbGUgZGVmaW5lcyBhbiBpbnRlcmZhY2UgdXNlZCB0byByZXByZXNlbnQgc291cmNlIGZpbGVzIHdob3NlCisvLy8gaW5mb3JtYXRpb24gYXJlIHN0b3JlZCBpbiB0aGUgUERCLgorY2xhc3MgSVBEQlNvdXJjZUZpbGUgeworcHVibGljOgorICB2aXJ0dWFsIH5JUERCU291cmNlRmlsZSgpOworCisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MsIGludCBJbmRlbnQpIGNvbnN0OworCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0RmlsZU5hbWUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0VW5pcXVlSWQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0Q2hlY2tzdW0oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgUERCX0NoZWNrc3VtIGdldENoZWNrc3VtVHlwZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1DaGlsZHJlbjxQREJTeW1ib2xDb21waWxhbmQ+PgorICBnZXRDb21waWxhbmRzKCkgY29uc3QgPSAwOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQlRhYmxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvSVBEQlRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDU2MWM0ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9JUERCVGFibGUuaApAQCAtMCwwICsxLDI4IEBACisvLz09PS0gSVBEQlRhYmxlLmggLSBCYXNlIEludGVyZmFjZSBmb3IgYSBQREIgU3ltYm9sIENvbnRleHQgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9JUERCVEFCTEVfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfSVBEQlRBQkxFX0gKKworI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworY2xhc3MgSVBEQlRhYmxlIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+SVBEQlRhYmxlKCk7CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXROYW1lKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQzMl90IGdldEl0ZW1Db3VudCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBQREJfVGFibGVUeXBlIGdldFRhYmxlVHlwZSgpIGNvbnN0ID0gMDsKK307Cit9Cit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfSVBEQlRBQkxFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvRGJpTW9kdWxlRGVzY3JpcHRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9EYmlNb2R1bGVEZXNjcmlwdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODIwMGY1MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvRGJpTW9kdWxlRGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsNzAgQEAKKy8vPT09LSBEYmlNb2R1bGVEZXNjcmlwdG9yLmggLSBQREIgbW9kdWxlIGluZm9ybWF0aW9uIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1JBV19EQklNT0RVTEVERVNDUklQVE9SX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1JBV19EQklNT0RVTEVERVNDUklQVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUmF3VHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtQXJyYXkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIERiaU1vZHVsZURlc2NyaXB0b3IgeworICBmcmllbmQgY2xhc3MgRGJpU3RyZWFtQnVpbGRlcjsKKworcHVibGljOgorICBEYmlNb2R1bGVEZXNjcmlwdG9yKCk7CisgIERiaU1vZHVsZURlc2NyaXB0b3IoY29uc3QgRGJpTW9kdWxlRGVzY3JpcHRvciAmSW5mbyk7CisgIH5EYmlNb2R1bGVEZXNjcmlwdG9yKCk7CisKKyAgc3RhdGljIEVycm9yIGluaXRpYWxpemUoQmluYXJ5U3RyZWFtUmVmIFN0cmVhbSwgRGJpTW9kdWxlRGVzY3JpcHRvciAmSW5mbyk7CisKKyAgYm9vbCBoYXNFQ0luZm8oKSBjb25zdDsKKyAgdWludDE2X3QgZ2V0VHlwZVNlcnZlckluZGV4KCkgY29uc3Q7CisgIHVpbnQxNl90IGdldE1vZHVsZVN0cmVhbUluZGV4KCkgY29uc3Q7CisgIHVpbnQzMl90IGdldFN5bWJvbERlYnVnSW5mb0J5dGVTaXplKCkgY29uc3Q7CisgIHVpbnQzMl90IGdldEMxMUxpbmVJbmZvQnl0ZVNpemUoKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0QzEzTGluZUluZm9CeXRlU2l6ZSgpIGNvbnN0OworICB1aW50MzJfdCBnZXROdW1iZXJPZkZpbGVzKCkgY29uc3Q7CisgIHVpbnQzMl90IGdldFNvdXJjZUZpbGVOYW1lSW5kZXgoKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0UGRiRmlsZVBhdGhOYW1lSW5kZXgoKSBjb25zdDsKKworICBTdHJpbmdSZWYgZ2V0TW9kdWxlTmFtZSgpIGNvbnN0OworICBTdHJpbmdSZWYgZ2V0T2JqRmlsZU5hbWUoKSBjb25zdDsKKworICB1aW50MzJfdCBnZXRSZWNvcmRMZW5ndGgoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgU3RyaW5nUmVmIE1vZHVsZU5hbWU7CisgIFN0cmluZ1JlZiBPYmpGaWxlTmFtZTsKKyAgY29uc3QgTW9kdWxlSW5mb0hlYWRlciAqTGF5b3V0ID0gbnVsbHB0cjsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBwZGIKKwordGVtcGxhdGUgPD4gc3RydWN0IFZhclN0cmVhbUFycmF5RXh0cmFjdG9yPHBkYjo6RGJpTW9kdWxlRGVzY3JpcHRvcj4geworICBFcnJvciBvcGVyYXRvcigpKEJpbmFyeVN0cmVhbVJlZiBTdHJlYW0sIHVpbnQzMl90ICZMZW5ndGgsCisgICAgICAgICAgICAgICAgICAgcGRiOjpEYmlNb2R1bGVEZXNjcmlwdG9yICZJbmZvKSB7CisgICAgaWYgKGF1dG8gRUMgPSBwZGI6OkRiaU1vZHVsZURlc2NyaXB0b3I6OmluaXRpYWxpemUoU3RyZWFtLCBJbmZvKSkKKyAgICAgIHJldHVybiBFQzsKKyAgICBMZW5ndGggPSBJbmZvLmdldFJlY29yZExlbmd0aCgpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1JBV19EQklNT0RVTEVERVNDUklQVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvRGJpTW9kdWxlRGVzY3JpcHRvckJ1aWxkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvRGJpTW9kdWxlRGVzY3JpcHRvckJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTE4YTVkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9EYmlNb2R1bGVEZXNjcmlwdG9yQnVpbGRlci5oCkBAIC0wLDAgKzEsMTA1IEBACisvLz09PS0gRGJpTW9kdWxlRGVzY3JpcHRvckJ1aWxkZXIuaCAtIFBEQiBtb2R1bGUgaW5mb3JtYXRpb24gLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfREJJTU9EVUxFREVTQ1JJUFRPUkJVSUxERVJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUkFXX0RCSU1PRFVMRURFU0NSSVBUT1JCVUlMREVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnQ2hlY2tzdW1zU3Vic2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnSW5saW5lZUxpbmVzU3Vic2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnTGluZXNTdWJzZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvRGVidWdTdWJzZWN0aW9uUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvU3ltYm9sUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgQmluYXJ5U3RyZWFtV3JpdGVyOworCituYW1lc3BhY2UgY29kZXZpZXcgeworY2xhc3MgRGVidWdTdWJzZWN0aW9uUmVjb3JkQnVpbGRlcjsKK30KKworbmFtZXNwYWNlIG1zZiB7CitjbGFzcyBNU0ZCdWlsZGVyOworc3RydWN0IE1TRkxheW91dDsKK30KK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBEYmlNb2R1bGVEZXNjcmlwdG9yQnVpbGRlciB7CisgIGZyaWVuZCBjbGFzcyBEYmlTdHJlYW1CdWlsZGVyOworCitwdWJsaWM6CisgIERiaU1vZHVsZURlc2NyaXB0b3JCdWlsZGVyKFN0cmluZ1JlZiBNb2R1bGVOYW1lLCB1aW50MzJfdCBNb2RJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXNmOjpNU0ZCdWlsZGVyICZNc2YpOworICB+RGJpTW9kdWxlRGVzY3JpcHRvckJ1aWxkZXIoKTsKKworICBEYmlNb2R1bGVEZXNjcmlwdG9yQnVpbGRlcihjb25zdCBEYmlNb2R1bGVEZXNjcmlwdG9yQnVpbGRlciAmKSA9IGRlbGV0ZTsKKyAgRGJpTW9kdWxlRGVzY3JpcHRvckJ1aWxkZXIgJgorICBvcGVyYXRvcj0oY29uc3QgRGJpTW9kdWxlRGVzY3JpcHRvckJ1aWxkZXIgJikgPSBkZWxldGU7CisKKyAgdm9pZCBzZXRQZGJGaWxlUGF0aE5JKHVpbnQzMl90IE5JKTsKKyAgdm9pZCBzZXRPYmpGaWxlTmFtZShTdHJpbmdSZWYgTmFtZSk7CisgIHZvaWQgYWRkU3ltYm9sKGNvZGV2aWV3OjpDVlN5bWJvbCBTeW1ib2wpOworCisgIHZvaWQKKyAgYWRkRGVidWdTdWJzZWN0aW9uKHN0ZDo6c2hhcmVkX3B0cjxjb2Rldmlldzo6RGVidWdTdWJzZWN0aW9uPiBTdWJzZWN0aW9uKTsKKworICB2b2lkCisgIGFkZERlYnVnU3Vic2VjdGlvbihjb25zdCBjb2Rldmlldzo6RGVidWdTdWJzZWN0aW9uUmVjb3JkICZTdWJzZWN0aW9uQ29udGVudHMpOworCisgIHVpbnQxNl90IGdldFN0cmVhbUluZGV4KCkgY29uc3Q7CisgIFN0cmluZ1JlZiBnZXRNb2R1bGVOYW1lKCkgY29uc3QgeyByZXR1cm4gTW9kdWxlTmFtZTsgfQorICBTdHJpbmdSZWYgZ2V0T2JqRmlsZU5hbWUoKSBjb25zdCB7IHJldHVybiBPYmpGaWxlTmFtZTsgfQorCisgIHVuc2lnbmVkIGdldE1vZHVsZUluZGV4KCkgY29uc3QgeyByZXR1cm4gTGF5b3V0Lk1vZDsgfQorCisgIEFycmF5UmVmPHN0ZDo6c3RyaW5nPiBzb3VyY2VfZmlsZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VBcnJheVJlZihTb3VyY2VGaWxlcyk7CisgIH0KKworICB1aW50MzJfdCBjYWxjdWxhdGVTZXJpYWxpemVkTGVuZ3RoKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgbW9kdWxlIHN5bWJvbCBzdHJlYW0gb2YgdGhlIG5leHQgc3ltYm9sCisgIC8vLyByZWNvcmQgcGFzc2VkIHRvIGFkZFN5bWJvbC4gQWRkIGZvdXIgdG8gYWNjb3VudCBmb3IgdGhlIHNpZ25hdHVyZS4KKyAgdWludDMyX3QgZ2V0TmV4dFN5bWJvbE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIFN5bWJvbEJ5dGVTaXplICsgNDsgfQorCisgIHZvaWQgZmluYWxpemUoKTsKKyAgRXJyb3IgZmluYWxpemVNc2ZMYXlvdXQoKTsKKworICBFcnJvciBjb21taXQoQmluYXJ5U3RyZWFtV3JpdGVyICZNb2RpV3JpdGVyLCBjb25zdCBtc2Y6Ok1TRkxheW91dCAmTXNmTGF5b3V0LAorICAgICAgICAgICAgICAgV3JpdGFibGVCaW5hcnlTdHJlYW1SZWYgTXNmQnVmZmVyKTsKKworcHJpdmF0ZToKKyAgdWludDMyX3QgY2FsY3VsYXRlQzEzRGVidWdJbmZvU2l6ZSgpIGNvbnN0OworCisgIHZvaWQgYWRkU291cmNlRmlsZShTdHJpbmdSZWYgUGF0aCk7CisgIG1zZjo6TVNGQnVpbGRlciAmTVNGOworCisgIHVpbnQzMl90IFN5bWJvbEJ5dGVTaXplID0gMDsKKyAgdWludDMyX3QgUGRiRmlsZVBhdGhOSSA9IDA7CisgIHN0ZDo6c3RyaW5nIE1vZHVsZU5hbWU7CisgIHN0ZDo6c3RyaW5nIE9iakZpbGVOYW1lOworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gU291cmNlRmlsZXM7CisgIHN0ZDo6dmVjdG9yPGNvZGV2aWV3OjpDVlN5bWJvbD4gU3ltYm9sczsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Y29kZXZpZXc6OkRlYnVnU3Vic2VjdGlvblJlY29yZEJ1aWxkZXI+PgorICAgICAgQzEzQnVpbGRlcnM7CisKKyAgTW9kdWxlSW5mb0hlYWRlciBMYXlvdXQ7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgcGRiCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUkFXX0RCSU1PRFVMRURFU0NSSVBUT1JCVUlMREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvRGJpTW9kdWxlTGlzdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9EYmlNb2R1bGVMaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY2ZTdhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvRGJpTW9kdWxlTGlzdC5oCkBAIC0wLDAgKzEsMTE4IEBACisvLz09PS0gRGJpTW9kdWxlTGlzdC5oIC0gUERCIG1vZHVsZSBpbmZvcm1hdGlvbiBsaXN0IC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfREJJTU9EVUxFTElTVF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfREJJTU9EVUxFTElTVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9EYmlNb2R1bGVEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbUFycmF5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgRGJpTW9kdWxlTGlzdDsKK3N0cnVjdCBGaWxlSW5mb1N1YnN0cmVhbUhlYWRlcjsKKworY2xhc3MgRGJpTW9kdWxlU291cmNlRmlsZXNJdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yX2ZhY2FkZV9iYXNlPERiaU1vZHVsZVNvdXJjZUZpbGVzSXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgU3RyaW5nUmVmPiB7CisgIHVzaW5nIEJhc2VUeXBlID0KKyAgICAgIGl0ZXJhdG9yX2ZhY2FkZV9iYXNlPERiaU1vZHVsZVNvdXJjZUZpbGVzSXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBTdHJpbmdSZWY+OworCitwdWJsaWM6CisgIERiaU1vZHVsZVNvdXJjZUZpbGVzSXRlcmF0b3IoY29uc3QgRGJpTW9kdWxlTGlzdCAmTW9kdWxlcywgdWludDMyX3QgTW9kaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBGaWxlaSk7CisgIERiaU1vZHVsZVNvdXJjZUZpbGVzSXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgIERiaU1vZHVsZVNvdXJjZUZpbGVzSXRlcmF0b3IgJgorICBvcGVyYXRvcj0oY29uc3QgRGJpTW9kdWxlU291cmNlRmlsZXNJdGVyYXRvciAmUikgPSBkZWZhdWx0OworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEYmlNb2R1bGVTb3VyY2VGaWxlc0l0ZXJhdG9yICZSKSBjb25zdDsKKworICBjb25zdCBTdHJpbmdSZWYgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIFRoaXNWYWx1ZTsgfQorICBTdHJpbmdSZWYgJm9wZXJhdG9yKigpIHsgcmV0dXJuIFRoaXNWYWx1ZTsgfQorCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IERiaU1vZHVsZVNvdXJjZUZpbGVzSXRlcmF0b3IgJlJIUykgY29uc3Q7CisgIHN0ZDo6cHRyZGlmZl90IG9wZXJhdG9yLShjb25zdCBEYmlNb2R1bGVTb3VyY2VGaWxlc0l0ZXJhdG9yICZSKSBjb25zdDsKKyAgRGJpTW9kdWxlU291cmNlRmlsZXNJdGVyYXRvciAmb3BlcmF0b3IrPShzdGQ6OnB0cmRpZmZfdCBOKTsKKyAgRGJpTW9kdWxlU291cmNlRmlsZXNJdGVyYXRvciAmb3BlcmF0b3ItPShzdGQ6OnB0cmRpZmZfdCBOKTsKKworcHJpdmF0ZToKKyAgdm9pZCBzZXRWYWx1ZSgpOworCisgIGJvb2wgaXNFbmQoKSBjb25zdDsKKyAgYm9vbCBpc0NvbXBhdGlibGUoY29uc3QgRGJpTW9kdWxlU291cmNlRmlsZXNJdGVyYXRvciAmUikgY29uc3Q7CisgIGJvb2wgaXNVbml2ZXJzYWxFbmQoKSBjb25zdDsKKworICBTdHJpbmdSZWYgVGhpc1ZhbHVlOworICBjb25zdCBEYmlNb2R1bGVMaXN0ICpNb2R1bGVze251bGxwdHJ9OworICB1aW50MzJfdCBNb2RpezB9OworICB1aW50MTZfdCBGaWxlaXswfTsKK307CisKK2NsYXNzIERiaU1vZHVsZUxpc3QgeworICBmcmllbmQgRGJpTW9kdWxlU291cmNlRmlsZXNJdGVyYXRvcjsKKworcHVibGljOgorICBFcnJvciBpbml0aWFsaXplKEJpbmFyeVN0cmVhbVJlZiBNb2RJbmZvLCBCaW5hcnlTdHJlYW1SZWYgRmlsZUluZm8pOworCisgIEV4cGVjdGVkPFN0cmluZ1JlZj4gZ2V0RmlsZU5hbWUodWludDMyX3QgSW5kZXgpIGNvbnN0OworICB1aW50MzJfdCBnZXRNb2R1bGVDb3VudCgpIGNvbnN0OworICB1aW50MzJfdCBnZXRTb3VyY2VGaWxlQ291bnQoKSBjb25zdDsKKyAgdWludDE2X3QgZ2V0U291cmNlRmlsZUNvdW50KHVpbnQzMl90IE1vZGkpIGNvbnN0OworCisgIGl0ZXJhdG9yX3JhbmdlPERiaU1vZHVsZVNvdXJjZUZpbGVzSXRlcmF0b3I+CisgIHNvdXJjZV9maWxlcyh1aW50MzJfdCBNb2RpKSBjb25zdDsKKworICBEYmlNb2R1bGVEZXNjcmlwdG9yIGdldE1vZHVsZURlc2NyaXB0b3IodWludDMyX3QgTW9kaSkgY29uc3Q7CisKK3ByaXZhdGU6CisgIEVycm9yIGluaXRpYWxpemVNb2RJbmZvKEJpbmFyeVN0cmVhbVJlZiBNb2RJbmZvKTsKKyAgRXJyb3IgaW5pdGlhbGl6ZUZpbGVJbmZvKEJpbmFyeVN0cmVhbVJlZiBGaWxlSW5mbyk7CisKKyAgVmFyU3RyZWFtQXJyYXk8RGJpTW9kdWxlRGVzY3JpcHRvcj4gRGVzY3JpcHRvcnM7CisKKyAgRml4ZWRTdHJlYW1BcnJheTxzdXBwb3J0OjpsaXR0bGUzMl90PiBGaWxlTmFtZU9mZnNldHM7CisgIEZpeGVkU3RyZWFtQXJyYXk8c3VwcG9ydDo6dWxpdHRsZTE2X3Q+IE1vZEZpbGVDb3VudEFycmF5OworCisgIC8vIEZvciBlYWNoIG1vZHVsZSwgdGhlcmUgYXJlIG11bHRpcGxlIGZpbGVuYW1lcywgd2hpY2ggY2FuIGJlIG9idGFpbmVkIGJ5CisgIC8vIGtub3dpbmcgdGhlIGluZGV4IG9mIHRoZSBmaWxlLiAgR2l2ZW4gdGhlIGluZGV4IG9mIHRoZSBmaWxlLCBvbmUgY2FuIHVzZQorICAvLyB0aGF0IGFzIGFuIG9mZnNldCBpbnRvIHRoZSBGaWxlTmFtZU9mZnNldHMgYXJyYXksIHdoaWNoIGNvbnRhaW5zIHRoZQorICAvLyBhYnNvbHV0ZSBvZmZzZXQgb2YgdGhlIGZpbGUgbmFtZSBpbiBOYW1lc0J1ZmZlci4gIFRodXMsIGZvciBlYWNoIG1vZHVsZQorICAvLyB3ZSBzdG9yZSB0aGUgZmlyc3QgaW5kZXggaW4gdGhlIEZpbGVOYW1lT2Zmc2V0cyBhcnJheSBmb3IgdGhpcyBtb2R1bGUuCisgIC8vIFRoZSBudW1iZXIgb2YgZmlsZXMgZm9yIHRoZSBjb3JyZXNwb25kaW5nIG1vZHVsZSBpcyBzdG9yZWQgaW4KKyAgLy8gTW9kRmlsZUNvdW50QXJyYXkuCisgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBNb2R1bGVJbml0aWFsRmlsZUluZGV4OworCisgIC8vIEluIG9yZGVyIHRvIHByb3ZpZGUgcmFuZG9tIGFjY2VzcyBpbnRvIHRoZSBEZXNjcmlwdG9ycyBhcnJheSwgd2UgaXRlcmF0ZSBpdAorICAvLyBvbmNlIHVwIGZyb250IHRvIGZpbmQgdGhlIG9mZnNldHMgb2YgdGhlIGluZGl2aWR1YWwgaXRlbXMgYW5kIHN0b3JlIHRoZW0gaW4KKyAgLy8gdGhpcyBhcnJheS4KKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IE1vZHVsZURlc2NyaXB0b3JPZmZzZXRzOworCisgIGNvbnN0IEZpbGVJbmZvU3Vic3RyZWFtSGVhZGVyICpGaWxlSW5mb0hlYWRlciA9IG51bGxwdHI7CisKKyAgQmluYXJ5U3RyZWFtUmVmIE1vZEluZm9TdWJzdHJlYW07CisgIEJpbmFyeVN0cmVhbVJlZiBGaWxlSW5mb1N1YnN0cmVhbTsKKyAgQmluYXJ5U3RyZWFtUmVmIE5hbWVzQnVmZmVyOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHBkYgorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfREJJTU9EVUxFTElTVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0RiaVN0cmVhbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9EYmlTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjBkMTlhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9EYmlTdHJlYW0uaApAQCAtMCwwICsxLDEyOSBAQAorLy89PT0tIERiaVN0cmVhbS5oIC0gUERCIERiaSBTdHJlYW0gKFN0cmVhbSAzKSBBY2Nlc3MgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1BEQkRCSVNUUkVBTV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUERCREJJU1RSRUFNX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3Vic2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL01TRi9NYXBwZWRCbG9ja1N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvRGJpTW9kdWxlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvRGJpTW9kdWxlTGlzdC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUERCU3RyaW5nVGFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUmF3VHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvUERCVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtQXJyYXkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb2JqZWN0IHsKK3N0cnVjdCBGcG9EYXRhOworc3RydWN0IGNvZmZfc2VjdGlvbjsKK30KKworbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBEYmlTdHJlYW1CdWlsZGVyOworY2xhc3MgUERCRmlsZTsKK2NsYXNzIElTZWN0aW9uQ29udHJpYlZpc2l0b3I7CisKK2NsYXNzIERiaVN0cmVhbSB7CisgIGZyaWVuZCBjbGFzcyBEYmlTdHJlYW1CdWlsZGVyOworCitwdWJsaWM6CisgIERiaVN0cmVhbShQREJGaWxlICZGaWxlLCBzdGQ6OnVuaXF1ZV9wdHI8bXNmOjpNYXBwZWRCbG9ja1N0cmVhbT4gU3RyZWFtKTsKKyAgfkRiaVN0cmVhbSgpOworICBFcnJvciByZWxvYWQoKTsKKworICBQZGJSYXdfRGJpVmVyIGdldERiaVZlcnNpb24oKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0QWdlKCkgY29uc3Q7CisgIHVpbnQxNl90IGdldFB1YmxpY1N5bWJvbFN0cmVhbUluZGV4KCkgY29uc3Q7CisgIHVpbnQxNl90IGdldEdsb2JhbFN5bWJvbFN0cmVhbUluZGV4KCkgY29uc3Q7CisKKyAgdWludDE2X3QgZ2V0RmxhZ3MoKSBjb25zdDsKKyAgYm9vbCBpc0luY3JlbWVudGFsbHlMaW5rZWQoKSBjb25zdDsKKyAgYm9vbCBoYXNDVHlwZXMoKSBjb25zdDsKKyAgYm9vbCBpc1N0cmlwcGVkKCkgY29uc3Q7CisKKyAgdWludDE2X3QgZ2V0QnVpbGROdW1iZXIoKSBjb25zdDsKKyAgdWludDE2X3QgZ2V0QnVpbGRNYWpvclZlcnNpb24oKSBjb25zdDsKKyAgdWludDE2X3QgZ2V0QnVpbGRNaW5vclZlcnNpb24oKSBjb25zdDsKKworICB1aW50MTZfdCBnZXRQZGJEbGxSYmxkKCkgY29uc3Q7CisgIHVpbnQzMl90IGdldFBkYkRsbFZlcnNpb24oKSBjb25zdDsKKworICB1aW50MzJfdCBnZXRTeW1SZWNvcmRTdHJlYW1JbmRleCgpIGNvbnN0OworCisgIFBEQl9NYWNoaW5lIGdldE1hY2hpbmVUeXBlKCkgY29uc3Q7CisKKyAgY29uc3QgRGJpU3RyZWFtSGVhZGVyICpnZXRIZWFkZXIoKSBjb25zdCB7IHJldHVybiBIZWFkZXI7IH0KKworICBCaW5hcnlTdWJzdHJlYW1SZWYgZ2V0U2VjdGlvbkNvbnRyaWJ1dGlvbkRhdGEoKSBjb25zdDsKKyAgQmluYXJ5U3Vic3RyZWFtUmVmIGdldFNlY01hcFN1YnN0cmVhbURhdGEoKSBjb25zdDsKKyAgQmluYXJ5U3Vic3RyZWFtUmVmIGdldE1vZGlTdWJzdHJlYW1EYXRhKCkgY29uc3Q7CisgIEJpbmFyeVN1YnN0cmVhbVJlZiBnZXRGaWxlSW5mb1N1YnN0cmVhbURhdGEoKSBjb25zdDsKKyAgQmluYXJ5U3Vic3RyZWFtUmVmIGdldFR5cGVTZXJ2ZXJNYXBTdWJzdHJlYW1EYXRhKCkgY29uc3Q7CisgIEJpbmFyeVN1YnN0cmVhbVJlZiBnZXRFQ1N1YnN0cmVhbURhdGEoKSBjb25zdDsKKworICAvLy8gSWYgdGhlIGdpdmVuIHN0cmVhbSB0eXBlIGlzIHByZXNlbnQsIHJldHVybnMgaXRzIHN0cmVhbSBpbmRleC4gSWYgaXQgaXMKKyAgLy8vIG5vdCBwcmVzZW50LCByZXR1cm5zIEludmFsaWRTdHJlYW1JbmRleC4KKyAgdWludDMyX3QgZ2V0RGVidWdTdHJlYW1JbmRleChEYmdIZWFkZXJUeXBlIFR5cGUpIGNvbnN0OworCisgIGNvbnN0IERiaU1vZHVsZUxpc3QgJm1vZHVsZXMoKSBjb25zdDsKKworICBGaXhlZFN0cmVhbUFycmF5PG9iamVjdDo6Y29mZl9zZWN0aW9uPiBnZXRTZWN0aW9uSGVhZGVycygpOworCisgIEZpeGVkU3RyZWFtQXJyYXk8b2JqZWN0OjpGcG9EYXRhPiBnZXRGcG9SZWNvcmRzKCk7CisKKyAgRml4ZWRTdHJlYW1BcnJheTxTZWNNYXBFbnRyeT4gZ2V0U2VjdGlvbk1hcCgpIGNvbnN0OworICB2b2lkIHZpc2l0U2VjdGlvbkNvbnRyaWJ1dGlvbnMoSVNlY3Rpb25Db250cmliVmlzaXRvciAmVmlzaXRvcikgY29uc3Q7CisKKyAgRXhwZWN0ZWQ8U3RyaW5nUmVmPiBnZXRFQ05hbWUodWludDMyX3QgTkkpIGNvbnN0OworCitwcml2YXRlOgorICBFcnJvciBpbml0aWFsaXplU2VjdGlvbkNvbnRyaWJ1dGlvbkRhdGEoKTsKKyAgRXJyb3IgaW5pdGlhbGl6ZVNlY3Rpb25IZWFkZXJzRGF0YSgpOworICBFcnJvciBpbml0aWFsaXplU2VjdGlvbk1hcERhdGEoKTsKKyAgRXJyb3IgaW5pdGlhbGl6ZUZwb1JlY29yZHMoKTsKKworICBQREJGaWxlICZQZGI7CisgIHN0ZDo6dW5pcXVlX3B0cjxtc2Y6Ok1hcHBlZEJsb2NrU3RyZWFtPiBTdHJlYW07CisKKyAgUERCU3RyaW5nVGFibGUgRUNOYW1lczsKKworICBCaW5hcnlTdWJzdHJlYW1SZWYgU2VjQ29udHJTdWJzdHJlYW07CisgIEJpbmFyeVN1YnN0cmVhbVJlZiBTZWNNYXBTdWJzdHJlYW07CisgIEJpbmFyeVN1YnN0cmVhbVJlZiBNb2RpU3Vic3RyZWFtOworICBCaW5hcnlTdWJzdHJlYW1SZWYgRmlsZUluZm9TdWJzdHJlYW07CisgIEJpbmFyeVN1YnN0cmVhbVJlZiBUeXBlU2VydmVyTWFwU3Vic3RyZWFtOworICBCaW5hcnlTdWJzdHJlYW1SZWYgRUNTdWJzdHJlYW07CisKKyAgRGJpTW9kdWxlTGlzdCBNb2R1bGVzOworCisgIEZpeGVkU3RyZWFtQXJyYXk8c3VwcG9ydDo6dWxpdHRsZTE2X3Q+IERiZ1N0cmVhbXM7CisKKyAgUGRiUmF3X0RiaVNlY0NvbnRyaWJWZXIgU2VjdGlvbkNvbnRyaWJWZXJzaW9uID0KKyAgICAgIFBkYlJhd19EYmlTZWNDb250cmliVmVyOjpEYmlTZWNDb250cmliVmVyNjA7CisgIEZpeGVkU3RyZWFtQXJyYXk8U2VjdGlvbkNvbnRyaWI+IFNlY3Rpb25Db250cmliczsKKyAgRml4ZWRTdHJlYW1BcnJheTxTZWN0aW9uQ29udHJpYjI+IFNlY3Rpb25Db250cmliczI7CisgIEZpeGVkU3RyZWFtQXJyYXk8U2VjTWFwRW50cnk+IFNlY3Rpb25NYXA7CisKKyAgc3RkOjp1bmlxdWVfcHRyPG1zZjo6TWFwcGVkQmxvY2tTdHJlYW0+IFNlY3Rpb25IZWFkZXJTdHJlYW07CisgIEZpeGVkU3RyZWFtQXJyYXk8b2JqZWN0Ojpjb2ZmX3NlY3Rpb24+IFNlY3Rpb25IZWFkZXJzOworCisgIHN0ZDo6dW5pcXVlX3B0cjxtc2Y6Ok1hcHBlZEJsb2NrU3RyZWFtPiBGcG9TdHJlYW07CisgIEZpeGVkU3RyZWFtQXJyYXk8b2JqZWN0OjpGcG9EYXRhPiBGcG9SZWNvcmRzOworCisgIGNvbnN0IERiaVN0cmVhbUhlYWRlciAqSGVhZGVyOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0RiaVN0cmVhbUJ1aWxkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvRGJpU3RyZWFtQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhZWEwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0RiaVN0cmVhbUJ1aWxkZXIuaApAQCAtMCwwICsxLDEyOSBAQAorLy89PT0tIERiaVN0cmVhbUJ1aWxkZXIuaCAtIFBEQiBEYmkgU3RyZWFtIENyZWF0aW9uIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1BEQkRCSVNUUkVBTUJVSUxERVJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1BEQkRCSVNUUkVBTUJVSUxERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUERCRmlsZS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUERCU3RyaW5nVGFibGVCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdDb25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvUERCVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5Qnl0ZVN0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWFkZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBtc2YgeworY2xhc3MgTVNGQnVpbGRlcjsKK30KK25hbWVzcGFjZSBvYmplY3Qgeworc3RydWN0IGNvZmZfc2VjdGlvbjsKK30KK25hbWVzcGFjZSBwZGIgeworY2xhc3MgRGJpU3RyZWFtOworc3RydWN0IERiaVN0cmVhbUhlYWRlcjsKK2NsYXNzIERiaU1vZHVsZURlc2NyaXB0b3JCdWlsZGVyOworY2xhc3MgUERCRmlsZTsKKworY2xhc3MgRGJpU3RyZWFtQnVpbGRlciB7CitwdWJsaWM6CisgIERiaVN0cmVhbUJ1aWxkZXIobXNmOjpNU0ZCdWlsZGVyICZNc2YpOworICB+RGJpU3RyZWFtQnVpbGRlcigpOworCisgIERiaVN0cmVhbUJ1aWxkZXIoY29uc3QgRGJpU3RyZWFtQnVpbGRlciAmKSA9IGRlbGV0ZTsKKyAgRGJpU3RyZWFtQnVpbGRlciAmb3BlcmF0b3I9KGNvbnN0IERiaVN0cmVhbUJ1aWxkZXIgJikgPSBkZWxldGU7CisKKyAgdm9pZCBzZXRWZXJzaW9uSGVhZGVyKFBkYlJhd19EYmlWZXIgVik7CisgIHZvaWQgc2V0QWdlKHVpbnQzMl90IEEpOworICB2b2lkIHNldEJ1aWxkTnVtYmVyKHVpbnQxNl90IEIpOworICB2b2lkIHNldFBkYkRsbFZlcnNpb24odWludDE2X3QgVik7CisgIHZvaWQgc2V0UGRiRGxsUmJsZCh1aW50MTZfdCBSKTsKKyAgdm9pZCBzZXRGbGFncyh1aW50MTZfdCBGKTsKKyAgdm9pZCBzZXRNYWNoaW5lVHlwZShQREJfTWFjaGluZSBNKTsKKyAgdm9pZCBzZXRTZWN0aW9uTWFwKEFycmF5UmVmPFNlY01hcEVudHJ5PiBTZWNNYXApOworCisgIC8vIEFkZCBnaXZlbiBieXRlcyBhcyBhIG5ldyBzdHJlYW0uCisgIEVycm9yIGFkZERiZ1N0cmVhbShwZGI6OkRiZ0hlYWRlclR5cGUgVHlwZSwgQXJyYXlSZWY8dWludDhfdD4gRGF0YSk7CisKKyAgdWludDMyX3QgYWRkRUNOYW1lKFN0cmluZ1JlZiBOYW1lKTsKKworICB1aW50MzJfdCBjYWxjdWxhdGVTZXJpYWxpemVkTGVuZ3RoKCkgY29uc3Q7CisKKyAgdm9pZCBzZXRHbG9iYWxzU3RyZWFtSW5kZXgodWludDMyX3QgSW5kZXgpOworICB2b2lkIHNldFB1YmxpY3NTdHJlYW1JbmRleCh1aW50MzJfdCBJbmRleCk7CisgIHZvaWQgc2V0U3ltYm9sUmVjb3JkU3RyZWFtSW5kZXgodWludDMyX3QgSW5kZXgpOworCisgIEV4cGVjdGVkPERiaU1vZHVsZURlc2NyaXB0b3JCdWlsZGVyICY+IGFkZE1vZHVsZUluZm8oU3RyaW5nUmVmIE1vZHVsZU5hbWUpOworICBFcnJvciBhZGRNb2R1bGVTb3VyY2VGaWxlKERiaU1vZHVsZURlc2NyaXB0b3JCdWlsZGVyICZNb2R1bGUsIFN0cmluZ1JlZiBGaWxlKTsKKyAgRXhwZWN0ZWQ8dWludDMyX3Q+IGdldFNvdXJjZUZpbGVOYW1lSW5kZXgoU3RyaW5nUmVmIEZpbGVOYW1lKTsKKworICBFcnJvciBmaW5hbGl6ZU1zZkxheW91dCgpOworCisgIEVycm9yIGNvbW1pdChjb25zdCBtc2Y6Ok1TRkxheW91dCAmTGF5b3V0LCBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiBNc2ZCdWZmZXIpOworCisgIHZvaWQgYWRkU2VjdGlvbkNvbnRyaWIoY29uc3QgU2VjdGlvbkNvbnRyaWIgJlNDKSB7CisgICAgU2VjdGlvbkNvbnRyaWJzLmVtcGxhY2VfYmFjayhTQyk7CisgIH0KKworICAvLyBBIGhlbHBlciBmdW5jdGlvbiB0byBjcmVhdGUgYSBTZWN0aW9uIE1hcCBmcm9tIGEgQ09GRiBzZWN0aW9uIGhlYWRlci4KKyAgc3RhdGljIHN0ZDo6dmVjdG9yPFNlY01hcEVudHJ5PgorICBjcmVhdGVTZWN0aW9uTWFwKEFycmF5UmVmPGxsdm06Om9iamVjdDo6Y29mZl9zZWN0aW9uPiBTZWNIZHJzKTsKKworcHJpdmF0ZToKKyAgc3RydWN0IERlYnVnU3RyZWFtIHsKKyAgICBBcnJheVJlZjx1aW50OF90PiBEYXRhOworICAgIHVpbnQxNl90IFN0cmVhbU51bWJlciA9IGtJbnZhbGlkU3RyZWFtSW5kZXg7CisgIH07CisKKyAgRXJyb3IgZmluYWxpemUoKTsKKyAgdWludDMyX3QgY2FsY3VsYXRlTW9kaVN1YnN0cmVhbVNpemUoKSBjb25zdDsKKyAgdWludDMyX3QgY2FsY3VsYXRlTmFtZXNPZmZzZXQoKSBjb25zdDsKKyAgdWludDMyX3QgY2FsY3VsYXRlU2VjdGlvbkNvbnRyaWJzU3RyZWFtU2l6ZSgpIGNvbnN0OworICB1aW50MzJfdCBjYWxjdWxhdGVTZWN0aW9uTWFwU3RyZWFtU2l6ZSgpIGNvbnN0OworICB1aW50MzJfdCBjYWxjdWxhdGVGaWxlSW5mb1N1YnN0cmVhbVNpemUoKSBjb25zdDsKKyAgdWludDMyX3QgY2FsY3VsYXRlTmFtZXNCdWZmZXJTaXplKCkgY29uc3Q7CisgIHVpbnQzMl90IGNhbGN1bGF0ZURiZ1N0cmVhbXNTaXplKCkgY29uc3Q7CisKKyAgRXJyb3IgZ2VuZXJhdGVGaWxlSW5mb1N1YnN0cmVhbSgpOworCisgIG1zZjo6TVNGQnVpbGRlciAmTXNmOworICBCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3I7CisKKyAgT3B0aW9uYWw8UGRiUmF3X0RiaVZlcj4gVmVySGVhZGVyOworICB1aW50MzJfdCBBZ2U7CisgIHVpbnQxNl90IEJ1aWxkTnVtYmVyOworICB1aW50MTZfdCBQZGJEbGxWZXJzaW9uOworICB1aW50MTZfdCBQZGJEbGxSYmxkOworICB1aW50MTZfdCBGbGFnczsKKyAgUERCX01hY2hpbmUgTWFjaGluZVR5cGU7CisgIHVpbnQzMl90IEdsb2JhbHNTdHJlYW1JbmRleCA9IGtJbnZhbGlkU3RyZWFtSW5kZXg7CisgIHVpbnQzMl90IFB1YmxpY3NTdHJlYW1JbmRleCA9IGtJbnZhbGlkU3RyZWFtSW5kZXg7CisgIHVpbnQzMl90IFN5bVJlY29yZFN0cmVhbUluZGV4ID0ga0ludmFsaWRTdHJlYW1JbmRleDsKKworICBjb25zdCBEYmlTdHJlYW1IZWFkZXIgKkhlYWRlcjsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8RGJpTW9kdWxlRGVzY3JpcHRvckJ1aWxkZXI+PiBNb2RpTGlzdDsKKworICBTdHJpbmdNYXA8dWludDMyX3Q+IFNvdXJjZUZpbGVOYW1lczsKKworICBQREJTdHJpbmdUYWJsZUJ1aWxkZXIgRUNOYW1lc0J1aWxkZXI7CisgIFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmIE5hbWVzQnVmZmVyOworICBNdXRhYmxlQmluYXJ5Qnl0ZVN0cmVhbSBGaWxlSW5mb0J1ZmZlcjsKKyAgc3RkOjp2ZWN0b3I8U2VjdGlvbkNvbnRyaWI+IFNlY3Rpb25Db250cmliczsKKyAgQXJyYXlSZWY8U2VjTWFwRW50cnk+IFNlY3Rpb25NYXA7CisgIHN0ZDo6YXJyYXk8T3B0aW9uYWw8RGVidWdTdHJlYW0+LCAoaW50KURiZ0hlYWRlclR5cGU6Ok1heD4gRGJnU3RyZWFtczsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9FbnVtVGFibGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0VudW1UYWJsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDE4NDQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9FbnVtVGFibGVzLmgKQEAgLTAsMCArMSwyMiBAQAorLy89PT0tIEVudW1UYWJsZXMuaCAtIEVudW0gdG8gc3RyaW5nIGNvbnZlcnNpb24gdGFibGVzIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUkFXX0VOVU1UQUJMRVNfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUkFXX0VOVU1UQUJMRVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU2NvcGVkUHJpbnRlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKK0FycmF5UmVmPEVudW1FbnRyeTx1aW50MTZfdD4+IGdldE9NRlNlZ01hcERlc2NGbGFnTmFtZXMoKTsKK30KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfRU5VTVRBQkxFU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0Zvcm1hdHRlcnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvRm9ybWF0dGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkNWVhYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0Zvcm1hdHRlcnMuaApAQCAtMCwwICsxLDQ1IEBACisvLz09PS0gRm9ybWF0dGVycy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfRk9STUFUVEVSU19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfRk9STUFUVEVSU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0Zvcm1hdHRlcnMuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUmF3VHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0UHJvdmlkZXJzLmgiCisKKyNkZWZpbmUgRk9STUFUX0NBU0UoVmFsdWUsIE5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGNhc2UgVmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFN0cmVhbSA8PCBOYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBicmVhazsKKworbmFtZXNwYWNlIGxsdm0gewordGVtcGxhdGUgPD4gc3RydWN0IGZvcm1hdF9wcm92aWRlcjxwZGI6OlBkYlJhd19JbXBsVmVyPiB7CisgIHN0YXRpYyB2b2lkIGZvcm1hdChjb25zdCBwZGI6OlBkYlJhd19JbXBsVmVyICZWLCBsbHZtOjpyYXdfb3N0cmVhbSAmU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFN0eWxlKSB7CisgICAgc3dpdGNoIChWKSB7CisgICAgICBGT1JNQVRfQ0FTRShwZGI6OlBkYlJhd19JbXBsVmVyOjpQZGJJbXBsVkMxMTAsICJWQzExMCIpCisgICAgICBGT1JNQVRfQ0FTRShwZGI6OlBkYlJhd19JbXBsVmVyOjpQZGJJbXBsVkMxNDAsICJWQzE0MCIpCisgICAgICBGT1JNQVRfQ0FTRShwZGI6OlBkYlJhd19JbXBsVmVyOjpQZGJJbXBsVkMyLCAiVkMyIikKKyAgICAgIEZPUk1BVF9DQVNFKHBkYjo6UGRiUmF3X0ltcGxWZXI6OlBkYkltcGxWQzQsICJWQzQiKQorICAgICAgRk9STUFUX0NBU0UocGRiOjpQZGJSYXdfSW1wbFZlcjo6UGRiSW1wbFZDNDEsICJWQzQxIikKKyAgICAgIEZPUk1BVF9DQVNFKHBkYjo6UGRiUmF3X0ltcGxWZXI6OlBkYkltcGxWQzUwLCAiVkM1MCIpCisgICAgICBGT1JNQVRfQ0FTRShwZGI6OlBkYlJhd19JbXBsVmVyOjpQZGJJbXBsVkM3MCwgIlZDNzAiKQorICAgICAgRk9STUFUX0NBU0UocGRiOjpQZGJSYXdfSW1wbFZlcjo6UGRiSW1wbFZDNzBEZXAsICJWQzcwRGVwIikKKyAgICAgIEZPUk1BVF9DQVNFKHBkYjo6UGRiUmF3X0ltcGxWZXI6OlBkYkltcGxWQzgwLCAiVkM4MCIpCisgICAgICBGT1JNQVRfQ0FTRShwZGI6OlBkYlJhd19JbXBsVmVyOjpQZGJJbXBsVkM5OCwgIlZDOTgiKQorICAgIH0KKyAgfQorfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0dTSVN0cmVhbUJ1aWxkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvR1NJU3RyZWFtQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhNGY4OWQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0dTSVN0cmVhbUJ1aWxkZXIuaApAQCAtMCwwICsxLDgyIEBACisvLz09PS0gR1NJU3RyZWFtQnVpbGRlci5oIC0gUERCIFB1YmxpY3MvR2xvYmFscyBTdHJlYW0gQ3JlYXRpb24gLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfR1NJU1RSRUFNQlVJTERFUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfR1NJU1RSRUFNQlVJTERFUl9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0dsb2JhbHNTdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUmF3VHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5Qnl0ZVN0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlJdGVtU3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1Xcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPD4gc3RydWN0IEJpbmFyeUl0ZW1UcmFpdHM8Y29kZXZpZXc6OkNWU3ltYm9sPiB7CisgIHN0YXRpYyBzaXplX3QgbGVuZ3RoKGNvbnN0IGNvZGV2aWV3OjpDVlN5bWJvbCAmSXRlbSkgeworICAgIHJldHVybiBJdGVtLlJlY29yZERhdGEuc2l6ZSgpOworICB9CisgIHN0YXRpYyBBcnJheVJlZjx1aW50OF90PiBieXRlcyhjb25zdCBjb2Rldmlldzo6Q1ZTeW1ib2wgJkl0ZW0pIHsKKyAgICByZXR1cm4gSXRlbS5SZWNvcmREYXRhOworICB9Cit9OworCituYW1lc3BhY2UgbXNmIHsKK2NsYXNzIE1TRkJ1aWxkZXI7CitzdHJ1Y3QgTVNGTGF5b3V0OworfSAvLyBuYW1lc3BhY2UgbXNmCituYW1lc3BhY2UgcGRiIHsKK3N0cnVjdCBHU0lIYXNoU3RyZWFtQnVpbGRlcjsKKworY2xhc3MgR1NJU3RyZWFtQnVpbGRlciB7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgR1NJU3RyZWFtQnVpbGRlcihtc2Y6Ok1TRkJ1aWxkZXIgJk1zZik7CisgIH5HU0lTdHJlYW1CdWlsZGVyKCk7CisKKyAgR1NJU3RyZWFtQnVpbGRlcihjb25zdCBHU0lTdHJlYW1CdWlsZGVyICYpID0gZGVsZXRlOworICBHU0lTdHJlYW1CdWlsZGVyICZvcGVyYXRvcj0oY29uc3QgR1NJU3RyZWFtQnVpbGRlciAmKSA9IGRlbGV0ZTsKKworICBFcnJvciBmaW5hbGl6ZU1zZkxheW91dCgpOworCisgIEVycm9yIGNvbW1pdChjb25zdCBtc2Y6Ok1TRkxheW91dCAmTGF5b3V0LCBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiBCdWZmZXIpOworCisgIHVpbnQzMl90IGdldFB1YmxpY3NTdHJlYW1JbmRleCgpIGNvbnN0OworICB1aW50MzJfdCBnZXRHbG9iYWxzU3RyZWFtSW5kZXgoKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0UmVjb3JkU3RyZWFtSWR4KCkgY29uc3QgeyByZXR1cm4gUmVjb3JkU3RyZWFtSWR4OyB9CisKKyAgdm9pZCBhZGRQdWJsaWNTeW1ib2woY29uc3QgY29kZXZpZXc6OlB1YmxpY1N5bTMyICZQdWIpOworCisgIHZvaWQgYWRkR2xvYmFsU3ltYm9sKGNvbnN0IGNvZGV2aWV3OjpQcm9jUmVmU3ltICZTeW0pOworICB2b2lkIGFkZEdsb2JhbFN5bWJvbChjb25zdCBjb2Rldmlldzo6RGF0YVN5bSAmU3ltKTsKKyAgdm9pZCBhZGRHbG9iYWxTeW1ib2woY29uc3QgY29kZXZpZXc6OkNvbnN0YW50U3ltICZTeW0pOworICB2b2lkIGFkZEdsb2JhbFN5bWJvbChjb25zdCBjb2Rldmlldzo6VURUU3ltICZTeW0pOworICB2b2lkIGFkZEdsb2JhbFN5bWJvbChjb25zdCBjb2Rldmlldzo6Q1ZTeW1ib2wgJlN5bSk7CisKK3ByaXZhdGU6CisgIHVpbnQzMl90IGNhbGN1bGF0ZVB1YmxpY3NIYXNoU3RyZWFtU2l6ZSgpIGNvbnN0OworICB1aW50MzJfdCBjYWxjdWxhdGVHbG9iYWxzSGFzaFN0cmVhbVNpemUoKSBjb25zdDsKKyAgRXJyb3IgY29tbWl0U3ltYm9sUmVjb3JkU3RyZWFtKFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmIFN0cmVhbSk7CisgIEVycm9yIGNvbW1pdFB1YmxpY3NIYXNoU3RyZWFtKFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmIFN0cmVhbSk7CisgIEVycm9yIGNvbW1pdEdsb2JhbHNIYXNoU3RyZWFtKFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmIFN0cmVhbSk7CisKKyAgdWludDMyX3QgUmVjb3JkU3RyZWFtSWR4ID0ga0ludmFsaWRTdHJlYW1JbmRleDsKKyAgbXNmOjpNU0ZCdWlsZGVyICZNc2Y7CisgIHN0ZDo6dW5pcXVlX3B0cjxHU0lIYXNoU3RyZWFtQnVpbGRlcj4gUFNIOworICBzdGQ6OnVuaXF1ZV9wdHI8R1NJSGFzaFN0cmVhbUJ1aWxkZXI+IEdTSDsKK307Cit9IC8vIG5hbWVzcGFjZSBwZGIKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0dsb2JhbHNTdHJlYW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvR2xvYmFsc1N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkYzU4ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0dsb2JhbHNTdHJlYW0uaApAQCAtMCwwICsxLDg0IEBACisvLz09PS0gR2xvYmFsc1N0cmVhbS5oIC0gUERCIEluZGV4IG9mIFN5bWJvbHMgYnkgTmFtZSAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfR0xPQkFMU19TVFJFQU1fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUkFXX0dMT0JBTFNfU1RSRUFNX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL01TRi9NYXBwZWRCbG9ja1N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUmF3Q29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9QREJUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1BcnJheS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworY2xhc3MgRGJpU3RyZWFtOworY2xhc3MgUERCRmlsZTsKKworLy8vIEl0ZXJhdG9yIG92ZXIgaGFzaCByZWNvcmRzIHByb2R1Y2luZyBzeW1ib2wgcmVjb3JkIG9mZnNldHMuIEFic3RyYWN0cyBhd2F5CisvLy8gdGhlIGZhY3QgdGhhdCBzeW1ib2wgcmVjb3JkIG9mZnNldHMgb24gZGlzayBhcmUgb2ZmLWJ5LW9uZS4KK2NsYXNzIEdTSUhhc2hJdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yX2FkYXB0b3JfYmFzZTwKKyAgICAgICAgICBHU0lIYXNoSXRlcmF0b3IsIEZpeGVkU3RyZWFtQXJyYXlJdGVyYXRvcjxQU0hhc2hSZWNvcmQ+LAorICAgICAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIGNvbnN0IHVpbnQzMl90PiB7CitwdWJsaWM6CisgIEdTSUhhc2hJdGVyYXRvcigpID0gZGVmYXVsdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgR1NJSGFzaEl0ZXJhdG9yKFQgJiZ2KQorICAgICAgOiBHU0lIYXNoSXRlcmF0b3I6Oml0ZXJhdG9yX2FkYXB0b3JfYmFzZShzdGQ6OmZvcndhcmQ8VCAmJj4odikpIHt9CisKKyAgdWludDMyX3Qgb3BlcmF0b3IqKCkgY29uc3QgeworICAgIHVpbnQzMl90IE9mZiA9IHRoaXMtPkktPk9mZjsKKyAgICByZXR1cm4gLS1PZmY7CisgIH0KK307CisKKy8vLyBGcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9NaWNyb3NvZnQvbWljcm9zb2Z0LXBkYi9ibG9iL21hc3Rlci9QREIvZGJpL2dzaS5jcHAKK2VudW0gOiB1bnNpZ25lZCB7IElQSFJfSEFTSCA9IDQwOTYgfTsKKworLy8vIEEgcmVhZG9ubHkgdmlldyBvZiBhIGhhc2ggdGFibGUgdXNlZCBpbiB0aGUgZ2xvYmFscyBhbmQgcHVibGljcyBzdHJlYW1zLgorLy8vIE1vc3QgY2xpZW50cyB3aWxsIG9ubHkgd2FudCB0byBpdGVyYXRlIHRoaXMgdG8gZ2V0IHN5bWJvbCByZWNvcmQgb2Zmc2V0cworLy8vIGludG8gdGhlIFBEQiBzeW1ib2wgc3RyZWFtLgorY2xhc3MgR1NJSGFzaFRhYmxlIHsKK3B1YmxpYzoKKyAgY29uc3QgR1NJSGFzaEhlYWRlciAqSGFzaEhkcjsKKyAgRml4ZWRTdHJlYW1BcnJheTxQU0hhc2hSZWNvcmQ+IEhhc2hSZWNvcmRzOworICBBcnJheVJlZjx1aW50OF90PiBIYXNoQml0bWFwOworICBGaXhlZFN0cmVhbUFycmF5PHN1cHBvcnQ6OnVsaXR0bGUzMl90PiBIYXNoQnVja2V0czsKKworICBFcnJvciByZWFkKEJpbmFyeVN0cmVhbVJlYWRlciAmUmVhZGVyKTsKKworICB1aW50MzJfdCBnZXRWZXJTaWduYXR1cmUoKSBjb25zdCB7IHJldHVybiBIYXNoSGRyLT5WZXJTaWduYXR1cmU7IH0KKyAgdWludDMyX3QgZ2V0VmVySGVhZGVyKCkgY29uc3QgeyByZXR1cm4gSGFzaEhkci0+VmVySGRyOyB9CisgIHVpbnQzMl90IGdldEhhc2hSZWNvcmRTaXplKCkgY29uc3QgeyByZXR1cm4gSGFzaEhkci0+SHJTaXplOyB9CisgIHVpbnQzMl90IGdldE51bUJ1Y2tldHMoKSBjb25zdCB7IHJldHVybiBIYXNoSGRyLT5OdW1CdWNrZXRzOyB9CisKKyAgdHlwZWRlZiBHU0lIYXNoSGVhZGVyIGl0ZXJhdG9yOworICBHU0lIYXNoSXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBHU0lIYXNoSXRlcmF0b3IoSGFzaFJlY29yZHMuYmVnaW4oKSk7IH0KKyAgR1NJSGFzaEl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEdTSUhhc2hJdGVyYXRvcihIYXNoUmVjb3Jkcy5lbmQoKSk7IH0KK307CisKK2NsYXNzIEdsb2JhbHNTdHJlYW0geworcHVibGljOgorICBleHBsaWNpdCBHbG9iYWxzU3RyZWFtKHN0ZDo6dW5pcXVlX3B0cjxtc2Y6Ok1hcHBlZEJsb2NrU3RyZWFtPiBTdHJlYW0pOworICB+R2xvYmFsc1N0cmVhbSgpOworICBjb25zdCBHU0lIYXNoVGFibGUgJmdldEdsb2JhbHNUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIEdsb2JhbHNUYWJsZTsgfQorICBFcnJvciByZWxvYWQoKTsKKworcHJpdmF0ZToKKyAgR1NJSGFzaFRhYmxlIEdsb2JhbHNUYWJsZTsKKyAgc3RkOjp1bmlxdWVfcHRyPG1zZjo6TWFwcGVkQmxvY2tTdHJlYW0+IFN0cmVhbTsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9IYXNoLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0hhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjExZDQzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9IYXNoLmgKQEAgLTAsMCArMSwyNyBAQAorLy89PT0tIEhhc2guaCAtIFBEQiBoYXNoIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX0hBU0hfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX0hBU0hfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKKwordWludDMyX3QgaGFzaFN0cmluZ1YxKFN0cmluZ1JlZiBTdHIpOwordWludDMyX3QgaGFzaFN0cmluZ1YyKFN0cmluZ1JlZiBTdHIpOwordWludDMyX3QgaGFzaEJ1ZmZlclY4KEFycmF5UmVmPHVpbnQ4X3Q+IERhdGEpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgcGRiCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9IQVNIX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvSGFzaFRhYmxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0hhc2hUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0Y2M2MTcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0hhc2hUYWJsZS5oCkBAIC0wLDAgKzEsMzM1IEBACisvLz09PS0gSGFzaFRhYmxlLmggLSBQREIgSGFzaCBUYWJsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfSEFTSFRBQkxFX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9IQVNIVEFCTEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3BhcnNlQml0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlYWRlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1Xcml0ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCaW5hcnlTdHJlYW1SZWFkZXI7CitjbGFzcyBCaW5hcnlTdHJlYW1Xcml0ZXI7CisKK25hbWVzcGFjZSBwZGIgeworCitFcnJvciByZWFkU3BhcnNlQml0VmVjdG9yKEJpbmFyeVN0cmVhbVJlYWRlciAmU3RyZWFtLCBTcGFyc2VCaXRWZWN0b3I8PiAmVik7CitFcnJvciB3cml0ZVNwYXJzZUJpdFZlY3RvcihCaW5hcnlTdHJlYW1Xcml0ZXIgJldyaXRlciwgU3BhcnNlQml0VmVjdG9yPD4gJlZlYyk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVQsIHR5cGVuYW1lIFRyYWl0c1Q+IGNsYXNzIEhhc2hUYWJsZTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVCwgdHlwZW5hbWUgVHJhaXRzVD4KK2NsYXNzIEhhc2hUYWJsZUl0ZXJhdG9yCisgICAgOiBwdWJsaWMgaXRlcmF0b3JfZmFjYWRlX2Jhc2U8SGFzaFRhYmxlSXRlcmF0b3I8VmFsdWVULCBUcmFpdHNUPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjx1aW50MzJfdCwgVmFsdWVUPj4geworICBmcmllbmQgSGFzaFRhYmxlPFZhbHVlVCwgVHJhaXRzVD47CisKKyAgSGFzaFRhYmxlSXRlcmF0b3IoY29uc3QgSGFzaFRhYmxlPFZhbHVlVCwgVHJhaXRzVD4gJk1hcCwgdWludDMyX3QgSW5kZXgsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNFbmQpCisgICAgICA6IE1hcCgmTWFwKSwgSW5kZXgoSW5kZXgpLCBJc0VuZChJc0VuZCkge30KKworcHVibGljOgorICBIYXNoVGFibGVJdGVyYXRvcihjb25zdCBIYXNoVGFibGU8VmFsdWVULCBUcmFpdHNUPiAmTWFwKSA6IE1hcCgmTWFwKSB7CisgICAgaW50IEkgPSBNYXAuUHJlc2VudC5maW5kX2ZpcnN0KCk7CisgICAgaWYgKEkgPT0gLTEpIHsKKyAgICAgIEluZGV4ID0gMDsKKyAgICAgIElzRW5kID0gdHJ1ZTsKKyAgICB9IGVsc2UgeworICAgICAgSW5kZXggPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oSSk7CisgICAgICBJc0VuZCA9IGZhbHNlOworICAgIH0KKyAgfQorCisgIEhhc2hUYWJsZUl0ZXJhdG9yICZvcGVyYXRvcj0oY29uc3QgSGFzaFRhYmxlSXRlcmF0b3IgJlIpIHsKKyAgICBNYXAgPSBSLk1hcDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEhhc2hUYWJsZUl0ZXJhdG9yICZSKSBjb25zdCB7CisgICAgaWYgKElzRW5kICYmIFIuSXNFbmQpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoSXNFbmQgIT0gUi5Jc0VuZCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHJldHVybiAoTWFwID09IFIuTWFwKSAmJiAoSW5kZXggPT0gUi5JbmRleCk7CisgIH0KKyAgY29uc3Qgc3RkOjpwYWlyPHVpbnQzMl90LCBWYWx1ZVQ+ICZvcGVyYXRvciooKSBjb25zdCB7CisgICAgYXNzZXJ0KE1hcC0+UHJlc2VudC50ZXN0KEluZGV4KSk7CisgICAgcmV0dXJuIE1hcC0+QnVja2V0c1tJbmRleF07CisgIH0KKyAgSGFzaFRhYmxlSXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgd2hpbGUgKEluZGV4IDwgTWFwLT5CdWNrZXRzLnNpemUoKSkgeworICAgICAgKytJbmRleDsKKyAgICAgIGlmIChNYXAtPlByZXNlbnQudGVzdChJbmRleCkpCisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBJc0VuZCA9IHRydWU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKK3ByaXZhdGU6CisgIGJvb2wgaXNFbmQoKSBjb25zdCB7IHJldHVybiBJc0VuZDsgfQorICB1aW50MzJfdCBpbmRleCgpIGNvbnN0IHsgcmV0dXJuIEluZGV4OyB9CisKKyAgY29uc3QgSGFzaFRhYmxlPFZhbHVlVCwgVHJhaXRzVD4gKk1hcDsKKyAgdWludDMyX3QgSW5kZXg7CisgIGJvb2wgSXNFbmQ7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFBkYkhhc2hUcmFpdHMge307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBQZGJIYXNoVHJhaXRzPHVpbnQzMl90PiB7CisgIHVpbnQzMl90IGhhc2hMb29rdXBLZXkodWludDMyX3QgTikgY29uc3QgeyByZXR1cm4gTjsgfQorICB1aW50MzJfdCBzdG9yYWdlS2V5VG9Mb29rdXBLZXkodWludDMyX3QgTikgY29uc3QgeyByZXR1cm4gTjsgfQorICB1aW50MzJfdCBsb29rdXBLZXlUb1N0b3JhZ2VLZXkodWludDMyX3QgTikgeyByZXR1cm4gTjsgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVCwgdHlwZW5hbWUgVHJhaXRzVCA9IFBkYkhhc2hUcmFpdHM8VmFsdWVUPj4KK2NsYXNzIEhhc2hUYWJsZSB7CisgIHVzaW5nIGl0ZXJhdG9yID0gSGFzaFRhYmxlSXRlcmF0b3I8VmFsdWVULCBUcmFpdHNUPjsKKyAgZnJpZW5kIGl0ZXJhdG9yOworCisgIHN0cnVjdCBIZWFkZXIgeworICAgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNpemU7CisgICAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQ2FwYWNpdHk7CisgIH07CisKKyAgdXNpbmcgQnVja2V0TGlzdCA9IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1aW50MzJfdCwgVmFsdWVUPj47CisKK3B1YmxpYzoKKyAgSGFzaFRhYmxlKCkgeyBCdWNrZXRzLnJlc2l6ZSg4KTsgfQorCisgIGV4cGxpY2l0IEhhc2hUYWJsZShUcmFpdHNUIFRyYWl0cykgOiBIYXNoVGFibGUoOCwgc3RkOjptb3ZlKFRyYWl0cykpIHt9CisgIEhhc2hUYWJsZSh1aW50MzJfdCBDYXBhY2l0eSwgVHJhaXRzVCBUcmFpdHMpIDogVHJhaXRzKFRyYWl0cykgeworICAgIEJ1Y2tldHMucmVzaXplKENhcGFjaXR5KTsKKyAgfQorCisgIEVycm9yIGxvYWQoQmluYXJ5U3RyZWFtUmVhZGVyICZTdHJlYW0pIHsKKyAgICBjb25zdCBIZWFkZXIgKkg7CisgICAgaWYgKGF1dG8gRUMgPSBTdHJlYW0ucmVhZE9iamVjdChIKSkKKyAgICAgIHJldHVybiBFQzsKKyAgICBpZiAoSC0+Q2FwYWNpdHkgPT0gMCkKKyAgICAgIHJldHVybiBtYWtlX2Vycm9yPFJhd0Vycm9yPihyYXdfZXJyb3JfY29kZTo6Y29ycnVwdF9maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIEhhc2ggVGFibGUgQ2FwYWNpdHkiKTsKKyAgICBpZiAoSC0+U2l6ZSA+IG1heExvYWQoSC0+Q2FwYWNpdHkpKQorICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8UmF3RXJyb3I+KHJhd19lcnJvcl9jb2RlOjpjb3JydXB0X2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgSGFzaCBUYWJsZSBTaXplIik7CisKKyAgICBCdWNrZXRzLnJlc2l6ZShILT5DYXBhY2l0eSk7CisKKyAgICBpZiAoYXV0byBFQyA9IHJlYWRTcGFyc2VCaXRWZWN0b3IoU3RyZWFtLCBQcmVzZW50KSkKKyAgICAgIHJldHVybiBFQzsKKyAgICBpZiAoUHJlc2VudC5jb3VudCgpICE9IEgtPlNpemUpCisgICAgICByZXR1cm4gbWFrZV9lcnJvcjxSYXdFcnJvcj4ocmF3X2Vycm9yX2NvZGU6OmNvcnJ1cHRfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHJlc2VudCBiaXQgdmVjdG9yIGRvZXMgbm90IG1hdGNoIHNpemUhIik7CisKKyAgICBpZiAoYXV0byBFQyA9IHJlYWRTcGFyc2VCaXRWZWN0b3IoU3RyZWFtLCBEZWxldGVkKSkKKyAgICAgIHJldHVybiBFQzsKKyAgICBpZiAoUHJlc2VudC5pbnRlcnNlY3RzKERlbGV0ZWQpKQorICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8UmF3RXJyb3I+KHJhd19lcnJvcl9jb2RlOjpjb3JydXB0X2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByZXNlbnQgYml0IHZlY3RvciBpbnRlcmVzZWN0cyBkZWxldGVkISIpOworCisgICAgZm9yICh1aW50MzJfdCBQIDogUHJlc2VudCkgeworICAgICAgaWYgKGF1dG8gRUMgPSBTdHJlYW0ucmVhZEludGVnZXIoQnVja2V0c1tQXS5maXJzdCkpCisgICAgICAgIHJldHVybiBFQzsKKyAgICAgIGNvbnN0IFZhbHVlVCAqVmFsdWU7CisgICAgICBpZiAoYXV0byBFQyA9IFN0cmVhbS5yZWFkT2JqZWN0KFZhbHVlKSkKKyAgICAgICAgcmV0dXJuIEVDOworICAgICAgQnVja2V0c1tQXS5zZWNvbmQgPSAqVmFsdWU7CisgICAgfQorCisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICB1aW50MzJfdCBjYWxjdWxhdGVTZXJpYWxpemVkTGVuZ3RoKCkgY29uc3QgeworICAgIHVpbnQzMl90IFNpemUgPSBzaXplb2YoSGVhZGVyKTsKKworICAgIGNvbnN0ZXhwciBpbnQgQml0c1BlcldvcmQgPSA4ICogc2l6ZW9mKHVpbnQzMl90KTsKKworICAgIGludCBOdW1CaXRzUCA9IFByZXNlbnQuZmluZF9sYXN0KCkgKyAxOworICAgIGludCBOdW1CaXRzRCA9IERlbGV0ZWQuZmluZF9sYXN0KCkgKyAxOworCisgICAgdWludDMyX3QgTnVtV29yZHNQID0gYWxpZ25UbyhOdW1CaXRzUCwgQml0c1BlcldvcmQpIC8gQml0c1BlcldvcmQ7CisgICAgdWludDMyX3QgTnVtV29yZHNEID0gYWxpZ25UbyhOdW1CaXRzRCwgQml0c1BlcldvcmQpIC8gQml0c1BlcldvcmQ7CisKKyAgICAvLyBQcmVzZW50IGJpdCBzZXQgbnVtYmVyIG9mIHdvcmRzICg0IGJ5dGVzKSwgZm9sbG93ZWQgYnkgdGhhdCBtYW55IGFjdHVhbAorICAgIC8vIHdvcmRzICg0IGJ5dGVzIGVhY2gpLgorICAgIFNpemUgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBTaXplICs9IE51bVdvcmRzUCAqIHNpemVvZih1aW50MzJfdCk7CisKKyAgICAvLyBEZWxldGVkIGJpdCBzZXQgbnVtYmVyIG9mIHdvcmRzICg0IGJ5dGVzKSwgZm9sbG93ZWQgYnkgdGhhdCBtYW55IGFjdHVhbAorICAgIC8vIHdvcmRzICg0IGJ5dGVzIGVhY2gpLgorICAgIFNpemUgKz0gc2l6ZW9mKHVpbnQzMl90KTsKKyAgICBTaXplICs9IE51bVdvcmRzRCAqIHNpemVvZih1aW50MzJfdCk7CisKKyAgICAvLyBPbmUgKEtleSwgVmFsdWVUKSBwYWlyIGZvciBlYWNoIGVudHJ5IFByZXNlbnQuCisgICAgU2l6ZSArPSAoc2l6ZW9mKHVpbnQzMl90KSArIHNpemVvZihWYWx1ZVQpKSAqIHNpemUoKTsKKworICAgIHJldHVybiBTaXplOworICB9CisKKyAgRXJyb3IgY29tbWl0KEJpbmFyeVN0cmVhbVdyaXRlciAmV3JpdGVyKSBjb25zdCB7CisgICAgSGVhZGVyIEg7CisgICAgSC5TaXplID0gc2l6ZSgpOworICAgIEguQ2FwYWNpdHkgPSBjYXBhY2l0eSgpOworICAgIGlmIChhdXRvIEVDID0gV3JpdGVyLndyaXRlT2JqZWN0KEgpKQorICAgICAgcmV0dXJuIEVDOworCisgICAgaWYgKGF1dG8gRUMgPSB3cml0ZVNwYXJzZUJpdFZlY3RvcihXcml0ZXIsIFByZXNlbnQpKQorICAgICAgcmV0dXJuIEVDOworCisgICAgaWYgKGF1dG8gRUMgPSB3cml0ZVNwYXJzZUJpdFZlY3RvcihXcml0ZXIsIERlbGV0ZWQpKQorICAgICAgcmV0dXJuIEVDOworCisgICAgZm9yIChjb25zdCBhdXRvICZFbnRyeSA6ICp0aGlzKSB7CisgICAgICBpZiAoYXV0byBFQyA9IFdyaXRlci53cml0ZUludGVnZXIoRW50cnkuZmlyc3QpKQorICAgICAgICByZXR1cm4gRUM7CisgICAgICBpZiAoYXV0byBFQyA9IFdyaXRlci53cml0ZU9iamVjdChFbnRyeS5zZWNvbmQpKQorICAgICAgICByZXR1cm4gRUM7CisgICAgfQorICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBCdWNrZXRzLnJlc2l6ZSg4KTsKKyAgICBQcmVzZW50LmNsZWFyKCk7CisgICAgRGVsZXRlZC5jbGVhcigpOworICB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHNpemUoKSA9PSAwOyB9CisgIHVpbnQzMl90IGNhcGFjaXR5KCkgY29uc3QgeyByZXR1cm4gQnVja2V0cy5zaXplKCk7IH0KKyAgdWludDMyX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFByZXNlbnQuY291bnQoKTsgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoKnRoaXMpOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGl0ZXJhdG9yKCp0aGlzLCAwLCB0cnVlKTsgfQorCisgIC8vLyBGaW5kIHRoZSBlbnRyeSB3aG9zZSBrZXkgaGFzIHRoZSBzcGVjaWZpZWQgaGFzaCB2YWx1ZSwgdXNpbmcgdGhlIHNwZWNpZmllZAorICAvLy8gdHJhaXRzIGRlZmluaW5nIGhhc2ggZnVuY3Rpb24gYW5kIGVxdWFsaXR5LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5PiBpdGVyYXRvciBmaW5kX2FzKGNvbnN0IEtleSAmSykgY29uc3QgeworICAgIHVpbnQzMl90IEggPSBUcmFpdHMuaGFzaExvb2t1cEtleShLKSAlIGNhcGFjaXR5KCk7CisgICAgdWludDMyX3QgSSA9IEg7CisgICAgT3B0aW9uYWw8dWludDMyX3Q+IEZpcnN0VW51c2VkOworICAgIGRvIHsKKyAgICAgIGlmIChpc1ByZXNlbnQoSSkpIHsKKyAgICAgICAgaWYgKFRyYWl0cy5zdG9yYWdlS2V5VG9Mb29rdXBLZXkoQnVja2V0c1tJXS5maXJzdCkgPT0gSykKKyAgICAgICAgICByZXR1cm4gaXRlcmF0b3IoKnRoaXMsIEksIGZhbHNlKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmICghRmlyc3RVbnVzZWQpCisgICAgICAgICAgRmlyc3RVbnVzZWQgPSBJOworICAgICAgICAvLyBJbnNlcnRpb24gb2NjdXJzIHZpYSBsaW5lYXIgcHJvYmluZyBmcm9tIHRoZSBzbG90IGhpbnQsIGFuZCB3aWxsIGJlCisgICAgICAgIC8vIGluc2VydGVkIGF0IHRoZSBmaXJzdCBlbXB0eSAvIGRlbGV0ZWQgbG9jYXRpb24uICBUaGVyZWZvcmUsIGlmIHdlIGFyZQorICAgICAgICAvLyBwcm9iaW5nIGFuZCBmaW5kIGEgbG9jYXRpb24gdGhhdCBpcyBuZWl0aGVyIHByZXNlbnQgbm9yIGRlbGV0ZWQsIHRoZW4KKyAgICAgICAgLy8gbm90aGluZyBtdXN0IGhhdmUgRVZFUiBiZWVuIGluc2VydGVkIGF0IHRoaXMgbG9jYXRpb24sIGFuZCB0aHVzIGl0IGlzCisgICAgICAgIC8vIG5vdCBwb3NzaWJsZSBmb3IgYSBtYXRjaGluZyB2YWx1ZSB0byBvY2N1ciBsYXRlci4KKyAgICAgICAgaWYgKCFpc0RlbGV0ZWQoSSkpCisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBJID0gKEkgKyAxKSAlIGNhcGFjaXR5KCk7CisgICAgfSB3aGlsZSAoSSAhPSBIKTsKKworICAgIC8vIFRoZSBvbmx5IHdheSBGaXJzdFVudXNlZCB3b3VsZCBub3QgYmUgc2V0IGlzIGlmIGV2ZXJ5IHNpbmdsZSBlbnRyeSBpbiB0aGUKKyAgICAvLyB0YWJsZSB3ZXJlIFByZXNlbnQuICBCdXQgdGhpcyB3b3VsZCB2aW9sYXRlIHRoZSBsb2FkIGZhY3RvciBjb25zdHJhaW50cworICAgIC8vIHRoYXQgd2UgaW1wb3NlLCBzbyBpdCBzaG91bGQgbmV2ZXIgaGFwcGVuLgorICAgIGFzc2VydChGaXJzdFVudXNlZCk7CisgICAgcmV0dXJuIGl0ZXJhdG9yKCp0aGlzLCAqRmlyc3RVbnVzZWQsIHRydWUpOworICB9CisKKyAgLy8vIFNldCB0aGUgZW50cnkgdXNpbmcgYSBrZXkgdHlwZSB0aGF0IHRoZSBzcGVjaWZpZWQgVHJhaXRzIGNhbiBjb252ZXJ0CisgIC8vLyBmcm9tIGEgcmVhbCBrZXkgdG8gYW4gaW50ZXJuYWwga2V5LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5PiBib29sIHNldF9hcyhjb25zdCBLZXkgJkssIFZhbHVlVCBWKSB7CisgICAgcmV0dXJuIHNldF9hc19pbnRlcm5hbChLLCBzdGQ6Om1vdmUoViksIE5vbmUpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEtleT4gVmFsdWVUIGdldChjb25zdCBLZXkgJkspIGNvbnN0IHsKKyAgICBhdXRvIEl0ZXIgPSBmaW5kX2FzKEspOworICAgIGFzc2VydChJdGVyICE9IGVuZCgpKTsKKyAgICByZXR1cm4gKCpJdGVyKS5zZWNvbmQ7CisgIH0KKworcHJvdGVjdGVkOgorICBib29sIGlzUHJlc2VudCh1aW50MzJfdCBLKSBjb25zdCB7IHJldHVybiBQcmVzZW50LnRlc3QoSyk7IH0KKyAgYm9vbCBpc0RlbGV0ZWQodWludDMyX3QgSykgY29uc3QgeyByZXR1cm4gRGVsZXRlZC50ZXN0KEspOyB9CisKKyAgVHJhaXRzVCBUcmFpdHM7CisgIEJ1Y2tldExpc3QgQnVja2V0czsKKyAgbXV0YWJsZSBTcGFyc2VCaXRWZWN0b3I8PiBQcmVzZW50OworICBtdXRhYmxlIFNwYXJzZUJpdFZlY3Rvcjw+IERlbGV0ZWQ7CisKK3ByaXZhdGU6CisgIC8vLyBTZXQgdGhlIGVudHJ5IHVzaW5nIGEga2V5IHR5cGUgdGhhdCB0aGUgc3BlY2lmaWVkIFRyYWl0cyBjYW4gY29udmVydAorICAvLy8gZnJvbSBhIHJlYWwga2V5IHRvIGFuIGludGVybmFsIGtleS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KKyAgYm9vbCBzZXRfYXNfaW50ZXJuYWwoY29uc3QgS2V5ICZLLCBWYWx1ZVQgViwgT3B0aW9uYWw8dWludDMyX3Q+IEludGVybmFsS2V5KSB7CisgICAgYXV0byBFbnRyeSA9IGZpbmRfYXMoSyk7CisgICAgaWYgKEVudHJ5ICE9IGVuZCgpKSB7CisgICAgICBhc3NlcnQoaXNQcmVzZW50KEVudHJ5LmluZGV4KCkpKTsKKyAgICAgIGFzc2VydChUcmFpdHMuc3RvcmFnZUtleVRvTG9va3VwS2V5KEJ1Y2tldHNbRW50cnkuaW5kZXgoKV0uZmlyc3QpID09IEspOworICAgICAgLy8gV2UncmUgdXBkYXRpbmcsIG5vIG5lZWQgdG8gZG8gYW55dGhpbmcgc3BlY2lhbC4KKyAgICAgIEJ1Y2tldHNbRW50cnkuaW5kZXgoKV0uc2Vjb25kID0gVjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBhdXRvICZCID0gQnVja2V0c1tFbnRyeS5pbmRleCgpXTsKKyAgICBhc3NlcnQoIWlzUHJlc2VudChFbnRyeS5pbmRleCgpKSk7CisgICAgYXNzZXJ0KEVudHJ5LmlzRW5kKCkpOworICAgIEIuZmlyc3QgPSBJbnRlcm5hbEtleSA/ICpJbnRlcm5hbEtleSA6IFRyYWl0cy5sb29rdXBLZXlUb1N0b3JhZ2VLZXkoSyk7CisgICAgQi5zZWNvbmQgPSBWOworICAgIFByZXNlbnQuc2V0KEVudHJ5LmluZGV4KCkpOworICAgIERlbGV0ZWQucmVzZXQoRW50cnkuaW5kZXgoKSk7CisKKyAgICBncm93KCk7CisKKyAgICBhc3NlcnQoKGZpbmRfYXMoSykpICE9IGVuZCgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHN0YXRpYyB1aW50MzJfdCBtYXhMb2FkKHVpbnQzMl90IGNhcGFjaXR5KSB7IHJldHVybiBjYXBhY2l0eSAqIDIgLyAzICsgMTsgfQorCisgIHZvaWQgZ3JvdygpIHsKKyAgICB1aW50MzJfdCBTID0gc2l6ZSgpOworICAgIHVpbnQzMl90IE1heExvYWQgPSBtYXhMb2FkKGNhcGFjaXR5KCkpOworICAgIGlmIChTIDwgbWF4TG9hZChjYXBhY2l0eSgpKSkKKyAgICAgIHJldHVybjsKKyAgICBhc3NlcnQoY2FwYWNpdHkoKSAhPSBVSU5UMzJfTUFYICYmICJDYW4ndCBncm93IEhhc2ggdGFibGUhIik7CisKKyAgICB1aW50MzJfdCBOZXdDYXBhY2l0eSA9IChjYXBhY2l0eSgpIDw9IElOVDMyX01BWCkgPyBNYXhMb2FkICogMiA6IFVJTlQzMl9NQVg7CisKKyAgICAvLyBHcm93aW5nIHJlcXVpcmVzIHJlYnVpbGRpbmcgdGhlIHRhYmxlIGFuZCByZS1oYXNoaW5nIGV2ZXJ5IGl0ZW0uICBNYWtlIGEKKyAgICAvLyBjb3B5IHdpdGggYSBsYXJnZXIgY2FwYWNpdHksIGluc2VydCBldmVyeXRoaW5nIGludG8gdGhlIGNvcHksIHRoZW4gc3dhcAorICAgIC8vIGl0IGluLgorICAgIEhhc2hUYWJsZSBOZXdNYXAoTmV3Q2FwYWNpdHksIFRyYWl0cyk7CisgICAgZm9yIChhdXRvIEkgOiBQcmVzZW50KSB7CisgICAgICBhdXRvIExvb2t1cEtleSA9IFRyYWl0cy5zdG9yYWdlS2V5VG9Mb29rdXBLZXkoQnVja2V0c1tJXS5maXJzdCk7CisgICAgICBOZXdNYXAuc2V0X2FzX2ludGVybmFsKExvb2t1cEtleSwgQnVja2V0c1tJXS5zZWNvbmQsIEJ1Y2tldHNbSV0uZmlyc3QpOworICAgIH0KKworICAgIEJ1Y2tldHMuc3dhcChOZXdNYXAuQnVja2V0cyk7CisgICAgc3RkOjpzd2FwKFByZXNlbnQsIE5ld01hcC5QcmVzZW50KTsKKyAgICBzdGQ6OnN3YXAoRGVsZXRlZCwgTmV3TWFwLkRlbGV0ZWQpOworICAgIGFzc2VydChjYXBhY2l0eSgpID09IE5ld0NhcGFjaXR5KTsKKyAgICBhc3NlcnQoc2l6ZSgpID09IFMpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgcGRiCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX0hBU0hUQUJMRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0lTZWN0aW9uQ29udHJpYlZpc2l0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvSVNlY3Rpb25Db250cmliVmlzaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMDBkNmEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0lTZWN0aW9uQ29udHJpYlZpc2l0b3IuaApAQCAtMCwwICsxLDMwIEBACisvLz09PS0gSVNlY3Rpb25Db250cmliVmlzaXRvci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfSVNFQ1RJT05DT05UUklCVklTSVRPUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfSVNFQ1RJT05DT05UUklCVklTSVRPUl9ICisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworCitzdHJ1Y3QgU2VjdGlvbkNvbnRyaWI7CitzdHJ1Y3QgU2VjdGlvbkNvbnRyaWIyOworCitjbGFzcyBJU2VjdGlvbkNvbnRyaWJWaXNpdG9yIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+SVNlY3Rpb25Db250cmliVmlzaXRvcigpID0gZGVmYXVsdDsKKworICB2aXJ0dWFsIHZvaWQgdmlzaXQoY29uc3QgU2VjdGlvbkNvbnRyaWIgJkMpID0gMDsKKyAgdmlydHVhbCB2b2lkIHZpc2l0KGNvbnN0IFNlY3Rpb25Db250cmliMiAmQykgPSAwOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHBkYgorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfSVNFQ1RJT05DT05UUklCVklTSVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0luZm9TdHJlYW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvSW5mb1N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZWI0MjMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0luZm9TdHJlYW0uaApAQCAtMCwwICsxLDc1IEBACisvLz09PS0gSW5mb1N0cmVhbS5oIC0gUERCIEluZm8gU3RyZWFtIChTdHJlYW0gMSkgQWNjZXNzIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUERCSU5GT1NUUkVBTV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUERCSU5GT1NUUkVBTV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRtYXNrRW51bS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0dVSUQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9NU0YvTWFwcGVkQmxvY2tTdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hbWVkU3RyZWFtTWFwLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdDb25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvUERCVHlwZXMuaCIKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBJbmZvU3RyZWFtQnVpbGRlcjsKK2NsYXNzIFBEQkZpbGU7CisKK2NsYXNzIEluZm9TdHJlYW0geworICBmcmllbmQgY2xhc3MgSW5mb1N0cmVhbUJ1aWxkZXI7CisKK3B1YmxpYzoKKyAgSW5mb1N0cmVhbShzdGQ6OnVuaXF1ZV9wdHI8bXNmOjpNYXBwZWRCbG9ja1N0cmVhbT4gU3RyZWFtKTsKKworICBFcnJvciByZWxvYWQoKTsKKworICB1aW50MzJfdCBnZXRTdHJlYW1TaXplKCkgY29uc3Q7CisKKyAgY29uc3QgSW5mb1N0cmVhbUhlYWRlciAqZ2V0SGVhZGVyKCkgY29uc3QgeyByZXR1cm4gSGVhZGVyOyB9CisKKyAgYm9vbCBjb250YWluc0lkU3RyZWFtKCkgY29uc3Q7CisgIFBkYlJhd19JbXBsVmVyIGdldFZlcnNpb24oKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0U2lnbmF0dXJlKCkgY29uc3Q7CisgIHVpbnQzMl90IGdldEFnZSgpIGNvbnN0OworICBjb2Rldmlldzo6R1VJRCBnZXRHdWlkKCkgY29uc3Q7CisgIHVpbnQzMl90IGdldE5hbWVkU3RyZWFtTWFwQnl0ZVNpemUoKSBjb25zdDsKKworICBQZGJSYXdfRmVhdHVyZXMgZ2V0RmVhdHVyZXMoKSBjb25zdDsKKyAgQXJyYXlSZWY8UGRiUmF3X0ZlYXR1cmVTaWc+IGdldEZlYXR1cmVTaWduYXR1cmVzKCkgY29uc3Q7CisKKyAgY29uc3QgTmFtZWRTdHJlYW1NYXAgJmdldE5hbWVkU3RyZWFtcygpIGNvbnN0OworCisgIEJpbmFyeVN1YnN0cmVhbVJlZiBnZXROYW1lZFN0cmVhbXNCdWZmZXIoKSBjb25zdDsKKworICB1aW50MzJfdCBnZXROYW1lZFN0cmVhbUluZGV4KGxsdm06OlN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKyAgU3RyaW5nTWFwPHVpbnQzMl90PiBuYW1lZF9zdHJlYW1zKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIHN0ZDo6dW5pcXVlX3B0cjxtc2Y6Ok1hcHBlZEJsb2NrU3RyZWFtPiBTdHJlYW07CisKKyAgY29uc3QgSW5mb1N0cmVhbUhlYWRlciAqSGVhZGVyOworCisgIEJpbmFyeVN1YnN0cmVhbVJlZiBTdWJOYW1lZFN0cmVhbXM7CisKKyAgc3RkOjp2ZWN0b3I8UGRiUmF3X0ZlYXR1cmVTaWc+IEZlYXR1cmVTaWduYXR1cmVzOworICBQZGJSYXdfRmVhdHVyZXMgRmVhdHVyZXMgPSBQZGJGZWF0dXJlTm9uZTsKKworICB1aW50MzJfdCBOYW1lZFN0cmVhbU1hcEJ5dGVTaXplID0gMDsKKworICBOYW1lZFN0cmVhbU1hcCBOYW1lZFN0cmVhbXM7Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvSW5mb1N0cmVhbUJ1aWxkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvSW5mb1N0cmVhbUJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTllOGFkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9JbmZvU3RyZWFtQnVpbGRlci5oCkBAIC0wLDAgKzEsNjggQEAKKy8vPT09LSBJbmZvU3RyZWFtQnVpbGRlci5oIC0gUERCIEluZm8gU3RyZWFtIENyZWF0aW9uIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1JBV19QREJJTkZPU1RSRUFNQlVJTERFUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUERCSU5GT1NUUkVBTUJVSUxERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmFtZWRTdHJlYW1NYXAuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1BEQkZpbGUuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9QREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZjsKKworbmFtZXNwYWNlIG1zZiB7CitjbGFzcyBNU0ZCdWlsZGVyOworfQorbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBQREJGaWxlOworY2xhc3MgTmFtZWRTdHJlYW1NYXA7CisKK2NsYXNzIEluZm9TdHJlYW1CdWlsZGVyIHsKK3B1YmxpYzoKKyAgSW5mb1N0cmVhbUJ1aWxkZXIobXNmOjpNU0ZCdWlsZGVyICZNc2YsIE5hbWVkU3RyZWFtTWFwICZOYW1lZFN0cmVhbXMpOworICBJbmZvU3RyZWFtQnVpbGRlcihjb25zdCBJbmZvU3RyZWFtQnVpbGRlciAmKSA9IGRlbGV0ZTsKKyAgSW5mb1N0cmVhbUJ1aWxkZXIgJm9wZXJhdG9yPShjb25zdCBJbmZvU3RyZWFtQnVpbGRlciAmKSA9IGRlbGV0ZTsKKworICB2b2lkIHNldFZlcnNpb24oUGRiUmF3X0ltcGxWZXIgVik7CisgIHZvaWQgc2V0U2lnbmF0dXJlKHVpbnQzMl90IFMpOworICB2b2lkIHNldEFnZSh1aW50MzJfdCBBKTsKKyAgdm9pZCBzZXRHdWlkKGNvZGV2aWV3OjpHVUlEIEcpOworICB2b2lkIGFkZEZlYXR1cmUoUGRiUmF3X0ZlYXR1cmVTaWcgU2lnKTsKKworICB1aW50MzJfdCBnZXRBZ2UoKSBjb25zdCB7IHJldHVybiBBZ2U7IH0KKyAgY29kZXZpZXc6OkdVSUQgZ2V0R3VpZCgpIGNvbnN0IHsgcmV0dXJuIEd1aWQ7IH0KKyAgT3B0aW9uYWw8dWludDMyX3Q+IGdldFNpZ25hdHVyZSgpIGNvbnN0IHsgcmV0dXJuIFNpZ25hdHVyZTsgfQorCisgIHVpbnQzMl90IGZpbmFsaXplKCk7CisKKyAgRXJyb3IgZmluYWxpemVNc2ZMYXlvdXQoKTsKKworICBFcnJvciBjb21taXQoY29uc3QgbXNmOjpNU0ZMYXlvdXQgJkxheW91dCwKKyAgICAgICAgICAgICAgIFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmIEJ1ZmZlcikgY29uc3Q7CisKK3ByaXZhdGU6CisgIG1zZjo6TVNGQnVpbGRlciAmTXNmOworCisgIHN0ZDo6dmVjdG9yPFBkYlJhd19GZWF0dXJlU2lnPiBGZWF0dXJlczsKKyAgUGRiUmF3X0ltcGxWZXIgVmVyOworICB1aW50MzJfdCBBZ2U7CisgIE9wdGlvbmFsPHVpbnQzMl90PiBTaWduYXR1cmU7CisgIGNvZGV2aWV3OjpHVUlEIEd1aWQ7CisKKyAgTmFtZWRTdHJlYW1NYXAgJk5hbWVkU3RyZWFtczsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9Nb2R1bGVEZWJ1Z1N0cmVhbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9Nb2R1bGVEZWJ1Z1N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2MDIyNjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL01vZHVsZURlYnVnU3RyZWFtLmgKQEAgLTAsMCArMSw4NiBAQAorLy89PT0tIE1vZHVsZURlYnVnU3RyZWFtLmggLSBQREIgTW9kdWxlIEluZm8gU3RyZWFtIEFjY2VzcyAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX01PRFVMRURFQlVHU1RSRUFNX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9NT0RVTEVERUJVR1NUUkVBTV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnQ2hlY2tzdW1zU3Vic2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3Vic2VjdGlvblJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL01TRi9NYXBwZWRCbG9ja1N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIERiaU1vZHVsZURlc2NyaXB0b3I7CisKK2NsYXNzIE1vZHVsZURlYnVnU3RyZWFtUmVmIHsKKyAgdXNpbmcgRGVidWdTdWJzZWN0aW9uSXRlcmF0b3IgPSBjb2Rldmlldzo6RGVidWdTdWJzZWN0aW9uQXJyYXk6Okl0ZXJhdG9yOworCitwdWJsaWM6CisgIE1vZHVsZURlYnVnU3RyZWFtUmVmKGNvbnN0IERiaU1vZHVsZURlc2NyaXB0b3IgJk1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPG1zZjo6TWFwcGVkQmxvY2tTdHJlYW0+IFN0cmVhbSk7CisgIE1vZHVsZURlYnVnU3RyZWFtUmVmKE1vZHVsZURlYnVnU3RyZWFtUmVmICYmT3RoZXIpID0gZGVmYXVsdDsKKyAgTW9kdWxlRGVidWdTdHJlYW1SZWYoY29uc3QgTW9kdWxlRGVidWdTdHJlYW1SZWYgJk90aGVyKSA9IGRlZmF1bHQ7CisgIH5Nb2R1bGVEZWJ1Z1N0cmVhbVJlZigpOworCisgIEVycm9yIHJlbG9hZCgpOworCisgIHVpbnQzMl90IHNpZ25hdHVyZSgpIGNvbnN0IHsgcmV0dXJuIFNpZ25hdHVyZTsgfQorCisgIGl0ZXJhdG9yX3JhbmdlPGNvZGV2aWV3OjpDVlN5bWJvbEFycmF5OjpJdGVyYXRvcj4KKyAgc3ltYm9scyhib29sICpIYWRFcnJvcikgY29uc3Q7CisKKyAgY29uc3QgY29kZXZpZXc6OkNWU3ltYm9sQXJyYXkgJmdldFN5bWJvbEFycmF5KCkgY29uc3QgeyByZXR1cm4gU3ltYm9sQXJyYXk7IH0KKworICBCaW5hcnlTdWJzdHJlYW1SZWYgZ2V0U3ltYm9sc1N1YnN0cmVhbSgpIGNvbnN0OworICBCaW5hcnlTdWJzdHJlYW1SZWYgZ2V0QzExTGluZXNTdWJzdHJlYW0oKSBjb25zdDsKKyAgQmluYXJ5U3Vic3RyZWFtUmVmIGdldEMxM0xpbmVzU3Vic3RyZWFtKCkgY29uc3Q7CisgIEJpbmFyeVN1YnN0cmVhbVJlZiBnZXRHbG9iYWxSZWZzU3Vic3RyZWFtKCkgY29uc3Q7CisKKyAgTW9kdWxlRGVidWdTdHJlYW1SZWYgJm9wZXJhdG9yPShNb2R1bGVEZWJ1Z1N0cmVhbVJlZiAmJk90aGVyKSA9IGRlZmF1bHQ7CisKKyAgaXRlcmF0b3JfcmFuZ2U8RGVidWdTdWJzZWN0aW9uSXRlcmF0b3I+IHN1YnNlY3Rpb25zKCkgY29uc3Q7CisgIGNvZGV2aWV3OjpEZWJ1Z1N1YnNlY3Rpb25BcnJheSBnZXRTdWJzZWN0aW9uc0FycmF5KCkgY29uc3QgeworICAgIHJldHVybiBTdWJzZWN0aW9uczsKKyAgfQorCisgIGJvb2wgaGFzRGVidWdTdWJzZWN0aW9ucygpIGNvbnN0OworCisgIEVycm9yIGNvbW1pdCgpOworCisgIEV4cGVjdGVkPGNvZGV2aWV3OjpEZWJ1Z0NoZWNrc3Vtc1N1YnNlY3Rpb25SZWY+CisgIGZpbmRDaGVja3N1bXNTdWJzZWN0aW9uKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIGNvbnN0IERiaU1vZHVsZURlc2NyaXB0b3IgJk1vZDsKKworICB1aW50MzJfdCBTaWduYXR1cmU7CisKKyAgc3RkOjpzaGFyZWRfcHRyPG1zZjo6TWFwcGVkQmxvY2tTdHJlYW0+IFN0cmVhbTsKKworICBjb2Rldmlldzo6Q1ZTeW1ib2xBcnJheSBTeW1ib2xBcnJheTsKKworICBCaW5hcnlTdWJzdHJlYW1SZWYgU3ltYm9sc1N1YnN0cmVhbTsKKyAgQmluYXJ5U3Vic3RyZWFtUmVmIEMxMUxpbmVzU3Vic3RyZWFtOworICBCaW5hcnlTdWJzdHJlYW1SZWYgQzEzTGluZXNTdWJzdHJlYW07CisgIEJpbmFyeVN1YnN0cmVhbVJlZiBHbG9iYWxSZWZzU3Vic3RyZWFtOworCisgIGNvZGV2aWV3OjpEZWJ1Z1N1YnNlY3Rpb25BcnJheSBTdWJzZWN0aW9uczsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBwZGIKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX01PRFVMRURFQlVHU1RSRUFNX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmFtZWRTdHJlYW1NYXAuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmFtZWRTdHJlYW1NYXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWI4ZjFiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYW1lZFN0cmVhbU1hcC5oCkBAIC0wLDAgKzEsNzMgQEAKKy8vPT09LSBOYW1lZFN0cmVhbU1hcC5oIC0gUERCIE5hbWVkIFN0cmVhbSBNYXAgLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9OQU1FRFNUUkVBTU1BUF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfTkFNRURTVFJFQU1NQVBfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvSGFzaFRhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCaW5hcnlTdHJlYW1SZWFkZXI7CitjbGFzcyBCaW5hcnlTdHJlYW1Xcml0ZXI7CisKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBOYW1lZFN0cmVhbU1hcDsKKworc3RydWN0IE5hbWVkU3RyZWFtTWFwVHJhaXRzIHsKKyAgTmFtZWRTdHJlYW1NYXAgKk5TOworCisgIGV4cGxpY2l0IE5hbWVkU3RyZWFtTWFwVHJhaXRzKE5hbWVkU3RyZWFtTWFwICZOUyk7CisgIHVpbnQxNl90IGhhc2hMb29rdXBLZXkoU3RyaW5nUmVmIFMpIGNvbnN0OworICBTdHJpbmdSZWYgc3RvcmFnZUtleVRvTG9va3VwS2V5KHVpbnQzMl90IE9mZnNldCkgY29uc3Q7CisgIHVpbnQzMl90IGxvb2t1cEtleVRvU3RvcmFnZUtleShTdHJpbmdSZWYgUyk7Cit9OworCitjbGFzcyBOYW1lZFN0cmVhbU1hcCB7CisgIGZyaWVuZCBjbGFzcyBOYW1lZFN0cmVhbU1hcEJ1aWxkZXI7CisKK3B1YmxpYzoKKyAgTmFtZWRTdHJlYW1NYXAoKTsKKworICBFcnJvciBsb2FkKEJpbmFyeVN0cmVhbVJlYWRlciAmU3RyZWFtKTsKKyAgRXJyb3IgY29tbWl0KEJpbmFyeVN0cmVhbVdyaXRlciAmV3JpdGVyKSBjb25zdDsKKyAgdWludDMyX3QgY2FsY3VsYXRlU2VyaWFsaXplZExlbmd0aCgpIGNvbnN0OworCisgIHVpbnQzMl90IHNpemUoKSBjb25zdDsKKyAgYm9vbCBnZXQoU3RyaW5nUmVmIFN0cmVhbSwgdWludDMyX3QgJlN0cmVhbU5vKSBjb25zdDsKKyAgdm9pZCBzZXQoU3RyaW5nUmVmIFN0cmVhbSwgdWludDMyX3QgU3RyZWFtTm8pOworCisgIHVpbnQzMl90IGFwcGVuZFN0cmluZ0RhdGEoU3RyaW5nUmVmIFMpOworICBTdHJpbmdSZWYgZ2V0U3RyaW5nKHVpbnQzMl90IE9mZnNldCkgY29uc3Q7CisgIHVpbnQzMl90IGhhc2hTdHJpbmcodWludDMyX3QgT2Zmc2V0KSBjb25zdDsKKworICBTdHJpbmdNYXA8dWludDMyX3Q+IGVudHJpZXMoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgTmFtZWRTdHJlYW1NYXBUcmFpdHMgSGFzaFRyYWl0czsKKyAgLy8vIENsb3NlZCBoYXNoIHRhYmxlIGZyb20gT2Zmc2V0IC0+IFN0cmVhbU51bWJlciwgd2hlcmUgT2Zmc2V0IGlzIHRoZSBvZmZzZXQKKyAgLy8vIG9mIHRoZSBzdHJlYW0gbmFtZSBpbiBOYW1lc0J1ZmZlci4KKyAgSGFzaFRhYmxlPHN1cHBvcnQ6OnVsaXR0bGUzMl90LCBOYW1lZFN0cmVhbU1hcFRyYWl0cz4gT2Zmc2V0SW5kZXhNYXA7CisKKyAgLy8vIEJ1ZmZlciBvZiBzdHJpbmcgZGF0YS4KKyAgc3RkOjp2ZWN0b3I8Y2hhcj4gTmFtZXNCdWZmZXI7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgcGRiCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX05BTUVEU1RSRUFNTUFQX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlQnVpbHRpblN5bWJvbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYXRpdmVCdWlsdGluU3ltYm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY1MzJjNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlQnVpbHRpblN5bWJvbC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8vPT09LSBOYXRpdmVCdWlsdGluU3ltYm9sLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9OQVRJVkVCVUlMVElOU1lNQk9MX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9OQVRJVkVCVUlMVElOU1lNQk9MX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlUmF3U3ltYm9sLmgiCisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIE5hdGl2ZVNlc3Npb247CisKK2NsYXNzIE5hdGl2ZUJ1aWx0aW5TeW1ib2wgOiBwdWJsaWMgTmF0aXZlUmF3U3ltYm9sIHsKK3B1YmxpYzoKKyAgTmF0aXZlQnVpbHRpblN5bWJvbChOYXRpdmVTZXNzaW9uICZQREJTZXNzaW9uLCBTeW1JbmRleElkIElkLAorICAgICAgICAgICAgICAgICAgICAgIFBEQl9CdWlsdGluVHlwZSBULCB1aW50NjRfdCBMKTsKKyAgfk5hdGl2ZUJ1aWx0aW5TeW1ib2woKSBvdmVycmlkZTsKKworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxOYXRpdmVSYXdTeW1ib2w+IGNsb25lKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUywgaW50IEluZGVudCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgUERCX1N5bVR5cGUgZ2V0U3ltVGFnKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgUERCX0J1aWx0aW5UeXBlIGdldEJ1aWx0aW5UeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNDb25zdFR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0TGVuZ3RoKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNVbmFsaWduZWRUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNWb2xhdGlsZVR5cGUoKSBjb25zdCBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICBOYXRpdmVTZXNzaW9uICZTZXNzaW9uOworICBQREJfQnVpbHRpblR5cGUgVHlwZTsKKyAgdWludDY0X3QgTGVuZ3RoOworfTsKKworfSAvLyBuYW1lc3BhY2UgcGRiCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYXRpdmVDb21waWxhbmRTeW1ib2wuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlQ29tcGlsYW5kU3ltYm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ1YzA5ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlQ29tcGlsYW5kU3ltYm9sLmgKQEAgLTAsMCArMSwzOSBAQAorLy89PT0tIE5hdGl2ZUNvbXBpbGFuZFN5bWJvbC5oIC0gbmF0aXZlIGltcGwgZm9yIGNvbXBpbGFuZCBzeW1zIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX05BVElWRUNPTVBJTEFORFNZTUJPTF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfTkFUSVZFQ09NUElMQU5EU1lNQk9MX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvRGJpTW9kdWxlRGVzY3JpcHRvci5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlUmF3U3ltYm9sLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBOYXRpdmVDb21waWxhbmRTeW1ib2wgOiBwdWJsaWMgTmF0aXZlUmF3U3ltYm9sIHsKK3B1YmxpYzoKKyAgTmF0aXZlQ29tcGlsYW5kU3ltYm9sKE5hdGl2ZVNlc3Npb24gJlNlc3Npb24sIFN5bUluZGV4SWQgU3ltYm9sSWQsCisgICAgICAgICAgICAgICAgICAgICAgICBEYmlNb2R1bGVEZXNjcmlwdG9yIE1JKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8TmF0aXZlUmF3U3ltYm9sPiBjbG9uZSgpIGNvbnN0IG92ZXJyaWRlOworCisgIFBEQl9TeW1UeXBlIGdldFN5bVRhZygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzRWRpdEFuZENvbnRpbnVlRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRMZXhpY2FsUGFyZW50SWQoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0TGlicmFyeU5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBEYmlNb2R1bGVEZXNjcmlwdG9yIE1vZHVsZTsKK307CisKK30gLy8gbmFtZXNwYWNlIHBkYgorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlRW51bU1vZHVsZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlRW51bU1vZHVsZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWExNDYwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYXRpdmVFbnVtTW9kdWxlcy5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vPT0tIE5hdGl2ZUVudW1Nb2R1bGVzLmggLSBOYXRpdmUgTW9kdWxlIEVudW1lcmF0b3IgaW1wbCAtLS0tLS0tLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9OQVRJVkVFTlVNTU9EVUxFU19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfTkFUSVZFRU5VTU1PRFVMRVNfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL0lQREJFbnVtQ2hpbGRyZW4uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0RiaU1vZHVsZURlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sLmgiCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgRGJpTW9kdWxlTGlzdDsKK2NsYXNzIE5hdGl2ZVNlc3Npb247CisKK2NsYXNzIE5hdGl2ZUVudW1Nb2R1bGVzIDogcHVibGljIElQREJFbnVtQ2hpbGRyZW48UERCU3ltYm9sPiB7CitwdWJsaWM6CisgIE5hdGl2ZUVudW1Nb2R1bGVzKE5hdGl2ZVNlc3Npb24gJlNlc3Npb24sIGNvbnN0IERiaU1vZHVsZUxpc3QgJk1vZHVsZXMsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEluZGV4ID0gMCk7CisKKyAgdWludDMyX3QgZ2V0Q2hpbGRDb3VudCgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sPiBnZXRDaGlsZEF0SW5kZXgodWludDMyX3QgSW5kZXgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sPiBnZXROZXh0KCkgb3ZlcnJpZGU7CisgIHZvaWQgcmVzZXQoKSBvdmVycmlkZTsKKyAgTmF0aXZlRW51bU1vZHVsZXMgKmNsb25lKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIE5hdGl2ZVNlc3Npb24gJlNlc3Npb247CisgIGNvbnN0IERiaU1vZHVsZUxpc3QgJk1vZHVsZXM7CisgIHVpbnQzMl90IEluZGV4OworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZUVudW1TeW1ib2wuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlRW51bVN5bWJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxYjdiNzgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZUVudW1TeW1ib2wuaApAQCAtMCwwICsxLDYwIEBACisvLz09PS0gTmF0aXZlRW51bVN5bWJvbC5oIC0gaW5mbyBhYm91dCBlbnVtIHR5cGUgLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfTkFUSVZFRU5VTVNZTUJPTF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfTkFUSVZFRU5VTVNZTUJPTF9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVWaXNpdG9yQ2FsbGJhY2tzLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYXRpdmVSYXdTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZVNlc3Npb24uaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIE5hdGl2ZUVudW1TeW1ib2wgOiBwdWJsaWMgTmF0aXZlUmF3U3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBjb2Rldmlldzo6VHlwZVZpc2l0b3JDYWxsYmFja3MgeworcHVibGljOgorICBOYXRpdmVFbnVtU3ltYm9sKE5hdGl2ZVNlc3Npb24gJlNlc3Npb24sIFN5bUluZGV4SWQgSWQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZXZpZXc6OkNWVHlwZSAmQ1YpOworICB+TmF0aXZlRW51bVN5bWJvbCgpIG92ZXJyaWRlOworCisgIHN0ZDo6dW5pcXVlX3B0cjxOYXRpdmVSYXdTeW1ib2w+IGNsb25lKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4KKyAgZmluZENoaWxkcmVuKFBEQl9TeW1UeXBlIFR5cGUpIGNvbnN0IG92ZXJyaWRlOworCisgIEVycm9yIHZpc2l0S25vd25SZWNvcmQoY29kZXZpZXc6OkNWVHlwZSAmQ1ZSLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGV2aWV3OjpFbnVtUmVjb3JkICZSZWNvcmQpIG92ZXJyaWRlOworICBFcnJvciB2aXNpdEtub3duTWVtYmVyKGNvZGV2aWV3OjpDVk1lbWJlclJlY29yZCAmQ1ZNLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvZGV2aWV3OjpFbnVtZXJhdG9yUmVjb3JkICZSZWNvcmQpIG92ZXJyaWRlOworCisgIFBEQl9TeW1UeXBlIGdldFN5bVRhZygpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRDbGFzc1BhcmVudElkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFVubW9kaWZpZWRUeXBlSWQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNDb25zdHJ1Y3RvcigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0Fzc2lnbm1lbnRPcGVyYXRvcigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0Nhc3RPcGVyYXRvcigpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRMZW5ndGgoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzTmVzdGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzT3ZlcmxvYWRlZE9wZXJhdG9yKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNQYWNrZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1Njb3BlZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRUeXBlSWQoKSBjb25zdCBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICBjb2Rldmlldzo6Q1ZUeXBlIENWOworICBjb2Rldmlldzo6RW51bVJlY29yZCBSZWNvcmQ7Cit9OworCit9IC8vIG5hbWVzcGFjZSBwZGIKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfTkFUSVZFRU5VTVNZTUJPTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZUVudW1UeXBlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYXRpdmVFbnVtVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGE1YzhkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYXRpdmVFbnVtVHlwZXMuaApAQCAtMCwwICsxLDUxIEBACisvLz09LSBOYXRpdmVFbnVtVHlwZXMuaCAtIE5hdGl2ZSBUeXBlIEVudW1lcmF0b3IgaW1wbCAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9OQVRJVkVfTkFUSVZFRU5VTVRZUEVTX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9OQVRJVkVFTlVNVFlQRVNfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvTGF6eVJhbmRvbVR5cGVDb2xsZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9JUERCRW51bUNoaWxkcmVuLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbC5oIgorCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgTmF0aXZlU2Vzc2lvbjsKKworY2xhc3MgTmF0aXZlRW51bVR5cGVzIDogcHVibGljIElQREJFbnVtQ2hpbGRyZW48UERCU3ltYm9sPiB7CitwdWJsaWM6CisgIE5hdGl2ZUVudW1UeXBlcyhOYXRpdmVTZXNzaW9uICZTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgY29kZXZpZXc6OkxhenlSYW5kb21UeXBlQ29sbGVjdGlvbiAmVHlwZUNvbGxlY3Rpb24sCisgICAgICAgICAgICAgICAgICBjb2Rldmlldzo6VHlwZUxlYWZLaW5kIEtpbmQpOworCisgIHVpbnQzMl90IGdldENoaWxkQ291bnQoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbD4gZ2V0Q2hpbGRBdEluZGV4KHVpbnQzMl90IEluZGV4KSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbD4gZ2V0TmV4dCgpIG92ZXJyaWRlOworICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGU7CisgIE5hdGl2ZUVudW1UeXBlcyAqY2xvbmUoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgTmF0aXZlRW51bVR5cGVzKE5hdGl2ZVNlc3Npb24gJlNlc3Npb24sCisgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb2Rldmlldzo6VHlwZUluZGV4PiAmTWF0Y2hlcywKKyAgICAgICAgICAgICAgICAgIGNvZGV2aWV3OjpUeXBlTGVhZktpbmQgS2luZCk7CisKKyAgc3RkOjp2ZWN0b3I8Y29kZXZpZXc6OlR5cGVJbmRleD4gTWF0Y2hlczsKKyAgdWludDMyX3QgSW5kZXg7CisgIE5hdGl2ZVNlc3Npb24gJlNlc3Npb247CisgIGNvZGV2aWV3OjpUeXBlTGVhZktpbmQgS2luZDsKK307CisKK30gLy8gbmFtZXNwYWNlIHBkYgorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlRXhlU3ltYm9sLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZUV4ZVN5bWJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4N2M3ZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZUV4ZVN5bWJvbC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vPT09LSBOYXRpdmVFeGVTeW1ib2wuaCAtIG5hdGl2ZSBpbXBsIGZvciBQREJTeW1ib2xFeGUgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9OQVRJVkVFWEVTWU1CT0xfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX05BVElWRUVYRVNZTUJPTF9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZVJhd1N5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlU2Vzc2lvbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgTmF0aXZlRXhlU3ltYm9sIDogcHVibGljIE5hdGl2ZVJhd1N5bWJvbCB7CitwdWJsaWM6CisgIE5hdGl2ZUV4ZVN5bWJvbChOYXRpdmVTZXNzaW9uICZTZXNzaW9uLCBTeW1JbmRleElkIFN5bWJvbElkKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8TmF0aXZlUmF3U3ltYm9sPiBjbG9uZSgpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+CisgIGZpbmRDaGlsZHJlbihQREJfU3ltVHlwZSBUeXBlKSBjb25zdCBvdmVycmlkZTsKKworICB1aW50MzJfdCBnZXRBZ2UoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0U3ltYm9sc0ZpbGVOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGNvZGV2aWV3OjpHVUlEIGdldEd1aWQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNDVHlwZXMoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNQcml2YXRlU3ltYm9scygpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBQREJGaWxlICZGaWxlOworfTsKKworfSAvLyBuYW1lc3BhY2UgcGRiCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYXRpdmVSYXdTeW1ib2wuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlUmF3U3ltYm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI3MGVjZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvTmF0aXZlUmF3U3ltYm9sLmgKQEAgLTAsMCArMSwyMzkgQEAKKy8vPT0tIE5hdGl2ZVJhd1N5bWJvbC5oIC0gTmF0aXZlIGltcGxlbWVudGF0aW9uIG9mIElQREJSYXdTeW1ib2wgLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9OQVRJVkVSQVdTWU1CT0xfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfTkFUSVZFX05BVElWRVJBV1NZTUJPTF9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvSVBEQlJhd1N5bWJvbC5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgTmF0aXZlU2Vzc2lvbjsKKwordHlwZWRlZiB1aW50MzJfdCBTeW1JbmRleElkOworCitjbGFzcyBOYXRpdmVSYXdTeW1ib2wgOiBwdWJsaWMgSVBEQlJhd1N5bWJvbCB7CitwdWJsaWM6CisgIE5hdGl2ZVJhd1N5bWJvbChOYXRpdmVTZXNzaW9uICZQREJTZXNzaW9uLCBTeW1JbmRleElkIFN5bWJvbElkKTsKKworICB2aXJ0dWFsIHN0ZDo6dW5pcXVlX3B0cjxOYXRpdmVSYXdTeW1ib2w+IGNsb25lKCkgY29uc3QgPSAwOworCisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MsIGludCBJbmRlbnQpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+CisgICAgZmluZENoaWxkcmVuKFBEQl9TeW1UeXBlIFR5cGUpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPgorICAgIGZpbmRDaGlsZHJlbihQREJfU3ltVHlwZSBUeXBlLCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgIFBEQl9OYW1lU2VhcmNoRmxhZ3MgRmxhZ3MpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPgorICAgIGZpbmRDaGlsZHJlbkJ5QWRkcihQREJfU3ltVHlwZSBUeXBlLCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgUERCX05hbWVTZWFyY2hGbGFncyBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2VjdGlvbiwgdWludDMyX3QgT2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4KKyAgICBmaW5kQ2hpbGRyZW5CeVZBKFBEQl9TeW1UeXBlIFR5cGUsIFN0cmluZ1JlZiBOYW1lLCBQREJfTmFtZVNlYXJjaEZsYWdzIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgVkEpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPgorICAgIGZpbmRDaGlsZHJlbkJ5UlZBKFBEQl9TeW1UeXBlIFR5cGUsIFN0cmluZ1JlZiBOYW1lLCBQREJfTmFtZVNlYXJjaEZsYWdzIEZsYWdzLAorICAgICAgdWludDMyX3QgUlZBKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPgorICAgIGZpbmRJbmxpbmVGcmFtZXNCeUFkZHIodWludDMyX3QgU2VjdGlvbiwgdWludDMyX3QgT2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4KKyAgICBmaW5kSW5saW5lRnJhbWVzQnlSVkEodWludDMyX3QgUlZBKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4KKyAgICBmaW5kSW5saW5lRnJhbWVzQnlWQSh1aW50NjRfdCBWQSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtTGluZU51bWJlcnM+IGZpbmRJbmxpbmVlTGluZXMoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtTGluZU51bWJlcnM+CisgICAgZmluZElubGluZWVMaW5lc0J5QWRkcih1aW50MzJfdCBTZWN0aW9uLCB1aW50MzJfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBMZW5ndGgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1MaW5lTnVtYmVycz4KKyAgICBmaW5kSW5saW5lZUxpbmVzQnlSVkEodWludDMyX3QgUlZBLCB1aW50MzJfdCBMZW5ndGgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1MaW5lTnVtYmVycz4KKyAgICBmaW5kSW5saW5lZUxpbmVzQnlWQSh1aW50NjRfdCBWQSwgdWludDMyX3QgTGVuZ3RoKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGdldERhdGFCeXRlcyhTbWFsbFZlY3Rvcjx1aW50OF90LCAzMj4gJkJ5dGVzKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBnZXRGcm9udEVuZFZlcnNpb24oVmVyc2lvbkluZm8gJlZlcnNpb24pIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIGdldEJhY2tFbmRWZXJzaW9uKFZlcnNpb25JbmZvICZWZXJzaW9uKSBjb25zdCBvdmVycmlkZTsKKyAgUERCX01lbWJlckFjY2VzcyBnZXRBY2Nlc3MoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0QWRkcmVzc09mZnNldCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRBZGRyZXNzU2VjdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRBZ2UoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0QXJyYXlJbmRleFR5cGVJZCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRCYXNlRGF0YU9mZnNldCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRCYXNlRGF0YVNsb3QoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0QmFzZVN5bWJvbElkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFBEQl9CdWlsdGluVHlwZSBnZXRCdWlsdGluVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRCaXRQb3NpdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICBQREJfQ2FsbGluZ0NvbnYgZ2V0Q2FsbGluZ0NvbnZlbnRpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0Q2xhc3NQYXJlbnRJZCgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXRDb21waWxlck5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0Q291bnQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0Q291bnRMaXZlUmFuZ2VzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFBEQl9MYW5nIGdldExhbmd1YWdlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldExleGljYWxQYXJlbnRJZCgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXRMaWJyYXJ5TmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRMaXZlUmFuZ2VTdGFydEFkZHJlc3NPZmZzZXQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TGl2ZVJhbmdlU3RhcnRBZGRyZXNzU2VjdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRMaXZlUmFuZ2VTdGFydFJlbGF0aXZlVmlydHVhbEFkZHJlc3MoKSBjb25zdCBvdmVycmlkZTsKKyAgY29kZXZpZXc6OlJlZ2lzdGVySWQgZ2V0TG9jYWxCYXNlUG9pbnRlclJlZ2lzdGVySWQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TG93ZXJCb3VuZElkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldE1lbW9yeVNwYWNlS2luZCgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXROYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldE51bWJlck9mQWNjZWxlcmF0b3JQb2ludGVyVGFncygpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXROdW1iZXJPZkNvbHVtbnMoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TnVtYmVyT2ZNb2RpZmllcnMoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TnVtYmVyT2ZSZWdpc3RlckluZGljZXMoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TnVtYmVyT2ZSb3dzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldE9iamVjdEZpbGVOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldE9lbUlkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldE9lbVN5bWJvbElkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldE9mZnNldEluVWR0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIFBEQl9DcHUgZ2V0UGxhdGZvcm0oKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0UmFuaygpIGNvbnN0IG92ZXJyaWRlOworICBjb2Rldmlldzo6UmVnaXN0ZXJJZCBnZXRSZWdpc3RlcklkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFJlZ2lzdGVyVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRSZWxhdGl2ZVZpcnR1YWxBZGRyZXNzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFNhbXBsZXJTbG90KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFNpZ25hdHVyZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRTaXplSW5VZHQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0U2xvdCgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXRTb3VyY2VGaWxlTmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkxpbmVOdW1iZXI+IGdldFNyY0xpbmVPblR5cGVEZWZuKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFN0cmlkZSgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRTdWJUeXBlSWQoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0U3ltYm9sc0ZpbGVOYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFN5bUluZGV4SWQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0VGFyZ2V0T2Zmc2V0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFRhcmdldFJlbGF0aXZlVmlydHVhbEFkZHJlc3MoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0VGFyZ2V0VmlydHVhbEFkZHJlc3MoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0VGFyZ2V0U2VjdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRUZXh0dXJlU2xvdCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRUaW1lU3RhbXAoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0VG9rZW4oKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0VHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFVhdlNsb3QoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjpzdHJpbmcgZ2V0VW5kZWNvcmF0ZWROYW1lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldFVuZGVjb3JhdGVkTmFtZUV4KFBEQl9VbmRuYW1lRmxhZ3MgRmxhZ3MpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRVbm1vZGlmaWVkVHlwZUlkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFVwcGVyQm91bmRJZCgpIGNvbnN0IG92ZXJyaWRlOworICBWYXJpYW50IGdldFZhbHVlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFZpcnR1YWxCYXNlRGlzcEluZGV4KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFZpcnR1YWxCYXNlT2Zmc2V0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFZpcnR1YWxUYWJsZVNoYXBlSWQoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbFR5cGVCdWlsdGluPgorICBnZXRWaXJ0dWFsQmFzZVRhYmxlVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICBQREJfRGF0YUtpbmQgZ2V0RGF0YUtpbmQoKSBjb25zdCBvdmVycmlkZTsKKyAgUERCX1N5bVR5cGUgZ2V0U3ltVGFnKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGNvZGV2aWV3OjpHVUlEIGdldEd1aWQoKSBjb25zdCBvdmVycmlkZTsKKyAgaW50MzJfdCBnZXRPZmZzZXQoKSBjb25zdCBvdmVycmlkZTsKKyAgaW50MzJfdCBnZXRUaGlzQWRqdXN0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGludDMyX3QgZ2V0VmlydHVhbEJhc2VQb2ludGVyT2Zmc2V0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIFBEQl9Mb2NUeXBlIGdldExvY2F0aW9uVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICBQREJfTWFjaGluZSBnZXRNYWNoaW5lVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICBjb2Rldmlldzo6VGh1bmtPcmRpbmFsIGdldFRodW5rT3JkaW5hbCgpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRMZW5ndGgoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0TGl2ZVJhbmdlTGVuZ3RoKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldFZpcnR1YWxBZGRyZXNzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFBEQl9VZHRUeXBlIGdldFVkdEtpbmQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNDb25zdHJ1Y3RvcigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0N1c3RvbUNhbGxpbmdDb252ZW50aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzRmFyUmV0dXJuKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNDb2RlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNDb21waWxlckdlbmVyYXRlZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzQ29uc3RUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNFZGl0QW5kQ29udGludWVFbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNGdW5jdGlvbigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGdldEFkZHJlc3NUYWtlbigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGdldE5vU3RhY2tPcmRlcmluZygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0FsbG9jYSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0Fzc2lnbm1lbnRPcGVyYXRvcigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0NUeXBlcygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0Nhc3RPcGVyYXRvcigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0RlYnVnSW5mbygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc0VIKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzRUhhKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzSW5sQXNtKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzSW5saW5lQXR0cmlidXRlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzSW50ZXJydXB0UmV0dXJuKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzRnJhbWVQb2ludGVyKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzTG9uZ0p1bXAoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNNYW5hZ2VkQ29kZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc05lc3RlZFR5cGVzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaGFzTm9JbmxpbmVBdHRyaWJ1dGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNOb1JldHVybkF0dHJpYnV0ZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc09wdGltaXplZENvZGVEZWJ1Z0luZm8oKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNPdmVybG9hZGVkT3BlcmF0b3IoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNTRUgoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNTZWN1cml0eUNoZWNrcygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGhhc1NldEp1bXAoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNTdHJpY3RHU0NoZWNrKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNBY2NlbGVyYXRvckdyb3VwU2hhcmVkTG9jYWwoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0FjY2VsZXJhdG9yUG9pbnRlclRhZ0xpdmVSYW5nZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzQWNjZWxlcmF0b3JTdHViRnVuY3Rpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0FnZ3JlZ2F0ZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0ludHJvVmlydHVhbEZ1bmN0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNDVlRDSUwoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0NvbnN0cnVjdG9yVmlydHVhbEJhc2UoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0N4eFJldHVyblVkdCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzRGF0YUFsaWduZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0hMU0xEYXRhKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNIb3RwYXRjaGFibGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0luZGlyZWN0VmlydHVhbEJhc2VDbGFzcygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzSW50ZXJmYWNlVWR0KCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNJbnRyaW5zaWMoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0xUQ0coKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc0xvY2F0aW9uQ29udHJvbEZsb3dEZXBlbmRlbnQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc01TSUxOZXRtb2R1bGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc01hdHJpeFJvd01ham9yKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNNYW5hZ2VkQ29kZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzTVNJTENvZGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc011bHRpcGxlSW5oZXJpdGFuY2UoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc05ha2VkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNOZXN0ZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc09wdGltaXplZEF3YXkoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1BhY2tlZCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUG9pbnRlckJhc2VkT25TeW1ib2xWYWx1ZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUG9pbnRlclRvRGF0YU1lbWJlcigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUG9pbnRlclRvTWVtYmVyRnVuY3Rpb24oKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1B1cmVWaXJ0dWFsKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNSVmFsdWVSZWZlcmVuY2UoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1JlZlVkdCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUmVmZXJlbmNlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNSZXN0cmljdGVkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzUmV0dXJuVmFsdWUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1NhZmVCdWZmZXJzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTY29wZWQoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1NkbCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2luZ2xlSW5oZXJpdGFuY2UoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1NwbGl0dGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTdGF0aWMoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBoYXNQcml2YXRlU3ltYm9scygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzVW5hbGlnbmVkVHlwZSgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzVW5yZWFjaGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNWYWx1ZVVkdCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzVmlydHVhbCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzVmlydHVhbEJhc2VDbGFzcygpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzVmlydHVhbEluaGVyaXRhbmNlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNWb2xhdGlsZVR5cGUoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCB3YXNJbmxpbmVkKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldFVudXNlZCgpIGNvbnN0IG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgIE5hdGl2ZVNlc3Npb24gJlNlc3Npb247CisgIFN5bUluZGV4SWQgU3ltYm9sSWQ7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgcGRiCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9OQVRJVkVSQVdTWU1CT0xfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYXRpdmVTZXNzaW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZVNlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGE5NGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYXRpdmVTZXNzaW9uLmgKQEAgLTAsMCArMSwxMTQgQEAKKy8vPT09LSBOYXRpdmVTZXNzaW9uLmggLSBOYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgSVBEQlNlc3Npb24gLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9OQVRJVkVTRVNTSU9OX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX05BVElWRV9OQVRJVkVTRVNTSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUluZGV4LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL0lQREJSYXdTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvSVBEQlNlc3Npb24uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL0RiaU1vZHVsZURlc2NyaXB0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZUJ1aWx0aW5TeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL05hdGl2ZVJhd1N5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTWVtb3J5QnVmZmVyOworbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBQREJGaWxlOworCitjbGFzcyBOYXRpdmVTZXNzaW9uIDogcHVibGljIElQREJTZXNzaW9uIHsKK3B1YmxpYzoKKyAgTmF0aXZlU2Vzc2lvbihzdGQ6OnVuaXF1ZV9wdHI8UERCRmlsZT4gUGRiRmlsZSwKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QnVtcFB0ckFsbG9jYXRvcj4gQWxsb2NhdG9yKTsKKyAgfk5hdGl2ZVNlc3Npb24oKSBvdmVycmlkZTsKKworICBzdGF0aWMgRXJyb3IgY3JlYXRlRnJvbVBkYihzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBNQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJTZXNzaW9uPiAmU2Vzc2lvbik7CisgIHN0YXRpYyBFcnJvciBjcmVhdGVGcm9tRXhlKFN0cmluZ1JlZiBQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlNlc3Npb24+ICZTZXNzaW9uKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sQ29tcGlsYW5kPgorICBjcmVhdGVDb21waWxhbmRTeW1ib2woRGJpTW9kdWxlRGVzY3JpcHRvciBNSSk7CisKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbFR5cGVFbnVtPgorICBjcmVhdGVFbnVtU3ltYm9sKGNvZGV2aWV3OjpUeXBlSW5kZXggSW5kZXgpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+CisgIGNyZWF0ZVR5cGVFbnVtZXJhdG9yKGNvZGV2aWV3OjpUeXBlTGVhZktpbmQgS2luZCk7CisKKyAgU3ltSW5kZXhJZCBmaW5kU3ltYm9sQnlUeXBlSW5kZXgoY29kZXZpZXc6OlR5cGVJbmRleCBUSSk7CisKKyAgdWludDY0X3QgZ2V0TG9hZEFkZHJlc3MoKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBzZXRMb2FkQWRkcmVzcyh1aW50NjRfdCBBZGRyZXNzKSBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbEV4ZT4gZ2V0R2xvYmFsU2NvcGUoKSBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbD4gZ2V0U3ltYm9sQnlJZCh1aW50MzJfdCBTeW1ib2xJZCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBhZGRyZXNzRm9yVkEodWludDY0X3QgVkEsIHVpbnQzMl90ICZTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmT2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBhZGRyZXNzRm9yUlZBKHVpbnQzMl90IFJWQSwgdWludDMyX3QgJlNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmT2Zmc2V0KSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sPgorICBmaW5kU3ltYm9sQnlBZGRyZXNzKHVpbnQ2NF90IEFkZHJlc3MsIFBEQl9TeW1UeXBlIFR5cGUpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUxpbmVOdW1iZXJzPgorICBmaW5kTGluZU51bWJlcnMoY29uc3QgUERCU3ltYm9sQ29tcGlsYW5kICZDb21waWxhbmQsCisgICAgICAgICAgICAgICAgICBjb25zdCBJUERCU291cmNlRmlsZSAmRmlsZSkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUxpbmVOdW1iZXJzPgorICBmaW5kTGluZU51bWJlcnNCeUFkZHJlc3ModWludDY0X3QgQWRkcmVzcywgdWludDMyX3QgTGVuZ3RoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtTGluZU51bWJlcnM+CisgIGZpbmRMaW5lTnVtYmVyc0J5UlZBKHVpbnQzMl90IFJWQSwgdWludDMyX3QgTGVuZ3RoKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtTGluZU51bWJlcnM+CisgIGZpbmRMaW5lTnVtYmVyc0J5U2VjdE9mZnNldCh1aW50MzJfdCBTZWN0aW9uLCB1aW50MzJfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBMZW5ndGgpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVNvdXJjZUZpbGVzPgorICBmaW5kU291cmNlRmlsZXMoY29uc3QgUERCU3ltYm9sQ29tcGlsYW5kICpDb21waWxhbmQsIGxsdm06OlN0cmluZ1JlZiBQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgUERCX05hbWVTZWFyY2hGbGFncyBGbGFncykgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCU291cmNlRmlsZT4KKyAgZmluZE9uZVNvdXJjZUZpbGUoY29uc3QgUERCU3ltYm9sQ29tcGlsYW5kICpDb21waWxhbmQsCisgICAgICAgICAgICAgICAgICAgIGxsdm06OlN0cmluZ1JlZiBQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICBQREJfTmFtZVNlYXJjaEZsYWdzIEZsYWdzKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtQ2hpbGRyZW48UERCU3ltYm9sQ29tcGlsYW5kPj4KKyAgZmluZENvbXBpbGFuZHNGb3JTb3VyY2VGaWxlKGxsdm06OlN0cmluZ1JlZiBQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUERCX05hbWVTZWFyY2hGbGFncyBGbGFncykgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2xDb21waWxhbmQ+CisgIGZpbmRPbmVDb21waWxhbmRGb3JTb3VyY2VGaWxlKGxsdm06OlN0cmluZ1JlZiBQYXR0ZXJuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQREJfTmFtZVNlYXJjaEZsYWdzIEZsYWdzKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU291cmNlRmlsZXM+IGdldEFsbFNvdXJjZUZpbGVzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVNvdXJjZUZpbGVzPiBnZXRTb3VyY2VGaWxlc0ZvckNvbXBpbGFuZCgKKyAgICAgIGNvbnN0IFBEQlN5bWJvbENvbXBpbGFuZCAmQ29tcGlsYW5kKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJTb3VyY2VGaWxlPgorICBnZXRTb3VyY2VGaWxlQnlJZCh1aW50MzJfdCBGaWxlSWQpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bURhdGFTdHJlYW1zPiBnZXREZWJ1Z1N0cmVhbXMoKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1UYWJsZXM+IGdldEVudW1UYWJsZXMoKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1JbmplY3RlZFNvdXJjZXM+IGdldEluamVjdGVkU291cmNlcygpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVNlY3Rpb25Db250cmlicz4gZ2V0U2VjdGlvbkNvbnRyaWJzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgUERCRmlsZSAmZ2V0UERCRmlsZSgpIHsgcmV0dXJuICpQZGI7IH0KKyAgY29uc3QgUERCRmlsZSAmZ2V0UERCRmlsZSgpIGNvbnN0IHsgcmV0dXJuICpQZGI7IH0KKworcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQkZpbGU+IFBkYjsKKyAgc3RkOjp1bmlxdWVfcHRyPEJ1bXBQdHJBbGxvY2F0b3I+IEFsbG9jYXRvcjsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPE5hdGl2ZVJhd1N5bWJvbD4+IFN5bWJvbENhY2hlOworICBEZW5zZU1hcDxjb2Rldmlldzo6VHlwZUluZGV4LCBTeW1JbmRleElkPiBUeXBlSW5kZXhUb1N5bWJvbElkOworfTsKK30gLy8gbmFtZXNwYWNlIHBkYgorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUERCRmlsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9QREJGaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUzOWFjMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUERCRmlsZS5oCkBAIC0wLDAgKzEsMTQ0IEBACisvLz09PS0gUERCRmlsZS5oIC0gTG93IGxldmVsIGludGVyZmFjZSB0byBhIFBEQiBmaWxlIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUERCRklMRV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUERCRklMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL01TRi9JTVNGRmlsZS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL01TRi9NU0ZDb21tb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJpbmFyeVN0cmVhbTsKKworbmFtZXNwYWNlIG1zZiB7CitjbGFzcyBNYXBwZWRCbG9ja1N0cmVhbTsKK30KKworbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBEYmlTdHJlYW07CitjbGFzcyBHbG9iYWxzU3RyZWFtOworY2xhc3MgSW5mb1N0cmVhbTsKK2NsYXNzIFBEQlN0cmluZ1RhYmxlOworY2xhc3MgUERCRmlsZUJ1aWxkZXI7CitjbGFzcyBQdWJsaWNzU3RyZWFtOworY2xhc3MgU3ltYm9sU3RyZWFtOworY2xhc3MgVHBpU3RyZWFtOworCitjbGFzcyBQREJGaWxlIDogcHVibGljIG1zZjo6SU1TRkZpbGUgeworICBmcmllbmQgUERCRmlsZUJ1aWxkZXI7CisKK3B1YmxpYzoKKyAgUERCRmlsZShTdHJpbmdSZWYgUGF0aCwgc3RkOjp1bmlxdWVfcHRyPEJpbmFyeVN0cmVhbT4gUGRiRmlsZUJ1ZmZlciwKKyAgICAgICAgICBCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IpOworICB+UERCRmlsZSgpIG92ZXJyaWRlOworCisgIFN0cmluZ1JlZiBnZXRGaWxlRGlyZWN0b3J5KCkgY29uc3Q7CisgIFN0cmluZ1JlZiBnZXRGaWxlUGF0aCgpIGNvbnN0OworCisgIHVpbnQzMl90IGdldEZyZWVCbG9ja01hcEJsb2NrKCkgY29uc3Q7CisgIHVpbnQzMl90IGdldFVua25vd24xKCkgY29uc3Q7CisKKyAgdWludDMyX3QgZ2V0QmxvY2tTaXplKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldEJsb2NrQ291bnQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0TnVtRGlyZWN0b3J5Qnl0ZXMoKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0QmxvY2tNYXBJbmRleCgpIGNvbnN0OworICB1aW50MzJfdCBnZXROdW1EaXJlY3RvcnlCbG9ja3MoKSBjb25zdDsKKyAgdWludDY0X3QgZ2V0QmxvY2tNYXBPZmZzZXQoKSBjb25zdDsKKworICB1aW50MzJfdCBnZXROdW1TdHJlYW1zKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldE1heFN0cmVhbVNpemUoKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0U3RyZWFtQnl0ZVNpemUodWludDMyX3QgU3RyZWFtSW5kZXgpIGNvbnN0IG92ZXJyaWRlOworICBBcnJheVJlZjxzdXBwb3J0Ojp1bGl0dGxlMzJfdD4KKyAgZ2V0U3RyZWFtQmxvY2tMaXN0KHVpbnQzMl90IFN0cmVhbUluZGV4KSBjb25zdCBvdmVycmlkZTsKKyAgdWludDMyX3QgZ2V0RmlsZVNpemUoKSBjb25zdDsKKworICBFeHBlY3RlZDxBcnJheVJlZjx1aW50OF90Pj4gZ2V0QmxvY2tEYXRhKHVpbnQzMl90IEJsb2NrSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTnVtQnl0ZXMpIGNvbnN0IG92ZXJyaWRlOworICBFcnJvciBzZXRCbG9ja0RhdGEodWludDMyX3QgQmxvY2tJbmRleCwgdWludDMyX3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gRGF0YSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgQXJyYXlSZWY8c3VwcG9ydDo6dWxpdHRsZTMyX3Q+IGdldFN0cmVhbVNpemVzKCkgY29uc3QgeworICAgIHJldHVybiBDb250YWluZXJMYXlvdXQuU3RyZWFtU2l6ZXM7CisgIH0KKyAgQXJyYXlSZWY8QXJyYXlSZWY8c3VwcG9ydDo6dWxpdHRsZTMyX3Q+PiBnZXRTdHJlYW1NYXAoKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnRhaW5lckxheW91dC5TdHJlYW1NYXA7CisgIH0KKworICBjb25zdCBtc2Y6Ok1TRkxheW91dCAmZ2V0TXNmTGF5b3V0KCkgY29uc3QgeyByZXR1cm4gQ29udGFpbmVyTGF5b3V0OyB9CisgIEJpbmFyeVN0cmVhbVJlZiBnZXRNc2ZCdWZmZXIoKSBjb25zdCB7IHJldHVybiAqQnVmZmVyOyB9CisKKyAgQXJyYXlSZWY8c3VwcG9ydDo6dWxpdHRsZTMyX3Q+IGdldERpcmVjdG9yeUJsb2NrQXJyYXkoKSBjb25zdDsKKworICBzdGQ6OnVuaXF1ZV9wdHI8bXNmOjpNYXBwZWRCbG9ja1N0cmVhbT4gY3JlYXRlSW5kZXhlZFN0cmVhbSh1aW50MTZfdCBTTik7CisKKyAgbXNmOjpNU0ZTdHJlYW1MYXlvdXQgZ2V0U3RyZWFtTGF5b3V0KHVpbnQzMl90IFN0cmVhbUlkeCkgY29uc3Q7CisgIG1zZjo6TVNGU3RyZWFtTGF5b3V0IGdldEZwbVN0cmVhbUxheW91dCgpIGNvbnN0OworCisgIEVycm9yIHBhcnNlRmlsZUhlYWRlcnMoKTsKKyAgRXJyb3IgcGFyc2VTdHJlYW1EYXRhKCk7CisKKyAgRXhwZWN0ZWQ8SW5mb1N0cmVhbSAmPiBnZXRQREJJbmZvU3RyZWFtKCk7CisgIEV4cGVjdGVkPERiaVN0cmVhbSAmPiBnZXRQREJEYmlTdHJlYW0oKTsKKyAgRXhwZWN0ZWQ8R2xvYmFsc1N0cmVhbSAmPiBnZXRQREJHbG9iYWxzU3RyZWFtKCk7CisgIEV4cGVjdGVkPFRwaVN0cmVhbSAmPiBnZXRQREJUcGlTdHJlYW0oKTsKKyAgRXhwZWN0ZWQ8VHBpU3RyZWFtICY+IGdldFBEQklwaVN0cmVhbSgpOworICBFeHBlY3RlZDxQdWJsaWNzU3RyZWFtICY+IGdldFBEQlB1YmxpY3NTdHJlYW0oKTsKKyAgRXhwZWN0ZWQ8U3ltYm9sU3RyZWFtICY+IGdldFBEQlN5bWJvbFN0cmVhbSgpOworICBFeHBlY3RlZDxQREJTdHJpbmdUYWJsZSAmPiBnZXRTdHJpbmdUYWJsZSgpOworCisgIEJ1bXBQdHJBbGxvY2F0b3IgJmdldEFsbG9jYXRvcigpIHsgcmV0dXJuIEFsbG9jYXRvcjsgfQorCisgIGJvb2wgaGFzUERCRGJpU3RyZWFtKCkgY29uc3Q7CisgIGJvb2wgaGFzUERCR2xvYmFsc1N0cmVhbSgpOworICBib29sIGhhc1BEQkluZm9TdHJlYW0oKSBjb25zdDsKKyAgYm9vbCBoYXNQREJJcGlTdHJlYW0oKSBjb25zdDsKKyAgYm9vbCBoYXNQREJQdWJsaWNzU3RyZWFtKCk7CisgIGJvb2wgaGFzUERCU3ltYm9sU3RyZWFtKCk7CisgIGJvb2wgaGFzUERCVHBpU3RyZWFtKCkgY29uc3Q7CisgIGJvb2wgaGFzUERCU3RyaW5nVGFibGUoKTsKKworICB1aW50MzJfdCBnZXRQb2ludGVyU2l6ZSgpOworCitwcml2YXRlOgorICBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8bXNmOjpNYXBwZWRCbG9ja1N0cmVhbT4+CisgIHNhZmVseUNyZWF0ZUluZGV4ZWRTdHJlYW0oY29uc3QgbXNmOjpNU0ZMYXlvdXQgJkxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlTdHJlYW1SZWYgTXNmRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTdHJlYW1JbmRleCkgY29uc3Q7CisKKyAgc3RkOjpzdHJpbmcgRmlsZVBhdGg7CisgIEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvcjsKKworICBzdGQ6OnVuaXF1ZV9wdHI8QmluYXJ5U3RyZWFtPiBCdWZmZXI7CisKKyAgbXNmOjpNU0ZMYXlvdXQgQ29udGFpbmVyTGF5b3V0OworCisgIHN0ZDo6dW5pcXVlX3B0cjxHbG9iYWxzU3RyZWFtPiBHbG9iYWxzOworICBzdGQ6OnVuaXF1ZV9wdHI8SW5mb1N0cmVhbT4gSW5mbzsKKyAgc3RkOjp1bmlxdWVfcHRyPERiaVN0cmVhbT4gRGJpOworICBzdGQ6OnVuaXF1ZV9wdHI8VHBpU3RyZWFtPiBUcGk7CisgIHN0ZDo6dW5pcXVlX3B0cjxUcGlTdHJlYW0+IElwaTsKKyAgc3RkOjp1bmlxdWVfcHRyPFB1YmxpY3NTdHJlYW0+IFB1YmxpY3M7CisgIHN0ZDo6dW5pcXVlX3B0cjxTeW1ib2xTdHJlYW0+IFN5bWJvbHM7CisgIHN0ZDo6dW5pcXVlX3B0cjxtc2Y6Ok1hcHBlZEJsb2NrU3RyZWFtPiBEaXJlY3RvcnlTdHJlYW07CisgIHN0ZDo6dW5pcXVlX3B0cjxtc2Y6Ok1hcHBlZEJsb2NrU3RyZWFtPiBTdHJpbmdUYWJsZVN0cmVhbTsKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQlN0cmluZ1RhYmxlPiBTdHJpbmdzOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1BEQkZpbGVCdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1BEQkZpbGVCdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNThkZGE3MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUERCRmlsZUJ1aWxkZXIuaApAQCAtMCwwICsxLDEwOSBAQAorLy89PT0tIFBEQkZpbGVCdWlsZGVyLmggLSBQREIgRmlsZSBDcmVhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1BEQkZJTEVCVUlMREVSX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1JBV19QREJGSUxFQlVJTERFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0JpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9OYW1lZFN0cmVhbU1hcC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUERCRmlsZS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUERCU3RyaW5nVGFibGVCdWlsZGVyLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdDb25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd1R5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgbXNmIHsKK2NsYXNzIE1TRkJ1aWxkZXI7Cit9CituYW1lc3BhY2UgcGRiIHsKK2NsYXNzIERiaVN0cmVhbUJ1aWxkZXI7CitjbGFzcyBJbmZvU3RyZWFtQnVpbGRlcjsKK2NsYXNzIEdTSVN0cmVhbUJ1aWxkZXI7CitjbGFzcyBUcGlTdHJlYW1CdWlsZGVyOworCitjbGFzcyBQREJGaWxlQnVpbGRlciB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFBEQkZpbGVCdWlsZGVyKEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvcik7CisgIH5QREJGaWxlQnVpbGRlcigpOworICBQREJGaWxlQnVpbGRlcihjb25zdCBQREJGaWxlQnVpbGRlciAmKSA9IGRlbGV0ZTsKKyAgUERCRmlsZUJ1aWxkZXIgJm9wZXJhdG9yPShjb25zdCBQREJGaWxlQnVpbGRlciAmKSA9IGRlbGV0ZTsKKworICBFcnJvciBpbml0aWFsaXplKHVpbnQzMl90IEJsb2NrU2l6ZSk7CisKKyAgbXNmOjpNU0ZCdWlsZGVyICZnZXRNc2ZCdWlsZGVyKCk7CisgIEluZm9TdHJlYW1CdWlsZGVyICZnZXRJbmZvQnVpbGRlcigpOworICBEYmlTdHJlYW1CdWlsZGVyICZnZXREYmlCdWlsZGVyKCk7CisgIFRwaVN0cmVhbUJ1aWxkZXIgJmdldFRwaUJ1aWxkZXIoKTsKKyAgVHBpU3RyZWFtQnVpbGRlciAmZ2V0SXBpQnVpbGRlcigpOworICBQREJTdHJpbmdUYWJsZUJ1aWxkZXIgJmdldFN0cmluZ1RhYmxlQnVpbGRlcigpOworICBHU0lTdHJlYW1CdWlsZGVyICZnZXRHc2lCdWlsZGVyKCk7CisKKyAgRXJyb3IgY29tbWl0KFN0cmluZ1JlZiBGaWxlbmFtZSk7CisKKyAgRXhwZWN0ZWQ8dWludDMyX3Q+IGdldE5hbWVkU3RyZWFtSW5kZXgoU3RyaW5nUmVmIE5hbWUpIGNvbnN0OworICBFcnJvciBhZGROYW1lZFN0cmVhbShTdHJpbmdSZWYgTmFtZSwgU3RyaW5nUmVmIERhdGEpOworICB2b2lkIGFkZEluamVjdGVkU291cmNlKFN0cmluZ1JlZiBOYW1lLCBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBCdWZmZXIpOworCitwcml2YXRlOgorICBzdHJ1Y3QgSW5qZWN0ZWRTb3VyY2VEZXNjcmlwdG9yIHsKKyAgICAvLyBUaGUgZnVsbCBuYW1lIG9mIHRoZSBzdHJlYW0gdGhhdCBjb250YWlucyB0aGUgY29udGVudHMgb2YgdGhpcyBpbmplY3RlZAorICAgIC8vIHNvdXJjZS4gIFRoaXMgaXMgYnVpbHQgYXMgYSBjb25jYXRlbmF0aW9uIG9mIHRoZSBsaXRlcmFsICIvc3JjL2ZpbGVzIgorICAgIC8vIHBsdXMgdGhlICJ2bmFtZSIuCisgICAgc3RkOjpzdHJpbmcgU3RyZWFtTmFtZTsKKworICAgIC8vIFRoZSBleGFjdCBuYW1lIG9mIHRoZSBmaWxlIG5hbWUgYXMgc3BlY2lmaWVkIGJ5IHRoZSB1c2VyLgorICAgIHVpbnQzMl90IE5hbWVJbmRleDsKKworICAgIC8vIFRoZSBzdHJpbmcgdGFibGUgaW5kZXggb2YgdGhlICJ2bmFtZSIgb2YgdGhlIGZpbGUuICBBcyBmYXIgYXMgd2UKKyAgICAvLyB1bmRlcnN0YW5kLCB0aGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBuYW1lLCBleGNlcHQgaXQgaXMgbG93ZXJjYXNlZCBhbmQKKyAgICAvLyBmb3J3YXJkIHNsYXNoZXMgYXJlIGNvbnZlcnRlZCB0byBiYWNrc2xhc2hlcy4KKyAgICB1aW50MzJfdCBWTmFtZUluZGV4OworICAgIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IENvbnRlbnQ7CisgIH07CisKKyAgRXhwZWN0ZWQ8bXNmOjpNU0ZMYXlvdXQ+IGZpbmFsaXplTXNmTGF5b3V0KCk7CisgIEV4cGVjdGVkPHVpbnQzMl90PiBhbGxvY2F0ZU5hbWVkU3RyZWFtKFN0cmluZ1JlZiBOYW1lLCB1aW50MzJfdCBTaXplKTsKKworICB2b2lkIGNvbW1pdEZwbShXcml0YWJsZUJpbmFyeVN0cmVhbSAmTXNmQnVmZmVyLCBjb25zdCBtc2Y6Ok1TRkxheW91dCAmTGF5b3V0KTsKKyAgdm9pZCBjb21taXRJbmplY3RlZFNvdXJjZXMoV3JpdGFibGVCaW5hcnlTdHJlYW0gJk1zZkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbXNmOjpNU0ZMYXlvdXQgJkxheW91dCk7CisgIHZvaWQgY29tbWl0U3JjSGVhZGVyQmxvY2soV3JpdGFibGVCaW5hcnlTdHJlYW0gJk1zZkJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtc2Y6Ok1TRkxheW91dCAmTGF5b3V0KTsKKworICBCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3I7CisKKyAgc3RkOjp1bmlxdWVfcHRyPG1zZjo6TVNGQnVpbGRlcj4gTXNmOworICBzdGQ6OnVuaXF1ZV9wdHI8SW5mb1N0cmVhbUJ1aWxkZXI+IEluZm87CisgIHN0ZDo6dW5pcXVlX3B0cjxEYmlTdHJlYW1CdWlsZGVyPiBEYmk7CisgIHN0ZDo6dW5pcXVlX3B0cjxHU0lTdHJlYW1CdWlsZGVyPiBHc2k7CisgIHN0ZDo6dW5pcXVlX3B0cjxUcGlTdHJlYW1CdWlsZGVyPiBUcGk7CisgIHN0ZDo6dW5pcXVlX3B0cjxUcGlTdHJlYW1CdWlsZGVyPiBJcGk7CisKKyAgUERCU3RyaW5nVGFibGVCdWlsZGVyIFN0cmluZ3M7CisgIFN0cmluZ1RhYmxlSGFzaFRyYWl0cyBJbmplY3RlZFNvdXJjZUhhc2hUcmFpdHM7CisgIEhhc2hUYWJsZTxTcmNIZWFkZXJCbG9ja0VudHJ5LCBTdHJpbmdUYWJsZUhhc2hUcmFpdHM+IEluamVjdGVkU291cmNlVGFibGU7CisKKyAgU21hbGxWZWN0b3I8SW5qZWN0ZWRTb3VyY2VEZXNjcmlwdG9yLCAyPiBJbmplY3RlZFNvdXJjZXM7CisKKyAgTmFtZWRTdHJlYW1NYXAgTmFtZWRTdHJlYW1zOworICBEZW5zZU1hcDx1aW50MzJfdCwgc3RkOjpzdHJpbmc+IE5hbWVkU3RyZWFtRGF0YTsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9QREJTdHJpbmdUYWJsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9QREJTdHJpbmdUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5MTY3YzkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1BEQlN0cmluZ1RhYmxlLmgKQEAgLTAsMCArMSw2NSBAQAorLy89PT0tIFBEQlN0cmluZ1RhYmxlLmggLSBQREIgU3RyaW5nIFRhYmxlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1BEQlNUUklOR1RBQkxFX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1JBV19QREJTVFJJTkdUQUJMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbUFycmF5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgQmluYXJ5U3RyZWFtUmVhZGVyOworCituYW1lc3BhY2UgbXNmIHsKK2NsYXNzIE1hcHBlZEJsb2NrU3RyZWFtOworfQorCituYW1lc3BhY2UgcGRiIHsKKworc3RydWN0IFBEQlN0cmluZ1RhYmxlSGVhZGVyOworCitjbGFzcyBQREJTdHJpbmdUYWJsZSB7CitwdWJsaWM6CisgIEVycm9yIHJlbG9hZChCaW5hcnlTdHJlYW1SZWFkZXIgJlJlYWRlcik7CisKKyAgdWludDMyX3QgZ2V0Qnl0ZVNpemUoKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0TmFtZUNvdW50KCkgY29uc3Q7CisgIHVpbnQzMl90IGdldEhhc2hWZXJzaW9uKCkgY29uc3Q7CisgIHVpbnQzMl90IGdldFNpZ25hdHVyZSgpIGNvbnN0OworCisgIEV4cGVjdGVkPFN0cmluZ1JlZj4gZ2V0U3RyaW5nRm9ySUQodWludDMyX3QgSUQpIGNvbnN0OworICBFeHBlY3RlZDx1aW50MzJfdD4gZ2V0SURGb3JTdHJpbmcoU3RyaW5nUmVmIFN0cikgY29uc3Q7CisKKyAgRml4ZWRTdHJlYW1BcnJheTxzdXBwb3J0Ojp1bGl0dGxlMzJfdD4gbmFtZV9pZHMoKSBjb25zdDsKKworICBjb25zdCBjb2Rldmlldzo6RGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb25SZWYgJmdldFN0cmluZ1RhYmxlKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIEVycm9yIHJlYWRIZWFkZXIoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIpOworICBFcnJvciByZWFkU3RyaW5ncyhCaW5hcnlTdHJlYW1SZWFkZXIgJlJlYWRlcik7CisgIEVycm9yIHJlYWRIYXNoVGFibGUoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIpOworICBFcnJvciByZWFkRXBpbG9ndWUoQmluYXJ5U3RyZWFtUmVhZGVyICZSZWFkZXIpOworCisgIGNvbnN0IFBEQlN0cmluZ1RhYmxlSGVhZGVyICpIZWFkZXIgPSBudWxscHRyOworICBjb2Rldmlldzo6RGVidWdTdHJpbmdUYWJsZVN1YnNlY3Rpb25SZWYgU3RyaW5nczsKKyAgRml4ZWRTdHJlYW1BcnJheTxzdXBwb3J0Ojp1bGl0dGxlMzJfdD4gSURzOworICB1aW50MzJfdCBOYW1lQ291bnQgPSAwOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHBkYgorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfU1RSSU5HVEFCTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9QREJTdHJpbmdUYWJsZUJ1aWxkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUERCU3RyaW5nVGFibGVCdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY4MWMxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUERCU3RyaW5nVGFibGVCdWlsZGVyLmgKQEAgLTAsMCArMSw3MiBAQAorLy89PT0tIFBEQlN0cmluZ1RhYmxlQnVpbGRlci5oIC0gUERCIFN0cmluZyBUYWJsZSBCdWlsZGVyIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY3JlYXRlcyB0aGUgIi9uYW1lcyIgc3RyZWFtLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1JBV19QREJTVFJJTkdUQUJMRUJVSUxERVJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1BEQlNUUklOR1RBQkxFQlVJTERFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3RyaW5nVGFibGVTdWJzZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBCaW5hcnlTdHJlYW1Xcml0ZXI7CitjbGFzcyBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZjsKKworbmFtZXNwYWNlIG1zZiB7CitzdHJ1Y3QgTVNGTGF5b3V0OworfQorCituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgUERCRmlsZUJ1aWxkZXI7CitjbGFzcyBQREJTdHJpbmdUYWJsZUJ1aWxkZXI7CisKK3N0cnVjdCBTdHJpbmdUYWJsZUhhc2hUcmFpdHMgeworICBQREJTdHJpbmdUYWJsZUJ1aWxkZXIgKlRhYmxlOworCisgIGV4cGxpY2l0IFN0cmluZ1RhYmxlSGFzaFRyYWl0cyhQREJTdHJpbmdUYWJsZUJ1aWxkZXIgJlRhYmxlKTsKKyAgdWludDMyX3QgaGFzaExvb2t1cEtleShTdHJpbmdSZWYgUykgY29uc3Q7CisgIFN0cmluZ1JlZiBzdG9yYWdlS2V5VG9Mb29rdXBLZXkodWludDMyX3QgT2Zmc2V0KSBjb25zdDsKKyAgdWludDMyX3QgbG9va3VwS2V5VG9TdG9yYWdlS2V5KFN0cmluZ1JlZiBTKTsKK307CisKK2NsYXNzIFBEQlN0cmluZ1RhYmxlQnVpbGRlciB7CitwdWJsaWM6CisgIC8vIElmIHN0cmluZyBTIGRvZXMgbm90IGV4aXN0IGluIHRoZSBzdHJpbmcgdGFibGUsIGluc2VydCBpdC4KKyAgLy8gUmV0dXJucyB0aGUgSUQgZm9yIFMuCisgIHVpbnQzMl90IGluc2VydChTdHJpbmdSZWYgUyk7CisKKyAgdWludDMyX3QgZ2V0SWRGb3JTdHJpbmcoU3RyaW5nUmVmIFMpIGNvbnN0OworICBTdHJpbmdSZWYgZ2V0U3RyaW5nRm9ySWQodWludDMyX3QgSWQpIGNvbnN0OworCisgIHVpbnQzMl90IGNhbGN1bGF0ZVNlcmlhbGl6ZWRTaXplKCkgY29uc3Q7CisgIEVycm9yIGNvbW1pdChCaW5hcnlTdHJlYW1Xcml0ZXIgJldyaXRlcikgY29uc3Q7CisKKyAgdm9pZCBzZXRTdHJpbmdzKGNvbnN0IGNvZGV2aWV3OjpEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvbiAmU3RyaW5ncyk7CisKK3ByaXZhdGU6CisgIHVpbnQzMl90IGNhbGN1bGF0ZUhhc2hUYWJsZVNpemUoKSBjb25zdDsKKyAgRXJyb3Igd3JpdGVIZWFkZXIoQmluYXJ5U3RyZWFtV3JpdGVyICZXcml0ZXIpIGNvbnN0OworICBFcnJvciB3cml0ZVN0cmluZ3MoQmluYXJ5U3RyZWFtV3JpdGVyICZXcml0ZXIpIGNvbnN0OworICBFcnJvciB3cml0ZUhhc2hUYWJsZShCaW5hcnlTdHJlYW1Xcml0ZXIgJldyaXRlcikgY29uc3Q7CisgIEVycm9yIHdyaXRlRXBpbG9ndWUoQmluYXJ5U3RyZWFtV3JpdGVyICZXcml0ZXIpIGNvbnN0OworCisgIGNvZGV2aWV3OjpEZWJ1Z1N0cmluZ1RhYmxlU3Vic2VjdGlvbiBTdHJpbmdzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHBkYgorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUERCU1RSSU5HVEFCTEVCVUlMREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUHVibGljc1N0cmVhbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9QdWJsaWNzU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmQwMjIyYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUHVibGljc1N0cmVhbS5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vPT09LSBQdWJsaWNzU3RyZWFtLmggLSBQREIgUHVibGljIFN5bWJvbCBTdHJlYW0gLS0tLS0tLS0gLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1JBV19QVUJMSUNTU1RSRUFNX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1JBV19QVUJMSUNTU1RSRUFNX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL01TRi9NYXBwZWRCbG9ja1N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvR2xvYmFsc1N0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUmF3Q29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9QREJUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1BcnJheS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKK2NsYXNzIERiaVN0cmVhbTsKK3N0cnVjdCBHU0lIYXNoSGVhZGVyOworY2xhc3MgUERCRmlsZTsKKworY2xhc3MgUHVibGljc1N0cmVhbSB7CitwdWJsaWM6CisgIFB1YmxpY3NTdHJlYW0oc3RkOjp1bmlxdWVfcHRyPG1zZjo6TWFwcGVkQmxvY2tTdHJlYW0+IFN0cmVhbSk7CisgIH5QdWJsaWNzU3RyZWFtKCk7CisgIEVycm9yIHJlbG9hZCgpOworCisgIHVpbnQzMl90IGdldFN5bUhhc2goKSBjb25zdDsKKyAgdWludDE2X3QgZ2V0VGh1bmtUYWJsZVNlY3Rpb24oKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0VGh1bmtUYWJsZU9mZnNldCgpIGNvbnN0OworICBjb25zdCBHU0lIYXNoVGFibGUgJmdldFB1YmxpY3NUYWJsZSgpIGNvbnN0IHsgcmV0dXJuIFB1YmxpY3NUYWJsZTsgfQorICBGaXhlZFN0cmVhbUFycmF5PHN1cHBvcnQ6OnVsaXR0bGUzMl90PiBnZXRBZGRyZXNzTWFwKCkgY29uc3QgeworICAgIHJldHVybiBBZGRyZXNzTWFwOworICB9CisgIEZpeGVkU3RyZWFtQXJyYXk8c3VwcG9ydDo6dWxpdHRsZTMyX3Q+IGdldFRodW5rTWFwKCkgY29uc3QgeworICAgIHJldHVybiBUaHVua01hcDsKKyAgfQorICBGaXhlZFN0cmVhbUFycmF5PFNlY3Rpb25PZmZzZXQ+IGdldFNlY3Rpb25PZmZzZXRzKCkgY29uc3QgeworICAgIHJldHVybiBTZWN0aW9uT2Zmc2V0czsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9wdHI8bXNmOjpNYXBwZWRCbG9ja1N0cmVhbT4gU3RyZWFtOworICBHU0lIYXNoVGFibGUgUHVibGljc1RhYmxlOworICBGaXhlZFN0cmVhbUFycmF5PHN1cHBvcnQ6OnVsaXR0bGUzMl90PiBBZGRyZXNzTWFwOworICBGaXhlZFN0cmVhbUFycmF5PHN1cHBvcnQ6OnVsaXR0bGUzMl90PiBUaHVua01hcDsKKyAgRml4ZWRTdHJlYW1BcnJheTxTZWN0aW9uT2Zmc2V0PiBTZWN0aW9uT2Zmc2V0czsKKworICBjb25zdCBQdWJsaWNzU3RyZWFtSGVhZGVyICpIZWFkZXI7Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUmF3Q29uc3RhbnRzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd0NvbnN0YW50cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiYmQzMzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd0NvbnN0YW50cy5oCkBAIC0wLDAgKzEsMTE5IEBACisvLz09PS0gUmF3Q29uc3RhbnRzLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUERCUkFXQ09OU1RBTlRTX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1JBV19QREJSQVdDT05TVEFOVFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQml0bWFza0VudW0uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworCitjb25zdCB1aW50MTZfdCBrSW52YWxpZFN0cmVhbUluZGV4ID0gMHhGRkZGOworCitlbnVtIFBkYlJhd19JbXBsVmVyIDogdWludDMyX3QgeworICBQZGJJbXBsVkMyID0gMTk5NDE2MTAsCisgIFBkYkltcGxWQzQgPSAxOTk1MDYyMywKKyAgUGRiSW1wbFZDNDEgPSAxOTk1MDgxNCwKKyAgUGRiSW1wbFZDNTAgPSAxOTk2MDMwNywKKyAgUGRiSW1wbFZDOTggPSAxOTk3MDYwNCwKKyAgUGRiSW1wbFZDNzBEZXAgPSAxOTk5MDYwNCwgLy8gZGVwcmVjYXRlZAorICBQZGJJbXBsVkM3MCA9IDIwMDAwNDA0LAorICBQZGJJbXBsVkM4MCA9IDIwMDMwOTAxLAorICBQZGJJbXBsVkMxMTAgPSAyMDA5MTIwMSwKKyAgUGRiSW1wbFZDMTQwID0gMjAxNDA1MDgsCit9OworCitlbnVtIGNsYXNzIFBkYlJhd19TcmNIZWFkZXJCbG9ja1ZlciA6IHVpbnQzMl90IHsgU3JjVmVyT25lID0gMTk5ODA4MjcgfTsKKworZW51bSBjbGFzcyBQZGJSYXdfRmVhdHVyZVNpZyA6IHVpbnQzMl90IHsKKyAgVkMxMTAgPSBQZGJJbXBsVkMxMTAsCisgIFZDMTQwID0gUGRiSW1wbFZDMTQwLAorICBOb1R5cGVNZXJnZSA9IDB4NEQ1NDRGNEUsCisgIE1pbmltYWxEZWJ1Z0luZm8gPSAweDQ5NEU0OTRELAorfTsKKworZW51bSBQZGJSYXdfRmVhdHVyZXMgOiB1aW50MzJfdCB7CisgIFBkYkZlYXR1cmVOb25lID0gMHgwLAorICBQZGJGZWF0dXJlQ29udGFpbnNJZFN0cmVhbSA9IDB4MSwKKyAgUGRiRmVhdHVyZU1pbmltYWxEZWJ1Z0luZm8gPSAweDIsCisgIFBkYkZlYXR1cmVOb1R5cGVNZXJnaW5nID0gMHg0LAorICBMTFZNX01BUktfQVNfQklUTUFTS19FTlVNKC8qIExhcmdlc3RWYWx1ZSA9ICovIFBkYkZlYXR1cmVOb1R5cGVNZXJnaW5nKQorfTsKKworZW51bSBQZGJSYXdfRGJpVmVyIDogdWludDMyX3QgeworICBQZGJEYmlWQzQxID0gOTMwODAzLAorICBQZGJEYmlWNTAgPSAxOTk2MDMwNywKKyAgUGRiRGJpVjYwID0gMTk5NzA2MDYsCisgIFBkYkRiaVY3MCA9IDE5OTkwOTAzLAorICBQZGJEYmlWMTEwID0gMjAwOTEyMDEKK307CisKK2VudW0gUGRiUmF3X1RwaVZlciA6IHVpbnQzMl90IHsKKyAgUGRiVHBpVjQwID0gMTk5NTA0MTAsCisgIFBkYlRwaVY0MSA9IDE5OTUxMTIyLAorICBQZGJUcGlWNTAgPSAxOTk2MTAzMSwKKyAgUGRiVHBpVjcwID0gMTk5OTA5MDMsCisgIFBkYlRwaVY4MCA9IDIwMDQwMjAzLAorfTsKKworZW51bSBQZGJSYXdfRGJpU2VjQ29udHJpYlZlciA6IHVpbnQzMl90IHsKKyAgRGJpU2VjQ29udHJpYlZlcjYwID0gMHhlZmZlMDAwMCArIDE5OTcwNjA1LAorICBEYmlTZWNDb250cmliVjIgPSAweGVmZmUwMDAwICsgMjAxNDA1MTYKK307CisKK2VudW0gU3BlY2lhbFN0cmVhbSA6IHVpbnQzMl90IHsKKyAgLy8gU3RyZWFtIDAgY29udGFpbnMgdGhlIGNvcHkgb2YgcHJldmlvdXMgdmVyc2lvbiBvZiB0aGUgTVNGIGRpcmVjdG9yeS4KKyAgLy8gV2UgYXJlIG5vdCBjdXJyZW50bHkgdXNpbmcgaXQsIGJ1dCB0ZWNobmljYWxseSBpZiB3ZSBmaW5kIHRoZSBtYWluCisgIC8vIE1TRiBpcyBjb3JydXB0ZWQsIHdlIGNvdWxkIGZhbGxiYWNrIHRvIGl0LgorICBPbGRNU0ZEaXJlY3RvcnkgPSAwLAorCisgIFN0cmVhbVBEQiA9IDEsCisgIFN0cmVhbVRQSSA9IDIsCisgIFN0cmVhbURCSSA9IDMsCisgIFN0cmVhbUlQSSA9IDQsCisKKyAga1NwZWNpYWxTdHJlYW1Db3VudAorfTsKKworZW51bSBjbGFzcyBEYmdIZWFkZXJUeXBlIDogdWludDE2X3QgeworICBGUE8sCisgIEV4Y2VwdGlvbiwKKyAgRml4dXAsCisgIE9tYXBUb1NyYywKKyAgT21hcEZyb21TcmMsCisgIFNlY3Rpb25IZHIsCisgIFRva2VuUmlkTWFwLAorICBYZGF0YSwKKyAgUGRhdGEsCisgIE5ld0ZQTywKKyAgU2VjdGlvbkhkck9yaWcsCisgIE1heAorfTsKKworZW51bSBjbGFzcyBPTUZTZWdEZXNjRmxhZ3MgOiB1aW50MTZfdCB7CisgIE5vbmUgPSAwLAorICBSZWFkID0gMSA8PCAwLCAgICAgICAgICAgICAgLy8gU2VnbWVudCBpcyByZWFkYWJsZS4KKyAgV3JpdGUgPSAxIDw8IDEsICAgICAgICAgICAgIC8vIFNlZ21lbnQgaXMgd3JpdGFibGUuCisgIEV4ZWN1dGUgPSAxIDw8IDIsICAgICAgICAgICAvLyBTZWdtZW50IGlzIGV4ZWN1dGFibGUuCisgIEFkZHJlc3NJczMyQml0ID0gMSA8PCAzLCAgICAvLyBEZXNjcmlwdG9yIGRlc2NyaWJlcyBhIDMyLWJpdCBsaW5lYXIgYWRkcmVzcy4KKyAgSXNTZWxlY3RvciA9IDEgPDwgOCwgICAgICAgIC8vIEZyYW1lIHJlcHJlc2VudHMgYSBzZWxlY3Rvci4KKyAgSXNBYnNvbHV0ZUFkZHJlc3MgPSAxIDw8IDksIC8vIEZyYW1lIHJlcHJlc2VudHMgYW4gYWJzb2x1dGUgYWRkcmVzcy4KKyAgSXNHcm91cCA9IDEgPDwgMTAsICAgICAgICAgIC8vIElmIHNldCwgZGVzY3JpcHRvciByZXByZXNlbnRzIGEgZ3JvdXAuCisgIExMVk1fTUFSS19BU19CSVRNQVNLX0VOVU0oLyogTGFyZ2VzdFZhbHVlID0gKi8gSXNHcm91cCkKK307CisKK0xMVk1fRU5BQkxFX0JJVE1BU0tfRU5VTVNfSU5fTkFNRVNQQUNFKCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBwZGIKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1BEQlJBV0NPTlNUQU5UU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd0Vycm9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd0Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzYyNGE3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUmF3RXJyb3IuaApAQCAtMCwwICsxLDUzIEBACisvLz09PS0gUmF3RXJyb3IuaCAtIEVycm9yIGV4dGVuc2lvbnMgZm9yIHJhdyBQREIgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUkFXRVJST1JfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1JBV0VSUk9SX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKK2VudW0gY2xhc3MgcmF3X2Vycm9yX2NvZGUgeworICB1bnNwZWNpZmllZCA9IDEsCisgIGZlYXR1cmVfdW5zdXBwb3J0ZWQsCisgIGludmFsaWRfZm9ybWF0LAorICBjb3JydXB0X2ZpbGUsCisgIGluc3VmZmljaWVudF9idWZmZXIsCisgIG5vX3N0cmVhbSwKKyAgaW5kZXhfb3V0X29mX2JvdW5kcywKKyAgaW52YWxpZF9ibG9ja19hZGRyZXNzLAorICBkdXBsaWNhdGVfZW50cnksCisgIG5vX2VudHJ5LAorICBub3Rfd3JpdGFibGUsCisgIHN0cmVhbV90b29fbG9uZywKKyAgaW52YWxpZF90cGlfaGFzaCwKK307CisKKy8vLyBCYXNlIGNsYXNzIGZvciBlcnJvcnMgb3JpZ2luYXRpbmcgd2hlbiBwYXJzaW5nIHJhdyBQREIgZmlsZXMKK2NsYXNzIFJhd0Vycm9yIDogcHVibGljIEVycm9ySW5mbzxSYXdFcnJvcj4geworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKyAgUmF3RXJyb3IocmF3X2Vycm9yX2NvZGUgQyk7CisgIFJhd0Vycm9yKGNvbnN0IHN0ZDo6c3RyaW5nICZDb250ZXh0KTsKKyAgUmF3RXJyb3IocmF3X2Vycm9yX2NvZGUgQywgY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnRleHQpOworCisgIHZvaWQgbG9nKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGU7CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRFcnJvck1lc3NhZ2UoKSBjb25zdDsKKyAgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBFcnJNc2c7CisgIHJhd19lcnJvcl9jb2RlIENvZGU7Cit9OworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd1R5cGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd1R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNjODgyMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUmF3VHlwZXMuaApAQCAtMCwwICsxLDM2MiBAQAorLy89PT0tIFJhd1R5cGVzLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1JBV1RZUEVTX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1JBV19SQVdUWVBFU19ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9HVUlELmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CisvLyBUaGlzIHN0cnVjdCBpcyBkZWZpbmVkIGFzICJTTyIgaW4gbGFuZ2FwaS9pbmNsdWRlL3BkYi5oLgorc3RydWN0IFNlY3Rpb25PZmZzZXQgeworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBPZmY7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IElzZWN0OworICBjaGFyIFBhZGRpbmdbMl07Cit9OworCisvLy8gSGVhZGVyIG9mIHRoZSBoYXNoIHRhYmxlcyBmb3VuZCBpbiB0aGUgZ2xvYmFscyBhbmQgcHVibGljcyBzZWN0aW9ucy4KKy8vLyBCYXNlZCBvbiBHU0lIYXNoSGRyIGluCisvLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9taWNyb3NvZnQtcGRiL2Jsb2IvbWFzdGVyL1BEQi9kYmkvZ3NpLmgKK3N0cnVjdCBHU0lIYXNoSGVhZGVyIHsKKyAgZW51bSA6IHVuc2lnbmVkIHsKKyAgICBIZHJTaWduYXR1cmUgPSB+MFUsCisgICAgSGRyVmVyc2lvbiA9IDB4ZWZmZTAwMDAgKyAxOTk5MDgxMCwKKyAgfTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVmVyU2lnbmF0dXJlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBWZXJIZHI7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEhyU2l6ZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTnVtQnVja2V0czsKK307CisKKy8vIFRoaXMgaXMgSFJGaWxlLgorc3RydWN0IFBTSGFzaFJlY29yZCB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE9mZjsgLy8gT2Zmc2V0IGluIHRoZSBzeW1ib2wgcmVjb3JkIHN0cmVhbQorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBDUmVmOworfTsKKworLy8gVGhpcyBzdHJ1Y3QgaXMgZGVmaW5lZCBhcyBgU0NgIGluIGluY2x1ZGUvZGJpY29tbW9uLmgKK3N0cnVjdCBTZWN0aW9uQ29udHJpYiB7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IElTZWN0OworICBjaGFyIFBhZGRpbmdbMl07CisgIHN1cHBvcnQ6OmxpdHRsZTMyX3QgT2ZmOworICBzdXBwb3J0OjpsaXR0bGUzMl90IFNpemU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IENoYXJhY3RlcmlzdGljczsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgSW1vZDsKKyAgY2hhciBQYWRkaW5nMlsyXTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRGF0YUNyYzsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUmVsb2NDcmM7Cit9OworCisvLyBUaGlzIHN0cnVjdCBpcyBkZWZpbmVkIGFzIGBTQzJgIGluIGluY2x1ZGUvZGJpY29tbW9uLmgKK3N0cnVjdCBTZWN0aW9uQ29udHJpYjIgeworICAvLyBUbyBndWFyYW50ZWUgU2VjdGlvbkNvbnRyaWIyIGlzIHN0YW5kYXJkIGxheW91dCwgd2UgY2Fubm90IHVzZSBpbmhlcml0YW5jZS4KKyAgU2VjdGlvbkNvbnRyaWIgQmFzZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgSVNlY3RDb2ZmOworfTsKKworLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYE9NRlNlZ01hcGAgc3RydWN0dXJlLgorc3RydWN0IFNlY01hcEhlYWRlciB7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFNlY0NvdW50OyAgICAvLyBOdW1iZXIgb2Ygc2VnbWVudCBkZXNjcmlwdG9ycyBpbiB0YWJsZQorICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBTZWNDb3VudExvZzsgLy8gTnVtYmVyIG9mIGxvZ2ljYWwgc2VnbWVudCBkZXNjcmlwdG9ycworfTsKKworLy8gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgYE9NRlNlZ01hcERlc2NgIHN0cnVjdHVyZS4gIFRoZSBkZWZpbml0aW9uIGlzIG5vdAorLy8gcHJlc2VudCBpbiB0aGUgcmVmZXJlbmNlIGltcGxlbWVudGF0aW9uLCBidXQgdGhlIGxheW91dCBpcyBkZXJpdmVkIGZyb20KKy8vIGNvZGUgdGhhdCBhY2Nlc3NlcyB0aGUgZmllbGRzLgorc3RydWN0IFNlY01hcEVudHJ5IHsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgRmxhZ3M7IC8vIERlc2NyaXB0b3IgZmxhZ3MuICBTZWUgT01GU2VnRGVzY0ZsYWdzCisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE92bDsgICAvLyBMb2dpY2FsIG92ZXJsYXkgbnVtYmVyLgorICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBHcm91cDsgLy8gR3JvdXAgaW5kZXggaW50byBkZXNjcmlwdG9yIGFycmF5LgorICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBGcmFtZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgU2VjTmFtZTsgICAgICAgLy8gQnl0ZSBpbmRleCBvZiB0aGUgc2VnbWVudCBvciBncm91cCBuYW1lCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRoZSBzc3RTZWdOYW1lIHRhYmxlLCBvciAweEZGRkYuCisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IENsYXNzTmFtZTsgICAgIC8vIEJ5dGUgaW5kZXggb2YgdGhlIGNsYXNzIG5hbWUgaW4gdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNzdFNlZ05hbWUgdGFibGUsIG9yIDB4RkZGRi4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgT2Zmc2V0OyAgICAgICAgLy8gQnl0ZSBvZmZzZXQgb2YgdGhlIGxvZ2ljYWwgc2VnbWVudAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB3aXRoaW4gdGhlIHNwZWNpZmllZCBwaHlzaWNhbCBzZWdtZW50LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBncm91cCBpcyBzZXQgaW4gZmxhZ3MsIG9mZnNldCBpcyB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IG9mIHRoZSBncm91cC4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2VjQnl0ZUxlbmd0aDsgLy8gQnl0ZSBjb3VudCBvZiB0aGUgc2VnbWVudCBvciBncm91cC4KK307CisKKy8vLyBTb21lIG9mIHRoZSB2YWx1ZXMgYXJlIHN0b3JlZCBpbiBiaXRmaWVsZHMuICBTaW5jZSB0aGlzIG5lZWRzIHRvIGJlIHBvcnRhYmxlCisvLy8gYWNyb3NzIGNvbXBpbGVycyBhbmQgYXJjaGl0ZWN0dXJlcyAoYmlnIC8gbGl0dGxlIGVuZGlhbiBpbiBwYXJ0aWN1bGFyKSB3ZQorLy8vIGNhbid0IHVzZSB0aGUgYWN0dWFsIHN0cnVjdHVyZXMgYmVsb3csIGJ1dCBtdXN0IGluc3RlYWQgZG8gdGhlIHNoaWZ0aW5nCisvLy8gYW5kIG1hc2tpbmcgb3Vyc2VsdmVzLiAgVGhlIHN0cnVjdCBkZWZpbml0aW9ucyBhcmUgcHJvdmlkZWQgZm9yIHJlZmVyZW5jZS4KK3N0cnVjdCBEYmlGbGFncyB7CisgIC8vLyAgdWludDE2X3QgSW5jcmVtZW50YWxMaW5raW5nIDogMTsgLy8gVHJ1ZSBpZiBsaW5rZWQgaW5jcmVtZW50YWxseQorICAvLy8gIHVpbnQxNl90IElzU3RyaXBwZWQgOiAxOyAgICAgICAgIC8vIFRydWUgaWYgcHJpdmF0ZSBzeW1ib2xzIHdlcmUKKyAgLy8vICBzdHJpcHBlZC4KKyAgLy8vICB1aW50MTZfdCBIYXNDVHlwZXMgOiAxOyAgICAgICAgICAvLyBUcnVlIGlmIGxpbmtlZCB3aXRoIC9kZWJ1ZzpjdHlwZXMuCisgIC8vLyAgdWludDE2X3QgUmVzZXJ2ZWQgOiAxMzsKKyAgc3RhdGljIGNvbnN0IHVpbnQxNl90IEZsYWdJbmNyZW1lbnRhbE1hc2sgPSAweDAwMDE7CisgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBGbGFnU3RyaXBwZWRNYXNrID0gMHgwMDAyOworICBzdGF0aWMgY29uc3QgdWludDE2X3QgRmxhZ0hhc0NUeXBlc01hc2sgPSAweDAwMDQ7Cit9OworCitzdHJ1Y3QgRGJpQnVpbGRObyB7CisgIC8vLyAgdWludDE2X3QgTWlub3JWZXJzaW9uIDogODsKKyAgLy8vICB1aW50MTZfdCBNYWpvclZlcnNpb24gOiA3OworICAvLy8gIHVpbnQxNl90IE5ld1ZlcnNpb25Gb3JtYXQgOiAxOworICBzdGF0aWMgY29uc3QgdWludDE2X3QgQnVpbGRNaW5vck1hc2sgPSAweDAwRkY7CisgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBCdWlsZE1pbm9yU2hpZnQgPSAwOworCisgIHN0YXRpYyBjb25zdCB1aW50MTZfdCBCdWlsZE1ham9yTWFzayA9IDB4N0YwMDsKKyAgc3RhdGljIGNvbnN0IHVpbnQxNl90IEJ1aWxkTWFqb3JTaGlmdCA9IDg7Cit9OworCisvLy8gVGhlIGZpeGVkIHNpemUgaGVhZGVyIHRoYXQgYXBwZWFycyBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBEQkkgU3RyZWFtLgorc3RydWN0IERiaVN0cmVhbUhlYWRlciB7CisgIHN1cHBvcnQ6OmxpdHRsZTMyX3QgVmVyc2lvblNpZ25hdHVyZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVmVyc2lvbkhlYWRlcjsKKworICAvLy8gSG93ICJvbGQiIGlzIHRoaXMgREJJIFN0cmVhbS4gU2hvdWxkIG1hdGNoIHRoZSBhZ2Ugb2YgdGhlIFBEQiBJbmZvU3RyZWFtLgorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBBZ2U7CisKKyAgLy8vIEdsb2JhbCBzeW1ib2wgc3RyZWFtICMKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgR2xvYmFsU3ltYm9sU3RyZWFtSW5kZXg7CisKKyAgLy8vIFNlZSBEYmlCdWlsZE5vIHN0cnVjdHVyZS4KKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgQnVpbGROdW1iZXI7CisKKyAgLy8vIFB1YmxpYyBzeW1ib2xzIHN0cmVhbSAjCisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFB1YmxpY1N5bWJvbFN0cmVhbUluZGV4OworCisgIC8vLyB2ZXJzaW9uIG9mIG1zcGRiTk5OLmRsbAorICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBQZGJEbGxWZXJzaW9uOworCisgIC8vLyBTeW1ib2wgcmVjb3JkcyBzdHJlYW0gIworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBTeW1SZWNvcmRTdHJlYW1JbmRleDsKKworICAvLy8gcmJsZCBudW1iZXIgb2YgbXNwZGJOTk4uZGxsCisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFBkYkRsbFJibGQ7CisKKyAgLy8vIFNpemUgb2YgbW9kdWxlIGluZm8gc3RyZWFtCisgIHN1cHBvcnQ6OmxpdHRsZTMyX3QgTW9kaVN1YnN0cmVhbVNpemU7CisKKyAgLy8vIFNpemUgb2Ygc2VjLiBjb250cmliIHN0cmVhbQorICBzdXBwb3J0OjpsaXR0bGUzMl90IFNlY0NvbnRyU3Vic3RyZWFtU2l6ZTsKKworICAvLy8gU2l6ZSBvZiBzZWMuIG1hcCBzdWJzdHJlYW0KKyAgc3VwcG9ydDo6bGl0dGxlMzJfdCBTZWN0aW9uTWFwU2l6ZTsKKworICAvLy8gU2l6ZSBvZiBmaWxlIGluZm8gc3Vic3RyZWFtCisgIHN1cHBvcnQ6OmxpdHRsZTMyX3QgRmlsZUluZm9TaXplOworCisgIC8vLyBTaXplIG9mIHR5cGUgc2VydmVyIG1hcAorICBzdXBwb3J0OjpsaXR0bGUzMl90IFR5cGVTZXJ2ZXJTaXplOworCisgIC8vLyBJbmRleCBvZiBNRkMgVHlwZSBTZXJ2ZXIKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTUZDVHlwZVNlcnZlckluZGV4OworCisgIC8vLyBTaXplIG9mIERiZ0hlYWRlciBpbmZvCisgIHN1cHBvcnQ6OmxpdHRsZTMyX3QgT3B0aW9uYWxEYmdIZHJTaXplOworCisgIC8vLyBTaXplIG9mIEVDIHN0cmVhbSAod2hhdCBpcyBFQz8pCisgIHN1cHBvcnQ6OmxpdHRsZTMyX3QgRUNTdWJzdHJlYW1TaXplOworCisgIC8vLyBTZWUgRGJpRmxhZ3MgZW51bS4KKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgRmxhZ3M7CisKKyAgLy8vIFNlZSBQREJfTWFjaGluZVR5cGUgZW51bS4KKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTWFjaGluZVR5cGU7CisKKyAgLy8vIFBhZCB0byA2NCBieXRlcworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBSZXNlcnZlZDsKK307CitzdGF0aWNfYXNzZXJ0KHNpemVvZihEYmlTdHJlYW1IZWFkZXIpID09IDY0LCAiSW52YWxpZCBEYmlTdHJlYW1IZWFkZXIgc2l6ZSEiKTsKKworc3RydWN0IFNlY3Rpb25Db250cmliRW50cnkgeworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBTZWN0aW9uOworICBjaGFyIFBhZGRpbmcxWzJdOworICBzdXBwb3J0OjpsaXR0bGUzMl90IE9mZnNldDsKKyAgc3VwcG9ydDo6bGl0dGxlMzJfdCBTaXplOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBDaGFyYWN0ZXJpc3RpY3M7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1vZHVsZUluZGV4OworICBjaGFyIFBhZGRpbmcyWzJdOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBEYXRhQ3JjOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBSZWxvY0NyYzsKK307CisKKy8vLyBUaGUgaGVhZGVyIHByZWNlZWRpbmcgdGhlIEZpbGUgSW5mbyBTdWJzdHJlYW0gb2YgdGhlIERCSSBzdHJlYW0uCitzdHJ1Y3QgRmlsZUluZm9TdWJzdHJlYW1IZWFkZXIgeworICAvLy8gVG90YWwgIyBvZiBtb2R1bGVzLCBzaG91bGQgbWF0Y2ggbnVtYmVyIG9mIHJlY29yZHMgaW4gdGhlIE1vZHVsZUluZm8KKyAgLy8vIHN1YnN0cmVhbS4KKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTnVtTW9kdWxlczsKKworICAvLy8gVG90YWwgIyBvZiBzb3VyY2UgZmlsZXMuIFRoaXMgdmFsdWUgaXMgbm90IGFjY3VyYXRlIGJlY2F1c2UgUERCIGFjdHVhbGx5CisgIC8vLyBzdXBwb3J0cyBtb3JlIHRoYW4gNjRrIHNvdXJjZSBmaWxlcywgc28gd2UgaWdub3JlIGl0IGFuZCBjb21wdXRlIHRoZSB2YWx1ZQorICAvLy8gZnJvbSBvdGhlciBzdHJlYW0gZmllbGRzLgorICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBOdW1Tb3VyY2VGaWxlczsKKworICAvLy8gRm9sbG93aW5nIHRoaXMgaGVhZGVyIHRoZSBGaWxlIEluZm8gU3Vic3RyZWFtIGlzIGxhaWQgb3V0IGFzIGZvbGxvd3M6CisgIC8vLyAgIHVsaXR0bGUxNl90IE1vZEluZGljZXNbTnVtTW9kdWxlc107CisgIC8vLyAgIHVsaXR0bGUxNl90IE1vZEZpbGVDb3VudHNbTnVtTW9kdWxlc107CisgIC8vLyAgIHVsaXR0bGUzMl90IEZpbGVOYW1lT2Zmc2V0c1tOdW1Tb3VyY2VGaWxlc107CisgIC8vLyAgIGNoYXIgTmFtZXNbXVtOdW1Tb3VyY2VGaWxlc107CisgIC8vLyB3aXRoIHRoZSBjYXZlYXQgdGhhdCBgTnVtU291cmNlRmlsZXNgIGNhbm5vdCBiZSB0cnVzdGVkLCBzbworICAvLy8gaXQgaXMgY29tcHV0ZWQgYnkgc3VtbWluZyB0aGUgYE1vZEZpbGVDb3VudHNgIGFycmF5LgorfTsKKworc3RydWN0IE1vZEluZm9GbGFncyB7CisgIC8vLyAgdWludDE2X3QgZldyaXR0ZW4gOiAxOyAgIC8vIFRydWUgaWYgRGJpTW9kdWxlRGVzY3JpcHRvciBpcyBkaXJ0eQorICAvLy8gIHVpbnQxNl90IGZFQ0VuYWJsZWQgOiAxOyAvLyBJcyBFQyBzeW1ib2xpYyBpbmZvIHByZXNlbnQ/ICAoV2hhdCBpcyBFQz8pCisgIC8vLyAgdWludDE2X3QgdW51c2VkIDogNjsgICAgIC8vIFJlc2VydmVkCisgIC8vLyAgdWludDE2X3QgaVRTTSA6IDg7ICAgICAgIC8vIFR5cGUgU2VydmVyIEluZGV4IGZvciB0aGlzIG1vZHVsZQorICBzdGF0aWMgY29uc3QgdWludDE2X3QgSGFzRUNGbGFnTWFzayA9IDB4MjsKKworICBzdGF0aWMgY29uc3QgdWludDE2X3QgVHlwZVNlcnZlckluZGV4TWFzayA9IDB4RkYwMDsKKyAgc3RhdGljIGNvbnN0IHVpbnQxNl90IFR5cGVTZXJ2ZXJJbmRleFNoaWZ0ID0gODsKK307CisKKy8vLyBUaGUgaGVhZGVyIHByZWNlZWRpbmcgZWFjaCBlbnRyeSBpbiB0aGUgTW9kdWxlIEluZm8gc3Vic3RyZWFtIG9mIHRoZSBEQkkKKy8vLyBzdHJlYW0uICBDb3JyZXNwb25kcyB0byB0aGUgdHlwZSBNT0RJIGluIHRoZSByZWZlcmVuY2UgaW1wbGVtZW50YXRpb24uCitzdHJ1Y3QgTW9kdWxlSW5mb0hlYWRlciB7CisgIC8vLyBDdXJyZW50bHkgb3BlbmVkIG1vZHVsZS4gVGhpcyBmaWVsZCBpcyBhIHBvaW50ZXIgaW4gdGhlIHJlZmVyZW5jZQorICAvLy8gaW1wbGVtZW50YXRpb24sIGJ1dCB0aGF0IHdvbid0IHdvcmsgb24gNjQtYml0IHN5c3RlbXMsIGFuZCBhbnl3YXkgaXQKKyAgLy8vIGRvZXNuJ3QgbWFrZSBzZW5zZSB0byByZWFkIGEgcG9pbnRlciBmcm9tIGEgZmlsZS4gRm9yIG5vdyBpdCBpcyB1bnVzZWQsCisgIC8vLyBzbyBqdXN0IGlnbm9yZSBpdC4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTW9kOworCisgIC8vLyBGaXJzdCBzZWN0aW9uIGNvbnRyaWJ1dGlvbiBvZiB0aGlzIG1vZHVsZS4KKyAgU2VjdGlvbkNvbnRyaWJFbnRyeSBTQzsKKworICAvLy8gU2VlIE1vZEluZm9GbGFncyBkZWZpbml0aW9uLgorICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBGbGFnczsKKworICAvLy8gU3RyZWFtIE51bWJlciBvZiBtb2R1bGUgZGVidWcgaW5mbworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNb2REaVN0cmVhbTsKKworICAvLy8gU2l6ZSBvZiBsb2NhbCBzeW1ib2wgZGVidWcgaW5mbyBpbiBhYm92ZSBzdHJlYW0KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU3ltQnl0ZXM7CisKKyAgLy8vIFNpemUgb2YgQzExIGxpbmUgbnVtYmVyIGluZm8gaW4gYWJvdmUgc3RyZWFtCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEMxMUJ5dGVzOworCisgIC8vLyBTaXplIG9mIEMxMyBsaW5lIG51bWJlciBpbmZvIGluIGFib3ZlIHN0cmVhbQorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBDMTNCeXRlczsKKworICAvLy8gTnVtYmVyIG9mIGZpbGVzIGNvbnRyaWJ1dGluZyB0byB0aGlzIG1vZHVsZQorICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBOdW1GaWxlczsKKworICAvLy8gUGFkZGluZyBzbyB0aGUgbmV4dCBmaWVsZCBpcyA0LWJ5dGUgYWxpZ25lZC4KKyAgY2hhciBQYWRkaW5nMVsyXTsKKworICAvLy8gQXJyYXkgb2YgWzAuLk51bUZpbGVzKSBEQkkgbmFtZSBidWZmZXIgb2Zmc2V0cy4gIEluIHRoZSByZWZlcmVuY2UKKyAgLy8vIGltcGxlbWVudGF0aW9uIHRoaXMgZmllbGQgaXMgYSBwb2ludGVyLiAgQnV0IHNpbmNlIHlvdSBjYW4ndCBwb3J0YWJseQorICAvLy8gc2VyaWFsaXplIGEgcG9pbnRlciwgb24gNjQtYml0IHBsYXRmb3JtcyB0aGV5IGNvcHkgYWxsIHRoZSB2YWx1ZXMgZXhjZXB0CisgIC8vLyB0aGlzIG9uZSBpbnRvIHRoZSAzMi1iaXQgdmVyc2lvbiBvZiB0aGUgc3RydWN0IGFuZCB1c2UgdGhhdCBmb3IKKyAgLy8vIHNlcmlhbGl6YXRpb24uICBSZWdhcmRsZXNzLCB0aGlzIGZpZWxkIGlzIHVudXNlZCwgaXQgaXMgb25seSB0aGVyZSB0bworICAvLy8gc3RvcmUgYSBwb2ludGVyIHRoYXQgY2FuIGJlIGFjY2Vzc2VkIGF0IHJ1bnRpbWUuCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEZpbGVOYW1lT2ZmczsKKworICAvLy8gTmFtZSBJbmRleCBmb3Igc3JjIGZpbGUgbmFtZQorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTcmNGaWxlTmFtZU5JOworCisgIC8vLyBOYW1lIEluZGV4IGZvciBwYXRoIHRvIGNvbXBpbGVyIFBEQgorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBQZGJGaWxlUGF0aE5JOworCisgIC8vLyBGb2xsb3dpbmcgdGhpcyBoZWFkZXIgYXJlIHR3byB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5ncy4KKyAgLy8vIGNoYXIgTW9kdWxlTmFtZVtdOworICAvLy8gY2hhciBPYmpGaWxlTmFtZVtdOworfTsKKworLy8gVGhpcyBpcyBQU0dTSUhEUiBzdHJ1Y3QgZGVmaW5lZCBpbgorLy8gaHR0cHM6Ly9naXRodWIuY29tL01pY3Jvc29mdC9taWNyb3NvZnQtcGRiL2Jsb2IvbWFzdGVyL1BEQi9kYmkvZ3NpLmgKK3N0cnVjdCBQdWJsaWNzU3RyZWFtSGVhZGVyIHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU3ltSGFzaDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQWRkck1hcDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTnVtVGh1bmtzOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTaXplT2ZUaHVuazsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgSVNlY3RUaHVua1RhYmxlOworICBjaGFyIFBhZGRpbmdbMl07CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE9mZlRodW5rVGFibGU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE51bVNlY3Rpb25zOworfTsKKworLy8gVGhlIGhlYWRlciBwcmVjZWVkaW5nIHRoZSBnbG9iYWwgVFBJIHN0cmVhbS4KKy8vIFRoaXMgY29ycmVzcG9uZHMgdG8gYEhEUmAgaW4gUERCL2RiaS90cGkuaC4KK3N0cnVjdCBUcGlTdHJlYW1IZWFkZXIgeworICBzdHJ1Y3QgRW1iZWRkZWRCdWYgeworICAgIHN1cHBvcnQ6OmxpdHRsZTMyX3QgT2ZmOworICAgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IExlbmd0aDsKKyAgfTsKKworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBWZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBIZWFkZXJTaXplOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBUeXBlSW5kZXhCZWdpbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVHlwZUluZGV4RW5kOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBUeXBlUmVjb3JkQnl0ZXM7CisKKyAgLy8gVGhlIGZvbGxvd2luZyBtZW1iZXJzIGNvcnJlc3BvbmQgdG8gYFRwaUhhc2hgIGluIFBEQi9kYmkvdHBpLmguCisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IEhhc2hTdHJlYW1JbmRleDsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgSGFzaEF1eFN0cmVhbUluZGV4OworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBIYXNoS2V5U2l6ZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTnVtSGFzaEJ1Y2tldHM7CisKKyAgRW1iZWRkZWRCdWYgSGFzaFZhbHVlQnVmZmVyOworICBFbWJlZGRlZEJ1ZiBJbmRleE9mZnNldEJ1ZmZlcjsKKyAgRW1iZWRkZWRCdWYgSGFzaEFkakJ1ZmZlcjsKK307CisKK2NvbnN0IHVpbnQzMl90IE1pblRwaUhhc2hCdWNrZXRzID0gMHgxMDAwOworY29uc3QgdWludDMyX3QgTWF4VHBpSGFzaEJ1Y2tldHMgPSAweDQwMDAwOworCisvLy8gVGhlIGhlYWRlciBwcmVjZWVkaW5nIHRoZSBnbG9iYWwgUERCIFN0cmVhbSAoU3RyZWFtIDEpCitzdHJ1Y3QgSW5mb1N0cmVhbUhlYWRlciB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNpZ25hdHVyZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQWdlOworICBjb2Rldmlldzo6R1VJRCBHdWlkOworfTsKKworLy8vIFRoZSBoZWFkZXIgcHJlY2VlZGluZyB0aGUgL25hbWVzIHN0cmVhbS4KK3N0cnVjdCBQREJTdHJpbmdUYWJsZUhlYWRlciB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNpZ25hdHVyZTsgICAvLyBQREJTdHJpbmdUYWJsZVNpZ25hdHVyZQorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBIYXNoVmVyc2lvbjsgLy8gMSBvciAyCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEJ5dGVTaXplOyAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgb2YgbmFtZXMgYnVmZmVyLgorfTsKKworY29uc3QgdWludDMyX3QgUERCU3RyaW5nVGFibGVTaWduYXR1cmUgPSAweEVGRkVFRkZFOworCisvLy8gVGhlIGhlYWRlciBwcmVjZWRpbmcgdGhlIC9zcmMvaGVhZGVyYmxvY2sgc3RyZWFtLgorc3RydWN0IFNyY0hlYWRlckJsb2NrSGVhZGVyIHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVmVyc2lvbjsgLy8gUGRiUmF3X1NyY0hlYWRlckJsb2NrVmVyIGVudW1lcmF0aW9uLgorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTaXplOyAgICAvLyBTaXplIG9mIGVudGlyZSBzdHJlYW0uCisgIHVpbnQ2NF90IEZpbGVUaW1lOyAgICAgICAgICAgIC8vIFRpbWUgc3RhbXAgKFdpbmRvd3MgRklMRVRJTUUgZm9ybWF0KS4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQWdlOyAgICAgLy8gQWdlCisgIHVpbnQ4X3QgUGFkZGluZ1s0NF07ICAgICAgICAgIC8vIFBhZCB0byA2NCBieXRlcy4KK307CitzdGF0aWNfYXNzZXJ0KHNpemVvZihTcmNIZWFkZXJCbG9ja0hlYWRlcikgPT0gNjQsICJJbmNvcnJlY3Qgc3RydWN0IHNpemUhIik7CisKKy8vLyBBIHNpbmdsZSBmaWxlIHJlY29yZCBlbnRyeSB3aXRoaW4gdGhlIC9zcmMvaGVhZGVyYmxvY2sgc3RyZWFtLgorc3RydWN0IFNyY0hlYWRlckJsb2NrRW50cnkgeworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTaXplOyAgICAgLy8gUmVjb3JkIExlbmd0aC4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVmVyc2lvbjsgIC8vIFBkYlJhd19TcmNIZWFkZXJCbG9ja1ZlciBlbnVtZXJhdGlvbi4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQ1JDOyAgICAgIC8vIENSQyBvZiB0aGUgb3JpZ2luYWwgZmlsZSBjb250ZW50cy4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRmlsZVNpemU7IC8vIFNpemUgb2Ygb3JpZ2luYWwgc291cmNlIGZpbGUuCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEZpbGVOSTsgICAvLyBTdHJpbmcgdGFibGUgaW5kZXggb2YgZmlsZSBuYW1lLgorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBPYmpOSTsgICAgLy8gU3RyaW5nIHRhYmxlIGluZGV4IG9mIG9iamVjdCBuYW1lLgorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBWRmlsZU5JOyAgLy8gU3RyaW5nIHRhYmxlIGluZGV4IG9mIHZpcnR1YWwgZmlsZSBuYW1lLgorICB1aW50OF90IENvbXByZXNzaW9uOyAgICAgICAgICAgLy8gUERCX1NvdXJjZUNvbXByZXNzaW9uIGVudW1lcmF0aW9uLgorICB1aW50OF90IElzVmlydHVhbDsgICAgICAgICAgICAgLy8gSXMgdGhpcyBhIHZpcnR1YWwgZmlsZSAoaW5qZWN0ZWQpPworICBzaG9ydCBQYWRkaW5nOyAgICAgICAgICAgICAgICAgLy8gUGFkIHRvIDQgYnl0ZXMuCisgIGNoYXIgUmVzZXJ2ZWRbOF07Cit9OworCitjb25zdGV4cHIgaW50IEkgPSBzaXplb2YoU3JjSGVhZGVyQmxvY2tFbnRyeSk7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihTcmNIZWFkZXJCbG9ja0VudHJ5KSA9PSA0MCwgIkluY29ycmVjdCBzdHJ1Y3Qgc2l6ZSEiKTsKKworfSAvLyBuYW1lc3BhY2UgcGRiCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9TeW1ib2xTdHJlYW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvU3ltYm9sU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWU5ZjdkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvU3ltYm9sU3RyZWFtLmgKQEAgLTAsMCArMSw0OCBAQAorLy89PT0tIFN5bWJvbFN0cmVhbS5jcHAgLSBQREIgU3ltYm9sIFN0cmVhbSBBY2Nlc3MgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUkFXX1BEQlNZTUJPTFNUUkVBTV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUERCU1lNQk9MU1RSRUFNX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1N5bWJvbFJlY29yZC5oIgorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBtc2YgeworY2xhc3MgTWFwcGVkQmxvY2tTdHJlYW07Cit9CituYW1lc3BhY2UgcGRiIHsKK2NsYXNzIFBEQkZpbGU7CisKK2NsYXNzIFN5bWJvbFN0cmVhbSB7CitwdWJsaWM6CisgIFN5bWJvbFN0cmVhbShzdGQ6OnVuaXF1ZV9wdHI8bXNmOjpNYXBwZWRCbG9ja1N0cmVhbT4gU3RyZWFtKTsKKyAgflN5bWJvbFN0cmVhbSgpOworICBFcnJvciByZWxvYWQoKTsKKworICBjb25zdCBjb2Rldmlldzo6Q1ZTeW1ib2xBcnJheSAmZ2V0U3ltYm9sQXJyYXkoKSBjb25zdCB7CisgICAgcmV0dXJuIFN5bWJvbFJlY29yZHM7CisgIH0KKworICBjb2Rldmlldzo6Q1ZTeW1ib2wgcmVhZFJlY29yZCh1aW50MzJfdCBPZmZzZXQpIGNvbnN0OworCisgIGl0ZXJhdG9yX3JhbmdlPGNvZGV2aWV3OjpDVlN5bWJvbEFycmF5OjpJdGVyYXRvcj4KKyAgZ2V0U3ltYm9scyhib29sICpIYWRFcnJvcikgY29uc3Q7CisKKyAgRXJyb3IgY29tbWl0KCk7CisKK3ByaXZhdGU6CisgIGNvZGV2aWV3OjpDVlN5bWJvbEFycmF5IFN5bWJvbFJlY29yZHM7CisgIHN0ZDo6dW5pcXVlX3B0cjxtc2Y6Ok1hcHBlZEJsb2NrU3RyZWFtPiBTdHJlYW07Cit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvVHBpSGFzaGluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9UcGlIYXNoaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzFlZGVjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvVHBpSGFzaGluZy5oCkBAIC0wLDAgKzEsMjQgQEAKKy8vPT09LSBUcGlIYXNoaW5nLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1RQSUhBU0hJTkdfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfVFBJSEFTSElOR19ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9UeXBlUmVjb3JkLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworCitFeHBlY3RlZDx1aW50MzJfdD4gaGFzaFR5cGVSZWNvcmQoY29uc3QgbGx2bTo6Y29kZXZpZXc6OkNWVHlwZSAmVHlwZSk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBwZGIKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfVFBJSEFTSElOR19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1RwaVN0cmVhbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9UcGlTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzc5Mzk5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9UcGlTdHJlYW0uaApAQCAtMCwwICsxLDg1IEBACisvLz09PS0gVHBpU3RyZWFtLmNwcCAtIFBEQiBUeXBlIEluZm8gKFRQSSkgU3RyZWFtIDIgQWNjZXNzIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUERCVFBJU1RSRUFNX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1JBV19QREJUUElTVFJFQU1fSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvSGFzaFRhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL05hdGl2ZS9SYXdDb25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd1R5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL1BEQlR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbUFycmF5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBjb2RldmlldyB7CitjbGFzcyBMYXp5UmFuZG9tVHlwZUNvbGxlY3Rpb247Cit9CituYW1lc3BhY2UgbXNmIHsKK2NsYXNzIE1hcHBlZEJsb2NrU3RyZWFtOworfQorbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBQREJGaWxlOworCitjbGFzcyBUcGlTdHJlYW0geworICBmcmllbmQgY2xhc3MgVHBpU3RyZWFtQnVpbGRlcjsKKworcHVibGljOgorICBUcGlTdHJlYW0oUERCRmlsZSAmRmlsZSwgc3RkOjp1bmlxdWVfcHRyPG1zZjo6TWFwcGVkQmxvY2tTdHJlYW0+IFN0cmVhbSk7CisgIH5UcGlTdHJlYW0oKTsKKyAgRXJyb3IgcmVsb2FkKCk7CisKKyAgUGRiUmF3X1RwaVZlciBnZXRUcGlWZXJzaW9uKCkgY29uc3Q7CisKKyAgdWludDMyX3QgVHlwZUluZGV4QmVnaW4oKSBjb25zdDsKKyAgdWludDMyX3QgVHlwZUluZGV4RW5kKCkgY29uc3Q7CisgIHVpbnQzMl90IGdldE51bVR5cGVSZWNvcmRzKCkgY29uc3Q7CisgIHVpbnQxNl90IGdldFR5cGVIYXNoU3RyZWFtSW5kZXgoKSBjb25zdDsKKyAgdWludDE2X3QgZ2V0VHlwZUhhc2hTdHJlYW1BdXhJbmRleCgpIGNvbnN0OworCisgIHVpbnQzMl90IGdldEhhc2hLZXlTaXplKCkgY29uc3Q7CisgIHVpbnQzMl90IGdldE51bUhhc2hCdWNrZXRzKCkgY29uc3Q7CisgIEZpeGVkU3RyZWFtQXJyYXk8c3VwcG9ydDo6dWxpdHRsZTMyX3Q+IGdldEhhc2hWYWx1ZXMoKSBjb25zdDsKKyAgRml4ZWRTdHJlYW1BcnJheTxjb2Rldmlldzo6VHlwZUluZGV4T2Zmc2V0PiBnZXRUeXBlSW5kZXhPZmZzZXRzKCkgY29uc3Q7CisgIEhhc2hUYWJsZTxzdXBwb3J0Ojp1bGl0dGxlMzJfdD4gJmdldEhhc2hBZGp1c3RlcnMoKTsKKworICBjb2Rldmlldzo6Q1ZUeXBlUmFuZ2UgdHlwZXMoYm9vbCAqSGFkRXJyb3IpIGNvbnN0OworICBjb25zdCBjb2Rldmlldzo6Q1ZUeXBlQXJyYXkgJnR5cGVBcnJheSgpIGNvbnN0IHsgcmV0dXJuIFR5cGVSZWNvcmRzOyB9CisKKyAgY29kZXZpZXc6OkxhenlSYW5kb21UeXBlQ29sbGVjdGlvbiAmdHlwZUNvbGxlY3Rpb24oKSB7IHJldHVybiAqVHlwZXM7IH0KKworICBCaW5hcnlTdWJzdHJlYW1SZWYgZ2V0VHlwZVJlY29yZHNTdWJzdHJlYW0oKSBjb25zdDsKKworICBFcnJvciBjb21taXQoKTsKKworcHJpdmF0ZToKKyAgUERCRmlsZSAmUGRiOworICBzdGQ6OnVuaXF1ZV9wdHI8bXNmOjpNYXBwZWRCbG9ja1N0cmVhbT4gU3RyZWFtOworCisgIHN0ZDo6dW5pcXVlX3B0cjxjb2Rldmlldzo6TGF6eVJhbmRvbVR5cGVDb2xsZWN0aW9uPiBUeXBlczsKKworICBCaW5hcnlTdWJzdHJlYW1SZWYgVHlwZVJlY29yZHNTdWJzdHJlYW07CisKKyAgY29kZXZpZXc6OkNWVHlwZUFycmF5IFR5cGVSZWNvcmRzOworCisgIHN0ZDo6dW5pcXVlX3B0cjxCaW5hcnlTdHJlYW0+IEhhc2hTdHJlYW07CisgIEZpeGVkU3RyZWFtQXJyYXk8c3VwcG9ydDo6dWxpdHRsZTMyX3Q+IEhhc2hWYWx1ZXM7CisgIEZpeGVkU3RyZWFtQXJyYXk8Y29kZXZpZXc6OlR5cGVJbmRleE9mZnNldD4gVHlwZUluZGV4T2Zmc2V0czsKKyAgSGFzaFRhYmxlPHN1cHBvcnQ6OnVsaXR0bGUzMl90PiBIYXNoQWRqdXN0ZXJzOworCisgIGNvbnN0IFRwaVN0cmVhbUhlYWRlciAqSGVhZGVyOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1RwaVN0cmVhbUJ1aWxkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvVHBpU3RyZWFtQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxMTcyMGQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1RwaVN0cmVhbUJ1aWxkZXIuaApAQCAtMCwwICsxLDkwIEBACisvLz09PS0gVHBpU3RyZWFtQnVpbGRlci5oIC0gUERCIFRwaSBTdHJlYW0gQ3JlYXRpb24gLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUERCVFBJU1RSRUFNQlVJTERFUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9SQVdfUERCVFBJU1RSRUFNQlVJTERFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L1R5cGVSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9OYXRpdmUvUmF3VHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeUJ5dGVTdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5SXRlbVN0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgQmluYXJ5Qnl0ZVN0cmVhbTsKK2NsYXNzIFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmOworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgQmluYXJ5SXRlbVRyYWl0czxsbHZtOjpjb2Rldmlldzo6Q1ZUeXBlPiB7CisgIHN0YXRpYyBzaXplX3QgbGVuZ3RoKGNvbnN0IGNvZGV2aWV3OjpDVlR5cGUgJkl0ZW0pIHsgcmV0dXJuIEl0ZW0ubGVuZ3RoKCk7IH0KKyAgc3RhdGljIEFycmF5UmVmPHVpbnQ4X3Q+IGJ5dGVzKGNvbnN0IGNvZGV2aWV3OjpDVlR5cGUgJkl0ZW0pIHsKKyAgICByZXR1cm4gSXRlbS5kYXRhKCk7CisgIH0KK307CisKK25hbWVzcGFjZSBjb2RldmlldyB7CitjbGFzcyBUeXBlUmVjb3JkOworfQorbmFtZXNwYWNlIG1zZiB7CitjbGFzcyBNU0ZCdWlsZGVyOworc3RydWN0IE1TRkxheW91dDsKK30KK25hbWVzcGFjZSBwZGIgeworY2xhc3MgUERCRmlsZTsKK2NsYXNzIFRwaVN0cmVhbTsKK3N0cnVjdCBUcGlTdHJlYW1IZWFkZXI7CisKK2NsYXNzIFRwaVN0cmVhbUJ1aWxkZXIgeworcHVibGljOgorICBleHBsaWNpdCBUcGlTdHJlYW1CdWlsZGVyKG1zZjo6TVNGQnVpbGRlciAmTXNmLCB1aW50MzJfdCBTdHJlYW1JZHgpOworICB+VHBpU3RyZWFtQnVpbGRlcigpOworCisgIFRwaVN0cmVhbUJ1aWxkZXIoY29uc3QgVHBpU3RyZWFtQnVpbGRlciAmKSA9IGRlbGV0ZTsKKyAgVHBpU3RyZWFtQnVpbGRlciAmb3BlcmF0b3I9KGNvbnN0IFRwaVN0cmVhbUJ1aWxkZXIgJikgPSBkZWxldGU7CisKKyAgdm9pZCBzZXRWZXJzaW9uSGVhZGVyKFBkYlJhd19UcGlWZXIgVmVyc2lvbik7CisgIHZvaWQgYWRkVHlwZVJlY29yZChBcnJheVJlZjx1aW50OF90PiBUeXBlLCBPcHRpb25hbDx1aW50MzJfdD4gSGFzaCk7CisKKyAgRXJyb3IgZmluYWxpemVNc2ZMYXlvdXQoKTsKKworICB1aW50MzJfdCBnZXRSZWNvcmRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIFR5cGVSZWNvcmRzLnNpemUoKTsgfQorCisgIEVycm9yIGNvbW1pdChjb25zdCBtc2Y6Ok1TRkxheW91dCAmTGF5b3V0LCBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiBCdWZmZXIpOworCisgIHVpbnQzMl90IGNhbGN1bGF0ZVNlcmlhbGl6ZWRMZW5ndGgoKTsKKworcHJpdmF0ZToKKyAgdWludDMyX3QgY2FsY3VsYXRlSGFzaEJ1ZmZlclNpemUoKSBjb25zdDsKKyAgdWludDMyX3QgY2FsY3VsYXRlSW5kZXhPZmZzZXRTaXplKCkgY29uc3Q7CisgIEVycm9yIGZpbmFsaXplKCk7CisKKyAgbXNmOjpNU0ZCdWlsZGVyICZNc2Y7CisgIEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvcjsKKworICBzaXplX3QgVHlwZVJlY29yZEJ5dGVzID0gMDsKKworICBQZGJSYXdfVHBpVmVyIFZlckhlYWRlciA9IFBkYlJhd19UcGlWZXI6OlBkYlRwaVY4MDsKKyAgc3RkOjp2ZWN0b3I8QXJyYXlSZWY8dWludDhfdD4+IFR5cGVSZWNvcmRzOworICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gVHlwZUhhc2hlczsKKyAgc3RkOjp2ZWN0b3I8Y29kZXZpZXc6OlR5cGVJbmRleE9mZnNldD4gVHlwZUluZGV4T2Zmc2V0czsKKyAgdWludDMyX3QgSGFzaFN0cmVhbUluZGV4ID0ga0ludmFsaWRTdHJlYW1JbmRleDsKKyAgc3RkOjp1bmlxdWVfcHRyPEJpbmFyeUJ5dGVTdHJlYW0+IEhhc2hWYWx1ZVN0cmVhbTsKKworICBjb25zdCBUcGlTdHJlYW1IZWFkZXIgKkhlYWRlcjsKKyAgdWludDMyX3QgSWR4OworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWY5ZGEzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREIuaApAQCAtMCwwICsxLDMyIEBACisvLz09PS0gUERCLmggLSBiYXNlIGhlYWRlciBmaWxlIGZvciBjcmVhdGluZyBhIFBEQiByZWFkZXIgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9QREJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9QREJUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIElQREJTZXNzaW9uOworCitFcnJvciBsb2FkRGF0YUZvclBEQihQREJfUmVhZGVyVHlwZSBUeXBlLCBTdHJpbmdSZWYgUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCU2Vzc2lvbj4gJlNlc3Npb24pOworCitFcnJvciBsb2FkRGF0YUZvckVYRShQREJfUmVhZGVyVHlwZSBUeXBlLCBTdHJpbmdSZWYgUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCU2Vzc2lvbj4gJlNlc3Npb24pOworCit9IC8vIGVuZCBuYW1lc3BhY2UgcGRiCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCQ29udGV4dC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQkNvbnRleHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wY2U0OWY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQkNvbnRleHQuaApAQCAtMCwwICsxLDY1IEBACisvLz09PS0tIFBEQkNvbnRleHQuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQkNPTlRFWFRfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCQ09OVEVYVF9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9ESUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvSVBEQlNlc3Npb24uaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIG9iamVjdCB7CitjbGFzcyBDT0ZGT2JqZWN0RmlsZTsKK30gLy8gZW5kIG5hbWVzcGFjZSBvYmplY3QKKworbmFtZXNwYWNlIHBkYiB7CisKKyAgLy8vIFBEQkNvbnRleHQKKyAgLy8vIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgdGhlIHRvcCBsZXZlbCBlbnRpdHkgdGhhdCBkZWFscyB3aXRoIFBEQiBkZWJ1ZworICAvLy8gaW5mb3JtYXRpb24gcGFyc2luZy4gIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgZXhpc3RzIG9ubHkgd2hlbiB0aGVyZSBpcyBhCisgIC8vLyBuZWVkIGZvciBhIHRyYW5zcGFyZW50IGludGVyZmFjZSB0byBkaWZmZXJlbnQgZGVidWcgaW5mb3JtYXRpb24gZm9ybWF0cworICAvLy8gKGUuZy4gUERCIGFuZCBEV0FSRikuICBNb3JlIGNvbnRyb2wgYW5kIHBvd2VyIG92ZXIgdGhlIGRlYnVnIGluZm9ybWF0aW9uCisgIC8vLyBhY2Nlc3MgY2FuIGJlIGhhZCBieSB1c2luZyB0aGUgUERCIGludGVyZmFjZXMgZGlyZWN0bHkuCisgIGNsYXNzIFBEQkNvbnRleHQgOiBwdWJsaWMgRElDb250ZXh0IHsKKyAgcHVibGljOgorICAgIFBEQkNvbnRleHQoY29uc3Qgb2JqZWN0OjpDT0ZGT2JqZWN0RmlsZSAmT2JqZWN0LAorICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJTZXNzaW9uPiBQREJTZXNzaW9uKTsKKyAgICBQREJDb250ZXh0KFBEQkNvbnRleHQgJikgPSBkZWxldGU7CisgICAgUERCQ29udGV4dCAmb3BlcmF0b3I9KFBEQkNvbnRleHQgJikgPSBkZWxldGU7CisKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERJQ29udGV4dCAqRElDdHgpIHsKKyAgICAgIHJldHVybiBESUN0eC0+Z2V0S2luZCgpID09IENLX1BEQjsKKyAgICB9CisKKyAgICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TLCBESUR1bXBPcHRpb25zIERJRHVtcE9wdHMpIG92ZXJyaWRlOworCisgICAgRElMaW5lSW5mbyBnZXRMaW5lSW5mb0ZvckFkZHJlc3MoCisgICAgICAgIHVpbnQ2NF90IEFkZHJlc3MsCisgICAgICAgIERJTGluZUluZm9TcGVjaWZpZXIgU3BlY2lmaWVyID0gRElMaW5lSW5mb1NwZWNpZmllcigpKSBvdmVycmlkZTsKKyAgICBESUxpbmVJbmZvVGFibGUgZ2V0TGluZUluZm9Gb3JBZGRyZXNzUmFuZ2UoCisgICAgICAgIHVpbnQ2NF90IEFkZHJlc3MsIHVpbnQ2NF90IFNpemUsCisgICAgICAgIERJTGluZUluZm9TcGVjaWZpZXIgU3BlY2lmaWVyID0gRElMaW5lSW5mb1NwZWNpZmllcigpKSBvdmVycmlkZTsKKyAgICBESUlubGluaW5nSW5mbyBnZXRJbmxpbmluZ0luZm9Gb3JBZGRyZXNzKAorICAgICAgICB1aW50NjRfdCBBZGRyZXNzLAorICAgICAgICBESUxpbmVJbmZvU3BlY2lmaWVyIFNwZWNpZmllciA9IERJTGluZUluZm9TcGVjaWZpZXIoKSkgb3ZlcnJpZGU7CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBnZXRGdW5jdGlvbk5hbWUodWludDY0X3QgQWRkcmVzcywgRElOYW1lS2luZCBOYW1lS2luZCkgY29uc3Q7CisgICAgc3RkOjp1bmlxdWVfcHRyPElQREJTZXNzaW9uPiBTZXNzaW9uOworICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgcGRiCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUERCQ09OVEVYVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCRXh0cmFzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCRXh0cmFzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2M5YTE5OAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJFeHRyYXMuaApAQCAtMCwwICsxLDQ4IEBACisvLz09PS0gUERCRXh0cmFzLmggLSBoZWxwZXIgZnVuY3Rpb25zIGFuZCBjbGFzc2VzIGZvciBQREJzIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9QREJFWFRSQVNfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCRVhUUkFTX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL1BEQlR5cGVzLmgiCisjaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworbmFtZXNwYWNlIHBkYiB7CisKK3VzaW5nIFRhZ1N0YXRzID0gc3RkOjp1bm9yZGVyZWRfbWFwPFBEQl9TeW1UeXBlLCBpbnQ+OworCityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFBEQl9WYXJpYW50VHlwZSAmVmFsdWUpOworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQREJfQ2FsbGluZ0NvbnYgJkNvbnYpOworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQREJfRGF0YUtpbmQgJkRhdGEpOworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBjb2Rldmlldzo6UmVnaXN0ZXJJZCAmUmVnKTsKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgUERCX0xvY1R5cGUgJkxvYyk7CityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IGNvZGV2aWV3OjpUaHVua09yZGluYWwgJlRodW5rKTsKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgUERCX0NoZWNrc3VtICZDaGVja3N1bSk7CityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFBEQl9MYW5nICZMYW5nKTsKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgUERCX1N5bVR5cGUgJlRhZyk7CityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFBEQl9NZW1iZXJBY2Nlc3MgJkFjY2Vzcyk7CityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFBEQl9VZHRUeXBlICZUeXBlKTsKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgUERCX01hY2hpbmUgJk1hY2hpbmUpOworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUERCX1NvdXJjZUNvbXByZXNzaW9uICZDb21wcmVzc2lvbik7CisKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgVmFyaWFudCAmVmFsdWUpOworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBWZXJzaW9uSW5mbyAmVmVyc2lvbik7CityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFRhZ1N0YXRzICZTdGF0cyk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBwZGIKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJFWFRSQVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bUR1bXBlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bUR1bXBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5NzY5MzUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltRHVtcGVyLmgKQEAgLTAsMCArMSw3OSBAQAorLy89PT0tIFBEQlN5bUR1bXBlci5oIC0gYmFzZSBpbnRlcmZhY2UgZm9yIFBEQiBzeW1ib2wgZHVtcGVyICotIEMrKyAtLS0tLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNRFVNUEVSX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTURVTVBFUl9ICisKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bUR1bXBlciB7CitwdWJsaWM6CisgIFBEQlN5bUR1bXBlcihib29sIFNob3VsZFJlcXVpcmVJbXBsKTsKKyAgdmlydHVhbCB+UERCU3ltRHVtcGVyKCk7CisKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sQW5ub3RhdGlvbiAmU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sQmxvY2sgJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbENvbXBpbGFuZCAmU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sQ29tcGlsYW5kRGV0YWlscyAmU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sQ29tcGlsYW5kRW52ICZTeW1ib2wpOworICB2aXJ0dWFsIHZvaWQgZHVtcChjb25zdCBQREJTeW1ib2xDdXN0b20gJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbERhdGEgJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbEV4ZSAmU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sRnVuYyAmU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sRnVuY0RlYnVnRW5kICZTeW1ib2wpOworICB2aXJ0dWFsIHZvaWQgZHVtcChjb25zdCBQREJTeW1ib2xGdW5jRGVidWdTdGFydCAmU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sTGFiZWwgJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbFB1YmxpY1N5bWJvbCAmU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sVGh1bmsgJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbFR5cGVBcnJheSAmU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sVHlwZUJhc2VDbGFzcyAmU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sVHlwZUJ1aWx0aW4gJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbFR5cGVDdXN0b20gJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbFR5cGVEaW1lbnNpb24gJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbFR5cGVFbnVtICZTeW1ib2wpOworICB2aXJ0dWFsIHZvaWQgZHVtcChjb25zdCBQREJTeW1ib2xUeXBlRnJpZW5kICZTeW1ib2wpOworICB2aXJ0dWFsIHZvaWQgZHVtcChjb25zdCBQREJTeW1ib2xUeXBlRnVuY3Rpb25BcmcgJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbFR5cGVGdW5jdGlvblNpZyAmU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sVHlwZU1hbmFnZWQgJlN5bWJvbCk7CisgIHZpcnR1YWwgdm9pZCBkdW1wKGNvbnN0IFBEQlN5bWJvbFR5cGVQb2ludGVyICZTeW1ib2wpOworICB2aXJ0dWFsIHZvaWQgZHVtcChjb25zdCBQREJTeW1ib2xUeXBlVHlwZWRlZiAmU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sVHlwZVVEVCAmU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sVHlwZVZUYWJsZSAmU3ltYm9sKTsKKyAgdmlydHVhbCB2b2lkIGR1bXAoY29uc3QgUERCU3ltYm9sVHlwZVZUYWJsZVNoYXBlICZTeW1ib2wpOworICB2aXJ0dWFsIHZvaWQgZHVtcChjb25zdCBQREJTeW1ib2xVbmtub3duICZTeW1ib2wpOworICB2aXJ0dWFsIHZvaWQgZHVtcChjb25zdCBQREJTeW1ib2xVc2luZ05hbWVzcGFjZSAmU3ltYm9sKTsKKworICB2aXJ0dWFsIHZvaWQgZHVtcFJpZ2h0KGNvbnN0IFBEQlN5bWJvbFR5cGVBcnJheSAmU3ltYm9sKSB7fQorICB2aXJ0dWFsIHZvaWQgZHVtcFJpZ2h0KGNvbnN0IFBEQlN5bWJvbFR5cGVCYXNlQ2xhc3MgJlN5bWJvbCkge30KKyAgdmlydHVhbCB2b2lkIGR1bXBSaWdodChjb25zdCBQREJTeW1ib2xUeXBlQnVpbHRpbiAmU3ltYm9sKSB7fQorICB2aXJ0dWFsIHZvaWQgZHVtcFJpZ2h0KGNvbnN0IFBEQlN5bWJvbFR5cGVDdXN0b20gJlN5bWJvbCkge30KKyAgdmlydHVhbCB2b2lkIGR1bXBSaWdodChjb25zdCBQREJTeW1ib2xUeXBlRGltZW5zaW9uICZTeW1ib2wpIHt9CisgIHZpcnR1YWwgdm9pZCBkdW1wUmlnaHQoY29uc3QgUERCU3ltYm9sVHlwZUVudW0gJlN5bWJvbCkge30KKyAgdmlydHVhbCB2b2lkIGR1bXBSaWdodChjb25zdCBQREJTeW1ib2xUeXBlRnJpZW5kICZTeW1ib2wpIHt9CisgIHZpcnR1YWwgdm9pZCBkdW1wUmlnaHQoY29uc3QgUERCU3ltYm9sVHlwZUZ1bmN0aW9uQXJnICZTeW1ib2wpIHt9CisgIHZpcnR1YWwgdm9pZCBkdW1wUmlnaHQoY29uc3QgUERCU3ltYm9sVHlwZUZ1bmN0aW9uU2lnICZTeW1ib2wpIHt9CisgIHZpcnR1YWwgdm9pZCBkdW1wUmlnaHQoY29uc3QgUERCU3ltYm9sVHlwZU1hbmFnZWQgJlN5bWJvbCkge30KKyAgdmlydHVhbCB2b2lkIGR1bXBSaWdodChjb25zdCBQREJTeW1ib2xUeXBlUG9pbnRlciAmU3ltYm9sKSB7fQorICB2aXJ0dWFsIHZvaWQgZHVtcFJpZ2h0KGNvbnN0IFBEQlN5bWJvbFR5cGVUeXBlZGVmICZTeW1ib2wpIHt9CisgIHZpcnR1YWwgdm9pZCBkdW1wUmlnaHQoY29uc3QgUERCU3ltYm9sVHlwZVVEVCAmU3ltYm9sKSB7fQorICB2aXJ0dWFsIHZvaWQgZHVtcFJpZ2h0KGNvbnN0IFBEQlN5bWJvbFR5cGVWVGFibGUgJlN5bWJvbCkge30KKyAgdmlydHVhbCB2b2lkIGR1bXBSaWdodChjb25zdCBQREJTeW1ib2xUeXBlVlRhYmxlU2hhcGUgJlN5bWJvbCkge30KKworcHJpdmF0ZToKKyAgYm9vbCBSZXF1aXJlSW1wbDsKK307Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0MzczNDYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8vPT09LSBQREJTeW1ib2wuaCAtIGJhc2UgY2xhc3MgZm9yIHVzZXItZmFjaW5nIHN5bWJvbCB0eXBlcyAtLS0tLSotIEMrKy0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xfSAorCisjaW5jbHVkZSAiQ29uY3JldGVTeW1ib2xFbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiSVBEQlJhd1N5bWJvbC5oIgorI2luY2x1ZGUgIlBEQkV4dHJhcy5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKworI2RlZmluZSBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoTWV0aG9kTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYXV0byBNZXRob2ROYW1lKCkgY29uc3QtPmRlY2x0eXBlKFJhd1N5bWJvbC0+TWV0aG9kTmFtZSgpKSB7ICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIFJhd1N5bWJvbC0+TWV0aG9kTmFtZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgRk9SV0FSRF9DT05DUkVURV9TWU1CT0xfSURfTUVUSE9EX1dJVEhfTkFNRShDb25jcmV0ZVR5cGUsIFByaXZhdGVOYW1lLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHVibGljTmFtZSkgICAgICAgICAgICAgICAgXAorICBhdXRvIFB1YmxpY05hbWUjI0lkKCkgY29uc3QtPmRlY2x0eXBlKFJhd1N5bWJvbC0+UHJpdmF0ZU5hbWUjI0lkKCkpIHsgICAgICAgIFwKKyAgICByZXR1cm4gUmF3U3ltYm9sLT5Qcml2YXRlTmFtZSMjSWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGQ6OnVuaXF1ZV9wdHI8Q29uY3JldGVUeXBlPiBQdWJsaWNOYW1lKCkgY29uc3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB1aW50MzJfdCBJZCA9IFB1YmxpY05hbWUjI0lkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGdldENvbmNyZXRlU3ltYm9sQnlJZEhlbHBlcjxDb25jcmV0ZVR5cGU+KElkKTsgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EX1dJVEhfTkFNRShQcml2YXRlTmFtZSwgUHVibGljTmFtZSkgICAgICAgICAgICBcCisgIEZPUldBUkRfQ09OQ1JFVEVfU1lNQk9MX0lEX01FVEhPRF9XSVRIX05BTUUoUERCU3ltYm9sLCBQcml2YXRlTmFtZSwgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB1YmxpY05hbWUpCisKKyNkZWZpbmUgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKE1ldGhvZE5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRF9XSVRIX05BTUUoTWV0aG9kTmFtZSwgTWV0aG9kTmFtZSkKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBTdHJpbmdSZWY7CitjbGFzcyByYXdfb3N0cmVhbTsKKworbmFtZXNwYWNlIHBkYiB7CitjbGFzcyBJUERCUmF3U3ltYm9sOworY2xhc3MgSVBEQlNlc3Npb247CisKKyNkZWZpbmUgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoVGFnVmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBjb25zdCBQREJfU3ltVHlwZSBUYWcgPSBUYWdWYWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFBEQlN5bWJvbCAqUykgeyByZXR1cm4gUy0+Z2V0U3ltVGFnKCkgPT0gVGFnOyB9CisKKy8vLyBQREJTeW1ib2wgZGVmaW5lcyB0aGUgYmFzZSBvZiB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5IGZvciBjb25jcmV0ZSBzeW1ib2wKKy8vLyB0eXBlcyAoZS5nLiBmdW5jdGlvbnMsIGV4ZWN1dGFibGVzLCB2dGFibGVzLCBldGMpLiAgQWxsIGNvbmNyZXRlIHN5bWJvbAorLy8vIHR5cGVzIGluaGVyaXQgZnJvbSBQREJTeW1ib2wgYW5kIGV4cG9zZSB0aGUgZXhhY3Qgc2V0IG9mIG1ldGhvZHMgdGhhdCBhcmUKKy8vLyB2YWxpZCBmb3IgdGhhdCBwYXJ0aWN1bGFyIHN5bWJvbCB0eXBlLCBhcyBkZXNjcmliZWQgaW4gdGhlIE1pY3Jvc29mdAorLy8vIHJlZmVyZW5jZSAiTGV4aWNhbCBhbmQgQ2xhc3MgSGllcmFyY2h5IG9mIFN5bWJvbCBUeXBlcyI6CisvLy8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS8zNzBoczZrNC5hc3B4CitjbGFzcyBQREJTeW1ib2wgeworcHJvdGVjdGVkOgorICBQREJTeW1ib2woY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gU3ltYm9sKTsKKyAgUERCU3ltYm9sKFBEQlN5bWJvbCAmU3ltYm9sKTsKKworcHVibGljOgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbD4KKyAgY3JlYXRlKGNvbnN0IElQREJTZXNzaW9uICZQREJTZXNzaW9uLCBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gU3ltYm9sKTsKKworICB2aXJ0dWFsIH5QREJTeW1ib2woKTsKKworICAvLy8gRHVtcHMgdGhlIGNvbnRlbnRzIG9mIGEgc3ltYm9sIGEgcmF3X29zdHJlYW0uICBCeSBkZWZhdWx0IHRoaXMgd2lsbCBqdXN0CisgIC8vLyBjYWxsIGR1bXAoKSBvbiB0aGUgdW5kZXJseWluZyBSYXdTeW1ib2wsIHdoaWNoIGFsbG93cyB1cyB0byBkaXNjb3ZlcgorICAvLy8gdW5rbm93biBwcm9wZXJ0aWVzLCBidXQgaW5kaXZpZHVhbCBpbXBsZW1lbnRhdGlvbnMgb2YgUERCU3ltYm9sIG1heQorICAvLy8gb3ZlcnJpZGUgdGhlIGJlaGF2aW9yIHRvIG9ubHkgZHVtcCBrbm93biBmaWVsZHMuCisgIHZpcnR1YWwgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCA9IDA7CisKKyAgLy8vIEZvciBjZXJ0YWluIFBEQlN5bWJvbFR5cGVzLCBkdW1wcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgdHlwZSB0aGF0CisgIC8vLyBub3JtYWxseSBnb2VzIG9uIHRoZSByaWdodCBzaWRlIG9mIHRoZSBzeW1ib2wuCisgIHZpcnR1YWwgdm9pZCBkdW1wUmlnaHQoUERCU3ltRHVtcGVyICZEdW1wZXIpIGNvbnN0IHt9CisKKyAgdm9pZCBkZWZhdWx0RHVtcChyYXdfb3N0cmVhbSAmT1MsIGludCBJbmRlbnQpIGNvbnN0OworICB2b2lkIGR1bXBQcm9wZXJ0aWVzKCkgY29uc3Q7CisgIHZvaWQgZHVtcENoaWxkU3RhdHMoKSBjb25zdDsKKworICBQREJfU3ltVHlwZSBnZXRTeW1UYWcoKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0U3ltSW5kZXhJZCgpIGNvbnN0OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdGQ6OnVuaXF1ZV9wdHI8VD4gZmluZE9uZUNoaWxkKCkgY29uc3QgeworICAgIGF1dG8gRW51bWVyYXRvcihmaW5kQWxsQ2hpbGRyZW48VD4oKSk7CisgICAgaWYgKCFFbnVtZXJhdG9yKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIEVudW1lcmF0b3ItPmdldE5leHQoKTsKKyAgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2w+IGNsb25lKCkgY29uc3Q7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0ZDo6dW5pcXVlX3B0cjxDb25jcmV0ZVN5bWJvbEVudW1lcmF0b3I8VD4+IGZpbmRBbGxDaGlsZHJlbigpIGNvbnN0IHsKKyAgICBhdXRvIEJhc2VJdGVyID0gUmF3U3ltYm9sLT5maW5kQ2hpbGRyZW4oVDo6VGFnKTsKKyAgICBpZiAoIUJhc2VJdGVyKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIGxsdm06Om1ha2VfdW5pcXVlPENvbmNyZXRlU3ltYm9sRW51bWVyYXRvcjxUPj4oc3RkOjptb3ZlKEJhc2VJdGVyKSk7CisgIH0KKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4gZmluZEFsbENoaWxkcmVuKFBEQl9TeW1UeXBlIFR5cGUpIGNvbnN0OworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPiBmaW5kQWxsQ2hpbGRyZW4oKSBjb25zdDsKKworICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQkVudW1TeW1ib2xzPgorICBmaW5kQ2hpbGRyZW4oUERCX1N5bVR5cGUgVHlwZSwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICBQREJfTmFtZVNlYXJjaEZsYWdzIEZsYWdzKSBjb25zdDsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4gZmluZENoaWxkcmVuQnlSVkEoUERCX1N5bVR5cGUgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBEQl9OYW1lU2VhcmNoRmxhZ3MgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJWQSkgY29uc3Q7CisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+IGZpbmRJbmxpbmVGcmFtZXNCeVJWQSh1aW50MzJfdCBSVkEpIGNvbnN0OworCisgIGNvbnN0IElQREJSYXdTeW1ib2wgJmdldFJhd1N5bWJvbCgpIGNvbnN0IHsgcmV0dXJuICpSYXdTeW1ib2w7IH0KKyAgSVBEQlJhd1N5bWJvbCAmZ2V0UmF3U3ltYm9sKCkgeyByZXR1cm4gKlJhd1N5bWJvbDsgfQorCisgIGNvbnN0IElQREJTZXNzaW9uICZnZXRTZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gU2Vzc2lvbjsgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bVN5bWJvbHM+IGdldENoaWxkU3RhdHMoVGFnU3RhdHMgJlN0YXRzKSBjb25zdDsKKworcHJvdGVjdGVkOgorICBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sPiBnZXRTeW1ib2xCeUlkSGVscGVyKHVpbnQzMl90IElkKSBjb25zdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ29uY3JldGVUeXBlPgorICBzdGQ6OnVuaXF1ZV9wdHI8Q29uY3JldGVUeXBlPiBnZXRDb25jcmV0ZVN5bWJvbEJ5SWRIZWxwZXIodWludDMyX3QgSWQpIGNvbnN0IHsKKyAgICByZXR1cm4gdW5pcXVlX2R5bl9jYXN0X29yX251bGw8Q29uY3JldGVUeXBlPihnZXRTeW1ib2xCeUlkSGVscGVyKElkKSk7CisgIH0KKworICBjb25zdCBJUERCU2Vzc2lvbiAmU2Vzc2lvbjsKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IFJhd1N5bWJvbDsKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sQW5ub3RhdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbEFubm90YXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTY5MTQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbEFubm90YXRpb24uaApAQCAtMCwwICsxLDM5IEBACisvLz09PS0gUERCU3ltYm9sQW5ub3RhdGlvbi5oIC0gQWNjZXNzb3JzIGZvciBxdWVyeWluZyBQREIgYW5ub3RhdGlvbnMgLS0tKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MQU5OT1RBVElPTl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xBTk5PVEFUSU9OX0gKKworI2luY2x1ZGUgIlBEQlN5bWJvbC5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgUERCU3ltYm9sQW5ub3RhdGlvbiA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xBbm5vdGF0aW9uKGNvbnN0IElQREJTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCUmF3U3ltYm9sPiBTeW1ib2wpOworCisgIERFQ0xBUkVfUERCX1NZTUJPTF9DT05DUkVURV9UWVBFKFBEQl9TeW1UeXBlOjpBbm5vdGF0aW9uKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldEFkZHJlc3NPZmZzZXQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRBZGRyZXNzU2VjdGlvbikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldERhdGFLaW5kKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0UmVsYXRpdmVWaXJ0dWFsQWRkcmVzcykKKyAgLy8gRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFZhbHVlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VmlydHVhbEFkZHJlc3MpCit9OworfQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTEFOTk9UQVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbEJsb2NrLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sQmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODFkYTFlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbEJsb2NrLmgKQEAgLTAsMCArMSw0MiBAQAorLy89PT0tIFBEQlN5bWJvbEJsb2NrLmggLSBBY2Nlc3NvcnMgZm9yIHF1ZXJ5aW5nIFBEQiBibG9ja3MgLS0tLS0tLS0tLS0tLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTEJMT0NLX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTEJMT0NLX0gKKworI2luY2x1ZGUgIlBEQlN5bWJvbC5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xCbG9jayA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xCbG9jayhjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IFN5bWJvbCk7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OkJsb2NrKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldEFkZHJlc3NPZmZzZXQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRBZGRyZXNzU2VjdGlvbikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldExlbmd0aCkKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldExleGljYWxQYXJlbnQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRMb2NhdGlvblR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXROYW1lKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0UmVsYXRpdmVWaXJ0dWFsQWRkcmVzcykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFZpcnR1YWxBZGRyZXNzKQorfTsKK30KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xCTE9DS19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sQ29tcGlsYW5kLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sQ29tcGlsYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTU0OTA4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xDb21waWxhbmQuaApAQCAtMCwwICsxLDQyIEBACisvLz09PS0gUERCU3ltYm9sQ29tcGlsYW5kLmggLSBBY2Nlc3NvcnMgZm9yIHF1ZXJ5aW5nIFBEQiBjb21waWxhbmRzIC0tLS0tKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MQ09NUElMQU5EX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTENPTVBJTEFORF9ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbENvbXBpbGFuZCA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xDb21waWxhbmQoY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gQ29tcGlsYW5kU3ltYm9sKTsKKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6Q29tcGlsYW5kKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzRWRpdEFuZENvbnRpbnVlRW5hYmxlZCkKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldExleGljYWxQYXJlbnQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRMaWJyYXJ5TmFtZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldE5hbWUpCisKKyAgc3RkOjpzdHJpbmcgZ2V0U291cmNlRmlsZU5hbWUoKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgZ2V0U291cmNlRmlsZUZ1bGxQYXRoKCkgY29uc3Q7Cit9OworfQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTENPTVBJTEFORF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sQ29tcGlsYW5kRGV0YWlscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbENvbXBpbGFuZERldGFpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmE1MGM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbENvbXBpbGFuZERldGFpbHMuaApAQCAtMCwwICsxLDU3IEBACisvLz09PS0gUERCU3ltYm9sQ29tcGlsYW5kRGV0YWlscy5oIC0gUERCIGNvbXBpbGFuZCBkZXRhaWxzIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xDT01QSUxBTkRERVRBSUxTX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTENPTVBJTEFORERFVEFJTFNfSAorCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xDb21waWxhbmREZXRhaWxzIDogcHVibGljIFBEQlN5bWJvbCB7CitwdWJsaWM6CisgIFBEQlN5bWJvbENvbXBpbGFuZERldGFpbHMoY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IFN5bWJvbCk7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OkNvbXBpbGFuZERldGFpbHMpCisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGdldEZyb250RW5kVmVyc2lvbihWZXJzaW9uSW5mbyAmVmVyc2lvbikgY29uc3QgeworICAgIFJhd1N5bWJvbC0+Z2V0RnJvbnRFbmRWZXJzaW9uKFZlcnNpb24pOworICB9CisKKyAgdm9pZCBnZXRCYWNrRW5kVmVyc2lvbihWZXJzaW9uSW5mbyAmVmVyc2lvbikgY29uc3QgeworICAgIFJhd1N5bWJvbC0+Z2V0QmFja0VuZFZlcnNpb24oVmVyc2lvbik7CisgIH0KKworICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0Q29tcGlsZXJOYW1lKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNFZGl0QW5kQ29udGludWVFbmFibGVkKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzRGVidWdJbmZvKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzTWFuYWdlZENvZGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNTZWN1cml0eUNoZWNrcykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzQ1ZUQ0lMKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNEYXRhQWxpZ25lZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzSG90cGF0Y2hhYmxlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNMVENHKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNNU0lMTmV0bW9kdWxlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TGFuZ3VhZ2UpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRMZXhpY2FsUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0UGxhdGZvcm0pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRTb3VyY2VGaWxlTmFtZSkKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJGVU5DVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sQ29tcGlsYW5kRW52LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sQ29tcGlsYW5kRW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzg2OGYwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xDb21waWxhbmRFbnYuaApAQCAtMCwwICsxLDM3IEBACisvLz09PS0gUERCU3ltYm9sQ29tcGlsYW5kRW52LmggLSBjb21waWxhbmQgZW52aXJvbm1lbnQgdmFyaWFibGVzICotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xDT01QSUxBTkRFTlZfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MQ09NUElMQU5ERU5WX0gKKworI2luY2x1ZGUgIlBEQlN5bWJvbC5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CituYW1lc3BhY2UgcGRiIHsKK2NsYXNzIFBEQlN5bWJvbENvbXBpbGFuZEVudiA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xDb21waWxhbmRFbnYoY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gU3ltYm9sKTsKKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6Q29tcGlsYW5kRW52KQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldExleGljYWxQYXJlbnQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXROYW1lKQorICBzdGQ6OnN0cmluZyBnZXRWYWx1ZSgpIGNvbnN0OworfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTENPTVBJTEFOREVOVl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sQ3VzdG9tLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sQ3VzdG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTRmMDg5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xDdXN0b20uaApAQCAtMCwwICsxLDQwIEBACisvLz09PS0gUERCU3ltYm9sQ3VzdG9tLmggLSBjb21waWxlci1zcGVjaWZpYyB0eXBlcyAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xDVVNUT01fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MQ1VTVE9NX0gKKworI2luY2x1ZGUgIlBEQlN5bWJvbC5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworbmFtZXNwYWNlIHBkYiB7CisvLy8gUERCU3ltYm9sQ3VzdG9tIHJlcHJlc2VudHMgc3ltYm9scyB0aGF0IGFyZSBjb21waWxlci1zcGVjaWZpYyBhbmQgZG8gbm90CisvLy8gZml0IGFueXdoZXJlIGVsc2UgaW4gdGhlIGxleGljYWwgaGllcmFyY2h5LgorLy8vIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvZDg4c2YwOWguYXNweAorY2xhc3MgUERCU3ltYm9sQ3VzdG9tIDogcHVibGljIFBEQlN5bWJvbCB7CitwdWJsaWM6CisgIFBEQlN5bWJvbEN1c3RvbShjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCUmF3U3ltYm9sPiBDdXN0b21TeW1ib2wpOworCisgIERFQ0xBUkVfUERCX1NZTUJPTF9DT05DUkVURV9UWVBFKFBEQl9TeW1UeXBlOjpDdXN0b20pCisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICB2b2lkIGdldERhdGFCeXRlcyhsbHZtOjpTbWFsbFZlY3Rvcjx1aW50OF90LCAzMj4gJmJ5dGVzKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xDVVNUT01fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbERhdGEuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xEYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZiMTRiZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xEYXRhLmgKQEAgLTAsMCArMSw2NCBAQAorLy89PT0tIFBEQlN5bWJvbERhdGEuaCAtIFBEQiBkYXRhIChlLmcuIHZhcmlhYmxlKSBhY2Nlc3NvcnMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MREFUQV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xEQVRBX0gKKworI2luY2x1ZGUgIklQREJMaW5lTnVtYmVyLmgiCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbERhdGEgOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sRGF0YShjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gRGF0YVN5bWJvbCk7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OkRhdGEpCisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0QWNjZXNzKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0QWRkcmVzc09mZnNldCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldEFkZHJlc3NTZWN0aW9uKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0QWRkcmVzc1Rha2VuKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0Qml0UG9zaXRpb24pCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRDbGFzc1BhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzQ29tcGlsZXJHZW5lcmF0ZWQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc0NvbnN0VHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldERhdGFLaW5kKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNBZ2dyZWdhdGVkKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNTcGxpdHRlZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldExlbmd0aCkKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldExleGljYWxQYXJlbnQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRMb2NhdGlvblR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXROYW1lKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0T2Zmc2V0KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0UmVnaXN0ZXJJZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFJlbGF0aXZlVmlydHVhbEFkZHJlc3MpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRTbG90KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VG9rZW4pCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNVbmFsaWduZWRUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VmFsdWUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRWaXJ0dWFsQWRkcmVzcykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVm9sYXRpbGVUeXBlKQorCisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUxpbmVOdW1iZXJzPiBnZXRMaW5lTnVtYmVycygpIGNvbnN0OworICB1aW50MzJfdCBnZXRDb21waWxhbmRJZCgpIGNvbnN0OworfTsKK30gLy8gbmFtZXNwYWNlIHBkYgorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTERBVEFfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbEV4ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbEV4ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjMmQ3NDYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sRXhlLmgKQEAgLTAsMCArMSw0OSBAQAorLy89PT0tIFBEQlN5bWJvbEV4ZS5oIC0gQWNjZXNzb3JzIGZvciBxdWVyeWluZyBleGVjdXRhYmxlcyBpbiBhIFBEQiAtLS0tKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xFWEVfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MRVhFX0gKKworI2luY2x1ZGUgIlBEQlN5bWJvbC5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xFeGUgOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sRXhlKGNvbnN0IElQREJTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IEV4ZVN5bWJvbCk7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OkV4ZSkKKworICB2b2lkIGR1bXAoUERCU3ltRHVtcGVyICZEdW1wZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRBZ2UpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRHdWlkKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzQ1R5cGVzKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzUHJpdmF0ZVN5bWJvbHMpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRNYWNoaW5lVHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldE5hbWUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRTaWduYXR1cmUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRTeW1ib2xzRmlsZU5hbWUpCisKKyAgdWludDMyX3QgZ2V0UG9pbnRlckJ5dGVTaXplKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIHZvaWQgZHVtcENoaWxkcmVuKHJhd19vc3RyZWFtICZPUywgU3RyaW5nUmVmIExhYmVsLCBQREJfU3ltVHlwZSBDaGlsZFR5cGUsCisgICAgICAgICAgICAgICAgICAgIGludCBJbmRlbnQpIGNvbnN0OworfTsKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xFWEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbEZ1bmMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xGdW5jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYwMTNlMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xGdW5jLmgKQEAgLTAsMCArMSw4OCBAQAorLy89PT0tIFBEQlN5bWJvbEZ1bmMuaCAtIGNsYXNzIHJlcHJlc2VudGluZyBhIGZ1bmN0aW9uIGluc3RhbmNlIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MRlVOQ19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xGVU5DX0gKKworI2luY2x1ZGUgIklQREJMaW5lTnVtYmVyLmgiCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCU3ltYm9sVHlwZUZ1bmN0aW9uU2lnLmgiCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbEZ1bmMgOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sRnVuYyhjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gRnVuY1N5bWJvbCk7CisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIGlzRGVzdHJ1Y3RvcigpIGNvbnN0OworCisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUNoaWxkcmVuPFBEQlN5bWJvbERhdGE+PiBnZXRBcmd1bWVudHMoKSBjb25zdDsKKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6RnVuY3Rpb24pCisKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldEFjY2VzcykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldEFkZHJlc3NPZmZzZXQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRBZGRyZXNzU2VjdGlvbikKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldENsYXNzUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNDb21waWxlckdlbmVyYXRlZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzQ29uc3RUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzQ3VzdG9tQ2FsbGluZ0NvbnZlbnRpb24pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNGYXJSZXR1cm4pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNBbGxvY2EpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNFSCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc0VIYSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc0lubEFzbSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc0xvbmdKdW1wKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzU0VIKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzU2VjdXJpdHlDaGVja3MpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNTZXRKdW1wKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzSW50ZXJydXB0UmV0dXJuKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNJbnRyb1ZpcnR1YWxGdW5jdGlvbikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc0lubGluZUF0dHJpYnV0ZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzTmFrZWQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1N0YXRpYykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldExlbmd0aCkKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldExleGljYWxQYXJlbnQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRMb2NhbEJhc2VQb2ludGVyUmVnaXN0ZXJJZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldExvY2F0aW9uVHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldE5hbWUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNGcmFtZVBvaW50ZXIpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNOb0lubGluZUF0dHJpYnV0ZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc05vUmV0dXJuQXR0cmlidXRlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNVbnJlYWNoZWQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXROb1N0YWNrT3JkZXJpbmcpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNPcHRpbWl6ZWRDb2RlRGVidWdJbmZvKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNQdXJlVmlydHVhbCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFJlbGF0aXZlVmlydHVhbEFkZHJlc3MpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRUb2tlbikKKyAgRk9SV0FSRF9DT05DUkVURV9TWU1CT0xfSURfTUVUSE9EX1dJVEhfTkFNRShQREJTeW1ib2xUeXBlRnVuY3Rpb25TaWcsIGdldFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0U2lnbmF0dXJlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNVbmFsaWduZWRUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VW5kZWNvcmF0ZWROYW1lKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNWaXJ0dWFsKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VmlydHVhbEFkZHJlc3MpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRWaXJ0dWFsQmFzZU9mZnNldCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVm9sYXRpbGVUeXBlKQorCisgIHN0ZDo6dW5pcXVlX3B0cjxJUERCRW51bUxpbmVOdW1iZXJzPiBnZXRMaW5lTnVtYmVycygpIGNvbnN0OworICB1aW50MzJfdCBnZXRDb21waWxhbmRJZCgpIGNvbnN0OworfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTEZVTkNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbEZ1bmNEZWJ1Z0VuZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbEZ1bmNEZWJ1Z0VuZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzNDFiZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sRnVuY0RlYnVnRW5kLmgKQEAgLTAsMCArMSw1MSBAQAorLy89PT0tIFBEQlN5bWJvbEZ1bmNEZWJ1Z0VuZC5oIC0gZnVuY3Rpb24gZW5kIGJvdW5kcyBpbmZvIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MRlVOQ0RFQlVHRU5EX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTEZVTkNERUJVR0VORF9ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgUERCU3ltYm9sRnVuY0RlYnVnRW5kIDogcHVibGljIFBEQlN5bWJvbCB7CitwdWJsaWM6CisgIFBEQlN5bWJvbEZ1bmNEZWJ1Z0VuZChjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCUmF3U3ltYm9sPiBGdW5jRGVidWdFbmRTeW1ib2wpOworCisgIERFQ0xBUkVfUERCX1NZTUJPTF9DT05DUkVURV9UWVBFKFBEQl9TeW1UeXBlOjpGdW5jRGVidWdFbmQpCisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0QWRkcmVzc09mZnNldCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldEFkZHJlc3NTZWN0aW9uKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzQ3VzdG9tQ2FsbGluZ0NvbnZlbnRpb24pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNGYXJSZXR1cm4pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNJbnRlcnJ1cHRSZXR1cm4pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1N0YXRpYykKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldExleGljYWxQYXJlbnQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRMb2NhdGlvblR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNOb0lubGluZUF0dHJpYnV0ZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc05vUmV0dXJuQXR0cmlidXRlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNVbnJlYWNoZWQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRPZmZzZXQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNPcHRpbWl6ZWRDb2RlRGVidWdJbmZvKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0UmVsYXRpdmVWaXJ0dWFsQWRkcmVzcykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFZpcnR1YWxBZGRyZXNzKQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTEZVTkNERUJVR0VORF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sRnVuY0RlYnVnU3RhcnQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xGdW5jRGVidWdTdGFydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3Mjk4MzgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sRnVuY0RlYnVnU3RhcnQuaApAQCAtMCwwICsxLDUwIEBACisvLz09PS0gUERCU3ltYm9sRnVuY0RlYnVnU3RhcnQuaCAtIGZ1bmN0aW9uIHN0YXJ0IGJvdW5kcyBpbmZvIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xGVU5DREVCVUdTVEFSVF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xGVU5DREVCVUdTVEFSVF9ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbEZ1bmNEZWJ1Z1N0YXJ0IDogcHVibGljIFBEQlN5bWJvbCB7CitwdWJsaWM6CisgIFBEQlN5bWJvbEZ1bmNEZWJ1Z1N0YXJ0KGNvbnN0IElQREJTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gRnVuY0RlYnVnU3RhcnRTeW1ib2wpOworCisgIERFQ0xBUkVfUERCX1NZTUJPTF9DT05DUkVURV9UWVBFKFBEQl9TeW1UeXBlOjpGdW5jRGVidWdTdGFydCkKKworICB2b2lkIGR1bXAoUERCU3ltRHVtcGVyICZEdW1wZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRBZGRyZXNzT2Zmc2V0KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0QWRkcmVzc1NlY3Rpb24pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNDdXN0b21DYWxsaW5nQ29udmVudGlvbikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc0ZhclJldHVybikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc0ludGVycnVwdFJldHVybikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzU3RhdGljKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0TGV4aWNhbFBhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldExvY2F0aW9uVHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc05vSW5saW5lQXR0cmlidXRlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzTm9SZXR1cm5BdHRyaWJ1dGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1VucmVhY2hlZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldE9mZnNldCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc09wdGltaXplZENvZGVEZWJ1Z0luZm8pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRSZWxhdGl2ZVZpcnR1YWxBZGRyZXNzKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VmlydHVhbEFkZHJlc3MpCit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MRlVOQ0RFQlVHU1RBUlRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbExhYmVsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sTGFiZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMmIxYzI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbExhYmVsLmgKQEAgLTAsMCArMSw1MCBAQAorLy89PT0tIFBEQlN5bWJvbExhYmVsLmggLSBsYWJlbCBpbmZvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MTEFCRUxfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MTEFCRUxfSAorCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xMYWJlbCA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xMYWJlbChjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IExhYmVsU3ltYm9sKTsKKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6TGFiZWwpCisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0QWRkcmVzc09mZnNldCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldEFkZHJlc3NTZWN0aW9uKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzQ3VzdG9tQ2FsbGluZ0NvbnZlbnRpb24pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNGYXJSZXR1cm4pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNJbnRlcnJ1cHRSZXR1cm4pCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRMZXhpY2FsUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TG9jYXRpb25UeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TmFtZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc05vSW5saW5lQXR0cmlidXRlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzTm9SZXR1cm5BdHRyaWJ1dGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1VucmVhY2hlZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldE9mZnNldCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc09wdGltaXplZENvZGVEZWJ1Z0luZm8pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRSZWxhdGl2ZVZpcnR1YWxBZGRyZXNzKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VmlydHVhbEFkZHJlc3MpCit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MTEFCRUxfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFB1YmxpY1N5bWJvbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFB1YmxpY1N5bWJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5ZTZlZTYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sUHVibGljU3ltYm9sLmgKQEAgLTAsMCArMSw0OCBAQAorLy89PT0tIFBEQlN5bWJvbFB1YmxpY1N5bWJvbC5oIC0gcHVibGljIHN5bWJvbCBpbmZvIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MUFVCTElDU1lNQk9MX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFBVQkxJQ1NZTUJPTF9ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbFB1YmxpY1N5bWJvbCA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xQdWJsaWNTeW1ib2woY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gUHVibGljU3ltYm9sKTsKKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6UHVibGljU3ltYm9sKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldEFkZHJlc3NPZmZzZXQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRBZGRyZXNzU2VjdGlvbikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzQ29kZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzRnVuY3Rpb24pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRMZW5ndGgpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRMZXhpY2FsUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TG9jYXRpb25UeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNNYW5hZ2VkQ29kZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzTVNJTENvZGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXROYW1lKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0UmVsYXRpdmVWaXJ0dWFsQWRkcmVzcykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFZpcnR1YWxBZGRyZXNzKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VW5kZWNvcmF0ZWROYW1lKQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFBVQkxJQ1NZTUJPTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVGh1bmsuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUaHVuay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNGZhZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVGh1bmsuaApAQCAtMCwwICsxLDU3IEBACisvLz09PS0gUERCU3ltYm9sVGh1bmsuaCAtIFN1cHBvcnQgZm9yIHF1ZXJ5aW5nIFBEQiB0aHVua3MgLS0tLS0tLS0tLS0tLS0tKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUSFVOS19ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUSFVOS19ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbFRodW5rIDogcHVibGljIFBEQlN5bWJvbCB7CitwdWJsaWM6CisgIFBEQlN5bWJvbFRodW5rKGNvbnN0IElQREJTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gVGh1bmtTeW1ib2wpOworCisgIERFQ0xBUkVfUERCX1NZTUJPTF9DT05DUkVURV9UWVBFKFBEQl9TeW1UeXBlOjpUaHVuaykKKworICB2b2lkIGR1bXAoUERCU3ltRHVtcGVyICZEdW1wZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRBY2Nlc3MpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRBZGRyZXNzT2Zmc2V0KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0QWRkcmVzc1NlY3Rpb24pCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRDbGFzc1BhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzQ29uc3RUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNJbnRyb1ZpcnR1YWxGdW5jdGlvbikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzU3RhdGljKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TGVuZ3RoKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0TGV4aWNhbFBhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldE5hbWUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1B1cmVWaXJ0dWFsKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0UmVsYXRpdmVWaXJ0dWFsQWRkcmVzcykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFRhcmdldE9mZnNldCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFRhcmdldFJlbGF0aXZlVmlydHVhbEFkZHJlc3MpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRUYXJnZXRWaXJ0dWFsQWRkcmVzcykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFRhcmdldFNlY3Rpb24pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRUaHVua09yZGluYWwpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNVbmFsaWduZWRUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNWaXJ0dWFsKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VmlydHVhbEFkZHJlc3MpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRWaXJ0dWFsQmFzZU9mZnNldCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVm9sYXRpbGVUeXBlKQorfTsKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUSFVOS19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZUFycmF5LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZUFycmF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzliN2QzYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlQXJyYXkuaApAQCAtMCwwICsxLDQ1IEBACisvLz09PS0gUERCU3ltYm9sVHlwZUFycmF5LmggLSBhcnJheSB0eXBlIGluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFQVJSQVlfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRUFSUkFZX0gKKworI2luY2x1ZGUgIlBEQlN5bWJvbC5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgUERCU3ltYm9sVHlwZUFycmF5IDogcHVibGljIFBEQlN5bWJvbCB7CitwdWJsaWM6CisgIFBEQlN5bWJvbFR5cGVBcnJheShjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCUmF3U3ltYm9sPiBBcnJheVR5cGVTeW1ib2wpOworCisgIERFQ0xBUkVfUERCX1NZTUJPTF9DT05DUkVURV9UWVBFKFBEQl9TeW1UeXBlOjpBcnJheVR5cGUpCisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBkdW1wUmlnaHQoUERCU3ltRHVtcGVyICZEdW1wZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRBcnJheUluZGV4VHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzQ29uc3RUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0Q291bnQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRMZW5ndGgpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRMZXhpY2FsUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0UmFuaykKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EX1dJVEhfTkFNRShnZXRUeXBlLCBnZXRFbGVtZW50VHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVW5hbGlnbmVkVHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVm9sYXRpbGVUeXBlKQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVBUlJBWV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZUJhc2VDbGFzcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVCYXNlQ2xhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjA3YTNkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVCYXNlQ2xhc3MuaApAQCAtMCwwICsxLDY0IEBACisvLz09PS0gUERCU3ltYm9sVHlwZUJhc2VDbGFzcy5oIC0gYmFzZSBjbGFzcyB0eXBlIGluZm9ybWF0aW9uIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFQkFTRUNMQVNTX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVCQVNFQ0xBU1NfSAorCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlVlRhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVWVGFibGVTaGFwZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbFR5cGVCYXNlQ2xhc3MgOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sVHlwZUJhc2VDbGFzcyhjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gU3ltYm9sKTsKKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6QmFzZUNsYXNzKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldEFjY2VzcykKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldENsYXNzUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzQ29uc3RydWN0b3IpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc0NvbnN0VHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc0Fzc2lnbm1lbnRPcGVyYXRvcikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc0Nhc3RPcGVyYXRvcikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc05lc3RlZFR5cGVzKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNJbmRpcmVjdFZpcnR1YWxCYXNlQ2xhc3MpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRMZW5ndGgpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRMZXhpY2FsUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TmFtZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzTmVzdGVkKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0T2Zmc2V0KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzT3ZlcmxvYWRlZE9wZXJhdG9yKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNQYWNrZWQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1Njb3BlZCkKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRVZHRLaW5kKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNVbmFsaWduZWRUeXBlKQorCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1ZpcnR1YWxCYXNlQ2xhc3MpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRWaXJ0dWFsQmFzZURpc3BJbmRleCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFZpcnR1YWxCYXNlUG9pbnRlck9mZnNldCkKKyAgLy8gRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFZpcnR1YWxCYXNlVGFibGVUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0VmlydHVhbFRhYmxlU2hhcGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1ZvbGF0aWxlVHlwZSkKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFQkFTRUNMQVNTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlQnVpbHRpbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVCdWlsdGluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWIxODYzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlQnVpbHRpbi5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vPT09LSBQREJTeW1ib2xUeXBlQnVpbHRpbi5oIC0gYnVpbHRpbiB0eXBlIGluZm9ybWF0aW9uIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVCVUlMVElOX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVCVUlMVElOX0gKKworI2luY2x1ZGUgIlBEQlN5bWJvbC5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgUERCU3ltYm9sVHlwZUJ1aWx0aW4gOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sVHlwZUJ1aWx0aW4oY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCUmF3U3ltYm9sPiBTeW1ib2wpOworCisgIERFQ0xBUkVfUERCX1NZTUJPTF9DT05DUkVURV9UWVBFKFBEQl9TeW1UeXBlOjpCdWlsdGluVHlwZSkKKworICB2b2lkIGR1bXAoUERCU3ltRHVtcGVyICZEdW1wZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRCdWlsdGluVHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzQ29uc3RUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TGVuZ3RoKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0TGV4aWNhbFBhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVW5hbGlnbmVkVHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVm9sYXRpbGVUeXBlKQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVCVUlMVElOX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlQ3VzdG9tLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZUN1c3RvbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5OWIzZjgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZUN1c3RvbS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vPT09LSBQREJTeW1ib2xUeXBlQ3VzdG9tLmggLSBjdXN0b20gY29tcGlsZXIgdHlwZSBpbmZvcm1hdGlvbiAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVDVVNUT01fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRUNVU1RPTV9ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbFR5cGVDdXN0b20gOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sVHlwZUN1c3RvbShjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gU3ltYm9sKTsKKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6Q3VzdG9tVHlwZSkKKworICB2b2lkIGR1bXAoUERCU3ltRHVtcGVyICZEdW1wZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRPZW1JZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldE9lbVN5bWJvbElkKQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVDVVNUT01fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVEaW1lbnNpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlRGltZW5zaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYzNWViNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlRGltZW5zaW9uLmgKQEAgLTAsMCArMSwzNyBAQAorLy89PT0tIFBEQlN5bWJvbFR5cGVEaW1lbnNpb24uaCAtIGFycmF5IGRpbWVuc2lvbiB0eXBlIGluZm8gLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRURJTUVOU0lPTl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFRElNRU5TSU9OX0gKKworI2luY2x1ZGUgIlBEQlN5bWJvbC5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgUERCU3ltYm9sVHlwZURpbWVuc2lvbiA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xUeXBlRGltZW5zaW9uKGNvbnN0IElQREJTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCUmF3U3ltYm9sPiBTeW1ib2wpOworCisgIERFQ0xBUkVfUERCX1NZTUJPTF9DT05DUkVURV9UWVBFKFBEQl9TeW1UeXBlOjpEaW1lbnNpb24pCisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TG93ZXJCb3VuZElkKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VXBwZXJCb3VuZElkKQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVESU1FTlNJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVFbnVtLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZUVudW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZGJlN2U1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVFbnVtLmgKQEAgLTAsMCArMSw1NiBAQAorLy89PT0tIFBEQlN5bWJvbFR5cGVFbnVtLmggLSBlbnVtIHR5cGUgaW5mbyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRUVOVU1fSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRUVOVU1fSAorCisjaW5jbHVkZSAiSVBEQkxpbmVOdW1iZXIuaCIKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJTeW1ib2xUeXBlQnVpbHRpbi5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgUERCU3ltYm9sVHlwZUVudW0gOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sVHlwZUVudW0oY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCUmF3U3ltYm9sPiBFbnVtVHlwZVN5bWJvbCk7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OkVudW0pCisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0QnVpbHRpblR5cGUpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRDbGFzc1BhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc0NvbnN0cnVjdG9yKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNDb25zdFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNBc3NpZ25tZW50T3BlcmF0b3IpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNDYXN0T3BlcmF0b3IpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNOZXN0ZWRUeXBlcykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldExlbmd0aCkKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldExleGljYWxQYXJlbnQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXROYW1lKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0U3JjTGluZU9uVHlwZURlZm4pCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc05lc3RlZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc092ZXJsb2FkZWRPcGVyYXRvcikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzUGFja2VkKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNTY29wZWQpCisgIEZPUldBUkRfQ09OQ1JFVEVfU1lNQk9MX0lEX01FVEhPRF9XSVRIX05BTUUoUERCU3ltYm9sVHlwZUJ1aWx0aW4sIGdldFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VW5kZXJseWluZ1R5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1VuYWxpZ25lZFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1ZvbGF0aWxlVHlwZSkKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFRU5VTV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZUZyaWVuZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVGcmllbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGMxMzEyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVGcmllbmQuaApAQCAtMCwwICsxLDM4IEBACisvLz09PS0gUERCU3ltYm9sVHlwZUZyaWVuZC5oIC0gZnJpZW5kIHR5cGUgaW5mbyAtLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFRlJJRU5EX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVGUklFTkRfSAorCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xUeXBlRnJpZW5kIDogcHVibGljIFBEQlN5bWJvbCB7CitwdWJsaWM6CisgIFBEQlN5bWJvbFR5cGVGcmllbmQoY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IFN5bWJvbCk7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OkZyaWVuZCkKKworICB2b2lkIGR1bXAoUERCU3ltRHVtcGVyICZEdW1wZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRDbGFzc1BhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldE5hbWUpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRUeXBlKQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVGUklFTkRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVGdW5jdGlvbkFyZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVGdW5jdGlvbkFyZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4NTU5OTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZUZ1bmN0aW9uQXJnLmgKQEAgLTAsMCArMSwzOCBAQAorLy89PT0tIFBEQlN5bWJvbFR5cGVGdW5jdGlvbkFyZy5oIC0gZnVuY3Rpb24gYXJnIHR5cGUgaW5mbyAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRUZVTkNUSU9OQVJHX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVGVU5DVElPTkFSR19ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbFR5cGVGdW5jdGlvbkFyZyA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xUeXBlRnVuY3Rpb25BcmcoY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gU3ltYm9sKTsKKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6RnVuY3Rpb25BcmcpCisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0Q2xhc3NQYXJlbnQpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRMZXhpY2FsUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0VHlwZSkKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFRlVOQ1RJT05BUkdfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVGdW5jdGlvblNpZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVGdW5jdGlvblNpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiZDRjZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZUZ1bmN0aW9uU2lnLmgKQEAgLTAsMCArMSw1MiBAQAorLy89PT0tIFBEQlN5bWJvbFR5cGVGdW5jdGlvblNpZy5oIC0gZnVuY3Rpb24gc2lnbmF0dXJlIHR5cGUgaW5mbyAqLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRUZVTkNUSU9OU0lHX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVGVU5DVElPTlNJR19ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbFR5cGVGdW5jdGlvblNpZyA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xUeXBlRnVuY3Rpb25TaWcoY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gU3ltYm9sKTsKKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6RnVuY3Rpb25TaWcpCisKKyAgc3RkOjp1bmlxdWVfcHRyPElQREJFbnVtU3ltYm9scz4gZ2V0QXJndW1lbnRzKCkgY29uc3Q7CisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBkdW1wUmlnaHQoUERCU3ltRHVtcGVyICZEdW1wZXIpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIGR1bXBBcmdMaXN0KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgYm9vbCBpc0NWYXJBcmdzKCkgY29uc3Q7CisKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldENhbGxpbmdDb252ZW50aW9uKQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0Q2xhc3NQYXJlbnQpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRVbm1vZGlmaWVkVHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzQ29uc3RUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0Q291bnQpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRMZXhpY2FsUGFyZW50KQorICAvLyBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0T2JqZWN0UG9pbnRlclR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRUaGlzQWRqdXN0KQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0RfV0lUSF9OQU1FKGdldFR5cGUsIGdldFJldHVyblR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1VuYWxpZ25lZFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1ZvbGF0aWxlVHlwZSkKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFRlVOQ1RJT05TSUdfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVNYW5hZ2VkLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZU1hbmFnZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMWNmNTM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVNYW5hZ2VkLmgKQEAgLTAsMCArMSwzNiBAQAorLy89PT0tIFBEQlN5bWJvbFR5cGVNYW5hZ2VkLmggLSBtYW5hZ2VkIHR5cGUgaW5mbyAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRU1BTkFHRURfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRU1BTkFHRURfSAorCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xUeXBlTWFuYWdlZCA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xUeXBlTWFuYWdlZChjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IFN5bWJvbCk7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6Ok1hbmFnZWRUeXBlKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldE5hbWUpCit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRU1BTkFHRURfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVQb2ludGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZVBvaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NjEyZWJhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVQb2ludGVyLmgKQEAgLTAsMCArMSw0NyBAQAorLy89PT0tIFBEQlN5bWJvbFR5cGVQb2ludGVyLmggLSBwb2ludGVyIHR5cGUgaW5mbyAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRVBPSU5URVJfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRVBPSU5URVJfSAorCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xUeXBlUG9pbnRlciA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xUeXBlUG9pbnRlcihjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IFN5bWJvbCk7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OlBvaW50ZXJUeXBlKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgZHVtcFJpZ2h0KFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNDb25zdFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRMZW5ndGgpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRMZXhpY2FsUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNSZWZlcmVuY2UpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1JWYWx1ZVJlZmVyZW5jZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzUG9pbnRlclRvRGF0YU1lbWJlcikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzUG9pbnRlclRvTWVtYmVyRnVuY3Rpb24pCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRF9XSVRIX05BTUUoZ2V0VHlwZSwgZ2V0UG9pbnRlZVR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1Jlc3RyaWN0ZWRUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNVbmFsaWduZWRUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNWb2xhdGlsZVR5cGUpCit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRVBPSU5URVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVUeXBlZGVmLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZVR5cGVkZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNmMxZDFiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVUeXBlZGVmLmgKQEAgLTAsMCArMSw1NSBAQAorLy89PT0tIFBEQlN5bWJvbFR5cGVUeXBlZGVmLmggLSB0eXBlZGVmIHR5cGUgaW5mbyAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRVRZUEVERUZfSAorI2RlZmluZSBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRVRZUEVERUZfSAorCisjaW5jbHVkZSAiUERCU3ltYm9sLmgiCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBQREJTeW1ib2xUeXBlVHlwZWRlZiA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xUeXBlVHlwZWRlZihjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPElQREJSYXdTeW1ib2w+IFN5bWJvbCk7CisKKyAgREVDTEFSRV9QREJfU1lNQk9MX0NPTkNSRVRFX1RZUEUoUERCX1N5bVR5cGU6OlR5cGVkZWYpCisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0QnVpbHRpblR5cGUpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRDbGFzc1BhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGhhc0NvbnN0cnVjdG9yKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNDb25zdFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNBc3NpZ25tZW50T3BlcmF0b3IpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNDYXN0T3BlcmF0b3IpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNOZXN0ZWRUeXBlcykKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldExlbmd0aCkKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldExleGljYWxQYXJlbnQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXROYW1lKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNOZXN0ZWQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNPdmVybG9hZGVkT3BlcmF0b3IpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1BhY2tlZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzUmVmZXJlbmNlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNTY29wZWQpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VWR0S2luZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVW5hbGlnbmVkVHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldFZpcnR1YWxUYWJsZVNoYXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNWb2xhdGlsZVR5cGUpCit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRVRZUEVERUZfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVVRFQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlVURULmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI1OWI2ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlVURULmgKQEAgLTAsMCArMSw2MyBAQAorLy89PT0tIFBEQlN5bWJvbFR5cGVVRFQuaCAtIFVEVCB0eXBlIGluZm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRVVEVF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFVURUX0gKKworI2luY2x1ZGUgIklQREJMaW5lTnVtYmVyLmgiCisjaW5jbHVkZSAiSVBEQlNlc3Npb24uaCIKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJTeW1ib2xUeXBlQmFzZUNsYXNzLmgiCisjaW5jbHVkZSAiUERCVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbFR5cGVVRFQgOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sVHlwZVVEVChjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gVURUU3ltYm9sKTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sVHlwZVVEVD4gY2xvbmUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFNlc3Npb24oKS5nZXRDb25jcmV0ZVN5bWJvbEJ5SWQ8UERCU3ltYm9sVHlwZVVEVD4oCisgICAgICAgIGdldFN5bUluZGV4SWQoKSk7CisgIH0KKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6VURUKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldENsYXNzUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0VW5tb2RpZmllZFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNDb25zdHJ1Y3RvcikKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzQ29uc3RUeXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzQXNzaWdubWVudE9wZXJhdG9yKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzQ2FzdE9wZXJhdG9yKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaGFzTmVzdGVkVHlwZXMpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRMZW5ndGgpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRMZXhpY2FsUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0TmFtZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldFNyY0xpbmVPblR5cGVEZWZuKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNOZXN0ZWQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChoYXNPdmVybG9hZGVkT3BlcmF0b3IpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1BhY2tlZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzU2NvcGVkKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0VWR0S2luZCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVW5hbGlnbmVkVHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldFZpcnR1YWxUYWJsZVNoYXBlKQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNWb2xhdGlsZVR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRBY2Nlc3MpCit9OworfQorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVVRFRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVWVGFibGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlVlRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTI3MGMyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlVlRhYmxlLmgKQEAgLTAsMCArMSw0MiBAQAorLy89PT0tIFBEQlN5bWJvbFR5cGVWVGFibGUuaCAtIFZUYWJsZSB0eXBlIGluZm8gLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRVZUQUJMRV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFVlRBQkxFX0gKKworI2luY2x1ZGUgIlBEQlN5bWJvbC5oIgorI2luY2x1ZGUgIlBEQlR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgUERCU3ltYm9sVHlwZVZUYWJsZSA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xUeXBlVlRhYmxlKGNvbnN0IElQREJTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxJUERCUmF3U3ltYm9sPiBWdGJsU3ltYm9sKTsKKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6VlRhYmxlKQorCisgIHZvaWQgZHVtcChQREJTeW1EdW1wZXIgJkR1bXBlcikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldENsYXNzUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoZ2V0T2Zmc2V0KQorICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNDb25zdFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX0lEX01FVEhPRChnZXRMZXhpY2FsUGFyZW50KQorICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0VHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVW5hbGlnbmVkVHlwZSkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGlzVm9sYXRpbGVUeXBlKQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorfQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVWVEFCTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVWVGFibGVTaGFwZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVWVGFibGVTaGFwZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhY2FhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZVZUYWJsZVNoYXBlLmgKQEAgLTAsMCArMSw0MCBAQAorLy89PT0tIFBEQlN5bWJvbFR5cGVWVGFibGVTaGFwZS5oIC0gVlRhYmxlIHNoYXBlIGluZm8gLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVFlQRVZUQUJMRVNIQVBFX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlNZTUJPTFRZUEVWVEFCTEVTSEFQRV9ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbFR5cGVWVGFibGVTaGFwZSA6IHB1YmxpYyBQREJTeW1ib2wgeworcHVibGljOgorICBQREJTeW1ib2xUeXBlVlRhYmxlU2hhcGUoY29uc3QgSVBEQlNlc3Npb24gJlBEQlNlc3Npb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gVnRibFNoYXBlU3ltYm9sKTsKKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6VlRhYmxlU2hhcGUpCisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICBGT1JXQVJEX1NZTUJPTF9NRVRIT0QoaXNDb25zdFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChnZXRDb3VudCkKKyAgRk9SV0FSRF9TWU1CT0xfSURfTUVUSE9EKGdldExleGljYWxQYXJlbnQpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1VuYWxpZ25lZFR5cGUpCisgIEZPUldBUkRfU1lNQk9MX01FVEhPRChpc1ZvbGF0aWxlVHlwZSkKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KK30KKworI2VuZGlmIC8vIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xUWVBFVlRBQkxFU0hBUEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFVua25vd24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xVbmtub3duLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0M2U0NwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xVbmtub3duLmgKQEAgLTAsMCArMSwzNiBAQAorLy89PT0tIFBEQlN5bWJvbFVua25vd24uaCAtIHVua25vd24gc3ltYm9sIHR5cGUgLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVU5LTk9XTl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xVTktOT1dOX0gKKworI2luY2x1ZGUgIlBEQlN5bWJvbC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbFVua25vd24gOiBwdWJsaWMgUERCU3ltYm9sIHsKK3B1YmxpYzoKKyAgUERCU3ltYm9sVW5rbm93bihjb25zdCBJUERCU2Vzc2lvbiAmUERCU2Vzc2lvbiwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gVW5rbm93blN5bWJvbCk7CisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFBEQlN5bWJvbCAqUykgeworICAgIHJldHVybiAoUy0+Z2V0U3ltVGFnKCkgPT0gUERCX1N5bVR5cGU6Ok5vbmUgfHwKKyAgICAgICAgICAgIFMtPmdldFN5bVRhZygpID49IFBEQl9TeW1UeXBlOjpNYXgpOworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVU5LTk9XTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVXNpbmdOYW1lc3BhY2UuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xVc2luZ05hbWVzcGFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwZmJkNWIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVXNpbmdOYW1lc3BhY2UuaApAQCAtMCwwICsxLDM3IEBACisvLz09PS0gUERCU3ltYm9sVXNpbmdOYW1lc3BhY2UuaCAtIHVzaW5nIG5hbWVzcGFjZSBpbmZvIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xVU0lOR05BTUVTUEFDRV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9QREJTWU1CT0xVU0lOR05BTUVTUEFDRV9ICisKKyNpbmNsdWRlICJQREJTeW1ib2wuaCIKKyNpbmNsdWRlICJQREJUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworbmFtZXNwYWNlIHBkYiB7CisKK2NsYXNzIFBEQlN5bWJvbFVzaW5nTmFtZXNwYWNlIDogcHVibGljIFBEQlN5bWJvbCB7CitwdWJsaWM6CisgIFBEQlN5bWJvbFVzaW5nTmFtZXNwYWNlKGNvbnN0IElQREJTZXNzaW9uICZQREJTZXNzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SVBEQlJhd1N5bWJvbD4gU3ltYm9sKTsKKworICBERUNMQVJFX1BEQl9TWU1CT0xfQ09OQ1JFVEVfVFlQRShQREJfU3ltVHlwZTo6VXNpbmdOYW1lc3BhY2UpCisKKyAgdm9pZCBkdW1wKFBEQlN5bUR1bXBlciAmRHVtcGVyKSBjb25zdCBvdmVycmlkZTsKKworICBGT1JXQVJEX1NZTUJPTF9JRF9NRVRIT0QoZ2V0TGV4aWNhbFBhcmVudCkKKyAgRk9SV0FSRF9TWU1CT0xfTUVUSE9EKGdldE5hbWUpCit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCit9CisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUERCU1lNQk9MVVNJTkdOQU1FU1BBQ0VfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlR5cGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvUERCVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzYyMzNhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1BEQlR5cGVzLmgKQEAgLTAsMCArMSw0MDggQEAKKy8vPT09LSBQREJUeXBlcy5oIC0gRGVmaW5lcyBlbnVtcyBmb3IgdmFyaW91cyBmaWVsZHMgY29udGFpbmVkIGluIFBEQiAtLS0tPT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1BEQlRZUEVTX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fUERCX1BEQlRZUEVTX0gKKworI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0NvZGVWaWV3LmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL0lQREJFbnVtQ2hpbGRyZW4uaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvTmF0aXZlL1Jhd1R5cGVzLmgiCisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBwZGIgeworCitjbGFzcyBJUERCRGF0YVN0cmVhbTsKK2NsYXNzIElQREJJbmplY3RlZFNvdXJjZTsKK2NsYXNzIElQREJMaW5lTnVtYmVyOworY2xhc3MgSVBEQlNlY3Rpb25Db250cmliOworY2xhc3MgSVBEQlNvdXJjZUZpbGU7CitjbGFzcyBJUERCVGFibGU7CitjbGFzcyBQREJTeW1EdW1wZXI7CitjbGFzcyBQREJTeW1ib2w7CitjbGFzcyBQREJTeW1ib2xFeGU7CitjbGFzcyBQREJTeW1ib2xDb21waWxhbmQ7CitjbGFzcyBQREJTeW1ib2xDb21waWxhbmREZXRhaWxzOworY2xhc3MgUERCU3ltYm9sQ29tcGlsYW5kRW52OworY2xhc3MgUERCU3ltYm9sRnVuYzsKK2NsYXNzIFBEQlN5bWJvbEJsb2NrOworY2xhc3MgUERCU3ltYm9sRGF0YTsKK2NsYXNzIFBEQlN5bWJvbEFubm90YXRpb247CitjbGFzcyBQREJTeW1ib2xMYWJlbDsKK2NsYXNzIFBEQlN5bWJvbFB1YmxpY1N5bWJvbDsKK2NsYXNzIFBEQlN5bWJvbFR5cGVVRFQ7CitjbGFzcyBQREJTeW1ib2xUeXBlRW51bTsKK2NsYXNzIFBEQlN5bWJvbFR5cGVGdW5jdGlvblNpZzsKK2NsYXNzIFBEQlN5bWJvbFR5cGVQb2ludGVyOworY2xhc3MgUERCU3ltYm9sVHlwZUFycmF5OworY2xhc3MgUERCU3ltYm9sVHlwZUJ1aWx0aW47CitjbGFzcyBQREJTeW1ib2xUeXBlVHlwZWRlZjsKK2NsYXNzIFBEQlN5bWJvbFR5cGVCYXNlQ2xhc3M7CitjbGFzcyBQREJTeW1ib2xUeXBlRnJpZW5kOworY2xhc3MgUERCU3ltYm9sVHlwZUZ1bmN0aW9uQXJnOworY2xhc3MgUERCU3ltYm9sRnVuY0RlYnVnU3RhcnQ7CitjbGFzcyBQREJTeW1ib2xGdW5jRGVidWdFbmQ7CitjbGFzcyBQREJTeW1ib2xVc2luZ05hbWVzcGFjZTsKK2NsYXNzIFBEQlN5bWJvbFR5cGVWVGFibGVTaGFwZTsKK2NsYXNzIFBEQlN5bWJvbFR5cGVWVGFibGU7CitjbGFzcyBQREJTeW1ib2xDdXN0b207CitjbGFzcyBQREJTeW1ib2xUaHVuazsKK2NsYXNzIFBEQlN5bWJvbFR5cGVDdXN0b207CitjbGFzcyBQREJTeW1ib2xUeXBlTWFuYWdlZDsKK2NsYXNzIFBEQlN5bWJvbFR5cGVEaW1lbnNpb247CitjbGFzcyBQREJTeW1ib2xVbmtub3duOworCit1c2luZyBJUERCRW51bVN5bWJvbHMgPSBJUERCRW51bUNoaWxkcmVuPFBEQlN5bWJvbD47Cit1c2luZyBJUERCRW51bVNvdXJjZUZpbGVzID0gSVBEQkVudW1DaGlsZHJlbjxJUERCU291cmNlRmlsZT47Cit1c2luZyBJUERCRW51bURhdGFTdHJlYW1zID0gSVBEQkVudW1DaGlsZHJlbjxJUERCRGF0YVN0cmVhbT47Cit1c2luZyBJUERCRW51bUxpbmVOdW1iZXJzID0gSVBEQkVudW1DaGlsZHJlbjxJUERCTGluZU51bWJlcj47Cit1c2luZyBJUERCRW51bVRhYmxlcyA9IElQREJFbnVtQ2hpbGRyZW48SVBEQlRhYmxlPjsKK3VzaW5nIElQREJFbnVtSW5qZWN0ZWRTb3VyY2VzID0gSVBEQkVudW1DaGlsZHJlbjxJUERCSW5qZWN0ZWRTb3VyY2U+OwordXNpbmcgSVBEQkVudW1TZWN0aW9uQ29udHJpYnMgPSBJUERCRW51bUNoaWxkcmVuPElQREJTZWN0aW9uQ29udHJpYj47CisKKy8vLyBTcGVjaWZpZXMgd2hpY2ggUERCIHJlYWRlciBpbXBsZW1lbnRhdGlvbiBpcyB0byBiZSB1c2VkLiAgT25seSBhIHZhbHVlCisvLy8gb2YgUERCX1JlYWRlclR5cGU6OkRJQSBpcyBjdXJyZW50bHkgc3VwcG9ydGVkLCBidXQgTmF0aXZlIGlzIGluIHRoZSB3b3Jrcy4KK2VudW0gY2xhc3MgUERCX1JlYWRlclR5cGUgeworICBESUEgPSAwLAorICBOYXRpdmUgPSAxLAorfTsKKworLy8vIEFuIGVudW1lcmF0aW9uIGluZGljYXRpbmcgdGhlIHR5cGUgb2YgZGF0YSBjb250YWluZWQgaW4gdGhpcyB0YWJsZS4KK2VudW0gY2xhc3MgUERCX1RhYmxlVHlwZSB7CisgIFRhYmxlSW52YWxpZCA9IDAsCisgIFN5bWJvbHMsCisgIFNvdXJjZUZpbGVzLAorICBMaW5lTnVtYmVycywKKyAgU2VjdGlvbkNvbnRyaWJzLAorICBTZWdtZW50cywKKyAgSW5qZWN0ZWRTb3VyY2VzLAorICBGcmFtZURhdGEsCisgIElucHV0QXNzZW1ibHlGaWxlcywKKyAgRGJnCit9OworCisvLy8gRGVmaW5lcyBmbGFncyB1c2VkIGZvciBlbnVtZXJhdGluZyBjaGlsZCBzeW1ib2xzLiAgVGhpcyBjb3JyZXNwb25kcyB0byB0aGUKKy8vLyBOYW1lU2VhcmNoT3B0aW9ucyBlbnVtZXJhdGlvbiB3aGljaCBpcyBkb2N1bWVudGVkIGhlcmU6CisvLy8gaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS95YXQyOGFkcy5hc3B4CitlbnVtIFBEQl9OYW1lU2VhcmNoRmxhZ3MgeworICBOU19EZWZhdWx0ID0gMHgwLAorICBOU19DYXNlU2Vuc2l0aXZlID0gMHgxLAorICBOU19DYXNlSW5zZW5zaXRpdmUgPSAweDIsCisgIE5TX0ZpbGVOYW1lRXh0TWF0Y2ggPSAweDQsCisgIE5TX1JlZ2V4ID0gMHg4LAorICBOU19VbmRlY29yYXRlZE5hbWUgPSAweDEwLAorCisgIC8vIEZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorICBOU19DYXNlSW5GaWxlTmFtZUV4dCA9IE5TX0Nhc2VJbnNlbnNpdGl2ZSB8IE5TX0ZpbGVOYW1lRXh0TWF0Y2gsCisgIE5TX0Nhc2VSZWdleCA9IE5TX1JlZ2V4IHwgTlNfQ2FzZVNlbnNpdGl2ZSwKKyAgTlNfQ2FzZUluUmV4ID0gTlNfUmVnZXggfCBOU19DYXNlSW5zZW5zaXRpdmUKK307CisKKy8vLyBTcGVjaWZpZXMgdGhlIGhhc2ggYWxnb3JpdGhtIHRoYXQgYSBzb3VyY2UgZmlsZSBmcm9tIGEgUERCIHdhcyBoYXNoZWQgd2l0aC4KKy8vLyBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBDVl9Tb3VyY2VDaGtzdW1fdCBlbnVtZXJhdGlvbiBhbmQgYXJlIGRvY3VtZW50ZWQKKy8vLyBoZXJlOiBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2U5NmF6MjF4LmFzcHgKK2VudW0gY2xhc3MgUERCX0NoZWNrc3VtIHsgTm9uZSA9IDAsIE1ENSA9IDEsIFNIQTEgPSAyIH07CisKKy8vLyBUaGVzZSB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgQ1ZfQ1BVX1RZUEVfZSBlbnVtZXJhdGlvbiwgYW5kIGFyZSBkb2N1bWVudGVkCisvLy8gaGVyZTogaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9iMmZjNjRlay5hc3B4Cit1c2luZyBQREJfQ3B1ID0gY29kZXZpZXc6OkNQVVR5cGU7CisKK2VudW0gY2xhc3MgUERCX01hY2hpbmUgeworICBJbnZhbGlkID0gMHhmZmZmLAorICBVbmtub3duID0gMHgwLAorICBBbTMzID0gMHgxMywKKyAgQW1kNjQgPSAweDg2NjQsCisgIEFybSA9IDB4MUMwLAorICBBcm1OVCA9IDB4MUM0LAorICBFYmMgPSAweEVCQywKKyAgeDg2ID0gMHgxNEMsCisgIElhNjQgPSAweDIwMCwKKyAgTTMyUiA9IDB4OTA0MSwKKyAgTWlwczE2ID0gMHgyNjYsCisgIE1pcHNGcHUgPSAweDM2NiwKKyAgTWlwc0ZwdTE2ID0gMHg0NjYsCisgIFBvd2VyUEMgPSAweDFGMCwKKyAgUG93ZXJQQ0ZQID0gMHgxRjEsCisgIFI0MDAwID0gMHgxNjYsCisgIFNIMyA9IDB4MUEyLAorICBTSDNEU1AgPSAweDFBMywKKyAgU0g0ID0gMHgxQTYsCisgIFNINSA9IDB4MUE4LAorICBUaHVtYiA9IDB4MUMyLAorICBXY2VNaXBzVjIgPSAweDE2OQorfTsKKworZW51bSBjbGFzcyBQREJfU291cmNlQ29tcHJlc3Npb24geworICBOb25lLAorICBSdW5MZW5ndGhFbmNvZGVkLAorICBIdWZmbWFuLAorICBMWiwKK307CisKKy8vLyBUaGVzZSB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgQ1ZfY2FsbF9lIGVudW1lcmF0aW9uLCBhbmQgYXJlIGRvY3VtZW50ZWQKKy8vLyBhdCB0aGUgZm9sbG93aW5nIGxvY2F0aW9uczoKKy8vLyAgIGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvYjJmYzY0ZWsuYXNweAorLy8vICAgaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvbXM2ODAyMDcodj12cy44NSkuYXNweAordXNpbmcgUERCX0NhbGxpbmdDb252ID0gY29kZXZpZXc6OkNhbGxpbmdDb252ZW50aW9uOworCisvLy8gVGhlc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIENWX0NGTF9MQU5HIGVudW1lcmF0aW9uLCBhbmQgYXJlIGRvY3VtZW50ZWQKKy8vLyBoZXJlOiBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2J3M2Fla3c2LmFzcHgKK3VzaW5nIFBEQl9MYW5nID0gY29kZXZpZXc6OlNvdXJjZUxhbmd1YWdlOworCisvLy8gVGhlc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIERhdGFLaW5kIGVudW1lcmF0aW9uLCBhbmQgYXJlIGRvY3VtZW50ZWQKKy8vLyBoZXJlOiBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2IyeDJ0MzEzLmFzcHgKK2VudW0gY2xhc3MgUERCX0RhdGFLaW5kIHsKKyAgVW5rbm93biwKKyAgTG9jYWwsCisgIFN0YXRpY0xvY2FsLAorICBQYXJhbSwKKyAgT2JqZWN0UHRyLAorICBGaWxlU3RhdGljLAorICBHbG9iYWwsCisgIE1lbWJlciwKKyAgU3RhdGljTWVtYmVyLAorICBDb25zdGFudAorfTsKKworLy8vIFRoZXNlIHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBTeW1UYWdFbnVtIGVudW1lcmF0aW9uLCBhbmQgYXJlIGRvY3VtZW50ZWQKKy8vLyBoZXJlOiBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2JrZWRzczVmLmFzcHgKK2VudW0gY2xhc3MgUERCX1N5bVR5cGUgeworICBOb25lLAorICBFeGUsCisgIENvbXBpbGFuZCwKKyAgQ29tcGlsYW5kRGV0YWlscywKKyAgQ29tcGlsYW5kRW52LAorICBGdW5jdGlvbiwKKyAgQmxvY2ssCisgIERhdGEsCisgIEFubm90YXRpb24sCisgIExhYmVsLAorICBQdWJsaWNTeW1ib2wsCisgIFVEVCwKKyAgRW51bSwKKyAgRnVuY3Rpb25TaWcsCisgIFBvaW50ZXJUeXBlLAorICBBcnJheVR5cGUsCisgIEJ1aWx0aW5UeXBlLAorICBUeXBlZGVmLAorICBCYXNlQ2xhc3MsCisgIEZyaWVuZCwKKyAgRnVuY3Rpb25BcmcsCisgIEZ1bmNEZWJ1Z1N0YXJ0LAorICBGdW5jRGVidWdFbmQsCisgIFVzaW5nTmFtZXNwYWNlLAorICBWVGFibGVTaGFwZSwKKyAgVlRhYmxlLAorICBDdXN0b20sCisgIFRodW5rLAorICBDdXN0b21UeXBlLAorICBNYW5hZ2VkVHlwZSwKKyAgRGltZW5zaW9uLAorICBNYXgKK307CisKKy8vLyBUaGVzZSB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgTG9jYXRpb25UeXBlIGVudW1lcmF0aW9uLCBhbmQgYXJlIGRvY3VtZW50ZWQKKy8vLyBoZXJlOiBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2Y1N2thZXozLmFzcHgKK2VudW0gY2xhc3MgUERCX0xvY1R5cGUgeworICBOdWxsLAorICBTdGF0aWMsCisgIFRMUywKKyAgUmVnUmVsLAorICBUaGlzUmVsLAorICBFbnJlZ2lzdGVyZWQsCisgIEJpdEZpZWxkLAorICBTbG90LAorICBJbFJlbCwKKyAgTWV0YURhdGEsCisgIENvbnN0YW50LAorICBNYXgKK307CisKKy8vLyBUaGVzZSB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgVWR0S2luZCBlbnVtZXJhdGlvbiwgYW5kIGFyZSBkb2N1bWVudGVkCisvLy8gaGVyZTogaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93Y3N0azY2dC5hc3B4CitlbnVtIGNsYXNzIFBEQl9VZHRUeXBlIHsgU3RydWN0LCBDbGFzcywgVW5pb24sIEludGVyZmFjZSB9OworCisvLy8gVGhlc2UgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIFN0YWNrRnJhbWVUeXBlRW51bSBlbnVtZXJhdGlvbiwgYW5kIGFyZQorLy8vIGRvY3VtZW50ZWQgaGVyZTogaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9iYzUyMDd4dy5hc3B4LgorZW51bSBjbGFzcyBQREJfU3RhY2tGcmFtZVR5cGUgeyBGUE8sIEtlcm5lbFRyYXAsIEtlcm5lbFRTUywgRUJQLCBGcmFtZURhdGEgfTsKKworLy8vIFRoZXNlIHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBTdGFja0ZyYW1lVHlwZUVudW0gZW51bWVyYXRpb24sIGFuZCBhcmUKKy8vLyBkb2N1bWVudGVkIGhlcmU6IGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvYmM1MjA3eHcuYXNweC4KK2VudW0gY2xhc3MgUERCX01lbW9yeVR5cGUgeyBDb2RlLCBEYXRhLCBTdGFjaywgSGVhcENvZGUgfTsKKworLy8vIFRoZXNlIHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBCYXNpY3R5cGUgZW51bWVyYXRpb24sIGFuZCBhcmUgZG9jdW1lbnRlZAorLy8vIGhlcmU6IGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvNHN6ZHR6YzMuYXNweAorZW51bSBjbGFzcyBQREJfQnVpbHRpblR5cGUgeworICBOb25lID0gMCwKKyAgVm9pZCA9IDEsCisgIENoYXIgPSAyLAorICBXQ2hhclQgPSAzLAorICBJbnQgPSA2LAorICBVSW50ID0gNywKKyAgRmxvYXQgPSA4LAorICBCQ0QgPSA5LAorICBCb29sID0gMTAsCisgIExvbmcgPSAxMywKKyAgVUxvbmcgPSAxNCwKKyAgQ3VycmVuY3kgPSAyNSwKKyAgRGF0ZSA9IDI2LAorICBWYXJpYW50ID0gMjcsCisgIENvbXBsZXggPSAyOCwKKyAgQml0ZmllbGQgPSAyOSwKKyAgQlNUUiA9IDMwLAorICBIUmVzdWx0ID0gMzEsCisgIENoYXIxNiA9IDMyLAorICBDaGFyMzIgPSAzMworfTsKKworLy8vIFRoZXNlIHZhbHVlcyBjb3JyZXNwb25kIHRvIHRoZSBmbGFncyB0aGF0IGNhbiBiZSBjb21iaW5lZCB0byBjb250cm9sIHRoZQorLy8vIHJldHVybiBvZiBhbiB1bmRlY29yYXRlZCBuYW1lIGZvciBhIEMrKyBkZWNvcmF0ZWQgbmFtZSwgYW5kIGFyZSBkb2N1bWVudGVkCisvLy8gaGVyZTogaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9rc3pmazBmcy5hc3B4CitlbnVtIFBEQl9VbmRuYW1lRmxhZ3M6IHVpbnQzMl90IHsKKyAgVW5kbmFtZV9Db21wbGV0ZSA9IDB4MCwKKyAgVW5kbmFtZV9Ob0xlYWRpbmdVbmRlcnNjb3JlcyA9IDB4MSwKKyAgVW5kbmFtZV9Ob01zS2V5d29yZHMgPSAweDIsCisgIFVuZG5hbWVfTm9GdW5jUmV0dXJucyA9IDB4NCwKKyAgVW5kbmFtZV9Ob0FsbG9jTW9kZWwgPSAweDgsCisgIFVuZG5hbWVfTm9BbGxvY0xhbmcgPSAweDEwLAorICBVbmRuYW1lX1Jlc2VydmVkMSA9IDB4MjAsCisgIFVuZG5hbWVfUmVzZXJ2ZWQyID0gMHg0MCwKKyAgVW5kbmFtZV9Ob1RoaXNUeXBlID0gMHg2MCwKKyAgVW5kbmFtZV9Ob0FjY2Vzc1NwZWMgPSAweDgwLAorICBVbmRuYW1lX05vVGhyb3dTaWcgPSAweDEwMCwKKyAgVW5kbmFtZV9Ob01lbWJlclR5cGUgPSAweDIwMCwKKyAgVW5kbmFtZV9Ob1JldHVyblVEVE1vZGVsID0gMHg0MDAsCisgIFVuZG5hbWVfMzJCaXREZWNvZGUgPSAweDgwMCwKKyAgVW5kbmFtZV9OYW1lT25seSA9IDB4MTAwMCwKKyAgVW5kbmFtZV9UeXBlT25seSA9IDB4MjAwMCwKKyAgVW5kbmFtZV9IYXZlUGFyYW1zID0gMHg0MDAwLAorICBVbmRuYW1lX05vRUNTVSA9IDB4ODAwMCwKKyAgVW5kbmFtZV9Ob0lkZW50Q2hhckNoZWNrID0gMHgxMDAwMCwKKyAgVW5kbmFtZV9Ob1BUUjY0ID0gMHgyMDAwMAorfTsKKworZW51bSBjbGFzcyBQREJfTWVtYmVyQWNjZXNzIHsgUHJpdmF0ZSA9IDEsIFByb3RlY3RlZCA9IDIsIFB1YmxpYyA9IDMgfTsKKworc3RydWN0IFZlcnNpb25JbmZvIHsKKyAgdWludDMyX3QgTWFqb3I7CisgIHVpbnQzMl90IE1pbm9yOworICB1aW50MzJfdCBCdWlsZDsKKyAgdWludDMyX3QgUUZFOworfTsKKworZW51bSBQREJfVmFyaWFudFR5cGUgeworICBFbXB0eSwKKyAgVW5rbm93biwKKyAgSW50OCwKKyAgSW50MTYsCisgIEludDMyLAorICBJbnQ2NCwKKyAgU2luZ2xlLAorICBEb3VibGUsCisgIFVJbnQ4LAorICBVSW50MTYsCisgIFVJbnQzMiwKKyAgVUludDY0LAorICBCb29sLAorICBTdHJpbmcKK307CisKK3N0cnVjdCBWYXJpYW50IHsKKyAgVmFyaWFudCgpID0gZGVmYXVsdDsKKworICBWYXJpYW50KGNvbnN0IFZhcmlhbnQgJk90aGVyKSB7CisgICAgKnRoaXMgPSBPdGhlcjsKKyAgfQorCisgIH5WYXJpYW50KCkgeworICAgIGlmIChUeXBlID09IFBEQl9WYXJpYW50VHlwZTo6U3RyaW5nKQorICAgICAgZGVsZXRlW10gVmFsdWUuU3RyaW5nOworICB9CisKKyAgUERCX1ZhcmlhbnRUeXBlIFR5cGUgPSBQREJfVmFyaWFudFR5cGU6OkVtcHR5OworICB1bmlvbiB7CisgICAgYm9vbCBCb29sOworICAgIGludDhfdCBJbnQ4OworICAgIGludDE2X3QgSW50MTY7CisgICAgaW50MzJfdCBJbnQzMjsKKyAgICBpbnQ2NF90IEludDY0OworICAgIGZsb2F0IFNpbmdsZTsKKyAgICBkb3VibGUgRG91YmxlOworICAgIHVpbnQ4X3QgVUludDg7CisgICAgdWludDE2X3QgVUludDE2OworICAgIHVpbnQzMl90IFVJbnQzMjsKKyAgICB1aW50NjRfdCBVSW50NjQ7CisgICAgY2hhciAqU3RyaW5nOworICB9IFZhbHVlOworCisjZGVmaW5lIFZBUklBTlRfRVFVQUxfQ0FTRShFbnVtKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIFBEQl9WYXJpYW50VHlwZTo6RW51bTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gVmFsdWUuRW51bSA9PSBPdGhlci5WYWx1ZS5FbnVtOworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBWYXJpYW50ICZPdGhlcikgY29uc3QgeworICAgIGlmIChUeXBlICE9IE90aGVyLlR5cGUpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgc3dpdGNoIChUeXBlKSB7CisgICAgICBWQVJJQU5UX0VRVUFMX0NBU0UoQm9vbCkKKyAgICAgIFZBUklBTlRfRVFVQUxfQ0FTRShJbnQ4KQorICAgICAgVkFSSUFOVF9FUVVBTF9DQVNFKEludDE2KQorICAgICAgVkFSSUFOVF9FUVVBTF9DQVNFKEludDMyKQorICAgICAgVkFSSUFOVF9FUVVBTF9DQVNFKEludDY0KQorICAgICAgVkFSSUFOVF9FUVVBTF9DQVNFKFNpbmdsZSkKKyAgICAgIFZBUklBTlRfRVFVQUxfQ0FTRShEb3VibGUpCisgICAgICBWQVJJQU5UX0VRVUFMX0NBU0UoVUludDgpCisgICAgICBWQVJJQU5UX0VRVUFMX0NBU0UoVUludDE2KQorICAgICAgVkFSSUFOVF9FUVVBTF9DQVNFKFVJbnQzMikKKyAgICAgIFZBUklBTlRfRVFVQUxfQ0FTRShVSW50NjQpCisgICAgICBWQVJJQU5UX0VRVUFMX0NBU0UoU3RyaW5nKQorICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworI3VuZGVmIFZBUklBTlRfRVFVQUxfQ0FTRQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBWYXJpYW50ICZPdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBPdGhlcik7IH0KKyAgVmFyaWFudCAmb3BlcmF0b3I9KGNvbnN0IFZhcmlhbnQgJk90aGVyKSB7CisgICAgaWYgKHRoaXMgPT0gJk90aGVyKQorICAgICAgcmV0dXJuICp0aGlzOworICAgIGlmIChUeXBlID09IFBEQl9WYXJpYW50VHlwZTo6U3RyaW5nKQorICAgICAgZGVsZXRlW10gVmFsdWUuU3RyaW5nOworICAgIFR5cGUgPSBPdGhlci5UeXBlOworICAgIFZhbHVlID0gT3RoZXIuVmFsdWU7CisgICAgaWYgKE90aGVyLlR5cGUgPT0gUERCX1ZhcmlhbnRUeXBlOjpTdHJpbmcgJiYKKyAgICAgICAgT3RoZXIuVmFsdWUuU3RyaW5nICE9IG51bGxwdHIpIHsKKyAgICAgIFZhbHVlLlN0cmluZyA9IG5ldyBjaGFyW3N0cmxlbihPdGhlci5WYWx1ZS5TdHJpbmcpICsgMV07CisgICAgICA6OnN0cmNweShWYWx1ZS5TdHJpbmcsIE90aGVyLlZhbHVlLlN0cmluZyk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHBkYgorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworbmFtZXNwYWNlIHN0ZCB7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBoYXNoPGxsdm06OnBkYjo6UERCX1N5bVR5cGU+IHsKKyAgdXNpbmcgYXJndW1lbnRfdHlwZSA9IGxsdm06OnBkYjo6UERCX1N5bVR5cGU7CisgIHVzaW5nIHJlc3VsdF90eXBlID0gc3RkOjpzaXplX3Q7CisKKyAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKShjb25zdCBhcmd1bWVudF90eXBlICZBcmcpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjpoYXNoPGludD4oKShzdGF0aWNfY2FzdDxpbnQ+KEFyZykpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugc3RkCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfUERCVFlQRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1VEVExheW91dC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vUERCL1VEVExheW91dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0MjM0YzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9QREIvVURUTGF5b3V0LmgKQEAgLTAsMCArMSwxODIgQEAKKy8vPT09LSBVRFRMYXlvdXQuaCAtIFVEVCBsYXlvdXQgaW5mbyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fUERCX1VEVExBWU9VVF9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1BEQl9VRFRMQVlPVVRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbERhdGEuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvUERCU3ltYm9sVHlwZUJhc2VDbGFzcy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlQnVpbHRpbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL1BEQi9QREJTeW1ib2xUeXBlVURULmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vUERCL1BEQlN5bWJvbFR5cGVWVGFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9QREIvUERCVHlwZXMuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgcGRiIHsKKworY2xhc3MgQmFzZUNsYXNzTGF5b3V0OworY2xhc3MgQ2xhc3NMYXlvdXQ7CitjbGFzcyBVRFRMYXlvdXRCYXNlOworCitjbGFzcyBMYXlvdXRJdGVtQmFzZSB7CitwdWJsaWM6CisgIExheW91dEl0ZW1CYXNlKGNvbnN0IFVEVExheW91dEJhc2UgKlBhcmVudCwgY29uc3QgUERCU3ltYm9sICpTeW1ib2wsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLCB1aW50MzJfdCBPZmZzZXRJblBhcmVudCwKKyAgICAgICAgICAgICAgICAgdWludDMyX3QgU2l6ZSwgYm9vbCBJc0VsaWRlZCk7CisgIHZpcnR1YWwgfkxheW91dEl0ZW1CYXNlKCkgPSBkZWZhdWx0OworCisgIHVpbnQzMl90IGRlZXBQYWRkaW5nU2l6ZSgpIGNvbnN0OworICB2aXJ0dWFsIHVpbnQzMl90IGltbWVkaWF0ZVBhZGRpbmcoKSBjb25zdCB7IHJldHVybiAwOyB9CisgIHZpcnR1YWwgdWludDMyX3QgdGFpbFBhZGRpbmcoKSBjb25zdDsKKworICBjb25zdCBVRFRMYXlvdXRCYXNlICpnZXRQYXJlbnQoKSBjb25zdCB7IHJldHVybiBQYXJlbnQ7IH0KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisgIHVpbnQzMl90IGdldE9mZnNldEluUGFyZW50KCkgY29uc3QgeyByZXR1cm4gT2Zmc2V0SW5QYXJlbnQ7IH0KKyAgdWludDMyX3QgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemVPZjsgfQorICB1aW50MzJfdCBnZXRMYXlvdXRTaXplKCkgY29uc3QgeyByZXR1cm4gTGF5b3V0U2l6ZTsgfQorICBjb25zdCBQREJTeW1ib2wgKmdldFN5bWJvbCgpIGNvbnN0IHsgcmV0dXJuIFN5bWJvbDsgfQorICBjb25zdCBCaXRWZWN0b3IgJnVzZWRCeXRlcygpIGNvbnN0IHsgcmV0dXJuIFVzZWRCeXRlczsgfQorICBib29sIGlzRWxpZGVkKCkgY29uc3QgeyByZXR1cm4gSXNFbGlkZWQ7IH0KKyAgdmlydHVhbCBib29sIGlzVkJQdHIoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIHVpbnQzMl90IGNvbnRhaW5zT2Zmc2V0KHVpbnQzMl90IE9mZikgY29uc3QgeworICAgIHVpbnQzMl90IEJlZ2luID0gZ2V0T2Zmc2V0SW5QYXJlbnQoKTsKKyAgICB1aW50MzJfdCBFbmQgPSBCZWdpbiArIGdldFNpemUoKTsKKyAgICByZXR1cm4gKE9mZiA+PSBCZWdpbiAmJiBPZmYgPCBFbmQpOworICB9CisKK3Byb3RlY3RlZDoKKyAgY29uc3QgUERCU3ltYm9sICpTeW1ib2wgPSBudWxscHRyOworICBjb25zdCBVRFRMYXlvdXRCYXNlICpQYXJlbnQgPSBudWxscHRyOworICBCaXRWZWN0b3IgVXNlZEJ5dGVzOworICBzdGQ6OnN0cmluZyBOYW1lOworICB1aW50MzJfdCBPZmZzZXRJblBhcmVudCA9IDA7CisgIHVpbnQzMl90IFNpemVPZiA9IDA7CisgIHVpbnQzMl90IExheW91dFNpemUgPSAwOworICBib29sIElzRWxpZGVkID0gZmFsc2U7Cit9OworCitjbGFzcyBWQlB0ckxheW91dEl0ZW0gOiBwdWJsaWMgTGF5b3V0SXRlbUJhc2UgeworcHVibGljOgorICBWQlB0ckxheW91dEl0ZW0oY29uc3QgVURUTGF5b3V0QmFzZSAmUGFyZW50LAorICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbFR5cGVCdWlsdGluPiBTeW0sIHVpbnQzMl90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFNpemUpOworCisgIGJvb2wgaXNWQlB0cigpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKworcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbFR5cGVCdWlsdGluPiBUeXBlOworfTsKKworY2xhc3MgRGF0YU1lbWJlckxheW91dEl0ZW0gOiBwdWJsaWMgTGF5b3V0SXRlbUJhc2UgeworcHVibGljOgorICBEYXRhTWVtYmVyTGF5b3V0SXRlbShjb25zdCBVRFRMYXlvdXRCYXNlICZQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2xEYXRhPiBEYXRhTWVtYmVyKTsKKworICBjb25zdCBQREJTeW1ib2xEYXRhICZnZXREYXRhTWVtYmVyKCk7CisgIGJvb2wgaGFzVURUTGF5b3V0KCkgY29uc3Q7CisgIGNvbnN0IENsYXNzTGF5b3V0ICZnZXRVRFRMYXlvdXQoKSBjb25zdDsKKworcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbERhdGE+IERhdGFNZW1iZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxDbGFzc0xheW91dD4gVWR0TGF5b3V0OworfTsKKworY2xhc3MgVlRhYmxlTGF5b3V0SXRlbSA6IHB1YmxpYyBMYXlvdXRJdGVtQmFzZSB7CitwdWJsaWM6CisgIFZUYWJsZUxheW91dEl0ZW0oY29uc3QgVURUTGF5b3V0QmFzZSAmUGFyZW50LAorICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2xUeXBlVlRhYmxlPiBWVGFibGUpOworCisgIHVpbnQzMl90IGdldEVsZW1lbnRTaXplKCkgY29uc3QgeyByZXR1cm4gRWxlbWVudFNpemU7IH0KKworcHJpdmF0ZToKKyAgdWludDMyX3QgRWxlbWVudFNpemUgPSAwOworICBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sVHlwZVZUYWJsZT4gVlRhYmxlOworfTsKKworY2xhc3MgVURUTGF5b3V0QmFzZSA6IHB1YmxpYyBMYXlvdXRJdGVtQmFzZSB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB1c2luZyBVbmlxdWVQdHJWZWN0b3IgPSBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8VD4+OworCitwdWJsaWM6CisgIFVEVExheW91dEJhc2UoY29uc3QgVURUTGF5b3V0QmFzZSAqUGFyZW50LCBjb25zdCBQREJTeW1ib2wgJlN5bSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwgdWludDMyX3QgT2Zmc2V0SW5QYXJlbnQsIHVpbnQzMl90IFNpemUsCisgICAgICAgICAgICAgICAgYm9vbCBJc0VsaWRlZCk7CisKKyAgdWludDMyX3QgdGFpbFBhZGRpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgQXJyYXlSZWY8TGF5b3V0SXRlbUJhc2UgKj4gbGF5b3V0X2l0ZW1zKCkgY29uc3QgeyByZXR1cm4gTGF5b3V0SXRlbXM7IH0KKyAgQXJyYXlSZWY8QmFzZUNsYXNzTGF5b3V0ICo+IGJhc2VzKCkgY29uc3QgeyByZXR1cm4gQWxsQmFzZXM7IH0KKyAgQXJyYXlSZWY8QmFzZUNsYXNzTGF5b3V0ICo+IHJlZ3VsYXJfYmFzZXMoKSBjb25zdCB7IHJldHVybiBOb25WaXJ0dWFsQmFzZXM7IH0KKyAgQXJyYXlSZWY8QmFzZUNsYXNzTGF5b3V0ICo+IHZpcnR1YWxfYmFzZXMoKSBjb25zdCB7IHJldHVybiBWaXJ0dWFsQmFzZXM7IH0KKyAgdWludDMyX3QgZGlyZWN0VmlydHVhbEJhc2VDb3VudCgpIGNvbnN0IHsgcmV0dXJuIERpcmVjdFZCYXNlQ291bnQ7IH0KKyAgQXJyYXlSZWY8c3RkOjp1bmlxdWVfcHRyPFBEQlN5bWJvbEZ1bmM+PiBmdW5jcygpIGNvbnN0IHsgcmV0dXJuIEZ1bmNzOyB9CisgIEFycmF5UmVmPHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2w+PiBvdGhlcl9pdGVtcygpIGNvbnN0IHsgcmV0dXJuIE90aGVyOyB9CisKK3Byb3RlY3RlZDoKKyAgYm9vbCBoYXNWQlB0ckF0T2Zmc2V0KHVpbnQzMl90IE9mZikgY29uc3Q7CisgIHZvaWQgaW5pdGlhbGl6ZUNoaWxkcmVuKGNvbnN0IFBEQlN5bWJvbCAmU3ltKTsKKworICB2b2lkIGFkZENoaWxkVG9MYXlvdXQoc3RkOjp1bmlxdWVfcHRyPExheW91dEl0ZW1CYXNlPiBDaGlsZCk7CisKKyAgdWludDMyX3QgRGlyZWN0VkJhc2VDb3VudCA9IDA7CisKKyAgVW5pcXVlUHRyVmVjdG9yPFBEQlN5bWJvbD4gT3RoZXI7CisgIFVuaXF1ZVB0clZlY3RvcjxQREJTeW1ib2xGdW5jPiBGdW5jczsKKyAgVW5pcXVlUHRyVmVjdG9yPExheW91dEl0ZW1CYXNlPiBDaGlsZFN0b3JhZ2U7CisgIHN0ZDo6dmVjdG9yPExheW91dEl0ZW1CYXNlICo+IExheW91dEl0ZW1zOworCisgIHN0ZDo6dmVjdG9yPEJhc2VDbGFzc0xheW91dCAqPiBBbGxCYXNlczsKKyAgQXJyYXlSZWY8QmFzZUNsYXNzTGF5b3V0ICo+IE5vblZpcnR1YWxCYXNlczsKKyAgQXJyYXlSZWY8QmFzZUNsYXNzTGF5b3V0ICo+IFZpcnR1YWxCYXNlczsKKworICBWVGFibGVMYXlvdXRJdGVtICpWVGFibGUgPSBudWxscHRyOworICBWQlB0ckxheW91dEl0ZW0gKlZCUHRyID0gbnVsbHB0cjsKK307CisKK2NsYXNzIEJhc2VDbGFzc0xheW91dCA6IHB1YmxpYyBVRFRMYXlvdXRCYXNlIHsKK3B1YmxpYzoKKyAgQmFzZUNsYXNzTGF5b3V0KGNvbnN0IFVEVExheW91dEJhc2UgJlBhcmVudCwgdWludDMyX3QgT2Zmc2V0SW5QYXJlbnQsCisgICAgICAgICAgICAgICAgICBib29sIEVsaWRlLCBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sVHlwZUJhc2VDbGFzcz4gQmFzZSk7CisKKyAgY29uc3QgUERCU3ltYm9sVHlwZUJhc2VDbGFzcyAmZ2V0QmFzZSgpIGNvbnN0IHsgcmV0dXJuICpCYXNlOyB9CisgIGJvb2wgaXNWaXJ0dWFsQmFzZSgpIGNvbnN0IHsgcmV0dXJuIElzVmlydHVhbEJhc2U7IH0KKyAgYm9vbCBpc0VtcHR5QmFzZSgpIHsgcmV0dXJuIFNpemVPZiA9PSAxICYmIExheW91dFNpemUgPT0gMDsgfQorCitwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9wdHI8UERCU3ltYm9sVHlwZUJhc2VDbGFzcz4gQmFzZTsKKyAgYm9vbCBJc1ZpcnR1YWxCYXNlOworfTsKKworY2xhc3MgQ2xhc3NMYXlvdXQgOiBwdWJsaWMgVURUTGF5b3V0QmFzZSB7CitwdWJsaWM6CisgIGV4cGxpY2l0IENsYXNzTGF5b3V0KGNvbnN0IFBEQlN5bWJvbFR5cGVVRFQgJlVEVCk7CisgIGV4cGxpY2l0IENsYXNzTGF5b3V0KHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2xUeXBlVURUPiBVRFQpOworCisgIENsYXNzTGF5b3V0KENsYXNzTGF5b3V0ICYmT3RoZXIpID0gZGVmYXVsdDsKKworICBjb25zdCBQREJTeW1ib2xUeXBlVURUICZnZXRDbGFzcygpIGNvbnN0IHsgcmV0dXJuIFVEVDsgfQorICB1aW50MzJfdCBpbW1lZGlhdGVQYWRkaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIEJpdFZlY3RvciBJbW1lZGlhdGVVc2VkQnl0ZXM7CisgIHN0ZDo6dW5pcXVlX3B0cjxQREJTeW1ib2xUeXBlVURUPiBPd25lZFN0b3JhZ2U7CisgIGNvbnN0IFBEQlN5bWJvbFR5cGVVRFQgJlVEVDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBwZGIKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0RFQlVHSU5GT19QREJfVURUTEFZT1VUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1N5bWJvbGl6ZS9ESVByaW50ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1N5bWJvbGl6ZS9ESVByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjgyYmUzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vU3ltYm9saXplL0RJUHJpbnRlci5oCkBAIC0wLDAgKzEsNTMgQEAKKy8vPT09LSBsbHZtL0RlYnVnSW5mby9TeW1ib2xpemUvRElQcmludGVyLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBESVByaW50ZXIgY2xhc3MsIHdoaWNoIGlzIHJlc3BvbnNpYmxlIGZvciBwcmludGluZworLy8gc3RydWN0dXJlcyBkZWZpbmVkIGluIERlYnVnSW5mby9ESUNvbnRleHQuaAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fU1lNQk9MSVpFX0RJUFJJTlRFUl9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1NZTUJPTElaRV9ESVBSSU5URVJfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK3N0cnVjdCBESUxpbmVJbmZvOworY2xhc3MgRElJbmxpbmluZ0luZm87CitzdHJ1Y3QgRElHbG9iYWw7CisKK25hbWVzcGFjZSBzeW1ib2xpemUgeworCitjbGFzcyBESVByaW50ZXIgeworICByYXdfb3N0cmVhbSAmT1M7CisgIGJvb2wgUHJpbnRGdW5jdGlvbk5hbWVzOworICBib29sIFByaW50UHJldHR5OworICBpbnQgUHJpbnRTb3VyY2VDb250ZXh0OworICBib29sIFZlcmJvc2U7CisKKyAgdm9pZCBwcmludChjb25zdCBESUxpbmVJbmZvICZJbmZvLCBib29sIElubGluZWQpOworICB2b2lkIHByaW50Q29udGV4dChjb25zdCBzdGQ6OnN0cmluZyAmRmlsZU5hbWUsIGludDY0X3QgTGluZSk7CisKK3B1YmxpYzoKKyAgRElQcmludGVyKHJhd19vc3RyZWFtICZPUywgYm9vbCBQcmludEZ1bmN0aW9uTmFtZXMgPSB0cnVlLAorICAgICAgICAgICAgYm9vbCBQcmludFByZXR0eSA9IGZhbHNlLCBpbnQgUHJpbnRTb3VyY2VDb250ZXh0ID0gMCwKKyAgICAgICAgICAgIGJvb2wgVmVyYm9zZSA9IGZhbHNlKQorICAgICAgOiBPUyhPUyksIFByaW50RnVuY3Rpb25OYW1lcyhQcmludEZ1bmN0aW9uTmFtZXMpLAorICAgICAgICBQcmludFByZXR0eShQcmludFByZXR0eSksIFByaW50U291cmNlQ29udGV4dChQcmludFNvdXJjZUNvbnRleHQpLAorICAgICAgICBWZXJib3NlKFZlcmJvc2UpIHt9CisKKyAgRElQcmludGVyICZvcGVyYXRvcjw8KGNvbnN0IERJTGluZUluZm8gJkluZm8pOworICBESVByaW50ZXIgJm9wZXJhdG9yPDwoY29uc3QgRElJbmxpbmluZ0luZm8gJkluZm8pOworICBESVByaW50ZXIgJm9wZXJhdG9yPDwoY29uc3QgRElHbG9iYWwgJkdsb2JhbCk7Cit9OworfQorfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vU3ltYm9saXplL1N5bWJvbGl6YWJsZU1vZHVsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vU3ltYm9saXplL1N5bWJvbGl6YWJsZU1vZHVsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1NzZhOTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlYnVnSW5mby9TeW1ib2xpemUvU3ltYm9saXphYmxlTW9kdWxlLmgKQEAgLTAsMCArMSw0NyBAQAorLy89PT0tIFN5bWJvbGl6YWJsZU1vZHVsZS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFN5bWJvbGl6YWJsZU1vZHVsZSBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9ERUJVR0lORk9fU1lNQk9MSVpFX1NZTUJPTElaQUJMRU1PRFVMRV9ICisjZGVmaW5lIExMVk1fREVCVUdJTkZPX1NZTUJPTElaRV9TWU1CT0xJWkFCTEVNT0RVTEVfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vRElDb250ZXh0LmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHN5bWJvbGl6ZSB7CisKK3VzaW5nIEZ1bmN0aW9uTmFtZUtpbmQgPSBESUxpbmVJbmZvU3BlY2lmaWVyOjpGdW5jdGlvbk5hbWVLaW5kOworCitjbGFzcyBTeW1ib2xpemFibGVNb2R1bGUgeworcHVibGljOgorICB2aXJ0dWFsIH5TeW1ib2xpemFibGVNb2R1bGUoKSA9IGRlZmF1bHQ7CisKKyAgdmlydHVhbCBESUxpbmVJbmZvIHN5bWJvbGl6ZUNvZGUodWludDY0X3QgTW9kdWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbk5hbWVLaW5kIEZOS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVc2VTeW1ib2xUYWJsZSkgY29uc3QgPSAwOworICB2aXJ0dWFsIERJSW5saW5pbmdJbmZvIHN5bWJvbGl6ZUlubGluZWRDb2RlKHVpbnQ2NF90IE1vZHVsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbk5hbWVLaW5kIEZOS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVzZVN5bWJvbFRhYmxlKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgRElHbG9iYWwgc3ltYm9saXplRGF0YSh1aW50NjRfdCBNb2R1bGVPZmZzZXQpIGNvbnN0ID0gMDsKKworICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgMzItYml0IHg4NiBQRSBDT0ZGIG1vZHVsZS4KKyAgdmlydHVhbCBib29sIGlzV2luMzJNb2R1bGUoKSBjb25zdCA9IDA7CisKKyAgLy8gUmV0dXJucyB0aGUgcHJlZmVycmVkIGJhc2Ugb2YgdGhlIG1vZHVsZSwgaS5lLiB3aGVyZSB0aGUgbG9hZGVyIHdvdWxkIHBsYWNlCisgIC8vIGl0IGluIG1lbW9yeSBhc3N1bWluZyB0aGVyZSB3ZXJlIG5vIGNvbmZsaWN0cy4KKyAgdmlydHVhbCB1aW50NjRfdCBnZXRNb2R1bGVQcmVmZXJyZWRCYXNlKCkgY29uc3QgPSAwOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHN5bWJvbGl6ZQorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmICAvLyBMTFZNX0RFQlVHSU5GT19TWU1CT0xJWkVfU1lNQk9MSVpBQkxFTU9EVUxFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1N5bWJvbGl6ZS9TeW1ib2xpemUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVidWdJbmZvL1N5bWJvbGl6ZS9TeW1ib2xpemUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NDgwYWVmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9EZWJ1Z0luZm8vU3ltYm9saXplL1N5bWJvbGl6ZS5oCkBAIC0wLDAgKzEsMTIzIEBACisvLz09PS0gU3ltYm9saXplLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEhlYWRlciBmb3IgTExWTSBzeW1ib2xpemF0aW9uIGxpYnJhcnkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0RFQlVHSU5GT19TWU1CT0xJWkVfU1lNQk9MSVpFX0gKKyNkZWZpbmUgTExWTV9ERUJVR0lORk9fU1lNQk9MSVpFX1NZTUJPTElaRV9ICisKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9TeW1ib2xpemUvU3ltYm9saXphYmxlTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvQmluYXJ5LmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvT2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugc3ltYm9saXplIHsKKwordXNpbmcgbmFtZXNwYWNlIG9iamVjdDsKKwordXNpbmcgRnVuY3Rpb25OYW1lS2luZCA9IERJTGluZUluZm9TcGVjaWZpZXI6OkZ1bmN0aW9uTmFtZUtpbmQ7CisKK2NsYXNzIExMVk1TeW1ib2xpemVyIHsKK3B1YmxpYzoKKyAgc3RydWN0IE9wdGlvbnMgeworICAgIEZ1bmN0aW9uTmFtZUtpbmQgUHJpbnRGdW5jdGlvbnM7CisgICAgYm9vbCBVc2VTeW1ib2xUYWJsZSA6IDE7CisgICAgYm9vbCBEZW1hbmdsZSA6IDE7CisgICAgYm9vbCBSZWxhdGl2ZUFkZHJlc3NlcyA6IDE7CisgICAgc3RkOjpzdHJpbmcgRGVmYXVsdEFyY2g7CisgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IERzeW1IaW50czsKKworICAgIE9wdGlvbnMoRnVuY3Rpb25OYW1lS2luZCBQcmludEZ1bmN0aW9ucyA9IEZ1bmN0aW9uTmFtZUtpbmQ6OkxpbmthZ2VOYW1lLAorICAgICAgICAgICAgYm9vbCBVc2VTeW1ib2xUYWJsZSA9IHRydWUsIGJvb2wgRGVtYW5nbGUgPSB0cnVlLAorICAgICAgICAgICAgYm9vbCBSZWxhdGl2ZUFkZHJlc3NlcyA9IGZhbHNlLCBzdGQ6OnN0cmluZyBEZWZhdWx0QXJjaCA9ICIiKQorICAgICAgICA6IFByaW50RnVuY3Rpb25zKFByaW50RnVuY3Rpb25zKSwgVXNlU3ltYm9sVGFibGUoVXNlU3ltYm9sVGFibGUpLAorICAgICAgICAgIERlbWFuZ2xlKERlbWFuZ2xlKSwgUmVsYXRpdmVBZGRyZXNzZXMoUmVsYXRpdmVBZGRyZXNzZXMpLAorICAgICAgICAgIERlZmF1bHRBcmNoKHN0ZDo6bW92ZShEZWZhdWx0QXJjaCkpIHt9CisgIH07CisKKyAgTExWTVN5bWJvbGl6ZXIoY29uc3QgT3B0aW9ucyAmT3B0cyA9IE9wdGlvbnMoKSkgOiBPcHRzKE9wdHMpIHt9CisKKyAgfkxMVk1TeW1ib2xpemVyKCkgeworICAgIGZsdXNoKCk7CisgIH0KKworICBFeHBlY3RlZDxESUxpbmVJbmZvPiBzeW1ib2xpemVDb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZNb2R1bGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE1vZHVsZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRFdQTmFtZSA9ICIiKTsKKyAgRXhwZWN0ZWQ8RElJbmxpbmluZ0luZm8+IHN5bWJvbGl6ZUlubGluZWRDb2RlKGNvbnN0IHN0ZDo6c3RyaW5nICZNb2R1bGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgTW9kdWxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERXUE5hbWUgPSAiIik7CisgIEV4cGVjdGVkPERJR2xvYmFsPiBzeW1ib2xpemVEYXRhKGNvbnN0IHN0ZDo6c3RyaW5nICZNb2R1bGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBNb2R1bGVPZmZzZXQpOworICB2b2lkIGZsdXNoKCk7CisKKyAgc3RhdGljIHN0ZDo6c3RyaW5nCisgIERlbWFuZ2xlTmFtZShjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwKKyAgICAgICAgICAgICAgIGNvbnN0IFN5bWJvbGl6YWJsZU1vZHVsZSAqRGJpTW9kdWxlRGVzY3JpcHRvcik7CisKK3ByaXZhdGU6CisgIC8vIEJ1bmRsZXMgdG9nZXRoZXIgb2JqZWN0IGZpbGUgd2l0aCBjb2RlL2RhdGEgYW5kIG9iamVjdCBmaWxlIHdpdGgKKyAgLy8gY29ycmVzcG9uZGluZyBkZWJ1ZyBpbmZvLiBUaGVzZSBvYmplY3RzIGNhbiBiZSB0aGUgc2FtZS4KKyAgdXNpbmcgT2JqZWN0UGFpciA9IHN0ZDo6cGFpcjxPYmplY3RGaWxlICosIE9iamVjdEZpbGUgKj47CisKKyAgLy8vIFJldHVybnMgYSBTeW1ib2xpemFibGVNb2R1bGUgb3IgYW4gZXJyb3IgaWYgbG9hZGluZyBkZWJ1ZyBpbmZvIGZhaWxlZC4KKyAgLy8vIE9ubHkgb25lIGF0dGVtcHQgaXMgbWFkZSB0byBsb2FkIGEgbW9kdWxlLCBhbmQgZXJyb3JzIGR1cmluZyBsb2FkaW5nIGFyZQorICAvLy8gb25seSByZXBvcnRlZCBvbmNlLiBTdWJzZXF1ZW50IGNhbGxzIHRvIGdldCBtb2R1bGUgaW5mbyBmb3IgYSBtb2R1bGUgdGhhdAorICAvLy8gZmFpbGVkIHRvIGxvYWQgd2lsbCByZXR1cm4gbnVsbHB0ci4KKyAgRXhwZWN0ZWQ8U3ltYm9saXphYmxlTW9kdWxlICo+CisgIGdldE9yQ3JlYXRlTW9kdWxlSW5mbyhjb25zdCBzdGQ6OnN0cmluZyAmTW9kdWxlTmFtZSwgU3RyaW5nUmVmIERXUE5hbWUgPSAiIik7CisKKyAgT2JqZWN0RmlsZSAqbG9va1VwRHN5bUZpbGUoY29uc3Qgc3RkOjpzdHJpbmcgJlBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hPT2JqZWN0RmlsZSAqRXhlT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQXJjaE5hbWUpOworICBPYmplY3RGaWxlICpsb29rVXBEZWJ1Z2xpbmtPYmplY3QoY29uc3Qgc3RkOjpzdHJpbmcgJlBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmplY3RGaWxlICpPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQXJjaE5hbWUpOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyBwYWlyIG9mIHBvaW50ZXJzIHRvIG9iamVjdCBhbmQgZGVidWcgb2JqZWN0LgorICBFeHBlY3RlZDxPYmplY3RQYWlyPiBnZXRPckNyZWF0ZU9iamVjdFBhaXIoY29uc3Qgc3RkOjpzdHJpbmcgJlBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZBcmNoTmFtZSk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSBwb2ludGVyIHRvIG9iamVjdCBmaWxlIGF0IHNwZWNpZmllZCBwYXRoLCBmb3IgYSBzcGVjaWZpZWQKKyAgLy8vIGFyY2hpdGVjdHVyZSAoZS5nLiBpZiBwYXRoIHJlZmVycyB0byBhIE1hY2gtTyB1bml2ZXJzYWwgYmluYXJ5LCBvbmx5IG9uZQorICAvLy8gb2JqZWN0IGZpbGUgZnJvbSBpdCB3aWxsIGJlIHJldHVybmVkKS4KKyAgRXhwZWN0ZWQ8T2JqZWN0RmlsZSAqPiBnZXRPckNyZWF0ZU9iamVjdChjb25zdCBzdGQ6OnN0cmluZyAmUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZBcmNoTmFtZSk7CisKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6dW5pcXVlX3B0cjxTeW1ib2xpemFibGVNb2R1bGU+PiBNb2R1bGVzOworCisgIC8vLyBcYnJpZWYgQ29udGFpbnMgY2FjaGVkIHJlc3VsdHMgb2YgZ2V0T3JDcmVhdGVPYmplY3RQYWlyKCkuCisgIHN0ZDo6bWFwPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+LCBPYmplY3RQYWlyPgorICAgICAgT2JqZWN0UGFpckZvclBhdGhBcmNoOworCisgIC8vLyBcYnJpZWYgQ29udGFpbnMgcGFyc2VkIGJpbmFyeSBmb3IgZWFjaCBwYXRoLCBvciBwYXJzaW5nIGVycm9yLgorICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgT3duaW5nQmluYXJ5PEJpbmFyeT4+IEJpbmFyeUZvclBhdGg7CisKKyAgLy8vIFxicmllZiBQYXJzZWQgb2JqZWN0IGZpbGUgZm9yIHBhdGgvYXJjaGl0ZWN0dXJlIHBhaXIsIHdoZXJlICJwYXRoIiByZWZlcnMKKyAgLy8vIHRvIE1hY2gtTyB1bml2ZXJzYWwgYmluYXJ5LgorICBzdGQ6Om1hcDxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiwgc3RkOjp1bmlxdWVfcHRyPE9iamVjdEZpbGU+PgorICAgICAgT2JqZWN0Rm9yVUJQYXRoQW5kQXJjaDsKKworICBPcHRpb25zIE9wdHM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugc3ltYm9saXplCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9ERUJVR0lORk9fU1lNQk9MSVpFX1NZTUJPTElaRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlbWFuZ2xlL0NvbXBpbGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlbWFuZ2xlL0NvbXBpbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk5NmY5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVtYW5nbGUvQ29tcGlsZXIuaApAQCAtMCwwICsxLDUwNiBAQAorLy89PT0tLSBsbHZtL0RlbWFuZ2xlL0NvbXBpbGVyLmggLSBDb21waWxlciBhYnN0cmFjdGlvbiBzdXBwb3J0IC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBzZXZlcmFsIG1hY3JvcywgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29tcGlsZXIuICBUaGlzIGFsbG93cworLy8gdXNlIG9mIGNvbXBpbGVyLXNwZWNpZmljIGZlYXR1cmVzIGluIGEgd2F5IHRoYXQgcmVtYWlucyBwb3J0YWJsZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9DT01QSUxFUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9DT01QSUxFUl9ICisKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9sbHZtLWNvbmZpZy5oIgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNpbmNsdWRlIDxzYWwuaD4KKyNlbmRpZgorCisjaWZuZGVmIF9faGFzX2ZlYXR1cmUKKyMgZGVmaW5lIF9faGFzX2ZlYXR1cmUoeCkgMAorI2VuZGlmCisKKyNpZm5kZWYgX19oYXNfZXh0ZW5zaW9uCisjIGRlZmluZSBfX2hhc19leHRlbnNpb24oeCkgMAorI2VuZGlmCisKKyNpZm5kZWYgX19oYXNfYXR0cmlidXRlCisjIGRlZmluZSBfX2hhc19hdHRyaWJ1dGUoeCkgMAorI2VuZGlmCisKKyNpZm5kZWYgX19oYXNfY3BwX2F0dHJpYnV0ZQorIyBkZWZpbmUgX19oYXNfY3BwX2F0dHJpYnV0ZSh4KSAwCisjZW5kaWYKKworI2lmbmRlZiBfX2hhc19idWlsdGluCisjIGRlZmluZSBfX2hhc19idWlsdGluKHgpIDAKKyNlbmRpZgorCisvLy8gXG1hY3JvIExMVk1fR05VQ19QUkVSRVEKKy8vLyBcYnJpZWYgRXh0ZW5kIHRoZSBkZWZhdWx0IF9fR05VQ19QUkVSRVEgZXZlbiBpZiBnbGliYydzIGZlYXR1cmVzLmggaXNuJ3QKKy8vLyBhdmFpbGFibGUuCisjaWZuZGVmIExMVk1fR05VQ19QUkVSRVEKKyMgaWYgZGVmaW5lZChfX0dOVUNfXykgJiYgZGVmaW5lZChfX0dOVUNfTUlOT1JfXykgJiYgZGVmaW5lZChfX0dOVUNfUEFUQ0hMRVZFTF9fKQorIyAgZGVmaW5lIExMVk1fR05VQ19QUkVSRVEobWFqLCBtaW4sIHBhdGNoKSBcCisgICAgKChfX0dOVUNfXyA8PCAyMCkgKyAoX19HTlVDX01JTk9SX18gPDwgMTApICsgX19HTlVDX1BBVENITEVWRUxfXyA+PSBcCisgICAgICgobWFqKSA8PCAyMCkgKyAoKG1pbikgPDwgMTApICsgKHBhdGNoKSkKKyMgZWxpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiBkZWZpbmVkKF9fR05VQ19NSU5PUl9fKQorIyAgZGVmaW5lIExMVk1fR05VQ19QUkVSRVEobWFqLCBtaW4sIHBhdGNoKSBcCisgICAgKChfX0dOVUNfXyA8PCAyMCkgKyAoX19HTlVDX01JTk9SX18gPDwgMTApID49ICgobWFqKSA8PCAyMCkgKyAoKG1pbikgPDwgMTApKQorIyBlbHNlCisjICBkZWZpbmUgTExWTV9HTlVDX1BSRVJFUShtYWosIG1pbiwgcGF0Y2gpIDAKKyMgZW5kaWYKKyNlbmRpZgorCisvLy8gXG1hY3JvIExMVk1fTVNDX1BSRVJFUQorLy8vIFxicmllZiBJcyB0aGUgY29tcGlsZXIgTVNWQyBvZiBhdCBsZWFzdCB0aGUgc3BlY2lmaWVkIHZlcnNpb24/CisvLy8gVGhlIGNvbW1vbiBccGFyYW0gdmVyc2lvbiB2YWx1ZXMgdG8gY2hlY2sgZm9yIGFyZToKKy8vLyAgKiAxOTAwOiBNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyAyMDE1IC8gMTQuMAorI2lmZGVmIF9NU0NfVkVSCisjZGVmaW5lIExMVk1fTVNDX1BSRVJFUSh2ZXJzaW9uKSAoX01TQ19WRVIgPj0gKHZlcnNpb24pKQorCisvLyBXZSByZXF1aXJlIGF0IGxlYXN0IE1TVkMgMjAxNS4KKyNpZiAhTExWTV9NU0NfUFJFUkVRKDE5MDApCisjZXJyb3IgTExWTSByZXF1aXJlcyBhdCBsZWFzdCBNU1ZDIDIwMTUuCisjZW5kaWYKKworI2Vsc2UKKyNkZWZpbmUgTExWTV9NU0NfUFJFUkVRKHZlcnNpb24pIDAKKyNlbmRpZgorCisvLy8gXGJyaWVmIERvZXMgdGhlIGNvbXBpbGVyIHN1cHBvcnQgcmVmLXF1YWxpZmllcnMgZm9yICp0aGlzPworLy8vCisvLy8gU2FkbHksIHRoaXMgaXMgc2VwYXJhdGUgZnJvbSBqdXN0IHJ2YWx1ZSByZWZlcmVuY2Ugc3VwcG9ydCBiZWNhdXNlIEdDQworLy8vIGFuZCBNU1ZDIGltcGxlbWVudGVkIHRoaXMgbGF0ZXIgdGhhbiBldmVyeXRoaW5nIGVsc2UuCisjaWYgX19oYXNfZmVhdHVyZShjeHhfcnZhbHVlX3JlZmVyZW5jZXMpIHx8IExMVk1fR05VQ19QUkVSRVEoNCwgOCwgMSkKKyNkZWZpbmUgTExWTV9IQVNfUlZBTFVFX1JFRkVSRU5DRV9USElTIDEKKyNlbHNlCisjZGVmaW5lIExMVk1fSEFTX1JWQUxVRV9SRUZFUkVOQ0VfVEhJUyAwCisjZW5kaWYKKworLy8vIEV4cGFuZHMgdG8gJyYnIGlmIHJlZi1xdWFsaWZpZXJzIGZvciAqdGhpcyBhcmUgc3VwcG9ydGVkLgorLy8vCisvLy8gVGhpcyBjYW4gYmUgdXNlZCB0byBwcm92aWRlIGx2YWx1ZS9ydmFsdWUgb3ZlcnJpZGVzIG9mIG1lbWJlciBmdW5jdGlvbnMuCisvLy8gVGhlIHJ2YWx1ZSBvdmVycmlkZSBzaG91bGQgYmUgZ3VhcmRlZCBieSBMTFZNX0hBU19SVkFMVUVfUkVGRVJFTkNFX1RISVMKKyNpZiBMTFZNX0hBU19SVkFMVUVfUkVGRVJFTkNFX1RISVMKKyNkZWZpbmUgTExWTV9MVkFMVUVfRlVOQ1RJT04gJgorI2Vsc2UKKyNkZWZpbmUgTExWTV9MVkFMVUVfRlVOQ1RJT04KKyNlbmRpZgorCisvLy8gTExWTV9MSUJSQVJZX1ZJU0lCSUxJVFkgLSBJZiBhIGNsYXNzIG1hcmtlZCB3aXRoIHRoaXMgYXR0cmlidXRlIGlzIGxpbmtlZAorLy8vIGludG8gYSBzaGFyZWQgbGlicmFyeSwgdGhlbiB0aGUgY2xhc3Mgc2hvdWxkIGJlIHByaXZhdGUgdG8gdGhlIGxpYnJhcnkgYW5kCisvLy8gbm90IGFjY2Vzc2libGUgZnJvbSBvdXRzaWRlIGl0LiAgQ2FuIGFsc28gYmUgdXNlZCB0byBtYXJrIHZhcmlhYmxlcyBhbmQKKy8vLyBmdW5jdGlvbnMsIG1ha2luZyB0aGVtIHByaXZhdGUgdG8gYW55IHNoYXJlZCBsaWJyYXJ5IHRoZXkgYXJlIGxpbmtlZCBpbnRvLgorLy8vIE9uIFBFL0NPRkYgdGFyZ2V0cywgbGlicmFyeSB2aXNpYmlsaXR5IGlzIHRoZSBkZWZhdWx0LCBzbyB0aGlzIGlzbid0IG5lZWRlZC4KKyNpZiAoX19oYXNfYXR0cmlidXRlKHZpc2liaWxpdHkpIHx8IExMVk1fR05VQ19QUkVSRVEoNCwgMCwgMCkpICYmICAgICAgICAgICAgICBcCisgICAgIWRlZmluZWQoX19NSU5HVzMyX18pICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pICYmICFkZWZpbmVkKExMVk1fT05fV0lOMzIpCisjZGVmaW5lIExMVk1fTElCUkFSWV9WSVNJQklMSVRZIF9fYXR0cmlidXRlX18gKCh2aXNpYmlsaXR5KCJoaWRkZW4iKSkpCisjZWxzZQorI2RlZmluZSBMTFZNX0xJQlJBUllfVklTSUJJTElUWQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fR05VQ19fKQorI2RlZmluZSBMTFZNX1BSRUZFVENIKGFkZHIsIHJ3LCBsb2NhbGl0eSkgX19idWlsdGluX3ByZWZldGNoKGFkZHIsIHJ3LCBsb2NhbGl0eSkKKyNlbHNlCisjZGVmaW5lIExMVk1fUFJFRkVUQ0goYWRkciwgcncsIGxvY2FsaXR5KQorI2VuZGlmCisKKyNpZiBfX2hhc19hdHRyaWJ1dGUodXNlZCkgfHwgTExWTV9HTlVDX1BSRVJFUSgzLCAxLCAwKQorI2RlZmluZSBMTFZNX0FUVFJJQlVURV9VU0VEIF9fYXR0cmlidXRlX18oKF9fdXNlZF9fKSkKKyNlbHNlCisjZGVmaW5lIExMVk1fQVRUUklCVVRFX1VTRUQKKyNlbmRpZgorCisvLy8gTExWTV9OT0RJU0NBUkQgLSBXYXJuIGlmIGEgdHlwZSBvciByZXR1cm4gdmFsdWUgaXMgZGlzY2FyZGVkLgorI2lmIF9fY3BsdXNwbHVzID4gMjAxNDAyTCAmJiBfX2hhc19jcHBfYXR0cmlidXRlKG5vZGlzY2FyZCkKKyNkZWZpbmUgTExWTV9OT0RJU0NBUkQgW1tub2Rpc2NhcmRdXQorI2VsaWYgIV9fY3BsdXNwbHVzCisvLyBXb3JrYXJvdW5kIGZvciBsbHZtLm9yZy9QUjIzNDM1LCBzaW5jZSBjbGFuZyAzLjYgYW5kIGJlbG93IGVtaXQgYSBzcHVyaW91cworLy8gZXJyb3Igd2hlbiBfX2hhc19jcHBfYXR0cmlidXRlIGlzIGdpdmVuIGEgc2NvcGVkIGF0dHJpYnV0ZSBpbiBDIG1vZGUuCisjZGVmaW5lIExMVk1fTk9ESVNDQVJECisjZWxpZiBfX2hhc19jcHBfYXR0cmlidXRlKGNsYW5nOjp3YXJuX3VudXNlZF9yZXN1bHQpCisjZGVmaW5lIExMVk1fTk9ESVNDQVJEIFtbY2xhbmc6Ondhcm5fdW51c2VkX3Jlc3VsdF1dCisjZWxzZQorI2RlZmluZSBMTFZNX05PRElTQ0FSRAorI2VuZGlmCisKKy8vIFNvbWUgY29tcGlsZXJzIHdhcm4gYWJvdXQgdW51c2VkIGZ1bmN0aW9ucy4gV2hlbiBhIGZ1bmN0aW9uIGlzIHNvbWV0aW1lcworLy8gdXNlZCBvciBub3QgZGVwZW5kaW5nIG9uIGJ1aWxkIHNldHRpbmdzIChlLmcuIGEgZnVuY3Rpb24gb25seSBjYWxsZWQgZnJvbQorLy8gd2l0aGluICJhc3NlcnQiKSwgdGhpcyBhdHRyaWJ1dGUgY2FuIGJlIHVzZWQgdG8gc3VwcHJlc3Mgc3VjaCB3YXJuaW5ncy4KKy8vCisvLyBIb3dldmVyLCBpdCBzaG91bGRuJ3QgYmUgdXNlZCBmb3IgdW51c2VkICp2YXJpYWJsZXMqLCBhcyB0aG9zZSBoYXZlIGEgbXVjaAorLy8gbW9yZSBwb3J0YWJsZSBzb2x1dGlvbjoKKy8vICAgKHZvaWQpdW51c2VkX3Zhcl9uYW1lOworLy8gUHJlZmVyIGNhc3QtdG8tdm9pZCB3aGVyZXZlciBpdCBpcyBzdWZmaWNpZW50LgorI2lmIF9faGFzX2F0dHJpYnV0ZSh1bnVzZWQpIHx8IExMVk1fR05VQ19QUkVSRVEoMywgMSwgMCkKKyNkZWZpbmUgTExWTV9BVFRSSUJVVEVfVU5VU0VEIF9fYXR0cmlidXRlX18oKF9fdW51c2VkX18pKQorI2Vsc2UKKyNkZWZpbmUgTExWTV9BVFRSSUJVVEVfVU5VU0VECisjZW5kaWYKKworLy8gRklYTUU6IFByb3ZpZGUgdGhpcyBmb3IgUEUvQ09GRiB0YXJnZXRzLgorI2lmIChfX2hhc19hdHRyaWJ1dGUod2VhaykgfHwgTExWTV9HTlVDX1BSRVJFUSg0LCAwLCAwKSkgJiYgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoIWRlZmluZWQoX19NSU5HVzMyX18pICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pICYmICFkZWZpbmVkKExMVk1fT05fV0lOMzIpKQorI2RlZmluZSBMTFZNX0FUVFJJQlVURV9XRUFLIF9fYXR0cmlidXRlX18oKF9fd2Vha19fKSkKKyNlbHNlCisjZGVmaW5lIExMVk1fQVRUUklCVVRFX1dFQUsKKyNlbmRpZgorCisvLyBQcmlvciB0byBjbGFuZyAzLjIsIGNsYW5nIGRpZCBub3QgYWNjZXB0IGFueSBzcGVsbGluZyBvZgorLy8gX19oYXNfYXR0cmlidXRlKGNvbnN0KSwgc28gYXNzdW1lIGl0IGlzIHN1cHBvcnRlZC4KKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykgfHwgZGVmaW5lZChfX0dOVUNfXykKKy8vIGFrYSAnQ09OU1QnIGJ1dCBmb2xsb3dpbmcgTExWTSBDb252ZW50aW9ucy4KKyNkZWZpbmUgTExWTV9SRUFETk9ORSBfX2F0dHJpYnV0ZV9fKChfX2NvbnN0X18pKQorI2Vsc2UKKyNkZWZpbmUgTExWTV9SRUFETk9ORQorI2VuZGlmCisKKyNpZiBfX2hhc19hdHRyaWJ1dGUocHVyZSkgfHwgZGVmaW5lZChfX0dOVUNfXykKKy8vIGFrYSAnUFVSRScgYnV0IGZvbGxvd2luZyBMTFZNIENvbnZlbnRpb25zLgorI2RlZmluZSBMTFZNX1JFQURPTkxZIF9fYXR0cmlidXRlX18oKF9fcHVyZV9fKSkKKyNlbHNlCisjZGVmaW5lIExMVk1fUkVBRE9OTFkKKyNlbmRpZgorCisjaWYgX19oYXNfYnVpbHRpbihfX2J1aWx0aW5fZXhwZWN0KSB8fCBMTFZNX0dOVUNfUFJFUkVRKDQsIDAsIDApCisjZGVmaW5lIExMVk1fTElLRUxZKEVYUFIpIF9fYnVpbHRpbl9leHBlY3QoKGJvb2wpKEVYUFIpLCB0cnVlKQorI2RlZmluZSBMTFZNX1VOTElLRUxZKEVYUFIpIF9fYnVpbHRpbl9leHBlY3QoKGJvb2wpKEVYUFIpLCBmYWxzZSkKKyNlbHNlCisjZGVmaW5lIExMVk1fTElLRUxZKEVYUFIpIChFWFBSKQorI2RlZmluZSBMTFZNX1VOTElLRUxZKEVYUFIpIChFWFBSKQorI2VuZGlmCisKKy8vLyBMTFZNX0FUVFJJQlVURV9OT0lOTElORSAtIE9uIGNvbXBpbGVycyB3aGVyZSB3ZSBoYXZlIGEgZGlyZWN0aXZlIHRvIGRvIHNvLAorLy8vIG1hcmsgYSBtZXRob2QgIm5vdCBmb3IgaW5saW5pbmciLgorI2lmIF9faGFzX2F0dHJpYnV0ZShub2lubGluZSkgfHwgTExWTV9HTlVDX1BSRVJFUSgzLCA0LCAwKQorI2RlZmluZSBMTFZNX0FUVFJJQlVURV9OT0lOTElORSBfX2F0dHJpYnV0ZV9fKChub2lubGluZSkpCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2RlZmluZSBMTFZNX0FUVFJJQlVURV9OT0lOTElORSBfX2RlY2xzcGVjKG5vaW5saW5lKQorI2Vsc2UKKyNkZWZpbmUgTExWTV9BVFRSSUJVVEVfTk9JTkxJTkUKKyNlbmRpZgorCisvLy8gTExWTV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSAtIE9uIGNvbXBpbGVycyB3aGVyZSB3ZSBoYXZlIGEgZGlyZWN0aXZlIHRvIGRvCisvLy8gc28sIG1hcmsgYSBtZXRob2QgImFsd2F5cyBpbmxpbmUiIGJlY2F1c2UgaXQgaXMgcGVyZm9ybWFuY2Ugc2Vuc2l0aXZlLiBHQ0MKKy8vLyAzLjQgc3VwcG9ydGVkIHRoaXMgYnV0IGlzIGJ1Z2d5IGluIHZhcmlvdXMgY2FzZXMgYW5kIHByb2R1Y2VzIHVuaW1wbGVtZW50ZWQKKy8vLyBlcnJvcnMsIGp1c3QgdXNlIGl0IGluIEdDQyA0LjAgYW5kIGxhdGVyLgorI2lmIF9faGFzX2F0dHJpYnV0ZShhbHdheXNfaW5saW5lKSB8fCBMTFZNX0dOVUNfUFJFUkVRKDQsIDAsIDApCisjZGVmaW5lIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgX19hdHRyaWJ1dGVfXygoYWx3YXlzX2lubGluZSkpCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2RlZmluZSBMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIF9fZm9yY2VpbmxpbmUKKyNlbHNlCisjZGVmaW5lIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyNlbmRpZgorCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgTExWTV9BVFRSSUJVVEVfTk9SRVRVUk4gX19hdHRyaWJ1dGVfXygobm9yZXR1cm4pKQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgTExWTV9BVFRSSUJVVEVfTk9SRVRVUk4gX19kZWNsc3BlYyhub3JldHVybikKKyNlbHNlCisjZGVmaW5lIExMVk1fQVRUUklCVVRFX05PUkVUVVJOCisjZW5kaWYKKworI2lmIF9faGFzX2F0dHJpYnV0ZShyZXR1cm5zX25vbm51bGwpIHx8IExMVk1fR05VQ19QUkVSRVEoNCwgOSwgMCkKKyNkZWZpbmUgTExWTV9BVFRSSUJVVEVfUkVUVVJOU19OT05OVUxMIF9fYXR0cmlidXRlX18oKHJldHVybnNfbm9ubnVsbCkpCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2RlZmluZSBMTFZNX0FUVFJJQlVURV9SRVRVUk5TX05PTk5VTEwgX1JldF9ub3RudWxsXworI2Vsc2UKKyNkZWZpbmUgTExWTV9BVFRSSUJVVEVfUkVUVVJOU19OT05OVUxMCisjZW5kaWYKKworLy8vIFxtYWNybyBMTFZNX0FUVFJJQlVURV9SRVRVUk5TX05PQUxJQVMgVXNlZCB0byBtYXJrIGEgZnVuY3Rpb24gYXMgcmV0dXJuaW5nIGEKKy8vLyBwb2ludGVyIHRoYXQgZG9lcyBub3QgYWxpYXMgYW55IG90aGVyIHZhbGlkIHBvaW50ZXIuCisjaWZkZWYgX19HTlVDX18KKyNkZWZpbmUgTExWTV9BVFRSSUJVVEVfUkVUVVJOU19OT0FMSUFTIF9fYXR0cmlidXRlX18oKF9fbWFsbG9jX18pKQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgTExWTV9BVFRSSUJVVEVfUkVUVVJOU19OT0FMSUFTIF9fZGVjbHNwZWMocmVzdHJpY3QpCisjZWxzZQorI2RlZmluZSBMTFZNX0FUVFJJQlVURV9SRVRVUk5TX05PQUxJQVMKKyNlbmRpZgorCisvLy8gTExWTV9GQUxMVEhST1VHSCAtIE1hcmsgZmFsbHRocm91Z2ggY2FzZXMgaW4gc3dpdGNoIHN0YXRlbWVudHMuCisjaWYgX19jcGx1c3BsdXMgPiAyMDE0MDJMICYmIF9faGFzX2NwcF9hdHRyaWJ1dGUoZmFsbHRocm91Z2gpCisjZGVmaW5lIExMVk1fRkFMTFRIUk9VR0ggW1tmYWxsdGhyb3VnaF1dCisjZWxpZiBfX2hhc19jcHBfYXR0cmlidXRlKGdudTo6ZmFsbHRocm91Z2gpCisjZGVmaW5lIExMVk1fRkFMTFRIUk9VR0ggW1tnbnU6OmZhbGx0aHJvdWdoXV0KKyNlbGlmICFfX2NwbHVzcGx1cworLy8gV29ya2Fyb3VuZCBmb3IgbGx2bS5vcmcvUFIyMzQzNSwgc2luY2UgY2xhbmcgMy42IGFuZCBiZWxvdyBlbWl0IGEgc3B1cmlvdXMKKy8vIGVycm9yIHdoZW4gX19oYXNfY3BwX2F0dHJpYnV0ZSBpcyBnaXZlbiBhIHNjb3BlZCBhdHRyaWJ1dGUgaW4gQyBtb2RlLgorI2RlZmluZSBMTFZNX0ZBTExUSFJPVUdICisjZWxpZiBfX2hhc19jcHBfYXR0cmlidXRlKGNsYW5nOjpmYWxsdGhyb3VnaCkKKyNkZWZpbmUgTExWTV9GQUxMVEhST1VHSCBbW2NsYW5nOjpmYWxsdGhyb3VnaF1dCisjZWxzZQorI2RlZmluZSBMTFZNX0ZBTExUSFJPVUdICisjZW5kaWYKKworLy8vIExMVk1fRVhURU5TSU9OIC0gU3VwcG9ydCBjb21waWxlcnMgd2hlcmUgd2UgaGF2ZSBhIGtleXdvcmQgdG8gc3VwcHJlc3MKKy8vLyBwZWRhbnRpYyBkaWFnbm9zdGljcy4KKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBMTFZNX0VYVEVOU0lPTiBfX2V4dGVuc2lvbl9fCisjZWxzZQorI2RlZmluZSBMTFZNX0VYVEVOU0lPTgorI2VuZGlmCisKKy8vIExMVk1fQVRUUklCVVRFX0RFUFJFQ0FURUQoZGVjbCwgIm1lc3NhZ2UiKQorI2lmIF9faGFzX2ZlYXR1cmUoYXR0cmlidXRlX2RlcHJlY2F0ZWRfd2l0aF9tZXNzYWdlKQorIyBkZWZpbmUgTExWTV9BVFRSSUJVVEVfREVQUkVDQVRFRChkZWNsLCBtZXNzYWdlKSBcCisgIGRlY2wgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZChtZXNzYWdlKSkpCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorIyBkZWZpbmUgTExWTV9BVFRSSUJVVEVfREVQUkVDQVRFRChkZWNsLCBtZXNzYWdlKSBcCisgIGRlY2wgX19hdHRyaWJ1dGVfXygoZGVwcmVjYXRlZCkpCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorIyBkZWZpbmUgTExWTV9BVFRSSUJVVEVfREVQUkVDQVRFRChkZWNsLCBtZXNzYWdlKSBcCisgIF9fZGVjbHNwZWMoZGVwcmVjYXRlZChtZXNzYWdlKSkgZGVjbAorI2Vsc2UKKyMgZGVmaW5lIExMVk1fQVRUUklCVVRFX0RFUFJFQ0FURUQoZGVjbCwgbWVzc2FnZSkgXAorICBkZWNsCisjZW5kaWYKKworLy8vIExMVk1fQlVJTFRJTl9VTlJFQUNIQUJMRSAtIE9uIGNvbXBpbGVycyB3aGljaCBzdXBwb3J0IGl0LCBleHBhbmRzCisvLy8gdG8gYW4gZXhwcmVzc2lvbiB3aGljaCBzdGF0ZXMgdGhhdCBpdCBpcyB1bmRlZmluZWQgYmVoYXZpb3IgZm9yIHRoZQorLy8vIGNvbXBpbGVyIHRvIHJlYWNoIHRoaXMgcG9pbnQuICBPdGhlcndpc2UgaXMgbm90IGRlZmluZWQuCisjaWYgX19oYXNfYnVpbHRpbihfX2J1aWx0aW5fdW5yZWFjaGFibGUpIHx8IExMVk1fR05VQ19QUkVSRVEoNCwgNSwgMCkKKyMgZGVmaW5lIExMVk1fQlVJTFRJTl9VTlJFQUNIQUJMRSBfX2J1aWx0aW5fdW5yZWFjaGFibGUoKQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKyMgZGVmaW5lIExMVk1fQlVJTFRJTl9VTlJFQUNIQUJMRSBfX2Fzc3VtZShmYWxzZSkKKyNlbmRpZgorCisvLy8gTExWTV9CVUlMVElOX1RSQVAgLSBPbiBjb21waWxlcnMgd2hpY2ggc3VwcG9ydCBpdCwgZXhwYW5kcyB0byBhbiBleHByZXNzaW9uCisvLy8gd2hpY2ggY2F1c2VzIHRoZSBwcm9ncmFtIHRvIGV4aXQgYWJub3JtYWxseS4KKyNpZiBfX2hhc19idWlsdGluKF9fYnVpbHRpbl90cmFwKSB8fCBMTFZNX0dOVUNfUFJFUkVRKDQsIDMsIDApCisjIGRlZmluZSBMTFZNX0JVSUxUSU5fVFJBUCBfX2J1aWx0aW5fdHJhcCgpCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorLy8gVGhlIF9fZGVidWdicmVhayBpbnRyaW5zaWMgaXMgc3VwcG9ydGVkIGJ5IE1TVkMsIGRvZXMgbm90IHJlcXVpcmUgZm9yd2FyZAorLy8gZGVjbGFyYXRpb25zIGludm9sdmluZyBwbGF0Zm9ybS1zcGVjaWZpYyB0eXBlZGVmcyAodW5saWtlIFJhaXNlRXhjZXB0aW9uKSwKKy8vIHJlc3VsdHMgaW4gYSBjYWxsIHRvIHZlY3RvcmVkIGV4Y2VwdGlvbiBoYW5kbGVycywgYW5kIGVuY29kZXMgdG8gYSBzaG9ydAorLy8gaW5zdHJ1Y3Rpb24gdGhhdCBzdGlsbCBjYXVzZXMgdGhlIHRyYXBwaW5nIGJlaGF2aW9yIHdlIHdhbnQuCisjIGRlZmluZSBMTFZNX0JVSUxUSU5fVFJBUCBfX2RlYnVnYnJlYWsoKQorI2Vsc2UKKyMgZGVmaW5lIExMVk1fQlVJTFRJTl9UUkFQICoodm9sYXRpbGUgaW50KikweDExID0gMAorI2VuZGlmCisKKy8vLyBMTFZNX0JVSUxUSU5fREVCVUdUUkFQIC0gT24gY29tcGlsZXJzIHdoaWNoIHN1cHBvcnQgaXQsIGV4cGFuZHMgdG8KKy8vLyBhbiBleHByZXNzaW9uIHdoaWNoIGNhdXNlcyB0aGUgcHJvZ3JhbSB0byBicmVhayB3aGlsZSBydW5uaW5nCisvLy8gdW5kZXIgYSBkZWJ1Z2dlci4KKyNpZiBfX2hhc19idWlsdGluKF9fYnVpbHRpbl9kZWJ1Z3RyYXApCisjIGRlZmluZSBMTFZNX0JVSUxUSU5fREVCVUdUUkFQIF9fYnVpbHRpbl9kZWJ1Z3RyYXAoKQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKKy8vIFRoZSBfX2RlYnVnYnJlYWsgaW50cmluc2ljIGlzIHN1cHBvcnRlZCBieSBNU1ZDIGFuZCBicmVha3Mgd2hpbGUKKy8vIHJ1bm5pbmcgdW5kZXIgdGhlIGRlYnVnZ2VyLCBhbmQgYWxzbyBzdXBwb3J0cyBpbnZva2luZyBhIGRlYnVnZ2VyCisvLyB3aGVuIHRoZSBPUyBpcyBjb25maWd1cmVkIGFwcHJvcHJpYXRlbHkuCisjIGRlZmluZSBMTFZNX0JVSUxUSU5fREVCVUdUUkFQIF9fZGVidWdicmVhaygpCisjZWxzZQorLy8gSnVzdCBjb250aW51ZSBleGVjdXRpb24gd2hlbiBidWlsdCB3aXRoIGNvbXBpbGVycyB0aGF0IGhhdmUgbm8KKy8vIHN1cHBvcnQuIFRoaXMgaXMgYSBkZWJ1Z2dpbmcgYWlkIGFuZCBub3QgaW50ZW5kZWQgdG8gZm9yY2UgdGhlCisvLyBwcm9ncmFtIHRvIGFib3J0IGlmIGVuY291bnRlcmVkLgorIyBkZWZpbmUgTExWTV9CVUlMVElOX0RFQlVHVFJBUAorI2VuZGlmCisKKy8vLyBcbWFjcm8gTExWTV9BU1NVTUVfQUxJR05FRAorLy8vIFxicmllZiBSZXR1cm5zIGEgcG9pbnRlciB3aXRoIGFuIGFzc3VtZWQgYWxpZ25tZW50LgorI2lmIF9faGFzX2J1aWx0aW4oX19idWlsdGluX2Fzc3VtZV9hbGlnbmVkKSB8fCBMTFZNX0dOVUNfUFJFUkVRKDQsIDcsIDApCisjIGRlZmluZSBMTFZNX0FTU1VNRV9BTElHTkVEKHAsIGEpIF9fYnVpbHRpbl9hc3N1bWVfYWxpZ25lZChwLCBhKQorI2VsaWYgZGVmaW5lZChMTFZNX0JVSUxUSU5fVU5SRUFDSEFCTEUpCisvLyBBcyBvZiB0b2RheSwgY2xhbmcgZG9lcyBub3Qgc3VwcG9ydCBfX2J1aWx0aW5fYXNzdW1lX2FsaWduZWQuCisjIGRlZmluZSBMTFZNX0FTU1VNRV9BTElHTkVEKHAsIGEpIFwKKyAgICAgICAgICAgKCgodWludHB0cl90KHApICUgKGEpKSA9PSAwKSA/IChwKSA6IChMTFZNX0JVSUxUSU5fVU5SRUFDSEFCTEUsIChwKSkpCisjZWxzZQorIyBkZWZpbmUgTExWTV9BU1NVTUVfQUxJR05FRChwLCBhKSAocCkKKyNlbmRpZgorCisvLy8gXG1hY3JvIExMVk1fQUxJR05BUworLy8vIFxicmllZiBVc2VkIHRvIHNwZWNpZnkgYSBtaW5pbXVtIGFsaWdubWVudCBmb3IgYSBzdHJ1Y3R1cmUgb3IgdmFyaWFibGUuCisjaWYgX19HTlVDX18gJiYgIV9faGFzX2ZlYXR1cmUoY3h4X2FsaWduYXMpICYmICFMTFZNX0dOVUNfUFJFUkVRKDQsIDgsIDEpCisjIGRlZmluZSBMTFZNX0FMSUdOQVMoeCkgX19hdHRyaWJ1dGVfXygoYWxpZ25lZCh4KSkpCisjZWxzZQorIyBkZWZpbmUgTExWTV9BTElHTkFTKHgpIGFsaWduYXMoeCkKKyNlbmRpZgorCisvLy8gXG1hY3JvIExMVk1fUEFDS0VECisvLy8gXGJyaWVmIFVzZWQgdG8gc3BlY2lmeSBhIHBhY2tlZCBzdHJ1Y3R1cmUuCisvLy8gTExWTV9QQUNLRUQoCisvLy8gICAgc3RydWN0IEEgeworLy8vICAgICAgaW50IGk7CisvLy8gICAgICBpbnQgajsKKy8vLyAgICAgIGludCBrOworLy8vICAgICAgbG9uZyBsb25nIGw7CisvLy8gICB9KTsKKy8vLworLy8vIExMVk1fUEFDS0VEX1NUQVJUCisvLy8gc3RydWN0IEIgeworLy8vICAgaW50IGk7CisvLy8gICBpbnQgajsKKy8vLyAgIGludCBrOworLy8vICAgbG9uZyBsb25nIGw7CisvLy8gfTsKKy8vLyBMTFZNX1BBQ0tFRF9FTkQKKyNpZmRlZiBfTVNDX1ZFUgorIyBkZWZpbmUgTExWTV9QQUNLRUQoZCkgX19wcmFnbWEocGFjayhwdXNoLCAxKSkgZCBfX3ByYWdtYShwYWNrKHBvcCkpCisjIGRlZmluZSBMTFZNX1BBQ0tFRF9TVEFSVCBfX3ByYWdtYShwYWNrKHB1c2gsIDEpKQorIyBkZWZpbmUgTExWTV9QQUNLRURfRU5EICAgX19wcmFnbWEocGFjayhwb3ApKQorI2Vsc2UKKyMgZGVmaW5lIExMVk1fUEFDS0VEKGQpIGQgX19hdHRyaWJ1dGVfXygocGFja2VkKSkKKyMgZGVmaW5lIExMVk1fUEFDS0VEX1NUQVJUIF9QcmFnbWEoInBhY2socHVzaCwgMSkiKQorIyBkZWZpbmUgTExWTV9QQUNLRURfRU5EICAgX1ByYWdtYSgicGFjayhwb3ApIikKKyNlbmRpZgorCisvLy8gXG1hY3JvIExMVk1fUFRSX1NJWkUKKy8vLyBcYnJpZWYgQSBjb25zdGFudCBpbnRlZ2VyIGVxdWl2YWxlbnQgdG8gdGhlIHZhbHVlIG9mIHNpemVvZih2b2lkKikuCisvLy8gR2VuZXJhbGx5IHVzZWQgaW4gY29tYmluYXRpb24gd2l0aCBMTFZNX0FMSUdOQVMgb3Igd2hlbiBkb2luZyBjb21wdXRhdGlvbiBpbgorLy8vIHRoZSBwcmVwcm9jZXNzb3IuCisjaWZkZWYgX19TSVpFT0ZfUE9JTlRFUl9fCisjIGRlZmluZSBMTFZNX1BUUl9TSVpFIF9fU0laRU9GX1BPSU5URVJfXworI2VsaWYgZGVmaW5lZChfV0lONjQpCisjIGRlZmluZSBMTFZNX1BUUl9TSVpFIDgKKyNlbGlmIGRlZmluZWQoX1dJTjMyKQorIyBkZWZpbmUgTExWTV9QVFJfU0laRSA0CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorIyBlcnJvciAiY291bGQgbm90IGRldGVybWluZSBMTFZNX1BUUl9TSVpFIGFzIGEgY29uc3RhbnQgaW50IGZvciBNU1ZDIgorI2Vsc2UKKyMgZGVmaW5lIExMVk1fUFRSX1NJWkUgc2l6ZW9mKHZvaWQgKikKKyNlbmRpZgorCisvLy8gXG1hY3JvIExMVk1fTUVNT1JZX1NBTklUSVpFUl9CVUlMRAorLy8vIFxicmllZiBXaGV0aGVyIExMVk0gaXRzZWxmIGlzIGJ1aWx0IHdpdGggTWVtb3J5U2FuaXRpemVyIGluc3RydW1lbnRhdGlvbi4KKyNpZiBfX2hhc19mZWF0dXJlKG1lbW9yeV9zYW5pdGl6ZXIpCisjIGRlZmluZSBMTFZNX01FTU9SWV9TQU5JVElaRVJfQlVJTEQgMQorIyBpbmNsdWRlIDxzYW5pdGl6ZXIvbXNhbl9pbnRlcmZhY2UuaD4KKyNlbHNlCisjIGRlZmluZSBMTFZNX01FTU9SWV9TQU5JVElaRVJfQlVJTEQgMAorIyBkZWZpbmUgX19tc2FuX2FsbG9jYXRlZF9tZW1vcnkocCwgc2l6ZSkKKyMgZGVmaW5lIF9fbXNhbl91bnBvaXNvbihwLCBzaXplKQorI2VuZGlmCisKKy8vLyBcbWFjcm8gTExWTV9BRERSRVNTX1NBTklUSVpFUl9CVUlMRAorLy8vIFxicmllZiBXaGV0aGVyIExMVk0gaXRzZWxmIGlzIGJ1aWx0IHdpdGggQWRkcmVzc1Nhbml0aXplciBpbnN0cnVtZW50YXRpb24uCisjaWYgX19oYXNfZmVhdHVyZShhZGRyZXNzX3Nhbml0aXplcikgfHwgZGVmaW5lZChfX1NBTklUSVpFX0FERFJFU1NfXykKKyMgZGVmaW5lIExMVk1fQUREUkVTU19TQU5JVElaRVJfQlVJTEQgMQorIyBpbmNsdWRlIDxzYW5pdGl6ZXIvYXNhbl9pbnRlcmZhY2UuaD4KKyNlbHNlCisjIGRlZmluZSBMTFZNX0FERFJFU1NfU0FOSVRJWkVSX0JVSUxEIDAKKyMgZGVmaW5lIF9fYXNhbl9wb2lzb25fbWVtb3J5X3JlZ2lvbihwLCBzaXplKQorIyBkZWZpbmUgX19hc2FuX3VucG9pc29uX21lbW9yeV9yZWdpb24ocCwgc2l6ZSkKKyNlbmRpZgorCisvLy8gXG1hY3JvIExMVk1fVEhSRUFEX1NBTklUSVpFUl9CVUlMRAorLy8vIFxicmllZiBXaGV0aGVyIExMVk0gaXRzZWxmIGlzIGJ1aWx0IHdpdGggVGhyZWFkU2FuaXRpemVyIGluc3RydW1lbnRhdGlvbi4KKyNpZiBfX2hhc19mZWF0dXJlKHRocmVhZF9zYW5pdGl6ZXIpIHx8IGRlZmluZWQoX19TQU5JVElaRV9USFJFQURfXykKKyMgZGVmaW5lIExMVk1fVEhSRUFEX1NBTklUSVpFUl9CVUlMRCAxCisjZWxzZQorIyBkZWZpbmUgTExWTV9USFJFQURfU0FOSVRJWkVSX0JVSUxEIDAKKyNlbmRpZgorCisjaWYgTExWTV9USFJFQURfU0FOSVRJWkVSX0JVSUxECisvLyBUaHJlYWQgU2FuaXRpemVyIGlzIGEgdG9vbCB0aGF0IGZpbmRzIHJhY2VzIGluIGNvZGUuCisvLyBTZWUgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL2RhdGEtcmFjZS10ZXN0L3dpa2kvRHluYW1pY0Fubm90YXRpb25zIC4KKy8vIHRzYW4gZGV0ZWN0cyB0aGVzZSBleGFjdCBmdW5jdGlvbnMgYnkgbmFtZS4KKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKK3ZvaWQgQW5ub3RhdGVIYXBwZW5zQWZ0ZXIoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUsIGNvbnN0IHZvbGF0aWxlIHZvaWQgKmN2KTsKK3ZvaWQgQW5ub3RhdGVIYXBwZW5zQmVmb3JlKGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lLCBjb25zdCB2b2xhdGlsZSB2b2lkICpjdik7Cit2b2lkIEFubm90YXRlSWdub3JlV3JpdGVzQmVnaW4oY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpOwordm9pZCBBbm5vdGF0ZUlnbm9yZVdyaXRlc0VuZChjb25zdCBjaGFyICpmaWxlLCBpbnQgbGluZSk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisvLyBUaGlzIG1hcmtlciBpcyB1c2VkIHRvIGRlZmluZSBhIGhhcHBlbnMtYmVmb3JlIGFyYy4gVGhlIHJhY2UgZGV0ZWN0b3Igd2lsbAorLy8gaW5mZXIgYW4gYXJjIGZyb20gdGhlIGJlZ2luIHRvIHRoZSBlbmQgd2hlbiB0aGV5IHNoYXJlIHRoZSBzYW1lIHBvaW50ZXIKKy8vIGFyZ3VtZW50LgorIyBkZWZpbmUgVHNhbkhhcHBlbnNCZWZvcmUoY3YpIEFubm90YXRlSGFwcGVuc0JlZm9yZShfX0ZJTEVfXywgX19MSU5FX18sIGN2KQorCisvLyBUaGlzIG1hcmtlciBkZWZpbmVzIHRoZSBkZXN0aW5hdGlvbiBvZiBhIGhhcHBlbnMtYmVmb3JlIGFyYy4KKyMgZGVmaW5lIFRzYW5IYXBwZW5zQWZ0ZXIoY3YpIEFubm90YXRlSGFwcGVuc0FmdGVyKF9fRklMRV9fLCBfX0xJTkVfXywgY3YpCisKKy8vIElnbm9yZSBhbnkgcmFjZXMgb24gd3JpdGVzIGJldHdlZW4gaGVyZSBhbmQgdGhlIG5leHQgVHNhbklnbm9yZVdyaXRlc0VuZC4KKyMgZGVmaW5lIFRzYW5JZ25vcmVXcml0ZXNCZWdpbigpIEFubm90YXRlSWdub3JlV3JpdGVzQmVnaW4oX19GSUxFX18sIF9fTElORV9fKQorCisvLyBSZXN1bWUgY2hlY2tpbmcgZm9yIHJhY3kgd3JpdGVzLgorIyBkZWZpbmUgVHNhbklnbm9yZVdyaXRlc0VuZCgpIEFubm90YXRlSWdub3JlV3JpdGVzRW5kKF9fRklMRV9fLCBfX0xJTkVfXykKKyNlbHNlCisjIGRlZmluZSBUc2FuSGFwcGVuc0JlZm9yZShjdikKKyMgZGVmaW5lIFRzYW5IYXBwZW5zQWZ0ZXIoY3YpCisjIGRlZmluZSBUc2FuSWdub3JlV3JpdGVzQmVnaW4oKQorIyBkZWZpbmUgVHNhbklnbm9yZVdyaXRlc0VuZCgpCisjZW5kaWYKKworLy8vIFxtYWNybyBMTFZNX05PX1NBTklUSVpFCisvLy8gXGJyaWVmIERpc2FibGUgYSBwYXJ0aWN1bGFyIHNhbml0aXplciBmb3IgYSBmdW5jdGlvbi4KKyNpZiBfX2hhc19hdHRyaWJ1dGUobm9fc2FuaXRpemUpCisjZGVmaW5lIExMVk1fTk9fU0FOSVRJWkUoS0lORCkgX19hdHRyaWJ1dGVfXygobm9fc2FuaXRpemUoS0lORCkpKQorI2Vsc2UKKyNkZWZpbmUgTExWTV9OT19TQU5JVElaRShLSU5EKQorI2VuZGlmCisKKy8vLyBcYnJpZWYgTWFyayBkZWJ1ZyBoZWxwZXIgZnVuY3Rpb24gZGVmaW5pdGlvbnMgbGlrZSBkdW1wKCkgdGhhdCBzaG91bGQgbm90IGJlCisvLy8gc3RyaXBwZWQgZnJvbSBkZWJ1ZyBidWlsZHMuCisvLy8gTm90ZSB0aGF0IHlvdSBzaG91bGQgYWxzbyBzdXJyb3VuZCBkdW1wKCkgZnVuY3Rpb25zIHdpdGgKKy8vLyBgI2lmICFkZWZpbmVkKE5ERUJVRykgfHwgZGVmaW5lZChMTFZNX0VOQUJMRV9EVU1QKWAgc28gdGhleSBkbyBhbHdheXMKKy8vLyBnZXQgc3RyaXBwZWQgaW4gcmVsZWFzZSBidWlsZHMuCisvLyBGSVhNRTogTW92ZSB0aGlzIHRvIGEgcHJpdmF0ZSBjb25maWcuaCBhcyBpdCdzIG5vdCB1c2FibGUgaW4gcHVibGljIGhlYWRlcnMuCisjaWYgIWRlZmluZWQoTkRFQlVHKSB8fCBkZWZpbmVkKExMVk1fRU5BQkxFX0RVTVApCisjZGVmaW5lIExMVk1fRFVNUF9NRVRIT0QgTExWTV9BVFRSSUJVVEVfTk9JTkxJTkUgTExWTV9BVFRSSUJVVEVfVVNFRAorI2Vsc2UKKyNkZWZpbmUgTExWTV9EVU1QX01FVEhPRCBMTFZNX0FUVFJJQlVURV9OT0lOTElORQorI2VuZGlmCisKKy8vLyBcbWFjcm8gTExWTV9QUkVUVFlfRlVOQ1RJT04KKy8vLyBcYnJpZWYgR2V0cyBhIHVzZXItZnJpZW5kbHkgbG9va2luZyBmdW5jdGlvbiBzaWduYXR1cmUgZm9yIHRoZSBjdXJyZW50IHNjb3BlCisvLy8gdXNpbmcgdGhlIGJlc3QgYXZhaWxhYmxlIG1ldGhvZCBvbiBlYWNoIHBsYXRmb3JtLiAgVGhlIGV4YWN0IGZvcm1hdCBvZiB0aGUKKy8vLyByZXN1bHRpbmcgc3RyaW5nIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljIGFuZCBub24tcG9ydGFibGUsIHNvIHRoaXMgc2hvdWxkCisvLy8gb25seSBiZSB1c2VkLCBmb3IgZXhhbXBsZSwgZm9yIGxvZ2dpbmcgb3IgZGlhZ25vc3RpY3MuCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgTExWTV9QUkVUVFlfRlVOQ1RJT04gX19GVU5DU0lHX18KKyNlbGlmIGRlZmluZWQoX19HTlVDX18pIHx8IGRlZmluZWQoX19jbGFuZ19fKQorI2RlZmluZSBMTFZNX1BSRVRUWV9GVU5DVElPTiBfX1BSRVRUWV9GVU5DVElPTl9fCisjZWxzZQorI2RlZmluZSBMTFZNX1BSRVRUWV9GVU5DVElPTiBfX2Z1bmNfXworI2VuZGlmCisKKy8vLyBcbWFjcm8gTExWTV9USFJFQURfTE9DQUwKKy8vLyBcYnJpZWYgQSB0aHJlYWQtbG9jYWwgc3RvcmFnZSBzcGVjaWZpZXIgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBnbG9iYWxzLAorLy8vIGV4dGVybiBnbG9iYWxzLCBhbmQgc3RhdGljIGdsb2JhbHMuCisvLy8KKy8vLyBUaGlzIGlzIGVzc2VudGlhbGx5IGFuIGV4dHJlbWVseSByZXN0cmljdGVkIGFuYWxvZyB0byBDKysxMSdzIHRocmVhZF9sb2NhbAorLy8vIHN1cHBvcnQsIGFuZCB1c2VzIHRoYXQgd2hlbiBhdmFpbGFibGUuIEhvd2V2ZXIsIGl0IGZhbGxzIGJhY2sgb24KKy8vLyBwbGF0Zm9ybS1zcGVjaWZpYyBvciB2ZW5kb3ItcHJvdmlkZWQgZXh0ZW5zaW9ucyB3aGVuIG5lY2Vzc2FyeS4gVGhlc2UKKy8vLyBleHRlbnNpb25zIGRvbid0IHN1cHBvcnQgbWFueSBvZiB0aGUgQysrMTEgdGhyZWFkX2xvY2FsJ3MgZmVhdHVyZXMuIFlvdQorLy8vIHNob3VsZCBvbmx5IHVzZSB0aGlzIGZvciBQT0RzIHRoYXQgeW91IGNhbiBzdGF0aWNhbGx5IGluaXRpYWxpemUgdG8KKy8vLyBzb21lIGNvbnN0YW50IHZhbHVlLiBJbiBhbG1vc3QgYWxsIGNpcmN1bXN0YW5jZXMgdGhpcyBpcyBtb3N0IGFwcHJvcHJpYXRlCisvLy8gZm9yIHVzZSB3aXRoIGEgcG9pbnRlciwgaW50ZWdlciwgb3Igc21hbGwgYWdncmVnYXRpb24gb2YgcG9pbnRlcnMgYW5kCisvLy8gaW50ZWdlcnMuCisjaWYgTExWTV9FTkFCTEVfVEhSRUFEUworI2lmIF9faGFzX2ZlYXR1cmUoY3h4X3RocmVhZF9sb2NhbCkKKyNkZWZpbmUgTExWTV9USFJFQURfTE9DQUwgdGhyZWFkX2xvY2FsCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorLy8gTVNWQyBzdXBwb3J0cyB0aGlzIHdpdGggYSBfX2RlY2xzcGVjLgorI2RlZmluZSBMTFZNX1RIUkVBRF9MT0NBTCBfX2RlY2xzcGVjKHRocmVhZCkKKyNlbHNlCisvLyBDbGFuZywgR0NDLCBhbmQgb3RoZXIgY29tcGF0aWJsZSBjb21waWxlcnMgdXNlZCBfX3RocmVhZCBwcmlvciB0byBDKysxMSBhbmQKKy8vIHdlIG9ubHkgbmVlZCB0aGUgcmVzdHJpY3RlZCBmdW5jdGlvbmFsaXR5IHRoYXQgcHJvdmlkZXMuCisjZGVmaW5lIExMVk1fVEhSRUFEX0xPQ0FMIF9fdGhyZWFkCisjZW5kaWYKKyNlbHNlIC8vICFMTFZNX0VOQUJMRV9USFJFQURTCisvLyBJZiB0aHJlYWRpbmcgaXMgZGlzYWJsZWQgZW50aXJlbHksIHRoaXMgY29tcGlsZXMgdG8gbm90aGluZyBhbmQgeW91IGdldAorLy8gYSBub3JtYWwgZ2xvYmFsIHZhcmlhYmxlLgorI2RlZmluZSBMTFZNX1RIUkVBRF9MT0NBTAorI2VuZGlmCisKKy8vLyBcbWFjcm8gTExWTV9FTkFCTEVfRVhDRVBUSU9OUworLy8vIFxicmllZiBXaGV0aGVyIExMVk0gaXMgYnVpbHQgd2l0aCBleGNlcHRpb24gc3VwcG9ydC4KKyNpZiBfX2hhc19mZWF0dXJlKGN4eF9leGNlcHRpb25zKQorI2RlZmluZSBMTFZNX0VOQUJMRV9FWENFUFRJT05TIDEKKyNlbGlmIGRlZmluZWQoX19HTlVDX18pICYmIGRlZmluZWQoX19FWENFUFRJT05TKQorI2RlZmluZSBMTFZNX0VOQUJMRV9FWENFUFRJT05TIDEKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX0NQUFVOV0lORCkKKyNkZWZpbmUgTExWTV9FTkFCTEVfRVhDRVBUSU9OUyAxCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlbWFuZ2xlL0RlbWFuZ2xlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0RlbWFuZ2xlL0RlbWFuZ2xlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJlYjU2YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRGVtYW5nbGUvRGVtYW5nbGUuaApAQCAtMCwwICsxLDI4IEBACisvLz09PS0tLSBEZW1hbmdsZS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKworbmFtZXNwYWNlIGxsdm0geworLy8vIFRoaXMgaXMgYSBsbHZtIGxvY2FsIHZlcnNpb24gb2YgX19jeGFfZGVtYW5nbGUuIE90aGVyIHRoYW4gdGhlIG5hbWUgYW5kCisvLy8gYmVpbmcgaW4gdGhlIGxsdm0gbmFtZXNwYWNlIGl0IGlzIGlkZW50aWNhbC4KKy8vLworLy8vIFRoZSBtYW5nbGVkX25hbWUgaXMgZGVtYW5nbGVkIGludG8gYnVmIGFuZCByZXR1cm5lZC4gSWYgdGhlIGJ1ZmZlciBpcyBub3QKKy8vLyBsYXJnZSBlbm91Z2gsIHJlYWxsb2MgaXMgdXNlZCB0byBleHBhbmQgaXQuCisvLy8KKy8vLyBUaGUgKnN0YXR1cyB3aWxsIGJlIHNldCB0bworLy8vICAgdW5rbm93bl9lcnJvcjogLTQKKy8vLyAgIGludmFsaWRfYXJnczogIC0zCisvLy8gICBpbnZhbGlkX21hbmdsZWRfbmFtZTogLTIKKy8vLyAgIG1lbW9yeV9hbGxvY19mYWlsdXJlOiAtMQorLy8vICAgc3VjY2VzczogMAorCitjaGFyICppdGFuaXVtRGVtYW5nbGUoY29uc3QgY2hhciAqbWFuZ2xlZF9uYW1lLCBjaGFyICpidWYsIHNpemVfdCAqbiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgKnN0YXR1cyk7Cit9CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9FeGVjdXRpb25FbmdpbmUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL0V4ZWN1dGlvbkVuZ2luZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MzI2ODgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9FeGVjdXRpb25FbmdpbmUuaApAQCAtMCwwICsxLDY2NyBAQAorLy89PT0tIEV4ZWN1dGlvbkVuZ2luZS5oIC0gQWJzdHJhY3QgRXhlY3V0aW9uIEVuZ2luZSBJbnRlcmZhY2UgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgYWJzdHJhY3QgaW50ZXJmYWNlIHRoYXQgaW1wbGVtZW50cyBleGVjdXRpb24gc3VwcG9ydAorLy8gZm9yIExMVk0uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9FWEVDVVRJT05FTkdJTkVfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9FWEVDVVRJT05FTkdJTkVfSAorCisjaW5jbHVkZSAibGx2bS1jL0V4ZWN1dGlvbkVuZ2luZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0pJVFN5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGF0YUxheW91dC5oIgorI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvQmluYXJ5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NCaW5kaW5nV3JhcHBpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29kZUdlbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L011dGV4LmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBDb25zdGFudDsKK2NsYXNzIEZ1bmN0aW9uOworc3RydWN0IEdlbmVyaWNWYWx1ZTsKK2NsYXNzIEdsb2JhbFZhbHVlOworY2xhc3MgR2xvYmFsVmFyaWFibGU7CitjbGFzcyBKSVRFdmVudExpc3RlbmVyOworY2xhc3MgTUNKSVRNZW1vcnlNYW5hZ2VyOworY2xhc3MgT2JqZWN0Q2FjaGU7CitjbGFzcyBSVER5bGRNZW1vcnlNYW5hZ2VyOworY2xhc3MgVHJpcGxlOworY2xhc3MgVHlwZTsKKworbmFtZXNwYWNlIG9iamVjdCB7CisKK2NsYXNzIEFyY2hpdmU7CitjbGFzcyBPYmplY3RGaWxlOworCit9IC8vIGVuZCBuYW1lc3BhY2Ugb2JqZWN0CisKKy8vLyBcYnJpZWYgSGVscGVyIGNsYXNzIGZvciBoZWxwaW5nIHN5bmNocm9uaXplIGFjY2VzcyB0byB0aGUgZ2xvYmFsIGFkZHJlc3MgbWFwCisvLy8gdGFibGUuICBBY2Nlc3MgdG8gdGhpcyBjbGFzcyBzaG91bGQgYmUgc2VyaWFsaXplZCB1bmRlciBhIG11dGV4LgorY2xhc3MgRXhlY3V0aW9uRW5naW5lU3RhdGUgeworcHVibGljOgorICB1c2luZyBHbG9iYWxBZGRyZXNzTWFwVHkgPSBTdHJpbmdNYXA8dWludDY0X3Q+OworCitwcml2YXRlOgorICAvLy8gR2xvYmFsQWRkcmVzc01hcCAtIEEgbWFwcGluZyBiZXR3ZWVuIExMVk0gZ2xvYmFsIHN5bWJvbCBuYW1lcyB2YWx1ZXMgYW5kCisgIC8vLyB0aGVpciBhY3R1YWxpemVkIHZlcnNpb24uLi4KKyAgR2xvYmFsQWRkcmVzc01hcFR5IEdsb2JhbEFkZHJlc3NNYXA7CisKKyAgLy8vIEdsb2JhbEFkZHJlc3NSZXZlcnNlTWFwIC0gVGhpcyBpcyB0aGUgcmV2ZXJzZSBtYXBwaW5nIG9mIEdsb2JhbEFkZHJlc3NNYXAsCisgIC8vLyB1c2VkIHRvIGNvbnZlcnQgcmF3IGFkZHJlc3NlcyBpbnRvIHRoZSBMTFZNIGdsb2JhbCB2YWx1ZSB0aGF0IGlzIGVtaXR0ZWQKKyAgLy8vIGF0IHRoZSBhZGRyZXNzLiAgVGhpcyBtYXAgaXMgbm90IGNvbXB1dGVkIHVubGVzcyBnZXRHbG9iYWxWYWx1ZUF0QWRkcmVzcworICAvLy8gaXMgY2FsbGVkIGF0IHNvbWUgcG9pbnQuCisgIHN0ZDo6bWFwPHVpbnQ2NF90LCBzdGQ6OnN0cmluZz4gR2xvYmFsQWRkcmVzc1JldmVyc2VNYXA7CisKK3B1YmxpYzoKKyAgR2xvYmFsQWRkcmVzc01hcFR5ICZnZXRHbG9iYWxBZGRyZXNzTWFwKCkgeworICAgIHJldHVybiBHbG9iYWxBZGRyZXNzTWFwOworICB9CisKKyAgc3RkOjptYXA8dWludDY0X3QsIHN0ZDo6c3RyaW5nPiAmZ2V0R2xvYmFsQWRkcmVzc1JldmVyc2VNYXAoKSB7CisgICAgcmV0dXJuIEdsb2JhbEFkZHJlc3NSZXZlcnNlTWFwOworICB9CisKKyAgLy8vIFxicmllZiBFcmFzZSBhbiBlbnRyeSBmcm9tIHRoZSBtYXBwaW5nIHRhYmxlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIFRoZSBhZGRyZXNzIHRoYXQgXHAgVG9Vbm1hcCB3YXMgaGFwcGVkIHRvLgorICB1aW50NjRfdCBSZW1vdmVNYXBwaW5nKFN0cmluZ1JlZiBOYW1lKTsKK307CisKK3VzaW5nIEZ1bmN0aW9uQ3JlYXRvciA9IHN0ZDo6ZnVuY3Rpb248dm9pZCAqKGNvbnN0IHN0ZDo6c3RyaW5nICYpPjsKKworLy8vIFxicmllZiBBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIGltcGxlbWVudGF0aW9uIGV4ZWN1dGlvbiBvZiBMTFZNIG1vZHVsZXMsCisvLy8gZGVzaWduZWQgdG8gc3VwcG9ydCBib3RoIGludGVycHJldGVyIGFuZCBqdXN0LWluLXRpbWUgKEpJVCkgY29tcGlsZXIKKy8vLyBpbXBsZW1lbnRhdGlvbnMuCitjbGFzcyBFeGVjdXRpb25FbmdpbmUgeworICAvLy8gVGhlIHN0YXRlIG9iamVjdCBob2xkaW5nIHRoZSBnbG9iYWwgYWRkcmVzcyBtYXBwaW5nLCB3aGljaCBtdXN0IGJlCisgIC8vLyBhY2Nlc3NlZCBzeW5jaHJvbm91c2x5LgorICAvLworICAvLyBGSVhNRTogVGhlcmUgaXMgbm8gcGFydGljdWxhciBuZWVkIHRoZSBlbnRpcmUgbWFwIG5lZWRzIHRvIGJlCisgIC8vIHN5bmNocm9uaXplZC4gIFdvdWxkbid0IGEgcmVhZGVyLXdyaXRlciBkZXNpZ24gYmUgYmV0dGVyIGhlcmU/CisgIEV4ZWN1dGlvbkVuZ2luZVN0YXRlIEVFU3RhdGU7CisKKyAgLy8vIFRoZSB0YXJnZXQgZGF0YSBmb3IgdGhlIHBsYXRmb3JtIGZvciB3aGljaCBleGVjdXRpb24gaXMgYmVpbmcgcGVyZm9ybWVkLgorICAvLy8KKyAgLy8vIE5vdGU6IHRoZSBEYXRhTGF5b3V0IGlzIExMVk1Db250ZXh0IHNwZWNpZmljIGJlY2F1c2UgaXQgaGFzIGFuCisgIC8vLyBpbnRlcm5hbCBjYWNoZSBiYXNlZCBvbiB0eXBlIHBvaW50ZXJzLiBJdCBtYWtlcyB1bnNhZmUgdG8gcmV1c2UgdGhlCisgIC8vLyBFeGVjdXRpb25FbmdpbmUgYWNyb3NzIGNvbnRleHQsIHdlIGRvbid0IGVuZm9yY2UgdGhpcyBydWxlIGJ1dCB1bmRlZmluZWQKKyAgLy8vIGJlaGF2aW9yIGNhbiBvY2N1cnMgaWYgdGhlIHVzZXIgdHJpZXMgdG8gZG8gaXQuCisgIGNvbnN0IERhdGFMYXlvdXQgREw7CisKKyAgLy8vIFdoZXRoZXIgbGF6eSBKSVQgY29tcGlsYXRpb24gaXMgZW5hYmxlZC4KKyAgYm9vbCBDb21waWxpbmdMYXppbHk7CisKKyAgLy8vIFdoZXRoZXIgSklUIGNvbXBpbGF0aW9uIG9mIGV4dGVybmFsIGdsb2JhbCB2YXJpYWJsZXMgaXMgYWxsb3dlZC4KKyAgYm9vbCBHVkNvbXBpbGF0aW9uRGlzYWJsZWQ7CisKKyAgLy8vIFdoZXRoZXIgdGhlIEpJVCBzaG91bGQgcGVyZm9ybSBsb29rdXBzIG9mIGV4dGVybmFsIHN5bWJvbHMgKGUuZy4sCisgIC8vLyB1c2luZyBkbHN5bSkuCisgIGJvb2wgU3ltYm9sU2VhcmNoaW5nRGlzYWJsZWQ7CisKKyAgLy8vIFdoZXRoZXIgdGhlIEpJVCBzaG91bGQgdmVyaWZ5IElSIG1vZHVsZXMgZHVyaW5nIGNvbXBpbGF0aW9uLgorICBib29sIFZlcmlmeU1vZHVsZXM7CisKKyAgZnJpZW5kIGNsYXNzIEVuZ2luZUJ1aWxkZXI7ICAvLyBUbyBhbGxvdyBhY2Nlc3MgdG8gSklUQ3RvciBhbmQgSW50ZXJwQ3Rvci4KKworcHJvdGVjdGVkOgorICAvLy8gVGhlIGxpc3Qgb2YgTW9kdWxlcyB0aGF0IHdlIGFyZSBKSVQnaW5nIGZyb20uICBXZSB1c2UgYSBTbWFsbFZlY3RvciB0bworICAvLy8gb3B0aW1pemUgZm9yIHRoZSBjYXNlIHdoZXJlIHRoZXJlIGlzIG9ubHkgb25lIG1vZHVsZS4KKyAgU21hbGxWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4sIDE+IE1vZHVsZXM7CisKKyAgLy8vIGdldE1lbW9yeWZvckdWIC0gQWxsb2NhdGUgbWVtb3J5IGZvciBhIGdsb2JhbCB2YXJpYWJsZS4KKyAgdmlydHVhbCBjaGFyICpnZXRNZW1vcnlGb3JHVihjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YpOworCisgIHN0YXRpYyBFeGVjdXRpb25FbmdpbmUgKigqTUNKSVRDdG9yKSgKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IE0sIHN0ZDo6c3RyaW5nICpFcnJvclN0ciwKKyAgICAgIHN0ZDo6c2hhcmVkX3B0cjxNQ0pJVE1lbW9yeU1hbmFnZXI+IE1NLAorICAgICAgc3RkOjpzaGFyZWRfcHRyPExlZ2FjeUpJVFN5bWJvbFJlc29sdmVyPiBTUiwKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUYXJnZXRNYWNoaW5lPiBUTSk7CisKKyAgc3RhdGljIEV4ZWN1dGlvbkVuZ2luZSAqKCpPcmNNQ0pJVFJlcGxhY2VtZW50Q3RvcikoCisgICAgICBzdGQ6OnN0cmluZyAqRXJyb3JTdHIsIHN0ZDo6c2hhcmVkX3B0cjxNQ0pJVE1lbW9yeU1hbmFnZXI+IE1NLAorICAgICAgc3RkOjpzaGFyZWRfcHRyPExlZ2FjeUpJVFN5bWJvbFJlc29sdmVyPiBTUiwKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxUYXJnZXRNYWNoaW5lPiBUTSk7CisKKyAgc3RhdGljIEV4ZWN1dGlvbkVuZ2luZSAqKCpJbnRlcnBDdG9yKShzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpFcnJvclN0cik7CisKKyAgLy8vIExhenlGdW5jdGlvbkNyZWF0b3IgLSBJZiBhbiB1bmtub3duIGZ1bmN0aW9uIGlzIG5lZWRlZCwgdGhpcyBmdW5jdGlvbgorICAvLy8gcG9pbnRlciBpcyBpbnZva2VkIHRvIGNyZWF0ZSBpdC4gIElmIHRoaXMgcmV0dXJucyBudWxsLCB0aGUgSklUIHdpbGwKKyAgLy8vIGFib3J0LgorICBGdW5jdGlvbkNyZWF0b3IgTGF6eUZ1bmN0aW9uQ3JlYXRvcjsKKworICAvLy8gZ2V0TWFuZ2xlZE5hbWUgLSBHZXQgbWFuZ2xlZCBuYW1lLgorICBzdGQ6OnN0cmluZyBnZXRNYW5nbGVkTmFtZShjb25zdCBHbG9iYWxWYWx1ZSAqR1YpOworCitwdWJsaWM6CisgIC8vLyBsb2NrIC0gVGhpcyBsb2NrIHByb3RlY3RzIHRoZSBFeGVjdXRpb25FbmdpbmUgYW5kIE1DSklUIGNsYXNzZXMuIEl0IG11c3QKKyAgLy8vIGJlIGhlbGQgd2hpbGUgY2hhbmdpbmcgdGhlIGludGVybmFsIHN0YXRlIG9mIGFueSBvZiB0aG9zZSBjbGFzc2VzLgorICBzeXM6Ok11dGV4IGxvY2s7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vICBFeGVjdXRpb25FbmdpbmUgU3RhcnR1cAorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICB2aXJ0dWFsIH5FeGVjdXRpb25FbmdpbmUoKTsKKworICAvLy8gQWRkIGEgTW9kdWxlIHRvIHRoZSBsaXN0IG9mIG1vZHVsZXMgdGhhdCB3ZSBjYW4gSklUIGZyb20uCisgIHZpcnR1YWwgdm9pZCBhZGRNb2R1bGUoc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gTSkgeworICAgIE1vZHVsZXMucHVzaF9iYWNrKHN0ZDo6bW92ZShNKSk7CisgIH0KKworICAvLy8gYWRkT2JqZWN0RmlsZSAtIEFkZCBhbiBPYmplY3RGaWxlIHRvIHRoZSBleGVjdXRpb24gZW5naW5lLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IE1DSklULiAgTUNKSVQgd2lsbCBpbW1lZGlhdGVseSBsb2FkIHRoZQorICAvLy8gb2JqZWN0IGludG8gbWVtb3J5IGFuZCBhZGRzIGl0cyBzeW1ib2xzIHRvIHRoZSBsaXN0IHVzZWQgdG8gcmVzb2x2ZQorICAvLy8gZXh0ZXJuYWwgc3ltYm9scyB3aGlsZSBwcmVwYXJpbmcgb3RoZXIgb2JqZWN0cyBmb3IgZXhlY3V0aW9uLgorICAvLy8KKyAgLy8vIE9iamVjdHMgYWRkZWQgdXNpbmcgdGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBiZSBtYWRlIGV4ZWN1dGFibGUgdW50aWwKKyAgLy8vIG5lZWRlZCBieSBhbm90aGVyIG9iamVjdC4KKyAgLy8vCisgIC8vLyBNQ0pJVCB3aWxsIHRha2Ugb3duZXJzaGlwIG9mIHRoZSBPYmplY3RGaWxlLgorICB2aXJ0dWFsIHZvaWQgYWRkT2JqZWN0RmlsZShzdGQ6OnVuaXF1ZV9wdHI8b2JqZWN0OjpPYmplY3RGaWxlPiBPKTsKKyAgdmlydHVhbCB2b2lkIGFkZE9iamVjdEZpbGUob2JqZWN0OjpPd25pbmdCaW5hcnk8b2JqZWN0OjpPYmplY3RGaWxlPiBPKTsKKworICAvLy8gYWRkQXJjaGl2ZSAtIEFkZCBhbiBBcmNoaXZlIHRvIHRoZSBleGVjdXRpb24gZW5naW5lLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IE1DSklULiAgTUNKSVQgd2lsbCB1c2UgdGhlIGFyY2hpdmUgdG8KKyAgLy8vIHJlc29sdmUgZXh0ZXJuYWwgc3ltYm9scyBpbiBvYmplY3RzIGl0IGlzIGxvYWRpbmcuICBJZiBhIHN5bWJvbCBpcyBmb3VuZAorICAvLy8gaW4gdGhlIEFyY2hpdmUgdGhlIGNvbnRhaW5lZCBvYmplY3QgZmlsZSB3aWxsIGJlIGV4dHJhY3RlZCAoaW4gbWVtb3J5KQorICAvLy8gYW5kIGxvYWRlZCBmb3IgcG9zc2libGUgZXhlY3V0aW9uLgorICB2aXJ0dWFsIHZvaWQgYWRkQXJjaGl2ZShvYmplY3Q6Ok93bmluZ0JpbmFyeTxvYmplY3Q6OkFyY2hpdmU+IEEpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIGNvbnN0IERhdGFMYXlvdXQgJmdldERhdGFMYXlvdXQoKSBjb25zdCB7IHJldHVybiBETDsgfQorCisgIC8vLyByZW1vdmVNb2R1bGUgLSBSZW1vdmVzIGEgTW9kdWxlIGZyb20gdGhlIGxpc3Qgb2YgbW9kdWxlcywgYnV0IGRvZXMgbm90CisgIC8vLyBmcmVlIHRoZSBtb2R1bGUncyBtZW1vcnkuIFJldHVybnMgdHJ1ZSBpZiBNIGlzIGZvdW5kLCBpbiB3aGljaCBjYXNlIHRoZQorICAvLy8gY2FsbGVyIGFzc3VtZXMgcmVzcG9uc2liaWxpdHkgZm9yIGRlbGV0aW5nIHRoZSBtb2R1bGUuCisgIC8vCisgIC8vIEZJWE1FOiBUaGlzIHN0ZWFsdGggb3duZXJzaGlwIHRyYW5zZmVyIGlzIGhvcnJpYmxlLiBUaGlzIHdpbGwgcHJvYmFibHkgYmUKKyAgLy8gICAgICAgIGZpeGVkIGJ5IGRlbGV0aW5nIEV4ZWN1dGlvbkVuZ2luZS4KKyAgdmlydHVhbCBib29sIHJlbW92ZU1vZHVsZShNb2R1bGUgKk0pOworCisgIC8vLyBGaW5kRnVuY3Rpb25OYW1lZCAtIFNlYXJjaCBhbGwgb2YgdGhlIGFjdGl2ZSBtb2R1bGVzIHRvIGZpbmQgdGhlIGZ1bmN0aW9uIHRoYXQKKyAgLy8vIGRlZmluZXMgRm5OYW1lLiAgVGhpcyBpcyB2ZXJ5IHNsb3cgb3BlcmF0aW9uIGFuZCBzaG91bGRuJ3QgYmUgdXNlZCBmb3IKKyAgLy8vIGdlbmVyYWwgY29kZS4KKyAgdmlydHVhbCBGdW5jdGlvbiAqRmluZEZ1bmN0aW9uTmFtZWQoU3RyaW5nUmVmIEZuTmFtZSk7CisKKyAgLy8vIEZpbmRHbG9iYWxWYXJpYWJsZU5hbWVkIC0gU2VhcmNoIGFsbCBvZiB0aGUgYWN0aXZlIG1vZHVsZXMgdG8gZmluZCB0aGUgZ2xvYmFsIHZhcmlhYmxlCisgIC8vLyB0aGF0IGRlZmluZXMgTmFtZS4gIFRoaXMgaXMgdmVyeSBzbG93IG9wZXJhdGlvbiBhbmQgc2hvdWxkbid0IGJlIHVzZWQgZm9yCisgIC8vLyBnZW5lcmFsIGNvZGUuCisgIHZpcnR1YWwgR2xvYmFsVmFyaWFibGUgKkZpbmRHbG9iYWxWYXJpYWJsZU5hbWVkKFN0cmluZ1JlZiBOYW1lLCBib29sIEFsbG93SW50ZXJuYWwgPSBmYWxzZSk7CisKKyAgLy8vIHJ1bkZ1bmN0aW9uIC0gRXhlY3V0ZSB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudHMsCisgIC8vLyBhbmQgcmV0dXJuIHRoZSByZXN1bHQuCisgIC8vLworICAvLy8gRm9yIE1DSklUIGV4ZWN1dGlvbiBlbmdpbmVzLCBjbGllbnRzIGFyZSBlbmNvdXJhZ2VkIHRvIHVzZSB0aGUKKyAgLy8vICJHZXRGdW5jdGlvbkFkZHJlc3MiIG1ldGhvZCAocmF0aGVyIHRoYW4gcnVuRnVuY3Rpb24pIGFuZCBjYXN0IHRoZQorICAvLy8gcmV0dXJuZWQgdWludDY0X3QgdG8gdGhlIGRlc2lyZWQgZnVuY3Rpb24gcG9pbnRlciB0eXBlLiBIb3dldmVyLCBmb3IKKyAgLy8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IE1DSklUJ3MgaW1wbGVtZW50YXRpb24gY2FuIGV4ZWN1dGUgJ21haW4tbGlrZScKKyAgLy8vIGZ1bmN0aW9uIChpLmUuIHRob3NlIHJldHVybmluZyB2b2lkIG9yIGludCwgYW5kIHRha2luZyBlaXRoZXIgbm8KKyAgLy8vIGFyZ3VtZW50cyBvciAoaW50LCBjaGFyKltdKSkuCisgIHZpcnR1YWwgR2VuZXJpY1ZhbHVlIHJ1bkZ1bmN0aW9uKEZ1bmN0aW9uICpGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxHZW5lcmljVmFsdWU+IEFyZ1ZhbHVlcykgPSAwOworCisgIC8vLyBnZXRQb2ludGVyVG9OYW1lZEZ1bmN0aW9uIC0gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUKKyAgLy8vIHNwZWNpZmllZCBmdW5jdGlvbiBieSB1c2luZyB0aGUgZGxzeW0gZnVuY3Rpb24gY2FsbC4gIEFzIHN1Y2ggaXQgaXMgb25seQorICAvLy8gdXNlZnVsIGZvciByZXNvbHZpbmcgbGlicmFyeSBzeW1ib2xzLCBub3QgY29kZSBnZW5lcmF0ZWQgc3ltYm9scy4KKyAgLy8vCisgIC8vLyBJZiBBYm9ydE9uRmFpbHVyZSBpcyBmYWxzZSBhbmQgbm8gZnVuY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSBpcworICAvLy8gZm91bmQsIHRoaXMgZnVuY3Rpb24gc2lsZW50bHkgcmV0dXJucyBhIG51bGwgcG9pbnRlci4gT3RoZXJ3aXNlLAorICAvLy8gaXQgcHJpbnRzIGEgbWVzc2FnZSB0byBzdGRlcnIgYW5kIGFib3J0cy4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIGRlcHJlY2F0ZWQgZm9yIHRoZSBNQ0pJVCBleGVjdXRpb24gZW5naW5lLgorICB2aXJ0dWFsIHZvaWQgKmdldFBvaW50ZXJUb05hbWVkRnVuY3Rpb24oU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFib3J0T25GYWlsdXJlID0gdHJ1ZSkgPSAwOworCisgIC8vLyBtYXBTZWN0aW9uQWRkcmVzcyAtIG1hcCBhIHNlY3Rpb24gdG8gaXRzIHRhcmdldCBhZGRyZXNzIHNwYWNlIHZhbHVlLgorICAvLy8gTWFwIHRoZSBhZGRyZXNzIG9mIGEgSklUIHNlY3Rpb24gYXMgcmV0dXJuZWQgZnJvbSB0aGUgbWVtb3J5IG1hbmFnZXIKKyAgLy8vIHRvIHRoZSBhZGRyZXNzIGluIHRoZSB0YXJnZXQgcHJvY2VzcyBhcyB0aGUgcnVubmluZyBjb2RlIHdpbGwgc2VlIGl0LgorICAvLy8gVGhpcyBpcyB0aGUgYWRkcmVzcyB3aGljaCB3aWxsIGJlIHVzZWQgZm9yIHJlbG9jYXRpb24gcmVzb2x1dGlvbi4KKyAgdmlydHVhbCB2b2lkIG1hcFNlY3Rpb25BZGRyZXNzKGNvbnN0IHZvaWQgKkxvY2FsQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFRhcmdldEFkZHJlc3MpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJSZS1tYXBwaW5nIG9mIHNlY3Rpb24gYWRkcmVzc2VzIG5vdCBzdXBwb3J0ZWQgd2l0aCB0aGlzICIKKyAgICAgICAgICAgICAgICAgICAgICJFRSEiKTsKKyAgfQorCisgIC8vLyBnZW5lcmF0ZUNvZGVGb3JNb2R1bGUgLSBSdW4gY29kZSBnZW5lcmF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIG1vZHVsZSBhbmQKKyAgLy8vIGxvYWQgaXQgaW50byBtZW1vcnkuCisgIC8vLworICAvLy8gV2hlbiB0aGlzIGZ1bmN0aW9uIGhhcyBjb21wbGV0ZWQsIGFsbCBjb2RlIGFuZCBkYXRhIGZvciB0aGUgc3BlY2lmaWVkCisgIC8vLyBtb2R1bGUsIGFuZCBhbnkgbW9kdWxlIG9uIHdoaWNoIHRoaXMgbW9kdWxlIGRlcGVuZHMsIHdpbGwgYmUgZ2VuZXJhdGVkCisgIC8vLyBhbmQgbG9hZGVkIGludG8gbWVtb3J5LCBidXQgcmVsb2NhdGlvbnMgd2lsbCBub3QgeWV0IGhhdmUgYmVlbiBhcHBsaWVkCisgIC8vLyBhbmQgYWxsIG1lbW9yeSB3aWxsIGJlIHJlYWRhYmxlIGFuZCB3cml0YWJsZSBidXQgbm90IGV4ZWN1dGFibGUuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBpcyBwcmltYXJpbHkgdXNlZnVsIHdoZW4gZ2VuZXJhdGluZyBjb2RlIGZvciBhbiBleHRlcm5hbAorICAvLy8gdGFyZ2V0LCBhbGxvd2luZyB0aGUgY2xpZW50IGFuIG9wcG9ydHVuaXR5IHRvIHJlbWFwIHNlY3Rpb24gYWRkcmVzc2VzCisgIC8vLyBiZWZvcmUgcmVsb2NhdGlvbnMgYXJlIGFwcGxpZWQuICBDbGllbnRzIHRoYXQgaW50ZW5kIHRvIGV4ZWN1dGUgY29kZQorICAvLy8gbG9jYWxseSBjYW4gdXNlIHRoZSBnZXRGdW5jdGlvbkFkZHJlc3MgY2FsbCwgd2hpY2ggd2lsbCBnZW5lcmF0ZSBjb2RlCisgIC8vLyBhbmQgYXBwbHkgZmluYWwgcHJlcGFyYXRpb25zIGFsbCBpbiBvbmUgc3RlcC4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBoYXMgbm8gZWZmZWN0IGZvciB0aGUgaW50ZXJwZXRlci4KKyAgdmlydHVhbCB2b2lkIGdlbmVyYXRlQ29kZUZvck1vZHVsZShNb2R1bGUgKk0pIHt9CisKKyAgLy8vIGZpbmFsaXplT2JqZWN0IC0gZW5zdXJlIHRoZSBtb2R1bGUgaXMgZnVsbHkgcHJvY2Vzc2VkIGFuZCBpcyB1c2FibGUuCisgIC8vLworICAvLy8gSXQgaXMgdGhlIHVzZXItbGV2ZWwgZnVuY3Rpb24gZm9yIGNvbXBsZXRpbmcgdGhlIHByb2Nlc3Mgb2YgbWFraW5nIHRoZQorICAvLy8gb2JqZWN0IHVzYWJsZSBmb3IgZXhlY3V0aW9uLiAgSXQgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzZWN0aW9ucyB3aXRoaW4gYW4KKyAgLy8vIG9iamVjdCBoYXZlIGJlZW4gcmVsb2NhdGVkIHVzaW5nIG1hcFNlY3Rpb25BZGRyZXNzLiAgV2hlbiB0aGlzIG1ldGhvZCBpcworICAvLy8gY2FsbGVkIHRoZSBNQ0pJVCBleGVjdXRpb24gZW5naW5lIHdpbGwgcmVhcHBseSByZWxvY2F0aW9ucyBmb3IgYSBsb2FkZWQKKyAgLy8vIG9iamVjdC4gIFRoaXMgbWV0aG9kIGhhcyBubyBlZmZlY3QgZm9yIHRoZSBpbnRlcnBldGVyLgorICB2aXJ0dWFsIHZvaWQgZmluYWxpemVPYmplY3QoKSB7fQorCisgIC8vLyBydW5TdGF0aWNDb25zdHJ1Y3RvcnNEZXN0cnVjdG9ycyAtIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gZXhlY3V0ZSBhbGwgb2YKKyAgLy8vIHRoZSBzdGF0aWMgY29uc3RydWN0b3JzIG9yIGRlc3RydWN0b3JzIGZvciBhIHByb2dyYW0uCisgIC8vLworICAvLy8gXHBhcmFtIGlzRHRvcnMgLSBSdW4gdGhlIGRlc3RydWN0b3JzIGluc3RlYWQgb2YgY29uc3RydWN0b3JzLgorICB2aXJ0dWFsIHZvaWQgcnVuU3RhdGljQ29uc3RydWN0b3JzRGVzdHJ1Y3RvcnMoYm9vbCBpc0R0b3JzKTsKKworICAvLy8gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBleGVjdXRlIGFsbCBvZiB0aGUgc3RhdGljIGNvbnN0cnVjdG9ycyBvcgorICAvLy8gZGVzdHJ1Y3RvcnMgZm9yIGEgcGFydGljdWxhciBtb2R1bGUuCisgIC8vLworICAvLy8gXHBhcmFtIGlzRHRvcnMgLSBSdW4gdGhlIGRlc3RydWN0b3JzIGluc3RlYWQgb2YgY29uc3RydWN0b3JzLgorICB2b2lkIHJ1blN0YXRpY0NvbnN0cnVjdG9yc0Rlc3RydWN0b3JzKE1vZHVsZSAmbW9kdWxlLCBib29sIGlzRHRvcnMpOworCisKKyAgLy8vIHJ1bkZ1bmN0aW9uQXNNYWluIC0gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiB3aGljaCB3cmFwcyBydW5GdW5jdGlvbiB0bworICAvLy8gaGFuZGxlIHRoZSBjb21tb24gdGFzayBvZiBzdGFydGluZyB1cCBtYWluIHdpdGggdGhlIHNwZWNpZmllZCBhcmdjLCBhcmd2LAorICAvLy8gYW5kIGVudnAgcGFyYW1ldGVycy4KKyAgaW50IHJ1bkZ1bmN0aW9uQXNNYWluKEZ1bmN0aW9uICpGbiwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZhcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGNvbnN0ICogZW52cCk7CisKKworICAvLy8gYWRkR2xvYmFsTWFwcGluZyAtIFRlbGwgdGhlIGV4ZWN1dGlvbiBlbmdpbmUgdGhhdCB0aGUgc3BlY2lmaWVkIGdsb2JhbCBpcworICAvLy8gYXQgdGhlIHNwZWNpZmllZCBsb2NhdGlvbi4gIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGFzIGZ1bmN0aW9ucyBhcmUgSklUJ2QKKyAgLy8vIGFuZCBhcyBnbG9iYWwgdmFyaWFibGVzIGFyZSBsYWlkIG91dCBpbiBtZW1vcnkuICBJdCBjYW4gYW5kIHNob3VsZCBhbHNvIGJlCisgIC8vLyB1c2VkIGJ5IGNsaWVudHMgb2YgdGhlIEVFIHRoYXQgd2FudCB0byBoYXZlIGFuIExMVk0gZ2xvYmFsIG92ZXJsYXkKKyAgLy8vIGV4aXN0aW5nIGRhdGEgaW4gbWVtb3J5LiBWYWx1ZXMgdG8gYmUgbWFwcGVkIHNob3VsZCBiZSBuYW1lZCwgYW5kIGhhdmUKKyAgLy8vIGV4dGVybmFsIG9yIHdlYWsgbGlua2FnZS4gTWFwcGluZ3MgYXJlIGF1dG9tYXRpY2FsbHkgcmVtb3ZlZCB3aGVuIHRoZWlyCisgIC8vLyBHbG9iYWxWYWx1ZSBpcyBkZXN0cm95ZWQuCisgIHZvaWQgYWRkR2xvYmFsTWFwcGluZyhjb25zdCBHbG9iYWxWYWx1ZSAqR1YsIHZvaWQgKkFkZHIpOworICB2b2lkIGFkZEdsb2JhbE1hcHBpbmcoU3RyaW5nUmVmIE5hbWUsIHVpbnQ2NF90IEFkZHIpOworCisgIC8vLyBjbGVhckFsbEdsb2JhbE1hcHBpbmdzIC0gQ2xlYXIgYWxsIGdsb2JhbCBtYXBwaW5ncyBhbmQgc3RhcnQgb3ZlciBhZ2FpbiwKKyAgLy8vIGZvciB1c2UgaW4gZHluYW1pYyBjb21waWxhdGlvbiBzY2VuYXJpb3MgdG8gbW92ZSBnbG9iYWxzLgorICB2b2lkIGNsZWFyQWxsR2xvYmFsTWFwcGluZ3MoKTsKKworICAvLy8gY2xlYXJHbG9iYWxNYXBwaW5nc0Zyb21Nb2R1bGUgLSBDbGVhciBhbGwgZ2xvYmFsIG1hcHBpbmdzIHRoYXQgY2FtZSBmcm9tIGEKKyAgLy8vIHBhcnRpY3VsYXIgbW9kdWxlLCBiZWNhdXNlIGl0IGhhcyBiZWVuIHJlbW92ZWQgZnJvbSB0aGUgSklULgorICB2b2lkIGNsZWFyR2xvYmFsTWFwcGluZ3NGcm9tTW9kdWxlKE1vZHVsZSAqTSk7CisKKyAgLy8vIHVwZGF0ZUdsb2JhbE1hcHBpbmcgLSBSZXBsYWNlIGFuIGV4aXN0aW5nIG1hcHBpbmcgZm9yIEdWIHdpdGggYSBuZXcKKyAgLy8vIGFkZHJlc3MuICBUaGlzIHVwZGF0ZXMgYm90aCBtYXBzIGFzIHJlcXVpcmVkLiAgSWYgIkFkZHIiIGlzIG51bGwsIHRoZQorICAvLy8gZW50cnkgZm9yIHRoZSBnbG9iYWwgaXMgcmVtb3ZlZCBmcm9tIHRoZSBtYXBwaW5ncy4gIFRoaXMgcmV0dXJucyB0aGUgb2xkCisgIC8vLyB2YWx1ZSBvZiB0aGUgcG9pbnRlciwgb3IgbnVsbCBpZiBpdCB3YXMgbm90IGluIHRoZSBtYXAuCisgIHVpbnQ2NF90IHVwZGF0ZUdsb2JhbE1hcHBpbmcoY29uc3QgR2xvYmFsVmFsdWUgKkdWLCB2b2lkICpBZGRyKTsKKyAgdWludDY0X3QgdXBkYXRlR2xvYmFsTWFwcGluZyhTdHJpbmdSZWYgTmFtZSwgdWludDY0X3QgQWRkcik7CisKKyAgLy8vIGdldEFkZHJlc3NUb0dsb2JhbElmQXZhaWxhYmxlIC0gVGhpcyByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQKKyAgLy8vIGdsb2JhbCBzeW1ib2wuCisgIHVpbnQ2NF90IGdldEFkZHJlc3NUb0dsb2JhbElmQXZhaWxhYmxlKFN0cmluZ1JlZiBTKTsKKworICAvLy8gZ2V0UG9pbnRlclRvR2xvYmFsSWZBdmFpbGFibGUgLSBUaGlzIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZAorICAvLy8gZ2xvYmFsIHZhbHVlIGlmIGl0IGlzIGhhcyBhbHJlYWR5IGJlZW4gY29kZWdlbidkLCBvdGhlcndpc2UgaXQgcmV0dXJucworICAvLy8gbnVsbC4KKyAgdm9pZCAqZ2V0UG9pbnRlclRvR2xvYmFsSWZBdmFpbGFibGUoU3RyaW5nUmVmIFMpOworICB2b2lkICpnZXRQb2ludGVyVG9HbG9iYWxJZkF2YWlsYWJsZShjb25zdCBHbG9iYWxWYWx1ZSAqR1YpOworCisgIC8vLyBnZXRQb2ludGVyVG9HbG9iYWwgLSBUaGlzIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZCBnbG9iYWwKKyAgLy8vIHZhbHVlLiBUaGlzIG1heSBpbnZvbHZlIGNvZGUgZ2VuZXJhdGlvbiBpZiBpdCdzIGEgZnVuY3Rpb24uCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBpcyBkZXByZWNhdGVkIGZvciB0aGUgTUNKSVQgZXhlY3V0aW9uIGVuZ2luZS4gIFVzZQorICAvLy8gZ2V0R2xvYmFsVmFsdWVBZGRyZXNzIGluc3RlYWQuCisgIHZvaWQgKmdldFBvaW50ZXJUb0dsb2JhbChjb25zdCBHbG9iYWxWYWx1ZSAqR1YpOworCisgIC8vLyBnZXRQb2ludGVyVG9GdW5jdGlvbiAtIFRoZSBkaWZmZXJlbnQgRUUncyByZXByZXNlbnQgZnVuY3Rpb24gYm9kaWVzIGluCisgIC8vLyBkaWZmZXJlbnQgd2F5cy4gIFRoZXkgc2hvdWxkIGVhY2ggaW1wbGVtZW50IHRoaXMgdG8gc2F5IHdoYXQgYSBmdW5jdGlvbgorICAvLy8gcG9pbnRlciBzaG91bGQgbG9vayBsaWtlLiAgV2hlbiBGIGlzIGRlc3Ryb3llZCwgdGhlIEV4ZWN1dGlvbkVuZ2luZSB3aWxsCisgIC8vLyByZW1vdmUgaXRzIGdsb2JhbCBtYXBwaW5nIGFuZCBmcmVlIGFueSBtYWNoaW5lIGNvZGUuICBCZSBzdXJlIG5vIHRocmVhZHMKKyAgLy8vIGFyZSBydW5uaW5nIGluc2lkZSBGIHdoZW4gdGhhdCBoYXBwZW5zLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBmb3IgdGhlIE1DSklUIGV4ZWN1dGlvbiBlbmdpbmUuICBVc2UKKyAgLy8vIGdldEZ1bmN0aW9uQWRkcmVzcyBpbnN0ZWFkLgorICB2aXJ0dWFsIHZvaWQgKmdldFBvaW50ZXJUb0Z1bmN0aW9uKEZ1bmN0aW9uICpGKSA9IDA7CisKKyAgLy8vIGdldFBvaW50ZXJUb0Z1bmN0aW9uT3JTdHViIC0gSWYgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBoYXMgYmVlbgorICAvLy8gY29kZS1nZW4nZCwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24uICBJZiBub3QsIGNvbXBpbGUgaXQsIG9yIHVzZQorICAvLy8gYSBzdHViIHRvIGltcGxlbWVudCBsYXp5IGNvbXBpbGF0aW9uIGlmIGF2YWlsYWJsZS4gIFNlZQorICAvLy8gZ2V0UG9pbnRlclRvRnVuY3Rpb24gZm9yIHRoZSByZXF1aXJlbWVudHMgb24gZGVzdHJveWluZyBGLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBmb3IgdGhlIE1DSklUIGV4ZWN1dGlvbiBlbmdpbmUuICBVc2UKKyAgLy8vIGdldEZ1bmN0aW9uQWRkcmVzcyBpbnN0ZWFkLgorICB2aXJ0dWFsIHZvaWQgKmdldFBvaW50ZXJUb0Z1bmN0aW9uT3JTdHViKEZ1bmN0aW9uICpGKSB7CisgICAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiwganVzdCBjb2RlZ2VuIHRoZSBmdW5jdGlvbi4KKyAgICByZXR1cm4gZ2V0UG9pbnRlclRvRnVuY3Rpb24oRik7CisgIH0KKworICAvLy8gZ2V0R2xvYmFsVmFsdWVBZGRyZXNzIC0gUmV0dXJuIHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQgZ2xvYmFsCisgIC8vLyB2YWx1ZS4gVGhpcyBtYXkgaW52b2x2ZSBjb2RlIGdlbmVyYXRpb24uCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIGNhbGxlZCB3aXRoIHRoZSBpbnRlcnByZXRlciBlbmdpbmUuCisgIHZpcnR1YWwgdWludDY0X3QgZ2V0R2xvYmFsVmFsdWVBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgICAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGludGVycHJldGVyLiAgTUNKSVQgd2lsbCBvdmVycmlkZSB0aGlzLgorICAgIC8vIEpJVCBhbmQgaW50ZXJwcmV0ZXIgY2xpZW50cyBzaG91bGQgdXNlIGdldFBvaW50ZXJUb0dsb2JhbCBpbnN0ZWFkLgorICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIGdldEZ1bmN0aW9uQWRkcmVzcyAtIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uLgorICAvLy8gVGhpcyBtYXkgaW52b2x2ZSBjb2RlIGdlbmVyYXRpb24uCisgIHZpcnR1YWwgdWludDY0X3QgZ2V0RnVuY3Rpb25BZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgICAgLy8gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGludGVycHJldGVyLiAgTUNKSVQgd2lsbCBvdmVycmlkZSB0aGlzLgorICAgIC8vIEludGVycHJldGVyIGNsaWVudHMgc2hvdWxkIHVzZSBnZXRQb2ludGVyVG9GdW5jdGlvbiBpbnN0ZWFkLgorICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIGdldEdsb2JhbFZhbHVlQXRBZGRyZXNzIC0gUmV0dXJuIHRoZSBMTFZNIGdsb2JhbCB2YWx1ZSBvYmplY3QgdGhhdCBzdGFydHMKKyAgLy8vIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcy4KKyAgLy8vCisgIGNvbnN0IEdsb2JhbFZhbHVlICpnZXRHbG9iYWxWYWx1ZUF0QWRkcmVzcyh2b2lkICpBZGRyKTsKKworICAvLy8gU3RvcmVWYWx1ZVRvTWVtb3J5IC0gU3RvcmVzIHRoZSBkYXRhIGluIFZhbCBvZiB0eXBlIFR5IGF0IGFkZHJlc3MgUHRyLgorICAvLy8gUHRyIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBtZW1vcnkgYXQgd2hpY2ggdG8gc3RvcmUgVmFsLCBjYXN0IHRvCisgIC8vLyBHZW5lcmljVmFsdWUgKi4gIEl0IGlzIG5vdCBhIHBvaW50ZXIgdG8gYSBHZW5lcmljVmFsdWUgY29udGFpbmluZyB0aGUKKyAgLy8vIGFkZHJlc3MgYXQgd2hpY2ggdG8gc3RvcmUgVmFsLgorICB2b2lkIFN0b3JlVmFsdWVUb01lbW9yeShjb25zdCBHZW5lcmljVmFsdWUgJlZhbCwgR2VuZXJpY1ZhbHVlICpQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKlR5KTsKKworICB2b2lkIEluaXRpYWxpemVNZW1vcnkoY29uc3QgQ29uc3RhbnQgKkluaXQsIHZvaWQgKkFkZHIpOworCisgIC8vLyBnZXRPckVtaXRHbG9iYWxWYXJpYWJsZSAtIFJldHVybiB0aGUgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkIGdsb2JhbAorICAvLy8gdmFyaWFibGUsIHBvc3NpYmx5IGVtaXR0aW5nIGl0IHRvIG1lbW9yeSBpZiBuZWVkZWQuICBUaGlzIGlzIHVzZWQgYnkgdGhlCisgIC8vLyBFbWl0dGVyLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBmb3IgdGhlIE1DSklUIGV4ZWN1dGlvbiBlbmdpbmUuICBVc2UKKyAgLy8vIGdldEdsb2JhbFZhbHVlQWRkcmVzcyBpbnN0ZWFkLgorICB2aXJ0dWFsIHZvaWQgKmdldE9yRW1pdEdsb2JhbFZhcmlhYmxlKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpHVikgeworICAgIHJldHVybiBnZXRQb2ludGVyVG9HbG9iYWwoKGNvbnN0IEdsb2JhbFZhbHVlICopR1YpOworICB9CisKKyAgLy8vIFJlZ2lzdGVycyBhIGxpc3RlbmVyIHRvIGJlIGNhbGxlZCBiYWNrIG9uIHZhcmlvdXMgZXZlbnRzIHdpdGhpbgorICAvLy8gdGhlIEpJVC4gIFNlZSBKSVRFdmVudExpc3RlbmVyLmggZm9yIG1vcmUgZGV0YWlscy4gIERvZXMgbm90CisgIC8vLyB0YWtlIG93bmVyc2hpcCBvZiB0aGUgYXJndW1lbnQuICBUaGUgYXJndW1lbnQgbWF5IGJlIE5VTEwsIGluCisgIC8vLyB3aGljaCBjYXNlIHRoZXNlIGZ1bmN0aW9ucyBkbyBub3RoaW5nLgorICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJKSVRFdmVudExpc3RlbmVyKEpJVEV2ZW50TGlzdGVuZXIgKikge30KKyAgdmlydHVhbCB2b2lkIFVucmVnaXN0ZXJKSVRFdmVudExpc3RlbmVyKEpJVEV2ZW50TGlzdGVuZXIgKikge30KKworICAvLy8gU2V0cyB0aGUgcHJlLWNvbXBpbGVkIG9iamVjdCBjYWNoZS4gIFRoZSBvd25lcnNoaXAgb2YgdGhlIE9iamVjdENhY2hlIGlzCisgIC8vLyBub3QgY2hhbmdlZC4gIFN1cHBvcnRlZCBieSBNQ0pJVCBidXQgbm90IHRoZSBpbnRlcnByZXRlci4KKyAgdmlydHVhbCB2b2lkIHNldE9iamVjdENhY2hlKE9iamVjdENhY2hlICopIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJObyBzdXBwb3J0IGZvciBhbiBvYmplY3QgY2FjaGUiKTsKKyAgfQorCisgIC8vLyBzZXRQcm9jZXNzQWxsU2VjdGlvbnMgKE1DSklUIE9ubHkpOiBCeSBkZWZhdWx0LCBvbmx5IHNlY3Rpb25zIHRoYXQgYXJlCisgIC8vLyAicmVxdWlyZWQgZm9yIGV4ZWN1dGlvbiIgYXJlIHBhc3NlZCB0byB0aGUgUlREeWxkTWVtb3J5TWFuYWdlciwgYW5kIG90aGVyCisgIC8vLyBzZWN0aW9ucyBhcmUgZGlzY2FyZGVkLiBQYXNzaW5nICd0cnVlJyB0byB0aGlzIG1ldGhvZCB3aWxsIGNhdXNlCisgIC8vLyBSdW50aW1lRHlsZCB0byBwYXNzIGFsbCBzZWN0aW9ucyB0byBpdHMgUlREeWxkTWVtb3J5TWFuYWdlciByZWdhcmRsZXNzCisgIC8vLyBvZiB3aGV0aGVyIHRoZXkgYXJlICJyZXF1aXJlZCB0byBleGVjdXRlIiBpbiB0aGUgdXN1YWwgc2Vuc2UuCisgIC8vLworICAvLy8gUmF0aW9uYWxlOiBTb21lIE1DSklUIGNsaWVudHMgd2FudCB0byBiZSBhYmxlIHRvIGluc3BlY3QgbWV0YWRhdGEKKyAgLy8vIHNlY3Rpb25zIChlLmcuIER3YXJmLCBTdGFjay1tYXBzKSB0byBlbmFibGUgZnVuY3Rpb25hbGl0eSBvciBhbmFseXplCisgIC8vLyBwZXJmb3JtYW5jZS4gUGFzc2luZyB0aGVzZSBzZWN0aW9ucyB0byB0aGUgbWVtb3J5IG1hbmFnZXIgYWxsb3dzIHRoZQorICAvLy8gY2xpZW50IHRvIG1ha2UgcG9saWN5IGFib3V0IHRoZSByZWxldmFudCBzZWN0aW9ucywgcmF0aGVyIHRoYW4gaGF2aW5nCisgIC8vLyBNQ0pJVCBkbyBpdC4KKyAgdmlydHVhbCB2b2lkIHNldFByb2Nlc3NBbGxTZWN0aW9ucyhib29sIFByb2Nlc3NBbGxTZWN0aW9ucykgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIk5vIHN1cHBvcnQgZm9yIFByb2Nlc3NBbGxTZWN0aW9ucyBvcHRpb24iKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHRhcmdldCBtYWNoaW5lIChpZiBhdmFpbGFibGUpLgorICB2aXJ0dWFsIFRhcmdldE1hY2hpbmUgKmdldFRhcmdldE1hY2hpbmUoKSB7IHJldHVybiBudWxscHRyOyB9CisKKyAgLy8vIERpc2FibGVMYXp5Q29tcGlsYXRpb24gLSBXaGVuIGxhenkgY29tcGlsYXRpb24gaXMgb2ZmICh0aGUgZGVmYXVsdCksIHRoZQorICAvLy8gSklUIHdpbGwgZWFnZXJseSBjb21waWxlIGV2ZXJ5IGZ1bmN0aW9uIHJlYWNoYWJsZSBmcm9tIHRoZSBhcmd1bWVudCB0bworICAvLy8gZ2V0UG9pbnRlclRvRnVuY3Rpb24uICBJZiBsYXp5IGNvbXBpbGF0aW9uIGlzIHR1cm5lZCBvbiwgdGhlIEpJVCB3aWxsIG9ubHkKKyAgLy8vIGNvbXBpbGUgdGhlIG9uZSBmdW5jdGlvbiBhbmQgZW1pdCBzdHVicyB0byBjb21waWxlIHRoZSByZXN0IHdoZW4gdGhleSdyZQorICAvLy8gZmlyc3QgY2FsbGVkLiAgSWYgbGF6eSBjb21waWxhdGlvbiBpcyB0dXJuZWQgb2ZmIGFnYWluIHdoaWxlIHNvbWUgbGF6eQorICAvLy8gc3R1YnMgYXJlIHN0aWxsIGFyb3VuZCwgYW5kIG9uZSBvZiB0aG9zZSBzdHVicyBpcyBjYWxsZWQsIHRoZSBwcm9ncmFtIHdpbGwKKyAgLy8vIGFib3J0LgorICAvLy8KKyAgLy8vIEluIG9yZGVyIHRvIHNhZmVseSBjb21waWxlIGxhemlseSBpbiBhIHRocmVhZGVkIHByb2dyYW0sIHRoZSB1c2VyIG11c3QKKyAgLy8vIGVuc3VyZSB0aGF0IDEpIG9ubHkgb25lIHRocmVhZCBhdCBhIHRpbWUgY2FuIGNhbGwgYW55IHBhcnRpY3VsYXIgbGF6eQorICAvLy8gc3R1YiwgYW5kIDIpIGFueSB0aHJlYWQgbW9kaWZ5aW5nIExMVk0gSVIgbXVzdCBob2xkIHRoZSBKSVQncyBsb2NrCisgIC8vLyAoRXhlY3V0aW9uRW5naW5lOjpsb2NrKSBvciBvdGhlcndpc2UgZW5zdXJlIHRoYXQgbm8gb3RoZXIgdGhyZWFkIGNhbGxzIGEKKyAgLy8vIGxhenkgc3R1Yi4gIFNlZSBodHRwOi8vbGx2bS5vcmcvUFI1MTg0IGZvciBkZXRhaWxzLgorICB2b2lkIERpc2FibGVMYXp5Q29tcGlsYXRpb24oYm9vbCBEaXNhYmxlZCA9IHRydWUpIHsKKyAgICBDb21waWxpbmdMYXppbHkgPSAhRGlzYWJsZWQ7CisgIH0KKyAgYm9vbCBpc0NvbXBpbGluZ0xhemlseSgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29tcGlsaW5nTGF6aWx5OworICB9CisKKyAgLy8vIERpc2FibGVHVkNvbXBpbGF0aW9uIC0gSWYgY2FsbGVkLCB0aGUgSklUIHdpbGwgYWJvcnQgaWYgaXQncyBhc2tlZCB0bworICAvLy8gYWxsb2NhdGUgc3BhY2UgYW5kIHBvcHVsYXRlIGEgR2xvYmFsVmFyaWFibGUgdGhhdCBpcyBub3QgaW50ZXJuYWwgdG8KKyAgLy8vIHRoZSBtb2R1bGUuCisgIHZvaWQgRGlzYWJsZUdWQ29tcGlsYXRpb24oYm9vbCBEaXNhYmxlZCA9IHRydWUpIHsKKyAgICBHVkNvbXBpbGF0aW9uRGlzYWJsZWQgPSBEaXNhYmxlZDsKKyAgfQorICBib29sIGlzR1ZDb21waWxhdGlvbkRpc2FibGVkKCkgY29uc3QgeworICAgIHJldHVybiBHVkNvbXBpbGF0aW9uRGlzYWJsZWQ7CisgIH0KKworICAvLy8gRGlzYWJsZVN5bWJvbFNlYXJjaGluZyAtIElmIGNhbGxlZCwgdGhlIEpJVCB3aWxsIG5vdCB0cnkgdG8gbG9va3VwIHVua25vd24KKyAgLy8vIHN5bWJvbHMgd2l0aCBkbHN5bS4gIEEgY2xpZW50IGNhbiBzdGlsbCB1c2UgSW5zdGFsbExhenlGdW5jdGlvbkNyZWF0b3IgdG8KKyAgLy8vIHJlc29sdmUgc3ltYm9scyBpbiBhIGN1c3RvbSB3YXkuCisgIHZvaWQgRGlzYWJsZVN5bWJvbFNlYXJjaGluZyhib29sIERpc2FibGVkID0gdHJ1ZSkgeworICAgIFN5bWJvbFNlYXJjaGluZ0Rpc2FibGVkID0gRGlzYWJsZWQ7CisgIH0KKyAgYm9vbCBpc1N5bWJvbFNlYXJjaGluZ0Rpc2FibGVkKCkgY29uc3QgeworICAgIHJldHVybiBTeW1ib2xTZWFyY2hpbmdEaXNhYmxlZDsKKyAgfQorCisgIC8vLyBFbmFibGUvRGlzYWJsZSBJUiBtb2R1bGUgdmVyaWZpY2F0aW9uLgorICAvLy8KKyAgLy8vIE5vdGU6IE1vZHVsZSB2ZXJpZmljYXRpb24gaXMgZW5hYmxlZCBieSBkZWZhdWx0IGluIERlYnVnIGJ1aWxkcywgYW5kCisgIC8vLyBkaXNhYmxlZCBieSBkZWZhdWx0IGluIFJlbGVhc2UuIFVzZSB0aGlzIG1ldGhvZCB0byBvdmVycmlkZSB0aGUgZGVmYXVsdC4KKyAgdm9pZCBzZXRWZXJpZnlNb2R1bGVzKGJvb2wgVmVyaWZ5KSB7CisgICAgVmVyaWZ5TW9kdWxlcyA9IFZlcmlmeTsKKyAgfQorICBib29sIGdldFZlcmlmeU1vZHVsZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIFZlcmlmeU1vZHVsZXM7CisgIH0KKworICAvLy8gSW5zdGFsbExhenlGdW5jdGlvbkNyZWF0b3IgLSBJZiBhbiB1bmtub3duIGZ1bmN0aW9uIGlzIG5lZWRlZCwgdGhlCisgIC8vLyBzcGVjaWZpZWQgZnVuY3Rpb24gcG9pbnRlciBpcyBpbnZva2VkIHRvIGNyZWF0ZSBpdC4gIElmIGl0IHJldHVybnMgbnVsbCwKKyAgLy8vIHRoZSBKSVQgd2lsbCBhYm9ydC4KKyAgdm9pZCBJbnN0YWxsTGF6eUZ1bmN0aW9uQ3JlYXRvcihGdW5jdGlvbkNyZWF0b3IgQykgeworICAgIExhenlGdW5jdGlvbkNyZWF0b3IgPSBzdGQ6Om1vdmUoQyk7CisgIH0KKworcHJvdGVjdGVkOgorICBFeGVjdXRpb25FbmdpbmUoRGF0YUxheW91dCBETCkgOiBETChzdGQ6Om1vdmUoREwpKSB7fQorICBleHBsaWNpdCBFeGVjdXRpb25FbmdpbmUoRGF0YUxheW91dCBETCwgc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gTSk7CisgIGV4cGxpY2l0IEV4ZWN1dGlvbkVuZ2luZShzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBNKTsKKworICB2b2lkIGVtaXRHbG9iYWxzKCk7CisKKyAgdm9pZCBFbWl0R2xvYmFsVmFyaWFibGUoY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWKTsKKworICBHZW5lcmljVmFsdWUgZ2V0Q29uc3RhbnRWYWx1ZShjb25zdCBDb25zdGFudCAqQyk7CisgIHZvaWQgTG9hZFZhbHVlRnJvbU1lbW9yeShHZW5lcmljVmFsdWUgJlJlc3VsdCwgR2VuZXJpY1ZhbHVlICpQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpUeSk7CisKK3ByaXZhdGU6CisgIHZvaWQgSW5pdChzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBNKTsKK307CisKK25hbWVzcGFjZSBFbmdpbmVLaW5kIHsKKworICAvLyBUaGVzZSBhcmUgYWN0dWFsbHkgYml0bWFza3MgdGhhdCBnZXQgb3ItZWQgdG9nZXRoZXIuCisgIGVudW0gS2luZCB7CisgICAgSklUICAgICAgICAgPSAweDEsCisgICAgSW50ZXJwcmV0ZXIgPSAweDIKKyAgfTsKKyAgY29uc3Qgc3RhdGljIEtpbmQgRWl0aGVyID0gKEtpbmQpKEpJVCB8IEludGVycHJldGVyKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEVuZ2luZUtpbmQKKworLy8vIEJ1aWxkZXIgY2xhc3MgZm9yIEV4ZWN1dGlvbkVuZ2luZXMuIFVzZSB0aGlzIGJ5IHN0YWNrLWFsbG9jYXRpbmcgYSBidWlsZGVyLAorLy8vIGNoYWluaW5nIHRoZSB2YXJpb3VzIHNldCogbWV0aG9kcywgYW5kIHRlcm1pbmF0aW5nIGl0IHdpdGggYSAuY3JlYXRlKCkKKy8vLyBjYWxsLgorY2xhc3MgRW5naW5lQnVpbGRlciB7Citwcml2YXRlOgorICBzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBNOworICBFbmdpbmVLaW5kOjpLaW5kIFdoaWNoRW5naW5lOworICBzdGQ6OnN0cmluZyAqRXJyb3JTdHI7CisgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsOworICBzdGQ6OnNoYXJlZF9wdHI8TUNKSVRNZW1vcnlNYW5hZ2VyPiBNZW1NZ3I7CisgIHN0ZDo6c2hhcmVkX3B0cjxMZWdhY3lKSVRTeW1ib2xSZXNvbHZlcj4gUmVzb2x2ZXI7CisgIFRhcmdldE9wdGlvbnMgT3B0aW9uczsKKyAgT3B0aW9uYWw8UmVsb2M6Ok1vZGVsPiBSZWxvY01vZGVsOworICBPcHRpb25hbDxDb2RlTW9kZWw6Ok1vZGVsPiBDTU1vZGVsOworICBzdGQ6OnN0cmluZyBNQXJjaDsKKyAgc3RkOjpzdHJpbmcgTUNQVTsKKyAgU21hbGxWZWN0b3I8c3RkOjpzdHJpbmcsIDQ+IE1BdHRyczsKKyAgYm9vbCBWZXJpZnlNb2R1bGVzOworICBib29sIFVzZU9yY01DSklUUmVwbGFjZW1lbnQ7CisgIGJvb2wgRW11bGF0ZWRUTFMgPSB0cnVlOworCitwdWJsaWM6CisgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yIGZvciBFbmdpbmVCdWlsZGVyLgorICBFbmdpbmVCdWlsZGVyKCk7CisKKyAgLy8vIENvbnN0cnVjdG9yIGZvciBFbmdpbmVCdWlsZGVyLgorICBFbmdpbmVCdWlsZGVyKHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IE0pOworCisgIC8vIE91dC1vZi1saW5lIHNpbmNlIHdlIGRvbid0IGhhdmUgdGhlIGRlZiduIG9mIFJURHlsZE1lbW9yeU1hbmFnZXIgaGVyZS4KKyAgfkVuZ2luZUJ1aWxkZXIoKTsKKworICAvLy8gc2V0RW5naW5lS2luZCAtIENvbnRyb2xzIHdoZXRoZXIgdGhlIHVzZXIgd2FudHMgdGhlIGludGVycHJldGVyLCB0aGUgSklULAorICAvLy8gb3Igd2hpY2hldmVyIGVuZ2luZSB3b3Jrcy4gIFRoaXMgb3B0aW9uIGRlZmF1bHRzIHRvIEVuZ2luZUtpbmQ6OkVpdGhlci4KKyAgRW5naW5lQnVpbGRlciAmc2V0RW5naW5lS2luZChFbmdpbmVLaW5kOjpLaW5kIHcpIHsKKyAgICBXaGljaEVuZ2luZSA9IHc7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIHNldE1DSklUTWVtb3J5TWFuYWdlciAtIFNldHMgdGhlIE1DSklUIG1lbW9yeSBtYW5hZ2VyIHRvIHVzZS4gVGhpcyBhbGxvd3MKKyAgLy8vIGNsaWVudHMgdG8gY3VzdG9taXplIHRoZWlyIG1lbW9yeSBhbGxvY2F0aW9uIHBvbGljaWVzIGZvciB0aGUgTUNKSVQuIFRoaXMKKyAgLy8vIGlzIG9ubHkgYXBwcm9wcmlhdGUgZm9yIHRoZSBNQ0pJVDsgc2V0dGluZyB0aGlzIGFuZCBjb25maWd1cmluZyB0aGUgYnVpbGRlcgorICAvLy8gdG8gY3JlYXRlIGFueXRoaW5nIG90aGVyIHRoYW4gTUNKSVQgd2lsbCBjYXVzZSBhIHJ1bnRpbWUgZXJyb3IuIElmIGNyZWF0ZSgpCisgIC8vLyBpcyBjYWxsZWQgYW5kIGlzIHN1Y2Nlc3NmdWwsIHRoZSBjcmVhdGVkIGVuZ2luZSB0YWtlcyBvd25lcnNoaXAgb2YgdGhlCisgIC8vLyBtZW1vcnkgbWFuYWdlci4gVGhpcyBvcHRpb24gZGVmYXVsdHMgdG8gTlVMTC4KKyAgRW5naW5lQnVpbGRlciAmc2V0TUNKSVRNZW1vcnlNYW5hZ2VyKHN0ZDo6dW5pcXVlX3B0cjxSVER5bGRNZW1vcnlNYW5hZ2VyPiBtY2ptbSk7CisKKyAgRW5naW5lQnVpbGRlciYKKyAgc2V0TWVtb3J5TWFuYWdlcihzdGQ6OnVuaXF1ZV9wdHI8TUNKSVRNZW1vcnlNYW5hZ2VyPiBNTSk7CisKKyAgRW5naW5lQnVpbGRlciAmc2V0U3ltYm9sUmVzb2x2ZXIoc3RkOjp1bmlxdWVfcHRyPExlZ2FjeUpJVFN5bWJvbFJlc29sdmVyPiBTUik7CisKKyAgLy8vIHNldEVycm9yU3RyIC0gU2V0IHRoZSBlcnJvciBzdHJpbmcgdG8gd3JpdGUgdG8gb24gZXJyb3IuICBUaGlzIG9wdGlvbgorICAvLy8gZGVmYXVsdHMgdG8gTlVMTC4KKyAgRW5naW5lQnVpbGRlciAmc2V0RXJyb3JTdHIoc3RkOjpzdHJpbmcgKmUpIHsKKyAgICBFcnJvclN0ciA9IGU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIHNldE9wdExldmVsIC0gU2V0IHRoZSBvcHRpbWl6YXRpb24gbGV2ZWwgZm9yIHRoZSBKSVQuICBUaGlzIG9wdGlvbgorICAvLy8gZGVmYXVsdHMgdG8gQ29kZUdlbk9wdDo6RGVmYXVsdC4KKyAgRW5naW5lQnVpbGRlciAmc2V0T3B0TGV2ZWwoQ29kZUdlbk9wdDo6TGV2ZWwgbCkgeworICAgIE9wdExldmVsID0gbDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gc2V0VGFyZ2V0T3B0aW9ucyAtIFNldCB0aGUgdGFyZ2V0IG9wdGlvbnMgdGhhdCB0aGUgRXhlY3V0aW9uRW5naW5lCisgIC8vLyB0YXJnZXQgaXMgdXNpbmcuIERlZmF1bHRzIHRvIFRhcmdldE9wdGlvbnMoKS4KKyAgRW5naW5lQnVpbGRlciAmc2V0VGFyZ2V0T3B0aW9ucyhjb25zdCBUYXJnZXRPcHRpb25zICZPcHRzKSB7CisgICAgT3B0aW9ucyA9IE9wdHM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIHNldFJlbG9jYXRpb25Nb2RlbCAtIFNldCB0aGUgcmVsb2NhdGlvbiBtb2RlbCB0aGF0IHRoZSBFeGVjdXRpb25FbmdpbmUKKyAgLy8vIHRhcmdldCBpcyB1c2luZy4gRGVmYXVsdHMgdG8gdGFyZ2V0IHNwZWNpZmljIGRlZmF1bHQgIlJlbG9jOjpEZWZhdWx0Ii4KKyAgRW5naW5lQnVpbGRlciAmc2V0UmVsb2NhdGlvbk1vZGVsKFJlbG9jOjpNb2RlbCBSTSkgeworICAgIFJlbG9jTW9kZWwgPSBSTTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gc2V0Q29kZU1vZGVsIC0gU2V0IHRoZSBDb2RlTW9kZWwgdGhhdCB0aGUgRXhlY3V0aW9uRW5naW5lIHRhcmdldAorICAvLy8gZGF0YSBpcyB1c2luZy4gRGVmYXVsdHMgdG8gdGFyZ2V0IHNwZWNpZmljIGRlZmF1bHQKKyAgLy8vICJDb2RlTW9kZWw6OkpJVERlZmF1bHQiLgorICBFbmdpbmVCdWlsZGVyICZzZXRDb2RlTW9kZWwoQ29kZU1vZGVsOjpNb2RlbCBNKSB7CisgICAgQ01Nb2RlbCA9IE07CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIHNldE1BcmNoIC0gT3ZlcnJpZGUgdGhlIGFyY2hpdGVjdHVyZSBzZXQgYnkgdGhlIE1vZHVsZSdzIHRyaXBsZS4KKyAgRW5naW5lQnVpbGRlciAmc2V0TUFyY2goU3RyaW5nUmVmIG1hcmNoKSB7CisgICAgTUFyY2guYXNzaWduKG1hcmNoLmJlZ2luKCksIG1hcmNoLmVuZCgpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gc2V0TUNQVSAtIFRhcmdldCBhIHNwZWNpZmljIGNwdSB0eXBlLgorICBFbmdpbmVCdWlsZGVyICZzZXRNQ1BVKFN0cmluZ1JlZiBtY3B1KSB7CisgICAgTUNQVS5hc3NpZ24obWNwdS5iZWdpbigpLCBtY3B1LmVuZCgpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gc2V0VmVyaWZ5TW9kdWxlcyAtIFNldCB3aGV0aGVyIHRoZSBKSVQgaW1wbGVtZW50YXRpb24gc2hvdWxkIHZlcmlmeQorICAvLy8gSVIgbW9kdWxlcyBkdXJpbmcgY29tcGlsYXRpb24uCisgIEVuZ2luZUJ1aWxkZXIgJnNldFZlcmlmeU1vZHVsZXMoYm9vbCBWZXJpZnkpIHsKKyAgICBWZXJpZnlNb2R1bGVzID0gVmVyaWZ5OworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBzZXRNQXR0cnMgLSBTZXQgY3B1LXNwZWNpZmljIGF0dHJpYnV0ZXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFN0cmluZ1NlcXVlbmNlPgorICBFbmdpbmVCdWlsZGVyICZzZXRNQXR0cnMoY29uc3QgU3RyaW5nU2VxdWVuY2UgJm1hdHRycykgeworICAgIE1BdHRycy5jbGVhcigpOworICAgIE1BdHRycy5hcHBlbmQobWF0dHJzLmJlZ2luKCksIG1hdHRycy5lbmQoKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gXGJyaWVmIFVzZSBPcmNNQ0pJVFJlcGxhY2VtZW50IGluc3RlYWQgb2YgTUNKSVQuIE9mZiBieSBkZWZhdWx0LgorICB2b2lkIHNldFVzZU9yY01DSklUUmVwbGFjZW1lbnQoYm9vbCBVc2VPcmNNQ0pJVFJlcGxhY2VtZW50KSB7CisgICAgdGhpcy0+VXNlT3JjTUNKSVRSZXBsYWNlbWVudCA9IFVzZU9yY01DSklUUmVwbGFjZW1lbnQ7CisgIH0KKworICB2b2lkIHNldEVtdWxhdGVkVExTKGJvb2wgRW11bGF0ZWRUTFMpIHsKKyAgICB0aGlzLT5FbXVsYXRlZFRMUyA9IEVtdWxhdGVkVExTOworICB9CisgIAorICBUYXJnZXRNYWNoaW5lICpzZWxlY3RUYXJnZXQoKTsKKworICAvLy8gc2VsZWN0VGFyZ2V0IC0gUGljayBhIHRhcmdldCBlaXRoZXIgdmlhIC1tYXJjaCBvciBieSBndWVzc2luZyB0aGUgbmF0aXZlCisgIC8vLyBhcmNoLiAgQWRkIGFueSBDUFUgZmVhdHVyZXMgc3BlY2lmaWVkIHZpYSAtbWNwdSBvciAtbWF0dHIuCisgIFRhcmdldE1hY2hpbmUgKnNlbGVjdFRhcmdldChjb25zdCBUcmlwbGUgJlRhcmdldFRyaXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBNQXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBNQ1BVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPHN0ZDo6c3RyaW5nPiYgTUF0dHJzKTsKKworICBFeGVjdXRpb25FbmdpbmUgKmNyZWF0ZSgpIHsKKyAgICByZXR1cm4gY3JlYXRlKHNlbGVjdFRhcmdldCgpKTsKKyAgfQorCisgIEV4ZWN1dGlvbkVuZ2luZSAqY3JlYXRlKFRhcmdldE1hY2hpbmUgKlRNKTsKK307CisKKy8vIENyZWF0ZSB3cmFwcGVycyBmb3IgQyBCaW5kaW5nIHR5cGVzIChzZWUgQ0JpbmRpbmdXcmFwcGluZy5oKS4KK0RFRklORV9TSU1QTEVfQ09OVkVSU0lPTl9GVU5DVElPTlMoRXhlY3V0aW9uRW5naW5lLCBMTFZNRXhlY3V0aW9uRW5naW5lUmVmKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfRVhFQ1VUSU9ORU5HSU5FX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL0dlbmVyaWNWYWx1ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvR2VuZXJpY1ZhbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA0ZTMwYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL0dlbmVyaWNWYWx1ZS5oCkBAIC0wLDAgKzEsNTUgQEAKKy8vPT09LSBHZW5lcmljVmFsdWUuaCAtIFJlcHJlc2VudCBhbnkgdHlwZSBvZiBMTFZNIHZhbHVlIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhlIEdlbmVyaWNWYWx1ZSBjbGFzcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhbiBMTFZNIHZhbHVlIG9mIGFyYml0cmFyeSB0eXBlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfR0VORVJJQ1ZBTFVFX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfR0VORVJJQ1ZBTFVFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FQSW50LmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3VzaW5nIFBvaW50ZXJUeSA9IHZvaWQgKjsKKworc3RydWN0IEdlbmVyaWNWYWx1ZSB7CisgIHN0cnVjdCBJbnRQYWlyIHsKKyAgICB1bnNpZ25lZCBpbnQgZmlyc3Q7CisgICAgdW5zaWduZWQgaW50IHNlY29uZDsKKyAgfTsKKyAgdW5pb24geworICAgIGRvdWJsZSBEb3VibGVWYWw7CisgICAgZmxvYXQgRmxvYXRWYWw7CisgICAgUG9pbnRlclR5IFBvaW50ZXJWYWw7CisgICAgc3RydWN0IEludFBhaXIgVUludFBhaXJWYWw7CisgICAgdW5zaWduZWQgY2hhciBVbnR5cGVkWzhdOworICB9OworICBBUEludCBJbnRWYWw7IC8vIGFsc28gdXNlZCBmb3IgbG9uZyBkb3VibGVzLgorICAvLyBGb3IgYWdncmVnYXRlIGRhdGEgdHlwZXMuCisgIHN0ZDo6dmVjdG9yPEdlbmVyaWNWYWx1ZT4gQWdncmVnYXRlVmFsOworCisgIC8vIHRvIG1ha2UgY29kZSBmYXN0ZXIsIHNldCBHZW5lcmljVmFsdWUgdG8gemVybyBjb3VsZCBiZSBvbWl0dGVkLCBidXQgaXQgaXMKKyAgLy8gcG90ZW50aWFsbHkgY2FuIGNhdXNlIHByb2JsZW1zLCBzaW5jZSBHZW5lcmljVmFsdWUgdG8gc3RvcmUgZ2FyYmFnZQorICAvLyBpbnN0ZWFkIG9mIHplcm8uCisgIEdlbmVyaWNWYWx1ZSgpIDogSW50VmFsKDEsIDApIHsKKyAgICBVSW50UGFpclZhbC5maXJzdCA9IDA7CisgICAgVUludFBhaXJWYWwuc2Vjb25kID0gMDsKKyAgfQorICBleHBsaWNpdCBHZW5lcmljVmFsdWUodm9pZCAqVikgOiBQb2ludGVyVmFsKFYpLCBJbnRWYWwoMSwgMCkge30KK307CisKK2lubGluZSBHZW5lcmljVmFsdWUgUFRPR1Yodm9pZCAqUCkgeyByZXR1cm4gR2VuZXJpY1ZhbHVlKFApOyB9CitpbmxpbmUgdm9pZCAqR1ZUT1AoY29uc3QgR2VuZXJpY1ZhbHVlICZHVikgeyByZXR1cm4gR1YuUG9pbnRlclZhbDsgfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfR0VORVJJQ1ZBTFVFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL0ludGVycHJldGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9JbnRlcnByZXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmExNDcwNzgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9JbnRlcnByZXRlci5oCkBAIC0wLDAgKzEsMjggQEAKKy8vPT09LS0gSW50ZXJwcmV0ZXIuaCAtIEFic3RyYWN0IEV4ZWN1dGlvbiBFbmdpbmUgSW50ZXJmYWNlIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGZvcmNlcyB0aGUgaW50ZXJwcmV0ZXIgdG8gbGluayBpbiBvbiBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgorLy8gKFdpbmRvd3MpLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfSU5URVJQUkVURVJfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9JTlRFUlBSRVRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9FeGVjdXRpb25FbmdpbmUuaCIKKworZXh0ZXJuICJDIiB2b2lkIExMVk1MaW5rSW5JbnRlcnByZXRlcigpOworCituYW1lc3BhY2UgeworICBzdHJ1Y3QgRm9yY2VJbnRlcnByZXRlckxpbmtpbmcgeworICAgIEZvcmNlSW50ZXJwcmV0ZXJMaW5raW5nKCkgeyBMTFZNTGlua0luSW50ZXJwcmV0ZXIoKTsgfQorICB9IEZvcmNlSW50ZXJwcmV0ZXJMaW5raW5nOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL0pJVEV2ZW50TGlzdGVuZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL0pJVEV2ZW50TGlzdGVuZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjc4NDBmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvSklURXZlbnRMaXN0ZW5lci5oCkBAIC0wLDAgKzEsMTI0IEBACisvLz09PS0gSklURXZlbnRMaXN0ZW5lci5oIC0gRXhwb3NlcyBldmVudHMgZnJvbSBKSVQgY29tcGlsYXRpb24gLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBKSVRFdmVudExpc3RlbmVyIGludGVyZmFjZSwgd2hpY2ggbGV0cyB1c2VycyBnZXQKKy8vIGNhbGxiYWNrcyB3aGVuIHNpZ25pZmljYW50IGV2ZW50cyBoYXBwZW4gZHVyaW5nIHRoZSBKSVQgY29tcGlsYXRpb24gcHJvY2Vzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX0pJVEVWRU5UTElTVEVORVJfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9KSVRFVkVOVExJU1RFTkVSX0gKKworI2luY2x1ZGUgImxsdm0vQ29uZmlnL2xsdm0tY29uZmlnLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvUnVudGltZUR5bGQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RlYnVnTG9jLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgSW50ZWxKSVRFdmVudHNXcmFwcGVyOworY2xhc3MgTWFjaGluZUZ1bmN0aW9uOworY2xhc3MgT1Byb2ZpbGVXcmFwcGVyOworCituYW1lc3BhY2Ugb2JqZWN0IHsKKworY2xhc3MgT2JqZWN0RmlsZTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9iamVjdAorCisvLy8gSklURXZlbnRfRW1pdHRlZEZ1bmN0aW9uRGV0YWlscyAtIEhlbHBlciBzdHJ1Y3QgZm9yIGNvbnRhaW5pbmcgaW5mb3JtYXRpb24KKy8vLyBhYm91dCBhIGdlbmVyYXRlZCBtYWNoaW5lIGNvZGUgZnVuY3Rpb24uCitzdHJ1Y3QgSklURXZlbnRfRW1pdHRlZEZ1bmN0aW9uRGV0YWlscyB7CisgIHN0cnVjdCBMaW5lU3RhcnQgeworICAgIC8vLyBUaGUgYWRkcmVzcyBhdCB3aGljaCB0aGUgY3VycmVudCBsaW5lIGNoYW5nZXMuCisgICAgdWludHB0cl90IEFkZHJlc3M7CisKKyAgICAvLy8gVGhlIG5ldyBsb2NhdGlvbiBpbmZvcm1hdGlvbi4gIFRoZXNlIGNhbiBiZSB0cmFuc2xhdGVkIHRvIERlYnVnTG9jVHVwbGVzCisgICAgLy8vIHVzaW5nIE1GLT5nZXREZWJ1Z0xvY1R1cGxlKCkuCisgICAgRGVidWdMb2MgTG9jOworICB9OworCisgIC8vLyBUaGUgbWFjaGluZSBmdW5jdGlvbiB0aGUgc3RydWN0IGNvbnRhaW5zIGluZm9ybWF0aW9uIGZvci4KKyAgY29uc3QgTWFjaGluZUZ1bmN0aW9uICpNRjsKKworICAvLy8gVGhlIGxpc3Qgb2YgbGluZSBib3VuZGFyeSBpbmZvcm1hdGlvbiwgc29ydGVkIGJ5IGFkZHJlc3MuCisgIHN0ZDo6dmVjdG9yPExpbmVTdGFydD4gTGluZVN0YXJ0czsKK307CisKKy8vLyBKSVRFdmVudExpc3RlbmVyIC0gQWJzdHJhY3QgaW50ZXJmYWNlIGZvciB1c2UgYnkgdGhlIEpJVCB0byBub3RpZnkgY2xpZW50cworLy8vIGFib3V0IHNpZ25pZmljYW50IGV2ZW50cyBkdXJpbmcgY29tcGlsYXRpb24uIEZvciBleGFtcGxlLCB0byBub3RpZnkKKy8vLyBwcm9maWxlcnMgYW5kIGRlYnVnZ2VycyB0aGF0IG5lZWQgdG8ga25vdyB3aGVyZSBmdW5jdGlvbnMgaGF2ZSBiZWVuIGVtaXR0ZWQuCisvLy8KKy8vLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBlYWNoIG1ldGhvZCBkb2VzIG5vdGhpbmcuCitjbGFzcyBKSVRFdmVudExpc3RlbmVyIHsKK3B1YmxpYzoKKyAgdXNpbmcgRW1pdHRlZEZ1bmN0aW9uRGV0YWlscyA9IEpJVEV2ZW50X0VtaXR0ZWRGdW5jdGlvbkRldGFpbHM7CisKK3B1YmxpYzoKKyAgSklURXZlbnRMaXN0ZW5lcigpID0gZGVmYXVsdDsKKyAgdmlydHVhbCB+SklURXZlbnRMaXN0ZW5lcigpID0gZGVmYXVsdDsKKworICAvLy8gTm90aWZ5T2JqZWN0RW1pdHRlZCAtIENhbGxlZCBhZnRlciBhbiBvYmplY3QgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5CisgIC8vLyBlbWl0dGVkIHRvIG1lbW9yeS4gIE5vdGlmeUZ1bmN0aW9uRW1pdHRlZCB3aWxsIG5vdCBiZSBjYWxsZWQgZm9yCisgIC8vLyBpbmRpdmlkdWFsIGZ1bmN0aW9ucyBpbiB0aGUgb2JqZWN0LgorICAvLy8KKyAgLy8vIEVMRi1zcGVjaWZpYyBpbmZvcm1hdGlvbgorICAvLy8gVGhlIE9iamVjdEltYWdlIGNvbnRhaW5zIHRoZSBnZW5lcmF0ZWQgb2JqZWN0IGltYWdlCisgIC8vLyB3aXRoIHNlY3Rpb24gaGVhZGVycyB1cGRhdGVkIHRvIHJlZmxlY3QgdGhlIGFkZHJlc3MgYXQgd2hpY2ggc2VjdGlvbnMKKyAgLy8vIHdlcmUgbG9hZGVkIGFuZCB3aXRoIHJlbG9jYXRpb25zIHBlcmZvcm1lZCBpbi1wbGFjZSBvbiBkZWJ1ZyBzZWN0aW9ucy4KKyAgdmlydHVhbCB2b2lkIE5vdGlmeU9iamVjdEVtaXR0ZWQoY29uc3Qgb2JqZWN0OjpPYmplY3RGaWxlICZPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVEeWxkOjpMb2FkZWRPYmplY3RJbmZvICZMKSB7fQorCisgIC8vLyBOb3RpZnlGcmVlaW5nT2JqZWN0IC0gQ2FsbGVkIGp1c3QgYmVmb3JlIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoCisgIC8vLyBhIHByZXZpb3VzbHkgZW1pdHRlZCBvYmplY3QgaXMgcmVsZWFzZWQuCisgIHZpcnR1YWwgdm9pZCBOb3RpZnlGcmVlaW5nT2JqZWN0KGNvbnN0IG9iamVjdDo6T2JqZWN0RmlsZSAmT2JqKSB7fQorCisgIC8vIEdldCBhIHBvaW50ZSB0byB0aGUgR0RCIGRlYnVnZ2VyIHJlZ2lzdHJhdGlvbiBsaXN0ZW5lci4KKyAgc3RhdGljIEpJVEV2ZW50TGlzdGVuZXIgKmNyZWF0ZUdEQlJlZ2lzdHJhdGlvbkxpc3RlbmVyKCk7CisKKyNpZiBMTFZNX1VTRV9JTlRFTF9KSVRFVkVOVFMKKyAgLy8gQ29uc3RydWN0IGFuIEludGVsSklURXZlbnRMaXN0ZW5lcgorICBzdGF0aWMgSklURXZlbnRMaXN0ZW5lciAqY3JlYXRlSW50ZWxKSVRFdmVudExpc3RlbmVyKCk7CisKKyAgLy8gQ29uc3RydWN0IGFuIEludGVsSklURXZlbnRMaXN0ZW5lciB3aXRoIGEgdGVzdCBJbnRlbCBKSVQgQVBJIGltcGxlbWVudGF0aW9uCisgIHN0YXRpYyBKSVRFdmVudExpc3RlbmVyICpjcmVhdGVJbnRlbEpJVEV2ZW50TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVsSklURXZlbnRzV3JhcHBlciogQWx0ZXJuYXRpdmVJbXBsKTsKKyNlbHNlCisgIHN0YXRpYyBKSVRFdmVudExpc3RlbmVyICpjcmVhdGVJbnRlbEpJVEV2ZW50TGlzdGVuZXIoKSB7IHJldHVybiBudWxscHRyOyB9CisKKyAgc3RhdGljIEpJVEV2ZW50TGlzdGVuZXIgKmNyZWF0ZUludGVsSklURXZlbnRMaXN0ZW5lcigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWxKSVRFdmVudHNXcmFwcGVyKiBBbHRlcm5hdGl2ZUltcGwpIHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorI2VuZGlmIC8vIFVTRV9JTlRFTF9KSVRFVkVOVFMKKworI2lmIExMVk1fVVNFX09QUk9GSUxFCisgIC8vIENvbnN0cnVjdCBhbiBPUHJvZmlsZUpJVEV2ZW50TGlzdGVuZXIKKyAgc3RhdGljIEpJVEV2ZW50TGlzdGVuZXIgKmNyZWF0ZU9Qcm9maWxlSklURXZlbnRMaXN0ZW5lcigpOworCisgIC8vIENvbnN0cnVjdCBhbiBPUHJvZmlsZUpJVEV2ZW50TGlzdGVuZXIgd2l0aCBhIHRlc3Qgb3BhZ2VudCBpbXBsZW1lbnRhdGlvbgorICBzdGF0aWMgSklURXZlbnRMaXN0ZW5lciAqY3JlYXRlT1Byb2ZpbGVKSVRFdmVudExpc3RlbmVyKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPUHJvZmlsZVdyYXBwZXIqIEFsdGVybmF0aXZlSW1wbCk7CisjZWxzZQorICBzdGF0aWMgSklURXZlbnRMaXN0ZW5lciAqY3JlYXRlT1Byb2ZpbGVKSVRFdmVudExpc3RlbmVyKCkgeyByZXR1cm4gbnVsbHB0cjsgfQorCisgIHN0YXRpYyBKSVRFdmVudExpc3RlbmVyICpjcmVhdGVPUHJvZmlsZUpJVEV2ZW50TGlzdGVuZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9Qcm9maWxlV3JhcHBlciogQWx0ZXJuYXRpdmVJbXBsKSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyNlbmRpZiAvLyBVU0VfT1BST0ZJTEUKKworcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX0pJVEVWRU5UTElTVEVORVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvSklUU3ltYm9sLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9KSVRTeW1ib2wuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NmFiMTczCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvSklUU3ltYm9sLmgKQEAgLTAsMCArMSwzNDQgQEAKKy8vPT09LSBKSVRTeW1ib2wuaCAtIEpJVCBzeW1ib2wgYWJzdHJhY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQWJzdHJhY3Rpb24gZm9yIHRhcmdldCBwcm9jZXNzIGFkZHJlc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX0pJVFNZTUJPTF9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX0pJVFNZTUJPTF9ICisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEdsb2JhbFZhbHVlOworCituYW1lc3BhY2Ugb2JqZWN0IHsKKworY2xhc3MgQmFzaWNTeW1ib2xSZWY7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvYmplY3QKKworLy8vIEBicmllZiBSZXByZXNlbnRzIGFuIGFkZHJlc3MgaW4gdGhlIHRhcmdldCBwcm9jZXNzJ3MgYWRkcmVzcyBzcGFjZS4KK3VzaW5nIEpJVFRhcmdldEFkZHJlc3MgPSB1aW50NjRfdDsKKworLy8vIEBicmllZiBGbGFncyBmb3Igc3ltYm9scyBpbiB0aGUgSklULgorY2xhc3MgSklUU3ltYm9sRmxhZ3MgeworcHVibGljOgorICB1c2luZyBVbmRlcmx5aW5nVHlwZSA9IHVpbnQ4X3Q7CisgIHVzaW5nIFRhcmdldEZsYWdzVHlwZSA9IHVpbnQ2NF90OworCisgIGVudW0gRmxhZ05hbWVzIDogVW5kZXJseWluZ1R5cGUgeworICAgIE5vbmUgPSAwLAorICAgIEhhc0Vycm9yID0gMVUgPDwgMCwKKyAgICBXZWFrID0gMVUgPDwgMSwKKyAgICBDb21tb24gPSAxVSA8PCAyLAorICAgIEFic29sdXRlID0gMVUgPDwgMywKKyAgICBFeHBvcnRlZCA9IDFVIDw8IDQsCisgICAgTm90TWF0ZXJpYWxpemVkID0gMVUgPDwgNQorICB9OworCisgIHN0YXRpYyBKSVRTeW1ib2xGbGFncyBzdHJpcFRyYW5zaWVudEZsYWdzKEpJVFN5bWJvbEZsYWdzIE9yaWcpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8RmxhZ05hbWVzPihPcmlnLkZsYWdzICYgfk5vdE1hdGVyaWFsaXplZCk7CisgIH0KKworICAvLy8gQGJyaWVmIERlZmF1bHQtY29uc3RydWN0IGEgSklUU3ltYm9sRmxhZ3MgaW5zdGFuY2UuCisgIEpJVFN5bWJvbEZsYWdzKCkgPSBkZWZhdWx0OworCisgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGEgSklUU3ltYm9sRmxhZ3MgaW5zdGFuY2UgZnJvbSB0aGUgZ2l2ZW4gZmxhZ3MuCisgIEpJVFN5bWJvbEZsYWdzKEZsYWdOYW1lcyBGbGFncykgOiBGbGFncyhGbGFncykge30KKworICAvLy8gQGJyaWVmIENvbnN0cnVjdCBhIEpJVFN5bWJvbEZsYWdzIGluc3RhbmNlIGZyb20gdGhlIGdpdmVuIGZsYWdzIGFuZCB0YXJnZXQKKyAgLy8vICAgICAgICBmbGFncy4KKyAgSklUU3ltYm9sRmxhZ3MoRmxhZ05hbWVzIEZsYWdzLCBUYXJnZXRGbGFnc1R5cGUgVGFyZ2V0RmxhZ3MpCisgICAgOiBGbGFncyhGbGFncyksIFRhcmdldEZsYWdzKFRhcmdldEZsYWdzKSB7fQorCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlcmUgd2FzIGFuIGVycm9yIHJldHJpZXZpbmcgdGhpcyBzeW1ib2wuCisgIGJvb2wgaGFzRXJyb3IoKSBjb25zdCB7CisgICAgcmV0dXJuIChGbGFncyAmIEhhc0Vycm9yKSA9PSBIYXNFcnJvcjsKKyAgfQorCisgIC8vLyBAYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoaXMgc3ltYm9sIGhhcyBiZWVuIGZ1bGx5IG1hdGVyaWFsaXplZCAoaS5lLiBpcworICAvLy8gICAgICAgIGNhbGxhYmxlKS4KKyAgYm9vbCBpc01hdGVyaWFsaXplZCgpIGNvbnN0IHsgcmV0dXJuICEoRmxhZ3MgJiBOb3RNYXRlcmlhbGl6ZWQpOyB9CisKKyAgLy8vIEBicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIFdlYWsgZmxhZyBpcyBzZXQuCisgIGJvb2wgaXNXZWFrKCkgY29uc3QgeworICAgIHJldHVybiAoRmxhZ3MgJiBXZWFrKSA9PSBXZWFrOworICB9CisKKyAgLy8vIEBicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIENvbW1vbiBmbGFnIGlzIHNldC4KKyAgYm9vbCBpc0NvbW1vbigpIGNvbnN0IHsKKyAgICByZXR1cm4gKEZsYWdzICYgQ29tbW9uKSA9PSBDb21tb247CisgIH0KKworICAvLy8gQGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3ltYm9sIGlzbid0IHdlYWsgb3IgY29tbW9uLgorICBib29sIGlzU3Ryb25nKCkgY29uc3QgeworICAgIHJldHVybiAhaXNXZWFrKCkgJiYgIWlzQ29tbW9uKCk7CisgIH0KKworICAvLy8gQGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgRXhwb3J0ZWQgZmxhZyBpcyBzZXQuCisgIGJvb2wgaXNFeHBvcnRlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKEZsYWdzICYgRXhwb3J0ZWQpID09IEV4cG9ydGVkOworICB9CisKKyAgLy8vIEBicmllZiBJbXBsaWNpdGx5IGNvbnZlcnQgdG8gdGhlIHVuZGVybHlpbmcgZmxhZ3MgdHlwZS4KKyAgb3BlcmF0b3IgVW5kZXJseWluZ1R5cGUmKCkgeyByZXR1cm4gRmxhZ3M7IH0KKworICAvLy8gQGJyaWVmIEltcGxpY2l0bHkgY29udmVydCB0byB0aGUgdW5kZXJseWluZyBmbGFncyB0eXBlLgorICBvcGVyYXRvciBjb25zdCBVbmRlcmx5aW5nVHlwZSYoKSBjb25zdCB7IHJldHVybiBGbGFnczsgfQorCisgIC8vLyBAYnJpZWYgUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXJnZXQtc3BlY2lmaWMgZmxhZ3MuCisgIFRhcmdldEZsYWdzVHlwZSYgZ2V0VGFyZ2V0RmxhZ3MoKSB7IHJldHVybiBUYXJnZXRGbGFnczsgfQorCisgIC8vLyBAYnJpZWYgUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXJnZXQtc3BlY2lmaWMgZmxhZ3MuCisgIGNvbnN0IFRhcmdldEZsYWdzVHlwZSYgZ2V0VGFyZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBUYXJnZXRGbGFnczsgfQorCisgIC8vLyBDb25zdHJ1Y3QgYSBKSVRTeW1ib2xGbGFncyB2YWx1ZSBiYXNlZCBvbiB0aGUgZmxhZ3Mgb2YgdGhlIGdpdmVuIGdsb2JhbAorICAvLy8gdmFsdWUuCisgIHN0YXRpYyBKSVRTeW1ib2xGbGFncyBmcm9tR2xvYmFsVmFsdWUoY29uc3QgR2xvYmFsVmFsdWUgJkdWKTsKKworICAvLy8gQ29uc3RydWN0IGEgSklUU3ltYm9sRmxhZ3MgdmFsdWUgYmFzZWQgb24gdGhlIGZsYWdzIG9mIHRoZSBnaXZlbiBsaWJvYmplY3QKKyAgLy8vIHN5bWJvbC4KKyAgc3RhdGljIEpJVFN5bWJvbEZsYWdzIGZyb21PYmplY3RTeW1ib2woY29uc3Qgb2JqZWN0OjpCYXNpY1N5bWJvbFJlZiAmU3ltYm9sKTsKKworcHJpdmF0ZToKKyAgVW5kZXJseWluZ1R5cGUgRmxhZ3MgPSBOb25lOworICBUYXJnZXRGbGFnc1R5cGUgVGFyZ2V0RmxhZ3MgPSAwOworfTsKKworLy8vIEBicmllZiBBUk0tc3BlY2lmaWMgSklUIHN5bWJvbCBmbGFncy4KKy8vLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgbW92ZWQgaW50byBhIHRhcmdldC1zcGVjaWZpYyBoZWFkZXIuCitjbGFzcyBBUk1KSVRTeW1ib2xGbGFncyB7CitwdWJsaWM6CisgIEFSTUpJVFN5bWJvbEZsYWdzKCkgPSBkZWZhdWx0OworCisgIGVudW0gRmxhZ05hbWVzIHsKKyAgICBOb25lID0gMCwKKyAgICBUaHVtYiA9IDEgPDwgMAorICB9OworCisgIG9wZXJhdG9yIEpJVFN5bWJvbEZsYWdzOjpUYXJnZXRGbGFnc1R5cGUmKCkgeyByZXR1cm4gRmxhZ3M7IH0KKworICBzdGF0aWMgQVJNSklUU3ltYm9sRmxhZ3MgZnJvbU9iamVjdFN5bWJvbCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvYmplY3Q6OkJhc2ljU3ltYm9sUmVmICZTeW1ib2wpOworcHJpdmF0ZToKKyAgSklUU3ltYm9sRmxhZ3M6OlRhcmdldEZsYWdzVHlwZSBGbGFncyA9IDA7Cit9OworCisvLy8gQGJyaWVmIFJlcHJlc2VudHMgYSBzeW1ib2wgdGhhdCBoYXMgYmVlbiBldmFsdWF0ZWQgdG8gYW4gYWRkcmVzcyBhbHJlYWR5LgorY2xhc3MgSklURXZhbHVhdGVkU3ltYm9sIHsKK3B1YmxpYzoKKyAgSklURXZhbHVhdGVkU3ltYm9sKCkgPSBkZWZhdWx0OworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgJ251bGwnIHN5bWJvbC4KKyAgSklURXZhbHVhdGVkU3ltYm9sKHN0ZDo6bnVsbHB0cl90KSB7fQorCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgc3ltYm9sIGZvciB0aGUgZ2l2ZW4gYWRkcmVzcyBhbmQgZmxhZ3MuCisgIEpJVEV2YWx1YXRlZFN5bWJvbChKSVRUYXJnZXRBZGRyZXNzIEFkZHJlc3MsIEpJVFN5bWJvbEZsYWdzIEZsYWdzKQorICAgICAgOiBBZGRyZXNzKEFkZHJlc3MpLCBGbGFncyhGbGFncykge30KKworICAvLy8gQGJyaWVmIEFuIGV2YWx1YXRlZCBzeW1ib2wgY29udmVydHMgdG8gJ3RydWUnIGlmIGl0cyBhZGRyZXNzIGlzIG5vbi16ZXJvLgorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gQWRkcmVzcyAhPSAwOyB9CisKKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIGFkZHJlc3Mgb2YgdGhpcyBzeW1ib2wuCisgIEpJVFRhcmdldEFkZHJlc3MgZ2V0QWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIEFkZHJlc3M7IH0KKworICAvLy8gQGJyaWVmIFJldHVybiB0aGUgZmxhZ3MgZm9yIHRoaXMgc3ltYm9sLgorICBKSVRTeW1ib2xGbGFncyBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIEZsYWdzOyB9CisKK3ByaXZhdGU6CisgIEpJVFRhcmdldEFkZHJlc3MgQWRkcmVzcyA9IDA7CisgIEpJVFN5bWJvbEZsYWdzIEZsYWdzOworfTsKKworLy8vIEBicmllZiBSZXByZXNlbnRzIGEgc3ltYm9sIGluIHRoZSBKSVQuCitjbGFzcyBKSVRTeW1ib2wgeworcHVibGljOgorICB1c2luZyBHZXRBZGRyZXNzRnRvciA9IHN0ZDo6ZnVuY3Rpb248RXhwZWN0ZWQ8SklUVGFyZ2V0QWRkcmVzcz4oKT47CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSAnbnVsbCcgc3ltYm9sLCB1c2VkIHRvIHJlcHJlc2VudCBhICJzeW1ib2wgbm90IGZvdW5kIgorICAvLy8gICAgICAgIHJlc3VsdCBmcm9tIGEgc3VjY2Vzc2Z1bCAobm9uLWVycm9uZW91cykgbG9va3VwLgorICBKSVRTeW1ib2woc3RkOjpudWxscHRyX3QpCisgICAgICA6IENhY2hlZEFkZHIoMCkge30KKworICAvLy8gQGJyaWVmIENyZWF0ZSBhIEpJVFN5bWJvbCByZXByZXNlbnRpbmcgYW4gZXJyb3IgaW4gdGhlIHN5bWJvbCBsb29rdXAKKyAgLy8vICAgICAgICBwcm9jZXNzIChlLmcuIGEgbmV0d29yayBmYWlsdXJlIGR1cmluZyBhIHJlbW90ZSBsb29rdXApLgorICBKSVRTeW1ib2woRXJyb3IgRXJyKQorICAgIDogRXJyKHN0ZDo6bW92ZShFcnIpKSwgRmxhZ3MoSklUU3ltYm9sRmxhZ3M6Okhhc0Vycm9yKSB7fQorCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgc3ltYm9sIGZvciBhIGRlZmluaXRpb24gd2l0aCBhIGtub3duIGFkZHJlc3MuCisgIEpJVFN5bWJvbChKSVRUYXJnZXRBZGRyZXNzIEFkZHIsIEpJVFN5bWJvbEZsYWdzIEZsYWdzKQorICAgICAgOiBDYWNoZWRBZGRyKEFkZHIpLCBGbGFncyhGbGFncykge30KKworICAvLy8gQGJyaWVmIENvbnN0cnVjdCBhIEpJVFN5bWJvbCBmcm9tIGEgSklURXZhbHVhdGVkU3ltYm9sLgorICBKSVRTeW1ib2woSklURXZhbHVhdGVkU3ltYm9sIFN5bSkKKyAgICAgIDogQ2FjaGVkQWRkcihTeW0uZ2V0QWRkcmVzcygpKSwgRmxhZ3MoU3ltLmdldEZsYWdzKCkpIHt9CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBzeW1ib2wgZm9yIGEgZGVmaW5pdGlvbiB0aGF0IGRvZXNuJ3QgaGF2ZSBhIGtub3duIGFkZHJlc3MKKyAgLy8vICAgICAgICB5ZXQuCisgIC8vLyBAcGFyYW0gR2V0QWRkcmVzcyBBIGZ1bmN0b3IgdG8gbWF0ZXJpYWxpemUgYSBkZWZpbml0aW9uIChmaXhpbmcgdGhlCisgIC8vLyAgICAgICAgYWRkcmVzcykgb24gZGVtYW5kLgorICAvLy8KKyAgLy8vICAgVGhpcyBjb25zdHJ1Y3RvciBhbGxvd3MgYSBKSVQgbGF5ZXIgdG8gcHJvdmlkZSBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbAorICAvLy8gZGVmaW5pdGlvbiB3aXRob3V0IGFjdHVhbGx5IG1hdGVyaWFsaXppbmcgdGhlIGRlZmluaXRpb24gdXAgZnJvbnQuIFRoZQorICAvLy8gdXNlciBjYW4gbWF0ZXJpYWxpemUgdGhlIGRlZmluaXRpb24gYXQgYW55IHRpbWUgYnkgY2FsbGluZyB0aGUgZ2V0QWRkcmVzcworICAvLy8gbWV0aG9kLgorICBKSVRTeW1ib2woR2V0QWRkcmVzc0Z0b3IgR2V0QWRkcmVzcywgSklUU3ltYm9sRmxhZ3MgRmxhZ3MpCisgICAgICA6IEdldEFkZHJlc3Moc3RkOjptb3ZlKEdldEFkZHJlc3MpKSwgQ2FjaGVkQWRkcigwKSwgRmxhZ3MoRmxhZ3MpIHt9CisKKyAgSklUU3ltYm9sKGNvbnN0IEpJVFN5bWJvbCYpID0gZGVsZXRlOworICBKSVRTeW1ib2wmIG9wZXJhdG9yPShjb25zdCBKSVRTeW1ib2wmKSA9IGRlbGV0ZTsKKworICBKSVRTeW1ib2woSklUU3ltYm9sICYmT3RoZXIpCisgICAgOiBHZXRBZGRyZXNzKHN0ZDo6bW92ZShPdGhlci5HZXRBZGRyZXNzKSksIEZsYWdzKHN0ZDo6bW92ZShPdGhlci5GbGFncykpIHsKKyAgICBpZiAoRmxhZ3MuaGFzRXJyb3IoKSkKKyAgICAgIEVyciA9IHN0ZDo6bW92ZShPdGhlci5FcnIpOworICAgIGVsc2UKKyAgICAgIENhY2hlZEFkZHIgPSBzdGQ6Om1vdmUoT3RoZXIuQ2FjaGVkQWRkcik7CisgIH0KKworICBKSVRTeW1ib2wmIG9wZXJhdG9yPShKSVRTeW1ib2wgJiZPdGhlcikgeworICAgIEdldEFkZHJlc3MgPSBzdGQ6Om1vdmUoT3RoZXIuR2V0QWRkcmVzcyk7CisgICAgRmxhZ3MgPSBzdGQ6Om1vdmUoT3RoZXIuRmxhZ3MpOworICAgIGlmIChGbGFncy5oYXNFcnJvcigpKQorICAgICAgRXJyID0gc3RkOjptb3ZlKE90aGVyLkVycik7CisgICAgZWxzZQorICAgICAgQ2FjaGVkQWRkciA9IHN0ZDo6bW92ZShPdGhlci5DYWNoZWRBZGRyKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB+SklUU3ltYm9sKCkgeworICAgIGlmIChGbGFncy5oYXNFcnJvcigpKQorICAgICAgRXJyLn5FcnJvcigpOworICAgIGVsc2UKKyAgICAgIENhY2hlZEFkZHIufkpJVFRhcmdldEFkZHJlc3MoKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZSBzeW1ib2wgZXhpc3RzLCBmYWxzZSBvdGhlcndpc2UuCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgcmV0dXJuICFGbGFncy5oYXNFcnJvcigpICYmIChDYWNoZWRBZGRyIHx8IEdldEFkZHJlc3MpOworICB9CisKKyAgLy8vIEBicmllZiBNb3ZlIHRoZSBlcnJvciBmaWVsZCB2YWx1ZSBvdXQgb2YgdGhpcyBKSVRTeW1ib2wuCisgIEVycm9yIHRha2VFcnJvcigpIHsKKyAgICBpZiAoRmxhZ3MuaGFzRXJyb3IoKSkKKyAgICAgIHJldHVybiBzdGQ6Om1vdmUoRXJyKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBzeW1ib2wgaW4gdGhlIHRhcmdldCBhZGRyZXNzIHNwYWNlLiBSZXR1cm5zCisgIC8vLyAgICAgICAgJzAnIGlmIHRoZSBzeW1ib2wgZG9lcyBub3QgZXhpc3QuCisgIEV4cGVjdGVkPEpJVFRhcmdldEFkZHJlc3M+IGdldEFkZHJlc3MoKSB7CisgICAgYXNzZXJ0KCFGbGFncy5oYXNFcnJvcigpICYmICJnZXRBZGRyZXNzIGNhbGxlZCBvbiBlcnJvciB2YWx1ZSIpOworICAgIGlmIChHZXRBZGRyZXNzKSB7CisgICAgICBpZiAoYXV0byBDYWNoZWRBZGRyT3JFcnIgPSBHZXRBZGRyZXNzKCkpIHsKKyAgICAgICAgR2V0QWRkcmVzcyA9IG51bGxwdHI7CisgICAgICAgIENhY2hlZEFkZHIgPSAqQ2FjaGVkQWRkck9yRXJyOworICAgICAgICBhc3NlcnQoQ2FjaGVkQWRkciAmJiAiU3ltYm9sIGNvdWxkIG5vdCBiZSBtYXRlcmlhbGl6ZWQuIik7CisgICAgICB9IGVsc2UKKyAgICAgICAgcmV0dXJuIENhY2hlZEFkZHJPckVyci50YWtlRXJyb3IoKTsKKyAgICB9CisgICAgcmV0dXJuIENhY2hlZEFkZHI7CisgIH0KKworICBKSVRTeW1ib2xGbGFncyBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIEZsYWdzOyB9CisKK3ByaXZhdGU6CisgIEdldEFkZHJlc3NGdG9yIEdldEFkZHJlc3M7CisgIHVuaW9uIHsKKyAgICBKSVRUYXJnZXRBZGRyZXNzIENhY2hlZEFkZHI7CisgICAgRXJyb3IgRXJyOworICB9OworICBKSVRTeW1ib2xGbGFncyBGbGFnczsKK307CisKKy8vLyBAYnJpZWYgU3ltYm9sIHJlc29sdXRpb24gaW50ZXJmYWNlLgorLy8vCisvLy8gQWxsb3dzIHN5bWJvbCBmbGFncyBhbmQgYWRkcmVzc2VzIHRvIGJlIGxvb2tlZCB1cCBieSBuYW1lLgorLy8vIFN5bWJvbCBxdWVyaWVzIGFyZSBkb25lIGluIGJ1bGsgKGkuZS4geW91IHJlcXVlc3QgcmVzb2x1dGlvbiBvZiBhIHNldCBvZgorLy8vIHN5bWJvbHMsIHJhdGhlciB0aGFuIGEgc2luZ2xlIG9uZSkgdG8gcmVkdWNlIElQQyBvdmVyaGVhZCBpbiB0aGUgY2FzZSBvZgorLy8vIHJlbW90ZSBKSVRpbmcsIGFuZCBleHBvc2Ugb3Bwb3J0dW5pdGllcyBmb3IgcGFyYWxsZWwgY29tcGlsYXRpb24uCitjbGFzcyBKSVRTeW1ib2xSZXNvbHZlciB7CitwdWJsaWM6CisgIHVzaW5nIExvb2t1cFNldCA9IHN0ZDo6c2V0PFN0cmluZ1JlZj47CisgIHVzaW5nIExvb2t1cFJlc3VsdCA9IHN0ZDo6bWFwPFN0cmluZ1JlZiwgSklURXZhbHVhdGVkU3ltYm9sPjsKKyAgdXNpbmcgTG9va3VwRmxhZ3NSZXN1bHQgPSBzdGQ6Om1hcDxTdHJpbmdSZWYsIEpJVFN5bWJvbEZsYWdzPjsKKworICB2aXJ0dWFsIH5KSVRTeW1ib2xSZXNvbHZlcigpID0gZGVmYXVsdDsKKworICAvLy8gQGJyaWVmIFJldHVybnMgdGhlIGZ1bGx5IHJlc29sdmVkIGFkZHJlc3MgYW5kIGZsYWdzIGZvciBlYWNoIG9mIHRoZSBnaXZlbgorICAvLy8gICAgICAgIHN5bWJvbHMuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gYW4gZXJyb3IgaWYgYW55IG9mIHRoZSBnaXZlbiBzeW1ib2xzIGNhbiBub3QgYmUKKyAgLy8vIHJlc29sdmVkLCBvciBpZiB0aGUgcmVzb2x1dGlvbiBwcm9jZXNzIGl0c2VsZiB0cmlnZ2VycyBhbiBlcnJvci4KKyAgdmlydHVhbCBFeHBlY3RlZDxMb29rdXBSZXN1bHQ+IGxvb2t1cChjb25zdCBMb29rdXBTZXQgJlN5bWJvbHMpID0gMDsKKworICAvLy8gQGJyaWVmIFJldHVybnMgdGhlIHN5bWJvbCBmbGFncyBmb3IgZWFjaCBvZiB0aGUgZ2l2ZW4gc3ltYm9scy4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBkb2VzIE5PVCByZXR1cm4gYW4gZXJyb3IgaWYgYW55IG9mIHRoZSBnaXZlbiBzeW1ib2xzIGlzCisgIC8vLyBtaXNzaW5nLiBJbnN0ZWFkLCB0aGF0IHN5bWJvbCB3aWxsIGJlIGxlZnQgb3V0IG9mIHRoZSByZXN1bHQgbWFwLgorICB2aXJ0dWFsIEV4cGVjdGVkPExvb2t1cEZsYWdzUmVzdWx0PiBsb29rdXBGbGFncyhjb25zdCBMb29rdXBTZXQgJlN5bWJvbHMpID0gMDsKKworcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworfTsKKworLy8vIFxicmllZiBMZWdhY3kgc3ltYm9sIHJlc29sdXRpb24gaW50ZXJmYWNlLgorY2xhc3MgTGVnYWN5SklUU3ltYm9sUmVzb2x2ZXIgOiBwdWJsaWMgSklUU3ltYm9sUmVzb2x2ZXIgeworcHVibGljOgorICAvLy8gQGJyaWVmIFBlcmZvcm1zIGxvb2t1cCBieSwgZm9yIGVhY2ggc3ltYm9sLCBmaXJzdCBjYWxsaW5nCisgIC8vLyAgICAgICAgZmluZFN5bWJvbEluTG9naWNhbER5bGliIGFuZCBpZiB0aGF0IGZhaWxzIGNhbGxpbmcKKyAgLy8vICAgICAgICBmaW5kU3ltYm9sLgorICBFeHBlY3RlZDxMb29rdXBSZXN1bHQ+IGxvb2t1cChjb25zdCBMb29rdXBTZXQgJlN5bWJvbHMpIGZpbmFsOworCisgIC8vLyBAYnJpZWYgUGVyZm9ybXMgZmxhZ3MgbG9va3VwIGJ5IGNhbGxpbmcgZmluZFN5bWJvbEluTG9naWNhbER5bGliIGFuZAorICAvLy8gICAgICAgIHJldHVybmluZyB0aGUgZmxhZ3MgdmFsdWUgZm9yIHRoYXQgc3ltYm9sLgorICBFeHBlY3RlZDxMb29rdXBGbGFnc1Jlc3VsdD4gbG9va3VwRmxhZ3MoY29uc3QgTG9va3VwU2V0ICZTeW1ib2xzKSBmaW5hbDsKKworICAvLy8gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkIHN5bWJvbCBpZiBpdCBleGlzdHMKKyAgLy8vIHdpdGhpbiB0aGUgbG9naWNhbCBkeW5hbWljIGxpYnJhcnkgcmVwcmVzZW50ZWQgYnkgdGhpcyBKSVRTeW1ib2xSZXNvbHZlci4KKyAgLy8vIFVubGlrZSBmaW5kU3ltYm9sLCBxdWVyaWVzIHRocm91Z2ggdGhpcyBpbnRlcmZhY2Ugc2hvdWxkIHJldHVybiBhZGRyZXNzZXMKKyAgLy8vIGZvciBoaWRkZW4gc3ltYm9scy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIG9mIHBhcnRpY3VsYXIgaW1wb3J0YW5jZSBmb3IgdGhlIE9yYyBKSVQgQVBJcywgd2hpY2ggc3VwcG9ydCBsYXp5CisgIC8vLyBjb21waWxhdGlvbiBieSBicmVha2luZyB1cCBtb2R1bGVzOiBFYWNoIG9mIHRob3NlIGJyb2tlbiBvdXQgbW9kdWxlcworICAvLy8gbXVzdCBiZSBhYmxlIHRvIHJlc29sdmUgaGlkZGVuIHN5bWJvbHMgcHJvdmlkZWQgYnkgdGhlIG90aGVycy4gQ2xpZW50cworICAvLy8gd3JpdGluZyBtZW1vcnkgbWFuYWdlcnMgZm9yIE1DSklUIGNhbiB1c3VhbGx5IGlnbm9yZSB0aGlzIG1ldGhvZC4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCB3aWxsIGJlIHF1ZXJpZWQgYnkgUnVudGltZUR5bGQgd2hlbiBjaGVja2luZyBmb3IgcHJldmlvdXMKKyAgLy8vIGRlZmluaXRpb25zIG9mIGNvbW1vbiBzeW1ib2xzLgorICB2aXJ0dWFsIEpJVFN5bWJvbCBmaW5kU3ltYm9sSW5Mb2dpY2FsRHlsaWIoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpID0gMDsKKworICAvLy8gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIG9yIHZhcmlhYmxlLgorICAvLy8gSXQgaXMgdXNlZCB0byByZXNvbHZlIHN5bWJvbHMgZHVyaW5nIG1vZHVsZSBsaW5raW5nLgorICAvLy8KKyAgLy8vIElmIHRoZSByZXR1cm5lZCBzeW1ib2wncyBhZGRyZXNzIGlzIGVxdWFsIHRvIH4wVUxMIHRoZW4gUnVudGltZUR5bGQgd2lsbAorICAvLy8gc2tpcCBhbGwgcmVsb2NhdGlvbnMgZm9yIHRoYXQgc3ltYm9sLCBhbmQgdGhlIGNsaWVudCB3aWxsIGJlIHJlc3BvbnNpYmxlCisgIC8vLyBmb3IgaGFuZGxpbmcgdGhlbSBtYW51YWxseS4KKyAgdmlydHVhbCBKSVRTeW1ib2wgZmluZFN5bWJvbChjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgPSAwOworCitwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfSklUU1lNQk9MX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL01DSklULmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9NQ0pJVC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZGRiN2MKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9NQ0pJVC5oCkBAIC0wLDAgKzEsMzggQEAKKy8vPT09LS0gTUNKSVQuaCAtIE1DLUJhc2VkIEp1c3QtSW4tVGltZSBFeGVjdXRpb24gRW5naW5lIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGZvcmNlcyB0aGUgTUNKSVQgdG8gbGluayBpbiBvbiBjZXJ0YWluIG9wZXJhdGluZyBzeXN0ZW1zLgorLy8gKFdpbmRvd3MpLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfTUNKSVRfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9NQ0pJVF9ICisKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9FeGVjdXRpb25FbmdpbmUuaCIKKyNpbmNsdWRlIDxjc3RkbGliPgorCitleHRlcm4gIkMiIHZvaWQgTExWTUxpbmtJbk1DSklUKCk7CisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBGb3JjZU1DSklUTGlua2luZyB7CisgICAgRm9yY2VNQ0pJVExpbmtpbmcoKSB7CisgICAgICAvLyBXZSBtdXN0IHJlZmVyZW5jZSBNQ0pJVCBpbiBzdWNoIGEgd2F5IHRoYXQgY29tcGlsZXJzIHdpbGwgbm90CisgICAgICAvLyBkZWxldGUgaXQgYWxsIGFzIGRlYWQgY29kZSwgZXZlbiB3aXRoIHdob2xlIHByb2dyYW0gb3B0aW1pemF0aW9uLAorICAgICAgLy8geWV0IGlzIGVmZmVjdGl2ZWx5IGEgTk8tT1AuIEFzIHRoZSBjb21waWxlciBpc24ndCBzbWFydCBlbm91Z2gKKyAgICAgIC8vIHRvIGtub3cgdGhhdCBnZXRlbnYoKSBuZXZlciByZXR1cm5zIC0xLCB0aGlzIHdpbGwgZG8gdGhlIGpvYi4KKyAgICAgIGlmIChzdGQ6OmdldGVudigiYmFyIikgIT0gKGNoYXIqKSAtMSkKKyAgICAgICAgcmV0dXJuOworCisgICAgICBMTFZNTGlua0luTUNKSVQoKTsKKyAgICB9CisgIH0gRm9yY2VNQ0pJVExpbmtpbmc7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT1Byb2ZpbGVXcmFwcGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PUHJvZmlsZVdyYXBwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWRhNTk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT1Byb2ZpbGVXcmFwcGVyLmgKQEAgLTAsMCArMSwxMjQgQEAKKy8vPT09LS0gT1Byb2ZpbGVXcmFwcGVyLmggLSBPUHJvZmlsZSBKSVQgQVBJIFdyYXBwZXIgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIE9Qcm9maWxlV3JhcHBlciBvYmplY3QgdGhhdCBkZXRlY3RzIGlmIHRoZSBvcHJvZmlsZQorLy8gZGFlbW9uIGlzIHJ1bm5pbmcsIGFuZCBwcm92aWRlcyB3cmFwcGVycyBmb3Igb3BhZ2VudCBmdW5jdGlvbnMgdXNlZCB0bworLy8gY29tbXVuaWNhdGUgd2l0aCB0aGUgb3Byb2ZpbGUgSklUIGludGVyZmFjZS4gVGhlIGR5bmFtaWMgbGlicmFyeSBsaWJvcGFnZW50CisvLyBkb2VzIG5vdCBuZWVkIHRvIGJlIGxpbmtlZCBkaXJlY3RseSBhcyB0aGlzIG9iamVjdCBsYXppbHkgbG9hZHMgdGhlIGxpYnJhcnkKKy8vIHdoZW4gdGhlIGZpcnN0IG9wXyBmdW5jdGlvbiBpcyBjYWxsZWQuCisvLworLy8gU2VlIGh0dHA6Ly9vcHJvZmlsZS5zb3VyY2Vmb3JnZS5uZXQvZG9jL2RldmVsL2ppdC1pbnRlcmZhY2UuaHRtbCBmb3IgdGhlCisvLyBkZWZpbml0aW9uIG9mIHRoZSBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9PUFJPRklMRVdSQVBQRVJfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUFJPRklMRVdSQVBQRVJfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPG9wYWdlbnQuaD4KKworbmFtZXNwYWNlIGxsdm0geworCisKK2NsYXNzIE9Qcm9maWxlV3JhcHBlciB7CisgIHR5cGVkZWYgIG9wX2FnZW50X3QgICAgKCpvcF9vcGVuX2FnZW50X3B0cl90KSgpOworICB0eXBlZGVmICBpbnQgICAgICAgICAgICgqb3BfY2xvc2VfYWdlbnRfcHRyX3QpKG9wX2FnZW50X3QpOworICB0eXBlZGVmICBpbnQgICAgICAgICAgICgqb3Bfd3JpdGVfbmF0aXZlX2NvZGVfcHRyX3QpKG9wX2FnZW50X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBjb25zdCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQpOworICB0eXBlZGVmICBpbnQgICAgICAgICAgICgqb3Bfd3JpdGVfZGVidWdfbGluZV9pbmZvX3B0cl90KShvcF9hZ2VudF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCBjb25zdCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZGVidWdfbGluZV9pbmZvIGNvbnN0Kik7CisgIHR5cGVkZWYgIGludCAgICAgICAgICAgKCpvcF91bmxvYWRfbmF0aXZlX2NvZGVfcHRyX3QpKG9wX2FnZW50X3QsIHVpbnQ2NF90KTsKKworICAvLyBBbHNvIHVzZWQgZm9yIG9wX21pbm9yX3ZlcnNpb24gZnVuY3Rpb24gd2hpY2ggaGFzIHRoZSBzYW1lIHNpZ25hdHVyZQorICB0eXBlZGVmICBpbnQgICAgICAgICAgICgqb3BfbWFqb3JfdmVyc2lvbl9wdHJfdCkoKTsKKworICAvLyBUaGlzIGlzIG5vdCBhIHBhcnQgb2YgdGhlIG9wYWdlbnQgQVBJLCBidXQgaXMgdXNlZnVsIG5vbmV0aGVsZXNzCisgIHR5cGVkZWYgIGJvb2wgICAgICAgICAgKCpJc09Qcm9maWxlUnVubmluZ1B0clQpKCk7CisKKworICBvcF9hZ2VudF90ICAgICAgICAgICAgICAgICAgICAgIEFnZW50OworICBvcF9vcGVuX2FnZW50X3B0cl90ICAgICAgICAgICAgIE9wZW5BZ2VudEZ1bmM7CisgIG9wX2Nsb3NlX2FnZW50X3B0cl90ICAgICAgICAgICAgQ2xvc2VBZ2VudEZ1bmM7CisgIG9wX3dyaXRlX25hdGl2ZV9jb2RlX3B0cl90ICAgICAgV3JpdGVOYXRpdmVDb2RlRnVuYzsKKyAgb3Bfd3JpdGVfZGVidWdfbGluZV9pbmZvX3B0cl90ICBXcml0ZURlYnVnTGluZUluZm9GdW5jOworICBvcF91bmxvYWRfbmF0aXZlX2NvZGVfcHRyX3QgICAgIFVubG9hZE5hdGl2ZUNvZGVGdW5jOworICBvcF9tYWpvcl92ZXJzaW9uX3B0cl90ICAgICAgICAgIE1ham9yVmVyc2lvbkZ1bmM7CisgIG9wX21ham9yX3ZlcnNpb25fcHRyX3QgICAgICAgICAgTWlub3JWZXJzaW9uRnVuYzsKKyAgSXNPUHJvZmlsZVJ1bm5pbmdQdHJUICAgICAgICAgICBJc09Qcm9maWxlUnVubmluZ0Z1bmM7CisKKyAgYm9vbCBJbml0aWFsaXplZDsKKworcHVibGljOgorICBPUHJvZmlsZVdyYXBwZXIoKTsKKworICAvLyBGb3IgdGVzdGluZyB3aXRoIGEgbW9jayBvcGFnZW50IGltcGxlbWVudGF0aW9uLCBza2lwcyB0aGUgZHluYW1pYyBsb2FkIGFuZAorICAvLyB0aGUgZnVuY3Rpb24gcmVzb2x1dGlvbi4KKyAgT1Byb2ZpbGVXcmFwcGVyKG9wX29wZW5fYWdlbnRfcHRyX3QgT3BlbkFnZW50SW1wbCwKKyAgICAgICAgICAgICAgICAgIG9wX2Nsb3NlX2FnZW50X3B0cl90IENsb3NlQWdlbnRJbXBsLAorICAgICAgICAgICAgICAgICAgb3Bfd3JpdGVfbmF0aXZlX2NvZGVfcHRyX3QgV3JpdGVOYXRpdmVDb2RlSW1wbCwKKyAgICAgICAgICAgICAgICAgIG9wX3dyaXRlX2RlYnVnX2xpbmVfaW5mb19wdHJfdCBXcml0ZURlYnVnTGluZUluZm9JbXBsLAorICAgICAgICAgICAgICAgICAgb3BfdW5sb2FkX25hdGl2ZV9jb2RlX3B0cl90IFVubG9hZE5hdGl2ZUNvZGVJbXBsLAorICAgICAgICAgICAgICAgICAgb3BfbWFqb3JfdmVyc2lvbl9wdHJfdCBNYWpvclZlcnNpb25JbXBsLAorICAgICAgICAgICAgICAgICAgb3BfbWFqb3JfdmVyc2lvbl9wdHJfdCBNaW5vclZlcnNpb25JbXBsLAorICAgICAgICAgICAgICAgICAgSXNPUHJvZmlsZVJ1bm5pbmdQdHJUIE1vY2tJc09Qcm9maWxlUnVubmluZ0ltcGwgPSAwKQorICA6IE9wZW5BZ2VudEZ1bmMoT3BlbkFnZW50SW1wbCksCisgICAgQ2xvc2VBZ2VudEZ1bmMoQ2xvc2VBZ2VudEltcGwpLAorICAgIFdyaXRlTmF0aXZlQ29kZUZ1bmMoV3JpdGVOYXRpdmVDb2RlSW1wbCksCisgICAgV3JpdGVEZWJ1Z0xpbmVJbmZvRnVuYyhXcml0ZURlYnVnTGluZUluZm9JbXBsKSwKKyAgICBVbmxvYWROYXRpdmVDb2RlRnVuYyhVbmxvYWROYXRpdmVDb2RlSW1wbCksCisgICAgTWFqb3JWZXJzaW9uRnVuYyhNYWpvclZlcnNpb25JbXBsKSwKKyAgICBNaW5vclZlcnNpb25GdW5jKE1pbm9yVmVyc2lvbkltcGwpLAorICAgIElzT1Byb2ZpbGVSdW5uaW5nRnVuYyhNb2NrSXNPUHJvZmlsZVJ1bm5pbmdJbXBsKSwKKyAgICBJbml0aWFsaXplZCh0cnVlKQorICB7CisgIH0KKworICAvLyBDYWxscyBvcF9vcGVuX2FnZW50IGluIHRoZSBvcHJvZmlsZSBKSVQgbGlicmFyeSBhbmQgc2F2ZXMgdGhlIHJldHVybmVkCisgIC8vIG9wX2FnZW50X3QgaGFuZGxlIGludGVybmFsbHkgc28gaXQgY2FuIGJlIHVzZWQgd2hlbiBjYWxsaW5nIGFsbCB0aGUgb3RoZXIKKyAgLy8gb3BfKiBmdW5jdGlvbnMuIENhbGxlcnMgb2YgdGhpcyBjbGFzcyBkbyBub3QgbmVlZCB0byBrZWVwIHRyYWNrIG9mCisgIC8vIG9wX2FnZW50X3Qgb2JqZWN0cy4KKyAgYm9vbCBvcF9vcGVuX2FnZW50KCk7CisKKyAgaW50IG9wX2Nsb3NlX2FnZW50KCk7CisgIGludCBvcF93cml0ZV9uYXRpdmVfY29kZShjb25zdCBjaGFyKiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgY29uc3QqIGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBpbnQgc2l6ZSk7CisgIGludCBvcF93cml0ZV9kZWJ1Z19saW5lX2luZm8odm9pZCBjb25zdCogY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbnVtX2VudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGRlYnVnX2xpbmVfaW5mbyBjb25zdCogaW5mbyk7CisgIGludCBvcF91bmxvYWRfbmF0aXZlX2NvZGUodWludDY0X3QgYWRkcik7CisgIGludCBvcF9tYWpvcl92ZXJzaW9uKCk7CisgIGludCBvcF9taW5vcl92ZXJzaW9uKCk7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBvcHJvZmlsZWQgcHJvY2VzcyBpcyBydW5uaW5nLCB0aGUgb3BhZ2VudCBsaWJyYXJ5IGlzCisgIC8vIGxvYWRlZCBhbmQgYSBjb25uZWN0aW9uIHRvIHRoZSBhZ2VudCBoYXMgYmVlbiBlc3RhYmxpc2hlZCwgYW5kIGZhbHNlCisgIC8vIG90aGVyd2lzZS4KKyAgYm9vbCBpc0FnZW50QXZhaWxhYmxlKCk7CisKK3ByaXZhdGU6CisgIC8vIExvYWRzIHRoZSBsaWJvcGFnZW50IGxpYnJhcnkgYW5kIGluaXRpYWxpemVzIHRoaXMgd3JhcHBlciBpZiB0aGUgb3Byb2ZpbGUKKyAgLy8gZGFlbW9uIGlzIHJ1bm5pbmcKKyAgYm9vbCBpbml0aWFsaXplKCk7CisKKyAgLy8gU2VhcmNoZXMgL3Byb2MgZm9yIHRoZSBvcHJvZmlsZSBkYWVtb24gYW5kIHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJvY2VzcyBpZgorICAvLyBmb3VuZCwgb3IgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIGNoZWNrRm9yT1Byb2ZpbGVQcm9jRW50cnkoKTsKKworICBib29sIGlzT1Byb2ZpbGVSdW5uaW5nKCk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0VYRUNVVElPTkVOR0lORV9PUFJPRklMRVdSQVBQRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT2JqZWN0Q2FjaGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09iamVjdENhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc3MDQ0NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09iamVjdENhY2hlLmgKQEAgLTAsMCArMSw0MiBAQAorLy89PT0tLSBPYmplY3RDYWNoZS5oIC0gQ2xhc3MgZGVmaW5pdGlvbiBmb3IgdGhlIE9iamVjdENhY2hlIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9PQkpFQ1RDQUNIRV9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09CSkVDVENBQ0hFX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTW9kdWxlOworCisvLy8gVGhpcyBpcyB0aGUgYmFzZSBPYmplY3RDYWNoZSB0eXBlIHdoaWNoIGNhbiBiZSBwcm92aWRlZCB0byBhbgorLy8vIEV4ZWN1dGlvbkVuZ2luZSBmb3IgdGhlIHB1cnBvc2Ugb2YgYXZvaWRpbmcgY29tcGlsYXRpb24gZm9yIE1vZHVsZXMgdGhhdAorLy8vIGhhdmUgYWxyZWFkeSBiZWVuIGNvbXBpbGVkIGFuZCBhbiBvYmplY3QgZmlsZSBpcyBhdmFpbGFibGUuCitjbGFzcyBPYmplY3RDYWNoZSB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHVibGljOgorICBPYmplY3RDYWNoZSgpID0gZGVmYXVsdDsKKworICB2aXJ0dWFsIH5PYmplY3RDYWNoZSgpID0gZGVmYXVsdDsKKworICAvLy8gbm90aWZ5T2JqZWN0Q29tcGlsZWQgLSBQcm92aWRlcyBhIHBvaW50ZXIgdG8gY29tcGlsZWQgY29kZSBmb3IgTW9kdWxlIE0uCisgIHZpcnR1YWwgdm9pZCBub3RpZnlPYmplY3RDb21waWxlZChjb25zdCBNb2R1bGUgKk0sIE1lbW9yeUJ1ZmZlclJlZiBPYmopID0gMDsKKworICAvLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBuZXdseSBhbGxvY2F0ZWQgTWVtb3J5QnVmZmVyIHRoYXQgY29udGFpbnMgdGhlCisgIC8vLyBvYmplY3Qgd2hpY2ggY29ycmVzcG9uZHMgd2l0aCBNb2R1bGUgTSwgb3IgMCBpZiBhbiBvYmplY3QgaXMgbm90CisgIC8vLyBhdmFpbGFibGUuCisgIHZpcnR1YWwgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gZ2V0T2JqZWN0KGNvbnN0IE1vZHVsZSogTSkgPSAwOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09CSkVDVENBQ0hFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09iamVjdE1lbW9yeUJ1ZmZlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT2JqZWN0TWVtb3J5QnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwMGFkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09iamVjdE1lbW9yeUJ1ZmZlci5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vPT09LSBPYmplY3RNZW1vcnlCdWZmZXIuaCAtIFNtYWxsVmVjdG9yLWJhY2tlZCBNZW1vcnlCdWZmcmVyICAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIGEgd3JhcHBlciBjbGFzcyB0byBob2xkIHRoZSBtZW1vcnkgaW50byB3aGljaCBhbgorLy8gb2JqZWN0IHdpbGwgYmUgZ2VuZXJhdGVkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT0JKRUNUTUVNT1JZQlVGRkVSX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfT0JKRUNUTUVNT1JZQlVGRkVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBcYnJpZWYgU21hbGxWZWN0b3ItYmFja2VkIE1lbW9yeUJ1ZmZlciBpbnN0YW5jZS4KKy8vLworLy8vIFRoaXMgY2xhc3MgZW5hYmxlcyBlZmZpY2llbnQgY29uc3RydWN0aW9uIG9mIE1lbW9yeUJ1ZmZlcnMgZnJvbSBTbWFsbFZlY3RvcgorLy8vIGluc3RhbmNlcy4gVGhpcyBpcyB1c2VmdWwgZm9yIE1DSklUIGFuZCBPcmMsIHdoZXJlIG9iamVjdCBmaWxlcyBhcmUgc3RyZWFtZWQKKy8vLyBpbnRvIFNtYWxsVmVjdG9ycywgdGhlbiBpbnNwZWN0ZWQgdXNpbmcgT2JqZWN0RmlsZSAod2hpY2ggdGFrZXMgYQorLy8vIE1lbW9yeUJ1ZmZlcikuCitjbGFzcyBPYmplY3RNZW1vcnlCdWZmZXIgOiBwdWJsaWMgTWVtb3J5QnVmZmVyIHsKK3B1YmxpYzoKKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBPYmplY3RNZW1vcnlCdWZmZXIgZnJvbSB0aGUgZ2l2ZW4gU21hbGxWZWN0b3Igci12YWx1ZS4KKyAgLy8vCisgIC8vLyBGSVhNRTogSXQnZCBiZSBuaWNlIGZvciB0aGlzIHRvIGJlIGEgbm9uLXRlbXBsYXRlZCBjb25zdHJ1Y3RvciB0YWtpbmcgYQorICAvLy8gU21hbGxWZWN0b3JJbXBsIGhlcmUgaW5zdGVhZCBvZiBhIHRlbXBsYXRlZCBvbmUgdGFraW5nIGEgU21hbGxWZWN0b3I8Tj4sCisgIC8vLyBidXQgU21hbGxWZWN0b3IncyBtb3ZlLWNvbnN0cnVjdGlvbi9hc3NpZ25tZW50IGN1cnJlbnRseSBvbmx5IHRha2UKKyAgLy8vIFNtYWxsVmVjdG9ycy4gSWYvd2hlbiB0aGF0IGlzIGZpeGVkIHdlIGNhbiBzaW1wbGlmeSB0aGlzIGNvbnN0cnVjdG9yIGFuZAorICAvLy8gdGhlIGZvbGxvd2luZyBvbmUuCisgIE9iamVjdE1lbW9yeUJ1ZmZlcihTbWFsbFZlY3RvckltcGw8Y2hhcj4gJiZTVikKKyAgICA6IFNWKHN0ZDo6bW92ZShTVikpLCBCdWZmZXJOYW1lKCI8aW4tbWVtb3J5IG9iamVjdD4iKSB7CisgICAgaW5pdCh0aGlzLT5TVi5iZWdpbigpLCB0aGlzLT5TVi5lbmQoKSwgZmFsc2UpOworICB9CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBuYW1lZCBPYmplY3RNZW1vcnlCdWZmZXIgZnJvbSB0aGUgZ2l2ZW4gU21hbGxWZWN0b3IKKyAgLy8vICAgICAgICByLXZhbHVlIGFuZCBTdHJpbmdSZWYuCisgIE9iamVjdE1lbW9yeUJ1ZmZlcihTbWFsbFZlY3RvckltcGw8Y2hhcj4gJiZTViwgU3RyaW5nUmVmIE5hbWUpCisgICAgOiBTVihzdGQ6Om1vdmUoU1YpKSwgQnVmZmVyTmFtZShOYW1lKSB7CisgICAgaW5pdCh0aGlzLT5TVi5iZWdpbigpLCB0aGlzLT5TVi5lbmQoKSwgZmFsc2UpOworICB9CisKKyAgU3RyaW5nUmVmIGdldEJ1ZmZlcklkZW50aWZpZXIoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBCdWZmZXJOYW1lOyB9CisKKyAgQnVmZmVyS2luZCBnZXRCdWZmZXJLaW5kKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gTWVtb3J5QnVmZmVyX01hbGxvYzsgfQorCitwcml2YXRlOgorICBTbWFsbFZlY3RvcjxjaGFyLCAwPiBTVjsKKyAgc3RkOjpzdHJpbmcgQnVmZmVyTmFtZTsKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvQ29tcGlsZU9uRGVtYW5kTGF5ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9Db21waWxlT25EZW1hbmRMYXllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NGE2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvQ29tcGlsZU9uRGVtYW5kTGF5ZXIuaApAQCAtMCwwICsxLDY4MSBAQAorLy89PT0tIENvbXBpbGVPbkRlbWFuZExheWVyLmggLSBDb21waWxlIGVhY2ggZnVuY3Rpb24gb24gZGVtYW5kIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBKSVQgbGF5ZXIgZm9yIGJyZWFraW5nIHVwIG1vZHVsZXMgYW5kIGluc2VydGluZyBjYWxsYmFja3MgdG8gYWxsb3cKKy8vIGluZGl2aWR1YWwgZnVuY3Rpb25zIHRvIGJlIGNvbXBpbGVkIG9uIGRlbWFuZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19DT01QSUxFT05ERU1BTkRMQVlFUl9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19DT01QSUxFT05ERU1BTkRMQVlFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvSklUU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0NvcmUuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvSW5kaXJlY3Rpb25VdGlscy5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9MYW1iZGFSZXNvbHZlci5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9PcmNFcnJvci5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL1J1bnRpbWVEeWxkLmgiCisjaW5jbHVkZSAibGx2bS9JUi9BdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudC5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EYXRhTGF5b3V0LmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsQWxpYXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbFZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9HbG9iYWxWYXJpYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL01hbmdsZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1ZhbHVlTWFwcGVyLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFZhbHVlOworCituYW1lc3BhY2Ugb3JjIHsKKworLy8vIEBicmllZiBDb21waWxlLW9uLWRlbWFuZCBsYXllci4KKy8vLworLy8vICAgV2hlbiBhIG1vZHVsZSBpcyBhZGRlZCB0byB0aGlzIGxheWVyIGEgc3R1YiBpcyBjcmVhdGVkIGZvciBlYWNoIG9mIGl0cworLy8vIGZ1bmN0aW9uIGRlZmluaXRpb25zLiBUaGUgc3R1YnMgYW5kIG90aGVyIGdsb2JhbCB2YWx1ZXMgYXJlIGltbWVkaWF0ZWx5CisvLy8gYWRkZWQgdG8gdGhlIGxheWVyIGJlbG93LiBXaGVuIGEgc3R1YiBpcyBjYWxsZWQgaXQgdHJpZ2dlcnMgdGhlIGV4dHJhY3Rpb24KKy8vLyBvZiB0aGUgZnVuY3Rpb24gYm9keSBmcm9tIHRoZSBvcmlnaW5hbCBtb2R1bGUuIFRoZSBleHRyYWN0ZWQgYm9keSBpcyB0aGVuCisvLy8gY29tcGlsZWQgYW5kIGV4ZWN1dGVkLgordGVtcGxhdGUgPHR5cGVuYW1lIEJhc2VMYXllclQsCisgICAgICAgICAgdHlwZW5hbWUgQ29tcGlsZUNhbGxiYWNrTWdyVCA9IEpJVENvbXBpbGVDYWxsYmFja01hbmFnZXIsCisgICAgICAgICAgdHlwZW5hbWUgSW5kaXJlY3RTdHVic01nclQgPSBJbmRpcmVjdFN0dWJzTWFuYWdlcj4KK2NsYXNzIENvbXBpbGVPbkRlbWFuZExheWVyIHsKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRlcmlhbGl6ZXJGdG9yPgorICBjbGFzcyBMYW1iZGFNYXRlcmlhbGl6ZXIgZmluYWwgOiBwdWJsaWMgVmFsdWVNYXRlcmlhbGl6ZXIgeworICBwdWJsaWM6CisgICAgTGFtYmRhTWF0ZXJpYWxpemVyKE1hdGVyaWFsaXplckZ0b3IgTSkgOiBNKHN0ZDo6bW92ZShNKSkge30KKworICAgIFZhbHVlICptYXRlcmlhbGl6ZShWYWx1ZSAqVikgZmluYWwgeyByZXR1cm4gTShWKTsgfQorCisgIHByaXZhdGU6CisgICAgTWF0ZXJpYWxpemVyRnRvciBNOworICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNYXRlcmlhbGl6ZXJGdG9yPgorICBMYW1iZGFNYXRlcmlhbGl6ZXI8TWF0ZXJpYWxpemVyRnRvcj4KKyAgY3JlYXRlTGFtYmRhTWF0ZXJpYWxpemVyKE1hdGVyaWFsaXplckZ0b3IgTSkgeworICAgIHJldHVybiBMYW1iZGFNYXRlcmlhbGl6ZXI8TWF0ZXJpYWxpemVyRnRvcj4oc3RkOjptb3ZlKE0pKTsKKyAgfQorCisgIC8vIFByb3ZpZGUgdHlwZS1lcmFzdXJlIGZvciB0aGUgTW9kdWxlcyBhbmQgTWVtb3J5TWFuYWdlcnMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSZXNvdXJjZVQ+CisgIGNsYXNzIFJlc291cmNlT3duZXIgeworICBwdWJsaWM6CisgICAgUmVzb3VyY2VPd25lcigpID0gZGVmYXVsdDsKKyAgICBSZXNvdXJjZU93bmVyKGNvbnN0IFJlc291cmNlT3duZXIgJikgPSBkZWxldGU7CisgICAgUmVzb3VyY2VPd25lciAmb3BlcmF0b3I9KGNvbnN0IFJlc291cmNlT3duZXIgJikgPSBkZWxldGU7CisgICAgdmlydHVhbCB+UmVzb3VyY2VPd25lcigpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgUmVzb3VyY2VUJiBnZXRSZXNvdXJjZSgpIGNvbnN0ID0gMDsKKyAgfTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzb3VyY2VULCB0eXBlbmFtZSBSZXNvdXJjZVB0clQ+CisgIGNsYXNzIFJlc291cmNlT3duZXJJbXBsIDogcHVibGljIFJlc291cmNlT3duZXI8UmVzb3VyY2VUPiB7CisgIHB1YmxpYzoKKyAgICBSZXNvdXJjZU93bmVySW1wbChSZXNvdXJjZVB0clQgUmVzb3VyY2VQdHIpCisgICAgICA6IFJlc291cmNlUHRyKHN0ZDo6bW92ZShSZXNvdXJjZVB0cikpIHt9CisKKyAgICBSZXNvdXJjZVQmIGdldFJlc291cmNlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gKlJlc291cmNlUHRyOyB9CisKKyAgcHJpdmF0ZToKKyAgICBSZXNvdXJjZVB0clQgUmVzb3VyY2VQdHI7CisgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc291cmNlVCwgdHlwZW5hbWUgUmVzb3VyY2VQdHJUPgorICBzdGQ6OnVuaXF1ZV9wdHI8UmVzb3VyY2VPd25lcjxSZXNvdXJjZVQ+PgorICB3cmFwT3duZXJzaGlwKFJlc291cmNlUHRyVCBSZXNvdXJjZVB0cikgeworICAgIHVzaW5nIFJPID0gUmVzb3VyY2VPd25lckltcGw8UmVzb3VyY2VULCBSZXNvdXJjZVB0clQ+OworICAgIHJldHVybiBsbHZtOjptYWtlX3VuaXF1ZTxSTz4oc3RkOjptb3ZlKFJlc291cmNlUHRyKSk7CisgIH0KKworICBjbGFzcyBTdGF0aWNHbG9iYWxSZW5hbWVyIHsKKyAgcHVibGljOgorICAgIFN0YXRpY0dsb2JhbFJlbmFtZXIoKSA9IGRlZmF1bHQ7CisgICAgU3RhdGljR2xvYmFsUmVuYW1lcihTdGF0aWNHbG9iYWxSZW5hbWVyICYmKSA9IGRlZmF1bHQ7CisgICAgU3RhdGljR2xvYmFsUmVuYW1lciAmb3BlcmF0b3I9KFN0YXRpY0dsb2JhbFJlbmFtZXIgJiYpID0gZGVmYXVsdDsKKworICAgIHZvaWQgcmVuYW1lKE1vZHVsZSAmTSkgeworICAgICAgZm9yIChhdXRvICZGIDogTSkKKyAgICAgICAgaWYgKEYuaGFzTG9jYWxMaW5rYWdlKCkpCisgICAgICAgICAgRi5zZXROYW1lKCIkc3RhdGljLiIgKyBUd2luZShOZXh0SWQrKykpOworICAgICAgZm9yIChhdXRvICZHIDogTS5nbG9iYWxzKCkpCisgICAgICAgIGlmIChHLmhhc0xvY2FsTGlua2FnZSgpKQorICAgICAgICAgIEcuc2V0TmFtZSgiJHN0YXRpYy4iICsgVHdpbmUoTmV4dElkKyspKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB1bnNpZ25lZCBOZXh0SWQgPSAwOworICB9OworCisgIHN0cnVjdCBMb2dpY2FsRHlsaWIgeworICAgIHN0cnVjdCBTb3VyY2VNb2R1bGVFbnRyeSB7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBTb3VyY2VNb2Q7CisgICAgICBzdGQ6OnNldDxGdW5jdGlvbio+IFN0dWJzVG9DbG9uZTsKKyAgICB9OworCisgICAgdXNpbmcgU291cmNlTW9kdWxlc0xpc3QgPSBzdGQ6OnZlY3RvcjxTb3VyY2VNb2R1bGVFbnRyeT47CisgICAgdXNpbmcgU291cmNlTW9kdWxlSGFuZGxlID0gdHlwZW5hbWUgU291cmNlTW9kdWxlc0xpc3Q6OnNpemVfdHlwZTsKKworICAgIExvZ2ljYWxEeWxpYigpID0gZGVmYXVsdDsKKworICAgIExvZ2ljYWxEeWxpYihWTW9kdWxlS2V5IEssIHN0ZDo6c2hhcmVkX3B0cjxTeW1ib2xSZXNvbHZlcj4gQmFja2luZ1Jlc29sdmVyLAorICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5kaXJlY3RTdHVic01nclQ+IFN0dWJzTWdyKQorICAgICAgICA6IEsoc3RkOjptb3ZlKEspKSwgQmFja2luZ1Jlc29sdmVyKHN0ZDo6bW92ZShCYWNraW5nUmVzb2x2ZXIpKSwKKyAgICAgICAgICBTdHVic01ncihzdGQ6Om1vdmUoU3R1YnNNZ3IpKSB7fQorCisgICAgU291cmNlTW9kdWxlSGFuZGxlIGFkZFNvdXJjZU1vZHVsZShzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBNKSB7CisgICAgICBTb3VyY2VNb2R1bGVIYW5kbGUgSCA9IFNvdXJjZU1vZHVsZXMuc2l6ZSgpOworICAgICAgU291cmNlTW9kdWxlcy5wdXNoX2JhY2soU291cmNlTW9kdWxlRW50cnkoKSk7CisgICAgICBTb3VyY2VNb2R1bGVzLmJhY2soKS5Tb3VyY2VNb2QgPSBzdGQ6Om1vdmUoTSk7CisgICAgICByZXR1cm4gSDsKKyAgICB9CisKKyAgICBNb2R1bGUmIGdldFNvdXJjZU1vZHVsZShTb3VyY2VNb2R1bGVIYW5kbGUgSCkgeworICAgICAgcmV0dXJuICpTb3VyY2VNb2R1bGVzW0hdLlNvdXJjZU1vZDsKKyAgICB9CisKKyAgICBzdGQ6OnNldDxGdW5jdGlvbio+JiBnZXRTdHVic1RvQ2xvbmUoU291cmNlTW9kdWxlSGFuZGxlIEgpIHsKKyAgICAgIHJldHVybiBTb3VyY2VNb2R1bGVzW0hdLlN0dWJzVG9DbG9uZTsKKyAgICB9CisKKyAgICBKSVRTeW1ib2wgZmluZFN5bWJvbChCYXNlTGF5ZXJUICZCYXNlTGF5ZXIsIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXhwb3J0ZWRTeW1ib2xzT25seSkgeworICAgICAgaWYgKGF1dG8gU3ltID0gU3R1YnNNZ3ItPmZpbmRTdHViKE5hbWUsIEV4cG9ydGVkU3ltYm9sc09ubHkpKQorICAgICAgICByZXR1cm4gU3ltOworICAgICAgZm9yIChhdXRvIEJMSyA6IEJhc2VMYXllclZNb2R1bGVLZXlzKQorICAgICAgICBpZiAoYXV0byBTeW0gPSBCYXNlTGF5ZXIuZmluZFN5bWJvbEluKEJMSywgTmFtZSwgRXhwb3J0ZWRTeW1ib2xzT25seSkpCisgICAgICAgICAgcmV0dXJuIFN5bTsKKyAgICAgICAgZWxzZSBpZiAoYXV0byBFcnIgPSBTeW0udGFrZUVycm9yKCkpCisgICAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShFcnIpOworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfQorCisgICAgRXJyb3IgcmVtb3ZlTW9kdWxlc0Zyb21CYXNlTGF5ZXIoQmFzZUxheWVyVCAmQmFzZUxheWVyKSB7CisgICAgICBmb3IgKGF1dG8gJkJMSyA6IEJhc2VMYXllclZNb2R1bGVLZXlzKQorICAgICAgICBpZiAoYXV0byBFcnIgPSBCYXNlTGF5ZXIucmVtb3ZlTW9kdWxlKEJMSykpCisgICAgICAgICAgcmV0dXJuIEVycjsKKyAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICAgIH0KKworICAgIFZNb2R1bGVLZXkgSzsKKyAgICBzdGQ6OnNoYXJlZF9wdHI8U3ltYm9sUmVzb2x2ZXI+IEJhY2tpbmdSZXNvbHZlcjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8SW5kaXJlY3RTdHVic01nclQ+IFN0dWJzTWdyOworICAgIFN0YXRpY0dsb2JhbFJlbmFtZXIgU3RhdGljUmVuYW1lcjsKKyAgICBTb3VyY2VNb2R1bGVzTGlzdCBTb3VyY2VNb2R1bGVzOworICAgIHN0ZDo6dmVjdG9yPFZNb2R1bGVLZXk+IEJhc2VMYXllclZNb2R1bGVLZXlzOworICB9OworCitwdWJsaWM6CisKKyAgLy8vIEBicmllZiBNb2R1bGUgcGFydGl0aW9uaW5nIGZ1bmN0b3IuCisgIHVzaW5nIFBhcnRpdGlvbmluZ0Z0b3IgPSBzdGQ6OmZ1bmN0aW9uPHN0ZDo6c2V0PEZ1bmN0aW9uKj4oRnVuY3Rpb24mKT47CisKKyAgLy8vIEBicmllZiBCdWlsZGVyIGZvciBJbmRpcmVjdFN0dWJzTWFuYWdlcnMuCisgIHVzaW5nIEluZGlyZWN0U3R1YnNNYW5hZ2VyQnVpbGRlclQgPQorICAgICAgc3RkOjpmdW5jdGlvbjxzdGQ6OnVuaXF1ZV9wdHI8SW5kaXJlY3RTdHVic01nclQ+KCk+OworCisgIHVzaW5nIFN5bWJvbFJlc29sdmVyR2V0dGVyID0KKyAgICAgIHN0ZDo6ZnVuY3Rpb248c3RkOjpzaGFyZWRfcHRyPFN5bWJvbFJlc29sdmVyPihWTW9kdWxlS2V5IEspPjsKKworICB1c2luZyBTeW1ib2xSZXNvbHZlclNldHRlciA9CisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoVk1vZHVsZUtleSBLLCBzdGQ6OnNoYXJlZF9wdHI8U3ltYm9sUmVzb2x2ZXI+IFIpPjsKKworICAvLy8gQGJyaWVmIENvbnN0cnVjdCBhIGNvbXBpbGUtb24tZGVtYW5kIGxheWVyIGluc3RhbmNlLgorICBDb21waWxlT25EZW1hbmRMYXllcihFeGVjdXRpb25TZXNzaW9uICZFUywgQmFzZUxheWVyVCAmQmFzZUxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xSZXNvbHZlckdldHRlciBHZXRTeW1ib2xSZXNvbHZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sUmVzb2x2ZXJTZXR0ZXIgU2V0U3ltYm9sUmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIFBhcnRpdGlvbmluZ0Z0b3IgUGFydGl0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBDb21waWxlQ2FsbGJhY2tNZ3JUICZDYWxsYmFja01nciwKKyAgICAgICAgICAgICAgICAgICAgICAgSW5kaXJlY3RTdHVic01hbmFnZXJCdWlsZGVyVCBDcmVhdGVJbmRpcmVjdFN0dWJzTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDbG9uZVN0dWJzSW50b1BhcnRpdGlvbnMgPSB0cnVlKQorICAgICAgOiBFUyhFUyksIEJhc2VMYXllcihCYXNlTGF5ZXIpLAorICAgICAgICBHZXRTeW1ib2xSZXNvbHZlcihzdGQ6Om1vdmUoR2V0U3ltYm9sUmVzb2x2ZXIpKSwKKyAgICAgICAgU2V0U3ltYm9sUmVzb2x2ZXIoc3RkOjptb3ZlKFNldFN5bWJvbFJlc29sdmVyKSksCisgICAgICAgIFBhcnRpdGlvbihzdGQ6Om1vdmUoUGFydGl0aW9uKSksIENvbXBpbGVDYWxsYmFja01ncihDYWxsYmFja01nciksCisgICAgICAgIENyZWF0ZUluZGlyZWN0U3R1YnNNYW5hZ2VyKHN0ZDo6bW92ZShDcmVhdGVJbmRpcmVjdFN0dWJzTWFuYWdlcikpLAorICAgICAgICBDbG9uZVN0dWJzSW50b1BhcnRpdGlvbnMoQ2xvbmVTdHVic0ludG9QYXJ0aXRpb25zKSB7fQorCisgIH5Db21waWxlT25EZW1hbmRMYXllcigpIHsKKyAgICAvLyBGSVhNRTogUmVwb3J0IGVycm9yIG9uIGxvZy4KKyAgICB3aGlsZSAoIUxvZ2ljYWxEeWxpYnMuZW1wdHkoKSkKKyAgICAgIGNvbnN1bWVFcnJvcihyZW1vdmVNb2R1bGUoTG9naWNhbER5bGlicy5iZWdpbigpLT5maXJzdCkpOworICB9CisKKyAgLy8vIEBicmllZiBBZGQgYSBtb2R1bGUgdG8gdGhlIGNvbXBpbGUtb24tZGVtYW5kIGxheWVyLgorICBFcnJvciBhZGRNb2R1bGUoVk1vZHVsZUtleSBLLCBzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBNKSB7CisKKyAgICBhc3NlcnQoIUxvZ2ljYWxEeWxpYnMuY291bnQoSykgJiYgIlZNb2R1bGVLZXkgSyBhbHJlYWR5IGluIHVzZSIpOworICAgIGF1dG8gSSA9IExvZ2ljYWxEeWxpYnMuaW5zZXJ0KAorICAgICAgICBMb2dpY2FsRHlsaWJzLmVuZCgpLAorICAgICAgICBzdGQ6Om1ha2VfcGFpcihLLCBMb2dpY2FsRHlsaWIoSywgR2V0U3ltYm9sUmVzb2x2ZXIoSyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcmVhdGVJbmRpcmVjdFN0dWJzTWFuYWdlcigpKSkpOworCisgICAgcmV0dXJuIGFkZExvZ2ljYWxNb2R1bGUoSS0+c2Vjb25kLCBzdGQ6Om1vdmUoTSkpOworICB9CisKKyAgLy8vIEBicmllZiBBZGQgZXh0cmEgbW9kdWxlcyB0byBhbiBleGlzdGluZyBsb2dpY2FsIG1vZHVsZS4KKyAgRXJyb3IgYWRkRXh0cmFNb2R1bGUoVk1vZHVsZUtleSBLLCBzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBNKSB7CisgICAgcmV0dXJuIGFkZExvZ2ljYWxNb2R1bGUoTG9naWNhbER5bGlic1tLXSwgc3RkOjptb3ZlKE0pKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgUmVtb3ZlIHRoZSBtb2R1bGUgcmVwcmVzZW50ZWQgYnkgdGhlIGdpdmVuIGtleS4KKyAgLy8vCisgIC8vLyAgIFRoaXMgd2lsbCByZW1vdmUgYWxsIG1vZHVsZXMgaW4gdGhlIGxheWVycyBiZWxvdyB0aGF0IHdlcmUgZGVyaXZlZCBmcm9tCisgIC8vLyB0aGUgbW9kdWxlIHJlcHJlc2VudGVkIGJ5IEsuCisgIEVycm9yIHJlbW92ZU1vZHVsZShWTW9kdWxlS2V5IEspIHsKKyAgICBhdXRvIEkgPSBMb2dpY2FsRHlsaWJzLmZpbmQoSyk7CisgICAgYXNzZXJ0KEkgIT0gTG9naWNhbER5bGlicy5lbmQoKSAmJiAiVk1vZHVsZUtleSBLIG5vdCB2YWxpZCBoZXJlIik7CisgICAgYXV0byBFcnIgPSBJLT5zZWNvbmQucmVtb3ZlTW9kdWxlc0Zyb21CYXNlTGF5ZXIoQmFzZUxheWVyKTsKKyAgICBMb2dpY2FsRHlsaWJzLmVyYXNlKEkpOworICAgIHJldHVybiBFcnI7CisgIH0KKworICAvLy8gQGJyaWVmIFNlYXJjaCBmb3IgdGhlIGdpdmVuIG5hbWVkIHN5bWJvbC4KKyAgLy8vIEBwYXJhbSBOYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdG8gc2VhcmNoIGZvci4KKyAgLy8vIEBwYXJhbSBFeHBvcnRlZFN5bWJvbHNPbmx5IElmIHRydWUsIHNlYXJjaCBvbmx5IGZvciBleHBvcnRlZCBzeW1ib2xzLgorICAvLy8gQHJldHVybiBBIGhhbmRsZSBmb3IgdGhlIGdpdmVuIG5hbWVkIHN5bWJvbCwgaWYgaXQgZXhpc3RzLgorICBKSVRTeW1ib2wgZmluZFN5bWJvbChTdHJpbmdSZWYgTmFtZSwgYm9vbCBFeHBvcnRlZFN5bWJvbHNPbmx5KSB7CisgICAgZm9yIChhdXRvICZLViA6IExvZ2ljYWxEeWxpYnMpIHsKKyAgICAgIGlmIChhdXRvIFN5bSA9IEtWLnNlY29uZC5TdHVic01nci0+ZmluZFN0dWIoTmFtZSwgRXhwb3J0ZWRTeW1ib2xzT25seSkpCisgICAgICAgIHJldHVybiBTeW07CisgICAgICBpZiAoYXV0byBTeW0gPSBmaW5kU3ltYm9sSW4oS1YuZmlyc3QsIE5hbWUsIEV4cG9ydGVkU3ltYm9sc09ubHkpKQorICAgICAgICByZXR1cm4gU3ltOworICAgICAgZWxzZSBpZiAoYXV0byBFcnIgPSBTeW0udGFrZUVycm9yKCkpCisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoRXJyKTsKKyAgICB9CisgICAgcmV0dXJuIEJhc2VMYXllci5maW5kU3ltYm9sKE5hbWUsIEV4cG9ydGVkU3ltYm9sc09ubHkpOworICB9CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIGFkZHJlc3Mgb2YgYSBzeW1ib2wgcHJvdmlkZWQgYnkgdGhpcyBsYXllciwgb3Igc29tZSBsYXllcgorICAvLy8gICAgICAgIGJlbG93IHRoaXMgb25lLgorICBKSVRTeW1ib2wgZmluZFN5bWJvbEluKFZNb2R1bGVLZXkgSywgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeHBvcnRlZFN5bWJvbHNPbmx5KSB7CisgICAgYXNzZXJ0KExvZ2ljYWxEeWxpYnMuY291bnQoSykgJiYgIlZNb2R1bGVLZXkgSyBpcyBub3QgdmFsaWQgaGVyZSIpOworICAgIHJldHVybiBMb2dpY2FsRHlsaWJzW0tdLmZpbmRTeW1ib2woQmFzZUxheWVyLCBOYW1lLCBFeHBvcnRlZFN5bWJvbHNPbmx5KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgVXBkYXRlIHRoZSBzdHViIGZvciB0aGUgZ2l2ZW4gZnVuY3Rpb24gdG8gcG9pbnQgYXQgRm5Cb2R5QWRkci4KKyAgLy8vIFRoaXMgY2FuIGJlIHVzZWQgdG8gc3VwcG9ydCByZS1vcHRpbWl6YXRpb24uCisgIC8vLyBAcmV0dXJuIHRydWUgaWYgdGhlIGZ1bmN0aW9uIGV4aXN0cyBhbmQgdGhlIHN0dWIgaXMgdXBkYXRlZCwgZmFsc2UKKyAgLy8vICAgICAgICAgb3RoZXJ3aXNlLgorICAvLworICAvLyBGSVhNRTogV2Ugc2hvdWxkIHRyYWNrIGFuZCBmcmVlIGFzc29jaWF0ZWQgcmVzb3VyY2VzICh1bnVzZWQgY29tcGlsZQorICAvLyAgICAgICAgY2FsbGJhY2tzLCB1bmNvbXBpbGVkIElSLCBhbmQgbm8tbG9uZ2VyLW5lZWRlZC9yZWFjaGFibGUgZnVuY3Rpb24KKyAgLy8gICAgICAgIGltcGxlbWVudGF0aW9ucykuCisgIEVycm9yIHVwZGF0ZVBvaW50ZXIoc3RkOjpzdHJpbmcgRnVuY05hbWUsIEpJVFRhcmdldEFkZHJlc3MgRm5Cb2R5QWRkcikgeworICAgIC8vRmluZCBvdXQgd2hpY2ggbG9naWNhbCBkeWxpYiBjb250YWlucyBvdXIgc3ltYm9sCisgICAgYXV0byBMREkgPSBMb2dpY2FsRHlsaWJzLmJlZ2luKCk7CisgICAgZm9yIChhdXRvIExERSA9IExvZ2ljYWxEeWxpYnMuZW5kKCk7IExESSAhPSBMREU7ICsrTERJKSB7CisgICAgICBpZiAoYXV0byBMTVJlc291cmNlcyA9CisgICAgICAgICAgICBMREktPmdldExvZ2ljYWxNb2R1bGVSZXNvdXJjZXNGb3JTeW1ib2woRnVuY05hbWUsIGZhbHNlKSkgeworICAgICAgICBNb2R1bGUgJlNyY00gPSBMTVJlc291cmNlcy0+U291cmNlTW9kdWxlLT5nZXRSZXNvdXJjZSgpOworICAgICAgICBzdGQ6OnN0cmluZyBDYWxsZWRGbk5hbWUgPSBtYW5nbGUoRnVuY05hbWUsIFNyY00uZ2V0RGF0YUxheW91dCgpKTsKKyAgICAgICAgaWYgKGF1dG8gRXJyID0gTE1SZXNvdXJjZXMtPlN0dWJzTWdyLT51cGRhdGVQb2ludGVyKENhbGxlZEZuTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZuQm9keUFkZHIpKQorICAgICAgICAgIHJldHVybiBFcnI7CisgICAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gbWFrZV9lcnJvcjxKSVRTeW1ib2xOb3RGb3VuZD4oRnVuY05hbWUpOworICB9CisKK3ByaXZhdGU6CisgIEVycm9yIGFkZExvZ2ljYWxNb2R1bGUoTG9naWNhbER5bGliICZMRCwgc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gU3JjTVB0cikgeworCisgICAgLy8gUmVuYW1lIGFsbCBzdGF0aWMgZnVuY3Rpb25zIC8gZ2xvYmFscyB0byAkc3RhdGljLlggOgorICAgIC8vIFRoaXMgd2lsbCB1bmlxdWUgdGhlIG5hbWVzIGFjcm9zcyBhbGwgbW9kdWxlcyBpbiB0aGUgbG9naWNhbCBkeWxpYiwKKyAgICAvLyBzaW1wbGlmeWluZyBzeW1ib2wgbG9va3VwLgorICAgIExELlN0YXRpY1JlbmFtZXIucmVuYW1lKCpTcmNNUHRyKTsKKworICAgIC8vIEJ1bXAgdGhlIGxpbmthZ2UgYW5kIHJlbmFtZSBhbnkgYW5vbnltb3VzL3ByaXZvdGUgbWVtYmVycyBpbiBTcmNNIHRvCisgICAgLy8gZW5zdXJlIHRoYXQgZXZlcnl0aGluZyB3aWxsIHJlc29sdmUgcHJvcGVybHkgYWZ0ZXIgd2UgcGFydGl0aW9uIFNyY00uCisgICAgbWFrZUFsbFN5bWJvbHNFeHRlcm5hbGx5QWNjZXNzaWJsZSgqU3JjTVB0cik7CisKKyAgICAvLyBDcmVhdGUgYSBsb2dpY2FsIG1vZHVsZSBoYW5kbGUgZm9yIFNyY00gd2l0aGluIHRoZSBsb2dpY2FsIGR5bGliLgorICAgIE1vZHVsZSAmU3JjTSA9ICpTcmNNUHRyOworICAgIGF1dG8gTE1JZCA9IExELmFkZFNvdXJjZU1vZHVsZShzdGQ6Om1vdmUoU3JjTVB0cikpOworCisgICAgLy8gQ3JlYXRlIHN0dWIgZnVuY3Rpb25zLgorICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMID0gU3JjTS5nZXREYXRhTGF5b3V0KCk7CisgICAgeworICAgICAgdHlwZW5hbWUgSW5kaXJlY3RTdHVic01nclQ6OlN0dWJJbml0c01hcCBTdHViSW5pdHM7CisgICAgICBmb3IgKGF1dG8gJkYgOiBTcmNNKSB7CisgICAgICAgIC8vIFNraXAgZGVjbGFyYXRpb25zLgorICAgICAgICBpZiAoRi5pc0RlY2xhcmF0aW9uKCkpCisgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gU2tpcCB3ZWFrIGZ1bmN0aW9ucyBmb3Igd2hpY2ggd2UgYWxyZWFkeSBoYXZlIGRlZmluaXRpb25zLgorICAgICAgICBhdXRvIE1hbmdsZWROYW1lID0gbWFuZ2xlKEYuZ2V0TmFtZSgpLCBETCk7CisgICAgICAgIGlmIChGLmhhc1dlYWtMaW5rYWdlKCkgfHwgRi5oYXNMaW5rT25jZUxpbmthZ2UoKSkgeworICAgICAgICAgIGlmIChhdXRvIFN5bSA9IExELmZpbmRTeW1ib2woQmFzZUxheWVyLCBNYW5nbGVkTmFtZSwgZmFsc2UpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgZWxzZSBpZiAoYXV0byBFcnIgPSBTeW0udGFrZUVycm9yKCkpCisgICAgICAgICAgICByZXR1cm4gc3RkOjptb3ZlKEVycik7CisgICAgICAgIH0KKworICAgICAgICAvLyBSZWNvcmQgYWxsIGZ1bmN0aW9ucyBkZWZpbmVkIGJ5IHRoaXMgbW9kdWxlLgorICAgICAgICBpZiAoQ2xvbmVTdHVic0ludG9QYXJ0aXRpb25zKQorICAgICAgICAgIExELmdldFN0dWJzVG9DbG9uZShMTUlkKS5pbnNlcnQoJkYpOworCisgICAgICAgIC8vIENyZWF0ZSBhIGNhbGxiYWNrLCBhc3NvY2lhdGUgaXQgd2l0aCB0aGUgc3R1YiBmb3IgdGhlIGZ1bmN0aW9uLAorICAgICAgICAvLyBhbmQgc2V0IHRoZSBjb21waWxlIGFjdGlvbiB0byBjb21waWxlIHRoZSBwYXJ0aXRpb24gY29udGFpbmluZyB0aGUKKyAgICAgICAgLy8gZnVuY3Rpb24uCisgICAgICAgIGlmIChhdXRvIENDSW5mb09yRXJyID0gQ29tcGlsZUNhbGxiYWNrTWdyLmdldENvbXBpbGVDYWxsYmFjaygpKSB7CisgICAgICAgICAgYXV0byAmQ0NJbmZvID0gKkNDSW5mb09yRXJyOworICAgICAgICAgIFN0dWJJbml0c1tNYW5nbGVkTmFtZV0gPQorICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoQ0NJbmZvLmdldEFkZHJlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVFN5bWJvbEZsYWdzOjpmcm9tR2xvYmFsVmFsdWUoRikpOworICAgICAgICAgIENDSW5mby5zZXRDb21waWxlQWN0aW9uKFt0aGlzLCAmTEQsIExNSWQsICZGXSgpIC0+IEpJVFRhcmdldEFkZHJlc3MgeworICAgICAgICAgICAgICBpZiAoYXV0byBGbkltcGxBZGRyT3JFcnIgPSB0aGlzLT5leHRyYWN0QW5kQ29tcGlsZShMRCwgTE1JZCwgRikpCisgICAgICAgICAgICAgICAgcmV0dXJuICpGbkltcGxBZGRyT3JFcnI7CisgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEZJWE1FOiBSZXBvcnQgZXJyb3IsIHJldHVybiB0byAnYWJvcnQnIG9yIHNvbWV0aGluZyBzaW1pbGFyLgorICAgICAgICAgICAgICAgIGNvbnN1bWVFcnJvcihGbkltcGxBZGRyT3JFcnIudGFrZUVycm9yKCkpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9KTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgcmV0dXJuIENDSW5mb09yRXJyLnRha2VFcnJvcigpOworICAgICAgfQorCisgICAgICBpZiAoYXV0byBFcnIgPSBMRC5TdHVic01nci0+Y3JlYXRlU3R1YnMoU3R1YkluaXRzKSkKKyAgICAgICAgcmV0dXJuIEVycjsKKyAgICB9CisKKyAgICAvLyBJZiB0aGlzIG1vZHVsZSBkb2Vzbid0IGNvbnRhaW4gYW55IGdsb2JhbHMsIGFsaWFzZXMsIG9yIG1vZHVsZSBmbGFncyB0aGVuCisgICAgLy8gd2UgY2FuIGJhaWwgb3V0IGVhcmx5IGFuZCBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgY3JlYXRpbmcgYW5kIG1hbmFnaW5nIGFuCisgICAgLy8gZW1wdHkgZ2xvYmFscyBtb2R1bGUuCisgICAgaWYgKFNyY00uZ2xvYmFsX2VtcHR5KCkgJiYgU3JjTS5hbGlhc19lbXB0eSgpICYmCisgICAgICAgICFTcmNNLmdldE1vZHVsZUZsYWdzTWV0YWRhdGEoKSkKKyAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworCisgICAgLy8gQ3JlYXRlIHRoZSBHbG9iYWxWYWx1ZXMgbW9kdWxlLgorICAgIGF1dG8gR1ZzTSA9IGxsdm06Om1ha2VfdW5pcXVlPE1vZHVsZT4oKFNyY00uZ2V0TmFtZSgpICsgIi5nbG9iYWxzIikuc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTcmNNLmdldENvbnRleHQoKSk7CisgICAgR1ZzTS0+c2V0RGF0YUxheW91dChETCk7CisKKyAgICBWYWx1ZVRvVmFsdWVNYXBUeSBWTWFwOworCisgICAgLy8gQ2xvbmUgZ2xvYmFsIHZhcmlhYmxlIGRlY2xzLgorICAgIGZvciAoYXV0byAmR1YgOiBTcmNNLmdsb2JhbHMoKSkKKyAgICAgIGlmICghR1YuaXNEZWNsYXJhdGlvbigpICYmICFWTWFwLmNvdW50KCZHVikpCisgICAgICAgIGNsb25lR2xvYmFsVmFyaWFibGVEZWNsKCpHVnNNLCBHViwgJlZNYXApOworCisgICAgLy8gQW5kIHRoZSBhbGlhc2VzLgorICAgIGZvciAoYXV0byAmQSA6IFNyY00uYWxpYXNlcygpKQorICAgICAgaWYgKCFWTWFwLmNvdW50KCZBKSkKKyAgICAgICAgY2xvbmVHbG9iYWxBbGlhc0RlY2woKkdWc00sIEEsIFZNYXApOworCisgICAgLy8gQ2xvbmUgdGhlIG1vZHVsZSBmbGFncy4KKyAgICBjbG9uZU1vZHVsZUZsYWdzTWV0YWRhdGEoKkdWc00sIFNyY00sIFZNYXApOworCisgICAgLy8gTm93IHdlIG5lZWQgdG8gY2xvbmUgdGhlIEdWIGFuZCBhbGlhcyBpbml0aWFsaXplcnMuCisKKyAgICAvLyBJbml0aWFsaXplcnMgbWF5IHJlZmVyIHRvIGZ1bmN0aW9ucyBkZWNsYXJlZCAoYnV0IG5vdCBkZWZpbmVkKSBpbiB0aGlzCisgICAgLy8gbW9kdWxlLiBCdWlsZCBhIG1hdGVyaWFsaXplciB0byBjbG9uZSBkZWNscyBvbiBkZW1hbmQuCisgICAgRXJyb3IgTWF0ZXJpYWxpemVyRXJyb3JzID0gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICBhdXRvIE1hdGVyaWFsaXplciA9IGNyZWF0ZUxhbWJkYU1hdGVyaWFsaXplcigKKyAgICAgIFsmTEQsICZHVnNNLCAmTWF0ZXJpYWxpemVyRXJyb3JzXShWYWx1ZSAqVikgLT4gVmFsdWUqIHsKKyAgICAgICAgaWYgKGF1dG8gKkYgPSBkeW5fY2FzdDxGdW5jdGlvbj4oVikpIHsKKyAgICAgICAgICAvLyBEZWNscyBpbiB0aGUgb3JpZ2luYWwgbW9kdWxlIGp1c3QgZ2V0IGNsb25lZC4KKyAgICAgICAgICBpZiAoRi0+aXNEZWNsYXJhdGlvbigpKQorICAgICAgICAgICAgcmV0dXJuIGNsb25lRnVuY3Rpb25EZWNsKCpHVnNNLCAqRik7CisKKyAgICAgICAgICAvLyBEZWZpbml0aW9ucyBpbiB0aGUgb3JpZ2luYWwgbW9kdWxlICh3aGljaCB3ZSBoYXZlIGVtaXR0ZWQgc3R1YnMKKyAgICAgICAgICAvLyBmb3IgYXQgdGhpcyBwb2ludCkgZ2V0IHR1cm5lZCBpbnRvIGEgY29uc3RhbnQgYWxpYXMgdG8gdGhlIHN0dWIKKyAgICAgICAgICAvLyBpbnN0ZWFkLgorICAgICAgICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMID0gR1ZzTS0+Z2V0RGF0YUxheW91dCgpOworICAgICAgICAgIHN0ZDo6c3RyaW5nIEZOYW1lID0gbWFuZ2xlKEYtPmdldE5hbWUoKSwgREwpOworICAgICAgICAgIHVuc2lnbmVkIFB0ckJpdFdpZHRoID0gREwuZ2V0UG9pbnRlclR5cGVTaXplSW5CaXRzKEYtPmdldFR5cGUoKSk7CisgICAgICAgICAgSklUVGFyZ2V0QWRkcmVzcyBTdHViQWRkciA9IDA7CisKKyAgICAgICAgICAvLyBHZXQgdGhlIGFkZHJlc3MgZm9yIHRoZSBzdHViLiBJZiB3ZSBlbmNvdW50ZXIgYW4gZXJyb3Igd2hpbGUKKyAgICAgICAgICAvLyBkb2luZyBzbywgc3Rhc2ggaXQgaW4gdGhlIE1hdGVyaWFsaXplckVycm9ycyB2YXJpYWJsZSBhbmQgdXNlIGEKKyAgICAgICAgICAvLyBudWxsIGFkZHJlc3MgYXMgYSBwbGFjZWhvbGRlci4KKyAgICAgICAgICBpZiAoYXV0byBTdHViU3ltID0gTEQuU3R1YnNNZ3ItPmZpbmRTdHViKEZOYW1lLCBmYWxzZSkpIHsKKyAgICAgICAgICAgIGlmIChhdXRvIFN0dWJBZGRyT3JFcnIgPSBTdHViU3ltLmdldEFkZHJlc3MoKSkKKyAgICAgICAgICAgICAgU3R1YkFkZHIgPSAqU3R1YkFkZHJPckVycjsKKyAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgTWF0ZXJpYWxpemVyRXJyb3JzID0gam9pbkVycm9ycyhzdGQ6Om1vdmUoTWF0ZXJpYWxpemVyRXJyb3JzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHViQWRkck9yRXJyLnRha2VFcnJvcigpKTsKKyAgICAgICAgICB9CisKKyAgICAgICAgICBDb25zdGFudEludCAqU3R1YkFkZHJDSSA9CisgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KEdWc00tPmdldENvbnRleHQoKSwgQVBJbnQoUHRyQml0V2lkdGgsIFN0dWJBZGRyKSk7CisgICAgICAgICAgQ29uc3RhbnQgKkluaXQgPSBDb25zdGFudEV4cHI6OmdldENhc3QoSW5zdHJ1Y3Rpb246OkludFRvUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0dWJBZGRyQ0ksIEYtPmdldFR5cGUoKSk7CisgICAgICAgICAgcmV0dXJuIEdsb2JhbEFsaWFzOjpjcmVhdGUoRi0+Z2V0RnVuY3Rpb25UeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRi0+Z2V0VHlwZSgpLT5nZXRBZGRyZXNzU3BhY2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGLT5nZXRMaW5rYWdlKCksIEYtPmdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbml0LCBHVnNNLmdldCgpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBlbHNlLi4uLgorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIH0pOworCisgICAgLy8gQ2xvbmUgdGhlIGdsb2JhbCB2YXJpYWJsZSBpbml0aWFsaXplcnMuCisgICAgZm9yIChhdXRvICZHViA6IFNyY00uZ2xvYmFscygpKQorICAgICAgaWYgKCFHVi5pc0RlY2xhcmF0aW9uKCkpCisgICAgICAgIG1vdmVHbG9iYWxWYXJpYWJsZUluaXRpYWxpemVyKEdWLCBWTWFwLCAmTWF0ZXJpYWxpemVyKTsKKworICAgIC8vIENsb25lIHRoZSBnbG9iYWwgYWxpYXMgaW5pdGlhbGl6ZXJzLgorICAgIGZvciAoYXV0byAmQSA6IFNyY00uYWxpYXNlcygpKSB7CisgICAgICBhdXRvICpOZXdBID0gY2FzdDxHbG9iYWxBbGlhcz4oVk1hcFsmQV0pOworICAgICAgYXNzZXJ0KE5ld0EgJiYgIkFsaWFzIG5vdCBjbG9uZWQ/Iik7CisgICAgICBWYWx1ZSAqSW5pdCA9IE1hcFZhbHVlKEEuZ2V0QWxpYXNlZSgpLCBWTWFwLCBSRl9Ob25lLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWF0ZXJpYWxpemVyKTsKKyAgICAgIE5ld0EtPnNldEFsaWFzZWUoY2FzdDxDb25zdGFudD4oSW5pdCkpOworICAgIH0KKworICAgIGlmIChNYXRlcmlhbGl6ZXJFcnJvcnMpCisgICAgICByZXR1cm4gTWF0ZXJpYWxpemVyRXJyb3JzOworCisgICAgLy8gQnVpbGQgYSByZXNvbHZlciBmb3IgdGhlIGdsb2JhbHMgbW9kdWxlIGFuZCBhZGQgaXQgdG8gdGhlIGJhc2UgbGF5ZXIuCisgICAgYXV0byBMZWdhY3lMb29rdXAgPSBbdGhpcywgJkxEXShjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgLT4gSklUU3ltYm9sIHsKKyAgICAgIGlmIChhdXRvIFN5bSA9IExELlN0dWJzTWdyLT5maW5kU3R1YihOYW1lLCBmYWxzZSkpCisgICAgICAgIHJldHVybiBTeW07CisgICAgICBlbHNlIGlmIChhdXRvIEVyciA9IFN5bS50YWtlRXJyb3IoKSkKKyAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShFcnIpOworCisgICAgICBpZiAoYXV0byBTeW0gPSBMRC5maW5kU3ltYm9sKEJhc2VMYXllciwgTmFtZSwgZmFsc2UpKQorICAgICAgICByZXR1cm4gU3ltOworICAgICAgZWxzZSBpZiAoYXV0byBFcnIgPSBTeW0udGFrZUVycm9yKCkpCisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoRXJyKTsKKworICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgfTsKKworICAgIGF1dG8gR1ZzUmVzb2x2ZXIgPSBjcmVhdGVTeW1ib2xSZXNvbHZlcigKKyAgICAgICAgWyZMRCwgTGVnYWN5TG9va3VwXShTeW1ib2xGbGFnc01hcCAmU3ltYm9sRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3ltYm9sTmFtZVNldCAmU3ltYm9scykgeworICAgICAgICAgIGF1dG8gTm90Rm91bmRWaWFMZWdhY3lMb29rdXAgPQorICAgICAgICAgICAgICBsb29rdXBGbGFnc1dpdGhMZWdhY3lGbihTeW1ib2xGbGFncywgU3ltYm9scywgTGVnYWN5TG9va3VwKTsKKworICAgICAgICAgIGlmICghTm90Rm91bmRWaWFMZWdhY3lMb29rdXApIHsKKyAgICAgICAgICAgIGxvZ0FsbFVuaGFuZGxlZEVycm9ycyhOb3RGb3VuZFZpYUxlZ2FjeUxvb2t1cC50YWtlRXJyb3IoKSwgZXJycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0RMYXllci9HVnNSZXNvbHZlciBmbGFncyBsb29rdXAgZmFpbGVkOiAiKTsKKyAgICAgICAgICAgIFN5bWJvbEZsYWdzLmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gU3ltYm9sTmFtZVNldCgpOworICAgICAgICAgIH0KKworICAgICAgICAgIHJldHVybiBMRC5CYWNraW5nUmVzb2x2ZXItPmxvb2t1cEZsYWdzKFN5bWJvbEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpOb3RGb3VuZFZpYUxlZ2FjeUxvb2t1cCk7CisgICAgICAgIH0sCisgICAgICAgIFsmTEQsIExlZ2FjeUxvb2t1cF0oc3RkOjpzaGFyZWRfcHRyPEFzeW5jaHJvbm91c1N5bWJvbFF1ZXJ5PiBRdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xOYW1lU2V0IFN5bWJvbHMpIHsKKyAgICAgICAgICBhdXRvIE5vdEZvdW5kVmlhTGVnYWN5TG9va3VwID0KKyAgICAgICAgICAgICAgbG9va3VwV2l0aExlZ2FjeUZuKCpRdWVyeSwgU3ltYm9scywgTGVnYWN5TG9va3VwKTsKKyAgICAgICAgICByZXR1cm4gTEQuQmFja2luZ1Jlc29sdmVyLT5sb29rdXAoUXVlcnksIE5vdEZvdW5kVmlhTGVnYWN5TG9va3VwKTsKKyAgICAgICAgfSk7CisKKyAgICBTZXRTeW1ib2xSZXNvbHZlcihMRC5LLCBzdGQ6Om1vdmUoR1ZzUmVzb2x2ZXIpKTsKKworICAgIGlmIChhdXRvIEVyciA9IEJhc2VMYXllci5hZGRNb2R1bGUoTEQuSywgc3RkOjptb3ZlKEdWc00pKSkKKyAgICAgIHJldHVybiBFcnI7CisKKyAgICBMRC5CYXNlTGF5ZXJWTW9kdWxlS2V5cy5wdXNoX2JhY2soTEQuSyk7CisKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBtYW5nbGUoU3RyaW5nUmVmIE5hbWUsIGNvbnN0IERhdGFMYXlvdXQgJkRMKSB7CisgICAgc3RkOjpzdHJpbmcgTWFuZ2xlZE5hbWU7CisgICAgeworICAgICAgcmF3X3N0cmluZ19vc3RyZWFtIE1hbmdsZWROYW1lU3RyZWFtKE1hbmdsZWROYW1lKTsKKyAgICAgIE1hbmdsZXI6OmdldE5hbWVXaXRoUHJlZml4KE1hbmdsZWROYW1lU3RyZWFtLCBOYW1lLCBETCk7CisgICAgfQorICAgIHJldHVybiBNYW5nbGVkTmFtZTsKKyAgfQorCisgIEV4cGVjdGVkPEpJVFRhcmdldEFkZHJlc3M+CisgIGV4dHJhY3RBbmRDb21waWxlKExvZ2ljYWxEeWxpYiAmTEQsCisgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIExvZ2ljYWxEeWxpYjo6U291cmNlTW9kdWxlSGFuZGxlIExNSWQsCisgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uICZGKSB7CisgICAgTW9kdWxlICZTcmNNID0gTEQuZ2V0U291cmNlTW9kdWxlKExNSWQpOworCisgICAgLy8gSWYgRiBpcyBhIGRlY2xhcmF0aW9uIHdlIG11c3QgYWxyZWFkeSBoYXZlIGNvbXBpbGVkIGl0LgorICAgIGlmIChGLmlzRGVjbGFyYXRpb24oKSkKKyAgICAgIHJldHVybiAwOworCisgICAgLy8gR3JhYiB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gYmVpbmcgY2FsbGVkIGhlcmUuCisgICAgc3RkOjpzdHJpbmcgQ2FsbGVkRm5OYW1lID0gbWFuZ2xlKEYuZ2V0TmFtZSgpLCBTcmNNLmdldERhdGFMYXlvdXQoKSk7CisKKyAgICBKSVRUYXJnZXRBZGRyZXNzIENhbGxlZEFkZHIgPSAwOworICAgIGF1dG8gUGFydCA9IFBhcnRpdGlvbihGKTsKKyAgICBpZiAoYXV0byBQYXJ0S2V5T3JFcnIgPSBlbWl0UGFydGl0aW9uKExELCBMTUlkLCBQYXJ0KSkgeworICAgICAgYXV0byAmUGFydEtleSA9ICpQYXJ0S2V5T3JFcnI7CisgICAgICBmb3IgKGF1dG8gKlN1YkYgOiBQYXJ0KSB7CisgICAgICAgIHN0ZDo6c3RyaW5nIEZuTmFtZSA9IG1hbmdsZShTdWJGLT5nZXROYW1lKCksIFNyY00uZ2V0RGF0YUxheW91dCgpKTsKKyAgICAgICAgaWYgKGF1dG8gRm5Cb2R5U3ltID0gQmFzZUxheWVyLmZpbmRTeW1ib2xJbihQYXJ0S2V5LCBGbk5hbWUsIGZhbHNlKSkgeworICAgICAgICAgIGlmIChhdXRvIEZuQm9keUFkZHJPckVyciA9IEZuQm9keVN5bS5nZXRBZGRyZXNzKCkpIHsKKyAgICAgICAgICAgIEpJVFRhcmdldEFkZHJlc3MgRm5Cb2R5QWRkciA9ICpGbkJvZHlBZGRyT3JFcnI7CisKKyAgICAgICAgICAgIC8vIElmIHRoaXMgaXMgdGhlIGZ1bmN0aW9uIHdlJ3JlIGNhbGxpbmcgcmVjb3JkIHRoZSBhZGRyZXNzIHNvIHdlIGNhbgorICAgICAgICAgICAgLy8gcmV0dXJuIGl0IGZyb20gdGhpcyBmdW5jdGlvbi4KKyAgICAgICAgICAgIGlmIChTdWJGID09ICZGKQorICAgICAgICAgICAgICBDYWxsZWRBZGRyID0gRm5Cb2R5QWRkcjsKKworICAgICAgICAgICAgLy8gVXBkYXRlIHRoZSBmdW5jdGlvbiBib2R5IHBvaW50ZXIgZm9yIHRoZSBzdHViLgorICAgICAgICAgICAgaWYgKGF1dG8gRUMgPSBMRC5TdHVic01nci0+dXBkYXRlUG9pbnRlcihGbk5hbWUsIEZuQm9keUFkZHIpKQorICAgICAgICAgICAgICByZXR1cm4gMDsKKworICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgcmV0dXJuIEZuQm9keUFkZHJPckVyci50YWtlRXJyb3IoKTsKKyAgICAgICAgfSBlbHNlIGlmIChhdXRvIEVyciA9IEZuQm9keVN5bS50YWtlRXJyb3IoKSkKKyAgICAgICAgICByZXR1cm4gc3RkOjptb3ZlKEVycik7CisgICAgICAgIGVsc2UKKyAgICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJGdW5jdGlvbiBub3QgZW1pdHRlZCBmb3IgcGFydGl0aW9uIik7CisgICAgICB9CisKKyAgICAgIExELkJhc2VMYXllclZNb2R1bGVLZXlzLnB1c2hfYmFjayhQYXJ0S2V5KTsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybiBQYXJ0S2V5T3JFcnIudGFrZUVycm9yKCk7CisKKyAgICByZXR1cm4gQ2FsbGVkQWRkcjsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYXJ0aXRpb25UPgorICBFeHBlY3RlZDxWTW9kdWxlS2V5PgorICBlbWl0UGFydGl0aW9uKExvZ2ljYWxEeWxpYiAmTEQsCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgTG9naWNhbER5bGliOjpTb3VyY2VNb2R1bGVIYW5kbGUgTE1JZCwKKyAgICAgICAgICAgICAgICBjb25zdCBQYXJ0aXRpb25UICZQYXJ0KSB7CisgICAgTW9kdWxlICZTcmNNID0gTEQuZ2V0U291cmNlTW9kdWxlKExNSWQpOworCisgICAgLy8gQ3JlYXRlIHRoZSBtb2R1bGUuCisgICAgc3RkOjpzdHJpbmcgTmV3TmFtZSA9IFNyY00uZ2V0TmFtZSgpOworICAgIGZvciAoYXV0byAqRiA6IFBhcnQpIHsKKyAgICAgIE5ld05hbWUgKz0gIi4iOworICAgICAgTmV3TmFtZSArPSBGLT5nZXROYW1lKCk7CisgICAgfQorCisgICAgYXV0byBNID0gbGx2bTo6bWFrZV91bmlxdWU8TW9kdWxlPihOZXdOYW1lLCBTcmNNLmdldENvbnRleHQoKSk7CisgICAgTS0+c2V0RGF0YUxheW91dChTcmNNLmdldERhdGFMYXlvdXQoKSk7CisgICAgVmFsdWVUb1ZhbHVlTWFwVHkgVk1hcDsKKworICAgIGF1dG8gTWF0ZXJpYWxpemVyID0gY3JlYXRlTGFtYmRhTWF0ZXJpYWxpemVyKFsmTEQsICZMTUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTV0oVmFsdWUgKlYpIC0+IFZhbHVlICogeworICAgICAgaWYgKGF1dG8gKkdWID0gZHluX2Nhc3Q8R2xvYmFsVmFyaWFibGU+KFYpKQorICAgICAgICByZXR1cm4gY2xvbmVHbG9iYWxWYXJpYWJsZURlY2woKk0sICpHVik7CisKKyAgICAgIGlmIChhdXRvICpGID0gZHluX2Nhc3Q8RnVuY3Rpb24+KFYpKSB7CisgICAgICAgIC8vIENoZWNrIHdoZXRoZXIgd2Ugd2FudCB0byBjbG9uZSBhbiBhdmFpbGFibGVfZXh0ZXJuYWxseSBkZWZpbml0aW9uLgorICAgICAgICBpZiAoIUxELmdldFN0dWJzVG9DbG9uZShMTUlkKS5jb3VudChGKSkKKyAgICAgICAgICByZXR1cm4gY2xvbmVGdW5jdGlvbkRlY2woKk0sICpGKTsKKworICAgICAgICAvLyBPayAtIHdlIHdhbnQgYW4gaW5saW5hYmxlIHN0dWIuIEZvciB0aGF0IHRvIHdvcmsgd2UgbmVlZCBhIGRlY2wKKyAgICAgICAgLy8gZm9yIHRoZSBzdHViIHBvaW50ZXIuCisgICAgICAgIGF1dG8gKlN0dWJQdHIgPSBjcmVhdGVJbXBsUG9pbnRlcigqRi0+Z2V0VHlwZSgpLCAqTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEYtPmdldE5hbWUoKSArICIkc3R1Yl9wdHIiLCBudWxscHRyKTsKKyAgICAgICAgYXV0byAqQ2xvbmVkRiA9IGNsb25lRnVuY3Rpb25EZWNsKCpNLCAqRik7CisgICAgICAgIG1ha2VTdHViKCpDbG9uZWRGLCAqU3R1YlB0cik7CisgICAgICAgIENsb25lZEYtPnNldExpbmthZ2UoR2xvYmFsVmFsdWU6OkF2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlKTsKKyAgICAgICAgQ2xvbmVkRi0+YWRkRm5BdHRyKEF0dHJpYnV0ZTo6QWx3YXlzSW5saW5lKTsKKyAgICAgICAgcmV0dXJuIENsb25lZEY7CisgICAgICB9CisKKyAgICAgIGlmIChhdXRvICpBID0gZHluX2Nhc3Q8R2xvYmFsQWxpYXM+KFYpKSB7CisgICAgICAgIGF1dG8gKlR5ID0gQS0+Z2V0VmFsdWVUeXBlKCk7CisgICAgICAgIGlmIChUeS0+aXNGdW5jdGlvblR5KCkpCisgICAgICAgICAgcmV0dXJuIEZ1bmN0aW9uOjpDcmVhdGUoY2FzdDxGdW5jdGlvblR5cGU+KFR5KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlLCBBLT5nZXROYW1lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTS5nZXQoKSk7CisKKyAgICAgICAgcmV0dXJuIG5ldyBHbG9iYWxWYXJpYWJsZSgqTSwgVHksIGZhbHNlLCBHbG9iYWxWYWx1ZTo6RXh0ZXJuYWxMaW5rYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIEEtPmdldE5hbWUoKSwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZTo6Tm90VGhyZWFkTG9jYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQS0+Z2V0VHlwZSgpLT5nZXRBZGRyZXNzU3BhY2UoKSk7CisgICAgICB9CisKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0pOworCisgICAgLy8gQ3JlYXRlIGRlY2xzIGluIHRoZSBuZXcgbW9kdWxlLgorICAgIGZvciAoYXV0byAqRiA6IFBhcnQpCisgICAgICBjbG9uZUZ1bmN0aW9uRGVjbCgqTSwgKkYsICZWTWFwKTsKKworICAgIC8vIE1vdmUgdGhlIGZ1bmN0aW9uIGJvZGllcy4KKyAgICBmb3IgKGF1dG8gKkYgOiBQYXJ0KQorICAgICAgbW92ZUZ1bmN0aW9uQm9keSgqRiwgVk1hcCwgJk1hdGVyaWFsaXplcik7CisKKyAgICBhdXRvIEsgPSBFUy5hbGxvY2F0ZVZNb2R1bGUoKTsKKworICAgIGF1dG8gTGVnYWN5TG9va3VwID0gW3RoaXMsICZMRF0oY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIC0+IEpJVFN5bWJvbCB7CisgICAgICByZXR1cm4gTEQuZmluZFN5bWJvbChCYXNlTGF5ZXIsIE5hbWUsIGZhbHNlKTsKKyAgICB9OworCisgICAgLy8gQ3JlYXRlIG1lbW9yeSBtYW5hZ2VyIGFuZCBzeW1ib2wgcmVzb2x2ZXIuCisgICAgYXV0byBSZXNvbHZlciA9IGNyZWF0ZVN5bWJvbFJlc29sdmVyKAorICAgICAgICBbJkxELCBMZWdhY3lMb29rdXBdKFN5bWJvbEZsYWdzTWFwICZTeW1ib2xGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTeW1ib2xOYW1lU2V0ICZTeW1ib2xzKSB7CisgICAgICAgICAgYXV0byBOb3RGb3VuZFZpYUxlZ2FjeUxvb2t1cCA9CisgICAgICAgICAgICAgIGxvb2t1cEZsYWdzV2l0aExlZ2FjeUZuKFN5bWJvbEZsYWdzLCBTeW1ib2xzLCBMZWdhY3lMb29rdXApOworICAgICAgICAgIGlmICghTm90Rm91bmRWaWFMZWdhY3lMb29rdXApIHsKKyAgICAgICAgICAgIGxvZ0FsbFVuaGFuZGxlZEVycm9ycyhOb3RGb3VuZFZpYUxlZ2FjeUxvb2t1cC50YWtlRXJyb3IoKSwgZXJycygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0RMYXllci9TdWJSZXNvbHZlciBmbGFncyBsb29rdXAgZmFpbGVkOiAiKTsKKyAgICAgICAgICAgIFN5bWJvbEZsYWdzLmNsZWFyKCk7CisgICAgICAgICAgICByZXR1cm4gU3ltYm9sTmFtZVNldCgpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gTEQuQmFja2luZ1Jlc29sdmVyLT5sb29rdXBGbGFncyhTeW1ib2xGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqTm90Rm91bmRWaWFMZWdhY3lMb29rdXApOworICAgICAgICB9LAorICAgICAgICBbJkxELCBMZWdhY3lMb29rdXBdKHN0ZDo6c2hhcmVkX3B0cjxBc3luY2hyb25vdXNTeW1ib2xRdWVyeT4gUSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xOYW1lU2V0IFN5bWJvbHMpIHsKKyAgICAgICAgICBhdXRvIE5vdEZvdW5kVmlhTGVnYWN5TG9va3VwID0KKyAgICAgICAgICAgICAgbG9va3VwV2l0aExlZ2FjeUZuKCpRLCBTeW1ib2xzLCBMZWdhY3lMb29rdXApOworICAgICAgICAgIHJldHVybiBMRC5CYWNraW5nUmVzb2x2ZXItPmxvb2t1cChRLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoTm90Rm91bmRWaWFMZWdhY3lMb29rdXApKTsKKyAgICAgICAgfSk7CisgICAgU2V0U3ltYm9sUmVzb2x2ZXIoSywgc3RkOjptb3ZlKFJlc29sdmVyKSk7CisKKyAgICBpZiAoYXV0byBFcnIgPSBCYXNlTGF5ZXIuYWRkTW9kdWxlKHN0ZDo6bW92ZShLKSwgc3RkOjptb3ZlKE0pKSkKKyAgICAgIHJldHVybiBzdGQ6Om1vdmUoRXJyKTsKKworICAgIHJldHVybiBLOworICB9CisKKyAgRXhlY3V0aW9uU2Vzc2lvbiAmRVM7CisgIEJhc2VMYXllclQgJkJhc2VMYXllcjsKKyAgU3ltYm9sUmVzb2x2ZXJHZXR0ZXIgR2V0U3ltYm9sUmVzb2x2ZXI7CisgIFN5bWJvbFJlc29sdmVyU2V0dGVyIFNldFN5bWJvbFJlc29sdmVyOworICBQYXJ0aXRpb25pbmdGdG9yIFBhcnRpdGlvbjsKKyAgQ29tcGlsZUNhbGxiYWNrTWdyVCAmQ29tcGlsZUNhbGxiYWNrTWdyOworICBJbmRpcmVjdFN0dWJzTWFuYWdlckJ1aWxkZXJUIENyZWF0ZUluZGlyZWN0U3R1YnNNYW5hZ2VyOworCisgIHN0ZDo6bWFwPFZNb2R1bGVLZXksIExvZ2ljYWxEeWxpYj4gTG9naWNhbER5bGliczsKKyAgYm9vbCBDbG9uZVN0dWJzSW50b1BhcnRpdGlvbnM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugb3JjCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfQ09NUElMRU9OREVNQU5ETEFZRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0NvbXBpbGVVdGlscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0NvbXBpbGVVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4MDUwZmYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvQ29tcGlsZVV0aWxzLmgKQEAgLTAsMCArMSwxMjEgQEAKKy8vPT09LSBDb21waWxlVXRpbHMuaCAtIFV0aWxpdGllcyBmb3IgY29tcGlsaW5nIElSIGluIHRoZSBKSVQgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ29udGFpbnMgdXRpbGl0aWVzIGZvciBjb21waWxpbmcgSVIgdG8gb2JqZWN0IGZpbGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0NPTVBJTEVVVElMU19ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19DT01QSUxFVVRJTFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9PYmplY3RDYWNoZS5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL09iamVjdE1lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvTGVnYWN5UGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9CaW5hcnkuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9PYmplY3RGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTW9kdWxlOworCituYW1lc3BhY2Ugb3JjIHsKKworLy8vIEBicmllZiBTaW1wbGUgY29tcGlsZSBmdW5jdG9yOiBUYWtlcyBhIHNpbmdsZSBJUiBtb2R1bGUgYW5kIHJldHVybnMgYW4KKy8vLyAgICAgICAgT2JqZWN0RmlsZS4KK2NsYXNzIFNpbXBsZUNvbXBpbGVyIHsKK3ByaXZhdGU6CisgIGNsYXNzIFNtYWxsVmVjdG9yTWVtb3J5QnVmZmVyIDogcHVibGljIE1lbW9yeUJ1ZmZlciB7CisgIHB1YmxpYzoKKyAgICBTbWFsbFZlY3Rvck1lbW9yeUJ1ZmZlcihTbWFsbFZlY3RvcjxjaGFyLCAwPiBCdWZmZXIpCisgICAgICAgIDogQnVmZmVyKHN0ZDo6bW92ZShCdWZmZXIpKSB7CisgICAgICBpbml0KHRoaXMtPkJ1ZmZlci5kYXRhKCksIHRoaXMtPkJ1ZmZlci5kYXRhKCkgKyB0aGlzLT5CdWZmZXIuc2l6ZSgpLAorICAgICAgICAgICBmYWxzZSk7CisgICAgfQorCisgICAgQnVmZmVyS2luZCBnZXRCdWZmZXJLaW5kKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gTWVtb3J5QnVmZmVyX01hbGxvYzsgfQorCisgIHByaXZhdGU6CisgICAgU21hbGxWZWN0b3I8Y2hhciwgMD4gQnVmZmVyOworICB9OworCitwdWJsaWM6CisgIHVzaW5nIENvbXBpbGVSZXN1bHQgPSBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPjsKKworICAvLy8gQGJyaWVmIENvbnN0cnVjdCBhIHNpbXBsZSBjb21waWxlIGZ1bmN0b3Igd2l0aCB0aGUgZ2l2ZW4gdGFyZ2V0LgorICBTaW1wbGVDb21waWxlcihUYXJnZXRNYWNoaW5lICZUTSwgT2JqZWN0Q2FjaGUgKk9iakNhY2hlID0gbnVsbHB0cikKKyAgICA6IFRNKFRNKSwgT2JqQ2FjaGUoT2JqQ2FjaGUpIHt9CisKKyAgLy8vIEBicmllZiBTZXQgYW4gT2JqZWN0Q2FjaGUgdG8gcXVlcnkgYmVmb3JlIGNvbXBpbGluZy4KKyAgdm9pZCBzZXRPYmplY3RDYWNoZShPYmplY3RDYWNoZSAqTmV3Q2FjaGUpIHsgT2JqQ2FjaGUgPSBOZXdDYWNoZTsgfQorCisgIC8vLyBAYnJpZWYgQ29tcGlsZSBhIE1vZHVsZSB0byBhbiBPYmplY3RGaWxlLgorICBDb21waWxlUmVzdWx0IG9wZXJhdG9yKCkoTW9kdWxlICZNKSB7CisgICAgQ29tcGlsZVJlc3VsdCBDYWNoZWRPYmplY3QgPSB0cnlUb0xvYWRGcm9tT2JqZWN0Q2FjaGUoTSk7CisgICAgaWYgKENhY2hlZE9iamVjdCkKKyAgICAgIHJldHVybiBDYWNoZWRPYmplY3Q7CisKKyAgICBTbWFsbFZlY3RvcjxjaGFyLCAwPiBPYmpCdWZmZXJTVjsKKworICAgIHsKKyAgICAgIHJhd19zdmVjdG9yX29zdHJlYW0gT2JqU3RyZWFtKE9iakJ1ZmZlclNWKTsKKworICAgICAgbGVnYWN5OjpQYXNzTWFuYWdlciBQTTsKKyAgICAgIE1DQ29udGV4dCAqQ3R4OworICAgICAgaWYgKFRNLmFkZFBhc3Nlc1RvRW1pdE1DKFBNLCBDdHgsIE9ialN0cmVhbSkpCisgICAgICAgIGxsdm1fdW5yZWFjaGFibGUoIlRhcmdldCBkb2VzIG5vdCBzdXBwb3J0IE1DIGVtaXNzaW9uLiIpOworICAgICAgUE0ucnVuKE0pOworICAgIH0KKworICAgIGF1dG8gT2JqQnVmZmVyID0KKyAgICAgICAgbGx2bTo6bWFrZV91bmlxdWU8U21hbGxWZWN0b3JNZW1vcnlCdWZmZXI+KHN0ZDo6bW92ZShPYmpCdWZmZXJTVikpOworICAgIGF1dG8gT2JqID0KKyAgICAgICAgb2JqZWN0OjpPYmplY3RGaWxlOjpjcmVhdGVPYmplY3RGaWxlKE9iakJ1ZmZlci0+Z2V0TWVtQnVmZmVyUmVmKCkpOworCisgICAgaWYgKE9iaikgeworICAgICAgbm90aWZ5T2JqZWN0Q29tcGlsZWQoTSwgKk9iakJ1ZmZlcik7CisgICAgICByZXR1cm4gc3RkOjptb3ZlKE9iakJ1ZmZlcik7CisgICAgfQorCisgICAgLy8gVE9ETzogQWN0dWFsbHkgcmVwb3J0IGVycm9ycyBoZWxwZnVsbHkuCisgICAgY29uc3VtZUVycm9yKE9iai50YWtlRXJyb3IoKSk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworcHJpdmF0ZToKKworICBDb21waWxlUmVzdWx0IHRyeVRvTG9hZEZyb21PYmplY3RDYWNoZShjb25zdCBNb2R1bGUgJk0pIHsKKyAgICBpZiAoIU9iakNhY2hlKQorICAgICAgcmV0dXJuIENvbXBpbGVSZXN1bHQoKTsKKworICAgIHJldHVybiBPYmpDYWNoZS0+Z2V0T2JqZWN0KCZNKTsKKyAgfQorCisgIHZvaWQgbm90aWZ5T2JqZWN0Q29tcGlsZWQoY29uc3QgTW9kdWxlICZNLCBjb25zdCBNZW1vcnlCdWZmZXIgJk9iakJ1ZmZlcikgeworICAgIGlmIChPYmpDYWNoZSkKKyAgICAgIE9iakNhY2hlLT5ub3RpZnlPYmplY3RDb21waWxlZCgmTSwgT2JqQnVmZmVyLmdldE1lbUJ1ZmZlclJlZigpKTsKKyAgfQorCisgIFRhcmdldE1hY2hpbmUgJlRNOworICBPYmplY3RDYWNoZSAqT2JqQ2FjaGUgPSBudWxscHRyOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9yYworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0NPTVBJTEVVVElMU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvQ29yZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0NvcmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmZlYzhiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0NvcmUuaApAQCAtMCwwICsxLDM5NCBAQAorLy89PT0tLS0tLS0gQ29yZS5oIC0tIENvcmUgT1JDIEFQSXMgKExheWVyLCBKSVREeWxpYiwgZXRjLikgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDb250YWlucyBjb3JlIE9SQyBBUElzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0NPUkVfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfQ09SRV9ICisKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9KSVRTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvU3ltYm9sU3RyaW5nUG9vbC5oIgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb3JjIHsKKworLy8vIFZNb2R1bGVLZXkgcHJvdmlkZXMgYSB1bmlxdWUgaWRlbnRpZmllciAoYWxsb2NhdGVkIGFuZCBtYW5hZ2VkIGJ5CisvLy8gRXhlY3V0aW9uU2Vzc2lvbnMpIGZvciBhIG1vZHVsZSBhZGRlZCB0byB0aGUgSklULgordXNpbmcgVk1vZHVsZUtleSA9IHVpbnQ2NF90OworCitjbGFzcyBWU087CisKKy8vLyBAYnJpZWYgQSBzZXQgb2Ygc3ltYm9sIG5hbWVzIChyZXByZXNlbnRlZCBieSBTeW1ib2xTdHJpbmdQdHJzIGZvcgorLy8gICAgICAgICBlZmZpY2llbmN5KS4KK3VzaW5nIFN5bWJvbE5hbWVTZXQgPSBzdGQ6OnNldDxTeW1ib2xTdHJpbmdQdHI+OworCisvLy8gQGJyaWVmIEEgbWFwIGZyb20gc3ltYm9sIG5hbWVzIChhcyBTeW1ib2xTdHJpbmdQdHJzKSB0byBKSVRTeW1ib2xzCisvLy8gICAgICAgIChhZGRyZXNzL2ZsYWdzIHBhaXJzKS4KK3VzaW5nIFN5bWJvbE1hcCA9IHN0ZDo6bWFwPFN5bWJvbFN0cmluZ1B0ciwgSklURXZhbHVhdGVkU3ltYm9sPjsKKworLy8vIEBicmllZiBBIG1hcCBmcm9tIHN5bWJvbCBuYW1lcyAoYXMgU3ltYm9sU3RyaW5nUHRycykgdG8gSklUU3ltYm9sRmxhZ3MuCit1c2luZyBTeW1ib2xGbGFnc01hcCA9IHN0ZDo6bWFwPFN5bWJvbFN0cmluZ1B0ciwgSklUU3ltYm9sRmxhZ3M+OworCisvLy8gQGJyaWVmIEEgc3ltYm9sIHF1ZXJ5IHRoYXQgcmV0dXJucyByZXN1bHRzIHZpYSBhIGNhbGxiYWNrIHdoZW4gcmVzdWx0cyBhcmUKKy8vLyAgICAgICAgcmVhZHkuCisvLy8KKy8vLyBtYWtlcyBhIGNhbGxiYWNrIHdoZW4gYWxsIHN5bWJvbHMgYXJlIGF2YWlsYWJsZS4KK2NsYXNzIEFzeW5jaHJvbm91c1N5bWJvbFF1ZXJ5IHsKK3B1YmxpYzoKKyAgLy8vIEBicmllZiBDYWxsYmFjayB0byBub3RpZnkgY2xpZW50IHRoYXQgc3ltYm9scyBoYXZlIGJlZW4gcmVzb2x2ZWQuCisgIHVzaW5nIFN5bWJvbHNSZXNvbHZlZENhbGxiYWNrID0gc3RkOjpmdW5jdGlvbjx2b2lkKEV4cGVjdGVkPFN5bWJvbE1hcD4pPjsKKworICAvLy8gQGJyaWVmIENhbGxiYWNrIHRvIG5vdGlmeSBjbGllbnQgdGhhdCBzeW1ib2xzIGFyZSByZWFkeSBmb3IgZXhlY3V0aW9uLgorICB1c2luZyBTeW1ib2xzUmVhZHlDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChFcnJvcik+OworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgcXVlcnkgZm9yIHRoZSBnaXZlbiBzeW1ib2xzLCBub3RpZnktcmVzb2x2ZWQgYW5kCisgIC8vLyAgICAgICAgbm90aWZ5LXJlYWR5IGNhbGxiYWNrcy4KKyAgQXN5bmNocm9ub3VzU3ltYm9sUXVlcnkoY29uc3QgU3ltYm9sTmFtZVNldCAmU3ltYm9scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sc1Jlc29sdmVkQ2FsbGJhY2sgTm90aWZ5U3ltYm9sc1Jlc29sdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xzUmVhZHlDYWxsYmFjayBOb3RpZnlTeW1ib2xzUmVhZHkpOworCisgIC8vLyBAYnJpZWYgTm90aWZ5IGNsaWVudCB0aGF0IHRoZSBxdWVyeSBmYWlsZWQuCisgIC8vLworICAvLy8gSWYgdGhlIG5vdGlmeS1yZXNvbHZlZCBjYWxsYmFjayBoYXMgbm90IGJlZW4gbWFkZSB5ZXQsIHRoZW4gaXQgaXMgY2FsbGVkCisgIC8vLyB3aXRoIHRoZSBnaXZlbiBlcnJvciwgYW5kIHRoZSBub3RpZnktZmluYWxpemVkIGNhbGxiYWNrIGlzIG5ldmVyIG1hZGUuCisgIC8vLworICAvLy8gSWYgdGhlIG5vdGlmeS1yZXNvbHZlZCBjYWxsYmFjayBoYXMgYWxyZWFkeSBiZWVuIG1hZGUgdGhlbiB0aGVuIHRoZQorICAvLy8gbm90aWZ5LWZpbmFsaXplZCBjYWxsYmFjayBpcyBjYWxsZWQgd2l0aCB0aGUgZ2l2ZW4gZXJyb3IuCisgIC8vLworICAvLy8gSXQgaXMgaWxsZWdhbCB0byBjYWxsIHNldEZhaWxlZCBhZnRlciBib3RoIGNhbGxiYWNrcyBoYXZlIGJlZW4gbWFkZS4KKyAgdm9pZCBzZXRGYWlsZWQoRXJyb3IgRXJyKTsKKworICAvLy8gQGJyaWVmIFNldCB0aGUgcmVzb2x2ZWQgc3ltYm9sIGluZm9ybWF0aW9uIGZvciB0aGUgZ2l2ZW4gc3ltYm9sIG5hbWUuCisgIC8vLworICAvLy8gSWYgdGhpcyBzeW1ib2wgd2FzIHRoZSBsYXN0IG9uZSBub3QgcmVzb2x2ZWQsIHRoaXMgd2lsbCB0cmlnZ2VyIGEgY2FsbCB0bworICAvLy8gdGhlIG5vdGlmeS1maW5hbGl6ZWQgY2FsbGJhY2sgcGFzc2luZyB0aGUgY29tcGxldGVkIHN5Ym9sIG1hcC4KKyAgdm9pZCBzZXREZWZpbml0aW9uKFN5bWJvbFN0cmluZ1B0ciBOYW1lLCBKSVRFdmFsdWF0ZWRTeW1ib2wgU3ltKTsKKworICAvLy8gQGJyaWVmIE5vdGlmeSB0aGUgcXVlcnkgdGhhdCBhIHJlcXVlc3RlZCBzeW1ib2wgaXMgcmVhZHkgZm9yIGV4ZWN1dGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGRlY3JlbWVudHMgdGhlIHF1ZXJ5J3MgaW50ZXJuYWwgY291bnQgb2Ygbm90LXlldC1yZWFkeSBzeW1ib2xzLiBJZgorICAvLy8gdGhpcyBjYWxsIHRvIG5vdGlmeVN5bWJvbEZpbmFsaXplZCBzZXRzIHRoZSBjb3VudGVyIHRvIHplcm8sIGl0IHdpbGwgY2FsbAorICAvLy8gdGhlIG5vdGlmeS1maW5hbGl6ZWQgY2FsbGJhY2sgd2l0aCBFcnJvcjo6c3VjY2VzcyBhcyB0aGUgdmFsdWUuCisgIHZvaWQgbm90aWZ5U3ltYm9sRmluYWxpemVkKCk7CisKK3ByaXZhdGU6CisgIFN5bWJvbE1hcCBTeW1ib2xzOworICBzaXplX3QgT3V0c3RhbmRpbmdSZXNvbHV0aW9ucyA9IDA7CisgIHNpemVfdCBPdXRzdGFuZGluZ0ZpbmFsaXphdGlvbnMgPSAwOworICBTeW1ib2xzUmVzb2x2ZWRDYWxsYmFjayBOb3RpZnlTeW1ib2xzUmVzb2x2ZWQ7CisgIFN5bWJvbHNSZWFkeUNhbGxiYWNrIE5vdGlmeVN5bWJvbHNSZWFkeTsKK307CisKKy8vLyBAYnJpZWYgU3ltYm9sUmVzb2x2ZXIgaXMgYSBjb21wb3NhYmxlIGludGVyZmFjZSBmb3IgbG9va2luZyB1cCBzeW1ib2wgZmxhZ3MKKy8vLyAgICAgICAgYW5kIGFkZHJlc3NlcyB1c2luZyB0aGUgQXN5bmNocm9ub3VzU3ltYm9sUXVlcnkgdHlwZS4gSXQgd2lsbAorLy8vICAgICAgICBldmVudHVhbGx5IHJlcGxhY2UgdGhlIExlZ2FjeUpJVFN5bWJvbFJlc29sdmVyIGludGVyZmFjZSBhcyB0aGUKKy8vLyAgICAgICAgc3RhcmRhcmQgT1JDIHN5bWJvbCByZXNvbHZlciB0eXBlLgorY2xhc3MgU3ltYm9sUmVzb2x2ZXIgeworcHVibGljOgorICB2aXJ0dWFsIH5TeW1ib2xSZXNvbHZlcigpID0gZGVmYXVsdDsKKworICAvLy8gQGJyaWVmIFJldHVybnMgdGhlIGZsYWdzIGZvciBlYWNoIHN5bWJvbCBpbiBTeW1ib2xzIHRoYXQgY2FuIGJlIGZvdW5kLAorICAvLy8gICAgICAgIGFsb25nIHdpdGggdGhlIHNldCBvZiBzeW1ib2wgdGhhdCBjb3VsZCBub3QgYmUgZm91bmQuCisgIHZpcnR1YWwgU3ltYm9sTmFtZVNldCBsb29rdXBGbGFncyhTeW1ib2xGbGFnc01hcCAmRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTeW1ib2xOYW1lU2V0ICZTeW1ib2xzKSA9IDA7CisKKyAgLy8vIEBicmllZiBGb3IgZWFjaCBzeW1ib2wgaW4gU3ltYm9scyB0aGF0IGNhbiBiZSBmb3VuZCwgYXNzaWducyB0aGF0IHN5bWJvbHMKKyAgLy8vICAgICAgICB2YWx1ZSBpbiBRdWVyeS4gUmV0dXJucyB0aGUgc2V0IG9mIHN5bWJvbHMgdGhhdCBjb3VsZCBub3QgYmUgZm91bmQuCisgIHZpcnR1YWwgU3ltYm9sTmFtZVNldCBsb29rdXAoc3RkOjpzaGFyZWRfcHRyPEFzeW5jaHJvbm91c1N5bWJvbFF1ZXJ5PiBRdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xOYW1lU2V0IFN5bWJvbHMpID0gMDsKKworcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworfTsKKworLy8vIEBicmllZiBJbXBsZW1lbnRzIFN5bWJvbFJlc29sdmVyIHdpdGggYSBwYWlyIG9mIHN1cHBsaWVkIGZ1bmN0aW9uIG9iamVjdHMKKy8vLyAgICAgICAgZm9yIGNvbnZlbmllbmNlLiBTZWUgY3JlYXRlU3ltYm9sUmVzb2x2ZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTG9va3VwRmxhZ3NGbiwgdHlwZW5hbWUgTG9va3VwRm4+CitjbGFzcyBMYW1iZGFTeW1ib2xSZXNvbHZlciBmaW5hbCA6IHB1YmxpYyBTeW1ib2xSZXNvbHZlciB7CitwdWJsaWM6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBMb29rdXBGbGFnc0ZuUmVmLCB0eXBlbmFtZSBMb29rdXBGblJlZj4KKyAgTGFtYmRhU3ltYm9sUmVzb2x2ZXIoTG9va3VwRmxhZ3NGblJlZiAmJkxvb2t1cEZsYWdzLCBMb29rdXBGblJlZiAmJkxvb2t1cCkKKyAgICAgIDogTG9va3VwRmxhZ3Moc3RkOjpmb3J3YXJkPExvb2t1cEZsYWdzRm5SZWY+KExvb2t1cEZsYWdzKSksCisgICAgICAgIExvb2t1cChzdGQ6OmZvcndhcmQ8TG9va3VwRm5SZWY+KExvb2t1cCkpIHt9CisKKyAgU3ltYm9sTmFtZVNldCBsb29rdXBGbGFncyhTeW1ib2xGbGFnc01hcCAmRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3ltYm9sTmFtZVNldCAmU3ltYm9scykgZmluYWwgeworICAgIHJldHVybiBMb29rdXBGbGFncyhGbGFncywgU3ltYm9scyk7CisgIH0KKworICBTeW1ib2xOYW1lU2V0IGxvb2t1cChzdGQ6OnNoYXJlZF9wdHI8QXN5bmNocm9ub3VzU3ltYm9sUXVlcnk+IFF1ZXJ5LAorICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2xOYW1lU2V0IFN5bWJvbHMpIGZpbmFsIHsKKyAgICByZXR1cm4gTG9va3VwKHN0ZDo6bW92ZShRdWVyeSksIHN0ZDo6bW92ZShTeW1ib2xzKSk7CisgIH0KKworcHJpdmF0ZToKKyAgTG9va3VwRmxhZ3NGbiBMb29rdXBGbGFnczsKKyAgTG9va3VwRm4gTG9va3VwOworfTsKKworLy8vIEBicmllZiBDcmVhdGVzIGEgU3ltYm9sUmVzb2x2ZXIgaW1wbGVtZW50YXRpb24gZnJvbSB0aGUgcGFpciBvZiBzdXBwbGllZAorLy8vICAgICAgICBmdW5jdGlvbiBvYmplY3RzLgordGVtcGxhdGUgPHR5cGVuYW1lIExvb2t1cEZsYWdzRm4sIHR5cGVuYW1lIExvb2t1cEZuPgorc3RkOjp1bmlxdWVfcHRyPExhbWJkYVN5bWJvbFJlc29sdmVyPAorICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2N2PAorICAgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8TG9va3VwRmxhZ3NGbj46OnR5cGU+Ojp0eXBlLAorICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2N2PAorICAgICAgICB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8TG9va3VwRm4+Ojp0eXBlPjo6dHlwZT4+CitjcmVhdGVTeW1ib2xSZXNvbHZlcihMb29rdXBGbGFnc0ZuICYmTG9va3VwRmxhZ3MsIExvb2t1cEZuICYmTG9va3VwKSB7CisgIHVzaW5nIExhbWJkYVN5bWJvbFJlc29sdmVySW1wbCA9IExhbWJkYVN5bWJvbFJlc29sdmVyPAorICAgICAgdHlwZW5hbWUgc3RkOjpyZW1vdmVfY3Y8CisgICAgICAgICAgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPExvb2t1cEZsYWdzRm4+Ojp0eXBlPjo6dHlwZSwKKyAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2N2PAorICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxMb29rdXBGbj46OnR5cGU+Ojp0eXBlPjsKKyAgcmV0dXJuIGxsdm06Om1ha2VfdW5pcXVlPExhbWJkYVN5bWJvbFJlc29sdmVySW1wbD4oCisgICAgICBzdGQ6OmZvcndhcmQ8TG9va3VwRmxhZ3NGbj4oTG9va3VwRmxhZ3MpLCBzdGQ6OmZvcndhcmQ8TG9va3VwRm4+KExvb2t1cCkpOworfQorCisvLy8gQGJyaWVmIEEgTWF0ZXJpYWxpemF0aW9uVW5pdCByZXByZXNlbnRzIGEgc2V0IG9mIHN5bWJvbCBkZWZpbml0aW9ucyB0aGF0IGNhbgorLy8vICAgICAgICBiZSBtYXRlcmlhbGl6ZWQgYXMgYSBncm91cCwgb3IgaW5kaXZpZHVhbGx5IGRpc2NhcmRlZCAod2hlbgorLy8vICAgICAgICBvdmVycmlkaW5nIGRlZmluaXRpb25zIGFyZSBlbmNvdW50ZXJlZCkuCisvLy8KKy8vLyBNYXRlcmlhbGl6YXRpb25Vbml0cyBhcmUgdXNlZCB3aGVuIHByb3ZpZGluZyBsYXp5IGRlZmluaXRpb25zIG9mIHN5bWJvbHMgdG8KKy8vLyBWU09zLiBUaGUgVlNPIHdpbGwgY2FsbCBtYXRlcmlhbGl6ZSB3aGVuIHRoZSBhZGRyZXNzIG9mIGEgc3ltYm9sIGlzCisvLy8gcmVxdWVzdGVkIHZpYSB0aGUgbG9va3VwIG1ldGhvZC4gVGhlIFZTTyB3aWxsIGNhbGwgZGlzY2FyZCBpZiBhIHN0cm9uZ2VyCisvLy8gZGVmaW5pdGlvbiBpcyBhZGRlZCBvciBhbHJlYWR5IHByZXNlbnQuCitjbGFzcyBNYXRlcmlhbGl6YXRpb25Vbml0IHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+TWF0ZXJpYWxpemF0aW9uVW5pdCgpIHt9CisKKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIHNldCBvZiBzeW1ib2xzIHRoYXQgdGhpcyBzb3VyY2UgcHJvdmlkZXMuCisgIHZpcnR1YWwgU3ltYm9sRmxhZ3NNYXAgZ2V0U3ltYm9scygpID0gMDsKKworICAvLy8gQGJyaWVmIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgbWF0ZXJpYWxpemUgYWxsIHN5bWJvbHMKKyAgLy8vICAgICAgICBpbiB0aGUgbWF0ZXJpYWx6YXRpb24gdW5pdCwgZXhjZXB0IGZvciB0aG9zZSB0aGF0IGhhdmUgYmVlbgorICAvLy8gICAgICAgIHByZXZpb3VzbHkgZGlzY2FyZGVkLgorICB2aXJ0dWFsIEVycm9yIG1hdGVyaWFsaXplKFZTTyAmVikgPSAwOworCisgIC8vLyBAYnJpZWYgSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBkaXNjYXJkIHRoZSBnaXZlbiBzeW1ib2wKKyAgLy8vICAgICAgICBmcm9tIHRoZSBzb3VyY2UgKGUuZy4gaWYgdGhlIHNvdXJjZSBpcyBhbiBMTFZNIElSIE1vZHVsZSBhbmQgdGhlCisgIC8vLyAgICAgICAgc3ltYm9sIGlzIGEgZnVuY3Rpb24sIGRlbGV0ZSB0aGUgZnVuY3Rpb24gYm9keSBvciBtYXJrIGl0IGF2YWlsYWJsZQorICAvLy8gICAgICAgIGV4dGVybmFsbHkpLgorICB2aXJ0dWFsIHZvaWQgZGlzY2FyZChWU08gJlYsIFN5bWJvbFN0cmluZ1B0ciBOYW1lKSA9IDA7CisKK3ByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKK307CisKKy8vLyBAYnJpZWYgUmVwcmVzZW50cyBhIGR5bmFtaWMgbGlua2FnZSB1bml0IGluIGEgSklUIHByb2Nlc3MuCisvLy8KKy8vLyBWU08gYWN0cyBhcyBhIHN5bWJvbCB0YWJsZSAoc3ltYm9sIGRlZmluaXRpb25zIGNhbiBiZSBzZXQgYW5kIHRoZSBkeWxpYgorLy8vIHF1ZXJpZWQgdG8gZmluZCBzeW1ib2wgYWRkcmVzc2VzKSBhbmQgYXMgYSBrZXkgZm9yIHRyYWNraW5nIHJlc291cmNlcworLy8vIChzaW5jZSBhIFZTTydzIGFkZHJlc3MgaXMgZml4ZWQpLgorY2xhc3MgVlNPIHsKKyAgZnJpZW5kIGNsYXNzIEV4ZWN1dGlvblNlc3Npb247CisKK3B1YmxpYzoKKyAgZW51bSBSZWxhdGl2ZUxpbmthZ2VTdHJlbmd0aCB7CisgICAgTmV3RGVmaW5pdGlvbklzU3Ryb25nZXIsCisgICAgRHVwbGljYXRlRGVmaW5pdGlvbiwKKyAgICBFeGlzdGluZ0RlZmluaXRpb25Jc1N0cm9uZ2VyCisgIH07CisKKyAgdXNpbmcgU2V0RGVmaW5pdGlvbnNSZXN1bHQgPQorICAgICAgc3RkOjptYXA8U3ltYm9sU3RyaW5nUHRyLCBSZWxhdGl2ZUxpbmthZ2VTdHJlbmd0aD47CisKKyAgdXNpbmcgTWF0ZXJpYWxpemF0aW9uVW5pdExpc3QgPQorICAgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPE1hdGVyaWFsaXphdGlvblVuaXQ+PjsKKworICBzdHJ1Y3QgTG9va3VwUmVzdWx0IHsKKyAgICBNYXRlcmlhbGl6YXRpb25Vbml0TGlzdCBNYXRlcmlhbGl6YXRpb25Vbml0czsKKyAgICBTeW1ib2xOYW1lU2V0IFVucmVzb2x2ZWRTeW1ib2xzOworICB9OworCisgIFZTTygpID0gZGVmYXVsdDsKKworICBWU08oY29uc3QgVlNPICYpID0gZGVsZXRlOworICBWU08gJm9wZXJhdG9yPShjb25zdCBWU08gJikgPSBkZWxldGU7CisgIFZTTyhWU08gJiYpID0gZGVsZXRlOworICBWU08gJm9wZXJhdG9yPShWU08gJiYpID0gZGVsZXRlOworCisgIC8vLyBAYnJpZWYgQ29tcGFyZSBuZXcgbGlua2FnZSB3aXRoIGV4aXN0aW5nIGxpbmthZ2UuCisgIHN0YXRpYyBSZWxhdGl2ZUxpbmthZ2VTdHJlbmd0aAorICBjb21wYXJlTGlua2FnZShPcHRpb25hbDxKSVRTeW1ib2xGbGFncz4gT2xkRmxhZ3MsIEpJVFN5bWJvbEZsYWdzIE5ld0ZsYWdzKTsKKworICAvLy8gQGJyaWVmIENvbXBhcmUgbmV3IGxpbmthZ2Ugd2l0aCBhbiBleGlzdGluZyBzeW1ib2wncyBsaW5rYWdlLgorICBSZWxhdGl2ZUxpbmthZ2VTdHJlbmd0aCBjb21wYXJlTGlua2FnZShTeW1ib2xTdHJpbmdQdHIgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUU3ltYm9sRmxhZ3MgTmV3RmxhZ3MpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgQWRkcyB0aGUgZ2l2ZW4gc3ltYm9scyB0byB0aGUgbWFwcGluZyBhcyByZXNvbHZlZCwgZmluYWxpemVkCisgIC8vLyAgICAgICAgc3ltYm9scy4KKyAgLy8vCisgIC8vLyBGSVhNRTogV2UgY2FuIHRha2UgdGhpcyBieSBjb25zdC1yZWYgb25jZSBzeW1ib2wtYmFzZWQgbGF6aW5lc3MgaXMKKyAgLy8vICAgICAgICByZW1vdmVkLgorICBFcnJvciBkZWZpbmUoU3ltYm9sTWFwIE5ld1N5bWJvbHMpOworCisgIC8vLyBAYnJpZWYgQWRkcyB0aGUgZ2l2ZW4gc3ltYm9scyB0byB0aGUgbWFwcGluZyBhcyBsYXp5IHN5bWJvbHMuCisgIEVycm9yIGRlZmluZUxhenkoc3RkOjp1bmlxdWVfcHRyPE1hdGVyaWFsaXphdGlvblVuaXQ+IFNvdXJjZSk7CisKKyAgLy8vIEBicmllZiBBZGQgdGhlIGdpdmVuIHN5bWJvbC9hZGRyZXNzIG1hcHBpbmdzIHRvIHRoZSBkeWxpYiwgYnV0IGRvIG5vdAorICAvLy8gICAgICAgIG1hcmsgdGhlIHN5bWJvbHMgYXMgZmluYWxpemVkIHlldC4KKyAgdm9pZCByZXNvbHZlKFN5bWJvbE1hcCBTeW1ib2xWYWx1ZXMpOworCisgIC8vLyBAYnJpZWYgRmluYWxpemUgdGhlIGdpdmVuIHN5bWJvbHMuCisgIHZvaWQgZmluYWxpemUoU3ltYm9sTmFtZVNldCBTeW1ib2xzVG9GaW5hbGl6ZSk7CisKKyAgLy8vIEBicmllZiBMb29rIHVwIHRoZSBmbGFncyBmb3IgdGhlIGdpdmVuIHN5bWJvbHMuCisgIC8vLworICAvLy8gUmV0dXJucyB0aGUgZmxhZ3MgZm9yIHRoZSBnaXZlIHN5bWJvbHMsIHRvZ2V0aGVyIHdpdGggdGhlIHNldCBvZiBzeW1ib2xzCisgIC8vLyBub3QgZm91bmQuCisgIFN5bWJvbE5hbWVTZXQgbG9va3VwRmxhZ3MoU3ltYm9sRmxhZ3NNYXAgJkZsYWdzLCBTeW1ib2xOYW1lU2V0IFN5bWJvbHMpOworCisgIC8vLyBAYnJpZWYgQXBwbHkgdGhlIGdpdmVuIHF1ZXJ5IHRvIHRoZSBnaXZlbiBzeW1ib2xzIGluIHRoaXMgVlNPLgorICAvLy8KKyAgLy8vIEZvciBzeW1ib2xzIGluIHRoaXMgVlNPIHRoYXQgaGF2ZSBhbHJlYWR5IGJlZW4gbWF0ZXJpYWxpemVkLCB0aGVpciBhZGRyZXNzCisgIC8vLyB3aWxsIGJlIHNldCBpbiB0aGUgcXVlcnkgaW1tZWRpYXRlbHkuCisgIC8vLworICAvLy8gRm9yIHN5bWJvbHMgaW4gdGhpcyBWU08gdGhhdCBoYXZlIG5vdCBiZWVuIG1hdGVyaWFsaXplZCwgdGhlIHF1ZXJ5IHdpbGwgYmUKKyAgLy8vIHJlY29yZGVkIGFuZCB0aGUgc291cmNlIGZvciB0aG9zZSBzeW1ib2xzIChwbHVzIHRoZSBzZXQgb2Ygc3ltYm9scyB0byBiZQorICAvLy8gbWF0ZXJpYWxpemVkIGJ5IHRoYXQgc291cmNlKSB3aWxsIGJlIHJldHVybmVkIGFzIHRoZSBNYXRlcmlhbGl6YXRpb25Xb3JrCisgIC8vLyBmaWVsZCBvZiB0aGUgTG9va3VwUmVzdWx0LgorICAvLy8KKyAgLy8vIEFueSBzeW1ib2xzIG5vdCBmb3VuZCBpbiB0aGlzIFZTTyB3aWxsIGJlIHJldHVybmVkIGluIHRoZQorICAvLy8gVW5yZXNvbHZlZFN5bWJvbHMgZmllbGQgb2YgdGhlIExvb2t1cFJlc3VsdC4KKyAgTG9va3VwUmVzdWx0IGxvb2t1cChzdGQ6OnNoYXJlZF9wdHI8QXN5bmNocm9ub3VzU3ltYm9sUXVlcnk+IFF1ZXJ5LAorICAgICAgICAgICAgICAgICAgICAgIFN5bWJvbE5hbWVTZXQgU3ltYm9scyk7CisKK3ByaXZhdGU6CisgIGNsYXNzIE1hdGVyaWFsaXphdGlvbkluZm8geworICBwdWJsaWM6CisgICAgdXNpbmcgUXVlcnlMaXN0ID0gc3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPEFzeW5jaHJvbm91c1N5bWJvbFF1ZXJ5Pj47CisKKyAgICBNYXRlcmlhbGl6YXRpb25JbmZvKHNpemVfdCBTeW1ib2xzUmVtYWluaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1hdGVyaWFsaXphdGlvblVuaXQ+IE1VKTsKKworICAgIHVpbnQ2NF90IFN5bWJvbHNSZW1haW5pbmc7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1hdGVyaWFsaXphdGlvblVuaXQ+IE1VOworICAgIFN5bWJvbE1hcCBTeW1ib2xzOworICAgIHN0ZDo6bWFwPFN5bWJvbFN0cmluZ1B0ciwgUXVlcnlMaXN0PiBQZW5kaW5nUmVzb2x1dGlvbjsKKyAgICBzdGQ6Om1hcDxTeW1ib2xTdHJpbmdQdHIsIFF1ZXJ5TGlzdD4gUGVuZGluZ0ZpbmFsaXphdGlvbjsKKyAgfTsKKworICB1c2luZyBNYXRlcmlhbGl6YXRpb25JbmZvU2V0ID0gc3RkOjpzZXQ8c3RkOjp1bmlxdWVfcHRyPE1hdGVyaWFsaXphdGlvbkluZm8+PjsKKworICB1c2luZyBNYXRlcmlhbGl6YXRpb25JbmZvSXRlcmF0b3IgPSBNYXRlcmlhbGl6YXRpb25JbmZvU2V0OjppdGVyYXRvcjsKKworICBjbGFzcyBTeW1ib2xUYWJsZUVudHJ5IHsKKyAgcHVibGljOgorICAgIFN5bWJvbFRhYmxlRW50cnkoSklUU3ltYm9sRmxhZ3MgU3ltYm9sRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICBNYXRlcmlhbGl6YXRpb25JbmZvSXRlcmF0b3IgTWF0ZXJpYWxpemF0aW9uSW5mb0l0cik7CisgICAgU3ltYm9sVGFibGVFbnRyeShKSVRFdmFsdWF0ZWRTeW1ib2wgU3ltKTsKKyAgICBTeW1ib2xUYWJsZUVudHJ5KFN5bWJvbFRhYmxlRW50cnkgJiZPdGhlcik7CisgICAgflN5bWJvbFRhYmxlRW50cnkoKTsKKworICAgIFN5bWJvbFRhYmxlRW50cnkgJm9wZXJhdG9yPShKSVRFdmFsdWF0ZWRTeW1ib2wgU3ltKTsKKworICAgIEpJVFN5bWJvbEZsYWdzIGdldEZsYWdzKCkgY29uc3Q7CisgICAgdm9pZCByZXBsYWNlV2l0aChWU08gJlYsIFN5bWJvbFN0cmluZ1B0ciBOYW1lLCBKSVRTeW1ib2xGbGFncyBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgIE1hdGVyaWFsaXphdGlvbkluZm9JdGVyYXRvciBOZXdNYXRlcmlhbGl6YXRpb25JbmZvSXRyKTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TWF0ZXJpYWxpemF0aW9uVW5pdD4KKyAgICBxdWVyeShTeW1ib2xTdHJpbmdQdHIgTmFtZSwgc3RkOjpzaGFyZWRfcHRyPEFzeW5jaHJvbm91c1N5bWJvbFF1ZXJ5PiBRdWVyeSk7CisgICAgdm9pZCByZXNvbHZlKFZTTyAmViwgU3ltYm9sU3RyaW5nUHRyIE5hbWUsIEpJVEV2YWx1YXRlZFN5bWJvbCBTeW0pOworICAgIHZvaWQgZmluYWxpemUoVlNPICZWLCBTeW1ib2xTdHJpbmdQdHIgTmFtZSk7CisgICAgdm9pZCBkaXNjYXJkKFZTTyAmViwgU3ltYm9sU3RyaW5nUHRyIE5hbWUpOworCisgIHByaXZhdGU6CisgICAgdm9pZCBkZXN0cm95KCk7CisKKyAgICBKSVRTeW1ib2xGbGFncyBGbGFnczsKKyAgICBNYXRlcmlhbGl6YXRpb25JbmZvSXRlcmF0b3IgTUlJOworICAgIHVuaW9uIHsKKyAgICAgIEpJVFRhcmdldEFkZHJlc3MgQWRkcmVzczsKKyAgICAgIE1hdGVyaWFsaXphdGlvbkluZm9JdGVyYXRvciBNYXRlcmlhbGl6YXRpb25JbmZvSXRyOworICAgIH07CisgIH07CisKKyAgc3RkOjptYXA8U3ltYm9sU3RyaW5nUHRyLCBTeW1ib2xUYWJsZUVudHJ5PiBTeW1ib2xzOworICBNYXRlcmlhbGl6YXRpb25JbmZvU2V0IE1hdGVyaWFsaXphdGlvbkluZm9zOworfTsKKworLy8vIEBicmllZiBBbiBFeGVjdXRpb25TZXNzaW9uIHJlcHJlc2VudHMgYSBydW5uaW5nIEpJVCBwcm9ncmFtLgorY2xhc3MgRXhlY3V0aW9uU2Vzc2lvbiB7CitwdWJsaWM6CisgIHVzaW5nIEVycm9yUmVwb3J0ZXIgPSBzdGQ6OmZ1bmN0aW9uPHZvaWQoRXJyb3IpPjsKKworICAvLy8gQGJyaWVmIENvbnN0cnVjdCBhbiBFeGVjdXRpb25FbmdpbmUuCisgIC8vLworICAvLy8gU3ltYm9sU3RyaW5nUG9vbHMgbWF5IGJlIHNoYXJlZCBiZXR3ZWVuIEV4ZWN1dGlvblNlc3Npb25zLgorICBFeGVjdXRpb25TZXNzaW9uKFN5bWJvbFN0cmluZ1Bvb2wgJlNTUCk7CisKKyAgLy8vIEBicmllZiBSZXR1cm5zIHRoZSBTeW1ib2xTdHJpbmdQb29sIGZvciB0aGlzIEV4ZWN1dGlvblNlc3Npb24uCisgIFN5bWJvbFN0cmluZ1Bvb2wgJmdldFN5bWJvbFN0cmluZ1Bvb2woKSBjb25zdCB7IHJldHVybiBTU1A7IH0KKworICAvLy8gQGJyaWVmIFNldCB0aGUgZXJyb3IgcmVwb3J0ZXIgZnVuY3Rpb24uCisgIHZvaWQgc2V0RXJyb3JSZXBvcnRlcihFcnJvclJlcG9ydGVyIFJlcG9ydEVycm9yKSB7CisgICAgdGhpcy0+UmVwb3J0RXJyb3IgPSBzdGQ6Om1vdmUoUmVwb3J0RXJyb3IpOworICB9CisKKyAgLy8vIEBicmllZiBSZXBvcnQgYSBlcnJvciBmb3IgdGhpcyBleGVjdXRpb24gc2Vzc2lvbi4KKyAgLy8vCisgIC8vLyBVbmhhbmRsZWQgZXJyb3JzIGNhbiBiZSBzZW50IGhlcmUgdG8gbG9nIHRoZW0uCisgIHZvaWQgcmVwb3J0RXJyb3IoRXJyb3IgRXJyKSB7IFJlcG9ydEVycm9yKHN0ZDo6bW92ZShFcnIpKTsgfQorCisgIC8vLyBAYnJpZWYgQWxsb2NhdGUgYSBtb2R1bGUga2V5IGZvciBhIG5ldyBtb2R1bGUgdG8gYWRkIHRvIHRoZSBKSVQuCisgIFZNb2R1bGVLZXkgYWxsb2NhdGVWTW9kdWxlKCk7CisKKyAgLy8vIEBicmllZiBSZXR1cm4gYSBtb2R1bGUga2V5IHRvIHRoZSBFeGVjdXRpb25TZXNzaW9uIHNvIHRoYXQgaXQgY2FuIGJlCisgIC8vLyAgICAgICAgcmUtdXNlZC4gVGhpcyBzaG91bGQgb25seSBiZSBkb25lIG9uY2UgYWxsIHJlc291cmNlcyBhc3NvY2lhdGVkCisgIC8vLy8gICAgICAgd2l0aCB0aGUgb3JpZ2luYWwga2V5IGhhdmUgYmVlbiByZWxlYXNlZC4KKyAgdm9pZCByZWxlYXNlVk1vZHVsZShWTW9kdWxlS2V5IEtleSk7CisKK3B1YmxpYzoKKyAgc3RhdGljIHZvaWQgbG9nRXJyb3JzVG9TdGRFcnIoRXJyb3IgRXJyKTsKKworICBTeW1ib2xTdHJpbmdQb29sICZTU1A7CisgIFZNb2R1bGVLZXkgTGFzdEtleSA9IDA7CisgIEVycm9yUmVwb3J0ZXIgUmVwb3J0RXJyb3IgPSBsb2dFcnJvcnNUb1N0ZEVycjsKK307CisKKy8vLyBSdW5zIE1hdGVyaWFsaXplcnMgb24gdGhlIGN1cnJlbnQgdGhyZWFkIGFuZCByZXBvcnRzIGVycm9ycyB0byB0aGUgZ2l2ZW4KKy8vLyBFeGVjdXRpb25TZXNzaW9uLgorY2xhc3MgTWF0ZXJpYWxpemVPbkN1cnJlbnRUaHJlYWQgeworcHVibGljOgorICBNYXRlcmlhbGl6ZU9uQ3VycmVudFRocmVhZChFeGVjdXRpb25TZXNzaW9uICZFUykgOiBFUyhFUykge30KKworICB2b2lkIG9wZXJhdG9yKCkoVlNPICZWLCBzdGQ6OnVuaXF1ZV9wdHI8TWF0ZXJpYWxpemF0aW9uVW5pdD4gTVUpIHsKKyAgICBpZiAoYXV0byBFcnIgPSBNVS0+bWF0ZXJpYWxpemUoVikpCisgICAgICBFUy5yZXBvcnRFcnJvcihzdGQ6Om1vdmUoRXJyKSk7CisgIH0KKworcHJpdmF0ZToKKyAgRXhlY3V0aW9uU2Vzc2lvbiAmRVM7Cit9OworCisvLy8gTWF0ZXJpYWxpemF0aW9uIGZ1bmN0aW9uIG9iamVjdCB3cmFwcGVyIGZvciB0aGUgbG9va3VwIG1ldGhvZC4KK3VzaW5nIE1hdGVyaWFsaXphdGlvbkRpc3BhdGNoZXIgPQorICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChWU08gJlYsIHN0ZDo6dW5pcXVlX3B0cjxNYXRlcmlhbGl6YXRpb25Vbml0PiBTKT47CisKKy8vLyBAYnJpZWYgTG9vayB1cCBhIHNldCBvZiBzeW1ib2xzIGJ5IHNlYXJjaGluZyBhIGxpc3Qgb2YgVlNPcy4KKy8vLworLy8vIEFsbCBWU09zIGluIHRoZSBsaXN0IHNob3VsZCBiZSBub24tbnVsbC4KK0V4cGVjdGVkPFN5bWJvbE1hcD4gbG9va3VwKGNvbnN0IHN0ZDo6dmVjdG9yPFZTTyAqPiAmVlNPcywgU3ltYm9sTmFtZVNldCBOYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hdGVyaWFsaXphdGlvbkRpc3BhdGNoZXIgRGlzcGF0Y2hNYXRlcmlhbGl6YXRpb24pOworCisvLy8gQGJyaWVmIExvb2sgdXAgYSBzeW1ib2wgYnkgc2VhcmNoaW5nIGEgbGlzdCBvZiBWU09zLgorRXhwZWN0ZWQ8SklURXZhbHVhdGVkU3ltYm9sPgorbG9va3VwKGNvbnN0IHN0ZDo6dmVjdG9yPFZTTyAqPiBWU09zLCBTeW1ib2xTdHJpbmdQdHIgTmFtZSwKKyAgICAgICBNYXRlcmlhbGl6YXRpb25EaXNwYXRjaGVyIERpc3BhdGNoTWF0ZXJpYWxpemF0aW9uKTsKKworfSAvLyBFbmQgbmFtZXNwYWNlIG9yYworfSAvLyBFbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19DT1JFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9FeGVjdXRpb25VdGlscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0V4ZWN1dGlvblV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ2NmRmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9FeGVjdXRpb25VdGlscy5oCkBAIC0wLDAgKzEsMTkwIEBACisvLz09PS0gRXhlY3V0aW9uVXRpbHMuaCAtIFV0aWxpdGllcyBmb3IgZXhlY3V0aW5nIGNvZGUgaW4gT3JjIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIENvbnRhaW5zIHV0aWxpdGllcyBmb3IgZXhlY3V0aW5nIGNvZGUgaW4gT3JjLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0VYRUNVVElPTlVUSUxTX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0VYRUNVVElPTlVUSUxTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvSklUU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0NvcmUuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvT3JjRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9SdW50aW1lRHlsZC5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBDb25zdGFudEFycmF5OworY2xhc3MgR2xvYmFsVmFyaWFibGU7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIFZhbHVlOworCituYW1lc3BhY2Ugb3JjIHsKKworLy8vIEBicmllZiBUaGlzIGl0ZXJhdG9yIHByb3ZpZGVzIGEgY29udmVuaWVudCB3YXkgdG8gaXRlcmF0ZSBvdmVyIHRoZSBlbGVtZW50cworLy8vICAgICAgICBvZiBhbiBsbHZtLmdsb2JhbF9jdG9ycy9sbHZtLmdsb2JhbF9kdG9ycyBpbnN0YW5jZS4KKy8vLworLy8vICAgVGhlIGVhc2llc3Qgd2F5IHRvIGdldCBob2xkIG9mIGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIGlzIHRvIHVzZSB0aGUKKy8vLyBnZXRDb25zdHJ1Y3RvcnMvZ2V0RGVzdHJ1Y3RvcnMgZnVuY3Rpb25zLgorY2xhc3MgQ3RvckR0b3JJdGVyYXRvciB7CitwdWJsaWM6CisgIC8vLyBAYnJpZWYgQWNjZXNzb3IgZm9yIGFuIGVsZW1lbnQgb2YgdGhlIGdsb2JhbF9jdG9ycy9nbG9iYWxfZHRvcnMgYXJyYXkuCisgIC8vLworICAvLy8gICBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgcmVhZC1vbmx5IHZpZXcgb2YgdGhlIGVsZW1lbnQgd2l0aCBhbnkgY2FzdHMgb24KKyAgLy8vIHRoZSBmdW5jdGlvbiBzdHJpcHBlZCBhd2F5LgorICBzdHJ1Y3QgRWxlbWVudCB7CisgICAgRWxlbWVudCh1bnNpZ25lZCBQcmlvcml0eSwgRnVuY3Rpb24gKkZ1bmMsIFZhbHVlICpEYXRhKQorICAgICAgOiBQcmlvcml0eShQcmlvcml0eSksIEZ1bmMoRnVuYyksIERhdGEoRGF0YSkge30KKworICAgIHVuc2lnbmVkIFByaW9yaXR5OworICAgIEZ1bmN0aW9uICpGdW5jOworICAgIFZhbHVlICpEYXRhOworICB9OworCisgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGFuIGl0ZXJhdG9yIGluc3RhbmNlLiBJZiBFbmQgaXMgdHJ1ZSB0aGVuIHRoaXMgaXRlcmF0b3IKKyAgLy8vICAgICAgICBhY3RzIGFzIHRoZSBlbmQgb2YgdGhlIHJhbmdlLCBvdGhlcndpc2UgaXQgaXMgdGhlIGJlZ2lubmluZy4KKyAgQ3RvckR0b3JJdGVyYXRvcihjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YsIGJvb2wgRW5kKTsKKworICAvLy8gQGJyaWVmIFRlc3QgaXRlcmF0b3JzIGZvciBlcXVhbGl0eS4KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEN0b3JEdG9ySXRlcmF0b3IgJk90aGVyKSBjb25zdDsKKworICAvLy8gQGJyaWVmIFRlc3QgaXRlcmF0b3JzIGZvciBpbmVxdWFsaXR5LgorICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ3RvckR0b3JJdGVyYXRvciAmT3RoZXIpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgUHJlLWluY3JlbWVudCBpdGVyYXRvci4KKyAgQ3RvckR0b3JJdGVyYXRvciYgb3BlcmF0b3IrKygpOworCisgIC8vLyBAYnJpZWYgUG9zdC1pbmNyZW1lbnQgaXRlcmF0b3IuCisgIEN0b3JEdG9ySXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpOworCisgIC8vLyBAYnJpZWYgRGVyZWZlcmVuY2UgaXRlcmF0b3IuIFRoZSByZXN1bHRpbmcgdmFsdWUgcHJvdmlkZXMgYSByZWFkLW9ubHkgdmlldworICAvLy8gICAgICAgIG9mIHRoaXMgZWxlbWVudCBvZiB0aGUgZ2xvYmFsX2N0b3JzL2dsb2JhbF9kdG9ycyBsaXN0LgorICBFbGVtZW50IG9wZXJhdG9yKigpIGNvbnN0OworCitwcml2YXRlOgorICBjb25zdCBDb25zdGFudEFycmF5ICpJbml0TGlzdDsKKyAgdW5zaWduZWQgSTsKK307CisKKy8vLyBAYnJpZWYgQ3JlYXRlIGFuIGl0ZXJhdG9yIHJhbmdlIG92ZXIgdGhlIGVudHJpZXMgb2YgdGhlIGxsdm0uZ2xvYmFsX2N0b3JzCisvLy8gICAgICAgIGFycmF5LgoraXRlcmF0b3JfcmFuZ2U8Q3RvckR0b3JJdGVyYXRvcj4gZ2V0Q29uc3RydWN0b3JzKGNvbnN0IE1vZHVsZSAmTSk7CisKKy8vLyBAYnJpZWYgQ3JlYXRlIGFuIGl0ZXJhdG9yIHJhbmdlIG92ZXIgdGhlIGVudHJpZXMgb2YgdGhlIGxsdm0uZ2xvYmFsX2N0b3JzCisvLy8gICAgICAgIGFycmF5LgoraXRlcmF0b3JfcmFuZ2U8Q3RvckR0b3JJdGVyYXRvcj4gZ2V0RGVzdHJ1Y3RvcnMoY29uc3QgTW9kdWxlICZNKTsKKworLy8vIEBicmllZiBDb252ZW5pZW5jZSBjbGFzcyBmb3IgcmVjb3JkaW5nIGNvbnN0cnVjdG9yL2Rlc3RydWN0b3IgbmFtZXMgZm9yCisvLy8gICAgICAgIGxhdGVyIGV4ZWN1dGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBKSVRMYXllclQ+CitjbGFzcyBDdG9yRHRvclJ1bm5lciB7CitwdWJsaWM6CisgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGEgQ3RvckR0b3JSdW5uZXIgZm9yIHRoZSBnaXZlbiByYW5nZSB1c2luZyB0aGUgZ2l2ZW4KKyAgLy8vICAgICAgICBuYW1lIG1hbmdsaW5nIGZ1bmN0aW9uLgorICBDdG9yRHRvclJ1bm5lcihzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQ3RvckR0b3JOYW1lcywgVk1vZHVsZUtleSBLKQorICAgICAgOiBDdG9yRHRvck5hbWVzKHN0ZDo6bW92ZShDdG9yRHRvck5hbWVzKSksIEsoSykge30KKworICAvLy8gQGJyaWVmIFJ1biB0aGUgcmVjb3JkZWQgY29uc3RydWN0b3JzL2Rlc3RydWN0b3JzIHRocm91Z2ggdGhlIGdpdmVuIEpJVAorICAvLy8gICAgICAgIGxheWVyLgorICBFcnJvciBydW5WaWFMYXllcihKSVRMYXllclQgJkpJVExheWVyKSBjb25zdCB7CisgICAgdXNpbmcgQ3RvckR0b3JUeSA9IHZvaWQgKCopKCk7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkN0b3JEdG9yTmFtZSA6IEN0b3JEdG9yTmFtZXMpIHsKKyAgICAgIGlmIChhdXRvIEN0b3JEdG9yU3ltID0gSklUTGF5ZXIuZmluZFN5bWJvbEluKEssIEN0b3JEdG9yTmFtZSwgZmFsc2UpKSB7CisgICAgICAgIGlmIChhdXRvIEFkZHJPckVyciA9IEN0b3JEdG9yU3ltLmdldEFkZHJlc3MoKSkgeworICAgICAgICAgIEN0b3JEdG9yVHkgQ3RvckR0b3IgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxDdG9yRHRvclR5PihzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KCpBZGRyT3JFcnIpKTsKKyAgICAgICAgICBDdG9yRHRvcigpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICByZXR1cm4gQWRkck9yRXJyLnRha2VFcnJvcigpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKGF1dG8gRXJyID0gQ3RvckR0b3JTeW0udGFrZUVycm9yKCkpCisgICAgICAgICAgcmV0dXJuIEVycjsKKyAgICAgICAgZWxzZQorICAgICAgICAgIHJldHVybiBtYWtlX2Vycm9yPEpJVFN5bWJvbE5vdEZvdW5kPihDdG9yRHRvck5hbWUpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQ3RvckR0b3JOYW1lczsKKyAgb3JjOjpWTW9kdWxlS2V5IEs7Cit9OworCisvLy8gQGJyaWVmIFN1cHBvcnQgY2xhc3MgZm9yIHN0YXRpYyBkdG9yIGV4ZWN1dGlvbi4gRm9yIGhvc3RlZCAoaW4tcHJvY2VzcykgSklUcworLy8vICAgICAgICBvbmx5IQorLy8vCisvLy8gICBJZiBhIF9fY3hhX2F0ZXhpdCBmdW5jdGlvbiBpc24ndCBmb3VuZCBDKysgcHJvZ3JhbXMgdGhhdCB1c2Ugc3RhdGljCisvLy8gZGVzdHJ1Y3RvcnMgd2lsbCBmYWlsIHRvIGxpbmsuIEhvd2V2ZXIsIHdlIGRvbid0IHdhbnQgdG8gdXNlIHRoZSBob3N0CisvLy8gcHJvY2VzcydzIF9fY3hhX2F0ZXhpdCwgYmVjYXVzZSBpdCB3aWxsIHNjaGVkdWxlIEpJVCdkIGRlc3RydWN0b3JzIHRvIHJ1bgorLy8vIGFmdGVyIHRoZSBKSVQgaGFzIGJlZW4gdG9ybiBkb3duLCB3aGljaCBpcyBubyBnb29kLiBUaGlzIGNsYXNzIG1ha2VzIGl0IGVhc3kKKy8vLyB0byBvdmVycmlkZSBfX2N4YV9hdGV4aXQgKGFuZCB0aGUgcmVsYXRlZCBfX2Rzb19oYW5kbGUpLgorLy8vCisvLy8gICBUbyB1c2UsIGNsaWVudHMgc2hvdWxkIG1hbnVhbGx5IGNhbGwgc2VhcmNoT3ZlcnJpZGVzIGZyb20gdGhlaXIgc3ltYm9sCisvLy8gcmVzb2x2ZXIuIFRoaXMgc2hvdWxkIGdlbmVyYWxseSBiZSBkb25lIGFmdGVyIGF0dGVtcHRpbmcgc3ltYm9sIHJlc29sdXRpb24KKy8vLyBpbnNpZGUgdGhlIEpJVCwgYnV0IGJlZm9yZSBzZWFyY2hpbmcgdGhlIGhvc3QgcHJvY2VzcydzIHN5bWJvbCB0YWJsZS4gV2hlbgorLy8vIHRoZSBjbGllbnQgZGV0ZXJtaW5lcyB0aGF0IGRlc3RydWN0b3JzIHNob3VsZCBiZSBydW4gKGdlbmVyYWxseSBhdCBKSVQKKy8vLyB0ZWFyZG93biBvciBhZnRlciBhIHJldHVybiBmcm9tIG1haW4pLCB0aGUgcnVuRGVzdHJ1Y3RvcnMgbWV0aG9kIHNob3VsZCBiZQorLy8vIGNhbGxlZC4KK2NsYXNzIExvY2FsQ1hYUnVudGltZU92ZXJyaWRlcyB7CitwdWJsaWM6CisgIC8vLyBDcmVhdGUgYSBydW50aW1lLW92ZXJyaWRlcyBjbGFzcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE1hbmdsZUZ0b3JUPgorICBMb2NhbENYWFJ1bnRpbWVPdmVycmlkZXMoY29uc3QgTWFuZ2xlRnRvclQgJk1hbmdsZSkgeworICAgIGFkZE92ZXJyaWRlKE1hbmdsZSgiX19kc29faGFuZGxlIiksIHRvVGFyZ2V0QWRkcmVzcygmRFNPSGFuZGxlT3ZlcnJpZGUpKTsKKyAgICBhZGRPdmVycmlkZShNYW5nbGUoIl9fY3hhX2F0ZXhpdCIpLCB0b1RhcmdldEFkZHJlc3MoJkNYQUF0RXhpdE92ZXJyaWRlKSk7CisgIH0KKworICAvLy8gU2VhcmNoIG92ZXJyaWRlZCBzeW1ib2xzLgorICBKSVRFdmFsdWF0ZWRTeW1ib2wgc2VhcmNoT3ZlcnJpZGVzKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgICAgYXV0byBJID0gQ1hYUnVudGltZU92ZXJyaWRlcy5maW5kKE5hbWUpOworICAgIGlmIChJICE9IENYWFJ1bnRpbWVPdmVycmlkZXMuZW5kKCkpCisgICAgICByZXR1cm4gSklURXZhbHVhdGVkU3ltYm9sKEktPnNlY29uZCwgSklUU3ltYm9sRmxhZ3M6OkV4cG9ydGVkKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBSdW4gYW55IGRlc3RydWN0b3JzIHJlY29yZGVkIGJ5IHRoZSBvdmVycmlkZW4gX19jeGFfYXRleGl0IGZ1bmN0aW9uCisgIC8vLyAoQ1hBQXRFeGl0T3ZlcnJpZGUpLgorICB2b2lkIHJ1bkRlc3RydWN0b3JzKCk7CisKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQdHJUeT4KKyAgSklUVGFyZ2V0QWRkcmVzcyB0b1RhcmdldEFkZHJlc3MoUHRyVHkqIFApIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SklUVGFyZ2V0QWRkcmVzcz4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFApKTsKKyAgfQorCisgIHZvaWQgYWRkT3ZlcnJpZGUoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsIEpJVFRhcmdldEFkZHJlc3MgQWRkcikgeworICAgIENYWFJ1bnRpbWVPdmVycmlkZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKE5hbWUsIEFkZHIpKTsKKyAgfQorCisgIFN0cmluZ01hcDxKSVRUYXJnZXRBZGRyZXNzPiBDWFhSdW50aW1lT3ZlcnJpZGVzOworCisgIHVzaW5nIERlc3RydWN0b3JQdHIgPSB2b2lkICgqKSh2b2lkICopOworICB1c2luZyBDWFhEZXN0cnVjdG9yRGF0YVBhaXIgPSBzdGQ6OnBhaXI8RGVzdHJ1Y3RvclB0ciwgdm9pZCAqPjsKKyAgdXNpbmcgQ1hYRGVzdHJ1Y3RvckRhdGFQYWlyTGlzdCA9IHN0ZDo6dmVjdG9yPENYWERlc3RydWN0b3JEYXRhUGFpcj47CisgIENYWERlc3RydWN0b3JEYXRhUGFpckxpc3QgRFNPSGFuZGxlT3ZlcnJpZGU7CisgIHN0YXRpYyBpbnQgQ1hBQXRFeGl0T3ZlcnJpZGUoRGVzdHJ1Y3RvclB0ciBEZXN0cnVjdG9yLCB2b2lkICpBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqRFNPSGFuZGxlKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvcmMKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19FWEVDVVRJT05VVElMU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvR2xvYmFsTWFwcGluZ0xheWVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvR2xvYmFsTWFwcGluZ0xheWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE0OGMzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9HbG9iYWxNYXBwaW5nTGF5ZXIuaApAQCAtMCwwICsxLDExMiBAQAorLy89PT0tIEdsb2JhbE1hcHBpbmdMYXllci5oIC0gUnVuIGFsbCBJUiB0aHJvdWdoIGEgZnVuY3RvciAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDb252ZW5pZW5jZSBsYXllciBmb3IgaW5qZWN0aW5nIHN5bWJvbHMgdGhhdCB3aWxsIGFwcGVhciBpbiBjYWxscyB0bworLy8gZmluZFN5bWJvbC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19HTE9CQUxNQVBQSU5HTEFZRVJfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfR0xPQkFMTUFQUElOR0xBWUVSX0gKKworI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0pJVFN5bWJvbC5oIgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIEpJVFN5bWJvbFJlc29sdmVyOworCituYW1lc3BhY2Ugb3JjIHsKKworLy8vIEBicmllZiBHbG9iYWwgbWFwcGluZyBsYXllci4KKy8vLworLy8vICAgVGhpcyBsYXllciBvdmVycmlkZXMgdGhlIGZpbmRTeW1ib2wgbWV0aG9kIHRvIGZpcnN0IHNlYXJjaCBhIGxvY2FsIHN5bWJvbAorLy8vIHRhYmxlIHRoYXQgdGhlIGNsaWVudCBjYW4gZGVmaW5lLiBJdCBjYW4gYmUgdXNlZCB0byBpbmplY3QgbmV3IHN5bWJvbAorLy8vIG1hcHBpbmdzIGludG8gdGhlIEpJVC4gQmV3YXJlLCBob3dldmVyOiBzeW1ib2xzIHdpdGhpbiBhIHNpbmdsZSBJUiBtb2R1bGUgb3IKKy8vLyBvYmplY3QgZmlsZSB3aWxsIHN0aWxsIHJlc29sdmUgbG9jYWxseSAodmlhIFJ1bnRpbWVEeWxkJ3Mgc3ltYm9sIHRhYmxlKSAtCisvLy8gc3VjaCBpbnRlcm5hbCByZWZlcmVuY2VzIGNhbm5vdCBiZSBvdmVycmlkZW4gdmlhIHRoaXMgbGF5ZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmFzZUxheWVyVD4KK2NsYXNzIEdsb2JhbE1hcHBpbmdMYXllciB7CitwdWJsaWM6CisKKyAgLy8vIEBicmllZiBIYW5kbGUgdG8gYW4gYWRkZWQgbW9kdWxlLgorICB1c2luZyBNb2R1bGVIYW5kbGVUID0gdHlwZW5hbWUgQmFzZUxheWVyVDo6TW9kdWxlSGFuZGxlVDsKKworICAvLy8gQGJyaWVmIENvbnN0cnVjdCBhbiBHbG9iYWxNYXBwaW5nTGF5ZXIgd2l0aCB0aGUgZ2l2ZW4gQmFzZUxheWVyCisgIEdsb2JhbE1hcHBpbmdMYXllcihCYXNlTGF5ZXJUICZCYXNlTGF5ZXIpIDogQmFzZUxheWVyKEJhc2VMYXllcikge30KKworICAvLy8gQGJyaWVmIEFkZCB0aGUgZ2l2ZW4gbW9kdWxlIHRvIHRoZSBKSVQuCisgIC8vLyBAcmV0dXJuIEEgaGFuZGxlIGZvciB0aGUgYWRkZWQgbW9kdWxlcy4KKyAgRXhwZWN0ZWQ8TW9kdWxlSGFuZGxlVD4KKyAgYWRkTW9kdWxlKHN0ZDo6c2hhcmVkX3B0cjxNb2R1bGU+IE0sCisgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8SklUU3ltYm9sUmVzb2x2ZXI+IFJlc29sdmVyKSB7CisgICAgcmV0dXJuIEJhc2VMYXllci5hZGRNb2R1bGUoc3RkOjptb3ZlKE0pLCBzdGQ6Om1vdmUoUmVzb2x2ZXIpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgUmVtb3ZlIHRoZSBtb2R1bGUgc2V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgaGFuZGxlIEguCisgIEVycm9yIHJlbW92ZU1vZHVsZShNb2R1bGVIYW5kbGVUIEgpIHsgcmV0dXJuIEJhc2VMYXllci5yZW1vdmVNb2R1bGUoSCk7IH0KKworICAvLy8gQGJyaWVmIE1hbnVhbGx5IHNldCB0aGUgYWRkcmVzcyB0byByZXR1cm4gZm9yIHRoZSBnaXZlbiBzeW1ib2wuCisgIHZvaWQgc2V0R2xvYmFsTWFwcGluZyhjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwgSklUVGFyZ2V0QWRkcmVzcyBBZGRyKSB7CisgICAgU3ltYm9sVGFibGVbTmFtZV0gPSBBZGRyOworICB9CisKKyAgLy8vIEBicmllZiBSZW1vdmUgdGhlIGdpdmVuIHN5bWJvbCBmcm9tIHRoZSBnbG9iYWwgbWFwcGluZy4KKyAgdm9pZCBlcmFzZUdsb2JhbE1hcHBpbmcoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIHsKKyAgICBTeW1ib2xUYWJsZS5lcmFzZShOYW1lKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgU2VhcmNoIGZvciB0aGUgZ2l2ZW4gbmFtZWQgc3ltYm9sLgorICAvLy8KKyAgLy8vICAgICAgICAgIFRoaXMgbWV0aG9kIHdpbGwgZmlyc3Qgc2VhcmNoIHRoZSBsb2NhbCBzeW1ib2wgdGFibGUsIHJldHVybmluZworICAvLy8gICAgICAgIGFueSBzeW1ib2wgZm91bmQgdGhlcmUuIElmIHRoZSBzeW1ib2wgaXMgbm90IGZvdW5kIGluIHRoZSBsb2NhbAorICAvLy8gICAgICAgIHRhYmxlIHRoZW4gdGhpcyBjYWxsIHdpbGwgYmUgcGFzc2VkIHRocm91Z2ggdG8gdGhlIGJhc2UgbGF5ZXIuCisgIC8vLworICAvLy8gQHBhcmFtIE5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB0byBzZWFyY2ggZm9yLgorICAvLy8gQHBhcmFtIEV4cG9ydGVkU3ltYm9sc09ubHkgSWYgdHJ1ZSwgc2VhcmNoIG9ubHkgZm9yIGV4cG9ydGVkIHN5bWJvbHMuCisgIC8vLyBAcmV0dXJuIEEgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gbmFtZWQgc3ltYm9sLCBpZiBpdCBleGlzdHMuCisgIEpJVFN5bWJvbCBmaW5kU3ltYm9sKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLCBib29sIEV4cG9ydGVkU3ltYm9sc09ubHkpIHsKKyAgICBhdXRvIEkgPSBTeW1ib2xUYWJsZS5maW5kKE5hbWUpOworICAgIGlmIChJICE9IFN5bWJvbFRhYmxlLmVuZCgpKQorICAgICAgcmV0dXJuIEpJVFN5bWJvbChJLT5zZWNvbmQsIEpJVFN5bWJvbEZsYWdzOjpFeHBvcnRlZCk7CisgICAgcmV0dXJuIEJhc2VMYXllci5maW5kU3ltYm9sKE5hbWUsIEV4cG9ydGVkU3ltYm9sc09ubHkpOworICB9CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGdpdmVuIHN5bWJvbCBpbiB0aGUgY29udGV4dCBvZiB0aGUgb2YgdGhlCisgIC8vLyAgICAgICAgbW9kdWxlIHJlcHJlc2VudGVkIGJ5IHRoZSBoYW5kbGUgSC4gVGhpcyBjYWxsIGlzIGZvcndhcmRlZCB0byB0aGUKKyAgLy8vICAgICAgICBiYXNlIGxheWVyJ3MgaW1wbGVtZW50YXRpb24uCisgIC8vLyBAcGFyYW0gSCBUaGUgaGFuZGxlIGZvciB0aGUgbW9kdWxlIHRvIHNlYXJjaCBpbi4KKyAgLy8vIEBwYXJhbSBOYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdG8gc2VhcmNoIGZvci4KKyAgLy8vIEBwYXJhbSBFeHBvcnRlZFN5bWJvbHNPbmx5IElmIHRydWUsIHNlYXJjaCBvbmx5IGZvciBleHBvcnRlZCBzeW1ib2xzLgorICAvLy8gQHJldHVybiBBIGhhbmRsZSBmb3IgdGhlIGdpdmVuIG5hbWVkIHN5bWJvbCwgaWYgaXQgaXMgZm91bmQgaW4gdGhlCisgIC8vLyAgICAgICAgIGdpdmVuIG1vZHVsZS4KKyAgSklUU3ltYm9sIGZpbmRTeW1ib2xJbihNb2R1bGVIYW5kbGVUIEgsIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXhwb3J0ZWRTeW1ib2xzT25seSkgeworICAgIHJldHVybiBCYXNlTGF5ZXIuZmluZFN5bWJvbEluKEgsIE5hbWUsIEV4cG9ydGVkU3ltYm9sc09ubHkpOworICB9CisKKyAgLy8vIEBicmllZiBJbW1lZGlhdGVseSBlbWl0IGFuZCBmaW5hbGl6ZSB0aGUgbW9kdWxlIHNldCByZXByZXNlbnRlZCBieSB0aGUKKyAgLy8vICAgICAgICBnaXZlbiBoYW5kbGUuCisgIC8vLyBAcGFyYW0gSCBIYW5kbGUgZm9yIG1vZHVsZSBzZXQgdG8gZW1pdC9maW5hbGl6ZS4KKyAgRXJyb3IgZW1pdEFuZEZpbmFsaXplKE1vZHVsZUhhbmRsZVQgSCkgeworICAgIHJldHVybiBCYXNlTGF5ZXIuZW1pdEFuZEZpbmFsaXplKEgpOworICB9CisKK3ByaXZhdGU6CisgIEJhc2VMYXllclQgJkJhc2VMYXllcjsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEpJVFRhcmdldEFkZHJlc3M+IFN5bWJvbFRhYmxlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9yYworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19HTE9CQUxNQVBQSU5HTEFZRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0lSQ29tcGlsZUxheWVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvSVJDb21waWxlTGF5ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hN2Y5NDE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0lSQ29tcGlsZUxheWVyLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8vPT09LSBJUkNvbXBpbGVMYXllci5oIC0tIEVhZ2VybHkgY29tcGlsZSBJUiBmb3IgSklUIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ29udGFpbnMgdGhlIGRlZmluaXRpb24gZm9yIGEgYmFzaWMsIGVhZ2VybHkgY29tcGlsaW5nIGxheWVyIG9mIHRoZSBKSVQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfSVJDT01QSUxFTEFZRVJfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfSVJDT01QSUxFTEFZRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvSklUU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0NvcmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1vZHVsZTsKKworbmFtZXNwYWNlIG9yYyB7CisKKy8vLyBAYnJpZWYgRWFnZXIgSVIgY29tcGlsaW5nIGxheWVyLgorLy8vCisvLy8gICBUaGlzIGxheWVyIGltbWVkaWF0ZWx5IGNvbXBpbGVzIGVhY2ggSVIgbW9kdWxlIGFkZGVkIHZpYSBhZGRNb2R1bGUgdG8gYW4KKy8vLyBvYmplY3QgZmlsZSBhbmQgYWRkcyB0aGlzIG1vZHVsZSBmaWxlIHRvIHRoZSBsYXllciBiZWxvdywgd2hpY2ggbXVzdAorLy8vIGltcGxlbWVudCB0aGUgb2JqZWN0IGxheWVyIGNvbmNlcHQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmFzZUxheWVyVCwgdHlwZW5hbWUgQ29tcGlsZUZ0b3I+CitjbGFzcyBJUkNvbXBpbGVMYXllciB7CitwdWJsaWM6CisgIC8vLyBAYnJpZWYgQ2FsbGJhY2sgdHlwZSBmb3Igbm90aWZpY2F0aW9ucyB3aGVuIG1vZHVsZXMgYXJlIGNvbXBpbGVkLgorICB1c2luZyBOb3RpZnlDb21waWxlZENhbGxiYWNrID0KKyAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChWTW9kdWxlS2V5IEssIHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+KT47CisKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3QgYW4gSVJDb21waWxlTGF5ZXIgd2l0aCB0aGUgZ2l2ZW4gQmFzZUxheWVyLCB3aGljaCBtdXN0CisgIC8vLyAgICAgICAgaW1wbGVtZW50IHRoZSBPYmplY3RMYXllciBjb25jZXB0LgorICBJUkNvbXBpbGVMYXllcigKKyAgICAgIEJhc2VMYXllclQgJkJhc2VMYXllciwgQ29tcGlsZUZ0b3IgQ29tcGlsZSwKKyAgICAgIE5vdGlmeUNvbXBpbGVkQ2FsbGJhY2sgTm90aWZ5Q29tcGlsZWQgPSBOb3RpZnlDb21waWxlZENhbGxiYWNrKCkpCisgICAgICA6IEJhc2VMYXllcihCYXNlTGF5ZXIpLCBDb21waWxlKHN0ZDo6bW92ZShDb21waWxlKSksCisgICAgICAgIE5vdGlmeUNvbXBpbGVkKHN0ZDo6bW92ZShOb3RpZnlDb21waWxlZCkpIHt9CisKKyAgLy8vIEBicmllZiBHZXQgYSByZWZlcmVuY2UgdG8gdGhlIGNvbXBpbGVyIGZ1bmN0b3IuCisgIENvbXBpbGVGdG9yJiBnZXRDb21waWxlcigpIHsgcmV0dXJuIENvbXBpbGU7IH0KKworICAvLy8gQGJyaWVmIChSZSlzZXQgdGhlIE5vdGlmeUNvbXBpbGVkIGNhbGxiYWNrLgorICB2b2lkIHNldE5vdGlmeUNvbXBpbGVkKE5vdGlmeUNvbXBpbGVkQ2FsbGJhY2sgTm90aWZ5Q29tcGlsZWQpIHsKKyAgICB0aGlzLT5Ob3RpZnlDb21waWxlZCA9IHN0ZDo6bW92ZShOb3RpZnlDb21waWxlZCk7CisgIH0KKworICAvLy8gQGJyaWVmIENvbXBpbGUgdGhlIG1vZHVsZSwgYW5kIGFkZCB0aGUgcmVzdWx0aW5nIG9iamVjdCB0byB0aGUgYmFzZSBsYXllcgorICAvLy8gICAgICAgIGFsb25nIHdpdGggdGhlIGdpdmVuIG1lbW9yeSBtYW5hZ2VyIGFuZCBzeW1ib2wgcmVzb2x2ZXIuCisgIEVycm9yIGFkZE1vZHVsZShWTW9kdWxlS2V5IEssIHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IE0pIHsKKyAgICBpZiAoYXV0byBFcnIgPSBCYXNlTGF5ZXIuYWRkT2JqZWN0KHN0ZDo6bW92ZShLKSwgQ29tcGlsZSgqTSkpKQorICAgICAgcmV0dXJuIEVycjsKKyAgICBpZiAoTm90aWZ5Q29tcGlsZWQpCisgICAgICBOb3RpZnlDb21waWxlZChzdGQ6Om1vdmUoSyksIHN0ZDo6bW92ZShNKSk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICAvLy8gQGJyaWVmIFJlbW92ZSB0aGUgbW9kdWxlIGFzc29jaWF0ZWQgd2l0aCB0aGUgVk1vZHVsZUtleSBLLgorICBFcnJvciByZW1vdmVNb2R1bGUoVk1vZHVsZUtleSBLKSB7IHJldHVybiBCYXNlTGF5ZXIucmVtb3ZlT2JqZWN0KEspOyB9CisKKyAgLy8vIEBicmllZiBTZWFyY2ggZm9yIHRoZSBnaXZlbiBuYW1lZCBzeW1ib2wuCisgIC8vLyBAcGFyYW0gTmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRvIHNlYXJjaCBmb3IuCisgIC8vLyBAcGFyYW0gRXhwb3J0ZWRTeW1ib2xzT25seSBJZiB0cnVlLCBzZWFyY2ggb25seSBmb3IgZXhwb3J0ZWQgc3ltYm9scy4KKyAgLy8vIEByZXR1cm4gQSBoYW5kbGUgZm9yIHRoZSBnaXZlbiBuYW1lZCBzeW1ib2wsIGlmIGl0IGV4aXN0cy4KKyAgSklUU3ltYm9sIGZpbmRTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsIGJvb2wgRXhwb3J0ZWRTeW1ib2xzT25seSkgeworICAgIHJldHVybiBCYXNlTGF5ZXIuZmluZFN5bWJvbChOYW1lLCBFeHBvcnRlZFN5bWJvbHNPbmx5KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBhZGRyZXNzIG9mIHRoZSBnaXZlbiBzeW1ib2wgaW4gY29tcGlsZWQgbW9kdWxlIHJlcHJlc2VudGVkCisgIC8vLyAgICAgICAgYnkgdGhlIGhhbmRsZSBILiBUaGlzIGNhbGwgaXMgZm9yd2FyZGVkIHRvIHRoZSBiYXNlIGxheWVyJ3MKKyAgLy8vICAgICAgICBpbXBsZW1lbnRhdGlvbi4KKyAgLy8vIEBwYXJhbSBLIFRoZSBWTW9kdWxlS2V5IGZvciB0aGUgbW9kdWxlIHRvIHNlYXJjaCBpbi4KKyAgLy8vIEBwYXJhbSBOYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdG8gc2VhcmNoIGZvci4KKyAgLy8vIEBwYXJhbSBFeHBvcnRlZFN5bWJvbHNPbmx5IElmIHRydWUsIHNlYXJjaCBvbmx5IGZvciBleHBvcnRlZCBzeW1ib2xzLgorICAvLy8gQHJldHVybiBBIGhhbmRsZSBmb3IgdGhlIGdpdmVuIG5hbWVkIHN5bWJvbCwgaWYgaXQgaXMgZm91bmQgaW4gdGhlCisgIC8vLyAgICAgICAgIGdpdmVuIG1vZHVsZS4KKyAgSklUU3ltYm9sIGZpbmRTeW1ib2xJbihWTW9kdWxlS2V5IEssIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXhwb3J0ZWRTeW1ib2xzT25seSkgeworICAgIHJldHVybiBCYXNlTGF5ZXIuZmluZFN5bWJvbEluKEssIE5hbWUsIEV4cG9ydGVkU3ltYm9sc09ubHkpOworICB9CisKKyAgLy8vIEBicmllZiBJbW1lZGlhdGVseSBlbWl0IGFuZCBmaW5hbGl6ZSB0aGUgbW9kdWxlIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbgorICAvLy8gICAgICAgIGhhbmRsZS4KKyAgLy8vIEBwYXJhbSBLIFRoZSBWTW9kdWxlS2V5IGZvciB0aGUgbW9kdWxlIHRvIGVtaXQvZmluYWxpemUuCisgIEVycm9yIGVtaXRBbmRGaW5hbGl6ZShWTW9kdWxlS2V5IEspIHsgcmV0dXJuIEJhc2VMYXllci5lbWl0QW5kRmluYWxpemUoSyk7IH0KKworcHJpdmF0ZToKKyAgQmFzZUxheWVyVCAmQmFzZUxheWVyOworICBDb21waWxlRnRvciBDb21waWxlOworICBOb3RpZnlDb21waWxlZENhbGxiYWNrIE5vdGlmeUNvbXBpbGVkOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9yYworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0lSQ09NUElMSU5HTEFZRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0lSVHJhbnNmb3JtTGF5ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9JUlRyYW5zZm9ybUxheWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGYxZmU3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9JUlRyYW5zZm9ybUxheWVyLmgKQEAgLTAsMCArMSw5MCBAQAorLy89PT0tIElSVHJhbnNmb3JtTGF5ZXIuaCAtIFJ1biBhbGwgSVIgdGhyb3VnaCBhIGZ1bmN0b3IgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBSdW4gYWxsIElSIHBhc3NlZCBpbiB0aHJvdWdoIGEgdXNlciBzdXBwbGllZCBmdW5jdG9yLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0lSVFJBTlNGT1JNTEFZRVJfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfSVJUUkFOU0ZPUk1MQVlFUl9ICisKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9KSVRTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvQ29yZS5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1vZHVsZTsKK25hbWVzcGFjZSBvcmMgeworCisvLy8gQGJyaWVmIElSIG11dGF0aW5nIGxheWVyLgorLy8vCisvLy8gICBUaGlzIGxheWVyIGFwcGxpZXMgYSB1c2VyIHN1cHBsaWVkIHRyYW5zZm9ybSB0byBlYWNoIG1vZHVsZSB0aGF0IGlzIGFkZGVkLAorLy8vIHRoZW4gYWRkcyB0aGUgdHJhbnNmb3JtZWQgbW9kdWxlIHRvIHRoZSBsYXllciBiZWxvdy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBCYXNlTGF5ZXJULCB0eXBlbmFtZSBUcmFuc2Zvcm1GdG9yPgorY2xhc3MgSVJUcmFuc2Zvcm1MYXllciB7CitwdWJsaWM6CisKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3QgYW4gSVJUcmFuc2Zvcm1MYXllciB3aXRoIHRoZSBnaXZlbiBCYXNlTGF5ZXIKKyAgSVJUcmFuc2Zvcm1MYXllcihCYXNlTGF5ZXJUICZCYXNlTGF5ZXIsCisgICAgICAgICAgICAgICAgICAgVHJhbnNmb3JtRnRvciBUcmFuc2Zvcm0gPSBUcmFuc2Zvcm1GdG9yKCkpCisgICAgOiBCYXNlTGF5ZXIoQmFzZUxheWVyKSwgVHJhbnNmb3JtKHN0ZDo6bW92ZShUcmFuc2Zvcm0pKSB7fQorCisgIC8vLyBAYnJpZWYgQXBwbHkgdGhlIHRyYW5zZm9ybSBmdW5jdG9yIHRvIHRoZSBtb2R1bGUsIHRoZW4gYWRkIHRoZSBtb2R1bGUgdG8KKyAgLy8vICAgICAgICB0aGUgbGF5ZXIgYmVsb3csIGFsb25nIHdpdGggdGhlIG1lbW9yeSBtYW5hZ2VyIGFuZCBzeW1ib2wgcmVzb2x2ZXIuCisgIC8vLworICAvLy8gQHJldHVybiBBIGhhbmRsZSBmb3IgdGhlIGFkZGVkIG1vZHVsZXMuCisgIEVycm9yIGFkZE1vZHVsZShWTW9kdWxlS2V5IEssIHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IE0pIHsKKyAgICByZXR1cm4gQmFzZUxheWVyLmFkZE1vZHVsZShzdGQ6Om1vdmUoSyksIFRyYW5zZm9ybShzdGQ6Om1vdmUoTSkpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgUmVtb3ZlIHRoZSBtb2R1bGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBWTW9kdWxlS2V5IEsuCisgIEVycm9yIHJlbW92ZU1vZHVsZShWTW9kdWxlS2V5IEspIHsgcmV0dXJuIEJhc2VMYXllci5yZW1vdmVNb2R1bGUoSyk7IH0KKworICAvLy8gQGJyaWVmIFNlYXJjaCBmb3IgdGhlIGdpdmVuIG5hbWVkIHN5bWJvbC4KKyAgLy8vIEBwYXJhbSBOYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdG8gc2VhcmNoIGZvci4KKyAgLy8vIEBwYXJhbSBFeHBvcnRlZFN5bWJvbHNPbmx5IElmIHRydWUsIHNlYXJjaCBvbmx5IGZvciBleHBvcnRlZCBzeW1ib2xzLgorICAvLy8gQHJldHVybiBBIGhhbmRsZSBmb3IgdGhlIGdpdmVuIG5hbWVkIHN5bWJvbCwgaWYgaXQgZXhpc3RzLgorICBKSVRTeW1ib2wgZmluZFN5bWJvbChjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwgYm9vbCBFeHBvcnRlZFN5bWJvbHNPbmx5KSB7CisgICAgcmV0dXJuIEJhc2VMYXllci5maW5kU3ltYm9sKE5hbWUsIEV4cG9ydGVkU3ltYm9sc09ubHkpOworICB9CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIGFkZHJlc3Mgb2YgdGhlIGdpdmVuIHN5bWJvbCBpbiB0aGUgY29udGV4dCBvZiB0aGUgbW9kdWxlCisgIC8vLyAgICAgICAgcmVwcmVzZW50ZWQgYnkgdGhlIFZNb2R1bGVLZXkgSy4gVGhpcyBjYWxsIGlzIGZvcndhcmRlZCB0byB0aGUgYmFzZQorICAvLy8gICAgICAgIGxheWVyJ3MgaW1wbGVtZW50YXRpb24uCisgIC8vLyBAcGFyYW0gSyBUaGUgVk1vZHVsZUtleSBmb3IgdGhlIG1vZHVsZSB0byBzZWFyY2ggaW4uCisgIC8vLyBAcGFyYW0gTmFtZSBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRvIHNlYXJjaCBmb3IuCisgIC8vLyBAcGFyYW0gRXhwb3J0ZWRTeW1ib2xzT25seSBJZiB0cnVlLCBzZWFyY2ggb25seSBmb3IgZXhwb3J0ZWQgc3ltYm9scy4KKyAgLy8vIEByZXR1cm4gQSBoYW5kbGUgZm9yIHRoZSBnaXZlbiBuYW1lZCBzeW1ib2wsIGlmIGl0IGlzIGZvdW5kIGluIHRoZQorICAvLy8gICAgICAgICBnaXZlbiBtb2R1bGUuCisgIEpJVFN5bWJvbCBmaW5kU3ltYm9sSW4oVk1vZHVsZUtleSBLLCBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEV4cG9ydGVkU3ltYm9sc09ubHkpIHsKKyAgICByZXR1cm4gQmFzZUxheWVyLmZpbmRTeW1ib2xJbihLLCBOYW1lLCBFeHBvcnRlZFN5bWJvbHNPbmx5KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgSW1tZWRpYXRlbHkgZW1pdCBhbmQgZmluYWxpemUgdGhlIG1vZHVsZSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4KKyAgLy8vICAgICAgICBWTW9kdWxlS2V5LgorICAvLy8gQHBhcmFtIEsgVGhlIFZNb2R1bGVLZXkgZm9yIHRoZSBtb2R1bGUgdG8gZW1pdC9maW5hbGl6ZS4KKyAgRXJyb3IgZW1pdEFuZEZpbmFsaXplKFZNb2R1bGVLZXkgSykgeyByZXR1cm4gQmFzZUxheWVyLmVtaXRBbmRGaW5hbGl6ZShLKTsgfQorCisgIC8vLyBAYnJpZWYgQWNjZXNzIHRoZSB0cmFuc2Zvcm0gZnVuY3RvciBkaXJlY3RseS4KKyAgVHJhbnNmb3JtRnRvciYgZ2V0VHJhbnNmb3JtKCkgeyByZXR1cm4gVHJhbnNmb3JtOyB9CisKKyAgLy8vIEBicmllZiBBY2Nlc3MgdGhlIG11bWF0ZSBmdW5jdG9yIGRpcmVjdGx5LgorICBjb25zdCBUcmFuc2Zvcm1GdG9yJiBnZXRUcmFuc2Zvcm0oKSBjb25zdCB7IHJldHVybiBUcmFuc2Zvcm07IH0KKworcHJpdmF0ZToKKyAgQmFzZUxheWVyVCAmQmFzZUxheWVyOworICBUcmFuc2Zvcm1GdG9yIFRyYW5zZm9ybTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvcmMKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfSVJUUkFOU0ZPUk1MQVlFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvSW5kaXJlY3Rpb25VdGlscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0luZGlyZWN0aW9uVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjliODZhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0luZGlyZWN0aW9uVXRpbHMuaApAQCAtMCwwICsxLDQ1MSBAQAorLy89PT0tIEluZGlyZWN0aW9uVXRpbHMuaCAtIFV0aWxpdGllcyBmb3IgYWRkaW5nIGluZGlyZWN0aW9ucyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDb250YWlucyB1dGlsaXRpZXMgZm9yIGFkZGluZyBpbmRpcmVjdGlvbnMgYW5kIGJyZWFraW5nIHVwIG1vZHVsZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfSU5ESVJFQ1RJT05VVElMU19ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19JTkRJUkVDVElPTlVUSUxTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvSklUU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Qcm9jZXNzLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1ZhbHVlTWFwcGVyLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIENvbnN0YW50OworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBGdW5jdGlvblR5cGU7CitjbGFzcyBHbG9iYWxBbGlhczsKK2NsYXNzIEdsb2JhbFZhcmlhYmxlOworY2xhc3MgTW9kdWxlOworY2xhc3MgUG9pbnRlclR5cGU7CitjbGFzcyBUcmlwbGU7CitjbGFzcyBWYWx1ZTsKKworbmFtZXNwYWNlIG9yYyB7CisKKy8vLyBAYnJpZWYgVGFyZ2V0LWluZGVwZW5kZW50IGJhc2UgY2xhc3MgZm9yIGNvbXBpbGUgY2FsbGJhY2sgbWFuYWdlbWVudC4KK2NsYXNzIEpJVENvbXBpbGVDYWxsYmFja01hbmFnZXIgeworcHVibGljOgorICB1c2luZyBDb21waWxlRnRvciA9IHN0ZDo6ZnVuY3Rpb248SklUVGFyZ2V0QWRkcmVzcygpPjsKKworICAvLy8gQGJyaWVmIEhhbmRsZSB0byBhIG5ld2x5IGNyZWF0ZWQgY29tcGlsZSBjYWxsYmFjay4gQ2FuIGJlIHVzZWQgdG8gZ2V0IGFuCisgIC8vLyAgICAgICAgSVIgY29uc3RhbnQgcmVwcmVzZW50aW5nIHRoZSBhZGRyZXNzIG9mIHRoZSB0cmFtcG9saW5lLCBhbmQgdG8gc2V0CisgIC8vLyAgICAgICAgdGhlIGNvbXBpbGUgYWN0aW9uIGZvciB0aGUgY2FsbGJhY2suCisgIGNsYXNzIENvbXBpbGVDYWxsYmFja0luZm8geworICBwdWJsaWM6CisgICAgQ29tcGlsZUNhbGxiYWNrSW5mbyhKSVRUYXJnZXRBZGRyZXNzIEFkZHIsIENvbXBpbGVGdG9yICZDb21waWxlKQorICAgICAgICA6IEFkZHIoQWRkciksIENvbXBpbGUoQ29tcGlsZSkge30KKworICAgIEpJVFRhcmdldEFkZHJlc3MgZ2V0QWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIEFkZHI7IH0KKyAgICB2b2lkIHNldENvbXBpbGVBY3Rpb24oQ29tcGlsZUZ0b3IgQ29tcGlsZSkgeworICAgICAgdGhpcy0+Q29tcGlsZSA9IHN0ZDo6bW92ZShDb21waWxlKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBKSVRUYXJnZXRBZGRyZXNzIEFkZHI7CisgICAgQ29tcGlsZUZ0b3IgJkNvbXBpbGU7CisgIH07CisKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3QgYSBKSVRDb21waWxlQ2FsbGJhY2tNYW5hZ2VyLgorICAvLy8gQHBhcmFtIEVycm9ySGFuZGxlckFkZHJlc3MgVGhlIGFkZHJlc3Mgb2YgYW4gZXJyb3IgaGFuZGxlciBpbiB0aGUgdGFyZ2V0CisgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jZXNzIHRvIGJlIHVzZWQgaWYgYSBjb21waWxlIGNhbGxiYWNrIGZhaWxzLgorICBKSVRDb21waWxlQ2FsbGJhY2tNYW5hZ2VyKEpJVFRhcmdldEFkZHJlc3MgRXJyb3JIYW5kbGVyQWRkcmVzcykKKyAgICAgIDogRXJyb3JIYW5kbGVyQWRkcmVzcyhFcnJvckhhbmRsZXJBZGRyZXNzKSB7fQorCisgIHZpcnR1YWwgfkpJVENvbXBpbGVDYWxsYmFja01hbmFnZXIoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIEBicmllZiBFeGVjdXRlIHRoZSBjYWxsYmFjayBmb3IgdGhlIGdpdmVuIHRyYW1wb2xpbmUgaWQuIENhbGxlZCBieSB0aGUgSklUCisgIC8vLyAgICAgICAgdG8gY29tcGlsZSBmdW5jdGlvbnMgb24gZGVtYW5kLgorICBKSVRUYXJnZXRBZGRyZXNzIGV4ZWN1dGVDb21waWxlQ2FsbGJhY2soSklUVGFyZ2V0QWRkcmVzcyBUcmFtcG9saW5lQWRkcikgeworICAgIGF1dG8gSSA9IEFjdGl2ZVRyYW1wb2xpbmVzLmZpbmQoVHJhbXBvbGluZUFkZHIpOworICAgIC8vIEZJWE1FOiBBbHNvIHJhaXNlIGFuIGVycm9yIGluIHRoZSBPcmMgZXJyb3ItaGFuZGxlciB3aGVuIHdlIGZpbmFsbHkgaGF2ZQorICAgIC8vICAgICAgICBvbmUuCisgICAgaWYgKEkgPT0gQWN0aXZlVHJhbXBvbGluZXMuZW5kKCkpCisgICAgICByZXR1cm4gRXJyb3JIYW5kbGVyQWRkcmVzczsKKworICAgIC8vIEZvdW5kIGEgY2FsbGJhY2sgaGFuZGxlci4gWWFuayB0aGlzIHRyYW1wb2xpbmUgb3V0IG9mIHRoZSBhY3RpdmUgbGlzdCBhbmQKKyAgICAvLyBwdXQgaXQgYmFjayBpbiB0aGUgYXZhaWxhYmxlIHRyYW1wb2xpbmVzIGxpc3QsIHRoZW4gdHJ5IHRvIHJ1biB0aGUKKyAgICAvLyBoYW5kbGVyJ3MgY29tcGlsZSBhbmQgdXBkYXRlIGFjdGlvbnMuCisgICAgLy8gTW92aW5nIHRoZSB0cmFtcG9saW5lIElEIGJhY2sgdG8gdGhlIGF2YWlsYWJsZSBsaXN0IGZpcnN0IG1lYW5zIHRoZXJlJ3MKKyAgICAvLyBhdAorICAgIC8vIGxlYXN0IG9uZSBhdmFpbGFibGUgdHJhbXBvbGluZSBpZiB0aGUgY29tcGlsZSBhY3Rpb24gdHJpZ2dlcnMgYSByZXF1ZXN0CisgICAgLy8gZm9yCisgICAgLy8gYSBuZXcgb25lLgorICAgIGF1dG8gQ29tcGlsZSA9IHN0ZDo6bW92ZShJLT5zZWNvbmQpOworICAgIEFjdGl2ZVRyYW1wb2xpbmVzLmVyYXNlKEkpOworICAgIEF2YWlsYWJsZVRyYW1wb2xpbmVzLnB1c2hfYmFjayhUcmFtcG9saW5lQWRkcik7CisKKyAgICBpZiAoYXV0byBBZGRyID0gQ29tcGlsZSgpKQorICAgICAgcmV0dXJuIEFkZHI7CisKKyAgICByZXR1cm4gRXJyb3JIYW5kbGVyQWRkcmVzczsKKyAgfQorCisgIC8vLyBAYnJpZWYgUmVzZXJ2ZSBhIGNvbXBpbGUgY2FsbGJhY2suCisgIEV4cGVjdGVkPENvbXBpbGVDYWxsYmFja0luZm8+IGdldENvbXBpbGVDYWxsYmFjaygpIHsKKyAgICBpZiAoYXV0byBUcmFtcG9saW5lQWRkck9yRXJyID0gZ2V0QXZhaWxhYmxlVHJhbXBvbGluZUFkZHIoKSkgeworICAgICAgY29uc3QgYXV0byAmVHJhbXBvbGluZUFkZHIgPSAqVHJhbXBvbGluZUFkZHJPckVycjsKKyAgICAgIGF1dG8gJkNvbXBpbGUgPSB0aGlzLT5BY3RpdmVUcmFtcG9saW5lc1tUcmFtcG9saW5lQWRkcl07CisgICAgICByZXR1cm4gQ29tcGlsZUNhbGxiYWNrSW5mbyhUcmFtcG9saW5lQWRkciwgQ29tcGlsZSk7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gVHJhbXBvbGluZUFkZHJPckVyci50YWtlRXJyb3IoKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgR2V0IGEgQ29tcGlsZUNhbGxiYWNrSW5mbyBmb3IgYW4gZXhpc3RpbmcgY2FsbGJhY2suCisgIENvbXBpbGVDYWxsYmFja0luZm8gZ2V0Q29tcGlsZUNhbGxiYWNrSW5mbyhKSVRUYXJnZXRBZGRyZXNzIFRyYW1wb2xpbmVBZGRyKSB7CisgICAgYXV0byBJID0gQWN0aXZlVHJhbXBvbGluZXMuZmluZChUcmFtcG9saW5lQWRkcik7CisgICAgYXNzZXJ0KEkgIT0gQWN0aXZlVHJhbXBvbGluZXMuZW5kKCkgJiYgIk5vdCBhbiBhY3RpdmUgdHJhbXBvbGluZS4iKTsKKyAgICByZXR1cm4gQ29tcGlsZUNhbGxiYWNrSW5mbyhJLT5maXJzdCwgSS0+c2Vjb25kKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgUmVsZWFzZSBhIGNvbXBpbGUgY2FsbGJhY2suCisgIC8vLworICAvLy8gICBOb3RlOiBDYWxsYmFja3MgYXJlIGF1dG8tcmVsZWFzZWQgYWZ0ZXIgdGhleSBleGVjdXRlLiBUaGlzIG1ldGhvZCBzaG91bGQKKyAgLy8vIG9ubHkgYmUgY2FsbGVkIHRvIG1hbnVhbGx5IHJlbGVhc2UgYSBjYWxsYmFjayB0aGF0IGlzIG5vdCBnb2luZyB0bworICAvLy8gZXhlY3V0ZS4KKyAgdm9pZCByZWxlYXNlQ29tcGlsZUNhbGxiYWNrKEpJVFRhcmdldEFkZHJlc3MgVHJhbXBvbGluZUFkZHIpIHsKKyAgICBhdXRvIEkgPSBBY3RpdmVUcmFtcG9saW5lcy5maW5kKFRyYW1wb2xpbmVBZGRyKTsKKyAgICBhc3NlcnQoSSAhPSBBY3RpdmVUcmFtcG9saW5lcy5lbmQoKSAmJiAiTm90IGFuIGFjdGl2ZSB0cmFtcG9saW5lLiIpOworICAgIEFjdGl2ZVRyYW1wb2xpbmVzLmVyYXNlKEkpOworICAgIEF2YWlsYWJsZVRyYW1wb2xpbmVzLnB1c2hfYmFjayhUcmFtcG9saW5lQWRkcik7CisgIH0KKworcHJvdGVjdGVkOgorICBKSVRUYXJnZXRBZGRyZXNzIEVycm9ySGFuZGxlckFkZHJlc3M7CisKKyAgdXNpbmcgVHJhbXBvbGluZU1hcFQgPSBzdGQ6Om1hcDxKSVRUYXJnZXRBZGRyZXNzLCBDb21waWxlRnRvcj47CisgIFRyYW1wb2xpbmVNYXBUIEFjdGl2ZVRyYW1wb2xpbmVzOworICBzdGQ6OnZlY3RvcjxKSVRUYXJnZXRBZGRyZXNzPiBBdmFpbGFibGVUcmFtcG9saW5lczsKKworcHJpdmF0ZToKKyAgRXhwZWN0ZWQ8SklUVGFyZ2V0QWRkcmVzcz4gZ2V0QXZhaWxhYmxlVHJhbXBvbGluZUFkZHIoKSB7CisgICAgaWYgKHRoaXMtPkF2YWlsYWJsZVRyYW1wb2xpbmVzLmVtcHR5KCkpCisgICAgICBpZiAoYXV0byBFcnIgPSBncm93KCkpCisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoRXJyKTsKKyAgICBhc3NlcnQoIXRoaXMtPkF2YWlsYWJsZVRyYW1wb2xpbmVzLmVtcHR5KCkgJiYKKyAgICAgICAgICAgIkZhaWxlZCB0byBncm93IGF2YWlsYWJsZSB0cmFtcG9saW5lcy4iKTsKKyAgICBKSVRUYXJnZXRBZGRyZXNzIFRyYW1wb2xpbmVBZGRyID0gdGhpcy0+QXZhaWxhYmxlVHJhbXBvbGluZXMuYmFjaygpOworICAgIHRoaXMtPkF2YWlsYWJsZVRyYW1wb2xpbmVzLnBvcF9iYWNrKCk7CisgICAgcmV0dXJuIFRyYW1wb2xpbmVBZGRyOworICB9CisKKyAgLy8gQ3JlYXRlIG5ldyB0cmFtcG9saW5lcyAtIHRvIGJlIGltcGxlbWVudGVkIGluIHN1YmNsYXNzZXMuCisgIHZpcnR1YWwgRXJyb3IgZ3JvdygpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7Cit9OworCisvLy8gQGJyaWVmIE1hbmFnZSBjb21waWxlIGNhbGxiYWNrcyBmb3IgaW4tcHJvY2VzcyBKSVRzLgordGVtcGxhdGUgPHR5cGVuYW1lIFRhcmdldFQ+CitjbGFzcyBMb2NhbEpJVENvbXBpbGVDYWxsYmFja01hbmFnZXIgOiBwdWJsaWMgSklUQ29tcGlsZUNhbGxiYWNrTWFuYWdlciB7CitwdWJsaWM6CisgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGEgSW5Qcm9jZXNzSklUQ29tcGlsZUNhbGxiYWNrTWFuYWdlci4KKyAgLy8vIEBwYXJhbSBFcnJvckhhbmRsZXJBZGRyZXNzIFRoZSBhZGRyZXNzIG9mIGFuIGVycm9yIGhhbmRsZXIgaW4gdGhlIHRhcmdldAorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvY2VzcyB0byBiZSB1c2VkIGlmIGEgY29tcGlsZSBjYWxsYmFjayBmYWlscy4KKyAgTG9jYWxKSVRDb21waWxlQ2FsbGJhY2tNYW5hZ2VyKEpJVFRhcmdldEFkZHJlc3MgRXJyb3JIYW5kbGVyQWRkcmVzcykKKyAgICAgIDogSklUQ29tcGlsZUNhbGxiYWNrTWFuYWdlcihFcnJvckhhbmRsZXJBZGRyZXNzKSB7CisgICAgLy8vIFNldCB1cCB0aGUgcmVzb2x2ZXIgYmxvY2suCisgICAgc3RkOjplcnJvcl9jb2RlIEVDOworICAgIFJlc29sdmVyQmxvY2sgPSBzeXM6Ok93bmluZ01lbW9yeUJsb2NrKHN5czo6TWVtb3J5OjphbGxvY2F0ZU1hcHBlZE1lbW9yeSgKKyAgICAgICAgVGFyZ2V0VDo6UmVzb2x2ZXJDb2RlU2l6ZSwgbnVsbHB0ciwKKyAgICAgICAgc3lzOjpNZW1vcnk6Ok1GX1JFQUQgfCBzeXM6Ok1lbW9yeTo6TUZfV1JJVEUsIEVDKSk7CisgICAgYXNzZXJ0KCFFQyAmJiAiRmFpbGVkIHRvIGFsbG9jYXRlIHJlc29sdmVyIGJsb2NrIik7CisKKyAgICBUYXJnZXRUOjp3cml0ZVJlc29sdmVyQ29kZShzdGF0aWNfY2FzdDx1aW50OF90ICo+KFJlc29sdmVyQmxvY2suYmFzZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVlbnRlciwgdGhpcyk7CisKKyAgICBFQyA9IHN5czo6TWVtb3J5Ojpwcm90ZWN0TWFwcGVkTWVtb3J5KFJlc29sdmVyQmxvY2suZ2V0TWVtb3J5QmxvY2soKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5czo6TWVtb3J5OjpNRl9SRUFEIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXM6Ok1lbW9yeTo6TUZfRVhFQyk7CisgICAgYXNzZXJ0KCFFQyAmJiAiRmFpbGVkIHRvIG1wcm90ZWN0IHJlc29sdmVyIGJsb2NrIik7CisgIH0KKworcHJpdmF0ZToKKyAgc3RhdGljIEpJVFRhcmdldEFkZHJlc3MgcmVlbnRlcih2b2lkICpDQ01nciwgdm9pZCAqVHJhbXBvbGluZUlkKSB7CisgICAgSklUQ29tcGlsZUNhbGxiYWNrTWFuYWdlciAqTWdyID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8SklUQ29tcGlsZUNhbGxiYWNrTWFuYWdlciAqPihDQ01ncik7CisgICAgcmV0dXJuIE1nci0+ZXhlY3V0ZUNvbXBpbGVDYWxsYmFjaygKKyAgICAgICAgc3RhdGljX2Nhc3Q8SklUVGFyZ2V0QWRkcmVzcz4oCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oVHJhbXBvbGluZUlkKSkpOworICB9CisKKyAgRXJyb3IgZ3JvdygpIG92ZXJyaWRlIHsKKyAgICBhc3NlcnQodGhpcy0+QXZhaWxhYmxlVHJhbXBvbGluZXMuZW1wdHkoKSAmJiAiR3Jvd2luZyBwcmVtYXR1cmVseT8iKTsKKworICAgIHN0ZDo6ZXJyb3JfY29kZSBFQzsKKyAgICBhdXRvIFRyYW1wb2xpbmVCbG9jayA9CisgICAgICAgIHN5czo6T3duaW5nTWVtb3J5QmxvY2soc3lzOjpNZW1vcnk6OmFsbG9jYXRlTWFwcGVkTWVtb3J5KAorICAgICAgICAgICAgc3lzOjpQcm9jZXNzOjpnZXRQYWdlU2l6ZSgpLCBudWxscHRyLAorICAgICAgICAgICAgc3lzOjpNZW1vcnk6Ok1GX1JFQUQgfCBzeXM6Ok1lbW9yeTo6TUZfV1JJVEUsIEVDKSk7CisgICAgaWYgKEVDKQorICAgICAgcmV0dXJuIGVycm9yQ29kZVRvRXJyb3IoRUMpOworCisgICAgdW5zaWduZWQgTnVtVHJhbXBvbGluZXMgPQorICAgICAgICAoc3lzOjpQcm9jZXNzOjpnZXRQYWdlU2l6ZSgpIC0gVGFyZ2V0VDo6UG9pbnRlclNpemUpIC8KKyAgICAgICAgVGFyZ2V0VDo6VHJhbXBvbGluZVNpemU7CisKKyAgICB1aW50OF90ICpUcmFtcG9saW5lTWVtID0gc3RhdGljX2Nhc3Q8dWludDhfdCAqPihUcmFtcG9saW5lQmxvY2suYmFzZSgpKTsKKyAgICBUYXJnZXRUOjp3cml0ZVRyYW1wb2xpbmVzKFRyYW1wb2xpbmVNZW0sIFJlc29sdmVyQmxvY2suYmFzZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTnVtVHJhbXBvbGluZXMpOworCisgICAgZm9yICh1bnNpZ25lZCBJID0gMDsgSSA8IE51bVRyYW1wb2xpbmVzOyArK0kpCisgICAgICB0aGlzLT5BdmFpbGFibGVUcmFtcG9saW5lcy5wdXNoX2JhY2soCisgICAgICAgICAgc3RhdGljX2Nhc3Q8SklUVGFyZ2V0QWRkcmVzcz4ocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KAorICAgICAgICAgICAgICBUcmFtcG9saW5lTWVtICsgKEkgKiBUYXJnZXRUOjpUcmFtcG9saW5lU2l6ZSkpKSk7CisKKyAgICBpZiAoYXV0byBFQyA9IHN5czo6TWVtb3J5Ojpwcm90ZWN0TWFwcGVkTWVtb3J5KAorICAgICAgICAgICAgICAgICAgICBUcmFtcG9saW5lQmxvY2suZ2V0TWVtb3J5QmxvY2soKSwKKyAgICAgICAgICAgICAgICAgICAgc3lzOjpNZW1vcnk6Ok1GX1JFQUQgfCBzeXM6Ok1lbW9yeTo6TUZfRVhFQykpCisgICAgICByZXR1cm4gZXJyb3JDb2RlVG9FcnJvcihFQyk7CisKKyAgICBUcmFtcG9saW5lQmxvY2tzLnB1c2hfYmFjayhzdGQ6Om1vdmUoVHJhbXBvbGluZUJsb2NrKSk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBzeXM6Ok93bmluZ01lbW9yeUJsb2NrIFJlc29sdmVyQmxvY2s7CisgIHN0ZDo6dmVjdG9yPHN5czo6T3duaW5nTWVtb3J5QmxvY2s+IFRyYW1wb2xpbmVCbG9ja3M7Cit9OworCisvLy8gQGJyaWVmIEJhc2UgY2xhc3MgZm9yIG1hbmFnaW5nIGNvbGxlY3Rpb25zIG9mIG5hbWVkIGluZGlyZWN0IHN0dWJzLgorY2xhc3MgSW5kaXJlY3RTdHVic01hbmFnZXIgeworcHVibGljOgorICAvLy8gQGJyaWVmIE1hcCB0eXBlIGZvciBpbml0aWFsaXppbmcgdGhlIG1hbmFnZXIuIFNlZSBpbml0LgorICB1c2luZyBTdHViSW5pdHNNYXAgPSBTdHJpbmdNYXA8c3RkOjpwYWlyPEpJVFRhcmdldEFkZHJlc3MsIEpJVFN5bWJvbEZsYWdzPj47CisKKyAgdmlydHVhbCB+SW5kaXJlY3RTdHVic01hbmFnZXIoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBzaW5nbGUgc3R1YiB3aXRoIHRoZSBnaXZlbiBuYW1lLCB0YXJnZXQgYWRkcmVzcyBhbmQgZmxhZ3MuCisgIHZpcnR1YWwgRXJyb3IgY3JlYXRlU3R1YihTdHJpbmdSZWYgU3R1Yk5hbWUsIEpJVFRhcmdldEFkZHJlc3MgU3R1YkFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVRTeW1ib2xGbGFncyBTdHViRmxhZ3MpID0gMDsKKworICAvLy8gQGJyaWVmIENyZWF0ZSBTdHViSW5pdHMuc2l6ZSgpIHN0dWJzIHdpdGggdGhlIGdpdmVuIG5hbWVzLCB0YXJnZXQKKyAgLy8vICAgICAgICBhZGRyZXNzZXMsIGFuZCBmbGFncy4KKyAgdmlydHVhbCBFcnJvciBjcmVhdGVTdHVicyhjb25zdCBTdHViSW5pdHNNYXAgJlN0dWJJbml0cykgPSAwOworCisgIC8vLyBAYnJpZWYgRmluZCB0aGUgc3R1YiB3aXRoIHRoZSBnaXZlbiBuYW1lLiBJZiBFeHBvcnRlZFN0dWJzT25seSBpcyB0cnVlLAorICAvLy8gICAgICAgIHRoaXMgd2lsbCBvbmx5IHJldHVybiBhIHJlc3VsdCBpZiB0aGUgc3R1YidzIGZsYWdzIGluZGljYXRlIHRoYXQgaXQKKyAgLy8vICAgICAgICBpcyBleHBvcnRlZC4KKyAgdmlydHVhbCBKSVRTeW1ib2wgZmluZFN0dWIoU3RyaW5nUmVmIE5hbWUsIGJvb2wgRXhwb3J0ZWRTdHVic09ubHkpID0gMDsKKworICAvLy8gQGJyaWVmIEZpbmQgdGhlIGltcGxlbWVudGF0aW9uLXBvaW50ZXIgZm9yIHRoZSBzdHViLgorICB2aXJ0dWFsIEpJVFN5bWJvbCBmaW5kUG9pbnRlcihTdHJpbmdSZWYgTmFtZSkgPSAwOworCisgIC8vLyBAYnJpZWYgQ2hhbmdlIHRoZSB2YWx1ZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gcG9pbnRlciBmb3IgdGhlIHN0dWIuCisgIHZpcnR1YWwgRXJyb3IgdXBkYXRlUG9pbnRlcihTdHJpbmdSZWYgTmFtZSwgSklUVGFyZ2V0QWRkcmVzcyBOZXdBZGRyKSA9IDA7CisKK3ByaXZhdGU6CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKK307CisKKy8vLyBAYnJpZWYgSW5kaXJlY3RTdHVic01hbmFnZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoZSBob3N0IGFyY2hpdGVjdHVyZSwgZS5nLgorLy8vICAgICAgICBPcmNYODZfNjQuIChTZWUgT3JjQXJjaGl0ZWN0dXJlU3VwcG9ydC5oKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUYXJnZXRUPgorY2xhc3MgTG9jYWxJbmRpcmVjdFN0dWJzTWFuYWdlciA6IHB1YmxpYyBJbmRpcmVjdFN0dWJzTWFuYWdlciB7CitwdWJsaWM6CisgIEVycm9yIGNyZWF0ZVN0dWIoU3RyaW5nUmVmIFN0dWJOYW1lLCBKSVRUYXJnZXRBZGRyZXNzIFN0dWJBZGRyLAorICAgICAgICAgICAgICAgICAgIEpJVFN5bWJvbEZsYWdzIFN0dWJGbGFncykgb3ZlcnJpZGUgeworICAgIGlmIChhdXRvIEVyciA9IHJlc2VydmVTdHVicygxKSkKKyAgICAgIHJldHVybiBFcnI7CisKKyAgICBjcmVhdGVTdHViSW50ZXJuYWwoU3R1Yk5hbWUsIFN0dWJBZGRyLCBTdHViRmxhZ3MpOworCisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBFcnJvciBjcmVhdGVTdHVicyhjb25zdCBTdHViSW5pdHNNYXAgJlN0dWJJbml0cykgb3ZlcnJpZGUgeworICAgIGlmIChhdXRvIEVyciA9IHJlc2VydmVTdHVicyhTdHViSW5pdHMuc2l6ZSgpKSkKKyAgICAgIHJldHVybiBFcnI7CisKKyAgICBmb3IgKGF1dG8gJkVudHJ5IDogU3R1YkluaXRzKQorICAgICAgY3JlYXRlU3R1YkludGVybmFsKEVudHJ5LmZpcnN0KCksIEVudHJ5LnNlY29uZC5maXJzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBFbnRyeS5zZWNvbmQuc2Vjb25kKTsKKworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgSklUU3ltYm9sIGZpbmRTdHViKFN0cmluZ1JlZiBOYW1lLCBib29sIEV4cG9ydGVkU3R1YnNPbmx5KSBvdmVycmlkZSB7CisgICAgYXV0byBJID0gU3R1YkluZGV4ZXMuZmluZChOYW1lKTsKKyAgICBpZiAoSSA9PSBTdHViSW5kZXhlcy5lbmQoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIGF1dG8gS2V5ID0gSS0+c2Vjb25kLmZpcnN0OworICAgIHZvaWQgKlN0dWJBZGRyID0gSW5kaXJlY3RTdHVic0luZm9zW0tleS5maXJzdF0uZ2V0U3R1YihLZXkuc2Vjb25kKTsKKyAgICBhc3NlcnQoU3R1YkFkZHIgJiYgIk1pc3Npbmcgc3R1YiBhZGRyZXNzIik7CisgICAgYXV0byBTdHViVGFyZ2V0QWRkciA9CisgICAgICAgIHN0YXRpY19jYXN0PEpJVFRhcmdldEFkZHJlc3M+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihTdHViQWRkcikpOworICAgIGF1dG8gU3R1YlN5bWJvbCA9IEpJVFN5bWJvbChTdHViVGFyZ2V0QWRkciwgSS0+c2Vjb25kLnNlY29uZCk7CisgICAgaWYgKEV4cG9ydGVkU3R1YnNPbmx5ICYmICFTdHViU3ltYm9sLmdldEZsYWdzKCkuaXNFeHBvcnRlZCgpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIFN0dWJTeW1ib2w7CisgIH0KKworICBKSVRTeW1ib2wgZmluZFBvaW50ZXIoU3RyaW5nUmVmIE5hbWUpIG92ZXJyaWRlIHsKKyAgICBhdXRvIEkgPSBTdHViSW5kZXhlcy5maW5kKE5hbWUpOworICAgIGlmIChJID09IFN0dWJJbmRleGVzLmVuZCgpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgYXV0byBLZXkgPSBJLT5zZWNvbmQuZmlyc3Q7CisgICAgdm9pZCAqUHRyQWRkciA9IEluZGlyZWN0U3R1YnNJbmZvc1tLZXkuZmlyc3RdLmdldFB0cihLZXkuc2Vjb25kKTsKKyAgICBhc3NlcnQoUHRyQWRkciAmJiAiTWlzc2luZyBwb2ludGVyIGFkZHJlc3MiKTsKKyAgICBhdXRvIFB0clRhcmdldEFkZHIgPQorICAgICAgICBzdGF0aWNfY2FzdDxKSVRUYXJnZXRBZGRyZXNzPihyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oUHRyQWRkcikpOworICAgIHJldHVybiBKSVRTeW1ib2woUHRyVGFyZ2V0QWRkciwgSS0+c2Vjb25kLnNlY29uZCk7CisgIH0KKworICBFcnJvciB1cGRhdGVQb2ludGVyKFN0cmluZ1JlZiBOYW1lLCBKSVRUYXJnZXRBZGRyZXNzIE5ld0FkZHIpIG92ZXJyaWRlIHsKKyAgICBhdXRvIEkgPSBTdHViSW5kZXhlcy5maW5kKE5hbWUpOworICAgIGFzc2VydChJICE9IFN0dWJJbmRleGVzLmVuZCgpICYmICJObyBzdHViIHBvaW50ZXIgZm9yIHN5bWJvbCIpOworICAgIGF1dG8gS2V5ID0gSS0+c2Vjb25kLmZpcnN0OworICAgICpJbmRpcmVjdFN0dWJzSW5mb3NbS2V5LmZpcnN0XS5nZXRQdHIoS2V5LnNlY29uZCkgPQorICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQgKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihOZXdBZGRyKSk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworcHJpdmF0ZToKKyAgRXJyb3IgcmVzZXJ2ZVN0dWJzKHVuc2lnbmVkIE51bVN0dWJzKSB7CisgICAgaWYgKE51bVN0dWJzIDw9IEZyZWVTdHVicy5zaXplKCkpCisgICAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKworICAgIHVuc2lnbmVkIE5ld1N0dWJzUmVxdWlyZWQgPSBOdW1TdHVicyAtIEZyZWVTdHVicy5zaXplKCk7CisgICAgdW5zaWduZWQgTmV3QmxvY2tJZCA9IEluZGlyZWN0U3R1YnNJbmZvcy5zaXplKCk7CisgICAgdHlwZW5hbWUgVGFyZ2V0VDo6SW5kaXJlY3RTdHVic0luZm8gSVNJOworICAgIGlmIChhdXRvIEVyciA9CisgICAgICAgICAgICBUYXJnZXRUOjplbWl0SW5kaXJlY3RTdHVic0Jsb2NrKElTSSwgTmV3U3R1YnNSZXF1aXJlZCwgbnVsbHB0cikpCisgICAgICByZXR1cm4gRXJyOworICAgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgPCBJU0kuZ2V0TnVtU3R1YnMoKTsgKytJKQorICAgICAgRnJlZVN0dWJzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihOZXdCbG9ja0lkLCBJKSk7CisgICAgSW5kaXJlY3RTdHVic0luZm9zLnB1c2hfYmFjayhzdGQ6Om1vdmUoSVNJKSk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICB2b2lkIGNyZWF0ZVN0dWJJbnRlcm5hbChTdHJpbmdSZWYgU3R1Yk5hbWUsIEpJVFRhcmdldEFkZHJlc3MgSW5pdEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEpJVFN5bWJvbEZsYWdzIFN0dWJGbGFncykgeworICAgIGF1dG8gS2V5ID0gRnJlZVN0dWJzLmJhY2soKTsKKyAgICBGcmVlU3R1YnMucG9wX2JhY2soKTsKKyAgICAqSW5kaXJlY3RTdHVic0luZm9zW0tleS5maXJzdF0uZ2V0UHRyKEtleS5zZWNvbmQpID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkICo+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oSW5pdEFkZHIpKTsKKyAgICBTdHViSW5kZXhlc1tTdHViTmFtZV0gPSBzdGQ6Om1ha2VfcGFpcihLZXksIFN0dWJGbGFncyk7CisgIH0KKworICBzdGQ6OnZlY3Rvcjx0eXBlbmFtZSBUYXJnZXRUOjpJbmRpcmVjdFN0dWJzSW5mbz4gSW5kaXJlY3RTdHVic0luZm9zOworICB1c2luZyBTdHViS2V5ID0gc3RkOjpwYWlyPHVpbnQxNl90LCB1aW50MTZfdD47CisgIHN0ZDo6dmVjdG9yPFN0dWJLZXk+IEZyZWVTdHViczsKKyAgU3RyaW5nTWFwPHN0ZDo6cGFpcjxTdHViS2V5LCBKSVRTeW1ib2xGbGFncz4+IFN0dWJJbmRleGVzOworfTsKKworLy8vIEBicmllZiBDcmVhdGUgYSBsb2NhbCBjb21waWxlIGNhbGxiYWNrIG1hbmFnZXIuCisvLy8KKy8vLyBUaGUgZ2l2ZW4gdGFyZ2V0IHRyaXBsZSB3aWxsIGRldGVybWluZSB0aGUgQUJJLCBhbmQgdGhlIGdpdmVuCisvLy8gRXJyb3JIYW5kbGVyQWRkcmVzcyB3aWxsIGJlIHVzZWQgYnkgdGhlIHJlc3VsdGluZyBjb21waWxlIGNhbGxiYWNrCisvLy8gbWFuYWdlciBpZiBhIGNvbXBpbGUgY2FsbGJhY2sgZmFpbHMuCitzdGQ6OnVuaXF1ZV9wdHI8SklUQ29tcGlsZUNhbGxiYWNrTWFuYWdlcj4KK2NyZWF0ZUxvY2FsQ29tcGlsZUNhbGxiYWNrTWFuYWdlcihjb25zdCBUcmlwbGUgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUVGFyZ2V0QWRkcmVzcyBFcnJvckhhbmRsZXJBZGRyZXNzKTsKKworLy8vIEBicmllZiBDcmVhdGUgYSBsb2NhbCBpbmRyaWVjdCBzdHVicyBtYW5hZ2VyIGJ1aWxkZXIuCisvLy8KKy8vLyBUaGUgZ2l2ZW4gdGFyZ2V0IHRyaXBsZSB3aWxsIGRldGVybWluZSB0aGUgQUJJLgorc3RkOjpmdW5jdGlvbjxzdGQ6OnVuaXF1ZV9wdHI8SW5kaXJlY3RTdHVic01hbmFnZXI+KCk+CitjcmVhdGVMb2NhbEluZGlyZWN0U3R1YnNNYW5hZ2VyQnVpbGRlcihjb25zdCBUcmlwbGUgJlQpOworCisvLy8gQGJyaWVmIEJ1aWxkIGEgZnVuY3Rpb24gcG9pbnRlciBvZiBGdW5jdGlvblR5cGUgd2l0aCB0aGUgZ2l2ZW4gY29uc3RhbnQKKy8vLyAgICAgICAgYWRkcmVzcy4KKy8vLworLy8vICAgVXNhZ2UgZXhhbXBsZTogVHVybiBhIHRyYW1wb2xpbmUgYWRkcmVzcyBpbnRvIGEgZnVuY3Rpb24gcG9pbnRlciBjb25zdGFudAorLy8vIGZvciB1c2UgaW4gYSBzdHViLgorQ29uc3RhbnQgKmNyZWF0ZUlSVHlwZWRBZGRyZXNzKEZ1bmN0aW9uVHlwZSAmRlQsIEpJVFRhcmdldEFkZHJlc3MgQWRkcik7CisKKy8vLyBAYnJpZWYgQ3JlYXRlIGEgZnVuY3Rpb24gcG9pbnRlciB3aXRoIHRoZSBnaXZlbiB0eXBlLCBuYW1lLCBhbmQgaW5pdGlhbGl6ZXIKKy8vLyAgICAgICAgaW4gdGhlIGdpdmVuIE1vZHVsZS4KK0dsb2JhbFZhcmlhYmxlICpjcmVhdGVJbXBsUG9pbnRlcihQb2ludGVyVHlwZSAmUFQsIE1vZHVsZSAmTSwgY29uc3QgVHdpbmUgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKkluaXRpYWxpemVyKTsKKworLy8vIEBicmllZiBUdXJuIGEgZnVuY3Rpb24gZGVjbGFyYXRpb24gaW50byBhIHN0dWIgZnVuY3Rpb24gdGhhdCBtYWtlcyBhbgorLy8vICAgICAgICBpbmRpcmVjdCBjYWxsIHVzaW5nIHRoZSBnaXZlbiBmdW5jdGlvbiBwb2ludGVyLgordm9pZCBtYWtlU3R1YihGdW5jdGlvbiAmRiwgVmFsdWUgJkltcGxQb2ludGVyKTsKKworLy8vIEBicmllZiBSYWlzZSBsaW5rYWdlIHR5cGVzIGFuZCByZW5hbWUgYXMgbmVjZXNzYXJ5IHRvIGVuc3VyZSB0aGF0IGFsbAorLy8vICAgICAgICBzeW1ib2xzIGFyZSBhY2Nlc3NpYmxlIGZvciBvdGhlciBtb2R1bGVzLgorLy8vCisvLy8gICBUaGlzIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHBhcnRpdGlvbmluZyBhIG1vZHVsZSB0byBlbnN1cmUgdGhhdCB0aGUKKy8vLyBwYXJ0aXRpb25zIHJldGFpbiBhY2Nlc3MgdG8gZWFjaCBvdGhlcidzIHN5bWJvbHMuCit2b2lkIG1ha2VBbGxTeW1ib2xzRXh0ZXJuYWxseUFjY2Vzc2libGUoTW9kdWxlICZNKTsKKworLy8vIEBicmllZiBDbG9uZSBhIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGludG8gYSBuZXcgbW9kdWxlLgorLy8vCisvLy8gICBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGFzIHRoZSBmaXJzdCBzdGVwIHRvd2FyZHMgY3JlYXRpbmcgYSBjYWxsYmFjaworLy8vIHN0dWIgKHNlZSBtYWtlU3R1YiksIG9yIG1vdmluZyBhIGZ1bmN0aW9uIGJvZHkgKHNlZSBtb3ZlRnVuY3Rpb25Cb2R5KS4KKy8vLworLy8vICAgSWYgdGhlIFZNYXAgYXJndW1lbnQgaXMgbm9uLW51bGwsIGEgbWFwcGluZyB3aWxsIGJlIGFkZGVkIGJldHdlZW4gRiBhbmQKKy8vLyB0aGUgbmV3IGRlY2xhcmF0aW9uLCBhbmQgYmV0d2VlbiBlYWNoIG9mIEYncyBhcmd1bWVudHMgYW5kIHRoZSBuZXcKKy8vLyBkZWNsYXJhdGlvbidzIGFyZ3VtZW50cy4gVGhpcyBtYXAgY2FuIHRoZW4gYmUgcGFzc2VkIGluIHRvIG1vdmVGdW5jdGlvbiB0bworLy8vIG1vdmUgdGhlIGZ1bmN0aW9uIGJvZHkgaWYgcmVxdWlyZWQuIE5vdGU6IFdoZW4gbW92aW5nIGZ1bmN0aW9ucyBiZXR3ZWVuCisvLy8gbW9kdWxlcyB3aXRoIHRoZXNlIHV0aWxpdGllcywgYWxsIGRlY2xzIHNob3VsZCBiZSBjbG9uZWQgKGFuZCBhZGRlZCB0byBhCisvLy8gc2luZ2xlIFZNYXApIGJlZm9yZSBhbnkgYm9kaWVzIGFyZSBtb3ZlZC4gVGhpcyB3aWxsIGVuc3VyZSB0aGF0IHJlZmVyZW5jZXMKKy8vLyBiZXR3ZWVuIGZ1bmN0aW9ucyBhbGwgcmVmZXIgdG8gdGhlIHZlcnNpb25zIGluIHRoZSBuZXcgbW9kdWxlLgorRnVuY3Rpb24gKmNsb25lRnVuY3Rpb25EZWNsKE1vZHVsZSAmRHN0LCBjb25zdCBGdW5jdGlvbiAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVRvVmFsdWVNYXBUeSAqVk1hcCA9IG51bGxwdHIpOworCisvLy8gQGJyaWVmIE1vdmUgdGhlIGJvZHkgb2YgZnVuY3Rpb24gJ0YnIHRvIGEgY2xvbmVkIGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGluIGEKKy8vLyAgICAgICAgZGlmZmVyZW50IG1vZHVsZSAoU2VlIHJlbGF0ZWQgY2xvbmVGdW5jdGlvbkRlY2wpLgorLy8vCisvLy8gICBJZiB0aGUgdGFyZ2V0IGZ1bmN0aW9uIGRlY2xhcmF0aW9uIGlzIG5vdCBzdXBwbGllZCB2aWEgdGhlIE5ld0YgcGFyYW1ldGVyCisvLy8gdGhlbiBpdCB3aWxsIGJlIGxvb2tlZCB1cCB2aWEgdGhlIFZNYXAuCisvLy8KKy8vLyAgIFRoaXMgd2lsbCBkZWxldGUgdGhlIGJvZHkgb2YgZnVuY3Rpb24gJ0YnIGZyb20gaXRzIG9yaWdpbmFsIHBhcmVudCBtb2R1bGUsCisvLy8gYnV0IGxlYXZlIGl0cyBkZWNsYXJhdGlvbi4KK3ZvaWQgbW92ZUZ1bmN0aW9uQm9keShGdW5jdGlvbiAmT3JpZ0YsIFZhbHVlVG9WYWx1ZU1hcFR5ICZWTWFwLAorICAgICAgICAgICAgICAgICAgICAgIFZhbHVlTWF0ZXJpYWxpemVyICpNYXRlcmlhbGl6ZXIgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uICpOZXdGID0gbnVsbHB0cik7CisKKy8vLyBAYnJpZWYgQ2xvbmUgYSBnbG9iYWwgdmFyaWFibGUgZGVjbGFyYXRpb24gaW50byBhIG5ldyBtb2R1bGUuCitHbG9iYWxWYXJpYWJsZSAqY2xvbmVHbG9iYWxWYXJpYWJsZURlY2woTW9kdWxlICZEc3QsIGNvbnN0IEdsb2JhbFZhcmlhYmxlICZHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVRvVmFsdWVNYXBUeSAqVk1hcCA9IG51bGxwdHIpOworCisvLy8gQGJyaWVmIE1vdmUgZ2xvYmFsIHZhcmlhYmxlIEdWIGZyb20gaXRzIHBhcmVudCBtb2R1bGUgdG8gY2xvbmVkIGdsb2JhbAorLy8vICAgICAgICBkZWNsYXJhdGlvbiBpbiBhIGRpZmZlcmVudCBtb2R1bGUuCisvLy8KKy8vLyAgIElmIHRoZSB0YXJnZXQgZ2xvYmFsIGRlY2xhcmF0aW9uIGlzIG5vdCBzdXBwbGllZCB2aWEgdGhlIE5ld0dWIHBhcmFtZXRlcgorLy8vIHRoZW4gaXQgd2lsbCBiZSBsb29rZWQgdXAgdmlhIHRoZSBWTWFwLgorLy8vCisvLy8gICBUaGlzIHdpbGwgZGVsZXRlIHRoZSBpbml0aWFsaXplciBvZiBHViBmcm9tIGl0cyBvcmlnaW5hbCBwYXJlbnQgbW9kdWxlLAorLy8vIGJ1dCBsZWF2ZSBpdHMgZGVjbGFyYXRpb24uCit2b2lkIG1vdmVHbG9iYWxWYXJpYWJsZUluaXRpYWxpemVyKEdsb2JhbFZhcmlhYmxlICZPcmlnR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlVG9WYWx1ZU1hcFR5ICZWTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZU1hdGVyaWFsaXplciAqTWF0ZXJpYWxpemVyID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFyaWFibGUgKk5ld0dWID0gbnVsbHB0cik7CisKKy8vLyBAYnJpZWYgQ2xvbmUgYSBnbG9iYWwgYWxpYXMgZGVjbGFyYXRpb24gaW50byBhIG5ldyBtb2R1bGUuCitHbG9iYWxBbGlhcyAqY2xvbmVHbG9iYWxBbGlhc0RlY2woTW9kdWxlICZEc3QsIGNvbnN0IEdsb2JhbEFsaWFzICZPcmlnQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVRvVmFsdWVNYXBUeSAmVk1hcCk7CisKKy8vLyBAYnJpZWYgQ2xvbmUgbW9kdWxlIGZsYWdzIG1ldGFkYXRhIGludG8gdGhlIGRlc3RpbmF0aW9uIG1vZHVsZS4KK3ZvaWQgY2xvbmVNb2R1bGVGbGFnc01ldGFkYXRhKE1vZHVsZSAmRHN0LCBjb25zdCBNb2R1bGUgJlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlVG9WYWx1ZU1hcFR5ICZWTWFwKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9yYworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0lORElSRUNUSU9OVVRJTFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0xhbWJkYVJlc29sdmVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvTGFtYmRhUmVzb2x2ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjZmM2QyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0xhbWJkYVJlc29sdmVyLmgKQEAgLTAsMCArMSw1OSBAQAorLy89PT0tIExhbWJkYVJlc29sdmVyTU0gLSBSZWRpcmVjdCBzeW1ib2wgbG9va3VwIHZpYSBhIGZ1bmN0b3IgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgIERlZmluZXMgYSBSdW50aW1lRHlsZDo6U3ltYm9sUmVzb2x2ZXIgc3ViY2xhc3MgdGhhdCB1c2VzIGEgdXNlci1zdXBwbGllZAorLy8gZnVuY3RvciBmb3Igc3ltYm9sIHJlc29sdXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfTEFNQkRBUkVTT0xWRVJfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfTEFNQkRBUkVTT0xWRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvSklUU3ltYm9sLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb3JjIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIER5bGliTG9va3VwRnRvclQsIHR5cGVuYW1lIEV4dGVybmFsTG9va3VwRnRvclQ+CitjbGFzcyBMYW1iZGFSZXNvbHZlciA6IHB1YmxpYyBMZWdhY3lKSVRTeW1ib2xSZXNvbHZlciB7CitwdWJsaWM6CisgIExhbWJkYVJlc29sdmVyKER5bGliTG9va3VwRnRvclQgRHlsaWJMb29rdXBGdG9yLAorICAgICAgICAgICAgICAgICBFeHRlcm5hbExvb2t1cEZ0b3JUIEV4dGVybmFsTG9va3VwRnRvcikKKyAgICAgIDogRHlsaWJMb29rdXBGdG9yKER5bGliTG9va3VwRnRvciksCisgICAgICAgIEV4dGVybmFsTG9va3VwRnRvcihFeHRlcm5hbExvb2t1cEZ0b3IpIHt9CisKKyAgSklUU3ltYm9sIGZpbmRTeW1ib2xJbkxvZ2ljYWxEeWxpYihjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgZmluYWwgeworICAgIHJldHVybiBEeWxpYkxvb2t1cEZ0b3IoTmFtZSk7CisgIH0KKworICBKSVRTeW1ib2wgZmluZFN5bWJvbChjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgZmluYWwgeworICAgIHJldHVybiBFeHRlcm5hbExvb2t1cEZ0b3IoTmFtZSk7CisgIH0KKworcHJpdmF0ZToKKyAgRHlsaWJMb29rdXBGdG9yVCBEeWxpYkxvb2t1cEZ0b3I7CisgIEV4dGVybmFsTG9va3VwRnRvclQgRXh0ZXJuYWxMb29rdXBGdG9yOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIER5bGliTG9va3VwRnRvclQsCisgICAgICAgICAgdHlwZW5hbWUgRXh0ZXJuYWxMb29rdXBGdG9yVD4KK3N0ZDo6c2hhcmVkX3B0cjxMYW1iZGFSZXNvbHZlcjxEeWxpYkxvb2t1cEZ0b3JULCBFeHRlcm5hbExvb2t1cEZ0b3JUPj4KK2NyZWF0ZUxhbWJkYVJlc29sdmVyKER5bGliTG9va3VwRnRvclQgRHlsaWJMb29rdXBGdG9yLAorICAgICAgICAgICAgICAgICAgICAgRXh0ZXJuYWxMb29rdXBGdG9yVCBFeHRlcm5hbExvb2t1cEZ0b3IpIHsKKyAgdXNpbmcgTFIgPSBMYW1iZGFSZXNvbHZlcjxEeWxpYkxvb2t1cEZ0b3JULCBFeHRlcm5hbExvb2t1cEZ0b3JUPjsKKyAgcmV0dXJuIG1ha2VfdW5pcXVlPExSPihzdGQ6Om1vdmUoRHlsaWJMb29rdXBGdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoRXh0ZXJuYWxMb29rdXBGdG9yKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvcmMKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfTEFNQkRBUkVTT0xWRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0xhenlFbWl0dGluZ0xheWVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvTGF6eUVtaXR0aW5nTGF5ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTE3YTkyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0xhenlFbWl0dGluZ0xheWVyLmgKQEAgLTAsMCArMSwyNjEgQEAKKy8vPT09LSBMYXp5RW1pdHRpbmdMYXllci5oIC0gTGF6aWx5IGVtaXQgSVIgdG8gbG93ZXIgSklUIGxheWVycyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ29udGFpbnMgdGhlIGRlZmluaXRpb24gZm9yIGEgbGF6eS1lbWl0dGluZyBsYXllciBmb3IgdGhlIEpJVC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19MQVpZRU1JVFRJTkdMQVlFUl9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19MQVpZRU1JVFRJTkdMQVlFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9KSVRTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvQ29yZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01hbmdsZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb3JjIHsKKworLy8vIEBicmllZiBMYXp5LWVtaXR0aW5nIElSIGxheWVyLgorLy8vCisvLy8gICBUaGlzIGxheWVyIGFjY2VwdHMgTExWTSBJUiBNb2R1bGVzICh2aWEgYWRkTW9kdWxlKSwgYnV0IGRvZXMgbm90CisvLy8gaW1tZWRpYXRlbHkgZW1pdCB0aGVtIHRoZSBsYXllciBiZWxvdy4gSW5zdGVhZCwgZW1pc3NpbmcgdG8gdGhlIGJhc2UgbGF5ZXIKKy8vLyBpcyBkZWZlcnJlZCB1bnRpbCB0aGUgZmlyc3QgdGltZSB0aGUgY2xpZW50IHJlcXVlc3RzIHRoZSBhZGRyZXNzICh2aWEKKy8vLyBKSVRTeW1ib2w6OmdldEFkZHJlc3MpIGZvciBhIHN5bWJvbCBjb250YWluZWQgaW4gdGhpcyBsYXllci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBCYXNlTGF5ZXJUPiBjbGFzcyBMYXp5RW1pdHRpbmdMYXllciB7Citwcml2YXRlOgorICBjbGFzcyBFbWlzc2lvbkRlZmVycmVkTW9kdWxlIHsKKyAgcHVibGljOgorICAgIEVtaXNzaW9uRGVmZXJyZWRNb2R1bGUoVk1vZHVsZUtleSBLLCBzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBNKQorICAgICAgICA6IEsoc3RkOjptb3ZlKEspKSwgTShzdGQ6Om1vdmUoTSkpIHt9CisKKyAgICBKSVRTeW1ib2wgZmluZChTdHJpbmdSZWYgTmFtZSwgYm9vbCBFeHBvcnRlZFN5bWJvbHNPbmx5LCBCYXNlTGF5ZXJUICZCKSB7CisgICAgICBzd2l0Y2ggKEVtaXRTdGF0ZSkgeworICAgICAgY2FzZSBOb3RFbWl0dGVkOgorICAgICAgICBpZiAoYXV0byBHViA9IHNlYXJjaEdWcyhOYW1lLCBFeHBvcnRlZFN5bWJvbHNPbmx5KSkgeworICAgICAgICAgIC8vIENyZWF0ZSBhIHN0ZDo6c3RyaW5nIHZlcnNpb24gb2YgTmFtZSB0byBjYXB0dXJlIGhlcmUgLSB0aGUgYXJndW1lbnQKKyAgICAgICAgICAvLyAoYSBTdHJpbmdSZWYpIG1heSBnbyBhd2F5IGJlZm9yZSB0aGUgbGFtYmRhIGlzIGV4ZWN1dGVkLgorICAgICAgICAgIC8vIEZJWE1FOiBVc2UgY2FwdHVyZS1pbml0IHdoZW4gd2UgbW92ZSB0byBDKysxNC4KKyAgICAgICAgICBzdGQ6OnN0cmluZyBQTmFtZSA9IE5hbWU7CisgICAgICAgICAgSklUU3ltYm9sRmxhZ3MgRmxhZ3MgPSBKSVRTeW1ib2xGbGFnczo6ZnJvbUdsb2JhbFZhbHVlKCpHVik7CisgICAgICAgICAgYXV0byBHZXRBZGRyZXNzID0KKyAgICAgICAgICAgIFt0aGlzLCBFeHBvcnRlZFN5bWJvbHNPbmx5LCBQTmFtZSwgJkJdKCkgLT4gRXhwZWN0ZWQ8SklUVGFyZ2V0QWRkcmVzcz4geworICAgICAgICAgICAgICBpZiAodGhpcy0+RW1pdFN0YXRlID09IEVtaXR0aW5nKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLT5FbWl0U3RhdGUgPT0gTm90RW1pdHRlZCkgeworICAgICAgICAgICAgICAgIHRoaXMtPkVtaXRTdGF0ZSA9IEVtaXR0aW5nOworICAgICAgICAgICAgICAgIGlmIChhdXRvIEVyciA9IHRoaXMtPmVtaXRUb0Jhc2VMYXllcihCKSkKKyAgICAgICAgICAgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoRXJyKTsKKyAgICAgICAgICAgICAgICB0aGlzLT5FbWl0U3RhdGUgPSBFbWl0dGVkOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgIGlmIChhdXRvIFN5bSA9IEIuZmluZFN5bWJvbEluKEssIFBOYW1lLCBFeHBvcnRlZFN5bWJvbHNPbmx5KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gU3ltLmdldEFkZHJlc3MoKTsKKyAgICAgICAgICAgICAgZWxzZSBpZiAoYXV0byBFcnIgPSBTeW0udGFrZUVycm9yKCkpCisgICAgICAgICAgICAgICAgcmV0dXJuIHN0ZDo6bW92ZShFcnIpOworICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiU3VjY2Vzc2Z1bCBzeW1ib2wgbG9va3VwIHNob3VsZCByZXR1cm4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImRlZmluaXRpb24gYWRkcmVzcyBoZXJlIik7CisgICAgICAgICAgfTsKKyAgICAgICAgICByZXR1cm4gSklUU3ltYm9sKHN0ZDo6bW92ZShHZXRBZGRyZXNzKSwgRmxhZ3MpOworICAgICAgICB9IGVsc2UKKyAgICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIGNhc2UgRW1pdHRpbmc6CisgICAgICAgIC8vIENhbGxpbmcgImVtaXQiIGNhbiB0cmlnZ2VyIGEgcmVjdXJzaXZlIGNhbGwgdG8gJ2ZpbmQnIChlLmcuIHRvIGNoZWNrCisgICAgICAgIC8vIGZvciBwcmUtZXhpc3RpbmcgZGVmaW5pdGlvbnMgb2YgY29tbW9uLXN5bWJvbCksIGJ1dCBhbnkgc3ltYm9sIGluCisgICAgICAgIC8vIHRoaXMgbW9kdWxlIHdvdWxkIGFscmVhZHkgaGF2ZSBiZWVuIGZvdW5kIGludGVybmFsbHkgKGluIHRoZQorICAgICAgICAvLyBSdW50aW1lRHlsZCB0aGF0IGRpZCB0aGUgbG9va3VwKSwgc28ganVzdCByZXR1cm4gYSBudWxscHRyIGhlcmUuCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgY2FzZSBFbWl0dGVkOgorICAgICAgICByZXR1cm4gQi5maW5kU3ltYm9sSW4oSywgTmFtZSwgRXhwb3J0ZWRTeW1ib2xzT25seSk7CisgICAgICB9CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIGVtaXQtc3RhdGUuIik7CisgICAgfQorCisgICAgRXJyb3IgcmVtb3ZlTW9kdWxlRnJvbUJhc2VMYXllcihCYXNlTGF5ZXJUJiBCYXNlTGF5ZXIpIHsKKyAgICAgIHJldHVybiBFbWl0U3RhdGUgIT0gTm90RW1pdHRlZCA/IEJhc2VMYXllci5yZW1vdmVNb2R1bGUoSykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEVycm9yOjpzdWNjZXNzKCk7CisgICAgfQorCisgICAgdm9pZCBlbWl0QW5kRmluYWxpemUoQmFzZUxheWVyVCAmQmFzZUxheWVyKSB7CisgICAgICBhc3NlcnQoRW1pdFN0YXRlICE9IEVtaXR0aW5nICYmCisgICAgICAgICAgICAgIkNhbm5vdCBlbWl0QW5kRmluYWxpemUgd2hpbGUgYWxyZWFkeSBlbWl0dGluZyIpOworICAgICAgaWYgKEVtaXRTdGF0ZSA9PSBOb3RFbWl0dGVkKSB7CisgICAgICAgIEVtaXRTdGF0ZSA9IEVtaXR0aW5nOworICAgICAgICBlbWl0VG9CYXNlTGF5ZXIoQmFzZUxheWVyKTsKKyAgICAgICAgRW1pdFN0YXRlID0gRW1pdHRlZDsKKyAgICAgIH0KKyAgICAgIEJhc2VMYXllci5lbWl0QW5kRmluYWxpemUoSyk7CisgICAgfQorCisgIHByaXZhdGU6CisKKyAgICBjb25zdCBHbG9iYWxWYWx1ZSogc2VhcmNoR1ZzKFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeHBvcnRlZFN5bWJvbHNPbmx5KSBjb25zdCB7CisgICAgICAvLyBGSVhNRTogV2UgY291bGQgY2xlYW4gYWxsIHRoaXMgdXAgaWYgd2UgaGFkIGEgd2F5IHRvIHJlbGlhYmx5IGRlbWFuZ2xlCisgICAgICAvLyAgICAgICAgbmFtZXM6IFdlIGNvdWxkIGp1c3QgZGVtYW5nbGUgbmFtZSBhbmQgc2VhcmNoLCByYXRoZXIgdGhhbgorICAgICAgLy8gICAgICAgIG1hbmdsaW5nIGV2ZXJ5dGhpbmcgZWxzZS4KKworICAgICAgLy8gSWYgd2UgaGF2ZSBhbHJlYWR5IGJ1aWx0IHRoZSBtYW5nbGVkIG5hbWUgc2V0IHRoZW4ganVzdCBzZWFyY2ggaXQuCisgICAgICBpZiAoTWFuZ2xlZFN5bWJvbHMpIHsKKyAgICAgICAgYXV0byBWSSA9IE1hbmdsZWRTeW1ib2xzLT5maW5kKE5hbWUpOworICAgICAgICBpZiAoVkkgPT0gTWFuZ2xlZFN5bWJvbHMtPmVuZCgpKQorICAgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgICBhdXRvIEdWID0gVkktPnNlY29uZDsKKyAgICAgICAgaWYgKCFFeHBvcnRlZFN5bWJvbHNPbmx5IHx8IEdWLT5oYXNEZWZhdWx0VmlzaWJpbGl0eSgpKQorICAgICAgICAgIHJldHVybiBHVjsKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgICB9CisKKyAgICAgIC8vIElmIHdlIGhhdmVuJ3QgYnVpbHQgdGhlIG1hbmdsZWQgbmFtZSBzZXQgeWV0LCB0cnkgdG8gYnVpbGQgaXQuIEFzIGFuCisgICAgICAvLyBvcHRpbWl6YXRpb24gdGhpcyB3aWxsIGxlYXZlIE1hbmdsZWROYW1lcyBzZXQgdG8gbnVsbHB0ciBpZiB3ZSBmaW5kCisgICAgICAvLyBOYW1lIGluIHRoZSBwcm9jZXNzIG9mIGJ1aWxkaW5nIHRoZSBzZXQuCisgICAgICByZXR1cm4gYnVpbGRNYW5nbGVkU3ltYm9scyhOYW1lLCBFeHBvcnRlZFN5bWJvbHNPbmx5KTsKKyAgICB9CisKKyAgICBFcnJvciBlbWl0VG9CYXNlTGF5ZXIoQmFzZUxheWVyVCAmQmFzZUxheWVyKSB7CisgICAgICAvLyBXZSBkb24ndCBuZWVkIHRoZSBtYW5nbGVkIG5hbWVzIHNldCBhbnkgbW9yZTogT25jZSB3ZSd2ZSBlbWl0dGVkIHRoaXMKKyAgICAgIC8vIHRvIHRoZSBiYXNlIGxheWVyIHdlJ2xsIGp1c3QgbG9vayBmb3Igc3ltYm9scyB0aGVyZS4KKyAgICAgIE1hbmdsZWRTeW1ib2xzLnJlc2V0KCk7CisgICAgICByZXR1cm4gQmFzZUxheWVyLmFkZE1vZHVsZShzdGQ6Om1vdmUoSyksIHN0ZDo6bW92ZShNKSk7CisgICAgfQorCisgICAgLy8gSWYgdGhlIG1hbmdsZWQgbmFtZSBvZiB0aGUgZ2l2ZW4gR2xvYmFsVmFsdWUgbWF0Y2hlcyB0aGUgZ2l2ZW4gc2VhcmNoCisgICAgLy8gbmFtZSAoYW5kIGl0cyB2aXNpYmlsaXR5IGNvbmZvcm1zIHRvIHRoZSBFeHBvcnRlZFN5bWJvbHNPbmx5IGZsYWcpIHRoZW4KKyAgICAvLyByZXR1cm4gdGhlIHN5bWJvbC4gT3RoZXJ3aXNlLCBhZGQgdGhlIG1hbmdsZWQgbmFtZSB0byB0aGUgTmFtZXMgbWFwIGFuZAorICAgIC8vIHJldHVybiBudWxscHRyLgorICAgIGNvbnN0IEdsb2JhbFZhbHVlKiBhZGRHbG9iYWxWYWx1ZShTdHJpbmdNYXA8Y29uc3QgR2xvYmFsVmFsdWUqPiAmTmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdsb2JhbFZhbHVlICZHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFuZ2xlciAmTWFuZywgU3RyaW5nUmVmIFNlYXJjaE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXhwb3J0ZWRTeW1ib2xzT25seSkgY29uc3QgeworICAgICAgLy8gTW9kdWxlcyBkb24ndCAicHJvdmlkZSIgZGVjbHMgb3IgY29tbW9uIHN5bWJvbHMuCisgICAgICBpZiAoR1YuaXNEZWNsYXJhdGlvbigpIHx8IEdWLmhhc0NvbW1vbkxpbmthZ2UoKSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICAgIC8vIE1hbmdsZSB0aGUgR1YgbmFtZS4KKyAgICAgIHN0ZDo6c3RyaW5nIE1hbmdsZWROYW1lOworICAgICAgeworICAgICAgICByYXdfc3RyaW5nX29zdHJlYW0gTWFuZ2xlZE5hbWVTdHJlYW0oTWFuZ2xlZE5hbWUpOworICAgICAgICBNYW5nLmdldE5hbWVXaXRoUHJlZml4KE1hbmdsZWROYW1lU3RyZWFtLCAmR1YsIGZhbHNlKTsKKyAgICAgIH0KKworICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGlzIGlzIHRoZSBuYW1lIHdlIHdlcmUgc2VhcmNoaW5nIGZvciwgYW5kIGlmIGl0IGlzIHRoZW4KKyAgICAgIC8vIGJhaWwgb3V0IGVhcmx5LgorICAgICAgaWYgKE1hbmdsZWROYW1lID09IFNlYXJjaE5hbWUpCisgICAgICAgIGlmICghRXhwb3J0ZWRTeW1ib2xzT25seSB8fCBHVi5oYXNEZWZhdWx0VmlzaWJpbGl0eSgpKQorICAgICAgICAgIHJldHVybiAmR1Y7CisKKyAgICAgIC8vIE90aGVyd2lzZSBhZGQgdGhpcyB0byB0aGUgbWFwIGZvciBsYXRlci4KKyAgICAgIE5hbWVzW01hbmdsZWROYW1lXSA9ICZHVjsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIC8vIEJ1aWxkIHRoZSBNYW5nbGVkU3ltYm9scyBtYXAuIEJhaWxzIG91dCBlYXJseSAod2l0aCBNYW5nbGVkU3ltYm9scyBsZWZ0IHNldAorICAgIC8vIHRvIG51bGxwdHIpIGlmIHRoZSBnaXZlbiBTZWFyY2hOYW1lIGlzIGZvdW5kIHdoaWxlIGJ1aWxkaW5nIHRoZSBtYXAuCisgICAgY29uc3QgR2xvYmFsVmFsdWUqIGJ1aWxkTWFuZ2xlZFN5bWJvbHMoU3RyaW5nUmVmIFNlYXJjaE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeHBvcnRlZFN5bWJvbHNPbmx5KSBjb25zdCB7CisgICAgICBhc3NlcnQoIU1hbmdsZWRTeW1ib2xzICYmICJNYW5nbGVkIHN5bWJvbHMgbWFwIGFscmVhZHkgZXhpc3RzPyIpOworCisgICAgICBhdXRvIFN5bWJvbHMgPSBsbHZtOjptYWtlX3VuaXF1ZTxTdHJpbmdNYXA8Y29uc3QgR2xvYmFsVmFsdWUqPj4oKTsKKworICAgICAgTWFuZ2xlciBNYW5nOworCisgICAgICBmb3IgKGNvbnN0IGF1dG8gJkdPIDogTS0+Z2xvYmFsX29iamVjdHMoKSkKKyAgICAgICAgICBpZiAoYXV0byBHViA9IGFkZEdsb2JhbFZhbHVlKCpTeW1ib2xzLCBHTywgTWFuZywgU2VhcmNoTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cG9ydGVkU3ltYm9sc09ubHkpKQorICAgICAgICAgICAgcmV0dXJuIEdWOworCisgICAgICBNYW5nbGVkU3ltYm9scyA9IHN0ZDo6bW92ZShTeW1ib2xzKTsKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIH0KKworICAgIGVudW0geyBOb3RFbWl0dGVkLCBFbWl0dGluZywgRW1pdHRlZCB9IEVtaXRTdGF0ZSA9IE5vdEVtaXR0ZWQ7CisgICAgVk1vZHVsZUtleSBLOworICAgIHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IE07CisgICAgbXV0YWJsZSBzdGQ6OnVuaXF1ZV9wdHI8U3RyaW5nTWFwPGNvbnN0IEdsb2JhbFZhbHVlKj4+IE1hbmdsZWRTeW1ib2xzOworICB9OworCisgIEJhc2VMYXllclQgJkJhc2VMYXllcjsKKyAgc3RkOjptYXA8Vk1vZHVsZUtleSwgc3RkOjp1bmlxdWVfcHRyPEVtaXNzaW9uRGVmZXJyZWRNb2R1bGU+PiBNb2R1bGVNYXA7CisKK3B1YmxpYzoKKworICAvLy8gQGJyaWVmIENvbnN0cnVjdCBhIGxhenkgZW1pdHRpbmcgbGF5ZXIuCisgIExhenlFbWl0dGluZ0xheWVyKEJhc2VMYXllclQgJkJhc2VMYXllcikgOiBCYXNlTGF5ZXIoQmFzZUxheWVyKSB7fQorCisgIC8vLyBAYnJpZWYgQWRkIHRoZSBnaXZlbiBtb2R1bGUgdG8gdGhlIGxhenkgZW1pdHRpbmcgbGF5ZXIuCisgIEVycm9yIGFkZE1vZHVsZShWTW9kdWxlS2V5IEssIHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IE0pIHsKKyAgICBhc3NlcnQoIU1vZHVsZU1hcC5jb3VudChLKSAmJiAiVk1vZHVsZUtleSBLIGFscmVhZHkgaW4gdXNlIik7CisgICAgTW9kdWxlTWFwW0tdID0KKyAgICAgICAgbGx2bTo6bWFrZV91bmlxdWU8RW1pc3Npb25EZWZlcnJlZE1vZHVsZT4oc3RkOjptb3ZlKEspLCBzdGQ6Om1vdmUoTSkpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgLy8vIEBicmllZiBSZW1vdmUgdGhlIG1vZHVsZSByZXByZXNlbnRlZCBieSB0aGUgZ2l2ZW4gaGFuZGxlLgorICAvLy8KKyAgLy8vICAgVGhpcyBtZXRob2Qgd2lsbCBmcmVlIHRoZSBtZW1vcnkgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBtb2R1bGUsIGJvdGgKKyAgLy8vIGluIHRoaXMgbGF5ZXIsIGFuZCB0aGUgYmFzZSBsYXllci4KKyAgRXJyb3IgcmVtb3ZlTW9kdWxlKFZNb2R1bGVLZXkgSykgeworICAgIGF1dG8gSSA9IE1vZHVsZU1hcC5maW5kKEspOworICAgIGFzc2VydChJICE9IE1vZHVsZU1hcC5lbmQoKSAmJiAiVk1vZHVsZUtleSBLIG5vdCB2YWxpZCBoZXJlIik7CisgICAgYXV0byBFRE0gPSBzdGQ6Om1vdmUoSS5zZWNvbmQpOworICAgIE1vZHVsZU1hcC5lcmFzZShJKTsKKyAgICByZXR1cm4gRURNLT5yZW1vdmVNb2R1bGVGcm9tQmFzZUxheWVyKEJhc2VMYXllcik7CisgIH0KKworICAvLy8gQGJyaWVmIFNlYXJjaCBmb3IgdGhlIGdpdmVuIG5hbWVkIHN5bWJvbC4KKyAgLy8vIEBwYXJhbSBOYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdG8gc2VhcmNoIGZvci4KKyAgLy8vIEBwYXJhbSBFeHBvcnRlZFN5bWJvbHNPbmx5IElmIHRydWUsIHNlYXJjaCBvbmx5IGZvciBleHBvcnRlZCBzeW1ib2xzLgorICAvLy8gQHJldHVybiBBIGhhbmRsZSBmb3IgdGhlIGdpdmVuIG5hbWVkIHN5bWJvbCwgaWYgaXQgZXhpc3RzLgorICBKSVRTeW1ib2wgZmluZFN5bWJvbChjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwgYm9vbCBFeHBvcnRlZFN5bWJvbHNPbmx5KSB7CisgICAgLy8gTG9vayBmb3IgdGhlIHN5bWJvbCBhbW9uZyBleGlzdGluZyBkZWZpbml0aW9ucy4KKyAgICBpZiAoYXV0byBTeW1ib2wgPSBCYXNlTGF5ZXIuZmluZFN5bWJvbChOYW1lLCBFeHBvcnRlZFN5bWJvbHNPbmx5KSkKKyAgICAgIHJldHVybiBTeW1ib2w7CisKKyAgICAvLyBJZiBub3QgZm91bmQgdGhlbiBzZWFyY2ggdGhlIGRlZmVycmVkIG1vZHVsZXMuIElmIGFueSBvZiB0aGVzZSBjb250YWluIGEKKyAgICAvLyBkZWZpbml0aW9uIG9mICdOYW1lJyB0aGVuIHRoZXkgd2lsbCByZXR1cm4gYSBKSVRTeW1ib2wgdGhhdCB3aWxsIGVtaXQKKyAgICAvLyB0aGUgY29ycmVzcG9uZGluZyBtb2R1bGUgd2hlbiB0aGUgc3ltYm9sIGFkZHJlc3MgaXMgcmVxdWVzdGVkLgorICAgIGZvciAoYXV0byAmS1YgOiBNb2R1bGVNYXApCisgICAgICBpZiAoYXV0byBTeW1ib2wgPSBLVi5zZWNvbmQtPmZpbmQoTmFtZSwgRXhwb3J0ZWRTeW1ib2xzT25seSwgQmFzZUxheWVyKSkKKyAgICAgICAgcmV0dXJuIFN5bWJvbDsKKworICAgIC8vIElmIG5vIGRlZmluaXRpb24gZm91bmQgYW55d2hlcmUgcmV0dXJuIGEgbnVsbCBzeW1ib2wuCisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gQGJyaWVmIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZ2l2ZW4gc3ltYm9sIGluIHRoZSBjb250ZXh0IG9mIHRoZSBvZgorICAvLy8gICAgICAgIGNvbXBpbGVkIG1vZHVsZXMgcmVwcmVzZW50ZWQgYnkgdGhlIGtleSBLLgorICBKSVRTeW1ib2wgZmluZFN5bWJvbEluKFZNb2R1bGVLZXkgSywgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeHBvcnRlZFN5bWJvbHNPbmx5KSB7CisgICAgYXNzZXJ0KE1vZHVsZU1hcC5jb3VudChLKSAmJiAiVk1vZHVsZUtleSBLIG5vdCB2YWxpZCBoZXJlIik7CisgICAgcmV0dXJuIE1vZHVsZU1hcFtLXS0+ZmluZChOYW1lLCBFeHBvcnRlZFN5bWJvbHNPbmx5LCBCYXNlTGF5ZXIpOworICB9CisKKyAgLy8vIEBicmllZiBJbW1lZGlhdGVseSBlbWl0IGFuZCBmaW5hbGl6ZSB0aGUgbW9kdWxlIHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbgorICAvLy8gICAgICAgIGtleS4KKyAgRXJyb3IgZW1pdEFuZEZpbmFsaXplKFZNb2R1bGVLZXkgSykgeworICAgIGFzc2VydChNb2R1bGVNYXAuY291bnQoSykgJiYgIlZNb2R1bGVLZXkgSyBub3QgdmFsaWQgaGVyZSIpOworICAgIHJldHVybiBNb2R1bGVNYXBbS10tPmVtaXRBbmRGaW5hbGl6ZShCYXNlTGF5ZXIpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugb3JjCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0xBWllFTUlUVElOR0xBWUVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9MZWdhY3kuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9MZWdhY3kuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMmIzODlhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0xlZ2FjeS5oCkBAIC0wLDAgKzEsMTM4IEBACisvLz09PS0tLSBMZWdhY3kuaCAtLSBBZGFwdGVycyBmb3IgRXhlY3V0aW9uRW5naW5lIEFQSSBpbnRlcm9wIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIENvbnRhaW5zIGNvcmUgT1JDIEFQSXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfTEVHQUNZX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX0xFR0FDWV9ICisKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9KSVRTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvQ29yZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb3JjIHsKKworY2xhc3MgSklUU3ltYm9sUmVzb2x2ZXJBZGFwdGVyIDogcHVibGljIEpJVFN5bWJvbFJlc29sdmVyIHsKK3B1YmxpYzoKKyAgSklUU3ltYm9sUmVzb2x2ZXJBZGFwdGVyKEV4ZWN1dGlvblNlc3Npb24gJkVTLCBTeW1ib2xSZXNvbHZlciAmUik7CisgIEV4cGVjdGVkPExvb2t1cEZsYWdzUmVzdWx0PiBsb29rdXBGbGFncyhjb25zdCBMb29rdXBTZXQgJlN5bWJvbHMpIG92ZXJyaWRlOworICBFeHBlY3RlZDxMb29rdXBSZXN1bHQ+IGxvb2t1cChjb25zdCBMb29rdXBTZXQgJlN5bWJvbHMpIG92ZXJyaWRlOworCitwcml2YXRlOgorICBFeGVjdXRpb25TZXNzaW9uICZFUzsKKyAgc3RkOjpzZXQ8U3ltYm9sU3RyaW5nUHRyPiBSZXNvbHZlZFN0cmluZ3M7CisgIFN5bWJvbFJlc29sdmVyICZSOworfTsKKworLy8vIEBicmllZiBVc2UgdGhlIGdpdmVuIGxlZ2FjeS1zdHlsZSBGaW5kU3ltYm9sIGZ1bmN0aW9uIChpLmUuIGEgZnVuY3Rpb24gdGhhdAorLy8vICAgICAgICB0YWtlcyBhIGNvbnN0IHN0ZDo6c3RyaW5nJiBvciBTdHJpbmdSZWYgYW5kIHJldHVybnMgYSBKSVRTeW1ib2wpIHRvCisvLy8gICAgICAgIGZpbmQgdGhlIGZsYWdzIGZvciBlYWNoIHN5bWJvbCBpbiBTeW1ib2xzIGFuZCBzdG9yZSB0aGVpciBmbGFncyBpbgorLy8vICAgICAgICBTeW1ib2xGbGFncy4gSWYgYW55IEpJVFN5bWJvbCByZXR1cm5lZCBieSBGaW5kU3ltYm9sIGlzIGluIGFuIGVycm9yCisvLy8gICAgICAgIHN0YXRlIHRoZSBmdW5jdGlvbiByZXR1cm5zIGltbWVkaWF0ZWx5IHdpdGggdGhhdCBlcnJvciwgb3RoZXJ3aXNlIGl0CisvLy8gICAgICAgIHJldHVybnMgdGhlIHNldCBvZiBzeW1ib2xzIG5vdCBmb3VuZC4KKy8vLworLy8vIFVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIGxvb2t1cEZsYWdzIGJvZGllcyB0aGF0IHF1ZXJ5IGxlZ2FjeSByZXNvbHZlcnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRmluZFN5bWJvbEZuPgorRXhwZWN0ZWQ8U3ltYm9sTmFtZVNldD4gbG9va3VwRmxhZ3NXaXRoTGVnYWN5Rm4oU3ltYm9sRmxhZ3NNYXAgJlN5bWJvbEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3ltYm9sTmFtZVNldCAmU3ltYm9scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRTeW1ib2xGbiBGaW5kU3ltYm9sKSB7CisgIFN5bWJvbE5hbWVTZXQgU3ltYm9sc05vdEZvdW5kOworCisgIGZvciAoYXV0byAmUyA6IFN5bWJvbHMpIHsKKyAgICBpZiAoSklUU3ltYm9sIFN5bSA9IEZpbmRTeW1ib2woKlMpKQorICAgICAgU3ltYm9sRmxhZ3NbU10gPSBTeW0uZ2V0RmxhZ3MoKTsKKyAgICBlbHNlIGlmIChhdXRvIEVyciA9IFN5bS50YWtlRXJyb3IoKSkKKyAgICAgIHJldHVybiBzdGQ6Om1vdmUoRXJyKTsKKyAgICBlbHNlCisgICAgICBTeW1ib2xzTm90Rm91bmQuaW5zZXJ0KFMpOworICB9CisKKyAgcmV0dXJuIFN5bWJvbHNOb3RGb3VuZDsKK30KKworLy8vIEBicmllZiBVc2UgdGhlIGdpdmVuIGxlZ2FjeS1zdHlsZSBGaW5kU3ltYm9sIGZ1bmN0aW9uIChpLmUuIGEgZnVuY3Rpb24gdGhhdAorLy8vICAgICAgICB0YWtlcyBhIGNvbnN0IHN0ZDo6c3RyaW5nJiBvciBTdHJpbmdSZWYgYW5kIHJldHVybnMgYSBKSVRTeW1ib2wpIHRvCisvLy8gICAgICAgIGZpbmQgdGhlIGFkZHJlc3MgYW5kIGZsYWdzIGZvciBlYWNoIHN5bWJvbCBpbiBTeW1ib2xzIGFuZCBzdG9yZSB0aGUKKy8vLyAgICAgICAgcmVzdWx0IGluIFF1ZXJ5LiBJZiBhbnkgSklUU3ltYm9sIHJldHVybmVkIGJ5IEZpbmRTeW1ib2wgaXMgaW4gYW4KKy8vLyAgICAgICAgZXJyb3IgdGhlbiBRdWVyeS5zZXRGYWlsZWQoLi4uKSBpcyBjYWxsZWQgd2l0aCB0aGF0IGVycm9yIGFuZCB0aGUKKy8vLyAgICAgICAgZnVuY3Rpb24gcmV0dXJucyBpbW1lZGlhdGVseS4gT24gc3VjY2VzcywgcmV0dXJucyB0aGUgc2V0IG9mIHN5bWJvbHMKKy8vLyAgICAgICAgbm90IGZvdW5kLgorLy8vCisvLy8gVXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgbG9va3VwIGJvZGllcyB0aGF0IHF1ZXJ5IGxlZ2FjeSByZXNvbHZlcnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRmluZFN5bWJvbEZuPgorU3ltYm9sTmFtZVNldCBsb29rdXBXaXRoTGVnYWN5Rm4oQXN5bmNocm9ub3VzU3ltYm9sUXVlcnkgJlF1ZXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3ltYm9sTmFtZVNldCAmU3ltYm9scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRTeW1ib2xGbiBGaW5kU3ltYm9sKSB7CisgIFN5bWJvbE5hbWVTZXQgU3ltYm9sc05vdEZvdW5kOworCisgIGZvciAoYXV0byAmUyA6IFN5bWJvbHMpIHsKKyAgICBpZiAoSklUU3ltYm9sIFN5bSA9IEZpbmRTeW1ib2woKlMpKSB7CisgICAgICBpZiAoYXV0byBBZGRyID0gU3ltLmdldEFkZHJlc3MoKSkgeworICAgICAgICBRdWVyeS5zZXREZWZpbml0aW9uKFMsIEpJVEV2YWx1YXRlZFN5bWJvbCgqQWRkciwgU3ltLmdldEZsYWdzKCkpKTsKKyAgICAgICAgUXVlcnkubm90aWZ5U3ltYm9sRmluYWxpemVkKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBRdWVyeS5zZXRGYWlsZWQoQWRkci50YWtlRXJyb3IoKSk7CisgICAgICAgIHJldHVybiBTeW1ib2xOYW1lU2V0KCk7CisgICAgICB9CisgICAgfSBlbHNlIGlmIChhdXRvIEVyciA9IFN5bS50YWtlRXJyb3IoKSkgeworICAgICAgUXVlcnkuc2V0RmFpbGVkKHN0ZDo6bW92ZShFcnIpKTsKKyAgICAgIHJldHVybiBTeW1ib2xOYW1lU2V0KCk7CisgICAgfSBlbHNlCisgICAgICBTeW1ib2xzTm90Rm91bmQuaW5zZXJ0KFMpOworICB9CisKKyAgcmV0dXJuIFN5bWJvbHNOb3RGb3VuZDsKK30KKworLy8vIEBicmllZiBBbiBPUkMgU3ltYm9sUmVzb2x2ZXIgaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIGEgbGVnYWN5CisvLy8gICAgICAgIGZpbmRTeW1ib2wtbGlrZSBmdW5jdGlvbiB0byBwZXJmb3JtIGxvb2t1cDsKK3RlbXBsYXRlIDx0eXBlbmFtZSBMZWdhY3lMb29rdXBGbj4KK2NsYXNzIExlZ2FjeUxvb2t1cEZuUmVzb2x2ZXIgZmluYWwgOiBwdWJsaWMgU3ltYm9sUmVzb2x2ZXIgeworcHVibGljOgorICB1c2luZyBFcnJvclJlcG9ydGVyID0gc3RkOjpmdW5jdGlvbjx2b2lkKEVycm9yKT47CisKKyAgTGVnYWN5TG9va3VwRm5SZXNvbHZlcihMZWdhY3lMb29rdXBGbiBMZWdhY3lMb29rdXAsIEVycm9yUmVwb3J0ZXIgUmVwb3J0RXJyb3IpCisgICAgICA6IExlZ2FjeUxvb2t1cChzdGQ6Om1vdmUoTGVnYWN5TG9va3VwKSksCisgICAgICAgIFJlcG9ydEVycm9yKHN0ZDo6bW92ZShSZXBvcnRFcnJvcikpIHt9CisKKyAgU3ltYm9sTmFtZVNldCBsb29rdXBGbGFncyhTeW1ib2xGbGFnc01hcCAmRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3ltYm9sTmFtZVNldCAmU3ltYm9scykgZmluYWwgeworICAgIGlmIChhdXRvIFJlbWFpbmluZ1N5bWJvbHMgPQorICAgICAgICAgICAgbG9va3VwRmxhZ3NXaXRoTGVnYWN5Rm4oRmxhZ3MsIFN5bWJvbHMsIExlZ2FjeUxvb2t1cCkpCisgICAgICByZXR1cm4gc3RkOjptb3ZlKCpSZW1haW5pbmdTeW1ib2xzKTsKKyAgICBlbHNlIHsKKyAgICAgIFJlcG9ydEVycm9yKFJlbWFpbmluZ1N5bWJvbHMudGFrZUVycm9yKCkpOworICAgICAgcmV0dXJuIFN5bWJvbHM7CisgICAgfQorICB9CisKKyAgU3ltYm9sTmFtZVNldCBsb29rdXAoc3RkOjpzaGFyZWRfcHRyPEFzeW5jaHJvbm91c1N5bWJvbFF1ZXJ5PiBRdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sTmFtZVNldCBTeW1ib2xzKSBmaW5hbCB7CisgICAgcmV0dXJuIGxvb2t1cFdpdGhMZWdhY3lGbigqUXVlcnksIFN5bWJvbHMsIExlZ2FjeUxvb2t1cCk7CisgIH0KKworcHJpdmF0ZToKKyAgTGVnYWN5TG9va3VwRm4gTGVnYWN5TG9va3VwOworICBFcnJvclJlcG9ydGVyIFJlcG9ydEVycm9yOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIExlZ2FjeUxvb2t1cEZuPgorc3RkOjpzaGFyZWRfcHRyPExlZ2FjeUxvb2t1cEZuUmVzb2x2ZXI8TGVnYWN5TG9va3VwRm4+PgorY3JlYXRlTGVnYWN5TG9va3VwUmVzb2x2ZXIoTGVnYWN5TG9va3VwRm4gTGVnYWN5TG9va3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEVycm9yKT4gRXJyb3JSZXBvcnRlcikgeworICByZXR1cm4gc3RkOjptYWtlX3NoYXJlZDxMZWdhY3lMb29rdXBGblJlc29sdmVyPExlZ2FjeUxvb2t1cEZuPj4oCisgICAgICBzdGQ6Om1vdmUoTGVnYWN5TG9va3VwKSwgc3RkOjptb3ZlKEVycm9yUmVwb3J0ZXIpKTsKK30KKworfSAvLyBFbmQgbmFtZXNwYWNlIG9yYworfSAvLyBFbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19MRUdBQ1lfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL051bGxSZXNvbHZlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL051bGxSZXNvbHZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViYTliOTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvTnVsbFJlc29sdmVyLmgKQEAgLTAsMCArMSw0NSBAQAorLy89PT0tLS0tLS0gTnVsbFJlc29sdmVyLmggLSBSZWplY3Qgc3ltYm9sIGxvb2t1cCByZXF1ZXN0cyAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgIERlZmluZXMgYSBSdW50aW1lRHlsZDo6U3ltYm9sUmVzb2x2ZXIgc3ViY2xhc3MgdGhhdCByZWplY3RzIGFsbCBzeW1ib2wKKy8vIHJlc29sdXRpb24gcmVxdWVzdHMsIGZvciBjbGllbnRzIHRoYXQgaGF2ZSBubyBjcm9zcy1vYmplY3QgZml4dXBzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX05VTExSRVNPTFZFUl9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19OVUxMUkVTT0xWRVJfSAorCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0NvcmUuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9SdW50aW1lRHlsZC5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb3JjIHsKKworY2xhc3MgTnVsbFJlc29sdmVyIDogcHVibGljIFN5bWJvbFJlc29sdmVyIHsKK3B1YmxpYzoKKyAgU3ltYm9sTmFtZVNldCBsb29rdXBGbGFncyhTeW1ib2xGbGFnc01hcCAmRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3ltYm9sTmFtZVNldCAmU3ltYm9scykgb3ZlcnJpZGU7CisKKyAgU3ltYm9sTmFtZVNldCBsb29rdXAoc3RkOjpzaGFyZWRfcHRyPEFzeW5jaHJvbm91c1N5bWJvbFF1ZXJ5PiBRdWVyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgU3ltYm9sTmFtZVNldCBTeW1ib2xzKSBvdmVycmlkZTsKK307CisKKy8vLyBTeW1ib2xSZXNvbHZlciBpbXBsaWVtZW50YXRpb24gdGhhdCByZWplY3RzIGFsbCByZXNvbHV0aW9uIHJlcXVlc3RzLgorLy8vIFVzZWZ1bCBmb3IgY2xpZW50cyB0aGF0IGhhdmUgbm8gY3Jvc3Mtb2JqZWN0IGZpeHVwcy4KK2NsYXNzIE51bGxMZWdhY3lSZXNvbHZlciA6IHB1YmxpYyBMZWdhY3lKSVRTeW1ib2xSZXNvbHZlciB7CitwdWJsaWM6CisgIEpJVFN5bWJvbCBmaW5kU3ltYm9sKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSBmaW5hbDsKKworICBKSVRTeW1ib2wgZmluZFN5bWJvbEluTG9naWNhbER5bGliKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSBmaW5hbDsKK307CisKK30gLy8gRW5kIG5hbWVzcGFjZSBvcmMuCit9IC8vIEVuZCBuYW1lc3BhY2UgbGx2bS4KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19OVUxMUkVTT0xWRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL09iamVjdFRyYW5zZm9ybUxheWVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvT2JqZWN0VHJhbnNmb3JtTGF5ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmMzOTIyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL09iamVjdFRyYW5zZm9ybUxheWVyLmgKQEAgLTAsMCArMSw5NyBAQAorLy89PT0tIE9iamVjdFRyYW5zZm9ybUxheWVyLmggLSBSdW4gYWxsIG9iamVjdHMgdGhyb3VnaCBmdW5jdG9yIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBSdW4gYWxsIG9iamVjdHMgcGFzc2VkIGluIHRocm91Z2ggYSB1c2VyIHN1cHBsaWVkIGZ1bmN0b3IuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfT0JKRUNUVFJBTlNGT1JNTEFZRVJfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfT0JKRUNUVFJBTlNGT1JNTEFZRVJfSAorCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvSklUU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0NvcmUuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9yYyB7CisKKy8vLyBAYnJpZWYgT2JqZWN0IG11dGF0aW5nIGxheWVyLgorLy8vCisvLy8gICBUaGlzIGxheWVyIGFjY2VwdHMgc2V0cyBvZiBPYmplY3RGaWxlcyAodmlhIGFkZE9iamVjdCkuIEl0CisvLy8gaW1tZWRpYXRlbHkgYXBwbGllcyB0aGUgdXNlciBzdXBwbGllZCBmdW5jdG9yIHRvIGVhY2ggb2JqZWN0LCB0aGVuIGFkZHMKKy8vLyB0aGUgc2V0IG9mIHRyYW5zZm9ybWVkIG9iamVjdHMgdG8gdGhlIGxheWVyIGJlbG93LgordGVtcGxhdGUgPHR5cGVuYW1lIEJhc2VMYXllclQsIHR5cGVuYW1lIFRyYW5zZm9ybUZ0b3I+CitjbGFzcyBPYmplY3RUcmFuc2Zvcm1MYXllciB7CitwdWJsaWM6CisgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGFuIE9iamVjdFRyYW5zZm9ybUxheWVyIHdpdGggdGhlIGdpdmVuIEJhc2VMYXllcgorICBPYmplY3RUcmFuc2Zvcm1MYXllcihCYXNlTGF5ZXJUICZCYXNlTGF5ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zZm9ybUZ0b3IgVHJhbnNmb3JtID0gVHJhbnNmb3JtRnRvcigpKQorICAgICAgOiBCYXNlTGF5ZXIoQmFzZUxheWVyKSwgVHJhbnNmb3JtKHN0ZDo6bW92ZShUcmFuc2Zvcm0pKSB7fQorCisgIC8vLyBAYnJpZWYgQXBwbHkgdGhlIHRyYW5zZm9ybSBmdW5jdG9yIHRvIGVhY2ggb2JqZWN0IGluIHRoZSBvYmplY3Qgc2V0LCB0aGVuCisgIC8vLyAgICAgICAgYWRkIHRoZSByZXN1bHRpbmcgc2V0IG9mIG9iamVjdHMgdG8gdGhlIGJhc2UgbGF5ZXIsIGFsb25nIHdpdGggdGhlCisgIC8vLyAgICAgICAgbWVtb3J5IG1hbmFnZXIgYW5kIHN5bWJvbCByZXNvbHZlci4KKyAgLy8vCisgIC8vLyBAcmV0dXJuIEEgaGFuZGxlIGZvciB0aGUgYWRkZWQgb2JqZWN0cy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE9iamVjdFB0cj4gRXJyb3IgYWRkT2JqZWN0KFZNb2R1bGVLZXkgSywgT2JqZWN0UHRyIE9iaikgeworICAgIHJldHVybiBCYXNlTGF5ZXIuYWRkT2JqZWN0KHN0ZDo6bW92ZShLKSwgVHJhbnNmb3JtKHN0ZDo6bW92ZShPYmopKSk7CisgIH0KKworICAvLy8gQGJyaWVmIFJlbW92ZSB0aGUgb2JqZWN0IHNldCBhc3NvY2lhdGVkIHdpdGggdGhlIFZNb2R1bGVLZXkgSy4KKyAgRXJyb3IgcmVtb3ZlT2JqZWN0KFZNb2R1bGVLZXkgSykgeyByZXR1cm4gQmFzZUxheWVyLnJlbW92ZU9iamVjdChLKTsgfQorCisgIC8vLyBAYnJpZWYgU2VhcmNoIGZvciB0aGUgZ2l2ZW4gbmFtZWQgc3ltYm9sLgorICAvLy8gQHBhcmFtIE5hbWUgVGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB0byBzZWFyY2ggZm9yLgorICAvLy8gQHBhcmFtIEV4cG9ydGVkU3ltYm9sc09ubHkgSWYgdHJ1ZSwgc2VhcmNoIG9ubHkgZm9yIGV4cG9ydGVkIHN5bWJvbHMuCisgIC8vLyBAcmV0dXJuIEEgaGFuZGxlIGZvciB0aGUgZ2l2ZW4gbmFtZWQgc3ltYm9sLCBpZiBpdCBleGlzdHMuCisgIEpJVFN5bWJvbCBmaW5kU3ltYm9sKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLCBib29sIEV4cG9ydGVkU3ltYm9sc09ubHkpIHsKKyAgICByZXR1cm4gQmFzZUxheWVyLmZpbmRTeW1ib2woTmFtZSwgRXhwb3J0ZWRTeW1ib2xzT25seSk7CisgIH0KKworICAvLy8gQGJyaWVmIEdldCB0aGUgYWRkcmVzcyBvZiB0aGUgZ2l2ZW4gc3ltYm9sIGluIHRoZSBjb250ZXh0IG9mIHRoZSBzZXQgb2YKKyAgLy8vICAgICAgICBvYmplY3RzIHJlcHJlc2VudGVkIGJ5IHRoZSBWTW9kdWxlS2V5IEsuIFRoaXMgY2FsbCBpcyBmb3J3YXJkZWQgdG8KKyAgLy8vICAgICAgICB0aGUgYmFzZSBsYXllcidzIGltcGxlbWVudGF0aW9uLgorICAvLy8gQHBhcmFtIEsgVGhlIFZNb2R1bGVLZXkgYXNzb2NpYXRlZCB3aXRoIHRoZSBvYmplY3Qgc2V0IHRvIHNlYXJjaCBpbi4KKyAgLy8vIEBwYXJhbSBOYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdG8gc2VhcmNoIGZvci4KKyAgLy8vIEBwYXJhbSBFeHBvcnRlZFN5bWJvbHNPbmx5IElmIHRydWUsIHNlYXJjaCBvbmx5IGZvciBleHBvcnRlZCBzeW1ib2xzLgorICAvLy8gQHJldHVybiBBIGhhbmRsZSBmb3IgdGhlIGdpdmVuIG5hbWVkIHN5bWJvbCwgaWYgaXQgaXMgZm91bmQgaW4gdGhlCisgIC8vLyAgICAgICAgIGdpdmVuIG9iamVjdCBzZXQuCisgIEpJVFN5bWJvbCBmaW5kU3ltYm9sSW4oVk1vZHVsZUtleSBLLCBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEV4cG9ydGVkU3ltYm9sc09ubHkpIHsKKyAgICByZXR1cm4gQmFzZUxheWVyLmZpbmRTeW1ib2xJbihLLCBOYW1lLCBFeHBvcnRlZFN5bWJvbHNPbmx5KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgSW1tZWRpYXRlbHkgZW1pdCBhbmQgZmluYWxpemUgdGhlIG9iamVjdCBzZXQgcmVwcmVzZW50ZWQgYnkgdGhlCisgIC8vLyAgICAgICAgZ2l2ZW4gVk1vZHVsZUtleSBLLgorICBFcnJvciBlbWl0QW5kRmluYWxpemUoVk1vZHVsZUtleSBLKSB7IHJldHVybiBCYXNlTGF5ZXIuZW1pdEFuZEZpbmFsaXplKEspOyB9CisKKyAgLy8vIEBicmllZiBNYXAgc2VjdGlvbiBhZGRyZXNzZXMgZm9yIHRoZSBvYmplY3RzIGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgLy8vIFZNb2R1bGVLZXkgSy4KKyAgdm9pZCBtYXBTZWN0aW9uQWRkcmVzcyhWTW9kdWxlS2V5IEssIGNvbnN0IHZvaWQgKkxvY2FsQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBKSVRUYXJnZXRBZGRyZXNzIFRhcmdldEFkZHIpIHsKKyAgICBCYXNlTGF5ZXIubWFwU2VjdGlvbkFkZHJlc3MoSywgTG9jYWxBZGRyZXNzLCBUYXJnZXRBZGRyKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgQWNjZXNzIHRoZSB0cmFuc2Zvcm0gZnVuY3RvciBkaXJlY3RseS4KKyAgVHJhbnNmb3JtRnRvciAmZ2V0VHJhbnNmb3JtKCkgeyByZXR1cm4gVHJhbnNmb3JtOyB9CisKKyAgLy8vIEBicmllZiBBY2Nlc3MgdGhlIG11bWF0ZSBmdW5jdG9yIGRpcmVjdGx5LgorICBjb25zdCBUcmFuc2Zvcm1GdG9yICZnZXRUcmFuc2Zvcm0oKSBjb25zdCB7IHJldHVybiBUcmFuc2Zvcm07IH0KKworcHJpdmF0ZToKKyAgQmFzZUxheWVyVCAmQmFzZUxheWVyOworICBUcmFuc2Zvcm1GdG9yIFRyYW5zZm9ybTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvcmMKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfT0JKRUNUVFJBTlNGT1JNTEFZRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL09yY0FCSVN1cHBvcnQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9PcmNBQklTdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTFiNTU2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9PcmNBQklTdXBwb3J0LmgKQEAgLTAsMCArMSwyNDQgQEAKKy8vPT09LSBPcmNBQklTdXBwb3J0LmggLSBBQkkgc3VwcG9ydCBjb2RlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQUJJIHNwZWNpZmljIGNvZGUgZm9yIE9yYywgZS5nLiBjYWxsYmFjayBhc3NlbWJseS4KKy8vCisvLyBBQkkgY2xhc3NlcyBzaG91bGQgYmUgcGFydCBvZiB0aGUgSklUICp0YXJnZXQqIHByb2Nlc3MsIG5vdCB0aGUgaG9zdAorLy8gcHJvY2VzcyAoZXhjZXB0IHdoZXJlIHlvdSdyZSBkb2luZyBob3N0ZWQgSklUaW5nIGFuZCB0aGUgdHdvIGFyZSBvbmUgYW5kIHRoZQorLy8gc2FtZSkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfT1JDQUJJU1VQUE9SVF9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19PUkNBQklTVVBQT1JUX0gKKworI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0pJVFN5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb3JjIHsKKworLy8vIEdlbmVyaWMgT1JDIEFCSSBzdXBwb3J0LgorLy8vCisvLy8gVGhpcyBjbGFzcyBjYW4gYmUgc3Vic3RpdHV0ZWQgYXMgdGhlIHRhcmdldCBhcmNoaXRlY3VyZSBzdXBwb3J0IGNsYXNzIGZvcgorLy8vIE9SQyB0ZW1wbGF0ZXMgdGhhdCByZXF1aXJlIG9uZSAoZS5nLiBJbmRpcmVjdFN0dWJzTWFuYWdlcnMpLiBJdCBkb2VzIG5vdAorLy8vIHN1cHBvcnQgbGF6eSBKSVRpbmcgaG93ZXZlciwgYW5kIGFueSBhdHRlbXB0IHRvIHVzZSB0aGF0IGZ1bmN0aW9uYWxpdHkKKy8vLyB3aWxsIHJlc3VsdCBpbiBleGVjdXRpb24gb2YgYW4gbGx2bV91bnJlYWNoYWJsZS4KK2NsYXNzIE9yY0dlbmVyaWNBQkkgeworcHVibGljOgorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgUG9pbnRlclNpemUgPSBzaXplb2YodWludHB0cl90KTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFRyYW1wb2xpbmVTaXplID0gMTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlc29sdmVyQ29kZVNpemUgPSAxOworCisgIHVzaW5nIEpJVFJlZW50cnlGbiA9IEpJVFRhcmdldEFkZHJlc3MgKCopKHZvaWQgKkNhbGxiYWNrTWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpUcmFtcG9saW5lSWQpOworCisgIHN0YXRpYyB2b2lkIHdyaXRlUmVzb2x2ZXJDb2RlKHVpbnQ4X3QgKlJlc29sdmVNZW0sIEpJVFJlZW50cnlGbiBSZWVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDYWxsYmFja01ncikgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIndyaXRlUmVzb2x2ZXJDb2RlIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGdlbmVyaWMgaG9zdCAiCisgICAgICAgICAgICAgICAgICAgICAic3VwcG9ydCBjbGFzcyIpOworICB9CisKKyAgc3RhdGljIHZvaWQgd3JpdGVUcmFtcG9saW5lcyh1aW50OF90ICpUcmFtcG9saW5lTWVtLCB2b2lkICpSZXNvbHZlckFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtVHJhbXBvbGluZXMpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJ3cml0ZVRyYW1wb2xpbmVzIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGdlbmVyaWMgaG9zdCAiCisgICAgICAgICAgICAgICAgICAgICAic3VwcG9ydCBjbGFzcyIpOworICB9CisKKyAgY2xhc3MgSW5kaXJlY3RTdHVic0luZm8geworICBwdWJsaWM6CisgICAgY29uc3Qgc3RhdGljIHVuc2lnbmVkIFN0dWJTaXplID0gMTsKKworICAgIHVuc2lnbmVkIGdldE51bVN0dWJzKCkgY29uc3QgeyBsbHZtX3VucmVhY2hhYmxlKCJOb3Qgc3VwcG9ydGVkIik7IH0KKyAgICB2b2lkICpnZXRTdHViKHVuc2lnbmVkIElkeCkgY29uc3QgeyBsbHZtX3VucmVhY2hhYmxlKCJOb3Qgc3VwcG9ydGVkIik7IH0KKyAgICB2b2lkICoqZ2V0UHRyKHVuc2lnbmVkIElkeCkgY29uc3QgeyBsbHZtX3VucmVhY2hhYmxlKCJOb3Qgc3VwcG9ydGVkIik7IH0KKyAgfTsKKworICBzdGF0aWMgRXJyb3IgZW1pdEluZGlyZWN0U3R1YnNCbG9jayhJbmRpcmVjdFN0dWJzSW5mbyAmU3R1YnNJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNaW5TdHVicywgdm9pZCAqSW5pdGlhbFB0clZhbCkgeworICAgIGxsdm1fdW5yZWFjaGFibGUoImVtaXRJbmRpcmVjdFN0dWJzQmxvY2sgaXMgbm90IHN1cHBvcnRlZCBieSB0aGUgZ2VuZXJpYyAiCisgICAgICAgICAgICAgICAgICAgICAiaG9zdCBzdXBwb3J0IGNsYXNzIik7CisgIH0KK307CisKKy8vLyBAYnJpZWYgUHJvdmlkZSBpbmZvcm1hdGlvbiBhYm91dCBzdHViIGJsb2NrcyBnZW5lcmF0ZWQgYnkgdGhlCisvLy8gICAgICAgIG1ha2VJbmRpcmVjdFN0dWJzQmxvY2sgZnVuY3Rpb24uCit0ZW1wbGF0ZSA8dW5zaWduZWQgU3R1YlNpemVWYWw+IGNsYXNzIEdlbmVyaWNJbmRpcmVjdFN0dWJzSW5mbyB7CitwdWJsaWM6CisgIGNvbnN0IHN0YXRpYyB1bnNpZ25lZCBTdHViU2l6ZSA9IFN0dWJTaXplVmFsOworCisgIEdlbmVyaWNJbmRpcmVjdFN0dWJzSW5mbygpID0gZGVmYXVsdDsKKyAgR2VuZXJpY0luZGlyZWN0U3R1YnNJbmZvKHVuc2lnbmVkIE51bVN0dWJzLCBzeXM6Ok93bmluZ01lbW9yeUJsb2NrIFN0dWJzTWVtKQorICAgICAgOiBOdW1TdHVicyhOdW1TdHVicyksIFN0dWJzTWVtKHN0ZDo6bW92ZShTdHVic01lbSkpIHt9CisgIEdlbmVyaWNJbmRpcmVjdFN0dWJzSW5mbyhHZW5lcmljSW5kaXJlY3RTdHVic0luZm8gJiZPdGhlcikKKyAgICAgIDogTnVtU3R1YnMoT3RoZXIuTnVtU3R1YnMpLCBTdHVic01lbShzdGQ6Om1vdmUoT3RoZXIuU3R1YnNNZW0pKSB7CisgICAgT3RoZXIuTnVtU3R1YnMgPSAwOworICB9CisKKyAgR2VuZXJpY0luZGlyZWN0U3R1YnNJbmZvICZvcGVyYXRvcj0oR2VuZXJpY0luZGlyZWN0U3R1YnNJbmZvICYmT3RoZXIpIHsKKyAgICBOdW1TdHVicyA9IE90aGVyLk51bVN0dWJzOworICAgIE90aGVyLk51bVN0dWJzID0gMDsKKyAgICBTdHVic01lbSA9IHN0ZDo6bW92ZShPdGhlci5TdHVic01lbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIEBicmllZiBOdW1iZXIgb2Ygc3R1YnMgaW4gdGhpcyBibG9jay4KKyAgdW5zaWduZWQgZ2V0TnVtU3R1YnMoKSBjb25zdCB7IHJldHVybiBOdW1TdHViczsgfQorCisgIC8vLyBAYnJpZWYgR2V0IGEgcG9pbnRlciB0byB0aGUgc3R1YiBhdCB0aGUgZ2l2ZW4gaW5kZXgsIHdoaWNoIG11c3QgYmUgaW4KKyAgLy8vICAgICAgICB0aGUgcmFuZ2UgMCAuLiBnZXROdW1TdHVicygpIC0gMS4KKyAgdm9pZCAqZ2V0U3R1Yih1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y2hhciAqPihTdHVic01lbS5iYXNlKCkpICsgSWR4ICogU3R1YlNpemU7CisgIH0KKworICAvLy8gQGJyaWVmIEdldCBhIHBvaW50ZXIgdG8gdGhlIGltcGxlbWVudGF0aW9uLXBvaW50ZXIgYXQgdGhlIGdpdmVuIGluZGV4LAorICAvLy8gICAgICAgIHdoaWNoIG11c3QgYmUgaW4gdGhlIHJhbmdlIDAgLi4gZ2V0TnVtU3R1YnMoKSAtIDEuCisgIHZvaWQgKipnZXRQdHIodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgY2hhciAqUHRyc0Jhc2UgPSBzdGF0aWNfY2FzdDxjaGFyICo+KFN0dWJzTWVtLmJhc2UoKSkgKyBOdW1TdHVicyAqIFN0dWJTaXplOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQgKio+KFB0cnNCYXNlKSArIElkeDsKKyAgfQorCitwcml2YXRlOgorICB1bnNpZ25lZCBOdW1TdHVicyA9IDA7CisgIHN5czo6T3duaW5nTWVtb3J5QmxvY2sgU3R1YnNNZW07Cit9OworCitjbGFzcyBPcmNBQXJjaDY0IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFBvaW50ZXJTaXplID0gODsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFRyYW1wb2xpbmVTaXplID0gMTI7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBSZXNvbHZlckNvZGVTaXplID0gMHgxMjA7CisKKyAgdXNpbmcgSW5kaXJlY3RTdHVic0luZm8gPSBHZW5lcmljSW5kaXJlY3RTdHVic0luZm88OD47CisKKyAgdXNpbmcgSklUUmVlbnRyeUZuID0gSklUVGFyZ2V0QWRkcmVzcyAoKikodm9pZCAqQ2FsbGJhY2tNZ3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKlRyYW1wb2xpbmVJZCk7CisKKyAgLy8vIEBicmllZiBXcml0ZSB0aGUgcmVzb2x2ZXIgY29kZSBpbnRvIHRoZSBnaXZlbiBtZW1vcnkuIFRoZSB1c2VyIGlzIGJlCisgIC8vLyAgICAgICAgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcgdGhlIG1lbW9yeSBhbmQgc2V0dGluZyBwZXJtaXNzaW9ucy4KKyAgc3RhdGljIHZvaWQgd3JpdGVSZXNvbHZlckNvZGUodWludDhfdCAqUmVzb2x2ZU1lbSwgSklUUmVlbnRyeUZuIFJlZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNhbGxiYWNrTWdyKTsKKworICAvLy8gQGJyaWVmIFdyaXRlIHRoZSByZXF1c3RlZCBudW1iZXIgb2YgdHJhbXBvbGluZXMgaW50byB0aGUgZ2l2ZW4gbWVtb3J5LAorICAvLy8gICAgICAgIHdoaWNoIG11c3QgYmUgYmlnIGVub3VnaCB0byBob2xkIDEgcG9pbnRlciwgcGx1cyBOdW1UcmFtcG9saW5lcworICAvLy8gICAgICAgIHRyYW1wb2xpbmVzLgorICBzdGF0aWMgdm9pZCB3cml0ZVRyYW1wb2xpbmVzKHVpbnQ4X3QgKlRyYW1wb2xpbmVNZW0sIHZvaWQgKlJlc29sdmVyQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1UcmFtcG9saW5lcyk7CisKKyAgLy8vIEBicmllZiBFbWl0IGF0IGxlYXN0IE1pblN0dWJzIHdvcnRoIG9mIGluZGlyZWN0IGNhbGwgc3R1YnMsIHJvdW5kZWQgb3V0IHRvCisgIC8vLyAgICAgICAgdGhlIG5lYXJlc3QgcGFnZSBzaXplLgorICAvLy8KKyAgLy8vICAgRS5nLiBBc2tpbmcgZm9yIDQgc3R1YnMgb24geDg2LTY0LCB3aGVyZSBzdHVicyBhcmUgOC1ieXRlcywgd2l0aCA0aworICAvLy8gcGFnZXMgd2lsbCByZXR1cm4gYSBibG9jayBvZiA1MTIgc3R1YnMgKDQwOTYgLyA4ID0gNTEyKS4gQXNraW5nIGZvciA1MTMKKyAgLy8vIHdpbGwgcmV0dXJuIGEgYmxvY2sgb2YgMTAyNCAoMi1wYWdlcyB3b3J0aCkuCisgIHN0YXRpYyBFcnJvciBlbWl0SW5kaXJlY3RTdHVic0Jsb2NrKEluZGlyZWN0U3R1YnNJbmZvICZTdHVic0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1pblN0dWJzLCB2b2lkICpJbml0aWFsUHRyVmFsKTsKK307CisKKy8vLyBAYnJpZWYgWDg2XzY0IGNvZGUgdGhhdCdzIGNvbW1vbiB0byBhbGwgQUJJcy4KKy8vLworLy8vIFg4Nl82NCBzdXBwb3J0cyBsYXp5IEpJVGluZy4KK2NsYXNzIE9yY1g4Nl82NF9CYXNlIHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFBvaW50ZXJTaXplID0gODsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFRyYW1wb2xpbmVTaXplID0gODsKKworICB1c2luZyBJbmRpcmVjdFN0dWJzSW5mbyA9IEdlbmVyaWNJbmRpcmVjdFN0dWJzSW5mbzw4PjsKKworICAvLy8gQGJyaWVmIFdyaXRlIHRoZSByZXF1c3RlZCBudW1iZXIgb2YgdHJhbXBvbGluZXMgaW50byB0aGUgZ2l2ZW4gbWVtb3J5LAorICAvLy8gICAgICAgIHdoaWNoIG11c3QgYmUgYmlnIGVub3VnaCB0byBob2xkIDEgcG9pbnRlciwgcGx1cyBOdW1UcmFtcG9saW5lcworICAvLy8gICAgICAgIHRyYW1wb2xpbmVzLgorICBzdGF0aWMgdm9pZCB3cml0ZVRyYW1wb2xpbmVzKHVpbnQ4X3QgKlRyYW1wb2xpbmVNZW0sIHZvaWQgKlJlc29sdmVyQWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1UcmFtcG9saW5lcyk7CisKKyAgLy8vIEBicmllZiBFbWl0IGF0IGxlYXN0IE1pblN0dWJzIHdvcnRoIG9mIGluZGlyZWN0IGNhbGwgc3R1YnMsIHJvdW5kZWQgb3V0IHRvCisgIC8vLyAgICAgICAgdGhlIG5lYXJlc3QgcGFnZSBzaXplLgorICAvLy8KKyAgLy8vICAgRS5nLiBBc2tpbmcgZm9yIDQgc3R1YnMgb24geDg2LTY0LCB3aGVyZSBzdHVicyBhcmUgOC1ieXRlcywgd2l0aCA0aworICAvLy8gcGFnZXMgd2lsbCByZXR1cm4gYSBibG9jayBvZiA1MTIgc3R1YnMgKDQwOTYgLyA4ID0gNTEyKS4gQXNraW5nIGZvciA1MTMKKyAgLy8vIHdpbGwgcmV0dXJuIGEgYmxvY2sgb2YgMTAyNCAoMi1wYWdlcyB3b3J0aCkuCisgIHN0YXRpYyBFcnJvciBlbWl0SW5kaXJlY3RTdHVic0Jsb2NrKEluZGlyZWN0U3R1YnNJbmZvICZTdHVic0luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1pblN0dWJzLCB2b2lkICpJbml0aWFsUHRyVmFsKTsKK307CisKKy8vLyBAYnJpZWYgWDg2XzY0IHN1cHBvcnQgZm9yIFN5c1YgQUJJIChMaW51eCwgTWFjT1NYKS4KKy8vLworLy8vIFg4Nl82NF9TeXNWIHN1cHBvcnRzIGxhenkgSklUaW5nLgorY2xhc3MgT3JjWDg2XzY0X1N5c1YgOiBwdWJsaWMgT3JjWDg2XzY0X0Jhc2UgeworcHVibGljOgorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgUmVzb2x2ZXJDb2RlU2l6ZSA9IDB4NkM7CisKKyAgdXNpbmcgSklUUmVlbnRyeUZuID0gSklUVGFyZ2V0QWRkcmVzcyAoKikodm9pZCAqQ2FsbGJhY2tNZ3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKlRyYW1wb2xpbmVJZCk7CisKKyAgLy8vIEBicmllZiBXcml0ZSB0aGUgcmVzb2x2ZXIgY29kZSBpbnRvIHRoZSBnaXZlbiBtZW1vcnkuIFRoZSB1c2VyIGlzIGJlCisgIC8vLyAgICAgICAgcmVzcG9uc2libGUgZm9yIGFsbG9jYXRpbmcgdGhlIG1lbW9yeSBhbmQgc2V0dGluZyBwZXJtaXNzaW9ucy4KKyAgc3RhdGljIHZvaWQgd3JpdGVSZXNvbHZlckNvZGUodWludDhfdCAqUmVzb2x2ZU1lbSwgSklUUmVlbnRyeUZuIFJlZW50cnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkNhbGxiYWNrTWdyKTsKK307CisKKy8vLyBAYnJpZWYgWDg2XzY0IHN1cHBvcnQgZm9yIFdpbjMyLgorLy8vCisvLy8gWDg2XzY0X1dpbjMyIHN1cHBvcnRzIGxhenkgSklUaW5nLgorY2xhc3MgT3JjWDg2XzY0X1dpbjMyIDogcHVibGljIE9yY1g4Nl82NF9CYXNlIHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlc29sdmVyQ29kZVNpemUgPSAweDc0OworCisgIHVzaW5nIEpJVFJlZW50cnlGbiA9IEpJVFRhcmdldEFkZHJlc3MgKCopKHZvaWQgKkNhbGxiYWNrTWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpUcmFtcG9saW5lSWQpOworCisgIC8vLyBAYnJpZWYgV3JpdGUgdGhlIHJlc29sdmVyIGNvZGUgaW50byB0aGUgZ2l2ZW4gbWVtb3J5LiBUaGUgdXNlciBpcyBiZQorICAvLy8gICAgICAgIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIHRoZSBtZW1vcnkgYW5kIHNldHRpbmcgcGVybWlzc2lvbnMuCisgIHN0YXRpYyB2b2lkIHdyaXRlUmVzb2x2ZXJDb2RlKHVpbnQ4X3QgKlJlc29sdmVNZW0sIEpJVFJlZW50cnlGbiBSZWVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDYWxsYmFja01ncik7Cit9OworCisvLy8gQGJyaWVmIEkzODYgc3VwcG9ydC4KKy8vLworLy8vIEkzODYgc3VwcG9ydHMgbGF6eSBKSVRpbmcuCitjbGFzcyBPcmNJMzg2IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFBvaW50ZXJTaXplID0gNDsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFRyYW1wb2xpbmVTaXplID0gODsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIFJlc29sdmVyQ29kZVNpemUgPSAweDRhOworCisgIHVzaW5nIEluZGlyZWN0U3R1YnNJbmZvID0gR2VuZXJpY0luZGlyZWN0U3R1YnNJbmZvPDg+OworCisgIHVzaW5nIEpJVFJlZW50cnlGbiA9IEpJVFRhcmdldEFkZHJlc3MgKCopKHZvaWQgKkNhbGxiYWNrTWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpUcmFtcG9saW5lSWQpOworCisgIC8vLyBAYnJpZWYgV3JpdGUgdGhlIHJlc29sdmVyIGNvZGUgaW50byB0aGUgZ2l2ZW4gbWVtb3J5LiBUaGUgdXNlciBpcyBiZQorICAvLy8gICAgICAgIHJlc3BvbnNpYmxlIGZvciBhbGxvY2F0aW5nIHRoZSBtZW1vcnkgYW5kIHNldHRpbmcgcGVybWlzc2lvbnMuCisgIHN0YXRpYyB2b2lkIHdyaXRlUmVzb2x2ZXJDb2RlKHVpbnQ4X3QgKlJlc29sdmVNZW0sIEpJVFJlZW50cnlGbiBSZWVudHJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpDYWxsYmFja01ncik7CisKKyAgLy8vIEBicmllZiBXcml0ZSB0aGUgcmVxdXN0ZWQgbnVtYmVyIG9mIHRyYW1wb2xpbmVzIGludG8gdGhlIGdpdmVuIG1lbW9yeSwKKyAgLy8vICAgICAgICB3aGljaCBtdXN0IGJlIGJpZyBlbm91Z2ggdG8gaG9sZCAxIHBvaW50ZXIsIHBsdXMgTnVtVHJhbXBvbGluZXMKKyAgLy8vICAgICAgICB0cmFtcG9saW5lcy4KKyAgc3RhdGljIHZvaWQgd3JpdGVUcmFtcG9saW5lcyh1aW50OF90ICpUcmFtcG9saW5lTWVtLCB2b2lkICpSZXNvbHZlckFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtVHJhbXBvbGluZXMpOworCisgIC8vLyBAYnJpZWYgRW1pdCBhdCBsZWFzdCBNaW5TdHVicyB3b3J0aCBvZiBpbmRpcmVjdCBjYWxsIHN0dWJzLCByb3VuZGVkIG91dCB0bworICAvLy8gICAgICAgIHRoZSBuZWFyZXN0IHBhZ2Ugc2l6ZS4KKyAgLy8vCisgIC8vLyAgIEUuZy4gQXNraW5nIGZvciA0IHN0dWJzIG9uIGkzODYsIHdoZXJlIHN0dWJzIGFyZSA4LWJ5dGVzLCB3aXRoIDRrCisgIC8vLyBwYWdlcyB3aWxsIHJldHVybiBhIGJsb2NrIG9mIDUxMiBzdHVicyAoNDA5NiAvIDggPSA1MTIpLiBBc2tpbmcgZm9yIDUxMworICAvLy8gd2lsbCByZXR1cm4gYSBibG9jayBvZiAxMDI0ICgyLXBhZ2VzIHdvcnRoKS4KKyAgc3RhdGljIEVycm9yIGVtaXRJbmRpcmVjdFN0dWJzQmxvY2soSW5kaXJlY3RTdHVic0luZm8gJlN0dWJzSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWluU3R1YnMsIHZvaWQgKkluaXRpYWxQdHJWYWwpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9yYworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19PUkNBQklTVVBQT1JUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9PcmNFcnJvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL09yY0Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzJmZjQxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9PcmNFcnJvci5oCkBAIC0wLDAgKzEsNzAgQEAKKy8vPT09LS0tLS0tIE9yY0Vycm9yLmggLSBSZWplY3Qgc3ltYm9sIGxvb2t1cCByZXF1ZXN0cyAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgIERlZmluZSBhbiBlcnJvciBjYXRlZ29yeSwgZXJyb3IgY29kZXMsIGFuZCBoZWxwZXIgdXRpbGl0aWVzIGZvciBPcmMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfT1JDRVJST1JfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfT1JDRVJST1JfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb3JjIHsKKworZW51bSBjbGFzcyBPcmNFcnJvckNvZGUgOiBpbnQgeworICAvLyBSUEMgRXJyb3JzCisgIER1cGxpY2F0ZURlZmluaXRpb24gPSAxLAorICBKSVRTeW1ib2xOb3RGb3VuZCwKKyAgUmVtb3RlQWxsb2NhdG9yRG9lc05vdEV4aXN0LAorICBSZW1vdGVBbGxvY2F0b3JJZEFscmVhZHlJblVzZSwKKyAgUmVtb3RlTVByb3RlY3RBZGRyVW5yZWNvZ25pemVkLAorICBSZW1vdGVJbmRpcmVjdFN0dWJzT3duZXJEb2VzTm90RXhpc3QsCisgIFJlbW90ZUluZGlyZWN0U3R1YnNPd25lcklkQWxyZWFkeUluVXNlLAorICBSUENDb25uZWN0aW9uQ2xvc2VkLAorICBSUENDb3VsZE5vdE5lZ290aWF0ZUZ1bmN0aW9uLAorICBSUENSZXNwb25zZUFiYW5kb25lZCwKKyAgVW5leHBlY3RlZFJQQ0NhbGwsCisgIFVuZXhwZWN0ZWRSUENSZXNwb25zZSwKKyAgVW5rbm93bkVycm9yQ29kZUZyb21SZW1vdGUsCisgIFVua25vd25SZXNvdXJjZUhhbmRsZQorfTsKKworc3RkOjplcnJvcl9jb2RlIG9yY0Vycm9yKE9yY0Vycm9yQ29kZSBFcnJDb2RlKTsKKworY2xhc3MgRHVwbGljYXRlRGVmaW5pdGlvbiA6IHB1YmxpYyBFcnJvckluZm88RHVwbGljYXRlRGVmaW5pdGlvbj4geworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBEdXBsaWNhdGVEZWZpbml0aW9uKHN0ZDo6c3RyaW5nIFN5bWJvbE5hbWUpOworICBzdGQ6OmVycm9yX2NvZGUgY29udmVydFRvRXJyb3JDb2RlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgbG9nKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGU7CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRTeW1ib2xOYW1lKCkgY29uc3Q7Citwcml2YXRlOgorICBzdGQ6OnN0cmluZyBTeW1ib2xOYW1lOworfTsKKworY2xhc3MgSklUU3ltYm9sTm90Rm91bmQgOiBwdWJsaWMgRXJyb3JJbmZvPEpJVFN5bWJvbE5vdEZvdW5kPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIEpJVFN5bWJvbE5vdEZvdW5kKHN0ZDo6c3RyaW5nIFN5bWJvbE5hbWUpOworICBzdGQ6OmVycm9yX2NvZGUgY29udmVydFRvRXJyb3JDb2RlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgbG9nKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGU7CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRTeW1ib2xOYW1lKCkgY29uc3Q7Citwcml2YXRlOgorICBzdGQ6OnN0cmluZyBTeW1ib2xOYW1lOworfTsKKworfSAvLyBFbmQgbmFtZXNwYWNlIG9yYy4KK30gLy8gRW5kIG5hbWVzcGFjZSBsbHZtLgorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX09SQ0VSUk9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9PcmNSZW1vdGVUYXJnZXRDbGllbnQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9PcmNSZW1vdGVUYXJnZXRDbGllbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MTc5ZTVmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL09yY1JlbW90ZVRhcmdldENsaWVudC5oCkBAIC0wLDAgKzEsNjcyIEBACisvLz09PS0gT3JjUmVtb3RlVGFyZ2V0Q2xpZW50LmggLSBPcmMgUmVtb3RlLXRhcmdldCBDbGllbnQgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBPcmNSZW1vdGVUYXJnZXRDbGllbnQgY2xhc3MgYW5kIGhlbHBlcnMuIFRoaXMgY2xhc3MKKy8vIGNhbiBiZSB1c2VkIHRvIGNvbW11bmljYXRlIG92ZXIgYW4gUmF3Qnl0ZUNoYW5uZWwgd2l0aCBhbgorLy8gT3JjUmVtb3RlVGFyZ2V0U2VydmVyIGluc3RhbmNlIHRvIHN1cHBvcnQgcmVtb3RlLUpJVGluZy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19PUkNSRU1PVEVUQVJHRVRDTElFTlRfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfT1JDUkVNT1RFVEFSR0VUQ0xJRU5UX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvSklUU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0luZGlyZWN0aW9uVXRpbHMuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvT3JjUmVtb3RlVGFyZ2V0UlBDQVBJLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvUnVudGltZUR5bGQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNkZWZpbmUgREVCVUdfVFlQRSAib3JjLXJlbW90ZSIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9yYyB7CituYW1lc3BhY2UgcmVtb3RlIHsKKworLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgdXRpbGl0aWVzIChpbmNsdWRpbmcgbWVtb3J5IG1hbmFnZXIsIGluZGlyZWN0IHN0dWJzCisvLy8gbWFuYWdlciwgYW5kIGNvbXBpbGUgY2FsbGJhY2sgbWFuYWdlciB0eXBlcykgdGhhdCBzdXBwb3J0IHJlbW90ZSBKSVRpbmcKKy8vLyBpbiBPUkMuCisvLy8KKy8vLyBFYWNoIG9mIHRoZSB1dGlsaXR5IGNsYXNzZXMgdGFsa3MgdG8gYSBKSVQgc2VydmVyIChhbiBpbnN0YW5jZSBvZiB0aGUKKy8vLyBPcmNSZW1vdGVUYXJnZXRTZXJ2ZXIgY2xhc3MpIHZpYSBhbiBSUEMgc3lzdGVtIChzZWUgUlBDVXRpbHMuaCkgdG8gY2Fycnkgb3V0CisvLy8gaXRzIGFjdGlvbnMuCitjbGFzcyBPcmNSZW1vdGVUYXJnZXRDbGllbnQKKyAgICA6IHB1YmxpYyBycGM6OlNpbmdsZVRocmVhZGVkUlBDRW5kcG9pbnQ8cnBjOjpSYXdCeXRlQ2hhbm5lbD4geworcHVibGljOgorICAvLy8gUmVtb3RlLW1hcHBlZCBSdW50aW1lRHlsZC1jb21wYXRpYmxlIG1lbW9yeSBtYW5hZ2VyLgorICBjbGFzcyBSZW1vdGVSVER5bGRNZW1vcnlNYW5hZ2VyIDogcHVibGljIFJ1bnRpbWVEeWxkOjpNZW1vcnlNYW5hZ2VyIHsKKyAgICBmcmllbmQgY2xhc3MgT3JjUmVtb3RlVGFyZ2V0Q2xpZW50OworCisgIHB1YmxpYzoKKyAgICB+UmVtb3RlUlREeWxkTWVtb3J5TWFuYWdlcigpIHsKKyAgICAgIENsaWVudC5kZXN0cm95UmVtb3RlQWxsb2NhdG9yKElkKTsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiRGVzdHJveWVkIHJlbW90ZSBhbGxvY2F0b3IgIiA8PCBJZCA8PCAiXG4iKTsKKyAgICB9CisKKyAgICBSZW1vdGVSVER5bGRNZW1vcnlNYW5hZ2VyKGNvbnN0IFJlbW90ZVJURHlsZE1lbW9yeU1hbmFnZXIgJikgPSBkZWxldGU7CisgICAgUmVtb3RlUlREeWxkTWVtb3J5TWFuYWdlciAmCisgICAgb3BlcmF0b3I9KGNvbnN0IFJlbW90ZVJURHlsZE1lbW9yeU1hbmFnZXIgJikgPSBkZWxldGU7CisgICAgUmVtb3RlUlREeWxkTWVtb3J5TWFuYWdlcihSZW1vdGVSVER5bGRNZW1vcnlNYW5hZ2VyICYmKSA9IGRlZmF1bHQ7CisgICAgUmVtb3RlUlREeWxkTWVtb3J5TWFuYWdlciAmCisgICAgb3BlcmF0b3I9KFJlbW90ZVJURHlsZE1lbW9yeU1hbmFnZXIgJiYpID0gZGVmYXVsdDsKKworICAgIHVpbnQ4X3QgKmFsbG9jYXRlQ29kZVNlY3Rpb24odWludHB0cl90IFNpemUsIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNlY3Rpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTZWN0aW9uTmFtZSkgb3ZlcnJpZGUgeworICAgICAgVW5tYXBwZWQuYmFjaygpLkNvZGVBbGxvY3MuZW1wbGFjZV9iYWNrKFNpemUsIEFsaWdubWVudCk7CisgICAgICB1aW50OF90ICpBbGxvYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPigKKyAgICAgICAgICBVbm1hcHBlZC5iYWNrKCkuQ29kZUFsbG9jcy5iYWNrKCkuZ2V0TG9jYWxBZGRyZXNzKCkpOworICAgICAgREVCVUcoZGJncygpIDw8ICJBbGxvY2F0b3IgIiA8PCBJZCA8PCAiIGFsbG9jYXRlZCBjb2RlIGZvciAiCisgICAgICAgICAgICAgICAgICAgPDwgU2VjdGlvbk5hbWUgPDwgIjogIiA8PCBBbGxvYyA8PCAiICgiIDw8IFNpemUKKyAgICAgICAgICAgICAgICAgICA8PCAiIGJ5dGVzLCBhbGlnbm1lbnQgIiA8PCBBbGlnbm1lbnQgPDwgIilcbiIpOworICAgICAgcmV0dXJuIEFsbG9jOworICAgIH0KKworICAgIHVpbnQ4X3QgKmFsbG9jYXRlRGF0YVNlY3Rpb24odWludHB0cl90IFNpemUsIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNlY3Rpb25JRCwgU3RyaW5nUmVmIFNlY3Rpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1JlYWRPbmx5KSBvdmVycmlkZSB7CisgICAgICBpZiAoSXNSZWFkT25seSkgeworICAgICAgICBVbm1hcHBlZC5iYWNrKCkuUk9EYXRhQWxsb2NzLmVtcGxhY2VfYmFjayhTaXplLCBBbGlnbm1lbnQpOworICAgICAgICB1aW50OF90ICpBbGxvYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPigKKyAgICAgICAgICAgIFVubWFwcGVkLmJhY2soKS5ST0RhdGFBbGxvY3MuYmFjaygpLmdldExvY2FsQWRkcmVzcygpKTsKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICJBbGxvY2F0b3IgIiA8PCBJZCA8PCAiIGFsbG9jYXRlZCByby1kYXRhIGZvciAiCisgICAgICAgICAgICAgICAgICAgICA8PCBTZWN0aW9uTmFtZSA8PCAiOiAiIDw8IEFsbG9jIDw8ICIgKCIgPDwgU2l6ZQorICAgICAgICAgICAgICAgICAgICAgPDwgIiBieXRlcywgYWxpZ25tZW50ICIgPDwgQWxpZ25tZW50IDw8ICIpXG4iKTsKKyAgICAgICAgcmV0dXJuIEFsbG9jOworICAgICAgfSAvLyBlbHNlLi4uCisKKyAgICAgIFVubWFwcGVkLmJhY2soKS5SV0RhdGFBbGxvY3MuZW1wbGFjZV9iYWNrKFNpemUsIEFsaWdubWVudCk7CisgICAgICB1aW50OF90ICpBbGxvYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPigKKyAgICAgICAgICBVbm1hcHBlZC5iYWNrKCkuUldEYXRhQWxsb2NzLmJhY2soKS5nZXRMb2NhbEFkZHJlc3MoKSk7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIkFsbG9jYXRvciAiIDw8IElkIDw8ICIgYWxsb2NhdGVkIHJ3LWRhdGEgZm9yICIKKyAgICAgICAgICAgICAgICAgICA8PCBTZWN0aW9uTmFtZSA8PCAiOiAiIDw8IEFsbG9jIDw8ICIgKCIgPDwgU2l6ZQorICAgICAgICAgICAgICAgICAgIDw8ICIgYnl0ZXMsIGFsaWdubWVudCAiIDw8IEFsaWdubWVudCA8PCAiKVxuIik7CisgICAgICByZXR1cm4gQWxsb2M7CisgICAgfQorCisgICAgdm9pZCByZXNlcnZlQWxsb2NhdGlvblNwYWNlKHVpbnRwdHJfdCBDb2RlU2l6ZSwgdWludDMyX3QgQ29kZUFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgUk9EYXRhU2l6ZSwgdWludDMyX3QgUk9EYXRhQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBSV0RhdGFTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSV0RhdGFBbGlnbikgb3ZlcnJpZGUgeworICAgICAgVW5tYXBwZWQucHVzaF9iYWNrKE9iamVjdEFsbG9jcygpKTsKKworICAgICAgREVCVUcoZGJncygpIDw8ICJBbGxvY2F0b3IgIiA8PCBJZCA8PCAiIHJlc2VydmVkOlxuIik7CisKKyAgICAgIGlmIChDb2RlU2l6ZSAhPSAwKSB7CisgICAgICAgIFVubWFwcGVkLmJhY2soKS5SZW1vdGVDb2RlQWRkciA9CisgICAgICAgICAgICBDbGllbnQucmVzZXJ2ZU1lbShJZCwgQ29kZVNpemUsIENvZGVBbGlnbik7CisKKyAgICAgICAgREVCVUcoZGJncygpIDw8ICIgIGNvZGU6ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IGZvcm1hdCgiMHglMDE2eCIsIFVubWFwcGVkLmJhY2soKS5SZW1vdGVDb2RlQWRkcikKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgKCIgPDwgQ29kZVNpemUgPDwgIiBieXRlcywgYWxpZ25tZW50ICIgPDwgQ29kZUFsaWduCisgICAgICAgICAgICAgICAgICAgICA8PCAiKVxuIik7CisgICAgICB9CisKKyAgICAgIGlmIChST0RhdGFTaXplICE9IDApIHsKKyAgICAgICAgVW5tYXBwZWQuYmFjaygpLlJlbW90ZVJPRGF0YUFkZHIgPQorICAgICAgICAgICAgQ2xpZW50LnJlc2VydmVNZW0oSWQsIFJPRGF0YVNpemUsIFJPRGF0YUFsaWduKTsKKworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIiAgcm8tZGF0YTogIgorICAgICAgICAgICAgICAgICAgICAgPDwgZm9ybWF0KCIweCUwMTZ4IiwgVW5tYXBwZWQuYmFjaygpLlJlbW90ZVJPRGF0YUFkZHIpCisgICAgICAgICAgICAgICAgICAgICA8PCAiICgiIDw8IFJPRGF0YVNpemUgPDwgIiBieXRlcywgYWxpZ25tZW50ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IFJPRGF0YUFsaWduIDw8ICIpXG4iKTsKKyAgICAgIH0KKworICAgICAgaWYgKFJXRGF0YVNpemUgIT0gMCkgeworICAgICAgICBVbm1hcHBlZC5iYWNrKCkuUmVtb3RlUldEYXRhQWRkciA9CisgICAgICAgICAgICBDbGllbnQucmVzZXJ2ZU1lbShJZCwgUldEYXRhU2l6ZSwgUldEYXRhQWxpZ24pOworCisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiICBydy1kYXRhOiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBmb3JtYXQoIjB4JTAxNngiLCBVbm1hcHBlZC5iYWNrKCkuUmVtb3RlUldEYXRhQWRkcikKKyAgICAgICAgICAgICAgICAgICAgIDw8ICIgKCIgPDwgUldEYXRhU2l6ZSA8PCAiIGJ5dGVzLCBhbGlnbm1lbnQgIgorICAgICAgICAgICAgICAgICAgICAgPDwgUldEYXRhQWxpZ24gPDwgIilcbiIpOworICAgICAgfQorICAgIH0KKworICAgIGJvb2wgbmVlZHNUb1Jlc2VydmVBbGxvY2F0aW9uU3BhY2UoKSBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisKKyAgICB2b2lkIHJlZ2lzdGVyRUhGcmFtZXModWludDhfdCAqQWRkciwgdWludDY0X3QgTG9hZEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBTaXplKSBvdmVycmlkZSB7CisgICAgICBVbmZpbmFsaXplZEVIRnJhbWVzLnB1c2hfYmFjayh7TG9hZEFkZHIsIFNpemV9KTsKKyAgICB9CisKKyAgICB2b2lkIGRlcmVnaXN0ZXJFSEZyYW1lcygpIG92ZXJyaWRlIHsKKyAgICAgIGZvciAoYXV0byAmRnJhbWUgOiBSZWdpc3RlcmVkRUhGcmFtZXMpIHsKKyAgICAgICAgLy8gRklYTUU6IEFkZCBlcnJvciBwb2xsLgorICAgICAgICBDbGllbnQuZGVyZWdpc3RlckVIRnJhbWVzKEZyYW1lLkFkZHIsIEZyYW1lLlNpemUpOworICAgICAgfQorICAgIH0KKworICAgIHZvaWQgbm90aWZ5T2JqZWN0TG9hZGVkKFJ1bnRpbWVEeWxkICZEeWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9iamVjdDo6T2JqZWN0RmlsZSAmT2JqKSBvdmVycmlkZSB7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIkFsbG9jYXRvciAiIDw8IElkIDw8ICIgYXBwbGllZCBtYXBwaW5nczpcbiIpOworICAgICAgZm9yIChhdXRvICZPYmpBbGxvY3MgOiBVbm1hcHBlZCkgeworICAgICAgICBtYXBBbGxvY3NUb1JlbW90ZUFkZHJzKER5bGQsIE9iakFsbG9jcy5Db2RlQWxsb2NzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9iakFsbG9jcy5SZW1vdGVDb2RlQWRkcik7CisgICAgICAgIG1hcEFsbG9jc1RvUmVtb3RlQWRkcnMoRHlsZCwgT2JqQWxsb2NzLlJPRGF0YUFsbG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpBbGxvY3MuUmVtb3RlUk9EYXRhQWRkcik7CisgICAgICAgIG1hcEFsbG9jc1RvUmVtb3RlQWRkcnMoRHlsZCwgT2JqQWxsb2NzLlJXRGF0YUFsbG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmpBbGxvY3MuUmVtb3RlUldEYXRhQWRkcik7CisgICAgICAgIFVuZmluYWxpemVkLnB1c2hfYmFjayhzdGQ6Om1vdmUoT2JqQWxsb2NzKSk7CisgICAgICB9CisgICAgICBVbm1hcHBlZC5jbGVhcigpOworICAgIH0KKworICAgIGJvb2wgZmluYWxpemVNZW1vcnkoc3RkOjpzdHJpbmcgKkVyck1zZyA9IG51bGxwdHIpIG92ZXJyaWRlIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiQWxsb2NhdG9yICIgPDwgSWQgPDwgIiBmaW5hbGl6aW5nOlxuIik7CisKKyAgICAgIGZvciAoYXV0byAmT2JqQWxsb2NzIDogVW5maW5hbGl6ZWQpIHsKKyAgICAgICAgaWYgKGNvcHlBbmRQcm90ZWN0KE9iakFsbG9jcy5Db2RlQWxsb2NzLCBPYmpBbGxvY3MuUmVtb3RlQ29kZUFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXM6Ok1lbW9yeTo6TUZfUkVBRCB8IHN5czo6TWVtb3J5OjpNRl9FWEVDKSkKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgICBpZiAoY29weUFuZFByb3RlY3QoT2JqQWxsb2NzLlJPRGF0YUFsbG9jcywgT2JqQWxsb2NzLlJlbW90ZVJPRGF0YUFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXM6Ok1lbW9yeTo6TUZfUkVBRCkpCisgICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgICAgaWYgKGNvcHlBbmRQcm90ZWN0KE9iakFsbG9jcy5SV0RhdGFBbGxvY3MsIE9iakFsbG9jcy5SZW1vdGVSV0RhdGFBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzOjpNZW1vcnk6Ok1GX1JFQUQgfCBzeXM6Ok1lbW9yeTo6TUZfV1JJVEUpKQorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgVW5maW5hbGl6ZWQuY2xlYXIoKTsKKworICAgICAgZm9yIChhdXRvICZFSEZyYW1lIDogVW5maW5hbGl6ZWRFSEZyYW1lcykgeworICAgICAgICBpZiAoYXV0byBFcnIgPSBDbGllbnQucmVnaXN0ZXJFSEZyYW1lcyhFSEZyYW1lLkFkZHIsIEVIRnJhbWUuU2l6ZSkpIHsKKyAgICAgICAgICAvLyBGSVhNRTogUmVwbGFjZSB0aGlzIG9uY2UgZmluYWxpemVNZW1vcnkgY2FuIHJldHVybiBhbiBFcnJvci4KKyAgICAgICAgICBoYW5kbGVBbGxFcnJvcnMoc3RkOjptb3ZlKEVyciksIFsmXShFcnJvckluZm9CYXNlICZFSUIpIHsKKyAgICAgICAgICAgIGlmIChFcnJNc2cpIHsKKyAgICAgICAgICAgICAgcmF3X3N0cmluZ19vc3RyZWFtIEVyck91dCgqRXJyTXNnKTsKKyAgICAgICAgICAgICAgRUlCLmxvZyhFcnJPdXQpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0pOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgUmVnaXN0ZXJlZEVIRnJhbWVzID0gc3RkOjptb3ZlKFVuZmluYWxpemVkRUhGcmFtZXMpOworICAgICAgVW5maW5hbGl6ZWRFSEZyYW1lcyA9IHt9OworCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgY2xhc3MgQWxsb2MgeworICAgIHB1YmxpYzoKKyAgICAgIEFsbG9jKHVpbnQ2NF90IFNpemUsIHVuc2lnbmVkIEFsaWduKQorICAgICAgICAgIDogU2l6ZShTaXplKSwgQWxpZ24oQWxpZ24pLCBDb250ZW50cyhuZXcgY2hhcltTaXplICsgQWxpZ24gLSAxXSkge30KKworICAgICAgQWxsb2MoY29uc3QgQWxsb2MgJikgPSBkZWxldGU7CisgICAgICBBbGxvYyAmb3BlcmF0b3I9KGNvbnN0IEFsbG9jICYpID0gZGVsZXRlOworICAgICAgQWxsb2MoQWxsb2MgJiYpID0gZGVmYXVsdDsKKyAgICAgIEFsbG9jICZvcGVyYXRvcj0oQWxsb2MgJiYpID0gZGVmYXVsdDsKKworICAgICAgdWludDY0X3QgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KKworICAgICAgdW5zaWduZWQgZ2V0QWxpZ24oKSBjb25zdCB7IHJldHVybiBBbGlnbjsgfQorCisgICAgICBjaGFyICpnZXRMb2NhbEFkZHJlc3MoKSBjb25zdCB7CisgICAgICAgIHVpbnRwdHJfdCBMb2NhbEFkZHIgPSByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oQ29udGVudHMuZ2V0KCkpOworICAgICAgICBMb2NhbEFkZHIgPSBhbGlnblRvKExvY2FsQWRkciwgQWxpZ24pOworICAgICAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjaGFyICo+KExvY2FsQWRkcik7CisgICAgICB9CisKKyAgICAgIHZvaWQgc2V0UmVtb3RlQWRkcmVzcyhKSVRUYXJnZXRBZGRyZXNzIFJlbW90ZUFkZHIpIHsKKyAgICAgICAgdGhpcy0+UmVtb3RlQWRkciA9IFJlbW90ZUFkZHI7CisgICAgICB9CisKKyAgICAgIEpJVFRhcmdldEFkZHJlc3MgZ2V0UmVtb3RlQWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIFJlbW90ZUFkZHI7IH0KKworICAgIHByaXZhdGU6CisgICAgICB1aW50NjRfdCBTaXplOworICAgICAgdW5zaWduZWQgQWxpZ247CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Y2hhcltdPiBDb250ZW50czsKKyAgICAgIEpJVFRhcmdldEFkZHJlc3MgUmVtb3RlQWRkciA9IDA7CisgICAgfTsKKworICAgIHN0cnVjdCBPYmplY3RBbGxvY3MgeworICAgICAgT2JqZWN0QWxsb2NzKCkgPSBkZWZhdWx0OworICAgICAgT2JqZWN0QWxsb2NzKGNvbnN0IE9iamVjdEFsbG9jcyAmKSA9IGRlbGV0ZTsKKyAgICAgIE9iamVjdEFsbG9jcyAmb3BlcmF0b3I9KGNvbnN0IE9iamVjdEFsbG9jcyAmKSA9IGRlbGV0ZTsKKyAgICAgIE9iamVjdEFsbG9jcyhPYmplY3RBbGxvY3MgJiYpID0gZGVmYXVsdDsKKyAgICAgIE9iamVjdEFsbG9jcyAmb3BlcmF0b3I9KE9iamVjdEFsbG9jcyAmJikgPSBkZWZhdWx0OworCisgICAgICBKSVRUYXJnZXRBZGRyZXNzIFJlbW90ZUNvZGVBZGRyID0gMDsKKyAgICAgIEpJVFRhcmdldEFkZHJlc3MgUmVtb3RlUk9EYXRhQWRkciA9IDA7CisgICAgICBKSVRUYXJnZXRBZGRyZXNzIFJlbW90ZVJXRGF0YUFkZHIgPSAwOworICAgICAgc3RkOjp2ZWN0b3I8QWxsb2M+IENvZGVBbGxvY3MsIFJPRGF0YUFsbG9jcywgUldEYXRhQWxsb2NzOworICAgIH07CisKKyAgICBSZW1vdGVSVER5bGRNZW1vcnlNYW5hZ2VyKE9yY1JlbW90ZVRhcmdldENsaWVudCAmQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VJZE1ncjo6UmVzb3VyY2VJZCBJZCkKKyAgICAgICAgOiBDbGllbnQoQ2xpZW50KSwgSWQoSWQpIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiQ3JlYXRlZCByZW1vdGUgYWxsb2NhdG9yICIgPDwgSWQgPDwgIlxuIik7CisgICAgfQorCisgICAgLy8gTWFwcyBhbGwgYWxsb2NhdGlvbnMgaW4gQWxsb2NzIHRvIGFsaWduZWQgYmxvY2tzCisgICAgdm9pZCBtYXBBbGxvY3NUb1JlbW90ZUFkZHJzKFJ1bnRpbWVEeWxkICZEeWxkLCBzdGQ6OnZlY3RvcjxBbGxvYz4gJkFsbG9jcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUVGFyZ2V0QWRkcmVzcyBOZXh0QWRkcikgeworICAgICAgZm9yIChhdXRvICZBbGxvYyA6IEFsbG9jcykgeworICAgICAgICBOZXh0QWRkciA9IGFsaWduVG8oTmV4dEFkZHIsIEFsbG9jLmdldEFsaWduKCkpOworICAgICAgICBEeWxkLm1hcFNlY3Rpb25BZGRyZXNzKEFsbG9jLmdldExvY2FsQWRkcmVzcygpLCBOZXh0QWRkcik7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiICAgICAiIDw8IHN0YXRpY19jYXN0PHZvaWQgKj4oQWxsb2MuZ2V0TG9jYWxBZGRyZXNzKCkpCisgICAgICAgICAgICAgICAgICAgICA8PCAiIC0+ICIgPDwgZm9ybWF0KCIweCUwMTZ4IiwgTmV4dEFkZHIpIDw8ICJcbiIpOworICAgICAgICBBbGxvYy5zZXRSZW1vdGVBZGRyZXNzKE5leHRBZGRyKTsKKworICAgICAgICAvLyBPbmx5IGFkdmFuY2UgTmV4dEFkZHIgaWYgaXQgd2FzIG5vbi1udWxsIHRvIGJlZ2luIHdpdGgsCisgICAgICAgIC8vIG90aGVyd2lzZSBsZWF2ZSBpdCBhcyBudWxsLgorICAgICAgICBpZiAoTmV4dEFkZHIpCisgICAgICAgICAgTmV4dEFkZHIgKz0gQWxsb2MuZ2V0U2l6ZSgpOworICAgICAgfQorICAgIH0KKworICAgIC8vIENvcGllcyBkYXRhIGZvciBlYWNoIGFsbG9jIGluIHRoZSBsaXN0LCB0aGVuIHNldCBwZXJtaXNzaW9ucyBvbiB0aGUKKyAgICAvLyBzZWdtZW50LgorICAgIGJvb2wgY29weUFuZFByb3RlY3QoY29uc3Qgc3RkOjp2ZWN0b3I8QWxsb2M+ICZBbGxvY3MsCisgICAgICAgICAgICAgICAgICAgICAgICBKSVRUYXJnZXRBZGRyZXNzIFJlbW90ZVNlZ21lbnRBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUGVybWlzc2lvbnMpIHsKKyAgICAgIGlmIChSZW1vdGVTZWdtZW50QWRkcikgeworICAgICAgICBhc3NlcnQoIUFsbG9jcy5lbXB0eSgpICYmICJObyBzZWN0aW9ucyBpbiBhbGxvY2F0ZWQgc2VnbWVudCIpOworCisgICAgICAgIGZvciAoYXV0byAmQWxsb2MgOiBBbGxvY3MpIHsKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIiAgY29weWluZyBzZWN0aW9uOiAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IHN0YXRpY19jYXN0PHZvaWQgKj4oQWxsb2MuZ2V0TG9jYWxBZGRyZXNzKCkpIDw8ICIgLT4gIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBmb3JtYXQoIjB4JTAxNngiLCBBbGxvYy5nZXRSZW1vdGVBZGRyZXNzKCkpIDw8ICIgKCIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgQWxsb2MuZ2V0U2l6ZSgpIDw8ICIgYnl0ZXMpXG4iOyk7CisKKyAgICAgICAgICBpZiAoQ2xpZW50LndyaXRlTWVtKEFsbG9jLmdldFJlbW90ZUFkZHJlc3MoKSwgQWxsb2MuZ2V0TG9jYWxBZGRyZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvYy5nZXRTaXplKCkpKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIiAgc2V0dGluZyAiCisgICAgICAgICAgICAgICAgICAgICA8PCAoUGVybWlzc2lvbnMgJiBzeXM6Ok1lbW9yeTo6TUZfUkVBRCA/ICdSJyA6ICctJykKKyAgICAgICAgICAgICAgICAgICAgIDw8IChQZXJtaXNzaW9ucyAmIHN5czo6TWVtb3J5OjpNRl9XUklURSA/ICdXJyA6ICctJykKKyAgICAgICAgICAgICAgICAgICAgIDw8IChQZXJtaXNzaW9ucyAmIHN5czo6TWVtb3J5OjpNRl9FWEVDID8gJ1gnIDogJy0nKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiBwZXJtaXNzaW9ucyBvbiBibG9jazogIgorICAgICAgICAgICAgICAgICAgICAgPDwgZm9ybWF0KCIweCUwMTZ4IiwgUmVtb3RlU2VnbWVudEFkZHIpIDw8ICJcbiIpOworICAgICAgICBpZiAoQ2xpZW50LnNldFByb3RlY3Rpb25zKElkLCBSZW1vdGVTZWdtZW50QWRkciwgUGVybWlzc2lvbnMpKQorICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIE9yY1JlbW90ZVRhcmdldENsaWVudCAmQ2xpZW50OworICAgIFJlc291cmNlSWRNZ3I6OlJlc291cmNlSWQgSWQ7CisgICAgc3RkOjp2ZWN0b3I8T2JqZWN0QWxsb2NzPiBVbm1hcHBlZDsKKyAgICBzdGQ6OnZlY3RvcjxPYmplY3RBbGxvY3M+IFVuZmluYWxpemVkOworCisgICAgc3RydWN0IEVIRnJhbWUgeworICAgICAgSklUVGFyZ2V0QWRkcmVzcyBBZGRyOworICAgICAgdWludDY0X3QgU2l6ZTsKKyAgICB9OworICAgIHN0ZDo6dmVjdG9yPEVIRnJhbWU+IFVuZmluYWxpemVkRUhGcmFtZXM7CisgICAgc3RkOjp2ZWN0b3I8RUhGcmFtZT4gUmVnaXN0ZXJlZEVIRnJhbWVzOworICB9OworCisgIC8vLyBSZW1vdGUgaW5kaXJlY3Qgc3R1YnMgbWFuYWdlci4KKyAgY2xhc3MgUmVtb3RlSW5kaXJlY3RTdHVic01hbmFnZXIgOiBwdWJsaWMgSW5kaXJlY3RTdHVic01hbmFnZXIgeworICBwdWJsaWM6CisgICAgUmVtb3RlSW5kaXJlY3RTdHVic01hbmFnZXIoT3JjUmVtb3RlVGFyZ2V0Q2xpZW50ICZDbGllbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb3VyY2VJZE1ncjo6UmVzb3VyY2VJZCBJZCkKKyAgICAgICAgOiBDbGllbnQoQ2xpZW50KSwgSWQoSWQpIHt9CisKKyAgICB+UmVtb3RlSW5kaXJlY3RTdHVic01hbmFnZXIoKSBvdmVycmlkZSB7CisgICAgICBDbGllbnQuZGVzdHJveUluZGlyZWN0U3R1YnNNYW5hZ2VyKElkKTsKKyAgICB9CisKKyAgICBFcnJvciBjcmVhdGVTdHViKFN0cmluZ1JlZiBTdHViTmFtZSwgSklUVGFyZ2V0QWRkcmVzcyBTdHViQWRkciwKKyAgICAgICAgICAgICAgICAgICAgIEpJVFN5bWJvbEZsYWdzIFN0dWJGbGFncykgb3ZlcnJpZGUgeworICAgICAgaWYgKGF1dG8gRXJyID0gcmVzZXJ2ZVN0dWJzKDEpKQorICAgICAgICByZXR1cm4gRXJyOworCisgICAgICByZXR1cm4gY3JlYXRlU3R1YkludGVybmFsKFN0dWJOYW1lLCBTdHViQWRkciwgU3R1YkZsYWdzKTsKKyAgICB9CisKKyAgICBFcnJvciBjcmVhdGVTdHVicyhjb25zdCBTdHViSW5pdHNNYXAgJlN0dWJJbml0cykgb3ZlcnJpZGUgeworICAgICAgaWYgKGF1dG8gRXJyID0gcmVzZXJ2ZVN0dWJzKFN0dWJJbml0cy5zaXplKCkpKQorICAgICAgICByZXR1cm4gRXJyOworCisgICAgICBmb3IgKGF1dG8gJkVudHJ5IDogU3R1YkluaXRzKQorICAgICAgICBpZiAoYXV0byBFcnIgPSBjcmVhdGVTdHViSW50ZXJuYWwoRW50cnkuZmlyc3QoKSwgRW50cnkuc2Vjb25kLmZpcnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW50cnkuc2Vjb25kLnNlY29uZCkpCisgICAgICAgICAgcmV0dXJuIEVycjsKKworICAgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgICAgfQorCisgICAgSklUU3ltYm9sIGZpbmRTdHViKFN0cmluZ1JlZiBOYW1lLCBib29sIEV4cG9ydGVkU3R1YnNPbmx5KSBvdmVycmlkZSB7CisgICAgICBhdXRvIEkgPSBTdHViSW5kZXhlcy5maW5kKE5hbWUpOworICAgICAgaWYgKEkgPT0gU3R1YkluZGV4ZXMuZW5kKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgYXV0byBLZXkgPSBJLT5zZWNvbmQuZmlyc3Q7CisgICAgICBhdXRvIEZsYWdzID0gSS0+c2Vjb25kLnNlY29uZDsKKyAgICAgIGF1dG8gU3R1YlN5bWJvbCA9IEpJVFN5bWJvbChnZXRTdHViQWRkcihLZXkpLCBGbGFncyk7CisgICAgICBpZiAoRXhwb3J0ZWRTdHVic09ubHkgJiYgIVN0dWJTeW1ib2wuZ2V0RmxhZ3MoKS5pc0V4cG9ydGVkKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgcmV0dXJuIFN0dWJTeW1ib2w7CisgICAgfQorCisgICAgSklUU3ltYm9sIGZpbmRQb2ludGVyKFN0cmluZ1JlZiBOYW1lKSBvdmVycmlkZSB7CisgICAgICBhdXRvIEkgPSBTdHViSW5kZXhlcy5maW5kKE5hbWUpOworICAgICAgaWYgKEkgPT0gU3R1YkluZGV4ZXMuZW5kKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgYXV0byBLZXkgPSBJLT5zZWNvbmQuZmlyc3Q7CisgICAgICBhdXRvIEZsYWdzID0gSS0+c2Vjb25kLnNlY29uZDsKKyAgICAgIHJldHVybiBKSVRTeW1ib2woZ2V0UHRyQWRkcihLZXkpLCBGbGFncyk7CisgICAgfQorCisgICAgRXJyb3IgdXBkYXRlUG9pbnRlcihTdHJpbmdSZWYgTmFtZSwgSklUVGFyZ2V0QWRkcmVzcyBOZXdBZGRyKSBvdmVycmlkZSB7CisgICAgICBhdXRvIEkgPSBTdHViSW5kZXhlcy5maW5kKE5hbWUpOworICAgICAgYXNzZXJ0KEkgIT0gU3R1YkluZGV4ZXMuZW5kKCkgJiYgIk5vIHN0dWIgcG9pbnRlciBmb3Igc3ltYm9sIik7CisgICAgICBhdXRvIEtleSA9IEktPnNlY29uZC5maXJzdDsKKyAgICAgIHJldHVybiBDbGllbnQud3JpdGVQb2ludGVyKGdldFB0ckFkZHIoS2V5KSwgTmV3QWRkcik7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3RydWN0IFJlbW90ZUluZGlyZWN0U3R1YnNJbmZvIHsKKyAgICAgIEpJVFRhcmdldEFkZHJlc3MgU3R1YkJhc2U7CisgICAgICBKSVRUYXJnZXRBZGRyZXNzIFB0ckJhc2U7CisgICAgICB1bnNpZ25lZCBOdW1TdHViczsKKyAgICB9OworCisgICAgdXNpbmcgU3R1YktleSA9IHN0ZDo6cGFpcjx1aW50MTZfdCwgdWludDE2X3Q+OworCisgICAgRXJyb3IgcmVzZXJ2ZVN0dWJzKHVuc2lnbmVkIE51bVN0dWJzKSB7CisgICAgICBpZiAoTnVtU3R1YnMgPD0gRnJlZVN0dWJzLnNpemUoKSkKKyAgICAgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisKKyAgICAgIHVuc2lnbmVkIE5ld1N0dWJzUmVxdWlyZWQgPSBOdW1TdHVicyAtIEZyZWVTdHVicy5zaXplKCk7CisgICAgICBKSVRUYXJnZXRBZGRyZXNzIFN0dWJCYXNlOworICAgICAgSklUVGFyZ2V0QWRkcmVzcyBQdHJCYXNlOworICAgICAgdW5zaWduZWQgTnVtU3R1YnNFbWl0dGVkOworCisgICAgICBpZiAoYXV0byBTdHViSW5mb09yRXJyID0gQ2xpZW50LmVtaXRJbmRpcmVjdFN0dWJzKElkLCBOZXdTdHVic1JlcXVpcmVkKSkKKyAgICAgICAgc3RkOjp0aWUoU3R1YkJhc2UsIFB0ckJhc2UsIE51bVN0dWJzRW1pdHRlZCkgPSAqU3R1YkluZm9PckVycjsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIFN0dWJJbmZvT3JFcnIudGFrZUVycm9yKCk7CisKKyAgICAgIHVuc2lnbmVkIE5ld0Jsb2NrSWQgPSBSZW1vdGVJbmRpcmVjdFN0dWJzSW5mb3Muc2l6ZSgpOworICAgICAgUmVtb3RlSW5kaXJlY3RTdHVic0luZm9zLnB1c2hfYmFjayh7U3R1YkJhc2UsIFB0ckJhc2UsIE51bVN0dWJzRW1pdHRlZH0pOworCisgICAgICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJIDwgTnVtU3R1YnNFbWl0dGVkOyArK0kpCisgICAgICAgIEZyZWVTdHVicy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoTmV3QmxvY2tJZCwgSSkpOworCisgICAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICB9CisKKyAgICBFcnJvciBjcmVhdGVTdHViSW50ZXJuYWwoU3RyaW5nUmVmIFN0dWJOYW1lLCBKSVRUYXJnZXRBZGRyZXNzIEluaXRBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVRTeW1ib2xGbGFncyBTdHViRmxhZ3MpIHsKKyAgICAgIGF1dG8gS2V5ID0gRnJlZVN0dWJzLmJhY2soKTsKKyAgICAgIEZyZWVTdHVicy5wb3BfYmFjaygpOworICAgICAgU3R1YkluZGV4ZXNbU3R1Yk5hbWVdID0gc3RkOjptYWtlX3BhaXIoS2V5LCBTdHViRmxhZ3MpOworICAgICAgcmV0dXJuIENsaWVudC53cml0ZVBvaW50ZXIoZ2V0UHRyQWRkcihLZXkpLCBJbml0QWRkcik7CisgICAgfQorCisgICAgSklUVGFyZ2V0QWRkcmVzcyBnZXRTdHViQWRkcihTdHViS2V5IEspIHsKKyAgICAgIGFzc2VydChSZW1vdGVJbmRpcmVjdFN0dWJzSW5mb3NbSy5maXJzdF0uU3R1YkJhc2UgIT0gMCAmJgorICAgICAgICAgICAgICJNaXNzaW5nIHN0dWIgYWRkcmVzcyIpOworICAgICAgcmV0dXJuIFJlbW90ZUluZGlyZWN0U3R1YnNJbmZvc1tLLmZpcnN0XS5TdHViQmFzZSArCisgICAgICAgICAgICAgSy5zZWNvbmQgKiBDbGllbnQuZ2V0SW5kaXJlY3RTdHViU2l6ZSgpOworICAgIH0KKworICAgIEpJVFRhcmdldEFkZHJlc3MgZ2V0UHRyQWRkcihTdHViS2V5IEspIHsKKyAgICAgIGFzc2VydChSZW1vdGVJbmRpcmVjdFN0dWJzSW5mb3NbSy5maXJzdF0uUHRyQmFzZSAhPSAwICYmCisgICAgICAgICAgICAgIk1pc3NpbmcgcG9pbnRlciBhZGRyZXNzIik7CisgICAgICByZXR1cm4gUmVtb3RlSW5kaXJlY3RTdHVic0luZm9zW0suZmlyc3RdLlB0ckJhc2UgKworICAgICAgICAgICAgIEsuc2Vjb25kICogQ2xpZW50LmdldFBvaW50ZXJTaXplKCk7CisgICAgfQorCisgICAgT3JjUmVtb3RlVGFyZ2V0Q2xpZW50ICZDbGllbnQ7CisgICAgUmVzb3VyY2VJZE1ncjo6UmVzb3VyY2VJZCBJZDsKKyAgICBzdGQ6OnZlY3RvcjxSZW1vdGVJbmRpcmVjdFN0dWJzSW5mbz4gUmVtb3RlSW5kaXJlY3RTdHVic0luZm9zOworICAgIHN0ZDo6dmVjdG9yPFN0dWJLZXk+IEZyZWVTdHViczsKKyAgICBTdHJpbmdNYXA8c3RkOjpwYWlyPFN0dWJLZXksIEpJVFN5bWJvbEZsYWdzPj4gU3R1YkluZGV4ZXM7CisgIH07CisKKyAgLy8vIFJlbW90ZSBjb21waWxlIGNhbGxiYWNrIG1hbmFnZXIuCisgIGNsYXNzIFJlbW90ZUNvbXBpbGVDYWxsYmFja01hbmFnZXIgOiBwdWJsaWMgSklUQ29tcGlsZUNhbGxiYWNrTWFuYWdlciB7CisgIHB1YmxpYzoKKyAgICBSZW1vdGVDb21waWxlQ2FsbGJhY2tNYW5hZ2VyKE9yY1JlbW90ZVRhcmdldENsaWVudCAmQ2xpZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUVGFyZ2V0QWRkcmVzcyBFcnJvckhhbmRsZXJBZGRyZXNzKQorICAgICAgICA6IEpJVENvbXBpbGVDYWxsYmFja01hbmFnZXIoRXJyb3JIYW5kbGVyQWRkcmVzcyksIENsaWVudChDbGllbnQpIHt9CisKKyAgcHJpdmF0ZToKKyAgICBFcnJvciBncm93KCkgb3ZlcnJpZGUgeworICAgICAgSklUVGFyZ2V0QWRkcmVzcyBCbG9ja0FkZHIgPSAwOworICAgICAgdWludDMyX3QgTnVtVHJhbXBvbGluZXMgPSAwOworICAgICAgaWYgKGF1dG8gVHJhbXBvbGluZUluZm9PckVyciA9IENsaWVudC5lbWl0VHJhbXBvbGluZUJsb2NrKCkpCisgICAgICAgIHN0ZDo6dGllKEJsb2NrQWRkciwgTnVtVHJhbXBvbGluZXMpID0gKlRyYW1wb2xpbmVJbmZvT3JFcnI7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBUcmFtcG9saW5lSW5mb09yRXJyLnRha2VFcnJvcigpOworCisgICAgICB1aW50MzJfdCBUcmFtcG9saW5lU2l6ZSA9IENsaWVudC5nZXRUcmFtcG9saW5lU2l6ZSgpOworICAgICAgZm9yICh1bnNpZ25lZCBJID0gMDsgSSA8IE51bVRyYW1wb2xpbmVzOyArK0kpCisgICAgICAgIHRoaXMtPkF2YWlsYWJsZVRyYW1wb2xpbmVzLnB1c2hfYmFjayhCbG9ja0FkZHIgKyAoSSAqIFRyYW1wb2xpbmVTaXplKSk7CisKKyAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICAgIH0KKworICAgIE9yY1JlbW90ZVRhcmdldENsaWVudCAmQ2xpZW50OworICB9OworCisgIC8vLyBDcmVhdGUgYW4gT3JjUmVtb3RlVGFyZ2V0Q2xpZW50LgorICAvLy8gQ2hhbm5lbCBpcyB0aGUgQ2hhbm5lbFQgaW5zdGFuY2UgdG8gY29tbXVuaWNhdGUgb24uIEl0IGlzIGFzc3VtZWQgdGhhdAorICAvLy8gdGhlIGNoYW5uZWwgaXMgcmVhZHkgdG8gYmUgcmVhZCBmcm9tIGFuZCB3cml0dGVuIHRvLgorICBzdGF0aWMgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPE9yY1JlbW90ZVRhcmdldENsaWVudD4+CisgIENyZWF0ZShycGM6OlJhd0J5dGVDaGFubmVsICZDaGFubmVsLCBzdGQ6OmZ1bmN0aW9uPHZvaWQoRXJyb3IpPiBSZXBvcnRFcnJvcikgeworICAgIEVycm9yIEVyciA9IEVycm9yOjpzdWNjZXNzKCk7CisgICAgYXV0byBDbGllbnQgPSBzdGQ6OnVuaXF1ZV9wdHI8T3JjUmVtb3RlVGFyZ2V0Q2xpZW50PigKKyAgICAgICAgbmV3IE9yY1JlbW90ZVRhcmdldENsaWVudChDaGFubmVsLCBzdGQ6Om1vdmUoUmVwb3J0RXJyb3IpLCBFcnIpKTsKKyAgICBpZiAoRXJyKQorICAgICAgcmV0dXJuIHN0ZDo6bW92ZShFcnIpOworICAgIHJldHVybiBzdGQ6Om1vdmUoQ2xpZW50KTsKKyAgfQorCisgIC8vLyBDYWxsIHRoZSBpbnQodm9pZCkgZnVuY3Rpb24gYXQgdGhlIGdpdmVuIGFkZHJlc3MgaW4gdGhlIHRhcmdldCBhbmQgcmV0dXJuCisgIC8vLyBpdHMgcmVzdWx0LgorICBFeHBlY3RlZDxpbnQ+IGNhbGxJbnRWb2lkKEpJVFRhcmdldEFkZHJlc3MgQWRkcikgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiQ2FsbGluZyBpbnQoKikodm9pZCkgIiA8PCBmb3JtYXQoIjB4JTAxNngiLCBBZGRyKSA8PCAiXG4iKTsKKyAgICByZXR1cm4gY2FsbEI8ZXhlYzo6Q2FsbEludFZvaWQ+KEFkZHIpOworICB9CisKKyAgLy8vIENhbGwgdGhlIGludChpbnQsIGNoYXIqW10pIGZ1bmN0aW9uIGF0IHRoZSBnaXZlbiBhZGRyZXNzIGluIHRoZSB0YXJnZXQgYW5kCisgIC8vLyByZXR1cm4gaXRzIHJlc3VsdC4KKyAgRXhwZWN0ZWQ8aW50PiBjYWxsTWFpbihKSVRUYXJnZXRBZGRyZXNzIEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZBcmdzKSB7CisgICAgREVCVUcoZGJncygpIDw8ICJDYWxsaW5nIGludCgqKShpbnQsIGNoYXIqW10pICIgPDwgZm9ybWF0KCIweCUwMTZ4IiwgQWRkcikKKyAgICAgICAgICAgICAgICAgPDwgIlxuIik7CisgICAgcmV0dXJuIGNhbGxCPGV4ZWM6OkNhbGxNYWluPihBZGRyLCBBcmdzKTsKKyAgfQorCisgIC8vLyBDYWxsIHRoZSB2b2lkKCkgZnVuY3Rpb24gYXQgdGhlIGdpdmVuIGFkZHJlc3MgaW4gdGhlIHRhcmdldCBhbmQgd2FpdCBmb3IKKyAgLy8vIGl0IHRvIGZpbmlzaC4KKyAgRXJyb3IgY2FsbFZvaWRWb2lkKEpJVFRhcmdldEFkZHJlc3MgQWRkcikgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiQ2FsbGluZyB2b2lkKCopKHZvaWQpICIgPDwgZm9ybWF0KCIweCUwMTZ4IiwgQWRkcikKKyAgICAgICAgICAgICAgICAgPDwgIlxuIik7CisgICAgcmV0dXJuIGNhbGxCPGV4ZWM6OkNhbGxWb2lkVm9pZD4oQWRkcik7CisgIH0KKworICAvLy8gQ3JlYXRlIGFuIFJDTWVtb3J5TWFuYWdlciB3aGljaCB3aWxsIGFsbG9jYXRlIGl0cyBtZW1vcnkgb24gdGhlIHJlbW90ZQorICAvLy8gdGFyZ2V0LgorICBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8UmVtb3RlUlREeWxkTWVtb3J5TWFuYWdlcj4+CisgIGNyZWF0ZVJlbW90ZU1lbW9yeU1hbmFnZXIoKSB7CisgICAgYXV0byBJZCA9IEFsbG9jYXRvcklkcy5nZXROZXh0KCk7CisgICAgaWYgKGF1dG8gRXJyID0gY2FsbEI8bWVtOjpDcmVhdGVSZW1vdGVBbGxvY2F0b3I+KElkKSkKKyAgICAgIHJldHVybiBzdGQ6Om1vdmUoRXJyKTsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPFJlbW90ZVJURHlsZE1lbW9yeU1hbmFnZXI+KAorICAgICAgICBuZXcgUmVtb3RlUlREeWxkTWVtb3J5TWFuYWdlcigqdGhpcywgSWQpKTsKKyAgfQorCisgIC8vLyBDcmVhdGUgYW4gUkNJbmRpcmVjdFN0dWJzTWFuYWdlciB0aGF0IHdpbGwgYWxsb2NhdGUgc3R1YnMgb24gdGhlIHJlbW90ZQorICAvLy8gdGFyZ2V0LgorICBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8UmVtb3RlSW5kaXJlY3RTdHVic01hbmFnZXI+PgorICBjcmVhdGVJbmRpcmVjdFN0dWJzTWFuYWdlcigpIHsKKyAgICBhdXRvIElkID0gSW5kaXJlY3RTdHViT3duZXJJZHMuZ2V0TmV4dCgpOworICAgIGlmIChhdXRvIEVyciA9IGNhbGxCPHN0dWJzOjpDcmVhdGVJbmRpcmVjdFN0dWJzT3duZXI+KElkKSkKKyAgICAgIHJldHVybiBzdGQ6Om1vdmUoRXJyKTsKKyAgICByZXR1cm4gbGx2bTo6bWFrZV91bmlxdWU8UmVtb3RlSW5kaXJlY3RTdHVic01hbmFnZXI+KCp0aGlzLCBJZCk7CisgIH0KKworICBFeHBlY3RlZDxSZW1vdGVDb21waWxlQ2FsbGJhY2tNYW5hZ2VyICY+CisgIGVuYWJsZUNvbXBpbGVDYWxsYmFja3MoSklUVGFyZ2V0QWRkcmVzcyBFcnJvckhhbmRsZXJBZGRyZXNzKSB7CisgICAgLy8gRW1pdCB0aGUgcmVzb2x2ZXIgYmxvY2sgb24gdGhlIEpJVCBzZXJ2ZXIuCisgICAgaWYgKGF1dG8gRXJyID0gY2FsbEI8c3R1YnM6OkVtaXRSZXNvbHZlckJsb2NrPigpKQorICAgICAgcmV0dXJuIHN0ZDo6bW92ZShFcnIpOworCisgICAgLy8gQ3JlYXRlIHRoZSBjYWxsYmFjayBtYW5hZ2VyLgorICAgIENhbGxiYWNrTWFuYWdlci5lbXBsYWNlKCp0aGlzLCBFcnJvckhhbmRsZXJBZGRyZXNzKTsKKyAgICBSZW1vdGVDb21waWxlQ2FsbGJhY2tNYW5hZ2VyICZNZ3IgPSAqQ2FsbGJhY2tNYW5hZ2VyOworICAgIHJldHVybiBNZ3I7CisgIH0KKworICAvLy8gU2VhcmNoIGZvciBzeW1ib2xzIGluIHRoZSByZW1vdGUgcHJvY2Vzcy4gTm90ZTogVGhpcyBzaG91bGQgYmUgdXNlZCBieQorICAvLy8gc3ltYm9sIHJlc29sdmVycyAqYWZ0ZXIqIHRoZXkndmUgc2VhcmNoZWQgdGhlIGxvY2FsIHN5bWJvbCB0YWJsZSBpbiB0aGUKKyAgLy8vIEpJVCBzdGFjay4KKyAgRXhwZWN0ZWQ8SklUVGFyZ2V0QWRkcmVzcz4gZ2V0U3ltYm9sQWRkcmVzcyhTdHJpbmdSZWYgTmFtZSkgeworICAgIHJldHVybiBjYWxsQjx1dGlsczo6R2V0U3ltYm9sQWRkcmVzcz4oTmFtZSk7CisgIH0KKworICAvLy8gR2V0IHRoZSB0cmlwbGUgZm9yIHRoZSByZW1vdGUgdGFyZ2V0LgorICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0VGFyZ2V0VHJpcGxlKCkgY29uc3QgeyByZXR1cm4gUmVtb3RlVGFyZ2V0VHJpcGxlOyB9CisKKyAgRXJyb3IgdGVybWluYXRlU2Vzc2lvbigpIHsgcmV0dXJuIGNhbGxCPHV0aWxzOjpUZXJtaW5hdGVTZXNzaW9uPigpOyB9CisKK3ByaXZhdGU6CisgIE9yY1JlbW90ZVRhcmdldENsaWVudChycGM6OlJhd0J5dGVDaGFubmVsICZDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKEVycm9yKT4gUmVwb3J0RXJyb3IsIEVycm9yICZFcnIpCisgICAgICA6IHJwYzo6U2luZ2xlVGhyZWFkZWRSUENFbmRwb2ludDxycGM6OlJhd0J5dGVDaGFubmVsPihDaGFubmVsLCB0cnVlKSwKKyAgICAgICAgUmVwb3J0RXJyb3Ioc3RkOjptb3ZlKFJlcG9ydEVycm9yKSkgeworICAgIEVycm9yQXNPdXRQYXJhbWV0ZXIgRUFPKCZFcnIpOworCisgICAgYWRkSGFuZGxlcjx1dGlsczo6UmVxdWVzdENvbXBpbGU+KAorICAgICAgICBbdGhpc10oSklUVGFyZ2V0QWRkcmVzcyBBZGRyKSAtPiBKSVRUYXJnZXRBZGRyZXNzIHsKKyAgICAgICAgICBpZiAoQ2FsbGJhY2tNYW5hZ2VyKQorICAgICAgICAgICAgcmV0dXJuIENhbGxiYWNrTWFuYWdlci0+ZXhlY3V0ZUNvbXBpbGVDYWxsYmFjayhBZGRyKTsKKyAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfSk7CisKKyAgICBpZiAoYXV0byBSSU9yRXJyID0gY2FsbEI8dXRpbHM6OkdldFJlbW90ZUluZm8+KCkpIHsKKyAgICAgIHN0ZDo6dGllKFJlbW90ZVRhcmdldFRyaXBsZSwgUmVtb3RlUG9pbnRlclNpemUsIFJlbW90ZVBhZ2VTaXplLAorICAgICAgICAgICAgICAgUmVtb3RlVHJhbXBvbGluZVNpemUsIFJlbW90ZUluZGlyZWN0U3R1YlNpemUpID0gKlJJT3JFcnI7CisgICAgICBFcnIgPSBFcnJvcjo6c3VjY2VzcygpOworICAgIH0gZWxzZQorICAgICAgRXJyID0gUklPckVyci50YWtlRXJyb3IoKTsKKyAgfQorCisgIHZvaWQgZGVyZWdpc3RlckVIRnJhbWVzKEpJVFRhcmdldEFkZHJlc3MgQWRkciwgdWludDMyX3QgU2l6ZSkgeworICAgIGlmIChhdXRvIEVyciA9IGNhbGxCPGVoOjpSZWdpc3RlckVIRnJhbWVzPihBZGRyLCBTaXplKSkKKyAgICAgIFJlcG9ydEVycm9yKHN0ZDo6bW92ZShFcnIpKTsKKyAgfQorCisgIHZvaWQgZGVzdHJveVJlbW90ZUFsbG9jYXRvcihSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkIElkKSB7CisgICAgaWYgKGF1dG8gRXJyID0gY2FsbEI8bWVtOjpEZXN0cm95UmVtb3RlQWxsb2NhdG9yPihJZCkpIHsKKyAgICAgIC8vIEZJWE1FOiBUaGlzIHdpbGwgYmUgdHJpZ2dlcmVkIGJ5IGEgcmVtb3ZlTW9kdWxlU2V0IGNhbGw6IFByb3BhZ2F0ZQorICAgICAgLy8gICAgICAgIGVycm9yIHJldHVybiB1cCB0aHJvdWdoIHRoYXQuCisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJGYWlsZWQgdG8gZGVzdHJveSByZW1vdGUgYWxsb2NhdG9yLiIpOworICAgICAgQWxsb2NhdG9ySWRzLnJlbGVhc2UoSWQpOworICAgIH0KKyAgfQorCisgIHZvaWQgZGVzdHJveUluZGlyZWN0U3R1YnNNYW5hZ2VyKFJlc291cmNlSWRNZ3I6OlJlc291cmNlSWQgSWQpIHsKKyAgICBJbmRpcmVjdFN0dWJPd25lcklkcy5yZWxlYXNlKElkKTsKKyAgICBpZiAoYXV0byBFcnIgPSBjYWxsQjxzdHViczo6RGVzdHJveUluZGlyZWN0U3R1YnNPd25lcj4oSWQpKQorICAgICAgUmVwb3J0RXJyb3Ioc3RkOjptb3ZlKEVycikpOworICB9CisKKyAgRXhwZWN0ZWQ8c3RkOjp0dXBsZTxKSVRUYXJnZXRBZGRyZXNzLCBKSVRUYXJnZXRBZGRyZXNzLCB1aW50MzJfdD4+CisgIGVtaXRJbmRpcmVjdFN0dWJzKFJlc291cmNlSWRNZ3I6OlJlc291cmNlSWQgSWQsIHVpbnQzMl90IE51bVN0dWJzUmVxdWlyZWQpIHsKKyAgICByZXR1cm4gY2FsbEI8c3R1YnM6OkVtaXRJbmRpcmVjdFN0dWJzPihJZCwgTnVtU3R1YnNSZXF1aXJlZCk7CisgIH0KKworICBFeHBlY3RlZDxzdGQ6OnR1cGxlPEpJVFRhcmdldEFkZHJlc3MsIHVpbnQzMl90Pj4gZW1pdFRyYW1wb2xpbmVCbG9jaygpIHsKKyAgICByZXR1cm4gY2FsbEI8c3R1YnM6OkVtaXRUcmFtcG9saW5lQmxvY2s+KCk7CisgIH0KKworICB1aW50MzJfdCBnZXRJbmRpcmVjdFN0dWJTaXplKCkgY29uc3QgeyByZXR1cm4gUmVtb3RlSW5kaXJlY3RTdHViU2l6ZTsgfQorICB1aW50MzJfdCBnZXRQYWdlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFJlbW90ZVBhZ2VTaXplOyB9CisgIHVpbnQzMl90IGdldFBvaW50ZXJTaXplKCkgY29uc3QgeyByZXR1cm4gUmVtb3RlUG9pbnRlclNpemU7IH0KKworICB1aW50MzJfdCBnZXRUcmFtcG9saW5lU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFJlbW90ZVRyYW1wb2xpbmVTaXplOyB9CisKKyAgRXhwZWN0ZWQ8c3RkOjp2ZWN0b3I8dWludDhfdD4+IHJlYWRNZW0oY2hhciAqRHN0LCBKSVRUYXJnZXRBZGRyZXNzIFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZSkgeworICAgIHJldHVybiBjYWxsQjxtZW06OlJlYWRNZW0+KFNyYywgU2l6ZSk7CisgIH0KKworICBFcnJvciByZWdpc3RlckVIRnJhbWVzKEpJVFRhcmdldEFkZHJlc3MgJlJBZGRyLCB1aW50MzJfdCBTaXplKSB7CisgICAgLy8gRklYTUU6IER1cGxpY2F0ZSBlcnJvciBhbmQgcmVwb3J0IGl0IHZpYSBSZXBvcnRFcnJvciB0b28/CisgICAgcmV0dXJuIGNhbGxCPGVoOjpSZWdpc3RlckVIRnJhbWVzPihSQWRkciwgU2l6ZSk7CisgIH0KKworICBKSVRUYXJnZXRBZGRyZXNzIHJlc2VydmVNZW0oUmVzb3VyY2VJZE1ncjo6UmVzb3VyY2VJZCBJZCwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFsaWduKSB7CisgICAgaWYgKGF1dG8gQWRkck9yRXJyID0gY2FsbEI8bWVtOjpSZXNlcnZlTWVtPihJZCwgU2l6ZSwgQWxpZ24pKQorICAgICAgcmV0dXJuICpBZGRyT3JFcnI7CisgICAgZWxzZSB7CisgICAgICBSZXBvcnRFcnJvcihBZGRyT3JFcnIudGFrZUVycm9yKCkpOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgYm9vbCBzZXRQcm90ZWN0aW9ucyhSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkIElkLAorICAgICAgICAgICAgICAgICAgICAgIEpJVFRhcmdldEFkZHJlc3MgUmVtb3RlU2VnQWRkciwgdW5zaWduZWQgUHJvdEZsYWdzKSB7CisgICAgaWYgKGF1dG8gRXJyID0gY2FsbEI8bWVtOjpTZXRQcm90ZWN0aW9ucz4oSWQsIFJlbW90ZVNlZ0FkZHIsIFByb3RGbGFncykpIHsKKyAgICAgIFJlcG9ydEVycm9yKHN0ZDo6bW92ZShFcnIpKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCB3cml0ZU1lbShKSVRUYXJnZXRBZGRyZXNzIEFkZHIsIGNvbnN0IGNoYXIgKlNyYywgdWludDY0X3QgU2l6ZSkgeworICAgIGlmIChhdXRvIEVyciA9IGNhbGxCPG1lbTo6V3JpdGVNZW0+KERpcmVjdEJ1ZmZlcldyaXRlcihTcmMsIEFkZHIsIFNpemUpKSkgeworICAgICAgUmVwb3J0RXJyb3Ioc3RkOjptb3ZlKEVycikpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBFcnJvciB3cml0ZVBvaW50ZXIoSklUVGFyZ2V0QWRkcmVzcyBBZGRyLCBKSVRUYXJnZXRBZGRyZXNzIFB0clZhbCkgeworICAgIHJldHVybiBjYWxsQjxtZW06OldyaXRlUHRyPihBZGRyLCBQdHJWYWwpOworICB9CisKKyAgc3RhdGljIEVycm9yIGRvTm90aGluZygpIHsgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7IH0KKworICBzdGQ6OmZ1bmN0aW9uPHZvaWQoRXJyb3IpPiBSZXBvcnRFcnJvcjsKKyAgc3RkOjpzdHJpbmcgUmVtb3RlVGFyZ2V0VHJpcGxlOworICB1aW50MzJfdCBSZW1vdGVQb2ludGVyU2l6ZSA9IDA7CisgIHVpbnQzMl90IFJlbW90ZVBhZ2VTaXplID0gMDsKKyAgdWludDMyX3QgUmVtb3RlVHJhbXBvbGluZVNpemUgPSAwOworICB1aW50MzJfdCBSZW1vdGVJbmRpcmVjdFN0dWJTaXplID0gMDsKKyAgUmVzb3VyY2VJZE1nciBBbGxvY2F0b3JJZHMsIEluZGlyZWN0U3R1Yk93bmVySWRzOworICBPcHRpb25hbDxSZW1vdGVDb21waWxlQ2FsbGJhY2tNYW5hZ2VyPiBDYWxsYmFja01hbmFnZXI7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgcmVtb3RlCit9IC8vIGVuZCBuYW1lc3BhY2Ugb3JjCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjdW5kZWYgREVCVUdfVFlQRQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX09SQ1JFTU9URVRBUkdFVENMSUVOVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvT3JjUmVtb3RlVGFyZ2V0UlBDQVBJLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvT3JjUmVtb3RlVGFyZ2V0UlBDQVBJLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMwZGEwZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9PcmNSZW1vdGVUYXJnZXRSUENBUEkuaApAQCAtMCwwICsxLDM3NyBAQAorLy89PT0tIE9yY1JlbW90ZVRhcmdldFJQQ0FQSS5oIC0gT3JjIFJlbW90ZS10YXJnZXQgUlBDIEFQSSAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgT3JjIHJlbW90ZS10YXJnZXQgUlBDIEFQSS4gSXQgc2hvdWxkIG5vdCBiZSB1c2VkCisvLyBkaXJlY3RseSwgYnV0IGlzIHVzZWQgYnkgdGhlIFJlbW90ZVRhcmdldENsaWVudCBhbmQgUmVtb3RlVGFyZ2V0U2VydmVyCisvLyBjbGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX09SQ1JFTU9URVRBUkdFVFJQQ0FQSV9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19PUkNSRU1PVEVUQVJHRVRSUENBUElfSAorCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvSklUU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL1JQQ1V0aWxzLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL1Jhd0J5dGVDaGFubmVsLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBvcmMgeworCituYW1lc3BhY2UgcmVtb3RlIHsKKworLy8vIFRlbXBsYXRlIGVycm9yIGZvciBtaXNzaW5nIHJlc291cmNlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXNvdXJjZUlkVD4KK2NsYXNzIFJlc291cmNlTm90Rm91bmQKKyAgOiBwdWJsaWMgRXJyb3JJbmZvPFJlc291cmNlTm90Rm91bmQ8UmVzb3VyY2VJZFQ+PiB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIFJlc291cmNlTm90Rm91bmQoUmVzb3VyY2VJZFQgUmVzb3VyY2VJZCwKKyAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBSZXNvdXJjZURlc2NyaXB0aW9uID0gIiIpCisgICAgOiBSZXNvdXJjZUlkKHN0ZDo6bW92ZShSZXNvdXJjZUlkKSksCisgICAgICBSZXNvdXJjZURlc2NyaXB0aW9uKHN0ZDo6bW92ZShSZXNvdXJjZURlc2NyaXB0aW9uKSkge30KKworICBzdGQ6OmVycm9yX2NvZGUgY29udmVydFRvRXJyb3JDb2RlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBvcmNFcnJvcihPcmNFcnJvckNvZGU6OlVua25vd25SZXNvdXJjZUhhbmRsZSk7CisgIH0KKworICB2b2lkIGxvZyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBPUyA8PCAoUmVzb3VyY2VEZXNjcmlwdGlvbi5lbXB0eSgpCisgICAgICAgICAgICAgPyAiUmVtb3RlIHJlc291cmNlIHdpdGggaWQgIgorICAgICAgICAgICAgICAgOiBSZXNvdXJjZURlc2NyaXB0aW9uKQorICAgICAgIDw8ICIgIiA8PCBSZXNvdXJjZUlkIDw8ICIgbm90IGZvdW5kIjsKKyAgfQorCitwcml2YXRlOgorICBSZXNvdXJjZUlkVCBSZXNvdXJjZUlkOworICBzdGQ6OnN0cmluZyBSZXNvdXJjZURlc2NyaXB0aW9uOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFJlc291cmNlSWRUPgorY2hhciBSZXNvdXJjZU5vdEZvdW5kPFJlc291cmNlSWRUPjo6SUQgPSAwOworCitjbGFzcyBEaXJlY3RCdWZmZXJXcml0ZXIgeworcHVibGljOgorICBEaXJlY3RCdWZmZXJXcml0ZXIoKSA9IGRlZmF1bHQ7CisgIERpcmVjdEJ1ZmZlcldyaXRlcihjb25zdCBjaGFyICpTcmMsIEpJVFRhcmdldEFkZHJlc3MgRHN0LCB1aW50NjRfdCBTaXplKQorICAgICAgOiBTcmMoU3JjKSwgRHN0KERzdCksIFNpemUoU2l6ZSkge30KKworICBjb25zdCBjaGFyICpnZXRTcmMoKSBjb25zdCB7IHJldHVybiBTcmM7IH0KKyAgSklUVGFyZ2V0QWRkcmVzcyBnZXREc3QoKSBjb25zdCB7IHJldHVybiBEc3Q7IH0KKyAgdWludDY0X3QgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KKworcHJpdmF0ZToKKyAgY29uc3QgY2hhciAqU3JjOworICBKSVRUYXJnZXRBZGRyZXNzIERzdDsKKyAgdWludDY0X3QgU2l6ZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSByZW1vdGUKKworbmFtZXNwYWNlIHJwYyB7CisKK3RlbXBsYXRlIDw+CitjbGFzcyBSUENUeXBlTmFtZTxKSVRTeW1ib2xGbGFncz4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJKSVRTeW1ib2xGbGFncyI7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVD4KK2NsYXNzIFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIEpJVFN5bWJvbEZsYWdzPiB7CitwdWJsaWM6CisKKyAgc3RhdGljIEVycm9yIHNlcmlhbGl6ZShDaGFubmVsVCAmQywgY29uc3QgSklUU3ltYm9sRmxhZ3MgJkZsYWdzKSB7CisgICAgcmV0dXJuIHNlcmlhbGl6ZVNlcShDLCBzdGF0aWNfY2FzdDxKSVRTeW1ib2xGbGFnczo6VW5kZXJseWluZ1R5cGU+KEZsYWdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdzLmdldFRhcmdldEZsYWdzKCkpOworICB9CisKKyAgc3RhdGljIEVycm9yIGRlc2VyaWFsaXplKENoYW5uZWxUICZDLCBKSVRTeW1ib2xGbGFncyAmRmxhZ3MpIHsKKyAgICBKSVRTeW1ib2xGbGFnczo6VW5kZXJseWluZ1R5cGUgSklURmxhZ3M7CisgICAgSklUU3ltYm9sRmxhZ3M6OlRhcmdldEZsYWdzVHlwZSBUYXJnZXRGbGFnczsKKyAgICBpZiAoYXV0byBFcnIgPSBkZXNlcmlhbGl6ZVNlcShDLCBKSVRGbGFncywgVGFyZ2V0RmxhZ3MpKQorICAgICAgcmV0dXJuIEVycjsKKyAgICBGbGFncyA9IEpJVFN5bWJvbEZsYWdzKHN0YXRpY19jYXN0PEpJVFN5bWJvbEZsYWdzOjpGbGFnTmFtZXM+KEpJVEZsYWdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldEZsYWdzKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gY2xhc3MgUlBDVHlwZU5hbWU8cmVtb3RlOjpEaXJlY3RCdWZmZXJXcml0ZXI+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiRGlyZWN0QnVmZmVyV3JpdGVyIjsgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxUPgorY2xhc3MgU2VyaWFsaXphdGlvblRyYWl0czwKKyAgICBDaGFubmVsVCwgcmVtb3RlOjpEaXJlY3RCdWZmZXJXcml0ZXIsIHJlbW90ZTo6RGlyZWN0QnVmZmVyV3JpdGVyLAorICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8UmF3Qnl0ZUNoYW5uZWwsIENoYW5uZWxUPjo6dmFsdWU+Ojp0eXBlPiB7CitwdWJsaWM6CisgIHN0YXRpYyBFcnJvciBzZXJpYWxpemUoQ2hhbm5lbFQgJkMsIGNvbnN0IHJlbW90ZTo6RGlyZWN0QnVmZmVyV3JpdGVyICZEQlcpIHsKKyAgICBpZiAoYXV0byBFQyA9IHNlcmlhbGl6ZVNlcShDLCBEQlcuZ2V0RHN0KCkpKQorICAgICAgcmV0dXJuIEVDOworICAgIGlmIChhdXRvIEVDID0gc2VyaWFsaXplU2VxKEMsIERCVy5nZXRTaXplKCkpKQorICAgICAgcmV0dXJuIEVDOworICAgIHJldHVybiBDLmFwcGVuZEJ5dGVzKERCVy5nZXRTcmMoKSwgREJXLmdldFNpemUoKSk7CisgIH0KKworICBzdGF0aWMgRXJyb3IgZGVzZXJpYWxpemUoQ2hhbm5lbFQgJkMsIHJlbW90ZTo6RGlyZWN0QnVmZmVyV3JpdGVyICZEQlcpIHsKKyAgICBKSVRUYXJnZXRBZGRyZXNzIERzdDsKKyAgICBpZiAoYXV0byBFQyA9IGRlc2VyaWFsaXplU2VxKEMsIERzdCkpCisgICAgICByZXR1cm4gRUM7CisgICAgdWludDY0X3QgU2l6ZTsKKyAgICBpZiAoYXV0byBFQyA9IGRlc2VyaWFsaXplU2VxKEMsIFNpemUpKQorICAgICAgcmV0dXJuIEVDOworICAgIGNoYXIgKkFkZHIgPSByZWludGVycHJldF9jYXN0PGNoYXIgKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihEc3QpKTsKKworICAgIERCVyA9IHJlbW90ZTo6RGlyZWN0QnVmZmVyV3JpdGVyKG51bGxwdHIsIERzdCwgU2l6ZSk7CisKKyAgICByZXR1cm4gQy5yZWFkQnl0ZXMoQWRkciwgU2l6ZSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBycGMKKworbmFtZXNwYWNlIHJlbW90ZSB7CisKK2NsYXNzIFJlc291cmNlSWRNZ3IgeworcHVibGljOgorICB1c2luZyBSZXNvdXJjZUlkID0gdWludDY0X3Q7CisgIHN0YXRpYyBjb25zdCBSZXNvdXJjZUlkIEludmFsaWRJZCA9IH4wVTsKKworICBSZXNvdXJjZUlkTWdyKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBSZXNvdXJjZUlkTWdyKFJlc291cmNlSWQgRmlyc3RWYWxpZElkKQorICAgIDogTmV4dElkKHN0ZDo6bW92ZShGaXJzdFZhbGlkSWQpKSB7fQorCisgIFJlc291cmNlSWQgZ2V0TmV4dCgpIHsKKyAgICBpZiAoIUZyZWVJZHMuZW1wdHkoKSkgeworICAgICAgUmVzb3VyY2VJZCBJID0gRnJlZUlkcy5iYWNrKCk7CisgICAgICBGcmVlSWRzLnBvcF9iYWNrKCk7CisgICAgICByZXR1cm4gSTsKKyAgICB9CisgICAgYXNzZXJ0KE5leHRJZCArIDEgIT0gfjBVTEwgJiYgIkFsbCBpZHMgYWxsb2NhdGVkIik7CisgICAgcmV0dXJuIE5leHRJZCsrOworICB9CisKKyAgdm9pZCByZWxlYXNlKFJlc291cmNlSWQgSSkgeyBGcmVlSWRzLnB1c2hfYmFjayhJKTsgfQorCitwcml2YXRlOgorICBSZXNvdXJjZUlkIE5leHRJZCA9IDE7CisgIHN0ZDo6dmVjdG9yPFJlc291cmNlSWQ+IEZyZWVJZHM7Cit9OworCisvLy8gUmVnaXN0ZXJzIEVIIGZyYW1lcyBvbiB0aGUgcmVtb3RlLgorbmFtZXNwYWNlIGVoIHsKKworICAvLy8gUmVnaXN0ZXJzIEVIIGZyYW1lcyBvbiB0aGUgcmVtb3RlLgorICBjbGFzcyBSZWdpc3RlckVIRnJhbWVzCisgICAgICA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPFJlZ2lzdGVyRUhGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQoSklUVGFyZ2V0QWRkcmVzcyBBZGRyLCB1aW50MzJfdCBTaXplKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiUmVnaXN0ZXJFSEZyYW1lcyI7IH0KKyAgfTsKKworICAvLy8gRGVyZWdpc3RlcnMgRUggZnJhbWVzIG9uIHRoZSByZW1vdGUuCisgIGNsYXNzIERlcmVnaXN0ZXJFSEZyYW1lcworICAgICAgOiBwdWJsaWMgcnBjOjpGdW5jdGlvbjxEZXJlZ2lzdGVyRUhGcmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQoSklUVGFyZ2V0QWRkcmVzcyBBZGRyLCB1aW50MzJfdCBTaXplKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiRGVyZWdpc3RlckVIRnJhbWVzIjsgfQorICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgZWgKKworLy8vIFJQQyBmdW5jdGlvbnMgZm9yIGV4ZWN1dGluZyByZW1vdGUgY29kZS4KK25hbWVzcGFjZSBleGVjIHsKKworICAvLy8gQ2FsbCBhbiAnaW50MzJfdCgpJy10eXBlIGZ1bmN0aW9uIG9uIHRoZSByZW1vdGUsIHJldHVybnMgdGhlIGNhbGxlZAorICAvLy8gZnVuY3Rpb24ncyByZXR1cm4gdmFsdWUuCisgIGNsYXNzIENhbGxJbnRWb2lkCisgICAgICA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPENhbGxJbnRWb2lkLCBpbnQzMl90KEpJVFRhcmdldEFkZHJlc3MgQWRkcik+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIkNhbGxJbnRWb2lkIjsgfQorICB9OworCisgIC8vLyBDYWxsIGFuICdpbnQzMl90KGludDMyX3QsIGNoYXIqKiknLXR5cGUgZnVuY3Rpb24gb24gdGhlIHJlbW90ZSwgcmV0dXJucyB0aGUKKyAgLy8vIGNhbGxlZCBmdW5jdGlvbidzIHJldHVybiB2YWx1ZS4KKyAgY2xhc3MgQ2FsbE1haW4KKyAgICAgIDogcHVibGljIHJwYzo6RnVuY3Rpb248Q2FsbE1haW4sIGludDMyX3QoSklUVGFyZ2V0QWRkcmVzcyBBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQXJncyk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIkNhbGxNYWluIjsgfQorICB9OworCisgIC8vLyBDYWxscyBhICd2b2lkKCknLXR5cGUgZnVuY3Rpb24gb24gdGhlIHJlbW90ZSwgcmV0dXJucyB3aGVuIHRoZSBjYWxsZWQKKyAgLy8vIGZ1bmN0aW9uIGNvbXBsZXRlcy4KKyAgY2xhc3MgQ2FsbFZvaWRWb2lkCisgICAgICA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPENhbGxWb2lkVm9pZCwgdm9pZChKSVRUYXJnZXRBZGRyZXNzIEZuQWRkcik+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIkNhbGxWb2lkVm9pZCI7IH0KKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGV4ZWMKKworLy8vIFJQQyBmdW5jdGlvbnMgZm9yIHJlbW90ZSBtZW1vcnkgbWFuYWdlbWVudCAvIGluc3BlY3Rpb24gLyBtb2RpZmljYXRpb24uCituYW1lc3BhY2UgbWVtIHsKKworICAvLy8gQ3JlYXRlcyBhIG1lbW9yeSBhbGxvY2F0b3Igb24gdGhlIHJlbW90ZS4KKyAgY2xhc3MgQ3JlYXRlUmVtb3RlQWxsb2NhdG9yCisgICAgICA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPENyZWF0ZVJlbW90ZUFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZChSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkIEFsbG9jYXRvcklEKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiQ3JlYXRlUmVtb3RlQWxsb2NhdG9yIjsgfQorICB9OworCisgIC8vLyBEZXN0cm95cyBhIHJlbW90ZSBhbGxvY2F0b3IsIGZyZWVpbmcgYW55IG1lbW9yeSBhbGxvY2F0ZWQgYnkgaXQuCisgIGNsYXNzIERlc3Ryb3lSZW1vdGVBbGxvY2F0b3IKKyAgICAgIDogcHVibGljIHJwYzo6RnVuY3Rpb248RGVzdHJveVJlbW90ZUFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZChSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkIEFsbG9jYXRvcklEKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiRGVzdHJveVJlbW90ZUFsbG9jYXRvciI7IH0KKyAgfTsKKworICAvLy8gUmVhZCBhIHJlbW90ZSBtZW1vcnkgYmxvY2suCisgIGNsYXNzIFJlYWRNZW0KKyAgICAgIDogcHVibGljIHJwYzo6RnVuY3Rpb248UmVhZE1lbSwgc3RkOjp2ZWN0b3I8dWludDhfdD4oSklUVGFyZ2V0QWRkcmVzcyBTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUpPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJSZWFkTWVtIjsgfQorICB9OworCisgIC8vLyBSZXNlcnZlIGEgYmxvY2sgb2YgbWVtb3J5IG9uIHRoZSByZW1vdGUgdmlhIHRoZSBnaXZlbiBhbGxvY2F0b3IuCisgIGNsYXNzIFJlc2VydmVNZW0KKyAgICAgIDogcHVibGljIHJwYzo6RnVuY3Rpb248UmVzZXJ2ZU1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUVGFyZ2V0QWRkcmVzcyhSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkIEFsbG9jSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZSwgdWludDMyX3QgQWxpZ24pPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJSZXNlcnZlTWVtIjsgfQorICB9OworCisgIC8vLyBTZXQgdGhlIG1lbW9yeSBwcm90ZWN0aW9uIG9uIGEgbWVtb3J5IGJsb2NrLgorICBjbGFzcyBTZXRQcm90ZWN0aW9ucworICAgICAgOiBwdWJsaWMgcnBjOjpGdW5jdGlvbjxTZXRQcm90ZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZChSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkIEFsbG9jSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUVGFyZ2V0QWRkcmVzcyBEc3QsIHVpbnQzMl90IFByb3RGbGFncyk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIlNldFByb3RlY3Rpb25zIjsgfQorICB9OworCisgIC8vLyBXcml0ZSB0byBhIHJlbW90ZSBtZW1vcnkgYmxvY2suCisgIGNsYXNzIFdyaXRlTWVtCisgICAgICA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPFdyaXRlTWVtLCB2b2lkKHJlbW90ZTo6RGlyZWN0QnVmZmVyV3JpdGVyIERCKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiV3JpdGVNZW0iOyB9CisgIH07CisKKyAgLy8vIFdyaXRlIHRvIGEgcmVtb3RlIHBvaW50ZXIuCisgIGNsYXNzIFdyaXRlUHRyIDogcHVibGljIHJwYzo6RnVuY3Rpb248V3JpdGVQdHIsIHZvaWQoSklUVGFyZ2V0QWRkcmVzcyBEc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUVGFyZ2V0QWRkcmVzcyBWYWwpPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJXcml0ZVB0ciI7IH0KKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG1lbQorCisvLy8gUlBDIGZ1bmN0aW9ucyBmb3IgcmVtb3RlIHN0dWIgYW5kIHRyYW1wb2xpbmUgbWFuYWdlbWVudC4KK25hbWVzcGFjZSBzdHVicyB7CisKKyAgLy8vIENyZWF0ZXMgYW4gaW5kaXJlY3Qgc3R1YiBvd25lciBvbiB0aGUgcmVtb3RlLgorICBjbGFzcyBDcmVhdGVJbmRpcmVjdFN0dWJzT3duZXIKKyAgICAgIDogcHVibGljIHJwYzo6RnVuY3Rpb248Q3JlYXRlSW5kaXJlY3RTdHVic093bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKFJlc291cmNlSWRNZ3I6OlJlc291cmNlSWQgU3R1Yk93bmVySUQpPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJDcmVhdGVJbmRpcmVjdFN0dWJzT3duZXIiOyB9CisgIH07CisKKyAgLy8vIFJQQyBmdW5jdGlvbiBmb3IgZGVzdHJveWluZyBhbiBpbmRpcmVjdCBzdHVicyBvd25lci4KKyAgY2xhc3MgRGVzdHJveUluZGlyZWN0U3R1YnNPd25lcgorICAgICAgOiBwdWJsaWMgcnBjOjpGdW5jdGlvbjxEZXN0cm95SW5kaXJlY3RTdHVic093bmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKFJlc291cmNlSWRNZ3I6OlJlc291cmNlSWQgU3R1YnNPd25lcklEKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiRGVzdHJveUluZGlyZWN0U3R1YnNPd25lciI7IH0KKyAgfTsKKworICAvLy8gRW1pdEluZGlyZWN0U3R1YnMgcmVzdWx0IGlzIChTdHVic0Jhc2UsIFB0cnNCYXNlLCBOdW1TdHVic0VtaXR0ZWQpLgorICBjbGFzcyBFbWl0SW5kaXJlY3RTdHVicworICAgICAgOiBwdWJsaWMgcnBjOjpGdW5jdGlvbjwKKyAgICAgICAgICAgIEVtaXRJbmRpcmVjdFN0dWJzLAorICAgICAgICAgICAgc3RkOjp0dXBsZTxKSVRUYXJnZXRBZGRyZXNzLCBKSVRUYXJnZXRBZGRyZXNzLCB1aW50MzJfdD4oCisgICAgICAgICAgICAgICAgUmVzb3VyY2VJZE1ncjo6UmVzb3VyY2VJZCBTdHVic093bmVySUQsCisgICAgICAgICAgICAgICAgdWludDMyX3QgTnVtU3R1YnNSZXF1aXJlZCk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIkVtaXRJbmRpcmVjdFN0dWJzIjsgfQorICB9OworCisgIC8vLyBSUEMgZnVuY3Rpb24gdG8gZW1pdCB0aGUgcmVzb2x2ZXIgYmxvY2sgYW5kIHJldHVybiBpdHMgYWRkcmVzcy4KKyAgY2xhc3MgRW1pdFJlc29sdmVyQmxvY2sgOiBwdWJsaWMgcnBjOjpGdW5jdGlvbjxFbWl0UmVzb2x2ZXJCbG9jaywgdm9pZCgpPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJFbWl0UmVzb2x2ZXJCbG9jayI7IH0KKyAgfTsKKworICAvLy8gRW1pdFRyYW1wb2xpbmVCbG9jayByZXN1bHQgaXMgKEJsb2NrQWRkciwgTnVtVHJhbXBvbGluZXMpLgorICBjbGFzcyBFbWl0VHJhbXBvbGluZUJsb2NrCisgICAgICA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPEVtaXRUcmFtcG9saW5lQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dHVwbGU8SklUVGFyZ2V0QWRkcmVzcywgdWludDMyX3Q+KCk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIkVtaXRUcmFtcG9saW5lQmxvY2siOyB9CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBzdHVicworCisvLy8gTWlzY2VsYW5lb3VzIFJQQyBmdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCByZW1vdGVzLgorbmFtZXNwYWNlIHV0aWxzIHsKKworICAvLy8gR2V0UmVtb3RlSW5mbyByZXN1bHQgaXMgKFRyaXBsZSwgUG9pbnRlclNpemUsIFBhZ2VTaXplLCBUcmFtcG9saW5lU2l6ZSwKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRpcmVjdFN0dWJzU2l6ZSkuCisgIGNsYXNzIEdldFJlbW90ZUluZm8KKyAgICAgIDogcHVibGljIHJwYzo6RnVuY3Rpb248CisgICAgICAgICAgICBHZXRSZW1vdGVJbmZvLAorICAgICAgICAgICAgc3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgdWludDMyX3QsIHVpbnQzMl90LCB1aW50MzJfdCwgdWludDMyX3Q+KCk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIkdldFJlbW90ZUluZm8iOyB9CisgIH07CisKKyAgLy8vIEdldCB0aGUgYWRkcmVzcyBvZiBhIHJlbW90ZSBzeW1ib2wuCisgIGNsYXNzIEdldFN5bWJvbEFkZHJlc3MKKyAgICAgIDogcHVibGljIHJwYzo6RnVuY3Rpb248R2V0U3ltYm9sQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUVGFyZ2V0QWRkcmVzcyhzdGQ6OnN0cmluZyBTeW1ib2xOYW1lKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiR2V0U3ltYm9sQWRkcmVzcyI7IH0KKyAgfTsKKworICAvLy8gUmVxdWVzdCB0aGF0IHRoZSBob3N0IGV4ZWN1dGUgYSBjb21waWxlIGNhbGxiYWNrLgorICBjbGFzcyBSZXF1ZXN0Q29tcGlsZQorICAgICAgOiBwdWJsaWMgcnBjOjpGdW5jdGlvbjwKKyAgICAgICAgICAgIFJlcXVlc3RDb21waWxlLCBKSVRUYXJnZXRBZGRyZXNzKEpJVFRhcmdldEFkZHJlc3MgVHJhbXBvbGluZUFkZHIpPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJSZXF1ZXN0Q29tcGlsZSI7IH0KKyAgfTsKKworICAvLy8gTm90aWZ5IHRoZSByZW1vdGUgYW5kIHRlcm1pbmF0ZSB0aGUgc2Vzc2lvbi4KKyAgY2xhc3MgVGVybWluYXRlU2Vzc2lvbiA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPFRlcm1pbmF0ZVNlc3Npb24sIHZvaWQoKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiVGVybWluYXRlU2Vzc2lvbiI7IH0KKyAgfTsKKworfSAvLyBuYW1lc3BhY2UgdXRpbHMKKworY2xhc3MgT3JjUmVtb3RlVGFyZ2V0UlBDQVBJCisgICAgOiBwdWJsaWMgcnBjOjpTaW5nbGVUaHJlYWRlZFJQQ0VuZHBvaW50PHJwYzo6UmF3Qnl0ZUNoYW5uZWw+IHsKK3B1YmxpYzoKKyAgLy8gRklYTUU6IFJlbW92ZSBjb25zdHJ1Y3RvcnMgb25jZSBNU1ZDIHN1cHBvcnRzIHN5bnRoZXNpemluZyBtb3ZlLW9wcy4KKyAgT3JjUmVtb3RlVGFyZ2V0UlBDQVBJKHJwYzo6UmF3Qnl0ZUNoYW5uZWwgJkMpCisgICAgICA6IHJwYzo6U2luZ2xlVGhyZWFkZWRSUENFbmRwb2ludDxycGM6OlJhd0J5dGVDaGFubmVsPihDLCB0cnVlKSB7fQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHJlbW90ZQorCit9IC8vIGVuZCBuYW1lc3BhY2Ugb3JjCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX09SQ1JFTU9URVRBUkdFVFJQQ0FQSV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvT3JjUmVtb3RlVGFyZ2V0U2VydmVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvT3JjUmVtb3RlVGFyZ2V0U2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Y0MTlkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9PcmNSZW1vdGVUYXJnZXRTZXJ2ZXIuaApAQCAtMCwwICsxLDQ0NyBAQAorLy89PT0tIE9yY1JlbW90ZVRhcmdldFNlcnZlci5oIC0gT3JjIFJlbW90ZS10YXJnZXQgU2VydmVyIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgT3JjUmVtb3RlVGFyZ2V0U2VydmVyIGNsYXNzLiBJdCBjYW4gYmUgdXNlZCB0byBidWlsZCBhCisvLyBKSVQgc2VydmVyIHRoYXQgY2FuIGV4ZWN1dGUgY29kZSBzZW50IGZyb20gYW4gT3JjUmVtb3RlVGFyZ2V0Q2xpZW50LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX09SQ1JFTU9URVRBUkdFVFNFUlZFUl9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19PUkNSRU1PVEVUQVJHRVRTRVJWRVJfSAorCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvSklUU3ltYm9sLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL09yY0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL09yY1JlbW90ZVRhcmdldFJQQ0FQSS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvSG9zdC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUHJvY2Vzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNkZWZpbmUgREVCVUdfVFlQRSAib3JjLXJlbW90ZSIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9yYyB7CituYW1lc3BhY2UgcmVtb3RlIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZSBUYXJnZXRUPgorY2xhc3MgT3JjUmVtb3RlVGFyZ2V0U2VydmVyCisgICAgOiBwdWJsaWMgcnBjOjpTaW5nbGVUaHJlYWRlZFJQQ0VuZHBvaW50PHJwYzo6UmF3Qnl0ZUNoYW5uZWw+IHsKK3B1YmxpYzoKKyAgdXNpbmcgU3ltYm9sTG9va3VwRnRvciA9CisgICAgICBzdGQ6OmZ1bmN0aW9uPEpJVFRhcmdldEFkZHJlc3MoY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpPjsKKworICB1c2luZyBFSEZyYW1lUmVnaXN0cmF0aW9uRnRvciA9CisgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQodWludDhfdCAqQWRkciwgdWludDMyX3QgU2l6ZSk+OworCisgIE9yY1JlbW90ZVRhcmdldFNlcnZlcihDaGFubmVsVCAmQ2hhbm5lbCwgU3ltYm9sTG9va3VwRnRvciBTeW1ib2xMb29rdXAsCisgICAgICAgICAgICAgICAgICAgICAgICBFSEZyYW1lUmVnaXN0cmF0aW9uRnRvciBFSEZyYW1lc1JlZ2lzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgRUhGcmFtZVJlZ2lzdHJhdGlvbkZ0b3IgRUhGcmFtZXNEZXJlZ2lzdGVyKQorICAgICAgOiBycGM6OlNpbmdsZVRocmVhZGVkUlBDRW5kcG9pbnQ8cnBjOjpSYXdCeXRlQ2hhbm5lbD4oQ2hhbm5lbCwgdHJ1ZSksCisgICAgICAgIFN5bWJvbExvb2t1cChzdGQ6Om1vdmUoU3ltYm9sTG9va3VwKSksCisgICAgICAgIEVIRnJhbWVzUmVnaXN0ZXIoc3RkOjptb3ZlKEVIRnJhbWVzUmVnaXN0ZXIpKSwKKyAgICAgICAgRUhGcmFtZXNEZXJlZ2lzdGVyKHN0ZDo6bW92ZShFSEZyYW1lc0RlcmVnaXN0ZXIpKSB7CisgICAgdXNpbmcgVGhpc1QgPSB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8ZGVjbHR5cGUoKnRoaXMpPjo6dHlwZTsKKyAgICBhZGRIYW5kbGVyPGV4ZWM6OkNhbGxJbnRWb2lkPigqdGhpcywgJlRoaXNUOjpoYW5kbGVDYWxsSW50Vm9pZCk7CisgICAgYWRkSGFuZGxlcjxleGVjOjpDYWxsTWFpbj4oKnRoaXMsICZUaGlzVDo6aGFuZGxlQ2FsbE1haW4pOworICAgIGFkZEhhbmRsZXI8ZXhlYzo6Q2FsbFZvaWRWb2lkPigqdGhpcywgJlRoaXNUOjpoYW5kbGVDYWxsVm9pZFZvaWQpOworICAgIGFkZEhhbmRsZXI8bWVtOjpDcmVhdGVSZW1vdGVBbGxvY2F0b3I+KCp0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZUaGlzVDo6aGFuZGxlQ3JlYXRlUmVtb3RlQWxsb2NhdG9yKTsKKyAgICBhZGRIYW5kbGVyPG1lbTo6RGVzdHJveVJlbW90ZUFsbG9jYXRvcj4oCisgICAgICAgICp0aGlzLCAmVGhpc1Q6OmhhbmRsZURlc3Ryb3lSZW1vdGVBbGxvY2F0b3IpOworICAgIGFkZEhhbmRsZXI8bWVtOjpSZWFkTWVtPigqdGhpcywgJlRoaXNUOjpoYW5kbGVSZWFkTWVtKTsKKyAgICBhZGRIYW5kbGVyPG1lbTo6UmVzZXJ2ZU1lbT4oKnRoaXMsICZUaGlzVDo6aGFuZGxlUmVzZXJ2ZU1lbSk7CisgICAgYWRkSGFuZGxlcjxtZW06OlNldFByb3RlY3Rpb25zPigqdGhpcywgJlRoaXNUOjpoYW5kbGVTZXRQcm90ZWN0aW9ucyk7CisgICAgYWRkSGFuZGxlcjxtZW06OldyaXRlTWVtPigqdGhpcywgJlRoaXNUOjpoYW5kbGVXcml0ZU1lbSk7CisgICAgYWRkSGFuZGxlcjxtZW06OldyaXRlUHRyPigqdGhpcywgJlRoaXNUOjpoYW5kbGVXcml0ZVB0cik7CisgICAgYWRkSGFuZGxlcjxlaDo6UmVnaXN0ZXJFSEZyYW1lcz4oKnRoaXMsICZUaGlzVDo6aGFuZGxlUmVnaXN0ZXJFSEZyYW1lcyk7CisgICAgYWRkSGFuZGxlcjxlaDo6RGVyZWdpc3RlckVIRnJhbWVzPigqdGhpcywgJlRoaXNUOjpoYW5kbGVEZXJlZ2lzdGVyRUhGcmFtZXMpOworICAgIGFkZEhhbmRsZXI8c3R1YnM6OkNyZWF0ZUluZGlyZWN0U3R1YnNPd25lcj4oCisgICAgICAgICp0aGlzLCAmVGhpc1Q6OmhhbmRsZUNyZWF0ZUluZGlyZWN0U3R1YnNPd25lcik7CisgICAgYWRkSGFuZGxlcjxzdHViczo6RGVzdHJveUluZGlyZWN0U3R1YnNPd25lcj4oCisgICAgICAgICp0aGlzLCAmVGhpc1Q6OmhhbmRsZURlc3Ryb3lJbmRpcmVjdFN0dWJzT3duZXIpOworICAgIGFkZEhhbmRsZXI8c3R1YnM6OkVtaXRJbmRpcmVjdFN0dWJzPigqdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlRoaXNUOjpoYW5kbGVFbWl0SW5kaXJlY3RTdHVicyk7CisgICAgYWRkSGFuZGxlcjxzdHViczo6RW1pdFJlc29sdmVyQmxvY2s+KCp0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmVGhpc1Q6OmhhbmRsZUVtaXRSZXNvbHZlckJsb2NrKTsKKyAgICBhZGRIYW5kbGVyPHN0dWJzOjpFbWl0VHJhbXBvbGluZUJsb2NrPigqdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmVGhpc1Q6OmhhbmRsZUVtaXRUcmFtcG9saW5lQmxvY2spOworICAgIGFkZEhhbmRsZXI8dXRpbHM6OkdldFN5bWJvbEFkZHJlc3M+KCp0aGlzLCAmVGhpc1Q6OmhhbmRsZUdldFN5bWJvbEFkZHJlc3MpOworICAgIGFkZEhhbmRsZXI8dXRpbHM6OkdldFJlbW90ZUluZm8+KCp0aGlzLCAmVGhpc1Q6OmhhbmRsZUdldFJlbW90ZUluZm8pOworICAgIGFkZEhhbmRsZXI8dXRpbHM6OlRlcm1pbmF0ZVNlc3Npb24+KCp0aGlzLCAmVGhpc1Q6OmhhbmRsZVRlcm1pbmF0ZVNlc3Npb24pOworICB9CisKKyAgLy8gRklYTUU6IFJlbW92ZSBtb3ZlL2NvcHkgb3BzIG9uY2UgTVNWQyBzdXBwb3J0cyBzeW50aGVzaXppbmcgbW92ZSBvcHMuCisgIE9yY1JlbW90ZVRhcmdldFNlcnZlcihjb25zdCBPcmNSZW1vdGVUYXJnZXRTZXJ2ZXIgJikgPSBkZWxldGU7CisgIE9yY1JlbW90ZVRhcmdldFNlcnZlciAmb3BlcmF0b3I9KGNvbnN0IE9yY1JlbW90ZVRhcmdldFNlcnZlciAmKSA9IGRlbGV0ZTsKKworICBPcmNSZW1vdGVUYXJnZXRTZXJ2ZXIoT3JjUmVtb3RlVGFyZ2V0U2VydmVyICYmT3RoZXIpID0gZGVmYXVsdDsKKyAgT3JjUmVtb3RlVGFyZ2V0U2VydmVyICZvcGVyYXRvcj0oT3JjUmVtb3RlVGFyZ2V0U2VydmVyICYmKSA9IGRlbGV0ZTsKKworICBFeHBlY3RlZDxKSVRUYXJnZXRBZGRyZXNzPiByZXF1ZXN0Q29tcGlsZShKSVRUYXJnZXRBZGRyZXNzIFRyYW1wb2xpbmVBZGRyKSB7CisgICAgcmV0dXJuIGNhbGxCPHV0aWxzOjpSZXF1ZXN0Q29tcGlsZT4oVHJhbXBvbGluZUFkZHIpOworICB9CisKKyAgYm9vbCByZWNlaXZlZFRlcm1pbmF0ZSgpIGNvbnN0IHsgcmV0dXJuIFRlcm1pbmF0ZUZsYWc7IH0KKworcHJpdmF0ZToKKyAgc3RydWN0IEFsbG9jYXRvciB7CisgICAgQWxsb2NhdG9yKCkgPSBkZWZhdWx0OworICAgIEFsbG9jYXRvcihBbGxvY2F0b3IgJiZPdGhlcikgOiBBbGxvY3Moc3RkOjptb3ZlKE90aGVyLkFsbG9jcykpIHt9CisKKyAgICBBbGxvY2F0b3IgJm9wZXJhdG9yPShBbGxvY2F0b3IgJiZPdGhlcikgeworICAgICAgQWxsb2NzID0gc3RkOjptb3ZlKE90aGVyLkFsbG9jcyk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgfkFsbG9jYXRvcigpIHsKKyAgICAgIGZvciAoYXV0byAmQWxsb2MgOiBBbGxvY3MpCisgICAgICAgIHN5czo6TWVtb3J5OjpyZWxlYXNlTWFwcGVkTWVtb3J5KEFsbG9jLnNlY29uZCk7CisgICAgfQorCisgICAgRXJyb3IgYWxsb2NhdGUodm9pZCAqJkFkZHIsIHNpemVfdCBTaXplLCB1aW50MzJfdCBBbGlnbikgeworICAgICAgc3RkOjplcnJvcl9jb2RlIEVDOworICAgICAgc3lzOjpNZW1vcnlCbG9jayBNQiA9IHN5czo6TWVtb3J5OjphbGxvY2F0ZU1hcHBlZE1lbW9yeSgKKyAgICAgICAgICBTaXplLCBudWxscHRyLCBzeXM6Ok1lbW9yeTo6TUZfUkVBRCB8IHN5czo6TWVtb3J5OjpNRl9XUklURSwgRUMpOworICAgICAgaWYgKEVDKQorICAgICAgICByZXR1cm4gZXJyb3JDb2RlVG9FcnJvcihFQyk7CisKKyAgICAgIEFkZHIgPSBNQi5iYXNlKCk7CisgICAgICBhc3NlcnQoQWxsb2NzLmZpbmQoTUIuYmFzZSgpKSA9PSBBbGxvY3MuZW5kKCkgJiYgIkR1cGxpY2F0ZSBhbGxvYyIpOworICAgICAgQWxsb2NzW01CLmJhc2UoKV0gPSBzdGQ6Om1vdmUoTUIpOworICAgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgICAgfQorCisgICAgRXJyb3Igc2V0UHJvdGVjdGlvbnModm9pZCAqYmxvY2ssIHVuc2lnbmVkIEZsYWdzKSB7CisgICAgICBhdXRvIEkgPSBBbGxvY3MuZmluZChibG9jayk7CisgICAgICBpZiAoSSA9PSBBbGxvY3MuZW5kKCkpCisgICAgICAgIHJldHVybiBlcnJvckNvZGVUb0Vycm9yKG9yY0Vycm9yKE9yY0Vycm9yQ29kZTo6UmVtb3RlTVByb3RlY3RBZGRyVW5yZWNvZ25pemVkKSk7CisgICAgICByZXR1cm4gZXJyb3JDb2RlVG9FcnJvcigKKyAgICAgICAgICBzeXM6Ok1lbW9yeTo6cHJvdGVjdE1hcHBlZE1lbW9yeShJLT5zZWNvbmQsIEZsYWdzKSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgc3RkOjptYXA8dm9pZCAqLCBzeXM6Ok1lbW9yeUJsb2NrPiBBbGxvY3M7CisgIH07CisKKyAgc3RhdGljIEVycm9yIGRvTm90aGluZygpIHsgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7IH0KKworICBzdGF0aWMgSklUVGFyZ2V0QWRkcmVzcyByZWVudGVyKHZvaWQgKkpJVFRhcmdldEFkZHIsIHZvaWQgKlRyYW1wb2xpbmVBZGRyKSB7CisgICAgYXV0byBUID0gc3RhdGljX2Nhc3Q8T3JjUmVtb3RlVGFyZ2V0U2VydmVyICo+KEpJVFRhcmdldEFkZHIpOworICAgIGF1dG8gQWRkck9yRXJyID0gVC0+cmVxdWVzdENvbXBpbGUoc3RhdGljX2Nhc3Q8SklUVGFyZ2V0QWRkcmVzcz4oCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihUcmFtcG9saW5lQWRkcikpKTsKKyAgICAvLyBGSVhNRTogQWxsb3cgY3VzdG9taXphYmxlIGZhaWx1cmUgc3Vic3RpdHV0aW9uIGZ1bmN0aW9ucy4KKyAgICBhc3NlcnQoQWRkck9yRXJyICYmICJDb21waWxlIHJlcXVlc3QgZmFpbGVkIik7CisgICAgcmV0dXJuICpBZGRyT3JFcnI7CisgIH0KKworICBFeHBlY3RlZDxpbnQzMl90PiBoYW5kbGVDYWxsSW50Vm9pZChKSVRUYXJnZXRBZGRyZXNzIEFkZHIpIHsKKyAgICB1c2luZyBJbnRWb2lkRm5UeSA9IGludCAoKikoKTsKKworICAgIEludFZvaWRGblR5IEZuID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxJbnRWb2lkRm5UeT4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihBZGRyKSk7CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgQ2FsbGluZyAiIDw8IGZvcm1hdCgiMHglMDE2eCIsIEFkZHIpIDw8ICJcbiIpOworICAgIGludCBSZXN1bHQgPSBGbigpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiICBSZXN1bHQgPSAiIDw8IFJlc3VsdCA8PCAiXG4iKTsKKworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICBFeHBlY3RlZDxpbnQzMl90PiBoYW5kbGVDYWxsTWFpbihKSVRUYXJnZXRBZGRyZXNzIEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBBcmdzKSB7CisgICAgdXNpbmcgTWFpbkZuVHkgPSBpbnQgKCopKGludCwgY29uc3QgY2hhciAqW10pOworCisgICAgTWFpbkZuVHkgRm4gPSByZWludGVycHJldF9jYXN0PE1haW5GblR5PihzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KEFkZHIpKTsKKyAgICBpbnQgQXJnQyA9IEFyZ3Muc2l6ZSgpICsgMTsKKyAgICBpbnQgSWR4ID0gMTsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgY2hhciAqW10+IEFyZ1YobmV3IGNvbnN0IGNoYXIgKltBcmdDICsgMV0pOworICAgIEFyZ1ZbMF0gPSAiPGppdCBwcm9jZXNzPiI7CisgICAgZm9yIChhdXRvICZBcmcgOiBBcmdzKQorICAgICAgQXJnVltJZHgrK10gPSBBcmcuY19zdHIoKTsKKyAgICBBcmdWW0FyZ0NdID0gMDsKKyAgICBERUJVRygKKyAgICAgIGZvciAoaW50IElkeCA9IDA7IElkeCA8IEFyZ0M7ICsrSWR4KSB7CisgICAgICAgIGxsdm06OmRiZ3MoKSA8PCAiQXJnICIgPDwgSWR4IDw8ICI6ICIgPDwgQXJnVltJZHhdIDw8ICJcbiI7CisgICAgICB9CisgICAgKTsKKworICAgIERFQlVHKGRiZ3MoKSA8PCAiICBDYWxsaW5nICIgPDwgZm9ybWF0KCIweCUwMTZ4IiwgQWRkcikgPDwgIlxuIik7CisgICAgaW50IFJlc3VsdCA9IEZuKEFyZ0MsIEFyZ1YuZ2V0KCkpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiICBSZXN1bHQgPSAiIDw8IFJlc3VsdCA8PCAiXG4iKTsKKworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICBFcnJvciBoYW5kbGVDYWxsVm9pZFZvaWQoSklUVGFyZ2V0QWRkcmVzcyBBZGRyKSB7CisgICAgdXNpbmcgVm9pZFZvaWRGblR5ID0gdm9pZCAoKikoKTsKKworICAgIFZvaWRWb2lkRm5UeSBGbiA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Vm9pZFZvaWRGblR5PihzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KEFkZHIpKTsKKworICAgIERFQlVHKGRiZ3MoKSA8PCAiICBDYWxsaW5nICIgPDwgZm9ybWF0KCIweCUwMTZ4IiwgQWRkcikgPDwgIlxuIik7CisgICAgRm4oKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgQ29tcGxldGUuXG4iKTsKKworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXJyb3IgaGFuZGxlQ3JlYXRlUmVtb3RlQWxsb2NhdG9yKFJlc291cmNlSWRNZ3I6OlJlc291cmNlSWQgSWQpIHsKKyAgICBhdXRvIEkgPSBBbGxvY2F0b3JzLmZpbmQoSWQpOworICAgIGlmIChJICE9IEFsbG9jYXRvcnMuZW5kKCkpCisgICAgICByZXR1cm4gZXJyb3JDb2RlVG9FcnJvcigKKyAgICAgICAgICAgICAgIG9yY0Vycm9yKE9yY0Vycm9yQ29kZTo6UmVtb3RlQWxsb2NhdG9ySWRBbHJlYWR5SW5Vc2UpKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgQ3JlYXRlZCBhbGxvY2F0b3IgIiA8PCBJZCA8PCAiXG4iKTsKKyAgICBBbGxvY2F0b3JzW0lkXSA9IEFsbG9jYXRvcigpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXJyb3IgaGFuZGxlQ3JlYXRlSW5kaXJlY3RTdHVic093bmVyKFJlc291cmNlSWRNZ3I6OlJlc291cmNlSWQgSWQpIHsKKyAgICBhdXRvIEkgPSBJbmRpcmVjdFN0dWJzT3duZXJzLmZpbmQoSWQpOworICAgIGlmIChJICE9IEluZGlyZWN0U3R1YnNPd25lcnMuZW5kKCkpCisgICAgICByZXR1cm4gZXJyb3JDb2RlVG9FcnJvcigKKyAgICAgICAgICAgICAgIG9yY0Vycm9yKE9yY0Vycm9yQ29kZTo6UmVtb3RlSW5kaXJlY3RTdHVic093bmVySWRBbHJlYWR5SW5Vc2UpKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgQ3JlYXRlIGluZGlyZWN0IHN0dWJzIG93bmVyICIgPDwgSWQgPDwgIlxuIik7CisgICAgSW5kaXJlY3RTdHVic093bmVyc1tJZF0gPSBJU0Jsb2NrT3duZXJMaXN0KCk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBFcnJvciBoYW5kbGVEZXJlZ2lzdGVyRUhGcmFtZXMoSklUVGFyZ2V0QWRkcmVzcyBUQWRkciwgdWludDMyX3QgU2l6ZSkgeworICAgIHVpbnQ4X3QgKkFkZHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihUQWRkcikpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiICBSZWdpc3RlcmluZyBFSCBmcmFtZXMgYXQgIiA8PCBmb3JtYXQoIjB4JTAxNngiLCBUQWRkcikKKyAgICAgICAgICAgICAgICAgPDwgIiwgU2l6ZSA9ICIgPDwgU2l6ZSA8PCAiIGJ5dGVzXG4iKTsKKyAgICBFSEZyYW1lc0RlcmVnaXN0ZXIoQWRkciwgU2l6ZSk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBFcnJvciBoYW5kbGVEZXN0cm95UmVtb3RlQWxsb2NhdG9yKFJlc291cmNlSWRNZ3I6OlJlc291cmNlSWQgSWQpIHsKKyAgICBhdXRvIEkgPSBBbGxvY2F0b3JzLmZpbmQoSWQpOworICAgIGlmIChJID09IEFsbG9jYXRvcnMuZW5kKCkpCisgICAgICByZXR1cm4gZXJyb3JDb2RlVG9FcnJvcigKKyAgICAgICAgICAgICAgIG9yY0Vycm9yKE9yY0Vycm9yQ29kZTo6UmVtb3RlQWxsb2NhdG9yRG9lc05vdEV4aXN0KSk7CisgICAgQWxsb2NhdG9ycy5lcmFzZShJKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgRGVzdHJveWVkIGFsbG9jYXRvciAiIDw8IElkIDw8ICJcbiIpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXJyb3IgaGFuZGxlRGVzdHJveUluZGlyZWN0U3R1YnNPd25lcihSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkIElkKSB7CisgICAgYXV0byBJID0gSW5kaXJlY3RTdHVic093bmVycy5maW5kKElkKTsKKyAgICBpZiAoSSA9PSBJbmRpcmVjdFN0dWJzT3duZXJzLmVuZCgpKQorICAgICAgcmV0dXJuIGVycm9yQ29kZVRvRXJyb3IoCisgICAgICAgICAgICAgICBvcmNFcnJvcihPcmNFcnJvckNvZGU6OlJlbW90ZUluZGlyZWN0U3R1YnNPd25lckRvZXNOb3RFeGlzdCkpOworICAgIEluZGlyZWN0U3R1YnNPd25lcnMuZXJhc2UoSSk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBFeHBlY3RlZDxzdGQ6OnR1cGxlPEpJVFRhcmdldEFkZHJlc3MsIEpJVFRhcmdldEFkZHJlc3MsIHVpbnQzMl90Pj4KKyAgaGFuZGxlRW1pdEluZGlyZWN0U3R1YnMoUmVzb3VyY2VJZE1ncjo6UmVzb3VyY2VJZCBJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTnVtU3R1YnNSZXF1aXJlZCkgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiICBJU01nciAiIDw8IElkIDw8ICIgcmVxdWVzdCAiIDw8IE51bVN0dWJzUmVxdWlyZWQKKyAgICAgICAgICAgICAgICAgPDwgIiBzdHVicy5cbiIpOworCisgICAgYXV0byBTdHViT3duZXJJdHIgPSBJbmRpcmVjdFN0dWJzT3duZXJzLmZpbmQoSWQpOworICAgIGlmIChTdHViT3duZXJJdHIgPT0gSW5kaXJlY3RTdHVic093bmVycy5lbmQoKSkKKyAgICAgIHJldHVybiBlcnJvckNvZGVUb0Vycm9yKAorICAgICAgICAgICAgICAgb3JjRXJyb3IoT3JjRXJyb3JDb2RlOjpSZW1vdGVJbmRpcmVjdFN0dWJzT3duZXJEb2VzTm90RXhpc3QpKTsKKworICAgIHR5cGVuYW1lIFRhcmdldFQ6OkluZGlyZWN0U3R1YnNJbmZvIElTOworICAgIGlmIChhdXRvIEVyciA9CisgICAgICAgICAgICBUYXJnZXRUOjplbWl0SW5kaXJlY3RTdHVic0Jsb2NrKElTLCBOdW1TdHVic1JlcXVpcmVkLCBudWxscHRyKSkKKyAgICAgIHJldHVybiBzdGQ6Om1vdmUoRXJyKTsKKworICAgIEpJVFRhcmdldEFkZHJlc3MgU3R1YnNCYXNlID0gc3RhdGljX2Nhc3Q8SklUVGFyZ2V0QWRkcmVzcz4oCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihJUy5nZXRTdHViKDApKSk7CisgICAgSklUVGFyZ2V0QWRkcmVzcyBQdHJzQmFzZSA9IHN0YXRpY19jYXN0PEpJVFRhcmdldEFkZHJlc3M+KAorICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oSVMuZ2V0UHRyKDApKSk7CisgICAgdWludDMyX3QgTnVtU3R1YnNFbWl0dGVkID0gSVMuZ2V0TnVtU3R1YnMoKTsKKworICAgIGF1dG8gJkJsb2NrTGlzdCA9IFN0dWJPd25lckl0ci0+c2Vjb25kOworICAgIEJsb2NrTGlzdC5wdXNoX2JhY2soc3RkOjptb3ZlKElTKSk7CisKKyAgICByZXR1cm4gc3RkOjptYWtlX3R1cGxlKFN0dWJzQmFzZSwgUHRyc0Jhc2UsIE51bVN0dWJzRW1pdHRlZCk7CisgIH0KKworICBFcnJvciBoYW5kbGVFbWl0UmVzb2x2ZXJCbG9jaygpIHsKKyAgICBzdGQ6OmVycm9yX2NvZGUgRUM7CisgICAgUmVzb2x2ZXJCbG9jayA9IHN5czo6T3duaW5nTWVtb3J5QmxvY2soc3lzOjpNZW1vcnk6OmFsbG9jYXRlTWFwcGVkTWVtb3J5KAorICAgICAgICBUYXJnZXRUOjpSZXNvbHZlckNvZGVTaXplLCBudWxscHRyLAorICAgICAgICBzeXM6Ok1lbW9yeTo6TUZfUkVBRCB8IHN5czo6TWVtb3J5OjpNRl9XUklURSwgRUMpKTsKKyAgICBpZiAoRUMpCisgICAgICByZXR1cm4gZXJyb3JDb2RlVG9FcnJvcihFQyk7CisKKyAgICBUYXJnZXRUOjp3cml0ZVJlc29sdmVyQ29kZShzdGF0aWNfY2FzdDx1aW50OF90ICo+KFJlc29sdmVyQmxvY2suYmFzZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVlbnRlciwgdGhpcyk7CisKKyAgICByZXR1cm4gZXJyb3JDb2RlVG9FcnJvcihzeXM6Ok1lbW9yeTo6cHJvdGVjdE1hcHBlZE1lbW9yeSgKKyAgICAgICAgUmVzb2x2ZXJCbG9jay5nZXRNZW1vcnlCbG9jaygpLAorICAgICAgICBzeXM6Ok1lbW9yeTo6TUZfUkVBRCB8IHN5czo6TWVtb3J5OjpNRl9FWEVDKSk7CisgIH0KKworICBFeHBlY3RlZDxzdGQ6OnR1cGxlPEpJVFRhcmdldEFkZHJlc3MsIHVpbnQzMl90Pj4gaGFuZGxlRW1pdFRyYW1wb2xpbmVCbG9jaygpIHsKKyAgICBzdGQ6OmVycm9yX2NvZGUgRUM7CisgICAgYXV0byBUcmFtcG9saW5lQmxvY2sgPQorICAgICAgICBzeXM6Ok93bmluZ01lbW9yeUJsb2NrKHN5czo6TWVtb3J5OjphbGxvY2F0ZU1hcHBlZE1lbW9yeSgKKyAgICAgICAgICAgIHN5czo6UHJvY2Vzczo6Z2V0UGFnZVNpemUoKSwgbnVsbHB0ciwKKyAgICAgICAgICAgIHN5czo6TWVtb3J5OjpNRl9SRUFEIHwgc3lzOjpNZW1vcnk6Ok1GX1dSSVRFLCBFQykpOworICAgIGlmIChFQykKKyAgICAgIHJldHVybiBlcnJvckNvZGVUb0Vycm9yKEVDKTsKKworICAgIHVpbnQzMl90IE51bVRyYW1wb2xpbmVzID0KKyAgICAgICAgKHN5czo6UHJvY2Vzczo6Z2V0UGFnZVNpemUoKSAtIFRhcmdldFQ6OlBvaW50ZXJTaXplKSAvCisgICAgICAgIFRhcmdldFQ6OlRyYW1wb2xpbmVTaXplOworCisgICAgdWludDhfdCAqVHJhbXBvbGluZU1lbSA9IHN0YXRpY19jYXN0PHVpbnQ4X3QgKj4oVHJhbXBvbGluZUJsb2NrLmJhc2UoKSk7CisgICAgVGFyZ2V0VDo6d3JpdGVUcmFtcG9saW5lcyhUcmFtcG9saW5lTWVtLCBSZXNvbHZlckJsb2NrLmJhc2UoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVRyYW1wb2xpbmVzKTsKKworICAgIEVDID0gc3lzOjpNZW1vcnk6OnByb3RlY3RNYXBwZWRNZW1vcnkoVHJhbXBvbGluZUJsb2NrLmdldE1lbW9yeUJsb2NrKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXM6Ok1lbW9yeTo6TUZfUkVBRCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzOjpNZW1vcnk6Ok1GX0VYRUMpOworCisgICAgVHJhbXBvbGluZUJsb2Nrcy5wdXNoX2JhY2soc3RkOjptb3ZlKFRyYW1wb2xpbmVCbG9jaykpOworCisgICAgYXV0byBUcmFtcG9saW5lQmFzZUFkZHIgPSBzdGF0aWNfY2FzdDxKSVRUYXJnZXRBZGRyZXNzPigKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFRyYW1wb2xpbmVNZW0pKTsKKworICAgIHJldHVybiBzdGQ6Om1ha2VfdHVwbGUoVHJhbXBvbGluZUJhc2VBZGRyLCBOdW1UcmFtcG9saW5lcyk7CisgIH0KKworICBFeHBlY3RlZDxKSVRUYXJnZXRBZGRyZXNzPiBoYW5kbGVHZXRTeW1ib2xBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgICAgSklUVGFyZ2V0QWRkcmVzcyBBZGRyID0gU3ltYm9sTG9va3VwKE5hbWUpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiICBTeW1ib2wgJyIgPDwgTmFtZSA8PCAiJyA9ICAiIDw8IGZvcm1hdCgiMHglMDE2eCIsIEFkZHIpCisgICAgICAgICAgICAgICAgIDw8ICJcbiIpOworICAgIHJldHVybiBBZGRyOworICB9CisKKyAgRXhwZWN0ZWQ8c3RkOjp0dXBsZTxzdGQ6OnN0cmluZywgdWludDMyX3QsIHVpbnQzMl90LCB1aW50MzJfdCwgdWludDMyX3Q+PgorICBoYW5kbGVHZXRSZW1vdGVJbmZvKCkgeworICAgIHN0ZDo6c3RyaW5nIFByb2Nlc3NUcmlwbGUgPSBzeXM6OmdldFByb2Nlc3NUcmlwbGUoKTsKKyAgICB1aW50MzJfdCBQb2ludGVyU2l6ZSA9IFRhcmdldFQ6OlBvaW50ZXJTaXplOworICAgIHVpbnQzMl90IFBhZ2VTaXplID0gc3lzOjpQcm9jZXNzOjpnZXRQYWdlU2l6ZSgpOworICAgIHVpbnQzMl90IFRyYW1wb2xpbmVTaXplID0gVGFyZ2V0VDo6VHJhbXBvbGluZVNpemU7CisgICAgdWludDMyX3QgSW5kaXJlY3RTdHViU2l6ZSA9IFRhcmdldFQ6OkluZGlyZWN0U3R1YnNJbmZvOjpTdHViU2l6ZTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgUmVtb3RlIGluZm86XG4iCisgICAgICAgICAgICAgICAgIDw8ICIgICAgdHJpcGxlICAgICAgICAgICAgID0gJyIgPDwgUHJvY2Vzc1RyaXBsZSA8PCAiJ1xuIgorICAgICAgICAgICAgICAgICA8PCAiICAgIHBvaW50ZXIgc2l6ZSAgICAgICA9ICIgPDwgUG9pbnRlclNpemUgPDwgIlxuIgorICAgICAgICAgICAgICAgICA8PCAiICAgIHBhZ2Ugc2l6ZSAgICAgICAgICA9ICIgPDwgUGFnZVNpemUgPDwgIlxuIgorICAgICAgICAgICAgICAgICA8PCAiICAgIHRyYW1wb2xpbmUgc2l6ZSAgICA9ICIgPDwgVHJhbXBvbGluZVNpemUgPDwgIlxuIgorICAgICAgICAgICAgICAgICA8PCAiICAgIGluZGlyZWN0IHN0dWIgc2l6ZSA9ICIgPDwgSW5kaXJlY3RTdHViU2l6ZSA8PCAiXG4iKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3R1cGxlKFByb2Nlc3NUcmlwbGUsIFBvaW50ZXJTaXplLCBQYWdlU2l6ZSwgVHJhbXBvbGluZVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRpcmVjdFN0dWJTaXplKTsKKyAgfQorCisgIEV4cGVjdGVkPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBoYW5kbGVSZWFkTWVtKEpJVFRhcmdldEFkZHJlc3MgUlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZSkgeworICAgIHVpbnQ4X3QgKlNyYyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDhfdCAqPihzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KFJTcmMpKTsKKworICAgIERFQlVHKGRiZ3MoKSA8PCAiICBSZWFkaW5nICIgPDwgU2l6ZSA8PCAiIGJ5dGVzIGZyb20gIgorICAgICAgICAgICAgICAgICA8PCBmb3JtYXQoIjB4JTAxNngiLCBSU3JjKSA8PCAiXG4iKTsKKworICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEJ1ZmZlcjsKKyAgICBCdWZmZXIucmVzaXplKFNpemUpOworICAgIGZvciAodWludDhfdCAqUCA9IFNyYzsgU2l6ZSAhPSAwOyAtLVNpemUpCisgICAgICBCdWZmZXIucHVzaF9iYWNrKCpQKyspOworCisgICAgcmV0dXJuIEJ1ZmZlcjsKKyAgfQorCisgIEVycm9yIGhhbmRsZVJlZ2lzdGVyRUhGcmFtZXMoSklUVGFyZ2V0QWRkcmVzcyBUQWRkciwgdWludDMyX3QgU2l6ZSkgeworICAgIHVpbnQ4X3QgKkFkZHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4X3QgKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihUQWRkcikpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiICBSZWdpc3RlcmluZyBFSCBmcmFtZXMgYXQgIiA8PCBmb3JtYXQoIjB4JTAxNngiLCBUQWRkcikKKyAgICAgICAgICAgICAgICAgPDwgIiwgU2l6ZSA9ICIgPDwgU2l6ZSA8PCAiIGJ5dGVzXG4iKTsKKyAgICBFSEZyYW1lc1JlZ2lzdGVyKEFkZHIsIFNpemUpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXhwZWN0ZWQ8SklUVGFyZ2V0QWRkcmVzcz4gaGFuZGxlUmVzZXJ2ZU1lbShSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkIElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUsIHVpbnQzMl90IEFsaWduKSB7CisgICAgYXV0byBJID0gQWxsb2NhdG9ycy5maW5kKElkKTsKKyAgICBpZiAoSSA9PSBBbGxvY2F0b3JzLmVuZCgpKQorICAgICAgcmV0dXJuIGVycm9yQ29kZVRvRXJyb3IoCisgICAgICAgICAgICAgICBvcmNFcnJvcihPcmNFcnJvckNvZGU6OlJlbW90ZUFsbG9jYXRvckRvZXNOb3RFeGlzdCkpOworICAgIGF1dG8gJkFsbG9jYXRvciA9IEktPnNlY29uZDsKKyAgICB2b2lkICpMb2NhbEFsbG9jQWRkciA9IG51bGxwdHI7CisgICAgaWYgKGF1dG8gRXJyID0gQWxsb2NhdG9yLmFsbG9jYXRlKExvY2FsQWxsb2NBZGRyLCBTaXplLCBBbGlnbikpCisgICAgICByZXR1cm4gc3RkOjptb3ZlKEVycik7CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIiAgQWxsb2NhdG9yICIgPDwgSWQgPDwgIiByZXNlcnZlZCAiIDw8IExvY2FsQWxsb2NBZGRyCisgICAgICAgICAgICAgICAgIDw8ICIgKCIgPDwgU2l6ZSA8PCAiIGJ5dGVzLCBhbGlnbm1lbnQgIiA8PCBBbGlnbiA8PCAiKVxuIik7CisKKyAgICBKSVRUYXJnZXRBZGRyZXNzIEFsbG9jQWRkciA9IHN0YXRpY19jYXN0PEpJVFRhcmdldEFkZHJlc3M+KAorICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oTG9jYWxBbGxvY0FkZHIpKTsKKworICAgIHJldHVybiBBbGxvY0FkZHI7CisgIH0KKworICBFcnJvciBoYW5kbGVTZXRQcm90ZWN0aW9ucyhSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkIElkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVRUYXJnZXRBZGRyZXNzIEFkZHIsIHVpbnQzMl90IEZsYWdzKSB7CisgICAgYXV0byBJID0gQWxsb2NhdG9ycy5maW5kKElkKTsKKyAgICBpZiAoSSA9PSBBbGxvY2F0b3JzLmVuZCgpKQorICAgICAgcmV0dXJuIGVycm9yQ29kZVRvRXJyb3IoCisgICAgICAgICAgICAgICBvcmNFcnJvcihPcmNFcnJvckNvZGU6OlJlbW90ZUFsbG9jYXRvckRvZXNOb3RFeGlzdCkpOworICAgIGF1dG8gJkFsbG9jYXRvciA9IEktPnNlY29uZDsKKyAgICB2b2lkICpMb2NhbEFkZHIgPSByZWludGVycHJldF9jYXN0PHZvaWQgKj4oc3RhdGljX2Nhc3Q8dWludHB0cl90PihBZGRyKSk7CisgICAgREVCVUcoZGJncygpIDw8ICIgIEFsbG9jYXRvciAiIDw8IElkIDw8ICIgc2V0IHBlcm1pc3Npb25zIG9uICIgPDwgTG9jYWxBZGRyCisgICAgICAgICAgICAgICAgIDw8ICIgdG8gIiA8PCAoRmxhZ3MgJiBzeXM6Ok1lbW9yeTo6TUZfUkVBRCA/ICdSJyA6ICctJykKKyAgICAgICAgICAgICAgICAgPDwgKEZsYWdzICYgc3lzOjpNZW1vcnk6Ok1GX1dSSVRFID8gJ1cnIDogJy0nKQorICAgICAgICAgICAgICAgICA8PCAoRmxhZ3MgJiBzeXM6Ok1lbW9yeTo6TUZfRVhFQyA/ICdYJyA6ICctJykgPDwgIlxuIik7CisgICAgcmV0dXJuIEFsbG9jYXRvci5zZXRQcm90ZWN0aW9ucyhMb2NhbEFkZHIsIEZsYWdzKTsKKyAgfQorCisgIEVycm9yIGhhbmRsZVRlcm1pbmF0ZVNlc3Npb24oKSB7CisgICAgVGVybWluYXRlRmxhZyA9IHRydWU7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBFcnJvciBoYW5kbGVXcml0ZU1lbShEaXJlY3RCdWZmZXJXcml0ZXIgREJXKSB7CisgICAgREVCVUcoZGJncygpIDw8ICIgIFdyaXRpbmcgIiA8PCBEQlcuZ2V0U2l6ZSgpIDw8ICIgYnl0ZXMgdG8gIgorICAgICAgICAgICAgICAgICA8PCBmb3JtYXQoIjB4JTAxNngiLCBEQlcuZ2V0RHN0KCkpIDw8ICJcbiIpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXJyb3IgaGFuZGxlV3JpdGVQdHIoSklUVGFyZ2V0QWRkcmVzcyBBZGRyLCBKSVRUYXJnZXRBZGRyZXNzIFB0clZhbCkgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiICBXcml0aW5nIHBvaW50ZXIgKiIgPDwgZm9ybWF0KCIweCUwMTZ4IiwgQWRkcikgPDwgIiA9ICIKKyAgICAgICAgICAgICAgICAgPDwgZm9ybWF0KCIweCUwMTZ4IiwgUHRyVmFsKSA8PCAiXG4iKTsKKyAgICB1aW50cHRyX3QgKlB0ciA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90ICo+KHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oQWRkcikpOworICAgICpQdHIgPSBzdGF0aWNfY2FzdDx1aW50cHRyX3Q+KFB0clZhbCk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBTeW1ib2xMb29rdXBGdG9yIFN5bWJvbExvb2t1cDsKKyAgRUhGcmFtZVJlZ2lzdHJhdGlvbkZ0b3IgRUhGcmFtZXNSZWdpc3RlciwgRUhGcmFtZXNEZXJlZ2lzdGVyOworICBzdGQ6Om1hcDxSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkLCBBbGxvY2F0b3I+IEFsbG9jYXRvcnM7CisgIHVzaW5nIElTQmxvY2tPd25lckxpc3QgPSBzdGQ6OnZlY3Rvcjx0eXBlbmFtZSBUYXJnZXRUOjpJbmRpcmVjdFN0dWJzSW5mbz47CisgIHN0ZDo6bWFwPFJlc291cmNlSWRNZ3I6OlJlc291cmNlSWQsIElTQmxvY2tPd25lckxpc3Q+IEluZGlyZWN0U3R1YnNPd25lcnM7CisgIHN5czo6T3duaW5nTWVtb3J5QmxvY2sgUmVzb2x2ZXJCbG9jazsKKyAgc3RkOjp2ZWN0b3I8c3lzOjpPd25pbmdNZW1vcnlCbG9jaz4gVHJhbXBvbGluZUJsb2NrczsKKyAgYm9vbCBUZXJtaW5hdGVGbGFnID0gZmFsc2U7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgcmVtb3RlCit9IC8vIGVuZCBuYW1lc3BhY2Ugb3JjCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjdW5kZWYgREVCVUdfVFlQRQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX09SQ1JFTU9URVRBUkdFVFNFUlZFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvUlBDU2VyaWFsaXphdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL1JQQ1NlcmlhbGl6YXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjljNTA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL1JQQ1NlcmlhbGl6YXRpb24uaApAQCAtMCwwICsxLDYwOSBAQAorLy89PT0tIGxsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9SUENTZXJpYWxpemF0aW9uLmggLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfUlBDU0VSSUFMSVpBVElPTl9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19SUENTRVJJQUxJWkFUSU9OX0gKKworI2luY2x1ZGUgIk9yY0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3RocmVhZC5oIgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb3JjIHsKK25hbWVzcGFjZSBycGMgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFJQQ1R5cGVOYW1lOworCisvLy8gVHlwZU5hbWVTZXF1ZW5jZSBpcyBhIHV0aWxpdHkgZm9yIHJlbmRlcmluZyBzZXF1ZW5jZXMgb2YgdHlwZXMgdG8gYSBzdHJpbmcKKy8vLyBieSByZW5kZXJpbmcgZWFjaCB0eXBlLCBzZXBhcmF0ZWQgYnkgIiwgIi4KK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdUcz4gY2xhc3MgUlBDVHlwZU5hbWVTZXF1ZW5jZSB7fTsKKworLy8vIFJlbmRlciBhbiBlbXB0eSBUeXBlTmFtZVNlcXVlbmNlIHRvIGFuIG9zdHJlYW0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT1N0cmVhbT4KK09TdHJlYW0gJm9wZXJhdG9yPDwoT1N0cmVhbSAmT1MsIGNvbnN0IFJQQ1R5cGVOYW1lU2VxdWVuY2U8PiAmVikgeworICByZXR1cm4gT1M7Cit9CisKKy8vLyBSZW5kZXIgYSBUeXBlTmFtZVNlcXVlbmNlIG9mIGEgc2luZ2xlIHR5cGUgdG8gYW4gb3N0cmVhbS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBPU3RyZWFtLCB0eXBlbmFtZSBBcmdUPgorT1N0cmVhbSAmb3BlcmF0b3I8PChPU3RyZWFtICZPUywgY29uc3QgUlBDVHlwZU5hbWVTZXF1ZW5jZTxBcmdUPiAmVikgeworICBPUyA8PCBSUENUeXBlTmFtZTxBcmdUPjo6Z2V0TmFtZSgpOworICByZXR1cm4gT1M7Cit9CisKKy8vLyBSZW5kZXIgYSBUeXBlTmFtZVNlcXVlbmNlIG9mIG1vcmUgdGhhbiBvbmUgdHlwZSB0byBhbiBvc3RyZWFtLgordGVtcGxhdGUgPHR5cGVuYW1lIE9TdHJlYW0sIHR5cGVuYW1lIEFyZ1QxLCB0eXBlbmFtZSBBcmdUMiwgdHlwZW5hbWUuLi4gQXJnVHM+CitPU3RyZWFtJgorb3BlcmF0b3I8PChPU3RyZWFtICZPUywgY29uc3QgUlBDVHlwZU5hbWVTZXF1ZW5jZTxBcmdUMSwgQXJnVDIsIEFyZ1RzLi4uPiAmVikgeworICBPUyA8PCBSUENUeXBlTmFtZTxBcmdUMT46OmdldE5hbWUoKSA8PCAiLCAiCisgICAgIDw8IFJQQ1R5cGVOYW1lU2VxdWVuY2U8QXJnVDIsIEFyZ1RzLi4uPigpOworICByZXR1cm4gT1M7Cit9CisKK3RlbXBsYXRlIDw+CitjbGFzcyBSUENUeXBlTmFtZTx2b2lkPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCkgeyByZXR1cm4gInZvaWQiOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgUlBDVHlwZU5hbWU8aW50OF90PiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCkgeyByZXR1cm4gImludDhfdCI7IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBSUENUeXBlTmFtZTx1aW50OF90PiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCkgeyByZXR1cm4gInVpbnQ4X3QiOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgUlBDVHlwZU5hbWU8aW50MTZfdD4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpIHsgcmV0dXJuICJpbnQxNl90IjsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIFJQQ1R5cGVOYW1lPHVpbnQxNl90PiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCkgeyByZXR1cm4gInVpbnQxNl90IjsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIFJQQ1R5cGVOYW1lPGludDMyX3Q+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKSB7IHJldHVybiAiaW50MzJfdCI7IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBSUENUeXBlTmFtZTx1aW50MzJfdD4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpIHsgcmV0dXJuICJ1aW50MzJfdCI7IH0KK307CisKK3RlbXBsYXRlIDw+CitjbGFzcyBSUENUeXBlTmFtZTxpbnQ2NF90PiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCkgeyByZXR1cm4gImludDY0X3QiOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgUlBDVHlwZU5hbWU8dWludDY0X3Q+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKSB7IHJldHVybiAidWludDY0X3QiOyB9Cit9OworCit0ZW1wbGF0ZSA8PgorY2xhc3MgUlBDVHlwZU5hbWU8Ym9vbD4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpIHsgcmV0dXJuICJib29sIjsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIFJQQ1R5cGVOYW1lPHN0ZDo6c3RyaW5nPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCkgeyByZXR1cm4gInN0ZDo6c3RyaW5nIjsgfQorfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIFJQQ1R5cGVOYW1lPEVycm9yPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCkgeyByZXR1cm4gIkVycm9yIjsgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBSUENUeXBlTmFtZTxFeHBlY3RlZDxUPj4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgY2hhciogZ2V0TmFtZSgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gTG9jayhOYW1lTXV0ZXgpOworICAgIGlmIChOYW1lLmVtcHR5KCkpCisgICAgICByYXdfc3RyaW5nX29zdHJlYW0oTmFtZSkgPDwgIkV4cGVjdGVkPCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBSUENUeXBlTmFtZVNlcXVlbmNlPFQ+KCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiPiI7CisgICAgcmV0dXJuIE5hbWUuZGF0YSgpOworICB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyBzdGQ6Om11dGV4IE5hbWVNdXRleDsKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIE5hbWU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6bXV0ZXggUlBDVHlwZU5hbWU8RXhwZWN0ZWQ8VD4+OjpOYW1lTXV0ZXg7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpzdHJpbmcgUlBDVHlwZU5hbWU8RXhwZWN0ZWQ8VD4+OjpOYW1lOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorY2xhc3MgUlBDVHlwZU5hbWU8c3RkOjpwYWlyPFQxLCBUMj4+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IExvY2soTmFtZU11dGV4KTsKKyAgICBpZiAoTmFtZS5lbXB0eSgpKQorICAgICAgcmF3X3N0cmluZ19vc3RyZWFtKE5hbWUpIDw8ICJzdGQ6OnBhaXI8IiA8PCBSUENUeXBlTmFtZVNlcXVlbmNlPFQxLCBUMj4oKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICI+IjsKKyAgICByZXR1cm4gTmFtZS5kYXRhKCk7CisgIH0KK3ByaXZhdGU6CisgIHN0YXRpYyBzdGQ6Om11dGV4IE5hbWVNdXRleDsKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIE5hbWU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgorc3RkOjptdXRleCBSUENUeXBlTmFtZTxzdGQ6OnBhaXI8VDEsIFQyPj46Ok5hbWVNdXRleDsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitzdGQ6OnN0cmluZyBSUENUeXBlTmFtZTxzdGQ6OnBhaXI8VDEsIFQyPj46Ok5hbWU7CisKK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdUcz4KK2NsYXNzIFJQQ1R5cGVOYW1lPHN0ZDo6dHVwbGU8QXJnVHMuLi4+PiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBjaGFyKiBnZXROYW1lKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBMb2NrKE5hbWVNdXRleCk7CisgICAgaWYgKE5hbWUuZW1wdHkoKSkKKyAgICAgIHJhd19zdHJpbmdfb3N0cmVhbShOYW1lKSA8PCAic3RkOjp0dXBsZTwiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgUlBDVHlwZU5hbWVTZXF1ZW5jZTxBcmdUcy4uLj4oKSA8PCAiPiI7CisgICAgcmV0dXJuIE5hbWUuZGF0YSgpOworICB9Citwcml2YXRlOgorICBzdGF0aWMgc3RkOjptdXRleCBOYW1lTXV0ZXg7CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBOYW1lOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ1RzPgorc3RkOjptdXRleCBSUENUeXBlTmFtZTxzdGQ6OnR1cGxlPEFyZ1RzLi4uPj46Ok5hbWVNdXRleDsKK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdUcz4KK3N0ZDo6c3RyaW5nIFJQQ1R5cGVOYW1lPHN0ZDo6dHVwbGU8QXJnVHMuLi4+Pjo6TmFtZTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBSUENUeXBlTmFtZTxzdGQ6OnZlY3RvcjxUPj4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgY2hhcipnZXROYW1lKCkgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBMb2NrKE5hbWVNdXRleCk7CisgICAgaWYgKE5hbWUuZW1wdHkoKSkKKyAgICAgIHJhd19zdHJpbmdfb3N0cmVhbShOYW1lKSA8PCAic3RkOjp2ZWN0b3I8IiA8PCBSUENUeXBlTmFtZTxUPjo6Z2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgIj4iOworICAgIHJldHVybiBOYW1lLmRhdGEoKTsKKyAgfQorCitwcml2YXRlOgorICBzdGF0aWMgc3RkOjptdXRleCBOYW1lTXV0ZXg7CisgIHN0YXRpYyBzdGQ6OnN0cmluZyBOYW1lOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6Om11dGV4IFJQQ1R5cGVOYW1lPHN0ZDo6dmVjdG9yPFQ+Pjo6TmFtZU11dGV4OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnN0cmluZyBSUENUeXBlTmFtZTxzdGQ6OnZlY3RvcjxUPj46Ok5hbWU7CisKKworLy8vIFRoZSBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBUPiBjbGFzcyBkZXNjcmliZXMgaG93IHRvIHNlcmlhbGl6ZSBhbmQKKy8vLyBkZXNlcmlhbGl6ZSBhbiBpbnN0YW5jZSBvZiB0eXBlIFQgdG8vZnJvbSBhbiBhYnN0cmFjdCBjaGFubmVsIG9mIHR5cGUKKy8vLyBDaGFubmVsVC4gSXQgYWxzbyBwcm92aWRlcyBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0eXBlJ3MgbmFtZSB2aWEgdGhlCisvLy8gZ2V0TmFtZSBtZXRob2QuCisvLy8KKy8vLyBTcGVjaWFsaXphdGlvbnMgb2YgdGhpcyBjbGFzcyBzaG91bGQgcHJvdmlkZSB0aGUgZm9sbG93aW5nIGZ1bmN0aW9uczoKKy8vLworLy8vICAgQGNvZGV7LmNwcH0KKy8vLworLy8vICAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKTsKKy8vLyAgIHN0YXRpYyBFcnJvciBzZXJpYWxpemUoQ2hhbm5lbFQmLCBjb25zdCBUJik7CisvLy8gICBzdGF0aWMgRXJyb3IgZGVzZXJpYWxpemUoQ2hhbm5lbFQmLCBUJik7CisvLy8KKy8vLyAgIEBlbmRjb2RlCisvLy8KKy8vLyBUaGUgdGhpcmQgYXJndW1lbnQgb2YgU2VyaWFsaXphdGlvblRyYWl0cyBpcyBpbnRlbmRlZCB0byBzdXBwb3J0IFNGSU5BRS4KKy8vLyBFLmcuOgorLy8vCisvLy8gICBAY29kZXsuY3BwfQorLy8vCisvLy8gICBjbGFzcyBNeVZpcnR1YWxDaGFubmVsIHsgLi4uIH07CisvLy8KKy8vLyAgIHRlbXBsYXRlIDxEZXJpdmVkQ2hhbm5lbFQ+CisvLy8gICBjbGFzcyBTZXJpYWxpemF0aW9uVHJhaXRzPERlcml2ZWRDaGFubmVsVCwgYm9vbCwKKy8vLyAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorLy8vICAgICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8VmlydENoYW5uZWwsIERlcml2ZWRDaGFubmVsPjo6dmFsdWUKKy8vLyAgICAgICAgID46OnR5cGU+IHsKKy8vLyAgIHB1YmxpYzoKKy8vLyAgICAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE5hbWUoKSB7IC4uLiB9OworLy8vICAgfQorLy8vCisvLy8gICBAZW5kY29kZQordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZSBXaXJlVHlwZSwKKyAgICAgICAgICB0eXBlbmFtZSBDb25jcmV0ZVR5cGUgPSBXaXJlVHlwZSwgdHlwZW5hbWUgPSB2b2lkPgorY2xhc3MgU2VyaWFsaXphdGlvblRyYWl0czsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxUPgorY2xhc3MgU2VxdWVuY2VUcmFpdHMgeworcHVibGljOgorICBzdGF0aWMgRXJyb3IgZW1pdFNlcGFyYXRvcihDaGFubmVsVCAmQykgeyByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsgfQorICBzdGF0aWMgRXJyb3IgY29uc3VtZVNlcGFyYXRvcihDaGFubmVsVCAmQykgeyByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsgfQorfTsKKworLy8vIFV0aWxpdHkgY2xhc3MgZm9yIHNlcmlhbGl6aW5nIHNlcXVlbmNlcyBvZiB2YWx1ZXMgb2YgdmFyeWluZyB0eXBlcy4KKy8vLyBTcGVjaWFsaXphdGlvbnMgb2YgdGhpcyBjbGFzcyBjb250YWluICdzZXJpYWxpemUnIGFuZCAnZGVzZXJpYWxpemUnIG1ldGhvZHMKKy8vLyBmb3IgdGhlIGdpdmVuIGNoYW5uZWwuIFRoZSBBcmdUcy4uLiBsaXN0IHdpbGwgZGV0ZXJtaW5lIHRoZSAib3Zlci10aGUtd2lyZSIKKy8vLyB0eXBlcyB0byBiZSBzZXJpYWxpemVkLiBUaGUgc2VyaWFsaXplIGFuZCBkZXNlcmlhbGl6ZSBtZXRob2RzIHRha2UgYSBsaXN0CisvLy8gQ0FyZ1RzLi4uICgiY2FsbGVyIGFyZyB0eXBlcyIpIHdoaWNoIG11c3QgYmUgdGhlIHNhbWUgbGVuZ3RoIGFzIEFyZ1RzLi4uLAorLy8vIGJ1dCBtYXkgYmUgZGlmZmVyZW50IHR5cGVzIGZyb20gQXJnVHMsIHByb3ZpZGVkIHRoYXQgZm9yIGVhY2ggQ0FyZ1QgdGhlcmUKKy8vLyBpcyBhIFNlcmlhbGl6YXRpb25UcmFpdHMgc3BlY2lhbGl6YXRpb24KKy8vLyBTZXJpYWxpemVUcmFpdHM8Q2hhbm5lbFQsIEFyZ1QsIENBcmdUPiB3aXRoIG1ldGhvZHMgdGhhdCBjYW4gc2VyaWFsaXplIHRoZQorLy8vIGNhbGxlciBhcmd1bWVudCB0byBvdmVyLXRoZS13aXJlIHZhbHVlLgordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZS4uLiBBcmdUcz4KK2NsYXNzIFNlcXVlbmNlU2VyaWFsaXphdGlvbjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxUPgorY2xhc3MgU2VxdWVuY2VTZXJpYWxpemF0aW9uPENoYW5uZWxUPiB7CitwdWJsaWM6CisgIHN0YXRpYyBFcnJvciBzZXJpYWxpemUoQ2hhbm5lbFQgJkMpIHsgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7IH0KKyAgc3RhdGljIEVycm9yIGRlc2VyaWFsaXplKENoYW5uZWxUICZDKSB7IHJldHVybiBFcnJvcjo6c3VjY2VzcygpOyB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQsIHR5cGVuYW1lIEFyZ1Q+CitjbGFzcyBTZXF1ZW5jZVNlcmlhbGl6YXRpb248Q2hhbm5lbFQsIEFyZ1Q+IHsKK3B1YmxpYzoKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ0FyZ1Q+CisgIHN0YXRpYyBFcnJvciBzZXJpYWxpemUoQ2hhbm5lbFQgJkMsIENBcmdUICYmQ0FyZykgeworICAgIHJldHVybiBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBBcmdULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZGVjYXk8Q0FyZ1Q+Ojp0eXBlPjo6CisgICAgICAgICAgICAgc2VyaWFsaXplKEMsIHN0ZDo6Zm9yd2FyZDxDQXJnVD4oQ0FyZykpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENBcmdUPgorICBzdGF0aWMgRXJyb3IgZGVzZXJpYWxpemUoQ2hhbm5lbFQgJkMsIENBcmdUICZDQXJnKSB7CisgICAgcmV0dXJuIFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIEFyZ1QsIENBcmdUPjo6ZGVzZXJpYWxpemUoQywgQ0FyZyk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUgQXJnVCwgdHlwZW5hbWUuLi4gQXJnVHM+CitjbGFzcyBTZXF1ZW5jZVNlcmlhbGl6YXRpb248Q2hhbm5lbFQsIEFyZ1QsIEFyZ1RzLi4uPiB7CitwdWJsaWM6CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENBcmdULCB0eXBlbmFtZS4uLiBDQXJnVHM+CisgIHN0YXRpYyBFcnJvciBzZXJpYWxpemUoQ2hhbm5lbFQgJkMsIENBcmdUICYmQ0FyZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDQXJnVHMgJiYuLi4gQ0FyZ3MpIHsKKyAgICBpZiAoYXV0byBFcnIgPQorICAgICAgICBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBBcmdULCB0eXBlbmFtZSBzdGQ6OmRlY2F5PENBcmdUPjo6dHlwZT46OgorICAgICAgICAgIHNlcmlhbGl6ZShDLCBzdGQ6OmZvcndhcmQ8Q0FyZ1Q+KENBcmcpKSkKKyAgICAgIHJldHVybiBFcnI7CisgICAgaWYgKGF1dG8gRXJyID0gU2VxdWVuY2VUcmFpdHM8Q2hhbm5lbFQ+OjplbWl0U2VwYXJhdG9yKEMpKQorICAgICAgcmV0dXJuIEVycjsKKyAgICByZXR1cm4gU2VxdWVuY2VTZXJpYWxpemF0aW9uPENoYW5uZWxULCBBcmdUcy4uLj46OgorICAgICAgICAgICAgIHNlcmlhbGl6ZShDLCBzdGQ6OmZvcndhcmQ8Q0FyZ1RzPihDQXJncykuLi4pOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENBcmdULCB0eXBlbmFtZS4uLiBDQXJnVHM+CisgIHN0YXRpYyBFcnJvciBkZXNlcmlhbGl6ZShDaGFubmVsVCAmQywgQ0FyZ1QgJkNBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDQXJnVHMgJi4uLiBDQXJncykgeworICAgIGlmIChhdXRvIEVyciA9CisgICAgICAgIFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIEFyZ1QsIENBcmdUPjo6ZGVzZXJpYWxpemUoQywgQ0FyZykpCisgICAgICByZXR1cm4gRXJyOworICAgIGlmIChhdXRvIEVyciA9IFNlcXVlbmNlVHJhaXRzPENoYW5uZWxUPjo6Y29uc3VtZVNlcGFyYXRvcihDKSkKKyAgICAgIHJldHVybiBFcnI7CisgICAgcmV0dXJuIFNlcXVlbmNlU2VyaWFsaXphdGlvbjxDaGFubmVsVCwgQXJnVHMuLi4+OjpkZXNlcmlhbGl6ZShDLCBDQXJncy4uLik7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUuLi4gQXJnVHM+CitFcnJvciBzZXJpYWxpemVTZXEoQ2hhbm5lbFQgJkMsIEFyZ1RzICYmLi4uIEFyZ3MpIHsKKyAgcmV0dXJuIFNlcXVlbmNlU2VyaWFsaXphdGlvbjxDaGFubmVsVCwgdHlwZW5hbWUgc3RkOjpkZWNheTxBcmdUcz46OnR5cGUuLi4+OjoKKyAgICAgICAgICAgc2VyaWFsaXplKEMsIHN0ZDo6Zm9yd2FyZDxBcmdUcz4oQXJncykuLi4pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQsIHR5cGVuYW1lLi4uIEFyZ1RzPgorRXJyb3IgZGVzZXJpYWxpemVTZXEoQ2hhbm5lbFQgJkMsIEFyZ1RzICYuLi4gQXJncykgeworICByZXR1cm4gU2VxdWVuY2VTZXJpYWxpemF0aW9uPENoYW5uZWxULCBBcmdUcy4uLj46OmRlc2VyaWFsaXplKEMsIEFyZ3MuLi4pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQ+CitjbGFzcyBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBFcnJvcj4geworcHVibGljOgorCisgIHVzaW5nIFdyYXBwZWRFcnJvclNlcmlhbGl6ZXIgPQorICAgIHN0ZDo6ZnVuY3Rpb248RXJyb3IoQ2hhbm5lbFQgJkMsIGNvbnN0IEVycm9ySW5mb0Jhc2UmKT47CisKKyAgdXNpbmcgV3JhcHBlZEVycm9yRGVzZXJpYWxpemVyID0KKyAgICBzdGQ6OmZ1bmN0aW9uPEVycm9yKENoYW5uZWxUICZDLCBFcnJvciAmRXJyKT47CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEVycm9ySW5mb1QsIHR5cGVuYW1lIFNlcmlhbGl6ZUZ0b3IsCisgICAgICAgICAgICB0eXBlbmFtZSBEZXNlcmlhbGl6ZUZ0b3I+CisgIHN0YXRpYyB2b2lkIHJlZ2lzdGVyRXJyb3JUeXBlKHN0ZDo6c3RyaW5nIE5hbWUsIFNlcmlhbGl6ZUZ0b3IgU2VyaWFsaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNlcmlhbGl6ZUZ0b3IgRGVzZXJpYWxpemUpIHsKKyAgICBhc3NlcnQoIU5hbWUuZW1wdHkoKSAmJgorICAgICAgICAgICAiVGhlIGVtcHR5IHN0cmluZyBpcyByZXNlcnZlZCBmb3IgdGhlIFN1Y2Nlc3MgdmFsdWUiKTsKKworICAgIGNvbnN0IHN0ZDo6c3RyaW5nICpLZXlOYW1lID0gbnVsbHB0cjsKKyAgICB7CisgICAgICAvLyBXZSdyZSBhYnVzaW5nIHRoZSBzdGFiaWxpdHkgb2Ygc3RkOjptYXAgaGVyZTogV2UgdGFrZSBhIHJlZmVyZW5jZSB0byB0aGUKKyAgICAgIC8vIGtleSBvZiB0aGUgZGVzZXJpYWxpemVycyBtYXAgdG8gc2F2ZSB1cyBmcm9tIGR1cGxpY2F0aW5nIHRoZSBzdHJpbmcgaW4KKyAgICAgIC8vIHRoZSBzZXJpYWxpemVyLiBUaGlzIHNob3VsZCBiZSBjaGFuZ2VkIHRvIHVzZSBhIHN0cmluZ3Bvb2wgaWYgd2Ugc3dpdGNoCisgICAgICAvLyB0byBhIG1hcCB0eXBlIHRoYXQgbWF5IG1vdmUga2V5cyBpbiBtZW1vcnkuCisgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjpyZWN1cnNpdmVfbXV0ZXg+IExvY2soRGVzZXJpYWxpemVyc011dGV4KTsKKyAgICAgIGF1dG8gSSA9CisgICAgICAgIERlc2VyaWFsaXplcnMuaW5zZXJ0KERlc2VyaWFsaXplcnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIoc3RkOjptb3ZlKE5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1vdmUoRGVzZXJpYWxpemUpKSk7CisgICAgICBLZXlOYW1lID0gJkktPmZpcnN0OworICAgIH0KKworICAgIHsKKyAgICAgIGFzc2VydChLZXlOYW1lICE9IG51bGxwdHIgJiYgIk5vIGtleW5hbWUgcG9pbnRlciIpOworICAgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBMb2NrKFNlcmlhbGl6ZXJzTXV0ZXgpOworICAgICAgLy8gRklYTUU6IE1vdmUgY2FwdHVyZSBTZXJpYWxpemUgb25jZSB3ZSBoYXZlIEMrKzE0LgorICAgICAgU2VyaWFsaXplcnNbRXJyb3JJbmZvVDo6Y2xhc3NJRCgpXSA9CisgICAgICAgICAgW0tleU5hbWUsIFNlcmlhbGl6ZV0oQ2hhbm5lbFQgJkMsIGNvbnN0IEVycm9ySW5mb0Jhc2UgJkVJQikgLT4gRXJyb3IgeworICAgICAgICBhc3NlcnQoRUlCLmR5bmFtaWNDbGFzc0lEKCkgPT0gRXJyb3JJbmZvVDo6Y2xhc3NJRCgpICYmCisgICAgICAgICAgICAgICAiU2VyaWFsaXplciBjYWxsZWQgZm9yIHdyb25nIGVycm9yIHR5cGUiKTsKKyAgICAgICAgaWYgKGF1dG8gRXJyID0gc2VyaWFsaXplU2VxKEMsICpLZXlOYW1lKSkKKyAgICAgICAgICByZXR1cm4gRXJyOworICAgICAgICByZXR1cm4gU2VyaWFsaXplKEMsIHN0YXRpY19jYXN0PGNvbnN0IEVycm9ySW5mb1QgJj4oRUlCKSk7CisgICAgICB9OworICAgIH0KKyAgfQorCisgIHN0YXRpYyBFcnJvciBzZXJpYWxpemUoQ2hhbm5lbFQgJkMsIEVycm9yICYmRXJyKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBMb2NrKFNlcmlhbGl6ZXJzTXV0ZXgpOworCisgICAgaWYgKCFFcnIpCisgICAgICByZXR1cm4gc2VyaWFsaXplU2VxKEMsIHN0ZDo6c3RyaW5nKCkpOworCisgICAgcmV0dXJuIGhhbmRsZUVycm9ycyhzdGQ6Om1vdmUoRXJyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsmQ10oY29uc3QgRXJyb3JJbmZvQmFzZSAmRUlCKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG8gU0kgPSBTZXJpYWxpemVycy5maW5kKEVJQi5keW5hbWljQ2xhc3NJRCgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKFNJID09IFNlcmlhbGl6ZXJzLmVuZCgpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzZXJpYWxpemVBc1N0cmluZ0Vycm9yKEMsIEVJQik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAoU0ktPnNlY29uZCkoQywgRUlCKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0pOworICB9CisKKyAgc3RhdGljIEVycm9yIGRlc2VyaWFsaXplKENoYW5uZWxUICZDLCBFcnJvciAmRXJyKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6cmVjdXJzaXZlX211dGV4PiBMb2NrKERlc2VyaWFsaXplcnNNdXRleCk7CisKKyAgICBzdGQ6OnN0cmluZyBLZXk7CisgICAgaWYgKGF1dG8gRXJyID0gZGVzZXJpYWxpemVTZXEoQywgS2V5KSkKKyAgICAgIHJldHVybiBFcnI7CisKKyAgICBpZiAoS2V5LmVtcHR5KCkpIHsKKyAgICAgIEVycm9yQXNPdXRQYXJhbWV0ZXIgRUFPKCZFcnIpOworICAgICAgRXJyID0gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICAgIH0KKworICAgIGF1dG8gREkgPSBEZXNlcmlhbGl6ZXJzLmZpbmQoS2V5KTsKKyAgICBhc3NlcnQoREkgIT0gRGVzZXJpYWxpemVycy5lbmQoKSAmJiAiTm8gZGVzZXJpYWxpemVyIGZvciBlcnJvciB0eXBlIik7CisgICAgcmV0dXJuIChESS0+c2Vjb25kKShDLCBFcnIpOworICB9CisKK3ByaXZhdGU6CisKKyAgc3RhdGljIEVycm9yIHNlcmlhbGl6ZUFzU3RyaW5nRXJyb3IoQ2hhbm5lbFQgJkMsIGNvbnN0IEVycm9ySW5mb0Jhc2UgJkVJQikgeworICAgIHN0ZDo6c3RyaW5nIEVyck1zZzsKKyAgICB7CisgICAgICByYXdfc3RyaW5nX29zdHJlYW0gRXJyTXNnU3RyZWFtKEVyck1zZyk7CisgICAgICBFSUIubG9nKEVyck1zZ1N0cmVhbSk7CisgICAgfQorICAgIHJldHVybiBzZXJpYWxpemUoQywgbWFrZV9lcnJvcjxTdHJpbmdFcnJvcj4oc3RkOjptb3ZlKEVyck1zZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNvbnZlcnRpYmxlRXJyb3JDb2RlKCkpKTsKKyAgfQorCisgIHN0YXRpYyBzdGQ6OnJlY3Vyc2l2ZV9tdXRleCBTZXJpYWxpemVyc011dGV4OworICBzdGF0aWMgc3RkOjpyZWN1cnNpdmVfbXV0ZXggRGVzZXJpYWxpemVyc011dGV4OworICBzdGF0aWMgc3RkOjptYXA8Y29uc3Qgdm9pZCosIFdyYXBwZWRFcnJvclNlcmlhbGl6ZXI+IFNlcmlhbGl6ZXJzOworICBzdGF0aWMgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFdyYXBwZWRFcnJvckRlc2VyaWFsaXplcj4gRGVzZXJpYWxpemVyczsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVD4KK3N0ZDo6cmVjdXJzaXZlX211dGV4IFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIEVycm9yPjo6U2VyaWFsaXplcnNNdXRleDsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxUPgorc3RkOjpyZWN1cnNpdmVfbXV0ZXggU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgRXJyb3I+OjpEZXNlcmlhbGl6ZXJzTXV0ZXg7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVD4KK3N0ZDo6bWFwPGNvbnN0IHZvaWQqLAorICAgICAgICAgdHlwZW5hbWUgU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgRXJyb3I+OjpXcmFwcGVkRXJyb3JTZXJpYWxpemVyPgorU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgRXJyb3I+OjpTZXJpYWxpemVyczsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxUPgorc3RkOjptYXA8c3RkOjpzdHJpbmcsCisgICAgICAgICB0eXBlbmFtZSBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBFcnJvcj46OldyYXBwZWRFcnJvckRlc2VyaWFsaXplcj4KK1NlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIEVycm9yPjo6RGVzZXJpYWxpemVyczsKKworLy8vIFJlZ2lzdGVycyBhIHNlcmlhbGl6ZXIgYW5kIGRlc2VyaWFsaXplciBmb3IgdGhlIGdpdmVuIGVycm9yIHR5cGUgb24gdGhlCisvLy8gZ2l2ZW4gY2hhbm5lbCB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZSBFcnJvckluZm9ULCB0eXBlbmFtZSBTZXJpYWxpemVGdG9yLAorICAgICAgICAgIHR5cGVuYW1lIERlc2VyaWFsaXplRnRvcj4KK3ZvaWQgcmVnaXN0ZXJFcnJvclNlcmlhbGl6YXRpb24oc3RkOjpzdHJpbmcgTmFtZSwgU2VyaWFsaXplRnRvciAmJlNlcmlhbGl6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzZXJpYWxpemVGdG9yICYmRGVzZXJpYWxpemUpIHsKKyAgU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgRXJyb3I+Ojp0ZW1wbGF0ZSByZWdpc3RlckVycm9yVHlwZTxFcnJvckluZm9UPigKKyAgICBzdGQ6Om1vdmUoTmFtZSksCisgICAgc3RkOjpmb3J3YXJkPFNlcmlhbGl6ZUZ0b3I+KFNlcmlhbGl6ZSksCisgICAgc3RkOjpmb3J3YXJkPERlc2VyaWFsaXplRnRvcj4oRGVzZXJpYWxpemUpKTsKK30KKworLy8vIFJlZ2lzdGVycyBzZXJpYWxpemF0aW9uL2Rlc2VyaWFsaXphdGlvbiBmb3IgU3RyaW5nRXJyb3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQ+Cit2b2lkIHJlZ2lzdGVyU3RyaW5nRXJyb3IoKSB7CisgIHN0YXRpYyBib29sIEFscmVhZHlSZWdpc3RlcmVkID0gZmFsc2U7CisgIGlmICghQWxyZWFkeVJlZ2lzdGVyZWQpIHsKKyAgICByZWdpc3RlckVycm9yU2VyaWFsaXphdGlvbjxDaGFubmVsVCwgU3RyaW5nRXJyb3I+KAorICAgICAgIlN0cmluZ0Vycm9yIiwKKyAgICAgIFtdKENoYW5uZWxUICZDLCBjb25zdCBTdHJpbmdFcnJvciAmU0UpIHsKKyAgICAgICAgcmV0dXJuIHNlcmlhbGl6ZVNlcShDLCBTRS5nZXRNZXNzYWdlKCkpOworICAgICAgfSwKKyAgICAgIFtdKENoYW5uZWxUICZDLCBFcnJvciAmRXJyKSAtPiBFcnJvciB7CisgICAgICAgIEVycm9yQXNPdXRQYXJhbWV0ZXIgRUFPKCZFcnIpOworICAgICAgICBzdGQ6OnN0cmluZyBNc2c7CisgICAgICAgIGlmIChhdXRvIEUyID0gZGVzZXJpYWxpemVTZXEoQywgTXNnKSkKKyAgICAgICAgICByZXR1cm4gRTI7CisgICAgICAgIEVyciA9CisgICAgICAgICAgbWFrZV9lcnJvcjxTdHJpbmdFcnJvcj4oc3RkOjptb3ZlKE1zZyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JjRXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcmNFcnJvckNvZGU6OlVua25vd25FcnJvckNvZGVGcm9tUmVtb3RlKSk7CisgICAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICAgICAgfSk7CisgICAgQWxyZWFkeVJlZ2lzdGVyZWQgPSB0cnVlOworICB9Cit9CisKKy8vLyBTZXJpYWxpemF0aW9uVHJhaXRzIGZvciBFeHBlY3RlZDxUMT4gZnJvbSBhbiBFeHBlY3RlZDxUMj4uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2NsYXNzIFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIEV4cGVjdGVkPFQxPiwgRXhwZWN0ZWQ8VDI+PiB7CitwdWJsaWM6CisKKyAgc3RhdGljIEVycm9yIHNlcmlhbGl6ZShDaGFubmVsVCAmQywgRXhwZWN0ZWQ8VDI+ICYmVmFsT3JFcnIpIHsKKyAgICBpZiAoVmFsT3JFcnIpIHsKKyAgICAgIGlmIChhdXRvIEVyciA9IHNlcmlhbGl6ZVNlcShDLCB0cnVlKSkKKyAgICAgICAgcmV0dXJuIEVycjsKKyAgICAgIHJldHVybiBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBUMSwgVDI+OjpzZXJpYWxpemUoQywgKlZhbE9yRXJyKTsKKyAgICB9CisgICAgaWYgKGF1dG8gRXJyID0gc2VyaWFsaXplU2VxKEMsIGZhbHNlKSkKKyAgICAgIHJldHVybiBFcnI7CisgICAgcmV0dXJuIHNlcmlhbGl6ZVNlcShDLCBWYWxPckVyci50YWtlRXJyb3IoKSk7CisgIH0KKworICBzdGF0aWMgRXJyb3IgZGVzZXJpYWxpemUoQ2hhbm5lbFQgJkMsIEV4cGVjdGVkPFQyPiAmVmFsT3JFcnIpIHsKKyAgICBFeHBlY3RlZEFzT3V0UGFyYW1ldGVyPFQyPiBFQU8oJlZhbE9yRXJyKTsKKyAgICBib29sIEhhc1ZhbHVlOworICAgIGlmIChhdXRvIEVyciA9IGRlc2VyaWFsaXplU2VxKEMsIEhhc1ZhbHVlKSkKKyAgICAgIHJldHVybiBFcnI7CisgICAgaWYgKEhhc1ZhbHVlKQorICAgICAgcmV0dXJuIFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIFQxLCBUMj46OmRlc2VyaWFsaXplKEMsICpWYWxPckVycik7CisgICAgRXJyb3IgRXJyID0gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICBpZiAoYXV0byBFMiA9IGRlc2VyaWFsaXplU2VxKEMsIEVycikpCisgICAgICByZXR1cm4gRTI7CisgICAgVmFsT3JFcnIgPSBzdGQ6Om1vdmUoRXJyKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorfTsKKworLy8vIFNlcmlhbGl6YXRpb25UcmFpdHMgZm9yIEV4cGVjdGVkPFQxPiBmcm9tIGEgVDIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK2NsYXNzIFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIEV4cGVjdGVkPFQxPiwgVDI+IHsKK3B1YmxpYzoKKworICBzdGF0aWMgRXJyb3Igc2VyaWFsaXplKENoYW5uZWxUICZDLCBUMiAmJlZhbCkgeworICAgIHJldHVybiBzZXJpYWxpemVTZXEoQywgRXhwZWN0ZWQ8VDI+KHN0ZDo6Zm9yd2FyZDxUMj4oVmFsKSkpOworICB9Cit9OworCisvLy8gU2VyaWFsaXphdGlvblRyYWl0cyBmb3IgRXhwZWN0ZWQ8VDE+IGZyb20gYW4gRXJyb3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQsIHR5cGVuYW1lIFQ+CitjbGFzcyBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBFeHBlY3RlZDxUPiwgRXJyb3I+IHsKK3B1YmxpYzoKKworICBzdGF0aWMgRXJyb3Igc2VyaWFsaXplKENoYW5uZWxUICZDLCBFcnJvciAmJkVycikgeworICAgIHJldHVybiBzZXJpYWxpemVTZXEoQywgRXhwZWN0ZWQ8VD4oc3RkOjptb3ZlKEVycikpKTsKKyAgfQorfTsKKworLy8vIFNlcmlhbGl6YXRpb25UcmFpdHMgZGVmYXVsdCBzcGVjaWFsaXphdGlvbiBmb3Igc3RkOjpwYWlyLgordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDI+CitjbGFzcyBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBzdGQ6OnBhaXI8VDEsIFQyPj4geworcHVibGljOgorICBzdGF0aWMgRXJyb3Igc2VyaWFsaXplKENoYW5uZWxUICZDLCBjb25zdCBzdGQ6OnBhaXI8VDEsIFQyPiAmVikgeworICAgIHJldHVybiBzZXJpYWxpemVTZXEoQywgVi5maXJzdCwgVi5zZWNvbmQpOworICB9CisKKyAgc3RhdGljIEVycm9yIGRlc2VyaWFsaXplKENoYW5uZWxUICZDLCBzdGQ6OnBhaXI8VDEsIFQyPiAmVikgeworICAgIHJldHVybiBkZXNlcmlhbGl6ZVNlcShDLCBWLmZpcnN0LCBWLnNlY29uZCk7CisgIH0KK307CisKKy8vLyBTZXJpYWxpemF0aW9uVHJhaXRzIGRlZmF1bHQgc3BlY2lhbGl6YXRpb24gZm9yIHN0ZDo6dHVwbGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQsIHR5cGVuYW1lLi4uIEFyZ1RzPgorY2xhc3MgU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgc3RkOjp0dXBsZTxBcmdUcy4uLj4+IHsKK3B1YmxpYzoKKworICAvLy8gUlBDIGNoYW5uZWwgc2VyaWFsaXphdGlvbiBmb3Igc3RkOjp0dXBsZS4KKyAgc3RhdGljIEVycm9yIHNlcmlhbGl6ZShDaGFubmVsVCAmQywgY29uc3Qgc3RkOjp0dXBsZTxBcmdUcy4uLj4gJlYpIHsKKyAgICByZXR1cm4gc2VyaWFsaXplVHVwbGVIZWxwZXIoQywgViwgbGx2bTo6aW5kZXhfc2VxdWVuY2VfZm9yPEFyZ1RzLi4uPigpKTsKKyAgfQorCisgIC8vLyBSUEMgY2hhbm5lbCBkZXNlcmlhbGl6YXRpb24gZm9yIHN0ZDo6dHVwbGUuCisgIHN0YXRpYyBFcnJvciBkZXNlcmlhbGl6ZShDaGFubmVsVCAmQywgc3RkOjp0dXBsZTxBcmdUcy4uLj4gJlYpIHsKKyAgICByZXR1cm4gZGVzZXJpYWxpemVUdXBsZUhlbHBlcihDLCBWLCBsbHZtOjppbmRleF9zZXF1ZW5jZV9mb3I8QXJnVHMuLi4+KCkpOworICB9CisKK3ByaXZhdGU6CisgIC8vIFNlcmlhbGl6YXRpb24gaGVscGVyIGZvciBzdGQ6OnR1cGxlLgorICB0ZW1wbGF0ZSA8c2l6ZV90Li4uIElzPgorICBzdGF0aWMgRXJyb3Igc2VyaWFsaXplVHVwbGVIZWxwZXIoQ2hhbm5lbFQgJkMsIGNvbnN0IHN0ZDo6dHVwbGU8QXJnVHMuLi4+ICZWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6aW5kZXhfc2VxdWVuY2U8SXMuLi4+IF8pIHsKKyAgICByZXR1cm4gc2VyaWFsaXplU2VxKEMsIHN0ZDo6Z2V0PElzPihWKS4uLik7CisgIH0KKworICAvLyBTZXJpYWxpemF0aW9uIGhlbHBlciBmb3Igc3RkOjp0dXBsZS4KKyAgdGVtcGxhdGUgPHNpemVfdC4uLiBJcz4KKyAgc3RhdGljIEVycm9yIGRlc2VyaWFsaXplVHVwbGVIZWxwZXIoQ2hhbm5lbFQgJkMsIHN0ZDo6dHVwbGU8QXJnVHMuLi4+ICZWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjppbmRleF9zZXF1ZW5jZTxJcy4uLj4gXykgeworICAgIHJldHVybiBkZXNlcmlhbGl6ZVNlcShDLCBzdGQ6OmdldDxJcz4oVikuLi4pOworICB9Cit9OworCisvLy8gU2VyaWFsaXphdGlvblRyYWl0cyBkZWZhdWx0IHNwZWNpYWxpemF0aW9uIGZvciBzdGQ6OnZlY3Rvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUgVD4KK2NsYXNzIFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIHN0ZDo6dmVjdG9yPFQ+PiB7CitwdWJsaWM6CisKKyAgLy8vIFNlcmlhbGl6ZSBhIHN0ZDo6dmVjdG9yPFQ+IGZyb20gc3RkOjp2ZWN0b3I8VD4uCisgIHN0YXRpYyBFcnJvciBzZXJpYWxpemUoQ2hhbm5lbFQgJkMsIGNvbnN0IHN0ZDo6dmVjdG9yPFQ+ICZWKSB7CisgICAgaWYgKGF1dG8gRXJyID0gc2VyaWFsaXplU2VxKEMsIHN0YXRpY19jYXN0PHVpbnQ2NF90PihWLnNpemUoKSkpKQorICAgICAgcmV0dXJuIEVycjsKKworICAgIGZvciAoY29uc3QgYXV0byAmRSA6IFYpCisgICAgICBpZiAoYXV0byBFcnIgPSBzZXJpYWxpemVTZXEoQywgRSkpCisgICAgICAgIHJldHVybiBFcnI7CisKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIC8vLyBEZXNlcmlhbGl6ZSBhIHN0ZDo6dmVjdG9yPFQ+IHRvIGEgc3RkOjp2ZWN0b3I8VD4uCisgIHN0YXRpYyBFcnJvciBkZXNlcmlhbGl6ZShDaGFubmVsVCAmQywgc3RkOjp2ZWN0b3I8VD4gJlYpIHsKKyAgICB1aW50NjRfdCBDb3VudCA9IDA7CisgICAgaWYgKGF1dG8gRXJyID0gZGVzZXJpYWxpemVTZXEoQywgQ291bnQpKQorICAgICAgcmV0dXJuIEVycjsKKworICAgIFYucmVzaXplKENvdW50KTsKKyAgICBmb3IgKGF1dG8gJkUgOiBWKQorICAgICAgaWYgKGF1dG8gRXJyID0gZGVzZXJpYWxpemVTZXEoQywgRSkpCisgICAgICAgIHJldHVybiBFcnI7CisKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHJwYworfSAvLyBlbmQgbmFtZXNwYWNlIG9yYworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19SUENTRVJJQUxJWkFUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9SUENVdGlscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL1JQQ1V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzI3OGNiMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9SUENVdGlscy5oCkBAIC0wLDAgKzEsMTc1MiBAQAorLy89PT0tLS0tLS0tIFJQQ1VUaWxzLmggLSBVdGlsaXRpZXMgZm9yIGJ1aWxkaW5nIFJQQyBBUElzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBVdGlsaXRpZXMgdG8gc3VwcG9ydCBjb25zdHJ1Y3Rpb24gb2Ygc2ltcGxlIFJQQyBBUElzLgorLy8KKy8vIFRoZSBSUEMgdXRpbGl0aWVzIGFpbSBmb3IgZWFzZSBvZiB1c2UgKG1pbmltYWwgY29uY2VwdHVhbCBvdmVyaGVhZCkgZm9yIEMrKworLy8gcHJvZ3JhbW1lcnMsIGhpZ2ggcGVyZm9ybWFuY2UsIGxvdyBtZW1vcnkgb3ZlcmhlYWQsIGFuZCBlZmZpY2llbnQgdXNlIG9mIHRoZQorLy8gY29tbXVuaWNhdGlvbnMgY2hhbm5lbC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19SUENVVElMU19ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19SUENVVElMU19ICisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dGhyZWFkPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9PcmNFcnJvci5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9SUENTZXJpYWxpemF0aW9uLmgiCisKKyNpbmNsdWRlIDxmdXR1cmU+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBvcmMgeworbmFtZXNwYWNlIHJwYyB7CisKKy8vLyBCYXNlIGNsYXNzIG9mIGFsbCBmYXRhbCBSUEMgZXJyb3JzICh0aG9zZSB0aGF0IG5lY2Vzc2FyaWx5IHJlc3VsdCBpbiB0aGUKKy8vLyB0ZXJtaW5hdGlvbiBvZiB0aGUgUlBDIHNlc3Npb24pLgorY2xhc3MgUlBDRmF0YWxFcnJvciA6IHB1YmxpYyBFcnJvckluZm88UlBDRmF0YWxFcnJvcj4geworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKK307CisKKy8vLyBSUENDb25uZWN0aW9uQ2xvc2VkIGlzIHJldHVybmVkIGZyb20gUlBDIG9wZXJhdGlvbnMgaWYgdGhlIFJQQyBjb25uZWN0aW9uCisvLy8gaGFzIGFscmVhZHkgYmVlbiBjbG9zZWQgZHVlIHRvIGVpdGhlciBhbiBlcnJvciBvciBncmFjZWZ1bCBkaXNjb25uZWN0aW9uLgorY2xhc3MgQ29ubmVjdGlvbkNsb3NlZCA6IHB1YmxpYyBFcnJvckluZm88Q29ubmVjdGlvbkNsb3NlZD4geworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKyAgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIGxvZyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vIEJhZEZ1bmN0aW9uQ2FsbCBpcyByZXR1cm5lZCBmcm9tIGhhbmRsZU9uZSB3aGVuIHRoZSByZW1vdGUgbWFrZXMgYSBjYWxsIHdpdGgKKy8vLyBhbiB1bnJlY29nbml6ZWQgZnVuY3Rpb24gaWQuCisvLy8KKy8vLyBUaGlzIGVycm9yIGlzIGZhdGFsIGJlY2F1c2UgT3JjIFJQQyBuZWVkcyB0byBrbm93IGhvdyB0byBwYXJzZSBhIGZ1bmN0aW9uCisvLy8gY2FsbCB0byBrbm93IHdoZXJlIHRoZSBuZXh0IGNhbGwgc3RhcnRzLCBhbmQgaWYgaXQgZG9lc24ndCByZWNvZ25pemUgdGhlCisvLy8gZnVuY3Rpb24gaWQgaXQgY2Fubm90IHBhcnNlIHRoZSBjYWxsLgordGVtcGxhdGUgPHR5cGVuYW1lIEZuSWRULCB0eXBlbmFtZSBTZXFOb1Q+CitjbGFzcyBCYWRGdW5jdGlvbkNhbGwKKyAgOiBwdWJsaWMgRXJyb3JJbmZvPEJhZEZ1bmN0aW9uQ2FsbDxGbklkVCwgU2VxTm9UPiwgUlBDRmF0YWxFcnJvcj4geworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBCYWRGdW5jdGlvbkNhbGwoRm5JZFQgRm5JZCwgU2VxTm9UIFNlcU5vKQorICAgICAgOiBGbklkKHN0ZDo6bW92ZShGbklkKSksIFNlcU5vKHN0ZDo6bW92ZShTZXFObykpIHt9CisKKyAgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gb3JjRXJyb3IoT3JjRXJyb3JDb2RlOjpVbmV4cGVjdGVkUlBDQ2FsbCk7CisgIH0KKworICB2b2lkIGxvZyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBPUyA8PCAiQ2FsbCB0byBpbnZhbGlkIFJQQyBmdW5jdGlvbiBpZCAnIiA8PCBGbklkIDw8ICInIHdpdGggIgorICAgICAgICAgICJzZXF1ZW5jZSBudW1iZXIgIiA8PCBTZXFObzsKKyAgfQorCitwcml2YXRlOgorICBGbklkVCBGbklkOworICBTZXFOb1QgU2VxTm87Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRm5JZFQsIHR5cGVuYW1lIFNlcU5vVD4KK2NoYXIgQmFkRnVuY3Rpb25DYWxsPEZuSWRULCBTZXFOb1Q+OjpJRCA9IDA7CisKKy8vLyBJbnZhbGlkU2VxdWVuY2VOdW1iZXJGb3JSZXNwb25zZSBpcyByZXR1cm5lZCBmcm9tIGhhbmRsZU9uZSB3aGVuIGEgcmVzcG9uc2UKKy8vLyBjYWxsIGFycml2ZXMgd2l0aCBhIHNlcXVlbmNlIG51bWJlciB0aGF0IGRvZXNuJ3QgY29ycmVzcG9uZCB0byBhbnkgaW4tZmxpZ2h0CisvLy8gZnVuY3Rpb24gY2FsbC4KKy8vLworLy8vIFRoaXMgZXJyb3IgaXMgZmF0YWwgYmVjYXVzZSBPcmMgUlBDIG5lZWRzIHRvIGtub3cgaG93IHRvIHBhcnNlIHRoZSByZXN0IG9mCisvLy8gdGhlIHJlc3BvbnNlIGNhbGwgdG8ga25vdyB3aGVyZSB0aGUgbmV4dCBjYWxsIHN0YXJ0cywgYW5kIGlmIGl0IGRvZXNuJ3QgaGF2ZQorLy8vIGEgcmVzdWx0IHBhcnNlciBmb3IgdGhpcyBzZXF1ZW5jZSBudW1iZXIgaXQgY2FuJ3QgZG8gdGhhdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXFOb1Q+CitjbGFzcyBJbnZhbGlkU2VxdWVuY2VOdW1iZXJGb3JSZXNwb25zZQorICAgIDogcHVibGljIEVycm9ySW5mbzxJbnZhbGlkU2VxdWVuY2VOdW1iZXJGb3JSZXNwb25zZTxTZXFOb1Q+LCBSUENGYXRhbEVycm9yPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIEludmFsaWRTZXF1ZW5jZU51bWJlckZvclJlc3BvbnNlKFNlcU5vVCBTZXFObykKKyAgICAgIDogU2VxTm8oc3RkOjptb3ZlKFNlcU5vKSkge30KKworICBzdGQ6OmVycm9yX2NvZGUgY29udmVydFRvRXJyb3JDb2RlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBvcmNFcnJvcihPcmNFcnJvckNvZGU6OlVuZXhwZWN0ZWRSUENDYWxsKTsKKyAgfTsKKworICB2b2lkIGxvZyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBPUyA8PCAiUmVzcG9uc2UgaGFzIHVua25vd24gc2VxdWVuY2UgbnVtYmVyICIgPDwgU2VxTm87CisgIH0KK3ByaXZhdGU6CisgIFNlcU5vVCBTZXFObzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZXFOb1Q+CitjaGFyIEludmFsaWRTZXF1ZW5jZU51bWJlckZvclJlc3BvbnNlPFNlcU5vVD46OklEID0gMDsKKworLy8vIFRoaXMgbm9uLWZhdGFsIGVycm9yIHdpbGwgYmUgcGFzc2VkIHRvIGFzeW5jaHJvbm91cyByZXN1bHQgaGFuZGxlcnMgaW4gcGxhY2UKKy8vLyBvZiBhIHJlc3VsdCBpZiB0aGUgY29ubmVjdGlvbiBnb2VzIGRvd24gYmVmb3JlIGEgcmVzdWx0IHJldHVybnMsIG9yIGlmIHRoZQorLy8vIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBjYW5ub3QgYmUgbmVnb3RpYXRlZCB3aXRoIHRoZSByZW1vdGUuCitjbGFzcyBSZXNwb25zZUFiYW5kb25lZCA6IHB1YmxpYyBFcnJvckluZm88UmVzcG9uc2VBYmFuZG9uZWQ+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7CisKKyAgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0IG92ZXJyaWRlOworICB2b2lkIGxvZyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vIFRoaXMgZXJyb3IgaXMgcmV0dXJuZWQgaWYgdGhlIHJlbW90ZSBkb2VzIG5vdCBoYXZlIGEgaGFuZGxlciBpbnN0YWxsZWQgZm9yCisvLy8gdGhlIGdpdmVuIFJQQyBmdW5jdGlvbi4KK2NsYXNzIENvdWxkTm90TmVnb3RpYXRlIDogcHVibGljIEVycm9ySW5mbzxDb3VsZE5vdE5lZ290aWF0ZT4geworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKworICBDb3VsZE5vdE5lZ290aWF0ZShzdGQ6OnN0cmluZyBTaWduYXR1cmUpOworICBzdGQ6OmVycm9yX2NvZGUgY29udmVydFRvRXJyb3JDb2RlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgbG9nKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGU7CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRTaWduYXR1cmUoKSBjb25zdCB7IHJldHVybiBTaWduYXR1cmU7IH0KK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIFNpZ25hdHVyZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkRnVuYywgdHlwZW5hbWUgRm5UPiBjbGFzcyBGdW5jdGlvbjsKKworLy8gUlBDIEZ1bmN0aW9uIGNsYXNzLgorLy8gRGVyaXZlZEZ1bmMgc2hvdWxkIGJlIGEgdXNlciBkZWZpbmVkIGNsYXNzIHdpdGggYSBzdGF0aWMgJ2dldE5hbWUoKScgbWV0aG9kCisvLyByZXR1cm5pbmcgYSBjb25zdCBjaGFyKiByZXByZXNlbnRpbmcgdGhlIGZ1bmN0aW9uJ3MgbmFtZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkRnVuYywgdHlwZW5hbWUgUmV0VCwgdHlwZW5hbWUuLi4gQXJnVHM+CitjbGFzcyBGdW5jdGlvbjxEZXJpdmVkRnVuYywgUmV0VChBcmdUcy4uLik+IHsKK3B1YmxpYzoKKyAgLy8vIFVzZXIgZGVmaW5lZCBmdW5jdGlvbiB0eXBlLgorICB1c2luZyBUeXBlID0gUmV0VChBcmdUcy4uLik7CisKKyAgLy8vIFJldHVybiB0eXBlLgorICB1c2luZyBSZXR1cm5UeXBlID0gUmV0VDsKKworICAvLy8gUmV0dXJucyB0aGUgZnVsbCBmdW5jdGlvbiBwcm90b3R5cGUgYXMgYSBzdHJpbmcuCisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRQcm90b3R5cGUoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IExvY2soTmFtZU11dGV4KTsKKyAgICBpZiAoTmFtZS5lbXB0eSgpKQorICAgICAgcmF3X3N0cmluZ19vc3RyZWFtKE5hbWUpCisgICAgICAgICAgPDwgUlBDVHlwZU5hbWU8UmV0VD46OmdldE5hbWUoKSA8PCAiICIgPDwgRGVyaXZlZEZ1bmM6OmdldE5hbWUoKQorICAgICAgICAgIDw8ICIoIiA8PCBsbHZtOjpvcmM6OnJwYzo6UlBDVHlwZU5hbWVTZXF1ZW5jZTxBcmdUcy4uLj4oKSA8PCAiKSI7CisgICAgcmV0dXJuIE5hbWUuZGF0YSgpOworICB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyBzdGQ6Om11dGV4IE5hbWVNdXRleDsKKyAgc3RhdGljIHN0ZDo6c3RyaW5nIE5hbWU7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZEZ1bmMsIHR5cGVuYW1lIFJldFQsIHR5cGVuYW1lLi4uIEFyZ1RzPgorc3RkOjptdXRleCBGdW5jdGlvbjxEZXJpdmVkRnVuYywgUmV0VChBcmdUcy4uLik+OjpOYW1lTXV0ZXg7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkRnVuYywgdHlwZW5hbWUgUmV0VCwgdHlwZW5hbWUuLi4gQXJnVHM+CitzdGQ6OnN0cmluZyBGdW5jdGlvbjxEZXJpdmVkRnVuYywgUmV0VChBcmdUcy4uLik+OjpOYW1lOworCisvLy8gQWxsb2NhdGVzIFJQQyBmdW5jdGlvbiBpZHMgZHVyaW5nIGF1dG9uZWdvdGlhdGlvbi4KKy8vLyBTcGVjaWFsaXphdGlvbnMgb2YgdGhpcyBjbGFzcyBtdXN0IHByb3ZpZGUgZm91ciBtZW1iZXJzOgorLy8vCisvLy8gc3RhdGljIFQgZ2V0SW52YWxpZElkKCk6CisvLy8gICBTaG91bGQgcmV0dXJuIGEgcmVzZXJ2ZWQgaWQgdGhhdCB3aWxsIGJlIHVzZWQgdG8gcmVwcmVzZW50IG1pc3NpbmcKKy8vLyBmdW5jdGlvbnMgZHVyaW5nIGF1dG9uZWdvdGlhdGlvbi4KKy8vLworLy8vIHN0YXRpYyBUIGdldFJlc3BvbnNlSWQoKToKKy8vLyAgIFNob3VsZCByZXR1cm4gYSByZXNlcnZlZCBpZCB0aGF0IHdpbGwgYmUgdXNlZCB0byBzZW5kIGZ1bmN0aW9uIHJlc3BvbnNlcworLy8vIChyZXR1cm4gdmFsdWVzKS4KKy8vLworLy8vIHN0YXRpYyBUIGdldE5lZ290aWF0ZUlkKCk6CisvLy8gICBTaG91bGQgcmV0dXJuIGEgcmVzZXJ2ZWQgaWQgZm9yIHRoZSBuZWdvdGlhdGUgZnVuY3Rpb24sIHdoaWNoIHdpbGwgYmUgdXNlZAorLy8vIHRvIG5lZ290aWF0ZSBpZHMgZm9yIHVzZXIgZGVmaW5lZCBmdW5jdGlvbnMuCisvLy8KKy8vLyB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYz4gVCBhbGxvY2F0ZSgpOgorLy8vICAgQWxsb2NhdGUgYSB1bmlxdWUgaWQgZm9yIGZ1bmN0aW9uIEZ1bmMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgPSB2b2lkPiBjbGFzcyBSUENGdW5jdGlvbklkQWxsb2NhdG9yOworCisvLy8gVGhpcyBzcGVjaWFsaXphdGlvbiBvZiBSUENGdW5jdGlvbklkQWxsb2NhdG9yIHByb3ZpZGVzIGEgZGVmYXVsdAorLy8vIGltcGxlbWVudGF0aW9uIGZvciBpbnRlZ3JhbCB0eXBlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUlBDRnVuY3Rpb25JZEFsbG9jYXRvcjwKKyAgICBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZT46OnR5cGU+IHsKK3B1YmxpYzoKKyAgc3RhdGljIFQgZ2V0SW52YWxpZElkKCkgeyByZXR1cm4gVCgwKTsgfQorICBzdGF0aWMgVCBnZXRSZXNwb25zZUlkKCkgeyByZXR1cm4gVCgxKTsgfQorICBzdGF0aWMgVCBnZXROZWdvdGlhdGVJZCgpIHsgcmV0dXJuIFQoMik7IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYz4gVCBhbGxvY2F0ZSgpIHsgcmV0dXJuIE5leHRJZCsrOyB9CisKK3ByaXZhdGU6CisgIFQgTmV4dElkID0gMzsKK307CisKK25hbWVzcGFjZSBkZXRhaWwgeworCisvLyBGSVhNRTogUmVtb3ZlIE1TVkNQRXJyb3IvTVNWQ1BFeHBlY3RlZCBvbmNlIE1TVkMncyBmdXR1cmUgaW1wbGVtZW50YXRpb24KKy8vICAgICAgICBzdXBwb3J0cyBjbGFzc2VzIHdpdGhvdXQgZGVmYXVsdCBjb25zdHJ1Y3RvcnMuCisjaWZkZWYgX01TQ19WRVIKKworbmFtZXNwYWNlIG1zdmNfaGFja3MgeworCisvLyBXb3JrIGFyb3VuZCBNU1ZDJ3MgZnV0dXJlIGltcGxlbWVudGF0aW9uJ3MgdXNlIG9mIGRlZmF1bHQgY29uc3RydWN0b3JzOgorLy8gQSBkZWZhdWx0IGNvbnN0cnVjdGVkIHZhbHVlIGluIHRoZSBwcm9taXNlIHdpbGwgYmUgb3ZlcndyaXR0ZW4gd2hlbiB0aGUKKy8vIHJlYWwgZXJyb3IgaXMgc2V0IC0gc28gdGhlIGRlZmF1bHQgY29uc3RydWN0ZWQgRXJyb3IgaGFzIHRvIGJlIGNoZWNrZWQKKy8vIGFscmVhZHkuCitjbGFzcyBNU1ZDUEVycm9yIDogcHVibGljIEVycm9yIHsKK3B1YmxpYzoKKyAgTVNWQ1BFcnJvcigpIHsgKHZvaWQpISEqdGhpczsgfQorCisgIE1TVkNQRXJyb3IoTVNWQ1BFcnJvciAmJk90aGVyKSA6IEVycm9yKHN0ZDo6bW92ZShPdGhlcikpIHt9CisKKyAgTVNWQ1BFcnJvciAmb3BlcmF0b3I9KE1TVkNQRXJyb3IgT3RoZXIpIHsKKyAgICBFcnJvcjo6b3BlcmF0b3I9KHN0ZDo6bW92ZShPdGhlcikpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIE1TVkNQRXJyb3IoRXJyb3IgRXJyKSA6IEVycm9yKHN0ZDo6bW92ZShFcnIpKSB7fQorfTsKKworLy8gV29yayBhcm91bmQgTVNWQydzIGZ1dHVyZSBpbXBsZW1lbnRhdGlvbiwgc2ltaWxhciB0byBNU1ZDUEVycm9yLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIE1TVkNQRXhwZWN0ZWQgOiBwdWJsaWMgRXhwZWN0ZWQ8VD4geworcHVibGljOgorICBNU1ZDUEV4cGVjdGVkKCkKKyAgICAgIDogRXhwZWN0ZWQ8VD4obWFrZV9lcnJvcjxTdHJpbmdFcnJvcj4oIiIsIGluY29udmVydGlibGVFcnJvckNvZGUoKSkpIHsKKyAgICBjb25zdW1lRXJyb3IodGhpcy0+dGFrZUVycm9yKCkpOworICB9CisKKyAgTVNWQ1BFeHBlY3RlZChNU1ZDUEV4cGVjdGVkICYmT3RoZXIpIDogRXhwZWN0ZWQ8VD4oc3RkOjptb3ZlKE90aGVyKSkge30KKworICBNU1ZDUEV4cGVjdGVkICZvcGVyYXRvcj0oTVNWQ1BFeHBlY3RlZCAmJk90aGVyKSB7CisgICAgRXhwZWN0ZWQ8VD46Om9wZXJhdG9yPShzdGQ6Om1vdmUoT3RoZXIpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBNU1ZDUEV4cGVjdGVkKEVycm9yIEVycikgOiBFeHBlY3RlZDxUPihzdGQ6Om1vdmUoRXJyKSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3RoZXJUPgorICBNU1ZDUEV4cGVjdGVkKAorICAgICAgT3RoZXJUICYmVmFsLAorICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxPdGhlclQsIFQ+Ojp2YWx1ZT46OnR5cGUgKiA9CisgICAgICAgICAgbnVsbHB0cikKKyAgICAgIDogRXhwZWN0ZWQ8VD4oc3RkOjptb3ZlKFZhbCkpIHt9CisKKyAgdGVtcGxhdGUgPGNsYXNzIE90aGVyVD4KKyAgTVNWQ1BFeHBlY3RlZCgKKyAgICAgIEV4cGVjdGVkPE90aGVyVD4gJiZPdGhlciwKKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8T3RoZXJULCBUPjo6dmFsdWU+Ojp0eXBlICogPQorICAgICAgICAgIG51bGxwdHIpCisgICAgICA6IEV4cGVjdGVkPFQ+KHN0ZDo6bW92ZShPdGhlcikpIHt9CisKKyAgdGVtcGxhdGUgPGNsYXNzIE90aGVyVD4KKyAgZXhwbGljaXQgTVNWQ1BFeHBlY3RlZCgKKyAgICAgIEV4cGVjdGVkPE90aGVyVD4gJiZPdGhlciwKKyAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFzdGQ6OmlzX2NvbnZlcnRpYmxlPE90aGVyVCwgVD46OnZhbHVlPjo6dHlwZSAqID0KKyAgICAgICAgICBudWxscHRyKQorICAgICAgOiBFeHBlY3RlZDxUPihzdGQ6Om1vdmUoT3RoZXIpKSB7fQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG1zdmNfaGFja3MKKworI2VuZGlmIC8vIF9NU0NfVkVSCisKKy8vLyBQcm92aWRlcyBhIHR5cGVkZWYgZm9yIGEgdHVwbGUgY29udGFpbmluZyB0aGUgZGVjYXllZCBhcmd1bWVudCB0eXBlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBGdW5jdGlvbkFyZ3NUdXBsZTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFJldFQsIHR5cGVuYW1lLi4uIEFyZ1RzPgorY2xhc3MgRnVuY3Rpb25BcmdzVHVwbGU8UmV0VChBcmdUcy4uLik+IHsKK3B1YmxpYzoKKyAgdXNpbmcgVHlwZSA9IHN0ZDo6dHVwbGU8dHlwZW5hbWUgc3RkOjpkZWNheTwKKyAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxBcmdUcz46OnR5cGU+Ojp0eXBlLi4uPjsKK307CisKKy8vIFJlc3VsdFRyYWl0cyBwcm92aWRlcyB0eXBlZGVmcyBhbmQgdXRpbGl0aWVzIHNwZWNpZmljIHRvIHRoZSByZXR1cm4gdHlwZQorLy8gb2YgZnVuY3Rpb25zLgordGVtcGxhdGUgPHR5cGVuYW1lIFJldFQ+IGNsYXNzIFJlc3VsdFRyYWl0cyB7CitwdWJsaWM6CisgIC8vIFRoZSByZXR1cm4gdHlwZSB3cmFwcGVkIGluIGxsdm06OkV4cGVjdGVkLgorICB1c2luZyBFcnJvclJldHVyblR5cGUgPSBFeHBlY3RlZDxSZXRUPjsKKworI2lmZGVmIF9NU0NfVkVSCisgIC8vIFRoZSBFcnJvclJldHVyblR5cGUgd3JhcHBlZCBpbiBhIHN0ZDo6cHJvbWlzZS4KKyAgdXNpbmcgUmV0dXJuUHJvbWlzZVR5cGUgPSBzdGQ6OnByb21pc2U8bXN2Y19oYWNrczo6TVNWQ1BFeHBlY3RlZDxSZXRUPj47CisKKyAgLy8gVGhlIEVycm9yUmV0dXJuVHlwZSB3cmFwcGVkIGluIGEgc3RkOjpmdXR1cmUuCisgIHVzaW5nIFJldHVybkZ1dHVyZVR5cGUgPSBzdGQ6OmZ1dHVyZTxtc3ZjX2hhY2tzOjpNU1ZDUEV4cGVjdGVkPFJldFQ+PjsKKyNlbHNlCisgIC8vIFRoZSBFcnJvclJldHVyblR5cGUgd3JhcHBlZCBpbiBhIHN0ZDo6cHJvbWlzZS4KKyAgdXNpbmcgUmV0dXJuUHJvbWlzZVR5cGUgPSBzdGQ6OnByb21pc2U8RXJyb3JSZXR1cm5UeXBlPjsKKworICAvLyBUaGUgRXJyb3JSZXR1cm5UeXBlIHdyYXBwZWQgaW4gYSBzdGQ6OmZ1dHVyZS4KKyAgdXNpbmcgUmV0dXJuRnV0dXJlVHlwZSA9IHN0ZDo6ZnV0dXJlPEVycm9yUmV0dXJuVHlwZT47CisjZW5kaWYKKworICAvLyBDcmVhdGUgYSAnYmxhbmsnIHZhbHVlIG9mIHRoZSBFcnJvclJldHVyblR5cGUsIHJlYWR5IGFuZCBzYWZlIHRvCisgIC8vIG92ZXJ3cml0ZS4KKyAgc3RhdGljIEVycm9yUmV0dXJuVHlwZSBjcmVhdGVCbGFua0Vycm9yUmV0dXJuVmFsdWUoKSB7CisgICAgcmV0dXJuIEVycm9yUmV0dXJuVHlwZShSZXRUKCkpOworICB9CisKKyAgLy8gQ29uc3VtZSBhbiBhYmFuZG9uZWQgRXJyb3JSZXR1cm5UeXBlLgorICBzdGF0aWMgdm9pZCBjb25zdW1lQWJhbmRvbmVkKEVycm9yUmV0dXJuVHlwZSBSZXRPckVycikgeworICAgIGNvbnN1bWVFcnJvcihSZXRPckVyci50YWtlRXJyb3IoKSk7CisgIH0KK307CisKKy8vIFJlc3VsdFRyYWl0cyBzcGVjaWFsaXphdGlvbiBmb3Igdm9pZCBmdW5jdGlvbnMuCit0ZW1wbGF0ZSA8PiBjbGFzcyBSZXN1bHRUcmFpdHM8dm9pZD4geworcHVibGljOgorICAvLyBGb3Igdm9pZCBmdW5jdGlvbnMsIEVycm9yUmV0dXJuVHlwZSBpcyBsbHZtOjpFcnJvci4KKyAgdXNpbmcgRXJyb3JSZXR1cm5UeXBlID0gRXJyb3I7CisKKyNpZmRlZiBfTVNDX1ZFUgorICAvLyBUaGUgRXJyb3JSZXR1cm5UeXBlIHdyYXBwZWQgaW4gYSBzdGQ6OnByb21pc2UuCisgIHVzaW5nIFJldHVyblByb21pc2VUeXBlID0gc3RkOjpwcm9taXNlPG1zdmNfaGFja3M6Ok1TVkNQRXJyb3I+OworCisgIC8vIFRoZSBFcnJvclJldHVyblR5cGUgd3JhcHBlZCBpbiBhIHN0ZDo6ZnV0dXJlLgorICB1c2luZyBSZXR1cm5GdXR1cmVUeXBlID0gc3RkOjpmdXR1cmU8bXN2Y19oYWNrczo6TVNWQ1BFcnJvcj47CisjZWxzZQorICAvLyBUaGUgRXJyb3JSZXR1cm5UeXBlIHdyYXBwZWQgaW4gYSBzdGQ6OnByb21pc2UuCisgIHVzaW5nIFJldHVyblByb21pc2VUeXBlID0gc3RkOjpwcm9taXNlPEVycm9yUmV0dXJuVHlwZT47CisKKyAgLy8gVGhlIEVycm9yUmV0dXJuVHlwZSB3cmFwcGVkIGluIGEgc3RkOjpmdXR1cmUuCisgIHVzaW5nIFJldHVybkZ1dHVyZVR5cGUgPSBzdGQ6OmZ1dHVyZTxFcnJvclJldHVyblR5cGU+OworI2VuZGlmCisKKyAgLy8gQ3JlYXRlIGEgJ2JsYW5rJyB2YWx1ZSBvZiB0aGUgRXJyb3JSZXR1cm5UeXBlLCByZWFkeSBhbmQgc2FmZSB0bworICAvLyBvdmVyd3JpdGUuCisgIHN0YXRpYyBFcnJvclJldHVyblR5cGUgY3JlYXRlQmxhbmtFcnJvclJldHVyblZhbHVlKCkgeworICAgIHJldHVybiBFcnJvclJldHVyblR5cGU6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIC8vIENvbnN1bWUgYW4gYWJhbmRvbmVkIEVycm9yUmV0dXJuVHlwZS4KKyAgc3RhdGljIHZvaWQgY29uc3VtZUFiYW5kb25lZChFcnJvclJldHVyblR5cGUgRXJyKSB7CisgICAgY29uc3VtZUVycm9yKHN0ZDo6bW92ZShFcnIpKTsKKyAgfQorfTsKKworLy8gUmVzdWx0VHJhaXRzPEVycm9yPiBpcyBlcXVpdmFsZW50IHRvIFJlc3VsdFRyYWl0czx2b2lkPi4gVGhpcyBhbGxvd3MKKy8vIGhhbmRsZXJzIGZvciB2b2lkIFJQQyBmdW5jdGlvbnMgdG8gcmV0dXJuIGVpdGhlciB2b2lkIChpbiB3aGljaCBjYXNlIHRoZXkKKy8vIGltcGxpY2l0bHkgc3VjY2VlZCkgb3IgRXJyb3IgKGluIHdoaWNoIGNhc2UgdGhlaXIgZXJyb3IgcmV0dXJuIGlzCisvLyBwcm9wYWdhdGVkKS4gU2VlIHVzYWdlIGluIEhhbmRsZXJUcmFpdHM6OnJ1bkhhbmRsZXJIZWxwZXIuCit0ZW1wbGF0ZSA8PiBjbGFzcyBSZXN1bHRUcmFpdHM8RXJyb3I+IDogcHVibGljIFJlc3VsdFRyYWl0czx2b2lkPiB7fTsKKworLy8gUmVzdWx0VHJhaXRzPEV4cGVjdGVkPFQ+PiBpcyBlcXVpdmFsZW50IHRvIFJlc3VsdFRyYWl0czxUPi4gVGhpcyBhbGxvd3MKKy8vIGhhbmRsZXJzIGZvciBSUEMgZnVuY3Rpb25zIHJldHVybmluZyBhIFQgdG8gcmV0dXJuIGVpdGhlciBhIFQgKGluIHdoaWNoCisvLyBjYXNlIHRoZXkgaW1wbGljaXRseSBzdWNjZWVkKSBvciBFeHBlY3RlZDxUPiAoaW4gd2hpY2ggY2FzZSB0aGVpciBlcnJvcgorLy8gcmV0dXJuIGlzIHByb3BhZ2F0ZWQpLiBTZWUgdXNhZ2UgaW4gSGFuZGxlclRyYWl0czo6cnVuSGFuZGxlckhlbHBlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXRUPgorY2xhc3MgUmVzdWx0VHJhaXRzPEV4cGVjdGVkPFJldFQ+PiA6IHB1YmxpYyBSZXN1bHRUcmFpdHM8UmV0VD4ge307CisKKy8vIERldGVybWluZXMgd2hldGhlciBhbiBSUEMgZnVuY3Rpb24ncyBkZWZpbmVkIGVycm9yIHJldHVybiB0eXBlIHN1cHBvcnRzCisvLyBlcnJvciByZXR1cm4gdmFsdWUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIFN1cHBvcnRzRXJyb3JSZXR1cm4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOworfTsKKwordGVtcGxhdGUgPD4KK2NsYXNzIFN1cHBvcnRzRXJyb3JSZXR1cm48RXJyb3I+IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBTdXBwb3J0c0Vycm9yUmV0dXJuPEV4cGVjdGVkPFQ+PiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKK307CisKKy8vIFJlc3BvbmRIZWxwZXIgcGFja2FnZXMgcmV0dXJuIHZhbHVlcyBiYXNlZCBvbiB3aGV0aGVyIG9yIG5vdCB0aGUgZGVjbGFyZWQKKy8vIFJQQyBmdW5jdGlvbiByZXR1cm4gdHlwZSBzdXBwb3J0cyBlcnJvciByZXR1cm5zLgordGVtcGxhdGUgPGJvb2wgRnVuY1N1cHBvcnRzRXJyb3JSZXR1cm4+CitjbGFzcyBSZXNwb25kSGVscGVyOworCisvLyBSZXNwb25kSGVscGVyIHNwZWNpYWxpemF0aW9uIGZvciBmdW5jdGlvbnMgdGhhdCBzdXBwb3J0IGVycm9yIHJldHVybnMuCit0ZW1wbGF0ZSA8PgorY2xhc3MgUmVzcG9uZEhlbHBlcjx0cnVlPiB7CitwdWJsaWM6CisKKyAgLy8gU2VuZCBFeHBlY3RlZDxUPi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFdpcmVSZXRULCB0eXBlbmFtZSBIYW5kbGVyUmV0VCwgdHlwZW5hbWUgQ2hhbm5lbFQsCisgICAgICAgICAgICB0eXBlbmFtZSBGdW5jdGlvbklkVCwgdHlwZW5hbWUgU2VxdWVuY2VOdW1iZXJUPgorICBzdGF0aWMgRXJyb3Igc2VuZFJlc3VsdChDaGFubmVsVCAmQywgY29uc3QgRnVuY3Rpb25JZFQgJlJlc3BvbnNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlTnVtYmVyVCBTZXFObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0ZWQ8SGFuZGxlclJldFQ+IFJlc3VsdE9yRXJyKSB7CisgICAgaWYgKCFSZXN1bHRPckVyciAmJiBSZXN1bHRPckVyci50ZW1wbGF0ZSBlcnJvcklzQTxSUENGYXRhbEVycm9yPigpKQorICAgICAgcmV0dXJuIFJlc3VsdE9yRXJyLnRha2VFcnJvcigpOworCisgICAgLy8gT3BlbiB0aGUgcmVzcG9uc2UgbWVzc2FnZS4KKyAgICBpZiAoYXV0byBFcnIgPSBDLnN0YXJ0U2VuZE1lc3NhZ2UoUmVzcG9uc2VJZCwgU2VxTm8pKQorICAgICAgcmV0dXJuIEVycjsKKworICAgIC8vIFNlcmlhbGl6ZSB0aGUgcmVzdWx0LgorICAgIGlmIChhdXRvIEVyciA9CisgICAgICAgIFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIFdpcmVSZXRULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGVkPEhhbmRsZXJSZXRUPj46OnNlcmlhbGl6ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQywgc3RkOjptb3ZlKFJlc3VsdE9yRXJyKSkpCisgICAgICByZXR1cm4gRXJyOworCisgICAgLy8gQ2xvc2UgdGhlIHJlc3BvbnNlIG1lc3NhZ2UuCisgICAgcmV0dXJuIEMuZW5kU2VuZE1lc3NhZ2UoKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUgRnVuY3Rpb25JZFQsIHR5cGVuYW1lIFNlcXVlbmNlTnVtYmVyVD4KKyAgc3RhdGljIEVycm9yIHNlbmRSZXN1bHQoQ2hhbm5lbFQgJkMsIGNvbnN0IEZ1bmN0aW9uSWRUICZSZXNwb25zZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZU51bWJlclQgU2VxTm8sIEVycm9yIEVycikgeworICAgIGlmIChFcnIgJiYgRXJyLmlzQTxSUENGYXRhbEVycm9yPigpKQorICAgICAgcmV0dXJuIEVycjsKKyAgICBpZiAoYXV0byBFcnIyID0gQy5zdGFydFNlbmRNZXNzYWdlKFJlc3BvbnNlSWQsIFNlcU5vKSkKKyAgICAgIHJldHVybiBFcnIyOworICAgIGlmIChhdXRvIEVycjIgPSBzZXJpYWxpemVTZXEoQywgc3RkOjptb3ZlKEVycikpKQorICAgICAgcmV0dXJuIEVycjI7CisgICAgcmV0dXJuIEMuZW5kU2VuZE1lc3NhZ2UoKTsKKyAgfQorCit9OworCisvLyBSZXNwb25kSGVscGVyIHNwZWNpYWxpemF0aW9uIGZvciBmdW5jdGlvbnMgdGhhdCBkbyBub3Qgc3VwcG9ydCBlcnJvciByZXR1cm5zLgordGVtcGxhdGUgPD4KK2NsYXNzIFJlc3BvbmRIZWxwZXI8ZmFsc2U+IHsKK3B1YmxpYzoKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgV2lyZVJldFQsIHR5cGVuYW1lIEhhbmRsZXJSZXRULCB0eXBlbmFtZSBDaGFubmVsVCwKKyAgICAgICAgICAgIHR5cGVuYW1lIEZ1bmN0aW9uSWRULCB0eXBlbmFtZSBTZXF1ZW5jZU51bWJlclQ+CisgIHN0YXRpYyBFcnJvciBzZW5kUmVzdWx0KENoYW5uZWxUICZDLCBjb25zdCBGdW5jdGlvbklkVCAmUmVzcG9uc2VJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VOdW1iZXJUIFNlcU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RlZDxIYW5kbGVyUmV0VD4gUmVzdWx0T3JFcnIpIHsKKyAgICBpZiAoYXV0byBFcnIgPSBSZXN1bHRPckVyci50YWtlRXJyb3IoKSkKKyAgICAgIHJldHVybiBFcnI7CisKKyAgICAvLyBPcGVuIHRoZSByZXNwb25zZSBtZXNzYWdlLgorICAgIGlmIChhdXRvIEVyciA9IEMuc3RhcnRTZW5kTWVzc2FnZShSZXNwb25zZUlkLCBTZXFObykpCisgICAgICByZXR1cm4gRXJyOworCisgICAgLy8gU2VyaWFsaXplIHRoZSByZXN1bHQuCisgICAgaWYgKGF1dG8gRXJyID0KKyAgICAgICAgU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgV2lyZVJldFQsIEhhbmRsZXJSZXRUPjo6c2VyaWFsaXplKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQywgKlJlc3VsdE9yRXJyKSkKKyAgICAgIHJldHVybiBFcnI7CisKKyAgICAvLyBDbG9zZSB0aGUgcmVzcG9uc2UgbWVzc2FnZS4KKyAgICByZXR1cm4gQy5lbmRTZW5kTWVzc2FnZSgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZSBGdW5jdGlvbklkVCwgdHlwZW5hbWUgU2VxdWVuY2VOdW1iZXJUPgorICBzdGF0aWMgRXJyb3Igc2VuZFJlc3VsdChDaGFubmVsVCAmQywgY29uc3QgRnVuY3Rpb25JZFQgJlJlc3BvbnNlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlTnVtYmVyVCBTZXFObywgRXJyb3IgRXJyKSB7CisgICAgaWYgKEVycikKKyAgICAgIHJldHVybiBFcnI7CisgICAgaWYgKGF1dG8gRXJyMiA9IEMuc3RhcnRTZW5kTWVzc2FnZShSZXNwb25zZUlkLCBTZXFObykpCisgICAgICByZXR1cm4gRXJyMjsKKyAgICByZXR1cm4gQy5lbmRTZW5kTWVzc2FnZSgpOworICB9CisKK307CisKKworLy8gU2VuZCBhIHJlc3BvbnNlIG9mIHRoZSBnaXZlbiB3aXJlIHJldHVybiB0eXBlIChXaXJlUmV0VCkgb3ZlciB0aGUKKy8vIGNoYW5uZWwsIHdpdGggdGhlIGdpdmVuIHNlcXVlbmNlIG51bWJlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBXaXJlUmV0VCwgdHlwZW5hbWUgSGFuZGxlclJldFQsIHR5cGVuYW1lIENoYW5uZWxULAorICAgICAgICAgIHR5cGVuYW1lIEZ1bmN0aW9uSWRULCB0eXBlbmFtZSBTZXF1ZW5jZU51bWJlclQ+CitFcnJvciByZXNwb25kKENoYW5uZWxUICZDLCBjb25zdCBGdW5jdGlvbklkVCAmUmVzcG9uc2VJZCwKKyAgICAgICAgICAgICAgU2VxdWVuY2VOdW1iZXJUIFNlcU5vLCBFeHBlY3RlZDxIYW5kbGVyUmV0VD4gUmVzdWx0T3JFcnIpIHsKKyAgcmV0dXJuIFJlc3BvbmRIZWxwZXI8U3VwcG9ydHNFcnJvclJldHVybjxXaXJlUmV0VD46OnZhbHVlPjo6CisgICAgdGVtcGxhdGUgc2VuZFJlc3VsdDxXaXJlUmV0VD4oQywgUmVzcG9uc2VJZCwgU2VxTm8sIHN0ZDo6bW92ZShSZXN1bHRPckVycikpOworfQorCisvLyBTZW5kIGFuIGVtcHR5IHJlc3BvbnNlIG1lc3NhZ2Ugb24gdGhlIGdpdmVuIGNoYW5uZWwgdG8gaW5kaWNhdGUgdGhhdAorLy8gdGhlIGhhbmRsZXIgcmFuLgordGVtcGxhdGUgPHR5cGVuYW1lIFdpcmVSZXRULCB0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUgRnVuY3Rpb25JZFQsCisgICAgICAgICAgdHlwZW5hbWUgU2VxdWVuY2VOdW1iZXJUPgorRXJyb3IgcmVzcG9uZChDaGFubmVsVCAmQywgY29uc3QgRnVuY3Rpb25JZFQgJlJlc3BvbnNlSWQsIFNlcXVlbmNlTnVtYmVyVCBTZXFObywKKyAgICAgICAgICAgICAgRXJyb3IgRXJyKSB7CisgIHJldHVybiBSZXNwb25kSGVscGVyPFN1cHBvcnRzRXJyb3JSZXR1cm48V2lyZVJldFQ+Ojp2YWx1ZT46OgorICAgIHNlbmRSZXN1bHQoQywgUmVzcG9uc2VJZCwgU2VxTm8sIHN0ZDo6bW92ZShFcnIpKTsKK30KKworLy8gQ29udmVydHMgYSBnaXZlbiB0eXBlIHRvIHRoZSBlcXVpdmFsZW50IGVycm9yIHJldHVybiB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFdyYXBwZWRIYW5kbGVyUmV0dXJuIHsKK3B1YmxpYzoKKyAgdXNpbmcgVHlwZSA9IEV4cGVjdGVkPFQ+OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFdyYXBwZWRIYW5kbGVyUmV0dXJuPEV4cGVjdGVkPFQ+PiB7CitwdWJsaWM6CisgIHVzaW5nIFR5cGUgPSBFeHBlY3RlZDxUPjsKK307CisKK3RlbXBsYXRlIDw+IGNsYXNzIFdyYXBwZWRIYW5kbGVyUmV0dXJuPHZvaWQ+IHsKK3B1YmxpYzoKKyAgdXNpbmcgVHlwZSA9IEVycm9yOworfTsKKwordGVtcGxhdGUgPD4gY2xhc3MgV3JhcHBlZEhhbmRsZXJSZXR1cm48RXJyb3I+IHsKK3B1YmxpYzoKKyAgdXNpbmcgVHlwZSA9IEVycm9yOworfTsKKwordGVtcGxhdGUgPD4gY2xhc3MgV3JhcHBlZEhhbmRsZXJSZXR1cm48RXJyb3JTdWNjZXNzPiB7CitwdWJsaWM6CisgIHVzaW5nIFR5cGUgPSBFcnJvcjsKK307CisKKy8vIFRyYWl0cyBjbGFzcyB0aGF0IHN0cmlwcyB0aGUgcmVzcG9uc2UgZnVuY3Rpb24gZnJvbSB0aGUgbGlzdCBvZiBoYW5kbGVyCisvLyBhcmd1bWVudHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRm5UPiBjbGFzcyBBc3luY0hhbmRsZXJUcmFpdHM7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSZXN1bHRULCB0eXBlbmFtZS4uLiBBcmdUcz4KK2NsYXNzIEFzeW5jSGFuZGxlclRyYWl0czxFcnJvcihzdGQ6OmZ1bmN0aW9uPEVycm9yKEV4cGVjdGVkPFJlc3VsdFQ+KT4sIEFyZ1RzLi4uKT4geworcHVibGljOgorICB1c2luZyBUeXBlID0gRXJyb3IoQXJnVHMuLi4pOworICB1c2luZyBSZXN1bHRUeXBlID0gRXhwZWN0ZWQ8UmVzdWx0VD47Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJnVHM+CitjbGFzcyBBc3luY0hhbmRsZXJUcmFpdHM8RXJyb3Ioc3RkOjpmdW5jdGlvbjxFcnJvcihFcnJvcik+LCBBcmdUcy4uLik+IHsKK3B1YmxpYzoKKyAgdXNpbmcgVHlwZSA9IEVycm9yKEFyZ1RzLi4uKTsKKyAgdXNpbmcgUmVzdWx0VHlwZSA9IEVycm9yOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ1RzPgorY2xhc3MgQXN5bmNIYW5kbGVyVHJhaXRzPEVycm9yU3VjY2VzcyhzdGQ6OmZ1bmN0aW9uPEVycm9yKEVycm9yKT4sIEFyZ1RzLi4uKT4geworcHVibGljOgorICB1c2luZyBUeXBlID0gRXJyb3IoQXJnVHMuLi4pOworICB1c2luZyBSZXN1bHRUeXBlID0gRXJyb3I7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gQXJnVHM+CitjbGFzcyBBc3luY0hhbmRsZXJUcmFpdHM8dm9pZChzdGQ6OmZ1bmN0aW9uPEVycm9yKEVycm9yKT4sIEFyZ1RzLi4uKT4geworcHVibGljOgorICB1c2luZyBUeXBlID0gRXJyb3IoQXJnVHMuLi4pOworICB1c2luZyBSZXN1bHRUeXBlID0gRXJyb3I7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVzcG9uc2VIYW5kbGVyVCwgdHlwZW5hbWUuLi4gQXJnVHM+CitjbGFzcyBBc3luY0hhbmRsZXJUcmFpdHM8RXJyb3IoUmVzcG9uc2VIYW5kbGVyVCwgQXJnVHMuLi4pPiA6CisgICAgcHVibGljIEFzeW5jSGFuZGxlclRyYWl0czxFcnJvcih0eXBlbmFtZSBzdGQ6OmRlY2F5PFJlc3BvbnNlSGFuZGxlclQ+Ojp0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnVHMuLi4pPiB7fTsKKworLy8gVGhpcyB0ZW1wbGF0ZSBjbGFzcyBwcm92aWRlcyB1dGlsaXRpZXMgcmVsYXRlZCB0byBSUEMgZnVuY3Rpb24gaGFuZGxlcnMuCisvLyBUaGUgYmFzZSBjYXNlIGFwcGxpZXMgdG8gbm9uLWZ1bmN0aW9uIHR5cGVzICh0aGUgdGVtcGxhdGUgY2xhc3MgaXMKKy8vIHNwZWNpYWxpemVkIGZvciBmdW5jdGlvbiB0eXBlcykgYW5kIGluaGVyaXRzIGZyb20gdGhlIGFwcHJvcHJpYXRlCisvLyBzcGVjaWlsaXphdGlvbiBmb3IgdGhlIGdpdmVuIG5vbi1mdW5jdGlvbiB0eXBlJ3MgY2FsbCBvcGVyYXRvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyVD4KK2NsYXNzIEhhbmRsZXJUcmFpdHMgOiBwdWJsaWMgSGFuZGxlclRyYWl0czxkZWNsdHlwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxIYW5kbGVyVD46OnR5cGU6Om9wZXJhdG9yKCkpPiB7Cit9OworCisvLyBUcmFpdHMgZm9yIGhhbmRsZXJzIHdpdGggYSBnaXZlbiBmdW5jdGlvbiB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIFJldFQsIHR5cGVuYW1lLi4uIEFyZ1RzPgorY2xhc3MgSGFuZGxlclRyYWl0czxSZXRUKEFyZ1RzLi4uKT4geworcHVibGljOgorICAvLyBGdW5jdGlvbiB0eXBlIG9mIHRoZSBoYW5kbGVyLgorICB1c2luZyBUeXBlID0gUmV0VChBcmdUcy4uLik7CisKKyAgLy8gUmV0dXJuIHR5cGUgb2YgdGhlIGhhbmRsZXIuCisgIHVzaW5nIFJldHVyblR5cGUgPSBSZXRUOworCisgIC8vIENhbGwgdGhlIGdpdmVuIGhhbmRsZXIgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlclQsIHR5cGVuYW1lLi4uIFRBcmdUcz4KKyAgc3RhdGljIHR5cGVuYW1lIFdyYXBwZWRIYW5kbGVyUmV0dXJuPFJldFQ+OjpUeXBlCisgIHVucGFja0FuZFJ1bihIYW5kbGVyVCAmSGFuZGxlciwgc3RkOjp0dXBsZTxUQXJnVHMuLi4+ICZBcmdzKSB7CisgICAgcmV0dXJuIHVucGFja0FuZFJ1bkhlbHBlcihIYW5kbGVyLCBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6aW5kZXhfc2VxdWVuY2VfZm9yPFRBcmdUcy4uLj4oKSk7CisgIH0KKworICAvLyBDYWxsIHRoZSBnaXZlbiBoYW5kbGVyIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXJULCB0eXBlbmFtZSBSZXNwb25kZXJULCB0eXBlbmFtZS4uLiBUQXJnVHM+CisgIHN0YXRpYyBFcnJvciB1bnBhY2tBbmRSdW5Bc3luYyhIYW5kbGVyVCAmSGFuZGxlciwgUmVzcG9uZGVyVCAmUmVzcG9uZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp0dXBsZTxUQXJnVHMuLi4+ICZBcmdzKSB7CisgICAgcmV0dXJuIHVucGFja0FuZFJ1bkFzeW5jSGVscGVyKEhhbmRsZXIsIFJlc3BvbmRlciwgQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6aW5kZXhfc2VxdWVuY2VfZm9yPFRBcmdUcy4uLj4oKSk7CisgIH0KKworICAvLyBDYWxsIHRoZSBnaXZlbiBoYW5kbGVyIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50cy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXJUPgorICBzdGF0aWMgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICBzdGQ6OmlzX3ZvaWQ8dHlwZW5hbWUgSGFuZGxlclRyYWl0czxIYW5kbGVyVD46OlJldHVyblR5cGU+Ojp2YWx1ZSwKKyAgICAgIEVycm9yPjo6dHlwZQorICBydW4oSGFuZGxlclQgJkhhbmRsZXIsIEFyZ1RzICYmLi4uIEFyZ3MpIHsKKyAgICBIYW5kbGVyKHN0ZDo6bW92ZShBcmdzKS4uLik7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlclQsIHR5cGVuYW1lLi4uIFRBcmdUcz4KKyAgc3RhdGljIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgIXN0ZDo6aXNfdm9pZDx0eXBlbmFtZSBIYW5kbGVyVHJhaXRzPEhhbmRsZXJUPjo6UmV0dXJuVHlwZT46OnZhbHVlLAorICAgICAgdHlwZW5hbWUgSGFuZGxlclRyYWl0czxIYW5kbGVyVD46OlJldHVyblR5cGU+Ojp0eXBlCisgIHJ1bihIYW5kbGVyVCAmSGFuZGxlciwgVEFyZ1RzLi4uIEFyZ3MpIHsKKyAgICByZXR1cm4gSGFuZGxlcihzdGQ6Om1vdmUoQXJncykuLi4pOworICB9CisKKyAgLy8gU2VyaWFsaXplIGFyZ3VtZW50cyB0byB0aGUgY2hhbm5lbC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZS4uLiBDQXJnVHM+CisgIHN0YXRpYyBFcnJvciBzZXJpYWxpemVBcmdzKENoYW5uZWxUICZDLCBjb25zdCBDQXJnVHMuLi4gQ0FyZ3MpIHsKKyAgICByZXR1cm4gU2VxdWVuY2VTZXJpYWxpemF0aW9uPENoYW5uZWxULCBBcmdUcy4uLj46OnNlcmlhbGl6ZShDLCBDQXJncy4uLik7CisgIH0KKworICAvLyBEZXNlcmlhbGl6ZSBhcmd1bWVudHMgZnJvbSB0aGUgY2hhbm5lbC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZS4uLiBDQXJnVHM+CisgIHN0YXRpYyBFcnJvciBkZXNlcmlhbGl6ZUFyZ3MoQ2hhbm5lbFQgJkMsIHN0ZDo6dHVwbGU8Q0FyZ1RzLi4uPiAmQXJncykgeworICAgIHJldHVybiBkZXNlcmlhbGl6ZUFyZ3NIZWxwZXIoQywgQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OmluZGV4X3NlcXVlbmNlX2ZvcjxDQXJnVHMuLi4+KCkpOworICB9CisKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUuLi4gQ0FyZ1RzLCBzaXplX3QuLi4gSW5kZXhlcz4KKyAgc3RhdGljIEVycm9yIGRlc2VyaWFsaXplQXJnc0hlbHBlcihDaGFubmVsVCAmQywgc3RkOjp0dXBsZTxDQXJnVHMuLi4+ICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OmluZGV4X3NlcXVlbmNlPEluZGV4ZXMuLi4+IF8pIHsKKyAgICByZXR1cm4gU2VxdWVuY2VTZXJpYWxpemF0aW9uPENoYW5uZWxULCBBcmdUcy4uLj46OmRlc2VyaWFsaXplKAorICAgICAgICBDLCBzdGQ6OmdldDxJbmRleGVzPihBcmdzKS4uLik7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlclQsIHR5cGVuYW1lIEFyZ1R1cGxlLCBzaXplX3QuLi4gSW5kZXhlcz4KKyAgc3RhdGljIHR5cGVuYW1lIFdyYXBwZWRIYW5kbGVyUmV0dXJuPAorICAgICAgdHlwZW5hbWUgSGFuZGxlclRyYWl0czxIYW5kbGVyVD46OlJldHVyblR5cGU+OjpUeXBlCisgIHVucGFja0FuZFJ1bkhlbHBlcihIYW5kbGVyVCAmSGFuZGxlciwgQXJnVHVwbGUgJkFyZ3MsCisgICAgICAgICAgICAgICAgICAgICBsbHZtOjppbmRleF9zZXF1ZW5jZTxJbmRleGVzLi4uPikgeworICAgIHJldHVybiBydW4oSGFuZGxlciwgc3RkOjptb3ZlKHN0ZDo6Z2V0PEluZGV4ZXM+KEFyZ3MpKS4uLik7CisgIH0KKworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyVCwgdHlwZW5hbWUgUmVzcG9uZGVyVCwgdHlwZW5hbWUgQXJnVHVwbGUsCisgICAgICAgICAgICBzaXplX3QuLi4gSW5kZXhlcz4KKyAgc3RhdGljIHR5cGVuYW1lIFdyYXBwZWRIYW5kbGVyUmV0dXJuPAorICAgICAgdHlwZW5hbWUgSGFuZGxlclRyYWl0czxIYW5kbGVyVD46OlJldHVyblR5cGU+OjpUeXBlCisgIHVucGFja0FuZFJ1bkFzeW5jSGVscGVyKEhhbmRsZXJUICZIYW5kbGVyLCBSZXNwb25kZXJUICZSZXNwb25kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZ1R1cGxlICZBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjppbmRleF9zZXF1ZW5jZTxJbmRleGVzLi4uPikgeworICAgIHJldHVybiBydW4oSGFuZGxlciwgUmVzcG9uZGVyLCBzdGQ6Om1vdmUoc3RkOjpnZXQ8SW5kZXhlcz4oQXJncykpLi4uKTsKKyAgfQorfTsKKworLy8gSGFuZGxlciB0cmFpdHMgZm9yIGZyZWUgZnVuY3Rpb25zLgordGVtcGxhdGUgPHR5cGVuYW1lIFJldFQsIHR5cGVuYW1lLi4uIEFyZ1RzPgorY2xhc3MgSGFuZGxlclRyYWl0czxSZXRUKCopKEFyZ1RzLi4uKT4KKyAgOiBwdWJsaWMgSGFuZGxlclRyYWl0czxSZXRUKEFyZ1RzLi4uKT4ge307CisKKy8vIEhhbmRsZXIgdHJhaXRzIGZvciBjbGFzcyBtZXRob2RzIChlc3BlY2lhbGx5IGNhbGwgb3BlcmF0b3JzIGZvciBsYW1iZGFzKS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcywgdHlwZW5hbWUgUmV0VCwgdHlwZW5hbWUuLi4gQXJnVHM+CitjbGFzcyBIYW5kbGVyVHJhaXRzPFJldFQgKENsYXNzOjoqKShBcmdUcy4uLik+CisgICAgOiBwdWJsaWMgSGFuZGxlclRyYWl0czxSZXRUKEFyZ1RzLi4uKT4ge307CisKKy8vIEhhbmRsZXIgdHJhaXRzIGZvciBjb25zdCBjbGFzcyBtZXRob2RzIChlc3BlY2lhbGx5IGNhbGwgb3BlcmF0b3JzIGZvcgorLy8gbGFtYmRhcykuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIFJldFQsIHR5cGVuYW1lLi4uIEFyZ1RzPgorY2xhc3MgSGFuZGxlclRyYWl0czxSZXRUIChDbGFzczo6KikoQXJnVHMuLi4pIGNvbnN0PgorICAgIDogcHVibGljIEhhbmRsZXJUcmFpdHM8UmV0VChBcmdUcy4uLik+IHt9OworCisvLyBVdGlsaXR5IHRvIHBlZWwgdGhlIEV4cGVjdGVkIHdyYXBwZXIgb2ZmIGEgcmVzcG9uc2UgaGFuZGxlciBlcnJvciB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXJUPiBjbGFzcyBSZXNwb25zZUhhbmRsZXJBcmc7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmdUPiBjbGFzcyBSZXNwb25zZUhhbmRsZXJBcmc8RXJyb3IoRXhwZWN0ZWQ8QXJnVD4pPiB7CitwdWJsaWM6CisgIHVzaW5nIEFyZ1R5cGUgPSBFeHBlY3RlZDxBcmdUPjsKKyAgdXNpbmcgVW53cmFwcGVkQXJnVHlwZSA9IEFyZ1Q7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnVD4KK2NsYXNzIFJlc3BvbnNlSGFuZGxlckFyZzxFcnJvclN1Y2Nlc3MoRXhwZWN0ZWQ8QXJnVD4pPiB7CitwdWJsaWM6CisgIHVzaW5nIEFyZ1R5cGUgPSBFeHBlY3RlZDxBcmdUPjsKKyAgdXNpbmcgVW53cmFwcGVkQXJnVHlwZSA9IEFyZ1Q7Cit9OworCit0ZW1wbGF0ZSA8PiBjbGFzcyBSZXNwb25zZUhhbmRsZXJBcmc8RXJyb3IoRXJyb3IpPiB7CitwdWJsaWM6CisgIHVzaW5nIEFyZ1R5cGUgPSBFcnJvcjsKK307CisKK3RlbXBsYXRlIDw+IGNsYXNzIFJlc3BvbnNlSGFuZGxlckFyZzxFcnJvclN1Y2Nlc3MoRXJyb3IpPiB7CitwdWJsaWM6CisgIHVzaW5nIEFyZ1R5cGUgPSBFcnJvcjsKK307CisKKy8vIFJlc3BvbnNlSGFuZGxlciByZXByZXNlbnRzIGEgaGFuZGxlciBmb3IgYSBub3QteWV0LXJlY2VpdmVkIGZ1bmN0aW9uIGNhbGwKKy8vIHJlc3VsdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVD4gY2xhc3MgUmVzcG9uc2VIYW5kbGVyIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+UmVzcG9uc2VIYW5kbGVyKCkge30KKworICAvLyBSZWFkcyB0aGUgZnVuY3Rpb24gcmVzdWx0IG9mZiB0aGUgd2lyZSBhbmQgYWN0cyBvbiBpdC4gVGhlIG1lYW5pbmcgb2YKKyAgLy8gImFjdCIgd2lsbCBkZXBlbmQgb24gaG93IHRoaXMgbWV0aG9kIGlzIGltcGxlbWVudGVkIGluIGFueSBnaXZlbgorICAvLyBSZXNwb25zZUhhbmRsZXIgc3ViY2xhc3MgYnV0IGNvdWxkLCBmb3IgZXhhbXBsZSwgbWVhbiBydW5uaW5nIGEKKyAgLy8gdXNlci1zcGVjaWZpZWQgaGFuZGxlciBvciBzZXR0aW5nIGEgcHJvbWlzZSB2YWx1ZS4KKyAgdmlydHVhbCBFcnJvciBoYW5kbGVSZXNwb25zZShDaGFubmVsVCAmQykgPSAwOworCisgIC8vIEFiYW5kb25zIHRoaXMgb3V0c3RhbmRpbmcgcmVzdWx0LgorICB2aXJ0dWFsIHZvaWQgYWJhbmRvbigpID0gMDsKKworICAvLyBDcmVhdGUgYW4gZXJyb3IgaW5zdGFuY2UgcmVwcmVzZW50aW5nIGFuIGFiYW5kb25lZCByZXNwb25zZS4KKyAgc3RhdGljIEVycm9yIGNyZWF0ZUFiYW5kb25lZFJlc3BvbnNlRXJyb3IoKSB7CisgICAgcmV0dXJuIG1ha2VfZXJyb3I8UmVzcG9uc2VBYmFuZG9uZWQ+KCk7CisgIH0KK307CisKKy8vIFJlc3BvbnNlSGFuZGxlciBzdWJjbGFzcyBmb3IgUlBDIGZ1bmN0aW9ucyB3aXRoIG5vbi12b2lkIHJldHVybnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQsIHR5cGVuYW1lIEZ1bmNSZXRULCB0eXBlbmFtZSBIYW5kbGVyVD4KK2NsYXNzIFJlc3BvbnNlSGFuZGxlckltcGwgOiBwdWJsaWMgUmVzcG9uc2VIYW5kbGVyPENoYW5uZWxUPiB7CitwdWJsaWM6CisgIFJlc3BvbnNlSGFuZGxlckltcGwoSGFuZGxlclQgSGFuZGxlcikgOiBIYW5kbGVyKHN0ZDo6bW92ZShIYW5kbGVyKSkge30KKworICAvLyBIYW5kbGUgdGhlIHJlc3VsdCBieSBkZXNlcmlhbGl6aW5nIGl0IGZyb20gdGhlIGNoYW5uZWwgdGhlbiBwYXNzaW5nIGl0CisgIC8vIHRvIHRoZSB1c2VyIGRlZmluZWQgaGFuZGxlci4KKyAgRXJyb3IgaGFuZGxlUmVzcG9uc2UoQ2hhbm5lbFQgJkMpIG92ZXJyaWRlIHsKKyAgICB1c2luZyBVbndyYXBwZWRBcmdUeXBlID0gdHlwZW5hbWUgUmVzcG9uc2VIYW5kbGVyQXJnPAorICAgICAgICB0eXBlbmFtZSBIYW5kbGVyVHJhaXRzPEhhbmRsZXJUPjo6VHlwZT46OlVud3JhcHBlZEFyZ1R5cGU7CisgICAgVW53cmFwcGVkQXJnVHlwZSBSZXN1bHQ7CisgICAgaWYgKGF1dG8gRXJyID0KKyAgICAgICAgICAgIFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIEZ1bmNSZXRULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbndyYXBwZWRBcmdUeXBlPjo6ZGVzZXJpYWxpemUoQywgUmVzdWx0KSkKKyAgICAgIHJldHVybiBFcnI7CisgICAgaWYgKGF1dG8gRXJyID0gQy5lbmRSZWNlaXZlTWVzc2FnZSgpKQorICAgICAgcmV0dXJuIEVycjsKKyAgICByZXR1cm4gSGFuZGxlcihzdGQ6Om1vdmUoUmVzdWx0KSk7CisgIH0KKworICAvLyBBYmFuZG9uIHRoaXMgcmVzcG9uc2UgYnkgY2FsbGluZyB0aGUgaGFuZGxlciB3aXRoIGFuICdhYmFuZG9uZWQgcmVzcG9uc2UnCisgIC8vIGVycm9yLgorICB2b2lkIGFiYW5kb24oKSBvdmVycmlkZSB7CisgICAgaWYgKGF1dG8gRXJyID0gSGFuZGxlcih0aGlzLT5jcmVhdGVBYmFuZG9uZWRSZXNwb25zZUVycm9yKCkpKSB7CisgICAgICAvLyBIYW5kbGVycyBzaG91bGQgbm90IGZhaWwgd2hlbiBwYXNzZWQgYW4gYWJhbmRvbmVkIHJlc3BvbnNlIGVycm9yLgorICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKHN0ZDo6bW92ZShFcnIpKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgSGFuZGxlclQgSGFuZGxlcjsKK307CisKKy8vIFJlc3BvbnNlSGFuZGxlciBzdWJjbGFzcyBmb3IgUlBDIGZ1bmN0aW9ucyB3aXRoIHZvaWQgcmV0dXJucy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUgSGFuZGxlclQ+CitjbGFzcyBSZXNwb25zZUhhbmRsZXJJbXBsPENoYW5uZWxULCB2b2lkLCBIYW5kbGVyVD4KKyAgICA6IHB1YmxpYyBSZXNwb25zZUhhbmRsZXI8Q2hhbm5lbFQ+IHsKK3B1YmxpYzoKKyAgUmVzcG9uc2VIYW5kbGVySW1wbChIYW5kbGVyVCBIYW5kbGVyKSA6IEhhbmRsZXIoc3RkOjptb3ZlKEhhbmRsZXIpKSB7fQorCisgIC8vIEhhbmRsZSB0aGUgcmVzdWx0IChubyBhY3R1YWwgdmFsdWUsIGp1c3QgYSBub3RpZmljYXRpb24gdGhhdCB0aGUgZnVuY3Rpb24KKyAgLy8gaGFzIGNvbXBsZXRlZCBvbiB0aGUgcmVtb3RlIGVuZCkgYnkgY2FsbGluZyB0aGUgdXNlci1kZWZpbmVkIGhhbmRsZXIgd2l0aAorICAvLyBFcnJvcjo6c3VjY2VzcygpLgorICBFcnJvciBoYW5kbGVSZXNwb25zZShDaGFubmVsVCAmQykgb3ZlcnJpZGUgeworICAgIGlmIChhdXRvIEVyciA9IEMuZW5kUmVjZWl2ZU1lc3NhZ2UoKSkKKyAgICAgIHJldHVybiBFcnI7CisgICAgcmV0dXJuIEhhbmRsZXIoRXJyb3I6OnN1Y2Nlc3MoKSk7CisgIH0KKworICAvLyBBYmFuZG9uIHRoaXMgcmVzcG9uc2UgYnkgY2FsbGluZyB0aGUgaGFuZGxlciB3aXRoIGFuICdhYmFuZG9uZWQgcmVzcG9uc2UnCisgIC8vIGVycm9yLgorICB2b2lkIGFiYW5kb24oKSBvdmVycmlkZSB7CisgICAgaWYgKGF1dG8gRXJyID0gSGFuZGxlcih0aGlzLT5jcmVhdGVBYmFuZG9uZWRSZXNwb25zZUVycm9yKCkpKSB7CisgICAgICAvLyBIYW5kbGVycyBzaG91bGQgbm90IGZhaWwgd2hlbiBwYXNzZWQgYW4gYWJhbmRvbmVkIHJlc3BvbnNlIGVycm9yLgorICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKHN0ZDo6bW92ZShFcnIpKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgSGFuZGxlclQgSGFuZGxlcjsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUgRnVuY1JldFQsIHR5cGVuYW1lIEhhbmRsZXJUPgorY2xhc3MgUmVzcG9uc2VIYW5kbGVySW1wbDxDaGFubmVsVCwgRXhwZWN0ZWQ8RnVuY1JldFQ+LCBIYW5kbGVyVD4KKyAgICA6IHB1YmxpYyBSZXNwb25zZUhhbmRsZXI8Q2hhbm5lbFQ+IHsKK3B1YmxpYzoKKyAgUmVzcG9uc2VIYW5kbGVySW1wbChIYW5kbGVyVCBIYW5kbGVyKSA6IEhhbmRsZXIoc3RkOjptb3ZlKEhhbmRsZXIpKSB7fQorCisgIC8vIEhhbmRsZSB0aGUgcmVzdWx0IGJ5IGRlc2VyaWFsaXppbmcgaXQgZnJvbSB0aGUgY2hhbm5lbCB0aGVuIHBhc3NpbmcgaXQKKyAgLy8gdG8gdGhlIHVzZXIgZGVmaW5lZCBoYW5kbGVyLgorICBFcnJvciBoYW5kbGVSZXNwb25zZShDaGFubmVsVCAmQykgb3ZlcnJpZGUgeworICAgIHVzaW5nIEhhbmRsZXJBcmdUeXBlID0gdHlwZW5hbWUgUmVzcG9uc2VIYW5kbGVyQXJnPAorICAgICAgICB0eXBlbmFtZSBIYW5kbGVyVHJhaXRzPEhhbmRsZXJUPjo6VHlwZT46OkFyZ1R5cGU7CisgICAgSGFuZGxlckFyZ1R5cGUgUmVzdWx0KCh0eXBlbmFtZSBIYW5kbGVyQXJnVHlwZTo6dmFsdWVfdHlwZSgpKSk7CisKKyAgICBpZiAoYXV0byBFcnIgPQorICAgICAgICAgICAgU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgRXhwZWN0ZWQ8RnVuY1JldFQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyQXJnVHlwZT46OmRlc2VyaWFsaXplKEMsIFJlc3VsdCkpCisgICAgICByZXR1cm4gRXJyOworICAgIGlmIChhdXRvIEVyciA9IEMuZW5kUmVjZWl2ZU1lc3NhZ2UoKSkKKyAgICAgIHJldHVybiBFcnI7CisgICAgcmV0dXJuIEhhbmRsZXIoc3RkOjptb3ZlKFJlc3VsdCkpOworICB9CisKKyAgLy8gQWJhbmRvbiB0aGlzIHJlc3BvbnNlIGJ5IGNhbGxpbmcgdGhlIGhhbmRsZXIgd2l0aCBhbiAnYWJhbmRvbmVkIHJlc3BvbnNlJworICAvLyBlcnJvci4KKyAgdm9pZCBhYmFuZG9uKCkgb3ZlcnJpZGUgeworICAgIGlmIChhdXRvIEVyciA9IEhhbmRsZXIodGhpcy0+Y3JlYXRlQWJhbmRvbmVkUmVzcG9uc2VFcnJvcigpKSkgeworICAgICAgLy8gSGFuZGxlcnMgc2hvdWxkIG5vdCBmYWlsIHdoZW4gcGFzc2VkIGFuIGFiYW5kb25lZCByZXNwb25zZSBlcnJvci4KKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcihzdGQ6Om1vdmUoRXJyKSk7CisgICAgfQorICB9CisKK3ByaXZhdGU6CisgIEhhbmRsZXJUIEhhbmRsZXI7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQsIHR5cGVuYW1lIEhhbmRsZXJUPgorY2xhc3MgUmVzcG9uc2VIYW5kbGVySW1wbDxDaGFubmVsVCwgRXJyb3IsIEhhbmRsZXJUPgorICAgIDogcHVibGljIFJlc3BvbnNlSGFuZGxlcjxDaGFubmVsVD4geworcHVibGljOgorICBSZXNwb25zZUhhbmRsZXJJbXBsKEhhbmRsZXJUIEhhbmRsZXIpIDogSGFuZGxlcihzdGQ6Om1vdmUoSGFuZGxlcikpIHt9CisKKyAgLy8gSGFuZGxlIHRoZSByZXN1bHQgYnkgZGVzZXJpYWxpemluZyBpdCBmcm9tIHRoZSBjaGFubmVsIHRoZW4gcGFzc2luZyBpdAorICAvLyB0byB0aGUgdXNlciBkZWZpbmVkIGhhbmRsZXIuCisgIEVycm9yIGhhbmRsZVJlc3BvbnNlKENoYW5uZWxUICZDKSBvdmVycmlkZSB7CisgICAgRXJyb3IgUmVzdWx0ID0gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICBpZiAoYXV0byBFcnIgPQorICAgICAgICAgICAgU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgRXJyb3IsIEVycm9yPjo6ZGVzZXJpYWxpemUoQywgUmVzdWx0KSkKKyAgICAgIHJldHVybiBFcnI7CisgICAgaWYgKGF1dG8gRXJyID0gQy5lbmRSZWNlaXZlTWVzc2FnZSgpKQorICAgICAgcmV0dXJuIEVycjsKKyAgICByZXR1cm4gSGFuZGxlcihzdGQ6Om1vdmUoUmVzdWx0KSk7CisgIH0KKworICAvLyBBYmFuZG9uIHRoaXMgcmVzcG9uc2UgYnkgY2FsbGluZyB0aGUgaGFuZGxlciB3aXRoIGFuICdhYmFuZG9uZWQgcmVzcG9uc2UnCisgIC8vIGVycm9yLgorICB2b2lkIGFiYW5kb24oKSBvdmVycmlkZSB7CisgICAgaWYgKGF1dG8gRXJyID0gSGFuZGxlcih0aGlzLT5jcmVhdGVBYmFuZG9uZWRSZXNwb25zZUVycm9yKCkpKSB7CisgICAgICAvLyBIYW5kbGVycyBzaG91bGQgbm90IGZhaWwgd2hlbiBwYXNzZWQgYW4gYWJhbmRvbmVkIHJlc3BvbnNlIGVycm9yLgorICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKHN0ZDo6bW92ZShFcnIpKTsKKyAgICB9CisgIH0KKworcHJpdmF0ZToKKyAgSGFuZGxlclQgSGFuZGxlcjsKK307CisKKy8vIENyZWF0ZSBhIFJlc3BvbnNlSGFuZGxlciBmcm9tIGEgZ2l2ZW4gdXNlciBoYW5kbGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZSBGdW5jUmV0VCwgdHlwZW5hbWUgSGFuZGxlclQ+CitzdGQ6OnVuaXF1ZV9wdHI8UmVzcG9uc2VIYW5kbGVyPENoYW5uZWxUPj4gY3JlYXRlUmVzcG9uc2VIYW5kbGVyKEhhbmRsZXJUIEgpIHsKKyAgcmV0dXJuIGxsdm06Om1ha2VfdW5pcXVlPFJlc3BvbnNlSGFuZGxlckltcGw8Q2hhbm5lbFQsIEZ1bmNSZXRULCBIYW5kbGVyVD4+KAorICAgICAgc3RkOjptb3ZlKEgpKTsKK30KKworLy8gSGVscGVyIGZvciB3cmFwcGluZyBtZW1iZXIgZnVuY3Rpb25zIHVwIGFzIGZ1bmN0b3JzLiBUaGlzIGlzIHVzZWZ1bCBmb3IKKy8vIGluc3RhbGxpbmcgbWV0aG9kcyBhcyByZXN1bHQgaGFuZGxlcnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3NULCB0eXBlbmFtZSBSZXRULCB0eXBlbmFtZS4uLiBBcmdUcz4KK2NsYXNzIE1lbWJlckZuV3JhcHBlciB7CitwdWJsaWM6CisgIHVzaW5nIE1ldGhvZFQgPSBSZXRUIChDbGFzc1Q6OiopKEFyZ1RzLi4uKTsKKyAgTWVtYmVyRm5XcmFwcGVyKENsYXNzVCAmSW5zdGFuY2UsIE1ldGhvZFQgTWV0aG9kKQorICAgICAgOiBJbnN0YW5jZShJbnN0YW5jZSksIE1ldGhvZChNZXRob2QpIHt9CisgIFJldFQgb3BlcmF0b3IoKShBcmdUcyAmJi4uLiBBcmdzKSB7CisgICAgcmV0dXJuIChJbnN0YW5jZS4qTWV0aG9kKShzdGQ6Om1vdmUoQXJncykuLi4pOworICB9CisKK3ByaXZhdGU6CisgIENsYXNzVCAmSW5zdGFuY2U7CisgIE1ldGhvZFQgTWV0aG9kOworfTsKKworLy8gSGVscGVyIHRoYXQgcHJvdmlkZXMgYSBGdW5jdG9yIGZvciBkZXNlcmlhbGl6aW5nIGFyZ3VtZW50cy4KK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBBcmdUcz4gY2xhc3MgUmVhZEFyZ3MgeworcHVibGljOgorICBFcnJvciBvcGVyYXRvcigpKCkgeyByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEFyZ1QsIHR5cGVuYW1lLi4uIEFyZ1RzPgorY2xhc3MgUmVhZEFyZ3M8QXJnVCwgQXJnVHMuLi4+IDogcHVibGljIFJlYWRBcmdzPEFyZ1RzLi4uPiB7CitwdWJsaWM6CisgIFJlYWRBcmdzKEFyZ1QgJkFyZywgQXJnVHMgJi4uLiBBcmdzKQorICAgICAgOiBSZWFkQXJnczxBcmdUcy4uLj4oQXJncy4uLiksIEFyZyhBcmcpIHt9CisKKyAgRXJyb3Igb3BlcmF0b3IoKShBcmdUICZBcmdWYWwsIEFyZ1RzICYuLi4gQXJnVmFscykgeworICAgIHRoaXMtPkFyZyA9IHN0ZDo6bW92ZShBcmdWYWwpOworICAgIHJldHVybiBSZWFkQXJnczxBcmdUcy4uLj46Om9wZXJhdG9yKCkoQXJnVmFscy4uLik7CisgIH0KKworcHJpdmF0ZToKKyAgQXJnVCAmQXJnOworfTsKKworLy8gTWFuYWdlIHNlcXVlbmNlIG51bWJlcnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU2VxdWVuY2VOdW1iZXJUPiBjbGFzcyBTZXF1ZW5jZU51bWJlck1hbmFnZXIgeworcHVibGljOgorICAvLyBSZXNldCwgbWFraW5nIGFsbCBzZXF1ZW5jZSBudW1iZXJzIGF2YWlsYWJsZS4KKyAgdm9pZCByZXNldCgpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gTG9jayhTZXFOb0xvY2spOworICAgIE5leHRTZXF1ZW5jZU51bWJlciA9IDA7CisgICAgRnJlZVNlcXVlbmNlTnVtYmVycy5jbGVhcigpOworICB9CisKKyAgLy8gR2V0IHRoZSBuZXh0IGF2YWlsYWJsZSBzZXF1ZW5jZSBudW1iZXIuIFdpbGwgcmUtdXNlIG51bWJlcnMgdGhhdCBoYXZlCisgIC8vIGJlZW4gcmVsZWFzZWQuCisgIFNlcXVlbmNlTnVtYmVyVCBnZXRTZXF1ZW5jZU51bWJlcigpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gTG9jayhTZXFOb0xvY2spOworICAgIGlmIChGcmVlU2VxdWVuY2VOdW1iZXJzLmVtcHR5KCkpCisgICAgICByZXR1cm4gTmV4dFNlcXVlbmNlTnVtYmVyKys7CisgICAgYXV0byBTZXF1ZW5jZU51bWJlciA9IEZyZWVTZXF1ZW5jZU51bWJlcnMuYmFjaygpOworICAgIEZyZWVTZXF1ZW5jZU51bWJlcnMucG9wX2JhY2soKTsKKyAgICByZXR1cm4gU2VxdWVuY2VOdW1iZXI7CisgIH0KKworICAvLyBSZWxlYXNlIGEgc2VxdWVuY2UgbnVtYmVyLCBtYWtpbmcgaXQgYXZhaWxhYmxlIGZvciByZS11c2UuCisgIHZvaWQgcmVsZWFzZVNlcXVlbmNlTnVtYmVyKFNlcXVlbmNlTnVtYmVyVCBTZXF1ZW5jZU51bWJlcikgeworICAgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBMb2NrKFNlcU5vTG9jayk7CisgICAgRnJlZVNlcXVlbmNlTnVtYmVycy5wdXNoX2JhY2soU2VxdWVuY2VOdW1iZXIpOworICB9CisKK3ByaXZhdGU6CisgIHN0ZDo6bXV0ZXggU2VxTm9Mb2NrOworICBTZXF1ZW5jZU51bWJlclQgTmV4dFNlcXVlbmNlTnVtYmVyID0gMDsKKyAgc3RkOjp2ZWN0b3I8U2VxdWVuY2VOdW1iZXJUPiBGcmVlU2VxdWVuY2VOdW1iZXJzOworfTsKKworLy8gQ2hlY2tzIHRoYXQgcHJlZGljYXRlIFAgaG9sZHMgZm9yIGVhY2ggY29ycmVzcG9uZGluZyBwYWlyIG9mIHR5cGUgYXJndW1lbnRzCisvLyBmcm9tIFQxIGFuZCBUMiB0dXBsZS4KK3RlbXBsYXRlIDx0ZW1wbGF0ZSA8Y2xhc3MsIGNsYXNzPiBjbGFzcyBQLCB0eXBlbmFtZSBUMVR1cGxlLCB0eXBlbmFtZSBUMlR1cGxlPgorY2xhc3MgUlBDQXJnVHlwZUNoZWNrSGVscGVyOworCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzLCBjbGFzcz4gY2xhc3MgUD4KK2NsYXNzIFJQQ0FyZ1R5cGVDaGVja0hlbHBlcjxQLCBzdGQ6OnR1cGxlPD4sIHN0ZDo6dHVwbGU8Pj4geworcHVibGljOgorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OworCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzLCBjbGFzcz4gY2xhc3MgUCwgdHlwZW5hbWUgVCwgdHlwZW5hbWUuLi4gVHMsCisgICAgICAgICAgdHlwZW5hbWUgVSwgdHlwZW5hbWUuLi4gVXM+CitjbGFzcyBSUENBcmdUeXBlQ2hlY2tIZWxwZXI8UCwgc3RkOjp0dXBsZTxULCBUcy4uLj4sIHN0ZDo6dHVwbGU8VSwgVXMuLi4+PiB7CitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0KKyAgICAgIFA8VCwgVT46OnZhbHVlICYmCisgICAgICBSUENBcmdUeXBlQ2hlY2tIZWxwZXI8UCwgc3RkOjp0dXBsZTxUcy4uLj4sIHN0ZDo6dHVwbGU8VXMuLi4+Pjo6dmFsdWU7Cit9OworCit0ZW1wbGF0ZSA8dGVtcGxhdGUgPGNsYXNzLCBjbGFzcz4gY2xhc3MgUCwgdHlwZW5hbWUgVDFTaWcsIHR5cGVuYW1lIFQyU2lnPgorY2xhc3MgUlBDQXJnVHlwZUNoZWNrIHsKK3B1YmxpYzoKKyAgdXNpbmcgVDFUdXBsZSA9IHR5cGVuYW1lIEZ1bmN0aW9uQXJnc1R1cGxlPFQxU2lnPjo6VHlwZTsKKyAgdXNpbmcgVDJUdXBsZSA9IHR5cGVuYW1lIEZ1bmN0aW9uQXJnc1R1cGxlPFQyU2lnPjo6VHlwZTsKKworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6dHVwbGVfc2l6ZTxUMVR1cGxlPjo6dmFsdWUgPj0KKyAgICAgICAgICAgICAgICAgICAgc3RkOjp0dXBsZV9zaXplPFQyVHVwbGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAiVG9vIG1hbnkgYXJndW1lbnRzIHRvIFJQQyBjYWxsIik7CisgIHN0YXRpY19hc3NlcnQoc3RkOjp0dXBsZV9zaXplPFQxVHVwbGU+Ojp2YWx1ZSA8PQorICAgICAgICAgICAgICAgICAgICBzdGQ6OnR1cGxlX3NpemU8VDJUdXBsZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICJUb28gZmV3IGFyZ3VtZW50cyB0byBSUEMgY2FsbCIpOworCisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gUlBDQXJnVHlwZUNoZWNrSGVscGVyPFAsIFQxVHVwbGUsIFQyVHVwbGU+Ojp2YWx1ZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUgV2lyZVQsIHR5cGVuYW1lIENvbmNyZXRlVD4KK2NsYXNzIENhblNlcmlhbGl6ZSB7Citwcml2YXRlOgorICB1c2luZyBTID0gU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgV2lyZVQsIENvbmNyZXRlVD47CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyBzdGQ6OnRydWVfdHlwZQorICBjaGVjayh0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgc3RkOjppc19zYW1lPGRlY2x0eXBlKFQ6OnNlcmlhbGl6ZShzdGQ6OmRlY2x2YWw8Q2hhbm5lbFQgJj4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmRlY2x2YWw8Y29uc3QgQ29uY3JldGVUICY+KCkpKSwKKyAgICAgICAgICAgICAgICAgICAgIEVycm9yPjo6dmFsdWUsCisgICAgICAgIHZvaWQgKj46OnR5cGUpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZT4gc3RhdGljIHN0ZDo6ZmFsc2VfdHlwZSBjaGVjayguLi4pOworCitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZGVjbHR5cGUoY2hlY2s8Uz4oMCkpOjp2YWx1ZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVCwgdHlwZW5hbWUgV2lyZVQsIHR5cGVuYW1lIENvbmNyZXRlVD4KK2NsYXNzIENhbkRlc2VyaWFsaXplIHsKK3ByaXZhdGU6CisgIHVzaW5nIFMgPSBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBXaXJlVCwgQ29uY3JldGVUPjsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RhdGljIHN0ZDo6dHJ1ZV90eXBlCisgIGNoZWNrKHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICBzdGQ6OmlzX3NhbWU8ZGVjbHR5cGUoVDo6ZGVzZXJpYWxpemUoc3RkOjpkZWNsdmFsPENoYW5uZWxUICY+KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmRlY2x2YWw8Q29uY3JldGVUICY+KCkpKSwKKyAgICAgICAgICAgICAgICAgICAgIEVycm9yPjo6dmFsdWUsCisgICAgICAgIHZvaWQgKj46OnR5cGUpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZT4gc3RhdGljIHN0ZDo6ZmFsc2VfdHlwZSBjaGVjayguLi4pOworCitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gZGVjbHR5cGUoY2hlY2s8Uz4oMCkpOjp2YWx1ZTsKK307CisKKy8vLyBDb250YWlucyBwcmltaXRpdmUgdXRpbGl0aWVzIGZvciBkZWZpbmluZywgY2FsbGluZyBhbmQgaGFuZGxpbmcgY2FsbHMgdG8KKy8vLyByZW1vdGUgcHJvY2VkdXJlcy4gQ2hhbm5lbFQgaXMgYSBiaWRpcmVjdGlvbmFsIHN0cmVhbSBjb25mb3JtaW5nIHRvIHRoZQorLy8vIFJQQ0NoYW5uZWwgaW50ZXJmYWNlIChzZWUgUlBDQ2hhbm5lbC5oKSwgRnVuY3Rpb25JZFQgaXMgYSBwcm9jZWR1cmUKKy8vLyBpZGVudGlmaWVyIHR5cGUgdGhhdCBtdXN0IGJlIHNlcmlhbGl6YWJsZSBvbiBDaGFubmVsVCwgYW5kIFNlcXVlbmNlTnVtYmVyVAorLy8vIGlzIGFuIGludGVncmFsIHR5cGUgdGhhdCB3aWxsIGJlIHVzZWQgdG8gbnVtYmVyIGluLWZsaWdodCBmdW5jdGlvbiBjYWxscy4KKy8vLworLy8vIFRoZXNlIHV0aWxpdGllcyBzdXBwb3J0IHRoZSBjb25zdHJ1Y3Rpb24gb2YgdmVyeSBwcmltaXRpdmUgUlBDIHV0aWxpdGllcy4KKy8vLyBUaGVpciBpbnRlbnQgaXMgdG8gZW5zdXJlIGNvcnJlY3Qgc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uIG9mCisvLy8gcHJvY2VkdXJlIGFyZ3VtZW50cywgYW5kIHRvIGtlZXAgdGhlIGNsaWVudCBhbmQgc2VydmVyJ3MgdmlldyBvZiB0aGUgQVBJIGluCisvLy8gc3luYy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbXBsVCwgdHlwZW5hbWUgQ2hhbm5lbFQsIHR5cGVuYW1lIEZ1bmN0aW9uSWRULAorICAgICAgICAgIHR5cGVuYW1lIFNlcXVlbmNlTnVtYmVyVD4KK2NsYXNzIFJQQ0VuZHBvaW50QmFzZSB7Citwcm90ZWN0ZWQ6CisgIGNsYXNzIE9yY1JQQ0ludmFsaWQgOiBwdWJsaWMgRnVuY3Rpb248T3JjUlBDSW52YWxpZCwgdm9pZCgpPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJfX29yY19ycGMkaW52YWxpZCI7IH0KKyAgfTsKKworICBjbGFzcyBPcmNSUENSZXNwb25zZSA6IHB1YmxpYyBGdW5jdGlvbjxPcmNSUENSZXNwb25zZSwgdm9pZCgpPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJfX29yY19ycGMkcmVzcG9uc2UiOyB9CisgIH07CisKKyAgY2xhc3MgT3JjUlBDTmVnb3RpYXRlCisgICAgICA6IHB1YmxpYyBGdW5jdGlvbjxPcmNSUENOZWdvdGlhdGUsIEZ1bmN0aW9uSWRUKHN0ZDo6c3RyaW5nKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiX19vcmNfcnBjJG5lZ290aWF0ZSI7IH0KKyAgfTsKKworICAvLyBIZWxwZXIgcHJlZGljYXRlIGZvciB0ZXN0aW5nIGZvciB0aGUgcHJlc2VuY2Ugb2YgU2VyaWFsaXplVHJhaXRzCisgIC8vIHNlcmlhbGl6ZXJzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgV2lyZVQsIHR5cGVuYW1lIENvbmNyZXRlVD4KKyAgY2xhc3MgQ2FuU2VyaWFsaXplQ2hlY2sgOiBkZXRhaWw6OkNhblNlcmlhbGl6ZTxDaGFubmVsVCwgV2lyZVQsIENvbmNyZXRlVD4geworICBwdWJsaWM6CisgICAgdXNpbmcgZGV0YWlsOjpDYW5TZXJpYWxpemU8Q2hhbm5lbFQsIFdpcmVULCBDb25jcmV0ZVQ+Ojp2YWx1ZTsKKworICAgIHN0YXRpY19hc3NlcnQodmFsdWUsICJNaXNzaW5nIHNlcmlhbGl6ZXIgZm9yIGFyZ3VtZW50IChDYW4ndCBzZXJpYWxpemUgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZmlyc3QgdGVtcGxhdGUgdHlwZSBhcmd1bWVudCBvZiBDYW5TZXJpYWxpemVDaGVjayAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImZyb20gdGhlIHNlY29uZCkiKTsKKyAgfTsKKworICAvLyBIZWxwZXIgcHJlZGljYXRlIGZvciB0ZXN0aW5nIGZvciB0aGUgcHJlc2VuY2Ugb2YgU2VyaWFsaXplVHJhaXRzCisgIC8vIGRlc2VyaWFsaXplcnMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBXaXJlVCwgdHlwZW5hbWUgQ29uY3JldGVUPgorICBjbGFzcyBDYW5EZXNlcmlhbGl6ZUNoZWNrCisgICAgICA6IGRldGFpbDo6Q2FuRGVzZXJpYWxpemU8Q2hhbm5lbFQsIFdpcmVULCBDb25jcmV0ZVQ+IHsKKyAgcHVibGljOgorICAgIHVzaW5nIGRldGFpbDo6Q2FuRGVzZXJpYWxpemU8Q2hhbm5lbFQsIFdpcmVULCBDb25jcmV0ZVQ+Ojp2YWx1ZTsKKworICAgIHN0YXRpY19hc3NlcnQodmFsdWUsICJNaXNzaW5nIGRlc2VyaWFsaXplciBmb3IgYXJndW1lbnQgKENhbid0IGRlc2VyaWFsaXplICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHNlY29uZCB0ZW1wbGF0ZSB0eXBlIGFyZ3VtZW50IG9mICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiQ2FuRGVzZXJpYWxpemVDaGVjayBmcm9tIHRoZSBmaXJzdCkiKTsKKyAgfTsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0IGFuIFJQQyBpbnN0YW5jZSBvbiBhIGNoYW5uZWwuCisgIFJQQ0VuZHBvaW50QmFzZShDaGFubmVsVCAmQywgYm9vbCBMYXp5QXV0b05lZ290aWF0aW9uKQorICAgICAgOiBDKEMpLCBMYXp5QXV0b05lZ290aWF0aW9uKExhenlBdXRvTmVnb3RpYXRpb24pIHsKKyAgICAvLyBIb2xkIFJlc3BvbnNlSWQgaW4gYSBzcGVjaWFsIHZhcmlhYmxlLCBzaW5jZSB3ZSBleHBlY3QgUmVzcG9uc2UgdG8gYmUKKyAgICAvLyBjYWxsZWQgcmVsYXRpdmVseSBmcmVxdWVudGx5LCBhbmQgd2FudCB0byBhdm9pZCB0aGUgbWFwIGxvb2t1cC4KKyAgICBSZXNwb25zZUlkID0gRm5JZEFsbG9jYXRvci5nZXRSZXNwb25zZUlkKCk7CisgICAgUmVtb3RlRnVuY3Rpb25JZHNbT3JjUlBDUmVzcG9uc2U6OmdldFByb3RvdHlwZSgpXSA9IFJlc3BvbnNlSWQ7CisKKyAgICAvLyBSZWdpc3RlciB0aGUgbmVnb3RpYXRlIGZ1bmN0aW9uIGlkIGFuZCBoYW5kbGVyLgorICAgIGF1dG8gTmVnb3RpYXRlSWQgPSBGbklkQWxsb2NhdG9yLmdldE5lZ290aWF0ZUlkKCk7CisgICAgUmVtb3RlRnVuY3Rpb25JZHNbT3JjUlBDTmVnb3RpYXRlOjpnZXRQcm90b3R5cGUoKV0gPSBOZWdvdGlhdGVJZDsKKyAgICBIYW5kbGVyc1tOZWdvdGlhdGVJZF0gPSB3cmFwSGFuZGxlcjxPcmNSUENOZWdvdGlhdGU+KAorICAgICAgICBbdGhpc10oY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIHsgcmV0dXJuIGhhbmRsZU5lZ290aWF0ZShOYW1lKTsgfSk7CisgIH0KKworCisgIC8vLyBOZWdvdGlhdGUgYSBmdW5jdGlvbiBpZCBmb3IgRnVuYyB3aXRoIHRoZSBvdGhlciBlbmQgb2YgdGhlIGNoYW5uZWwuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jPiBFcnJvciBuZWdvdGlhdGVGdW5jdGlvbihib29sIFJldHJ5ID0gZmFsc2UpIHsKKyAgICByZXR1cm4gZ2V0UmVtb3RlRnVuY3Rpb25JZDxGdW5jPih0cnVlLCBSZXRyeSkudGFrZUVycm9yKCk7CisgIH0KKworICAvLy8gQXBwZW5kIGEgY2FsbCBGdW5jLCBkb2VzIG5vdCBjYWxsIHNlbmQgb24gdGhlIGNoYW5uZWwuCisgIC8vLyBUaGUgZmlyc3QgYXJndW1lbnQgc3BlY2lmaWVzIGEgdXNlci1kZWZpbmVkIGhhbmRsZXIgdG8gYmUgcnVuIHdoZW4gdGhlCisgIC8vLyBmdW5jdGlvbiByZXR1cm5zLiBUaGUgaGFuZGxlciBzaG91bGQgdGFrZSBhbiBFeHBlY3RlZDxGdW5jOjpSZXR1cm5UeXBlPiwKKyAgLy8vIG9yIGFuIEVycm9yIChpZiBGdW5jOjpSZXR1cm5UeXBlIGlzIHZvaWQpLiBUaGUgaGFuZGxlciB3aWxsIGJlIGNhbGxlZAorICAvLy8gd2l0aCBhbiBlcnJvciBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGFiYW5kb25lZCBkdWUgdG8gYSBjaGFubmVsIGVycm9yLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgSGFuZGxlclQsIHR5cGVuYW1lLi4uIEFyZ1RzPgorICBFcnJvciBhcHBlbmRDYWxsQXN5bmMoSGFuZGxlclQgSGFuZGxlciwgY29uc3QgQXJnVHMgJi4uLiBBcmdzKSB7CisKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICBkZXRhaWw6OlJQQ0FyZ1R5cGVDaGVjazxDYW5TZXJpYWxpemVDaGVjaywgdHlwZW5hbWUgRnVuYzo6VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZChBcmdUcy4uLik+Ojp2YWx1ZSwKKyAgICAgICAgIiIpOworCisgICAgLy8gTG9vayB1cCB0aGUgZnVuY3Rpb24gSUQuCisgICAgRnVuY3Rpb25JZFQgRm5JZDsKKyAgICBpZiAoYXV0byBGbklkT3JFcnIgPSBnZXRSZW1vdGVGdW5jdGlvbklkPEZ1bmM+KExhenlBdXRvTmVnb3RpYXRpb24sIGZhbHNlKSkKKyAgICAgIEZuSWQgPSAqRm5JZE9yRXJyOworICAgIGVsc2UgeworICAgICAgLy8gTmVnb3RpYXRpb24gZmFpbGVkLiBOb3RpZnkgdGhlIGhhbmRsZXIgdGhlbiByZXR1cm4gdGhlIG5lZ290aWF0ZS1mYWlsZWQKKyAgICAgIC8vIGVycm9yLgorICAgICAgY2FudEZhaWwoSGFuZGxlcihtYWtlX2Vycm9yPFJlc3BvbnNlQWJhbmRvbmVkPigpKSk7CisgICAgICByZXR1cm4gRm5JZE9yRXJyLnRha2VFcnJvcigpOworICAgIH0KKworICAgIFNlcXVlbmNlTnVtYmVyVCBTZXFObzsgLy8gaW5pdGlhbGl6ZWQgaW4gbG9ja2VkIHNjb3BlIGJlbG93LgorICAgIHsKKyAgICAgIC8vIExvY2sgdGhlIHBlbmRpbmcgcmVzcG9uc2VzIG1hcCBhbmQgc2VxdWVuY2UgbnVtYmVyIG1hbmFnZXIuCisgICAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gTG9jayhSZXNwb25zZXNNdXRleCk7CisKKyAgICAgIC8vIEFsbG9jYXRlIGEgc2VxdWVuY2UgbnVtYmVyLgorICAgICAgU2VxTm8gPSBTZXF1ZW5jZU51bWJlck1nci5nZXRTZXF1ZW5jZU51bWJlcigpOworICAgICAgYXNzZXJ0KCFQZW5kaW5nUmVzcG9uc2VzLmNvdW50KFNlcU5vKSAmJgorICAgICAgICAgICAgICJTZXF1ZW5jZSBudW1iZXIgYWxyZWFkeSBhbGxvY2F0ZWQiKTsKKworICAgICAgLy8gSW5zdGFsbCB0aGUgdXNlciBoYW5kbGVyLgorICAgICAgUGVuZGluZ1Jlc3BvbnNlc1tTZXFOb10gPQorICAgICAgICBkZXRhaWw6OmNyZWF0ZVJlc3BvbnNlSGFuZGxlcjxDaGFubmVsVCwgdHlwZW5hbWUgRnVuYzo6UmV0dXJuVHlwZT4oCisgICAgICAgICAgICBzdGQ6Om1vdmUoSGFuZGxlcikpOworICAgIH0KKworICAgIC8vIE9wZW4gdGhlIGZ1bmN0aW9uIGNhbGwgbWVzc2FnZS4KKyAgICBpZiAoYXV0byBFcnIgPSBDLnN0YXJ0U2VuZE1lc3NhZ2UoRm5JZCwgU2VxTm8pKSB7CisgICAgICBhYmFuZG9uUGVuZGluZ1Jlc3BvbnNlcygpOworICAgICAgcmV0dXJuIEVycjsKKyAgICB9CisKKyAgICAvLyBTZXJpYWxpemUgdGhlIGNhbGwgYXJndW1lbnRzLgorICAgIGlmIChhdXRvIEVyciA9IGRldGFpbDo6SGFuZGxlclRyYWl0czx0eXBlbmFtZSBGdW5jOjpUeXBlPjo6c2VyaWFsaXplQXJncygKKyAgICAgICAgICAgIEMsIEFyZ3MuLi4pKSB7CisgICAgICBhYmFuZG9uUGVuZGluZ1Jlc3BvbnNlcygpOworICAgICAgcmV0dXJuIEVycjsKKyAgICB9CisKKyAgICAvLyBDbG9zZSB0aGUgZnVuY3Rpb24gY2FsbCBtZXNzYWdlZS4KKyAgICBpZiAoYXV0byBFcnIgPSBDLmVuZFNlbmRNZXNzYWdlKCkpIHsKKyAgICAgIGFiYW5kb25QZW5kaW5nUmVzcG9uc2VzKCk7CisgICAgICByZXR1cm4gRXJyOworICAgIH0KKworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXJyb3Igc2VuZEFwcGVuZGVkQ2FsbHMoKSB7IHJldHVybiBDLnNlbmQoKTsgfTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgSGFuZGxlclQsIHR5cGVuYW1lLi4uIEFyZ1RzPgorICBFcnJvciBjYWxsQXN5bmMoSGFuZGxlclQgSGFuZGxlciwgY29uc3QgQXJnVHMgJi4uLiBBcmdzKSB7CisgICAgaWYgKGF1dG8gRXJyID0gYXBwZW5kQ2FsbEFzeW5jPEZ1bmM+KHN0ZDo6bW92ZShIYW5kbGVyKSwgQXJncy4uLikpCisgICAgICByZXR1cm4gRXJyOworICAgIHJldHVybiBDLnNlbmQoKTsKKyAgfQorCisgIC8vLyBIYW5kbGUgb25lIGluY29taW5nIGNhbGwuCisgIEVycm9yIGhhbmRsZU9uZSgpIHsKKyAgICBGdW5jdGlvbklkVCBGbklkOworICAgIFNlcXVlbmNlTnVtYmVyVCBTZXFObzsKKyAgICBpZiAoYXV0byBFcnIgPSBDLnN0YXJ0UmVjZWl2ZU1lc3NhZ2UoRm5JZCwgU2VxTm8pKSB7CisgICAgICBhYmFuZG9uUGVuZGluZ1Jlc3BvbnNlcygpOworICAgICAgcmV0dXJuIEVycjsKKyAgICB9CisgICAgaWYgKEZuSWQgPT0gUmVzcG9uc2VJZCkKKyAgICAgIHJldHVybiBoYW5kbGVSZXNwb25zZShTZXFObyk7CisgICAgYXV0byBJID0gSGFuZGxlcnMuZmluZChGbklkKTsKKyAgICBpZiAoSSAhPSBIYW5kbGVycy5lbmQoKSkKKyAgICAgIHJldHVybiBJLT5zZWNvbmQoQywgU2VxTm8pOworCisgICAgLy8gZWxzZTogTm8gaGFuZGxlciBmb3VuZC4gUmVwb3J0IGVycm9yIHRvIGNsaWVudD8KKyAgICByZXR1cm4gbWFrZV9lcnJvcjxCYWRGdW5jdGlvbkNhbGw8RnVuY3Rpb25JZFQsIFNlcXVlbmNlTnVtYmVyVD4+KEZuSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXFObyk7CisgIH0KKworICAvLy8gSGVscGVyIGZvciBoYW5kbGluZyBzZXR0ZXIgcHJvY2VkdXJlcyAtIHRoaXMgbWV0aG9kIHJldHVybnMgYSBmdW5jdG9yIHRoYXQKKyAgLy8vIHNldHMgdGhlIHZhcmlhYmxlcyByZWZlcnJlZCB0byBieSBBcmdzLi4uIHRvIHZhbHVlcyBkZXNlcmlhbGl6ZWQgZnJvbSB0aGUKKyAgLy8vIGNoYW5uZWwuCisgIC8vLyBFLmcuCisgIC8vLworICAvLy8gICB0eXBlZGVmIEZ1bmN0aW9uPDAsIGJvb2wsIGludD4gRnVuYzE7CisgIC8vLworICAvLy8gICAuLi4KKyAgLy8vICAgYm9vbCBCOworICAvLy8gICBpbnQgSTsKKyAgLy8vICAgaWYgKGF1dG8gRXJyID0gZXhwZWN0PEZ1bmMxPihDaGFubmVsLCByZWFkQXJncyhCLCBJKSkpCisgIC8vLyAgICAgLyogSGFuZGxlIEFyZ3MgKi8gOworICAvLy8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ1RzPgorICBzdGF0aWMgZGV0YWlsOjpSZWFkQXJnczxBcmdUcy4uLj4gcmVhZEFyZ3MoQXJnVHMgJi4uLiBBcmdzKSB7CisgICAgcmV0dXJuIGRldGFpbDo6UmVhZEFyZ3M8QXJnVHMuLi4+KEFyZ3MuLi4pOworICB9CisKKyAgLy8vIEFiYW5kb24gYWxsIG91dHN0YW5kaW5nIHJlc3VsdCBoYW5kbGVycy4KKyAgLy8vCisgIC8vLyBUaGlzIHdpbGwgY2FsbCBhbGwgY3VycmVudGx5IHJlZ2lzdGVyZWQgcmVzdWx0IGhhbmRsZXJzIHRvIHJlY2VpdmUgYW4KKyAgLy8vICJhYmFuZG9uZWQiIGVycm9yIGFzIHRoZWlyIGFyZ3VtZW50LiBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgUlBDCisgIC8vLyBpbiBlcnJvciBzaXR1YXRpb25zLCBidXQgY2FuIGFsc28gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IGNsaWVudHMgd2hvIGFyZQorICAvLy8gZGlzY29ubmVjdGluZyBmcm9tIHRoZSByZW1vdGUgYW5kIGRvbid0IG9yIGNhbid0IGV4cGVjdCByZXNwb25zZXMgdG8gdGhlaXIKKyAgLy8vIG91dHN0YW5kaW5nIGNhbGxzLiAoRXNwZWNpYWxseSBmb3Igb3V0c3RhbmRpbmcgYmxvY2tpbmcgY2FsbHMsIGNhbGxpbmcKKyAgLy8vIHRoaXMgZnVuY3Rpb24gbWF5IGJlIG5lY2Vzc2FyeSB0byBhdm9pZCBkZWFkIHRocmVhZHMpLgorICB2b2lkIGFiYW5kb25QZW5kaW5nUmVzcG9uc2VzKCkgeworICAgIC8vIExvY2sgdGhlIHBlbmRpbmcgcmVzcG9uc2VzIG1hcCBhbmQgc2VxdWVuY2UgbnVtYmVyIG1hbmFnZXIuCisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IExvY2soUmVzcG9uc2VzTXV0ZXgpOworCisgICAgZm9yIChhdXRvICZLViA6IFBlbmRpbmdSZXNwb25zZXMpCisgICAgICBLVi5zZWNvbmQtPmFiYW5kb24oKTsKKyAgICBQZW5kaW5nUmVzcG9uc2VzLmNsZWFyKCk7CisgICAgU2VxdWVuY2VOdW1iZXJNZ3IucmVzZXQoKTsKKyAgfQorCisgIC8vLyBSZW1vdmUgdGhlIGhhbmRsZXIgZm9yIHRoZSBnaXZlbiBmdW5jdGlvbi4KKyAgLy8vIEEgaGFuZGxlciBtdXN0IGN1cnJlbnRseSBiZSByZWdpc3RlcmVkIGZvciB0aGlzIGZ1bmN0aW9uLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYz4KKyAgdm9pZCByZW1vdmVIYW5kbGVyKCkgeworICAgIGF1dG8gSWRJdHIgPSBMb2NhbEZ1bmN0aW9uSWRzLmZpbmQoRnVuYzo6Z2V0UHJvdG90eXBlKCkpOworICAgIGFzc2VydChJZEl0ciAhPSBMb2NhbEZ1bmN0aW9uSWRzLmVuZCgpICYmCisgICAgICAgICAgICJGdW5jdGlvbiBkb2VzIG5vdCBoYXZlIGEgcmVnaXN0ZXJlZCBoYW5kbGVyIik7CisgICAgYXV0byBIYW5kbGVySXRyID0gSGFuZGxlcnMuZmluZChJZEl0ci0+c2Vjb25kKTsKKyAgICBhc3NlcnQoSGFuZGxlckl0ciAhPSBIYW5kbGVycy5lbmQoKSAmJgorICAgICAgICAgICAiRnVuY3Rpb24gZG9lcyBub3QgaGF2ZSBhIHJlZ2lzdGVyZWQgaGFuZGxlciIpOworICAgIEhhbmRsZXJzLmVyYXNlKEhhbmRsZXJJdHIpOworICB9CisKKyAgLy8vIENsZWFyIGFsbCBoYW5kbGVycy4KKyAgdm9pZCBjbGVhckhhbmRsZXJzKCkgeworICAgIEhhbmRsZXJzLmNsZWFyKCk7CisgIH0KKworcHJvdGVjdGVkOgorCisgIEZ1bmN0aW9uSWRUIGdldEludmFsaWRGdW5jdGlvbklkKCkgY29uc3QgeworICAgIHJldHVybiBGbklkQWxsb2NhdG9yLmdldEludmFsaWRJZCgpOworICB9CisKKyAgLy8vIEFkZCB0aGUgZ2l2ZW4gaGFuZGxlciB0byB0aGUgaGFuZGxlciBtYXAgYW5kIG1ha2UgaXQgYXZhaWxhYmxlIGZvcgorICAvLy8gYXV0b25lZ290aWF0aW9uIGFuZCBleGVjdXRpb24uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBIYW5kbGVyVD4KKyAgdm9pZCBhZGRIYW5kbGVySW1wbChIYW5kbGVyVCBIYW5kbGVyKSB7CisKKyAgICBzdGF0aWNfYXNzZXJ0KGRldGFpbDo6UlBDQXJnVHlwZUNoZWNrPAorICAgICAgICAgICAgICAgICAgICAgIENhbkRlc2VyaWFsaXplQ2hlY2ssIHR5cGVuYW1lIEZ1bmM6OlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZGV0YWlsOjpIYW5kbGVyVHJhaXRzPEhhbmRsZXJUPjo6VHlwZT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIiIpOworCisgICAgRnVuY3Rpb25JZFQgTmV3Rm5JZCA9IEZuSWRBbGxvY2F0b3IudGVtcGxhdGUgYWxsb2NhdGU8RnVuYz4oKTsKKyAgICBMb2NhbEZ1bmN0aW9uSWRzW0Z1bmM6OmdldFByb3RvdHlwZSgpXSA9IE5ld0ZuSWQ7CisgICAgSGFuZGxlcnNbTmV3Rm5JZF0gPSB3cmFwSGFuZGxlcjxGdW5jPihzdGQ6Om1vdmUoSGFuZGxlcikpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIEhhbmRsZXJUPgorICB2b2lkIGFkZEFzeW5jSGFuZGxlckltcGwoSGFuZGxlclQgSGFuZGxlcikgeworCisgICAgc3RhdGljX2Fzc2VydChkZXRhaWw6OlJQQ0FyZ1R5cGVDaGVjazwKKyAgICAgICAgICAgICAgICAgICAgICBDYW5EZXNlcmlhbGl6ZUNoZWNrLCB0eXBlbmFtZSBGdW5jOjpUeXBlLAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGRldGFpbDo6QXN5bmNIYW5kbGVyVHJhaXRzPAorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZGV0YWlsOjpIYW5kbGVyVHJhaXRzPEhhbmRsZXJUPjo6VHlwZQorICAgICAgICAgICAgICAgICAgICAgID46OlR5cGU+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICIiKTsKKworICAgIEZ1bmN0aW9uSWRUIE5ld0ZuSWQgPSBGbklkQWxsb2NhdG9yLnRlbXBsYXRlIGFsbG9jYXRlPEZ1bmM+KCk7CisgICAgTG9jYWxGdW5jdGlvbklkc1tGdW5jOjpnZXRQcm90b3R5cGUoKV0gPSBOZXdGbklkOworICAgIEhhbmRsZXJzW05ld0ZuSWRdID0gd3JhcEFzeW5jSGFuZGxlcjxGdW5jPihzdGQ6Om1vdmUoSGFuZGxlcikpOworICB9CisKKyAgRXJyb3IgaGFuZGxlUmVzcG9uc2UoU2VxdWVuY2VOdW1iZXJUIFNlcU5vKSB7CisgICAgdXNpbmcgSGFuZGxlciA9IHR5cGVuYW1lIGRlY2x0eXBlKFBlbmRpbmdSZXNwb25zZXMpOjptYXBwZWRfdHlwZTsKKyAgICBIYW5kbGVyIFBSSGFuZGxlcjsKKworICAgIHsKKyAgICAgIC8vIExvY2sgdGhlIHBlbmRpbmcgcmVzcG9uc2VzIG1hcCBhbmQgc2VxdWVuY2UgbnVtYmVyIG1hbmFnZXIuCisgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IExvY2soUmVzcG9uc2VzTXV0ZXgpOworICAgICAgYXV0byBJID0gUGVuZGluZ1Jlc3BvbnNlcy5maW5kKFNlcU5vKTsKKworICAgICAgaWYgKEkgIT0gUGVuZGluZ1Jlc3BvbnNlcy5lbmQoKSkgeworICAgICAgICBQUkhhbmRsZXIgPSBzdGQ6Om1vdmUoSS0+c2Vjb25kKTsKKyAgICAgICAgUGVuZGluZ1Jlc3BvbnNlcy5lcmFzZShJKTsKKyAgICAgICAgU2VxdWVuY2VOdW1iZXJNZ3IucmVsZWFzZVNlcXVlbmNlTnVtYmVyKFNlcU5vKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFVubG9jayB0aGUgcGVuZGluZyByZXN1bHRzIG1hcCB0byBwcmV2ZW50IHJlY3Vyc2l2ZSBsb2NrLgorICAgICAgICBMb2NrLnVubG9jaygpOworICAgICAgICBhYmFuZG9uUGVuZGluZ1Jlc3BvbnNlcygpOworICAgICAgICByZXR1cm4gbWFrZV9lcnJvcjwKKyAgICAgICAgICAgICAgICAgSW52YWxpZFNlcXVlbmNlTnVtYmVyRm9yUmVzcG9uc2U8U2VxdWVuY2VOdW1iZXJUPj4oU2VxTm8pOworICAgICAgfQorICAgIH0KKworICAgIGFzc2VydChQUkhhbmRsZXIgJiYKKyAgICAgICAgICAgIklmIHdlIGRpZG4ndCBmaW5kIGEgcmVzcG9uc2UgaGFuZGxlciB3ZSBzaG91bGQgaGF2ZSBiYWlsZWQgb3V0Iik7CisKKyAgICBpZiAoYXV0byBFcnIgPSBQUkhhbmRsZXItPmhhbmRsZVJlc3BvbnNlKEMpKSB7CisgICAgICBhYmFuZG9uUGVuZGluZ1Jlc3BvbnNlcygpOworICAgICAgcmV0dXJuIEVycjsKKyAgICB9CisKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIEZ1bmN0aW9uSWRUIGhhbmRsZU5lZ290aWF0ZShjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgeworICAgIGF1dG8gSSA9IExvY2FsRnVuY3Rpb25JZHMuZmluZChOYW1lKTsKKyAgICBpZiAoSSA9PSBMb2NhbEZ1bmN0aW9uSWRzLmVuZCgpKQorICAgICAgcmV0dXJuIGdldEludmFsaWRGdW5jdGlvbklkKCk7CisgICAgcmV0dXJuIEktPnNlY29uZDsKKyAgfQorCisgIC8vIEZpbmQgdGhlIHJlbW90ZSBGdW5jdGlvbklkIGZvciB0aGUgZ2l2ZW4gZnVuY3Rpb24uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jPgorICBFeHBlY3RlZDxGdW5jdGlvbklkVD4gZ2V0UmVtb3RlRnVuY3Rpb25JZChib29sIE5lZ290aWF0ZUlmTm90SW5NYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTmVnb3RpYXRlSWZJbnZhbGlkKSB7CisgICAgYm9vbCBEb05lZ290aWF0ZTsKKworICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGZ1bmN0aW9uIGlkLi4uCisgICAgYXV0byBJID0gUmVtb3RlRnVuY3Rpb25JZHMuZmluZChGdW5jOjpnZXRQcm90b3R5cGUoKSk7CisgICAgaWYgKEkgIT0gUmVtb3RlRnVuY3Rpb25JZHMuZW5kKCkpIHsKKyAgICAgIC8vIElmIGl0J3MgdmFsaWQgdGhlcmUncyBub3RoaW5nIGxlZnQgdG8gZG8uCisgICAgICBpZiAoSS0+c2Vjb25kICE9IGdldEludmFsaWRGdW5jdGlvbklkKCkpCisgICAgICAgIHJldHVybiBJLT5zZWNvbmQ7CisgICAgICBEb05lZ290aWF0ZSA9IE5lZ290aWF0ZUlmSW52YWxpZDsKKyAgICB9IGVsc2UKKyAgICAgIERvTmVnb3RpYXRlID0gTmVnb3RpYXRlSWZOb3RJbk1hcDsKKworICAgIC8vIFdlIGRvbid0IGhhdmUgYSBmdW5jdGlvbiBpZCBmb3IgRnVuYyB5ZXQsIGJ1dCB3ZSdyZSBhbGxvd2VkIHRvIHRyeSB0bworICAgIC8vIG5lZ290aWF0ZSBvbmUuCisgICAgaWYgKERvTmVnb3RpYXRlKSB7CisgICAgICBhdXRvICZJbXBsID0gc3RhdGljX2Nhc3Q8SW1wbFQgJj4oKnRoaXMpOworICAgICAgaWYgKGF1dG8gUmVtb3RlSWRPckVyciA9CisgICAgICAgICAgSW1wbC50ZW1wbGF0ZSBjYWxsQjxPcmNSUENOZWdvdGlhdGU+KEZ1bmM6OmdldFByb3RvdHlwZSgpKSkgeworICAgICAgICBSZW1vdGVGdW5jdGlvbklkc1tGdW5jOjpnZXRQcm90b3R5cGUoKV0gPSAqUmVtb3RlSWRPckVycjsKKyAgICAgICAgaWYgKCpSZW1vdGVJZE9yRXJyID09IGdldEludmFsaWRGdW5jdGlvbklkKCkpCisgICAgICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8Q291bGROb3ROZWdvdGlhdGU+KEZ1bmM6OmdldFByb3RvdHlwZSgpKTsKKyAgICAgICAgcmV0dXJuICpSZW1vdGVJZE9yRXJyOworICAgICAgfSBlbHNlCisgICAgICAgIHJldHVybiBSZW1vdGVJZE9yRXJyLnRha2VFcnJvcigpOworICAgIH0KKworICAgIC8vIE5vIGtleSB3YXMgYXZhaWxhYmxlIGluIHRoZSBtYXAgYW5kIHdlIHdlcmVuJ3QgYWxsb3dlZCB0byB0cnkgdG8KKyAgICAvLyBuZWdvdGlhdGUgb25lLCBzbyByZXR1cm4gYW4gdW5rbm93biBmdW5jdGlvbiBlcnJvci4KKyAgICByZXR1cm4gbWFrZV9lcnJvcjxDb3VsZE5vdE5lZ290aWF0ZT4oRnVuYzo6Z2V0UHJvdG90eXBlKCkpOworICB9CisKKyAgdXNpbmcgV3JhcHBlZEhhbmRsZXJGbiA9IHN0ZDo6ZnVuY3Rpb248RXJyb3IoQ2hhbm5lbFQgJiwgU2VxdWVuY2VOdW1iZXJUKT47CisKKyAgLy8gV3JhcCB0aGUgZ2l2ZW4gdXNlciBoYW5kbGVyIGluIHRoZSBuZWNlc3NhcnkgYXJndW1lbnQtZGVzZXJpYWxpemF0aW9uIGNvZGUsCisgIC8vIHJlc3VsdC1zZXJpYWxpemF0aW9uIGNvZGUsIGFuZCBjYWxsIHRvIHRoZSBsYXVuY2ggcG9saWN5IChpZiBwcmVzZW50KS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIEhhbmRsZXJUPgorICBXcmFwcGVkSGFuZGxlckZuIHdyYXBIYW5kbGVyKEhhbmRsZXJUIEhhbmRsZXIpIHsKKyAgICByZXR1cm4gW3RoaXMsIEhhbmRsZXJdKENoYW5uZWxUICZDaGFubmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VOdW1iZXJUIFNlcU5vKSBtdXRhYmxlIC0+IEVycm9yIHsKKyAgICAgIC8vIFN0YXJ0IGJ5IGRlc2VyaWFsaXppbmcgdGhlIGFyZ3VtZW50cy4KKyAgICAgIHVzaW5nIEFyZ3NUdXBsZSA9CisgICAgICAgICAgdHlwZW5hbWUgZGV0YWlsOjpGdW5jdGlvbkFyZ3NUdXBsZTwKKyAgICAgICAgICAgIHR5cGVuYW1lIGRldGFpbDo6SGFuZGxlclRyYWl0czxIYW5kbGVyVD46OlR5cGU+OjpUeXBlOworICAgICAgYXV0byBBcmdzID0gc3RkOjptYWtlX3NoYXJlZDxBcmdzVHVwbGU+KCk7CisKKyAgICAgIGlmIChhdXRvIEVyciA9CisgICAgICAgICAgICAgIGRldGFpbDo6SGFuZGxlclRyYWl0czx0eXBlbmFtZSBGdW5jOjpUeXBlPjo6ZGVzZXJpYWxpemVBcmdzKAorICAgICAgICAgICAgICAgICAgQ2hhbm5lbCwgKkFyZ3MpKQorICAgICAgICByZXR1cm4gRXJyOworCisgICAgICAvLyBHQ0MgNC43IGFuZCA0LjggaW5jb3JyZWN0bHkgaXNzdWUgYSAtV3VudXNlZC1idXQtc2V0LXZhcmlhYmxlIHdhcm5pbmcKKyAgICAgIC8vIGZvciBSUENBcmdzLiBWb2lkIGNhc3QgUlBDQXJncyB0byB3b3JrIGFyb3VuZCB0aGlzIGZvciBub3cuCisgICAgICAvLyBGSVhNRTogUmVtb3ZlIHRoaXMgd29ya2Fyb3VuZCBvbmNlIHdlIGNhbiBhc3N1bWUgYSB3b3JraW5nIEdDQyB2ZXJzaW9uLgorICAgICAgKHZvaWQpQXJnczsKKworICAgICAgLy8gRW5kIHJlY2VpZXZlIG1lc3NhZ2UsIHVubG9ja2luZyB0aGUgY2hhbm5lbCBmb3IgcmVhZGluZy4KKyAgICAgIGlmIChhdXRvIEVyciA9IENoYW5uZWwuZW5kUmVjZWl2ZU1lc3NhZ2UoKSkKKyAgICAgICAgcmV0dXJuIEVycjsKKworICAgICAgdXNpbmcgSFRyYWl0cyA9IGRldGFpbDo6SGFuZGxlclRyYWl0czxIYW5kbGVyVD47CisgICAgICB1c2luZyBGdW5jUmV0dXJuID0gdHlwZW5hbWUgRnVuYzo6UmV0dXJuVHlwZTsKKyAgICAgIHJldHVybiBkZXRhaWw6OnJlc3BvbmQ8RnVuY1JldHVybj4oQ2hhbm5lbCwgUmVzcG9uc2VJZCwgU2VxTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhUcmFpdHM6OnVucGFja0FuZFJ1bihIYW5kbGVyLCAqQXJncykpOworICAgIH07CisgIH0KKworICAvLyBXcmFwIHRoZSBnaXZlbiB1c2VyIGhhbmRsZXIgaW4gdGhlIG5lY2Vzc2FyeSBhcmd1bWVudC1kZXNlcmlhbGl6YXRpb24gY29kZSwKKyAgLy8gcmVzdWx0LXNlcmlhbGl6YXRpb24gY29kZSwgYW5kIGNhbGwgdG8gdGhlIGxhdW5jaCBwb2xpY3kgKGlmIHByZXNlbnQpLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgSGFuZGxlclQ+CisgIFdyYXBwZWRIYW5kbGVyRm4gd3JhcEFzeW5jSGFuZGxlcihIYW5kbGVyVCBIYW5kbGVyKSB7CisgICAgcmV0dXJuIFt0aGlzLCBIYW5kbGVyXShDaGFubmVsVCAmQ2hhbm5lbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcXVlbmNlTnVtYmVyVCBTZXFObykgbXV0YWJsZSAtPiBFcnJvciB7CisgICAgICAvLyBTdGFydCBieSBkZXNlcmlhbGl6aW5nIHRoZSBhcmd1bWVudHMuCisgICAgICB1c2luZyBBSFRyYWl0cyA9IGRldGFpbDo6QXN5bmNIYW5kbGVyVHJhaXRzPAorICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGRldGFpbDo6SGFuZGxlclRyYWl0czxIYW5kbGVyVD46OlR5cGU+OworICAgICAgdXNpbmcgQXJnc1R1cGxlID0KKyAgICAgICAgICB0eXBlbmFtZSBkZXRhaWw6OkZ1bmN0aW9uQXJnc1R1cGxlPHR5cGVuYW1lIEFIVHJhaXRzOjpUeXBlPjo6VHlwZTsKKyAgICAgIGF1dG8gQXJncyA9IHN0ZDo6bWFrZV9zaGFyZWQ8QXJnc1R1cGxlPigpOworCisgICAgICBpZiAoYXV0byBFcnIgPQorICAgICAgICAgICAgICBkZXRhaWw6OkhhbmRsZXJUcmFpdHM8dHlwZW5hbWUgRnVuYzo6VHlwZT46OmRlc2VyaWFsaXplQXJncygKKyAgICAgICAgICAgICAgICAgIENoYW5uZWwsICpBcmdzKSkKKyAgICAgICAgcmV0dXJuIEVycjsKKworICAgICAgLy8gR0NDIDQuNyBhbmQgNC44IGluY29ycmVjdGx5IGlzc3VlIGEgLVd1bnVzZWQtYnV0LXNldC12YXJpYWJsZSB3YXJuaW5nCisgICAgICAvLyBmb3IgUlBDQXJncy4gVm9pZCBjYXN0IFJQQ0FyZ3MgdG8gd29yayBhcm91bmQgdGhpcyBmb3Igbm93LgorICAgICAgLy8gRklYTUU6IFJlbW92ZSB0aGlzIHdvcmthcm91bmQgb25jZSB3ZSBjYW4gYXNzdW1lIGEgd29ya2luZyBHQ0MgdmVyc2lvbi4KKyAgICAgICh2b2lkKUFyZ3M7CisKKyAgICAgIC8vIEVuZCByZWNlaWV2ZSBtZXNzYWdlLCB1bmxvY2tpbmcgdGhlIGNoYW5uZWwgZm9yIHJlYWRpbmcuCisgICAgICBpZiAoYXV0byBFcnIgPSBDaGFubmVsLmVuZFJlY2VpdmVNZXNzYWdlKCkpCisgICAgICAgIHJldHVybiBFcnI7CisKKyAgICAgIHVzaW5nIEhUcmFpdHMgPSBkZXRhaWw6OkhhbmRsZXJUcmFpdHM8SGFuZGxlclQ+OworICAgICAgdXNpbmcgRnVuY1JldHVybiA9IHR5cGVuYW1lIEZ1bmM6OlJldHVyblR5cGU7CisgICAgICBhdXRvIFJlc3BvbmRlciA9CisgICAgICAgIFt0aGlzLCBTZXFOb10odHlwZW5hbWUgQUhUcmFpdHM6OlJlc3VsdFR5cGUgUmV0VmFsKSAtPiBFcnJvciB7CisgICAgICAgICAgcmV0dXJuIGRldGFpbDo6cmVzcG9uZDxGdW5jUmV0dXJuPihDLCBSZXNwb25zZUlkLCBTZXFObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bW92ZShSZXRWYWwpKTsKKyAgICAgICAgfTsKKworICAgICAgcmV0dXJuIEhUcmFpdHM6OnVucGFja0FuZFJ1bkFzeW5jKEhhbmRsZXIsIFJlc3BvbmRlciwgKkFyZ3MpOworICAgIH07CisgIH0KKworICBDaGFubmVsVCAmQzsKKworICBib29sIExhenlBdXRvTmVnb3RpYXRpb247CisKKyAgUlBDRnVuY3Rpb25JZEFsbG9jYXRvcjxGdW5jdGlvbklkVD4gRm5JZEFsbG9jYXRvcjsKKworICBGdW5jdGlvbklkVCBSZXNwb25zZUlkOworICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgRnVuY3Rpb25JZFQ+IExvY2FsRnVuY3Rpb25JZHM7CisgIHN0ZDo6bWFwPGNvbnN0IGNoYXIgKiwgRnVuY3Rpb25JZFQ+IFJlbW90ZUZ1bmN0aW9uSWRzOworCisgIHN0ZDo6bWFwPEZ1bmN0aW9uSWRULCBXcmFwcGVkSGFuZGxlckZuPiBIYW5kbGVyczsKKworICBzdGQ6Om11dGV4IFJlc3BvbnNlc011dGV4OworICBkZXRhaWw6OlNlcXVlbmNlTnVtYmVyTWFuYWdlcjxTZXF1ZW5jZU51bWJlclQ+IFNlcXVlbmNlTnVtYmVyTWdyOworICBzdGQ6Om1hcDxTZXF1ZW5jZU51bWJlclQsIHN0ZDo6dW5pcXVlX3B0cjxkZXRhaWw6OlJlc3BvbnNlSGFuZGxlcjxDaGFubmVsVD4+PgorICAgICAgUGVuZGluZ1Jlc3BvbnNlczsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkZXRhaWwKKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZSBGdW5jdGlvbklkVCA9IHVpbnQzMl90LAorICAgICAgICAgIHR5cGVuYW1lIFNlcXVlbmNlTnVtYmVyVCA9IHVpbnQzMl90PgorY2xhc3MgTXVsdGlUaHJlYWRlZFJQQ0VuZHBvaW50CisgICAgOiBwdWJsaWMgZGV0YWlsOjpSUENFbmRwb2ludEJhc2U8CisgICAgICAgICAgTXVsdGlUaHJlYWRlZFJQQ0VuZHBvaW50PENoYW5uZWxULCBGdW5jdGlvbklkVCwgU2VxdWVuY2VOdW1iZXJUPiwKKyAgICAgICAgICBDaGFubmVsVCwgRnVuY3Rpb25JZFQsIFNlcXVlbmNlTnVtYmVyVD4geworcHJpdmF0ZToKKyAgdXNpbmcgQmFzZUNsYXNzID0KKyAgICAgIGRldGFpbDo6UlBDRW5kcG9pbnRCYXNlPAorICAgICAgICBNdWx0aVRocmVhZGVkUlBDRW5kcG9pbnQ8Q2hhbm5lbFQsIEZ1bmN0aW9uSWRULCBTZXF1ZW5jZU51bWJlclQ+LAorICAgICAgICBDaGFubmVsVCwgRnVuY3Rpb25JZFQsIFNlcXVlbmNlTnVtYmVyVD47CisKK3B1YmxpYzoKKyAgTXVsdGlUaHJlYWRlZFJQQ0VuZHBvaW50KENoYW5uZWxUICZDLCBib29sIExhenlBdXRvTmVnb3RpYXRpb24pCisgICAgICA6IEJhc2VDbGFzcyhDLCBMYXp5QXV0b05lZ290aWF0aW9uKSB7fQorCisgIC8vLyBBZGQgYSBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gUlBDIGZ1bmN0aW9uLgorICAvLy8gVGhpcyBpbnN0YWxscyB0aGUgZ2l2ZW4gaGFuZGxlciBmdW5jdG9yIGZvciB0aGUgZ2l2ZW4gUlBDIEZ1bmN0aW9uLCBhbmQKKyAgLy8vIG1ha2VzIHRoZSBSUEMgZnVuY3Rpb24gYXZhaWxhYmxlIGZvciBuZWdvdGlhdGlvbi9jYWxsaW5nIGZyb20gdGhlIHJlbW90ZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lIEhhbmRsZXJUPgorICB2b2lkIGFkZEhhbmRsZXIoSGFuZGxlclQgSGFuZGxlcikgeworICAgIHJldHVybiB0aGlzLT50ZW1wbGF0ZSBhZGRIYW5kbGVySW1wbDxGdW5jPihzdGQ6Om1vdmUoSGFuZGxlcikpOworICB9CisKKyAgLy8vIEFkZCBhIGNsYXNzLW1ldGhvZCBhcyBhIGhhbmRsZXIuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBDbGFzc1QsIHR5cGVuYW1lIFJldFQsIHR5cGVuYW1lLi4uIEFyZ1RzPgorICB2b2lkIGFkZEhhbmRsZXIoQ2xhc3NUICZPYmplY3QsIFJldFQgKENsYXNzVDo6Kk1ldGhvZCkoQXJnVHMuLi4pKSB7CisgICAgYWRkSGFuZGxlcjxGdW5jPigKKyAgICAgIGRldGFpbDo6TWVtYmVyRm5XcmFwcGVyPENsYXNzVCwgUmV0VCwgQXJnVHMuLi4+KE9iamVjdCwgTWV0aG9kKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgSGFuZGxlclQ+CisgIHZvaWQgYWRkQXN5bmNIYW5kbGVyKEhhbmRsZXJUIEhhbmRsZXIpIHsKKyAgICByZXR1cm4gdGhpcy0+dGVtcGxhdGUgYWRkQXN5bmNIYW5kbGVySW1wbDxGdW5jPihzdGQ6Om1vdmUoSGFuZGxlcikpOworICB9CisKKyAgLy8vIEFkZCBhIGNsYXNzLW1ldGhvZCBhcyBhIGhhbmRsZXIuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBDbGFzc1QsIHR5cGVuYW1lIFJldFQsIHR5cGVuYW1lLi4uIEFyZ1RzPgorICB2b2lkIGFkZEFzeW5jSGFuZGxlcihDbGFzc1QgJk9iamVjdCwgUmV0VCAoQ2xhc3NUOjoqTWV0aG9kKShBcmdUcy4uLikpIHsKKyAgICBhZGRBc3luY0hhbmRsZXI8RnVuYz4oCisgICAgICBkZXRhaWw6Ok1lbWJlckZuV3JhcHBlcjxDbGFzc1QsIFJldFQsIEFyZ1RzLi4uPihPYmplY3QsIE1ldGhvZCkpOworICB9CisKKyAgLy8vIFJldHVybiB0eXBlIGZvciBub24tYmxvY2tpbmcgY2FsbCBwcmltaXRpdmVzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYz4KKyAgdXNpbmcgTm9uQmxvY2tpbmdDYWxsUmVzdWx0ID0gdHlwZW5hbWUgZGV0YWlsOjpSZXN1bHRUcmFpdHM8CisgICAgICB0eXBlbmFtZSBGdW5jOjpSZXR1cm5UeXBlPjo6UmV0dXJuRnV0dXJlVHlwZTsKKworICAvLy8gQ2FsbCBGdW5jIG9uIENoYW5uZWwgQy4gRG9lcyBub3QgYmxvY2ssIGRvZXMgbm90IGNhbGwgc2VuZC4gUmV0dXJucyBhIHBhaXIKKyAgLy8vIG9mIGEgZnV0dXJlIHJlc3VsdCBhbmQgdGhlIHNlcXVlbmNlIG51bWJlciBhc3NpZ25lZCB0byB0aGUgcmVzdWx0LgorICAvLy8KKyAgLy8vIFRoaXMgdXRpbGl0eSBmdW5jdGlvbiBpcyBwcmltYXJpbHkgdXNlZCBmb3Igc2luZ2xlLXRocmVhZGVkIG1vZGUgc3VwcG9ydCwKKyAgLy8vIHdoZXJlIHRoZSBzZXF1ZW5jZSBudW1iZXIgY2FuIGJlIHVzZWQgdG8gd2FpdCBmb3IgdGhlIGNvcnJlc3BvbmRpbmcKKyAgLy8vIHJlc3VsdC4gSW4gbXVsdGktdGhyZWFkZWQgbW9kZSB0aGUgYXBwZW5kQ2FsbE5CIG1ldGhvZCwgd2hpY2ggZG9lcyBub3QKKyAgLy8vIHJldHVybiB0aGUgc2VxdWVuY2UgbnVtZWJlciwgc2hvdWxkIGJlIHByZWZlcnJlZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lLi4uIEFyZ1RzPgorICBFeHBlY3RlZDxOb25CbG9ja2luZ0NhbGxSZXN1bHQ8RnVuYz4+IGFwcGVuZENhbGxOQihjb25zdCBBcmdUcyAmLi4uIEFyZ3MpIHsKKyAgICB1c2luZyBSVHJhaXRzID0gZGV0YWlsOjpSZXN1bHRUcmFpdHM8dHlwZW5hbWUgRnVuYzo6UmV0dXJuVHlwZT47CisgICAgdXNpbmcgRXJyb3JSZXR1cm4gPSB0eXBlbmFtZSBSVHJhaXRzOjpFcnJvclJldHVyblR5cGU7CisgICAgdXNpbmcgRXJyb3JSZXR1cm5Qcm9taXNlID0gdHlwZW5hbWUgUlRyYWl0czo6UmV0dXJuUHJvbWlzZVR5cGU7CisKKyAgICAvLyBGSVhNRTogU3RhY2sgYWxsb2NhdGUgYW5kIG1vdmUgdGhpcyBpbnRvIHRoZSBoYW5kbGVyIG9uY2UgTExWTSBidWlsZHMKKyAgICAvLyAgICAgICAgd2l0aCBDKysxNC4KKyAgICBhdXRvIFByb21pc2UgPSBzdGQ6Om1ha2Vfc2hhcmVkPEVycm9yUmV0dXJuUHJvbWlzZT4oKTsKKyAgICBhdXRvIEZ1dHVyZVJlc3VsdCA9IFByb21pc2UtPmdldF9mdXR1cmUoKTsKKworICAgIGlmIChhdXRvIEVyciA9IHRoaXMtPnRlbXBsYXRlIGFwcGVuZENhbGxBc3luYzxGdW5jPigKKyAgICAgICAgICAgIFtQcm9taXNlXShFcnJvclJldHVybiBSZXRPckVycikgeworICAgICAgICAgICAgICBQcm9taXNlLT5zZXRfdmFsdWUoc3RkOjptb3ZlKFJldE9yRXJyKSk7CisgICAgICAgICAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICAgICAgICAgICAgfSwKKyAgICAgICAgICAgIEFyZ3MuLi4pKSB7CisgICAgICBSVHJhaXRzOjpjb25zdW1lQWJhbmRvbmVkKEZ1dHVyZVJlc3VsdC5nZXQoKSk7CisgICAgICByZXR1cm4gc3RkOjptb3ZlKEVycik7CisgICAgfQorICAgIHJldHVybiBzdGQ6Om1vdmUoRnV0dXJlUmVzdWx0KTsKKyAgfQorCisgIC8vLyBUaGUgc2FtZSBhcyBhcHBlbmRDYWxsTkJXaXRoU2VxLCBleGNlcHQgdGhhdCBpdCBjYWxscyBDLnNlbmQoKSB0bworICAvLy8gZmx1c2ggdGhlIGNoYW5uZWwgYWZ0ZXIgc2VyaWFsaXppbmcgdGhlIGNhbGwuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZS4uLiBBcmdUcz4KKyAgRXhwZWN0ZWQ8Tm9uQmxvY2tpbmdDYWxsUmVzdWx0PEZ1bmM+PiBjYWxsTkIoY29uc3QgQXJnVHMgJi4uLiBBcmdzKSB7CisgICAgYXV0byBSZXN1bHQgPSBhcHBlbmRDYWxsTkI8RnVuYz4oQXJncy4uLik7CisgICAgaWYgKCFSZXN1bHQpCisgICAgICByZXR1cm4gUmVzdWx0OworICAgIGlmIChhdXRvIEVyciA9IHRoaXMtPkMuc2VuZCgpKSB7CisgICAgICB0aGlzLT5hYmFuZG9uUGVuZGluZ1Jlc3BvbnNlcygpOworICAgICAgZGV0YWlsOjpSZXN1bHRUcmFpdHM8dHlwZW5hbWUgRnVuYzo6UmV0dXJuVHlwZT46OmNvbnN1bWVBYmFuZG9uZWQoCisgICAgICAgICAgc3RkOjptb3ZlKFJlc3VsdC0+Z2V0KCkpKTsKKyAgICAgIHJldHVybiBzdGQ6Om1vdmUoRXJyKTsKKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIC8vLyBDYWxsIEZ1bmMgb24gQ2hhbm5lbCBDLiBCbG9ja3Mgd2FpdGluZyBmb3IgYSByZXN1bHQuIFJldHVybnMgYW4gRXJyb3IKKyAgLy8vIGZvciB2b2lkIGZ1bmN0aW9ucyBvciBhbiBFeHBlY3RlZDxUPiBmb3IgZnVuY3Rpb25zIHJldHVybmluZyBhIFQuCisgIC8vLworICAvLy8gVGhpcyBmdW5jdGlvbiBpcyBmb3IgdXNlIGluIHRocmVhZGVkIGNvZGUgd2hlcmUgYW5vdGhlciB0aHJlYWQgaXMKKyAgLy8vIGhhbmRsaW5nIHJlc3BvbnNlcyBhbmQgaW5jb21pbmcgY2FsbHMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZS4uLiBBcmdUcywKKyAgICAgICAgICAgIHR5cGVuYW1lIEFsdFJldFQgPSB0eXBlbmFtZSBGdW5jOjpSZXR1cm5UeXBlPgorICB0eXBlbmFtZSBkZXRhaWw6OlJlc3VsdFRyYWl0czxBbHRSZXRUPjo6RXJyb3JSZXR1cm5UeXBlCisgIGNhbGxCKGNvbnN0IEFyZ1RzICYuLi4gQXJncykgeworICAgIGlmIChhdXRvIEZ1dHVyZVJlc09yRXJyID0gY2FsbE5CPEZ1bmM+KEFyZ3MuLi4pKQorICAgICAgcmV0dXJuIEZ1dHVyZVJlc09yRXJyLT5nZXQoKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gRnV0dXJlUmVzT3JFcnIudGFrZUVycm9yKCk7CisgIH0KKworICAvLy8gSGFuZGxlIGluY29taW5nIFJQQyBjYWxscy4KKyAgRXJyb3IgaGFuZGxlckxvb3AoKSB7CisgICAgd2hpbGUgKHRydWUpCisgICAgICBpZiAoYXV0byBFcnIgPSB0aGlzLT5oYW5kbGVPbmUoKSkKKyAgICAgICAgcmV0dXJuIEVycjsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZSBGdW5jdGlvbklkVCA9IHVpbnQzMl90LAorICAgICAgICAgIHR5cGVuYW1lIFNlcXVlbmNlTnVtYmVyVCA9IHVpbnQzMl90PgorY2xhc3MgU2luZ2xlVGhyZWFkZWRSUENFbmRwb2ludAorICAgIDogcHVibGljIGRldGFpbDo6UlBDRW5kcG9pbnRCYXNlPAorICAgICAgICAgIFNpbmdsZVRocmVhZGVkUlBDRW5kcG9pbnQ8Q2hhbm5lbFQsIEZ1bmN0aW9uSWRULCBTZXF1ZW5jZU51bWJlclQ+LAorICAgICAgICAgIENoYW5uZWxULCBGdW5jdGlvbklkVCwgU2VxdWVuY2VOdW1iZXJUPiB7Citwcml2YXRlOgorICB1c2luZyBCYXNlQ2xhc3MgPQorICAgICAgZGV0YWlsOjpSUENFbmRwb2ludEJhc2U8CisgICAgICAgIFNpbmdsZVRocmVhZGVkUlBDRW5kcG9pbnQ8Q2hhbm5lbFQsIEZ1bmN0aW9uSWRULCBTZXF1ZW5jZU51bWJlclQ+LAorICAgICAgICBDaGFubmVsVCwgRnVuY3Rpb25JZFQsIFNlcXVlbmNlTnVtYmVyVD47CisKK3B1YmxpYzoKKyAgU2luZ2xlVGhyZWFkZWRSUENFbmRwb2ludChDaGFubmVsVCAmQywgYm9vbCBMYXp5QXV0b05lZ290aWF0aW9uKQorICAgICAgOiBCYXNlQ2xhc3MoQywgTGF6eUF1dG9OZWdvdGlhdGlvbikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgSGFuZGxlclQ+CisgIHZvaWQgYWRkSGFuZGxlcihIYW5kbGVyVCBIYW5kbGVyKSB7CisgICAgcmV0dXJuIHRoaXMtPnRlbXBsYXRlIGFkZEhhbmRsZXJJbXBsPEZ1bmM+KHN0ZDo6bW92ZShIYW5kbGVyKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgQ2xhc3NULCB0eXBlbmFtZSBSZXRULCB0eXBlbmFtZS4uLiBBcmdUcz4KKyAgdm9pZCBhZGRIYW5kbGVyKENsYXNzVCAmT2JqZWN0LCBSZXRUIChDbGFzc1Q6OipNZXRob2QpKEFyZ1RzLi4uKSkgeworICAgIGFkZEhhbmRsZXI8RnVuYz4oCisgICAgICAgIGRldGFpbDo6TWVtYmVyRm5XcmFwcGVyPENsYXNzVCwgUmV0VCwgQXJnVHMuLi4+KE9iamVjdCwgTWV0aG9kKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgSGFuZGxlclQ+CisgIHZvaWQgYWRkQXN5bmNIYW5kbGVyKEhhbmRsZXJUIEhhbmRsZXIpIHsKKyAgICByZXR1cm4gdGhpcy0+dGVtcGxhdGUgYWRkQXN5bmNIYW5kbGVySW1wbDxGdW5jPihzdGQ6Om1vdmUoSGFuZGxlcikpOworICB9CisKKyAgLy8vIEFkZCBhIGNsYXNzLW1ldGhvZCBhcyBhIGhhbmRsZXIuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jLCB0eXBlbmFtZSBDbGFzc1QsIHR5cGVuYW1lIFJldFQsIHR5cGVuYW1lLi4uIEFyZ1RzPgorICB2b2lkIGFkZEFzeW5jSGFuZGxlcihDbGFzc1QgJk9iamVjdCwgUmV0VCAoQ2xhc3NUOjoqTWV0aG9kKShBcmdUcy4uLikpIHsKKyAgICBhZGRBc3luY0hhbmRsZXI8RnVuYz4oCisgICAgICBkZXRhaWw6Ok1lbWJlckZuV3JhcHBlcjxDbGFzc1QsIFJldFQsIEFyZ1RzLi4uPihPYmplY3QsIE1ldGhvZCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmMsIHR5cGVuYW1lLi4uIEFyZ1RzLAorICAgICAgICAgICAgdHlwZW5hbWUgQWx0UmV0VCA9IHR5cGVuYW1lIEZ1bmM6OlJldHVyblR5cGU+CisgIHR5cGVuYW1lIGRldGFpbDo6UmVzdWx0VHJhaXRzPEFsdFJldFQ+OjpFcnJvclJldHVyblR5cGUKKyAgY2FsbEIoY29uc3QgQXJnVHMgJi4uLiBBcmdzKSB7CisgICAgYm9vbCBSZWNlaXZlZFJlc3BvbnNlID0gZmFsc2U7CisgICAgdXNpbmcgUmVzdWx0VHlwZSA9IHR5cGVuYW1lIGRldGFpbDo6UmVzdWx0VHJhaXRzPEFsdFJldFQ+OjpFcnJvclJldHVyblR5cGU7CisgICAgYXV0byBSZXN1bHQgPSBkZXRhaWw6OlJlc3VsdFRyYWl0czxBbHRSZXRUPjo6Y3JlYXRlQmxhbmtFcnJvclJldHVyblZhbHVlKCk7CisKKyAgICAvLyBXZSBoYXZlIHRvICdDaGVjaycgcmVzdWx0ICh3aGljaCB3ZSBrbm93IGlzIGluIGEgc3VjY2VzcyBzdGF0ZSBhdCB0aGlzCisgICAgLy8gcG9pbnQpIHNvIHRoYXQgaXQgY2FuIGJlIG92ZXJ3cml0dGVuIGluIHRoZSBhc3luYyBoYW5kbGVyLgorICAgICh2b2lkKSEhUmVzdWx0OworCisgICAgaWYgKGF1dG8gRXJyID0gdGhpcy0+dGVtcGxhdGUgYXBwZW5kQ2FsbEFzeW5jPEZ1bmM+KAorICAgICAgICAgICAgWyZdKFJlc3VsdFR5cGUgUikgeworICAgICAgICAgICAgICBSZXN1bHQgPSBzdGQ6Om1vdmUoUik7CisgICAgICAgICAgICAgIFJlY2VpdmVkUmVzcG9uc2UgPSB0cnVlOworICAgICAgICAgICAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICBBcmdzLi4uKSkgeworICAgICAgZGV0YWlsOjpSZXN1bHRUcmFpdHM8dHlwZW5hbWUgRnVuYzo6UmV0dXJuVHlwZT46OmNvbnN1bWVBYmFuZG9uZWQoCisgICAgICAgICAgc3RkOjptb3ZlKFJlc3VsdCkpOworICAgICAgcmV0dXJuIHN0ZDo6bW92ZShFcnIpOworICAgIH0KKworICAgIHdoaWxlICghUmVjZWl2ZWRSZXNwb25zZSkgeworICAgICAgaWYgKGF1dG8gRXJyID0gdGhpcy0+aGFuZGxlT25lKCkpIHsKKyAgICAgICAgZGV0YWlsOjpSZXN1bHRUcmFpdHM8dHlwZW5hbWUgRnVuYzo6UmV0dXJuVHlwZT46OmNvbnN1bWVBYmFuZG9uZWQoCisgICAgICAgICAgICBzdGQ6Om1vdmUoUmVzdWx0KSk7CisgICAgICAgIHJldHVybiBzdGQ6Om1vdmUoRXJyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gUmVzdWx0OworICB9Cit9OworCisvLy8gQXN5bmNocm9ub3VzIGRpc3BhdGNoIGZvciBhIGZ1bmN0aW9uIG9uIGFuIFJQQyBlbmRwb2ludC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSUENDbGFzcywgdHlwZW5hbWUgRnVuYz4KK2NsYXNzIFJQQ0FzeW5jRGlzcGF0Y2ggeworcHVibGljOgorICBSUENBc3luY0Rpc3BhdGNoKFJQQ0NsYXNzICZFbmRwb2ludCkgOiBFbmRwb2ludChFbmRwb2ludCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlclQsIHR5cGVuYW1lLi4uIEFyZ1RzPgorICBFcnJvciBvcGVyYXRvcigpKEhhbmRsZXJUIEhhbmRsZXIsIGNvbnN0IEFyZ1RzICYuLi4gQXJncykgY29uc3QgeworICAgIHJldHVybiBFbmRwb2ludC50ZW1wbGF0ZSBhcHBlbmRDYWxsQXN5bmM8RnVuYz4oc3RkOjptb3ZlKEhhbmRsZXIpLCBBcmdzLi4uKTsKKyAgfQorCitwcml2YXRlOgorICBSUENDbGFzcyAmRW5kcG9pbnQ7Cit9OworCisvLy8gQ29uc3RydWN0IGFuIGFzeW5jaHJvbm91cyBkaXNwYXRjaGVyIGZyb20gYW4gUlBDIGVuZHBvaW50IGFuZCBhIEZ1bmMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUgUlBDRW5kcG9pbnRUPgorUlBDQXN5bmNEaXNwYXRjaDxSUENFbmRwb2ludFQsIEZ1bmM+IHJwY0FzeW5jRGlzcGF0Y2goUlBDRW5kcG9pbnRUICZFbmRwb2ludCkgeworICByZXR1cm4gUlBDQXN5bmNEaXNwYXRjaDxSUENFbmRwb2ludFQsIEZ1bmM+KEVuZHBvaW50KTsKK30KKworLy8vIFxicmllZiBBbGxvd3MgYSBzZXQgb2YgYXN5bmNocm91bm91cyBjYWxscyB0byBiZSBkaXNwYXRjaGVkLCBhbmQgdGhlbgorLy8vICAgICAgICB3YWl0ZWQgb24gYXMgYSBncm91cC4KK2NsYXNzIFBhcmFsbGVsQ2FsbEdyb3VwIHsKK3B1YmxpYzoKKworICBQYXJhbGxlbENhbGxHcm91cCgpID0gZGVmYXVsdDsKKyAgUGFyYWxsZWxDYWxsR3JvdXAoY29uc3QgUGFyYWxsZWxDYWxsR3JvdXAgJikgPSBkZWxldGU7CisgIFBhcmFsbGVsQ2FsbEdyb3VwICZvcGVyYXRvcj0oY29uc3QgUGFyYWxsZWxDYWxsR3JvdXAgJikgPSBkZWxldGU7CisKKyAgLy8vIFxicmllZiBNYWtlIGFzIGFzeW5jaHJvbm91cyBjYWxsLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXN5bmNEaXNwYXRjaGVyLCB0eXBlbmFtZSBIYW5kbGVyVCwgdHlwZW5hbWUuLi4gQXJnVHM+CisgIEVycm9yIGNhbGwoY29uc3QgQXN5bmNEaXNwYXRjaGVyICZBc3luY0Rpc3BhdGNoLCBIYW5kbGVyVCBIYW5kbGVyLAorICAgICAgICAgICAgIGNvbnN0IEFyZ1RzICYuLi4gQXJncykgeworICAgIC8vIEluY3JlbWVudCB0aGUgY291bnQgb2Ygb3V0c3RhbmRpbmcgY2FsbHMuIFRoaXMgaGFzIHRvIGhhcHBlbiBiZWZvcmUKKyAgICAvLyB3ZSBpbnZva2UgdGhlIGNhbGwsIGFzIHRoZSBoYW5kbGVyIG1heSAoZGVwZW5kaW5nIG9uIHNjaGVkdWxpbmcpCisgICAgLy8gYmUgcnVuIGltbWVkaWF0ZWx5IG9uIGFub3RoZXIgdGhyZWFkLCBhbmQgd2UgZG9uJ3Qgd2FudCB0aGUgZGVjcmVtZW50CisgICAgLy8gaW4gdGhlIHdyYXBwZWQgaGFuZGxlciBiZWxvdyB0byBydW4gYmVmb3JlIHRoZSBpbmNyZW1lbnQuCisgICAgeworICAgICAgc3RkOjp1bmlxdWVfbG9jazxzdGQ6Om11dGV4PiBMb2NrKE0pOworICAgICAgKytOdW1PdXRzdGFuZGluZ0NhbGxzOworICAgIH0KKworICAgIC8vIFdyYXAgdGhlIHVzZXIgaGFuZGxlciBpbiBhIGxhbWJkYSB0aGF0IHdpbGwgZGVjcmVtZW50IHRoZQorICAgIC8vIG91dHN0YW5kaW5nIGNhbGxzIGNvdW50LCB0aGVuIHBva2UgdGhlIGNvbmRpdGlvbiB2YXJpYWJsZS4KKyAgICB1c2luZyBBcmdUeXBlID0gdHlwZW5hbWUgZGV0YWlsOjpSZXNwb25zZUhhbmRsZXJBcmc8CisgICAgICAgIHR5cGVuYW1lIGRldGFpbDo6SGFuZGxlclRyYWl0czxIYW5kbGVyVD46OlR5cGU+OjpBcmdUeXBlOworICAgIC8vIEZJWE1FOiBNb3ZlIGhhbmRsZXIgaW50byB3cmFwcGVkIGhhbmRsZXIgb25jZSB3ZSBoYXZlIEMrKzE0LgorICAgIGF1dG8gV3JhcHBlZEhhbmRsZXIgPSBbdGhpcywgSGFuZGxlcl0oQXJnVHlwZSBBcmcpIHsKKyAgICAgIGF1dG8gRXJyID0gSGFuZGxlcihzdGQ6Om1vdmUoQXJnKSk7CisgICAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IExvY2soTSk7CisgICAgICAtLU51bU91dHN0YW5kaW5nQ2FsbHM7CisgICAgICBDVi5ub3RpZnlfYWxsKCk7CisgICAgICByZXR1cm4gRXJyOworICAgIH07CisKKyAgICByZXR1cm4gQXN5bmNEaXNwYXRjaChzdGQ6Om1vdmUoV3JhcHBlZEhhbmRsZXIpLCBBcmdzLi4uKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQmxvY2tzIHVudGlsIGFsbCBjYWxscyBoYXZlIGJlZW4gY29tcGxldGVkIGFuZCB0aGVpciByZXR1cm4gdmFsdWUKKyAgLy8vICAgICAgICBoYW5kbGVycyBydW4uCisgIHZvaWQgd2FpdCgpIHsKKyAgICBzdGQ6OnVuaXF1ZV9sb2NrPHN0ZDo6bXV0ZXg+IExvY2soTSk7CisgICAgd2hpbGUgKE51bU91dHN0YW5kaW5nQ2FsbHMgPiAwKQorICAgICAgQ1Yud2FpdChMb2NrKTsKKyAgfQorCitwcml2YXRlOgorICBzdGQ6Om11dGV4IE07CisgIHN0ZDo6Y29uZGl0aW9uX3ZhcmlhYmxlIENWOworICB1aW50MzJfdCBOdW1PdXRzdGFuZGluZ0NhbGxzID0gMDsKK307CisKKy8vLyBAYnJpZWYgQ29udmVuaWVuY2UgY2xhc3MgZm9yIGdyb3VwaW5nIFJQQyBGdW5jdGlvbnMgaW50byBBUElzIHRoYXQgY2FuIGJlCisvLy8gICAgICAgIG5lZ290aWF0ZWQgYXMgYSBibG9jay4KKy8vLwordGVtcGxhdGUgPHR5cGVuYW1lLi4uIEZ1bmNzPgorY2xhc3MgQVBJQ2FsbHMgeworcHVibGljOgorCisgIC8vLyBAYnJpZWYgVGVzdCB3aGV0aGVyIHRoaXMgQVBJIGNvbnRhaW5zIEZ1bmN0aW9uIEYuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgorICBjbGFzcyBDb250YWlucyB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOworICB9OworCisgIC8vLyBAYnJpZWYgTmVnb3RpYXRlIGFsbCBmdW5jdGlvbnMgaW4gdGhpcyBBUEkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBSUENFbmRwb2ludD4KKyAgc3RhdGljIEVycm9yIG5lZ290aWF0ZShSUENFbmRwb2ludCAmUikgeworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuYywgdHlwZW5hbWUuLi4gRnVuY3M+CitjbGFzcyBBUElDYWxsczxGdW5jLCBGdW5jcy4uLj4geworcHVibGljOgorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGPgorICBjbGFzcyBDb250YWlucyB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHN0ZDo6aXNfc2FtZTxGLCBGdW5jPjo6dmFsdWUgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJQ2FsbHM8RnVuY3MuLi4+Ojp0ZW1wbGF0ZSBDb250YWluczxGPjo6dmFsdWU7CisgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJQQ0VuZHBvaW50PgorICBzdGF0aWMgRXJyb3IgbmVnb3RpYXRlKFJQQ0VuZHBvaW50ICZSKSB7CisgICAgaWYgKGF1dG8gRXJyID0gUi50ZW1wbGF0ZSBuZWdvdGlhdGVGdW5jdGlvbjxGdW5jPigpKQorICAgICAgcmV0dXJuIEVycjsKKyAgICByZXR1cm4gQVBJQ2FsbHM8RnVuY3MuLi4+OjpuZWdvdGlhdGUoUik7CisgIH0KKworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lLi4uIElubmVyRnVuY3MsIHR5cGVuYW1lLi4uIEZ1bmNzPgorY2xhc3MgQVBJQ2FsbHM8QVBJQ2FsbHM8SW5uZXJGdW5jcy4uLj4sIEZ1bmNzLi4uPiB7CitwdWJsaWM6CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEY+CisgIGNsYXNzIENvbnRhaW5zIHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0KKyAgICAgIEFQSUNhbGxzPElubmVyRnVuY3MuLi4+Ojp0ZW1wbGF0ZSBDb250YWluczxGPjo6dmFsdWUgfAorICAgICAgQVBJQ2FsbHM8RnVuY3MuLi4+Ojp0ZW1wbGF0ZSBDb250YWluczxGPjo6dmFsdWU7CisgIH07CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJQQ0VuZHBvaW50PgorICBzdGF0aWMgRXJyb3IgbmVnb3RpYXRlKFJQQ0VuZHBvaW50ICZSKSB7CisgICAgaWYgKGF1dG8gRXJyID0gQVBJQ2FsbHM8SW5uZXJGdW5jcy4uLj46Om5lZ290aWF0ZShSKSkKKyAgICAgIHJldHVybiBFcnI7CisgICAgcmV0dXJuIEFQSUNhbGxzPEZ1bmNzLi4uPjo6bmVnb3RpYXRlKFIpOworICB9CisKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBycGMKK30gLy8gZW5kIG5hbWVzcGFjZSBvcmMKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL1JURHlsZE9iamVjdExpbmtpbmdMYXllci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL1JURHlsZE9iamVjdExpbmtpbmdMYXllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmMGQ5ZmEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvUlREeWxkT2JqZWN0TGlua2luZ0xheWVyLmgKQEAgLTAsMCArMSwzNDkgQEAKKy8vPT09LSBSVER5bGRPYmplY3RMaW5raW5nTGF5ZXIuaCAtIFJURHlsZC1iYXNlZCBqaXQgbGlua2luZyAgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ29udGFpbnMgdGhlIGRlZmluaXRpb24gZm9yIGFuIFJURHlsZC1iYXNlZCwgaW4tcHJvY2VzcyBvYmplY3QgbGlua2luZyBsYXllci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19SVERZTERPQkpFQ1RMSU5LSU5HTEFZRVJfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfUlREWUxET0JKRUNUTElOS0lOR0xBWUVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL0pJVFN5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9Db3JlLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0xlZ2FjeS5oIgorI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL1J1bnRpbWVEeWxkLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvT2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb3JjIHsKKworY2xhc3MgUlREeWxkT2JqZWN0TGlua2luZ0xheWVyQmFzZSB7CitwdWJsaWM6CisgIHVzaW5nIE9iamVjdFB0ciA9IHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+OworCitwcm90ZWN0ZWQ6CisKKyAgLy8vIEBicmllZiBIb2xkcyBhbiBvYmplY3QgdG8gYmUgYWxsb2NhdGVkL2xpbmtlZCBhcyBhIHVuaXQgaW4gdGhlIEpJVC4KKyAgLy8vCisgIC8vLyBBbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIHdpbGwgYmUgY3JlYXRlZCBmb3IgZWFjaCBvYmplY3QgYWRkZWQKKyAgLy8vIHZpYSBKSVRPYmplY3RMYXllcjo6YWRkT2JqZWN0LiBEZWxldGluZyB0aGUgaW5zdGFuY2UgKHZpYQorICAvLy8gcmVtb3ZlT2JqZWN0KSBmcmVlcyBpdHMgbWVtb3J5LCByZW1vdmluZyBhbGwgc3ltYm9sIGRlZmluaXRpb25zIHRoYXQKKyAgLy8vIGhhZCBiZWVuIHByb3ZpZGVkIGJ5IHRoaXMgaW5zdGFuY2UuIEhpZ2hlciBsZXZlbCBsYXllcnMgYXJlIHJlc3BvbnNpYmxlCisgIC8vLyBmb3IgdGFraW5nIGFueSBhY3Rpb24gcmVxdWlyZWQgdG8gaGFuZGxlIHRoZSBtaXNzaW5nIHN5bWJvbHMuCisgIGNsYXNzIExpbmtlZE9iamVjdCB7CisgIHB1YmxpYzoKKyAgICBMaW5rZWRPYmplY3QoKSA9IGRlZmF1bHQ7CisgICAgTGlua2VkT2JqZWN0KGNvbnN0IExpbmtlZE9iamVjdCYpID0gZGVsZXRlOworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IExpbmtlZE9iamVjdCYpID0gZGVsZXRlOworICAgIHZpcnR1YWwgfkxpbmtlZE9iamVjdCgpID0gZGVmYXVsdDsKKworICAgIHZpcnR1YWwgRXJyb3IgZmluYWxpemUoKSA9IDA7CisKKyAgICB2aXJ0dWFsIEpJVFN5bWJvbDo6R2V0QWRkcmVzc0Z0b3IKKyAgICBnZXRTeW1ib2xNYXRlcmlhbGl6ZXIoc3RkOjpzdHJpbmcgTmFtZSkgPSAwOworCisgICAgdmlydHVhbCB2b2lkIG1hcFNlY3Rpb25BZGRyZXNzKGNvbnN0IHZvaWQgKkxvY2FsQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSklUVGFyZ2V0QWRkcmVzcyBUYXJnZXRBZGRyKSBjb25zdCA9IDA7CisKKyAgICBKSVRTeW1ib2wgZ2V0U3ltYm9sKFN0cmluZ1JlZiBOYW1lLCBib29sIEV4cG9ydGVkU3ltYm9sc09ubHkpIHsKKyAgICAgIGF1dG8gU3ltRW50cnkgPSBTeW1ib2xUYWJsZS5maW5kKE5hbWUpOworICAgICAgaWYgKFN5bUVudHJ5ID09IFN5bWJvbFRhYmxlLmVuZCgpKQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIGlmICghU3ltRW50cnktPnNlY29uZC5nZXRGbGFncygpLmlzRXhwb3J0ZWQoKSAmJiBFeHBvcnRlZFN5bWJvbHNPbmx5KQorICAgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICAgIGlmICghRmluYWxpemVkKQorICAgICAgICByZXR1cm4gSklUU3ltYm9sKGdldFN5bWJvbE1hdGVyaWFsaXplcihOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTeW1FbnRyeS0+c2Vjb25kLmdldEZsYWdzKCkpOworICAgICAgcmV0dXJuIEpJVFN5bWJvbChTeW1FbnRyeS0+c2Vjb25kKTsKKyAgICB9CisKKyAgcHJvdGVjdGVkOgorICAgIFN0cmluZ01hcDxKSVRFdmFsdWF0ZWRTeW1ib2w+IFN5bWJvbFRhYmxlOworICAgIGJvb2wgRmluYWxpemVkID0gZmFsc2U7CisgIH07Cit9OworCisvLy8gQGJyaWVmIEJhcmUgYm9uZXMgb2JqZWN0IGxpbmtpbmcgbGF5ZXIuCisvLy8KKy8vLyAgIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyB0aGUgYmFzZSBsYXllciBmb3IgYSBKSVQuIEl0IGFsbG93cworLy8vIG9iamVjdCBmaWxlcyB0byBiZSBsb2FkZWQgaW50byBtZW1vcnksIGxpbmtlZCwgYW5kIHRoZSBhZGRyZXNzZXMgb2YgdGhlaXIKKy8vLyBzeW1ib2xzIHF1ZXJpZWQuIEFsbCBvYmplY3RzIGFkZGVkIHRvIHRoaXMgbGF5ZXIgY2FuIHNlZSBlYWNoIG90aGVyJ3MKKy8vLyBzeW1ib2xzLgorY2xhc3MgUlREeWxkT2JqZWN0TGlua2luZ0xheWVyIDogcHVibGljIFJURHlsZE9iamVjdExpbmtpbmdMYXllckJhc2UgeworcHVibGljOgorCisgIHVzaW5nIFJURHlsZE9iamVjdExpbmtpbmdMYXllckJhc2U6Ok9iamVjdFB0cjsKKworICAvLy8gQGJyaWVmIEZ1bmN0b3IgZm9yIHJlY2VpdmluZyBvYmplY3QtbG9hZGVkIG5vdGlmaWNhdGlvbnMuCisgIHVzaW5nIE5vdGlmeUxvYWRlZEZ0b3IgPQorICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKFZNb2R1bGVLZXksIGNvbnN0IG9iamVjdDo6T2JqZWN0RmlsZSAmT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJ1bnRpbWVEeWxkOjpMb2FkZWRPYmplY3RJbmZvICYpPjsKKworICAvLy8gQGJyaWVmIEZ1bmN0b3IgZm9yIHJlY2VpdmluZyBmaW5hbGl6YXRpb24gbm90aWZpY2F0aW9ucy4KKyAgdXNpbmcgTm90aWZ5RmluYWxpemVkRnRvciA9IHN0ZDo6ZnVuY3Rpb248dm9pZChWTW9kdWxlS2V5KT47CisKK3ByaXZhdGU6CisgIHVzaW5nIE93bmVkT2JqZWN0ID0gb2JqZWN0OjpPd25pbmdCaW5hcnk8b2JqZWN0OjpPYmplY3RGaWxlPjsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTWVtb3J5TWFuYWdlclB0clQ+CisgIGNsYXNzIENvbmNyZXRlTGlua2VkT2JqZWN0IDogcHVibGljIExpbmtlZE9iamVjdCB7CisgIHB1YmxpYzoKKyAgICBDb25jcmV0ZUxpbmtlZE9iamVjdChSVER5bGRPYmplY3RMaW5raW5nTGF5ZXIgJlBhcmVudCwgVk1vZHVsZUtleSBLLAorICAgICAgICAgICAgICAgICAgICAgICAgIE93bmVkT2JqZWN0IE9iaiwgTWVtb3J5TWFuYWdlclB0clQgTWVtTWdyLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTeW1ib2xSZXNvbHZlcj4gUmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQcm9jZXNzQWxsU2VjdGlvbnMpCisgICAgICAgIDogTWVtTWdyKHN0ZDo6bW92ZShNZW1NZ3IpKSwKKyAgICAgICAgICBQRkMobGx2bTo6bWFrZV91bmlxdWU8UHJlRmluYWxpemVDb250ZW50cz4oCisgICAgICAgICAgICAgIFBhcmVudCwgc3RkOjptb3ZlKEspLCBzdGQ6Om1vdmUoT2JqKSwgc3RkOjptb3ZlKFJlc29sdmVyKSwKKyAgICAgICAgICAgICAgUHJvY2Vzc0FsbFNlY3Rpb25zKSkgeworICAgICAgYnVpbGRJbml0aWFsU3ltYm9sVGFibGUoUEZDLT5PYmopOworICAgIH0KKworICAgIH5Db25jcmV0ZUxpbmtlZE9iamVjdCgpIG92ZXJyaWRlIHsKKyAgICAgIE1lbU1nci0+ZGVyZWdpc3RlckVIRnJhbWVzKCk7CisgICAgfQorCisgICAgRXJyb3IgZmluYWxpemUoKSBvdmVycmlkZSB7CisgICAgICBhc3NlcnQoUEZDICYmICJtYXBTZWN0aW9uQWRkcmVzcyBjYWxsZWQgb24gZmluYWxpemVkIExpbmtlZE9iamVjdCIpOworCisgICAgICBKSVRTeW1ib2xSZXNvbHZlckFkYXB0ZXIgUmVzb2x2ZXJBZGFwdGVyKFBGQy0+UGFyZW50LkVTLCAqUEZDLT5SZXNvbHZlcik7CisgICAgICBQRkMtPlJURHlsZCA9IGxsdm06Om1ha2VfdW5pcXVlPFJ1bnRpbWVEeWxkPigqTWVtTWdyLCBSZXNvbHZlckFkYXB0ZXIpOworICAgICAgUEZDLT5SVER5bGQtPnNldFByb2Nlc3NBbGxTZWN0aW9ucyhQRkMtPlByb2Nlc3NBbGxTZWN0aW9ucyk7CisKKyAgICAgIEZpbmFsaXplZCA9IHRydWU7CisKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxSdW50aW1lRHlsZDo6TG9hZGVkT2JqZWN0SW5mbz4gSW5mbyA9CisgICAgICAgICAgUEZDLT5SVER5bGQtPmxvYWRPYmplY3QoKlBGQy0+T2JqLmdldEJpbmFyeSgpKTsKKworICAgICAgLy8gQ29weSB0aGUgc3ltYm9sIHRhYmxlIG91dCBvZiB0aGUgUnVudGltZUR5bGQgaW5zdGFuY2UuCisgICAgICB7CisgICAgICAgIGF1dG8gU3ltVGFiID0gUEZDLT5SVER5bGQtPmdldFN5bWJvbFRhYmxlKCk7CisgICAgICAgIGZvciAoYXV0byAmS1YgOiBTeW1UYWIpCisgICAgICAgICAgU3ltYm9sVGFibGVbS1YuZmlyc3RdID0gS1Yuc2Vjb25kOworICAgICAgfQorCisgICAgICBpZiAoUEZDLT5QYXJlbnQuTm90aWZ5TG9hZGVkKQorICAgICAgICBQRkMtPlBhcmVudC5Ob3RpZnlMb2FkZWQoUEZDLT5LLCAqUEZDLT5PYmouZ2V0QmluYXJ5KCksICpJbmZvKTsKKworICAgICAgUEZDLT5SVER5bGQtPmZpbmFsaXplV2l0aE1lbW9yeU1hbmFnZXJMb2NraW5nKCk7CisKKyAgICAgIGlmIChQRkMtPlJURHlsZC0+aGFzRXJyb3IoKSkKKyAgICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8U3RyaW5nRXJyb3I+KFBGQy0+UlREeWxkLT5nZXRFcnJvclN0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jb252ZXJ0aWJsZUVycm9yQ29kZSgpKTsKKworICAgICAgaWYgKFBGQy0+UGFyZW50Lk5vdGlmeUZpbmFsaXplZCkKKyAgICAgICAgUEZDLT5QYXJlbnQuTm90aWZ5RmluYWxpemVkKFBGQy0+Syk7CisKKyAgICAgIC8vIFJlbGVhc2UgcmVzb3VyY2VzLgorICAgICAgUEZDID0gbnVsbHB0cjsKKyAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICAgIH0KKworICAgIEpJVFN5bWJvbDo6R2V0QWRkcmVzc0Z0b3IgZ2V0U3ltYm9sTWF0ZXJpYWxpemVyKHN0ZDo6c3RyaW5nIE5hbWUpIG92ZXJyaWRlIHsKKyAgICAgIHJldHVybiBbdGhpcywgTmFtZV0oKSAtPiBFeHBlY3RlZDxKSVRUYXJnZXRBZGRyZXNzPiB7CisgICAgICAgIC8vIFRoZSBzeW1ib2wgbWF5IGJlIG1hdGVyaWFsaXplZCBiZXR3ZWVuIHRoZSBjcmVhdGlvbiBvZiB0aGlzIGxhbWJkYQorICAgICAgICAvLyBhbmQgaXRzIGV4ZWN1dGlvbiwgc28gd2UgbmVlZCB0byBkb3VibGUgY2hlY2suCisgICAgICAgIGlmICghdGhpcy0+RmluYWxpemVkKQorICAgICAgICAgIGlmIChhdXRvIEVyciA9IHRoaXMtPmZpbmFsaXplKCkpCisgICAgICAgICAgICByZXR1cm4gc3RkOjptb3ZlKEVycik7CisgICAgICAgIHJldHVybiB0aGlzLT5nZXRTeW1ib2woTmFtZSwgZmFsc2UpLmdldEFkZHJlc3MoKTsKKyAgICAgIH07CisgICAgfQorCisgICAgdm9pZCBtYXBTZWN0aW9uQWRkcmVzcyhjb25zdCB2b2lkICpMb2NhbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBKSVRUYXJnZXRBZGRyZXNzIFRhcmdldEFkZHIpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICAgIGFzc2VydChQRkMgJiYgIm1hcFNlY3Rpb25BZGRyZXNzIGNhbGxlZCBvbiBmaW5hbGl6ZWQgTGlua2VkT2JqZWN0Iik7CisgICAgICBhc3NlcnQoUEZDLT5SVER5bGQgJiYgIm1hcFNlY3Rpb25BZGRyZXNzIGNhbGxlZCBvbiByYXcgTGlua2VkT2JqZWN0Iik7CisgICAgICBQRkMtPlJURHlsZC0+bWFwU2VjdGlvbkFkZHJlc3MoTG9jYWxBZGRyZXNzLCBUYXJnZXRBZGRyKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIGJ1aWxkSW5pdGlhbFN5bWJvbFRhYmxlKGNvbnN0IE93bmVkT2JqZWN0ICZPYmopIHsKKyAgICAgIGZvciAoYXV0byAmU3ltYm9sIDogT2JqLmdldEJpbmFyeSgpLT5zeW1ib2xzKCkpIHsKKyAgICAgICAgaWYgKFN5bWJvbC5nZXRGbGFncygpICYgb2JqZWN0OjpTeW1ib2xSZWY6OlNGX1VuZGVmaW5lZCkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgRXhwZWN0ZWQ8U3RyaW5nUmVmPiBTeW1ib2xOYW1lID0gU3ltYm9sLmdldE5hbWUoKTsKKyAgICAgICAgLy8gRklYTUU6IFJhaXNlIGFuIGVycm9yIGZvciBiYWQgc3ltYm9scy4KKyAgICAgICAgaWYgKCFTeW1ib2xOYW1lKSB7CisgICAgICAgICAgY29uc3VtZUVycm9yKFN5bWJvbE5hbWUudGFrZUVycm9yKCkpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGF1dG8gRmxhZ3MgPSBKSVRTeW1ib2xGbGFnczo6ZnJvbU9iamVjdFN5bWJvbChTeW1ib2wpOworICAgICAgICBTeW1ib2xUYWJsZS5pbnNlcnQoCisgICAgICAgICAgc3RkOjptYWtlX3BhaXIoKlN5bWJvbE5hbWUsIEpJVEV2YWx1YXRlZFN5bWJvbCgwLCBGbGFncykpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDb250YWlucyB0aGUgaW5mb3JtYXRpb24gbmVlZGVkIHByaW9yIHRvIGZpbmFsaXphdGlvbjogdGhlIG9iamVjdCBmaWxlcywKKyAgICAvLyBtZW1vcnkgbWFuYWdlciwgcmVzb2x2ZXIsIGFuZCBmbGFncyBuZWVkZWQgZm9yIFJ1bnRpbWVEeWxkLgorICAgIHN0cnVjdCBQcmVGaW5hbGl6ZUNvbnRlbnRzIHsKKyAgICAgIFByZUZpbmFsaXplQ29udGVudHMoUlREeWxkT2JqZWN0TGlua2luZ0xheWVyICZQYXJlbnQsIFZNb2R1bGVLZXkgSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3duZWRPYmplY3QgT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnNoYXJlZF9wdHI8U3ltYm9sUmVzb2x2ZXI+IFJlc29sdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFByb2Nlc3NBbGxTZWN0aW9ucykKKyAgICAgICAgICA6IFBhcmVudChQYXJlbnQpLCBLKHN0ZDo6bW92ZShLKSksIE9iaihzdGQ6Om1vdmUoT2JqKSksCisgICAgICAgICAgICBSZXNvbHZlcihzdGQ6Om1vdmUoUmVzb2x2ZXIpKSwKKyAgICAgICAgICAgIFByb2Nlc3NBbGxTZWN0aW9ucyhQcm9jZXNzQWxsU2VjdGlvbnMpIHt9CisKKyAgICAgIFJURHlsZE9iamVjdExpbmtpbmdMYXllciAmUGFyZW50OworICAgICAgVk1vZHVsZUtleSBLOworICAgICAgT3duZWRPYmplY3QgT2JqOworICAgICAgc3RkOjpzaGFyZWRfcHRyPFN5bWJvbFJlc29sdmVyPiBSZXNvbHZlcjsKKyAgICAgIGJvb2wgUHJvY2Vzc0FsbFNlY3Rpb25zOworICAgICAgc3RkOjp1bmlxdWVfcHRyPFJ1bnRpbWVEeWxkPiBSVER5bGQ7CisgICAgfTsKKworICAgIE1lbW9yeU1hbmFnZXJQdHJUIE1lbU1ncjsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8UHJlRmluYWxpemVDb250ZW50cz4gUEZDOworICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBNZW1vcnlNYW5hZ2VyUHRyVD4KKyAgc3RkOjp1bmlxdWVfcHRyPENvbmNyZXRlTGlua2VkT2JqZWN0PE1lbW9yeU1hbmFnZXJQdHJUPj4KKyAgY3JlYXRlTGlua2VkT2JqZWN0KFJURHlsZE9iamVjdExpbmtpbmdMYXllciAmUGFyZW50LCBWTW9kdWxlS2V5IEssCisgICAgICAgICAgICAgICAgICAgICBPd25lZE9iamVjdCBPYmosIE1lbW9yeU1hbmFnZXJQdHJUIE1lbU1nciwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxTeW1ib2xSZXNvbHZlcj4gUmVzb2x2ZXIsCisgICAgICAgICAgICAgICAgICAgICBib29sIFByb2Nlc3NBbGxTZWN0aW9ucykgeworICAgIHVzaW5nIExPUyA9IENvbmNyZXRlTGlua2VkT2JqZWN0PE1lbW9yeU1hbmFnZXJQdHJUPjsKKyAgICByZXR1cm4gbGx2bTo6bWFrZV91bmlxdWU8TE9TPihQYXJlbnQsIHN0ZDo6bW92ZShLKSwgc3RkOjptb3ZlKE9iaiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKE1lbU1nciksIHN0ZDo6bW92ZShSZXNvbHZlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvY2Vzc0FsbFNlY3Rpb25zKTsKKyAgfQorCitwdWJsaWM6CisgIHN0cnVjdCBSZXNvdXJjZXMgeworICAgIHN0ZDo6c2hhcmVkX3B0cjxSdW50aW1lRHlsZDo6TWVtb3J5TWFuYWdlcj4gTWVtTWdyOworICAgIHN0ZDo6c2hhcmVkX3B0cjxTeW1ib2xSZXNvbHZlcj4gUmVzb2x2ZXI7CisgIH07CisKKyAgdXNpbmcgUmVzb3VyY2VzR2V0dGVyID0gc3RkOjpmdW5jdGlvbjxSZXNvdXJjZXMoVk1vZHVsZUtleSk+OworCisgIC8vLyBAYnJpZWYgQ29uc3RydWN0IGFuIE9iamVjdExpbmtpbmdMYXllciB3aXRoIHRoZSBnaXZlbiBOb3RpZnlMb2FkZWQsCisgIC8vLyAgICAgICAgYW5kIE5vdGlmeUZpbmFsaXplZCBmdW5jdG9ycy4KKyAgUlREeWxkT2JqZWN0TGlua2luZ0xheWVyKAorICAgICAgRXhlY3V0aW9uU2Vzc2lvbiAmRVMsIFJlc291cmNlc0dldHRlciBHZXRSZXNvdXJjZXMsCisgICAgICBOb3RpZnlMb2FkZWRGdG9yIE5vdGlmeUxvYWRlZCA9IE5vdGlmeUxvYWRlZEZ0b3IoKSwKKyAgICAgIE5vdGlmeUZpbmFsaXplZEZ0b3IgTm90aWZ5RmluYWxpemVkID0gTm90aWZ5RmluYWxpemVkRnRvcigpKQorICAgICAgOiBFUyhFUyksIEdldFJlc291cmNlcyhzdGQ6Om1vdmUoR2V0UmVzb3VyY2VzKSksCisgICAgICAgIE5vdGlmeUxvYWRlZChzdGQ6Om1vdmUoTm90aWZ5TG9hZGVkKSksCisgICAgICAgIE5vdGlmeUZpbmFsaXplZChzdGQ6Om1vdmUoTm90aWZ5RmluYWxpemVkKSksIFByb2Nlc3NBbGxTZWN0aW9ucyhmYWxzZSkgeworICB9CisKKyAgLy8vIEBicmllZiBTZXQgdGhlICdQcm9jZXNzQWxsU2VjdGlvbnMnIGZsYWcuCisgIC8vLworICAvLy8gSWYgc2V0IHRvIHRydWUsIGFsbCBzZWN0aW9ucyBpbiBlYWNoIG9iamVjdCBmaWxlIHdpbGwgYmUgYWxsb2NhdGVkIHVzaW5nCisgIC8vLyB0aGUgbWVtb3J5IG1hbmFnZXIsIHJhdGhlciB0aGFuIGp1c3QgdGhlIHNlY3Rpb25zIHJlcXVpcmVkIGZvciBleGVjdXRpb24uCisgIC8vLworICAvLy8gVGhpcyBpcyBrbHVkZ3ksIGFuZCBtYXkgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgorICB2b2lkIHNldFByb2Nlc3NBbGxTZWN0aW9ucyhib29sIFByb2Nlc3NBbGxTZWN0aW9ucykgeworICAgIHRoaXMtPlByb2Nlc3NBbGxTZWN0aW9ucyA9IFByb2Nlc3NBbGxTZWN0aW9uczsKKyAgfQorCisgIC8vLyBAYnJpZWYgQWRkIGFuIG9iamVjdCB0byB0aGUgSklULgorICBFcnJvciBhZGRPYmplY3QoVk1vZHVsZUtleSBLLCBPYmplY3RQdHIgT2JqQnVmZmVyKSB7CisKKyAgICBhdXRvIE9iaiA9CisgICAgICAgIG9iamVjdDo6T2JqZWN0RmlsZTo6Y3JlYXRlT2JqZWN0RmlsZShPYmpCdWZmZXItPmdldE1lbUJ1ZmZlclJlZigpKTsKKyAgICBpZiAoIU9iaikKKyAgICAgIHJldHVybiBPYmoudGFrZUVycm9yKCk7CisKKyAgICBhc3NlcnQoIUxpbmtlZE9iamVjdHMuY291bnQoSykgJiYgIlZNb2R1bGVLZXkgYWxyZWFkeSBpbiB1c2UiKTsKKworICAgIGF1dG8gUiA9IEdldFJlc291cmNlcyhLKTsKKworICAgIExpbmtlZE9iamVjdHNbS10gPSBjcmVhdGVMaW5rZWRPYmplY3QoCisgICAgICAgICp0aGlzLCBLLCBPd25lZE9iamVjdChzdGQ6Om1vdmUoKk9iaiksIHN0ZDo6bW92ZShPYmpCdWZmZXIpKSwKKyAgICAgICAgc3RkOjptb3ZlKFIuTWVtTWdyKSwgc3RkOjptb3ZlKFIuUmVzb2x2ZXIpLCBQcm9jZXNzQWxsU2VjdGlvbnMpOworCisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICAvLy8gQGJyaWVmIFJlbW92ZSB0aGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCBWTW9kdWxlS2V5IEsuCisgIC8vLworICAvLy8gICBBbGwgbWVtb3J5IGFsbG9jYXRlZCBmb3IgdGhlIG9iamVjdCB3aWxsIGJlIGZyZWVkLCBhbmQgdGhlIHNlY3Rpb25zIGFuZAorICAvLy8gc3ltYm9scyBpdCBwcm92aWRlZCB3aWxsIG5vIGxvbmdlciBiZSBhdmFpbGFibGUuIE5vIGF0dGVtcHQgaXMgbWFkZSB0bworICAvLy8gcmUtZW1pdCB0aGUgbWlzc2luZyBzeW1ib2xzLCBhbmQgYW55IHVzZSBvZiB0aGVzZSBzeW1ib2xzIChkaXJlY3RseSBvcgorICAvLy8gaW5kaXJlY3RseSkgd2lsbCByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yLiBJZiBkZXBlbmRlbmNlIHRyYWNraW5nIGlzCisgIC8vLyByZXF1aXJlZCB0byBkZXRlY3Qgb3IgcmVzb2x2ZSBzdWNoIGlzc3VlcyBpdCBzaG91bGQgYmUgYWRkZWQgYXQgYSBoaWdoZXIKKyAgLy8vIGxheWVyLgorICBFcnJvciByZW1vdmVPYmplY3QoVk1vZHVsZUtleSBLKSB7CisgICAgYXNzZXJ0KExpbmtlZE9iamVjdHMuY291bnQoSykgJiYgIlZNb2R1bGVLZXkgbm90IGFzc29jaWF0ZWQgd2l0aCBvYmplY3QiKTsKKyAgICAvLyBIb3cgZG8gd2UgaW52YWxpZGF0ZSB0aGUgc3ltYm9scyBpbiBIPworICAgIExpbmtlZE9iamVjdHMuZXJhc2UoSyk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICAvLy8gQGJyaWVmIFNlYXJjaCBmb3IgdGhlIGdpdmVuIG5hbWVkIHN5bWJvbC4KKyAgLy8vIEBwYXJhbSBOYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdG8gc2VhcmNoIGZvci4KKyAgLy8vIEBwYXJhbSBFeHBvcnRlZFN5bWJvbHNPbmx5IElmIHRydWUsIHNlYXJjaCBvbmx5IGZvciBleHBvcnRlZCBzeW1ib2xzLgorICAvLy8gQHJldHVybiBBIGhhbmRsZSBmb3IgdGhlIGdpdmVuIG5hbWVkIHN5bWJvbCwgaWYgaXQgZXhpc3RzLgorICBKSVRTeW1ib2wgZmluZFN5bWJvbChTdHJpbmdSZWYgTmFtZSwgYm9vbCBFeHBvcnRlZFN5bWJvbHNPbmx5KSB7CisgICAgZm9yIChhdXRvICZLViA6IExpbmtlZE9iamVjdHMpCisgICAgICBpZiAoYXV0byBTeW0gPSBLVi5zZWNvbmQtPmdldFN5bWJvbChOYW1lLCBFeHBvcnRlZFN5bWJvbHNPbmx5KSkKKyAgICAgICAgcmV0dXJuIFN5bTsKKyAgICAgIGVsc2UgaWYgKGF1dG8gRXJyID0gU3ltLnRha2VFcnJvcigpKQorICAgICAgICByZXR1cm4gc3RkOjptb3ZlKEVycik7CisKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBAYnJpZWYgU2VhcmNoIGZvciB0aGUgZ2l2ZW4gbmFtZWQgc3ltYm9sIGluIHRoZSBjb250ZXh0IG9mIHRoZSBsb2FkZWQKKyAgLy8vICAgICAgICBvYmplY3QgcmVwcmVzZW50ZWQgYnkgdGhlIFZNb2R1bGVLZXkgSy4KKyAgLy8vIEBwYXJhbSBLIFRoZSBWTW9kdWxlS2V5IGZvciB0aGUgb2JqZWN0IHRvIHNlYXJjaCBpbi4KKyAgLy8vIEBwYXJhbSBOYW1lIFRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgdG8gc2VhcmNoIGZvci4KKyAgLy8vIEBwYXJhbSBFeHBvcnRlZFN5bWJvbHNPbmx5IElmIHRydWUsIHNlYXJjaCBvbmx5IGZvciBleHBvcnRlZCBzeW1ib2xzLgorICAvLy8gQHJldHVybiBBIGhhbmRsZSBmb3IgdGhlIGdpdmVuIG5hbWVkIHN5bWJvbCwgaWYgaXQgaXMgZm91bmQgaW4gdGhlCisgIC8vLyAgICAgICAgIGdpdmVuIG9iamVjdC4KKyAgSklUU3ltYm9sIGZpbmRTeW1ib2xJbihWTW9kdWxlS2V5IEssIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXhwb3J0ZWRTeW1ib2xzT25seSkgeworICAgIGFzc2VydChMaW5rZWRPYmplY3RzLmNvdW50KEspICYmICJWTW9kdWxlS2V5IG5vdCBhc3NvY2lhdGVkIHdpdGggb2JqZWN0Iik7CisgICAgcmV0dXJuIExpbmtlZE9iamVjdHNbS10tPmdldFN5bWJvbChOYW1lLCBFeHBvcnRlZFN5bWJvbHNPbmx5KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgTWFwIHNlY3Rpb24gYWRkcmVzc2VzIGZvciB0aGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUKKyAgLy8vICAgICAgICBWTW9kdWxlS2V5IEsuCisgIHZvaWQgbWFwU2VjdGlvbkFkZHJlc3MoVk1vZHVsZUtleSBLLCBjb25zdCB2b2lkICpMb2NhbEFkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgSklUVGFyZ2V0QWRkcmVzcyBUYXJnZXRBZGRyKSB7CisgICAgYXNzZXJ0KExpbmtlZE9iamVjdHMuY291bnQoSykgJiYgIlZNb2R1bGVLZXkgbm90IGFzc29jaWF0ZWQgd2l0aCBvYmplY3QiKTsKKyAgICBMaW5rZWRPYmplY3RzW0tdLT5tYXBTZWN0aW9uQWRkcmVzcyhMb2NhbEFkZHJlc3MsIFRhcmdldEFkZHIpOworICB9CisKKyAgLy8vIEBicmllZiBJbW1lZGlhdGVseSBlbWl0IGFuZCBmaW5hbGl6ZSB0aGUgb2JqZWN0IHJlcHJlc2VudGVkIGJ5IHRoZSBnaXZlbgorICAvLy8gICAgICAgIFZNb2R1bGVLZXkuCisgIC8vLyBAcGFyYW0gSyBWTW9kdWxlS2V5IGZvciBvYmplY3QgdG8gZW1pdC9maW5hbGl6ZS4KKyAgRXJyb3IgZW1pdEFuZEZpbmFsaXplKFZNb2R1bGVLZXkgSykgeworICAgIGFzc2VydChMaW5rZWRPYmplY3RzLmNvdW50KEspICYmICJWTW9kdWxlS2V5IG5vdCBhc3NvY2lhdGVkIHdpdGggb2JqZWN0Iik7CisgICAgcmV0dXJuIExpbmtlZE9iamVjdHNbS10tPmZpbmFsaXplKCk7CisgIH0KKworcHJpdmF0ZToKKyAgRXhlY3V0aW9uU2Vzc2lvbiAmRVM7CisKKyAgc3RkOjptYXA8Vk1vZHVsZUtleSwgc3RkOjp1bmlxdWVfcHRyPExpbmtlZE9iamVjdD4+IExpbmtlZE9iamVjdHM7CisgIFJlc291cmNlc0dldHRlciBHZXRSZXNvdXJjZXM7CisgIE5vdGlmeUxvYWRlZEZ0b3IgTm90aWZ5TG9hZGVkOworICBOb3RpZnlGaW5hbGl6ZWRGdG9yIE5vdGlmeUZpbmFsaXplZDsKKyAgYm9vbCBQcm9jZXNzQWxsU2VjdGlvbnMgPSBmYWxzZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvcmMKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfUlREWUxET0JKRUNUTElOS0lOR0xBWUVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9SYXdCeXRlQ2hhbm5lbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL1Jhd0J5dGVDaGFubmVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGI4MTBmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9SYXdCeXRlQ2hhbm5lbC5oCkBAIC0wLDAgKzEsMTg1IEBACisvLz09PS0gbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL1Jhd0J5dGVDaGFubmVsLmggLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19SQVdCWVRFQ0hBTk5FTF9ICisjZGVmaW5lIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19SQVdCWVRFQ0hBTk5FTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvUlBDU2VyaWFsaXphdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG11dGV4PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9yYyB7CituYW1lc3BhY2UgcnBjIHsKKworLy8vIEludGVyZmFjZSBmb3IgYnl0ZS1zdHJlYW1zIHRvIGJlIHVzZWQgd2l0aCBSUEMuCitjbGFzcyBSYXdCeXRlQ2hhbm5lbCB7CitwdWJsaWM6CisgIHZpcnR1YWwgflJhd0J5dGVDaGFubmVsKCkgPSBkZWZhdWx0OworCisgIC8vLyBSZWFkIFNpemUgYnl0ZXMgZnJvbSB0aGUgc3RyZWFtIGludG8gKkRzdC4KKyAgdmlydHVhbCBFcnJvciByZWFkQnl0ZXMoY2hhciAqRHN0LCB1bnNpZ25lZCBTaXplKSA9IDA7CisKKyAgLy8vIFJlYWQgc2l6ZSBieXRlcyBmcm9tICpTcmMgYW5kIGFwcGVuZCB0aGVtIHRvIHRoZSBzdHJlYW0uCisgIHZpcnR1YWwgRXJyb3IgYXBwZW5kQnl0ZXMoY29uc3QgY2hhciAqU3JjLCB1bnNpZ25lZCBTaXplKSA9IDA7CisKKyAgLy8vIEZsdXNoIHRoZSBzdHJlYW0gaWYgcG9zc2libGUuCisgIHZpcnR1YWwgRXJyb3Igc2VuZCgpID0gMDsKKworICAvLy8gTm90aWZ5IHRoZSBjaGFubmVsIHRoYXQgd2UncmUgc3RhcnRpbmcgYSBtZXNzYWdlIHNlbmQuCisgIC8vLyBMb2NrcyB0aGUgY2hhbm5lbCBmb3Igd3JpdGluZy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZ1bmN0aW9uSWRULCB0eXBlbmFtZSBTZXF1ZW5jZUlkVD4KKyAgRXJyb3Igc3RhcnRTZW5kTWVzc2FnZShjb25zdCBGdW5jdGlvbklkVCAmRm5JZCwgY29uc3QgU2VxdWVuY2VJZFQgJlNlcU5vKSB7CisgICAgd3JpdGVMb2NrLmxvY2soKTsKKyAgICBpZiAoYXV0byBFcnIgPSBzZXJpYWxpemVTZXEoKnRoaXMsIEZuSWQsIFNlcU5vKSkgeworICAgICAgd3JpdGVMb2NrLnVubG9jaygpOworICAgICAgcmV0dXJuIEVycjsKKyAgICB9CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICAvLy8gTm90aWZ5IHRoZSBjaGFubmVsIHRoYXQgd2UncmUgZW5kaW5nIGEgbWVzc2FnZSBzZW5kLgorICAvLy8gVW5sb2NrcyB0aGUgY2hhbm5lbCBmb3Igd3JpdGluZy4KKyAgRXJyb3IgZW5kU2VuZE1lc3NhZ2UoKSB7CisgICAgd3JpdGVMb2NrLnVubG9jaygpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgLy8vIE5vdGlmeSB0aGUgY2hhbm5lbCB0aGF0IHdlJ3JlIHN0YXJ0aW5nIGEgbWVzc2FnZSByZWNlaXZlLgorICAvLy8gTG9ja3MgdGhlIGNoYW5uZWwgZm9yIHJlYWRpbmcuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbklkVCwgdHlwZW5hbWUgU2VxdWVuY2VOdW1iZXJUPgorICBFcnJvciBzdGFydFJlY2VpdmVNZXNzYWdlKEZ1bmN0aW9uSWRUICZGbklkLCBTZXF1ZW5jZU51bWJlclQgJlNlcU5vKSB7CisgICAgcmVhZExvY2subG9jaygpOworICAgIGlmIChhdXRvIEVyciA9IGRlc2VyaWFsaXplU2VxKCp0aGlzLCBGbklkLCBTZXFObykpIHsKKyAgICAgIHJlYWRMb2NrLnVubG9jaygpOworICAgICAgcmV0dXJuIEVycjsKKyAgICB9CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICAvLy8gTm90aWZ5IHRoZSBjaGFubmVsIHRoYXQgd2UncmUgZW5kaW5nIGEgbWVzc2FnZSByZWNlaXZlLgorICAvLy8gVW5sb2NrcyB0aGUgY2hhbm5lbCBmb3IgcmVhZGluZy4KKyAgRXJyb3IgZW5kUmVjZWl2ZU1lc3NhZ2UoKSB7CisgICAgcmVhZExvY2sudW5sb2NrKCk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBsb2NrIGZvciBzdHJlYW0gcmVhZGluZy4KKyAgc3RkOjptdXRleCAmZ2V0UmVhZExvY2soKSB7IHJldHVybiByZWFkTG9jazsgfQorCisgIC8vLyBHZXQgdGhlIGxvY2sgZm9yIHN0cmVhbSB3cml0aW5nLgorICBzdGQ6Om11dGV4ICZnZXRXcml0ZUxvY2soKSB7IHJldHVybiB3cml0ZUxvY2s7IH0KKworcHJpdmF0ZToKKyAgc3RkOjptdXRleCByZWFkTG9jaywgd3JpdGVMb2NrOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxULCB0eXBlbmFtZSBUPgorY2xhc3MgU2VyaWFsaXphdGlvblRyYWl0czwKKyAgICBDaGFubmVsVCwgVCwgVCwKKyAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgc3RkOjppc19iYXNlX29mPFJhd0J5dGVDaGFubmVsLCBDaGFubmVsVD46OnZhbHVlICYmCisgICAgICAgIChzdGQ6OmlzX3NhbWU8VCwgdWludDhfdD46OnZhbHVlIHx8IHN0ZDo6aXNfc2FtZTxULCBpbnQ4X3Q+Ojp2YWx1ZSB8fAorICAgICAgICAgc3RkOjppc19zYW1lPFQsIHVpbnQxNl90Pjo6dmFsdWUgfHwgc3RkOjppc19zYW1lPFQsIGludDE2X3Q+Ojp2YWx1ZSB8fAorICAgICAgICAgc3RkOjppc19zYW1lPFQsIHVpbnQzMl90Pjo6dmFsdWUgfHwgc3RkOjppc19zYW1lPFQsIGludDMyX3Q+Ojp2YWx1ZSB8fAorICAgICAgICAgc3RkOjppc19zYW1lPFQsIHVpbnQ2NF90Pjo6dmFsdWUgfHwgc3RkOjppc19zYW1lPFQsIGludDY0X3Q+Ojp2YWx1ZSB8fAorICAgICAgICAgc3RkOjppc19zYW1lPFQsIGNoYXI+Ojp2YWx1ZSk+Ojp0eXBlPiB7CitwdWJsaWM6CisgIHN0YXRpYyBFcnJvciBzZXJpYWxpemUoQ2hhbm5lbFQgJkMsIFQgVikgeworICAgIHN1cHBvcnQ6OmVuZGlhbjo6Ynl0ZV9zd2FwPFQsIHN1cHBvcnQ6OmJpZz4oVik7CisgICAgcmV0dXJuIEMuYXBwZW5kQnl0ZXMocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KCZWKSwgc2l6ZW9mKFQpKTsKKyAgfTsKKworICBzdGF0aWMgRXJyb3IgZGVzZXJpYWxpemUoQ2hhbm5lbFQgJkMsIFQgJlYpIHsKKyAgICBpZiAoYXV0byBFcnIgPSBDLnJlYWRCeXRlcyhyZWludGVycHJldF9jYXN0PGNoYXIgKj4oJlYpLCBzaXplb2YoVCkpKQorICAgICAgcmV0dXJuIEVycjsKKyAgICBzdXBwb3J0OjplbmRpYW46OmJ5dGVfc3dhcDxULCBzdXBwb3J0OjpiaWc+KFYpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENoYW5uZWxUPgorY2xhc3MgU2VyaWFsaXphdGlvblRyYWl0czxDaGFubmVsVCwgYm9vbCwgYm9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19iYXNlX29mPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3Qnl0ZUNoYW5uZWwsIENoYW5uZWxUPjo6dmFsdWU+Ojp0eXBlPiB7CitwdWJsaWM6CisgIHN0YXRpYyBFcnJvciBzZXJpYWxpemUoQ2hhbm5lbFQgJkMsIGJvb2wgVikgeworICAgIHVpbnQ4X3QgVG1wID0gViA/IDEgOiAwOworICAgIGlmIChhdXRvIEVyciA9CisgICAgICAgICAgQy5hcHBlbmRCeXRlcyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oJlRtcCksIDEpKQorICAgICAgcmV0dXJuIEVycjsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIHN0YXRpYyBFcnJvciBkZXNlcmlhbGl6ZShDaGFubmVsVCAmQywgYm9vbCAmVikgeworICAgIHVpbnQ4X3QgVG1wID0gMDsKKyAgICBpZiAoYXV0byBFcnIgPSBDLnJlYWRCeXRlcyhyZWludGVycHJldF9jYXN0PGNoYXIgKj4oJlRtcCksIDEpKQorICAgICAgcmV0dXJuIEVycjsKKyAgICBWID0gVG1wICE9IDA7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVD4KK2NsYXNzIFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIHN0ZDo6c3RyaW5nLCBTdHJpbmdSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfYmFzZV9vZjwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhd0J5dGVDaGFubmVsLCBDaGFubmVsVD46OnZhbHVlPjo6dHlwZT4geworcHVibGljOgorICAvLy8gUlBDIGNoYW5uZWwgc2VyaWFsaXphdGlvbiBmb3Igc3RkOjpzdHJpbmdzLgorICBzdGF0aWMgRXJyb3Igc2VyaWFsaXplKFJhd0J5dGVDaGFubmVsICZDLCBTdHJpbmdSZWYgUykgeworICAgIGlmIChhdXRvIEVyciA9IHNlcmlhbGl6ZVNlcShDLCBzdGF0aWNfY2FzdDx1aW50NjRfdD4oUy5zaXplKCkpKSkKKyAgICAgIHJldHVybiBFcnI7CisgICAgcmV0dXJuIEMuYXBwZW5kQnl0ZXMoKGNvbnN0IGNoYXIgKilTLmRhdGEoKSwgUy5zaXplKCkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2hhbm5lbFQsIHR5cGVuYW1lIFQ+CitjbGFzcyBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBzdGQ6OnN0cmluZywgVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19iYXNlX29mPFJhd0J5dGVDaGFubmVsLCBDaGFubmVsVD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0ZDo6aXNfc2FtZTxULCBjb25zdCBjaGFyKj46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfc2FtZTxULCBjaGFyKj46OnZhbHVlKT46OnR5cGU+IHsKK3B1YmxpYzoKKyAgc3RhdGljIEVycm9yIHNlcmlhbGl6ZShSYXdCeXRlQ2hhbm5lbCAmQywgY29uc3QgY2hhciAqUykgeworICAgIHJldHVybiBTZXJpYWxpemF0aW9uVHJhaXRzPENoYW5uZWxULCBzdGQ6OnN0cmluZywgU3RyaW5nUmVmPjo6c2VyaWFsaXplKEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUyk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDaGFubmVsVD4KK2NsYXNzIFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19iYXNlX29mPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmF3Qnl0ZUNoYW5uZWwsIENoYW5uZWxUPjo6dmFsdWU+Ojp0eXBlPiB7CitwdWJsaWM6CisgIC8vLyBSUEMgY2hhbm5lbCBzZXJpYWxpemF0aW9uIGZvciBzdGQ6OnN0cmluZ3MuCisgIHN0YXRpYyBFcnJvciBzZXJpYWxpemUoUmF3Qnl0ZUNoYW5uZWwgJkMsIGNvbnN0IHN0ZDo6c3RyaW5nICZTKSB7CisgICAgcmV0dXJuIFNlcmlhbGl6YXRpb25UcmFpdHM8Q2hhbm5lbFQsIHN0ZDo6c3RyaW5nLCBTdHJpbmdSZWY+OjpzZXJpYWxpemUoQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTKTsKKyAgfQorCisgIC8vLyBSUEMgY2hhbm5lbCBkZXNlcmlhbGl6YXRpb24gZm9yIHN0ZDo6c3RyaW5ncy4KKyAgc3RhdGljIEVycm9yIGRlc2VyaWFsaXplKFJhd0J5dGVDaGFubmVsICZDLCBzdGQ6OnN0cmluZyAmUykgeworICAgIHVpbnQ2NF90IENvdW50ID0gMDsKKyAgICBpZiAoYXV0byBFcnIgPSBkZXNlcmlhbGl6ZVNlcShDLCBDb3VudCkpCisgICAgICByZXR1cm4gRXJyOworICAgIFMucmVzaXplKENvdW50KTsKKyAgICByZXR1cm4gQy5yZWFkQnl0ZXMoJlNbMF0sIENvdW50KTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHJwYworfSAvLyBlbmQgbmFtZXNwYWNlIG9yYworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fRVhFQ1VUSU9ORU5HSU5FX09SQ19SQVdCWVRFQ0hBTk5FTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvUmVtb3RlT2JqZWN0TGF5ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9SZW1vdGVPYmplY3RMYXllci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5NWZhYWEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmMvUmVtb3RlT2JqZWN0TGF5ZXIuaApAQCAtMCwwICsxLDUyOSBAQAorLy89PT0tLS0tLS0gUmVtb3RlT2JqZWN0TGF5ZXIuaCAtIEZvcndhcmRzIG9ianMgdG8gYSByZW1vdGUgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBGb3J3YXJkcyBvYmplY3RzIHRvIGEgcmVtb3RlIG9iamVjdCBsYXllciB2aWEgUlBDLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX1JFTU9URU9CSkVDVExBWUVSX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX1JFTU9URU9CSkVDVExBWUVSX0gKKworI2luY2x1ZGUgImxsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9PcmNSZW1vdGVUYXJnZXRSUENBUEkuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9PYmplY3RGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL0xhbWJkYVJlc29sdmVyLmgiCisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb3JjIHsKKworLy8vIFJQQyBBUEkgbmVlZGVkIGJ5IFJlbW90ZU9iamVjdENsaWVudExheWVyIGFuZCBSZW1vdGVPYmplY3RTZXJ2ZXJMYXllci4KK2NsYXNzIFJlbW90ZU9iamVjdExheWVyQVBJIHsKK3B1YmxpYzoKKworICB1c2luZyBPYmpIYW5kbGVUID0gcmVtb3RlOjpSZXNvdXJjZUlkTWdyOjpSZXNvdXJjZUlkOworCitwcm90ZWN0ZWQ6CisKKyAgdXNpbmcgUmVtb3RlU3ltYm9sSWQgPSByZW1vdGU6OlJlc291cmNlSWRNZ3I6OlJlc291cmNlSWQ7CisgIHVzaW5nIFJlbW90ZVN5bWJvbCA9IHN0ZDo6cGFpcjxSZW1vdGVTeW1ib2xJZCwgSklUU3ltYm9sRmxhZ3M+OworCitwdWJsaWM6CisKKyAgdXNpbmcgQmFkU3ltYm9sSGFuZGxlRXJyb3IgPSByZW1vdGU6OlJlc291cmNlTm90Rm91bmQ8UmVtb3RlU3ltYm9sSWQ+OworICB1c2luZyBCYWRPYmplY3RIYW5kbGVFcnJvciA9IHJlbW90ZTo6UmVzb3VyY2VOb3RGb3VuZDxPYmpIYW5kbGVUPjsKKworcHJvdGVjdGVkOgorCisgIHN0YXRpYyBjb25zdCBPYmpIYW5kbGVUIEludmFsaWRPYmplY3RIYW5kbGVJZCA9IDA7CisgIHN0YXRpYyBjb25zdCBSZW1vdGVTeW1ib2xJZCBOdWxsU3ltYm9sSWQgPSAwOworCisgIGNsYXNzIEFkZE9iamVjdAorICAgIDogcHVibGljIHJwYzo6RnVuY3Rpb248QWRkT2JqZWN0LCBFeHBlY3RlZDxPYmpIYW5kbGVUPihzdGQ6OnN0cmluZyk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIkFkZE9iamVjdCI7IH0KKyAgfTsKKworICBjbGFzcyBSZW1vdmVPYmplY3QKKyAgICA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPFJlbW92ZU9iamVjdCwgRXJyb3IoT2JqSGFuZGxlVCk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIlJlbW92ZU9iamVjdCI7IH0KKyAgfTsKKworICBjbGFzcyBGaW5kU3ltYm9sCisgICAgOiBwdWJsaWMgcnBjOjpGdW5jdGlvbjxGaW5kU3ltYm9sLCBFeHBlY3RlZDxSZW1vdGVTeW1ib2w+KHN0ZDo6c3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiRmluZFN5bWJvbCI7IH0KKyAgfTsKKworICBjbGFzcyBGaW5kU3ltYm9sSW4KKyAgICA6IHB1YmxpYyBycGM6OkZ1bmN0aW9uPEZpbmRTeW1ib2xJbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGVkPFJlbW90ZVN5bWJvbD4oT2JqSGFuZGxlVCwgc3RkOjpzdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wpPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJGaW5kU3ltYm9sSW4iOyB9CisgIH07CisKKyAgY2xhc3MgRW1pdEFuZEZpbmFsaXplCisgICAgOiBwdWJsaWMgcnBjOjpGdW5jdGlvbjxFbWl0QW5kRmluYWxpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvcihPYmpIYW5kbGVUKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiRW1pdEFuZEZpbmFsaXplIjsgfQorICB9OworCisgIGNsYXNzIExvb2t1cAorICAgIDogcHVibGljIHJwYzo6RnVuY3Rpb248TG9va3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwZWN0ZWQ8UmVtb3RlU3ltYm9sPihPYmpIYW5kbGVULCBzdGQ6OnN0cmluZyk+IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBjb25zdCBjaGFyICpnZXROYW1lKCkgeyByZXR1cm4gIkxvb2t1cCI7IH0KKyAgfTsKKworICBjbGFzcyBMb29rdXBJbkxvZ2ljYWxEeWxpYgorICAgIDogcHVibGljIHJwYzo6RnVuY3Rpb248TG9va3VwSW5Mb2dpY2FsRHlsaWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBlY3RlZDxSZW1vdGVTeW1ib2w+KE9iakhhbmRsZVQsIHN0ZDo6c3RyaW5nKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiTG9va3VwSW5Mb2dpY2FsRHlsaWIiOyB9CisgIH07CisKKyAgY2xhc3MgUmVsZWFzZVJlbW90ZVN5bWJvbAorICAgIDogcHVibGljIHJwYzo6RnVuY3Rpb248UmVsZWFzZVJlbW90ZVN5bWJvbCwgRXJyb3IoUmVtb3RlU3ltYm9sSWQpPiB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgY2hhciAqZ2V0TmFtZSgpIHsgcmV0dXJuICJSZWxlYXNlUmVtb3RlU3ltYm9sIjsgfQorICB9OworCisgIGNsYXNzIE1hdGVyaWFsaXplUmVtb3RlU3ltYm9sCisgICAgOiBwdWJsaWMgcnBjOjpGdW5jdGlvbjxNYXRlcmlhbGl6ZVJlbW90ZVN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGVjdGVkPEpJVFRhcmdldEFkZHJlc3M+KFJlbW90ZVN5bWJvbElkKT4geworICBwdWJsaWM6CisgICAgc3RhdGljIGNvbnN0IGNoYXIgKmdldE5hbWUoKSB7IHJldHVybiAiTWF0ZXJpYWxpemVSZW1vdGVTeW1ib2wiOyB9CisgIH07Cit9OworCisvLy8gQmFzZSBjbGFzcyBjb250YWluaW5nIGNvbW1vbiB1dGlsaXRpZXMgZm9yIFJlbW90ZU9iamVjdENsaWVudExheWVyIGFuZAorLy8vIFJlbW90ZU9iamVjdFNlcnZlckxheWVyLgordGVtcGxhdGUgPHR5cGVuYW1lIFJQQ0VuZHBvaW50PgorY2xhc3MgUmVtb3RlT2JqZWN0TGF5ZXIgOiBwdWJsaWMgUmVtb3RlT2JqZWN0TGF5ZXJBUEkgeworcHVibGljOgorCisgIFJlbW90ZU9iamVjdExheWVyKFJQQ0VuZHBvaW50ICZSZW1vdGUsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChFcnJvcik+IFJlcG9ydEVycm9yKQorICAgICAgOiBSZW1vdGUoUmVtb3RlKSwgUmVwb3J0RXJyb3Ioc3RkOjptb3ZlKFJlcG9ydEVycm9yKSksCisgICAgICAgIFN5bWJvbElkTWdyKE51bGxTeW1ib2xJZCArIDEpIHsKKyAgICB1c2luZyBUaGlzVCA9IFJlbW90ZU9iamVjdExheWVyPFJQQ0VuZHBvaW50PjsKKyAgICBSZW1vdGUudGVtcGxhdGUgYWRkSGFuZGxlcjxSZWxlYXNlUmVtb3RlU3ltYm9sPigKKyAgICAgICAgICAgICAqdGhpcywgJlRoaXNUOjpoYW5kbGVSZWxlYXNlUmVtb3RlU3ltYm9sKTsKKyAgICBSZW1vdGUudGVtcGxhdGUgYWRkSGFuZGxlcjxNYXRlcmlhbGl6ZVJlbW90ZVN5bWJvbD4oCisgICAgICAgICAgICAgKnRoaXMsICZUaGlzVDo6aGFuZGxlTWF0ZXJpYWxpemVSZW1vdGVTeW1ib2wpOworICB9CisKK3Byb3RlY3RlZDoKKworICAvLy8gVGhpcyBjbGFzcyBpcyB1c2VkIGFzIHRoZSBzeW1ib2wgbWF0ZXJpYWxpemVyIGZvciBKSVRTeW1ib2xzIHJldHVybmVkIGJ5CisgIC8vLyBSZW1vdGVPYmplY3RMYXllckNsaWVudC9SZW1vdGVPYmplY3RMYXllclNlcnZlciAtLSB0aGUgbWF0ZXJpYWxpemVyIGtub3dzCisgIC8vLyBob3cgdG8gY2FsbCBiYWNrIHRvIHRoZSBvdGhlciBSUEMgZW5kcG9pbnQgdG8gZ2V0IHRoZSBhZGRyZXNzIHdoZW4KKyAgLy8vIHJlcXVlc3RlZC4KKyAgY2xhc3MgUmVtb3RlU3ltYm9sTWF0ZXJpYWxpemVyIHsKKyAgcHVibGljOgorCisgICAgLy8vIENvbnN0cnVjdCBhIFJlbW90ZVN5bWJvbE1hdGVyaWFsaXplciBmb3IgdGhlIGdpdmVuIFJlbW90ZU9iamVjdExheWVyCisgICAgLy8vIHdpdGggdGhlIGdpdmVuIElkLgorICAgIFJlbW90ZVN5bWJvbE1hdGVyaWFsaXplcihSZW1vdGVPYmplY3RMYXllciAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtb3RlU3ltYm9sSWQgSWQpCisgICAgICA6IEMoQyksIElkKElkKSB7fQorCisgICAgUmVtb3RlU3ltYm9sTWF0ZXJpYWxpemVyKGNvbnN0IFJlbW90ZVN5bWJvbE1hdGVyaWFsaXplciAmT3RoZXIpCisgICAgICA6IEMoT3RoZXIuQyksIElkKE90aGVyLklkKSB7CisgICAgICAvLyBGSVhNRTogVGhpcyBpcyBhIGhvcnJpYmxlLCBhdXRvX3B0ci1zdHlsZSwgY29weS1hcy1tb3ZlIG9wZXJhdGlvbi4KKyAgICAgIC8vICAgICAgICBJdCBzaG91bGQgYmUgcmVtb3ZlZCBhcyBzb29uIGFzIExMVk0gaGFzIEMrKzE0J3MgZ2VuZXJhbGl6ZWQKKyAgICAgIC8vICAgICAgICBsYW1iZGEgY2FwdHVyZSAoYXQgd2hpY2ggcG9pbnQgdGhlIG1hdGVyaWFsaXplciBjYW4gYmUgbW92ZWQKKyAgICAgIC8vICAgICAgICBpbnRvIHRoZSBsYW1iZGEgaW4gcmVtb3RlVG9KSVRTeW1ib2wgYmVsb3cpLgorICAgICAgY29uc3RfY2FzdDxSZW1vdGVTeW1ib2xNYXRlcmlhbGl6ZXImPihPdGhlcikuSWQgPSAwOworICAgIH0KKworICAgIFJlbW90ZVN5bWJvbE1hdGVyaWFsaXplciYKKyAgICBvcGVyYXRvcj0oY29uc3QgUmVtb3RlU3ltYm9sTWF0ZXJpYWxpemVyJikgPSBkZWxldGU7CisKKyAgICAvLy8gUmVsZWFzZSB0aGUgcmVtb3RlIHN5bWJvbC4KKyAgICB+UmVtb3RlU3ltYm9sTWF0ZXJpYWxpemVyKCkgeworICAgICAgaWYgKElkKQorICAgICAgICBDLnJlbGVhc2VSZW1vdGVTeW1ib2woSWQpOworICAgIH0KKworICAgIC8vLyBNYXRlcmlhbGl6ZSB0aGUgc3ltYm9sIG9uIHRoZSByZW1vdGUgYW5kIGdldCBpdHMgYWRkcmVzcy4KKyAgICBFeHBlY3RlZDxKSVRUYXJnZXRBZGRyZXNzPiBtYXRlcmlhbGl6ZSgpIHsKKyAgICAgIGF1dG8gQWRkciA9IEMubWF0ZXJpYWxpemVSZW1vdGVTeW1ib2woSWQpOworICAgICAgSWQgPSAwOworICAgICAgcmV0dXJuIEFkZHI7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgUmVtb3RlT2JqZWN0TGF5ZXIgJkM7CisgICAgUmVtb3RlU3ltYm9sSWQgSWQ7CisgIH07CisKKyAgLy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBnZXR0aW5nIGEgbnVsbCByZW1vdGUgc3ltYm9sIHZhbHVlLgorICBSZW1vdGVTeW1ib2wgbnVsbFJlbW90ZVN5bWJvbCgpIHsKKyAgICByZXR1cm4gUmVtb3RlU3ltYm9sKDAsIEpJVFN5bWJvbEZsYWdzKCkpOworICB9CisKKyAgLy8vIENyZWF0ZXMgYSBTdHJpbmdFcnJvciB0aGF0IGNvbnRhaW5zIGEgY29weSBvZiBFcnIncyBsb2cgbWVzc2FnZSwgdGhlbgorICAvLy8gc2VuZHMgdGhhdCBTdHJpbmdFcnJvciB0byBSZXBvcnRFcnJvci4KKyAgLy8vCisgIC8vLyBUaGlzIGFsbG93cyB1cyB0byBsb2NhbGx5IGxvZyBlcnJvciBtZXNzYWdlcyBmb3IgZXJyb3JzIHRoYXQgd2lsbCBhY3R1YWxseQorICAvLy8gYmUgZGVsaXZlcmVkIHRvIHRoZSByZW1vdGUuCisgIEVycm9yIHRlZUxvZyhFcnJvciBFcnIpIHsKKyAgICByZXR1cm4gaGFuZGxlRXJyb3JzKHN0ZDo6bW92ZShFcnIpLAorICAgICAgICAgICAgICAgICAgICAgICAgW3RoaXNdKHN0ZDo6dW5pcXVlX3B0cjxFcnJvckluZm9CYXNlPiBFSUIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwb3J0RXJyb3IobWFrZV9lcnJvcjxTdHJpbmdFcnJvcj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUlCLT5tZXNzYWdlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUlCLT5jb252ZXJ0VG9FcnJvckNvZGUoKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gRXJyb3Ioc3RkOjptb3ZlKEVJQikpOworICAgICAgICAgICAgICAgICAgICAgICAgfSk7CisgIH0KKworICBFcnJvciBiYWRSZW1vdGVTeW1ib2xJZEVycm9yKFJlbW90ZVN5bWJvbElkIElkKSB7CisgICAgcmV0dXJuIG1ha2VfZXJyb3I8QmFkU3ltYm9sSGFuZGxlRXJyb3I+KElkLCAiUmVtb3RlIEpJVCBTeW1ib2wiKTsKKyAgfQorCisgIEVycm9yIGJhZE9iamVjdEhhbmRsZUVycm9yKE9iakhhbmRsZVQgSCkgeworICAgIHJldHVybiBtYWtlX2Vycm9yPFJlbW90ZU9iamVjdExheWVyQVBJOjpCYWRPYmplY3RIYW5kbGVFcnJvcj4oCisgICAgICAgICAgICAgSCwgIkJhZCBvYmplY3QgaGFuZGxlIik7CisgIH0KKworICAvLy8gQ3JlYXRlIGEgUmVtb3RlU3ltYm9sIHdyYXBwaW5nIHRoZSBnaXZlbiBKSVRTeW1ib2wuCisgIEV4cGVjdGVkPFJlbW90ZVN5bWJvbD4gaml0U3ltYm9sVG9SZW1vdGUoSklUU3ltYm9sIFN5bSkgeworICAgIGlmIChTeW0pIHsKKyAgICAgIGF1dG8gSWQgPSBTeW1ib2xJZE1nci5nZXROZXh0KCk7CisgICAgICBhdXRvIEZsYWdzID0gU3ltLmdldEZsYWdzKCk7CisgICAgICBhc3NlcnQoIUluVXNlU3ltYm9scy5jb3VudChJZCkgJiYgIlN5bWJvbCBpZCBhbHJlYWR5IGluIHVzZSIpOworICAgICAgSW5Vc2VTeW1ib2xzLmluc2VydChzdGQ6Om1ha2VfcGFpcihJZCwgc3RkOjptb3ZlKFN5bSkpKTsKKyAgICAgIHJldHVybiBSZW1vdGVTeW1ib2woSWQsIEZsYWdzKTsKKyAgICB9IGVsc2UgaWYgKGF1dG8gRXJyID0gU3ltLnRha2VFcnJvcigpKQorICAgICAgcmV0dXJuIHRlZUxvZyhzdGQ6Om1vdmUoRXJyKSk7CisgICAgLy8gZWxzZS4uLgorICAgIHJldHVybiBudWxsUmVtb3RlU3ltYm9sKCk7CisgIH0KKworICAvLy8gQ29udmVydCBhbiBFeHBlY3RlZDxSZW1vdGVTeW1ib2w+IHRvIGEgSklUU3ltYm9sLgorICBKSVRTeW1ib2wgcmVtb3RlVG9KSVRTeW1ib2woRXhwZWN0ZWQ8UmVtb3RlU3ltYm9sPiBSZW1vdGVTeW1PckVycikgeworICAgIGlmIChSZW1vdGVTeW1PckVycikgeworICAgICAgYXV0byAmUmVtb3RlU3ltID0gKlJlbW90ZVN5bU9yRXJyOworICAgICAgaWYgKFJlbW90ZVN5bSA9PSBudWxsUmVtb3RlU3ltYm9sKCkpCisgICAgICAgIHJldHVybiBudWxscHRyOworICAgICAgLy8gZWxzZS4uLgorICAgICAgUmVtb3RlU3ltYm9sTWF0ZXJpYWxpemVyIFJTTSgqdGhpcywgUmVtb3RlU3ltLmZpcnN0KTsKKyAgICAgIGF1dG8gU3ltID0KKyAgICAgICAgSklUU3ltYm9sKFtSU01dKCkgbXV0YWJsZSB7IHJldHVybiBSU00ubWF0ZXJpYWxpemUoKTsgfSwKKyAgICAgICAgICAgICAgICAgIFJlbW90ZVN5bS5zZWNvbmQpOworICAgICAgcmV0dXJuIFN5bTsKKyAgICB9IGVsc2UKKyAgICAgIHJldHVybiBSZW1vdGVTeW1PckVyci50YWtlRXJyb3IoKTsKKyAgfQorCisgIFJQQ0VuZHBvaW50ICZSZW1vdGU7CisgIHN0ZDo6ZnVuY3Rpb248dm9pZChFcnJvcik+IFJlcG9ydEVycm9yOworCitwcml2YXRlOgorCisgIC8vLyBOb3RpZnkgdGhlIHJlbW90ZSB0byByZWxlYXNlIHRoZSBnaXZlbiBKSVRTeW1ib2wuCisgIHZvaWQgcmVsZWFzZVJlbW90ZVN5bWJvbChSZW1vdGVTeW1ib2xJZCBJZCkgeworICAgIGlmIChhdXRvIEVyciA9IFJlbW90ZS50ZW1wbGF0ZSBjYWxsQjxSZWxlYXNlUmVtb3RlU3ltYm9sPihJZCkpCisgICAgICBSZXBvcnRFcnJvcihzdGQ6Om1vdmUoRXJyKSk7CisgIH0KKworICAvLy8gTm90aWZ5IHRoZSByZW1vdGUgdG8gbWF0ZXJpYWxpemUgdGhlIEpJVFN5bWJvbCB3aXRoIHRoZSBnaXZlbiBJZCBhbmQKKyAgLy8vIHJldHVybiBpdHMgYWRkcmVzcy4KKyAgRXhwZWN0ZWQ8SklUVGFyZ2V0QWRkcmVzcz4gbWF0ZXJpYWxpemVSZW1vdGVTeW1ib2woUmVtb3RlU3ltYm9sSWQgSWQpIHsKKyAgICByZXR1cm4gUmVtb3RlLnRlbXBsYXRlIGNhbGxCPE1hdGVyaWFsaXplUmVtb3RlU3ltYm9sPihJZCk7CisgIH0KKworICAvLy8gUmVsZWFzZSB0aGUgSklUU3ltYm9sIHdpdGggdGhlIGdpdmVuIElkLgorICBFcnJvciBoYW5kbGVSZWxlYXNlUmVtb3RlU3ltYm9sKFJlbW90ZVN5bWJvbElkIElkKSB7CisgICAgYXV0byBTSSA9IEluVXNlU3ltYm9scy5maW5kKElkKTsKKyAgICBpZiAoU0kgIT0gSW5Vc2VTeW1ib2xzLmVuZCgpKSB7CisgICAgICBJblVzZVN5bWJvbHMuZXJhc2UoU0kpOworICAgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gdGVlTG9nKGJhZFJlbW90ZVN5bWJvbElkRXJyb3IoSWQpKTsKKyAgfQorCisgIC8vLyBSdW4gdGhlIG1hdGVyaWFsaXplciBmb3IgdGhlIEpJVFN5bWJvbCB3aXRoIHRoZSBnaXZlbiBJZCBhbmQgcmV0dXJuIGl0cworICAvLy8gYWRkcmVzcy4KKyAgRXhwZWN0ZWQ8SklUVGFyZ2V0QWRkcmVzcz4gaGFuZGxlTWF0ZXJpYWxpemVSZW1vdGVTeW1ib2woUmVtb3RlU3ltYm9sSWQgSWQpIHsKKyAgICBhdXRvIFNJID0gSW5Vc2VTeW1ib2xzLmZpbmQoSWQpOworICAgIGlmIChTSSAhPSBJblVzZVN5bWJvbHMuZW5kKCkpIHsKKyAgICAgIGF1dG8gQWRkck9yRXJyID0gU0ktPnNlY29uZC5nZXRBZGRyZXNzKCk7CisgICAgICBJblVzZVN5bWJvbHMuZXJhc2UoU0kpOworICAgICAgU3ltYm9sSWRNZ3IucmVsZWFzZShJZCk7CisgICAgICBpZiAoQWRkck9yRXJyKQorICAgICAgICByZXR1cm4gKkFkZHJPckVycjsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIHRlZUxvZyhBZGRyT3JFcnIudGFrZUVycm9yKCkpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gdGVlTG9nKGJhZFJlbW90ZVN5bWJvbElkRXJyb3IoSWQpKTsKKyAgICB9CisgIH0KKworICByZW1vdGU6OlJlc291cmNlSWRNZ3IgU3ltYm9sSWRNZ3I7CisgIHN0ZDo6bWFwPFJlbW90ZVN5bWJvbElkLCBKSVRTeW1ib2w+IEluVXNlU3ltYm9sczsKK307CisKKy8vLyBSZW1vdGVPYmplY3RDbGllbnRMYXllciBmb3J3YXJkcyB0aGUgT1JDIE9iamVjdCBMYXllciBBUEkgb3ZlciBhbiBSUEMKKy8vLyBjb25uZWN0aW9uLgorLy8vCisvLy8gVGhpcyBjbGFzcyBjYW4gYmUgdXNlZCBhcyB0aGUgYmFzZSBsYXllciBvZiBhIEpJVCBzdGFjayBvbiB0aGUgY2xpZW50IGFuZAorLy8vIHdpbGwgZm9yd2FyZCBvcGVyYXRpb25zIHRvIGEgY29ycmVzcG9uZGluZyBSZW1vdGVPYmplY3RTZXJ2ZXJMYXllciBvbiB0aGUKKy8vLyBzZXJ2ZXIgKHdoaWNoIGNhbiBiZSBjb21wb3NlZCBvbiB0b3Agb2YgYSAicmVhbCIgb2JqZWN0IGxheWVyIGxpa2UKKy8vLyBSVER5bGRPYmplY3RMaW5raW5nTGF5ZXIgdG8gYWN0dWFsbHkgY2Fycnkgb3V0IHRoZSBvcGVyYXRpb25zKS4KKy8vLworLy8vIFNlbmRpbmcgcmVsb2NhdGFibGUgb2JqZWN0cyB0byB0aGUgc2VydmVyIChyYXRoZXIgdGhhbiBmdWxseSByZWxvY2F0ZWQKKy8vLyBiaXRzKSBhbGxvd3MgSklUJ2QgY29kZSB0byBiZSBjYWNoZWQgb24gdGhlIHNlcnZlciBzaWRlIGFuZCByZS11c2VkIGluCisvLy8gc3Vic2VxdWVudCBKSVQgc2Vzc2lvbnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUlBDRW5kcG9pbnQ+CitjbGFzcyBSZW1vdGVPYmplY3RDbGllbnRMYXllciA6IHB1YmxpYyBSZW1vdGVPYmplY3RMYXllcjxSUENFbmRwb2ludD4geworcHJpdmF0ZToKKworICB1c2luZyBBZGRPYmplY3QgPSBSZW1vdGVPYmplY3RMYXllckFQSTo6QWRkT2JqZWN0OworICB1c2luZyBSZW1vdmVPYmplY3QgPSBSZW1vdGVPYmplY3RMYXllckFQSTo6UmVtb3ZlT2JqZWN0OworICB1c2luZyBGaW5kU3ltYm9sID0gUmVtb3RlT2JqZWN0TGF5ZXJBUEk6OkZpbmRTeW1ib2w7CisgIHVzaW5nIEZpbmRTeW1ib2xJbiA9IFJlbW90ZU9iamVjdExheWVyQVBJOjpGaW5kU3ltYm9sSW47CisgIHVzaW5nIEVtaXRBbmRGaW5hbGl6ZSA9IFJlbW90ZU9iamVjdExheWVyQVBJOjpFbWl0QW5kRmluYWxpemU7CisgIHVzaW5nIExvb2t1cCA9IFJlbW90ZU9iamVjdExheWVyQVBJOjpMb29rdXA7CisgIHVzaW5nIExvb2t1cEluTG9naWNhbER5bGliID0gUmVtb3RlT2JqZWN0TGF5ZXJBUEk6Okxvb2t1cEluTG9naWNhbER5bGliOworCisgIHVzaW5nIFJlbW90ZU9iamVjdExheWVyPFJQQ0VuZHBvaW50Pjo6dGVlTG9nOworICB1c2luZyBSZW1vdGVPYmplY3RMYXllcjxSUENFbmRwb2ludD46OmJhZE9iamVjdEhhbmRsZUVycm9yOworICB1c2luZyBSZW1vdGVPYmplY3RMYXllcjxSUENFbmRwb2ludD46OnJlbW90ZVRvSklUU3ltYm9sOworCitwdWJsaWM6CisKKyAgdXNpbmcgT2JqSGFuZGxlVCA9IFJlbW90ZU9iamVjdExheWVyQVBJOjpPYmpIYW5kbGVUOworICB1c2luZyBSZW1vdGVTeW1ib2wgPSBSZW1vdGVPYmplY3RMYXllckFQSTo6UmVtb3RlU3ltYm9sOworCisgIHVzaW5nIE9iamVjdFB0ciA9IHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+OworCisgIC8vLyBDcmVhdGUgYSBSZW1vdGVPYmplY3RDbGllbnRMYXllciB0aGF0IGNvbW11bmljYXRlcyB3aXRoIGEKKyAgLy8vIFJlbW90ZU9iamVjdFNlcnZlckxheWVyIGluc3RhbmNlIHZpYSB0aGUgZ2l2ZW4gUlBDRW5kcG9pbnQuCisgIC8vLworICAvLy8gVGhlIFJlcG9ydEVycm9yIGZ1bmN0b3IgY2FuIGJlIHVzZWQgbG9jYWxseSBsb2cgZXJyb3JzIHRoYXQgYXJlIGludGVuZGVkCisgIC8vLyB0byBiZSBzZW50ICBzZW50CisgIFJlbW90ZU9iamVjdENsaWVudExheWVyKFJQQ0VuZHBvaW50ICZSZW1vdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChFcnJvcik+IFJlcG9ydEVycm9yKQorICAgICAgOiBSZW1vdGVPYmplY3RMYXllcjxSUENFbmRwb2ludD4oUmVtb3RlLCBzdGQ6Om1vdmUoUmVwb3J0RXJyb3IpKSB7CisgICAgdXNpbmcgVGhpc1QgPSBSZW1vdGVPYmplY3RDbGllbnRMYXllcjxSUENFbmRwb2ludD47CisgICAgUmVtb3RlLnRlbXBsYXRlIGFkZEhhbmRsZXI8TG9va3VwPigqdGhpcywgJlRoaXNUOjpsb29rdXApOworICAgIFJlbW90ZS50ZW1wbGF0ZSBhZGRIYW5kbGVyPExvb2t1cEluTG9naWNhbER5bGliPigKKyAgICAgICAgICAgICp0aGlzLCAmVGhpc1Q6Omxvb2t1cEluTG9naWNhbER5bGliKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgQWRkIGFuIG9iamVjdCB0byB0aGUgSklULgorICAvLy8KKyAgLy8vIEByZXR1cm4gQSBoYW5kbGUgdGhhdCBjYW4gYmUgdXNlZCB0byByZWZlciB0byB0aGUgbG9hZGVkIG9iamVjdCAoZm9yCisgIC8vLyAgICAgICAgIHN5bWJvbCBzZWFyY2hpbmcsIGZpbmFsaXphdGlvbiwgZnJlZWluZyBtZW1vcnksIGV0Yy4pLgorICBFeHBlY3RlZDxPYmpIYW5kbGVUPgorICBhZGRPYmplY3QoT2JqZWN0UHRyIE9iakJ1ZmZlciwKKyAgICAgICAgICAgIHN0ZDo6c2hhcmVkX3B0cjxMZWdhY3lKSVRTeW1ib2xSZXNvbHZlcj4gUmVzb2x2ZXIpIHsKKyAgICBpZiAoYXV0byBIYW5kbGVPckVyciA9CisgICAgICAgICAgICB0aGlzLT5SZW1vdGUudGVtcGxhdGUgY2FsbEI8QWRkT2JqZWN0PihPYmpCdWZmZXItPmdldEJ1ZmZlcigpKSkgeworICAgICAgYXV0byAmSGFuZGxlID0gKkhhbmRsZU9yRXJyOworICAgICAgLy8gRklYTUU6IFJldHVybiBhbiBlcnJvciBmb3IgdGhpczoKKyAgICAgIGFzc2VydCghUmVzb2x2ZXJzLmNvdW50KEhhbmRsZSkgJiYgIkhhbmRsZSBhbHJlYWR5IGluIHVzZT8iKTsKKyAgICAgIFJlc29sdmVyc1tIYW5kbGVdID0gc3RkOjptb3ZlKFJlc29sdmVyKTsKKyAgICAgIHJldHVybiBIYW5kbGU7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gSGFuZGxlT3JFcnIudGFrZUVycm9yKCk7CisgIH0KKworICAvLy8gQGJyaWVmIFJlbW92ZSB0aGUgZ2l2ZW4gb2JqZWN0IGZyb20gdGhlIEpJVC4KKyAgRXJyb3IgcmVtb3ZlT2JqZWN0KE9iakhhbmRsZVQgSCkgeworICAgIHJldHVybiB0aGlzLT5SZW1vdGUudGVtcGxhdGUgY2FsbEI8UmVtb3ZlT2JqZWN0PihIKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgU2VhcmNoIGZvciB0aGUgZ2l2ZW4gbmFtZWQgc3ltYm9sLgorICBKSVRTeW1ib2wgZmluZFN5bWJvbChTdHJpbmdSZWYgTmFtZSwgYm9vbCBFeHBvcnRlZFN5bWJvbHNPbmx5KSB7CisgICAgcmV0dXJuIHJlbW90ZVRvSklUU3ltYm9sKAorICAgICAgICAgICAgIHRoaXMtPlJlbW90ZS50ZW1wbGF0ZSBjYWxsQjxGaW5kU3ltYm9sPihOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHBvcnRlZFN5bWJvbHNPbmx5KSk7CisgIH0KKworICAvLy8gQGJyaWVmIFNlYXJjaCBmb3IgdGhlIGdpdmVuIG5hbWVkIHN5bWJvbCB3aXRoaW4gdGhlIGdpdmVuIGNvbnRleHQuCisgIEpJVFN5bWJvbCBmaW5kU3ltYm9sSW4oT2JqSGFuZGxlVCBILCBTdHJpbmdSZWYgTmFtZSwgYm9vbCBFeHBvcnRlZFN5bWJvbHNPbmx5KSB7CisgICAgcmV0dXJuIHJlbW90ZVRvSklUU3ltYm9sKAorICAgICAgICAgICAgIHRoaXMtPlJlbW90ZS50ZW1wbGF0ZSBjYWxsQjxGaW5kU3ltYm9sSW4+KEgsIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXhwb3J0ZWRTeW1ib2xzT25seSkpOworICB9CisKKyAgLy8vIEBicmllZiBJbW1lZGlhdGVseSBlbWl0IGFuZCBmaW5hbGl6ZSB0aGUgb2JqZWN0IHdpdGggdGhlIGdpdmVuIGhhbmRsZS4KKyAgRXJyb3IgZW1pdEFuZEZpbmFsaXplKE9iakhhbmRsZVQgSCkgeworICAgIHJldHVybiB0aGlzLT5SZW1vdGUudGVtcGxhdGUgY2FsbEI8RW1pdEFuZEZpbmFsaXplPihIKTsKKyAgfQorCitwcml2YXRlOgorCisgIEV4cGVjdGVkPFJlbW90ZVN5bWJvbD4gbG9va3VwKE9iakhhbmRsZVQgSCwgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIHsKKyAgICBhdXRvIFJJID0gUmVzb2x2ZXJzLmZpbmQoSCk7CisgICAgaWYgKFJJICE9IFJlc29sdmVycy5lbmQoKSkgeworICAgICAgcmV0dXJuIHRoaXMtPmppdFN5bWJvbFRvUmVtb3RlKFJJLT5zZWNvbmQtPmZpbmRTeW1ib2woTmFtZSkpOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIHRlZUxvZyhiYWRPYmplY3RIYW5kbGVFcnJvcihIKSk7CisgIH0KKworICBFeHBlY3RlZDxSZW1vdGVTeW1ib2w+IGxvb2t1cEluTG9naWNhbER5bGliKE9iakhhbmRsZVQgSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgeworICAgIGF1dG8gUkkgPSBSZXNvbHZlcnMuZmluZChIKTsKKyAgICBpZiAoUkkgIT0gUmVzb2x2ZXJzLmVuZCgpKQorICAgICAgcmV0dXJuIHRoaXMtPmppdFN5bWJvbFRvUmVtb3RlKAorICAgICAgICAgICAgICAgUkktPnNlY29uZC0+ZmluZFN5bWJvbEluTG9naWNhbER5bGliKE5hbWUpKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gdGVlTG9nKGJhZE9iamVjdEhhbmRsZUVycm9yKEgpKTsKKyAgfQorCisgIHN0ZDo6bWFwPHJlbW90ZTo6UmVzb3VyY2VJZE1ncjo6UmVzb3VyY2VJZCwKKyAgICAgICAgICAgc3RkOjpzaGFyZWRfcHRyPExlZ2FjeUpJVFN5bWJvbFJlc29sdmVyPj4KKyAgICAgIFJlc29sdmVyczsKK307CisKKy8vLyBSZW1vdGVPYmplY3RTZXJ2ZXJMYXllciBhY3RzIGFzIGEgc2VydmVyIGFuZCBoYW5kbGluZyBSUEMgY2FsbHMgZm9yIHRoZQorLy8vIG9iamVjdCBsYXllciBBUEkgZnJvbSB0aGUgZ2l2ZW4gUlBDIGNvbm5lY3Rpb24uCisvLy8KKy8vLyBUaGlzIGNsYXNzIGNhbiBiZSBjb21wb3NlZCBvbiB0b3Agb2YgYSAncmVhbCcgb2JqZWN0IGxheWVyIChlLmcuCisvLy8gUlREeWxkT2JqZWN0TGlua2luZ0xheWVyKSB0byBkbyB0aGUgYWN0dWFsIHdvcmsgb2YgcmVsb2NhdGluZyBvYmplY3RzCisvLy8gYW5kIG1ha2luZyB0aGVtIGV4ZWN1dGFibGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmFzZUxheWVyVCwgdHlwZW5hbWUgUlBDRW5kcG9pbnQ+CitjbGFzcyBSZW1vdGVPYmplY3RTZXJ2ZXJMYXllciA6IHB1YmxpYyBSZW1vdGVPYmplY3RMYXllcjxSUENFbmRwb2ludD4geworcHJpdmF0ZToKKworICB1c2luZyBPYmpIYW5kbGVUID0gUmVtb3RlT2JqZWN0TGF5ZXJBUEk6Ok9iakhhbmRsZVQ7CisgIHVzaW5nIFJlbW90ZVN5bWJvbCA9IFJlbW90ZU9iamVjdExheWVyQVBJOjpSZW1vdGVTeW1ib2w7CisKKyAgdXNpbmcgQWRkT2JqZWN0ID0gUmVtb3RlT2JqZWN0TGF5ZXJBUEk6OkFkZE9iamVjdDsKKyAgdXNpbmcgUmVtb3ZlT2JqZWN0ID0gUmVtb3RlT2JqZWN0TGF5ZXJBUEk6OlJlbW92ZU9iamVjdDsKKyAgdXNpbmcgRmluZFN5bWJvbCA9IFJlbW90ZU9iamVjdExheWVyQVBJOjpGaW5kU3ltYm9sOworICB1c2luZyBGaW5kU3ltYm9sSW4gPSBSZW1vdGVPYmplY3RMYXllckFQSTo6RmluZFN5bWJvbEluOworICB1c2luZyBFbWl0QW5kRmluYWxpemUgPSBSZW1vdGVPYmplY3RMYXllckFQSTo6RW1pdEFuZEZpbmFsaXplOworICB1c2luZyBMb29rdXAgPSBSZW1vdGVPYmplY3RMYXllckFQSTo6TG9va3VwOworICB1c2luZyBMb29rdXBJbkxvZ2ljYWxEeWxpYiA9IFJlbW90ZU9iamVjdExheWVyQVBJOjpMb29rdXBJbkxvZ2ljYWxEeWxpYjsKKworICB1c2luZyBSZW1vdGVPYmplY3RMYXllcjxSUENFbmRwb2ludD46OnRlZUxvZzsKKyAgdXNpbmcgUmVtb3RlT2JqZWN0TGF5ZXI8UlBDRW5kcG9pbnQ+OjpiYWRPYmplY3RIYW5kbGVFcnJvcjsKKyAgdXNpbmcgUmVtb3RlT2JqZWN0TGF5ZXI8UlBDRW5kcG9pbnQ+OjpyZW1vdGVUb0pJVFN5bWJvbDsKKworcHVibGljOgorCisgIC8vLyBDcmVhdGUgYSBSZW1vdGVPYmplY3RTZXJ2ZXJMYXllciB3aXRoIHRoZSBnaXZlbiBiYXNlIGxheWVyICh3aGljaCBtdXN0IGJlCisgIC8vLyBhbiBvYmplY3QgbGF5ZXIpLCBSUEMgZW5kcG9pbnQsIGFuZCBlcnJvciByZXBvcnRlciBmdW5jdGlvbi4KKyAgUmVtb3RlT2JqZWN0U2VydmVyTGF5ZXIoQmFzZUxheWVyVCAmQmFzZUxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSUENFbmRwb2ludCAmUmVtb3RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoRXJyb3IpPiBSZXBvcnRFcnJvcikKKyAgICA6IFJlbW90ZU9iamVjdExheWVyPFJQQ0VuZHBvaW50PihSZW1vdGUsIHN0ZDo6bW92ZShSZXBvcnRFcnJvcikpLAorICAgICAgQmFzZUxheWVyKEJhc2VMYXllciksIEhhbmRsZUlkTWdyKDEpIHsKKyAgICB1c2luZyBUaGlzVCA9IFJlbW90ZU9iamVjdFNlcnZlckxheWVyPEJhc2VMYXllclQsIFJQQ0VuZHBvaW50PjsKKworICAgIFJlbW90ZS50ZW1wbGF0ZSBhZGRIYW5kbGVyPEFkZE9iamVjdD4oKnRoaXMsICZUaGlzVDo6YWRkT2JqZWN0KTsKKyAgICBSZW1vdGUudGVtcGxhdGUgYWRkSGFuZGxlcjxSZW1vdmVPYmplY3Q+KCp0aGlzLCAmVGhpc1Q6OnJlbW92ZU9iamVjdCk7CisgICAgUmVtb3RlLnRlbXBsYXRlIGFkZEhhbmRsZXI8RmluZFN5bWJvbD4oKnRoaXMsICZUaGlzVDo6ZmluZFN5bWJvbCk7CisgICAgUmVtb3RlLnRlbXBsYXRlIGFkZEhhbmRsZXI8RmluZFN5bWJvbEluPigqdGhpcywgJlRoaXNUOjpmaW5kU3ltYm9sSW4pOworICAgIFJlbW90ZS50ZW1wbGF0ZSBhZGRIYW5kbGVyPEVtaXRBbmRGaW5hbGl6ZT4oKnRoaXMsICZUaGlzVDo6ZW1pdEFuZEZpbmFsaXplKTsKKyAgfQorCitwcml2YXRlOgorCisgIGNsYXNzIFN0cmluZ01lbW9yeUJ1ZmZlciA6IHB1YmxpYyBNZW1vcnlCdWZmZXIgeworICBwdWJsaWM6CisgICAgU3RyaW5nTWVtb3J5QnVmZmVyKHN0ZDo6c3RyaW5nIEJ1ZmZlcikKKyAgICAgIDogQnVmZmVyKHN0ZDo6bW92ZShCdWZmZXIpKSB7CisgICAgICBpbml0KHRoaXMtPkJ1ZmZlci5kYXRhKCksIHRoaXMtPkJ1ZmZlci5kYXRhKCkgKyB0aGlzLT5CdWZmZXIuc2l6ZSgpLAorICAgICAgICAgICBmYWxzZSk7CisgICAgfQorCisgICAgQnVmZmVyS2luZCBnZXRCdWZmZXJLaW5kKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gTWVtb3J5QnVmZmVyX01hbGxvYzsgfQorICBwcml2YXRlOgorICAgIHN0ZDo6c3RyaW5nIEJ1ZmZlcjsKKyAgfTsKKworICBKSVRTeW1ib2wgbG9va3VwKE9iakhhbmRsZVQgSWQsIGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgICAgcmV0dXJuIHJlbW90ZVRvSklUU3ltYm9sKAorICAgICAgICAgICAgIHRoaXMtPlJlbW90ZS50ZW1wbGF0ZSBjYWxsQjxMb29rdXA+KElkLCBOYW1lKSk7CisgIH0KKworICBKSVRTeW1ib2wgbG9va3VwSW5Mb2dpY2FsRHlsaWIoT2JqSGFuZGxlVCBJZCwgY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIHsKKyAgICByZXR1cm4gcmVtb3RlVG9KSVRTeW1ib2woCisgICAgICAgICAgICAgdGhpcy0+UmVtb3RlLnRlbXBsYXRlIGNhbGxCPExvb2t1cEluTG9naWNhbER5bGliPihJZCwgTmFtZSkpOworICB9CisKKyAgRXhwZWN0ZWQ8T2JqSGFuZGxlVD4gYWRkT2JqZWN0KHN0ZDo6c3RyaW5nIE9iakJ1ZmZlcikgeworICAgIGF1dG8gQnVmZmVyID0gbGx2bTo6bWFrZV91bmlxdWU8U3RyaW5nTWVtb3J5QnVmZmVyPihzdGQ6Om1vdmUoT2JqQnVmZmVyKSk7CisgICAgYXV0byBJZCA9IEhhbmRsZUlkTWdyLmdldE5leHQoKTsKKyAgICBhc3NlcnQoIUJhc2VMYXllckhhbmRsZXMuY291bnQoSWQpICYmICJJZCBhbHJlYWR5IGluIHVzZT8iKTsKKworICAgIGF1dG8gUmVzb2x2ZXIgPSBjcmVhdGVMYW1iZGFSZXNvbHZlcigKKyAgICAgICAgW3RoaXMsIElkXShjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgeyByZXR1cm4gbG9va3VwKElkLCBOYW1lKTsgfSwKKyAgICAgICAgW3RoaXMsIElkXShjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgeworICAgICAgICAgIHJldHVybiBsb29rdXBJbkxvZ2ljYWxEeWxpYihJZCwgTmFtZSk7CisgICAgICAgIH0pOworCisgICAgaWYgKGF1dG8gSGFuZGxlT3JFcnIgPQorICAgICAgICAgICAgQmFzZUxheWVyLmFkZE9iamVjdChzdGQ6Om1vdmUoQnVmZmVyKSwgc3RkOjptb3ZlKFJlc29sdmVyKSkpIHsKKyAgICAgIEJhc2VMYXllckhhbmRsZXNbSWRdID0gc3RkOjptb3ZlKCpIYW5kbGVPckVycik7CisgICAgICByZXR1cm4gSWQ7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gdGVlTG9nKEhhbmRsZU9yRXJyLnRha2VFcnJvcigpKTsKKyAgfQorCisgIEVycm9yIHJlbW92ZU9iamVjdChPYmpIYW5kbGVUIEgpIHsKKyAgICBhdXRvIEhJID0gQmFzZUxheWVySGFuZGxlcy5maW5kKEgpOworICAgIGlmIChISSAhPSBCYXNlTGF5ZXJIYW5kbGVzLmVuZCgpKSB7CisgICAgICBpZiAoYXV0byBFcnIgPSBCYXNlTGF5ZXIucmVtb3ZlT2JqZWN0KEhJLT5zZWNvbmQpKQorICAgICAgICByZXR1cm4gdGVlTG9nKHN0ZDo6bW92ZShFcnIpKTsKKyAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIHRlZUxvZyhiYWRPYmplY3RIYW5kbGVFcnJvcihIKSk7CisgIH0KKworICBFeHBlY3RlZDxSZW1vdGVTeW1ib2w+IGZpbmRTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEV4cG9ydGVkU3ltYm9sc09ubHkpIHsKKyAgICBpZiAoYXV0byBTeW0gPSBCYXNlTGF5ZXIuZmluZFN5bWJvbChOYW1lLCBFeHBvcnRlZFN5bWJvbHNPbmx5KSkKKyAgICAgIHJldHVybiB0aGlzLT5qaXRTeW1ib2xUb1JlbW90ZShzdGQ6Om1vdmUoU3ltKSk7CisgICAgZWxzZSBpZiAoYXV0byBFcnIgPSBTeW0udGFrZUVycm9yKCkpCisgICAgICByZXR1cm4gdGVlTG9nKHN0ZDo6bW92ZShFcnIpKTsKKyAgICByZXR1cm4gdGhpcy0+bnVsbFJlbW90ZVN5bWJvbCgpOworICB9CisKKyAgRXhwZWN0ZWQ8UmVtb3RlU3ltYm9sPiBmaW5kU3ltYm9sSW4oT2JqSGFuZGxlVCBILCBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBFeHBvcnRlZFN5bWJvbHNPbmx5KSB7CisgICAgYXV0byBISSA9IEJhc2VMYXllckhhbmRsZXMuZmluZChIKTsKKyAgICBpZiAoSEkgIT0gQmFzZUxheWVySGFuZGxlcy5lbmQoKSkgeworICAgICAgaWYgKGF1dG8gU3ltID0gQmFzZUxheWVyLmZpbmRTeW1ib2xJbihISS0+c2Vjb25kLCBOYW1lLCBFeHBvcnRlZFN5bWJvbHNPbmx5KSkKKyAgICAgICAgcmV0dXJuIHRoaXMtPmppdFN5bWJvbFRvUmVtb3RlKHN0ZDo6bW92ZShTeW0pKTsKKyAgICAgIGVsc2UgaWYgKGF1dG8gRXJyID0gU3ltLnRha2VFcnJvcigpKQorICAgICAgICByZXR1cm4gdGVlTG9nKHN0ZDo6bW92ZShFcnIpKTsKKyAgICAgIHJldHVybiB0aGlzLT5udWxsUmVtb3RlU3ltYm9sKCk7CisgICAgfSBlbHNlCisgICAgICByZXR1cm4gdGVlTG9nKGJhZE9iamVjdEhhbmRsZUVycm9yKEgpKTsKKyAgfQorCisgIEVycm9yIGVtaXRBbmRGaW5hbGl6ZShPYmpIYW5kbGVUIEgpIHsKKyAgICBhdXRvIEhJID0gQmFzZUxheWVySGFuZGxlcy5maW5kKEgpOworICAgIGlmIChISSAhPSBCYXNlTGF5ZXJIYW5kbGVzLmVuZCgpKSB7CisgICAgICBpZiAoYXV0byBFcnIgPSBCYXNlTGF5ZXIuZW1pdEFuZEZpbmFsaXplKEhJLT5zZWNvbmQpKQorICAgICAgICByZXR1cm4gdGVlTG9nKHN0ZDo6bW92ZShFcnIpKTsKKyAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICAgIH0gZWxzZQorICAgICAgcmV0dXJuIHRlZUxvZyhiYWRPYmplY3RIYW5kbGVFcnJvcihIKSk7CisgIH0KKworICBCYXNlTGF5ZXJUICZCYXNlTGF5ZXI7CisgIHJlbW90ZTo6UmVzb3VyY2VJZE1nciBIYW5kbGVJZE1ncjsKKyAgc3RkOjptYXA8T2JqSGFuZGxlVCwgdHlwZW5hbWUgQmFzZUxheWVyVDo6T2JqSGFuZGxlVD4gQmFzZUxheWVySGFuZGxlczsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvcmMKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfUkVNT1RFT0JKRUNUTEFZRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvT3JjL1N5bWJvbFN0cmluZ1Bvb2wuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9TeW1ib2xTdHJpbmdQb29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE0MGQxYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yYy9TeW1ib2xTdHJpbmdQb29sLmgKQEAgLTAsMCArMSwxMzcgQEAKKy8vPT09LSBTeW1ib2xTdHJpbmdQb29sLmggLSBNdWx0aS10aHJlYWRlZCBwb29sIGZvciBKSVQgc3ltYm9scyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ29udGFpbnMgYSBtdWx0aS10aHJlYWRlZCBzdHJpbmcgcG9vbCBzdWl0YWJsZSBmb3IgdXNlIHdpdGggT1JDLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDX1NZTUJPTFNUUklOR1BPT0xfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfU1lNQk9MU1RSSU5HUE9PTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlIDxhdG9taWM+CisjaW5jbHVkZSA8bXV0ZXg+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBvcmMgeworCitjbGFzcyBTeW1ib2xTdHJpbmdQdHI7CisKKy8vLyBAYnJpZWYgU3RyaW5nIHBvb2wgZm9yIHN5bWJvbCBuYW1lcyB1c2VkIGJ5IHRoZSBKSVQuCitjbGFzcyBTeW1ib2xTdHJpbmdQb29sIHsKKyAgZnJpZW5kIGNsYXNzIFN5bWJvbFN0cmluZ1B0cjsKK3B1YmxpYzoKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBzeW1ib2wgc3RyaW5nIHBvaW50ZXIgZnJvbSB0aGUgZ2l2ZW4gc3RyaW5nLgorICBTeW1ib2xTdHJpbmdQdHIgaW50ZXJuKFN0cmluZ1JlZiBTKTsKKworICAvLy8gQGJyaWVmIFJlbW92ZSBmcm9tIHRoZSBwb29sIGFueSBlbnRyaWVzIHRoYXQgYXJlIG5vIGxvbmdlciByZWZlcmVuY2VkLgorICB2b2lkIGNsZWFyRGVhZEVudHJpZXMoKTsKKworICAvLy8gQGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgcG9vbCBpcyBlbXB0eS4KKyAgYm9vbCBlbXB0eSgpIGNvbnN0OworcHJpdmF0ZToKKyAgdXNpbmcgUmVmQ291bnRUeXBlID0gc3RkOjphdG9taWM8c2l6ZV90PjsKKyAgdXNpbmcgUG9vbE1hcCA9IFN0cmluZ01hcDxSZWZDb3VudFR5cGU+OworICB1c2luZyBQb29sTWFwRW50cnkgPSBTdHJpbmdNYXBFbnRyeTxSZWZDb3VudFR5cGU+OworICBtdXRhYmxlIHN0ZDo6bXV0ZXggUG9vbE11dGV4OworICBQb29sTWFwIFBvb2w7Cit9OworCisvLy8gQGJyaWVmIFBvaW50ZXIgdG8gYSBwb29sZWQgc3RyaW5nIHJlcHJlc2VudGluZyBhIHN5bWJvbCBuYW1lLgorY2xhc3MgU3ltYm9sU3RyaW5nUHRyIHsKKyAgZnJpZW5kIGNsYXNzIFN5bWJvbFN0cmluZ1Bvb2w7CisgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgU3ltYm9sU3RyaW5nUHRyICZMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3ltYm9sU3RyaW5nUHRyICZSSFMpOworICBmcmllbmQgYm9vbCBvcGVyYXRvcjwoY29uc3QgU3ltYm9sU3RyaW5nUHRyICZMSFMsIGNvbnN0IFN5bWJvbFN0cmluZ1B0ciAmUkhTKTsKKworcHVibGljOgorICBTeW1ib2xTdHJpbmdQdHIoKSA9IGRlZmF1bHQ7CisgIFN5bWJvbFN0cmluZ1B0cihjb25zdCBTeW1ib2xTdHJpbmdQdHIgJk90aGVyKQorICAgIDogUyhPdGhlci5TKSB7CisgICAgaWYgKFMpCisgICAgICArK1MtPmdldFZhbHVlKCk7CisgIH0KKworICBTeW1ib2xTdHJpbmdQdHImIG9wZXJhdG9yPShjb25zdCBTeW1ib2xTdHJpbmdQdHIgJk90aGVyKSB7CisgICAgaWYgKFMpCisgICAgICAtLVMtPmdldFZhbHVlKCk7CisgICAgUyA9IE90aGVyLlM7CisgICAgaWYgKFMpCisgICAgICArK1MtPmdldFZhbHVlKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgU3ltYm9sU3RyaW5nUHRyKFN5bWJvbFN0cmluZ1B0ciAmJk90aGVyKSA6IFMobnVsbHB0cikgeworICAgIHN0ZDo6c3dhcChTLCBPdGhlci5TKTsKKyAgfQorCisgIFN5bWJvbFN0cmluZ1B0ciYgb3BlcmF0b3I9KFN5bWJvbFN0cmluZ1B0ciAmJk90aGVyKSB7CisgICAgaWYgKFMpCisgICAgICAtLVMtPmdldFZhbHVlKCk7CisgICAgUyA9IG51bGxwdHI7CisgICAgc3RkOjpzd2FwKFMsIE90aGVyLlMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIH5TeW1ib2xTdHJpbmdQdHIoKSB7CisgICAgaWYgKFMpCisgICAgICAtLVMtPmdldFZhbHVlKCk7CisgIH0KKworICBTdHJpbmdSZWYgb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gUy0+Zmlyc3QoKTsgfQorCitwcml2YXRlOgorCisgIFN5bWJvbFN0cmluZ1B0cihTeW1ib2xTdHJpbmdQb29sOjpQb29sTWFwRW50cnkgKlMpCisgICAgICA6IFMoUykgeworICAgIGlmIChTKQorICAgICAgKytTLT5nZXRWYWx1ZSgpOworICB9CisKKyAgU3ltYm9sU3RyaW5nUG9vbDo6UG9vbE1hcEVudHJ5ICpTID0gbnVsbHB0cjsKK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgU3ltYm9sU3RyaW5nUHRyICZMSFMsIGNvbnN0IFN5bWJvbFN0cmluZ1B0ciAmUkhTKSB7CisgIHJldHVybiBMSFMuUyA9PSBSSFMuUzsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTeW1ib2xTdHJpbmdQdHIgJkxIUywgY29uc3QgU3ltYm9sU3RyaW5nUHRyICZSSFMpIHsKKyAgcmV0dXJuICEoTEhTID09IFJIUyk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBTeW1ib2xTdHJpbmdQdHIgJkxIUywgY29uc3QgU3ltYm9sU3RyaW5nUHRyICZSSFMpIHsKKyAgcmV0dXJuIExIUy5TIDwgUkhTLlM7Cit9CisKK2lubGluZSBTeW1ib2xTdHJpbmdQdHIgU3ltYm9sU3RyaW5nUG9vbDo6aW50ZXJuKFN0cmluZ1JlZiBTKSB7CisgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBMb2NrKFBvb2xNdXRleCk7CisgIFBvb2xNYXA6Oml0ZXJhdG9yIEk7CisgIGJvb2wgQWRkZWQ7CisgIHN0ZDo6dGllKEksIEFkZGVkKSA9IFBvb2wudHJ5X2VtcGxhY2UoUywgMCk7CisgIHJldHVybiBTeW1ib2xTdHJpbmdQdHIoJipJKTsKK30KKworaW5saW5lIHZvaWQgU3ltYm9sU3RyaW5nUG9vbDo6Y2xlYXJEZWFkRW50cmllcygpIHsKKyAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IExvY2soUG9vbE11dGV4KTsKKyAgZm9yIChhdXRvIEkgPSBQb29sLmJlZ2luKCksIEUgPSBQb29sLmVuZCgpOyBJICE9IEU7KSB7CisgICAgYXV0byBUbXAgPSBJKys7CisgICAgaWYgKFRtcC0+c2Vjb25kID09IDApCisgICAgICBQb29sLmVyYXNlKFRtcCk7CisgIH0KK30KKworaW5saW5lIGJvb2wgU3ltYm9sU3RyaW5nUG9vbDo6ZW1wdHkoKSBjb25zdCB7CisgIHN0ZDo6bG9ja19ndWFyZDxzdGQ6Om11dGV4PiBMb2NrKFBvb2xNdXRleCk7CisgIHJldHVybiBQb29sLmVtcHR5KCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvcmMKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNfU1lNQk9MU1RSSU5HUE9PTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmNNQ0pJVFJlcGxhY2VtZW50LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9PcmNNQ0pJVFJlcGxhY2VtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNkNTY0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL09yY01DSklUUmVwbGFjZW1lbnQuaApAQCAtMCwwICsxLDM4IEBACisvLz09PS0tLS0gT3JjTUNKSVRSZXBsYWNlbWVudC5oIC0gT3JjLWJhc2VkIE1DSklUIHJlcGxhY2VtZW50IC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBmb3JjZXMgT3JjTUNKSVRSZXBsYWNlbWVudCB0byBsaW5rIGluIG9uIGNlcnRhaW4gb3BlcmF0aW5nIHN5c3RlbXMuCisvLyAoV2luZG93cykuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0VYRUNVVElPTkVOR0lORV9PUkNNQ0pJVFJFUExBQ0VNRU5UX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfT1JDTUNKSVRSRVBMQUNFTUVOVF9ICisKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9FeGVjdXRpb25FbmdpbmUuaCIKKyNpbmNsdWRlIDxjc3RkbGliPgorCitleHRlcm4gIkMiIHZvaWQgTExWTUxpbmtJbk9yY01DSklUUmVwbGFjZW1lbnQoKTsKKworbmFtZXNwYWNlIHsKKyAgc3RydWN0IEZvcmNlT3JjTUNKSVRSZXBsYWNlbWVudExpbmtpbmcgeworICAgIEZvcmNlT3JjTUNKSVRSZXBsYWNlbWVudExpbmtpbmcoKSB7CisgICAgICAvLyBXZSBtdXN0IHJlZmVyZW5jZSBPcmNNQ0pJVFJlcGxhY2VtZW50IGluIHN1Y2ggYSB3YXkgdGhhdCBjb21waWxlcnMgd2lsbAorICAgICAgLy8gbm90IGRlbGV0ZSBpdCBhbGwgYXMgZGVhZCBjb2RlLCBldmVuIHdpdGggd2hvbGUgcHJvZ3JhbSBvcHRpbWl6YXRpb24sCisgICAgICAvLyB5ZXQgaXMgZWZmZWN0aXZlbHkgYSBOTy1PUC4gQXMgdGhlIGNvbXBpbGVyIGlzbid0IHNtYXJ0IGVub3VnaCB0byBrbm93CisgICAgICAvLyB0aGF0IGdldGVudigpIG5ldmVyIHJldHVybnMgLTEsIHRoaXMgd2lsbCBkbyB0aGUgam9iLgorICAgICAgaWYgKHN0ZDo6Z2V0ZW52KCJiYXIiKSAhPSAoY2hhciopIC0xKQorICAgICAgICByZXR1cm47CisKKyAgICAgIExMVk1MaW5rSW5PcmNNQ0pJVFJlcGxhY2VtZW50KCk7CisgICAgfQorICB9IEZvcmNlT3JjTUNKSVRSZXBsYWNlbWVudExpbmtpbmc7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvUlREeWxkTWVtb3J5TWFuYWdlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvUlREeWxkTWVtb3J5TWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNzUyMDIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9SVER5bGRNZW1vcnlNYW5hZ2VyLmgKQEAgLTAsMCArMSwxNTMgQEAKKy8vPT09LS0gUlREeWxkTWVtb3J5TWFuYWdlci5jcHAgLSBNZW1vcnkgbWFuYWdlciBmb3IgTUMtSklUIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gSW50ZXJmYWNlIG9mIHRoZSBydW50aW1lIGR5bmFtaWMgbWVtb3J5IG1hbmFnZXIgYmFzZSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX1JURFlMRE1FTU9SWU1BTkFHRVJfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9SVERZTERNRU1PUllNQU5BR0VSX0gKKworI2luY2x1ZGUgImxsdm0tYy9FeGVjdXRpb25FbmdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9KSVRTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9SdW50aW1lRHlsZC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DQmluZGluZ1dyYXBwaW5nLmgiCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBFeGVjdXRpb25FbmdpbmU7CisKK25hbWVzcGFjZSBvYmplY3QgeworICBjbGFzcyBPYmplY3RGaWxlOworfSAvLyBlbmQgbmFtZXNwYWNlIG9iamVjdAorCitjbGFzcyBNQ0pJVE1lbW9yeU1hbmFnZXIgOiBwdWJsaWMgUnVudGltZUR5bGQ6Ok1lbW9yeU1hbmFnZXIgeworcHVibGljOgorICAvLyBEb24ndCBoaWRlIHRoZSBub3RpZnlPYmplY3RMb2FkZWQgbWV0aG9kIGZyb20gUnVudGltZUR5bGQ6Ok1lbW9yeU1hbmFnZXIuCisgIHVzaW5nIFJ1bnRpbWVEeWxkOjpNZW1vcnlNYW5hZ2VyOjpub3RpZnlPYmplY3RMb2FkZWQ7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhbiBvYmplY3QgaGFzIGJlZW4gbG9hZGVkIGludG8gbWVtb3J5IGJ1dAorICAvLy8gYmVmb3JlIHJlbG9jYXRpb25zIGFyZSBhcHBsaWVkIHRvIHRoZSBsb2FkZWQgc2VjdGlvbnMuICBUaGUgb2JqZWN0IGxvYWQKKyAgLy8vIG1heSBoYXZlIGJlZW4gaW5pdGlhdGVkIGJ5IE1DSklUIHRvIHJlc29sdmUgYW4gZXh0ZXJuYWwgc3ltYm9sIGZvciBhbm90aGVyCisgIC8vLyBvYmplY3QgdGhhdCBpcyBiZWluZyBmaW5hbGl6ZWQuICBJbiB0aGF0IGNhc2UsIHRoZSBvYmplY3QgYWJvdXQgd2hpY2gKKyAgLy8vIHRoZSBtZW1vcnkgbWFuYWdlciBpcyBiZWluZyBub3RpZmllZCB3aWxsIGJlIGZpbmFsaXplZCBpbW1lZGlhdGVseSBhZnRlcgorICAvLy8gdGhlIG1lbW9yeSBtYW5hZ2VyIHJldHVybnMgZnJvbSB0aGlzIGNhbGwuCisgIC8vLworICAvLy8gTWVtb3J5IG1hbmFnZXJzIHdoaWNoIGFyZSBwcmVwYXJpbmcgY29kZSBmb3IgZXhlY3V0aW9uIGluIGFuIGV4dGVybmFsCisgIC8vLyBhZGRyZXNzIHNwYWNlIGNhbiB1c2UgdGhpcyBjYWxsIHRvIHJlbWFwIHRoZSBzZWN0aW9uIGFkZHJlc3NlcyBmb3IgdGhlCisgIC8vLyBuZXdseSBsb2FkZWQgb2JqZWN0LgorICB2aXJ0dWFsIHZvaWQgbm90aWZ5T2JqZWN0TG9hZGVkKEV4ZWN1dGlvbkVuZ2luZSAqRUUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgb2JqZWN0OjpPYmplY3RGaWxlICYpIHt9Cit9OworCisvLyBSdW50aW1lRHlsZCBjbGllbnRzIG9mdGVuIHdhbnQgdG8gaGFuZGxlIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBvZgorLy8gd2hhdCBnZXRzIHBsYWNlZCB3aGVyZS4gRm9yIEpJVCBjbGllbnRzLCB0aGlzIGlzIHRoZSBzdWJzZXQgb2YKKy8vIEpJVE1lbW9yeU1hbmFnZXIgcmVxdWlyZWQgZm9yIGR5bmFtaWMgbG9hZGluZyBvZiBiaW5hcmllcy4KKy8vCisvLyBGSVhNRTogQXMgdGhlIFJ1bnRpbWVEeWxkIGZpbGxzIG91dCwgYWRkaXRpb25hbCByb3V0aW5lcyB3aWxsIGJlIG5lZWRlZAorLy8gICAgICAgIGZvciB0aGUgdmFyeWluZyB0eXBlcyBvZiBvYmplY3RzIHRvIGJlIGFsbG9jYXRlZC4KK2NsYXNzIFJURHlsZE1lbW9yeU1hbmFnZXIgOiBwdWJsaWMgTUNKSVRNZW1vcnlNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBMZWdhY3lKSVRTeW1ib2xSZXNvbHZlciB7CitwdWJsaWM6CisgIFJURHlsZE1lbW9yeU1hbmFnZXIoKSA9IGRlZmF1bHQ7CisgIFJURHlsZE1lbW9yeU1hbmFnZXIoY29uc3QgUlREeWxkTWVtb3J5TWFuYWdlciYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBSVER5bGRNZW1vcnlNYW5hZ2VyJikgPSBkZWxldGU7CisgIH5SVER5bGRNZW1vcnlNYW5hZ2VyKCkgb3ZlcnJpZGU7CisKKyAgLy8vIFJlZ2lzdGVyIEVIIGZyYW1lcyBpbiB0aGUgY3VycmVudCBwcm9jZXNzLgorICBzdGF0aWMgdm9pZCByZWdpc3RlckVIRnJhbWVzSW5Qcm9jZXNzKHVpbnQ4X3QgKkFkZHIsIHNpemVfdCBTaXplKTsKKworICAvLy8gRGVyZWdpc3RlciBFSCBmcmFtZXMgaW4gdGhlIGN1cnJlbnQgcHJvY2VzLgorICBzdGF0aWMgdm9pZCBkZXJlZ2lzdGVyRUhGcmFtZXNJblByb2Nlc3ModWludDhfdCAqQWRkciwgc2l6ZV90IFNpemUpOworCisgIHZvaWQgcmVnaXN0ZXJFSEZyYW1lcyh1aW50OF90ICpBZGRyLCB1aW50NjRfdCBMb2FkQWRkciwgc2l6ZV90IFNpemUpIG92ZXJyaWRlOworICB2b2lkIGRlcmVnaXN0ZXJFSEZyYW1lcygpIG92ZXJyaWRlOworCisgIC8vLyBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gb3IgdmFyaWFibGUgaW4KKyAgLy8vIHRoZSBjdXJyZW50IHByb2Nlc3MuCisgIHN0YXRpYyB1aW50NjRfdCBnZXRTeW1ib2xBZGRyZXNzSW5Qcm9jZXNzKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKTsKKworICAvLy8gTGVnYWN5IHN5bWJvbCBsb29rdXAgLSBERVBSRUNBVEVEISBQbGVhc2Ugb3ZlcnJpZGUgZmluZFN5bWJvbCBpbnN0ZWFkLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBvciB2YXJpYWJsZS4KKyAgLy8vIEl0IGlzIHVzZWQgdG8gcmVzb2x2ZSBzeW1ib2xzIGR1cmluZyBtb2R1bGUgbGlua2luZy4KKyAgdmlydHVhbCB1aW50NjRfdCBnZXRTeW1ib2xBZGRyZXNzKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSB7CisgICAgcmV0dXJuIGdldFN5bWJvbEFkZHJlc3NJblByb2Nlc3MoTmFtZSk7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgcmV0dXJucyBhIFJ1bnRpbWVEeWxkOjpTeW1ib2xJbmZvIGZvciB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uCisgIC8vLyBvciB2YXJpYWJsZS4gSXQgaXMgdXNlZCB0byByZXNvbHZlIHN5bWJvbHMgZHVyaW5nIG1vZHVsZSBsaW5raW5nLgorICAvLy8KKyAgLy8vIEJ5IGRlZmF1bHQgdGhpcyBmYWxscyBiYWNrIG9uIHRoZSBsZWdhY3kgbG9va3VwIG1ldGhvZDoKKyAgLy8vICdnZXRTeW1ib2xBZGRyZXNzJy4gVGhlIGFkZHJlc3MgcmV0dXJuZWQgYnkgZ2V0U3ltYm9sQWRkcmVzcyBpcyB0cmVhdGVkIGFzCisgIC8vLyBhIHN0cm9uZywgZXhwb3J0ZWQgc3ltYm9sLCBjb25zaXN0ZW50IHdpdGggaGlzdG9yaWNhbCB0cmVhdG1lbnQgYnkKKyAgLy8vIFJ1bnRpbWVEeWxkLgorICAvLy8KKyAgLy8vIENsaWVudHMgd3JpdGluZyBjdXN0b20gUlREeWxkTWVtb3J5TWFuYWdlcnMgYXJlIGVuY291cmFnZWQgdG8gb3ZlcnJpZGUKKyAgLy8vIHRoaXMgbWV0aG9kIGFuZCByZXR1cm4gYSBTeW1ib2xJbmZvIHdpdGggdGhlIGZsYWdzIHNldCBjb3JyZWN0bHkuIFRoaXMgaXMKKyAgLy8vIG5lY2Vzc2FyeSBmb3IgUnVudGltZUR5bGQgdG8gY29ycmVjdGx5IGhhbmRsZSB3ZWFrIGFuZCBub24tZXhwb3J0ZWQgc3ltYm9scy4KKyAgSklUU3ltYm9sIGZpbmRTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSklUU3ltYm9sKGdldFN5bWJvbEFkZHJlc3MoTmFtZSksIEpJVFN5bWJvbEZsYWdzOjpFeHBvcnRlZCk7CisgIH0KKworICAvLy8gTGVnYWN5IHN5bWJvbCBsb29rdXAgLS0gREVQUkVDQVRFRCEgUGxlYXNlIG92ZXJyaWRlCisgIC8vLyBmaW5kU3ltYm9sSW5Mb2dpY2FsRHlsaWIgaW5zdGVhZC4KKyAgLy8vCisgIC8vLyBEZWZhdWx0IHRvIHRyZWF0aW5nIGFsbCBtb2R1bGVzIGFzIHNlcGFyYXRlLgorICB2aXJ0dWFsIHVpbnQ2NF90IGdldFN5bWJvbEFkZHJlc3NJbkxvZ2ljYWxEeWxpYihjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgeworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIERlZmF1bHQgdG8gdHJlYXRpbmcgYWxsIG1vZHVsZXMgYXMgc2VwYXJhdGUuCisgIC8vLworICAvLy8gQnkgZGVmYXVsdCB0aGlzIGZhbGxzIGJhY2sgb24gdGhlIGxlZ2FjeSBsb29rdXAgbWV0aG9kOgorICAvLy8gJ2dldFN5bWJvbEFkZHJlc3NJbkxvZ2ljYWxEeWxpYicuIFRoZSBhZGRyZXNzIHJldHVybmVkIGJ5CisgIC8vLyBnZXRTeW1ib2xBZGRyZXNzSW5Mb2dpY2FsRHlsaWIgaXMgdHJlYXRlZCBhcyBhIHN0cm9uZywgZXhwb3J0ZWQgc3ltYm9sLAorICAvLy8gY29uc2lzdGVudCB3aXRoIGhpc3RvcmljYWwgdHJlYXRtZW50IGJ5IFJ1bnRpbWVEeWxkLgorICAvLy8KKyAgLy8vIENsaWVudHMgd3JpdGluZyBjdXN0b20gUlREeWxkTWVtb3J5TWFuYWdlcnMgYXJlIGVuY291cmFnZWQgdG8gb3ZlcnJpZGUKKyAgLy8vIHRoaXMgbWV0aG9kIGFuZCByZXR1cm4gYSBTeW1ib2xJbmZvIHdpdGggdGhlIGZsYWdzIHNldCBjb3JyZWN0bHkuIFRoaXMgaXMKKyAgLy8vIG5lY2Vzc2FyeSBmb3IgUnVudGltZUR5bGQgdG8gY29ycmVjdGx5IGhhbmRsZSB3ZWFrIGFuZCBub24tZXhwb3J0ZWQgc3ltYm9scy4KKyAgSklUU3ltYm9sCisgIGZpbmRTeW1ib2xJbkxvZ2ljYWxEeWxpYihjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSkgb3ZlcnJpZGUgeworICAgIHJldHVybiBKSVRTeW1ib2woZ2V0U3ltYm9sQWRkcmVzc0luTG9naWNhbER5bGliKE5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBKSVRTeW1ib2xGbGFnczo6RXhwb3J0ZWQpOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNwZWNpZmllZCBmdW5jdGlvbi4gQXMgc3VjaCBpdCBpcworICAvLy8gb25seSB1c2VmdWwgZm9yIHJlc29sdmluZyBsaWJyYXJ5IHN5bWJvbHMsIG5vdCBjb2RlIGdlbmVyYXRlZCBzeW1ib2xzLgorICAvLy8KKyAgLy8vIElmIFxwIEFib3J0T25GYWlsdXJlIGlzIGZhbHNlIGFuZCBubyBmdW5jdGlvbiB3aXRoIHRoZSBnaXZlbiBuYW1lIGlzCisgIC8vLyBmb3VuZCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbnVsbCBwb2ludGVyLiBPdGhlcndpc2UsIGl0IHByaW50cyBhCisgIC8vLyBtZXNzYWdlIHRvIHN0ZGVyciBhbmQgYWJvcnRzLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gaXMgZGVwcmVjYXRlZCBmb3IgbWVtb3J5IG1hbmFnZXJzIHRvIGJlIHVzZWQgd2l0aAorICAvLy8gTUNKSVQgb3IgUnVudGltZUR5bGQuICBVc2UgZ2V0U3ltYm9sQWRkcmVzcyBpbnN0ZWFkLgorICB2aXJ0dWFsIHZvaWQgKmdldFBvaW50ZXJUb05hbWVkRnVuY3Rpb24oY29uc3Qgc3RkOjpzdHJpbmcgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFib3J0T25GYWlsdXJlID0gdHJ1ZSk7CisKK3Byb3RlY3RlZDoKKyAgc3RydWN0IEVIRnJhbWUgeworICAgIHVpbnQ4X3QgKkFkZHI7CisgICAgc2l6ZV90IFNpemU7CisgIH07CisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8RUhGcmFtZT4gRUhGcmFtZUluZm9zOworICBFSEZyYW1lSW5mb3MgRUhGcmFtZXM7Cit9OworCisvLyBDcmVhdGUgd3JhcHBlcnMgZm9yIEMgQmluZGluZyB0eXBlcyAoc2VlIENCaW5kaW5nV3JhcHBpbmcuaCkuCitERUZJTkVfU0lNUExFX0NPTlZFUlNJT05fRlVOQ1RJT05TKAorICAgIFJURHlsZE1lbW9yeU1hbmFnZXIsIExMVk1NQ0pJVE1lbW9yeU1hbmFnZXJSZWYpCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0VYRUNVVElPTkVOR0lORV9SVERZTERNRU1PUllNQU5BR0VSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL1J1bnRpbWVEeWxkLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9SdW50aW1lRHlsZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0ZGE1YWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9SdW50aW1lRHlsZC5oCkBAIC0wLDAgKzEsMjY0IEBACisvLz09PS0gUnVudGltZUR5bGQuaCAtIFJ1bi10aW1lIGR5bmFtaWMgbGlua2VyIGZvciBNQy1KSVQgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEludGVyZmFjZSBmb3IgdGhlIHJ1bnRpbWUgZHluYW1pYyBsaW5rZXIgZmFjaWxpdGllcyBvZiB0aGUgTUMtSklULgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfUlVOVElNRURZTERfSAorI2RlZmluZSBMTFZNX0VYRUNVVElPTkVOR0lORV9SVU5USU1FRFlMRF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9ESUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9KSVRTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9PYmplY3RGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2Ugb2JqZWN0IHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIE93bmluZ0JpbmFyeTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9iamVjdAorCisvLy8gQmFzZSBjbGFzcyBmb3IgZXJyb3JzIG9yaWdpbmF0aW5nIGluIFJ1bnRpbWVEeWxkLCBlLmcuIG1pc3NpbmcgcmVsb2NhdGlvbgorLy8vIHN1cHBvcnQuCitjbGFzcyBSdW50aW1lRHlsZEVycm9yIDogcHVibGljIEVycm9ySW5mbzxSdW50aW1lRHlsZEVycm9yPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIFJ1bnRpbWVEeWxkRXJyb3Ioc3RkOjpzdHJpbmcgRXJyTXNnKSA6IEVyck1zZyhzdGQ6Om1vdmUoRXJyTXNnKSkge30KKworICB2b2lkIGxvZyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOworICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0RXJyb3JNZXNzYWdlKCkgY29uc3QgeyByZXR1cm4gRXJyTXNnOyB9CisgIHN0ZDo6ZXJyb3JfY29kZSBjb252ZXJ0VG9FcnJvckNvZGUoKSBjb25zdCBvdmVycmlkZTsKKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgRXJyTXNnOworfTsKKworY2xhc3MgUnVudGltZUR5bGRDaGVja2VySW1wbDsKK2NsYXNzIFJ1bnRpbWVEeWxkSW1wbDsKKworY2xhc3MgUnVudGltZUR5bGQgeworICBmcmllbmQgY2xhc3MgUnVudGltZUR5bGRDaGVja2VySW1wbDsKKworcHJvdGVjdGVkOgorICAvLyBDaGFuZ2UgdGhlIGFkZHJlc3MgYXNzb2NpYXRlZCB3aXRoIGEgc2VjdGlvbiB3aGVuIHJlc29sdmluZyByZWxvY2F0aW9ucy4KKyAgLy8gQW55IHJlbG9jYXRpb25zIGFscmVhZHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBzeW1ib2wgd2lsbCBiZSByZS1yZXNvbHZlZC4KKyAgdm9pZCByZWFzc2lnblNlY3Rpb25BZGRyZXNzKHVuc2lnbmVkIFNlY3Rpb25JRCwgdWludDY0X3QgQWRkcik7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgbG9hZGVkIG9iamVjdC4KKyAgY2xhc3MgTG9hZGVkT2JqZWN0SW5mbyA6IHB1YmxpYyBsbHZtOjpMb2FkZWRPYmplY3RJbmZvIHsKKyAgICBmcmllbmQgY2xhc3MgUnVudGltZUR5bGRJbXBsOworCisgIHB1YmxpYzoKKyAgICB1c2luZyBPYmpTZWN0aW9uVG9JRE1hcCA9IHN0ZDo6bWFwPG9iamVjdDo6U2VjdGlvblJlZiwgdW5zaWduZWQ+OworCisgICAgTG9hZGVkT2JqZWN0SW5mbyhSdW50aW1lRHlsZEltcGwgJlJURHlsZCwgT2JqU2VjdGlvblRvSURNYXAgT2JqU2VjVG9JRE1hcCkKKyAgICAgICAgOiBSVER5bGQoUlREeWxkKSwgT2JqU2VjVG9JRE1hcChzdGQ6Om1vdmUoT2JqU2VjVG9JRE1hcCkpIHt9CisKKyAgICB2aXJ0dWFsIG9iamVjdDo6T3duaW5nQmluYXJ5PG9iamVjdDo6T2JqZWN0RmlsZT4KKyAgICBnZXRPYmplY3RGb3JEZWJ1Zyhjb25zdCBvYmplY3Q6Ok9iamVjdEZpbGUgJk9iaikgY29uc3QgPSAwOworCisgICAgdWludDY0X3QKKyAgICBnZXRTZWN0aW9uTG9hZEFkZHJlc3MoY29uc3Qgb2JqZWN0OjpTZWN0aW9uUmVmICZTZWMpIGNvbnN0IG92ZXJyaWRlOworCisgIHByb3RlY3RlZDoKKyAgICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKKyAgICBSdW50aW1lRHlsZEltcGwgJlJURHlsZDsKKyAgICBPYmpTZWN0aW9uVG9JRE1hcCBPYmpTZWNUb0lETWFwOworICB9OworCisgIC8vLyBcYnJpZWYgTWVtb3J5IE1hbmFnZW1lbnQuCisgIGNsYXNzIE1lbW9yeU1hbmFnZXIgeworICAgIGZyaWVuZCBjbGFzcyBSdW50aW1lRHlsZDsKKworICBwdWJsaWM6CisgICAgTWVtb3J5TWFuYWdlcigpID0gZGVmYXVsdDsKKyAgICB2aXJ0dWFsIH5NZW1vcnlNYW5hZ2VyKCkgPSBkZWZhdWx0OworCisgICAgLy8vIEFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIG9mIChhdCBsZWFzdCkgdGhlIGdpdmVuIHNpemUgc3VpdGFibGUgZm9yCisgICAgLy8vIGV4ZWN1dGFibGUgY29kZS4gVGhlIFNlY3Rpb25JRCBpcyBhIHVuaXF1ZSBpZGVudGlmaWVyIGFzc2lnbmVkIGJ5IHRoZQorICAgIC8vLyBSdW50aW1lRHlsZCBpbnN0YW5jZSwgYW5kIG9wdGlvbmFsbHkgcmVjb3JkZWQgYnkgdGhlIG1lbW9yeSBtYW5hZ2VyIHRvCisgICAgLy8vIGFjY2VzcyBhIGxvYWRlZCBzZWN0aW9uLgorICAgIHZpcnR1YWwgdWludDhfdCAqYWxsb2NhdGVDb2RlU2VjdGlvbih1aW50cHRyX3QgU2l6ZSwgdW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTZWN0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTZWN0aW9uTmFtZSkgPSAwOworCisgICAgLy8vIEFsbG9jYXRlIGEgbWVtb3J5IGJsb2NrIG9mIChhdCBsZWFzdCkgdGhlIGdpdmVuIHNpemUgc3VpdGFibGUgZm9yIGRhdGEuCisgICAgLy8vIFRoZSBTZWN0aW9uSUQgaXMgYSB1bmlxdWUgaWRlbnRpZmllciBhc3NpZ25lZCBieSB0aGUgSklUIGVuZ2luZSwgYW5kCisgICAgLy8vIG9wdGlvbmFsbHkgcmVjb3JkZWQgYnkgdGhlIG1lbW9yeSBtYW5hZ2VyIHRvIGFjY2VzcyBhIGxvYWRlZCBzZWN0aW9uLgorICAgIHZpcnR1YWwgdWludDhfdCAqYWxsb2NhdGVEYXRhU2VjdGlvbih1aW50cHRyX3QgU2l6ZSwgdW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTZWN0aW9uSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTZWN0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1JlYWRPbmx5KSA9IDA7CisKKyAgICAvLy8gSW5mb3JtIHRoZSBtZW1vcnkgbWFuYWdlciBhYm91dCB0aGUgdG90YWwgYW1vdW50IG9mIG1lbW9yeSByZXF1aXJlZCB0bworICAgIC8vLyBhbGxvY2F0ZSBhbGwgc2VjdGlvbnMgdG8gYmUgbG9hZGVkOgorICAgIC8vLyBccCBDb2RlU2l6ZSAtIHRoZSB0b3RhbCBzaXplIG9mIGFsbCBjb2RlIHNlY3Rpb25zCisgICAgLy8vIFxwIERhdGFTaXplUk8gLSB0aGUgdG90YWwgc2l6ZSBvZiBhbGwgcmVhZC1vbmx5IGRhdGEgc2VjdGlvbnMKKyAgICAvLy8gXHAgRGF0YVNpemVSVyAtIHRoZSB0b3RhbCBzaXplIG9mIGFsbCByZWFkLXdyaXRlIGRhdGEgc2VjdGlvbnMKKyAgICAvLy8KKyAgICAvLy8gTm90ZSB0aGF0IGJ5IGRlZmF1bHQgdGhlIGNhbGxiYWNrIGlzIGRpc2FibGVkLiBUbyBlbmFibGUgaXQKKyAgICAvLy8gcmVkZWZpbmUgdGhlIG1ldGhvZCBuZWVkc1RvUmVzZXJ2ZUFsbG9jYXRpb25TcGFjZSB0byByZXR1cm4gdHJ1ZS4KKyAgICB2aXJ0dWFsIHZvaWQgcmVzZXJ2ZUFsbG9jYXRpb25TcGFjZSh1aW50cHRyX3QgQ29kZVNpemUsIHVpbnQzMl90IENvZGVBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgUk9EYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBST0RhdGFBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3QgUldEYXRhU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBSV0RhdGFBbGlnbikge30KKworICAgIC8vLyBPdmVycmlkZSB0byByZXR1cm4gdHJ1ZSB0byBlbmFibGUgdGhlIHJlc2VydmVBbGxvY2F0aW9uU3BhY2UgY2FsbGJhY2suCisgICAgdmlydHVhbCBib29sIG5lZWRzVG9SZXNlcnZlQWxsb2NhdGlvblNwYWNlKCkgeyByZXR1cm4gZmFsc2U7IH0KKworICAgIC8vLyBSZWdpc3RlciB0aGUgRUggZnJhbWVzIHdpdGggdGhlIHJ1bnRpbWUgc28gdGhhdCBjKysgZXhjZXB0aW9ucyB3b3JrLgorICAgIC8vLworICAgIC8vLyBccCBBZGRyIHBhcmFtZXRlciBwcm92aWRlcyB0aGUgbG9jYWwgYWRkcmVzcyBvZiB0aGUgRUggZnJhbWUgc2VjdGlvbgorICAgIC8vLyBkYXRhLCB3aGlsZSBccCBMb2FkQWRkciBwcm92aWRlcyB0aGUgYWRkcmVzcyBvZiB0aGUgZGF0YSBpbiB0aGUgdGFyZ2V0CisgICAgLy8vIGFkZHJlc3Mgc3BhY2UuICBJZiB0aGUgc2VjdGlvbiBoYXMgbm90IGJlZW4gcmVtYXBwZWQgKHdoaWNoIHdpbGwgdXN1YWxseQorICAgIC8vLyBiZSB0aGUgY2FzZSBmb3IgbG9jYWwgZXhlY3V0aW9uKSB0aGVzZSB0d28gdmFsdWVzIHdpbGwgYmUgdGhlIHNhbWUuCisgICAgdmlydHVhbCB2b2lkIHJlZ2lzdGVyRUhGcmFtZXModWludDhfdCAqQWRkciwgdWludDY0X3QgTG9hZEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IFNpemUpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgZGVyZWdpc3RlckVIRnJhbWVzKCkgPSAwOworCisgICAgLy8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCB3aGVuIG9iamVjdCBsb2FkaW5nIGlzIGNvbXBsZXRlIGFuZCBzZWN0aW9uIHBhZ2UKKyAgICAvLy8gcGVybWlzc2lvbnMgY2FuIGJlIGFwcGxpZWQuICBJdCBpcyB1cCB0byB0aGUgbWVtb3J5IG1hbmFnZXIgaW1wbGVtZW50YXRpb24KKyAgICAvLy8gdG8gZGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvIGFjdCBvbiB0aGlzIG1ldGhvZC4gIFRoZSBtZW1vcnkgbWFuYWdlciB3aWxsCisgICAgLy8vIHR5cGljYWxseSBhbGxvY2F0ZSBhbGwgc2VjdGlvbnMgYXMgcmVhZC13cml0ZSBhbmQgdGhlbiBhcHBseSBzcGVjaWZpYworICAgIC8vLyBwZXJtaXNzaW9ucyB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4gIENvZGUgc2VjdGlvbnMgY2Fubm90IGJlIGV4ZWN1dGVkCisgICAgLy8vIHVudGlsIHRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gY2FsbGVkLiAgSW4gYWRkaXRpb24sIGFueSBjYWNoZSBjb2hlcmVuY3kKKyAgICAvLy8gb3BlcmF0aW9ucyBuZWVkZWQgdG8gcmVsaWFibHkgdXNlIHRoZSBtZW1vcnkgYXJlIGFsc28gcGVyZm9ybWVkLgorICAgIC8vLworICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgYW4gZXJyb3Igb2NjdXJyZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgICB2aXJ0dWFsIGJvb2wgZmluYWxpemVNZW1vcnkoc3RkOjpzdHJpbmcgKkVyck1zZyA9IG51bGxwdHIpID0gMDsKKworICAgIC8vLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgYWZ0ZXIgYW4gb2JqZWN0IGhhcyBiZWVuIGxvYWRlZCBpbnRvIG1lbW9yeSBidXQKKyAgICAvLy8gYmVmb3JlIHJlbG9jYXRpb25zIGFyZSBhcHBsaWVkIHRvIHRoZSBsb2FkZWQgc2VjdGlvbnMuCisgICAgLy8vCisgICAgLy8vIE1lbW9yeSBtYW5hZ2VycyB3aGljaCBhcmUgcHJlcGFyaW5nIGNvZGUgZm9yIGV4ZWN1dGlvbiBpbiBhbiBleHRlcm5hbAorICAgIC8vLyBhZGRyZXNzIHNwYWNlIGNhbiB1c2UgdGhpcyBjYWxsIHRvIHJlbWFwIHRoZSBzZWN0aW9uIGFkZHJlc3NlcyBmb3IgdGhlCisgICAgLy8vIG5ld2x5IGxvYWRlZCBvYmplY3QuCisgICAgLy8vCisgICAgLy8vIEZvciBjbGllbnRzIHRoYXQgZG8gbm90IG5lZWQgYWNjZXNzIHRvIGFuIEV4ZWN1dGlvbkVuZ2luZSBpbnN0YW5jZSB0aGlzCisgICAgLy8vIG1ldGhvZCBzaG91bGQgYmUgcHJlZmVycmVkIHRvIGl0cyBjb3VzaW4KKyAgICAvLy8gTUNKSVRNZW1vcnlNYW5hZ2VyOjpub3RpZnlPYmplY3RMb2FkZWQgYXMgdGhpcyBtZXRob2QgaXMgY29tcGF0aWJsZSB3aXRoCisgICAgLy8vIE9SQyBKSVQgc3RhY2tzLgorICAgIHZpcnR1YWwgdm9pZCBub3RpZnlPYmplY3RMb2FkZWQoUnVudGltZUR5bGQgJlJURHlsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG9iamVjdDo6T2JqZWN0RmlsZSAmT2JqKSB7fQorCisgIHByaXZhdGU6CisgICAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCisgICAgYm9vbCBGaW5hbGl6YXRpb25Mb2NrZWQgPSBmYWxzZTsKKyAgfTsKKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIFJ1bnRpbWVEeWxkIGluc3RhbmNlLgorICBSdW50aW1lRHlsZChNZW1vcnlNYW5hZ2VyICZNZW1NZ3IsIEpJVFN5bWJvbFJlc29sdmVyICZSZXNvbHZlcik7CisgIFJ1bnRpbWVEeWxkKGNvbnN0IFJ1bnRpbWVEeWxkICYpID0gZGVsZXRlOworICBSdW50aW1lRHlsZCAmb3BlcmF0b3I9KGNvbnN0IFJ1bnRpbWVEeWxkICYpID0gZGVsZXRlOworICB+UnVudGltZUR5bGQoKTsKKworICAvLy8gQWRkIHRoZSByZWZlcmVuY2VkIG9iamVjdCBmaWxlIHRvIHRoZSBsaXN0IG9mIG9iamVjdHMgdG8gYmUgbG9hZGVkIGFuZAorICAvLy8gcmVsb2NhdGVkLgorICBzdGQ6OnVuaXF1ZV9wdHI8TG9hZGVkT2JqZWN0SW5mbz4gbG9hZE9iamVjdChjb25zdCBvYmplY3Q6Ok9iamVjdEZpbGUgJk8pOworCisgIC8vLyBHZXQgdGhlIGFkZHJlc3Mgb2Ygb3VyIGxvY2FsIGNvcHkgb2YgdGhlIHN5bWJvbC4gVGhpcyBtYXkgb3IgbWF5IG5vdAorICAvLy8gYmUgdGhlIGFkZHJlc3MgdXNlZCBmb3IgcmVsb2NhdGlvbiAoY2xpZW50cyBjYW4gY29weSB0aGUgZGF0YSBhcm91bmQKKyAgLy8vIGFuZCByZXNvbHZlIHJlbG9jYXRvbnMgYmFzZWQgb24gd2hlcmUgdGhleSBwdXQgaXQpLgorICB2b2lkICpnZXRTeW1ib2xMb2NhbEFkZHJlc3MoU3RyaW5nUmVmIE5hbWUpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIHRhcmdldCBhZGRyZXNzIGFuZCBmbGFncyBmb3IgdGhlIG5hbWVkIHN5bWJvbC4KKyAgLy8vIFRoaXMgYWRkcmVzcyBpcyB0aGUgb25lIHVzZWQgZm9yIHJlbG9jYXRpb24uCisgIEpJVEV2YWx1YXRlZFN5bWJvbCBnZXRTeW1ib2woU3RyaW5nUmVmIE5hbWUpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIGEgY29weSBvZiB0aGUgc3ltYm9sIHRhYmxlLiBUaGlzIGNhbiBiZSB1c2VkIGJ5IG9uLWZpbmFsaXplZAorICAvLy8gY2FsbGJhY2tzIHRvIGV4dHJhY3QgdGhlIHN5bWJvbCB0YWJsZSBiZWZvcmUgdGhyb3dpbmcgYXdheSB0aGUKKyAgLy8vIFJ1bnRpbWVEeWxkIGluc3RhbmNlLiBCZWNhdXNlIHRoZSBtYXAga2V5cyAoU3RyaW5nUmVmcykgYXJlIGJhY2tlZCBieQorICAvLy8gc3RyaW5ncyBpbnNpZGUgdGhlIFJ1bnRpbWVEeWxkIGluc3RhbmNlLCB0aGUgbWFwIHNob3VsZCBiZSBwcm9jZXNzZWQKKyAgLy8vIGJlZm9yZSB0aGUgUnVudGltZUR5bGQgaW5zdGFuY2UgaXMgZGlzY2FyZGVkLgorICBzdGQ6Om1hcDxTdHJpbmdSZWYsIEpJVEV2YWx1YXRlZFN5bWJvbD4gZ2V0U3ltYm9sVGFibGUoKSBjb25zdDsKKworICAvLy8gUmVzb2x2ZSB0aGUgcmVsb2NhdGlvbnMgZm9yIGFsbCBzeW1ib2xzIHdlIGN1cnJlbnRseSBrbm93IGFib3V0LgorICB2b2lkIHJlc29sdmVSZWxvY2F0aW9ucygpOworCisgIC8vLyBNYXAgYSBzZWN0aW9uIHRvIGl0cyB0YXJnZXQgYWRkcmVzcyBzcGFjZSB2YWx1ZS4KKyAgLy8vIE1hcCB0aGUgYWRkcmVzcyBvZiBhIEpJVCBzZWN0aW9uIGFzIHJldHVybmVkIGZyb20gdGhlIG1lbW9yeSBtYW5hZ2VyCisgIC8vLyB0byB0aGUgYWRkcmVzcyBpbiB0aGUgdGFyZ2V0IHByb2Nlc3MgYXMgdGhlIHJ1bm5pbmcgY29kZSB3aWxsIHNlZSBpdC4KKyAgLy8vIFRoaXMgaXMgdGhlIGFkZHJlc3Mgd2hpY2ggd2lsbCBiZSB1c2VkIGZvciByZWxvY2F0aW9uIHJlc29sdXRpb24uCisgIHZvaWQgbWFwU2VjdGlvbkFkZHJlc3MoY29uc3Qgdm9pZCAqTG9jYWxBZGRyZXNzLCB1aW50NjRfdCBUYXJnZXRBZGRyZXNzKTsKKworICAvLy8gUmVnaXN0ZXIgYW55IEVIIGZyYW1lIHNlY3Rpb25zIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBidXQgbm90IHByZXZpb3VzbHkKKyAgLy8vIHJlZ2lzdGVyZWQgd2l0aCB0aGUgbWVtb3J5IG1hbmFnZXIuICBOb3RlLCBSdW50aW1lRHlsZCBpcyByZXNwb25zaWJsZQorICAvLy8gZm9yIGlkZW50aWZ5aW5nIHRoZSBFSCBmcmFtZSBhbmQgY2FsbGluZyB0aGUgbWVtb3J5IG1hbmFnZXIgd2l0aCB0aGUKKyAgLy8vIEVIIGZyYW1lIHNlY3Rpb24gZGF0YS4gIEhvd2V2ZXIsIHRoZSBtZW1vcnkgbWFuYWdlciBpdHNlbGYgd2lsbCBoYW5kbGUKKyAgLy8vIHRoZSBhY3R1YWwgdGFyZ2V0LXNwZWNpZmljIEVIIGZyYW1lIHJlZ2lzdHJhdGlvbi4KKyAgdm9pZCByZWdpc3RlckVIRnJhbWVzKCk7CisKKyAgdm9pZCBkZXJlZ2lzdGVyRUhGcmFtZXMoKTsKKworICBib29sIGhhc0Vycm9yKCk7CisgIFN0cmluZ1JlZiBnZXRFcnJvclN0cmluZygpOworCisgIC8vLyBCeSBkZWZhdWx0LCBvbmx5IHNlY3Rpb25zIHRoYXQgYXJlICJyZXF1aXJlZCBmb3IgZXhlY3V0aW9uIiBhcmUgcGFzc2VkIHRvCisgIC8vLyB0aGUgUlREeWxkTWVtb3J5TWFuYWdlciwgYW5kIG90aGVyIHNlY3Rpb25zIGFyZSBkaXNjYXJkZWQuIFBhc3NpbmcgJ3RydWUnCisgIC8vLyB0byB0aGlzIG1ldGhvZCB3aWxsIGNhdXNlIFJ1bnRpbWVEeWxkIHRvIHBhc3MgYWxsIHNlY3Rpb25zIHRvIGl0cworICAvLy8gbWVtb3J5IG1hbmFnZXIgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgYXJlICJyZXF1aXJlZCB0byBleGVjdXRlIiBpbiB0aGUKKyAgLy8vIHVzdWFsIHNlbnNlLiBUaGlzIGlzIHVzZWZ1bCBmb3IgaW5zcGVjdGluZyBtZXRhZGF0YSBzZWN0aW9ucyB0aGF0IG1heSBub3QKKyAgLy8vIGNvbnRhaW4gcmVsb2NhdGlvbnMsIEUuZy4gRGVidWcgaW5mbywgc3RhY2ttYXBzLgorICAvLy8KKyAgLy8vIE11c3QgYmUgY2FsbGVkIGJlZm9yZSB0aGUgZmlyc3Qgb2JqZWN0IGZpbGUgaXMgbG9hZGVkLgorICB2b2lkIHNldFByb2Nlc3NBbGxTZWN0aW9ucyhib29sIFByb2Nlc3NBbGxTZWN0aW9ucykgeworICAgIGFzc2VydCghRHlsZCAmJiAic2V0UHJvY2Vzc0FsbFNlY3Rpb25zIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBsb2FkT2JqZWN0LiIpOworICAgIHRoaXMtPlByb2Nlc3NBbGxTZWN0aW9ucyA9IFByb2Nlc3NBbGxTZWN0aW9uczsKKyAgfQorCisgIC8vLyBQZXJmb3JtIGFsbCBhY3Rpb25zIG5lZWRlZCB0byBtYWtlIHRoZSBjb2RlIG93bmVkIGJ5IHRoaXMgUnVudGltZUR5bGQKKyAgLy8vIGluc3RhbmNlIGV4ZWN1dGFibGU6CisgIC8vLworICAvLy8gMSkgQXBwbHkgcmVsb2NhdGlvbnMuCisgIC8vLyAyKSBSZWdpc3RlciBFSCBmcmFtZXMuCisgIC8vLyAzKSBVcGRhdGUgbWVtb3J5IHBlcm1pc3Npb25zKi4KKyAgLy8vCisgIC8vLyAqIEZpbmFsaXphdGlvbiBpcyBwb3RlbnRpYWxseSByZWN1cnNpdmUqKiwgYW5kIHRoZSAzcmQgc3RlcCB3aWxsIG9ubHkgYmUKKyAgLy8vICAgYXBwbGllZCBieSB0aGUgb3V0ZXJtb3N0IGNhbGwgdG8gZmluYWxpemUuIFRoaXMgYWxsb3dzIGRpZmZlcmVudAorICAvLy8gICBSdW50aW1lRHlsZCBpbnN0YW5jZXMgdG8gc2hhcmUgYSBtZW1vcnkgbWFuYWdlciB3aXRob3V0IHRoZSBpbm5lcm1vc3QKKyAgLy8vICAgZmluYWxpemF0aW9uIGxvY2tpbmcgdGhlIG1lbW9yeSBhbmQgY2F1c2luZyByZWxvY2F0aW9uIGZpeHVwIGVycm9ycyBpbgorICAvLy8gICBvdXRlciBpbnN0YW5jZXMuCisgIC8vLworICAvLy8gKiogUmVjdXJzaXZlIGZpbmFsaXphdGlvbiBvY2N1cnMgd2hlbiBvbmUgUnVudGltZUR5bGQgaW5zdGFuY2VzIG5lZWRzIHRoZQorICAvLy8gICBhZGRyZXNzIG9mIGEgc3ltYm9sIG93bmVkIGJ5IHNvbWUgb3RoZXIgaW5zdGFuY2UgaW4gb3JkZXIgdG8gYXBwbHkKKyAgLy8vICAgcmVsb2NhdGlvbnMuCisgIC8vLworICB2b2lkIGZpbmFsaXplV2l0aE1lbW9yeU1hbmFnZXJMb2NraW5nKCk7CisKK3ByaXZhdGU6CisgIC8vIFJ1bnRpbWVEeWxkSW1wbCBpcyB0aGUgYWN0dWFsIGNsYXNzLiBSdW50aW1lRHlsZCBpcyBqdXN0IHRoZSBwdWJsaWMKKyAgLy8gaW50ZXJmYWNlLgorICBzdGQ6OnVuaXF1ZV9wdHI8UnVudGltZUR5bGRJbXBsPiBEeWxkOworICBNZW1vcnlNYW5hZ2VyICZNZW1NZ3I7CisgIEpJVFN5bWJvbFJlc29sdmVyICZSZXNvbHZlcjsKKyAgYm9vbCBQcm9jZXNzQWxsU2VjdGlvbnM7CisgIFJ1bnRpbWVEeWxkQ2hlY2tlckltcGwgKkNoZWNrZXI7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05FTkdJTkVfUlVOVElNRURZTERfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvUnVudGltZUR5bGRDaGVja2VyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9SdW50aW1lRHlsZENoZWNrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZTg5ZjQwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9FeGVjdXRpb25FbmdpbmUvUnVudGltZUR5bGRDaGVja2VyLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8vPT09LS0tLSBSdW50aW1lRHlsZENoZWNrZXIuaCAtIFJ1bnRpbWVEeWxkIHRlc3RlciBmcmFtZXdvcmsgLS0tLS0qLSBDKysgLSotPS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9FWEVDVVRJT05FTkdJTkVfUlVOVElNRURZTERDSEVDS0VSX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfUlVOVElNRURZTERDSEVDS0VSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBTdHJpbmdSZWY7CitjbGFzcyBNQ0Rpc2Fzc2VtYmxlcjsKK2NsYXNzIE1lbW9yeUJ1ZmZlcjsKK2NsYXNzIE1DSW5zdFByaW50ZXI7CitjbGFzcyBSdW50aW1lRHlsZDsKK2NsYXNzIFJ1bnRpbWVEeWxkQ2hlY2tlckltcGw7CitjbGFzcyByYXdfb3N0cmVhbTsKKworLy8vIFxicmllZiBSdW50aW1lRHlsZCBpbnZhcmlhbnQgY2hlY2tlciBmb3IgdmVyaWZ5aW5nIHRoYXQgUnVudGltZUR5bGQgaGFzCisvLy8gICAgICAgIGNvcnJlY3RseSBhcHBsaWVkIHJlbG9jYXRpb25zLgorLy8vCisvLy8gVGhlIFJ1bnRpbWVEeWxkQ2hlY2tlciBjbGFzcyBldmFsdWF0ZXMgZXhwcmVzc2lvbnMgYWdhaW5zdCBhbiBhdHRhY2hlZAorLy8vIFJ1bnRpbWVEeWxkIGluc3RhbmNlIHRvIHZlcmlmeSB0aGF0IHJlbG9jYXRpb25zIGhhdmUgYmVlbiBhcHBsaWVkCisvLy8gY29ycmVjdGx5LgorLy8vCisvLy8gVGhlIGV4cHJlc3Npb24gbGFuZ3VhZ2Ugc3VwcG9ydHMgYmFzaWMgcG9pbnRlciBhcml0aG1ldGljIGFuZCBiaXQtbWFza2luZywKKy8vLyBhbmQgaGFzIGxpbWl0ZWQgZGlzYXNzZW1ibGVyIGludGVncmF0aW9uIGZvciBhY2Nlc3NpbmcgaW5zdHJ1Y3Rpb24KKy8vLyBvcGVyYW5kcyBhbmQgdGhlIG5leHQgUEMgKHByb2dyYW0gY291bnRlcikgYWRkcmVzcyBmb3IgZWFjaCBpbnN0cnVjdGlvbi4KKy8vLworLy8vIFRoZSBsYW5ndWFnZSBzeW50YXggaXM6CisvLy8KKy8vLyBjaGVjayA9IGV4cHIgJz0nIGV4cHIKKy8vLworLy8vIGV4cHIgPSBiaW5hcnlfZXhwcgorLy8vICAgICAgfCBzbGljZWFibGVfZXhwcgorLy8vCisvLy8gc2xpY2VhYmxlX2V4cHIgPSAnKnsnIG51bWJlciAnfScgbG9hZF9hZGRyX2V4cHIgW3NsaWNlXQorLy8vICAgICAgICAgICAgICAgIHwgJygnIGV4cHIgJyknIFtzbGljZV0KKy8vLyAgICAgICAgICAgICAgICB8IGlkZW50X2V4cHIgW3NsaWNlXQorLy8vICAgICAgICAgICAgICAgIHwgbnVtYmVyIFtzbGljZV0KKy8vLworLy8vIHNsaWNlID0gJ1snIGhpZ2gtYml0LWluZGV4ICc6JyBsb3ctYml0LWluZGV4ICddJworLy8vCisvLy8gbG9hZF9hZGRyX2V4cHIgPSBzeW1ib2wKKy8vLyAgICAgICAgICAgICAgICB8ICcoJyBzeW1ib2wgJysnIG51bWJlciAnKScKKy8vLyAgICAgICAgICAgICAgICB8ICcoJyBzeW1ib2wgJy0nIG51bWJlciAnKScKKy8vLworLy8vIGlkZW50X2V4cHIgPSAnZGVjb2RlX29wZXJhbmQnICcoJyBzeW1ib2wgJywnIG9wZXJhbmQtaW5kZXggJyknCisvLy8gICAgICAgICAgICB8ICduZXh0X3BjJyAgICAgICAgJygnIHN5bWJvbCAnKScKKy8vLyAgICAgICAgICAgIHwgJ3N0dWJfYWRkcicgJygnIGZpbGUtbmFtZSAnLCcgc2VjdGlvbi1uYW1lICcsJyBzeW1ib2wgJyknCisvLy8gICAgICAgICAgICB8IHN5bWJvbAorLy8vCisvLy8gYmluYXJ5X2V4cHIgPSBleHByICcrJyBleHByCisvLy8gICAgICAgICAgICAgfCBleHByICctJyBleHByCisvLy8gICAgICAgICAgICAgfCBleHByICcmJyBleHByCisvLy8gICAgICAgICAgICAgfCBleHByICd8JyBleHByCisvLy8gICAgICAgICAgICAgfCBleHByICc8PCcgZXhwcgorLy8vICAgICAgICAgICAgIHwgZXhwciAnPj4nIGV4cHIKKy8vLworY2xhc3MgUnVudGltZUR5bGRDaGVja2VyIHsKK3B1YmxpYzoKKyAgUnVudGltZUR5bGRDaGVja2VyKFJ1bnRpbWVEeWxkICZSVER5bGQsIE1DRGlzYXNzZW1ibGVyICpEaXNhc3NlbWJsZXIsCisgICAgICAgICAgICAgICAgICAgICBNQ0luc3RQcmludGVyICpJbnN0UHJpbnRlciwgcmF3X29zdHJlYW0gJkVyclN0cmVhbSk7CisgIH5SdW50aW1lRHlsZENoZWNrZXIoKTsKKworICAvLyBcYnJpZWYgR2V0IHRoZSBhc3NvY2lhdGVkIFJURHlsZCBpbnN0YW5jZS4KKyAgUnVudGltZUR5bGQmIGdldFJURHlsZCgpOworCisgIC8vIFxicmllZiBHZXQgdGhlIGFzc29jaWF0ZWQgUlREeWxkIGluc3RhbmNlLgorICBjb25zdCBSdW50aW1lRHlsZCYgZ2V0UlREeWxkKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDaGVjayBhIHNpbmdsZSBleHByZXNzaW9uIGFnYWluc3QgdGhlIGF0dGFjaGVkIFJ1bnRpbWVEeWxkCisgIC8vLyAgICAgICAgaW5zdGFuY2UuCisgIGJvb2wgY2hlY2soU3RyaW5nUmVmIENoZWNrRXhwcikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBTY2FuIHRoZSBnaXZlbiBtZW1vcnkgYnVmZmVyIGZvciBsaW5lcyBiZWdpbm5pbmcgd2l0aCB0aGUgc3RyaW5nCisgIC8vLyAgICAgICAgaW4gUnVsZVByZWZpeC4gVGhlIHJlbWFpbmRlciBvZiB0aGUgbGluZSBpcyBwYXNzZWQgdG8gdGhlIGNoZWNrCisgIC8vLyAgICAgICAgbWV0aG9kIHRvIGJlIGV2YWx1YXRlZCBhcyBhbiBleHByZXNzaW9uLgorICBib29sIGNoZWNrQWxsUnVsZXNJbkJ1ZmZlcihTdHJpbmdSZWYgUnVsZVByZWZpeCwgTWVtb3J5QnVmZmVyICpNZW1CdWYpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgYWRkcmVzcyBvZiB0aGUgcmVxdWVzdGVkIHNlY3Rpb24gKG9yIGFuIGVycm9yIG1lc3NhZ2UKKyAgLy8vICAgICAgICBpbiB0aGUgc2Vjb25kIGVsZW1lbnQgb2YgdGhlIHBhaXIgaWYgdGhlIGFkZHJlc3MgY2Fubm90IGJlIGZvdW5kKS4KKyAgLy8vCisgIC8vLyBpZiAnTG9jYWxBZGRyZXNzJyBpcyB0cnVlLCB0aGlzIHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIHNlY3Rpb24KKyAgLy8vIHdpdGhpbiB0aGUgbGlua2VyJ3MgbWVtb3J5LiBJZiAnTG9jYWxBZGRyZXNzJyBpcyBmYWxzZSBpdCByZXR1cm5zIHRoZQorICAvLy8gYWRkcmVzcyB3aXRoaW4gdGhlIHRhcmdldCBwcm9jZXNzIChpLmUuIHRoZSBsb2FkIGFkZHJlc3MpLgorICBzdGQ6OnBhaXI8dWludDY0X3QsIHN0ZDo6c3RyaW5nPiBnZXRTZWN0aW9uQWRkcihTdHJpbmdSZWYgRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTZWN0aW9uTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBMb2NhbEFkZHJlc3MpOworCisgIC8vLyBcYnJpZWYgSWYgdGhlcmUgaXMgYSBzZWN0aW9uIGF0IHRoZSBnaXZlbiBsb2NhbCBhZGRyZXNzLCByZXR1cm4gaXRzIGxvYWQKKyAgLy8vICAgICAgICBhZGRyZXNzLCBvdGhlcndpc2UgcmV0dXJuIG5vbmUuCisgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRTZWN0aW9uTG9hZEFkZHJlc3Modm9pZCAqTG9jYWxBZGRyZXNzKSBjb25zdDsKKworcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPFJ1bnRpbWVEeWxkQ2hlY2tlckltcGw+IEltcGw7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRXhlY3V0aW9uRW5naW5lL1NlY3Rpb25NZW1vcnlNYW5hZ2VyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9TZWN0aW9uTWVtb3J5TWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3NmUzNzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0V4ZWN1dGlvbkVuZ2luZS9TZWN0aW9uTWVtb3J5TWFuYWdlci5oCkBAIC0wLDAgKzEsMTkzIEBACisvLz09PS0gU2VjdGlvbk1lbW9yeU1hbmFnZXIuaCAtIE1lbW9yeSBtYW5hZ2VyIGZvciBNQ0pJVC9SdER5bGQgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgYSBzZWN0aW9uLWJhc2VkIG1lbW9yeSBtYW5hZ2VyIHVzZWQgYnkKKy8vIHRoZSBNQ0pJVCBleGVjdXRpb24gZW5naW5lIGFuZCBSdW50aW1lRHlsZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRVhFQ1VUSU9ORU5HSU5FX1NFQ1RJT05NRU1PUllNQU5BR0VSX0gKKyNkZWZpbmUgTExWTV9FWEVDVVRJT05FTkdJTkVfU0VDVElPTk1FTU9SWU1BTkFHRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0V4ZWN1dGlvbkVuZ2luZS9SVER5bGRNZW1vcnlNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeS5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gVGhpcyBpcyBhIHNpbXBsZSBtZW1vcnkgbWFuYWdlciB3aGljaCBpbXBsZW1lbnRzIHRoZSBtZXRob2RzIGNhbGxlZCBieQorLy8vIHRoZSBSdW50aW1lRHlsZCBjbGFzcyB0byBhbGxvY2F0ZSBtZW1vcnkgZm9yIHNlY3Rpb24tYmFzZWQgbG9hZGluZyBvZgorLy8vIG9iamVjdHMsIHVzdWFsbHkgdGhvc2UgZ2VuZXJhdGVkIGJ5IHRoZSBNQ0pJVCBleGVjdXRpb24gZW5naW5lLgorLy8vCisvLy8gVGhpcyBtZW1vcnkgbWFuYWdlciBhbGxvY2F0ZXMgYWxsIHNlY3Rpb24gbWVtb3J5IGFzIHJlYWQtd3JpdGUuICBUaGUKKy8vLyBSdW50aW1lRHlsZCB3aWxsIGNvcHkgSklUZWQgc2VjdGlvbiBtZW1vcnkgaW50byB0aGVzZSBhbGxvY2F0ZWQgYmxvY2tzCisvLy8gYW5kIHBlcmZvcm0gYW55IG5lY2Vzc2FyeSBsaW5raW5nIGFuZCByZWxvY2F0aW9ucy4KKy8vLworLy8vIEFueSBjbGllbnQgdXNpbmcgdGhpcyBtZW1vcnkgbWFuYWdlciBNVVNUIGVuc3VyZSB0aGF0IHNlY3Rpb24tc3BlY2lmaWMKKy8vLyBwYWdlIHBlcm1pc3Npb25zIGhhdmUgYmVlbiBhcHBsaWVkIGJlZm9yZSBhdHRlbXB0aW5nIHRvIGV4ZWN1dGUgZnVuY3Rpb25zCisvLy8gaW4gdGhlIEpJVGVkIG9iamVjdC4gIFBlcm1pc3Npb25zIGNhbiBiZSBhcHBsaWVkIGVpdGhlciBieSBjYWxsaW5nCisvLy8gTUNKSVQ6OmZpbmFsaXplT2JqZWN0IG9yIGJ5IGNhbGxpbmcgU2VjdGlvbk1lbW9yeU1hbmFnZXI6OmZpbmFsaXplTWVtb3J5CisvLy8gZGlyZWN0bHkuICBDbGllbnRzIG9mIE1DSklUIHNob3VsZCBjYWxsIE1DSklUOjpmaW5hbGl6ZU9iamVjdC4KK2NsYXNzIFNlY3Rpb25NZW1vcnlNYW5hZ2VyIDogcHVibGljIFJURHlsZE1lbW9yeU1hbmFnZXIgeworcHVibGljOgorICAvLy8gVGhpcyBlbnVtIGRlc2NyaWJlcyB0aGUgdmFyaW91cyByZWFzb25zIHRvIGFsbG9jYXRlIHBhZ2VzIGZyb20KKyAgLy8vIGFsbG9jYXRlTWFwcGVkTWVtb3J5LgorICBlbnVtIGNsYXNzIEFsbG9jYXRpb25QdXJwb3NlIHsKKyAgICBDb2RlLAorICAgIFJPRGF0YSwKKyAgICBSV0RhdGEsCisgIH07CisKKyAgLy8vIEltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZSBhcmUgdXNlZCBieSBTZWN0aW9uTWVtb3J5TWFuYWdlciB0bworICAvLy8gcmVxdWVzdCBwYWdlcyBmcm9tIHRoZSBvcGVyYXRpbmcgc3lzdGVtLgorICBjbGFzcyBNZW1vcnlNYXBwZXIgeworICBwdWJsaWM6CisgICAgLy8vIFRoaXMgbWV0aG9kIGF0dGVtcHRzIHRvIGFsbG9jYXRlIFxwIE51bUJ5dGVzIGJ5dGVzIG9mIHZpcnR1YWwgbWVtb3J5IGZvcgorICAgIC8vLyBccCBQdXJwb3NlLiAgXHAgTmVhckJsb2NrIG1heSBwb2ludCB0byBhbiBleGlzdGluZyBhbGxvY2F0aW9uLCBpbiB3aGljaAorICAgIC8vLyBjYXNlIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhbGxvY2F0ZSBtb3JlIG1lbW9yeSBuZWFyIHRoZSBleGlzdGluZyBibG9jay4KKyAgICAvLy8gVGhlIGFjdHVhbCBhbGxvY2F0ZWQgYWRkcmVzcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBuZWFyIHRoZSByZXF1ZXN0ZWQKKyAgICAvLy8gYWRkcmVzcy4gIFxwIEZsYWdzIGlzIHVzZWQgdG8gc2V0IHRoZSBpbml0aWFsIHByb3RlY3Rpb24gZmxhZ3MgZm9yIHRoZQorICAgIC8vLyBibG9jayBvZiB0aGUgbWVtb3J5LiAgXHAgRUMgW291dF0gcmV0dXJucyBhbiBvYmplY3QgZGVzY3JpYmluZyBhbnkgZXJyb3IKKyAgICAvLy8gdGhhdCBvY2N1cnMuCisgICAgLy8vCisgICAgLy8vIFRoaXMgbWV0aG9kIG1heSBhbGxvY2F0ZSBtb3JlIHRoYW4gdGhlIG51bWJlciBvZiBieXRlcyByZXF1ZXN0ZWQuICBUaGUKKyAgICAvLy8gYWN0dWFsIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgaXMgaW5kaWNhdGVkIGluIHRoZSByZXR1cm5lZAorICAgIC8vLyBNZW1vcnlCbG9jay4KKyAgICAvLy8KKyAgICAvLy8gVGhlIHN0YXJ0IG9mIHRoZSBhbGxvY2F0ZWQgYmxvY2sgbXVzdCBiZSBhbGlnbmVkIHdpdGggdGhlIHN5c3RlbQorICAgIC8vLyBhbGxvY2F0aW9uIGdyYW51bGFyaXR5ICg2NEsgb24gV2luZG93cywgcGFnZSBzaXplIG9uIExpbnV4KS4gIElmIHRoZQorICAgIC8vLyBhZGRyZXNzIGZvbGxvd2luZyBccCBOZWFyQmxvY2sgaXMgbm90IHNvIGFsaWduZWQsIGl0IHdpbGwgYmUgcm91bmRlZCB1cAorICAgIC8vLyB0byB0aGUgbmV4dCBhbGxvY2F0aW9uIGdyYW51bGFyaXR5IGJvdW5kYXJ5LgorICAgIC8vLworICAgIC8vLyBcciBhIG5vbi1udWxsIE1lbW9yeUJsb2NrIGlmIHRoZSBmdW5jdGlvbiB3YXMgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlIGEKKyAgICAvLy8gbnVsbCBNZW1vcnlCbG9jayB3aXRoIFxwIEVDIGRlc2NyaWJpbmcgdGhlIGVycm9yLgorICAgIHZpcnR1YWwgc3lzOjpNZW1vcnlCbG9jaworICAgIGFsbG9jYXRlTWFwcGVkTWVtb3J5KEFsbG9jYXRpb25QdXJwb3NlIFB1cnBvc2UsIHNpemVfdCBOdW1CeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzeXM6Ok1lbW9yeUJsb2NrICpjb25zdCBOZWFyQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmxhZ3MsIHN0ZDo6ZXJyb3JfY29kZSAmRUMpID0gMDsKKworICAgIC8vLyBUaGlzIG1ldGhvZCBzZXRzIHRoZSBwcm90ZWN0aW9uIGZsYWdzIGZvciBhIGJsb2NrIG9mIG1lbW9yeSB0byB0aGUgc3RhdGUKKyAgICAvLy8gc3BlY2lmaWVkIGJ5IFxwIEZsYWdzLiAgVGhlIGJlaGF2aW9yIGlzIG5vdCBzcGVjaWZpZWQgaWYgdGhlIG1lbW9yeSB3YXMKKyAgICAvLy8gbm90IGFsbG9jYXRlZCB1c2luZyB0aGUgYWxsb2NhdGVNYXBwZWRNZW1vcnkgbWV0aG9kLgorICAgIC8vLyBccCBCbG9jayBkZXNjcmliZXMgdGhlIG1lbW9yeSBibG9jayB0byBiZSBwcm90ZWN0ZWQuCisgICAgLy8vIFxwIEZsYWdzIHNwZWNpZmllcyB0aGUgbmV3IHByb3RlY3Rpb24gc3RhdGUgdG8gYmUgYXNzaWduZWQgdG8gdGhlIGJsb2NrLgorICAgIC8vLworICAgIC8vLyBJZiBccCBGbGFncyBpcyBNRl9XUklURSwgdGhlIGFjdHVhbCBiZWhhdmlvciB2YXJpZXMgd2l0aCB0aGUgb3BlcmF0aW5nCisgICAgLy8vIHN5c3RlbSAoaS5lLiBNRl9SRUFEIHwgTUZfV1JJVEUgb24gV2luZG93cykgYW5kIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlCisgICAgLy8vIChpLmUuIE1GX1dSSVRFIC0+IE1GX1JFQUQgfCBNRl9XUklURSBvbiBpMzg2KS4KKyAgICAvLy8KKyAgICAvLy8gXHIgZXJyb3Jfc3VjY2VzcyBpZiB0aGUgZnVuY3Rpb24gd2FzIHN1Y2Nlc3NmdWwsIG9yIGFuIGVycm9yX2NvZGUKKyAgICAvLy8gZGVzY3JpYmluZyB0aGUgZmFpbHVyZSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAgICB2aXJ0dWFsIHN0ZDo6ZXJyb3JfY29kZSBwcm90ZWN0TWFwcGVkTWVtb3J5KGNvbnN0IHN5czo6TWVtb3J5QmxvY2sgJkJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmxhZ3MpID0gMDsKKworICAgIC8vLyBUaGlzIG1ldGhvZCByZWxlYXNlcyBhIGJsb2NrIG9mIG1lbW9yeSB0aGF0IHdhcyBhbGxvY2F0ZWQgd2l0aCB0aGUKKyAgICAvLy8gYWxsb2NhdGVNYXBwZWRNZW1vcnkgbWV0aG9kLiBJdCBzaG91bGQgbm90IGJlIHVzZWQgdG8gcmVsZWFzZSBhbnkgbWVtb3J5CisgICAgLy8vIGJsb2NrIGFsbG9jYXRlZCBhbnkgb3RoZXIgd2F5LgorICAgIC8vLyBccCBCbG9jayBkZXNjcmliZXMgdGhlIG1lbW9yeSB0byBiZSByZWxlYXNlZC4KKyAgICAvLy8KKyAgICAvLy8gXHIgZXJyb3Jfc3VjY2VzcyBpZiB0aGUgZnVuY3Rpb24gd2FzIHN1Y2Nlc3NmdWwsIG9yIGFuIGVycm9yX2NvZGUKKyAgICAvLy8gZGVzY3JpYmluZyB0aGUgZmFpbHVyZSBpZiBhbiBlcnJvciBvY2N1cnJlZC4KKyAgICB2aXJ0dWFsIHN0ZDo6ZXJyb3JfY29kZSByZWxlYXNlTWFwcGVkTWVtb3J5KHN5czo6TWVtb3J5QmxvY2sgJk0pID0gMDsKKworICAgIHZpcnR1YWwgfk1lbW9yeU1hcHBlcigpOworICB9OworCisgIC8vLyBDcmVhdGVzIGEgU2VjdGlvbk1lbW9yeU1hbmFnZXIgaW5zdGFuY2Ugd2l0aCBccCBNTSBhcyB0aGUgYXNzb2NpYXRlZAorICAvLy8gbWVtb3J5IG1hcHBlci4gIElmIFxwIE1NIGlzIG51bGxwdHIgdGhlbiBhIGRlZmF1bHQgbWVtb3J5IG1hcHBlciBpcyB1c2VkCisgIC8vLyB0aGF0IGRpcmVjdGx5IGNhbGxzIGludG8gdGhlIG9wZXJhdGluZyBzeXN0ZW0uCisgIFNlY3Rpb25NZW1vcnlNYW5hZ2VyKE1lbW9yeU1hcHBlciAqTU0gPSBudWxscHRyKTsKKyAgU2VjdGlvbk1lbW9yeU1hbmFnZXIoY29uc3QgU2VjdGlvbk1lbW9yeU1hbmFnZXIgJikgPSBkZWxldGU7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFNlY3Rpb25NZW1vcnlNYW5hZ2VyICYpID0gZGVsZXRlOworICB+U2VjdGlvbk1lbW9yeU1hbmFnZXIoKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIEFsbG9jYXRlcyBhIG1lbW9yeSBibG9jayBvZiAoYXQgbGVhc3QpIHRoZSBnaXZlbiBzaXplIHN1aXRhYmxlIGZvcgorICAvLy8gZXhlY3V0YWJsZSBjb2RlLgorICAvLy8KKyAgLy8vIFRoZSB2YWx1ZSBvZiBccCBBbGlnbm1lbnQgbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4gIElmIFxwIEFsaWdubWVudCBpcyB6ZXJvCisgIC8vLyBhIGRlZmF1bHQgYWxpZ25tZW50IG9mIDE2IHdpbGwgYmUgdXNlZC4KKyAgdWludDhfdCAqYWxsb2NhdGVDb2RlU2VjdGlvbih1aW50cHRyX3QgU2l6ZSwgdW5zaWduZWQgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNlY3Rpb25JRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU2VjdGlvbk5hbWUpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgQWxsb2NhdGVzIGEgbWVtb3J5IGJsb2NrIG9mIChhdCBsZWFzdCkgdGhlIGdpdmVuIHNpemUgc3VpdGFibGUgZm9yCisgIC8vLyBleGVjdXRhYmxlIGNvZGUuCisgIC8vLworICAvLy8gVGhlIHZhbHVlIG9mIFxwIEFsaWdubWVudCBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvLiAgSWYgXHAgQWxpZ25tZW50IGlzIHplcm8KKyAgLy8vIGEgZGVmYXVsdCBhbGlnbm1lbnQgb2YgMTYgd2lsbCBiZSB1c2VkLgorICB1aW50OF90ICphbGxvY2F0ZURhdGFTZWN0aW9uKHVpbnRwdHJfdCBTaXplLCB1bnNpZ25lZCBBbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2VjdGlvbklELCBTdHJpbmdSZWYgU2VjdGlvbk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1JlYWRPbmx5KSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFVwZGF0ZSBzZWN0aW9uLXNwZWNpZmljIG1lbW9yeSBwZXJtaXNzaW9ucyBhbmQgb3RoZXIgYXR0cmlidXRlcy4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBvYmplY3QgbG9hZGluZyBpcyBjb21wbGV0ZSBhbmQgc2VjdGlvbiBwYWdlCisgIC8vLyBwZXJtaXNzaW9ucyBjYW4gYmUgYXBwbGllZC4gIEl0IGlzIHVwIHRvIHRoZSBtZW1vcnkgbWFuYWdlciBpbXBsZW1lbnRhdGlvbgorICAvLy8gdG8gZGVjaWRlIHdoZXRoZXIgb3Igbm90IHRvIGFjdCBvbiB0aGlzIG1ldGhvZC4gIFRoZSBtZW1vcnkgbWFuYWdlciB3aWxsCisgIC8vLyB0eXBpY2FsbHkgYWxsb2NhdGUgYWxsIHNlY3Rpb25zIGFzIHJlYWQtd3JpdGUgYW5kIHRoZW4gYXBwbHkgc3BlY2lmaWMKKyAgLy8vIHBlcm1pc3Npb25zIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLiAgQ29kZSBzZWN0aW9ucyBjYW5ub3QgYmUgZXhlY3V0ZWQKKyAgLy8vIHVudGlsIHRoaXMgZnVuY3Rpb24gaGFzIGJlZW4gY2FsbGVkLiAgSW4gYWRkaXRpb24sIGFueSBjYWNoZSBjb2hlcmVuY3kKKyAgLy8vIG9wZXJhdGlvbnMgbmVlZGVkIHRvIHJlbGlhYmx5IHVzZSB0aGUgbWVtb3J5IGFyZSBhbHNvIHBlcmZvcm1lZC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0cnVlIGlmIGFuIGVycm9yIG9jY3VycmVkLCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgZmluYWxpemVNZW1vcnkoc3RkOjpzdHJpbmcgKkVyck1zZyA9IG51bGxwdHIpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgSW52YWxpZGF0ZSBpbnN0cnVjdGlvbiBjYWNoZSBmb3IgY29kZSBzZWN0aW9ucy4KKyAgLy8vCisgIC8vLyBTb21lIHBsYXRmb3JtcyB3aXRoIHNlcGFyYXRlIGRhdGEgY2FjaGUgYW5kIGluc3RydWN0aW9uIGNhY2hlIHJlcXVpcmUKKyAgLy8vIGV4cGxpY2l0IGNhY2hlIGZsdXNoLCBvdGhlcndpc2UgSklUIGNvZGUgbWFuaXB1bGF0aW9ucyAobGlrZSByZXNvbHZlZAorICAvLy8gcmVsb2NhdGlvbnMpIHdpbGwgZ2V0IHRvIHRoZSBkYXRhIGNhY2hlIGJ1dCBub3QgdG8gdGhlIGluc3RydWN0aW9uIGNhY2hlLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIGZpbmFsaXplTWVtb3J5LgorICB2aXJ0dWFsIHZvaWQgaW52YWxpZGF0ZUluc3RydWN0aW9uQ2FjaGUoKTsKKworcHJpdmF0ZToKKyAgc3RydWN0IEZyZWVNZW1CbG9jayB7CisgICAgLy8gVGhlIGFjdHVhbCBibG9jayBvZiBmcmVlIG1lbW9yeQorICAgIHN5czo6TWVtb3J5QmxvY2sgRnJlZTsKKyAgICAvLyBJZiB0aGVyZSBpcyBhIHBlbmRpbmcgYWxsb2NhdGlvbiBmcm9tIHRoZSBzYW1lIHJlc2VydmF0aW9uIHJpZ2h0IGJlZm9yZQorICAgIC8vIHRoaXMgYmxvY2ssIHN0b3JlIGl0J3MgaW5kZXggaW4gUGVuZGluZ01lbSwgdG8gYmUgYWJsZSB0byB1cGRhdGUgdGhlCisgICAgLy8gcGVuZGluZyByZWdpb24gaWYgcGFydCBvZiB0aGlzIGJsb2NrIGlzIGFsbG9jYXRlZCwgcmF0aGVyIHRoYW4gaGF2aW5nIHRvCisgICAgLy8gY3JlYXRlIGEgbmV3IG9uZQorICAgIHVuc2lnbmVkIFBlbmRpbmdQcmVmaXhJbmRleDsKKyAgfTsKKworICBzdHJ1Y3QgTWVtb3J5R3JvdXAgeworICAgIC8vIFBlbmRpbmdNZW0gY29udGFpbnMgYWxsIGJsb2NrcyBvZiBtZW1vcnkgKHN1YmJsb2NrcyBvZiBBbGxvY2F0ZWRNZW0pCisgICAgLy8gd2hpY2ggaGF2ZSBub3QgeWV0IGhhZCB0aGVpciBwZXJtaXNzaW9ucyBhcHBsaWVkLCBidXQgaGF2ZSBiZWVuIGdpdmVuCisgICAgLy8gb3V0IHRvIHRoZSB1c2VyLiBGcmVlTWVtIGNvbnRhaW5zIGFsbCBibG9jayBvZiBtZW1vcnksIHdoaWNoIGhhdmUKKyAgICAvLyBuZWl0aGVyIGhhZCB0aGVpciBwZXJtaXNzaW9ucyBhcHBsaWVkLCBub3IgYmVlbiBnaXZlbiBvdXQgdG8gdGhlIHVzZXIuCisgICAgU21hbGxWZWN0b3I8c3lzOjpNZW1vcnlCbG9jaywgMTY+IFBlbmRpbmdNZW07CisgICAgU21hbGxWZWN0b3I8RnJlZU1lbUJsb2NrLCAxNj4gRnJlZU1lbTsKKworICAgIC8vIEFsbCBtZW1vcnkgYmxvY2tzIHRoYXQgaGF2ZSBiZWVuIHJlcXVlc3RlZCBmcm9tIHRoZSBzeXN0ZW0KKyAgICBTbWFsbFZlY3RvcjxzeXM6Ok1lbW9yeUJsb2NrLCAxNj4gQWxsb2NhdGVkTWVtOworCisgICAgc3lzOjpNZW1vcnlCbG9jayBOZWFyOworICB9OworCisgIHVpbnQ4X3QgKmFsbG9jYXRlU2VjdGlvbihBbGxvY2F0aW9uUHVycG9zZSBQdXJwb3NlLCB1aW50cHRyX3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCk7CisKKyAgc3RkOjplcnJvcl9jb2RlIGFwcGx5TWVtb3J5R3JvdXBQZXJtaXNzaW9ucyhNZW1vcnlHcm91cCAmTWVtR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUGVybWlzc2lvbnMpOworCisgIE1lbW9yeUdyb3VwIENvZGVNZW07CisgIE1lbW9yeUdyb3VwIFJXRGF0YU1lbTsKKyAgTWVtb3J5R3JvdXAgUk9EYXRhTWVtOworICBNZW1vcnlNYXBwZXIgJk1NYXBwZXI7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9FWEVDVVRJT05fRU5HSU5FX1NFQ1RJT05fTUVNT1JZX01BTkFHRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9GdXp6TXV0YXRlL0Z1enplckNMSS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9GdXp6TXV0YXRlL0Z1enplckNMSS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMzNlOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0Z1enpNdXRhdGUvRnV6emVyQ0xJLmgKQEAgLTAsMCArMSw3OSBAQAorLy89PT0tLSBGdXp6ZXJDTEkuaCAtIENvbW1vbiBsb2dpYyBmb3IgQ0xJcyBvZiBmdXp6ZXJzIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDb21tb24gbG9naWMgbmVlZGVkIHRvIGltcGxlbWVudCBMTFZNJ3MgZnV6eiB0YXJnZXRzJyBDTElzIC0gaW5jbHVkaW5nIExMVk0KKy8vIGNvbmNlcHRzIGxpa2UgY2w6Om9wdCBhbmQgbGliRnV6emVyIGNvbmNlcHRzIGxpa2UgLWlnbm9yZV9yZW1haW5pbmdfYXJncz0xLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9GVVpaTVVUQVRFX0ZVWlpFUl9DTElfSAorI2RlZmluZSBMTFZNX0ZVWlpNVVRBVEVfRlVaWkVSX0NMSV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0xMVk1Db250ZXh0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBQYXJzZSBjbDo6b3B0cyBmcm9tIGEgZnV6eiB0YXJnZXQgY29tbWFuZGxpbmUuCisvLy8KKy8vLyBUaGlzIGhhbmRsZXMgYWxsIGFyZ3VtZW50cyBhZnRlciAtaWdub3JlX3JlbWFpbmluZ19hcmdzPTEgYXMgY2w6Om9wdHMuCit2b2lkIHBhcnNlRnV6emVyQ0xPcHRzKGludCBBcmdDLCBjaGFyICpBcmdWW10pOworCisvLy8gSGFuZGxlIGJhY2tlbmQgb3B0aW9ucyB0aGF0IGFyZSBlbmNvZGVkIGluIHRoZSBleGVjdXRhYmxlIG5hbWUuCisvLy8KKy8vLyBQYXJzZXMgc29tZSBjb21tb24gYmFja2VuZCBvcHRpb25zIG91dCBvZiBhIHNwZWNpYWxseSBjcmFmdGVkIGV4ZWN1dGFibGUKKy8vLyBuYW1lIChhcmd2WzBdKS4gRm9yIGV4YW1wbGUsIGEgbmFtZSBsaWtlIGxsdm0tZm9vLWZ1enplci0tYWFyY2g2NC1naXNlbAorLy8vIG1pZ2h0IHNldCB1cCBhbiBBQXJjaDY0IHRyaXBsZSBhbmQgdGhlIEdsb2JhbCBJU2VsIHNlbGVjdG9yLiBUaGlzIHNob3VsZCBiZQorLy8vIGNhbGxlZCAqYmVmb3JlKiBwYXJzZUZ1enplckNMT3B0cyBpZiBjYWxsaW5nIGJvdGguCisvLy8KKy8vLyBUaGlzIGlzIG1lYW50IHRvIGJlIHVzZWQgZm9yIGVudmlyb25tZW50cyBsaWtlIE9TUy1GdXp6IHRoYXQgYXJlbid0IGNhcGFibGUKKy8vLyBvZiBwYXNzaW5nIGluIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgaW4gdGhlIG5vcm1hbCB3YXkuCit2b2lkIGhhbmRsZUV4ZWNOYW1lRW5jb2RlZEJFT3B0cyhTdHJpbmdSZWYgRXhlY05hbWUpOworCisvLy8gSGFuZGxlIG9wdGltaXplciBvcHRpb25zIHdoaWNoIGFyZSBlbmNvZGVkIGluIHRoZSBleGVjdXRhYmxlIG5hbWUuCisvLy8gU2FtZSBzZW1hbnRpY3MgYXMgaW4gJ2hhbmRsZUV4ZWNOYW1lRW5jb2RlZEJFT3B0cycuCit2b2lkIGhhbmRsZUV4ZWNOYW1lRW5jb2RlZE9wdGltaXplck9wdHMoU3RyaW5nUmVmIEV4ZWNOYW1lKTsKKwordXNpbmcgRnV6emVyVGVzdEZ1biA9IGludCAoKikoY29uc3QgdWludDhfdCAqRGF0YSwgc2l6ZV90IFNpemUpOwordXNpbmcgRnV6emVySW5pdEZ1biA9IGludCAoKikoaW50ICphcmdjLCBjaGFyICoqKmFyZ3YpOworCisvLy8gUnVucyBhIGZ1enogdGFyZ2V0IG9uIHRoZSBpbnB1dHMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuCisvLy8KKy8vLyBVc2VmdWwgZm9yIHRlc3RpbmcgZnV6eiB0YXJnZXRzIHdpdGhvdXQgbGlua2luZyB0byBsaWJGdXp6ZXIuIEZpbmRzIGlucHV0cworLy8vIGluIHRoZSBhcmd1bWVudCBsaXN0IGluIGEgbGliRnV6emVyIGNvbXBhdGlibGUgd2F5LgoraW50IHJ1bkZ1enplck9uSW5wdXRzKGludCBBcmdDLCBjaGFyICpBcmdWW10sIEZ1enplclRlc3RGdW4gVGVzdE9uZSwKKyAgICAgICAgICAgICAgICAgICAgICBGdXp6ZXJJbml0RnVuIEluaXQgPSBbXShpbnQgKiwgY2hhciAqKiopIHsgcmV0dXJuIDA7IH0pOworCisvLy8gRnV6emVyIGZyaWVuZGx5IGludGVyZmFjZSBmb3IgdGhlIGxsdm0gYml0Y29kZSBwYXJzZXIuCisvLy8KKy8vLyBccGFyYW0gRGF0YSBCaXRjb2RlIHdlIGFyZSBnb2luZyB0byBwYXJzZQorLy8vIFxwYXJhbSBTaXplIFNpemUgb2YgdGhlICdEYXRhJyBpbiBieXRlcworLy8vIFxyZXR1cm4gTmV3IG1vZHVsZSBvciBudWxscHRyIGluIGNhc2Ugb2YgZXJyb3IKK3N0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IHBhcnNlTW9kdWxlKGNvbnN0IHVpbnQ4X3QgKkRhdGEsIHNpemVfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUNvbnRleHQgJkNvbnRleHQpOworCisvLy8gRnV6emVyIGZyaWVuZGx5IGludGVyZmFjZSBmb3IgdGhlIGxsdm0gYml0Y29kZSBwcmludGVyLgorLy8vCisvLy8gXHBhcmFtIE0gTW9kdWxlIHRvIHByaW50CisvLy8gXHBhcmFtIERlc3QgTG9jYXRpb24gdG8gc3RvcmUgc2VyaWFsaXplZCBtb2R1bGUKKy8vLyBccGFyYW0gTWF4U2l6ZSBTaXplIG9mIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIKKy8vLyBccmV0dXJuIE51bWJlciBvZiBieXRlcyB0aGF0IHdlcmUgd3JpdHRlbi4gV2hlbiBtb2R1bGUgc2l6ZSBleGNlZWRzIE1heFNpemUKKy8vLyAgICAgICAgIHJldHVybnMgMCBhbmQgbGVhdmVzIERlc3QgdW5jaGFuZ2VkLgorc2l6ZV90IHdyaXRlTW9kdWxlKGNvbnN0IE1vZHVsZSAmTSwgdWludDhfdCAqRGVzdCwgc2l6ZV90IE1heFNpemUpOworCisvLy8gVHJ5IHRvIHBhcnNlIG1vZHVsZSBhbmQgdmVyaWZ5IGl0LiBNYXkgb3V0cHV0IHZlcmlmaWNhdGlvbiBlcnJvcnMgdG8gdGhlCisvLy8gZXJycygpLgorLy8vIFxyZXR1cm4gTmV3IG1vZHVsZSBvciBudWxscHRyIGluIGNhc2Ugb2YgZXJyb3IuCitzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBwYXJzZUFuZFZlcmlmeShjb25zdCB1aW50OF90ICpEYXRhLCBzaXplX3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICZDb250ZXh0KTsKKworfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmIC8vIExMVk1fRlVaWk1VVEFURV9GVVpaRVJfQ0xJX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRnV6ek11dGF0ZS9JUk11dGF0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRnV6ek11dGF0ZS9JUk11dGF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWE5ZDZkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9GdXp6TXV0YXRlL0lSTXV0YXRvci5oCkBAIC0wLDAgKzEsMTA4IEBACisvLz09PS0tIElSTXV0YXRvci5oIC0gTXV0YXRpb24gZW5naW5lIGZvciBmdXp6aW5nIElSIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFByb3ZpZGVzIHRoZSBJUk11dGF0b3IgY2xhc3MsIHdoaWNoIGRyaXZlcyBtdXRhdGlvbnMgb24gSVIgYmFzZWQgb24gYQorLy8gY29uZmlndXJhYmxlIHNldCBvZiBzdHJhdGVnaWVzLiBTb21lIGNvbW1vbiBzdHJhdGVnaWVzIGFyZSBhbHNvIGluY2x1ZGVkCisvLyBoZXJlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9GVVpaTVVUQVRFX0lSTVVUQVRPUl9ICisjZGVmaW5lIExMVk1fRlVaWk1VVEFURV9JUk1VVEFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0Z1enpNdXRhdGUvT3BEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBNb2R1bGU7CisKK3N0cnVjdCBSYW5kb21JUkJ1aWxkZXI7CisKKy8vLyBCYXNlIGNsYXNzIGZvciBkZXNjcmliaW5nIGhvdyB0byBtdXRhdGUgYSBtb2R1bGUuIG11dGF0aW9uIGZ1bmN0aW9ucyBmb3IKKy8vLyBlYWNoIElSIHVuaXQgZm9yd2FyZCB0byB0aGUgY29udGFpbmVkIHVuaXQuCitjbGFzcyBJUk11dGF0aW9uU3RyYXRlZ3kgeworcHVibGljOgorICB2aXJ0dWFsIH5JUk11dGF0aW9uU3RyYXRlZ3koKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFByb3ZpZGUgYSB3ZWlnaHQgdG8gYmlhcyB0b3dhcmRzIGNob29zaW5nIHRoaXMgc3RyYXRlZ3kgZm9yIGEgbXV0YXRpb24uCisgIC8vLworICAvLy8gVGhlIHZhbHVlIG9mIHRoZSB3ZWlnaHQgaXMgYXJiaXRyYXJ5LCBidXQgYSBnb29kIGRlZmF1bHQgaXMgInRoZSBudW1iZXIgb2YKKyAgLy8vIGRpc3RpbmN0IHdheXMgaW4gd2hpY2ggdGhpcyBzdHJhdGVneSBjYW4gbXV0YXRlIGEgdW5pdCIuIFRoaXMgY2FuIGFsc28gYmUKKyAgLy8vIHVzZWQgdG8gcHJlZmVyIHN0cmF0ZWdpZXMgdGhhdCBzaHJpbmsgdGhlIG92ZXJhbGwgc2l6ZSBvZiB0aGUgcmVzdWx0IHdoZW4KKyAgLy8vIHdlIHN0YXJ0IGdldHRpbmcgY2xvc2UgdG8gXGMgTWF4U2l6ZS4KKyAgdmlydHVhbCB1aW50NjRfdCBnZXRXZWlnaHQoc2l6ZV90IEN1cnJlbnRTaXplLCBzaXplX3QgTWF4U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgQ3VycmVudFdlaWdodCkgPSAwOworCisgIC8vLyBAeworICAvLy8gTXV0YXRvcnMgZm9yIGVhY2ggSVIgdW5pdC4gQnkgZGVmYXVsdCB0aGVzZSBmb3J3YXJkIHRvIGEgY29udGFpbmVkCisgIC8vLyBpbnN0YW5jZSBvZiB0aGUgbmV4dCBzbWFsbGVyIHVuaXQuCisgIHZpcnR1YWwgdm9pZCBtdXRhdGUoTW9kdWxlICZNLCBSYW5kb21JUkJ1aWxkZXIgJklCKTsKKyAgdmlydHVhbCB2b2lkIG11dGF0ZShGdW5jdGlvbiAmRiwgUmFuZG9tSVJCdWlsZGVyICZJQik7CisgIHZpcnR1YWwgdm9pZCBtdXRhdGUoQmFzaWNCbG9jayAmQkIsIFJhbmRvbUlSQnVpbGRlciAmSUIpOworICB2aXJ0dWFsIHZvaWQgbXV0YXRlKEluc3RydWN0aW9uICZJLCBSYW5kb21JUkJ1aWxkZXIgJklCKSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiU3RyYXRlZ3kgZG9lcyBub3QgaW1wbGVtZW50IGFueSBtdXRhdG9ycyIpOworICB9CisgIC8vLyBAfQorfTsKKwordXNpbmcgVHlwZUdldHRlciA9IHN0ZDo6ZnVuY3Rpb248VHlwZSAqKExMVk1Db250ZXh0ICYpPjsKKworLy8vIEVudHJ5IHBvaW50IGZvciBjb25maWd1cmluZyBhbmQgcnVubmluZyBJUiBtdXRhdGlvbnMuCitjbGFzcyBJUk11dGF0b3IgeworICBzdGQ6OnZlY3RvcjxUeXBlR2V0dGVyPiBBbGxvd2VkVHlwZXM7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxJUk11dGF0aW9uU3RyYXRlZ3k+PiBTdHJhdGVnaWVzOworCitwdWJsaWM6CisgIElSTXV0YXRvcihzdGQ6OnZlY3RvcjxUeXBlR2V0dGVyPiAmJkFsbG93ZWRUeXBlcywKKyAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxJUk11dGF0aW9uU3RyYXRlZ3k+PiAmJlN0cmF0ZWdpZXMpCisgICAgICA6IEFsbG93ZWRUeXBlcyhzdGQ6Om1vdmUoQWxsb3dlZFR5cGVzKSksCisgICAgICAgIFN0cmF0ZWdpZXMoc3RkOjptb3ZlKFN0cmF0ZWdpZXMpKSB7fQorCisgIHZvaWQgbXV0YXRlTW9kdWxlKE1vZHVsZSAmTSwgaW50IFNlZWQsIHNpemVfdCBDdXJTaXplLCBzaXplX3QgTWF4U2l6ZSk7Cit9OworCisvLy8gU3RyYXRlZ3kgdGhhdCBpbmplY3RzIG9wZXJhdGlvbnMgaW50byB0aGUgZnVuY3Rpb24uCitjbGFzcyBJbmplY3RvcklSU3RyYXRlZ3kgOiBwdWJsaWMgSVJNdXRhdGlvblN0cmF0ZWd5IHsKKyAgc3RkOjp2ZWN0b3I8ZnV6emVyb3A6Ok9wRGVzY3JpcHRvcj4gT3BlcmF0aW9uczsKKworICBPcHRpb25hbDxmdXp6ZXJvcDo6T3BEZXNjcmlwdG9yPiBjaG9vc2VPcGVyYXRpb24oVmFsdWUgKlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmRvbUlSQnVpbGRlciAmSUIpOworCitwdWJsaWM6CisgIEluamVjdG9ySVJTdHJhdGVneShzdGQ6OnZlY3RvcjxmdXp6ZXJvcDo6T3BEZXNjcmlwdG9yPiAmJk9wZXJhdGlvbnMpCisgICAgICA6IE9wZXJhdGlvbnMoc3RkOjptb3ZlKE9wZXJhdGlvbnMpKSB7fQorICBzdGF0aWMgc3RkOjp2ZWN0b3I8ZnV6emVyb3A6Ok9wRGVzY3JpcHRvcj4gZ2V0RGVmYXVsdE9wcygpOworCisgIHVpbnQ2NF90IGdldFdlaWdodChzaXplX3QgQ3VycmVudFNpemUsIHNpemVfdCBNYXhTaXplLAorICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgQ3VycmVudFdlaWdodCkgb3ZlcnJpZGUgeworICAgIHJldHVybiBPcGVyYXRpb25zLnNpemUoKTsKKyAgfQorCisgIHVzaW5nIElSTXV0YXRpb25TdHJhdGVneTo6bXV0YXRlOworICB2b2lkIG11dGF0ZShGdW5jdGlvbiAmRiwgUmFuZG9tSVJCdWlsZGVyICZJQikgb3ZlcnJpZGU7CisgIHZvaWQgbXV0YXRlKEJhc2ljQmxvY2sgJkJCLCBSYW5kb21JUkJ1aWxkZXIgJklCKSBvdmVycmlkZTsKK307CisKK2NsYXNzIEluc3REZWxldGVySVJTdHJhdGVneSA6IHB1YmxpYyBJUk11dGF0aW9uU3RyYXRlZ3kgeworcHVibGljOgorICB1aW50NjRfdCBnZXRXZWlnaHQoc2l6ZV90IEN1cnJlbnRTaXplLCBzaXplX3QgTWF4U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEN1cnJlbnRXZWlnaHQpIG92ZXJyaWRlOworCisgIHVzaW5nIElSTXV0YXRpb25TdHJhdGVneTo6bXV0YXRlOworICB2b2lkIG11dGF0ZShGdW5jdGlvbiAmRiwgUmFuZG9tSVJCdWlsZGVyICZJQikgb3ZlcnJpZGU7CisgIHZvaWQgbXV0YXRlKEluc3RydWN0aW9uICZJbnN0LCBSYW5kb21JUkJ1aWxkZXIgJklCKSBvdmVycmlkZTsKK307CisKK30gLy8gZW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBMTFZNX0ZVWlpNVVRBVEVfSVJNVVRBVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRnV6ek11dGF0ZS9PcERlc2NyaXB0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRnV6ek11dGF0ZS9PcERlc2NyaXB0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDMwZmRhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9GdXp6TXV0YXRlL09wRGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsMjIzIEBACisvLz09PS0tIE9wRGVzY3JpcHRvci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFByb3ZpZGVzIHRoZSBmdXp6ZXJvcDo6RGVzY3JpcHRvciBjbGFzcyBhbmQgcmVsYXRlZCB0b29scyBmb3IgZGVzY3JpYmluZworLy8gb3BlcmF0aW9ucyBhbiBJUiBmdXp6ZXIgY2FuIHdvcmsgd2l0aC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRlVaWk1VVEFURV9PUERFU0NSSVBUT1JfSAorI2RlZmluZSBMTFZNX0ZVWlpNVVRBVEVfT1BERVNDUklQVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIGZ1enplcm9wIHsKKworLy8vIEB7CisvLy8gUG9wdWxhdGUgYSBzbWFsbCBsaXN0IG9mIHBvdGVudGlhbGx5IGludGVyZXN0aW5nIGNvbnN0YW50cyBvZiBhIGdpdmVuIHR5cGUuCit2b2lkIG1ha2VDb25zdGFudHNXaXRoVHlwZShUeXBlICpULCBzdGQ6OnZlY3RvcjxDb25zdGFudCAqPiAmQ3MpOworc3RkOjp2ZWN0b3I8Q29uc3RhbnQgKj4gbWFrZUNvbnN0YW50c1dpdGhUeXBlKFR5cGUgKlQpOworLy8vIEB9CisKKy8vLyBBIG1hdGNoZXIvZ2VuZXJhdG9yIGZvciBmaW5kaW5nIHN1aXRhYmxlIHZhbHVlcyBmb3IgdGhlIG5leHQgc291cmNlIGluIGFuCisvLy8gb3BlcmF0aW9uJ3MgcGFydGlhbGx5IGNvbXBsZXRlZCBhcmd1bWVudCBsaXN0LgorLy8vCisvLy8gR2l2ZW4gdGhhdCB3ZSdyZSBidWlsZGluZyBzb21lIG9wZXJhdGlvbiBYIGFuZCBtYXkgaGF2ZSBhbHJlYWR5IGZpbGxlZCBzb21lCisvLy8gc3Vic2V0IG9mIGl0cyBvcGVyYW5kcywgdGhpcyBwcmVkaWNhdGUgZGV0ZXJtaW5lcyBpZiBzb21lIHZhbHVlIE5ldyBpcworLy8vIHN1aXRhYmxlIGZvciB0aGUgbmV4dCBvcGVyYW5kIG9yIGdlbmVyYXRlcyBhIHNldCBvZiB2YWx1ZXMgdGhhdCBhcmUKKy8vLyBzdWl0YWJsZS4KK2NsYXNzIFNvdXJjZVByZWQgeworcHVibGljOgorICAvLy8gR2l2ZW4gYSBsaXN0IG9mIGFscmVhZHkgc2VsZWN0ZWQgb3BlcmFuZHMsIHJldHVybnMgd2hldGhlciBhIGdpdmVuIG5ldworICAvLy8gb3BlcmFuZCBpcyBzdWl0YWJsZSBmb3IgdGhlIG5leHQgb3BlcmFuZC4KKyAgdXNpbmcgUHJlZFQgPSBzdGQ6OmZ1bmN0aW9uPGJvb2woQXJyYXlSZWY8VmFsdWUgKj4gQ3VyLCBjb25zdCBWYWx1ZSAqTmV3KT47CisgIC8vLyBHaXZlbiBhIGxpc3Qgb2YgYWxyZWFkeSBzZWxlY3RlZCBvcGVyYW5kcyBhbmQgYSBzZXQgb2YgdmFsaWQgYmFzZSB0eXBlcworICAvLy8gZm9yIGEgZnV6emVyLCBnZW5lcmF0ZXMgYSBsaXN0IG9mIGNvbnN0YW50cyB0aGF0IGNvdWxkIGJlIHVzZWQgZm9yIHRoZQorICAvLy8gbmV4dCBvcGVyYW5kLgorICB1c2luZyBNYWtlVCA9IHN0ZDo6ZnVuY3Rpb248c3RkOjp2ZWN0b3I8Q29uc3RhbnQgKj4oCisgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBDdXIsIEFycmF5UmVmPFR5cGUgKj4gQmFzZVR5cGVzKT47CisKK3ByaXZhdGU6CisgIFByZWRUIFByZWQ7CisgIE1ha2VUIE1ha2U7CisKK3B1YmxpYzoKKyAgLy8vIENyZWF0ZSBhIGZ1bGx5IGdlbmVyYWwgc291cmNlIHByZWRpY2F0ZS4KKyAgU291cmNlUHJlZChQcmVkVCBQcmVkLCBNYWtlVCBNYWtlKSA6IFByZWQoUHJlZCksIE1ha2UoTWFrZSkge30KKyAgU291cmNlUHJlZChQcmVkVCBQcmVkLCBOb25lVHlwZSkgOiBQcmVkKFByZWQpIHsKKyAgICBNYWtlID0gW1ByZWRdKEFycmF5UmVmPFZhbHVlICo+IEN1ciwgQXJyYXlSZWY8VHlwZSAqPiBCYXNlVHlwZXMpIHsKKyAgICAgIC8vIERlZmF1bHQgZmlsdGVyIGp1c3QgY2FsbHMgUHJlZCBvbiBlYWNoIG9mIHRoZSBiYXNlIHR5cGVzLgorICAgICAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQgKj4gUmVzdWx0OworICAgICAgZm9yIChUeXBlICpUIDogQmFzZVR5cGVzKSB7CisgICAgICAgIENvbnN0YW50ICpWID0gVW5kZWZWYWx1ZTo6Z2V0KFQpOworICAgICAgICBpZiAoUHJlZChDdXIsIFYpKQorICAgICAgICAgIG1ha2VDb25zdGFudHNXaXRoVHlwZShULCBSZXN1bHQpOworICAgICAgfQorICAgICAgaWYgKFJlc3VsdC5lbXB0eSgpKQorICAgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoIlByZWRpY2F0ZSBkb2VzIG5vdCBtYXRjaCBmb3IgYmFzZSB0eXBlcyIpOworICAgICAgcmV0dXJuIFJlc3VsdDsKKyAgICB9OworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBcYyBOZXcgaXMgY29tcGF0aWJsZSBmb3IgdGhlIGFyZ3VtZW50IGFmdGVyIFxjIEN1cgorICBib29sIG1hdGNoZXMoQXJyYXlSZWY8VmFsdWUgKj4gQ3VyLCBjb25zdCBWYWx1ZSAqTmV3KSB7CisgICAgcmV0dXJuIFByZWQoQ3VyLCBOZXcpOworICB9CisKKyAgLy8vIEdlbmVyYXRlcyBhIGxpc3Qgb2YgcG90ZW50aWFsIHZhbHVlcyBmb3IgdGhlIGFyZ3VtZW50IGFmdGVyIFxjIEN1ci4KKyAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQgKj4gZ2VuZXJhdGUoQXJyYXlSZWY8VmFsdWUgKj4gQ3VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUeXBlICo+IEJhc2VUeXBlcykgeworICAgIHJldHVybiBNYWtlKEN1ciwgQmFzZVR5cGVzKTsKKyAgfQorfTsKKworLy8vIEEgZGVzY3JpcHRpb24gb2Ygc29tZSBvcGVyYXRpb24gd2UgY2FuIGJ1aWxkIHdoaWxlIGZ1enppbmcgSVIuCitzdHJ1Y3QgT3BEZXNjcmlwdG9yIHsKKyAgdW5zaWduZWQgV2VpZ2h0OworICBTbWFsbFZlY3RvcjxTb3VyY2VQcmVkLCAyPiBTb3VyY2VQcmVkczsKKyAgc3RkOjpmdW5jdGlvbjxWYWx1ZSAqKEFycmF5UmVmPFZhbHVlICo+LCBJbnN0cnVjdGlvbiAqKT4gQnVpbGRlckZ1bmM7Cit9OworCitzdGF0aWMgaW5saW5lIFNvdXJjZVByZWQgb25seVR5cGUoVHlwZSAqT25seSkgeworICBhdXRvIFByZWQgPSBbT25seV0oQXJyYXlSZWY8VmFsdWUgKj4sIGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFR5cGUoKSA9PSBPbmx5OworICB9OworICBhdXRvIE1ha2UgPSBbT25seV0oQXJyYXlSZWY8VmFsdWUgKj4sIEFycmF5UmVmPFR5cGUgKj4pIHsKKyAgICByZXR1cm4gbWFrZUNvbnN0YW50c1dpdGhUeXBlKE9ubHkpOworICB9OworICByZXR1cm4ge1ByZWQsIE1ha2V9OworfQorCitzdGF0aWMgaW5saW5lIFNvdXJjZVByZWQgYW55VHlwZSgpIHsKKyAgYXV0byBQcmVkID0gW10oQXJyYXlSZWY8VmFsdWUgKj4sIGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuICFWLT5nZXRUeXBlKCktPmlzVm9pZFR5KCk7CisgIH07CisgIGF1dG8gTWFrZSA9IE5vbmU7CisgIHJldHVybiB7UHJlZCwgTWFrZX07Cit9CisKK3N0YXRpYyBpbmxpbmUgU291cmNlUHJlZCBhbnlJbnRUeXBlKCkgeworICBhdXRvIFByZWQgPSBbXShBcnJheVJlZjxWYWx1ZSAqPiwgY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VHlwZSgpLT5pc0ludGVnZXJUeSgpOworICB9OworICBhdXRvIE1ha2UgPSBOb25lOworICByZXR1cm4ge1ByZWQsIE1ha2V9OworfQorCitzdGF0aWMgaW5saW5lIFNvdXJjZVByZWQgYW55RmxvYXRUeXBlKCkgeworICBhdXRvIFByZWQgPSBbXShBcnJheVJlZjxWYWx1ZSAqPiwgY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VHlwZSgpLT5pc0Zsb2F0aW5nUG9pbnRUeSgpOworICB9OworICBhdXRvIE1ha2UgPSBOb25lOworICByZXR1cm4ge1ByZWQsIE1ha2V9OworfQorCitzdGF0aWMgaW5saW5lIFNvdXJjZVByZWQgYW55UHRyVHlwZSgpIHsKKyAgYXV0byBQcmVkID0gW10oQXJyYXlSZWY8VmFsdWUgKj4sIGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFR5cGUoKS0+aXNQb2ludGVyVHkoKSAmJiAhVi0+aXNTd2lmdEVycm9yKCk7CisgIH07CisgIGF1dG8gTWFrZSA9IFtdKEFycmF5UmVmPFZhbHVlICo+LCBBcnJheVJlZjxUeXBlICo+IFRzKSB7CisgICAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQgKj4gUmVzdWx0OworICAgIC8vIFRPRE86IFNob3VsZCB0aGVzZSBwb2ludCBhdCBzb21ldGhpbmc/CisgICAgZm9yIChUeXBlICpUIDogVHMpCisgICAgICBSZXN1bHQucHVzaF9iYWNrKFVuZGVmVmFsdWU6OmdldChQb2ludGVyVHlwZTo6Z2V0VW5xdWFsKFQpKSk7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfTsKKyAgcmV0dXJuIHtQcmVkLCBNYWtlfTsKK30KKworc3RhdGljIGlubGluZSBTb3VyY2VQcmVkIHNpemVkUHRyVHlwZSgpIHsKKyAgYXV0byBQcmVkID0gW10oQXJyYXlSZWY8VmFsdWUgKj4sIGNvbnN0IFZhbHVlICpWKSB7CisgICAgaWYgKFYtPmlzU3dpZnRFcnJvcigpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKGNvbnN0IGF1dG8gKlB0clQgPSBkeW5fY2FzdDxQb2ludGVyVHlwZT4oVi0+Z2V0VHlwZSgpKSkKKyAgICAgIHJldHVybiBQdHJULT5nZXRFbGVtZW50VHlwZSgpLT5pc1NpemVkKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9OworICBhdXRvIE1ha2UgPSBbXShBcnJheVJlZjxWYWx1ZSAqPiwgQXJyYXlSZWY8VHlwZSAqPiBUcykgeworICAgIHN0ZDo6dmVjdG9yPENvbnN0YW50ICo+IFJlc3VsdDsKKworICAgIGZvciAoVHlwZSAqVCA6IFRzKQorICAgICAgaWYgKFQtPmlzU2l6ZWQoKSkKKyAgICAgICAgUmVzdWx0LnB1c2hfYmFjayhVbmRlZlZhbHVlOjpnZXQoUG9pbnRlclR5cGU6OmdldFVucXVhbChUKSkpOworCisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfTsKKyAgcmV0dXJuIHtQcmVkLCBNYWtlfTsKK30KKworc3RhdGljIGlubGluZSBTb3VyY2VQcmVkIGFueUFnZ3JlZ2F0ZVR5cGUoKSB7CisgIGF1dG8gUHJlZCA9IFtdKEFycmF5UmVmPFZhbHVlICo+LCBjb25zdCBWYWx1ZSAqVikgeworICAgIC8vIFdlIGNhbid0IGluZGV4IHplcm8gc2l6ZWQgYXJyYXlzLgorICAgIGlmIChpc2E8QXJyYXlUeXBlPihWLT5nZXRUeXBlKCkpKQorICAgICAgcmV0dXJuIFYtPmdldFR5cGUoKS0+Z2V0QXJyYXlOdW1FbGVtZW50cygpID4gMDsKKworICAgIC8vIFN0cnVjdHMgY2FuIGFsc28gYmUgemVybyBzaXplZC4gSS5lIG9wYXF1ZSB0eXBlcy4KKyAgICBpZiAoaXNhPFN0cnVjdFR5cGU+KFYtPmdldFR5cGUoKSkpCisgICAgICByZXR1cm4gVi0+Z2V0VHlwZSgpLT5nZXRTdHJ1Y3ROdW1FbGVtZW50cygpID4gMDsKKworICAgIHJldHVybiBWLT5nZXRUeXBlKCktPmlzQWdncmVnYXRlVHlwZSgpOworICB9OworICAvLyBUT0RPOiBGb3Igbm93IHdlIG9ubHkgZmluZCBhZ2dyZWdhdGVzIGluIEJhc2VUeXBlcy4gSXQgbWlnaHQgYmUgYmV0dGVyIHRvCisgIC8vIG1hbnVmYWN0dXJlIHRoZW0gb3V0IG9mIHRoZSBiYXNlIHR5cGVzIGluIHNvbWUgY2FzZXMuCisgIGF1dG8gRmluZCA9IE5vbmU7CisgIHJldHVybiB7UHJlZCwgRmluZH07Cit9CisKK3N0YXRpYyBpbmxpbmUgU291cmNlUHJlZCBhbnlWZWN0b3JUeXBlKCkgeworICBhdXRvIFByZWQgPSBbXShBcnJheVJlZjxWYWx1ZSAqPiwgY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VHlwZSgpLT5pc1ZlY3RvclR5KCk7CisgIH07CisgIC8vIFRPRE86IEZvciBub3cgd2Ugb25seSBmaW5kIHZlY3RvcnMgaW4gQmFzZVR5cGVzLiBJdCBtaWdodCBiZSBiZXR0ZXIgdG8KKyAgLy8gbWFudWZhY3R1cmUgdmVjdG9ycyBvdXQgb2YgdGhlIGJhc2UgdHlwZXMsIGJ1dCBpdCdzIHRyaWNreSB0byBiZSBzdXJlCisgIC8vIHRoYXQncyBhY3R1YWxseSBhIHJlYXNvbmFibGUgdHlwZS4KKyAgYXV0byBNYWtlID0gTm9uZTsKKyAgcmV0dXJuIHtQcmVkLCBNYWtlfTsKK30KKworLy8vIE1hdGNoIHZhbHVlcyB0aGF0IGhhdmUgdGhlIHNhbWUgdHlwZSBhcyB0aGUgZmlyc3Qgc291cmNlLgorc3RhdGljIGlubGluZSBTb3VyY2VQcmVkIG1hdGNoRmlyc3RUeXBlKCkgeworICBhdXRvIFByZWQgPSBbXShBcnJheVJlZjxWYWx1ZSAqPiBDdXIsIGNvbnN0IFZhbHVlICpWKSB7CisgICAgYXNzZXJ0KCFDdXIuZW1wdHkoKSAmJiAiTm8gZmlyc3Qgc291cmNlIHlldCIpOworICAgIHJldHVybiBWLT5nZXRUeXBlKCkgPT0gQ3VyWzBdLT5nZXRUeXBlKCk7CisgIH07CisgIGF1dG8gTWFrZSA9IFtdKEFycmF5UmVmPFZhbHVlICo+IEN1ciwgQXJyYXlSZWY8VHlwZSAqPikgeworICAgIGFzc2VydCghQ3VyLmVtcHR5KCkgJiYgIk5vIGZpcnN0IHNvdXJjZSB5ZXQiKTsKKyAgICByZXR1cm4gbWFrZUNvbnN0YW50c1dpdGhUeXBlKEN1clswXS0+Z2V0VHlwZSgpKTsKKyAgfTsKKyAgcmV0dXJuIHtQcmVkLCBNYWtlfTsKK30KKworLy8vIE1hdGNoIHZhbHVlcyB0aGF0IGhhdmUgdGhlIGZpcnN0IHNvdXJjZSdzIHNjYWxhciB0eXBlLgorc3RhdGljIGlubGluZSBTb3VyY2VQcmVkIG1hdGNoU2NhbGFyT2ZGaXJzdFR5cGUoKSB7CisgIGF1dG8gUHJlZCA9IFtdKEFycmF5UmVmPFZhbHVlICo+IEN1ciwgY29uc3QgVmFsdWUgKlYpIHsKKyAgICBhc3NlcnQoIUN1ci5lbXB0eSgpICYmICJObyBmaXJzdCBzb3VyY2UgeWV0Iik7CisgICAgcmV0dXJuIFYtPmdldFR5cGUoKSA9PSBDdXJbMF0tPmdldFR5cGUoKS0+Z2V0U2NhbGFyVHlwZSgpOworICB9OworICBhdXRvIE1ha2UgPSBbXShBcnJheVJlZjxWYWx1ZSAqPiBDdXIsIEFycmF5UmVmPFR5cGUgKj4pIHsKKyAgICBhc3NlcnQoIUN1ci5lbXB0eSgpICYmICJObyBmaXJzdCBzb3VyY2UgeWV0Iik7CisgICAgcmV0dXJuIG1ha2VDb25zdGFudHNXaXRoVHlwZShDdXJbMF0tPmdldFR5cGUoKS0+Z2V0U2NhbGFyVHlwZSgpKTsKKyAgfTsKKyAgcmV0dXJuIHtQcmVkLCBNYWtlfTsKK30KKworfSAvLyBlbmQgZnV6emVyb3AgbmFtZXNwYWNlCit9IC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gTExWTV9GVVpaTVVUQVRFX09QREVTQ1JJUFRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0Z1enpNdXRhdGUvT3BlcmF0aW9ucy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9GdXp6TXV0YXRlL09wZXJhdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NjhiZDk1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9GdXp6TXV0YXRlL09wZXJhdGlvbnMuaApAQCAtMCwwICsxLDU0IEBACisvLz09PS0tIE9wZXJhdGlvbnMuaCAtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBJbXBsZW1lbnRhdGlvbnMgb2YgY29tbW9uIGZ1enplciBvcGVyYXRpb24gZGVzY3JpcHRvcnMgZm9yIGJ1aWxkaW5nIGFuIElSCisvLyBtdXRhdG9yLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9GVVpaTVVUQVRFX09QRVJBVElPTlNfSAorI2RlZmluZSBMTFZNX0ZVWlpNVVRBVEVfT1BFUkFUSU9OU19ICisKKyNpbmNsdWRlICJsbHZtL0Z1enpNdXRhdGUvT3BEZXNjcmlwdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0clR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBHZXR0ZXJzIGZvciB0aGUgZGVmYXVsdCBzZXRzIG9mIG9wZXJhdGlvbnMsIHBlciBnZW5lcmFsIGNhdGVnb3J5LgorLy8vIEB7Cit2b2lkIGRlc2NyaWJlRnV6emVySW50T3BzKHN0ZDo6dmVjdG9yPGZ1enplcm9wOjpPcERlc2NyaXB0b3I+ICZPcHMpOwordm9pZCBkZXNjcmliZUZ1enplckZsb2F0T3BzKHN0ZDo6dmVjdG9yPGZ1enplcm9wOjpPcERlc2NyaXB0b3I+ICZPcHMpOwordm9pZCBkZXNjcmliZUZ1enplckNvbnRyb2xGbG93T3BzKHN0ZDo6dmVjdG9yPGZ1enplcm9wOjpPcERlc2NyaXB0b3I+ICZPcHMpOwordm9pZCBkZXNjcmliZUZ1enplclBvaW50ZXJPcHMoc3RkOjp2ZWN0b3I8ZnV6emVyb3A6Ok9wRGVzY3JpcHRvcj4gJk9wcyk7Cit2b2lkIGRlc2NyaWJlRnV6emVyQWdncmVnYXRlT3BzKHN0ZDo6dmVjdG9yPGZ1enplcm9wOjpPcERlc2NyaXB0b3I+ICZPcHMpOwordm9pZCBkZXNjcmliZUZ1enplclZlY3Rvck9wcyhzdGQ6OnZlY3RvcjxmdXp6ZXJvcDo6T3BEZXNjcmlwdG9yPiAmT3BzKTsKKy8vLyBAfQorCituYW1lc3BhY2UgZnV6emVyb3AgeworCisvLy8gRGVzY3JpcHRvcnMgZm9yIGluZGl2aWR1YWwgb3BlcmF0aW9ucy4KKy8vLyBAeworT3BEZXNjcmlwdG9yIGJpbk9wRGVzY3JpcHRvcih1bnNpZ25lZCBXZWlnaHQsIEluc3RydWN0aW9uOjpCaW5hcnlPcHMgT3ApOworT3BEZXNjcmlwdG9yIGNtcE9wRGVzY3JpcHRvcih1bnNpZ25lZCBXZWlnaHQsIEluc3RydWN0aW9uOjpPdGhlck9wcyBDbXBPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ21wSW5zdDo6UHJlZGljYXRlIFByZWQpOworT3BEZXNjcmlwdG9yIHNwbGl0QmxvY2tEZXNjcmlwdG9yKHVuc2lnbmVkIFdlaWdodCk7CitPcERlc2NyaXB0b3IgZ2VwRGVzY3JpcHRvcih1bnNpZ25lZCBXZWlnaHQpOworT3BEZXNjcmlwdG9yIGV4dHJhY3RWYWx1ZURlc2NyaXB0b3IodW5zaWduZWQgV2VpZ2h0KTsKK09wRGVzY3JpcHRvciBpbnNlcnRWYWx1ZURlc2NyaXB0b3IodW5zaWduZWQgV2VpZ2h0KTsKK09wRGVzY3JpcHRvciBleHRyYWN0RWxlbWVudERlc2NyaXB0b3IodW5zaWduZWQgV2VpZ2h0KTsKK09wRGVzY3JpcHRvciBpbnNlcnRFbGVtZW50RGVzY3JpcHRvcih1bnNpZ25lZCBXZWlnaHQpOworT3BEZXNjcmlwdG9yIHNodWZmbGVWZWN0b3JEZXNjcmlwdG9yKHVuc2lnbmVkIFdlaWdodCk7CisvLy8gQH0KKworfSAvLyBlbmQgZnV6emVyb3AgbmFtZXNwYWNlCisKK30gLy8gZW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZiAvLyBMTFZNX0ZVWlpNVVRBVEVfT1BFUkFUSU9OU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0Z1enpNdXRhdGUvUmFuZG9tLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0Z1enpNdXRhdGUvUmFuZG9tLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2E1ZjQ2YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRnV6ek11dGF0ZS9SYW5kb20uaApAQCAtMCwwICsxLDk3IEBACisvLz09PS0tLSBSYW5kb20uaCAtIFV0aWxpdGllcyBmb3IgcmFuZG9tIHNhbXBsaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFV0aWxpdGllcyBmb3IgcmFuZG9tIHNhbXBsaW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9GVVpaTVVUQVRFX1JBTkRPTV9ICisjZGVmaW5lIExMVk1fRlVaWk1VVEFURV9SQU5ET01fSAorCisjaW5jbHVkZSA8cmFuZG9tPgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorbmFtZXNwYWNlIGxsdm0geworCisvLy8gUmV0dXJuIGEgdW5pZm9ybWx5IGRpc3RyaWJ1dGVkIHJhbmRvbSB2YWx1ZSBiZXR3ZWVuIFxjIE1pbiBhbmQgXGMgTWF4Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgR2VuVD4gVCB1bmlmb3JtKEdlblQgJkdlbiwgVCBNaW4sIFQgTWF4KSB7CisgIHJldHVybiBzdGQ6OnVuaWZvcm1faW50X2Rpc3RyaWJ1dGlvbjxUPihNaW4sIE1heCkoR2VuKTsKK30KKworLy8vIFJldHVybiBhIHVuaWZvcm1seSBkaXN0cmlidXRlZCByYW5kb20gdmFsdWUgb2YgdHlwZSBcYyBUCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgR2VuVD4gVCB1bmlmb3JtKEdlblQgJkdlbikgeworICByZXR1cm4gdW5pZm9ybTxUPihHZW4sIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1pbigpLAorICAgICAgICAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKSk7Cit9CisKKy8vLyBSYW5kb21seSBzZWxlY3RzIGFuIGl0ZW0gYnkgc2FtcGxpbmcgaW50byBhIHNldCB3aXRoIGFuIHVua25vd24gbnVtYmVyIG9mCisvLy8gZWxlbWVudHMsIHdoaWNoIG1heSBlYWNoIGJlIHdlaWdodGVkIHRvIGJlIG1vcmUgbGlrZWx5IGNob2ljZXMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgR2VuVD4gY2xhc3MgUmVzZXJ2b2lyU2FtcGxlciB7CisgIEdlblQgJlJhbmRHZW47CisgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX2NvbnN0PFQ+Ojp0eXBlIFNlbGVjdGlvbiA9IHt9OworICB1aW50NjRfdCBUb3RhbFdlaWdodCA9IDA7CisKK3B1YmxpYzoKKyAgUmVzZXJ2b2lyU2FtcGxlcihHZW5UICZSYW5kR2VuKSA6IFJhbmRHZW4oUmFuZEdlbikge30KKworICB1aW50NjRfdCB0b3RhbFdlaWdodCgpIGNvbnN0IHsgcmV0dXJuIFRvdGFsV2VpZ2h0OyB9CisgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFRvdGFsV2VpZ2h0ID09IDA7IH0KKworICBjb25zdCBUICZnZXRTZWxlY3Rpb24oKSBjb25zdCB7CisgICAgYXNzZXJ0KCFpc0VtcHR5KCkgJiYgIk5vdGhpbmcgc2VsZWN0ZWQiKTsKKyAgICByZXR1cm4gU2VsZWN0aW9uOworICB9CisKKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuICFpc0VtcHR5KCk7fQorICBjb25zdCBUICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBnZXRTZWxlY3Rpb24oKTsgfQorCisgIC8vLyBTYW1wbGUgZWFjaCBpdGVtIGluIFxjIEl0ZW1zIHdpdGggdW5pdCB3ZWlnaHQKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFJhbmdlVD4gUmVzZXJ2b2lyU2FtcGxlciAmc2FtcGxlKFJhbmdlVCAmJkl0ZW1zKSB7CisgICAgZm9yIChhdXRvICZJIDogSXRlbXMpCisgICAgICBzYW1wbGUoSSwgMSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFNhbXBsZSBhIHNpbmdsZSBpdGVtIHdpdGggdGhlIGdpdmVuIHdlaWdodC4KKyAgUmVzZXJ2b2lyU2FtcGxlciAmc2FtcGxlKGNvbnN0IFQgJkl0ZW0sIHVpbnQ2NF90IFdlaWdodCkgeworICAgIGlmICghV2VpZ2h0KQorICAgICAgLy8gSWYgdGhlIHdlaWdodCBpcyB6ZXJvLCBkbyBub3RoaW5nLgorICAgICAgcmV0dXJuICp0aGlzOworICAgIFRvdGFsV2VpZ2h0ICs9IFdlaWdodDsKKyAgICAvLyBDb25zaWRlciBzd2l0Y2hpbmcgZnJvbSB0aGUgY3VycmVudCBlbGVtZW50IHRvIHRoaXMgb25lLgorICAgIGlmICh1bmlmb3JtPHVpbnQ2NF90PihSYW5kR2VuLCAxLCBUb3RhbFdlaWdodCkgPD0gV2VpZ2h0KQorICAgICAgU2VsZWN0aW9uID0gSXRlbTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5ULCB0eXBlbmFtZSBSYW5nZVQsCisgICAgICAgICAgdHlwZW5hbWUgRWxUID0gdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPAorICAgICAgICAgICAgICBkZWNsdHlwZSgqc3RkOjpiZWdpbihzdGQ6OmRlY2x2YWw8UmFuZ2VUPigpKSk+Ojp0eXBlPgorUmVzZXJ2b2lyU2FtcGxlcjxFbFQsIEdlblQ+IG1ha2VTYW1wbGVyKEdlblQgJlJhbmRHZW4sIFJhbmdlVCAmJkl0ZW1zKSB7CisgIFJlc2Vydm9pclNhbXBsZXI8RWxULCBHZW5UPiBSUyhSYW5kR2VuKTsKKyAgUlMuc2FtcGxlKEl0ZW1zKTsKKyAgcmV0dXJuIFJTOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuVCwgdHlwZW5hbWUgVD4KK1Jlc2Vydm9pclNhbXBsZXI8VCwgR2VuVD4gbWFrZVNhbXBsZXIoR2VuVCAmUmFuZEdlbiwgY29uc3QgVCAmSXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgV2VpZ2h0KSB7CisgIFJlc2Vydm9pclNhbXBsZXI8VCwgR2VuVD4gUlMoUmFuZEdlbik7CisgIFJTLnNhbXBsZShJdGVtLCBXZWlnaHQpOworICByZXR1cm4gUlM7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBHZW5UPgorUmVzZXJ2b2lyU2FtcGxlcjxULCBHZW5UPiBtYWtlU2FtcGxlcihHZW5UICZSYW5kR2VuKSB7CisgIHJldHVybiBSZXNlcnZvaXJTYW1wbGVyPFQsIEdlblQ+KFJhbmRHZW4pOworfQorCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gTExWTV9GVVpaTVVUQVRFX1JBTkRPTV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0Z1enpNdXRhdGUvUmFuZG9tSVJCdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0Z1enpNdXRhdGUvUmFuZG9tSVJCdWlsZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNmM2YwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vRnV6ek11dGF0ZS9SYW5kb21JUkJ1aWxkZXIuaApAQCAtMCwwICsxLDYyIEBACisvLz09PS0tIE11dGF0b3IuaCAtIFV0aWxzIGZvciByYW5kb21seSBtdXRhdGlvbiBJUiAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFByb3ZpZGVzIHRoZSBNdXRhdG9yIGNsYXNzLCB3aGljaCBpcyB1c2VkIHRvIG11dGF0ZSBJUiBmb3IgZnV6emluZy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fRlVaWk1VVEFURV9SQU5ET01JUkJVSUxERVJfSAorI2RlZmluZSBMTFZNX0ZVWlpNVVRBVEVfUkFORE9NSVJCVUlMREVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9GdXp6TXV0YXRlL0lSTXV0YXRvci5oIgorI2luY2x1ZGUgImxsdm0vRnV6ek11dGF0ZS9SYW5kb20uaCIKKyNpbmNsdWRlIDxyYW5kb20+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordXNpbmcgUmFuZG9tRW5naW5lID0gc3RkOjptdDE5OTM3OworCitzdHJ1Y3QgUmFuZG9tSVJCdWlsZGVyIHsKKyAgUmFuZG9tRW5naW5lIFJhbmQ7CisgIFNtYWxsVmVjdG9yPFR5cGUgKiwgMTY+IEtub3duVHlwZXM7CisKKyAgUmFuZG9tSVJCdWlsZGVyKGludCBTZWVkLCBBcnJheVJlZjxUeXBlICo+IEFsbG93ZWRUeXBlcykKKyAgICAgIDogUmFuZChTZWVkKSwgS25vd25UeXBlcyhBbGxvd2VkVHlwZXMuYmVnaW4oKSwgQWxsb3dlZFR5cGVzLmVuZCgpKSB7fQorCisgIC8vIFRPRE86IFRyeSB0byBtYWtlIHRoaXMgYSBiaXQgbGVzcyBvZiBhIHJhbmRvbSBtaXNobWFzaCBvZiBmdW5jdGlvbnMuCisKKyAgLy8vIEZpbmQgYSAic291cmNlIiBmb3Igc29tZSBvcGVyYXRpb24sIHdoaWNoIHdpbGwgYmUgdXNlZCBpbiBvbmUgb2YgdGhlCisgIC8vLyBvcGVyYXRpb24ncyBvcGVyYW5kcy4gVGhpcyBlaXRoZXIgc2VsZWN0cyBhbiBpbnN0cnVjdGlvbiBpbiBcYyBJbnN0cyBvcgorICAvLy8gcmV0dXJucyBzb21lIG5ldyBhcmJpdHJhcnkgVmFsdWUuCisgIFZhbHVlICpmaW5kT3JDcmVhdGVTb3VyY2UoQmFzaWNCbG9jayAmQkIsIEFycmF5UmVmPEluc3RydWN0aW9uICo+IEluc3RzKTsKKyAgLy8vIEZpbmQgYSAic291cmNlIiBmb3Igc29tZSBvcGVyYXRpb24sIHdoaWNoIHdpbGwgYmUgdXNlZCBpbiBvbmUgb2YgdGhlCisgIC8vLyBvcGVyYXRpb24ncyBvcGVyYW5kcy4gVGhpcyBlaXRoZXIgc2VsZWN0cyBhbiBpbnN0cnVjdGlvbiBpbiBcYyBJbnN0cyB0aGF0CisgIC8vLyBtYXRjaGVzIFxjIFByZWQsIG9yIHJldHVybnMgc29tZSBuZXcgVmFsdWUgdGhhdCBtYXRjaGVzIFxjIFByZWQuIFRoZQorICAvLy8gdmFsdWVzIGluIFxjIFNyY3Mgc2hvdWxkIGJlIHNvdXJjZSBvcGVyYW5kcyB0aGF0IGhhdmUgYWxyZWFkeSBiZWVuCisgIC8vLyBzZWxlY3RlZC4KKyAgVmFsdWUgKmZpbmRPckNyZWF0ZVNvdXJjZShCYXNpY0Jsb2NrICZCQiwgQXJyYXlSZWY8SW5zdHJ1Y3Rpb24gKj4gSW5zdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gU3JjcywgZnV6emVyb3A6OlNvdXJjZVByZWQgUHJlZCk7CisgIC8vLyBDcmVhdGUgc29tZSBWYWx1ZSBzdWl0YWJsZSBhcyBhIHNvdXJjZSBmb3Igc29tZSBvcGVyYXRpb24uCisgIFZhbHVlICpuZXdTb3VyY2UoQmFzaWNCbG9jayAmQkIsIEFycmF5UmVmPEluc3RydWN0aW9uICo+IEluc3RzLAorICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IFNyY3MsIGZ1enplcm9wOjpTb3VyY2VQcmVkIFByZWQpOworICAvLy8gRmluZCBhIHZpYWJsZSB1c2VyIGZvciBcYyBWIGluIFxjIEluc3RzLCB3aGljaCBzaG91bGQgYWxsIGJlIGNvbnRhaW5lZCBpbgorICAvLy8gXGMgQkIuIFRoaXMgbWF5IGFsc28gY3JlYXRlIHNvbWUgbmV3IGluc3RydWN0aW9uIGluIFxjIEJCIGFuZCB1c2UgdGhhdC4KKyAgdm9pZCBjb25uZWN0VG9TaW5rKEJhc2ljQmxvY2sgJkJCLCBBcnJheVJlZjxJbnN0cnVjdGlvbiAqPiBJbnN0cywgVmFsdWUgKlYpOworICAvLy8gQ3JlYXRlIGEgdXNlciBmb3IgXGMgViBpbiBcYyBCQi4KKyAgdm9pZCBuZXdTaW5rKEJhc2ljQmxvY2sgJkJCLCBBcnJheVJlZjxJbnN0cnVjdGlvbiAqPiBJbnN0cywgVmFsdWUgKlYpOworICBWYWx1ZSAqZmluZFBvaW50ZXIoQmFzaWNCbG9jayAmQkIsIEFycmF5UmVmPEluc3RydWN0aW9uICo+IEluc3RzLAorICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gU3JjcywgZnV6emVyb3A6OlNvdXJjZVByZWQgUHJlZCk7CisgIFR5cGUgKmNob29zZVR5cGUoTExWTUNvbnRleHQgJkNvbnRleHQsIEFycmF5UmVmPFZhbHVlICo+IFNyY3MsCisgICAgICAgICAgICAgICAgICAgZnV6emVyb3A6OlNvdXJjZVByZWQgUHJlZCk7Cit9OworCit9IC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYgLy8gTExWTV9GVVpaTVVUQVRFX1JBTkRPTUlSQlVJTERFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0FyZ3VtZW50LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0FyZ3VtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk3ZGNhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQXJndW1lbnQuaApAQCAtMCwwICsxLDEzMCBAQAorLy89PT0tLSBsbHZtL0FyZ3VtZW50LmggLSBEZWZpbml0aW9uIG9mIHRoZSBBcmd1bWVudCBjbGFzcyAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIEFyZ3VtZW50IGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9BUkdVTUVOVF9ICisjZGVmaW5lIExMVk1fSVJfQVJHVU1FTlRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdF9ub2RlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9BdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW4gaW5jb21pbmcgZm9ybWFsIGFyZ3VtZW50IHRvIGEgRnVuY3Rpb24uIEEgZm9ybWFsCisvLy8gYXJndW1lbnQsIHNpbmNlIGl0IGlzIGBgZm9ybWFsJycsIGRvZXMgbm90IGNvbnRhaW4gYW4gYWN0dWFsIHZhbHVlIGJ1dAorLy8vIGluc3RlYWQgcmVwcmVzZW50cyB0aGUgdHlwZSwgYXJndW1lbnQgbnVtYmVyLCBhbmQgYXR0cmlidXRlcyBvZiBhbiBhcmd1bWVudAorLy8vIGZvciBhIHNwZWNpZmljIGZ1bmN0aW9uLiBXaGVuIHVzZWQgaW4gdGhlIGJvZHkgb2Ygc2FpZCBmdW5jdGlvbiwgdGhlCisvLy8gYXJndW1lbnQgb2YgY291cnNlIHJlcHJlc2VudHMgdGhlIHZhbHVlIG9mIHRoZSBhY3R1YWwgYXJndW1lbnQgdGhhdCB0aGUKKy8vLyBmdW5jdGlvbiB3YXMgY2FsbGVkIHdpdGguCitjbGFzcyBBcmd1bWVudCBmaW5hbCA6IHB1YmxpYyBWYWx1ZSB7CisgIEZ1bmN0aW9uICpQYXJlbnQ7CisgIHVuc2lnbmVkIEFyZ05vOworCisgIGZyaWVuZCBjbGFzcyBGdW5jdGlvbjsKKyAgdm9pZCBzZXRQYXJlbnQoRnVuY3Rpb24gKnBhcmVudCk7CisKK3B1YmxpYzoKKyAgLy8vIEFyZ3VtZW50IGNvbnN0cnVjdG9yLgorICBleHBsaWNpdCBBcmd1bWVudChUeXBlICpUeSwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwgRnVuY3Rpb24gKkYgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBcmdObyA9IDApOworCisgIGlubGluZSBjb25zdCBGdW5jdGlvbiAqZ2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4gUGFyZW50OyB9CisgIGlubGluZSAgICAgICBGdW5jdGlvbiAqZ2V0UGFyZW50KCkgICAgICAgeyByZXR1cm4gUGFyZW50OyB9CisKKyAgLy8vIFJldHVybiB0aGUgaW5kZXggb2YgdGhpcyBmb3JtYWwgYXJndW1lbnQgaW4gaXRzIGNvbnRhaW5pbmcgZnVuY3Rpb24uCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUgaW4gInZvaWQgZm9vKGludCBhLCBmbG9hdCBiKSIgYSBpcyAwIGFuZCBiIGlzIDEuCisgIHVuc2lnbmVkIGdldEFyZ05vKCkgY29uc3QgeworICAgIGFzc2VydChQYXJlbnQgJiYgImNhbid0IGdldCBudW1iZXIgb2YgdW5wYXJlbnRlZCBhcmciKTsKKyAgICByZXR1cm4gQXJnTm87CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBhcmd1bWVudCBoYXMgdGhlIG5vbm51bGwgYXR0cmlidXRlLiBBbHNvIHJldHVybnMgdHJ1ZQorICAvLy8gaWYgYXQgbGVhc3Qgb25lIGJ5dGUgaXMga25vd24gdG8gYmUgZGVyZWZlcmVuY2VhYmxlIGFuZCB0aGUgcG9pbnRlciBpcyBpbgorICAvLy8gYWRkcnNwYWNlKDApLgorICBib29sIGhhc05vbk51bGxBdHRyKCkgY29uc3Q7CisKKyAgLy8vIElmIHRoaXMgYXJndW1lbnQgaGFzIHRoZSBkZXJlZmVyZW5jZWFibGUgYXR0cmlidXRlLCByZXR1cm4gdGhlIG51bWJlciBvZgorICAvLy8gYnl0ZXMga25vd24gdG8gYmUgZGVyZWZlcmVuY2VhYmxlLiBPdGhlcndpc2UsIHplcm8gaXMgcmV0dXJuZWQuCisgIHVpbnQ2NF90IGdldERlcmVmZXJlbmNlYWJsZUJ5dGVzKCkgY29uc3Q7CisKKyAgLy8vIElmIHRoaXMgYXJndW1lbnQgaGFzIHRoZSBkZXJlZmVyZW5jZWFibGVfb3JfbnVsbCBhdHRyaWJ1dGUsIHJldHVybiB0aGUKKyAgLy8vIG51bWJlciBvZiBieXRlcyBrbm93biB0byBiZSBkZXJlZmVyZW5jZWFibGUuIE90aGVyd2lzZSwgemVybyBpcyByZXR1cm5lZC4KKyAgdWludDY0X3QgZ2V0RGVyZWZlcmVuY2VhYmxlT3JOdWxsQnl0ZXMoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBhcmd1bWVudCBoYXMgdGhlIGJ5dmFsIGF0dHJpYnV0ZS4KKyAgYm9vbCBoYXNCeVZhbEF0dHIoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBhcmd1bWVudCBoYXMgdGhlIHN3aWZ0c2VsZiBhdHRyaWJ1dGUuCisgIGJvb2wgaGFzU3dpZnRTZWxmQXR0cigpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFyZ3VtZW50IGhhcyB0aGUgc3dpZnRlcnJvciBhdHRyaWJ1dGUuCisgIGJvb2wgaGFzU3dpZnRFcnJvckF0dHIoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBhcmd1bWVudCBoYXMgdGhlIGJ5dmFsIGF0dHJpYnV0ZSBvciBpbmFsbG9jYQorICAvLy8gYXR0cmlidXRlLiBUaGVzZSBhdHRyaWJ1dGVzIHJlcHJlc2VudCBhcmd1bWVudHMgYmVpbmcgcGFzc2VkIGJ5IHZhbHVlLgorICBib29sIGhhc0J5VmFsT3JJbkFsbG9jYUF0dHIoKSBjb25zdDsKKworICAvLy8gSWYgdGhpcyBpcyBhIGJ5dmFsIG9yIGluYWxsb2NhIGFyZ3VtZW50LCByZXR1cm4gaXRzIGFsaWdubWVudC4KKyAgdW5zaWduZWQgZ2V0UGFyYW1BbGlnbm1lbnQoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBhcmd1bWVudCBoYXMgdGhlIG5lc3QgYXR0cmlidXRlLgorICBib29sIGhhc05lc3RBdHRyKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgYXJndW1lbnQgaGFzIHRoZSBub2FsaWFzIGF0dHJpYnV0ZS4KKyAgYm9vbCBoYXNOb0FsaWFzQXR0cigpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFyZ3VtZW50IGhhcyB0aGUgbm9jYXB0dXJlIGF0dHJpYnV0ZS4KKyAgYm9vbCBoYXNOb0NhcHR1cmVBdHRyKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgYXJndW1lbnQgaGFzIHRoZSBzcmV0IGF0dHJpYnV0ZS4KKyAgYm9vbCBoYXNTdHJ1Y3RSZXRBdHRyKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgYXJndW1lbnQgaGFzIHRoZSByZXR1cm5lZCBhdHRyaWJ1dGUuCisgIGJvb2wgaGFzUmV0dXJuZWRBdHRyKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgYXJndW1lbnQgaGFzIHRoZSByZWFkb25seSBvciByZWFkbm9uZSBhdHRyaWJ1dGUuCisgIGJvb2wgb25seVJlYWRzTWVtb3J5KCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgYXJndW1lbnQgaGFzIHRoZSBpbmFsbG9jYSBhdHRyaWJ1dGUuCisgIGJvb2wgaGFzSW5BbGxvY2FBdHRyKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgYXJndW1lbnQgaGFzIHRoZSB6ZXh0IGF0dHJpYnV0ZS4KKyAgYm9vbCBoYXNaRXh0QXR0cigpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGFyZ3VtZW50IGhhcyB0aGUgc2V4dCBhdHRyaWJ1dGUuCisgIGJvb2wgaGFzU0V4dEF0dHIoKSBjb25zdDsKKworICAvLy8gQWRkIGF0dHJpYnV0ZXMgdG8gYW4gYXJndW1lbnQuCisgIHZvaWQgYWRkQXR0cnMoQXR0ckJ1aWxkZXIgJkIpOworCisgIHZvaWQgYWRkQXR0cihBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpOworCisgIHZvaWQgYWRkQXR0cihBdHRyaWJ1dGUgQXR0cik7CisKKyAgLy8vIFJlbW92ZSBhdHRyaWJ1dGVzIGZyb20gYW4gYXJndW1lbnQuCisgIHZvaWQgcmVtb3ZlQXR0cihBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpOworCisgIC8vLyBDaGVjayBpZiBhbiBhcmd1bWVudCBoYXMgYSBnaXZlbiBhdHRyaWJ1dGUuCisgIGJvb2wgaGFzQXR0cmlidXRlKEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3Q7CisKKyAgLy8vIE1ldGhvZCBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdC4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gQXJndW1lbnRWYWw7CisgIH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Bc3NlbWJseUFubm90YXRpb25Xcml0ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQXNzZW1ibHlBbm5vdGF0aW9uV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUxZjVjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQXNzZW1ibHlBbm5vdGF0aW9uV3JpdGVyLmgKQEAgLTAsMCArMSw2MiBAQAorLy89PT0tLSBBc3NlbWJseUFubm90YXRpb25Xcml0ZXIuaCAtIEFubm90YXRpb24gLmxsIGZpbGVzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDbGllbnRzIG9mIHRoZSBhc3NlbWJseSB3cml0ZXIgY2FuIHVzZSB0aGlzIGludGVyZmFjZSB0byBhZGQgdGhlaXIgb3duCisvLyBzcGVjaWFsLXB1cnBvc2UgYW5ub3RhdGlvbnMgdG8gTExWTSBhc3NlbWJseSBsYW5ndWFnZSBwcmludG91dHMuICBOb3RlIHRoYXQKKy8vIHRoZSBhc3NlbWJseSBwYXJzZXIgd29uJ3QgYmUgYWJsZSB0byBwYXJzZSB0aGVzZSwgaW4gZ2VuZXJhbCwgc28KKy8vIGltcGxlbWVudGF0aW9ucyBhcmUgYWR2aXNlZCB0byBwcmludCBzdHVmZiBhcyBMTFZNIGNvbW1lbnRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9BU1NFTUJMWUFOTk9UQVRJT05XUklURVJfSAorI2RlZmluZSBMTFZNX0lSX0FTU0VNQkxZQU5OT1RBVElPTldSSVRFUl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBWYWx1ZTsKK2NsYXNzIGZvcm1hdHRlZF9yYXdfb3N0cmVhbTsKKworY2xhc3MgQXNzZW1ibHlBbm5vdGF0aW9uV3JpdGVyIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+QXNzZW1ibHlBbm5vdGF0aW9uV3JpdGVyKCk7CisKKyAgLy8vIGVtaXRGdW5jdGlvbkFubm90IC0gVGhpcyBtYXkgYmUgaW1wbGVtZW50ZWQgdG8gZW1pdCBhIHN0cmluZyByaWdodCBiZWZvcmUKKyAgLy8vIHRoZSBzdGFydCBvZiBhIGZ1bmN0aW9uLgorICB2aXJ0dWFsIHZvaWQgZW1pdEZ1bmN0aW9uQW5ub3QoY29uc3QgRnVuY3Rpb24gKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSAmKSB7fQorCisgIC8vLyBlbWl0QmFzaWNCbG9ja1N0YXJ0QW5ub3QgLSBUaGlzIG1heSBiZSBpbXBsZW1lbnRlZCB0byBlbWl0IGEgc3RyaW5nIHJpZ2h0CisgIC8vLyBhZnRlciB0aGUgYmFzaWMgYmxvY2sgbGFiZWwsIGJ1dCBiZWZvcmUgdGhlIGZpcnN0IGluc3RydWN0aW9uIGluIHRoZQorICAvLy8gYmxvY2suCisgIHZpcnR1YWwgdm9pZCBlbWl0QmFzaWNCbG9ja1N0YXJ0QW5ub3QoY29uc3QgQmFzaWNCbG9jayAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSAmKSB7CisgIH0KKworICAvLy8gZW1pdEJhc2ljQmxvY2tFbmRBbm5vdCAtIFRoaXMgbWF5IGJlIGltcGxlbWVudGVkIHRvIGVtaXQgYSBzdHJpbmcgcmlnaHQKKyAgLy8vIGFmdGVyIHRoZSBiYXNpYyBibG9jay4KKyAgdmlydHVhbCB2b2lkIGVtaXRCYXNpY0Jsb2NrRW5kQW5ub3QoY29uc3QgQmFzaWNCbG9jayAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJikgeworICB9CisKKyAgLy8vIGVtaXRJbnN0cnVjdGlvbkFubm90IC0gVGhpcyBtYXkgYmUgaW1wbGVtZW50ZWQgdG8gZW1pdCBhIHN0cmluZyByaWdodAorICAvLy8gYmVmb3JlIGFuIGluc3RydWN0aW9uIGlzIGVtaXR0ZWQuCisgIHZpcnR1YWwgdm9pZCBlbWl0SW5zdHJ1Y3Rpb25Bbm5vdChjb25zdCBJbnN0cnVjdGlvbiAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9ybWF0dGVkX3Jhd19vc3RyZWFtICYpIHt9CisKKyAgLy8vIHByaW50SW5mb0NvbW1lbnQgLSBUaGlzIG1heSBiZSBpbXBsZW1lbnRlZCB0byBlbWl0IGEgY29tbWVudCB0byB0aGUKKyAgLy8vIHJpZ2h0IG9mIGFuIGluc3RydWN0aW9uIG9yIGdsb2JhbCB2YWx1ZS4KKyAgdmlydHVhbCB2b2lkIHByaW50SW5mb0NvbW1lbnQoY29uc3QgVmFsdWUgJiwgZm9ybWF0dGVkX3Jhd19vc3RyZWFtICYpIHt9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQXR0cmlidXRlcy5nZW4gYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0F0dHJpYnV0ZXMuZ2VuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZmI4MDUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0F0dHJpYnV0ZXMuZ2VuCkBAIC0wLDAgKzEsNTAyIEBACisjaWZkZWYgR0VUX0FUVFJfRU5VTQorI3VuZGVmIEdFVF9BVFRSX0VOVU0KK0FsaWdubWVudCwKK0FsbG9jU2l6ZSwKK0Fsd2F5c0lubGluZSwKK0FyZ01lbU9ubHksCitCdWlsdGluLAorQnlWYWwsCitDb2xkLAorQ29udmVyZ2VudCwKK0RlcmVmZXJlbmNlYWJsZSwKK0RlcmVmZXJlbmNlYWJsZU9yTnVsbCwKK0luQWxsb2NhLAorSW5SZWcsCitJbmFjY2Vzc2libGVNZW1Pbmx5LAorSW5hY2Nlc3NpYmxlTWVtT3JBcmdNZW1Pbmx5LAorSW5saW5lSGludCwKK0p1bXBUYWJsZSwKK01pblNpemUsCitOYWtlZCwKK05lc3QsCitOb0FsaWFzLAorTm9CdWlsdGluLAorTm9DYXB0dXJlLAorTm9DZkNoZWNrLAorTm9EdXBsaWNhdGUsCitOb0ltcGxpY2l0RmxvYXQsCitOb0lubGluZSwKK05vUmVjdXJzZSwKK05vUmVkWm9uZSwKK05vUmV0dXJuLAorTm9VbndpbmQsCitOb25MYXp5QmluZCwKK05vbk51bGwsCitPcHRGb3JGdXp6aW5nLAorT3B0aW1pemVGb3JTaXplLAorT3B0aW1pemVOb25lLAorUmVhZE5vbmUsCitSZWFkT25seSwKK1JldHVybmVkLAorUmV0dXJuc1R3aWNlLAorU0V4dCwKK1NhZmVTdGFjaywKK1Nhbml0aXplQWRkcmVzcywKK1Nhbml0aXplSFdBZGRyZXNzLAorU2FuaXRpemVNZW1vcnksCitTYW5pdGl6ZVRocmVhZCwKK1NwZWN1bGF0YWJsZSwKK1N0YWNrQWxpZ25tZW50LAorU3RhY2tQcm90ZWN0LAorU3RhY2tQcm90ZWN0UmVxLAorU3RhY2tQcm90ZWN0U3Ryb25nLAorU3RyaWN0RlAsCitTdHJ1Y3RSZXQsCitTd2lmdEVycm9yLAorU3dpZnRTZWxmLAorVVdUYWJsZSwKK1dyaXRlT25seSwKK1pFeHQsCisjZW5kaWYKKyNpZmRlZiBHRVRfQVRUUl9LSU5EX0ZST01fTkFNRQorI3VuZGVmIEdFVF9BVFRSX0tJTkRfRlJPTV9OQU1FCitzdGF0aWMgQXR0cmlidXRlOjpBdHRyS2luZCBnZXRBdHRyS2luZEZyb21OYW1lKFN0cmluZ1JlZiBBdHRyTmFtZSkgeworICByZXR1cm4gU3RyaW5nU3dpdGNoPEF0dHJpYnV0ZTo6QXR0cktpbmQ+KEF0dHJOYW1lKQorICAgIC5DYXNlKCJhbGlnbiIsIEF0dHJpYnV0ZTo6QWxpZ25tZW50KQorICAgIC5DYXNlKCJhbGxvY3NpemUiLCBBdHRyaWJ1dGU6OkFsbG9jU2l6ZSkKKyAgICAuQ2FzZSgiYWx3YXlzaW5saW5lIiwgQXR0cmlidXRlOjpBbHdheXNJbmxpbmUpCisgICAgLkNhc2UoImFyZ21lbW9ubHkiLCBBdHRyaWJ1dGU6OkFyZ01lbU9ubHkpCisgICAgLkNhc2UoImJ1aWx0aW4iLCBBdHRyaWJ1dGU6OkJ1aWx0aW4pCisgICAgLkNhc2UoImJ5dmFsIiwgQXR0cmlidXRlOjpCeVZhbCkKKyAgICAuQ2FzZSgiY29sZCIsIEF0dHJpYnV0ZTo6Q29sZCkKKyAgICAuQ2FzZSgiY29udmVyZ2VudCIsIEF0dHJpYnV0ZTo6Q29udmVyZ2VudCkKKyAgICAuQ2FzZSgiZGVyZWZlcmVuY2VhYmxlIiwgQXR0cmlidXRlOjpEZXJlZmVyZW5jZWFibGUpCisgICAgLkNhc2UoImRlcmVmZXJlbmNlYWJsZV9vcl9udWxsIiwgQXR0cmlidXRlOjpEZXJlZmVyZW5jZWFibGVPck51bGwpCisgICAgLkNhc2UoImluYWxsb2NhIiwgQXR0cmlidXRlOjpJbkFsbG9jYSkKKyAgICAuQ2FzZSgiaW5yZWciLCBBdHRyaWJ1dGU6OkluUmVnKQorICAgIC5DYXNlKCJpbmFjY2Vzc2libGVtZW1vbmx5IiwgQXR0cmlidXRlOjpJbmFjY2Vzc2libGVNZW1Pbmx5KQorICAgIC5DYXNlKCJpbmFjY2Vzc2libGVtZW1fb3JfYXJnbWVtb25seSIsIEF0dHJpYnV0ZTo6SW5hY2Nlc3NpYmxlTWVtT3JBcmdNZW1Pbmx5KQorICAgIC5DYXNlKCJpbmxpbmVoaW50IiwgQXR0cmlidXRlOjpJbmxpbmVIaW50KQorICAgIC5DYXNlKCJqdW1wdGFibGUiLCBBdHRyaWJ1dGU6Okp1bXBUYWJsZSkKKyAgICAuQ2FzZSgibWluc2l6ZSIsIEF0dHJpYnV0ZTo6TWluU2l6ZSkKKyAgICAuQ2FzZSgibmFrZWQiLCBBdHRyaWJ1dGU6Ok5ha2VkKQorICAgIC5DYXNlKCJuZXN0IiwgQXR0cmlidXRlOjpOZXN0KQorICAgIC5DYXNlKCJub2FsaWFzIiwgQXR0cmlidXRlOjpOb0FsaWFzKQorICAgIC5DYXNlKCJub2J1aWx0aW4iLCBBdHRyaWJ1dGU6Ok5vQnVpbHRpbikKKyAgICAuQ2FzZSgibm9jYXB0dXJlIiwgQXR0cmlidXRlOjpOb0NhcHR1cmUpCisgICAgLkNhc2UoIm5vY2ZfY2hlY2siLCBBdHRyaWJ1dGU6Ok5vQ2ZDaGVjaykKKyAgICAuQ2FzZSgibm9kdXBsaWNhdGUiLCBBdHRyaWJ1dGU6Ok5vRHVwbGljYXRlKQorICAgIC5DYXNlKCJub2ltcGxpY2l0ZmxvYXQiLCBBdHRyaWJ1dGU6Ok5vSW1wbGljaXRGbG9hdCkKKyAgICAuQ2FzZSgibm9pbmxpbmUiLCBBdHRyaWJ1dGU6Ok5vSW5saW5lKQorICAgIC5DYXNlKCJub3JlY3Vyc2UiLCBBdHRyaWJ1dGU6Ok5vUmVjdXJzZSkKKyAgICAuQ2FzZSgibm9yZWR6b25lIiwgQXR0cmlidXRlOjpOb1JlZFpvbmUpCisgICAgLkNhc2UoIm5vcmV0dXJuIiwgQXR0cmlidXRlOjpOb1JldHVybikKKyAgICAuQ2FzZSgibm91bndpbmQiLCBBdHRyaWJ1dGU6Ok5vVW53aW5kKQorICAgIC5DYXNlKCJub25sYXp5YmluZCIsIEF0dHJpYnV0ZTo6Tm9uTGF6eUJpbmQpCisgICAgLkNhc2UoIm5vbm51bGwiLCBBdHRyaWJ1dGU6Ok5vbk51bGwpCisgICAgLkNhc2UoIm9wdGZvcmZ1enppbmciLCBBdHRyaWJ1dGU6Ok9wdEZvckZ1enppbmcpCisgICAgLkNhc2UoIm9wdHNpemUiLCBBdHRyaWJ1dGU6Ok9wdGltaXplRm9yU2l6ZSkKKyAgICAuQ2FzZSgib3B0bm9uZSIsIEF0dHJpYnV0ZTo6T3B0aW1pemVOb25lKQorICAgIC5DYXNlKCJyZWFkbm9uZSIsIEF0dHJpYnV0ZTo6UmVhZE5vbmUpCisgICAgLkNhc2UoInJlYWRvbmx5IiwgQXR0cmlidXRlOjpSZWFkT25seSkKKyAgICAuQ2FzZSgicmV0dXJuZWQiLCBBdHRyaWJ1dGU6OlJldHVybmVkKQorICAgIC5DYXNlKCJyZXR1cm5zX3R3aWNlIiwgQXR0cmlidXRlOjpSZXR1cm5zVHdpY2UpCisgICAgLkNhc2UoInNpZ25leHQiLCBBdHRyaWJ1dGU6OlNFeHQpCisgICAgLkNhc2UoInNhZmVzdGFjayIsIEF0dHJpYnV0ZTo6U2FmZVN0YWNrKQorICAgIC5DYXNlKCJzYW5pdGl6ZV9hZGRyZXNzIiwgQXR0cmlidXRlOjpTYW5pdGl6ZUFkZHJlc3MpCisgICAgLkNhc2UoInNhbml0aXplX2h3YWRkcmVzcyIsIEF0dHJpYnV0ZTo6U2FuaXRpemVIV0FkZHJlc3MpCisgICAgLkNhc2UoInNhbml0aXplX21lbW9yeSIsIEF0dHJpYnV0ZTo6U2FuaXRpemVNZW1vcnkpCisgICAgLkNhc2UoInNhbml0aXplX3RocmVhZCIsIEF0dHJpYnV0ZTo6U2FuaXRpemVUaHJlYWQpCisgICAgLkNhc2UoInNwZWN1bGF0YWJsZSIsIEF0dHJpYnV0ZTo6U3BlY3VsYXRhYmxlKQorICAgIC5DYXNlKCJhbGlnbnN0YWNrIiwgQXR0cmlidXRlOjpTdGFja0FsaWdubWVudCkKKyAgICAuQ2FzZSgic3NwIiwgQXR0cmlidXRlOjpTdGFja1Byb3RlY3QpCisgICAgLkNhc2UoInNzcHJlcSIsIEF0dHJpYnV0ZTo6U3RhY2tQcm90ZWN0UmVxKQorICAgIC5DYXNlKCJzc3BzdHJvbmciLCBBdHRyaWJ1dGU6OlN0YWNrUHJvdGVjdFN0cm9uZykKKyAgICAuQ2FzZSgic3RyaWN0ZnAiLCBBdHRyaWJ1dGU6OlN0cmljdEZQKQorICAgIC5DYXNlKCJzcmV0IiwgQXR0cmlidXRlOjpTdHJ1Y3RSZXQpCisgICAgLkNhc2UoInN3aWZ0ZXJyb3IiLCBBdHRyaWJ1dGU6OlN3aWZ0RXJyb3IpCisgICAgLkNhc2UoInN3aWZ0c2VsZiIsIEF0dHJpYnV0ZTo6U3dpZnRTZWxmKQorICAgIC5DYXNlKCJ1d3RhYmxlIiwgQXR0cmlidXRlOjpVV1RhYmxlKQorICAgIC5DYXNlKCJ3cml0ZW9ubHkiLCBBdHRyaWJ1dGU6OldyaXRlT25seSkKKyAgICAuQ2FzZSgiemVyb2V4dCIsIEF0dHJpYnV0ZTo6WkV4dCkKKyAgICAuRGVmYXVsdChBdHRyaWJ1dGU6Ok5vbmUpOworfQorCisjZW5kaWYKKyNpZmRlZiBHRVRfQVRUUl9DT01QQVRfRlVOQworI3VuZGVmIEdFVF9BVFRSX0NPTVBBVF9GVU5DCitzdHJ1Y3QgRW51bUF0dHIgeworICBzdGF0aWMgYm9vbCBpc1NldChjb25zdCBGdW5jdGlvbiAmRm4sCisgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgeworICAgIHJldHVybiBGbi5oYXNGbkF0dHJpYnV0ZShLaW5kKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIHNldChGdW5jdGlvbiAmRm4sCisgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQsIGJvb2wgVmFsKSB7CisgICAgaWYgKFZhbCkKKyAgICAgIEZuLmFkZEZuQXR0cihLaW5kKTsKKyAgICBlbHNlCisgICAgICBGbi5yZW1vdmVGbkF0dHIoS2luZCk7CisgIH0KK307CisKK3N0cnVjdCBTdHJCb29sQXR0ciB7CisgIHN0YXRpYyBib29sIGlzU2V0KGNvbnN0IEZ1bmN0aW9uICZGbiwKKyAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEtpbmQpIHsKKyAgICBhdXRvIEEgPSBGbi5nZXRGbkF0dHJpYnV0ZShLaW5kKTsKKyAgICByZXR1cm4gQS5nZXRWYWx1ZUFzU3RyaW5nKCkuZXF1YWxzKCJ0cnVlIik7CisgIH0KKworICBzdGF0aWMgdm9pZCBzZXQoRnVuY3Rpb24gJkZuLAorICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEtpbmQsIGJvb2wgVmFsKSB7CisgICAgRm4uYWRkRm5BdHRyKEtpbmQsIFZhbCA/ICJ0cnVlIiA6ICJmYWxzZSIpOworICB9Cit9OworCisvLyBFbnVtQXR0ciBjbGFzc2VzCitzdHJ1Y3QgQWxpZ25tZW50QXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OkFsaWdubWVudDsKKyAgfQorfTsKK3N0cnVjdCBBbGxvY1NpemVBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6QWxsb2NTaXplOworICB9Cit9Oworc3RydWN0IEFsd2F5c0lubGluZUF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpBbHdheXNJbmxpbmU7CisgIH0KK307CitzdHJ1Y3QgQXJnTWVtT25seUF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpBcmdNZW1Pbmx5OworICB9Cit9Oworc3RydWN0IEJ1aWx0aW5BdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6QnVpbHRpbjsKKyAgfQorfTsKK3N0cnVjdCBCeVZhbEF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpCeVZhbDsKKyAgfQorfTsKK3N0cnVjdCBDb2xkQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OkNvbGQ7CisgIH0KK307CitzdHJ1Y3QgQ29udmVyZ2VudEF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpDb252ZXJnZW50OworICB9Cit9Oworc3RydWN0IERlcmVmZXJlbmNlYWJsZUF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpEZXJlZmVyZW5jZWFibGU7CisgIH0KK307CitzdHJ1Y3QgRGVyZWZlcmVuY2VhYmxlT3JOdWxsQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OkRlcmVmZXJlbmNlYWJsZU9yTnVsbDsKKyAgfQorfTsKK3N0cnVjdCBJbkFsbG9jYUF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpJbkFsbG9jYTsKKyAgfQorfTsKK3N0cnVjdCBJblJlZ0F0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpJblJlZzsKKyAgfQorfTsKK3N0cnVjdCBJbmFjY2Vzc2libGVNZW1Pbmx5QXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OkluYWNjZXNzaWJsZU1lbU9ubHk7CisgIH0KK307CitzdHJ1Y3QgSW5hY2Nlc3NpYmxlTWVtT3JBcmdNZW1Pbmx5QXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OkluYWNjZXNzaWJsZU1lbU9yQXJnTWVtT25seTsKKyAgfQorfTsKK3N0cnVjdCBJbmxpbmVIaW50QXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OklubGluZUhpbnQ7CisgIH0KK307CitzdHJ1Y3QgSnVtcFRhYmxlQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6Okp1bXBUYWJsZTsKKyAgfQorfTsKK3N0cnVjdCBNaW5TaXplQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6Ok1pblNpemU7CisgIH0KK307CitzdHJ1Y3QgTmFrZWRBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6TmFrZWQ7CisgIH0KK307CitzdHJ1Y3QgTmVzdEF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpOZXN0OworICB9Cit9Oworc3RydWN0IE5vQWxpYXNBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6Tm9BbGlhczsKKyAgfQorfTsKK3N0cnVjdCBOb0J1aWx0aW5BdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6Tm9CdWlsdGluOworICB9Cit9Oworc3RydWN0IE5vQ2FwdHVyZUF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpOb0NhcHR1cmU7CisgIH0KK307CitzdHJ1Y3QgTm9DZkNoZWNrQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6Ok5vQ2ZDaGVjazsKKyAgfQorfTsKK3N0cnVjdCBOb0R1cGxpY2F0ZUF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpOb0R1cGxpY2F0ZTsKKyAgfQorfTsKK3N0cnVjdCBOb0ltcGxpY2l0RmxvYXRBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6Tm9JbXBsaWNpdEZsb2F0OworICB9Cit9Oworc3RydWN0IE5vSW5saW5lQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6Ok5vSW5saW5lOworICB9Cit9Oworc3RydWN0IE5vUmVjdXJzZUF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpOb1JlY3Vyc2U7CisgIH0KK307CitzdHJ1Y3QgTm9SZWRab25lQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6Ok5vUmVkWm9uZTsKKyAgfQorfTsKK3N0cnVjdCBOb1JldHVybkF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpOb1JldHVybjsKKyAgfQorfTsKK3N0cnVjdCBOb1Vud2luZEF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpOb1Vud2luZDsKKyAgfQorfTsKK3N0cnVjdCBOb25MYXp5QmluZEF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpOb25MYXp5QmluZDsKKyAgfQorfTsKK3N0cnVjdCBOb25OdWxsQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6Ok5vbk51bGw7CisgIH0KK307CitzdHJ1Y3QgT3B0Rm9yRnV6emluZ0F0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpPcHRGb3JGdXp6aW5nOworICB9Cit9Oworc3RydWN0IE9wdGltaXplRm9yU2l6ZUF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpPcHRpbWl6ZUZvclNpemU7CisgIH0KK307CitzdHJ1Y3QgT3B0aW1pemVOb25lQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6Ok9wdGltaXplTm9uZTsKKyAgfQorfTsKK3N0cnVjdCBSZWFkTm9uZUF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpSZWFkTm9uZTsKKyAgfQorfTsKK3N0cnVjdCBSZWFkT25seUF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpSZWFkT25seTsKKyAgfQorfTsKK3N0cnVjdCBSZXR1cm5lZEF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpSZXR1cm5lZDsKKyAgfQorfTsKK3N0cnVjdCBSZXR1cm5zVHdpY2VBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6UmV0dXJuc1R3aWNlOworICB9Cit9Oworc3RydWN0IFNFeHRBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6U0V4dDsKKyAgfQorfTsKK3N0cnVjdCBTYWZlU3RhY2tBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6U2FmZVN0YWNrOworICB9Cit9Oworc3RydWN0IFNhbml0aXplQWRkcmVzc0F0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpTYW5pdGl6ZUFkZHJlc3M7CisgIH0KK307CitzdHJ1Y3QgU2FuaXRpemVIV0FkZHJlc3NBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6U2FuaXRpemVIV0FkZHJlc3M7CisgIH0KK307CitzdHJ1Y3QgU2FuaXRpemVNZW1vcnlBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6U2FuaXRpemVNZW1vcnk7CisgIH0KK307CitzdHJ1Y3QgU2FuaXRpemVUaHJlYWRBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6U2FuaXRpemVUaHJlYWQ7CisgIH0KK307CitzdHJ1Y3QgU3BlY3VsYXRhYmxlQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OlNwZWN1bGF0YWJsZTsKKyAgfQorfTsKK3N0cnVjdCBTdGFja0FsaWdubWVudEF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpTdGFja0FsaWdubWVudDsKKyAgfQorfTsKK3N0cnVjdCBTdGFja1Byb3RlY3RBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6U3RhY2tQcm90ZWN0OworICB9Cit9Oworc3RydWN0IFN0YWNrUHJvdGVjdFJlcUF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpTdGFja1Byb3RlY3RSZXE7CisgIH0KK307CitzdHJ1Y3QgU3RhY2tQcm90ZWN0U3Ryb25nQXR0ciA6IEVudW1BdHRyIHsKKyAgc3RhdGljIGVudW0gQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kKCkgeworICAgIHJldHVybiBsbHZtOjpBdHRyaWJ1dGU6OlN0YWNrUHJvdGVjdFN0cm9uZzsKKyAgfQorfTsKK3N0cnVjdCBTdHJpY3RGUEF0dHIgOiBFbnVtQXR0ciB7CisgIHN0YXRpYyBlbnVtIEF0dHJpYnV0ZTo6QXR0cktpbmQgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gbGx2bTo6QXR0cmlidXRlOjpTdHJpY3RGUDsKKyAgfQorfTsKK3N0cnVjdCBTdHJ1Y3RSZXRBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6U3RydWN0UmV0OworICB9Cit9Oworc3RydWN0IFN3aWZ0RXJyb3JBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6U3dpZnRFcnJvcjsKKyAgfQorfTsKK3N0cnVjdCBTd2lmdFNlbGZBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6U3dpZnRTZWxmOworICB9Cit9Oworc3RydWN0IFVXVGFibGVBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6VVdUYWJsZTsKKyAgfQorfTsKK3N0cnVjdCBXcml0ZU9ubHlBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6V3JpdGVPbmx5OworICB9Cit9Oworc3RydWN0IFpFeHRBdHRyIDogRW51bUF0dHIgeworICBzdGF0aWMgZW51bSBBdHRyaWJ1dGU6OkF0dHJLaW5kIGdldEtpbmQoKSB7CisgICAgcmV0dXJuIGxsdm06OkF0dHJpYnV0ZTo6WkV4dDsKKyAgfQorfTsKKworLy8gU3RyQm9vbEF0dHIgY2xhc3Nlcworc3RydWN0IExlc3NQcmVjaXNlRlBNQURBdHRyIDogU3RyQm9vbEF0dHIgeworICBzdGF0aWMgU3RyaW5nUmVmIGdldEtpbmQoKSB7CisgICAgcmV0dXJuICJsZXNzLXByZWNpc2UtZnBtYWQiOworICB9Cit9Oworc3RydWN0IE5vSW5mc0ZQTWF0aEF0dHIgOiBTdHJCb29sQXR0ciB7CisgIHN0YXRpYyBTdHJpbmdSZWYgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gIm5vLWluZnMtZnAtbWF0aCI7CisgIH0KK307CitzdHJ1Y3QgTm9KdW1wVGFibGVzQXR0ciA6IFN0ckJvb2xBdHRyIHsKKyAgc3RhdGljIFN0cmluZ1JlZiBnZXRLaW5kKCkgeworICAgIHJldHVybiAibm8tanVtcC10YWJsZXMiOworICB9Cit9Oworc3RydWN0IE5vTmFuc0ZQTWF0aEF0dHIgOiBTdHJCb29sQXR0ciB7CisgIHN0YXRpYyBTdHJpbmdSZWYgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gIm5vLW5hbnMtZnAtbWF0aCI7CisgIH0KK307CitzdHJ1Y3QgUHJvZmlsZVNhbXBsZUFjY3VyYXRlQXR0ciA6IFN0ckJvb2xBdHRyIHsKKyAgc3RhdGljIFN0cmluZ1JlZiBnZXRLaW5kKCkgeworICAgIHJldHVybiAicHJvZmlsZS1zYW1wbGUtYWNjdXJhdGUiOworICB9Cit9Oworc3RydWN0IFVuc2FmZUZQTWF0aEF0dHIgOiBTdHJCb29sQXR0ciB7CisgIHN0YXRpYyBTdHJpbmdSZWYgZ2V0S2luZCgpIHsKKyAgICByZXR1cm4gInVuc2FmZS1mcC1tYXRoIjsKKyAgfQorfTsKKworc3RhdGljIGlubGluZSBib29sIGhhc0NvbXBhdGlibGVGbkF0dHJzKGNvbnN0IEZ1bmN0aW9uICZDYWxsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb24gJkNhbGxlZSkgeworICBib29sIFJldCA9IHRydWU7CisKKyAgUmV0ICY9IGlzRXF1YWw8U2FuaXRpemVBZGRyZXNzQXR0cj4oQ2FsbGVyLCBDYWxsZWUpOworICBSZXQgJj0gaXNFcXVhbDxTYW5pdGl6ZVRocmVhZEF0dHI+KENhbGxlciwgQ2FsbGVlKTsKKyAgUmV0ICY9IGlzRXF1YWw8U2FuaXRpemVNZW1vcnlBdHRyPihDYWxsZXIsIENhbGxlZSk7CisgIFJldCAmPSBpc0VxdWFsPFNhbml0aXplSFdBZGRyZXNzQXR0cj4oQ2FsbGVyLCBDYWxsZWUpOworICBSZXQgJj0gaXNFcXVhbDxTYWZlU3RhY2tBdHRyPihDYWxsZXIsIENhbGxlZSk7CisKKyAgcmV0dXJuIFJldDsKK30KKworc3RhdGljIGlubGluZSB2b2lkIG1lcmdlRm5BdHRycyhGdW5jdGlvbiAmQ2FsbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbiAmQ2FsbGVlKSB7CisgIHNldE9SPE5vSnVtcFRhYmxlc0F0dHI+KENhbGxlciwgQ2FsbGVlKTsKKyAgc2V0T1I8UHJvZmlsZVNhbXBsZUFjY3VyYXRlQXR0cj4oQ2FsbGVyLCBDYWxsZWUpOworICBhZGp1c3RDYWxsZXJTU1BMZXZlbChDYWxsZXIsIENhbGxlZSk7CisgIGFkanVzdENhbGxlclN0YWNrUHJvYmVzKENhbGxlciwgQ2FsbGVlKTsKKyAgYWRqdXN0Q2FsbGVyU3RhY2tQcm9iZVNpemUoQ2FsbGVyLCBDYWxsZWUpOworICBzZXRBTkQ8TGVzc1ByZWNpc2VGUE1BREF0dHI+KENhbGxlciwgQ2FsbGVlKTsKKyAgc2V0QU5EPE5vSW5mc0ZQTWF0aEF0dHI+KENhbGxlciwgQ2FsbGVlKTsKKyAgc2V0QU5EPE5vTmFuc0ZQTWF0aEF0dHI+KENhbGxlciwgQ2FsbGVlKTsKKyAgc2V0QU5EPFVuc2FmZUZQTWF0aEF0dHI+KENhbGxlciwgQ2FsbGVlKTsKKyAgc2V0T1I8Tm9JbXBsaWNpdEZsb2F0QXR0cj4oQ2FsbGVyLCBDYWxsZWUpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQXR0cmlidXRlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9BdHRyaWJ1dGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjYwZmM1OAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQXR0cmlidXRlcy5oCkBAIC0wLDAgKzEsODM5IEBACisvLz09PS0gbGx2bS9BdHRyaWJ1dGVzLmggLSBDb250YWluZXIgZm9yIEF0dHJpYnV0ZXMgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBUaGlzIGZpbGUgY29udGFpbnMgdGhlIHNpbXBsZSB0eXBlcyBuZWNlc3NhcnkgdG8gcmVwcmVzZW50IHRoZQorLy8vIGF0dHJpYnV0ZXMgYXNzb2NpYXRlZCB3aXRoIGZ1bmN0aW9ucyBhbmQgdGhlaXIgY2FsbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0FUVFJJQlVURVNfSAorI2RlZmluZSBMTFZNX0lSX0FUVFJJQlVURVNfSAorCisjaW5jbHVkZSAibGx2bS1jL1R5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Gb2xkaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Qb2ludGVyTGlrZVR5cGVUcmFpdHMuaCIKKyNpbmNsdWRlIDxiaXRzZXQ+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBdHRyQnVpbGRlcjsKK2NsYXNzIEF0dHJpYnV0ZUltcGw7CitjbGFzcyBBdHRyaWJ1dGVMaXN0SW1wbDsKK2NsYXNzIEF0dHJpYnV0ZVNldE5vZGU7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgRGVuc2VNYXBJbmZvOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIFR5cGU7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGNsYXNzCisvLy8gXGJyaWVmIEZ1bmN0aW9ucywgZnVuY3Rpb24gcGFyYW1ldGVycywgYW5kIHJldHVybiB0eXBlcyBjYW4gaGF2ZSBhdHRyaWJ1dGVzCisvLy8gdG8gaW5kaWNhdGUgaG93IHRoZXkgc2hvdWxkIGJlIHRyZWF0ZWQgYnkgb3B0aW1pemF0aW9ucyBhbmQgY29kZQorLy8vIGdlbmVyYXRpb24uIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBvbmUgb2YgdGhvc2UgYXR0cmlidXRlcy4gSXQncyBsaWdodC13ZWlnaHQKKy8vLyBhbmQgc2hvdWxkIGJlIHBhc3NlZCBhcm91bmQgYnktdmFsdWUuCitjbGFzcyBBdHRyaWJ1dGUgeworcHVibGljOgorICAvLy8gVGhpcyBlbnVtZXJhdGlvbiBsaXN0cyB0aGUgYXR0cmlidXRlcyB0aGF0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGgKKyAgLy8vIHBhcmFtZXRlcnMsIGZ1bmN0aW9uIHJlc3VsdHMsIG9yIHRoZSBmdW5jdGlvbiBpdHNlbGYuCisgIC8vLworICAvLy8gTm90ZTogVGhlIGB1d3RhYmxlJyBhdHRyaWJ1dGUgaXMgYWJvdXQgdGhlIEFCSSBvciB0aGUgdXNlciBtYW5kYXRpbmcgYW4KKyAgLy8vIGVudHJ5IGluIHRoZSB1bndpbmQgdGFibGUuIFRoZSBgbm91bndpbmQnIGF0dHJpYnV0ZSBpcyBhYm91dCBhbiBleGNlcHRpb24KKyAgLy8vIHBhc3NpbmcgYnkgdGhlIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIEluIGEgdGhlb3JldGljYWwgc3lzdGVtIHRoYXQgdXNlcyB0YWJsZXMgZm9yIHByb2ZpbGluZyBhbmQgU2pMaiBmb3IKKyAgLy8vIGV4Y2VwdGlvbnMsIHRoZXkgd291bGQgYmUgZnVsbHkgaW5kZXBlbmRlbnQuIEluIGEgbm9ybWFsIHN5c3RlbSB0aGF0IHVzZXMKKyAgLy8vIHRhYmxlcyBmb3IgYm90aCwgdGhlIHNlbWFudGljcyBhcmU6CisgIC8vLworICAvLy8gbmlsICAgICAgICAgICAgICAgID0gTmVlZHMgYW4gZW50cnkgYmVjYXVzZSBhbiBleGNlcHRpb24gbWlnaHQgcGFzcyBieS4KKyAgLy8vIG5vdW53aW5kICAgICAgICAgICA9IE5vIG5lZWQgZm9yIGFuIGVudHJ5CisgIC8vLyB1d3RhYmxlICAgICAgICAgICAgPSBOZWVkcyBhbiBlbnRyeSBiZWNhdXNlIHRoZSBBQkkgc2F5cyBzbyBhbmQgYmVjYXVzZQorICAvLy8gICAgICAgICAgICAgICAgICAgICAgYW4gZXhjZXB0aW9uIG1pZ2h0IHBhc3MgYnkuCisgIC8vLyB1d3RhYmxlICsgbm91bndpbmQgPSBOZWVkcyBhbiBlbnRyeSBiZWNhdXNlIHRoZSBBQkkgc2F5cyBzby4KKworICBlbnVtIEF0dHJLaW5kIHsKKyAgICAvLyBJUi1MZXZlbCBBdHRyaWJ1dGVzCisgICAgTm9uZSwgICAgICAgICAgICAgICAgICAvLy88IE5vIGF0dHJpYnV0ZXMgaGF2ZSBiZWVuIHNldAorICAgICNkZWZpbmUgR0VUX0FUVFJfRU5VTQorICAgICNpbmNsdWRlICJsbHZtL0lSL0F0dHJpYnV0ZXMuZ2VuIgorICAgIEVuZEF0dHJLaW5kcyAgICAgICAgICAgLy8vPCBTZW50aW5hbCB2YWx1ZSB1c2VmdWwgZm9yIGxvb3BzCisgIH07CisKK3ByaXZhdGU6CisgIEF0dHJpYnV0ZUltcGwgKnBJbXBsID0gbnVsbHB0cjsKKworICBBdHRyaWJ1dGUoQXR0cmlidXRlSW1wbCAqQSkgOiBwSW1wbChBKSB7fQorCitwdWJsaWM6CisgIEF0dHJpYnV0ZSgpID0gZGVmYXVsdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQXR0cmlidXRlIENvbnN0cnVjdGlvbgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gXGJyaWVmIFJldHVybiBhIHVuaXF1aWZpZWQgQXR0cmlidXRlIG9iamVjdC4KKyAgc3RhdGljIEF0dHJpYnV0ZSBnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIEF0dHJLaW5kIEtpbmQsIHVpbnQ2NF90IFZhbCA9IDApOworICBzdGF0aWMgQXR0cmlidXRlIGdldChMTFZNQ29udGV4dCAmQ29udGV4dCwgU3RyaW5nUmVmIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBWYWwgPSBTdHJpbmdSZWYoKSk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSB1bmlxdWlmaWVkIEF0dHJpYnV0ZSBvYmplY3QgdGhhdCBoYXMgdGhlIHNwZWNpZmljCisgIC8vLyBhbGlnbm1lbnQgc2V0LgorICBzdGF0aWMgQXR0cmlidXRlIGdldFdpdGhBbGlnbm1lbnQoTExWTUNvbnRleHQgJkNvbnRleHQsIHVpbnQ2NF90IEFsaWduKTsKKyAgc3RhdGljIEF0dHJpYnV0ZSBnZXRXaXRoU3RhY2tBbGlnbm1lbnQoTExWTUNvbnRleHQgJkNvbnRleHQsIHVpbnQ2NF90IEFsaWduKTsKKyAgc3RhdGljIEF0dHJpYnV0ZSBnZXRXaXRoRGVyZWZlcmVuY2VhYmxlQnl0ZXMoTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgQnl0ZXMpOworICBzdGF0aWMgQXR0cmlidXRlIGdldFdpdGhEZXJlZmVyZW5jZWFibGVPck51bGxCeXRlcyhMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgQnl0ZXMpOworICBzdGF0aWMgQXR0cmlidXRlIGdldFdpdGhBbGxvY1NpemVBcmdzKExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEVsZW1TaXplQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbmFsPHVuc2lnbmVkPiAmTnVtRWxlbXNBcmcpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBBdHRyaWJ1dGUgQWNjZXNzb3JzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGF0dHJpYnV0ZSBpcyBhbiBBdHRyaWJ1dGU6OkF0dHJLaW5kIHR5cGUuCisgIGJvb2wgaXNFbnVtQXR0cmlidXRlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIGFuIGludGVnZXIgYXR0cmlidXRlLgorICBib29sIGlzSW50QXR0cmlidXRlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIGEgc3RyaW5nICh0YXJnZXQtZGVwZW5kZW50KQorICAvLy8gYXR0cmlidXRlLgorICBib29sIGlzU3RyaW5nQXR0cmlidXRlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGlzIHByZXNlbnQuCisgIGJvb2wgaGFzQXR0cmlidXRlKEF0dHJLaW5kIFZhbCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgdGFyZ2V0LWRlcGVuZGVudCBhdHRyaWJ1dGUgaXMgcHJlc2VudC4KKyAgYm9vbCBoYXNBdHRyaWJ1dGUoU3RyaW5nUmVmIFZhbCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSdzIGtpbmQgYXMgYW4gZW51bSAoQXR0cmlidXRlOjpBdHRyS2luZCkuIFRoaXMKKyAgLy8vIHJlcXVpcmVzIHRoZSBhdHRyaWJ1dGUgdG8gYmUgYW4gZW51bSBvciBpbnRlZ2VyIGF0dHJpYnV0ZS4KKyAgQXR0cmlidXRlOjpBdHRyS2luZCBnZXRLaW5kQXNFbnVtKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSdzIHZhbHVlIGFzIGFuIGludGVnZXIuIFRoaXMgcmVxdWlyZXMgdGhhdCB0aGUKKyAgLy8vIGF0dHJpYnV0ZSBiZSBhbiBpbnRlZ2VyIGF0dHJpYnV0ZS4KKyAgdWludDY0X3QgZ2V0VmFsdWVBc0ludCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBhdHRyaWJ1dGUncyBraW5kIGFzIGEgc3RyaW5nLiBUaGlzIHJlcXVpcmVzIHRoZQorICAvLy8gYXR0cmlidXRlIHRvIGJlIGEgc3RyaW5nIGF0dHJpYnV0ZS4KKyAgU3RyaW5nUmVmIGdldEtpbmRBc1N0cmluZygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBhdHRyaWJ1dGUncyB2YWx1ZSBhcyBhIHN0cmluZy4gVGhpcyByZXF1aXJlcyB0aGUKKyAgLy8vIGF0dHJpYnV0ZSB0byBiZSBhIHN0cmluZyBhdHRyaWJ1dGUuCisgIFN0cmluZ1JlZiBnZXRWYWx1ZUFzU3RyaW5nKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBhbGlnbm1lbnQgZmllbGQgb2YgYW4gYXR0cmlidXRlIGFzIGEgYnl0ZSBhbGlnbm1lbnQKKyAgLy8vIHZhbHVlLgorICB1bnNpZ25lZCBnZXRBbGlnbm1lbnQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHN0YWNrIGFsaWdubWVudCBmaWVsZCBvZiBhbiBhdHRyaWJ1dGUgYXMgYSBieXRlCisgIC8vLyBhbGlnbm1lbnQgdmFsdWUuCisgIHVuc2lnbmVkIGdldFN0YWNrQWxpZ25tZW50KCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZGVyZWZlcmVuY2VhYmxlIGJ5dGVzIGZyb20gdGhlCisgIC8vLyBkZXJlZmVyZW5jZWFibGUgYXR0cmlidXRlLgorICB1aW50NjRfdCBnZXREZXJlZmVyZW5jZWFibGVCeXRlcygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGRlcmVmZXJlbmNlYWJsZV9vcl9udWxsIGJ5dGVzIGZyb20gdGhlCisgIC8vLyBkZXJlZmVyZW5jZWFibGVfb3JfbnVsbCBhdHRyaWJ1dGUuCisgIHVpbnQ2NF90IGdldERlcmVmZXJlbmNlYWJsZU9yTnVsbEJ5dGVzKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIGFyZ3VtZW50IG51bWJlcnMgZm9yIHRoZSBhbGxvY3NpemUgYXR0cmlidXRlIChvciBwYWlyKDAsIDApCisgIC8vLyBpZiBub3Qga25vd24pLgorICBzdGQ6OnBhaXI8dW5zaWduZWQsIE9wdGlvbmFsPHVuc2lnbmVkPj4gZ2V0QWxsb2NTaXplQXJncygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVGhlIEF0dHJpYnV0ZSBpcyBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcgb2YgZXF1aXZhbGVudCBtbmVtb25pYy4gVGhpcworICAvLy8gaXMsIHByZXN1bWFibHksIGZvciB3cml0aW5nIG91dCB0aGUgbW5lbW9uaWNzIGZvciB0aGUgYXNzZW1ibHkgd3JpdGVyLgorICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZyhib29sIEluQXR0ckdycCA9IGZhbHNlKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEVxdWFsaXR5IGFuZCBub24tZXF1YWxpdHkgb3BlcmF0b3JzLgorICBib29sIG9wZXJhdG9yPT0oQXR0cmlidXRlIEEpIGNvbnN0IHsgcmV0dXJuIHBJbXBsID09IEEucEltcGw7IH0KKyAgYm9vbCBvcGVyYXRvciE9KEF0dHJpYnV0ZSBBKSBjb25zdCB7IHJldHVybiBwSW1wbCAhPSBBLnBJbXBsOyB9CisKKyAgLy8vIFxicmllZiBMZXNzLXRoYW4gb3BlcmF0b3IuIFVzZWZ1bCBmb3Igc29ydGluZyB0aGUgYXR0cmlidXRlcyBsaXN0LgorICBib29sIG9wZXJhdG9yPChBdHRyaWJ1dGUgQSkgY29uc3Q7CisKKyAgdm9pZCBQcm9maWxlKEZvbGRpbmdTZXROb2RlSUQgJklEKSBjb25zdCB7CisgICAgSUQuQWRkUG9pbnRlcihwSW1wbCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBhIHJhdyBwb2ludGVyIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIGF0dHJpYnV0ZS4KKyAgdm9pZCAqZ2V0UmF3UG9pbnRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gcEltcGw7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCBhbiBhdHRyaWJ1dGUgZnJvbSBhIHJhdyBwb2ludGVyIGNyZWF0ZWQgYnkgZ2V0UmF3UG9pbnRlci4KKyAgc3RhdGljIEF0dHJpYnV0ZSBmcm9tUmF3UG9pbnRlcih2b2lkICpSYXdQdHIpIHsKKyAgICByZXR1cm4gQXR0cmlidXRlKHJlaW50ZXJwcmV0X2Nhc3Q8QXR0cmlidXRlSW1wbCo+KFJhd1B0cikpOworICB9Cit9OworCisvLyBTcGVjaWFsaXplZCBvcGFxdWUgdmFsdWUgY29udmVyc2lvbnMuCitpbmxpbmUgTExWTUF0dHJpYnV0ZVJlZiB3cmFwKEF0dHJpYnV0ZSBBdHRyKSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PExMVk1BdHRyaWJ1dGVSZWY+KEF0dHIuZ2V0UmF3UG9pbnRlcigpKTsKK30KKworLy8gU3BlY2lhbGl6ZWQgb3BhcXVlIHZhbHVlIGNvbnZlcnNpb25zLgoraW5saW5lIEF0dHJpYnV0ZSB1bndyYXAoTExWTUF0dHJpYnV0ZVJlZiBBdHRyKSB7CisgIHJldHVybiBBdHRyaWJ1dGU6OmZyb21SYXdQb2ludGVyKEF0dHIpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxjbGFzcworLy8vIFRoaXMgY2xhc3MgaG9sZHMgdGhlIGF0dHJpYnV0ZXMgZm9yIGEgcGFydGljdWxhciBhcmd1bWVudCwgcGFyYW1ldGVyLAorLy8vIGZ1bmN0aW9uLCBvciByZXR1cm4gdmFsdWUuIEl0IGlzIGFuIGltbXV0YWJsZSB2YWx1ZSB0eXBlIHRoYXQgaXMgY2hlYXAgdG8KKy8vLyBjb3B5LiBBZGRpbmcgYW5kIHJlbW92aW5nIGVudW0gYXR0cmlidXRlcyBpcyBpbnRlbmRlZCB0byBiZSBmYXN0LCBidXQgYWRkaW5nCisvLy8gYW5kIHJlbW92aW5nIHN0cmluZyBvciBpbnRlZ2VyIGF0dHJpYnV0ZXMgaW52b2x2ZXMgYSBGb2xkaW5nU2V0IGxvb2t1cC4KK2NsYXNzIEF0dHJpYnV0ZVNldCB7CisgIGZyaWVuZCBBdHRyaWJ1dGVMaXN0SW1wbDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5PiBmcmllbmQgc3RydWN0IERlbnNlTWFwSW5mbzsKKworICAvLyBUT0RPOiBFeHRyYWN0IEF2YWlsYWJsZUF0dHJzIGZyb20gQXR0cmlidXRlU2V0Tm9kZSBhbmQgc3RvcmUgdGhlbSBoZXJlLgorICAvLyBUaGlzIHdpbGwgYWxsb3cgYW4gZWZmaWNpZW50IGltcGxlbWVudGF0aW9uIG9mIGFkZEF0dHJpYnV0ZSBhbmQKKyAgLy8gcmVtb3ZlQXR0cmlidXRlIGZvciBlbnVtIGF0dHJzLgorCisgIC8vLyBQcml2YXRlIGltcGxlbWVudGF0aW9uIHBvaW50ZXIuCisgIEF0dHJpYnV0ZVNldE5vZGUgKlNldE5vZGUgPSBudWxscHRyOworCitwcml2YXRlOgorICBleHBsaWNpdCBBdHRyaWJ1dGVTZXQoQXR0cmlidXRlU2V0Tm9kZSAqQVNOKSA6IFNldE5vZGUoQVNOKSB7fQorCitwdWJsaWM6CisgIC8vLyBBdHRyaWJ1dGVTZXQgaXMgYSB0cml2aWFsbHkgY29weWFibGUgdmFsdWUgdHlwZS4KKyAgQXR0cmlidXRlU2V0KCkgPSBkZWZhdWx0OworICBBdHRyaWJ1dGVTZXQoY29uc3QgQXR0cmlidXRlU2V0ICYpID0gZGVmYXVsdDsKKyAgfkF0dHJpYnV0ZVNldCgpID0gZGVmYXVsdDsKKworICBzdGF0aWMgQXR0cmlidXRlU2V0IGdldChMTFZNQ29udGV4dCAmQywgY29uc3QgQXR0ckJ1aWxkZXIgJkIpOworICBzdGF0aWMgQXR0cmlidXRlU2V0IGdldChMTFZNQ29udGV4dCAmQywgQXJyYXlSZWY8QXR0cmlidXRlPiBBdHRycyk7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEF0dHJpYnV0ZVNldCAmTykgY29uc3QgeyByZXR1cm4gU2V0Tm9kZSA9PSBPLlNldE5vZGU7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEF0dHJpYnV0ZVNldCAmTykgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBPKTsgfQorCisgIC8vLyBBZGQgYW4gYXJndW1lbnQgYXR0cmlidXRlLiBSZXR1cm5zIGEgbmV3IHNldCBiZWNhdXNlIGF0dHJpYnV0ZSBzZXRzIGFyZQorICAvLy8gaW1tdXRhYmxlLgorICBBdHRyaWJ1dGVTZXQgYWRkQXR0cmlidXRlKExMVk1Db250ZXh0ICZDLCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0OworCisgIC8vLyBBZGQgYSB0YXJnZXQtZGVwZW5kZW50IGF0dHJpYnV0ZS4gUmV0dXJucyBhIG5ldyBzZXQgYmVjYXVzZSBhdHRyaWJ1dGUgc2V0cworICAvLy8gYXJlIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlU2V0IGFkZEF0dHJpYnV0ZShMTFZNQ29udGV4dCAmQywgU3RyaW5nUmVmIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFZhbHVlID0gU3RyaW5nUmVmKCkpIGNvbnN0OworCisgIC8vLyBBZGQgYXR0cmlidXRlcyB0byB0aGUgYXR0cmlidXRlIHNldC4gUmV0dXJucyBhIG5ldyBzZXQgYmVjYXVzZSBhdHRyaWJ1dGUKKyAgLy8vIHNldHMgYXJlIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlU2V0IGFkZEF0dHJpYnV0ZXMoTExWTUNvbnRleHQgJkMsIEF0dHJpYnV0ZVNldCBBUykgY29uc3Q7CisKKyAgLy8vIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBmcm9tIHRoaXMgc2V0LiBSZXR1cm5zIGEgbmV3IHNldCBiZWNhdXNlCisgIC8vLyBhdHRyaWJ1dGUgc2V0cyBhcmUgaW1tdXRhYmxlLgorICBBdHRyaWJ1dGVTZXQgcmVtb3ZlQXR0cmlidXRlKExMVk1Db250ZXh0ICZDLCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0OworCisgIC8vLyBSZW1vdmUgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgZnJvbSB0aGlzIHNldC4gUmV0dXJucyBhIG5ldyBzZXQgYmVjYXVzZQorICAvLy8gYXR0cmlidXRlIHNldHMgYXJlIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlU2V0IHJlbW92ZUF0dHJpYnV0ZShMTFZNQ29udGV4dCAmQywgU3RyaW5nUmVmIEtpbmQpIGNvbnN0OworCisgIC8vLyBSZW1vdmUgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGVzIGZyb20gdGhpcyBzZXQuIFJldHVybnMgYSBuZXcgc2V0IGJlY2F1c2UKKyAgLy8vIGF0dHJpYnV0ZSBzZXRzIGFyZSBpbW11dGFibGUuCisgIEF0dHJpYnV0ZVNldCByZW1vdmVBdHRyaWJ1dGVzKExMVk1Db250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyQnVpbGRlciAmQXR0cnNUb1JlbW92ZSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGF0dHJpYnV0ZXMgaW4gdGhpcyBzZXQuCisgIHVuc2lnbmVkIGdldE51bUF0dHJpYnV0ZXMoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgYXR0cmlidXRlcyBleGlzdHMgaW4gdGhpcyBzZXQuCisgIGJvb2wgaGFzQXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIFNldE5vZGUgIT0gbnVsbHB0cjsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGV4aXN0cyBpbiB0aGlzIHNldC4KKyAgYm9vbCBoYXNBdHRyaWJ1dGUoQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGF0dHJpYnV0ZSBleGlzdHMgaW4gdGhpcyBzZXQuCisgIGJvb2wgaGFzQXR0cmlidXRlKFN0cmluZ1JlZiBLaW5kKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBhdHRyaWJ1dGUgb2JqZWN0LgorICBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgdGFyZ2V0LWRlcGVuZGVudCBhdHRyaWJ1dGUgb2JqZWN0LgorICBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKFN0cmluZ1JlZiBLaW5kKSBjb25zdDsKKworICB1bnNpZ25lZCBnZXRBbGlnbm1lbnQoKSBjb25zdDsKKyAgdW5zaWduZWQgZ2V0U3RhY2tBbGlnbm1lbnQoKSBjb25zdDsKKyAgdWludDY0X3QgZ2V0RGVyZWZlcmVuY2VhYmxlQnl0ZXMoKSBjb25zdDsKKyAgdWludDY0X3QgZ2V0RGVyZWZlcmVuY2VhYmxlT3JOdWxsQnl0ZXMoKSBjb25zdDsKKyAgc3RkOjpwYWlyPHVuc2lnbmVkLCBPcHRpb25hbDx1bnNpZ25lZD4+IGdldEFsbG9jU2l6ZUFyZ3MoKSBjb25zdDsKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoYm9vbCBJbkF0dHJHcnAgPSBmYWxzZSkgY29uc3Q7CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBjb25zdCBBdHRyaWJ1dGUgKjsKKworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0OworICBpdGVyYXRvciBlbmQoKSBjb25zdDsKKyNpZiAhZGVmaW5lZChOREVCVUcpIHx8IGRlZmluZWQoTExWTV9FTkFCTEVfRFVNUCkKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisjZW5kaWYKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGNsYXNzCisvLy8gXGJyaWVmIFByb3ZpZGUgRGVuc2VNYXBJbmZvIGZvciBBdHRyaWJ1dGVTZXQuCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPEF0dHJpYnV0ZVNldD4geworICBzdGF0aWMgQXR0cmlidXRlU2V0IGdldEVtcHR5S2V5KCkgeworICAgIGF1dG8gVmFsID0gc3RhdGljX2Nhc3Q8dWludHB0cl90PigtMSk7CisgICAgVmFsIDw8PSBQb2ludGVyTGlrZVR5cGVUcmFpdHM8dm9pZCAqPjo6TnVtTG93Qml0c0F2YWlsYWJsZTsKKyAgICByZXR1cm4gQXR0cmlidXRlU2V0KHJlaW50ZXJwcmV0X2Nhc3Q8QXR0cmlidXRlU2V0Tm9kZSAqPihWYWwpKTsKKyAgfQorCisgIHN0YXRpYyBBdHRyaWJ1dGVTZXQgZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIGF1dG8gVmFsID0gc3RhdGljX2Nhc3Q8dWludHB0cl90PigtMik7CisgICAgVmFsIDw8PSBQb2ludGVyTGlrZVR5cGVUcmFpdHM8dm9pZCAqPjo6TnVtTG93Qml0c0F2YWlsYWJsZTsKKyAgICByZXR1cm4gQXR0cmlidXRlU2V0KHJlaW50ZXJwcmV0X2Nhc3Q8QXR0cmlidXRlU2V0Tm9kZSAqPihWYWwpKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoQXR0cmlidXRlU2V0IEFTKSB7CisgICAgcmV0dXJuICh1bnNpZ25lZCgodWludHB0cl90KUFTLlNldE5vZGUpID4+IDQpIF4KKyAgICAgICAgICAgKHVuc2lnbmVkKCh1aW50cHRyX3QpQVMuU2V0Tm9kZSkgPj4gOSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKEF0dHJpYnV0ZVNldCBMSFMsIEF0dHJpYnV0ZVNldCBSSFMpIHsgcmV0dXJuIExIUyA9PSBSSFM7IH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGNsYXNzCisvLy8gXGJyaWVmIFRoaXMgY2xhc3MgaG9sZHMgdGhlIGF0dHJpYnV0ZXMgZm9yIGEgZnVuY3Rpb24sIGl0cyByZXR1cm4gdmFsdWUsIGFuZAorLy8vIGl0cyBwYXJhbWV0ZXJzLiBZb3UgYWNjZXNzIHRoZSBhdHRyaWJ1dGVzIGZvciBlYWNoIG9mIHRoZW0gdmlhIGFuIGluZGV4IGludG8KKy8vLyB0aGUgQXR0cmlidXRlTGlzdCBvYmplY3QuIFRoZSBmdW5jdGlvbiBhdHRyaWJ1dGVzIGFyZSBhdCBpbmRleAorLy8vIGBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4JywgdGhlIHJldHVybiB2YWx1ZSBpcyBhdCBpbmRleAorLy8vIGBBdHRyaWJ1dGVMaXN0OjpSZXR1cm5JbmRleCcsIGFuZCB0aGUgYXR0cmlidXRlcyBmb3IgdGhlIHBhcmFtZXRlcnMgc3RhcnQgYXQKKy8vLyBpbmRleCBgQXR0cmlidXRlTGlzdDo6Rmlyc3RBcmdJbmRleCcuCitjbGFzcyBBdHRyaWJ1dGVMaXN0IHsKK3B1YmxpYzoKKyAgZW51bSBBdHRySW5kZXggOiB1bnNpZ25lZCB7CisgICAgUmV0dXJuSW5kZXggPSAwVSwKKyAgICBGdW5jdGlvbkluZGV4ID0gfjBVLAorICAgIEZpcnN0QXJnSW5kZXggPSAxLAorICB9OworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQXR0ckJ1aWxkZXI7CisgIGZyaWVuZCBjbGFzcyBBdHRyaWJ1dGVMaXN0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIEF0dHJpYnV0ZVNldDsKKyAgZnJpZW5kIGNsYXNzIEF0dHJpYnV0ZVNldE5vZGU7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeT4gZnJpZW5kIHN0cnVjdCBEZW5zZU1hcEluZm87CisKKyAgLy8vIFxicmllZiBUaGUgYXR0cmlidXRlcyB0aGF0IHdlIGFyZSBtYW5hZ2luZy4gVGhpcyBjYW4gYmUgbnVsbCB0byByZXByZXNlbnQKKyAgLy8vIHRoZSBlbXB0eSBhdHRyaWJ1dGVzIGxpc3QuCisgIEF0dHJpYnV0ZUxpc3RJbXBsICpwSW1wbCA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGUgYW4gQXR0cmlidXRlTGlzdCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiBpdC4KKyAgc3RhdGljIEF0dHJpYnV0ZUxpc3QgZ2V0KExMVk1Db250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8c3RkOjpwYWlyPHVuc2lnbmVkLCBBdHRyaWJ1dGU+PiBBdHRycyk7CisgIHN0YXRpYyBBdHRyaWJ1dGVMaXN0IGdldChMTFZNQ29udGV4dCAmQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHN0ZDo6cGFpcjx1bnNpZ25lZCwgQXR0cmlidXRlU2V0Pj4gQXR0cnMpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuIEF0dHJpYnV0ZUxpc3QgZnJvbSBhdHRyaWJ1dGUgc2V0cyBmb3IgYSBmdW5jdGlvbiwgaXRzCisgIC8vLyByZXR1cm4gdmFsdWUsIGFuZCBhbGwgb2YgaXRzIGFyZ3VtZW50cy4KKyAgc3RhdGljIEF0dHJpYnV0ZUxpc3QgZ2V0KExMVk1Db250ZXh0ICZDLCBBdHRyaWJ1dGVTZXQgRm5BdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZVNldCBSZXRBdHRycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEF0dHJpYnV0ZVNldD4gQXJnQXR0cnMpOworCitwcml2YXRlOgorICBleHBsaWNpdCBBdHRyaWJ1dGVMaXN0KEF0dHJpYnV0ZUxpc3RJbXBsICpMSSkgOiBwSW1wbChMSSkge30KKworICBzdGF0aWMgQXR0cmlidXRlTGlzdCBnZXRJbXBsKExMVk1Db250ZXh0ICZDLCBBcnJheVJlZjxBdHRyaWJ1dGVTZXQ+IEF0dHJTZXRzKTsKKworcHVibGljOgorICBBdHRyaWJ1dGVMaXN0KCkgPSBkZWZhdWx0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBBdHRyaWJ1dGVMaXN0IENvbnN0cnVjdGlvbiBhbmQgTXV0YXRpb24KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFxicmllZiBSZXR1cm4gYW4gQXR0cmlidXRlTGlzdCB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiBpdC4KKyAgc3RhdGljIEF0dHJpYnV0ZUxpc3QgZ2V0KExMVk1Db250ZXh0ICZDLCBBcnJheVJlZjxBdHRyaWJ1dGVMaXN0PiBBdHRycyk7CisgIHN0YXRpYyBBdHRyaWJ1dGVMaXN0IGdldChMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxBdHRyaWJ1dGU6OkF0dHJLaW5kPiBLaW5kcyk7CisgIHN0YXRpYyBBdHRyaWJ1dGVMaXN0IGdldChMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTdHJpbmdSZWY+IEtpbmQpOworICBzdGF0aWMgQXR0cmlidXRlTGlzdCBnZXQoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0ckJ1aWxkZXIgJkIpOworCisgIC8vLyBcYnJpZWYgQWRkIGFuIGF0dHJpYnV0ZSB0byB0aGUgYXR0cmlidXRlIHNldCBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgIC8vLyBSZXR1cm5zIGEgbmV3IGxpc3QgYmVjYXVzZSBhdHRyaWJ1dGUgbGlzdHMgYXJlIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlTGlzdCBhZGRBdHRyaWJ1dGUoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQWRkIGFuIGF0dHJpYnV0ZSB0byB0aGUgYXR0cmlidXRlIHNldCBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgIC8vLyBSZXR1cm5zIGEgbmV3IGxpc3QgYmVjYXVzZSBhdHRyaWJ1dGUgbGlzdHMgYXJlIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlTGlzdCBhZGRBdHRyaWJ1dGUoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEluZGV4LCBTdHJpbmdSZWYgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFZhbHVlID0gU3RyaW5nUmVmKCkpIGNvbnN0OworCisgIC8vLyBBZGQgYW4gYXR0cmlidXRlIHRvIHRoZSBhdHRyaWJ1dGUgc2V0IGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgLy8vIFJldHVybnMgYSBuZXcgbGlzdCBiZWNhdXNlIGF0dHJpYnV0ZSBsaXN0cyBhcmUgaW1tdXRhYmxlLgorICBBdHRyaWJ1dGVMaXN0IGFkZEF0dHJpYnV0ZShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgSW5kZXgsIEF0dHJpYnV0ZSBBKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEFkZCBhdHRyaWJ1dGVzIHRvIHRoZSBhdHRyaWJ1dGUgc2V0IGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgLy8vIFJldHVybnMgYSBuZXcgbGlzdCBiZWNhdXNlIGF0dHJpYnV0ZSBsaXN0cyBhcmUgaW1tdXRhYmxlLgorICBBdHRyaWJ1dGVMaXN0IGFkZEF0dHJpYnV0ZXMoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXR0ckJ1aWxkZXIgJkIpIGNvbnN0OworCisgIC8vLyBBZGQgYW4gYXJndW1lbnQgYXR0cmlidXRlIHRvIHRoZSBsaXN0LiBSZXR1cm5zIGEgbmV3IGxpc3QgYmVjYXVzZQorICAvLy8gYXR0cmlidXRlIGxpc3RzIGFyZSBpbW11dGFibGUuCisgIEF0dHJpYnV0ZUxpc3QgYWRkUGFyYW1BdHRyaWJ1dGUoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFyZ05vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3QgeworICAgIHJldHVybiBhZGRBdHRyaWJ1dGUoQywgQXJnTm8gKyBGaXJzdEFyZ0luZGV4LCBLaW5kKTsKKyAgfQorCisgIC8vLyBBZGQgYW4gYXJndW1lbnQgYXR0cmlidXRlIHRvIHRoZSBsaXN0LiBSZXR1cm5zIGEgbmV3IGxpc3QgYmVjYXVzZQorICAvLy8gYXR0cmlidXRlIGxpc3RzIGFyZSBpbW11dGFibGUuCisgIEF0dHJpYnV0ZUxpc3QgYWRkUGFyYW1BdHRyaWJ1dGUoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFyZ05vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBWYWx1ZSA9IFN0cmluZ1JlZigpKSBjb25zdCB7CisgICAgcmV0dXJuIGFkZEF0dHJpYnV0ZShDLCBBcmdObyArIEZpcnN0QXJnSW5kZXgsIEtpbmQsIFZhbHVlKTsKKyAgfQorCisgIC8vLyBBZGQgYW4gYXR0cmlidXRlIHRvIHRoZSBhdHRyaWJ1dGUgbGlzdCBhdCB0aGUgZ2l2ZW4gYXJnIGluZGljZXMuIFJldHVybnMgYQorICAvLy8gbmV3IGxpc3QgYmVjYXVzZSBhdHRyaWJ1dGUgbGlzdHMgYXJlIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlTGlzdCBhZGRQYXJhbUF0dHJpYnV0ZShMTFZNQ29udGV4dCAmQywgQXJyYXlSZWY8dW5zaWduZWQ+IEFyZ05vcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGUgQSkgY29uc3Q7CisKKyAgLy8vIEFkZCBhbiBhcmd1bWVudCBhdHRyaWJ1dGUgdG8gdGhlIGxpc3QuIFJldHVybnMgYSBuZXcgbGlzdCBiZWNhdXNlCisgIC8vLyBhdHRyaWJ1dGUgbGlzdHMgYXJlIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlTGlzdCBhZGRQYXJhbUF0dHJpYnV0ZXMoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFyZ05vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyQnVpbGRlciAmQikgY29uc3QgeworICAgIHJldHVybiBhZGRBdHRyaWJ1dGVzKEMsIEFyZ05vICsgRmlyc3RBcmdJbmRleCwgQik7CisgIH0KKworICAvLy8gXGJyaWVmIFJlbW92ZSB0aGUgc3BlY2lmaWVkIGF0dHJpYnV0ZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IGZyb20gdGhpcworICAvLy8gYXR0cmlidXRlIGxpc3QuIFJldHVybnMgYSBuZXcgbGlzdCBiZWNhdXNlIGF0dHJpYnV0ZSBsaXN0cyBhcmUgaW1tdXRhYmxlLgorICBBdHRyaWJ1dGVMaXN0IHJlbW92ZUF0dHJpYnV0ZShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZW1vdmUgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBmcm9tIHRoaXMKKyAgLy8vIGF0dHJpYnV0ZSBsaXN0LiBSZXR1cm5zIGEgbmV3IGxpc3QgYmVjYXVzZSBhdHRyaWJ1dGUgbGlzdHMgYXJlIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlTGlzdCByZW1vdmVBdHRyaWJ1dGUoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgS2luZCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZW1vdmUgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGVzIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggZnJvbSB0aGlzCisgIC8vLyBhdHRyaWJ1dGUgbGlzdC4gUmV0dXJucyBhIG5ldyBsaXN0IGJlY2F1c2UgYXR0cmlidXRlIGxpc3RzIGFyZSBpbW11dGFibGUuCisgIEF0dHJpYnV0ZUxpc3QgcmVtb3ZlQXR0cmlidXRlcyhMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyQnVpbGRlciAmQXR0cnNUb1JlbW92ZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZW1vdmUgYWxsIGF0dHJpYnV0ZXMgYXQgdGhlIHNwZWNpZmllZCBpbmRleCBmcm9tIHRoaXMKKyAgLy8vIGF0dHJpYnV0ZSBsaXN0LiBSZXR1cm5zIGEgbmV3IGxpc3QgYmVjYXVzZSBhdHRyaWJ1dGUgbGlzdHMgYXJlIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlTGlzdCByZW1vdmVBdHRyaWJ1dGVzKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBJbmRleCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZW1vdmUgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgYXQgdGhlIHNwZWNpZmllZCBhcmcgaW5kZXggZnJvbSB0aGlzCisgIC8vLyBhdHRyaWJ1dGUgbGlzdC4gUmV0dXJucyBhIG5ldyBsaXN0IGJlY2F1c2UgYXR0cmlidXRlIGxpc3RzIGFyZSBpbW11dGFibGUuCisgIEF0dHJpYnV0ZUxpc3QgcmVtb3ZlUGFyYW1BdHRyaWJ1dGUoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFyZ05vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3QgeworICAgIHJldHVybiByZW1vdmVBdHRyaWJ1dGUoQywgQXJnTm8gKyBGaXJzdEFyZ0luZGV4LCBLaW5kKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVtb3ZlIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGF0IHRoZSBzcGVjaWZpZWQgYXJnIGluZGV4IGZyb20gdGhpcworICAvLy8gYXR0cmlidXRlIGxpc3QuIFJldHVybnMgYSBuZXcgbGlzdCBiZWNhdXNlIGF0dHJpYnV0ZSBsaXN0cyBhcmUgaW1tdXRhYmxlLgorICBBdHRyaWJ1dGVMaXN0IHJlbW92ZVBhcmFtQXR0cmlidXRlKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBBcmdObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgS2luZCkgY29uc3QgeworICAgIHJldHVybiByZW1vdmVBdHRyaWJ1dGUoQywgQXJnTm8gKyBGaXJzdEFyZ0luZGV4LCBLaW5kKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVtb3ZlIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGF0IHRoZSBzcGVjaWZpZWQgYXJnIGluZGV4IGZyb20gdGhpcworICAvLy8gYXR0cmlidXRlIGxpc3QuIFJldHVybnMgYSBuZXcgbGlzdCBiZWNhdXNlIGF0dHJpYnV0ZSBsaXN0cyBhcmUgaW1tdXRhYmxlLgorICBBdHRyaWJ1dGVMaXN0IHJlbW92ZVBhcmFtQXR0cmlidXRlcyhMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQXJnTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF0dHJCdWlsZGVyICZBdHRyc1RvUmVtb3ZlKSBjb25zdCB7CisgICAgcmV0dXJuIHJlbW92ZUF0dHJpYnV0ZXMoQywgQXJnTm8gKyBGaXJzdEFyZ0luZGV4LCBBdHRyc1RvUmVtb3ZlKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVtb3ZlIGFsbCBhdHRyaWJ1dGVzIGF0IHRoZSBzcGVjaWZpZWQgYXJnIGluZGV4IGZyb20gdGhpcworICAvLy8gYXR0cmlidXRlIGxpc3QuIFJldHVybnMgYSBuZXcgbGlzdCBiZWNhdXNlIGF0dHJpYnV0ZSBsaXN0cyBhcmUgaW1tdXRhYmxlLgorICBBdHRyaWJ1dGVMaXN0IHJlbW92ZVBhcmFtQXR0cmlidXRlcyhMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQXJnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gcmVtb3ZlQXR0cmlidXRlcyhDLCBBcmdObyArIEZpcnN0QXJnSW5kZXgpOworICB9CisKKyAgLy8vIFxCcmllZiBBZGQgdGhlIGRlcmVmZXJlbmNlYWJsZSBhdHRyaWJ1dGUgdG8gdGhlIGF0dHJpYnV0ZSBzZXQgYXQgdGhlIGdpdmVuCisgIC8vLyBpbmRleC4gUmV0dXJucyBhIG5ldyBsaXN0IGJlY2F1c2UgYXR0cmlidXRlIGxpc3RzIGFyZSBpbW11dGFibGUuCisgIEF0dHJpYnV0ZUxpc3QgYWRkRGVyZWZlcmVuY2VhYmxlQXR0cihMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBCeXRlcykgY29uc3Q7CisKKyAgLy8vIFxCcmllZiBBZGQgdGhlIGRlcmVmZXJlbmNlYWJsZSBhdHRyaWJ1dGUgdG8gdGhlIGF0dHJpYnV0ZSBzZXQgYXQgdGhlIGdpdmVuCisgIC8vLyBhcmcgaW5kZXguIFJldHVybnMgYSBuZXcgbGlzdCBiZWNhdXNlIGF0dHJpYnV0ZSBsaXN0cyBhcmUgaW1tdXRhYmxlLgorICBBdHRyaWJ1dGVMaXN0IGFkZERlcmVmZXJlbmNlYWJsZVBhcmFtQXR0cihMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQXJnTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEJ5dGVzKSBjb25zdCB7CisgICAgcmV0dXJuIGFkZERlcmVmZXJlbmNlYWJsZUF0dHIoQywgQXJnTm8gKyBGaXJzdEFyZ0luZGV4LCBCeXRlcyk7CisgIH0KKworICAvLy8gXGJyaWVmIEFkZCB0aGUgZGVyZWZlcmVuY2VhYmxlX29yX251bGwgYXR0cmlidXRlIHRvIHRoZSBhdHRyaWJ1dGUgc2V0IGF0CisgIC8vLyB0aGUgZ2l2ZW4gaW5kZXguIFJldHVybnMgYSBuZXcgbGlzdCBiZWNhdXNlIGF0dHJpYnV0ZSBsaXN0cyBhcmUgaW1tdXRhYmxlLgorICBBdHRyaWJ1dGVMaXN0IGFkZERlcmVmZXJlbmNlYWJsZU9yTnVsbEF0dHIoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgQnl0ZXMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQWRkIHRoZSBkZXJlZmVyZW5jZWFibGVfb3JfbnVsbCBhdHRyaWJ1dGUgdG8gdGhlIGF0dHJpYnV0ZSBzZXQgYXQKKyAgLy8vIHRoZSBnaXZlbiBhcmcgaW5kZXguIFJldHVybnMgYSBuZXcgbGlzdCBiZWNhdXNlIGF0dHJpYnV0ZSBsaXN0cyBhcmUKKyAgLy8vIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlTGlzdCBhZGREZXJlZmVyZW5jZWFibGVPck51bGxQYXJhbUF0dHIoTExWTUNvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFyZ05vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBCeXRlcykgY29uc3QgeworICAgIHJldHVybiBhZGREZXJlZmVyZW5jZWFibGVPck51bGxBdHRyKEMsIEFyZ05vICsgRmlyc3RBcmdJbmRleCwgQnl0ZXMpOworICB9CisKKyAgLy8vIEFkZCB0aGUgYWxsb2NzaXplIGF0dHJpYnV0ZSB0byB0aGUgYXR0cmlidXRlIHNldCBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgIC8vLyBSZXR1cm5zIGEgbmV3IGxpc3QgYmVjYXVzZSBhdHRyaWJ1dGUgbGlzdHMgYXJlIGltbXV0YWJsZS4KKyAgQXR0cmlidXRlTGlzdCBhZGRBbGxvY1NpemVBdHRyKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEVsZW1TaXplQXJnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uYWw8dW5zaWduZWQ+ICZOdW1FbGVtc0FyZyk7CisKKyAgLy8vIEFkZCB0aGUgYWxsb2NzaXplIGF0dHJpYnV0ZSB0byB0aGUgYXR0cmlidXRlIHNldCBhdCB0aGUgZ2l2ZW4gYXJnIGluZGV4LgorICAvLy8gUmV0dXJucyBhIG5ldyBsaXN0IGJlY2F1c2UgYXR0cmlidXRlIGxpc3RzIGFyZSBpbW11dGFibGUuCisgIEF0dHJpYnV0ZUxpc3QgYWRkQWxsb2NTaXplUGFyYW1BdHRyKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBBcmdObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRWxlbVNpemVBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbmFsPHVuc2lnbmVkPiAmTnVtRWxlbXNBcmcpIHsKKyAgICByZXR1cm4gYWRkQWxsb2NTaXplQXR0cihDLCBBcmdObyArIEZpcnN0QXJnSW5kZXgsIEVsZW1TaXplQXJnLCBOdW1FbGVtc0FyZyk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQXR0cmlidXRlTGlzdCBBY2Nlc3NvcnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgTExWTSBjb250ZXh0LgorICBMTFZNQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVGhlIGF0dHJpYnV0ZXMgZm9yIHRoZSBzcGVjaWZpZWQgaW5kZXggYXJlIHJldHVybmVkLgorICBBdHRyaWJ1dGVTZXQgZ2V0QXR0cmlidXRlcyh1bnNpZ25lZCBJbmRleCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUaGUgYXR0cmlidXRlcyBmb3IgdGhlIGFyZ3VtZW50IG9yIHBhcmFtZXRlciBhdCB0aGUgZ2l2ZW4gaW5kZXggYXJlCisgIC8vLyByZXR1cm5lZC4KKyAgQXR0cmlidXRlU2V0IGdldFBhcmFtQXR0cmlidXRlcyh1bnNpZ25lZCBBcmdObykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUaGUgYXR0cmlidXRlcyBmb3IgdGhlIHJldCB2YWx1ZSBhcmUgcmV0dXJuZWQuCisgIEF0dHJpYnV0ZVNldCBnZXRSZXRBdHRyaWJ1dGVzKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUaGUgZnVuY3Rpb24gYXR0cmlidXRlcyBhcmUgcmV0dXJuZWQuCisgIEF0dHJpYnV0ZVNldCBnZXRGbkF0dHJpYnV0ZXMoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgZXhpc3RzIGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgYm9vbCBoYXNBdHRyaWJ1dGUodW5zaWduZWQgSW5kZXgsIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGV4aXN0cyBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgIGJvb2wgaGFzQXR0cmlidXRlKHVuc2lnbmVkIEluZGV4LCBTdHJpbmdSZWYgS2luZCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBhdHRyaWJ1dGUgZXhpc3RzIGF0IHRoZSBnaXZlbiBpbmRleC4KKyAgYm9vbCBoYXNBdHRyaWJ1dGVzKHVuc2lnbmVkIEluZGV4KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBhdHRyaWJ1dGUgZXhpc3RzIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnQKKyAgYm9vbCBoYXNQYXJhbUF0dHIodW5zaWduZWQgQXJnTm8sIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3QgeworICAgIHJldHVybiBoYXNBdHRyaWJ1dGUoQXJnTm8gKyBGaXJzdEFyZ0luZGV4LCBLaW5kKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGF0dHJpYnV0ZSBleGlzdHMgZm9yIHRoZSBnaXZlbiBhcmd1bWVudAorICBib29sIGhhc1BhcmFtQXR0cih1bnNpZ25lZCBBcmdObywgU3RyaW5nUmVmIEtpbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzQXR0cmlidXRlKEFyZ05vICsgRmlyc3RBcmdJbmRleCwgS2luZCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIGF0dHJpYnV0ZXMgZXhpc3RzIGZvciB0aGUgZ2l2ZW4gYXJndW1lbnQKKyAgYm9vbCBoYXNQYXJhbUF0dHJzKHVuc2lnbmVkIEFyZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0F0dHJpYnV0ZXMoQXJnTm8gKyBGaXJzdEFyZ0luZGV4KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRXF1aXZhbGVudCB0byBoYXNBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgS2luZCkgYnV0CisgIC8vLyBtYXkgYmUgZmFzdGVyLgorICBib29sIGhhc0ZuQXR0cmlidXRlKEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBFcXVpdmFsZW50IHRvIGhhc0F0dHJpYnV0ZShBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBLaW5kKSBidXQKKyAgLy8vIG1heSBiZSBmYXN0ZXIuCisgIGJvb2wgaGFzRm5BdHRyaWJ1dGUoU3RyaW5nUmVmIEtpbmQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRXF1aXZhbGVudCB0byBoYXNBdHRyaWJ1dGUoQXJnTm8gKyBGaXJzdEFyZ0luZGV4LCBLaW5kKS4KKyAgYm9vbCBoYXNQYXJhbUF0dHJpYnV0ZSh1bnNpZ25lZCBBcmdObywgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgYXR0cmlidXRlIGlzIHNldCBmb3IgYXQgbGVhc3Qgb25lCisgIC8vLyBwYXJhbWV0ZXIgb3IgZm9yIHRoZSByZXR1cm4gdmFsdWUuIElmIEluZGV4IGlzIG5vdCBudWxscHRyLCB0aGUgaW5kZXgKKyAgLy8vIG9mIGEgcGFyYW1ldGVyIHdpdGggdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUgaXMgcHJvdmlkZWQuCisgIGJvb2wgaGFzQXR0clNvbWV3aGVyZShBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAqSW5kZXggPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgYXR0cmlidXRlIG9iamVjdCB0aGF0IGV4aXN0cyBhdCB0aGUgZ2l2ZW4gaW5kZXguCisgIEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUodW5zaWduZWQgSW5kZXgsIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBvYmplY3QgdGhhdCBleGlzdHMgYXQgdGhlIGdpdmVuIGluZGV4LgorICBBdHRyaWJ1dGUgZ2V0QXR0cmlidXRlKHVuc2lnbmVkIEluZGV4LCBTdHJpbmdSZWYgS2luZCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBvYmplY3QgdGhhdCBleGlzdHMgYXQgdGhlIGFyZyBpbmRleC4KKyAgQXR0cmlidXRlIGdldFBhcmFtQXR0cih1bnNpZ25lZCBBcmdObywgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEF0dHJpYnV0ZShBcmdObyArIEZpcnN0QXJnSW5kZXgsIEtpbmQpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBvYmplY3QgdGhhdCBleGlzdHMgYXQgdGhlIGdpdmVuIGluZGV4LgorICBBdHRyaWJ1dGUgZ2V0UGFyYW1BdHRyKHVuc2lnbmVkIEFyZ05vLCBTdHJpbmdSZWYgS2luZCkgY29uc3QgeworICAgIHJldHVybiBnZXRBdHRyaWJ1dGUoQXJnTm8gKyBGaXJzdEFyZ0luZGV4LCBLaW5kKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBhbGlnbm1lbnQgb2YgdGhlIHJldHVybiB2YWx1ZS4KKyAgdW5zaWduZWQgZ2V0UmV0QWxpZ25tZW50KCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGFsaWdubWVudCBmb3IgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBwYXJhbWV0ZXIuCisgIHVuc2lnbmVkIGdldFBhcmFtQWxpZ25tZW50KHVuc2lnbmVkIEFyZ05vKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgc3RhY2sgYWxpZ25tZW50LgorICB1bnNpZ25lZCBnZXRTdGFja0FsaWdubWVudCh1bnNpZ25lZCBJbmRleCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG51bWJlciBvZiBkZXJlZmVyZW5jZWFibGUgYnl0ZXMgKG9yIHplcm8gaWYgdW5rbm93bikuCisgIHVpbnQ2NF90IGdldERlcmVmZXJlbmNlYWJsZUJ5dGVzKHVuc2lnbmVkIEluZGV4KSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgbnVtYmVyIG9mIGRlcmVmZXJlbmNlYWJsZSBieXRlcyAob3IgemVybyBpZiB1bmtub3duKSBvZiBhbgorICAvLy8gYXJnLgorICB1aW50NjRfdCBnZXRQYXJhbURlcmVmZXJlbmNlYWJsZUJ5dGVzKHVuc2lnbmVkIEFyZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIGdldERlcmVmZXJlbmNlYWJsZUJ5dGVzKEFyZ05vICsgRmlyc3RBcmdJbmRleCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbnVtYmVyIG9mIGRlcmVmZXJlbmNlYWJsZV9vcl9udWxsIGJ5dGVzIChvciB6ZXJvIGlmCisgIC8vLyB1bmtub3duKS4KKyAgdWludDY0X3QgZ2V0RGVyZWZlcmVuY2VhYmxlT3JOdWxsQnl0ZXModW5zaWduZWQgSW5kZXgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBudW1iZXIgb2YgZGVyZWZlcmVuY2VhYmxlX29yX251bGwgYnl0ZXMgKG9yIHplcm8gaWYKKyAgLy8vIHVua25vd24pIG9mIGFuIGFyZy4KKyAgdWludDY0X3QgZ2V0UGFyYW1EZXJlZmVyZW5jZWFibGVPck51bGxCeXRlcyh1bnNpZ25lZCBBcmdObykgY29uc3QgeworICAgIHJldHVybiBnZXREZXJlZmVyZW5jZWFibGVPck51bGxCeXRlcyhBcmdObyArIEZpcnN0QXJnSW5kZXgpOworICB9CisKKyAgLy8vIEdldCB0aGUgYWxsb2NzaXplIGFyZ3VtZW50IG51bWJlcnMgKG9yIHBhaXIoMCwgMCkgaWYgdW5rbm93bikuCisgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgT3B0aW9uYWw8dW5zaWduZWQ+PgorICBnZXRBbGxvY1NpemVBcmdzKHVuc2lnbmVkIEluZGV4KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgYXR0cmlidXRlcyBhdCB0aGUgaW5kZXggYXMgYSBzdHJpbmcuCisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKHVuc2lnbmVkIEluZGV4LCBib29sIEluQXR0ckdycCA9IGZhbHNlKSBjb25zdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQXR0cmlidXRlTGlzdCBJbnRyb3NwZWN0aW9uCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIHVzaW5nIGl0ZXJhdG9yID0gY29uc3QgQXR0cmlidXRlU2V0ICo7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdDsKKyAgaXRlcmF0b3IgZW5kKCkgY29uc3Q7CisKKyAgdW5zaWduZWQgZ2V0TnVtQXR0clNldHMoKSBjb25zdDsKKworICAvLy8gVXNlIHRoZXNlIHRvIGl0ZXJhdGUgb3ZlciB0aGUgdmFsaWQgYXR0cmlidXRlIGluZGljZXMuCisgIHVuc2lnbmVkIGluZGV4X2JlZ2luKCkgY29uc3QgeyByZXR1cm4gQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleDsgfQorICB1bnNpZ25lZCBpbmRleF9lbmQoKSBjb25zdCB7IHJldHVybiBnZXROdW1BdHRyU2V0cygpIC0gMTsgfQorCisgIC8vLyBvcGVyYXRvcj09LyE9IC0gUHJvdmlkZSBlcXVhbGl0eSBwcmVkaWNhdGVzLgorICBib29sIG9wZXJhdG9yPT0oY29uc3QgQXR0cmlidXRlTGlzdCAmUkhTKSBjb25zdCB7IHJldHVybiBwSW1wbCA9PSBSSFMucEltcGw7IH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEF0dHJpYnV0ZUxpc3QgJlJIUykgY29uc3QgeyByZXR1cm4gcEltcGwgIT0gUkhTLnBJbXBsOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSByYXcgcG9pbnRlciB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyBhdHRyaWJ1dGUgbGlzdC4KKyAgdm9pZCAqZ2V0UmF3UG9pbnRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gcEltcGw7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZXJlIGFyZSBubyBhdHRyaWJ1dGVzLgorICBib29sIGlzRW1wdHkoKSBjb25zdCB7IHJldHVybiBwSW1wbCA9PSBudWxscHRyOyB9CisKKyAgdm9pZCBkdW1wKCkgY29uc3Q7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxjbGFzcworLy8vIFxicmllZiBQcm92aWRlIERlbnNlTWFwSW5mbyBmb3IgQXR0cmlidXRlTGlzdC4KK3RlbXBsYXRlIDw+IHN0cnVjdCBEZW5zZU1hcEluZm88QXR0cmlidXRlTGlzdD4geworICBzdGF0aWMgQXR0cmlidXRlTGlzdCBnZXRFbXB0eUtleSgpIHsKKyAgICBhdXRvIFZhbCA9IHN0YXRpY19jYXN0PHVpbnRwdHJfdD4oLTEpOworICAgIFZhbCA8PD0gUG9pbnRlckxpa2VUeXBlVHJhaXRzPHZvaWQqPjo6TnVtTG93Qml0c0F2YWlsYWJsZTsKKyAgICByZXR1cm4gQXR0cmlidXRlTGlzdChyZWludGVycHJldF9jYXN0PEF0dHJpYnV0ZUxpc3RJbXBsICo+KFZhbCkpOworICB9CisKKyAgc3RhdGljIEF0dHJpYnV0ZUxpc3QgZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIGF1dG8gVmFsID0gc3RhdGljX2Nhc3Q8dWludHB0cl90PigtMik7CisgICAgVmFsIDw8PSBQb2ludGVyTGlrZVR5cGVUcmFpdHM8dm9pZCo+OjpOdW1Mb3dCaXRzQXZhaWxhYmxlOworICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0KHJlaW50ZXJwcmV0X2Nhc3Q8QXR0cmlidXRlTGlzdEltcGwgKj4oVmFsKSk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKEF0dHJpYnV0ZUxpc3QgQVMpIHsKKyAgICByZXR1cm4gKHVuc2lnbmVkKCh1aW50cHRyX3QpQVMucEltcGwpID4+IDQpIF4KKyAgICAgICAgICAgKHVuc2lnbmVkKCh1aW50cHRyX3QpQVMucEltcGwpID4+IDkpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChBdHRyaWJ1dGVMaXN0IExIUywgQXR0cmlidXRlTGlzdCBSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcY2xhc3MKKy8vLyBcYnJpZWYgVGhpcyBjbGFzcyBpcyB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIEF0dHJpYnV0ZTo6Z2V0IG1ldGhvZCB0bworLy8vIGNyZWF0ZSBhbiBBdHRyaWJ1dGUgb2JqZWN0LiBUaGUgb2JqZWN0IGl0c2VsZiBpcyB1bmlxdWlmaWVkLiBUaGUgQnVpbGRlcidzCisvLy8gdmFsdWUsIGhvd2V2ZXIsIGlzIG5vdC4gU28gdGhpcyBjYW4gYmUgdXNlZCBhcyBhIHF1aWNrIHdheSB0byB0ZXN0IGZvcgorLy8vIGVxdWFsaXR5LCBwcmVzZW5jZSBvZiBhdHRyaWJ1dGVzLCBldGMuCitjbGFzcyBBdHRyQnVpbGRlciB7CisgIHN0ZDo6Yml0c2V0PEF0dHJpYnV0ZTo6RW5kQXR0cktpbmRzPiBBdHRyczsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBUYXJnZXREZXBBdHRyczsKKyAgdWludDY0X3QgQWxpZ25tZW50ID0gMDsKKyAgdWludDY0X3QgU3RhY2tBbGlnbm1lbnQgPSAwOworICB1aW50NjRfdCBEZXJlZkJ5dGVzID0gMDsKKyAgdWludDY0X3QgRGVyZWZPck51bGxCeXRlcyA9IDA7CisgIHVpbnQ2NF90IEFsbG9jU2l6ZUFyZ3MgPSAwOworCitwdWJsaWM6CisgIEF0dHJCdWlsZGVyKCkgPSBkZWZhdWx0OworCisgIEF0dHJCdWlsZGVyKGNvbnN0IEF0dHJpYnV0ZSAmQSkgeworICAgIGFkZEF0dHJpYnV0ZShBKTsKKyAgfQorCisgIEF0dHJCdWlsZGVyKEF0dHJpYnV0ZUxpc3QgQVMsIHVuc2lnbmVkIElkeCk7CisgIEF0dHJCdWlsZGVyKEF0dHJpYnV0ZVNldCBBUyk7CisKKyAgdm9pZCBjbGVhcigpOworCisgIC8vLyBcYnJpZWYgQWRkIGFuIGF0dHJpYnV0ZSB0byB0aGUgYnVpbGRlci4KKyAgQXR0ckJ1aWxkZXIgJmFkZEF0dHJpYnV0ZShBdHRyaWJ1dGU6OkF0dHJLaW5kIFZhbCk7CisKKyAgLy8vIFxicmllZiBBZGQgdGhlIEF0dHJpYnV0ZSBvYmplY3QgdG8gdGhlIGJ1aWxkZXIuCisgIEF0dHJCdWlsZGVyICZhZGRBdHRyaWJ1dGUoQXR0cmlidXRlIEEpOworCisgIC8vLyBcYnJpZWYgQWRkIHRoZSB0YXJnZXQtZGVwZW5kZW50IGF0dHJpYnV0ZSB0byB0aGUgYnVpbGRlci4KKyAgQXR0ckJ1aWxkZXIgJmFkZEF0dHJpYnV0ZShTdHJpbmdSZWYgQSwgU3RyaW5nUmVmIFYgPSBTdHJpbmdSZWYoKSk7CisKKyAgLy8vIFxicmllZiBSZW1vdmUgYW4gYXR0cmlidXRlIGZyb20gdGhlIGJ1aWxkZXIuCisgIEF0dHJCdWlsZGVyICZyZW1vdmVBdHRyaWJ1dGUoQXR0cmlidXRlOjpBdHRyS2luZCBWYWwpOworCisgIC8vLyBcYnJpZWYgUmVtb3ZlIHRoZSBhdHRyaWJ1dGVzIGZyb20gdGhlIGJ1aWxkZXIuCisgIEF0dHJCdWlsZGVyICZyZW1vdmVBdHRyaWJ1dGVzKEF0dHJpYnV0ZUxpc3QgQSwgdWludDY0X3QgV2l0aG91dEluZGV4KTsKKworICAvLy8gXGJyaWVmIFJlbW92ZSB0aGUgdGFyZ2V0LWRlcGVuZGVudCBhdHRyaWJ1dGUgdG8gdGhlIGJ1aWxkZXIuCisgIEF0dHJCdWlsZGVyICZyZW1vdmVBdHRyaWJ1dGUoU3RyaW5nUmVmIEEpOworCisgIC8vLyBcYnJpZWYgQWRkIHRoZSBhdHRyaWJ1dGVzIGZyb20gdGhlIGJ1aWxkZXIuCisgIEF0dHJCdWlsZGVyICZtZXJnZShjb25zdCBBdHRyQnVpbGRlciAmQik7CisKKyAgLy8vIFxicmllZiBSZW1vdmUgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgYnVpbGRlci4KKyAgQXR0ckJ1aWxkZXIgJnJlbW92ZShjb25zdCBBdHRyQnVpbGRlciAmQik7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYnVpbGRlciBoYXMgYW55IGF0dHJpYnV0ZSB0aGF0J3MgaW4gdGhlCisgIC8vLyBzcGVjaWZpZWQgYnVpbGRlci4KKyAgYm9vbCBvdmVybGFwcyhjb25zdCBBdHRyQnVpbGRlciAmQikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYnVpbGRlciBoYXMgdGhlIHNwZWNpZmllZCBhdHRyaWJ1dGUuCisgIGJvb2wgY29udGFpbnMoQXR0cmlidXRlOjpBdHRyS2luZCBBKSBjb25zdCB7CisgICAgYXNzZXJ0KCh1bnNpZ25lZClBIDwgQXR0cmlidXRlOjpFbmRBdHRyS2luZHMgJiYgIkF0dHJpYnV0ZSBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIEF0dHJzW0FdOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYnVpbGRlciBoYXMgdGhlIHNwZWNpZmllZCB0YXJnZXQtZGVwZW5kZW50CisgIC8vLyBhdHRyaWJ1dGUuCisgIGJvb2wgY29udGFpbnMoU3RyaW5nUmVmIEEpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGJ1aWxkZXIgaGFzIElSLWxldmVsIGF0dHJpYnV0ZXMuCisgIGJvb2wgaGFzQXR0cmlidXRlcygpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGJ1aWxkZXIgaGFzIGFueSBhdHRyaWJ1dGUgdGhhdCdzIGluIHRoZQorICAvLy8gc3BlY2lmaWVkIGF0dHJpYnV0ZS4KKyAgYm9vbCBoYXNBdHRyaWJ1dGVzKEF0dHJpYnV0ZUxpc3QgQSwgdWludDY0X3QgSW5kZXgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGJ1aWxkZXIgaGFzIGFuIGFsaWdubWVudCBhdHRyaWJ1dGUuCisgIGJvb2wgaGFzQWxpZ25tZW50QXR0cigpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0cmlldmUgdGhlIGFsaWdubWVudCBhdHRyaWJ1dGUsIGlmIGl0IGV4aXN0cy4KKyAgdWludDY0X3QgZ2V0QWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gQWxpZ25tZW50OyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgc3RhY2sgYWxpZ25tZW50IGF0dHJpYnV0ZSwgaWYgaXQgZXhpc3RzLgorICB1aW50NjRfdCBnZXRTdGFja0FsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuIFN0YWNrQWxpZ25tZW50OyB9CisKKyAgLy8vIFxicmllZiBSZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIGRlcmVmZXJlbmNlYWJsZSBieXRlcywgaWYgdGhlCisgIC8vLyBkZXJlZmVyZW5jZWFibGUgYXR0cmlidXRlIGV4aXN0cyAoemVybyBpcyByZXR1cm5lZCBvdGhlcndpc2UpLgorICB1aW50NjRfdCBnZXREZXJlZmVyZW5jZWFibGVCeXRlcygpIGNvbnN0IHsgcmV0dXJuIERlcmVmQnl0ZXM7IH0KKworICAvLy8gXGJyaWVmIFJldHJpZXZlIHRoZSBudW1iZXIgb2YgZGVyZWZlcmVuY2VhYmxlX29yX251bGwgYnl0ZXMsIGlmIHRoZQorICAvLy8gZGVyZWZlcmVuY2VhYmxlX29yX251bGwgYXR0cmlidXRlIGV4aXN0cyAoemVybyBpcyByZXR1cm5lZCBvdGhlcndpc2UpLgorICB1aW50NjRfdCBnZXREZXJlZmVyZW5jZWFibGVPck51bGxCeXRlcygpIGNvbnN0IHsgcmV0dXJuIERlcmVmT3JOdWxsQnl0ZXM7IH0KKworICAvLy8gUmV0cmlldmUgdGhlIGFsbG9jc2l6ZSBhcmdzLCBpZiB0aGUgYWxsb2NzaXplIGF0dHJpYnV0ZSBleGlzdHMuICBJZiBpdAorICAvLy8gZG9lc24ndCBleGlzdCwgcGFpcigwLCAwKSBpcyByZXR1cm5lZC4KKyAgc3RkOjpwYWlyPHVuc2lnbmVkLCBPcHRpb25hbDx1bnNpZ25lZD4+IGdldEFsbG9jU2l6ZUFyZ3MoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFRoaXMgdHVybnMgYW4gaW50IGFsaWdubWVudCAod2hpY2ggbXVzdCBiZSBhIHBvd2VyIG9mIDIpIGludG8gdGhlCisgIC8vLyBmb3JtIHVzZWQgaW50ZXJuYWxseSBpbiBBdHRyaWJ1dGUuCisgIEF0dHJCdWlsZGVyICZhZGRBbGlnbm1lbnRBdHRyKHVuc2lnbmVkIEFsaWduKTsKKworICAvLy8gXGJyaWVmIFRoaXMgdHVybnMgYW4gaW50IHN0YWNrIGFsaWdubWVudCAod2hpY2ggbXVzdCBiZSBhIHBvd2VyIG9mIDIpIGludG8KKyAgLy8vIHRoZSBmb3JtIHVzZWQgaW50ZXJuYWxseSBpbiBBdHRyaWJ1dGUuCisgIEF0dHJCdWlsZGVyICZhZGRTdGFja0FsaWdubWVudEF0dHIodW5zaWduZWQgQWxpZ24pOworCisgIC8vLyBcYnJpZWYgVGhpcyB0dXJucyB0aGUgbnVtYmVyIG9mIGRlcmVmZXJlbmNlYWJsZSBieXRlcyBpbnRvIHRoZSBmb3JtIHVzZWQKKyAgLy8vIGludGVybmFsbHkgaW4gQXR0cmlidXRlLgorICBBdHRyQnVpbGRlciAmYWRkRGVyZWZlcmVuY2VhYmxlQXR0cih1aW50NjRfdCBCeXRlcyk7CisKKyAgLy8vIFxicmllZiBUaGlzIHR1cm5zIHRoZSBudW1iZXIgb2YgZGVyZWZlcmVuY2VhYmxlX29yX251bGwgYnl0ZXMgaW50byB0aGUKKyAgLy8vIGZvcm0gdXNlZCBpbnRlcm5hbGx5IGluIEF0dHJpYnV0ZS4KKyAgQXR0ckJ1aWxkZXIgJmFkZERlcmVmZXJlbmNlYWJsZU9yTnVsbEF0dHIodWludDY0X3QgQnl0ZXMpOworCisgIC8vLyBUaGlzIHR1cm5zIG9uZSAob3IgdHdvKSBpbnRzIGludG8gdGhlIGZvcm0gdXNlZCBpbnRlcm5hbGx5IGluIEF0dHJpYnV0ZS4KKyAgQXR0ckJ1aWxkZXIgJmFkZEFsbG9jU2l6ZUF0dHIodW5zaWduZWQgRWxlbVNpemVBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbmFsPHVuc2lnbmVkPiAmTnVtRWxlbXNBcmcpOworCisgIC8vLyBBZGQgYW4gYWxsb2NzaXplIGF0dHJpYnV0ZSwgdXNpbmcgdGhlIHJlcHJlc2VudGF0aW9uIHJldHVybmVkIGJ5CisgIC8vLyBBdHRyaWJ1dGUuZ2V0SW50VmFsdWUoKS4KKyAgQXR0ckJ1aWxkZXIgJmFkZEFsbG9jU2l6ZUF0dHJGcm9tUmF3UmVwcih1aW50NjRfdCBSYXdBbGxvY1NpemVSZXByKTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBidWlsZGVyIGNvbnRhaW5zIG5vIHRhcmdldC1pbmRlcGVuZGVudAorICAvLy8gYXR0cmlidXRlcy4KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEF0dHJzLm5vbmUoKTsgfQorCisgIC8vIEl0ZXJhdG9ycyBmb3IgdGFyZ2V0LWRlcGVuZGVudCBhdHRyaWJ1dGVzLgorICB1c2luZyB0ZF90eXBlID0gc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz47CisgIHVzaW5nIHRkX2l0ZXJhdG9yID0gc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6aXRlcmF0b3I7CisgIHVzaW5nIHRkX2NvbnN0X2l0ZXJhdG9yID0gc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIHRkX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8dGRfaXRlcmF0b3I+OworICB1c2luZyB0ZF9jb25zdF9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPHRkX2NvbnN0X2l0ZXJhdG9yPjsKKworICB0ZF9pdGVyYXRvciB0ZF9iZWdpbigpIHsgcmV0dXJuIFRhcmdldERlcEF0dHJzLmJlZ2luKCk7IH0KKyAgdGRfaXRlcmF0b3IgdGRfZW5kKCkgeyByZXR1cm4gVGFyZ2V0RGVwQXR0cnMuZW5kKCk7IH0KKworICB0ZF9jb25zdF9pdGVyYXRvciB0ZF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIFRhcmdldERlcEF0dHJzLmJlZ2luKCk7IH0KKyAgdGRfY29uc3RfaXRlcmF0b3IgdGRfZW5kKCkgY29uc3QgeyByZXR1cm4gVGFyZ2V0RGVwQXR0cnMuZW5kKCk7IH0KKworICB0ZF9yYW5nZSB0ZF9hdHRycygpIHsgcmV0dXJuIHRkX3JhbmdlKHRkX2JlZ2luKCksIHRkX2VuZCgpKTsgfQorCisgIHRkX2NvbnN0X3JhbmdlIHRkX2F0dHJzKCkgY29uc3QgeworICAgIHJldHVybiB0ZF9jb25zdF9yYW5nZSh0ZF9iZWdpbigpLCB0ZF9lbmQoKSk7CisgIH0KKworICBib29sIHRkX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gVGFyZ2V0RGVwQXR0cnMuZW1wdHkoKTsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBdHRyQnVpbGRlciAmQik7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBdHRyQnVpbGRlciAmQikgeworICAgIHJldHVybiAhKCp0aGlzID09IEIpOworICB9Cit9OworCituYW1lc3BhY2UgQXR0cmlidXRlRnVuY3MgeworCisvLy8gXGJyaWVmIFdoaWNoIGF0dHJpYnV0ZXMgY2Fubm90IGJlIGFwcGxpZWQgdG8gYSB0eXBlLgorQXR0ckJ1aWxkZXIgdHlwZUluY29tcGF0aWJsZShUeXBlICpUeSk7CisKKy8vLyBccmV0dXJucyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHdvIGZ1bmN0aW9ucyBoYXZlIGNvbXBhdGlibGUgdGFyZ2V0LWluZGVwZW5kZW50CisvLy8gYXR0cmlidXRlcyBmb3IgaW5saW5pbmcgcHVycG9zZXMuCitib29sIGFyZUlubGluZUNvbXBhdGlibGUoY29uc3QgRnVuY3Rpb24gJkNhbGxlciwgY29uc3QgRnVuY3Rpb24gJkNhbGxlZSk7CisKKy8vLyBcYnJpZWYgTWVyZ2UgY2FsbGVyJ3MgYW5kIGNhbGxlZSdzIGF0dHJpYnV0ZXMuCit2b2lkIG1lcmdlQXR0cmlidXRlc0ZvcklubGluaW5nKEZ1bmN0aW9uICZDYWxsZXIsIGNvbnN0IEZ1bmN0aW9uICZDYWxsZWUpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgQXR0cmlidXRlRnVuY3MKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfQVRUUklCVVRFU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0F0dHJpYnV0ZXMudGQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0F0dHJpYnV0ZXMudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU0ZjBkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQXR0cmlidXRlcy50ZApAQCAtMCwwICsxLDIzMyBAQAorLy8vIEF0dHJpYnV0ZSBiYXNlIGNsYXNzLgorY2xhc3MgQXR0cjxzdHJpbmcgUz4geworICAvLyBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBhdHRyaWJ1dGUgaW4gdGhlIElSLgorICBzdHJpbmcgQXR0clN0cmluZyA9IFM7Cit9CisKKy8vLyBFbnVtIGF0dHJpYnV0ZS4KK2NsYXNzIEVudW1BdHRyPHN0cmluZyBTPiA6IEF0dHI8Uz47CisKKy8vLyBTdHJpbmdCb29sIGF0dHJpYnV0ZS4KK2NsYXNzIFN0ckJvb2xBdHRyPHN0cmluZyBTPiA6IEF0dHI8Uz47CisKKy8vLyBUYXJnZXQtaW5kZXBlbmRlbnQgZW51bSBhdHRyaWJ1dGVzLgorCisvLy8gQWxpZ25tZW50IG9mIHBhcmFtZXRlciAoNSBiaXRzKSBzdG9yZWQgYXMgbG9nMiBvZiBhbGlnbm1lbnQgd2l0aCArMSBiaWFzLgorLy8vIDAgbWVhbnMgdW5hbGlnbmVkIChkaWZmZXJlbnQgZnJvbSBhbGlnbigxKSkuCitkZWYgQWxpZ25tZW50IDogRW51bUF0dHI8ImFsaWduIj47CisKKy8vLyBUaGUgcmVzdWx0IG9mIHRoZSBmdW5jdGlvbiBpcyBndWFyYW50ZWVkIHRvIHBvaW50IHRvIGEgbnVtYmVyIG9mIGJ5dGVzIHRoYXQKKy8vLyB3ZSBjYW4gZGV0ZXJtaW5lIGlmIHdlIGtub3cgdGhlIHZhbHVlIG9mIHRoZSBmdW5jdGlvbidzIGFyZ3VtZW50cy4KK2RlZiBBbGxvY1NpemUgOiBFbnVtQXR0cjwiYWxsb2NzaXplIj47CisKKy8vLyBpbmxpbmU9YWx3YXlzLgorZGVmIEFsd2F5c0lubGluZSA6IEVudW1BdHRyPCJhbHdheXNpbmxpbmUiPjsKKworLy8vIEZ1bmN0aW9uIGNhbiBhY2Nlc3MgbWVtb3J5IG9ubHkgdXNpbmcgcG9pbnRlcnMgYmFzZWQgb24gaXRzIGFyZ3VtZW50cy4KK2RlZiBBcmdNZW1Pbmx5IDogRW51bUF0dHI8ImFyZ21lbW9ubHkiPjsKKworLy8vIENhbGxlZSBpcyByZWNvZ25pemVkIGFzIGEgYnVpbHRpbiwgZGVzcGl0ZSBub2J1aWx0aW4gYXR0cmlidXRlIG9uIGl0cworLy8vIGRlY2xhcmF0aW9uLgorZGVmIEJ1aWx0aW4gOiBFbnVtQXR0cjwiYnVpbHRpbiI+OworCisvLy8gUGFzcyBzdHJ1Y3R1cmUgYnkgdmFsdWUuCitkZWYgQnlWYWwgOiBFbnVtQXR0cjwiYnl2YWwiPjsKKworLy8vIE1hcmtzIGZ1bmN0aW9uIGFzIGJlaW5nIGluIGEgY29sZCBwYXRoLgorZGVmIENvbGQgOiBFbnVtQXR0cjwiY29sZCI+OworCisvLy8gQ2FuIG9ubHkgYmUgbW92ZWQgdG8gY29udHJvbC1lcXVpdmFsZW50IGJsb2Nrcy4KK2RlZiBDb252ZXJnZW50IDogRW51bUF0dHI8ImNvbnZlcmdlbnQiPjsKKworLy8vIFBvaW50ZXIgaXMga25vd24gdG8gYmUgZGVyZWZlcmVuY2VhYmxlLgorZGVmIERlcmVmZXJlbmNlYWJsZSA6IEVudW1BdHRyPCJkZXJlZmVyZW5jZWFibGUiPjsKKworLy8vIFBvaW50ZXIgaXMgZWl0aGVyIG51bGwgb3IgZGVyZWZlcmVuY2VhYmxlLgorZGVmIERlcmVmZXJlbmNlYWJsZU9yTnVsbCA6IEVudW1BdHRyPCJkZXJlZmVyZW5jZWFibGVfb3JfbnVsbCI+OworCisvLy8gRnVuY3Rpb24gbWF5IG9ubHkgYWNjZXNzIG1lbW9yeSB0aGF0IGlzIGluYWNjZXNzaWJsZSBmcm9tIElSLgorZGVmIEluYWNjZXNzaWJsZU1lbU9ubHkgOiBFbnVtQXR0cjwiaW5hY2Nlc3NpYmxlbWVtb25seSI+OworCisvLy8gRnVuY3Rpb24gbWF5IG9ubHkgYWNjZXNzIG1lbW9yeSB0aGF0IGlzIGVpdGhlciBpbmFjY2Vzc2libGUgZnJvbSB0aGUgSVIsCisvLy8gb3IgcG9pbnRlZCB0byBieSBpdHMgcG9pbnRlciBhcmd1bWVudHMuCitkZWYgSW5hY2Nlc3NpYmxlTWVtT3JBcmdNZW1Pbmx5IDogRW51bUF0dHI8ImluYWNjZXNzaWJsZW1lbV9vcl9hcmdtZW1vbmx5Ij47CisKKy8vLyBQYXNzIHN0cnVjdHVyZSBpbiBhbiBhbGxvY2EuCitkZWYgSW5BbGxvY2EgOiBFbnVtQXR0cjwiaW5hbGxvY2EiPjsKKworLy8vIFNvdXJjZSBzYWlkIGlubGluaW5nIHdhcyBkZXNpcmFibGUuCitkZWYgSW5saW5lSGludCA6IEVudW1BdHRyPCJpbmxpbmVoaW50Ij47CisKKy8vLyBGb3JjZSBhcmd1bWVudCB0byBiZSBwYXNzZWQgaW4gcmVnaXN0ZXIuCitkZWYgSW5SZWcgOiBFbnVtQXR0cjwiaW5yZWciPjsKKworLy8vIEJ1aWxkIGp1bXAtaW5zdHJ1Y3Rpb24gdGFibGVzIGFuZCByZXBsYWNlIHJlZnMuCitkZWYgSnVtcFRhYmxlIDogRW51bUF0dHI8Imp1bXB0YWJsZSI+OworCisvLy8gRnVuY3Rpb24gbXVzdCBiZSBvcHRpbWl6ZWQgZm9yIHNpemUgZmlyc3QuCitkZWYgTWluU2l6ZSA6IEVudW1BdHRyPCJtaW5zaXplIj47CisKKy8vLyBOYWtlZCBmdW5jdGlvbi4KK2RlZiBOYWtlZCA6IEVudW1BdHRyPCJuYWtlZCI+OworCisvLy8gTmVzdGVkIGZ1bmN0aW9uIHN0YXRpYyBjaGFpbi4KK2RlZiBOZXN0IDogRW51bUF0dHI8Im5lc3QiPjsKKworLy8vIENvbnNpZGVyZWQgdG8gbm90IGFsaWFzIGFmdGVyIGNhbGwuCitkZWYgTm9BbGlhcyA6IEVudW1BdHRyPCJub2FsaWFzIj47CisKKy8vLyBDYWxsZWUgaXNuJ3QgcmVjb2duaXplZCBhcyBhIGJ1aWx0aW4uCitkZWYgTm9CdWlsdGluIDogRW51bUF0dHI8Im5vYnVpbHRpbiI+OworCisvLy8gRnVuY3Rpb24gY3JlYXRlcyBubyBhbGlhc2VzIG9mIHBvaW50ZXIuCitkZWYgTm9DYXB0dXJlIDogRW51bUF0dHI8Im5vY2FwdHVyZSI+OworCisvLy8gQ2FsbCBjYW5ub3QgYmUgZHVwbGljYXRlZC4KK2RlZiBOb0R1cGxpY2F0ZSA6IEVudW1BdHRyPCJub2R1cGxpY2F0ZSI+OworCisvLy8gRGlzYWJsZSBpbXBsaWNpdCBmbG9hdGluZyBwb2ludCBpbnN0cy4KK2RlZiBOb0ltcGxpY2l0RmxvYXQgOiBFbnVtQXR0cjwibm9pbXBsaWNpdGZsb2F0Ij47CisKKy8vLyBpbmxpbmU9bmV2ZXIuCitkZWYgTm9JbmxpbmUgOiBFbnVtQXR0cjwibm9pbmxpbmUiPjsKKworLy8vIEZ1bmN0aW9uIGlzIGNhbGxlZCBlYXJseSBhbmQvb3Igb2Z0ZW4sIHNvIGxhenkgYmluZGluZyBpc24ndCB3b3J0aHdoaWxlLgorZGVmIE5vbkxhenlCaW5kIDogRW51bUF0dHI8Im5vbmxhenliaW5kIj47CisKKy8vLyBQb2ludGVyIGlzIGtub3duIHRvIGJlIG5vdCBudWxsLgorZGVmIE5vbk51bGwgOiBFbnVtQXR0cjwibm9ubnVsbCI+OworCisvLy8gVGhlIGZ1bmN0aW9uIGRvZXMgbm90IHJlY3Vyc2UuCitkZWYgTm9SZWN1cnNlIDogRW51bUF0dHI8Im5vcmVjdXJzZSI+OworCisvLy8gRGlzYWJsZSByZWR6b25lLgorZGVmIE5vUmVkWm9uZSA6IEVudW1BdHRyPCJub3JlZHpvbmUiPjsKKworLy8vIE1hcmsgdGhlIGZ1bmN0aW9uIGFzIG5vdCByZXR1cm5pbmcuCitkZWYgTm9SZXR1cm4gOiBFbnVtQXR0cjwibm9yZXR1cm4iPjsKKworLy8vIERpc2FibGUgSW5kaXJlY3QgQnJhbmNoIFRyYWNraW5nLgorZGVmIE5vQ2ZDaGVjayA6IEVudW1BdHRyPCJub2NmX2NoZWNrIj47CisKKy8vLyBGdW5jdGlvbiBkb2Vzbid0IHVud2luZCBzdGFjay4KK2RlZiBOb1Vud2luZCA6IEVudW1BdHRyPCJub3Vud2luZCI+OworCisvLy8gU2VsZWN0IG9wdGltaXphdGlvbnMgZm9yIGJlc3QgZnV6emluZyBzaWduYWwuCitkZWYgT3B0Rm9yRnV6emluZyA6IEVudW1BdHRyPCJvcHRmb3JmdXp6aW5nIj47CisKKy8vLyBvcHRfc2l6ZS4KK2RlZiBPcHRpbWl6ZUZvclNpemUgOiBFbnVtQXR0cjwib3B0c2l6ZSI+OworCisvLy8gRnVuY3Rpb24gbXVzdCBub3QgYmUgb3B0aW1pemVkLgorZGVmIE9wdGltaXplTm9uZSA6IEVudW1BdHRyPCJvcHRub25lIj47CisKKy8vLyBGdW5jdGlvbiBkb2VzIG5vdCBhY2Nlc3MgbWVtb3J5LgorZGVmIFJlYWROb25lIDogRW51bUF0dHI8InJlYWRub25lIj47CisKKy8vLyBGdW5jdGlvbiBvbmx5IHJlYWRzIGZyb20gbWVtb3J5LgorZGVmIFJlYWRPbmx5IDogRW51bUF0dHI8InJlYWRvbmx5Ij47CisKKy8vLyBSZXR1cm4gdmFsdWUgaXMgYWx3YXlzIGVxdWFsIHRvIHRoaXMgYXJndW1lbnQuCitkZWYgUmV0dXJuZWQgOiBFbnVtQXR0cjwicmV0dXJuZWQiPjsKKworLy8vIEZ1bmN0aW9uIGNhbiByZXR1cm4gdHdpY2UuCitkZWYgUmV0dXJuc1R3aWNlIDogRW51bUF0dHI8InJldHVybnNfdHdpY2UiPjsKKworLy8vIFNhZmUgU3RhY2sgcHJvdGVjdGlvbi4KK2RlZiBTYWZlU3RhY2sgOiBFbnVtQXR0cjwic2FmZXN0YWNrIj47CisKKy8vLyBTaWduIGV4dGVuZGVkIGJlZm9yZS9hZnRlciBjYWxsLgorZGVmIFNFeHQgOiBFbnVtQXR0cjwic2lnbmV4dCI+OworCisvLy8gQWxpZ25tZW50IG9mIHN0YWNrIGZvciBmdW5jdGlvbiAoMyBiaXRzKSAgc3RvcmVkIGFzIGxvZzIgb2YgYWxpZ25tZW50IHdpdGgKKy8vLyArMSBiaWFzIDAgbWVhbnMgdW5hbGlnbmVkIChkaWZmZXJlbnQgZnJvbSBhbGlnbnN0YWNrPSgxKSkuCitkZWYgU3RhY2tBbGlnbm1lbnQgOiBFbnVtQXR0cjwiYWxpZ25zdGFjayI+OworCisvLy8gRnVuY3Rpb24gY2FuIGJlIHNwZWN1bGF0ZWQuCitkZWYgU3BlY3VsYXRhYmxlIDogRW51bUF0dHI8InNwZWN1bGF0YWJsZSI+OworCisvLy8gU3RhY2sgcHJvdGVjdGlvbi4KK2RlZiBTdGFja1Byb3RlY3QgOiBFbnVtQXR0cjwic3NwIj47CisKKy8vLyBTdGFjayBwcm90ZWN0aW9uIHJlcXVpcmVkLgorZGVmIFN0YWNrUHJvdGVjdFJlcSA6IEVudW1BdHRyPCJzc3ByZXEiPjsKKworLy8vIFN0cm9uZyBTdGFjayBwcm90ZWN0aW9uLgorZGVmIFN0YWNrUHJvdGVjdFN0cm9uZyA6IEVudW1BdHRyPCJzc3BzdHJvbmciPjsKKworLy8vIEZ1bmN0aW9uIHdhcyBjYWxsZWQgaW4gYSBzY29wZSByZXF1aXJpbmcgc3RyaWN0IGZsb2F0aW5nIHBvaW50IHNlbWFudGljcy4KK2RlZiBTdHJpY3RGUCA6IEVudW1BdHRyPCJzdHJpY3RmcCI+OworCisvLy8gSGlkZGVuIHBvaW50ZXIgdG8gc3RydWN0dXJlIHRvIHJldHVybi4KK2RlZiBTdHJ1Y3RSZXQgOiBFbnVtQXR0cjwic3JldCI+OworCisvLy8gQWRkcmVzc1Nhbml0aXplciBpcyBvbi4KK2RlZiBTYW5pdGl6ZUFkZHJlc3MgOiBFbnVtQXR0cjwic2FuaXRpemVfYWRkcmVzcyI+OworCisvLy8gVGhyZWFkU2FuaXRpemVyIGlzIG9uLgorZGVmIFNhbml0aXplVGhyZWFkIDogRW51bUF0dHI8InNhbml0aXplX3RocmVhZCI+OworCisvLy8gTWVtb3J5U2FuaXRpemVyIGlzIG9uLgorZGVmIFNhbml0aXplTWVtb3J5IDogRW51bUF0dHI8InNhbml0aXplX21lbW9yeSI+OworCisvLy8gSFdBZGRyZXNzU2FuaXRpemVyIGlzIG9uLgorZGVmIFNhbml0aXplSFdBZGRyZXNzIDogRW51bUF0dHI8InNhbml0aXplX2h3YWRkcmVzcyI+OworCisvLy8gQXJndW1lbnQgaXMgc3dpZnQgZXJyb3IuCitkZWYgU3dpZnRFcnJvciA6IEVudW1BdHRyPCJzd2lmdGVycm9yIj47CisKKy8vLyBBcmd1bWVudCBpcyBzd2lmdCBzZWxmL2NvbnRleHQuCitkZWYgU3dpZnRTZWxmIDogRW51bUF0dHI8InN3aWZ0c2VsZiI+OworCisvLy8gRnVuY3Rpb24gbXVzdCBiZSBpbiBhIHVud2luZCB0YWJsZS4KK2RlZiBVV1RhYmxlIDogRW51bUF0dHI8InV3dGFibGUiPjsKKworLy8vIEZ1bmN0aW9uIG9ubHkgd3JpdGVzIHRvIG1lbW9yeS4KK2RlZiBXcml0ZU9ubHkgOiBFbnVtQXR0cjwid3JpdGVvbmx5Ij47CisKKy8vLyBaZXJvIGV4dGVuZGVkIGJlZm9yZS9hZnRlciBjYWxsLgorZGVmIFpFeHQgOiBFbnVtQXR0cjwiemVyb2V4dCI+OworCisvLy8gVGFyZ2V0LWluZGVwZW5kZW50IHN0cmluZyBhdHRyaWJ1dGVzLgorZGVmIExlc3NQcmVjaXNlRlBNQUQgOiBTdHJCb29sQXR0cjwibGVzcy1wcmVjaXNlLWZwbWFkIj47CitkZWYgTm9JbmZzRlBNYXRoIDogU3RyQm9vbEF0dHI8Im5vLWluZnMtZnAtbWF0aCI+OworZGVmIE5vTmFuc0ZQTWF0aCA6IFN0ckJvb2xBdHRyPCJuby1uYW5zLWZwLW1hdGgiPjsKK2RlZiBVbnNhZmVGUE1hdGggOiBTdHJCb29sQXR0cjwidW5zYWZlLWZwLW1hdGgiPjsKK2RlZiBOb0p1bXBUYWJsZXMgOiBTdHJCb29sQXR0cjwibm8tanVtcC10YWJsZXMiPjsKK2RlZiBQcm9maWxlU2FtcGxlQWNjdXJhdGUgOiBTdHJCb29sQXR0cjwicHJvZmlsZS1zYW1wbGUtYWNjdXJhdGUiPjsKKworY2xhc3MgQ29tcGF0UnVsZTxzdHJpbmcgRj4geworICAvLyBUaGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gY2FsbGVkIHRvIGNoZWNrIHRoZSBhdHRyaWJ1dGUgb2YgdGhlIGNhbGxlciBhbmQKKyAgLy8gY2FsbGVlIGFuZCBkZWNpZGUgd2hldGhlciBpbmxpbmluZyBzaG91bGQgYmUgYWxsb3dlZC4gVGhlIGZ1bmN0aW9uJ3MKKyAgLy8gc2lnbmF0dXJlIG11c3QgbWF0Y2ggImJvb2woY29uc3QgRnVuY3Rpb24mLCBjb25zdCBGdW5jdGlvbiAmKSIsIHdoZXJlIHRoZQorICAvLyBmaXJzdCBwYXJhbWV0ZXIgaXMgdGhlIHJlZmVyZW5jZSB0byB0aGUgY2FsbGVyIGFuZCB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcworICAvLyB0aGUgcmVmZXJlbmNlIHRvIHRoZSBjYWxsZWUuIEl0IG11c3QgcmV0dXJuIGZhbHNlIGlmIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZQorICAvLyBjYWxsZXIgYW5kIGNhbGxlZSBhcmUgaW5jb21wYXRpYmxlLCBhbmQgdHJ1ZSBvdGhlcndpc2UuCisgIHN0cmluZyBDb21wYXRGdW5jID0gRjsKK30KKworZGVmIDogQ29tcGF0UnVsZTwiaXNFcXVhbDxTYW5pdGl6ZUFkZHJlc3NBdHRyPiI+OworZGVmIDogQ29tcGF0UnVsZTwiaXNFcXVhbDxTYW5pdGl6ZVRocmVhZEF0dHI+Ij47CitkZWYgOiBDb21wYXRSdWxlPCJpc0VxdWFsPFNhbml0aXplTWVtb3J5QXR0cj4iPjsKK2RlZiA6IENvbXBhdFJ1bGU8ImlzRXF1YWw8U2FuaXRpemVIV0FkZHJlc3NBdHRyPiI+OworZGVmIDogQ29tcGF0UnVsZTwiaXNFcXVhbDxTYWZlU3RhY2tBdHRyPiI+OworCitjbGFzcyBNZXJnZVJ1bGU8c3RyaW5nIEY+IHsKKyAgLy8gVGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGNhbGxlZCB0byBtZXJnZSB0aGUgYXR0cmlidXRlcyBvZiB0aGUgY2FsbGVyIGFuZAorICAvLyBjYWxsZWUuIFRoZSBmdW5jdGlvbidzIHNpZ25hdHVyZSBtdXN0IG1hdGNoCisgIC8vICJ2b2lkKEZ1bmN0aW9uJiwgY29uc3QgRnVuY3Rpb24gJikiLCB3aGVyZSB0aGUgZmlyc3QgcGFyYW1ldGVyIGlzIHRoZQorICAvLyByZWZlcmVuY2UgdG8gdGhlIGNhbGxlciBhbmQgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgdGhlIHJlZmVyZW5jZSB0byB0aGUKKyAgLy8gY2FsbGVlLgorICBzdHJpbmcgTWVyZ2VGdW5jID0gRjsKK30KKworZGVmIDogTWVyZ2VSdWxlPCJzZXRBTkQ8TGVzc1ByZWNpc2VGUE1BREF0dHI+Ij47CitkZWYgOiBNZXJnZVJ1bGU8InNldEFORDxOb0luZnNGUE1hdGhBdHRyPiI+OworZGVmIDogTWVyZ2VSdWxlPCJzZXRBTkQ8Tm9OYW5zRlBNYXRoQXR0cj4iPjsKK2RlZiA6IE1lcmdlUnVsZTwic2V0QU5EPFVuc2FmZUZQTWF0aEF0dHI+Ij47CitkZWYgOiBNZXJnZVJ1bGU8InNldE9SPE5vSW1wbGljaXRGbG9hdEF0dHI+Ij47CitkZWYgOiBNZXJnZVJ1bGU8InNldE9SPE5vSnVtcFRhYmxlc0F0dHI+Ij47CitkZWYgOiBNZXJnZVJ1bGU8InNldE9SPFByb2ZpbGVTYW1wbGVBY2N1cmF0ZUF0dHI+Ij47CitkZWYgOiBNZXJnZVJ1bGU8ImFkanVzdENhbGxlclNTUExldmVsIj47CitkZWYgOiBNZXJnZVJ1bGU8ImFkanVzdENhbGxlclN0YWNrUHJvYmVzIj47CitkZWYgOiBNZXJnZVJ1bGU8ImFkanVzdENhbGxlclN0YWNrUHJvYmVTaXplIj47CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0F1dG9VcGdyYWRlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0F1dG9VcGdyYWRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y0MDZmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQXV0b1VwZ3JhZGUuaApAQCAtMCwwICsxLDg1IEBACisvLz09PS0gQXV0b1VwZ3JhZGUuaCAtIEF1dG9VcGdyYWRlIEhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGVzZSBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIGJ5IGxpYi9JUi9BdXRvVXBncmFkZS5jcHAuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0FVVE9VUEdSQURFX0gKKyNkZWZpbmUgTExWTV9JUl9BVVRPVVBHUkFERV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBDYWxsSW5zdDsKKyAgY2xhc3MgQ29uc3RhbnQ7CisgIGNsYXNzIEZ1bmN0aW9uOworICBjbGFzcyBJbnN0cnVjdGlvbjsKKyAgY2xhc3MgTUROb2RlOworICBjbGFzcyBNb2R1bGU7CisgIGNsYXNzIEdsb2JhbFZhcmlhYmxlOworICBjbGFzcyBUeXBlOworICBjbGFzcyBWYWx1ZTsKKworICAvLy8gVGhpcyBpcyBhIG1vcmUgZ3JhbnVsYXIgZnVuY3Rpb24gdGhhdCBzaW1wbHkgY2hlY2tzIGFuIGludHJpbnNpYyBmdW5jdGlvbgorICAvLy8gZm9yIHVwZ3JhZGluZywgYW5kIHJldHVybnMgdHJ1ZSBpZiBpdCByZXF1aXJlcyB1cGdyYWRpbmcuIEl0IG1heSByZXR1cm4KKyAgLy8vIG51bGwgaW4gTmV3Rm4gaWYgdGhlIGFsbCBjYWxscyB0byB0aGUgb3JpZ2luYWwgaW50cmluc2ljIGZ1bmN0aW9uCisgIC8vLyBzaG91bGQgYmUgdHJhbnNmb3JtZWQgdG8gbm9uLWZ1bmN0aW9uLWNhbGwgaW5zdHJ1Y3Rpb25zLgorICBib29sIFVwZ3JhZGVJbnRyaW5zaWNGdW5jdGlvbihGdW5jdGlvbiAqRiwgRnVuY3Rpb24gKiZOZXdGbik7CisKKyAgLy8vIFRoaXMgaXMgdGhlIGNvbXBsZW1lbnQgdG8gdGhlIGFib3ZlLCByZXBsYWNpbmcgYSBzcGVjaWZpYyBjYWxsIHRvIGFuCisgIC8vLyBpbnRyaW5zaWMgZnVuY3Rpb24gd2l0aCBhIGNhbGwgdG8gdGhlIHNwZWNpZmllZCBuZXcgZnVuY3Rpb24uCisgIHZvaWQgVXBncmFkZUludHJpbnNpY0NhbGwoQ2FsbEluc3QgKkNJLCBGdW5jdGlvbiAqTmV3Rm4pOworCisgIC8vLyBUaGlzIGlzIGFuIGF1dG8tdXBncmFkZSBob29rIGZvciBhbnkgb2xkIGludHJpbnNpYyBmdW5jdGlvbiBzeW50YXhlcworICAvLy8gd2hpY2ggbmVlZCB0byBoYXZlIGJvdGggdGhlIGZ1bmN0aW9uIHVwZGF0ZWQgYXMgd2VsbCBhcyBhbGwgY2FsbHMgdXBkYXRlZAorICAvLy8gdG8gdGhlIG5ldyBmdW5jdGlvbi4gVGhpcyBzaG91bGQgb25seSBiZSBydW4gaW4gYSBwb3N0LXByb2Nlc3NpbmcgZmFzaGlvbgorICAvLy8gc28gdGhhdCBpdCBjYW4gdXBkYXRlIGFsbCBjYWxscyB0byB0aGUgb2xkIGZ1bmN0aW9uLgorICB2b2lkIFVwZ3JhZGVDYWxsc1RvSW50cmluc2ljKEZ1bmN0aW9uKiBGKTsKKworICAvLy8gVGhpcyBjaGVja3MgZm9yIGdsb2JhbCB2YXJpYWJsZXMgd2hpY2ggc2hvdWxkIGJlIHVwZ3JhZGVkLiBJdCByZXR1cm5zIHRydWUKKyAgLy8vIGlmIGl0IHJlcXVpcmVzIHVwZ3JhZGluZy4KKyAgYm9vbCBVcGdyYWRlR2xvYmFsVmFyaWFibGUoR2xvYmFsVmFyaWFibGUgKkdWKTsKKworICAvLy8gVGhpcyBjaGVja3MgZm9yIG1vZHVsZSBmbGFncyB3aGljaCBzaG91bGQgYmUgdXBncmFkZWQuIEl0IHJldHVybnMgdHJ1ZSBpZgorICAvLy8gbW9kdWxlIGlzIG1vZGlmaWVkLgorICBib29sIFVwZ3JhZGVNb2R1bGVGbGFncyhNb2R1bGUgJk0pOworCisgIHZvaWQgVXBncmFkZVNlY3Rpb25BdHRyaWJ1dGVzKE1vZHVsZSAmTSk7CisKKyAgLy8vIElmIHRoZSBnaXZlbiBUQkFBIHRhZyB1c2VzIHRoZSBzY2FsYXIgVEJBQSBmb3JtYXQsIGNyZWF0ZSBhIG5ldyBub2RlCisgIC8vLyBjb3JyZXNwb25kaW5nIHRvIHRoZSB1cGdyYWRlIHRvIHRoZSBzdHJ1Y3QtcGF0aCBhd2FyZSBUQkFBIGZvcm1hdC4KKyAgLy8vIE90aGVyd2lzZSByZXR1cm4gdGhlIFxwIFRCQUFOb2RlIGl0c2VsZi4KKyAgTUROb2RlICpVcGdyYWRlVEJBQU5vZGUoTUROb2RlICZUQkFBTm9kZSk7CisKKyAgLy8vIFRoaXMgaXMgYW4gYXV0by11cGdyYWRlIGZvciBiaXRjYXN0IGJldHdlZW4gcG9pbnRlcnMgd2l0aCBkaWZmZXJlbnQKKyAgLy8vIGFkZHJlc3Mgc3BhY2VzOiB0aGUgaW5zdHJ1Y3Rpb24gaXMgcmVwbGFjZWQgYnkgYSBwYWlyIHB0cnRvaW50K2ludHRvcHRyLgorICBJbnN0cnVjdGlvbiAqVXBncmFkZUJpdENhc3RJbnN0KHVuc2lnbmVkIE9wYywgVmFsdWUgKlYsIFR5cGUgKkRlc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqJlRlbXApOworCisgIC8vLyBUaGlzIGlzIGFuIGF1dG8tdXBncmFkZSBmb3IgYml0Y2FzdCBjb25zdGFudCBleHByZXNzaW9uIGJldHdlZW4gcG9pbnRlcnMKKyAgLy8vIHdpdGggZGlmZmVyZW50IGFkZHJlc3Mgc3BhY2VzOiB0aGUgaW5zdHJ1Y3Rpb24gaXMgcmVwbGFjZWQgYnkgYSBwYWlyCisgIC8vLyBwdHJ0b2ludCtpbnR0b3B0ci4KKyAgVmFsdWUgKlVwZ3JhZGVCaXRDYXN0RXhwcih1bnNpZ25lZCBPcGMsIENvbnN0YW50ICpDLCBUeXBlICpEZXN0VHkpOworCisgIC8vLyBDaGVjayB0aGUgZGVidWcgaW5mbyB2ZXJzaW9uIG51bWJlciwgaWYgaXQgaXMgb3V0LWRhdGVkLCBkcm9wIHRoZSBkZWJ1ZworICAvLy8gaW5mby4gUmV0dXJuIHRydWUgaWYgbW9kdWxlIGlzIG1vZGlmaWVkLgorICBib29sIFVwZ3JhZGVEZWJ1Z0luZm8oTW9kdWxlICZNKTsKKworICAvLy8gQ2hlY2sgd2hldGhlciBhIHN0cmluZyBsb29rcyBsaWtlIGFuIG9sZCBsb29wIGF0dGFjaG1lbnQgdGFnLgorICBpbmxpbmUgYm9vbCBtYXlCZU9sZExvb3BBdHRhY2htZW50VGFnKFN0cmluZ1JlZiBOYW1lKSB7CisgICAgcmV0dXJuIE5hbWUuc3RhcnRzd2l0aCgibGx2bS52ZWN0b3JpemVyLiIpOworICB9CisKKyAgLy8vIFVwZ3JhZGUgdGhlIGxvb3AgYXR0YWNobWVudCBtZXRhZGF0YSBub2RlLgorICBNRE5vZGUgKnVwZ3JhZGVJbnN0cnVjdGlvbkxvb3BBdHRhY2htZW50KE1ETm9kZSAmTik7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9CYXNpY0Jsb2NrLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0Jhc2ljQmxvY2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43N2NmYzk3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9CYXNpY0Jsb2NrLmgKQEAgLTAsMCArMSw0MjcgQEAKKy8vPT09LSBsbHZtL0Jhc2ljQmxvY2suaCAtIFJlcHJlc2VudCBhIGJhc2ljIGJsb2NrIGluIHRoZSBWTSAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgQmFzaWNCbG9jayBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfQkFTSUNCTE9DS19ICisjZGVmaW5lIExMVk1fSVJfQkFTSUNCTE9DS19ICisKKyNpbmNsdWRlICJsbHZtLWMvVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3Rfbm9kZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9TeW1ib2xUYWJsZUxpc3RUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NCaW5kaW5nV3JhcHBpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBDYWxsSW5zdDsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgTGFuZGluZ1BhZEluc3Q7CitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIFBISU5vZGU7CitjbGFzcyBUZXJtaW5hdG9ySW5zdDsKK2NsYXNzIFZhbHVlU3ltYm9sVGFibGU7CisKKy8vLyBcYnJpZWYgTExWTSBCYXNpYyBCbG9jayBSZXByZXNlbnRhdGlvbgorLy8vCisvLy8gVGhpcyByZXByZXNlbnRzIGEgc2luZ2xlIGJhc2ljIGJsb2NrIGluIExMVk0uIEEgYmFzaWMgYmxvY2sgaXMgc2ltcGx5IGEKKy8vLyBjb250YWluZXIgb2YgaW5zdHJ1Y3Rpb25zIHRoYXQgZXhlY3V0ZSBzZXF1ZW50aWFsbHkuIEJhc2ljIGJsb2NrcyBhcmUgVmFsdWVzCisvLy8gYmVjYXVzZSB0aGV5IGFyZSByZWZlcmVuY2VkIGJ5IGluc3RydWN0aW9ucyBzdWNoIGFzIGJyYW5jaGVzIGFuZCBzd2l0Y2gKKy8vLyB0YWJsZXMuIFRoZSB0eXBlIG9mIGEgQmFzaWNCbG9jayBpcyAiVHlwZTo6TGFiZWxUeSIgYmVjYXVzZSB0aGUgYmFzaWMgYmxvY2sKKy8vLyByZXByZXNlbnRzIGEgbGFiZWwgdG8gd2hpY2ggYSBicmFuY2ggY2FuIGp1bXAuCisvLy8KKy8vLyBBIHdlbGwgZm9ybWVkIGJhc2ljIGJsb2NrIGlzIGZvcm1lZCBvZiBhIGxpc3Qgb2Ygbm9uLXRlcm1pbmF0aW5nCisvLy8gaW5zdHJ1Y3Rpb25zIGZvbGxvd2VkIGJ5IGEgc2luZ2xlIFRlcm1pbmF0b3JJbnN0IGluc3RydWN0aW9uLgorLy8vIFRlcm1pbmF0b3JJbnN0J3MgbWF5IG5vdCBvY2N1ciBpbiB0aGUgbWlkZGxlIG9mIGJhc2ljIGJsb2NrcywgYW5kIG11c3QKKy8vLyB0ZXJtaW5hdGUgdGhlIGJsb2Nrcy4gVGhlIEJhc2ljQmxvY2sgY2xhc3MgYWxsb3dzIG1hbGZvcm1lZCBiYXNpYyBibG9ja3MgdG8KKy8vLyBvY2N1ciBiZWNhdXNlIGl0IG1heSBiZSB1c2VmdWwgaW4gdGhlIGludGVybWVkaWF0ZSBzdGFnZSBvZiBjb25zdHJ1Y3Rpbmcgb3IKKy8vLyBtb2RpZnlpbmcgYSBwcm9ncmFtLiBIb3dldmVyLCB0aGUgdmVyaWZpZXIgd2lsbCBlbnN1cmUgdGhhdCBiYXNpYyBibG9ja3MKKy8vLyBhcmUgIndlbGwgZm9ybWVkIi4KK2NsYXNzIEJhc2ljQmxvY2sgZmluYWwgOiBwdWJsaWMgVmFsdWUsIC8vIEJhc2ljIGJsb2NrcyBhcmUgZGF0YSBvYmplY3RzIGFsc28KKyAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgaWxpc3Rfbm9kZV93aXRoX3BhcmVudDxCYXNpY0Jsb2NrLCBGdW5jdGlvbj4geworcHVibGljOgorICB1c2luZyBJbnN0TGlzdFR5cGUgPSBTeW1ib2xUYWJsZUxpc3Q8SW5zdHJ1Y3Rpb24+OworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgQmxvY2tBZGRyZXNzOworICBmcmllbmQgY2xhc3MgU3ltYm9sVGFibGVMaXN0VHJhaXRzPEJhc2ljQmxvY2s+OworCisgIEluc3RMaXN0VHlwZSBJbnN0TGlzdDsKKyAgRnVuY3Rpb24gKlBhcmVudDsKKworICB2b2lkIHNldFBhcmVudChGdW5jdGlvbiAqcGFyZW50KTsKKworICAvLy8gXGJyaWVmIENvbnN0cnVjdG9yLgorICAvLy8KKyAgLy8vIElmIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXIgaXMgc3BlY2lmaWVkLCB0aGUgYmFzaWMgYmxvY2sgaXMgYXV0b21hdGljYWxseQorICAvLy8gaW5zZXJ0ZWQgYXQgZWl0aGVyIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uIChpZiBJbnNlcnRCZWZvcmUgaXMgbnVsbCksIG9yCisgIC8vLyBiZWZvcmUgdGhlIHNwZWNpZmllZCBiYXNpYyBibG9jay4KKyAgZXhwbGljaXQgQmFzaWNCbG9jayhMTFZNQ29udGV4dCAmQywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiAqUGFyZW50ID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKworcHVibGljOgorICBCYXNpY0Jsb2NrKGNvbnN0IEJhc2ljQmxvY2sgJikgPSBkZWxldGU7CisgIEJhc2ljQmxvY2sgJm9wZXJhdG9yPShjb25zdCBCYXNpY0Jsb2NrICYpID0gZGVsZXRlOworICB+QmFzaWNCbG9jaygpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBjb250ZXh0IGluIHdoaWNoIHRoaXMgYmFzaWMgYmxvY2sgbGl2ZXMuCisgIExMVk1Db250ZXh0ICZnZXRDb250ZXh0KCkgY29uc3Q7CisKKyAgLy8vIEluc3RydWN0aW9uIGl0ZXJhdG9ycy4uLgorICB1c2luZyBpdGVyYXRvciA9IEluc3RMaXN0VHlwZTo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gSW5zdExpc3RUeXBlOjpjb25zdF9pdGVyYXRvcjsKKyAgdXNpbmcgcmV2ZXJzZV9pdGVyYXRvciA9IEluc3RMaXN0VHlwZTo6cmV2ZXJzZV9pdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciA9IEluc3RMaXN0VHlwZTo6Y29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKworICAvLy8gXGJyaWVmIENyZWF0ZXMgYSBuZXcgQmFzaWNCbG9jay4KKyAgLy8vCisgIC8vLyBJZiB0aGUgUGFyZW50IHBhcmFtZXRlciBpcyBzcGVjaWZpZWQsIHRoZSBiYXNpYyBibG9jayBpcyBhdXRvbWF0aWNhbGx5CisgIC8vLyBpbnNlcnRlZCBhdCBlaXRoZXIgdGhlIGVuZCBvZiB0aGUgZnVuY3Rpb24gKGlmIEluc2VydEJlZm9yZSBpcyAwKSwgb3IKKyAgLy8vIGJlZm9yZSB0aGUgc3BlY2lmaWVkIGJhc2ljIGJsb2NrLgorICBzdGF0aWMgQmFzaWNCbG9jayAqQ3JlYXRlKExMVk1Db250ZXh0ICZDb250ZXh0LCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uICpQYXJlbnQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEJlZm9yZSA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbmV3IEJhc2ljQmxvY2soQ29udGV4dCwgTmFtZSwgUGFyZW50LCBJbnNlcnRCZWZvcmUpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGVuY2xvc2luZyBtZXRob2QsIG9yIG51bGwgaWYgbm9uZS4KKyAgY29uc3QgRnVuY3Rpb24gKmdldFBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIFBhcmVudDsgfQorICAgICAgICBGdW5jdGlvbiAqZ2V0UGFyZW50KCkgICAgICAgeyByZXR1cm4gUGFyZW50OyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG1vZHVsZSBvd25pbmcgdGhlIGZ1bmN0aW9uIHRoaXMgYmFzaWMgYmxvY2sgYmVsb25ncyB0bywKKyAgLy8vIG9yIG51bGxwdHIgaXQgdGhlIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgYSBtb2R1bGUuCisgIC8vLworICAvLy8gTm90ZTogdGhpcyBpcyB1bmRlZmluZWQgYmVoYXZpb3IgaWYgdGhlIGJsb2NrIGRvZXMgbm90IGhhdmUgYSBwYXJlbnQuCisgIGNvbnN0IE1vZHVsZSAqZ2V0TW9kdWxlKCkgY29uc3Q7CisgIE1vZHVsZSAqZ2V0TW9kdWxlKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PE1vZHVsZSAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBCYXNpY0Jsb2NrICo+KHRoaXMpLT5nZXRNb2R1bGUoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHRlcm1pbmF0b3IgaW5zdHJ1Y3Rpb24gaWYgdGhlIGJsb2NrIGlzIHdlbGwgZm9ybWVkIG9yCisgIC8vLyBudWxsIGlmIHRoZSBibG9jayBpcyBub3Qgd2VsbCBmb3JtZWQuCisgIGNvbnN0IFRlcm1pbmF0b3JJbnN0ICpnZXRUZXJtaW5hdG9yKCkgY29uc3QgTExWTV9SRUFET05MWTsKKyAgVGVybWluYXRvckluc3QgKmdldFRlcm1pbmF0b3IoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VGVybWluYXRvckluc3QgKj4oCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBCYXNpY0Jsb2NrICo+KHRoaXMpLT5nZXRUZXJtaW5hdG9yKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBjYWxsIGluc3RydWN0aW9uIGNhbGxpbmcgQGxsdm0uZXhwZXJpbWVudGFsLmRlb3B0aW1pemUKKyAgLy8vIHByaW9yIHRvIHRoZSB0ZXJtaW5hdGluZyByZXR1cm4gaW5zdHJ1Y3Rpb24gb2YgdGhpcyBiYXNpYyBibG9jaywgaWYgc3VjaCBhCisgIC8vLyBjYWxsIGlzIHByZXNlbnQuICBPdGhlcndpc2UsIHJldHVybnMgbnVsbC4KKyAgY29uc3QgQ2FsbEluc3QgKmdldFRlcm1pbmF0aW5nRGVvcHRpbWl6ZUNhbGwoKSBjb25zdDsKKyAgQ2FsbEluc3QgKmdldFRlcm1pbmF0aW5nRGVvcHRpbWl6ZUNhbGwoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q2FsbEluc3QgKj4oCisgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBCYXNpY0Jsb2NrICo+KHRoaXMpLT5nZXRUZXJtaW5hdGluZ0Rlb3B0aW1pemVDYWxsKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBjYWxsIGluc3RydWN0aW9uIG1hcmtlZCAnbXVzdHRhaWwnIHByaW9yIHRvIHRoZQorICAvLy8gdGVybWluYXRpbmcgcmV0dXJuIGluc3RydWN0aW9uIG9mIHRoaXMgYmFzaWMgYmxvY2ssIGlmIHN1Y2ggYSBjYWxsIGlzCisgIC8vLyBwcmVzZW50LiAgT3RoZXJ3aXNlLCByZXR1cm5zIG51bGwuCisgIGNvbnN0IENhbGxJbnN0ICpnZXRUZXJtaW5hdGluZ011c3RUYWlsQ2FsbCgpIGNvbnN0OworICBDYWxsSW5zdCAqZ2V0VGVybWluYXRpbmdNdXN0VGFpbENhbGwoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q2FsbEluc3QgKj4oCisgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEJhc2ljQmxvY2sgKj4odGhpcyktPmdldFRlcm1pbmF0aW5nTXVzdFRhaWxDYWxsKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gdGhpcyBibG9jayB0aGF0IGlzCisgIC8vLyBub3QgYSBQSElOb2RlIGluc3RydWN0aW9uLgorICAvLy8KKyAgLy8vIFdoZW4gYWRkaW5nIGluc3RydWN0aW9ucyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBiYXNpYyBibG9jaywgdGhleSBzaG91bGQKKyAgLy8vIGJlIGFkZGVkIGJlZm9yZSB0aGUgcmV0dXJuZWQgdmFsdWUsIG5vdCBiZWZvcmUgdGhlIGZpcnN0IGluc3RydWN0aW9uLAorICAvLy8gd2hpY2ggbWlnaHQgYmUgUEhJLiBSZXR1cm5zIDAgaXMgdGhlcmUncyBubyBub24tUEhJIGluc3RydWN0aW9uLgorICBjb25zdCBJbnN0cnVjdGlvbiogZ2V0Rmlyc3ROb25QSEkoKSBjb25zdDsKKyAgSW5zdHJ1Y3Rpb24qIGdldEZpcnN0Tm9uUEhJKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PEluc3RydWN0aW9uICo+KAorICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBCYXNpY0Jsb2NrICo+KHRoaXMpLT5nZXRGaXJzdE5vblBISSgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGluc3RydWN0aW9uIGluIHRoaXMgYmxvY2sgdGhhdCBpcyBub3QKKyAgLy8vIGEgUEhJTm9kZSBvciBhIGRlYnVnIGludHJpbnNpYy4KKyAgY29uc3QgSW5zdHJ1Y3Rpb24qIGdldEZpcnN0Tm9uUEhJT3JEYmcoKSBjb25zdDsKKyAgSW5zdHJ1Y3Rpb24qIGdldEZpcnN0Tm9uUEhJT3JEYmcoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8SW5zdHJ1Y3Rpb24gKj4oCisgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBCYXNpY0Jsb2NrICo+KHRoaXMpLT5nZXRGaXJzdE5vblBISU9yRGJnKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZmlyc3QgaW5zdHJ1Y3Rpb24gaW4gdGhpcyBibG9jayB0aGF0IGlzIG5vdAorICAvLy8gYSBQSElOb2RlLCBhIGRlYnVnIGludHJpbnNpYywgb3IgYSBsaWZldGltZSBpbnRyaW5zaWMuCisgIGNvbnN0IEluc3RydWN0aW9uKiBnZXRGaXJzdE5vblBISU9yRGJnT3JMaWZldGltZSgpIGNvbnN0OworICBJbnN0cnVjdGlvbiogZ2V0Rmlyc3ROb25QSElPckRiZ09yTGlmZXRpbWUoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8SW5zdHJ1Y3Rpb24gKj4oCisgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEJhc2ljQmxvY2sgKj4odGhpcyktPmdldEZpcnN0Tm9uUEhJT3JEYmdPckxpZmV0aW1lKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBpbiB0aGlzIGJsb2NrIHRoYXQgaXMKKyAgLy8vIHN1aXRhYmxlIGZvciBpbnNlcnRpbmcgYSBub24tUEhJIGluc3RydWN0aW9uLgorICAvLy8KKyAgLy8vIEluIHBhcnRpY3VsYXIsIGl0IHNraXBzIGFsbCBQSElzIGFuZCBMYW5kaW5nUGFkIGluc3RydWN0aW9ucy4KKyAgY29uc3RfaXRlcmF0b3IgZ2V0Rmlyc3RJbnNlcnRpb25QdCgpIGNvbnN0OworICBpdGVyYXRvciBnZXRGaXJzdEluc2VydGlvblB0KCkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBCYXNpY0Jsb2NrICo+KHRoaXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPmdldEZpcnN0SW5zZXJ0aW9uUHQoKS5nZXROb25Db25zdCgpOworICB9CisKKyAgLy8vIFxicmllZiBVbmxpbmsgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcgZnVuY3Rpb24sIGJ1dCBkbyBub3QgZGVsZXRlIGl0LgorICB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKTsKKworICAvLy8gXGJyaWVmIFVubGluayAndGhpcycgZnJvbSB0aGUgY29udGFpbmluZyBmdW5jdGlvbiBhbmQgZGVsZXRlIGl0LgorICAvLy8KKyAgLy8gXHJldHVybnMgYW4gaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVsZW1lbnQgYWZ0ZXIgdGhlIGVyYXNlZCBvbmUuCisgIFN5bWJvbFRhYmxlTGlzdDxCYXNpY0Jsb2NrPjo6aXRlcmF0b3IgZXJhc2VGcm9tUGFyZW50KCk7CisKKyAgLy8vIFxicmllZiBVbmxpbmsgdGhpcyBiYXNpYyBibG9jayBmcm9tIGl0cyBjdXJyZW50IGZ1bmN0aW9uIGFuZCBpbnNlcnQgaXQKKyAgLy8vIGludG8gdGhlIGZ1bmN0aW9uIHRoYXQgXHAgTW92ZVBvcyBsaXZlcyBpbiwgcmlnaHQgYmVmb3JlIFxwIE1vdmVQb3MuCisgIHZvaWQgbW92ZUJlZm9yZShCYXNpY0Jsb2NrICpNb3ZlUG9zKTsKKworICAvLy8gXGJyaWVmIFVubGluayB0aGlzIGJhc2ljIGJsb2NrIGZyb20gaXRzIGN1cnJlbnQgZnVuY3Rpb24gYW5kIGluc2VydCBpdAorICAvLy8gcmlnaHQgYWZ0ZXIgXHAgTW92ZVBvcyBpbiB0aGUgZnVuY3Rpb24gXHAgTW92ZVBvcyBsaXZlcyBpbi4KKyAgdm9pZCBtb3ZlQWZ0ZXIoQmFzaWNCbG9jayAqTW92ZVBvcyk7CisKKyAgLy8vIFxicmllZiBJbnNlcnQgdW5saW5rZWQgYmFzaWMgYmxvY2sgaW50byBhIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIEluc2VydHMgYW4gdW5saW5rZWQgYmFzaWMgYmxvY2sgaW50byBcYyBQYXJlbnQuICBJZiBcYyBJbnNlcnRCZWZvcmUgaXMKKyAgLy8vIHByb3ZpZGVkLCBpbnNlcnRzIGJlZm9yZSB0aGF0IGJhc2ljIGJsb2NrLCBvdGhlcndpc2UgaW5zZXJ0cyBhdCB0aGUgZW5kLgorICAvLy8KKyAgLy8vIFxwcmUgXGEgZ2V0UGFyZW50KCkgaXMgXGMgbnVsbHB0ci4KKyAgdm9pZCBpbnNlcnRJbnRvKEZ1bmN0aW9uICpQYXJlbnQsIEJhc2ljQmxvY2sgKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBwcmVkZWNlc3NvciBvZiB0aGlzIGJsb2NrIGlmIGl0IGhhcyBhIHNpbmdsZSBwcmVkZWNlc3NvcgorICAvLy8gYmxvY2suIE90aGVyd2lzZSByZXR1cm4gYSBudWxsIHBvaW50ZXIuCisgIGNvbnN0IEJhc2ljQmxvY2sgKmdldFNpbmdsZVByZWRlY2Vzc29yKCkgY29uc3Q7CisgIEJhc2ljQmxvY2sgKmdldFNpbmdsZVByZWRlY2Vzc29yKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PEJhc2ljQmxvY2sgKj4oCisgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEJhc2ljQmxvY2sgKj4odGhpcyktPmdldFNpbmdsZVByZWRlY2Vzc29yKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHByZWRlY2Vzc29yIG9mIHRoaXMgYmxvY2sgaWYgaXQgaGFzIGEgdW5pcXVlIHByZWRlY2Vzc29yCisgIC8vLyBibG9jay4gT3RoZXJ3aXNlIHJldHVybiBhIG51bGwgcG9pbnRlci4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdW5pcXVlIHByZWRlY2Vzc29yIGRvZXNuJ3QgbWVhbiBzaW5nbGUgZWRnZSwgdGhlcmUgY2FuIGJlCisgIC8vLyBtdWx0aXBsZSBlZGdlcyBmcm9tIHRoZSB1bmlxdWUgcHJlZGVjZXNzb3IgdG8gdGhpcyBibG9jayAoZm9yIGV4YW1wbGUgYQorICAvLy8gc3dpdGNoIHN0YXRlbWVudCB3aXRoIG11bHRpcGxlIGNhc2VzIGhhdmluZyB0aGUgc2FtZSBkZXN0aW5hdGlvbikuCisgIGNvbnN0IEJhc2ljQmxvY2sgKmdldFVuaXF1ZVByZWRlY2Vzc29yKCkgY29uc3Q7CisgIEJhc2ljQmxvY2sgKmdldFVuaXF1ZVByZWRlY2Vzc29yKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PEJhc2ljQmxvY2sgKj4oCisgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEJhc2ljQmxvY2sgKj4odGhpcyktPmdldFVuaXF1ZVByZWRlY2Vzc29yKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHN1Y2Nlc3NvciBvZiB0aGlzIGJsb2NrIGlmIGl0IGhhcyBhIHNpbmdsZSBzdWNjZXNzb3IuCisgIC8vLyBPdGhlcndpc2UgcmV0dXJuIGEgbnVsbCBwb2ludGVyLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIGlzIGFuYWxvZ291cyB0byBnZXRTaW5nbGVQcmVkZWNlc3NvciBhYm92ZS4KKyAgY29uc3QgQmFzaWNCbG9jayAqZ2V0U2luZ2xlU3VjY2Vzc29yKCkgY29uc3Q7CisgIEJhc2ljQmxvY2sgKmdldFNpbmdsZVN1Y2Nlc3NvcigpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxCYXNpY0Jsb2NrICo+KAorICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEJhc2ljQmxvY2sgKj4odGhpcyktPmdldFNpbmdsZVN1Y2Nlc3NvcigpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzdWNjZXNzb3Igb2YgdGhpcyBibG9jayBpZiBpdCBoYXMgYSB1bmlxdWUgc3VjY2Vzc29yLgorICAvLy8gT3RoZXJ3aXNlIHJldHVybiBhIG51bGwgcG9pbnRlci4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBpcyBhbmFsb2dvdXMgdG8gZ2V0VW5pcXVlUHJlZGVjZXNzb3IgYWJvdmUuCisgIGNvbnN0IEJhc2ljQmxvY2sgKmdldFVuaXF1ZVN1Y2Nlc3NvcigpIGNvbnN0OworICBCYXNpY0Jsb2NrICpnZXRVbmlxdWVTdWNjZXNzb3IoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8QmFzaWNCbG9jayAqPigKKyAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBCYXNpY0Jsb2NrICo+KHRoaXMpLT5nZXRVbmlxdWVTdWNjZXNzb3IoKSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8vIEluc3RydWN0aW9uIGl0ZXJhdG9yIG1ldGhvZHMKKyAgLy8vCisgIGlubGluZSBpdGVyYXRvciAgICAgICAgICAgICAgICBiZWdpbigpICAgICAgIHsgcmV0dXJuIEluc3RMaXN0LmJlZ2luKCk7IH0KKyAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gSW5zdExpc3QuYmVnaW4oKTsgfQorICBpbmxpbmUgaXRlcmF0b3IgICAgICAgICAgICAgICAgZW5kICAoKSAgICAgICB7IHJldHVybiBJbnN0TGlzdC5lbmQoKTsgICB9CisgIGlubGluZSBjb25zdF9pdGVyYXRvciAgICAgICAgICBlbmQgICgpIGNvbnN0IHsgcmV0dXJuIEluc3RMaXN0LmVuZCgpOyAgIH0KKworICBpbmxpbmUgcmV2ZXJzZV9pdGVyYXRvciAgICAgICAgcmJlZ2luKCkgICAgICAgeyByZXR1cm4gSW5zdExpc3QucmJlZ2luKCk7IH0KKyAgaW5saW5lIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEluc3RMaXN0LnJiZWdpbigpOyB9CisgIGlubGluZSByZXZlcnNlX2l0ZXJhdG9yICAgICAgICByZW5kICAoKSAgICAgICB7IHJldHVybiBJbnN0TGlzdC5yZW5kKCk7ICAgfQorICBpbmxpbmUgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciAgcmVuZCAgKCkgY29uc3QgeyByZXR1cm4gSW5zdExpc3QucmVuZCgpOyAgIH0KKworICBpbmxpbmUgc2l6ZV90ICAgICAgICAgICAgICAgICAgIHNpemUoKSBjb25zdCB7IHJldHVybiBJbnN0TGlzdC5zaXplKCk7ICB9CisgIGlubGluZSBib29sICAgICAgICAgICAgICAgICAgICBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEluc3RMaXN0LmVtcHR5KCk7IH0KKyAgaW5saW5lIGNvbnN0IEluc3RydWN0aW9uICAgICAgJmZyb250KCkgY29uc3QgeyByZXR1cm4gSW5zdExpc3QuZnJvbnQoKTsgfQorICBpbmxpbmUgICAgICAgSW5zdHJ1Y3Rpb24gICAgICAmZnJvbnQoKSAgICAgICB7IHJldHVybiBJbnN0TGlzdC5mcm9udCgpOyB9CisgIGlubGluZSBjb25zdCBJbnN0cnVjdGlvbiAgICAgICAmYmFjaygpIGNvbnN0IHsgcmV0dXJuIEluc3RMaXN0LmJhY2soKTsgIH0KKyAgaW5saW5lICAgICAgIEluc3RydWN0aW9uICAgICAgICZiYWNrKCkgICAgICAgeyByZXR1cm4gSW5zdExpc3QuYmFjaygpOyAgfQorCisgIC8vLyBJdGVyYXRvciB0byB3YWxrIGp1c3QgdGhlIHBoaSBub2RlcyBpbiB0aGUgYmFzaWMgYmxvY2suCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQSElOb2RlVCA9IFBISU5vZGUsIHR5cGVuYW1lIEJCSXRlcmF0b3JUID0gaXRlcmF0b3I+CisgIGNsYXNzIHBoaV9pdGVyYXRvcl9pbXBsCisgICAgICA6IHB1YmxpYyBpdGVyYXRvcl9mYWNhZGVfYmFzZTxwaGlfaXRlcmF0b3JfaW1wbDxQSElOb2RlVCwgQkJJdGVyYXRvclQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgUEhJTm9kZVQ+IHsKKyAgICBmcmllbmQgQmFzaWNCbG9jazsKKworICAgIFBISU5vZGVUICpQTjsKKworICAgIHBoaV9pdGVyYXRvcl9pbXBsKFBISU5vZGVUICpQTikgOiBQTihQTikge30KKworICBwdWJsaWM6CisgICAgLy8gQWxsb3cgZGVmYXVsdCBjb25zdHJ1Y3Rpb24gdG8gYnVpbGQgdmFyaWFibGVzLCBidXQgdGhpcyBkb2Vzbid0IGJ1aWxkCisgICAgLy8gYSB1c2VmdWwgaXRlcmF0b3IuCisgICAgcGhpX2l0ZXJhdG9yX2ltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICAvLyBBbGxvdyBjb252ZXJzaW9uIGJldHdlZW4gaW5zdGFudGlhdGlvbnMgd2hlcmUgdmFsaWQuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFBISU5vZGVVLCB0eXBlbmFtZSBCQkl0ZXJhdG9yVT4KKyAgICBwaGlfaXRlcmF0b3JfaW1wbChjb25zdCBwaGlfaXRlcmF0b3JfaW1wbDxQSElOb2RlVSwgQkJJdGVyYXRvclU+ICZBcmcpCisgICAgICAgIDogUE4oQXJnLlBOKSB7fQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHBoaV9pdGVyYXRvcl9pbXBsICZBcmcpIGNvbnN0IHsgcmV0dXJuIFBOID09IEFyZy5QTjsgfQorCisgICAgUEhJTm9kZVQgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpQTjsgfQorCisgICAgdXNpbmcgcGhpX2l0ZXJhdG9yX2ltcGw6Oml0ZXJhdG9yX2ZhY2FkZV9iYXNlOjpvcGVyYXRvcisrOworICAgIHBoaV9pdGVyYXRvcl9pbXBsICZvcGVyYXRvcisrKCkgeworICAgICAgYXNzZXJ0KFBOICYmICJDYW5ub3QgaW5jcmVtZW50IHRoZSBlbmQgaXRlcmF0b3IhIik7CisgICAgICBQTiA9IGR5bl9jYXN0PFBISU5vZGVUPihzdGQ6Om5leHQoQkJJdGVyYXRvclQoUE4pKSk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICB9OworICB1c2luZyBwaGlfaXRlcmF0b3IgPSBwaGlfaXRlcmF0b3JfaW1wbDw+OworICB1c2luZyBjb25zdF9waGlfaXRlcmF0b3IgPQorICAgICAgcGhpX2l0ZXJhdG9yX2ltcGw8Y29uc3QgUEhJTm9kZSwgQmFzaWNCbG9jazo6Y29uc3RfaXRlcmF0b3I+OworCisgIC8vLyBSZXR1cm5zIGEgcmFuZ2UgdGhhdCBpdGVyYXRlcyBvdmVyIHRoZSBwaGlzIGluIHRoZSBiYXNpYyBibG9jay4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBjYW5ub3QgYmUgdXNlZCB3aXRoIGJhc2ljIGJsb2NrcyB0aGF0IGhhdmUgbm8gdGVybWluYXRvci4KKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3RfcGhpX2l0ZXJhdG9yPiBwaGlzKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PEJhc2ljQmxvY2sgKj4odGhpcyktPnBoaXMoKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTxwaGlfaXRlcmF0b3I+IHBoaXMoKTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdW5kZXJseWluZyBpbnN0cnVjdGlvbiBsaXN0IGNvbnRhaW5lci4KKyAgLy8vCisgIC8vLyBDdXJyZW50bHkgeW91IG5lZWQgdG8gYWNjZXNzIHRoZSB1bmRlcmx5aW5nIGluc3RydWN0aW9uIGxpc3QgY29udGFpbmVyCisgIC8vLyBkaXJlY3RseSBpZiB5b3Ugd2FudCB0byBtb2RpZnkgaXQuCisgIGNvbnN0IEluc3RMaXN0VHlwZSAmZ2V0SW5zdExpc3QoKSBjb25zdCB7IHJldHVybiBJbnN0TGlzdDsgfQorICAgICAgICBJbnN0TGlzdFR5cGUgJmdldEluc3RMaXN0KCkgICAgICAgeyByZXR1cm4gSW5zdExpc3Q7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgYSBwb2ludGVyIHRvIGEgbWVtYmVyIG9mIHRoZSBpbnN0cnVjdGlvbiBsaXN0LgorICBzdGF0aWMgSW5zdExpc3RUeXBlIEJhc2ljQmxvY2s6OipnZXRTdWJsaXN0QWNjZXNzKEluc3RydWN0aW9uKikgeworICAgIHJldHVybiAmQmFzaWNCbG9jazo6SW5zdExpc3Q7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzeW1ib2wgdGFibGUgaWYgb25lIGV4aXN0cy4KKyAgVmFsdWVTeW1ib2xUYWJsZSAqZ2V0VmFsdWVTeW1ib2xUYWJsZSgpOworCisgIC8vLyBcYnJpZWYgTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdC4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gVmFsdWU6OkJhc2ljQmxvY2tWYWw7CisgIH0KKworICAvLy8gXGJyaWVmIENhdXNlIGFsbCBzdWJpbnN0cnVjdGlvbnMgdG8gImxldCBnbyIgb2YgYWxsIHRoZSByZWZlcmVuY2VzIHRoYXQKKyAgLy8vIHNhaWQgc3ViaW5zdHJ1Y3Rpb25zIGFyZSBtYWludGFpbmluZy4KKyAgLy8vCisgIC8vLyBUaGlzIGFsbG93cyBvbmUgdG8gJ2RlbGV0ZScgYSB3aG9sZSBjbGFzcyBhdCBhIHRpbWUsIGV2ZW4gdGhvdWdoIHRoZXJlIG1heQorICAvLy8gYmUgY2lyY3VsYXIgcmVmZXJlbmNlcy4uLiBmaXJzdCBhbGwgcmVmZXJlbmNlcyBhcmUgZHJvcHBlZCwgYW5kIGFsbCB1c2UKKyAgLy8vIGNvdW50cyBnbyB0byB6ZXJvLiAgVGhlbiBldmVyeXRoaW5nIGlzIGRlbGV0ZSdkIGZvciByZWFsLiAgTm90ZSB0aGF0IG5vCisgIC8vLyBvcGVyYXRpb25zIGFyZSB2YWxpZCBvbiBhbiBvYmplY3QgdGhhdCBoYXMgImRyb3BwZWQgYWxsIHJlZmVyZW5jZXMiLAorICAvLy8gZXhjZXB0IG9wZXJhdG9yIGRlbGV0ZS4KKyAgdm9pZCBkcm9wQWxsUmVmZXJlbmNlcygpOworCisgIC8vLyBcYnJpZWYgTm90aWZ5IHRoZSBCYXNpY0Jsb2NrIHRoYXQgdGhlIHByZWRlY2Vzc29yIFxwIFByZWQgaXMgbm8gbG9uZ2VyCisgIC8vLyBhYmxlIHRvIHJlYWNoIGl0LgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYWN0dWFsbHkgbm90IHVzZWQgdG8gdXBkYXRlIHRoZSBQcmVkZWNlc3NvciBsaXN0LCBidXQgaXMgYWN0dWFsbHkKKyAgLy8vIHVzZWQgdG8gdXBkYXRlIHRoZSBQSEkgbm9kZXMgdGhhdCByZXNpZGUgaW4gdGhlIGJsb2NrLiAgTm90ZSB0aGF0IHRoaXMKKyAgLy8vIHNob3VsZCBiZSBjYWxsZWQgd2hpbGUgdGhlIHByZWRlY2Vzc29yIHN0aWxsIHJlZmVycyB0byB0aGlzIGJsb2NrLgorICB2b2lkIHJlbW92ZVByZWRlY2Vzc29yKEJhc2ljQmxvY2sgKlByZWQsIGJvb2wgRG9udERlbGV0ZVVzZWxlc3NQSElzID0gZmFsc2UpOworCisgIGJvb2wgY2FuU3BsaXRQcmVkZWNlc3NvcnMoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFNwbGl0IHRoZSBiYXNpYyBibG9jayBpbnRvIHR3byBiYXNpYyBibG9ja3MgYXQgdGhlIHNwZWNpZmllZAorICAvLy8gaW5zdHJ1Y3Rpb24uCisgIC8vLworICAvLy8gTm90ZSB0aGF0IGFsbCBpbnN0cnVjdGlvbnMgQkVGT1JFIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3Igc3RheSBhcyBwYXJ0IG9mCisgIC8vLyB0aGUgb3JpZ2luYWwgYmFzaWMgYmxvY2ssIGFuIHVuY29uZGl0aW9uYWwgYnJhbmNoIGlzIGFkZGVkIHRvIHRoZSBvcmlnaW5hbAorICAvLy8gQkIsIGFuZCB0aGUgcmVzdCBvZiB0aGUgaW5zdHJ1Y3Rpb25zIGluIHRoZSBCQiBhcmUgbW92ZWQgdG8gdGhlIG5ldyBCQiwKKyAgLy8vIGluY2x1ZGluZyB0aGUgb2xkIHRlcm1pbmF0b3IuICBUaGUgbmV3bHkgZm9ybWVkIEJhc2ljQmxvY2sgaXMgcmV0dXJuZWQuCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGludmFsaWRhdGVzIHRoZSBzcGVjaWZpZWQgaXRlcmF0b3IuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgb25seSB3b3JrcyBvbiB3ZWxsIGZvcm1lZCBiYXNpYyBibG9ja3MgKG11c3QgaGF2ZSBhCisgIC8vLyB0ZXJtaW5hdG9yKSwgYW5kICdJJyBtdXN0IG5vdCBiZSB0aGUgZW5kIG9mIGluc3RydWN0aW9uIGxpc3QgKHdoaWNoIHdvdWxkCisgIC8vLyBjYXVzZSBhIGRlZ2VuZXJhdGUgYmFzaWMgYmxvY2sgdG8gYmUgZm9ybWVkLCBoYXZpbmcgYSB0ZXJtaW5hdG9yIGluc2lkZSBvZgorICAvLy8gdGhlIGJhc2ljIGJsb2NrKS4KKyAgLy8vCisgIC8vLyBBbHNvIG5vdGUgdGhhdCB0aGlzIGRvZXNuJ3QgcHJlc2VydmUgYW55IHBhc3Nlcy4gVG8gc3BsaXQgYmxvY2tzIHdoaWxlCisgIC8vLyBrZWVwaW5nIGxvb3AgaW5mb3JtYXRpb24gY29uc2lzdGVudCwgdXNlIHRoZSBTcGxpdEJsb2NrIHV0aWxpdHkgZnVuY3Rpb24uCisgIEJhc2ljQmxvY2sgKnNwbGl0QmFzaWNCbG9jayhpdGVyYXRvciBJLCBjb25zdCBUd2luZSAmQkJOYW1lID0gIiIpOworICBCYXNpY0Jsb2NrICpzcGxpdEJhc2ljQmxvY2soSW5zdHJ1Y3Rpb24gKkksIGNvbnN0IFR3aW5lICZCQk5hbWUgPSAiIikgeworICAgIHJldHVybiBzcGxpdEJhc2ljQmxvY2soSS0+Z2V0SXRlcmF0b3IoKSwgQkJOYW1lKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhbnkgdXNlcyBvZiB0aGlzIGJhc2ljIGJsb2NrIG90aGVyIHRoYW4KKyAgLy8vIGRpcmVjdCBicmFuY2hlcywgc3dpdGNoZXMsIGV0Yy4gdG8gaXQuCisgIGJvb2wgaGFzQWRkcmVzc1Rha2VuKCkgY29uc3QgeyByZXR1cm4gZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCkgIT0gMDsgfQorCisgIC8vLyBcYnJpZWYgVXBkYXRlIGFsbCBwaGkgbm9kZXMgaW4gdGhpcyBiYXNpYyBibG9jaydzIHN1Y2Nlc3NvcnMgdG8gcmVmZXIgdG8KKyAgLy8vIGJhc2ljIGJsb2NrIFxwIE5ldyBpbnN0ZWFkIG9mIHRvIGl0LgorICB2b2lkIHJlcGxhY2VTdWNjZXNzb3JzUGhpVXNlc1dpdGgoQmFzaWNCbG9jayAqTmV3KTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgYmFzaWMgYmxvY2sgaXMgYW4gZXhjZXB0aW9uIGhhbmRsaW5nIGJsb2NrLgorICBib29sIGlzRUhQYWQoKSBjb25zdCB7IHJldHVybiBnZXRGaXJzdE5vblBISSgpLT5pc0VIUGFkKCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgYmFzaWMgYmxvY2sgaXMgYSBsYW5kaW5nIHBhZC4KKyAgLy8vCisgIC8vLyBCZWluZyBhIGBgbGFuZGluZyBwYWQnJyBtZWFucyB0aGF0IHRoZSBiYXNpYyBibG9jayBpcyB0aGUgZGVzdGluYXRpb24gb2YKKyAgLy8vIHRoZSAndW53aW5kJyBlZGdlIG9mIGFuIGludm9rZSBpbnN0cnVjdGlvbi4KKyAgYm9vbCBpc0xhbmRpbmdQYWQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbGFuZGluZ3BhZCBpbnN0cnVjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGxhbmRpbmcgcGFkLgorICBjb25zdCBMYW5kaW5nUGFkSW5zdCAqZ2V0TGFuZGluZ1BhZEluc3QoKSBjb25zdDsKKyAgTGFuZGluZ1BhZEluc3QgKmdldExhbmRpbmdQYWRJbnN0KCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PExhbmRpbmdQYWRJbnN0ICo+KAorICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBCYXNpY0Jsb2NrICo+KHRoaXMpLT5nZXRMYW5kaW5nUGFkSW5zdCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgaXQgaXMgbGVnYWwgdG8gaG9pc3QgaW5zdHJ1Y3Rpb25zIGludG8gdGhpcyBibG9jay4KKyAgYm9vbCBpc0xlZ2FsVG9Ib2lzdEludG8oKSBjb25zdDsKKworICBPcHRpb25hbDx1aW50NjRfdD4gZ2V0SXJyTG9vcEhlYWRlcldlaWdodCgpIGNvbnN0OworCitwcml2YXRlOgorICAvLy8gXGJyaWVmIEluY3JlbWVudCB0aGUgaW50ZXJuYWwgcmVmY291bnQgb2YgdGhlIG51bWJlciBvZiBCbG9ja0FkZHJlc3NlcworICAvLy8gcmVmZXJlbmNpbmcgdGhpcyBCYXNpY0Jsb2NrIGJ5IFxwIEFtdC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGFsbW9zdCBhbHdheXMgMCwgc29tZXRpbWVzIG9uZSBwb3NzaWJseSwgYnV0IGFsbW9zdCBuZXZlciAyLCBhbmQKKyAgLy8vIGluY29uY2VpdmFibHkgMyBvciBtb3JlLgorICB2b2lkIEFkanVzdEJsb2NrQWRkcmVzc1JlZkNvdW50KGludCBBbXQpIHsKKyAgICBzZXRWYWx1ZVN1YmNsYXNzRGF0YShnZXRTdWJjbGFzc0RhdGFGcm9tVmFsdWUoKStBbXQpOworICAgIGFzc2VydCgoaW50KShzaWduZWQgY2hhcilnZXRTdWJjbGFzc0RhdGFGcm9tVmFsdWUoKSA+PSAwICYmCisgICAgICAgICAgICJSZWZjb3VudCB3cmFwLWFyb3VuZCIpOworICB9CisKKyAgLy8vIFxicmllZiBTaGFkb3cgVmFsdWU6OnNldFZhbHVlU3ViY2xhc3NEYXRhIHdpdGggYSBwcml2YXRlIGZvcndhcmRpbmcgbWV0aG9kCisgIC8vLyBzbyB0aGF0IGFueSBmdXR1cmUgc3ViY2xhc3NlcyBjYW5ub3QgYWNjaWRlbnRhbGx5IHVzZSBpdC4KKyAgdm9pZCBzZXRWYWx1ZVN1YmNsYXNzRGF0YSh1bnNpZ25lZCBzaG9ydCBEKSB7CisgICAgVmFsdWU6OnNldFZhbHVlU3ViY2xhc3NEYXRhKEQpOworICB9Cit9OworCisvLyBDcmVhdGUgd3JhcHBlcnMgZm9yIEMgQmluZGluZyB0eXBlcyAoc2VlIENCaW5kaW5nV3JhcHBpbmcuaCkuCitERUZJTkVfU0lNUExFX0NPTlZFUlNJT05fRlVOQ1RJT05TKEJhc2ljQmxvY2ssIExMVk1CYXNpY0Jsb2NrUmVmKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9CQVNJQ0JMT0NLX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQ0ZHLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0NGRy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUyNTllNDIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0NGRy5oCkBAIC0wLDAgKzEsMjY2IEBACisvLz09PS0gQ0ZHLmggLSBQcm9jZXNzIExMVk0gc3RydWN0dXJlcyBhcyBncmFwaHMgLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHNwZWNpYWxpemF0aW9ucyBvZiBHcmFwaFRyYWl0cyB0aGF0IGFsbG93IEZ1bmN0aW9uIGFuZAorLy8gQmFzaWNCbG9jayBncmFwaHMgdG8gYmUgdHJlYXRlZCBhcyBwcm9wZXIgZ3JhcGhzIGZvciBnZW5lcmljIGFsZ29yaXRobXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0NGR19ICisjZGVmaW5lIExMVk1fSVJfQ0ZHX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RyVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEJhc2ljQmxvY2sgcHJlZF9pdGVyYXRvciBkZWZpbml0aW9uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit0ZW1wbGF0ZSA8Y2xhc3MgUHRyLCBjbGFzcyBVU0VfaXRlcmF0b3I+IC8vIFByZWRlY2Vzc29yIEl0ZXJhdG9yCitjbGFzcyBQcmVkSXRlcmF0b3IgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyLCBwdHJkaWZmX3QsIFB0ciosIFB0cio+IHsKKyAgdXNpbmcgc3VwZXIgPQorICAgICAgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBQdHIsIHB0cmRpZmZfdCwgUHRyKiwgUHRyKj47CisgIHVzaW5nIFNlbGYgPSBQcmVkSXRlcmF0b3I8UHRyLCBVU0VfaXRlcmF0b3I+OworICBVU0VfaXRlcmF0b3IgSXQ7CisKKyAgaW5saW5lIHZvaWQgYWR2YW5jZVBhc3ROb25UZXJtaW5hdG9ycygpIHsKKyAgICAvLyBMb29wIHRvIGlnbm9yZSBub24tdGVybWluYXRvciB1c2VzIChmb3IgZXhhbXBsZSBCbG9ja0FkZHJlc3NlcykuCisgICAgd2hpbGUgKCFJdC5hdEVuZCgpICYmICFpc2E8VGVybWluYXRvckluc3Q+KCpJdCkpCisgICAgICArK0l0OworICB9CisKK3B1YmxpYzoKKyAgdXNpbmcgcG9pbnRlciA9IHR5cGVuYW1lIHN1cGVyOjpwb2ludGVyOworICB1c2luZyByZWZlcmVuY2UgPSB0eXBlbmFtZSBzdXBlcjo6cmVmZXJlbmNlOworCisgIFByZWRJdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgaW5saW5lIFByZWRJdGVyYXRvcihQdHIgKmJiKSA6IEl0KGJiLT51c2VyX2JlZ2luKCkpIHsKKyAgICBhZHZhbmNlUGFzdE5vblRlcm1pbmF0b3JzKCk7CisgIH0KKyAgaW5saW5lIFByZWRJdGVyYXRvcihQdHIgKmJiLCBib29sKSA6IEl0KGJiLT51c2VyX2VuZCgpKSB7fQorCisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgU2VsZiYgeCkgY29uc3QgeyByZXR1cm4gSXQgPT0geC5JdDsgfQorICBpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFNlbGYmIHgpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KHgpOyB9CisKKyAgaW5saW5lIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7CisgICAgYXNzZXJ0KCFJdC5hdEVuZCgpICYmICJwcmVkX2l0ZXJhdG9yIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gY2FzdDxUZXJtaW5hdG9ySW5zdD4oKkl0KS0+Z2V0UGFyZW50KCk7CisgIH0KKyAgaW5saW5lIHBvaW50ZXIgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmb3BlcmF0b3IqKCk7IH0KKworICBpbmxpbmUgU2VsZiYgb3BlcmF0b3IrKygpIHsgICAvLyBQcmVpbmNyZW1lbnQKKyAgICBhc3NlcnQoIUl0LmF0RW5kKCkgJiYgInByZWRfaXRlcmF0b3Igb3V0IG9mIHJhbmdlISIpOworICAgICsrSXQ7IGFkdmFuY2VQYXN0Tm9uVGVybWluYXRvcnMoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgU2VsZiBvcGVyYXRvcisrKGludCkgeyAvLyBQb3N0aW5jcmVtZW50CisgICAgU2VsZiB0bXAgPSAqdGhpczsgKysqdGhpczsgcmV0dXJuIHRtcDsKKyAgfQorCisgIC8vLyBnZXRPcGVyYW5kTm8gLSBSZXR1cm4gdGhlIG9wZXJhbmQgbnVtYmVyIGluIHRoZSBwcmVkZWNlc3NvcidzCisgIC8vLyB0ZXJtaW5hdG9yIG9mIHRoZSBzdWNjZXNzb3IuCisgIHVuc2lnbmVkIGdldE9wZXJhbmRObygpIGNvbnN0IHsKKyAgICByZXR1cm4gSXQuZ2V0T3BlcmFuZE5vKCk7CisgIH0KKworICAvLy8gZ2V0VXNlIC0gUmV0dXJuIHRoZSBvcGVyYW5kIFVzZSBpbiB0aGUgcHJlZGVjZXNzb3IncyB0ZXJtaW5hdG9yCisgIC8vLyBvZiB0aGUgc3VjY2Vzc29yLgorICBVc2UgJmdldFVzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gSXQuZ2V0VXNlKCk7CisgIH0KK307CisKK3VzaW5nIHByZWRfaXRlcmF0b3IgPSBQcmVkSXRlcmF0b3I8QmFzaWNCbG9jaywgVmFsdWU6OnVzZXJfaXRlcmF0b3I+OwordXNpbmcgY29uc3RfcHJlZF9pdGVyYXRvciA9CisgICAgUHJlZEl0ZXJhdG9yPGNvbnN0IEJhc2ljQmxvY2ssIFZhbHVlOjpjb25zdF91c2VyX2l0ZXJhdG9yPjsKK3VzaW5nIHByZWRfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxwcmVkX2l0ZXJhdG9yPjsKK3VzaW5nIHByZWRfY29uc3RfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxjb25zdF9wcmVkX2l0ZXJhdG9yPjsKKworaW5saW5lIHByZWRfaXRlcmF0b3IgcHJlZF9iZWdpbihCYXNpY0Jsb2NrICpCQikgeyByZXR1cm4gcHJlZF9pdGVyYXRvcihCQik7IH0KK2lubGluZSBjb25zdF9wcmVkX2l0ZXJhdG9yIHByZWRfYmVnaW4oY29uc3QgQmFzaWNCbG9jayAqQkIpIHsKKyAgcmV0dXJuIGNvbnN0X3ByZWRfaXRlcmF0b3IoQkIpOworfQoraW5saW5lIHByZWRfaXRlcmF0b3IgcHJlZF9lbmQoQmFzaWNCbG9jayAqQkIpIHsgcmV0dXJuIHByZWRfaXRlcmF0b3IoQkIsIHRydWUpO30KK2lubGluZSBjb25zdF9wcmVkX2l0ZXJhdG9yIHByZWRfZW5kKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSB7CisgIHJldHVybiBjb25zdF9wcmVkX2l0ZXJhdG9yKEJCLCB0cnVlKTsKK30KK2lubGluZSBib29sIHByZWRfZW1wdHkoY29uc3QgQmFzaWNCbG9jayAqQkIpIHsKKyAgcmV0dXJuIHByZWRfYmVnaW4oQkIpID09IHByZWRfZW5kKEJCKTsKK30KK2lubGluZSBwcmVkX3JhbmdlIHByZWRlY2Vzc29ycyhCYXNpY0Jsb2NrICpCQikgeworICByZXR1cm4gcHJlZF9yYW5nZShwcmVkX2JlZ2luKEJCKSwgcHJlZF9lbmQoQkIpKTsKK30KK2lubGluZSBwcmVkX2NvbnN0X3JhbmdlIHByZWRlY2Vzc29ycyhjb25zdCBCYXNpY0Jsb2NrICpCQikgeworICByZXR1cm4gcHJlZF9jb25zdF9yYW5nZShwcmVkX2JlZ2luKEJCKSwgcHJlZF9lbmQoQkIpKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEJhc2ljQmxvY2sgc3VjY19pdGVyYXRvciBoZWxwZXJzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit1c2luZyBzdWNjX2l0ZXJhdG9yID0KKyAgICBUZXJtaW5hdG9ySW5zdDo6U3VjY0l0ZXJhdG9yPFRlcm1pbmF0b3JJbnN0ICosIEJhc2ljQmxvY2s+OwordXNpbmcgc3VjY19jb25zdF9pdGVyYXRvciA9CisgICAgVGVybWluYXRvckluc3Q6OlN1Y2NJdGVyYXRvcjxjb25zdCBUZXJtaW5hdG9ySW5zdCAqLCBjb25zdCBCYXNpY0Jsb2NrPjsKK3VzaW5nIHN1Y2NfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxzdWNjX2l0ZXJhdG9yPjsKK3VzaW5nIHN1Y2NfY29uc3RfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxzdWNjX2NvbnN0X2l0ZXJhdG9yPjsKKworaW5saW5lIHN1Y2NfaXRlcmF0b3Igc3VjY19iZWdpbihCYXNpY0Jsb2NrICpCQikgeworICByZXR1cm4gc3VjY19pdGVyYXRvcihCQi0+Z2V0VGVybWluYXRvcigpKTsKK30KK2lubGluZSBzdWNjX2NvbnN0X2l0ZXJhdG9yIHN1Y2NfYmVnaW4oY29uc3QgQmFzaWNCbG9jayAqQkIpIHsKKyAgcmV0dXJuIHN1Y2NfY29uc3RfaXRlcmF0b3IoQkItPmdldFRlcm1pbmF0b3IoKSk7Cit9CitpbmxpbmUgc3VjY19pdGVyYXRvciBzdWNjX2VuZChCYXNpY0Jsb2NrICpCQikgeworICByZXR1cm4gc3VjY19pdGVyYXRvcihCQi0+Z2V0VGVybWluYXRvcigpLCB0cnVlKTsKK30KK2lubGluZSBzdWNjX2NvbnN0X2l0ZXJhdG9yIHN1Y2NfZW5kKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSB7CisgIHJldHVybiBzdWNjX2NvbnN0X2l0ZXJhdG9yKEJCLT5nZXRUZXJtaW5hdG9yKCksIHRydWUpOworfQoraW5saW5lIGJvb2wgc3VjY19lbXB0eShjb25zdCBCYXNpY0Jsb2NrICpCQikgeworICByZXR1cm4gc3VjY19iZWdpbihCQikgPT0gc3VjY19lbmQoQkIpOworfQoraW5saW5lIHN1Y2NfcmFuZ2Ugc3VjY2Vzc29ycyhCYXNpY0Jsb2NrICpCQikgeworICByZXR1cm4gc3VjY19yYW5nZShzdWNjX2JlZ2luKEJCKSwgc3VjY19lbmQoQkIpKTsKK30KK2lubGluZSBzdWNjX2NvbnN0X3JhbmdlIHN1Y2Nlc3NvcnMoY29uc3QgQmFzaWNCbG9jayAqQkIpIHsKKyAgcmV0dXJuIHN1Y2NfY29uc3RfcmFuZ2Uoc3VjY19iZWdpbihCQiksIHN1Y2NfZW5kKEJCKSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorc3RydWN0IGlzUG9kTGlrZTxUZXJtaW5hdG9ySW5zdDo6U3VjY0l0ZXJhdG9yPFQsIFU+PiB7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gaXNQb2RMaWtlPFQ+Ojp2YWx1ZTsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gR3JhcGhUcmFpdHMgc3BlY2lhbGl6YXRpb25zIGZvciBiYXNpYyBibG9jayBncmFwaHMgKENGR3MpCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gUHJvdmlkZSBzcGVjaWFsaXphdGlvbnMgb2YgR3JhcGhUcmFpdHMgdG8gYmUgYWJsZSB0byB0cmVhdCBhIGZ1bmN0aW9uIGFzIGEKKy8vIGdyYXBoIG9mIGJhc2ljIGJsb2Nrcy4uLgorCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8QmFzaWNCbG9jayo+IHsKKyAgdXNpbmcgTm9kZVJlZiA9IEJhc2ljQmxvY2sgKjsKKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSBzdWNjX2l0ZXJhdG9yOworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShCYXNpY0Jsb2NrICpCQikgeyByZXR1cm4gQkI7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeyByZXR1cm4gc3VjY19iZWdpbihOKTsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfZW5kKE5vZGVSZWYgTikgeyByZXR1cm4gc3VjY19lbmQoTik7IH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxjb25zdCBCYXNpY0Jsb2NrKj4geworICB1c2luZyBOb2RlUmVmID0gY29uc3QgQmFzaWNCbG9jayAqOworICB1c2luZyBDaGlsZEl0ZXJhdG9yVHlwZSA9IHN1Y2NfY29uc3RfaXRlcmF0b3I7CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKGNvbnN0IEJhc2ljQmxvY2sgKkJCKSB7IHJldHVybiBCQjsgfQorCisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsgcmV0dXJuIHN1Y2NfYmVnaW4oTik7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlUmVmIE4pIHsgcmV0dXJuIHN1Y2NfZW5kKE4pOyB9Cit9OworCisvLyBQcm92aWRlIHNwZWNpYWxpemF0aW9ucyBvZiBHcmFwaFRyYWl0cyB0byBiZSBhYmxlIHRvIHRyZWF0IGEgZnVuY3Rpb24gYXMgYQorLy8gZ3JhcGggb2YgYmFzaWMgYmxvY2tzLi4uIGFuZCB0byB3YWxrIGl0IGluIGludmVyc2Ugb3JkZXIuICBJbnZlcnNlIG9yZGVyIGZvcgorLy8gYSBmdW5jdGlvbiBpcyBjb25zaWRlcmVkIHRvIGJlIHdoZW4gdHJhdmVyc2luZyB0aGUgcHJlZGVjZXNzb3IgZWRnZXMgb2YgYSBCQgorLy8gaW5zdGVhZCBvZiB0aGUgc3VjY2Vzc29yIGVkZ2VzLgorLy8KK3RlbXBsYXRlIDw+IHN0cnVjdCBHcmFwaFRyYWl0czxJbnZlcnNlPEJhc2ljQmxvY2sqPj4geworICB1c2luZyBOb2RlUmVmID0gQmFzaWNCbG9jayAqOworICB1c2luZyBDaGlsZEl0ZXJhdG9yVHlwZSA9IHByZWRfaXRlcmF0b3I7CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKEludmVyc2U8QmFzaWNCbG9jayAqPiBHKSB7IHJldHVybiBHLkdyYXBoOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9iZWdpbihOb2RlUmVmIE4pIHsgcmV0dXJuIHByZWRfYmVnaW4oTik7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlUmVmIE4pIHsgcmV0dXJuIHByZWRfZW5kKE4pOyB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8SW52ZXJzZTxjb25zdCBCYXNpY0Jsb2NrKj4+IHsKKyAgdXNpbmcgTm9kZVJlZiA9IGNvbnN0IEJhc2ljQmxvY2sgKjsKKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSBjb25zdF9wcmVkX2l0ZXJhdG9yOworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShJbnZlcnNlPGNvbnN0IEJhc2ljQmxvY2sgKj4gRykgeyByZXR1cm4gRy5HcmFwaDsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7IHJldHVybiBwcmVkX2JlZ2luKE4pOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7IHJldHVybiBwcmVkX2VuZChOKTsgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBHcmFwaFRyYWl0cyBzcGVjaWFsaXphdGlvbnMgZm9yIGZ1bmN0aW9uIGJhc2ljIGJsb2NrIGdyYXBocyAoQ0ZHcykKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBQcm92aWRlIHNwZWNpYWxpemF0aW9ucyBvZiBHcmFwaFRyYWl0cyB0byBiZSBhYmxlIHRvIHRyZWF0IGEgZnVuY3Rpb24gYXMgYQorLy8gZ3JhcGggb2YgYmFzaWMgYmxvY2tzLi4uIHRoZXNlIGFyZSB0aGUgc2FtZSBhcyB0aGUgYmFzaWMgYmxvY2sgaXRlcmF0b3JzLAorLy8gZXhjZXB0IHRoYXQgdGhlIHJvb3Qgbm9kZSBpcyBpbXBsaWNpdGx5IHRoZSBmaXJzdCBub2RlIG9mIHRoZSBmdW5jdGlvbi4KKy8vCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8RnVuY3Rpb24qPiA6IHB1YmxpYyBHcmFwaFRyYWl0czxCYXNpY0Jsb2NrKj4geworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoRnVuY3Rpb24gKkYpIHsgcmV0dXJuICZGLT5nZXRFbnRyeUJsb2NrKCk7IH0KKworICAvLyBub2Rlc19pdGVyYXRvci9iZWdpbi9lbmQgLSBBbGxvdyBpdGVyYXRpb24gb3ZlciBhbGwgbm9kZXMgaW4gdGhlIGdyYXBoCisgIHVzaW5nIG5vZGVzX2l0ZXJhdG9yID0gcG9pbnRlcl9pdGVyYXRvcjxGdW5jdGlvbjo6aXRlcmF0b3I+OworCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihGdW5jdGlvbiAqRikgeworICAgIHJldHVybiBub2Rlc19pdGVyYXRvcihGLT5iZWdpbigpKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoRnVuY3Rpb24gKkYpIHsKKyAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3IoRi0+ZW5kKCkpOworICB9CisKKyAgc3RhdGljIHNpemVfdCBzaXplKEZ1bmN0aW9uICpGKSB7IHJldHVybiBGLT5zaXplKCk7IH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8Y29uc3QgRnVuY3Rpb24qPiA6CisgIHB1YmxpYyBHcmFwaFRyYWl0czxjb25zdCBCYXNpY0Jsb2NrKj4geworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoY29uc3QgRnVuY3Rpb24gKkYpIHsgcmV0dXJuICZGLT5nZXRFbnRyeUJsb2NrKCk7IH0KKworICAvLyBub2Rlc19pdGVyYXRvci9iZWdpbi9lbmQgLSBBbGxvdyBpdGVyYXRpb24gb3ZlciBhbGwgbm9kZXMgaW4gdGhlIGdyYXBoCisgIHVzaW5nIG5vZGVzX2l0ZXJhdG9yID0gcG9pbnRlcl9pdGVyYXRvcjxGdW5jdGlvbjo6Y29uc3RfaXRlcmF0b3I+OworCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihjb25zdCBGdW5jdGlvbiAqRikgeworICAgIHJldHVybiBub2Rlc19pdGVyYXRvcihGLT5iZWdpbigpKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgICByZXR1cm4gbm9kZXNfaXRlcmF0b3IoRi0+ZW5kKCkpOworICB9CisKKyAgc3RhdGljIHNpemVfdCBzaXplKGNvbnN0IEZ1bmN0aW9uICpGKSB7IHJldHVybiBGLT5zaXplKCk7IH0KK307CisKKy8vIFByb3ZpZGUgc3BlY2lhbGl6YXRpb25zIG9mIEdyYXBoVHJhaXRzIHRvIGJlIGFibGUgdG8gdHJlYXQgYSBmdW5jdGlvbiBhcyBhCisvLyBncmFwaCBvZiBiYXNpYyBibG9ja3MuLi4gYW5kIHRvIHdhbGsgaXQgaW4gaW52ZXJzZSBvcmRlci4gIEludmVyc2Ugb3JkZXIgZm9yCisvLyBhIGZ1bmN0aW9uIGlzIGNvbnNpZGVyZWQgdG8gYmUgd2hlbiB0cmF2ZXJzaW5nIHRoZSBwcmVkZWNlc3NvciBlZGdlcyBvZiBhIEJCCisvLyBpbnN0ZWFkIG9mIHRoZSBzdWNjZXNzb3IgZWRnZXMuCisvLwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPEludmVyc2U8RnVuY3Rpb24qPj4gOgorICBwdWJsaWMgR3JhcGhUcmFpdHM8SW52ZXJzZTxCYXNpY0Jsb2NrKj4+IHsKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKEludmVyc2U8RnVuY3Rpb24gKj4gRykgeworICAgIHJldHVybiAmRy5HcmFwaC0+Z2V0RW50cnlCbG9jaygpOworICB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPEludmVyc2U8Y29uc3QgRnVuY3Rpb24qPj4gOgorICBwdWJsaWMgR3JhcGhUcmFpdHM8SW52ZXJzZTxjb25zdCBCYXNpY0Jsb2NrKj4+IHsKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKEludmVyc2U8Y29uc3QgRnVuY3Rpb24gKj4gRykgeworICAgIHJldHVybiAmRy5HcmFwaC0+Z2V0RW50cnlCbG9jaygpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9DRkdfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9DYWxsU2l0ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9DYWxsU2l0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViMTBkYTgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0NhbGxTaXRlLmgKQEAgLTAsMCArMSw3MjUgQEAKKy8vPT09LSBDYWxsU2l0ZS5oIC0gQWJzdHJhY3QgQ2FsbCAmIEludm9rZSBpbnN0cnMgLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIENhbGxTaXRlIGNsYXNzLCB3aGljaCBpcyBhIGhhbmR5IHdyYXBwZXIgZm9yIGNvZGUgdGhhdAorLy8gd2FudHMgdG8gdHJlYXQgQ2FsbCBhbmQgSW52b2tlIGluc3RydWN0aW9ucyBpbiBhIGdlbmVyaWMgd2F5LiBXaGVuIGluIG5vbi0KKy8vIG11dGF0aW9uIGNvbnRleHQgKGUuZy4gYW4gYW5hbHlzaXMpIEltbXV0YWJsZUNhbGxTaXRlIHNob3VsZCBiZSB1c2VkLgorLy8gRmluYWxseSwgd2hlbiBzb21lIGRlZ3JlZSBvZiBjdXN0b21pemF0aW9uIGlzIG5lY2Vzc2FyeSBiZXR3ZWVuIHRoZXNlIHR3bworLy8gZXh0cmVtZXMsIENhbGxTaXRlQmFzZTw+IGNhbiBiZSBzdXBwbGllZCB3aXRoIGZpbmUtdHVuZWQgcGFyYW1ldGVycy4KKy8vCisvLyBOT1RFOiBUaGVzZSBjbGFzc2VzIGFyZSBzdXBwb3NlZCB0byBoYXZlICJ2YWx1ZSBzZW1hbnRpY3MiLiBTbyB0aGV5IHNob3VsZCBiZQorLy8gcGFzc2VkIGJ5IHZhbHVlLCBub3QgYnkgcmVmZXJlbmNlOyB0aGV5IHNob3VsZCBub3QgYmUgIm5ldyJlZCBvciAiZGVsZXRlImQuCisvLyBUaGV5IGFyZSBlZmZpY2llbnRseSBjb3B5YWJsZSwgYXNzaWduYWJsZSBhbmQgY29uc3RydWN0YWJsZSwgd2l0aCBjb3N0CisvLyBlcXVpdmFsZW50IHRvIGNvcHlpbmcgYSBwb2ludGVyIChub3RpY2UgdGhhdCB0aGV5IGhhdmUgb25seSBhIHNpbmdsZSBkYXRhCisvLyBtZW1iZXIpLiBUaGUgaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gY2FycmllcyBhIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoaWNoIG9mCisvLyB0aGUgdHdvIHZhcmlhbnRzIGlzIGVuY2xvc2VkLiBUaGlzIGFsbG93cyBmb3IgY2hlYXBlciBjaGVja3Mgd2hlbiB2YXJpb3VzCisvLyBhY2Nlc3NvcnMgb2YgQ2FsbFNpdGUgYXJlIGVtcGxveWVkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9DQUxMU0lURV9ICisjZGVmaW5lIExMVk1fSVJfQ0FMTFNJVEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9BdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsaW5nQ29udi5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RyVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1VzZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVXNlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgSW50cmluc2ljIHsKK2VudW0gSUQgOiB1bnNpZ25lZDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEZ1blR5ID0gY29uc3QgRnVuY3Rpb24sCisgICAgICAgICAgdHlwZW5hbWUgQkJUeSA9IGNvbnN0IEJhc2ljQmxvY2ssCisgICAgICAgICAgdHlwZW5hbWUgVmFsVHkgPSBjb25zdCBWYWx1ZSwKKyAgICAgICAgICB0eXBlbmFtZSBVc2VyVHkgPSBjb25zdCBVc2VyLAorICAgICAgICAgIHR5cGVuYW1lIFVzZVR5ID0gY29uc3QgVXNlLAorICAgICAgICAgIHR5cGVuYW1lIEluc3RyVHkgPSBjb25zdCBJbnN0cnVjdGlvbiwKKyAgICAgICAgICB0eXBlbmFtZSBDYWxsVHkgPSBjb25zdCBDYWxsSW5zdCwKKyAgICAgICAgICB0eXBlbmFtZSBJbnZva2VUeSA9IGNvbnN0IEludm9rZUluc3QsCisgICAgICAgICAgdHlwZW5hbWUgSXRlclR5ID0gVXNlcjo6Y29uc3Rfb3BfaXRlcmF0b3I+CitjbGFzcyBDYWxsU2l0ZUJhc2UgeworcHJvdGVjdGVkOgorICBQb2ludGVySW50UGFpcjxJbnN0clR5KiwgMSwgYm9vbD4gSTsKKworICBDYWxsU2l0ZUJhc2UoKSA9IGRlZmF1bHQ7CisgIENhbGxTaXRlQmFzZShDYWxsVHkgKkNJKSA6IEkoQ0ksIHRydWUpIHsgYXNzZXJ0KENJKTsgfQorICBDYWxsU2l0ZUJhc2UoSW52b2tlVHkgKklJKSA6IEkoSUksIGZhbHNlKSB7IGFzc2VydChJSSk7IH0KKyAgZXhwbGljaXQgQ2FsbFNpdGVCYXNlKFZhbFR5ICpJSSkgeyAqdGhpcyA9IGdldChJSSk7IH0KKworcHJpdmF0ZToKKyAgLy8vIFRoaXMgc3RhdGljIG1ldGhvZCBpcyBsaWtlIGEgY29uc3RydWN0b3IuIEl0IHdpbGwgY3JlYXRlIGFuIGFwcHJvcHJpYXRlCisgIC8vLyBjYWxsIHNpdGUgZm9yIGEgQ2FsbCBvciBJbnZva2UgaW5zdHJ1Y3Rpb24sIGJ1dCBpdCBjYW4gYWxzbyBjcmVhdGUgYSBudWxsCisgIC8vLyBpbml0aWFsaXplZCBDYWxsU2l0ZUJhc2Ugb2JqZWN0IGZvciBzb21ldGhpbmcgd2hpY2ggaXMgTk9UIGEgY2FsbCBzaXRlLgorICBzdGF0aWMgQ2FsbFNpdGVCYXNlIGdldChWYWxUeSAqVikgeworICAgIGlmIChJbnN0clR5ICpJSSA9IGR5bl9jYXN0PEluc3RyVHk+KFYpKSB7CisgICAgICBpZiAoSUktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpDYWxsKQorICAgICAgICByZXR1cm4gQ2FsbFNpdGVCYXNlKHN0YXRpY19jYXN0PENhbGxUeSo+KElJKSk7CisgICAgICBlbHNlIGlmIChJSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246Okludm9rZSkKKyAgICAgICAgcmV0dXJuIENhbGxTaXRlQmFzZShzdGF0aWNfY2FzdDxJbnZva2VUeSo+KElJKSk7CisgICAgfQorICAgIHJldHVybiBDYWxsU2l0ZUJhc2UoKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhIENhbGxJbnN0IGlzIGVuY2xvc2VkLiBOb3RlIHRoYXQgIWlzQ2FsbCgpIGRvZXMgbm90IG1lYW4KKyAgLy8vIGFuIEludm9rZUluc3QgaXMgZW5jbG9zZWQuIEl0IG1heSBhbHNvIHNpZ25pZnkgYSBOVUxMIGluc3RydWN0aW9uIHBvaW50ZXIuCisgIGJvb2wgaXNDYWxsKCkgY29uc3QgeyByZXR1cm4gSS5nZXRJbnQoKTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhIEludm9rZUluc3QgaXMgZW5jbG9zZWQuCisgIGJvb2wgaXNJbnZva2UoKSBjb25zdCB7IHJldHVybiBnZXRJbnN0cnVjdGlvbigpICYmICFJLmdldEludCgpOyB9CisKKyAgSW5zdHJUeSAqZ2V0SW5zdHJ1Y3Rpb24oKSBjb25zdCB7IHJldHVybiBJLmdldFBvaW50ZXIoKTsgfQorICBJbnN0clR5ICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gSS5nZXRQb2ludGVyKCk7IH0KKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIEkuZ2V0UG9pbnRlcigpOyB9CisKKyAgLy8vIEdldCB0aGUgYmFzaWMgYmxvY2sgY29udGFpbmluZyB0aGUgY2FsbCBzaXRlLgorICBCQlR5KiBnZXRQYXJlbnQoKSBjb25zdCB7IHJldHVybiBnZXRJbnN0cnVjdGlvbigpLT5nZXRQYXJlbnQoKTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIHBvaW50ZXIgdG8gZnVuY3Rpb24gdGhhdCBpcyBiZWluZyBjYWxsZWQuCisgIFZhbFR5ICpnZXRDYWxsZWRWYWx1ZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0SW5zdHJ1Y3Rpb24oKSAmJiAiTm90IGEgY2FsbCBvciBpbnZva2UgaW5zdHJ1Y3Rpb24hIik7CisgICAgcmV0dXJuICpnZXRDYWxsZWUoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZCBpZiB0aGlzIGlzIGEgZGlyZWN0IGNhbGwsIG90aGVyd2lzZQorICAvLy8gcmV0dXJuIG51bGwgKGlmIGl0J3MgYW4gaW5kaXJlY3QgY2FsbCkuCisgIEZ1blR5ICpnZXRDYWxsZWRGdW5jdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZHluX2Nhc3Q8RnVuVHk+KGdldENhbGxlZFZhbHVlKCkpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBjYWxsc2l0ZSBpcyBhbiBpbmRpcmVjdCBjYWxsLgorICBib29sIGlzSW5kaXJlY3RDYWxsKCkgY29uc3QgeworICAgIGNvbnN0IFZhbHVlICpWID0gZ2V0Q2FsbGVkVmFsdWUoKTsKKyAgICBpZiAoIVYpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKGlzYTxGdW5UeT4oVikgfHwgaXNhPENvbnN0YW50PihWKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoY29uc3QgQ2FsbEluc3QgKkNJID0gZHluX2Nhc3Q8Q2FsbEluc3Q+KGdldEluc3RydWN0aW9uKCkpKSB7CisgICAgICBpZiAoQ0ktPmlzSW5saW5lQXNtKCkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gU2V0IHRoZSBjYWxsZWUgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgdm9pZCBzZXRDYWxsZWRGdW5jdGlvbihWYWx1ZSAqVikgeworICAgIGFzc2VydChnZXRJbnN0cnVjdGlvbigpICYmICJOb3QgYSBjYWxsIG9yIGludm9rZSBpbnN0cnVjdGlvbiEiKTsKKyAgICAqZ2V0Q2FsbGVlKCkgPSBWOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgaW50cmluc2ljIElEIG9mIHRoZSBpbnRyaW5zaWMgY2FsbGVkIGJ5IHRoaXMgQ2FsbFNpdGUsCisgIC8vLyBvciBJbnRyaW5zaWM6Om5vdF9pbnRyaW5zaWMgaWYgdGhlIGNhbGxlZCBmdW5jdGlvbiBpcyBub3QgYW4KKyAgLy8vIGludHJpbnNpYywgb3IgaWYgdGhpcyBDYWxsU2l0ZSBpcyBhbiBpbmRpcmVjdCBjYWxsLgorICBJbnRyaW5zaWM6OklEIGdldEludHJpbnNpY0lEKCkgY29uc3QgeworICAgIGlmIChhdXRvICpGID0gZ2V0Q2FsbGVkRnVuY3Rpb24oKSkKKyAgICAgIHJldHVybiBGLT5nZXRJbnRyaW5zaWNJRCgpOworICAgIC8vIERvbid0IHVzZSBJbnRyaW5zaWM6Om5vdF9pbnRyaW5zaWMsIGFzIGl0IHdpbGwgcmVxdWlyZSBwdWxsaW5nCisgICAgLy8gSW50cmluc2ljcy5oIGludG8gZXZlcnkgaGVhZGVyIHRoYXQgdXNlcyBDYWxsU2l0ZS4KKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8SW50cmluc2ljOjpJRD4oMCk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIHBhc3NlZCBpdGVyYXRvciBwb2ludHMgdG8gdGhlIGNhbGxlZSBvcGVyYW5kJ3MgVXNlLgorICBib29sIGlzQ2FsbGVlKFZhbHVlOjpjb25zdF91c2VyX2l0ZXJhdG9yIFVJKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQ2FsbGVlKCZVSS5nZXRVc2UoKSk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBVc2UgaXMgdGhlIGNhbGxlZSBvcGVyYW5kJ3MgVXNlLgorICBib29sIGlzQ2FsbGVlKGNvbnN0IFVzZSAqVSkgY29uc3QgeyByZXR1cm4gZ2V0Q2FsbGVlKCkgPT0gVTsgfQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgcGFzc2VkIGl0ZXJhdG9yIHBvaW50cyB0byBhbiBhcmd1bWVudCBvcGVyYW5kLgorICBib29sIGlzQXJnT3BlcmFuZChWYWx1ZTo6Y29uc3RfdXNlcl9pdGVyYXRvciBVSSkgY29uc3QgeworICAgIHJldHVybiBpc0FyZ09wZXJhbmQoJlVJLmdldFVzZSgpKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgcGFzc2VkIHVzZSBwb2ludHMgdG8gYW4gYXJndW1lbnQgb3BlcmFuZC4KKyAgYm9vbCBpc0FyZ09wZXJhbmQoY29uc3QgVXNlICpVKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEluc3RydWN0aW9uKCkgPT0gVS0+Z2V0VXNlcigpKTsKKyAgICByZXR1cm4gYXJnX2JlZ2luKCkgPD0gVSAmJiBVIDwgYXJnX2VuZCgpOworICB9CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBwYXNzZWQgaXRlcmF0b3IgcG9pbnRzIHRvIGEgYnVuZGxlIG9wZXJhbmQuCisgIGJvb2wgaXNCdW5kbGVPcGVyYW5kKFZhbHVlOjpjb25zdF91c2VyX2l0ZXJhdG9yIFVJKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQnVuZGxlT3BlcmFuZCgmVUkuZ2V0VXNlKCkpOworICB9CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBwYXNzZWQgdXNlIHBvaW50cyB0byBhIGJ1bmRsZSBvcGVyYW5kLgorICBib29sIGlzQnVuZGxlT3BlcmFuZChjb25zdCBVc2UgKlUpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0SW5zdHJ1Y3Rpb24oKSA9PSBVLT5nZXRVc2VyKCkpOworICAgIGlmICghaGFzT3BlcmFuZEJ1bmRsZXMoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB1bnNpZ25lZCBPcGVyYW5kTm8gPSBVIC0gKCp0aGlzKS0+b3BfYmVnaW4oKTsKKyAgICByZXR1cm4gZ2V0QnVuZGxlT3BlcmFuZHNTdGFydEluZGV4KCkgPD0gT3BlcmFuZE5vICYmCisgICAgICAgICAgIE9wZXJhbmRObyA8IGdldEJ1bmRsZU9wZXJhbmRzRW5kSW5kZXgoKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgcGFzc2VkIGl0ZXJhdG9yIHBvaW50cyB0byBhIGRhdGEgb3BlcmFuZC4KKyAgYm9vbCBpc0RhdGFPcGVyYW5kKFZhbHVlOjpjb25zdF91c2VyX2l0ZXJhdG9yIFVJKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRGF0YU9wZXJhbmQoJlVJLmdldFVzZSgpKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgcGFzc2VkIHVzZSBwb2ludHMgdG8gYSBkYXRhIG9wZXJhbmQuCisgIGJvb2wgaXNEYXRhT3BlcmFuZChjb25zdCBVc2UgKlUpIGNvbnN0IHsKKyAgICByZXR1cm4gZGF0YV9vcGVyYW5kc19iZWdpbigpIDw9IFUgJiYgVSA8IGRhdGFfb3BlcmFuZHNfZW5kKCk7CisgIH0KKworICBWYWxUeSAqZ2V0QXJndW1lbnQodW5zaWduZWQgQXJnTm8pIGNvbnN0IHsKKyAgICBhc3NlcnQoYXJnX2JlZ2luKCkgKyBBcmdObyA8IGFyZ19lbmQoKSAmJiAiQXJndW1lbnQgIyBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuICooYXJnX2JlZ2luKCkgKyBBcmdObyk7CisgIH0KKworICB2b2lkIHNldEFyZ3VtZW50KHVuc2lnbmVkIEFyZ05vLCBWYWx1ZSogbmV3VmFsKSB7CisgICAgYXNzZXJ0KGdldEluc3RydWN0aW9uKCkgJiYgIk5vdCBhIGNhbGwgb3IgaW52b2tlIGluc3RydWN0aW9uISIpOworICAgIGFzc2VydChhcmdfYmVnaW4oKSArIEFyZ05vIDwgYXJnX2VuZCgpICYmICJBcmd1bWVudCAjIG91dCBvZiByYW5nZSEiKTsKKyAgICBnZXRJbnN0cnVjdGlvbigpLT5zZXRPcGVyYW5kKEFyZ05vLCBuZXdWYWwpOworICB9CisKKyAgLy8vIEdpdmVuIGEgdmFsdWUgdXNlIGl0ZXJhdG9yLCByZXR1cm5zIHRoZSBhcmd1bWVudCB0aGF0IGNvcnJlc3BvbmRzIHRvIGl0LgorICAvLy8gSXRlcmF0b3IgbXVzdCBhY3R1YWxseSBjb3JyZXNwb25kIHRvIGFuIGFyZ3VtZW50LgorICB1bnNpZ25lZCBnZXRBcmd1bWVudE5vKFZhbHVlOjpjb25zdF91c2VyX2l0ZXJhdG9yIEkpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QXJndW1lbnRObygmSS5nZXRVc2UoKSk7CisgIH0KKworICAvLy8gR2l2ZW4gYSB1c2UgZm9yIGFuIGFyZ3VtZW50LCBnZXQgdGhlIGFyZ3VtZW50IG51bWJlciB0aGF0IGNvcnJlc3BvbmRzIHRvCisgIC8vLyBpdC4KKyAgdW5zaWduZWQgZ2V0QXJndW1lbnRObyhjb25zdCBVc2UgKlUpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0SW5zdHJ1Y3Rpb24oKSAmJiAiTm90IGEgY2FsbCBvciBpbnZva2UgaW5zdHJ1Y3Rpb24hIik7CisgICAgYXNzZXJ0KGlzQXJnT3BlcmFuZChVKSAmJiAiQXJndW1lbnQgIyBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIFUgLSBhcmdfYmVnaW4oKTsKKyAgfQorCisgIC8vLyBUaGUgdHlwZSBvZiBpdGVyYXRvciB0byB1c2Ugd2hlbiBsb29waW5nIG92ZXIgYWN0dWFsIGFyZ3VtZW50cyBhdCB0aGlzCisgIC8vLyBjYWxsIHNpdGUuCisgIHVzaW5nIGFyZ19pdGVyYXRvciA9IEl0ZXJUeTsKKworICBpdGVyYXRvcl9yYW5nZTxJdGVyVHk+IGFyZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoYXJnX2JlZ2luKCksIGFyZ19lbmQoKSk7CisgIH0KKyAgYm9vbCBhcmdfZW1wdHkoKSBjb25zdCB7IHJldHVybiBhcmdfZW5kKCkgPT0gYXJnX2JlZ2luKCk7IH0KKyAgdW5zaWduZWQgYXJnX3NpemUoKSBjb25zdCB7IHJldHVybiB1bnNpZ25lZChhcmdfZW5kKCkgLSBhcmdfYmVnaW4oKSk7IH0KKworICAvLy8gR2l2ZW4gYSB2YWx1ZSB1c2UgaXRlcmF0b3IsIHJldHVybiB0aGUgZGF0YSBvcGVyYW5kIGNvcnJlc3BvbmRpbmcgdG8gaXQuCisgIC8vLyBJdGVyYXRvciBtdXN0IGFjdHVhbGx5IGNvcnJlc3BvbmQgdG8gYSBkYXRhIG9wZXJhbmQuCisgIHVuc2lnbmVkIGdldERhdGFPcGVyYW5kTm8oVmFsdWU6OmNvbnN0X3VzZXJfaXRlcmF0b3IgVUkpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RGF0YU9wZXJhbmRObygmVUkuZ2V0VXNlKCkpOworICB9CisKKyAgLy8vIEdpdmVuIGEgdXNlIGZvciBhIGRhdGEgb3BlcmFuZCwgZ2V0IHRoZSBkYXRhIG9wZXJhbmQgbnVtYmVyIHRoYXQKKyAgLy8vIGNvcnJlc3BvbmRzIHRvIGl0LgorICB1bnNpZ25lZCBnZXREYXRhT3BlcmFuZE5vKGNvbnN0IFVzZSAqVSkgY29uc3QgeworICAgIGFzc2VydChnZXRJbnN0cnVjdGlvbigpICYmICJOb3QgYSBjYWxsIG9yIGludm9rZSBpbnN0cnVjdGlvbiEiKTsKKyAgICBhc3NlcnQoaXNEYXRhT3BlcmFuZChVKSAmJiAiRGF0YSBvcGVyYW5kICMgb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBVIC0gZGF0YV9vcGVyYW5kc19iZWdpbigpOworICB9CisKKyAgLy8vIFR5cGUgb2YgaXRlcmF0b3IgdG8gdXNlIHdoZW4gbG9vcGluZyBvdmVyIGRhdGEgb3BlcmFuZHMgYXQgdGhpcyBjYWxsIHNpdGUKKyAgLy8vIChzZWUgYmVsb3cpLgorICB1c2luZyBkYXRhX29wZXJhbmRfaXRlcmF0b3IgPSBJdGVyVHk7CisKKyAgLy8vIGRhdGFfb3BlcmFuZHNfYmVnaW4vZGF0YV9vcGVyYW5kc19lbmQgLSBSZXR1cm4gaXRlcmF0b3JzIGl0ZXJhdGluZyBvdmVyCisgIC8vLyB0aGUgY2FsbCAvIGludm9rZSBhcmd1bWVudCBsaXN0IGFuZCBidW5kbGUgb3BlcmFuZHMuICBGb3IgaW52b2tlcywgdGhpcyBpcworICAvLy8gdGhlIHNldCBvZiBpbnN0cnVjdGlvbiBvcGVyYW5kcyBleGNlcHQgdGhlIGludm9rZSB0YXJnZXQgYW5kIHRoZSB0d28KKyAgLy8vIHN1Y2Nlc3NvciBibG9ja3M7IGFuZCBmb3IgY2FsbHMgdGhpcyBpcyB0aGUgc2V0IG9mIGluc3RydWN0aW9uIG9wZXJhbmRzCisgIC8vLyBleGNlcHQgdGhlIGNhbGwgdGFyZ2V0LgorCisgIEl0ZXJUeSBkYXRhX29wZXJhbmRzX2JlZ2luKCkgY29uc3QgeworICAgIGFzc2VydChnZXRJbnN0cnVjdGlvbigpICYmICJOb3QgYSBjYWxsIG9yIGludm9rZSBpbnN0cnVjdGlvbiEiKTsKKyAgICByZXR1cm4gKCp0aGlzKS0+b3BfYmVnaW4oKTsKKyAgfQorICBJdGVyVHkgZGF0YV9vcGVyYW5kc19lbmQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGdldEluc3RydWN0aW9uKCkgJiYgIk5vdCBhIGNhbGwgb3IgaW52b2tlIGluc3RydWN0aW9uISIpOworICAgIHJldHVybiAoKnRoaXMpLT5vcF9lbmQoKSAtIChpc0NhbGwoKSA/IDEgOiAzKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTxJdGVyVHk+IGRhdGFfb3BzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGRhdGFfb3BlcmFuZHNfYmVnaW4oKSwgZGF0YV9vcGVyYW5kc19lbmQoKSk7CisgIH0KKyAgYm9vbCBkYXRhX29wZXJhbmRzX2VtcHR5KCkgY29uc3QgeworICAgIHJldHVybiBkYXRhX29wZXJhbmRzX2VuZCgpID09IGRhdGFfb3BlcmFuZHNfYmVnaW4oKTsKKyAgfQorICB1bnNpZ25lZCBkYXRhX29wZXJhbmRzX3NpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6ZGlzdGFuY2UoZGF0YV9vcGVyYW5kc19iZWdpbigpLCBkYXRhX29wZXJhbmRzX2VuZCgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIGluc3RydWN0aW9uIHRoYXQgZ2VuZXJhdGVkIHRoaXMgY2FsbCBzaXRlLgorICBUeXBlICpnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gKCp0aGlzKS0+Z2V0VHlwZSgpOyB9CisKKyAgLy8vIFJldHVybiB0aGUgY2FsbGVyIGZ1bmN0aW9uIGZvciB0aGlzIGNhbGwgc2l0ZS4KKyAgRnVuVHkgKmdldENhbGxlcigpIGNvbnN0IHsgcmV0dXJuICgqdGhpcyktPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKTsgfQorCisgIC8vLyBUZXN0cyBpZiB0aGlzIGNhbGwgc2l0ZSBtdXN0IGJlIHRhaWwgY2FsbCBvcHRpbWl6ZWQuIE9ubHkgYSBDYWxsSW5zdCBjYW4KKyAgLy8vIGJlIHRhaWwgY2FsbCBvcHRpbWl6ZWQuCisgIGJvb2wgaXNNdXN0VGFpbENhbGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQ2FsbCgpICYmIGNhc3Q8Q2FsbEluc3Q+KGdldEluc3RydWN0aW9uKCkpLT5pc011c3RUYWlsQ2FsbCgpOworICB9CisKKyAgLy8vIFRlc3RzIGlmIHRoaXMgY2FsbCBzaXRlIGlzIG1hcmtlZCBhcyBhIHRhaWwgY2FsbC4KKyAgYm9vbCBpc1RhaWxDYWxsKCkgY29uc3QgeworICAgIHJldHVybiBpc0NhbGwoKSAmJiBjYXN0PENhbGxJbnN0PihnZXRJbnN0cnVjdGlvbigpKS0+aXNUYWlsQ2FsbCgpOworICB9CisKKyNkZWZpbmUgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKE1FVEhPRCkgXAorICBJbnN0clR5ICpJSSA9IGdldEluc3RydWN0aW9uKCk7ICAgIFwKKyAgcmV0dXJuIGlzQ2FsbCgpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgID8gY2FzdDxDYWxsSW5zdD4oSUkpLT5NRVRIT0QgICAgICAgICBcCisgICAgOiBjYXN0PEludm9rZUluc3Q+KElJKS0+TUVUSE9ECisKKyNkZWZpbmUgQ0FMTFNJVEVfREVMRUdBVEVfU0VUVEVSKE1FVEhPRCkgXAorICBJbnN0clR5ICpJSSA9IGdldEluc3RydWN0aW9uKCk7ICAgIFwKKyAgaWYgKGlzQ2FsbCgpKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc3Q8Q2FsbEluc3Q+KElJKS0+TUVUSE9EOyAgICAgICAgICBcCisgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXN0PEludm9rZUluc3Q+KElJKS0+TUVUSE9ECisKKyAgdW5zaWduZWQgZ2V0TnVtQXJnT3BlcmFuZHMoKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGdldE51bUFyZ09wZXJhbmRzKCkpOworICB9CisKKyAgVmFsVHkgKmdldEFyZ09wZXJhbmQodW5zaWduZWQgaSkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihnZXRBcmdPcGVyYW5kKGkpKTsKKyAgfQorCisgIFZhbFR5ICpnZXRSZXR1cm5lZEFyZ09wZXJhbmQoKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGdldFJldHVybmVkQXJnT3BlcmFuZCgpKTsKKyAgfQorCisgIGJvb2wgaXNJbmxpbmVBc20oKSBjb25zdCB7CisgICAgaWYgKGlzQ2FsbCgpKQorICAgICAgcmV0dXJuIGNhc3Q8Q2FsbEluc3Q+KGdldEluc3RydWN0aW9uKCkpLT5pc0lubGluZUFzbSgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGNhbGxpbmcgY29udmVudGlvbiBvZiB0aGUgY2FsbC4KKyAgQ2FsbGluZ0NvbnY6OklEIGdldENhbGxpbmdDb252KCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihnZXRDYWxsaW5nQ29udigpKTsKKyAgfQorICAvLy8gU2V0IHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gb2YgdGhlIGNhbGwuCisgIHZvaWQgc2V0Q2FsbGluZ0NvbnYoQ2FsbGluZ0NvbnY6OklEIENDKSB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfU0VUVEVSKHNldENhbGxpbmdDb252KENDKSk7CisgIH0KKworICBGdW5jdGlvblR5cGUgKmdldEZ1bmN0aW9uVHlwZSgpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoZ2V0RnVuY3Rpb25UeXBlKCkpOworICB9CisKKyAgdm9pZCBtdXRhdGVGdW5jdGlvblR5cGUoRnVuY3Rpb25UeXBlICpUeSkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUihtdXRhdGVGdW5jdGlvblR5cGUoVHkpKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIHBhcmFtZXRlciBhdHRyaWJ1dGVzIG9mIHRoZSBjYWxsLgorICBBdHRyaWJ1dGVMaXN0IGdldEF0dHJpYnV0ZXMoKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGdldEF0dHJpYnV0ZXMoKSk7CisgIH0KKyAgLy8vIFNldCB0aGUgcGFyYW1ldGVyIGF0dHJpYnV0ZXMgb2YgdGhlIGNhbGwuCisgIHZvaWQgc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGVMaXN0IFBBTCkgeworICAgIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUihzZXRBdHRyaWJ1dGVzKFBBTCkpOworICB9CisKKyAgdm9pZCBhZGRBdHRyaWJ1dGUodW5zaWduZWQgaSwgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfU0VUVEVSKGFkZEF0dHJpYnV0ZShpLCBLaW5kKSk7CisgIH0KKworICB2b2lkIGFkZEF0dHJpYnV0ZSh1bnNpZ25lZCBpLCBBdHRyaWJ1dGUgQXR0cikgeworICAgIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUihhZGRBdHRyaWJ1dGUoaSwgQXR0cikpOworICB9CisKKyAgdm9pZCBhZGRQYXJhbUF0dHIodW5zaWduZWQgQXJnTm8sIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgeworICAgIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUihhZGRQYXJhbUF0dHIoQXJnTm8sIEtpbmQpKTsKKyAgfQorCisgIHZvaWQgcmVtb3ZlQXR0cmlidXRlKHVuc2lnbmVkIGksIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgeworICAgIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUihyZW1vdmVBdHRyaWJ1dGUoaSwgS2luZCkpOworICB9CisKKyAgdm9pZCByZW1vdmVBdHRyaWJ1dGUodW5zaWduZWQgaSwgU3RyaW5nUmVmIEtpbmQpIHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9TRVRURVIocmVtb3ZlQXR0cmlidXRlKGksIEtpbmQpKTsKKyAgfQorCisgIHZvaWQgcmVtb3ZlUGFyYW1BdHRyKHVuc2lnbmVkIEFyZ05vLCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9TRVRURVIocmVtb3ZlUGFyYW1BdHRyKEFyZ05vLCBLaW5kKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBmdW5jdGlvbiBoYXMgdGhlIGdpdmVuIGF0dHJpYnV0ZS4KKyAgYm9vbCBoYXNGbkF0dHIoQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGhhc0ZuQXR0cihLaW5kKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBmdW5jdGlvbiBoYXMgdGhlIGdpdmVuIGF0dHJpYnV0ZS4KKyAgYm9vbCBoYXNGbkF0dHIoU3RyaW5nUmVmIEtpbmQpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoaGFzRm5BdHRyKEtpbmQpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJldHVybiB2YWx1ZSBoYXMgdGhlIGdpdmVuIGF0dHJpYnV0ZS4KKyAgYm9vbCBoYXNSZXRBdHRyKEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihoYXNSZXRBdHRyKEtpbmQpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY2FsbCBvciB0aGUgY2FsbGVlIGhhcyB0aGUgZ2l2ZW4gYXR0cmlidXRlLgorICBib29sIHBhcmFtSGFzQXR0cih1bnNpZ25lZCBBcmdObywgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKHBhcmFtSGFzQXR0cihBcmdObywgS2luZCkpOworICB9CisKKyAgQXR0cmlidXRlIGdldEF0dHJpYnV0ZSh1bnNpZ25lZCBpLCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoZ2V0QXR0cmlidXRlKGksIEtpbmQpKTsKKyAgfQorCisgIEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUodW5zaWduZWQgaSwgU3RyaW5nUmVmIEtpbmQpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoZ2V0QXR0cmlidXRlKGksIEtpbmQpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZGF0YSBvcGVyYW5kIGF0IGluZGV4IFxwIGkgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSBoYXMKKyAgLy8vIHRoZSBhdHRyaWJ1dGUgXHAgQS4KKyAgLy8vCisgIC8vLyBOb3JtYWwgY2FsbCBvciBpbnZva2UgYXJndW1lbnRzIGhhdmUgcGVyIG9wZXJhbmQgYXR0cmlidXRlcywgYXMgc3BlY2lmaWVkCisgIC8vLyBpbiB0aGUgYXR0cmlidXRlIHNldCBhdHRhY2hlZCB0byB0aGlzIGluc3RydWN0aW9uLCB3aGlsZSBvcGVyYW5kIGJ1bmRsZQorICAvLy8gb3BlcmFuZHMgbWF5IGhhdmUgc29tZSBhdHRyaWJ1dGVzIGltcGxpZWQgYnkgdGhlIHR5cGUgb2YgaXRzIGNvbnRhaW5pbmcKKyAgLy8vIG9wZXJhbmQgYnVuZGxlLgorICBib29sIGRhdGFPcGVyYW5kSGFzSW1wbGllZEF0dHIodW5zaWduZWQgaSwgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGRhdGFPcGVyYW5kSGFzSW1wbGllZEF0dHIoaSwgS2luZCkpOworICB9CisKKyAgLy8vIEV4dHJhY3QgdGhlIGFsaWdubWVudCBvZiB0aGUgcmV0dXJuIHZhbHVlLgorICB1bnNpZ25lZCBnZXRSZXRBbGlnbm1lbnQoKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGdldFJldEFsaWdubWVudCgpKTsKKyAgfQorCisgIC8vLyBFeHRyYWN0IHRoZSBhbGlnbm1lbnQgZm9yIGEgY2FsbCBvciBwYXJhbWV0ZXIgKDA9dW5rbm93bikuCisgIHVuc2lnbmVkIGdldFBhcmFtQWxpZ25tZW50KHVuc2lnbmVkIEFyZ05vKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGdldFBhcmFtQWxpZ25tZW50KEFyZ05vKSk7CisgIH0KKworICAvLy8gRXh0cmFjdCB0aGUgbnVtYmVyIG9mIGRlcmVmZXJlbmNlYWJsZSBieXRlcyBmb3IgYSBjYWxsIG9yIHBhcmFtZXRlcgorICAvLy8gKDA9dW5rbm93bikuCisgIHVpbnQ2NF90IGdldERlcmVmZXJlbmNlYWJsZUJ5dGVzKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoZ2V0RGVyZWZlcmVuY2VhYmxlQnl0ZXMoaSkpOworICB9CisKKyAgLy8vIEV4dHJhY3QgdGhlIG51bWJlciBvZiBkZXJlZmVyZW5jZWFibGVfb3JfbnVsbCBieXRlcyBmb3IgYSBjYWxsIG9yCisgIC8vLyBwYXJhbWV0ZXIgKDA9dW5rbm93bikuCisgIHVpbnQ2NF90IGdldERlcmVmZXJlbmNlYWJsZU9yTnVsbEJ5dGVzKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoZ2V0RGVyZWZlcmVuY2VhYmxlT3JOdWxsQnl0ZXMoaSkpOworICB9CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIG1hcmtlZCB3aXRoIE5vQWxpYXMgYXR0cmlidXRlLgorICBib29sIHJldHVybkRvZXNOb3RBbGlhcygpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIocmV0dXJuRG9lc05vdEFsaWFzKCkpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBjYWxsIHNob3VsZCBub3QgYmUgdHJlYXRlZCBhcyBhIGNhbGwgdG8gYSBidWlsdGluLgorICBib29sIGlzTm9CdWlsdGluKCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihpc05vQnVpbHRpbigpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgY2FsbCByZXF1aXJlcyBzdHJpY3QgZmxvYXRpbmcgcG9pbnQgc2VtYW50aWNzLgorICBib29sIGlzU3RyaWN0RlAoKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGlzU3RyaWN0RlAoKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGNhbGwgc2hvdWxkIG5vdCBiZSBpbmxpbmVkLgorICBib29sIGlzTm9JbmxpbmUoKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGlzTm9JbmxpbmUoKSk7CisgIH0KKyAgdm9pZCBzZXRJc05vSW5saW5lKGJvb2wgVmFsdWUgPSB0cnVlKSB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfU0VUVEVSKHNldElzTm9JbmxpbmUoVmFsdWUpKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIGNhbGwgZG9lcyBub3QgYWNjZXNzIG1lbW9yeS4KKyAgYm9vbCBkb2VzTm90QWNjZXNzTWVtb3J5KCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihkb2VzTm90QWNjZXNzTWVtb3J5KCkpOworICB9CisgIHZvaWQgc2V0RG9lc05vdEFjY2Vzc01lbW9yeSgpIHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9TRVRURVIoc2V0RG9lc05vdEFjY2Vzc01lbW9yeSgpKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIGNhbGwgZG9lcyBub3QgYWNjZXNzIG9yIG9ubHkgcmVhZHMgbWVtb3J5LgorICBib29sIG9ubHlSZWFkc01lbW9yeSgpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIob25seVJlYWRzTWVtb3J5KCkpOworICB9CisgIHZvaWQgc2V0T25seVJlYWRzTWVtb3J5KCkgeworICAgIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUihzZXRPbmx5UmVhZHNNZW1vcnkoKSk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBjYWxsIGRvZXMgbm90IGFjY2VzcyBvciBvbmx5IHdyaXRlcyBtZW1vcnkuCisgIGJvb2wgZG9lc05vdFJlYWRNZW1vcnkoKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGRvZXNOb3RSZWFkTWVtb3J5KCkpOworICB9CisgIHZvaWQgc2V0RG9lc05vdFJlYWRNZW1vcnkoKSB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfU0VUVEVSKHNldERvZXNOb3RSZWFkTWVtb3J5KCkpOworICB9CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgY2FsbCBjYW4gYWNjZXNzIG1lbW1vcnkgb25seSB1c2luZyBwb2ludGVycyBiYXNlZAorICAvLy8gb24gaXRzIGFyZ3VtZW50cy4KKyAgYm9vbCBvbmx5QWNjZXNzZXNBcmdNZW1vcnkoKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKG9ubHlBY2Nlc3Nlc0FyZ01lbW9yeSgpKTsKKyAgfQorICB2b2lkIHNldE9ubHlBY2Nlc3Nlc0FyZ01lbW9yeSgpIHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9TRVRURVIoc2V0T25seUFjY2Vzc2VzQXJnTWVtb3J5KCkpOworICB9CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgZnVuY3Rpb24gbWF5IG9ubHkgYWNjZXNzIG1lbW9yeSB0aGF0IGlzCisgIC8vLyBpbmFjY2Vzc2libGUgZnJvbSB0aGUgSVIuCisgIGJvb2wgb25seUFjY2Vzc2VzSW5hY2Nlc3NpYmxlTWVtb3J5KCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihvbmx5QWNjZXNzZXNJbmFjY2Vzc2libGVNZW1vcnkoKSk7CisgIH0KKyAgdm9pZCBzZXRPbmx5QWNjZXNzZXNJbmFjY2Vzc2libGVNZW1vcnkoKSB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfU0VUVEVSKHNldE9ubHlBY2Nlc3Nlc0luYWNjZXNzaWJsZU1lbW9yeSgpKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIGZ1bmN0aW9uIG1heSBvbmx5IGFjY2VzcyBtZW1vcnkgdGhhdCBpcworICAvLy8gZWl0aGVyIGluYWNjZXNzaWJsZSBmcm9tIHRoZSBJUiBvciBwb2ludGVkIHRvIGJ5IGl0cyBhcmd1bWVudHMuCisgIGJvb2wgb25seUFjY2Vzc2VzSW5hY2Nlc3NpYmxlTWVtT3JBcmdNZW0oKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKG9ubHlBY2Nlc3Nlc0luYWNjZXNzaWJsZU1lbU9yQXJnTWVtKCkpOworICB9CisgIHZvaWQgc2V0T25seUFjY2Vzc2VzSW5hY2Nlc3NpYmxlTWVtT3JBcmdNZW0oKSB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfU0VUVEVSKHNldE9ubHlBY2Nlc3Nlc0luYWNjZXNzaWJsZU1lbU9yQXJnTWVtKCkpOworICB9CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgY2FsbCBjYW5ub3QgcmV0dXJuLgorICBib29sIGRvZXNOb3RSZXR1cm4oKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGRvZXNOb3RSZXR1cm4oKSk7CisgIH0KKyAgdm9pZCBzZXREb2VzTm90UmV0dXJuKCkgeworICAgIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUihzZXREb2VzTm90UmV0dXJuKCkpOworICB9CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgY2FsbCBjYW5ub3QgdW53aW5kLgorICBib29sIGRvZXNOb3RUaHJvdygpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoZG9lc05vdFRocm93KCkpOworICB9CisgIHZvaWQgc2V0RG9lc05vdFRocm93KCkgeworICAgIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUihzZXREb2VzTm90VGhyb3coKSk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBjYWxsIGNhbiBiZSBkdXBsaWNhdGVkLgorICBib29sIGNhbm5vdER1cGxpY2F0ZSgpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoY2Fubm90RHVwbGljYXRlKCkpOworICB9CisgIHZvaWQgc2V0Q2Fubm90RHVwbGljYXRlKCkgeworICAgIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUihzZXRDYW5ub3REdXBsaWNhdGUoKSk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBjYWxsIGlzIGNvbnZlcmdlbnQuCisgIGJvb2wgaXNDb252ZXJnZW50KCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihpc0NvbnZlcmdlbnQoKSk7CisgIH0KKyAgdm9pZCBzZXRDb252ZXJnZW50KCkgeworICAgIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUihzZXRDb252ZXJnZW50KCkpOworICB9CisgIHZvaWQgc2V0Tm90Q29udmVyZ2VudCgpIHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9TRVRURVIoc2V0Tm90Q29udmVyZ2VudCgpKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bU9wZXJhbmRCdW5kbGVzKCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihnZXROdW1PcGVyYW5kQnVuZGxlcygpKTsKKyAgfQorCisgIGJvb2wgaGFzT3BlcmFuZEJ1bmRsZXMoKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGhhc09wZXJhbmRCdW5kbGVzKCkpOworICB9CisKKyAgdW5zaWduZWQgZ2V0QnVuZGxlT3BlcmFuZHNTdGFydEluZGV4KCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihnZXRCdW5kbGVPcGVyYW5kc1N0YXJ0SW5kZXgoKSk7CisgIH0KKworICB1bnNpZ25lZCBnZXRCdW5kbGVPcGVyYW5kc0VuZEluZGV4KCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihnZXRCdW5kbGVPcGVyYW5kc0VuZEluZGV4KCkpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtVG90YWxCdW5kbGVPcGVyYW5kcygpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoZ2V0TnVtVG90YWxCdW5kbGVPcGVyYW5kcygpKTsKKyAgfQorCisgIE9wZXJhbmRCdW5kbGVVc2UgZ2V0T3BlcmFuZEJ1bmRsZUF0KHVuc2lnbmVkIEluZGV4KSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGdldE9wZXJhbmRCdW5kbGVBdChJbmRleCkpOworICB9CisKKyAgT3B0aW9uYWw8T3BlcmFuZEJ1bmRsZVVzZT4gZ2V0T3BlcmFuZEJ1bmRsZShTdHJpbmdSZWYgTmFtZSkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihnZXRPcGVyYW5kQnVuZGxlKE5hbWUpKTsKKyAgfQorCisgIE9wdGlvbmFsPE9wZXJhbmRCdW5kbGVVc2U+IGdldE9wZXJhbmRCdW5kbGUodWludDMyX3QgSUQpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoZ2V0T3BlcmFuZEJ1bmRsZShJRCkpOworICB9CisKKyAgdW5zaWduZWQgY291bnRPcGVyYW5kQnVuZGxlc09mVHlwZSh1aW50MzJfdCBJRCkgY29uc3QgeworICAgIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUihjb3VudE9wZXJhbmRCdW5kbGVzT2ZUeXBlKElEKSk7CisgIH0KKworICBib29sIGlzQnVuZGxlT3BlcmFuZCh1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoaXNCdW5kbGVPcGVyYW5kKElkeCkpOworICB9CisKKyAgSXRlclR5IGFyZ19iZWdpbigpIGNvbnN0IHsKKyAgICBDQUxMU0lURV9ERUxFR0FURV9HRVRURVIoYXJnX2JlZ2luKCkpOworICB9CisKKyAgSXRlclR5IGFyZ19lbmQoKSBjb25zdCB7CisgICAgQ0FMTFNJVEVfREVMRUdBVEVfR0VUVEVSKGFyZ19lbmQoKSk7CisgIH0KKworI3VuZGVmIENBTExTSVRFX0RFTEVHQVRFX0dFVFRFUgorI3VuZGVmIENBTExTSVRFX0RFTEVHQVRFX1NFVFRFUgorCisgIHZvaWQgZ2V0T3BlcmFuZEJ1bmRsZXNBc0RlZnMoU21hbGxWZWN0b3JJbXBsPE9wZXJhbmRCdW5kbGVEZWY+ICZEZWZzKSBjb25zdCB7CisgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKklJID0gZ2V0SW5zdHJ1Y3Rpb24oKTsKKyAgICAvLyBTaW5jZSB0aGlzIGlzIGFjdHVhbGx5IGEgZ2V0dGVyIHRoYXQgImxvb2tzIGxpa2UiIGEgc2V0dGVyLCBkb24ndCB1c2UgdGhlCisgICAgLy8gYWJvdmUgbWFjcm9zIHRvIGF2b2lkIGNvbmZ1c2lvbi4KKyAgICBpZiAoaXNDYWxsKCkpCisgICAgICBjYXN0PENhbGxJbnN0PihJSSktPmdldE9wZXJhbmRCdW5kbGVzQXNEZWZzKERlZnMpOworICAgIGVsc2UKKyAgICAgIGNhc3Q8SW52b2tlSW5zdD4oSUkpLT5nZXRPcGVyYW5kQnVuZGxlc0FzRGVmcyhEZWZzKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGlzIGRhdGEgb3BlcmFuZCBpcyBub3QgY2FwdHVyZWQuCisgIGJvb2wgZG9lc05vdENhcHR1cmUodW5zaWduZWQgT3BObykgY29uc3QgeworICAgIHJldHVybiBkYXRhT3BlcmFuZEhhc0ltcGxpZWRBdHRyKE9wTm8gKyAxLCBBdHRyaWJ1dGU6Ok5vQ2FwdHVyZSk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBhcmd1bWVudCBpcyBwYXNzZWQgYnkgdmFsdWUuCisgIGJvb2wgaXNCeVZhbEFyZ3VtZW50KHVuc2lnbmVkIEFyZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIHBhcmFtSGFzQXR0cihBcmdObywgQXR0cmlidXRlOjpCeVZhbCk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBhcmd1bWVudCBpcyBwYXNzZWQgaW4gYW4gYWxsb2NhLgorICBib29sIGlzSW5BbGxvY2FBcmd1bWVudCh1bnNpZ25lZCBBcmdObykgY29uc3QgeworICAgIHJldHVybiBwYXJhbUhhc0F0dHIoQXJnTm8sIEF0dHJpYnV0ZTo6SW5BbGxvY2EpOworICB9CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgYXJndW1lbnQgaXMgcGFzc2VkIGJ5IHZhbHVlIG9yIGluIGFuIGFsbG9jYS4KKyAgYm9vbCBpc0J5VmFsT3JJbkFsbG9jYUFyZ3VtZW50KHVuc2lnbmVkIEFyZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIHBhcmFtSGFzQXR0cihBcmdObywgQXR0cmlidXRlOjpCeVZhbCkgfHwKKyAgICAgICAgICAgcGFyYW1IYXNBdHRyKEFyZ05vLCBBdHRyaWJ1dGU6OkluQWxsb2NhKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlcmUgYXJlIGlzIGFuIGluYWxsb2NhIGFyZ3VtZW50LiBPbmx5IHRoZSBsYXN0IGFyZ3VtZW50IGNhbgorICAvLy8gaGF2ZSB0aGUgaW5hbGxvY2EgYXR0cmlidXRlLgorICBib29sIGhhc0luQWxsb2NhQXJndW1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuICFhcmdfZW1wdHkoKSAmJiBwYXJhbUhhc0F0dHIoYXJnX3NpemUoKSAtIDEsIEF0dHJpYnV0ZTo6SW5BbGxvY2EpOworICB9CisKKyAgYm9vbCBkb2VzTm90QWNjZXNzTWVtb3J5KHVuc2lnbmVkIE9wTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gZGF0YU9wZXJhbmRIYXNJbXBsaWVkQXR0cihPcE5vICsgMSwgQXR0cmlidXRlOjpSZWFkTm9uZSk7CisgIH0KKworICBib29sIG9ubHlSZWFkc01lbW9yeSh1bnNpZ25lZCBPcE5vKSBjb25zdCB7CisgICAgcmV0dXJuIGRhdGFPcGVyYW5kSGFzSW1wbGllZEF0dHIoT3BObyArIDEsIEF0dHJpYnV0ZTo6UmVhZE9ubHkpIHx8CisgICAgICAgICAgIGRhdGFPcGVyYW5kSGFzSW1wbGllZEF0dHIoT3BObyArIDEsIEF0dHJpYnV0ZTo6UmVhZE5vbmUpOworICB9CisKKyAgYm9vbCBkb2VzTm90UmVhZE1lbW9yeSh1bnNpZ25lZCBPcE5vKSBjb25zdCB7CisgICAgcmV0dXJuIGRhdGFPcGVyYW5kSGFzSW1wbGllZEF0dHIoT3BObyArIDEsIEF0dHJpYnV0ZTo6V3JpdGVPbmx5KSB8fAorICAgICAgICAgICBkYXRhT3BlcmFuZEhhc0ltcGxpZWRBdHRyKE9wTm8gKyAxLCBBdHRyaWJ1dGU6OlJlYWROb25lKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgcmV0dXJuIHZhbHVlIGlzIGtub3duIHRvIGJlIG5vdCBudWxsLgorICAvLy8gVGhpcyBtYXkgYmUgYmVjYXVzZSBpdCBoYXMgdGhlIG5vbm51bGwgYXR0cmlidXRlLCBvciBiZWNhdXNlIGF0IGxlYXN0CisgIC8vLyBvbmUgYnl0ZSBpcyBkZXJlZmVyZW5jZWFibGUgYW5kIHRoZSBwb2ludGVyIGlzIGluIGFkZHJzcGFjZSgwKS4KKyAgYm9vbCBpc1JldHVybk5vbk51bGwoKSBjb25zdCB7CisgICAgaWYgKGhhc1JldEF0dHIoQXR0cmlidXRlOjpOb25OdWxsKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGVsc2UgaWYgKGdldERlcmVmZXJlbmNlYWJsZUJ5dGVzKEF0dHJpYnV0ZUxpc3Q6OlJldHVybkluZGV4KSA+IDAgJiYKKyAgICAgICAgICAgICBnZXRUeXBlKCktPmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKSA9PSAwKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgQ2FsbFNpdGUgcGFzc2VzIHRoZSBnaXZlbiBWYWx1ZSogYXMgYW4gYXJndW1lbnQgdG8KKyAgLy8vIHRoZSBjYWxsZWQgZnVuY3Rpb24uCisgIGJvb2wgaGFzQXJndW1lbnQoY29uc3QgVmFsdWUgKkFyZykgY29uc3QgeworICAgIGZvciAoYXJnX2l0ZXJhdG9yIEFJID0gdGhpcy0+YXJnX2JlZ2luKCksIEUgPSB0aGlzLT5hcmdfZW5kKCk7IEFJICE9IEU7CisgICAgICAgICArK0FJKQorICAgICAgaWYgKEFJLT5nZXQoKSA9PSBBcmcpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCitwcml2YXRlOgorICBJdGVyVHkgZ2V0Q2FsbGVlKCkgY29uc3QgeworICAgIGlmIChpc0NhbGwoKSkgLy8gU2tpcCBDYWxsZWUKKyAgICAgIHJldHVybiBjYXN0PENhbGxJbnN0PihnZXRJbnN0cnVjdGlvbigpKS0+b3BfZW5kKCkgLSAxOworICAgIGVsc2UgLy8gU2tpcCBCQiwgQkIsIENhbGxlZQorICAgICAgcmV0dXJuIGNhc3Q8SW52b2tlSW5zdD4oZ2V0SW5zdHJ1Y3Rpb24oKSktPm9wX2VuZCgpIC0gMzsKKyAgfQorfTsKKworY2xhc3MgQ2FsbFNpdGUgOiBwdWJsaWMgQ2FsbFNpdGVCYXNlPEZ1bmN0aW9uLCBCYXNpY0Jsb2NrLCBWYWx1ZSwgVXNlciwgVXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uLCBDYWxsSW5zdCwgSW52b2tlSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VyOjpvcF9pdGVyYXRvcj4geworcHVibGljOgorICBDYWxsU2l0ZSgpID0gZGVmYXVsdDsKKyAgQ2FsbFNpdGUoQ2FsbFNpdGVCYXNlIEIpIDogQ2FsbFNpdGVCYXNlKEIpIHt9CisgIENhbGxTaXRlKENhbGxJbnN0ICpDSSkgOiBDYWxsU2l0ZUJhc2UoQ0kpIHt9CisgIENhbGxTaXRlKEludm9rZUluc3QgKklJKSA6IENhbGxTaXRlQmFzZShJSSkge30KKyAgZXhwbGljaXQgQ2FsbFNpdGUoSW5zdHJ1Y3Rpb24gKklJKSA6IENhbGxTaXRlQmFzZShJSSkge30KKyAgZXhwbGljaXQgQ2FsbFNpdGUoVmFsdWUgKlYpIDogQ2FsbFNpdGVCYXNlKFYpIHt9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENhbGxTaXRlICZDUykgY29uc3QgeyByZXR1cm4gSSA9PSBDUy5JOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDYWxsU2l0ZSAmQ1MpIGNvbnN0IHsgcmV0dXJuIEkgIT0gQ1MuSTsgfQorICBib29sIG9wZXJhdG9yPChjb25zdCBDYWxsU2l0ZSAmQ1MpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SW5zdHJ1Y3Rpb24oKSA8IENTLmdldEluc3RydWN0aW9uKCk7CisgIH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIHN0cnVjdCBEZW5zZU1hcEluZm88Q2FsbFNpdGU+OworCisgIFVzZXI6Om9wX2l0ZXJhdG9yIGdldENhbGxlZSgpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IERlbnNlTWFwSW5mbzxDYWxsU2l0ZT4geworICB1c2luZyBCYXNlSW5mbyA9IERlbnNlTWFwSW5mbzxkZWNsdHlwZShDYWxsU2l0ZTo6SSk+OworCisgIHN0YXRpYyBDYWxsU2l0ZSBnZXRFbXB0eUtleSgpIHsKKyAgICBDYWxsU2l0ZSBDUzsKKyAgICBDUy5JID0gQmFzZUluZm86OmdldEVtcHR5S2V5KCk7CisgICAgcmV0dXJuIENTOworICB9CisKKyAgc3RhdGljIENhbGxTaXRlIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICBDYWxsU2l0ZSBDUzsKKyAgICBDUy5JID0gQmFzZUluZm86OmdldFRvbWJzdG9uZUtleSgpOworICAgIHJldHVybiBDUzsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgQ2FsbFNpdGUgJkNTKSB7CisgICAgcmV0dXJuIEJhc2VJbmZvOjpnZXRIYXNoVmFsdWUoQ1MuSSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IENhbGxTaXRlICZMSFMsIGNvbnN0IENhbGxTaXRlICZSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKKworLy8vIEVzdGFibGlzaCBhIHZpZXcgdG8gYSBjYWxsIHNpdGUgZm9yIGV4YW1pbmF0aW9uLgorY2xhc3MgSW1tdXRhYmxlQ2FsbFNpdGUgOiBwdWJsaWMgQ2FsbFNpdGVCYXNlPD4geworcHVibGljOgorICBJbW11dGFibGVDYWxsU2l0ZSgpID0gZGVmYXVsdDsKKyAgSW1tdXRhYmxlQ2FsbFNpdGUoY29uc3QgQ2FsbEluc3QgKkNJKSA6IENhbGxTaXRlQmFzZShDSSkge30KKyAgSW1tdXRhYmxlQ2FsbFNpdGUoY29uc3QgSW52b2tlSW5zdCAqSUkpIDogQ2FsbFNpdGVCYXNlKElJKSB7fQorICBleHBsaWNpdCBJbW11dGFibGVDYWxsU2l0ZShjb25zdCBJbnN0cnVjdGlvbiAqSUkpIDogQ2FsbFNpdGVCYXNlKElJKSB7fQorICBleHBsaWNpdCBJbW11dGFibGVDYWxsU2l0ZShjb25zdCBWYWx1ZSAqVikgOiBDYWxsU2l0ZUJhc2UoVikge30KKyAgSW1tdXRhYmxlQ2FsbFNpdGUoQ2FsbFNpdGUgQ1MpIDogQ2FsbFNpdGVCYXNlKENTLmdldEluc3RydWN0aW9uKCkpIHt9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9DQUxMU0lURV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0NhbGxpbmdDb252LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0NhbGxpbmdDb252LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRmZTgzNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQ2FsbGluZ0NvbnYuaApAQCAtMCwwICsxLDIzMSBAQAorLy89PT0tIGxsdm0vQ2FsbGluZ0NvbnYuaCAtIExMVk0gQ2FsbGluZyBDb252ZW50aW9ucyAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBMTFZNJ3Mgc2V0IG9mIGNhbGxpbmcgY29udmVudGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0NBTExJTkdDT05WX0gKKyNkZWZpbmUgTExWTV9JUl9DQUxMSU5HQ09OVl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIENhbGxpbmdDb252IE5hbWVzcGFjZSAtIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIGFuIGVudW0gd2l0aCBhIHZhbHVlIGZvcgorLy8vIHRoZSB3ZWxsLWtub3duIGNhbGxpbmcgY29udmVudGlvbnMuCisvLy8KK25hbWVzcGFjZSBDYWxsaW5nQ29udiB7CisKKyAgLy8vIExMVk0gSVIgYWxsb3dzIHRvIHVzZSBhcmJpdHJhcnkgbnVtYmVycyBhcyBjYWxsaW5nIGNvbnZlbnRpb24gaWRlbnRpZmllcnMuCisgIHVzaW5nIElEID0gdW5zaWduZWQ7CisKKyAgLy8vIEEgc2V0IG9mIGVudW1zIHdoaWNoIHNwZWNpZnkgdGhlIGFzc2lnbmVkIG51bWVyaWMgdmFsdWVzIGZvciBrbm93biBsbHZtCisgIC8vLyBjYWxsaW5nIGNvbnZlbnRpb25zLgorICAvLy8gQGJyaWVmIExMVk0gQ2FsbGluZyBDb252ZW50aW9uIFJlcHJlc2VudGF0aW9uCisgIGVudW0geworICAgIC8vLyBDIC0gVGhlIGRlZmF1bHQgbGx2bSBjYWxsaW5nIGNvbnZlbnRpb24sIGNvbXBhdGlibGUgd2l0aCBDLiAgVGhpcworICAgIC8vLyBjb252ZW50aW9uIGlzIHRoZSBvbmx5IGNhbGxpbmcgY29udmVudGlvbiB0aGF0IHN1cHBvcnRzIHZhcmFyZ3MgY2FsbHMuCisgICAgLy8vIEFzIHdpdGggdHlwaWNhbCBDIGNhbGxpbmcgY29udmVudGlvbnMsIHRoZSBjYWxsZWUvY2FsbGVyIGhhdmUgdG8KKyAgICAvLy8gdG9sZXJhdGUgY2VydGFpbiBhbW91bnRzIG9mIHByb3RvdHlwZSBtaXNtYXRjaC4KKyAgICBDID0gMCwKKworICAgIC8vIEdlbmVyaWMgTExWTSBjYWxsaW5nIGNvbnZlbnRpb25zLiAgTm9uZSBvZiB0aGVzZSBjYWxsaW5nIGNvbnZlbnRpb25zCisgICAgLy8gc3VwcG9ydCB2YXJhcmdzIGNhbGxzLCBhbmQgYWxsIGFzc3VtZSB0aGF0IHRoZSBjYWxsZXIgYW5kIGNhbGxlZQorICAgIC8vIHByb3RvdHlwZSBleGFjdGx5IG1hdGNoLgorCisgICAgLy8vIEZhc3QgLSBUaGlzIGNhbGxpbmcgY29udmVudGlvbiBhdHRlbXB0cyB0byBtYWtlIGNhbGxzIGFzIGZhc3QgYXMKKyAgICAvLy8gcG9zc2libGUgKGUuZy4gYnkgcGFzc2luZyB0aGluZ3MgaW4gcmVnaXN0ZXJzKS4KKyAgICBGYXN0ID0gOCwKKworICAgIC8vIENvbGQgLSBUaGlzIGNhbGxpbmcgY29udmVudGlvbiBhdHRlbXB0cyB0byBtYWtlIGNvZGUgaW4gdGhlIGNhbGxlciBhcworICAgIC8vIGVmZmljaWVudCBhcyBwb3NzaWJsZSB1bmRlciB0aGUgYXNzdW1wdGlvbiB0aGF0IHRoZSBjYWxsIGlzIG5vdCBjb21tb25seQorICAgIC8vIGV4ZWN1dGVkLiAgQXMgc3VjaCwgdGhlc2UgY2FsbHMgb2Z0ZW4gcHJlc2VydmUgYWxsIHJlZ2lzdGVycyBzbyB0aGF0IHRoZQorICAgIC8vIGNhbGwgZG9lcyBub3QgYnJlYWsgYW55IGxpdmUgcmFuZ2VzIGluIHRoZSBjYWxsZXIgc2lkZS4KKyAgICBDb2xkID0gOSwKKworICAgIC8vIEdIQyAtIENhbGxpbmcgY29udmVudGlvbiB1c2VkIGJ5IHRoZSBHbGFzZ293IEhhc2tlbGwgQ29tcGlsZXIgKEdIQykuCisgICAgR0hDID0gMTAsCisKKyAgICAvLyBIaVBFIC0gQ2FsbGluZyBjb252ZW50aW9uIHVzZWQgYnkgdGhlIEhpZ2gtUGVyZm9ybWFuY2UgRXJsYW5nIENvbXBpbGVyCisgICAgLy8gKEhpUEUpLgorICAgIEhpUEUgPSAxMSwKKworICAgIC8vIFdlYktpdCBKUyAtIENhbGxpbmcgY29udmVudGlvbiBmb3Igc3RhY2sgYmFzZWQgSmF2YVNjcmlwdCBjYWxscworICAgIFdlYktpdF9KUyA9IDEyLAorCisgICAgLy8gQW55UmVnIC0gQ2FsbGluZyBjb252ZW50aW9uIGZvciBkeW5hbWljIHJlZ2lzdGVyIGJhc2VkIGNhbGxzIChlLmcuCisgICAgLy8gc3RhY2ttYXAgYW5kIHBhdGNocG9pbnQgaW50cmluc2ljcykuCisgICAgQW55UmVnID0gMTMsCisKKyAgICAvLyBQcmVzZXJ2ZU1vc3QgLSBDYWxsaW5nIGNvbnZlbnRpb24gZm9yIHJ1bnRpbWUgY2FsbHMgdGhhdCBwcmVzZXJ2ZXMgbW9zdAorICAgIC8vIHJlZ2lzdGVycy4KKyAgICBQcmVzZXJ2ZU1vc3QgPSAxNCwKKworICAgIC8vIFByZXNlcnZlQWxsIC0gQ2FsbGluZyBjb252ZW50aW9uIGZvciBydW50aW1lIGNhbGxzIHRoYXQgcHJlc2VydmVzCisgICAgLy8gKGFsbW9zdCkgYWxsIHJlZ2lzdGVycy4KKyAgICBQcmVzZXJ2ZUFsbCA9IDE1LAorCisgICAgLy8gU3dpZnQgLSBDYWxsaW5nIGNvbnZlbnRpb24gZm9yIFN3aWZ0LgorICAgIFN3aWZ0ID0gMTYsCisKKyAgICAvLyBDWFhfRkFTVF9UTFMgLSBDYWxsaW5nIGNvbnZlbnRpb24gZm9yIGFjY2VzcyBmdW5jdGlvbnMuCisgICAgQ1hYX0ZBU1RfVExTID0gMTcsCisKKyAgICAvLyBUYXJnZXQgLSBUaGlzIGlzIHRoZSBzdGFydCBvZiB0aGUgdGFyZ2V0LXNwZWNpZmljIGNhbGxpbmcgY29udmVudGlvbnMsCisgICAgLy8gZS5nLiBmYXN0Y2FsbCBhbmQgdGhpc2NhbGwgb24gWDg2LgorICAgIEZpcnN0VGFyZ2V0Q0MgPSA2NCwKKworICAgIC8vLyBYODZfU3RkQ2FsbCAtIHN0ZGNhbGwgaXMgdGhlIGNhbGxpbmcgY29udmVudGlvbnMgbW9zdGx5IHVzZWQgYnkgdGhlCisgICAgLy8vIFdpbjMyIEFQSS4gSXQgaXMgYmFzaWNhbGx5IHRoZSBzYW1lIGFzIHRoZSBDIGNvbnZlbnRpb24gd2l0aCB0aGUKKyAgICAvLy8gZGlmZmVyZW5jZSBpbiB0aGF0IHRoZSBjYWxsZWUgaXMgcmVzcG9uc2libGUgZm9yIHBvcHBpbmcgdGhlIGFyZ3VtZW50cworICAgIC8vLyBmcm9tIHRoZSBzdGFjay4KKyAgICBYODZfU3RkQ2FsbCA9IDY0LAorCisgICAgLy8vIFg4Nl9GYXN0Q2FsbCAtICdmYXN0JyBhbmFsb2cgb2YgWDg2X1N0ZENhbGwuIFBhc3NlcyBmaXJzdCB0d28gYXJndW1lbnRzCisgICAgLy8vIGluIEVDWDpFRFggcmVnaXN0ZXJzLCBvdGhlcnMgLSB2aWEgc3RhY2suIENhbGxlZSBpcyByZXNwb25zaWJsZSBmb3IKKyAgICAvLy8gc3RhY2sgY2xlYW5pbmcuCisgICAgWDg2X0Zhc3RDYWxsID0gNjUsCisKKyAgICAvLy8gQVJNX0FQQ1MgLSBBUk0gUHJvY2VkdXJlIENhbGxpbmcgU3RhbmRhcmQgY2FsbGluZyBjb252ZW50aW9uIChvYnNvbGV0ZSwKKyAgICAvLy8gYnV0IHN0aWxsIHVzZWQgb24gc29tZSB0YXJnZXRzKS4KKyAgICBBUk1fQVBDUyA9IDY2LAorCisgICAgLy8vIEFSTV9BQVBDUyAtIEFSTSBBcmNoaXRlY3R1cmUgUHJvY2VkdXJlIENhbGxpbmcgU3RhbmRhcmQgY2FsbGluZworICAgIC8vLyBjb252ZW50aW9uIChha2EgRUFCSSkuIFNvZnQgZmxvYXQgdmFyaWFudC4KKyAgICBBUk1fQUFQQ1MgPSA2NywKKworICAgIC8vLyBBUk1fQUFQQ1NfVkZQIC0gU2FtZSBhcyBBUk1fQUFQQ1MsIGJ1dCB1c2VzIGhhcmQgZmxvYXRpbmcgcG9pbnQgQUJJLgorICAgIEFSTV9BQVBDU19WRlAgPSA2OCwKKworICAgIC8vLyBNU1A0MzBfSU5UUiAtIENhbGxpbmcgY29udmVudGlvbiB1c2VkIGZvciBNU1A0MzAgaW50ZXJydXB0IHJvdXRpbmVzLgorICAgIE1TUDQzMF9JTlRSID0gNjksCisKKyAgICAvLy8gWDg2X1RoaXNDYWxsIC0gU2ltaWxhciB0byBYODZfU3RkQ2FsbC4gUGFzc2VzIGZpcnN0IGFyZ3VtZW50IGluIEVDWCwKKyAgICAvLy8gb3RoZXJzIHZpYSBzdGFjay4gQ2FsbGVlIGlzIHJlc3BvbnNpYmxlIGZvciBzdGFjayBjbGVhbmluZy4gTVNWQyB1c2VzCisgICAgLy8vIHRoaXMgYnkgZGVmYXVsdCBmb3IgbWV0aG9kcyBpbiBpdHMgQUJJLgorICAgIFg4Nl9UaGlzQ2FsbCA9IDcwLAorCisgICAgLy8vIFBUWF9LZXJuZWwgLSBDYWxsIHRvIGEgUFRYIGtlcm5lbC4KKyAgICAvLy8gUGFzc2VzIGFsbCBhcmd1bWVudHMgaW4gcGFyYW1ldGVyIHNwYWNlLgorICAgIFBUWF9LZXJuZWwgPSA3MSwKKworICAgIC8vLyBQVFhfRGV2aWNlIC0gQ2FsbCB0byBhIFBUWCBkZXZpY2UgZnVuY3Rpb24uCisgICAgLy8vIFBhc3NlcyBhbGwgYXJndW1lbnRzIGluIHJlZ2lzdGVyIG9yIHBhcmFtZXRlciBzcGFjZS4KKyAgICBQVFhfRGV2aWNlID0gNzIsCisKKyAgICAvLy8gU1BJUl9GVU5DIC0gQ2FsbGluZyBjb252ZW50aW9uIGZvciBTUElSIG5vbi1rZXJuZWwgZGV2aWNlIGZ1bmN0aW9ucy4KKyAgICAvLy8gTm8gbG93ZXJpbmcgb3IgZXhwYW5zaW9uIG9mIGFyZ3VtZW50cy4KKyAgICAvLy8gU3RydWN0dXJlcyBhcmUgcGFzc2VkIGFzIGEgcG9pbnRlciB0byBhIHN0cnVjdCB3aXRoIHRoZSBieXZhbCBhdHRyaWJ1dGUuCisgICAgLy8vIEZ1bmN0aW9ucyBjYW4gb25seSBjYWxsIFNQSVJfRlVOQyBhbmQgU1BJUl9LRVJORUwgZnVuY3Rpb25zLgorICAgIC8vLyBGdW5jdGlvbnMgY2FuIG9ubHkgaGF2ZSB6ZXJvIG9yIG9uZSByZXR1cm4gdmFsdWVzLgorICAgIC8vLyBWYXJpYWJsZSBhcmd1bWVudHMgYXJlIG5vdCBhbGxvd2VkLCBleGNlcHQgZm9yIHByaW50Zi4KKyAgICAvLy8gSG93IGFyZ3VtZW50cy9yZXR1cm4gdmFsdWVzIGFyZSBsb3dlcmVkIGFyZSBub3Qgc3BlY2lmaWVkLgorICAgIC8vLyBGdW5jdGlvbnMgYXJlIG9ubHkgdmlzaWJsZSB0byB0aGUgZGV2aWNlcy4KKyAgICBTUElSX0ZVTkMgPSA3NSwKKworICAgIC8vLyBTUElSX0tFUk5FTCAtIENhbGxpbmcgY29udmVudGlvbiBmb3IgU1BJUiBrZXJuZWwgZnVuY3Rpb25zLgorICAgIC8vLyBJbmhlcml0cyB0aGUgcmVzdHJpY3Rpb25zIG9mIFNQSVJfRlVOQywgZXhjZXB0CisgICAgLy8vIENhbm5vdCBoYXZlIG5vbi12b2lkIHJldHVybiB2YWx1ZXMuCisgICAgLy8vIENhbm5vdCBoYXZlIHZhcmlhYmxlIGFyZ3VtZW50cy4KKyAgICAvLy8gQ2FuIGFsc28gYmUgY2FsbGVkIGJ5IHRoZSBob3N0LgorICAgIC8vLyBJcyBleHRlcm5hbGx5IHZpc2libGUuCisgICAgU1BJUl9LRVJORUwgPSA3NiwKKworICAgIC8vLyBJbnRlbF9PQ0xfQkkgLSBDYWxsaW5nIGNvbnZlbnRpb25zIGZvciBJbnRlbCBPcGVuQ0wgYnVpbHQtaW5zCisgICAgSW50ZWxfT0NMX0JJID0gNzcsCisKKyAgICAvLy8gXGJyaWVmIFRoZSBDIGNvbnZlbnRpb24gYXMgc3BlY2lmaWVkIGluIHRoZSB4ODYtNjQgc3VwcGxlbWVudCB0byB0aGUKKyAgICAvLy8gU3lzdGVtIFYgQUJJLCB1c2VkIG9uIG1vc3Qgbm9uLVdpbmRvd3Mgc3lzdGVtcy4KKyAgICBYODZfNjRfU3lzViA9IDc4LAorCisgICAgLy8vIFxicmllZiBUaGUgQyBjb252ZW50aW9uIGFzIGltcGxlbWVudGVkIG9uIFdpbmRvd3MveDg2LTY0IGFuZAorICAgIC8vLyBBQXJjaDY0LiBUaGlzIGNvbnZlbnRpb24gZGlmZmVycyBmcm9tIHRoZSBtb3JlIGNvbW1vbgorICAgIC8vLyBcYyBYODZfNjRfU3lzViBjb252ZW50aW9uIGluIGEgbnVtYmVyIG9mIHdheXMsIG1vc3Qgbm90YWJseSBpbgorICAgIC8vLyB0aGF0IFhNTSByZWdpc3RlcnMgdXNlZCB0byBwYXNzIGFyZ3VtZW50cyBhcmUgc2hhZG93ZWQgYnkgR1BScywKKyAgICAvLy8gYW5kIHZpY2UgdmVyc2EuCisgICAgLy8vIE9uIEFBcmNoNjQsIHRoaXMgaXMgaWRlbnRpY2FsIHRvIHRoZSBub3JtYWwgQyAoQUFQQ1MpIGNhbGxpbmcKKyAgICAvLy8gY29udmVudGlvbiBmb3Igbm9ybWFsIGZ1bmN0aW9ucywgYnV0IGZsb2F0cyBhcmUgcGFzc2VkIGluIGludGVnZXIKKyAgICAvLy8gcmVnaXN0ZXJzIHRvIHZhcmlhZGljIGZ1bmN0aW9ucy4KKyAgICBXaW42NCA9IDc5LAorCisgICAgLy8vIFxicmllZiBNU1ZDIGNhbGxpbmcgY29udmVudGlvbiB0aGF0IHBhc3NlcyB2ZWN0b3JzIGFuZCB2ZWN0b3IgYWdncmVnYXRlcworICAgIC8vLyBpbiBTU0UgcmVnaXN0ZXJzLgorICAgIFg4Nl9WZWN0b3JDYWxsID0gODAsCisKKyAgICAvLy8gXGJyaWVmIENhbGxpbmcgY29udmVudGlvbiB1c2VkIGJ5IEhpcEhvcCBWaXJ0dWFsIE1hY2hpbmUgKEhIVk0pIHRvCisgICAgLy8vIHBlcmZvcm0gY2FsbHMgdG8gYW5kIGZyb20gdHJhbnNsYXRpb24gY2FjaGUsIGFuZCBmb3IgY2FsbGluZyBQSFAKKyAgICAvLy8gZnVuY3Rpb25zLgorICAgIC8vLyBISFZNIGNhbGxpbmcgY29udmVudGlvbiBzdXBwb3J0cyB0YWlsL3NpYmxpbmcgY2FsbCBlbGltaW5hdGlvbi4KKyAgICBISFZNID0gODEsCisKKyAgICAvLy8gXGJyaWVmIEhIVk0gY2FsbGluZyBjb252ZW50aW9uIGZvciBpbnZva2luZyBDL0MrKyBoZWxwZXJzLgorICAgIEhIVk1fQyA9IDgyLAorCisgICAgLy8vIFg4Nl9JTlRSIC0geDg2IGhhcmR3YXJlIGludGVycnVwdCBjb250ZXh0LiBDYWxsZWUgbWF5IHRha2Ugb25lIG9yIHR3bworICAgIC8vLyBwYXJhbWV0ZXJzLCB3aGVyZSB0aGUgMXN0IHJlcHJlc2VudHMgYSBwb2ludGVyIHRvIGhhcmR3YXJlIGNvbnRleHQgZnJhbWUKKyAgICAvLy8gYW5kIHRoZSAybmQgcmVwcmVzZW50cyBoYXJkd2FyZSBlcnJvciBjb2RlLCB0aGUgcHJlc2VuY2Ugb2YgdGhlIGxhdGVyCisgICAgLy8vIGRlcGVuZHMgb24gdGhlIGludGVycnVwdCB2ZWN0b3IgdGFrZW4uIFZhbGlkIGZvciBib3RoIDMyLSBhbmQgNjQtYml0CisgICAgLy8vIHN1YnRhcmdldHMuCisgICAgWDg2X0lOVFIgPSA4MywKKworICAgIC8vLyBVc2VkIGZvciBBVlIgaW50ZXJydXB0IHJvdXRpbmVzLgorICAgIEFWUl9JTlRSID0gODQsCisKKyAgICAvLy8gQ2FsbGluZyBjb252ZW50aW9uIHVzZWQgZm9yIEFWUiBzaWduYWwgcm91dGluZXMuCisgICAgQVZSX1NJR05BTCA9IDg1LAorCisgICAgLy8vIENhbGxpbmcgY29udmVudGlvbiB1c2VkIGZvciBzcGVjaWFsIEFWUiBydGxpYiBmdW5jdGlvbnMKKyAgICAvLy8gd2hpY2ggaGF2ZSBhbiAib3B0aW1pemVkIiBjb252ZW50aW9uIHRvIHByZXNlcnZlIHJlZ2lzdGVycy4KKyAgICBBVlJfQlVJTFRJTiA9IDg2LAorCisgICAgLy8vIENhbGxpbmcgY29udmVudGlvbiB1c2VkIGZvciBNZXNhIHZlcnRleCBzaGFkZXJzLCBvciBBTURQQUwgbGFzdCBzaGFkZXIKKyAgICAvLy8gc3RhZ2UgYmVmb3JlIHJhc3Rlcml6YXRpb24gKHZlcnRleCBzaGFkZXIgaWYgdGVzc2VsbGF0aW9uIGFuZCBnZW9tZXRyeQorICAgIC8vLyBhcmUgbm90IGluIHVzZSwgb3Igb3RoZXJ3aXNlIGNvcHkgc2hhZGVyIGlmIG9uZSBpcyBuZWVkZWQpLgorICAgIEFNREdQVV9WUyA9IDg3LAorCisgICAgLy8vIENhbGxpbmcgY29udmVudGlvbiB1c2VkIGZvciBNZXNhL0FNRFBBTCBnZW9tZXRyeSBzaGFkZXJzLgorICAgIEFNREdQVV9HUyA9IDg4LAorCisgICAgLy8vIENhbGxpbmcgY29udmVudGlvbiB1c2VkIGZvciBNZXNhL0FNRFBBTCBwaXhlbCBzaGFkZXJzLgorICAgIEFNREdQVV9QUyA9IDg5LAorCisgICAgLy8vIENhbGxpbmcgY29udmVudGlvbiB1c2VkIGZvciBNZXNhL0FNRFBBTCBjb21wdXRlIHNoYWRlcnMuCisgICAgQU1ER1BVX0NTID0gOTAsCisKKyAgICAvLy8gQ2FsbGluZyBjb252ZW50aW9uIGZvciBBTURHUFUgY29kZSBvYmplY3Qga2VybmVscy4KKyAgICBBTURHUFVfS0VSTkVMID0gOTEsCisKKyAgICAvLy8gUmVnaXN0ZXIgY2FsbGluZyBjb252ZW50aW9uIHVzZWQgZm9yIHBhcmFtZXRlcnMgdHJhbnNmZXIgb3B0aW1pemF0aW9uCisgICAgWDg2X1JlZ0NhbGwgPSA5MiwKKworICAgIC8vLyBDYWxsaW5nIGNvbnZlbnRpb24gdXNlZCBmb3IgTWVzYS9BTURQQUwgaHVsbCBzaGFkZXJzICg9IHRlc3NlbGxhdGlvbgorICAgIC8vLyBjb250cm9sIHNoYWRlcnMpLgorICAgIEFNREdQVV9IUyA9IDkzLAorCisgICAgLy8vIENhbGxpbmcgY29udmVudGlvbiB1c2VkIGZvciBzcGVjaWFsIE1TUDQzMCBydGxpYiBmdW5jdGlvbnMKKyAgICAvLy8gd2hpY2ggaGF2ZSBhbiAib3B0aW1pemVkIiBjb252ZW50aW9uIHVzaW5nIGFkZGl0aW9uYWwgcmVnaXN0ZXJzLgorICAgIE1TUDQzMF9CVUlMVElOID0gOTQsCisKKyAgICAvLy8gQ2FsbGluZyBjb252ZW50aW9uIHVzZWQgZm9yIEFNRFBBTCB2ZXJ0ZXggc2hhZGVyIGlmIHRlc3NlbGxhdGlvbiBpcyBpbgorICAgIC8vLyB1c2UuCisgICAgQU1ER1BVX0xTID0gOTUsCisKKyAgICAvLy8gQ2FsbGluZyBjb252ZW50aW9uIHVzZWQgZm9yIEFNRFBBTCBzaGFkZXIgc3RhZ2UgYmVmb3JlIGdlb21ldHJ5IHNoYWRlcgorICAgIC8vLyBpZiBnZW9tZXRyeSBpcyBpbiB1c2UuIFNvIGVpdGhlciB0aGUgZG9tYWluICg9IHRlc3NlbGxhdGlvbiBldmFsdWF0aW9uKQorICAgIC8vLyBzaGFkZXIgaWYgdGVzc2VsbGF0aW9uIGlzIGluIHVzZSwgb3Igb3RoZXJ3aXNlIHRoZSB2ZXJ0ZXggc2hhZGVyLgorICAgIEFNREdQVV9FUyA9IDk2LAorCisgICAgLy8vIFRoZSBoaWdoZXN0IHBvc3NpYmxlIGNhbGxpbmcgY29udmVudGlvbiBJRC4gTXVzdCBiZSBzb21lIDJeayAtIDEuCisgICAgTWF4SUQgPSAxMDIzCisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDYWxsaW5nQ29udgorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9DQUxMSU5HQ09OVl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0NvbWRhdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Db21kYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTUxMjFlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Db21kYXQuaApAQCAtMCwwICsxLDcxIEBACisvLz09PS0gbGx2bS9JUi9Db21kYXQuaCAtIENvbWRhdCBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBAZmlsZQorLy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIENvbWRhdCBjbGFzcywgd2hpY2ggcmVwcmVzZW50cyBhCisvLy8gc2luZ2xlIENPTURBVCBpbiBMTFZNLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9DT01EQVRfSAorI2RlZmluZSBMTFZNX0lSX0NPTURBVF9ICisKKyNpbmNsdWRlICJsbHZtLWMvVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0JpbmRpbmdXcmFwcGluZy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgU3RyaW5nUmVmOwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVHk+IGNsYXNzIFN0cmluZ01hcEVudHJ5OworCisvLyBUaGlzIGlzIGEgTmFtZSBYIFNlbGVjdGlvbktpbmQgcGFpci4gVGhlIHJlYXNvbiBmb3IgaGF2aW5nIHRoaXMgYmUgYW4KKy8vIGluZGVwZW5kZW50IG9iamVjdCBpbnN0ZWFkIG9mIGp1c3QgYWRkaW5nIHRoZSBuYW1lIGFuZCB0aGUgU2VsZWN0aW9uS2luZAorLy8gdG8gYSBHbG9iYWxPYmplY3QgaXMgdGhhdCBpdCBpcyBpbnZhbGlkIHRvIGhhdmUgdHdvIENvbWRhdHMgd2l0aCB0aGUgc2FtZQorLy8gbmFtZSBidXQgZGlmZmVyZW50IFNlbGVjdGlvbktpbmQuIFRoaXMgc3RydWN0dXJlIG1ha2VzIHRoYXQgdW5yZXByZXNlbnRhYmxlLgorY2xhc3MgQ29tZGF0IHsKK3B1YmxpYzoKKyAgZW51bSBTZWxlY3Rpb25LaW5kIHsKKyAgICBBbnksICAgICAgICAgIC8vLzwgVGhlIGxpbmtlciBtYXkgY2hvb3NlIGFueSBDT01EQVQuCisgICAgRXhhY3RNYXRjaCwgICAvLy88IFRoZSBkYXRhIHJlZmVyZW5jZWQgYnkgdGhlIENPTURBVCBtdXN0IGJlIHRoZSBzYW1lLgorICAgIExhcmdlc3QsICAgICAgLy8vPCBUaGUgbGlua2VyIHdpbGwgY2hvb3NlIHRoZSBsYXJnZXN0IENPTURBVC4KKyAgICBOb0R1cGxpY2F0ZXMsIC8vLzwgTm8gb3RoZXIgTW9kdWxlIG1heSBzcGVjaWZ5IHRoaXMgQ09NREFULgorICAgIFNhbWVTaXplLCAgICAgLy8vPCBUaGUgZGF0YSByZWZlcmVuY2VkIGJ5IHRoZSBDT01EQVQgbXVzdCBiZSB0aGUgc2FtZSBzaXplLgorICB9OworCisgIENvbWRhdChjb25zdCBDb21kYXQgJikgPSBkZWxldGU7CisgIENvbWRhdChDb21kYXQgJiZDKTsKKworICBTZWxlY3Rpb25LaW5kIGdldFNlbGVjdGlvbktpbmQoKSBjb25zdCB7IHJldHVybiBTSzsgfQorICB2b2lkIHNldFNlbGVjdGlvbktpbmQoU2VsZWN0aW9uS2luZCBWYWwpIHsgU0sgPSBWYWw7IH0KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdDsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIGJvb2wgSXNGb3JEZWJ1ZyA9IGZhbHNlKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBNb2R1bGU7CisKKyAgQ29tZGF0KCk7CisKKyAgLy8gUG9pbnRzIHRvIHRoZSBtYXAgaW4gTW9kdWxlLgorICBTdHJpbmdNYXBFbnRyeTxDb21kYXQ+ICpOYW1lID0gbnVsbHB0cjsKKyAgU2VsZWN0aW9uS2luZCBTSyA9IEFueTsKK307CisKKy8vIENyZWF0ZSB3cmFwcGVycyBmb3IgQyBCaW5kaW5nIHR5cGVzIChzZWUgQ0JpbmRpbmdXcmFwcGluZy5oKS4KK0RFRklORV9TSU1QTEVfQ09OVkVSU0lPTl9GVU5DVElPTlMoQ29tZGF0LCBMTFZNQ29tZGF0UmVmKQorCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBDb21kYXQgJkMpIHsKKyAgQy5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfQ09NREFUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQ29uc3RhbnQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQ29uc3RhbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDQ4MTYwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Db25zdGFudC5oCkBAIC0wLDAgKzEsMTgxIEBACisvLz09PS0tIGxsdm0vQ29uc3RhbnQuaCAtIENvbnN0YW50IGNsYXNzIGRlZmluaXRpb24gLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIENvbnN0YW50IGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9DT05TVEFOVF9ICisjZGVmaW5lIExMVk1fSVJfQ09OU1RBTlRfSAorCisjaW5jbHVkZSAibGx2bS9JUi9Vc2VyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQVBJbnQ7CisKKy8vLyBUaGlzIGlzIGFuIGltcG9ydGFudCBiYXNlIGNsYXNzIGluIExMVk0uIEl0IHByb3ZpZGVzIHRoZSBjb21tb24gZmFjaWxpdGllcworLy8vIG9mIGFsbCBjb25zdGFudCB2YWx1ZXMgaW4gYW4gTExWTSBwcm9ncmFtLiBBIGNvbnN0YW50IGlzIGEgdmFsdWUgdGhhdCBpcworLy8vIGltbXV0YWJsZSBhdCBydW50aW1lLiBGdW5jdGlvbnMgYXJlIGNvbnN0YW50cyBiZWNhdXNlIHRoZWlyIGFkZHJlc3MgaXMKKy8vLyBpbW11dGFibGUuIFNhbWUgd2l0aCBnbG9iYWwgdmFyaWFibGVzLgorLy8vCisvLy8gQWxsIGNvbnN0YW50cyBzaGFyZSB0aGUgY2FwYWJpbGl0aWVzIHByb3ZpZGVkIGluIHRoaXMgY2xhc3MuIEFsbCBjb25zdGFudHMKKy8vLyBjYW4gaGF2ZSBhIG51bGwgdmFsdWUuIFRoZXkgY2FuIGhhdmUgYW4gb3BlcmFuZCBsaXN0LiBDb25zdGFudHMgY2FuIGJlCisvLy8gc2ltcGxlIChpbnRlZ2VyIGFuZCBmbG9hdGluZyBwb2ludCB2YWx1ZXMpLCBjb21wbGV4IChhcnJheXMgYW5kIHN0cnVjdHVyZXMpLAorLy8vIG9yIGV4cHJlc3Npb24gYmFzZWQgKGNvbXB1dGF0aW9ucyB5aWVsZGluZyBhIGNvbnN0YW50IHZhbHVlIGNvbXBvc2VkIG9mCisvLy8gb25seSBjZXJ0YWluIG9wZXJhdG9ycyBhbmQgb3RoZXIgY29uc3RhbnQgdmFsdWVzKS4KKy8vLworLy8vIE5vdGUgdGhhdCBDb25zdGFudHMgYXJlIGltbXV0YWJsZSAob25jZSBjcmVhdGVkIHRoZXkgbmV2ZXIgY2hhbmdlKQorLy8vIGFuZCBhcmUgZnVsbHkgc2hhcmVkIGJ5IHN0cnVjdHVyYWwgZXF1aXZhbGVuY2UuICBUaGlzIG1lYW5zIHRoYXQgdHdvCisvLy8gc3RydWN0dXJhbGx5IGVxdWl2YWxlbnQgY29uc3RhbnRzIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgYWRkcmVzcy4KKy8vLyBDb25zdGFudHMgYXJlIGNyZWF0ZWQgb24gZGVtYW5kIGFzIG5lZWRlZCBhbmQgbmV2ZXIgZGVsZXRlZDogdGh1cyBjbGllbnRzCisvLy8gZG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCB0aGUgbGlmZXRpbWUgb2YgdGhlIG9iamVjdHMuCisvLy8gQGJyaWVmIExMVk0gQ29uc3RhbnQgUmVwcmVzZW50YXRpb24KK2NsYXNzIENvbnN0YW50IDogcHVibGljIFVzZXIgeworcHJvdGVjdGVkOgorICBDb25zdGFudChUeXBlICp0eSwgVmFsdWVUeSB2dHksIFVzZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMpCisgICAgOiBVc2VyKHR5LCB2dHksIE9wcywgTnVtT3BzKSB7fQorCitwdWJsaWM6CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IENvbnN0YW50ICYpID0gZGVsZXRlOworICBDb25zdGFudChjb25zdCBDb25zdGFudCAmKSA9IGRlbGV0ZTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyB0aGUgdmFsdWUgdGhhdCB3b3VsZCBiZSByZXR1cm5lZCBieSBnZXROdWxsVmFsdWUuCisgIGJvb2wgaXNOdWxsVmFsdWUoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB2YWx1ZSBpcyBvbmUuCisgIGJvb2wgaXNPbmVWYWx1ZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIHRoZSB2YWx1ZSB0aGF0IHdvdWxkIGJlIHJldHVybmVkIGJ5CisgIC8vLyBnZXRBbGxPbmVzVmFsdWUuCisgIGJvb2wgaXNBbGxPbmVzVmFsdWUoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIHdoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkKKyAgLy8vIGdldFplcm9WYWx1ZUZvck5lZ2F0aW9uLgorICBib29sIGlzTmVnYXRpdmVaZXJvVmFsdWUoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGlzIG5lZ2F0aXZlIHplcm8gb3IgbnVsbCB2YWx1ZS4KKyAgYm9vbCBpc1plcm9WYWx1ZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgbm90IHRoZSBzbWFsbGVzdCBzaWduZWQgdmFsdWUuCisgIGJvb2wgaXNOb3RNaW5TaWduZWRWYWx1ZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgdGhlIHNtYWxsZXN0IHNpZ25lZCB2YWx1ZS4KKyAgYm9vbCBpc01pblNpZ25lZFZhbHVlKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBmaW5pdGUgYW5kIG5vbi16ZXJvIGZsb2F0aW5nLXBvaW50IHNjYWxhcgorICAvLy8gY29uc3RhbnQgb3IgYSB2ZWN0b3IgY29uc3RhbnQgd2l0aCBhbGwgZmluaXRlIGFuZCBub24temVybyBlbGVtZW50cy4KKyAgYm9vbCBpc0Zpbml0ZU5vblplcm9GUCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgbm9ybWFsIChhcyBvcHBvc2VkIHRvIGRlbm9ybWFsKSBmbG9hdGluZy1wb2ludAorICAvLy8gc2NhbGFyIGNvbnN0YW50IG9yIGEgdmVjdG9yIGNvbnN0YW50IHdpdGggYWxsIG5vcm1hbCBlbGVtZW50cy4KKyAgYm9vbCBpc05vcm1hbEZQKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgc2NhbGFyIGhhcyBhbiBleGFjdCBtdWx0aXBsaWNhdGl2ZSBpbnZlcnNlIG9yIHRoaXMKKyAgLy8vIHZlY3RvciBoYXMgYW4gZXhhY3QgbXVsdGlwbGljYXRpdmUgaW52ZXJzZSBmb3IgZWFjaCBlbGVtZW50IGluIHRoZSB2ZWN0b3IuCisgIGJvb2wgaGFzRXhhY3RJbnZlcnNlRlAoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGZsb2F0aW5nLXBvaW50IE5hTiBjb25zdGFudCBvciBhIHZlY3RvcgorICAvLy8gZmxvYXRpbmctcG9pbnQgY29uc3RhbnQgd2l0aCBhbGwgTmFOIGVsZW1lbnRzLgorICBib29sIGlzTmFOKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGV2YWx1YXRpb24gb2YgdGhpcyBjb25zdGFudCBjb3VsZCB0cmFwLiBUaGlzIGlzIHRydWUgZm9yCisgIC8vLyB0aGluZ3MgbGlrZSBjb25zdGFudCBleHByZXNzaW9ucyB0aGF0IGNvdWxkIGRpdmlkZSBieSB6ZXJvLgorICBib29sIGNhblRyYXAoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHZhbHVlIGNhbiB2YXJ5IGJldHdlZW4gdGhyZWFkcy4KKyAgYm9vbCBpc1RocmVhZERlcGVuZGVudCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgZGVwZW5kZW50IG9uIGEgZGxsaW1wb3J0IHZhcmlhYmxlLgorICBib29sIGlzRExMSW1wb3J0RGVwZW5kZW50KCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBjb25zdGFudCBoYXMgdXNlcnMgb3RoZXIgdGhhbiBjb25zdGFudCBleHByZXNzaW9ucyBhbmQKKyAgLy8vIG90aGVyIGRhbmdsaW5nIHRoaW5ncy4KKyAgYm9vbCBpc0NvbnN0YW50VXNlZCgpIGNvbnN0OworCisgIC8vLyBUaGlzIG1ldGhvZCBjbGFzc2lmaWVzIHRoZSBlbnRyeSBhY2NvcmRpbmcgdG8gd2hldGhlciBvciBub3QgaXQgbWF5CisgIC8vLyBnZW5lcmF0ZSBhIHJlbG9jYXRpb24gZW50cnkuICBUaGlzIG11c3QgYmUgY29uc2VydmF0aXZlLCBzbyBpZiBpdCBtaWdodAorICAvLy8gY29kZWdlbiB0byBhIHJlbG9jYXRhYmxlIGVudHJ5LCBpdCBzaG91bGQgc2F5IHNvLgorICAvLy8KKyAgLy8vIEZJWE1FOiBUaGlzIHJlYWxseSBzaG91bGQgbm90IGJlIGluIElSLgorICBib29sIG5lZWRzUmVsb2NhdGlvbigpIGNvbnN0OworCisgIC8vLyBGb3IgYWdncmVnYXRlcyAoc3RydWN0L2FycmF5L3ZlY3RvcikgcmV0dXJuIHRoZSBjb25zdGFudCB0aGF0IGNvcnJlc3BvbmRzCisgIC8vLyB0byB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgaWYgcG9zc2libGUsIG9yIG51bGwgaWYgbm90LiBUaGlzIGNhbiByZXR1cm4gbnVsbAorICAvLy8gaWYgdGhlIGVsZW1lbnQgaW5kZXggaXMgYSBDb25zdGFudEV4cHIsIG9yIGlmICd0aGlzJyBpcyBhIGNvbnN0YW50IGV4cHIuCisgIENvbnN0YW50ICpnZXRBZ2dyZWdhdGVFbGVtZW50KHVuc2lnbmVkIEVsdCkgY29uc3Q7CisgIENvbnN0YW50ICpnZXRBZ2dyZWdhdGVFbGVtZW50KENvbnN0YW50ICpFbHQpIGNvbnN0OworCisgIC8vLyBJZiB0aGlzIGlzIGEgc3BsYXQgdmVjdG9yIGNvbnN0YW50LCBtZWFuaW5nIHRoYXQgYWxsIG9mIHRoZSBlbGVtZW50cyBoYXZlCisgIC8vLyB0aGUgc2FtZSB2YWx1ZSwgcmV0dXJuIHRoYXQgdmFsdWUuIE90aGVyd2lzZSByZXR1cm4gMC4KKyAgQ29uc3RhbnQgKmdldFNwbGF0VmFsdWUoKSBjb25zdDsKKworICAvLy8gSWYgQyBpcyBhIGNvbnN0YW50IGludGVnZXIgdGhlbiByZXR1cm4gaXRzIHZhbHVlLCBvdGhlcndpc2UgQyBtdXN0IGJlIGEKKyAgLy8vIHZlY3RvciBvZiBjb25zdGFudCBpbnRlZ2VycywgYWxsIGVxdWFsLCBhbmQgdGhlIGNvbW1vbiB2YWx1ZSBpcyByZXR1cm5lZC4KKyAgY29uc3QgQVBJbnQgJmdldFVuaXF1ZUludGVnZXIoKSBjb25zdDsKKworICAvLy8gQ2FsbGVkIGlmIHNvbWUgZWxlbWVudCBvZiB0aGlzIGNvbnN0YW50IGlzIG5vIGxvbmdlciB2YWxpZC4KKyAgLy8vIEF0IHRoaXMgcG9pbnQgb25seSBvdGhlciBjb25zdGFudHMgbWF5IGJlIG9uIHRoZSB1c2VfbGlzdCBmb3IgdGhpcworICAvLy8gY29uc3RhbnQuICBBbnkgY29uc3RhbnRzIG9uIG91ciBVc2UgbGlzdCBtdXN0IGFsc28gYmUgZGVzdHJveSdkLiAgVGhlCisgIC8vLyBpbXBsZW1lbnRhdGlvbiBtdXN0IGJlIHN1cmUgdG8gcmVtb3ZlIHRoZSBjb25zdGFudCBmcm9tIHRoZSBsaXN0IG9mCisgIC8vLyBhdmFpbGFibGUgY2FjaGVkIGNvbnN0YW50cy4gIEltcGxlbWVudGF0aW9ucyBzaG91bGQgaW1wbGVtZW50CisgIC8vLyBkZXN0cm95Q29uc3RhbnRJbXBsIHRvIHJlbW92ZSBjb25zdGFudHMgZnJvbSBhbnkgcG9vbHMvbWFwcyB0aGV5IGFyZQorICAvLy8gY29udGFpbmVkIGl0LgorICB2b2lkIGRlc3Ryb3lDb25zdGFudCgpOworCisgIC8vLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHN0YXRpY19hc3NlcnQoQ29uc3RhbnRGaXJzdFZhbCA9PSAwLCAiVi0+Z2V0VmFsdWVJRCgpID49IENvbnN0YW50Rmlyc3RWYWwgYWx3YXlzIHN1Y2NlZWRzIik7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA8PSBDb25zdGFudExhc3RWYWw7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgaXMgYSBzcGVjaWFsIGZvcm0gb2YgVXNlcjo6cmVwbGFjZVVzZXNPZldpdGgKKyAgLy8vICh3aGljaCBkb2VzIG5vdCB3b3JrIG9uIGNvbnN0YW50cykgdGhhdCBkb2VzIHdvcmsKKyAgLy8vIG9uIGNvbnN0YW50cy4gIEJhc2ljYWxseSB0aGlzIG1ldGhvZCBnb2VzIHRocm91Z2ggdGhlIHRyb3VibGUgb2YgYnVpbGRpbmcKKyAgLy8vIGEgbmV3IGNvbnN0YW50IHRoYXQgaXMgZXF1aXZhbGVudCB0byB0aGUgY3VycmVudCBvbmUsIHdpdGggYWxsIHVzZXMgb2YKKyAgLy8vIEZyb20gcmVwbGFjZWQgd2l0aCB1c2VzIG9mIFRvLiAgQWZ0ZXIgdGhpcyBjb25zdHJ1Y3Rpb24gaXMgY29tcGxldGVkLCBhbGwKKyAgLy8vIG9mIHRoZSB1c2VycyBvZiAndGhpcycgYXJlIHJlcGxhY2VkIHRvIHVzZSB0aGUgbmV3IGNvbnN0YW50LCBhbmQgdGhlbgorICAvLy8gJ3RoaXMnIGlzIGRlbGV0ZWQuICBJbiBnZW5lcmFsLCB5b3Ugc2hvdWxkIG5vdCBjYWxsIHRoaXMgbWV0aG9kLCBpbnN0ZWFkLAorICAvLy8gdXNlIFZhbHVlOjpyZXBsYWNlQWxsVXNlc1dpdGgsIHdoaWNoIGF1dG9tYXRpY2FsbHkgZGlzcGF0Y2hlcyB0byB0aGlzCisgIC8vLyBtZXRob2QgYXMgbmVlZGVkLgorICAvLy8KKyAgdm9pZCBoYW5kbGVPcGVyYW5kQ2hhbmdlKFZhbHVlICosIFZhbHVlICopOworCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0TnVsbFZhbHVlKFR5cGUqIFR5KTsKKworICAvLy8gQHJldHVybnMgdGhlIHZhbHVlIGZvciBhbiBpbnRlZ2VyIG9yIHZlY3RvciBvZiBpbnRlZ2VyIGNvbnN0YW50IG9mIHRoZQorICAvLy8gZ2l2ZW4gdHlwZSB0aGF0IGhhcyBhbGwgaXRzIGJpdHMgc2V0IHRvIHRydWUuCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBhbGwgb25lcyB2YWx1ZQorICBzdGF0aWMgQ29uc3RhbnQgKmdldEFsbE9uZXNWYWx1ZShUeXBlKiBUeSk7CisKKyAgLy8vIFJldHVybiB0aGUgdmFsdWUgZm9yIGFuIGludGVnZXIgb3IgcG9pbnRlciBjb25zdGFudCwgb3IgYSB2ZWN0b3IgdGhlcmVvZiwKKyAgLy8vIHdpdGggdGhlIGdpdmVuIHNjYWxhciB2YWx1ZS4KKyAgc3RhdGljIENvbnN0YW50ICpnZXRJbnRlZ2VyVmFsdWUoVHlwZSAqVHksIGNvbnN0IEFQSW50ICZWKTsKKworICAvLy8gSWYgdGhlcmUgYXJlIGFueSBkZWFkIGNvbnN0YW50IHVzZXJzIGRhbmdsaW5nIG9mZiBvZiB0aGlzIGNvbnN0YW50LCByZW1vdmUKKyAgLy8vIHRoZW0uIFRoaXMgbWV0aG9kIGlzIHVzZWZ1bCBmb3IgY2xpZW50cyB0aGF0IHdhbnQgdG8gY2hlY2sgdG8gc2VlIGlmIGEKKyAgLy8vIGdsb2JhbCBpcyB1bnVzZWQsIGJ1dCBkb24ndCB3YW50IHRvIGRlYWwgd2l0aCBwb3RlbnRpYWxseSBkZWFkIGNvbnN0YW50cworICAvLy8gaGFuZ2luZyBvZmYgb2YgdGhlIGdsb2JhbHMuCisgIHZvaWQgcmVtb3ZlRGVhZENvbnN0YW50VXNlcnMoKSBjb25zdDsKKworICBjb25zdCBDb25zdGFudCAqc3RyaXBQb2ludGVyQ2FzdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8Q29uc3RhbnQ+KFZhbHVlOjpzdHJpcFBvaW50ZXJDYXN0cygpKTsKKyAgfQorCisgIENvbnN0YW50ICpzdHJpcFBvaW50ZXJDYXN0cygpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxDb25zdGFudCo+KAorICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IENvbnN0YW50ICo+KHRoaXMpLT5zdHJpcFBvaW50ZXJDYXN0cygpKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfQ09OU1RBTlRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Db25zdGFudEZvbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Db25zdGFudEZvbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhNWJiYTcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0NvbnN0YW50Rm9sZGVyLmgKQEAgLTAsMCArMSwyNzcgQEAKKy8vPT09LSBDb25zdGFudEZvbGRlci5oIC0gQ29uc3RhbnQgZm9sZGluZyBoZWxwZXIgLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIENvbnN0YW50Rm9sZGVyIGNsYXNzLCBhIGhlbHBlciBmb3IgSVJCdWlsZGVyLgorLy8gSXQgcHJvdmlkZXMgSVJCdWlsZGVyIHdpdGggYSBzZXQgb2YgbWV0aG9kcyBmb3IgY3JlYXRpbmcgY29uc3RhbnRzCisvLyB3aXRoIG1pbmltYWwgZm9sZGluZy4gIEZvciBnZW5lcmFsIGNvbnN0YW50IGNyZWF0aW9uIGFuZCBmb2xkaW5nLAorLy8gdXNlIENvbnN0YW50RXhwciBhbmQgdGhlIHJvdXRpbmVzIGluIGxsdm0vQW5hbHlzaXMvQ29uc3RhbnRGb2xkaW5nLmguCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0NPTlNUQU5URk9MREVSX0gKKyNkZWZpbmUgTExWTV9JUl9DT05TVEFOVEZPTERFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0clR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBDb25zdGFudEZvbGRlciAtIENyZWF0ZSBjb25zdGFudHMgd2l0aCBtaW5pbXVtLCB0YXJnZXQgaW5kZXBlbmRlbnQsIGZvbGRpbmcuCitjbGFzcyBDb25zdGFudEZvbGRlciB7CitwdWJsaWM6CisgIGV4cGxpY2l0IENvbnN0YW50Rm9sZGVyKCkgPSBkZWZhdWx0OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBCaW5hcnkgT3BlcmF0b3JzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIENvbnN0YW50ICpDcmVhdGVBZGQoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVyA9IGZhbHNlLCBib29sIEhhc05TVyA9IGZhbHNlKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0QWRkKExIUywgUkhTLCBIYXNOVVcsIEhhc05TVyk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlRkFkZChDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0RkFkZChMSFMsIFJIUyk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlU3ViKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNOVVcgPSBmYWxzZSwgYm9vbCBIYXNOU1cgPSBmYWxzZSkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFN1YihMSFMsIFJIUywgSGFzTlVXLCBIYXNOU1cpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUZTdWIoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEZTdWIoTEhTLCBSSFMpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZU11bChDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRNdWwoTEhTLCBSSFMsIEhhc05VVywgSGFzTlNXKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVGTXVsKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRGTXVsKExIUywgUkhTKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVVRGl2KENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNFeGFjdCA9IGZhbHNlKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0VURpdihMSFMsIFJIUywgaXNFeGFjdCk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlU0RpdihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRXhhY3QgPSBmYWxzZSkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFNEaXYoTEhTLCBSSFMsIGlzRXhhY3QpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUZEaXYoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEZEaXYoTEhTLCBSSFMpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZVVSZW0oQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFVSZW0oTEhTLCBSSFMpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZVNSZW0oQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFNSZW0oTEhTLCBSSFMpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUZSZW0oQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEZSZW0oTEhTLCBSSFMpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZVNobChDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRTaGwoTEhTLCBSSFMsIEhhc05VVywgSGFzTlNXKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVMU2hyKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNFeGFjdCA9IGZhbHNlKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0TFNocihMSFMsIFJIUywgaXNFeGFjdCk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlQVNocihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRXhhY3QgPSBmYWxzZSkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEFTaHIoTEhTLCBSSFMsIGlzRXhhY3QpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUFuZChDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0QW5kKExIUywgUkhTKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVPcihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0T3IoTEhTLCBSSFMpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZVhvcihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0WG9yKExIUywgUkhTKTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVCaW5PcChJbnN0cnVjdGlvbjo6QmluYXJ5T3BzIE9wYywKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXQoT3BjLCBMSFMsIFJIUyk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gVW5hcnkgT3BlcmF0b3JzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIENvbnN0YW50ICpDcmVhdGVOZWcoQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNOVVcgPSBmYWxzZSwgYm9vbCBIYXNOU1cgPSBmYWxzZSkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldE5lZyhDLCBIYXNOVVcsIEhhc05TVyk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlRk5lZyhDb25zdGFudCAqQykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEZOZWcoQyk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlTm90KENvbnN0YW50ICpDKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0Tm90KEMpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE1lbW9yeSBJbnN0cnVjdGlvbnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgQ29uc3RhbnQgKkNyZWF0ZUdldEVsZW1lbnRQdHIoVHlwZSAqVHksIENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDb25zdGFudCAqPiBJZHhMaXN0KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0R2V0RWxlbWVudFB0cihUeSwgQywgSWR4TGlzdCk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlR2V0RWxlbWVudFB0cihUeXBlICpUeSwgQ29uc3RhbnQgKkMsIENvbnN0YW50ICpJZHgpIGNvbnN0IHsKKyAgICAvLyBUaGlzIGZvcm0gb2YgdGhlIGZ1bmN0aW9uIG9ubHkgZXhpc3RzIHRvIGF2b2lkIGFtYmlndW91cyBvdmVybG9hZAorICAgIC8vIHdhcm5pbmdzIGFib3V0IHdoZXRoZXIgdG8gY29udmVydCBJZHggdG8gQXJyYXlSZWY8Q29uc3RhbnQgKj4gb3IKKyAgICAvLyBBcnJheVJlZjxWYWx1ZSAqPi4KKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRHZXRFbGVtZW50UHRyKFR5LCBDLCBJZHgpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUdldEVsZW1lbnRQdHIoVHlwZSAqVHksIENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBJZHhMaXN0KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0R2V0RWxlbWVudFB0cihUeSwgQywgSWR4TGlzdCk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlSW5Cb3VuZHNHZXRFbGVtZW50UHRyKFR5cGUgKlR5LCBDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDb25zdGFudCAqPiBJZHhMaXN0KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0SW5Cb3VuZHNHZXRFbGVtZW50UHRyKFR5LCBDLCBJZHhMaXN0KTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVJbkJvdW5kc0dldEVsZW1lbnRQdHIoVHlwZSAqVHksIENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpJZHgpIGNvbnN0IHsKKyAgICAvLyBUaGlzIGZvcm0gb2YgdGhlIGZ1bmN0aW9uIG9ubHkgZXhpc3RzIHRvIGF2b2lkIGFtYmlndW91cyBvdmVybG9hZAorICAgIC8vIHdhcm5pbmdzIGFib3V0IHdoZXRoZXIgdG8gY29udmVydCBJZHggdG8gQXJyYXlSZWY8Q29uc3RhbnQgKj4gb3IKKyAgICAvLyBBcnJheVJlZjxWYWx1ZSAqPi4KKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRJbkJvdW5kc0dldEVsZW1lbnRQdHIoVHksIEMsIElkeCk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlSW5Cb3VuZHNHZXRFbGVtZW50UHRyKFR5cGUgKlR5LCBDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBJZHhMaXN0KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0SW5Cb3VuZHNHZXRFbGVtZW50UHRyKFR5LCBDLCBJZHhMaXN0KTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDYXN0L0NvbnZlcnNpb24gT3BlcmF0b3JzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIENvbnN0YW50ICpDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpDYXN0T3BzIE9wLCBDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0Q2FzdChPcCwgQywgRGVzdFR5KTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVQb2ludGVyQ2FzdChDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0UG9pbnRlckNhc3QoQywgRGVzdFR5KTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVQb2ludGVyQml0Q2FzdE9yQWRkclNwYWNlQ2FzdChDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFBvaW50ZXJCaXRDYXN0T3JBZGRyU3BhY2VDYXN0KEMsIERlc3RUeSk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlSW50Q2FzdChDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU2lnbmVkKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0SW50ZWdlckNhc3QoQywgRGVzdFR5LCBpc1NpZ25lZCk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlRlBDYXN0KENvbnN0YW50ICpDLCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRGUENhc3QoQywgRGVzdFR5KTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVCaXRDYXN0KENvbnN0YW50ICpDLCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6Qml0Q2FzdCwgQywgRGVzdFR5KTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVJbnRUb1B0cihDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgcmV0dXJuIENyZWF0ZUNhc3QoSW5zdHJ1Y3Rpb246OkludFRvUHRyLCBDLCBEZXN0VHkpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZVB0clRvSW50KENvbnN0YW50ICpDLCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6UHRyVG9JbnQsIEMsIERlc3RUeSk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlWkV4dE9yQml0Q2FzdChDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0WkV4dE9yQml0Q2FzdChDLCBEZXN0VHkpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZVNFeHRPckJpdENhc3QoQ29uc3RhbnQgKkMsIFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFNFeHRPckJpdENhc3QoQywgRGVzdFR5KTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVUcnVuY09yQml0Q2FzdChDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0VHJ1bmNPckJpdENhc3QoQywgRGVzdFR5KTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDb21wYXJlIEluc3RydWN0aW9ucworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBDb25zdGFudCAqQ3JlYXRlSUNtcChDbXBJbnN0OjpQcmVkaWNhdGUgUCwgQ29uc3RhbnQgKkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldENvbXBhcmUoUCwgTEhTLCBSSFMpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUZDbXAoQ21wSW5zdDo6UHJlZGljYXRlIFAsIENvbnN0YW50ICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRDb21wYXJlKFAsIExIUywgUkhTKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBPdGhlciBJbnN0cnVjdGlvbnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgQ29uc3RhbnQgKkNyZWF0ZVNlbGVjdChDb25zdGFudCAqQywgQ29uc3RhbnQgKlRydWUsIENvbnN0YW50ICpGYWxzZSkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldFNlbGVjdChDLCBUcnVlLCBGYWxzZSk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlRXh0cmFjdEVsZW1lbnQoQ29uc3RhbnQgKlZlYywgQ29uc3RhbnQgKklkeCkgY29uc3QgeworICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEV4dHJhY3RFbGVtZW50KFZlYywgSWR4KTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVJbnNlcnRFbGVtZW50KENvbnN0YW50ICpWZWMsIENvbnN0YW50ICpOZXdFbHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRJbnNlcnRFbGVtZW50KFZlYywgTmV3RWx0LCBJZHgpOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZVNodWZmbGVWZWN0b3IoQ29uc3RhbnQgKlYxLCBDb25zdGFudCAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpNYXNrKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0U2h1ZmZsZVZlY3RvcihWMSwgVjIsIE1hc2spOworICB9CisKKyAgQ29uc3RhbnQgKkNyZWF0ZUV4dHJhY3RWYWx1ZShDb25zdGFudCAqQWdnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJZHhMaXN0KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0RXh0cmFjdFZhbHVlKEFnZywgSWR4TGlzdCk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlSW5zZXJ0VmFsdWUoQ29uc3RhbnQgKkFnZywgQ29uc3RhbnQgKlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJZHhMaXN0KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0SW5zZXJ0VmFsdWUoQWdnLCBWYWwsIElkeExpc3QpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9DT05TVEFOVEZPTERFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0NvbnN0YW50UmFuZ2UuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvQ29uc3RhbnRSYW5nZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ODllMjYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0NvbnN0YW50UmFuZ2UuaApAQCAtMCwwICsxLDM0NiBAQAorLy89PT0tIENvbnN0YW50UmFuZ2UuaCAtIFJlcHJlc2VudCBhIHJhbmdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBSZXByZXNlbnQgYSByYW5nZSBvZiBwb3NzaWJsZSB2YWx1ZXMgdGhhdCBtYXkgb2NjdXIgd2hlbiB0aGUgcHJvZ3JhbSBpcyBydW4KKy8vIGZvciBhbiBpbnRlZ3JhbCB2YWx1ZS4gIFRoaXMga2VlcHMgdHJhY2sgb2YgYSBsb3dlciBhbmQgdXBwZXIgYm91bmQgZm9yIHRoZQorLy8gY29uc3RhbnQsIHdoaWNoIE1BWSB3cmFwIGFyb3VuZCB0aGUgZW5kIG9mIHRoZSBudW1lcmljIHJhbmdlLiAgVG8gZG8gdGhpcywgaXQKKy8vIGtlZXBzIHRyYWNrIG9mIGEgW2xvd2VyLCB1cHBlcikgYm91bmQsIHdoaWNoIHNwZWNpZmllcyBhbiBpbnRlcnZhbCBqdXN0IGxpa2UKKy8vIFNUTCBpdGVyYXRvcnMuICBXaGVuIHVzZWQgd2l0aCBib29sZWFuIHZhbHVlcywgdGhlIGZvbGxvd2luZyBhcmUgaW1wb3J0YW50CisvLyByYW5nZXM6IDoKKy8vCisvLyAgW0YsIEYpID0ge30gICAgID0gRW1wdHkgc2V0CisvLyAgW1QsIEYpID0ge1R9CisvLyAgW0YsIFQpID0ge0Z9CisvLyAgW1QsIFQpID0ge0YsIFR9ID0gRnVsbCBzZXQKKy8vCisvLyBUaGUgb3RoZXIgaW50ZWdyYWwgcmFuZ2VzIHVzZSBtaW4vbWF4IHZhbHVlcyBmb3Igc3BlY2lhbCByYW5nZSB2YWx1ZXMuIEZvcgorLy8gZXhhbXBsZSwgZm9yIDgtYml0IHR5cGVzLCBpdCB1c2VzOgorLy8gWzAsIDApICAgICA9IHt9ICAgICAgID0gRW1wdHkgc2V0CisvLyBbMjU1LCAyNTUpID0gezAuLjI1NX0gPSBGdWxsIFNldAorLy8KKy8vIE5vdGUgdGhhdCBDb25zdGFudFJhbmdlIGNhbiBiZSB1c2VkIHRvIHJlcHJlc2VudCBlaXRoZXIgc2lnbmVkIG9yCisvLyB1bnNpZ25lZCByYW5nZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0NPTlNUQU5UUkFOR0VfSAorI2RlZmluZSBMTFZNX0lSX0NPTlNUQU5UUkFOR0VfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RyVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNRE5vZGU7CitjbGFzcyByYXdfb3N0cmVhbTsKKworLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHJhbmdlIG9mIHZhbHVlcy4KK2NsYXNzIExMVk1fTk9ESVNDQVJEIENvbnN0YW50UmFuZ2UgeworICBBUEludCBMb3dlciwgVXBwZXI7CisKK3B1YmxpYzoKKyAgLy8vIEluaXRpYWxpemUgYSBmdWxsICh0aGUgZGVmYXVsdCkgb3IgZW1wdHkgc2V0IGZvciB0aGUgc3BlY2lmaWVkIGJpdCB3aWR0aC4KKyAgZXhwbGljaXQgQ29uc3RhbnRSYW5nZSh1aW50MzJfdCBCaXRXaWR0aCwgYm9vbCBpc0Z1bGxTZXQgPSB0cnVlKTsKKworICAvLy8gSW5pdGlhbGl6ZSBhIHJhbmdlIHRvIGhvbGQgdGhlIHNpbmdsZSBzcGVjaWZpZWQgdmFsdWUuCisgIENvbnN0YW50UmFuZ2UoQVBJbnQgVmFsdWUpOworCisgIC8vLyBAYnJpZWYgSW5pdGlhbGl6ZSBhIHJhbmdlIG9mIHZhbHVlcyBleHBsaWNpdGx5LiBUaGlzIHdpbGwgYXNzZXJ0IG91dCBpZgorICAvLy8gTG93ZXI9PVVwcGVyIGFuZCBMb3dlciAhPSBNaW4gb3IgTWF4IHZhbHVlIGZvciBpdHMgdHlwZS4gSXQgd2lsbCBhbHNvCisgIC8vLyBhc3NlcnQgb3V0IGlmIHRoZSB0d28gQVBJbnQncyBhcmUgbm90IHRoZSBzYW1lIGJpdCB3aWR0aC4KKyAgQ29uc3RhbnRSYW5nZShBUEludCBMb3dlciwgQVBJbnQgVXBwZXIpOworCisgIC8vLyBQcm9kdWNlIHRoZSBzbWFsbGVzdCByYW5nZSBzdWNoIHRoYXQgYWxsIHZhbHVlcyB0aGF0IG1heSBzYXRpc2Z5IHRoZSBnaXZlbgorICAvLy8gcHJlZGljYXRlIHdpdGggYW55IHZhbHVlIGNvbnRhaW5lZCB3aXRoaW4gT3RoZXIgaXMgY29udGFpbmVkIGluIHRoZQorICAvLy8gcmV0dXJuZWQgcmFuZ2UuICBGb3JtYWxseSwgdGhpcyByZXR1cm5zIGEgc3VwZXJzZXQgb2YKKyAgLy8vICd1bmlvbiBvdmVyIGFsbCB5IGluIE90aGVyIC4geyB4IDogaWNtcCBvcCB4IHkgaXMgdHJ1ZSB9Jy4gIElmIHRoZSBleGFjdAorICAvLy8gYW5zd2VyIGlzIG5vdCByZXByZXNlbnRhYmxlIGFzIGEgQ29uc3RhbnRSYW5nZSwgdGhlIHJldHVybiB2YWx1ZSB3aWxsIGJlIGEKKyAgLy8vIHByb3BlciBzdXBlcnNldCBvZiB0aGUgYWJvdmUuCisgIC8vLworICAvLy8gRXhhbXBsZTogUHJlZCA9IHVsdCBhbmQgT3RoZXIgPSBpOCBbMiwgNSkgcmV0dXJucyBSZXN1bHQgPSBbMCwgNCkKKyAgc3RhdGljIENvbnN0YW50UmFuZ2UgbWFrZUFsbG93ZWRJQ21wUmVnaW9uKENtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29uc3RhbnRSYW5nZSAmT3RoZXIpOworCisgIC8vLyBQcm9kdWNlIHRoZSBsYXJnZXN0IHJhbmdlIHN1Y2ggdGhhdCBhbGwgdmFsdWVzIGluIHRoZSByZXR1cm5lZCByYW5nZQorICAvLy8gc2F0aXNmeSB0aGUgZ2l2ZW4gcHJlZGljYXRlIHdpdGggYWxsIHZhbHVlcyBjb250YWluZWQgd2l0aGluIE90aGVyLgorICAvLy8gRm9ybWFsbHksIHRoaXMgcmV0dXJucyBhIHN1YnNldCBvZgorICAvLy8gJ2ludGVyc2VjdGlvbiBvdmVyIGFsbCB5IGluIE90aGVyIC4geyB4IDogaWNtcCBvcCB4IHkgaXMgdHJ1ZSB9Jy4gIElmIHRoZQorICAvLy8gZXhhY3QgYW5zd2VyIGlzIG5vdCByZXByZXNlbnRhYmxlIGFzIGEgQ29uc3RhbnRSYW5nZSwgdGhlIHJldHVybiB2YWx1ZQorICAvLy8gd2lsbCBiZSBhIHByb3BlciBzdWJzZXQgb2YgdGhlIGFib3ZlLgorICAvLy8KKyAgLy8vIEV4YW1wbGU6IFByZWQgPSB1bHQgYW5kIE90aGVyID0gaTggWzIsIDUpIHJldHVybnMgWzAsIDIpCisgIHN0YXRpYyBDb25zdGFudFJhbmdlIG1ha2VTYXRpc2Z5aW5nSUNtcFJlZ2lvbihDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnN0YW50UmFuZ2UgJk90aGVyKTsKKworICAvLy8gUHJvZHVjZSB0aGUgZXhhY3QgcmFuZ2Ugc3VjaCB0aGF0IGFsbCB2YWx1ZXMgaW4gdGhlIHJldHVybmVkIHJhbmdlIHNhdGlzZnkKKyAgLy8vIHRoZSBnaXZlbiBwcmVkaWNhdGUgd2l0aCBhbnkgdmFsdWUgY29udGFpbmVkIHdpdGhpbiBPdGhlci4gRm9ybWFsbHksIHRoaXMKKyAgLy8vIHJldHVybnMgdGhlIGV4YWN0IGFuc3dlciB3aGVuIHRoZSBzdXBlcnNldCBvZiAndW5pb24gb3ZlciBhbGwgeSBpbiBPdGhlcgorICAvLy8gaXMgZXhhY3RseSBzYW1lIGFzIHRoZSBzdWJzZXQgb2YgaW50ZXJzZWN0aW9uIG92ZXIgYWxsIHkgaW4gT3RoZXIuCisgIC8vLyB7IHggOiBpY21wIG9wIHggeSBpcyB0cnVlfScuCisgIC8vLworICAvLy8gRXhhbXBsZTogUHJlZCA9IHVsdCBhbmQgT3RoZXIgPSBpOCAzIHJldHVybnMgWzAsIDMpCisgIHN0YXRpYyBDb25zdGFudFJhbmdlIG1ha2VFeGFjdElDbXBSZWdpb24oQ21wSW5zdDo6UHJlZGljYXRlIFByZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQVBJbnQgJk90aGVyKTsKKworICAvLy8gUmV0dXJuIHRoZSBsYXJnZXN0IHJhbmdlIGNvbnRhaW5pbmcgYWxsIFggc3VjaCB0aGF0ICJYIEJpbk9wQyBZIiBpcworICAvLy8gZ3VhcmFudGVlZCBub3QgdG8gd3JhcCAob3ZlcmZsb3cpIGZvciBhbGwgWSBpbiBPdGhlci4KKyAgLy8vCisgIC8vLyBOQiEgVGhlIHJldHVybmVkIHNldCBkb2VzICpub3QqIGNvbnRhaW4gKiphbGwqKiBwb3NzaWJsZSB2YWx1ZXMgb2YgWCBmb3IKKyAgLy8vIHdoaWNoICJYIEJpbk9wQyBZIiBkb2VzIG5vdCB3cmFwIC0tIHNvbWUgdmlhYmxlIHZhbHVlcyBvZiBYIG1heSBiZQorICAvLy8gbWlzc2luZywgc28geW91IGNhbm5vdCB1c2UgdGhpcyB0byBjb25zdHJhaW4gWCdzIHJhbmdlLiAgRS5nLiBpbiB0aGUKKyAgLy8vIGZvdXJ0aCBleGFtcGxlLCAiKC0yKSArIDEiIGlzIGJvdGggbnN3IGFuZCBudXcgKHNvIHRoZSAiWCIgY291bGQgYmUgLTIpLAorICAvLy8gYnV0ICgtMikgaXMgbm90IGluIHRoZSBzZXQgcmV0dXJuZWQuCisgIC8vLworICAvLy8gRXhhbXBsZXM6CisgIC8vLyAgdHlwZWRlZiBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yIE9CTzsKKyAgLy8vICAjZGVmaW5lIE1HTlIgbWFrZUd1YXJhbnRlZWROb1dyYXBSZWdpb24KKyAgLy8vICBNR05SKEFkZCwgW2k4IDEsIDIpLCBPQk86Ok5vU2lnbmVkV3JhcCkgPT0gWy0xMjgsIDEyNykKKyAgLy8vICBNR05SKEFkZCwgW2k4IDEsIDIpLCBPQk86Ok5vVW5zaWduZWRXcmFwKSA9PSBbMCwgLTEpCisgIC8vLyAgTUdOUihBZGQsIFtpOCAwLCAxKSwgT0JPOjpOb1Vuc2lnbmVkV3JhcCkgPT0gRnVsbCBTZXQKKyAgLy8vICBNR05SKEFkZCwgW2k4IDEsIDIpLCBPQk86Ok5vVW5zaWduZWRXcmFwIHwgT0JPOjpOb1NpZ25lZFdyYXApCisgIC8vLyAgICA9PSBbMCxJTlRfTUFYKQorICAvLy8gIE1HTlIoQWRkLCBbaTggLTEsIDYpLCBPQk86Ok5vU2lnbmVkV3JhcCkgPT0gW0lOVF9NSU4rMSwgSU5UX01BWC00KQorICAvLy8gIE1HTlIoU3ViLCBbaTggMSwgMiksIE9CTzo6Tm9TaWduZWRXcmFwKSA9PSBbLTEyNywgMTI4KQorICAvLy8gIE1HTlIoU3ViLCBbaTggMSwgMiksIE9CTzo6Tm9VbnNpZ25lZFdyYXApID09IFsxLCAwKQorICAvLy8gIE1HTlIoU3ViLCBbaTggMSwgMiksIE9CTzo6Tm9VbnNpZ25lZFdyYXAgfCBPQk86Ok5vU2lnbmVkV3JhcCkKKyAgLy8vICAgID09IFsxLElOVF9NQVgpCisgIHN0YXRpYyBDb25zdGFudFJhbmdlIG1ha2VHdWFyYW50ZWVkTm9XcmFwUmVnaW9uKEluc3RydWN0aW9uOjpCaW5hcnlPcHMgQmluT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnN0YW50UmFuZ2UgJk90aGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOb1dyYXBLaW5kKTsKKworICAvLy8gU2V0IHVwIFxwIFByZWQgYW5kIFxwIFJIUyBzdWNoIHRoYXQKKyAgLy8vIENvbnN0YW50UmFuZ2U6Om1ha2VFeGFjdElDbXBSZWdpb24oUHJlZCwgUkhTKSA9PSAqdGhpcy4gIFJldHVybiB0cnVlIGlmCisgIC8vLyBzdWNjZXNzZnVsLgorICBib29sIGdldEVxdWl2YWxlbnRJQ21wKENtcEluc3Q6OlByZWRpY2F0ZSAmUHJlZCwgQVBJbnQgJlJIUykgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgbG93ZXIgdmFsdWUgZm9yIHRoaXMgcmFuZ2UuCisgIGNvbnN0IEFQSW50ICZnZXRMb3dlcigpIGNvbnN0IHsgcmV0dXJuIExvd2VyOyB9CisKKyAgLy8vIFJldHVybiB0aGUgdXBwZXIgdmFsdWUgZm9yIHRoaXMgcmFuZ2UuCisgIGNvbnN0IEFQSW50ICZnZXRVcHBlcigpIGNvbnN0IHsgcmV0dXJuIFVwcGVyOyB9CisKKyAgLy8vIEdldCB0aGUgYml0IHdpZHRoIG9mIHRoaXMgQ29uc3RhbnRSYW5nZS4KKyAgdWludDMyX3QgZ2V0Qml0V2lkdGgoKSBjb25zdCB7IHJldHVybiBMb3dlci5nZXRCaXRXaWR0aCgpOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgc2V0IGNvbnRhaW5zIGFsbCBvZiB0aGUgZWxlbWVudHMgcG9zc2libGUKKyAgLy8vIGZvciB0aGlzIGRhdGEtdHlwZS4KKyAgYm9vbCBpc0Z1bGxTZXQoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBzZXQgY29udGFpbnMgbm8gbWVtYmVycy4KKyAgYm9vbCBpc0VtcHR5U2V0KCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgc2V0IHdyYXBzIGFyb3VuZCB0aGUgdG9wIG9mIHRoZSByYW5nZS4KKyAgLy8vIEZvciBleGFtcGxlOiBbMTAwLCA4KS4KKyAgYm9vbCBpc1dyYXBwZWRTZXQoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBzZXQgd3JhcHMgYXJvdW5kIHRoZSBJTlRfTUlOIG9mCisgIC8vLyBpdHMgYml0d2lkdGguIEZvciBleGFtcGxlOiBpOCBbMTIwLCAxNDApLgorICBib29sIGlzU2lnbldyYXBwZWRTZXQoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCB2YWx1ZSBpcyBpbiB0aGUgc2V0LgorICBib29sIGNvbnRhaW5zKGNvbnN0IEFQSW50ICZWYWwpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgb3RoZXIgcmFuZ2UgaXMgYSBzdWJzZXQgb2YgdGhpcyBvbmUuCisgIGJvb2wgY29udGFpbnMoY29uc3QgQ29uc3RhbnRSYW5nZSAmQ1IpIGNvbnN0OworCisgIC8vLyBJZiB0aGlzIHNldCBjb250YWlucyBhIHNpbmdsZSBlbGVtZW50LCByZXR1cm4gaXQsIG90aGVyd2lzZSByZXR1cm4gbnVsbC4KKyAgY29uc3QgQVBJbnQgKmdldFNpbmdsZUVsZW1lbnQoKSBjb25zdCB7CisgICAgaWYgKFVwcGVyID09IExvd2VyICsgMSkKKyAgICAgIHJldHVybiAmTG93ZXI7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gSWYgdGhpcyBzZXQgY29udGFpbnMgYWxsIGJ1dCBhIHNpbmdsZSBlbGVtZW50LCByZXR1cm4gaXQsIG90aGVyd2lzZSByZXR1cm4KKyAgLy8vIG51bGwuCisgIGNvbnN0IEFQSW50ICpnZXRTaW5nbGVNaXNzaW5nRWxlbWVudCgpIGNvbnN0IHsKKyAgICBpZiAoTG93ZXIgPT0gVXBwZXIgKyAxKQorICAgICAgcmV0dXJuICZVcHBlcjsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHNldCBjb250YWlucyBleGFjdGx5IG9uZSBtZW1iZXIuCisgIGJvb2wgaXNTaW5nbGVFbGVtZW50KCkgY29uc3QgeyByZXR1cm4gZ2V0U2luZ2xlRWxlbWVudCgpICE9IG51bGxwdHI7IH0KKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBzZXQuCisgIEFQSW50IGdldFNldFNpemUoKSBjb25zdDsKKworICAvLy8gQ29tcGFyZSBzZXQgc2l6ZSBvZiB0aGlzIHJhbmdlIHdpdGggdGhlIHJhbmdlIENSLgorICBib29sIGlzU2l6ZVN0cmljdGx5U21hbGxlclRoYW4oY29uc3QgQ29uc3RhbnRSYW5nZSAmQ1IpIGNvbnN0OworCisgIC8vIENvbXBhcmUgc2V0IHNpemUgb2YgdGhpcyByYW5nZSB3aXRoIFZhbHVlLgorICBib29sIGlzU2l6ZUxhcmdlclRoYW4odWludDY0X3QgTWF4U2l6ZSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgbGFyZ2VzdCB1bnNpZ25lZCB2YWx1ZSBjb250YWluZWQgaW4gdGhlIENvbnN0YW50UmFuZ2UuCisgIEFQSW50IGdldFVuc2lnbmVkTWF4KCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgc21hbGxlc3QgdW5zaWduZWQgdmFsdWUgY29udGFpbmVkIGluIHRoZSBDb25zdGFudFJhbmdlLgorICBBUEludCBnZXRVbnNpZ25lZE1pbigpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIGxhcmdlc3Qgc2lnbmVkIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgQ29uc3RhbnRSYW5nZS4KKyAgQVBJbnQgZ2V0U2lnbmVkTWF4KCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgc21hbGxlc3Qgc2lnbmVkIHZhbHVlIGNvbnRhaW5lZCBpbiB0aGUgQ29uc3RhbnRSYW5nZS4KKyAgQVBJbnQgZ2V0U2lnbmVkTWluKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgcmFuZ2UgaXMgZXF1YWwgdG8gYW5vdGhlciByYW5nZS4KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENvbnN0YW50UmFuZ2UgJkNSKSBjb25zdCB7CisgICAgcmV0dXJuIExvd2VyID09IENSLkxvd2VyICYmIFVwcGVyID09IENSLlVwcGVyOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDb25zdGFudFJhbmdlICZDUikgY29uc3QgeworICAgIHJldHVybiAhb3BlcmF0b3I9PShDUik7CisgIH0KKworICAvLy8gU3VidHJhY3QgdGhlIHNwZWNpZmllZCBjb25zdGFudCBmcm9tIHRoZSBlbmRwb2ludHMgb2YgdGhpcyBjb25zdGFudCByYW5nZS4KKyAgQ29uc3RhbnRSYW5nZSBzdWJ0cmFjdChjb25zdCBBUEludCAmQ0kpIGNvbnN0OworCisgIC8vLyBTdWJ0cmFjdCB0aGUgc3BlY2lmaWVkIHJhbmdlIGZyb20gdGhpcyByYW5nZSAoYWthIHJlbGF0aXZlIGNvbXBsZW1lbnQgb2YKKyAgLy8vIHRoZSBzZXRzKS4KKyAgQ29uc3RhbnRSYW5nZSBkaWZmZXJlbmNlKGNvbnN0IENvbnN0YW50UmFuZ2UgJkNSKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSByYW5nZSB0aGF0IHJlc3VsdHMgZnJvbSB0aGUgaW50ZXJzZWN0aW9uIG9mCisgIC8vLyB0aGlzIHJhbmdlIHdpdGggYW5vdGhlciByYW5nZS4gIFRoZSByZXN1bHRhbnQgcmFuZ2UgaXMgZ3VhcmFudGVlZCB0bworICAvLy8gaW5jbHVkZSBhbGwgZWxlbWVudHMgY29udGFpbmVkIGluIGJvdGggaW5wdXQgcmFuZ2VzLCBhbmQgdG8gaGF2ZSB0aGUKKyAgLy8vIHNtYWxsZXN0IHBvc3NpYmxlIHNldCBzaXplIHRoYXQgZG9lcyBzby4gIEJlY2F1c2UgdGhlcmUgbWF5IGJlIHR3bworICAvLy8gaW50ZXJzZWN0aW9ucyB3aXRoIHRoZSBzYW1lIHNldCBzaXplLCBBLmludGVyc2VjdFdpdGgoQikgbWlnaHQgbm90CisgIC8vLyBiZSBlcXVhbCB0byBCLmludGVyc2VjdFdpdGgoQSkuCisgIENvbnN0YW50UmFuZ2UgaW50ZXJzZWN0V2l0aChjb25zdCBDb25zdGFudFJhbmdlICZDUikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgcmFuZ2UgdGhhdCByZXN1bHRzIGZyb20gdGhlIHVuaW9uIG9mIHRoaXMgcmFuZ2UKKyAgLy8vIHdpdGggYW5vdGhlciByYW5nZS4gIFRoZSByZXN1bHRhbnQgcmFuZ2UgaXMgZ3VhcmFudGVlZCB0byBpbmNsdWRlIHRoZQorICAvLy8gZWxlbWVudHMgb2YgYm90aCBzZXRzLCBidXQgbWF5IGNvbnRhaW4gbW9yZS4gIEZvciBleGFtcGxlLCBbMywgOSkgdW5pb24KKyAgLy8vIFsxMiwxNSkgaXMgWzMsIDE1KSwgd2hpY2ggaW5jbHVkZXMgOSwgMTAsIGFuZCAxMSwgd2hpY2ggd2VyZSBub3QgaW5jbHVkZWQKKyAgLy8vIGluIGVpdGhlciBzZXQgYmVmb3JlLgorICBDb25zdGFudFJhbmdlIHVuaW9uV2l0aChjb25zdCBDb25zdGFudFJhbmdlICZDUikgY29uc3Q7CisKKyAgLy8vIFJldHVybiBhIG5ldyByYW5nZSByZXByZXNlbnRpbmcgdGhlIHBvc3NpYmxlIHZhbHVlcyByZXN1bHRpbmcKKyAgLy8vIGZyb20gYW4gYXBwbGljYXRpb24gb2YgdGhlIHNwZWNpZmllZCBjYXN0IG9wZXJhdG9yIHRvIHRoaXMgcmFuZ2UuIFxwCisgIC8vLyBCaXRXaWR0aCBpcyB0aGUgdGFyZ2V0IGJpdHdpZHRoIG9mIHRoZSBjYXN0LiAgRm9yIGNhc3RzIHdoaWNoIGRvbid0CisgIC8vLyBjaGFuZ2UgYml0d2lkdGgsIGl0IG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIHNvdXJjZSBiaXR3aWR0aC4gIEZvciBjYXN0cworICAvLy8gd2hpY2ggZG8gY2hhbmdlIGJpdHdpZHRoLCB0aGUgYml0d2lkdGggbXVzdCBiZSBjb25zaXN0ZW50IHdpdGggdGhlCisgIC8vLyByZXF1ZXN0ZWQgY2FzdCBhbmQgc291cmNlIGJpdHdpZHRoLgorICBDb25zdGFudFJhbmdlIGNhc3RPcChJbnN0cnVjdGlvbjo6Q2FzdE9wcyBDYXN0T3AsCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEJpdFdpZHRoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgbmV3IHJhbmdlIGluIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB0eXBlLCB3aGljaCBtdXN0CisgIC8vLyBiZSBzdHJpY3RseSBsYXJnZXIgdGhhbiB0aGUgY3VycmVudCB0eXBlLiAgVGhlIHJldHVybmVkIHJhbmdlIHdpbGwKKyAgLy8vIGNvcnJlc3BvbmQgdG8gdGhlIHBvc3NpYmxlIHJhbmdlIG9mIHZhbHVlcyBpZiB0aGUgc291cmNlIHJhbmdlIGhhZCBiZWVuCisgIC8vLyB6ZXJvIGV4dGVuZGVkIHRvIEJpdFdpZHRoLgorICBDb25zdGFudFJhbmdlIHplcm9FeHRlbmQodWludDMyX3QgQml0V2lkdGgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBuZXcgcmFuZ2UgaW4gdGhlIHNwZWNpZmllZCBpbnRlZ2VyIHR5cGUsIHdoaWNoIG11c3QKKyAgLy8vIGJlIHN0cmljdGx5IGxhcmdlciB0aGFuIHRoZSBjdXJyZW50IHR5cGUuICBUaGUgcmV0dXJuZWQgcmFuZ2Ugd2lsbAorICAvLy8gY29ycmVzcG9uZCB0byB0aGUgcG9zc2libGUgcmFuZ2Ugb2YgdmFsdWVzIGlmIHRoZSBzb3VyY2UgcmFuZ2UgaGFkIGJlZW4KKyAgLy8vIHNpZ24gZXh0ZW5kZWQgdG8gQml0V2lkdGguCisgIENvbnN0YW50UmFuZ2Ugc2lnbkV4dGVuZCh1aW50MzJfdCBCaXRXaWR0aCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiBhIG5ldyByYW5nZSBpbiB0aGUgc3BlY2lmaWVkIGludGVnZXIgdHlwZSwgd2hpY2ggbXVzdCBiZQorICAvLy8gc3RyaWN0bHkgc21hbGxlciB0aGFuIHRoZSBjdXJyZW50IHR5cGUuICBUaGUgcmV0dXJuZWQgcmFuZ2Ugd2lsbAorICAvLy8gY29ycmVzcG9uZCB0byB0aGUgcG9zc2libGUgcmFuZ2Ugb2YgdmFsdWVzIGlmIHRoZSBzb3VyY2UgcmFuZ2UgaGFkIGJlZW4KKyAgLy8vIHRydW5jYXRlZCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCisgIENvbnN0YW50UmFuZ2UgdHJ1bmNhdGUodWludDMyX3QgQml0V2lkdGgpIGNvbnN0OworCisgIC8vLyBNYWtlIHRoaXMgcmFuZ2UgaGF2ZSB0aGUgYml0IHdpZHRoIGdpdmVuIGJ5IFxwIEJpdFdpZHRoLiBUaGUKKyAgLy8vIHZhbHVlIGlzIHplcm8gZXh0ZW5kZWQsIHRydW5jYXRlZCwgb3IgbGVmdCBhbG9uZSB0byBtYWtlIGl0IHRoYXQgd2lkdGguCisgIENvbnN0YW50UmFuZ2UgemV4dE9yVHJ1bmModWludDMyX3QgQml0V2lkdGgpIGNvbnN0OworCisgIC8vLyBNYWtlIHRoaXMgcmFuZ2UgaGF2ZSB0aGUgYml0IHdpZHRoIGdpdmVuIGJ5IFxwIEJpdFdpZHRoLiBUaGUKKyAgLy8vIHZhbHVlIGlzIHNpZ24gZXh0ZW5kZWQsIHRydW5jYXRlZCwgb3IgbGVmdCBhbG9uZSB0byBtYWtlIGl0IHRoYXQgd2lkdGguCisgIENvbnN0YW50UmFuZ2Ugc2V4dE9yVHJ1bmModWludDMyX3QgQml0V2lkdGgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBuZXcgcmFuZ2UgcmVwcmVzZW50aW5nIHRoZSBwb3NzaWJsZSB2YWx1ZXMgcmVzdWx0aW5nCisgIC8vLyBmcm9tIGFuIGFwcGxpY2F0aW9uIG9mIHRoZSBzcGVjaWZpZWQgYmluYXJ5IG9wZXJhdG9yIHRvIGFuIGxlZnQgaGFuZCBzaWRlCisgIC8vLyBvZiB0aGlzIHJhbmdlIGFuZCBhIHJpZ2h0IGhhbmQgc2lkZSBvZiBccCBPdGhlci4KKyAgQ29uc3RhbnRSYW5nZSBiaW5hcnlPcChJbnN0cnVjdGlvbjo6QmluYXJ5T3BzIEJpbk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbnN0YW50UmFuZ2UgJk90aGVyKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgbmV3IHJhbmdlIHJlcHJlc2VudGluZyB0aGUgcG9zc2libGUgdmFsdWVzIHJlc3VsdGluZworICAvLy8gZnJvbSBhbiBhZGRpdGlvbiBvZiBhIHZhbHVlIGluIHRoaXMgcmFuZ2UgYW5kIGEgdmFsdWUgaW4gXHAgT3RoZXIuCisgIENvbnN0YW50UmFuZ2UgYWRkKGNvbnN0IENvbnN0YW50UmFuZ2UgJk90aGVyKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgbmV3IHJhbmdlIHJlcHJlc2VudGluZyB0aGUgcG9zc2libGUgdmFsdWVzIHJlc3VsdGluZyBmcm9tIGEKKyAgLy8vIGtub3duIE5TVyBhZGRpdGlvbiBvZiBhIHZhbHVlIGluIHRoaXMgcmFuZ2UgYW5kIFxwIE90aGVyIGNvbnN0YW50LgorICBDb25zdGFudFJhbmdlIGFkZFdpdGhOb1NpZ25lZFdyYXAoY29uc3QgQVBJbnQgJk90aGVyKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgbmV3IHJhbmdlIHJlcHJlc2VudGluZyB0aGUgcG9zc2libGUgdmFsdWVzIHJlc3VsdGluZworICAvLy8gZnJvbSBhIHN1YnRyYWN0aW9uIG9mIGEgdmFsdWUgaW4gdGhpcyByYW5nZSBhbmQgYSB2YWx1ZSBpbiBccCBPdGhlci4KKyAgQ29uc3RhbnRSYW5nZSBzdWIoY29uc3QgQ29uc3RhbnRSYW5nZSAmT3RoZXIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBuZXcgcmFuZ2UgcmVwcmVzZW50aW5nIHRoZSBwb3NzaWJsZSB2YWx1ZXMgcmVzdWx0aW5nCisgIC8vLyBmcm9tIGEgbXVsdGlwbGljYXRpb24gb2YgYSB2YWx1ZSBpbiB0aGlzIHJhbmdlIGFuZCBhIHZhbHVlIGluIFxwIE90aGVyLAorICAvLy8gdHJlYXRpbmcgYm90aCB0aGlzIGFuZCBccCBPdGhlciBhcyB1bnNpZ25lZCByYW5nZXMuCisgIENvbnN0YW50UmFuZ2UgbXVsdGlwbHkoY29uc3QgQ29uc3RhbnRSYW5nZSAmT3RoZXIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBuZXcgcmFuZ2UgcmVwcmVzZW50aW5nIHRoZSBwb3NzaWJsZSB2YWx1ZXMgcmVzdWx0aW5nCisgIC8vLyBmcm9tIGEgc2lnbmVkIG1heGltdW0gb2YgYSB2YWx1ZSBpbiB0aGlzIHJhbmdlIGFuZCBhIHZhbHVlIGluIFxwIE90aGVyLgorICBDb25zdGFudFJhbmdlIHNtYXgoY29uc3QgQ29uc3RhbnRSYW5nZSAmT3RoZXIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBuZXcgcmFuZ2UgcmVwcmVzZW50aW5nIHRoZSBwb3NzaWJsZSB2YWx1ZXMgcmVzdWx0aW5nCisgIC8vLyBmcm9tIGFuIHVuc2lnbmVkIG1heGltdW0gb2YgYSB2YWx1ZSBpbiB0aGlzIHJhbmdlIGFuZCBhIHZhbHVlIGluIFxwIE90aGVyLgorICBDb25zdGFudFJhbmdlIHVtYXgoY29uc3QgQ29uc3RhbnRSYW5nZSAmT3RoZXIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBuZXcgcmFuZ2UgcmVwcmVzZW50aW5nIHRoZSBwb3NzaWJsZSB2YWx1ZXMgcmVzdWx0aW5nCisgIC8vLyBmcm9tIGEgc2lnbmVkIG1pbmltdW0gb2YgYSB2YWx1ZSBpbiB0aGlzIHJhbmdlIGFuZCBhIHZhbHVlIGluIFxwIE90aGVyLgorICBDb25zdGFudFJhbmdlIHNtaW4oY29uc3QgQ29uc3RhbnRSYW5nZSAmT3RoZXIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBuZXcgcmFuZ2UgcmVwcmVzZW50aW5nIHRoZSBwb3NzaWJsZSB2YWx1ZXMgcmVzdWx0aW5nCisgIC8vLyBmcm9tIGFuIHVuc2lnbmVkIG1pbmltdW0gb2YgYSB2YWx1ZSBpbiB0aGlzIHJhbmdlIGFuZCBhIHZhbHVlIGluIFxwIE90aGVyLgorICBDb25zdGFudFJhbmdlIHVtaW4oY29uc3QgQ29uc3RhbnRSYW5nZSAmT3RoZXIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBuZXcgcmFuZ2UgcmVwcmVzZW50aW5nIHRoZSBwb3NzaWJsZSB2YWx1ZXMgcmVzdWx0aW5nCisgIC8vLyBmcm9tIGFuIHVuc2lnbmVkIGRpdmlzaW9uIG9mIGEgdmFsdWUgaW4gdGhpcyByYW5nZSBhbmQgYSB2YWx1ZSBpbgorICAvLy8gXHAgT3RoZXIuCisgIENvbnN0YW50UmFuZ2UgdWRpdihjb25zdCBDb25zdGFudFJhbmdlICZPdGhlcikgY29uc3Q7CisKKyAgLy8vIFJldHVybiBhIG5ldyByYW5nZSByZXByZXNlbnRpbmcgdGhlIHBvc3NpYmxlIHZhbHVlcyByZXN1bHRpbmcKKyAgLy8vIGZyb20gYSBiaW5hcnktYW5kIG9mIGEgdmFsdWUgaW4gdGhpcyByYW5nZSBieSBhIHZhbHVlIGluIFxwIE90aGVyLgorICBDb25zdGFudFJhbmdlIGJpbmFyeUFuZChjb25zdCBDb25zdGFudFJhbmdlICZPdGhlcikgY29uc3Q7CisKKyAgLy8vIFJldHVybiBhIG5ldyByYW5nZSByZXByZXNlbnRpbmcgdGhlIHBvc3NpYmxlIHZhbHVlcyByZXN1bHRpbmcKKyAgLy8vIGZyb20gYSBiaW5hcnktb3Igb2YgYSB2YWx1ZSBpbiB0aGlzIHJhbmdlIGJ5IGEgdmFsdWUgaW4gXHAgT3RoZXIuCisgIENvbnN0YW50UmFuZ2UgYmluYXJ5T3IoY29uc3QgQ29uc3RhbnRSYW5nZSAmT3RoZXIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBuZXcgcmFuZ2UgcmVwcmVzZW50aW5nIHRoZSBwb3NzaWJsZSB2YWx1ZXMgcmVzdWx0aW5nCisgIC8vLyBmcm9tIGEgbGVmdCBzaGlmdCBvZiBhIHZhbHVlIGluIHRoaXMgcmFuZ2UgYnkgYSB2YWx1ZSBpbiBccCBPdGhlci4KKyAgLy8vIFRPRE86IFRoaXMgaXNuJ3QgZnVsbHkgaW1wbGVtZW50ZWQgeWV0LgorICBDb25zdGFudFJhbmdlIHNobChjb25zdCBDb25zdGFudFJhbmdlICZPdGhlcikgY29uc3Q7CisKKyAgLy8vIFJldHVybiBhIG5ldyByYW5nZSByZXByZXNlbnRpbmcgdGhlIHBvc3NpYmxlIHZhbHVlcyByZXN1bHRpbmcgZnJvbSBhCisgIC8vLyBsb2dpY2FsIHJpZ2h0IHNoaWZ0IG9mIGEgdmFsdWUgaW4gdGhpcyByYW5nZSBhbmQgYSB2YWx1ZSBpbiBccCBPdGhlci4KKyAgQ29uc3RhbnRSYW5nZSBsc2hyKGNvbnN0IENvbnN0YW50UmFuZ2UgJk90aGVyKSBjb25zdDsKKworICAvLy8gUmV0dXJuIGEgbmV3IHJhbmdlIHJlcHJlc2VudGluZyB0aGUgcG9zc2libGUgdmFsdWVzIHJlc3VsdGluZyBmcm9tIGEKKyAgLy8vIGFyaXRobWV0aWMgcmlnaHQgc2hpZnQgb2YgYSB2YWx1ZSBpbiB0aGlzIHJhbmdlIGFuZCBhIHZhbHVlIGluIFxwIE90aGVyLgorICBDb25zdGFudFJhbmdlIGFzaHIoY29uc3QgQ29uc3RhbnRSYW5nZSAmT3RoZXIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBuZXcgcmFuZ2UgdGhhdCBpcyB0aGUgbG9naWNhbCBub3Qgb2YgdGhlIGN1cnJlbnQgc2V0LgorICBDb25zdGFudFJhbmdlIGludmVyc2UoKSBjb25zdDsKKworICAvLy8gUHJpbnQgb3V0IHRoZSBib3VuZHMgdG8gYSBzdHJlYW0uCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLy8gQWxsb3cgcHJpbnRpbmcgZnJvbSBhIGRlYnVnZ2VyIGVhc2lseS4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBDb25zdGFudFJhbmdlICZDUikgeworICBDUi5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKworLy8vIFBhcnNlIG91dCBhIGNvbnNlcnZhdGl2ZSBDb25zdGFudFJhbmdlIGZyb20gIXJhbmdlIG1ldGFkYXRhLgorLy8vCisvLy8gRS5nLiBpZiBSYW5nZU1EIGlzICF7aTMyIDAsIGkzMiAxMCwgaTMyIDE1LCBpMzIgMjB9IHRoZW4gcmV0dXJuIFswLCAyMCkuCitDb25zdGFudFJhbmdlIGdldENvbnN0YW50UmFuZ2VGcm9tTWV0YWRhdGEoY29uc3QgTUROb2RlICZSYW5nZU1EKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfQ09OU1RBTlRSQU5HRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0NvbnN0YW50cy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Db25zdGFudHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTc1OTZkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Db25zdGFudHMuaApAQCAtMCwwICsxLDEyOTkgQEAKKy8vPT09LS0gbGx2bS9Db25zdGFudHMuaCAtIENvbnN0YW50IGNsYXNzIHN1YmNsYXNzIGRlZmluaXRpb25zIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIEBmaWxlCisvLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbnMgZm9yIHRoZSBzdWJjbGFzc2VzIG9mIENvbnN0YW50LAorLy8vIHdoaWNoIHJlcHJlc2VudCB0aGUgZGlmZmVyZW50IGZsYXZvcnMgb2YgY29uc3RhbnQgdmFsdWVzIHRoYXQgbGl2ZSBpbiBMTFZNLgorLy8vIE5vdGUgdGhhdCBDb25zdGFudHMgYXJlIGltbXV0YWJsZSAob25jZSBjcmVhdGVkIHRoZXkgbmV2ZXIgY2hhbmdlKSBhbmQgYXJlCisvLy8gZnVsbHkgc2hhcmVkIGJ5IHN0cnVjdHVyYWwgZXF1aXZhbGVuY2UuICBUaGlzIG1lYW5zIHRoYXQgdHdvIHN0cnVjdHVyYWxseQorLy8vIGVxdWl2YWxlbnQgY29uc3RhbnRzIHdpbGwgYWx3YXlzIGhhdmUgdGhlIHNhbWUgYWRkcmVzcy4gIENvbnN0YW50cyBhcmUKKy8vLyBjcmVhdGVkIG9uIGRlbWFuZCBhcyBuZWVkZWQgYW5kIG5ldmVyIGRlbGV0ZWQ6IHRodXMgY2xpZW50cyBkb24ndCBoYXZlIHRvCisvLy8gd29ycnkgYWJvdXQgdGhlIGxpZmV0aW1lIG9mIHRoZSBvYmplY3RzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9DT05TVEFOVFNfSAorI2RlZmluZSBMTFZNX0lSX0NPTlNUQU5UU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEZsb2F0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvT3BlcmFuZFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvVXNlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQXJyYXlUeXBlOworY2xhc3MgSW50ZWdlclR5cGU7CitjbGFzcyBQb2ludGVyVHlwZTsKK2NsYXNzIFNlcXVlbnRpYWxUeXBlOworY2xhc3MgU3RydWN0VHlwZTsKK2NsYXNzIFZlY3RvclR5cGU7Cit0ZW1wbGF0ZSA8Y2xhc3MgQ29uc3RhbnRDbGFzcz4gc3RydWN0IENvbnN0YW50QWdncktleVR5cGU7CisKKy8vLyBCYXNlIGNsYXNzIGZvciBjb25zdGFudHMgd2l0aCBubyBvcGVyYW5kcy4KKy8vLworLy8vIFRoZXNlIGNvbnN0YW50cyBoYXZlIG5vIG9wZXJhbmRzOyB0aGV5IHJlcHJlc2VudCB0aGVpciBkYXRhIGRpcmVjdGx5LgorLy8vIFNpbmNlIHRoZXkgY2FuIGJlIGluIHVzZSBieSB1bnJlbGF0ZWQgbW9kdWxlcyAoYW5kIGFyZSBuZXZlciBiYXNlZCBvbgorLy8vIEdsb2JhbFZhbHVlcyksIGl0IG5ldmVyIG1ha2VzIHNlbnNlIHRvIFJBVVcgdGhlbS4KK2NsYXNzIENvbnN0YW50RGF0YSA6IHB1YmxpYyBDb25zdGFudCB7CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudDsKKworICBWYWx1ZSAqaGFuZGxlT3BlcmFuZENoYW5nZUltcGwoVmFsdWUgKkZyb20sIFZhbHVlICpUbykgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIkNvbnN0YW50IGRhdGEgZG9lcyBub3QgaGF2ZSBvcGVyYW5kcyEiKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IENvbnN0YW50RGF0YShUeXBlICpUeSwgVmFsdWVUeSBWVCkgOiBDb25zdGFudChUeSwgVlQsIG51bGxwdHIsIDApIHt9CisKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSB7IHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMCk7IH0KKworcHVibGljOgorICBDb25zdGFudERhdGEoY29uc3QgQ29uc3RhbnREYXRhICYpID0gZGVsZXRlOworCisgIC8vLyBNZXRob2RzIHRvIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3QuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID49IENvbnN0YW50RGF0YUZpcnN0VmFsICYmCisgICAgICAgICAgIFYtPmdldFZhbHVlSUQoKSA8PSBDb25zdGFudERhdGFMYXN0VmFsOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFRoaXMgaXMgdGhlIHNoYXJlZCBjbGFzcyBvZiBib29sZWFuIGFuZCBpbnRlZ2VyIGNvbnN0YW50cy4gVGhpcyBjbGFzcworLy8vIHJlcHJlc2VudHMgYm90aCBib29sZWFuIGFuZCBpbnRlZ3JhbCBjb25zdGFudHMuCisvLy8gQGJyaWVmIENsYXNzIGZvciBjb25zdGFudCBpbnRlZ2Vycy4KK2NsYXNzIENvbnN0YW50SW50IGZpbmFsIDogcHVibGljIENvbnN0YW50RGF0YSB7CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudDsKKworICBBUEludCBWYWw7CisKKyAgQ29uc3RhbnRJbnQoSW50ZWdlclR5cGUgKlR5LCBjb25zdCBBUEludCYgVik7CisKKyAgdm9pZCBkZXN0cm95Q29uc3RhbnRJbXBsKCk7CisKK3B1YmxpYzoKKyAgQ29uc3RhbnRJbnQoY29uc3QgQ29uc3RhbnRJbnQgJikgPSBkZWxldGU7CisKKyAgc3RhdGljIENvbnN0YW50SW50ICpnZXRUcnVlKExMVk1Db250ZXh0ICZDb250ZXh0KTsKKyAgc3RhdGljIENvbnN0YW50SW50ICpnZXRGYWxzZShMTFZNQ29udGV4dCAmQ29udGV4dCk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0VHJ1ZShUeXBlICpUeSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RmFsc2UoVHlwZSAqVHkpOworCisgIC8vLyBJZiBUeSBpcyBhIHZlY3RvciB0eXBlLCByZXR1cm4gYSBDb25zdGFudCB3aXRoIGEgc3BsYXQgb2YgdGhlIGdpdmVuCisgIC8vLyB2YWx1ZS4gT3RoZXJ3aXNlIHJldHVybiBhIENvbnN0YW50SW50IGZvciB0aGUgZ2l2ZW4gdmFsdWUuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0KFR5cGUgKlR5LCB1aW50NjRfdCBWLCBib29sIGlzU2lnbmVkID0gZmFsc2UpOworCisgIC8vLyBSZXR1cm4gYSBDb25zdGFudEludCB3aXRoIHRoZSBzcGVjaWZpZWQgaW50ZWdlciB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gdHlwZS4gSWYgdGhlIHR5cGUgaXMgd2lkZXIgdGhhbiA2NCBiaXRzLCB0aGUgdmFsdWUgd2lsbCBiZSB6ZXJvLWV4dGVuZGVkCisgIC8vLyB0byBmaXQgdGhlIHR5cGUsIHVubGVzcyBpc1NpZ25lZCBpcyB0cnVlLCBpbiB3aGljaCBjYXNlIHRoZSB2YWx1ZSB3aWxsCisgIC8vLyBiZSBpbnRlcnByZXRlZCBhcyBhIDY0LWJpdCBzaWduZWQgaW50ZWdlciBhbmQgc2lnbi1leHRlbmRlZCB0byBmaXQKKyAgLy8vIHRoZSB0eXBlLgorICAvLy8gQGJyaWVmIEdldCBhIENvbnN0YW50SW50IGZvciBhIHNwZWNpZmljIHZhbHVlLgorICBzdGF0aWMgQ29uc3RhbnRJbnQgKmdldChJbnRlZ2VyVHlwZSAqVHksIHVpbnQ2NF90IFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNTaWduZWQgPSBmYWxzZSk7CisKKyAgLy8vIFJldHVybiBhIENvbnN0YW50SW50IHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLiBUaGUKKyAgLy8vIHZhbHVlIFYgd2lsbCBiZSBjYW5vbmljYWxpemVkIHRvIGEgYW4gdW5zaWduZWQgQVBJbnQuIEFjY2Vzc2luZyBpdCB3aXRoCisgIC8vLyBlaXRoZXIgZ2V0U0V4dFZhbHVlKCkgb3IgZ2V0WkV4dFZhbHVlKCkgd2lsbCB5aWVsZCBhIGNvcnJlY3RseSBzaXplZCBhbmQKKyAgLy8vIHNpZ25lZCB2YWx1ZSBmb3IgdGhlIHR5cGUgVHkuCisgIC8vLyBAYnJpZWYgR2V0IGEgQ29uc3RhbnRJbnQgZm9yIGEgc3BlY2lmaWMgc2lnbmVkIHZhbHVlLgorICBzdGF0aWMgQ29uc3RhbnRJbnQgKmdldFNpZ25lZChJbnRlZ2VyVHlwZSAqVHksIGludDY0X3QgVik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0U2lnbmVkKFR5cGUgKlR5LCBpbnQ2NF90IFYpOworCisgIC8vLyBSZXR1cm4gYSBDb25zdGFudEludCB3aXRoIHRoZSBzcGVjaWZpZWQgdmFsdWUgYW5kIGFuIGltcGxpZWQgVHlwZS4gVGhlCisgIC8vLyB0eXBlIGlzIHRoZSBpbnRlZ2VyIHR5cGUgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUgYml0IHdpZHRoIG9mIHRoZSB2YWx1ZS4KKyAgc3RhdGljIENvbnN0YW50SW50ICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIGNvbnN0IEFQSW50ICZWKTsKKworICAvLy8gUmV0dXJuIGEgQ29uc3RhbnRJbnQgY29uc3RydWN0ZWQgZnJvbSB0aGUgc3RyaW5nIHN0clN0YXJ0IHdpdGggdGhlIGdpdmVuCisgIC8vLyByYWRpeC4KKyAgc3RhdGljIENvbnN0YW50SW50ICpnZXQoSW50ZWdlclR5cGUgKlR5LCBTdHJpbmdSZWYgU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHJhZGl4KTsKKworICAvLy8gSWYgVHkgaXMgYSB2ZWN0b3IgdHlwZSwgcmV0dXJuIGEgQ29uc3RhbnQgd2l0aCBhIHNwbGF0IG9mIHRoZSBnaXZlbgorICAvLy8gdmFsdWUuIE90aGVyd2lzZSByZXR1cm4gYSBDb25zdGFudEludCBmb3IgdGhlIGdpdmVuIHZhbHVlLgorICBzdGF0aWMgQ29uc3RhbnQgKmdldChUeXBlKiBUeSwgY29uc3QgQVBJbnQmIFYpOworCisgIC8vLyBSZXR1cm4gdGhlIGNvbnN0YW50IGFzIGFuIEFQSW50IHZhbHVlIHJlZmVyZW5jZS4gVGhpcyBhbGxvd3MgY2xpZW50cyB0bworICAvLy8gb2J0YWluIGEgZnVsbC1wcmVjaXNpb24gY29weSBvZiB0aGUgdmFsdWUuCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBjb25zdGFudCdzIHZhbHVlLgorICBpbmxpbmUgY29uc3QgQVBJbnQgJmdldFZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBWYWw7CisgIH0KKworICAvLy8gZ2V0Qml0V2lkdGggLSBSZXR1cm4gdGhlIGJpdHdpZHRoIG9mIHRoaXMgY29uc3RhbnQuCisgIHVuc2lnbmVkIGdldEJpdFdpZHRoKCkgY29uc3QgeyByZXR1cm4gVmFsLmdldEJpdFdpZHRoKCk7IH0KKworICAvLy8gUmV0dXJuIHRoZSBjb25zdGFudCBhcyBhIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlIGFmdGVyIGl0CisgIC8vLyBoYXMgYmVlbiB6ZXJvIGV4dGVuZGVkIGFzIGFwcHJvcHJpYXRlIGZvciB0aGUgdHlwZSBvZiB0aGlzIGNvbnN0YW50LiBOb3RlCisgIC8vLyB0aGF0IHRoaXMgbWV0aG9kIGNhbiBhc3NlcnQgaWYgdGhlIHZhbHVlIGRvZXMgbm90IGZpdCBpbiA2NCBiaXRzLgorICAvLy8gQGJyaWVmIFJldHVybiB0aGUgemVybyBleHRlbmRlZCB2YWx1ZS4KKyAgaW5saW5lIHVpbnQ2NF90IGdldFpFeHRWYWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsLmdldFpFeHRWYWx1ZSgpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgY29uc3RhbnQgYXMgYSA2NC1iaXQgaW50ZWdlciB2YWx1ZSBhZnRlciBpdCBoYXMgYmVlbiBzaWduCisgIC8vLyBleHRlbmRlZCBhcyBhcHByb3ByaWF0ZSBmb3IgdGhlIHR5cGUgb2YgdGhpcyBjb25zdGFudC4gTm90ZSB0aGF0CisgIC8vLyB0aGlzIG1ldGhvZCBjYW4gYXNzZXJ0IGlmIHRoZSB2YWx1ZSBkb2VzIG5vdCBmaXQgaW4gNjQgYml0cy4KKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIHNpZ24gZXh0ZW5kZWQgdmFsdWUuCisgIGlubGluZSBpbnQ2NF90IGdldFNFeHRWYWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsLmdldFNFeHRWYWx1ZSgpOworICB9CisKKyAgLy8vIEEgaGVscGVyIG1ldGhvZCB0aGF0IGNhbiBiZSB1c2VkIHRvIGRldGVybWluZSBpZiB0aGUgY29uc3RhbnQgY29udGFpbmVkCisgIC8vLyB3aXRoaW4gaXMgZXF1YWwgdG8gYSBjb25zdGFudC4gIFRoaXMgb25seSB3b3JrcyBmb3IgdmVyeSBzbWFsbCB2YWx1ZXMsCisgIC8vLyBiZWNhdXNlIHRoaXMgaXMgYWxsIHRoYXQgY2FuIGJlIHJlcHJlc2VudGVkIHdpdGggYWxsIHR5cGVzLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGlzIGNvbnN0YW50J3MgdmFsdWUgaXMgc2FtZSBhcyBhbiB1bnNpZ25lZCBjaGFyLgorICBib29sIGVxdWFsc0ludCh1aW50NjRfdCBWKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbCA9PSBWOworICB9CisKKyAgLy8vIGdldFR5cGUgLSBTcGVjaWFsaXplIHRoZSBnZXRUeXBlKCkgbWV0aG9kIHRvIGFsd2F5cyByZXR1cm4gYW4gSW50ZWdlclR5cGUsCisgIC8vLyB3aGljaCByZWR1Y2VzIHRoZSBhbW91bnQgb2YgY2FzdGluZyBuZWVkZWQgaW4gcGFydHMgb2YgdGhlIGNvbXBpbGVyLgorICAvLy8KKyAgaW5saW5lIEludGVnZXJUeXBlICpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PEludGVnZXJUeXBlPihWYWx1ZTo6Z2V0VHlwZSgpKTsKKyAgfQorCisgIC8vLyBUaGlzIHN0YXRpYyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoZSB0eXBlIFR5IGlzIGJpZyBlbm91Z2ggdG8KKyAgLy8vIHJlcHJlc2VudCB0aGUgdmFsdWUgVi4gVGhpcyBjYW4gYmUgdXNlZCB0byBhdm9pZCBoYXZpbmcgdGhlIGdldCBtZXRob2QKKyAgLy8vIGFzc2VydCB3aGVuIFYgaXMgbGFyZ2VyIHRoYW4gVHkgY2FuIHJlcHJlc2VudC4gTm90ZSB0aGF0IHRoZXJlIGFyZSB0d28KKyAgLy8vIHZlcnNpb25zIG9mIHRoaXMgbWV0aG9kLCBvbmUgZm9yIHVuc2lnbmVkIGFuZCBvbmUgZm9yIHNpZ25lZCBpbnRlZ2Vycy4KKyAgLy8vIEFsdGhvdWdoIENvbnN0YW50SW50IGNhbm9uaWNhbGl6ZXMgZXZlcnl0aGluZyB0byBhbiB1bnNpZ25lZCBpbnRlZ2VyLAorICAvLy8gdGhlIHNpZ25lZCB2ZXJzaW9uIGF2b2lkcyBjYWxsZXJzIGhhdmluZyB0byBjb252ZXJ0IGEgc2lnbmVkIHF1YW50aXR5CisgIC8vLyB0byB0aGUgYXBwcm9wcmlhdGUgdW5zaWduZWQgdHlwZSBiZWZvcmUgY2FsbGluZyB0aGUgbWV0aG9kLgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZiBWIGlzIGEgdmFsaWQgdmFsdWUgZm9yIHR5cGUgVHkKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIHZhbHVlIGlzIGluIHJhbmdlIGZvciB0aGUgZ2l2ZW4gdHlwZS4KKyAgc3RhdGljIGJvb2wgaXNWYWx1ZVZhbGlkRm9yVHlwZShUeXBlICpUeSwgdWludDY0X3QgVik7CisgIHN0YXRpYyBib29sIGlzVmFsdWVWYWxpZEZvclR5cGUoVHlwZSAqVHksIGludDY0X3QgVik7CisKKyAgYm9vbCBpc05lZ2F0aXZlKCkgY29uc3QgeyByZXR1cm4gVmFsLmlzTmVnYXRpdmUoKTsgfQorCisgIC8vLyBUaGlzIGlzIGp1c3QgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gbWFrZSBjbGllbnQgY29kZSBzbWFsbGVyIGZvciBhCisgIC8vLyBjb21tb24gY29kZS4gSXQgYWxzbyBjb3JyZWN0bHkgcGVyZm9ybXMgdGhlIGNvbXBhcmlzb24gd2l0aG91dCB0aGUKKyAgLy8vIHBvdGVudGlhbCBmb3IgYW4gYXNzZXJ0aW9uIGZyb20gZ2V0WkV4dFZhbHVlKCkuCisgIGJvb2wgaXNaZXJvKCkgY29uc3QgeworICAgIHJldHVybiBWYWwuaXNOdWxsVmFsdWUoKTsKKyAgfQorCisgIC8vLyBUaGlzIGlzIGp1c3QgYSBjb252ZW5pZW5jZSBtZXRob2QgdG8gbWFrZSBjbGllbnQgY29kZSBzbWFsbGVyIGZvciBhCisgIC8vLyBjb21tb24gY2FzZS4gSXQgYWxzbyBjb3JyZWN0bHkgcGVyZm9ybXMgdGhlIGNvbXBhcmlzb24gd2l0aG91dCB0aGUKKyAgLy8vIHBvdGVudGlhbCBmb3IgYW4gYXNzZXJ0aW9uIGZyb20gZ2V0WkV4dFZhbHVlKCkuCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBpcyBvbmUuCisgIGJvb2wgaXNPbmUoKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbC5pc09uZVZhbHVlKCk7CisgIH0KKworICAvLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0cnVlIGlmZiBldmVyeSBiaXQgaW4gdGhpcyBjb25zdGFudCBpcyBzZXQKKyAgLy8vIHRvIHRydWUuCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmZiB0aGlzIGNvbnN0YW50J3MgYml0cyBhcmUgYWxsIHNldCB0byB0cnVlLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgdmFsdWUgaXMgYWxsIG9uZXMuCisgIGJvb2wgaXNNaW51c09uZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsLmlzQWxsT25lc1ZhbHVlKCk7CisgIH0KKworICAvLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHJldHVybiB0cnVlIGlmZiB0aGlzIGNvbnN0YW50IHJlcHJlc2VudHMgdGhlIGxhcmdlc3QKKyAgLy8vIHZhbHVlIHRoYXQgbWF5IGJlIHJlcHJlc2VudGVkIGJ5IHRoZSBjb25zdGFudCdzIHR5cGUuCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmZiB0aGlzIGlzIHRoZSBsYXJnZXN0IHZhbHVlIHRoYXQgbWF5IGJlIHJlcHJlc2VudGVkCisgIC8vLyBieSB0aGlzIHR5cGUuCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBpcyBtYXhpbWFsLgorICBib29sIGlzTWF4VmFsdWUoYm9vbCBpc1NpZ25lZCkgY29uc3QgeworICAgIGlmIChpc1NpZ25lZCkKKyAgICAgIHJldHVybiBWYWwuaXNNYXhTaWduZWRWYWx1ZSgpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBWYWwuaXNNYXhWYWx1ZSgpOworICB9CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSBpZmYgdGhpcyBjb25zdGFudCByZXByZXNlbnRzIHRoZSBzbWFsbGVzdAorICAvLy8gdmFsdWUgdGhhdCBtYXkgYmUgcmVwcmVzZW50ZWQgYnkgdGhpcyBjb25zdGFudCdzIHR5cGUuCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgdGhlIHNtYWxsZXN0IHZhbHVlIHRoYXQgbWF5IGJlIHJlcHJlc2VudGVkIGJ5CisgIC8vLyB0aGlzIHR5cGUuCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBpcyBtaW5pbWFsLgorICBib29sIGlzTWluVmFsdWUoYm9vbCBpc1NpZ25lZCkgY29uc3QgeworICAgIGlmIChpc1NpZ25lZCkKKyAgICAgIHJldHVybiBWYWwuaXNNaW5TaWduZWRWYWx1ZSgpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBWYWwuaXNNaW5WYWx1ZSgpOworICB9CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gdHJ1ZSBpZmYgdGhpcyBjb25zdGFudCByZXByZXNlbnRzIGEgdmFsdWUgd2l0aAorICAvLy8gYWN0aXZlIGJpdHMgYmlnZ2VyIHRoYW4gNjQgYml0cyBvciBhIHZhbHVlIGdyZWF0ZXIgdGhhbiB0aGUgZ2l2ZW4gdWludDY0X3QKKyAgLy8vIHZhbHVlLgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBjb25zdGFudCBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBudW1iZXIuCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSB2YWx1ZSBpcyBncmVhdGVyIG9yIGVxdWFsIHRvIHRoZSBnaXZlbiBudW1iZXIuCisgIGJvb2wgdWdlKHVpbnQ2NF90IE51bSkgY29uc3QgeworICAgIHJldHVybiBWYWwudWdlKE51bSk7CisgIH0KKworICAvLy8gZ2V0TGltaXRlZFZhbHVlIC0gSWYgdGhlIHZhbHVlIGlzIHNtYWxsZXIgdGhhbiB0aGUgc3BlY2lmaWVkIGxpbWl0LAorICAvLy8gcmV0dXJuIGl0LCBvdGhlcndpc2UgcmV0dXJuIHRoZSBsaW1pdCB2YWx1ZS4gIFRoaXMgY2F1c2VzIHRoZSB2YWx1ZQorICAvLy8gdG8gc2F0dXJhdGUgdG8gdGhlIGxpbWl0LgorICAvLy8gQHJldHVybnMgdGhlIG1pbiBvZiB0aGUgdmFsdWUgb2YgdGhlIGNvbnN0YW50IGFuZCB0aGUgc3BlY2lmaWVkIHZhbHVlCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBjb25zdGFudCdzIHZhbHVlIHdpdGggYSBzYXR1cmF0aW9uIGxpbWl0CisgIHVpbnQ2NF90IGdldExpbWl0ZWRWYWx1ZSh1aW50NjRfdCBMaW1pdCA9IH4wVUxMKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbC5nZXRMaW1pdGVkVmFsdWUoTGltaXQpOworICB9CisKKyAgLy8vIEBicmllZiBNZXRob2RzIHRvIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3QuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IENvbnN0YW50SW50VmFsOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIENvbnN0YW50RlAgLSBGbG9hdGluZyBQb2ludCBWYWx1ZXMgW2Zsb2F0LCBkb3VibGVdCisvLy8KK2NsYXNzIENvbnN0YW50RlAgZmluYWwgOiBwdWJsaWMgQ29uc3RhbnREYXRhIHsKKyAgZnJpZW5kIGNsYXNzIENvbnN0YW50OworCisgIEFQRmxvYXQgVmFsOworCisgIENvbnN0YW50RlAoVHlwZSAqVHksIGNvbnN0IEFQRmxvYXQmIFYpOworCisgIHZvaWQgZGVzdHJveUNvbnN0YW50SW1wbCgpOworCitwdWJsaWM6CisgIENvbnN0YW50RlAoY29uc3QgQ29uc3RhbnRGUCAmKSA9IGRlbGV0ZTsKKworICAvLy8gRmxvYXRpbmcgcG9pbnQgbmVnYXRpb24gbXVzdCBiZSBpbXBsZW1lbnRlZCB3aXRoIGYoeCkgPSAtMC4wIC0geC4gVGhpcworICAvLy8gbWV0aG9kIHJldHVybnMgdGhlIG5lZ2F0aXZlIHplcm8gY29uc3RhbnQgZm9yIGZsb2F0aW5nIHBvaW50IG9yIHZlY3RvcgorICAvLy8gZmxvYXRpbmcgcG9pbnQgdHlwZXM7IGZvciBhbGwgb3RoZXIgdHlwZXMsIGl0IHJldHVybnMgdGhlIG51bGwgdmFsdWUuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0WmVyb1ZhbHVlRm9yTmVnYXRpb24oVHlwZSAqVHkpOworCisgIC8vLyBUaGlzIHJldHVybnMgYSBDb25zdGFudEZQLCBvciBhIHZlY3RvciBjb250YWluaW5nIGEgc3BsYXQgb2YgYSBDb25zdGFudEZQLAorICAvLy8gZm9yIHRoZSBzcGVjaWZpZWQgdmFsdWUgaW4gdGhlIHNwZWNpZmllZCB0eXBlLiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQKKyAgLy8vIGZvciBzaW1wbGUgY29uc3RhbnQgdmFsdWVzIGxpa2UgMi4wLzEuMCBldGMsIHRoYXQgYXJlIGtub3duLXZhbGlkIGJvdGggYXMKKyAgLy8vIGhvc3QgZG91YmxlIGFuZCBhcyB0aGUgdGFyZ2V0IGZvcm1hdC4KKyAgc3RhdGljIENvbnN0YW50ICpnZXQoVHlwZSogVHksIGRvdWJsZSBWKTsKKworICAvLy8gSWYgVHkgaXMgYSB2ZWN0b3IgdHlwZSwgcmV0dXJuIGEgQ29uc3RhbnQgd2l0aCBhIHNwbGF0IG9mIHRoZSBnaXZlbgorICAvLy8gdmFsdWUuIE90aGVyd2lzZSByZXR1cm4gYSBDb25zdGFudEZQIGZvciB0aGUgZ2l2ZW4gdmFsdWUuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0KFR5cGUgKlR5LCBjb25zdCBBUEZsb2F0ICZWKTsKKworICBzdGF0aWMgQ29uc3RhbnQgKmdldChUeXBlKiBUeSwgU3RyaW5nUmVmIFN0cik7CisgIHN0YXRpYyBDb25zdGFudEZQICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIGNvbnN0IEFQRmxvYXQgJlYpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldE5hTihUeXBlICpUeSwgYm9vbCBOZWdhdGl2ZSA9IGZhbHNlLCB1bnNpZ25lZCB0eXBlID0gMCk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0TmVnYXRpdmVaZXJvKFR5cGUgKlR5KTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRJbmZpbml0eShUeXBlICpUeSwgYm9vbCBOZWdhdGl2ZSA9IGZhbHNlKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgVHkgaXMgYmlnIGVub3VnaCB0byByZXByZXNlbnQgVi4KKyAgc3RhdGljIGJvb2wgaXNWYWx1ZVZhbGlkRm9yVHlwZShUeXBlICpUeSwgY29uc3QgQVBGbG9hdCAmVik7CisgIGlubGluZSBjb25zdCBBUEZsb2F0ICZnZXRWYWx1ZUFQRigpIGNvbnN0IHsgcmV0dXJuIFZhbDsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgcG9zaXRpdmUgb3IgbmVnYXRpdmUgemVyby4KKyAgYm9vbCBpc1plcm8oKSBjb25zdCB7IHJldHVybiBWYWwuaXNaZXJvKCk7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNpZ24gYml0IGlzIHNldC4KKyAgYm9vbCBpc05lZ2F0aXZlKCkgY29uc3QgeyByZXR1cm4gVmFsLmlzTmVnYXRpdmUoKTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgaW5maW5pdHkKKyAgYm9vbCBpc0luZmluaXR5KCkgY29uc3QgeyByZXR1cm4gVmFsLmlzSW5maW5pdHkoKTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdmFsdWUgaXMgYSBOYU4uCisgIGJvb2wgaXNOYU4oKSBjb25zdCB7IHJldHVybiBWYWwuaXNOYU4oKTsgfQorCisgIC8vLyBXZSBkb24ndCByZWx5IG9uIG9wZXJhdG9yPT0gd29ya2luZyBvbiBkb3VibGUgdmFsdWVzLCBhcyBpdCByZXR1cm5zIHRydWUKKyAgLy8vIGZvciB0aGluZ3MgdGhhdCBhcmUgY2xlYXJseSBub3QgZXF1YWwsIGxpa2UgLTAuMCBhbmQgMC4wLgorICAvLy8gQXMgc3VjaCwgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZG8gYW4gZXhhY3QgYml0LWZvci1iaXQgY29tcGFyaXNvbiBvZgorICAvLy8gdHdvIGZsb2F0aW5nIHBvaW50IHZhbHVlcy4gIFRoZSB2ZXJzaW9uIHdpdGggYSBkb3VibGUgb3BlcmFuZCBpcyByZXRhaW5lZAorICAvLy8gYmVjYXVzZSBpdCdzIHNvIGNvbnZlbmllbnQgdG8gd3JpdGUgaXNFeGFjdGx5VmFsdWUoMi4wKSwgYnV0IHBsZWFzZSB1c2UKKyAgLy8vIGl0IG9ubHkgZm9yIHNpbXBsZSBjb25zdGFudHMuCisgIGJvb2wgaXNFeGFjdGx5VmFsdWUoY29uc3QgQVBGbG9hdCAmVikgY29uc3Q7CisKKyAgYm9vbCBpc0V4YWN0bHlWYWx1ZShkb3VibGUgVikgY29uc3QgeworICAgIGJvb2wgaWdub3JlZDsKKyAgICBBUEZsb2F0IEZWKFYpOworICAgIEZWLmNvbnZlcnQoVmFsLmdldFNlbWFudGljcygpLCBBUEZsb2F0OjpybU5lYXJlc3RUaWVzVG9FdmVuLCAmaWdub3JlZCk7CisgICAgcmV0dXJuIGlzRXhhY3RseVZhbHVlKEZWKTsKKyAgfQorCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA9PSBDb25zdGFudEZQVmFsOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEFsbCB6ZXJvIGFnZ3JlZ2F0ZSB2YWx1ZQorLy8vCitjbGFzcyBDb25zdGFudEFnZ3JlZ2F0ZVplcm8gZmluYWwgOiBwdWJsaWMgQ29uc3RhbnREYXRhIHsKKyAgZnJpZW5kIGNsYXNzIENvbnN0YW50OworCisgIGV4cGxpY2l0IENvbnN0YW50QWdncmVnYXRlWmVybyhUeXBlICpUeSkKKyAgICAgIDogQ29uc3RhbnREYXRhKFR5LCBDb25zdGFudEFnZ3JlZ2F0ZVplcm9WYWwpIHt9CisKKyAgdm9pZCBkZXN0cm95Q29uc3RhbnRJbXBsKCk7CisKK3B1YmxpYzoKKyAgQ29uc3RhbnRBZ2dyZWdhdGVaZXJvKGNvbnN0IENvbnN0YW50QWdncmVnYXRlWmVybyAmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgQ29uc3RhbnRBZ2dyZWdhdGVaZXJvICpnZXQoVHlwZSAqVHkpOworCisgIC8vLyBJZiB0aGlzIENBWiBoYXMgYXJyYXkgb3IgdmVjdG9yIHR5cGUsIHJldHVybiBhIHplcm8gd2l0aCB0aGUgcmlnaHQgZWxlbWVudAorICAvLy8gdHlwZS4KKyAgQ29uc3RhbnQgKmdldFNlcXVlbnRpYWxFbGVtZW50KCkgY29uc3Q7CisKKyAgLy8vIElmIHRoaXMgQ0FaIGhhcyBzdHJ1Y3QgdHlwZSwgcmV0dXJuIGEgemVybyB3aXRoIHRoZSByaWdodCBlbGVtZW50IHR5cGUgZm9yCisgIC8vLyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQuCisgIENvbnN0YW50ICpnZXRTdHJ1Y3RFbGVtZW50KHVuc2lnbmVkIEVsdCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiBhIHplcm8gb2YgdGhlIHJpZ2h0IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIEdFUCBpbmRleCBpZiB3ZSBjYW4sCisgIC8vLyBvdGhlcndpc2UgcmV0dXJuIG51bGwgKGUuZy4gaWYgQyBpcyBhIENvbnN0YW50RXhwcikuCisgIENvbnN0YW50ICpnZXRFbGVtZW50VmFsdWUoQ29uc3RhbnQgKkMpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSB6ZXJvIG9mIHRoZSByaWdodCB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBHRVAgaW5kZXguCisgIENvbnN0YW50ICpnZXRFbGVtZW50VmFsdWUodW5zaWduZWQgSWR4KSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5LCB2ZWN0b3IsIG9yIHN0cnVjdC4KKyAgdW5zaWduZWQgZ2V0TnVtRWxlbWVudHMoKSBjb25zdDsKKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgLy8vCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IENvbnN0YW50QWdncmVnYXRlWmVyb1ZhbDsKKyAgfQorfTsKKworLy8vIEJhc2UgY2xhc3MgZm9yIGFnZ3JlZ2F0ZSBjb25zdGFudHMgKHdpdGggb3BlcmFuZHMpLgorLy8vCisvLy8gVGhlc2UgY29uc3RhbnRzIGFyZSBhZ2dyZWdhdGVzIG9mIG90aGVyIGNvbnN0YW50cywgd2hpY2ggYXJlIHN0b3JlZCBhcworLy8vIG9wZXJhbmRzLgorLy8vCisvLy8gU3ViY2xhc3NlcyBhcmUgXGEgQ29uc3RhbnRTdHJ1Y3QsIFxhIENvbnN0YW50QXJyYXksIGFuZCBcYQorLy8vIENvbnN0YW50VmVjdG9yLgorLy8vCisvLy8gXG5vdGUgU29tZSBzdWJjbGFzc2VzIG9mIFxhIENvbnN0YW50RGF0YSBhcmUgc2VtYW50aWNhbGx5IGFnZ3JlZ2F0ZXMgLS0KKy8vLyBzdWNoIGFzIFxhIENvbnN0YW50RGF0YUFycmF5IC0tIGJ1dCBhcmUgbm90IHN1YmNsYXNzZXMgb2YgdGhpcyBiZWNhdXNlIHRoZXkKKy8vLyB1c2Ugb3BlcmFuZHMuCitjbGFzcyBDb25zdGFudEFnZ3JlZ2F0ZSA6IHB1YmxpYyBDb25zdGFudCB7Citwcm90ZWN0ZWQ6CisgIENvbnN0YW50QWdncmVnYXRlKENvbXBvc2l0ZVR5cGUgKlQsIFZhbHVlVHkgVlQsIEFycmF5UmVmPENvbnN0YW50ICo+IFYpOworCitwdWJsaWM6CisgIC8vLyBUcmFuc3BhcmVudGx5IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgZ2V0T3BlcmFuZCBtZXRob2RzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKENvbnN0YW50KTsKKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPj0gQ29uc3RhbnRBZ2dyZWdhdGVGaXJzdFZhbCAmJgorICAgICAgICAgICBWLT5nZXRWYWx1ZUlEKCkgPD0gQ29uc3RhbnRBZ2dyZWdhdGVMYXN0VmFsOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8Q29uc3RhbnRBZ2dyZWdhdGU+CisgICAgOiBwdWJsaWMgVmFyaWFkaWNPcGVyYW5kVHJhaXRzPENvbnN0YW50QWdncmVnYXRlPiB7fTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKENvbnN0YW50QWdncmVnYXRlLCBDb25zdGFudCkKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBDb25zdGFudEFycmF5IC0gQ29uc3RhbnQgQXJyYXkgRGVjbGFyYXRpb25zCisvLy8KK2NsYXNzIENvbnN0YW50QXJyYXkgZmluYWwgOiBwdWJsaWMgQ29uc3RhbnRBZ2dyZWdhdGUgeworICBmcmllbmQgc3RydWN0IENvbnN0YW50QWdncktleVR5cGU8Q29uc3RhbnRBcnJheT47CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudDsKKworICBDb25zdGFudEFycmF5KEFycmF5VHlwZSAqVCwgQXJyYXlSZWY8Q29uc3RhbnQgKj4gVmFsKTsKKworICB2b2lkIGRlc3Ryb3lDb25zdGFudEltcGwoKTsKKyAgVmFsdWUgKmhhbmRsZU9wZXJhbmRDaGFuZ2VJbXBsKFZhbHVlICpGcm9tLCBWYWx1ZSAqVG8pOworCitwdWJsaWM6CisgIC8vIENvbnN0YW50QXJyYXkgYWNjZXNzb3JzCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0KEFycmF5VHlwZSAqVCwgQXJyYXlSZWY8Q29uc3RhbnQqPiBWKTsKKworcHJpdmF0ZToKKyAgc3RhdGljIENvbnN0YW50ICpnZXRJbXBsKEFycmF5VHlwZSAqVCwgQXJyYXlSZWY8Q29uc3RhbnQgKj4gVik7CisKK3B1YmxpYzoKKyAgLy8vIFNwZWNpYWxpemUgdGhlIGdldFR5cGUoKSBtZXRob2QgdG8gYWx3YXlzIHJldHVybiBhbiBBcnJheVR5cGUsCisgIC8vLyB3aGljaCByZWR1Y2VzIHRoZSBhbW91bnQgb2YgY2FzdGluZyBuZWVkZWQgaW4gcGFydHMgb2YgdGhlIGNvbXBpbGVyLgorICBpbmxpbmUgQXJyYXlUeXBlICpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PEFycmF5VHlwZT4oVmFsdWU6OmdldFR5cGUoKSk7CisgIH0KKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gQ29uc3RhbnRBcnJheVZhbDsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENvbnN0YW50IFN0cnVjdCBEZWNsYXJhdGlvbnMKKy8vCitjbGFzcyBDb25zdGFudFN0cnVjdCBmaW5hbCA6IHB1YmxpYyBDb25zdGFudEFnZ3JlZ2F0ZSB7CisgIGZyaWVuZCBzdHJ1Y3QgQ29uc3RhbnRBZ2dyS2V5VHlwZTxDb25zdGFudFN0cnVjdD47CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudDsKKworICBDb25zdGFudFN0cnVjdChTdHJ1Y3RUeXBlICpULCBBcnJheVJlZjxDb25zdGFudCAqPiBWYWwpOworCisgIHZvaWQgZGVzdHJveUNvbnN0YW50SW1wbCgpOworICBWYWx1ZSAqaGFuZGxlT3BlcmFuZENoYW5nZUltcGwoVmFsdWUgKkZyb20sIFZhbHVlICpUbyk7CisKK3B1YmxpYzoKKyAgLy8gQ29uc3RhbnRTdHJ1Y3QgYWNjZXNzb3JzCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0KFN0cnVjdFR5cGUgKlQsIEFycmF5UmVmPENvbnN0YW50Kj4gVik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIENzdHM+CisgIHN0YXRpYyB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxhcmVfYmFzZV9vZjxDb25zdGFudCwgQ3N0cy4uLj46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKj46OnR5cGUKKyAgZ2V0KFN0cnVjdFR5cGUgKlQsIENzdHMgKi4uLiBWcykgeworICAgIFNtYWxsVmVjdG9yPENvbnN0YW50ICosIDg+IFZhbHVlcyh7VnMuLi59KTsKKyAgICByZXR1cm4gZ2V0KFQsIFZhbHVlcyk7CisgIH0KKworICAvLy8gUmV0dXJuIGFuIGFub255bW91cyBzdHJ1Y3QgdGhhdCBoYXMgdGhlIHNwZWNpZmllZCBlbGVtZW50cy4KKyAgLy8vIElmIHRoZSBzdHJ1Y3QgaXMgcG9zc2libHkgZW1wdHksIHRoZW4geW91IG11c3Qgc3BlY2lmeSBhIGNvbnRleHQuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0QW5vbihBcnJheVJlZjxDb25zdGFudCo+IFYsIGJvb2wgUGFja2VkID0gZmFsc2UpIHsKKyAgICByZXR1cm4gZ2V0KGdldFR5cGVGb3JFbGVtZW50cyhWLCBQYWNrZWQpLCBWKTsKKyAgfQorICBzdGF0aWMgQ29uc3RhbnQgKmdldEFub24oTExWTUNvbnRleHQgJkN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENvbnN0YW50Kj4gViwgYm9vbCBQYWNrZWQgPSBmYWxzZSkgeworICAgIHJldHVybiBnZXQoZ2V0VHlwZUZvckVsZW1lbnRzKEN0eCwgViwgUGFja2VkKSwgVik7CisgIH0KKworICAvLy8gUmV0dXJuIGFuIGFub255bW91cyBzdHJ1Y3QgdHlwZSB0byB1c2UgZm9yIGEgY29uc3RhbnQgd2l0aCB0aGUgc3BlY2lmaWVkCisgIC8vLyBzZXQgb2YgZWxlbWVudHMuIFRoZSBsaXN0IG11c3Qgbm90IGJlIGVtcHR5LgorICBzdGF0aWMgU3RydWN0VHlwZSAqZ2V0VHlwZUZvckVsZW1lbnRzKEFycmF5UmVmPENvbnN0YW50Kj4gViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFBhY2tlZCA9IGZhbHNlKTsKKyAgLy8vIFRoaXMgdmVyc2lvbiBvZiB0aGUgbWV0aG9kIGFsbG93cyBhbiBlbXB0eSBsaXN0LgorICBzdGF0aWMgU3RydWN0VHlwZSAqZ2V0VHlwZUZvckVsZW1lbnRzKExMVk1Db250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q29uc3RhbnQqPiBWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUGFja2VkID0gZmFsc2UpOworCisgIC8vLyBTcGVjaWFsaXphdGlvbiAtIHJlZHVjZSBhbW91bnQgb2YgY2FzdGluZy4KKyAgaW5saW5lIFN0cnVjdFR5cGUgKmdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8U3RydWN0VHlwZT4oVmFsdWU6OmdldFR5cGUoKSk7CisgIH0KKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gQ29uc3RhbnRTdHJ1Y3RWYWw7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQ29uc3RhbnQgVmVjdG9yIERlY2xhcmF0aW9ucworLy8vCitjbGFzcyBDb25zdGFudFZlY3RvciBmaW5hbCA6IHB1YmxpYyBDb25zdGFudEFnZ3JlZ2F0ZSB7CisgIGZyaWVuZCBzdHJ1Y3QgQ29uc3RhbnRBZ2dyS2V5VHlwZTxDb25zdGFudFZlY3Rvcj47CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudDsKKworICBDb25zdGFudFZlY3RvcihWZWN0b3JUeXBlICpULCBBcnJheVJlZjxDb25zdGFudCAqPiBWYWwpOworCisgIHZvaWQgZGVzdHJveUNvbnN0YW50SW1wbCgpOworICBWYWx1ZSAqaGFuZGxlT3BlcmFuZENoYW5nZUltcGwoVmFsdWUgKkZyb20sIFZhbHVlICpUbyk7CisKK3B1YmxpYzoKKyAgLy8gQ29uc3RhbnRWZWN0b3IgYWNjZXNzb3JzCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0KEFycmF5UmVmPENvbnN0YW50Kj4gVik7CisKK3ByaXZhdGU6CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0SW1wbChBcnJheVJlZjxDb25zdGFudCAqPiBWKTsKKworcHVibGljOgorICAvLy8gUmV0dXJuIGEgQ29uc3RhbnRWZWN0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGNvbnN0YW50IGluIGVhY2ggZWxlbWVudC4KKyAgc3RhdGljIENvbnN0YW50ICpnZXRTcGxhdCh1bnNpZ25lZCBOdW1FbHRzLCBDb25zdGFudCAqRWx0KTsKKworICAvLy8gU3BlY2lhbGl6ZSB0aGUgZ2V0VHlwZSgpIG1ldGhvZCB0byBhbHdheXMgcmV0dXJuIGEgVmVjdG9yVHlwZSwKKyAgLy8vIHdoaWNoIHJlZHVjZXMgdGhlIGFtb3VudCBvZiBjYXN0aW5nIG5lZWRlZCBpbiBwYXJ0cyBvZiB0aGUgY29tcGlsZXIuCisgIGlubGluZSBWZWN0b3JUeXBlICpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PFZlY3RvclR5cGU+KFZhbHVlOjpnZXRUeXBlKCkpOworICB9CisKKyAgLy8vIElmIHRoaXMgaXMgYSBzcGxhdCBjb25zdGFudCwgbWVhbmluZyB0aGF0IGFsbCBvZiB0aGUgZWxlbWVudHMgaGF2ZSB0aGUKKyAgLy8vIHNhbWUgdmFsdWUsIHJldHVybiB0aGF0IHZhbHVlLiBPdGhlcndpc2UgcmV0dXJuIE5VTEwuCisgIENvbnN0YW50ICpnZXRTcGxhdFZhbHVlKCkgY29uc3Q7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IENvbnN0YW50VmVjdG9yVmFsOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEEgY29uc3RhbnQgcG9pbnRlciB2YWx1ZSB0aGF0IHBvaW50cyB0byBudWxsCisvLy8KK2NsYXNzIENvbnN0YW50UG9pbnRlck51bGwgZmluYWwgOiBwdWJsaWMgQ29uc3RhbnREYXRhIHsKKyAgZnJpZW5kIGNsYXNzIENvbnN0YW50OworCisgIGV4cGxpY2l0IENvbnN0YW50UG9pbnRlck51bGwoUG9pbnRlclR5cGUgKlQpCisgICAgICA6IENvbnN0YW50RGF0YShULCBWYWx1ZTo6Q29uc3RhbnRQb2ludGVyTnVsbFZhbCkge30KKworICB2b2lkIGRlc3Ryb3lDb25zdGFudEltcGwoKTsKKworcHVibGljOgorICBDb25zdGFudFBvaW50ZXJOdWxsKGNvbnN0IENvbnN0YW50UG9pbnRlck51bGwgJikgPSBkZWxldGU7CisKKyAgLy8vIFN0YXRpYyBmYWN0b3J5IG1ldGhvZHMgLSBSZXR1cm4gb2JqZWN0cyBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlCisgIHN0YXRpYyBDb25zdGFudFBvaW50ZXJOdWxsICpnZXQoUG9pbnRlclR5cGUgKlQpOworCisgIC8vLyBTcGVjaWFsaXplIHRoZSBnZXRUeXBlKCkgbWV0aG9kIHRvIGFsd2F5cyByZXR1cm4gYW4gUG9pbnRlclR5cGUsCisgIC8vLyB3aGljaCByZWR1Y2VzIHRoZSBhbW91bnQgb2YgY2FzdGluZyBuZWVkZWQgaW4gcGFydHMgb2YgdGhlIGNvbXBpbGVyLgorICBpbmxpbmUgUG9pbnRlclR5cGUgKmdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8UG9pbnRlclR5cGU+KFZhbHVlOjpnZXRUeXBlKCkpOworICB9CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IENvbnN0YW50UG9pbnRlck51bGxWYWw7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQ29uc3RhbnREYXRhU2VxdWVudGlhbCAtIEEgdmVjdG9yIG9yIGFycmF5IGNvbnN0YW50IHdob3NlIGVsZW1lbnQgdHlwZSBpcyBhCisvLy8gc2ltcGxlIDEvMi80LzgtYnl0ZSBpbnRlZ2VyIG9yIGZsb2F0L2RvdWJsZSwgYW5kIHdob3NlIGVsZW1lbnRzIGFyZSBqdXN0CisvLy8gc2ltcGxlIGRhdGEgdmFsdWVzIChpLmUuIENvbnN0YW50SW50L0NvbnN0YW50RlApLiAgVGhpcyBDb25zdGFudCBub2RlIGhhcyBubworLy8vIG9wZXJhbmRzIGJlY2F1c2UgaXQgc3RvcmVzIGFsbCBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGNvbnN0YW50IGFzIGRlbnNlbHkKKy8vLyBwYWNrZWQgZGF0YSwgaW5zdGVhZCBvZiBhcyBWYWx1ZSoncy4KKy8vLworLy8vIFRoaXMgaXMgdGhlIGNvbW1vbiBiYXNlIGNsYXNzIG9mIENvbnN0YW50RGF0YUFycmF5IGFuZCBDb25zdGFudERhdGFWZWN0b3IuCisvLy8KK2NsYXNzIENvbnN0YW50RGF0YVNlcXVlbnRpYWwgOiBwdWJsaWMgQ29uc3RhbnREYXRhIHsKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIENvbnN0YW50OworCisgIC8vLyBBIHBvaW50ZXIgdG8gdGhlIGJ5dGVzIHVuZGVybHlpbmcgdGhpcyBjb25zdGFudCAod2hpY2ggaXMgb3duZWQgYnkgdGhlCisgIC8vLyB1bmlxdWluZyBTdHJpbmdNYXApLgorICBjb25zdCBjaGFyICpEYXRhRWxlbWVudHM7CisKKyAgLy8vIFRoaXMgZm9ybXMgYSBsaW5rIGxpc3Qgb2YgQ29uc3RhbnREYXRhU2VxdWVudGlhbCBub2RlcyB0aGF0IGhhdmUKKyAgLy8vIHRoZSBzYW1lIHZhbHVlIGJ1dCBkaWZmZXJlbnQgdHlwZS4gIEZvciBleGFtcGxlLCAwLDAsMCwxIGNvdWxkIGJlIGEgNAorICAvLy8gZWxlbWVudCBhcnJheSBvZiBpOCwgb3IgYSAxLWVsZW1lbnQgYXJyYXkgb2YgaTMyLiAgVGhleSdsbCBib3RoIGVuZCB1cCBpbgorICAvLy8gdGhlIHNhbWUgU3RyaW5nTWFwIGJ1Y2tldCwgbGlua2VkIHVwLgorICBDb25zdGFudERhdGFTZXF1ZW50aWFsICpOZXh0OworCisgIHZvaWQgZGVzdHJveUNvbnN0YW50SW1wbCgpOworCitwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IENvbnN0YW50RGF0YVNlcXVlbnRpYWwoVHlwZSAqdHksIFZhbHVlVHkgVlQsIGNvbnN0IGNoYXIgKkRhdGEpCisgICAgICA6IENvbnN0YW50RGF0YSh0eSwgVlQpLCBEYXRhRWxlbWVudHMoRGF0YSksIE5leHQobnVsbHB0cikge30KKyAgfkNvbnN0YW50RGF0YVNlcXVlbnRpYWwoKSB7IGRlbGV0ZSBOZXh0OyB9CisKKyAgc3RhdGljIENvbnN0YW50ICpnZXRJbXBsKFN0cmluZ1JlZiBCeXRlcywgVHlwZSAqVHkpOworCitwdWJsaWM6CisgIENvbnN0YW50RGF0YVNlcXVlbnRpYWwoY29uc3QgQ29uc3RhbnREYXRhU2VxdWVudGlhbCAmKSA9IGRlbGV0ZTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgYSBDb25zdGFudERhdGFTZXF1ZW50aWFsIGNhbiBiZSBmb3JtZWQgd2l0aCBhIHZlY3RvciBvcgorICAvLy8gYXJyYXkgb2YgdGhlIHNwZWNpZmllZCBlbGVtZW50IHR5cGUuCisgIC8vLyBDb25zdGFudERhdGFBcnJheSBvbmx5IHdvcmtzIHdpdGggbm9ybWFsIGZsb2F0IGFuZCBpbnQgdHlwZXMgdGhhdCBhcmUKKyAgLy8vIHN0b3JlZCBkZW5zZWx5IGluIG1lbW9yeSwgbm90IHdpdGggdGhpbmdzIGxpa2UgaTQyIG9yIHg4Nl9mODAuCisgIHN0YXRpYyBib29sIGlzRWxlbWVudFR5cGVDb21wYXRpYmxlKFR5cGUgKlR5KTsKKworICAvLy8gSWYgdGhpcyBpcyBhIHNlcXVlbnRpYWwgY29udGFpbmVyIG9mIGludGVnZXJzIChvZiBhbnkgc2l6ZSksIHJldHVybiB0aGUKKyAgLy8vIHNwZWNpZmllZCBlbGVtZW50IGluIHRoZSBsb3cgYml0cyBvZiBhIHVpbnQ2NF90LgorICB1aW50NjRfdCBnZXRFbGVtZW50QXNJbnRlZ2VyKHVuc2lnbmVkIGkpIGNvbnN0OworCisgIC8vLyBJZiB0aGlzIGlzIGEgc2VxdWVudGlhbCBjb250YWluZXIgb2YgaW50ZWdlcnMgKG9mIGFueSBzaXplKSwgcmV0dXJuIHRoZQorICAvLy8gc3BlY2lmaWVkIGVsZW1lbnQgYXMgYW4gQVBJbnQuCisgIEFQSW50IGdldEVsZW1lbnRBc0FQSW50KHVuc2lnbmVkIGkpIGNvbnN0OworCisgIC8vLyBJZiB0aGlzIGlzIGEgc2VxdWVudGlhbCBjb250YWluZXIgb2YgZmxvYXRpbmcgcG9pbnQgdHlwZSwgcmV0dXJuIHRoZQorICAvLy8gc3BlY2lmaWVkIGVsZW1lbnQgYXMgYW4gQVBGbG9hdC4KKyAgQVBGbG9hdCBnZXRFbGVtZW50QXNBUEZsb2F0KHVuc2lnbmVkIGkpIGNvbnN0OworCisgIC8vLyBJZiB0aGlzIGlzIGFuIHNlcXVlbnRpYWwgY29udGFpbmVyIG9mIGZsb2F0cywgcmV0dXJuIHRoZSBzcGVjaWZpZWQgZWxlbWVudAorICAvLy8gYXMgYSBmbG9hdC4KKyAgZmxvYXQgZ2V0RWxlbWVudEFzRmxvYXQodW5zaWduZWQgaSkgY29uc3Q7CisKKyAgLy8vIElmIHRoaXMgaXMgYW4gc2VxdWVudGlhbCBjb250YWluZXIgb2YgZG91YmxlcywgcmV0dXJuIHRoZSBzcGVjaWZpZWQKKyAgLy8vIGVsZW1lbnQgYXMgYSBkb3VibGUuCisgIGRvdWJsZSBnZXRFbGVtZW50QXNEb3VibGUodW5zaWduZWQgaSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiBhIENvbnN0YW50IGZvciBhIHNwZWNpZmllZCBpbmRleCdzIGVsZW1lbnQuCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBoYXMgdG8gY29tcHV0ZSBhIG5ldyBjb25zdGFudCB0byByZXR1cm4sIHNvIGl0IGlzbid0IGFzCisgIC8vLyBlZmZpY2llbnQgYXMgZ2V0RWxlbWVudEFzSW50ZWdlci9GbG9hdC9Eb3VibGUuCisgIENvbnN0YW50ICpnZXRFbGVtZW50QXNDb25zdGFudCh1bnNpZ25lZCBpKSBjb25zdDsKKworICAvLy8gU3BlY2lhbGl6ZSB0aGUgZ2V0VHlwZSgpIG1ldGhvZCB0byBhbHdheXMgcmV0dXJuIGEgU2VxdWVudGlhbFR5cGUsIHdoaWNoCisgIC8vLyByZWR1Y2VzIHRoZSBhbW91bnQgb2YgY2FzdGluZyBuZWVkZWQgaW4gcGFydHMgb2YgdGhlIGNvbXBpbGVyLgorICBpbmxpbmUgU2VxdWVudGlhbFR5cGUgKmdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8U2VxdWVudGlhbFR5cGU+KFZhbHVlOjpnZXRUeXBlKCkpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgZWxlbWVudCB0eXBlIG9mIHRoZSBhcnJheS92ZWN0b3IuCisgIFR5cGUgKmdldEVsZW1lbnRUeXBlKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSBhcnJheSBvciB2ZWN0b3IuCisgIHVuc2lnbmVkIGdldE51bUVsZW1lbnRzKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIGVhY2ggZWxlbWVudCBpbiB0aGUgYXJyYXkvdmVjdG9yLgorICAvLy8gVGhlIHNpemUgb2YgdGhlIGVsZW1lbnRzIGlzIGtub3duIHRvIGJlIGEgbXVsdGlwbGUgb2Ygb25lIGJ5dGUuCisgIHVpbnQ2NF90IGdldEVsZW1lbnRCeXRlU2l6ZSgpIGNvbnN0OworCisgIC8vLyBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhbiBhcnJheSBvZiBccCBDaGFyU2l6ZSBpbnRlZ2Vycy4KKyAgYm9vbCBpc1N0cmluZyh1bnNpZ25lZCBDaGFyU2l6ZSA9IDgpIGNvbnN0OworCisgIC8vLyBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgdGhlIGFycmF5ICJpc1N0cmluZyIsIGVuZHMgd2l0aCBhIG51bGwgYnl0ZSwKKyAgLy8vIGFuZCBkb2VzIG5vdCBjb250YWlucyBhbnkgb3RoZXIgbnVsbCBieXRlcy4KKyAgYm9vbCBpc0NTdHJpbmcoKSBjb25zdDsKKworICAvLy8gSWYgdGhpcyBhcnJheSBpcyBpc1N0cmluZygpLCB0aGVuIHRoaXMgbWV0aG9kIHJldHVybnMgdGhlIGFycmF5IGFzIGEKKyAgLy8vIFN0cmluZ1JlZi4gT3RoZXJ3aXNlLCBpdCBhc3NlcnRzIG91dC4KKyAgU3RyaW5nUmVmIGdldEFzU3RyaW5nKCkgY29uc3QgeworICAgIGFzc2VydChpc1N0cmluZygpICYmICJOb3QgYSBzdHJpbmciKTsKKyAgICByZXR1cm4gZ2V0UmF3RGF0YVZhbHVlcygpOworICB9CisKKyAgLy8vIElmIHRoaXMgYXJyYXkgaXMgaXNDU3RyaW5nKCksIHRoZW4gdGhpcyBtZXRob2QgcmV0dXJucyB0aGUgYXJyYXkgKHdpdGhvdXQKKyAgLy8vIHRoZSB0cmFpbGluZyBudWxsIGJ5dGUpIGFzIGEgU3RyaW5nUmVmLiBPdGhlcndpc2UsIGl0IGFzc2VydHMgb3V0LgorICBTdHJpbmdSZWYgZ2V0QXNDU3RyaW5nKCkgY29uc3QgeworICAgIGFzc2VydChpc0NTdHJpbmcoKSAmJiAiSXNuJ3QgYSBDIHN0cmluZyIpOworICAgIFN0cmluZ1JlZiBTdHIgPSBnZXRBc1N0cmluZygpOworICAgIHJldHVybiBTdHIuc3Vic3RyKDAsIFN0ci5zaXplKCktMSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSByYXcsIHVuZGVybHlpbmcsIGJ5dGVzIG9mIHRoaXMgZGF0YS4gTm90ZSB0aGF0IHRoaXMgaXMgYW4KKyAgLy8vIGV4dHJlbWVseSB0cmlja3kgdGhpbmcgdG8gd29yayB3aXRoLCBhcyBpdCBleHBvc2VzIHRoZSBob3N0IGVuZGlhbm5lc3Mgb2YKKyAgLy8vIHRoZSBkYXRhIGVsZW1lbnRzLgorICBTdHJpbmdSZWYgZ2V0UmF3RGF0YVZhbHVlcygpIGNvbnN0OworCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA9PSBDb25zdGFudERhdGFBcnJheVZhbCB8fAorICAgICAgICAgICBWLT5nZXRWYWx1ZUlEKCkgPT0gQ29uc3RhbnREYXRhVmVjdG9yVmFsOworICB9CisKK3ByaXZhdGU6CisgIGNvbnN0IGNoYXIgKmdldEVsZW1lbnRQb2ludGVyKHVuc2lnbmVkIEVsdCkgY29uc3Q7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEFuIGFycmF5IGNvbnN0YW50IHdob3NlIGVsZW1lbnQgdHlwZSBpcyBhIHNpbXBsZSAxLzIvNC84LWJ5dGUgaW50ZWdlciBvcgorLy8vIGZsb2F0L2RvdWJsZSwgYW5kIHdob3NlIGVsZW1lbnRzIGFyZSBqdXN0IHNpbXBsZSBkYXRhIHZhbHVlcworLy8vIChpLmUuIENvbnN0YW50SW50L0NvbnN0YW50RlApLiBUaGlzIENvbnN0YW50IG5vZGUgaGFzIG5vIG9wZXJhbmRzIGJlY2F1c2UgaXQKKy8vLyBzdG9yZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBvZiB0aGUgY29uc3RhbnQgYXMgZGVuc2VseSBwYWNrZWQgZGF0YSwgaW5zdGVhZAorLy8vIG9mIGFzIFZhbHVlKidzLgorY2xhc3MgQ29uc3RhbnREYXRhQXJyYXkgZmluYWwgOiBwdWJsaWMgQ29uc3RhbnREYXRhU2VxdWVudGlhbCB7CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudERhdGFTZXF1ZW50aWFsOworCisgIGV4cGxpY2l0IENvbnN0YW50RGF0YUFycmF5KFR5cGUgKnR5LCBjb25zdCBjaGFyICpEYXRhKQorICAgICAgOiBDb25zdGFudERhdGFTZXF1ZW50aWFsKHR5LCBDb25zdGFudERhdGFBcnJheVZhbCwgRGF0YSkge30KKworcHVibGljOgorICBDb25zdGFudERhdGFBcnJheShjb25zdCBDb25zdGFudERhdGFBcnJheSAmKSA9IGRlbGV0ZTsKKworICAvLy8gZ2V0KCkgY29uc3RydWN0b3IgLSBSZXR1cm4gYSBjb25zdGFudCB3aXRoIGFycmF5IHR5cGUgd2l0aCBhbiBlbGVtZW50CisgIC8vLyBjb3VudCBhbmQgZWxlbWVudCB0eXBlIG1hdGNoaW5nIHRoZSBBcnJheVJlZiBwYXNzZWQgaW4uICBOb3RlIHRoYXQgdGhpcworICAvLy8gY2FuIHJldHVybiBhIENvbnN0YW50QWdncmVnYXRlWmVybyBvYmplY3QuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50VHk+CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCBBcnJheVJlZjxFbGVtZW50VHk+IEVsdHMpIHsKKyAgICBjb25zdCBjaGFyICpEYXRhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyICo+KEVsdHMuZGF0YSgpKTsKKyAgICBUeXBlICpUeSA9CisgICAgICAgIEFycmF5VHlwZTo6Z2V0KFR5cGU6OmdldFNjYWxhclR5PEVsZW1lbnRUeT4oQ29udGV4dCksIEVsdHMuc2l6ZSgpKTsKKyAgICByZXR1cm4gZ2V0SW1wbChTdHJpbmdSZWYoRGF0YSwgRWx0cy5zaXplKCkgKiBzaXplb2YoRWxlbWVudFR5KSksIFR5KTsKKyAgfQorCisgIC8vLyBnZXQoKSBjb25zdHJ1Y3RvciAtIEFycmF5VHkgbmVlZHMgdG8gYmUgY29tcGF0aWJsZSB3aXRoCisgIC8vLyBBcnJheVJlZjxFbGVtZW50VHk+LiBDYWxscyBnZXQoTExWTUNvbnRleHQsIEFycmF5UmVmPEVsZW1lbnRUeT4pLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQXJyYXlUeT4KKyAgc3RhdGljIENvbnN0YW50ICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIEFycmF5VHkgJkVsdHMpIHsKKyAgICByZXR1cm4gQ29uc3RhbnREYXRhQXJyYXk6OmdldChDb250ZXh0LCBtYWtlQXJyYXlSZWYoRWx0cykpOworICB9CisKKyAgLy8vIGdldEZQKCkgY29uc3RydWN0b3JzIC0gUmV0dXJuIGEgY29uc3RhbnQgd2l0aCBhcnJheSB0eXBlIHdpdGggYW4gZWxlbWVudAorICAvLy8gY291bnQgYW5kIGVsZW1lbnQgdHlwZSBvZiBmbG9hdCB3aXRoIHByZWNpc2lvbiBtYXRjaGluZyB0aGUgbnVtYmVyIG9mCisgIC8vLyBiaXRzIGluIHRoZSBBcnJheVJlZiBwYXNzZWQgaW4uIChpLmUuIGhhbGYgZm9yIDE2Yml0cywgZmxvYXQgZm9yIDMyYml0cywKKyAgLy8vIGRvdWJsZSBmb3IgNjRiaXRzKSBOb3RlIHRoYXQgdGhpcyBjYW4gcmV0dXJuIGEgQ29uc3RhbnRBZ2dyZWdhdGVaZXJvCisgIC8vLyBvYmplY3QuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RlAoTExWTUNvbnRleHQgJkNvbnRleHQsIEFycmF5UmVmPHVpbnQxNl90PiBFbHRzKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRGUChMTFZNQ29udGV4dCAmQ29udGV4dCwgQXJyYXlSZWY8dWludDMyX3Q+IEVsdHMpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEZQKExMVk1Db250ZXh0ICZDb250ZXh0LCBBcnJheVJlZjx1aW50NjRfdD4gRWx0cyk7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGNvbnN0cnVjdHMgYSBDRFMgYW5kIGluaXRpYWxpemVzIGl0IHdpdGggYSB0ZXh0IHN0cmluZy4KKyAgLy8vIFRoZSBkZWZhdWx0IGJlaGF2aW9yIChBZGROdWxsPT10cnVlKSBjYXVzZXMgYSBudWxsIHRlcm1pbmF0b3IgdG8KKyAgLy8vIGJlIHBsYWNlZCBhdCB0aGUgZW5kIG9mIHRoZSBhcnJheSAoaW5jcmVhc2luZyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgYnkKKyAgLy8vIG9uZSBtb3JlIHRoYW4gdGhlIFN0cmluZ1JlZiB3b3VsZCBub3JtYWxseSBpbmRpY2F0ZS4gIFBhc3MgQWRkTnVsbD1mYWxzZQorICAvLy8gdG8gZGlzYWJsZSB0aGlzIGJlaGF2aW9yLgorICBzdGF0aWMgQ29uc3RhbnQgKmdldFN0cmluZyhMTFZNQ29udGV4dCAmQ29udGV4dCwgU3RyaW5nUmVmIEluaXRpYWxpemVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFkZE51bGwgPSB0cnVlKTsKKworICAvLy8gU3BlY2lhbGl6ZSB0aGUgZ2V0VHlwZSgpIG1ldGhvZCB0byBhbHdheXMgcmV0dXJuIGFuIEFycmF5VHlwZSwKKyAgLy8vIHdoaWNoIHJlZHVjZXMgdGhlIGFtb3VudCBvZiBjYXN0aW5nIG5lZWRlZCBpbiBwYXJ0cyBvZiB0aGUgY29tcGlsZXIuCisgIGlubGluZSBBcnJheVR5cGUgKmdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8QXJyYXlUeXBlPihWYWx1ZTo6Z2V0VHlwZSgpKTsKKyAgfQorCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA9PSBDb25zdGFudERhdGFBcnJheVZhbDsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBBIHZlY3RvciBjb25zdGFudCB3aG9zZSBlbGVtZW50IHR5cGUgaXMgYSBzaW1wbGUgMS8yLzQvOC1ieXRlIGludGVnZXIgb3IKKy8vLyBmbG9hdC9kb3VibGUsIGFuZCB3aG9zZSBlbGVtZW50cyBhcmUganVzdCBzaW1wbGUgZGF0YSB2YWx1ZXMKKy8vLyAoaS5lLiBDb25zdGFudEludC9Db25zdGFudEZQKS4gVGhpcyBDb25zdGFudCBub2RlIGhhcyBubyBvcGVyYW5kcyBiZWNhdXNlIGl0CisvLy8gc3RvcmVzIGFsbCBvZiB0aGUgZWxlbWVudHMgb2YgdGhlIGNvbnN0YW50IGFzIGRlbnNlbHkgcGFja2VkIGRhdGEsIGluc3RlYWQKKy8vLyBvZiBhcyBWYWx1ZSoncy4KK2NsYXNzIENvbnN0YW50RGF0YVZlY3RvciBmaW5hbCA6IHB1YmxpYyBDb25zdGFudERhdGFTZXF1ZW50aWFsIHsKKyAgZnJpZW5kIGNsYXNzIENvbnN0YW50RGF0YVNlcXVlbnRpYWw7CisKKyAgZXhwbGljaXQgQ29uc3RhbnREYXRhVmVjdG9yKFR5cGUgKnR5LCBjb25zdCBjaGFyICpEYXRhKQorICAgICAgOiBDb25zdGFudERhdGFTZXF1ZW50aWFsKHR5LCBDb25zdGFudERhdGFWZWN0b3JWYWwsIERhdGEpIHt9CisKK3B1YmxpYzoKKyAgQ29uc3RhbnREYXRhVmVjdG9yKGNvbnN0IENvbnN0YW50RGF0YVZlY3RvciAmKSA9IGRlbGV0ZTsKKworICAvLy8gZ2V0KCkgY29uc3RydWN0b3JzIC0gUmV0dXJuIGEgY29uc3RhbnQgd2l0aCB2ZWN0b3IgdHlwZSB3aXRoIGFuIGVsZW1lbnQKKyAgLy8vIGNvdW50IGFuZCBlbGVtZW50IHR5cGUgbWF0Y2hpbmcgdGhlIEFycmF5UmVmIHBhc3NlZCBpbi4gIE5vdGUgdGhhdCB0aGlzCisgIC8vLyBjYW4gcmV0dXJuIGEgQ29uc3RhbnRBZ2dyZWdhdGVaZXJvIG9iamVjdC4KKyAgc3RhdGljIENvbnN0YW50ICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIEFycmF5UmVmPHVpbnQ4X3Q+IEVsdHMpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCwgQXJyYXlSZWY8dWludDE2X3Q+IEVsdHMpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCwgQXJyYXlSZWY8dWludDMyX3Q+IEVsdHMpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCwgQXJyYXlSZWY8dWludDY0X3Q+IEVsdHMpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCwgQXJyYXlSZWY8ZmxvYXQ+IEVsdHMpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCwgQXJyYXlSZWY8ZG91YmxlPiBFbHRzKTsKKworICAvLy8gZ2V0RlAoKSBjb25zdHJ1Y3RvcnMgLSBSZXR1cm4gYSBjb25zdGFudCB3aXRoIHZlY3RvciB0eXBlIHdpdGggYW4gZWxlbWVudAorICAvLy8gY291bnQgYW5kIGVsZW1lbnQgdHlwZSBvZiBmbG9hdCB3aXRoIHRoZSBwcmVjaXNpb24gbWF0Y2hpbmcgdGhlIG51bWJlciBvZgorICAvLy8gYml0cyBpbiB0aGUgQXJyYXlSZWYgcGFzc2VkIGluLiAgKGkuZS4gaGFsZiBmb3IgMTZiaXRzLCBmbG9hdCBmb3IgMzJiaXRzLAorICAvLy8gZG91YmxlIGZvciA2NGJpdHMpIE5vdGUgdGhhdCB0aGlzIGNhbiByZXR1cm4gYSBDb25zdGFudEFnZ3JlZ2F0ZVplcm8KKyAgLy8vIG9iamVjdC4KKyAgc3RhdGljIENvbnN0YW50ICpnZXRGUChMTFZNQ29udGV4dCAmQ29udGV4dCwgQXJyYXlSZWY8dWludDE2X3Q+IEVsdHMpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEZQKExMVk1Db250ZXh0ICZDb250ZXh0LCBBcnJheVJlZjx1aW50MzJfdD4gRWx0cyk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RlAoTExWTUNvbnRleHQgJkNvbnRleHQsIEFycmF5UmVmPHVpbnQ2NF90PiBFbHRzKTsKKworICAvLy8gUmV0dXJuIGEgQ29uc3RhbnRWZWN0b3Igd2l0aCB0aGUgc3BlY2lmaWVkIGNvbnN0YW50IGluIGVhY2ggZWxlbWVudC4KKyAgLy8vIFRoZSBzcGVjaWZpZWQgY29uc3RhbnQgaGFzIHRvIGJlIGEgb2YgYSBjb21wYXRpYmxlIHR5cGUgKGk4L2kxNi8KKyAgLy8vIGkzMi9pNjQvZmxvYXQvZG91YmxlKSBhbmQgbXVzdCBiZSBhIENvbnN0YW50RlAgb3IgQ29uc3RhbnRJbnQuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0U3BsYXQodW5zaWduZWQgTnVtRWx0cywgQ29uc3RhbnQgKkVsdCk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgc3BsYXQgY29uc3RhbnQsIG1lYW5pbmcgdGhhdCBhbGwgZWxlbWVudHMgaGF2ZQorICAvLy8gdGhlIHNhbWUgdmFsdWUuCisgIGJvb2wgaXNTcGxhdCgpIGNvbnN0OworCisgIC8vLyBJZiB0aGlzIGlzIGEgc3BsYXQgY29uc3RhbnQsIG1lYW5pbmcgdGhhdCBhbGwgb2YgdGhlIGVsZW1lbnRzIGhhdmUgdGhlCisgIC8vLyBzYW1lIHZhbHVlLCByZXR1cm4gdGhhdCB2YWx1ZS4gT3RoZXJ3aXNlIHJldHVybiBOVUxMLgorICBDb25zdGFudCAqZ2V0U3BsYXRWYWx1ZSgpIGNvbnN0OworCisgIC8vLyBTcGVjaWFsaXplIHRoZSBnZXRUeXBlKCkgbWV0aG9kIHRvIGFsd2F5cyByZXR1cm4gYSBWZWN0b3JUeXBlLAorICAvLy8gd2hpY2ggcmVkdWNlcyB0aGUgYW1vdW50IG9mIGNhc3RpbmcgbmVlZGVkIGluIHBhcnRzIG9mIHRoZSBjb21waWxlci4KKyAgaW5saW5lIFZlY3RvclR5cGUgKmdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8VmVjdG9yVHlwZT4oVmFsdWU6OmdldFR5cGUoKSk7CisgIH0KKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gQ29uc3RhbnREYXRhVmVjdG9yVmFsOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEEgY29uc3RhbnQgdG9rZW4gd2hpY2ggaXMgZW1wdHkKKy8vLworY2xhc3MgQ29uc3RhbnRUb2tlbk5vbmUgZmluYWwgOiBwdWJsaWMgQ29uc3RhbnREYXRhIHsKKyAgZnJpZW5kIGNsYXNzIENvbnN0YW50OworCisgIGV4cGxpY2l0IENvbnN0YW50VG9rZW5Ob25lKExMVk1Db250ZXh0ICZDb250ZXh0KQorICAgICAgOiBDb25zdGFudERhdGEoVHlwZTo6Z2V0VG9rZW5UeShDb250ZXh0KSwgQ29uc3RhbnRUb2tlbk5vbmVWYWwpIHt9CisKKyAgdm9pZCBkZXN0cm95Q29uc3RhbnRJbXBsKCk7CisKK3B1YmxpYzoKKyAgQ29uc3RhbnRUb2tlbk5vbmUoY29uc3QgQ29uc3RhbnRUb2tlbk5vbmUgJikgPSBkZWxldGU7CisKKyAgLy8vIFJldHVybiB0aGUgQ29uc3RhbnRUb2tlbk5vbmUuCisgIHN0YXRpYyBDb25zdGFudFRva2VuTm9uZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KTsKKworICAvLy8gQGJyaWVmIE1ldGhvZHMgdG8gc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdC4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gQ29uc3RhbnRUb2tlbk5vbmVWYWw7CisgIH0KK307CisKKy8vLyBUaGUgYWRkcmVzcyBvZiBhIGJhc2ljIGJsb2NrLgorLy8vCitjbGFzcyBCbG9ja0FkZHJlc3MgZmluYWwgOiBwdWJsaWMgQ29uc3RhbnQgeworICBmcmllbmQgY2xhc3MgQ29uc3RhbnQ7CisKKyAgQmxvY2tBZGRyZXNzKEZ1bmN0aW9uICpGLCBCYXNpY0Jsb2NrICpCQik7CisKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSB7IHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMik7IH0KKworICB2b2lkIGRlc3Ryb3lDb25zdGFudEltcGwoKTsKKyAgVmFsdWUgKmhhbmRsZU9wZXJhbmRDaGFuZ2VJbXBsKFZhbHVlICpGcm9tLCBWYWx1ZSAqVG8pOworCitwdWJsaWM6CisgIC8vLyBSZXR1cm4gYSBCbG9ja0FkZHJlc3MgZm9yIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gYW5kIGJhc2ljIGJsb2NrLgorICBzdGF0aWMgQmxvY2tBZGRyZXNzICpnZXQoRnVuY3Rpb24gKkYsIEJhc2ljQmxvY2sgKkJCKTsKKworICAvLy8gUmV0dXJuIGEgQmxvY2tBZGRyZXNzIGZvciB0aGUgc3BlY2lmaWVkIGJhc2ljIGJsb2NrLiAgVGhlIGJhc2ljCisgIC8vLyBibG9jayBtdXN0IGJlIGVtYmVkZGVkIGludG8gYSBmdW5jdGlvbi4KKyAgc3RhdGljIEJsb2NrQWRkcmVzcyAqZ2V0KEJhc2ljQmxvY2sgKkJCKTsKKworICAvLy8gTG9va3VwIGFuIGV4aXN0aW5nIFxjIEJsb2NrQWRkcmVzcyBjb25zdGFudCBmb3IgdGhlIGdpdmVuIEJhc2ljQmxvY2suCisgIC8vLworICAvLy8gXHJldHVybnMgMCBpZiBcYyAhQkItPmhhc0FkZHJlc3NUYWtlbigpLCBvdGhlcndpc2UgdGhlIFxjIEJsb2NrQWRkcmVzcy4KKyAgc3RhdGljIEJsb2NrQWRkcmVzcyAqbG9va3VwKGNvbnN0IEJhc2ljQmxvY2sgKkJCKTsKKworICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgRnVuY3Rpb24gKmdldEZ1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gKEZ1bmN0aW9uKilPcDwwPigpLmdldCgpOyB9CisgIEJhc2ljQmxvY2sgKmdldEJhc2ljQmxvY2soKSBjb25zdCB7IHJldHVybiAoQmFzaWNCbG9jayopT3A8MT4oKS5nZXQoKTsgfQorCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA9PSBCbG9ja0FkZHJlc3NWYWw7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxCbG9ja0FkZHJlc3M+IDoKKyAgcHVibGljIEZpeGVkTnVtT3BlcmFuZFRyYWl0czxCbG9ja0FkZHJlc3MsIDI+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhCbG9ja0FkZHJlc3MsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEEgY29uc3RhbnQgdmFsdWUgdGhhdCBpcyBpbml0aWFsaXplZCB3aXRoIGFuIGV4cHJlc3Npb24gdXNpbmcKKy8vLyBvdGhlciBjb25zdGFudCB2YWx1ZXMuCisvLy8KKy8vLyBUaGlzIGNsYXNzIHVzZXMgdGhlIHN0YW5kYXJkIEluc3RydWN0aW9uIG9wY29kZXMgdG8gZGVmaW5lIHRoZSB2YXJpb3VzCisvLy8gY29uc3RhbnQgZXhwcmVzc2lvbnMuICBUaGUgT3Bjb2RlIGZpZWxkIGZvciB0aGUgQ29uc3RhbnRFeHByIGNsYXNzIGlzCisvLy8gbWFpbnRhaW5lZCBpbiB0aGUgVmFsdWU6OlN1YmNsYXNzRGF0YSBmaWVsZC4KK2NsYXNzIENvbnN0YW50RXhwciA6IHB1YmxpYyBDb25zdGFudCB7CisgIGZyaWVuZCBzdHJ1Y3QgQ29uc3RhbnRFeHByS2V5VHlwZTsKKyAgZnJpZW5kIGNsYXNzIENvbnN0YW50OworCisgIHZvaWQgZGVzdHJveUNvbnN0YW50SW1wbCgpOworICBWYWx1ZSAqaGFuZGxlT3BlcmFuZENoYW5nZUltcGwoVmFsdWUgKkZyb20sIFZhbHVlICpUbyk7CisKK3Byb3RlY3RlZDoKKyAgQ29uc3RhbnRFeHByKFR5cGUgKnR5LCB1bnNpZ25lZCBPcGNvZGUsIFVzZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMpCisgICAgICA6IENvbnN0YW50KHR5LCBDb25zdGFudEV4cHJWYWwsIE9wcywgTnVtT3BzKSB7CisgICAgLy8gT3BlcmF0aW9uIHR5cGUgKGFuIEluc3RydWN0aW9uIG9wY29kZSkgaXMgc3RvcmVkIGFzIHRoZSBTdWJjbGFzc0RhdGEuCisgICAgc2V0VmFsdWVTdWJjbGFzc0RhdGEoT3Bjb2RlKTsKKyAgfQorCitwdWJsaWM6CisgIC8vIFN0YXRpYyBtZXRob2RzIHRvIGNvbnN0cnVjdCBhIENvbnN0YW50RXhwciBvZiBkaWZmZXJlbnQga2luZHMuICBOb3RlIHRoYXQKKyAgLy8gdGhlc2UgbWV0aG9kcyBtYXkgcmV0dXJuIGEgb2JqZWN0IHRoYXQgaXMgbm90IGFuIGluc3RhbmNlIG9mIHRoZQorICAvLyBDb25zdGFudEV4cHIgY2xhc3MsIGJlY2F1c2UgdGhleSB3aWxsIGF0dGVtcHQgdG8gZm9sZCB0aGUgY29uc3RhbnQKKyAgLy8gZXhwcmVzc2lvbiBpbnRvIHNvbWV0aGluZyBzaW1wbGVyIGlmIHBvc3NpYmxlLgorCisgIC8vLyBnZXRBbGlnbk9mIGNvbnN0YW50IGV4cHIgLSBjb21wdXRlcyB0aGUgYWxpZ25tZW50IG9mIGEgdHlwZSBpbiBhIHRhcmdldAorICAvLy8gaW5kZXBlbmRlbnQgd2F5IChOb3RlOiB0aGUgcmV0dXJuIHR5cGUgaXMgYW4gaTY0KS4KKyAgc3RhdGljIENvbnN0YW50ICpnZXRBbGlnbk9mKFR5cGUgKlR5KTsKKworICAvLy8gZ2V0U2l6ZU9mIGNvbnN0YW50IGV4cHIgLSBjb21wdXRlcyB0aGUgKGFsbG9jKSBzaXplIG9mIGEgdHlwZSAoaW4KKyAgLy8vIGFkZHJlc3MtdW5pdHMsIG5vdCBiaXRzKSBpbiBhIHRhcmdldCBpbmRlcGVuZGVudCB3YXkgKE5vdGU6IHRoZSByZXR1cm4KKyAgLy8vIHR5cGUgaXMgYW4gaTY0KS4KKyAgLy8vCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0U2l6ZU9mKFR5cGUgKlR5KTsKKworICAvLy8gZ2V0T2Zmc2V0T2YgY29uc3RhbnQgZXhwciAtIGNvbXB1dGVzIHRoZSBvZmZzZXQgb2YgYSBzdHJ1Y3QgZmllbGQgaW4gYQorICAvLy8gdGFyZ2V0IGluZGVwZW5kZW50IHdheSAoTm90ZTogdGhlIHJldHVybiB0eXBlIGlzIGFuIGk2NCkuCisgIC8vLworICBzdGF0aWMgQ29uc3RhbnQgKmdldE9mZnNldE9mKFN0cnVjdFR5cGUgKlNUeSwgdW5zaWduZWQgRmllbGRObyk7CisKKyAgLy8vIGdldE9mZnNldE9mIGNvbnN0YW50IGV4cHIgLSBUaGlzIGlzIGEgZ2VuZXJhbGl6ZWQgZm9ybSBvZiBnZXRPZmZzZXRPZiwKKyAgLy8vIHdoaWNoIHN1cHBvcnRzIGFueSBhZ2dyZWdhdGUgdHlwZSwgYW5kIGFueSBDb25zdGFudCBpbmRleC4KKyAgLy8vCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0T2Zmc2V0T2YoVHlwZSAqVHksIENvbnN0YW50ICpGaWVsZE5vKTsKKworICBzdGF0aWMgQ29uc3RhbnQgKmdldE5lZyhDb25zdGFudCAqQywgYm9vbCBIYXNOVVcgPSBmYWxzZSwgYm9vbCBIYXNOU1cgPWZhbHNlKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRGTmVnKENvbnN0YW50ICpDKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXROb3QoQ29uc3RhbnQgKkMpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEFkZChDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNOVVcgPSBmYWxzZSwgYm9vbCBIYXNOU1cgPSBmYWxzZSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RkFkZChDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0U3ViKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVyA9IGZhbHNlLCBib29sIEhhc05TVyA9IGZhbHNlKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRGU3ViKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRNdWwoQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEZNdWwoQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldFVEaXYoQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIsIGJvb2wgaXNFeGFjdCA9IGZhbHNlKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRTRGl2KENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyLCBib29sIGlzRXhhY3QgPSBmYWxzZSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RkRpdihDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0VVJlbShDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0U1JlbShDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RlJlbShDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0QW5kKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRPcihDb25zdGFudCAqQzEsIENvbnN0YW50ICpDMik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0WG9yKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRTaGwoQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldExTaHIoQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIsIGJvb2wgaXNFeGFjdCA9IGZhbHNlKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRBU2hyKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyLCBib29sIGlzRXhhY3QgPSBmYWxzZSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0VHJ1bmMoQ29uc3RhbnQgKkMsIFR5cGUgKlR5LCBib29sIE9ubHlJZlJlZHVjZWQgPSBmYWxzZSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0U0V4dChDb25zdGFudCAqQywgVHlwZSAqVHksIGJvb2wgT25seUlmUmVkdWNlZCA9IGZhbHNlKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRaRXh0KENvbnN0YW50ICpDLCBUeXBlICpUeSwgYm9vbCBPbmx5SWZSZWR1Y2VkID0gZmFsc2UpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEZQVHJ1bmMoQ29uc3RhbnQgKkMsIFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPbmx5SWZSZWR1Y2VkID0gZmFsc2UpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEZQRXh0ZW5kKENvbnN0YW50ICpDLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9ubHlJZlJlZHVjZWQgPSBmYWxzZSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0VUlUb0ZQKENvbnN0YW50ICpDLCBUeXBlICpUeSwgYm9vbCBPbmx5SWZSZWR1Y2VkID0gZmFsc2UpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldFNJVG9GUChDb25zdGFudCAqQywgVHlwZSAqVHksIGJvb2wgT25seUlmUmVkdWNlZCA9IGZhbHNlKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRGUFRvVUkoQ29uc3RhbnQgKkMsIFR5cGUgKlR5LCBib29sIE9ubHlJZlJlZHVjZWQgPSBmYWxzZSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RlBUb1NJKENvbnN0YW50ICpDLCBUeXBlICpUeSwgYm9vbCBPbmx5SWZSZWR1Y2VkID0gZmFsc2UpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldFB0clRvSW50KENvbnN0YW50ICpDLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9ubHlJZlJlZHVjZWQgPSBmYWxzZSk7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0SW50VG9QdHIoQ29uc3RhbnQgKkMsIFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT25seUlmUmVkdWNlZCA9IGZhbHNlKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRCaXRDYXN0KENvbnN0YW50ICpDLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT25seUlmUmVkdWNlZCA9IGZhbHNlKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRBZGRyU3BhY2VDYXN0KENvbnN0YW50ICpDLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT25seUlmUmVkdWNlZCA9IGZhbHNlKTsKKworICBzdGF0aWMgQ29uc3RhbnQgKmdldE5TV05lZyhDb25zdGFudCAqQykgeyByZXR1cm4gZ2V0TmVnKEMsIGZhbHNlLCB0cnVlKTsgfQorICBzdGF0aWMgQ29uc3RhbnQgKmdldE5VV05lZyhDb25zdGFudCAqQykgeyByZXR1cm4gZ2V0TmVnKEMsIHRydWUsIGZhbHNlKTsgfQorCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0TlNXQWRkKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKSB7CisgICAgcmV0dXJuIGdldEFkZChDMSwgQzIsIGZhbHNlLCB0cnVlKTsKKyAgfQorCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0TlVXQWRkKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKSB7CisgICAgcmV0dXJuIGdldEFkZChDMSwgQzIsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0TlNXU3ViKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKSB7CisgICAgcmV0dXJuIGdldFN1YihDMSwgQzIsIGZhbHNlLCB0cnVlKTsKKyAgfQorCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0TlVXU3ViKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKSB7CisgICAgcmV0dXJuIGdldFN1YihDMSwgQzIsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0TlNXTXVsKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKSB7CisgICAgcmV0dXJuIGdldE11bChDMSwgQzIsIGZhbHNlLCB0cnVlKTsKKyAgfQorCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0TlVXTXVsKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKSB7CisgICAgcmV0dXJuIGdldE11bChDMSwgQzIsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0TlNXU2hsKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKSB7CisgICAgcmV0dXJuIGdldFNobChDMSwgQzIsIGZhbHNlLCB0cnVlKTsKKyAgfQorCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0TlVXU2hsKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKSB7CisgICAgcmV0dXJuIGdldFNobChDMSwgQzIsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RXhhY3RTRGl2KENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKSB7CisgICAgcmV0dXJuIGdldFNEaXYoQzEsIEMyLCB0cnVlKTsKKyAgfQorCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RXhhY3RVRGl2KENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKSB7CisgICAgcmV0dXJuIGdldFVEaXYoQzEsIEMyLCB0cnVlKTsKKyAgfQorCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RXhhY3RBU2hyKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKSB7CisgICAgcmV0dXJuIGdldEFTaHIoQzEsIEMyLCB0cnVlKTsKKyAgfQorCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0RXhhY3RMU2hyKENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyKSB7CisgICAgcmV0dXJuIGdldExTaHIoQzEsIEMyLCB0cnVlKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGlkZW50aXR5IGZvciB0aGUgZ2l2ZW4gYmluYXJ5IG9wZXJhdGlvbiwKKyAgLy8vIGkuZS4gYSBjb25zdGFudCBDIHN1Y2ggdGhhdCBYIG9wIEMgPSBYIGFuZCBDIG9wIFggPSBYIGZvciBldmVyeSBYLiAgSXQKKyAgLy8vIHJldHVybnMgbnVsbCBpZiB0aGUgb3BlcmF0b3IgZG9lc24ndCBoYXZlIGFuIGlkZW50aXR5LgorICBzdGF0aWMgQ29uc3RhbnQgKmdldEJpbk9wSWRlbnRpdHkodW5zaWduZWQgT3Bjb2RlLCBUeXBlICpUeSk7CisKKyAgLy8vIFJldHVybiB0aGUgYWJzb3JiaW5nIGVsZW1lbnQgZm9yIHRoZSBnaXZlbiBiaW5hcnkKKyAgLy8vIG9wZXJhdGlvbiwgaS5lLiBhIGNvbnN0YW50IEMgc3VjaCB0aGF0IFggb3AgQyA9IEMgYW5kIEMgb3AgWCA9IEMgZm9yCisgIC8vLyBldmVyeSBYLiAgRm9yIGV4YW1wbGUsIHRoaXMgcmV0dXJucyB6ZXJvIGZvciBpbnRlZ2VyIG11bHRpcGxpY2F0aW9uLgorICAvLy8gSXQgcmV0dXJucyBudWxsIGlmIHRoZSBvcGVyYXRvciBkb2Vzbid0IGhhdmUgYW4gYWJzb3JiaW5nIGVsZW1lbnQuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0QmluT3BBYnNvcmJlcih1bnNpZ25lZCBPcGNvZGUsIFR5cGUgKlR5KTsKKworICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhDb25zdGFudCk7CisKKyAgLy8vIFxicmllZiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgZ2V0dGluZyBhIENhc3Qgb3BlcmF0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBvcHMgVGhlIG9wY29kZSBmb3IgdGhlIGNvbnZlcnNpb24KKyAgLy8vIFxwYXJhbSBDICBUaGUgY29uc3RhbnQgdG8gYmUgY29udmVydGVkCisgIC8vLyBccGFyYW0gVHkgVGhlIHR5cGUgdG8gd2hpY2ggdGhlIGNvbnN0YW50IGlzIGNvbnZlcnRlZAorICAvLy8gXHBhcmFtIE9ubHlJZlJlZHVjZWQgc2VlIFxhIGdldFdpdGhPcGVyYW5kcygpIGRvY3MuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0Q2FzdCh1bnNpZ25lZCBvcHMsIENvbnN0YW50ICpDLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT25seUlmUmVkdWNlZCA9IGZhbHNlKTsKKworICAvLyBAYnJpZWYgQ3JlYXRlIGEgWkV4dCBvciBCaXRDYXN0IGNhc3QgY29uc3RhbnQgZXhwcmVzc2lvbgorICBzdGF0aWMgQ29uc3RhbnQgKmdldFpFeHRPckJpdENhc3QoCisgICAgQ29uc3RhbnQgKkMsICAgLy8vPCBUaGUgY29uc3RhbnQgdG8gemV4dCBvciBiaXRjYXN0CisgICAgVHlwZSAqVHkgLy8vPCBUaGUgdHlwZSB0byB6ZXh0IG9yIGJpdGNhc3QgQyB0bworICApOworCisgIC8vIEBicmllZiBDcmVhdGUgYSBTRXh0IG9yIEJpdENhc3QgY2FzdCBjb25zdGFudCBleHByZXNzaW9uCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0U0V4dE9yQml0Q2FzdCgKKyAgICBDb25zdGFudCAqQywgICAvLy88IFRoZSBjb25zdGFudCB0byBzZXh0IG9yIGJpdGNhc3QKKyAgICBUeXBlICpUeSAvLy88IFRoZSB0eXBlIHRvIHNleHQgb3IgYml0Y2FzdCBDIHRvCisgICk7CisKKyAgLy8gQGJyaWVmIENyZWF0ZSBhIFRydW5jIG9yIEJpdENhc3QgY2FzdCBjb25zdGFudCBleHByZXNzaW9uCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0VHJ1bmNPckJpdENhc3QoCisgICAgQ29uc3RhbnQgKkMsICAgLy8vPCBUaGUgY29uc3RhbnQgdG8gdHJ1bmMgb3IgYml0Y2FzdAorICAgIFR5cGUgKlR5IC8vLzwgVGhlIHR5cGUgdG8gdHJ1bmMgb3IgYml0Y2FzdCBDIHRvCisgICk7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBCaXRDYXN0LCBBZGRyU3BhY2VDYXN0LCBvciBhIFB0clRvSW50IGNhc3QgY29uc3RhbnQKKyAgLy8vIGV4cHJlc3Npb24uCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0UG9pbnRlckNhc3QoCisgICAgQ29uc3RhbnQgKkMsICAgLy8vPCBUaGUgcG9pbnRlciB2YWx1ZSB0byBiZSBjYXN0ZWQgKG9wZXJhbmQgMCkKKyAgICBUeXBlICpUeSAvLy88IFRoZSB0eXBlIHRvIHdoaWNoIGNhc3Qgc2hvdWxkIGJlIG1hZGUKKyAgKTsKKworICAvLy8gQGJyaWVmIENyZWF0ZSBhIEJpdENhc3Qgb3IgQWRkclNwYWNlQ2FzdCBmb3IgYSBwb2ludGVyIHR5cGUgZGVwZW5kaW5nIG9uCisgIC8vLyB0aGUgYWRkcmVzcyBzcGFjZS4KKyAgc3RhdGljIENvbnN0YW50ICpnZXRQb2ludGVyQml0Q2FzdE9yQWRkclNwYWNlQ2FzdCgKKyAgICBDb25zdGFudCAqQywgICAvLy88IFRoZSBjb25zdGFudCB0byBhZGRyc3BhY2VjYXN0IG9yIGJpdGNhc3QKKyAgICBUeXBlICpUeSAvLy88IFRoZSB0eXBlIHRvIGJpdGNhc3Qgb3IgYWRkcnNwYWNlY2FzdCBDIHRvCisgICk7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBaRXh0LCBCaXRjYXN0IG9yIFRydW5jIGZvciBpbnRlZ2VyIC0+IGludGVnZXIgY2FzdHMKKyAgc3RhdGljIENvbnN0YW50ICpnZXRJbnRlZ2VyQ2FzdCgKKyAgICBDb25zdGFudCAqQywgICAgLy8vPCBUaGUgaW50ZWdlciBjb25zdGFudCB0byBiZSBjYXN0ZWQKKyAgICBUeXBlICpUeSwgLy8vPCBUaGUgaW50ZWdlciB0eXBlIHRvIGNhc3QgdG8KKyAgICBib29sIGlzU2lnbmVkICAgLy8vPCBXaGV0aGVyIEMgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgc2lnbmVkIG9yIG5vdAorICApOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgRlBFeHQsIEJpdGNhc3Qgb3IgRlBUcnVuYyBmb3IgZnAgLT4gZnAgY2FzdHMKKyAgc3RhdGljIENvbnN0YW50ICpnZXRGUENhc3QoCisgICAgQ29uc3RhbnQgKkMsICAgIC8vLzwgVGhlIGludGVnZXIgY29uc3RhbnQgdG8gYmUgY2FzdGVkCisgICAgVHlwZSAqVHkgLy8vPCBUaGUgaW50ZWdlciB0eXBlIHRvIGNhc3QgdG8KKyAgKTsKKworICAvLy8gQGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBjb252ZXJ0IGNvbnN0YW50IGV4cHJlc3Npb24KKyAgYm9vbCBpc0Nhc3QoKSBjb25zdDsKKworICAvLy8gQGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBjb21wYXJlIGNvbnN0YW50IGV4cHJlc3Npb24KKyAgYm9vbCBpc0NvbXBhcmUoKSBjb25zdDsKKworICAvLy8gQGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gaW5zZXJ0dmFsdWUgb3IgZXh0cmFjdHZhbHVlIGV4cHJlc3Npb24sCisgIC8vLyBhbmQgdGhlIGdldEluZGljZXMoKSBtZXRob2QgbWF5IGJlIHVzZWQuCisgIGJvb2wgaGFzSW5kaWNlcygpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGdldGVsZW1lbnRwdHIgZXhwcmVzc2lvbiBhbmQgYWxsCisgIC8vLyB0aGUgaW5kZXggb3BlcmFuZHMgYXJlIGNvbXBpbGUtdGltZSBrbm93biBpbnRlZ2VycyB3aXRoaW4gdGhlCisgIC8vLyBjb3JyZXNwb25kaW5nIG5vdGlvbmFsIHN0YXRpYyBhcnJheSBleHRlbnRzLiBOb3RlIHRoYXQgdGhpcyBpcworICAvLy8gbm90IGVxdWl2YWxhbnQgdG8sIGEgc3Vic2V0IG9mLCBvciBhIHN1cGVyc2V0IG9mIHRoZSAiaW5ib3VuZHMiCisgIC8vLyBwcm9wZXJ0eS4KKyAgYm9vbCBpc0dFUFdpdGhOb05vdGlvbmFsT3ZlckluZGV4aW5nKCkgY29uc3Q7CisKKyAgLy8vIFNlbGVjdCBjb25zdGFudCBleHByCisgIC8vLworICAvLy8gXHBhcmFtIE9ubHlJZlJlZHVjZWRUeSBzZWUgXGEgZ2V0V2l0aE9wZXJhbmRzKCkgZG9jcy4KKyAgc3RhdGljIENvbnN0YW50ICpnZXRTZWxlY3QoQ29uc3RhbnQgKkMsIENvbnN0YW50ICpWMSwgQ29uc3RhbnQgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpPbmx5SWZSZWR1Y2VkVHkgPSBudWxscHRyKTsKKworICAvLy8gZ2V0IC0gUmV0dXJuIGEgYmluYXJ5IG9yIHNoaWZ0IG9wZXJhdG9yIGNvbnN0YW50IGV4cHJlc3Npb24sCisgIC8vLyBmb2xkaW5nIGlmIHBvc3NpYmxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBPbmx5SWZSZWR1Y2VkVHkgc2VlIFxhIGdldFdpdGhPcGVyYW5kcygpIGRvY3MuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0KHVuc2lnbmVkIE9wY29kZSwgQ29uc3RhbnQgKkMxLCBDb25zdGFudCAqQzIsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzID0gMCwgVHlwZSAqT25seUlmUmVkdWNlZFR5ID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYW4gSUNtcCBvciBGQ21wIGNvbXBhcmlzb24gb3BlcmF0b3IgY29uc3RhbnQgZXhwcmVzc2lvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gT25seUlmUmVkdWNlZCBzZWUgXGEgZ2V0V2l0aE9wZXJhbmRzKCkgZG9jcy4KKyAgc3RhdGljIENvbnN0YW50ICpnZXRDb21wYXJlKHVuc2lnbmVkIHNob3J0IHByZWQsIENvbnN0YW50ICpDMSwgQ29uc3RhbnQgKkMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBPbmx5SWZSZWR1Y2VkID0gZmFsc2UpOworCisgIC8vLyBnZXQqIC0gUmV0dXJuIHNvbWUgY29tbW9uIGNvbnN0YW50cyB3aXRob3V0IGhhdmluZyB0bworICAvLy8gc3BlY2lmeSB0aGUgZnVsbCBJbnN0cnVjdGlvbjo6T1BDT0RFIGlkZW50aWZpZXIuCisgIC8vLworICBzdGF0aWMgQ29uc3RhbnQgKmdldElDbXAodW5zaWduZWQgc2hvcnQgcHJlZCwgQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT25seUlmUmVkdWNlZCA9IGZhbHNlKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRGQ21wKHVuc2lnbmVkIHNob3J0IHByZWQsIENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9ubHlJZlJlZHVjZWQgPSBmYWxzZSk7CisKKyAgLy8vIEdldGVsZW1lbnRwdHIgZm9ybS4gIFZhbHVlKiBpcyBvbmx5IGFjY2VwdGVkIGZvciBjb252ZW5pZW5jZTsKKyAgLy8vIGFsbCBlbGVtZW50cyBtdXN0IGJlIENvbnN0YW50cy4KKyAgLy8vCisgIC8vLyBccGFyYW0gSW5SYW5nZUluZGV4IHRoZSBpbnJhbmdlIGluZGV4IGlmIHByZXNlbnQgb3IgTm9uZS4KKyAgLy8vIFxwYXJhbSBPbmx5SWZSZWR1Y2VkVHkgc2VlIFxhIGdldFdpdGhPcGVyYW5kcygpIGRvY3MuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0R2V0RWxlbWVudFB0cihUeXBlICpUeSwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDb25zdGFudCAqPiBJZHhMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbkJvdW5kcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8dW5zaWduZWQ+IEluUmFuZ2VJbmRleCA9IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpPbmx5SWZSZWR1Y2VkVHkgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIGdldEdldEVsZW1lbnRQdHIoCisgICAgICAgIFR5LCBDLCBtYWtlQXJyYXlSZWYoKFZhbHVlICogY29uc3QgKilJZHhMaXN0LmRhdGEoKSwgSWR4TGlzdC5zaXplKCkpLAorICAgICAgICBJbkJvdW5kcywgSW5SYW5nZUluZGV4LCBPbmx5SWZSZWR1Y2VkVHkpOworICB9CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0R2V0RWxlbWVudFB0cihUeXBlICpUeSwgQ29uc3RhbnQgKkMsIENvbnN0YW50ICpJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEluQm91bmRzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDx1bnNpZ25lZD4gSW5SYW5nZUluZGV4ID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKk9ubHlJZlJlZHVjZWRUeSA9IG51bGxwdHIpIHsKKyAgICAvLyBUaGlzIGZvcm0gb2YgdGhlIGZ1bmN0aW9uIG9ubHkgZXhpc3RzIHRvIGF2b2lkIGFtYmlndW91cyBvdmVybG9hZAorICAgIC8vIHdhcm5pbmdzIGFib3V0IHdoZXRoZXIgdG8gY29udmVydCBJZHggdG8gQXJyYXlSZWY8Q29uc3RhbnQgKj4gb3IKKyAgICAvLyBBcnJheVJlZjxWYWx1ZSAqPi4KKyAgICByZXR1cm4gZ2V0R2V0RWxlbWVudFB0cihUeSwgQywgY2FzdDxWYWx1ZT4oSWR4KSwgSW5Cb3VuZHMsIEluUmFuZ2VJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPbmx5SWZSZWR1Y2VkVHkpOworICB9CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0R2V0RWxlbWVudFB0cihUeXBlICpUeSwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBJZHhMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbkJvdW5kcyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8dW5zaWduZWQ+IEluUmFuZ2VJbmRleCA9IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpPbmx5SWZSZWR1Y2VkVHkgPSBudWxscHRyKTsKKworICAvLy8gQ3JlYXRlIGFuICJpbmJvdW5kcyIgZ2V0ZWxlbWVudHB0ci4gU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciB0aGUKKyAgLy8vICJpbmJvdW5kcyIgZmxhZyBpbiBMYW5nUmVmLmh0bWwgZm9yIGRldGFpbHMuCisgIHN0YXRpYyBDb25zdGFudCAqZ2V0SW5Cb3VuZHNHZXRFbGVtZW50UHRyKFR5cGUgKlR5LCBDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q29uc3RhbnQgKj4gSWR4TGlzdCkgeworICAgIHJldHVybiBnZXRHZXRFbGVtZW50UHRyKFR5LCBDLCBJZHhMaXN0LCB0cnVlKTsKKyAgfQorICBzdGF0aWMgQ29uc3RhbnQgKmdldEluQm91bmRzR2V0RWxlbWVudFB0cihUeXBlICpUeSwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpJZHgpIHsKKyAgICAvLyBUaGlzIGZvcm0gb2YgdGhlIGZ1bmN0aW9uIG9ubHkgZXhpc3RzIHRvIGF2b2lkIGFtYmlndW91cyBvdmVybG9hZAorICAgIC8vIHdhcm5pbmdzIGFib3V0IHdoZXRoZXIgdG8gY29udmVydCBJZHggdG8gQXJyYXlSZWY8Q29uc3RhbnQgKj4gb3IKKyAgICAvLyBBcnJheVJlZjxWYWx1ZSAqPi4KKyAgICByZXR1cm4gZ2V0R2V0RWxlbWVudFB0cihUeSwgQywgSWR4LCB0cnVlKTsKKyAgfQorICBzdGF0aWMgQ29uc3RhbnQgKmdldEluQm91bmRzR2V0RWxlbWVudFB0cihUeXBlICpUeSwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IElkeExpc3QpIHsKKyAgICByZXR1cm4gZ2V0R2V0RWxlbWVudFB0cihUeSwgQywgSWR4TGlzdCwgdHJ1ZSk7CisgIH0KKworICBzdGF0aWMgQ29uc3RhbnQgKmdldEV4dHJhY3RFbGVtZW50KENvbnN0YW50ICpWZWMsIENvbnN0YW50ICpJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqT25seUlmUmVkdWNlZFR5ID0gbnVsbHB0cik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0SW5zZXJ0RWxlbWVudChDb25zdGFudCAqVmVjLCBDb25zdGFudCAqRWx0LCBDb25zdGFudCAqSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqT25seUlmUmVkdWNlZFR5ID0gbnVsbHB0cik7CisgIHN0YXRpYyBDb25zdGFudCAqZ2V0U2h1ZmZsZVZlY3RvcihDb25zdGFudCAqVjEsIENvbnN0YW50ICpWMiwgQ29uc3RhbnQgKk1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpPbmx5SWZSZWR1Y2VkVHkgPSBudWxscHRyKTsKKyAgc3RhdGljIENvbnN0YW50ICpnZXRFeHRyYWN0VmFsdWUoQ29uc3RhbnQgKkFnZywgQXJyYXlSZWY8dW5zaWduZWQ+IElkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKk9ubHlJZlJlZHVjZWRUeSA9IG51bGxwdHIpOworICBzdGF0aWMgQ29uc3RhbnQgKmdldEluc2VydFZhbHVlKENvbnN0YW50ICpBZ2csIENvbnN0YW50ICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IElkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqT25seUlmUmVkdWNlZFR5ID0gbnVsbHB0cik7CisKKyAgLy8vIFJldHVybiB0aGUgb3Bjb2RlIGF0IHRoZSByb290IG9mIHRoaXMgY29uc3RhbnQgZXhwcmVzc2lvbgorICB1bnNpZ25lZCBnZXRPcGNvZGUoKSBjb25zdCB7IHJldHVybiBnZXRTdWJjbGFzc0RhdGFGcm9tVmFsdWUoKTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIElDTVAgb3IgRkNNUCBwcmVkaWNhdGUgdmFsdWUuIEFzc2VydCBpZiB0aGlzIGlzIG5vdCBhbiBJQ01QIG9yCisgIC8vLyBGQ01QIGNvbnN0YW50IGV4cHJlc3Npb24uCisgIHVuc2lnbmVkIGdldFByZWRpY2F0ZSgpIGNvbnN0OworCisgIC8vLyBBc3NlcnQgdGhhdCB0aGlzIGlzIGFuIGluc2VydHZhbHVlIG9yIGV4YWN0dmFsdWUKKyAgLy8vIGV4cHJlc3Npb24gYW5kIHJldHVybiB0aGUgbGlzdCBvZiBpbmRpY2VzLgorICBBcnJheVJlZjx1bnNpZ25lZD4gZ2V0SW5kaWNlcygpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gZm9yIGFuIG9wY29kZS4KKyAgY29uc3QgY2hhciAqZ2V0T3Bjb2RlTmFtZSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBjb25zdGFudCBleHByZXNzaW9uIGlkZW50aWNhbCB0byB0aGlzIG9uZSwgYnV0IHdpdGggdGhlIHNwZWNpZmllZAorICAvLy8gb3BlcmFuZCBzZXQgdG8gdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgQ29uc3RhbnQgKmdldFdpdGhPcGVyYW5kUmVwbGFjZWQodW5zaWduZWQgT3BObywgQ29uc3RhbnQgKk9wKSBjb25zdDsKKworICAvLy8gVGhpcyByZXR1cm5zIHRoZSBjdXJyZW50IGNvbnN0YW50IGV4cHJlc3Npb24gd2l0aCB0aGUgb3BlcmFuZHMgcmVwbGFjZWQKKyAgLy8vIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZXMuIFRoZSBzcGVjaWZpZWQgYXJyYXkgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlcgorICAvLy8gb2Ygb3BlcmFuZHMgYXMgb3VyIGN1cnJlbnQgb25lLgorICBDb25zdGFudCAqZ2V0V2l0aE9wZXJhbmRzKEFycmF5UmVmPENvbnN0YW50Kj4gT3BzKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFdpdGhPcGVyYW5kcyhPcHMsIGdldFR5cGUoKSk7CisgIH0KKworICAvLy8gR2V0IHRoZSBjdXJyZW50IGV4cHJlc3Npb24gd2l0aCB0aGUgb3BlcmFuZHMgcmVwbGFjZWQuCisgIC8vLworICAvLy8gUmV0dXJuIHRoZSBjdXJyZW50IGNvbnN0YW50IGV4cHJlc3Npb24gd2l0aCB0aGUgb3BlcmFuZHMgcmVwbGFjZWQgd2l0aCBcYworICAvLy8gT3BzIGFuZCB0aGUgdHlwZSB3aXRoIFxjIFR5LiAgVGhlIG5ldyBvcGVyYW5kcyBtdXN0IGhhdmUgdGhlIHNhbWUgbnVtYmVyCisgIC8vLyBhcyB0aGUgY3VycmVudCBvbmVzLgorICAvLy8KKyAgLy8vIElmIFxjIE9ubHlJZlJlZHVjZWQgaXMgXGMgdHJ1ZSwgbnVsbHB0ciB3aWxsIGJlIHJldHVybmVkIHVubGVzcyBzb21ldGhpbmcKKyAgLy8vIGdldHMgY29uc3RhbnQtZm9sZGVkLCB0aGUgdHlwZSBjaGFuZ2VzLCBvciB0aGUgZXhwcmVzc2lvbiBpcyBvdGhlcndpc2UKKyAgLy8vIGNhbm9uaWNhbGl6ZWQuICBUaGlzIHBhcmFtZXRlciBzaG91bGQgYWxtb3N0IGFsd2F5cyBiZSBcYyBmYWxzZS4KKyAgQ29uc3RhbnQgKmdldFdpdGhPcGVyYW5kcyhBcnJheVJlZjxDb25zdGFudCAqPiBPcHMsIFR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgT25seUlmUmVkdWNlZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKlNyY1R5ID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgYW4gSW5zdHJ1Y3Rpb24gd2hpY2ggaW1wbGVtZW50cyB0aGUgc2FtZSBvcGVyYXRpb24gYXMgdGhpcworICAvLy8gQ29uc3RhbnRFeHByLiBUaGUgaW5zdHJ1Y3Rpb24gaXMgbm90IGxpbmtlZCB0byBhbnkgYmFzaWMgYmxvY2suCisgIC8vLworICAvLy8gQSBiZXR0ZXIgYXBwcm9hY2ggdG8gdGhpcyBjb3VsZCBiZSB0byBoYXZlIGEgY29uc3RydWN0b3IgZm9yIEluc3RydWN0aW9uCisgIC8vLyB3aGljaCB3b3VsZCB0YWtlIGEgQ29uc3RhbnRFeHByIHBhcmFtZXRlciwgYnV0IHRoYXQgd291bGQgaGF2ZSBzcHJlYWQKKyAgLy8vIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgQ29uc3RhbnRFeHByIG91dHNpZGUgb2YgQ29uc3RhbnRzLmNwcCwgd2hpY2gKKyAgLy8vIHdvdWxkIG1ha2UgaXQgaGFyZGVyIHRvIHJlbW92ZSBDb25zdGFudEV4cHJzIGFsdG9nZXRoZXIuCisgIEluc3RydWN0aW9uICpnZXRBc0luc3RydWN0aW9uKCk7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IENvbnN0YW50RXhwclZhbDsKKyAgfQorCitwcml2YXRlOgorICAvLyBTaGFkb3cgVmFsdWU6OnNldFZhbHVlU3ViY2xhc3NEYXRhIHdpdGggYSBwcml2YXRlIGZvcndhcmRpbmcgbWV0aG9kIHNvIHRoYXQKKyAgLy8gc3ViY2xhc3NlcyBjYW5ub3QgYWNjaWRlbnRhbGx5IHVzZSBpdC4KKyAgdm9pZCBzZXRWYWx1ZVN1YmNsYXNzRGF0YSh1bnNpZ25lZCBzaG9ydCBEKSB7CisgICAgVmFsdWU6OnNldFZhbHVlU3ViY2xhc3NEYXRhKEQpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8Q29uc3RhbnRFeHByPiA6CisgIHB1YmxpYyBWYXJpYWRpY09wZXJhbmRUcmFpdHM8Q29uc3RhbnRFeHByLCAxPiB7Cit9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoQ29uc3RhbnRFeHByLCBDb25zdGFudCkKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyAndW5kZWYnIHZhbHVlcyBhcmUgdGhpbmdzIHRoYXQgZG8gbm90IGhhdmUgc3BlY2lmaWVkIGNvbnRlbnRzLgorLy8vIFRoZXNlIGFyZSB1c2VkIGZvciBhIHZhcmlldHkgb2YgcHVycG9zZXMsIGluY2x1ZGluZyBnbG9iYWwgdmFyaWFibGUKKy8vLyBpbml0aWFsaXplcnMgYW5kIG9wZXJhbmRzIHRvIGluc3RydWN0aW9ucy4gICd1bmRlZicgdmFsdWVzIGNhbiBvY2N1ciB3aXRoCisvLy8gYW55IGZpcnN0LWNsYXNzIHR5cGUuCisvLy8KKy8vLyBVbmRlZiB2YWx1ZXMgYXJlbid0IGV4YWN0bHkgY29uc3RhbnRzOyBpZiB0aGV5IGhhdmUgbXVsdGlwbGUgdXNlcywgdGhleQorLy8vIGNhbiBhcHBlYXIgdG8gaGF2ZSBkaWZmZXJlbnQgYml0IHBhdHRlcm5zIGF0IGVhY2ggdXNlLiBTZWUKKy8vLyBMYW5nUmVmLmh0bWwjdW5kZWZ2YWx1ZXMgZm9yIGRldGFpbHMuCisvLy8KK2NsYXNzIFVuZGVmVmFsdWUgZmluYWwgOiBwdWJsaWMgQ29uc3RhbnREYXRhIHsKKyAgZnJpZW5kIGNsYXNzIENvbnN0YW50OworCisgIGV4cGxpY2l0IFVuZGVmVmFsdWUoVHlwZSAqVCkgOiBDb25zdGFudERhdGEoVCwgVW5kZWZWYWx1ZVZhbCkge30KKworICB2b2lkIGRlc3Ryb3lDb25zdGFudEltcGwoKTsKKworcHVibGljOgorICBVbmRlZlZhbHVlKGNvbnN0IFVuZGVmVmFsdWUgJikgPSBkZWxldGU7CisKKyAgLy8vIFN0YXRpYyBmYWN0b3J5IG1ldGhvZHMgLSBSZXR1cm4gYW4gJ3VuZGVmJyBvYmplY3Qgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgorICBzdGF0aWMgVW5kZWZWYWx1ZSAqZ2V0KFR5cGUgKlQpOworCisgIC8vLyBJZiB0aGlzIFVuZGVmIGhhcyBhcnJheSBvciB2ZWN0b3IgdHlwZSwgcmV0dXJuIGEgdW5kZWYgd2l0aCB0aGUgcmlnaHQKKyAgLy8vIGVsZW1lbnQgdHlwZS4KKyAgVW5kZWZWYWx1ZSAqZ2V0U2VxdWVudGlhbEVsZW1lbnQoKSBjb25zdDsKKworICAvLy8gSWYgdGhpcyB1bmRlZiBoYXMgc3RydWN0IHR5cGUsIHJldHVybiBhIHVuZGVmIHdpdGggdGhlIHJpZ2h0IGVsZW1lbnQgdHlwZQorICAvLy8gZm9yIHRoZSBzcGVjaWZpZWQgZWxlbWVudC4KKyAgVW5kZWZWYWx1ZSAqZ2V0U3RydWN0RWxlbWVudCh1bnNpZ25lZCBFbHQpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYW4gdW5kZWYgb2YgdGhlIHJpZ2h0IHZhbHVlIGZvciB0aGUgc3BlY2lmaWVkIEdFUCBpbmRleCBpZiB3ZSBjYW4sCisgIC8vLyBvdGhlcndpc2UgcmV0dXJuIG51bGwgKGUuZy4gaWYgQyBpcyBhIENvbnN0YW50RXhwcikuCisgIFVuZGVmVmFsdWUgKmdldEVsZW1lbnRWYWx1ZShDb25zdGFudCAqQykgY29uc3Q7CisKKyAgLy8vIFJldHVybiBhbiB1bmRlZiBvZiB0aGUgcmlnaHQgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgR0VQIGluZGV4LgorICBVbmRlZlZhbHVlICpnZXRFbGVtZW50VmFsdWUodW5zaWduZWQgSWR4KSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGFycmF5LCB2ZWN0b3IsIG9yIHN0cnVjdC4KKyAgdW5zaWduZWQgZ2V0TnVtRWxlbWVudHMoKSBjb25zdDsKKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gVW5kZWZWYWx1ZVZhbDsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfQ09OU1RBTlRTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRElCdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RJQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFhOGE4ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RJQnVpbGRlci5oCkBAIC0wLDAgKzEsODQ3IEBACisvLz09PS0gRElCdWlsZGVyLmggLSBEZWJ1ZyBJbmZvcm1hdGlvbiBCdWlsZGVyIC0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgRElCdWlsZGVyIHRoYXQgaXMgdXNlZnVsIGZvciBjcmVhdGluZyBkZWJ1Z2dpbmcKKy8vIGluZm9ybWF0aW9uIGVudHJpZXMgaW4gTExWTSBJUiBmb3JtLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9ESUJVSUxERVJfSAorI2RlZmluZSBMTFZNX0lSX0RJQlVJTERFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTWFwVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGVidWdJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZWJ1Z0luZm9NZXRhZGF0YS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVHJhY2tpbmdNRFJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworICBjbGFzcyBCYXNpY0Jsb2NrOworICBjbGFzcyBDb25zdGFudDsKKyAgY2xhc3MgRnVuY3Rpb247CisgIGNsYXNzIEluc3RydWN0aW9uOworICBjbGFzcyBMTFZNQ29udGV4dDsKKyAgY2xhc3MgTW9kdWxlOworICBjbGFzcyBWYWx1ZTsKKworICBjbGFzcyBESUJ1aWxkZXIgeworICAgIE1vZHVsZSAmTTsKKyAgICBMTFZNQ29udGV4dCAmVk1Db250ZXh0OworCisgICAgRElDb21waWxlVW5pdCAqQ1VOb2RlOyAgIC8vLzwgVGhlIG9uZSBjb21waWxlIHVuaXQgY3JlYXRlZCBieSB0aGlzIERJQnVpbGVyLgorICAgIEZ1bmN0aW9uICpEZWNsYXJlRm47ICAgICAvLy88IGxsdm0uZGJnLmRlY2xhcmUKKyAgICBGdW5jdGlvbiAqVmFsdWVGbjsgICAgICAgLy8vPCBsbHZtLmRiZy52YWx1ZQorCisgICAgU21hbGxWZWN0b3I8TWV0YWRhdGEgKiwgND4gQWxsRW51bVR5cGVzOworICAgIC8vLyBUcmFjayB0aGUgUmV0YWluVHlwZXMsIHNpbmNlIHRoZXkgY2FuIGJlIHVwZGF0ZWQgbGF0ZXIgb24uCisgICAgU21hbGxWZWN0b3I8VHJhY2tpbmdNRE5vZGVSZWYsIDQ+IEFsbFJldGFpblR5cGVzOworICAgIFNtYWxsVmVjdG9yPE1ldGFkYXRhICosIDQ+IEFsbFN1YnByb2dyYW1zOworICAgIFNtYWxsVmVjdG9yPE1ldGFkYXRhICosIDQ+IEFsbEdWczsKKyAgICBTbWFsbFZlY3RvcjxUcmFja2luZ01ETm9kZVJlZiwgND4gQWxsSW1wb3J0ZWRNb2R1bGVzOworICAgIC8vLyBNYXAgTWFjcm8gcGFyZW50ICh3aGljaCBjYW4gYmUgRElNYWNyb0ZpbGUgb3IgbnVsbHB0cikgdG8gYSBsaXN0IG9mCisgICAgLy8vIE1ldGFkYXRhIGFsbCBvZiB0eXBlIERJTWFjcm9Ob2RlLgorICAgIC8vLyBESU1hY3JvTm9kZSdzIHdpdGggbnVsbHB0ciBwYXJlbnQgYXJlIERJQ29tcGlsZVVuaXQgZGlyZWN0IGNoaWxkcmVuLgorICAgIE1hcFZlY3RvcjxNRE5vZGUgKiwgU2V0VmVjdG9yPE1ldGFkYXRhICo+PiBBbGxNYWNyb3NQZXJQYXJlbnQ7CisKKyAgICAvLy8gVHJhY2sgbm9kZXMgdGhhdCBtYXkgYmUgdW5yZXNvbHZlZC4KKyAgICBTbWFsbFZlY3RvcjxUcmFja2luZ01ETm9kZVJlZiwgND4gVW5yZXNvbHZlZE5vZGVzOworICAgIGJvb2wgQWxsb3dVbnJlc29sdmVkTm9kZXM7CisKKyAgICAvLy8gRWFjaCBzdWJwcm9ncmFtJ3MgcHJlc2VydmVkIGxvY2FsIHZhcmlhYmxlcy4KKyAgICAvLy8KKyAgICAvLy8gRG8gbm90IHVzZSBhIHN0ZDo6dmVjdG9yLiAgU29tZSB2ZXJzaW9ucyBvZiBsaWJjKysgYXBwYXJlbnRseSBjb3B5CisgICAgLy8vIGluc3RlYWQgb2YgbW92ZSBvbiBncm93IG9wZXJhdGlvbnMsIGFuZCBUcmFja2luZ01EUmVmIGlzIGV4cGVuc2l2ZSB0bworICAgIC8vLyBjb3B5LgorICAgIERlbnNlTWFwPE1ETm9kZSAqLCBTbWFsbFZlY3RvcjxUcmFja2luZ01ETm9kZVJlZiwgMT4+IFByZXNlcnZlZFZhcmlhYmxlczsKKworICAgIC8vLyBDcmVhdGUgYSB0ZW1wb3JhcnkuCisgICAgLy8vCisgICAgLy8vIENyZWF0ZSBhbiBcYSB0ZW1wb3Jhcnkgbm9kZSBhbmQgdHJhY2sgaXQgaW4gXGEgVW5yZXNvbHZlZE5vZGVzLgorICAgIHZvaWQgdHJhY2tJZlVucmVzb2x2ZWQoTUROb2RlICpOKTsKKworICAgIC8vLyBJbnRlcm5hbCBoZWxwZXIgZm9yIGluc2VydERlY2xhcmUuCisgICAgSW5zdHJ1Y3Rpb24gKmluc2VydERlY2xhcmUobGx2bTo6VmFsdWUgKlN0b3JhZ2UsIERJTG9jYWxWYXJpYWJsZSAqVmFySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUV4cHJlc3Npb24gKkV4cHIsIGNvbnN0IERJTG9jYXRpb24gKkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEJCLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKworICAgIC8vLyBJbnRlcm5hbCBoZWxwZXIgZm9yIGluc2VydERiZ1ZhbHVlSW50cmluc2ljLgorICAgIEluc3RydWN0aW9uICoKKyAgICBpbnNlcnREYmdWYWx1ZUludHJpbnNpYyhsbHZtOjpWYWx1ZSAqVmFsLCBESUxvY2FsVmFyaWFibGUgKlZhckluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElFeHByZXNzaW9uICpFeHByLCBjb25zdCBESUxvY2F0aW9uICpETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRCQiwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSk7CisKKyAgcHVibGljOgorICAgIC8vLyBDb25zdHJ1Y3QgYSBidWlsZGVyIGZvciBhIG1vZHVsZS4KKyAgICAvLy8KKyAgICAvLy8gSWYgXGMgQWxsb3dVbnJlc29sdmVkLCBjb2xsZWN0IHVucmVzb2x2ZWQgbm9kZXMgYXR0YWNoZWQgdG8gdGhlIG1vZHVsZQorICAgIC8vLyBpbiBvcmRlciB0byByZXNvbHZlIGN5Y2xlcyBkdXJpbmcgXGEgZmluYWxpemUoKS4KKyAgICAvLy8KKyAgICAvLy8gSWYgXHAgQ1UgaXMgZ2l2ZW4gYSB2YWx1ZSBvdGhlciB0aGFuIG51bGxwdHIsIHRoZW4gc2V0IFxwIENVTm9kZSB0byBDVS4KKyAgICBleHBsaWNpdCBESUJ1aWxkZXIoTW9kdWxlICZNLCBib29sIEFsbG93VW5yZXNvbHZlZCA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgIERJQ29tcGlsZVVuaXQgKkNVID0gbnVsbHB0cik7CisgICAgRElCdWlsZGVyKGNvbnN0IERJQnVpbGRlciAmKSA9IGRlbGV0ZTsKKyAgICBESUJ1aWxkZXIgJm9wZXJhdG9yPShjb25zdCBESUJ1aWxkZXIgJikgPSBkZWxldGU7CisKKyAgICAvLy8gQ29uc3RydWN0IGFueSBkZWZlcnJlZCBkZWJ1ZyBpbmZvIGRlc2NyaXB0b3JzLgorICAgIHZvaWQgZmluYWxpemUoKTsKKworICAgIC8vLyBGaW5hbGl6ZSBhIHNwZWNpZmljIHN1YnByb2dyYW0gLSBubyBuZXcgdmFyaWFibGVzIG1heSBiZSBhZGRlZCB0byB0aGlzCisgICAgLy8vIHN1YnByb2dyYW0gYWZ0ZXJ3YXJkcy4KKyAgICB2b2lkIGZpbmFsaXplU3VicHJvZ3JhbShESVN1YnByb2dyYW0gKlNQKTsKKworICAgIC8vLyBBIENvbXBpbGVVbml0IHByb3ZpZGVzIGFuIGFuY2hvciBmb3IgYWxsIGRlYnVnZ2luZworICAgIC8vLyBpbmZvcm1hdGlvbiBnZW5lcmF0ZWQgZHVyaW5nIHRoaXMgaW5zdGFuY2Ugb2YgY29tcGlsYXRpb24uCisgICAgLy8vIFxwYXJhbSBMYW5nICAgICAgICAgIFNvdXJjZSBwcm9ncmFtbWluZyBsYW5ndWFnZSwgZWcuIGR3YXJmOjpEV19MQU5HX0M5OQorICAgIC8vLyBccGFyYW0gRmlsZSAgICAgICAgICBGaWxlIGluZm8uCisgICAgLy8vIFxwYXJhbSBQcm9kdWNlciAgICAgIElkZW50aWZ5IHRoZSBwcm9kdWNlciBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24KKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgYW5kIGNvZGUuICBVc3VhbGx5IHRoaXMgaXMgYSBjb21waWxlcgorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICB2ZXJzaW9uIHN0cmluZy4KKyAgICAvLy8gXHBhcmFtIGlzT3B0aW1pemVkICAgQSBib29sZWFuIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgb3B0aW1pemF0aW9uCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgIGlzIGVuYWJsZWQgb3Igbm90LgorICAgIC8vLyBccGFyYW0gRmxhZ3MgICAgICAgICBUaGlzIHN0cmluZyBsaXN0cyBjb21tYW5kIGxpbmUgb3B0aW9ucy4gVGhpcworICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgaXMgZGlyZWN0bHkgZW1iZWRkZWQgaW4gZGVidWcgaW5mbworICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQgd2hpY2ggbWF5IGJlIHVzZWQgYnkgYSB0b29sCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgIGFuYWx5emluZyBnZW5lcmF0ZWQgZGVidWdnaW5nIGluZm9ybWF0aW9uLgorICAgIC8vLyBccGFyYW0gUlYgICAgICAgICAgICBUaGlzIGluZGljYXRlcyBydW50aW1lIHZlcnNpb24gZm9yIGxhbmd1YWdlcyBsaWtlCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgIE9iamVjdGl2ZS1DLgorICAgIC8vLyBccGFyYW0gU3BsaXROYW1lICAgICBUaGUgbmFtZSBvZiB0aGUgZmlsZSB0aGF0IHdlJ2xsIHNwbGl0IGRlYnVnIGluZm8KKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgb3V0IGludG8uCisgICAgLy8vIFxwYXJhbSBLaW5kICAgICAgICAgIFRoZSBraW5kIG9mIGRlYnVnIGluZm9ybWF0aW9uIHRvIGdlbmVyYXRlLgorICAgIC8vLyBccGFyYW0gRFdPSWQgICAgICAgICBUaGUgRFdPSWQgaWYgdGhpcyBpcyBhIHNwbGl0IHNrZWxldG9uIGNvbXBpbGUgdW5pdC4KKyAgICAvLy8gXHBhcmFtIFNwbGl0RGVidWdJbmxpbmluZyAgICBXaGV0aGVyIHRvIGVtaXQgaW5saW5lIGRlYnVnIGluZm8uCisgICAgLy8vIFxwYXJhbSBEZWJ1Z0luZm9Gb3JQcm9maWxpbmcgV2hldGhlciB0byBlbWl0IGV4dHJhIGRlYnVnIGluZm8gZm9yCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvZmlsZSBjb2xsZWN0aW9uLgorICAgIC8vLyBccGFyYW0gR251UHVibmFtZXMgICBXaGV0aGVyIHRvIGVtaXQgLmRlYnVnX2dudV9wdWJuYW1lcyBzZWN0aW9uIGluc3RlYWQKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgb2YgLmRlYnVnX3B1Ym5hbWVzLgorICAgIERJQ29tcGlsZVVuaXQgKgorICAgIGNyZWF0ZUNvbXBpbGVVbml0KHVuc2lnbmVkIExhbmcsIERJRmlsZSAqRmlsZSwgU3RyaW5nUmVmIFByb2R1Y2VyLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNPcHRpbWl6ZWQsIFN0cmluZ1JlZiBGbGFncywgdW5zaWduZWQgUlYsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFNwbGl0TmFtZSA9IFN0cmluZ1JlZigpLAorICAgICAgICAgICAgICAgICAgICAgIERJQ29tcGlsZVVuaXQ6OkRlYnVnRW1pc3Npb25LaW5kIEtpbmQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICBESUNvbXBpbGVVbml0OjpEZWJ1Z0VtaXNzaW9uS2luZDo6RnVsbERlYnVnLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IERXT0lkID0gMCwgYm9vbCBTcGxpdERlYnVnSW5saW5pbmcgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVidWdJbmZvRm9yUHJvZmlsaW5nID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBHbnVQdWJuYW1lcyA9IGZhbHNlKTsKKworICAgIC8vLyBDcmVhdGUgYSBmaWxlIGRlc2NyaXB0b3IgdG8gaG9sZCBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGEgZmlsZS4KKyAgICAvLy8gXHBhcmFtIEZpbGVuYW1lICBGaWxlIG5hbWUuCisgICAgLy8vIFxwYXJhbSBEaXJlY3RvcnkgRGlyZWN0b3J5LgorICAgIC8vLyBccGFyYW0gQ2hlY2tzdW0gIE9wdGlvbmFsIGNoZWNrc3VtIGtpbmQgKGUuZy4gQ1NLX01ENSwgQ1NLX1NIQTEsIGV0Yy4pCisgICAgLy8vICAgICAgICAgICAgICAgICAgYW5kIHZhbHVlLgorICAgIC8vLyBccGFyYW0gU291cmNlICAgIE9wdGlvbmFsIHNvdXJjZSB0ZXh0LgorICAgIERJRmlsZSAqCisgICAgY3JlYXRlRmlsZShTdHJpbmdSZWYgRmlsZW5hbWUsIFN0cmluZ1JlZiBEaXJlY3RvcnksCisgICAgICAgICAgICAgICBPcHRpb25hbDxESUZpbGU6OkNoZWNrc3VtSW5mbzxTdHJpbmdSZWY+PiBDaGVja3N1bSA9IE5vbmUsCisgICAgICAgICAgICAgICBPcHRpb25hbDxTdHJpbmdSZWY+IFNvdXJjZSA9IE5vbmUpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgZm9yIGEgbWFjcm8uCisgICAgLy8vIFxwYXJhbSBQYXJlbnQgICAgIE1hY3JvIHBhcmVudCAoY291bGQgYmUgbnVsbHB0cikuCisgICAgLy8vIFxwYXJhbSBMaW5lICAgICAgIFNvdXJjZSBsaW5lIG51bWJlciB3aGVyZSB0aGUgbWFjcm8gaXMgZGVmaW5lZC4KKyAgICAvLy8gXHBhcmFtIE1hY3JvVHlwZSAgRFdfTUFDSU5GT19kZWZpbmUgb3IgRFdfTUFDSU5GT191bmRlZi4KKyAgICAvLy8gXHBhcmFtIE5hbWUgICAgICAgTWFjcm8gbmFtZS4KKyAgICAvLy8gXHBhcmFtIFZhbHVlICAgICAgTWFjcm8gdmFsdWUuCisgICAgRElNYWNybyAqY3JlYXRlTWFjcm8oRElNYWNyb0ZpbGUgKlBhcmVudCwgdW5zaWduZWQgTGluZSwgdW5zaWduZWQgTWFjcm9UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgVmFsdWUgPSBTdHJpbmdSZWYoKSk7CisKKyAgICAvLy8gQ3JlYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiB0ZW1wb3JhcnkgZW50cnkgZm9yIGEgbWFjcm8gZmlsZS4KKyAgICAvLy8gTGlzdCBvZiBtYWNybyBub2RlIGRpcmVjdCBjaGlsZHJlbiB3aWxsIGJlIGNhbGN1bGF0ZWQgYnkgRElCdWlsZGVyLAorICAgIC8vLyB1c2luZyB0aGUgXHAgUGFyZW50IHJlbGF0aW9uc2hpcC4KKyAgICAvLy8gXHBhcmFtIFBhcmVudCAgICAgTWFjcm8gZmlsZSBwYXJlbnQgKGNvdWxkIGJlIG51bGxwdHIpLgorICAgIC8vLyBccGFyYW0gTGluZSAgICAgICBTb3VyY2UgbGluZSBudW1iZXIgd2hlcmUgdGhlIG1hY3JvIGZpbGUgaXMgaW5jbHVkZWQuCisgICAgLy8vIFxwYXJhbSBGaWxlICAgICAgIEZpbGUgZGVzY3JpcHRvciBjb250YWluaW5nIHRoZSBuYW1lIG9mIHRoZSBtYWNybyBmaWxlLgorICAgIERJTWFjcm9GaWxlICpjcmVhdGVUZW1wTWFjcm9GaWxlKERJTWFjcm9GaWxlICpQYXJlbnQsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGaWxlICpGaWxlKTsKKworICAgIC8vLyBDcmVhdGUgYSBzaW5nbGUgZW51bWVyYXRvciB2YWx1ZS4KKyAgICBESUVudW1lcmF0b3IgKmNyZWF0ZUVudW1lcmF0b3IoU3RyaW5nUmVmIE5hbWUsIGludDY0X3QgVmFsLCBib29sIElzVW5zaWduZWQgPSBmYWxzZSk7CisKKyAgICAvLy8gQ3JlYXRlIGEgRFdBUkYgdW5zcGVjaWZpZWQgdHlwZS4KKyAgICBESUJhc2ljVHlwZSAqY3JlYXRlVW5zcGVjaWZpZWRUeXBlKFN0cmluZ1JlZiBOYW1lKTsKKworICAgIC8vLyBDcmVhdGUgQysrMTEgbnVsbHB0ciB0eXBlLgorICAgIERJQmFzaWNUeXBlICpjcmVhdGVOdWxsUHRyVHlwZSgpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgZm9yIGEgYmFzaWMKKyAgICAvLy8gdHlwZS4KKyAgICAvLy8gXHBhcmFtIE5hbWUgICAgICAgIFR5cGUgbmFtZS4KKyAgICAvLy8gXHBhcmFtIFNpemVJbkJpdHMgIFNpemUgb2YgdGhlIHR5cGUuCisgICAgLy8vIFxwYXJhbSBFbmNvZGluZyAgICBEV0FSRiBlbmNvZGluZyBjb2RlLCBlLmcuIGR3YXJmOjpEV19BVEVfZmxvYXQuCisgICAgRElCYXNpY1R5cGUgKmNyZWF0ZUJhc2ljVHlwZShTdHJpbmdSZWYgTmFtZSwgdWludDY0X3QgU2l6ZUluQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEVuY29kaW5nKTsKKworICAgIC8vLyBDcmVhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGVudHJ5IGZvciBhIHF1YWxpZmllZAorICAgIC8vLyB0eXBlLCBlLmcuICdjb25zdCBpbnQnLgorICAgIC8vLyBccGFyYW0gVGFnICAgICAgICAgVGFnIGlkZW50aWZpbmcgdHlwZSwgZS5nLiBkd2FyZjo6VEFHX3ZvbGF0aWxlX3R5cGUKKyAgICAvLy8gXHBhcmFtIEZyb21UeSAgICAgIEJhc2UgVHlwZS4KKyAgICBESURlcml2ZWRUeXBlICpjcmVhdGVRdWFsaWZpZWRUeXBlKHVuc2lnbmVkIFRhZywgRElUeXBlICpGcm9tVHkpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgZm9yIGEgcG9pbnRlci4KKyAgICAvLy8gXHBhcmFtIFBvaW50ZWVUeSAgICAgICAgIFR5cGUgcG9pbnRlZCBieSB0aGlzIHBvaW50ZXIuCisgICAgLy8vIFxwYXJhbSBTaXplSW5CaXRzICAgICAgICBTaXplLgorICAgIC8vLyBccGFyYW0gQWxpZ25JbkJpdHMgICAgICAgQWxpZ25tZW50LiAob3B0aW9uYWwpCisgICAgLy8vIFxwYXJhbSBEV0FSRkFkZHJlc3NTcGFjZSBEV0FSRiBhZGRyZXNzIHNwYWNlLiAob3B0aW9uYWwpCisgICAgLy8vIFxwYXJhbSBOYW1lICAgICAgICAgICAgICBQb2ludGVyIHR5cGUgbmFtZS4gKG9wdGlvbmFsKQorICAgIERJRGVyaXZlZFR5cGUgKmNyZWF0ZVBvaW50ZXJUeXBlKERJVHlwZSAqUG9pbnRlZVR5LCB1aW50NjRfdCBTaXplSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFsaWduSW5CaXRzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDx1bnNpZ25lZD4gRFdBUkZBZGRyZXNzU3BhY2UgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lID0gIiIpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgZm9yIGEgcG9pbnRlciB0byBtZW1iZXIuCisgICAgLy8vIFxwYXJhbSBQb2ludGVlVHkgVHlwZSBwb2ludGVkIHRvIGJ5IHRoaXMgcG9pbnRlci4KKyAgICAvLy8gXHBhcmFtIFNpemVJbkJpdHMgIFNpemUuCisgICAgLy8vIFxwYXJhbSBBbGlnbkluQml0cyBBbGlnbm1lbnQuIChvcHRpb25hbCkKKyAgICAvLy8gXHBhcmFtIENsYXNzIFR5cGUgZm9yIHdoaWNoIHRoaXMgcG9pbnRlciBwb2ludHMgdG8gbWVtYmVycyBvZi4KKyAgICBESURlcml2ZWRUeXBlICoKKyAgICBjcmVhdGVNZW1iZXJQb2ludGVyVHlwZShESVR5cGUgKlBvaW50ZWVUeSwgRElUeXBlICpDbGFzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplSW5CaXRzLCB1aW50MzJfdCBBbGlnbkluQml0cyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElOb2RlOjpESUZsYWdzIEZsYWdzID0gRElOb2RlOjpGbGFnWmVybyk7CisKKyAgICAvLy8gQ3JlYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBlbnRyeSBmb3IgYSBjKysKKyAgICAvLy8gc3R5bGUgcmVmZXJlbmNlIG9yIHJ2YWx1ZSByZWZlcmVuY2UgdHlwZS4KKyAgICBESURlcml2ZWRUeXBlICpjcmVhdGVSZWZlcmVuY2VUeXBlKHVuc2lnbmVkIFRhZywgRElUeXBlICpSVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplSW5CaXRzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFsaWduSW5CaXRzID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHVuc2lnbmVkPiBEV0FSRkFkZHJlc3NTcGFjZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSk7CisKKyAgICAvLy8gQ3JlYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBlbnRyeSBmb3IgYSB0eXBlZGVmLgorICAgIC8vLyBccGFyYW0gVHkgICAgICAgICAgT3JpZ2luYWwgdHlwZS4KKyAgICAvLy8gXHBhcmFtIE5hbWUgICAgICAgIFR5cGVkZWYgbmFtZS4KKyAgICAvLy8gXHBhcmFtIEZpbGUgICAgICAgIEZpbGUgd2hlcmUgdGhpcyB0eXBlIGlzIGRlZmluZWQuCisgICAgLy8vIFxwYXJhbSBMaW5lTm8gICAgICBMaW5lIG51bWJlci4KKyAgICAvLy8gXHBhcmFtIENvbnRleHQgICAgIFRoZSBzdXJyb3VuZGluZyBjb250ZXh0IGZvciB0aGUgdHlwZWRlZi4KKyAgICBESURlcml2ZWRUeXBlICpjcmVhdGVUeXBlZGVmKERJVHlwZSAqVHksIFN0cmluZ1JlZiBOYW1lLCBESUZpbGUgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lTm8sIERJU2NvcGUgKkNvbnRleHQpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgZm9yIGEgJ2ZyaWVuZCcuCisgICAgRElEZXJpdmVkVHlwZSAqY3JlYXRlRnJpZW5kKERJVHlwZSAqVHksIERJVHlwZSAqRnJpZW5kVHkpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgdG8gZXN0YWJsaXNoCisgICAgLy8vIGluaGVyaXRhbmNlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIHR3byB0eXBlcy4KKyAgICAvLy8gXHBhcmFtIFR5ICAgICAgICAgICBPcmlnaW5hbCB0eXBlLgorICAgIC8vLyBccGFyYW0gQmFzZVR5ICAgICAgIEJhc2UgdHlwZS4gVHkgaXMgaW5oZXJpdHMgZnJvbSBiYXNlLgorICAgIC8vLyBccGFyYW0gQmFzZU9mZnNldCAgIEJhc2Ugb2Zmc2V0LgorICAgIC8vLyBccGFyYW0gRmxhZ3MgICAgICAgIEZsYWdzIHRvIGRlc2NyaWJlIGluaGVyaXRhbmNlIGF0dHJpYnV0ZSwKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICBlLmcuIHByaXZhdGUKKyAgICBESURlcml2ZWRUeXBlICpjcmVhdGVJbmhlcml0YW5jZShESVR5cGUgKlR5LCBESVR5cGUgKkJhc2VUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBCYXNlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJTm9kZTo6RElGbGFncyBGbGFncyk7CisKKyAgICAvLy8gQ3JlYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBlbnRyeSBmb3IgYSBtZW1iZXIuCisgICAgLy8vIFxwYXJhbSBTY29wZSAgICAgICAgTWVtYmVyIHNjb3BlLgorICAgIC8vLyBccGFyYW0gTmFtZSAgICAgICAgIE1lbWJlciBuYW1lLgorICAgIC8vLyBccGFyYW0gRmlsZSAgICAgICAgIEZpbGUgd2hlcmUgdGhpcyBtZW1iZXIgaXMgZGVmaW5lZC4KKyAgICAvLy8gXHBhcmFtIExpbmVObyAgICAgICBMaW5lIG51bWJlci4KKyAgICAvLy8gXHBhcmFtIFNpemVJbkJpdHMgICBNZW1iZXIgc2l6ZS4KKyAgICAvLy8gXHBhcmFtIEFsaWduSW5CaXRzICBNZW1iZXIgYWxpZ25tZW50LgorICAgIC8vLyBccGFyYW0gT2Zmc2V0SW5CaXRzIE1lbWJlciBvZmZzZXQuCisgICAgLy8vIFxwYXJhbSBGbGFncyAgICAgICAgRmxhZ3MgdG8gZW5jb2RlIG1lbWJlciBhdHRyaWJ1dGUsIGUuZy4gcHJpdmF0ZQorICAgIC8vLyBccGFyYW0gVHkgICAgICAgICAgIFBhcmVudCB0eXBlLgorICAgIERJRGVyaXZlZFR5cGUgKmNyZWF0ZU1lbWJlclR5cGUoRElTY29wZSAqU2NvcGUsIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQWxpZ25JbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXRJbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESU5vZGU6OkRJRmxhZ3MgRmxhZ3MsIERJVHlwZSAqVHkpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgZm9yIGEgdmFyaWFudC4gIEEgdmFyaWFudAorICAgIC8vLyBub3JtYWxseSBzaG91bGQgYmUgYSBtZW1iZXIgb2YgYSB2YXJpYW50IHBhcnQuCisgICAgLy8vIFxwYXJhbSBTY29wZSAgICAgICAgTWVtYmVyIHNjb3BlLgorICAgIC8vLyBccGFyYW0gTmFtZSAgICAgICAgIE1lbWJlciBuYW1lLgorICAgIC8vLyBccGFyYW0gRmlsZSAgICAgICAgIEZpbGUgd2hlcmUgdGhpcyBtZW1iZXIgaXMgZGVmaW5lZC4KKyAgICAvLy8gXHBhcmFtIExpbmVObyAgICAgICBMaW5lIG51bWJlci4KKyAgICAvLy8gXHBhcmFtIFNpemVJbkJpdHMgICBNZW1iZXIgc2l6ZS4KKyAgICAvLy8gXHBhcmFtIEFsaWduSW5CaXRzICBNZW1iZXIgYWxpZ25tZW50LgorICAgIC8vLyBccGFyYW0gT2Zmc2V0SW5CaXRzIE1lbWJlciBvZmZzZXQuCisgICAgLy8vIFxwYXJhbSBGbGFncyAgICAgICAgRmxhZ3MgdG8gZW5jb2RlIG1lbWJlciBhdHRyaWJ1dGUsIGUuZy4gcHJpdmF0ZQorICAgIC8vLyBccGFyYW0gRGlzY3JpbWluYW50IFRoZSBkaXNjcmltaW5hbnQgZm9yIHRoaXMgYnJhbmNoOyBudWxsIGZvcgorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgIHRoZSBkZWZhdWx0IGJyYW5jaAorICAgIC8vLyBccGFyYW0gVHkgICAgICAgICAgIFBhcmVudCB0eXBlLgorICAgIERJRGVyaXZlZFR5cGUgKmNyZWF0ZVZhcmlhbnRNZW1iZXJUeXBlKERJU2NvcGUgKlNjb3BlLCBTdHJpbmdSZWYgTmFtZSwKKwkJCQkJICAgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lTm8sCisJCQkJCSAgIHVpbnQ2NF90IFNpemVJbkJpdHMsCisJCQkJCSAgIHVpbnQzMl90IEFsaWduSW5CaXRzLAorCQkJCQkgICB1aW50NjRfdCBPZmZzZXRJbkJpdHMsCisJCQkJCSAgIENvbnN0YW50ICpEaXNjcmltaW5hbnQsCisJCQkJCSAgIERJTm9kZTo6RElGbGFncyBGbGFncywgRElUeXBlICpUeSk7CisKKyAgICAvLy8gQ3JlYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBlbnRyeSBmb3IgYSBiaXQgZmllbGQgbWVtYmVyLgorICAgIC8vLyBccGFyYW0gU2NvcGUgICAgICAgICAgICAgICBNZW1iZXIgc2NvcGUuCisgICAgLy8vIFxwYXJhbSBOYW1lICAgICAgICAgICAgICAgIE1lbWJlciBuYW1lLgorICAgIC8vLyBccGFyYW0gRmlsZSAgICAgICAgICAgICAgICBGaWxlIHdoZXJlIHRoaXMgbWVtYmVyIGlzIGRlZmluZWQuCisgICAgLy8vIFxwYXJhbSBMaW5lTm8gICAgICAgICAgICAgIExpbmUgbnVtYmVyLgorICAgIC8vLyBccGFyYW0gU2l6ZUluQml0cyAgICAgICAgICBNZW1iZXIgc2l6ZS4KKyAgICAvLy8gXHBhcmFtIE9mZnNldEluQml0cyAgICAgICAgTWVtYmVyIG9mZnNldC4KKyAgICAvLy8gXHBhcmFtIFN0b3JhZ2VPZmZzZXRJbkJpdHMgTWVtYmVyIHN0b3JhZ2Ugb2Zmc2V0LgorICAgIC8vLyBccGFyYW0gRmxhZ3MgICAgICAgICAgICAgICBGbGFncyB0byBlbmNvZGUgbWVtYmVyIGF0dHJpYnV0ZS4KKyAgICAvLy8gXHBhcmFtIFR5ICAgICAgICAgICAgICAgICAgUGFyZW50IHR5cGUuCisgICAgRElEZXJpdmVkVHlwZSAqY3JlYXRlQml0RmllbGRNZW1iZXJUeXBlKAorICAgICAgICBESVNjb3BlICpTY29wZSwgU3RyaW5nUmVmIE5hbWUsIERJRmlsZSAqRmlsZSwgdW5zaWduZWQgTGluZU5vLAorICAgICAgICB1aW50NjRfdCBTaXplSW5CaXRzLCB1aW50NjRfdCBPZmZzZXRJbkJpdHMsCisgICAgICAgIHVpbnQ2NF90IFN0b3JhZ2VPZmZzZXRJbkJpdHMsIERJTm9kZTo6RElGbGFncyBGbGFncywgRElUeXBlICpUeSk7CisKKyAgICAvLy8gQ3JlYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBlbnRyeSBmb3IgYQorICAgIC8vLyBDKysgc3RhdGljIGRhdGEgbWVtYmVyLgorICAgIC8vLyBccGFyYW0gU2NvcGUgICAgICBNZW1iZXIgc2NvcGUuCisgICAgLy8vIFxwYXJhbSBOYW1lICAgICAgIE1lbWJlciBuYW1lLgorICAgIC8vLyBccGFyYW0gRmlsZSAgICAgICBGaWxlIHdoZXJlIHRoaXMgbWVtYmVyIGlzIGRlY2xhcmVkLgorICAgIC8vLyBccGFyYW0gTGluZU5vICAgICBMaW5lIG51bWJlci4KKyAgICAvLy8gXHBhcmFtIFR5ICAgICAgICAgVHlwZSBvZiB0aGUgc3RhdGljIG1lbWJlci4KKyAgICAvLy8gXHBhcmFtIEZsYWdzICAgICAgRmxhZ3MgdG8gZW5jb2RlIG1lbWJlciBhdHRyaWJ1dGUsIGUuZy4gcHJpdmF0ZS4KKyAgICAvLy8gXHBhcmFtIFZhbCAgICAgICAgQ29uc3QgaW5pdGlhbGl6ZXIgb2YgdGhlIG1lbWJlci4KKyAgICAvLy8gXHBhcmFtIEFsaWduSW5CaXRzICBNZW1iZXIgYWxpZ25tZW50LgorICAgIERJRGVyaXZlZFR5cGUgKmNyZWF0ZVN0YXRpY01lbWJlclR5cGUoRElTY29wZSAqU2NvcGUsIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lTm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVR5cGUgKlR5LCBESU5vZGU6OkRJRmxhZ3MgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQWxpZ25JbkJpdHMgPSAwKTsKKworICAgIC8vLyBDcmVhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGVudHJ5IGZvciBPYmplY3RpdmUtQworICAgIC8vLyBpbnN0YW5jZSB2YXJpYWJsZS4KKyAgICAvLy8gXHBhcmFtIE5hbWUgICAgICAgICBNZW1iZXIgbmFtZS4KKyAgICAvLy8gXHBhcmFtIEZpbGUgICAgICAgICBGaWxlIHdoZXJlIHRoaXMgbWVtYmVyIGlzIGRlZmluZWQuCisgICAgLy8vIFxwYXJhbSBMaW5lTm8gICAgICAgTGluZSBudW1iZXIuCisgICAgLy8vIFxwYXJhbSBTaXplSW5CaXRzICAgTWVtYmVyIHNpemUuCisgICAgLy8vIFxwYXJhbSBBbGlnbkluQml0cyAgTWVtYmVyIGFsaWdubWVudC4KKyAgICAvLy8gXHBhcmFtIE9mZnNldEluQml0cyBNZW1iZXIgb2Zmc2V0LgorICAgIC8vLyBccGFyYW0gRmxhZ3MgICAgICAgIEZsYWdzIHRvIGVuY29kZSBtZW1iZXIgYXR0cmlidXRlLCBlLmcuIHByaXZhdGUKKyAgICAvLy8gXHBhcmFtIFR5ICAgICAgICAgICBQYXJlbnQgdHlwZS4KKyAgICAvLy8gXHBhcmFtIFByb3BlcnR5Tm9kZSBQcm9wZXJ0eSBhc3NvY2lhdGVkIHdpdGggdGhpcyBpdmFyLgorICAgIERJRGVyaXZlZFR5cGUgKmNyZWF0ZU9iakNJVmFyKFN0cmluZ1JlZiBOYW1lLCBESUZpbGUgKkZpbGUsIHVuc2lnbmVkIExpbmVObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplSW5CaXRzLCB1aW50MzJfdCBBbGlnbkluQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXRJbkJpdHMsIERJTm9kZTo6RElGbGFncyBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVR5cGUgKlR5LCBNRE5vZGUgKlByb3BlcnR5Tm9kZSk7CisKKyAgICAvLy8gQ3JlYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBlbnRyeSBmb3IgT2JqZWN0aXZlLUMKKyAgICAvLy8gcHJvcGVydHkuCisgICAgLy8vIFxwYXJhbSBOYW1lICAgICAgICAgUHJvcGVydHkgbmFtZS4KKyAgICAvLy8gXHBhcmFtIEZpbGUgICAgICAgICBGaWxlIHdoZXJlIHRoaXMgcHJvcGVydHkgaXMgZGVmaW5lZC4KKyAgICAvLy8gXHBhcmFtIExpbmVOdW1iZXIgICBMaW5lIG51bWJlci4KKyAgICAvLy8gXHBhcmFtIEdldHRlck5hbWUgICBOYW1lIG9mIHRoZSBPYmplY3RpdmUgQyBwcm9wZXJ0eSBnZXR0ZXIgc2VsZWN0b3IuCisgICAgLy8vIFxwYXJhbSBTZXR0ZXJOYW1lICAgTmFtZSBvZiB0aGUgT2JqZWN0aXZlIEMgcHJvcGVydHkgc2V0dGVyIHNlbGVjdG9yLgorICAgIC8vLyBccGFyYW0gUHJvcGVydHlBdHRyaWJ1dGVzIE9iamVjdGl2ZSBDIHByb3BlcnR5IGF0dHJpYnV0ZXMuCisgICAgLy8vIFxwYXJhbSBUeSAgICAgICAgICAgVHlwZS4KKyAgICBESU9iakNQcm9wZXJ0eSAqY3JlYXRlT2JqQ1Byb3BlcnR5KFN0cmluZ1JlZiBOYW1lLCBESUZpbGUgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEdldHRlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU2V0dGVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFByb3BlcnR5QXR0cmlidXRlcywgRElUeXBlICpUeSk7CisKKyAgICAvLy8gQ3JlYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBlbnRyeSBmb3IgYSBjbGFzcy4KKyAgICAvLy8gXHBhcmFtIFNjb3BlICAgICAgICBTY29wZSBpbiB3aGljaCB0aGlzIGNsYXNzIGlzIGRlZmluZWQuCisgICAgLy8vIFxwYXJhbSBOYW1lICAgICAgICAgY2xhc3MgbmFtZS4KKyAgICAvLy8gXHBhcmFtIEZpbGUgICAgICAgICBGaWxlIHdoZXJlIHRoaXMgbWVtYmVyIGlzIGRlZmluZWQuCisgICAgLy8vIFxwYXJhbSBMaW5lTnVtYmVyICAgTGluZSBudW1iZXIuCisgICAgLy8vIFxwYXJhbSBTaXplSW5CaXRzICAgTWVtYmVyIHNpemUuCisgICAgLy8vIFxwYXJhbSBBbGlnbkluQml0cyAgTWVtYmVyIGFsaWdubWVudC4KKyAgICAvLy8gXHBhcmFtIE9mZnNldEluQml0cyBNZW1iZXIgb2Zmc2V0LgorICAgIC8vLyBccGFyYW0gRmxhZ3MgICAgICAgIEZsYWdzIHRvIGVuY29kZSBtZW1iZXIgYXR0cmlidXRlLCBlLmcuIHByaXZhdGUKKyAgICAvLy8gXHBhcmFtIEVsZW1lbnRzICAgICBjbGFzcyBtZW1iZXJzLgorICAgIC8vLyBccGFyYW0gVlRhYmxlSG9sZGVyIERlYnVnIGluZm8gb2YgdGhlIGJhc2UgY2xhc3MgdGhhdCBjb250YWlucyB2dGFibGUKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICBmb3IgdGhpcyB0eXBlLiBUaGlzIGlzIHVzZWQgaW4KKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICBEV19BVF9jb250YWluaW5nX3R5cGUuIFNlZSBEV0FSRiBkb2N1bWVudGF0aW9uCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgZm9yIG1vcmUgaW5mby4KKyAgICAvLy8gXHBhcmFtIFRlbXBsYXRlUGFybXMgVGVtcGxhdGUgdHlwZSBwYXJhbWV0ZXJzLgorICAgIC8vLyBccGFyYW0gVW5pcXVlSWRlbnRpZmllciBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgY2xhc3MuCisgICAgRElDb21wb3NpdGVUeXBlICpjcmVhdGVDbGFzc1R5cGUoCisgICAgICAgIERJU2NvcGUgKlNjb3BlLCBTdHJpbmdSZWYgTmFtZSwgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lTnVtYmVyLAorICAgICAgICB1aW50NjRfdCBTaXplSW5CaXRzLCB1aW50MzJfdCBBbGlnbkluQml0cywgdWludDY0X3QgT2Zmc2V0SW5CaXRzLAorICAgICAgICBESU5vZGU6OkRJRmxhZ3MgRmxhZ3MsIERJVHlwZSAqRGVyaXZlZEZyb20sIERJTm9kZUFycmF5IEVsZW1lbnRzLAorICAgICAgICBESVR5cGUgKlZUYWJsZUhvbGRlciA9IG51bGxwdHIsIE1ETm9kZSAqVGVtcGxhdGVQYXJtcyA9IG51bGxwdHIsCisgICAgICAgIFN0cmluZ1JlZiBVbmlxdWVJZGVudGlmaWVyID0gIiIpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgZm9yIGEgc3RydWN0LgorICAgIC8vLyBccGFyYW0gU2NvcGUgICAgICAgIFNjb3BlIGluIHdoaWNoIHRoaXMgc3RydWN0IGlzIGRlZmluZWQuCisgICAgLy8vIFxwYXJhbSBOYW1lICAgICAgICAgU3RydWN0IG5hbWUuCisgICAgLy8vIFxwYXJhbSBGaWxlICAgICAgICAgRmlsZSB3aGVyZSB0aGlzIG1lbWJlciBpcyBkZWZpbmVkLgorICAgIC8vLyBccGFyYW0gTGluZU51bWJlciAgIExpbmUgbnVtYmVyLgorICAgIC8vLyBccGFyYW0gU2l6ZUluQml0cyAgIE1lbWJlciBzaXplLgorICAgIC8vLyBccGFyYW0gQWxpZ25JbkJpdHMgIE1lbWJlciBhbGlnbm1lbnQuCisgICAgLy8vIFxwYXJhbSBGbGFncyAgICAgICAgRmxhZ3MgdG8gZW5jb2RlIG1lbWJlciBhdHRyaWJ1dGUsIGUuZy4gcHJpdmF0ZQorICAgIC8vLyBccGFyYW0gRWxlbWVudHMgICAgIFN0cnVjdCBlbGVtZW50cy4KKyAgICAvLy8gXHBhcmFtIFJ1blRpbWVMYW5nICBPcHRpb25hbCBwYXJhbWV0ZXIsIE9iamVjdGl2ZS1DIHJ1bnRpbWUgdmVyc2lvbi4KKyAgICAvLy8gXHBhcmFtIFVuaXF1ZUlkZW50aWZpZXIgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHN0cnVjdC4KKyAgICBESUNvbXBvc2l0ZVR5cGUgKmNyZWF0ZVN0cnVjdFR5cGUoCisgICAgICAgIERJU2NvcGUgKlNjb3BlLCBTdHJpbmdSZWYgTmFtZSwgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lTnVtYmVyLAorICAgICAgICB1aW50NjRfdCBTaXplSW5CaXRzLCB1aW50MzJfdCBBbGlnbkluQml0cywgRElOb2RlOjpESUZsYWdzIEZsYWdzLAorICAgICAgICBESVR5cGUgKkRlcml2ZWRGcm9tLCBESU5vZGVBcnJheSBFbGVtZW50cywgdW5zaWduZWQgUnVuVGltZUxhbmcgPSAwLAorICAgICAgICBESVR5cGUgKlZUYWJsZUhvbGRlciA9IG51bGxwdHIsIFN0cmluZ1JlZiBVbmlxdWVJZGVudGlmaWVyID0gIiIpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgZm9yIGFuIHVuaW9uLgorICAgIC8vLyBccGFyYW0gU2NvcGUgICAgICAgIFNjb3BlIGluIHdoaWNoIHRoaXMgdW5pb24gaXMgZGVmaW5lZC4KKyAgICAvLy8gXHBhcmFtIE5hbWUgICAgICAgICBVbmlvbiBuYW1lLgorICAgIC8vLyBccGFyYW0gRmlsZSAgICAgICAgIEZpbGUgd2hlcmUgdGhpcyBtZW1iZXIgaXMgZGVmaW5lZC4KKyAgICAvLy8gXHBhcmFtIExpbmVOdW1iZXIgICBMaW5lIG51bWJlci4KKyAgICAvLy8gXHBhcmFtIFNpemVJbkJpdHMgICBNZW1iZXIgc2l6ZS4KKyAgICAvLy8gXHBhcmFtIEFsaWduSW5CaXRzICBNZW1iZXIgYWxpZ25tZW50LgorICAgIC8vLyBccGFyYW0gRmxhZ3MgICAgICAgIEZsYWdzIHRvIGVuY29kZSBtZW1iZXIgYXR0cmlidXRlLCBlLmcuIHByaXZhdGUKKyAgICAvLy8gXHBhcmFtIEVsZW1lbnRzICAgICBVbmlvbiBlbGVtZW50cy4KKyAgICAvLy8gXHBhcmFtIFJ1blRpbWVMYW5nICBPcHRpb25hbCBwYXJhbWV0ZXIsIE9iamVjdGl2ZS1DIHJ1bnRpbWUgdmVyc2lvbi4KKyAgICAvLy8gXHBhcmFtIFVuaXF1ZUlkZW50aWZpZXIgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHVuaW9uLgorICAgIERJQ29tcG9zaXRlVHlwZSAqY3JlYXRlVW5pb25UeXBlKERJU2NvcGUgKlNjb3BlLCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZpbGUgKkZpbGUsIHVuc2lnbmVkIExpbmVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZUluQml0cywgdWludDMyX3QgQWxpZ25JbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElOb2RlOjpESUZsYWdzIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJTm9kZUFycmF5IEVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJ1blRpbWVMYW5nID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVW5pcXVlSWRlbnRpZmllciA9ICIiKTsKKworICAgIC8vLyBDcmVhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGVudHJ5IGZvciBhIHZhcmlhbnQgcGFydC4gIEEKKyAgICAvLy8gdmFyaWFudCBwYXJ0IG5vcm1hbGx5IGhhcyBhIGRpc2NyaW1pbmF0b3IgKHRob3VnaCB0aGlzIGlzIG5vdAorICAgIC8vLyByZXF1aXJlZCkgYW5kIGEgbnVtYmVyIG9mIHZhcmlhbnQgY2hpbGRyZW4uCisgICAgLy8vIFxwYXJhbSBTY29wZSAgICAgICAgU2NvcGUgaW4gd2hpY2ggdGhpcyB1bmlvbiBpcyBkZWZpbmVkLgorICAgIC8vLyBccGFyYW0gTmFtZSAgICAgICAgIFVuaW9uIG5hbWUuCisgICAgLy8vIFxwYXJhbSBGaWxlICAgICAgICAgRmlsZSB3aGVyZSB0aGlzIG1lbWJlciBpcyBkZWZpbmVkLgorICAgIC8vLyBccGFyYW0gTGluZU51bWJlciAgIExpbmUgbnVtYmVyLgorICAgIC8vLyBccGFyYW0gU2l6ZUluQml0cyAgIE1lbWJlciBzaXplLgorICAgIC8vLyBccGFyYW0gQWxpZ25JbkJpdHMgIE1lbWJlciBhbGlnbm1lbnQuCisgICAgLy8vIFxwYXJhbSBGbGFncyAgICAgICAgRmxhZ3MgdG8gZW5jb2RlIG1lbWJlciBhdHRyaWJ1dGUsIGUuZy4gcHJpdmF0ZQorICAgIC8vLyBccGFyYW0gRGlzY3JpbWluYXRvciBEaXNjcmltaW5hbnQgbWVtYmVyCisgICAgLy8vIFxwYXJhbSBFbGVtZW50cyAgICAgVmFyaWFudCBlbGVtZW50cy4KKyAgICAvLy8gXHBhcmFtIFVuaXF1ZUlkZW50aWZpZXIgQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHVuaW9uLgorICAgIERJQ29tcG9zaXRlVHlwZSAqY3JlYXRlVmFyaWFudFBhcnQoRElTY29wZSAqU2NvcGUsIFN0cmluZ1JlZiBOYW1lLAorCQkJCSAgICAgICBESUZpbGUgKkZpbGUsIHVuc2lnbmVkIExpbmVOdW1iZXIsCisJCQkJICAgICAgIHVpbnQ2NF90IFNpemVJbkJpdHMsIHVpbnQzMl90IEFsaWduSW5CaXRzLAorCQkJCSAgICAgICBESU5vZGU6OkRJRmxhZ3MgRmxhZ3MsCisJCQkJICAgICAgIERJRGVyaXZlZFR5cGUgKkRpc2NyaW1pbmF0b3IsCisJCQkJICAgICAgIERJTm9kZUFycmF5IEVsZW1lbnRzLAorCQkJCSAgICAgICBTdHJpbmdSZWYgVW5pcXVlSWRlbnRpZmllciA9ICIiKTsKKworICAgIC8vLyBDcmVhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciB0ZW1wbGF0ZQorICAgIC8vLyB0eXBlIHBhcmFtZXRlci4KKyAgICAvLy8gXHBhcmFtIFNjb3BlICAgICAgICBTY29wZSBpbiB3aGljaCB0aGlzIHR5cGUgaXMgZGVmaW5lZC4KKyAgICAvLy8gXHBhcmFtIE5hbWUgICAgICAgICBUeXBlIHBhcmFtZXRlciBuYW1lLgorICAgIC8vLyBccGFyYW0gVHkgICAgICAgICAgIFBhcmFtZXRlciB0eXBlLgorICAgIERJVGVtcGxhdGVUeXBlUGFyYW1ldGVyICoKKyAgICBjcmVhdGVUZW1wbGF0ZVR5cGVQYXJhbWV0ZXIoRElTY29wZSAqU2NvcGUsIFN0cmluZ1JlZiBOYW1lLCBESVR5cGUgKlR5KTsKKworICAgIC8vLyBDcmVhdGUgZGVidWdnaW5nIGluZm9ybWF0aW9uIGZvciB0ZW1wbGF0ZQorICAgIC8vLyB2YWx1ZSBwYXJhbWV0ZXIuCisgICAgLy8vIFxwYXJhbSBTY29wZSAgICAgICAgU2NvcGUgaW4gd2hpY2ggdGhpcyB0eXBlIGlzIGRlZmluZWQuCisgICAgLy8vIFxwYXJhbSBOYW1lICAgICAgICAgVmFsdWUgcGFyYW1ldGVyIG5hbWUuCisgICAgLy8vIFxwYXJhbSBUeSAgICAgICAgICAgUGFyYW1ldGVyIHR5cGUuCisgICAgLy8vIFxwYXJhbSBWYWwgICAgICAgICAgQ29uc3RhbnQgcGFyYW1ldGVyIHZhbHVlLgorICAgIERJVGVtcGxhdGVWYWx1ZVBhcmFtZXRlciAqY3JlYXRlVGVtcGxhdGVWYWx1ZVBhcmFtZXRlcihESVNjb3BlICpTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJVHlwZSAqVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpWYWwpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZm9yIGEgdGVtcGxhdGUgdGVtcGxhdGUgcGFyYW1ldGVyLgorICAgIC8vLyBccGFyYW0gU2NvcGUgICAgICAgIFNjb3BlIGluIHdoaWNoIHRoaXMgdHlwZSBpcyBkZWZpbmVkLgorICAgIC8vLyBccGFyYW0gTmFtZSAgICAgICAgIFZhbHVlIHBhcmFtZXRlciBuYW1lLgorICAgIC8vLyBccGFyYW0gVHkgICAgICAgICAgIFBhcmFtZXRlciB0eXBlLgorICAgIC8vLyBccGFyYW0gVmFsICAgICAgICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdGVtcGxhdGUuCisgICAgRElUZW1wbGF0ZVZhbHVlUGFyYW1ldGVyICpjcmVhdGVUZW1wbGF0ZVRlbXBsYXRlUGFyYW1ldGVyKERJU2NvcGUgKlNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFZhbCk7CisKKyAgICAvLy8gQ3JlYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBmb3IgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgcGFjay4KKyAgICAvLy8gXHBhcmFtIFNjb3BlICAgICAgICBTY29wZSBpbiB3aGljaCB0aGlzIHR5cGUgaXMgZGVmaW5lZC4KKyAgICAvLy8gXHBhcmFtIE5hbWUgICAgICAgICBWYWx1ZSBwYXJhbWV0ZXIgbmFtZS4KKyAgICAvLy8gXHBhcmFtIFR5ICAgICAgICAgICBQYXJhbWV0ZXIgdHlwZS4KKyAgICAvLy8gXHBhcmFtIFZhbCAgICAgICAgICBBbiBhcnJheSBvZiB0eXBlcyBpbiB0aGUgcGFjay4KKyAgICBESVRlbXBsYXRlVmFsdWVQYXJhbWV0ZXIgKmNyZWF0ZVRlbXBsYXRlUGFyYW1ldGVyUGFjayhESVNjb3BlICpTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVR5cGUgKlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJTm9kZUFycmF5IFZhbCk7CisKKyAgICAvLy8gQ3JlYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBlbnRyeSBmb3IgYW4gYXJyYXkuCisgICAgLy8vIFxwYXJhbSBTaXplICAgICAgICAgQXJyYXkgc2l6ZS4KKyAgICAvLy8gXHBhcmFtIEFsaWduSW5CaXRzICBBbGlnbm1lbnQuCisgICAgLy8vIFxwYXJhbSBUeSAgICAgICAgICAgRWxlbWVudCB0eXBlLgorICAgIC8vLyBccGFyYW0gU3Vic2NyaXB0cyAgIFN1YnNjcmlwdHMuCisgICAgRElDb21wb3NpdGVUeXBlICpjcmVhdGVBcnJheVR5cGUodWludDY0X3QgU2l6ZSwgdWludDMyX3QgQWxpZ25JbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElUeXBlICpUeSwgRElOb2RlQXJyYXkgU3Vic2NyaXB0cyk7CisKKyAgICAvLy8gQ3JlYXRlIGRlYnVnZ2luZyBpbmZvcm1hdGlvbiBlbnRyeSBmb3IgYSB2ZWN0b3IgdHlwZS4KKyAgICAvLy8gXHBhcmFtIFNpemUgICAgICAgICBBcnJheSBzaXplLgorICAgIC8vLyBccGFyYW0gQWxpZ25JbkJpdHMgIEFsaWdubWVudC4KKyAgICAvLy8gXHBhcmFtIFR5ICAgICAgICAgICBFbGVtZW50IHR5cGUuCisgICAgLy8vIFxwYXJhbSBTdWJzY3JpcHRzICAgU3Vic2NyaXB0cy4KKyAgICBESUNvbXBvc2l0ZVR5cGUgKmNyZWF0ZVZlY3RvclR5cGUodWludDY0X3QgU2l6ZSwgdWludDMyX3QgQWxpZ25JbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJVHlwZSAqVHksIERJTm9kZUFycmF5IFN1YnNjcmlwdHMpOworCisgICAgLy8vIENyZWF0ZSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gZW50cnkgZm9yIGFuCisgICAgLy8vIGVudW1lcmF0aW9uLgorICAgIC8vLyBccGFyYW0gU2NvcGUgICAgICAgICAgU2NvcGUgaW4gd2hpY2ggdGhpcyBlbnVtZXJhdGlvbiBpcyBkZWZpbmVkLgorICAgIC8vLyBccGFyYW0gTmFtZSAgICAgICAgICAgVW5pb24gbmFtZS4KKyAgICAvLy8gXHBhcmFtIEZpbGUgICAgICAgICAgIEZpbGUgd2hlcmUgdGhpcyBtZW1iZXIgaXMgZGVmaW5lZC4KKyAgICAvLy8gXHBhcmFtIExpbmVOdW1iZXIgICAgIExpbmUgbnVtYmVyLgorICAgIC8vLyBccGFyYW0gU2l6ZUluQml0cyAgICAgTWVtYmVyIHNpemUuCisgICAgLy8vIFxwYXJhbSBBbGlnbkluQml0cyAgICBNZW1iZXIgYWxpZ25tZW50LgorICAgIC8vLyBccGFyYW0gRWxlbWVudHMgICAgICAgRW51bWVyYXRpb24gZWxlbWVudHMuCisgICAgLy8vIFxwYXJhbSBVbmRlcmx5aW5nVHlwZSBVbmRlcmx5aW5nIHR5cGUgb2YgYSBDKysxMS9PYmpDIGZpeGVkIGVudW0uCisgICAgLy8vIFxwYXJhbSBVbmlxdWVJZGVudGlmaWVyIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBlbnVtLgorICAgIC8vLyBccGFyYW0gSXNGaXhlZCBCb29sZWFuIGZsYWcgaW5kaWNhdGUgaWYgdGhpcyBpcyBDKysxMS9PYmpDIGZpeGVkIGVudW0uCisgICAgRElDb21wb3NpdGVUeXBlICpjcmVhdGVFbnVtZXJhdGlvblR5cGUoCisgICAgICAgIERJU2NvcGUgKlNjb3BlLCBTdHJpbmdSZWYgTmFtZSwgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lTnVtYmVyLAorICAgICAgICB1aW50NjRfdCBTaXplSW5CaXRzLCB1aW50MzJfdCBBbGlnbkluQml0cywgRElOb2RlQXJyYXkgRWxlbWVudHMsCisgICAgICAgIERJVHlwZSAqVW5kZXJseWluZ1R5cGUsIFN0cmluZ1JlZiBVbmlxdWVJZGVudGlmaWVyID0gIiIsIGJvb2wgSXNGaXhlZCA9IGZhbHNlKTsKKworICAgIC8vLyBDcmVhdGUgc3Vicm91dGluZSB0eXBlLgorICAgIC8vLyBccGFyYW0gUGFyYW1ldGVyVHlwZXMgIEFuIGFycmF5IG9mIHN1YnJvdXRpbmUgcGFyYW1ldGVyIHR5cGVzLiBUaGlzCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXMgcmV0dXJuIHR5cGUgYXQgMHRoIGluZGV4LgorICAgIC8vLyBccGFyYW0gRmxhZ3MgICAgICAgICAgIEUuZy46IExWYWx1ZVJlZmVyZW5jZS4KKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgICBUaGVzZSBmbGFncyBhcmUgdXNlZCB0byBlbWl0IGR3YXJmIGF0dHJpYnV0ZXMuCisgICAgLy8vIFxwYXJhbSBDQyAgICAgICAgICAgICAgQ2FsbGluZyBjb252ZW50aW9uLCBlLmcuIGR3YXJmOjpEV19DQ19ub3JtYWwKKyAgICBESVN1YnJvdXRpbmVUeXBlICoKKyAgICBjcmVhdGVTdWJyb3V0aW5lVHlwZShESVR5cGVSZWZBcnJheSBQYXJhbWV0ZXJUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBESU5vZGU6OkRJRmxhZ3MgRmxhZ3MgPSBESU5vZGU6OkZsYWdaZXJvLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENDID0gMCk7CisKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IERJVHlwZSogd2l0aCAiYXJ0aWZpY2lhbCIgZmxhZyBzZXQuCisgICAgRElUeXBlICpjcmVhdGVBcnRpZmljaWFsVHlwZShESVR5cGUgKlR5KTsKKworICAgIC8vLyBDcmVhdGUgYSBuZXcgRElUeXBlKiB3aXRoIHRoZSAib2JqZWN0IHBvaW50ZXIiCisgICAgLy8vIGZsYWcgc2V0LgorICAgIERJVHlwZSAqY3JlYXRlT2JqZWN0UG9pbnRlclR5cGUoRElUeXBlICpUeSk7CisKKyAgICAvLy8gQ3JlYXRlIGEgcGVybWFuZW50IGZvcndhcmQtZGVjbGFyZWQgdHlwZS4KKyAgICBESUNvbXBvc2l0ZVR5cGUgKmNyZWF0ZUZvcndhcmREZWNsKHVuc2lnbmVkIFRhZywgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNjb3BlICpTY29wZSwgRElGaWxlICpGLCB1bnNpZ25lZCBMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUnVudGltZUxhbmcgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZUluQml0cyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBbGlnbkluQml0cyA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVW5pcXVlSWRlbnRpZmllciA9ICIiKTsKKworICAgIC8vLyBDcmVhdGUgYSB0ZW1wb3JhcnkgZm9yd2FyZC1kZWNsYXJlZCB0eXBlLgorICAgIERJQ29tcG9zaXRlVHlwZSAqY3JlYXRlUmVwbGFjZWFibGVDb21wb3NpdGVUeXBlKAorICAgICAgICB1bnNpZ25lZCBUYWcsIFN0cmluZ1JlZiBOYW1lLCBESVNjb3BlICpTY29wZSwgRElGaWxlICpGLCB1bnNpZ25lZCBMaW5lLAorICAgICAgICB1bnNpZ25lZCBSdW50aW1lTGFuZyA9IDAsIHVpbnQ2NF90IFNpemVJbkJpdHMgPSAwLAorICAgICAgICB1aW50MzJfdCBBbGlnbkluQml0cyA9IDAsIERJTm9kZTo6RElGbGFncyBGbGFncyA9IERJTm9kZTo6RmxhZ0Z3ZERlY2wsCisgICAgICAgIFN0cmluZ1JlZiBVbmlxdWVJZGVudGlmaWVyID0gIiIpOworCisgICAgLy8vIFJldGFpbiBESVNjb3BlKiBpbiBhIG1vZHVsZSBldmVuIGlmIGl0IGlzIG5vdCByZWZlcmVuY2VkCisgICAgLy8vIHRocm91Z2ggZGVidWcgaW5mbyBhbmNob3JzLgorICAgIHZvaWQgcmV0YWluVHlwZShESVNjb3BlICpUKTsKKworICAgIC8vLyBDcmVhdGUgdW5zcGVjaWZpZWQgcGFyYW1ldGVyIHR5cGUKKyAgICAvLy8gZm9yIGEgc3Vicm91dGluZSB0eXBlLgorICAgIERJQmFzaWNUeXBlICpjcmVhdGVVbnNwZWNpZmllZFBhcmFtZXRlcigpOworCisgICAgLy8vIEdldCBhIERJTm9kZUFycmF5LCBjcmVhdGUgb25lIGlmIHJlcXVpcmVkLgorICAgIERJTm9kZUFycmF5IGdldE9yQ3JlYXRlQXJyYXkoQXJyYXlSZWY8TWV0YWRhdGEgKj4gRWxlbWVudHMpOworCisgICAgLy8vIEdldCBhIERJTWFjcm9Ob2RlQXJyYXksIGNyZWF0ZSBvbmUgaWYgcmVxdWlyZWQuCisgICAgRElNYWNyb05vZGVBcnJheSBnZXRPckNyZWF0ZU1hY3JvQXJyYXkoQXJyYXlSZWY8TWV0YWRhdGEgKj4gRWxlbWVudHMpOworCisgICAgLy8vIEdldCBhIERJVHlwZVJlZkFycmF5LCBjcmVhdGUgb25lIGlmIHJlcXVpcmVkLgorICAgIERJVHlwZVJlZkFycmF5IGdldE9yQ3JlYXRlVHlwZUFycmF5KEFycmF5UmVmPE1ldGFkYXRhICo+IEVsZW1lbnRzKTsKKworICAgIC8vLyBDcmVhdGUgYSBkZXNjcmlwdG9yIGZvciBhIHZhbHVlIHJhbmdlLiAgVGhpcworICAgIC8vLyBpbXBsaWNpdGx5IHVuaXF1ZXMgdGhlIHZhbHVlcyByZXR1cm5lZC4KKyAgICBESVN1YnJhbmdlICpnZXRPckNyZWF0ZVN1YnJhbmdlKGludDY0X3QgTG8sIGludDY0X3QgQ291bnQpOworICAgIERJU3VicmFuZ2UgKmdldE9yQ3JlYXRlU3VicmFuZ2UoaW50NjRfdCBMbywgTWV0YWRhdGEgKkNvdW50Tm9kZSk7CisKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGRlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQgdmFyaWFibGUuCisgICAgLy8vIFxwYXJhbSBDb250ZXh0ICAgICBWYXJpYWJsZSBzY29wZS4KKyAgICAvLy8gXHBhcmFtIE5hbWUgICAgICAgIE5hbWUgb2YgdGhlIHZhcmlhYmxlLgorICAgIC8vLyBccGFyYW0gTGlua2FnZU5hbWUgTWFuZ2xlZCAgbmFtZSBvZiB0aGUgdmFyaWFibGUuCisgICAgLy8vIFxwYXJhbSBGaWxlICAgICAgICBGaWxlIHdoZXJlIHRoaXMgdmFyaWFibGUgaXMgZGVmaW5lZC4KKyAgICAvLy8gXHBhcmFtIExpbmVObyAgICAgIExpbmUgbnVtYmVyLgorICAgIC8vLyBccGFyYW0gVHkgICAgICAgICAgVmFyaWFibGUgVHlwZS4KKyAgICAvLy8gXHBhcmFtIGlzTG9jYWxUb1VuaXQgQm9vbGVhbiBmbGFnIGluZGljYXRlIHdoZXRoZXIgdGhpcyB2YXJpYWJsZSBpcworICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICBleHRlcm5hbGx5IHZpc2libGUgb3Igbm90LgorICAgIC8vLyBccGFyYW0gRXhwciAgICAgICAgVGhlIGxvY2F0aW9uIG9mIHRoZSBnbG9iYWwgcmVsYXRpdmUgdG8gdGhlIGF0dGFjaGVkCisgICAgLy8vICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYXJpYWJsZS4KKyAgICAvLy8gXHBhcmFtIERlY2wgICAgICAgIFJlZmVyZW5jZSB0byB0aGUgY29ycmVzcG9uZGluZyBkZWNsYXJhdGlvbi4KKyAgICAvLy8gXHBhcmFtIEFsaWduSW5CaXRzIFZhcmlhYmxlIGFsaWdubWVudChvciAwIGlmIG5vIGFsaWdubWVudCBhdHRyIHdhcworICAgIC8vLyAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkKQorICAgIERJR2xvYmFsVmFyaWFibGVFeHByZXNzaW9uICpjcmVhdGVHbG9iYWxWYXJpYWJsZUV4cHJlc3Npb24oCisgICAgICAgIERJU2NvcGUgKkNvbnRleHQsIFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgTGlua2FnZU5hbWUsIERJRmlsZSAqRmlsZSwKKyAgICAgICAgdW5zaWduZWQgTGluZU5vLCBESVR5cGUgKlR5LCBib29sIGlzTG9jYWxUb1VuaXQsCisgICAgICAgIERJRXhwcmVzc2lvbiAqRXhwciA9IG51bGxwdHIsIE1ETm9kZSAqRGVjbCA9IG51bGxwdHIsCisgICAgICAgIHVpbnQzMl90IEFsaWduSW5CaXRzID0gMCk7CisKKyAgICAvLy8gSWRlbnRpY2FsIHRvIGNyZWF0ZUdsb2JhbFZhcmlhYmxlCisgICAgLy8vIGV4Y2VwdCB0aGF0IHRoZSByZXN1bHRpbmcgRGJnTm9kZSBpcyB0ZW1wb3JhcnkgYW5kIG1lYW50IHRvIGJlIFJBVVdlZC4KKyAgICBESUdsb2JhbFZhcmlhYmxlICpjcmVhdGVUZW1wR2xvYmFsVmFyaWFibGVGd2REZWNsKAorICAgICAgICBESVNjb3BlICpDb250ZXh0LCBTdHJpbmdSZWYgTmFtZSwgU3RyaW5nUmVmIExpbmthZ2VOYW1lLCBESUZpbGUgKkZpbGUsCisgICAgICAgIHVuc2lnbmVkIExpbmVObywgRElUeXBlICpUeSwgYm9vbCBpc0xvY2FsVG9Vbml0LCBNRE5vZGUgKkRlY2wgPSBudWxscHRyLAorICAgICAgICB1aW50MzJfdCBBbGlnbkluQml0cyA9IDApOworCisgICAgLy8vIENyZWF0ZSBhIG5ldyBkZXNjcmlwdG9yIGZvciBhbiBhdXRvIHZhcmlhYmxlLiAgVGhpcyBpcyBhIGxvY2FsIHZhcmlhYmxlCisgICAgLy8vIHRoYXQgaXMgbm90IGEgc3VicHJvZ3JhbSBwYXJhbWV0ZXIuCisgICAgLy8vCisgICAgLy8vIFxjIFNjb3BlIG11c3QgYmUgYSBcYSBESUxvY2FsU2NvcGUsIGFuZCB0aHVzIGl0cyBzY29wZSBjaGFpbiBldmVudHVhbGx5CisgICAgLy8vIGxlYWRzIHRvIGEgXGEgRElTdWJwcm9ncmFtLgorICAgIC8vLworICAgIC8vLyBJZiBcYyBBbHdheXNQcmVzZXJ2ZSwgdGhpcyB2YXJpYWJsZSB3aWxsIGJlIHJlZmVyZW5jZWQgZnJvbSBpdHMKKyAgICAvLy8gY29udGFpbmluZyBzdWJwcm9ncmFtLCBhbmQgd2lsbCBzdXJ2aXZlIHNvbWUgb3B0aW1pemF0aW9ucy4KKyAgICBESUxvY2FsVmFyaWFibGUgKgorICAgIGNyZWF0ZUF1dG9WYXJpYWJsZShESVNjb3BlICpTY29wZSwgU3RyaW5nUmVmIE5hbWUsIERJRmlsZSAqRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZU5vLCBESVR5cGUgKlR5LCBib29sIEFsd2F5c1ByZXNlcnZlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgIERJTm9kZTo6RElGbGFncyBGbGFncyA9IERJTm9kZTo6RmxhZ1plcm8sCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFsaWduSW5CaXRzID0gMCk7CisKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGRlc2NyaXB0b3IgZm9yIGEgcGFyYW1ldGVyIHZhcmlhYmxlLgorICAgIC8vLworICAgIC8vLyBcYyBTY29wZSBtdXN0IGJlIGEgXGEgRElMb2NhbFNjb3BlLCBhbmQgdGh1cyBpdHMgc2NvcGUgY2hhaW4gZXZlbnR1YWxseQorICAgIC8vLyBsZWFkcyB0byBhIFxhIERJU3VicHJvZ3JhbS4KKyAgICAvLy8KKyAgICAvLy8gXGMgQXJnTm8gaXMgdGhlIGluZGV4IChzdGFydGluZyBmcm9tIFxjIDEpIG9mIHRoaXMgdmFyaWFibGUgaW4gdGhlCisgICAgLy8vIHN1YnByb2dyYW0gcGFyYW1ldGVycy4gIFxjIEFyZ05vIHNob3VsZCBub3QgY29uZmxpY3Qgd2l0aCBvdGhlcgorICAgIC8vLyBwYXJhbWV0ZXJzIG9mIHRoZSBzYW1lIHN1YnByb2dyYW0uCisgICAgLy8vCisgICAgLy8vIElmIFxjIEFsd2F5c1ByZXNlcnZlLCB0aGlzIHZhcmlhYmxlIHdpbGwgYmUgcmVmZXJlbmNlZCBmcm9tIGl0cworICAgIC8vLyBjb250YWluaW5nIHN1YnByb2dyYW0sIGFuZCB3aWxsIHN1cnZpdmUgc29tZSBvcHRpbWl6YXRpb25zLgorICAgIERJTG9jYWxWYXJpYWJsZSAqCisgICAgY3JlYXRlUGFyYW1ldGVyVmFyaWFibGUoRElTY29wZSAqU2NvcGUsIFN0cmluZ1JlZiBOYW1lLCB1bnNpZ25lZCBBcmdObywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZpbGUgKkZpbGUsIHVuc2lnbmVkIExpbmVObywgRElUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEFsd2F5c1ByZXNlcnZlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElOb2RlOjpESUZsYWdzIEZsYWdzID0gRElOb2RlOjpGbGFnWmVybyk7CisKKyAgICAvLy8gQ3JlYXRlIGEgbmV3IGRlc2NyaXB0b3IgZm9yIHRoZSBzcGVjaWZpZWQKKyAgICAvLy8gdmFyaWFibGUgd2hpY2ggaGFzIGEgY29tcGxleCBhZGRyZXNzIGV4cHJlc3Npb24gZm9yIGl0cyBhZGRyZXNzLgorICAgIC8vLyBccGFyYW0gQWRkciAgICAgICAgQW4gYXJyYXkgb2YgY29tcGxleCBhZGRyZXNzIG9wZXJhdGlvbnMuCisgICAgRElFeHByZXNzaW9uICpjcmVhdGVFeHByZXNzaW9uKEFycmF5UmVmPHVpbnQ2NF90PiBBZGRyID0gTm9uZSk7CisgICAgRElFeHByZXNzaW9uICpjcmVhdGVFeHByZXNzaW9uKEFycmF5UmVmPGludDY0X3Q+IEFkZHIpOworCisgICAgLy8vIENyZWF0ZSBhbiBleHByZXNzaW9uIGZvciBhIHZhcmlhYmxlIHRoYXQgZG9lcyBub3QgaGF2ZSBhbiBhZGRyZXNzLCBidXQKKyAgICAvLy8gZG9lcyBoYXZlIGEgY29uc3RhbnQgdmFsdWUuCisgICAgRElFeHByZXNzaW9uICpjcmVhdGVDb25zdGFudFZhbHVlRXhwcmVzc2lvbih1aW50NjRfdCBWYWwpIHsKKyAgICAgIHJldHVybiBESUV4cHJlc3Npb246OmdldCgKKyAgICAgICAgICBWTUNvbnRleHQsIHtkd2FyZjo6RFdfT1BfY29uc3R1LCBWYWwsIGR3YXJmOjpEV19PUF9zdGFja192YWx1ZX0pOworICAgIH0KKworICAgIC8vLyBDcmVhdGUgYSBuZXcgZGVzY3JpcHRvciBmb3IgdGhlIHNwZWNpZmllZCBzdWJwcm9ncmFtLgorICAgIC8vLyBTZWUgY29tbWVudHMgaW4gRElTdWJwcm9ncmFtKiBmb3IgZGVzY3JpcHRpb25zIG9mIHRoZXNlIGZpZWxkcy4KKyAgICAvLy8gXHBhcmFtIFNjb3BlICAgICAgICAgRnVuY3Rpb24gc2NvcGUuCisgICAgLy8vIFxwYXJhbSBOYW1lICAgICAgICAgIEZ1bmN0aW9uIG5hbWUuCisgICAgLy8vIFxwYXJhbSBMaW5rYWdlTmFtZSAgIE1hbmdsZWQgZnVuY3Rpb24gbmFtZS4KKyAgICAvLy8gXHBhcmFtIEZpbGUgICAgICAgICAgRmlsZSB3aGVyZSB0aGlzIHZhcmlhYmxlIGlzIGRlZmluZWQuCisgICAgLy8vIFxwYXJhbSBMaW5lTm8gICAgICAgIExpbmUgbnVtYmVyLgorICAgIC8vLyBccGFyYW0gVHkgICAgICAgICAgICBGdW5jdGlvbiB0eXBlLgorICAgIC8vLyBccGFyYW0gaXNMb2NhbFRvVW5pdCBUcnVlIGlmIHRoaXMgZnVuY3Rpb24gaXMgbm90IGV4dGVybmFsbHkgdmlzaWJsZS4KKyAgICAvLy8gXHBhcmFtIGlzRGVmaW5pdGlvbiAgVHJ1ZSBpZiB0aGlzIGlzIGEgZnVuY3Rpb24gZGVmaW5pdGlvbi4KKyAgICAvLy8gXHBhcmFtIFNjb3BlTGluZSAgICAgU2V0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHNjb3BlIHRoaXMgc3RhcnRzCisgICAgLy8vIFxwYXJhbSBGbGFncyAgICAgICAgIGUuZy4gaXMgdGhpcyBmdW5jdGlvbiBwcm90b3R5cGVkIG9yIG5vdC4KKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgVGhlc2UgZmxhZ3MgYXJlIHVzZWQgdG8gZW1pdCBkd2FyZiBhdHRyaWJ1dGVzLgorICAgIC8vLyBccGFyYW0gaXNPcHRpbWl6ZWQgICBUcnVlIGlmIG9wdGltaXphdGlvbiBpcyBPTi4KKyAgICAvLy8gXHBhcmFtIFRQYXJhbXMgICAgICAgRnVuY3Rpb24gdGVtcGxhdGUgcGFyYW1ldGVycy4KKyAgICAvLy8gXHBhcmFtIFRocm93blR5cGVzICAgRXhjZXB0aW9uIHR5cGVzIHRoaXMgZnVuY3Rpb24gbWF5IHRocm93LgorICAgIERJU3VicHJvZ3JhbSAqY3JlYXRlRnVuY3Rpb24oCisgICAgICAgIERJU2NvcGUgKlNjb3BlLCBTdHJpbmdSZWYgTmFtZSwgU3RyaW5nUmVmIExpbmthZ2VOYW1lLCBESUZpbGUgKkZpbGUsCisgICAgICAgIHVuc2lnbmVkIExpbmVObywgRElTdWJyb3V0aW5lVHlwZSAqVHksIGJvb2wgaXNMb2NhbFRvVW5pdCwKKyAgICAgICAgYm9vbCBpc0RlZmluaXRpb24sIHVuc2lnbmVkIFNjb3BlTGluZSwKKyAgICAgICAgRElOb2RlOjpESUZsYWdzIEZsYWdzID0gRElOb2RlOjpGbGFnWmVybywgYm9vbCBpc09wdGltaXplZCA9IGZhbHNlLAorICAgICAgICBESVRlbXBsYXRlUGFyYW1ldGVyQXJyYXkgVFBhcmFtcyA9IG51bGxwdHIsCisgICAgICAgIERJU3VicHJvZ3JhbSAqRGVjbCA9IG51bGxwdHIsIERJVHlwZUFycmF5IFRocm93blR5cGVzID0gbnVsbHB0cik7CisKKyAgICAvLy8gSWRlbnRpY2FsIHRvIGNyZWF0ZUZ1bmN0aW9uLAorICAgIC8vLyBleGNlcHQgdGhhdCB0aGUgcmVzdWx0aW5nIERiZ05vZGUgaXMgbWVhbnQgdG8gYmUgUkFVV2VkLgorICAgIERJU3VicHJvZ3JhbSAqY3JlYXRlVGVtcEZ1bmN0aW9uRndkRGVjbCgKKyAgICAgICAgRElTY29wZSAqU2NvcGUsIFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgTGlua2FnZU5hbWUsIERJRmlsZSAqRmlsZSwKKyAgICAgICAgdW5zaWduZWQgTGluZU5vLCBESVN1YnJvdXRpbmVUeXBlICpUeSwgYm9vbCBpc0xvY2FsVG9Vbml0LAorICAgICAgICBib29sIGlzRGVmaW5pdGlvbiwgdW5zaWduZWQgU2NvcGVMaW5lLAorICAgICAgICBESU5vZGU6OkRJRmxhZ3MgRmxhZ3MgPSBESU5vZGU6OkZsYWdaZXJvLCBib29sIGlzT3B0aW1pemVkID0gZmFsc2UsCisgICAgICAgIERJVGVtcGxhdGVQYXJhbWV0ZXJBcnJheSBUUGFyYW1zID0gbnVsbHB0ciwKKyAgICAgICAgRElTdWJwcm9ncmFtICpEZWNsID0gbnVsbHB0ciwgRElUeXBlQXJyYXkgVGhyb3duVHlwZXMgPSBudWxscHRyKTsKKworICAgIC8vLyBDcmVhdGUgYSBuZXcgZGVzY3JpcHRvciBmb3IgdGhlIHNwZWNpZmllZCBDKysgbWV0aG9kLgorICAgIC8vLyBTZWUgY29tbWVudHMgaW4gXGEgRElTdWJwcm9ncmFtKiBmb3IgZGVzY3JpcHRpb25zIG9mIHRoZXNlIGZpZWxkcy4KKyAgICAvLy8gXHBhcmFtIFNjb3BlICAgICAgICAgRnVuY3Rpb24gc2NvcGUuCisgICAgLy8vIFxwYXJhbSBOYW1lICAgICAgICAgIEZ1bmN0aW9uIG5hbWUuCisgICAgLy8vIFxwYXJhbSBMaW5rYWdlTmFtZSAgIE1hbmdsZWQgZnVuY3Rpb24gbmFtZS4KKyAgICAvLy8gXHBhcmFtIEZpbGUgICAgICAgICAgRmlsZSB3aGVyZSB0aGlzIHZhcmlhYmxlIGlzIGRlZmluZWQuCisgICAgLy8vIFxwYXJhbSBMaW5lTm8gICAgICAgIExpbmUgbnVtYmVyLgorICAgIC8vLyBccGFyYW0gVHkgICAgICAgICAgICBGdW5jdGlvbiB0eXBlLgorICAgIC8vLyBccGFyYW0gaXNMb2NhbFRvVW5pdCBUcnVlIGlmIHRoaXMgZnVuY3Rpb24gaXMgbm90IGV4dGVybmFsbHkgdmlzaWJsZS4uCisgICAgLy8vIFxwYXJhbSBpc0RlZmluaXRpb24gIFRydWUgaWYgdGhpcyBpcyBhIGZ1bmN0aW9uIGRlZmluaXRpb24uCisgICAgLy8vIFxwYXJhbSBWaXJ0dWFsaXR5ICAgIEF0dHJpYnV0ZXMgZGVzY3JpYmluZyB2aXJ0dWFsbmVzcy4gZS5nLiBwdXJlCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgIHZpcnR1YWwgZnVuY3Rpb24uCisgICAgLy8vIFxwYXJhbSBWVGFibGVJbmRleCAgIEluZGV4IG5vIG9mIHRoaXMgbWV0aG9kIGluIHZpcnR1YWwgdGFibGUsIG9yIC0xdSBpZgorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICB1bnJlcHJlc2VudGFibGUuCisgICAgLy8vIFxwYXJhbSBUaGlzQWRqdXN0bWVudAorICAgIC8vLyAgICAgICAgICAgICAgICAgICAgICBNUyBBQkktc3BlY2lmaWMgYWRqdXN0bWVudCBvZiAndGhpcycgdGhhdCBvY2N1cnMKKyAgICAvLy8gICAgICAgICAgICAgICAgICAgICAgaW4gdGhlIHByb2xvZ3VlLgorICAgIC8vLyBccGFyYW0gVlRhYmxlSG9sZGVyICBUeXBlIHRoYXQgaG9sZHMgdnRhYmxlLgorICAgIC8vLyBccGFyYW0gRmxhZ3MgICAgICAgICBlLmcuIGlzIHRoaXMgZnVuY3Rpb24gcHJvdG90eXBlZCBvciBub3QuCisgICAgLy8vICAgICAgICAgICAgICAgICAgICAgIFRoaXMgZmxhZ3MgYXJlIHVzZWQgdG8gZW1pdCBkd2FyZiBhdHRyaWJ1dGVzLgorICAgIC8vLyBccGFyYW0gaXNPcHRpbWl6ZWQgICBUcnVlIGlmIG9wdGltaXphdGlvbiBpcyBPTi4KKyAgICAvLy8gXHBhcmFtIFRQYXJhbXMgICAgICAgRnVuY3Rpb24gdGVtcGxhdGUgcGFyYW1ldGVycy4KKyAgICAvLy8gXHBhcmFtIFRocm93blR5cGVzICAgRXhjZXB0aW9uIHR5cGVzIHRoaXMgZnVuY3Rpb24gbWF5IHRocm93LgorICAgIERJU3VicHJvZ3JhbSAqY3JlYXRlTWV0aG9kKAorICAgICAgICBESVNjb3BlICpTY29wZSwgU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBMaW5rYWdlTmFtZSwgRElGaWxlICpGaWxlLAorICAgICAgICB1bnNpZ25lZCBMaW5lTm8sIERJU3Vicm91dGluZVR5cGUgKlR5LCBib29sIGlzTG9jYWxUb1VuaXQsCisgICAgICAgIGJvb2wgaXNEZWZpbml0aW9uLCB1bnNpZ25lZCBWaXJ0dWFsaXR5ID0gMCwgdW5zaWduZWQgVlRhYmxlSW5kZXggPSAwLAorICAgICAgICBpbnQgVGhpc0FkanVzdG1lbnQgPSAwLCBESVR5cGUgKlZUYWJsZUhvbGRlciA9IG51bGxwdHIsCisgICAgICAgIERJTm9kZTo6RElGbGFncyBGbGFncyA9IERJTm9kZTo6RmxhZ1plcm8sIGJvb2wgaXNPcHRpbWl6ZWQgPSBmYWxzZSwKKyAgICAgICAgRElUZW1wbGF0ZVBhcmFtZXRlckFycmF5IFRQYXJhbXMgPSBudWxscHRyLAorICAgICAgICBESVR5cGVBcnJheSBUaHJvd25UeXBlcyA9IG51bGxwdHIpOworCisgICAgLy8vIFRoaXMgY3JlYXRlcyBuZXcgZGVzY3JpcHRvciBmb3IgYSBuYW1lc3BhY2Ugd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgLy8vIHBhcmVudCBzY29wZS4KKyAgICAvLy8gXHBhcmFtIFNjb3BlICAgICAgIE5hbWVzcGFjZSBzY29wZQorICAgIC8vLyBccGFyYW0gTmFtZSAgICAgICAgTmFtZSBvZiB0aGlzIG5hbWVzcGFjZQorICAgIC8vLyBccGFyYW0gRXhwb3J0U3ltYm9scyBUcnVlIGZvciBDKysgaW5saW5lIG5hbWVzcGFjZXMuCisgICAgRElOYW1lc3BhY2UgKmNyZWF0ZU5hbWVTcGFjZShESVNjb3BlICpTY29wZSwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEV4cG9ydFN5bWJvbHMpOworCisgICAgLy8vIFRoaXMgY3JlYXRlcyBuZXcgZGVzY3JpcHRvciBmb3IgYSBtb2R1bGUgd2l0aCB0aGUgc3BlY2lmaWVkCisgICAgLy8vIHBhcmVudCBzY29wZS4KKyAgICAvLy8gXHBhcmFtIFNjb3BlICAgICAgIFBhcmVudCBzY29wZQorICAgIC8vLyBccGFyYW0gTmFtZSAgICAgICAgTmFtZSBvZiB0aGlzIG1vZHVsZQorICAgIC8vLyBccGFyYW0gQ29uZmlndXJhdGlvbk1hY3JvcworICAgIC8vLyAgICAgICAgICAgICAgICAgICAgQSBzcGFjZS1zZXBhcmF0ZWQgc2hlbGwtcXVvdGVkIGxpc3Qgb2YgLUQgbWFjcm8KKyAgICAvLy8gICAgICAgICAgICAgICAgICAgIGRlZmluaXRpb25zIGFzIHRoZXkgd291bGQgYXBwZWFyIG9uIGEgY29tbWFuZCBsaW5lLgorICAgIC8vLyBccGFyYW0gSW5jbHVkZVBhdGggVGhlIHBhdGggdG8gdGhlIG1vZHVsZSBtYXAgZmlsZS4KKyAgICAvLy8gXHBhcmFtIElTeXNSb290ICAgIFRoZSBjbGFuZyBzeXN0ZW0gcm9vdCAodmFsdWUgb2YgLWlzeXNyb290KS4KKyAgICBESU1vZHVsZSAqY3JlYXRlTW9kdWxlKERJU2NvcGUgKlNjb3BlLCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDb25maWd1cmF0aW9uTWFjcm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluY2x1ZGVQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIElTeXNSb290KTsKKworICAgIC8vLyBUaGlzIGNyZWF0ZXMgYSBkZXNjcmlwdG9yIGZvciBhIGxleGljYWwgYmxvY2sgd2l0aCBhIG5ldyBmaWxlCisgICAgLy8vIGF0dGFjaGVkLiBUaGlzIG1lcmVseSBleHRlbmRzIHRoZSBleGlzdGluZworICAgIC8vLyBsZXhpY2FsIGJsb2NrIGFzIGl0IGNyb3NzZXMgYSBmaWxlLgorICAgIC8vLyBccGFyYW0gU2NvcGUgICAgICAgTGV4aWNhbCBibG9jay4KKyAgICAvLy8gXHBhcmFtIEZpbGUgICAgICAgIFNvdXJjZSBmaWxlLgorICAgIC8vLyBccGFyYW0gRGlzY3JpbWluYXRvciBEV0FSRiBwYXRoIGRpc2NyaW1pbmF0b3IgdmFsdWUuCisgICAgRElMZXhpY2FsQmxvY2tGaWxlICpjcmVhdGVMZXhpY2FsQmxvY2tGaWxlKERJU2NvcGUgKlNjb3BlLCBESUZpbGUgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIERpc2NyaW1pbmF0b3IgPSAwKTsKKworICAgIC8vLyBUaGlzIGNyZWF0ZXMgYSBkZXNjcmlwdG9yIGZvciBhIGxleGljYWwgYmxvY2sgd2l0aCB0aGUKKyAgICAvLy8gc3BlY2lmaWVkIHBhcmVudCBjb250ZXh0LgorICAgIC8vLyBccGFyYW0gU2NvcGUgICAgICAgICBQYXJlbnQgbGV4aWNhbCBzY29wZS4KKyAgICAvLy8gXHBhcmFtIEZpbGUgICAgICAgICAgU291cmNlIGZpbGUuCisgICAgLy8vIFxwYXJhbSBMaW5lICAgICAgICAgIExpbmUgbnVtYmVyLgorICAgIC8vLyBccGFyYW0gQ29sICAgICAgICAgICBDb2x1bW4gbnVtYmVyLgorICAgIERJTGV4aWNhbEJsb2NrICpjcmVhdGVMZXhpY2FsQmxvY2soRElTY29wZSAqU2NvcGUsIERJRmlsZSAqRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExpbmUsIHVuc2lnbmVkIENvbCk7CisKKyAgICAvLy8gQ3JlYXRlIGEgZGVzY3JpcHRvciBmb3IgYW4gaW1wb3J0ZWQgbW9kdWxlLgorICAgIC8vLyBccGFyYW0gQ29udGV4dCBUaGUgc2NvcGUgdGhpcyBtb2R1bGUgaXMgaW1wb3J0ZWQgaW50bworICAgIC8vLyBccGFyYW0gTlMgICAgICBUaGUgbmFtZXNwYWNlIGJlaW5nIGltcG9ydGVkIGhlcmUuCisgICAgLy8vIFxwYXJhbSBGaWxlICAgIEZpbGUgd2hlcmUgdGhlIGRlY2xhcmF0aW9uIGlzIGxvY2F0ZWQuCisgICAgLy8vIFxwYXJhbSBMaW5lICAgIExpbmUgbnVtYmVyIG9mIHRoZSBkZWNsYXJhdGlvbi4KKyAgICBESUltcG9ydGVkRW50aXR5ICpjcmVhdGVJbXBvcnRlZE1vZHVsZShESVNjb3BlICpDb250ZXh0LCBESU5hbWVzcGFjZSAqTlMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lKTsKKworICAgIC8vLyBDcmVhdGUgYSBkZXNjcmlwdG9yIGZvciBhbiBpbXBvcnRlZCBtb2R1bGUuCisgICAgLy8vIFxwYXJhbSBDb250ZXh0IFRoZSBzY29wZSB0aGlzIG1vZHVsZSBpcyBpbXBvcnRlZCBpbnRvLgorICAgIC8vLyBccGFyYW0gTlMgICAgICBBbiBhbGlhc2VkIG5hbWVzcGFjZS4KKyAgICAvLy8gXHBhcmFtIEZpbGUgICAgRmlsZSB3aGVyZSB0aGUgZGVjbGFyYXRpb24gaXMgbG9jYXRlZC4KKyAgICAvLy8gXHBhcmFtIExpbmUgICAgTGluZSBudW1iZXIgb2YgdGhlIGRlY2xhcmF0aW9uLgorICAgIERJSW1wb3J0ZWRFbnRpdHkgKmNyZWF0ZUltcG9ydGVkTW9kdWxlKERJU2NvcGUgKkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElJbXBvcnRlZEVudGl0eSAqTlMsIERJRmlsZSAqRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lKTsKKworICAgIC8vLyBDcmVhdGUgYSBkZXNjcmlwdG9yIGZvciBhbiBpbXBvcnRlZCBtb2R1bGUuCisgICAgLy8vIFxwYXJhbSBDb250ZXh0IFRoZSBzY29wZSB0aGlzIG1vZHVsZSBpcyBpbXBvcnRlZCBpbnRvLgorICAgIC8vLyBccGFyYW0gTSAgICAgICBUaGUgbW9kdWxlIGJlaW5nIGltcG9ydGVkIGhlcmUKKyAgICAvLy8gXHBhcmFtIEZpbGUgICAgRmlsZSB3aGVyZSB0aGUgZGVjbGFyYXRpb24gaXMgbG9jYXRlZC4KKyAgICAvLy8gXHBhcmFtIExpbmUgICAgTGluZSBudW1iZXIgb2YgdGhlIGRlY2xhcmF0aW9uLgorICAgIERJSW1wb3J0ZWRFbnRpdHkgKmNyZWF0ZUltcG9ydGVkTW9kdWxlKERJU2NvcGUgKkNvbnRleHQsIERJTW9kdWxlICpNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRmlsZSAqRmlsZSwgdW5zaWduZWQgTGluZSk7CisKKyAgICAvLy8gQ3JlYXRlIGEgZGVzY3JpcHRvciBmb3IgYW4gaW1wb3J0ZWQgZnVuY3Rpb24uCisgICAgLy8vIFxwYXJhbSBDb250ZXh0IFRoZSBzY29wZSB0aGlzIG1vZHVsZSBpcyBpbXBvcnRlZCBpbnRvLgorICAgIC8vLyBccGFyYW0gRGVjbCAgICBUaGUgZGVjbGFyYXRpb24gKG9yIGRlZmluaXRpb24pIG9mIGEgZnVuY3Rpb24sIHR5cGUsIG9yCisgICAgLy8vICAgICAgICAgICAgICAgIHZhcmlhYmxlLgorICAgIC8vLyBccGFyYW0gRmlsZSAgICBGaWxlIHdoZXJlIHRoZSBkZWNsYXJhdGlvbiBpcyBsb2NhdGVkLgorICAgIC8vLyBccGFyYW0gTGluZSAgICBMaW5lIG51bWJlciBvZiB0aGUgZGVjbGFyYXRpb24uCisgICAgRElJbXBvcnRlZEVudGl0eSAqY3JlYXRlSW1wb3J0ZWREZWNsYXJhdGlvbihESVNjb3BlICpDb250ZXh0LCBESU5vZGUgKkRlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZpbGUgKkZpbGUsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSA9ICIiKTsKKworICAgIC8vLyBJbnNlcnQgYSBuZXcgbGx2bS5kYmcuZGVjbGFyZSBpbnRyaW5zaWMgY2FsbC4KKyAgICAvLy8gXHBhcmFtIFN0b3JhZ2UgICAgIGxsdm06OlZhbHVlIG9mIHRoZSB2YXJpYWJsZQorICAgIC8vLyBccGFyYW0gVmFySW5mbyAgICAgVmFyaWFibGUncyBkZWJ1ZyBpbmZvIGRlc2NyaXB0b3IuCisgICAgLy8vIFxwYXJhbSBFeHByICAgICAgICBBIGNvbXBsZXggbG9jYXRpb24gZXhwcmVzc2lvbi4KKyAgICAvLy8gXHBhcmFtIERMICAgICAgICAgIERlYnVnIGluZm8gbG9jYXRpb24uCisgICAgLy8vIFxwYXJhbSBJbnNlcnRBdEVuZCBMb2NhdGlvbiBmb3IgdGhlIG5ldyBpbnRyaW5zaWMuCisgICAgSW5zdHJ1Y3Rpb24gKmluc2VydERlY2xhcmUobGx2bTo6VmFsdWUgKlN0b3JhZ2UsIERJTG9jYWxWYXJpYWJsZSAqVmFySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUV4cHJlc3Npb24gKkV4cHIsIGNvbnN0IERJTG9jYXRpb24gKkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICAgIC8vLyBJbnNlcnQgYSBuZXcgbGx2bS5kYmcuZGVjbGFyZSBpbnRyaW5zaWMgY2FsbC4KKyAgICAvLy8gXHBhcmFtIFN0b3JhZ2UgICAgICBsbHZtOjpWYWx1ZSBvZiB0aGUgdmFyaWFibGUKKyAgICAvLy8gXHBhcmFtIFZhckluZm8gICAgICBWYXJpYWJsZSdzIGRlYnVnIGluZm8gZGVzY3JpcHRvci4KKyAgICAvLy8gXHBhcmFtIEV4cHIgICAgICAgICBBIGNvbXBsZXggbG9jYXRpb24gZXhwcmVzc2lvbi4KKyAgICAvLy8gXHBhcmFtIERMICAgICAgICAgICBEZWJ1ZyBpbmZvIGxvY2F0aW9uLgorICAgIC8vLyBccGFyYW0gSW5zZXJ0QmVmb3JlIExvY2F0aW9uIGZvciB0aGUgbmV3IGludHJpbnNpYy4KKyAgICBJbnN0cnVjdGlvbiAqaW5zZXJ0RGVjbGFyZShsbHZtOjpWYWx1ZSAqU3RvcmFnZSwgRElMb2NhbFZhcmlhYmxlICpWYXJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRXhwcmVzc2lvbiAqRXhwciwgY29uc3QgRElMb2NhdGlvbiAqREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSk7CisKKyAgICAvLy8gSW5zZXJ0IGEgbmV3IGxsdm0uZGJnLnZhbHVlIGludHJpbnNpYyBjYWxsLgorICAgIC8vLyBccGFyYW0gVmFsICAgICAgICAgIGxsdm06OlZhbHVlIG9mIHRoZSB2YXJpYWJsZQorICAgIC8vLyBccGFyYW0gVmFySW5mbyAgICAgIFZhcmlhYmxlJ3MgZGVidWcgaW5mbyBkZXNjcmlwdG9yLgorICAgIC8vLyBccGFyYW0gRXhwciAgICAgICAgIEEgY29tcGxleCBsb2NhdGlvbiBleHByZXNzaW9uLgorICAgIC8vLyBccGFyYW0gREwgICAgICAgICAgIERlYnVnIGluZm8gbG9jYXRpb24uCisgICAgLy8vIFxwYXJhbSBJbnNlcnRBdEVuZCBMb2NhdGlvbiBmb3IgdGhlIG5ldyBpbnRyaW5zaWMuCisgICAgSW5zdHJ1Y3Rpb24gKmluc2VydERiZ1ZhbHVlSW50cmluc2ljKGxsdm06OlZhbHVlICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJTG9jYWxWYXJpYWJsZSAqVmFySW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElFeHByZXNzaW9uICpFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBESUxvY2F0aW9uICpETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgICAgLy8vIEluc2VydCBhIG5ldyBsbHZtLmRiZy52YWx1ZSBpbnRyaW5zaWMgY2FsbC4KKyAgICAvLy8gXHBhcmFtIFZhbCAgICAgICAgICBsbHZtOjpWYWx1ZSBvZiB0aGUgdmFyaWFibGUKKyAgICAvLy8gXHBhcmFtIFZhckluZm8gICAgICBWYXJpYWJsZSdzIGRlYnVnIGluZm8gZGVzY3JpcHRvci4KKyAgICAvLy8gXHBhcmFtIEV4cHIgICAgICAgICBBIGNvbXBsZXggbG9jYXRpb24gZXhwcmVzc2lvbi4KKyAgICAvLy8gXHBhcmFtIERMICAgICAgICAgICBEZWJ1ZyBpbmZvIGxvY2F0aW9uLgorICAgIC8vLyBccGFyYW0gSW5zZXJ0QmVmb3JlIExvY2F0aW9uIGZvciB0aGUgbmV3IGludHJpbnNpYy4KKyAgICBJbnN0cnVjdGlvbiAqaW5zZXJ0RGJnVmFsdWVJbnRyaW5zaWMobGx2bTo6VmFsdWUgKlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElMb2NhbFZhcmlhYmxlICpWYXJJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUV4cHJlc3Npb24gKkV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERJTG9jYXRpb24gKkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKworICAgIC8vLyBSZXBsYWNlIHRoZSB2dGFibGUgaG9sZGVyIGluIHRoZSBnaXZlbiB0eXBlLgorICAgIC8vLworICAgIC8vLyBJZiB0aGlzIGNyZWF0ZXMgYSBzZWxmIHJlZmVyZW5jZSwgaXQgbWF5IG9ycGhhbiBzb21lIHVucmVzb2x2ZWQgY3ljbGVzCisgICAgLy8vIGluIHRoZSBvcGVyYW5kcyBvZiBcYyBULCBzbyBcYSBESUJ1aWxkZXIgbmVlZHMgdG8gdHJhY2sgdGhhdC4KKyAgICB2b2lkIHJlcGxhY2VWVGFibGVIb2xkZXIoRElDb21wb3NpdGVUeXBlIComVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElUeXBlICpWVGFibGVIb2xkZXIpOworCisgICAgLy8vIFJlcGxhY2UgYXJyYXlzIG9uIGEgY29tcG9zaXRlIHR5cGUuCisgICAgLy8vCisgICAgLy8vIElmIFxjIFQgaXMgcmVzb2x2ZWQsIGJ1dCB0aGUgYXJyYXlzIGFyZW4ndCAtLSB3aGljaCBjYW4gaGFwcGVuIGlmIFxjIFQKKyAgICAvLy8gaGFzIGEgc2VsZi1yZWZlcmVuY2UgLS0gXGEgRElCdWlsZGVyIG5lZWRzIHRvIHRyYWNrIHRoZSBhcnJheSB0bworICAgIC8vLyByZXNvbHZlIGN5Y2xlcy4KKyAgICB2b2lkIHJlcGxhY2VBcnJheXMoRElDb21wb3NpdGVUeXBlIComVCwgRElOb2RlQXJyYXkgRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgIERJTm9kZUFycmF5IFRQYXJhbXMgPSBESU5vZGVBcnJheSgpKTsKKworICAgIC8vLyBSZXBsYWNlIGEgdGVtcG9yYXJ5IG5vZGUuCisgICAgLy8vCisgICAgLy8vIENhbGwgXGEgTUROb2RlOjpyZXBsYWNlQWxsVXNlc1dpdGgoKSBvbiBcYyBOLCByZXBsYWNpbmcgaXQgd2l0aCBcYworICAgIC8vLyBSZXBsYWNlbWVudC4KKyAgICAvLy8KKyAgICAvLy8gSWYgXGMgUmVwbGFjZW1lbnQgaXMgdGhlIHNhbWUgYXMgXGMgTi5nZXQoKSwgaW5zdGVhZCBjYWxsIFxhCisgICAgLy8vIE1ETm9kZTo6cmVwbGFjZVdpdGhVbmlxdWVkKCkuICBJbiB0aGlzIGNhc2UsIHRoZSB1bmlxdWVkIG5vZGUgY291bGQKKyAgICAvLy8gaGF2ZSBhIGRpZmZlcmVudCBhZGRyZXNzLCBzbyB3ZSByZXR1cm4gdGhlIGZpbmFsIGFkZHJlc3MuCisgICAgdGVtcGxhdGUgPGNsYXNzIE5vZGVUeT4KKyAgICBOb2RlVHkgKnJlcGxhY2VUZW1wb3JhcnkoVGVtcE1ETm9kZSAmJk4sIE5vZGVUeSAqUmVwbGFjZW1lbnQpIHsKKyAgICAgIGlmIChOLmdldCgpID09IFJlcGxhY2VtZW50KQorICAgICAgICByZXR1cm4gY2FzdDxOb2RlVHk+KE1ETm9kZTo6cmVwbGFjZVdpdGhVbmlxdWVkKHN0ZDo6bW92ZShOKSkpOworCisgICAgICBOLT5yZXBsYWNlQWxsVXNlc1dpdGgoUmVwbGFjZW1lbnQpOworICAgICAgcmV0dXJuIFJlcGxhY2VtZW50OworICAgIH0KKyAgfTsKKworICAvLyBDcmVhdGUgd3JhcHBlcnMgZm9yIEMgQmluZGluZyB0eXBlcyAoc2VlIENCaW5kaW5nV3JhcHBpbmcuaCkuCisgIERFRklORV9JU0FfQ09OVkVSU0lPTl9GVU5DVElPTlMoRElCdWlsZGVyLCBMTFZNRElCdWlsZGVyUmVmKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9ESUJVSUxERVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EYXRhTGF5b3V0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RhdGFMYXlvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDhlMTQwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EYXRhTGF5b3V0LmgKQEAgLTAsMCArMSw2MDIgQEAKKy8vPT09LSBsbHZtL0RhdGFMYXlvdXQuaCAtIERhdGEgc2l6ZSAmIGFsaWdubWVudCBpbmZvIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgbGF5b3V0IHByb3BlcnRpZXMgcmVsYXRlZCB0byBkYXRhdHlwZSBzaXplL29mZnNldC9hbGlnbm1lbnQKKy8vIGluZm9ybWF0aW9uLiAgSXQgdXNlcyBsYXp5IGFubm90YXRpb25zIHRvIGNhY2hlIGluZm9ybWF0aW9uIGFib3V0IGhvdworLy8gc3RydWN0dXJlIHR5cGVzIGFyZSBsYWlkIG91dCBhbmQgdXNlZC4KKy8vCisvLyBUaGlzIHN0cnVjdHVyZSBzaG91bGQgYmUgY3JlYXRlZCBvbmNlLCBmaWxsZWQgaW4gaWYgdGhlIGRlZmF1bHRzIGFyZSBub3QKKy8vIGNvcnJlY3QgYW5kIHRoZW4gcGFzc2VkIGFyb3VuZCBieSBjb25zdCYuICBOb25lIG9mIHRoZSBtZW1iZXJzIGZ1bmN0aW9ucworLy8gcmVxdWlyZSBtb2RpZmljYXRpb24gdG8gdGhlIG9iamVjdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfREFUQUxBWU9VVF9ICisjZGVmaW5lIExMVk1fSVJfREFUQUxBWU9VVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorCisvLyBUaGlzIG5lZWRzIHRvIGJlIG91dHNpZGUgb2YgdGhlIG5hbWVzcGFjZSwgdG8gYXZvaWQgY29uZmxpY3Qgd2l0aCBsbHZtLWMKKy8vIGRlY2wuCit1c2luZyBMTFZNVGFyZ2V0RGF0YVJlZiA9IHN0cnVjdCBMTFZNT3BhcXVlVGFyZ2V0RGF0YSAqOworCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEdsb2JhbFZhcmlhYmxlOworY2xhc3MgTExWTUNvbnRleHQ7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBTdHJ1Y3RMYXlvdXQ7CitjbGFzcyBUcmlwbGU7CitjbGFzcyBWYWx1ZTsKKworLy8vIEVudW0gdXNlZCB0byBjYXRlZ29yaXplIHRoZSBhbGlnbm1lbnQgdHlwZXMgc3RvcmVkIGJ5IExheW91dEFsaWduRWxlbQorZW51bSBBbGlnblR5cGVFbnVtIHsKKyAgSU5WQUxJRF9BTElHTiA9IDAsCisgIElOVEVHRVJfQUxJR04gPSAnaScsCisgIFZFQ1RPUl9BTElHTiA9ICd2JywKKyAgRkxPQVRfQUxJR04gPSAnZicsCisgIEFHR1JFR0FURV9BTElHTiA9ICdhJworfTsKKworLy8gRklYTUU6IEN1cnJlbnRseSB0aGUgRGF0YUxheW91dCBzdHJpbmcgY2FycmllcyBhICJwcmVmZXJyZWQgYWxpZ25tZW50IgorLy8gZm9yIHR5cGVzLiBBcyB0aGUgRGF0YUxheW91dCBpcyBtb2R1bGUvZ2xvYmFsLCB0aGlzIHNob3VsZCBsaWtlbHkgYmUKKy8vIHN1bmsgZG93biB0byBhbiBGVFRJIGVsZW1lbnQgdGhhdCBpcyBxdWVyaWVkIHJhdGhlciB0aGFuIGEgZ2xvYmFsCisvLyBwcmVmZXJlbmNlLgorCisvLy8gXGJyaWVmIExheW91dCBhbGlnbm1lbnQgZWxlbWVudC4KKy8vLworLy8vIFN0b3JlcyB0aGUgYWxpZ25tZW50IGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgZ2l2ZW4gYWxpZ25tZW50IHR5cGUgKGludGVnZXIsCisvLy8gdmVjdG9yLCBmbG9hdCkgYW5kIHR5cGUgYml0IHdpZHRoLgorLy8vCisvLy8gXG5vdGUgVGhlIHVudXN1YWwgb3JkZXIgb2YgZWxlbWVudHMgaW4gdGhlIHN0cnVjdHVyZSBhdHRlbXB0cyB0byByZWR1Y2UKKy8vLyBwYWRkaW5nIGFuZCBtYWtlIHRoZSBzdHJ1Y3R1cmUgc2xpZ2h0bHkgbW9yZSBjYWNoZSBmcmllbmRseS4KK3N0cnVjdCBMYXlvdXRBbGlnbkVsZW0geworICAvLy8gXGJyaWVmIEFsaWdubWVudCB0eXBlIGZyb20gXGMgQWxpZ25UeXBlRW51bQorICB1bnNpZ25lZCBBbGlnblR5cGUgOiA4OworICB1bnNpZ25lZCBUeXBlQml0V2lkdGggOiAyNDsKKyAgdW5zaWduZWQgQUJJQWxpZ24gOiAxNjsKKyAgdW5zaWduZWQgUHJlZkFsaWduIDogMTY7CisKKyAgc3RhdGljIExheW91dEFsaWduRWxlbSBnZXQoQWxpZ25UeXBlRW51bSBhbGlnbl90eXBlLCB1bnNpZ25lZCBhYmlfYWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHByZWZfYWxpZ24sIHVpbnQzMl90IGJpdF93aWR0aCk7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IExheW91dEFsaWduRWxlbSAmcmhzKSBjb25zdDsKK307CisKKy8vLyBcYnJpZWYgTGF5b3V0IHBvaW50ZXIgYWxpZ25tZW50IGVsZW1lbnQuCisvLy8KKy8vLyBTdG9yZXMgdGhlIGFsaWdubWVudCBkYXRhIGFzc29jaWF0ZWQgd2l0aCBhIGdpdmVuIHBvaW50ZXIgYW5kIGFkZHJlc3Mgc3BhY2UuCisvLy8KKy8vLyBcbm90ZSBUaGUgdW51c3VhbCBvcmRlciBvZiBlbGVtZW50cyBpbiB0aGUgc3RydWN0dXJlIGF0dGVtcHRzIHRvIHJlZHVjZQorLy8vIHBhZGRpbmcgYW5kIG1ha2UgdGhlIHN0cnVjdHVyZSBzbGlnaHRseSBtb3JlIGNhY2hlIGZyaWVuZGx5Lgorc3RydWN0IFBvaW50ZXJBbGlnbkVsZW0geworICB1bnNpZ25lZCBBQklBbGlnbjsKKyAgdW5zaWduZWQgUHJlZkFsaWduOworICB1aW50MzJfdCBUeXBlQnl0ZVdpZHRoOworICB1aW50MzJfdCBBZGRyZXNzU3BhY2U7CisgIHVpbnQzMl90IEluZGV4V2lkdGg7CisKKyAgLy8vIEluaXRpYWxpemVyCisgIHN0YXRpYyBQb2ludGVyQWxpZ25FbGVtIGdldCh1aW50MzJfdCBBZGRyZXNzU3BhY2UsIHVuc2lnbmVkIEFCSUFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUHJlZkFsaWduLCB1aW50MzJfdCBUeXBlQnl0ZVdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSW5kZXhXaWR0aCk7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFBvaW50ZXJBbGlnbkVsZW0gJnJocykgY29uc3Q7Cit9OworCisvLy8gXGJyaWVmIEEgcGFyc2VkIHZlcnNpb24gb2YgdGhlIHRhcmdldCBkYXRhIGxheW91dCBzdHJpbmcgaW4gYW5kIG1ldGhvZHMgZm9yCisvLy8gcXVlcnlpbmcgaXQuCisvLy8KKy8vLyBUaGUgdGFyZ2V0IGRhdGEgbGF5b3V0IHN0cmluZyBpcyBzcGVjaWZpZWQgKmJ5IHRoZSB0YXJnZXQqIC0gYSBmcm9udGVuZAorLy8vIGdlbmVyYXRpbmcgTExWTSBJUiBpcyByZXF1aXJlZCB0byBnZW5lcmF0ZSB0aGUgcmlnaHQgdGFyZ2V0IGRhdGEgZm9yIHRoZQorLy8vIHRhcmdldCBiZWluZyBjb2RlZ2VuJ2QgdG8uCitjbGFzcyBEYXRhTGF5b3V0IHsKK3ByaXZhdGU6CisgIC8vLyBEZWZhdWx0cyB0byBmYWxzZS4KKyAgYm9vbCBCaWdFbmRpYW47CisKKyAgdW5zaWduZWQgQWxsb2NhQWRkclNwYWNlOworICB1bnNpZ25lZCBTdGFja05hdHVyYWxBbGlnbjsKKyAgdW5zaWduZWQgUHJvZ3JhbUFkZHJTcGFjZTsKKworICBlbnVtIE1hbmdsaW5nTW9kZVQgeworICAgIE1NX05vbmUsCisgICAgTU1fRUxGLAorICAgIE1NX01hY2hPLAorICAgIE1NX1dpbkNPRkYsCisgICAgTU1fV2luQ09GRlg4NiwKKyAgICBNTV9NaXBzCisgIH07CisgIE1hbmdsaW5nTW9kZVQgTWFuZ2xpbmdNb2RlOworCisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkIGNoYXIsIDg+IExlZ2FsSW50V2lkdGhzOworCisgIC8vLyBcYnJpZWYgUHJpbWl0aXZlIHR5cGUgYWxpZ25tZW50IGRhdGEuIFRoaXMgaXMgc29ydGVkIGJ5IHR5cGUgYW5kIGJpdAorICAvLy8gd2lkdGggZHVyaW5nIGNvbnN0cnVjdGlvbi4KKyAgdXNpbmcgQWxpZ25tZW50c1R5ID0gU21hbGxWZWN0b3I8TGF5b3V0QWxpZ25FbGVtLCAxNj47CisgIEFsaWdubWVudHNUeSBBbGlnbm1lbnRzOworCisgIEFsaWdubWVudHNUeTo6Y29uc3RfaXRlcmF0b3IKKyAgZmluZEFsaWdubWVudExvd2VyQm91bmQoQWxpZ25UeXBlRW51bSBBbGlnblR5cGUsIHVpbnQzMl90IEJpdFdpZHRoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RGF0YUxheW91dCAqPih0aGlzKS0+ZmluZEFsaWdubWVudExvd2VyQm91bmQoQWxpZ25UeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdFdpZHRoKTsKKyAgfQorCisgIEFsaWdubWVudHNUeTo6aXRlcmF0b3IKKyAgZmluZEFsaWdubWVudExvd2VyQm91bmQoQWxpZ25UeXBlRW51bSBBbGlnblR5cGUsIHVpbnQzMl90IEJpdFdpZHRoKTsKKworICAvLy8gXGJyaWVmIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gdXNlZCB0byBjcmVhdGUgdGhpcyBEYXRhTGF5b3V0CisgIHN0ZDo6c3RyaW5nIFN0cmluZ1JlcHJlc2VudGF0aW9uOworCisgIHVzaW5nIFBvaW50ZXJzVHkgPSBTbWFsbFZlY3RvcjxQb2ludGVyQWxpZ25FbGVtLCA4PjsKKyAgUG9pbnRlcnNUeSBQb2ludGVyczsKKworICBQb2ludGVyc1R5Ojpjb25zdF9pdGVyYXRvcgorICBmaW5kUG9pbnRlckxvd2VyQm91bmQodWludDMyX3QgQWRkcmVzc1NwYWNlKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RGF0YUxheW91dCAqPih0aGlzKS0+ZmluZFBvaW50ZXJMb3dlckJvdW5kKEFkZHJlc3NTcGFjZSk7CisgIH0KKworICBQb2ludGVyc1R5OjppdGVyYXRvciBmaW5kUG9pbnRlckxvd2VyQm91bmQodWludDMyX3QgQWRkcmVzc1NwYWNlKTsKKworICAvLyBUaGUgU3RydWN0VHlwZSAtPiBTdHJ1Y3RMYXlvdXQgbWFwLgorICBtdXRhYmxlIHZvaWQgKkxheW91dE1hcCA9IG51bGxwdHI7CisKKyAgLy8vIFBvaW50ZXJzIGluIHRoZXNlIGFkZHJlc3Mgc3BhY2VzIGFyZSBub24taW50ZWdyYWwsIGFuZCBkb24ndCBoYXZlIGEKKyAgLy8vIHdlbGwtZGVmaW5lZCBiaXR3aXNlIHJlcHJlc2VudGF0aW9uLgorICBTbWFsbFZlY3Rvcjx1bnNpZ25lZCwgOD4gTm9uSW50ZWdyYWxBZGRyZXNzU3BhY2VzOworCisgIHZvaWQgc2V0QWxpZ25tZW50KEFsaWduVHlwZUVudW0gYWxpZ25fdHlwZSwgdW5zaWduZWQgYWJpX2FsaWduLAorICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBwcmVmX2FsaWduLCB1aW50MzJfdCBiaXRfd2lkdGgpOworICB1bnNpZ25lZCBnZXRBbGlnbm1lbnRJbmZvKEFsaWduVHlwZUVudW0gYWxpZ25fdHlwZSwgdWludDMyX3QgYml0X3dpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQUJJQWxpZ24sIFR5cGUgKlR5KSBjb25zdDsKKyAgdm9pZCBzZXRQb2ludGVyQWxpZ25tZW50KHVpbnQzMl90IEFkZHJTcGFjZSwgdW5zaWduZWQgQUJJQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQcmVmQWxpZ24sIHVpbnQzMl90IFR5cGVCeXRlV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJbmRleFdpZHRoKTsKKworICAvLy8gSW50ZXJuYWwgaGVscGVyIG1ldGhvZCB0aGF0IHJldHVybnMgcmVxdWVzdGVkIGFsaWdubWVudCBmb3IgdHlwZS4KKyAgdW5zaWduZWQgZ2V0QWxpZ25tZW50KFR5cGUgKlR5LCBib29sIGFiaV9vcl9wcmVmKSBjb25zdDsKKworICAvLy8gUGFyc2VzIGEgdGFyZ2V0IGRhdGEgc3BlY2lmaWNhdGlvbiBzdHJpbmcuIEFzc2VydCBpZiB0aGUgc3RyaW5nIGlzCisgIC8vLyBtYWxmb3JtZWQuCisgIHZvaWQgcGFyc2VTcGVjaWZpZXIoU3RyaW5nUmVmIExheW91dERlc2NyaXB0aW9uKTsKKworICAvLyBGcmVlIGFsbCBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMuCisgIHZvaWQgY2xlYXIoKTsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0cyBhIERhdGFMYXlvdXQgZnJvbSBhIHNwZWNpZmljYXRpb24gc3RyaW5nLiBTZWUgcmVzZXQoKS4KKyAgZXhwbGljaXQgRGF0YUxheW91dChTdHJpbmdSZWYgTGF5b3V0RGVzY3JpcHRpb24pIHsKKyAgICByZXNldChMYXlvdXREZXNjcmlwdGlvbik7CisgIH0KKworICAvLy8gSW5pdGlhbGl6ZSB0YXJnZXQgZGF0YSBmcm9tIHByb3BlcnRpZXMgc3RvcmVkIGluIHRoZSBtb2R1bGUuCisgIGV4cGxpY2l0IERhdGFMYXlvdXQoY29uc3QgTW9kdWxlICpNKTsKKworICBEYXRhTGF5b3V0KGNvbnN0IERhdGFMYXlvdXQgJkRMKSB7ICp0aGlzID0gREw7IH0KKworICB+RGF0YUxheW91dCgpOyAvLyBOb3QgdmlydHVhbCwgZG8gbm90IHN1YmNsYXNzIHRoaXMgY2xhc3MKKworICBEYXRhTGF5b3V0ICZvcGVyYXRvcj0oY29uc3QgRGF0YUxheW91dCAmREwpIHsKKyAgICBjbGVhcigpOworICAgIFN0cmluZ1JlcHJlc2VudGF0aW9uID0gREwuU3RyaW5nUmVwcmVzZW50YXRpb247CisgICAgQmlnRW5kaWFuID0gREwuaXNCaWdFbmRpYW4oKTsKKyAgICBBbGxvY2FBZGRyU3BhY2UgPSBETC5BbGxvY2FBZGRyU3BhY2U7CisgICAgU3RhY2tOYXR1cmFsQWxpZ24gPSBETC5TdGFja05hdHVyYWxBbGlnbjsKKyAgICBQcm9ncmFtQWRkclNwYWNlID0gREwuUHJvZ3JhbUFkZHJTcGFjZTsKKyAgICBNYW5nbGluZ01vZGUgPSBETC5NYW5nbGluZ01vZGU7CisgICAgTGVnYWxJbnRXaWR0aHMgPSBETC5MZWdhbEludFdpZHRoczsKKyAgICBBbGlnbm1lbnRzID0gREwuQWxpZ25tZW50czsKKyAgICBQb2ludGVycyA9IERMLlBvaW50ZXJzOworICAgIE5vbkludGVncmFsQWRkcmVzc1NwYWNlcyA9IERMLk5vbkludGVncmFsQWRkcmVzc1NwYWNlczsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgRGF0YUxheW91dCAmT3RoZXIpIGNvbnN0OworICBib29sIG9wZXJhdG9yIT0oY29uc3QgRGF0YUxheW91dCAmT3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gT3RoZXIpOyB9CisKKyAgdm9pZCBpbml0KGNvbnN0IE1vZHVsZSAqTSk7CisKKyAgLy8vIFBhcnNlIGEgZGF0YSBsYXlvdXQgc3RyaW5nICh3aXRoIGZhbGxiYWNrIHRvIGRlZmF1bHQgdmFsdWVzKS4KKyAgdm9pZCByZXNldChTdHJpbmdSZWYgTGF5b3V0RGVzY3JpcHRpb24pOworCisgIC8vLyBMYXlvdXQgZW5kaWFubmVzcy4uLgorICBib29sIGlzTGl0dGxlRW5kaWFuKCkgY29uc3QgeyByZXR1cm4gIUJpZ0VuZGlhbjsgfQorICBib29sIGlzQmlnRW5kaWFuKCkgY29uc3QgeyByZXR1cm4gQmlnRW5kaWFuOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIERhdGFMYXlvdXQuCisgIC8vLworICAvLy8gVGhpcyByZXByZXNlbnRhdGlvbiBpcyBpbiB0aGUgc2FtZSBmb3JtYXQgYWNjZXB0ZWQgYnkgdGhlIHN0cmluZworICAvLy8gY29uc3RydWN0b3IgYWJvdmUuIFRoaXMgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIGNvbXBhcmUgdHdvIERhdGFMYXlvdXQgYXMKKyAgLy8vIGRpZmZlcmVudCBzdHJpbmcgY2FuIHJlcHJlc2VudCB0aGUgc2FtZSBsYXlvdXQuCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRTdHJpbmdSZXByZXNlbnRhdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RyaW5nUmVwcmVzZW50YXRpb247CisgIH0KKworICAvLy8gXGJyaWVmIFRlc3QgaWYgdGhlIERhdGFMYXlvdXQgd2FzIGNvbnN0cnVjdGVkIGZyb20gYW4gZW1wdHkgc3RyaW5nLgorICBib29sIGlzRGVmYXVsdCgpIGNvbnN0IHsgcmV0dXJuIFN0cmluZ1JlcHJlc2VudGF0aW9uLmVtcHR5KCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHR5cGUgaXMga25vd24gdG8gYmUgYSBuYXRpdmUgaW50ZWdlcgorICAvLy8gdHlwZSBzdXBwb3J0ZWQgYnkgdGhlIENQVS4KKyAgLy8vCisgIC8vLyBGb3IgZXhhbXBsZSwgaTY0IGlzIG5vdCBuYXRpdmUgb24gbW9zdCAzMi1iaXQgQ1BVcyBhbmQgaTM3IGlzIG5vdCBuYXRpdmUKKyAgLy8vIG9uIGFueSBrbm93biBvbmUuIFRoaXMgcmV0dXJucyBmYWxzZSBpZiB0aGUgaW50ZWdlciB3aWR0aCBpcyBub3QgbGVnYWwuCisgIC8vLworICAvLy8gVGhlIHdpZHRoIGlzIHNwZWNpZmllZCBpbiBiaXRzLgorICBib29sIGlzTGVnYWxJbnRlZ2VyKHVpbnQ2NF90IFdpZHRoKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBMZWdhbEludFdpZHRoIDogTGVnYWxJbnRXaWR0aHMpCisgICAgICBpZiAoTGVnYWxJbnRXaWR0aCA9PSBXaWR0aCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBpc0lsbGVnYWxJbnRlZ2VyKHVpbnQ2NF90IFdpZHRoKSBjb25zdCB7IHJldHVybiAhaXNMZWdhbEludGVnZXIoV2lkdGgpOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gYWxpZ25tZW50IGV4Y2VlZHMgdGhlIG5hdHVyYWwgc3RhY2sgYWxpZ25tZW50LgorICBib29sIGV4Y2VlZHNOYXR1cmFsU3RhY2tBbGlnbm1lbnQodW5zaWduZWQgQWxpZ24pIGNvbnN0IHsKKyAgICByZXR1cm4gKFN0YWNrTmF0dXJhbEFsaWduICE9IDApICYmIChBbGlnbiA+IFN0YWNrTmF0dXJhbEFsaWduKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFN0YWNrQWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gU3RhY2tOYXR1cmFsQWxpZ247IH0KKyAgdW5zaWduZWQgZ2V0QWxsb2NhQWRkclNwYWNlKCkgY29uc3QgeyByZXR1cm4gQWxsb2NhQWRkclNwYWNlOyB9CisKKyAgdW5zaWduZWQgZ2V0UHJvZ3JhbUFkZHJlc3NTcGFjZSgpIGNvbnN0IHsgcmV0dXJuIFByb2dyYW1BZGRyU3BhY2U7IH0KKworICBib29sIGhhc01pY3Jvc29mdEZhc3RTdGRDYWxsTWFuZ2xpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIE1hbmdsaW5nTW9kZSA9PSBNTV9XaW5DT0ZGWDg2OworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBzeW1ib2xzIHdpdGggbGVhZGluZyBxdWVzdGlvbiBtYXJrcyBzaG91bGQgbm90IHJlY2VpdmUgSVIKKyAgLy8vIG1hbmdsaW5nLiBUcnVlIGZvciBXaW5kb3dzIG1hbmdsaW5nIG1vZGVzLgorICBib29sIGRvTm90TWFuZ2xlTGVhZGluZ1F1ZXN0aW9uTWFyaygpIGNvbnN0IHsKKyAgICByZXR1cm4gTWFuZ2xpbmdNb2RlID09IE1NX1dpbkNPRkYgfHwgTWFuZ2xpbmdNb2RlID09IE1NX1dpbkNPRkZYODY7CisgIH0KKworICBib29sIGhhc0xpbmtlclByaXZhdGVHbG9iYWxQcmVmaXgoKSBjb25zdCB7IHJldHVybiBNYW5nbGluZ01vZGUgPT0gTU1fTWFjaE87IH0KKworICBTdHJpbmdSZWYgZ2V0TGlua2VyUHJpdmF0ZUdsb2JhbFByZWZpeCgpIGNvbnN0IHsKKyAgICBpZiAoTWFuZ2xpbmdNb2RlID09IE1NX01hY2hPKQorICAgICAgcmV0dXJuICJsIjsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICBjaGFyIGdldEdsb2JhbFByZWZpeCgpIGNvbnN0IHsKKyAgICBzd2l0Y2ggKE1hbmdsaW5nTW9kZSkgeworICAgIGNhc2UgTU1fTm9uZToKKyAgICBjYXNlIE1NX0VMRjoKKyAgICBjYXNlIE1NX01pcHM6CisgICAgY2FzZSBNTV9XaW5DT0ZGOgorICAgICAgcmV0dXJuICdcMCc7CisgICAgY2FzZSBNTV9NYWNoTzoKKyAgICBjYXNlIE1NX1dpbkNPRkZYODY6CisgICAgICByZXR1cm4gJ18nOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJpbnZhbGlkIG1hbmdsaW5nIG1vZGUiKTsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRQcml2YXRlR2xvYmFsUHJlZml4KCkgY29uc3QgeworICAgIHN3aXRjaCAoTWFuZ2xpbmdNb2RlKSB7CisgICAgY2FzZSBNTV9Ob25lOgorICAgICAgcmV0dXJuICIiOworICAgIGNhc2UgTU1fRUxGOgorICAgIGNhc2UgTU1fV2luQ09GRjoKKyAgICAgIHJldHVybiAiLkwiOworICAgIGNhc2UgTU1fTWlwczoKKyAgICAgIHJldHVybiAiJCI7CisgICAgY2FzZSBNTV9NYWNoTzoKKyAgICBjYXNlIE1NX1dpbkNPRkZYODY6CisgICAgICByZXR1cm4gIkwiOworICAgIH0KKyAgICBsbHZtX3VucmVhY2hhYmxlKCJpbnZhbGlkIG1hbmdsaW5nIG1vZGUiKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRNYW5nbGluZ0NvbXBvbmVudChjb25zdCBUcmlwbGUgJlQpOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdHlwZSBmaXRzIGluIGEgbmF0aXZlIGludGVnZXIgdHlwZQorICAvLy8gc3VwcG9ydGVkIGJ5IHRoZSBDUFUuCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUsIGlmIHRoZSBDUFUgb25seSBzdXBwb3J0cyBpMzIgYXMgYSBuYXRpdmUgaW50ZWdlciB0eXBlLCB0aGVuCisgIC8vLyBpMjcgZml0cyBpbiBhIGxlZ2FsIGludGVnZXIgdHlwZSBidXQgaTQ1IGRvZXMgbm90LgorICBib29sIGZpdHNJbkxlZ2FsSW50ZWdlcih1bnNpZ25lZCBXaWR0aCkgY29uc3QgeworICAgIGZvciAodW5zaWduZWQgTGVnYWxJbnRXaWR0aCA6IExlZ2FsSW50V2lkdGhzKQorICAgICAgaWYgKFdpZHRoIDw9IExlZ2FsSW50V2lkdGgpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBMYXlvdXQgcG9pbnRlciBhbGlnbm1lbnQKKyAgdW5zaWduZWQgZ2V0UG9pbnRlckFCSUFsaWdubWVudCh1bnNpZ25lZCBBUykgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0YXJnZXQncyBhbGlnbm1lbnQgZm9yIHN0YWNrLWJhc2VkIHBvaW50ZXJzCisgIC8vLyBGSVhNRTogVGhlIGRlZmF1bHRzIG5lZWQgdG8gYmUgcmVtb3ZlZCBvbmNlIGFsbCBvZgorICAvLy8gdGhlIGJhY2tlbmRzL2NsaWVudHMgYXJlIHVwZGF0ZWQuCisgIHVuc2lnbmVkIGdldFBvaW50ZXJQcmVmQWxpZ25tZW50KHVuc2lnbmVkIEFTID0gMCkgY29uc3Q7CisKKyAgLy8vIExheW91dCBwb2ludGVyIHNpemUKKyAgLy8vIEZJWE1FOiBUaGUgZGVmYXVsdHMgbmVlZCB0byBiZSByZW1vdmVkIG9uY2UgYWxsIG9mCisgIC8vLyB0aGUgYmFja2VuZHMvY2xpZW50cyBhcmUgdXBkYXRlZC4KKyAgdW5zaWduZWQgZ2V0UG9pbnRlclNpemUodW5zaWduZWQgQVMgPSAwKSBjb25zdDsKKworICAvLyBJbmRleCBzaXplIHVzZWQgZm9yIGFkZHJlc3MgY2FsY3VsYXRpb24uCisgIHVuc2lnbmVkIGdldEluZGV4U2l6ZSh1bnNpZ25lZCBBUykgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgYWRkcmVzcyBzcGFjZXMgY29udGFpbmluZyBub24taW50ZWdyYWwgcG9pbnRlcnMuICBQb2ludGVycyBpbgorICAvLy8gdGhpcyBhZGRyZXNzIHNwYWNlIGRvbid0IGhhdmUgYSB3ZWxsLWRlZmluZWQgYml0d2lzZSByZXByZXNlbnRhdGlvbi4KKyAgQXJyYXlSZWY8dW5zaWduZWQ+IGdldE5vbkludGVncmFsQWRkcmVzc1NwYWNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gTm9uSW50ZWdyYWxBZGRyZXNzU3BhY2VzOworICB9CisKKyAgYm9vbCBpc05vbkludGVncmFsUG9pbnRlclR5cGUoUG9pbnRlclR5cGUgKlBUKSBjb25zdCB7CisgICAgQXJyYXlSZWY8dW5zaWduZWQ+IE5vbkludGVncmFsU3BhY2VzID0gZ2V0Tm9uSW50ZWdyYWxBZGRyZXNzU3BhY2VzKCk7CisgICAgcmV0dXJuIGZpbmQoTm9uSW50ZWdyYWxTcGFjZXMsIFBULT5nZXRBZGRyZXNzU3BhY2UoKSkgIT0KKyAgICAgICAgICAgTm9uSW50ZWdyYWxTcGFjZXMuZW5kKCk7CisgIH0KKworICBib29sIGlzTm9uSW50ZWdyYWxQb2ludGVyVHlwZShUeXBlICpUeSkgY29uc3QgeworICAgIGF1dG8gKlBUeSA9IGR5bl9jYXN0PFBvaW50ZXJUeXBlPihUeSk7CisgICAgcmV0dXJuIFBUeSAmJiBpc05vbkludGVncmFsUG9pbnRlclR5cGUoUFR5KTsKKyAgfQorCisgIC8vLyBMYXlvdXQgcG9pbnRlciBzaXplLCBpbiBiaXRzCisgIC8vLyBGSVhNRTogVGhlIGRlZmF1bHRzIG5lZWQgdG8gYmUgcmVtb3ZlZCBvbmNlIGFsbCBvZgorICAvLy8gdGhlIGJhY2tlbmRzL2NsaWVudHMgYXJlIHVwZGF0ZWQuCisgIHVuc2lnbmVkIGdldFBvaW50ZXJTaXplSW5CaXRzKHVuc2lnbmVkIEFTID0gMCkgY29uc3QgeworICAgIHJldHVybiBnZXRQb2ludGVyU2l6ZShBUykgKiA4OworICB9CisKKyAgLy8vIFNpemUgaW4gYml0cyBvZiBpbmRleCB1c2VkIGZvciBhZGRyZXNzIGNhbGN1bGF0aW9uIGluIGdldGVsZW1lbnRwdHIuCisgIHVuc2lnbmVkIGdldEluZGV4U2l6ZUluQml0cyh1bnNpZ25lZCBBUykgY29uc3QgeworICAgIHJldHVybiBnZXRJbmRleFNpemUoQVMpICogODsKKyAgfQorCisgIC8vLyBMYXlvdXQgcG9pbnRlciBzaXplLCBpbiBiaXRzLCBiYXNlZCBvbiB0aGUgdHlwZS4gIElmIHRoaXMgZnVuY3Rpb24gaXMKKyAgLy8vIGNhbGxlZCB3aXRoIGEgcG9pbnRlciB0eXBlLCB0aGVuIHRoZSB0eXBlIHNpemUgb2YgdGhlIHBvaW50ZXIgaXMgcmV0dXJuZWQuCisgIC8vLyBJZiB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aXRoIGEgdmVjdG9yIG9mIHBvaW50ZXJzLCB0aGVuIHRoZSB0eXBlIHNpemUKKyAgLy8vIG9mIHRoZSBwb2ludGVyIGlzIHJldHVybmVkLiAgVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgd2l0aCBhIHBvaW50ZXIgb3IKKyAgLy8vIHZlY3RvciBvZiBwb2ludGVycy4KKyAgdW5zaWduZWQgZ2V0UG9pbnRlclR5cGVTaXplSW5CaXRzKFR5cGUgKikgY29uc3Q7CisKKyAgLy8vIExheW91dCBzaXplIG9mIHRoZSBpbmRleCB1c2VkIGluIEdFUCBjYWxjdWxhdGlvbi4KKyAgLy8vIFRoZSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIHdpdGggcG9pbnRlciBvciB2ZWN0b3Igb2YgcG9pbnRlcnMgdHlwZS4KKyAgdW5zaWduZWQgZ2V0SW5kZXhUeXBlU2l6ZUluQml0cyhUeXBlICpUeSkgY29uc3Q7CisKKyAgdW5zaWduZWQgZ2V0UG9pbnRlclR5cGVTaXplKFR5cGUgKlR5KSBjb25zdCB7CisgICAgcmV0dXJuIGdldFBvaW50ZXJUeXBlU2l6ZUluQml0cyhUeSkgLyA4OworICB9CisKKyAgLy8vIFNpemUgZXhhbXBsZXM6CisgIC8vLworICAvLy8gVHlwZSAgICAgICAgU2l6ZUluQml0cyAgU3RvcmVTaXplSW5CaXRzICBBbGxvY1NpemVJbkJpdHNbKl0KKyAgLy8vIC0tLS0gICAgICAgIC0tLS0tLS0tLS0gIC0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tCisgIC8vLyAgaTEgICAgICAgICAgICAxICAgICAgICAgICA4ICAgICAgICAgICAgICAgIDgKKyAgLy8vICBpOCAgICAgICAgICAgIDggICAgICAgICAgIDggICAgICAgICAgICAgICAgOAorICAvLy8gIGkxOSAgICAgICAgICAxOSAgICAgICAgICAyNCAgICAgICAgICAgICAgIDMyCisgIC8vLyAgaTMyICAgICAgICAgIDMyICAgICAgICAgIDMyICAgICAgICAgICAgICAgMzIKKyAgLy8vICBpMTAwICAgICAgICAxMDAgICAgICAgICAxMDQgICAgICAgICAgICAgIDEyOAorICAvLy8gIGkxMjggICAgICAgIDEyOCAgICAgICAgIDEyOCAgICAgICAgICAgICAgMTI4CisgIC8vLyAgRmxvYXQgICAgICAgIDMyICAgICAgICAgIDMyICAgICAgICAgICAgICAgMzIKKyAgLy8vICBEb3VibGUgICAgICAgNjQgICAgICAgICAgNjQgICAgICAgICAgICAgICA2NAorICAvLy8gIFg4Nl9GUDgwICAgICA4MCAgICAgICAgICA4MCAgICAgICAgICAgICAgIDk2CisgIC8vLworICAvLy8gWypdIFRoZSBhbGxvYyBzaXplIGRlcGVuZHMgb24gdGhlIGFsaWdubWVudCwgYW5kIHRodXMgb24gdGhlIHRhcmdldC4KKyAgLy8vICAgICBUaGVzZSB2YWx1ZXMgYXJlIGZvciB4ODYtMzIgbGludXguCisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYml0cyBuZWNlc3NhcnkgdG8gaG9sZCB0aGUgc3BlY2lmaWVkIHR5cGUuCisgIC8vLworICAvLy8gRm9yIGV4YW1wbGUsIHJldHVybnMgMzYgZm9yIGkzNiBhbmQgODAgZm9yIHg4Nl9mcDgwLiBUaGUgdHlwZSBwYXNzZWQgbXVzdAorICAvLy8gaGF2ZSBhIHNpemUgKFR5cGU6OmlzU2l6ZWQoKSBtdXN0IHJldHVybiB0cnVlKS4KKyAgdWludDY0X3QgZ2V0VHlwZVNpemVJbkJpdHMoVHlwZSAqVHkpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBtYXkgYmUgb3ZlcndyaXR0ZW4gYnkKKyAgLy8vIHN0b3JpbmcgdGhlIHNwZWNpZmllZCB0eXBlLgorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlLCByZXR1cm5zIDUgZm9yIGkzNiBhbmQgMTAgZm9yIHg4Nl9mcDgwLgorICB1aW50NjRfdCBnZXRUeXBlU3RvcmVTaXplKFR5cGUgKlR5KSBjb25zdCB7CisgICAgcmV0dXJuIChnZXRUeXBlU2l6ZUluQml0cyhUeSkgKyA3KSAvIDg7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGJpdHMgdGhhdCBtYXkgYmUgb3ZlcndyaXR0ZW4gYnkKKyAgLy8vIHN0b3JpbmcgdGhlIHNwZWNpZmllZCB0eXBlOyBhbHdheXMgYSBtdWx0aXBsZSBvZiA4LgorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlLCByZXR1cm5zIDQwIGZvciBpMzYgYW5kIDgwIGZvciB4ODZfZnA4MC4KKyAgdWludDY0X3QgZ2V0VHlwZVN0b3JlU2l6ZUluQml0cyhUeXBlICpUeSkgY29uc3QgeworICAgIHJldHVybiA4ICogZ2V0VHlwZVN0b3JlU2l6ZShUeSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG9mZnNldCBpbiBieXRlcyBiZXR3ZWVuIHN1Y2Nlc3NpdmUgb2JqZWN0cyBvZiB0aGUKKyAgLy8vIHNwZWNpZmllZCB0eXBlLCBpbmNsdWRpbmcgYWxpZ25tZW50IHBhZGRpbmcuCisgIC8vLworICAvLy8gVGhpcyBpcyB0aGUgYW1vdW50IHRoYXQgYWxsb2NhIHJlc2VydmVzIGZvciB0aGlzIHR5cGUuIEZvciBleGFtcGxlLAorICAvLy8gcmV0dXJucyAxMiBvciAxNiBmb3IgeDg2X2ZwODAsIGRlcGVuZGluZyBvbiBhbGlnbm1lbnQuCisgIHVpbnQ2NF90IGdldFR5cGVBbGxvY1NpemUoVHlwZSAqVHkpIGNvbnN0IHsKKyAgICAvLyBSb3VuZCB1cCB0byB0aGUgbmV4dCBhbGlnbm1lbnQgYm91bmRhcnkuCisgICAgcmV0dXJuIGFsaWduVG8oZ2V0VHlwZVN0b3JlU2l6ZShUeSksIGdldEFCSVR5cGVBbGlnbm1lbnQoVHkpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgb2Zmc2V0IGluIGJpdHMgYmV0d2VlbiBzdWNjZXNzaXZlIG9iamVjdHMgb2YgdGhlCisgIC8vLyBzcGVjaWZpZWQgdHlwZSwgaW5jbHVkaW5nIGFsaWdubWVudCBwYWRkaW5nOyBhbHdheXMgYSBtdWx0aXBsZSBvZiA4LgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdGhlIGFtb3VudCB0aGF0IGFsbG9jYSByZXNlcnZlcyBmb3IgdGhpcyB0eXBlLiBGb3IgZXhhbXBsZSwKKyAgLy8vIHJldHVybnMgOTYgb3IgMTI4IGZvciB4ODZfZnA4MCwgZGVwZW5kaW5nIG9uIGFsaWdubWVudC4KKyAgdWludDY0X3QgZ2V0VHlwZUFsbG9jU2l6ZUluQml0cyhUeXBlICpUeSkgY29uc3QgeworICAgIHJldHVybiA4ICogZ2V0VHlwZUFsbG9jU2l6ZShUeSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG1pbmltdW0gQUJJLXJlcXVpcmVkIGFsaWdubWVudCBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLgorICB1bnNpZ25lZCBnZXRBQklUeXBlQWxpZ25tZW50KFR5cGUgKlR5KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG1pbmltdW0gQUJJLXJlcXVpcmVkIGFsaWdubWVudCBmb3IgYW4gaW50ZWdlciB0eXBlIG9mCisgIC8vLyB0aGUgc3BlY2lmaWVkIGJpdHdpZHRoLgorICB1bnNpZ25lZCBnZXRBQklJbnRlZ2VyVHlwZUFsaWdubWVudCh1bnNpZ25lZCBCaXRXaWR0aCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBwcmVmZXJyZWQgc3RhY2svZ2xvYmFsIGFsaWdubWVudCBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gdHlwZS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGFsd2F5cyBhdCBsZWFzdCBhcyBnb29kIGFzIHRoZSBBQkkgYWxpZ25tZW50LgorICB1bnNpZ25lZCBnZXRQcmVmVHlwZUFsaWdubWVudChUeXBlICpUeSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBwcmVmZXJyZWQgYWxpZ25tZW50IGZvciB0aGUgc3BlY2lmaWVkIHR5cGUsIHJldHVybmVkIGFzCisgIC8vLyBsb2cyIG9mIHRoZSB2YWx1ZSAoYSBzaGlmdCBhbW91bnQpLgorICB1bnNpZ25lZCBnZXRQcmVmZXJyZWRUeXBlQWxpZ25tZW50U2hpZnQoVHlwZSAqVHkpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhbiBpbnRlZ2VyIHR5cGUgd2l0aCBzaXplIGF0IGxlYXN0IGFzIGJpZyBhcyB0aGF0IG9mIGEKKyAgLy8vIHBvaW50ZXIgaW4gdGhlIGdpdmVuIGFkZHJlc3Mgc3BhY2UuCisgIEludGVnZXJUeXBlICpnZXRJbnRQdHJUeXBlKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBBZGRyZXNzU3BhY2UgPSAwKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgYW4gaW50ZWdlciAodmVjdG9yIG9mIGludGVnZXIpIHR5cGUgd2l0aCBzaXplIGF0IGxlYXN0IGFzCisgIC8vLyBiaWcgYXMgdGhhdCBvZiBhIHBvaW50ZXIgb2YgdGhlIGdpdmVuIHBvaW50ZXIgKHZlY3RvciBvZiBwb2ludGVyKSB0eXBlLgorICBUeXBlICpnZXRJbnRQdHJUeXBlKFR5cGUgKikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBzbWFsbGVzdCBpbnRlZ2VyIHR5cGUgd2l0aCBzaXplIGF0IGxlYXN0IGFzIGJpZyBhcworICAvLy8gV2lkdGggYml0cy4KKyAgVHlwZSAqZ2V0U21hbGxlc3RMZWdhbEludFR5cGUoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIFdpZHRoID0gMCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBsYXJnZXN0IGxlZ2FsIGludGVnZXIgdHlwZSwgb3IgbnVsbCBpZiBub25lIGFyZSBzZXQuCisgIFR5cGUgKmdldExhcmdlc3RMZWdhbEludFR5cGUoTExWTUNvbnRleHQgJkMpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBMYXJnZXN0U2l6ZSA9IGdldExhcmdlc3RMZWdhbEludFR5cGVTaXplSW5CaXRzKCk7CisgICAgcmV0dXJuIChMYXJnZXN0U2l6ZSA9PSAwKSA/IG51bGxwdHIgOiBUeXBlOjpnZXRJbnROVHkoQywgTGFyZ2VzdFNpemUpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBzaXplIG9mIGxhcmdlc3QgbGVnYWwgaW50ZWdlciB0eXBlIHNpemUsIG9yIDAgaWYgbm9uZQorICAvLy8gYXJlIHNldC4KKyAgdW5zaWduZWQgZ2V0TGFyZ2VzdExlZ2FsSW50VHlwZVNpemVJbkJpdHMoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHR5cGUgb2YgYSBHRVAgaW5kZXguCisgIC8vLyBJZiBpdCB3YXMgbm90IHNwZWNpZmllZCBleHBsaWNpdGx5LCBpdCB3aWxsIGJlIHRoZSBpbnRlZ2VyIHR5cGUgb2YgdGhlCisgIC8vLyBwb2ludGVyIHdpZHRoIC0gSW50UHRyVHlwZS4KKyAgVHlwZSAqZ2V0SW5kZXhUeXBlKFR5cGUgKlB0clR5KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG9mZnNldCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHR5cGUgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIGluZGljZXMuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgdGFrZXMgdGhlIGVsZW1lbnQgdHlwZSwgbm90IHRoZSBwb2ludGVyIHR5cGUuCisgIC8vLyBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IGdldGVsZW1lbnRwdHIuCisgIGludDY0X3QgZ2V0SW5kZXhlZE9mZnNldEluVHlwZShUeXBlICpFbGVtVHksIEFycmF5UmVmPFZhbHVlICo+IEluZGljZXMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhIFN0cnVjdExheW91dCBvYmplY3QsIGluZGljYXRpbmcgdGhlIGFsaWdubWVudCBvZiB0aGUKKyAgLy8vIHN0cnVjdCwgaXRzIHNpemUsIGFuZCB0aGUgb2Zmc2V0cyBvZiBpdHMgZmllbGRzLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGluZm9ybWF0aW9uIGlzIGxhemlseSBjYWNoZWQuCisgIGNvbnN0IFN0cnVjdExheW91dCAqZ2V0U3RydWN0TGF5b3V0KFN0cnVjdFR5cGUgKlR5KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHByZWZlcnJlZCBhbGlnbm1lbnQgb2YgdGhlIHNwZWNpZmllZCBnbG9iYWwuCisgIC8vLworICAvLy8gVGhpcyBpbmNsdWRlcyBhbiBleHBsaWNpdGx5IHJlcXVlc3RlZCBhbGlnbm1lbnQgKGlmIHRoZSBnbG9iYWwgaGFzIG9uZSkuCisgIHVuc2lnbmVkIGdldFByZWZlcnJlZEFsaWdubWVudChjb25zdCBHbG9iYWxWYXJpYWJsZSAqR1YpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgcHJlZmVycmVkIGFsaWdubWVudCBvZiB0aGUgc3BlY2lmaWVkIGdsb2JhbCwgcmV0dXJuZWQKKyAgLy8vIGluIGxvZyBmb3JtLgorICAvLy8KKyAgLy8vIFRoaXMgaW5jbHVkZXMgYW4gZXhwbGljaXRseSByZXF1ZXN0ZWQgYWxpZ25tZW50IChpZiB0aGUgZ2xvYmFsIGhhcyBvbmUpLgorICB1bnNpZ25lZCBnZXRQcmVmZXJyZWRBbGlnbm1lbnRMb2coY29uc3QgR2xvYmFsVmFyaWFibGUgKkdWKSBjb25zdDsKK307CisKK2lubGluZSBEYXRhTGF5b3V0ICp1bndyYXAoTExWTVRhcmdldERhdGFSZWYgUCkgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxEYXRhTGF5b3V0ICo+KFApOworfQorCitpbmxpbmUgTExWTVRhcmdldERhdGFSZWYgd3JhcChjb25zdCBEYXRhTGF5b3V0ICpQKSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PExMVk1UYXJnZXREYXRhUmVmPihjb25zdF9jYXN0PERhdGFMYXlvdXQgKj4oUCkpOworfQorCisvLy8gVXNlZCB0byBsYXppbHkgY2FsY3VsYXRlIHN0cnVjdHVyZSBsYXlvdXQgaW5mb3JtYXRpb24gZm9yIGEgdGFyZ2V0IG1hY2hpbmUsCisvLy8gYmFzZWQgb24gdGhlIERhdGFMYXlvdXQgc3RydWN0dXJlLgorY2xhc3MgU3RydWN0TGF5b3V0IHsKKyAgdWludDY0X3QgU3RydWN0U2l6ZTsKKyAgdW5zaWduZWQgU3RydWN0QWxpZ25tZW50OworICB1bnNpZ25lZCBJc1BhZGRlZCA6IDE7CisgIHVuc2lnbmVkIE51bUVsZW1lbnRzIDogMzE7CisgIHVpbnQ2NF90IE1lbWJlck9mZnNldHNbMV07IC8vIHZhcmlhYmxlIHNpemVkIGFycmF5IQorCitwdWJsaWM6CisgIHVpbnQ2NF90IGdldFNpemVJbkJ5dGVzKCkgY29uc3QgeyByZXR1cm4gU3RydWN0U2l6ZTsgfQorCisgIHVpbnQ2NF90IGdldFNpemVJbkJpdHMoKSBjb25zdCB7IHJldHVybiA4ICogU3RydWN0U2l6ZTsgfQorCisgIHVuc2lnbmVkIGdldEFsaWdubWVudCgpIGNvbnN0IHsgcmV0dXJuIFN0cnVjdEFsaWdubWVudDsgfQorCisgIC8vLyBSZXR1cm5zIHdoZXRoZXIgdGhlIHN0cnVjdCBoYXMgcGFkZGluZyBvciBub3QgYmV0d2VlbiBpdHMgZmllbGRzLgorICAvLy8gTkI6IFBhZGRpbmcgaW4gbmVzdGVkIGVsZW1lbnQgaXMgbm90IHRha2VuIGludG8gYWNjb3VudC4KKyAgYm9vbCBoYXNQYWRkaW5nKCkgY29uc3QgeyByZXR1cm4gSXNQYWRkZWQ7IH0KKworICAvLy8gXGJyaWVmIEdpdmVuIGEgdmFsaWQgYnl0ZSBvZmZzZXQgaW50byB0aGUgc3RydWN0dXJlLCByZXR1cm5zIHRoZSBzdHJ1Y3R1cmUKKyAgLy8vIGluZGV4IHRoYXQgY29udGFpbnMgaXQuCisgIHVuc2lnbmVkIGdldEVsZW1lbnRDb250YWluaW5nT2Zmc2V0KHVpbnQ2NF90IE9mZnNldCkgY29uc3Q7CisKKyAgdWludDY0X3QgZ2V0RWxlbWVudE9mZnNldCh1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSWR4IDwgTnVtRWxlbWVudHMgJiYgIkludmFsaWQgZWxlbWVudCBpZHghIik7CisgICAgcmV0dXJuIE1lbWJlck9mZnNldHNbSWR4XTsKKyAgfQorCisgIHVpbnQ2NF90IGdldEVsZW1lbnRPZmZzZXRJbkJpdHModW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIGdldEVsZW1lbnRPZmZzZXQoSWR4KSAqIDg7CisgIH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIERhdGFMYXlvdXQ7IC8vIE9ubHkgRGF0YUxheW91dCBjYW4gY3JlYXRlIHRoaXMgY2xhc3MKKworICBTdHJ1Y3RMYXlvdXQoU3RydWN0VHlwZSAqU1QsIGNvbnN0IERhdGFMYXlvdXQgJkRMKTsKK307CisKKy8vIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIG1ldGhvZCBpcyBwcm92aWRlZCBpbmxpbmUgYXMgaXQgaXMgcGFydGljdWxhcmx5CisvLyB3ZWxsIHN1aXRlZCB0byBjb25zdGFudCBmb2xkaW5nIHdoZW4gY2FsbGVkIG9uIGEgc3BlY2lmaWMgVHlwZSBzdWJjbGFzcy4KK2lubGluZSB1aW50NjRfdCBEYXRhTGF5b3V0OjpnZXRUeXBlU2l6ZUluQml0cyhUeXBlICpUeSkgY29uc3QgeworICBhc3NlcnQoVHktPmlzU2l6ZWQoKSAmJiAiQ2Fubm90IGdldFR5cGVJbmZvKCkgb24gYSB0eXBlIHRoYXQgaXMgdW5zaXplZCEiKTsKKyAgc3dpdGNoIChUeS0+Z2V0VHlwZUlEKCkpIHsKKyAgY2FzZSBUeXBlOjpMYWJlbFR5SUQ6CisgICAgcmV0dXJuIGdldFBvaW50ZXJTaXplSW5CaXRzKDApOworICBjYXNlIFR5cGU6OlBvaW50ZXJUeUlEOgorICAgIHJldHVybiBnZXRQb2ludGVyU2l6ZUluQml0cyhUeS0+Z2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpKTsKKyAgY2FzZSBUeXBlOjpBcnJheVR5SUQ6IHsKKyAgICBBcnJheVR5cGUgKkFUeSA9IGNhc3Q8QXJyYXlUeXBlPihUeSk7CisgICAgcmV0dXJuIEFUeS0+Z2V0TnVtRWxlbWVudHMoKSAqCisgICAgICAgICAgIGdldFR5cGVBbGxvY1NpemVJbkJpdHMoQVR5LT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgfQorICBjYXNlIFR5cGU6OlN0cnVjdFR5SUQ6CisgICAgLy8gR2V0IHRoZSBsYXlvdXQgYW5ub3RhdGlvbi4uLiB3aGljaCBpcyBsYXppbHkgY3JlYXRlZCBvbiBkZW1hbmQuCisgICAgcmV0dXJuIGdldFN0cnVjdExheW91dChjYXN0PFN0cnVjdFR5cGU+KFR5KSktPmdldFNpemVJbkJpdHMoKTsKKyAgY2FzZSBUeXBlOjpJbnRlZ2VyVHlJRDoKKyAgICByZXR1cm4gVHktPmdldEludGVnZXJCaXRXaWR0aCgpOworICBjYXNlIFR5cGU6OkhhbGZUeUlEOgorICAgIHJldHVybiAxNjsKKyAgY2FzZSBUeXBlOjpGbG9hdFR5SUQ6CisgICAgcmV0dXJuIDMyOworICBjYXNlIFR5cGU6OkRvdWJsZVR5SUQ6CisgIGNhc2UgVHlwZTo6WDg2X01NWFR5SUQ6CisgICAgcmV0dXJuIDY0OworICBjYXNlIFR5cGU6OlBQQ19GUDEyOFR5SUQ6CisgIGNhc2UgVHlwZTo6RlAxMjhUeUlEOgorICAgIHJldHVybiAxMjg7CisgIC8vIEluIG1lbW9yeSBvYmplY3RzIHRoaXMgaXMgYWx3YXlzIGFsaWduZWQgdG8gYSBoaWdoZXIgYm91bmRhcnksIGJ1dAorICAvLyBvbmx5IDgwIGJpdHMgY29udGFpbiBpbmZvcm1hdGlvbi4KKyAgY2FzZSBUeXBlOjpYODZfRlA4MFR5SUQ6CisgICAgcmV0dXJuIDgwOworICBjYXNlIFR5cGU6OlZlY3RvclR5SUQ6IHsKKyAgICBWZWN0b3JUeXBlICpWVHkgPSBjYXN0PFZlY3RvclR5cGU+KFR5KTsKKyAgICByZXR1cm4gVlR5LT5nZXROdW1FbGVtZW50cygpICogZ2V0VHlwZVNpemVJbkJpdHMoVlR5LT5nZXRFbGVtZW50VHlwZSgpKTsKKyAgfQorICBkZWZhdWx0OgorICAgIGxsdm1fdW5yZWFjaGFibGUoIkRhdGFMYXlvdXQ6OmdldFR5cGVTaXplSW5CaXRzKCk6IFVuc3VwcG9ydGVkIHR5cGUiKTsKKyAgfQorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9EQVRBTEFZT1VUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRGVidWdJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RlYnVnSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkOGU3ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RlYnVnSW5mby5oCkBAIC0wLDAgKzEsMTM4IEBACisvLz09PS0gRGVidWdJbmZvLmggLSBEZWJ1ZyBJbmZvcm1hdGlvbiBIZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgYnVuY2ggb2YgZGF0YXR5cGVzIHRoYXQgYXJlIHVzZWZ1bCBmb3IgY3JlYXRpbmcgYW5kCisvLyB3YWxraW5nIGRlYnVnIGluZm8gaW4gTExWTSBJUiBmb3JtLiBUaGV5IGVzc2VudGlhbGx5IHByb3ZpZGUgd3JhcHBlcnMgYXJvdW5kCisvLyB0aGUgaW5mb3JtYXRpb24gaW4gdGhlIGdsb2JhbCB2YXJpYWJsZXMgdGhhdCdzIG5lZWRlZCB3aGVuIGNvbnN0cnVjdGluZyB0aGUKKy8vIERXQVJGIGluZm9ybWF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9ERUJVR0lORk9fSAorI2RlZmluZSBMTFZNX0lSX0RFQlVHSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RlYnVnSW5mb01ldGFkYXRhLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRGJnRGVjbGFyZUluc3Q7CitjbGFzcyBEYmdWYWx1ZUluc3Q7CitjbGFzcyBNb2R1bGU7CisKKy8vLyBcYnJpZWYgRmluZCBzdWJwcm9ncmFtIHRoYXQgaXMgZW5jbG9zaW5nIHRoaXMgc2NvcGUuCitESVN1YnByb2dyYW0gKmdldERJU3VicHJvZ3JhbShjb25zdCBNRE5vZGUgKlNjb3BlKTsKKworLy8vIFxicmllZiBTdHJpcCBkZWJ1ZyBpbmZvIGluIHRoZSBtb2R1bGUgaWYgaXQgZXhpc3RzLgorLy8vCisvLy8gVG8gZG8gdGhpcywgd2UgcmVtb3ZlIGFsbCBjYWxscyB0byB0aGUgZGVidWdnZXIgaW50cmluc2ljcyBhbmQgYW55IG5hbWVkCisvLy8gbWV0YWRhdGEgZm9yIGRlYnVnZ2luZy4gV2UgYWxzbyByZW1vdmUgZGVidWcgbG9jYXRpb25zIGZvciBpbnN0cnVjdGlvbnMuCisvLy8gUmV0dXJuIHRydWUgaWYgbW9kdWxlIGlzIG1vZGlmaWVkLgorYm9vbCBTdHJpcERlYnVnSW5mbyhNb2R1bGUgJk0pOworYm9vbCBzdHJpcERlYnVnSW5mbyhGdW5jdGlvbiAmRik7CisKKy8vLyBEb3duZ3JhZGUgdGhlIGRlYnVnIGluZm8gaW4gYSBtb2R1bGUgdG8gY29udGFpbiBvbmx5IGxpbmUgdGFibGUgaW5mb3JtYXRpb24uCisvLy8KKy8vLyBJbiBvcmRlciB0byBjb252ZXJ0IGRlYnVnIGluZm8gdG8gd2hhdCAtZ2xpbmUtdGFibGVzLW9ubHkgd291bGQgaGF2ZQorLy8vIGNyZWF0ZWQsIHRoaXMgZG9lcyB0aGUgZm9sbG93aW5nOgorLy8vICAgMSkgRGVsZXRlIGFsbCBkZWJ1ZyBpbnRyaW5zaWNzLgorLy8vICAgMikgRGVsZXRlIGFsbCBub24tQ1UgbmFtZWQgbWV0YWRhdGEgZGVidWcgaW5mbyBub2Rlcy4KKy8vLyAgIDMpIENyZWF0ZSBuZXcgRGVidWdMb2NzIGZvciBlYWNoIGluc3RydWN0aW9uLgorLy8vICAgNCkgQ3JlYXRlIGEgbmV3IENVIGRlYnVnIGluZm8sIGFuZCBzaW1pbGFybHkgZm9yIGV2ZXJ5IG1ldGFkYXRhIG5vZGUKKy8vLyAgICAgIHRoYXQncyByZWFjaGFibGUgZnJvbSB0aGUgQ1UgZGVidWcgaW5mby4KKy8vLyAgIEFsbCBkZWJ1ZyB0eXBlIG1ldGFkYXRhIG5vZGVzIGFyZSB1bnJlYWNoYWJsZSBhbmQgZ2FyYmFnZSBjb2xsZWN0ZWQuCitib29sIHN0cmlwTm9uTGluZVRhYmxlRGVidWdJbmZvKE1vZHVsZSAmTSk7CisKKy8vLyBcYnJpZWYgUmV0dXJuIERlYnVnIEluZm8gTWV0YWRhdGEgVmVyc2lvbiBieSBjaGVja2luZyBtb2R1bGUgZmxhZ3MuCit1bnNpZ25lZCBnZXREZWJ1Z01ldGFkYXRhVmVyc2lvbkZyb21Nb2R1bGUoY29uc3QgTW9kdWxlICZNKTsKKworLy8vIFxicmllZiBVdGlsaXR5IHRvIGZpbmQgYWxsIGRlYnVnIGluZm8gaW4gYSBtb2R1bGUuCisvLy8KKy8vLyBEZWJ1Z0luZm9GaW5kZXIgdHJpZXMgdG8gbGlzdCBhbGwgZGVidWcgaW5mbyBNRE5vZGVzIHVzZWQgaW4gYSBtb2R1bGUuIFRvCisvLy8gbGlzdCBkZWJ1ZyBpbmZvIE1ETm9kZXMgdXNlZCBieSBhbiBpbnN0cnVjdGlvbiwgRGVidWdJbmZvRmluZGVyIHVzZXMKKy8vLyBwcm9jZXNzRGVjbGFyZSwgcHJvY2Vzc1ZhbHVlIGFuZCBwcm9jZXNzTG9jYXRpb24gdG8gaGFuZGxlIERiZ0RlY2xhcmVJbnN0LAorLy8vIERiZ1ZhbHVlSW5zdCBhbmQgRGJnTG9jIGF0dGFjaGVkIHRvIGluc3RydWN0aW9ucy4gcHJvY2Vzc01vZHVsZSB3aWxsIGdvCisvLy8gdGhyb3VnaCBhbGwgRElDb21waWxlVW5pdHMgaW4gbGx2bS5kYmcuY3UgYW5kIGxpc3QgZGVidWcgaW5mbyBNRE5vZGVzCisvLy8gdXNlZCBieSB0aGUgQ1VzLgorY2xhc3MgRGVidWdJbmZvRmluZGVyIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBQcm9jZXNzIGVudGlyZSBtb2R1bGUgYW5kIGNvbGxlY3QgZGVidWcgaW5mbyBhbmNob3JzLgorICB2b2lkIHByb2Nlc3NNb2R1bGUoY29uc3QgTW9kdWxlICZNKTsKKworICAvLy8gXGJyaWVmIFByb2Nlc3MgRGJnRGVjbGFyZUluc3QuCisgIHZvaWQgcHJvY2Vzc0RlY2xhcmUoY29uc3QgTW9kdWxlICZNLCBjb25zdCBEYmdEZWNsYXJlSW5zdCAqRERJKTsKKyAgLy8vIFxicmllZiBQcm9jZXNzIERiZ1ZhbHVlSW5zdC4KKyAgdm9pZCBwcm9jZXNzVmFsdWUoY29uc3QgTW9kdWxlICZNLCBjb25zdCBEYmdWYWx1ZUluc3QgKkRWSSk7CisgIC8vLyBcYnJpZWYgUHJvY2VzcyBkZWJ1ZyBpbmZvIGxvY2F0aW9uLgorICB2b2lkIHByb2Nlc3NMb2NhdGlvbihjb25zdCBNb2R1bGUgJk0sIGNvbnN0IERJTG9jYXRpb24gKkxvYyk7CisKKyAgLy8vIFxicmllZiBDbGVhciBhbGwgbGlzdHMuCisgIHZvaWQgcmVzZXQoKTsKKworcHJpdmF0ZToKKyAgdm9pZCBJbml0aWFsaXplVHlwZU1hcChjb25zdCBNb2R1bGUgJk0pOworCisgIHZvaWQgcHJvY2Vzc1R5cGUoRElUeXBlICpEVCk7CisgIHZvaWQgcHJvY2Vzc1N1YnByb2dyYW0oRElTdWJwcm9ncmFtICpTUCk7CisgIHZvaWQgcHJvY2Vzc1Njb3BlKERJU2NvcGUgKlNjb3BlKTsKKyAgYm9vbCBhZGRDb21waWxlVW5pdChESUNvbXBpbGVVbml0ICpDVSk7CisgIGJvb2wgYWRkR2xvYmFsVmFyaWFibGUoRElHbG9iYWxWYXJpYWJsZUV4cHJlc3Npb24gKkRJRyk7CisgIGJvb2wgYWRkU3VicHJvZ3JhbShESVN1YnByb2dyYW0gKlNQKTsKKyAgYm9vbCBhZGRUeXBlKERJVHlwZSAqRFQpOworICBib29sIGFkZFNjb3BlKERJU2NvcGUgKlNjb3BlKTsKKworcHVibGljOgorICB1c2luZyBjb21waWxlX3VuaXRfaXRlcmF0b3IgPQorICAgICAgU21hbGxWZWN0b3JJbXBsPERJQ29tcGlsZVVuaXQgKj46OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyBzdWJwcm9ncmFtX2l0ZXJhdG9yID0gU21hbGxWZWN0b3JJbXBsPERJU3VicHJvZ3JhbSAqPjo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIGdsb2JhbF92YXJpYWJsZV9leHByZXNzaW9uX2l0ZXJhdG9yID0KKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxESUdsb2JhbFZhcmlhYmxlRXhwcmVzc2lvbiAqPjo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIHR5cGVfaXRlcmF0b3IgPSBTbWFsbFZlY3RvckltcGw8RElUeXBlICo+Ojpjb25zdF9pdGVyYXRvcjsKKyAgdXNpbmcgc2NvcGVfaXRlcmF0b3IgPSBTbWFsbFZlY3RvckltcGw8RElTY29wZSAqPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgaXRlcmF0b3JfcmFuZ2U8Y29tcGlsZV91bml0X2l0ZXJhdG9yPiBjb21waWxlX3VuaXRzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKENVcy5iZWdpbigpLCBDVXMuZW5kKCkpOworICB9CisKKyAgaXRlcmF0b3JfcmFuZ2U8c3VicHJvZ3JhbV9pdGVyYXRvcj4gc3VicHJvZ3JhbXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoU1BzLmJlZ2luKCksIFNQcy5lbmQoKSk7CisgIH0KKworICBpdGVyYXRvcl9yYW5nZTxnbG9iYWxfdmFyaWFibGVfZXhwcmVzc2lvbl9pdGVyYXRvcj4gZ2xvYmFsX3ZhcmlhYmxlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShHVnMuYmVnaW4oKSwgR1ZzLmVuZCgpKTsKKyAgfQorCisgIGl0ZXJhdG9yX3JhbmdlPHR5cGVfaXRlcmF0b3I+IHR5cGVzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKFRZcy5iZWdpbigpLCBUWXMuZW5kKCkpOworICB9CisKKyAgaXRlcmF0b3JfcmFuZ2U8c2NvcGVfaXRlcmF0b3I+IHNjb3BlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShTY29wZXMuYmVnaW4oKSwgU2NvcGVzLmVuZCgpKTsKKyAgfQorCisgIHVuc2lnbmVkIGNvbXBpbGVfdW5pdF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIENVcy5zaXplKCk7IH0KKyAgdW5zaWduZWQgZ2xvYmFsX3ZhcmlhYmxlX2NvdW50KCkgY29uc3QgeyByZXR1cm4gR1ZzLnNpemUoKTsgfQorICB1bnNpZ25lZCBzdWJwcm9ncmFtX2NvdW50KCkgY29uc3QgeyByZXR1cm4gU1BzLnNpemUoKTsgfQorICB1bnNpZ25lZCB0eXBlX2NvdW50KCkgY29uc3QgeyByZXR1cm4gVFlzLnNpemUoKTsgfQorICB1bnNpZ25lZCBzY29wZV9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIFNjb3Blcy5zaXplKCk7IH0KKworcHJpdmF0ZToKKyAgU21hbGxWZWN0b3I8RElDb21waWxlVW5pdCAqLCA4PiBDVXM7CisgIFNtYWxsVmVjdG9yPERJU3VicHJvZ3JhbSAqLCA4PiBTUHM7CisgIFNtYWxsVmVjdG9yPERJR2xvYmFsVmFyaWFibGVFeHByZXNzaW9uICosIDg+IEdWczsKKyAgU21hbGxWZWN0b3I8RElUeXBlICosIDg+IFRZczsKKyAgU21hbGxWZWN0b3I8RElTY29wZSAqLCA4PiBTY29wZXM7CisgIFNtYWxsUHRyU2V0PGNvbnN0IE1ETm9kZSAqLCAzMj4gTm9kZXNTZWVuOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfREVCVUdJTkZPX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRGVidWdJbmZvRmxhZ3MuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EZWJ1Z0luZm9GbGFncy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc2Yjk3OAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRGVidWdJbmZvRmxhZ3MuZGVmCkBAIC0wLDAgKzEsNjIgQEAKKy8vPT09LSBsbHZtL0lSL0RlYnVnSW5mb0ZsYWdzLmRlZiAtIERlYnVnIGluZm8gZmxhZyBkZWZpbml0aW9ucyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTWFjcm9zIGZvciBydW5uaW5nIHRocm91Z2ggZGVidWcgaW5mbyBmbGFncy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBUT0RPOiBBZGQgb3RoZXIgRFctYmFzZWQgbWFjcm9zLgorI2lmbmRlZiBIQU5ETEVfRElfRkxBRworI2Vycm9yICJNaXNzaW5nIG1hY3JvIGRlZmluaXRpb24gb2YgSEFORExFX0RJX0ZMQUciCisjZW5kaWYKKworSEFORExFX0RJX0ZMQUcoMCwgWmVybykgLy8gVXNlIGl0IGFzIHplcm8gdmFsdWUuCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3IgZXhhbXBsZTogdm9pZCBmb28oRElGbGFncyBGbGFncyA9IEZsYWdaZXJvKS4KK0hBTkRMRV9ESV9GTEFHKDEsIFByaXZhdGUpCitIQU5ETEVfRElfRkxBRygyLCBQcm90ZWN0ZWQpCitIQU5ETEVfRElfRkxBRygzLCBQdWJsaWMpCitIQU5ETEVfRElfRkxBRygoMSA8PCAyKSwgRndkRGVjbCkKK0hBTkRMRV9ESV9GTEFHKCgxIDw8IDMpLCBBcHBsZUJsb2NrKQorSEFORExFX0RJX0ZMQUcoKDEgPDwgNCksIEJsb2NrQnlyZWZTdHJ1Y3QpCitIQU5ETEVfRElfRkxBRygoMSA8PCA1KSwgVmlydHVhbCkKK0hBTkRMRV9ESV9GTEFHKCgxIDw8IDYpLCBBcnRpZmljaWFsKQorSEFORExFX0RJX0ZMQUcoKDEgPDwgNyksIEV4cGxpY2l0KQorSEFORExFX0RJX0ZMQUcoKDEgPDwgOCksIFByb3RvdHlwZWQpCitIQU5ETEVfRElfRkxBRygoMSA8PCA5KSwgT2JqY0NsYXNzQ29tcGxldGUpCitIQU5ETEVfRElfRkxBRygoMSA8PCAxMCksIE9iamVjdFBvaW50ZXIpCitIQU5ETEVfRElfRkxBRygoMSA8PCAxMSksIFZlY3RvcikKK0hBTkRMRV9ESV9GTEFHKCgxIDw8IDEyKSwgU3RhdGljTWVtYmVyKQorSEFORExFX0RJX0ZMQUcoKDEgPDwgMTMpLCBMVmFsdWVSZWZlcmVuY2UpCitIQU5ETEVfRElfRkxBRygoMSA8PCAxNCksIFJWYWx1ZVJlZmVyZW5jZSkKKy8vIDE1IHdhcyBmb3JtZXJseSBFeHRlcm5hbFR5cGVSZWYsIGJ1dCB0aGlzIHdhcyBuZXZlciB1c2VkLgorSEFORExFX0RJX0ZMQUcoKDEgPDwgMTUpLCBSZXNlcnZlZCkKK0hBTkRMRV9ESV9GTEFHKCgxIDw8IDE2KSwgU2luZ2xlSW5oZXJpdGFuY2UpCitIQU5ETEVfRElfRkxBRygoMiA8PCAxNiksIE11bHRpcGxlSW5oZXJpdGFuY2UpCitIQU5ETEVfRElfRkxBRygoMyA8PCAxNiksIFZpcnR1YWxJbmhlcml0YW5jZSkKK0hBTkRMRV9ESV9GTEFHKCgxIDw8IDE4KSwgSW50cm9kdWNlZFZpcnR1YWwpCitIQU5ETEVfRElfRkxBRygoMSA8PCAxOSksIEJpdEZpZWxkKQorSEFORExFX0RJX0ZMQUcoKDEgPDwgMjApLCBOb1JldHVybikKK0hBTkRMRV9ESV9GTEFHKCgxIDw8IDIxKSwgTWFpblN1YnByb2dyYW0pCitIQU5ETEVfRElfRkxBRygoMSA8PCAyMiksIFR5cGVQYXNzQnlWYWx1ZSkKK0hBTkRMRV9ESV9GTEFHKCgxIDw8IDIzKSwgVHlwZVBhc3NCeVJlZmVyZW5jZSkKK0hBTkRMRV9ESV9GTEFHKCgxIDw8IDI0KSwgRml4ZWRFbnVtKQorCisvLyBUbyBhdm9pZCBuZWVkaW5nIGEgZGVkaWNhdGVkIHZhbHVlIGZvciBJbmRpcmVjdFZpcnR1YWxCYXNlLCB3ZSB1c2UKKy8vIHRoZSBiaXR3aXNlIG9yIG9mIFZpcnR1YWwgYW5kIEZ3ZERlY2wsIHdoaWNoIGRvZXMgbm90IG90aGVyd2lzZQorLy8gbWFrZSBzZW5zZSBmb3IgaW5oZXJpdGFuY2UuCitIQU5ETEVfRElfRkxBRygoMSA8PCAyKSB8ICgxIDw8IDUpLCBJbmRpcmVjdFZpcnR1YWxCYXNlKQorCisjaWZkZWYgRElfRkxBR19MQVJHRVNUX05FRURFRAorLy8gaW50ZW5kZWQgdG8gYmUgdXNlZCB3aXRoIEFEVC9CaXRtYXNrRW51bS5oCisvLyBOT1RFOiBhbHdheXMgbXVzdCBiZSBlcXVhbCB0byBsYXJnZXN0IGZsYWcsIGNoZWNrIHRoaXMgd2hlbiBhZGRpbmcgbmV3IGZsYWcKK0hBTkRMRV9ESV9GTEFHKCgxIDw8IDI0KSwgTGFyZ2VzdCkKKyN1bmRlZiBESV9GTEFHX0xBUkdFU1RfTkVFREVECisjZW5kaWYKKworI3VuZGVmIEhBTkRMRV9ESV9GTEFHCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RlYnVnSW5mb01ldGFkYXRhLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RlYnVnSW5mb01ldGFkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTIyMTBiYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRGVidWdJbmZvTWV0YWRhdGEuaApAQCAtMCwwICsxLDI5NjEgQEAKKy8vPT09LSBsbHZtL0lSL0RlYnVnSW5mb01ldGFkYXRhLmggLSBEZWJ1ZyBpbmZvIG1ldGFkYXRhIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGVjbGFyYXRpb25zIGZvciBtZXRhZGF0YSBzcGVjaWZpYyB0byBkZWJ1ZyBpbmZvLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9ERUJVR0lORk9NRVRBREFUQV9ICisjZGVmaW5lIExMVk1fSVJfREVCVUdJTkZPTUVUQURBVEFfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRtYXNrRW51bS5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJVbmlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9NZXRhZGF0YS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIEhlbHBlciBtYWNyb3MgZm9yIGRlZmluaW5nIGdldCgpIG92ZXJyaWRlcy4KKyNkZWZpbmUgREVGSU5FX01ETk9ERV9HRVRfVU5QQUNLX0lNUEwoLi4uKSBfX1ZBX0FSR1NfXworI2RlZmluZSBERUZJTkVfTUROT0RFX0dFVF9VTlBBQ0soQVJHUykgREVGSU5FX01ETk9ERV9HRVRfVU5QQUNLX0lNUEwgQVJHUworI2RlZmluZSBERUZJTkVfTUROT0RFX0dFVF9ESVNUSU5DVF9URU1QT1JBUlkoQ0xBU1MsIEZPUk1BTCwgQVJHUykgICAgICAgICAgICAgIFwKKyAgc3RhdGljIENMQVNTICpnZXREaXN0aW5jdChMTFZNQ29udGV4dCAmQ29udGV4dCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGSU5FX01ETk9ERV9HRVRfVU5QQUNLKEZPUk1BTCkpIHsgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBnZXRJbXBsKENvbnRleHQsIERFRklORV9NRE5PREVfR0VUX1VOUEFDSyhBUkdTKSwgRGlzdGluY3QpOyAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBUZW1wIyNDTEFTUyBnZXRUZW1wb3JhcnkoTExWTUNvbnRleHQgJkNvbnRleHQsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFRklORV9NRE5PREVfR0VUX1VOUEFDSyhGT1JNQUwpKSB7ICAgICAgICAgIFwKKyAgICByZXR1cm4gVGVtcCMjQ0xBU1MoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGdldEltcGwoQ29udGV4dCwgREVGSU5FX01ETk9ERV9HRVRfVU5QQUNLKEFSR1MpLCBUZW1wb3JhcnkpKTsgICAgICAgICAgXAorICB9CisjZGVmaW5lIERFRklORV9NRE5PREVfR0VUKENMQVNTLCBGT1JNQUwsIEFSR1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgQ0xBU1MgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCwgREVGSU5FX01ETk9ERV9HRVRfVU5QQUNLKEZPUk1BTCkpIHsgIFwKKyAgICByZXR1cm4gZ2V0SW1wbChDb250ZXh0LCBERUZJTkVfTUROT0RFX0dFVF9VTlBBQ0soQVJHUyksIFVuaXF1ZWQpOyAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgQ0xBU1MgKmdldElmRXhpc3RzKExMVk1Db250ZXh0ICZDb250ZXh0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBERUZJTkVfTUROT0RFX0dFVF9VTlBBQ0soRk9STUFMKSkgeyAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIGdldEltcGwoQ29udGV4dCwgREVGSU5FX01ETk9ERV9HRVRfVU5QQUNLKEFSR1MpLCBVbmlxdWVkLCAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgIC8qIFNob3VsZENyZWF0ZSAqLyBmYWxzZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIERFRklORV9NRE5PREVfR0VUX0RJU1RJTkNUX1RFTVBPUkFSWShDTEFTUywgRk9STUFMLCBBUkdTKQorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBIb2xkcyBhIHN1YmNsYXNzIG9mIERJTm9kZS4KKy8vLworLy8vIEZJWE1FOiBUaGlzIGNsYXNzIGRvZXNuJ3QgY3VycmVudGx5IG1ha2UgbXVjaCBzZW5zZS4gIFByZXZpb3VzbHkgaXQgd2FzIGEKKy8vLyB1bmlvbiBiZXRlZW4gTURTdHJpbmcgKGZvciBPRFItdW5pcXVlZCB0eXBlcykgYW5kIHRoaW5ncyBsaWtlIERJVHlwZS4gIFRvCisvLy8gc3VwcG9ydCBDb2RlVmlldyB3b3JrLCBpdCB3YXNuJ3QgZGVsZXRlZCBvdXRyaWdodCB3aGVuIE1EU3RyaW5nLWJhc2VkIHR5cGUKKy8vLyByZWZlcmVuY2VzIHdlcmUgZGVsZXRlZDsgd2UnbGwgc29vbiBuZWVkIGEgc2ltaWxhciBjb25jZXB0IGZvciBDb2RlVmlldworLy8vIERJVHlwZUluZGV4LgordGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIFR5cGVkRElOb2RlUmVmIHsKKyAgY29uc3QgTWV0YWRhdGEgKk1EID0gbnVsbHB0cjsKKworcHVibGljOgorICBUeXBlZERJTm9kZVJlZigpID0gZGVmYXVsdDsKKyAgVHlwZWRESU5vZGVSZWYoc3RkOjpudWxscHRyX3QpIHt9CisgIFR5cGVkRElOb2RlUmVmKGNvbnN0IFQgKk1EKSA6IE1EKE1EKSB7fQorCisgIGV4cGxpY2l0IFR5cGVkRElOb2RlUmVmKGNvbnN0IE1ldGFkYXRhICpNRCkgOiBNRChNRCkgeworICAgIGFzc2VydCgoIU1EIHx8IGlzYTxUPihNRCkpICYmICJFeHBlY3RlZCB2YWxpZCB0eXBlIHJlZiIpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFU+CisgIFR5cGVkRElOb2RlUmVmKAorICAgICAgY29uc3QgVHlwZWRESU5vZGVSZWY8VT4gJlgsCisgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2NvbnZlcnRpYmxlPFUgKiwgVCAqPjo6dmFsdWU+Ojp0eXBlICogPQorICAgICAgICAgIG51bGxwdHIpCisgICAgICA6IE1EKFgpIHt9CisKKyAgb3BlcmF0b3IgTWV0YWRhdGEgKigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2Nhc3Q8TWV0YWRhdGEgKj4oTUQpOyB9CisKKyAgVCAqcmVzb2x2ZSgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2Nhc3Q8VCAqPihjYXN0X29yX251bGw8VD4oTUQpKTsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBUeXBlZERJTm9kZVJlZjxUPiAmWCkgY29uc3QgeyByZXR1cm4gTUQgPT0gWC5NRDsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgVHlwZWRESU5vZGVSZWY8VD4gJlgpIGNvbnN0IHsgcmV0dXJuIE1EICE9IFguTUQ7IH0KK307CisKK3VzaW5nIERJTm9kZVJlZiA9IFR5cGVkRElOb2RlUmVmPERJTm9kZT47Cit1c2luZyBESVNjb3BlUmVmID0gVHlwZWRESU5vZGVSZWY8RElTY29wZT47Cit1c2luZyBESVR5cGVSZWYgPSBUeXBlZERJTm9kZVJlZjxESVR5cGU+OworCitjbGFzcyBESVR5cGVSZWZBcnJheSB7CisgIGNvbnN0IE1EVHVwbGUgKk4gPSBudWxscHRyOworCitwdWJsaWM6CisgIERJVHlwZVJlZkFycmF5KCkgPSBkZWZhdWx0OworICBESVR5cGVSZWZBcnJheShjb25zdCBNRFR1cGxlICpOKSA6IE4oTikge30KKworICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gZ2V0KCk7IH0KKyAgZXhwbGljaXQgb3BlcmF0b3IgTURUdXBsZSAqKCkgY29uc3QgeyByZXR1cm4gZ2V0KCk7IH0KKworICBNRFR1cGxlICpnZXQoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PE1EVHVwbGUgKj4oTik7IH0KKyAgTURUdXBsZSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIGdldCgpOyB9CisgIE1EVHVwbGUgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpnZXQoKTsgfQorCisgIC8vIEZJWE1FOiBGaXggY2FsbGVycyBhbmQgcmVtb3ZlIGNvbmRpdGlvbiBvbiBOLgorICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gTiA/IE4tPmdldE51bU9wZXJhbmRzKCkgOiAwdTsgfQorICBESVR5cGVSZWYgb3BlcmF0b3JbXSh1bnNpZ25lZCBJKSBjb25zdCB7IHJldHVybiBESVR5cGVSZWYoTi0+Z2V0T3BlcmFuZChJKSk7IH0KKworICBjbGFzcyBpdGVyYXRvciA6IHN0ZDo6aXRlcmF0b3I8c3RkOjppbnB1dF9pdGVyYXRvcl90YWcsIERJVHlwZVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cHRyZGlmZl90LCB2b2lkLCBESVR5cGVSZWY+IHsKKyAgICBNRE5vZGU6Om9wX2l0ZXJhdG9yIEkgPSBudWxscHRyOworCisgIHB1YmxpYzoKKyAgICBpdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgICBleHBsaWNpdCBpdGVyYXRvcihNRE5vZGU6Om9wX2l0ZXJhdG9yIEkpIDogSShJKSB7fQorCisgICAgRElUeXBlUmVmIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIERJVHlwZVJlZigqSSk7IH0KKworICAgIGl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgICAgKytJOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7CisgICAgICBpdGVyYXRvciBUZW1wKCp0aGlzKTsKKyAgICAgICsrSTsKKyAgICAgIHJldHVybiBUZW1wOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciAmWCkgY29uc3QgeyByZXR1cm4gSSA9PSBYLkk7IH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3IgJlgpIGNvbnN0IHsgcmV0dXJuIEkgIT0gWC5JOyB9CisgIH07CisKKyAgLy8gRklYTUU6IEZpeCBjYWxsZXJzIGFuZCByZW1vdmUgY29uZGl0aW9uIG9uIE4uCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gTiA/IGl0ZXJhdG9yKE4tPm9wX2JlZ2luKCkpIDogaXRlcmF0b3IoKTsgfQorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBOID8gaXRlcmF0b3IoTi0+b3BfZW5kKCkpIDogaXRlcmF0b3IoKTsgfQorfTsKKworLy8vIFRhZ2dlZCBEV0FSRi1saWtlIG1ldGFkYXRhIG5vZGUuCisvLy8KKy8vLyBBIG1ldGFkYXRhIG5vZGUgd2l0aCBhIERXQVJGIHRhZyAoaS5lLiwgYSBjb25zdGFudCBuYW1lZCBcYyBEV19UQUdfKiwKKy8vLyBkZWZpbmVkIGluIGxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmgpLiAgQ2FsbGVkIFxhIERJTm9kZSBiZWNhdXNlIGl0J3MKKy8vLyBwb3RlbnRpYWxseSB1c2VkIGZvciBub24tRFdBUkYgb3V0cHV0LgorY2xhc3MgRElOb2RlIDogcHVibGljIE1ETm9kZSB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBNRE5vZGU7CisKK3Byb3RlY3RlZDoKKyAgRElOb2RlKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBJRCwgU3RvcmFnZVR5cGUgU3RvcmFnZSwgdW5zaWduZWQgVGFnLAorICAgICAgICAgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzMSwgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzMiA9IE5vbmUpCisgICAgICA6IE1ETm9kZShDLCBJRCwgU3RvcmFnZSwgT3BzMSwgT3BzMikgeworICAgIGFzc2VydChUYWcgPCAxdSA8PCAxNik7CisgICAgU3ViY2xhc3NEYXRhMTYgPSBUYWc7CisgIH0KKyAgfkRJTm9kZSgpID0gZGVmYXVsdDsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVHk+IFR5ICpnZXRPcGVyYW5kQXModW5zaWduZWQgSSkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8VHk+KGdldE9wZXJhbmQoSSkpOworICB9CisKKyAgU3RyaW5nUmVmIGdldFN0cmluZ09wZXJhbmQodW5zaWduZWQgSSkgY29uc3QgeworICAgIGlmIChhdXRvICpTID0gZ2V0T3BlcmFuZEFzPE1EU3RyaW5nPihJKSkKKyAgICAgIHJldHVybiBTLT5nZXRTdHJpbmcoKTsKKyAgICByZXR1cm4gU3RyaW5nUmVmKCk7CisgIH0KKworICBzdGF0aWMgTURTdHJpbmcgKmdldENhbm9uaWNhbE1EU3RyaW5nKExMVk1Db250ZXh0ICZDb250ZXh0LCBTdHJpbmdSZWYgUykgeworICAgIGlmIChTLmVtcHR5KCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gTURTdHJpbmc6OmdldChDb250ZXh0LCBTKTsKKyAgfQorCisgIC8vLyBBbGxvdyBzdWJjbGFzc2VzIHRvIG11dGF0ZSB0aGUgdGFnLgorICB2b2lkIHNldFRhZyh1bnNpZ25lZCBUYWcpIHsgU3ViY2xhc3NEYXRhMTYgPSBUYWc7IH0KKworcHVibGljOgorICB1bnNpZ25lZCBnZXRUYWcoKSBjb25zdCB7IHJldHVybiBTdWJjbGFzc0RhdGExNjsgfQorCisgIC8vLyBEZWJ1ZyBpbmZvIGZsYWdzLgorICAvLy8KKyAgLy8vIFRoZSB0aHJlZSBhY2Nlc3NpYmlsaXR5IGZsYWdzIGFyZSBtdXR1YWxseSBleGNsdXNpdmUgYW5kIHJvbGxlZCB0b2dldGhlcgorICAvLy8gaW4gdGhlIGZpcnN0IHR3byBiaXRzLgorICBlbnVtIERJRmxhZ3MgOiB1aW50MzJfdCB7CisjZGVmaW5lIEhBTkRMRV9ESV9GTEFHKElELCBOQU1FKSBGbGFnIyNOQU1FID0gSUQsCisjZGVmaW5lIERJX0ZMQUdfTEFSR0VTVF9ORUVERUQKKyNpbmNsdWRlICJsbHZtL0lSL0RlYnVnSW5mb0ZsYWdzLmRlZiIKKyAgICBGbGFnQWNjZXNzaWJpbGl0eSA9IEZsYWdQcml2YXRlIHwgRmxhZ1Byb3RlY3RlZCB8IEZsYWdQdWJsaWMsCisgICAgRmxhZ1B0clRvTWVtYmVyUmVwID0gRmxhZ1NpbmdsZUluaGVyaXRhbmNlIHwgRmxhZ011bHRpcGxlSW5oZXJpdGFuY2UgfAorICAgICAgICAgICAgICAgICAgICAgICAgIEZsYWdWaXJ0dWFsSW5oZXJpdGFuY2UsCisgICAgTExWTV9NQVJLX0FTX0JJVE1BU0tfRU5VTShGbGFnTGFyZ2VzdCkKKyAgfTsKKworICBzdGF0aWMgRElGbGFncyBnZXRGbGFnKFN0cmluZ1JlZiBGbGFnKTsKKyAgc3RhdGljIFN0cmluZ1JlZiBnZXRGbGFnU3RyaW5nKERJRmxhZ3MgRmxhZyk7CisKKyAgLy8vIFNwbGl0IHVwIGEgZmxhZ3MgYml0ZmllbGQuCisgIC8vLworICAvLy8gU3BsaXQgXGMgRmxhZ3MgaW50byBcYyBTcGxpdEZsYWdzLCBhIHZlY3RvciBvZiBpdHMgY29tcG9uZW50cy4gIFJldHVybnMKKyAgLy8vIGFueSByZW1haW5pbmcgKHVucmVjb2duaXplZCkgYml0cy4KKyAgc3RhdGljIERJRmxhZ3Mgc3BsaXRGbGFncyhESUZsYWdzIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxESUZsYWdzPiAmU3BsaXRGbGFncyk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICBzd2l0Y2ggKE1ELT5nZXRNZXRhZGF0YUlEKCkpIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgR2VuZXJpY0RJTm9kZUtpbmQ6CisgICAgY2FzZSBESVN1YnJhbmdlS2luZDoKKyAgICBjYXNlIERJRW51bWVyYXRvcktpbmQ6CisgICAgY2FzZSBESUJhc2ljVHlwZUtpbmQ6CisgICAgY2FzZSBESURlcml2ZWRUeXBlS2luZDoKKyAgICBjYXNlIERJQ29tcG9zaXRlVHlwZUtpbmQ6CisgICAgY2FzZSBESVN1YnJvdXRpbmVUeXBlS2luZDoKKyAgICBjYXNlIERJRmlsZUtpbmQ6CisgICAgY2FzZSBESUNvbXBpbGVVbml0S2luZDoKKyAgICBjYXNlIERJU3VicHJvZ3JhbUtpbmQ6CisgICAgY2FzZSBESUxleGljYWxCbG9ja0tpbmQ6CisgICAgY2FzZSBESUxleGljYWxCbG9ja0ZpbGVLaW5kOgorICAgIGNhc2UgRElOYW1lc3BhY2VLaW5kOgorICAgIGNhc2UgRElUZW1wbGF0ZVR5cGVQYXJhbWV0ZXJLaW5kOgorICAgIGNhc2UgRElUZW1wbGF0ZVZhbHVlUGFyYW1ldGVyS2luZDoKKyAgICBjYXNlIERJR2xvYmFsVmFyaWFibGVLaW5kOgorICAgIGNhc2UgRElMb2NhbFZhcmlhYmxlS2luZDoKKyAgICBjYXNlIERJT2JqQ1Byb3BlcnR5S2luZDoKKyAgICBjYXNlIERJSW1wb3J0ZWRFbnRpdHlLaW5kOgorICAgIGNhc2UgRElNb2R1bGVLaW5kOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8Y29uc3QgVHlwZWRESU5vZGVSZWY8VD4+IHsKKyAgdXNpbmcgU2ltcGxlVHlwZSA9IE1ldGFkYXRhICo7CisKKyAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKGNvbnN0IFR5cGVkRElOb2RlUmVmPFQ+ICZNRCkgeworICAgIHJldHVybiBNRDsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxUeXBlZERJTm9kZVJlZjxUPj4KKyAgICA6IHNpbXBsaWZ5X3R5cGU8Y29uc3QgVHlwZWRESU5vZGVSZWY8VD4+IHt9OworCisvLy8gR2VuZXJpYyB0YWdnZWQgRFdBUkYtbGlrZSBtZXRhZGF0YSBub2RlLgorLy8vCisvLy8gQW4gdW4tc3BlY2lhbGl6ZWQgRFdBUkYtbGlrZSBtZXRhZGF0YSBub2RlLiAgVGhlIGZpcnN0IG9wZXJhbmQgaXMgYQorLy8vIChwb3NzaWJseSBlbXB0eSkgbnVsbC1zZXBhcmF0ZWQgXGEgTURTdHJpbmcgaGVhZGVyIHRoYXQgY29udGFpbnMgYXJiaXRyYXJ5CisvLy8gZmllbGRzLiAgVGhlIHJlbWFpbmluZyBvcGVyYW5kcyBhcmUgXGEgZHdhcmZfb3BlcmFuZHMoKSwgYW5kIGFyZSBwb2ludGVycworLy8vIHRvIG90aGVyIG1ldGFkYXRhLgorY2xhc3MgR2VuZXJpY0RJTm9kZSA6IHB1YmxpYyBESU5vZGUgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCisgIEdlbmVyaWNESU5vZGUoTExWTUNvbnRleHQgJkMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIHVuc2lnbmVkIEhhc2gsCisgICAgICAgICAgICAgICAgdW5zaWduZWQgVGFnLCBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMxLAorICAgICAgICAgICAgICAgIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wczIpCisgICAgICA6IERJTm9kZShDLCBHZW5lcmljRElOb2RlS2luZCwgU3RvcmFnZSwgVGFnLCBPcHMxLCBPcHMyKSB7CisgICAgc2V0SGFzaChIYXNoKTsKKyAgfQorICB+R2VuZXJpY0RJTm9kZSgpIHsgZHJvcEFsbFJlZmVyZW5jZXMoKTsgfQorCisgIHZvaWQgc2V0SGFzaCh1bnNpZ25lZCBIYXNoKSB7IFN1YmNsYXNzRGF0YTMyID0gSGFzaDsgfQorICB2b2lkIHJlY2FsY3VsYXRlSGFzaCgpOworCisgIHN0YXRpYyBHZW5lcmljRElOb2RlICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCB1bnNpZ25lZCBUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBIZWFkZXIsIEFycmF5UmVmPE1ldGFkYXRhICo+IER3YXJmT3BzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVHlwZSBTdG9yYWdlLCBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpIHsKKyAgICByZXR1cm4gZ2V0SW1wbChDb250ZXh0LCBUYWcsIGdldENhbm9uaWNhbE1EU3RyaW5nKENvbnRleHQsIEhlYWRlciksCisgICAgICAgICAgICAgICAgICAgRHdhcmZPcHMsIFN0b3JhZ2UsIFNob3VsZENyZWF0ZSk7CisgIH0KKworICBzdGF0aWMgR2VuZXJpY0RJTm9kZSAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgdW5zaWduZWQgVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRFN0cmluZyAqSGVhZGVyLCBBcnJheVJlZjxNZXRhZGF0YSAqPiBEd2FyZk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wR2VuZXJpY0RJTm9kZSBjbG9uZUltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeSgKKyAgICAgICAgZ2V0Q29udGV4dCgpLCBnZXRUYWcoKSwgZ2V0SGVhZGVyKCksCisgICAgICAgIFNtYWxsVmVjdG9yPE1ldGFkYXRhICosIDQ+KGR3YXJmX29wX2JlZ2luKCksIGR3YXJmX29wX2VuZCgpKSk7CisgIH0KKworcHVibGljOgorICB1bnNpZ25lZCBnZXRIYXNoKCkgY29uc3QgeyByZXR1cm4gU3ViY2xhc3NEYXRhMzI7IH0KKworICBERUZJTkVfTUROT0RFX0dFVChHZW5lcmljRElOb2RlLCAodW5zaWduZWQgVGFnLCBTdHJpbmdSZWYgSGVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8TWV0YWRhdGEgKj4gRHdhcmZPcHMpLAorICAgICAgICAgICAgICAgICAgICAoVGFnLCBIZWFkZXIsIER3YXJmT3BzKSkKKyAgREVGSU5FX01ETk9ERV9HRVQoR2VuZXJpY0RJTm9kZSwgKHVuc2lnbmVkIFRhZywgTURTdHJpbmcgKkhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE1ldGFkYXRhICo+IER3YXJmT3BzKSwKKyAgICAgICAgICAgICAgICAgICAgKFRhZywgSGVhZGVyLCBEd2FyZk9wcykpCisKKyAgLy8vIFJldHVybiBhICh0ZW1wb3JhcnkpIGNsb25lIG9mIHRoaXMuCisgIFRlbXBHZW5lcmljRElOb2RlIGNsb25lKCkgY29uc3QgeyByZXR1cm4gY2xvbmVJbXBsKCk7IH0KKworICB1bnNpZ25lZCBnZXRUYWcoKSBjb25zdCB7IHJldHVybiBTdWJjbGFzc0RhdGExNjsgfQorICBTdHJpbmdSZWYgZ2V0SGVhZGVyKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RyaW5nT3BlcmFuZCgwKTsgfQorICBNRFN0cmluZyAqZ2V0UmF3SGVhZGVyKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZEFzPE1EU3RyaW5nPigwKTsgfQorCisgIG9wX2l0ZXJhdG9yIGR3YXJmX29wX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gb3BfYmVnaW4oKSArIDE7IH0KKyAgb3BfaXRlcmF0b3IgZHdhcmZfb3BfZW5kKCkgY29uc3QgeyByZXR1cm4gb3BfZW5kKCk7IH0KKyAgb3BfcmFuZ2UgZHdhcmZfb3BlcmFuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG9wX3JhbmdlKGR3YXJmX29wX2JlZ2luKCksIGR3YXJmX29wX2VuZCgpKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bUR3YXJmT3BlcmFuZHMoKSBjb25zdCB7IHJldHVybiBnZXROdW1PcGVyYW5kcygpIC0gMTsgfQorICBjb25zdCBNRE9wZXJhbmQgJmdldER3YXJmT3BlcmFuZCh1bnNpZ25lZCBJKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wZXJhbmQoSSArIDEpOworICB9CisgIHZvaWQgcmVwbGFjZUR3YXJmT3BlcmFuZFdpdGgodW5zaWduZWQgSSwgTWV0YWRhdGEgKk5ldykgeworICAgIHJlcGxhY2VPcGVyYW5kV2l0aChJICsgMSwgTmV3KTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gR2VuZXJpY0RJTm9kZUtpbmQ7CisgIH0KK307CisKKy8vLyBBcnJheSBzdWJyYW5nZS4KKy8vLworLy8vIFRPRE86IE1lcmdlIGludG8gbm9kZSBmb3IgRFdfVEFHX2FycmF5X3R5cGUsIHdoaWNoIHNob3VsZCBoYXZlIGEgY3VzdG9tCisvLy8gdHlwZS4KK2NsYXNzIERJU3VicmFuZ2UgOiBwdWJsaWMgRElOb2RlIHsKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIE1ETm9kZTsKKworICBpbnQ2NF90IExvd2VyQm91bmQ7CisKKyAgRElTdWJyYW5nZShMTFZNQ29udGV4dCAmQywgU3RvcmFnZVR5cGUgU3RvcmFnZSwgTWV0YWRhdGEgKk5vZGUsCisgICAgICAgICAgICAgaW50NjRfdCBMb3dlckJvdW5kLCBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMpCisgICAgICA6IERJTm9kZShDLCBESVN1YnJhbmdlS2luZCwgU3RvcmFnZSwgZHdhcmY6OkRXX1RBR19zdWJyYW5nZV90eXBlLCBPcHMpLAorICAgICAgICBMb3dlckJvdW5kKExvd2VyQm91bmQpIHt9CisKKyAgfkRJU3VicmFuZ2UoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIERJU3VicmFuZ2UgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIGludDY0X3QgQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgTG93ZXJCb3VuZCwgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBzdGF0aWMgRElTdWJyYW5nZSAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgTWV0YWRhdGEgKkNvdW50Tm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBMb3dlckJvdW5kLCBTdG9yYWdlVHlwZSBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpOworCisgIFRlbXBESVN1YnJhbmdlIGNsb25lSW1wbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGVtcG9yYXJ5KGdldENvbnRleHQoKSwgZ2V0UmF3Q291bnROb2RlKCksIGdldExvd2VyQm91bmQoKSk7CisgIH0KKworcHVibGljOgorICBERUZJTkVfTUROT0RFX0dFVChESVN1YnJhbmdlLCAoaW50NjRfdCBDb3VudCwgaW50NjRfdCBMb3dlckJvdW5kID0gMCksCisgICAgICAgICAgICAgICAgICAgIChDb3VudCwgTG93ZXJCb3VuZCkpCisKKyAgREVGSU5FX01ETk9ERV9HRVQoRElTdWJyYW5nZSwgKE1ldGFkYXRhICpDb3VudE5vZGUsIGludDY0X3QgTG93ZXJCb3VuZCA9IDApLAorICAgICAgICAgICAgICAgICAgICAoQ291bnROb2RlLCBMb3dlckJvdW5kKSkKKworICBUZW1wRElTdWJyYW5nZSBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIGNsb25lSW1wbCgpOyB9CisKKyAgaW50NjRfdCBnZXRMb3dlckJvdW5kKCkgY29uc3QgeyByZXR1cm4gTG93ZXJCb3VuZDsgfQorCisgIE1ldGFkYXRhICpnZXRSYXdDb3VudE5vZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wZXJhbmQoMCkuZ2V0KCk7CisgIH0KKworICB0eXBlZGVmIFBvaW50ZXJVbmlvbjxDb25zdGFudEludCosIERJVmFyaWFibGUqPiBDb3VudFR5cGU7CisKKyAgQ291bnRUeXBlIGdldENvdW50KCkgY29uc3QgeworICAgIGlmIChhdXRvICpNRCA9IGR5bl9jYXN0PENvbnN0YW50QXNNZXRhZGF0YT4oZ2V0UmF3Q291bnROb2RlKCkpKQorICAgICAgcmV0dXJuIENvdW50VHlwZShjYXN0PENvbnN0YW50SW50PihNRC0+Z2V0VmFsdWUoKSkpOworCisgICAgaWYgKGF1dG8gKkRWID0gZHluX2Nhc3Q8RElWYXJpYWJsZT4oZ2V0UmF3Q291bnROb2RlKCkpKQorICAgICAgcmV0dXJuIENvdW50VHlwZShEVik7CisKKyAgICByZXR1cm4gQ291bnRUeXBlKCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJU3VicmFuZ2VLaW5kOworICB9Cit9OworCisvLy8gRW51bWVyYXRpb24gdmFsdWUuCisvLy8KKy8vLyBUT0RPOiBBZGQgYSBwb2ludGVyIHRvIHRoZSBjb250ZXh0IChEV19UQUdfZW51bWVyYXRpb25fdHlwZSkgb25jZSB0aGF0IG5vCisvLy8gbG9uZ2VyIGNyZWF0ZXMgYSB0eXBlIGN5Y2xlLgorY2xhc3MgRElFbnVtZXJhdG9yIDogcHVibGljIERJTm9kZSB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBNRE5vZGU7CisKKyAgaW50NjRfdCBWYWx1ZTsKKyAgRElFbnVtZXJhdG9yKExMVk1Db250ZXh0ICZDLCBTdG9yYWdlVHlwZSBTdG9yYWdlLCBpbnQ2NF90IFZhbHVlLAorICAgICAgICAgICAgICAgYm9vbCBJc1Vuc2lnbmVkLCBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMpCisgICAgICA6IERJTm9kZShDLCBESUVudW1lcmF0b3JLaW5kLCBTdG9yYWdlLCBkd2FyZjo6RFdfVEFHX2VudW1lcmF0b3IsIE9wcyksCisgICAgICAgIFZhbHVlKFZhbHVlKSB7CisgICAgU3ViY2xhc3NEYXRhMzIgPSBJc1Vuc2lnbmVkOworICB9CisgIH5ESUVudW1lcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIERJRW51bWVyYXRvciAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgaW50NjRfdCBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzVW5zaWduZWQsIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSkgeworICAgIHJldHVybiBnZXRJbXBsKENvbnRleHQsIFZhbHVlLCBJc1Vuc2lnbmVkLAorICAgICAgICAgICAgICAgICAgIGdldENhbm9uaWNhbE1EU3RyaW5nKENvbnRleHQsIE5hbWUpLCBTdG9yYWdlLCBTaG91bGRDcmVhdGUpOworICB9CisgIHN0YXRpYyBESUVudW1lcmF0b3IgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIGludDY0X3QgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1Vuc2lnbmVkLCBNRFN0cmluZyAqTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVHlwZSBTdG9yYWdlLCBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpOworCisgIFRlbXBESUVudW1lcmF0b3IgY2xvbmVJbXBsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUZW1wb3JhcnkoZ2V0Q29udGV4dCgpLCBnZXRWYWx1ZSgpLCBpc1Vuc2lnbmVkKCksIGdldE5hbWUoKSk7CisgIH0KKworcHVibGljOgorICBERUZJTkVfTUROT0RFX0dFVChESUVudW1lcmF0b3IsIChpbnQ2NF90IFZhbHVlLCBib29sIElzVW5zaWduZWQsIFN0cmluZ1JlZiBOYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgKFZhbHVlLCBJc1Vuc2lnbmVkLCBOYW1lKSkKKyAgREVGSU5FX01ETk9ERV9HRVQoRElFbnVtZXJhdG9yLCAoaW50NjRfdCBWYWx1ZSwgYm9vbCBJc1Vuc2lnbmVkLCBNRFN0cmluZyAqTmFtZSksCisgICAgICAgICAgICAgICAgICAgIChWYWx1ZSwgSXNVbnNpZ25lZCwgTmFtZSkpCisKKyAgVGVtcERJRW51bWVyYXRvciBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIGNsb25lSW1wbCgpOyB9CisKKyAgaW50NjRfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisgIGJvb2wgaXNVbnNpZ25lZCgpIGNvbnN0IHsgcmV0dXJuIFN1YmNsYXNzRGF0YTMyOyB9CisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RyaW5nT3BlcmFuZCgwKTsgfQorCisgIE1EU3RyaW5nICpnZXRSYXdOYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZEFzPE1EU3RyaW5nPigwKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElFbnVtZXJhdG9yS2luZDsKKyAgfQorfTsKKworLy8vIEJhc2UgY2xhc3MgZm9yIHNjb3BlLWxpa2UgY29udGV4dHMuCisvLy8KKy8vLyBCYXNlIGNsYXNzIGZvciBsZXhpY2FsIHNjb3BlcyBhbmQgdHlwZXMgKHdoaWNoIGFyZSBhbHNvIGRlY2xhcmF0aW9uCisvLy8gY29udGV4dHMpLgorLy8vCisvLy8gVE9ETzogU2VwYXJhdGUgdGhlIGNvbmNlcHRzIG9mIGRlY2xhcmF0aW9uIGNvbnRleHRzIGFuZCBsZXhpY2FsIHNjb3Blcy4KK2NsYXNzIERJU2NvcGUgOiBwdWJsaWMgRElOb2RlIHsKK3Byb3RlY3RlZDoKKyAgRElTY29wZShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgSUQsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIHVuc2lnbmVkIFRhZywKKyAgICAgICAgICBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMpCisgICAgICA6IERJTm9kZShDLCBJRCwgU3RvcmFnZSwgVGFnLCBPcHMpIHt9CisgIH5ESVNjb3BlKCkgPSBkZWZhdWx0OworCitwdWJsaWM6CisgIERJRmlsZSAqZ2V0RmlsZSgpIGNvbnN0IHsgcmV0dXJuIGNhc3Rfb3JfbnVsbDxESUZpbGU+KGdldFJhd0ZpbGUoKSk7IH0KKworICBpbmxpbmUgU3RyaW5nUmVmIGdldEZpbGVuYW1lKCkgY29uc3Q7CisgIGlubGluZSBTdHJpbmdSZWYgZ2V0RGlyZWN0b3J5KCkgY29uc3Q7CisgIGlubGluZSBPcHRpb25hbDxTdHJpbmdSZWY+IGdldFNvdXJjZSgpIGNvbnN0OworCisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3Q7CisgIERJU2NvcGVSZWYgZ2V0U2NvcGUoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSByYXcgdW5kZXJseWluZyBmaWxlLgorICAvLy8KKyAgLy8vIEEgXGEgRElGaWxlIGlzIGEgXGEgRElTY29wZSwgYnV0IGl0IGRvZXNuJ3QgcG9pbnQgYXQgYSBzZXBhcmF0ZSBmaWxlIChpdAorICAvLy8gXGVtIGlzIHRoZSBmaWxlKS4gIElmIFxjIHRoaXMgaXMgYW4gXGEgRElGaWxlLCB3ZSBuZWVkIHRvIHJldHVybiBcYyB0aGlzLgorICAvLy8gT3RoZXJ3aXNlLCByZXR1cm4gdGhlIGZpcnN0IG9wZXJhbmQsIHdoaWNoIGlzIHdoZXJlIGFsbCBvdGhlciBzdWJjbGFzc2VzCisgIC8vLyBzdG9yZSB0aGVpciBmaWxlIHBvaW50ZXIuCisgIE1ldGFkYXRhICpnZXRSYXdGaWxlKCkgY29uc3QgeworICAgIHJldHVybiBpc2E8RElGaWxlPih0aGlzKSA/IGNvbnN0X2Nhc3Q8RElTY29wZSAqPih0aGlzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IHN0YXRpY19jYXN0PE1ldGFkYXRhICo+KGdldE9wZXJhbmQoMCkpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICBzd2l0Y2ggKE1ELT5nZXRNZXRhZGF0YUlEKCkpIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgRElCYXNpY1R5cGVLaW5kOgorICAgIGNhc2UgRElEZXJpdmVkVHlwZUtpbmQ6CisgICAgY2FzZSBESUNvbXBvc2l0ZVR5cGVLaW5kOgorICAgIGNhc2UgRElTdWJyb3V0aW5lVHlwZUtpbmQ6CisgICAgY2FzZSBESUZpbGVLaW5kOgorICAgIGNhc2UgRElDb21waWxlVW5pdEtpbmQ6CisgICAgY2FzZSBESVN1YnByb2dyYW1LaW5kOgorICAgIGNhc2UgRElMZXhpY2FsQmxvY2tLaW5kOgorICAgIGNhc2UgRElMZXhpY2FsQmxvY2tGaWxlS2luZDoKKyAgICBjYXNlIERJTmFtZXNwYWNlS2luZDoKKyAgICBjYXNlIERJTW9kdWxlS2luZDoKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorfTsKKworLy8vIEZpbGUuCisvLy8KKy8vLyBUT0RPOiBNZXJnZSB3aXRoIGRpcmVjdG9yeS9maWxlIG5vZGUgKGluY2x1ZGluZyB1c2VycykuCisvLy8gVE9ETzogQ2Fub25pY2FsaXplIHBhdGhzIG9uIGNyZWF0aW9uLgorY2xhc3MgRElGaWxlIDogcHVibGljIERJU2NvcGUgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCitwdWJsaWM6CisgIC8vLyBXaGljaCBhbGdvcml0aG0gKGUuZy4gTUQ1KSBhIGNoZWNrc3VtIHdhcyBnZW5lcmF0ZWQgd2l0aC4KKyAgLy8vCisgIC8vLyBUaGUgZW5jb2RpbmcgaXMgZXhwbGljaXQgYmVjYXVzZSBpdCBpcyB1c2VkIGRpcmVjdGx5IGluIEJpdGNvZGUuIFRoZQorICAvLy8gdmFsdWUgMCBpcyByZXNlcnZlZCB0byBpbmRpY2F0ZSB0aGUgYWJzZW5jZSBvZiBhIGNoZWNrc3VtIGluIEJpdGNvZGUuCisgIGVudW0gQ2hlY2tzdW1LaW5kIHsKKyAgICAvLyBUaGUgZmlyc3QgdmFyaWFudCB3YXMgb3JpZ2luYWxseSBDU0tfTm9uZSwgZW5jb2RlZCBhcyAwLiBUaGUgbmV3CisgICAgLy8gaW50ZXJuYWwgcmVwcmVzZW50YXRpb24gcmVtb3ZlcyB0aGUgbmVlZCBmb3IgdGhpcyBieSB3cmFwcGluZyB0aGUKKyAgICAvLyBDaGVja3N1bUluZm8gaW4gYW4gT3B0aW9uYWwsIGJ1dCB0byBwcmVzZXJ2ZSBCaXRjb2RlIGNvbXBhdGliaWxpdHkgdGhlIDAKKyAgICAvLyBlbmNvZGluZyBpcyByZXNlcnZlZC4KKyAgICBDU0tfTUQ1ID0gMSwKKyAgICBDU0tfU0hBMSA9IDIsCisgICAgQ1NLX0xhc3QgPSBDU0tfU0hBMSAvLyBTaG91bGQgYmUgbGFzdCBlbnVtZXJhdGlvbi4KKyAgfTsKKworICAvLy8gQSBzaW5nbGUgY2hlY2tzdW0sIHJlcHJlc2VudGVkIGJ5IGEgXGEgS2luZCBhbmQgYSBcYSBWYWx1ZSAoYSBzdHJpbmcpLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RydWN0IENoZWNrc3VtSW5mbyB7CisgICAgLy8vIFRoZSBraW5kIG9mIGNoZWNrc3VtIHdoaWNoIFxhIFZhbHVlIGVuY29kZXMuCisgICAgQ2hlY2tzdW1LaW5kIEtpbmQ7CisgICAgLy8vIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGNoZWNrc3VtLgorICAgIFQgVmFsdWU7CisKKyAgICBDaGVja3N1bUluZm8oQ2hlY2tzdW1LaW5kIEtpbmQsIFQgVmFsdWUpIDogS2luZChLaW5kKSwgVmFsdWUoVmFsdWUpIHsgfQorICAgIH5DaGVja3N1bUluZm8oKSA9IGRlZmF1bHQ7CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IENoZWNrc3VtSW5mbzxUPiAmWCkgY29uc3QgeworICAgICAgcmV0dXJuIEtpbmQgPT0gWC5LaW5kICYmIFZhbHVlID09IFguVmFsdWU7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDaGVja3N1bUluZm88VD4gJlgpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gWCk7IH0KKyAgICBTdHJpbmdSZWYgZ2V0S2luZEFzU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gZ2V0Q2hlY2tzdW1LaW5kQXNTdHJpbmcoS2luZCk7IH0KKyAgfTsKKworcHJpdmF0ZToKKyAgT3B0aW9uYWw8Q2hlY2tzdW1JbmZvPE1EU3RyaW5nICo+PiBDaGVja3N1bTsKKyAgT3B0aW9uYWw8TURTdHJpbmcgKj4gU291cmNlOworCisgIERJRmlsZShMTFZNQ29udGV4dCAmQywgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgIE9wdGlvbmFsPENoZWNrc3VtSW5mbzxNRFN0cmluZyAqPj4gQ1MsIE9wdGlvbmFsPE1EU3RyaW5nICo+IFNyYywKKyAgICAgICAgIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wcykKKyAgICAgIDogRElTY29wZShDLCBESUZpbGVLaW5kLCBTdG9yYWdlLCBkd2FyZjo6RFdfVEFHX2ZpbGVfdHlwZSwgT3BzKSwKKyAgICAgICAgQ2hlY2tzdW0oQ1MpLCBTb3VyY2UoU3JjKSB7fQorICB+RElGaWxlKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBESUZpbGUgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIFN0cmluZ1JlZiBGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPENoZWNrc3VtSW5mbzxTdHJpbmdSZWY+PiBDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxTdHJpbmdSZWY+IFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVHlwZSBTdG9yYWdlLCBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpIHsKKyAgICBPcHRpb25hbDxDaGVja3N1bUluZm88TURTdHJpbmcgKj4+IE1EQ2hlY2tzdW07CisgICAgaWYgKENTKQorICAgICAgTURDaGVja3N1bS5lbXBsYWNlKENTLT5LaW5kLCBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBDUy0+VmFsdWUpKTsKKyAgICByZXR1cm4gZ2V0SW1wbChDb250ZXh0LCBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBGaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgZ2V0Q2Fub25pY2FsTURTdHJpbmcoQ29udGV4dCwgRGlyZWN0b3J5KSwgTURDaGVja3N1bSwKKyAgICAgICAgICAgICAgICAgICBTb3VyY2UgPyBPcHRpb25hbDxNRFN0cmluZyAqPihnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCAqU291cmNlKSkgOiBOb25lLAorICAgICAgICAgICAgICAgICAgIFN0b3JhZ2UsIFNob3VsZENyZWF0ZSk7CisgIH0KKyAgc3RhdGljIERJRmlsZSAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgTURTdHJpbmcgKkZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1EU3RyaW5nICpEaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8Q2hlY2tzdW1JbmZvPE1EU3RyaW5nICo+PiBDUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxNRFN0cmluZyAqPiBTb3VyY2UsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wRElGaWxlIGNsb25lSW1wbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGVtcG9yYXJ5KGdldENvbnRleHQoKSwgZ2V0RmlsZW5hbWUoKSwgZ2V0RGlyZWN0b3J5KCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRDaGVja3N1bSgpLCBnZXRTb3VyY2UoKSk7CisgIH0KKworcHVibGljOgorICBERUZJTkVfTUROT0RFX0dFVChESUZpbGUsIChTdHJpbmdSZWYgRmlsZW5hbWUsIFN0cmluZ1JlZiBEaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPENoZWNrc3VtSW5mbzxTdHJpbmdSZWY+PiBDUyA9IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPFN0cmluZ1JlZj4gU291cmNlID0gTm9uZSksCisgICAgICAgICAgICAgICAgICAgIChGaWxlbmFtZSwgRGlyZWN0b3J5LCBDUywgU291cmNlKSkKKyAgREVGSU5FX01ETk9ERV9HRVQoRElGaWxlLCAoTURTdHJpbmcgKiBGaWxlbmFtZSwgTURTdHJpbmcgKkRpcmVjdG9yeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8Q2hlY2tzdW1JbmZvPE1EU3RyaW5nICo+PiBDUyA9IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPE1EU3RyaW5nICo+IFNvdXJjZSA9IE5vbmUpLAorICAgICAgICAgICAgICAgICAgICAoRmlsZW5hbWUsIERpcmVjdG9yeSwgQ1MsIFNvdXJjZSkpCisKKyAgVGVtcERJRmlsZSBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIGNsb25lSW1wbCgpOyB9CisKKyAgU3RyaW5nUmVmIGdldEZpbGVuYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RyaW5nT3BlcmFuZCgwKTsgfQorICBTdHJpbmdSZWYgZ2V0RGlyZWN0b3J5KCkgY29uc3QgeyByZXR1cm4gZ2V0U3RyaW5nT3BlcmFuZCgxKTsgfQorICBPcHRpb25hbDxDaGVja3N1bUluZm88U3RyaW5nUmVmPj4gZ2V0Q2hlY2tzdW0oKSBjb25zdCB7CisgICAgT3B0aW9uYWw8Q2hlY2tzdW1JbmZvPFN0cmluZ1JlZj4+IFN0cmluZ1JlZkNoZWNrc3VtOworICAgIGlmIChDaGVja3N1bSkKKyAgICAgIFN0cmluZ1JlZkNoZWNrc3VtLmVtcGxhY2UoQ2hlY2tzdW0tPktpbmQsIENoZWNrc3VtLT5WYWx1ZS0+Z2V0U3RyaW5nKCkpOworICAgIHJldHVybiBTdHJpbmdSZWZDaGVja3N1bTsKKyAgfQorICBPcHRpb25hbDxTdHJpbmdSZWY+IGdldFNvdXJjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU291cmNlID8gT3B0aW9uYWw8U3RyaW5nUmVmPigoKlNvdXJjZSktPmdldFN0cmluZygpKSA6IE5vbmU7CisgIH0KKworICBNRFN0cmluZyAqZ2V0UmF3RmlsZW5hbWUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kQXM8TURTdHJpbmc+KDApOyB9CisgIE1EU3RyaW5nICpnZXRSYXdEaXJlY3RvcnkoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kQXM8TURTdHJpbmc+KDEpOyB9CisgIE9wdGlvbmFsPENoZWNrc3VtSW5mbzxNRFN0cmluZyAqPj4gZ2V0UmF3Q2hlY2tzdW0oKSBjb25zdCB7IHJldHVybiBDaGVja3N1bTsgfQorICBPcHRpb25hbDxNRFN0cmluZyAqPiBnZXRSYXdTb3VyY2UoKSBjb25zdCB7IHJldHVybiBTb3VyY2U7IH0KKworICBzdGF0aWMgU3RyaW5nUmVmIGdldENoZWNrc3VtS2luZEFzU3RyaW5nKENoZWNrc3VtS2luZCBDU0tpbmQpOworICBzdGF0aWMgT3B0aW9uYWw8Q2hlY2tzdW1LaW5kPiBnZXRDaGVja3N1bUtpbmQoU3RyaW5nUmVmIENTS2luZFN0cik7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBESUZpbGVLaW5kOworICB9Cit9OworCitTdHJpbmdSZWYgRElTY29wZTo6Z2V0RmlsZW5hbWUoKSBjb25zdCB7CisgIGlmIChhdXRvICpGID0gZ2V0RmlsZSgpKQorICAgIHJldHVybiBGLT5nZXRGaWxlbmFtZSgpOworICByZXR1cm4gIiI7Cit9CisKK1N0cmluZ1JlZiBESVNjb3BlOjpnZXREaXJlY3RvcnkoKSBjb25zdCB7CisgIGlmIChhdXRvICpGID0gZ2V0RmlsZSgpKQorICAgIHJldHVybiBGLT5nZXREaXJlY3RvcnkoKTsKKyAgcmV0dXJuICIiOworfQorCitPcHRpb25hbDxTdHJpbmdSZWY+IERJU2NvcGU6OmdldFNvdXJjZSgpIGNvbnN0IHsKKyAgaWYgKGF1dG8gKkYgPSBnZXRGaWxlKCkpCisgICAgcmV0dXJuIEYtPmdldFNvdXJjZSgpOworICByZXR1cm4gTm9uZTsKK30KKworLy8vIEJhc2UgY2xhc3MgZm9yIHR5cGVzLgorLy8vCisvLy8gVE9ETzogUmVtb3ZlIHRoZSBoYXJkY29kZWQgbmFtZSBhbmQgY29udGV4dCwgc2luY2UgbWFueSB0eXBlcyBkb24ndCB1c2UKKy8vLyB0aGVtLgorLy8vIFRPRE86IFNwbGl0IHVwIGZsYWdzLgorY2xhc3MgRElUeXBlIDogcHVibGljIERJU2NvcGUgeworICB1bnNpZ25lZCBMaW5lOworICBESUZsYWdzIEZsYWdzOworICB1aW50NjRfdCBTaXplSW5CaXRzOworICB1aW50NjRfdCBPZmZzZXRJbkJpdHM7CisgIHVpbnQzMl90IEFsaWduSW5CaXRzOworCitwcm90ZWN0ZWQ6CisgIERJVHlwZShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgSUQsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIHVuc2lnbmVkIFRhZywKKyAgICAgICAgIHVuc2lnbmVkIExpbmUsIHVpbnQ2NF90IFNpemVJbkJpdHMsIHVpbnQzMl90IEFsaWduSW5CaXRzLAorICAgICAgICAgdWludDY0X3QgT2Zmc2V0SW5CaXRzLCBESUZsYWdzIEZsYWdzLCBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMpCisgICAgICA6IERJU2NvcGUoQywgSUQsIFN0b3JhZ2UsIFRhZywgT3BzKSB7CisgICAgaW5pdChMaW5lLCBTaXplSW5CaXRzLCBBbGlnbkluQml0cywgT2Zmc2V0SW5CaXRzLCBGbGFncyk7CisgIH0KKyAgfkRJVHlwZSgpID0gZGVmYXVsdDsKKworICB2b2lkIGluaXQodW5zaWduZWQgTGluZSwgdWludDY0X3QgU2l6ZUluQml0cywgdWludDMyX3QgQWxpZ25JbkJpdHMsCisgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXRJbkJpdHMsIERJRmxhZ3MgRmxhZ3MpIHsKKyAgICB0aGlzLT5MaW5lID0gTGluZTsKKyAgICB0aGlzLT5GbGFncyA9IEZsYWdzOworICAgIHRoaXMtPlNpemVJbkJpdHMgPSBTaXplSW5CaXRzOworICAgIHRoaXMtPkFsaWduSW5CaXRzID0gQWxpZ25JbkJpdHM7CisgICAgdGhpcy0+T2Zmc2V0SW5CaXRzID0gT2Zmc2V0SW5CaXRzOworICB9CisKKyAgLy8vIENoYW5nZSBmaWVsZHMgaW4gcGxhY2UuCisgIHZvaWQgbXV0YXRlKHVuc2lnbmVkIFRhZywgdW5zaWduZWQgTGluZSwgdWludDY0X3QgU2l6ZUluQml0cywKKyAgICAgICAgICAgICAgdWludDMyX3QgQWxpZ25JbkJpdHMsIHVpbnQ2NF90IE9mZnNldEluQml0cywgRElGbGFncyBGbGFncykgeworICAgIGFzc2VydChpc0Rpc3RpbmN0KCkgJiYgIk9ubHkgZGlzdGluY3Qgbm9kZXMgY2FuIG11dGF0ZSIpOworICAgIHNldFRhZyhUYWcpOworICAgIGluaXQoTGluZSwgU2l6ZUluQml0cywgQWxpZ25JbkJpdHMsIE9mZnNldEluQml0cywgRmxhZ3MpOworICB9CisKK3B1YmxpYzoKKyAgVGVtcERJVHlwZSBjbG9uZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVGVtcERJVHlwZShjYXN0PERJVHlwZT4oTUROb2RlOjpjbG9uZSgpLnJlbGVhc2UoKSkpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TGluZSgpIGNvbnN0IHsgcmV0dXJuIExpbmU7IH0KKyAgdWludDY0X3QgZ2V0U2l6ZUluQml0cygpIGNvbnN0IHsgcmV0dXJuIFNpemVJbkJpdHM7IH0KKyAgdWludDMyX3QgZ2V0QWxpZ25JbkJpdHMoKSBjb25zdCB7IHJldHVybiBBbGlnbkluQml0czsgfQorICB1aW50MzJfdCBnZXRBbGlnbkluQnl0ZXMoKSBjb25zdCB7IHJldHVybiBnZXRBbGlnbkluQml0cygpIC8gQ0hBUl9CSVQ7IH0KKyAgdWludDY0X3QgZ2V0T2Zmc2V0SW5CaXRzKCkgY29uc3QgeyByZXR1cm4gT2Zmc2V0SW5CaXRzOyB9CisgIERJRmxhZ3MgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBGbGFnczsgfQorCisgIERJU2NvcGVSZWYgZ2V0U2NvcGUoKSBjb25zdCB7IHJldHVybiBESVNjb3BlUmVmKGdldFJhd1Njb3BlKCkpOyB9CisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RyaW5nT3BlcmFuZCgyKTsgfQorCisKKyAgTWV0YWRhdGEgKmdldFJhd1Njb3BlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgxKTsgfQorICBNRFN0cmluZyAqZ2V0UmF3TmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmRBczxNRFN0cmluZz4oMik7IH0KKworICB2b2lkIHNldEZsYWdzKERJRmxhZ3MgTmV3RmxhZ3MpIHsKKyAgICBhc3NlcnQoIWlzVW5pcXVlZCgpICYmICJDYW5ub3Qgc2V0IGZsYWdzIG9uIHVuaXF1ZWQgbm9kZXMiKTsKKyAgICBGbGFncyA9IE5ld0ZsYWdzOworICB9CisKKyAgYm9vbCBpc1ByaXZhdGUoKSBjb25zdCB7CisgICAgcmV0dXJuIChnZXRGbGFncygpICYgRmxhZ0FjY2Vzc2liaWxpdHkpID09IEZsYWdQcml2YXRlOworICB9CisgIGJvb2wgaXNQcm90ZWN0ZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIChnZXRGbGFncygpICYgRmxhZ0FjY2Vzc2liaWxpdHkpID09IEZsYWdQcm90ZWN0ZWQ7CisgIH0KKyAgYm9vbCBpc1B1YmxpYygpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdldEZsYWdzKCkgJiBGbGFnQWNjZXNzaWJpbGl0eSkgPT0gRmxhZ1B1YmxpYzsKKyAgfQorICBib29sIGlzRm9yd2FyZERlY2woKSBjb25zdCB7IHJldHVybiBnZXRGbGFncygpICYgRmxhZ0Z3ZERlY2w7IH0KKyAgYm9vbCBpc0FwcGxlQmxvY2tFeHRlbnNpb24oKSBjb25zdCB7IHJldHVybiBnZXRGbGFncygpICYgRmxhZ0FwcGxlQmxvY2s7IH0KKyAgYm9vbCBpc0Jsb2NrQnlyZWZTdHJ1Y3QoKSBjb25zdCB7IHJldHVybiBnZXRGbGFncygpICYgRmxhZ0Jsb2NrQnlyZWZTdHJ1Y3Q7IH0KKyAgYm9vbCBpc1ZpcnR1YWwoKSBjb25zdCB7IHJldHVybiBnZXRGbGFncygpICYgRmxhZ1ZpcnR1YWw7IH0KKyAgYm9vbCBpc0FydGlmaWNpYWwoKSBjb25zdCB7IHJldHVybiBnZXRGbGFncygpICYgRmxhZ0FydGlmaWNpYWw7IH0KKyAgYm9vbCBpc09iamVjdFBvaW50ZXIoKSBjb25zdCB7IHJldHVybiBnZXRGbGFncygpICYgRmxhZ09iamVjdFBvaW50ZXI7IH0KKyAgYm9vbCBpc09iamNDbGFzc0NvbXBsZXRlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRGbGFncygpICYgRmxhZ09iamNDbGFzc0NvbXBsZXRlOworICB9CisgIGJvb2wgaXNWZWN0b3IoKSBjb25zdCB7IHJldHVybiBnZXRGbGFncygpICYgRmxhZ1ZlY3RvcjsgfQorICBib29sIGlzQml0RmllbGQoKSBjb25zdCB7IHJldHVybiBnZXRGbGFncygpICYgRmxhZ0JpdEZpZWxkOyB9CisgIGJvb2wgaXNTdGF0aWNNZW1iZXIoKSBjb25zdCB7IHJldHVybiBnZXRGbGFncygpICYgRmxhZ1N0YXRpY01lbWJlcjsgfQorICBib29sIGlzTFZhbHVlUmVmZXJlbmNlKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdMVmFsdWVSZWZlcmVuY2U7IH0KKyAgYm9vbCBpc1JWYWx1ZVJlZmVyZW5jZSgpIGNvbnN0IHsgcmV0dXJuIGdldEZsYWdzKCkgJiBGbGFnUlZhbHVlUmVmZXJlbmNlOyB9CisgIGJvb2wgaXNUeXBlUGFzc0J5VmFsdWUoKSBjb25zdCB7IHJldHVybiBnZXRGbGFncygpICYgRmxhZ1R5cGVQYXNzQnlWYWx1ZTsgfQorICBib29sIGlzVHlwZVBhc3NCeVJlZmVyZW5jZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdUeXBlUGFzc0J5UmVmZXJlbmNlOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICBzd2l0Y2ggKE1ELT5nZXRNZXRhZGF0YUlEKCkpIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgRElCYXNpY1R5cGVLaW5kOgorICAgIGNhc2UgRElEZXJpdmVkVHlwZUtpbmQ6CisgICAgY2FzZSBESUNvbXBvc2l0ZVR5cGVLaW5kOgorICAgIGNhc2UgRElTdWJyb3V0aW5lVHlwZUtpbmQ6CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KK307CisKKy8vLyBCYXNpYyB0eXBlLCBsaWtlICdpbnQnIG9yICdmbG9hdCcuCisvLy8KKy8vLyBUT0RPOiBTcGxpdCBvdXQgRFdfVEFHX3Vuc3BlY2lmaWVkX3R5cGUuCisvLy8gVE9ETzogRHJvcCB1bnVzZWQgYWNjZXNzb3JzLgorY2xhc3MgRElCYXNpY1R5cGUgOiBwdWJsaWMgRElUeXBlIHsKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIE1ETm9kZTsKKworICB1bnNpZ25lZCBFbmNvZGluZzsKKworICBESUJhc2ljVHlwZShMTFZNQ29udGV4dCAmQywgU3RvcmFnZVR5cGUgU3RvcmFnZSwgdW5zaWduZWQgVGFnLAorICAgICAgICAgICAgICB1aW50NjRfdCBTaXplSW5CaXRzLCB1aW50MzJfdCBBbGlnbkluQml0cywgdW5zaWduZWQgRW5jb2RpbmcsCisgICAgICAgICAgICAgIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wcykKKyAgICAgIDogRElUeXBlKEMsIERJQmFzaWNUeXBlS2luZCwgU3RvcmFnZSwgVGFnLCAwLCBTaXplSW5CaXRzLCBBbGlnbkluQml0cywgMCwKKyAgICAgICAgICAgICAgIEZsYWdaZXJvLCBPcHMpLAorICAgICAgICBFbmNvZGluZyhFbmNvZGluZykge30KKyAgfkRJQmFzaWNUeXBlKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBESUJhc2ljVHlwZSAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgdW5zaWduZWQgVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUsIHVpbnQ2NF90IFNpemVJbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBbGlnbkluQml0cywgdW5zaWduZWQgRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVHlwZSBTdG9yYWdlLCBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpIHsKKyAgICByZXR1cm4gZ2V0SW1wbChDb250ZXh0LCBUYWcsIGdldENhbm9uaWNhbE1EU3RyaW5nKENvbnRleHQsIE5hbWUpLAorICAgICAgICAgICAgICAgICAgIFNpemVJbkJpdHMsIEFsaWduSW5CaXRzLCBFbmNvZGluZywgU3RvcmFnZSwgU2hvdWxkQ3JlYXRlKTsKKyAgfQorICBzdGF0aWMgRElCYXNpY1R5cGUgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIHVuc2lnbmVkIFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1EU3RyaW5nICpOYW1lLCB1aW50NjRfdCBTaXplSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQWxpZ25JbkJpdHMsIHVuc2lnbmVkIEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wRElCYXNpY1R5cGUgY2xvbmVJbXBsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUZW1wb3JhcnkoZ2V0Q29udGV4dCgpLCBnZXRUYWcoKSwgZ2V0TmFtZSgpLCBnZXRTaXplSW5CaXRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRBbGlnbkluQml0cygpLCBnZXRFbmNvZGluZygpKTsKKyAgfQorCitwdWJsaWM6CisgIERFRklORV9NRE5PREVfR0VUKERJQmFzaWNUeXBlLCAodW5zaWduZWQgVGFnLCBTdHJpbmdSZWYgTmFtZSksCisgICAgICAgICAgICAgICAgICAgIChUYWcsIE5hbWUsIDAsIDAsIDApKQorICBERUZJTkVfTUROT0RFX0dFVChESUJhc2ljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIFRhZywgU3RyaW5nUmVmIE5hbWUsIHVpbnQ2NF90IFNpemVJbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBbGlnbkluQml0cywgdW5zaWduZWQgRW5jb2RpbmcpLAorICAgICAgICAgICAgICAgICAgICAoVGFnLCBOYW1lLCBTaXplSW5CaXRzLCBBbGlnbkluQml0cywgRW5jb2RpbmcpKQorICBERUZJTkVfTUROT0RFX0dFVChESUJhc2ljVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIFRhZywgTURTdHJpbmcgKk5hbWUsIHVpbnQ2NF90IFNpemVJbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBbGlnbkluQml0cywgdW5zaWduZWQgRW5jb2RpbmcpLAorICAgICAgICAgICAgICAgICAgICAoVGFnLCBOYW1lLCBTaXplSW5CaXRzLCBBbGlnbkluQml0cywgRW5jb2RpbmcpKQorCisgIFRlbXBESUJhc2ljVHlwZSBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIGNsb25lSW1wbCgpOyB9CisKKyAgdW5zaWduZWQgZ2V0RW5jb2RpbmcoKSBjb25zdCB7IHJldHVybiBFbmNvZGluZzsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElCYXNpY1R5cGVLaW5kOworICB9Cit9OworCisvLy8gRGVyaXZlZCB0eXBlcy4KKy8vLworLy8vIFRoaXMgaW5jbHVkZXMgcXVhbGlmaWVkIHR5cGVzLCBwb2ludGVycywgcmVmZXJlbmNlcywgZnJpZW5kcywgdHlwZWRlZnMsIGFuZAorLy8vIGNsYXNzIG1lbWJlcnMuCisvLy8KKy8vLyBUT0RPOiBTcGxpdCBvdXQgbWVtYmVycyAoaW5oZXJpdGFuY2UsIGZpZWxkcywgbWV0aG9kcywgZXRjLikuCitjbGFzcyBESURlcml2ZWRUeXBlIDogcHVibGljIERJVHlwZSB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBNRE5vZGU7CisKKyAgLy8vIFxicmllZiBUaGUgRFdBUkYgYWRkcmVzcyBzcGFjZSBvZiB0aGUgbWVtb3J5IHBvaW50ZWQgdG8gb3IgcmVmZXJlbmNlZCBieSBhCisgIC8vLyBwb2ludGVyIG9yIHJlZmVyZW5jZSB0eXBlIHJlc3BlY3RpdmVseS4KKyAgT3B0aW9uYWw8dW5zaWduZWQ+IERXQVJGQWRkcmVzc1NwYWNlOworCisgIERJRGVyaXZlZFR5cGUoTExWTUNvbnRleHQgJkMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIHVuc2lnbmVkIFRhZywKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lLCB1aW50NjRfdCBTaXplSW5CaXRzLCB1aW50MzJfdCBBbGlnbkluQml0cywKKyAgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXRJbkJpdHMsIE9wdGlvbmFsPHVuc2lnbmVkPiBEV0FSRkFkZHJlc3NTcGFjZSwKKyAgICAgICAgICAgICAgICBESUZsYWdzIEZsYWdzLCBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMpCisgICAgICA6IERJVHlwZShDLCBESURlcml2ZWRUeXBlS2luZCwgU3RvcmFnZSwgVGFnLCBMaW5lLCBTaXplSW5CaXRzLAorICAgICAgICAgICAgICAgQWxpZ25JbkJpdHMsIE9mZnNldEluQml0cywgRmxhZ3MsIE9wcyksCisgICAgICAgIERXQVJGQWRkcmVzc1NwYWNlKERXQVJGQWRkcmVzc1NwYWNlKSB7fQorICB+RElEZXJpdmVkVHlwZSgpID0gZGVmYXVsdDsKKworICBzdGF0aWMgRElEZXJpdmVkVHlwZSAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgdW5zaWduZWQgVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSwgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNjb3BlUmVmIFNjb3BlLCBESVR5cGVSZWYgQmFzZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemVJbkJpdHMsIHVpbnQzMl90IEFsaWduSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXRJbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHVuc2lnbmVkPiBEV0FSRkFkZHJlc3NTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGbGFncyBGbGFncywgTWV0YWRhdGEgKkV4dHJhRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKSB7CisgICAgcmV0dXJuIGdldEltcGwoQ29udGV4dCwgVGFnLCBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBOYW1lKSwgRmlsZSwKKyAgICAgICAgICAgICAgICAgICBMaW5lLCBTY29wZSwgQmFzZVR5cGUsIFNpemVJbkJpdHMsIEFsaWduSW5CaXRzLCBPZmZzZXRJbkJpdHMsCisgICAgICAgICAgICAgICAgICAgRFdBUkZBZGRyZXNzU3BhY2UsIEZsYWdzLCBFeHRyYURhdGEsIFN0b3JhZ2UsIFNob3VsZENyZWF0ZSk7CisgIH0KKyAgc3RhdGljIERJRGVyaXZlZFR5cGUgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIHVuc2lnbmVkIFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTURTdHJpbmcgKk5hbWUsIE1ldGFkYXRhICpGaWxlLCB1bnNpZ25lZCBMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSAqU2NvcGUsIE1ldGFkYXRhICpCYXNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZUluQml0cywgdWludDMyX3QgQWxpZ25JbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldEluQml0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8dW5zaWduZWQ+IERXQVJGQWRkcmVzc1NwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZsYWdzIEZsYWdzLCBNZXRhZGF0YSAqRXh0cmFEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVHlwZSBTdG9yYWdlLCBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpOworCisgIFRlbXBESURlcml2ZWRUeXBlIGNsb25lSW1wbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGVtcG9yYXJ5KGdldENvbnRleHQoKSwgZ2V0VGFnKCksIGdldE5hbWUoKSwgZ2V0RmlsZSgpLCBnZXRMaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRTY29wZSgpLCBnZXRCYXNlVHlwZSgpLCBnZXRTaXplSW5CaXRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRBbGlnbkluQml0cygpLCBnZXRPZmZzZXRJbkJpdHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldERXQVJGQWRkcmVzc1NwYWNlKCksIGdldEZsYWdzKCksIGdldEV4dHJhRGF0YSgpKTsKKyAgfQorCitwdWJsaWM6CisgIERFRklORV9NRE5PREVfR0VUKERJRGVyaXZlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBUYWcsIE1EU3RyaW5nICpOYW1lLCBNZXRhZGF0YSAqRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExpbmUsIE1ldGFkYXRhICpTY29wZSwgTWV0YWRhdGEgKkJhc2VUeXBlLAorICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZUluQml0cywgdWludDMyX3QgQWxpZ25JbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXRJbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDx1bnNpZ25lZD4gRFdBUkZBZGRyZXNzU3BhY2UsIERJRmxhZ3MgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSAqRXh0cmFEYXRhID0gbnVsbHB0ciksCisgICAgICAgICAgICAgICAgICAgIChUYWcsIE5hbWUsIEZpbGUsIExpbmUsIFNjb3BlLCBCYXNlVHlwZSwgU2l6ZUluQml0cywKKyAgICAgICAgICAgICAgICAgICAgIEFsaWduSW5CaXRzLCBPZmZzZXRJbkJpdHMsIERXQVJGQWRkcmVzc1NwYWNlLCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgIEV4dHJhRGF0YSkpCisgIERFRklORV9NRE5PREVfR0VUKERJRGVyaXZlZFR5cGUsCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBUYWcsIFN0cmluZ1JlZiBOYW1lLCBESUZpbGUgKkZpbGUsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgICAgICAgICBESVNjb3BlUmVmIFNjb3BlLCBESVR5cGVSZWYgQmFzZVR5cGUsIHVpbnQ2NF90IFNpemVJbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBbGlnbkluQml0cywgdWludDY0X3QgT2Zmc2V0SW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8dW5zaWduZWQ+IERXQVJGQWRkcmVzc1NwYWNlLCBESUZsYWdzIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEgKkV4dHJhRGF0YSA9IG51bGxwdHIpLAorICAgICAgICAgICAgICAgICAgICAoVGFnLCBOYW1lLCBGaWxlLCBMaW5lLCBTY29wZSwgQmFzZVR5cGUsIFNpemVJbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICBBbGlnbkluQml0cywgT2Zmc2V0SW5CaXRzLCBEV0FSRkFkZHJlc3NTcGFjZSwgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICBFeHRyYURhdGEpKQorCisgIFRlbXBESURlcml2ZWRUeXBlIGNsb25lKCkgY29uc3QgeyByZXR1cm4gY2xvbmVJbXBsKCk7IH0KKworICAvLy8gR2V0IHRoZSBiYXNlIHR5cGUgdGhpcyBpcyBkZXJpdmVkIGZyb20uCisgIERJVHlwZVJlZiBnZXRCYXNlVHlwZSgpIGNvbnN0IHsgcmV0dXJuIERJVHlwZVJlZihnZXRSYXdCYXNlVHlwZSgpKTsgfQorICBNZXRhZGF0YSAqZ2V0UmF3QmFzZVR5cGUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDMpOyB9CisKKyAgLy8vIFxyZXR1cm5zIFRoZSBEV0FSRiBhZGRyZXNzIHNwYWNlIG9mIHRoZSBtZW1vcnkgcG9pbnRlZCB0byBvciByZWZlcmVuY2VkIGJ5CisgIC8vLyBhIHBvaW50ZXIgb3IgcmVmZXJlbmNlIHR5cGUgcmVzcGVjdGl2ZWx5LgorICBPcHRpb25hbDx1bnNpZ25lZD4gZ2V0RFdBUkZBZGRyZXNzU3BhY2UoKSBjb25zdCB7IHJldHVybiBEV0FSRkFkZHJlc3NTcGFjZTsgfQorCisgIC8vLyBHZXQgZXh0cmEgZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBkZXJpdmVkIHR5cGUuCisgIC8vLworICAvLy8gQ2xhc3MgdHlwZSBmb3IgcG9pbnRlci10by1tZW1iZXJzLCBvYmplY3RpdmUtYyBwcm9wZXJ0eSBub2RlIGZvciBpdmFycywKKyAgLy8vIG9yIGdsb2JhbCBjb25zdGFudCB3cmFwcGVyIGZvciBzdGF0aWMgbWVtYmVycy4KKyAgLy8vCisgIC8vLyBUT0RPOiBTZXBhcmF0ZSBvdXQgdHlwZXMgdGhhdCBuZWVkIHRoaXMgZXh0cmEgb3BlcmFuZDogcG9pbnRlci10by1tZW1iZXIKKyAgLy8vIHR5cGVzIGFuZCBtZW1iZXIgZmllbGRzIChzdGF0aWMgbWVtYmVycyBhbmQgaXZhcnMpLgorICBNZXRhZGF0YSAqZ2V0RXh0cmFEYXRhKCkgY29uc3QgeyByZXR1cm4gZ2V0UmF3RXh0cmFEYXRhKCk7IH0KKyAgTWV0YWRhdGEgKmdldFJhd0V4dHJhRGF0YSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoNCk7IH0KKworICAvLy8gR2V0IGNhc3RlZCB2ZXJzaW9uIG9mIGV4dHJhIGRhdGEuCisgIC8vLyBAeworICBESVR5cGVSZWYgZ2V0Q2xhc3NUeXBlKCkgY29uc3QgeworICAgIGFzc2VydChnZXRUYWcoKSA9PSBkd2FyZjo6RFdfVEFHX3B0cl90b19tZW1iZXJfdHlwZSk7CisgICAgcmV0dXJuIERJVHlwZVJlZihnZXRFeHRyYURhdGEoKSk7CisgIH0KKworICBESU9iakNQcm9wZXJ0eSAqZ2V0T2JqQ1Byb3BlcnR5KCkgY29uc3QgeworICAgIHJldHVybiBkeW5fY2FzdF9vcl9udWxsPERJT2JqQ1Byb3BlcnR5PihnZXRFeHRyYURhdGEoKSk7CisgIH0KKworICBDb25zdGFudCAqZ2V0U3RvcmFnZU9mZnNldEluQml0cygpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0VGFnKCkgPT0gZHdhcmY6OkRXX1RBR19tZW1iZXIgJiYgaXNCaXRGaWVsZCgpKTsKKyAgICBpZiAoYXV0byAqQyA9IGNhc3Rfb3JfbnVsbDxDb25zdGFudEFzTWV0YWRhdGE+KGdldEV4dHJhRGF0YSgpKSkKKyAgICAgIHJldHVybiBDLT5nZXRWYWx1ZSgpOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgQ29uc3RhbnQgKmdldENvbnN0YW50KCkgY29uc3QgeworICAgIGFzc2VydChnZXRUYWcoKSA9PSBkd2FyZjo6RFdfVEFHX21lbWJlciAmJiBpc1N0YXRpY01lbWJlcigpKTsKKyAgICBpZiAoYXV0byAqQyA9IGNhc3Rfb3JfbnVsbDxDb25zdGFudEFzTWV0YWRhdGE+KGdldEV4dHJhRGF0YSgpKSkKKyAgICAgIHJldHVybiBDLT5nZXRWYWx1ZSgpOworICAgIHJldHVybiBudWxscHRyOworICB9CisgIENvbnN0YW50ICpnZXREaXNjcmltaW5hbnRWYWx1ZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0VGFnKCkgPT0gZHdhcmY6OkRXX1RBR19tZW1iZXIgJiYgIWlzU3RhdGljTWVtYmVyKCkpOworICAgIGlmIChhdXRvICpDID0gY2FzdF9vcl9udWxsPENvbnN0YW50QXNNZXRhZGF0YT4oZ2V0RXh0cmFEYXRhKCkpKQorICAgICAgcmV0dXJuIEMtPmdldFZhbHVlKCk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKyAgLy8vIEB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBESURlcml2ZWRUeXBlS2luZDsKKyAgfQorfTsKKworLy8vIENvbXBvc2l0ZSB0eXBlcy4KKy8vLworLy8vIFRPRE86IERldGFjaCBmcm9tIERlcml2ZWRUeXBlQmFzZSAoc3BsaXQgb3V0IE1ERW51bVR5cGU/KS4KKy8vLyBUT0RPOiBDcmVhdGUgYSBjdXN0b20sIHVucmVsYXRlZCBub2RlIGZvciBEV19UQUdfYXJyYXlfdHlwZS4KK2NsYXNzIERJQ29tcG9zaXRlVHlwZSA6IHB1YmxpYyBESVR5cGUgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCisgIHVuc2lnbmVkIFJ1bnRpbWVMYW5nOworCisgIERJQ29tcG9zaXRlVHlwZShMTFZNQ29udGV4dCAmQywgU3RvcmFnZVR5cGUgU3RvcmFnZSwgdW5zaWduZWQgVGFnLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZSwgdW5zaWduZWQgUnVudGltZUxhbmcsIHVpbnQ2NF90IFNpemVJbkJpdHMsCisgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBbGlnbkluQml0cywgdWludDY0X3QgT2Zmc2V0SW5CaXRzLCBESUZsYWdzIEZsYWdzLAorICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzKQorICAgICAgOiBESVR5cGUoQywgRElDb21wb3NpdGVUeXBlS2luZCwgU3RvcmFnZSwgVGFnLCBMaW5lLCBTaXplSW5CaXRzLAorICAgICAgICAgICAgICAgQWxpZ25JbkJpdHMsIE9mZnNldEluQml0cywgRmxhZ3MsIE9wcyksCisgICAgICAgIFJ1bnRpbWVMYW5nKFJ1bnRpbWVMYW5nKSB7fQorICB+RElDb21wb3NpdGVUeXBlKCkgPSBkZWZhdWx0OworCisgIC8vLyBDaGFuZ2UgZmllbGRzIGluIHBsYWNlLgorICB2b2lkIG11dGF0ZSh1bnNpZ25lZCBUYWcsIHVuc2lnbmVkIExpbmUsIHVuc2lnbmVkIFJ1bnRpbWVMYW5nLAorICAgICAgICAgICAgICB1aW50NjRfdCBTaXplSW5CaXRzLCB1aW50MzJfdCBBbGlnbkluQml0cywKKyAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0SW5CaXRzLCBESUZsYWdzIEZsYWdzKSB7CisgICAgYXNzZXJ0KGlzRGlzdGluY3QoKSAmJiAiT25seSBkaXN0aW5jdCBub2RlcyBjYW4gbXV0YXRlIik7CisgICAgYXNzZXJ0KGdldFJhd0lkZW50aWZpZXIoKSAmJiAiT25seSBPRFItdW5pcXVlZCBub2RlcyBzaG91bGQgbXV0YXRlIik7CisgICAgdGhpcy0+UnVudGltZUxhbmcgPSBSdW50aW1lTGFuZzsKKyAgICBESVR5cGU6Om11dGF0ZShUYWcsIExpbmUsIFNpemVJbkJpdHMsIEFsaWduSW5CaXRzLCBPZmZzZXRJbkJpdHMsIEZsYWdzKTsKKyAgfQorCisgIHN0YXRpYyBESUNvbXBvc2l0ZVR5cGUgKgorICBnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCB1bnNpZ25lZCBUYWcsIFN0cmluZ1JlZiBOYW1lLCBNZXRhZGF0YSAqRmlsZSwKKyAgICAgICAgICB1bnNpZ25lZCBMaW5lLCBESVNjb3BlUmVmIFNjb3BlLCBESVR5cGVSZWYgQmFzZVR5cGUsCisgICAgICAgICAgdWludDY0X3QgU2l6ZUluQml0cywgdWludDMyX3QgQWxpZ25JbkJpdHMsIHVpbnQ2NF90IE9mZnNldEluQml0cywKKyAgICAgICAgICBESUZsYWdzIEZsYWdzLCBESU5vZGVBcnJheSBFbGVtZW50cywgdW5zaWduZWQgUnVudGltZUxhbmcsCisgICAgICAgICAgRElUeXBlUmVmIFZUYWJsZUhvbGRlciwgRElUZW1wbGF0ZVBhcmFtZXRlckFycmF5IFRlbXBsYXRlUGFyYW1zLAorICAgICAgICAgIFN0cmluZ1JlZiBJZGVudGlmaWVyLCBESURlcml2ZWRUeXBlICpEaXNjcmltaW5hdG9yLAorICAgICAgICAgIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSkgeworICAgIHJldHVybiBnZXRJbXBsKAorICAgICAgICBDb250ZXh0LCBUYWcsIGdldENhbm9uaWNhbE1EU3RyaW5nKENvbnRleHQsIE5hbWUpLCBGaWxlLCBMaW5lLCBTY29wZSwKKyAgICAgICAgQmFzZVR5cGUsIFNpemVJbkJpdHMsIEFsaWduSW5CaXRzLCBPZmZzZXRJbkJpdHMsIEZsYWdzLCBFbGVtZW50cy5nZXQoKSwKKyAgICAgICAgUnVudGltZUxhbmcsIFZUYWJsZUhvbGRlciwgVGVtcGxhdGVQYXJhbXMuZ2V0KCksCisgICAgICAgIGdldENhbm9uaWNhbE1EU3RyaW5nKENvbnRleHQsIElkZW50aWZpZXIpLCBEaXNjcmltaW5hdG9yLCBTdG9yYWdlLCBTaG91bGRDcmVhdGUpOworICB9CisgIHN0YXRpYyBESUNvbXBvc2l0ZVR5cGUgKgorICBnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCB1bnNpZ25lZCBUYWcsIE1EU3RyaW5nICpOYW1lLCBNZXRhZGF0YSAqRmlsZSwKKyAgICAgICAgICB1bnNpZ25lZCBMaW5lLCBNZXRhZGF0YSAqU2NvcGUsIE1ldGFkYXRhICpCYXNlVHlwZSwKKyAgICAgICAgICB1aW50NjRfdCBTaXplSW5CaXRzLCB1aW50MzJfdCBBbGlnbkluQml0cywgdWludDY0X3QgT2Zmc2V0SW5CaXRzLAorICAgICAgICAgIERJRmxhZ3MgRmxhZ3MsIE1ldGFkYXRhICpFbGVtZW50cywgdW5zaWduZWQgUnVudGltZUxhbmcsCisgICAgICAgICAgTWV0YWRhdGEgKlZUYWJsZUhvbGRlciwgTWV0YWRhdGEgKlRlbXBsYXRlUGFyYW1zLAorICAgICAgICAgIE1EU3RyaW5nICpJZGVudGlmaWVyLCBNZXRhZGF0YSAqRGlzY3JpbWluYXRvciwKKyAgICAgICAgICBTdG9yYWdlVHlwZSBTdG9yYWdlLCBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpOworCisgIFRlbXBESUNvbXBvc2l0ZVR5cGUgY2xvbmVJbXBsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUZW1wb3JhcnkoZ2V0Q29udGV4dCgpLCBnZXRUYWcoKSwgZ2V0TmFtZSgpLCBnZXRGaWxlKCksIGdldExpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFNjb3BlKCksIGdldEJhc2VUeXBlKCksIGdldFNpemVJbkJpdHMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEFsaWduSW5CaXRzKCksIGdldE9mZnNldEluQml0cygpLCBnZXRGbGFncygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RWxlbWVudHMoKSwgZ2V0UnVudGltZUxhbmcoKSwgZ2V0VlRhYmxlSG9sZGVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRUZW1wbGF0ZVBhcmFtcygpLCBnZXRJZGVudGlmaWVyKCksIGdldERpc2NyaW1pbmF0b3IoKSk7CisgIH0KKworcHVibGljOgorICBERUZJTkVfTUROT0RFX0dFVChESUNvbXBvc2l0ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBUYWcsIFN0cmluZ1JlZiBOYW1lLCBESUZpbGUgKkZpbGUsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgICAgICAgICBESVNjb3BlUmVmIFNjb3BlLCBESVR5cGVSZWYgQmFzZVR5cGUsIHVpbnQ2NF90IFNpemVJbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBbGlnbkluQml0cywgdWludDY0X3QgT2Zmc2V0SW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgRElGbGFncyBGbGFncywgRElOb2RlQXJyYXkgRWxlbWVudHMsIHVuc2lnbmVkIFJ1bnRpbWVMYW5nLAorICAgICAgICAgICAgICAgICAgICAgRElUeXBlUmVmIFZUYWJsZUhvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgIERJVGVtcGxhdGVQYXJhbWV0ZXJBcnJheSBUZW1wbGF0ZVBhcmFtcyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSWRlbnRpZmllciA9ICIiLCBESURlcml2ZWRUeXBlICpEaXNjcmltaW5hdG9yID0gbnVsbHB0ciksCisgICAgICAgICAgICAgICAgICAgIChUYWcsIE5hbWUsIEZpbGUsIExpbmUsIFNjb3BlLCBCYXNlVHlwZSwgU2l6ZUluQml0cywKKyAgICAgICAgICAgICAgICAgICAgIEFsaWduSW5CaXRzLCBPZmZzZXRJbkJpdHMsIEZsYWdzLCBFbGVtZW50cywgUnVudGltZUxhbmcsCisgICAgICAgICAgICAgICAgICAgICBWVGFibGVIb2xkZXIsIFRlbXBsYXRlUGFyYW1zLCBJZGVudGlmaWVyLCBEaXNjcmltaW5hdG9yKSkKKyAgREVGSU5FX01ETk9ERV9HRVQoRElDb21wb3NpdGVUeXBlLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgVGFnLCBNRFN0cmluZyAqTmFtZSwgTWV0YWRhdGEgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lLCBNZXRhZGF0YSAqU2NvcGUsIE1ldGFkYXRhICpCYXNlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemVJbkJpdHMsIHVpbnQzMl90IEFsaWduSW5CaXRzLAorICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0SW5CaXRzLCBESUZsYWdzIEZsYWdzLCBNZXRhZGF0YSAqRWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSdW50aW1lTGFuZywgTWV0YWRhdGEgKlZUYWJsZUhvbGRlciwKKyAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhICpUZW1wbGF0ZVBhcmFtcyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICBNRFN0cmluZyAqSWRlbnRpZmllciA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSAqRGlzY3JpbWluYXRvciA9IG51bGxwdHIpLAorICAgICAgICAgICAgICAgICAgICAoVGFnLCBOYW1lLCBGaWxlLCBMaW5lLCBTY29wZSwgQmFzZVR5cGUsIFNpemVJbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICBBbGlnbkluQml0cywgT2Zmc2V0SW5CaXRzLCBGbGFncywgRWxlbWVudHMsIFJ1bnRpbWVMYW5nLAorICAgICAgICAgICAgICAgICAgICAgVlRhYmxlSG9sZGVyLCBUZW1wbGF0ZVBhcmFtcywgSWRlbnRpZmllciwgRGlzY3JpbWluYXRvcikpCisKKyAgVGVtcERJQ29tcG9zaXRlVHlwZSBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIGNsb25lSW1wbCgpOyB9CisKKyAgLy8vIEdldCBhIERJQ29tcG9zaXRlVHlwZSB3aXRoIHRoZSBnaXZlbiBPRFIgaWRlbnRpZmllci4KKyAgLy8vCisgIC8vLyBJZiBcYSBMTFZNQ29udGV4dDo6aXNPRFJVbmlxdWluZ0RlYnVnVHlwZXMoKSwgZ2V0cyB0aGUgbWFwcGVkCisgIC8vLyBESUNvbXBvc2l0ZVR5cGUgZm9yIHRoZSBnaXZlbiBPRFIgXGMgSWRlbnRpZmllci4gIElmIG5vbmUgZXhpc3RzLCBjcmVhdGVzCisgIC8vLyBhIG5ldyBub2RlLgorICAvLy8KKyAgLy8vIEVsc2UsIHJldHVybnMgXGMgbnVsbHB0ci4KKyAgc3RhdGljIERJQ29tcG9zaXRlVHlwZSAqCisgIGdldE9EUlR5cGUoTExWTUNvbnRleHQgJkNvbnRleHQsIE1EU3RyaW5nICZJZGVudGlmaWVyLCB1bnNpZ25lZCBUYWcsCisgICAgICAgICAgICAgTURTdHJpbmcgKk5hbWUsIE1ldGFkYXRhICpGaWxlLCB1bnNpZ25lZCBMaW5lLCBNZXRhZGF0YSAqU2NvcGUsCisgICAgICAgICAgICAgTWV0YWRhdGEgKkJhc2VUeXBlLCB1aW50NjRfdCBTaXplSW5CaXRzLCB1aW50MzJfdCBBbGlnbkluQml0cywKKyAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXRJbkJpdHMsIERJRmxhZ3MgRmxhZ3MsIE1ldGFkYXRhICpFbGVtZW50cywKKyAgICAgICAgICAgICB1bnNpZ25lZCBSdW50aW1lTGFuZywgTWV0YWRhdGEgKlZUYWJsZUhvbGRlciwKKyAgICAgICAgICAgICBNZXRhZGF0YSAqVGVtcGxhdGVQYXJhbXMsIE1ldGFkYXRhICpEaXNjcmltaW5hdG9yKTsKKyAgc3RhdGljIERJQ29tcG9zaXRlVHlwZSAqZ2V0T0RSVHlwZUlmRXhpc3RzKExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTURTdHJpbmcgJklkZW50aWZpZXIpOworCisgIC8vLyBCdWlsZCBhIERJQ29tcG9zaXRlVHlwZSB3aXRoIHRoZSBnaXZlbiBPRFIgaWRlbnRpZmllci4KKyAgLy8vCisgIC8vLyBMb29rcyB1cCB0aGUgbWFwcGVkIERJQ29tcG9zaXRlVHlwZSBmb3IgdGhlIGdpdmVuIE9EUiBcYyBJZGVudGlmaWVyLiAgSWYKKyAgLy8vIGl0IGRvZXNuJ3QgZXhpc3QsIGNyZWF0ZXMgYSBuZXcgb25lLiAgSWYgaXQgZG9lcyBleGlzdCBhbmQgXGEKKyAgLy8vIGlzRm9yd2FyZERlY2woKSwgYW5kIHRoZSBuZXcgYXJndW1lbnRzIHdvdWxkIGJlIGEgZGVmaW5pdGlvbiwgbXV0YXRlcyB0aGUKKyAgLy8vIHRoZSB0eXBlIGluIHBsYWNlLiAgSW4gZWl0aGVyIGNhc2UsIHJldHVybnMgdGhlIHR5cGUuCisgIC8vLworICAvLy8gSWYgbm90IFxhIExMVk1Db250ZXh0Ojppc09EUlVuaXF1aW5nRGVidWdUeXBlcygpLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMKKyAgLy8vIG51bGxwdHIuCisgIHN0YXRpYyBESUNvbXBvc2l0ZVR5cGUgKgorICBidWlsZE9EUlR5cGUoTExWTUNvbnRleHQgJkNvbnRleHQsIE1EU3RyaW5nICZJZGVudGlmaWVyLCB1bnNpZ25lZCBUYWcsCisgICAgICAgICAgICAgICBNRFN0cmluZyAqTmFtZSwgTWV0YWRhdGEgKkZpbGUsIHVuc2lnbmVkIExpbmUsIE1ldGFkYXRhICpTY29wZSwKKyAgICAgICAgICAgICAgIE1ldGFkYXRhICpCYXNlVHlwZSwgdWludDY0X3QgU2l6ZUluQml0cywgdWludDMyX3QgQWxpZ25JbkJpdHMsCisgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXRJbkJpdHMsIERJRmxhZ3MgRmxhZ3MsIE1ldGFkYXRhICpFbGVtZW50cywKKyAgICAgICAgICAgICAgIHVuc2lnbmVkIFJ1bnRpbWVMYW5nLCBNZXRhZGF0YSAqVlRhYmxlSG9sZGVyLAorICAgICAgICAgICAgICAgTWV0YWRhdGEgKlRlbXBsYXRlUGFyYW1zLCBNZXRhZGF0YSAqRGlzY3JpbWluYXRvcik7CisKKyAgRElUeXBlUmVmIGdldEJhc2VUeXBlKCkgY29uc3QgeyByZXR1cm4gRElUeXBlUmVmKGdldFJhd0Jhc2VUeXBlKCkpOyB9CisgIERJTm9kZUFycmF5IGdldEVsZW1lbnRzKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8TURUdXBsZT4oZ2V0UmF3RWxlbWVudHMoKSk7CisgIH0KKyAgRElUeXBlUmVmIGdldFZUYWJsZUhvbGRlcigpIGNvbnN0IHsgcmV0dXJuIERJVHlwZVJlZihnZXRSYXdWVGFibGVIb2xkZXIoKSk7IH0KKyAgRElUZW1wbGF0ZVBhcmFtZXRlckFycmF5IGdldFRlbXBsYXRlUGFyYW1zKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8TURUdXBsZT4oZ2V0UmF3VGVtcGxhdGVQYXJhbXMoKSk7CisgIH0KKyAgU3RyaW5nUmVmIGdldElkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBnZXRTdHJpbmdPcGVyYW5kKDcpOyB9CisgIHVuc2lnbmVkIGdldFJ1bnRpbWVMYW5nKCkgY29uc3QgeyByZXR1cm4gUnVudGltZUxhbmc7IH0KKworICBNZXRhZGF0YSAqZ2V0UmF3QmFzZVR5cGUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDMpOyB9CisgIE1ldGFkYXRhICpnZXRSYXdFbGVtZW50cygpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoNCk7IH0KKyAgTWV0YWRhdGEgKmdldFJhd1ZUYWJsZUhvbGRlcigpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoNSk7IH0KKyAgTWV0YWRhdGEgKmdldFJhd1RlbXBsYXRlUGFyYW1zKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCg2KTsgfQorICBNRFN0cmluZyAqZ2V0UmF3SWRlbnRpZmllcigpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmRBczxNRFN0cmluZz4oNyk7IH0KKyAgTWV0YWRhdGEgKmdldFJhd0Rpc2NyaW1pbmF0b3IoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDgpOyB9CisgIERJRGVyaXZlZFR5cGUgKmdldERpc2NyaW1pbmF0b3IoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kQXM8RElEZXJpdmVkVHlwZT4oOCk7IH0KKworICAvLy8gUmVwbGFjZSBvcGVyYW5kcy4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIFxhIGlzVW5pcXVlZCgpIGFuZCBub3QgXGEgaXNSZXNvbHZlZCgpLCBvbiBhIHVuaXF1aW5nIGNvbGxpc2lvbgorICAvLy8gdGhpcyB3aWxsIGJlIFJBVVcnZWQgYW5kIGRlbGV0ZWQuICBVc2UgYSBcYSBUcmFja2luZ01EUmVmIHRvIGtlZXAgdHJhY2sKKyAgLy8vIG9mIGl0cyBtb3ZlbWVudCBpZiBuZWNlc3NhcnkuCisgIC8vLyBAeworICB2b2lkIHJlcGxhY2VFbGVtZW50cyhESU5vZGVBcnJheSBFbGVtZW50cykgeworI2lmbmRlZiBOREVCVUcKKyAgICBmb3IgKERJTm9kZSAqT3AgOiBnZXRFbGVtZW50cygpKQorICAgICAgYXNzZXJ0KGlzX2NvbnRhaW5lZChFbGVtZW50cy0+b3BlcmFuZHMoKSwgT3ApICYmCisgICAgICAgICAgICAgIkxvc3QgYSBtZW1iZXIgZHVyaW5nIG1lbWJlciBsaXN0IHJlcGxhY2VtZW50Iik7CisjZW5kaWYKKyAgICByZXBsYWNlT3BlcmFuZFdpdGgoNCwgRWxlbWVudHMuZ2V0KCkpOworICB9CisKKyAgdm9pZCByZXBsYWNlVlRhYmxlSG9sZGVyKERJVHlwZVJlZiBWVGFibGVIb2xkZXIpIHsKKyAgICByZXBsYWNlT3BlcmFuZFdpdGgoNSwgVlRhYmxlSG9sZGVyKTsKKyAgfQorCisgIHZvaWQgcmVwbGFjZVRlbXBsYXRlUGFyYW1zKERJVGVtcGxhdGVQYXJhbWV0ZXJBcnJheSBUZW1wbGF0ZVBhcmFtcykgeworICAgIHJlcGxhY2VPcGVyYW5kV2l0aCg2LCBUZW1wbGF0ZVBhcmFtcy5nZXQoKSk7CisgIH0KKyAgLy8vIEB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBESUNvbXBvc2l0ZVR5cGVLaW5kOworICB9Cit9OworCisvLy8gVHlwZSBhcnJheSBmb3IgYSBzdWJwcm9ncmFtLgorLy8vCisvLy8gVE9ETzogRm9sZCB0aGUgYXJyYXkgb2YgdHlwZXMgaW4gZGlyZWN0bHkgYXMgb3BlcmFuZHMuCitjbGFzcyBESVN1YnJvdXRpbmVUeXBlIDogcHVibGljIERJVHlwZSB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBNRE5vZGU7CisKKyAgLy8vIFRoZSBjYWxsaW5nIGNvbnZlbnRpb24gdXNlZCB3aXRoIERXX0FUX2NhbGxpbmdfY29udmVudGlvbi4gQWN0dWFsbHkgb2YKKyAgLy8vIHR5cGUgZHdhcmY6OkNhbGxpbmdDb252ZW50aW9uLgorICB1aW50OF90IENDOworCisgIERJU3Vicm91dGluZVR5cGUoTExWTUNvbnRleHQgJkMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIERJRmxhZ3MgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgdWludDhfdCBDQywgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzKQorICAgICAgOiBESVR5cGUoQywgRElTdWJyb3V0aW5lVHlwZUtpbmQsIFN0b3JhZ2UsIGR3YXJmOjpEV19UQUdfc3Vicm91dGluZV90eXBlLAorICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgRmxhZ3MsIE9wcyksCisgICAgICAgIENDKENDKSB7fQorICB+RElTdWJyb3V0aW5lVHlwZSgpID0gZGVmYXVsdDsKKworICBzdGF0aWMgRElTdWJyb3V0aW5lVHlwZSAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgRElGbGFncyBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBDQywgRElUeXBlUmVmQXJyYXkgVHlwZUFycmF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVHlwZSBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpIHsKKyAgICByZXR1cm4gZ2V0SW1wbChDb250ZXh0LCBGbGFncywgQ0MsIFR5cGVBcnJheS5nZXQoKSwgU3RvcmFnZSwgU2hvdWxkQ3JlYXRlKTsKKyAgfQorICBzdGF0aWMgRElTdWJyb3V0aW5lVHlwZSAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgRElGbGFncyBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBDQywgTWV0YWRhdGEgKlR5cGVBcnJheSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wRElTdWJyb3V0aW5lVHlwZSBjbG9uZUltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeShnZXRDb250ZXh0KCksIGdldEZsYWdzKCksIGdldENDKCksIGdldFR5cGVBcnJheSgpKTsKKyAgfQorCitwdWJsaWM6CisgIERFRklORV9NRE5PREVfR0VUKERJU3Vicm91dGluZVR5cGUsCisgICAgICAgICAgICAgICAgICAgIChESUZsYWdzIEZsYWdzLCB1aW50OF90IENDLCBESVR5cGVSZWZBcnJheSBUeXBlQXJyYXkpLAorICAgICAgICAgICAgICAgICAgICAoRmxhZ3MsIENDLCBUeXBlQXJyYXkpKQorICBERUZJTkVfTUROT0RFX0dFVChESVN1YnJvdXRpbmVUeXBlLAorICAgICAgICAgICAgICAgICAgICAoRElGbGFncyBGbGFncywgdWludDhfdCBDQywgTWV0YWRhdGEgKlR5cGVBcnJheSksCisgICAgICAgICAgICAgICAgICAgIChGbGFncywgQ0MsIFR5cGVBcnJheSkpCisKKyAgVGVtcERJU3Vicm91dGluZVR5cGUgY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCisgIHVpbnQ4X3QgZ2V0Q0MoKSBjb25zdCB7IHJldHVybiBDQzsgfQorCisgIERJVHlwZVJlZkFycmF5IGdldFR5cGVBcnJheSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPE1EVHVwbGU+KGdldFJhd1R5cGVBcnJheSgpKTsKKyAgfQorCisgIE1ldGFkYXRhICpnZXRSYXdUeXBlQXJyYXkoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDMpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBESVN1YnJvdXRpbmVUeXBlS2luZDsKKyAgfQorfTsKKworLy8vIENvbXBpbGUgdW5pdC4KK2NsYXNzIERJQ29tcGlsZVVuaXQgOiBwdWJsaWMgRElTY29wZSB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBNRE5vZGU7CisKK3B1YmxpYzoKKyAgZW51bSBEZWJ1Z0VtaXNzaW9uS2luZCA6IHVuc2lnbmVkIHsKKyAgICBOb0RlYnVnID0gMCwKKyAgICBGdWxsRGVidWcsCisgICAgTGluZVRhYmxlc09ubHksCisgICAgTGFzdEVtaXNzaW9uS2luZCA9IExpbmVUYWJsZXNPbmx5CisgIH07CisKKyAgc3RhdGljIE9wdGlvbmFsPERlYnVnRW1pc3Npb25LaW5kPiBnZXRFbWlzc2lvbktpbmQoU3RyaW5nUmVmIFN0cik7CisgIHN0YXRpYyBjb25zdCBjaGFyICpFbWlzc2lvbktpbmRTdHJpbmcoRGVidWdFbWlzc2lvbktpbmQgRUspOworCitwcml2YXRlOgorICB1bnNpZ25lZCBTb3VyY2VMYW5ndWFnZTsKKyAgYm9vbCBJc09wdGltaXplZDsKKyAgdW5zaWduZWQgUnVudGltZVZlcnNpb247CisgIHVuc2lnbmVkIEVtaXNzaW9uS2luZDsKKyAgdWludDY0X3QgRFdPSWQ7CisgIGJvb2wgU3BsaXREZWJ1Z0lubGluaW5nOworICBib29sIERlYnVnSW5mb0ZvclByb2ZpbGluZzsKKyAgYm9vbCBHbnVQdWJuYW1lczsKKworICBESUNvbXBpbGVVbml0KExMVk1Db250ZXh0ICZDLCBTdG9yYWdlVHlwZSBTdG9yYWdlLCB1bnNpZ25lZCBTb3VyY2VMYW5ndWFnZSwKKyAgICAgICAgICAgICAgICBib29sIElzT3B0aW1pemVkLCB1bnNpZ25lZCBSdW50aW1lVmVyc2lvbiwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBFbWlzc2lvbktpbmQsIHVpbnQ2NF90IERXT0lkLCBib29sIFNwbGl0RGVidWdJbmxpbmluZywKKyAgICAgICAgICAgICAgICBib29sIERlYnVnSW5mb0ZvclByb2ZpbGluZywgYm9vbCBHbnVQdWJuYW1lcywgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzKQorICAgICAgOiBESVNjb3BlKEMsIERJQ29tcGlsZVVuaXRLaW5kLCBTdG9yYWdlLCBkd2FyZjo6RFdfVEFHX2NvbXBpbGVfdW5pdCwgT3BzKSwKKyAgICAgICAgU291cmNlTGFuZ3VhZ2UoU291cmNlTGFuZ3VhZ2UpLCBJc09wdGltaXplZChJc09wdGltaXplZCksCisgICAgICAgIFJ1bnRpbWVWZXJzaW9uKFJ1bnRpbWVWZXJzaW9uKSwgRW1pc3Npb25LaW5kKEVtaXNzaW9uS2luZCksCisgICAgICAgIERXT0lkKERXT0lkKSwgU3BsaXREZWJ1Z0lubGluaW5nKFNwbGl0RGVidWdJbmxpbmluZyksCisgICAgICAgIERlYnVnSW5mb0ZvclByb2ZpbGluZyhEZWJ1Z0luZm9Gb3JQcm9maWxpbmcpLCBHbnVQdWJuYW1lcyhHbnVQdWJuYW1lcykgeworICAgIGFzc2VydChTdG9yYWdlICE9IFVuaXF1ZWQpOworICB9CisgIH5ESUNvbXBpbGVVbml0KCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBESUNvbXBpbGVVbml0ICoKKyAgZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgdW5zaWduZWQgU291cmNlTGFuZ3VhZ2UsIERJRmlsZSAqRmlsZSwKKyAgICAgICAgICBTdHJpbmdSZWYgUHJvZHVjZXIsIGJvb2wgSXNPcHRpbWl6ZWQsIFN0cmluZ1JlZiBGbGFncywKKyAgICAgICAgICB1bnNpZ25lZCBSdW50aW1lVmVyc2lvbiwgU3RyaW5nUmVmIFNwbGl0RGVidWdGaWxlbmFtZSwKKyAgICAgICAgICB1bnNpZ25lZCBFbWlzc2lvbktpbmQsIERJQ29tcG9zaXRlVHlwZUFycmF5IEVudW1UeXBlcywKKyAgICAgICAgICBESVNjb3BlQXJyYXkgUmV0YWluZWRUeXBlcywKKyAgICAgICAgICBESUdsb2JhbFZhcmlhYmxlRXhwcmVzc2lvbkFycmF5IEdsb2JhbFZhcmlhYmxlcywKKyAgICAgICAgICBESUltcG9ydGVkRW50aXR5QXJyYXkgSW1wb3J0ZWRFbnRpdGllcywgRElNYWNyb05vZGVBcnJheSBNYWNyb3MsCisgICAgICAgICAgdWludDY0X3QgRFdPSWQsIGJvb2wgU3BsaXREZWJ1Z0lubGluaW5nLCBib29sIERlYnVnSW5mb0ZvclByb2ZpbGluZywKKyAgICAgICAgICBib29sIEdudVB1Ym5hbWVzLCBTdG9yYWdlVHlwZSBTdG9yYWdlLCBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpIHsKKyAgICByZXR1cm4gZ2V0SW1wbCgKKyAgICAgICAgQ29udGV4dCwgU291cmNlTGFuZ3VhZ2UsIEZpbGUsIGdldENhbm9uaWNhbE1EU3RyaW5nKENvbnRleHQsIFByb2R1Y2VyKSwKKyAgICAgICAgSXNPcHRpbWl6ZWQsIGdldENhbm9uaWNhbE1EU3RyaW5nKENvbnRleHQsIEZsYWdzKSwgUnVudGltZVZlcnNpb24sCisgICAgICAgIGdldENhbm9uaWNhbE1EU3RyaW5nKENvbnRleHQsIFNwbGl0RGVidWdGaWxlbmFtZSksIEVtaXNzaW9uS2luZCwKKyAgICAgICAgRW51bVR5cGVzLmdldCgpLCBSZXRhaW5lZFR5cGVzLmdldCgpLCBHbG9iYWxWYXJpYWJsZXMuZ2V0KCksCisgICAgICAgIEltcG9ydGVkRW50aXRpZXMuZ2V0KCksIE1hY3Jvcy5nZXQoKSwgRFdPSWQsIFNwbGl0RGVidWdJbmxpbmluZywKKyAgICAgICAgRGVidWdJbmZvRm9yUHJvZmlsaW5nLCBHbnVQdWJuYW1lcywgU3RvcmFnZSwgU2hvdWxkQ3JlYXRlKTsKKyAgfQorICBzdGF0aWMgRElDb21waWxlVW5pdCAqCisgIGdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIHVuc2lnbmVkIFNvdXJjZUxhbmd1YWdlLCBNZXRhZGF0YSAqRmlsZSwKKyAgICAgICAgICBNRFN0cmluZyAqUHJvZHVjZXIsIGJvb2wgSXNPcHRpbWl6ZWQsIE1EU3RyaW5nICpGbGFncywKKyAgICAgICAgICB1bnNpZ25lZCBSdW50aW1lVmVyc2lvbiwgTURTdHJpbmcgKlNwbGl0RGVidWdGaWxlbmFtZSwKKyAgICAgICAgICB1bnNpZ25lZCBFbWlzc2lvbktpbmQsIE1ldGFkYXRhICpFbnVtVHlwZXMsIE1ldGFkYXRhICpSZXRhaW5lZFR5cGVzLAorICAgICAgICAgIE1ldGFkYXRhICpHbG9iYWxWYXJpYWJsZXMsIE1ldGFkYXRhICpJbXBvcnRlZEVudGl0aWVzLAorICAgICAgICAgIE1ldGFkYXRhICpNYWNyb3MsIHVpbnQ2NF90IERXT0lkLCBib29sIFNwbGl0RGVidWdJbmxpbmluZywKKyAgICAgICAgICBib29sIERlYnVnSW5mb0ZvclByb2ZpbGluZywgYm9vbCBHbnVQdWJuYW1lcywgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgICBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpOworCisgIFRlbXBESUNvbXBpbGVVbml0IGNsb25lSW1wbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGVtcG9yYXJ5KGdldENvbnRleHQoKSwgZ2V0U291cmNlTGFuZ3VhZ2UoKSwgZ2V0RmlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UHJvZHVjZXIoKSwgaXNPcHRpbWl6ZWQoKSwgZ2V0RmxhZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFJ1bnRpbWVWZXJzaW9uKCksIGdldFNwbGl0RGVidWdGaWxlbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RW1pc3Npb25LaW5kKCksIGdldEVudW1UeXBlcygpLCBnZXRSZXRhaW5lZFR5cGVzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRHbG9iYWxWYXJpYWJsZXMoKSwgZ2V0SW1wb3J0ZWRFbnRpdGllcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TWFjcm9zKCksIERXT0lkLCBnZXRTcGxpdERlYnVnSW5saW5pbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldERlYnVnSW5mb0ZvclByb2ZpbGluZygpLCBnZXRHbnVQdWJuYW1lcygpKTsKKyAgfQorCitwdWJsaWM6CisgIHN0YXRpYyB2b2lkIGdldCgpID0gZGVsZXRlOworICBzdGF0aWMgdm9pZCBnZXRJZkV4aXN0cygpID0gZGVsZXRlOworCisgIERFRklORV9NRE5PREVfR0VUX0RJU1RJTkNUX1RFTVBPUkFSWSgKKyAgICAgIERJQ29tcGlsZVVuaXQsCisgICAgICAodW5zaWduZWQgU291cmNlTGFuZ3VhZ2UsIERJRmlsZSAqRmlsZSwgU3RyaW5nUmVmIFByb2R1Y2VyLAorICAgICAgIGJvb2wgSXNPcHRpbWl6ZWQsIFN0cmluZ1JlZiBGbGFncywgdW5zaWduZWQgUnVudGltZVZlcnNpb24sCisgICAgICAgU3RyaW5nUmVmIFNwbGl0RGVidWdGaWxlbmFtZSwgRGVidWdFbWlzc2lvbktpbmQgRW1pc3Npb25LaW5kLAorICAgICAgIERJQ29tcG9zaXRlVHlwZUFycmF5IEVudW1UeXBlcywgRElTY29wZUFycmF5IFJldGFpbmVkVHlwZXMsCisgICAgICAgRElHbG9iYWxWYXJpYWJsZUV4cHJlc3Npb25BcnJheSBHbG9iYWxWYXJpYWJsZXMsCisgICAgICAgRElJbXBvcnRlZEVudGl0eUFycmF5IEltcG9ydGVkRW50aXRpZXMsIERJTWFjcm9Ob2RlQXJyYXkgTWFjcm9zLAorICAgICAgIHVpbnQ2NF90IERXT0lkLCBib29sIFNwbGl0RGVidWdJbmxpbmluZywgYm9vbCBEZWJ1Z0luZm9Gb3JQcm9maWxpbmcsCisgICAgICAgYm9vbCBHbnVQdWJuYW1lcyksCisgICAgICAoU291cmNlTGFuZ3VhZ2UsIEZpbGUsIFByb2R1Y2VyLCBJc09wdGltaXplZCwgRmxhZ3MsIFJ1bnRpbWVWZXJzaW9uLAorICAgICAgIFNwbGl0RGVidWdGaWxlbmFtZSwgRW1pc3Npb25LaW5kLCBFbnVtVHlwZXMsIFJldGFpbmVkVHlwZXMsCisgICAgICAgR2xvYmFsVmFyaWFibGVzLCBJbXBvcnRlZEVudGl0aWVzLCBNYWNyb3MsIERXT0lkLCBTcGxpdERlYnVnSW5saW5pbmcsCisgICAgICAgRGVidWdJbmZvRm9yUHJvZmlsaW5nLCBHbnVQdWJuYW1lcykpCisgIERFRklORV9NRE5PREVfR0VUX0RJU1RJTkNUX1RFTVBPUkFSWSgKKyAgICAgIERJQ29tcGlsZVVuaXQsCisgICAgICAodW5zaWduZWQgU291cmNlTGFuZ3VhZ2UsIE1ldGFkYXRhICpGaWxlLCBNRFN0cmluZyAqUHJvZHVjZXIsCisgICAgICAgYm9vbCBJc09wdGltaXplZCwgTURTdHJpbmcgKkZsYWdzLCB1bnNpZ25lZCBSdW50aW1lVmVyc2lvbiwKKyAgICAgICBNRFN0cmluZyAqU3BsaXREZWJ1Z0ZpbGVuYW1lLCB1bnNpZ25lZCBFbWlzc2lvbktpbmQsIE1ldGFkYXRhICpFbnVtVHlwZXMsCisgICAgICAgTWV0YWRhdGEgKlJldGFpbmVkVHlwZXMsIE1ldGFkYXRhICpHbG9iYWxWYXJpYWJsZXMsCisgICAgICAgTWV0YWRhdGEgKkltcG9ydGVkRW50aXRpZXMsIE1ldGFkYXRhICpNYWNyb3MsIHVpbnQ2NF90IERXT0lkLAorICAgICAgIGJvb2wgU3BsaXREZWJ1Z0lubGluaW5nLCBib29sIERlYnVnSW5mb0ZvclByb2ZpbGluZywgYm9vbCBHbnVQdWJuYW1lcyksCisgICAgICAoU291cmNlTGFuZ3VhZ2UsIEZpbGUsIFByb2R1Y2VyLCBJc09wdGltaXplZCwgRmxhZ3MsIFJ1bnRpbWVWZXJzaW9uLAorICAgICAgIFNwbGl0RGVidWdGaWxlbmFtZSwgRW1pc3Npb25LaW5kLCBFbnVtVHlwZXMsIFJldGFpbmVkVHlwZXMsCisgICAgICAgR2xvYmFsVmFyaWFibGVzLCBJbXBvcnRlZEVudGl0aWVzLCBNYWNyb3MsIERXT0lkLCBTcGxpdERlYnVnSW5saW5pbmcsCisgICAgICAgRGVidWdJbmZvRm9yUHJvZmlsaW5nLCBHbnVQdWJuYW1lcykpCisKKyAgVGVtcERJQ29tcGlsZVVuaXQgY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCisgIHVuc2lnbmVkIGdldFNvdXJjZUxhbmd1YWdlKCkgY29uc3QgeyByZXR1cm4gU291cmNlTGFuZ3VhZ2U7IH0KKyAgYm9vbCBpc09wdGltaXplZCgpIGNvbnN0IHsgcmV0dXJuIElzT3B0aW1pemVkOyB9CisgIHVuc2lnbmVkIGdldFJ1bnRpbWVWZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gUnVudGltZVZlcnNpb247IH0KKyAgRGVidWdFbWlzc2lvbktpbmQgZ2V0RW1pc3Npb25LaW5kKCkgY29uc3QgeworICAgIHJldHVybiAoRGVidWdFbWlzc2lvbktpbmQpRW1pc3Npb25LaW5kOworICB9CisgIGJvb2wgZ2V0RGVidWdJbmZvRm9yUHJvZmlsaW5nKCkgY29uc3QgeyByZXR1cm4gRGVidWdJbmZvRm9yUHJvZmlsaW5nOyB9CisgIGJvb2wgZ2V0R251UHVibmFtZXMoKSBjb25zdCB7IHJldHVybiBHbnVQdWJuYW1lczsgfQorICBTdHJpbmdSZWYgZ2V0UHJvZHVjZXIoKSBjb25zdCB7IHJldHVybiBnZXRTdHJpbmdPcGVyYW5kKDEpOyB9CisgIFN0cmluZ1JlZiBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZ09wZXJhbmQoMik7IH0KKyAgU3RyaW5nUmVmIGdldFNwbGl0RGVidWdGaWxlbmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZ09wZXJhbmQoMyk7IH0KKyAgRElDb21wb3NpdGVUeXBlQXJyYXkgZ2V0RW51bVR5cGVzKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8TURUdXBsZT4oZ2V0UmF3RW51bVR5cGVzKCkpOworICB9CisgIERJU2NvcGVBcnJheSBnZXRSZXRhaW5lZFR5cGVzKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8TURUdXBsZT4oZ2V0UmF3UmV0YWluZWRUeXBlcygpKTsKKyAgfQorICBESUdsb2JhbFZhcmlhYmxlRXhwcmVzc2lvbkFycmF5IGdldEdsb2JhbFZhcmlhYmxlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPE1EVHVwbGU+KGdldFJhd0dsb2JhbFZhcmlhYmxlcygpKTsKKyAgfQorICBESUltcG9ydGVkRW50aXR5QXJyYXkgZ2V0SW1wb3J0ZWRFbnRpdGllcygpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPE1EVHVwbGU+KGdldFJhd0ltcG9ydGVkRW50aXRpZXMoKSk7CisgIH0KKyAgRElNYWNyb05vZGVBcnJheSBnZXRNYWNyb3MoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxNRFR1cGxlPihnZXRSYXdNYWNyb3MoKSk7CisgIH0KKyAgdWludDY0X3QgZ2V0RFdPSWQoKSBjb25zdCB7IHJldHVybiBEV09JZDsgfQorICB2b2lkIHNldERXT0lkKHVpbnQ2NF90IER3b0lkKSB7IERXT0lkID0gRHdvSWQ7IH0KKyAgYm9vbCBnZXRTcGxpdERlYnVnSW5saW5pbmcoKSBjb25zdCB7IHJldHVybiBTcGxpdERlYnVnSW5saW5pbmc7IH0KKyAgdm9pZCBzZXRTcGxpdERlYnVnSW5saW5pbmcoYm9vbCBTcGxpdERlYnVnSW5saW5pbmcpIHsKKyAgICB0aGlzLT5TcGxpdERlYnVnSW5saW5pbmcgPSBTcGxpdERlYnVnSW5saW5pbmc7CisgIH0KKworICBNRFN0cmluZyAqZ2V0UmF3UHJvZHVjZXIoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kQXM8TURTdHJpbmc+KDEpOyB9CisgIE1EU3RyaW5nICpnZXRSYXdGbGFncygpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmRBczxNRFN0cmluZz4oMik7IH0KKyAgTURTdHJpbmcgKmdldFJhd1NwbGl0RGVidWdGaWxlbmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZEFzPE1EU3RyaW5nPigzKTsKKyAgfQorICBNZXRhZGF0YSAqZ2V0UmF3RW51bVR5cGVzKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCg0KTsgfQorICBNZXRhZGF0YSAqZ2V0UmF3UmV0YWluZWRUeXBlcygpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoNSk7IH0KKyAgTWV0YWRhdGEgKmdldFJhd0dsb2JhbFZhcmlhYmxlcygpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoNik7IH0KKyAgTWV0YWRhdGEgKmdldFJhd0ltcG9ydGVkRW50aXRpZXMoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDcpOyB9CisgIE1ldGFkYXRhICpnZXRSYXdNYWNyb3MoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDgpOyB9CisKKyAgLy8vIFJlcGxhY2UgYXJyYXlzLgorICAvLy8KKyAgLy8vIElmIHRoaXMgXGEgaXNVbmlxdWVkKCkgYW5kIG5vdCBcYSBpc1Jlc29sdmVkKCksIGl0IHdpbGwgYmUgUkFVVydlZCBhbmQKKyAgLy8vIGRlbGV0ZWQgb24gYSB1bmlxdWluZyBjb2xsaXNpb24uICBJbiBwcmFjdGljZSwgdW5pcXVpbmcgY29sbGlzaW9ucyBvbiBcYQorICAvLy8gRElDb21waWxlVW5pdCBzaG91bGQgYmUgZmFpcmx5IHJhcmUuCisgIC8vLyBAeworICB2b2lkIHJlcGxhY2VFbnVtVHlwZXMoRElDb21wb3NpdGVUeXBlQXJyYXkgTikgeworICAgIHJlcGxhY2VPcGVyYW5kV2l0aCg0LCBOLmdldCgpKTsKKyAgfQorICB2b2lkIHJlcGxhY2VSZXRhaW5lZFR5cGVzKERJVHlwZUFycmF5IE4pIHsKKyAgICByZXBsYWNlT3BlcmFuZFdpdGgoNSwgTi5nZXQoKSk7CisgIH0KKyAgdm9pZCByZXBsYWNlR2xvYmFsVmFyaWFibGVzKERJR2xvYmFsVmFyaWFibGVFeHByZXNzaW9uQXJyYXkgTikgeworICAgIHJlcGxhY2VPcGVyYW5kV2l0aCg2LCBOLmdldCgpKTsKKyAgfQorICB2b2lkIHJlcGxhY2VJbXBvcnRlZEVudGl0aWVzKERJSW1wb3J0ZWRFbnRpdHlBcnJheSBOKSB7CisgICAgcmVwbGFjZU9wZXJhbmRXaXRoKDcsIE4uZ2V0KCkpOworICB9CisgIHZvaWQgcmVwbGFjZU1hY3JvcyhESU1hY3JvTm9kZUFycmF5IE4pIHsgcmVwbGFjZU9wZXJhbmRXaXRoKDgsIE4uZ2V0KCkpOyB9CisgIC8vLyBAfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElDb21waWxlVW5pdEtpbmQ7CisgIH0KK307CisKKy8vLyBBIHNjb3BlIGZvciBsb2NhbHMuCisvLy8KKy8vLyBBIGxlZ2FsIHNjb3BlIGZvciBsZXhpY2FsIGJsb2NrcywgbG9jYWwgdmFyaWFibGVzLCBhbmQgZGVidWcgaW5mbworLy8vIGxvY2F0aW9ucy4gIFN1YmNsYXNzZXMgYXJlIFxhIERJU3VicHJvZ3JhbSwgXGEgRElMZXhpY2FsQmxvY2ssIGFuZCBcYQorLy8vIERJTGV4aWNhbEJsb2NrRmlsZS4KK2NsYXNzIERJTG9jYWxTY29wZSA6IHB1YmxpYyBESVNjb3BlIHsKK3Byb3RlY3RlZDoKKyAgRElMb2NhbFNjb3BlKExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBJRCwgU3RvcmFnZVR5cGUgU3RvcmFnZSwgdW5zaWduZWQgVGFnLAorICAgICAgICAgICAgICAgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzKQorICAgICAgOiBESVNjb3BlKEMsIElELCBTdG9yYWdlLCBUYWcsIE9wcykge30KKyAgfkRJTG9jYWxTY29wZSgpID0gZGVmYXVsdDsKKworcHVibGljOgorICAvLy8gR2V0IHRoZSBzdWJwcm9ncmFtIGZvciB0aGlzIHNjb3BlLgorICAvLy8KKyAgLy8vIFJldHVybiB0aGlzIGlmIGl0J3MgYW4gXGEgRElTdWJwcm9ncmFtOyBvdGhlcndpc2UsIGxvb2sgdXAgdGhlIHNjb3BlCisgIC8vLyBjaGFpbi4KKyAgRElTdWJwcm9ncmFtICpnZXRTdWJwcm9ncmFtKCkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgZmlyc3Qgbm9uIERJTGV4aWNhbEJsb2NrRmlsZSBzY29wZSBvZiB0aGlzIHNjb3BlLgorICAvLy8KKyAgLy8vIFJldHVybiB0aGlzIGlmIGl0J3Mgbm90IGEgXGEgRElMZXhpY2FsQmxvY2tGSWxlOyBvdGhlcndpc2UsIGxvb2sgdXAgdGhlCisgIC8vLyBzY29wZSBjaGFpbi4KKyAgRElMb2NhbFNjb3BlICpnZXROb25MZXhpY2FsQmxvY2tGaWxlU2NvcGUoKSBjb25zdDsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJU3VicHJvZ3JhbUtpbmQgfHwKKyAgICAgICAgICAgTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBESUxleGljYWxCbG9ja0tpbmQgfHwKKyAgICAgICAgICAgTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBESUxleGljYWxCbG9ja0ZpbGVLaW5kOworICB9Cit9OworCisvLy8gRGVidWcgbG9jYXRpb24uCisvLy8KKy8vLyBBIGRlYnVnIGxvY2F0aW9uIGluIHNvdXJjZSBjb2RlLCB1c2VkIGZvciBkZWJ1ZyBpbmZvIGFuZCBvdGhlcndpc2UuCitjbGFzcyBESUxvY2F0aW9uIDogcHVibGljIE1ETm9kZSB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBNRE5vZGU7CisKKyAgRElMb2NhdGlvbihMTFZNQ29udGV4dCAmQywgU3RvcmFnZVR5cGUgU3RvcmFnZSwgdW5zaWduZWQgTGluZSwKKyAgICAgICAgICAgICB1bnNpZ25lZCBDb2x1bW4sIEFycmF5UmVmPE1ldGFkYXRhICo+IE1Ecyk7CisgIH5ESUxvY2F0aW9uKCkgeyBkcm9wQWxsUmVmZXJlbmNlcygpOyB9CisKKyAgc3RhdGljIERJTG9jYXRpb24gKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbHVtbiwgTWV0YWRhdGEgKlNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSAqSW5saW5lZEF0LCBTdG9yYWdlVHlwZSBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpOworICBzdGF0aWMgRElMb2NhdGlvbiAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgdW5zaWduZWQgTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sdW1uLCBESUxvY2FsU2NvcGUgKlNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUxvY2F0aW9uICpJbmxpbmVkQXQsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSkgeworICAgIHJldHVybiBnZXRJbXBsKENvbnRleHQsIExpbmUsIENvbHVtbiwgc3RhdGljX2Nhc3Q8TWV0YWRhdGEgKj4oU2NvcGUpLAorICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PE1ldGFkYXRhICo+KElubGluZWRBdCksIFN0b3JhZ2UsIFNob3VsZENyZWF0ZSk7CisgIH0KKworICAvLy8gV2l0aCBhIGdpdmVuIHVuc2lnbmVkIGludCBccCBVLCB1c2UgdXAgdG8gMTMgYml0cyB0byByZXByZXNlbnQgaXQuCisgIC8vLyBvbGRfYml0IDF+NSAgLS0+IG5ld19iaXQgMX41CisgIC8vLyBvbGRfYml0IDZ+MTIgLS0+IG5ld19iaXQgN34xMworICAvLy8gbmV3X2JpdF82IGlzIDAgaWYgaGlnaGVyIGJpdHMgKDd+MTMpIGFyZSBhbGwgMAorICBzdGF0aWMgdW5zaWduZWQgZ2V0UHJlZml4RW5jb2RpbmdGcm9tVW5zaWduZWQodW5zaWduZWQgVSkgeworICAgIFUgJj0gMHhmZmY7CisgICAgcmV0dXJuIFUgPiAweDFmID8gKCgoVSAmIDB4ZmUwKSA8PCAxKSB8IChVICYgMHgxZikgfCAweDIwKSA6IFU7CisgIH0KKworICAvLy8gUmV2ZXJzZSB0cmFuc2Zvcm1hdGlvbiBhcyBnZXRQcmVmaXhFbmNvZGluZ0Zyb21VbnNpZ25lZC4KKyAgc3RhdGljIHVuc2lnbmVkIGdldFVuc2lnbmVkRnJvbVByZWZpeEVuY29kaW5nKHVuc2lnbmVkIFUpIHsKKyAgICByZXR1cm4gKFUgJiAweDIwKSA/ICgoKFUgPj4gMSkgJiAweGZlMCkgfCAoVSAmIDB4MWYpKSA6IChVICYgMHgxZik7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbmV4dCBjb21wb25lbnQgc3RvcmVkIGluIGRpc2NyaW1pbmF0b3IuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXROZXh0Q29tcG9uZW50SW5EaXNjcmltaW5hdG9yKHVuc2lnbmVkIEQpIHsKKyAgICBpZiAoKEQgJiAxKSA9PSAwKQorICAgICAgcmV0dXJuIEQgPj4gKChEICYgMHg0MCkgPyAxNCA6IDcpOworICAgIGVsc2UKKyAgICAgIHJldHVybiBEID4+IDE7CisgIH0KKworICBUZW1wRElMb2NhdGlvbiBjbG9uZUltcGwoKSBjb25zdCB7CisgICAgLy8gR2V0IHRoZSByYXcgc2NvcGUvaW5saW5lZEF0IHNpbmNlIGl0IGlzIHBvc3NpYmxlIHRvIGludm9rZSB0aGlzIG9uCisgICAgLy8gYSBESUxvY2F0aW9uIGNvbnRhaW5pbmcgdGVtcG9yYXJ5IG1ldGFkYXRhLgorICAgIHJldHVybiBnZXRUZW1wb3JhcnkoZ2V0Q29udGV4dCgpLCBnZXRMaW5lKCksIGdldENvbHVtbigpLCBnZXRSYXdTY29wZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0UmF3SW5saW5lZEF0KCkpOworICB9CisKK3B1YmxpYzoKKyAgLy8gRGlzYWxsb3cgcmVwbGFjaW5nIG9wZXJhbmRzLgorICB2b2lkIHJlcGxhY2VPcGVyYW5kV2l0aCh1bnNpZ25lZCBJLCBNZXRhZGF0YSAqTmV3KSA9IGRlbGV0ZTsKKworICBERUZJTkVfTUROT0RFX0dFVChESUxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgTGluZSwgdW5zaWduZWQgQ29sdW1uLCBNZXRhZGF0YSAqU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSAqSW5saW5lZEF0ID0gbnVsbHB0ciksCisgICAgICAgICAgICAgICAgICAgIChMaW5lLCBDb2x1bW4sIFNjb3BlLCBJbmxpbmVkQXQpKQorICBERUZJTkVfTUROT0RFX0dFVChESUxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgTGluZSwgdW5zaWduZWQgQ29sdW1uLCBESUxvY2FsU2NvcGUgKlNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgRElMb2NhdGlvbiAqSW5saW5lZEF0ID0gbnVsbHB0ciksCisgICAgICAgICAgICAgICAgICAgIChMaW5lLCBDb2x1bW4sIFNjb3BlLCBJbmxpbmVkQXQpKQorCisgIC8vLyBSZXR1cm4gYSAodGVtcG9yYXJ5KSBjbG9uZSBvZiB0aGlzLgorICBUZW1wRElMb2NhdGlvbiBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIGNsb25lSW1wbCgpOyB9CisKKyAgdW5zaWduZWQgZ2V0TGluZSgpIGNvbnN0IHsgcmV0dXJuIFN1YmNsYXNzRGF0YTMyOyB9CisgIHVuc2lnbmVkIGdldENvbHVtbigpIGNvbnN0IHsgcmV0dXJuIFN1YmNsYXNzRGF0YTE2OyB9CisgIERJTG9jYWxTY29wZSAqZ2V0U2NvcGUoKSBjb25zdCB7IHJldHVybiBjYXN0PERJTG9jYWxTY29wZT4oZ2V0UmF3U2NvcGUoKSk7IH0KKworICBESUxvY2F0aW9uICpnZXRJbmxpbmVkQXQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxESUxvY2F0aW9uPihnZXRSYXdJbmxpbmVkQXQoKSk7CisgIH0KKworICBESUZpbGUgKmdldEZpbGUoKSBjb25zdCB7IHJldHVybiBnZXRTY29wZSgpLT5nZXRGaWxlKCk7IH0KKyAgU3RyaW5nUmVmIGdldEZpbGVuYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0U2NvcGUoKS0+Z2V0RmlsZW5hbWUoKTsgfQorICBTdHJpbmdSZWYgZ2V0RGlyZWN0b3J5KCkgY29uc3QgeyByZXR1cm4gZ2V0U2NvcGUoKS0+Z2V0RGlyZWN0b3J5KCk7IH0KKyAgT3B0aW9uYWw8U3RyaW5nUmVmPiBnZXRTb3VyY2UoKSBjb25zdCB7IHJldHVybiBnZXRTY29wZSgpLT5nZXRTb3VyY2UoKTsgfQorCisgIC8vLyBHZXQgdGhlIHNjb3BlIHdoZXJlIHRoaXMgaXMgaW5saW5lZC4KKyAgLy8vCisgIC8vLyBXYWxrIHRocm91Z2ggXGEgZ2V0SW5saW5lZEF0KCkgYW5kIHJldHVybiBcYSBnZXRTY29wZSgpIGZyb20gdGhlIGRlZXBlc3QKKyAgLy8vIGxvY2F0aW9uLgorICBESUxvY2FsU2NvcGUgKmdldElubGluZWRBdFNjb3BlKCkgY29uc3QgeworICAgIGlmIChhdXRvICpJQSA9IGdldElubGluZWRBdCgpKQorICAgICAgcmV0dXJuIElBLT5nZXRJbmxpbmVkQXRTY29wZSgpOworICAgIHJldHVybiBnZXRTY29wZSgpOworICB9CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgdGhpcyBjYW4gYmUgZGlzY3JpbWluYXRlZCBmcm9tIGFub3RoZXIgbG9jYXRpb24uCisgIC8vLworICAvLy8gQ2hlY2sgXGMgdGhpcyBjYW4gYmUgZGlzY3JpbWluYXRlZCBmcm9tIFxjIFJIUyBpbiBhIGxpbmV0YWJsZSBlbnRyeS4KKyAgLy8vIFNjb3BlIGFuZCBpbmxpbmVkLWF0IGNoYWlucyBhcmUgbm90IHJlY29yZGVkIGluIHRoZSBsaW5ldGFibGUsIHNvIHRoZXkKKyAgLy8vIGNhbm5vdCBiZSB1c2VkIHRvIGRpc3Rpbmd1aXNoIGJhc2ljIGJsb2Nrcy4KKyAgYm9vbCBjYW5EaXNjcmltaW5hdGUoY29uc3QgRElMb2NhdGlvbiAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIGdldExpbmUoKSAhPSBSSFMuZ2V0TGluZSgpIHx8CisgICAgICAgICAgIGdldENvbHVtbigpICE9IFJIUy5nZXRDb2x1bW4oKSB8fAorICAgICAgICAgICBnZXREaXNjcmltaW5hdG9yKCkgIT0gUkhTLmdldERpc2NyaW1pbmF0b3IoKSB8fAorICAgICAgICAgICBnZXRGaWxlbmFtZSgpICE9IFJIUy5nZXRGaWxlbmFtZSgpIHx8CisgICAgICAgICAgIGdldERpcmVjdG9yeSgpICE9IFJIUy5nZXREaXJlY3RvcnkoKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIERXQVJGIGRpc2NyaW1pbmF0b3IuCisgIC8vLworICAvLy8gRFdBUkYgZGlzY3JpbWluYXRvcnMgZGlzdGluZ3Vpc2ggaWRlbnRpY2FsIGZpbGUgbG9jYXRpb25zIGJldHdlZW4KKyAgLy8vIGluc3RydWN0aW9ucyB0aGF0IGFyZSBvbiBkaWZmZXJlbnQgYmFzaWMgYmxvY2tzLgorICAvLy8KKyAgLy8vIFRoZXJlIGFyZSAzIGNvbXBvbmVudHMgc3RvcmVkIGluIGRpc2NyaW1pbmF0b3IsIGZyb20gbG93ZXIgYml0czoKKyAgLy8vCisgIC8vLyBCYXNlIGRpc2NyaW1pbmF0b3I6IGFzc2lnbmVkIGJ5IEFkZERpc2NyaW1pbmF0b3JzIHBhc3MgdG8gaWRlbnRpZnkgSVJzCisgIC8vLyAgICAgICAgICAgICAgICAgICAgIHRoYXQgYXJlIGRlZmluZWQgYnkgdGhlIHNhbWUgc291cmNlIGxpbmUsIGJ1dAorICAvLy8gICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbnQgYmFzaWMgYmxvY2tzLgorICAvLy8gRHVwbGljYXRpb24gZmFjdG9yOiBhc3NpZ25lZCBieSBvcHRpbWl6YXRpb25zIHRoYXQgd2lsbCBzY2FsZSBkb3duCisgIC8vLyAgICAgICAgICAgICAgICAgICAgIHRoZSBleGVjdXRpb24gZnJlcXVlbmN5IG9mIHRoZSBvcmlnaW5hbCBJUi4KKyAgLy8vIENvcHkgSWRlbnRpZmllcjogYXNzaWduZWQgYnkgb3B0aW1pemF0aW9ucyB0aGF0IGNsb25lcyB0aGUgSVIuCisgIC8vLyAgICAgICAgICAgICAgICAgIEVhY2ggY29weSBvZiB0aGUgSVIgd2lsbCBiZSBhc3NpZ25lZCBhbiBpZGVudGlmaWVyLgorICAvLy8KKyAgLy8vIEVuY29kaW5nOgorICAvLy8KKyAgLy8vIFRoZSBhYm92ZSAzIGNvbXBvbmVudHMgYXJlIGVuY29kZWQgaW50byBhIDMyYml0IHVuc2lnbmVkIGludGVnZXIgaW4KKyAgLy8vIG9yZGVyLiBJZiB0aGUgbG93ZXN0IGJpdCBpcyAxLCB0aGUgY3VycmVudCBjb21wb25lbnQgaXMgZW1wdHksIGFuZCB0aGUKKyAgLy8vIG5leHQgY29tcG9uZW50IHdpbGwgc3RhcnQgaW4gdGhlIG5leHQgYml0LiBPdGhlcndpc2UsIHRoZSBjdXJyZW50CisgIC8vLyBjb21wb25lbnQgaXMgbm9uLWVtcHR5LCBhbmQgaXRzIGNvbnRlbnQgc3RhcnRzIGluIHRoZSBuZXh0IGJpdC4gVGhlCisgIC8vLyBsZW5ndGggb2YgZWFjaCBjb21wb25lbnRzIGlzIGVpdGhlciA1IGJpdCBvciAxMiBiaXQ6IGlmIHRoZSA3dGggYml0CisgIC8vLyBpcyAwLCB0aGUgYml0IDJ+NiAoNSBiaXRzKSBhcmUgdXNlZCB0byByZXByZXNlbnQgdGhlIGNvbXBvbmVudDsgaWYgdGhlCisgIC8vLyA3dGggYml0IGlzIDEsIHRoZSBiaXQgMn42ICg1IGJpdHMpIGFuZCA4fjE0ICg3IGJpdHMpIGFyZSBjb21iaW5lZCB0bworICAvLy8gcmVwcmVzZW50IHRoZSBjb21wb25lbnQuCisKKyAgaW5saW5lIHVuc2lnbmVkIGdldERpc2NyaW1pbmF0b3IoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyBhIG5ldyBESUxvY2F0aW9uIHdpdGggdXBkYXRlZCBccCBEaXNjcmltaW5hdG9yLgorICBpbmxpbmUgY29uc3QgRElMb2NhdGlvbiAqY2xvbmVXaXRoRGlzY3JpbWluYXRvcih1bnNpZ25lZCBEaXNjcmltaW5hdG9yKSBjb25zdDsKKworICAvLy8gUmV0dXJucyBhIG5ldyBESUxvY2F0aW9uIHdpdGggdXBkYXRlZCBiYXNlIGRpc2NyaW1pbmF0b3IgXHAgQkQuCisgIGlubGluZSBjb25zdCBESUxvY2F0aW9uICpzZXRCYXNlRGlzY3JpbWluYXRvcih1bnNpZ25lZCBCRCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIGR1cGxpY2F0aW9uIGZhY3RvciBzdG9yZWQgaW4gdGhlIGRpc2NyaW1pbmF0b3IuCisgIGlubGluZSB1bnNpZ25lZCBnZXREdXBsaWNhdGlvbkZhY3RvcigpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSBjb3B5IGlkZW50aWZpZXIgc3RvcmVkIGluIHRoZSBkaXNjcmltaW5hdG9yLgorICBpbmxpbmUgdW5zaWduZWQgZ2V0Q29weUlkZW50aWZpZXIoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgYmFzZSBkaXNjcmltaW5hdG9yIHN0b3JlZCBpbiB0aGUgZGlzY3JpbWluYXRvci4KKyAgaW5saW5lIHVuc2lnbmVkIGdldEJhc2VEaXNjcmltaW5hdG9yKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgYSBuZXcgRElMb2NhdGlvbiB3aXRoIGR1cGxpY2F0aW9uIGZhY3RvciBccCBERiBlbmNvZGVkIGluIHRoZQorICAvLy8gZGlzY3JpbWluYXRvci4KKyAgaW5saW5lIGNvbnN0IERJTG9jYXRpb24gKmNsb25lV2l0aER1cGxpY2F0aW9uRmFjdG9yKHVuc2lnbmVkIERGKSBjb25zdDsKKworICAvLy8gV2hlbiB0d28gaW5zdHJ1Y3Rpb25zIGFyZSBjb21iaW5lZCBpbnRvIGEgc2luZ2xlIGluc3RydWN0aW9uIHdlIGFsc28KKyAgLy8vIG5lZWQgdG8gY29tYmluZSB0aGUgb3JpZ2luYWwgbG9jYXRpb25zIGludG8gYSBzaW5nbGUgbG9jYXRpb24uCisgIC8vLworICAvLy8gV2hlbiB0aGUgbG9jYXRpb25zIGFyZSB0aGUgc2FtZSB3ZSBjYW4gdXNlIGVpdGhlciBsb2NhdGlvbi4gV2hlbiB0aGV5CisgIC8vLyBkaWZmZXIsIHdlIG5lZWQgYSB0aGlyZCBsb2NhdGlvbiB3aGljaCBpcyBkaXN0aW5jdCBmcm9tIGVpdGhlci4gSWYKKyAgLy8vIHRoZXkgaGF2ZSB0aGUgc2FtZSBmaWxlL2xpbmUgYnV0IGhhdmUgYSBkaWZmZXJlbnQgZGlzY3JpbWluYXRvciB3ZQorICAvLy8gY291bGQgY3JlYXRlIGEgbG9jYXRpb24gd2l0aCBhIG5ldyBkaXNjcmltaW5hdG9yLiBJZiB0aGV5IGFyZSBmcm9tCisgIC8vLyBkaWZmZXJlbnQgZmlsZXMvbGluZXMgdGhlIGxvY2F0aW9uIGlzIGFtYmlndW91cyBhbmQgY2FuJ3QgYmUKKyAgLy8vIHJlcHJlc2VudGVkIGluIGEgc2luZ2xlIGxpbmUgZW50cnkuICBJbiB0aGlzIGNhc2UsIG5vIGxvY2F0aW9uCisgIC8vLyBzaG91bGQgYmUgc2V0LCB1bmxlc3MgdGhlIG1lcmdlZCBpbnN0cnVjdGlvbiBpcyBhIGNhbGwsIHdoaWNoIHdlIHdpbGwKKyAgLy8vIHNldCB0aGUgbWVyZ2VkIGRlYnVnIGxvY2F0aW9uIGFzIGxpbmUgMCBvZiB0aGUgbmVhcmVzdCBjb21tb24gc2NvcGUKKyAgLy8vIHdoZXJlIDIgbG9jYXRpb25zIGFyZSBpbmxpbmVkIGZyb20uIFRoaXMgb25seSBhcHBsaWVzIHRvIEluc3RydWN0aW9uOworICAvLy8gZm9yIE1hY2hpbmVJbnN0cnVjdGlvbiwgYXMgaXQgaXMgcG9zdC1pbmxpbmUsIHdlIHdpbGwgdHJlYXQgdGhlIGNhbGwKKyAgLy8vIGluc3RydWN0aW9uIHRoZSBzYW1lIHdheSBhcyBvdGhlciBpbnN0cnVjdGlvbnMuCisgIC8vLworICAvLy8gXHAgRm9ySW5zdDogVGhlIEluc3RydWN0aW9uIHRoZSBtZXJnZWQgRElMb2NhdGlvbiBpcyBmb3IuIElmIHRoZQorICAvLy8gSW5zdHJ1Y3Rpb24gaXMgdW5hdmFpbGFibGUgb3Igbm9uLWV4aXN0ZW50LCB1c2UgbnVsbHB0ci4KKyAgc3RhdGljIGNvbnN0IERJTG9jYXRpb24gKgorICBnZXRNZXJnZWRMb2NhdGlvbihjb25zdCBESUxvY2F0aW9uICpMb2NBLCBjb25zdCBESUxvY2F0aW9uICpMb2NCLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbiAqRm9ySW5zdCA9IG51bGxwdHIpOworCisgIC8vLyBSZXR1cm5zIHRoZSBiYXNlIGRpc2NyaW1pbmF0b3IgZm9yIGEgZ2l2ZW4gZW5jb2RlZCBkaXNjcmltaW5hdG9yIFxwIEQuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRCYXNlRGlzY3JpbWluYXRvckZyb21EaXNjcmltaW5hdG9yKHVuc2lnbmVkIEQpIHsKKyAgICBpZiAoKEQgJiAxKSA9PSAwKQorICAgICAgcmV0dXJuIGdldFVuc2lnbmVkRnJvbVByZWZpeEVuY29kaW5nKEQgPj4gMSk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgZHVwbGljYXRpb24gZmFjdG9yIGZvciBhIGdpdmVuIGVuY29kZWQgZGlzY3JpbWluYXRvciBccCBELgorICBzdGF0aWMgdW5zaWduZWQgZ2V0RHVwbGljYXRpb25GYWN0b3JGcm9tRGlzY3JpbWluYXRvcih1bnNpZ25lZCBEKSB7CisgICAgRCA9IGdldE5leHRDb21wb25lbnRJbkRpc2NyaW1pbmF0b3IoRCk7CisgICAgaWYgKEQgPT0gMCB8fCAoRCAmIDEpKQorICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGdldFVuc2lnbmVkRnJvbVByZWZpeEVuY29kaW5nKEQgPj4gMSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgY29weSBpZGVudGlmaWVyIGZvciBhIGdpdmVuIGVuY29kZWQgZGlzY3JpbWluYXRvciBccCBELgorICBzdGF0aWMgdW5zaWduZWQgZ2V0Q29weUlkZW50aWZpZXJGcm9tRGlzY3JpbWluYXRvcih1bnNpZ25lZCBEKSB7CisgICAgcmV0dXJuIGdldFVuc2lnbmVkRnJvbVByZWZpeEVuY29kaW5nKGdldE5leHRDb21wb25lbnRJbkRpc2NyaW1pbmF0b3IoCisgICAgICAgIGdldE5leHRDb21wb25lbnRJbkRpc2NyaW1pbmF0b3IoRCkpKTsKKyAgfQorCisKKyAgTWV0YWRhdGEgKmdldFJhd1Njb3BlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorICBNZXRhZGF0YSAqZ2V0UmF3SW5saW5lZEF0KCkgY29uc3QgeworICAgIGlmIChnZXROdW1PcGVyYW5kcygpID09IDIpCisgICAgICByZXR1cm4gZ2V0T3BlcmFuZCgxKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElMb2NhdGlvbktpbmQ7CisgIH0KK307CisKKy8vLyBTdWJwcm9ncmFtIGRlc2NyaXB0aW9uLgorLy8vCisvLy8gVE9ETzogUmVtb3ZlIERpc3BsYXlOYW1lLiAgSXQncyBhbHdheXMgZXF1YWwgdG8gTmFtZS4KKy8vLyBUT0RPOiBTcGxpdCB1cCBmbGFncy4KK2NsYXNzIERJU3VicHJvZ3JhbSA6IHB1YmxpYyBESUxvY2FsU2NvcGUgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCisgIHVuc2lnbmVkIExpbmU7CisgIHVuc2lnbmVkIFNjb3BlTGluZTsKKyAgdW5zaWduZWQgVmlydHVhbEluZGV4OworCisgIC8vLyBJbiB0aGUgTVMgQUJJLCB0aGUgaW1wbGljaXQgJ3RoaXMnIHBhcmFtZXRlciBpcyBhZGp1c3RlZCBpbiB0aGUgcHJvbG9ndWUKKyAgLy8vIG9mIG1ldGhvZCBvdmVycmlkZXMgZnJvbSBzZWNvbmRhcnkgYmFzZXMgYnkgdGhpcyBhbW91bnQuIEl0IG1heSBiZQorICAvLy8gbmVnYXRpdmUuCisgIGludCBUaGlzQWRqdXN0bWVudDsKKworICAvLyBWaXJ0dWFsaXR5IGNhbiBvbmx5IGFzc3VtZSB0aHJlZSB2YWx1ZXMsIHNvIHdlIGNhbiBwYWNrCisgIC8vIGluIDIgYml0cyAobm9uZS9wdXJlL3B1cmVfdmlydHVhbCkuCisgIHVuc2lnbmVkIFZpcnR1YWxpdHkgOiAyOworCisgIC8vIFRoZXNlIGFyZSBib29sZWFuIGZsYWdzIHNvIG9uZSBiaXQgaXMgZW5vdWdoLgorICAvLyBNU1ZDIHN0YXJ0cyBhIG5ldyBjb250YWluZXIgZmllbGQgZXZlcnkgdGltZSB0aGUgYmFzZQorICAvLyB0eXBlIGNoYW5nZXMgc28gd2UgY2FuJ3QgdXNlICdib29sJyB0byBlbnN1cmUgdGhlc2UgYml0cworICAvLyBhcmUgcGFja2VkLgorICB1bnNpZ25lZCBJc0xvY2FsVG9Vbml0IDogMTsKKyAgdW5zaWduZWQgSXNEZWZpbml0aW9uIDogMTsKKyAgdW5zaWduZWQgSXNPcHRpbWl6ZWQgOiAxOworCisgIHVuc2lnbmVkIFBhZGRpbmcgOiAzOworCisgIERJRmxhZ3MgRmxhZ3M7CisKKyAgRElTdWJwcm9ncmFtKExMVk1Db250ZXh0ICZDLCBTdG9yYWdlVHlwZSBTdG9yYWdlLCB1bnNpZ25lZCBMaW5lLAorICAgICAgICAgICAgICAgdW5zaWduZWQgU2NvcGVMaW5lLCB1bnNpZ25lZCBWaXJ0dWFsaXR5LCB1bnNpZ25lZCBWaXJ0dWFsSW5kZXgsCisgICAgICAgICAgICAgICBpbnQgVGhpc0FkanVzdG1lbnQsIERJRmxhZ3MgRmxhZ3MsIGJvb2wgSXNMb2NhbFRvVW5pdCwKKyAgICAgICAgICAgICAgIGJvb2wgSXNEZWZpbml0aW9uLCBib29sIElzT3B0aW1pemVkLCBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMpCisgICAgICA6IERJTG9jYWxTY29wZShDLCBESVN1YnByb2dyYW1LaW5kLCBTdG9yYWdlLCBkd2FyZjo6RFdfVEFHX3N1YnByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgICBPcHMpLAorICAgICAgICBMaW5lKExpbmUpLCBTY29wZUxpbmUoU2NvcGVMaW5lKSwgVmlydHVhbEluZGV4KFZpcnR1YWxJbmRleCksCisgICAgICAgIFRoaXNBZGp1c3RtZW50KFRoaXNBZGp1c3RtZW50KSwgVmlydHVhbGl0eShWaXJ0dWFsaXR5KSwKKyAgICAgICAgSXNMb2NhbFRvVW5pdChJc0xvY2FsVG9Vbml0KSwgSXNEZWZpbml0aW9uKElzRGVmaW5pdGlvbiksCisgICAgICAgIElzT3B0aW1pemVkKElzT3B0aW1pemVkKSwgRmxhZ3MoRmxhZ3MpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KGR3YXJmOjpEV19WSVJUVUFMSVRZX21heCA8IDQsICJWaXJ0dWFsaXR5IG91dCBvZiByYW5nZSIpOworICAgIGFzc2VydChWaXJ0dWFsaXR5IDwgNCAmJiAiVmlydHVhbGl0eSBvdXQgb2YgcmFuZ2UiKTsKKyAgfQorICB+RElTdWJwcm9ncmFtKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBESVN1YnByb2dyYW0gKgorICBnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCBESVNjb3BlUmVmIFNjb3BlLCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICBTdHJpbmdSZWYgTGlua2FnZU5hbWUsIERJRmlsZSAqRmlsZSwgdW5zaWduZWQgTGluZSwKKyAgICAgICAgICBESVN1YnJvdXRpbmVUeXBlICpUeXBlLCBib29sIElzTG9jYWxUb1VuaXQsIGJvb2wgSXNEZWZpbml0aW9uLAorICAgICAgICAgIHVuc2lnbmVkIFNjb3BlTGluZSwgRElUeXBlUmVmIENvbnRhaW5pbmdUeXBlLCB1bnNpZ25lZCBWaXJ0dWFsaXR5LAorICAgICAgICAgIHVuc2lnbmVkIFZpcnR1YWxJbmRleCwgaW50IFRoaXNBZGp1c3RtZW50LCBESUZsYWdzIEZsYWdzLAorICAgICAgICAgIGJvb2wgSXNPcHRpbWl6ZWQsIERJQ29tcGlsZVVuaXQgKlVuaXQsCisgICAgICAgICAgRElUZW1wbGF0ZVBhcmFtZXRlckFycmF5IFRlbXBsYXRlUGFyYW1zLCBESVN1YnByb2dyYW0gKkRlY2xhcmF0aW9uLAorICAgICAgICAgIERJTG9jYWxWYXJpYWJsZUFycmF5IFZhcmlhYmxlcywgRElUeXBlQXJyYXkgVGhyb3duVHlwZXMsCisgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKSB7CisgICAgcmV0dXJuIGdldEltcGwoQ29udGV4dCwgU2NvcGUsIGdldENhbm9uaWNhbE1EU3RyaW5nKENvbnRleHQsIE5hbWUpLAorICAgICAgICAgICAgICAgICAgIGdldENhbm9uaWNhbE1EU3RyaW5nKENvbnRleHQsIExpbmthZ2VOYW1lKSwgRmlsZSwgTGluZSwgVHlwZSwKKyAgICAgICAgICAgICAgICAgICBJc0xvY2FsVG9Vbml0LCBJc0RlZmluaXRpb24sIFNjb3BlTGluZSwgQ29udGFpbmluZ1R5cGUsCisgICAgICAgICAgICAgICAgICAgVmlydHVhbGl0eSwgVmlydHVhbEluZGV4LCBUaGlzQWRqdXN0bWVudCwgRmxhZ3MsIElzT3B0aW1pemVkLAorICAgICAgICAgICAgICAgICAgIFVuaXQsIFRlbXBsYXRlUGFyYW1zLmdldCgpLCBEZWNsYXJhdGlvbiwgVmFyaWFibGVzLmdldCgpLAorICAgICAgICAgICAgICAgICAgIFRocm93blR5cGVzLmdldCgpLCBTdG9yYWdlLCBTaG91bGRDcmVhdGUpOworICB9CisgIHN0YXRpYyBESVN1YnByb2dyYW0gKgorICBnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCBNZXRhZGF0YSAqU2NvcGUsIE1EU3RyaW5nICpOYW1lLAorICAgICAgICAgIE1EU3RyaW5nICpMaW5rYWdlTmFtZSwgTWV0YWRhdGEgKkZpbGUsIHVuc2lnbmVkIExpbmUsIE1ldGFkYXRhICpUeXBlLAorICAgICAgICAgIGJvb2wgSXNMb2NhbFRvVW5pdCwgYm9vbCBJc0RlZmluaXRpb24sIHVuc2lnbmVkIFNjb3BlTGluZSwKKyAgICAgICAgICBNZXRhZGF0YSAqQ29udGFpbmluZ1R5cGUsIHVuc2lnbmVkIFZpcnR1YWxpdHksIHVuc2lnbmVkIFZpcnR1YWxJbmRleCwKKyAgICAgICAgICBpbnQgVGhpc0FkanVzdG1lbnQsIERJRmxhZ3MgRmxhZ3MsIGJvb2wgSXNPcHRpbWl6ZWQsIE1ldGFkYXRhICpVbml0LAorICAgICAgICAgIE1ldGFkYXRhICpUZW1wbGF0ZVBhcmFtcywgTWV0YWRhdGEgKkRlY2xhcmF0aW9uLCBNZXRhZGF0YSAqVmFyaWFibGVzLAorICAgICAgICAgIE1ldGFkYXRhICpUaHJvd25UeXBlcywgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wRElTdWJwcm9ncmFtIGNsb25lSW1wbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGVtcG9yYXJ5KGdldENvbnRleHQoKSwgZ2V0U2NvcGUoKSwgZ2V0TmFtZSgpLCBnZXRMaW5rYWdlTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZSgpLCBnZXRMaW5lKCksIGdldFR5cGUoKSwgaXNMb2NhbFRvVW5pdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNEZWZpbml0aW9uKCksIGdldFNjb3BlTGluZSgpLCBnZXRDb250YWluaW5nVHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmlydHVhbGl0eSgpLCBnZXRWaXJ0dWFsSW5kZXgoKSwgZ2V0VGhpc0FkanVzdG1lbnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldEZsYWdzKCksIGlzT3B0aW1pemVkKCksIGdldFVuaXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFRlbXBsYXRlUGFyYW1zKCksIGdldERlY2xhcmF0aW9uKCksIGdldFZhcmlhYmxlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGhyb3duVHlwZXMoKSk7CisgIH0KKworcHVibGljOgorICBERUZJTkVfTUROT0RFX0dFVChESVN1YnByb2dyYW0sCisgICAgICAgICAgICAgICAgICAgIChESVNjb3BlUmVmIFNjb3BlLCBTdHJpbmdSZWYgTmFtZSwgU3RyaW5nUmVmIExpbmthZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lLCBESVN1YnJvdXRpbmVUeXBlICpUeXBlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0xvY2FsVG9Vbml0LCBib29sIElzRGVmaW5pdGlvbiwgdW5zaWduZWQgU2NvcGVMaW5lLAorICAgICAgICAgICAgICAgICAgICAgRElUeXBlUmVmIENvbnRhaW5pbmdUeXBlLCB1bnNpZ25lZCBWaXJ0dWFsaXR5LAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmlydHVhbEluZGV4LCBpbnQgVGhpc0FkanVzdG1lbnQsIERJRmxhZ3MgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICBib29sIElzT3B0aW1pemVkLCBESUNvbXBpbGVVbml0ICpVbml0LAorICAgICAgICAgICAgICAgICAgICAgRElUZW1wbGF0ZVBhcmFtZXRlckFycmF5IFRlbXBsYXRlUGFyYW1zID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgIERJU3VicHJvZ3JhbSAqRGVjbGFyYXRpb24gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgRElMb2NhbFZhcmlhYmxlQXJyYXkgVmFyaWFibGVzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgIERJVHlwZUFycmF5IFRocm93blR5cGVzID0gbnVsbHB0ciksCisgICAgICAgICAgICAgICAgICAgIChTY29wZSwgTmFtZSwgTGlua2FnZU5hbWUsIEZpbGUsIExpbmUsIFR5cGUsIElzTG9jYWxUb1VuaXQsCisgICAgICAgICAgICAgICAgICAgICBJc0RlZmluaXRpb24sIFNjb3BlTGluZSwgQ29udGFpbmluZ1R5cGUsIFZpcnR1YWxpdHksCisgICAgICAgICAgICAgICAgICAgICBWaXJ0dWFsSW5kZXgsIFRoaXNBZGp1c3RtZW50LCBGbGFncywgSXNPcHRpbWl6ZWQsIFVuaXQsCisgICAgICAgICAgICAgICAgICAgICBUZW1wbGF0ZVBhcmFtcywgRGVjbGFyYXRpb24sIFZhcmlhYmxlcywgVGhyb3duVHlwZXMpKQorICBERUZJTkVfTUROT0RFX0dFVCgKKyAgICAgIERJU3VicHJvZ3JhbSwKKyAgICAgIChNZXRhZGF0YSAqIFNjb3BlLCBNRFN0cmluZyAqTmFtZSwgTURTdHJpbmcgKkxpbmthZ2VOYW1lLCBNZXRhZGF0YSAqRmlsZSwKKyAgICAgICB1bnNpZ25lZCBMaW5lLCBNZXRhZGF0YSAqVHlwZSwgYm9vbCBJc0xvY2FsVG9Vbml0LCBib29sIElzRGVmaW5pdGlvbiwKKyAgICAgICB1bnNpZ25lZCBTY29wZUxpbmUsIE1ldGFkYXRhICpDb250YWluaW5nVHlwZSwgdW5zaWduZWQgVmlydHVhbGl0eSwKKyAgICAgICB1bnNpZ25lZCBWaXJ0dWFsSW5kZXgsIGludCBUaGlzQWRqdXN0bWVudCwgRElGbGFncyBGbGFncywKKyAgICAgICBib29sIElzT3B0aW1pemVkLCBNZXRhZGF0YSAqVW5pdCwgTWV0YWRhdGEgKlRlbXBsYXRlUGFyYW1zID0gbnVsbHB0ciwKKyAgICAgICBNZXRhZGF0YSAqRGVjbGFyYXRpb24gPSBudWxscHRyLCBNZXRhZGF0YSAqVmFyaWFibGVzID0gbnVsbHB0ciwKKyAgICAgICBNZXRhZGF0YSAqVGhyb3duVHlwZXMgPSBudWxscHRyKSwKKyAgICAgIChTY29wZSwgTmFtZSwgTGlua2FnZU5hbWUsIEZpbGUsIExpbmUsIFR5cGUsIElzTG9jYWxUb1VuaXQsIElzRGVmaW5pdGlvbiwKKyAgICAgICBTY29wZUxpbmUsIENvbnRhaW5pbmdUeXBlLCBWaXJ0dWFsaXR5LCBWaXJ0dWFsSW5kZXgsIFRoaXNBZGp1c3RtZW50LAorICAgICAgIEZsYWdzLCBJc09wdGltaXplZCwgVW5pdCwgVGVtcGxhdGVQYXJhbXMsIERlY2xhcmF0aW9uLCBWYXJpYWJsZXMsCisgICAgICAgVGhyb3duVHlwZXMpKQorCisgIFRlbXBESVN1YnByb2dyYW0gY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCitwdWJsaWM6CisgIHVuc2lnbmVkIGdldExpbmUoKSBjb25zdCB7IHJldHVybiBMaW5lOyB9CisgIHVuc2lnbmVkIGdldFZpcnR1YWxpdHkoKSBjb25zdCB7IHJldHVybiBWaXJ0dWFsaXR5OyB9CisgIHVuc2lnbmVkIGdldFZpcnR1YWxJbmRleCgpIGNvbnN0IHsgcmV0dXJuIFZpcnR1YWxJbmRleDsgfQorICBpbnQgZ2V0VGhpc0FkanVzdG1lbnQoKSBjb25zdCB7IHJldHVybiBUaGlzQWRqdXN0bWVudDsgfQorICB1bnNpZ25lZCBnZXRTY29wZUxpbmUoKSBjb25zdCB7IHJldHVybiBTY29wZUxpbmU7IH0KKyAgRElGbGFncyBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIEZsYWdzOyB9CisgIGJvb2wgaXNMb2NhbFRvVW5pdCgpIGNvbnN0IHsgcmV0dXJuIElzTG9jYWxUb1VuaXQ7IH0KKyAgYm9vbCBpc0RlZmluaXRpb24oKSBjb25zdCB7IHJldHVybiBJc0RlZmluaXRpb247IH0KKyAgYm9vbCBpc09wdGltaXplZCgpIGNvbnN0IHsgcmV0dXJuIElzT3B0aW1pemVkOyB9CisKKyAgYm9vbCBpc0FydGlmaWNpYWwoKSBjb25zdCB7IHJldHVybiBnZXRGbGFncygpICYgRmxhZ0FydGlmaWNpYWw7IH0KKyAgYm9vbCBpc1ByaXZhdGUoKSBjb25zdCB7CisgICAgcmV0dXJuIChnZXRGbGFncygpICYgRmxhZ0FjY2Vzc2liaWxpdHkpID09IEZsYWdQcml2YXRlOworICB9CisgIGJvb2wgaXNQcm90ZWN0ZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIChnZXRGbGFncygpICYgRmxhZ0FjY2Vzc2liaWxpdHkpID09IEZsYWdQcm90ZWN0ZWQ7CisgIH0KKyAgYm9vbCBpc1B1YmxpYygpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdldEZsYWdzKCkgJiBGbGFnQWNjZXNzaWJpbGl0eSkgPT0gRmxhZ1B1YmxpYzsKKyAgfQorICBib29sIGlzRXhwbGljaXQoKSBjb25zdCB7IHJldHVybiBnZXRGbGFncygpICYgRmxhZ0V4cGxpY2l0OyB9CisgIGJvb2wgaXNQcm90b3R5cGVkKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdQcm90b3R5cGVkOyB9CisgIGJvb2wgaXNNYWluU3VicHJvZ3JhbSgpIGNvbnN0IHsgcmV0dXJuIGdldEZsYWdzKCkgJiBGbGFnTWFpblN1YnByb2dyYW07IH0KKworICAvLy8gQ2hlY2sgaWYgdGhpcyBpcyByZWZlcmVuY2UtcXVhbGlmaWVkLgorICAvLy8KKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgc3VicHJvZ3JhbSBpcyBhIEMrKzExIHJlZmVyZW5jZS1xdWFsaWZpZWQgbm9uLXN0YXRpYworICAvLy8gbWVtYmVyIGZ1bmN0aW9uICh2b2lkIGZvbygpICYpLgorICBib29sIGlzTFZhbHVlUmVmZXJlbmNlKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdMVmFsdWVSZWZlcmVuY2U7IH0KKworICAvLy8gQ2hlY2sgaWYgdGhpcyBpcyBydmFsdWUtcmVmZXJlbmNlLXF1YWxpZmllZC4KKyAgLy8vCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHN1YnByb2dyYW0gaXMgYSBDKysxMSBydmFsdWUtcmVmZXJlbmNlLXF1YWxpZmllZAorICAvLy8gbm9uLXN0YXRpYyBtZW1iZXIgZnVuY3Rpb24gKHZvaWQgZm9vKCkgJiYpLgorICBib29sIGlzUlZhbHVlUmVmZXJlbmNlKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdSVmFsdWVSZWZlcmVuY2U7IH0KKworICAvLy8gQ2hlY2sgaWYgdGhpcyBpcyBtYXJrZWQgYXMgbm9yZXR1cm4uCisgIC8vLworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBzdWJwcm9ncmFtIGlzIEMrKzExIG5vcmV0dXJuIG9yIEMxMSBfTm9yZXR1cm4KKyAgYm9vbCBpc05vUmV0dXJuKCkgY29uc3QgeyByZXR1cm4gZ2V0RmxhZ3MoKSAmIEZsYWdOb1JldHVybjsgfQorCisgIERJU2NvcGVSZWYgZ2V0U2NvcGUoKSBjb25zdCB7IHJldHVybiBESVNjb3BlUmVmKGdldFJhd1Njb3BlKCkpOyB9CisKKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBnZXRTdHJpbmdPcGVyYW5kKDIpOyB9CisgIFN0cmluZ1JlZiBnZXRMaW5rYWdlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZ09wZXJhbmQoMyk7IH0KKworICBESVN1YnJvdXRpbmVUeXBlICpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8RElTdWJyb3V0aW5lVHlwZT4oZ2V0UmF3VHlwZSgpKTsKKyAgfQorICBESVR5cGVSZWYgZ2V0Q29udGFpbmluZ1R5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIERJVHlwZVJlZihnZXRSYXdDb250YWluaW5nVHlwZSgpKTsKKyAgfQorCisgIERJQ29tcGlsZVVuaXQgKmdldFVuaXQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxESUNvbXBpbGVVbml0PihnZXRSYXdVbml0KCkpOworICB9CisgIHZvaWQgcmVwbGFjZVVuaXQoRElDb21waWxlVW5pdCAqQ1UpIHsgcmVwbGFjZU9wZXJhbmRXaXRoKDUsIENVKTsgfQorICBESVRlbXBsYXRlUGFyYW1ldGVyQXJyYXkgZ2V0VGVtcGxhdGVQYXJhbXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxNRFR1cGxlPihnZXRSYXdUZW1wbGF0ZVBhcmFtcygpKTsKKyAgfQorICBESVN1YnByb2dyYW0gKmdldERlY2xhcmF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8RElTdWJwcm9ncmFtPihnZXRSYXdEZWNsYXJhdGlvbigpKTsKKyAgfQorICBESUxvY2FsVmFyaWFibGVBcnJheSBnZXRWYXJpYWJsZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxNRFR1cGxlPihnZXRSYXdWYXJpYWJsZXMoKSk7CisgIH0KKyAgRElUeXBlQXJyYXkgZ2V0VGhyb3duVHlwZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxNRFR1cGxlPihnZXRSYXdUaHJvd25UeXBlcygpKTsKKyAgfQorCisgIE1ldGFkYXRhICpnZXRSYXdTY29wZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMSk7IH0KKyAgTURTdHJpbmcgKmdldFJhd05hbWUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kQXM8TURTdHJpbmc+KDIpOyB9CisgIE1EU3RyaW5nICpnZXRSYXdMaW5rYWdlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmRBczxNRFN0cmluZz4oMyk7IH0KKyAgTWV0YWRhdGEgKmdldFJhd1R5cGUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDQpOyB9CisgIE1ldGFkYXRhICpnZXRSYXdVbml0KCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCg1KTsgfQorICBNZXRhZGF0YSAqZ2V0UmF3RGVjbGFyYXRpb24oKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDYpOyB9CisgIE1ldGFkYXRhICpnZXRSYXdWYXJpYWJsZXMoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDcpOyB9CisgIE1ldGFkYXRhICpnZXRSYXdDb250YWluaW5nVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKSA+IDggPyBnZXRPcGVyYW5kQXM8TWV0YWRhdGE+KDgpIDogbnVsbHB0cjsKKyAgfQorICBNZXRhZGF0YSAqZ2V0UmF3VGVtcGxhdGVQYXJhbXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE51bU9wZXJhbmRzKCkgPiA5ID8gZ2V0T3BlcmFuZEFzPE1ldGFkYXRhPig5KSA6IG51bGxwdHI7CisgIH0KKyAgTWV0YWRhdGEgKmdldFJhd1Rocm93blR5cGVzKCkgY29uc3QgeworICAgIHJldHVybiBnZXROdW1PcGVyYW5kcygpID4gMTAgPyBnZXRPcGVyYW5kQXM8TWV0YWRhdGE+KDEwKSA6IG51bGxwdHI7CisgIH0KKworICAvLy8gQ2hlY2sgaWYgdGhpcyBzdWJwcm9ncmFtIGRlc2NyaWJlcyB0aGUgZ2l2ZW4gZnVuY3Rpb24uCisgIC8vLworICAvLy8gRklYTUU6IFNob3VsZCB0aGlzIGJlIGxvb2tpbmcgdGhyb3VnaCBiaXRjYXN0cz8KKyAgYm9vbCBkZXNjcmliZXMoY29uc3QgRnVuY3Rpb24gKkYpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElTdWJwcm9ncmFtS2luZDsKKyAgfQorfTsKKworY2xhc3MgRElMZXhpY2FsQmxvY2tCYXNlIDogcHVibGljIERJTG9jYWxTY29wZSB7Citwcm90ZWN0ZWQ6CisgIERJTGV4aWNhbEJsb2NrQmFzZShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgSUQsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMpCisgICAgICA6IERJTG9jYWxTY29wZShDLCBJRCwgU3RvcmFnZSwgZHdhcmY6OkRXX1RBR19sZXhpY2FsX2Jsb2NrLCBPcHMpIHt9CisgIH5ESUxleGljYWxCbG9ja0Jhc2UoKSA9IGRlZmF1bHQ7CisKK3B1YmxpYzoKKyAgRElMb2NhbFNjb3BlICpnZXRTY29wZSgpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8RElMb2NhbFNjb3BlPihnZXRSYXdTY29wZSgpKTsgfQorCisgIE1ldGFkYXRhICpnZXRSYXdTY29wZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMSk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJTGV4aWNhbEJsb2NrS2luZCB8fAorICAgICAgICAgICBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJTGV4aWNhbEJsb2NrRmlsZUtpbmQ7CisgIH0KK307CisKK2NsYXNzIERJTGV4aWNhbEJsb2NrIDogcHVibGljIERJTGV4aWNhbEJsb2NrQmFzZSB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBNRE5vZGU7CisKKyAgdW5zaWduZWQgTGluZTsKKyAgdWludDE2X3QgQ29sdW1uOworCisgIERJTGV4aWNhbEJsb2NrKExMVk1Db250ZXh0ICZDLCBTdG9yYWdlVHlwZSBTdG9yYWdlLCB1bnNpZ25lZCBMaW5lLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb2x1bW4sIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wcykKKyAgICAgIDogRElMZXhpY2FsQmxvY2tCYXNlKEMsIERJTGV4aWNhbEJsb2NrS2luZCwgU3RvcmFnZSwgT3BzKSwgTGluZShMaW5lKSwKKyAgICAgICAgQ29sdW1uKENvbHVtbikgeworICAgIGFzc2VydChDb2x1bW4gPCAoMXUgPDwgMTYpICYmICJFeHBlY3RlZCAxNi1iaXQgY29sdW1uIik7CisgIH0KKyAgfkRJTGV4aWNhbEJsb2NrKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBESUxleGljYWxCbG9jayAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgRElMb2NhbFNjb3BlICpTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJRmlsZSAqRmlsZSwgdW5zaWduZWQgTGluZSwgdW5zaWduZWQgQ29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSkgeworICAgIHJldHVybiBnZXRJbXBsKENvbnRleHQsIHN0YXRpY19jYXN0PE1ldGFkYXRhICo+KFNjb3BlKSwKKyAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxNZXRhZGF0YSAqPihGaWxlKSwgTGluZSwgQ29sdW1uLCBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgIFNob3VsZENyZWF0ZSk7CisgIH0KKworICBzdGF0aWMgRElMZXhpY2FsQmxvY2sgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIE1ldGFkYXRhICpTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhICpGaWxlLCB1bnNpZ25lZCBMaW5lLCB1bnNpZ25lZCBDb2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVHlwZSBTdG9yYWdlLCBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpOworCisgIFRlbXBESUxleGljYWxCbG9jayBjbG9uZUltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeShnZXRDb250ZXh0KCksIGdldFNjb3BlKCksIGdldEZpbGUoKSwgZ2V0TGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Q29sdW1uKCkpOworICB9CisKK3B1YmxpYzoKKyAgREVGSU5FX01ETk9ERV9HRVQoRElMZXhpY2FsQmxvY2ssIChESUxvY2FsU2NvcGUgKiBTY29wZSwgRElGaWxlICpGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExpbmUsIHVuc2lnbmVkIENvbHVtbiksCisgICAgICAgICAgICAgICAgICAgIChTY29wZSwgRmlsZSwgTGluZSwgQ29sdW1uKSkKKyAgREVGSU5FX01ETk9ERV9HRVQoRElMZXhpY2FsQmxvY2ssIChNZXRhZGF0YSAqIFNjb3BlLCBNZXRhZGF0YSAqRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lLCB1bnNpZ25lZCBDb2x1bW4pLAorICAgICAgICAgICAgICAgICAgICAoU2NvcGUsIEZpbGUsIExpbmUsIENvbHVtbikpCisKKyAgVGVtcERJTGV4aWNhbEJsb2NrIGNsb25lKCkgY29uc3QgeyByZXR1cm4gY2xvbmVJbXBsKCk7IH0KKworICB1bnNpZ25lZCBnZXRMaW5lKCkgY29uc3QgeyByZXR1cm4gTGluZTsgfQorICB1bnNpZ25lZCBnZXRDb2x1bW4oKSBjb25zdCB7IHJldHVybiBDb2x1bW47IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJTGV4aWNhbEJsb2NrS2luZDsKKyAgfQorfTsKKworY2xhc3MgRElMZXhpY2FsQmxvY2tGaWxlIDogcHVibGljIERJTGV4aWNhbEJsb2NrQmFzZSB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBNRE5vZGU7CisKKyAgdW5zaWduZWQgRGlzY3JpbWluYXRvcjsKKworICBESUxleGljYWxCbG9ja0ZpbGUoTExWTUNvbnRleHQgJkMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEaXNjcmltaW5hdG9yLCBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMpCisgICAgICA6IERJTGV4aWNhbEJsb2NrQmFzZShDLCBESUxleGljYWxCbG9ja0ZpbGVLaW5kLCBTdG9yYWdlLCBPcHMpLAorICAgICAgICBEaXNjcmltaW5hdG9yKERpc2NyaW1pbmF0b3IpIHt9CisgIH5ESUxleGljYWxCbG9ja0ZpbGUoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIERJTGV4aWNhbEJsb2NrRmlsZSAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgRElMb2NhbFNjb3BlICpTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESUZpbGUgKkZpbGUsIHVuc2lnbmVkIERpc2NyaW1pbmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpIHsKKyAgICByZXR1cm4gZ2V0SW1wbChDb250ZXh0LCBzdGF0aWNfY2FzdDxNZXRhZGF0YSAqPihTY29wZSksCisgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8TWV0YWRhdGEgKj4oRmlsZSksIERpc2NyaW1pbmF0b3IsIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgU2hvdWxkQ3JlYXRlKTsKKyAgfQorCisgIHN0YXRpYyBESUxleGljYWxCbG9ja0ZpbGUgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIE1ldGFkYXRhICpTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSAqRmlsZSwgdW5zaWduZWQgRGlzY3JpbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVHlwZSBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSk7CisKKyAgVGVtcERJTGV4aWNhbEJsb2NrRmlsZSBjbG9uZUltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeShnZXRDb250ZXh0KCksIGdldFNjb3BlKCksIGdldEZpbGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldERpc2NyaW1pbmF0b3IoKSk7CisgIH0KKworcHVibGljOgorICBERUZJTkVfTUROT0RFX0dFVChESUxleGljYWxCbG9ja0ZpbGUsIChESUxvY2FsU2NvcGUgKiBTY29wZSwgRElGaWxlICpGaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEaXNjcmltaW5hdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgKFNjb3BlLCBGaWxlLCBEaXNjcmltaW5hdG9yKSkKKyAgREVGSU5FX01ETk9ERV9HRVQoRElMZXhpY2FsQmxvY2tGaWxlLAorICAgICAgICAgICAgICAgICAgICAoTWV0YWRhdGEgKiBTY29wZSwgTWV0YWRhdGEgKkZpbGUsIHVuc2lnbmVkIERpc2NyaW1pbmF0b3IpLAorICAgICAgICAgICAgICAgICAgICAoU2NvcGUsIEZpbGUsIERpc2NyaW1pbmF0b3IpKQorCisgIFRlbXBESUxleGljYWxCbG9ja0ZpbGUgY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCisgIC8vIFRPRE86IFJlbW92ZSB0aGVzZSBvbmNlIHRoZXkncmUgZ29uZSBmcm9tIERJTGV4aWNhbEJsb2NrQmFzZS4KKyAgdW5zaWduZWQgZ2V0TGluZSgpIGNvbnN0ID0gZGVsZXRlOworICB1bnNpZ25lZCBnZXRDb2x1bW4oKSBjb25zdCA9IGRlbGV0ZTsKKworICB1bnNpZ25lZCBnZXREaXNjcmltaW5hdG9yKCkgY29uc3QgeyByZXR1cm4gRGlzY3JpbWluYXRvcjsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElMZXhpY2FsQmxvY2tGaWxlS2luZDsKKyAgfQorfTsKKwordW5zaWduZWQgRElMb2NhdGlvbjo6Z2V0RGlzY3JpbWluYXRvcigpIGNvbnN0IHsKKyAgaWYgKGF1dG8gKkYgPSBkeW5fY2FzdDxESUxleGljYWxCbG9ja0ZpbGU+KGdldFNjb3BlKCkpKQorICAgIHJldHVybiBGLT5nZXREaXNjcmltaW5hdG9yKCk7CisgIHJldHVybiAwOworfQorCitjb25zdCBESUxvY2F0aW9uICoKK0RJTG9jYXRpb246OmNsb25lV2l0aERpc2NyaW1pbmF0b3IodW5zaWduZWQgRGlzY3JpbWluYXRvcikgY29uc3QgeworICBESVNjb3BlICpTY29wZSA9IGdldFNjb3BlKCk7CisgIC8vIFNraXAgYWxsIHBhcmVudCBESUxleGljYWxCbG9ja0ZpbGUgdGhhdCBhbHJlYWR5IGhhdmUgYSBkaXNjcmltaW5hdG9yCisgIC8vIGFzc2lnbmVkLiBXZSBkbyBub3Qgd2FudCB0byBoYXZlIG5lc3RlZCBESUxleGljYWxCbG9ja0ZpbGVzIHRoYXQgaGF2ZQorICAvLyBtdXRsaXBsZSBkaXNjcmltaW5hdG9ycyBiZWNhdXNlIG9ubHkgdGhlIGxlYWYgRElMZXhpY2FsQmxvY2tGaWxlJ3MKKyAgLy8gZG9taW5hdG9yIHdpbGwgYmUgdXNlZC4KKyAgZm9yIChhdXRvICpMQkYgPSBkeW5fY2FzdDxESUxleGljYWxCbG9ja0ZpbGU+KFNjb3BlKTsKKyAgICAgICBMQkYgJiYgTEJGLT5nZXREaXNjcmltaW5hdG9yKCkgIT0gMDsKKyAgICAgICBMQkYgPSBkeW5fY2FzdDxESUxleGljYWxCbG9ja0ZpbGU+KFNjb3BlKSkKKyAgICBTY29wZSA9IExCRi0+Z2V0U2NvcGUoKTsKKyAgRElMZXhpY2FsQmxvY2tGaWxlICpOZXdTY29wZSA9CisgICAgICBESUxleGljYWxCbG9ja0ZpbGU6OmdldChnZXRDb250ZXh0KCksIFNjb3BlLCBnZXRGaWxlKCksIERpc2NyaW1pbmF0b3IpOworICByZXR1cm4gRElMb2NhdGlvbjo6Z2V0KGdldENvbnRleHQoKSwgZ2V0TGluZSgpLCBnZXRDb2x1bW4oKSwgTmV3U2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0SW5saW5lZEF0KCkpOworfQorCit1bnNpZ25lZCBESUxvY2F0aW9uOjpnZXRCYXNlRGlzY3JpbWluYXRvcigpIGNvbnN0IHsKKyAgcmV0dXJuIGdldEJhc2VEaXNjcmltaW5hdG9yRnJvbURpc2NyaW1pbmF0b3IoZ2V0RGlzY3JpbWluYXRvcigpKTsKK30KKwordW5zaWduZWQgRElMb2NhdGlvbjo6Z2V0RHVwbGljYXRpb25GYWN0b3IoKSBjb25zdCB7CisgIHJldHVybiBnZXREdXBsaWNhdGlvbkZhY3RvckZyb21EaXNjcmltaW5hdG9yKGdldERpc2NyaW1pbmF0b3IoKSk7Cit9CisKK3Vuc2lnbmVkIERJTG9jYXRpb246OmdldENvcHlJZGVudGlmaWVyKCkgY29uc3QgeworICByZXR1cm4gZ2V0Q29weUlkZW50aWZpZXJGcm9tRGlzY3JpbWluYXRvcihnZXREaXNjcmltaW5hdG9yKCkpOworfQorCitjb25zdCBESUxvY2F0aW9uICpESUxvY2F0aW9uOjpzZXRCYXNlRGlzY3JpbWluYXRvcih1bnNpZ25lZCBEKSBjb25zdCB7CisgIGlmIChEID09IDApCisgICAgcmV0dXJuIHRoaXM7CisgIGVsc2UKKyAgICByZXR1cm4gY2xvbmVXaXRoRGlzY3JpbWluYXRvcihnZXRQcmVmaXhFbmNvZGluZ0Zyb21VbnNpZ25lZChEKSA8PCAxKTsKK30KKworY29uc3QgRElMb2NhdGlvbiAqRElMb2NhdGlvbjo6Y2xvbmVXaXRoRHVwbGljYXRpb25GYWN0b3IodW5zaWduZWQgREYpIGNvbnN0IHsKKyAgREYgKj0gZ2V0RHVwbGljYXRpb25GYWN0b3IoKTsKKyAgaWYgKERGIDw9IDEpCisgICAgcmV0dXJuIHRoaXM7CisKKyAgdW5zaWduZWQgQkQgPSBnZXRCYXNlRGlzY3JpbWluYXRvcigpOworICB1bnNpZ25lZCBDSSA9IGdldENvcHlJZGVudGlmaWVyKCkgPDwgKERGID4gMHgxZiA/IDE0IDogNyk7CisgIHVuc2lnbmVkIEQgPSBDSSB8IChnZXRQcmVmaXhFbmNvZGluZ0Zyb21VbnNpZ25lZChERikgPDwgMSk7CisKKyAgaWYgKEJEID09IDApCisgICAgRCA9IChEIDw8IDEpIHwgMTsKKyAgZWxzZQorICAgIEQgPSAoRCA8PCAoQkQgPiAweDFmID8gMTQgOiA3KSkgfCAoZ2V0UHJlZml4RW5jb2RpbmdGcm9tVW5zaWduZWQoQkQpIDw8IDEpOworCisgIHJldHVybiBjbG9uZVdpdGhEaXNjcmltaW5hdG9yKEQpOworfQorCitjbGFzcyBESU5hbWVzcGFjZSA6IHB1YmxpYyBESVNjb3BlIHsKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIE1ETm9kZTsKKworICB1bnNpZ25lZCBFeHBvcnRTeW1ib2xzIDogMTsKKworICBESU5hbWVzcGFjZShMTFZNQ29udGV4dCAmQ29udGV4dCwgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBFeHBvcnRTeW1ib2xzLAorICAgICAgICAgICAgICBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMpCisgICAgICA6IERJU2NvcGUoQ29udGV4dCwgRElOYW1lc3BhY2VLaW5kLCBTdG9yYWdlLCBkd2FyZjo6RFdfVEFHX25hbWVzcGFjZSwKKyAgICAgICAgICAgICAgICBPcHMpLAorICAgICAgICBFeHBvcnRTeW1ib2xzKEV4cG9ydFN5bWJvbHMpIHt9CisgIH5ESU5hbWVzcGFjZSgpID0gZGVmYXVsdDsKKworICBzdGF0aWMgRElOYW1lc3BhY2UgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIERJU2NvcGUgKlNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUsIGJvb2wgRXhwb3J0U3ltYm9scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSkgeworICAgIHJldHVybiBnZXRJbXBsKENvbnRleHQsIFNjb3BlLCBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBOYW1lKSwKKyAgICAgICAgICAgICAgICAgICBFeHBvcnRTeW1ib2xzLCBTdG9yYWdlLCBTaG91bGRDcmVhdGUpOworICB9CisgIHN0YXRpYyBESU5hbWVzcGFjZSAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgTWV0YWRhdGEgKlNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTURTdHJpbmcgKk5hbWUsIGJvb2wgRXhwb3J0U3ltYm9scywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSk7CisKKyAgVGVtcERJTmFtZXNwYWNlIGNsb25lSW1wbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGVtcG9yYXJ5KGdldENvbnRleHQoKSwgZ2V0U2NvcGUoKSwgZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RXhwb3J0U3ltYm9scygpKTsKKyAgfQorCitwdWJsaWM6CisgIERFRklORV9NRE5PREVfR0VUKERJTmFtZXNwYWNlLAorICAgICAgICAgICAgICAgICAgICAoRElTY29wZSAqU2NvcGUsIFN0cmluZ1JlZiBOYW1lLCBib29sIEV4cG9ydFN5bWJvbHMpLAorICAgICAgICAgICAgICAgICAgICAoU2NvcGUsIE5hbWUsIEV4cG9ydFN5bWJvbHMpKQorICBERUZJTkVfTUROT0RFX0dFVChESU5hbWVzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgKE1ldGFkYXRhICpTY29wZSwgTURTdHJpbmcgKk5hbWUsIGJvb2wgRXhwb3J0U3ltYm9scyksCisgICAgICAgICAgICAgICAgICAgIChTY29wZSwgTmFtZSwgRXhwb3J0U3ltYm9scykpCisKKyAgVGVtcERJTmFtZXNwYWNlIGNsb25lKCkgY29uc3QgeyByZXR1cm4gY2xvbmVJbXBsKCk7IH0KKworICBib29sIGdldEV4cG9ydFN5bWJvbHMoKSBjb25zdCB7IHJldHVybiBFeHBvcnRTeW1ib2xzOyB9CisgIERJU2NvcGUgKmdldFNjb3BlKCkgY29uc3QgeyByZXR1cm4gY2FzdF9vcl9udWxsPERJU2NvcGU+KGdldFJhd1Njb3BlKCkpOyB9CisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RyaW5nT3BlcmFuZCgyKTsgfQorCisgIE1ldGFkYXRhICpnZXRSYXdTY29wZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMSk7IH0KKyAgTURTdHJpbmcgKmdldFJhd05hbWUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kQXM8TURTdHJpbmc+KDIpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBESU5hbWVzcGFjZUtpbmQ7CisgIH0KK307CisKKy8vLyBBIChjbGFuZykgbW9kdWxlIHRoYXQgaGFzIGJlZW4gaW1wb3J0ZWQgYnkgdGhlIGNvbXBpbGUgdW5pdC4KKy8vLworY2xhc3MgRElNb2R1bGUgOiBwdWJsaWMgRElTY29wZSB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBNRE5vZGU7CisKKyAgRElNb2R1bGUoTExWTUNvbnRleHQgJkNvbnRleHQsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wcykKKyAgICAgIDogRElTY29wZShDb250ZXh0LCBESU1vZHVsZUtpbmQsIFN0b3JhZ2UsIGR3YXJmOjpEV19UQUdfbW9kdWxlLCBPcHMpIHt9CisgIH5ESU1vZHVsZSgpID0gZGVmYXVsdDsKKworICBzdGF0aWMgRElNb2R1bGUgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIERJU2NvcGUgKlNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBDb25maWd1cmF0aW9uTWFjcm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEluY2x1ZGVQYXRoLCBTdHJpbmdSZWYgSVN5c1Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVHlwZSBTdG9yYWdlLCBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpIHsKKyAgICByZXR1cm4gZ2V0SW1wbChDb250ZXh0LCBTY29wZSwgZ2V0Q2Fub25pY2FsTURTdHJpbmcoQ29udGV4dCwgTmFtZSksCisgICAgICAgICAgICAgICAgICAgZ2V0Q2Fub25pY2FsTURTdHJpbmcoQ29udGV4dCwgQ29uZmlndXJhdGlvbk1hY3JvcyksCisgICAgICAgICAgICAgICAgICAgZ2V0Q2Fub25pY2FsTURTdHJpbmcoQ29udGV4dCwgSW5jbHVkZVBhdGgpLAorICAgICAgICAgICAgICAgICAgIGdldENhbm9uaWNhbE1EU3RyaW5nKENvbnRleHQsIElTeXNSb290KSwKKyAgICAgICAgICAgICAgICAgICBTdG9yYWdlLCBTaG91bGRDcmVhdGUpOworICB9CisgIHN0YXRpYyBESU1vZHVsZSAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgTWV0YWRhdGEgKlNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTURTdHJpbmcgKk5hbWUsIE1EU3RyaW5nICpDb25maWd1cmF0aW9uTWFjcm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTURTdHJpbmcgKkluY2x1ZGVQYXRoLCBNRFN0cmluZyAqSVN5c1Jvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVHlwZSBTdG9yYWdlLCBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpOworCisgIFRlbXBESU1vZHVsZSBjbG9uZUltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeShnZXRDb250ZXh0KCksIGdldFNjb3BlKCksIGdldE5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldENvbmZpZ3VyYXRpb25NYWNyb3MoKSwgZ2V0SW5jbHVkZVBhdGgoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldElTeXNSb290KCkpOworICB9CisKK3B1YmxpYzoKKyAgREVGSU5FX01ETk9ERV9HRVQoRElNb2R1bGUsIChESVNjb3BlICpTY29wZSwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIENvbmZpZ3VyYXRpb25NYWNyb3MsIFN0cmluZ1JlZiBJbmNsdWRlUGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgSVN5c1Jvb3QpLAorICAgICAgICAgICAgICAgICAgICAoU2NvcGUsIE5hbWUsIENvbmZpZ3VyYXRpb25NYWNyb3MsIEluY2x1ZGVQYXRoLCBJU3lzUm9vdCkpCisgIERFRklORV9NRE5PREVfR0VUKERJTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAoTWV0YWRhdGEgKlNjb3BlLCBNRFN0cmluZyAqTmFtZSwgTURTdHJpbmcgKkNvbmZpZ3VyYXRpb25NYWNyb3MsCisgICAgICAgICAgICAgICAgICAgICBNRFN0cmluZyAqSW5jbHVkZVBhdGgsIE1EU3RyaW5nICpJU3lzUm9vdCksCisgICAgICAgICAgICAgICAgICAgIChTY29wZSwgTmFtZSwgQ29uZmlndXJhdGlvbk1hY3JvcywgSW5jbHVkZVBhdGgsIElTeXNSb290KSkKKworICBUZW1wRElNb2R1bGUgY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCisgIERJU2NvcGUgKmdldFNjb3BlKCkgY29uc3QgeyByZXR1cm4gY2FzdF9vcl9udWxsPERJU2NvcGU+KGdldFJhd1Njb3BlKCkpOyB9CisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RyaW5nT3BlcmFuZCgxKTsgfQorICBTdHJpbmdSZWYgZ2V0Q29uZmlndXJhdGlvbk1hY3JvcygpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZ09wZXJhbmQoMik7IH0KKyAgU3RyaW5nUmVmIGdldEluY2x1ZGVQYXRoKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RyaW5nT3BlcmFuZCgzKTsgfQorICBTdHJpbmdSZWYgZ2V0SVN5c1Jvb3QoKSBjb25zdCB7IHJldHVybiBnZXRTdHJpbmdPcGVyYW5kKDQpOyB9CisKKyAgTWV0YWRhdGEgKmdldFJhd1Njb3BlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorICBNRFN0cmluZyAqZ2V0UmF3TmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmRBczxNRFN0cmluZz4oMSk7IH0KKyAgTURTdHJpbmcgKmdldFJhd0NvbmZpZ3VyYXRpb25NYWNyb3MoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kQXM8TURTdHJpbmc+KDIpOyB9CisgIE1EU3RyaW5nICpnZXRSYXdJbmNsdWRlUGF0aCgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmRBczxNRFN0cmluZz4oMyk7IH0KKyAgTURTdHJpbmcgKmdldFJhd0lTeXNSb290KCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZEFzPE1EU3RyaW5nPig0KTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElNb2R1bGVLaW5kOworICB9Cit9OworCisvLy8gQmFzZSBjbGFzcyBmb3IgdGVtcGxhdGUgcGFyYW1ldGVycy4KK2NsYXNzIERJVGVtcGxhdGVQYXJhbWV0ZXIgOiBwdWJsaWMgRElOb2RlIHsKK3Byb3RlY3RlZDoKKyAgRElUZW1wbGF0ZVBhcmFtZXRlcihMTFZNQ29udGV4dCAmQ29udGV4dCwgdW5zaWduZWQgSUQsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVGFnLCBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMpCisgICAgICA6IERJTm9kZShDb250ZXh0LCBJRCwgU3RvcmFnZSwgVGFnLCBPcHMpIHt9CisgIH5ESVRlbXBsYXRlUGFyYW1ldGVyKCkgPSBkZWZhdWx0OworCitwdWJsaWM6CisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RyaW5nT3BlcmFuZCgwKTsgfQorICBESVR5cGVSZWYgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIERJVHlwZVJlZihnZXRSYXdUeXBlKCkpOyB9CisKKyAgTURTdHJpbmcgKmdldFJhd05hbWUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kQXM8TURTdHJpbmc+KDApOyB9CisgIE1ldGFkYXRhICpnZXRSYXdUeXBlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgxKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElUZW1wbGF0ZVR5cGVQYXJhbWV0ZXJLaW5kIHx8CisgICAgICAgICAgIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElUZW1wbGF0ZVZhbHVlUGFyYW1ldGVyS2luZDsKKyAgfQorfTsKKworY2xhc3MgRElUZW1wbGF0ZVR5cGVQYXJhbWV0ZXIgOiBwdWJsaWMgRElUZW1wbGF0ZVBhcmFtZXRlciB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBNRE5vZGU7CisKKyAgRElUZW1wbGF0ZVR5cGVQYXJhbWV0ZXIoTExWTUNvbnRleHQgJkNvbnRleHQsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wcykKKyAgICAgIDogRElUZW1wbGF0ZVBhcmFtZXRlcihDb250ZXh0LCBESVRlbXBsYXRlVHlwZVBhcmFtZXRlcktpbmQsIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHdhcmY6OkRXX1RBR190ZW1wbGF0ZV90eXBlX3BhcmFtZXRlciwgT3BzKSB7fQorICB+RElUZW1wbGF0ZVR5cGVQYXJhbWV0ZXIoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIERJVGVtcGxhdGVUeXBlUGFyYW1ldGVyICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJVHlwZVJlZiBUeXBlLCBTdG9yYWdlVHlwZSBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKSB7CisgICAgcmV0dXJuIGdldEltcGwoQ29udGV4dCwgZ2V0Q2Fub25pY2FsTURTdHJpbmcoQ29udGV4dCwgTmFtZSksIFR5cGUsIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgU2hvdWxkQ3JlYXRlKTsKKyAgfQorICBzdGF0aWMgRElUZW1wbGF0ZVR5cGVQYXJhbWV0ZXIgKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIE1EU3RyaW5nICpOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEgKlR5cGUsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpOworCisgIFRlbXBESVRlbXBsYXRlVHlwZVBhcmFtZXRlciBjbG9uZUltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeShnZXRDb250ZXh0KCksIGdldE5hbWUoKSwgZ2V0VHlwZSgpKTsKKyAgfQorCitwdWJsaWM6CisgIERFRklORV9NRE5PREVfR0VUKERJVGVtcGxhdGVUeXBlUGFyYW1ldGVyLCAoU3RyaW5nUmVmIE5hbWUsIERJVHlwZVJlZiBUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgKE5hbWUsIFR5cGUpKQorICBERUZJTkVfTUROT0RFX0dFVChESVRlbXBsYXRlVHlwZVBhcmFtZXRlciwgKE1EU3RyaW5nICogTmFtZSwgTWV0YWRhdGEgKlR5cGUpLAorICAgICAgICAgICAgICAgICAgICAoTmFtZSwgVHlwZSkpCisKKyAgVGVtcERJVGVtcGxhdGVUeXBlUGFyYW1ldGVyIGNsb25lKCkgY29uc3QgeyByZXR1cm4gY2xvbmVJbXBsKCk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJVGVtcGxhdGVUeXBlUGFyYW1ldGVyS2luZDsKKyAgfQorfTsKKworY2xhc3MgRElUZW1wbGF0ZVZhbHVlUGFyYW1ldGVyIDogcHVibGljIERJVGVtcGxhdGVQYXJhbWV0ZXIgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCisgIERJVGVtcGxhdGVWYWx1ZVBhcmFtZXRlcihMTFZNQ29udGV4dCAmQ29udGV4dCwgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFRhZywgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzKQorICAgICAgOiBESVRlbXBsYXRlUGFyYW1ldGVyKENvbnRleHQsIERJVGVtcGxhdGVWYWx1ZVBhcmFtZXRlcktpbmQsIFN0b3JhZ2UsIFRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHMpIHt9CisgIH5ESVRlbXBsYXRlVmFsdWVQYXJhbWV0ZXIoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIERJVGVtcGxhdGVWYWx1ZVBhcmFtZXRlciAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgdW5zaWduZWQgVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lLCBESVR5cGVSZWYgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSAqVmFsdWUsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKSB7CisgICAgcmV0dXJuIGdldEltcGwoQ29udGV4dCwgVGFnLCBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBOYW1lKSwgVHlwZSwKKyAgICAgICAgICAgICAgICAgICBWYWx1ZSwgU3RvcmFnZSwgU2hvdWxkQ3JlYXRlKTsKKyAgfQorICBzdGF0aWMgRElUZW1wbGF0ZVZhbHVlUGFyYW1ldGVyICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCB1bnNpZ25lZCBUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTURTdHJpbmcgKk5hbWUsIE1ldGFkYXRhICpUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhICpWYWx1ZSwgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpOworCisgIFRlbXBESVRlbXBsYXRlVmFsdWVQYXJhbWV0ZXIgY2xvbmVJbXBsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUZW1wb3JhcnkoZ2V0Q29udGV4dCgpLCBnZXRUYWcoKSwgZ2V0TmFtZSgpLCBnZXRUeXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRWYWx1ZSgpKTsKKyAgfQorCitwdWJsaWM6CisgIERFRklORV9NRE5PREVfR0VUKERJVGVtcGxhdGVWYWx1ZVBhcmFtZXRlciwgKHVuc2lnbmVkIFRhZywgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERJVHlwZVJlZiBUeXBlLCBNZXRhZGF0YSAqVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAoVGFnLCBOYW1lLCBUeXBlLCBWYWx1ZSkpCisgIERFRklORV9NRE5PREVfR0VUKERJVGVtcGxhdGVWYWx1ZVBhcmFtZXRlciwgKHVuc2lnbmVkIFRhZywgTURTdHJpbmcgKk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhICpUeXBlLCBNZXRhZGF0YSAqVmFsdWUpLAorICAgICAgICAgICAgICAgICAgICAoVGFnLCBOYW1lLCBUeXBlLCBWYWx1ZSkpCisKKyAgVGVtcERJVGVtcGxhdGVWYWx1ZVBhcmFtZXRlciBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIGNsb25lSW1wbCgpOyB9CisKKyAgTWV0YWRhdGEgKmdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgyKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElUZW1wbGF0ZVZhbHVlUGFyYW1ldGVyS2luZDsKKyAgfQorfTsKKworLy8vIEJhc2UgY2xhc3MgZm9yIHZhcmlhYmxlcy4KK2NsYXNzIERJVmFyaWFibGUgOiBwdWJsaWMgRElOb2RlIHsKKyAgdW5zaWduZWQgTGluZTsKKyAgdWludDMyX3QgQWxpZ25JbkJpdHM7CisKK3Byb3RlY3RlZDoKKyAgRElWYXJpYWJsZShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgSUQsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzLCB1aW50MzJfdCBBbGlnbkluQml0cyA9IDApCisgICAgICA6IERJTm9kZShDLCBJRCwgU3RvcmFnZSwgZHdhcmY6OkRXX1RBR192YXJpYWJsZSwgT3BzKSwgTGluZShMaW5lKSwKKyAgICAgICAgQWxpZ25JbkJpdHMoQWxpZ25JbkJpdHMpIHt9CisgIH5ESVZhcmlhYmxlKCkgPSBkZWZhdWx0OworCitwdWJsaWM6CisgIHVuc2lnbmVkIGdldExpbmUoKSBjb25zdCB7IHJldHVybiBMaW5lOyB9CisgIERJU2NvcGUgKmdldFNjb3BlKCkgY29uc3QgeyByZXR1cm4gY2FzdF9vcl9udWxsPERJU2NvcGU+KGdldFJhd1Njb3BlKCkpOyB9CisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RyaW5nT3BlcmFuZCgxKTsgfQorICBESUZpbGUgKmdldEZpbGUoKSBjb25zdCB7IHJldHVybiBjYXN0X29yX251bGw8RElGaWxlPihnZXRSYXdGaWxlKCkpOyB9CisgIERJVHlwZVJlZiBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gRElUeXBlUmVmKGdldFJhd1R5cGUoKSk7IH0KKyAgdWludDMyX3QgZ2V0QWxpZ25JbkJpdHMoKSBjb25zdCB7IHJldHVybiBBbGlnbkluQml0czsgfQorICB1aW50MzJfdCBnZXRBbGlnbkluQnl0ZXMoKSBjb25zdCB7IHJldHVybiBnZXRBbGlnbkluQml0cygpIC8gQ0hBUl9CSVQ7IH0KKyAgLy8vIERldGVybWluZXMgdGhlIHNpemUgb2YgdGhlIHZhcmlhYmxlJ3MgdHlwZS4KKyAgT3B0aW9uYWw8dWludDY0X3Q+IGdldFNpemVJbkJpdHMoKSBjb25zdDsKKworICBTdHJpbmdSZWYgZ2V0RmlsZW5hbWUoKSBjb25zdCB7CisgICAgaWYgKGF1dG8gKkYgPSBnZXRGaWxlKCkpCisgICAgICByZXR1cm4gRi0+Z2V0RmlsZW5hbWUoKTsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICBTdHJpbmdSZWYgZ2V0RGlyZWN0b3J5KCkgY29uc3QgeworICAgIGlmIChhdXRvICpGID0gZ2V0RmlsZSgpKQorICAgICAgcmV0dXJuIEYtPmdldERpcmVjdG9yeSgpOworICAgIHJldHVybiAiIjsKKyAgfQorCisgIE9wdGlvbmFsPFN0cmluZ1JlZj4gZ2V0U291cmNlKCkgY29uc3QgeworICAgIGlmIChhdXRvICpGID0gZ2V0RmlsZSgpKQorICAgICAgcmV0dXJuIEYtPmdldFNvdXJjZSgpOworICAgIHJldHVybiBOb25lOworICB9CisKKyAgTWV0YWRhdGEgKmdldFJhd1Njb3BlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorICBNRFN0cmluZyAqZ2V0UmF3TmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmRBczxNRFN0cmluZz4oMSk7IH0KKyAgTWV0YWRhdGEgKmdldFJhd0ZpbGUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDIpOyB9CisgIE1ldGFkYXRhICpnZXRSYXdUeXBlKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgzKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElMb2NhbFZhcmlhYmxlS2luZCB8fAorICAgICAgICAgICBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJR2xvYmFsVmFyaWFibGVLaW5kOworICB9Cit9OworCisvLy8gRFdBUkYgZXhwcmVzc2lvbi4KKy8vLworLy8vIFRoaXMgaXMgKGFsbW9zdCkgYSBEV0FSRiBleHByZXNzaW9uIHRoYXQgbW9kaWZpZXMgdGhlIGxvY2F0aW9uIG9mIGEKKy8vLyB2YXJpYWJsZSwgb3IgdGhlIGxvY2F0aW9uIG9mIGEgc2luZ2xlIHBpZWNlIG9mIGEgdmFyaWFibGUsIG9yICh3aGVuIHVzaW5nCisvLy8gRFdfT1Bfc3RhY2tfdmFsdWUpIGlzIHRoZSBjb25zdGFudCB2YXJpYWJsZSB2YWx1ZS4KKy8vLworLy8vIFRPRE86IENvLWFsbG9jYXRlIHRoZSBleHByZXNzaW9uIGVsZW1lbnRzLgorLy8vIFRPRE86IFNlcGFyYXRlIGZyb20gTUROb2RlLCBvciBvdGhlcndpc2UgZHJvcCBEaXN0aW5jdCBhbmQgVGVtcG9yYXJ5CisvLy8gc3RvcmFnZSB0eXBlcy4KK2NsYXNzIERJRXhwcmVzc2lvbiA6IHB1YmxpYyBNRE5vZGUgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCisgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBFbGVtZW50czsKKworICBESUV4cHJlc3Npb24oTExWTUNvbnRleHQgJkMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIEFycmF5UmVmPHVpbnQ2NF90PiBFbGVtZW50cykKKyAgICAgIDogTUROb2RlKEMsIERJRXhwcmVzc2lvbktpbmQsIFN0b3JhZ2UsIE5vbmUpLAorICAgICAgICBFbGVtZW50cyhFbGVtZW50cy5iZWdpbigpLCBFbGVtZW50cy5lbmQoKSkge30KKyAgfkRJRXhwcmVzc2lvbigpID0gZGVmYXVsdDsKKworICBzdGF0aWMgRElFeHByZXNzaW9uICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ2NF90PiBFbGVtZW50cywgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpOworCisgIFRlbXBESUV4cHJlc3Npb24gY2xvbmVJbXBsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUZW1wb3JhcnkoZ2V0Q29udGV4dCgpLCBnZXRFbGVtZW50cygpKTsKKyAgfQorCitwdWJsaWM6CisgIERFRklORV9NRE5PREVfR0VUKERJRXhwcmVzc2lvbiwgKEFycmF5UmVmPHVpbnQ2NF90PiBFbGVtZW50cyksIChFbGVtZW50cykpCisKKyAgVGVtcERJRXhwcmVzc2lvbiBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIGNsb25lSW1wbCgpOyB9CisKKyAgQXJyYXlSZWY8dWludDY0X3Q+IGdldEVsZW1lbnRzKCkgY29uc3QgeyByZXR1cm4gRWxlbWVudHM7IH0KKworICB1bnNpZ25lZCBnZXROdW1FbGVtZW50cygpIGNvbnN0IHsgcmV0dXJuIEVsZW1lbnRzLnNpemUoKTsgfQorCisgIHVpbnQ2NF90IGdldEVsZW1lbnQodW5zaWduZWQgSSkgY29uc3QgeworICAgIGFzc2VydChJIDwgRWxlbWVudHMuc2l6ZSgpICYmICJJbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICByZXR1cm4gRWxlbWVudHNbSV07CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyByZXByZXNlbnRzIGEgc3RhbmRhbG9uZSBjb25zdGFudCB2YWx1ZS4KKyAgYm9vbCBpc0NvbnN0YW50KCkgY29uc3Q7CisKKyAgdXNpbmcgZWxlbWVudF9pdGVyYXRvciA9IEFycmF5UmVmPHVpbnQ2NF90Pjo6aXRlcmF0b3I7CisKKyAgZWxlbWVudF9pdGVyYXRvciBlbGVtZW50c19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIGdldEVsZW1lbnRzKCkuYmVnaW4oKTsgfQorICBlbGVtZW50X2l0ZXJhdG9yIGVsZW1lbnRzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGdldEVsZW1lbnRzKCkuZW5kKCk7IH0KKworICAvLy8gQSBsaWdodHdlaWdodCB3cmFwcGVyIGFyb3VuZCBhbiBleHByZXNzaW9uIG9wZXJhbmQuCisgIC8vLworICAvLy8gVE9ETzogU3RvcmUgYXJndW1lbnRzIGRpcmVjdGx5IGFuZCBjaGFuZ2UgXGEgRElFeHByZXNzaW9uIHRvIHN0b3JlIGEKKyAgLy8vIHJhbmdlIG9mIHRoZXNlLgorICBjbGFzcyBFeHByT3BlcmFuZCB7CisgICAgY29uc3QgdWludDY0X3QgKk9wID0gbnVsbHB0cjsKKworICBwdWJsaWM6CisgICAgRXhwck9wZXJhbmQoKSA9IGRlZmF1bHQ7CisgICAgZXhwbGljaXQgRXhwck9wZXJhbmQoY29uc3QgdWludDY0X3QgKk9wKSA6IE9wKE9wKSB7fQorCisgICAgY29uc3QgdWludDY0X3QgKmdldCgpIGNvbnN0IHsgcmV0dXJuIE9wOyB9CisKKyAgICAvLy8gR2V0IHRoZSBvcGVyYW5kIGNvZGUuCisgICAgdWludDY0X3QgZ2V0T3AoKSBjb25zdCB7IHJldHVybiAqT3A7IH0KKworICAgIC8vLyBHZXQgYW4gYXJndW1lbnQgdG8gdGhlIG9wZXJhbmQuCisgICAgLy8vCisgICAgLy8vIE5ldmVyIHJldHVybnMgdGhlIG9wZXJhbmQgaXRzZWxmLgorICAgIHVpbnQ2NF90IGdldEFyZyh1bnNpZ25lZCBJKSBjb25zdCB7IHJldHVybiBPcFtJICsgMV07IH0KKworICAgIHVuc2lnbmVkIGdldE51bUFyZ3MoKSBjb25zdCB7IHJldHVybiBnZXRTaXplKCkgLSAxOyB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSBzaXplIG9mIHRoZSBvcGVyYW5kLgorICAgIC8vLworICAgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgb3BlcmFuZCAoMSArIGFyZ3MpLgorICAgIHVuc2lnbmVkIGdldFNpemUoKSBjb25zdDsKKyAgfTsKKworICAvLy8gQW4gaXRlcmF0b3IgZm9yIGV4cHJlc3Npb24gb3BlcmFuZHMuCisgIGNsYXNzIGV4cHJfb3BfaXRlcmF0b3IKKyAgICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjppbnB1dF9pdGVyYXRvcl90YWcsIEV4cHJPcGVyYW5kPiB7CisgICAgRXhwck9wZXJhbmQgT3A7CisKKyAgcHVibGljOgorICAgIGV4cHJfb3BfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgICAgZXhwbGljaXQgZXhwcl9vcF9pdGVyYXRvcihlbGVtZW50X2l0ZXJhdG9yIEkpIDogT3AoSSkge30KKworICAgIGVsZW1lbnRfaXRlcmF0b3IgZ2V0QmFzZSgpIGNvbnN0IHsgcmV0dXJuIE9wLmdldCgpOyB9CisgICAgY29uc3QgRXhwck9wZXJhbmQgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIE9wOyB9CisgICAgY29uc3QgRXhwck9wZXJhbmQgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmT3A7IH0KKworICAgIGV4cHJfb3BfaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgICBpbmNyZW1lbnQoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgZXhwcl9vcF9pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeworICAgICAgZXhwcl9vcF9pdGVyYXRvciBUKCp0aGlzKTsKKyAgICAgIGluY3JlbWVudCgpOworICAgICAgcmV0dXJuIFQ7CisgICAgfQorCisgICAgLy8vIEdldCB0aGUgbmV4dCBpdGVyYXRvci4KKyAgICAvLy8KKyAgICAvLy8gXGEgc3RkOjpuZXh0KCkgZG9lc24ndCB3b3JrIGJlY2F1c2UgdGhpcyBpcyB0ZWNobmljYWxseSBhbgorICAgIC8vLyBpbnB1dF9pdGVyYXRvciwgYnV0IGl0J3MgYSBwZXJmZWN0bHkgdmFsaWQgb3BlcmF0aW9uLiAgVGhpcyBpcyBhbgorICAgIC8vLyBhY2Nlc3NvciB0byBwcm92aWRlIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkuCisgICAgZXhwcl9vcF9pdGVyYXRvciBnZXROZXh0KCkgY29uc3QgeyByZXR1cm4gKytleHByX29wX2l0ZXJhdG9yKCp0aGlzKTsgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGV4cHJfb3BfaXRlcmF0b3IgJlgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRCYXNlKCkgPT0gWC5nZXRCYXNlKCk7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBleHByX29wX2l0ZXJhdG9yICZYKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0QmFzZSgpICE9IFguZ2V0QmFzZSgpOworICAgIH0KKworICBwcml2YXRlOgorICAgIHZvaWQgaW5jcmVtZW50KCkgeyBPcCA9IEV4cHJPcGVyYW5kKGdldEJhc2UoKSArIE9wLmdldFNpemUoKSk7IH0KKyAgfTsKKworICAvLy8gVmlzaXQgdGhlIGVsZW1lbnRzIHZpYSBFeHByT3BlcmFuZCB3cmFwcGVycy4KKyAgLy8vCisgIC8vLyBUaGVzZSByYW5nZSBpdGVyYXRvcnMgdmlzaXQgZWxlbWVudHMgdGhyb3VnaCBcYSBFeHByT3BlcmFuZCB3cmFwcGVycy4KKyAgLy8vIFRoaXMgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgYSB2YWxpZCByYW5nZSB1bmxlc3MgXGEgaXNWYWxpZCgpIGdpdmVzIFxjCisgIC8vLyB0cnVlLgorICAvLy8KKyAgLy8vIFxwcmUgXGEgaXNWYWxpZCgpIGdpdmVzIFxjIHRydWUuCisgIC8vLyBAeworICBleHByX29wX2l0ZXJhdG9yIGV4cHJfb3BfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGV4cHJfb3BfaXRlcmF0b3IoZWxlbWVudHNfYmVnaW4oKSk7CisgIH0KKyAgZXhwcl9vcF9pdGVyYXRvciBleHByX29wX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZXhwcl9vcF9pdGVyYXRvcihlbGVtZW50c19lbmQoKSk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8ZXhwcl9vcF9pdGVyYXRvcj4gZXhwcl9vcHMoKSBjb25zdCB7CisgICAgcmV0dXJuIHtleHByX29wX2JlZ2luKCksIGV4cHJfb3BfZW5kKCl9OworICB9CisgIC8vLyBAfQorCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElFeHByZXNzaW9uS2luZDsKKyAgfQorCisgIC8vLyBSZXR1cm4gd2hldGhlciB0aGUgZmlyc3QgZWxlbWVudCBhIERXX09QX2RlcmVmLgorICBib29sIHN0YXJ0c1dpdGhEZXJlZigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TnVtRWxlbWVudHMoKSA+IDAgJiYgZ2V0RWxlbWVudCgwKSA9PSBkd2FyZjo6RFdfT1BfZGVyZWY7CisgIH0KKworICAvLy8gSG9sZHMgdGhlIGNoYXJhY3RlcmlzdGljcyBvZiBvbmUgZnJhZ21lbnQgb2YgYSBsYXJnZXIgdmFyaWFibGUuCisgIHN0cnVjdCBGcmFnbWVudEluZm8geworICAgIHVpbnQ2NF90IFNpemVJbkJpdHM7CisgICAgdWludDY0X3QgT2Zmc2V0SW5CaXRzOworICB9OworCisgIC8vLyBSZXRyaWV2ZSB0aGUgZGV0YWlscyBvZiB0aGlzIGZyYWdtZW50IGV4cHJlc3Npb24uCisgIHN0YXRpYyBPcHRpb25hbDxGcmFnbWVudEluZm8+IGdldEZyYWdtZW50SW5mbyhleHByX29wX2l0ZXJhdG9yIFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwcl9vcF9pdGVyYXRvciBFbmQpOworCisgIC8vLyBSZXRyaWV2ZSB0aGUgZGV0YWlscyBvZiB0aGlzIGZyYWdtZW50IGV4cHJlc3Npb24uCisgIE9wdGlvbmFsPEZyYWdtZW50SW5mbz4gZ2V0RnJhZ21lbnRJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBnZXRGcmFnbWVudEluZm8oZXhwcl9vcF9iZWdpbigpLCBleHByX29wX2VuZCgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gd2hldGhlciB0aGlzIGlzIGEgcGllY2Ugb2YgYW4gYWdncmVnYXRlIHZhcmlhYmxlLgorICBib29sIGlzRnJhZ21lbnQoKSBjb25zdCB7IHJldHVybiBnZXRGcmFnbWVudEluZm8oKS5oYXNWYWx1ZSgpOyB9CisKKyAgLy8vIEFwcGVuZCBccCBPcHMgd2l0aCBvcGVyYXRpb25zIHRvIGFwcGx5IHRoZSBccCBPZmZzZXQuCisgIHN0YXRpYyB2b2lkIGFwcGVuZE9mZnNldChTbWFsbFZlY3RvckltcGw8dWludDY0X3Q+ICZPcHMsIGludDY0X3QgT2Zmc2V0KTsKKworICAvLy8gSWYgdGhpcyBpcyBhIGNvbnN0YW50IG9mZnNldCwgZXh0cmFjdCBpdC4gSWYgdGhlcmUgaXMgbm8gZXhwcmVzc2lvbiwKKyAgLy8vIHJldHVybiB0cnVlIHdpdGggYW4gb2Zmc2V0IG9mIHplcm8uCisgIGJvb2wgZXh0cmFjdElmT2Zmc2V0KGludDY0X3QgJk9mZnNldCkgY29uc3Q7CisKKyAgLy8vIENvbnN0YW50cyBmb3IgRElFeHByZXNzaW9uOjpwcmVwZW5kLgorICBlbnVtIHsgTm9EZXJlZiA9IGZhbHNlLCBXaXRoRGVyZWYgPSB0cnVlLCBXaXRoU3RhY2tWYWx1ZSA9IHRydWUgfTsKKworICAvLy8gUHJlcGVuZCBccCBESUV4cHIgd2l0aCBhIGRlcmVmIGFuZCBvZmZzZXQgb3BlcmF0aW9uIGFuZCBvcHRpb25hbGx5IHR1cm4gaXQKKyAgLy8vIGludG8gYSBzdGFjayB2YWx1ZS4KKyAgc3RhdGljIERJRXhwcmVzc2lvbiAqcHJlcGVuZChjb25zdCBESUV4cHJlc3Npb24gKkRJRXhwciwgYm9vbCBEZXJlZkJlZm9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IE9mZnNldCA9IDAsIGJvb2wgRGVyZWZBZnRlciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU3RhY2tWYWx1ZSA9IGZhbHNlKTsKKworICAvLy8gUHJlcGVuZCBccCBESUV4cHIgd2l0aCB0aGUgZ2l2ZW4gb3Bjb2RlcyBhbmQgb3B0aW9uYWxseSB0dXJuIGl0IGludG8gYQorICAvLy8gc3RhY2sgdmFsdWUuCisgIHN0YXRpYyBESUV4cHJlc3Npb24gKmRvUHJlcGVuZChjb25zdCBESUV4cHJlc3Npb24gKkRJRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDx1aW50NjRfdD4gJk9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU3RhY2tWYWx1ZSA9IGZhbHNlKTsKKworICAvLy8gQ3JlYXRlIGEgRElFeHByZXNzaW9uIHRvIGRlc2NyaWJlIG9uZSBwYXJ0IG9mIGFuIGFnZ3JlZ2F0ZSB2YXJpYWJsZSB0aGF0CisgIC8vLyBpcyBmcmFnbWVudGVkIGFjcm9zcyBtdWx0aXBsZSBWYWx1ZXMuIFRoZSBEV19PUF9MTFZNX2ZyYWdtZW50IG9wZXJhdGlvbgorICAvLy8gd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZWxlbWVudHMgb2YgXGMgRXhwci4gSWYgXGMgRXhwciBhbHJlYWR5IGNvbnRhaW5zCisgIC8vLyBhIFxjIERXX09QX0xMVk1fZnJhZ21lbnQgXGMgT2Zmc2V0SW5CaXRzIGlzIGludGVycHJldGVkIGFzIGFuIG9mZnNldAorICAvLy8gaW50byB0aGUgZXhpc3RpbmcgZnJhZ21lbnQuCisgIC8vLworICAvLy8gXHBhcmFtIE9mZnNldEluQml0cyBPZmZzZXQgb2YgdGhlIHBpZWNlIGluIGJpdHMuCisgIC8vLyBccGFyYW0gU2l6ZUluQml0cyAgIFNpemUgb2YgdGhlIHBpZWNlIGluIGJpdHMuCisgIC8vLyBccmV0dXJuICAgICAgICAgICAgIENyZWF0aW5nIGEgZnJhZ21lbnQgZXhwcmVzc2lvbiBtYXkgZmFpbCBpZiBcYyBFeHByCisgIC8vLyAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIGFyaXRobWV0aWMgb3BlcmF0aW9ucyB0aGF0IHdvdWxkIGJlIHRydW5jYXRlZC4KKyAgc3RhdGljIE9wdGlvbmFsPERJRXhwcmVzc2lvbiAqPgorICBjcmVhdGVGcmFnbWVudEV4cHJlc3Npb24oY29uc3QgRElFeHByZXNzaW9uICpFeHByLCB1bnNpZ25lZCBPZmZzZXRJbkJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTaXplSW5CaXRzKTsKKworICAvLy8gRGV0ZXJtaW5lIHRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgZnJhZ21lbnRzIGRlc2NyaWJlZCBieSB0aGlzCisgIC8vLyBESUV4cHJlc3Npb24gYW5kIFxwIE90aGVyLgorICAvLy8gUmV0dXJucyAtMSBpZiB0aGlzIGlzIGVudGlyZWx5IGJlZm9yZSBPdGhlciwgMCBpZiB0aGlzIGFuZCBPdGhlciBvdmVybGFwLAorICAvLy8gMSBpZiB0aGlzIGlzIGVudGlyZWx5IGFmdGVyIE90aGVyLgorICBpbnQgZnJhZ21lbnRDbXAoY29uc3QgRElFeHByZXNzaW9uICpPdGhlcikgY29uc3QgeworICAgIGF1dG8gRnJhZ21lbnQxID0gKmdldEZyYWdtZW50SW5mbygpOworICAgIGF1dG8gRnJhZ21lbnQyID0gKk90aGVyLT5nZXRGcmFnbWVudEluZm8oKTsKKyAgICB1bnNpZ25lZCBsMSA9IEZyYWdtZW50MS5PZmZzZXRJbkJpdHM7CisgICAgdW5zaWduZWQgbDIgPSBGcmFnbWVudDIuT2Zmc2V0SW5CaXRzOworICAgIHVuc2lnbmVkIHIxID0gbDEgKyBGcmFnbWVudDEuU2l6ZUluQml0czsKKyAgICB1bnNpZ25lZCByMiA9IGwyICsgRnJhZ21lbnQyLlNpemVJbkJpdHM7CisgICAgaWYgKHIxIDw9IGwyKQorICAgICAgcmV0dXJuIC0xOworICAgIGVsc2UgaWYgKHIyIDw9IGwxKQorICAgICAgcmV0dXJuIDE7CisgICAgZWxzZQorICAgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gQ2hlY2sgaWYgZnJhZ21lbnRzIG92ZXJsYXAgYmV0d2VlbiB0aGlzIERJRXhwcmVzc2lvbiBhbmQgXHAgT3RoZXIuCisgIGJvb2wgZnJhZ21lbnRzT3ZlcmxhcChjb25zdCBESUV4cHJlc3Npb24gKk90aGVyKSBjb25zdCB7CisgICAgaWYgKCFpc0ZyYWdtZW50KCkgfHwgIU90aGVyLT5pc0ZyYWdtZW50KCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZnJhZ21lbnRDbXAoT3RoZXIpID09IDA7CisgIH0KK307CisKKy8vLyBHbG9iYWwgdmFyaWFibGVzLgorLy8vCisvLy8gVE9ETzogUmVtb3ZlIERpc3BsYXlOYW1lLiAgSXQncyBhbHdheXMgZXF1YWwgdG8gTmFtZS4KK2NsYXNzIERJR2xvYmFsVmFyaWFibGUgOiBwdWJsaWMgRElWYXJpYWJsZSB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBNRE5vZGU7CisKKyAgYm9vbCBJc0xvY2FsVG9Vbml0OworICBib29sIElzRGVmaW5pdGlvbjsKKworICBESUdsb2JhbFZhcmlhYmxlKExMVk1Db250ZXh0ICZDLCBTdG9yYWdlVHlwZSBTdG9yYWdlLCB1bnNpZ25lZCBMaW5lLAorICAgICAgICAgICAgICAgICAgIGJvb2wgSXNMb2NhbFRvVW5pdCwgYm9vbCBJc0RlZmluaXRpb24sIHVpbnQzMl90IEFsaWduSW5CaXRzLAorICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wcykKKyAgICAgIDogRElWYXJpYWJsZShDLCBESUdsb2JhbFZhcmlhYmxlS2luZCwgU3RvcmFnZSwgTGluZSwgT3BzLCBBbGlnbkluQml0cyksCisgICAgICAgIElzTG9jYWxUb1VuaXQoSXNMb2NhbFRvVW5pdCksIElzRGVmaW5pdGlvbihJc0RlZmluaXRpb24pIHt9CisgIH5ESUdsb2JhbFZhcmlhYmxlKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBESUdsb2JhbFZhcmlhYmxlICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCBESVNjb3BlICpTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBMaW5rYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lLCBESVR5cGVSZWYgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0xvY2FsVG9Vbml0LCBib29sIElzRGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElEZXJpdmVkVHlwZSAqU3RhdGljRGF0YU1lbWJlckRlY2xhcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBbGlnbkluQml0cywgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKSB7CisgICAgcmV0dXJuIGdldEltcGwoQ29udGV4dCwgU2NvcGUsIGdldENhbm9uaWNhbE1EU3RyaW5nKENvbnRleHQsIE5hbWUpLAorICAgICAgICAgICAgICAgICAgIGdldENhbm9uaWNhbE1EU3RyaW5nKENvbnRleHQsIExpbmthZ2VOYW1lKSwgRmlsZSwgTGluZSwgVHlwZSwKKyAgICAgICAgICAgICAgICAgICBJc0xvY2FsVG9Vbml0LCBJc0RlZmluaXRpb24sIFN0YXRpY0RhdGFNZW1iZXJEZWNsYXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICBBbGlnbkluQml0cywgU3RvcmFnZSwgU2hvdWxkQ3JlYXRlKTsKKyAgfQorICBzdGF0aWMgRElHbG9iYWxWYXJpYWJsZSAqCisgIGdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIE1ldGFkYXRhICpTY29wZSwgTURTdHJpbmcgKk5hbWUsCisgICAgICAgICAgTURTdHJpbmcgKkxpbmthZ2VOYW1lLCBNZXRhZGF0YSAqRmlsZSwgdW5zaWduZWQgTGluZSwgTWV0YWRhdGEgKlR5cGUsCisgICAgICAgICAgYm9vbCBJc0xvY2FsVG9Vbml0LCBib29sIElzRGVmaW5pdGlvbiwKKyAgICAgICAgICBNZXRhZGF0YSAqU3RhdGljRGF0YU1lbWJlckRlY2xhcmF0aW9uLCB1aW50MzJfdCBBbGlnbkluQml0cywKKyAgICAgICAgICBTdG9yYWdlVHlwZSBTdG9yYWdlLCBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpOworCisgIFRlbXBESUdsb2JhbFZhcmlhYmxlIGNsb25lSW1wbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGVtcG9yYXJ5KGdldENvbnRleHQoKSwgZ2V0U2NvcGUoKSwgZ2V0TmFtZSgpLCBnZXRMaW5rYWdlTmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZSgpLCBnZXRMaW5lKCksIGdldFR5cGUoKSwgaXNMb2NhbFRvVW5pdCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgaXNEZWZpbml0aW9uKCksIGdldFN0YXRpY0RhdGFNZW1iZXJEZWNsYXJhdGlvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0QWxpZ25JbkJpdHMoKSk7CisgIH0KKworcHVibGljOgorICBERUZJTkVfTUROT0RFX0dFVChESUdsb2JhbFZhcmlhYmxlLAorICAgICAgICAgICAgICAgICAgICAoRElTY29wZSAqIFNjb3BlLCBTdHJpbmdSZWYgTmFtZSwgU3RyaW5nUmVmIExpbmthZ2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lLCBESVR5cGVSZWYgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNMb2NhbFRvVW5pdCwgYm9vbCBJc0RlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICBESURlcml2ZWRUeXBlICpTdGF0aWNEYXRhTWVtYmVyRGVjbGFyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBBbGlnbkluQml0cyksCisgICAgICAgICAgICAgICAgICAgIChTY29wZSwgTmFtZSwgTGlua2FnZU5hbWUsIEZpbGUsIExpbmUsIFR5cGUsIElzTG9jYWxUb1VuaXQsCisgICAgICAgICAgICAgICAgICAgICBJc0RlZmluaXRpb24sIFN0YXRpY0RhdGFNZW1iZXJEZWNsYXJhdGlvbiwgQWxpZ25JbkJpdHMpKQorICBERUZJTkVfTUROT0RFX0dFVChESUdsb2JhbFZhcmlhYmxlLAorICAgICAgICAgICAgICAgICAgICAoTWV0YWRhdGEgKiBTY29wZSwgTURTdHJpbmcgKk5hbWUsIE1EU3RyaW5nICpMaW5rYWdlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhICpGaWxlLCB1bnNpZ25lZCBMaW5lLCBNZXRhZGF0YSAqVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNMb2NhbFRvVW5pdCwgYm9vbCBJc0RlZmluaXRpb24sCisgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSAqU3RhdGljRGF0YU1lbWJlckRlY2xhcmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQWxpZ25JbkJpdHMpLAorICAgICAgICAgICAgICAgICAgICAoU2NvcGUsIE5hbWUsIExpbmthZ2VOYW1lLCBGaWxlLCBMaW5lLCBUeXBlLCBJc0xvY2FsVG9Vbml0LAorICAgICAgICAgICAgICAgICAgICAgSXNEZWZpbml0aW9uLCBTdGF0aWNEYXRhTWVtYmVyRGVjbGFyYXRpb24sIEFsaWduSW5CaXRzKSkKKworICBUZW1wRElHbG9iYWxWYXJpYWJsZSBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIGNsb25lSW1wbCgpOyB9CisKKyAgYm9vbCBpc0xvY2FsVG9Vbml0KCkgY29uc3QgeyByZXR1cm4gSXNMb2NhbFRvVW5pdDsgfQorICBib29sIGlzRGVmaW5pdGlvbigpIGNvbnN0IHsgcmV0dXJuIElzRGVmaW5pdGlvbjsgfQorICBTdHJpbmdSZWYgZ2V0RGlzcGxheU5hbWUoKSBjb25zdCB7IHJldHVybiBnZXRTdHJpbmdPcGVyYW5kKDQpOyB9CisgIFN0cmluZ1JlZiBnZXRMaW5rYWdlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZ09wZXJhbmQoNSk7IH0KKyAgRElEZXJpdmVkVHlwZSAqZ2V0U3RhdGljRGF0YU1lbWJlckRlY2xhcmF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0X29yX251bGw8RElEZXJpdmVkVHlwZT4oZ2V0UmF3U3RhdGljRGF0YU1lbWJlckRlY2xhcmF0aW9uKCkpOworICB9CisKKyAgTURTdHJpbmcgKmdldFJhd0xpbmthZ2VOYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZEFzPE1EU3RyaW5nPig1KTsgfQorICBNZXRhZGF0YSAqZ2V0UmF3U3RhdGljRGF0YU1lbWJlckRlY2xhcmF0aW9uKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCg2KTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElHbG9iYWxWYXJpYWJsZUtpbmQ7CisgIH0KK307CisKKy8vLyBMb2NhbCB2YXJpYWJsZS4KKy8vLworLy8vIFRPRE86IFNwbGl0IHVwIGZsYWdzLgorY2xhc3MgRElMb2NhbFZhcmlhYmxlIDogcHVibGljIERJVmFyaWFibGUgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCisgIHVuc2lnbmVkIEFyZyA6IDE2OworICBESUZsYWdzIEZsYWdzOworCisgIERJTG9jYWxWYXJpYWJsZShMTFZNQ29udGV4dCAmQywgU3RvcmFnZVR5cGUgU3RvcmFnZSwgdW5zaWduZWQgTGluZSwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFyZywgRElGbGFncyBGbGFncywgdWludDMyX3QgQWxpZ25JbkJpdHMsCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMpCisgICAgICA6IERJVmFyaWFibGUoQywgRElMb2NhbFZhcmlhYmxlS2luZCwgU3RvcmFnZSwgTGluZSwgT3BzLCBBbGlnbkluQml0cyksCisgICAgICAgIEFyZyhBcmcpLCBGbGFncyhGbGFncykgeworICAgIGFzc2VydChBcmcgPCAoMSA8PCAxNikgJiYgIkRJTG9jYWxWYXJpYWJsZTogQXJnIG91dCBvZiByYW5nZSIpOworICB9CisgIH5ESUxvY2FsVmFyaWFibGUoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIERJTG9jYWxWYXJpYWJsZSAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgRElTY29wZSAqU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUsIERJRmlsZSAqRmlsZSwgdW5zaWduZWQgTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVR5cGVSZWYgVHlwZSwgdW5zaWduZWQgQXJnLCBESUZsYWdzIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEFsaWduSW5CaXRzLCBTdG9yYWdlVHlwZSBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSkgeworICAgIHJldHVybiBnZXRJbXBsKENvbnRleHQsIFNjb3BlLCBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBOYW1lKSwgRmlsZSwKKyAgICAgICAgICAgICAgICAgICBMaW5lLCBUeXBlLCBBcmcsIEZsYWdzLCBBbGlnbkluQml0cywgU3RvcmFnZSwgU2hvdWxkQ3JlYXRlKTsKKyAgfQorICBzdGF0aWMgRElMb2NhbFZhcmlhYmxlICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCBNZXRhZGF0YSAqU2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTURTdHJpbmcgKk5hbWUsIE1ldGFkYXRhICpGaWxlLCB1bnNpZ25lZCBMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhICpUeXBlLCB1bnNpZ25lZCBBcmcsIERJRmxhZ3MgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgQWxpZ25JbkJpdHMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wRElMb2NhbFZhcmlhYmxlIGNsb25lSW1wbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGVtcG9yYXJ5KGdldENvbnRleHQoKSwgZ2V0U2NvcGUoKSwgZ2V0TmFtZSgpLCBnZXRGaWxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRMaW5lKCksIGdldFR5cGUoKSwgZ2V0QXJnKCksIGdldEZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRBbGlnbkluQml0cygpKTsKKyAgfQorCitwdWJsaWM6CisgIERFRklORV9NRE5PREVfR0VUKERJTG9jYWxWYXJpYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgKERJTG9jYWxTY29wZSAqIFNjb3BlLCBTdHJpbmdSZWYgTmFtZSwgRElGaWxlICpGaWxlLAorICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZSwgRElUeXBlUmVmIFR5cGUsIHVuc2lnbmVkIEFyZywKKyAgICAgICAgICAgICAgICAgICAgIERJRmxhZ3MgRmxhZ3MsIHVpbnQzMl90IEFsaWduSW5CaXRzKSwKKyAgICAgICAgICAgICAgICAgICAgKFNjb3BlLCBOYW1lLCBGaWxlLCBMaW5lLCBUeXBlLCBBcmcsIEZsYWdzLCBBbGlnbkluQml0cykpCisgIERFRklORV9NRE5PREVfR0VUKERJTG9jYWxWYXJpYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgKE1ldGFkYXRhICogU2NvcGUsIE1EU3RyaW5nICpOYW1lLCBNZXRhZGF0YSAqRmlsZSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExpbmUsIE1ldGFkYXRhICpUeXBlLCB1bnNpZ25lZCBBcmcsCisgICAgICAgICAgICAgICAgICAgICBESUZsYWdzIEZsYWdzLCB1aW50MzJfdCBBbGlnbkluQml0cyksCisgICAgICAgICAgICAgICAgICAgIChTY29wZSwgTmFtZSwgRmlsZSwgTGluZSwgVHlwZSwgQXJnLCBGbGFncywgQWxpZ25JbkJpdHMpKQorCisgIFRlbXBESUxvY2FsVmFyaWFibGUgY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCisgIC8vLyBHZXQgdGhlIGxvY2FsIHNjb3BlIGZvciB0aGlzIHZhcmlhYmxlLgorICAvLy8KKyAgLy8vIFZhcmlhYmxlcyBtdXN0IGJlIGRlZmluZWQgaW4gYSBsb2NhbCBzY29wZS4KKyAgRElMb2NhbFNjb3BlICpnZXRTY29wZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxESUxvY2FsU2NvcGU+KERJVmFyaWFibGU6OmdldFNjb3BlKCkpOworICB9CisKKyAgYm9vbCBpc1BhcmFtZXRlcigpIGNvbnN0IHsgcmV0dXJuIEFyZzsgfQorICB1bnNpZ25lZCBnZXRBcmcoKSBjb25zdCB7IHJldHVybiBBcmc7IH0KKyAgRElGbGFncyBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIEZsYWdzOyB9CisKKyAgYm9vbCBpc0FydGlmaWNpYWwoKSBjb25zdCB7IHJldHVybiBnZXRGbGFncygpICYgRmxhZ0FydGlmaWNpYWw7IH0KKyAgYm9vbCBpc09iamVjdFBvaW50ZXIoKSBjb25zdCB7IHJldHVybiBnZXRGbGFncygpICYgRmxhZ09iamVjdFBvaW50ZXI7IH0KKworICAvLy8gQ2hlY2sgdGhhdCBhIGxvY2F0aW9uIGlzIHZhbGlkIGZvciB0aGlzIHZhcmlhYmxlLgorICAvLy8KKyAgLy8vIENoZWNrIHRoYXQgXGMgREwgZXhpc3RzLCBpcyBpbiB0aGUgc2FtZSBzdWJwcm9ncmFtLCBhbmQgaGFzIHRoZSBzYW1lCisgIC8vLyBpbmxpbmVkLWF0IGxvY2F0aW9uIGFzIFxjIHRoaXMuICAoT3RoZXJ3aXNlLCBpdCdzIG5vdCBhIHZhbGlkIGF0dGFjaG1lbnQKKyAgLy8vIHRvIGEgXGEgRGJnSW5mb0ludHJpbnNpYy4pCisgIGJvb2wgaXNWYWxpZExvY2F0aW9uRm9ySW50cmluc2ljKGNvbnN0IERJTG9jYXRpb24gKkRMKSBjb25zdCB7CisgICAgcmV0dXJuIERMICYmIGdldFNjb3BlKCktPmdldFN1YnByb2dyYW0oKSA9PSBETC0+Z2V0U2NvcGUoKS0+Z2V0U3VicHJvZ3JhbSgpOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBESUxvY2FsVmFyaWFibGVLaW5kOworICB9Cit9OworCitjbGFzcyBESU9iakNQcm9wZXJ0eSA6IHB1YmxpYyBESU5vZGUgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCisgIHVuc2lnbmVkIExpbmU7CisgIHVuc2lnbmVkIEF0dHJpYnV0ZXM7CisKKyAgRElPYmpDUHJvcGVydHkoTExWTUNvbnRleHQgJkMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEF0dHJpYnV0ZXMsIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wcykKKyAgICAgIDogRElOb2RlKEMsIERJT2JqQ1Byb3BlcnR5S2luZCwgU3RvcmFnZSwgZHdhcmY6OkRXX1RBR19BUFBMRV9wcm9wZXJ0eSwKKyAgICAgICAgICAgICAgIE9wcyksCisgICAgICAgIExpbmUoTGluZSksIEF0dHJpYnV0ZXMoQXR0cmlidXRlcykge30KKyAgfkRJT2JqQ1Byb3BlcnR5KCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBESU9iakNQcm9wZXJ0eSAqCisgIGdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIFN0cmluZ1JlZiBOYW1lLCBESUZpbGUgKkZpbGUsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgU3RyaW5nUmVmIEdldHRlck5hbWUsIFN0cmluZ1JlZiBTZXR0ZXJOYW1lLCB1bnNpZ25lZCBBdHRyaWJ1dGVzLAorICAgICAgICAgIERJVHlwZVJlZiBUeXBlLCBTdG9yYWdlVHlwZSBTdG9yYWdlLCBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpIHsKKyAgICByZXR1cm4gZ2V0SW1wbChDb250ZXh0LCBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBOYW1lKSwgRmlsZSwgTGluZSwKKyAgICAgICAgICAgICAgICAgICBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBHZXR0ZXJOYW1lKSwKKyAgICAgICAgICAgICAgICAgICBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBTZXR0ZXJOYW1lKSwgQXR0cmlidXRlcywgVHlwZSwKKyAgICAgICAgICAgICAgICAgICBTdG9yYWdlLCBTaG91bGRDcmVhdGUpOworICB9CisgIHN0YXRpYyBESU9iakNQcm9wZXJ0eSAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgTURTdHJpbmcgKk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSAqRmlsZSwgdW5zaWduZWQgTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1EU3RyaW5nICpHZXR0ZXJOYW1lLCBNRFN0cmluZyAqU2V0dGVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEF0dHJpYnV0ZXMsIE1ldGFkYXRhICpUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wRElPYmpDUHJvcGVydHkgY2xvbmVJbXBsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRUZW1wb3JhcnkoZ2V0Q29udGV4dCgpLCBnZXROYW1lKCksIGdldEZpbGUoKSwgZ2V0TGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0R2V0dGVyTmFtZSgpLCBnZXRTZXR0ZXJOYW1lKCksIGdldEF0dHJpYnV0ZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdldFR5cGUoKSk7CisgIH0KKworcHVibGljOgorICBERUZJTkVfTUROT0RFX0dFVChESU9iakNQcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgKFN0cmluZ1JlZiBOYW1lLCBESUZpbGUgKkZpbGUsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgR2V0dGVyTmFtZSwgU3RyaW5nUmVmIFNldHRlck5hbWUsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBBdHRyaWJ1dGVzLCBESVR5cGVSZWYgVHlwZSksCisgICAgICAgICAgICAgICAgICAgIChOYW1lLCBGaWxlLCBMaW5lLCBHZXR0ZXJOYW1lLCBTZXR0ZXJOYW1lLCBBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgVHlwZSkpCisgIERFRklORV9NRE5PREVfR0VUKERJT2JqQ1Byb3BlcnR5LAorICAgICAgICAgICAgICAgICAgICAoTURTdHJpbmcgKiBOYW1lLCBNZXRhZGF0YSAqRmlsZSwgdW5zaWduZWQgTGluZSwKKyAgICAgICAgICAgICAgICAgICAgIE1EU3RyaW5nICpHZXR0ZXJOYW1lLCBNRFN0cmluZyAqU2V0dGVyTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEF0dHJpYnV0ZXMsIE1ldGFkYXRhICpUeXBlKSwKKyAgICAgICAgICAgICAgICAgICAgKE5hbWUsIEZpbGUsIExpbmUsIEdldHRlck5hbWUsIFNldHRlck5hbWUsIEF0dHJpYnV0ZXMsCisgICAgICAgICAgICAgICAgICAgICBUeXBlKSkKKworICBUZW1wRElPYmpDUHJvcGVydHkgY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCisgIHVuc2lnbmVkIGdldExpbmUoKSBjb25zdCB7IHJldHVybiBMaW5lOyB9CisgIHVuc2lnbmVkIGdldEF0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBBdHRyaWJ1dGVzOyB9CisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RyaW5nT3BlcmFuZCgwKTsgfQorICBESUZpbGUgKmdldEZpbGUoKSBjb25zdCB7IHJldHVybiBjYXN0X29yX251bGw8RElGaWxlPihnZXRSYXdGaWxlKCkpOyB9CisgIFN0cmluZ1JlZiBnZXRHZXR0ZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RyaW5nT3BlcmFuZCgyKTsgfQorICBTdHJpbmdSZWYgZ2V0U2V0dGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZ09wZXJhbmQoMyk7IH0KKyAgRElUeXBlUmVmIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBESVR5cGVSZWYoZ2V0UmF3VHlwZSgpKTsgfQorCisgIFN0cmluZ1JlZiBnZXRGaWxlbmFtZSgpIGNvbnN0IHsKKyAgICBpZiAoYXV0byAqRiA9IGdldEZpbGUoKSkKKyAgICAgIHJldHVybiBGLT5nZXRGaWxlbmFtZSgpOworICAgIHJldHVybiAiIjsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXREaXJlY3RvcnkoKSBjb25zdCB7CisgICAgaWYgKGF1dG8gKkYgPSBnZXRGaWxlKCkpCisgICAgICByZXR1cm4gRi0+Z2V0RGlyZWN0b3J5KCk7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgT3B0aW9uYWw8U3RyaW5nUmVmPiBnZXRTb3VyY2UoKSBjb25zdCB7CisgICAgaWYgKGF1dG8gKkYgPSBnZXRGaWxlKCkpCisgICAgICByZXR1cm4gRi0+Z2V0U291cmNlKCk7CisgICAgcmV0dXJuIE5vbmU7CisgIH0KKworICBNRFN0cmluZyAqZ2V0UmF3TmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmRBczxNRFN0cmluZz4oMCk7IH0KKyAgTWV0YWRhdGEgKmdldFJhd0ZpbGUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDEpOyB9CisgIE1EU3RyaW5nICpnZXRSYXdHZXR0ZXJOYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZEFzPE1EU3RyaW5nPigyKTsgfQorICBNRFN0cmluZyAqZ2V0UmF3U2V0dGVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmRBczxNRFN0cmluZz4oMyk7IH0KKyAgTWV0YWRhdGEgKmdldFJhd1R5cGUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDQpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBESU9iakNQcm9wZXJ0eUtpbmQ7CisgIH0KK307CisKKy8vLyBBbiBpbXBvcnRlZCBtb2R1bGUgKEMrKyB1c2luZyBkaXJlY3RpdmUgb3Igc2ltaWxhcikuCitjbGFzcyBESUltcG9ydGVkRW50aXR5IDogcHVibGljIERJTm9kZSB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBNRE5vZGU7CisKKyAgdW5zaWduZWQgTGluZTsKKworICBESUltcG9ydGVkRW50aXR5KExMVk1Db250ZXh0ICZDLCBTdG9yYWdlVHlwZSBTdG9yYWdlLCB1bnNpZ25lZCBUYWcsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZSwgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzKQorICAgICAgOiBESU5vZGUoQywgRElJbXBvcnRlZEVudGl0eUtpbmQsIFN0b3JhZ2UsIFRhZywgT3BzKSwgTGluZShMaW5lKSB7fQorICB+RElJbXBvcnRlZEVudGl0eSgpID0gZGVmYXVsdDsKKworICBzdGF0aWMgRElJbXBvcnRlZEVudGl0eSAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgdW5zaWduZWQgVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESVNjb3BlICpTY29wZSwgRElOb2RlUmVmIEVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElGaWxlICpGaWxlLCB1bnNpZ25lZCBMaW5lLCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKSB7CisgICAgcmV0dXJuIGdldEltcGwoQ29udGV4dCwgVGFnLCBTY29wZSwgRW50aXR5LCBGaWxlLCBMaW5lLAorICAgICAgICAgICAgICAgICAgIGdldENhbm9uaWNhbE1EU3RyaW5nKENvbnRleHQsIE5hbWUpLCBTdG9yYWdlLCBTaG91bGRDcmVhdGUpOworICB9CisgIHN0YXRpYyBESUltcG9ydGVkRW50aXR5ICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCB1bnNpZ25lZCBUYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGFkYXRhICpTY29wZSwgTWV0YWRhdGEgKkVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEgKkZpbGUsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1EU3RyaW5nICpOYW1lLCBTdG9yYWdlVHlwZSBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpOworCisgIFRlbXBESUltcG9ydGVkRW50aXR5IGNsb25lSW1wbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGVtcG9yYXJ5KGdldENvbnRleHQoKSwgZ2V0VGFnKCksIGdldFNjb3BlKCksIGdldEVudGl0eSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RmlsZSgpLCBnZXRMaW5lKCksIGdldE5hbWUoKSk7CisgIH0KKworcHVibGljOgorICBERUZJTkVfTUROT0RFX0dFVChESUltcG9ydGVkRW50aXR5LAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgVGFnLCBESVNjb3BlICpTY29wZSwgRElOb2RlUmVmIEVudGl0eSwKKyAgICAgICAgICAgICAgICAgICAgIERJRmlsZSAqRmlsZSwgdW5zaWduZWQgTGluZSwgU3RyaW5nUmVmIE5hbWUgPSAiIiksCisgICAgICAgICAgICAgICAgICAgIChUYWcsIFNjb3BlLCBFbnRpdHksIEZpbGUsIExpbmUsIE5hbWUpKQorICBERUZJTkVfTUROT0RFX0dFVChESUltcG9ydGVkRW50aXR5LAorICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgVGFnLCBNZXRhZGF0YSAqU2NvcGUsIE1ldGFkYXRhICpFbnRpdHksCisgICAgICAgICAgICAgICAgICAgICBNZXRhZGF0YSAqRmlsZSwgdW5zaWduZWQgTGluZSwgTURTdHJpbmcgKk5hbWUpLAorICAgICAgICAgICAgICAgICAgICAoVGFnLCBTY29wZSwgRW50aXR5LCBGaWxlLCBMaW5lLCBOYW1lKSkKKworICBUZW1wRElJbXBvcnRlZEVudGl0eSBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIGNsb25lSW1wbCgpOyB9CisKKyAgdW5zaWduZWQgZ2V0TGluZSgpIGNvbnN0IHsgcmV0dXJuIExpbmU7IH0KKyAgRElTY29wZSAqZ2V0U2NvcGUoKSBjb25zdCB7IHJldHVybiBjYXN0X29yX251bGw8RElTY29wZT4oZ2V0UmF3U2NvcGUoKSk7IH0KKyAgRElOb2RlUmVmIGdldEVudGl0eSgpIGNvbnN0IHsgcmV0dXJuIERJTm9kZVJlZihnZXRSYXdFbnRpdHkoKSk7IH0KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBnZXRTdHJpbmdPcGVyYW5kKDIpOyB9CisgIERJRmlsZSAqZ2V0RmlsZSgpIGNvbnN0IHsgcmV0dXJuIGNhc3Rfb3JfbnVsbDxESUZpbGU+KGdldFJhd0ZpbGUoKSk7IH0KKworICBNZXRhZGF0YSAqZ2V0UmF3U2NvcGUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisgIE1ldGFkYXRhICpnZXRSYXdFbnRpdHkoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDEpOyB9CisgIE1EU3RyaW5nICpnZXRSYXdOYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZEFzPE1EU3RyaW5nPigyKTsgfQorICBNZXRhZGF0YSAqZ2V0UmF3RmlsZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMyk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJSW1wb3J0ZWRFbnRpdHlLaW5kOworICB9Cit9OworCisvLy8gQSBwYWlyIG9mIERJR2xvYmFsVmFyaWFibGUgYW5kIERJRXhwcmVzc2lvbi4KK2NsYXNzIERJR2xvYmFsVmFyaWFibGVFeHByZXNzaW9uIDogcHVibGljIE1ETm9kZSB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBNRE5vZGU7CisKKyAgRElHbG9iYWxWYXJpYWJsZUV4cHJlc3Npb24oTExWTUNvbnRleHQgJkMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE1ldGFkYXRhICo+IE9wcykKKyAgICAgIDogTUROb2RlKEMsIERJR2xvYmFsVmFyaWFibGVFeHByZXNzaW9uS2luZCwgU3RvcmFnZSwgT3BzKSB7fQorICB+RElHbG9iYWxWYXJpYWJsZUV4cHJlc3Npb24oKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIERJR2xvYmFsVmFyaWFibGVFeHByZXNzaW9uICoKKyAgZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgTWV0YWRhdGEgKlZhcmlhYmxlLCBNZXRhZGF0YSAqRXhwcmVzc2lvbiwKKyAgICAgICAgICBTdG9yYWdlVHlwZSBTdG9yYWdlLCBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpOworCisgIFRlbXBESUdsb2JhbFZhcmlhYmxlRXhwcmVzc2lvbiBjbG9uZUltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeShnZXRDb250ZXh0KCksIGdldFZhcmlhYmxlKCksIGdldEV4cHJlc3Npb24oKSk7CisgIH0KKworcHVibGljOgorICBERUZJTkVfTUROT0RFX0dFVChESUdsb2JhbFZhcmlhYmxlRXhwcmVzc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgKE1ldGFkYXRhICogVmFyaWFibGUsIE1ldGFkYXRhICpFeHByZXNzaW9uKSwKKyAgICAgICAgICAgICAgICAgICAgKFZhcmlhYmxlLCBFeHByZXNzaW9uKSkKKworICBUZW1wRElHbG9iYWxWYXJpYWJsZUV4cHJlc3Npb24gY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCisgIE1ldGFkYXRhICpnZXRSYXdWYXJpYWJsZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMCk7IH0KKworICBESUdsb2JhbFZhcmlhYmxlICpnZXRWYXJpYWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPERJR2xvYmFsVmFyaWFibGU+KGdldFJhd1ZhcmlhYmxlKCkpOworICB9CisKKyAgTWV0YWRhdGEgKmdldFJhd0V4cHJlc3Npb24oKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDEpOyB9CisKKyAgRElFeHByZXNzaW9uICpnZXRFeHByZXNzaW9uKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PERJRXhwcmVzc2lvbj4oZ2V0UmF3RXhwcmVzc2lvbigpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gRElHbG9iYWxWYXJpYWJsZUV4cHJlc3Npb25LaW5kOworICB9Cit9OworCisvLy8gTWFjcm8gSW5mbyBEV0FSRi1saWtlIG1ldGFkYXRhIG5vZGUuCisvLy8KKy8vLyBBIG1ldGFkYXRhIG5vZGUgd2l0aCBhIERXQVJGIG1hY3JvIGluZm8gKGkuZS4sIGEgY29uc3RhbnQgbmFtZWQKKy8vLyBcYyBEV19NQUNJTkZPXyosIGRlZmluZWQgaW4gbGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuaCkuICBDYWxsZWQgXGEKKy8vLyBESU1hY3JvTm9kZQorLy8vIGJlY2F1c2UgaXQncyBwb3RlbnRpYWxseSB1c2VkIGZvciBub24tRFdBUkYgb3V0cHV0LgorY2xhc3MgRElNYWNyb05vZGUgOiBwdWJsaWMgTUROb2RlIHsKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIE1ETm9kZTsKKworcHJvdGVjdGVkOgorICBESU1hY3JvTm9kZShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgSUQsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIHVuc2lnbmVkIE1JVHlwZSwKKyAgICAgICAgICAgICAgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzMSwgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzMiA9IE5vbmUpCisgICAgICA6IE1ETm9kZShDLCBJRCwgU3RvcmFnZSwgT3BzMSwgT3BzMikgeworICAgIGFzc2VydChNSVR5cGUgPCAxdSA8PCAxNik7CisgICAgU3ViY2xhc3NEYXRhMTYgPSBNSVR5cGU7CisgIH0KKyAgfkRJTWFjcm9Ob2RlKCkgPSBkZWZhdWx0OworCisgIHRlbXBsYXRlIDxjbGFzcyBUeT4gVHkgKmdldE9wZXJhbmRBcyh1bnNpZ25lZCBJKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Rfb3JfbnVsbDxUeT4oZ2V0T3BlcmFuZChJKSk7CisgIH0KKworICBTdHJpbmdSZWYgZ2V0U3RyaW5nT3BlcmFuZCh1bnNpZ25lZCBJKSBjb25zdCB7CisgICAgaWYgKGF1dG8gKlMgPSBnZXRPcGVyYW5kQXM8TURTdHJpbmc+KEkpKQorICAgICAgcmV0dXJuIFMtPmdldFN0cmluZygpOworICAgIHJldHVybiBTdHJpbmdSZWYoKTsKKyAgfQorCisgIHN0YXRpYyBNRFN0cmluZyAqZ2V0Q2Fub25pY2FsTURTdHJpbmcoTExWTUNvbnRleHQgJkNvbnRleHQsIFN0cmluZ1JlZiBTKSB7CisgICAgaWYgKFMuZW1wdHkoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBNRFN0cmluZzo6Z2V0KENvbnRleHQsIFMpOworICB9CisKK3B1YmxpYzoKKyAgdW5zaWduZWQgZ2V0TWFjaW5mb1R5cGUoKSBjb25zdCB7IHJldHVybiBTdWJjbGFzc0RhdGExNjsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgc3dpdGNoIChNRC0+Z2V0TWV0YWRhdGFJRCgpKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjYXNlIERJTWFjcm9LaW5kOgorICAgIGNhc2UgRElNYWNyb0ZpbGVLaW5kOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9Cit9OworCitjbGFzcyBESU1hY3JvIDogcHVibGljIERJTWFjcm9Ob2RlIHsKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIE1ETm9kZTsKKworICB1bnNpZ25lZCBMaW5lOworCisgIERJTWFjcm8oTExWTUNvbnRleHQgJkMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIHVuc2lnbmVkIE1JVHlwZSwgdW5zaWduZWQgTGluZSwKKyAgICAgICAgICBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMpCisgICAgICA6IERJTWFjcm9Ob2RlKEMsIERJTWFjcm9LaW5kLCBTdG9yYWdlLCBNSVR5cGUsIE9wcyksIExpbmUoTGluZSkge30KKyAgfkRJTWFjcm8oKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIERJTWFjcm8gKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIHVuc2lnbmVkIE1JVHlwZSwgdW5zaWduZWQgTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBWYWx1ZSwgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKSB7CisgICAgcmV0dXJuIGdldEltcGwoQ29udGV4dCwgTUlUeXBlLCBMaW5lLCBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBOYW1lKSwKKyAgICAgICAgICAgICAgICAgICBnZXRDYW5vbmljYWxNRFN0cmluZyhDb250ZXh0LCBWYWx1ZSksIFN0b3JhZ2UsIFNob3VsZENyZWF0ZSk7CisgIH0KKyAgc3RhdGljIERJTWFjcm8gKmdldEltcGwoTExWTUNvbnRleHQgJkNvbnRleHQsIHVuc2lnbmVkIE1JVHlwZSwgdW5zaWduZWQgTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTURTdHJpbmcgKk5hbWUsIE1EU3RyaW5nICpWYWx1ZSwgU3RvcmFnZVR5cGUgU3RvcmFnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKTsKKworICBUZW1wRElNYWNybyBjbG9uZUltcGwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRlbXBvcmFyeShnZXRDb250ZXh0KCksIGdldE1hY2luZm9UeXBlKCksIGdldExpbmUoKSwgZ2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWUoKSk7CisgIH0KKworcHVibGljOgorICBERUZJTkVfTUROT0RFX0dFVChESU1hY3JvLCAodW5zaWduZWQgTUlUeXBlLCB1bnNpZ25lZCBMaW5lLCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBWYWx1ZSA9ICIiKSwKKyAgICAgICAgICAgICAgICAgICAgKE1JVHlwZSwgTGluZSwgTmFtZSwgVmFsdWUpKQorICBERUZJTkVfTUROT0RFX0dFVChESU1hY3JvLCAodW5zaWduZWQgTUlUeXBlLCB1bnNpZ25lZCBMaW5lLCBNRFN0cmluZyAqTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1EU3RyaW5nICpWYWx1ZSksCisgICAgICAgICAgICAgICAgICAgIChNSVR5cGUsIExpbmUsIE5hbWUsIFZhbHVlKSkKKworICBUZW1wRElNYWNybyBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIGNsb25lSW1wbCgpOyB9CisKKyAgdW5zaWduZWQgZ2V0TGluZSgpIGNvbnN0IHsgcmV0dXJuIExpbmU7IH0KKworICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZ09wZXJhbmQoMCk7IH0KKyAgU3RyaW5nUmVmIGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gZ2V0U3RyaW5nT3BlcmFuZCgxKTsgfQorCisgIE1EU3RyaW5nICpnZXRSYXdOYW1lKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZEFzPE1EU3RyaW5nPigwKTsgfQorICBNRFN0cmluZyAqZ2V0UmF3VmFsdWUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kQXM8TURTdHJpbmc+KDEpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBESU1hY3JvS2luZDsKKyAgfQorfTsKKworY2xhc3MgRElNYWNyb0ZpbGUgOiBwdWJsaWMgRElNYWNyb05vZGUgeworICBmcmllbmQgY2xhc3MgTExWTUNvbnRleHRJbXBsOworICBmcmllbmQgY2xhc3MgTUROb2RlOworCisgIHVuc2lnbmVkIExpbmU7CisKKyAgRElNYWNyb0ZpbGUoTExWTUNvbnRleHQgJkMsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIHVuc2lnbmVkIE1JVHlwZSwKKyAgICAgICAgICAgICAgdW5zaWduZWQgTGluZSwgQXJyYXlSZWY8TWV0YWRhdGEgKj4gT3BzKQorICAgICAgOiBESU1hY3JvTm9kZShDLCBESU1hY3JvRmlsZUtpbmQsIFN0b3JhZ2UsIE1JVHlwZSwgT3BzKSwgTGluZShMaW5lKSB7fQorICB+RElNYWNyb0ZpbGUoKSA9IGRlZmF1bHQ7CisKKyAgc3RhdGljIERJTWFjcm9GaWxlICpnZXRJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0LCB1bnNpZ25lZCBNSVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lLCBESUZpbGUgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBESU1hY3JvTm9kZUFycmF5IEVsZW1lbnRzLCBTdG9yYWdlVHlwZSBTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRDcmVhdGUgPSB0cnVlKSB7CisgICAgcmV0dXJuIGdldEltcGwoQ29udGV4dCwgTUlUeXBlLCBMaW5lLCBzdGF0aWNfY2FzdDxNZXRhZGF0YSAqPihGaWxlKSwKKyAgICAgICAgICAgICAgICAgICBFbGVtZW50cy5nZXQoKSwgU3RvcmFnZSwgU2hvdWxkQ3JlYXRlKTsKKyAgfQorCisgIHN0YXRpYyBESU1hY3JvRmlsZSAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgdW5zaWduZWQgTUlUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTGluZSwgTWV0YWRhdGEgKkZpbGUsIE1ldGFkYXRhICpFbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIGJvb2wgU2hvdWxkQ3JlYXRlID0gdHJ1ZSk7CisKKyAgVGVtcERJTWFjcm9GaWxlIGNsb25lSW1wbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGVtcG9yYXJ5KGdldENvbnRleHQoKSwgZ2V0TWFjaW5mb1R5cGUoKSwgZ2V0TGluZSgpLCBnZXRGaWxlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBnZXRFbGVtZW50cygpKTsKKyAgfQorCitwdWJsaWM6CisgIERFRklORV9NRE5PREVfR0VUKERJTWFjcm9GaWxlLCAodW5zaWduZWQgTUlUeXBlLCB1bnNpZ25lZCBMaW5lLCBESUZpbGUgKkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRElNYWNyb05vZGVBcnJheSBFbGVtZW50cyksCisgICAgICAgICAgICAgICAgICAgIChNSVR5cGUsIExpbmUsIEZpbGUsIEVsZW1lbnRzKSkKKyAgREVGSU5FX01ETk9ERV9HRVQoRElNYWNyb0ZpbGUsICh1bnNpZ25lZCBNSVR5cGUsIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0YWRhdGEgKkZpbGUsIE1ldGFkYXRhICpFbGVtZW50cyksCisgICAgICAgICAgICAgICAgICAgIChNSVR5cGUsIExpbmUsIEZpbGUsIEVsZW1lbnRzKSkKKworICBUZW1wRElNYWNyb0ZpbGUgY2xvbmUoKSBjb25zdCB7IHJldHVybiBjbG9uZUltcGwoKTsgfQorCisgIHZvaWQgcmVwbGFjZUVsZW1lbnRzKERJTWFjcm9Ob2RlQXJyYXkgRWxlbWVudHMpIHsKKyNpZm5kZWYgTkRFQlVHCisgICAgZm9yIChESU1hY3JvTm9kZSAqT3AgOiBnZXRFbGVtZW50cygpKQorICAgICAgYXNzZXJ0KGlzX2NvbnRhaW5lZChFbGVtZW50cy0+b3BlcmFuZHMoKSwgT3ApICYmCisgICAgICAgICAgICAgIkxvc3QgYSBtYWNybyBub2RlIGR1cmluZyBtYWNybyBub2RlIGxpc3QgcmVwbGFjZW1lbnQiKTsKKyNlbmRpZgorICAgIHJlcGxhY2VPcGVyYW5kV2l0aCgxLCBFbGVtZW50cy5nZXQoKSk7CisgIH0KKworICB1bnNpZ25lZCBnZXRMaW5lKCkgY29uc3QgeyByZXR1cm4gTGluZTsgfQorICBESUZpbGUgKmdldEZpbGUoKSBjb25zdCB7IHJldHVybiBjYXN0X29yX251bGw8RElGaWxlPihnZXRSYXdGaWxlKCkpOyB9CisKKyAgRElNYWNyb05vZGVBcnJheSBnZXRFbGVtZW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPE1EVHVwbGU+KGdldFJhd0VsZW1lbnRzKCkpOworICB9CisKKyAgTWV0YWRhdGEgKmdldFJhd0ZpbGUoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisgIE1ldGFkYXRhICpnZXRSYXdFbGVtZW50cygpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMSk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IERJTWFjcm9GaWxlS2luZDsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI3VuZGVmIERFRklORV9NRE5PREVfR0VUX1VOUEFDS19JTVBMCisjdW5kZWYgREVGSU5FX01ETk9ERV9HRVRfVU5QQUNLCisjdW5kZWYgREVGSU5FX01ETk9ERV9HRVQKKworI2VuZGlmIC8vIExMVk1fSVJfREVCVUdJTkZPTUVUQURBVEFfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EZWJ1Z0xvYy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EZWJ1Z0xvYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlZjEyMTIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RlYnVnTG9jLmgKQEAgLTAsMCArMSwxMjYgQEAKKy8vPT09LSBEZWJ1Z0xvYy5oIC0gRGVidWcgTG9jYXRpb24gSW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSBudW1iZXIgb2YgbGlnaHQgd2VpZ2h0IGRhdGEgc3RydWN0dXJlcyB1c2VkCisvLyB0byBkZXNjcmliZSBhbmQgdHJhY2sgZGVidWcgbG9jYXRpb24gaW5mb3JtYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0RFQlVHTE9DX0gKKyNkZWZpbmUgTExWTV9JUl9ERUJVR0xPQ19ICisKKyNpbmNsdWRlICJsbHZtL0lSL1RyYWNraW5nTURSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworICBjbGFzcyBMTFZNQ29udGV4dDsKKyAgY2xhc3MgcmF3X29zdHJlYW07CisgIGNsYXNzIERJTG9jYXRpb247CisKKyAgLy8vIFxicmllZiBBIGRlYnVnIGluZm8gbG9jYXRpb24uCisgIC8vLworICAvLy8gVGhpcyBjbGFzcyBpcyBhIHdyYXBwZXIgYXJvdW5kIGEgdHJhY2tpbmcgcmVmZXJlbmNlIHRvIGFuIFxhIERJTG9jYXRpb24KKyAgLy8vIHBvaW50ZXIuCisgIC8vLworICAvLy8gVG8gYXZvaWQgZXh0cmEgaW5jbHVkZXMsIFxhIERlYnVnTG9jIGRvdWJsZXMgdGhlIFxhIERJTG9jYXRpb24gQVBJIHdpdGggYQorICAvLy8gb25lIGJhc2VkIG9uIHJlbGF0aXZlbHkgb3BhcXVlIFxhIE1ETm9kZSBwb2ludGVycy4KKyAgY2xhc3MgRGVidWdMb2MgeworICAgIFRyYWNraW5nTUROb2RlUmVmIExvYzsKKworICBwdWJsaWM6CisgICAgRGVidWdMb2MoKSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gXGJyaWVmIENvbnN0cnVjdCBmcm9tIGFuIFxhIERJTG9jYXRpb24uCisgICAgRGVidWdMb2MoY29uc3QgRElMb2NhdGlvbiAqTCk7CisKKyAgICAvLy8gXGJyaWVmIENvbnN0cnVjdCBmcm9tIGFuIFxhIE1ETm9kZS4KKyAgICAvLy8KKyAgICAvLy8gTm90ZTogaWYgXGMgTiBpcyBub3QgYW4gXGEgRElMb2NhdGlvbiwgYSB2ZXJpZmllciBjaGVjayB3aWxsIGZhaWwsIGFuZAorICAgIC8vLyBhY2Nlc3NvcnMgd2lsbCBjcmFzaC4gIEhvd2V2ZXIsIGNvbnN0cnVjdGlvbiBmcm9tIG90aGVyIG5vZGVzIGlzCisgICAgLy8vIHN1cHBvcnRlZCBpbiBvcmRlciB0byBoYW5kbGUgZm9yd2FyZCByZWZlcmVuY2VzIHdoZW4gcmVhZGluZyB0ZXh0dWFsCisgICAgLy8vIElSLgorICAgIGV4cGxpY2l0IERlYnVnTG9jKGNvbnN0IE1ETm9kZSAqTik7CisKKyAgICAvLy8gXGJyaWVmIEdldCB0aGUgdW5kZXJseWluZyBcYSBESUxvY2F0aW9uLgorICAgIC8vLworICAgIC8vLyBccHJlICEqdGhpcyBvciBcYyBpc2E8RElMb2NhdGlvbj4oZ2V0QXNNRE5vZGUoKSkuCisgICAgLy8vIEB7CisgICAgRElMb2NhdGlvbiAqZ2V0KCkgY29uc3Q7CisgICAgb3BlcmF0b3IgRElMb2NhdGlvbiAqKCkgY29uc3QgeyByZXR1cm4gZ2V0KCk7IH0KKyAgICBESUxvY2F0aW9uICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gZ2V0KCk7IH0KKyAgICBESUxvY2F0aW9uICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqZ2V0KCk7IH0KKyAgICAvLy8gQH0KKworICAgIC8vLyBcYnJpZWYgQ2hlY2sgZm9yIG51bGwuCisgICAgLy8vCisgICAgLy8vIENoZWNrIGZvciBudWxsIGluIGEgd2F5IHRoYXQgaXMgc2FmZSB3aXRoIGJyb2tlbiBkZWJ1ZyBpbmZvLiAgVW5saWtlCisgICAgLy8vIHRoZSBjb252ZXJzaW9uIHRvIFxjIERJTG9jYXRpb24sIHRoaXMgZG9lc24ndCByZXF1aXJlIHRoYXQgXGMgTG9jIGlzIG9mCisgICAgLy8vIHRoZSByaWdodCB0eXBlLiAgSW1wb3J0YW50IGZvciBjYXNlcyBsaWtlIFxhIGxsdm06OlN0cmlwRGVidWdJbmZvKCkgYW5kCisgICAgLy8vIFxhIEluc3RydWN0aW9uOjpoYXNNZXRhZGF0YSgpLgorICAgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBMb2M7IH0KKworICAgIC8vLyBcYnJpZWYgQ2hlY2sgd2hldGhlciB0aGlzIGhhcyBhIHRyaXZpYWwgZGVzdHJ1Y3Rvci4KKyAgICBib29sIGhhc1RyaXZpYWxEZXN0cnVjdG9yKCkgY29uc3QgeyByZXR1cm4gTG9jLmhhc1RyaXZpYWxEZXN0cnVjdG9yKCk7IH0KKworICAgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgbmV3IERlYnVnTG9jLgorICAgIC8vLworICAgIC8vLyBDcmVhdGUgYSBuZXcgRGVidWdMb2MgYXQgdGhlIHNwZWNpZmllZCBsaW5lL2NvbCBhbmQgc2NvcGUvaW5saW5lLiAgVGhpcworICAgIC8vLyBmb3J3YXJkcyB0byBcYSBESUxvY2F0aW9uOjpnZXQoKS4KKyAgICAvLy8KKyAgICAvLy8gSWYgXGMgIVNjb3BlLCByZXR1cm5zIGEgZGVmYXVsdC1jb25zdHJ1Y3RlZCBcYSBEZWJ1Z0xvYy4KKyAgICAvLy8KKyAgICAvLy8gRklYTUU6IFJlbW92ZSB0aGlzLiAgVXNlcnMgc2hvdWxkIHVzZSBESUxvY2F0aW9uOjpnZXQoKS4KKyAgICBzdGF0aWMgRGVidWdMb2MgZ2V0KHVuc2lnbmVkIExpbmUsIHVuc2lnbmVkIENvbCwgY29uc3QgTUROb2RlICpTY29wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ETm9kZSAqSW5saW5lZEF0ID0gbnVsbHB0cik7CisKKyAgICBlbnVtIHsgUmVwbGFjZUxhc3RJbmxpbmVkQXQgPSB0cnVlIH07CisgICAgLy8vIFJlYnVpbGQgdGhlIGVudGlyZSBpbmxpbmVkLWF0IGNoYWluIGZvciB0aGlzIGluc3RydWN0aW9uIHNvIHRoYXQgdGhlIHRvcCBvZgorICAgIC8vLyB0aGUgY2hhaW4gbm93IGlzIGlubGluZWQtYXQgdGhlIG5ldyBjYWxsIHNpdGUuCisgICAgLy8vIFxwYXJhbSAgIElubGluZWRBdCAgICBUaGUgbmV3IG91dGVybW9zdCBpbmxpbmVkLWF0IGluIHRoZSBjaGFpbi4KKyAgICAvLy8gXHBhcmFtICAgUmVwbGFjZUxhc3QgIFJlcGxhY2UgdGhlIGxhc3QgbG9jYXRpb24gaW4gdGhlIGlubGluZWQtYXQgY2hhaW4uCisgICAgc3RhdGljIERlYnVnTG9jIGFwcGVuZElubGluZWRBdChEZWJ1Z0xvYyBETCwgRElMb2NhdGlvbiAqSW5saW5lZEF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUNvbnRleHQgJkN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPGNvbnN0IE1ETm9kZSAqLCBNRE5vZGUgKj4gJkNhY2hlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZXBsYWNlTGFzdCA9IGZhbHNlKTsKKworICAgIHVuc2lnbmVkIGdldExpbmUoKSBjb25zdDsKKyAgICB1bnNpZ25lZCBnZXRDb2woKSBjb25zdDsKKyAgICBNRE5vZGUgKmdldFNjb3BlKCkgY29uc3Q7CisgICAgRElMb2NhdGlvbiAqZ2V0SW5saW5lZEF0KCkgY29uc3Q7CisKKyAgICAvLy8gXGJyaWVmIEdldCB0aGUgZnVsbHkgaW5saW5lZC1hdCBzY29wZSBmb3IgYSBEZWJ1Z0xvYy4KKyAgICAvLy8KKyAgICAvLy8gR2V0cyB0aGUgaW5saW5lZC1hdCBzY29wZSBmb3IgYSBEZWJ1Z0xvYy4KKyAgICBNRE5vZGUgKmdldElubGluZWRBdFNjb3BlKCkgY29uc3Q7CisKKyAgICAvLy8gXGJyaWVmIEZpbmQgdGhlIGRlYnVnIGluZm8gbG9jYXRpb24gZm9yIHRoZSBzdGFydCBvZiB0aGUgZnVuY3Rpb24uCisgICAgLy8vCisgICAgLy8vIFdhbGsgdXAgdGhlIHNjb3BlIGNoYWluIG9mIGdpdmVuIGRlYnVnIGxvYyBhbmQgZmluZCBsaW5lIG51bWJlciBpbmZvCisgICAgLy8vIGZvciB0aGUgZnVuY3Rpb24uCisgICAgLy8vCisgICAgLy8vIEZJWE1FOiBSZW1vdmUgdGhpcy4gIFVzZXJzIHNob3VsZCB1c2UgRElMb2NhdGlvbi9ESUxvY2FsU2NvcGUgQVBJIHRvCisgICAgLy8vIGZpbmQgdGhlIHN1YnByb2dyYW0sIGFuZCB0aGVuIERJTG9jYXRpb246OmdldCgpLgorICAgIERlYnVnTG9jIGdldEZuRGVidWdMb2MoKSBjb25zdDsKKworICAgIC8vLyBcYnJpZWYgUmV0dXJuIFxjIHRoaXMgYXMgYSBiYXIgXGEgTUROb2RlLgorICAgIE1ETm9kZSAqZ2V0QXNNRE5vZGUoKSBjb25zdCB7IHJldHVybiBMb2M7IH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEZWJ1Z0xvYyAmREwpIGNvbnN0IHsgcmV0dXJuIExvYyA9PSBETC5Mb2M7IH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgRGVidWdMb2MgJkRMKSBjb25zdCB7IHJldHVybiBMb2MgIT0gREwuTG9jOyB9CisKKyAgICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAgIC8vLyBcYnJpZWYgcHJpbnRzIHNvdXJjZSBsb2NhdGlvbiAvcGF0aC90by9maWxlLmV4ZTpsaW5lOmNvbCBAW2lubGluZWQgYXRdCisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLyogTExWTV9TVVBQT1JUX0RFQlVHTE9DX0ggKi8KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRGVyaXZlZFR5cGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0Rlcml2ZWRUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlNWUwODUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0Rlcml2ZWRUeXBlcy5oCkBAIC0wLDAgKzEsNTA5IEBACisvLz09PS0gbGx2bS9EZXJpdmVkVHlwZXMuaCAtIENsYXNzZXMgZm9yIGhhbmRsaW5nIGRhdGEgdHlwZXMgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIG9mIGNsYXNzZXMgdGhhdCByZXByZXNlbnQgImRlcml2ZWQKKy8vIHR5cGVzIi4gIFRoZXNlIGFyZSB0aGluZ3MgbGlrZSAiYXJyYXlzIG9mIHgiIG9yICJzdHJ1Y3R1cmUgb2YgeCwgeSwgeiIgb3IKKy8vICJmdW5jdGlvbiByZXR1cm5pbmcgeCB0YWtpbmcgKHkseikgYXMgcGFyYW1ldGVycyIsIGV0Yy4uLgorLy8KKy8vIFRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlc2UgY2xhc3NlcyBsaXZlIGluIHRoZSBUeXBlLmNwcCBmaWxlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9ERVJJVkVEVFlQRVNfSAorI2RlZmluZSBMTFZNX0lSX0RFUklWRURUWVBFU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vSVIvVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFZhbHVlOworY2xhc3MgQVBJbnQ7CitjbGFzcyBMTFZNQ29udGV4dDsKKworLy8vIENsYXNzIHRvIHJlcHJlc2VudCBpbnRlZ2VyIHR5cGVzLiBOb3RlIHRoYXQgdGhpcyBjbGFzcyBpcyBhbHNvIHVzZWQgdG8KKy8vLyByZXByZXNlbnQgdGhlIGJ1aWx0LWluIGludGVnZXIgdHlwZXM6IEludDFUeSwgSW50OFR5LCBJbnQxNlR5LCBJbnQzMlR5IGFuZAorLy8vIEludDY0VHkuCisvLy8gQGJyaWVmIEludGVnZXIgcmVwcmVzZW50YXRpb24gdHlwZQorY2xhc3MgSW50ZWdlclR5cGUgOiBwdWJsaWMgVHlwZSB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisKK3Byb3RlY3RlZDoKKyAgZXhwbGljaXQgSW50ZWdlclR5cGUoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIE51bUJpdHMpIDogVHlwZShDLCBJbnRlZ2VyVHlJRCl7CisgICAgc2V0U3ViY2xhc3NEYXRhKE51bUJpdHMpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIFRoaXMgZW51bSBpcyBqdXN0IHVzZWQgdG8gaG9sZCBjb25zdGFudHMgd2UgbmVlZCBmb3IgSW50ZWdlclR5cGUuCisgIGVudW0geworICAgIE1JTl9JTlRfQklUUyA9IDEsICAgICAgICAvLy88IE1pbmltdW0gbnVtYmVyIG9mIGJpdHMgdGhhdCBjYW4gYmUgc3BlY2lmaWVkCisgICAgTUFYX0lOVF9CSVRTID0gKDE8PDI0KS0xIC8vLzwgTWF4aW11bSBudW1iZXIgb2YgYml0cyB0aGF0IGNhbiBiZSBzcGVjaWZpZWQKKyAgICAgIC8vLzwgTm90ZSB0aGF0IGJpdCB3aWR0aCBpcyBzdG9yZWQgaW4gdGhlIFR5cGUgY2xhc3NlcyBTdWJjbGFzc0RhdGEgZmllbGQKKyAgICAgIC8vLzwgd2hpY2ggaGFzIDI0IGJpdHMuIFRoaXMgeWllbGRzIGEgbWF4aW11bSBiaXQgd2lkdGggb2YgMTYsNzc3LDIxNQorICAgICAgLy8vPCBiaXRzLgorICB9OworCisgIC8vLyBUaGlzIHN0YXRpYyBtZXRob2QgaXMgdGhlIHByaW1hcnkgd2F5IG9mIGNvbnN0cnVjdGluZyBhbiBJbnRlZ2VyVHlwZS4KKyAgLy8vIElmIGFuIEludGVnZXJUeXBlIHdpdGggdGhlIHNhbWUgTnVtQml0cyB2YWx1ZSB3YXMgcHJldmlvdXNseSBpbnN0YW50aWF0ZWQsCisgIC8vLyB0aGF0IGluc3RhbmNlIHdpbGwgYmUgcmV0dXJuZWQuIE90aGVyd2lzZSBhIG5ldyBvbmUgd2lsbCBiZSBjcmVhdGVkLiBPbmx5CisgIC8vLyBvbmUgaW5zdGFuY2Ugd2l0aCBhIGdpdmVuIE51bUJpdHMgdmFsdWUgaXMgZXZlciBjcmVhdGVkLgorICAvLy8gQGJyaWVmIEdldCBvciBjcmVhdGUgYW4gSW50ZWdlclR5cGUgaW5zdGFuY2UuCisgIHN0YXRpYyBJbnRlZ2VyVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBOdW1CaXRzKTsKKworICAvLy8gQGJyaWVmIEdldCB0aGUgbnVtYmVyIG9mIGJpdHMgaW4gdGhpcyBJbnRlZ2VyVHlwZQorICB1bnNpZ25lZCBnZXRCaXRXaWR0aCgpIGNvbnN0IHsgcmV0dXJuIGdldFN1YmNsYXNzRGF0YSgpOyB9CisKKyAgLy8vIFJldHVybiBhIGJpdG1hc2sgd2l0aCBvbmVzIHNldCBmb3IgYWxsIG9mIHRoZSBiaXRzIHRoYXQgY2FuIGJlIHNldCBieSBhbgorICAvLy8gdW5zaWduZWQgdmVyc2lvbiBvZiB0aGlzIHR5cGUuIFRoaXMgaXMgMHhGRiBmb3IgaTgsIDB4RkZGRiBmb3IgaTE2LCBldGMuCisgIHVpbnQ2NF90IGdldEJpdE1hc2soKSBjb25zdCB7CisgICAgcmV0dXJuIH51aW50NjRfdCgwVUwpID4+ICg2NC1nZXRCaXRXaWR0aCgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSB1aW50NjRfdCB3aXRoIGp1c3QgdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHNldCAodGhlIHNpZ24gYml0LCBpZgorICAvLy8gdGhlIHZhbHVlIGlzIHRyZWF0ZWQgYXMgYSBzaWduZWQgbnVtYmVyKS4KKyAgdWludDY0X3QgZ2V0U2lnbkJpdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gMVVMTCA8PCAoZ2V0Qml0V2lkdGgoKS0xKTsKKyAgfQorCisgIC8vLyBGb3IgZXhhbXBsZSwgdGhpcyBpcyAweEZGIGZvciBhbiA4IGJpdCBpbnRlZ2VyLCAweEZGRkYgZm9yIGkxNiwgZXRjLgorICAvLy8gQHJldHVybnMgYSBiaXQgbWFzayB3aXRoIG9uZXMgc2V0IGZvciBhbGwgdGhlIGJpdHMgb2YgdGhpcyB0eXBlLgorICAvLy8gQGJyaWVmIEdldCBhIGJpdCBtYXNrIGZvciB0aGlzIHR5cGUuCisgIEFQSW50IGdldE1hc2soKSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2QgZGV0ZXJtaW5lcyBpZiB0aGUgd2lkdGggb2YgdGhpcyBJbnRlZ2VyVHlwZSBpcyBhIHBvd2VyLW9mLTIKKyAgLy8vIGluIHRlcm1zIG9mIDggYml0IGJ5dGVzLgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGlzIGlzIGEgcG93ZXItb2YtMiBieXRlIHdpZHRoLgorICAvLy8gQGJyaWVmIElzIHRoaXMgYSBwb3dlci1vZi0yIGJ5dGUtd2lkdGggSW50ZWdlclR5cGUgPworICBib29sIGlzUG93ZXJPZjJCeXRlV2lkdGgoKSBjb25zdDsKKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdC4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBUeXBlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFR5cGVJRCgpID09IEludGVnZXJUeUlEOworICB9Cit9OworCit1bnNpZ25lZCBUeXBlOjpnZXRJbnRlZ2VyQml0V2lkdGgoKSBjb25zdCB7CisgIHJldHVybiBjYXN0PEludGVnZXJUeXBlPih0aGlzKS0+Z2V0Qml0V2lkdGgoKTsKK30KKworLy8vIENsYXNzIHRvIHJlcHJlc2VudCBmdW5jdGlvbiB0eXBlcworLy8vCitjbGFzcyBGdW5jdGlvblR5cGUgOiBwdWJsaWMgVHlwZSB7CisgIEZ1bmN0aW9uVHlwZShUeXBlICpSZXN1bHQsIEFycmF5UmVmPFR5cGUqPiBQYXJhbXMsIGJvb2wgSXNWYXJBcmdzKTsKKworcHVibGljOgorICBGdW5jdGlvblR5cGUoY29uc3QgRnVuY3Rpb25UeXBlICYpID0gZGVsZXRlOworICBGdW5jdGlvblR5cGUgJm9wZXJhdG9yPShjb25zdCBGdW5jdGlvblR5cGUgJikgPSBkZWxldGU7CisKKyAgLy8vIFRoaXMgc3RhdGljIG1ldGhvZCBpcyB0aGUgcHJpbWFyeSB3YXkgb2YgY29uc3RydWN0aW5nIGEgRnVuY3Rpb25UeXBlLgorICBzdGF0aWMgRnVuY3Rpb25UeXBlICpnZXQoVHlwZSAqUmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VHlwZSo+IFBhcmFtcywgYm9vbCBpc1ZhckFyZyk7CisKKyAgLy8vIENyZWF0ZSBhIEZ1bmN0aW9uVHlwZSB0YWtpbmcgbm8gcGFyYW1ldGVycy4KKyAgc3RhdGljIEZ1bmN0aW9uVHlwZSAqZ2V0KFR5cGUgKlJlc3VsdCwgYm9vbCBpc1ZhckFyZyk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyB2YWxpZCBhcyBhIHJldHVybiB0eXBlLgorICBzdGF0aWMgYm9vbCBpc1ZhbGlkUmV0dXJuVHlwZShUeXBlICpSZXRUeSk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyB2YWxpZCBhcyBhbiBhcmd1bWVudCB0eXBlLgorICBzdGF0aWMgYm9vbCBpc1ZhbGlkQXJndW1lbnRUeXBlKFR5cGUgKkFyZ1R5KTsKKworICBib29sIGlzVmFyQXJnKCkgY29uc3QgeyByZXR1cm4gZ2V0U3ViY2xhc3NEYXRhKCkhPTA7IH0KKyAgVHlwZSAqZ2V0UmV0dXJuVHlwZSgpIGNvbnN0IHsgcmV0dXJuIENvbnRhaW5lZFR5c1swXTsgfQorCisgIHVzaW5nIHBhcmFtX2l0ZXJhdG9yID0gVHlwZTo6c3VidHlwZV9pdGVyYXRvcjsKKworICBwYXJhbV9pdGVyYXRvciBwYXJhbV9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIENvbnRhaW5lZFR5cyArIDE7IH0KKyAgcGFyYW1faXRlcmF0b3IgcGFyYW1fZW5kKCkgY29uc3QgeyByZXR1cm4gJkNvbnRhaW5lZFR5c1tOdW1Db250YWluZWRUeXNdOyB9CisgIEFycmF5UmVmPFR5cGUgKj4gcGFyYW1zKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlQXJyYXlSZWYocGFyYW1fYmVnaW4oKSwgcGFyYW1fZW5kKCkpOworICB9CisKKyAgLy8vIFBhcmFtZXRlciB0eXBlIGFjY2Vzc29ycy4KKyAgVHlwZSAqZ2V0UGFyYW1UeXBlKHVuc2lnbmVkIGkpIGNvbnN0IHsgcmV0dXJuIENvbnRhaW5lZFR5c1tpKzFdOyB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGZpeGVkIHBhcmFtZXRlcnMgdGhpcyBmdW5jdGlvbiB0eXBlIHJlcXVpcmVzLgorICAvLy8gVGhpcyBkb2VzIG5vdCBjb25zaWRlciB2YXJhcmdzLgorICB1bnNpZ25lZCBnZXROdW1QYXJhbXMoKSBjb25zdCB7IHJldHVybiBOdW1Db250YWluZWRUeXMgLSAxOyB9CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3QuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlSUQoKSA9PSBGdW5jdGlvblR5SUQ7CisgIH0KK307CitzdGF0aWNfYXNzZXJ0KGFsaWdub2YoRnVuY3Rpb25UeXBlKSA+PSBhbGlnbm9mKFR5cGUgKiksCisgICAgICAgICAgICAgICJBbGlnbm1lbnQgc3VmZmljaWVudCBmb3Igb2JqZWN0cyBhcHBlbmRlZCB0byBGdW5jdGlvblR5cGUiKTsKKworYm9vbCBUeXBlOjppc0Z1bmN0aW9uVmFyQXJnKCkgY29uc3QgeworICByZXR1cm4gY2FzdDxGdW5jdGlvblR5cGU+KHRoaXMpLT5pc1ZhckFyZygpOworfQorCitUeXBlICpUeXBlOjpnZXRGdW5jdGlvblBhcmFtVHlwZSh1bnNpZ25lZCBpKSBjb25zdCB7CisgIHJldHVybiBjYXN0PEZ1bmN0aW9uVHlwZT4odGhpcyktPmdldFBhcmFtVHlwZShpKTsKK30KKwordW5zaWduZWQgVHlwZTo6Z2V0RnVuY3Rpb25OdW1QYXJhbXMoKSBjb25zdCB7CisgIHJldHVybiBjYXN0PEZ1bmN0aW9uVHlwZT4odGhpcyktPmdldE51bVBhcmFtcygpOworfQorCisvLy8gQ29tbW9uIHN1cGVyIGNsYXNzIG9mIEFycmF5VHlwZSwgU3RydWN0VHlwZSBhbmQgVmVjdG9yVHlwZS4KK2NsYXNzIENvbXBvc2l0ZVR5cGUgOiBwdWJsaWMgVHlwZSB7Citwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IENvbXBvc2l0ZVR5cGUoTExWTUNvbnRleHQgJkMsIFR5cGVJRCB0aWQpIDogVHlwZShDLCB0aWQpIHt9CisKK3B1YmxpYzoKKyAgLy8vIEdpdmVuIGFuIGluZGV4IHZhbHVlIGludG8gdGhlIHR5cGUsIHJldHVybiB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudC4KKyAgVHlwZSAqZ2V0VHlwZUF0SW5kZXgoY29uc3QgVmFsdWUgKlYpIGNvbnN0OworICBUeXBlICpnZXRUeXBlQXRJbmRleCh1bnNpZ25lZCBJZHgpIGNvbnN0OworICBib29sIGluZGV4VmFsaWQoY29uc3QgVmFsdWUgKlYpIGNvbnN0OworICBib29sIGluZGV4VmFsaWQodW5zaWduZWQgSWR4KSBjb25zdDsKKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdC4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBUeXBlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFR5cGVJRCgpID09IEFycmF5VHlJRCB8fAorICAgICAgICAgICBULT5nZXRUeXBlSUQoKSA9PSBTdHJ1Y3RUeUlEIHx8CisgICAgICAgICAgIFQtPmdldFR5cGVJRCgpID09IFZlY3RvclR5SUQ7CisgIH0KK307CisKKy8vLyBDbGFzcyB0byByZXByZXNlbnQgc3RydWN0IHR5cGVzLiBUaGVyZSBhcmUgdHdvIGRpZmZlcmVudCBraW5kcyBvZiBzdHJ1Y3QKKy8vLyB0eXBlczogTGl0ZXJhbCBzdHJ1Y3RzIGFuZCBJZGVudGlmaWVkIHN0cnVjdHMuCisvLy8KKy8vLyBMaXRlcmFsIHN0cnVjdCB0eXBlcyAoZS5nLiB7IGkzMiwgaTMyIH0pIGFyZSB1bmlxdWVkIHN0cnVjdHVyYWxseSwgYW5kIG11c3QKKy8vLyBhbHdheXMgaGF2ZSBhIGJvZHkgd2hlbiBjcmVhdGVkLiAgWW91IGNhbiBnZXQgb25lIG9mIHRoZXNlIGJ5IHVzaW5nIG9uZSBvZgorLy8vIHRoZSBTdHJ1Y3RUeXBlOjpnZXQoKSBmb3Jtcy4KKy8vLworLy8vIElkZW50aWZpZWQgc3RydWN0cyAoZS5nLiAlZm9vIG9yICU0MikgbWF5IG9wdGlvbmFsbHkgaGF2ZSBhIG5hbWUgYW5kIGFyZSBub3QKKy8vLyB1bmlxdWVkLiAgVGhlIG5hbWVzIGZvciBpZGVudGlmaWVkIHN0cnVjdHMgYXJlIG1hbmFnZWQgYXQgdGhlIExMVk1Db250ZXh0CisvLy8gbGV2ZWwsIHNvIHRoZXJlIGNhbiBvbmx5IGJlIGEgc2luZ2xlIGlkZW50aWZpZWQgc3RydWN0IHdpdGggYSBnaXZlbiBuYW1lIGluCisvLy8gYSBwYXJ0aWN1bGFyIExMVk1Db250ZXh0LiAgSWRlbnRpZmllZCBzdHJ1Y3RzIG1heSBhbHNvIG9wdGlvbmFsbHkgYmUgb3BhcXVlCisvLy8gKGhhdmUgbm8gYm9keSBzcGVjaWZpZWQpLiAgWW91IGdldCBvbmUgb2YgdGhlc2UgYnkgdXNpbmcgb25lIG9mIHRoZQorLy8vIFN0cnVjdFR5cGU6OmNyZWF0ZSgpIGZvcm1zLgorLy8vCisvLy8gSW5kZXBlbmRlbnQgb2Ygd2hhdCBraW5kIG9mIHN0cnVjdCB5b3UgaGF2ZSwgdGhlIGJvZHkgb2YgYSBzdHJ1Y3QgdHlwZSBhcmUKKy8vLyBsYWlkIG91dCBpbiBtZW1vcnkgY29uc2VxdXRpdmVseSB3aXRoIHRoZSBlbGVtZW50cyBkaXJlY3RseSBvbmUgYWZ0ZXIgdGhlCisvLy8gb3RoZXIgKGlmIHRoZSBzdHJ1Y3QgaXMgcGFja2VkKSBvciAoaWYgbm90IHBhY2tlZCkgd2l0aCBwYWRkaW5nIGJldHdlZW4gdGhlCisvLy8gZWxlbWVudHMgYXMgZGVmaW5lZCBieSBEYXRhTGF5b3V0ICh3aGljaCBpcyByZXF1aXJlZCB0byBtYXRjaCB3aGF0IHRoZSBjb2RlCisvLy8gZ2VuZXJhdG9yIGZvciBhIHRhcmdldCBleHBlY3RzKS4KKy8vLworY2xhc3MgU3RydWN0VHlwZSA6IHB1YmxpYyBDb21wb3NpdGVUeXBlIHsKKyAgU3RydWN0VHlwZShMTFZNQ29udGV4dCAmQykgOiBDb21wb3NpdGVUeXBlKEMsIFN0cnVjdFR5SUQpIHt9CisKKyAgZW51bSB7CisgICAgLy8vIFRoaXMgaXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBTdWJDbGFzc0RhdGEgZmllbGQuCisgICAgU0NEQl9IYXNCb2R5ID0gMSwKKyAgICBTQ0RCX1BhY2tlZCA9IDIsCisgICAgU0NEQl9Jc0xpdGVyYWwgPSA0LAorICAgIFNDREJfSXNTaXplZCA9IDgKKyAgfTsKKworICAvLy8gRm9yIGEgbmFtZWQgc3RydWN0IHRoYXQgYWN0dWFsbHkgaGFzIGEgbmFtZSwgdGhpcyBpcyBhIHBvaW50ZXIgdG8gdGhlCisgIC8vLyBzeW1ib2wgdGFibGUgZW50cnkgKG1haW50YWluZWQgYnkgTExWTUNvbnRleHQpIGZvciB0aGUgc3RydWN0LgorICAvLy8gVGhpcyBpcyBudWxsIGlmIHRoZSB0eXBlIGlzIGFuIGxpdGVyYWwgc3RydWN0IG9yIGlmIGl0IGlzIGEgaWRlbnRpZmllZAorICAvLy8gdHlwZSB0aGF0IGhhcyBhbiBlbXB0eSBuYW1lLgorICB2b2lkICpTeW1ib2xUYWJsZUVudHJ5ID0gbnVsbHB0cjsKKworcHVibGljOgorICBTdHJ1Y3RUeXBlKGNvbnN0IFN0cnVjdFR5cGUgJikgPSBkZWxldGU7CisgIFN0cnVjdFR5cGUgJm9wZXJhdG9yPShjb25zdCBTdHJ1Y3RUeXBlICYpID0gZGVsZXRlOworCisgIC8vLyBUaGlzIGNyZWF0ZXMgYW4gaWRlbnRpZmllZCBzdHJ1Y3QuCisgIHN0YXRpYyBTdHJ1Y3RUeXBlICpjcmVhdGUoTExWTUNvbnRleHQgJkNvbnRleHQsIFN0cmluZ1JlZiBOYW1lKTsKKyAgc3RhdGljIFN0cnVjdFR5cGUgKmNyZWF0ZShMTFZNQ29udGV4dCAmQ29udGV4dCk7CisKKyAgc3RhdGljIFN0cnVjdFR5cGUgKmNyZWF0ZShBcnJheVJlZjxUeXBlICo+IEVsZW1lbnRzLCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUGFja2VkID0gZmFsc2UpOworICBzdGF0aWMgU3RydWN0VHlwZSAqY3JlYXRlKEFycmF5UmVmPFR5cGUgKj4gRWxlbWVudHMpOworICBzdGF0aWMgU3RydWN0VHlwZSAqY3JlYXRlKExMVk1Db250ZXh0ICZDb250ZXh0LCBBcnJheVJlZjxUeXBlICo+IEVsZW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lLCBib29sIGlzUGFja2VkID0gZmFsc2UpOworICBzdGF0aWMgU3RydWN0VHlwZSAqY3JlYXRlKExMVk1Db250ZXh0ICZDb250ZXh0LCBBcnJheVJlZjxUeXBlICo+IEVsZW1lbnRzKTsKKyAgdGVtcGxhdGUgPGNsYXNzLi4uIFR5cz4KKyAgc3RhdGljIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGFyZV9iYXNlX29mPFR5cGUsIFR5cy4uLj46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RydWN0VHlwZSAqPjo6dHlwZQorICBjcmVhdGUoU3RyaW5nUmVmIE5hbWUsIFR5cGUgKmVsdDEsIFR5cyAqLi4uIGVsdHMpIHsKKyAgICBhc3NlcnQoZWx0MSAmJiAiQ2Fubm90IGNyZWF0ZSBhIHN0cnVjdCB0eXBlIHdpdGggbm8gZWxlbWVudHMgd2l0aCB0aGlzIik7CisgICAgU21hbGxWZWN0b3I8bGx2bTo6VHlwZSAqLCA4PiBTdHJ1Y3RGaWVsZHMoe2VsdDEsIGVsdHMuLi59KTsKKyAgICByZXR1cm4gY3JlYXRlKFN0cnVjdEZpZWxkcywgTmFtZSk7CisgIH0KKworICAvLy8gVGhpcyBzdGF0aWMgbWV0aG9kIGlzIHRoZSBwcmltYXJ5IHdheSB0byBjcmVhdGUgYSBsaXRlcmFsIFN0cnVjdFR5cGUuCisgIHN0YXRpYyBTdHJ1Y3RUeXBlICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIEFycmF5UmVmPFR5cGUqPiBFbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzUGFja2VkID0gZmFsc2UpOworCisgIC8vLyBDcmVhdGUgYW4gZW1wdHkgc3RydWN0dXJlIHR5cGUuCisgIHN0YXRpYyBTdHJ1Y3RUeXBlICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIGJvb2wgaXNQYWNrZWQgPSBmYWxzZSk7CisKKyAgLy8vIFRoaXMgc3RhdGljIG1ldGhvZCBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCBmb3IgY3JlYXRpbmcgc3RydWN0dXJlIHR5cGVzIGJ5CisgIC8vLyBzcGVjaWZ5aW5nIHRoZSBlbGVtZW50cyBhcyBhcmd1bWVudHMuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCBhbHdheXMgcmV0dXJucworICAvLy8gYSBub24tcGFja2VkIHN0cnVjdCwgYW5kIHJlcXVpcmVzIGF0IGxlYXN0IG9uZSBlbGVtZW50IHR5cGUuCisgIHRlbXBsYXRlIDxjbGFzcy4uLiBUeXM+CisgIHN0YXRpYyB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxhcmVfYmFzZV9vZjxUeXBlLCBUeXMuLi4+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cnVjdFR5cGUgKj46OnR5cGUKKyAgZ2V0KFR5cGUgKmVsdDEsIFR5cyAqLi4uIGVsdHMpIHsKKyAgICBhc3NlcnQoZWx0MSAmJiAiQ2Fubm90IGNyZWF0ZSBhIHN0cnVjdCB0eXBlIHdpdGggbm8gZWxlbWVudHMgd2l0aCB0aGlzIik7CisgICAgTExWTUNvbnRleHQgJkN0eCA9IGVsdDEtPmdldENvbnRleHQoKTsKKyAgICBTbWFsbFZlY3RvcjxsbHZtOjpUeXBlICosIDg+IFN0cnVjdEZpZWxkcyh7ZWx0MSwgZWx0cy4uLn0pOworICAgIHJldHVybiBsbHZtOjpTdHJ1Y3RUeXBlOjpnZXQoQ3R4LCBTdHJ1Y3RGaWVsZHMpOworICB9CisKKyAgYm9vbCBpc1BhY2tlZCgpIGNvbnN0IHsgcmV0dXJuIChnZXRTdWJjbGFzc0RhdGEoKSAmIFNDREJfUGFja2VkKSAhPSAwOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgdHlwZSBpcyB1bmlxdWVkIGJ5IHN0cnVjdHVyYWwgZXF1aXZhbGVuY2UsIGZhbHNlIGlmIGl0CisgIC8vLyBpcyBhIHN0cnVjdCBkZWZpbml0aW9uLgorICBib29sIGlzTGl0ZXJhbCgpIGNvbnN0IHsgcmV0dXJuIChnZXRTdWJjbGFzc0RhdGEoKSAmIFNDREJfSXNMaXRlcmFsKSAhPSAwOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSB0eXBlIHdpdGggYW4gaWRlbnRpdHkgdGhhdCBoYXMgbm8gYm9keSBzcGVjaWZpZWQKKyAgLy8vIHlldC4gVGhlc2UgcHJpbnRzIGFzICdvcGFxdWUnIGluIC5sbCBmaWxlcy4KKyAgYm9vbCBpc09wYXF1ZSgpIGNvbnN0IHsgcmV0dXJuIChnZXRTdWJjbGFzc0RhdGEoKSAmIFNDREJfSGFzQm9keSkgPT0gMDsgfQorCisgIC8vLyBpc1NpemVkIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHNpemVkIHR5cGUuCisgIGJvb2wgaXNTaXplZChTbWFsbFB0clNldEltcGw8VHlwZSAqPiAqVmlzaXRlZCA9IG51bGxwdHIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgbmFtZWQgc3RydWN0IHRoYXQgaGFzIGEgbm9uLWVtcHR5IG5hbWUuCisgIGJvb2wgaGFzTmFtZSgpIGNvbnN0IHsgcmV0dXJuIFN5bWJvbFRhYmxlRW50cnkgIT0gbnVsbHB0cjsgfQorCisgIC8vLyBSZXR1cm4gdGhlIG5hbWUgZm9yIHRoaXMgc3RydWN0IHR5cGUgaWYgaXQgaGFzIGFuIGlkZW50aXR5LgorICAvLy8gVGhpcyBtYXkgcmV0dXJuIGFuIGVtcHR5IHN0cmluZyBmb3IgYW4gdW5uYW1lZCBzdHJ1Y3QgdHlwZS4gIERvIG5vdCBjYWxsCisgIC8vLyB0aGlzIG9uIGFuIGxpdGVyYWwgdHlwZS4KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdDsKKworICAvLy8gQ2hhbmdlIHRoZSBuYW1lIG9mIHRoaXMgdHlwZSB0byB0aGUgc3BlY2lmaWVkIG5hbWUsIG9yIHRvIGEgbmFtZSB3aXRoIGEKKyAgLy8vIHN1ZmZpeCBpZiB0aGVyZSBpcyBhIGNvbGxpc2lvbi4gRG8gbm90IGNhbGwgdGhpcyBvbiBhbiBsaXRlcmFsIHR5cGUuCisgIHZvaWQgc2V0TmFtZShTdHJpbmdSZWYgTmFtZSk7CisKKyAgLy8vIFNwZWNpZnkgYSBib2R5IGZvciBhbiBvcGFxdWUgaWRlbnRpZmllZCB0eXBlLgorICB2b2lkIHNldEJvZHkoQXJyYXlSZWY8VHlwZSo+IEVsZW1lbnRzLCBib29sIGlzUGFja2VkID0gZmFsc2UpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUeXM+CisgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGFyZV9iYXNlX29mPFR5cGUsIFR5cy4uLj46OnZhbHVlLCB2b2lkPjo6dHlwZQorICBzZXRCb2R5KFR5cGUgKmVsdDEsIFR5cyAqLi4uIGVsdHMpIHsKKyAgICBhc3NlcnQoZWx0MSAmJiAiQ2Fubm90IGNyZWF0ZSBhIHN0cnVjdCB0eXBlIHdpdGggbm8gZWxlbWVudHMgd2l0aCB0aGlzIik7CisgICAgU21hbGxWZWN0b3I8bGx2bTo6VHlwZSAqLCA4PiBTdHJ1Y3RGaWVsZHMoe2VsdDEsIGVsdHMuLi59KTsKKyAgICBzZXRCb2R5KFN0cnVjdEZpZWxkcyk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCB0eXBlIGlzIHZhbGlkIGFzIGEgZWxlbWVudCB0eXBlLgorICBzdGF0aWMgYm9vbCBpc1ZhbGlkRWxlbWVudFR5cGUoVHlwZSAqRWxlbVR5KTsKKworICAvLyBJdGVyYXRvciBhY2Nlc3MgdG8gdGhlIGVsZW1lbnRzLgorICB1c2luZyBlbGVtZW50X2l0ZXJhdG9yID0gVHlwZTo6c3VidHlwZV9pdGVyYXRvcjsKKworICBlbGVtZW50X2l0ZXJhdG9yIGVsZW1lbnRfYmVnaW4oKSBjb25zdCB7IHJldHVybiBDb250YWluZWRUeXM7IH0KKyAgZWxlbWVudF9pdGVyYXRvciBlbGVtZW50X2VuZCgpIGNvbnN0IHsgcmV0dXJuICZDb250YWluZWRUeXNbTnVtQ29udGFpbmVkVHlzXTt9CisgIEFycmF5UmVmPFR5cGUgKj4gY29uc3QgZWxlbWVudHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VBcnJheVJlZihlbGVtZW50X2JlZ2luKCksIGVsZW1lbnRfZW5kKCkpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgbGF5b3V0IGlkZW50aWNhbCB0byB0aGUgc3BlY2lmaWVkIHN0cnVjdC4KKyAgYm9vbCBpc0xheW91dElkZW50aWNhbChTdHJ1Y3RUeXBlICpPdGhlcikgY29uc3Q7CisKKyAgLy8vIFJhbmRvbSBhY2Nlc3MgdG8gdGhlIGVsZW1lbnRzCisgIHVuc2lnbmVkIGdldE51bUVsZW1lbnRzKCkgY29uc3QgeyByZXR1cm4gTnVtQ29udGFpbmVkVHlzOyB9CisgIFR5cGUgKmdldEVsZW1lbnRUeXBlKHVuc2lnbmVkIE4pIGNvbnN0IHsKKyAgICBhc3NlcnQoTiA8IE51bUNvbnRhaW5lZFR5cyAmJiAiRWxlbWVudCBudW1iZXIgb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBDb250YWluZWRUeXNbTl07CisgIH0KKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdC4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBUeXBlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFR5cGVJRCgpID09IFN0cnVjdFR5SUQ7CisgIH0KK307CisKK1N0cmluZ1JlZiBUeXBlOjpnZXRTdHJ1Y3ROYW1lKCkgY29uc3QgeworICByZXR1cm4gY2FzdDxTdHJ1Y3RUeXBlPih0aGlzKS0+Z2V0TmFtZSgpOworfQorCit1bnNpZ25lZCBUeXBlOjpnZXRTdHJ1Y3ROdW1FbGVtZW50cygpIGNvbnN0IHsKKyAgcmV0dXJuIGNhc3Q8U3RydWN0VHlwZT4odGhpcyktPmdldE51bUVsZW1lbnRzKCk7Cit9CisKK1R5cGUgKlR5cGU6OmdldFN0cnVjdEVsZW1lbnRUeXBlKHVuc2lnbmVkIE4pIGNvbnN0IHsKKyAgcmV0dXJuIGNhc3Q8U3RydWN0VHlwZT4odGhpcyktPmdldEVsZW1lbnRUeXBlKE4pOworfQorCisvLy8gVGhpcyBpcyB0aGUgc3VwZXJjbGFzcyBvZiB0aGUgYXJyYXkgYW5kIHZlY3RvciB0eXBlIGNsYXNzZXMuIEJvdGggb2YgdGhlc2UKKy8vLyByZXByZXNlbnQgImFycmF5cyIgaW4gbWVtb3J5LiBUaGUgYXJyYXkgdHlwZSByZXByZXNlbnRzIGEgc3BlY2lmaWNhbGx5IHNpemVkCisvLy8gYXJyYXksIGFuZCB0aGUgdmVjdG9yIHR5cGUgcmVwcmVzZW50cyBhIHNwZWNpZmljYWxseSBzaXplZCBhcnJheSB0aGF0IGFsbG93cworLy8vIGZvciB1c2Ugb2YgU0lNRCBpbnN0cnVjdGlvbnMuIFNlcXVlbnRpYWxUeXBlIGhvbGRzIHRoZSBjb21tb24gZmVhdHVyZXMgb2YKKy8vLyBib3RoLCB3aGljaCBzdGVtIGZyb20gdGhlIGZhY3QgdGhhdCBib3RoIGxheSB0aGVpciBjb21wb25lbnRzIG91dCBpbiBtZW1vcnkKKy8vLyBpZGVudGljYWxseS4KK2NsYXNzIFNlcXVlbnRpYWxUeXBlIDogcHVibGljIENvbXBvc2l0ZVR5cGUgeworICBUeXBlICpDb250YWluZWRUeXBlOyAgICAgICAgICAgICAgIC8vLzwgU3RvcmFnZSBmb3IgdGhlIHNpbmdsZSBjb250YWluZWQgdHlwZS4KKyAgdWludDY0X3QgTnVtRWxlbWVudHM7CisKK3Byb3RlY3RlZDoKKyAgU2VxdWVudGlhbFR5cGUoVHlwZUlEIFRJRCwgVHlwZSAqRWxUeXBlLCB1aW50NjRfdCBOdW1FbGVtZW50cykKKyAgICA6IENvbXBvc2l0ZVR5cGUoRWxUeXBlLT5nZXRDb250ZXh0KCksIFRJRCksIENvbnRhaW5lZFR5cGUoRWxUeXBlKSwKKyAgICAgIE51bUVsZW1lbnRzKE51bUVsZW1lbnRzKSB7CisgICAgQ29udGFpbmVkVHlzID0gJkNvbnRhaW5lZFR5cGU7CisgICAgTnVtQ29udGFpbmVkVHlzID0gMTsKKyAgfQorCitwdWJsaWM6CisgIFNlcXVlbnRpYWxUeXBlKGNvbnN0IFNlcXVlbnRpYWxUeXBlICYpID0gZGVsZXRlOworICBTZXF1ZW50aWFsVHlwZSAmb3BlcmF0b3I9KGNvbnN0IFNlcXVlbnRpYWxUeXBlICYpID0gZGVsZXRlOworCisgIHVpbnQ2NF90IGdldE51bUVsZW1lbnRzKCkgY29uc3QgeyByZXR1cm4gTnVtRWxlbWVudHM7IH0KKyAgVHlwZSAqZ2V0RWxlbWVudFR5cGUoKSBjb25zdCB7IHJldHVybiBDb250YWluZWRUeXBlOyB9CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3QuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlSUQoKSA9PSBBcnJheVR5SUQgfHwgVC0+Z2V0VHlwZUlEKCkgPT0gVmVjdG9yVHlJRDsKKyAgfQorfTsKKworLy8vIENsYXNzIHRvIHJlcHJlc2VudCBhcnJheSB0eXBlcy4KK2NsYXNzIEFycmF5VHlwZSA6IHB1YmxpYyBTZXF1ZW50aWFsVHlwZSB7CisgIEFycmF5VHlwZShUeXBlICpFbFR5cGUsIHVpbnQ2NF90IE51bUVsKTsKKworcHVibGljOgorICBBcnJheVR5cGUoY29uc3QgQXJyYXlUeXBlICYpID0gZGVsZXRlOworICBBcnJheVR5cGUgJm9wZXJhdG9yPShjb25zdCBBcnJheVR5cGUgJikgPSBkZWxldGU7CisKKyAgLy8vIFRoaXMgc3RhdGljIG1ldGhvZCBpcyB0aGUgcHJpbWFyeSB3YXkgdG8gY29uc3RydWN0IGFuIEFycmF5VHlwZQorICBzdGF0aWMgQXJyYXlUeXBlICpnZXQoVHlwZSAqRWxlbWVudFR5cGUsIHVpbnQ2NF90IE51bUVsZW1lbnRzKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCB0eXBlIGlzIHZhbGlkIGFzIGEgZWxlbWVudCB0eXBlLgorICBzdGF0aWMgYm9vbCBpc1ZhbGlkRWxlbWVudFR5cGUoVHlwZSAqRWxlbVR5KTsKKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdC4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBUeXBlICpUKSB7CisgICAgcmV0dXJuIFQtPmdldFR5cGVJRCgpID09IEFycmF5VHlJRDsKKyAgfQorfTsKKwordWludDY0X3QgVHlwZTo6Z2V0QXJyYXlOdW1FbGVtZW50cygpIGNvbnN0IHsKKyAgcmV0dXJuIGNhc3Q8QXJyYXlUeXBlPih0aGlzKS0+Z2V0TnVtRWxlbWVudHMoKTsKK30KKworLy8vIENsYXNzIHRvIHJlcHJlc2VudCB2ZWN0b3IgdHlwZXMuCitjbGFzcyBWZWN0b3JUeXBlIDogcHVibGljIFNlcXVlbnRpYWxUeXBlIHsKKyAgVmVjdG9yVHlwZShUeXBlICpFbFR5cGUsIHVuc2lnbmVkIE51bUVsKTsKKworcHVibGljOgorICBWZWN0b3JUeXBlKGNvbnN0IFZlY3RvclR5cGUgJikgPSBkZWxldGU7CisgIFZlY3RvclR5cGUgJm9wZXJhdG9yPShjb25zdCBWZWN0b3JUeXBlICYpID0gZGVsZXRlOworCisgIC8vLyBUaGlzIHN0YXRpYyBtZXRob2QgaXMgdGhlIHByaW1hcnkgd2F5IHRvIGNvbnN0cnVjdCBhbiBWZWN0b3JUeXBlLgorICBzdGF0aWMgVmVjdG9yVHlwZSAqZ2V0KFR5cGUgKkVsZW1lbnRUeXBlLCB1bnNpZ25lZCBOdW1FbGVtZW50cyk7CisKKyAgLy8vIFRoaXMgc3RhdGljIG1ldGhvZCBnZXRzIGEgVmVjdG9yVHlwZSB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBlbGVtZW50cyBhcworICAvLy8gdGhlIGlucHV0IHR5cGUsIGFuZCB0aGUgZWxlbWVudCB0eXBlIGlzIGFuIGludGVnZXIgdHlwZSBvZiB0aGUgc2FtZSB3aWR0aAorICAvLy8gYXMgdGhlIGlucHV0IGVsZW1lbnQgdHlwZS4KKyAgc3RhdGljIFZlY3RvclR5cGUgKmdldEludGVnZXIoVmVjdG9yVHlwZSAqVlR5KSB7CisgICAgdW5zaWduZWQgRWx0Qml0cyA9IFZUeS0+Z2V0RWxlbWVudFR5cGUoKS0+Z2V0UHJpbWl0aXZlU2l6ZUluQml0cygpOworICAgIGFzc2VydChFbHRCaXRzICYmICJFbGVtZW50IHNpemUgbXVzdCBiZSBvZiBhIG5vbi16ZXJvIHNpemUiKTsKKyAgICBUeXBlICpFbHRUeSA9IEludGVnZXJUeXBlOjpnZXQoVlR5LT5nZXRDb250ZXh0KCksIEVsdEJpdHMpOworICAgIHJldHVybiBWZWN0b3JUeXBlOjpnZXQoRWx0VHksIFZUeS0+Z2V0TnVtRWxlbWVudHMoKSk7CisgIH0KKworICAvLy8gVGhpcyBzdGF0aWMgbWV0aG9kIGlzIGxpa2UgZ2V0SW50ZWdlciBleGNlcHQgdGhhdCB0aGUgZWxlbWVudCB0eXBlcyBhcmUKKyAgLy8vIHR3aWNlIGFzIHdpZGUgYXMgdGhlIGVsZW1lbnRzIGluIHRoZSBpbnB1dCB0eXBlLgorICBzdGF0aWMgVmVjdG9yVHlwZSAqZ2V0RXh0ZW5kZWRFbGVtZW50VmVjdG9yVHlwZShWZWN0b3JUeXBlICpWVHkpIHsKKyAgICB1bnNpZ25lZCBFbHRCaXRzID0gVlR5LT5nZXRFbGVtZW50VHlwZSgpLT5nZXRQcmltaXRpdmVTaXplSW5CaXRzKCk7CisgICAgVHlwZSAqRWx0VHkgPSBJbnRlZ2VyVHlwZTo6Z2V0KFZUeS0+Z2V0Q29udGV4dCgpLCBFbHRCaXRzICogMik7CisgICAgcmV0dXJuIFZlY3RvclR5cGU6OmdldChFbHRUeSwgVlR5LT5nZXROdW1FbGVtZW50cygpKTsKKyAgfQorCisgIC8vLyBUaGlzIHN0YXRpYyBtZXRob2QgaXMgbGlrZSBnZXRJbnRlZ2VyIGV4Y2VwdCB0aGF0IHRoZSBlbGVtZW50IHR5cGVzIGFyZQorICAvLy8gaGFsZiBhcyB3aWRlIGFzIHRoZSBlbGVtZW50cyBpbiB0aGUgaW5wdXQgdHlwZS4KKyAgc3RhdGljIFZlY3RvclR5cGUgKmdldFRydW5jYXRlZEVsZW1lbnRWZWN0b3JUeXBlKFZlY3RvclR5cGUgKlZUeSkgeworICAgIHVuc2lnbmVkIEVsdEJpdHMgPSBWVHktPmdldEVsZW1lbnRUeXBlKCktPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKTsKKyAgICBhc3NlcnQoKEVsdEJpdHMgJiAxKSA9PSAwICYmCisgICAgICAgICAgICJDYW5ub3QgdHJ1bmNhdGUgdmVjdG9yIGVsZW1lbnQgd2l0aCBvZGQgYml0LXdpZHRoIik7CisgICAgVHlwZSAqRWx0VHkgPSBJbnRlZ2VyVHlwZTo6Z2V0KFZUeS0+Z2V0Q29udGV4dCgpLCBFbHRCaXRzIC8gMik7CisgICAgcmV0dXJuIFZlY3RvclR5cGU6OmdldChFbHRUeSwgVlR5LT5nZXROdW1FbGVtZW50cygpKTsKKyAgfQorCisgIC8vLyBUaGlzIHN0YXRpYyBtZXRob2QgcmV0dXJucyBhIFZlY3RvclR5cGUgd2l0aCBoYWxmIGFzIG1hbnkgZWxlbWVudHMgYXMgdGhlCisgIC8vLyBpbnB1dCB0eXBlIGFuZCB0aGUgc2FtZSBlbGVtZW50IHR5cGUuCisgIHN0YXRpYyBWZWN0b3JUeXBlICpnZXRIYWxmRWxlbWVudHNWZWN0b3JUeXBlKFZlY3RvclR5cGUgKlZUeSkgeworICAgIHVuc2lnbmVkIE51bUVsdHMgPSBWVHktPmdldE51bUVsZW1lbnRzKCk7CisgICAgYXNzZXJ0ICgoTnVtRWx0cyAmIDEpID09IDAgJiYKKyAgICAgICAgICAgICJDYW5ub3QgaGFsdmUgdmVjdG9yIHdpdGggb2RkIG51bWJlciBvZiBlbGVtZW50cy4iKTsKKyAgICByZXR1cm4gVmVjdG9yVHlwZTo6Z2V0KFZUeS0+Z2V0RWxlbWVudFR5cGUoKSwgTnVtRWx0cy8yKTsKKyAgfQorCisgIC8vLyBUaGlzIHN0YXRpYyBtZXRob2QgcmV0dXJucyBhIFZlY3RvclR5cGUgd2l0aCB0d2ljZSBhcyBtYW55IGVsZW1lbnRzIGFzIHRoZQorICAvLy8gaW5wdXQgdHlwZSBhbmQgdGhlIHNhbWUgZWxlbWVudCB0eXBlLgorICBzdGF0aWMgVmVjdG9yVHlwZSAqZ2V0RG91YmxlRWxlbWVudHNWZWN0b3JUeXBlKFZlY3RvclR5cGUgKlZUeSkgeworICAgIHVuc2lnbmVkIE51bUVsdHMgPSBWVHktPmdldE51bUVsZW1lbnRzKCk7CisgICAgcmV0dXJuIFZlY3RvclR5cGU6OmdldChWVHktPmdldEVsZW1lbnRUeXBlKCksIE51bUVsdHMqMik7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCB0eXBlIGlzIHZhbGlkIGFzIGEgZWxlbWVudCB0eXBlLgorICBzdGF0aWMgYm9vbCBpc1ZhbGlkRWxlbWVudFR5cGUoVHlwZSAqRWxlbVR5KTsKKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBpbiB0aGUgVmVjdG9yIHR5cGUuCisgIC8vLyBSZXR1cm5zIHplcm8gd2hlbiB0aGUgdmVjdG9yIGlzIGEgdmVjdG9yIG9mIHBvaW50ZXJzLgorICB1bnNpZ25lZCBnZXRCaXRXaWR0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TnVtRWxlbWVudHMoKSAqIGdldEVsZW1lbnRUeXBlKCktPmdldFByaW1pdGl2ZVNpemVJbkJpdHMoKTsKKyAgfQorCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0LgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFR5cGUgKlQpIHsKKyAgICByZXR1cm4gVC0+Z2V0VHlwZUlEKCkgPT0gVmVjdG9yVHlJRDsKKyAgfQorfTsKKwordW5zaWduZWQgVHlwZTo6Z2V0VmVjdG9yTnVtRWxlbWVudHMoKSBjb25zdCB7CisgIHJldHVybiBjYXN0PFZlY3RvclR5cGU+KHRoaXMpLT5nZXROdW1FbGVtZW50cygpOworfQorCisvLy8gQ2xhc3MgdG8gcmVwcmVzZW50IHBvaW50ZXJzLgorY2xhc3MgUG9pbnRlclR5cGUgOiBwdWJsaWMgVHlwZSB7CisgIGV4cGxpY2l0IFBvaW50ZXJUeXBlKFR5cGUgKkVsVHlwZSwgdW5zaWduZWQgQWRkclNwYWNlKTsKKworICBUeXBlICpQb2ludGVlVHk7CisKK3B1YmxpYzoKKyAgUG9pbnRlclR5cGUoY29uc3QgUG9pbnRlclR5cGUgJikgPSBkZWxldGU7CisgIFBvaW50ZXJUeXBlICZvcGVyYXRvcj0oY29uc3QgUG9pbnRlclR5cGUgJikgPSBkZWxldGU7CisKKyAgLy8vIFRoaXMgY29uc3RydWN0cyBhIHBvaW50ZXIgdG8gYW4gb2JqZWN0IG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBpbiBhIG51bWJlcmVkCisgIC8vLyBhZGRyZXNzIHNwYWNlLgorICBzdGF0aWMgUG9pbnRlclR5cGUgKmdldChUeXBlICpFbGVtZW50VHlwZSwgdW5zaWduZWQgQWRkcmVzc1NwYWNlKTsKKworICAvLy8gVGhpcyBjb25zdHJ1Y3RzIGEgcG9pbnRlciB0byBhbiBvYmplY3Qgb2YgdGhlIHNwZWNpZmllZCB0eXBlIGluIHRoZQorICAvLy8gZ2VuZXJpYyBhZGRyZXNzIHNwYWNlIChhZGRyZXNzIHNwYWNlIHplcm8pLgorICBzdGF0aWMgUG9pbnRlclR5cGUgKmdldFVucXVhbChUeXBlICpFbGVtZW50VHlwZSkgeworICAgIHJldHVybiBQb2ludGVyVHlwZTo6Z2V0KEVsZW1lbnRUeXBlLCAwKTsKKyAgfQorCisgIFR5cGUgKmdldEVsZW1lbnRUeXBlKCkgY29uc3QgeyByZXR1cm4gUG9pbnRlZVR5OyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgdHlwZSBpcyB2YWxpZCBhcyBhIGVsZW1lbnQgdHlwZS4KKyAgc3RhdGljIGJvb2wgaXNWYWxpZEVsZW1lbnRUeXBlKFR5cGUgKkVsZW1UeSk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHdlIGNhbiBsb2FkIG9yIHN0b3JlIGZyb20gYSBwb2ludGVyIHRvIHRoaXMgdHlwZS4KKyAgc3RhdGljIGJvb2wgaXNMb2FkYWJsZU9yU3RvcmFibGVUeXBlKFR5cGUgKkVsZW1UeSk7CisKKyAgLy8vIFJldHVybiB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgUG9pbnRlciB0eXBlLgorICBpbmxpbmUgdW5zaWduZWQgZ2V0QWRkcmVzc1NwYWNlKCkgY29uc3QgeyByZXR1cm4gZ2V0U3ViY2xhc3NEYXRhKCk7IH0KKworICAvLy8gSW1wbGVtZW50IHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3QuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVHlwZSAqVCkgeworICAgIHJldHVybiBULT5nZXRUeXBlSUQoKSA9PSBQb2ludGVyVHlJRDsKKyAgfQorfTsKKwordW5zaWduZWQgVHlwZTo6Z2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGNhc3Q8UG9pbnRlclR5cGU+KGdldFNjYWxhclR5cGUoKSktPmdldEFkZHJlc3NTcGFjZSgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9ERVJJVkVEVFlQRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EZXJpdmVkVXNlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EZXJpdmVkVXNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3YzQ4M2QKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0Rlcml2ZWRVc2VyLmgKQEAgLTAsMCArMSw0NSBAQAorLy89PT0tIERlcml2ZWRVc2VyLmggLSBCYXNlIGZvciBub24tSVIgVXNlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0RFUklWRURVU0VSX0gKKyNkZWZpbmUgTExWTV9JUl9ERVJJVkVEVVNFUl9ICisKKyNpbmNsdWRlICJsbHZtL0lSL1VzZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBUeXBlOworY2xhc3MgVXNlOworCisvLy8gRXh0ZW5zaW9uIHBvaW50IGZvciB0aGUgVmFsdWUgaGllcmFyY2h5LiBBbGwgY2xhc3NlcyBvdXRzaWRlIG9mIGxpYi9JUgorLy8vIHRoYXQgd2lzaCB0byBpbmhlcml0IGZyb20gVXNlciBzaG91bGQgaW5zdGVhZCBpbmhlcml0IGZyb20gRGVyaXZlZFVzZXIKKy8vLyBpbnN0ZWFkLiBJbmhlcml0aW5nIGZyb20gdGhpcyBjbGFzcyBpcyBkaXNjb3VyYWdlZC4KKy8vLworLy8vIEdlbmVyYWxseSBzcGVha2luZywgVmFsdWUgaXMgdGhlIGJhc2Ugb2YgYSBjbG9zZWQgY2xhc3MgaGllcmFyY2h5CisvLy8gdGhhdCBjYW4ndCBiZSBleHRlbmRlZCBieSBjb2RlIG91dHNpZGUgb2YgbGliL0lSLiBUaGlzIGNsYXNzIGNyZWF0ZXMgYQorLy8vIGxvb3Bob2xlIHRoYXQgYWxsb3dzIGNsYXNzZXMgb3V0c2lkZSBvZiBsaWIvSVIgdG8gZXh0ZW5kIFVzZXIgdG8gbGV2ZXJhZ2UKKy8vLyBpdHMgdXNlL2RlZiBsaXN0IG1hY2hpbmVyeS4KK2NsYXNzIERlcml2ZWRVc2VyIDogcHVibGljIFVzZXIgeworcHJvdGVjdGVkOgorICB1c2luZyAgRGVsZXRlVmFsdWVUeSA9IHZvaWQgKCopKERlcml2ZWRVc2VyICopOworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgVmFsdWU7CisKKyAgRGVsZXRlVmFsdWVUeSBEZWxldGVWYWx1ZTsKKworcHVibGljOgorICBEZXJpdmVkVXNlcihUeXBlICpUeSwgdW5zaWduZWQgVkssIFVzZSAqVSwgdW5zaWduZWQgTnVtT3BzLAorICAgICAgICAgICAgICBEZWxldGVWYWx1ZVR5IERlbGV0ZVZhbHVlKQorICAgICAgOiBVc2VyKFR5LCBWSywgVSwgTnVtT3BzKSwgRGVsZXRlVmFsdWUoRGVsZXRlVmFsdWUpIHt9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9ERVJJVkVEVVNFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RpYWdub3N0aWNIYW5kbGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RpYWdub3N0aWNIYW5kbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI1NmQ0OAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRGlhZ25vc3RpY0hhbmRsZXIuaApAQCAtMCwwICsxLDc1IEBACisvLz09PS0gRGlhZ25vc3RpY0hhbmRsZXIuaCAtIERpYWdub3N0aWNIYW5kbGVyIGNsYXNzIGZvciBMTFZNIC0qLSBDKysgLS0tKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQmFzZSBEaWFnbm9zdGljSGFuZGxlciBjbGFzcyBkZWNsYXJhdGlvbi4gRGVyaXZlIGZyb20gdGhpcyBjbGFzcyB0byBwcm92aWRlCisvLyBjdXN0b20gZGlhZ25vc3RpYyByZXBvcnRpbmcuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfRElBR05PU1RJQ0hBTkRMRVJfSAorI2RlZmluZSBMTFZNX0lSX0RJQUdOT1NUSUNIQU5ETEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBEaWFnbm9zdGljSW5mbzsKKworLy8vIFxicmllZiBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBkaWFnbm9zdGljIGhhbmRsaW5nIGluIExMVk0uCisvLy8gVGhlIGhhbmRsZURpYWdub3N0aWNzIG1ldGhvZCBtdXN0IGJlIG92ZXJyaWRlbiBieSB0aGUgc3ViY2xhc3NlcyB0byBoYW5kbGUKKy8vLyBkaWFnbm9zdGljLiBUaGUgKlJlbWFya0VuYWJsZWQgbWV0aG9kcyBjYW4gYmUgb3ZlcnJpZGVuIHRvIGNvbnRyb2wKKy8vLyB3aGljaCByZW1hcmtzIGFyZSBlbmFibGVkLgorc3RydWN0IERpYWdub3N0aWNIYW5kbGVyIHsKKyAgdm9pZCAqRGlhZ25vc3RpY0NvbnRleHQgPSBudWxscHRyOworICBEaWFnbm9zdGljSGFuZGxlcih2b2lkICpEaWFnQ29udGV4dCA9IG51bGxwdHIpCisgICAgICA6IERpYWdub3N0aWNDb250ZXh0KERpYWdDb250ZXh0KSB7fQorICB2aXJ0dWFsIH5EaWFnbm9zdGljSGFuZGxlcigpID0gZGVmYXVsdDsKKworICB1c2luZyBEaWFnbm9zdGljSGFuZGxlclR5ID0gdm9pZCAoKikoY29uc3QgRGlhZ25vc3RpY0luZm8gJkRJLCB2b2lkICpDb250ZXh0KTsKKworICAvLy8gRGlhZ0hhbmRsZXJDYWxsYmFjayBpcyBzZXR0YWJsZSBmcm9tIHRoZSBDIEFQSSBhbmQgYmFzZSBpbXBsZW1lbnRhdGlvbgorICAvLy8gb2YgRGlhZ25vc3RpY0hhbmRsZXIgd2lsbCBjYWxsIGl0IGZyb20gaGFuZGxlRGlhZ25vc3RpY3MoKS4gQW55IGRlcml2ZWQKKyAgLy8vIGNsYXNzIG9mIERpYWdub3N0aWNIYW5kbGVyIHNob3VsZCBub3QgdXNlIGNhbGxiYWNrIGJ1dAorICAvLy8gaW1wbGVtZW50IGhhbmRsZURpYWdub3N0aWNzKCkuCisgIERpYWdub3N0aWNIYW5kbGVyVHkgRGlhZ0hhbmRsZXJDYWxsYmFjayA9IG51bGxwdHI7CisKKyAgLy8vIE92ZXJyaWRlIGhhbmRsZURpYWdub3N0aWNzIHRvIHByb3ZpZGUgY3VzdG9tIGltcGxlbWVudGF0aW9uLgorICAvLy8gUmV0dXJuIHRydWUgaWYgaXQgaGFuZGxlcyBkaWFnbm9zdGljcyByZXBvcnRpbmcgcHJvcGVybHkgb3RoZXJ3aXNlCisgIC8vLyByZXR1cm4gZmFsc2UgdG8gbWFrZSBMTFZNQ29udGV4dDo6ZGlhZ25vc2UoKSB0byBwcmludCB0aGUgbWVzc2FnZQorICAvLy8gd2l0aCBhIHByZWZpeCBiYXNlZCBvbiB0aGUgc2V2ZXJpdHkuCisgIHZpcnR1YWwgYm9vbCBoYW5kbGVEaWFnbm9zdGljcyhjb25zdCBEaWFnbm9zdGljSW5mbyAmREkpIHsKKyAgICBpZiAoRGlhZ0hhbmRsZXJDYWxsYmFjaykgeworICAgICAgRGlhZ0hhbmRsZXJDYWxsYmFjayhESSwgRGlhZ25vc3RpY0NvbnRleHQpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhbmFseXNpcyByZW1hcmtzIGFyZSBlbmFibGVkLCBvdmVycmlkZQorICAvLy8gdG8gcHJvdmlkZSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24uCisgIHZpcnR1YWwgYm9vbCBpc0FuYWx5c2lzUmVtYXJrRW5hYmxlZChTdHJpbmdSZWYgUGFzc05hbWUpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBtaXNzZWQgb3B0aW1pemF0aW9uIHJlbWFya3MgYXJlIGVuYWJsZWQsIG92ZXJyaWRlCisgIC8vLyB0byBwcm92aWRlIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbi4KKyAgdmlydHVhbCBib29sIGlzTWlzc2VkT3B0UmVtYXJrRW5hYmxlZChTdHJpbmdSZWYgUGFzc05hbWUpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBwYXNzZWQgb3B0aW1pemF0aW9uIHJlbWFya3MgYXJlIGVuYWJsZWQsIG92ZXJyaWRlCisgIC8vLyB0byBwcm92aWRlIGRpZmZlcmVudCBpbXBsZW1lbnRhdGlvbi4KKyAgdmlydHVhbCBib29sIGlzUGFzc2VkT3B0UmVtYXJrRW5hYmxlZChTdHJpbmdSZWYgUGFzc05hbWUpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhbnkgdHlwZSBvZiByZW1hcmtzIGFyZSBlbmFibGVkIGZvciB0aGlzIHBhc3MuCisgIGJvb2wgaXNBbnlSZW1hcmtFbmFibGVkKFN0cmluZ1JlZiBQYXNzTmFtZSkgY29uc3QgeworICAgIHJldHVybiAoaXNNaXNzZWRPcHRSZW1hcmtFbmFibGVkKFBhc3NOYW1lKSB8fAorICAgICAgICAgICAgaXNQYXNzZWRPcHRSZW1hcmtFbmFibGVkKFBhc3NOYW1lKSB8fAorICAgICAgICAgICAgaXNBbmFseXNpc1JlbWFya0VuYWJsZWQoUGFzc05hbWUpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhbnkgdHlwZSBvZiByZW1hcmtzIGFyZSBlbmFibGVkIGZvciBhbnkgcGFzcy4KKyAgdmlydHVhbCBib29sIGlzQW55UmVtYXJrRW5hYmxlZCgpIGNvbnN0OworfTsKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfRElBR05PU1RJQ0hBTkRMRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EaWFnbm9zdGljSW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9EaWFnbm9zdGljSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmZWMyYmUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RpYWdub3N0aWNJbmZvLmgKQEAgLTAsMCArMSw5OTkgQEAKKy8vPT09LSBsbHZtL0lSL0RpYWdub3N0aWNJbmZvLmggLSBEaWFnbm9zdGljIERlY2xhcmF0aW9uIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBkaWZmZXJlbnQgY2xhc3NlcyBpbnZvbHZlZCBpbiBsb3cgbGV2ZWwgZGlhZ25vc3RpY3MuCisvLworLy8gRGlhZ25vc3RpY3MgcmVwb3J0aW5nIGlzIHN0aWxsIGRvbmUgYXMgcGFydCBvZiB0aGUgTExWTUNvbnRleHQuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfRElBR05PU1RJQ0lORk9fSAorI2RlZmluZSBMTFZNX0lSX0RJQUdOT1NUSUNJTkZPX0gKKworI2luY2x1ZGUgImxsdm0tYy9UeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGVidWdMb2MuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0JpbmRpbmdXcmFwcGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9ZQU1MVHJhaXRzLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMuCitjbGFzcyBEaWFnbm9zdGljUHJpbnRlcjsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIFNNRGlhZ25vc3RpYzsKKworLy8vIFxicmllZiBEZWZpbmVzIHRoZSBkaWZmZXJlbnQgc3VwcG9ydGVkIHNldmVyaXR5IG9mIGEgZGlhZ25vc3RpYy4KK2VudW0gRGlhZ25vc3RpY1NldmVyaXR5IDogY2hhciB7CisgIERTX0Vycm9yLAorICBEU19XYXJuaW5nLAorICBEU19SZW1hcmssCisgIC8vIEEgbm90ZSBhdHRhY2hlcyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHRvIG9uZSBvZiB0aGUgcHJldmlvdXMgZGlhZ25vc3RpYworICAvLyB0eXBlcy4KKyAgRFNfTm90ZQorfTsKKworLy8vIFxicmllZiBEZWZpbmVzIHRoZSBkaWZmZXJlbnQgc3VwcG9ydGVkIGtpbmQgb2YgYSBkaWFnbm9zdGljLgorLy8vIFRoaXMgZW51bSBzaG91bGQgYmUgZXh0ZW5kZWQgd2l0aCBhIG5ldyBJRCBmb3IgZWFjaCBhZGRlZCBjb25jcmV0ZSBzdWJjbGFzcy4KK2VudW0gRGlhZ25vc3RpY0tpbmQgeworICBES19JbmxpbmVBc20sCisgIERLX1Jlc291cmNlTGltaXQsCisgIERLX1N0YWNrU2l6ZSwKKyAgREtfTGlua2VyLAorICBES19EZWJ1Z01ldGFkYXRhVmVyc2lvbiwKKyAgREtfRGVidWdNZXRhZGF0YUludmFsaWQsCisgIERLX0lTZWxGYWxsYmFjaywKKyAgREtfU2FtcGxlUHJvZmlsZSwKKyAgREtfT3B0aW1pemF0aW9uUmVtYXJrLAorICBES19PcHRpbWl6YXRpb25SZW1hcmtNaXNzZWQsCisgIERLX09wdGltaXphdGlvblJlbWFya0FuYWx5c2lzLAorICBES19PcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpc0ZQQ29tbXV0ZSwKKyAgREtfT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXNBbGlhc2luZywKKyAgREtfT3B0aW1pemF0aW9uRmFpbHVyZSwKKyAgREtfRmlyc3RSZW1hcmsgPSBES19PcHRpbWl6YXRpb25SZW1hcmssCisgIERLX0xhc3RSZW1hcmsgPSBES19PcHRpbWl6YXRpb25GYWlsdXJlLAorICBES19NYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrLAorICBES19NYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrTWlzc2VkLAorICBES19NYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXMsCisgIERLX0ZpcnN0TWFjaGluZVJlbWFyayA9IERLX01hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmssCisgIERLX0xhc3RNYWNoaW5lUmVtYXJrID0gREtfTWFjaGluZU9wdGltaXphdGlvblJlbWFya0FuYWx5c2lzLAorICBES19NSVJQYXJzZXIsCisgIERLX1BHT1Byb2ZpbGUsCisgIERLX1Vuc3VwcG9ydGVkLAorICBES19GaXJzdFBsdWdpbktpbmQKK307CisKKy8vLyBcYnJpZWYgR2V0IHRoZSBuZXh0IGF2YWlsYWJsZSBraW5kIElEIGZvciBhIHBsdWdpbiBkaWFnbm9zdGljLgorLy8vIEVhY2ggdGltZSB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCwgaXQgcmV0dXJucyBhIGRpZmZlcmVudCBudW1iZXIuCisvLy8gVGhlcmVmb3JlLCBhIHBsdWdpbiB0aGF0IHdhbnRzIHRvICJpZGVudGlmeSIgaXRzIG93biBjbGFzc2VzCisvLy8gd2l0aCBhIGR5bmFtaWMgaWRlbnRpZmllciwganVzdCBoYXZlIHRvIHVzZSB0aGlzIG1ldGhvZCB0byBnZXQgYSBuZXcgSUQKKy8vLyBhbmQgYXNzaWduIGl0IHRvIGVhY2ggb2YgaXRzIGNsYXNzZXMuCisvLy8gVGhlIHJldHVybmVkIElEIHdpbGwgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIERLX0ZpcnN0UGx1Z2luS2luZC4KKy8vLyBUaHVzLCB0aGUgcGx1Z2luIGlkZW50aWZpZXJzIHdpbGwgbm90IGNvbmZsaWN0IHdpdGggdGhlCisvLy8gRGlhZ25vc3RpY0tpbmQgdmFsdWVzLgoraW50IGdldE5leHRBdmFpbGFibGVQbHVnaW5EaWFnbm9zdGljS2luZCgpOworCisvLy8gXGJyaWVmIFRoaXMgaXMgdGhlIGJhc2UgYWJzdHJhY3QgY2xhc3MgZm9yIGRpYWdub3N0aWMgcmVwb3J0aW5nIGluCisvLy8gdGhlIGJhY2tlbmQuCisvLy8gVGhlIHByaW50IG1ldGhvZCBtdXN0IGJlIG92ZXJsb2FkZWQgYnkgdGhlIHN1YmNsYXNzZXMgdG8gcHJpbnQgYQorLy8vIHVzZXItZnJpZW5kbHkgbWVzc2FnZSBpbiB0aGUgY2xpZW50IG9mIHRoZSBiYWNrZW5kIChsZXQgdXMgY2FsbCBpdCBhCisvLy8gZnJvbnRlbmQpLgorY2xhc3MgRGlhZ25vc3RpY0luZm8geworcHJpdmF0ZToKKyAgLy8vIEtpbmQgZGVmaW5lcyB0aGUga2luZCBvZiByZXBvcnQgdGhpcyBpcyBhYm91dC4KKyAgY29uc3QgLyogRGlhZ25vc3RpY0tpbmQgKi8gaW50IEtpbmQ7CisgIC8vLyBTZXZlcml0eSBnaXZlcyB0aGUgc2V2ZXJpdHkgb2YgdGhlIGRpYWdub3N0aWMuCisgIGNvbnN0IERpYWdub3N0aWNTZXZlcml0eSBTZXZlcml0eTsKKworcHVibGljOgorICBEaWFnbm9zdGljSW5mbygvKiBEaWFnbm9zdGljS2luZCAqLyBpbnQgS2luZCwgRGlhZ25vc3RpY1NldmVyaXR5IFNldmVyaXR5KQorICAgICAgOiBLaW5kKEtpbmQpLCBTZXZlcml0eShTZXZlcml0eSkge30KKworICB2aXJ0dWFsIH5EaWFnbm9zdGljSW5mbygpID0gZGVmYXVsdDsKKworICAvKiBEaWFnbm9zdGljS2luZCAqLyBpbnQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKyAgRGlhZ25vc3RpY1NldmVyaXR5IGdldFNldmVyaXR5KCkgY29uc3QgeyByZXR1cm4gU2V2ZXJpdHk7IH0KKworICAvLy8gUHJpbnQgdXNpbmcgdGhlIGdpdmVuIFxwIERQIGEgdXNlci1mcmllbmRseSBtZXNzYWdlLgorICAvLy8gVGhpcyBpcyB0aGUgZGVmYXVsdCBtZXNzYWdlIHRoYXQgd2lsbCBiZSBwcmludGVkIHRvIHRoZSB1c2VyLgorICAvLy8gSXQgaXMgdXNlZCB3aGVuIHRoZSBmcm9udGVuZCBkb2VzIG5vdCBkaXJlY3RseSB0YWtlIGFkdmFudGFnZQorICAvLy8gb2YgdGhlIGluZm9ybWF0aW9uIGNvbnRhaW5lZCBpbiBmaWVsZHMgb2YgdGhlIHN1YmNsYXNzZXMuCisgIC8vLyBUaGUgcHJpbnRlZCBtZXNzYWdlIG11c3Qgbm90IGVuZCB3aXRoICcuJyBub3Igc3RhcnQgd2l0aCBhIHNldmVyaXR5CisgIC8vLyBrZXl3b3JkLgorICB2aXJ0dWFsIHZvaWQgcHJpbnQoRGlhZ25vc3RpY1ByaW50ZXIgJkRQKSBjb25zdCA9IDA7Cit9OworCit1c2luZyBEaWFnbm9zdGljSGFuZGxlckZ1bmN0aW9uID0gc3RkOjpmdW5jdGlvbjx2b2lkKGNvbnN0IERpYWdub3N0aWNJbmZvICYpPjsKKworLy8vIERpYWdub3N0aWMgaW5mb3JtYXRpb24gZm9yIGlubGluZSBhc20gcmVwb3J0aW5nLgorLy8vIFRoaXMgaXMgYmFzaWNhbGx5IGEgbWVzc2FnZSBhbmQgYW4gb3B0aW9uYWwgbG9jYXRpb24uCitjbGFzcyBEaWFnbm9zdGljSW5mb0lubGluZUFzbSA6IHB1YmxpYyBEaWFnbm9zdGljSW5mbyB7Citwcml2YXRlOgorICAvLy8gT3B0aW9uYWwgbGluZSBpbmZvcm1hdGlvbi4gMCBpZiBub3Qgc2V0LgorICB1bnNpZ25lZCBMb2NDb29raWUgPSAwOworICAvLy8gTWVzc2FnZSB0byBiZSByZXBvcnRlZC4KKyAgY29uc3QgVHdpbmUgJk1zZ1N0cjsKKyAgLy8vIE9wdGlvbmFsIG9yaWdpbiBvZiB0aGUgcHJvYmxlbS4KKyAgY29uc3QgSW5zdHJ1Y3Rpb24gKkluc3RyID0gbnVsbHB0cjsKKworcHVibGljOgorICAvLy8gXHAgTXNnU3RyIGlzIHRoZSBtZXNzYWdlIHRvIGJlIHJlcG9ydGVkIHRvIHRoZSBmcm9udGVuZC4KKyAgLy8vIFRoaXMgY2xhc3MgZG9lcyBub3QgY29weSBccCBNc2dTdHIsIHRoZXJlZm9yZSB0aGUgcmVmZXJlbmNlIG11c3QgYmUgdmFsaWQKKyAgLy8vIGZvciB0aGUgd2hvbGUgbGlmZSB0aW1lIG9mIHRoZSBEaWFnbm9zdGljLgorICBEaWFnbm9zdGljSW5mb0lubGluZUFzbShjb25zdCBUd2luZSAmTXNnU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljU2V2ZXJpdHkgU2V2ZXJpdHkgPSBEU19FcnJvcikKKyAgICAgIDogRGlhZ25vc3RpY0luZm8oREtfSW5saW5lQXNtLCBTZXZlcml0eSksIE1zZ1N0cihNc2dTdHIpIHt9CisKKyAgLy8vIFxwIExvY0Nvb2tpZSBpZiBub24temVybyBnaXZlcyB0aGUgbGluZSBudW1iZXIgZm9yIHRoaXMgcmVwb3J0LgorICAvLy8gXHAgTXNnU3RyIGdpdmVzIHRoZSBtZXNzYWdlLgorICAvLy8gVGhpcyBjbGFzcyBkb2VzIG5vdCBjb3B5IFxwIE1zZ1N0ciwgdGhlcmVmb3JlIHRoZSByZWZlcmVuY2UgbXVzdCBiZSB2YWxpZAorICAvLy8gZm9yIHRoZSB3aG9sZSBsaWZlIHRpbWUgb2YgdGhlIERpYWdub3N0aWMuCisgIERpYWdub3N0aWNJbmZvSW5saW5lQXNtKHVuc2lnbmVkIExvY0Nvb2tpZSwgY29uc3QgVHdpbmUgJk1zZ1N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY1NldmVyaXR5IFNldmVyaXR5ID0gRFNfRXJyb3IpCisgICAgICA6IERpYWdub3N0aWNJbmZvKERLX0lubGluZUFzbSwgU2V2ZXJpdHkpLCBMb2NDb29raWUoTG9jQ29va2llKSwKKyAgICAgICAgTXNnU3RyKE1zZ1N0cikge30KKworICAvLy8gXHAgSW5zdHIgZ2l2ZXMgdGhlIG9yaWdpbmFsIGluc3RydWN0aW9uIHRoYXQgdHJpZ2dlcmVkIHRoZSBkaWFnbm9zdGljLgorICAvLy8gXHAgTXNnU3RyIGdpdmVzIHRoZSBtZXNzYWdlLgorICAvLy8gVGhpcyBjbGFzcyBkb2VzIG5vdCBjb3B5IFxwIE1zZ1N0ciwgdGhlcmVmb3JlIHRoZSByZWZlcmVuY2UgbXVzdCBiZSB2YWxpZAorICAvLy8gZm9yIHRoZSB3aG9sZSBsaWZlIHRpbWUgb2YgdGhlIERpYWdub3N0aWMuCisgIC8vLyBTYW1lIGZvciBccCBJLgorICBEaWFnbm9zdGljSW5mb0lubGluZUFzbShjb25zdCBJbnN0cnVjdGlvbiAmSSwgY29uc3QgVHdpbmUgJk1zZ1N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY1NldmVyaXR5IFNldmVyaXR5ID0gRFNfRXJyb3IpOworCisgIHVuc2lnbmVkIGdldExvY0Nvb2tpZSgpIGNvbnN0IHsgcmV0dXJuIExvY0Nvb2tpZTsgfQorICBjb25zdCBUd2luZSAmZ2V0TXNnU3RyKCkgY29uc3QgeyByZXR1cm4gTXNnU3RyOyB9CisgIGNvbnN0IEluc3RydWN0aW9uICpnZXRJbnN0cnVjdGlvbigpIGNvbnN0IHsgcmV0dXJuIEluc3RyOyB9CisKKyAgLy8vIFxzZWUgRGlhZ25vc3RpY0luZm86OnByaW50LgorICB2b2lkIHByaW50KERpYWdub3N0aWNQcmludGVyICZEUCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEaWFnbm9zdGljSW5mbyAqREkpIHsKKyAgICByZXR1cm4gREktPmdldEtpbmQoKSA9PSBES19JbmxpbmVBc207CisgIH0KK307CisKKy8vLyBEaWFnbm9zdGljIGluZm9ybWF0aW9uIGZvciBzdGFjayBzaXplIGV0Yy4gcmVwb3J0aW5nLgorLy8vIFRoaXMgaXMgYmFzaWNhbGx5IGEgZnVuY3Rpb24gYW5kIGEgc2l6ZS4KK2NsYXNzIERpYWdub3N0aWNJbmZvUmVzb3VyY2VMaW1pdCA6IHB1YmxpYyBEaWFnbm9zdGljSW5mbyB7Citwcml2YXRlOgorICAvLy8gVGhlIGZ1bmN0aW9uIHRoYXQgaXMgY29uY2VybmVkIGJ5IHRoaXMgcmVzb3VyY2UgbGltaXQgZGlhZ25vc3RpYy4KKyAgY29uc3QgRnVuY3Rpb24gJkZuOworCisgIC8vLyBEZXNjcmlwdGlvbiBvZiB0aGUgcmVzb3VyY2UgdHlwZSAoZS5nLiBzdGFjayBzaXplKQorICBjb25zdCBjaGFyICpSZXNvdXJjZU5hbWU7CisKKyAgLy8vIFRoZSBjb21wdXRlZCBzaXplIHVzYWdlCisgIHVpbnQ2NF90IFJlc291cmNlU2l6ZTsKKworICAvLyBUaHJlc2hvdWxkIHBhc3NlZAorICB1aW50NjRfdCBSZXNvdXJjZUxpbWl0OworCitwdWJsaWM6CisgIC8vLyBccCBUaGUgZnVuY3Rpb24gdGhhdCBpcyBjb25jZXJuZWQgYnkgdGhpcyBzdGFjayBzaXplIGRpYWdub3N0aWMuCisgIC8vLyBccCBUaGUgY29tcHV0ZWQgc3RhY2sgc2l6ZS4KKyAgRGlhZ25vc3RpY0luZm9SZXNvdXJjZUxpbWl0KGNvbnN0IEZ1bmN0aW9uICZGbiwgY29uc3QgY2hhciAqUmVzb3VyY2VOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgUmVzb3VyY2VTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY1NldmVyaXR5IFNldmVyaXR5ID0gRFNfV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNLaW5kIEtpbmQgPSBES19SZXNvdXJjZUxpbWl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgUmVzb3VyY2VMaW1pdCA9IDApCisgICAgICA6IERpYWdub3N0aWNJbmZvKEtpbmQsIFNldmVyaXR5KSwgRm4oRm4pLCBSZXNvdXJjZU5hbWUoUmVzb3VyY2VOYW1lKSwKKyAgICAgICAgUmVzb3VyY2VTaXplKFJlc291cmNlU2l6ZSksIFJlc291cmNlTGltaXQoUmVzb3VyY2VMaW1pdCkge30KKworICBjb25zdCBGdW5jdGlvbiAmZ2V0RnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBGbjsgfQorICBjb25zdCBjaGFyICpnZXRSZXNvdXJjZU5hbWUoKSBjb25zdCB7IHJldHVybiBSZXNvdXJjZU5hbWU7IH0KKyAgdWludDY0X3QgZ2V0UmVzb3VyY2VTaXplKCkgY29uc3QgeyByZXR1cm4gUmVzb3VyY2VTaXplOyB9CisgIHVpbnQ2NF90IGdldFJlc291cmNlTGltaXQoKSBjb25zdCB7IHJldHVybiBSZXNvdXJjZUxpbWl0OyB9CisKKyAgLy8vIFxzZWUgRGlhZ25vc3RpY0luZm86OnByaW50LgorICB2b2lkIHByaW50KERpYWdub3N0aWNQcmludGVyICZEUCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEaWFnbm9zdGljSW5mbyAqREkpIHsKKyAgICByZXR1cm4gREktPmdldEtpbmQoKSA9PSBES19SZXNvdXJjZUxpbWl0IHx8IERJLT5nZXRLaW5kKCkgPT0gREtfU3RhY2tTaXplOworICB9Cit9OworCitjbGFzcyBEaWFnbm9zdGljSW5mb1N0YWNrU2l6ZSA6IHB1YmxpYyBEaWFnbm9zdGljSW5mb1Jlc291cmNlTGltaXQgeworcHVibGljOgorICBEaWFnbm9zdGljSW5mb1N0YWNrU2l6ZShjb25zdCBGdW5jdGlvbiAmRm4sIHVpbnQ2NF90IFN0YWNrU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgRGlhZ25vc3RpY1NldmVyaXR5IFNldmVyaXR5ID0gRFNfV2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU3RhY2tMaW1pdCA9IDApCisgICAgICA6IERpYWdub3N0aWNJbmZvUmVzb3VyY2VMaW1pdChGbiwgInN0YWNrIHNpemUiLCBTdGFja1NpemUsIFNldmVyaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREtfU3RhY2tTaXplLCBTdGFja0xpbWl0KSB7fQorCisgIHVpbnQ2NF90IGdldFN0YWNrU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGdldFJlc291cmNlU2l6ZSgpOyB9CisgIHVpbnQ2NF90IGdldFN0YWNrTGltaXQoKSBjb25zdCB7IHJldHVybiBnZXRSZXNvdXJjZUxpbWl0KCk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERpYWdub3N0aWNJbmZvICpESSkgeworICAgIHJldHVybiBESS0+Z2V0S2luZCgpID09IERLX1N0YWNrU2l6ZTsKKyAgfQorfTsKKworLy8vIERpYWdub3N0aWMgaW5mb3JtYXRpb24gZm9yIGRlYnVnIG1ldGFkYXRhIHZlcnNpb24gcmVwb3J0aW5nLgorLy8vIFRoaXMgaXMgYmFzaWNhbGx5IGEgbW9kdWxlIGFuZCBhIHZlcnNpb24uCitjbGFzcyBEaWFnbm9zdGljSW5mb0RlYnVnTWV0YWRhdGFWZXJzaW9uIDogcHVibGljIERpYWdub3N0aWNJbmZvIHsKK3ByaXZhdGU6CisgIC8vLyBUaGUgbW9kdWxlIHRoYXQgaXMgY29uY2VybmVkIGJ5IHRoaXMgZGVidWcgbWV0YWRhdGEgdmVyc2lvbiBkaWFnbm9zdGljLgorICBjb25zdCBNb2R1bGUgJk07CisgIC8vLyBUaGUgYWN0dWFsIG1ldGFkYXRhIHZlcnNpb24uCisgIHVuc2lnbmVkIE1ldGFkYXRhVmVyc2lvbjsKKworcHVibGljOgorICAvLy8gXHAgVGhlIG1vZHVsZSB0aGF0IGlzIGNvbmNlcm5lZCBieSB0aGlzIGRlYnVnIG1ldGFkYXRhIHZlcnNpb24gZGlhZ25vc3RpYy4KKyAgLy8vIFxwIFRoZSBhY3R1YWwgbWV0YWRhdGEgdmVyc2lvbi4KKyAgRGlhZ25vc3RpY0luZm9EZWJ1Z01ldGFkYXRhVmVyc2lvbihjb25zdCBNb2R1bGUgJk0sIHVuc2lnbmVkIE1ldGFkYXRhVmVyc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljU2V2ZXJpdHkgU2V2ZXJpdHkgPSBEU19XYXJuaW5nKQorICAgICAgOiBEaWFnbm9zdGljSW5mbyhES19EZWJ1Z01ldGFkYXRhVmVyc2lvbiwgU2V2ZXJpdHkpLCBNKE0pLAorICAgICAgICBNZXRhZGF0YVZlcnNpb24oTWV0YWRhdGFWZXJzaW9uKSB7fQorCisgIGNvbnN0IE1vZHVsZSAmZ2V0TW9kdWxlKCkgY29uc3QgeyByZXR1cm4gTTsgfQorICB1bnNpZ25lZCBnZXRNZXRhZGF0YVZlcnNpb24oKSBjb25zdCB7IHJldHVybiBNZXRhZGF0YVZlcnNpb247IH0KKworICAvLy8gXHNlZSBEaWFnbm9zdGljSW5mbzo6cHJpbnQuCisgIHZvaWQgcHJpbnQoRGlhZ25vc3RpY1ByaW50ZXIgJkRQKSBjb25zdCBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERpYWdub3N0aWNJbmZvICpESSkgeworICAgIHJldHVybiBESS0+Z2V0S2luZCgpID09IERLX0RlYnVnTWV0YWRhdGFWZXJzaW9uOworICB9Cit9OworCisvLy8gRGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBmb3Igc3RyaXBwaW5nIGludmFsaWQgZGVidWcgbWV0YWRhdGEuCitjbGFzcyBEaWFnbm9zdGljSW5mb0lnbm9yaW5nSW52YWxpZERlYnVnTWV0YWRhdGEgOiBwdWJsaWMgRGlhZ25vc3RpY0luZm8geworcHJpdmF0ZToKKyAgLy8vIFRoZSBtb2R1bGUgdGhhdCBpcyBjb25jZXJuZWQgYnkgdGhpcyBkZWJ1ZyBtZXRhZGF0YSB2ZXJzaW9uIGRpYWdub3N0aWMuCisgIGNvbnN0IE1vZHVsZSAmTTsKKworcHVibGljOgorICAvLy8gXHAgVGhlIG1vZHVsZSB0aGF0IGlzIGNvbmNlcm5lZCBieSB0aGlzIGRlYnVnIG1ldGFkYXRhIHZlcnNpb24gZGlhZ25vc3RpYy4KKyAgRGlhZ25vc3RpY0luZm9JZ25vcmluZ0ludmFsaWREZWJ1Z01ldGFkYXRhKAorICAgICAgY29uc3QgTW9kdWxlICZNLCBEaWFnbm9zdGljU2V2ZXJpdHkgU2V2ZXJpdHkgPSBEU19XYXJuaW5nKQorICAgICAgOiBEaWFnbm9zdGljSW5mbyhES19EZWJ1Z01ldGFkYXRhVmVyc2lvbiwgU2V2ZXJpdHkpLCBNKE0pIHt9CisKKyAgY29uc3QgTW9kdWxlICZnZXRNb2R1bGUoKSBjb25zdCB7IHJldHVybiBNOyB9CisKKyAgLy8vIFxzZWUgRGlhZ25vc3RpY0luZm86OnByaW50LgorICB2b2lkIHByaW50KERpYWdub3N0aWNQcmludGVyICZEUCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEaWFnbm9zdGljSW5mbyAqREkpIHsKKyAgICByZXR1cm4gREktPmdldEtpbmQoKSA9PSBES19EZWJ1Z01ldGFkYXRhSW52YWxpZDsKKyAgfQorfTsKKworLy8vIERpYWdub3N0aWMgaW5mb3JtYXRpb24gZm9yIHRoZSBzYW1wbGUgcHJvZmlsZXIuCitjbGFzcyBEaWFnbm9zdGljSW5mb1NhbXBsZVByb2ZpbGUgOiBwdWJsaWMgRGlhZ25vc3RpY0luZm8geworcHVibGljOgorICBEaWFnbm9zdGljSW5mb1NhbXBsZVByb2ZpbGUoU3RyaW5nUmVmIEZpbGVOYW1lLCB1bnNpZ25lZCBMaW5lTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNTZXZlcml0eSBTZXZlcml0eSA9IERTX0Vycm9yKQorICAgICAgOiBEaWFnbm9zdGljSW5mbyhES19TYW1wbGVQcm9maWxlLCBTZXZlcml0eSksIEZpbGVOYW1lKEZpbGVOYW1lKSwKKyAgICAgICAgTGluZU51bShMaW5lTnVtKSwgTXNnKE1zZykge30KKyAgRGlhZ25vc3RpY0luZm9TYW1wbGVQcm9maWxlKFN0cmluZ1JlZiBGaWxlTmFtZSwgY29uc3QgVHdpbmUgJk1zZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpYWdub3N0aWNTZXZlcml0eSBTZXZlcml0eSA9IERTX0Vycm9yKQorICAgICAgOiBEaWFnbm9zdGljSW5mbyhES19TYW1wbGVQcm9maWxlLCBTZXZlcml0eSksIEZpbGVOYW1lKEZpbGVOYW1lKSwKKyAgICAgICAgTXNnKE1zZykge30KKyAgRGlhZ25vc3RpY0luZm9TYW1wbGVQcm9maWxlKGNvbnN0IFR3aW5lICZNc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljU2V2ZXJpdHkgU2V2ZXJpdHkgPSBEU19FcnJvcikKKyAgICAgIDogRGlhZ25vc3RpY0luZm8oREtfU2FtcGxlUHJvZmlsZSwgU2V2ZXJpdHkpLCBNc2coTXNnKSB7fQorCisgIC8vLyBcc2VlIERpYWdub3N0aWNJbmZvOjpwcmludC4KKyAgdm9pZCBwcmludChEaWFnbm9zdGljUHJpbnRlciAmRFApIGNvbnN0IG92ZXJyaWRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGlhZ25vc3RpY0luZm8gKkRJKSB7CisgICAgcmV0dXJuIERJLT5nZXRLaW5kKCkgPT0gREtfU2FtcGxlUHJvZmlsZTsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRGaWxlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIEZpbGVOYW1lOyB9CisgIHVuc2lnbmVkIGdldExpbmVOdW0oKSBjb25zdCB7IHJldHVybiBMaW5lTnVtOyB9CisgIGNvbnN0IFR3aW5lICZnZXRNc2coKSBjb25zdCB7IHJldHVybiBNc2c7IH0KKworcHJpdmF0ZToKKyAgLy8vIE5hbWUgb2YgdGhlIGlucHV0IGZpbGUgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZGlhZ25vc3RpYy4KKyAgU3RyaW5nUmVmIEZpbGVOYW1lOworCisgIC8vLyBMaW5lIG51bWJlciB3aGVyZSB0aGUgZGlhZ25vc3RpYyBvY2N1cnJlZC4gSWYgMCwgbm8gbGluZSBudW1iZXIgd2lsbAorICAvLy8gYmUgZW1pdHRlZCBpbiB0aGUgbWVzc2FnZS4KKyAgdW5zaWduZWQgTGluZU51bSA9IDA7CisKKyAgLy8vIE1lc3NhZ2UgdG8gcmVwb3J0LgorICBjb25zdCBUd2luZSAmTXNnOworfTsKKworLy8vIERpYWdub3N0aWMgaW5mb3JtYXRpb24gZm9yIHRoZSBQR08gcHJvZmlsZXIuCitjbGFzcyBEaWFnbm9zdGljSW5mb1BHT1Byb2ZpbGUgOiBwdWJsaWMgRGlhZ25vc3RpY0luZm8geworcHVibGljOgorICBEaWFnbm9zdGljSW5mb1BHT1Byb2ZpbGUoY29uc3QgY2hhciAqRmlsZU5hbWUsIGNvbnN0IFR3aW5lICZNc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljU2V2ZXJpdHkgU2V2ZXJpdHkgPSBEU19FcnJvcikKKyAgICAgIDogRGlhZ25vc3RpY0luZm8oREtfUEdPUHJvZmlsZSwgU2V2ZXJpdHkpLCBGaWxlTmFtZShGaWxlTmFtZSksIE1zZyhNc2cpIHt9CisKKyAgLy8vIFxzZWUgRGlhZ25vc3RpY0luZm86OnByaW50LgorICB2b2lkIHByaW50KERpYWdub3N0aWNQcmludGVyICZEUCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEaWFnbm9zdGljSW5mbyAqREkpIHsKKyAgICByZXR1cm4gREktPmdldEtpbmQoKSA9PSBES19QR09Qcm9maWxlOworICB9CisKKyAgY29uc3QgY2hhciAqZ2V0RmlsZU5hbWUoKSBjb25zdCB7IHJldHVybiBGaWxlTmFtZTsgfQorICBjb25zdCBUd2luZSAmZ2V0TXNnKCkgY29uc3QgeyByZXR1cm4gTXNnOyB9CisKK3ByaXZhdGU6CisgIC8vLyBOYW1lIG9mIHRoZSBpbnB1dCBmaWxlIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGRpYWdub3N0aWMuCisgIGNvbnN0IGNoYXIgKkZpbGVOYW1lOworCisgIC8vLyBNZXNzYWdlIHRvIHJlcG9ydC4KKyAgY29uc3QgVHdpbmUgJk1zZzsKK307CisKK2NsYXNzIERpYWdub3N0aWNMb2NhdGlvbiB7CisgIFN0cmluZ1JlZiBGaWxlbmFtZTsKKyAgdW5zaWduZWQgTGluZSA9IDA7CisgIHVuc2lnbmVkIENvbHVtbiA9IDA7CisKK3B1YmxpYzoKKyAgRGlhZ25vc3RpY0xvY2F0aW9uKCkgPSBkZWZhdWx0OworICBEaWFnbm9zdGljTG9jYXRpb24oY29uc3QgRGVidWdMb2MgJkRMKTsKKyAgRGlhZ25vc3RpY0xvY2F0aW9uKGNvbnN0IERJU3VicHJvZ3JhbSAqU1ApOworCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuICFGaWxlbmFtZS5lbXB0eSgpOyB9CisgIFN0cmluZ1JlZiBnZXRGaWxlbmFtZSgpIGNvbnN0IHsgcmV0dXJuIEZpbGVuYW1lOyB9CisgIHVuc2lnbmVkIGdldExpbmUoKSBjb25zdCB7IHJldHVybiBMaW5lOyB9CisgIHVuc2lnbmVkIGdldENvbHVtbigpIGNvbnN0IHsgcmV0dXJuIENvbHVtbjsgfQorfTsKKworLy8vIENvbW1vbiBmZWF0dXJlcyBmb3IgZGlhZ25vc3RpY3Mgd2l0aCBhbiBhc3NvY2lhdGVkIGxvY2F0aW9uLgorY2xhc3MgRGlhZ25vc3RpY0luZm9XaXRoTG9jYXRpb25CYXNlIDogcHVibGljIERpYWdub3N0aWNJbmZvIHsKK3B1YmxpYzoKKyAgLy8vIFxwIEZuIGlzIHRoZSBmdW5jdGlvbiB3aGVyZSB0aGUgZGlhZ25vc3RpYyBpcyBiZWluZyBlbWl0dGVkLiBccCBMb2MgaXMKKyAgLy8vIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byB1c2UgaW4gdGhlIGRpYWdub3N0aWMuCisgIERpYWdub3N0aWNJbmZvV2l0aExvY2F0aW9uQmFzZShlbnVtIERpYWdub3N0aWNLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIERpYWdub3N0aWNTZXZlcml0eSBTZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uICZGbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWNMb2NhdGlvbiAmTG9jKQorICAgICAgOiBEaWFnbm9zdGljSW5mbyhLaW5kLCBTZXZlcml0eSksIEZuKEZuKSwgTG9jKExvYykge30KKworICAvLy8gUmV0dXJuIHRydWUgaWYgbG9jYXRpb24gaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlIGZvciB0aGlzIGRpYWdub3N0aWMuCisgIGJvb2wgaXNMb2NhdGlvbkF2YWlsYWJsZSgpIGNvbnN0IHsgcmV0dXJuIExvYy5pc1ZhbGlkKCk7IH0KKworICAvLy8gUmV0dXJuIGEgc3RyaW5nIHdpdGggdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGlzIGRpYWdub3N0aWMKKyAgLy8vIGluIHRoZSBmb3JtYXQgImZpbGU6bGluZTpjb2wiLiBJZiBsb2NhdGlvbiBpbmZvcm1hdGlvbiBpcyBub3QgYXZhaWxhYmxlLAorICAvLy8gaXQgcmV0dXJucyAiPHVua25vd24+OjA6MCIuCisgIGNvbnN0IHN0ZDo6c3RyaW5nIGdldExvY2F0aW9uU3RyKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhpcyBkaWFnbm9zdGljIGluIHRocmVlIHBhcnRzOgorICAvLy8gdGhlIHNvdXJjZSBmaWxlIG5hbWUsIGxpbmUgbnVtYmVyIGFuZCBjb2x1bW4uCisgIHZvaWQgZ2V0TG9jYXRpb24oU3RyaW5nUmVmICpGaWxlbmFtZSwgdW5zaWduZWQgKkxpbmUsIHVuc2lnbmVkICpDb2x1bW4pIGNvbnN0OworCisgIGNvbnN0IEZ1bmN0aW9uICZnZXRGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIEZuOyB9CisgIERpYWdub3N0aWNMb2NhdGlvbiBnZXRMb2NhdGlvbigpIGNvbnN0IHsgcmV0dXJuIExvYzsgfQorCitwcml2YXRlOgorICAvLy8gRnVuY3Rpb24gd2hlcmUgdGhpcyBkaWFnbm9zdGljIGlzIHRyaWdnZXJlZC4KKyAgY29uc3QgRnVuY3Rpb24gJkZuOworCisgIC8vLyBEZWJ1ZyBsb2NhdGlvbiB3aGVyZSB0aGlzIGRpYWdub3N0aWMgaXMgdHJpZ2dlcmVkLgorICBEaWFnbm9zdGljTG9jYXRpb24gTG9jOworfTsKKworLy8vIFxicmllZiBDb21tb24gZmVhdHVyZXMgZm9yIGRpYWdub3N0aWNzIGRlYWxpbmcgd2l0aCBvcHRpbWl6YXRpb24gcmVtYXJrcworLy8vIHRoYXQgYXJlIHVzZWQgYnkgYm90aCBJUiBhbmQgTUlSIHBhc3Nlcy4KK2NsYXNzIERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZSA6IHB1YmxpYyBEaWFnbm9zdGljSW5mb1dpdGhMb2NhdGlvbkJhc2UgeworcHVibGljOgorICAvLy8gXGJyaWVmIFVzZWQgdG8gc2V0IElzVmVyYm9zZSB2aWEgdGhlIHN0cmVhbSBpbnRlcmZhY2UuCisgIHN0cnVjdCBzZXRJc1ZlcmJvc2Uge307CisKKyAgLy8vIFxicmllZiBXaGVuIGFuIGluc3RhbmNlIG9mIHRoaXMgaXMgaW5zZXJ0ZWQgaW50byB0aGUgc3RyZWFtLCB0aGUgYXJndW1lbnRzCisgIC8vLyBmb2xsb3dpbmcgd2lsbCBub3QgYXBwZWFyIGluIHRoZSByZW1hcmsgcHJpbnRlZCBpbiB0aGUgY29tcGlsZXIgb3V0cHV0CisgIC8vLyAoLVJwYXNzKSBidXQgb25seSBpbiB0aGUgb3B0aW1pemF0aW9uIHJlY29yZCBmaWxlCisgIC8vLyAoLWZzYXZlLW9wdGltaXphdGlvbi1yZWNvcmQpLgorICBzdHJ1Y3Qgc2V0RXh0cmFBcmdzIHt9OworCisgIC8vLyBcYnJpZWYgVXNlZCBpbiB0aGUgc3RyZWFtaW5nIGludGVyZmFjZSBhcyB0aGUgZ2VuZXJhbCBhcmd1bWVudCB0eXBlLiAgSXQKKyAgLy8vIGludGVybmFsbHkgY29udmVydHMgZXZlcnl0aGluZyBpbnRvIGEga2V5LXZhbHVlIHBhaXIuCisgIHN0cnVjdCBBcmd1bWVudCB7CisgICAgc3RkOjpzdHJpbmcgS2V5OworICAgIHN0ZDo6c3RyaW5nIFZhbDsKKyAgICAvLyBJZiBzZXQsIHRoZSBkZWJ1ZyBsb2NhdGlvbiBjb3JyZXNwb25kaW5nIHRvIHRoZSB2YWx1ZS4KKyAgICBEaWFnbm9zdGljTG9jYXRpb24gTG9jOworCisgICAgZXhwbGljaXQgQXJndW1lbnQoU3RyaW5nUmVmIFN0ciA9ICIiKSA6IEtleSgiU3RyaW5nIiksIFZhbChTdHIpIHt9CisgICAgQXJndW1lbnQoU3RyaW5nUmVmIEtleSwgY29uc3QgVmFsdWUgKlYpOworICAgIEFyZ3VtZW50KFN0cmluZ1JlZiBLZXksIGNvbnN0IFR5cGUgKlQpOworICAgIEFyZ3VtZW50KFN0cmluZ1JlZiBLZXksIFN0cmluZ1JlZiBTKTsKKyAgICBBcmd1bWVudChTdHJpbmdSZWYgS2V5LCBpbnQgTik7CisgICAgQXJndW1lbnQoU3RyaW5nUmVmIEtleSwgZmxvYXQgTik7CisgICAgQXJndW1lbnQoU3RyaW5nUmVmIEtleSwgbG9uZyBOKTsKKyAgICBBcmd1bWVudChTdHJpbmdSZWYgS2V5LCBsb25nIGxvbmcgTik7CisgICAgQXJndW1lbnQoU3RyaW5nUmVmIEtleSwgdW5zaWduZWQgTik7CisgICAgQXJndW1lbnQoU3RyaW5nUmVmIEtleSwgdW5zaWduZWQgbG9uZyBOKTsKKyAgICBBcmd1bWVudChTdHJpbmdSZWYgS2V5LCB1bnNpZ25lZCBsb25nIGxvbmcgTik7CisgICAgQXJndW1lbnQoU3RyaW5nUmVmIEtleSwgYm9vbCBCKSA6IEtleShLZXkpLCBWYWwoQiA/ICJ0cnVlIiA6ICJmYWxzZSIpIHt9CisgICAgQXJndW1lbnQoU3RyaW5nUmVmIEtleSwgRGVidWdMb2MgZGwpOworICB9OworCisgIC8vLyBccCBQYXNzTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFzcyBlbWl0dGluZyB0aGlzIGRpYWdub3N0aWMuIFxwCisgIC8vLyBSZW1hcmtOYW1lIGlzIGEgdGV4dHVhbCBpZGVudGlmaWVyIGZvciB0aGUgcmVtYXJrIChzaW5nbGUtd29yZCwKKyAgLy8vIGNhbWVsLWNhc2UpLiBccCBGbiBpcyB0aGUgZnVuY3Rpb24gd2hlcmUgdGhlIGRpYWdub3N0aWMgaXMgYmVpbmcgZW1pdHRlZC4KKyAgLy8vIFxwIExvYyBpcyB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gdXNlIGluIHRoZSBkaWFnbm9zdGljLiBJZiBsaW5lIHRhYmxlCisgIC8vLyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUsIHRoZSBkaWFnbm9zdGljIHdpbGwgaW5jbHVkZSB0aGUgc291cmNlIGNvZGUKKyAgLy8vIGxvY2F0aW9uLgorICBEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2UoZW51bSBEaWFnbm9zdGljS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBEaWFnbm9zdGljU2V2ZXJpdHkgU2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpQYXNzTmFtZSwgU3RyaW5nUmVmIFJlbWFya05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbiAmRm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljTG9jYXRpb24gJkxvYykKKyAgICAgIDogRGlhZ25vc3RpY0luZm9XaXRoTG9jYXRpb25CYXNlKEtpbmQsIFNldmVyaXR5LCBGbiwgTG9jKSwKKyAgICAgICAgUGFzc05hbWUoUGFzc05hbWUpLCBSZW1hcmtOYW1lKFJlbWFya05hbWUpIHt9CisKKyAgdm9pZCBpbnNlcnQoU3RyaW5nUmVmIFMpOworICB2b2lkIGluc2VydChBcmd1bWVudCBBKTsKKyAgdm9pZCBpbnNlcnQoc2V0SXNWZXJib3NlIFYpOworICB2b2lkIGluc2VydChzZXRFeHRyYUFyZ3MgRUEpOworCisgIC8vLyBcc2VlIERpYWdub3N0aWNJbmZvOjpwcmludC4KKyAgdm9pZCBwcmludChEaWFnbm9zdGljUHJpbnRlciAmRFApIGNvbnN0IG92ZXJyaWRlOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG9wdGltaXphdGlvbiByZW1hcmsgaXMgZW5hYmxlZCBieSBvbmUgb2YKKyAgLy8vIG9mIHRoZSBMTFZNIGNvbW1hbmQgbGluZSBmbGFncyAoLXBhc3MtcmVtYXJrcywgLXBhc3MtcmVtYXJrcy1taXNzZWQsCisgIC8vLyBvciAtcGFzcy1yZW1hcmtzLWFuYWx5c2lzKS4gTm90ZSB0aGF0IHRoaXMgb25seSBoYW5kbGVzIHRoZSBMTFZNCisgIC8vLyBmbGFncy4gV2UgY2Fubm90IGFjY2VzcyBDbGFuZyBmbGFncyBmcm9tIGhlcmUgKHRoZXkgYXJlIGhhbmRsZWQKKyAgLy8vIGluIEJhY2tlbmRDb25zdW1lcjo6T3B0aW1pemF0aW9uUmVtYXJrSGFuZGxlcikuCisgIHZpcnR1YWwgYm9vbCBpc0VuYWJsZWQoKSBjb25zdCA9IDA7CisKKyAgU3RyaW5nUmVmIGdldFBhc3NOYW1lKCkgY29uc3QgeyByZXR1cm4gUGFzc05hbWU7IH0KKyAgc3RkOjpzdHJpbmcgZ2V0TXNnKCkgY29uc3Q7CisgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRIb3RuZXNzKCkgY29uc3QgeyByZXR1cm4gSG90bmVzczsgfQorICB2b2lkIHNldEhvdG5lc3MoT3B0aW9uYWw8dWludDY0X3Q+IEgpIHsgSG90bmVzcyA9IEg7IH0KKworICBib29sIGlzVmVyYm9zZSgpIGNvbnN0IHsgcmV0dXJuIElzVmVyYm9zZTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGlhZ25vc3RpY0luZm8gKkRJKSB7CisgICAgcmV0dXJuIChESS0+Z2V0S2luZCgpID49IERLX0ZpcnN0UmVtYXJrICYmCisgICAgICAgICAgICBESS0+Z2V0S2luZCgpIDw9IERLX0xhc3RSZW1hcmspIHx8CisgICAgICAgICAgIChESS0+Z2V0S2luZCgpID49IERLX0ZpcnN0TWFjaGluZVJlbWFyayAmJgorICAgICAgICAgICAgREktPmdldEtpbmQoKSA8PSBES19MYXN0TWFjaGluZVJlbWFyayk7CisgIH0KKworICBib29sIGlzUGFzc2VkKCkgY29uc3QgeworICAgIHJldHVybiAoZ2V0S2luZCgpID09IERLX09wdGltaXphdGlvblJlbWFyayB8fAorICAgICAgICAgICAgZ2V0S2luZCgpID09IERLX01hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmspOworICB9CisKKyAgYm9vbCBpc01pc3NlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdldEtpbmQoKSA9PSBES19PcHRpbWl6YXRpb25SZW1hcmtNaXNzZWQgfHwKKyAgICAgICAgICAgIGdldEtpbmQoKSA9PSBES19NYWNoaW5lT3B0aW1pemF0aW9uUmVtYXJrTWlzc2VkKTsKKyAgfQorCisgIGJvb2wgaXNBbmFseXNpcygpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdldEtpbmQoKSA9PSBES19PcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpcyB8fAorICAgICAgICAgICAgZ2V0S2luZCgpID09IERLX01hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpcyk7CisgIH0KKworcHJvdGVjdGVkOgorICAvLy8gTmFtZSBvZiB0aGUgcGFzcyB0aGF0IHRyaWdnZXJzIHRoaXMgcmVwb3J0LiBJZiB0aGlzIG1hdGNoZXMgdGhlCisgIC8vLyByZWd1bGFyIGV4cHJlc3Npb24gZ2l2ZW4gaW4gLVJwYXNzPXJlZ2V4cCwgdGhlbiB0aGUgcmVtYXJrIHdpbGwKKyAgLy8vIGJlIGVtaXR0ZWQuCisgIGNvbnN0IGNoYXIgKlBhc3NOYW1lOworCisgIC8vLyBUZXh0dWFsIGlkZW50aWZpZXIgZm9yIHRoZSByZW1hcmsgKHNpbmdsZS13b3JkLCBjYW1lbC1jYXNlKS4gQ2FuIGJlIHVzZWQKKyAgLy8vIGJ5IGV4dGVybmFsIHRvb2xzIHJlYWRpbmcgdGhlIFlBTUwgb3V0cHV0IGZpbGUgZm9yIG9wdGltaXphdGlvbiByZW1hcmtzIHRvCisgIC8vLyBpZGVudGlmeSB0aGUgcmVtYXJrLgorICBTdHJpbmdSZWYgUmVtYXJrTmFtZTsKKworICAvLy8gSWYgcHJvZmlsZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUsIHRoaXMgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUKKyAgLy8vIGNvcnJlc3BvbmRpbmcgY29kZSB3YXMgZXhlY3V0ZWQgaW4gYSBwcm9maWxlIGluc3RydW1lbnRhdGlvbiBydW4uCisgIE9wdGlvbmFsPHVpbnQ2NF90PiBIb3RuZXNzOworCisgIC8vLyBBcmd1bWVudHMgY29sbGVjdGVkIHZpYSB0aGUgc3RyZWFtaW5nIGludGVyZmFjZS4KKyAgU21hbGxWZWN0b3I8QXJndW1lbnQsIDQ+IEFyZ3M7CisKKyAgLy8vIFRoZSByZW1hcmsgaXMgZXhwZWN0ZWQgdG8gYmUgbm9pc3kuCisgIGJvb2wgSXNWZXJib3NlID0gZmFsc2U7CisKKyAgLy8vIFxicmllZiBJZiBwb3NpdGl2ZSwgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBhcmd1bWVudCB0aGF0IG9ubHkgYXBwZWFyIGluCisgIC8vLyB0aGUgb3B0aW1pemF0aW9uIHJlY29yZHMgYW5kIG5vdCBpbiB0aGUgcmVtYXJrIHByaW50ZWQgaW4gdGhlIGNvbXBpbGVyCisgIC8vLyBvdXRwdXQuCisgIGludCBGaXJzdEV4dHJhQXJnSW5kZXggPSAtMTsKKworICBmcmllbmQgc3RydWN0IHlhbWw6Ok1hcHBpbmdUcmFpdHM8RGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlICo+OworfTsKKworLy8vIEFsbG93IHRoZSBpbnNlcnRpb24gb3BlcmF0b3IgdG8gcmV0dXJuIHRoZSBhY3R1YWwgcmVtYXJrIHR5cGUgcmF0aGVyIHRoYW4gYQorLy8vIGNvbW1vbiBiYXNlIGNsYXNzLiAgVGhpcyBhbGxvd3MgcmV0dXJuaW5nIHRoZSByZXN1bHQgb2YgdGhlIGluc2VydGlvbgorLy8vIGRpcmVjdGx5IGJ5IHZhbHVlLCBlLmcuIHJldHVybiBPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpcyguLi4pIDw8ICJibGFoIi4KK3RlbXBsYXRlIDxjbGFzcyBSZW1hcmtUPgorUmVtYXJrVCAmCitvcGVyYXRvcjw8KFJlbWFya1QgJlIsCisgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgc3RkOjppc19iYXNlX29mPERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZSwgUmVtYXJrVD46OnZhbHVlLAorICAgICAgICAgICAgICAgU3RyaW5nUmVmPjo6dHlwZSBTKSB7CisgIFIuaW5zZXJ0KFMpOworICByZXR1cm4gUjsKK30KKworLy8vIEFsc28gYWxsb3cgci12YWx1ZSBmb3IgdGhlIHJlbWFyayB0byBhbGxvdyBpbnNlcnRpb24gaW50byBhCisvLy8gdGVtcG9yYXJpbHktY29uc3RydWN0ZWQgcmVtYXJrLgordGVtcGxhdGUgPGNsYXNzIFJlbWFya1Q+CitSZW1hcmtUICYKK29wZXJhdG9yPDwoUmVtYXJrVCAmJlIsCisgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgc3RkOjppc19iYXNlX29mPERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZSwgUmVtYXJrVD46OnZhbHVlLAorICAgICAgICAgICAgICAgU3RyaW5nUmVmPjo6dHlwZSBTKSB7CisgIFIuaW5zZXJ0KFMpOworICByZXR1cm4gUjsKK30KKwordGVtcGxhdGUgPGNsYXNzIFJlbWFya1Q+CitSZW1hcmtUICYKK29wZXJhdG9yPDwoUmVtYXJrVCAmUiwKKyAgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8RGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlLCBSZW1hcmtUPjo6dmFsdWUsCisgICAgICAgICAgICAgICBEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2U6OkFyZ3VtZW50Pjo6dHlwZSBBKSB7CisgIFIuaW5zZXJ0KEEpOworICByZXR1cm4gUjsKK30KKwordGVtcGxhdGUgPGNsYXNzIFJlbWFya1Q+CitSZW1hcmtUICYKK29wZXJhdG9yPDwoUmVtYXJrVCAmJlIsCisgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgc3RkOjppc19iYXNlX29mPERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZSwgUmVtYXJrVD46OnZhbHVlLAorICAgICAgICAgICAgICAgRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlOjpBcmd1bWVudD46OnR5cGUgQSkgeworICBSLmluc2VydChBKTsKKyAgcmV0dXJuIFI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBSZW1hcmtUPgorUmVtYXJrVCAmCitvcGVyYXRvcjw8KFJlbWFya1QgJlIsCisgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgc3RkOjppc19iYXNlX29mPERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZSwgUmVtYXJrVD46OnZhbHVlLAorICAgICAgICAgICAgICAgRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlOjpzZXRJc1ZlcmJvc2U+Ojp0eXBlIFYpIHsKKyAgUi5pbnNlcnQoVik7CisgIHJldHVybiBSOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgUmVtYXJrVD4KK1JlbWFya1QgJgorb3BlcmF0b3I8PChSZW1hcmtUICYmUiwKKyAgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICAgICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8RGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlLCBSZW1hcmtUPjo6dmFsdWUsCisgICAgICAgICAgICAgICBEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2U6OnNldElzVmVyYm9zZT46OnR5cGUgVikgeworICBSLmluc2VydChWKTsKKyAgcmV0dXJuIFI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBSZW1hcmtUPgorUmVtYXJrVCAmCitvcGVyYXRvcjw8KFJlbWFya1QgJlIsCisgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgICAgICAgICAgc3RkOjppc19iYXNlX29mPERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZSwgUmVtYXJrVD46OnZhbHVlLAorICAgICAgICAgICAgICAgRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlOjpzZXRFeHRyYUFyZ3M+Ojp0eXBlIEVBKSB7CisgIFIuaW5zZXJ0KEVBKTsKKyAgcmV0dXJuIFI7Cit9CisKKy8vLyBcYnJpZWYgQ29tbW9uIGZlYXR1cmVzIGZvciBkaWFnbm9zdGljcyBkZWFsaW5nIHdpdGggb3B0aW1pemF0aW9uIHJlbWFya3MKKy8vLyB0aGF0IGFyZSB1c2VkIGJ5IElSIHBhc3Nlcy4KK2NsYXNzIERpYWdub3N0aWNJbmZvSVJPcHRpbWl6YXRpb24gOiBwdWJsaWMgRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlIHsKK3B1YmxpYzoKKyAgLy8vIFxwIFBhc3NOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXNzIGVtaXR0aW5nIHRoaXMgZGlhZ25vc3RpYy4gXHAKKyAgLy8vIFJlbWFya05hbWUgaXMgYSB0ZXh0dWFsIGlkZW50aWZpZXIgZm9yIHRoZSByZW1hcmsgKHNpbmdsZS13b3JkLAorICAvLy8gY2FtZWwtY2FzZSkuIFxwIEZuIGlzIHRoZSBmdW5jdGlvbiB3aGVyZSB0aGUgZGlhZ25vc3RpYyBpcyBiZWluZyBlbWl0dGVkLgorICAvLy8gXHAgTG9jIGlzIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byB1c2UgaW4gdGhlIGRpYWdub3N0aWMuIElmIGxpbmUgdGFibGUKKyAgLy8vIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSwgdGhlIGRpYWdub3N0aWMgd2lsbCBpbmNsdWRlIHRoZSBzb3VyY2UgY29kZQorICAvLy8gbG9jYXRpb24uIFxwIENvZGVSZWdpb24gaXMgSVIgdmFsdWUgKGN1cnJlbnRseSBiYXNpYyBibG9jaykgdGhhdCB0aGUKKyAgLy8vIG9wdGltaXphdGlvbiBvcGVyYXRlcyBvbi4gVGhpcyBpcyBjdXJyZW50bHkgdXNlZCB0byBwcm92aWRlIHJ1bi10aW1lCisgIC8vLyBob3RuZXNzIGluZm9ybWF0aW9uIHdpdGggUEdPLgorICBEaWFnbm9zdGljSW5mb0lST3B0aW1pemF0aW9uKGVudW0gRGlhZ25vc3RpY0tpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtIERpYWdub3N0aWNTZXZlcml0eSBTZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpQYXNzTmFtZSwgU3RyaW5nUmVmIFJlbWFya05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRnVuY3Rpb24gJkZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWNMb2NhdGlvbiAmTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpDb2RlUmVnaW9uID0gbnVsbHB0cikKKyAgICAgIDogRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlKEtpbmQsIFNldmVyaXR5LCBQYXNzTmFtZSwgUmVtYXJrTmFtZSwgRm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2MpLAorICAgICAgICBDb2RlUmVnaW9uKENvZGVSZWdpb24pIHt9CisKKyAgLy8vIFxicmllZiBUaGlzIGlzIGN0b3IgdmFyaWFudCBhbGxvd3MgYSBwYXNzIHRvIGJ1aWxkIGFuIG9wdGltaXphdGlvbiByZW1hcmsKKyAgLy8vIGZyb20gYW4gZXhpc3RpbmcgcmVtYXJrLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZnVsIHdoZW4gYSB0cmFuc2Zvcm1hdGlvbiBwYXNzIChlLmcgTFYpIHdhbnRzIHRvIGVtaXQgYSByZW1hcmsKKyAgLy8vIChccCBPcmlnKSBnZW5lcmF0ZWQgYnkgb25lIG9mIGl0cyBhbmFseXNlcyAoZS5nLiBMQUEpIGFzIGl0cyBvd24gYW5hbHlzaXMKKyAgLy8vIHJlbWFyay4gIFRoZSBzdHJpbmcgXHAgUHJlcGVuZCB3aWxsIGJlIGVtaXR0ZWQgYmVmb3JlIHRoZSBvcmlnaW5hbAorICAvLy8gbWVzc2FnZS4KKyAgRGlhZ25vc3RpY0luZm9JUk9wdGltaXphdGlvbihjb25zdCBjaGFyICpQYXNzTmFtZSwgU3RyaW5nUmVmIFByZXBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpY0luZm9JUk9wdGltaXphdGlvbiAmT3JpZykKKyAgICAgIDogRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlKAorICAgICAgICAgICAgKERpYWdub3N0aWNLaW5kKU9yaWcuZ2V0S2luZCgpLCBPcmlnLmdldFNldmVyaXR5KCksIFBhc3NOYW1lLAorICAgICAgICAgICAgT3JpZy5SZW1hcmtOYW1lLCBPcmlnLmdldEZ1bmN0aW9uKCksIE9yaWcuZ2V0TG9jYXRpb24oKSksCisgICAgICAgIENvZGVSZWdpb24oT3JpZy5nZXRDb2RlUmVnaW9uKCkpIHsKKyAgICAqdGhpcyA8PCBQcmVwZW5kOworICAgIHN0ZDo6Y29weShPcmlnLkFyZ3MuYmVnaW4oKSwgT3JpZy5BcmdzLmVuZCgpLCBzdGQ6OmJhY2tfaW5zZXJ0ZXIoQXJncykpOworICB9CisKKyAgLy8vIExlZ2FjeSBpbnRlcmZhY2UuCisgIC8vLyBccCBQYXNzTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFzcyBlbWl0dGluZyB0aGlzIGRpYWdub3N0aWMuCisgIC8vLyBccCBGbiBpcyB0aGUgZnVuY3Rpb24gd2hlcmUgdGhlIGRpYWdub3N0aWMgaXMgYmVpbmcgZW1pdHRlZC4gXHAgTG9jIGlzCisgIC8vLyB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gdXNlIGluIHRoZSBkaWFnbm9zdGljLiBJZiBsaW5lIHRhYmxlCisgIC8vLyBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUsIHRoZSBkaWFnbm9zdGljIHdpbGwgaW5jbHVkZSB0aGUgc291cmNlIGNvZGUKKyAgLy8vIGxvY2F0aW9uLiBccCBNc2cgaXMgdGhlIG1lc3NhZ2UgdG8gc2hvdy4gTm90ZSB0aGF0IHRoaXMgY2xhc3MgZG9lcyBub3QKKyAgLy8vIGNvcHkgdGhpcyBtZXNzYWdlLCBzbyB0aGlzIHJlZmVyZW5jZSBtdXN0IGJlIHZhbGlkIGZvciB0aGUgd2hvbGUgbGlmZSB0aW1lCisgIC8vLyBvZiB0aGUgZGlhZ25vc3RpYy4KKyAgRGlhZ25vc3RpY0luZm9JUk9wdGltaXphdGlvbihlbnVtIERpYWdub3N0aWNLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBEaWFnbm9zdGljU2V2ZXJpdHkgU2V2ZXJpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqUGFzc05hbWUsIGNvbnN0IEZ1bmN0aW9uICZGbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljTG9jYXRpb24gJkxvYywgY29uc3QgVHdpbmUgJk1zZykKKyAgICAgIDogRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlKEtpbmQsIFNldmVyaXR5LCBQYXNzTmFtZSwgIiIsIEZuLCBMb2MpIHsKKyAgICAqdGhpcyA8PCBNc2cuc3RyKCk7CisgIH0KKworICBjb25zdCBWYWx1ZSAqZ2V0Q29kZVJlZ2lvbigpIGNvbnN0IHsgcmV0dXJuIENvZGVSZWdpb247IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERpYWdub3N0aWNJbmZvICpESSkgeworICAgIHJldHVybiBESS0+Z2V0S2luZCgpID49IERLX0ZpcnN0UmVtYXJrICYmIERJLT5nZXRLaW5kKCkgPD0gREtfTGFzdFJlbWFyazsKKyAgfQorCitwcml2YXRlOgorICAvLy8gVGhlIElSIHZhbHVlIChjdXJyZW50bHkgYmFzaWMgYmxvY2spIHRoYXQgdGhlIG9wdGltaXphdGlvbiBvcGVyYXRlcyBvbi4KKyAgLy8vIFRoaXMgaXMgY3VycmVudGx5IHVzZWQgdG8gcHJvdmlkZSBydW4tdGltZSBob3RuZXNzIGluZm9ybWF0aW9uIHdpdGggUEdPLgorICBjb25zdCBWYWx1ZSAqQ29kZVJlZ2lvbjsKK307CisKKy8vLyBEaWFnbm9zdGljIGluZm9ybWF0aW9uIGZvciBhcHBsaWVkIG9wdGltaXphdGlvbiByZW1hcmtzLgorY2xhc3MgT3B0aW1pemF0aW9uUmVtYXJrIDogcHVibGljIERpYWdub3N0aWNJbmZvSVJPcHRpbWl6YXRpb24geworcHVibGljOgorICAvLy8gXHAgUGFzc05hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHBhc3MgZW1pdHRpbmcgdGhpcyBkaWFnbm9zdGljLiBJZiB0aGlzIG5hbWUKKyAgLy8vIG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiAtUnBhc3M9LCB0aGVuIHRoZSBkaWFnbm9zdGljIHdpbGwKKyAgLy8vIGJlIGVtaXR0ZWQuIFxwIFJlbWFya05hbWUgaXMgYSB0ZXh0dWFsIGlkZW50aWZpZXIgZm9yIHRoZSByZW1hcmsgKHNpbmdsZS0KKyAgLy8vIHdvcmQsIGNhbWVsLWNhc2UpLiBccCBMb2MgaXMgdGhlIGRlYnVnIGxvY2F0aW9uIGFuZCBccCBDb2RlUmVnaW9uIGlzIHRoZQorICAvLy8gcmVnaW9uIHRoYXQgdGhlIG9wdGltaXphdGlvbiBvcGVyYXRlcyBvbiAoY3VycmVudGx5IG9ubHkgYmxvY2sgaXMKKyAgLy8vIHN1cHBvcnRlZCkuCisgIE9wdGltaXphdGlvblJlbWFyayhjb25zdCBjaGFyICpQYXNzTmFtZSwgU3RyaW5nUmVmIFJlbWFya05hbWUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljTG9jYXRpb24gJkxvYywgY29uc3QgVmFsdWUgKkNvZGVSZWdpb24pOworCisgIC8vLyBTYW1lIGFzIGFib3ZlLCBidXQgdGhlIGRlYnVnIGxvY2F0aW9uIGFuZCBjb2RlIHJlZ2lvbiBhcmUgZGVyaXZlZCBmcm9tIFxwCisgIC8vLyBJbnN0ci4KKyAgT3B0aW1pemF0aW9uUmVtYXJrKGNvbnN0IGNoYXIgKlBhc3NOYW1lLCBTdHJpbmdSZWYgUmVtYXJrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpJbnN0KTsKKworICAvLy8gU2FtZSBhcyBhYm92ZSwgYnV0IHRoZSBkZWJ1ZyBsb2NhdGlvbiBhbmQgY29kZSByZWdpb24gYXJlIGRlcml2ZWQgZnJvbSBccAorICAvLy8gRnVuYy4KKyAgT3B0aW1pemF0aW9uUmVtYXJrKGNvbnN0IGNoYXIgKlBhc3NOYW1lLCBTdHJpbmdSZWYgUmVtYXJrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uICpGdW5jKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERpYWdub3N0aWNJbmZvICpESSkgeworICAgIHJldHVybiBESS0+Z2V0S2luZCgpID09IERLX09wdGltaXphdGlvblJlbWFyazsKKyAgfQorCisgIC8vLyBcc2VlIERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uQmFzZTo6aXNFbmFibGVkLgorICBib29sIGlzRW5hYmxlZCgpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICAvLy8gVGhpcyBpcyBkZXByZWNhdGVkIG5vdyBhbmQgb25seSB1c2VkIGJ5IHRoZSBmdW5jdGlvbiBBUEkgYmVsb3cuCisgIC8vLyBccCBQYXNzTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFzcyBlbWl0dGluZyB0aGlzIGRpYWdub3N0aWMuIElmCisgIC8vLyB0aGlzIG5hbWUgbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uIGdpdmVuIGluIC1ScGFzcz0sIHRoZW4gdGhlCisgIC8vLyBkaWFnbm9zdGljIHdpbGwgYmUgZW1pdHRlZC4gXHAgRm4gaXMgdGhlIGZ1bmN0aW9uIHdoZXJlIHRoZSBkaWFnbm9zdGljCisgIC8vLyBpcyBiZWluZyBlbWl0dGVkLiBccCBMb2MgaXMgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIHVzZSBpbiB0aGUKKyAgLy8vIGRpYWdub3N0aWMuIElmIGxpbmUgdGFibGUgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLCB0aGUgZGlhZ25vc3RpYworICAvLy8gd2lsbCBpbmNsdWRlIHRoZSBzb3VyY2UgY29kZSBsb2NhdGlvbi4gXHAgTXNnIGlzIHRoZSBtZXNzYWdlIHRvIHNob3cuCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBjbGFzcyBkb2VzIG5vdCBjb3B5IHRoaXMgbWVzc2FnZSwgc28gdGhpcyByZWZlcmVuY2UKKyAgLy8vIG11c3QgYmUgdmFsaWQgZm9yIHRoZSB3aG9sZSBsaWZlIHRpbWUgb2YgdGhlIGRpYWdub3N0aWMuCisgIE9wdGltaXphdGlvblJlbWFyayhjb25zdCBjaGFyICpQYXNzTmFtZSwgY29uc3QgRnVuY3Rpb24gJkZuLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpY0xvY2F0aW9uICZMb2MsIGNvbnN0IFR3aW5lICZNc2cpCisgICAgICA6IERpYWdub3N0aWNJbmZvSVJPcHRpbWl6YXRpb24oREtfT3B0aW1pemF0aW9uUmVtYXJrLCBEU19SZW1hcmssIFBhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZuLCBMb2MsIE1zZykge30KK307CisKKy8vLyBEaWFnbm9zdGljIGluZm9ybWF0aW9uIGZvciBtaXNzZWQtb3B0aW1pemF0aW9uIHJlbWFya3MuCitjbGFzcyBPcHRpbWl6YXRpb25SZW1hcmtNaXNzZWQgOiBwdWJsaWMgRGlhZ25vc3RpY0luZm9JUk9wdGltaXphdGlvbiB7CitwdWJsaWM6CisgIC8vLyBccCBQYXNzTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFzcyBlbWl0dGluZyB0aGlzIGRpYWdub3N0aWMuIElmIHRoaXMgbmFtZQorICAvLy8gbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uIGdpdmVuIGluIC1ScGFzcy1taXNzZWQ9LCB0aGVuIHRoZQorICAvLy8gZGlhZ25vc3RpYyB3aWxsIGJlIGVtaXR0ZWQuIFxwIFJlbWFya05hbWUgaXMgYSB0ZXh0dWFsIGlkZW50aWZpZXIgZm9yIHRoZQorICAvLy8gcmVtYXJrIChzaW5nbGUtd29yZCwgY2FtZWwtY2FzZSkuIFxwIExvYyBpcyB0aGUgZGVidWcgbG9jYXRpb24gYW5kIFxwCisgIC8vLyBDb2RlUmVnaW9uIGlzIHRoZSByZWdpb24gdGhhdCB0aGUgb3B0aW1pemF0aW9uIG9wZXJhdGVzIG9uIChjdXJyZW50bHkgb25seQorICAvLy8gYmxvY2sgaXMgc3VwcG9ydGVkKS4KKyAgT3B0aW1pemF0aW9uUmVtYXJrTWlzc2VkKGNvbnN0IGNoYXIgKlBhc3NOYW1lLCBTdHJpbmdSZWYgUmVtYXJrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWNMb2NhdGlvbiAmTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKkNvZGVSZWdpb24pOworCisgIC8vLyBcYnJpZWYgU2FtZSBhcyBhYm92ZSBidXQgXHAgSW5zdCBpcyB1c2VkIHRvIGRlcml2ZSBjb2RlIHJlZ2lvbiBhbmQgZGVidWcKKyAgLy8vIGxvY2F0aW9uLgorICBPcHRpbWl6YXRpb25SZW1hcmtNaXNzZWQoY29uc3QgY2hhciAqUGFzc05hbWUsIFN0cmluZ1JlZiBSZW1hcmtOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkluc3QpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGlhZ25vc3RpY0luZm8gKkRJKSB7CisgICAgcmV0dXJuIERJLT5nZXRLaW5kKCkgPT0gREtfT3B0aW1pemF0aW9uUmVtYXJrTWlzc2VkOworICB9CisKKyAgLy8vIFxzZWUgRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlOjppc0VuYWJsZWQuCisgIGJvb2wgaXNFbmFibGVkKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIC8vLyBUaGlzIGlzIGRlcHJlY2F0ZWQgbm93IGFuZCBvbmx5IHVzZWQgYnkgdGhlIGZ1bmN0aW9uIEFQSSBiZWxvdy4KKyAgLy8vIFxwIFBhc3NOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXNzIGVtaXR0aW5nIHRoaXMgZGlhZ25vc3RpYy4gSWYKKyAgLy8vIHRoaXMgbmFtZSBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZ2l2ZW4gaW4gLVJwYXNzLW1pc3NlZD0sIHRoZW4gdGhlCisgIC8vLyBkaWFnbm9zdGljIHdpbGwgYmUgZW1pdHRlZC4gXHAgRm4gaXMgdGhlIGZ1bmN0aW9uIHdoZXJlIHRoZSBkaWFnbm9zdGljCisgIC8vLyBpcyBiZWluZyBlbWl0dGVkLiBccCBMb2MgaXMgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIHVzZSBpbiB0aGUKKyAgLy8vIGRpYWdub3N0aWMuIElmIGxpbmUgdGFibGUgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLCB0aGUgZGlhZ25vc3RpYworICAvLy8gd2lsbCBpbmNsdWRlIHRoZSBzb3VyY2UgY29kZSBsb2NhdGlvbi4gXHAgTXNnIGlzIHRoZSBtZXNzYWdlIHRvIHNob3cuCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBjbGFzcyBkb2VzIG5vdCBjb3B5IHRoaXMgbWVzc2FnZSwgc28gdGhpcyByZWZlcmVuY2UKKyAgLy8vIG11c3QgYmUgdmFsaWQgZm9yIHRoZSB3aG9sZSBsaWZlIHRpbWUgb2YgdGhlIGRpYWdub3N0aWMuCisgIE9wdGltaXphdGlvblJlbWFya01pc3NlZChjb25zdCBjaGFyICpQYXNzTmFtZSwgY29uc3QgRnVuY3Rpb24gJkZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpY0xvY2F0aW9uICZMb2MsIGNvbnN0IFR3aW5lICZNc2cpCisgICAgICA6IERpYWdub3N0aWNJbmZvSVJPcHRpbWl6YXRpb24oREtfT3B0aW1pemF0aW9uUmVtYXJrTWlzc2VkLCBEU19SZW1hcmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzc05hbWUsIEZuLCBMb2MsIE1zZykge30KK307CisKKy8vLyBEaWFnbm9zdGljIGluZm9ybWF0aW9uIGZvciBvcHRpbWl6YXRpb24gYW5hbHlzaXMgcmVtYXJrcy4KK2NsYXNzIE9wdGltaXphdGlvblJlbWFya0FuYWx5c2lzIDogcHVibGljIERpYWdub3N0aWNJbmZvSVJPcHRpbWl6YXRpb24geworcHVibGljOgorICAvLy8gXHAgUGFzc05hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHBhc3MgZW1pdHRpbmcgdGhpcyBkaWFnbm9zdGljLiBJZiB0aGlzIG5hbWUKKyAgLy8vIG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiAtUnBhc3MtYW5hbHlzaXM9LCB0aGVuIHRoZQorICAvLy8gZGlhZ25vc3RpYyB3aWxsIGJlIGVtaXR0ZWQuIFxwIFJlbWFya05hbWUgaXMgYSB0ZXh0dWFsIGlkZW50aWZpZXIgZm9yIHRoZQorICAvLy8gcmVtYXJrIChzaW5nbGUtd29yZCwgY2FtZWwtY2FzZSkuIFxwIExvYyBpcyB0aGUgZGVidWcgbG9jYXRpb24gYW5kIFxwCisgIC8vLyBDb2RlUmVnaW9uIGlzIHRoZSByZWdpb24gdGhhdCB0aGUgb3B0aW1pemF0aW9uIG9wZXJhdGVzIG9uIChjdXJyZW50bHkgb25seQorICAvLy8gYmxvY2sgaXMgc3VwcG9ydGVkKS4KKyAgT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXMoY29uc3QgY2hhciAqUGFzc05hbWUsIFN0cmluZ1JlZiBSZW1hcmtOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljTG9jYXRpb24gJkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKkNvZGVSZWdpb24pOworCisgIC8vLyBcYnJpZWYgVGhpcyBpcyBjdG9yIHZhcmlhbnQgYWxsb3dzIGEgcGFzcyB0byBidWlsZCBhbiBvcHRpbWl6YXRpb24gcmVtYXJrCisgIC8vLyBmcm9tIGFuIGV4aXN0aW5nIHJlbWFyay4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWZ1bCB3aGVuIGEgdHJhbnNmb3JtYXRpb24gcGFzcyAoZS5nIExWKSB3YW50cyB0byBlbWl0IGEgcmVtYXJrCisgIC8vLyAoXHAgT3JpZykgZ2VuZXJhdGVkIGJ5IG9uZSBvZiBpdHMgYW5hbHlzZXMgKGUuZy4gTEFBKSBhcyBpdHMgb3duIGFuYWx5c2lzCisgIC8vLyByZW1hcmsuICBUaGUgc3RyaW5nIFxwIFByZXBlbmQgd2lsbCBiZSBlbWl0dGVkIGJlZm9yZSB0aGUgb3JpZ2luYWwKKyAgLy8vIG1lc3NhZ2UuCisgIE9wdGltaXphdGlvblJlbWFya0FuYWx5c2lzKGNvbnN0IGNoYXIgKlBhc3NOYW1lLCBTdHJpbmdSZWYgUHJlcGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXMgJk9yaWcpCisgICAgICA6IERpYWdub3N0aWNJbmZvSVJPcHRpbWl6YXRpb24oUGFzc05hbWUsIFByZXBlbmQsIE9yaWcpIHt9CisKKyAgLy8vIFxicmllZiBTYW1lIGFzIGFib3ZlIGJ1dCBccCBJbnN0IGlzIHVzZWQgdG8gZGVyaXZlIGNvZGUgcmVnaW9uIGFuZCBkZWJ1ZworICAvLy8gbG9jYXRpb24uCisgIE9wdGltaXphdGlvblJlbWFya0FuYWx5c2lzKGNvbnN0IGNoYXIgKlBhc3NOYW1lLCBTdHJpbmdSZWYgUmVtYXJrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJ1Y3Rpb24gKkluc3QpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGlhZ25vc3RpY0luZm8gKkRJKSB7CisgICAgcmV0dXJuIERJLT5nZXRLaW5kKCkgPT0gREtfT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXM7CisgIH0KKworICAvLy8gXHNlZSBEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2U6OmlzRW5hYmxlZC4KKyAgYm9vbCBpc0VuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKKworICBzdGF0aWMgY29uc3QgY2hhciAqQWx3YXlzUHJpbnQ7CisKKyAgYm9vbCBzaG91bGRBbHdheXNQcmludCgpIGNvbnN0IHsgcmV0dXJuIGdldFBhc3NOYW1lKCkgPT0gQWx3YXlzUHJpbnQ7IH0KKworcHJvdGVjdGVkOgorICBPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpcyhlbnVtIERpYWdub3N0aWNLaW5kIEtpbmQsIGNvbnN0IGNoYXIgKlBhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbiAmRm4sIGNvbnN0IERpYWdub3N0aWNMb2NhdGlvbiAmTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTXNnKQorICAgICAgOiBEaWFnbm9zdGljSW5mb0lST3B0aW1pemF0aW9uKEtpbmQsIERTX1JlbWFyaywgUGFzc05hbWUsIEZuLCBMb2MsIE1zZykge30KKworICBPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpcyhlbnVtIERpYWdub3N0aWNLaW5kIEtpbmQsIGNvbnN0IGNoYXIgKlBhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgUmVtYXJrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpY0xvY2F0aW9uICZMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpDb2RlUmVnaW9uKTsKKworcHJpdmF0ZToKKyAgLy8vIFRoaXMgaXMgZGVwcmVjYXRlZCBub3cgYW5kIG9ubHkgdXNlZCBieSB0aGUgZnVuY3Rpb24gQVBJIGJlbG93LgorICAvLy8gXHAgUGFzc05hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHBhc3MgZW1pdHRpbmcgdGhpcyBkaWFnbm9zdGljLiBJZgorICAvLy8gdGhpcyBuYW1lIG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiAtUnBhc3MtYW5hbHlzaXM9LCB0aGVuCisgIC8vLyB0aGUgZGlhZ25vc3RpYyB3aWxsIGJlIGVtaXR0ZWQuIFxwIEZuIGlzIHRoZSBmdW5jdGlvbiB3aGVyZSB0aGUgZGlhZ25vc3RpYworICAvLy8gaXMgYmVpbmcgZW1pdHRlZC4gXHAgTG9jIGlzIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byB1c2UgaW4gdGhlCisgIC8vLyBkaWFnbm9zdGljLiBJZiBsaW5lIHRhYmxlIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSwgdGhlIGRpYWdub3N0aWMgd2lsbAorICAvLy8gaW5jbHVkZSB0aGUgc291cmNlIGNvZGUgbG9jYXRpb24uIFxwIE1zZyBpcyB0aGUgbWVzc2FnZSB0byBzaG93LiBOb3RlIHRoYXQKKyAgLy8vIHRoaXMgY2xhc3MgZG9lcyBub3QgY29weSB0aGlzIG1lc3NhZ2UsIHNvIHRoaXMgcmVmZXJlbmNlIG11c3QgYmUgdmFsaWQgZm9yCisgIC8vLyB0aGUgd2hvbGUgbGlmZSB0aW1lIG9mIHRoZSBkaWFnbm9zdGljLgorICBPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpcyhjb25zdCBjaGFyICpQYXNzTmFtZSwgY29uc3QgRnVuY3Rpb24gJkZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljTG9jYXRpb24gJkxvYywgY29uc3QgVHdpbmUgJk1zZykKKyAgICAgIDogRGlhZ25vc3RpY0luZm9JUk9wdGltaXphdGlvbihES19PcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpcywgRFNfUmVtYXJrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3NOYW1lLCBGbiwgTG9jLCBNc2cpIHt9Cit9OworCisvLy8gRGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBmb3Igb3B0aW1pemF0aW9uIGFuYWx5c2lzIHJlbWFya3MgcmVsYXRlZCB0bworLy8vIGZsb2F0aW5nLXBvaW50IG5vbi1jb21tdXRhdGl2aXR5LgorY2xhc3MgT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXNGUENvbW11dGUgOiBwdWJsaWMgT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXMgeworcHVibGljOgorICAvLy8gXHAgUGFzc05hbWUgaXMgdGhlIG5hbWUgb2YgdGhlIHBhc3MgZW1pdHRpbmcgdGhpcyBkaWFnbm9zdGljLiBJZiB0aGlzIG5hbWUKKyAgLy8vIG1hdGNoZXMgdGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiBnaXZlbiBpbiAtUnBhc3MtYW5hbHlzaXM9LCB0aGVuIHRoZQorICAvLy8gZGlhZ25vc3RpYyB3aWxsIGJlIGVtaXR0ZWQuIFxwIFJlbWFya05hbWUgaXMgYSB0ZXh0dWFsIGlkZW50aWZpZXIgZm9yIHRoZQorICAvLy8gcmVtYXJrIChzaW5nbGUtd29yZCwgY2FtZWwtY2FzZSkuIFxwIExvYyBpcyB0aGUgZGVidWcgbG9jYXRpb24gYW5kIFxwCisgIC8vLyBDb2RlUmVnaW9uIGlzIHRoZSByZWdpb24gdGhhdCB0aGUgb3B0aW1pemF0aW9uIG9wZXJhdGVzIG9uIChjdXJyZW50bHkgb25seQorICAvLy8gYmxvY2sgaXMgc3VwcG9ydGVkKS4gVGhlIGZyb250LWVuZCB3aWxsIGFwcGVuZCBpdHMgb3duIG1lc3NhZ2UgcmVsYXRlZCB0bworICAvLy8gb3B0aW9ucyB0aGF0IGFkZHJlc3MgZmxvYXRpbmctcG9pbnQgbm9uLWNvbW11dGF0aXZpdHkuCisgIE9wdGltaXphdGlvblJlbWFya0FuYWx5c2lzRlBDb21tdXRlKGNvbnN0IGNoYXIgKlBhc3NOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgUmVtYXJrTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpY0xvY2F0aW9uICZMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpDb2RlUmVnaW9uKQorICAgICAgOiBPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpcyhES19PcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpc0ZQQ29tbXV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzc05hbWUsIFJlbWFya05hbWUsIExvYywgQ29kZVJlZ2lvbikge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERpYWdub3N0aWNJbmZvICpESSkgeworICAgIHJldHVybiBESS0+Z2V0S2luZCgpID09IERLX09wdGltaXphdGlvblJlbWFya0FuYWx5c2lzRlBDb21tdXRlOworICB9CisKK3ByaXZhdGU6CisgIC8vLyBUaGlzIGlzIGRlcHJlY2F0ZWQgbm93IGFuZCBvbmx5IHVzZWQgYnkgdGhlIGZ1bmN0aW9uIEFQSSBiZWxvdy4KKyAgLy8vIFxwIFBhc3NOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXNzIGVtaXR0aW5nIHRoaXMgZGlhZ25vc3RpYy4gSWYKKyAgLy8vIHRoaXMgbmFtZSBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZ2l2ZW4gaW4gLVJwYXNzLWFuYWx5c2lzPSwgdGhlbgorICAvLy8gdGhlIGRpYWdub3N0aWMgd2lsbCBiZSBlbWl0dGVkLiBccCBGbiBpcyB0aGUgZnVuY3Rpb24gd2hlcmUgdGhlIGRpYWdub3N0aWMKKyAgLy8vIGlzIGJlaW5nIGVtaXR0ZWQuIFxwIExvYyBpcyB0aGUgbG9jYXRpb24gaW5mb3JtYXRpb24gdG8gdXNlIGluIHRoZQorICAvLy8gZGlhZ25vc3RpYy4gSWYgbGluZSB0YWJsZSBpbmZvcm1hdGlvbiBpcyBhdmFpbGFibGUsIHRoZSBkaWFnbm9zdGljIHdpbGwKKyAgLy8vIGluY2x1ZGUgdGhlIHNvdXJjZSBjb2RlIGxvY2F0aW9uLiBccCBNc2cgaXMgdGhlIG1lc3NhZ2UgdG8gc2hvdy4gVGhlCisgIC8vLyBmcm9udC1lbmQgd2lsbCBhcHBlbmQgaXRzIG93biBtZXNzYWdlIHJlbGF0ZWQgdG8gb3B0aW9ucyB0aGF0IGFkZHJlc3MKKyAgLy8vIGZsb2F0aW5nLXBvaW50IG5vbi1jb21tdXRhdGl2aXR5LiBOb3RlIHRoYXQgdGhpcyBjbGFzcyBkb2VzIG5vdCBjb3B5IHRoaXMKKyAgLy8vIG1lc3NhZ2UsIHNvIHRoaXMgcmVmZXJlbmNlIG11c3QgYmUgdmFsaWQgZm9yIHRoZSB3aG9sZSBsaWZlIHRpbWUgb2YgdGhlCisgIC8vLyBkaWFnbm9zdGljLgorICBPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpc0ZQQ29tbXV0ZShjb25zdCBjaGFyICpQYXNzTmFtZSwgY29uc3QgRnVuY3Rpb24gJkZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljTG9jYXRpb24gJkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk1zZykKKyAgICAgIDogT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXMoREtfT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXNGUENvbW11dGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3NOYW1lLCBGbiwgTG9jLCBNc2cpIHt9Cit9OworCisvLy8gRGlhZ25vc3RpYyBpbmZvcm1hdGlvbiBmb3Igb3B0aW1pemF0aW9uIGFuYWx5c2lzIHJlbWFya3MgcmVsYXRlZCB0bworLy8vIHBvaW50ZXIgYWxpYXNpbmcuCitjbGFzcyBPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpc0FsaWFzaW5nIDogcHVibGljIE9wdGltaXphdGlvblJlbWFya0FuYWx5c2lzIHsKK3B1YmxpYzoKKyAgLy8vIFxwIFBhc3NOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBwYXNzIGVtaXR0aW5nIHRoaXMgZGlhZ25vc3RpYy4gSWYgdGhpcyBuYW1lCisgIC8vLyBtYXRjaGVzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gZ2l2ZW4gaW4gLVJwYXNzLWFuYWx5c2lzPSwgdGhlbiB0aGUKKyAgLy8vIGRpYWdub3N0aWMgd2lsbCBiZSBlbWl0dGVkLiBccCBSZW1hcmtOYW1lIGlzIGEgdGV4dHVhbCBpZGVudGlmaWVyIGZvciB0aGUKKyAgLy8vIHJlbWFyayAoc2luZ2xlLXdvcmQsIGNhbWVsLWNhc2UpLiBccCBMb2MgaXMgdGhlIGRlYnVnIGxvY2F0aW9uIGFuZCBccAorICAvLy8gQ29kZVJlZ2lvbiBpcyB0aGUgcmVnaW9uIHRoYXQgdGhlIG9wdGltaXphdGlvbiBvcGVyYXRlcyBvbiAoY3VycmVudGx5IG9ubHkKKyAgLy8vIGJsb2NrIGlzIHN1cHBvcnRlZCkuIFRoZSBmcm9udC1lbmQgd2lsbCBhcHBlbmQgaXRzIG93biBtZXNzYWdlIHJlbGF0ZWQgdG8KKyAgLy8vIG9wdGlvbnMgdGhhdCBhZGRyZXNzIHBvaW50ZXIgYWxpYXNpbmcgbGVnYWxpdHkuCisgIE9wdGltaXphdGlvblJlbWFya0FuYWx5c2lzQWxpYXNpbmcoY29uc3QgY2hhciAqUGFzc05hbWUsIFN0cmluZ1JlZiBSZW1hcmtOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERpYWdub3N0aWNMb2NhdGlvbiAmTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpDb2RlUmVnaW9uKQorICAgICAgOiBPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpcyhES19PcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpc0FsaWFzaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzTmFtZSwgUmVtYXJrTmFtZSwgTG9jLCBDb2RlUmVnaW9uKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgRGlhZ25vc3RpY0luZm8gKkRJKSB7CisgICAgcmV0dXJuIERJLT5nZXRLaW5kKCkgPT0gREtfT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXNBbGlhc2luZzsKKyAgfQorCitwcml2YXRlOgorICAvLy8gVGhpcyBpcyBkZXByZWNhdGVkIG5vdyBhbmQgb25seSB1c2VkIGJ5IHRoZSBmdW5jdGlvbiBBUEkgYmVsb3cuCisgIC8vLyBccCBQYXNzTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFzcyBlbWl0dGluZyB0aGlzIGRpYWdub3N0aWMuIElmCisgIC8vLyB0aGlzIG5hbWUgbWF0Y2hlcyB0aGUgcmVndWxhciBleHByZXNzaW9uIGdpdmVuIGluIC1ScGFzcy1hbmFseXNpcz0sIHRoZW4KKyAgLy8vIHRoZSBkaWFnbm9zdGljIHdpbGwgYmUgZW1pdHRlZC4gXHAgRm4gaXMgdGhlIGZ1bmN0aW9uIHdoZXJlIHRoZSBkaWFnbm9zdGljCisgIC8vLyBpcyBiZWluZyBlbWl0dGVkLiBccCBMb2MgaXMgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIHRvIHVzZSBpbiB0aGUKKyAgLy8vIGRpYWdub3N0aWMuIElmIGxpbmUgdGFibGUgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLCB0aGUgZGlhZ25vc3RpYyB3aWxsCisgIC8vLyBpbmNsdWRlIHRoZSBzb3VyY2UgY29kZSBsb2NhdGlvbi4gXHAgTXNnIGlzIHRoZSBtZXNzYWdlIHRvIHNob3cuIFRoZQorICAvLy8gZnJvbnQtZW5kIHdpbGwgYXBwZW5kIGl0cyBvd24gbWVzc2FnZSByZWxhdGVkIHRvIG9wdGlvbnMgdGhhdCBhZGRyZXNzCisgIC8vLyBwb2ludGVyIGFsaWFzaW5nIGxlZ2FsaXR5LiBOb3RlIHRoYXQgdGhpcyBjbGFzcyBkb2VzIG5vdCBjb3B5IHRoaXMKKyAgLy8vIG1lc3NhZ2UsIHNvIHRoaXMgcmVmZXJlbmNlIG11c3QgYmUgdmFsaWQgZm9yIHRoZSB3aG9sZSBsaWZlIHRpbWUgb2YgdGhlCisgIC8vLyBkaWFnbm9zdGljLgorICBPcHRpbWl6YXRpb25SZW1hcmtBbmFseXNpc0FsaWFzaW5nKGNvbnN0IGNoYXIgKlBhc3NOYW1lLCBjb25zdCBGdW5jdGlvbiAmRm4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpY0xvY2F0aW9uICZMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk1zZykKKyAgICAgIDogT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXMoREtfT3B0aW1pemF0aW9uUmVtYXJrQW5hbHlzaXNBbGlhc2luZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFzc05hbWUsIEZuLCBMb2MsIE1zZykge30KK307CisKKy8vLyBEaWFnbm9zdGljIGluZm9ybWF0aW9uIGZvciBtYWNoaW5lIElSIHBhcnNlci4KK2NsYXNzIERpYWdub3N0aWNJbmZvTUlSUGFyc2VyIDogcHVibGljIERpYWdub3N0aWNJbmZvIHsKKyAgY29uc3QgU01EaWFnbm9zdGljICZEaWFnbm9zdGljOworCitwdWJsaWM6CisgIERpYWdub3N0aWNJbmZvTUlSUGFyc2VyKERpYWdub3N0aWNTZXZlcml0eSBTZXZlcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU01EaWFnbm9zdGljICZEaWFnbm9zdGljKQorICAgICAgOiBEaWFnbm9zdGljSW5mbyhES19NSVJQYXJzZXIsIFNldmVyaXR5KSwgRGlhZ25vc3RpYyhEaWFnbm9zdGljKSB7fQorCisgIGNvbnN0IFNNRGlhZ25vc3RpYyAmZ2V0RGlhZ25vc3RpYygpIGNvbnN0IHsgcmV0dXJuIERpYWdub3N0aWM7IH0KKworICB2b2lkIHByaW50KERpYWdub3N0aWNQcmludGVyICZEUCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEaWFnbm9zdGljSW5mbyAqREkpIHsKKyAgICByZXR1cm4gREktPmdldEtpbmQoKSA9PSBES19NSVJQYXJzZXI7CisgIH0KK307CisKKy8vLyBEaWFnbm9zdGljIGluZm9ybWF0aW9uIGZvciBJU2VsIGZhbGxiYWNrIHBhdGguCitjbGFzcyBEaWFnbm9zdGljSW5mb0lTZWxGYWxsYmFjayA6IHB1YmxpYyBEaWFnbm9zdGljSW5mbyB7CisgIC8vLyBUaGUgZnVuY3Rpb24gdGhhdCBpcyBjb25jZXJuZWQgYnkgdGhpcyBkaWFnbm9zdGljLgorICBjb25zdCBGdW5jdGlvbiAmRm47CisKK3B1YmxpYzoKKyAgRGlhZ25vc3RpY0luZm9JU2VsRmFsbGJhY2soY29uc3QgRnVuY3Rpb24gJkZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEaWFnbm9zdGljU2V2ZXJpdHkgU2V2ZXJpdHkgPSBEU19XYXJuaW5nKQorICAgICAgOiBEaWFnbm9zdGljSW5mbyhES19JU2VsRmFsbGJhY2ssIFNldmVyaXR5KSwgRm4oRm4pIHt9CisKKyAgY29uc3QgRnVuY3Rpb24gJmdldEZ1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gRm47IH0KKworICB2b2lkIHByaW50KERpYWdub3N0aWNQcmludGVyICZEUCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBEaWFnbm9zdGljSW5mbyAqREkpIHsKKyAgICByZXR1cm4gREktPmdldEtpbmQoKSA9PSBES19JU2VsRmFsbGJhY2s7CisgIH0KK307CisKKy8vIENyZWF0ZSB3cmFwcGVycyBmb3IgQyBCaW5kaW5nIHR5cGVzIChzZWUgQ0JpbmRpbmdXcmFwcGluZy5oKS4KK0RFRklORV9TSU1QTEVfQ09OVkVSU0lPTl9GVU5DVElPTlMoRGlhZ25vc3RpY0luZm8sIExMVk1EaWFnbm9zdGljSW5mb1JlZikKKworLy8vIERpYWdub3N0aWMgaW5mb3JtYXRpb24gZm9yIG9wdGltaXphdGlvbiBmYWlsdXJlcy4KK2NsYXNzIERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uRmFpbHVyZSA6IHB1YmxpYyBEaWFnbm9zdGljSW5mb0lST3B0aW1pemF0aW9uIHsKK3B1YmxpYzoKKyAgLy8vIFxwIEZuIGlzIHRoZSBmdW5jdGlvbiB3aGVyZSB0aGUgZGlhZ25vc3RpYyBpcyBiZWluZyBlbWl0dGVkLiBccCBMb2MgaXMKKyAgLy8vIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byB1c2UgaW4gdGhlIGRpYWdub3N0aWMuIElmIGxpbmUgdGFibGUKKyAgLy8vIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSwgdGhlIGRpYWdub3N0aWMgd2lsbCBpbmNsdWRlIHRoZSBzb3VyY2UgY29kZQorICAvLy8gbG9jYXRpb24uIFxwIE1zZyBpcyB0aGUgbWVzc2FnZSB0byBzaG93LiBOb3RlIHRoYXQgdGhpcyBjbGFzcyBkb2VzIG5vdAorICAvLy8gY29weSB0aGlzIG1lc3NhZ2UsIHNvIHRoaXMgcmVmZXJlbmNlIG11c3QgYmUgdmFsaWQgZm9yIHRoZSB3aG9sZSBsaWZlIHRpbWUKKyAgLy8vIG9mIHRoZSBkaWFnbm9zdGljLgorICBEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkZhaWx1cmUoY29uc3QgRnVuY3Rpb24gJkZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGlhZ25vc3RpY0xvY2F0aW9uICZMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTXNnKQorICAgICAgOiBEaWFnbm9zdGljSW5mb0lST3B0aW1pemF0aW9uKERLX09wdGltaXphdGlvbkZhaWx1cmUsIERTX1dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0ciwgRm4sIExvYywgTXNnKSB7fQorCisgIC8vLyBccCBQYXNzTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgcGFzcyBlbWl0dGluZyB0aGlzIGRpYWdub3N0aWMuICBccAorICAvLy8gUmVtYXJrTmFtZSBpcyBhIHRleHR1YWwgaWRlbnRpZmllciBmb3IgdGhlIHJlbWFyayAoc2luZ2xlLXdvcmQsCisgIC8vLyBjYW1lbC1jYXNlKS4gIFxwIExvYyBpcyB0aGUgZGVidWcgbG9jYXRpb24gYW5kIFxwIENvZGVSZWdpb24gaXMgdGhlCisgIC8vLyByZWdpb24gdGhhdCB0aGUgb3B0aW1pemF0aW9uIG9wZXJhdGVzIG9uIChjdXJyZW50bHkgYmFzaWMgYmxvY2sgaXMKKyAgLy8vIHN1cHBvcnRlZCkuCisgIERpYWdub3N0aWNJbmZvT3B0aW1pemF0aW9uRmFpbHVyZShjb25zdCBjaGFyICpQYXNzTmFtZSwgU3RyaW5nUmVmIFJlbWFya05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEaWFnbm9zdGljTG9jYXRpb24gJkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpDb2RlUmVnaW9uKTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERpYWdub3N0aWNJbmZvICpESSkgeworICAgIHJldHVybiBESS0+Z2V0S2luZCgpID09IERLX09wdGltaXphdGlvbkZhaWx1cmU7CisgIH0KKworICAvLy8gXHNlZSBEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2U6OmlzRW5hYmxlZC4KKyAgYm9vbCBpc0VuYWJsZWQoKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vLyBEaWFnbm9zdGljIGluZm9ybWF0aW9uIGZvciB1bnN1cHBvcnRlZCBmZWF0dXJlIGluIGJhY2tlbmQuCitjbGFzcyBEaWFnbm9zdGljSW5mb1Vuc3VwcG9ydGVkIDogcHVibGljIERpYWdub3N0aWNJbmZvV2l0aExvY2F0aW9uQmFzZSB7Citwcml2YXRlOgorICBUd2luZSBNc2c7CisKK3B1YmxpYzoKKyAgLy8vIFxwIEZuIGlzIHRoZSBmdW5jdGlvbiB3aGVyZSB0aGUgZGlhZ25vc3RpYyBpcyBiZWluZyBlbWl0dGVkLiBccCBMb2MgaXMKKyAgLy8vIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiB0byB1c2UgaW4gdGhlIGRpYWdub3N0aWMuIElmIGxpbmUgdGFibGUKKyAgLy8vIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSwgdGhlIGRpYWdub3N0aWMgd2lsbCBpbmNsdWRlIHRoZSBzb3VyY2UgY29kZQorICAvLy8gbG9jYXRpb24uIFxwIE1zZyBpcyB0aGUgbWVzc2FnZSB0byBzaG93LiBOb3RlIHRoYXQgdGhpcyBjbGFzcyBkb2VzIG5vdAorICAvLy8gY29weSB0aGlzIG1lc3NhZ2UsIHNvIHRoaXMgcmVmZXJlbmNlIG11c3QgYmUgdmFsaWQgZm9yIHRoZSB3aG9sZSBsaWZlIHRpbWUKKyAgLy8vIG9mIHRoZSBkaWFnbm9zdGljLgorICBEaWFnbm9zdGljSW5mb1Vuc3VwcG9ydGVkKAorICAgICAgY29uc3QgRnVuY3Rpb24gJkZuLCBjb25zdCBUd2luZSAmTXNnLAorICAgICAgY29uc3QgRGlhZ25vc3RpY0xvY2F0aW9uICZMb2MgPSBEaWFnbm9zdGljTG9jYXRpb24oKSwKKyAgICAgIERpYWdub3N0aWNTZXZlcml0eSBTZXZlcml0eSA9IERTX0Vycm9yKQorICAgICAgOiBEaWFnbm9zdGljSW5mb1dpdGhMb2NhdGlvbkJhc2UoREtfVW5zdXBwb3J0ZWQsIFNldmVyaXR5LCBGbiwgTG9jKSwKKyAgICAgICAgTXNnKE1zZykge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IERpYWdub3N0aWNJbmZvICpESSkgeworICAgIHJldHVybiBESS0+Z2V0S2luZCgpID09IERLX1Vuc3VwcG9ydGVkOworICB9CisKKyAgY29uc3QgVHdpbmUgJmdldE1lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBNc2c7IH0KKworICB2b2lkIHByaW50KERpYWdub3N0aWNQcmludGVyICZEUCkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCituYW1lc3BhY2UgeWFtbCB7Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxEaWFnbm9zdGljSW5mb09wdGltaXphdGlvbkJhc2UgKj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZpbywgRGlhZ25vc3RpY0luZm9PcHRpbWl6YXRpb25CYXNlIComT3B0RGlhZyk7Cit9OworfSAvLyBuYW1lc3BhY2UgeWFtbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9ESUFHTk9TVElDSU5GT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RpYWdub3N0aWNQcmludGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RpYWdub3N0aWNQcmludGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTljODMyOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvRGlhZ25vc3RpY1ByaW50ZXIuaApAQCAtMCwwICsxLDk2IEBACisvLz09PS0gbGx2bS9TdXBwb3J0L0RpYWdub3N0aWNQcmludGVyLmggLSBEaWFnbm9zdGljIFByaW50ZXIgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgbWFpbiBpbnRlcmZhY2UgZm9yIHByaW50ZXIgYmFja2VuZCBkaWFnbm9zdGljLgorLy8KKy8vIENsaWVudHMgb2YgdGhlIGJhY2tlbmQgZGlhZ25vc3RpY3Mgc2hvdWxkIG92ZXJsb2FkIHRoaXMgaW50ZXJmYWNlIGJhc2VkCisvLyBvbiB0aGVpciBuZWVkcy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9ESUFHTk9TVElDUFJJTlRFUl9ICisjZGVmaW5lIExMVk1fSVJfRElBR05PU1RJQ1BSSU5URVJfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vIEZvcndhcmQgZGVjbGFyYXRpb25zLgorY2xhc3MgTW9kdWxlOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBTTURpYWdub3N0aWM7CitjbGFzcyBTdHJpbmdSZWY7CitjbGFzcyBUd2luZTsKK2NsYXNzIFZhbHVlOworCisvLy8gXGJyaWVmIEludGVyZmFjZSBmb3IgY3VzdG9tIGRpYWdub3N0aWMgcHJpbnRpbmcuCitjbGFzcyBEaWFnbm9zdGljUHJpbnRlciB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkRpYWdub3N0aWNQcmludGVyKCkgPSBkZWZhdWx0OworCisgIC8vIFNpbXBsZSB0eXBlcy4KKyAgdmlydHVhbCBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PChjaGFyIEMpID0gMDsKKyAgdmlydHVhbCBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PCh1bnNpZ25lZCBjaGFyIEMpID0gMDsKKyAgdmlydHVhbCBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PChzaWduZWQgY2hhciBDKSA9IDA7CisgIHZpcnR1YWwgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwoU3RyaW5nUmVmIFN0cikgPSAwOworICB2aXJ0dWFsIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KGNvbnN0IGNoYXIgKlN0cikgPSAwOworICB2aXJ0dWFsIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KGNvbnN0IHN0ZDo6c3RyaW5nICZTdHIpID0gMDsKKyAgdmlydHVhbCBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIE4pID0gMDsKKyAgdmlydHVhbCBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PChsb25nIE4pID0gMDsKKyAgdmlydHVhbCBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PCh1bnNpZ25lZCBsb25nIGxvbmcgTikgPSAwOworICB2aXJ0dWFsIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KGxvbmcgbG9uZyBOKSA9IDA7CisgIHZpcnR1YWwgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwoY29uc3Qgdm9pZCAqUCkgPSAwOworICB2aXJ0dWFsIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KHVuc2lnbmVkIGludCBOKSA9IDA7CisgIHZpcnR1YWwgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwoaW50IE4pID0gMDsKKyAgdmlydHVhbCBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PChkb3VibGUgTikgPSAwOworICB2aXJ0dWFsIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KGNvbnN0IFR3aW5lICZTdHIpID0gMDsKKworICAvLyBJUiByZWxhdGVkIHR5cGVzLgorICB2aXJ0dWFsIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KGNvbnN0IFZhbHVlICZWKSA9IDA7CisgIHZpcnR1YWwgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwoY29uc3QgTW9kdWxlICZNKSA9IDA7CisKKyAgLy8gT3RoZXIgdHlwZXMuCisgIHZpcnR1YWwgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwoY29uc3QgU01EaWFnbm9zdGljICZEaWFnKSA9IDA7Cit9OworCisvLy8gXGJyaWVmIEJhc2ljIGRpYWdub3N0aWMgcHJpbnRlciB0aGF0IHVzZXMgYW4gdW5kZXJseWluZyByYXdfb3N0cmVhbS4KK2NsYXNzIERpYWdub3N0aWNQcmludGVyUmF3T1N0cmVhbSA6IHB1YmxpYyBEaWFnbm9zdGljUHJpbnRlciB7Citwcm90ZWN0ZWQ6CisgIHJhd19vc3RyZWFtICZTdHJlYW07CisKK3B1YmxpYzoKKyAgRGlhZ25vc3RpY1ByaW50ZXJSYXdPU3RyZWFtKHJhd19vc3RyZWFtICZTdHJlYW0pIDogU3RyZWFtKFN0cmVhbSkge30KKworICAvLyBTaW1wbGUgdHlwZXMuCisgIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KGNoYXIgQykgb3ZlcnJpZGU7CisgIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KHVuc2lnbmVkIGNoYXIgQykgb3ZlcnJpZGU7CisgIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KHNpZ25lZCBjaGFyIEMpIG92ZXJyaWRlOworICBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PChTdHJpbmdSZWYgU3RyKSBvdmVycmlkZTsKKyAgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwoY29uc3QgY2hhciAqU3RyKSBvdmVycmlkZTsKKyAgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwoY29uc3Qgc3RkOjpzdHJpbmcgJlN0cikgb3ZlcnJpZGU7CisgIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KHVuc2lnbmVkIGxvbmcgTikgb3ZlcnJpZGU7CisgIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KGxvbmcgTikgb3ZlcnJpZGU7CisgIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KHVuc2lnbmVkIGxvbmcgbG9uZyBOKSBvdmVycmlkZTsKKyAgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwobG9uZyBsb25nIE4pIG92ZXJyaWRlOworICBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PChjb25zdCB2b2lkICpQKSBvdmVycmlkZTsKKyAgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwodW5zaWduZWQgaW50IE4pIG92ZXJyaWRlOworICBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PChpbnQgTikgb3ZlcnJpZGU7CisgIERpYWdub3N0aWNQcmludGVyICZvcGVyYXRvcjw8KGRvdWJsZSBOKSBvdmVycmlkZTsKKyAgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwoY29uc3QgVHdpbmUgJlN0cikgb3ZlcnJpZGU7CisKKyAgLy8gSVIgcmVsYXRlZCB0eXBlcy4KKyAgRGlhZ25vc3RpY1ByaW50ZXIgJm9wZXJhdG9yPDwoY29uc3QgVmFsdWUgJlYpIG92ZXJyaWRlOworICBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PChjb25zdCBNb2R1bGUgJk0pIG92ZXJyaWRlOworCisgIC8vIE90aGVyIHR5cGVzLgorICBEaWFnbm9zdGljUHJpbnRlciAmb3BlcmF0b3I8PChjb25zdCBTTURpYWdub3N0aWMgJkRpYWcpIG92ZXJyaWRlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfRElBR05PU1RJQ1BSSU5URVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Eb21pbmF0b3JzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0RvbWluYXRvcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjgxMWJjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Eb21pbmF0b3JzLmgKQEAgLTAsMCArMSwzNjkgQEAKKy8vPT09LSBEb21pbmF0b3JzLmggLSBEb21pbmF0b3IgSW5mbyBDYWxjdWxhdGlvbiAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIERvbWluYXRvclRyZWUgY2xhc3MsIHdoaWNoIHByb3ZpZGVzIGZhc3QgYW5kIGVmZmljaWVudAorLy8gZG9taW5hbmNlIHF1ZXJpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0RPTUlOQVRPUlNfSAorI2RlZmluZSBMTFZNX0lSX0RPTUlOQVRPUlNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXBJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVwdGhGaXJzdEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9IYXNoaW5nLmgiCisjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DRkcuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0dlbmVyaWNEb21UcmVlLmgiCisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgTW9kdWxlOworY2xhc3MgcmF3X29zdHJlYW07CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBEb21UcmVlTm9kZUJhc2U8QmFzaWNCbG9jaz47CitleHRlcm4gdGVtcGxhdGUgY2xhc3MgRG9taW5hdG9yVHJlZUJhc2U8QmFzaWNCbG9jaywgZmFsc2U+OyAvLyBEb21UcmVlCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgRG9taW5hdG9yVHJlZUJhc2U8QmFzaWNCbG9jaywgdHJ1ZT47IC8vIFBvc3REb21UcmVlCisKK25hbWVzcGFjZSBEb21UcmVlQnVpbGRlciB7Cit1c2luZyBCQkRvbVRyZWUgPSBEb21UcmVlQmFzZTxCYXNpY0Jsb2NrPjsKK3VzaW5nIEJCUG9zdERvbVRyZWUgPSBQb3N0RG9tVHJlZUJhc2U8QmFzaWNCbG9jaz47CisKK2V4dGVybiB0ZW1wbGF0ZSBzdHJ1Y3QgVXBkYXRlPEJhc2ljQmxvY2sgKj47CisKK3VzaW5nIEJCVXBkYXRlcyA9IEFycmF5UmVmPFVwZGF0ZTxCYXNpY0Jsb2NrICo+PjsKKworZXh0ZXJuIHRlbXBsYXRlIHZvaWQgQ2FsY3VsYXRlPEJCRG9tVHJlZT4oQkJEb21UcmVlICZEVCk7CitleHRlcm4gdGVtcGxhdGUgdm9pZCBDYWxjdWxhdGU8QkJQb3N0RG9tVHJlZT4oQkJQb3N0RG9tVHJlZSAmRFQpOworCitleHRlcm4gdGVtcGxhdGUgdm9pZCBJbnNlcnRFZGdlPEJCRG9tVHJlZT4oQkJEb21UcmVlICZEVCwgQmFzaWNCbG9jayAqRnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpUbyk7CitleHRlcm4gdGVtcGxhdGUgdm9pZCBJbnNlcnRFZGdlPEJCUG9zdERvbVRyZWU+KEJCUG9zdERvbVRyZWUgJkRULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpUbyk7CisKK2V4dGVybiB0ZW1wbGF0ZSB2b2lkIERlbGV0ZUVkZ2U8QkJEb21UcmVlPihCQkRvbVRyZWUgJkRULCBCYXNpY0Jsb2NrICpGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKlRvKTsKK2V4dGVybiB0ZW1wbGF0ZSB2b2lkIERlbGV0ZUVkZ2U8QkJQb3N0RG9tVHJlZT4oQkJQb3N0RG9tVHJlZSAmRFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKlRvKTsKKworZXh0ZXJuIHRlbXBsYXRlIHZvaWQgQXBwbHlVcGRhdGVzPEJCRG9tVHJlZT4oQkJEb21UcmVlICZEVCwgQkJVcGRhdGVzKTsKK2V4dGVybiB0ZW1wbGF0ZSB2b2lkIEFwcGx5VXBkYXRlczxCQlBvc3REb21UcmVlPihCQlBvc3REb21UcmVlICZEVCwgQkJVcGRhdGVzKTsKKworZXh0ZXJuIHRlbXBsYXRlIGJvb2wgVmVyaWZ5PEJCRG9tVHJlZT4oY29uc3QgQkJEb21UcmVlICZEVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCRG9tVHJlZTo6VmVyaWZpY2F0aW9uTGV2ZWwgVkwpOworZXh0ZXJuIHRlbXBsYXRlIGJvb2wgVmVyaWZ5PEJCUG9zdERvbVRyZWU+KGNvbnN0IEJCUG9zdERvbVRyZWUgJkRULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJCUG9zdERvbVRyZWU6OlZlcmlmaWNhdGlvbkxldmVsIFZMKTsKK30gIC8vIG5hbWVzcGFjZSBEb21UcmVlQnVpbGRlcgorCit1c2luZyBEb21UcmVlTm9kZSA9IERvbVRyZWVOb2RlQmFzZTxCYXNpY0Jsb2NrPjsKKworY2xhc3MgQmFzaWNCbG9ja0VkZ2UgeworICBjb25zdCBCYXNpY0Jsb2NrICpTdGFydDsKKyAgY29uc3QgQmFzaWNCbG9jayAqRW5kOworCitwdWJsaWM6CisgIEJhc2ljQmxvY2tFZGdlKGNvbnN0IEJhc2ljQmxvY2sgKlN0YXJ0XywgY29uc3QgQmFzaWNCbG9jayAqRW5kXykgOgorICAgIFN0YXJ0KFN0YXJ0XyksIEVuZChFbmRfKSB7fQorCisgIEJhc2ljQmxvY2tFZGdlKGNvbnN0IHN0ZDo6cGFpcjxCYXNpY0Jsb2NrICosIEJhc2ljQmxvY2sgKj4gJlBhaXIpCisgICAgICA6IFN0YXJ0KFBhaXIuZmlyc3QpLCBFbmQoUGFpci5zZWNvbmQpIHt9CisKKyAgQmFzaWNCbG9ja0VkZ2UoY29uc3Qgc3RkOjpwYWlyPGNvbnN0IEJhc2ljQmxvY2sgKiwgY29uc3QgQmFzaWNCbG9jayAqPiAmUGFpcikKKyAgICAgIDogU3RhcnQoUGFpci5maXJzdCksIEVuZChQYWlyLnNlY29uZCkge30KKworICBjb25zdCBCYXNpY0Jsb2NrICpnZXRTdGFydCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RhcnQ7CisgIH0KKworICBjb25zdCBCYXNpY0Jsb2NrICpnZXRFbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIEVuZDsKKyAgfQorCisgIC8vLyBDaGVjayBpZiB0aGlzIGlzIHRoZSBvbmx5IGVkZ2UgYmV0d2VlbiBTdGFydCBhbmQgRW5kLgorICBib29sIGlzU2luZ2xlRWRnZSgpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IERlbnNlTWFwSW5mbzxCYXNpY0Jsb2NrRWRnZT4geworICB1c2luZyBCQkluZm8gPSBEZW5zZU1hcEluZm88Y29uc3QgQmFzaWNCbG9jayAqPjsKKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IEJhc2ljQmxvY2tFZGdlICpWKTsKKworICBzdGF0aWMgaW5saW5lIEJhc2ljQmxvY2tFZGdlIGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiBCYXNpY0Jsb2NrRWRnZShCQkluZm86OmdldEVtcHR5S2V5KCksIEJCSW5mbzo6Z2V0RW1wdHlLZXkoKSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIEJhc2ljQmxvY2tFZGdlIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gQmFzaWNCbG9ja0VkZ2UoQkJJbmZvOjpnZXRUb21ic3RvbmVLZXkoKSwgQkJJbmZvOjpnZXRUb21ic3RvbmVLZXkoKSk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IEJhc2ljQmxvY2tFZGdlICZFZGdlKSB7CisgICAgcmV0dXJuIGhhc2hfY29tYmluZShCQkluZm86OmdldEhhc2hWYWx1ZShFZGdlLmdldFN0YXJ0KCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgQkJJbmZvOjpnZXRIYXNoVmFsdWUoRWRnZS5nZXRFbmQoKSkpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBCYXNpY0Jsb2NrRWRnZSAmTEhTLCBjb25zdCBCYXNpY0Jsb2NrRWRnZSAmUkhTKSB7CisgICAgcmV0dXJuIEJCSW5mbzo6aXNFcXVhbChMSFMuZ2V0U3RhcnQoKSwgUkhTLmdldFN0YXJ0KCkpICYmCisgICAgICAgICAgIEJCSW5mbzo6aXNFcXVhbChMSFMuZ2V0RW5kKCksIFJIUy5nZXRFbmQoKSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQ29uY3JldGUgc3ViY2xhc3Mgb2YgRG9taW5hdG9yVHJlZUJhc2UgdGhhdCBpcyB1c2VkIHRvIGNvbXB1dGUgYQorLy8vIG5vcm1hbCBkb21pbmF0b3IgdHJlZS4KKy8vLworLy8vIERlZmluaXRpb246IEEgYmxvY2sgaXMgc2FpZCB0byBiZSBmb3J3YXJkIHN0YXRpY2FsbHkgcmVhY2hhYmxlIGlmIHRoZXJlIGlzCisvLy8gYSBwYXRoIGZyb20gdGhlIGVudHJ5IG9mIHRoZSBmdW5jdGlvbiB0byB0aGUgYmxvY2suICBBIHN0YXRpY2FsbHkgcmVhY2hhYmxlCisvLy8gYmxvY2sgbWF5IGJlY29tZSBzdGF0aWNhbGx5IHVucmVhY2hhYmxlIGR1cmluZyBvcHRpbWl6YXRpb24uCisvLy8KKy8vLyBBIGZvcndhcmQgdW5yZWFjaGFibGUgYmxvY2sgbWF5IGFwcGVhciBpbiB0aGUgZG9taW5hdG9yIHRyZWUsIG9yIGl0IG1heQorLy8vIG5vdC4gIElmIGl0IGRvZXMsIGRvbWluYW5jZSBxdWVyaWVzIHdpbGwgcmV0dXJuIHJlc3VsdHMgYXMgaWYgYWxsIHJlYWNoYWJsZQorLy8vIGJsb2NrcyBkb21pbmF0ZSBpdC4gIFdoZW4gYXNraW5nIGZvciBhIE5vZGUgY29ycmVzcG9uZGluZyB0byBhIHBvdGVudGlhbGx5CisvLy8gdW5yZWFjaGFibGUgYmxvY2ssIGNhbGxpbmcgY29kZSBtdXN0IGhhbmRsZSB0aGUgY2FzZSB3aGVyZSB0aGUgYmxvY2sgd2FzCisvLy8gdW5yZWFjaGFibGUgYW5kIHRoZSByZXN1bHQgb2YgZ2V0Tm9kZSgpIGlzIG51bGxwdHIuCisvLy8KKy8vLyBHZW5lcmFsbHksIGEgYmxvY2sga25vd24gdG8gYmUgdW5yZWFjaGFibGUgd2hlbiB0aGUgZG9taW5hdG9yIHRyZWUgaXMKKy8vLyBjb25zdHJ1Y3RlZCB3aWxsIG5vdCBiZSBpbiB0aGUgdHJlZS4gIE9uZSB3aGljaCBiZWNvbWVzIHVucmVhY2hhYmxlIGFmdGVyCisvLy8gdGhlIGRvbWluYXRvciB0cmVlIGlzIGluaXRpYWxseSBjb25zdHJ1Y3RlZCBtYXkgc3RpbGwgZXhpc3QgaW4gdGhlIHRyZWUsCisvLy8gZXZlbiBpZiB0aGUgdHJlZSBpcyBwcm9wZXJseSB1cGRhdGVkLiBDYWxsaW5nIGNvZGUgc2hvdWxkIG5vdCByZWx5IG9uIHRoZQorLy8vIHByZWNlZGluZyBzdGF0ZW1lbnRzOyB0aGlzIGlzIHN0YXRlZCBvbmx5IHRvIGFzc2lzdCBodW1hbiB1bmRlcnN0YW5kaW5nLgorY2xhc3MgRG9taW5hdG9yVHJlZSA6IHB1YmxpYyBEb21pbmF0b3JUcmVlQmFzZTxCYXNpY0Jsb2NrLCBmYWxzZT4geworIHB1YmxpYzoKKyAgdXNpbmcgQmFzZSA9IERvbWluYXRvclRyZWVCYXNlPEJhc2ljQmxvY2ssIGZhbHNlPjsKKworICBEb21pbmF0b3JUcmVlKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBEb21pbmF0b3JUcmVlKEZ1bmN0aW9uICZGKSB7IHJlY2FsY3VsYXRlKEYpOyB9CisKKyAgLy8vIEhhbmRsZSBpbnZhbGlkYXRpb24gZXhwbGljaXRseS4KKyAgYm9vbCBpbnZhbGlkYXRlKEZ1bmN0aW9uICZGLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmUEEsCisgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlcjo6SW52YWxpZGF0b3IgJik7CisKKyAgLy8gRW5zdXJlIGJhc2UtY2xhc3Mgb3ZlcmxvYWRzIGFyZSB2aXNpYmxlLgorICB1c2luZyBCYXNlOjpkb21pbmF0ZXM7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBEZWYgZG9taW5hdGVzIGEgdXNlIGluIFVzZXIuCisgIC8vLworICAvLy8gVGhpcyBwZXJmb3JtcyB0aGUgc3BlY2lhbCBjaGVja3MgbmVjZXNzYXJ5IGlmIERlZiBhbmQgVXNlciBhcmUgaW4gdGhlIHNhbWUKKyAgLy8vIGJhc2ljIGJsb2NrLiBOb3RlIHRoYXQgRGVmIGRvZXNuJ3QgZG9taW5hdGUgYSB1c2UgaW4gRGVmIGl0c2VsZiEKKyAgYm9vbCBkb21pbmF0ZXMoY29uc3QgSW5zdHJ1Y3Rpb24gKkRlZiwgY29uc3QgVXNlICZVKSBjb25zdDsKKyAgYm9vbCBkb21pbmF0ZXMoY29uc3QgSW5zdHJ1Y3Rpb24gKkRlZiwgY29uc3QgSW5zdHJ1Y3Rpb24gKlVzZXIpIGNvbnN0OworICBib29sIGRvbWluYXRlcyhjb25zdCBJbnN0cnVjdGlvbiAqRGVmLCBjb25zdCBCYXNpY0Jsb2NrICpCQikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGFuIGVkZ2UgZG9taW5hdGVzIGEgdXNlLgorICAvLy8KKyAgLy8vIElmIEJCRSBpcyBub3QgYSB1bmlxdWUgZWRnZSBiZXR3ZWVuIHN0YXJ0IGFuZCBlbmQgb2YgdGhlIGVkZ2UsIGl0IGNhbgorICAvLy8gbmV2ZXIgZG9taW5hdGUgdGhlIHVzZS4KKyAgYm9vbCBkb21pbmF0ZXMoY29uc3QgQmFzaWNCbG9ja0VkZ2UgJkJCRSwgY29uc3QgVXNlICZVKSBjb25zdDsKKyAgYm9vbCBkb21pbmF0ZXMoY29uc3QgQmFzaWNCbG9ja0VkZ2UgJkJCRSwgY29uc3QgQmFzaWNCbG9jayAqQkIpIGNvbnN0OworCisgIC8vIEVuc3VyZSBiYXNlIGNsYXNzIG92ZXJsb2FkcyBhcmUgdmlzaWJsZS4KKyAgdXNpbmcgQmFzZTo6aXNSZWFjaGFibGVGcm9tRW50cnk7CisKKyAgLy8vIFxicmllZiBQcm92aWRlIGFuIG92ZXJsb2FkIGZvciBhIFVzZS4KKyAgYm9vbCBpc1JlYWNoYWJsZUZyb21FbnRyeShjb25zdCBVc2UgJlUpIGNvbnN0OworCisgIC8vIFBvcCB1cCBhIEdyYXBoVml6L2d2IHdpbmRvdyB3aXRoIHRoZSBEb21pbmF0b3IgVHJlZSByZW5kZXJlZCB1c2luZyBgZG90YC4KKyAgdm9pZCB2aWV3R3JhcGgoY29uc3QgVHdpbmUgJk5hbWUsIGNvbnN0IFR3aW5lICZUaXRsZSk7CisgIHZvaWQgdmlld0dyYXBoKCk7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERvbWluYXRvclRyZWUgR3JhcGhUcmFpdHMgc3BlY2lhbGl6YXRpb25zIHNvIHRoZSBEb21pbmF0b3JUcmVlIGNhbiBiZQorLy8gaXRlcmFibGUgYnkgZ2VuZXJpYyBncmFwaCBpdGVyYXRvcnMuCisKK3RlbXBsYXRlIDxjbGFzcyBOb2RlLCBjbGFzcyBDaGlsZEl0ZXJhdG9yPiBzdHJ1Y3QgRG9tVHJlZUdyYXBoVHJhaXRzQmFzZSB7CisgIHVzaW5nIE5vZGVSZWYgPSBOb2RlICo7CisgIHVzaW5nIENoaWxkSXRlcmF0b3JUeXBlID0gQ2hpbGRJdGVyYXRvcjsKKyAgdXNpbmcgbm9kZXNfaXRlcmF0b3IgPSBkZl9pdGVyYXRvcjxOb2RlICosIGRmX2l0ZXJhdG9yX2RlZmF1bHRfc2V0PE5vZGUqPj47CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKE5vZGVSZWYgTikgeyByZXR1cm4gTjsgfQorICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7IHJldHVybiBOLT5iZWdpbigpOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7IHJldHVybiBOLT5lbmQoKTsgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihOb2RlUmVmIE4pIHsKKyAgICByZXR1cm4gZGZfYmVnaW4oZ2V0RW50cnlOb2RlKE4pKTsKKyAgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19lbmQoTm9kZVJlZiBOKSB7IHJldHVybiBkZl9lbmQoZ2V0RW50cnlOb2RlKE4pKTsgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBHcmFwaFRyYWl0czxEb21UcmVlTm9kZSAqPgorICAgIDogcHVibGljIERvbVRyZWVHcmFwaFRyYWl0c0Jhc2U8RG9tVHJlZU5vZGUsIERvbVRyZWVOb2RlOjppdGVyYXRvcj4ge307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgR3JhcGhUcmFpdHM8Y29uc3QgRG9tVHJlZU5vZGUgKj4KKyAgICA6IHB1YmxpYyBEb21UcmVlR3JhcGhUcmFpdHNCYXNlPGNvbnN0IERvbVRyZWVOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9tVHJlZU5vZGU6OmNvbnN0X2l0ZXJhdG9yPiB7fTsKKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPERvbWluYXRvclRyZWUqPgorICA6IHB1YmxpYyBHcmFwaFRyYWl0czxEb21UcmVlTm9kZSo+IHsKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKERvbWluYXRvclRyZWUgKkRUKSB7IHJldHVybiBEVC0+Z2V0Um9vdE5vZGUoKTsgfQorCisgIHN0YXRpYyBub2Rlc19pdGVyYXRvciBub2Rlc19iZWdpbihEb21pbmF0b3JUcmVlICpOKSB7CisgICAgcmV0dXJuIGRmX2JlZ2luKGdldEVudHJ5Tm9kZShOKSk7CisgIH0KKworICBzdGF0aWMgbm9kZXNfaXRlcmF0b3Igbm9kZXNfZW5kKERvbWluYXRvclRyZWUgKk4pIHsKKyAgICByZXR1cm4gZGZfZW5kKGdldEVudHJ5Tm9kZShOKSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQW5hbHlzaXMgcGFzcyB3aGljaCBjb21wdXRlcyBhIFxjIERvbWluYXRvclRyZWUuCitjbGFzcyBEb21pbmF0b3JUcmVlQW5hbHlzaXMgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48RG9taW5hdG9yVHJlZUFuYWx5c2lzPiB7CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxEb21pbmF0b3JUcmVlQW5hbHlzaXM+OworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgUHJvdmlkZSB0aGUgcmVzdWx0IHR5cGVkZWYgZm9yIHRoaXMgYW5hbHlzaXMgcGFzcy4KKyAgdXNpbmcgUmVzdWx0ID0gRG9taW5hdG9yVHJlZTsKKworICAvLy8gXGJyaWVmIFJ1biB0aGUgYW5hbHlzaXMgcGFzcyBvdmVyIGEgZnVuY3Rpb24gYW5kIHByb2R1Y2UgYSBkb21pbmF0b3IgdHJlZS4KKyAgRG9taW5hdG9yVHJlZSBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICYpOworfTsKKworLy8vIFxicmllZiBQcmludGVyIHBhc3MgZm9yIHRoZSBcYyBEb21pbmF0b3JUcmVlLgorY2xhc3MgRG9taW5hdG9yVHJlZVByaW50ZXJQYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxEb21pbmF0b3JUcmVlUHJpbnRlclBhc3M+IHsKKyAgcmF3X29zdHJlYW0gJk9TOworCitwdWJsaWM6CisgIGV4cGxpY2l0IERvbWluYXRvclRyZWVQcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmT1MpOworCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBcYnJpZWYgVmVyaWZpZXIgcGFzcyBmb3IgdGhlIFxjIERvbWluYXRvclRyZWUuCitzdHJ1Y3QgRG9taW5hdG9yVHJlZVZlcmlmaWVyUGFzcyA6IFBhc3NJbmZvTWl4aW48RG9taW5hdG9yVHJlZVZlcmlmaWVyUGFzcz4geworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gXGJyaWVmIExlZ2FjeSBhbmFseXNpcyBwYXNzIHdoaWNoIGNvbXB1dGVzIGEgXGMgRG9taW5hdG9yVHJlZS4KK2NsYXNzIERvbWluYXRvclRyZWVXcmFwcGVyUGFzcyA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICBEb21pbmF0b3JUcmVlIERUOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIERvbWluYXRvclRyZWVXcmFwcGVyUGFzcygpIDogRnVuY3Rpb25QYXNzKElEKSB7CisgICAgaW5pdGlhbGl6ZURvbWluYXRvclRyZWVXcmFwcGVyUGFzc1Bhc3MoKlBhc3NSZWdpc3RyeTo6Z2V0UGFzc1JlZ2lzdHJ5KCkpOworICB9CisKKyAgRG9taW5hdG9yVHJlZSAmZ2V0RG9tVHJlZSgpIHsgcmV0dXJuIERUOyB9CisgIGNvbnN0IERvbWluYXRvclRyZWUgJmdldERvbVRyZWUoKSBjb25zdCB7IHJldHVybiBEVDsgfQorCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgb3ZlcnJpZGU7CisKKyAgdm9pZCB2ZXJpZnlBbmFseXNpcygpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIEFVLnNldFByZXNlcnZlc0FsbCgpOworICB9CisKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgb3ZlcnJpZGUgeyBEVC5yZWxlYXNlTWVtb3J5KCk7IH0KKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlICpNID0gbnVsbHB0cikgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLyBcYnJpZWYgQ2xhc3MgdG8gZGVmZXIgdXBkYXRlcyB0byBhIERvbWluYXRvclRyZWUuCisvLy8KKy8vLyBEZWZpbml0aW9uOiBBcHBseWluZyB1cGRhdGVzIHRvIGV2ZXJ5IGVkZ2UgaW5zZXJ0aW9uIGFuZCBkZWxldGlvbiBpcworLy8vIGV4cGVuc2l2ZSBhbmQgbm90IG5lY2Vzc2FyeS4gV2hlbiBvbmUgbmVlZHMgdGhlIERvbWluYXRvclRyZWUgZm9yIGFuYWx5c2lzCisvLy8gdGhleSBjYW4gcmVxdWVzdCBhIGZsdXNoKCkgdG8gcGVyZm9ybSBhIGxhcmdlciBiYXRjaCB1cGRhdGUuIFRoaXMgaGFzIHRoZQorLy8vIGFkdmFudGFnZSBvZiB0aGUgRG9taW5hdG9yVHJlZSBpbnNwZWN0aW5nIHRoZSBzZXQgb2YgdXBkYXRlcyB0byBmaW5kCisvLy8gZHVwbGljYXRlcyBvciB1bm5lY2Vzc2FyeSBzdWJ0cmVlIHVwZGF0ZXMuCisvLy8KKy8vLyBUaGUgc2NvcGUgb2YgRGVmZXJyZWREb21pbmFuY2Ugb3BlcmF0ZXMgYXQgYSBGdW5jdGlvbiBsZXZlbC4KKy8vLworLy8vIEl0IGlzIG5vdCBuZWNlc3NhcnkgZm9yIHRoZSB1c2VyIHRvIHNjcnViIHRoZSB1cGRhdGVzIGZvciBkdXBsaWNhdGVzIG9yCisvLy8gdXBkYXRlcyB0aGF0IHBvaW50IHRvIHRoZSBzYW1lIGJsb2NrIChEZWxldGUsIEJCX0EsIEJCX0EpLiBQZXJmb3JtYW5jZQorLy8vIGNhbiBiZSBnYWluZWQgaWYgdGhlIGNhbGxlciBhdHRlbXB0cyB0byBiYXRjaCB1cGRhdGVzIGJlZm9yZSBzdWJtaXR0aW5nCisvLy8gdG8gYXBwbHlVcGRhdGVzKEFycmF5UmVmKSBpbiBjYXNlcyB3aGVyZSBkdXBsaWNhdGUgZWRnZSByZXF1ZXN0cyB3aWxsCisvLy8gb2NjdXIuCisvLy8KKy8vLyBJdCBpcyByZXF1aXJlZCBmb3IgdGhlIHN0YXRlIG9mIHRoZSBMTFZNIElSIHRvIGJlIGFwcGxpZWQgKmJlZm9yZSoKKy8vLyBzdWJtaXR0aW5nIHVwZGF0ZXMuIFRoZSB1cGRhdGUgcm91dGluZXMgbXVzdCBhbmFseXplIHRoZSBjdXJyZW50IHN0YXRlCisvLy8gYmV0d2VlbiBhIHBhaXIgb2YgKEZyb20sIFRvKSBiYXNpYyBibG9ja3MgdG8gZGV0ZXJtaW5lIGlmIHRoZSB1cGRhdGUKKy8vLyBuZWVkcyB0byBiZSBxdWV1ZWQuCisvLy8gRXhhbXBsZSAoZ29vZCk6CisvLy8gICAgIFRlcm1pbmF0b3JJbnN0cnVjdGlvbkJCLT5yZW1vdmVGcm9tUGFyZW50KCk7CisvLy8gICAgIEREVC0+ZGVsZXRlRWRnZShCQiwgU3VjY2Vzc29yKTsKKy8vLyBFeGFtcGxlIChiYWQpOgorLy8vICAgICBERFQtPmRlbGV0ZUVkZ2UoQkIsIFN1Y2Nlc3Nvcik7CisvLy8gICAgIFRlcm1pbmF0b3JJbnN0cnVjdGlvbkJCLT5yZW1vdmVGcm9tUGFyZW50KCk7CitjbGFzcyBEZWZlcnJlZERvbWluYW5jZSB7CitwdWJsaWM6CisgIERlZmVycmVkRG9taW5hbmNlKERvbWluYXRvclRyZWUgJkRUXykgOiBEVChEVF8pIHt9CisKKyAgLy8vIFxicmllZiBRdWV1ZXMgbXVsdGlwbGUgdXBkYXRlcyBhbmQgZGlzY2FyZHMgZHVwbGljYXRlcy4KKyAgdm9pZCBhcHBseVVwZGF0ZXMoQXJyYXlSZWY8RG9taW5hdG9yVHJlZTo6VXBkYXRlVHlwZT4gVXBkYXRlcyk7CisKKyAgLy8vIFxicmllZiBIZWxwZXIgbWV0aG9kIGZvciBhIHNpbmdsZSBlZGdlIGluc2VydGlvbi4gSXQncyBhbG1vc3QgYWx3YXlzCisgIC8vLyBiZXR0ZXIgdG8gYmF0Y2ggdXBkYXRlcyBhbmQgY2FsbCBhcHBseVVwZGF0ZXMgdG8gcXVpY2tseSByZW1vdmUgZHVwbGljYXRlCisgIC8vLyBlZGdlcy4gVGhpcyBpcyBiZXN0IHVzZWQgd2hlbiB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIGluc2VydGlvbiBuZWVkZWQgdG8KKyAgLy8vIHVwZGF0ZSBEb21pbmF0b3JzLgorICB2b2lkIGluc2VydEVkZ2UoQmFzaWNCbG9jayAqRnJvbSwgQmFzaWNCbG9jayAqVG8pOworCisgIC8vLyBcYnJpZWYgSGVscGVyIG1ldGhvZCBmb3IgYSBzaW5nbGUgZWRnZSBkZWxldGlvbi4gSXQncyBhbG1vc3QgYWx3YXlzIGJldHRlcgorICAvLy8gdG8gYmF0Y2ggdXBkYXRlcyBhbmQgY2FsbCBhcHBseVVwZGF0ZXMgdG8gcXVpY2tseSByZW1vdmUgZHVwbGljYXRlIGVkZ2VzLgorICAvLy8gVGhpcyBpcyBiZXN0IHVzZWQgd2hlbiB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIGRlbGV0aW9uIG5lZWRlZCB0byB1cGRhdGUKKyAgLy8vIERvbWluYXRvcnMuCisgIHZvaWQgZGVsZXRlRWRnZShCYXNpY0Jsb2NrICpGcm9tLCBCYXNpY0Jsb2NrICpUbyk7CisKKyAgLy8vIFxicmllZiBEZWxheXMgdGhlIGRlbGV0aW9uIG9mIGEgYmFzaWMgYmxvY2sgdW50aWwgYSBmbHVzaCgpIGV2ZW50LgorICB2b2lkIGRlbGV0ZUJCKEJhc2ljQmxvY2sgKkRlbEJCKTsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBEZWxCQiBpcyBhd2FpdGluZyBkZWxldGlvbiBhdCBhIGZsdXNoKCkgZXZlbnQuCisgIGJvb2wgcGVuZGluZ0RlbGV0ZWRCQihCYXNpY0Jsb2NrICpEZWxCQik7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgcGVuZGluZyBEVCB1cGRhdGVzIGFyZSBxdWV1ZWQgZm9yIGEgZmx1c2goKSBldmVudC4KKyAgYm9vbCBwZW5kaW5nKCk7CisKKyAgLy8vIFxicmllZiBGbHVzaGVzIGFsbCBwZW5kaW5nIHVwZGF0ZXMgYW5kIGJsb2NrIGRlbGV0aW9ucy4gUmV0dXJucyBhCisgIC8vLyBjb3JyZWN0IERvbWluYXRvclRyZWUgcmVmZXJlbmNlIHRvIGJlIHVzZWQgYnkgdGhlIGNhbGxlciBmb3IgYW5hbHlzaXMuCisgIERvbWluYXRvclRyZWUgJmZsdXNoKCk7CisKKyAgLy8vIFxicmllZiBEcm9wcyBhbGwgaW50ZXJuYWwgc3RhdGUgYW5kIGZvcmNlcyBhIChzbG93KSByZWNhbGN1bGF0aW9uIG9mIHRoZQorICAvLy8gRG9taW5hdG9yVHJlZSBiYXNlZCBvbiB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgTExWTSBJUiBpbiBGLiBUaGlzIHNob3VsZAorICAvLy8gb25seSBiZSB1c2VkIGluIGNvcm5lciBjYXNlcyBzdWNoIGFzIHRoZSBFbnRyeSBibG9jayBvZiBGIGJlaW5nIGRlbGV0ZWQuCisgIHZvaWQgcmVjYWxjdWxhdGUoRnVuY3Rpb24gJkYpOworCisgIC8vLyBcYnJpZWYgRGVidWcgbWV0aG9kIHRvIGhlbHAgdmlldyB0aGUgc3RhdGUgb2YgcGVuZGluZyB1cGRhdGVzLgorICBMTFZNX0RVTVBfTUVUSE9EIHZvaWQgZHVtcCgpIGNvbnN0OworCitwcml2YXRlOgorICBEb21pbmF0b3JUcmVlICZEVDsKKyAgU21hbGxWZWN0b3I8RG9taW5hdG9yVHJlZTo6VXBkYXRlVHlwZSwgMTY+IFBlbmRVcGRhdGVzOworICBTbWFsbFB0clNldDxCYXNpY0Jsb2NrICosIDg+IERlbGV0ZWRCQnM7CisKKyAgLy8vIEFwcGx5IGFuIHVwZGF0ZSAoS2luZCwgRnJvbSwgVG8pIHRvIHRoZSBpbnRlcm5hbCBxdWV1ZWQgdXBkYXRlcy4gVGhlCisgIC8vLyB1cGRhdGUgaXMgb25seSBhZGRlZCB3aGVuIGRldGVybWluZWQgdG8gYmUgbmVjZXNzYXJ5LiBDaGVja3MgZm9yCisgIC8vLyBzZWxmLWRvbWluYXRpb24sIHVubmVjZXNzYXJ5IHVwZGF0ZXMsIGR1cGxpY2F0ZSByZXF1ZXN0cywgYW5kIGJhbGFuY2VkCisgIC8vLyBwYWlycyBvZiByZXF1ZXN0cyBhcmUgYWxsIHBlcmZvcm1lZC4gUmV0dXJucyB0cnVlIGlmIHRoZSB1cGRhdGUgaXMKKyAgLy8vIHF1ZXVlZCBhbmQgZmFsc2UgaWYgaXQgaXMgZGlzY2FyZGVkLgorICBib29sIGFwcGx5VXBkYXRlKERvbWluYXRvclRyZWU6OlVwZGF0ZUtpbmQgS2luZCwgQmFzaWNCbG9jayAqRnJvbSwKKyAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpUbyk7CisKKyAgLy8vIFBlcmZvcm1zIGFsbCBwZW5kaW5nIGJhc2ljIGJsb2NrIGRlbGV0aW9ucy4gV2UgaGF2ZSB0byBkZWZlciB0aGUgZGVsZXRpb24KKyAgLy8vIG9mIHRoZXNlIGJsb2NrcyB1bnRpbCBhZnRlciB0aGUgRG9taW5hdG9yVHJlZSB1cGRhdGVzIGFyZSBhcHBsaWVkLiBUaGUKKyAgLy8vIGludGVybmFsIHdvcmtpbmdzIG9mIHRoZSBEb21pbmF0b3JUcmVlIGNvZGUgZXhwZWN0IGV2ZXJ5IHVwZGF0ZSdzIEZyb20KKyAgLy8vIGFuZCBUbyBibG9ja3MgdG8gZXhpc3QgYW5kIHRvIGJlIGEgbWVtYmVyIG9mIHRoZSBzYW1lIEZ1bmN0aW9uLgorICBib29sIGZsdXNoRGVsQkIoKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0RPTUlOQVRPUlNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9GdW5jdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9GdW5jdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjOWQzNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0Z1bmN0aW9uLmgKQEAgLTAsMCArMSw3OTggQEAKKy8vPT09LSBsbHZtL0Z1bmN0aW9uLmggLSBDbGFzcyB0byByZXByZXNlbnQgYSBzaW5nbGUgZnVuY3Rpb24gLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgRnVuY3Rpb24gY2xhc3MsIHdoaWNoIHJlcHJlc2VudHMgYQorLy8gc2luZ2xlIGZ1bmN0aW9uL3Byb2NlZHVyZSBpbiBMTFZNLgorLy8KKy8vIEEgZnVuY3Rpb24gYmFzaWNhbGx5IGNvbnNpc3RzIG9mIGEgbGlzdCBvZiBiYXNpYyBibG9ja3MsIGEgbGlzdCBvZiBhcmd1bWVudHMsCisvLyBhbmQgYSBzeW1ib2wgdGFibGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0ZVTkNUSU9OX0gKKyNkZWZpbmUgTExWTV9JUl9GVU5DVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3Rfbm9kZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Bcmd1bWVudC5oIgorI2luY2x1ZGUgImxsdm0vSVIvQXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbGluZ0NvbnYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsT2JqZWN0LmgiCisjaW5jbHVkZSAibGx2bS9JUi9HbG9iYWxWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvT3BlcmFuZFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvU3ltYm9sVGFibGVMaXN0VHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgSW50cmluc2ljIHsKK2VudW0gSUQgOiB1bnNpZ25lZDsKK30KKworY2xhc3MgQXNzZW1ibHlBbm5vdGF0aW9uV3JpdGVyOworY2xhc3MgQ29uc3RhbnQ7CitjbGFzcyBESVN1YnByb2dyYW07CitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIE1vZHVsZTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBPcHRpb25hbDsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgVHlwZTsKK2NsYXNzIFVzZXI7CisKK2NsYXNzIEZ1bmN0aW9uIDogcHVibGljIEdsb2JhbE9iamVjdCwgcHVibGljIGlsaXN0X25vZGU8RnVuY3Rpb24+IHsKK3B1YmxpYzoKKyAgdXNpbmcgQmFzaWNCbG9ja0xpc3RUeXBlID0gU3ltYm9sVGFibGVMaXN0PEJhc2ljQmxvY2s+OworCisgIC8vIEJhc2ljQmxvY2sgaXRlcmF0b3JzLi4uCisgIHVzaW5nIGl0ZXJhdG9yID0gQmFzaWNCbG9ja0xpc3RUeXBlOjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBCYXNpY0Jsb2NrTGlzdFR5cGU6OmNvbnN0X2l0ZXJhdG9yOworCisgIHVzaW5nIGFyZ19pdGVyYXRvciA9IEFyZ3VtZW50ICo7CisgIHVzaW5nIGNvbnN0X2FyZ19pdGVyYXRvciA9IGNvbnN0IEFyZ3VtZW50ICo7CisKK3ByaXZhdGU6CisgIC8vIEltcG9ydGFudCB0aGluZ3MgdGhhdCBtYWtlIHVwIGEgZnVuY3Rpb24hCisgIEJhc2ljQmxvY2tMaXN0VHlwZSBCYXNpY0Jsb2NrczsgICAgICAgICAvLy88IFRoZSBiYXNpYyBibG9ja3MKKyAgbXV0YWJsZSBBcmd1bWVudCAqQXJndW1lbnRzID0gbnVsbHB0cjsgIC8vLzwgVGhlIGZvcm1hbCBhcmd1bWVudHMKKyAgc2l6ZV90IE51bUFyZ3M7CisgIHN0ZDo6dW5pcXVlX3B0cjxWYWx1ZVN5bWJvbFRhYmxlPgorICAgICAgU3ltVGFiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBTeW1ib2wgdGFibGUgb2YgYXJncy9pbnN0cnVjdGlvbnMKKyAgQXR0cmlidXRlTGlzdCBBdHRyaWJ1dGVTZXRzOyAgICAgICAgICAgIC8vLzwgUGFyYW1ldGVyIGF0dHJpYnV0ZXMKKworICAvKgorICAgKiBWYWx1ZTo6U3ViY2xhc3NEYXRhCisgICAqCisgICAqIGJpdCAwICAgICAgOiBIYXNMYXp5QXJndW1lbnRzCisgICAqIGJpdCAxICAgICAgOiBIYXNQcmVmaXhEYXRhCisgICAqIGJpdCAyICAgICAgOiBIYXNQcm9sb2d1ZURhdGEKKyAgICogYml0IDMgICAgICA6IEhhc1BlcnNvbmFsaXR5Rm4KKyAgICogYml0cyA0LTEzICA6IENhbGxpbmdDb252ZW50aW9uCisgICAqIGJpdHMgMTQgICAgOiBIYXNHQworICAgKiBiaXRzIDE1IDogW3Jlc2VydmVkXQorICAgKi8KKworICAvLy8gQml0cyBmcm9tIEdsb2JhbE9iamVjdDo6R2xvYmFsT2JqZWN0U3ViY2xhc3NEYXRhLgorICBlbnVtIHsKKyAgICAvLy8gV2hldGhlciB0aGlzIGZ1bmN0aW9uIGlzIG1hdGVyaWFsaXphYmxlLgorICAgIElzTWF0ZXJpYWxpemFibGVCaXQgPSAwLAorICB9OworCisgIGZyaWVuZCBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8RnVuY3Rpb24+OworCisgIC8vLyBoYXNMYXp5QXJndW1lbnRzL0NoZWNrTGF6eUFyZ3VtZW50cyAtIFRoZSBhcmd1bWVudCBsaXN0IG9mIGEgZnVuY3Rpb24gaXMKKyAgLy8vIGJ1aWx0IG9uIGRlbWFuZCwgc28gdGhhdCB0aGUgbGlzdCBpc24ndCBhbGxvY2F0ZWQgdW50aWwgdGhlIGZpcnN0IGNsaWVudAorICAvLy8gbmVlZHMgaXQuICBUaGUgaGFzTGF6eUFyZ3VtZW50cyBwcmVkaWNhdGUgcmV0dXJucyB0cnVlIGlmIHRoZSBhcmcgbGlzdAorICAvLy8gaGFzbid0IGJlZW4gc2V0IHVwIHlldC4KK3B1YmxpYzoKKyAgYm9vbCBoYXNMYXp5QXJndW1lbnRzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdWJjbGFzc0RhdGFGcm9tVmFsdWUoKSAmICgxPDwwKTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIENoZWNrTGF6eUFyZ3VtZW50cygpIGNvbnN0IHsKKyAgICBpZiAoaGFzTGF6eUFyZ3VtZW50cygpKQorICAgICAgQnVpbGRMYXp5QXJndW1lbnRzKCk7CisgIH0KKworICB2b2lkIEJ1aWxkTGF6eUFyZ3VtZW50cygpIGNvbnN0OworCisgIHZvaWQgY2xlYXJBcmd1bWVudHMoKTsKKworICAvLy8gRnVuY3Rpb24gY3RvciAtIElmIHRoZSAob3B0aW9uYWwpIE1vZHVsZSBhcmd1bWVudCBpcyBzcGVjaWZpZWQsIHRoZQorICAvLy8gZnVuY3Rpb24gaXMgYXV0b21hdGljYWxseSBpbnNlcnRlZCBpbnRvIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uIGxpc3QgZm9yCisgIC8vLyB0aGUgbW9kdWxlLgorICAvLy8KKyAgRnVuY3Rpb24oRnVuY3Rpb25UeXBlICpUeSwgTGlua2FnZVR5cGVzIExpbmthZ2UsCisgICAgICAgICAgIGNvbnN0IFR3aW5lICZOID0gIiIsIE1vZHVsZSAqTSA9IG51bGxwdHIpOworCitwdWJsaWM6CisgIEZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uJikgPSBkZWxldGU7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEZ1bmN0aW9uJikgPSBkZWxldGU7CisgIH5GdW5jdGlvbigpOworCisgIC8vIFRoaXMgaXMgaGVyZSB0byBoZWxwIGVhc2lseSBjb252ZXJ0IGZyb20gRnVuY3Rpb25UICogKEZ1bmN0aW9uICogb3IKKyAgLy8gTWFjaGluZUZ1bmN0aW9uICopIGluIEJsb2NrRnJlcXVlbmN5SW5mb0ltcGwgdG8gRnVuY3Rpb24gKiBieSBjYWxsaW5nCisgIC8vIEZ1bmN0aW9uVC0+Z2V0RnVuY3Rpb24oKS4KKyAgY29uc3QgRnVuY3Rpb24gJmdldEZ1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gKnRoaXM7IH0KKworICBzdGF0aWMgRnVuY3Rpb24gKkNyZWF0ZShGdW5jdGlvblR5cGUgKlR5LCBMaW5rYWdlVHlwZXMgTGlua2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk4gPSAiIiwgTW9kdWxlICpNID0gbnVsbHB0cikgeworICAgIHJldHVybiBuZXcgRnVuY3Rpb24oVHksIExpbmthZ2UsIE4sIE0pOworICB9CisKKyAgLy8gUHJvdmlkZSBmYXN0IG9wZXJhbmQgYWNjZXNzb3JzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICAvLy8gUmV0dXJucyB0aGUgRnVuY3Rpb25UeXBlIGZvciBtZS4KKyAgRnVuY3Rpb25UeXBlICpnZXRGdW5jdGlvblR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8RnVuY3Rpb25UeXBlPihnZXRWYWx1ZVR5cGUoKSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgcmV0IHZhbC4KKyAgVHlwZSAqZ2V0UmV0dXJuVHlwZSgpIGNvbnN0IHsgcmV0dXJuIGdldEZ1bmN0aW9uVHlwZSgpLT5nZXRSZXR1cm5UeXBlKCk7IH0KKworICAvLy8gZ2V0Q29udGV4dCAtIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgTExWTUNvbnRleHQgYXNzb2NpYXRlZCB3aXRoIHRoaXMKKyAgLy8vIGZ1bmN0aW9uLgorICBMTFZNQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0OworCisgIC8vLyBpc1ZhckFyZyAtIFJldHVybiB0cnVlIGlmIHRoaXMgZnVuY3Rpb24gdGFrZXMgYSB2YXJpYWJsZSBudW1iZXIgb2YKKyAgLy8vIGFyZ3VtZW50cy4KKyAgYm9vbCBpc1ZhckFyZygpIGNvbnN0IHsgcmV0dXJuIGdldEZ1bmN0aW9uVHlwZSgpLT5pc1ZhckFyZygpOyB9CisKKyAgYm9vbCBpc01hdGVyaWFsaXphYmxlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRHbG9iYWxPYmplY3RTdWJDbGFzc0RhdGEoKSAmICgxIDw8IElzTWF0ZXJpYWxpemFibGVCaXQpOworICB9CisgIHZvaWQgc2V0SXNNYXRlcmlhbGl6YWJsZShib29sIFYpIHsKKyAgICB1bnNpZ25lZCBNYXNrID0gMSA8PCBJc01hdGVyaWFsaXphYmxlQml0OworICAgIHNldEdsb2JhbE9iamVjdFN1YkNsYXNzRGF0YSgofk1hc2sgJiBnZXRHbG9iYWxPYmplY3RTdWJDbGFzc0RhdGEoKSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoViA/IE1hc2sgOiAwdSkpOworICB9CisKKyAgLy8vIGdldEludHJpbnNpY0lEIC0gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgSUQgbnVtYmVyIG9mIHRoZSBzcGVjaWZpZWQKKyAgLy8vIGZ1bmN0aW9uLCBvciBJbnRyaW5zaWM6Om5vdF9pbnRyaW5zaWMgaWYgdGhlIGZ1bmN0aW9uIGlzIG5vdCBhbgorICAvLy8gaW50cmluc2ljLCBvciBpZiB0aGUgcG9pbnRlciBpcyBudWxsLiAgVGhpcyB2YWx1ZSBpcyBhbHdheXMgZGVmaW5lZCB0byBiZQorICAvLy8gemVybyB0byBhbGxvdyBlYXN5IGNoZWNraW5nIGZvciB3aGV0aGVyIGEgZnVuY3Rpb24gaXMgaW50cmluc2ljIG9yIG5vdC4KKyAgLy8vIFRoZSBwYXJ0aWN1bGFyIGludHJpbnNpYyBmdW5jdGlvbnMgd2hpY2ggY29ycmVzcG9uZCB0byB0aGlzIHZhbHVlIGFyZQorICAvLy8gZGVmaW5lZCBpbiBsbHZtL0ludHJpbnNpY3MuaC4KKyAgSW50cmluc2ljOjpJRCBnZXRJbnRyaW5zaWNJRCgpIGNvbnN0IExMVk1fUkVBRE9OTFkgeyByZXR1cm4gSW50SUQ7IH0KKworICAvLy8gaXNJbnRyaW5zaWMgLSBSZXR1cm5zIHRydWUgaWYgdGhlIGZ1bmN0aW9uJ3MgbmFtZSBzdGFydHMgd2l0aCAibGx2bS4iLgorICAvLy8gSXQncyBwb3NzaWJsZSBmb3IgdGhpcyBmdW5jdGlvbiB0byByZXR1cm4gdHJ1ZSB3aGlsZSBnZXRJbnRyaW5zaWNJRCgpCisgIC8vLyByZXR1cm5zIEludHJpbnNpYzo6bm90X2ludHJpbnNpYyEKKyAgYm9vbCBpc0ludHJpbnNpYygpIGNvbnN0IHsgcmV0dXJuIEhhc0xMVk1SZXNlcnZlZE5hbWU7IH0KKworICBzdGF0aWMgSW50cmluc2ljOjpJRCBsb29rdXBJbnRyaW5zaWNJRChTdHJpbmdSZWYgTmFtZSk7CisKKyAgLy8vIFxicmllZiBSZWNhbGN1bGF0ZSB0aGUgSUQgZm9yIHRoaXMgZnVuY3Rpb24gaWYgaXQgaXMgYW4gSW50cmluc2ljIGRlZmluZWQKKyAgLy8vIGluIGxsdm0vSW50cmluc2ljcy5oLiAgU2V0cyB0aGUgaW50cmluc2ljIElEIHRvIEludHJpbnNpYzo6bm90X2ludHJpbnNpYworICAvLy8gaWYgdGhlIG5hbWUgb2YgdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBtYXRjaCBhbiBpbnRyaW5zaWMgaW4gdGhhdCBoZWFkZXIuCisgIC8vLyBOb3RlLCB0aGlzIG1ldGhvZCBkb2VzIG5vdCBuZWVkIHRvIGJlIGNhbGxlZCBkaXJlY3RseSwgYXMgaXQgaXMgY2FsbGVkCisgIC8vLyBmcm9tIFZhbHVlOjpzZXROYW1lKCkgd2hlbmV2ZXIgdGhlIG5hbWUgb2YgdGhpcyBmdW5jdGlvbiBjaGFuZ2VzLgorICB2b2lkIHJlY2FsY3VsYXRlSW50cmluc2ljSUQoKTsKKworICAvLy8gZ2V0Q2FsbGluZ0NvbnYoKS9zZXRDYWxsaW5nQ29udihDQykgLSBUaGVzZSBtZXRob2QgZ2V0IGFuZCBzZXQgdGhlCisgIC8vLyBjYWxsaW5nIGNvbnZlbnRpb24gb2YgdGhpcyBmdW5jdGlvbi4gIFRoZSBlbnVtIHZhbHVlcyBmb3IgdGhlIGtub3duCisgIC8vLyBjYWxsaW5nIGNvbnZlbnRpb25zIGFyZSBkZWZpbmVkIGluIENhbGxpbmdDb252LmguCisgIENhbGxpbmdDb252OjpJRCBnZXRDYWxsaW5nQ29udigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q2FsbGluZ0NvbnY6OklEPigoZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCkgPj4gNCkgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbGxpbmdDb252OjpNYXhJRCk7CisgIH0KKyAgdm9pZCBzZXRDYWxsaW5nQ29udihDYWxsaW5nQ29udjo6SUQgQ0MpIHsKKyAgICBhdXRvIElEID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KENDKTsKKyAgICBhc3NlcnQoIShJRCAmIH5DYWxsaW5nQ29udjo6TWF4SUQpICYmICJVbnN1cHBvcnRlZCBjYWxsaW5nIGNvbnZlbnRpb24iKTsKKyAgICBzZXRWYWx1ZVN1YmNsYXNzRGF0YSgoZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCkgJiAweGMwMGYpIHwgKElEIDw8IDQpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBhdHRyaWJ1dGUgbGlzdCBmb3IgdGhpcyBGdW5jdGlvbi4KKyAgQXR0cmlidXRlTGlzdCBnZXRBdHRyaWJ1dGVzKCkgY29uc3QgeyByZXR1cm4gQXR0cmlidXRlU2V0czsgfQorCisgIC8vLyBAYnJpZWYgU2V0IHRoZSBhdHRyaWJ1dGUgbGlzdCBmb3IgdGhpcyBGdW5jdGlvbi4KKyAgdm9pZCBzZXRBdHRyaWJ1dGVzKEF0dHJpYnV0ZUxpc3QgQXR0cnMpIHsgQXR0cmlidXRlU2V0cyA9IEF0dHJzOyB9CisKKyAgLy8vIEBicmllZiBBZGQgZnVuY3Rpb24gYXR0cmlidXRlcyB0byB0aGlzIGZ1bmN0aW9uLgorICB2b2lkIGFkZEZuQXR0cihBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIHsKKyAgICBhZGRBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgS2luZCk7CisgIH0KKworICAvLy8gQGJyaWVmIEFkZCBmdW5jdGlvbiBhdHRyaWJ1dGVzIHRvIHRoaXMgZnVuY3Rpb24uCisgIHZvaWQgYWRkRm5BdHRyKFN0cmluZ1JlZiBLaW5kLCBTdHJpbmdSZWYgVmFsID0gU3RyaW5nUmVmKCkpIHsKKyAgICBhZGRBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwKKyAgICAgICAgICAgICAgICAgQXR0cmlidXRlOjpnZXQoZ2V0Q29udGV4dCgpLCBLaW5kLCBWYWwpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgQWRkIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgdG8gdGhpcyBmdW5jdGlvbi4KKyAgdm9pZCBhZGRGbkF0dHIoQXR0cmlidXRlIEF0dHIpIHsKKyAgICBhZGRBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cik7CisgIH0KKworICAvLy8gQGJyaWVmIFJlbW92ZSBmdW5jdGlvbiBhdHRyaWJ1dGVzIGZyb20gdGhpcyBmdW5jdGlvbi4KKyAgdm9pZCByZW1vdmVGbkF0dHIoQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSB7CisgICAgcmVtb3ZlQXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEtpbmQpOworICB9CisKKyAgLy8vIEBicmllZiBSZW1vdmUgZnVuY3Rpb24gYXR0cmlidXRlIGZyb20gdGhpcyBmdW5jdGlvbi4KKyAgdm9pZCByZW1vdmVGbkF0dHIoU3RyaW5nUmVmIEtpbmQpIHsKKyAgICBzZXRBdHRyaWJ1dGVzKGdldEF0dHJpYnV0ZXMoKS5yZW1vdmVBdHRyaWJ1dGUoCisgICAgICAgIGdldENvbnRleHQoKSwgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgS2luZCkpOworICB9CisKKyAgZW51bSBQcm9maWxlQ291bnRUeXBlIHsgUENUX0ludmFsaWQsIFBDVF9SZWFsLCBQQ1RfU3ludGhldGljIH07CisKKyAgLy8vIENsYXNzIHRvIHJlcHJlc2VudCBwcm9maWxlIGNvdW50cy4KKyAgLy8vCisgIC8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYm90aCByZWFsIGFuZCBzeW50aGV0aWMgcHJvZmlsZSBjb3VudHMuCisgIGNsYXNzIFByb2ZpbGVDb3VudCB7CisgIHByaXZhdGU6CisgICAgdWludDY0X3QgQ291bnQ7CisgICAgUHJvZmlsZUNvdW50VHlwZSBQQ1Q7CisgICAgc3RhdGljIFByb2ZpbGVDb3VudCBJbnZhbGlkOworCisgIHB1YmxpYzoKKyAgICBQcm9maWxlQ291bnQoKSA6IENvdW50KC0xKSwgUENUKFBDVF9JbnZhbGlkKSB7fQorICAgIFByb2ZpbGVDb3VudCh1aW50NjRfdCBDb3VudCwgUHJvZmlsZUNvdW50VHlwZSBQQ1QpCisgICAgICAgIDogQ291bnQoQ291bnQpLCBQQ1QoUENUKSB7fQorICAgIGJvb2wgaGFzVmFsdWUoKSBjb25zdCB7IHJldHVybiBQQ1QgIT0gUENUX0ludmFsaWQ7IH0KKyAgICB1aW50NjRfdCBnZXRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIENvdW50OyB9CisgICAgUHJvZmlsZUNvdW50VHlwZSBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gUENUOyB9CisgICAgYm9vbCBpc1N5bnRoZXRpYygpIGNvbnN0IHsgcmV0dXJuIFBDVCA9PSBQQ1RfU3ludGhldGljOyB9CisgICAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIHsgcmV0dXJuIGhhc1ZhbHVlKCk7IH0KKyAgICBib29sIG9wZXJhdG9yISgpIGNvbnN0IHsgcmV0dXJuICFoYXNWYWx1ZSgpOyB9CisgICAgLy8gVXBkYXRlIHRoZSBjb3VudCByZXRhaW5pbmcgdGhlIHNhbWUgcHJvZmlsZSBjb3VudCB0eXBlLgorICAgIFByb2ZpbGVDb3VudCAmc2V0Q291bnQodWludDY0X3QgQykgeworICAgICAgQ291bnQgPSBDOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBzdGF0aWMgUHJvZmlsZUNvdW50IGdldEludmFsaWQoKSB7IHJldHVybiBQcm9maWxlQ291bnQoLTEsIFBDVF9JbnZhbGlkKTsgfQorICB9OworCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBlbnRyeSBjb3VudCBmb3IgdGhpcyBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBFbnRyeSBjb3VudCBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoaXMgZnVuY3Rpb24gd2FzIGV4ZWN1dGVkIGJhc2VkIG9uCisgIC8vLyBwZ28gZGF0YS4gXHAgSW1wb3J0cyBwb2ludHMgdG8gYSBzZXQgb2YgR1VJRHMgdGhhdCBuZWVkcyB0bworICAvLy8gYmUgaW1wb3J0ZWQgYnkgdGhlIGZ1bmN0aW9uIGZvciBzYW1wbGUgUEdPLCB0byBlbmFibGUgdGhlIHNhbWUgaW5saW5lcyBhcworICAvLy8gdGhlIHByb2ZpbGVkIG9wdGltaXplZCBiaW5hcnkuCisgIHZvaWQgc2V0RW50cnlDb3VudChQcm9maWxlQ291bnQgQ291bnQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZW5zZVNldDxHbG9iYWxWYWx1ZTo6R1VJRD4gKkltcG9ydHMgPSBudWxscHRyKTsKKworICAvLy8gQSBjb252ZW5pZW5jZSB3cmFwcGVyIGZvciBzZXR0aW5nIGVudHJ5IGNvdW50CisgIHZvaWQgc2V0RW50cnlDb3VudCh1aW50NjRfdCBDb3VudCwgUHJvZmlsZUNvdW50VHlwZSBUeXBlID0gUENUX1JlYWwsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZW5zZVNldDxHbG9iYWxWYWx1ZTo6R1VJRD4gKkltcG9ydHMgPSBudWxscHRyKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgZW50cnkgY291bnQgZm9yIHRoaXMgZnVuY3Rpb24uCisgIC8vLworICAvLy8gRW50cnkgY291bnQgaXMgdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZnVuY3Rpb24gd2FzIGV4ZWN1dGVkIGJhc2VkIG9uCisgIC8vLyBwZ28gZGF0YS4KKyAgUHJvZmlsZUNvdW50IGdldEVudHJ5Q291bnQoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGZ1bmN0aW9uIGlzIGFubm90YXRlZCB3aXRoIHByb2ZpbGUgZGF0YS4KKyAgLy8vCisgIC8vLyBQcmVzZW5jZSBvZiBlbnRyeSBjb3VudHMgZnJvbSBhIHByb2ZpbGUgcnVuIGltcGxpZXMgdGhlIGZ1bmN0aW9uIGhhcworICAvLy8gcHJvZmlsZSBhbm5vdGF0aW9ucy4KKyAgYm9vbCBoYXNQcm9maWxlRGF0YSgpIGNvbnN0IHsgcmV0dXJuIGdldEVudHJ5Q291bnQoKS5oYXNWYWx1ZSgpOyB9CisKKyAgLy8vIFJldHVybnMgdGhlIHNldCBvZiBHVUlEcyB0aGF0IG5lZWRzIHRvIGJlIGltcG9ydGVkIHRvIHRoZSBmdW5jdGlvbiBmb3IKKyAgLy8vIHNhbXBsZSBQR08sIHRvIGVuYWJsZSB0aGUgc2FtZSBpbmxpbmVzIGFzIHRoZSBwcm9maWxlZCBvcHRpbWl6ZWQgYmluYXJ5LgorICBEZW5zZVNldDxHbG9iYWxWYWx1ZTo6R1VJRD4gZ2V0SW1wb3J0R1VJRHMoKSBjb25zdDsKKworICAvLy8gU2V0IHRoZSBzZWN0aW9uIHByZWZpeCBmb3IgdGhpcyBmdW5jdGlvbi4KKyAgdm9pZCBzZXRTZWN0aW9uUHJlZml4KFN0cmluZ1JlZiBQcmVmaXgpOworCisgIC8vLyBHZXQgdGhlIHNlY3Rpb24gcHJlZml4IGZvciB0aGlzIGZ1bmN0aW9uLgorICBPcHRpb25hbDxTdHJpbmdSZWY+IGdldFNlY3Rpb25QcmVmaXgoKSBjb25zdDsKKworICAvLy8gQGJyaWVmIFJldHVybiB0cnVlIGlmIHRoZSBmdW5jdGlvbiBoYXMgdGhlIGF0dHJpYnV0ZS4KKyAgYm9vbCBoYXNGbkF0dHJpYnV0ZShBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gQXR0cmlidXRlU2V0cy5oYXNGbkF0dHJpYnV0ZShLaW5kKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGZ1bmN0aW9uIGhhcyB0aGUgYXR0cmlidXRlLgorICBib29sIGhhc0ZuQXR0cmlidXRlKFN0cmluZ1JlZiBLaW5kKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJpYnV0ZVNldHMuaGFzRm5BdHRyaWJ1dGUoS2luZCk7CisgIH0KKworICAvLy8gQGJyaWVmIFJldHVybiB0aGUgYXR0cmlidXRlIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlIGtpbmQuCisgIEF0dHJpYnV0ZSBnZXRGbkF0dHJpYnV0ZShBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEtpbmQpOworICB9CisKKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBmb3IgdGhlIGdpdmVuIGF0dHJpYnV0ZSBraW5kLgorICBBdHRyaWJ1dGUgZ2V0Rm5BdHRyaWJ1dGUoU3RyaW5nUmVmIEtpbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEtpbmQpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHN0YWNrIGFsaWdubWVudCBmb3IgdGhlIGZ1bmN0aW9uLgorICB1bnNpZ25lZCBnZXRGblN0YWNrQWxpZ25tZW50KCkgY29uc3QgeworICAgIGlmICghaGFzRm5BdHRyaWJ1dGUoQXR0cmlidXRlOjpTdGFja0FsaWdubWVudCkpCisgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gQXR0cmlidXRlU2V0cy5nZXRTdGFja0FsaWdubWVudChBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4KTsKKyAgfQorCisgIC8vLyBoYXNHQy9nZXRHQy9zZXRHQy9jbGVhckdDIC0gVGhlIG5hbWUgb2YgdGhlIGdhcmJhZ2UgY29sbGVjdGlvbiBhbGdvcml0aG0KKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB1c2UgZHVyaW5nIGNvZGUgZ2VuZXJhdGlvbi4KKyAgYm9vbCBoYXNHQygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCkgJiAoMTw8MTQpOworICB9CisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRHQygpIGNvbnN0OworICB2b2lkIHNldEdDKHN0ZDo6c3RyaW5nIFN0cik7CisgIHZvaWQgY2xlYXJHQygpOworCisgIC8vLyBAYnJpZWYgYWRkcyB0aGUgYXR0cmlidXRlIHRvIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMuCisgIHZvaWQgYWRkQXR0cmlidXRlKHVuc2lnbmVkIGksIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCk7CisKKyAgLy8vIEBicmllZiBhZGRzIHRoZSBhdHRyaWJ1dGUgdG8gdGhlIGxpc3Qgb2YgYXR0cmlidXRlcy4KKyAgdm9pZCBhZGRBdHRyaWJ1dGUodW5zaWduZWQgaSwgQXR0cmlidXRlIEF0dHIpOworCisgIC8vLyBAYnJpZWYgYWRkcyB0aGUgYXR0cmlidXRlcyB0byB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzLgorICB2b2lkIGFkZEF0dHJpYnV0ZXModW5zaWduZWQgaSwgY29uc3QgQXR0ckJ1aWxkZXIgJkF0dHJzKTsKKworICAvLy8gQGJyaWVmIGFkZHMgdGhlIGF0dHJpYnV0ZSB0byB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gYXJnLgorICB2b2lkIGFkZFBhcmFtQXR0cih1bnNpZ25lZCBBcmdObywgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKTsKKworICAvLy8gQGJyaWVmIGFkZHMgdGhlIGF0dHJpYnV0ZSB0byB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gYXJnLgorICB2b2lkIGFkZFBhcmFtQXR0cih1bnNpZ25lZCBBcmdObywgQXR0cmlidXRlIEF0dHIpOworCisgIC8vLyBAYnJpZWYgYWRkcyB0aGUgYXR0cmlidXRlcyB0byB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzIGZvciB0aGUgZ2l2ZW4gYXJnLgorICB2b2lkIGFkZFBhcmFtQXR0cnModW5zaWduZWQgQXJnTm8sIGNvbnN0IEF0dHJCdWlsZGVyICZBdHRycyk7CisKKyAgLy8vIEBicmllZiByZW1vdmVzIHRoZSBhdHRyaWJ1dGUgZnJvbSB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzLgorICB2b2lkIHJlbW92ZUF0dHJpYnV0ZSh1bnNpZ25lZCBpLCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpOworCisgIC8vLyBAYnJpZWYgcmVtb3ZlcyB0aGUgYXR0cmlidXRlIGZyb20gdGhlIGxpc3Qgb2YgYXR0cmlidXRlcy4KKyAgdm9pZCByZW1vdmVBdHRyaWJ1dGUodW5zaWduZWQgaSwgU3RyaW5nUmVmIEtpbmQpOworCisgIC8vLyBAYnJpZWYgcmVtb3ZlcyB0aGUgYXR0cmlidXRlcyBmcm9tIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMuCisgIHZvaWQgcmVtb3ZlQXR0cmlidXRlcyh1bnNpZ25lZCBpLCBjb25zdCBBdHRyQnVpbGRlciAmQXR0cnMpOworCisgIC8vLyBAYnJpZWYgcmVtb3ZlcyB0aGUgYXR0cmlidXRlIGZyb20gdGhlIGxpc3Qgb2YgYXR0cmlidXRlcy4KKyAgdm9pZCByZW1vdmVQYXJhbUF0dHIodW5zaWduZWQgQXJnTm8sIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCk7CisKKyAgLy8vIEBicmllZiByZW1vdmVzIHRoZSBhdHRyaWJ1dGUgZnJvbSB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzLgorICB2b2lkIHJlbW92ZVBhcmFtQXR0cih1bnNpZ25lZCBBcmdObywgU3RyaW5nUmVmIEtpbmQpOworCisgIC8vLyBAYnJpZWYgcmVtb3ZlcyB0aGUgYXR0cmlidXRlIGZyb20gdGhlIGxpc3Qgb2YgYXR0cmlidXRlcy4KKyAgdm9pZCByZW1vdmVQYXJhbUF0dHJzKHVuc2lnbmVkIEFyZ05vLCBjb25zdCBBdHRyQnVpbGRlciAmQXR0cnMpOworCisgIC8vLyBAYnJpZWYgY2hlY2sgaWYgYW4gYXR0cmlidXRlcyBpcyBpbiB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzLgorICBib29sIGhhc0F0dHJpYnV0ZSh1bnNpZ25lZCBpLCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QXR0cmlidXRlcygpLmhhc0F0dHJpYnV0ZShpLCBLaW5kKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgY2hlY2sgaWYgYW4gYXR0cmlidXRlcyBpcyBpbiB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzLgorICBib29sIGhhc1BhcmFtQXR0cmlidXRlKHVuc2lnbmVkIEFyZ05vLCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QXR0cmlidXRlcygpLmhhc1BhcmFtQXR0cmlidXRlKEFyZ05vLCBLaW5kKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgZ2V0cyB0aGUgYXR0cmlidXRlIGZyb20gdGhlIGxpc3Qgb2YgYXR0cmlidXRlcy4KKyAgQXR0cmlidXRlIGdldEF0dHJpYnV0ZSh1bnNpZ25lZCBpLCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gQXR0cmlidXRlU2V0cy5nZXRBdHRyaWJ1dGUoaSwgS2luZCk7CisgIH0KKworICAvLy8gQGJyaWVmIGdldHMgdGhlIGF0dHJpYnV0ZSBmcm9tIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMuCisgIEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUodW5zaWduZWQgaSwgU3RyaW5nUmVmIEtpbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gQXR0cmlidXRlU2V0cy5nZXRBdHRyaWJ1dGUoaSwgS2luZCk7CisgIH0KKworICAvLy8gQGJyaWVmIGFkZHMgdGhlIGRlcmVmZXJlbmNlYWJsZSBhdHRyaWJ1dGUgdG8gdGhlIGxpc3Qgb2YgYXR0cmlidXRlcy4KKyAgdm9pZCBhZGREZXJlZmVyZW5jZWFibGVBdHRyKHVuc2lnbmVkIGksIHVpbnQ2NF90IEJ5dGVzKTsKKworICAvLy8gQGJyaWVmIGFkZHMgdGhlIGRlcmVmZXJlbmNlYWJsZSBhdHRyaWJ1dGUgdG8gdGhlIGxpc3Qgb2YgYXR0cmlidXRlcyBmb3IKKyAgLy8vIHRoZSBnaXZlbiBhcmcuCisgIHZvaWQgYWRkRGVyZWZlcmVuY2VhYmxlUGFyYW1BdHRyKHVuc2lnbmVkIEFyZ05vLCB1aW50NjRfdCBCeXRlcyk7CisKKyAgLy8vIEBicmllZiBhZGRzIHRoZSBkZXJlZmVyZW5jZWFibGVfb3JfbnVsbCBhdHRyaWJ1dGUgdG8gdGhlIGxpc3Qgb2YKKyAgLy8vIGF0dHJpYnV0ZXMuCisgIHZvaWQgYWRkRGVyZWZlcmVuY2VhYmxlT3JOdWxsQXR0cih1bnNpZ25lZCBpLCB1aW50NjRfdCBCeXRlcyk7CisKKyAgLy8vIEBicmllZiBhZGRzIHRoZSBkZXJlZmVyZW5jZWFibGVfb3JfbnVsbCBhdHRyaWJ1dGUgdG8gdGhlIGxpc3Qgb2YKKyAgLy8vIGF0dHJpYnV0ZXMgZm9yIHRoZSBnaXZlbiBhcmcuCisgIHZvaWQgYWRkRGVyZWZlcmVuY2VhYmxlT3JOdWxsUGFyYW1BdHRyKHVuc2lnbmVkIEFyZ05vLCB1aW50NjRfdCBCeXRlcyk7CisKKyAgLy8vIEBicmllZiBFeHRyYWN0IHRoZSBhbGlnbm1lbnQgZm9yIGEgY2FsbCBvciBwYXJhbWV0ZXIgKDA9dW5rbm93bikuCisgIHVuc2lnbmVkIGdldFBhcmFtQWxpZ25tZW50KHVuc2lnbmVkIEFyZ05vKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJpYnV0ZVNldHMuZ2V0UGFyYW1BbGlnbm1lbnQoQXJnTm8pOworICB9CisKKyAgLy8vIEBicmllZiBFeHRyYWN0IHRoZSBudW1iZXIgb2YgZGVyZWZlcmVuY2VhYmxlIGJ5dGVzIGZvciBhIGNhbGwgb3IKKyAgLy8vIHBhcmFtZXRlciAoMD11bmtub3duKS4KKyAgLy8vIEBwYXJhbSBpIEF0dHJpYnV0ZUxpc3QgaW5kZXgsIHJlZmVycmluZyB0byBhIHJldHVybiB2YWx1ZSBvciBhcmd1bWVudC4KKyAgdWludDY0X3QgZ2V0RGVyZWZlcmVuY2VhYmxlQnl0ZXModW5zaWduZWQgaSkgY29uc3QgeworICAgIHJldHVybiBBdHRyaWJ1dGVTZXRzLmdldERlcmVmZXJlbmNlYWJsZUJ5dGVzKGkpOworICB9CisKKyAgLy8vIEBicmllZiBFeHRyYWN0IHRoZSBudW1iZXIgb2YgZGVyZWZlcmVuY2VhYmxlIGJ5dGVzIGZvciBhIHBhcmFtZXRlci4KKyAgLy8vIEBwYXJhbSBBcmdObyBJbmRleCBvZiBhbiBhcmd1bWVudCwgd2l0aCAwIGJlaW5nIHRoZSBmaXJzdCBmdW5jdGlvbiBhcmcuCisgIHVpbnQ2NF90IGdldFBhcmFtRGVyZWZlcmVuY2VhYmxlQnl0ZXModW5zaWduZWQgQXJnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gQXR0cmlidXRlU2V0cy5nZXRQYXJhbURlcmVmZXJlbmNlYWJsZUJ5dGVzKEFyZ05vKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRXh0cmFjdCB0aGUgbnVtYmVyIG9mIGRlcmVmZXJlbmNlYWJsZV9vcl9udWxsIGJ5dGVzIGZvciBhIGNhbGwgb3IKKyAgLy8vIHBhcmFtZXRlciAoMD11bmtub3duKS4KKyAgLy8vIEBwYXJhbSBpIEF0dHJpYnV0ZUxpc3QgaW5kZXgsIHJlZmVycmluZyB0byBhIHJldHVybiB2YWx1ZSBvciBhcmd1bWVudC4KKyAgdWludDY0X3QgZ2V0RGVyZWZlcmVuY2VhYmxlT3JOdWxsQnl0ZXModW5zaWduZWQgaSkgY29uc3QgeworICAgIHJldHVybiBBdHRyaWJ1dGVTZXRzLmdldERlcmVmZXJlbmNlYWJsZU9yTnVsbEJ5dGVzKGkpOworICB9CisKKyAgLy8vIEBicmllZiBFeHRyYWN0IHRoZSBudW1iZXIgb2YgZGVyZWZlcmVuY2VhYmxlX29yX251bGwgYnl0ZXMgZm9yIGEKKyAgLy8vIHBhcmFtZXRlci4KKyAgLy8vIEBwYXJhbSBBcmdObyBBdHRyaWJ1dGVMaXN0IEFyZ05vLCByZWZlcnJpbmcgdG8gYW4gYXJndW1lbnQuCisgIHVpbnQ2NF90IGdldFBhcmFtRGVyZWZlcmVuY2VhYmxlT3JOdWxsQnl0ZXModW5zaWduZWQgQXJnTm8pIGNvbnN0IHsKKyAgICByZXR1cm4gQXR0cmlidXRlU2V0cy5nZXRQYXJhbURlcmVmZXJlbmNlYWJsZU9yTnVsbEJ5dGVzKEFyZ05vKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBmdW5jdGlvbiBkb2VzIG5vdCBhY2Nlc3MgbWVtb3J5LgorICBib29sIGRvZXNOb3RBY2Nlc3NNZW1vcnkoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0ZuQXR0cmlidXRlKEF0dHJpYnV0ZTo6UmVhZE5vbmUpOworICB9CisgIHZvaWQgc2V0RG9lc05vdEFjY2Vzc01lbW9yeSgpIHsKKyAgICBhZGRGbkF0dHIoQXR0cmlidXRlOjpSZWFkTm9uZSk7CisgIH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgZnVuY3Rpb24gZG9lcyBub3QgYWNjZXNzIG9yIG9ubHkgcmVhZHMgbWVtb3J5LgorICBib29sIG9ubHlSZWFkc01lbW9yeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZG9lc05vdEFjY2Vzc01lbW9yeSgpIHx8IGhhc0ZuQXR0cmlidXRlKEF0dHJpYnV0ZTo6UmVhZE9ubHkpOworICB9CisgIHZvaWQgc2V0T25seVJlYWRzTWVtb3J5KCkgeworICAgIGFkZEZuQXR0cihBdHRyaWJ1dGU6OlJlYWRPbmx5KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBmdW5jdGlvbiBkb2VzIG5vdCBhY2Nlc3Mgb3Igb25seSB3cml0ZXMgbWVtb3J5LgorICBib29sIGRvZXNOb3RSZWFkTWVtb3J5KCkgY29uc3QgeworICAgIHJldHVybiBkb2VzTm90QWNjZXNzTWVtb3J5KCkgfHwgaGFzRm5BdHRyaWJ1dGUoQXR0cmlidXRlOjpXcml0ZU9ubHkpOworICB9CisgIHZvaWQgc2V0RG9lc05vdFJlYWRNZW1vcnkoKSB7CisgICAgYWRkRm5BdHRyKEF0dHJpYnV0ZTo6V3JpdGVPbmx5KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBjYWxsIGNhbiBhY2Nlc3MgbWVtbW9yeSBvbmx5IHVzaW5nIHBvaW50ZXJzIGJhc2VkCisgIC8vLyBvbiBpdHMgYXJndW1lbnRzLgorICBib29sIG9ubHlBY2Nlc3Nlc0FyZ01lbW9yeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzRm5BdHRyaWJ1dGUoQXR0cmlidXRlOjpBcmdNZW1Pbmx5KTsKKyAgfQorICB2b2lkIHNldE9ubHlBY2Nlc3Nlc0FyZ01lbW9yeSgpIHsgYWRkRm5BdHRyKEF0dHJpYnV0ZTo6QXJnTWVtT25seSk7IH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgZnVuY3Rpb24gbWF5IG9ubHkgYWNjZXNzIG1lbW9yeSB0aGF0IGlzCisgIC8vLyAgaW5hY2Nlc3NpYmxlIGZyb20gdGhlIElSLgorICBib29sIG9ubHlBY2Nlc3Nlc0luYWNjZXNzaWJsZU1lbW9yeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzRm5BdHRyaWJ1dGUoQXR0cmlidXRlOjpJbmFjY2Vzc2libGVNZW1Pbmx5KTsKKyAgfQorICB2b2lkIHNldE9ubHlBY2Nlc3Nlc0luYWNjZXNzaWJsZU1lbW9yeSgpIHsKKyAgICBhZGRGbkF0dHIoQXR0cmlidXRlOjpJbmFjY2Vzc2libGVNZW1Pbmx5KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBmdW5jdGlvbiBtYXkgb25seSBhY2Nlc3MgbWVtb3J5IHRoYXQgaXMKKyAgLy8vICBlaXRoZXIgaW5hY2Nlc3NpYmxlIGZyb20gdGhlIElSIG9yIHBvaW50ZWQgdG8gYnkgaXRzIGFyZ3VtZW50cy4KKyAgYm9vbCBvbmx5QWNjZXNzZXNJbmFjY2Vzc2libGVNZW1PckFyZ01lbSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzRm5BdHRyaWJ1dGUoQXR0cmlidXRlOjpJbmFjY2Vzc2libGVNZW1PckFyZ01lbU9ubHkpOworICB9CisgIHZvaWQgc2V0T25seUFjY2Vzc2VzSW5hY2Nlc3NpYmxlTWVtT3JBcmdNZW0oKSB7CisgICAgYWRkRm5BdHRyKEF0dHJpYnV0ZTo6SW5hY2Nlc3NpYmxlTWVtT3JBcmdNZW1Pbmx5KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBmdW5jdGlvbiBjYW5ub3QgcmV0dXJuLgorICBib29sIGRvZXNOb3RSZXR1cm4oKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0ZuQXR0cmlidXRlKEF0dHJpYnV0ZTo6Tm9SZXR1cm4pOworICB9CisgIHZvaWQgc2V0RG9lc05vdFJldHVybigpIHsKKyAgICBhZGRGbkF0dHIoQXR0cmlidXRlOjpOb1JldHVybik7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBmdW5jdGlvbiBzaG91bGQgbm90IHBlcmZvcm0gaW5kaXJlY3QgYnJhbmNoIHRyYWNraW5nLgorICBib29sIGRvZXNOb0NmQ2hlY2soKSBjb25zdCB7IHJldHVybiBoYXNGbkF0dHJpYnV0ZShBdHRyaWJ1dGU6Ok5vQ2ZDaGVjayk7IH0KKworICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgZnVuY3Rpb24gY2Fubm90IHVud2luZC4KKyAgYm9vbCBkb2VzTm90VGhyb3coKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0ZuQXR0cmlidXRlKEF0dHJpYnV0ZTo6Tm9VbndpbmQpOworICB9CisgIHZvaWQgc2V0RG9lc05vdFRocm93KCkgeworICAgIGFkZEZuQXR0cihBdHRyaWJ1dGU6Ok5vVW53aW5kKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBjYWxsIGNhbm5vdCBiZSBkdXBsaWNhdGVkLgorICBib29sIGNhbm5vdER1cGxpY2F0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzRm5BdHRyaWJ1dGUoQXR0cmlidXRlOjpOb0R1cGxpY2F0ZSk7CisgIH0KKyAgdm9pZCBzZXRDYW5ub3REdXBsaWNhdGUoKSB7CisgICAgYWRkRm5BdHRyKEF0dHJpYnV0ZTo6Tm9EdXBsaWNhdGUpOworICB9CisKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIGNhbGwgaXMgY29udmVyZ2VudC4KKyAgYm9vbCBpc0NvbnZlcmdlbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0ZuQXR0cmlidXRlKEF0dHJpYnV0ZTo6Q29udmVyZ2VudCk7CisgIH0KKyAgdm9pZCBzZXRDb252ZXJnZW50KCkgeworICAgIGFkZEZuQXR0cihBdHRyaWJ1dGU6OkNvbnZlcmdlbnQpOworICB9CisgIHZvaWQgc2V0Tm90Q29udmVyZ2VudCgpIHsKKyAgICByZW1vdmVGbkF0dHIoQXR0cmlidXRlOjpDb252ZXJnZW50KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBjYWxsIGhhcyBzaWRlZWZmZWN0cy4KKyAgYm9vbCBpc1NwZWN1bGF0YWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzRm5BdHRyaWJ1dGUoQXR0cmlidXRlOjpTcGVjdWxhdGFibGUpOworICB9CisgIHZvaWQgc2V0U3BlY3VsYXRhYmxlKCkgeworICAgIGFkZEZuQXR0cihBdHRyaWJ1dGU6OlNwZWN1bGF0YWJsZSk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBmdW5jdGlvbiBpcyBrbm93biBub3QgdG8gcmVjdXJzZSwgZGlyZWN0bHkgb3IKKyAgLy8vIGluZGlyZWN0bHkuCisgIGJvb2wgZG9lc05vdFJlY3Vyc2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0ZuQXR0cmlidXRlKEF0dHJpYnV0ZTo6Tm9SZWN1cnNlKTsKKyAgfQorICB2b2lkIHNldERvZXNOb3RSZWN1cnNlKCkgeworICAgIGFkZEZuQXR0cihBdHRyaWJ1dGU6Ok5vUmVjdXJzZSk7CisgIH0KKworICAvLy8gQGJyaWVmIFRydWUgaWYgdGhlIEFCSSBtYW5kYXRlcyAob3IgdGhlIHVzZXIgcmVxdWVzdGVkKSB0aGF0IHRoaXMKKyAgLy8vIGZ1bmN0aW9uIGJlIGluIGEgdW53aW5kIHRhYmxlLgorICBib29sIGhhc1VXVGFibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0ZuQXR0cmlidXRlKEF0dHJpYnV0ZTo6VVdUYWJsZSk7CisgIH0KKyAgdm9pZCBzZXRIYXNVV1RhYmxlKCkgeworICAgIGFkZEZuQXR0cihBdHRyaWJ1dGU6OlVXVGFibGUpOworICB9CisKKyAgLy8vIEBicmllZiBUcnVlIGlmIHRoaXMgZnVuY3Rpb24gbmVlZHMgYW4gdW53aW5kIHRhYmxlLgorICBib29sIG5lZWRzVW53aW5kVGFibGVFbnRyeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzVVdUYWJsZSgpIHx8ICFkb2VzTm90VGhyb3coKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEgc3RydWN0dXJlIHRocm91Z2ggZmlyc3QKKyAgLy8vIG9yIHNlY29uZCBwb2ludGVyIGFyZ3VtZW50LgorICBib29sIGhhc1N0cnVjdFJldEF0dHIoKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJpYnV0ZVNldHMuaGFzUGFyYW1BdHRyaWJ1dGUoMCwgQXR0cmlidXRlOjpTdHJ1Y3RSZXQpIHx8CisgICAgICAgICAgIEF0dHJpYnV0ZVNldHMuaGFzUGFyYW1BdHRyaWJ1dGUoMSwgQXR0cmlidXRlOjpTdHJ1Y3RSZXQpOworICB9CisKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIHBhcmFtZXRlciBvciByZXR1cm4gdmFsdWUgaXMgbWFya2VkIHdpdGggTm9BbGlhcworICAvLy8gYXR0cmlidXRlLgorICBib29sIHJldHVybkRvZXNOb3RBbGlhcygpIGNvbnN0IHsKKyAgICByZXR1cm4gQXR0cmlidXRlU2V0cy5oYXNBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6UmV0dXJuSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZTo6Tm9BbGlhcyk7CisgIH0KKyAgdm9pZCBzZXRSZXR1cm5Eb2VzTm90QWxpYXMoKSB7CisgICAgYWRkQXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OlJldHVybkluZGV4LCBBdHRyaWJ1dGU6Ok5vQWxpYXMpOworICB9CisKKyAgLy8vIE9wdGltaXplIHRoaXMgZnVuY3Rpb24gZm9yIG1pbmltdW0gc2l6ZSAoLU96KS4KKyAgYm9vbCBvcHRGb3JNaW5TaXplKCkgY29uc3QgeyByZXR1cm4gaGFzRm5BdHRyaWJ1dGUoQXR0cmlidXRlOjpNaW5TaXplKTsgfQorCisgIC8vLyBPcHRpbWl6ZSB0aGlzIGZ1bmN0aW9uIGZvciBzaXplICgtT3MpIG9yIG1pbmltdW0gc2l6ZSAoLU96KS4KKyAgYm9vbCBvcHRGb3JTaXplKCkgY29uc3QgeworICAgIHJldHVybiBoYXNGbkF0dHJpYnV0ZShBdHRyaWJ1dGU6Ok9wdGltaXplRm9yU2l6ZSkgfHwgb3B0Rm9yTWluU2l6ZSgpOworICB9CisKKyAgLy8vIGNvcHlBdHRyaWJ1dGVzRnJvbSAtIGNvcHkgYWxsIGFkZGl0aW9uYWwgYXR0cmlidXRlcyAodGhvc2Ugbm90IG5lZWRlZCB0bworICAvLy8gY3JlYXRlIGEgRnVuY3Rpb24pIGZyb20gdGhlIEZ1bmN0aW9uIFNyYyB0byB0aGlzIG9uZS4KKyAgdm9pZCBjb3B5QXR0cmlidXRlc0Zyb20oY29uc3QgRnVuY3Rpb24gKlNyYyk7CisKKyAgLy8vIGRlbGV0ZUJvZHkgLSBUaGlzIG1ldGhvZCBkZWxldGVzIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbiwgYW5kIGNvbnZlcnRzCisgIC8vLyB0aGUgbGlua2FnZSB0byBleHRlcm5hbC4KKyAgLy8vCisgIHZvaWQgZGVsZXRlQm9keSgpIHsKKyAgICBkcm9wQWxsUmVmZXJlbmNlcygpOworICAgIHNldExpbmthZ2UoRXh0ZXJuYWxMaW5rYWdlKTsKKyAgfQorCisgIC8vLyByZW1vdmVGcm9tUGFyZW50IC0gVGhpcyBtZXRob2QgdW5saW5rcyAndGhpcycgZnJvbSB0aGUgY29udGFpbmluZyBtb2R1bGUsCisgIC8vLyBidXQgZG9lcyBub3QgZGVsZXRlIGl0LgorICAvLy8KKyAgdm9pZCByZW1vdmVGcm9tUGFyZW50KCk7CisKKyAgLy8vIGVyYXNlRnJvbVBhcmVudCAtIFRoaXMgbWV0aG9kIHVubGlua3MgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcgbW9kdWxlCisgIC8vLyBhbmQgZGVsZXRlcyBpdC4KKyAgLy8vCisgIHZvaWQgZXJhc2VGcm9tUGFyZW50KCk7CisKKyAgLy8vIFN0ZWFsIGFyZ3VtZW50cyBmcm9tIGFub3RoZXIgZnVuY3Rpb24uCisgIC8vLworICAvLy8gRHJvcCB0aGlzIGZ1bmN0aW9uJ3MgYXJndW1lbnRzIGFuZCBzcGxpY2UgaW4gdGhlIG9uZXMgZnJvbSBcYyBTcmMuCisgIC8vLyBSZXF1aXJlcyB0aGF0IHRoaXMgaGFzIG5vIGZ1bmN0aW9uIGJvZHkuCisgIHZvaWQgc3RlYWxBcmd1bWVudExpc3RGcm9tKEZ1bmN0aW9uICZTcmMpOworCisgIC8vLyBHZXQgdGhlIHVuZGVybHlpbmcgZWxlbWVudHMgb2YgdGhlIEZ1bmN0aW9uLi4uIHRoZSBiYXNpYyBibG9jayBsaXN0IGlzCisgIC8vLyBlbXB0eSBmb3IgZXh0ZXJuYWwgZnVuY3Rpb25zLgorICAvLy8KKyAgY29uc3QgQmFzaWNCbG9ja0xpc3RUeXBlICZnZXRCYXNpY0Jsb2NrTGlzdCgpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzOyB9CisgICAgICAgIEJhc2ljQmxvY2tMaXN0VHlwZSAmZ2V0QmFzaWNCbG9ja0xpc3QoKSAgICAgICB7IHJldHVybiBCYXNpY0Jsb2NrczsgfQorCisgIHN0YXRpYyBCYXNpY0Jsb2NrTGlzdFR5cGUgRnVuY3Rpb246OipnZXRTdWJsaXN0QWNjZXNzKEJhc2ljQmxvY2sqKSB7CisgICAgcmV0dXJuICZGdW5jdGlvbjo6QmFzaWNCbG9ja3M7CisgIH0KKworICBjb25zdCBCYXNpY0Jsb2NrICAgICAgICZnZXRFbnRyeUJsb2NrKCkgY29uc3QgICB7IHJldHVybiBmcm9udCgpOyB9CisgICAgICAgIEJhc2ljQmxvY2sgICAgICAgJmdldEVudHJ5QmxvY2soKSAgICAgICAgIHsgcmV0dXJuIGZyb250KCk7IH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gU3ltYm9sIFRhYmxlIEFjY2Vzc2luZyBmdW5jdGlvbnMuLi4KKworICAvLy8gZ2V0U3ltYm9sVGFibGUoKSAtIFJldHVybiB0aGUgc3ltYm9sIHRhYmxlIGlmIGFueSwgb3RoZXJ3aXNlIG51bGxwdHIuCisgIC8vLworICBpbmxpbmUgVmFsdWVTeW1ib2xUYWJsZSAqZ2V0VmFsdWVTeW1ib2xUYWJsZSgpIHsgcmV0dXJuIFN5bVRhYi5nZXQoKTsgfQorICBpbmxpbmUgY29uc3QgVmFsdWVTeW1ib2xUYWJsZSAqZ2V0VmFsdWVTeW1ib2xUYWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3ltVGFiLmdldCgpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEJhc2ljQmxvY2sgaXRlcmF0b3IgZm9yd2FyZGluZyBmdW5jdGlvbnMKKyAgLy8KKyAgaXRlcmF0b3IgICAgICAgICAgICAgICAgYmVnaW4oKSAgICAgICB7IHJldHVybiBCYXNpY0Jsb2Nrcy5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3MuYmVnaW4oKTsgfQorICBpdGVyYXRvciAgICAgICAgICAgICAgICBlbmQgICgpICAgICAgIHsgcmV0dXJuIEJhc2ljQmxvY2tzLmVuZCgpOyAgIH0KKyAgY29uc3RfaXRlcmF0b3IgICAgICAgICAgZW5kICAoKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2Nrcy5lbmQoKTsgICB9CisKKyAgc2l6ZV90ICAgICAgICAgICAgICAgICAgIHNpemUoKSBjb25zdCB7IHJldHVybiBCYXNpY0Jsb2Nrcy5zaXplKCk7ICB9CisgIGJvb2wgICAgICAgICAgICAgICAgICAgIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3MuZW1wdHkoKTsgfQorICBjb25zdCBCYXNpY0Jsb2NrICAgICAgICZmcm9udCgpIGNvbnN0IHsgcmV0dXJuIEJhc2ljQmxvY2tzLmZyb250KCk7IH0KKyAgICAgICAgQmFzaWNCbG9jayAgICAgICAmZnJvbnQoKSAgICAgICB7IHJldHVybiBCYXNpY0Jsb2Nrcy5mcm9udCgpOyB9CisgIGNvbnN0IEJhc2ljQmxvY2sgICAgICAgICZiYWNrKCkgY29uc3QgeyByZXR1cm4gQmFzaWNCbG9ja3MuYmFjaygpOyAgfQorICAgICAgICBCYXNpY0Jsb2NrICAgICAgICAmYmFjaygpICAgICAgIHsgcmV0dXJuIEJhc2ljQmxvY2tzLmJhY2soKTsgIH0KKworLy8vIEBuYW1lIEZ1bmN0aW9uIEFyZ3VtZW50IEl0ZXJhdGlvbgorLy8vIEB7CisKKyAgYXJnX2l0ZXJhdG9yIGFyZ19iZWdpbigpIHsKKyAgICBDaGVja0xhenlBcmd1bWVudHMoKTsKKyAgICByZXR1cm4gQXJndW1lbnRzOworICB9CisgIGNvbnN0X2FyZ19pdGVyYXRvciBhcmdfYmVnaW4oKSBjb25zdCB7CisgICAgQ2hlY2tMYXp5QXJndW1lbnRzKCk7CisgICAgcmV0dXJuIEFyZ3VtZW50czsKKyAgfQorCisgIGFyZ19pdGVyYXRvciBhcmdfZW5kKCkgeworICAgIENoZWNrTGF6eUFyZ3VtZW50cygpOworICAgIHJldHVybiBBcmd1bWVudHMgKyBOdW1BcmdzOworICB9CisgIGNvbnN0X2FyZ19pdGVyYXRvciBhcmdfZW5kKCkgY29uc3QgeworICAgIENoZWNrTGF6eUFyZ3VtZW50cygpOworICAgIHJldHVybiBBcmd1bWVudHMgKyBOdW1BcmdzOworICB9CisKKyAgaXRlcmF0b3JfcmFuZ2U8YXJnX2l0ZXJhdG9yPiBhcmdzKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGFyZ19iZWdpbigpLCBhcmdfZW5kKCkpOworICB9CisgIGl0ZXJhdG9yX3JhbmdlPGNvbnN0X2FyZ19pdGVyYXRvcj4gYXJncygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShhcmdfYmVnaW4oKSwgYXJnX2VuZCgpKTsKKyAgfQorCisvLy8gQH0KKworICBzaXplX3QgYXJnX3NpemUoKSBjb25zdCB7IHJldHVybiBOdW1BcmdzOyB9CisgIGJvb2wgYXJnX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gYXJnX3NpemUoKSA9PSAwOyB9CisKKyAgLy8vIFxicmllZiBDaGVjayB3aGV0aGVyIHRoaXMgZnVuY3Rpb24gaGFzIGEgcGVyc29uYWxpdHkgZnVuY3Rpb24uCisgIGJvb2wgaGFzUGVyc29uYWxpdHlGbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3ViY2xhc3NEYXRhRnJvbVZhbHVlKCkgJiAoMTw8Myk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgcGVyc29uYWxpdHkgZnVuY3Rpb24gYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24uCisgIENvbnN0YW50ICpnZXRQZXJzb25hbGl0eUZuKCkgY29uc3Q7CisgIHZvaWQgc2V0UGVyc29uYWxpdHlGbihDb25zdGFudCAqRm4pOworCisgIC8vLyBcYnJpZWYgQ2hlY2sgd2hldGhlciB0aGlzIGZ1bmN0aW9uIGhhcyBwcmVmaXggZGF0YS4KKyAgYm9vbCBoYXNQcmVmaXhEYXRhKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdWJjbGFzc0RhdGFGcm9tVmFsdWUoKSAmICgxPDwxKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBwcmVmaXggZGF0YSBhc3NvY2lhdGVkIHdpdGggdGhpcyBmdW5jdGlvbi4KKyAgQ29uc3RhbnQgKmdldFByZWZpeERhdGEoKSBjb25zdDsKKyAgdm9pZCBzZXRQcmVmaXhEYXRhKENvbnN0YW50ICpQcmVmaXhEYXRhKTsKKworICAvLy8gXGJyaWVmIENoZWNrIHdoZXRoZXIgdGhpcyBmdW5jdGlvbiBoYXMgcHJvbG9ndWUgZGF0YS4KKyAgYm9vbCBoYXNQcm9sb2d1ZURhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN1YmNsYXNzRGF0YUZyb21WYWx1ZSgpICYgKDE8PDIpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHByb2xvZ3VlIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoaXMgZnVuY3Rpb24uCisgIENvbnN0YW50ICpnZXRQcm9sb2d1ZURhdGEoKSBjb25zdDsKKyAgdm9pZCBzZXRQcm9sb2d1ZURhdGEoQ29uc3RhbnQgKlByb2xvZ3VlRGF0YSk7CisKKyAgLy8vIFByaW50IHRoZSBmdW5jdGlvbiB0byBhbiBvdXRwdXQgc3RyZWFtIHdpdGggYW4gb3B0aW9uYWwKKyAgLy8vIEFzc2VtYmx5QW5ub3RhdGlvbldyaXRlci4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIEFzc2VtYmx5QW5ub3RhdGlvbldyaXRlciAqQUFXID0gbnVsbHB0ciwKKyAgICAgICAgICAgICBib29sIFNob3VsZFByZXNlcnZlVXNlTGlzdE9yZGVyID0gZmFsc2UsCisgICAgICAgICAgICAgYm9vbCBJc0ZvckRlYnVnID0gZmFsc2UpIGNvbnN0OworCisgIC8vLyB2aWV3Q0ZHIC0gVGhpcyBmdW5jdGlvbiBpcyBtZWFudCBmb3IgdXNlIGZyb20gdGhlIGRlYnVnZ2VyLiAgWW91IGNhbiBqdXN0CisgIC8vLyBzYXkgJ2NhbGwgRi0+dmlld0NGRygpJyBhbmQgYSBnaG9zdHZpZXcgd2luZG93IHNob3VsZCBwb3AgdXAgZnJvbSB0aGUKKyAgLy8vIHByb2dyYW0sIGRpc3BsYXlpbmcgdGhlIENGRyBvZiB0aGUgY3VycmVudCBmdW5jdGlvbiB3aXRoIHRoZSBjb2RlIGZvciBlYWNoCisgIC8vLyBiYXNpYyBibG9jayBpbnNpZGUuICBUaGlzIGRlcGVuZHMgb24gdGhlcmUgYmVpbmcgYSAnZG90JyBhbmQgJ2d2JyBwcm9ncmFtCisgIC8vLyBpbiB5b3VyIHBhdGguCisgIC8vLworICB2b2lkIHZpZXdDRkcoKSBjb25zdDsKKworICAvLy8gdmlld0NGR09ubHkgLSBUaGlzIGZ1bmN0aW9uIGlzIG1lYW50IGZvciB1c2UgZnJvbSB0aGUgZGVidWdnZXIuICBJdCB3b3JrcworICAvLy8ganVzdCBsaWtlIHZpZXdDRkcsIGJ1dCBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBjb250ZW50cyBvZiBiYXNpYyBibG9ja3MKKyAgLy8vIGludG8gdGhlIG5vZGVzLCBqdXN0IHRoZSBsYWJlbC4gIElmIHlvdSBhcmUgb25seSBpbnRlcmVzdGVkIGluIHRoZSBDRkcKKyAgLy8vIHRoaXMgY2FuIG1ha2UgdGhlIGdyYXBoIHNtYWxsZXIuCisgIC8vLworICB2b2lkIHZpZXdDRkdPbmx5KCkgY29uc3Q7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IFZhbHVlOjpGdW5jdGlvblZhbDsKKyAgfQorCisgIC8vLyBkcm9wQWxsUmVmZXJlbmNlcygpIC0gVGhpcyBtZXRob2QgY2F1c2VzIGFsbCB0aGUgc3ViaW5zdHJ1Y3Rpb25zIHRvICJsZXQKKyAgLy8vIGdvIiBvZiBhbGwgcmVmZXJlbmNlcyB0aGF0IHRoZXkgYXJlIG1haW50YWluaW5nLiAgVGhpcyBhbGxvd3Mgb25lIHRvCisgIC8vLyAnZGVsZXRlJyBhIHdob2xlIG1vZHVsZSBhdCBhIHRpbWUsIGV2ZW4gdGhvdWdoIHRoZXJlIG1heSBiZSBjaXJjdWxhcgorICAvLy8gcmVmZXJlbmNlcy4uLiBmaXJzdCBhbGwgcmVmZXJlbmNlcyBhcmUgZHJvcHBlZCwgYW5kIGFsbCB1c2UgY291bnRzIGdvIHRvCisgIC8vLyB6ZXJvLiAgVGhlbiBldmVyeXRoaW5nIGlzIGRlbGV0ZWQgZm9yIHJlYWwuICBOb3RlIHRoYXQgbm8gb3BlcmF0aW9ucyBhcmUKKyAgLy8vIHZhbGlkIG9uIGFuIG9iamVjdCB0aGF0IGhhcyAiZHJvcHBlZCBhbGwgcmVmZXJlbmNlcyIsIGV4Y2VwdCBvcGVyYXRvcgorICAvLy8gZGVsZXRlLgorICAvLy8KKyAgLy8vIFNpbmNlIG5vIG90aGVyIG9iamVjdCBpbiB0aGUgbW9kdWxlIGNhbiBoYXZlIHJlZmVyZW5jZXMgaW50byB0aGUgYm9keSBvZiBhCisgIC8vLyBmdW5jdGlvbiwgZHJvcHBpbmcgYWxsIHJlZmVyZW5jZXMgZGVsZXRlcyB0aGUgZW50aXJlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uLAorICAvLy8gaW5jbHVkaW5nIGFueSBjb250YWluZWQgYmFzaWMgYmxvY2tzLgorICAvLy8KKyAgdm9pZCBkcm9wQWxsUmVmZXJlbmNlcygpOworCisgIC8vLyBoYXNBZGRyZXNzVGFrZW4gLSByZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIGFueSB1c2VzIG9mIHRoaXMgZnVuY3Rpb24KKyAgLy8vIG90aGVyIHRoYW4gZGlyZWN0IGNhbGxzIG9yIGludm9rZXMgdG8gaXQsIG9yIGJsb2NrYWRkcmVzcyBleHByZXNzaW9ucy4KKyAgLy8vIE9wdGlvbmFsbHkgcGFzc2VzIGJhY2sgYW4gb2ZmZW5kaW5nIHVzZXIgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMuCisgIC8vLworICBib29sIGhhc0FkZHJlc3NUYWtlbihjb25zdCBVc2VyKiogPSBudWxscHRyKSBjb25zdDsKKworICAvLy8gaXNEZWZUcml2aWFsbHlEZWFkIC0gUmV0dXJuIHRydWUgaWYgaXQgaXMgdHJpdmlhbGx5IHNhZmUgdG8gcmVtb3ZlCisgIC8vLyB0aGlzIGZ1bmN0aW9uIGRlZmluaXRpb24gZnJvbSB0aGUgbW9kdWxlIChiZWNhdXNlIGl0IGlzbid0IGV4dGVybmFsbHkKKyAgLy8vIHZpc2libGUsIGRvZXMgbm90IGhhdmUgaXRzIGFkZHJlc3MgdGFrZW4sIGFuZCBoYXMgbm8gY2FsbGVycykuICBUbyBtYWtlCisgIC8vLyB0aGlzIG1vcmUgYWNjdXJhdGUsIGNhbGwgcmVtb3ZlRGVhZENvbnN0YW50VXNlcnMgZmlyc3QuCisgIGJvb2wgaXNEZWZUcml2aWFsbHlEZWFkKCkgY29uc3Q7CisKKyAgLy8vIGNhbGxzRnVuY3Rpb25UaGF0UmV0dXJuc1R3aWNlIC0gUmV0dXJuIHRydWUgaWYgdGhlIGZ1bmN0aW9uIGhhcyBhIGNhbGwgdG8KKyAgLy8vIHNldGptcCBvciBvdGhlciBmdW5jdGlvbiB0aGF0IGdjYyByZWNvZ25pemVzIGFzICJyZXR1cm5pbmcgdHdpY2UiLgorICBib29sIGNhbGxzRnVuY3Rpb25UaGF0UmV0dXJuc1R3aWNlKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIGF0dGFjaGVkIHN1YnByb2dyYW0uCisgIC8vLworICAvLy8gQ2FsbHMgXGEgc2V0TWV0YWRhdGEoKSB3aXRoIFxhIExMVk1Db250ZXh0OjpNRF9kYmcuCisgIHZvaWQgc2V0U3VicHJvZ3JhbShESVN1YnByb2dyYW0gKlNQKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgYXR0YWNoZWQgc3VicHJvZ3JhbS4KKyAgLy8vCisgIC8vLyBDYWxscyBcYSBnZXRNZXRhZGF0YSgpIHdpdGggXGEgTExWTUNvbnRleHQ6Ok1EX2RiZyBhbmQgY2FzdHMgdGhlIHJlc3VsdAorICAvLy8gdG8gXGEgRElTdWJwcm9ncmFtLgorICBESVN1YnByb2dyYW0gKmdldFN1YnByb2dyYW0oKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHdlIHNob3VsZCBlbWl0IGRlYnVnIGluZm8gZm9yIHByb2ZpbGluZy4KKyAgYm9vbCBpc0RlYnVnSW5mb0ZvclByb2ZpbGluZygpIGNvbnN0OworCitwcml2YXRlOgorICB2b2lkIGFsbG9jSHVuZ29mZlVzZWxpc3QoKTsKKyAgdGVtcGxhdGU8aW50IElkeD4gdm9pZCBzZXRIdW5nb2ZmT3BlcmFuZChDb25zdGFudCAqQyk7CisKKyAgLy8vIFNoYWRvdyBWYWx1ZTo6c2V0VmFsdWVTdWJjbGFzc0RhdGEgd2l0aCBhIHByaXZhdGUgZm9yd2FyZGluZyBtZXRob2Qgc28KKyAgLy8vIHRoYXQgc3ViY2xhc3NlcyBjYW5ub3QgYWNjaWRlbnRhbGx5IHVzZSBpdC4KKyAgdm9pZCBzZXRWYWx1ZVN1YmNsYXNzRGF0YSh1bnNpZ25lZCBzaG9ydCBEKSB7CisgICAgVmFsdWU6OnNldFZhbHVlU3ViY2xhc3NEYXRhKEQpOworICB9CisgIHZvaWQgc2V0VmFsdWVTdWJjbGFzc0RhdGFCaXQodW5zaWduZWQgQml0LCBib29sIE9uKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxGdW5jdGlvbj4gOiBwdWJsaWMgSHVuZ29mZk9wZXJhbmRUcmFpdHM8Mz4ge307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhGdW5jdGlvbiwgVmFsdWUpCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0ZVTkNUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvR1ZNYXRlcmlhbGl6ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvR1ZNYXRlcmlhbGl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzVhYmViCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9HVk1hdGVyaWFsaXplci5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vPT09LSBHVk1hdGVyaWFsaXplci5oIC0gSW50ZXJmYWNlIGZvciBHViBtYXRlcmlhbGl6ZXJzIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGVzIGFuIGFic3RyYWN0IGludGVyZmFjZSBmb3IgbG9hZGluZyBhIG1vZHVsZSBmcm9tIHNvbWUKKy8vIHBsYWNlLiAgVGhpcyBpbnRlcmZhY2UgYWxsb3dzIGluY3JlbWVudGFsIG9yIHJhbmRvbSBhY2Nlc3MgbG9hZGluZyBvZgorLy8gZnVuY3Rpb25zIGZyb20gdGhlIGZpbGUuICBUaGlzIGlzIHVzZWZ1bCBmb3IgYXBwbGljYXRpb25zIGxpa2UgSklUIGNvbXBpbGVycworLy8gb3IgaW50ZXJwcm9jZWR1cmFsIG9wdGltaXplcnMgdGhhdCBkbyBub3QgbmVlZCB0aGUgZW50aXJlIHByb2dyYW0gaW4gbWVtb3J5CisvLyBhdCB0aGUgc2FtZSB0aW1lLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9HVk1BVEVSSUFMSVpFUl9ICisjZGVmaW5lIExMVk1fSVJfR1ZNQVRFUklBTElaRVJfSAorCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEVycm9yOworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBTdHJ1Y3RUeXBlOworCitjbGFzcyBHVk1hdGVyaWFsaXplciB7Citwcm90ZWN0ZWQ6CisgIEdWTWF0ZXJpYWxpemVyKCkgPSBkZWZhdWx0OworCitwdWJsaWM6CisgIHZpcnR1YWwgfkdWTWF0ZXJpYWxpemVyKCk7CisKKyAgLy8vIE1ha2Ugc3VyZSB0aGUgZ2l2ZW4gR2xvYmFsVmFsdWUgaXMgZnVsbHkgcmVhZC4KKyAgLy8vCisgIHZpcnR1YWwgRXJyb3IgbWF0ZXJpYWxpemUoR2xvYmFsVmFsdWUgKkdWKSA9IDA7CisKKyAgLy8vIE1ha2Ugc3VyZSB0aGUgZW50aXJlIE1vZHVsZSBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlYWQuCisgIC8vLworICB2aXJ0dWFsIEVycm9yIG1hdGVyaWFsaXplTW9kdWxlKCkgPSAwOworCisgIHZpcnR1YWwgRXJyb3IgbWF0ZXJpYWxpemVNZXRhZGF0YSgpID0gMDsKKyAgdmlydHVhbCB2b2lkIHNldFN0cmlwRGVidWdJbmZvKCkgPSAwOworCisgIHZpcnR1YWwgc3RkOjp2ZWN0b3I8U3RydWN0VHlwZSAqPiBnZXRJZGVudGlmaWVkU3RydWN0VHlwZXMoKSBjb25zdCA9IDA7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9HVk1BVEVSSUFMSVpFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0dldEVsZW1lbnRQdHJUeXBlSXRlcmF0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvR2V0RWxlbWVudFB0clR5cGVJdGVyYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMTQzZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0dldEVsZW1lbnRQdHJUeXBlSXRlcmF0b3IuaApAQCAtMCwwICsxLDE2NCBAQAorLy89PT0tIEdldEVsZW1lbnRQdHJUeXBlSXRlcmF0b3IuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhbiBpdGVyYXRvciBmb3Igd2Fsa2luZyB0aHJvdWdoIHRoZSB0eXBlcyBpbmRleGVkIGJ5CisvLyBnZXRlbGVtZW50cHRyIGluc3RydWN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfR0VURUxFTUVOVFBUUlRZUEVJVEVSQVRPUl9ICisjZGVmaW5lIExMVk1fSVJfR0VURUxFTUVOVFBUUlRZUEVJVEVSQVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJVbmlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9PcGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvVXNlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdFR5ID0gVXNlcjo6Y29uc3Rfb3BfaXRlcmF0b3I+CisgIGNsYXNzIGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIFR5cGUgKiwgcHRyZGlmZl90PiB7CisgICAgdXNpbmcgc3VwZXIgPSBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIFR5cGUgKiwgcHRyZGlmZl90PjsKKworICAgIEl0VHkgT3BJdDsKKyAgICBQb2ludGVyVW5pb248U3RydWN0VHlwZSAqLCBUeXBlICo+IEN1clR5OworICAgIGVudW0gOiB1aW50NjRfdCB7IFVuYm91bmRlZCA9IC0xdWxsIH07CisgICAgdWludDY0X3QgTnVtRWxlbWVudHMgPSBVbmJvdW5kZWQ7CisKKyAgICBnZW5lcmljX2dlcF90eXBlX2l0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgIHB1YmxpYzoKKyAgICBzdGF0aWMgZ2VuZXJpY19nZXBfdHlwZV9pdGVyYXRvciBiZWdpbihUeXBlICpUeSwgSXRUeSBJdCkgeworICAgICAgZ2VuZXJpY19nZXBfdHlwZV9pdGVyYXRvciBJOworICAgICAgSS5DdXJUeSA9IFR5OworICAgICAgSS5PcEl0ID0gSXQ7CisgICAgICByZXR1cm4gSTsKKyAgICB9CisKKyAgICBzdGF0aWMgZ2VuZXJpY19nZXBfdHlwZV9pdGVyYXRvciBlbmQoSXRUeSBJdCkgeworICAgICAgZ2VuZXJpY19nZXBfdHlwZV9pdGVyYXRvciBJOworICAgICAgSS5PcEl0ID0gSXQ7CisgICAgICByZXR1cm4gSTsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgZ2VuZXJpY19nZXBfdHlwZV9pdGVyYXRvciYgeCkgY29uc3QgeworICAgICAgcmV0dXJuIE9wSXQgPT0geC5PcEl0OworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBnZW5lcmljX2dlcF90eXBlX2l0ZXJhdG9yJiB4KSBjb25zdCB7CisgICAgICByZXR1cm4gIW9wZXJhdG9yPT0oeCk7CisgICAgfQorCisgICAgLy8gRklYTUU6IE1ha2UgdGhpcyB0aGUgaXRlcmF0b3IncyBvcGVyYXRvciooKSBhZnRlciB0aGUgNC4wIHJlbGVhc2UuCisgICAgLy8gb3BlcmF0b3IqKCkgaGFkIGEgZGlmZmVyZW50IG1lYW5pbmcgaW4gZWFybGllciByZWxlYXNlcywgc28gd2UncmUKKyAgICAvLyB0ZW1wb3JhcmlseSBub3QgZ2l2aW5nIHRoaXMgaXRlcmF0b3IgYW4gb3BlcmF0b3IqKCkgdG8gYXZvaWQgYSBzdWJ0bGUKKyAgICAvLyBzZW1hbnRpY3MgYnJlYWsuCisgICAgVHlwZSAqZ2V0SW5kZXhlZFR5cGUoKSBjb25zdCB7CisgICAgICBpZiAoYXV0byAqVCA9IEN1clR5LmR5bl9jYXN0PFR5cGUgKj4oKSkKKyAgICAgICAgcmV0dXJuIFQ7CisgICAgICByZXR1cm4gQ3VyVHkuZ2V0PFN0cnVjdFR5cGUgKj4oKS0+Z2V0VHlwZUF0SW5kZXgoZ2V0T3BlcmFuZCgpKTsKKyAgICB9CisKKyAgICBWYWx1ZSAqZ2V0T3BlcmFuZCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUgKj4oJioqT3BJdCk7IH0KKworICAgIGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7ICAgLy8gUHJlaW5jcmVtZW50CisgICAgICBUeXBlICpUeSA9IGdldEluZGV4ZWRUeXBlKCk7CisgICAgICBpZiAoYXV0byAqU1R5ID0gZHluX2Nhc3Q8U2VxdWVudGlhbFR5cGU+KFR5KSkgeworICAgICAgICBDdXJUeSA9IFNUeS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgICAgICAgTnVtRWxlbWVudHMgPSBTVHktPmdldE51bUVsZW1lbnRzKCk7CisgICAgICB9IGVsc2UKKyAgICAgICAgQ3VyVHkgPSBkeW5fY2FzdDxTdHJ1Y3RUeXBlPihUeSk7CisgICAgICArK09wSXQ7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgZ2VuZXJpY19nZXBfdHlwZV9pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeyAvLyBQb3N0aW5jcmVtZW50CisgICAgICBnZW5lcmljX2dlcF90eXBlX2l0ZXJhdG9yIHRtcCA9ICp0aGlzOyArKyp0aGlzOyByZXR1cm4gdG1wOworICAgIH0KKworICAgIC8vIEFsbCBvZiB0aGUgYmVsb3cgQVBJIGlzIGZvciBxdWVyeWluZyBwcm9wZXJ0aWVzIG9mIHRoZSAib3V0ZXIgdHlwZSIsIGkuZS4KKyAgICAvLyB0aGUgdHlwZSB0aGF0IGNvbnRhaW5zIHRoZSBpbmRleGVkIHR5cGUuIE1vc3Qgb2YgdGhlIHRpbWUgdGhpcyBpcyBqdXN0CisgICAgLy8gdGhlIHR5cGUgdGhhdCB3YXMgdmlzaXRlZCBpbW1lZGlhdGVseSBwcmlvciB0byB0aGUgaW5kZXhlZCB0eXBlLCBidXQgZm9yCisgICAgLy8gdGhlIGZpcnN0IGVsZW1lbnQgdGhpcyBpcyBhbiB1bmJvdW5kZWQgYXJyYXkgb2YgdGhlIEdFUCdzIHNvdXJjZSBlbGVtZW50CisgICAgLy8gdHlwZSwgZm9yIHdoaWNoIHRoZXJlIGlzIG5vIGNsZWFybHkgY29ycmVzcG9uZGluZyBJUiB0eXBlICh3ZSd2ZQorICAgIC8vIGhpc3RvcmljYWxseSB1c2VkIGEgcG9pbnRlciB0eXBlIGFzIHRoZSBvdXRlciB0eXBlIGluIHRoaXMgY2FzZSwgYnV0CisgICAgLy8gcG9pbnRlcnMgd2lsbCBzb29uIGxvc2UgdGhlaXIgZWxlbWVudCB0eXBlKS4KKyAgICAvLworICAgIC8vIEZJWE1FOiBNb3N0IGN1cnJlbnQgdXNlcnMgb2YgdGhpcyBjbGFzcyBhcmUganVzdCBpbnRlcmVzdGVkIGluIGJ5dGUKKyAgICAvLyBvZmZzZXRzIChhIGZldyBuZWVkIHRvIGtub3cgd2hldGhlciB0aGUgb3V0ZXIgdHlwZSBpcyBhIHN0cnVjdCBiZWNhdXNlCisgICAgLy8gdGhleSBhcmUgdHJ5aW5nIHRvIHJlcGxhY2UgYSBjb25zdGFudCB3aXRoIGEgdmFyaWFibGUsIHdoaWNoIGlzIG9ubHkKKyAgICAvLyBsZWdhbCBmb3IgYXJyYXlzLCBlLmcuIGNhblJlcGxhY2VPcGVyYW5kV2l0aFZhcmlhYmxlIGluIFNpbXBsaWZ5Q0ZHLmNwcCk7CisgICAgLy8gd2Ugc2hvdWxkIHByb3ZpZGUgYSBtb3JlIG1pbmltYWwgQVBJIGhlcmUgdGhhdCBleHBvc2VzIG5vdCBtdWNoIG1vcmUgdGhhbgorICAgIC8vIHRoYXQuCisKKyAgICBib29sIGlzU3RydWN0KCkgY29uc3QgeyByZXR1cm4gQ3VyVHkuaXM8U3RydWN0VHlwZSAqPigpOyB9CisgICAgYm9vbCBpc1NlcXVlbnRpYWwoKSBjb25zdCB7IHJldHVybiBDdXJUeS5pczxUeXBlICo+KCk7IH0KKworICAgIFN0cnVjdFR5cGUgKmdldFN0cnVjdFR5cGUoKSBjb25zdCB7IHJldHVybiBDdXJUeS5nZXQ8U3RydWN0VHlwZSAqPigpOyB9CisKKyAgICBTdHJ1Y3RUeXBlICpnZXRTdHJ1Y3RUeXBlT3JOdWxsKCkgY29uc3QgeworICAgICAgcmV0dXJuIEN1clR5LmR5bl9jYXN0PFN0cnVjdFR5cGUgKj4oKTsKKyAgICB9CisKKyAgICBib29sIGlzQm91bmRlZFNlcXVlbnRpYWwoKSBjb25zdCB7CisgICAgICByZXR1cm4gaXNTZXF1ZW50aWFsKCkgJiYgTnVtRWxlbWVudHMgIT0gVW5ib3VuZGVkOworICAgIH0KKworICAgIHVpbnQ2NF90IGdldFNlcXVlbnRpYWxOdW1FbGVtZW50cygpIGNvbnN0IHsKKyAgICAgIGFzc2VydChpc0JvdW5kZWRTZXF1ZW50aWFsKCkpOworICAgICAgcmV0dXJuIE51bUVsZW1lbnRzOworICAgIH0KKyAgfTsKKworICB1c2luZyBnZXBfdHlwZV9pdGVyYXRvciA9IGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3I8PjsKKworICBpbmxpbmUgZ2VwX3R5cGVfaXRlcmF0b3IgZ2VwX3R5cGVfYmVnaW4oY29uc3QgVXNlciAqR0VQKSB7CisgICAgYXV0byAqR0VQT3AgPSBjYXN0PEdFUE9wZXJhdG9yPihHRVApOworICAgIHJldHVybiBnZXBfdHlwZV9pdGVyYXRvcjo6YmVnaW4oCisgICAgICAgIEdFUE9wLT5nZXRTb3VyY2VFbGVtZW50VHlwZSgpLAorICAgICAgICBHRVAtPm9wX2JlZ2luKCkgKyAxKTsKKyAgfQorCisgIGlubGluZSBnZXBfdHlwZV9pdGVyYXRvciBnZXBfdHlwZV9lbmQoY29uc3QgVXNlciAqR0VQKSB7CisgICAgcmV0dXJuIGdlcF90eXBlX2l0ZXJhdG9yOjplbmQoR0VQLT5vcF9lbmQoKSk7CisgIH0KKworICBpbmxpbmUgZ2VwX3R5cGVfaXRlcmF0b3IgZ2VwX3R5cGVfYmVnaW4oY29uc3QgVXNlciAmR0VQKSB7CisgICAgYXV0byAmR0VQT3AgPSBjYXN0PEdFUE9wZXJhdG9yPihHRVApOworICAgIHJldHVybiBnZXBfdHlwZV9pdGVyYXRvcjo6YmVnaW4oCisgICAgICAgIEdFUE9wLmdldFNvdXJjZUVsZW1lbnRUeXBlKCksCisgICAgICAgIEdFUC5vcF9iZWdpbigpICsgMSk7CisgIH0KKworICBpbmxpbmUgZ2VwX3R5cGVfaXRlcmF0b3IgZ2VwX3R5cGVfZW5kKGNvbnN0IFVzZXIgJkdFUCkgeworICAgIHJldHVybiBnZXBfdHlwZV9pdGVyYXRvcjo6ZW5kKEdFUC5vcF9lbmQoKSk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBpbmxpbmUgZ2VuZXJpY19nZXBfdHlwZV9pdGVyYXRvcjxjb25zdCBUICo+CisgIGdlcF90eXBlX2JlZ2luKFR5cGUgKk9wMCwgQXJyYXlSZWY8VD4gQSkgeworICAgIHJldHVybiBnZW5lcmljX2dlcF90eXBlX2l0ZXJhdG9yPGNvbnN0IFQgKj46OmJlZ2luKE9wMCwgQS5iZWdpbigpKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIGlubGluZSBnZW5lcmljX2dlcF90eXBlX2l0ZXJhdG9yPGNvbnN0IFQgKj4KKyAgZ2VwX3R5cGVfZW5kKFR5cGUgKiAvKk9wMCovLCBBcnJheVJlZjxUPiBBKSB7CisgICAgcmV0dXJuIGdlbmVyaWNfZ2VwX3R5cGVfaXRlcmF0b3I8Y29uc3QgVCAqPjo6ZW5kKEEuZW5kKCkpOworICB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0dFVEVMRU1FTlRQVFJUWVBFSVRFUkFUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9HbG9iYWxBbGlhcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9HbG9iYWxBbGlhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1MDU4M2IKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0dsb2JhbEFsaWFzLmgKQEAgLTAsMCArMSw5OCBAQAorLy89PT0tLS0tLS0tLSBsbHZtL0dsb2JhbEFsaWFzLmggLSBHbG9iYWxBbGlhcyBjbGFzcyAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBHbG9iYWxBbGlhcyBjbGFzcywgd2hpY2gKKy8vIHJlcHJlc2VudHMgYSBzaW5nbGUgZnVuY3Rpb24gb3IgdmFyaWFibGUgYWxpYXMgaW4gdGhlIElSLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9HTE9CQUxBTElBU19ICisjZGVmaW5lIExMVk1fSVJfR0xPQkFMQUxJQVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3Rfbm9kZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsSW5kaXJlY3RTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVHdpbmU7CitjbGFzcyBNb2R1bGU7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVTdWJDbGFzcz4gY2xhc3MgU3ltYm9sVGFibGVMaXN0VHJhaXRzOworCitjbGFzcyBHbG9iYWxBbGlhcyA6IHB1YmxpYyBHbG9iYWxJbmRpcmVjdFN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgcHVibGljIGlsaXN0X25vZGU8R2xvYmFsQWxpYXM+IHsKKyAgZnJpZW5kIGNsYXNzIFN5bWJvbFRhYmxlTGlzdFRyYWl0czxHbG9iYWxBbGlhcz47CisKKyAgR2xvYmFsQWxpYXMoVHlwZSAqVHksIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSwgTGlua2FnZVR5cGVzIExpbmthZ2UsCisgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lLCBDb25zdGFudCAqQWxpYXNlZSwgTW9kdWxlICpQYXJlbnQpOworCitwdWJsaWM6CisgIEdsb2JhbEFsaWFzKGNvbnN0IEdsb2JhbEFsaWFzICYpID0gZGVsZXRlOworICBHbG9iYWxBbGlhcyAmb3BlcmF0b3I9KGNvbnN0IEdsb2JhbEFsaWFzICYpID0gZGVsZXRlOworCisgIC8vLyBJZiBhIHBhcmVudCBtb2R1bGUgaXMgc3BlY2lmaWVkLCB0aGUgYWxpYXMgaXMgYXV0b21hdGljYWxseSBpbnNlcnRlZCBpbnRvCisgIC8vLyB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgbW9kdWxlJ3MgYWxpYXMgbGlzdC4KKyAgc3RhdGljIEdsb2JhbEFsaWFzICpjcmVhdGUoVHlwZSAqVHksIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua2FnZVR5cGVzIExpbmthZ2UsIGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqQWxpYXNlZSwgTW9kdWxlICpQYXJlbnQpOworCisgIC8vIFdpdGhvdXQgdGhlIEFsaWFzZWUuCisgIHN0YXRpYyBHbG9iYWxBbGlhcyAqY3JlYXRlKFR5cGUgKlR5LCB1bnNpZ25lZCBBZGRyZXNzU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmthZ2VUeXBlcyBMaW5rYWdlLCBjb25zdCBUd2luZSAmTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlICpQYXJlbnQpOworCisgIC8vIFRoZSBtb2R1bGUgaXMgdGFrZW4gZnJvbSB0aGUgQWxpYXNlZS4KKyAgc3RhdGljIEdsb2JhbEFsaWFzICpjcmVhdGUoVHlwZSAqVHksIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlua2FnZVR5cGVzIExpbmthZ2UsIGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZSAqQWxpYXNlZSk7CisKKyAgLy8gVHlwZSwgUGFyZW50IGFuZCBBZGRyZXNzU3BhY2UgdGFrZW4gZnJvbSB0aGUgQWxpYXNlZS4KKyAgc3RhdGljIEdsb2JhbEFsaWFzICpjcmVhdGUoTGlua2FnZVR5cGVzIExpbmthZ2UsIGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHbG9iYWxWYWx1ZSAqQWxpYXNlZSk7CisKKyAgLy8gTGlua2FnZSwgVHlwZSwgUGFyZW50IGFuZCBBZGRyZXNzU3BhY2UgdGFrZW4gZnJvbSB0aGUgQWxpYXNlZS4KKyAgc3RhdGljIEdsb2JhbEFsaWFzICpjcmVhdGUoY29uc3QgVHdpbmUgJk5hbWUsIEdsb2JhbFZhbHVlICpBbGlhc2VlKTsKKworICB2b2lkIGNvcHlBdHRyaWJ1dGVzRnJvbShjb25zdCBHbG9iYWxWYWx1ZSAqU3JjKSB7CisgICAgR2xvYmFsVmFsdWU6OmNvcHlBdHRyaWJ1dGVzRnJvbShTcmMpOworICB9CisKKyAgLy8vIHJlbW92ZUZyb21QYXJlbnQgLSBUaGlzIG1ldGhvZCB1bmxpbmtzICd0aGlzJyBmcm9tIHRoZSBjb250YWluaW5nIG1vZHVsZSwKKyAgLy8vIGJ1dCBkb2VzIG5vdCBkZWxldGUgaXQuCisgIC8vLworICB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKTsKKworICAvLy8gZXJhc2VGcm9tUGFyZW50IC0gVGhpcyBtZXRob2QgdW5saW5rcyAndGhpcycgZnJvbSB0aGUgY29udGFpbmluZyBtb2R1bGUKKyAgLy8vIGFuZCBkZWxldGVzIGl0LgorICAvLy8KKyAgdm9pZCBlcmFzZUZyb21QYXJlbnQoKTsKKworICAvLy8gVGhlc2UgbWV0aG9kcyByZXRyaWV2ZSBhbmQgc2V0IGFsaWFzIHRhcmdldC4KKyAgdm9pZCBzZXRBbGlhc2VlKENvbnN0YW50ICpBbGlhc2VlKTsKKyAgY29uc3QgQ29uc3RhbnQgKmdldEFsaWFzZWUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEluZGlyZWN0U3ltYm9sKCk7CisgIH0KKyAgQ29uc3RhbnQgKmdldEFsaWFzZWUoKSB7CisgICAgcmV0dXJuIGdldEluZGlyZWN0U3ltYm9sKCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc1ZhbGlkTGlua2FnZShMaW5rYWdlVHlwZXMgTCkgeworICAgIHJldHVybiBpc0V4dGVybmFsTGlua2FnZShMKSB8fCBpc0xvY2FsTGlua2FnZShMKSB8fAorICAgICAgaXNXZWFrTGlua2FnZShMKSB8fCBpc0xpbmtPbmNlTGlua2FnZShMKTsKKyAgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IFZhbHVlOjpHbG9iYWxBbGlhc1ZhbDsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfR0xPQkFMQUxJQVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9HbG9iYWxJRnVuYy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9HbG9iYWxJRnVuYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmNTEzMTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0dsb2JhbElGdW5jLmgKQEAgLTAsMCArMSw4MCBAQAorLy89PT0tLS0tLS0tLSBsbHZtL0dsb2JhbElGdW5jLmggLSBHbG9iYWxJRnVuYyBjbGFzcyAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxicmllZgorLy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIEdsb2JhbElGdW5jIGNsYXNzLCB3aGljaAorLy8vIHJlcHJlc2VudHMgYSBzaW5nbGUgaW5kaXJlY3QgZnVuY3Rpb24gaW4gdGhlIElSLiBJbmRpcmVjdCBmdW5jdGlvbiB1c2VzCisvLy8gRUxGIHN5bWJvbCB0eXBlIGV4dGVuc2lvbiB0byBtYXJrIHRoYXQgdGhlIGFkZHJlc3Mgb2YgYSBkZWNsYXJhdGlvbiBzaG91bGQKKy8vLyBiZSByZXNvbHZlZCBhdCBydW50aW1lIGJ5IGNhbGxpbmcgYSByZXNvbHZlciBmdW5jdGlvbi4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0dMT0JBTElGVU5DX0gKKyNkZWZpbmUgTExWTV9JUl9HTE9CQUxJRlVOQ19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdF9ub2RlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9HbG9iYWxJbmRpcmVjdFN5bWJvbC5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBUd2luZTsKK2NsYXNzIE1vZHVsZTsKKworLy8gVHJhaXRzIGNsYXNzIGZvciB1c2luZyBHbG9iYWxJRnVuYyBpbiBzeW1ib2wgdGFibGUgaW4gTW9kdWxlLgordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlU3ViQ2xhc3M+IGNsYXNzIFN5bWJvbFRhYmxlTGlzdFRyYWl0czsKKworY2xhc3MgR2xvYmFsSUZ1bmMgZmluYWwgOiBwdWJsaWMgR2xvYmFsSW5kaXJlY3RTeW1ib2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbGlzdF9ub2RlPEdsb2JhbElGdW5jPiB7CisgIGZyaWVuZCBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8R2xvYmFsSUZ1bmM+OworCisgIEdsb2JhbElGdW5jKFR5cGUgKlR5LCB1bnNpZ25lZCBBZGRyZXNzU3BhY2UsIExpbmthZ2VUeXBlcyBMaW5rYWdlLAorICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSwgQ29uc3RhbnQgKlJlc29sdmVyLCBNb2R1bGUgKlBhcmVudCk7CisKK3B1YmxpYzoKKyAgR2xvYmFsSUZ1bmMoY29uc3QgR2xvYmFsSUZ1bmMgJikgPSBkZWxldGU7CisgIEdsb2JhbElGdW5jICZvcGVyYXRvcj0oY29uc3QgR2xvYmFsSUZ1bmMgJikgPSBkZWxldGU7CisKKyAgLy8vIElmIGEgcGFyZW50IG1vZHVsZSBpcyBzcGVjaWZpZWQsIHRoZSBpZnVuYyBpcyBhdXRvbWF0aWNhbGx5IGluc2VydGVkIGludG8KKyAgLy8vIHRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCBtb2R1bGUncyBpZnVuYyBsaXN0LgorICBzdGF0aWMgR2xvYmFsSUZ1bmMgKmNyZWF0ZShUeXBlICpUeSwgdW5zaWduZWQgQWRkcmVzc1NwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5rYWdlVHlwZXMgTGlua2FnZSwgY29uc3QgVHdpbmUgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpSZXNvbHZlciwgTW9kdWxlICpQYXJlbnQpOworCisgIHZvaWQgY29weUF0dHJpYnV0ZXNGcm9tKGNvbnN0IEdsb2JhbElGdW5jICpTcmMpIHsKKyAgICBHbG9iYWxWYWx1ZTo6Y29weUF0dHJpYnV0ZXNGcm9tKFNyYyk7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgdW5saW5rcyAndGhpcycgZnJvbSB0aGUgY29udGFpbmluZyBtb2R1bGUsIGJ1dCBkb2VzIG5vdAorICAvLy8gZGVsZXRlIGl0LgorICB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKTsKKworICAvLy8gVGhpcyBtZXRob2QgdW5saW5rcyAndGhpcycgZnJvbSB0aGUgY29udGFpbmluZyBtb2R1bGUgYW5kIGRlbGV0ZXMgaXQuCisgIHZvaWQgZXJhc2VGcm9tUGFyZW50KCk7CisKKyAgLy8vIFRoZXNlIG1ldGhvZHMgcmV0cmlldmUgYW5kIHNldCBpZnVuYyByZXNvbHZlciBmdW5jdGlvbi4KKyAgdm9pZCBzZXRSZXNvbHZlcihDb25zdGFudCAqUmVzb2x2ZXIpIHsKKyAgICBzZXRJbmRpcmVjdFN5bWJvbChSZXNvbHZlcik7CisgIH0KKyAgY29uc3QgQ29uc3RhbnQgKmdldFJlc29sdmVyKCkgY29uc3QgeworICAgIHJldHVybiBnZXRJbmRpcmVjdFN5bWJvbCgpOworICB9CisgIENvbnN0YW50ICpnZXRSZXNvbHZlcigpIHsKKyAgICByZXR1cm4gZ2V0SW5kaXJlY3RTeW1ib2woKTsKKyAgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IFZhbHVlOjpHbG9iYWxJRnVuY1ZhbDsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfR0xPQkFMSUZVTkNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9HbG9iYWxJbmRpcmVjdFN5bWJvbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9HbG9iYWxJbmRpcmVjdFN5bWJvbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYzAwNjgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0dsb2JhbEluZGlyZWN0U3ltYm9sLmgKQEAgLTAsMCArMSw5MyBAQAorLy89PT0tIGxsdm0vR2xvYmFsSW5kaXJlY3RTeW1ib2wuaCAtIEdsb2JhbEluZGlyZWN0U3ltYm9sIGNsYXNzIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBHbG9iYWxJbmRpcmVjdFN5bWJvbCBjbGFzcywgd2hpY2gKKy8vIGlzIGEgYmFzZSBjbGFzcyBmb3IgR2xvYmFsQWxpYXMgYW5kIEdsb2JhbElGdW5jLiBJdCBjb250YWlucyBhbGwgY29tbW9uIGNvZGUKKy8vIGZvciBhbGlhc2VzIGFuZCBpZnVuY3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0dMT0JBTElORElSRUNUU1lNQk9MX0gKKyNkZWZpbmUgTExWTV9JUl9HTE9CQUxJTkRJUkVDVFNZTUJPTF9ICisKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbE9iamVjdC5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL09wZXJhbmRUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1VzZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEdsb2JhbEluZGlyZWN0U3ltYm9sIDogcHVibGljIEdsb2JhbFZhbHVlIHsKK3Byb3RlY3RlZDoKKyAgR2xvYmFsSW5kaXJlY3RTeW1ib2woVHlwZSAqVHksIFZhbHVlVHkgVlR5LCB1bnNpZ25lZCBBZGRyZXNzU3BhY2UsCisgICAgICBMaW5rYWdlVHlwZXMgTGlua2FnZSwgY29uc3QgVHdpbmUgJk5hbWUsIENvbnN0YW50ICpTeW1ib2wpOworCitwdWJsaWM6CisgIEdsb2JhbEluZGlyZWN0U3ltYm9sKGNvbnN0IEdsb2JhbEluZGlyZWN0U3ltYm9sICYpID0gZGVsZXRlOworICBHbG9iYWxJbmRpcmVjdFN5bWJvbCAmb3BlcmF0b3I9KGNvbnN0IEdsb2JhbEluZGlyZWN0U3ltYm9sICYpID0gZGVsZXRlOworCisgIC8vIGFsbG9jYXRlIHNwYWNlIGZvciBleGFjdGx5IG9uZSBvcGVyYW5kCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeworICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMSk7CisgIH0KKworICAvLy8gUHJvdmlkZSBmYXN0IG9wZXJhbmQgYWNjZXNzb3JzCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoQ29uc3RhbnQpOworCisgIC8vLyBUaGVzZSBtZXRob2RzIHNldCBhbmQgcmV0cmlldmUgaW5kaXJlY3Qgc3ltYm9sLgorICB2b2lkIHNldEluZGlyZWN0U3ltYm9sKENvbnN0YW50ICpTeW1ib2wpIHsKKyAgICBzZXRPcGVyYW5kKDAsIFN5bWJvbCk7CisgIH0KKyAgY29uc3QgQ29uc3RhbnQgKmdldEluZGlyZWN0U3ltYm9sKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGVyYW5kKDApOworICB9CisgIENvbnN0YW50ICpnZXRJbmRpcmVjdFN5bWJvbCgpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxDb25zdGFudCAqPigKKyAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBHbG9iYWxJbmRpcmVjdFN5bWJvbCAqPih0aGlzKS0+Z2V0SW5kaXJlY3RTeW1ib2woKSk7CisgIH0KKworICBjb25zdCBHbG9iYWxPYmplY3QgKmdldEJhc2VPYmplY3QoKSBjb25zdCB7CisgICAgcmV0dXJuIGR5bl9jYXN0PEdsb2JhbE9iamVjdD4oZ2V0SW5kaXJlY3RTeW1ib2woKS0+c3RyaXBJbkJvdW5kc09mZnNldHMoKSk7CisgIH0KKyAgR2xvYmFsT2JqZWN0ICpnZXRCYXNlT2JqZWN0KCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PEdsb2JhbE9iamVjdCAqPigKKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR2xvYmFsSW5kaXJlY3RTeW1ib2wgKj4odGhpcyktPmdldEJhc2VPYmplY3QoKSk7CisgIH0KKworICBjb25zdCBHbG9iYWxPYmplY3QgKmdldEJhc2VPYmplY3QoY29uc3QgRGF0YUxheW91dCAmREwsIEFQSW50ICZPZmZzZXQpIGNvbnN0IHsKKyAgICByZXR1cm4gZHluX2Nhc3Q8R2xvYmFsT2JqZWN0PigKKyAgICAgICAgZ2V0SW5kaXJlY3RTeW1ib2woKS0+c3RyaXBBbmRBY2N1bXVsYXRlSW5Cb3VuZHNDb25zdGFudE9mZnNldHMoREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9mZnNldCkpOworICB9CisgIEdsb2JhbE9iamVjdCAqZ2V0QmFzZU9iamVjdChjb25zdCBEYXRhTGF5b3V0ICZETCwgQVBJbnQgJk9mZnNldCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PEdsb2JhbE9iamVjdCAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEdsb2JhbEluZGlyZWN0U3ltYm9sICo+KHRoaXMpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+Z2V0QmFzZU9iamVjdChETCwgT2Zmc2V0KSk7CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA9PSBWYWx1ZTo6R2xvYmFsQWxpYXNWYWwgfHwKKyAgICAgICAgICAgVi0+Z2V0VmFsdWVJRCgpID09IFZhbHVlOjpHbG9iYWxJRnVuY1ZhbDsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPEdsb2JhbEluZGlyZWN0U3ltYm9sPiA6CisgIHB1YmxpYyBGaXhlZE51bU9wZXJhbmRUcmFpdHM8R2xvYmFsSW5kaXJlY3RTeW1ib2wsIDE+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhHbG9iYWxJbmRpcmVjdFN5bWJvbCwgQ29uc3RhbnQpCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0dMT0JBTElORElSRUNUU1lNQk9MX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvR2xvYmFsT2JqZWN0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0dsb2JhbE9iamVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3OGIxOTMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0dsb2JhbE9iamVjdC5oCkBAIC0wLDAgKzEsMTg0IEBACisvLz09PS0tIGxsdm0vR2xvYmFsT2JqZWN0LmggLSBDbGFzcyB0byByZXByZXNlbnQgZ2xvYmFsIG9iamVjdHMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcmVwcmVzZW50cyBhbiBpbmRlcGVuZGVudCBvYmplY3QuIFRoYXQgaXMsIGEgZnVuY3Rpb24gb3IgYSBnbG9iYWwKKy8vIHZhcmlhYmxlLCBidXQgbm90IGFuIGFsaWFzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9HTE9CQUxPQkpFQ1RfSAorI2RlZmluZSBMTFZNX0lSX0dMT0JBTE9CSkVDVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbFZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIENvbWRhdDsKK2NsYXNzIE1ETm9kZTsKK2NsYXNzIE1ldGFkYXRhOworCitjbGFzcyBHbG9iYWxPYmplY3QgOiBwdWJsaWMgR2xvYmFsVmFsdWUgeworcHJvdGVjdGVkOgorICBHbG9iYWxPYmplY3QoVHlwZSAqVHksIFZhbHVlVHkgVlR5LCBVc2UgKk9wcywgdW5zaWduZWQgTnVtT3BzLAorICAgICAgICAgICAgICAgTGlua2FnZVR5cGVzIExpbmthZ2UsIGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkcmVzc1NwYWNlID0gMCkKKyAgICAgIDogR2xvYmFsVmFsdWUoVHksIFZUeSwgT3BzLCBOdW1PcHMsIExpbmthZ2UsIE5hbWUsIEFkZHJlc3NTcGFjZSksCisgICAgICAgIE9iakNvbWRhdChudWxscHRyKSB7CisgICAgc2V0R2xvYmFsVmFsdWVTdWJDbGFzc0RhdGEoMCk7CisgIH0KKworICBDb21kYXQgKk9iakNvbWRhdDsKKyAgZW51bSB7CisgICAgTGFzdEFsaWdubWVudEJpdCA9IDQsCisgICAgSGFzTWV0YWRhdGFIYXNoRW50cnlCaXQsCisgICAgSGFzU2VjdGlvbkhhc2hFbnRyeUJpdCwKKworICAgIEdsb2JhbE9iamVjdEJpdHMsCisgIH07CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBHbG9iYWxPYmplY3RTdWJDbGFzc0RhdGFCaXRzID0KKyAgICAgIEdsb2JhbFZhbHVlU3ViQ2xhc3NEYXRhQml0cyAtIEdsb2JhbE9iamVjdEJpdHM7CisKK3ByaXZhdGU6CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBBbGlnbm1lbnRCaXRzID0gTGFzdEFsaWdubWVudEJpdCArIDE7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBBbGlnbm1lbnRNYXNrID0gKDEgPDwgQWxpZ25tZW50Qml0cykgLSAxOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgR2xvYmFsT2JqZWN0TWFzayA9ICgxIDw8IEdsb2JhbE9iamVjdEJpdHMpIC0gMTsKKworcHVibGljOgorICBHbG9iYWxPYmplY3QoY29uc3QgR2xvYmFsT2JqZWN0ICYpID0gZGVsZXRlOworCisgIHVuc2lnbmVkIGdldEFsaWdubWVudCgpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBEYXRhID0gZ2V0R2xvYmFsVmFsdWVTdWJDbGFzc0RhdGEoKTsKKyAgICB1bnNpZ25lZCBBbGlnbm1lbnREYXRhID0gRGF0YSAmIEFsaWdubWVudE1hc2s7CisgICAgcmV0dXJuICgxdSA8PCBBbGlnbm1lbnREYXRhKSA+PiAxOworICB9CisgIHZvaWQgc2V0QWxpZ25tZW50KHVuc2lnbmVkIEFsaWduKTsKKworICB1bnNpZ25lZCBnZXRHbG9iYWxPYmplY3RTdWJDbGFzc0RhdGEoKSBjb25zdCB7CisgICAgdW5zaWduZWQgVmFsdWVEYXRhID0gZ2V0R2xvYmFsVmFsdWVTdWJDbGFzc0RhdGEoKTsKKyAgICByZXR1cm4gVmFsdWVEYXRhID4+IEdsb2JhbE9iamVjdEJpdHM7CisgIH0KKworICB2b2lkIHNldEdsb2JhbE9iamVjdFN1YkNsYXNzRGF0YSh1bnNpZ25lZCBWYWwpIHsKKyAgICB1bnNpZ25lZCBPbGREYXRhID0gZ2V0R2xvYmFsVmFsdWVTdWJDbGFzc0RhdGEoKTsKKyAgICBzZXRHbG9iYWxWYWx1ZVN1YkNsYXNzRGF0YSgoT2xkRGF0YSAmIEdsb2JhbE9iamVjdE1hc2spIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVmFsIDw8IEdsb2JhbE9iamVjdEJpdHMpKTsKKyAgICBhc3NlcnQoZ2V0R2xvYmFsT2JqZWN0U3ViQ2xhc3NEYXRhKCkgPT0gVmFsICYmICJyZXByZXNlbnRhdGlvbiBlcnJvciIpOworICB9CisKKyAgLy8vIENoZWNrIGlmIHRoaXMgZ2xvYmFsIGhhcyBhIGN1c3RvbSBvYmplY3QgZmlsZSBzZWN0aW9uLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgbW9yZSBlZmZpY2llbnQgdGhhbiBjYWxsaW5nIGdldFNlY3Rpb24oKSBhbmQgY2hlY2tpbmcgZm9yIGFuIGVtcHR5CisgIC8vLyBzdHJpbmcuCisgIGJvb2wgaGFzU2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0R2xvYmFsVmFsdWVTdWJDbGFzc0RhdGEoKSAmICgxIDw8IEhhc1NlY3Rpb25IYXNoRW50cnlCaXQpOworICB9CisKKyAgLy8vIEdldCB0aGUgY3VzdG9tIHNlY3Rpb24gb2YgdGhpcyBnbG9iYWwgaWYgaXQgaGFzIG9uZS4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIGdsb2JhbCBkb2VzIG5vdCBoYXZlIGEgY3VzdG9tIHNlY3Rpb24sIHRoaXMgd2lsbCBiZSBlbXB0eSBhbmQgdGhlCisgIC8vLyBkZWZhdWx0IG9iamVjdCBmaWxlIHNlY3Rpb24gKC50ZXh0LCAuZGF0YSwgZXRjKSB3aWxsIGJlIHVzZWQuCisgIFN0cmluZ1JlZiBnZXRTZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBoYXNTZWN0aW9uKCkgPyBnZXRTZWN0aW9uSW1wbCgpIDogU3RyaW5nUmVmKCk7CisgIH0KKworICAvLy8gQ2hhbmdlIHRoZSBzZWN0aW9uIGZvciB0aGlzIGdsb2JhbC4KKyAgLy8vCisgIC8vLyBTZXR0aW5nIHRoZSBzZWN0aW9uIHRvIHRoZSBlbXB0eSBzdHJpbmcgdGVsbHMgTExWTSB0byBjaG9vc2UgYW4KKyAgLy8vIGFwcHJvcHJpYXRlIGRlZmF1bHQgb2JqZWN0IGZpbGUgc2VjdGlvbi4KKyAgdm9pZCBzZXRTZWN0aW9uKFN0cmluZ1JlZiBTKTsKKworICBib29sIGhhc0NvbWRhdCgpIGNvbnN0IHsgcmV0dXJuIGdldENvbWRhdCgpICE9IG51bGxwdHI7IH0KKyAgY29uc3QgQ29tZGF0ICpnZXRDb21kYXQoKSBjb25zdCB7IHJldHVybiBPYmpDb21kYXQ7IH0KKyAgQ29tZGF0ICpnZXRDb21kYXQoKSB7IHJldHVybiBPYmpDb21kYXQ7IH0KKyAgdm9pZCBzZXRDb21kYXQoQ29tZGF0ICpDKSB7IE9iakNvbWRhdCA9IEM7IH0KKworICAvLy8gQ2hlY2sgaWYgdGhpcyBoYXMgYW55IG1ldGFkYXRhLgorICBib29sIGhhc01ldGFkYXRhKCkgY29uc3QgeyByZXR1cm4gaGFzTWV0YWRhdGFIYXNoRW50cnkoKTsgfQorCisgIC8vLyBHZXQgdGhlIGN1cnJlbnQgbWV0YWRhdGEgYXR0YWNobWVudHMgZm9yIHRoZSBnaXZlbiBraW5kLCBpZiBhbnkuCisgIC8vLworICAvLy8gVGhlc2UgZnVuY3Rpb25zIHJlcXVpcmUgdGhhdCB0aGUgZnVuY3Rpb24gaGF2ZSBhdCBtb3N0IGEgc2luZ2xlIGF0dGFjaG1lbnQKKyAgLy8vIG9mIHRoZSBnaXZlbiBraW5kLCBhbmQgcmV0dXJuIFxjIG51bGxwdHIgaWYgc3VjaCBhbiBhdHRhY2htZW50IGlzIG1pc3NpbmcuCisgIC8vLyBAeworICBNRE5vZGUgKmdldE1ldGFkYXRhKHVuc2lnbmVkIEtpbmRJRCkgY29uc3Q7CisgIE1ETm9kZSAqZ2V0TWV0YWRhdGEoU3RyaW5nUmVmIEtpbmQpIGNvbnN0OworICAvLy8gQH0KKworICAvLy8gQXBwZW5kcyBhbGwgYXR0YWNobWVudHMgd2l0aCB0aGUgZ2l2ZW4gSUQgdG8gXGMgTURzIGluIGluc2VydGlvbiBvcmRlci4KKyAgLy8vIElmIHRoZSBnbG9iYWwgaGFzIG5vIGF0dGFjaG1lbnRzIHdpdGggdGhlIGdpdmVuIElELCBvciBpZiBJRCBpcyBpbnZhbGlkLAorICAvLy8gbGVhdmVzIE1EcyB1bmNoYW5nZWQuCisgIC8vLyBAeworICB2b2lkIGdldE1ldGFkYXRhKHVuc2lnbmVkIEtpbmRJRCwgU21hbGxWZWN0b3JJbXBsPE1ETm9kZSAqPiAmTURzKSBjb25zdDsKKyAgdm9pZCBnZXRNZXRhZGF0YShTdHJpbmdSZWYgS2luZCwgU21hbGxWZWN0b3JJbXBsPE1ETm9kZSAqPiAmTURzKSBjb25zdDsKKyAgLy8vIEB9CisKKyAgLy8vIFNldCBhIHBhcnRpY3VsYXIga2luZCBvZiBtZXRhZGF0YSBhdHRhY2htZW50LgorICAvLy8KKyAgLy8vIFNldHMgdGhlIGdpdmVuIGF0dGFjaG1lbnQgdG8gXGMgTUQsIGVyYXNpbmcgaXQgaWYgXGMgTUQgaXMgXGMgbnVsbHB0ciBvcgorICAvLy8gcmVwbGFjaW5nIGl0IGlmIGl0IGFscmVhZHkgZXhpc3RzLgorICAvLy8gQHsKKyAgdm9pZCBzZXRNZXRhZGF0YSh1bnNpZ25lZCBLaW5kSUQsIE1ETm9kZSAqTUQpOworICB2b2lkIHNldE1ldGFkYXRhKFN0cmluZ1JlZiBLaW5kLCBNRE5vZGUgKk1EKTsKKyAgLy8vIEB9CisKKyAgLy8vIEFkZCBhIG1ldGFkYXRhIGF0dGFjaG1lbnQuCisgIC8vLyBAeworICB2b2lkIGFkZE1ldGFkYXRhKHVuc2lnbmVkIEtpbmRJRCwgTUROb2RlICZNRCk7CisgIHZvaWQgYWRkTWV0YWRhdGEoU3RyaW5nUmVmIEtpbmQsIE1ETm9kZSAmTUQpOworICAvLy8gQH0KKworICAvLy8gQXBwZW5kcyBhbGwgYXR0YWNobWVudHMgZm9yIHRoZSBnbG9iYWwgdG8gXGMgTURzLCBzb3J0aW5nIGJ5IGF0dGFjaG1lbnQKKyAgLy8vIElELiBBdHRhY2htZW50cyB3aXRoIHRoZSBzYW1lIElEIGFwcGVhciBpbiBpbnNlcnRpb24gb3JkZXIuCisgIHZvaWQKKyAgZ2V0QWxsTWV0YWRhdGEoU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjx1bnNpZ25lZCwgTUROb2RlICo+PiAmTURzKSBjb25zdDsKKworICAvLy8gRXJhc2UgYWxsIG1ldGFkYXRhIGF0dGFjaG1lbnRzIHdpdGggdGhlIGdpdmVuIGtpbmQuCisgIHZvaWQgZXJhc2VNZXRhZGF0YSh1bnNpZ25lZCBLaW5kSUQpOworCisgIC8vLyBDb3B5IG1ldGFkYXRhIGZyb20gU3JjLCBhZGp1c3Rpbmcgb2Zmc2V0cyBieSBPZmZzZXQuCisgIHZvaWQgY29weU1ldGFkYXRhKGNvbnN0IEdsb2JhbE9iamVjdCAqU3JjLCB1bnNpZ25lZCBPZmZzZXQpOworCisgIHZvaWQgYWRkVHlwZU1ldGFkYXRhKHVuc2lnbmVkIE9mZnNldCwgTWV0YWRhdGEgKlR5cGVJRCk7CisKK3Byb3RlY3RlZDoKKyAgdm9pZCBjb3B5QXR0cmlidXRlc0Zyb20oY29uc3QgR2xvYmFsT2JqZWN0ICpTcmMpOworCitwdWJsaWM6CisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IFZhbHVlOjpGdW5jdGlvblZhbCB8fAorICAgICAgICAgICBWLT5nZXRWYWx1ZUlEKCkgPT0gVmFsdWU6Okdsb2JhbFZhcmlhYmxlVmFsOworICB9CisKKyAgdm9pZCBjbGVhck1ldGFkYXRhKCk7CisKK3ByaXZhdGU6CisgIHZvaWQgc2V0R2xvYmFsT2JqZWN0RmxhZyh1bnNpZ25lZCBCaXQsIGJvb2wgVmFsKSB7CisgICAgdW5zaWduZWQgTWFzayA9IDEgPDwgQml0OworICAgIHNldEdsb2JhbFZhbHVlU3ViQ2xhc3NEYXRhKCh+TWFzayAmIGdldEdsb2JhbFZhbHVlU3ViQ2xhc3NEYXRhKCkpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVmFsID8gTWFzayA6IDB1KSk7CisgIH0KKworICBib29sIGhhc01ldGFkYXRhSGFzaEVudHJ5KCkgY29uc3QgeworICAgIHJldHVybiBnZXRHbG9iYWxWYWx1ZVN1YkNsYXNzRGF0YSgpICYgKDEgPDwgSGFzTWV0YWRhdGFIYXNoRW50cnlCaXQpOworICB9CisgIHZvaWQgc2V0SGFzTWV0YWRhdGFIYXNoRW50cnkoYm9vbCBIYXNFbnRyeSkgeworICAgIHNldEdsb2JhbE9iamVjdEZsYWcoSGFzTWV0YWRhdGFIYXNoRW50cnlCaXQsIEhhc0VudHJ5KTsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRTZWN0aW9uSW1wbCgpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfR0xPQkFMT0JKRUNUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvR2xvYmFsVmFsdWUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvR2xvYmFsVmFsdWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNWIwYjY5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9HbG9iYWxWYWx1ZS5oCkBAIC0wLDAgKzEsNTg2IEBACisvLz09PS0tIGxsdm0vR2xvYmFsVmFsdWUuaCAtIENsYXNzIHRvIHJlcHJlc2VudCBhIGdsb2JhbCB2YWx1ZSAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpcyBhIGNvbW1vbiBiYXNlIGNsYXNzIG9mIGFsbCBnbG9iYWxseSBkZWZpbmFibGUgb2JqZWN0cy4gIEFzIHN1Y2gsCisvLyBpdCBpcyBzdWJjbGFzc2VkIGJ5IEdsb2JhbFZhcmlhYmxlLCBHbG9iYWxBbGlhcyBhbmQgYnkgRnVuY3Rpb24uICBUaGlzIGlzCisvLyB1c2VkIGJlY2F1c2UgeW91IGNhbiBkbyBjZXJ0YWluIHRoaW5ncyB3aXRoIHRoZXNlIGdsb2JhbCBvYmplY3RzIHRoYXQgeW91CisvLyBjYW4ndCBkbyB0byBhbnl0aGluZyBlbHNlLiAgRm9yIGV4YW1wbGUsIHVzZSB0aGUgYWRkcmVzcyBvZiBvbmUgYXMgYQorLy8gY29uc3RhbnQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0dMT0JBTFZBTFVFX0gKKyNkZWZpbmUgTExWTV9JUl9HTE9CQUxWQUxVRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01ENS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQ29tZGF0OworY2xhc3MgQ29uc3RhbnRSYW5nZTsKK2NsYXNzIEVycm9yOworY2xhc3MgR2xvYmFsT2JqZWN0OworY2xhc3MgTW9kdWxlOworCituYW1lc3BhY2UgSW50cmluc2ljIHsKKyAgZW51bSBJRCA6IHVuc2lnbmVkOworfSAvLyBlbmQgbmFtZXNwYWNlIEludHJpbnNpYworCitjbGFzcyBHbG9iYWxWYWx1ZSA6IHB1YmxpYyBDb25zdGFudCB7CitwdWJsaWM6CisgIC8vLyBAYnJpZWYgQW4gZW51bWVyYXRpb24gZm9yIHRoZSBraW5kcyBvZiBsaW5rYWdlIGZvciBnbG9iYWwgdmFsdWVzLgorICBlbnVtIExpbmthZ2VUeXBlcyB7CisgICAgRXh0ZXJuYWxMaW5rYWdlID0gMCwvLy88IEV4dGVybmFsbHkgdmlzaWJsZSBmdW5jdGlvbgorICAgIEF2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlLCAvLy88IEF2YWlsYWJsZSBmb3IgaW5zcGVjdGlvbiwgbm90IGVtaXNzaW9uLgorICAgIExpbmtPbmNlQW55TGlua2FnZSwgLy8vPCBLZWVwIG9uZSBjb3B5IG9mIGZ1bmN0aW9uIHdoZW4gbGlua2luZyAoaW5saW5lKQorICAgIExpbmtPbmNlT0RSTGlua2FnZSwgLy8vPCBTYW1lLCBidXQgb25seSByZXBsYWNlZCBieSBzb21ldGhpbmcgZXF1aXZhbGVudC4KKyAgICBXZWFrQW55TGlua2FnZSwgICAgIC8vLzwgS2VlcCBvbmUgY29weSBvZiBuYW1lZCBmdW5jdGlvbiB3aGVuIGxpbmtpbmcgKHdlYWspCisgICAgV2Vha09EUkxpbmthZ2UsICAgICAvLy88IFNhbWUsIGJ1dCBvbmx5IHJlcGxhY2VkIGJ5IHNvbWV0aGluZyBlcXVpdmFsZW50LgorICAgIEFwcGVuZGluZ0xpbmthZ2UsICAgLy8vPCBTcGVjaWFsIHB1cnBvc2UsIG9ubHkgYXBwbGllcyB0byBnbG9iYWwgYXJyYXlzCisgICAgSW50ZXJuYWxMaW5rYWdlLCAgICAvLy88IFJlbmFtZSBjb2xsaXNpb25zIHdoZW4gbGlua2luZyAoc3RhdGljIGZ1bmN0aW9ucykuCisgICAgUHJpdmF0ZUxpbmthZ2UsICAgICAvLy88IExpa2UgSW50ZXJuYWwsIGJ1dCBvbWl0IGZyb20gc3ltYm9sIHRhYmxlLgorICAgIEV4dGVybmFsV2Vha0xpbmthZ2UsLy8vPCBFeHRlcm5hbFdlYWsgbGlua2FnZSBkZXNjcmlwdGlvbi4KKyAgICBDb21tb25MaW5rYWdlICAgICAgIC8vLzwgVGVudGF0aXZlIGRlZmluaXRpb25zLgorICB9OworCisgIC8vLyBAYnJpZWYgQW4gZW51bWVyYXRpb24gZm9yIHRoZSBraW5kcyBvZiB2aXNpYmlsaXR5IG9mIGdsb2JhbCB2YWx1ZXMuCisgIGVudW0gVmlzaWJpbGl0eVR5cGVzIHsKKyAgICBEZWZhdWx0VmlzaWJpbGl0eSA9IDAsICAvLy88IFRoZSBHViBpcyB2aXNpYmxlCisgICAgSGlkZGVuVmlzaWJpbGl0eSwgICAgICAgLy8vPCBUaGUgR1YgaXMgaGlkZGVuCisgICAgUHJvdGVjdGVkVmlzaWJpbGl0eSAgICAgLy8vPCBUaGUgR1YgaXMgcHJvdGVjdGVkCisgIH07CisKKyAgLy8vIEBicmllZiBTdG9yYWdlIGNsYXNzZXMgb2YgZ2xvYmFsIHZhbHVlcyBmb3IgUEUgdGFyZ2V0cy4KKyAgZW51bSBETExTdG9yYWdlQ2xhc3NUeXBlcyB7CisgICAgRGVmYXVsdFN0b3JhZ2VDbGFzcyAgID0gMCwKKyAgICBETExJbXBvcnRTdG9yYWdlQ2xhc3MgPSAxLCAvLy88IEZ1bmN0aW9uIHRvIGJlIGltcG9ydGVkIGZyb20gRExMCisgICAgRExMRXhwb3J0U3RvcmFnZUNsYXNzID0gMiAgLy8vPCBGdW5jdGlvbiB0byBiZSBhY2Nlc3NpYmxlIGZyb20gRExMLgorICB9OworCitwcm90ZWN0ZWQ6CisgIEdsb2JhbFZhbHVlKFR5cGUgKlR5LCBWYWx1ZVR5IFZUeSwgVXNlICpPcHMsIHVuc2lnbmVkIE51bU9wcywKKyAgICAgICAgICAgICAgTGlua2FnZVR5cGVzIExpbmthZ2UsIGNvbnN0IFR3aW5lICZOYW1lLCB1bnNpZ25lZCBBZGRyZXNzU3BhY2UpCisgICAgICA6IENvbnN0YW50KFBvaW50ZXJUeXBlOjpnZXQoVHksIEFkZHJlc3NTcGFjZSksIFZUeSwgT3BzLCBOdW1PcHMpLAorICAgICAgICBWYWx1ZVR5cGUoVHkpLCBWaXNpYmlsaXR5KERlZmF1bHRWaXNpYmlsaXR5KSwKKyAgICAgICAgVW5uYW1lZEFkZHJWYWwodW5zaWduZWQoVW5uYW1lZEFkZHI6Ok5vbmUpKSwKKyAgICAgICAgRGxsU3RvcmFnZUNsYXNzKERlZmF1bHRTdG9yYWdlQ2xhc3MpLCBUaHJlYWRMb2NhbChOb3RUaHJlYWRMb2NhbCksCisgICAgICAgIEhhc0xMVk1SZXNlcnZlZE5hbWUoZmFsc2UpLCBJc0RTT0xvY2FsKGZhbHNlKSwgSW50SUQoKEludHJpbnNpYzo6SUQpMFUpLAorICAgICAgICBQYXJlbnQobnVsbHB0cikgeworICAgIHNldExpbmthZ2UoTGlua2FnZSk7CisgICAgc2V0TmFtZShOYW1lKTsKKyAgfQorCisgIFR5cGUgKlZhbHVlVHlwZTsKKworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgR2xvYmFsVmFsdWVTdWJDbGFzc0RhdGFCaXRzID0gMTc7CisKKyAgLy8gQWxsIGJpdGZpZWxkcyB1c2UgdW5zaWduZWQgYXMgdGhlIHVuZGVybHlpbmcgdHlwZSBzbyB0aGF0IE1TVkMgd2lsbCBwYWNrCisgIC8vIHRoZW0uCisgIHVuc2lnbmVkIExpbmthZ2UgOiA0OyAgICAgICAvLyBUaGUgbGlua2FnZSBvZiB0aGlzIGdsb2JhbAorICB1bnNpZ25lZCBWaXNpYmlsaXR5IDogMjsgICAgLy8gVGhlIHZpc2liaWxpdHkgc3R5bGUgb2YgdGhpcyBnbG9iYWwKKyAgdW5zaWduZWQgVW5uYW1lZEFkZHJWYWwgOiAyOyAvLyBUaGlzIHZhbHVlJ3MgYWRkcmVzcyBpcyBub3Qgc2lnbmlmaWNhbnQKKyAgdW5zaWduZWQgRGxsU3RvcmFnZUNsYXNzIDogMjsgLy8gRExMIHN0b3JhZ2UgY2xhc3MKKworICB1bnNpZ25lZCBUaHJlYWRMb2NhbCA6IDM7IC8vIElzIHRoaXMgc3ltYm9sICJUaHJlYWQgTG9jYWwiLCBpZiBzbywgd2hhdCBpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBkZXNpcmVkIG1vZGVsPworCisgIC8vLyBUcnVlIGlmIHRoZSBmdW5jdGlvbidzIG5hbWUgc3RhcnRzIHdpdGggImxsdm0uIi4gIFRoaXMgY29ycmVzcG9uZHMgdG8gdGhlCisgIC8vLyB2YWx1ZSBvZiBGdW5jdGlvbjo6aXNJbnRyaW5zaWMoKSwgd2hpY2ggbWF5IGJlIHRydWUgZXZlbiBpZgorICAvLy8gRnVuY3Rpb246OmludHJpbnNpY0lEKCkgcmV0dXJucyBJbnRyaW5zaWM6Om5vdF9pbnRyaW5zaWMuCisgIHVuc2lnbmVkIEhhc0xMVk1SZXNlcnZlZE5hbWUgOiAxOworCisgIC8vLyBJZiB0cnVlIHRoZW4gdGhlcmUgaXMgYSBkZWZpbml0aW9uIHdpdGhpbiB0aGUgc2FtZSBsaW5rYWdlIHVuaXQgYW5kIHRoYXQKKyAgLy8vIGRlZmluaXRpb24gY2Fubm90IGJlIHJ1bnRpbWUgcHJlZW1wdGVkLgorICB1bnNpZ25lZCBJc0RTT0xvY2FsIDogMTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIENvbnN0YW50OworCisgIHZvaWQgbWF5YmVTZXREc29Mb2NhbCgpIHsKKyAgICBpZiAoaGFzTG9jYWxMaW5rYWdlKCkgfHwKKyAgICAgICAgKCFoYXNEZWZhdWx0VmlzaWJpbGl0eSgpICYmICFoYXNFeHRlcm5hbFdlYWtMaW5rYWdlKCkpKQorICAgICAgc2V0RFNPTG9jYWwodHJ1ZSk7CisgIH0KKworICAvLyBHaXZlIHN1YmNsYXNzZXMgYWNjZXNzIHRvIHdoYXQgb3RoZXJ3aXNlIHdvdWxkIGJlIHdhc3RlZCBwYWRkaW5nLgorICAvLyAoMTcgKyA0ICsgMiArIDIgKyAyICsgMyArIDEgKyAxKSA9PSAzMi4KKyAgdW5zaWduZWQgU3ViQ2xhc3NEYXRhIDogR2xvYmFsVmFsdWVTdWJDbGFzc0RhdGFCaXRzOworCisgIHZvaWQgZGVzdHJveUNvbnN0YW50SW1wbCgpOworICBWYWx1ZSAqaGFuZGxlT3BlcmFuZENoYW5nZUltcGwoVmFsdWUgKkZyb20sIFZhbHVlICpUbyk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIGdsb2JhbCBtYXkgYmUgcmVwbGFjZWQgYnkgYQorICAvLy8gZGlmZmVyZW50bHkgb3B0aW1pemVkIHZhcmlhbnQgb2YgdGhlIHNhbWUgc291cmNlIGxldmVsIGZ1bmN0aW9uIGF0IGxpbmsKKyAgLy8vIHRpbWUuCisgIGJvb2wgbWF5QmVEZXJlZmluZWQoKSBjb25zdCB7CisgICAgc3dpdGNoIChnZXRMaW5rYWdlKCkpIHsKKyAgICBjYXNlIFdlYWtPRFJMaW5rYWdlOgorICAgIGNhc2UgTGlua09uY2VPRFJMaW5rYWdlOgorICAgIGNhc2UgQXZhaWxhYmxlRXh0ZXJuYWxseUxpbmthZ2U6CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgV2Vha0FueUxpbmthZ2U6CisgICAgY2FzZSBMaW5rT25jZUFueUxpbmthZ2U6CisgICAgY2FzZSBDb21tb25MaW5rYWdlOgorICAgIGNhc2UgRXh0ZXJuYWxXZWFrTGlua2FnZToKKyAgICBjYXNlIEV4dGVybmFsTGlua2FnZToKKyAgICBjYXNlIEFwcGVuZGluZ0xpbmthZ2U6CisgICAgY2FzZSBJbnRlcm5hbExpbmthZ2U6CisgICAgY2FzZSBQcml2YXRlTGlua2FnZToKKyAgICAgIHJldHVybiBpc0ludGVycG9zYWJsZSgpOworICAgIH0KKworICAgIGxsdm1fdW5yZWFjaGFibGUoIkZ1bGx5IGNvdmVyZWQgc3dpdGNoIGFib3ZlISIpOworICB9CisKK3Byb3RlY3RlZDoKKyAgLy8vIFxicmllZiBUaGUgaW50cmluc2ljIElEIGZvciB0aGlzIHN1YmNsYXNzICh3aGljaCBtdXN0IGJlIGEgRnVuY3Rpb24pLgorICAvLy8KKyAgLy8vIFRoaXMgbWVtYmVyIGlzIGRlZmluZWQgYnkgdGhpcyBjbGFzcywgYnV0IG5vdCB1c2VkIGZvciBhbnl0aGluZy4KKyAgLy8vIFN1YmNsYXNzZXMgY2FuIHVzZSBpdCB0byBzdG9yZSB0aGVpciBpbnRyaW5zaWMgSUQsIGlmIHRoZXkgaGF2ZSBvbmUuCisgIC8vLworICAvLy8gVGhpcyBpcyBzdG9yZWQgaGVyZSB0byBzYXZlIHNwYWNlIGluIEZ1bmN0aW9uIG9uIDY0LWJpdCBob3N0cy4KKyAgSW50cmluc2ljOjpJRCBJbnRJRDsKKworICB1bnNpZ25lZCBnZXRHbG9iYWxWYWx1ZVN1YkNsYXNzRGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3ViQ2xhc3NEYXRhOworICB9CisgIHZvaWQgc2V0R2xvYmFsVmFsdWVTdWJDbGFzc0RhdGEodW5zaWduZWQgVikgeworICAgIGFzc2VydChWIDwgKDEgPDwgR2xvYmFsVmFsdWVTdWJDbGFzc0RhdGFCaXRzKSAmJiAiSXQgd2lsbCBub3QgZml0Iik7CisgICAgU3ViQ2xhc3NEYXRhID0gVjsKKyAgfQorCisgIE1vZHVsZSAqUGFyZW50OyAgICAgICAgICAgICAvLyBUaGUgY29udGFpbmluZyBtb2R1bGUuCisKKyAgLy8gVXNlZCBieSBTeW1ib2xUYWJsZUxpc3RUcmFpdHMuCisgIHZvaWQgc2V0UGFyZW50KE1vZHVsZSAqcGFyZW50KSB7CisgICAgUGFyZW50ID0gcGFyZW50OworICB9CisKKyAgfkdsb2JhbFZhbHVlKCkgeworICAgIHJlbW92ZURlYWRDb25zdGFudFVzZXJzKCk7ICAgLy8gcmVtb3ZlIGFueSBkZWFkIGNvbnN0YW50cyB1c2luZyB0aGlzLgorICB9CisKK3B1YmxpYzoKKyAgZW51bSBUaHJlYWRMb2NhbE1vZGUgeworICAgIE5vdFRocmVhZExvY2FsID0gMCwKKyAgICBHZW5lcmFsRHluYW1pY1RMU01vZGVsLAorICAgIExvY2FsRHluYW1pY1RMU01vZGVsLAorICAgIEluaXRpYWxFeGVjVExTTW9kZWwsCisgICAgTG9jYWxFeGVjVExTTW9kZWwKKyAgfTsKKworICBHbG9iYWxWYWx1ZShjb25zdCBHbG9iYWxWYWx1ZSAmKSA9IGRlbGV0ZTsKKworICB1bnNpZ25lZCBnZXRBbGlnbm1lbnQoKSBjb25zdDsKKworICBlbnVtIGNsYXNzIFVubmFtZWRBZGRyIHsKKyAgICBOb25lLAorICAgIExvY2FsLAorICAgIEdsb2JhbCwKKyAgfTsKKworICBib29sIGhhc0dsb2JhbFVubmFtZWRBZGRyKCkgY29uc3QgeworICAgIHJldHVybiBnZXRVbm5hbWVkQWRkcigpID09IFVubmFtZWRBZGRyOjpHbG9iYWw7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgdmFsdWUncyBhZGRyZXNzIGlzIG5vdCBzaWduaWZpY2FudCBpbiB0aGlzIG1vZHVsZS4KKyAgLy8vIFRoaXMgYXR0cmlidXRlIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgb25seSBieSB0aGUgY29kZSBnZW5lcmF0b3IgYW5kIExUTworICAvLy8gdG8gYWxsb3cgdGhlIGxpbmtlciB0byBkZWNpZGUgd2hldGhlciB0aGUgZ2xvYmFsIG5lZWRzIHRvIGJlIGluIHRoZSBzeW1ib2wKKyAgLy8vIHRhYmxlLiBJdCBzaG91bGQgcHJvYmFibHkgbm90IGJlIHVzZWQgaW4gb3B0aW1pemF0aW9ucywgYXMgdGhlIHZhbHVlIG1heQorICAvLy8gaGF2ZSB1c2VzIG91dHNpZGUgdGhlIG1vZHVsZTsgdXNlIGhhc0dsb2JhbFVubmFtZWRBZGRyKCkgaW5zdGVhZC4KKyAgYm9vbCBoYXNBdExlYXN0TG9jYWxVbm5hbWVkQWRkcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VW5uYW1lZEFkZHIoKSAhPSBVbm5hbWVkQWRkcjo6Tm9uZTsKKyAgfQorCisgIFVubmFtZWRBZGRyIGdldFVubmFtZWRBZGRyKCkgY29uc3QgeworICAgIHJldHVybiBVbm5hbWVkQWRkcihVbm5hbWVkQWRkclZhbCk7CisgIH0KKyAgdm9pZCBzZXRVbm5hbWVkQWRkcihVbm5hbWVkQWRkciBWYWwpIHsgVW5uYW1lZEFkZHJWYWwgPSB1bnNpZ25lZChWYWwpOyB9CisKKyAgc3RhdGljIFVubmFtZWRBZGRyIGdldE1pblVubmFtZWRBZGRyKFVubmFtZWRBZGRyIEEsIFVubmFtZWRBZGRyIEIpIHsKKyAgICBpZiAoQSA9PSBVbm5hbWVkQWRkcjo6Tm9uZSB8fCBCID09IFVubmFtZWRBZGRyOjpOb25lKQorICAgICAgcmV0dXJuIFVubmFtZWRBZGRyOjpOb25lOworICAgIGlmIChBID09IFVubmFtZWRBZGRyOjpMb2NhbCB8fCBCID09IFVubmFtZWRBZGRyOjpMb2NhbCkKKyAgICAgIHJldHVybiBVbm5hbWVkQWRkcjo6TG9jYWw7CisgICAgcmV0dXJuIFVubmFtZWRBZGRyOjpHbG9iYWw7CisgIH0KKworICBib29sIGhhc0NvbWRhdCgpIGNvbnN0IHsgcmV0dXJuIGdldENvbWRhdCgpICE9IG51bGxwdHI7IH0KKyAgY29uc3QgQ29tZGF0ICpnZXRDb21kYXQoKSBjb25zdDsKKyAgQ29tZGF0ICpnZXRDb21kYXQoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Q29tZGF0ICo+KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR2xvYmFsVmFsdWUgKj4odGhpcyktPmdldENvbWRhdCgpKTsKKyAgfQorCisgIFZpc2liaWxpdHlUeXBlcyBnZXRWaXNpYmlsaXR5KCkgY29uc3QgeyByZXR1cm4gVmlzaWJpbGl0eVR5cGVzKFZpc2liaWxpdHkpOyB9CisgIGJvb2wgaGFzRGVmYXVsdFZpc2liaWxpdHkoKSBjb25zdCB7IHJldHVybiBWaXNpYmlsaXR5ID09IERlZmF1bHRWaXNpYmlsaXR5OyB9CisgIGJvb2wgaGFzSGlkZGVuVmlzaWJpbGl0eSgpIGNvbnN0IHsgcmV0dXJuIFZpc2liaWxpdHkgPT0gSGlkZGVuVmlzaWJpbGl0eTsgfQorICBib29sIGhhc1Byb3RlY3RlZFZpc2liaWxpdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIFZpc2liaWxpdHkgPT0gUHJvdGVjdGVkVmlzaWJpbGl0eTsKKyAgfQorICB2b2lkIHNldFZpc2liaWxpdHkoVmlzaWJpbGl0eVR5cGVzIFYpIHsKKyAgICBhc3NlcnQoKCFoYXNMb2NhbExpbmthZ2UoKSB8fCBWID09IERlZmF1bHRWaXNpYmlsaXR5KSAmJgorICAgICAgICAgICAibG9jYWwgbGlua2FnZSByZXF1aXJlcyBkZWZhdWx0IHZpc2liaWxpdHkiKTsKKyAgICBWaXNpYmlsaXR5ID0gVjsKKyAgICBtYXliZVNldERzb0xvY2FsKCk7CisgIH0KKworICAvLy8gSWYgdGhlIHZhbHVlIGlzICJUaHJlYWQgTG9jYWwiLCBpdHMgdmFsdWUgaXNuJ3Qgc2hhcmVkIGJ5IHRoZSB0aHJlYWRzLgorICBib29sIGlzVGhyZWFkTG9jYWwoKSBjb25zdCB7IHJldHVybiBnZXRUaHJlYWRMb2NhbE1vZGUoKSAhPSBOb3RUaHJlYWRMb2NhbDsgfQorICB2b2lkIHNldFRocmVhZExvY2FsKGJvb2wgVmFsKSB7CisgICAgc2V0VGhyZWFkTG9jYWxNb2RlKFZhbCA/IEdlbmVyYWxEeW5hbWljVExTTW9kZWwgOiBOb3RUaHJlYWRMb2NhbCk7CisgIH0KKyAgdm9pZCBzZXRUaHJlYWRMb2NhbE1vZGUoVGhyZWFkTG9jYWxNb2RlIFZhbCkgeworICAgIGFzc2VydChWYWwgPT0gTm90VGhyZWFkTG9jYWwgfHwgZ2V0VmFsdWVJRCgpICE9IFZhbHVlOjpGdW5jdGlvblZhbCk7CisgICAgVGhyZWFkTG9jYWwgPSBWYWw7CisgIH0KKyAgVGhyZWFkTG9jYWxNb2RlIGdldFRocmVhZExvY2FsTW9kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VGhyZWFkTG9jYWxNb2RlPihUaHJlYWRMb2NhbCk7CisgIH0KKworICBETExTdG9yYWdlQ2xhc3NUeXBlcyBnZXRETExTdG9yYWdlQ2xhc3MoKSBjb25zdCB7CisgICAgcmV0dXJuIERMTFN0b3JhZ2VDbGFzc1R5cGVzKERsbFN0b3JhZ2VDbGFzcyk7CisgIH0KKyAgYm9vbCBoYXNETExJbXBvcnRTdG9yYWdlQ2xhc3MoKSBjb25zdCB7CisgICAgcmV0dXJuIERsbFN0b3JhZ2VDbGFzcyA9PSBETExJbXBvcnRTdG9yYWdlQ2xhc3M7CisgIH0KKyAgYm9vbCBoYXNETExFeHBvcnRTdG9yYWdlQ2xhc3MoKSBjb25zdCB7CisgICAgcmV0dXJuIERsbFN0b3JhZ2VDbGFzcyA9PSBETExFeHBvcnRTdG9yYWdlQ2xhc3M7CisgIH0KKyAgdm9pZCBzZXRETExTdG9yYWdlQ2xhc3MoRExMU3RvcmFnZUNsYXNzVHlwZXMgQykgeyBEbGxTdG9yYWdlQ2xhc3MgPSBDOyB9CisKKyAgYm9vbCBoYXNTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gIWdldFNlY3Rpb24oKS5lbXB0eSgpOyB9CisgIFN0cmluZ1JlZiBnZXRTZWN0aW9uKCkgY29uc3Q7CisKKyAgLy8vIEdsb2JhbCB2YWx1ZXMgYXJlIGFsd2F5cyBwb2ludGVycy4KKyAgUG9pbnRlclR5cGUgKmdldFR5cGUoKSBjb25zdCB7IHJldHVybiBjYXN0PFBvaW50ZXJUeXBlPihVc2VyOjpnZXRUeXBlKCkpOyB9CisKKyAgVHlwZSAqZ2V0VmFsdWVUeXBlKCkgY29uc3QgeyByZXR1cm4gVmFsdWVUeXBlOyB9CisKKyAgdm9pZCBzZXREU09Mb2NhbChib29sIExvY2FsKSB7IElzRFNPTG9jYWwgPSBMb2NhbDsgfQorCisgIGJvb2wgaXNEU09Mb2NhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSXNEU09Mb2NhbDsKKyAgfQorCisgIHN0YXRpYyBMaW5rYWdlVHlwZXMgZ2V0TGlua09uY2VMaW5rYWdlKGJvb2wgT0RSKSB7CisgICAgcmV0dXJuIE9EUiA/IExpbmtPbmNlT0RSTGlua2FnZSA6IExpbmtPbmNlQW55TGlua2FnZTsKKyAgfQorICBzdGF0aWMgTGlua2FnZVR5cGVzIGdldFdlYWtMaW5rYWdlKGJvb2wgT0RSKSB7CisgICAgcmV0dXJuIE9EUiA/IFdlYWtPRFJMaW5rYWdlIDogV2Vha0FueUxpbmthZ2U7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0V4dGVybmFsTGlua2FnZShMaW5rYWdlVHlwZXMgTGlua2FnZSkgeworICAgIHJldHVybiBMaW5rYWdlID09IEV4dGVybmFsTGlua2FnZTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0F2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlKExpbmthZ2VUeXBlcyBMaW5rYWdlKSB7CisgICAgcmV0dXJuIExpbmthZ2UgPT0gQXZhaWxhYmxlRXh0ZXJuYWxseUxpbmthZ2U7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNMaW5rT25jZU9EUkxpbmthZ2UoTGlua2FnZVR5cGVzIExpbmthZ2UpIHsKKyAgICByZXR1cm4gTGlua2FnZSA9PSBMaW5rT25jZU9EUkxpbmthZ2U7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNMaW5rT25jZUxpbmthZ2UoTGlua2FnZVR5cGVzIExpbmthZ2UpIHsKKyAgICByZXR1cm4gTGlua2FnZSA9PSBMaW5rT25jZUFueUxpbmthZ2UgfHwgTGlua2FnZSA9PSBMaW5rT25jZU9EUkxpbmthZ2U7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNXZWFrQW55TGlua2FnZShMaW5rYWdlVHlwZXMgTGlua2FnZSkgeworICAgIHJldHVybiBMaW5rYWdlID09IFdlYWtBbnlMaW5rYWdlOworICB9CisgIHN0YXRpYyBib29sIGlzV2Vha09EUkxpbmthZ2UoTGlua2FnZVR5cGVzIExpbmthZ2UpIHsKKyAgICByZXR1cm4gTGlua2FnZSA9PSBXZWFrT0RSTGlua2FnZTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc1dlYWtMaW5rYWdlKExpbmthZ2VUeXBlcyBMaW5rYWdlKSB7CisgICAgcmV0dXJuIGlzV2Vha0FueUxpbmthZ2UoTGlua2FnZSkgfHwgaXNXZWFrT0RSTGlua2FnZShMaW5rYWdlKTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0FwcGVuZGluZ0xpbmthZ2UoTGlua2FnZVR5cGVzIExpbmthZ2UpIHsKKyAgICByZXR1cm4gTGlua2FnZSA9PSBBcHBlbmRpbmdMaW5rYWdlOworICB9CisgIHN0YXRpYyBib29sIGlzSW50ZXJuYWxMaW5rYWdlKExpbmthZ2VUeXBlcyBMaW5rYWdlKSB7CisgICAgcmV0dXJuIExpbmthZ2UgPT0gSW50ZXJuYWxMaW5rYWdlOworICB9CisgIHN0YXRpYyBib29sIGlzUHJpdmF0ZUxpbmthZ2UoTGlua2FnZVR5cGVzIExpbmthZ2UpIHsKKyAgICByZXR1cm4gTGlua2FnZSA9PSBQcml2YXRlTGlua2FnZTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0xvY2FsTGlua2FnZShMaW5rYWdlVHlwZXMgTGlua2FnZSkgeworICAgIHJldHVybiBpc0ludGVybmFsTGlua2FnZShMaW5rYWdlKSB8fCBpc1ByaXZhdGVMaW5rYWdlKExpbmthZ2UpOworICB9CisgIHN0YXRpYyBib29sIGlzRXh0ZXJuYWxXZWFrTGlua2FnZShMaW5rYWdlVHlwZXMgTGlua2FnZSkgeworICAgIHJldHVybiBMaW5rYWdlID09IEV4dGVybmFsV2Vha0xpbmthZ2U7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNDb21tb25MaW5rYWdlKExpbmthZ2VUeXBlcyBMaW5rYWdlKSB7CisgICAgcmV0dXJuIExpbmthZ2UgPT0gQ29tbW9uTGlua2FnZTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc1ZhbGlkRGVjbGFyYXRpb25MaW5rYWdlKExpbmthZ2VUeXBlcyBMaW5rYWdlKSB7CisgICAgcmV0dXJuIGlzRXh0ZXJuYWxXZWFrTGlua2FnZShMaW5rYWdlKSB8fCBpc0V4dGVybmFsTGlua2FnZShMaW5rYWdlKTsKKyAgfQorCisgIC8vLyBXaGV0aGVyIHRoZSBkZWZpbml0aW9uIG9mIHRoaXMgZ2xvYmFsIG1heSBiZSByZXBsYWNlZCBieSBzb21ldGhpbmcKKyAgLy8vIG5vbi1lcXVpdmFsZW50IGF0IGxpbmsgdGltZS4gRm9yIGV4YW1wbGUsIGlmIGEgZnVuY3Rpb24gaGFzIHdlYWsgbGlua2FnZQorICAvLy8gdGhlbiB0aGUgY29kZSBkZWZpbmluZyBpdCBtYXkgYmUgcmVwbGFjZWQgYnkgZGlmZmVyZW50IGNvZGUuCisgIHN0YXRpYyBib29sIGlzSW50ZXJwb3NhYmxlTGlua2FnZShMaW5rYWdlVHlwZXMgTGlua2FnZSkgeworICAgIHN3aXRjaCAoTGlua2FnZSkgeworICAgIGNhc2UgV2Vha0FueUxpbmthZ2U6CisgICAgY2FzZSBMaW5rT25jZUFueUxpbmthZ2U6CisgICAgY2FzZSBDb21tb25MaW5rYWdlOgorICAgIGNhc2UgRXh0ZXJuYWxXZWFrTGlua2FnZToKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgY2FzZSBBdmFpbGFibGVFeHRlcm5hbGx5TGlua2FnZToKKyAgICBjYXNlIExpbmtPbmNlT0RSTGlua2FnZToKKyAgICBjYXNlIFdlYWtPRFJMaW5rYWdlOgorICAgIC8vIFRoZSBhYm92ZSB0aHJlZSBjYW5ub3QgYmUgb3ZlcnJpZGRlbiBidXQgY2FuIGJlIGRlLXJlZmluZWQuCisKKyAgICBjYXNlIEV4dGVybmFsTGlua2FnZToKKyAgICBjYXNlIEFwcGVuZGluZ0xpbmthZ2U6CisgICAgY2FzZSBJbnRlcm5hbExpbmthZ2U6CisgICAgY2FzZSBQcml2YXRlTGlua2FnZToKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiRnVsbHkgY292ZXJlZCBzd2l0Y2ggYWJvdmUhIik7CisgIH0KKworICAvLy8gV2hldGhlciB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIGdsb2JhbCBtYXkgYmUgZGlzY2FyZGVkIGlmIGl0IGlzIG5vdCB1c2VkCisgIC8vLyBpbiBpdHMgY29tcGlsYXRpb24gdW5pdC4KKyAgc3RhdGljIGJvb2wgaXNEaXNjYXJkYWJsZUlmVW51c2VkKExpbmthZ2VUeXBlcyBMaW5rYWdlKSB7CisgICAgcmV0dXJuIGlzTGlua09uY2VMaW5rYWdlKExpbmthZ2UpIHx8IGlzTG9jYWxMaW5rYWdlKExpbmthZ2UpIHx8CisgICAgICAgICAgIGlzQXZhaWxhYmxlRXh0ZXJuYWxseUxpbmthZ2UoTGlua2FnZSk7CisgIH0KKworICAvLy8gV2hldGhlciB0aGUgZGVmaW5pdGlvbiBvZiB0aGlzIGdsb2JhbCBtYXkgYmUgcmVwbGFjZWQgYXQgbGluayB0aW1lLiAgTkI6CisgIC8vLyBVc2luZyB0aGlzIG1ldGhvZCBvdXRzaWRlIG9mIHRoZSBjb2RlIGdlbmVyYXRvcnMgaXMgYWxtb3N0IGFsd2F5cyBhCisgIC8vLyBtaXN0YWtlOiB3aGVuIHdvcmtpbmcgYXQgdGhlIElSIGxldmVsIHVzZSBpc0ludGVycG9zYWJsZSBpbnN0ZWFkIGFzIGl0CisgIC8vLyBrbm93cyBhYm91dCBPRFIgc2VtYW50aWNzLgorICBzdGF0aWMgYm9vbCBpc1dlYWtGb3JMaW5rZXIoTGlua2FnZVR5cGVzIExpbmthZ2UpICB7CisgICAgcmV0dXJuIExpbmthZ2UgPT0gV2Vha0FueUxpbmthZ2UgfHwgTGlua2FnZSA9PSBXZWFrT0RSTGlua2FnZSB8fAorICAgICAgICAgICBMaW5rYWdlID09IExpbmtPbmNlQW55TGlua2FnZSB8fCBMaW5rYWdlID09IExpbmtPbmNlT0RSTGlua2FnZSB8fAorICAgICAgICAgICBMaW5rYWdlID09IENvbW1vbkxpbmthZ2UgfHwgTGlua2FnZSA9PSBFeHRlcm5hbFdlYWtMaW5rYWdlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50bHkgdmlzaWJsZSBkZWZpbml0aW9uIG9mIHRoaXMgZ2xvYmFsIChpZiBhbnkpIGlzCisgIC8vLyBleGFjdGx5IHRoZSBkZWZpbml0aW9uIHdlIHdpbGwgc2VlIGF0IHJ1bnRpbWUuCisgIC8vLworICAvLy8gTm9uLWV4YWN0IGxpbmthZ2UgdHlwZXMgaW5oaWJpdHMgbW9zdCBub24taW5saW5pbmcgSVBPLCBzaW5jZSBhCisgIC8vLyBkaWZmZXJlbnRseSBvcHRpbWl6ZWQgdmFyaWFudCBvZiB0aGUgc2FtZSBmdW5jdGlvbiBjYW4gaGF2ZSBkaWZmZXJlbnQKKyAgLy8vIG9ic2VydmFibGUgb3IgdW5kZWZpbmVkIGJlaGF2aW9yIHRoYW4gaW4gdGhlIHZhcmlhbnQgY3VycmVudGx5IHZpc2libGUuCisgIC8vLyBGb3IgaW5zdGFuY2UsIHdlIGNvdWxkIGhhdmUgc3RhcnRlZCB3aXRoCisgIC8vLworICAvLy8gICB2b2lkIGZvbyhpbnQgKnYpIHsKKyAgLy8vICAgICBpbnQgdCA9IDUgLyB2WzBdOworICAvLy8gICAgICh2b2lkKSB0OworICAvLy8gICB9CisgIC8vLworICAvLy8gYW5kICJyZWZpbmVkIiBpdCB0bworICAvLy8KKyAgLy8vICAgdm9pZCBmb28oaW50ICp2KSB7IH0KKyAgLy8vCisgIC8vLyBIb3dldmVyLCB3ZSBjYW5ub3QgaW5mZXIgcmVhZG5vbmUgZm9yIGBmb29gLCBzaW5jZSB0aGF0IHdvdWxkIGp1c3RpZnkKKyAgLy8vIERTRSdpbmcgYSBzdG9yZSB0byBgdlswXWAgYWNyb3NzIGEgY2FsbCB0byBgZm9vYCwgd2hpY2ggY2FuIGNhdXNlCisgIC8vLyB1bmRlZmluZWQgYmVoYXZpb3IgaWYgdGhlIGxpbmtlciByZXBsYWNlcyB0aGUgYWN0dWFsIGNhbGwgZGVzdGluYXRpb24gd2l0aAorICAvLy8gdGhlIHVub3B0aW1pemVkIGBmb29gLgorICAvLy8KKyAgLy8vIElubGluaW5nIGlzIG9rYXkgYWNyb3NzIG5vbi1leGFjdCBsaW5rYWdlIHR5cGVzIGFzIGxvbmcgYXMgdGhleSdyZSBub3QKKyAgLy8vIGludGVycG9zYWJsZSAoc2VlIFxjIGlzSW50ZXJwb3NhYmxlKSwgc2luY2UgaW4gc3VjaCBjYXNlcyB0aGUgY3VycmVudGx5CisgIC8vLyB2aXNpYmxlIHZhcmlhbnQgaXMgKmEqIGNvcnJlY3QgaW1wbGVtZW50YXRpb24gb2YgdGhlIG9yaWdpbmFsIHNvdXJjZQorICAvLy8gZnVuY3Rpb247IGl0IGp1c3QgaXNuJ3QgdGhlICpvbmx5KiBjb3JyZWN0IGltcGxlbWVudGF0aW9uLgorICBib29sIGlzRGVmaW5pdGlvbkV4YWN0KCkgY29uc3QgeworICAgIHJldHVybiAhbWF5QmVEZXJlZmluZWQoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGdsb2JhbCBoYXMgYW4gZXhhY3QgZGVmaW50aW9uLgorICBib29sIGhhc0V4YWN0RGVmaW5pdGlvbigpIGNvbnN0IHsKKyAgICAvLyBXaGlsZSB0aGlzIGNvbXB1dGVzIGV4YWN0bHkgdGhlIHNhbWUgdGhpbmcgYXMKKyAgICAvLyBpc1N0cm9uZ0RlZmluaXRpb25Gb3JMaW5rZXIsIHRoZSBpbnRlbmRlZCB1c2VzIGFyZSBkaWZmZXJlbnQuICBUaGlzCisgICAgLy8gZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gaGVscCBkZWNpZGUgaWYgc3BlY2lmaWMgaW50ZXItcHJvY2VkdXJhbAorICAgIC8vIHRyYW5zZm9ybXMgYXJlIGNvcnJlY3QsIHdoaWxlIGlzU3Ryb25nRGVmaW5pdGlvbkZvckxpbmtlcidzIGludGVuZGVkIHVzZQorICAgIC8vIGlzIGluIGxvdyBsZXZlbCBjb2RlIGdlbmVyYXRpb24uCisgICAgcmV0dXJuICFpc0RlY2xhcmF0aW9uKCkgJiYgaXNEZWZpbml0aW9uRXhhY3QoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGdsb2JhbCdzIGRlZmluaXRpb24gY2FuIGJlIHN1YnN0aXR1dGVkIHdpdGggYW4KKyAgLy8vICphcmJpdHJhcnkqIGRlZmluaXRpb24gYXQgbGluayB0aW1lLiAgV2UgY2Fubm90IGRvIGFueSBJUE8gb3IgaW5saW5pbmluZworICAvLy8gYWNyb3NzIGludGVycG9zYWJsZSBjYWxsIGVkZ2VzLCBzaW5jZSB0aGUgY2FsbGVlIGNhbiBiZSByZXBsYWNlZCB3aXRoCisgIC8vLyBzb21ldGhpbmcgYXJiaXRyYXJ5IGF0IGxpbmsgdGltZS4KKyAgYm9vbCBpc0ludGVycG9zYWJsZSgpIGNvbnN0IHsgcmV0dXJuIGlzSW50ZXJwb3NhYmxlTGlua2FnZShnZXRMaW5rYWdlKCkpOyB9CisKKyAgYm9vbCBoYXNFeHRlcm5hbExpbmthZ2UoKSBjb25zdCB7IHJldHVybiBpc0V4dGVybmFsTGlua2FnZShnZXRMaW5rYWdlKCkpOyB9CisgIGJvb2wgaGFzQXZhaWxhYmxlRXh0ZXJuYWxseUxpbmthZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQXZhaWxhYmxlRXh0ZXJuYWxseUxpbmthZ2UoZ2V0TGlua2FnZSgpKTsKKyAgfQorICBib29sIGhhc0xpbmtPbmNlTGlua2FnZSgpIGNvbnN0IHsgcmV0dXJuIGlzTGlua09uY2VMaW5rYWdlKGdldExpbmthZ2UoKSk7IH0KKyAgYm9vbCBoYXNMaW5rT25jZU9EUkxpbmthZ2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzTGlua09uY2VPRFJMaW5rYWdlKGdldExpbmthZ2UoKSk7CisgIH0KKyAgYm9vbCBoYXNXZWFrTGlua2FnZSgpIGNvbnN0IHsgcmV0dXJuIGlzV2Vha0xpbmthZ2UoZ2V0TGlua2FnZSgpKTsgfQorICBib29sIGhhc1dlYWtBbnlMaW5rYWdlKCkgY29uc3QgeyByZXR1cm4gaXNXZWFrQW55TGlua2FnZShnZXRMaW5rYWdlKCkpOyB9CisgIGJvb2wgaGFzV2Vha09EUkxpbmthZ2UoKSBjb25zdCB7IHJldHVybiBpc1dlYWtPRFJMaW5rYWdlKGdldExpbmthZ2UoKSk7IH0KKyAgYm9vbCBoYXNBcHBlbmRpbmdMaW5rYWdlKCkgY29uc3QgeyByZXR1cm4gaXNBcHBlbmRpbmdMaW5rYWdlKGdldExpbmthZ2UoKSk7IH0KKyAgYm9vbCBoYXNJbnRlcm5hbExpbmthZ2UoKSBjb25zdCB7IHJldHVybiBpc0ludGVybmFsTGlua2FnZShnZXRMaW5rYWdlKCkpOyB9CisgIGJvb2wgaGFzUHJpdmF0ZUxpbmthZ2UoKSBjb25zdCB7IHJldHVybiBpc1ByaXZhdGVMaW5rYWdlKGdldExpbmthZ2UoKSk7IH0KKyAgYm9vbCBoYXNMb2NhbExpbmthZ2UoKSBjb25zdCB7IHJldHVybiBpc0xvY2FsTGlua2FnZShnZXRMaW5rYWdlKCkpOyB9CisgIGJvb2wgaGFzRXh0ZXJuYWxXZWFrTGlua2FnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNFeHRlcm5hbFdlYWtMaW5rYWdlKGdldExpbmthZ2UoKSk7CisgIH0KKyAgYm9vbCBoYXNDb21tb25MaW5rYWdlKCkgY29uc3QgeyByZXR1cm4gaXNDb21tb25MaW5rYWdlKGdldExpbmthZ2UoKSk7IH0KKyAgYm9vbCBoYXNWYWxpZERlY2xhcmF0aW9uTGlua2FnZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNWYWxpZERlY2xhcmF0aW9uTGlua2FnZShnZXRMaW5rYWdlKCkpOworICB9CisKKyAgdm9pZCBzZXRMaW5rYWdlKExpbmthZ2VUeXBlcyBMVCkgeworICAgIGlmIChpc0xvY2FsTGlua2FnZShMVCkpCisgICAgICBWaXNpYmlsaXR5ID0gRGVmYXVsdFZpc2liaWxpdHk7CisgICAgTGlua2FnZSA9IExUOworICAgIG1heWJlU2V0RHNvTG9jYWwoKTsKKyAgfQorICBMaW5rYWdlVHlwZXMgZ2V0TGlua2FnZSgpIGNvbnN0IHsgcmV0dXJuIExpbmthZ2VUeXBlcyhMaW5rYWdlKTsgfQorCisgIGJvb2wgaXNEaXNjYXJkYWJsZUlmVW51c2VkKCkgY29uc3QgeworICAgIHJldHVybiBpc0Rpc2NhcmRhYmxlSWZVbnVzZWQoZ2V0TGlua2FnZSgpKTsKKyAgfQorCisgIGJvb2wgaXNXZWFrRm9yTGlua2VyKCkgY29uc3QgeyByZXR1cm4gaXNXZWFrRm9yTGlua2VyKGdldExpbmthZ2UoKSk7IH0KKworcHJvdGVjdGVkOgorICAvLy8gQ29weSBhbGwgYWRkaXRpb25hbCBhdHRyaWJ1dGVzICh0aG9zZSBub3QgbmVlZGVkIHRvIGNyZWF0ZSBhIEdsb2JhbFZhbHVlKQorICAvLy8gZnJvbSB0aGUgR2xvYmFsVmFsdWUgU3JjIHRvIHRoaXMgb25lLgorICB2b2lkIGNvcHlBdHRyaWJ1dGVzRnJvbShjb25zdCBHbG9iYWxWYWx1ZSAqU3JjKTsKKworcHVibGljOgorICAvLy8gSWYgdGhlIGdpdmVuIHN0cmluZyBiZWdpbnMgd2l0aCB0aGUgR2xvYmFsVmFsdWUgbmFtZSBtYW5nbGluZyBlc2NhcGUKKyAgLy8vIGNoYXJhY3RlciAnXDEnLCBkcm9wIGl0LgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gYXBwbGllcyBhIHNwZWNpZmljIG1hbmdsaW5nIHRoYXQgaXMgdXNlZCBpbiBQR08gcHJvZmlsZXMsCisgIC8vLyBhbW9uZyBvdGhlciB0aGluZ3MuIElmIHlvdSdyZSB0cnlpbmcgdG8gZ2V0IGEgc3ltYm9sIG5hbWUgZm9yIGFuCisgIC8vLyBhcmJpdHJhcnkgR2xvYmFsVmFsdWUsIHRoaXMgaXMgbm90IHRoZSBmdW5jdGlvbiB5b3UncmUgbG9va2luZyBmb3I7IHNlZQorICAvLy8gTWFuZ2xlci5oLgorICBzdGF0aWMgU3RyaW5nUmVmIGRyb3BMTFZNTWFuZ2xpbmdFc2NhcGUoU3RyaW5nUmVmIE5hbWUpIHsKKyAgICBpZiAoIU5hbWUuZW1wdHkoKSAmJiBOYW1lWzBdID09ICdcMScpCisgICAgICByZXR1cm4gTmFtZS5zdWJzdHIoMSk7CisgICAgcmV0dXJuIE5hbWU7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBtb2RpZmllZCBuYW1lIGZvciBhIGdsb2JhbCB2YWx1ZSBzdWl0YWJsZSB0byBiZQorICAvLy8gdXNlZCBhcyB0aGUga2V5IGZvciBhIGdsb2JhbCBsb29rdXAgKGUuZy4gcHJvZmlsZSBvciBUaGluTFRPKS4KKyAgLy8vIFRoZSB2YWx1ZSdzIG9yaWdpbmFsIG5hbWUgaXMgXGMgTmFtZSBhbmQgaGFzIGxpbmthZ2Ugb2YgdHlwZQorICAvLy8gXGMgTGlua2FnZS4gVGhlIHZhbHVlIGlzIGRlZmluZWQgaW4gbW9kdWxlIFxjIEZpbGVOYW1lLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0R2xvYmFsSWRlbnRpZmllcihTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcyBMaW5rYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmlsZU5hbWUpOworCisgIC8vLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG5hbWUgZm9yIHRoaXMgZ2xvYmFsIHZhbHVlIHN1aXRhYmxlIHRvIGJlCisgIC8vLyB1c2VkIGFzIHRoZSBrZXkgZm9yIGEgZ2xvYmFsIGxvb2t1cCAoZS5nLiBwcm9maWxlIG9yIFRoaW5MVE8pLgorICBzdGQ6OnN0cmluZyBnZXRHbG9iYWxJZGVudGlmaWVyKCkgY29uc3Q7CisKKyAgLy8vIERlY2xhcmUgYSB0eXBlIHRvIHJlcHJlc2VudCBhIGdsb2JhbCB1bmlxdWUgaWRlbnRpZmllciBmb3IgYSBnbG9iYWwgdmFsdWUuCisgIC8vLyBUaGlzIGlzIGEgNjQgYml0cyBoYXNoIHRoYXQgaXMgdXNlZCBieSBQR08gYW5kIFRoaW5MVE8gdG8gaGF2ZSBhIGNvbXBhY3QKKyAgLy8vIHVuaXF1ZSB3YXkgdG8gaWRlbnRpZnkgYSBzeW1ib2wuCisgIHVzaW5nIEdVSUQgPSB1aW50NjRfdDsKKworICAvLy8gUmV0dXJuIGEgNjQtYml0IGdsb2JhbCB1bmlxdWUgSUQgY29uc3RydWN0ZWQgZnJvbSBnbG9iYWwgdmFsdWUgbmFtZQorICAvLy8gKGkuZS4gcmV0dXJuZWQgYnkgZ2V0R2xvYmFsSWRlbnRpZmllcigpKS4KKyAgc3RhdGljIEdVSUQgZ2V0R1VJRChTdHJpbmdSZWYgR2xvYmFsTmFtZSkgeyByZXR1cm4gTUQ1SGFzaChHbG9iYWxOYW1lKTsgfQorCisgIC8vLyBSZXR1cm4gYSA2NC1iaXQgZ2xvYmFsIHVuaXF1ZSBJRCBjb25zdHJ1Y3RlZCBmcm9tIGdsb2JhbCB2YWx1ZSBuYW1lCisgIC8vLyAoaS5lLiByZXR1cm5lZCBieSBnZXRHbG9iYWxJZGVudGlmaWVyKCkpLgorICBHVUlEIGdldEdVSUQoKSBjb25zdCB7IHJldHVybiBnZXRHVUlEKGdldEdsb2JhbElkZW50aWZpZXIoKSk7IH0KKworICAvLy8gQG5hbWUgTWF0ZXJpYWxpemF0aW9uCisgIC8vLyBNYXRlcmlhbGl6YXRpb24gaXMgdXNlZCB0byBjb25zdHJ1Y3QgZnVuY3Rpb25zIG9ubHkgYXMgdGhleSdyZSBuZWVkZWQuCisgIC8vLyBUaGlzCisgIC8vLyBpcyB1c2VmdWwgdG8gcmVkdWNlIG1lbW9yeSB1c2FnZSBpbiBMTFZNIG9yIHBhcnNpbmcgd29yayBkb25lIGJ5IHRoZQorICAvLy8gQml0Y29kZVJlYWRlciB0byBsb2FkIHRoZSBNb2R1bGUuCisgIC8vLyBAeworCisgIC8vLyBJZiB0aGlzIGZ1bmN0aW9uJ3MgTW9kdWxlIGlzIGJlaW5nIGxhemlseSBzdHJlYW1lZCBpbiBmdW5jdGlvbnMgZnJvbSBkaXNrCisgIC8vLyBvciBzb21lIG90aGVyIHNvdXJjZSwgdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gY2hlY2sgdG8gc2VlIGlmIHRoZQorICAvLy8gZnVuY3Rpb24gaGFzIGJlZW4gcmVhZCBpbiB5ZXQgb3Igbm90LgorICBib29sIGlzTWF0ZXJpYWxpemFibGUoKSBjb25zdDsKKworICAvLy8gTWFrZSBzdXJlIHRoaXMgR2xvYmFsVmFsdWUgaXMgZnVsbHkgcmVhZC4KKyAgRXJyb3IgbWF0ZXJpYWxpemUoKTsKKworLy8vIEB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBwcmltYXJ5IGRlZmluaXRpb24gb2YgdGhpcyBnbG9iYWwgdmFsdWUgaXMgb3V0c2lkZSBvZgorICAvLy8gdGhlIGN1cnJlbnQgdHJhbnNsYXRpb24gdW5pdC4KKyAgYm9vbCBpc0RlY2xhcmF0aW9uKCkgY29uc3Q7CisKKyAgYm9vbCBpc0RlY2xhcmF0aW9uRm9yTGlua2VyKCkgY29uc3QgeworICAgIGlmIChoYXNBdmFpbGFibGVFeHRlcm5hbGx5TGlua2FnZSgpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICByZXR1cm4gaXNEZWNsYXJhdGlvbigpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGdsb2JhbCdzIGRlZmluaXRpb24gd2lsbCBiZSB0aGUgb25lIGNob3NlbiBieSB0aGUKKyAgLy8vIGxpbmtlci4KKyAgLy8vCisgIC8vLyBOQiEgSWRlYWxseSB0aGlzIHNob3VsZCBub3QgYmUgdXNlZCBhdCB0aGUgSVIgbGV2ZWwgYXQgYWxsLiAgSWYgeW91J3JlCisgIC8vLyBpbnRlcmVzdGVkIGluIG9wdGltaXphdGlvbiBjb25zdHJhaW50cyBpbXBsaWVkIGJ5IHRoZSBsaW5rZXIncyBhYmlsaXR5IHRvCisgIC8vLyBjaG9vc2UgYW4gaW1wbGVtZW50YXRpb24sIHByZWZlciB1c2luZyBcYyBoYXNFeGFjdERlZmluaXRpb24uCisgIGJvb2wgaXNTdHJvbmdEZWZpbml0aW9uRm9yTGlua2VyKCkgY29uc3QgeworICAgIHJldHVybiAhKGlzRGVjbGFyYXRpb25Gb3JMaW5rZXIoKSB8fCBpc1dlYWtGb3JMaW5rZXIoKSk7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGFsaWdubWVudCBvZiB0aGUgdmFsdWUgY2FuIGJlIHVuaWxhdGVyYWxseQorICAvLyBpbmNyZWFzZWQuCisgIGJvb2wgY2FuSW5jcmVhc2VBbGlnbm1lbnQoKSBjb25zdDsKKworICBjb25zdCBHbG9iYWxPYmplY3QgKmdldEJhc2VPYmplY3QoKSBjb25zdDsKKyAgR2xvYmFsT2JqZWN0ICpnZXRCYXNlT2JqZWN0KCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PEdsb2JhbE9iamVjdCAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgR2xvYmFsVmFsdWUgKj4odGhpcyktPmdldEJhc2VPYmplY3QoKSk7CisgIH0KKworICAvLy8gUmV0dXJucyB3aGV0aGVyIHRoaXMgaXMgYSByZWZlcmVuY2UgdG8gYW4gYWJzb2x1dGUgc3ltYm9sLgorICBib29sIGlzQWJzb2x1dGVTeW1ib2xSZWYoKSBjb25zdDsKKworICAvLy8gSWYgdGhpcyBpcyBhbiBhYnNvbHV0ZSBzeW1ib2wgcmVmZXJlbmNlLCByZXR1cm5zIHRoZSByYW5nZSBvZiB0aGUgc3ltYm9sLAorICAvLy8gb3RoZXJ3aXNlIHJldHVybnMgTm9uZS4KKyAgT3B0aW9uYWw8Q29uc3RhbnRSYW5nZT4gZ2V0QWJzb2x1dGVTeW1ib2xSYW5nZSgpIGNvbnN0OworCisgIC8vLyBUaGlzIG1ldGhvZCB1bmxpbmtzICd0aGlzJyBmcm9tIHRoZSBjb250YWluaW5nIG1vZHVsZSwgYnV0IGRvZXMgbm90IGRlbGV0ZQorICAvLy8gaXQuCisgIHZvaWQgcmVtb3ZlRnJvbVBhcmVudCgpOworCisgIC8vLyBUaGlzIG1ldGhvZCB1bmxpbmtzICd0aGlzJyBmcm9tIHRoZSBjb250YWluaW5nIG1vZHVsZSBhbmQgZGVsZXRlcyBpdC4KKyAgdm9pZCBlcmFzZUZyb21QYXJlbnQoKTsKKworICAvLy8gR2V0IHRoZSBtb2R1bGUgdGhhdCB0aGlzIGdsb2JhbCB2YWx1ZSBpcyBjb250YWluZWQgaW5zaWRlIG9mLi4uCisgIE1vZHVsZSAqZ2V0UGFyZW50KCkgeyByZXR1cm4gUGFyZW50OyB9CisgIGNvbnN0IE1vZHVsZSAqZ2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4gUGFyZW50OyB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gVmFsdWU6OkZ1bmN0aW9uVmFsIHx8CisgICAgICAgICAgIFYtPmdldFZhbHVlSUQoKSA9PSBWYWx1ZTo6R2xvYmFsVmFyaWFibGVWYWwgfHwKKyAgICAgICAgICAgVi0+Z2V0VmFsdWVJRCgpID09IFZhbHVlOjpHbG9iYWxBbGlhc1ZhbCB8fAorICAgICAgICAgICBWLT5nZXRWYWx1ZUlEKCkgPT0gVmFsdWU6Okdsb2JhbElGdW5jVmFsOworICB9CisKKyAgLy8vIFRydWUgaWYgR1YgY2FuIGJlIGxlZnQgb3V0IG9mIHRoZSBvYmplY3Qgc3ltYm9sIHRhYmxlLiBUaGlzIGlzIHRoZSBjYXNlCisgIC8vLyBmb3IgbGlua29uY2Vfb2RyIHZhbHVlcyB3aG9zZSBhZGRyZXNzIGlzIG5vdCBzaWduaWZpY2FudC4gV2hpbGUgbGVnYWwsIGl0CisgIC8vLyBpcyBub3Qgbm9ybWFsbHkgcHJvZml0YWJsZSB0byBvbWl0IHRoZW0gZnJvbSB0aGUgLm8gc3ltYm9sIHRhYmxlLiBVc2luZworICAvLy8gdGhpcyBhbmFseXNpcyBtYWtlcyBzZW5zZSB3aGVuIHRoZSBpbmZvcm1hdGlvbiBjYW4gYmUgcGFzc2VkIGRvd24gdG8gdGhlCisgIC8vLyBsaW5rZXIgb3Igd2UgYXJlIGluIExUTy4KKyAgYm9vbCBjYW5CZU9taXR0ZWRGcm9tU3ltYm9sVGFibGUoKSBjb25zdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0dMT0JBTFZBTFVFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvR2xvYmFsVmFyaWFibGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvR2xvYmFsVmFyaWFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wM2I5ZWM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9HbG9iYWxWYXJpYWJsZS5oCkBAIC0wLDAgKzEsMjY1IEBACisvLz09PS0tIGxsdm0vR2xvYmFsVmFyaWFibGUuaCAtIEdsb2JhbFZhcmlhYmxlIGNsYXNzIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIEdsb2JhbFZhcmlhYmxlIGNsYXNzLCB3aGljaAorLy8gcmVwcmVzZW50cyBhIHNpbmdsZSBnbG9iYWwgdmFyaWFibGUgKG9yIGNvbnN0YW50KSBpbiB0aGUgVk0uCisvLworLy8gR2xvYmFsIHZhcmlhYmxlcyBhcmUgY29uc3RhbnQgcG9pbnRlcnMgdGhhdCByZWZlciB0byBodW5rcyBvZiBzcGFjZSB0aGF0IGFyZQorLy8gYWxsb2NhdGVkIGJ5IGVpdGhlciB0aGUgVk0sIG9yIGJ5IHRoZSBsaW5rZXIgaW4gYSBzdGF0aWMgY29tcGlsZXIuICBBIGdsb2JhbAorLy8gdmFyaWFibGUgbWF5IGhhdmUgYW4gaW5pdGlhbCB2YWx1ZSwgd2hpY2ggaXMgY29waWVkIGludG8gdGhlIGV4ZWN1dGFibGVzIC5kYXRhCisvLyBhcmVhLiAgR2xvYmFsIENvbnN0YW50cyBhcmUgcmVxdWlyZWQgdG8gaGF2ZSBpbml0aWFsaXplcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0dMT0JBTFZBUklBQkxFX0gKKyNkZWZpbmUgTExWTV9JUl9HTE9CQUxWQVJJQUJMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVyVW5pb24uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbE9iamVjdC5oIgorI2luY2x1ZGUgImxsdm0vSVIvT3BlcmFuZFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQ29uc3RhbnQ7CitjbGFzcyBNb2R1bGU7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVN1YkNsYXNzPiBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM7CitjbGFzcyBESUdsb2JhbFZhcmlhYmxlOworY2xhc3MgRElHbG9iYWxWYXJpYWJsZUV4cHJlc3Npb247CisKK2NsYXNzIEdsb2JhbFZhcmlhYmxlIDogcHVibGljIEdsb2JhbE9iamVjdCwgcHVibGljIGlsaXN0X25vZGU8R2xvYmFsVmFyaWFibGU+IHsKKyAgZnJpZW5kIGNsYXNzIFN5bWJvbFRhYmxlTGlzdFRyYWl0czxHbG9iYWxWYXJpYWJsZT47CisKKyAgQXR0cmlidXRlU2V0IEF0dHJzOworICBib29sIGlzQ29uc3RhbnRHbG9iYWwgOiAxOyAgICAgICAgICAgICAgICAgICAvLyBJcyB0aGlzIGEgZ2xvYmFsIGNvbnN0YW50PworICBib29sIGlzRXh0ZXJuYWxseUluaXRpYWxpemVkQ29uc3RhbnQgOiAxOyAgICAvLyBJcyB0aGlzIGEgZ2xvYmFsIHdob3NlIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbiBjaGFuZ2UgZnJvbSBpdHMgaW5pdGlhbAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZSBiZWZvcmUgZ2xvYmFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluaXRpYWxpemVycyBhcmUgcnVuPworCitwdWJsaWM6CisgIC8vLyBHbG9iYWxWYXJpYWJsZSBjdG9yIC0gSWYgYSBwYXJlbnQgbW9kdWxlIGlzIHNwZWNpZmllZCwgdGhlIGdsb2JhbCBpcworICAvLy8gYXV0b21hdGljYWxseSBpbnNlcnRlZCBpbnRvIHRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCBtb2R1bGVzIGdsb2JhbCBsaXN0LgorICBHbG9iYWxWYXJpYWJsZShUeXBlICpUeSwgYm9vbCBpc0NvbnN0YW50LCBMaW5rYWdlVHlwZXMgTGlua2FnZSwKKyAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKkluaXRpYWxpemVyID0gbnVsbHB0ciwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgVGhyZWFkTG9jYWxNb2RlID0gTm90VGhyZWFkTG9jYWwsIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSA9IDAsCisgICAgICAgICAgICAgICAgIGJvb2wgaXNFeHRlcm5hbGx5SW5pdGlhbGl6ZWQgPSBmYWxzZSk7CisgIC8vLyBHbG9iYWxWYXJpYWJsZSBjdG9yIC0gVGhpcyBjcmVhdGVzIGEgZ2xvYmFsIGFuZCBpbnNlcnRzIGl0IGJlZm9yZSB0aGUKKyAgLy8vIHNwZWNpZmllZCBvdGhlciBnbG9iYWwuCisgIEdsb2JhbFZhcmlhYmxlKE1vZHVsZSAmTSwgVHlwZSAqVHksIGJvb2wgaXNDb25zdGFudCwKKyAgICAgICAgICAgICAgICAgTGlua2FnZVR5cGVzIExpbmthZ2UsIENvbnN0YW50ICpJbml0aWFsaXplciwKKyAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwgR2xvYmFsVmFyaWFibGUgKkluc2VydEJlZm9yZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgIFRocmVhZExvY2FsTW9kZSA9IE5vdFRocmVhZExvY2FsLCB1bnNpZ25lZCBBZGRyZXNzU3BhY2UgPSAwLAorICAgICAgICAgICAgICAgICBib29sIGlzRXh0ZXJuYWxseUluaXRpYWxpemVkID0gZmFsc2UpOworICBHbG9iYWxWYXJpYWJsZShjb25zdCBHbG9iYWxWYXJpYWJsZSAmKSA9IGRlbGV0ZTsKKyAgR2xvYmFsVmFyaWFibGUgJm9wZXJhdG9yPShjb25zdCBHbG9iYWxWYXJpYWJsZSAmKSA9IGRlbGV0ZTsKKworICB+R2xvYmFsVmFyaWFibGUoKSB7CisgICAgZHJvcEFsbFJlZmVyZW5jZXMoKTsKKyAgfQorCisgIC8vIGFsbG9jYXRlIHNwYWNlIGZvciBleGFjdGx5IG9uZSBvcGVyYW5kCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeworICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMSk7CisgIH0KKworICAvLyBkZWxldGUgc3BhY2UgZm9yIGV4YWN0bHkgb25lIG9wZXJhbmQgYXMgY3JlYXRlZCBpbiB0aGUgY29ycmVzcG9uZGluZyBuZXcgb3BlcmF0b3IKKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqcHRyKXsKKyAgICBhc3NlcnQocHRyICE9IG51bGxwdHIgJiYgIm11c3Qgbm90IGJlIG51bGxwdHIiKTsKKyAgICBVc2VyICpPYmogPSBzdGF0aWNfY2FzdDxVc2VyICo+KHB0cik7CisgICAgLy8gTnVtYmVyIG9mIG9wZXJhbmRzIGNhbiBiZSBzZXQgdG8gMCBhZnRlciBjb25zdHJ1Y3Rpb24gYW5kIGluaXRpYWxpemF0aW9uLiBNYWtlIHN1cmUKKyAgICAvLyB0aGF0IG51bWJlciBvZiBvcGVyYW5kcyBpcyByZXNldCB0byAxLCBhcyB0aGlzIGlzIG5lZWRlZCBpbiBVc2VyOjpvcGVyYXRvciBkZWxldGUKKyAgICBPYmotPnNldEdsb2JhbFZhcmlhYmxlTnVtT3BlcmFuZHMoMSk7CisgICAgVXNlcjo6b3BlcmF0b3IgZGVsZXRlKE9iaik7CisgIH0KKworICAvLy8gUHJvdmlkZSBmYXN0IG9wZXJhbmQgYWNjZXNzb3JzCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworCisgIC8vLyBEZWZpbml0aW9ucyBoYXZlIGluaXRpYWxpemVycywgZGVjbGFyYXRpb25zIGRvbid0LgorICAvLy8KKyAgaW5saW5lIGJvb2wgaGFzSW5pdGlhbGl6ZXIoKSBjb25zdCB7IHJldHVybiAhaXNEZWNsYXJhdGlvbigpOyB9CisKKyAgLy8vIGhhc0RlZmluaXRpdmVJbml0aWFsaXplciAtIFdoZXRoZXIgdGhlIGdsb2JhbCB2YXJpYWJsZSBoYXMgYW4gaW5pdGlhbGl6ZXIsCisgIC8vLyBhbmQgYW55IG90aGVyIGluc3RhbmNlcyBvZiB0aGUgZ2xvYmFsICh0aGlzIGNhbiBoYXBwZW4gZHVlIHRvIHdlYWsKKyAgLy8vIGxpbmthZ2UpIGFyZSBndWFyYW50ZWVkIHRvIGhhdmUgdGhlIHNhbWUgaW5pdGlhbGl6ZXIuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IGlmIHlvdSB3YW50IHRvIHRyYW5zZm9ybSBhIGdsb2JhbCwgeW91IG11c3QgdXNlCisgIC8vLyBoYXNVbmlxdWVJbml0aWFsaXplcigpIGluc3RlYWQsIGJlY2F1c2Ugb2YgdGhlICpfb2RyIGxpbmthZ2UgdHlwZS4KKyAgLy8vCisgIC8vLyBFeGFtcGxlOgorICAvLy8KKyAgLy8vIEBhID0gZ2xvYmFsIFNvbWVUeXBlKiBudWxsIC0gSW5pdGlhbGl6ZXIgaXMgYm90aCBkZWZpbml0aXZlIGFuZCB1bmlxdWUuCisgIC8vLworICAvLy8gQGIgPSBnbG9iYWwgd2VhayBTb21lVHlwZSogbnVsbCAtIEluaXRpYWxpemVyIGlzIG5laXRoZXIgZGVmaW5pdGl2ZSBub3IKKyAgLy8vIHVuaXF1ZS4KKyAgLy8vCisgIC8vLyBAYyA9IGdsb2JhbCB3ZWFrX29kciBTb21lVHlwZSogbnVsbCAtIEluaXRpYWxpemVyIGlzIGRlZmluaXRpdmUsIGJ1dCBub3QKKyAgLy8vIHVuaXF1ZS4KKyAgaW5saW5lIGJvb2wgaGFzRGVmaW5pdGl2ZUluaXRpYWxpemVyKCkgY29uc3QgeworICAgIHJldHVybiBoYXNJbml0aWFsaXplcigpICYmCisgICAgICAvLyBUaGUgaW5pdGlhbGl6ZXIgb2YgYSBnbG9iYWwgdmFyaWFibGUgbWF5IGNoYW5nZSB0byBzb21ldGhpbmcgYXJiaXRyYXJ5CisgICAgICAvLyBhdCBsaW5rIHRpbWUuCisgICAgICAhaXNJbnRlcnBvc2FibGUoKSAmJgorICAgICAgLy8gVGhlIGluaXRpYWxpemVyIG9mIGEgZ2xvYmFsIHZhcmlhYmxlIHdpdGggdGhlIGV4dGVybmFsbHlfaW5pdGlhbGl6ZWQKKyAgICAgIC8vIG1hcmtlciBtYXkgY2hhbmdlIGF0IHJ1bnRpbWUgYmVmb3JlIEMrKyBpbml0aWFsaXplcnMgYXJlIGV2YWx1YXRlZC4KKyAgICAgICFpc0V4dGVybmFsbHlJbml0aWFsaXplZCgpOworICB9CisKKyAgLy8vIGhhc1VuaXF1ZUluaXRpYWxpemVyIC0gV2hldGhlciB0aGUgZ2xvYmFsIHZhcmlhYmxlIGhhcyBhbiBpbml0aWFsaXplciwgYW5kCisgIC8vLyBhbnkgY2hhbmdlcyBtYWRlIHRvIHRoZSBpbml0aWFsaXplciB3aWxsIHR1cm4gdXAgaW4gdGhlIGZpbmFsIGV4ZWN1dGFibGUuCisgIGlubGluZSBib29sIGhhc1VuaXF1ZUluaXRpYWxpemVyKCkgY29uc3QgeworICAgIHJldHVybgorICAgICAgICAvLyBXZSBuZWVkIHRvIGJlIHN1cmUgdGhpcyBpcyB0aGUgZGVmaW5pdGlvbiB0aGF0IHdpbGwgYWN0dWFsbHkgYmUgdXNlZAorICAgICAgICBpc1N0cm9uZ0RlZmluaXRpb25Gb3JMaW5rZXIoKSAmJgorICAgICAgICAvLyBJdCBpcyBub3Qgc2FmZSB0byBtb2RpZnkgaW5pdGlhbGl6ZXJzIG9mIGdsb2JhbCB2YXJpYWJsZXMgd2l0aCB0aGUKKyAgICAgICAgLy8gZXh0ZXJuYWxfaW5pdGlhbGl6ZXIgbWFya2VyIHNpbmNlIHRoZSB2YWx1ZSBtYXkgYmUgY2hhbmdlZCBhdCBydW50aW1lCisgICAgICAgIC8vIGJlZm9yZSBDKysgaW5pdGlhbGl6ZXJzIGFyZSBldmFsdWF0ZWQuCisgICAgICAgICFpc0V4dGVybmFsbHlJbml0aWFsaXplZCgpOworICB9CisKKyAgLy8vIGdldEluaXRpYWxpemVyIC0gUmV0dXJuIHRoZSBpbml0aWFsaXplciBmb3IgdGhpcyBnbG9iYWwgdmFyaWFibGUuICBJdCBpcworICAvLy8gaWxsZWdhbCB0byBjYWxsIHRoaXMgbWV0aG9kIGlmIHRoZSBnbG9iYWwgaXMgZXh0ZXJuYWwsIGJlY2F1c2Ugd2UgY2Fubm90CisgIC8vLyB0ZWxsIHdoYXQgdGhlIHZhbHVlIGlzIGluaXRpYWxpemVkIHRvIQorICAvLy8KKyAgaW5saW5lIGNvbnN0IENvbnN0YW50ICpnZXRJbml0aWFsaXplcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoaGFzSW5pdGlhbGl6ZXIoKSAmJiAiR1YgZG9lc24ndCBoYXZlIGluaXRpYWxpemVyISIpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDb25zdGFudCo+KE9wPDA+KCkuZ2V0KCkpOworICB9CisgIGlubGluZSBDb25zdGFudCAqZ2V0SW5pdGlhbGl6ZXIoKSB7CisgICAgYXNzZXJ0KGhhc0luaXRpYWxpemVyKCkgJiYgIkdWIGRvZXNuJ3QgaGF2ZSBpbml0aWFsaXplciEiKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Q29uc3RhbnQqPihPcDwwPigpLmdldCgpKTsKKyAgfQorICAvLy8gc2V0SW5pdGlhbGl6ZXIgLSBTZXRzIHRoZSBpbml0aWFsaXplciBmb3IgdGhpcyBnbG9iYWwgdmFyaWFibGUsIHJlbW92aW5nCisgIC8vLyBhbnkgZXhpc3RpbmcgaW5pdGlhbGl6ZXIgaWYgSW5pdFZhbD09TlVMTC4gIElmIHRoaXMgR1YgaGFzIHR5cGUgVCosIHRoZQorICAvLy8gaW5pdGlhbGl6ZXIgbXVzdCBoYXZlIHR5cGUgVC4KKyAgdm9pZCBzZXRJbml0aWFsaXplcihDb25zdGFudCAqSW5pdFZhbCk7CisKKyAgLy8vIElmIHRoZSB2YWx1ZSBpcyBhIGdsb2JhbCBjb25zdGFudCwgaXRzIHZhbHVlIGlzIGltbXV0YWJsZSB0aHJvdWdob3V0IHRoZQorICAvLy8gcnVudGltZSBleGVjdXRpb24gb2YgdGhlIHByb2dyYW0uICBBc3NpZ25pbmcgYSB2YWx1ZSBpbnRvIHRoZSBjb25zdGFudAorICAvLy8gbGVhZHMgdG8gdW5kZWZpbmVkIGJlaGF2aW9yLgorICAvLy8KKyAgYm9vbCBpc0NvbnN0YW50KCkgY29uc3QgeyByZXR1cm4gaXNDb25zdGFudEdsb2JhbDsgfQorICB2b2lkIHNldENvbnN0YW50KGJvb2wgVmFsKSB7IGlzQ29uc3RhbnRHbG9iYWwgPSBWYWw7IH0KKworICBib29sIGlzRXh0ZXJuYWxseUluaXRpYWxpemVkKCkgY29uc3QgeworICAgIHJldHVybiBpc0V4dGVybmFsbHlJbml0aWFsaXplZENvbnN0YW50OworICB9CisgIHZvaWQgc2V0RXh0ZXJuYWxseUluaXRpYWxpemVkKGJvb2wgVmFsKSB7CisgICAgaXNFeHRlcm5hbGx5SW5pdGlhbGl6ZWRDb25zdGFudCA9IFZhbDsKKyAgfQorCisgIC8vLyBjb3B5QXR0cmlidXRlc0Zyb20gLSBjb3B5IGFsbCBhZGRpdGlvbmFsIGF0dHJpYnV0ZXMgKHRob3NlIG5vdCBuZWVkZWQgdG8KKyAgLy8vIGNyZWF0ZSBhIEdsb2JhbFZhcmlhYmxlKSBmcm9tIHRoZSBHbG9iYWxWYXJpYWJsZSBTcmMgdG8gdGhpcyBvbmUuCisgIHZvaWQgY29weUF0dHJpYnV0ZXNGcm9tKGNvbnN0IEdsb2JhbFZhcmlhYmxlICpTcmMpOworCisgIC8vLyByZW1vdmVGcm9tUGFyZW50IC0gVGhpcyBtZXRob2QgdW5saW5rcyAndGhpcycgZnJvbSB0aGUgY29udGFpbmluZyBtb2R1bGUsCisgIC8vLyBidXQgZG9lcyBub3QgZGVsZXRlIGl0LgorICAvLy8KKyAgdm9pZCByZW1vdmVGcm9tUGFyZW50KCk7CisKKyAgLy8vIGVyYXNlRnJvbVBhcmVudCAtIFRoaXMgbWV0aG9kIHVubGlua3MgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcgbW9kdWxlCisgIC8vLyBhbmQgZGVsZXRlcyBpdC4KKyAgLy8vCisgIHZvaWQgZXJhc2VGcm9tUGFyZW50KCk7CisKKyAgLy8vIERyb3AgYWxsIHJlZmVyZW5jZXMgaW4gcHJlcGFyYXRpb24gdG8gZGVzdHJveSB0aGUgR2xvYmFsVmFyaWFibGUuIFRoaXMKKyAgLy8vIGRyb3BzIG5vdCBvbmx5IHRoZSByZWZlcmVuY2UgdG8gdGhlIGluaXRpYWxpemVyIGJ1dCBhbHNvIHRvIGFueSBtZXRhZGF0YS4KKyAgdm9pZCBkcm9wQWxsUmVmZXJlbmNlcygpOworCisgIC8vLyBBdHRhY2ggYSBESUdsb2JhbFZhcmlhYmxlRXhwcmVzc2lvbi4KKyAgdm9pZCBhZGREZWJ1Z0luZm8oRElHbG9iYWxWYXJpYWJsZUV4cHJlc3Npb24gKkdWKTsKKworICAvLy8gRmlsbCB0aGUgdmVjdG9yIHdpdGggYWxsIGRlYnVnIGluZm8gYXR0YWNoZW1lbnRzLgorICB2b2lkIGdldERlYnVnSW5mbyhTbWFsbFZlY3RvckltcGw8RElHbG9iYWxWYXJpYWJsZUV4cHJlc3Npb24gKj4gJkdWcykgY29uc3Q7CisKKyAgLy8vIEFkZCBhdHRyaWJ1dGUgdG8gdGhpcyBnbG9iYWwuCisgIHZvaWQgYWRkQXR0cmlidXRlKEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgeworICAgIEF0dHJzID0gQXR0cnMuYWRkQXR0cmlidXRlKGdldENvbnRleHQoKSwgS2luZCk7CisgIH0KKworICAvLy8gQWRkIGF0dHJpYnV0ZSB0byB0aGlzIGdsb2JhbC4KKyAgdm9pZCBhZGRBdHRyaWJ1dGUoU3RyaW5nUmVmIEtpbmQsIFN0cmluZ1JlZiBWYWwgPSBTdHJpbmdSZWYoKSkgeworICAgIEF0dHJzID0gQXR0cnMuYWRkQXR0cmlidXRlKGdldENvbnRleHQoKSwgS2luZCwgVmFsKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGV4aXN0cy4KKyAgYm9vbCBoYXNBdHRyaWJ1dGUoQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJzLmhhc0F0dHJpYnV0ZShLaW5kKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXR0cmlidXRlIGV4aXN0cy4KKyAgYm9vbCBoYXNBdHRyaWJ1dGUoU3RyaW5nUmVmIEtpbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gQXR0cnMuaGFzQXR0cmlidXRlKEtpbmQpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGFueSBhdHRyaWJ1dGVzIGV4aXN0LgorICBib29sIGhhc0F0dHJpYnV0ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJzLmhhc0F0dHJpYnV0ZXMoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBvYmplY3QuCisgIEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUoQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJzLmdldEF0dHJpYnV0ZShLaW5kKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGF0dHJpYnV0ZSBvYmplY3QuCisgIEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUoU3RyaW5nUmVmIEtpbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gQXR0cnMuZ2V0QXR0cmlidXRlKEtpbmQpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgYXR0cmlidXRlIHNldCBmb3IgdGhpcyBnbG9iYWwKKyAgQXR0cmlidXRlU2V0IGdldEF0dHJpYnV0ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJzOworICB9CisKKyAgLy8vIFJldHVybiBhdHRyaWJ1dGUgc2V0IGFzIGxpc3Qgd2l0aCBpbmRleC4KKyAgLy8vIEZJWE1FOiBUaGlzIG1heSBub3QgYmUgcmVxdWlyZWQgb25jZSBWYWx1ZUVudW1lcmF0b3JzCisgIC8vLyBpbiBiaXRjb2RlLXdyaXRlciBjYW4gZW51bWVyYXRlIGF0dHJpYnV0ZS1zZXQuCisgIEF0dHJpYnV0ZUxpc3QgZ2V0QXR0cmlidXRlc0FzTGlzdCh1bnNpZ25lZCBpbmRleCkgY29uc3QgeworICAgIGlmICghaGFzQXR0cmlidXRlcygpKQorICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3QoKTsKKyAgICBzdGQ6OnBhaXI8dW5zaWduZWQsIEF0dHJpYnV0ZVNldD4gQVNbMV0gPSB7e2luZGV4LCBBdHRyc319OworICAgIHJldHVybiBBdHRyaWJ1dGVMaXN0OjpnZXQoZ2V0Q29udGV4dCgpLCBBUyk7CisgIH0KKworICAvLy8gU2V0IGF0dHJpYnV0ZSBsaXN0IGZvciB0aGlzIGdsb2JhbAorICB2b2lkIHNldEF0dHJpYnV0ZXMoQXR0cmlidXRlU2V0IEEpIHsKKyAgICBBdHRycyA9IEE7CisgIH0KKworICAvLy8gQ2hlY2sgaWYgc2VjdGlvbiBuYW1lIGlzIHByZXNlbnQKKyAgYm9vbCBoYXNJbXBsaWNpdFNlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEF0dHJpYnV0ZXMoKS5oYXNBdHRyaWJ1dGUoImJzcy1zZWN0aW9uIikgfHwKKyAgICAgICAgICAgZ2V0QXR0cmlidXRlcygpLmhhc0F0dHJpYnV0ZSgiZGF0YS1zZWN0aW9uIikgfHwKKyAgICAgICAgICAgZ2V0QXR0cmlidXRlcygpLmhhc0F0dHJpYnV0ZSgicm9kYXRhLXNlY3Rpb24iKTsKKyAgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID09IFZhbHVlOjpHbG9iYWxWYXJpYWJsZVZhbDsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPEdsb2JhbFZhcmlhYmxlPiA6CisgIHB1YmxpYyBPcHRpb25hbE9wZXJhbmRUcmFpdHM8R2xvYmFsVmFyaWFibGU+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhHbG9iYWxWYXJpYWJsZSwgVmFsdWUpCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0dMT0JBTFZBUklBQkxFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSVJCdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0lSQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0NjU0NGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0lSQnVpbGRlci5oCkBAIC0wLDAgKzEsMjExNSBAQAorLy89PT0tIGxsdm0vSVJCdWlsZGVyLmggLSBCdWlsZGVyIGZvciBMTFZNIEluc3RydWN0aW9ucyAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgSVJCdWlsZGVyIGNsYXNzLCB3aGljaCBpcyB1c2VkIGFzIGEgY29udmVuaWVudCB3YXkKKy8vIHRvIGNyZWF0ZSBMTFZNIGluc3RydWN0aW9ucyB3aXRoIGEgY29uc2lzdGVudCBhbmQgc2ltcGxpZmllZCBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0lSQlVJTERFUl9ICisjZGVmaW5lIExMVk1fSVJfSVJCVUlMREVSX0gKKworI2luY2x1ZGUgImxsdm0tYy9UeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudC5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRGb2xkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGF0YUxheW91dC5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGVidWdMb2MuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbFZhcmlhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0clR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9PcGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvVHlwZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlSGFuZGxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0F0b21pY09yZGVyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NCaW5kaW5nV3JhcHBpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBUEludDsKK2NsYXNzIE1ETm9kZTsKK2NsYXNzIFVzZTsKKworLy8vIFxicmllZiBUaGlzIHByb3ZpZGVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIHRoZSBJUkJ1aWxkZXIKKy8vLyAnSW5zZXJ0SGVscGVyJyBtZXRob2QgdGhhdCBpcyBjYWxsZWQgd2hlbmV2ZXIgYW4gaW5zdHJ1Y3Rpb24gaXMgY3JlYXRlZCBieQorLy8vIElSQnVpbGRlciBhbmQgbmVlZHMgdG8gYmUgaW5zZXJ0ZWQuCisvLy8KKy8vLyBCeSBkZWZhdWx0LCB0aGlzIGluc2VydHMgdGhlIGluc3RydWN0aW9uIGF0IHRoZSBpbnNlcnRpb24gcG9pbnQuCitjbGFzcyBJUkJ1aWxkZXJEZWZhdWx0SW5zZXJ0ZXIgeworcHJvdGVjdGVkOgorICB2b2lkIEluc2VydEhlbHBlcihJbnN0cnVjdGlvbiAqSSwgY29uc3QgVHdpbmUgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkJCLCBCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRQdCkgY29uc3QgeworICAgIGlmIChCQikgQkItPmdldEluc3RMaXN0KCkuaW5zZXJ0KEluc2VydFB0LCBJKTsKKyAgICBJLT5zZXROYW1lKE5hbWUpOworICB9Cit9OworCisvLy8gUHJvdmlkZXMgYW4gJ0luc2VydEhlbHBlcicgdGhhdCBjYWxscyBhIHVzZXItcHJvdmlkZWQgY2FsbGJhY2sgYWZ0ZXIKKy8vLyBwZXJmb3JtaW5nIHRoZSBkZWZhdWx0IGluc2VydGlvbi4KK2NsYXNzIElSQnVpbGRlckNhbGxiYWNrSW5zZXJ0ZXIgOiBJUkJ1aWxkZXJEZWZhdWx0SW5zZXJ0ZXIgeworICBzdGQ6OmZ1bmN0aW9uPHZvaWQoSW5zdHJ1Y3Rpb24gKik+IENhbGxiYWNrOworCitwdWJsaWM6CisgIElSQnVpbGRlckNhbGxiYWNrSW5zZXJ0ZXIoc3RkOjpmdW5jdGlvbjx2b2lkKEluc3RydWN0aW9uICopPiBDYWxsYmFjaykKKyAgICAgIDogQ2FsbGJhY2soc3RkOjptb3ZlKENhbGxiYWNrKSkge30KKworcHJvdGVjdGVkOgorICB2b2lkIEluc2VydEhlbHBlcihJbnN0cnVjdGlvbiAqSSwgY29uc3QgVHdpbmUgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkJCLCBCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRQdCkgY29uc3QgeworICAgIElSQnVpbGRlckRlZmF1bHRJbnNlcnRlcjo6SW5zZXJ0SGVscGVyKEksIE5hbWUsIEJCLCBJbnNlcnRQdCk7CisgICAgQ2FsbGJhY2soSSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQ29tbW9uIGJhc2UgY2xhc3Mgc2hhcmVkIGFtb25nIHZhcmlvdXMgSVJCdWlsZGVycy4KK2NsYXNzIElSQnVpbGRlckJhc2UgeworICBEZWJ1Z0xvYyBDdXJEYmdMb2NhdGlvbjsKKworcHJvdGVjdGVkOgorICBCYXNpY0Jsb2NrICpCQjsKKyAgQmFzaWNCbG9jazo6aXRlcmF0b3IgSW5zZXJ0UHQ7CisgIExMVk1Db250ZXh0ICZDb250ZXh0OworCisgIE1ETm9kZSAqRGVmYXVsdEZQTWF0aFRhZzsKKyAgRmFzdE1hdGhGbGFncyBGTUY7CisKKyAgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gRGVmYXVsdE9wZXJhbmRCdW5kbGVzOworCitwdWJsaWM6CisgIElSQnVpbGRlckJhc2UoTExWTUNvbnRleHQgJmNvbnRleHQsIE1ETm9kZSAqRlBNYXRoVGFnID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBPcEJ1bmRsZXMgPSBOb25lKQorICAgICAgOiBDb250ZXh0KGNvbnRleHQpLCBEZWZhdWx0RlBNYXRoVGFnKEZQTWF0aFRhZyksCisgICAgICAgIERlZmF1bHRPcGVyYW5kQnVuZGxlcyhPcEJ1bmRsZXMpIHsKKyAgICBDbGVhckluc2VydGlvblBvaW50KCk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQnVpbGRlciBjb25maWd1cmF0aW9uIG1ldGhvZHMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFxicmllZiBDbGVhciB0aGUgaW5zZXJ0aW9uIHBvaW50OiBjcmVhdGVkIGluc3RydWN0aW9ucyB3aWxsIG5vdCBiZQorICAvLy8gaW5zZXJ0ZWQgaW50byBhIGJsb2NrLgorICB2b2lkIENsZWFySW5zZXJ0aW9uUG9pbnQoKSB7CisgICAgQkIgPSBudWxscHRyOworICAgIEluc2VydFB0ID0gQmFzaWNCbG9jazo6aXRlcmF0b3IoKTsKKyAgfQorCisgIEJhc2ljQmxvY2sgKkdldEluc2VydEJsb2NrKCkgY29uc3QgeyByZXR1cm4gQkI7IH0KKyAgQmFzaWNCbG9jazo6aXRlcmF0b3IgR2V0SW5zZXJ0UG9pbnQoKSBjb25zdCB7IHJldHVybiBJbnNlcnRQdDsgfQorICBMTFZNQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIENvbnRleHQ7IH0KKworICAvLy8gXGJyaWVmIFRoaXMgc3BlY2lmaWVzIHRoYXQgY3JlYXRlZCBpbnN0cnVjdGlvbnMgc2hvdWxkIGJlIGFwcGVuZGVkIHRvIHRoZQorICAvLy8gZW5kIG9mIHRoZSBzcGVjaWZpZWQgYmxvY2suCisgIHZvaWQgU2V0SW5zZXJ0UG9pbnQoQmFzaWNCbG9jayAqVGhlQkIpIHsKKyAgICBCQiA9IFRoZUJCOworICAgIEluc2VydFB0ID0gQkItPmVuZCgpOworICB9CisKKyAgLy8vIFxicmllZiBUaGlzIHNwZWNpZmllcyB0aGF0IGNyZWF0ZWQgaW5zdHJ1Y3Rpb25zIHNob3VsZCBiZSBpbnNlcnRlZCBiZWZvcmUKKyAgLy8vIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgU2V0SW5zZXJ0UG9pbnQoSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICBCQiA9IEktPmdldFBhcmVudCgpOworICAgIEluc2VydFB0ID0gSS0+Z2V0SXRlcmF0b3IoKTsKKyAgICBhc3NlcnQoSW5zZXJ0UHQgIT0gQkItPmVuZCgpICYmICJDYW4ndCByZWFkIGRlYnVnIGxvYyBmcm9tIGVuZCgpIik7CisgICAgU2V0Q3VycmVudERlYnVnTG9jYXRpb24oSS0+Z2V0RGVidWdMb2MoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFRoaXMgc3BlY2lmaWVzIHRoYXQgY3JlYXRlZCBpbnN0cnVjdGlvbnMgc2hvdWxkIGJlIGluc2VydGVkIGF0IHRoZQorICAvLy8gc3BlY2lmaWVkIHBvaW50LgorICB2b2lkIFNldEluc2VydFBvaW50KEJhc2ljQmxvY2sgKlRoZUJCLCBCYXNpY0Jsb2NrOjppdGVyYXRvciBJUCkgeworICAgIEJCID0gVGhlQkI7CisgICAgSW5zZXJ0UHQgPSBJUDsKKyAgICBpZiAoSVAgIT0gVGhlQkItPmVuZCgpKQorICAgICAgU2V0Q3VycmVudERlYnVnTG9jYXRpb24oSVAtPmdldERlYnVnTG9jKCkpOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgbG9jYXRpb24gaW5mb3JtYXRpb24gdXNlZCBieSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uCisgIHZvaWQgU2V0Q3VycmVudERlYnVnTG9jYXRpb24oRGVidWdMb2MgTCkgeyBDdXJEYmdMb2NhdGlvbiA9IHN0ZDo6bW92ZShMKTsgfQorCisgIC8vLyBcYnJpZWYgR2V0IGxvY2F0aW9uIGluZm9ybWF0aW9uIHVzZWQgYnkgZGVidWdnaW5nIGluZm9ybWF0aW9uLgorICBjb25zdCBEZWJ1Z0xvYyAmZ2V0Q3VycmVudERlYnVnTG9jYXRpb24oKSBjb25zdCB7IHJldHVybiBDdXJEYmdMb2NhdGlvbjsgfQorCisgIC8vLyBcYnJpZWYgSWYgdGhpcyBidWlsZGVyIGhhcyBhIGN1cnJlbnQgZGVidWcgbG9jYXRpb24sIHNldCBpdCBvbiB0aGUKKyAgLy8vIHNwZWNpZmllZCBpbnN0cnVjdGlvbi4KKyAgdm9pZCBTZXRJbnN0RGVidWdMb2NhdGlvbihJbnN0cnVjdGlvbiAqSSkgY29uc3QgeworICAgIGlmIChDdXJEYmdMb2NhdGlvbikKKyAgICAgIEktPnNldERlYnVnTG9jKEN1ckRiZ0xvY2F0aW9uKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSByZXR1cm4gdHlwZSBvZiB0aGUgY3VycmVudCBmdW5jdGlvbiB0aGF0IHdlJ3JlIGVtaXR0aW5nCisgIC8vLyBpbnRvLgorICBUeXBlICpnZXRDdXJyZW50RnVuY3Rpb25SZXR1cm5UeXBlKCkgY29uc3Q7CisKKyAgLy8vIEluc2VydFBvaW50IC0gQSBzYXZlZCBpbnNlcnRpb24gcG9pbnQuCisgIGNsYXNzIEluc2VydFBvaW50IHsKKyAgICBCYXNpY0Jsb2NrICpCbG9jayA9IG51bGxwdHI7CisgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgUG9pbnQ7CisKKyAgcHVibGljOgorICAgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhIG5ldyBpbnNlcnRpb24gcG9pbnQgd2hpY2ggZG9lc24ndCBwb2ludCB0byBhbnl0aGluZy4KKyAgICBJbnNlcnRQb2ludCgpID0gZGVmYXVsdDsKKworICAgIC8vLyBcYnJpZWYgQ3JlYXRlcyBhIG5ldyBpbnNlcnRpb24gcG9pbnQgYXQgdGhlIGdpdmVuIGxvY2F0aW9uLgorICAgIEluc2VydFBvaW50KEJhc2ljQmxvY2sgKkluc2VydEJsb2NrLCBCYXNpY0Jsb2NrOjppdGVyYXRvciBJbnNlcnRQb2ludCkKKyAgICAgICAgOiBCbG9jayhJbnNlcnRCbG9jayksIFBvaW50KEluc2VydFBvaW50KSB7fQorCisgICAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnNlcnQgcG9pbnQgaXMgc2V0LgorICAgIGJvb2wgaXNTZXQoKSBjb25zdCB7IHJldHVybiAoQmxvY2sgIT0gbnVsbHB0cik7IH0KKworICAgIEJhc2ljQmxvY2sgKmdldEJsb2NrKCkgY29uc3QgeyByZXR1cm4gQmxvY2s7IH0KKyAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBnZXRQb2ludCgpIGNvbnN0IHsgcmV0dXJuIFBvaW50OyB9CisgIH07CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBjdXJyZW50IGluc2VydCBwb2ludC4KKyAgSW5zZXJ0UG9pbnQgc2F2ZUlQKCkgY29uc3QgeworICAgIHJldHVybiBJbnNlcnRQb2ludChHZXRJbnNlcnRCbG9jaygpLCBHZXRJbnNlcnRQb2ludCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgY3VycmVudCBpbnNlcnQgcG9pbnQsIGNsZWFyaW5nIGl0IGluIHRoZSBwcm9jZXNzLgorICBJbnNlcnRQb2ludCBzYXZlQW5kQ2xlYXJJUCgpIHsKKyAgICBJbnNlcnRQb2ludCBJUChHZXRJbnNlcnRCbG9jaygpLCBHZXRJbnNlcnRQb2ludCgpKTsKKyAgICBDbGVhckluc2VydGlvblBvaW50KCk7CisgICAgcmV0dXJuIElQOworICB9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBjdXJyZW50IGluc2VydCBwb2ludCB0byBhIHByZXZpb3VzbHktc2F2ZWQgbG9jYXRpb24uCisgIHZvaWQgcmVzdG9yZUlQKEluc2VydFBvaW50IElQKSB7CisgICAgaWYgKElQLmlzU2V0KCkpCisgICAgICBTZXRJbnNlcnRQb2ludChJUC5nZXRCbG9jaygpLCBJUC5nZXRQb2ludCgpKTsKKyAgICBlbHNlCisgICAgICBDbGVhckluc2VydGlvblBvaW50KCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgZmxvYXRpbmcgcG9pbnQgbWF0aCBtZXRhZGF0YSBiZWluZyB1c2VkLgorICBNRE5vZGUgKmdldERlZmF1bHRGUE1hdGhUYWcoKSBjb25zdCB7IHJldHVybiBEZWZhdWx0RlBNYXRoVGFnOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGZsYWdzIHRvIGJlIGFwcGxpZWQgdG8gY3JlYXRlZCBmbG9hdGluZyBwb2ludCBvcHMKKyAgRmFzdE1hdGhGbGFncyBnZXRGYXN0TWF0aEZsYWdzKCkgY29uc3QgeyByZXR1cm4gRk1GOyB9CisKKyAgLy8vIFxicmllZiBDbGVhciB0aGUgZmFzdC1tYXRoIGZsYWdzLgorICB2b2lkIGNsZWFyRmFzdE1hdGhGbGFncygpIHsgRk1GLmNsZWFyKCk7IH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgZmxvYXRpbmcgcG9pbnQgbWF0aCBtZXRhZGF0YSB0byBiZSB1c2VkLgorICB2b2lkIHNldERlZmF1bHRGUE1hdGhUYWcoTUROb2RlICpGUE1hdGhUYWcpIHsgRGVmYXVsdEZQTWF0aFRhZyA9IEZQTWF0aFRhZzsgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBmYXN0LW1hdGggZmxhZ3MgdG8gYmUgdXNlZCB3aXRoIGdlbmVyYXRlZCBmcC1tYXRoIG9wZXJhdG9ycworICB2b2lkIHNldEZhc3RNYXRoRmxhZ3MoRmFzdE1hdGhGbGFncyBOZXdGTUYpIHsgRk1GID0gTmV3Rk1GOyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFJBSUkgaGVscGVycy4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8gXGJyaWVmIFJBSUkgb2JqZWN0IHRoYXQgc3RvcmVzIHRoZSBjdXJyZW50IGluc2VydGlvbiBwb2ludCBhbmQgcmVzdG9yZXMgaXQKKyAgLy8gd2hlbiB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZC4gVGhpcyBpbmNsdWRlcyB0aGUgZGVidWcgbG9jYXRpb24uCisgIGNsYXNzIEluc2VydFBvaW50R3VhcmQgeworICAgIElSQnVpbGRlckJhc2UgJkJ1aWxkZXI7CisgICAgQXNzZXJ0aW5nVkg8QmFzaWNCbG9jaz4gQmxvY2s7CisgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgUG9pbnQ7CisgICAgRGVidWdMb2MgRGJnTG9jOworCisgIHB1YmxpYzoKKyAgICBJbnNlcnRQb2ludEd1YXJkKElSQnVpbGRlckJhc2UgJkIpCisgICAgICAgIDogQnVpbGRlcihCKSwgQmxvY2soQi5HZXRJbnNlcnRCbG9jaygpKSwgUG9pbnQoQi5HZXRJbnNlcnRQb2ludCgpKSwKKyAgICAgICAgICBEYmdMb2MoQi5nZXRDdXJyZW50RGVidWdMb2NhdGlvbigpKSB7fQorCisgICAgSW5zZXJ0UG9pbnRHdWFyZChjb25zdCBJbnNlcnRQb2ludEd1YXJkICYpID0gZGVsZXRlOworICAgIEluc2VydFBvaW50R3VhcmQgJm9wZXJhdG9yPShjb25zdCBJbnNlcnRQb2ludEd1YXJkICYpID0gZGVsZXRlOworCisgICAgfkluc2VydFBvaW50R3VhcmQoKSB7CisgICAgICBCdWlsZGVyLnJlc3RvcmVJUChJbnNlcnRQb2ludChCbG9jaywgUG9pbnQpKTsKKyAgICAgIEJ1aWxkZXIuU2V0Q3VycmVudERlYnVnTG9jYXRpb24oRGJnTG9jKTsKKyAgICB9CisgIH07CisKKyAgLy8gXGJyaWVmIFJBSUkgb2JqZWN0IHRoYXQgc3RvcmVzIHRoZSBjdXJyZW50IGZhc3QgbWF0aCBzZXR0aW5ncyBhbmQgcmVzdG9yZXMKKyAgLy8gdGhlbSB3aGVuIHRoZSBvYmplY3QgaXMgZGVzdHJveWVkLgorICBjbGFzcyBGYXN0TWF0aEZsYWdHdWFyZCB7CisgICAgSVJCdWlsZGVyQmFzZSAmQnVpbGRlcjsKKyAgICBGYXN0TWF0aEZsYWdzIEZNRjsKKyAgICBNRE5vZGUgKkZQTWF0aFRhZzsKKworICBwdWJsaWM6CisgICAgRmFzdE1hdGhGbGFnR3VhcmQoSVJCdWlsZGVyQmFzZSAmQikKKyAgICAgICAgOiBCdWlsZGVyKEIpLCBGTUYoQi5GTUYpLCBGUE1hdGhUYWcoQi5EZWZhdWx0RlBNYXRoVGFnKSB7fQorCisgICAgRmFzdE1hdGhGbGFnR3VhcmQoY29uc3QgRmFzdE1hdGhGbGFnR3VhcmQgJikgPSBkZWxldGU7CisgICAgRmFzdE1hdGhGbGFnR3VhcmQgJm9wZXJhdG9yPShjb25zdCBGYXN0TWF0aEZsYWdHdWFyZCAmKSA9IGRlbGV0ZTsKKworICAgIH5GYXN0TWF0aEZsYWdHdWFyZCgpIHsKKyAgICAgIEJ1aWxkZXIuRk1GID0gRk1GOworICAgICAgQnVpbGRlci5EZWZhdWx0RlBNYXRoVGFnID0gRlBNYXRoVGFnOworICAgIH0KKyAgfTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTWlzY2VsbGFuZW91cyBjcmVhdGlvbiBtZXRob2RzLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gXGJyaWVmIE1ha2UgYSBuZXcgZ2xvYmFsIHZhcmlhYmxlIHdpdGggaW5pdGlhbGl6ZXIgdHlwZSBpOCoKKyAgLy8vCisgIC8vLyBNYWtlIGEgbmV3IGdsb2JhbCB2YXJpYWJsZSB3aXRoIGFuIGluaXRpYWxpemVyIHRoYXQgaGFzIGFycmF5IG9mIGk4IHR5cGUKKyAgLy8vIGZpbGxlZCBpbiB3aXRoIHRoZSBudWxsIHRlcm1pbmF0ZWQgc3RyaW5nIHZhbHVlIHNwZWNpZmllZC4gIFRoZSBuZXcgZ2xvYmFsCisgIC8vLyB2YXJpYWJsZSB3aWxsIGJlIG1hcmtlZCBtZXJnYWJsZSB3aXRoIGFueSBvdGhlcnMgb2YgdGhlIHNhbWUgY29udGVudHMuICBJZgorICAvLy8gTmFtZSBpcyBzcGVjaWZpZWQsIGl0IGlzIHRoZSBuYW1lIG9mIHRoZSBnbG9iYWwgdmFyaWFibGUgY3JlYXRlZC4KKyAgR2xvYmFsVmFyaWFibGUgKkNyZWF0ZUdsb2JhbFN0cmluZyhTdHJpbmdSZWYgU3RyLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSA9IDApOworCisgIC8vLyBcYnJpZWYgR2V0IGEgY29uc3RhbnQgdmFsdWUgcmVwcmVzZW50aW5nIGVpdGhlciB0cnVlIG9yIGZhbHNlLgorICBDb25zdGFudEludCAqZ2V0SW50MShib29sIFYpIHsKKyAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChnZXRJbnQxVHkoKSwgVik7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgY29uc3RhbnQgdmFsdWUgZm9yIGkxIHRydWUuCisgIENvbnN0YW50SW50ICpnZXRUcnVlKCkgeworICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0VHJ1ZShDb250ZXh0KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBjb25zdGFudCB2YWx1ZSBmb3IgaTEgZmFsc2UuCisgIENvbnN0YW50SW50ICpnZXRGYWxzZSgpIHsKKyAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldEZhbHNlKENvbnRleHQpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgYSBjb25zdGFudCA4LWJpdCB2YWx1ZS4KKyAgQ29uc3RhbnRJbnQgKmdldEludDgodWludDhfdCBDKSB7CisgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoZ2V0SW50OFR5KCksIEMpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgYSBjb25zdGFudCAxNi1iaXQgdmFsdWUuCisgIENvbnN0YW50SW50ICpnZXRJbnQxNih1aW50MTZfdCBDKSB7CisgICAgcmV0dXJuIENvbnN0YW50SW50OjpnZXQoZ2V0SW50MTZUeSgpLCBDKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGEgY29uc3RhbnQgMzItYml0IHZhbHVlLgorICBDb25zdGFudEludCAqZ2V0SW50MzIodWludDMyX3QgQykgeworICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KGdldEludDMyVHkoKSwgQyk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCBhIGNvbnN0YW50IDY0LWJpdCB2YWx1ZS4KKyAgQ29uc3RhbnRJbnQgKmdldEludDY0KHVpbnQ2NF90IEMpIHsKKyAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChnZXRJbnQ2NFR5KCksIEMpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgYSBjb25zdGFudCBOLWJpdCB2YWx1ZSwgemVybyBleHRlbmRlZCBvciB0cnVuY2F0ZWQgZnJvbQorICAvLy8gYSA2NC1iaXQgdmFsdWUuCisgIENvbnN0YW50SW50ICpnZXRJbnROKHVuc2lnbmVkIE4sIHVpbnQ2NF90IEMpIHsKKyAgICByZXR1cm4gQ29uc3RhbnRJbnQ6OmdldChnZXRJbnROVHkoTiksIEMpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgYSBjb25zdGFudCBpbnRlZ2VyIHZhbHVlLgorICBDb25zdGFudEludCAqZ2V0SW50KGNvbnN0IEFQSW50ICZBSSkgeworICAgIHJldHVybiBDb25zdGFudEludDo6Z2V0KENvbnRleHQsIEFJKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBUeXBlIGNyZWF0aW9uIG1ldGhvZHMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFxicmllZiBGZXRjaCB0aGUgdHlwZSByZXByZXNlbnRpbmcgYSBzaW5nbGUgYml0CisgIEludGVnZXJUeXBlICpnZXRJbnQxVHkoKSB7CisgICAgcmV0dXJuIFR5cGU6OmdldEludDFUeShDb250ZXh0KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRmV0Y2ggdGhlIHR5cGUgcmVwcmVzZW50aW5nIGFuIDgtYml0IGludGVnZXIuCisgIEludGVnZXJUeXBlICpnZXRJbnQ4VHkoKSB7CisgICAgcmV0dXJuIFR5cGU6OmdldEludDhUeShDb250ZXh0KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRmV0Y2ggdGhlIHR5cGUgcmVwcmVzZW50aW5nIGEgMTYtYml0IGludGVnZXIuCisgIEludGVnZXJUeXBlICpnZXRJbnQxNlR5KCkgeworICAgIHJldHVybiBUeXBlOjpnZXRJbnQxNlR5KENvbnRleHQpOworICB9CisKKyAgLy8vIFxicmllZiBGZXRjaCB0aGUgdHlwZSByZXByZXNlbnRpbmcgYSAzMi1iaXQgaW50ZWdlci4KKyAgSW50ZWdlclR5cGUgKmdldEludDMyVHkoKSB7CisgICAgcmV0dXJuIFR5cGU6OmdldEludDMyVHkoQ29udGV4dCk7CisgIH0KKworICAvLy8gXGJyaWVmIEZldGNoIHRoZSB0eXBlIHJlcHJlc2VudGluZyBhIDY0LWJpdCBpbnRlZ2VyLgorICBJbnRlZ2VyVHlwZSAqZ2V0SW50NjRUeSgpIHsKKyAgICByZXR1cm4gVHlwZTo6Z2V0SW50NjRUeShDb250ZXh0KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRmV0Y2ggdGhlIHR5cGUgcmVwcmVzZW50aW5nIGEgMTI4LWJpdCBpbnRlZ2VyLgorICBJbnRlZ2VyVHlwZSAqZ2V0SW50MTI4VHkoKSB7IHJldHVybiBUeXBlOjpnZXRJbnQxMjhUeShDb250ZXh0KTsgfQorCisgIC8vLyBcYnJpZWYgRmV0Y2ggdGhlIHR5cGUgcmVwcmVzZW50aW5nIGFuIE4tYml0IGludGVnZXIuCisgIEludGVnZXJUeXBlICpnZXRJbnROVHkodW5zaWduZWQgTikgeworICAgIHJldHVybiBUeXBlOjpnZXRJbnROVHkoQ29udGV4dCwgTik7CisgIH0KKworICAvLy8gXGJyaWVmIEZldGNoIHRoZSB0eXBlIHJlcHJlc2VudGluZyBhIDE2LWJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZS4KKyAgVHlwZSAqZ2V0SGFsZlR5KCkgeworICAgIHJldHVybiBUeXBlOjpnZXRIYWxmVHkoQ29udGV4dCk7CisgIH0KKworICAvLy8gXGJyaWVmIEZldGNoIHRoZSB0eXBlIHJlcHJlc2VudGluZyBhIDMyLWJpdCBmbG9hdGluZyBwb2ludCB2YWx1ZS4KKyAgVHlwZSAqZ2V0RmxvYXRUeSgpIHsKKyAgICByZXR1cm4gVHlwZTo6Z2V0RmxvYXRUeShDb250ZXh0KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRmV0Y2ggdGhlIHR5cGUgcmVwcmVzZW50aW5nIGEgNjQtYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlLgorICBUeXBlICpnZXREb3VibGVUeSgpIHsKKyAgICByZXR1cm4gVHlwZTo6Z2V0RG91YmxlVHkoQ29udGV4dCk7CisgIH0KKworICAvLy8gXGJyaWVmIEZldGNoIHRoZSB0eXBlIHJlcHJlc2VudGluZyB2b2lkLgorICBUeXBlICpnZXRWb2lkVHkoKSB7CisgICAgcmV0dXJuIFR5cGU6OmdldFZvaWRUeShDb250ZXh0KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRmV0Y2ggdGhlIHR5cGUgcmVwcmVzZW50aW5nIGEgcG9pbnRlciB0byBhbiA4LWJpdCBpbnRlZ2VyIHZhbHVlLgorICBQb2ludGVyVHlwZSAqZ2V0SW50OFB0clR5KHVuc2lnbmVkIEFkZHJTcGFjZSA9IDApIHsKKyAgICByZXR1cm4gVHlwZTo6Z2V0SW50OFB0clR5KENvbnRleHQsIEFkZHJTcGFjZSk7CisgIH0KKworICAvLy8gXGJyaWVmIEZldGNoIHRoZSB0eXBlIHJlcHJlc2VudGluZyBhIHBvaW50ZXIgdG8gYW4gaW50ZWdlciB2YWx1ZS4KKyAgSW50ZWdlclR5cGUgKmdldEludFB0clR5KGNvbnN0IERhdGFMYXlvdXQgJkRMLCB1bnNpZ25lZCBBZGRyU3BhY2UgPSAwKSB7CisgICAgcmV0dXJuIERMLmdldEludFB0clR5cGUoQ29udGV4dCwgQWRkclNwYWNlKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJbnRyaW5zaWMgY3JlYXRpb24gbWV0aG9kcworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhbmQgaW5zZXJ0IGEgbWVtc2V0IHRvIHRoZSBzcGVjaWZpZWQgcG9pbnRlciBhbmQgdGhlCisgIC8vLyBzcGVjaWZpZWQgdmFsdWUuCisgIC8vLworICAvLy8gSWYgdGhlIHBvaW50ZXIgaXNuJ3QgYW4gaTgqLCBpdCB3aWxsIGJlIGNvbnZlcnRlZC4gSWYgYSBUQkFBIHRhZyBpcworICAvLy8gc3BlY2lmaWVkLCBpdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBpbnN0cnVjdGlvbi4gTGlrZXdpc2Ugd2l0aCBhbGlhcy5zY29wZQorICAvLy8gYW5kIG5vYWxpYXMgdGFncy4KKyAgQ2FsbEluc3QgKkNyZWF0ZU1lbVNldChWYWx1ZSAqUHRyLCBWYWx1ZSAqVmFsLCB1aW50NjRfdCBTaXplLCB1bnNpZ25lZCBBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzVm9sYXRpbGUgPSBmYWxzZSwgTUROb2RlICpUQkFBVGFnID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKlNjb3BlVGFnID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKk5vQWxpYXNUYWcgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIENyZWF0ZU1lbVNldChQdHIsIFZhbCwgZ2V0SW50NjQoU2l6ZSksIEFsaWduLCBpc1ZvbGF0aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgVEJBQVRhZywgU2NvcGVUYWcsIE5vQWxpYXNUYWcpOworICB9CisKKyAgQ2FsbEluc3QgKkNyZWF0ZU1lbVNldChWYWx1ZSAqUHRyLCBWYWx1ZSAqVmFsLCBWYWx1ZSAqU2l6ZSwgdW5zaWduZWQgQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZvbGF0aWxlID0gZmFsc2UsIE1ETm9kZSAqVEJBQVRhZyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpTY29wZVRhZyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpOb0FsaWFzVGFnID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYW5kIGluc2VydCBhIG1lbWNweSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgcG9pbnRlcnMuCisgIC8vLworICAvLy8gSWYgdGhlIHBvaW50ZXJzIGFyZW4ndCBpOCosIHRoZXkgd2lsbCBiZSBjb252ZXJ0ZWQuICBJZiBhIFRCQUEgdGFnIGlzCisgIC8vLyBzcGVjaWZpZWQsIGl0IHdpbGwgYmUgYWRkZWQgdG8gdGhlIGluc3RydWN0aW9uLiBMaWtld2lzZSB3aXRoIGFsaWFzLnNjb3BlCisgIC8vLyBhbmQgbm9hbGlhcyB0YWdzLgorICBDYWxsSW5zdCAqQ3JlYXRlTWVtQ3B5KFZhbHVlICpEc3QsIHVuc2lnbmVkIERzdEFsaWduLCBWYWx1ZSAqU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY0FsaWduLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNWb2xhdGlsZSA9IGZhbHNlLCBNRE5vZGUgKlRCQUFUYWcgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqVEJBQVN0cnVjdFRhZyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpTY29wZVRhZyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpOb0FsaWFzVGFnID0gbnVsbHB0cikgeworICAgIHJldHVybiBDcmVhdGVNZW1DcHkoRHN0LCBEc3RBbGlnbiwgU3JjLCBTcmNBbGlnbiwgZ2V0SW50NjQoU2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICBpc1ZvbGF0aWxlLCBUQkFBVGFnLCBUQkFBU3RydWN0VGFnLCBTY29wZVRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgIE5vQWxpYXNUYWcpOworICB9CisKKyAgQ2FsbEluc3QgKkNyZWF0ZU1lbUNweShWYWx1ZSAqRHN0LCB1bnNpZ25lZCBEc3RBbGlnbiwgVmFsdWUgKlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTcmNBbGlnbiwgVmFsdWUgKlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZvbGF0aWxlID0gZmFsc2UsIE1ETm9kZSAqVEJBQVRhZyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpUQkFBU3RydWN0VGFnID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKlNjb3BlVGFnID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKk5vQWxpYXNUYWcgPSBudWxscHRyKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhbmQgaW5zZXJ0IGFuIGVsZW1lbnQgdW5vcmRlcmVkLWF0b21pYyBtZW1jcHkgYmV0d2VlbiB0aGUKKyAgLy8vIHNwZWNpZmllZCBwb2ludGVycy4KKyAgLy8vCisgIC8vLyBEc3RBbGlnbi9TcmNBbGlnbiBhcmUgdGhlIGFsaWdubWVudHMgb2YgdGhlIERzdC9TcmMgcG9pbnRlcnMsIHJlc3BlY3RpdmVseS4KKyAgLy8vCisgIC8vLyBJZiB0aGUgcG9pbnRlcnMgYXJlbid0IGk4KiwgdGhleSB3aWxsIGJlIGNvbnZlcnRlZC4gIElmIGEgVEJBQSB0YWcgaXMKKyAgLy8vIHNwZWNpZmllZCwgaXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgaW5zdHJ1Y3Rpb24uIExpa2V3aXNlIHdpdGggYWxpYXMuc2NvcGUKKyAgLy8vIGFuZCBub2FsaWFzIHRhZ3MuCisgIENhbGxJbnN0ICpDcmVhdGVFbGVtZW50VW5vcmRlcmVkQXRvbWljTWVtQ3B5KAorICAgICAgVmFsdWUgKkRzdCwgdW5zaWduZWQgRHN0QWxpZ24sIFZhbHVlICpTcmMsIHVuc2lnbmVkIFNyY0FsaWduLAorICAgICAgdWludDY0X3QgU2l6ZSwgdWludDMyX3QgRWxlbWVudFNpemUsIE1ETm9kZSAqVEJBQVRhZyA9IG51bGxwdHIsCisgICAgICBNRE5vZGUgKlRCQUFTdHJ1Y3RUYWcgPSBudWxscHRyLCBNRE5vZGUgKlNjb3BlVGFnID0gbnVsbHB0ciwKKyAgICAgIE1ETm9kZSAqTm9BbGlhc1RhZyA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gQ3JlYXRlRWxlbWVudFVub3JkZXJlZEF0b21pY01lbUNweSgKKyAgICAgICAgRHN0LCBEc3RBbGlnbiwgU3JjLCBTcmNBbGlnbiwgZ2V0SW50NjQoU2l6ZSksIEVsZW1lbnRTaXplLCBUQkFBVGFnLAorICAgICAgICBUQkFBU3RydWN0VGFnLCBTY29wZVRhZywgTm9BbGlhc1RhZyk7CisgIH0KKworICBDYWxsSW5zdCAqQ3JlYXRlRWxlbWVudFVub3JkZXJlZEF0b21pY01lbUNweSgKKyAgICAgIFZhbHVlICpEc3QsIHVuc2lnbmVkIERzdEFsaWduLCBWYWx1ZSAqU3JjLCB1bnNpZ25lZCBTcmNBbGlnbiwgVmFsdWUgKlNpemUsCisgICAgICB1aW50MzJfdCBFbGVtZW50U2l6ZSwgTUROb2RlICpUQkFBVGFnID0gbnVsbHB0ciwKKyAgICAgIE1ETm9kZSAqVEJBQVN0cnVjdFRhZyA9IG51bGxwdHIsIE1ETm9kZSAqU2NvcGVUYWcgPSBudWxscHRyLAorICAgICAgTUROb2RlICpOb0FsaWFzVGFnID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYW5kIGluc2VydCBhIG1lbW1vdmUgYmV0d2VlbiB0aGUgc3BlY2lmaWVkCisgIC8vLyBwb2ludGVycy4KKyAgLy8vCisgIC8vLyBJZiB0aGUgcG9pbnRlcnMgYXJlbid0IGk4KiwgdGhleSB3aWxsIGJlIGNvbnZlcnRlZC4gIElmIGEgVEJBQSB0YWcgaXMKKyAgLy8vIHNwZWNpZmllZCwgaXQgd2lsbCBiZSBhZGRlZCB0byB0aGUgaW5zdHJ1Y3Rpb24uIExpa2V3aXNlIHdpdGggYWxpYXMuc2NvcGUKKyAgLy8vIGFuZCBub2FsaWFzIHRhZ3MuCisgIENhbGxJbnN0ICpDcmVhdGVNZW1Nb3ZlKFZhbHVlICpEc3QsIHVuc2lnbmVkIERzdEFsaWduLCBWYWx1ZSAqU3JjLCB1bnNpZ25lZCBTcmNBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZSwgYm9vbCBpc1ZvbGF0aWxlID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqVEJBQVRhZyA9IG51bGxwdHIsIE1ETm9kZSAqU2NvcGVUYWcgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKk5vQWxpYXNUYWcgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIENyZWF0ZU1lbU1vdmUoRHN0LCBEc3RBbGlnbiwgU3JjLCBTcmNBbGlnbiwgZ2V0SW50NjQoU2l6ZSksIGlzVm9sYXRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgVEJBQVRhZywgU2NvcGVUYWcsIE5vQWxpYXNUYWcpOworICB9CisKKyAgQ2FsbEluc3QgKkNyZWF0ZU1lbU1vdmUoVmFsdWUgKkRzdCwgdW5zaWduZWQgRHN0QWxpZ24sIFZhbHVlICpTcmMsIHVuc2lnbmVkIFNyY0FsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqU2l6ZSwgYm9vbCBpc1ZvbGF0aWxlID0gZmFsc2UsIE1ETm9kZSAqVEJBQVRhZyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqU2NvcGVUYWcgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKk5vQWxpYXNUYWcgPSBudWxscHRyKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIHZlY3RvciBmYWRkIHJlZHVjdGlvbiBpbnRyaW5zaWMgb2YgdGhlIHNvdXJjZSB2ZWN0b3IuCisgIC8vLyBUaGUgZmlyc3QgcGFyYW1ldGVyIGlzIGEgc2NhbGFyIGFjY3VtdWxhdG9yIHZhbHVlIGZvciBvcmRlcmVkIHJlZHVjdGlvbnMuCisgIENhbGxJbnN0ICpDcmVhdGVGQWRkUmVkdWNlKFZhbHVlICpBY2MsIFZhbHVlICpTcmMpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgdmVjdG9yIGZtdWwgcmVkdWN0aW9uIGludHJpbnNpYyBvZiB0aGUgc291cmNlIHZlY3Rvci4KKyAgLy8vIFRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYSBzY2FsYXIgYWNjdW11bGF0b3IgdmFsdWUgZm9yIG9yZGVyZWQgcmVkdWN0aW9ucy4KKyAgQ2FsbEluc3QgKkNyZWF0ZUZNdWxSZWR1Y2UoVmFsdWUgKkFjYywgVmFsdWUgKlNyYyk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSB2ZWN0b3IgaW50IGFkZCByZWR1Y3Rpb24gaW50cmluc2ljIG9mIHRoZSBzb3VyY2UgdmVjdG9yLgorICBDYWxsSW5zdCAqQ3JlYXRlQWRkUmVkdWNlKFZhbHVlICpTcmMpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgdmVjdG9yIGludCBtdWwgcmVkdWN0aW9uIGludHJpbnNpYyBvZiB0aGUgc291cmNlIHZlY3Rvci4KKyAgQ2FsbEluc3QgKkNyZWF0ZU11bFJlZHVjZShWYWx1ZSAqU3JjKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIHZlY3RvciBpbnQgQU5EIHJlZHVjdGlvbiBpbnRyaW5zaWMgb2YgdGhlIHNvdXJjZSB2ZWN0b3IuCisgIENhbGxJbnN0ICpDcmVhdGVBbmRSZWR1Y2UoVmFsdWUgKlNyYyk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSB2ZWN0b3IgaW50IE9SIHJlZHVjdGlvbiBpbnRyaW5zaWMgb2YgdGhlIHNvdXJjZSB2ZWN0b3IuCisgIENhbGxJbnN0ICpDcmVhdGVPclJlZHVjZShWYWx1ZSAqU3JjKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIHZlY3RvciBpbnQgWE9SIHJlZHVjdGlvbiBpbnRyaW5zaWMgb2YgdGhlIHNvdXJjZSB2ZWN0b3IuCisgIENhbGxJbnN0ICpDcmVhdGVYb3JSZWR1Y2UoVmFsdWUgKlNyYyk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSB2ZWN0b3IgaW50ZWdlciBtYXggcmVkdWN0aW9uIGludHJpbnNpYyBvZiB0aGUgc291cmNlCisgIC8vLyB2ZWN0b3IuCisgIENhbGxJbnN0ICpDcmVhdGVJbnRNYXhSZWR1Y2UoVmFsdWUgKlNyYywgYm9vbCBJc1NpZ25lZCA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIHZlY3RvciBpbnRlZ2VyIG1pbiByZWR1Y3Rpb24gaW50cmluc2ljIG9mIHRoZSBzb3VyY2UKKyAgLy8vIHZlY3Rvci4KKyAgQ2FsbEluc3QgKkNyZWF0ZUludE1pblJlZHVjZShWYWx1ZSAqU3JjLCBib29sIElzU2lnbmVkID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgdmVjdG9yIGZsb2F0IG1heCByZWR1Y3Rpb24gaW50cmluc2ljIG9mIHRoZSBzb3VyY2UKKyAgLy8vIHZlY3Rvci4KKyAgQ2FsbEluc3QgKkNyZWF0ZUZQTWF4UmVkdWNlKFZhbHVlICpTcmMsIGJvb2wgTm9OYU4gPSBmYWxzZSk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSB2ZWN0b3IgZmxvYXQgbWluIHJlZHVjdGlvbiBpbnRyaW5zaWMgb2YgdGhlIHNvdXJjZQorICAvLy8gdmVjdG9yLgorICBDYWxsSW5zdCAqQ3JlYXRlRlBNaW5SZWR1Y2UoVmFsdWUgKlNyYywgYm9vbCBOb05hTiA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIGxpZmV0aW1lLnN0YXJ0IGludHJpbnNpYy4KKyAgLy8vCisgIC8vLyBJZiB0aGUgcG9pbnRlciBpc24ndCBpOCogaXQgd2lsbCBiZSBjb252ZXJ0ZWQuCisgIENhbGxJbnN0ICpDcmVhdGVMaWZldGltZVN0YXJ0KFZhbHVlICpQdHIsIENvbnN0YW50SW50ICpTaXplID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBsaWZldGltZS5lbmQgaW50cmluc2ljLgorICAvLy8KKyAgLy8vIElmIHRoZSBwb2ludGVyIGlzbid0IGk4KiBpdCB3aWxsIGJlIGNvbnZlcnRlZC4KKyAgQ2FsbEluc3QgKkNyZWF0ZUxpZmV0aW1lRW5kKFZhbHVlICpQdHIsIENvbnN0YW50SW50ICpTaXplID0gbnVsbHB0cik7CisKKyAgLy8vIENyZWF0ZSBhIGNhbGwgdG8gaW52YXJpYW50LnN0YXJ0IGludHJpbnNpYy4KKyAgLy8vCisgIC8vLyBJZiB0aGUgcG9pbnRlciBpc24ndCBpOCogaXQgd2lsbCBiZSBjb252ZXJ0ZWQuCisgIENhbGxJbnN0ICpDcmVhdGVJbnZhcmlhbnRTdGFydChWYWx1ZSAqUHRyLCBDb25zdGFudEludCAqU2l6ZSA9IG51bGxwdHIpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgY2FsbCB0byBNYXNrZWQgTG9hZCBpbnRyaW5zaWMKKyAgQ2FsbEluc3QgKkNyZWF0ZU1hc2tlZExvYWQoVmFsdWUgKlB0ciwgdW5zaWduZWQgQWxpZ24sIFZhbHVlICpNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqUGFzc1RocnUgPSBudWxscHRyLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIGNhbGwgdG8gTWFza2VkIFN0b3JlIGludHJpbnNpYworICBDYWxsSW5zdCAqQ3JlYXRlTWFza2VkU3RvcmUoVmFsdWUgKlZhbCwgVmFsdWUgKlB0ciwgdW5zaWduZWQgQWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqTWFzayk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBjYWxsIHRvIE1hc2tlZCBHYXRoZXIgaW50cmluc2ljCisgIENhbGxJbnN0ICpDcmVhdGVNYXNrZWRHYXRoZXIoVmFsdWUgKlB0cnMsIHVuc2lnbmVkIEFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpNYXNrID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqUGFzc1RocnUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lJiBOYW1lID0gIiIpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgY2FsbCB0byBNYXNrZWQgU2NhdHRlciBpbnRyaW5zaWMKKyAgQ2FsbEluc3QgKkNyZWF0ZU1hc2tlZFNjYXR0ZXIoVmFsdWUgKlZhbCwgVmFsdWUgKlB0cnMsIHVuc2lnbmVkIEFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqTWFzayA9IG51bGxwdHIpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuIGFzc3VtZSBpbnRyaW5zaWMgY2FsbCB0aGF0IGFsbG93cyB0aGUgb3B0aW1pemVyIHRvCisgIC8vLyBhc3N1bWUgdGhhdCB0aGUgcHJvdmlkZWQgY29uZGl0aW9uIHdpbGwgYmUgdHJ1ZS4KKyAgQ2FsbEluc3QgKkNyZWF0ZUFzc3VtcHRpb24oVmFsdWUgKkNvbmQpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgY2FsbCB0byB0aGUgZXhwZXJpbWVudGFsLmdjLnN0YXRlcG9pbnQgaW50cmluc2ljIHRvCisgIC8vLyBzdGFydCBhIG5ldyBzdGF0ZXBvaW50IHNlcXVlbmNlLgorICBDYWxsSW5zdCAqQ3JlYXRlR0NTdGF0ZXBvaW50Q2FsbCh1aW50NjRfdCBJRCwgdWludDMyX3QgTnVtUGF0Y2hCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKkFjdHVhbENhbGxlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gQ2FsbEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IERlb3B0QXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gR0NBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIGNhbGwgdG8gdGhlIGV4cGVyaW1lbnRhbC5nYy5zdGF0ZXBvaW50IGludHJpbnNpYyB0bworICAvLy8gc3RhcnQgYSBuZXcgc3RhdGVwb2ludCBzZXF1ZW5jZS4KKyAgQ2FsbEluc3QgKkNyZWF0ZUdDU3RhdGVwb2ludENhbGwodWludDY0X3QgSUQsIHVpbnQzMl90IE51bVBhdGNoQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpBY3R1YWxDYWxsZWUsIHVpbnQzMl90IEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxVc2U+IENhbGxBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxVc2U+IFRyYW5zaXRpb25BcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxVc2U+IERlb3B0QXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gR0NBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKTsKKworICAvLy8gXGJyaWVmIENvbnZlbmluZW5jZSBmdW5jdGlvbiBmb3IgdGhlIGNvbW1vbiBjYXNlIHdoZW4gQ2FsbEFyZ3MgYXJlIGZpbGxlZAorICAvLy8gaW4gdXNpbmcgbWFrZUFycmF5UmVmKENTLmFyZ19iZWdpbigpLCBDUy5hcmdfZW5kKCkpOyBVc2UgbmVlZHMgdG8gYmUKKyAgLy8vIC5nZXQoKSdlZCB0byBnZXQgdGhlIFZhbHVlIHBvaW50ZXIuCisgIENhbGxJbnN0ICpDcmVhdGVHQ1N0YXRlcG9pbnRDYWxsKHVpbnQ2NF90IElELCB1aW50MzJfdCBOdW1QYXRjaEJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQWN0dWFsQ2FsbGVlLCBBcnJheVJlZjxVc2U+IENhbGxBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBEZW9wdEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IEdDQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIik7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYW4gaW52b2tlIHRvIHRoZSBleHBlcmltZW50YWwuZ2Muc3RhdGVwb2ludCBpbnRyaW5zaWMgdG8KKyAgLy8vIHN0YXJ0IGEgbmV3IHN0YXRlcG9pbnQgc2VxdWVuY2UuCisgIEludm9rZUluc3QgKgorICBDcmVhdGVHQ1N0YXRlcG9pbnRJbnZva2UodWludDY0X3QgSUQsIHVpbnQzMl90IE51bVBhdGNoQnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQWN0dWFsSW52b2tlZSwgQmFzaWNCbG9jayAqTm9ybWFsRGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKlVud2luZERlc3QsIEFycmF5UmVmPFZhbHVlICo+IEludm9rZUFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBEZW9wdEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBHQ0FyZ3MsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuIGludm9rZSB0byB0aGUgZXhwZXJpbWVudGFsLmdjLnN0YXRlcG9pbnQgaW50cmluc2ljIHRvCisgIC8vLyBzdGFydCBhIG5ldyBzdGF0ZXBvaW50IHNlcXVlbmNlLgorICBJbnZva2VJbnN0ICpDcmVhdGVHQ1N0YXRlcG9pbnRJbnZva2UoCisgICAgICB1aW50NjRfdCBJRCwgdWludDMyX3QgTnVtUGF0Y2hCeXRlcywgVmFsdWUgKkFjdHVhbEludm9rZWUsCisgICAgICBCYXNpY0Jsb2NrICpOb3JtYWxEZXN0LCBCYXNpY0Jsb2NrICpVbndpbmREZXN0LCB1aW50MzJfdCBGbGFncywKKyAgICAgIEFycmF5UmVmPFVzZT4gSW52b2tlQXJncywgQXJyYXlSZWY8VXNlPiBUcmFuc2l0aW9uQXJncywKKyAgICAgIEFycmF5UmVmPFVzZT4gRGVvcHRBcmdzLCBBcnJheVJlZjxWYWx1ZSAqPiBHQ0FyZ3MsCisgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKTsKKworICAvLyBDb252ZW5pbmVuY2UgZnVuY3Rpb24gZm9yIHRoZSBjb21tb24gY2FzZSB3aGVuIENhbGxBcmdzIGFyZSBmaWxsZWQgaW4gdXNpbmcKKyAgLy8gbWFrZUFycmF5UmVmKENTLmFyZ19iZWdpbigpLCBDUy5hcmdfZW5kKCkpOyBVc2UgbmVlZHMgdG8gYmUgLmdldCgpJ2VkIHRvCisgIC8vIGdldCB0aGUgVmFsdWUgKi4KKyAgSW52b2tlSW5zdCAqCisgIENyZWF0ZUdDU3RhdGVwb2ludEludm9rZSh1aW50NjRfdCBJRCwgdWludDMyX3QgTnVtUGF0Y2hCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpBY3R1YWxJbnZva2VlLCBCYXNpY0Jsb2NrICpOb3JtYWxEZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqVW53aW5kRGVzdCwgQXJyYXlSZWY8VXNlPiBJbnZva2VBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gRGVvcHRBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gR0NBcmdzLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIGNhbGwgdG8gdGhlIGV4cGVyaW1lbnRhbC5nYy5yZXN1bHQgaW50cmluc2ljIHRvIGV4dHJhY3QKKyAgLy8vIHRoZSByZXN1bHQgZnJvbSBhIGNhbGwgd3JhcHBlZCBpbiBhIHN0YXRlcG9pbnQuCisgIENhbGxJbnN0ICpDcmVhdGVHQ1Jlc3VsdChJbnN0cnVjdGlvbiAqU3RhdGVwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKlJlc3VsdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKTsKKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIGNhbGwgdG8gdGhlIGV4cGVyaW1lbnRhbC5nYy5yZWxvY2F0ZSBpbnRyaW5zaWNzIHRvCisgIC8vLyBwcm9qZWN0IHRoZSByZWxvY2F0ZWQgdmFsdWUgb2Ygb25lIHBvaW50ZXIgZnJvbSB0aGUgc3RhdGVwb2ludC4KKyAgQ2FsbEluc3QgKkNyZWF0ZUdDUmVsb2NhdGUoSW5zdHJ1Y3Rpb24gKlN0YXRlcG9pbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBCYXNlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgRGVyaXZlZE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqUmVzdWx0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIik7CisKKyAgLy8vIENyZWF0ZSBhIGNhbGwgdG8gaW50cmluc2ljIFxwIElEIHdpdGggMiBvcGVyYW5kcyB3aGljaCBpcyBtYW5nbGVkIG9uIHRoZQorICAvLy8gZmlyc3QgdHlwZS4KKyAgQ2FsbEluc3QgKkNyZWF0ZUJpbmFyeUludHJpbnNpYyhJbnRyaW5zaWM6OklEIElELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpMSFMsIFZhbHVlICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIik7CisKKyAgLy8vIENyZWF0ZSBhIGNhbGwgdG8gaW50cmluc2ljIFxwIElEIHdpdGggMSBvciBtb3JlIG9wZXJhbmRzIGFzc3VtaW5nIHRoZQorICAvLy8gaW50cmluc2ljIGFuZCBhbGwgb3BlcmFuZHMgaGF2ZSB0aGUgc2FtZSB0eXBlLiBJZiBccCBGTUZTb3VyY2UgaXMKKyAgLy8vIHByb3ZpZGVkLCBjb3B5IGZhc3QtbWF0aC1mbGFncyBmcm9tIHRoYXQgaW5zdHJ1Y3Rpb24gdG8gdGhlIGludHJpbnNpYy4KKyAgQ2FsbEluc3QgKkNyZWF0ZUludHJpbnNpYyhJbnRyaW5zaWM6OklEIElELCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpGTUZTb3VyY2UgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpOworCisgIC8vLyBDcmVhdGUgY2FsbCB0byB0aGUgbWlubnVtIGludHJpbnNpYy4KKyAgQ2FsbEluc3QgKkNyZWF0ZU1pbk51bShWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUJpbmFyeUludHJpbnNpYyhJbnRyaW5zaWM6Om1pbm51bSwgTEhTLCBSSFMsIE5hbWUpOworICB9CisKKyAgLy8vIENyZWF0ZSBjYWxsIHRvIHRoZSBtYXhudW0gaW50cmluc2ljLgorICBDYWxsSW5zdCAqQ3JlYXRlTWF4TnVtKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlQmluYXJ5SW50cmluc2ljKEludHJpbnNpYzo6bWF4bnVtLCBMSFMsIFJIUywgTmFtZSk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBjYWxsIHRvIGEgbWFza2VkIGludHJpbnNpYyB3aXRoIGdpdmVuIElkLgorICBDYWxsSW5zdCAqQ3JlYXRlTWFza2VkSW50cmluc2ljKEludHJpbnNpYzo6SUQgSWQsIEFycmF5UmVmPFZhbHVlICo+IE9wcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUeXBlICo+IE92ZXJsb2FkZWRUeXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKTsKKworICBWYWx1ZSAqZ2V0Q2FzdGVkSW50OFB0clZhbHVlKFZhbHVlICpQdHIpOworfTsKKworLy8vIFxicmllZiBUaGlzIHByb3ZpZGVzIGEgdW5pZm9ybSBBUEkgZm9yIGNyZWF0aW5nIGluc3RydWN0aW9ucyBhbmQgaW5zZXJ0aW5nCisvLy8gdGhlbSBpbnRvIGEgYmFzaWMgYmxvY2s6IGVpdGhlciBhdCB0aGUgZW5kIG9mIGEgQmFzaWNCbG9jaywgb3IgYXQgYSBzcGVjaWZpYworLy8vIGl0ZXJhdG9yIGxvY2F0aW9uIGluIGEgYmxvY2suCisvLy8KKy8vLyBOb3RlIHRoYXQgdGhlIGJ1aWxkZXIgZG9lcyBub3QgZXhwb3NlIHRoZSBmdWxsIGdlbmVyYWxpdHkgb2YgTExWTQorLy8vIGluc3RydWN0aW9ucy4gIEZvciBhY2Nlc3MgdG8gZXh0cmEgaW5zdHJ1Y3Rpb24gcHJvcGVydGllcywgdXNlIHRoZSBtdXRhdG9ycworLy8vIChlLmcuIHNldFZvbGF0aWxlKSBvbiB0aGUgaW5zdHJ1Y3Rpb25zIGFmdGVyIHRoZXkgaGF2ZSBiZWVuCisvLy8gY3JlYXRlZC4gQ29udmVuaWVuY2Ugc3RhdGUgZXhpc3RzIHRvIHNwZWNpZnkgZmFzdC1tYXRoIGZsYWdzIGFuZCBmcC1tYXRoCisvLy8gdGFncy4KKy8vLworLy8vIFRoZSBmaXJzdCB0ZW1wbGF0ZSBhcmd1bWVudCBzcGVjaWZpZXMgYSBjbGFzcyB0byB1c2UgZm9yIGNyZWF0aW5nIGNvbnN0YW50cy4KKy8vLyBUaGlzIGRlZmF1bHRzIHRvIGNyZWF0aW5nIG1pbmltYWxseSBmb2xkZWQgY29uc3RhbnRzLiAgVGhlIHNlY29uZCB0ZW1wbGF0ZQorLy8vIGFyZ3VtZW50IGFsbG93cyBjbGllbnRzIHRvIHNwZWNpZnkgY3VzdG9tIGluc2VydGlvbiBob29rcyB0aGF0IGFyZSBjYWxsZWQgb24KKy8vLyBldmVyeSBuZXdseSBjcmVhdGVkIGluc2VydGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUID0gQ29uc3RhbnRGb2xkZXIsCisgICAgICAgICAgdHlwZW5hbWUgSW5zZXJ0ZXIgPSBJUkJ1aWxkZXJEZWZhdWx0SW5zZXJ0ZXI+CitjbGFzcyBJUkJ1aWxkZXIgOiBwdWJsaWMgSVJCdWlsZGVyQmFzZSwgcHVibGljIEluc2VydGVyIHsKKyAgVCBGb2xkZXI7CisKK3B1YmxpYzoKKyAgSVJCdWlsZGVyKExMVk1Db250ZXh0ICZDLCBjb25zdCBUICZGLCBJbnNlcnRlciBJID0gSW5zZXJ0ZXIoKSwKKyAgICAgICAgICAgIE1ETm9kZSAqRlBNYXRoVGFnID0gbnVsbHB0ciwKKyAgICAgICAgICAgIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IE9wQnVuZGxlcyA9IE5vbmUpCisgICAgICA6IElSQnVpbGRlckJhc2UoQywgRlBNYXRoVGFnLCBPcEJ1bmRsZXMpLCBJbnNlcnRlcihzdGQ6Om1vdmUoSSkpLAorICAgICAgICBGb2xkZXIoRikge30KKworICBleHBsaWNpdCBJUkJ1aWxkZXIoTExWTUNvbnRleHQgJkMsIE1ETm9kZSAqRlBNYXRoVGFnID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IE9wQnVuZGxlcyA9IE5vbmUpCisgICAgICA6IElSQnVpbGRlckJhc2UoQywgRlBNYXRoVGFnLCBPcEJ1bmRsZXMpIHt9CisKKyAgZXhwbGljaXQgSVJCdWlsZGVyKEJhc2ljQmxvY2sgKlRoZUJCLCBjb25zdCBUICZGLCBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBPcEJ1bmRsZXMgPSBOb25lKQorICAgICAgOiBJUkJ1aWxkZXJCYXNlKFRoZUJCLT5nZXRDb250ZXh0KCksIEZQTWF0aFRhZywgT3BCdW5kbGVzKSwgRm9sZGVyKEYpIHsKKyAgICBTZXRJbnNlcnRQb2ludChUaGVCQik7CisgIH0KKworICBleHBsaWNpdCBJUkJ1aWxkZXIoQmFzaWNCbG9jayAqVGhlQkIsIE1ETm9kZSAqRlBNYXRoVGFnID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IE9wQnVuZGxlcyA9IE5vbmUpCisgICAgICA6IElSQnVpbGRlckJhc2UoVGhlQkItPmdldENvbnRleHQoKSwgRlBNYXRoVGFnLCBPcEJ1bmRsZXMpIHsKKyAgICBTZXRJbnNlcnRQb2ludChUaGVCQik7CisgIH0KKworICBleHBsaWNpdCBJUkJ1aWxkZXIoSW5zdHJ1Y3Rpb24gKklQLCBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBPcEJ1bmRsZXMgPSBOb25lKQorICAgICAgOiBJUkJ1aWxkZXJCYXNlKElQLT5nZXRDb250ZXh0KCksIEZQTWF0aFRhZywgT3BCdW5kbGVzKSB7CisgICAgU2V0SW5zZXJ0UG9pbnQoSVApOworICB9CisKKyAgSVJCdWlsZGVyKEJhc2ljQmxvY2sgKlRoZUJCLCBCYXNpY0Jsb2NrOjppdGVyYXRvciBJUCwgY29uc3QgVCAmRiwKKyAgICAgICAgICAgIE1ETm9kZSAqRlBNYXRoVGFnID0gbnVsbHB0ciwKKyAgICAgICAgICAgIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IE9wQnVuZGxlcyA9IE5vbmUpCisgICAgICA6IElSQnVpbGRlckJhc2UoVGhlQkItPmdldENvbnRleHQoKSwgRlBNYXRoVGFnLCBPcEJ1bmRsZXMpLCBGb2xkZXIoRikgeworICAgIFNldEluc2VydFBvaW50KFRoZUJCLCBJUCk7CisgIH0KKworICBJUkJ1aWxkZXIoQmFzaWNCbG9jayAqVGhlQkIsIEJhc2ljQmxvY2s6Oml0ZXJhdG9yIElQLAorICAgICAgICAgICAgTUROb2RlICpGUE1hdGhUYWcgPSBudWxscHRyLAorICAgICAgICAgICAgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gT3BCdW5kbGVzID0gTm9uZSkKKyAgICAgIDogSVJCdWlsZGVyQmFzZShUaGVCQi0+Z2V0Q29udGV4dCgpLCBGUE1hdGhUYWcsIE9wQnVuZGxlcykgeworICAgIFNldEluc2VydFBvaW50KFRoZUJCLCBJUCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgY29uc3RhbnQgZm9sZGVyIGJlaW5nIHVzZWQuCisgIGNvbnN0IFQgJmdldEZvbGRlcigpIHsgcmV0dXJuIEZvbGRlcjsgfQorCisgIC8vLyBcYnJpZWYgSW5zZXJ0IGFuZCByZXR1cm4gdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgSW5zdFR5PgorICBJbnN0VHkgKkluc2VydChJbnN0VHkgKkksIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIGNvbnN0IHsKKyAgICB0aGlzLT5JbnNlcnRIZWxwZXIoSSwgTmFtZSwgQkIsIEluc2VydFB0KTsKKyAgICB0aGlzLT5TZXRJbnN0RGVidWdMb2NhdGlvbihJKTsKKyAgICByZXR1cm4gSTsKKyAgfQorCisgIC8vLyBcYnJpZWYgTm8tb3Agb3ZlcmxvYWQgdG8gaGFuZGxlIGNvbnN0YW50cy4KKyAgQ29uc3RhbnQgKkluc2VydChDb25zdGFudCAqQywgY29uc3QgVHdpbmUmID0gIiIpIGNvbnN0IHsKKyAgICByZXR1cm4gQzsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJbnN0cnVjdGlvbiBjcmVhdGlvbiBtZXRob2RzOiBUZXJtaW5hdG9ycworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBIZWxwZXIgdG8gYWRkIGJyYW5jaCB3ZWlnaHQgYW5kIHVucHJlZGljdGFibGUgbWV0YWRhdGEgb250byBhbgorICAvLy8gaW5zdHJ1Y3Rpb24uCisgIC8vLyBccmV0dXJucyBUaGUgYW5ub3RhdGVkIGluc3RydWN0aW9uLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5zdFR5PgorICBJbnN0VHkgKmFkZEJyYW5jaE1ldGFkYXRhKEluc3RUeSAqSSwgTUROb2RlICpXZWlnaHRzLCBNRE5vZGUgKlVucHJlZGljdGFibGUpIHsKKyAgICBpZiAoV2VpZ2h0cykKKyAgICAgIEktPnNldE1ldGFkYXRhKExMVk1Db250ZXh0OjpNRF9wcm9mLCBXZWlnaHRzKTsKKyAgICBpZiAoVW5wcmVkaWN0YWJsZSkKKyAgICAgIEktPnNldE1ldGFkYXRhKExMVk1Db250ZXh0OjpNRF91bnByZWRpY3RhYmxlLCBVbnByZWRpY3RhYmxlKTsKKyAgICByZXR1cm4gSTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgJ3JldCB2b2lkJyBpbnN0cnVjdGlvbi4KKyAgUmV0dXJuSW5zdCAqQ3JlYXRlUmV0Vm9pZCgpIHsKKyAgICByZXR1cm4gSW5zZXJ0KFJldHVybkluc3Q6OkNyZWF0ZShDb250ZXh0KSk7CisgIH0KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhICdyZXQgPHZhbD4nIGluc3RydWN0aW9uLgorICBSZXR1cm5JbnN0ICpDcmVhdGVSZXQoVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gSW5zZXJ0KFJldHVybkluc3Q6OkNyZWF0ZShDb250ZXh0LCBWKSk7CisgIH0KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIHNlcXVlbmNlIG9mIE4gaW5zZXJ0dmFsdWUgaW5zdHJ1Y3Rpb25zLAorICAvLy8gd2l0aCBvbmUgVmFsdWUgZnJvbSB0aGUgcmV0VmFscyBhcnJheSBlYWNoLCB0aGF0IGJ1aWxkIGEgYWdncmVnYXRlCisgIC8vLyByZXR1cm4gdmFsdWUgb25lIHZhbHVlIGF0IGEgdGltZSwgYW5kIGEgcmV0IGluc3RydWN0aW9uIHRvIHJldHVybgorICAvLy8gdGhlIHJlc3VsdGluZyBhZ2dyZWdhdGUgdmFsdWUuCisgIC8vLworICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBjb2RlIHRoYXQgdXNlcyBhZ2dyZWdhdGUgcmV0dXJuIHZhbHVlcworICAvLy8gYXMgYSB2ZWhpY2xlIGZvciBoYXZpbmcgbXVsdGlwbGUgcmV0dXJuIHZhbHVlcy4KKyAgUmV0dXJuSW5zdCAqQ3JlYXRlQWdncmVnYXRlUmV0KFZhbHVlICpjb25zdCAqcmV0VmFscywgdW5zaWduZWQgTikgeworICAgIFZhbHVlICpWID0gVW5kZWZWYWx1ZTo6Z2V0KGdldEN1cnJlbnRGdW5jdGlvblJldHVyblR5cGUoKSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOOyArK2kpCisgICAgICBWID0gQ3JlYXRlSW5zZXJ0VmFsdWUoViwgcmV0VmFsc1tpXSwgaSwgIm1ydiIpOworICAgIHJldHVybiBJbnNlcnQoUmV0dXJuSW5zdDo6Q3JlYXRlKENvbnRleHQsIFYpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGFuIHVuY29uZGl0aW9uYWwgJ2JyIGxhYmVsIFgnIGluc3RydWN0aW9uLgorICBCcmFuY2hJbnN0ICpDcmVhdGVCcihCYXNpY0Jsb2NrICpEZXN0KSB7CisgICAgcmV0dXJuIEluc2VydChCcmFuY2hJbnN0OjpDcmVhdGUoRGVzdCkpOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBjb25kaXRpb25hbCAnYnIgQ29uZCwgVHJ1ZURlc3QsIEZhbHNlRGVzdCcKKyAgLy8vIGluc3RydWN0aW9uLgorICBCcmFuY2hJbnN0ICpDcmVhdGVDb25kQnIoVmFsdWUgKkNvbmQsIEJhc2ljQmxvY2sgKlRydWUsIEJhc2ljQmxvY2sgKkZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpCcmFuY2hXZWlnaHRzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqVW5wcmVkaWN0YWJsZSA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gSW5zZXJ0KGFkZEJyYW5jaE1ldGFkYXRhKEJyYW5jaEluc3Q6OkNyZWF0ZShUcnVlLCBGYWxzZSwgQ29uZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCcmFuY2hXZWlnaHRzLCBVbnByZWRpY3RhYmxlKSk7CisgIH0KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIGNvbmRpdGlvbmFsICdiciBDb25kLCBUcnVlRGVzdCwgRmFsc2VEZXN0JworICAvLy8gaW5zdHJ1Y3Rpb24uIENvcHkgYnJhbmNoIG1ldGEgZGF0YSBpZiBhdmFpbGFibGUuCisgIEJyYW5jaEluc3QgKkNyZWF0ZUNvbmRCcihWYWx1ZSAqQ29uZCwgQmFzaWNCbG9jayAqVHJ1ZSwgQmFzaWNCbG9jayAqRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqTURTcmMpIHsKKyAgICBCcmFuY2hJbnN0ICpCciA9IEJyYW5jaEluc3Q6OkNyZWF0ZShUcnVlLCBGYWxzZSwgQ29uZCk7CisgICAgaWYgKE1EU3JjKSB7CisgICAgICB1bnNpZ25lZCBXTFs0XSA9IHtMTFZNQ29udGV4dDo6TURfcHJvZiwgTExWTUNvbnRleHQ6Ok1EX3VucHJlZGljdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICBMTFZNQ29udGV4dDo6TURfbWFrZV9pbXBsaWNpdCwgTExWTUNvbnRleHQ6Ok1EX2RiZ307CisgICAgICBCci0+Y29weU1ldGFkYXRhKCpNRFNyYywgbWFrZUFycmF5UmVmKCZXTFswXSwgNCkpOworICAgIH0KKyAgICByZXR1cm4gSW5zZXJ0KEJyKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgc3dpdGNoIGluc3RydWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZSwgZGVmYXVsdCBkZXN0LAorICAvLy8gYW5kIHdpdGggYSBoaW50IGZvciB0aGUgbnVtYmVyIG9mIGNhc2VzIHRoYXQgd2lsbCBiZSBhZGRlZCAoZm9yIGVmZmljaWVudAorICAvLy8gYWxsb2NhdGlvbikuCisgIFN3aXRjaEluc3QgKkNyZWF0ZVN3aXRjaChWYWx1ZSAqViwgQmFzaWNCbG9jayAqRGVzdCwgdW5zaWduZWQgTnVtQ2FzZXMgPSAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqQnJhbmNoV2VpZ2h0cyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKlVucHJlZGljdGFibGUgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIEluc2VydChhZGRCcmFuY2hNZXRhZGF0YShTd2l0Y2hJbnN0OjpDcmVhdGUoViwgRGVzdCwgTnVtQ2FzZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnJhbmNoV2VpZ2h0cywgVW5wcmVkaWN0YWJsZSkpOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYW4gaW5kaXJlY3QgYnJhbmNoIGluc3RydWN0aW9uIHdpdGggdGhlIHNwZWNpZmllZCBhZGRyZXNzCisgIC8vLyBvcGVyYW5kLCB3aXRoIGFuIG9wdGlvbmFsIGhpbnQgZm9yIHRoZSBudW1iZXIgb2YgZGVzdGluYXRpb25zIHRoYXQgd2lsbCBiZQorICAvLy8gYWRkZWQgKGZvciBlZmZpY2llbnQgYWxsb2NhdGlvbikuCisgIEluZGlyZWN0QnJJbnN0ICpDcmVhdGVJbmRpcmVjdEJyKFZhbHVlICpBZGRyLCB1bnNpZ25lZCBOdW1EZXN0cyA9IDEwKSB7CisgICAgcmV0dXJuIEluc2VydChJbmRpcmVjdEJySW5zdDo6Q3JlYXRlKEFkZHIsIE51bURlc3RzKSk7CisgIH0KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhbiBpbnZva2UgaW5zdHJ1Y3Rpb24uCisgIEludm9rZUluc3QgKkNyZWF0ZUludm9rZShWYWx1ZSAqQ2FsbGVlLCBCYXNpY0Jsb2NrICpOb3JtYWxEZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqVW53aW5kRGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBJbnNlcnQoSW52b2tlSW5zdDo6Q3JlYXRlKENhbGxlZSwgTm9ybWFsRGVzdCwgVW53aW5kRGVzdCwgQXJncyksCisgICAgICAgICAgICAgICAgICBOYW1lKTsKKyAgfQorICBJbnZva2VJbnN0ICpDcmVhdGVJbnZva2UoVmFsdWUgKkNhbGxlZSwgQmFzaWNCbG9jayAqTm9ybWFsRGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKlVud2luZERlc3QsIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBPcEJ1bmRsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIEluc2VydChJbnZva2VJbnN0OjpDcmVhdGUoQ2FsbGVlLCBOb3JtYWxEZXN0LCBVbndpbmREZXN0LCBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wQnVuZGxlcyksIE5hbWUpOworICB9CisKKyAgUmVzdW1lSW5zdCAqQ3JlYXRlUmVzdW1lKFZhbHVlICpFeG4pIHsKKyAgICByZXR1cm4gSW5zZXJ0KFJlc3VtZUluc3Q6OkNyZWF0ZShFeG4pKTsKKyAgfQorCisgIENsZWFudXBSZXR1cm5JbnN0ICpDcmVhdGVDbGVhbnVwUmV0KENsZWFudXBQYWRJbnN0ICpDbGVhbnVwUGFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpVbndpbmRCQiA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gSW5zZXJ0KENsZWFudXBSZXR1cm5JbnN0OjpDcmVhdGUoQ2xlYW51cFBhZCwgVW53aW5kQkIpKTsKKyAgfQorCisgIENhdGNoU3dpdGNoSW5zdCAqQ3JlYXRlQ2F0Y2hTd2l0Y2goVmFsdWUgKlBhcmVudFBhZCwgQmFzaWNCbG9jayAqVW53aW5kQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtSGFuZGxlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBJbnNlcnQoQ2F0Y2hTd2l0Y2hJbnN0OjpDcmVhdGUoUGFyZW50UGFkLCBVbndpbmRCQiwgTnVtSGFuZGxlcnMpLAorICAgICAgICAgICAgICAgICAgTmFtZSk7CisgIH0KKworICBDYXRjaFBhZEluc3QgKkNyZWF0ZUNhdGNoUGFkKFZhbHVlICpQYXJlbnRQYWQsIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBJbnNlcnQoQ2F0Y2hQYWRJbnN0OjpDcmVhdGUoUGFyZW50UGFkLCBBcmdzKSwgTmFtZSk7CisgIH0KKworICBDbGVhbnVwUGFkSW5zdCAqQ3JlYXRlQ2xlYW51cFBhZChWYWx1ZSAqUGFyZW50UGFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBJbnNlcnQoQ2xlYW51cFBhZEluc3Q6OkNyZWF0ZShQYXJlbnRQYWQsIEFyZ3MpLCBOYW1lKTsKKyAgfQorCisgIENhdGNoUmV0dXJuSW5zdCAqQ3JlYXRlQ2F0Y2hSZXQoQ2F0Y2hQYWRJbnN0ICpDYXRjaFBhZCwgQmFzaWNCbG9jayAqQkIpIHsKKyAgICByZXR1cm4gSW5zZXJ0KENhdGNoUmV0dXJuSW5zdDo6Q3JlYXRlKENhdGNoUGFkLCBCQikpOworICB9CisKKyAgVW5yZWFjaGFibGVJbnN0ICpDcmVhdGVVbnJlYWNoYWJsZSgpIHsKKyAgICByZXR1cm4gSW5zZXJ0KG5ldyBVbnJlYWNoYWJsZUluc3QoQ29udGV4dCkpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEluc3RydWN0aW9uIGNyZWF0aW9uIG1ldGhvZHM6IEJpbmFyeSBPcGVyYXRvcnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitwcml2YXRlOgorICBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlSW5zZXJ0TlVXTlNXQmluT3AoQmluYXJ5T3BlcmF0b3I6OkJpbmFyeU9wcyBPcGMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVywgYm9vbCBIYXNOU1cpIHsKKyAgICBCaW5hcnlPcGVyYXRvciAqQk8gPSBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZShPcGMsIExIUywgUkhTKSwgTmFtZSk7CisgICAgaWYgKEhhc05VVykgQk8tPnNldEhhc05vVW5zaWduZWRXcmFwKCk7CisgICAgaWYgKEhhc05TVykgQk8tPnNldEhhc05vU2lnbmVkV3JhcCgpOworICAgIHJldHVybiBCTzsKKyAgfQorCisgIEluc3RydWN0aW9uICpzZXRGUEF0dHJzKEluc3RydWN0aW9uICpJLCBNRE5vZGUgKkZQTUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEZhc3RNYXRoRmxhZ3MgRk1GKSBjb25zdCB7CisgICAgaWYgKCFGUE1EKQorICAgICAgRlBNRCA9IERlZmF1bHRGUE1hdGhUYWc7CisgICAgaWYgKEZQTUQpCisgICAgICBJLT5zZXRNZXRhZGF0YShMTFZNQ29udGV4dDo6TURfZnBtYXRoLCBGUE1EKTsKKyAgICBJLT5zZXRGYXN0TWF0aEZsYWdzKEZNRik7CisgICAgcmV0dXJuIEk7CisgIH0KKworICBWYWx1ZSAqZm9sZENvbnN0YW50KEluc3RydWN0aW9uOjpCaW5hcnlPcHMgT3BjLCBWYWx1ZSAqTCwKKyAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqUiwgY29uc3QgVHdpbmUgJk5hbWUgPSBudWxscHRyKSBjb25zdCB7CisgICAgYXV0byAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTCk7CisgICAgYXV0byAqUkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUik7CisgICAgcmV0dXJuIChMQyAmJiBSQykgPyBJbnNlcnQoRm9sZGVyLkNyZWF0ZUJpbk9wKE9wYywgTEMsIFJDKSwgTmFtZSkgOiBudWxscHRyOworICB9CisKK3B1YmxpYzoKKyAgVmFsdWUgKkNyZWF0ZUFkZChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpIHsKKyAgICBpZiAoYXV0byAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkKKyAgICAgIGlmIChhdXRvICpSQyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKQorICAgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVBZGQoTEMsIFJDLCBIYXNOVVcsIEhhc05TVyksIE5hbWUpOworICAgIHJldHVybiBDcmVhdGVJbnNlcnROVVdOU1dCaW5PcChJbnN0cnVjdGlvbjo6QWRkLCBMSFMsIFJIUywgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzTlVXLCBIYXNOU1cpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZU5TV0FkZChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUFkZChMSFMsIFJIUywgTmFtZSwgZmFsc2UsIHRydWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZU5VV0FkZChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUFkZChMSFMsIFJIUywgTmFtZSwgdHJ1ZSwgZmFsc2UpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZVN1YihWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpIHsKKyAgICBpZiAoYXV0byAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkKKyAgICAgIGlmIChhdXRvICpSQyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKQorICAgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVTdWIoTEMsIFJDLCBIYXNOVVcsIEhhc05TVyksIE5hbWUpOworICAgIHJldHVybiBDcmVhdGVJbnNlcnROVVdOU1dCaW5PcChJbnN0cnVjdGlvbjo6U3ViLCBMSFMsIFJIUywgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzTlVXLCBIYXNOU1cpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZU5TV1N1YihWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZVN1YihMSFMsIFJIUywgTmFtZSwgZmFsc2UsIHRydWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZU5VV1N1YihWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZVN1YihMSFMsIFJIUywgTmFtZSwgdHJ1ZSwgZmFsc2UpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZU11bChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpIHsKKyAgICBpZiAoYXV0byAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkKKyAgICAgIGlmIChhdXRvICpSQyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKQorICAgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVNdWwoTEMsIFJDLCBIYXNOVVcsIEhhc05TVyksIE5hbWUpOworICAgIHJldHVybiBDcmVhdGVJbnNlcnROVVdOU1dCaW5PcChJbnN0cnVjdGlvbjo6TXVsLCBMSFMsIFJIUywgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzTlVXLCBIYXNOU1cpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZU5TV011bChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZU11bChMSFMsIFJIUywgTmFtZSwgZmFsc2UsIHRydWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZU5VV011bChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZU11bChMSFMsIFJIUywgTmFtZSwgdHJ1ZSwgZmFsc2UpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZVVEaXYoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0V4YWN0ID0gZmFsc2UpIHsKKyAgICBpZiAoYXV0byAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkKKyAgICAgIGlmIChhdXRvICpSQyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKQorICAgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVVRGl2KExDLCBSQywgaXNFeGFjdCksIE5hbWUpOworICAgIGlmICghaXNFeGFjdCkKKyAgICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVVEaXYoTEhTLCBSSFMpLCBOYW1lKTsKKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVFeGFjdFVEaXYoTEhTLCBSSFMpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVFeGFjdFVEaXYoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVVRGl2KExIUywgUkhTLCBOYW1lLCB0cnVlKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVTRGl2KFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNFeGFjdCA9IGZhbHNlKSB7CisgICAgaWYgKGF1dG8gKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICBpZiAoYXV0byAqUkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkKKyAgICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlU0RpdihMQywgUkMsIGlzRXhhY3QpLCBOYW1lKTsKKyAgICBpZiAoIWlzRXhhY3QpCisgICAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTRGl2KExIUywgUkhTKSwgTmFtZSk7CisgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRXhhY3RTRGl2KExIUywgUkhTKSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRXhhY3RTRGl2KFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlU0RpdihMSFMsIFJIUywgTmFtZSwgdHJ1ZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlVVJlbShWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKFZhbHVlICpWID0gZm9sZENvbnN0YW50KEluc3RydWN0aW9uOjpVUmVtLCBMSFMsIFJIUywgTmFtZSkpIHJldHVybiBWOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVVSZW0oTEhTLCBSSFMpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVTUmVtKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBpZiAoVmFsdWUgKlYgPSBmb2xkQ29uc3RhbnQoSW5zdHJ1Y3Rpb246OlNSZW0sIExIUywgUkhTLCBOYW1lKSkgcmV0dXJuIFY7CisgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU1JlbShMSFMsIFJIUyksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZVNobChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpIHsKKyAgICBpZiAoYXV0byAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkKKyAgICAgIGlmIChhdXRvICpSQyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKQorICAgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVTaGwoTEMsIFJDLCBIYXNOVVcsIEhhc05TVyksIE5hbWUpOworICAgIHJldHVybiBDcmVhdGVJbnNlcnROVVdOU1dCaW5PcChJbnN0cnVjdGlvbjo6U2hsLCBMSFMsIFJIUywgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFzTlVXLCBIYXNOU1cpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZVNobChWYWx1ZSAqTEhTLCBjb25zdCBBUEludCAmUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpIHsKKyAgICByZXR1cm4gQ3JlYXRlU2hsKExIUywgQ29uc3RhbnRJbnQ6OmdldChMSFMtPmdldFR5cGUoKSwgUkhTKSwgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIEhhc05VVywgSGFzTlNXKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVTaGwoVmFsdWUgKkxIUywgdWludDY0X3QgUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpIHsKKyAgICByZXR1cm4gQ3JlYXRlU2hsKExIUywgQ29uc3RhbnRJbnQ6OmdldChMSFMtPmdldFR5cGUoKSwgUkhTKSwgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIEhhc05VVywgSGFzTlNXKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVMU2hyKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNFeGFjdCA9IGZhbHNlKSB7CisgICAgaWYgKGF1dG8gKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICBpZiAoYXV0byAqUkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkKKyAgICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlTFNocihMQywgUkMsIGlzRXhhY3QpLCBOYW1lKTsKKyAgICBpZiAoIWlzRXhhY3QpCisgICAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVMU2hyKExIUywgUkhTKSwgTmFtZSk7CisgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRXhhY3RMU2hyKExIUywgUkhTKSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlTFNocihWYWx1ZSAqTEhTLCBjb25zdCBBUEludCAmUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICBib29sIGlzRXhhY3QgPSBmYWxzZSkgeworICAgIHJldHVybiBDcmVhdGVMU2hyKExIUywgQ29uc3RhbnRJbnQ6OmdldChMSFMtPmdldFR5cGUoKSwgUkhTKSwgTmFtZSxpc0V4YWN0KTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVMU2hyKFZhbHVlICpMSFMsIHVpbnQ2NF90IFJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0V4YWN0ID0gZmFsc2UpIHsKKyAgICByZXR1cm4gQ3JlYXRlTFNocihMSFMsIENvbnN0YW50SW50OjpnZXQoTEhTLT5nZXRUeXBlKCksIFJIUyksIE5hbWUsaXNFeGFjdCk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlQVNocihWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICBib29sIGlzRXhhY3QgPSBmYWxzZSkgeworICAgIGlmIChhdXRvICpMQyA9IGR5bl9jYXN0PENvbnN0YW50PihMSFMpKQorICAgICAgaWYgKGF1dG8gKlJDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFJIUykpCisgICAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZUFTaHIoTEMsIFJDLCBpc0V4YWN0KSwgTmFtZSk7CisgICAgaWYgKCFpc0V4YWN0KQorICAgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQVNocihMSFMsIFJIUyksIE5hbWUpOworICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUV4YWN0QVNocihMSFMsIFJIUyksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUFTaHIoVmFsdWUgKkxIUywgY29uc3QgQVBJbnQgJlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0V4YWN0ID0gZmFsc2UpIHsKKyAgICByZXR1cm4gQ3JlYXRlQVNocihMSFMsIENvbnN0YW50SW50OjpnZXQoTEhTLT5nZXRUeXBlKCksIFJIUyksIE5hbWUsaXNFeGFjdCk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlQVNocihWYWx1ZSAqTEhTLCB1aW50NjRfdCBSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNFeGFjdCA9IGZhbHNlKSB7CisgICAgcmV0dXJuIENyZWF0ZUFTaHIoTEhTLCBDb25zdGFudEludDo6Z2V0KExIUy0+Z2V0VHlwZSgpLCBSSFMpLCBOYW1lLGlzRXhhY3QpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUFuZChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKGF1dG8gKlJDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFJIUykpIHsKKyAgICAgIGlmIChpc2E8Q29uc3RhbnRJbnQ+KFJDKSAmJiBjYXN0PENvbnN0YW50SW50PihSQyktPmlzTWludXNPbmUoKSkKKyAgICAgICAgcmV0dXJuIExIUzsgIC8vIExIUyAmIC0xIC0+IExIUworICAgICAgaWYgKGF1dG8gKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZUFuZChMQywgUkMpLCBOYW1lKTsKKyAgICB9CisgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQW5kKExIUywgUkhTKSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlQW5kKFZhbHVlICpMSFMsIGNvbnN0IEFQSW50ICZSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlQW5kKExIUywgQ29uc3RhbnRJbnQ6OmdldChMSFMtPmdldFR5cGUoKSwgUkhTKSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlQW5kKFZhbHVlICpMSFMsIHVpbnQ2NF90IFJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVBbmQoTEhTLCBDb25zdGFudEludDo6Z2V0KExIUy0+Z2V0VHlwZSgpLCBSSFMpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVPcihWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKGF1dG8gKlJDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFJIUykpIHsKKyAgICAgIGlmIChSQy0+aXNOdWxsVmFsdWUoKSkKKyAgICAgICAgcmV0dXJuIExIUzsgIC8vIExIUyB8IDAgLT4gTEhTCisgICAgICBpZiAoYXV0byAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkKKyAgICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlT3IoTEMsIFJDKSwgTmFtZSk7CisgICAgfQorICAgIHJldHVybiBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU9yKExIUywgUkhTKSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlT3IoVmFsdWUgKkxIUywgY29uc3QgQVBJbnQgJlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVPcihMSFMsIENvbnN0YW50SW50OjpnZXQoTEhTLT5nZXRUeXBlKCksIFJIUyksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZU9yKFZhbHVlICpMSFMsIHVpbnQ2NF90IFJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVPcihMSFMsIENvbnN0YW50SW50OjpnZXQoTEhTLT5nZXRUeXBlKCksIFJIUyksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZVhvcihWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKFZhbHVlICpWID0gZm9sZENvbnN0YW50KEluc3RydWN0aW9uOjpYb3IsIExIUywgUkhTLCBOYW1lKSkgcmV0dXJuIFY7CisgICAgcmV0dXJuIEluc2VydChCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlWG9yKExIUywgUkhTKSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlWG9yKFZhbHVlICpMSFMsIGNvbnN0IEFQSW50ICZSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlWG9yKExIUywgQ29uc3RhbnRJbnQ6OmdldChMSFMtPmdldFR5cGUoKSwgUkhTKSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlWG9yKFZhbHVlICpMSFMsIHVpbnQ2NF90IFJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVYb3IoTEhTLCBDb25zdGFudEludDo6Z2V0KExIUy0+Z2V0VHlwZSgpLCBSSFMpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVGQWRkKFZhbHVlICpMLCBWYWx1ZSAqUiwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgTUROb2RlICpGUE1EID0gbnVsbHB0cikgeworICAgIGlmIChWYWx1ZSAqViA9IGZvbGRDb25zdGFudChJbnN0cnVjdGlvbjo6RkFkZCwgTCwgUiwgTmFtZSkpIHJldHVybiBWOworICAgIEluc3RydWN0aW9uICpJID0gc2V0RlBBdHRycyhCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRkFkZChMLCBSKSwgRlBNRCwgRk1GKTsKKyAgICByZXR1cm4gSW5zZXJ0KEksIE5hbWUpOworICB9CisKKyAgLy8vIENvcHkgZmFzdC1tYXRoLWZsYWdzIGZyb20gYW4gaW5zdHJ1Y3Rpb24gcmF0aGVyIHRoYW4gdXNpbmcgdGhlIGJ1aWxkZXIncworICAvLy8gZGVmYXVsdCBGTUYuCisgIFZhbHVlICpDcmVhdGVGQWRkRk1GKFZhbHVlICpMLCBWYWx1ZSAqUiwgSW5zdHJ1Y3Rpb24gKkZNRlNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGlmIChWYWx1ZSAqViA9IGZvbGRDb25zdGFudChJbnN0cnVjdGlvbjo6RkFkZCwgTCwgUiwgTmFtZSkpIHJldHVybiBWOworICAgIEluc3RydWN0aW9uICpJID0gc2V0RlBBdHRycyhCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRkFkZChMLCBSKSwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk1GU291cmNlLT5nZXRGYXN0TWF0aEZsYWdzKCkpOworICAgIHJldHVybiBJbnNlcnQoSSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRlN1YihWYWx1ZSAqTCwgVmFsdWUgKlIsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqRlBNRCA9IG51bGxwdHIpIHsKKyAgICBpZiAoVmFsdWUgKlYgPSBmb2xkQ29uc3RhbnQoSW5zdHJ1Y3Rpb246OkZTdWIsIEwsIFIsIE5hbWUpKSByZXR1cm4gVjsKKyAgICBJbnN0cnVjdGlvbiAqSSA9IHNldEZQQXR0cnMoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUZTdWIoTCwgUiksIEZQTUQsIEZNRik7CisgICAgcmV0dXJuIEluc2VydChJLCBOYW1lKTsKKyAgfQorCisgIC8vLyBDb3B5IGZhc3QtbWF0aC1mbGFncyBmcm9tIGFuIGluc3RydWN0aW9uIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBidWlsZGVyJ3MKKyAgLy8vIGRlZmF1bHQgRk1GLgorICBWYWx1ZSAqQ3JlYXRlRlN1YkZNRihWYWx1ZSAqTCwgVmFsdWUgKlIsIEluc3RydWN0aW9uICpGTUZTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBpZiAoVmFsdWUgKlYgPSBmb2xkQ29uc3RhbnQoSW5zdHJ1Y3Rpb246OkZTdWIsIEwsIFIsIE5hbWUpKSByZXR1cm4gVjsKKyAgICBJbnN0cnVjdGlvbiAqSSA9IHNldEZQQXR0cnMoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUZTdWIoTCwgUiksIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZNRlNvdXJjZS0+Z2V0RmFzdE1hdGhGbGFncygpKTsKKyAgICByZXR1cm4gSW5zZXJ0KEksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUZNdWwoVmFsdWUgKkwsIFZhbHVlICpSLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKkZQTUQgPSBudWxscHRyKSB7CisgICAgaWYgKFZhbHVlICpWID0gZm9sZENvbnN0YW50KEluc3RydWN0aW9uOjpGTXVsLCBMLCBSLCBOYW1lKSkgcmV0dXJuIFY7CisgICAgSW5zdHJ1Y3Rpb24gKkkgPSBzZXRGUEF0dHJzKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGTXVsKEwsIFIpLCBGUE1ELCBGTUYpOworICAgIHJldHVybiBJbnNlcnQoSSwgTmFtZSk7CisgIH0KKworICAvLy8gQ29weSBmYXN0LW1hdGgtZmxhZ3MgZnJvbSBhbiBpbnN0cnVjdGlvbiByYXRoZXIgdGhhbiB1c2luZyB0aGUgYnVpbGRlcidzCisgIC8vLyBkZWZhdWx0IEZNRi4KKyAgVmFsdWUgKkNyZWF0ZUZNdWxGTUYoVmFsdWUgKkwsIFZhbHVlICpSLCBJbnN0cnVjdGlvbiAqRk1GU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKFZhbHVlICpWID0gZm9sZENvbnN0YW50KEluc3RydWN0aW9uOjpGTXVsLCBMLCBSLCBOYW1lKSkgcmV0dXJuIFY7CisgICAgSW5zdHJ1Y3Rpb24gKkkgPSBzZXRGUEF0dHJzKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGTXVsKEwsIFIpLCBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGTUZTb3VyY2UtPmdldEZhc3RNYXRoRmxhZ3MoKSk7CisgICAgcmV0dXJuIEluc2VydChJLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVGRGl2KFZhbHVlICpMLCBWYWx1ZSAqUiwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgTUROb2RlICpGUE1EID0gbnVsbHB0cikgeworICAgIGlmIChWYWx1ZSAqViA9IGZvbGRDb25zdGFudChJbnN0cnVjdGlvbjo6RkRpdiwgTCwgUiwgTmFtZSkpIHJldHVybiBWOworICAgIEluc3RydWN0aW9uICpJID0gc2V0RlBBdHRycyhCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRkRpdihMLCBSKSwgRlBNRCwgRk1GKTsKKyAgICByZXR1cm4gSW5zZXJ0KEksIE5hbWUpOworICB9CisKKyAgLy8vIENvcHkgZmFzdC1tYXRoLWZsYWdzIGZyb20gYW4gaW5zdHJ1Y3Rpb24gcmF0aGVyIHRoYW4gdXNpbmcgdGhlIGJ1aWxkZXIncworICAvLy8gZGVmYXVsdCBGTUYuCisgIFZhbHVlICpDcmVhdGVGRGl2Rk1GKFZhbHVlICpMLCBWYWx1ZSAqUiwgSW5zdHJ1Y3Rpb24gKkZNRlNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGlmIChWYWx1ZSAqViA9IGZvbGRDb25zdGFudChJbnN0cnVjdGlvbjo6RkRpdiwgTCwgUiwgTmFtZSkpIHJldHVybiBWOworICAgIEluc3RydWN0aW9uICpJID0gc2V0RlBBdHRycyhCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRkRpdihMLCBSKSwgbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk1GU291cmNlLT5nZXRGYXN0TWF0aEZsYWdzKCkpOworICAgIHJldHVybiBJbnNlcnQoSSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRlJlbShWYWx1ZSAqTCwgVmFsdWUgKlIsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqRlBNRCA9IG51bGxwdHIpIHsKKyAgICBpZiAoVmFsdWUgKlYgPSBmb2xkQ29uc3RhbnQoSW5zdHJ1Y3Rpb246OkZSZW0sIEwsIFIsIE5hbWUpKSByZXR1cm4gVjsKKyAgICBJbnN0cnVjdGlvbiAqSSA9IHNldEZQQXR0cnMoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUZSZW0oTCwgUiksIEZQTUQsIEZNRik7CisgICAgcmV0dXJuIEluc2VydChJLCBOYW1lKTsKKyAgfQorCisgIC8vLyBDb3B5IGZhc3QtbWF0aC1mbGFncyBmcm9tIGFuIGluc3RydWN0aW9uIHJhdGhlciB0aGFuIHVzaW5nIHRoZSBidWlsZGVyJ3MKKyAgLy8vIGRlZmF1bHQgRk1GLgorICBWYWx1ZSAqQ3JlYXRlRlJlbUZNRihWYWx1ZSAqTCwgVmFsdWUgKlIsIEluc3RydWN0aW9uICpGTUZTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBpZiAoVmFsdWUgKlYgPSBmb2xkQ29uc3RhbnQoSW5zdHJ1Y3Rpb246OkZSZW0sIEwsIFIsIE5hbWUpKSByZXR1cm4gVjsKKyAgICBJbnN0cnVjdGlvbiAqSSA9IHNldEZQQXR0cnMoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUZSZW0oTCwgUiksIG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZNRlNvdXJjZS0+Z2V0RmFzdE1hdGhGbGFncygpKTsKKyAgICByZXR1cm4gSW5zZXJ0KEksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUJpbk9wKEluc3RydWN0aW9uOjpCaW5hcnlPcHMgT3BjLAorICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqRlBNYXRoVGFnID0gbnVsbHB0cikgeworICAgIGlmIChWYWx1ZSAqViA9IGZvbGRDb25zdGFudChPcGMsIExIUywgUkhTLCBOYW1lKSkgcmV0dXJuIFY7CisgICAgSW5zdHJ1Y3Rpb24gKkJpbk9wID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZShPcGMsIExIUywgUkhTKTsKKyAgICBpZiAoaXNhPEZQTWF0aE9wZXJhdG9yPihCaW5PcCkpCisgICAgICBCaW5PcCA9IHNldEZQQXR0cnMoQmluT3AsIEZQTWF0aFRhZywgRk1GKTsKKyAgICByZXR1cm4gSW5zZXJ0KEJpbk9wLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVOZWcoVmFsdWUgKlYsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNOVVcgPSBmYWxzZSwgYm9vbCBIYXNOU1cgPSBmYWxzZSkgeworICAgIGlmIChhdXRvICpWQyA9IGR5bl9jYXN0PENvbnN0YW50PihWKSkKKyAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZU5lZyhWQywgSGFzTlVXLCBIYXNOU1cpLCBOYW1lKTsKKyAgICBCaW5hcnlPcGVyYXRvciAqQk8gPSBJbnNlcnQoQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5lZyhWKSwgTmFtZSk7CisgICAgaWYgKEhhc05VVykgQk8tPnNldEhhc05vVW5zaWduZWRXcmFwKCk7CisgICAgaWYgKEhhc05TVykgQk8tPnNldEhhc05vU2lnbmVkV3JhcCgpOworICAgIHJldHVybiBCTzsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVOU1dOZWcoVmFsdWUgKlYsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlTmVnKFYsIE5hbWUsIGZhbHNlLCB0cnVlKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVOVVdOZWcoVmFsdWUgKlYsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlTmVnKFYsIE5hbWUsIHRydWUsIGZhbHNlKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVGTmVnKFZhbHVlICpWLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIpIHsKKyAgICBpZiAoYXV0byAqVkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpCisgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVGTmVnKFZDKSwgTmFtZSk7CisgICAgcmV0dXJuIEluc2VydChzZXRGUEF0dHJzKEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGTmVnKFYpLCBGUE1hdGhUYWcsIEZNRiksCisgICAgICAgICAgICAgICAgICBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVOb3QoVmFsdWUgKlYsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBpZiAoYXV0byAqVkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpCisgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVOb3QoVkMpLCBOYW1lKTsKKyAgICByZXR1cm4gSW5zZXJ0KEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOb3QoViksIE5hbWUpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEluc3RydWN0aW9uIGNyZWF0aW9uIG1ldGhvZHM6IE1lbW9yeSBJbnN0cnVjdGlvbnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgQWxsb2NhSW5zdCAqQ3JlYXRlQWxsb2NhKFR5cGUgKlR5LCB1bnNpZ25lZCBBZGRyU3BhY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQXJyYXlTaXplID0gbnVsbHB0ciwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBJbnNlcnQobmV3IEFsbG9jYUluc3QoVHksIEFkZHJTcGFjZSwgQXJyYXlTaXplKSwgTmFtZSk7CisgIH0KKworICBBbGxvY2FJbnN0ICpDcmVhdGVBbGxvY2EoVHlwZSAqVHksIFZhbHVlICpBcnJheVNpemUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMID0gQkItPmdldFBhcmVudCgpLT5nZXRQYXJlbnQoKS0+Z2V0RGF0YUxheW91dCgpOworICAgIHJldHVybiBJbnNlcnQobmV3IEFsbG9jYUluc3QoVHksIERMLmdldEFsbG9jYUFkZHJTcGFjZSgpLCBBcnJheVNpemUpLCBOYW1lKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUHJvdmlkZWQgdG8gcmVzb2x2ZSAnQ3JlYXRlTG9hZChQdHIsICIuLi4iKScgY29ycmVjdGx5LCBpbnN0ZWFkIG9mCisgIC8vLyBjb252ZXJ0aW5nIHRoZSBzdHJpbmcgdG8gJ2Jvb2wnIGZvciB0aGUgaXNWb2xhdGlsZSBwYXJhbWV0ZXIuCisgIExvYWRJbnN0ICpDcmVhdGVMb2FkKFZhbHVlICpQdHIsIGNvbnN0IGNoYXIgKk5hbWUpIHsKKyAgICByZXR1cm4gSW5zZXJ0KG5ldyBMb2FkSW5zdChQdHIpLCBOYW1lKTsKKyAgfQorCisgIExvYWRJbnN0ICpDcmVhdGVMb2FkKFZhbHVlICpQdHIsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gSW5zZXJ0KG5ldyBMb2FkSW5zdChQdHIpLCBOYW1lKTsKKyAgfQorCisgIExvYWRJbnN0ICpDcmVhdGVMb2FkKFR5cGUgKlR5LCBWYWx1ZSAqUHRyLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIEluc2VydChuZXcgTG9hZEluc3QoVHksIFB0ciksIE5hbWUpOworICB9CisKKyAgTG9hZEluc3QgKkNyZWF0ZUxvYWQoVmFsdWUgKlB0ciwgYm9vbCBpc1ZvbGF0aWxlLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIEluc2VydChuZXcgTG9hZEluc3QoUHRyLCBudWxscHRyLCBpc1ZvbGF0aWxlKSwgTmFtZSk7CisgIH0KKworICBTdG9yZUluc3QgKkNyZWF0ZVN0b3JlKFZhbHVlICpWYWwsIFZhbHVlICpQdHIsIGJvb2wgaXNWb2xhdGlsZSA9IGZhbHNlKSB7CisgICAgcmV0dXJuIEluc2VydChuZXcgU3RvcmVJbnN0KFZhbCwgUHRyLCBpc1ZvbGF0aWxlKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFByb3ZpZGVkIHRvIHJlc29sdmUgJ0NyZWF0ZUFsaWduZWRMb2FkKFB0ciwgQWxpZ24sICIuLi4iKScKKyAgLy8vIGNvcnJlY3RseSwgaW5zdGVhZCBvZiBjb252ZXJ0aW5nIHRoZSBzdHJpbmcgdG8gJ2Jvb2wnIGZvciB0aGUgaXNWb2xhdGlsZQorICAvLy8gcGFyYW1ldGVyLgorICBMb2FkSW5zdCAqQ3JlYXRlQWxpZ25lZExvYWQoVmFsdWUgKlB0ciwgdW5zaWduZWQgQWxpZ24sIGNvbnN0IGNoYXIgKk5hbWUpIHsKKyAgICBMb2FkSW5zdCAqTEkgPSBDcmVhdGVMb2FkKFB0ciwgTmFtZSk7CisgICAgTEktPnNldEFsaWdubWVudChBbGlnbik7CisgICAgcmV0dXJuIExJOworICB9CisgIExvYWRJbnN0ICpDcmVhdGVBbGlnbmVkTG9hZChWYWx1ZSAqUHRyLCB1bnNpZ25lZCBBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBMb2FkSW5zdCAqTEkgPSBDcmVhdGVMb2FkKFB0ciwgTmFtZSk7CisgICAgTEktPnNldEFsaWdubWVudChBbGlnbik7CisgICAgcmV0dXJuIExJOworICB9CisgIExvYWRJbnN0ICpDcmVhdGVBbGlnbmVkTG9hZChWYWx1ZSAqUHRyLCB1bnNpZ25lZCBBbGlnbiwgYm9vbCBpc1ZvbGF0aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIExvYWRJbnN0ICpMSSA9IENyZWF0ZUxvYWQoUHRyLCBpc1ZvbGF0aWxlLCBOYW1lKTsKKyAgICBMSS0+c2V0QWxpZ25tZW50KEFsaWduKTsKKyAgICByZXR1cm4gTEk7CisgIH0KKworICBTdG9yZUluc3QgKkNyZWF0ZUFsaWduZWRTdG9yZShWYWx1ZSAqVmFsLCBWYWx1ZSAqUHRyLCB1bnNpZ25lZCBBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZvbGF0aWxlID0gZmFsc2UpIHsKKyAgICBTdG9yZUluc3QgKlNJID0gQ3JlYXRlU3RvcmUoVmFsLCBQdHIsIGlzVm9sYXRpbGUpOworICAgIFNJLT5zZXRBbGlnbm1lbnQoQWxpZ24pOworICAgIHJldHVybiBTSTsKKyAgfQorCisgIEZlbmNlSW5zdCAqQ3JlYXRlRmVuY2UoQXRvbWljT3JkZXJpbmcgT3JkZXJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgU3luY1Njb3BlOjpJRCBTU0lEID0gU3luY1Njb3BlOjpTeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBJbnNlcnQobmV3IEZlbmNlSW5zdChDb250ZXh0LCBPcmRlcmluZywgU1NJRCksIE5hbWUpOworICB9CisKKyAgQXRvbWljQ21wWGNoZ0luc3QgKgorICBDcmVhdGVBdG9taWNDbXBYY2hnKFZhbHVlICpQdHIsIFZhbHVlICpDbXAsIFZhbHVlICpOZXcsCisgICAgICAgICAgICAgICAgICAgICAgQXRvbWljT3JkZXJpbmcgU3VjY2Vzc09yZGVyaW5nLAorICAgICAgICAgICAgICAgICAgICAgIEF0b21pY09yZGVyaW5nIEZhaWx1cmVPcmRlcmluZywKKyAgICAgICAgICAgICAgICAgICAgICBTeW5jU2NvcGU6OklEIFNTSUQgPSBTeW5jU2NvcGU6OlN5c3RlbSkgeworICAgIHJldHVybiBJbnNlcnQobmV3IEF0b21pY0NtcFhjaGdJbnN0KFB0ciwgQ21wLCBOZXcsIFN1Y2Nlc3NPcmRlcmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWlsdXJlT3JkZXJpbmcsIFNTSUQpKTsKKyAgfQorCisgIEF0b21pY1JNV0luc3QgKkNyZWF0ZUF0b21pY1JNVyhBdG9taWNSTVdJbnN0OjpCaW5PcCBPcCwgVmFsdWUgKlB0ciwgVmFsdWUgKlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY09yZGVyaW5nIE9yZGVyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3luY1Njb3BlOjpJRCBTU0lEID0gU3luY1Njb3BlOjpTeXN0ZW0pIHsKKyAgICByZXR1cm4gSW5zZXJ0KG5ldyBBdG9taWNSTVdJbnN0KE9wLCBQdHIsIFZhbCwgT3JkZXJpbmcsIFNTSUQpKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVHRVAoVmFsdWUgKlB0ciwgQXJyYXlSZWY8VmFsdWUgKj4gSWR4TGlzdCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUdFUChudWxscHRyLCBQdHIsIElkeExpc3QsIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUdFUChUeXBlICpUeSwgVmFsdWUgKlB0ciwgQXJyYXlSZWY8VmFsdWUgKj4gSWR4TGlzdCwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKGF1dG8gKlBDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFB0cikpIHsKKyAgICAgIC8vIEV2ZXJ5IGluZGV4IG11c3QgYmUgY29uc3RhbnQuCisgICAgICBzaXplX3QgaSwgZTsKKyAgICAgIGZvciAoaSA9IDAsIGUgPSBJZHhMaXN0LnNpemUoKTsgaSAhPSBlOyArK2kpCisgICAgICAgIGlmICghaXNhPENvbnN0YW50PihJZHhMaXN0W2ldKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgIGlmIChpID09IGUpCisgICAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZUdldEVsZW1lbnRQdHIoVHksIFBDLCBJZHhMaXN0KSwgTmFtZSk7CisgICAgfQorICAgIHJldHVybiBJbnNlcnQoR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShUeSwgUHRyLCBJZHhMaXN0KSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlSW5Cb3VuZHNHRVAoVmFsdWUgKlB0ciwgQXJyYXlSZWY8VmFsdWUgKj4gSWR4TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlSW5Cb3VuZHNHRVAobnVsbHB0ciwgUHRyLCBJZHhMaXN0LCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVJbkJvdW5kc0dFUChUeXBlICpUeSwgVmFsdWUgKlB0ciwgQXJyYXlSZWY8VmFsdWUgKj4gSWR4TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBpZiAoYXV0byAqUEMgPSBkeW5fY2FzdDxDb25zdGFudD4oUHRyKSkgeworICAgICAgLy8gRXZlcnkgaW5kZXggbXVzdCBiZSBjb25zdGFudC4KKyAgICAgIHNpemVfdCBpLCBlOworICAgICAgZm9yIChpID0gMCwgZSA9IElkeExpc3Quc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgICAgaWYgKCFpc2E8Q29uc3RhbnQ+KElkeExpc3RbaV0pKQorICAgICAgICAgIGJyZWFrOworICAgICAgaWYgKGkgPT0gZSkKKyAgICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlSW5Cb3VuZHNHZXRFbGVtZW50UHRyKFR5LCBQQywgSWR4TGlzdCksCisgICAgICAgICAgICAgICAgICAgICAgTmFtZSk7CisgICAgfQorICAgIHJldHVybiBJbnNlcnQoR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZUluQm91bmRzKFR5LCBQdHIsIElkeExpc3QpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVHRVAoVmFsdWUgKlB0ciwgVmFsdWUgKklkeCwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVHRVAobnVsbHB0ciwgUHRyLCBJZHgsIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUdFUChUeXBlICpUeSwgVmFsdWUgKlB0ciwgVmFsdWUgKklkeCwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGlmIChhdXRvICpQQyA9IGR5bl9jYXN0PENvbnN0YW50PihQdHIpKQorICAgICAgaWYgKGF1dG8gKklDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KElkeCkpCisgICAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZUdldEVsZW1lbnRQdHIoVHksIFBDLCBJQyksIE5hbWUpOworICAgIHJldHVybiBJbnNlcnQoR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShUeSwgUHRyLCBJZHgpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVJbkJvdW5kc0dFUChUeXBlICpUeSwgVmFsdWUgKlB0ciwgVmFsdWUgKklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBpZiAoYXV0byAqUEMgPSBkeW5fY2FzdDxDb25zdGFudD4oUHRyKSkKKyAgICAgIGlmIChhdXRvICpJQyA9IGR5bl9jYXN0PENvbnN0YW50PihJZHgpKQorICAgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVJbkJvdW5kc0dldEVsZW1lbnRQdHIoVHksIFBDLCBJQyksIE5hbWUpOworICAgIHJldHVybiBJbnNlcnQoR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZUluQm91bmRzKFR5LCBQdHIsIElkeCksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUNvbnN0R0VQMV8zMihWYWx1ZSAqUHRyLCB1bnNpZ25lZCBJZHgwLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUNvbnN0R0VQMV8zMihudWxscHRyLCBQdHIsIElkeDAsIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUNvbnN0R0VQMV8zMihUeXBlICpUeSwgVmFsdWUgKlB0ciwgdW5zaWduZWQgSWR4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgVmFsdWUgKklkeCA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50MzJUeShDb250ZXh0KSwgSWR4MCk7CisKKyAgICBpZiAoYXV0byAqUEMgPSBkeW5fY2FzdDxDb25zdGFudD4oUHRyKSkKKyAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZUdldEVsZW1lbnRQdHIoVHksIFBDLCBJZHgpLCBOYW1lKTsKKworICAgIHJldHVybiBJbnNlcnQoR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShUeSwgUHRyLCBJZHgpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVDb25zdEluQm91bmRzR0VQMV8zMihUeXBlICpUeSwgVmFsdWUgKlB0ciwgdW5zaWduZWQgSWR4MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBWYWx1ZSAqSWR4ID0gQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCBJZHgwKTsKKworICAgIGlmIChhdXRvICpQQyA9IGR5bl9jYXN0PENvbnN0YW50PihQdHIpKQorICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlSW5Cb3VuZHNHZXRFbGVtZW50UHRyKFR5LCBQQywgSWR4KSwgTmFtZSk7CisKKyAgICByZXR1cm4gSW5zZXJ0KEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGVJbkJvdW5kcyhUeSwgUHRyLCBJZHgpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVDb25zdEdFUDJfMzIoVHlwZSAqVHksIFZhbHVlICpQdHIsIHVuc2lnbmVkIElkeDAsIHVuc2lnbmVkIElkeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIFZhbHVlICpJZHhzW10gPSB7CisgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksIElkeDApLAorICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCBJZHgxKQorICAgIH07CisKKyAgICBpZiAoYXV0byAqUEMgPSBkeW5fY2FzdDxDb25zdGFudD4oUHRyKSkKKyAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZUdldEVsZW1lbnRQdHIoVHksIFBDLCBJZHhzKSwgTmFtZSk7CisKKyAgICByZXR1cm4gSW5zZXJ0KEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGUoVHksIFB0ciwgSWR4cyksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUNvbnN0SW5Cb3VuZHNHRVAyXzMyKFR5cGUgKlR5LCBWYWx1ZSAqUHRyLCB1bnNpZ25lZCBJZHgwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSWR4MSwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIFZhbHVlICpJZHhzW10gPSB7CisgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksIElkeDApLAorICAgICAgQ29uc3RhbnRJbnQ6OmdldChUeXBlOjpnZXRJbnQzMlR5KENvbnRleHQpLCBJZHgxKQorICAgIH07CisKKyAgICBpZiAoYXV0byAqUEMgPSBkeW5fY2FzdDxDb25zdGFudD4oUHRyKSkKKyAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZUluQm91bmRzR2V0RWxlbWVudFB0cihUeSwgUEMsIElkeHMpLCBOYW1lKTsKKworICAgIHJldHVybiBJbnNlcnQoR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZUluQm91bmRzKFR5LCBQdHIsIElkeHMpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVDb25zdEdFUDFfNjQoVmFsdWUgKlB0ciwgdWludDY0X3QgSWR4MCwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIFZhbHVlICpJZHggPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoQ29udGV4dCksIElkeDApOworCisgICAgaWYgKGF1dG8gKlBDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFB0cikpCisgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVHZXRFbGVtZW50UHRyKG51bGxwdHIsIFBDLCBJZHgpLCBOYW1lKTsKKworICAgIHJldHVybiBJbnNlcnQoR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShudWxscHRyLCBQdHIsIElkeCksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUNvbnN0SW5Cb3VuZHNHRVAxXzY0KFZhbHVlICpQdHIsIHVpbnQ2NF90IElkeDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgVmFsdWUgKklkeCA9IENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShDb250ZXh0KSwgSWR4MCk7CisKKyAgICBpZiAoYXV0byAqUEMgPSBkeW5fY2FzdDxDb25zdGFudD4oUHRyKSkKKyAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZUluQm91bmRzR2V0RWxlbWVudFB0cihudWxscHRyLCBQQywgSWR4KSwgTmFtZSk7CisKKyAgICByZXR1cm4gSW5zZXJ0KEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGVJbkJvdW5kcyhudWxscHRyLCBQdHIsIElkeCksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUNvbnN0R0VQMl82NChWYWx1ZSAqUHRyLCB1aW50NjRfdCBJZHgwLCB1aW50NjRfdCBJZHgxLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgVmFsdWUgKklkeHNbXSA9IHsKKyAgICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShDb250ZXh0KSwgSWR4MCksCisgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoQ29udGV4dCksIElkeDEpCisgICAgfTsKKworICAgIGlmIChhdXRvICpQQyA9IGR5bl9jYXN0PENvbnN0YW50PihQdHIpKQorICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlR2V0RWxlbWVudFB0cihudWxscHRyLCBQQywgSWR4cyksIE5hbWUpOworCisgICAgcmV0dXJuIEluc2VydChHZXRFbGVtZW50UHRySW5zdDo6Q3JlYXRlKG51bGxwdHIsIFB0ciwgSWR4cyksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUNvbnN0SW5Cb3VuZHNHRVAyXzY0KFZhbHVlICpQdHIsIHVpbnQ2NF90IElkeDAsIHVpbnQ2NF90IElkeDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgVmFsdWUgKklkeHNbXSA9IHsKKyAgICAgIENvbnN0YW50SW50OjpnZXQoVHlwZTo6Z2V0SW50NjRUeShDb250ZXh0KSwgSWR4MCksCisgICAgICBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDY0VHkoQ29udGV4dCksIElkeDEpCisgICAgfTsKKworICAgIGlmIChhdXRvICpQQyA9IGR5bl9jYXN0PENvbnN0YW50PihQdHIpKQorICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlSW5Cb3VuZHNHZXRFbGVtZW50UHRyKG51bGxwdHIsIFBDLCBJZHhzKSwKKyAgICAgICAgICAgICAgICAgICAgTmFtZSk7CisKKyAgICByZXR1cm4gSW5zZXJ0KEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGVJbkJvdW5kcyhudWxscHRyLCBQdHIsIElkeHMpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVTdHJ1Y3RHRVAoVHlwZSAqVHksIFZhbHVlICpQdHIsIHVuc2lnbmVkIElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUNvbnN0SW5Cb3VuZHNHRVAyXzMyKFR5LCBQdHIsIDAsIElkeCwgTmFtZSk7CisgIH0KKworICAvLy8gXGJyaWVmIFNhbWUgYXMgQ3JlYXRlR2xvYmFsU3RyaW5nLCBidXQgcmV0dXJuIGEgcG9pbnRlciB3aXRoICJpOCoiIHR5cGUKKyAgLy8vIGluc3RlYWQgb2YgYSBwb2ludGVyIHRvIGFycmF5IG9mIGk4LgorICBWYWx1ZSAqQ3JlYXRlR2xvYmFsU3RyaW5nUHRyKFN0cmluZ1JlZiBTdHIsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQWRkcmVzc1NwYWNlID0gMCkgeworICAgIEdsb2JhbFZhcmlhYmxlICpndiA9IENyZWF0ZUdsb2JhbFN0cmluZyhTdHIsIE5hbWUsIEFkZHJlc3NTcGFjZSk7CisgICAgVmFsdWUgKnplcm8gPSBDb25zdGFudEludDo6Z2V0KFR5cGU6OmdldEludDMyVHkoQ29udGV4dCksIDApOworICAgIFZhbHVlICpBcmdzW10gPSB7IHplcm8sIHplcm8gfTsKKyAgICByZXR1cm4gQ3JlYXRlSW5Cb3VuZHNHRVAoZ3YtPmdldFZhbHVlVHlwZSgpLCBndiwgQXJncywgTmFtZSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSW5zdHJ1Y3Rpb24gY3JlYXRpb24gbWV0aG9kczogQ2FzdC9Db252ZXJzaW9uIE9wZXJhdG9ycworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBWYWx1ZSAqQ3JlYXRlVHJ1bmMoVmFsdWUgKlYsIFR5cGUgKkRlc3RUeSwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpUcnVuYywgViwgRGVzdFR5LCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVaRXh0KFZhbHVlICpWLCBUeXBlICpEZXN0VHksIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6WkV4dCwgViwgRGVzdFR5LCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVTRXh0KFZhbHVlICpWLCBUeXBlICpEZXN0VHksIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6U0V4dCwgViwgRGVzdFR5LCBOYW1lKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgWkV4dCBvciBUcnVuYyBmcm9tIHRoZSBpbnRlZ2VyIHZhbHVlIFYgdG8gRGVzdFR5LiBSZXR1cm4KKyAgLy8vIHRoZSB2YWx1ZSB1bnRvdWNoZWQgaWYgdGhlIHR5cGUgb2YgViBpcyBhbHJlYWR5IERlc3RUeS4KKyAgVmFsdWUgKkNyZWF0ZVpFeHRPclRydW5jKFZhbHVlICpWLCBUeXBlICpEZXN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgYXNzZXJ0KFYtPmdldFR5cGUoKS0+aXNJbnRPckludFZlY3RvclR5KCkgJiYKKyAgICAgICAgICAgRGVzdFR5LT5pc0ludE9ySW50VmVjdG9yVHkoKSAmJgorICAgICAgICAgICAiQ2FuIG9ubHkgemVybyBleHRlbmQvdHJ1bmNhdGUgaW50ZWdlcnMhIik7CisgICAgVHlwZSAqVlR5ID0gVi0+Z2V0VHlwZSgpOworICAgIGlmIChWVHktPmdldFNjYWxhclNpemVJbkJpdHMoKSA8IERlc3RUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpKQorICAgICAgcmV0dXJuIENyZWF0ZVpFeHQoViwgRGVzdFR5LCBOYW1lKTsKKyAgICBpZiAoVlR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCkgPiBEZXN0VHktPmdldFNjYWxhclNpemVJbkJpdHMoKSkKKyAgICAgIHJldHVybiBDcmVhdGVUcnVuYyhWLCBEZXN0VHksIE5hbWUpOworICAgIHJldHVybiBWOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBTRXh0IG9yIFRydW5jIGZyb20gdGhlIGludGVnZXIgdmFsdWUgViB0byBEZXN0VHkuIFJldHVybgorICAvLy8gdGhlIHZhbHVlIHVudG91Y2hlZCBpZiB0aGUgdHlwZSBvZiBWIGlzIGFscmVhZHkgRGVzdFR5LgorICBWYWx1ZSAqQ3JlYXRlU0V4dE9yVHJ1bmMoVmFsdWUgKlYsIFR5cGUgKkRlc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBhc3NlcnQoVi0+Z2V0VHlwZSgpLT5pc0ludE9ySW50VmVjdG9yVHkoKSAmJgorICAgICAgICAgICBEZXN0VHktPmlzSW50T3JJbnRWZWN0b3JUeSgpICYmCisgICAgICAgICAgICJDYW4gb25seSBzaWduIGV4dGVuZC90cnVuY2F0ZSBpbnRlZ2VycyEiKTsKKyAgICBUeXBlICpWVHkgPSBWLT5nZXRUeXBlKCk7CisgICAgaWYgKFZUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpIDwgRGVzdFR5LT5nZXRTY2FsYXJTaXplSW5CaXRzKCkpCisgICAgICByZXR1cm4gQ3JlYXRlU0V4dChWLCBEZXN0VHksIE5hbWUpOworICAgIGlmIChWVHktPmdldFNjYWxhclNpemVJbkJpdHMoKSA+IERlc3RUeS0+Z2V0U2NhbGFyU2l6ZUluQml0cygpKQorICAgICAgcmV0dXJuIENyZWF0ZVRydW5jKFYsIERlc3RUeSwgTmFtZSk7CisgICAgcmV0dXJuIFY7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRlBUb1VJKFZhbHVlICpWLCBUeXBlICpEZXN0VHksIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpGUFRvVUksIFYsIERlc3RUeSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRlBUb1NJKFZhbHVlICpWLCBUeXBlICpEZXN0VHksIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpGUFRvU0ksIFYsIERlc3RUeSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlVUlUb0ZQKFZhbHVlICpWLCBUeXBlICpEZXN0VHksIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpVSVRvRlAsIFYsIERlc3RUeSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlU0lUb0ZQKFZhbHVlICpWLCBUeXBlICpEZXN0VHksIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpTSVRvRlAsIFYsIERlc3RUeSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRlBUcnVuYyhWYWx1ZSAqViwgVHlwZSAqRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUNhc3QoSW5zdHJ1Y3Rpb246OkZQVHJ1bmMsIFYsIERlc3RUeSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRlBFeHQoVmFsdWUgKlYsIFR5cGUgKkRlc3RUeSwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpGUEV4dCwgViwgRGVzdFR5LCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVQdHJUb0ludChWYWx1ZSAqViwgVHlwZSAqRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpQdHJUb0ludCwgViwgRGVzdFR5LCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVJbnRUb1B0cihWYWx1ZSAqViwgVHlwZSAqRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpJbnRUb1B0ciwgViwgRGVzdFR5LCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVCaXRDYXN0KFZhbHVlICpWLCBUeXBlICpEZXN0VHksCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6Qml0Q2FzdCwgViwgRGVzdFR5LCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVBZGRyU3BhY2VDYXN0KFZhbHVlICpWLCBUeXBlICpEZXN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6QWRkclNwYWNlQ2FzdCwgViwgRGVzdFR5LCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVaRXh0T3JCaXRDYXN0KFZhbHVlICpWLCBUeXBlICpEZXN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBpZiAoVi0+Z2V0VHlwZSgpID09IERlc3RUeSkKKyAgICAgIHJldHVybiBWOworICAgIGlmIChhdXRvICpWQyA9IGR5bl9jYXN0PENvbnN0YW50PihWKSkKKyAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZVpFeHRPckJpdENhc3QoVkMsIERlc3RUeSksIE5hbWUpOworICAgIHJldHVybiBJbnNlcnQoQ2FzdEluc3Q6OkNyZWF0ZVpFeHRPckJpdENhc3QoViwgRGVzdFR5KSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlU0V4dE9yQml0Q2FzdChWYWx1ZSAqViwgVHlwZSAqRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKFYtPmdldFR5cGUoKSA9PSBEZXN0VHkpCisgICAgICByZXR1cm4gVjsKKyAgICBpZiAoYXV0byAqVkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpCisgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVTRXh0T3JCaXRDYXN0KFZDLCBEZXN0VHkpLCBOYW1lKTsKKyAgICByZXR1cm4gSW5zZXJ0KENhc3RJbnN0OjpDcmVhdGVTRXh0T3JCaXRDYXN0KFYsIERlc3RUeSksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZVRydW5jT3JCaXRDYXN0KFZhbHVlICpWLCBUeXBlICpEZXN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKFYtPmdldFR5cGUoKSA9PSBEZXN0VHkpCisgICAgICByZXR1cm4gVjsKKyAgICBpZiAoYXV0byAqVkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpCisgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVUcnVuY09yQml0Q2FzdChWQywgRGVzdFR5KSwgTmFtZSk7CisgICAgcmV0dXJuIEluc2VydChDYXN0SW5zdDo6Q3JlYXRlVHJ1bmNPckJpdENhc3QoViwgRGVzdFR5KSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6Q2FzdE9wcyBPcCwgVmFsdWUgKlYsIFR5cGUgKkRlc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGlmIChWLT5nZXRUeXBlKCkgPT0gRGVzdFR5KQorICAgICAgcmV0dXJuIFY7CisgICAgaWYgKGF1dG8gKlZDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKQorICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlQ2FzdChPcCwgVkMsIERlc3RUeSksIE5hbWUpOworICAgIHJldHVybiBJbnNlcnQoQ2FzdEluc3Q6OkNyZWF0ZShPcCwgViwgRGVzdFR5KSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlUG9pbnRlckNhc3QoVmFsdWUgKlYsIFR5cGUgKkRlc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBpZiAoVi0+Z2V0VHlwZSgpID09IERlc3RUeSkKKyAgICAgIHJldHVybiBWOworICAgIGlmIChhdXRvICpWQyA9IGR5bl9jYXN0PENvbnN0YW50PihWKSkKKyAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZVBvaW50ZXJDYXN0KFZDLCBEZXN0VHkpLCBOYW1lKTsKKyAgICByZXR1cm4gSW5zZXJ0KENhc3RJbnN0OjpDcmVhdGVQb2ludGVyQ2FzdChWLCBEZXN0VHkpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVQb2ludGVyQml0Q2FzdE9yQWRkclNwYWNlQ2FzdChWYWx1ZSAqViwgVHlwZSAqRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGlmIChWLT5nZXRUeXBlKCkgPT0gRGVzdFR5KQorICAgICAgcmV0dXJuIFY7CisKKyAgICBpZiAoYXV0byAqVkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpIHsKKyAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZVBvaW50ZXJCaXRDYXN0T3JBZGRyU3BhY2VDYXN0KFZDLCBEZXN0VHkpLAorICAgICAgICAgICAgICAgICAgICBOYW1lKTsKKyAgICB9CisKKyAgICByZXR1cm4gSW5zZXJ0KENhc3RJbnN0OjpDcmVhdGVQb2ludGVyQml0Q2FzdE9yQWRkclNwYWNlQ2FzdChWLCBEZXN0VHkpLAorICAgICAgICAgICAgICAgICAgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlSW50Q2FzdChWYWx1ZSAqViwgVHlwZSAqRGVzdFR5LCBib29sIGlzU2lnbmVkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKFYtPmdldFR5cGUoKSA9PSBEZXN0VHkpCisgICAgICByZXR1cm4gVjsKKyAgICBpZiAoYXV0byAqVkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpCisgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVJbnRDYXN0KFZDLCBEZXN0VHksIGlzU2lnbmVkKSwgTmFtZSk7CisgICAgcmV0dXJuIEluc2VydChDYXN0SW5zdDo6Q3JlYXRlSW50ZWdlckNhc3QoViwgRGVzdFR5LCBpc1NpZ25lZCksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUJpdE9yUG9pbnRlckNhc3QoVmFsdWUgKlYsIFR5cGUgKkRlc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGlmIChWLT5nZXRUeXBlKCkgPT0gRGVzdFR5KQorICAgICAgcmV0dXJuIFY7CisgICAgaWYgKFYtPmdldFR5cGUoKS0+aXNQdHJPclB0clZlY3RvclR5KCkgJiYgRGVzdFR5LT5pc0ludE9ySW50VmVjdG9yVHkoKSkKKyAgICAgIHJldHVybiBDcmVhdGVQdHJUb0ludChWLCBEZXN0VHksIE5hbWUpOworICAgIGlmIChWLT5nZXRUeXBlKCktPmlzSW50T3JJbnRWZWN0b3JUeSgpICYmIERlc3RUeS0+aXNQdHJPclB0clZlY3RvclR5KCkpCisgICAgICByZXR1cm4gQ3JlYXRlSW50VG9QdHIoViwgRGVzdFR5LCBOYW1lKTsKKworICAgIHJldHVybiBDcmVhdGVCaXRDYXN0KFYsIERlc3RUeSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRlBDYXN0KFZhbHVlICpWLCBUeXBlICpEZXN0VHksIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBpZiAoVi0+Z2V0VHlwZSgpID09IERlc3RUeSkKKyAgICAgIHJldHVybiBWOworICAgIGlmIChhdXRvICpWQyA9IGR5bl9jYXN0PENvbnN0YW50PihWKSkKKyAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZUZQQ2FzdChWQywgRGVzdFR5KSwgTmFtZSk7CisgICAgcmV0dXJuIEluc2VydChDYXN0SW5zdDo6Q3JlYXRlRlBDYXN0KFYsIERlc3RUeSksIE5hbWUpOworICB9CisKKyAgLy8gXGJyaWVmIFByb3ZpZGVkIHRvIHJlc29sdmUgJ0NyZWF0ZUludENhc3QoUHRyLCBQdHIsICIuLi4iKScsIGdpdmluZyBhCisgIC8vIGNvbXBpbGUgdGltZSBlcnJvciwgaW5zdGVhZCBvZiBjb252ZXJ0aW5nIHRoZSBzdHJpbmcgdG8gYm9vbCBmb3IgdGhlCisgIC8vIGlzU2lnbmVkIHBhcmFtZXRlci4KKyAgVmFsdWUgKkNyZWF0ZUludENhc3QoVmFsdWUgKiwgVHlwZSAqLCBjb25zdCBjaGFyICopID0gZGVsZXRlOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJbnN0cnVjdGlvbiBjcmVhdGlvbiBtZXRob2RzOiBDb21wYXJlIEluc3RydWN0aW9ucworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBWYWx1ZSAqQ3JlYXRlSUNtcEVRKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlSUNtcChJQ21wSW5zdDo6SUNNUF9FUSwgTEhTLCBSSFMsIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUlDbXBORShWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUlDbXAoSUNtcEluc3Q6OklDTVBfTkUsIExIUywgUkhTLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVJQ21wVUdUKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlSUNtcChJQ21wSW5zdDo6SUNNUF9VR1QsIExIUywgUkhTLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVJQ21wVUdFKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlSUNtcChJQ21wSW5zdDo6SUNNUF9VR0UsIExIUywgUkhTLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVJQ21wVUxUKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlSUNtcChJQ21wSW5zdDo6SUNNUF9VTFQsIExIUywgUkhTLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVJQ21wVUxFKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlSUNtcChJQ21wSW5zdDo6SUNNUF9VTEUsIExIUywgUkhTLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVJQ21wU0dUKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlSUNtcChJQ21wSW5zdDo6SUNNUF9TR1QsIExIUywgUkhTLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVJQ21wU0dFKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlSUNtcChJQ21wSW5zdDo6SUNNUF9TR0UsIExIUywgUkhTLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVJQ21wU0xUKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlSUNtcChJQ21wSW5zdDo6SUNNUF9TTFQsIExIUywgUkhTLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVJQ21wU0xFKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlSUNtcChJQ21wSW5zdDo6SUNNUF9TTEUsIExIUywgUkhTLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVGQ21wT0VRKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqRlBNYXRoVGFnID0gbnVsbHB0cikgeworICAgIHJldHVybiBDcmVhdGVGQ21wKEZDbXBJbnN0OjpGQ01QX09FUSwgTEhTLCBSSFMsIE5hbWUsIEZQTWF0aFRhZyk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRkNtcE9HVChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gQ3JlYXRlRkNtcChGQ21wSW5zdDo6RkNNUF9PR1QsIExIUywgUkhTLCBOYW1lLCBGUE1hdGhUYWcpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUZDbXBPR0UoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpGUE1hdGhUYWcgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIENyZWF0ZUZDbXAoRkNtcEluc3Q6OkZDTVBfT0dFLCBMSFMsIFJIUywgTmFtZSwgRlBNYXRoVGFnKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVGQ21wT0xUKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqRlBNYXRoVGFnID0gbnVsbHB0cikgeworICAgIHJldHVybiBDcmVhdGVGQ21wKEZDbXBJbnN0OjpGQ01QX09MVCwgTEhTLCBSSFMsIE5hbWUsIEZQTWF0aFRhZyk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRkNtcE9MRShWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gQ3JlYXRlRkNtcChGQ21wSW5zdDo6RkNNUF9PTEUsIExIUywgUkhTLCBOYW1lLCBGUE1hdGhUYWcpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUZDbXBPTkUoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpGUE1hdGhUYWcgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIENyZWF0ZUZDbXAoRkNtcEluc3Q6OkZDTVBfT05FLCBMSFMsIFJIUywgTmFtZSwgRlBNYXRoVGFnKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVGQ21wT1JEKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqRlBNYXRoVGFnID0gbnVsbHB0cikgeworICAgIHJldHVybiBDcmVhdGVGQ21wKEZDbXBJbnN0OjpGQ01QX09SRCwgTEhTLCBSSFMsIE5hbWUsIEZQTWF0aFRhZyk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRkNtcFVOTyhWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gQ3JlYXRlRkNtcChGQ21wSW5zdDo6RkNNUF9VTk8sIExIUywgUkhTLCBOYW1lLCBGUE1hdGhUYWcpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUZDbXBVRVEoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpGUE1hdGhUYWcgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIENyZWF0ZUZDbXAoRkNtcEluc3Q6OkZDTVBfVUVRLCBMSFMsIFJIUywgTmFtZSwgRlBNYXRoVGFnKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVGQ21wVUdUKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqRlBNYXRoVGFnID0gbnVsbHB0cikgeworICAgIHJldHVybiBDcmVhdGVGQ21wKEZDbXBJbnN0OjpGQ01QX1VHVCwgTEhTLCBSSFMsIE5hbWUsIEZQTWF0aFRhZyk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRkNtcFVHRShWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gQ3JlYXRlRkNtcChGQ21wSW5zdDo6RkNNUF9VR0UsIExIUywgUkhTLCBOYW1lLCBGUE1hdGhUYWcpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUZDbXBVTFQoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpGUE1hdGhUYWcgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIENyZWF0ZUZDbXAoRkNtcEluc3Q6OkZDTVBfVUxULCBMSFMsIFJIUywgTmFtZSwgRlBNYXRoVGFnKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVGQ21wVUxFKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqRlBNYXRoVGFnID0gbnVsbHB0cikgeworICAgIHJldHVybiBDcmVhdGVGQ21wKEZDbXBJbnN0OjpGQ01QX1VMRSwgTEhTLCBSSFMsIE5hbWUsIEZQTWF0aFRhZyk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRkNtcFVORShWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gQ3JlYXRlRkNtcChGQ21wSW5zdDo6RkNNUF9VTkUsIExIUywgUkhTLCBOYW1lLCBGUE1hdGhUYWcpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUlDbXAoQ21wSW5zdDo6UHJlZGljYXRlIFAsIFZhbHVlICpMSFMsIFZhbHVlICpSSFMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBpZiAoYXV0byAqTEMgPSBkeW5fY2FzdDxDb25zdGFudD4oTEhTKSkKKyAgICAgIGlmIChhdXRvICpSQyA9IGR5bl9jYXN0PENvbnN0YW50PihSSFMpKQorICAgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVJQ21wKFAsIExDLCBSQyksIE5hbWUpOworICAgIHJldHVybiBJbnNlcnQobmV3IElDbXBJbnN0KFAsIExIUywgUkhTKSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRkNtcChDbXBJbnN0OjpQcmVkaWNhdGUgUCwgVmFsdWUgKkxIUywgVmFsdWUgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwgTUROb2RlICpGUE1hdGhUYWcgPSBudWxscHRyKSB7CisgICAgaWYgKGF1dG8gKkxDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICBpZiAoYXV0byAqUkMgPSBkeW5fY2FzdDxDb25zdGFudD4oUkhTKSkKKyAgICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlRkNtcChQLCBMQywgUkMpLCBOYW1lKTsKKyAgICByZXR1cm4gSW5zZXJ0KHNldEZQQXR0cnMobmV3IEZDbXBJbnN0KFAsIExIUywgUkhTKSwgRlBNYXRoVGFnLCBGTUYpLCBOYW1lKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJbnN0cnVjdGlvbiBjcmVhdGlvbiBtZXRob2RzOiBPdGhlciBJbnN0cnVjdGlvbnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgUEhJTm9kZSAqQ3JlYXRlUEhJKFR5cGUgKlR5LCB1bnNpZ25lZCBOdW1SZXNlcnZlZFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gSW5zZXJ0KFBISU5vZGU6OkNyZWF0ZShUeSwgTnVtUmVzZXJ2ZWRWYWx1ZXMpLCBOYW1lKTsKKyAgfQorCisgIENhbGxJbnN0ICpDcmVhdGVDYWxsKFZhbHVlICpDYWxsZWUsIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiLCBNRE5vZGUgKkZQTWF0aFRhZyA9IG51bGxwdHIpIHsKKyAgICBhdXRvICpQVHkgPSBjYXN0PFBvaW50ZXJUeXBlPihDYWxsZWUtPmdldFR5cGUoKSk7CisgICAgYXV0byAqRlR5ID0gY2FzdDxGdW5jdGlvblR5cGU+KFBUeS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgcmV0dXJuIENyZWF0ZUNhbGwoRlR5LCBDYWxsZWUsIEFyZ3MsIE5hbWUsIEZQTWF0aFRhZyk7CisgIH0KKworICBDYWxsSW5zdCAqQ3JlYXRlQ2FsbChGdW5jdGlvblR5cGUgKkZUeSwgVmFsdWUgKkNhbGxlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpGUE1hdGhUYWcgPSBudWxscHRyKSB7CisgICAgQ2FsbEluc3QgKkNJID0gQ2FsbEluc3Q6OkNyZWF0ZShGVHksIENhbGxlZSwgQXJncywgRGVmYXVsdE9wZXJhbmRCdW5kbGVzKTsKKyAgICBpZiAoaXNhPEZQTWF0aE9wZXJhdG9yPihDSSkpCisgICAgICBDSSA9IGNhc3Q8Q2FsbEluc3Q+KHNldEZQQXR0cnMoQ0ksIEZQTWF0aFRhZywgRk1GKSk7CisgICAgcmV0dXJuIEluc2VydChDSSwgTmFtZSk7CisgIH0KKworICBDYWxsSW5zdCAqQ3JlYXRlQ2FsbChWYWx1ZSAqQ2FsbGVlLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBPcEJ1bmRsZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsIE1ETm9kZSAqRlBNYXRoVGFnID0gbnVsbHB0cikgeworICAgIENhbGxJbnN0ICpDSSA9IENhbGxJbnN0OjpDcmVhdGUoQ2FsbGVlLCBBcmdzLCBPcEJ1bmRsZXMpOworICAgIGlmIChpc2E8RlBNYXRoT3BlcmF0b3I+KENJKSkKKyAgICAgIENJID0gY2FzdDxDYWxsSW5zdD4oc2V0RlBBdHRycyhDSSwgRlBNYXRoVGFnLCBGTUYpKTsKKyAgICByZXR1cm4gSW5zZXJ0KENJLCBOYW1lKTsKKyAgfQorCisgIENhbGxJbnN0ICpDcmVhdGVDYWxsKEZ1bmN0aW9uICpDYWxsZWUsIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsIE1ETm9kZSAqRlBNYXRoVGFnID0gbnVsbHB0cikgeworICAgIHJldHVybiBDcmVhdGVDYWxsKENhbGxlZS0+Z2V0RnVuY3Rpb25UeXBlKCksIENhbGxlZSwgQXJncywgTmFtZSwgRlBNYXRoVGFnKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVTZWxlY3QoVmFsdWUgKkMsIFZhbHVlICpUcnVlLCBWYWx1ZSAqRmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwgSW5zdHJ1Y3Rpb24gKk1ERnJvbSA9IG51bGxwdHIpIHsKKyAgICBpZiAoYXV0byAqQ0MgPSBkeW5fY2FzdDxDb25zdGFudD4oQykpCisgICAgICBpZiAoYXV0byAqVEMgPSBkeW5fY2FzdDxDb25zdGFudD4oVHJ1ZSkpCisgICAgICAgIGlmIChhdXRvICpGQyA9IGR5bl9jYXN0PENvbnN0YW50PihGYWxzZSkpCisgICAgICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlU2VsZWN0KENDLCBUQywgRkMpLCBOYW1lKTsKKworICAgIFNlbGVjdEluc3QgKlNlbCA9IFNlbGVjdEluc3Q6OkNyZWF0ZShDLCBUcnVlLCBGYWxzZSk7CisgICAgaWYgKE1ERnJvbSkgeworICAgICAgTUROb2RlICpQcm9mID0gTURGcm9tLT5nZXRNZXRhZGF0YShMTFZNQ29udGV4dDo6TURfcHJvZik7CisgICAgICBNRE5vZGUgKlVucHJlZCA9IE1ERnJvbS0+Z2V0TWV0YWRhdGEoTExWTUNvbnRleHQ6Ok1EX3VucHJlZGljdGFibGUpOworICAgICAgU2VsID0gYWRkQnJhbmNoTWV0YWRhdGEoU2VsLCBQcm9mLCBVbnByZWQpOworICAgIH0KKyAgICByZXR1cm4gSW5zZXJ0KFNlbCwgTmFtZSk7CisgIH0KKworICBWQUFyZ0luc3QgKkNyZWF0ZVZBQXJnKFZhbHVlICpMaXN0LCBUeXBlICpUeSwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBJbnNlcnQobmV3IFZBQXJnSW5zdChMaXN0LCBUeSksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUV4dHJhY3RFbGVtZW50KFZhbHVlICpWZWMsIFZhbHVlICpJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKGF1dG8gKlZDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFZlYykpCisgICAgICBpZiAoYXV0byAqSUMgPSBkeW5fY2FzdDxDb25zdGFudD4oSWR4KSkKKyAgICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlRXh0cmFjdEVsZW1lbnQoVkMsIElDKSwgTmFtZSk7CisgICAgcmV0dXJuIEluc2VydChFeHRyYWN0RWxlbWVudEluc3Q6OkNyZWF0ZShWZWMsIElkeCksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUV4dHJhY3RFbGVtZW50KFZhbHVlICpWZWMsIHVpbnQ2NF90IElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlRXh0cmFjdEVsZW1lbnQoVmVjLCBnZXRJbnQ2NChJZHgpLCBOYW1lKTsKKyAgfQorCisgIFZhbHVlICpDcmVhdGVJbnNlcnRFbGVtZW50KFZhbHVlICpWZWMsIFZhbHVlICpOZXdFbHQsIFZhbHVlICpJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBpZiAoYXV0byAqVkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVmVjKSkKKyAgICAgIGlmIChhdXRvICpOQyA9IGR5bl9jYXN0PENvbnN0YW50PihOZXdFbHQpKQorICAgICAgICBpZiAoYXV0byAqSUMgPSBkeW5fY2FzdDxDb25zdGFudD4oSWR4KSkKKyAgICAgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVJbnNlcnRFbGVtZW50KFZDLCBOQywgSUMpLCBOYW1lKTsKKyAgICByZXR1cm4gSW5zZXJ0KEluc2VydEVsZW1lbnRJbnN0OjpDcmVhdGUoVmVjLCBOZXdFbHQsIElkeCksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUluc2VydEVsZW1lbnQoVmFsdWUgKlZlYywgVmFsdWUgKk5ld0VsdCwgdWludDY0X3QgSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIENyZWF0ZUluc2VydEVsZW1lbnQoVmVjLCBOZXdFbHQsIGdldEludDY0KElkeCksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZVNodWZmbGVWZWN0b3IoVmFsdWUgKlYxLCBWYWx1ZSAqVjIsIFZhbHVlICpNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgaWYgKGF1dG8gKlYxQyA9IGR5bl9jYXN0PENvbnN0YW50PihWMSkpCisgICAgICBpZiAoYXV0byAqVjJDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYyKSkKKyAgICAgICAgaWYgKGF1dG8gKk1DID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KE1hc2spKQorICAgICAgICAgIHJldHVybiBJbnNlcnQoRm9sZGVyLkNyZWF0ZVNodWZmbGVWZWN0b3IoVjFDLCBWMkMsIE1DKSwgTmFtZSk7CisgICAgcmV0dXJuIEluc2VydChuZXcgU2h1ZmZsZVZlY3Rvckluc3QoVjEsIFYyLCBNYXNrKSwgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlU2h1ZmZsZVZlY3RvcihWYWx1ZSAqVjEsIFZhbHVlICpWMiwgQXJyYXlSZWY8dWludDMyX3Q+IEludE1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBWYWx1ZSAqTWFzayA9IENvbnN0YW50RGF0YVZlY3Rvcjo6Z2V0KENvbnRleHQsIEludE1hc2spOworICAgIHJldHVybiBDcmVhdGVTaHVmZmxlVmVjdG9yKFYxLCBWMiwgTWFzaywgTmFtZSk7CisgIH0KKworICBWYWx1ZSAqQ3JlYXRlRXh0cmFjdFZhbHVlKFZhbHVlICpBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IElkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGlmIChhdXRvICpBZ2dDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KEFnZykpCisgICAgICByZXR1cm4gSW5zZXJ0KEZvbGRlci5DcmVhdGVFeHRyYWN0VmFsdWUoQWdnQywgSWR4cyksIE5hbWUpOworICAgIHJldHVybiBJbnNlcnQoRXh0cmFjdFZhbHVlSW5zdDo6Q3JlYXRlKEFnZywgSWR4cyksIE5hbWUpOworICB9CisKKyAgVmFsdWUgKkNyZWF0ZUluc2VydFZhbHVlKFZhbHVlICpBZ2csIFZhbHVlICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gSWR4cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBpZiAoYXV0byAqQWdnQyA9IGR5bl9jYXN0PENvbnN0YW50PihBZ2cpKQorICAgICAgaWYgKGF1dG8gKlZhbEMgPSBkeW5fY2FzdDxDb25zdGFudD4oVmFsKSkKKyAgICAgICAgcmV0dXJuIEluc2VydChGb2xkZXIuQ3JlYXRlSW5zZXJ0VmFsdWUoQWdnQywgVmFsQywgSWR4cyksIE5hbWUpOworICAgIHJldHVybiBJbnNlcnQoSW5zZXJ0VmFsdWVJbnN0OjpDcmVhdGUoQWdnLCBWYWwsIElkeHMpLCBOYW1lKTsKKyAgfQorCisgIExhbmRpbmdQYWRJbnN0ICpDcmVhdGVMYW5kaW5nUGFkKFR5cGUgKlR5LCB1bnNpZ25lZCBOdW1DbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgcmV0dXJuIEluc2VydChMYW5kaW5nUGFkSW5zdDo6Q3JlYXRlKFR5LCBOdW1DbGF1c2VzKSwgTmFtZSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gVXRpbGl0eSBjcmVhdGlvbiBtZXRob2RzCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBcYnJpZWYgUmV0dXJuIGFuIGkxIHZhbHVlIHRlc3RpbmcgaWYgXHAgQXJnIGlzIG51bGwuCisgIFZhbHVlICpDcmVhdGVJc051bGwoVmFsdWUgKkFyZywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVJQ21wRVEoQXJnLCBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEFyZy0+Z2V0VHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYW4gaTEgdmFsdWUgdGVzdGluZyBpZiBccCBBcmcgaXMgbm90IG51bGwuCisgIFZhbHVlICpDcmVhdGVJc05vdE51bGwoVmFsdWUgKkFyZywgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIHJldHVybiBDcmVhdGVJQ21wTkUoQXJnLCBDb25zdGFudDo6Z2V0TnVsbFZhbHVlKEFyZy0+Z2V0VHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGk2NCBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHBvaW50ZXIgdmFsdWVzLCBkaXZpZGluZyBvdXQKKyAgLy8vIHRoZSBzaXplIG9mIHRoZSBwb2ludGVkLXRvIG9iamVjdHMuCisgIC8vLworICAvLy8gVGhpcyBpcyBpbnRlbmRlZCB0byBpbXBsZW1lbnQgQy1zdHlsZSBwb2ludGVyIHN1YnRyYWN0aW9uLiBBcyBzdWNoLCB0aGUKKyAgLy8vIHBvaW50ZXJzIG11c3QgYmUgYXBwcm9wcmlhdGVseSBhbGlnbmVkIGZvciB0aGVpciBlbGVtZW50IHR5cGVzIGFuZAorICAvLy8gcG9pbnRpbmcgaW50byB0aGUgc2FtZSBvYmplY3QuCisgIFZhbHVlICpDcmVhdGVQdHJEaWZmKFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBhc3NlcnQoTEhTLT5nZXRUeXBlKCkgPT0gUkhTLT5nZXRUeXBlKCkgJiYKKyAgICAgICAgICAgIlBvaW50ZXIgc3VidHJhY3Rpb24gb3BlcmFuZCB0eXBlcyBtdXN0IG1hdGNoISIpOworICAgIGF1dG8gKkFyZ1R5cGUgPSBjYXN0PFBvaW50ZXJUeXBlPihMSFMtPmdldFR5cGUoKSk7CisgICAgVmFsdWUgKkxIU19pbnQgPSBDcmVhdGVQdHJUb0ludChMSFMsIFR5cGU6OmdldEludDY0VHkoQ29udGV4dCkpOworICAgIFZhbHVlICpSSFNfaW50ID0gQ3JlYXRlUHRyVG9JbnQoUkhTLCBUeXBlOjpnZXRJbnQ2NFR5KENvbnRleHQpKTsKKyAgICBWYWx1ZSAqRGlmZmVyZW5jZSA9IENyZWF0ZVN1YihMSFNfaW50LCBSSFNfaW50KTsKKyAgICByZXR1cm4gQ3JlYXRlRXhhY3RTRGl2KERpZmZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEV4cHI6OmdldFNpemVPZihBcmdUeXBlLT5nZXRFbGVtZW50VHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE5hbWUpOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYW4gaW52YXJpYW50Lmdyb3VwLmJhcnJpZXIgaW50cmluc2ljIGNhbGwsIHRoYXQgc3RvcHMKKyAgLy8vIG9wdGltaXplciB0byBwcm9wYWdhdGUgZXF1YWxpdHkgdXNpbmcgaW52YXJpYW50Lmdyb3VwIG1ldGFkYXRhLgorICAvLy8gSWYgUHRyIHR5cGUgaXMgZGlmZmVyZW50IGZyb20gcG9pbnRlciB0byBpOCwgaXQncyBjYXN0ZWQgdG8gcG9pbnRlciB0byBpOAorICAvLy8gaW4gdGhlIHNhbWUgYWRkcmVzcyBzcGFjZSBiZWZvcmUgY2FsbCBhbmQgY2FzdGVkIGJhY2sgdG8gUHRyIHR5cGUgYWZ0ZXIKKyAgLy8vIGNhbGwuCisgIFZhbHVlICpDcmVhdGVJbnZhcmlhbnRHcm91cEJhcnJpZXIoVmFsdWUgKlB0cikgeworICAgIGFzc2VydChpc2E8UG9pbnRlclR5cGU+KFB0ci0+Z2V0VHlwZSgpKSAmJgorICAgICAgICAgICAiaW52YXJpYW50Lmdyb3VwLmJhcnJpZXIgb25seSBhcHBsaWVzIHRvIHBvaW50ZXJzLiIpOworICAgIGF1dG8gKlB0clR5cGUgPSBQdHItPmdldFR5cGUoKTsKKyAgICBhdXRvICpJbnQ4UHRyVHkgPSBnZXRJbnQ4UHRyVHkoUHRyVHlwZS0+Z2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpKTsKKyAgICBpZiAoUHRyVHlwZSAhPSBJbnQ4UHRyVHkpCisgICAgICBQdHIgPSBDcmVhdGVCaXRDYXN0KFB0ciwgSW50OFB0clR5KTsKKyAgICBNb2R1bGUgKk0gPSBCQi0+Z2V0UGFyZW50KCktPmdldFBhcmVudCgpOworICAgIEZ1bmN0aW9uICpGbkludmFyaWFudEdyb3VwQmFycmllciA9IEludHJpbnNpYzo6Z2V0RGVjbGFyYXRpb24oCisgICAgICAgIE0sIEludHJpbnNpYzo6aW52YXJpYW50X2dyb3VwX2JhcnJpZXIsIHtJbnQ4UHRyVHl9KTsKKworICAgIGFzc2VydChGbkludmFyaWFudEdyb3VwQmFycmllci0+Z2V0UmV0dXJuVHlwZSgpID09IEludDhQdHJUeSAmJgorICAgICAgICAgICBGbkludmFyaWFudEdyb3VwQmFycmllci0+Z2V0RnVuY3Rpb25UeXBlKCktPmdldFBhcmFtVHlwZSgwKSA9PQorICAgICAgICAgICAgICAgSW50OFB0clR5ICYmCisgICAgICAgICAgICJJbnZhcmlhbnRHcm91cEJhcnJpZXIgc2hvdWxkIHRha2UgYW5kIHJldHVybiB0aGUgc2FtZSB0eXBlIik7CisKKyAgICBDYWxsSW5zdCAqRm4gPSBDcmVhdGVDYWxsKEZuSW52YXJpYW50R3JvdXBCYXJyaWVyLCB7UHRyfSk7CisKKyAgICBpZiAoUHRyVHlwZSAhPSBJbnQ4UHRyVHkpCisgICAgICByZXR1cm4gQ3JlYXRlQml0Q2FzdChGbiwgUHRyVHlwZSk7CisgICAgcmV0dXJuIEZuOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSB2ZWN0b3IgdmFsdWUgdGhhdCBjb250YWlucyBcYXJnIFYgYnJvYWRjYXN0ZWQgdG8gXHAKKyAgLy8vIE51bUVsdHMgZWxlbWVudHMuCisgIFZhbHVlICpDcmVhdGVWZWN0b3JTcGxhdCh1bnNpZ25lZCBOdW1FbHRzLCBWYWx1ZSAqViwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIGFzc2VydChOdW1FbHRzID4gMCAmJiAiQ2Fubm90IHNwbGF0IHRvIGFuIGVtcHR5IHZlY3RvciEiKTsKKworICAgIC8vIEZpcnN0IGluc2VydCBpdCBpbnRvIGFuIHVuZGVmIHZlY3RvciBzbyB3ZSBjYW4gc2h1ZmZsZSBpdC4KKyAgICBUeXBlICpJMzJUeSA9IGdldEludDMyVHkoKTsKKyAgICBWYWx1ZSAqVW5kZWYgPSBVbmRlZlZhbHVlOjpnZXQoVmVjdG9yVHlwZTo6Z2V0KFYtPmdldFR5cGUoKSwgTnVtRWx0cykpOworICAgIFYgPSBDcmVhdGVJbnNlcnRFbGVtZW50KFVuZGVmLCBWLCBDb25zdGFudEludDo6Z2V0KEkzMlR5LCAwKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lICsgIi5zcGxhdGluc2VydCIpOworCisgICAgLy8gU2h1ZmZsZSB0aGUgdmFsdWUgYWNyb3NzIHRoZSBkZXNpcmVkIG51bWJlciBvZiBlbGVtZW50cy4KKyAgICBWYWx1ZSAqWmVyb3MgPSBDb25zdGFudEFnZ3JlZ2F0ZVplcm86OmdldChWZWN0b3JUeXBlOjpnZXQoSTMyVHksIE51bUVsdHMpKTsKKyAgICByZXR1cm4gQ3JlYXRlU2h1ZmZsZVZlY3RvcihWLCBVbmRlZiwgWmVyb3MsIE5hbWUgKyAiLnNwbGF0Iik7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBhIHZhbHVlIHRoYXQgaGFzIGJlZW4gZXh0cmFjdGVkIGZyb20gYSBsYXJnZXIgaW50ZWdlciB0eXBlLgorICBWYWx1ZSAqQ3JlYXRlRXh0cmFjdEludGVnZXIoY29uc3QgRGF0YUxheW91dCAmREwsIFZhbHVlICpGcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlclR5cGUgKkV4dHJhY3RlZFR5LCB1aW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSkgeworICAgIGF1dG8gKkludFR5ID0gY2FzdDxJbnRlZ2VyVHlwZT4oRnJvbS0+Z2V0VHlwZSgpKTsKKyAgICBhc3NlcnQoREwuZ2V0VHlwZVN0b3JlU2l6ZShFeHRyYWN0ZWRUeSkgKyBPZmZzZXQgPD0KKyAgICAgICAgICAgICAgIERMLmdldFR5cGVTdG9yZVNpemUoSW50VHkpICYmCisgICAgICAgICAgICJFbGVtZW50IGV4dGVuZHMgcGFzdCBmdWxsIHZhbHVlIik7CisgICAgdWludDY0X3QgU2hBbXQgPSA4ICogT2Zmc2V0OworICAgIFZhbHVlICpWID0gRnJvbTsKKyAgICBpZiAoREwuaXNCaWdFbmRpYW4oKSkKKyAgICAgIFNoQW10ID0gOCAqIChETC5nZXRUeXBlU3RvcmVTaXplKEludFR5KSAtCisgICAgICAgICAgICAgICAgICAgREwuZ2V0VHlwZVN0b3JlU2l6ZShFeHRyYWN0ZWRUeSkgLSBPZmZzZXQpOworICAgIGlmIChTaEFtdCkgeworICAgICAgViA9IENyZWF0ZUxTaHIoViwgU2hBbXQsIE5hbWUgKyAiLnNoaWZ0Iik7CisgICAgfQorICAgIGFzc2VydChFeHRyYWN0ZWRUeS0+Z2V0Qml0V2lkdGgoKSA8PSBJbnRUeS0+Z2V0Qml0V2lkdGgoKSAmJgorICAgICAgICAgICAiQ2Fubm90IGV4dHJhY3QgdG8gYSBsYXJnZXIgaW50ZWdlciEiKTsKKyAgICBpZiAoRXh0cmFjdGVkVHkgIT0gSW50VHkpIHsKKyAgICAgIFYgPSBDcmVhdGVUcnVuYyhWLCBFeHRyYWN0ZWRUeSwgTmFtZSArICIudHJ1bmMiKTsKKyAgICB9CisgICAgcmV0dXJuIFY7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBIZWxwZXIgZnVuY3Rpb24gdGhhdCBjcmVhdGVzIGFuIGFzc3VtZSBpbnRyaW5zaWMgY2FsbCB0aGF0CisgIC8vLyByZXByZXNlbnRzIGFuIGFsaWdubWVudCBhc3N1bXB0aW9uIG9uIHRoZSBwcm92aWRlZCBQdHIsIE1hc2ssIFR5cGUKKyAgLy8vIGFuZCBPZmZzZXQuCisgIENhbGxJbnN0ICpDcmVhdGVBbGlnbm1lbnRBc3N1bXB0aW9uSGVscGVyKGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqUHRyVmFsdWUsIFZhbHVlICpNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpJbnRQdHJUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKk9mZnNldFZhbHVlKSB7CisgICAgVmFsdWUgKlB0ckludFZhbHVlID0gQ3JlYXRlUHRyVG9JbnQoUHRyVmFsdWUsIEludFB0clR5LCAicHRyaW50Iik7CisKKyAgICBpZiAoT2Zmc2V0VmFsdWUpIHsKKyAgICAgIGJvb2wgSXNPZmZzZXRaZXJvID0gZmFsc2U7CisgICAgICBpZiAoY29uc3QgYXV0byAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oT2Zmc2V0VmFsdWUpKQorICAgICAgICBJc09mZnNldFplcm8gPSBDSS0+aXNaZXJvKCk7CisKKyAgICAgIGlmICghSXNPZmZzZXRaZXJvKSB7CisgICAgICAgIGlmIChPZmZzZXRWYWx1ZS0+Z2V0VHlwZSgpICE9IEludFB0clR5KQorICAgICAgICAgIE9mZnNldFZhbHVlID0gQ3JlYXRlSW50Q2FzdChPZmZzZXRWYWx1ZSwgSW50UHRyVHksIC8qaXNTaWduZWQqLyB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib2Zmc2V0Y2FzdCIpOworICAgICAgICBQdHJJbnRWYWx1ZSA9IENyZWF0ZVN1YihQdHJJbnRWYWx1ZSwgT2Zmc2V0VmFsdWUsICJvZmZzZXRwdHIiKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBWYWx1ZSAqWmVybyA9IENvbnN0YW50SW50OjpnZXQoSW50UHRyVHksIDApOworICAgIFZhbHVlICpNYXNrZWRQdHIgPSBDcmVhdGVBbmQoUHRySW50VmFsdWUsIE1hc2ssICJtYXNrZWRwdHIiKTsKKyAgICBWYWx1ZSAqSW52Q29uZCA9IENyZWF0ZUlDbXBFUShNYXNrZWRQdHIsIFplcm8sICJtYXNrY29uZCIpOworICAgIHJldHVybiBDcmVhdGVBc3N1bXB0aW9uKEludkNvbmQpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGUgYW4gYXNzdW1lIGludHJpbnNpYyBjYWxsIHRoYXQgcmVwcmVzZW50cyBhbiBhbGlnbm1lbnQKKyAgLy8vIGFzc3VtcHRpb24gb24gdGhlIHByb3ZpZGVkIHBvaW50ZXIuCisgIC8vLworICAvLy8gQW4gb3B0aW9uYWwgb2Zmc2V0IGNhbiBiZSBwcm92aWRlZCwgYW5kIGlmIGl0IGlzIHByb3ZpZGVkLCB0aGUgb2Zmc2V0CisgIC8vLyBtdXN0IGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgcHJvdmlkZWQgcG9pbnRlciB0byBnZXQgdGhlIHBvaW50ZXIgd2l0aCB0aGUKKyAgLy8vIHNwZWNpZmllZCBhbGlnbm1lbnQuCisgIENhbGxJbnN0ICpDcmVhdGVBbGlnbm1lbnRBc3N1bXB0aW9uKGNvbnN0IERhdGFMYXlvdXQgJkRMLCBWYWx1ZSAqUHRyVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKk9mZnNldFZhbHVlID0gbnVsbHB0cikgeworICAgIGFzc2VydChpc2E8UG9pbnRlclR5cGU+KFB0clZhbHVlLT5nZXRUeXBlKCkpICYmCisgICAgICAgICAgICJ0cnlpbmcgdG8gY3JlYXRlIGFuIGFsaWdubWVudCBhc3N1bXB0aW9uIG9uIGEgbm9uLXBvaW50ZXI/Iik7CisgICAgYXV0byAqUHRyVHkgPSBjYXN0PFBvaW50ZXJUeXBlPihQdHJWYWx1ZS0+Z2V0VHlwZSgpKTsKKyAgICBUeXBlICpJbnRQdHJUeSA9IGdldEludFB0clR5KERMLCBQdHJUeS0+Z2V0QWRkcmVzc1NwYWNlKCkpOworCisgICAgVmFsdWUgKk1hc2sgPSBDb25zdGFudEludDo6Z2V0KEludFB0clR5LCBBbGlnbm1lbnQgPiAwID8gQWxpZ25tZW50IC0gMSA6IDApOworICAgIHJldHVybiBDcmVhdGVBbGlnbm1lbnRBc3N1bXB0aW9uSGVscGVyKERMLCBQdHJWYWx1ZSwgTWFzaywgSW50UHRyVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0VmFsdWUpOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYW4gYXNzdW1lIGludHJpbnNpYyBjYWxsIHRoYXQgcmVwcmVzZW50cyBhbiBhbGlnbm1lbnQKKyAgLy8vIGFzc3VtcHRpb24gb24gdGhlIHByb3ZpZGVkIHBvaW50ZXIuCisgIC8vLworICAvLy8gQW4gb3B0aW9uYWwgb2Zmc2V0IGNhbiBiZSBwcm92aWRlZCwgYW5kIGlmIGl0IGlzIHByb3ZpZGVkLCB0aGUgb2Zmc2V0CisgIC8vLyBtdXN0IGJlIHN1YnRyYWN0ZWQgZnJvbSB0aGUgcHJvdmlkZWQgcG9pbnRlciB0byBnZXQgdGhlIHBvaW50ZXIgd2l0aCB0aGUKKyAgLy8vIHNwZWNpZmllZCBhbGlnbm1lbnQuCisgIC8vLworICAvLy8gVGhpcyBvdmVybG9hZCBoYW5kbGVzIHRoZSBjb25kaXRpb24gd2hlcmUgdGhlIEFsaWdubWVudCBpcyBkZXBlbmRlbnQKKyAgLy8vIG9uIGFuIGV4aXN0aW5nIHZhbHVlIHJhdGhlciB0aGFuIGEgc3RhdGljIHZhbHVlLgorICBDYWxsSW5zdCAqQ3JlYXRlQWxpZ25tZW50QXNzdW1wdGlvbihjb25zdCBEYXRhTGF5b3V0ICZETCwgVmFsdWUgKlB0clZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqT2Zmc2V0VmFsdWUgPSBudWxscHRyKSB7CisgICAgYXNzZXJ0KGlzYTxQb2ludGVyVHlwZT4oUHRyVmFsdWUtPmdldFR5cGUoKSkgJiYKKyAgICAgICAgICAgInRyeWluZyB0byBjcmVhdGUgYW4gYWxpZ25tZW50IGFzc3VtcHRpb24gb24gYSBub24tcG9pbnRlcj8iKTsKKyAgICBhdXRvICpQdHJUeSA9IGNhc3Q8UG9pbnRlclR5cGU+KFB0clZhbHVlLT5nZXRUeXBlKCkpOworICAgIFR5cGUgKkludFB0clR5ID0gZ2V0SW50UHRyVHkoREwsIFB0clR5LT5nZXRBZGRyZXNzU3BhY2UoKSk7CisKKyAgICBpZiAoQWxpZ25tZW50LT5nZXRUeXBlKCkgIT0gSW50UHRyVHkpCisgICAgICBBbGlnbm1lbnQgPSBDcmVhdGVJbnRDYXN0KEFsaWdubWVudCwgSW50UHRyVHksIC8qaXNTaWduZWQqLyB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxpZ25tZW50Y2FzdCIpOworICAgIFZhbHVlICpJc1Bvc2l0aXZlID0KKyAgICAgICAgQ3JlYXRlSUNtcChDbXBJbnN0OjpJQ01QX1NHVCwgQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQoQWxpZ25tZW50LT5nZXRUeXBlKCksIDApLCAiaXNwb3NpdGl2ZSIpOworICAgIFZhbHVlICpQb3NpdGl2ZU1hc2sgPQorICAgICAgICBDcmVhdGVTdWIoQWxpZ25tZW50LCBDb25zdGFudEludDo6Z2V0KEludFB0clR5LCAxKSwgInBvc2l0aXZlbWFzayIpOworICAgIFZhbHVlICpNYXNrID0gQ3JlYXRlU2VsZWN0KElzUG9zaXRpdmUsIFBvc2l0aXZlTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KEludFB0clR5LCAwKSwgIm1hc2siKTsKKworICAgIHJldHVybiBDcmVhdGVBbGlnbm1lbnRBc3N1bXB0aW9uSGVscGVyKERMLCBQdHJWYWx1ZSwgTWFzaywgSW50UHRyVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0VmFsdWUpOworICB9Cit9OworCisvLyBDcmVhdGUgd3JhcHBlcnMgZm9yIEMgQmluZGluZyB0eXBlcyAoc2VlIENCaW5kaW5nV3JhcHBpbmcuaCkuCitERUZJTkVfU0lNUExFX0NPTlZFUlNJT05fRlVOQ1RJT05TKElSQnVpbGRlcjw+LCBMTFZNQnVpbGRlclJlZikKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfSVJCVUlMREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSVJQcmludGluZ1Bhc3Nlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JUlByaW50aW5nUGFzc2VzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDgyNWUwNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSVJQcmludGluZ1Bhc3Nlcy5oCkBAIC0wLDAgKzEsOTUgQEAKKy8vPT09LSBJUlByaW50aW5nUGFzc2VzLmggLSBQYXNzZXMgdG8gcHJpbnQgb3V0IElSIGNvbnN0cnVjdHMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLworLy8vIFRoaXMgZmlsZSBkZWZpbmVzIHBhc3NlcyB0byBwcmludCBvdXQgSVIgaW4gdmFyaW91cyBncmFudWxhcml0aWVzLiBUaGUKKy8vLyBQcmludE1vZHVsZVBhc3MgcGFzcyBzaW1wbHkgcHJpbnRzIG91dCB0aGUgZW50aXJlIG1vZHVsZSB3aGVuIGl0IGlzCisvLy8gZXhlY3V0ZWQuIFRoZSBQcmludEZ1bmN0aW9uUGFzcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBiZSBwaXBlbGluZWQgd2l0aAorLy8vIG90aGVyIEZ1bmN0aW9uUGFzcydzLCBhbmQgcHJpbnRzIG91dCB0aGUgZnVuY3Rpb25zIG9mIHRoZSBtb2R1bGUgYXMgdGhleQorLy8vIGFyZSBwcm9jZXNzZWQuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9JUlBSSU5USU5HUEFTU0VTX0gKKyNkZWZpbmUgTExWTV9JUl9JUlBSSU5USU5HUEFTU0VTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgQmFzaWNCbG9ja1Bhc3M7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEZ1bmN0aW9uUGFzczsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIE1vZHVsZVBhc3M7CitjbGFzcyBQcmVzZXJ2ZWRBbmFseXNlczsKK2NsYXNzIHJhd19vc3RyZWFtOwordGVtcGxhdGUgPHR5cGVuYW1lIElSVW5pdFQsIHR5cGVuYW1lLi4uIEV4dHJhQXJnVHM+IGNsYXNzIEFuYWx5c2lzTWFuYWdlcjsKKworLy8vIFxicmllZiBDcmVhdGUgYW5kIHJldHVybiBhIHBhc3MgdGhhdCB3cml0ZXMgdGhlIG1vZHVsZSB0byB0aGUgc3BlY2lmaWVkCisvLy8gXGMgcmF3X29zdHJlYW0uCitNb2R1bGVQYXNzICpjcmVhdGVQcmludE1vZHVsZVBhc3MocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZCYW5uZXIgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZFByZXNlcnZlVXNlTGlzdE9yZGVyID0gZmFsc2UpOworCisvLy8gXGJyaWVmIENyZWF0ZSBhbmQgcmV0dXJuIGEgcGFzcyB0aGF0IHByaW50cyBmdW5jdGlvbnMgdG8gdGhlIHNwZWNpZmllZAorLy8vIFxjIHJhd19vc3RyZWFtIGFzIHRoZXkgYXJlIHByb2Nlc3NlZC4KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlUHJpbnRGdW5jdGlvblBhc3MocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQmFubmVyID0gIiIpOworCisvLy8gXGJyaWVmIENyZWF0ZSBhbmQgcmV0dXJuIGEgcGFzcyB0aGF0IHdyaXRlcyB0aGUgQkIgdG8gdGhlIHNwZWNpZmllZAorLy8vIFxjIHJhd19vc3RyZWFtLgorQmFzaWNCbG9ja1Bhc3MgKmNyZWF0ZVByaW50QmFzaWNCbG9ja1Bhc3MocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lciA9ICIiKTsKKworLy8vIFByaW50IG91dCBhIG5hbWUgb2YgYW4gTExWTSB2YWx1ZSB3aXRob3V0IGFueSBwcmVmaXhlcy4KKy8vLworLy8vIFRoZSBuYW1lIGlzIHN1cnJvdW5kZWQgd2l0aCAiIidzIGFuZCBlc2NhcGVkIGlmIGl0IGhhcyBhbnkgc3BlY2lhbCBvcgorLy8vIG5vbi1wcmludGFibGUgY2hhcmFjdGVycyBpbiBpdC4KK3ZvaWQgcHJpbnRMTFZNTmFtZVdpdGhvdXRQcmVmaXgocmF3X29zdHJlYW0gJk9TLCBTdHJpbmdSZWYgTmFtZSk7CisKKy8vLyBcYnJpZWYgUGFzcyBmb3IgcHJpbnRpbmcgYSBNb2R1bGUgYXMgTExWTSdzIHRleHQgSVIgYXNzZW1ibHkuCisvLy8KKy8vLyBOb3RlOiBUaGlzIHBhc3MgaXMgZm9yIHVzZSB3aXRoIHRoZSBuZXcgcGFzcyBtYW5hZ2VyLiBVc2UgdGhlIGNyZWF0ZS4uLlBhc3MKKy8vLyBmdW5jdGlvbnMgYWJvdmUgdG8gY3JlYXRlIHBhc3NlcyBmb3IgdXNlIHdpdGggdGhlIGxlZ2FjeSBwYXNzIG1hbmFnZXIuCitjbGFzcyBQcmludE1vZHVsZVBhc3MgeworICByYXdfb3N0cmVhbSAmT1M7CisgIHN0ZDo6c3RyaW5nIEJhbm5lcjsKKyAgYm9vbCBTaG91bGRQcmVzZXJ2ZVVzZUxpc3RPcmRlcjsKKworcHVibGljOgorICBQcmludE1vZHVsZVBhc3MoKTsKKyAgUHJpbnRNb2R1bGVQYXNzKHJhd19vc3RyZWFtICZPUywgY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lciA9ICIiLAorICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRQcmVzZXJ2ZVVzZUxpc3RPcmRlciA9IGZhbHNlKTsKKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBBbmFseXNpc01hbmFnZXI8TW9kdWxlPiAmKTsKKworICBzdGF0aWMgU3RyaW5nUmVmIG5hbWUoKSB7IHJldHVybiAiUHJpbnRNb2R1bGVQYXNzIjsgfQorfTsKKworLy8vIFxicmllZiBQYXNzIGZvciBwcmludGluZyBhIEZ1bmN0aW9uIGFzIExMVk0ncyB0ZXh0IElSIGFzc2VtYmx5LgorLy8vCisvLy8gTm90ZTogVGhpcyBwYXNzIGlzIGZvciB1c2Ugd2l0aCB0aGUgbmV3IHBhc3MgbWFuYWdlci4gVXNlIHRoZSBjcmVhdGUuLi5QYXNzCisvLy8gZnVuY3Rpb25zIGFib3ZlIHRvIGNyZWF0ZSBwYXNzZXMgZm9yIHVzZSB3aXRoIHRoZSBsZWdhY3kgcGFzcyBtYW5hZ2VyLgorY2xhc3MgUHJpbnRGdW5jdGlvblBhc3MgeworICByYXdfb3N0cmVhbSAmT1M7CisgIHN0ZDo6c3RyaW5nIEJhbm5lcjsKKworcHVibGljOgorICBQcmludEZ1bmN0aW9uUGFzcygpOworICBQcmludEZ1bmN0aW9uUGFzcyhyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IHN0ZDo6c3RyaW5nICZCYW5uZXIgPSAiIik7CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBBbmFseXNpc01hbmFnZXI8RnVuY3Rpb24+ICYpOworCisgIHN0YXRpYyBTdHJpbmdSZWYgbmFtZSgpIHsgcmV0dXJuICJQcmludEZ1bmN0aW9uUGFzcyI7IH0KK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbmxpbmVBc20uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW5saW5lQXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUxOWE0NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW5saW5lQXNtLmgKQEAgLTAsMCArMSwzNjYgQEAKKy8vPT09LSBsbHZtL0lubGluZUFzbS5oIC0gQ2xhc3MgdG8gcmVwcmVzZW50IGlubGluZSBhc20gc3RyaW5ncyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBpbmxpbmUgYXNtIHN0cmluZ3MsIHdoaWNoIGFyZSBWYWx1ZSoncyB0aGF0IGFyZQorLy8gdXNlZCBhcyB0aGUgY2FsbGVlIG9wZXJhbmQgb2YgY2FsbCBpbnN0cnVjdGlvbnMuICBJbmxpbmVBc20ncyBhcmUgdW5pcXVlZAorLy8gbGlrZSBjb25zdGFudHMsIGFuZCBjcmVhdGVkIHZpYSBJbmxpbmVBc206OmdldCguLi4pLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9JTkxJTkVBU01fSAorI2RlZmluZSBMTFZNX0lSX0lOTElORUFTTV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uVHlwZTsKK2NsYXNzIFBvaW50ZXJUeXBlOwordGVtcGxhdGUgPGNsYXNzIENvbnN0YW50Q2xhc3M+IGNsYXNzIENvbnN0YW50VW5pcXVlTWFwOworCitjbGFzcyBJbmxpbmVBc20gZmluYWwgOiBwdWJsaWMgVmFsdWUgeworcHVibGljOgorICBlbnVtIEFzbURpYWxlY3QgeworICAgIEFEX0FUVCwKKyAgICBBRF9JbnRlbAorICB9OworCitwcml2YXRlOgorICBmcmllbmQgc3RydWN0IElubGluZUFzbUtleVR5cGU7CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudFVuaXF1ZU1hcDxJbmxpbmVBc20+OworCisgIHN0ZDo6c3RyaW5nIEFzbVN0cmluZywgQ29uc3RyYWludHM7CisgIEZ1bmN0aW9uVHlwZSAqRlR5OworICBib29sIEhhc1NpZGVFZmZlY3RzOworICBib29sIElzQWxpZ25TdGFjazsKKyAgQXNtRGlhbGVjdCBEaWFsZWN0OworCisgIElubGluZUFzbShGdW5jdGlvblR5cGUgKlR5LCBjb25zdCBzdGQ6OnN0cmluZyAmQXNtU3RyaW5nLAorICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkNvbnN0cmFpbnRzLCBib29sIGhhc1NpZGVFZmZlY3RzLAorICAgICAgICAgICAgYm9vbCBpc0FsaWduU3RhY2ssIEFzbURpYWxlY3QgYXNtRGlhbGVjdCk7CisKKyAgLy8vIFdoZW4gdGhlIENvbnN0YW50VW5pcXVlTWFwIG1lcmdlcyB0d28gdHlwZXMgYW5kIG1ha2VzIHR3byBJbmxpbmVBc21zCisgIC8vLyBpZGVudGljYWwsIGl0IGRlc3Ryb3lzIG9uZSBvZiB0aGVtIHdpdGggdGhpcyBtZXRob2QuCisgIHZvaWQgZGVzdHJveUNvbnN0YW50KCk7CisKK3B1YmxpYzoKKyAgSW5saW5lQXNtKGNvbnN0IElubGluZUFzbSAmKSA9IGRlbGV0ZTsKKyAgSW5saW5lQXNtICZvcGVyYXRvcj0oY29uc3QgSW5saW5lQXNtICYpID0gZGVsZXRlOworCisgIC8vLyBJbmxpbmVBc206OmdldCAtIFJldHVybiB0aGUgc3BlY2lmaWVkIHVuaXF1ZWQgaW5saW5lIGFzbSBzdHJpbmcuCisgIC8vLworICBzdGF0aWMgSW5saW5lQXNtICpnZXQoRnVuY3Rpb25UeXBlICpUeSwgU3RyaW5nUmVmIEFzbVN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDb25zdHJhaW50cywgYm9vbCBoYXNTaWRlRWZmZWN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNBbGlnblN0YWNrID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBBc21EaWFsZWN0IGFzbURpYWxlY3QgPSBBRF9BVFQpOworCisgIGJvb2wgaGFzU2lkZUVmZmVjdHMoKSBjb25zdCB7IHJldHVybiBIYXNTaWRlRWZmZWN0czsgfQorICBib29sIGlzQWxpZ25TdGFjaygpIGNvbnN0IHsgcmV0dXJuIElzQWxpZ25TdGFjazsgfQorICBBc21EaWFsZWN0IGdldERpYWxlY3QoKSBjb25zdCB7IHJldHVybiBEaWFsZWN0OyB9CisKKyAgLy8vIGdldFR5cGUgLSBJbmxpbmVBc20ncyBhcmUgYWx3YXlzIHBvaW50ZXJzLgorICAvLy8KKyAgUG9pbnRlclR5cGUgKmdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UG9pbnRlclR5cGUqPihWYWx1ZTo6Z2V0VHlwZSgpKTsKKyAgfQorCisgIC8vLyBnZXRGdW5jdGlvblR5cGUgLSBJbmxpbmVBc20ncyBhcmUgYWx3YXlzIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucy4KKyAgLy8vCisgIEZ1bmN0aW9uVHlwZSAqZ2V0RnVuY3Rpb25UeXBlKCkgY29uc3Q7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldEFzbVN0cmluZygpIGNvbnN0IHsgcmV0dXJuIEFzbVN0cmluZzsgfQorICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0Q29uc3RyYWludFN0cmluZygpIGNvbnN0IHsgcmV0dXJuIENvbnN0cmFpbnRzOyB9CisKKyAgLy8vIFZlcmlmeSAtIFRoaXMgc3RhdGljIG1ldGhvZCBjYW4gYmUgdXNlZCBieSB0aGUgcGFyc2VyIHRvIGNoZWNrIHRvIHNlZSBpZgorICAvLy8gdGhlIHNwZWNpZmllZCBjb25zdHJhaW50IHN0cmluZyBpcyBsZWdhbCBmb3IgdGhlIHR5cGUuICBUaGlzIHJldHVybnMgdHJ1ZQorICAvLy8gaWYgbGVnYWwsIGZhbHNlIGlmIG5vdC4KKyAgLy8vCisgIHN0YXRpYyBib29sIFZlcmlmeShGdW5jdGlvblR5cGUgKlR5LCBTdHJpbmdSZWYgQ29uc3RyYWludHMpOworCisgIC8vIENvbnN0cmFpbnQgU3RyaW5nIFBhcnNpbmcKKyAgZW51bSBDb25zdHJhaW50UHJlZml4IHsKKyAgICBpc0lucHV0LCAgICAgICAgICAgIC8vICd4JworICAgIGlzT3V0cHV0LCAgICAgICAgICAgLy8gJz14JworICAgIGlzQ2xvYmJlciAgICAgICAgICAgLy8gJ354JworICB9OworCisgIHVzaW5nIENvbnN0cmFpbnRDb2RlVmVjdG9yID0gc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+OworCisgIHN0cnVjdCBTdWJDb25zdHJhaW50SW5mbyB7CisgICAgLy8vIE1hdGNoaW5nSW5wdXQgLSBJZiB0aGlzIGlzIG5vdCAtMSwgdGhpcyBpcyBhbiBvdXRwdXQgY29uc3RyYWludCB3aGVyZSBhbgorICAgIC8vLyBpbnB1dCBjb25zdHJhaW50IGlzIHJlcXVpcmVkIHRvIG1hdGNoIGl0IChlLmcuICIwIikuICBUaGUgdmFsdWUgaXMgdGhlCisgICAgLy8vIGNvbnN0cmFpbnQgbnVtYmVyIHRoYXQgbWF0Y2hlcyB0aGlzIG9uZSAoZm9yIGV4YW1wbGUsIGlmIHRoaXMgaXMKKyAgICAvLy8gY29uc3RyYWludCAjMCBhbmQgY29uc3RyYWludCAjNCBoYXMgdGhlIHZhbHVlICIwIiwgdGhpcyB3aWxsIGJlIDQpLgorICAgIGludCBNYXRjaGluZ0lucHV0ID0gLTE7CisKKyAgICAvLy8gQ29kZSAtIFRoZSBjb25zdHJhaW50IGNvZGUsIGVpdGhlciB0aGUgcmVnaXN0ZXIgbmFtZSAoaW4gYnJhY2VzKSBvciB0aGUKKyAgICAvLy8gY29uc3RyYWludCBsZXR0ZXIvbnVtYmVyLgorICAgIENvbnN0cmFpbnRDb2RlVmVjdG9yIENvZGVzOworCisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgU3ViQ29uc3RyYWludEluZm8oKSA9IGRlZmF1bHQ7CisgIH07CisKKyAgdXNpbmcgU3ViQ29uc3RyYWludEluZm9WZWN0b3IgPSBzdGQ6OnZlY3RvcjxTdWJDb25zdHJhaW50SW5mbz47CisgIHN0cnVjdCBDb25zdHJhaW50SW5mbzsKKyAgdXNpbmcgQ29uc3RyYWludEluZm9WZWN0b3IgPSBzdGQ6OnZlY3RvcjxDb25zdHJhaW50SW5mbz47CisKKyAgc3RydWN0IENvbnN0cmFpbnRJbmZvIHsKKyAgICAvLy8gVHlwZSAtIFRoZSBiYXNpYyB0eXBlIG9mIHRoZSBjb25zdHJhaW50OiBpbnB1dC9vdXRwdXQvY2xvYmJlcgorICAgIC8vLworICAgIENvbnN0cmFpbnRQcmVmaXggVHlwZSA9IGlzSW5wdXQ7CisKKyAgICAvLy8gaXNFYXJseUNsb2JiZXIgLSAiJiI6IG91dHB1dCBvcGVyYW5kIHdyaXRlcyByZXN1bHQgYmVmb3JlIGlucHV0cyBhcmUgYWxsCisgICAgLy8vIHJlYWQuICBUaGlzIGlzIG9ubHkgZXZlciBzZXQgZm9yIGFuIG91dHB1dCBvcGVyYW5kLgorICAgIGJvb2wgaXNFYXJseUNsb2JiZXIgPSBmYWxzZTsKKworICAgIC8vLyBNYXRjaGluZ0lucHV0IC0gSWYgdGhpcyBpcyBub3QgLTEsIHRoaXMgaXMgYW4gb3V0cHV0IGNvbnN0cmFpbnQgd2hlcmUgYW4KKyAgICAvLy8gaW5wdXQgY29uc3RyYWludCBpcyByZXF1aXJlZCB0byBtYXRjaCBpdCAoZS5nLiAiMCIpLiAgVGhlIHZhbHVlIGlzIHRoZQorICAgIC8vLyBjb25zdHJhaW50IG51bWJlciB0aGF0IG1hdGNoZXMgdGhpcyBvbmUgKGZvciBleGFtcGxlLCBpZiB0aGlzIGlzCisgICAgLy8vIGNvbnN0cmFpbnQgIzAgYW5kIGNvbnN0cmFpbnQgIzQgaGFzIHRoZSB2YWx1ZSAiMCIsIHRoaXMgd2lsbCBiZSA0KS4KKyAgICBpbnQgTWF0Y2hpbmdJbnB1dCA9IC0xOworCisgICAgLy8vIGhhc01hdGNoaW5nSW5wdXQgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIG91dHB1dCBjb25zdHJhaW50IHRoYXQgaGFzCisgICAgLy8vIGEgbWF0Y2hpbmcgaW5wdXQgY29uc3RyYWludC4KKyAgICBib29sIGhhc01hdGNoaW5nSW5wdXQoKSBjb25zdCB7IHJldHVybiBNYXRjaGluZ0lucHV0ICE9IC0xOyB9CisKKyAgICAvLy8gaXNDb21tdXRhdGl2ZSAtIFRoaXMgaXMgc2V0IHRvIHRydWUgZm9yIGEgY29uc3RyYWludCB0aGF0IGlzIGNvbW11dGF0aXZlCisgICAgLy8vIHdpdGggdGhlIG5leHQgb3BlcmFuZC4KKyAgICBib29sIGlzQ29tbXV0YXRpdmUgPSBmYWxzZTsKKworICAgIC8vLyBpc0luZGlyZWN0IC0gVHJ1ZSBpZiB0aGlzIG9wZXJhbmQgaXMgYW4gaW5kaXJlY3Qgb3BlcmFuZC4gIFRoaXMgbWVhbnMKKyAgICAvLy8gdGhhdCB0aGUgYWRkcmVzcyBvZiB0aGUgc291cmNlIG9yIGRlc3RpbmF0aW9uIGlzIHByZXNlbnQgaW4gdGhlIGNhbGwKKyAgICAvLy8gaW5zdHJ1Y3Rpb24sIGluc3RlYWQgb2YgaXQgYmVpbmcgcmV0dXJuZWQgb3IgcGFzc2VkIGluIGV4cGxpY2l0bHkuICBUaGlzCisgICAgLy8vIGlzIHJlcHJlc2VudGVkIHdpdGggYSAnKicgaW4gdGhlIGFzbSBzdHJpbmcuCisgICAgYm9vbCBpc0luZGlyZWN0ID0gZmFsc2U7CisKKyAgICAvLy8gQ29kZSAtIFRoZSBjb25zdHJhaW50IGNvZGUsIGVpdGhlciB0aGUgcmVnaXN0ZXIgbmFtZSAoaW4gYnJhY2VzKSBvciB0aGUKKyAgICAvLy8gY29uc3RyYWludCBsZXR0ZXIvbnVtYmVyLgorICAgIENvbnN0cmFpbnRDb2RlVmVjdG9yIENvZGVzOworCisgICAgLy8vIGlzTXVsdGlwbGVBbHRlcm5hdGl2ZSAtICd8JzogaGFzIG11bHRpcGxlLWFsdGVybmF0aXZlIGNvbnN0cmFpbnRzLgorICAgIGJvb2wgaXNNdWx0aXBsZUFsdGVybmF0aXZlID0gZmFsc2U7CisKKyAgICAvLy8gbXVsdGlwbGVBbHRlcm5hdGl2ZXMgLSBJZiB0aGVyZSBhcmUgbXVsdGlwbGUgYWx0ZXJuYXRpdmUgY29uc3RyYWludHMsCisgICAgLy8vIHRoaXMgYXJyYXkgd2lsbCBjb250YWluIHRoZW0uICBPdGhlcndpc2UgaXQgd2lsbCBiZSBlbXB0eS4KKyAgICBTdWJDb25zdHJhaW50SW5mb1ZlY3RvciBtdWx0aXBsZUFsdGVybmF0aXZlczsKKworICAgIC8vLyBUaGUgY3VycmVudGx5IHNlbGVjdGVkIGFsdGVybmF0aXZlIGNvbnN0cmFpbnQgaW5kZXguCisgICAgdW5zaWduZWQgY3VycmVudEFsdGVybmF0aXZlSW5kZXggPSAwOworCisgICAgLy8vIERlZmF1bHQgY29uc3RydWN0b3IuCisgICAgQ29uc3RyYWludEluZm8oKSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gUGFyc2UgLSBBbmFseXplIHRoZSBzcGVjaWZpZWQgc3RyaW5nIChlLmcuICI9KiZ7ZWF4fSIpIGFuZCBmaWxsIGluIHRoZQorICAgIC8vLyBmaWVsZHMgaW4gdGhpcyBzdHJ1Y3R1cmUuICBJZiB0aGUgY29uc3RyYWludCBzdHJpbmcgaXMgbm90IHVuZGVyc3Rvb2QsCisgICAgLy8vIHJldHVybiB0cnVlLCBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLgorICAgIGJvb2wgUGFyc2UoU3RyaW5nUmVmIFN0ciwgQ29uc3RyYWludEluZm9WZWN0b3IgJkNvbnN0cmFpbnRzU29GYXIpOworCisgICAgLy8vIHNlbGVjdEFsdGVybmF0aXZlIC0gUG9pbnQgdGhpcyBjb25zdHJhaW50IHRvIHRoZSBhbHRlcm5hdGl2ZSBjb25zdHJhaW50CisgICAgLy8vIGluZGljYXRlZCBieSB0aGUgaW5kZXguCisgICAgdm9pZCBzZWxlY3RBbHRlcm5hdGl2ZSh1bnNpZ25lZCBpbmRleCk7CisgIH07CisKKyAgLy8vIFBhcnNlQ29uc3RyYWludHMgLSBTcGxpdCB1cCB0aGUgY29uc3RyYWludCBzdHJpbmcgaW50byB0aGUgc3BlY2lmaWMKKyAgLy8vIGNvbnN0cmFpbnRzIGFuZCB0aGVpciBwcmVmaXhlcy4gIElmIHRoaXMgcmV0dXJucyBhbiBlbXB0eSB2ZWN0b3IsIGFuZCBpZgorICAvLy8gdGhlIGNvbnN0cmFpbnQgc3RyaW5nIGl0c2VsZiBpc24ndCBlbXB0eSwgdGhlcmUgd2FzIGFuIGVycm9yIHBhcnNpbmcuCisgIHN0YXRpYyBDb25zdHJhaW50SW5mb1ZlY3RvciBQYXJzZUNvbnN0cmFpbnRzKFN0cmluZ1JlZiBDb25zdHJhaW50U3RyaW5nKTsKKworICAvLy8gUGFyc2VDb25zdHJhaW50cyAtIFBhcnNlIHRoZSBjb25zdHJhaW50cyBvZiB0aGlzIGlubGluZWFzbSBvYmplY3QsCisgIC8vLyByZXR1cm5pbmcgdGhlbSB0aGUgc2FtZSB3YXkgdGhhdCBQYXJzZUNvbnN0cmFpbnRzKHN0cikgZG9lcy4KKyAgQ29uc3RyYWludEluZm9WZWN0b3IgUGFyc2VDb25zdHJhaW50cygpIGNvbnN0IHsKKyAgICByZXR1cm4gUGFyc2VDb25zdHJhaW50cyhDb25zdHJhaW50cyk7CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIFYtPmdldFZhbHVlSUQoKSA9PSBWYWx1ZTo6SW5saW5lQXNtVmFsOworICB9CisKKyAgLy8gVGhlc2UgYXJlIGhlbHBlciBtZXRob2RzIGZvciBkZWFsaW5nIHdpdGggZmxhZ3MgaW4gdGhlIElOTElORUFTTSBTRE5vZGUKKyAgLy8gaW4gdGhlIGJhY2tlbmQuCisgIC8vCisgIC8vIFRoZSBlbmNvZGluZyBvZiB0aGUgZmxhZyB3b3JkIGlzIGN1cnJlbnRseToKKyAgLy8gICBCaXRzIDItMCAtIEEgS2luZF8qIHZhbHVlIGluZGljYXRpbmcgdGhlIGtpbmQgb2YgdGhlIG9wZXJhbmQuCisgIC8vICAgQml0cyAxNS0zIC0gVGhlIG51bWJlciBvZiBTRE5vZGUgb3BlcmFuZHMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaW5saW5lCisgIC8vICAgICAgICAgICAgICAgYXNzZW1ibHkgb3BlcmFuZC4KKyAgLy8gICBJZiBiaXQgMzEgaXMgc2V0OgorICAvLyAgICAgQml0IDMwLTE2IC0gVGhlIG9wZXJhbmQgbnVtYmVyIHRoYXQgdGhpcyBvcGVyYW5kIG11c3QgbWF0Y2guCisgIC8vICAgICAgICAgICAgICAgICBXaGVuIGJpdHMgMi0wIGFyZSBLaW5kX01lbSwgdGhlIENvbnN0cmFpbnRfKiB2YWx1ZSBtdXN0IGJlCisgIC8vICAgICAgICAgICAgICAgICBvYnRhaW5lZCBmcm9tIHRoZSBmbGFncyBmb3IgdGhpcyBvcGVyYW5kIG51bWJlci4KKyAgLy8gICBFbHNlIGlmIGJpdHMgMi0wIGFyZSBLaW5kX01lbToKKyAgLy8gICAgIEJpdCAzMC0xNiAtIEEgQ29uc3RyYWludF8qIHZhbHVlIGluZGljYXRpbmcgdGhlIG9yaWdpbmFsIGNvbnN0cmFpbnQKKyAgLy8gICAgICAgICAgICAgICAgIGNvZGUuCisgIC8vICAgRWxzZToKKyAgLy8gICAgIEJpdCAzMC0xNiAtIFRoZSByZWdpc3RlciBjbGFzcyBJRCB0byB1c2UgZm9yIHRoZSBvcGVyYW5kLgorCisgIGVudW0gOiB1aW50MzJfdCB7CisgICAgLy8gRml4ZWQgb3BlcmFuZHMgb24gYW4gSU5MSU5FQVNNIFNETm9kZS4KKyAgICBPcF9JbnB1dENoYWluID0gMCwKKyAgICBPcF9Bc21TdHJpbmcgPSAxLAorICAgIE9wX01ETm9kZSA9IDIsCisgICAgT3BfRXh0cmFJbmZvID0gMywgICAgLy8gSGFzU2lkZUVmZmVjdHMsIElzQWxpZ25TdGFjaywgQXNtRGlhbGVjdC4KKyAgICBPcF9GaXJzdE9wZXJhbmQgPSA0LAorCisgICAgLy8gRml4ZWQgb3BlcmFuZHMgb24gYW4gSU5MSU5FQVNNIE1hY2hpbmVJbnN0ci4KKyAgICBNSU9wX0FzbVN0cmluZyA9IDAsCisgICAgTUlPcF9FeHRyYUluZm8gPSAxLCAgICAvLyBIYXNTaWRlRWZmZWN0cywgSXNBbGlnblN0YWNrLCBBc21EaWFsZWN0LgorICAgIE1JT3BfRmlyc3RPcGVyYW5kID0gMiwKKworICAgIC8vIEludGVycHJldGF0aW9uIG9mIHRoZSBNSU9wX0V4dHJhSW5mbyBiaXQgZmllbGQuCisgICAgRXh0cmFfSGFzU2lkZUVmZmVjdHMgPSAxLAorICAgIEV4dHJhX0lzQWxpZ25TdGFjayA9IDIsCisgICAgRXh0cmFfQXNtRGlhbGVjdCA9IDQsCisgICAgRXh0cmFfTWF5TG9hZCA9IDgsCisgICAgRXh0cmFfTWF5U3RvcmUgPSAxNiwKKyAgICBFeHRyYV9Jc0NvbnZlcmdlbnQgPSAzMiwKKworICAgIC8vIElubGluZSBhc20gb3BlcmFuZHMgbWFwIHRvIG11bHRpcGxlIFNETm9kZSAvIE1hY2hpbmVJbnN0ciBvcGVyYW5kcy4KKyAgICAvLyBUaGUgZmlyc3Qgb3BlcmFuZCBpcyBhbiBpbW1lZGlhdGUgZGVzY3JpYmluZyB0aGUgYXNtIG9wZXJhbmQsIHRoZSBsb3cKKyAgICAvLyBiaXRzIGlzIHRoZSBraW5kOgorICAgIEtpbmRfUmVnVXNlID0gMSwgICAgICAgICAgICAgLy8gSW5wdXQgcmVnaXN0ZXIsICJyIi4KKyAgICBLaW5kX1JlZ0RlZiA9IDIsICAgICAgICAgICAgIC8vIE91dHB1dCByZWdpc3RlciwgIj1yIi4KKyAgICBLaW5kX1JlZ0RlZkVhcmx5Q2xvYmJlciA9IDMsIC8vIEVhcmx5LWNsb2JiZXIgb3V0cHV0IHJlZ2lzdGVyLCAiPSZyIi4KKyAgICBLaW5kX0Nsb2JiZXIgPSA0LCAgICAgICAgICAgIC8vIENsb2JiZXJlZCByZWdpc3RlciwgIn5yIi4KKyAgICBLaW5kX0ltbSA9IDUsICAgICAgICAgICAgICAgIC8vIEltbWVkaWF0ZS4KKyAgICBLaW5kX01lbSA9IDYsICAgICAgICAgICAgICAgIC8vIE1lbW9yeSBvcGVyYW5kLCAibSIuCisKKyAgICAvLyBNZW1vcnkgY29uc3RyYWludCBjb2Rlcy4KKyAgICAvLyBUaGVzZSBjb3VsZCBiZSB0YWJsZWdlbmVyYXRlZCBidXQgdGhlcmUncyBsaXR0bGUgbmVlZCB0byBkbyB0aGF0IHNpbmNlCisgICAgLy8gdGhlcmUncyBwbGVudHkgb2Ygc3BhY2UgaW4gdGhlIGVuY29kaW5nIHRvIHN1cHBvcnQgdGhlIHVuaW9uIG9mIGFsbAorICAgIC8vIGNvbnN0cmFpbnQgY29kZXMgZm9yIGFsbCB0YXJnZXRzLgorICAgIENvbnN0cmFpbnRfVW5rbm93biA9IDAsCisgICAgQ29uc3RyYWludF9lcywKKyAgICBDb25zdHJhaW50X2ksCisgICAgQ29uc3RyYWludF9tLAorICAgIENvbnN0cmFpbnRfbywKKyAgICBDb25zdHJhaW50X3YsCisgICAgQ29uc3RyYWludF9RLAorICAgIENvbnN0cmFpbnRfUiwKKyAgICBDb25zdHJhaW50X1MsCisgICAgQ29uc3RyYWludF9ULAorICAgIENvbnN0cmFpbnRfVW0sCisgICAgQ29uc3RyYWludF9VbiwKKyAgICBDb25zdHJhaW50X1VxLAorICAgIENvbnN0cmFpbnRfVXMsCisgICAgQ29uc3RyYWludF9VdCwKKyAgICBDb25zdHJhaW50X1V2LAorICAgIENvbnN0cmFpbnRfVXksCisgICAgQ29uc3RyYWludF9YLAorICAgIENvbnN0cmFpbnRfWiwKKyAgICBDb25zdHJhaW50X1pDLAorICAgIENvbnN0cmFpbnRfWnksCisgICAgQ29uc3RyYWludHNfTWF4ID0gQ29uc3RyYWludF9aeSwKKyAgICBDb25zdHJhaW50c19TaGlmdEFtb3VudCA9IDE2LAorCisgICAgRmxhZ19NYXRjaGluZ09wZXJhbmQgPSAweDgwMDAwMDAwCisgIH07CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEZsYWdXb3JkKHVuc2lnbmVkIEtpbmQsIHVuc2lnbmVkIE51bU9wcykgeworICAgIGFzc2VydCgoKE51bU9wcyA8PCAzKSAmIH4weGZmZmYpID09IDAgJiYgIlRvbyBtYW55IGlubGluZSBhc20gb3BlcmFuZHMhIik7CisgICAgYXNzZXJ0KEtpbmQgPj0gS2luZF9SZWdVc2UgJiYgS2luZCA8PSBLaW5kX01lbSAmJiAiSW52YWxpZCBLaW5kIik7CisgICAgcmV0dXJuIEtpbmQgfCAoTnVtT3BzIDw8IDMpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNSZWdEZWZLaW5kKHVuc2lnbmVkIEZsYWcpeyByZXR1cm4gZ2V0S2luZChGbGFnKSA9PSBLaW5kX1JlZ0RlZjt9CisgIHN0YXRpYyBib29sIGlzSW1tS2luZCh1bnNpZ25lZCBGbGFnKSB7IHJldHVybiBnZXRLaW5kKEZsYWcpID09IEtpbmRfSW1tOyB9CisgIHN0YXRpYyBib29sIGlzTWVtS2luZCh1bnNpZ25lZCBGbGFnKSB7IHJldHVybiBnZXRLaW5kKEZsYWcpID09IEtpbmRfTWVtOyB9CisgIHN0YXRpYyBib29sIGlzUmVnRGVmRWFybHlDbG9iYmVyS2luZCh1bnNpZ25lZCBGbGFnKSB7CisgICAgcmV0dXJuIGdldEtpbmQoRmxhZykgPT0gS2luZF9SZWdEZWZFYXJseUNsb2JiZXI7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNDbG9iYmVyS2luZCh1bnNpZ25lZCBGbGFnKSB7CisgICAgcmV0dXJuIGdldEtpbmQoRmxhZykgPT0gS2luZF9DbG9iYmVyOworICB9CisKKyAgLy8vIGdldEZsYWdXb3JkRm9yTWF0Y2hpbmdPcCAtIEF1Z21lbnQgYW4gZXhpc3RpbmcgZmxhZyB3b3JkIHJldHVybmVkIGJ5CisgIC8vLyBnZXRGbGFnV29yZCB3aXRoIGluZm9ybWF0aW9uIGluZGljYXRpbmcgdGhhdCB0aGlzIGlucHV0IG9wZXJhbmQgaXMgdGllZAorICAvLy8gdG8gYSBwcmV2aW91cyBvdXRwdXQgb3BlcmFuZC4KKyAgc3RhdGljIHVuc2lnbmVkIGdldEZsYWdXb3JkRm9yTWF0Y2hpbmdPcCh1bnNpZ25lZCBJbnB1dEZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF0Y2hlZE9wZXJhbmRObykgeworICAgIGFzc2VydChNYXRjaGVkT3BlcmFuZE5vIDw9IDB4N2ZmZiAmJiAiVG9vIGJpZyBtYXRjaGVkIG9wZXJhbmQiKTsKKyAgICBhc3NlcnQoKElucHV0RmxhZyAmIH4weGZmZmYpID09IDAgJiYgIkhpZ2ggYml0cyBhbHJlYWR5IGNvbnRhaW4gZGF0YSIpOworICAgIHJldHVybiBJbnB1dEZsYWcgfCBGbGFnX01hdGNoaW5nT3BlcmFuZCB8IChNYXRjaGVkT3BlcmFuZE5vIDw8IDE2KTsKKyAgfQorCisgIC8vLyBnZXRGbGFnV29yZEZvclJlZ0NsYXNzIC0gQXVnbWVudCBhbiBleGlzdGluZyBmbGFnIHdvcmQgcmV0dXJuZWQgYnkKKyAgLy8vIGdldEZsYWdXb3JkIHdpdGggdGhlIHJlcXVpcmVkIHJlZ2lzdGVyIGNsYXNzIGZvciB0aGUgZm9sbG93aW5nIHJlZ2lzdGVyCisgIC8vLyBvcGVyYW5kcy4KKyAgLy8vIEEgdGllZCB1c2Ugb3BlcmFuZCBjYW5ub3QgaGF2ZSBhIHJlZ2lzdGVyIGNsYXNzLCB1c2UgdGhlIHJlZ2lzdGVyIGNsYXNzCisgIC8vLyBmcm9tIHRoZSBkZWYgb3BlcmFuZCBpbnN0ZWFkLgorICBzdGF0aWMgdW5zaWduZWQgZ2V0RmxhZ1dvcmRGb3JSZWdDbGFzcyh1bnNpZ25lZCBJbnB1dEZsYWcsIHVuc2lnbmVkIFJDKSB7CisgICAgLy8gU3RvcmUgUkMgKyAxLCByZXNlcnZlIHRoZSB2YWx1ZSAwIHRvIG1lYW4gJ25vIHJlZ2lzdGVyIGNsYXNzJy4KKyAgICArK1JDOworICAgIGFzc2VydCghaXNJbW1LaW5kKElucHV0RmxhZykgJiYgIkltbWVkaWF0ZXMgY2Fubm90IGhhdmUgYSByZWdpc3RlciBjbGFzcyIpOworICAgIGFzc2VydCghaXNNZW1LaW5kKElucHV0RmxhZykgJiYgIk1lbW9yeSBvcGVyYW5kIGNhbm5vdCBoYXZlIGEgcmVnaXN0ZXIgY2xhc3MiKTsKKyAgICBhc3NlcnQoUkMgPD0gMHg3ZmZmICYmICJUb28gbGFyZ2UgcmVnaXN0ZXIgY2xhc3MgSUQiKTsKKyAgICBhc3NlcnQoKElucHV0RmxhZyAmIH4weGZmZmYpID09IDAgJiYgIkhpZ2ggYml0cyBhbHJlYWR5IGNvbnRhaW4gZGF0YSIpOworICAgIHJldHVybiBJbnB1dEZsYWcgfCAoUkMgPDwgMTYpOworICB9CisKKyAgLy8vIEF1Z21lbnQgYW4gZXhpc3RpbmcgZmxhZyB3b3JkIHJldHVybmVkIGJ5IGdldEZsYWdXb3JkIHdpdGggdGhlIGNvbnN0cmFpbnQKKyAgLy8vIGNvZGUgZm9yIGEgbWVtb3J5IGNvbnN0cmFpbnQuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRGbGFnV29yZEZvck1lbSh1bnNpZ25lZCBJbnB1dEZsYWcsIHVuc2lnbmVkIENvbnN0cmFpbnQpIHsKKyAgICBhc3NlcnQoaXNNZW1LaW5kKElucHV0RmxhZykgJiYgIklucHV0RmxhZyBpcyBub3QgYSBtZW1vcnkgY29uc3RyYWludCEiKTsKKyAgICBhc3NlcnQoQ29uc3RyYWludCA8PSAweDdmZmYgJiYgIlRvbyBsYXJnZSBhIG1lbW9yeSBjb25zdHJhaW50IElEIik7CisgICAgYXNzZXJ0KENvbnN0cmFpbnQgPD0gQ29uc3RyYWludHNfTWF4ICYmICJVbmtub3duIGNvbnN0cmFpbnQgSUQiKTsKKyAgICBhc3NlcnQoKElucHV0RmxhZyAmIH4weGZmZmYpID09IDAgJiYgIkhpZ2ggYml0cyBhbHJlYWR5IGNvbnRhaW4gZGF0YSIpOworICAgIHJldHVybiBJbnB1dEZsYWcgfCAoQ29uc3RyYWludCA8PCBDb25zdHJhaW50c19TaGlmdEFtb3VudCk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgY29udmVydE1lbUZsYWdXb3JkVG9NYXRjaGluZ0ZsYWdXb3JkKHVuc2lnbmVkIElucHV0RmxhZykgeworICAgIGFzc2VydChpc01lbUtpbmQoSW5wdXRGbGFnKSk7CisgICAgcmV0dXJuIElucHV0RmxhZyAmIH4oMHg3ZmZmIDw8IENvbnN0cmFpbnRzX1NoaWZ0QW1vdW50KTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRLaW5kKHVuc2lnbmVkIEZsYWdzKSB7CisgICAgcmV0dXJuIEZsYWdzICYgNzsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRNZW1vcnlDb25zdHJhaW50SUQodW5zaWduZWQgRmxhZykgeworICAgIGFzc2VydChpc01lbUtpbmQoRmxhZykpOworICAgIHJldHVybiAoRmxhZyA+PiBDb25zdHJhaW50c19TaGlmdEFtb3VudCkgJiAweDdmZmY7CisgIH0KKworICAvLy8gZ2V0TnVtT3BlcmFuZFJlZ2lzdGVycyAtIEV4dHJhY3QgdGhlIG51bWJlciBvZiByZWdpc3RlcnMgZmllbGQgZnJvbSB0aGUKKyAgLy8vIGlubGluZSBhc20gb3BlcmFuZCBmbGFnLgorICBzdGF0aWMgdW5zaWduZWQgZ2V0TnVtT3BlcmFuZFJlZ2lzdGVycyh1bnNpZ25lZCBGbGFnKSB7CisgICAgcmV0dXJuIChGbGFnICYgMHhmZmZmKSA+PiAzOworICB9CisKKyAgLy8vIGlzVXNlT3BlcmFuZFRpZWRUb0RlZiAtIFJldHVybiB0cnVlIGlmIHRoZSBmbGFnIG9mIHRoZSBpbmxpbmUgYXNtCisgIC8vLyBvcGVyYW5kIGluZGljYXRlcyBpdCBpcyBhbiB1c2Ugb3BlcmFuZCB0aGF0J3MgbWF0Y2hlZCB0byBhIGRlZiBvcGVyYW5kLgorICBzdGF0aWMgYm9vbCBpc1VzZU9wZXJhbmRUaWVkVG9EZWYodW5zaWduZWQgRmxhZywgdW5zaWduZWQgJklkeCkgeworICAgIGlmICgoRmxhZyAmIEZsYWdfTWF0Y2hpbmdPcGVyYW5kKSA9PSAwKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIElkeCA9IChGbGFnICYgfkZsYWdfTWF0Y2hpbmdPcGVyYW5kKSA+PiAxNjsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBoYXNSZWdDbGFzc0NvbnN0cmFpbnQgLSBSZXR1cm5zIHRydWUgaWYgdGhlIGZsYWcgY29udGFpbnMgYSByZWdpc3RlcgorICAvLy8gY2xhc3MgY29uc3RyYWludC4gIFNldHMgUkMgdG8gdGhlIHJlZ2lzdGVyIGNsYXNzIElELgorICBzdGF0aWMgYm9vbCBoYXNSZWdDbGFzc0NvbnN0cmFpbnQodW5zaWduZWQgRmxhZywgdW5zaWduZWQgJlJDKSB7CisgICAgaWYgKEZsYWcgJiBGbGFnX01hdGNoaW5nT3BlcmFuZCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB1bnNpZ25lZCBIaWdoID0gRmxhZyA+PiAxNjsKKyAgICAvLyBnZXRGbGFnV29yZEZvclJlZ0NsYXNzKCkgdXNlcyAwIHRvIG1lYW4gbm8gcmVnaXN0ZXIgY2xhc3MsIGFuZCBvdGhlcndpc2UKKyAgICAvLyBzdG9yZXMgUkMgKyAxLgorICAgIGlmICghSGlnaCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBSQyA9IEhpZ2ggLSAxOworICAgIHJldHVybiB0cnVlOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9JTkxJTkVBU01fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnN0SXRlcmF0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW5zdEl0ZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk4OGZjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW5zdEl0ZXJhdG9yLmgKQEAgLTAsMCArMSwxNjMgQEAKKy8vPT09LSBJbnN0SXRlcmF0b3IuaCAtIENsYXNzZXMgZm9yIGluc3QgaXRlcmF0aW9uIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIG9mIHR3byBpdGVyYXRvcnMgZm9yIGl0ZXJhdGluZyBvdmVyIHRoZQorLy8gaW5zdHJ1Y3Rpb25zIGluIGEgZnVuY3Rpb24uICBUaGlzIGlzIGVmZmVjdGl2ZWx5IGEgd3JhcHBlciBhcm91bmQgYSB0d28gbGV2ZWwKKy8vIGl0ZXJhdG9yIHRoYXQgY2FuIHByb2JhYmx5IGJlIGdlbmVyaWNpemVkIGxhdGVyLgorLy8KKy8vIE5vdGUgdGhhdCB0aGlzIGl0ZXJhdG9yIGdldHMgaW52YWxpZGF0ZWQgYW55IHRpbWUgdGhhdCBiYXNpYyBibG9ja3Mgb3IKKy8vIGluc3RydWN0aW9ucyBhcmUgbW92ZWQgYXJvdW5kLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9JTlNUSVRFUkFUT1JfSAorI2RlZmluZSBMTFZNX0lSX0lOU1RJVEVSQVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1N5bWJvbFRhYmxlTGlzdFRyYWl0cy5oIgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBpbnN0X2JlZ2luKCkgJiBpbnN0X2VuZCgpIGZvcgorLy8gaW5zdF9pdGVyYXRvciBhbmQgY29uc3RfaW5zdF9pdGVyYXRvcidzLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBCQl90LCBjbGFzcyBCQl9pX3QsIGNsYXNzIEJJX3QsIGNsYXNzIElJX3Q+IGNsYXNzIEluc3RJdGVyYXRvciB7CisgIHVzaW5nIEJCdHkgPSBCQl90OworICB1c2luZyBCQkl0eSA9IEJCX2lfdDsKKyAgdXNpbmcgQkl0eSA9IEJJX3Q7CisgIHVzaW5nIElJdHkgPSBJSV90OworICBCQl90ICpCQnM7IC8vIEJhc2ljQmxvY2tzVHlwZQorICBCQl9pX3QgQkI7IC8vIEJhc2ljQmxvY2tzVHlwZTo6aXRlcmF0b3IKKyAgQklfdCBCSTsgICAvLyBCYXNpY0Jsb2NrOjppdGVyYXRvcgorCitwdWJsaWM6CisgIHVzaW5nIGl0ZXJhdG9yX2NhdGVnb3J5ID0gc3RkOjpiaWRpcmVjdGlvbmFsX2l0ZXJhdG9yX3RhZzsKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IElJdHk7CisgIHVzaW5nIGRpZmZlcmVuY2VfdHlwZSA9IHNpZ25lZDsKKyAgdXNpbmcgcG9pbnRlciA9IElJdHkgKjsKKyAgdXNpbmcgcmVmZXJlbmNlID0gSUl0eSAmOworCisgIC8vIERlZmF1bHQgY29uc3RydWN0b3IKKyAgSW5zdEl0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgIC8vIENvcHkgY29uc3RydWN0b3IuLi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQSwgdHlwZW5hbWUgQiwgdHlwZW5hbWUgQywgdHlwZW5hbWUgRD4KKyAgSW5zdEl0ZXJhdG9yKGNvbnN0IEluc3RJdGVyYXRvcjxBLEIsQyxEPiAmSUkpCisgICAgOiBCQnMoSUkuQkJzKSwgQkIoSUkuQkIpLCBCSShJSS5CSSkge30KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBBLCB0eXBlbmFtZSBCLCB0eXBlbmFtZSBDLCB0eXBlbmFtZSBEPgorICBJbnN0SXRlcmF0b3IoSW5zdEl0ZXJhdG9yPEEsQixDLEQ+ICZJSSkKKyAgICA6IEJCcyhJSS5CQnMpLCBCQihJSS5CQiksIEJJKElJLkJJKSB7fQorCisgIHRlbXBsYXRlPGNsYXNzIE0+IEluc3RJdGVyYXRvcihNICZtKQorICAgIDogQkJzKCZtLmdldEJhc2ljQmxvY2tMaXN0KCkpLCBCQihCQnMtPmJlZ2luKCkpIHsgICAgLy8gYmVnaW4gY3RvcgorICAgIGlmIChCQiAhPSBCQnMtPmVuZCgpKSB7CisgICAgICBCSSA9IEJCLT5iZWdpbigpOworICAgICAgYWR2YW5jZVRvTmV4dEJCKCk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGU8Y2xhc3MgTT4gSW5zdEl0ZXJhdG9yKE0gJm0sIGJvb2wpCisgICAgOiBCQnMoJm0uZ2V0QmFzaWNCbG9ja0xpc3QoKSksIEJCKEJCcy0+ZW5kKCkpIHsgICAgLy8gZW5kIGN0b3IKKyAgfQorCisgIC8vIEFjY2Vzc29ycyB0byBnZXQgYXQgdGhlIHVuZGVybHlpbmcgaXRlcmF0b3JzLi4uCisgIGlubGluZSBCQkl0eSAmZ2V0QmFzaWNCbG9ja0l0ZXJhdG9yKCkgIHsgcmV0dXJuIEJCOyB9CisgIGlubGluZSBCSXR5ICAmZ2V0SW5zdHJ1Y3Rpb25JdGVyYXRvcigpIHsgcmV0dXJuIEJJOyB9CisKKyAgaW5saW5lIHJlZmVyZW5jZSBvcGVyYXRvciooKSAgY29uc3QgeyByZXR1cm4gKkJJOyB9CisgIGlubGluZSBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmb3BlcmF0b3IqKCk7IH0KKworICBpbmxpbmUgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEluc3RJdGVyYXRvciAmeSkgY29uc3QgeworICAgIHJldHVybiBCQiA9PSB5LkJCICYmIChCQiA9PSBCQnMtPmVuZCgpIHx8IEJJID09IHkuQkkpOworICB9CisgIGlubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgSW5zdEl0ZXJhdG9yJiB5KSBjb25zdCB7CisgICAgcmV0dXJuICFvcGVyYXRvcj09KHkpOworICB9CisKKyAgSW5zdEl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeworICAgICsrQkk7CisgICAgYWR2YW5jZVRvTmV4dEJCKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIGlubGluZSBJbnN0SXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsKKyAgICBJbnN0SXRlcmF0b3IgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7CisgIH0KKworICBJbnN0SXRlcmF0b3ImIG9wZXJhdG9yLS0oKSB7CisgICAgd2hpbGUgKEJCID09IEJCcy0+ZW5kKCkgfHwgQkkgPT0gQkItPmJlZ2luKCkpIHsKKyAgICAgIC0tQkI7CisgICAgICBCSSA9IEJCLT5lbmQoKTsKKyAgICB9CisgICAgLS1CSTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW5saW5lIEluc3RJdGVyYXRvciBvcGVyYXRvci0tKGludCkgeworICAgIEluc3RJdGVyYXRvciB0bXAgPSAqdGhpczsgLS0qdGhpczsgcmV0dXJuIHRtcDsKKyAgfQorCisgIGlubGluZSBib29sIGF0RW5kKCkgY29uc3QgeyByZXR1cm4gQkIgPT0gQkJzLT5lbmQoKTsgfQorCitwcml2YXRlOgorICBpbmxpbmUgdm9pZCBhZHZhbmNlVG9OZXh0QkIoKSB7CisgICAgLy8gVGhlIG9ubHkgd2F5IHRoYXQgdGhlIElJIGNvdWxkIGJlIGJyb2tlbiBpcyBpZiBpdCBpcyBub3cgcG9pbnRpbmcgdG8KKyAgICAvLyB0aGUgZW5kKCkgb2YgdGhlIGN1cnJlbnQgQmFzaWNCbG9jayBhbmQgdGhlcmUgYXJlIHN1Y2Nlc3NvciBCQnMuCisgICAgd2hpbGUgKEJJID09IEJCLT5lbmQoKSkgeworICAgICAgKytCQjsKKyAgICAgIGlmIChCQiA9PSBCQnMtPmVuZCgpKSBicmVhazsKKyAgICAgIEJJID0gQkItPmJlZ2luKCk7CisgICAgfQorICB9Cit9OworCit1c2luZyBpbnN0X2l0ZXJhdG9yID0KKyAgICBJbnN0SXRlcmF0b3I8U3ltYm9sVGFibGVMaXN0PEJhc2ljQmxvY2s+LCBGdW5jdGlvbjo6aXRlcmF0b3IsCisgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yLCBJbnN0cnVjdGlvbj47Cit1c2luZyBjb25zdF9pbnN0X2l0ZXJhdG9yID0KKyAgICBJbnN0SXRlcmF0b3I8Y29uc3QgU3ltYm9sVGFibGVMaXN0PEJhc2ljQmxvY2s+LAorICAgICAgICAgICAgICAgICBGdW5jdGlvbjo6Y29uc3RfaXRlcmF0b3IsIEJhc2ljQmxvY2s6OmNvbnN0X2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICBjb25zdCBJbnN0cnVjdGlvbj47Cit1c2luZyBpbnN0X3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8aW5zdF9pdGVyYXRvcj47Cit1c2luZyBjb25zdF9pbnN0X3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8Y29uc3RfaW5zdF9pdGVyYXRvcj47CisKK2lubGluZSBpbnN0X2l0ZXJhdG9yIGluc3RfYmVnaW4oRnVuY3Rpb24gKkYpIHsgcmV0dXJuIGluc3RfaXRlcmF0b3IoKkYpOyB9CitpbmxpbmUgaW5zdF9pdGVyYXRvciBpbnN0X2VuZChGdW5jdGlvbiAqRikgICB7IHJldHVybiBpbnN0X2l0ZXJhdG9yKCpGLCB0cnVlKTsgfQoraW5saW5lIGluc3RfcmFuZ2UgaW5zdHJ1Y3Rpb25zKEZ1bmN0aW9uICpGKSB7CisgIHJldHVybiBpbnN0X3JhbmdlKGluc3RfYmVnaW4oRiksIGluc3RfZW5kKEYpKTsKK30KK2lubGluZSBjb25zdF9pbnN0X2l0ZXJhdG9yIGluc3RfYmVnaW4oY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgcmV0dXJuIGNvbnN0X2luc3RfaXRlcmF0b3IoKkYpOworfQoraW5saW5lIGNvbnN0X2luc3RfaXRlcmF0b3IgaW5zdF9lbmQoY29uc3QgRnVuY3Rpb24gKkYpIHsKKyAgcmV0dXJuIGNvbnN0X2luc3RfaXRlcmF0b3IoKkYsIHRydWUpOworfQoraW5saW5lIGNvbnN0X2luc3RfcmFuZ2UgaW5zdHJ1Y3Rpb25zKGNvbnN0IEZ1bmN0aW9uICpGKSB7CisgIHJldHVybiBjb25zdF9pbnN0X3JhbmdlKGluc3RfYmVnaW4oRiksIGluc3RfZW5kKEYpKTsKK30KK2lubGluZSBpbnN0X2l0ZXJhdG9yIGluc3RfYmVnaW4oRnVuY3Rpb24gJkYpIHsgcmV0dXJuIGluc3RfaXRlcmF0b3IoRik7IH0KK2lubGluZSBpbnN0X2l0ZXJhdG9yIGluc3RfZW5kKEZ1bmN0aW9uICZGKSAgIHsgcmV0dXJuIGluc3RfaXRlcmF0b3IoRiwgdHJ1ZSk7IH0KK2lubGluZSBpbnN0X3JhbmdlIGluc3RydWN0aW9ucyhGdW5jdGlvbiAmRikgeworICByZXR1cm4gaW5zdF9yYW5nZShpbnN0X2JlZ2luKEYpLCBpbnN0X2VuZChGKSk7Cit9CitpbmxpbmUgY29uc3RfaW5zdF9pdGVyYXRvciBpbnN0X2JlZ2luKGNvbnN0IEZ1bmN0aW9uICZGKSB7CisgIHJldHVybiBjb25zdF9pbnN0X2l0ZXJhdG9yKEYpOworfQoraW5saW5lIGNvbnN0X2luc3RfaXRlcmF0b3IgaW5zdF9lbmQoY29uc3QgRnVuY3Rpb24gJkYpIHsKKyAgcmV0dXJuIGNvbnN0X2luc3RfaXRlcmF0b3IoRiwgdHJ1ZSk7Cit9CitpbmxpbmUgY29uc3RfaW5zdF9yYW5nZSBpbnN0cnVjdGlvbnMoY29uc3QgRnVuY3Rpb24gJkYpIHsKKyAgcmV0dXJuIGNvbnN0X2luc3RfcmFuZ2UoaW5zdF9iZWdpbihGKSwgaW5zdF9lbmQoRikpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9JTlNUSVRFUkFUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnN0VmlzaXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnN0VmlzaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NTc5ODEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0luc3RWaXNpdG9yLmgKQEAgLTAsMCArMSwyOTggQEAKKy8vPT09LSBJbnN0VmlzaXRvci5oIC0gSW5zdHJ1Y3Rpb24gdmlzaXRvciB0ZW1wbGF0ZXMgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBMTFZNX0lSX0lOU1RWSVNJVE9SX0gKKyNkZWZpbmUgTExWTV9JUl9JTlNUVklTSVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxTaXRlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vIFdlIG9wZXJhdGUgb24gb3BhcXVlIGluc3RydWN0aW9uIGNsYXNzZXMsIHNvIGZvcndhcmQgZGVjbGFyZSBhbGwgaW5zdHJ1Y3Rpb24KKy8vIHR5cGVzIG5vdy4uLgorLy8KKyNkZWZpbmUgSEFORExFX0lOU1QoTlVNLCBPUENPREUsIENMQVNTKSAgIGNsYXNzIENMQVNTOworI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uZGVmIgorCisjZGVmaW5lIERFTEVHQVRFKENMQVNTX1RPX1ZJU0lUKSBcCisgIHJldHVybiBzdGF0aWNfY2FzdDxTdWJDbGFzcyo+KHRoaXMpLT4gXAorICAgICAgICAgICAgICAgdmlzaXQjI0NMQVNTX1RPX1ZJU0lUKHN0YXRpY19jYXN0PENMQVNTX1RPX1ZJU0lUJj4oSSkpCisKKworLy8vIEBicmllZiBCYXNlIGNsYXNzIGZvciBpbnN0cnVjdGlvbiB2aXNpdG9ycworLy8vCisvLy8gSW5zdHJ1Y3Rpb24gdmlzaXRvcnMgYXJlIHVzZWQgd2hlbiB5b3Ugd2FudCB0byBwZXJmb3JtIGRpZmZlcmVudCBhY3Rpb25zCisvLy8gZm9yIGRpZmZlcmVudCBraW5kcyBvZiBpbnN0cnVjdGlvbnMgd2l0aG91dCBoYXZpbmcgdG8gdXNlIGxvdHMgb2YgY2FzdHMKKy8vLyBhbmQgYSBiaWcgc3dpdGNoIHN0YXRlbWVudCAoaW4geW91ciBjb2RlLCB0aGF0IGlzKS4KKy8vLworLy8vIFRvIGRlZmluZSB5b3VyIG93biB2aXNpdG9yLCBpbmhlcml0IGZyb20gdGhpcyBjbGFzcywgc3BlY2lmeWluZyB5b3VyCisvLy8gbmV3IHR5cGUgZm9yIHRoZSAnU3ViQ2xhc3MnIHRlbXBsYXRlIHBhcmFtZXRlciwgYW5kICJvdmVycmlkZSIgdmlzaXRYWFgKKy8vLyBmdW5jdGlvbnMgaW4geW91ciBjbGFzcy4gSSBzYXkgIm92ZXJyaWRlIiBiZWNhdXNlIHRoaXMgY2xhc3MgaXMgZGVmaW5lZAorLy8vIGluIHRlcm1zIG9mIHN0YXRpY2FsbHkgcmVzb2x2ZWQgb3ZlcmxvYWRpbmcsIG5vdCB2aXJ0dWFsIGZ1bmN0aW9ucy4KKy8vLworLy8vIEZvciBleGFtcGxlLCBoZXJlIGlzIGEgdmlzaXRvciB0aGF0IGNvdW50cyB0aGUgbnVtYmVyIG9mIG1hbGxvYworLy8vIGluc3RydWN0aW9ucyBwcm9jZXNzZWQ6CisvLy8KKy8vLyAgLy8vIERlY2xhcmUgdGhlIGNsYXNzLiAgTm90ZSB0aGF0IHdlIGRlcml2ZSBmcm9tIEluc3RWaXNpdG9yIGluc3RhbnRpYXRlZAorLy8vICAvLy8gd2l0aCBfb3VyIG5ldyBzdWJjbGFzc2VzXyB0eXBlLgorLy8vICAvLy8KKy8vLyAgc3RydWN0IENvdW50QWxsb2NhVmlzaXRvciA6IHB1YmxpYyBJbnN0VmlzaXRvcjxDb3VudEFsbG9jYVZpc2l0b3I+IHsKKy8vLyAgICB1bnNpZ25lZCBDb3VudDsKKy8vLyAgICBDb3VudEFsbG9jYVZpc2l0b3IoKSA6IENvdW50KDApIHt9CisvLy8KKy8vLyAgICB2b2lkIHZpc2l0QWxsb2NhSW5zdChBbGxvY2FJbnN0ICZBSSkgeyArK0NvdW50OyB9CisvLy8gIH07CisvLy8KKy8vLyAgQW5kIHRoaXMgY2xhc3Mgd291bGQgYmUgdXNlZCBsaWtlIHRoaXM6CisvLy8gICAgQ291bnRBbGxvY2FWaXNpdG9yIENBVjsKKy8vLyAgICBDQVYudmlzaXQoZnVuY3Rpb24pOworLy8vICAgIE51bUFsbG9jYXMgPSBDQVYuQ291bnQ7CisvLy8KKy8vLyBUaGUgZGVmaW5lZCBoYXMgJ3Zpc2l0JyBtZXRob2RzIGZvciBJbnN0cnVjdGlvbiwgYW5kIGFsc28gZm9yIEJhc2ljQmxvY2ssCisvLy8gRnVuY3Rpb24sIGFuZCBNb2R1bGUsIHdoaWNoIHJlY3Vyc2l2ZWx5IHByb2Nlc3MgYWxsIGNvbnRhaW5lZCBpbnN0cnVjdGlvbnMuCisvLy8KKy8vLyBOb3RlIHRoYXQgaWYgeW91IGRvbid0IGltcGxlbWVudCB2aXNpdFhYWCBmb3Igc29tZSBpbnN0cnVjdGlvbiB0eXBlLAorLy8vIHRoZSB2aXNpdFhYWCBtZXRob2QgZm9yIGluc3RydWN0aW9uIHN1cGVyY2xhc3Mgd2lsbCBiZSBpbnZva2VkLiBTbworLy8vIGlmIGluc3RydWN0aW9ucyBhcmUgYWRkZWQgaW4gdGhlIGZ1dHVyZSwgdGhleSB3aWxsIGJlIGF1dG9tYXRpY2FsbHkKKy8vLyBzdXBwb3J0ZWQsIGlmIHlvdSBoYW5kbGUgb25lIG9mIHRoZWlyIHN1cGVyY2xhc3Nlcy4KKy8vLworLy8vIFRoZSBvcHRpb25hbCBzZWNvbmQgdGVtcGxhdGUgYXJndW1lbnQgc3BlY2lmaWVzIHRoZSB0eXBlIHRoYXQgaW5zdHJ1Y3Rpb24KKy8vLyB2aXNpdGF0aW9uIGZ1bmN0aW9ucyBzaG91bGQgcmV0dXJuLiBJZiB5b3Ugc3BlY2lmeSB0aGlzLCB5b3UgKk1VU1QqIHByb3ZpZGUKKy8vLyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB2aXNpdEluc3RydWN0aW9uIHRob3VnaCEuCisvLy8KKy8vLyBOb3RlIHRoYXQgdGhpcyBjbGFzcyBpcyBzcGVjaWZpY2FsbHkgZGVzaWduZWQgYXMgYSB0ZW1wbGF0ZSB0byBhdm9pZAorLy8vIHZpcnR1YWwgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZC4gIERlZmluaW5nIGFuZCB1c2luZyBhbiBJbnN0VmlzaXRvciBpcyBqdXN0CisvLy8gYXMgZWZmaWNpZW50IGFzIGhhdmluZyB5b3VyIG93biBzd2l0Y2ggc3RhdGVtZW50IG92ZXIgdGhlIGluc3RydWN0aW9uCisvLy8gb3Bjb2RlLgordGVtcGxhdGU8dHlwZW5hbWUgU3ViQ2xhc3MsIHR5cGVuYW1lIFJldFR5PXZvaWQ+CitjbGFzcyBJbnN0VmlzaXRvciB7CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBJbnRlcmZhY2UgY29kZSAtIFRoaXMgaXMgdGhlIHB1YmxpYyBpbnRlcmZhY2Ugb2YgdGhlIEluc3RWaXNpdG9yIHRoYXQgeW91CisgIC8vIHVzZSB0byB2aXNpdCBpbnN0cnVjdGlvbnMuLi4KKyAgLy8KKworcHVibGljOgorICAvLyBHZW5lcmljIHZpc2l0IG1ldGhvZCAtIEFsbG93IHZpc2l0YXRpb24gdG8gYWxsIGluc3RydWN0aW9ucyBpbiBhIHJhbmdlCisgIHRlbXBsYXRlPGNsYXNzIEl0ZXJhdG9yPgorICB2b2lkIHZpc2l0KEl0ZXJhdG9yIFN0YXJ0LCBJdGVyYXRvciBFbmQpIHsKKyAgICB3aGlsZSAoU3RhcnQgIT0gRW5kKQorICAgICAgc3RhdGljX2Nhc3Q8U3ViQ2xhc3MqPih0aGlzKS0+dmlzaXQoKlN0YXJ0KyspOworICB9CisKKyAgLy8gRGVmaW5lIHZpc2l0b3JzIGZvciBmdW5jdGlvbnMgYW5kIGJhc2ljIGJsb2Nrcy4uLgorICAvLworICB2b2lkIHZpc2l0KE1vZHVsZSAmTSkgeworICAgIHN0YXRpY19jYXN0PFN1YkNsYXNzKj4odGhpcyktPnZpc2l0TW9kdWxlKE0pOworICAgIHZpc2l0KE0uYmVnaW4oKSwgTS5lbmQoKSk7CisgIH0KKyAgdm9pZCB2aXNpdChGdW5jdGlvbiAmRikgeworICAgIHN0YXRpY19jYXN0PFN1YkNsYXNzKj4odGhpcyktPnZpc2l0RnVuY3Rpb24oRik7CisgICAgdmlzaXQoRi5iZWdpbigpLCBGLmVuZCgpKTsKKyAgfQorICB2b2lkIHZpc2l0KEJhc2ljQmxvY2sgJkJCKSB7CisgICAgc3RhdGljX2Nhc3Q8U3ViQ2xhc3MqPih0aGlzKS0+dmlzaXRCYXNpY0Jsb2NrKEJCKTsKKyAgICB2aXNpdChCQi5iZWdpbigpLCBCQi5lbmQoKSk7CisgIH0KKworICAvLyBGb3J3YXJkaW5nIGZ1bmN0aW9ucyBzbyB0aGF0IHRoZSB1c2VyIGNhbiB2aXNpdCB3aXRoIHBvaW50ZXJzIEFORCByZWZzLgorICB2b2lkIHZpc2l0KE1vZHVsZSAgICAgICAqTSkgIHsgdmlzaXQoKk0pOyB9CisgIHZvaWQgdmlzaXQoRnVuY3Rpb24gICAgICpGKSAgeyB2aXNpdCgqRik7IH0KKyAgdm9pZCB2aXNpdChCYXNpY0Jsb2NrICAgKkJCKSB7IHZpc2l0KCpCQik7IH0KKyAgUmV0VHkgdmlzaXQoSW5zdHJ1Y3Rpb24gKkkpICB7IHJldHVybiB2aXNpdCgqSSk7IH0KKworICAvLyB2aXNpdCAtIEZpbmFsbHksIGNvZGUgdG8gdmlzaXQgYW4gaW5zdHJ1Y3Rpb24uLi4KKyAgLy8KKyAgUmV0VHkgdmlzaXQoSW5zdHJ1Y3Rpb24gJkkpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfYmFzZV9vZjxJbnN0VmlzaXRvciwgU3ViQ2xhc3M+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJNdXN0IHBhc3MgdGhlIGRlcml2ZWQgdHlwZSB0byB0aGlzIHRlbXBsYXRlISIpOworCisgICAgc3dpdGNoIChJLmdldE9wY29kZSgpKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBpbnN0cnVjdGlvbiB0eXBlIGVuY291bnRlcmVkISIpOworICAgICAgLy8gQnVpbGQgdGhlIHN3aXRjaCBzdGF0ZW1lbnQgdXNpbmcgdGhlIEluc3RydWN0aW9uLmRlZiBmaWxlLi4uCisjZGVmaW5lIEhBTkRMRV9JTlNUKE5VTSwgT1BDT0RFLCBDTEFTUykgXAorICAgIGNhc2UgSW5zdHJ1Y3Rpb246Ok9QQ09ERTogcmV0dXJuIFwKKyAgICAgICAgICAgc3RhdGljX2Nhc3Q8U3ViQ2xhc3MqPih0aGlzKS0+IFwKKyAgICAgICAgICAgICAgICAgICAgICB2aXNpdCMjT1BDT0RFKHN0YXRpY19jYXN0PENMQVNTJj4oSSkpOworI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uZGVmIgorICAgIH0KKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBWaXNpdGF0aW9uIGZ1bmN0aW9ucy4uLiB0aGVzZSBmdW5jdGlvbnMgcHJvdmlkZSBkZWZhdWx0IGZhbGxiYWNrcyBpbiBjYXNlCisgIC8vIHRoZSB1c2VyIGRvZXMgbm90IHNwZWNpZnkgd2hhdCB0byBkbyBmb3IgYSBwYXJ0aWN1bGFyIGluc3RydWN0aW9uIHR5cGUuCisgIC8vIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGdlbmVyYWxpemUgdGhlIGluc3RydWN0aW9uIHR5cGUgdG8gaXRzIHN1YnR5cGUKKyAgLy8gYW5kIHRyeSB2aXNpdGluZyB0aGUgc3VidHlwZS4gIEFsbCBvZiB0aGlzIHNob3VsZCBiZSBpbmxpbmVkIHBlcmZlY3RseSwKKyAgLy8gYmVjYXVzZSB0aGVyZSBhcmUgbm8gdmlydHVhbCBmdW5jdGlvbnMgdG8gZ2V0IGluIHRoZSB3YXkuCisgIC8vCisKKyAgLy8gV2hlbiB2aXNpdGluZyBhIG1vZHVsZSwgZnVuY3Rpb24gb3IgYmFzaWMgYmxvY2sgZGlyZWN0bHksIHRoZXNlIG1ldGhvZHMgZ2V0CisgIC8vIGNhbGxlZCB0byBpbmRpY2F0ZSB3aGVuIHRyYW5zaXRpb25pbmcgaW50byBhIG5ldyB1bml0LgorICAvLworICB2b2lkIHZpc2l0TW9kdWxlICAgIChNb2R1bGUgJk0pIHt9CisgIHZvaWQgdmlzaXRGdW5jdGlvbiAgKEZ1bmN0aW9uICZGKSB7fQorICB2b2lkIHZpc2l0QmFzaWNCbG9jayhCYXNpY0Jsb2NrICZCQikge30KKworICAvLyBEZWZpbmUgaW5zdHJ1Y3Rpb24gc3BlY2lmaWMgdmlzaXRvciBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgb3ZlcnJpZGRlbiB0bworICAvLyBoYW5kbGUgU1BFQ0lGSUMgaW5zdHJ1Y3Rpb25zLiAgVGhlc2UgZnVuY3Rpb25zIGF1dG9tYXRpY2FsbHkgZGVmaW5lCisgIC8vIHZpc2l0TXVsIHRvIHByb3h5IHRvIHZpc2l0QmluYXJ5T3BlcmF0b3IgZm9yIGluc3RhbmNlIGluIGNhc2UgdGhlIHVzZXIgZG9lcworICAvLyBub3QgbmVlZCB0aGlzIGdlbmVyYWxpdHkuCisgIC8vCisgIC8vIFRoZXNlIGZ1bmN0aW9ucyBjYW4gYWxzbyBpbXBsZW1lbnQgZmFuLW91dCwgd2hlbiBhIHNpbmdsZSBvcGNvZGUgYW5kCisgIC8vIGluc3RydWN0aW9uIGhhdmUgbXVsdGlwbGUgbW9yZSBzcGVjaWZpYyBJbnN0cnVjdGlvbiBzdWJjbGFzc2VzLiBUaGUgQ2FsbAorICAvLyBpbnN0cnVjdGlvbiBjdXJyZW50bHkgc3VwcG9ydHMgdGhpcy4gV2UgaW1wbGVtZW50IHRoYXQgYnkgcmVkaXJlY3RpbmcgdGhhdAorICAvLyBpbnN0cnVjdGlvbiB0byBhIHNwZWNpYWwgZGVsZWdhdGlvbiBoZWxwZXIuCisjZGVmaW5lIEhBTkRMRV9JTlNUKE5VTSwgT1BDT0RFLCBDTEFTUykgXAorICAgIFJldFR5IHZpc2l0IyNPUENPREUoQ0xBU1MgJkkpIHsgXAorICAgICAgaWYgKE5VTSA9PSBJbnN0cnVjdGlvbjo6Q2FsbCkgXAorICAgICAgICByZXR1cm4gZGVsZWdhdGVDYWxsSW5zdChJKTsgXAorICAgICAgZWxzZSBcCisgICAgICAgIERFTEVHQVRFKENMQVNTKTsgXAorICAgIH0KKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmRlZiIKKworICAvLyBTcGVjaWZpYyBJbnN0cnVjdGlvbiB0eXBlIGNsYXNzZXMuLi4gbm90ZSB0aGF0IGFsbCBvZiB0aGUgY2FzdHMgYXJlCisgIC8vIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIHVzZSB0aGUgaW5zdHJ1Y3Rpb24gY2xhc3NlcyBhcyBvcGFxdWUgdHlwZXMuLi4KKyAgLy8KKyAgUmV0VHkgdmlzaXRSZXR1cm5JbnN0KFJldHVybkluc3QgJkkpICAgICAgICAgICAgeyBERUxFR0FURShUZXJtaW5hdG9ySW5zdCk7fQorICBSZXRUeSB2aXNpdEJyYW5jaEluc3QoQnJhbmNoSW5zdCAmSSkgICAgICAgICAgICB7IERFTEVHQVRFKFRlcm1pbmF0b3JJbnN0KTt9CisgIFJldFR5IHZpc2l0U3dpdGNoSW5zdChTd2l0Y2hJbnN0ICZJKSAgICAgICAgICAgIHsgREVMRUdBVEUoVGVybWluYXRvckluc3QpO30KKyAgUmV0VHkgdmlzaXRJbmRpcmVjdEJySW5zdChJbmRpcmVjdEJySW5zdCAmSSkgICAgeyBERUxFR0FURShUZXJtaW5hdG9ySW5zdCk7fQorICBSZXRUeSB2aXNpdFJlc3VtZUluc3QoUmVzdW1lSW5zdCAmSSkgICAgICAgICAgICB7IERFTEVHQVRFKFRlcm1pbmF0b3JJbnN0KTt9CisgIFJldFR5IHZpc2l0VW5yZWFjaGFibGVJbnN0KFVucmVhY2hhYmxlSW5zdCAmSSkgIHsgREVMRUdBVEUoVGVybWluYXRvckluc3QpO30KKyAgUmV0VHkgdmlzaXRDbGVhbnVwUmV0dXJuSW5zdChDbGVhbnVwUmV0dXJuSW5zdCAmSSkgeyBERUxFR0FURShUZXJtaW5hdG9ySW5zdCk7fQorICBSZXRUeSB2aXNpdENhdGNoUmV0dXJuSW5zdChDYXRjaFJldHVybkluc3QgJkkpICB7IERFTEVHQVRFKFRlcm1pbmF0b3JJbnN0KTsgfQorICBSZXRUeSB2aXNpdENhdGNoU3dpdGNoSW5zdChDYXRjaFN3aXRjaEluc3QgJkkpICB7IERFTEVHQVRFKFRlcm1pbmF0b3JJbnN0KTt9CisgIFJldFR5IHZpc2l0SUNtcEluc3QoSUNtcEluc3QgJkkpICAgICAgICAgICAgICAgIHsgREVMRUdBVEUoQ21wSW5zdCk7fQorICBSZXRUeSB2aXNpdEZDbXBJbnN0KEZDbXBJbnN0ICZJKSAgICAgICAgICAgICAgICB7IERFTEVHQVRFKENtcEluc3QpO30KKyAgUmV0VHkgdmlzaXRBbGxvY2FJbnN0KEFsbG9jYUluc3QgJkkpICAgICAgICAgICAgeyBERUxFR0FURShVbmFyeUluc3RydWN0aW9uKTt9CisgIFJldFR5IHZpc2l0TG9hZEluc3QoTG9hZEluc3QgICAgICZJKSAgICAgICAgICAgIHsgREVMRUdBVEUoVW5hcnlJbnN0cnVjdGlvbik7fQorICBSZXRUeSB2aXNpdFN0b3JlSW5zdChTdG9yZUluc3QgICAmSSkgICAgICAgICAgICB7IERFTEVHQVRFKEluc3RydWN0aW9uKTt9CisgIFJldFR5IHZpc2l0QXRvbWljQ21wWGNoZ0luc3QoQXRvbWljQ21wWGNoZ0luc3QgJkkpIHsgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pO30KKyAgUmV0VHkgdmlzaXRBdG9taWNSTVdJbnN0KEF0b21pY1JNV0luc3QgJkkpICAgICAgeyBERUxFR0FURShJbnN0cnVjdGlvbik7fQorICBSZXRUeSB2aXNpdEZlbmNlSW5zdChGZW5jZUluc3QgICAmSSkgICAgICAgICAgICB7IERFTEVHQVRFKEluc3RydWN0aW9uKTt9CisgIFJldFR5IHZpc2l0R2V0RWxlbWVudFB0ckluc3QoR2V0RWxlbWVudFB0ckluc3QgJkkpeyBERUxFR0FURShJbnN0cnVjdGlvbik7fQorICBSZXRUeSB2aXNpdFBISU5vZGUoUEhJTm9kZSAgICAgICAmSSkgICAgICAgICAgICB7IERFTEVHQVRFKEluc3RydWN0aW9uKTt9CisgIFJldFR5IHZpc2l0VHJ1bmNJbnN0KFRydW5jSW5zdCAmSSkgICAgICAgICAgICAgIHsgREVMRUdBVEUoQ2FzdEluc3QpO30KKyAgUmV0VHkgdmlzaXRaRXh0SW5zdChaRXh0SW5zdCAmSSkgICAgICAgICAgICAgICAgeyBERUxFR0FURShDYXN0SW5zdCk7fQorICBSZXRUeSB2aXNpdFNFeHRJbnN0KFNFeHRJbnN0ICZJKSAgICAgICAgICAgICAgICB7IERFTEVHQVRFKENhc3RJbnN0KTt9CisgIFJldFR5IHZpc2l0RlBUcnVuY0luc3QoRlBUcnVuY0luc3QgJkkpICAgICAgICAgIHsgREVMRUdBVEUoQ2FzdEluc3QpO30KKyAgUmV0VHkgdmlzaXRGUEV4dEluc3QoRlBFeHRJbnN0ICZJKSAgICAgICAgICAgICAgeyBERUxFR0FURShDYXN0SW5zdCk7fQorICBSZXRUeSB2aXNpdEZQVG9VSUluc3QoRlBUb1VJSW5zdCAmSSkgICAgICAgICAgICB7IERFTEVHQVRFKENhc3RJbnN0KTt9CisgIFJldFR5IHZpc2l0RlBUb1NJSW5zdChGUFRvU0lJbnN0ICZJKSAgICAgICAgICAgIHsgREVMRUdBVEUoQ2FzdEluc3QpO30KKyAgUmV0VHkgdmlzaXRVSVRvRlBJbnN0KFVJVG9GUEluc3QgJkkpICAgICAgICAgICAgeyBERUxFR0FURShDYXN0SW5zdCk7fQorICBSZXRUeSB2aXNpdFNJVG9GUEluc3QoU0lUb0ZQSW5zdCAmSSkgICAgICAgICAgICB7IERFTEVHQVRFKENhc3RJbnN0KTt9CisgIFJldFR5IHZpc2l0UHRyVG9JbnRJbnN0KFB0clRvSW50SW5zdCAmSSkgICAgICAgIHsgREVMRUdBVEUoQ2FzdEluc3QpO30KKyAgUmV0VHkgdmlzaXRJbnRUb1B0ckluc3QoSW50VG9QdHJJbnN0ICZJKSAgICAgICAgeyBERUxFR0FURShDYXN0SW5zdCk7fQorICBSZXRUeSB2aXNpdEJpdENhc3RJbnN0KEJpdENhc3RJbnN0ICZJKSAgICAgICAgICB7IERFTEVHQVRFKENhc3RJbnN0KTt9CisgIFJldFR5IHZpc2l0QWRkclNwYWNlQ2FzdEluc3QoQWRkclNwYWNlQ2FzdEluc3QgJkkpIHsgREVMRUdBVEUoQ2FzdEluc3QpO30KKyAgUmV0VHkgdmlzaXRTZWxlY3RJbnN0KFNlbGVjdEluc3QgJkkpICAgICAgICAgICAgeyBERUxFR0FURShJbnN0cnVjdGlvbik7fQorICBSZXRUeSB2aXNpdFZBQXJnSW5zdChWQUFyZ0luc3QgICAmSSkgICAgICAgICAgICB7IERFTEVHQVRFKFVuYXJ5SW5zdHJ1Y3Rpb24pO30KKyAgUmV0VHkgdmlzaXRFeHRyYWN0RWxlbWVudEluc3QoRXh0cmFjdEVsZW1lbnRJbnN0ICZJKSB7IERFTEVHQVRFKEluc3RydWN0aW9uKTt9CisgIFJldFR5IHZpc2l0SW5zZXJ0RWxlbWVudEluc3QoSW5zZXJ0RWxlbWVudEluc3QgJkkpIHsgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pO30KKyAgUmV0VHkgdmlzaXRTaHVmZmxlVmVjdG9ySW5zdChTaHVmZmxlVmVjdG9ySW5zdCAmSSkgeyBERUxFR0FURShJbnN0cnVjdGlvbik7fQorICBSZXRUeSB2aXNpdEV4dHJhY3RWYWx1ZUluc3QoRXh0cmFjdFZhbHVlSW5zdCAmSSl7IERFTEVHQVRFKFVuYXJ5SW5zdHJ1Y3Rpb24pO30KKyAgUmV0VHkgdmlzaXRJbnNlcnRWYWx1ZUluc3QoSW5zZXJ0VmFsdWVJbnN0ICZJKSAgeyBERUxFR0FURShJbnN0cnVjdGlvbik7IH0KKyAgUmV0VHkgdmlzaXRMYW5kaW5nUGFkSW5zdChMYW5kaW5nUGFkSW5zdCAmSSkgICAgeyBERUxFR0FURShJbnN0cnVjdGlvbik7IH0KKyAgUmV0VHkgdmlzaXRGdW5jbGV0UGFkSW5zdChGdW5jbGV0UGFkSW5zdCAmSSkgeyBERUxFR0FURShJbnN0cnVjdGlvbik7IH0KKyAgUmV0VHkgdmlzaXRDbGVhbnVwUGFkSW5zdChDbGVhbnVwUGFkSW5zdCAmSSkgeyBERUxFR0FURShGdW5jbGV0UGFkSW5zdCk7IH0KKyAgUmV0VHkgdmlzaXRDYXRjaFBhZEluc3QoQ2F0Y2hQYWRJbnN0ICZJKSAgICAgeyBERUxFR0FURShGdW5jbGV0UGFkSW5zdCk7IH0KKworICAvLyBIYW5kbGUgdGhlIHNwZWNpYWwgaW5zdHJpbnNpYyBpbnN0cnVjdGlvbiBjbGFzc2VzLgorICBSZXRUeSB2aXNpdERiZ0RlY2xhcmVJbnN0KERiZ0RlY2xhcmVJbnN0ICZJKSAgICB7IERFTEVHQVRFKERiZ0luZm9JbnRyaW5zaWMpO30KKyAgUmV0VHkgdmlzaXREYmdWYWx1ZUluc3QoRGJnVmFsdWVJbnN0ICZJKSAgICAgICAgeyBERUxFR0FURShEYmdJbmZvSW50cmluc2ljKTt9CisgIFJldFR5IHZpc2l0RGJnSW5mb0ludHJpbnNpYyhEYmdJbmZvSW50cmluc2ljICZJKSB7IERFTEVHQVRFKEludHJpbnNpY0luc3QpOyB9CisgIFJldFR5IHZpc2l0TWVtU2V0SW5zdChNZW1TZXRJbnN0ICZJKSAgICAgICAgICAgIHsgREVMRUdBVEUoTWVtSW50cmluc2ljKTsgfQorICBSZXRUeSB2aXNpdE1lbUNweUluc3QoTWVtQ3B5SW5zdCAmSSkgICAgICAgICAgICB7IERFTEVHQVRFKE1lbVRyYW5zZmVySW5zdCk7IH0KKyAgUmV0VHkgdmlzaXRNZW1Nb3ZlSW5zdChNZW1Nb3ZlSW5zdCAmSSkgICAgICAgICAgeyBERUxFR0FURShNZW1UcmFuc2Zlckluc3QpOyB9CisgIFJldFR5IHZpc2l0TWVtVHJhbnNmZXJJbnN0KE1lbVRyYW5zZmVySW5zdCAmSSkgIHsgREVMRUdBVEUoTWVtSW50cmluc2ljKTsgfQorICBSZXRUeSB2aXNpdE1lbUludHJpbnNpYyhNZW1JbnRyaW5zaWMgJkkpICAgICAgICB7IERFTEVHQVRFKEludHJpbnNpY0luc3QpOyB9CisgIFJldFR5IHZpc2l0VkFTdGFydEluc3QoVkFTdGFydEluc3QgJkkpICAgICAgICAgIHsgREVMRUdBVEUoSW50cmluc2ljSW5zdCk7IH0KKyAgUmV0VHkgdmlzaXRWQUVuZEluc3QoVkFFbmRJbnN0ICZJKSAgICAgICAgICAgICAgeyBERUxFR0FURShJbnRyaW5zaWNJbnN0KTsgfQorICBSZXRUeSB2aXNpdFZBQ29weUluc3QoVkFDb3B5SW5zdCAmSSkgICAgICAgICAgICB7IERFTEVHQVRFKEludHJpbnNpY0luc3QpOyB9CisgIFJldFR5IHZpc2l0SW50cmluc2ljSW5zdChJbnRyaW5zaWNJbnN0ICZJKSAgICAgIHsgREVMRUdBVEUoQ2FsbEluc3QpOyB9CisKKyAgLy8gQ2FsbCBhbmQgSW52b2tlIGFyZSBzbGlnaHRseSBkaWZmZXJlbnQgYXMgdGhleSBkZWxlZ2F0ZSBmaXJzdCB0aHJvdWdoCisgIC8vIGEgZ2VuZXJpYyBDYWxsU2l0ZSB2aXNpdG9yLgorICBSZXRUeSB2aXNpdENhbGxJbnN0KENhbGxJbnN0ICZJKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN1YkNsYXNzKj4odGhpcyktPnZpc2l0Q2FsbFNpdGUoJkkpOworICB9CisgIFJldFR5IHZpc2l0SW52b2tlSW5zdChJbnZva2VJbnN0ICZJKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFN1YkNsYXNzKj4odGhpcyktPnZpc2l0Q2FsbFNpdGUoJkkpOworICB9CisKKyAgLy8gTmV4dCBsZXZlbCBwcm9wYWdhdG9yczogSWYgdGhlIHVzZXIgZG9lcyBub3Qgb3ZlcmxvYWQgYSBzcGVjaWZpYworICAvLyBpbnN0cnVjdGlvbiB0eXBlLCB0aGV5IGNhbiBvdmVybG9hZCBvbmUgb2YgdGhlc2UgdG8gZ2V0IHRoZSB3aG9sZSBjbGFzcworICAvLyBvZiBpbnN0cnVjdGlvbnMuLi4KKyAgLy8KKyAgUmV0VHkgdmlzaXRDYXN0SW5zdChDYXN0SW5zdCAmSSkgICAgICAgICAgICAgICAgeyBERUxFR0FURShVbmFyeUluc3RydWN0aW9uKTt9CisgIFJldFR5IHZpc2l0QmluYXJ5T3BlcmF0b3IoQmluYXJ5T3BlcmF0b3IgJkkpICAgIHsgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pO30KKyAgUmV0VHkgdmlzaXRDbXBJbnN0KENtcEluc3QgJkkpICAgICAgICAgICAgICAgICAgeyBERUxFR0FURShJbnN0cnVjdGlvbik7fQorICBSZXRUeSB2aXNpdFRlcm1pbmF0b3JJbnN0KFRlcm1pbmF0b3JJbnN0ICZJKSAgICB7IERFTEVHQVRFKEluc3RydWN0aW9uKTt9CisgIFJldFR5IHZpc2l0VW5hcnlJbnN0cnVjdGlvbihVbmFyeUluc3RydWN0aW9uICZJKXsgREVMRUdBVEUoSW5zdHJ1Y3Rpb24pO30KKworICAvLyBQcm92aWRlIGEgc3BlY2lhbCB2aXNpdG9yIGZvciBhICdjYWxsc2l0ZScgdGhhdCB2aXNpdHMgYm90aCBjYWxscyBhbmQKKyAgLy8gaW52b2tlcy4gV2hlbiB1bmltcGxlbWVudGVkLCBwcm9wZXJseSBkZWxlZ2F0ZXMgdG8gZWl0aGVyIHRoZSB0ZXJtaW5hdG9yIG9yCisgIC8vIHJlZ3VsYXIgaW5zdHJ1Y3Rpb24gdmlzaXRvci4KKyAgUmV0VHkgdmlzaXRDYWxsU2l0ZShDYWxsU2l0ZSBDUykgeworICAgIGFzc2VydChDUyk7CisgICAgSW5zdHJ1Y3Rpb24gJkkgPSAqQ1MuZ2V0SW5zdHJ1Y3Rpb24oKTsKKyAgICBpZiAoQ1MuaXNDYWxsKCkpCisgICAgICBERUxFR0FURShJbnN0cnVjdGlvbik7CisKKyAgICBhc3NlcnQoQ1MuaXNJbnZva2UoKSk7CisgICAgREVMRUdBVEUoVGVybWluYXRvckluc3QpOworICB9CisKKyAgLy8gSWYgdGhlIHVzZXIgd2FudHMgYSAnZGVmYXVsdCcgY2FzZSwgdGhleSBjYW4gY2hvb3NlIHRvIG92ZXJyaWRlIHRoaXMKKyAgLy8gZnVuY3Rpb24uICBJZiB0aGlzIGZ1bmN0aW9uIGlzIG5vdCBvdmVybG9hZGVkIGluIHRoZSB1c2VyJ3Mgc3ViY2xhc3MsIHRoZW4KKyAgLy8gdGhpcyBpbnN0cnVjdGlvbiBqdXN0IGdldHMgaWdub3JlZC4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IHlvdSBNVVNUIG92ZXJyaWRlIHRoaXMgZnVuY3Rpb24gaWYgeW91ciByZXR1cm4gdHlwZSBpcyBub3Qgdm9pZC4KKyAgLy8KKyAgdm9pZCB2aXNpdEluc3RydWN0aW9uKEluc3RydWN0aW9uICZJKSB7fSAgLy8gSWdub3JlIHVuaGFuZGxlZCBpbnN0cnVjdGlvbnMKKworcHJpdmF0ZToKKyAgLy8gU3BlY2lhbCBoZWxwZXIgZnVuY3Rpb24gdG8gZGVsZWdhdGUgdG8gQ2FsbEluc3Qgc3ViY2xhc3MgdmlzaXRvcnMuCisgIFJldFR5IGRlbGVnYXRlQ2FsbEluc3QoQ2FsbEluc3QgJkkpIHsKKyAgICBpZiAoY29uc3QgRnVuY3Rpb24gKkYgPSBJLmdldENhbGxlZEZ1bmN0aW9uKCkpIHsKKyAgICAgIHN3aXRjaCAoRi0+Z2V0SW50cmluc2ljSUQoKSkgeworICAgICAgZGVmYXVsdDogICAgICAgICAgICAgICAgICAgICBERUxFR0FURShJbnRyaW5zaWNJbnN0KTsKKyAgICAgIGNhc2UgSW50cmluc2ljOjpkYmdfZGVjbGFyZTogREVMRUdBVEUoRGJnRGVjbGFyZUluc3QpOworICAgICAgY2FzZSBJbnRyaW5zaWM6OmRiZ192YWx1ZTogICBERUxFR0FURShEYmdWYWx1ZUluc3QpOworICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbWNweTogICAgICBERUxFR0FURShNZW1DcHlJbnN0KTsKKyAgICAgIGNhc2UgSW50cmluc2ljOjptZW1tb3ZlOiAgICAgREVMRUdBVEUoTWVtTW92ZUluc3QpOworICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbXNldDogICAgICBERUxFR0FURShNZW1TZXRJbnN0KTsKKyAgICAgIGNhc2UgSW50cmluc2ljOjp2YXN0YXJ0OiAgICAgREVMRUdBVEUoVkFTdGFydEluc3QpOworICAgICAgY2FzZSBJbnRyaW5zaWM6OnZhZW5kOiAgICAgICBERUxFR0FURShWQUVuZEluc3QpOworICAgICAgY2FzZSBJbnRyaW5zaWM6OnZhY29weTogICAgICBERUxFR0FURShWQUNvcHlJbnN0KTsKKyAgICAgIGNhc2UgSW50cmluc2ljOjpub3RfaW50cmluc2ljOiBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgREVMRUdBVEUoQ2FsbEluc3QpOworICB9CisKKyAgLy8gQW4gb3ZlcmxvYWQgdGhhdCB3aWxsIG5ldmVyIGFjdHVhbGx5IGJlIGNhbGxlZCwgaXQgaXMgdXNlZCBvbmx5IGZyb20gZGVhZAorICAvLyBjb2RlIGluIHRoZSBkaXNwYXRjaGluZyBmcm9tIG9wY29kZXMgdG8gaW5zdHJ1Y3Rpb24gc3ViY2xhc3Nlcy4KKyAgUmV0VHkgZGVsZWdhdGVDYWxsSW5zdChJbnN0cnVjdGlvbiAmSSkgeworICAgIGxsdm1fdW5yZWFjaGFibGUoImRlbGVnYXRlQ2FsbEluc3QgY2FsbGVkIGZvciBub24tQ2FsbEluc3QiKTsKKyAgfQorfTsKKworI3VuZGVmIERFTEVHQVRFCisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnN0clR5cGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0luc3RyVHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjQzYzRjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnN0clR5cGVzLmgKQEAgLTAsMCArMSwxNjk0IEBACisvLz09PS0gbGx2bS9JbnN0clR5cGVzLmggLSBJbXBvcnRhbnQgSW5zdHJ1Y3Rpb24gc3ViY2xhc3NlcyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHZhcmlvdXMgbWV0YSBjbGFzc2VzIG9mIGluc3RydWN0aW9ucyB0aGF0IGV4aXN0IGluIHRoZSBWTQorLy8gcmVwcmVzZW50YXRpb24uICBTcGVjaWZpYyBjb25jcmV0ZSBzdWJjbGFzc2VzIG9mIHRoZXNlIG1heSBiZSBmb3VuZCBpbiB0aGUKKy8vIGkqLmggZmlsZXMuLi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfSU5TVFJUWVBFU19ICisjZGVmaW5lIExMVk1fSVJfSU5TVFJUWVBFU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvTExWTUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL09wZXJhbmRUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1VzZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXJtaW5hdG9ySW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFN1YmNsYXNzZXMgb2YgdGhpcyBjbGFzcyBhcmUgYWxsIGFibGUgdG8gdGVybWluYXRlIGEgYmFzaWMKKy8vLyBibG9jay4gVGh1cywgdGhlc2UgYXJlIGFsbCB0aGUgZmxvdyBjb250cm9sIHR5cGUgb2Ygb3BlcmF0aW9ucy4KKy8vLworY2xhc3MgVGVybWluYXRvckluc3QgOiBwdWJsaWMgSW5zdHJ1Y3Rpb24geworcHJvdGVjdGVkOgorICBUZXJtaW5hdG9ySW5zdChUeXBlICpUeSwgSW5zdHJ1Y3Rpb246OlRlcm1PcHMgaVR5cGUsCisgICAgICAgICAgICAgICAgIFVzZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMsCisgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKQorICAgIDogSW5zdHJ1Y3Rpb24oVHksIGlUeXBlLCBPcHMsIE51bU9wcywgSW5zZXJ0QmVmb3JlKSB7fQorCisgIFRlcm1pbmF0b3JJbnN0KFR5cGUgKlR5LCBJbnN0cnVjdGlvbjo6VGVybU9wcyBpVHlwZSwKKyAgICAgICAgICAgICAgICAgVXNlICpPcHMsIHVuc2lnbmVkIE51bU9wcywgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpCisgICAgOiBJbnN0cnVjdGlvbihUeSwgaVR5cGUsIE9wcywgTnVtT3BzLCBJbnNlcnRBdEVuZCkge30KKworcHVibGljOgorICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2Ygc3VjY2Vzc29ycyB0aGF0IHRoaXMgdGVybWluYXRvciBoYXMuCisgIHVuc2lnbmVkIGdldE51bVN1Y2Nlc3NvcnMoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBzcGVjaWZpZWQgc3VjY2Vzc29yLgorICBCYXNpY0Jsb2NrICpnZXRTdWNjZXNzb3IodW5zaWduZWQgaWR4KSBjb25zdDsKKworICAvLy8gVXBkYXRlIHRoZSBzcGVjaWZpZWQgc3VjY2Vzc29yIHRvIHBvaW50IGF0IHRoZSBwcm92aWRlZCBibG9jay4KKyAgdm9pZCBzZXRTdWNjZXNzb3IodW5zaWduZWQgaWR4LCBCYXNpY0Jsb2NrICpCKTsKKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmlzVGVybWluYXRvcigpOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorCisgIC8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhpcyB0ZXJtaW5hdG9yIHJlbGF0ZXMgdG8gZXhjZXB0aW9uIGhhbmRsaW5nLgorICBib29sIGlzRXhjZXB0aW9uYWwoKSBjb25zdCB7CisgICAgc3dpdGNoIChnZXRPcGNvZGUoKSkgeworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkNhdGNoU3dpdGNoOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkNhdGNoUmV0OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkNsZWFudXBSZXQ6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6SW52b2tlOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OlJlc3VtZToKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIHN1Y2NfaXRlcmF0b3IgZGVmaW5pdGlvbgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVGVybSwgY2xhc3MgQkI+IC8vIFN1Y2Nlc3NvciBJdGVyYXRvcgorICBjbGFzcyBTdWNjSXRlcmF0b3IgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50LCBCQiAqLCBCQiAqPiB7CisgICAgdXNpbmcgc3VwZXIgPQorICAgICAgICBzdGQ6Oml0ZXJhdG9yPHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIEJCLCBpbnQsIEJCICosIEJCICo+OworCisgIHB1YmxpYzoKKyAgICB1c2luZyBwb2ludGVyID0gdHlwZW5hbWUgc3VwZXI6OnBvaW50ZXI7CisgICAgdXNpbmcgcmVmZXJlbmNlID0gdHlwZW5hbWUgc3VwZXI6OnJlZmVyZW5jZTsKKworICBwcml2YXRlOgorICAgIFRlcm0gVGVybUluc3Q7CisgICAgdW5zaWduZWQgaWR4OworICAgIHVzaW5nIFNlbGYgPSBTdWNjSXRlcmF0b3I8VGVybSwgQkI+OworCisgICAgaW5saW5lIGJvb2wgaW5kZXhfaXNfdmFsaWQodW5zaWduZWQgaWR4KSB7CisgICAgICByZXR1cm4gaWR4IDwgVGVybUluc3QtPmdldE51bVN1Y2Nlc3NvcnMoKTsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIFByb3h5IG9iamVjdCB0byBhbGxvdyB3cml0ZSBhY2Nlc3MgaW4gb3BlcmF0b3JbXQorICAgIGNsYXNzIFN1Y2Nlc3NvclByb3h5IHsKKyAgICAgIFNlbGYgaXQ7CisKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdCBTdWNjZXNzb3JQcm94eShjb25zdCBTZWxmICZpdCkgOiBpdChpdCkge30KKworICAgICAgU3VjY2Vzc29yUHJveHkoY29uc3QgU3VjY2Vzc29yUHJveHkgJikgPSBkZWZhdWx0OworCisgICAgICBTdWNjZXNzb3JQcm94eSAmb3BlcmF0b3I9KFN1Y2Nlc3NvclByb3h5IHIpIHsKKyAgICAgICAgKnRoaXMgPSByZWZlcmVuY2Uocik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgU3VjY2Vzc29yUHJveHkgJm9wZXJhdG9yPShyZWZlcmVuY2UgcikgeworICAgICAgICBpdC5UZXJtSW5zdC0+c2V0U3VjY2Vzc29yKGl0LmlkeCwgcik7CisgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgIH0KKworICAgICAgb3BlcmF0b3IgcmVmZXJlbmNlKCkgY29uc3QgeyByZXR1cm4gKml0OyB9CisgICAgfTsKKworICBwdWJsaWM6CisgICAgLy8gYmVnaW4gaXRlcmF0b3IKKyAgICBleHBsaWNpdCBpbmxpbmUgU3VjY0l0ZXJhdG9yKFRlcm0gVCkgOiBUZXJtSW5zdChUKSwgaWR4KDApIHt9CisgICAgLy8gZW5kIGl0ZXJhdG9yCisgICAgaW5saW5lIFN1Y2NJdGVyYXRvcihUZXJtIFQsIGJvb2wpIDogVGVybUluc3QoVCkgeworICAgICAgaWYgKFRlcm1JbnN0KQorICAgICAgICBpZHggPSBUZXJtSW5zdC0+Z2V0TnVtU3VjY2Vzc29ycygpOworICAgICAgZWxzZQorICAgICAgICAvLyBUZXJtID09IE5VTEwgaGFwcGVucywgaWYgYSBiYXNpYyBibG9jayBpcyBub3QgZnVsbHkgY29uc3RydWN0ZWQgYW5kCisgICAgICAgIC8vIGNvbnNlcXVlbnRseSBnZXRUZXJtaW5hdG9yKCkgcmV0dXJucyBOVUxMLiBJbiB0aGlzIGNhc2Ugd2UgY29uc3RydWN0CisgICAgICAgIC8vIGEgU3VjY0l0ZXJhdG9yIHdoaWNoIGRlc2NyaWJlcyBhIGJhc2ljIGJsb2NrIHRoYXQgaGFzIHplcm8KKyAgICAgICAgLy8gc3VjY2Vzc29ycy4KKyAgICAgICAgLy8gRGVmaW5pbmcgU3VjY0l0ZXJhdG9yIGZvciBpbmNvbXBsZXRlIGFuZCBtYWxmb3JtZWQgQ0ZHcyBpcyBlc3BlY2lhbGx5CisgICAgICAgIC8vIHVzZWZ1bCBmb3IgZGVidWdnaW5nLgorICAgICAgICBpZHggPSAwOworICAgIH0KKworICAgIC8vLyBUaGlzIGlzIHVzZWQgdG8gaW50ZXJmYWNlIGJldHdlZW4gY29kZSB0aGF0IHdhbnRzIHRvCisgICAgLy8vIG9wZXJhdGUgb24gdGVybWluYXRvciBpbnN0cnVjdGlvbnMgZGlyZWN0bHkuCisgICAgdW5zaWduZWQgZ2V0U3VjY2Vzc29ySW5kZXgoKSBjb25zdCB7IHJldHVybiBpZHg7IH0KKworICAgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgU2VsZiAmeCkgY29uc3QgeyByZXR1cm4gaWR4ID09IHguaWR4OyB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTZWxmICZ4KSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3I9PSh4KTsgfQorCisgICAgaW5saW5lIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBUZXJtSW5zdC0+Z2V0U3VjY2Vzc29yKGlkeCk7IH0KKyAgICBpbmxpbmUgcG9pbnRlciBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gb3BlcmF0b3IqKCk7IH0KKworICAgIGlubGluZSBTZWxmICZvcGVyYXRvcisrKCkgeworICAgICAgKytpZHg7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfSAvLyBQcmVpbmNyZW1lbnQKKworICAgIGlubGluZSBTZWxmIG9wZXJhdG9yKysoaW50KSB7IC8vIFBvc3RpbmNyZW1lbnQKKyAgICAgIFNlbGYgdG1wID0gKnRoaXM7CisgICAgICArKyp0aGlzOworICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisKKyAgICBpbmxpbmUgU2VsZiAmb3BlcmF0b3ItLSgpIHsKKyAgICAgIC0taWR4OworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFByZWRlY3JlbWVudAorICAgIGlubGluZSBTZWxmIG9wZXJhdG9yLS0oaW50KSB7IC8vIFBvc3RkZWNyZW1lbnQKKyAgICAgIFNlbGYgdG1wID0gKnRoaXM7CisgICAgICAtLSp0aGlzOworICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisKKyAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgU2VsZiAmeCkgY29uc3QgeworICAgICAgYXNzZXJ0KFRlcm1JbnN0ID09IHguVGVybUluc3QgJiYKKyAgICAgICAgICAgICAiQ2Fubm90IGNvbXBhcmUgaXRlcmF0b3JzIG9mIGRpZmZlcmVudCBibG9ja3MhIik7CisgICAgICByZXR1cm4gaWR4IDwgeC5pZHg7CisgICAgfQorCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8PShjb25zdCBTZWxmICZ4KSBjb25zdCB7CisgICAgICBhc3NlcnQoVGVybUluc3QgPT0geC5UZXJtSW5zdCAmJgorICAgICAgICAgICAgICJDYW5ub3QgY29tcGFyZSBpdGVyYXRvcnMgb2YgZGlmZmVyZW50IGJsb2NrcyEiKTsKKyAgICAgIHJldHVybiBpZHggPD0geC5pZHg7CisgICAgfQorICAgIGlubGluZSBib29sIG9wZXJhdG9yPj0oY29uc3QgU2VsZiAmeCkgY29uc3QgeworICAgICAgYXNzZXJ0KFRlcm1JbnN0ID09IHguVGVybUluc3QgJiYKKyAgICAgICAgICAgICAiQ2Fubm90IGNvbXBhcmUgaXRlcmF0b3JzIG9mIGRpZmZlcmVudCBibG9ja3MhIik7CisgICAgICByZXR1cm4gaWR4ID49IHguaWR4OworICAgIH0KKworICAgIGlubGluZSBib29sIG9wZXJhdG9yPihjb25zdCBTZWxmICZ4KSBjb25zdCB7CisgICAgICBhc3NlcnQoVGVybUluc3QgPT0geC5UZXJtSW5zdCAmJgorICAgICAgICAgICAgICJDYW5ub3QgY29tcGFyZSBpdGVyYXRvcnMgb2YgZGlmZmVyZW50IGJsb2NrcyEiKTsKKyAgICAgIHJldHVybiBpZHggPiB4LmlkeDsKKyAgICB9CisKKyAgICBpbmxpbmUgU2VsZiAmb3BlcmF0b3IrPShpbnQgUmlnaHQpIHsKKyAgICAgIHVuc2lnbmVkIG5ld19pZHggPSBpZHggKyBSaWdodDsKKyAgICAgIGFzc2VydChpbmRleF9pc192YWxpZChuZXdfaWR4KSAmJiAiSXRlcmF0b3IgaW5kZXggb3V0IG9mIGJvdW5kIik7CisgICAgICBpZHggPSBuZXdfaWR4OworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGlubGluZSBTZWxmIG9wZXJhdG9yKyhpbnQgUmlnaHQpIGNvbnN0IHsKKyAgICAgIFNlbGYgdG1wID0gKnRoaXM7CisgICAgICB0bXAgKz0gUmlnaHQ7CisgICAgICByZXR1cm4gdG1wOworICAgIH0KKworICAgIGlubGluZSBTZWxmICZvcGVyYXRvci09KGludCBSaWdodCkgeyByZXR1cm4gb3BlcmF0b3IrPSgtUmlnaHQpOyB9CisKKyAgICBpbmxpbmUgU2VsZiBvcGVyYXRvci0oaW50IFJpZ2h0KSBjb25zdCB7IHJldHVybiBvcGVyYXRvcisoLVJpZ2h0KTsgfQorCisgICAgaW5saW5lIGludCBvcGVyYXRvci0oY29uc3QgU2VsZiAmeCkgY29uc3QgeworICAgICAgYXNzZXJ0KFRlcm1JbnN0ID09IHguVGVybUluc3QgJiYKKyAgICAgICAgICAgICAiQ2Fubm90IHdvcmsgb24gaXRlcmF0b3JzIG9mIGRpZmZlcmVudCBibG9ja3MhIik7CisgICAgICBpbnQgZGlzdGFuY2UgPSBpZHggLSB4LmlkeDsKKyAgICAgIHJldHVybiBkaXN0YW5jZTsKKyAgICB9CisKKyAgICBpbmxpbmUgU3VjY2Vzc29yUHJveHkgb3BlcmF0b3JbXShpbnQgb2Zmc2V0KSB7CisgICAgICBTZWxmIHRtcCA9ICp0aGlzOworICAgICAgdG1wICs9IG9mZnNldDsKKyAgICAgIHJldHVybiBTdWNjZXNzb3JQcm94eSh0bXApOworICAgIH0KKworICAgIC8vLyBHZXQgdGhlIHNvdXJjZSBCQiBvZiB0aGlzIGl0ZXJhdG9yLgorICAgIGlubGluZSBCQiAqZ2V0U291cmNlKCkgeworICAgICAgYXNzZXJ0KFRlcm1JbnN0ICYmICJTb3VyY2Ugbm90IGF2YWlsYWJsZSwgaWYgYmFzaWMgYmxvY2sgd2FzIG1hbGZvcm1lZCIpOworICAgICAgcmV0dXJuIFRlcm1JbnN0LT5nZXRQYXJlbnQoKTsKKyAgICB9CisgIH07CisKKyAgdXNpbmcgc3VjY19pdGVyYXRvciA9IFN1Y2NJdGVyYXRvcjxUZXJtaW5hdG9ySW5zdCAqLCBCYXNpY0Jsb2NrPjsKKyAgdXNpbmcgc3VjY19jb25zdF9pdGVyYXRvciA9CisgICAgICBTdWNjSXRlcmF0b3I8Y29uc3QgVGVybWluYXRvckluc3QgKiwgY29uc3QgQmFzaWNCbG9jaz47CisgIHVzaW5nIHN1Y2NfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxzdWNjX2l0ZXJhdG9yPjsKKyAgdXNpbmcgc3VjY19jb25zdF9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPHN1Y2NfY29uc3RfaXRlcmF0b3I+OworCitwcml2YXRlOgorICBpbmxpbmUgc3VjY19pdGVyYXRvciBzdWNjX2JlZ2luKCkgeyByZXR1cm4gc3VjY19pdGVyYXRvcih0aGlzKTsgfQorICBpbmxpbmUgc3VjY19jb25zdF9pdGVyYXRvciBzdWNjX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBzdWNjX2NvbnN0X2l0ZXJhdG9yKHRoaXMpOworICB9CisgIGlubGluZSBzdWNjX2l0ZXJhdG9yIHN1Y2NfZW5kKCkgeyByZXR1cm4gc3VjY19pdGVyYXRvcih0aGlzLCB0cnVlKTsgfQorICBpbmxpbmUgc3VjY19jb25zdF9pdGVyYXRvciBzdWNjX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3VjY19jb25zdF9pdGVyYXRvcih0aGlzLCB0cnVlKTsKKyAgfQorCitwdWJsaWM6CisgIGlubGluZSBzdWNjX3JhbmdlIHN1Y2Nlc3NvcnMoKSB7CisgICAgcmV0dXJuIHN1Y2NfcmFuZ2Uoc3VjY19iZWdpbigpLCBzdWNjX2VuZCgpKTsKKyAgfQorICBpbmxpbmUgc3VjY19jb25zdF9yYW5nZSBzdWNjZXNzb3JzKCkgY29uc3QgeworICAgIHJldHVybiBzdWNjX2NvbnN0X3JhbmdlKHN1Y2NfYmVnaW4oKSwgc3VjY19lbmQoKSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgVW5hcnlJbnN0cnVjdGlvbiBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgVW5hcnlJbnN0cnVjdGlvbiA6IHB1YmxpYyBJbnN0cnVjdGlvbiB7Citwcm90ZWN0ZWQ6CisgIFVuYXJ5SW5zdHJ1Y3Rpb24oVHlwZSAqVHksIHVuc2lnbmVkIGlUeXBlLCBWYWx1ZSAqViwKKyAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSUIgPSBudWxscHRyKQorICAgIDogSW5zdHJ1Y3Rpb24oVHksIGlUeXBlLCAmT3A8MD4oKSwgMSwgSUIpIHsKKyAgICBPcDwwPigpID0gVjsKKyAgfQorICBVbmFyeUluc3RydWN0aW9uKFR5cGUgKlR5LCB1bnNpZ25lZCBpVHlwZSwgVmFsdWUgKlYsIEJhc2ljQmxvY2sgKklBRSkKKyAgICA6IEluc3RydWN0aW9uKFR5LCBpVHlwZSwgJk9wPDA+KCksIDEsIElBRSkgeworICAgIE9wPDA+KCkgPSBWOworICB9CisKK3B1YmxpYzoKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgb25lIG9wZXJhbmQKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSB7CisgICAgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzLCAxKTsKKyAgfQorCisgIC8vLyBUcmFuc3BhcmVudGx5IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgZ2V0T3BlcmFuZCBtZXRob2RzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpBbGxvY2EgfHwKKyAgICAgICAgICAgSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkxvYWQgfHwKKyAgICAgICAgICAgSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlZBQXJnIHx8CisgICAgICAgICAgIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpFeHRyYWN0VmFsdWUgfHwKKyAgICAgICAgICAgKEktPmdldE9wY29kZSgpID49IENhc3RPcHNCZWdpbiAmJiBJLT5nZXRPcGNvZGUoKSA8IENhc3RPcHNFbmQpOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPFVuYXJ5SW5zdHJ1Y3Rpb24+IDoKKyAgcHVibGljIEZpeGVkTnVtT3BlcmFuZFRyYWl0czxVbmFyeUluc3RydWN0aW9uLCAxPiB7Cit9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVW5hcnlJbnN0cnVjdGlvbiwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpbmFyeU9wZXJhdG9yIENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBCaW5hcnlPcGVyYXRvciA6IHB1YmxpYyBJbnN0cnVjdGlvbiB7CisgIHZvaWQgQXNzZXJ0T0soKTsKKworcHJvdGVjdGVkOgorICBCaW5hcnlPcGVyYXRvcihCaW5hcnlPcHMgaVR5cGUsIFZhbHVlICpTMSwgVmFsdWUgKlMyLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUsIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpOworICBCaW5hcnlPcGVyYXRvcihCaW5hcnlPcHMgaVR5cGUsIFZhbHVlICpTMSwgVmFsdWUgKlMyLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgQmluYXJ5T3BlcmF0b3IgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIC8vIGFsbG9jYXRlIHNwYWNlIGZvciBleGFjdGx5IHR3byBvcGVyYW5kcworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDIpOworICB9CisKKyAgLy8vIFRyYW5zcGFyZW50bHkgcHJvdmlkZSBtb3JlIGVmZmljaWVudCBnZXRPcGVyYW5kIG1ldGhvZHMuCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworCisgIC8vLyBDb25zdHJ1Y3QgYSBiaW5hcnkgaW5zdHJ1Y3Rpb24sIGdpdmVuIHRoZSBvcGNvZGUgYW5kIHRoZSB0d28KKyAgLy8vIG9wZXJhbmRzLiAgT3B0aW9uYWxseSAoaWYgSW5zdEJlZm9yZSBpcyBzcGVjaWZpZWQpIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24KKyAgLy8vIGludG8gYSBCYXNpY0Jsb2NrIHJpZ2h0IGJlZm9yZSB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uLiAgVGhlIHNwZWNpZmllZAorICAvLy8gSW5zdHJ1Y3Rpb24gaXMgYWxsb3dlZCB0byBiZSBhIGRlcmVmZXJlbmNlZCBlbmQgaXRlcmF0b3IuCisgIC8vLworICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZShCaW5hcnlPcHMgT3AsIFZhbHVlICpTMSwgVmFsdWUgKlMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9IFR3aW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKworICAvLy8gQ29uc3RydWN0IGEgYmluYXJ5IGluc3RydWN0aW9uLCBnaXZlbiB0aGUgb3Bjb2RlIGFuZCB0aGUgdHdvCisgIC8vLyBvcGVyYW5kcy4gIEFsc28gYXV0b21hdGljYWxseSBpbnNlcnQgdGhpcyBpbnN0cnVjdGlvbiB0byB0aGUgZW5kIG9mIHRoZQorICAvLy8gQmFzaWNCbG9jayBzcGVjaWZpZWQuCisgIC8vLworICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZShCaW5hcnlPcHMgT3AsIFZhbHVlICpTMSwgVmFsdWUgKlMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIC8vLyBUaGVzZSBtZXRob2RzIGp1c3QgZm9yd2FyZCB0byBDcmVhdGUsIGFuZCBhcmUgdXNlZnVsIHdoZW4geW91CisgIC8vLyBzdGF0aWNhbGx5IGtub3cgd2hhdCB0eXBlIG9mIGluc3RydWN0aW9uIHlvdSdyZSBnb2luZyB0byBjcmVhdGUuICBUaGVzZQorICAvLy8gaGVscGVycyBqdXN0IHNhdmUgc29tZSB0eXBpbmcuCisjZGVmaW5lIEhBTkRMRV9CSU5BUllfSU5TVChOLCBPUEMsIENMQVNTKSBcCisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlIyNPUEMoVmFsdWUgKlYxLCBWYWx1ZSAqVjIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7XAorICAgIHJldHVybiBDcmVhdGUoSW5zdHJ1Y3Rpb246Ok9QQywgVjEsIFYyLCBOYW1lKTtcCisgIH0KKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmRlZiIKKyNkZWZpbmUgSEFORExFX0JJTkFSWV9JTlNUKE4sIE9QQywgQ0xBU1MpIFwKKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGUjI09QQyhWYWx1ZSAqVjEsIFZhbHVlICpWMiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lLCBCYXNpY0Jsb2NrICpCQikge1wKKyAgICByZXR1cm4gQ3JlYXRlKEluc3RydWN0aW9uOjpPUEMsIFYxLCBWMiwgTmFtZSwgQkIpO1wKKyAgfQorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uZGVmIgorI2RlZmluZSBIQU5ETEVfQklOQVJZX0lOU1QoTiwgT1BDLCBDTEFTUykgXAorICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZSMjT1BDKFZhbHVlICpWMSwgVmFsdWUgKlYyLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUsIEluc3RydWN0aW9uICpJKSB7XAorICAgIHJldHVybiBDcmVhdGUoSW5zdHJ1Y3Rpb246Ok9QQywgVjEsIFYyLCBOYW1lLCBJKTtcCisgIH0KKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmRlZiIKKworICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZVdpdGhDb3BpZWRGbGFncyhCaW5hcnlPcHMgT3BjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqVjEsIFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3IgKkNvcHlCTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIEJpbmFyeU9wZXJhdG9yICpCTyA9IENyZWF0ZShPcGMsIFYxLCBWMiwgTmFtZSk7CisgICAgQk8tPmNvcHlJUkZsYWdzKENvcHlCTyk7CisgICAgcmV0dXJuIEJPOworICB9CisKKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVGQWRkRk1GKFZhbHVlICpWMSwgVmFsdWUgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3IgKkZNRlNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlV2l0aENvcGllZEZsYWdzKEluc3RydWN0aW9uOjpGQWRkLCBWMSwgVjIsIEZNRlNvdXJjZSwgTmFtZSk7CisgIH0KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVGU3ViRk1GKFZhbHVlICpWMSwgVmFsdWUgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3IgKkZNRlNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlV2l0aENvcGllZEZsYWdzKEluc3RydWN0aW9uOjpGU3ViLCBWMSwgVjIsIEZNRlNvdXJjZSwgTmFtZSk7CisgIH0KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVGTXVsRk1GKFZhbHVlICpWMSwgVmFsdWUgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3IgKkZNRlNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlV2l0aENvcGllZEZsYWdzKEluc3RydWN0aW9uOjpGTXVsLCBWMSwgVjIsIEZNRlNvdXJjZSwgTmFtZSk7CisgIH0KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVGRGl2Rk1GKFZhbHVlICpWMSwgVmFsdWUgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3IgKkZNRlNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlV2l0aENvcGllZEZsYWdzKEluc3RydWN0aW9uOjpGRGl2LCBWMSwgVjIsIEZNRlNvdXJjZSwgTmFtZSk7CisgIH0KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVGUmVtRk1GKFZhbHVlICpWMSwgVmFsdWUgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3IgKkZNRlNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICByZXR1cm4gQ3JlYXRlV2l0aENvcGllZEZsYWdzKEluc3RydWN0aW9uOjpGUmVtLCBWMSwgVjIsIEZNRlNvdXJjZSwgTmFtZSk7CisgIH0KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVGTmVnRk1GKFZhbHVlICpPcCwgQmluYXJ5T3BlcmF0b3IgKkZNRlNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIpIHsKKyAgICBWYWx1ZSAqWmVybyA9IENvbnN0YW50RlA6OmdldE5lZ2F0aXZlWmVybyhPcC0+Z2V0VHlwZSgpKTsKKyAgICByZXR1cm4gQ3JlYXRlV2l0aENvcGllZEZsYWdzKEluc3RydWN0aW9uOjpGU3ViLCBaZXJvLCBPcCwgRk1GU291cmNlKTsKKyAgfQorCisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlTlNXKEJpbmFyeU9wcyBPcGMsIFZhbHVlICpWMSwgVmFsdWUgKlYyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQ3JlYXRlKE9wYywgVjEsIFYyLCBOYW1lKTsKKyAgICBCTy0+c2V0SGFzTm9TaWduZWRXcmFwKHRydWUpOworICAgIHJldHVybiBCTzsKKyAgfQorICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZU5TVyhCaW5hcnlPcHMgT3BjLCBWYWx1ZSAqVjEsIFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUsIEJhc2ljQmxvY2sgKkJCKSB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQ3JlYXRlKE9wYywgVjEsIFYyLCBOYW1lLCBCQik7CisgICAgQk8tPnNldEhhc05vU2lnbmVkV3JhcCh0cnVlKTsKKyAgICByZXR1cm4gQk87CisgIH0KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVOU1coQmluYXJ5T3BzIE9wYywgVmFsdWUgKlYxLCBWYWx1ZSAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lLCBJbnN0cnVjdGlvbiAqSSkgeworICAgIEJpbmFyeU9wZXJhdG9yICpCTyA9IENyZWF0ZShPcGMsIFYxLCBWMiwgTmFtZSwgSSk7CisgICAgQk8tPnNldEhhc05vU2lnbmVkV3JhcCh0cnVlKTsKKyAgICByZXR1cm4gQk87CisgIH0KKworICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZU5VVyhCaW5hcnlPcHMgT3BjLCBWYWx1ZSAqVjEsIFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeworICAgIEJpbmFyeU9wZXJhdG9yICpCTyA9IENyZWF0ZShPcGMsIFYxLCBWMiwgTmFtZSk7CisgICAgQk8tPnNldEhhc05vVW5zaWduZWRXcmFwKHRydWUpOworICAgIHJldHVybiBCTzsKKyAgfQorICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZU5VVyhCaW5hcnlPcHMgT3BjLCBWYWx1ZSAqVjEsIFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUsIEJhc2ljQmxvY2sgKkJCKSB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQ3JlYXRlKE9wYywgVjEsIFYyLCBOYW1lLCBCQik7CisgICAgQk8tPnNldEhhc05vVW5zaWduZWRXcmFwKHRydWUpOworICAgIHJldHVybiBCTzsKKyAgfQorICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZU5VVyhCaW5hcnlPcHMgT3BjLCBWYWx1ZSAqVjEsIFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUsIEluc3RydWN0aW9uICpJKSB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQ3JlYXRlKE9wYywgVjEsIFYyLCBOYW1lLCBJKTsKKyAgICBCTy0+c2V0SGFzTm9VbnNpZ25lZFdyYXAodHJ1ZSk7CisgICAgcmV0dXJuIEJPOworICB9CisKKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVFeGFjdChCaW5hcnlPcHMgT3BjLCBWYWx1ZSAqVjEsIFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKSB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQ3JlYXRlKE9wYywgVjEsIFYyLCBOYW1lKTsKKyAgICBCTy0+c2V0SXNFeGFjdCh0cnVlKTsKKyAgICByZXR1cm4gQk87CisgIH0KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVFeGFjdChCaW5hcnlPcHMgT3BjLCBWYWx1ZSAqVjEsIFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSwgQmFzaWNCbG9jayAqQkIpIHsKKyAgICBCaW5hcnlPcGVyYXRvciAqQk8gPSBDcmVhdGUoT3BjLCBWMSwgVjIsIE5hbWUsIEJCKTsKKyAgICBCTy0+c2V0SXNFeGFjdCh0cnVlKTsKKyAgICByZXR1cm4gQk87CisgIH0KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVFeGFjdChCaW5hcnlPcHMgT3BjLCBWYWx1ZSAqVjEsIFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSwgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICBCaW5hcnlPcGVyYXRvciAqQk8gPSBDcmVhdGUoT3BjLCBWMSwgVjIsIE5hbWUsIEkpOworICAgIEJPLT5zZXRJc0V4YWN0KHRydWUpOworICAgIHJldHVybiBCTzsKKyAgfQorCisjZGVmaW5lIERFRklORV9IRUxQRVJTKE9QQywgTlVXTlNXRVhBQ1QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZSMjTlVXTlNXRVhBQ1QjI09QQyhWYWx1ZSAqVjEsIFZhbHVlICpWMiwgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIikgeyAgICBcCisgICAgcmV0dXJuIENyZWF0ZSMjTlVXTlNXRVhBQ1QoSW5zdHJ1Y3Rpb246Ok9QQywgVjEsIFYyLCBOYW1lKTsgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGUjI05VV05TV0VYQUNUIyNPUEMoICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBWYWx1ZSAqVjEsIFZhbHVlICpWMiwgY29uc3QgVHdpbmUgJk5hbWUsIEJhc2ljQmxvY2sgKkJCKSB7ICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBDcmVhdGUjI05VV05TV0VYQUNUKEluc3RydWN0aW9uOjpPUEMsIFYxLCBWMiwgTmFtZSwgQkIpOyAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlIyNOVVdOU1dFWEFDVCMjT1BDKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgVmFsdWUgKlYxLCBWYWx1ZSAqVjIsIGNvbnN0IFR3aW5lICZOYW1lLCBJbnN0cnVjdGlvbiAqSSkgeyAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gQ3JlYXRlIyNOVVdOU1dFWEFDVChJbnN0cnVjdGlvbjo6T1BDLCBWMSwgVjIsIE5hbWUsIEkpOyAgICAgICAgICAgICBcCisgIH0KKworICBERUZJTkVfSEVMUEVSUyhBZGQsIE5TVykgLy8gQ3JlYXRlTlNXQWRkCisgIERFRklORV9IRUxQRVJTKEFkZCwgTlVXKSAvLyBDcmVhdGVOVVdBZGQKKyAgREVGSU5FX0hFTFBFUlMoU3ViLCBOU1cpIC8vIENyZWF0ZU5TV1N1YgorICBERUZJTkVfSEVMUEVSUyhTdWIsIE5VVykgLy8gQ3JlYXRlTlVXU3ViCisgIERFRklORV9IRUxQRVJTKE11bCwgTlNXKSAvLyBDcmVhdGVOU1dNdWwKKyAgREVGSU5FX0hFTFBFUlMoTXVsLCBOVVcpIC8vIENyZWF0ZU5VV011bAorICBERUZJTkVfSEVMUEVSUyhTaGwsIE5TVykgLy8gQ3JlYXRlTlNXU2hsCisgIERFRklORV9IRUxQRVJTKFNobCwgTlVXKSAvLyBDcmVhdGVOVVdTaGwKKworICBERUZJTkVfSEVMUEVSUyhTRGl2LCBFeGFjdCkgIC8vIENyZWF0ZUV4YWN0U0RpdgorICBERUZJTkVfSEVMUEVSUyhVRGl2LCBFeGFjdCkgIC8vIENyZWF0ZUV4YWN0VURpdgorICBERUZJTkVfSEVMUEVSUyhBU2hyLCBFeGFjdCkgIC8vIENyZWF0ZUV4YWN0QVNocgorICBERUZJTkVfSEVMUEVSUyhMU2hyLCBFeGFjdCkgIC8vIENyZWF0ZUV4YWN0TFNocgorCisjdW5kZWYgREVGSU5FX0hFTFBFUlMKKworICAvLy8gSGVscGVyIGZ1bmN0aW9ucyB0byBjb25zdHJ1Y3QgYW5kIGluc3BlY3QgdW5hcnkgb3BlcmF0aW9ucyAoTkVHIGFuZCBOT1QpCisgIC8vLyB2aWEgYmluYXJ5IG9wZXJhdG9ycyBTVUIgYW5kIFhPUjoKKyAgLy8vCisgIC8vLyBDcmVhdGUgdGhlIE5FRyBhbmQgTk9UIGluc3RydWN0aW9ucyBvdXQgb2YgU1VCIGFuZCBYT1IgaW5zdHJ1Y3Rpb25zLgorICAvLy8KKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVOZWcoVmFsdWUgKk9wLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlTmVnKFZhbHVlICpPcCwgY29uc3QgVHdpbmUgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVOU1dOZWcoVmFsdWUgKk9wLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlTlNXTmVnKFZhbHVlICpPcCwgY29uc3QgVHdpbmUgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVOVVdOZWcoVmFsdWUgKk9wLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlTlVXTmVnKFZhbHVlICpPcCwgY29uc3QgVHdpbmUgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVGTmVnKFZhbHVlICpPcCwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKyAgc3RhdGljIEJpbmFyeU9wZXJhdG9yICpDcmVhdGVGTmVnKFZhbHVlICpPcCwgY29uc3QgVHdpbmUgJk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisgIHN0YXRpYyBCaW5hcnlPcGVyYXRvciAqQ3JlYXRlTm90KFZhbHVlICpPcCwgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBzdGF0aWMgQmluYXJ5T3BlcmF0b3IgKkNyZWF0ZU5vdChWYWx1ZSAqT3AsIGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgLy8vIENoZWNrIGlmIHRoZSBnaXZlbiBWYWx1ZSBpcyBhIE5FRywgRk5lZywgb3IgTk9UIGluc3RydWN0aW9uLgorICAvLy8KKyAgc3RhdGljIGJvb2wgaXNOZWcoY29uc3QgVmFsdWUgKlYpOworICBzdGF0aWMgYm9vbCBpc0ZOZWcoY29uc3QgVmFsdWUgKlYsIGJvb2wgSWdub3JlWmVyb1NpZ249ZmFsc2UpOworICBzdGF0aWMgYm9vbCBpc05vdChjb25zdCBWYWx1ZSAqVik7CisKKyAgLy8vIEhlbHBlciBmdW5jdGlvbnMgdG8gZXh0cmFjdCB0aGUgdW5hcnkgYXJndW1lbnQgb2YgYSBORUcsIEZORUcgb3IgTk9UCisgIC8vLyBvcGVyYXRpb24gaW1wbGVtZW50ZWQgdmlhIFN1YiwgRlN1Yiwgb3IgWG9yLgorICAvLy8KKyAgc3RhdGljIGNvbnN0IFZhbHVlICpnZXROZWdBcmd1bWVudChjb25zdCBWYWx1ZSAqQmluT3ApOworICBzdGF0aWMgICAgICAgVmFsdWUgKmdldE5lZ0FyZ3VtZW50KCAgICAgIFZhbHVlICpCaW5PcCk7CisgIHN0YXRpYyBjb25zdCBWYWx1ZSAqZ2V0Rk5lZ0FyZ3VtZW50KGNvbnN0IFZhbHVlICpCaW5PcCk7CisgIHN0YXRpYyAgICAgICBWYWx1ZSAqZ2V0Rk5lZ0FyZ3VtZW50KCAgICAgIFZhbHVlICpCaW5PcCk7CisgIHN0YXRpYyBjb25zdCBWYWx1ZSAqZ2V0Tm90QXJndW1lbnQoY29uc3QgVmFsdWUgKkJpbk9wKTsKKyAgc3RhdGljICAgICAgIFZhbHVlICpnZXROb3RBcmd1bWVudCggICAgICBWYWx1ZSAqQmluT3ApOworCisgIEJpbmFyeU9wcyBnZXRPcGNvZGUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PEJpbmFyeU9wcz4oSW5zdHJ1Y3Rpb246OmdldE9wY29kZSgpKTsKKyAgfQorCisgIC8vLyBFeGNoYW5nZSB0aGUgdHdvIG9wZXJhbmRzIHRvIHRoaXMgaW5zdHJ1Y3Rpb24uCisgIC8vLyBUaGlzIGluc3RydWN0aW9uIGlzIHNhZmUgdG8gdXNlIG9uIGFueSBiaW5hcnkgaW5zdHJ1Y3Rpb24gYW5kCisgIC8vLyBkb2VzIG5vdCBtb2RpZnkgdGhlIHNlbWFudGljcyBvZiB0aGUgaW5zdHJ1Y3Rpb24uICBJZiB0aGUgaW5zdHJ1Y3Rpb24KKyAgLy8vIGNhbm5vdCBiZSByZXZlcnNlZCAoaWUsIGl0J3MgYSBEaXYpLCB0aGVuIHJldHVybiB0cnVlLgorICAvLy8KKyAgYm9vbCBzd2FwT3BlcmFuZHMoKTsKKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmlzQmluYXJ5T3AoKTsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxCaW5hcnlPcGVyYXRvcj4gOgorICBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPEJpbmFyeU9wZXJhdG9yLCAyPiB7Cit9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoQmluYXJ5T3BlcmF0b3IsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzdEluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBUaGlzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgaW5zdHJ1Y3Rpb25zIHRoYXQgcGVyZm9ybSBkYXRhCisvLy8gY2FzdHMuIEl0IGlzIHNpbXBseSBwcm92aWRlZCBzbyB0aGF0IGluc3RydWN0aW9uIGNhdGVnb3J5IHRlc3RpbmcKKy8vLyBjYW4gYmUgcGVyZm9ybWVkIHdpdGggY29kZSBsaWtlOgorLy8vCisvLy8gaWYgKGlzYTxDYXN0SW5zdD4oSW5zdHIpKSB7IC4uLiB9CisvLy8gQGJyaWVmIEJhc2UgY2xhc3Mgb2YgY2FzdGluZyBpbnN0cnVjdGlvbnMuCitjbGFzcyBDYXN0SW5zdCA6IHB1YmxpYyBVbmFyeUluc3RydWN0aW9uIHsKK3Byb3RlY3RlZDoKKyAgLy8vIEBicmllZiBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1iZWZvcmUtaW5zdHJ1Y3Rpb24gc2VtYW50aWNzIGZvciBzdWJjbGFzc2VzCisgIENhc3RJbnN0KFR5cGUgKlR5LCB1bnNpZ25lZCBpVHlwZSwgVmFsdWUgKlMsCisgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKQorICAgIDogVW5hcnlJbnN0cnVjdGlvbihUeSwgaVR5cGUsIFMsIEluc2VydEJlZm9yZSkgeworICAgIHNldE5hbWUoTmFtZVN0cik7CisgIH0KKyAgLy8vIEBicmllZiBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1hdC1lbmQtb2YtYmxvY2sgc2VtYW50aWNzIGZvciBzdWJjbGFzc2VzCisgIENhc3RJbnN0KFR5cGUgKlR5LCB1bnNpZ25lZCBpVHlwZSwgVmFsdWUgKlMsCisgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkKKyAgICA6IFVuYXJ5SW5zdHJ1Y3Rpb24oVHksIGlUeXBlLCBTLCBJbnNlcnRBdEVuZCkgeworICAgIHNldE5hbWUoTmFtZVN0cik7CisgIH0KKworcHVibGljOgorICAvLy8gUHJvdmlkZXMgYSB3YXkgdG8gY29uc3RydWN0IGFueSBvZiB0aGUgQ2FzdEluc3Qgc3ViY2xhc3NlcyB1c2luZyBhbgorICAvLy8gb3Bjb2RlIGluc3RlYWQgb2YgdGhlIHN1YmNsYXNzJ3MgY29uc3RydWN0b3IuIFRoZSBvcGNvZGUgbXVzdCBiZSBpbiB0aGUKKyAgLy8vIENhc3RPcHMgY2F0ZWdvcnkgKEluc3RydWN0aW9uOjppc0Nhc3Qob3Bjb2RlKSByZXR1cm5zIHRydWUpLiBUaGlzCisgIC8vLyBjb25zdHJ1Y3RvciBoYXMgaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MgdG8gYXV0b21hdGljYWxseQorICAvLy8gaW5zZXJ0IHRoZSBuZXcgQ2FzdEluc3QgYmVmb3JlIEluc2VydEJlZm9yZSAoaWYgaXQgaXMgbm9uLW51bGwpLgorICAvLy8gQGJyaWVmIENvbnN0cnVjdCBhbnkgb2YgdGhlIENhc3RJbnN0IHN1YmNsYXNzZXMKKyAgc3RhdGljIENhc3RJbnN0ICpDcmVhdGUoCisgICAgSW5zdHJ1Y3Rpb246OkNhc3RPcHMsICAgIC8vLzwgVGhlIG9wY29kZSBvZiB0aGUgY2FzdCBpbnN0cnVjdGlvbgorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjYXN0ZWQgKG9wZXJhbmQgMCkKKyAgICBUeXBlICpUeSwgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byB3aGljaCBjYXN0IHNob3VsZCBiZSBtYWRlCisgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwgLy8vPCBOYW1lIGZvciB0aGUgaW5zdHJ1Y3Rpb24KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0ciAvLy88IFBsYWNlIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24KKyAgKTsKKyAgLy8vIFByb3ZpZGVzIGEgd2F5IHRvIGNvbnN0cnVjdCBhbnkgb2YgdGhlIENhc3RJbnN0IHN1YmNsYXNzZXMgdXNpbmcgYW4KKyAgLy8vIG9wY29kZSBpbnN0ZWFkIG9mIHRoZSBzdWJjbGFzcydzIGNvbnN0cnVjdG9yLiBUaGUgb3Bjb2RlIG11c3QgYmUgaW4gdGhlCisgIC8vLyBDYXN0T3BzIGNhdGVnb3J5LiBUaGlzIGNvbnN0cnVjdG9yIGhhcyBpbnNlcnQtYXQtZW5kLW9mLWJsb2NrIHNlbWFudGljcworICAvLy8gdG8gYXV0b21hdGljYWxseSBpbnNlcnQgdGhlIG5ldyBDYXN0SW5zdCBhdCB0aGUgZW5kIG9mIEluc2VydEF0RW5kIChpZgorICAvLy8gaXRzIG5vbi1udWxsKS4KKyAgLy8vIEBicmllZiBDb25zdHJ1Y3QgYW55IG9mIHRoZSBDYXN0SW5zdCBzdWJjbGFzc2VzCisgIHN0YXRpYyBDYXN0SW5zdCAqQ3JlYXRlKAorICAgIEluc3RydWN0aW9uOjpDYXN0T3BzLCAgICAvLy88IFRoZSBvcGNvZGUgZm9yIHRoZSBjYXN0IGluc3RydWN0aW9uCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNhc3RlZCAob3BlcmFuZCAwKQorICAgIFR5cGUgKlR5LCAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHdoaWNoIG9wZXJhbmQgaXMgY2FzdGVkCisgICAgY29uc3QgVHdpbmUgJk5hbWUsIC8vLzwgVGhlIG5hbWUgZm9yIHRoZSBpbnN0cnVjdGlvbgorICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kICAvLy88IFRoZSBibG9jayB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uIGludG8KKyAgKTsKKworICAvLy8gQGJyaWVmIENyZWF0ZSBhIFpFeHQgb3IgQml0Q2FzdCBjYXN0IGluc3RydWN0aW9uCisgIHN0YXRpYyBDYXN0SW5zdCAqQ3JlYXRlWkV4dE9yQml0Q2FzdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY2FzdGVkIChvcGVyYW5kIDApCisgICAgVHlwZSAqVHksICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gd2hpY2ggY2FzdCBzaG91bGQgYmUgbWFkZQorICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsIC8vLzwgTmFtZSBmb3IgdGhlIGluc3RydWN0aW9uCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIgLy8vPCBQbGFjZSB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBaRXh0IG9yIEJpdENhc3QgY2FzdCBpbnN0cnVjdGlvbgorICBzdGF0aWMgQ2FzdEluc3QgKkNyZWF0ZVpFeHRPckJpdENhc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNhc3RlZCAob3BlcmFuZCAwKQorICAgIFR5cGUgKlR5LCAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHdoaWNoIG9wZXJhbmQgaXMgY2FzdGVkCisgICAgY29uc3QgVHdpbmUgJk5hbWUsIC8vLzwgVGhlIG5hbWUgZm9yIHRoZSBpbnN0cnVjdGlvbgorICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kICAvLy88IFRoZSBibG9jayB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uIGludG8KKyAgKTsKKworICAvLy8gQGJyaWVmIENyZWF0ZSBhIFNFeHQgb3IgQml0Q2FzdCBjYXN0IGluc3RydWN0aW9uCisgIHN0YXRpYyBDYXN0SW5zdCAqQ3JlYXRlU0V4dE9yQml0Q2FzdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY2FzdGVkIChvcGVyYW5kIDApCisgICAgVHlwZSAqVHksICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gd2hpY2ggY2FzdCBzaG91bGQgYmUgbWFkZQorICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsIC8vLzwgTmFtZSBmb3IgdGhlIGluc3RydWN0aW9uCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIgLy8vPCBQbGFjZSB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBTRXh0IG9yIEJpdENhc3QgY2FzdCBpbnN0cnVjdGlvbgorICBzdGF0aWMgQ2FzdEluc3QgKkNyZWF0ZVNFeHRPckJpdENhc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNhc3RlZCAob3BlcmFuZCAwKQorICAgIFR5cGUgKlR5LCAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHdoaWNoIG9wZXJhbmQgaXMgY2FzdGVkCisgICAgY29uc3QgVHdpbmUgJk5hbWUsIC8vLzwgVGhlIG5hbWUgZm9yIHRoZSBpbnN0cnVjdGlvbgorICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kICAvLy88IFRoZSBibG9jayB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uIGludG8KKyAgKTsKKworICAvLy8gQGJyaWVmIENyZWF0ZSBhIEJpdENhc3QgQWRkclNwYWNlQ2FzdCwgb3IgYSBQdHJUb0ludCBjYXN0IGluc3RydWN0aW9uLgorICBzdGF0aWMgQ2FzdEluc3QgKkNyZWF0ZVBvaW50ZXJDYXN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAvLy88IFRoZSBwb2ludGVyIHZhbHVlIHRvIGJlIGNhc3RlZCAob3BlcmFuZCAwKQorICAgIFR5cGUgKlR5LCAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHdoaWNoIG9wZXJhbmQgaXMgY2FzdGVkCisgICAgY29uc3QgVHdpbmUgJk5hbWUsIC8vLzwgVGhlIG5hbWUgZm9yIHRoZSBpbnN0cnVjdGlvbgorICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kICAvLy88IFRoZSBibG9jayB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uIGludG8KKyAgKTsKKworICAvLy8gQGJyaWVmIENyZWF0ZSBhIEJpdENhc3QsIEFkZHJTcGFjZUNhc3Qgb3IgYSBQdHJUb0ludCBjYXN0IGluc3RydWN0aW9uLgorICBzdGF0aWMgQ2FzdEluc3QgKkNyZWF0ZVBvaW50ZXJDYXN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAvLy88IFRoZSBwb2ludGVyIHZhbHVlIHRvIGJlIGNhc3RlZCAob3BlcmFuZCAwKQorICAgIFR5cGUgKlR5LCAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHdoaWNoIGNhc3Qgc2hvdWxkIGJlIG1hZGUKKyAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiLCAvLy88IE5hbWUgZm9yIHRoZSBpbnN0cnVjdGlvbgorICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyIC8vLzwgUGxhY2UgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgQml0Q2FzdCBvciBhbiBBZGRyU3BhY2VDYXN0IGNhc3QgaW5zdHJ1Y3Rpb24uCisgIHN0YXRpYyBDYXN0SW5zdCAqQ3JlYXRlUG9pbnRlckJpdENhc3RPckFkZHJTcGFjZUNhc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgIC8vLzwgVGhlIHBvaW50ZXIgdmFsdWUgdG8gYmUgY2FzdGVkIChvcGVyYW5kIDApCisgICAgVHlwZSAqVHksICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gd2hpY2ggb3BlcmFuZCBpcyBjYXN0ZWQKKyAgICBjb25zdCBUd2luZSAmTmFtZSwgLy8vPCBUaGUgbmFtZSBmb3IgdGhlIGluc3RydWN0aW9uCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgIC8vLzwgVGhlIGJsb2NrIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24gaW50bworICApOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgQml0Q2FzdCBvciBhbiBBZGRyU3BhY2VDYXN0IGNhc3QgaW5zdHJ1Y3Rpb24uCisgIHN0YXRpYyBDYXN0SW5zdCAqQ3JlYXRlUG9pbnRlckJpdENhc3RPckFkZHJTcGFjZUNhc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgIC8vLzwgVGhlIHBvaW50ZXIgdmFsdWUgdG8gYmUgY2FzdGVkIChvcGVyYW5kIDApCisgICAgVHlwZSAqVHksICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gd2hpY2ggY2FzdCBzaG91bGQgYmUgbWFkZQorICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsIC8vLzwgTmFtZSBmb3IgdGhlIGluc3RydWN0aW9uCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIgLy8vPCBQbGFjZSB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBCaXRDYXN0LCBhIFB0clRvSW50LCBvciBhbiBJbnRUb1BUciBjYXN0IGluc3RydWN0aW9uLgorICAvLy8KKyAgLy8vIElmIHRoZSB2YWx1ZSBpcyBhIHBvaW50ZXIgdHlwZSBhbmQgdGhlIGRlc3RpbmF0aW9uIGFuIGludGVnZXIgdHlwZSwKKyAgLy8vIGNyZWF0ZXMgYSBQdHJUb0ludCBjYXN0LiBJZiB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciB0eXBlIGFuZCB0aGUKKyAgLy8vIGRlc3RpbmF0aW9uIGEgcG9pbnRlciB0eXBlLCBjcmVhdGVzIGFuIEludFRvUHRyIGNhc3QuIE90aGVyd2lzZSwgY3JlYXRlcworICAvLy8gYSBiaXRjYXN0LgorICBzdGF0aWMgQ2FzdEluc3QgKkNyZWF0ZUJpdE9yUG9pbnRlckNhc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgIC8vLzwgVGhlIHBvaW50ZXIgdmFsdWUgdG8gYmUgY2FzdGVkIChvcGVyYW5kIDApCisgICAgVHlwZSAqVHksICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gd2hpY2ggY2FzdCBzaG91bGQgYmUgbWFkZQorICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsIC8vLzwgTmFtZSBmb3IgdGhlIGluc3RydWN0aW9uCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIgLy8vPCBQbGFjZSB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYSBaRXh0LCBCaXRDYXN0LCBvciBUcnVuYyBmb3IgaW50IC0+IGludCBjYXN0cy4KKyAgc3RhdGljIENhc3RJbnN0ICpDcmVhdGVJbnRlZ2VyQ2FzdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgLy8vPCBUaGUgcG9pbnRlciB2YWx1ZSB0byBiZSBjYXN0ZWQgKG9wZXJhbmQgMCkKKyAgICBUeXBlICpUeSwgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byB3aGljaCBjYXN0IHNob3VsZCBiZSBtYWRlCisgICAgYm9vbCBpc1NpZ25lZCwgICAgICAgICAgIC8vLzwgV2hldGhlciB0byByZWdhcmQgUyBhcyBzaWduZWQgb3Igbm90CisgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwgLy8vPCBOYW1lIGZvciB0aGUgaW5zdHJ1Y3Rpb24KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0ciAvLy88IFBsYWNlIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24KKyAgKTsKKworICAvLy8gQGJyaWVmIENyZWF0ZSBhIFpFeHQsIEJpdENhc3QsIG9yIFRydW5jIGZvciBpbnQgLT4gaW50IGNhc3RzLgorICBzdGF0aWMgQ2FzdEluc3QgKkNyZWF0ZUludGVnZXJDYXN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAvLy88IFRoZSBpbnRlZ2VyIHZhbHVlIHRvIGJlIGNhc3RlZCAob3BlcmFuZCAwKQorICAgIFR5cGUgKlR5LCAgICAgICAgICAvLy88IFRoZSBpbnRlZ2VyIHR5cGUgdG8gd2hpY2ggb3BlcmFuZCBpcyBjYXN0ZWQKKyAgICBib29sIGlzU2lnbmVkLCAgICAgICAgICAgLy8vPCBXaGV0aGVyIHRvIHJlZ2FyZCBTIGFzIHNpZ25lZCBvciBub3QKKyAgICBjb25zdCBUd2luZSAmTmFtZSwgLy8vPCBUaGUgbmFtZSBmb3IgdGhlIGluc3RydWN0aW9uCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgIC8vLzwgVGhlIGJsb2NrIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24gaW50bworICApOworCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGFuIEZQRXh0LCBCaXRDYXN0LCBvciBGUFRydW5jIGZvciBmcCAtPiBmcCBjYXN0cworICBzdGF0aWMgQ2FzdEluc3QgKkNyZWF0ZUZQQ2FzdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgLy8vPCBUaGUgZmxvYXRpbmcgcG9pbnQgdmFsdWUgdG8gYmUgY2FzdGVkCisgICAgVHlwZSAqVHksICAgICAgICAgIC8vLzwgVGhlIGZsb2F0aW5nIHBvaW50IHR5cGUgdG8gY2FzdCB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsIC8vLzwgTmFtZSBmb3IgdGhlIGluc3RydWN0aW9uCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIgLy8vPCBQbGFjZSB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIEBicmllZiBDcmVhdGUgYW4gRlBFeHQsIEJpdENhc3QsIG9yIEZQVHJ1bmMgZm9yIGZwIC0+IGZwIGNhc3RzCisgIHN0YXRpYyBDYXN0SW5zdCAqQ3JlYXRlRlBDYXN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAvLy88IFRoZSBmbG9hdGluZyBwb2ludCB2YWx1ZSB0byBiZSBjYXN0ZWQKKyAgICBUeXBlICpUeSwgICAgICAgICAgLy8vPCBUaGUgZmxvYXRpbmcgcG9pbnQgdHlwZSB0byBjYXN0IHRvCisgICAgY29uc3QgVHdpbmUgJk5hbWUsIC8vLzwgVGhlIG5hbWUgZm9yIHRoZSBpbnN0cnVjdGlvbgorICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kICAvLy88IFRoZSBibG9jayB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uIGludG8KKyAgKTsKKworICAvLy8gQGJyaWVmIENyZWF0ZSBhIFRydW5jIG9yIEJpdENhc3QgY2FzdCBpbnN0cnVjdGlvbgorICBzdGF0aWMgQ2FzdEluc3QgKkNyZWF0ZVRydW5jT3JCaXRDYXN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjYXN0ZWQgKG9wZXJhbmQgMCkKKyAgICBUeXBlICpUeSwgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byB3aGljaCBjYXN0IHNob3VsZCBiZSBtYWRlCisgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIiwgLy8vPCBOYW1lIGZvciB0aGUgaW5zdHJ1Y3Rpb24KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0ciAvLy88IFBsYWNlIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24KKyAgKTsKKworICAvLy8gQGJyaWVmIENyZWF0ZSBhIFRydW5jIG9yIEJpdENhc3QgY2FzdCBpbnN0cnVjdGlvbgorICBzdGF0aWMgQ2FzdEluc3QgKkNyZWF0ZVRydW5jT3JCaXRDYXN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjYXN0ZWQgKG9wZXJhbmQgMCkKKyAgICBUeXBlICpUeSwgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byB3aGljaCBvcGVyYW5kIGlzIGNhc3RlZAorICAgIGNvbnN0IFR3aW5lICZOYW1lLCAvLy88IFRoZSBuYW1lIGZvciB0aGUgaW5zdHJ1Y3Rpb24KKyAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIEBicmllZiBDaGVjayB3aGV0aGVyIGl0IGlzIHZhbGlkIHRvIGNhbGwgZ2V0Q2FzdE9wY29kZSBmb3IgdGhlc2UgdHlwZXMuCisgIHN0YXRpYyBib29sIGlzQ2FzdGFibGUoCisgICAgVHlwZSAqU3JjVHksIC8vLzwgVGhlIFR5cGUgZnJvbSB3aGljaCB0aGUgdmFsdWUgc2hvdWxkIGJlIGNhc3QuCisgICAgVHlwZSAqRGVzdFR5IC8vLzwgVGhlIFR5cGUgdG8gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSBjYXN0LgorICApOworCisgIC8vLyBAYnJpZWYgQ2hlY2sgd2hldGhlciBhIGJpdGNhc3QgYmV0d2VlbiB0aGVzZSB0eXBlcyBpcyB2YWxpZAorICBzdGF0aWMgYm9vbCBpc0JpdENhc3RhYmxlKAorICAgIFR5cGUgKlNyY1R5LCAvLy88IFRoZSBUeXBlIGZyb20gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSBjYXN0LgorICAgIFR5cGUgKkRlc3RUeSAvLy88IFRoZSBUeXBlIHRvIHdoaWNoIHRoZSB2YWx1ZSBzaG91bGQgYmUgY2FzdC4KKyAgKTsKKworICAvLy8gQGJyaWVmIENoZWNrIHdoZXRoZXIgYSBiaXRjYXN0LCBpbnR0b3B0ciwgb3IgcHRydG9pbnQgY2FzdCBiZXR3ZWVuIHRoZXNlCisgIC8vLyB0eXBlcyBpcyB2YWxpZCBhbmQgYSBuby1vcC4KKyAgLy8vCisgIC8vLyBUaGlzIGVuc3VyZXMgdGhhdCBhbnkgcG9pbnRlcjwtPmludGVnZXIgY2FzdCBoYXMgZW5vdWdoIGJpdHMgaW4gdGhlCisgIC8vLyBpbnRlZ2VyIGFuZCBhbnkgb3RoZXIgY2FzdCBpcyBhIGJpdGNhc3QuCisgIHN0YXRpYyBib29sIGlzQml0T3JOb29wUG9pbnRlckNhc3RhYmxlKAorICAgICAgVHlwZSAqU3JjVHksICAvLy88IFRoZSBUeXBlIGZyb20gd2hpY2ggdGhlIHZhbHVlIHNob3VsZCBiZSBjYXN0LgorICAgICAgVHlwZSAqRGVzdFR5LCAvLy88IFRoZSBUeXBlIHRvIHdoaWNoIHRoZSB2YWx1ZSBzaG91bGQgYmUgY2FzdC4KKyAgICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMKTsKKworICAvLy8gUmV0dXJucyB0aGUgb3Bjb2RlIG5lY2Vzc2FyeSB0byBjYXN0IFZhbCBpbnRvIFR5IHVzaW5nIHVzdWFsIGNhc3RpbmcKKyAgLy8vIHJ1bGVzLgorICAvLy8gQGJyaWVmIEluZmVyIHRoZSBvcGNvZGUgZm9yIGNhc3Qgb3BlcmFuZCBhbmQgdHlwZQorICBzdGF0aWMgSW5zdHJ1Y3Rpb246OkNhc3RPcHMgZ2V0Q2FzdE9wY29kZSgKKyAgICBjb25zdCBWYWx1ZSAqVmFsLCAvLy88IFRoZSB2YWx1ZSB0byBjYXN0CisgICAgYm9vbCBTcmNJc1NpZ25lZCwgLy8vPCBXaGV0aGVyIHRvIHRyZWF0IHRoZSBzb3VyY2UgYXMgc2lnbmVkCisgICAgVHlwZSAqVHksICAgLy8vPCBUaGUgVHlwZSB0byB3aGljaCB0aGUgdmFsdWUgc2hvdWxkIGJlIGNhc3RlZAorICAgIGJvb2wgRHN0SXNTaWduZWQgIC8vLzwgV2hldGhlciB0byB0cmVhdGUgdGhlIGRlc3QuIGFzIHNpZ25lZAorICApOworCisgIC8vLyBUaGVyZSBhcmUgc2V2ZXJhbCBwbGFjZXMgd2hlcmUgd2UgbmVlZCB0byBrbm93IGlmIGEgY2FzdCBpbnN0cnVjdGlvbgorICAvLy8gb25seSBkZWFscyB3aXRoIGludGVnZXIgc291cmNlIGFuZCBkZXN0aW5hdGlvbiB0eXBlcy4gVG8gc2ltcGxpZnkgdGhhdAorICAvLy8gbG9naWMsIHRoaXMgbWV0aG9kIGlzIHByb3ZpZGVkLgorICAvLy8gQHJldHVybnMgdHJ1ZSBpZmYgdGhlIGNhc3QgaGFzIG9ubHkgaW50ZWdyYWwgdHlwZWQgb3BlcmFuZCBhbmQgZGVzdCB0eXBlLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGlzIGlzIGFuIGludGVnZXItb25seSBjYXN0LgorICBib29sIGlzSW50ZWdlckNhc3QoKSBjb25zdDsKKworICAvLy8gQSBsb3NzbGVzcyBjYXN0IGlzIG9uZSB0aGF0IGRvZXMgbm90IGFsdGVyIHRoZSBiYXNpYyB2YWx1ZS4gSXQgaW1wbGllcworICAvLy8gYSBuby1vcCBjYXN0IGJ1dCBpcyBtb3JlIHN0cmluZ2VudCwgcHJldmVudGluZyB0aGluZ3MgbGlrZSBpbnQtPmZsb2F0LAorICAvLy8gbG9uZy0+ZG91YmxlLCBvciBpbnQtPnB0ci4KKyAgLy8vIEByZXR1cm5zIHRydWUgaWZmIHRoZSBjYXN0IGlzIGxvc3NsZXNzLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGlzIGlzIGEgbG9zc2xlc3MgY2FzdC4KKyAgYm9vbCBpc0xvc3NsZXNzQ2FzdCgpIGNvbnN0OworCisgIC8vLyBBIG5vLW9wIGNhc3QgaXMgb25lIHRoYXQgY2FuIGJlIGVmZmVjdGVkIHdpdGhvdXQgY2hhbmdpbmcgYW55IGJpdHMuCisgIC8vLyBJdCBpbXBsaWVzIHRoYXQgdGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gdHlwZXMgYXJlIHRoZSBzYW1lIHNpemUuIFRoZQorICAvLy8gRGF0YUxheW91dCBhcmd1bWVudCBpcyB0byBkZXRlcm1pbmUgdGhlIHBvaW50ZXIgc2l6ZSB3aGVuIGV4YW1pbmluZyBjYXN0cworICAvLy8gaW52b2x2aW5nIEludGVnZXIgYW5kIFBvaW50ZXIgdHlwZXMuIFRoZXkgYXJlIG5vLW9wIGNhc3RzIGlmIHRoZSBpbnRlZ2VyCisgIC8vLyBpcyB0aGUgc2FtZSBzaXplIGFzIHRoZSBwb2ludGVyLiBIb3dldmVyLCBwb2ludGVyIHNpemUgdmFyaWVzIHdpdGgKKyAgLy8vIHBsYXRmb3JtLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGUgZGVzY3JpYmVkIGNhc3QgaXMgYSBuby1vcCBjYXN0LgorICBzdGF0aWMgYm9vbCBpc05vb3BDYXN0KAorICAgIEluc3RydWN0aW9uOjpDYXN0T3BzIE9wY29kZSwgLy8vPCBPcGNvZGUgb2YgY2FzdAorICAgIFR5cGUgKlNyY1R5LCAgICAgICAgIC8vLzwgU3JjVHkgb2YgY2FzdAorICAgIFR5cGUgKkRzdFR5LCAgICAgICAgIC8vLzwgRHN0VHkgb2YgY2FzdAorICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMIC8vLzwgRGF0YUxheW91dCB0byBnZXQgdGhlIEludCBQdHIgdHlwZSBmcm9tLgorICApOworCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoaXMgY2FzdCBpcyBhIG5vLW9wIGNhc3QuCisgIC8vLworICAvLy8gXHBhcmFtIERMIGlzIHRoZSBEYXRhTGF5b3V0IHRvIGRldGVybWluZSBwb2ludGVyIHNpemUuCisgIGJvb2wgaXNOb29wQ2FzdChjb25zdCBEYXRhTGF5b3V0ICZETCkgY29uc3Q7CisKKyAgLy8vIERldGVybWluZSBob3cgYSBwYWlyIG9mIGNhc3RzIGNhbiBiZSBlbGltaW5hdGVkLCBpZiB0aGV5IGNhbiBiZSBhdCBhbGwuCisgIC8vLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGZvciBib3RoIENhc3RJbnN0IGFuZCBDb25zdGFudEV4cHIuCisgIC8vLyBAcmV0dXJucyAwIGlmIHRoZSBDYXN0SW5zdCBwYWlyIGNhbid0IGJlIGVsaW1pbmF0ZWQsIG90aGVyd2lzZQorICAvLy8gcmV0dXJucyBJbnN0cnVjdGlvbjo6Q2FzdE9wcyB2YWx1ZSBmb3IgYSBjYXN0IHRoYXQgY2FuIHJlcGxhY2UKKyAgLy8vIHRoZSBwYWlyLCBjYXN0aW5nIFNyY1R5IHRvIERzdFR5LgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiBhIGNhc3QgcGFpciBpcyBlbGltaW5hYmxlCisgIHN0YXRpYyB1bnNpZ25lZCBpc0VsaW1pbmFibGVDYXN0UGFpcigKKyAgICBJbnN0cnVjdGlvbjo6Q2FzdE9wcyBmaXJzdE9wY29kZSwgIC8vLzwgT3Bjb2RlIG9mIGZpcnN0IGNhc3QKKyAgICBJbnN0cnVjdGlvbjo6Q2FzdE9wcyBzZWNvbmRPcGNvZGUsIC8vLzwgT3Bjb2RlIG9mIHNlY29uZCBjYXN0CisgICAgVHlwZSAqU3JjVHksIC8vLzwgU3JjVHkgb2YgMXN0IGNhc3QKKyAgICBUeXBlICpNaWRUeSwgLy8vPCBEc3RUeSBvZiAxc3QgY2FzdCAmIFNyY1R5IG9mIDJuZCBjYXN0CisgICAgVHlwZSAqRHN0VHksIC8vLzwgRHN0VHkgb2YgMm5kIGNhc3QKKyAgICBUeXBlICpTcmNJbnRQdHJUeSwgLy8vPCBJbnRlZ2VyIHR5cGUgY29ycmVzcG9uZGluZyB0byBQdHIgU3JjVHksIG9yIG51bGwKKyAgICBUeXBlICpNaWRJbnRQdHJUeSwgLy8vPCBJbnRlZ2VyIHR5cGUgY29ycmVzcG9uZGluZyB0byBQdHIgTWlkVHksIG9yIG51bGwKKyAgICBUeXBlICpEc3RJbnRQdHJUeSAgLy8vPCBJbnRlZ2VyIHR5cGUgY29ycmVzcG9uZGluZyB0byBQdHIgRHN0VHksIG9yIG51bGwKKyAgKTsKKworICAvLy8gQGJyaWVmIFJldHVybiB0aGUgb3Bjb2RlIG9mIHRoaXMgQ2FzdEluc3QKKyAgSW5zdHJ1Y3Rpb246OkNhc3RPcHMgZ2V0T3Bjb2RlKCkgY29uc3QgeworICAgIHJldHVybiBJbnN0cnVjdGlvbjo6Q2FzdE9wcyhJbnN0cnVjdGlvbjo6Z2V0T3Bjb2RlKCkpOworICB9CisKKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIHNvdXJjZSB0eXBlLCBhcyBhIGNvbnZlbmllbmNlCisgIFR5cGUqIGdldFNyY1R5KCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpOyB9CisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBkZXN0aW5hdGlvbiB0eXBlLCBhcyBhIGNvbnZlbmllbmNlCisgIFR5cGUqIGdldERlc3RUeSgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGUoKTsgfQorCisgIC8vLyBUaGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgaWYgYSBjYXN0IGZyb20gUyB0byBEc3RUeSB1c2luZworICAvLy8gT3Bjb2RlIG9wIGlzIHZhbGlkIG9yIG5vdC4KKyAgLy8vIEByZXR1cm5zIHRydWUgaWZmIHRoZSBwcm9wb3NlZCBjYXN0IGlzIHZhbGlkLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiBhIGNhc3QgaXMgdmFsaWQgd2l0aG91dCBjcmVhdGluZyBvbmUuCisgIHN0YXRpYyBib29sIGNhc3RJc1ZhbGlkKEluc3RydWN0aW9uOjpDYXN0T3BzIG9wLCBWYWx1ZSAqUywgVHlwZSAqRHN0VHkpOworCisgIC8vLyBAYnJpZWYgTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5pc0Nhc3QoKTsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbXBJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVGhpcyBjbGFzcyBpcyB0aGUgYmFzZSBjbGFzcyBmb3IgdGhlIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb25zLgorLy8vIEBicmllZiBBYnN0cmFjdCBiYXNlIGNsYXNzIG9mIGNvbXBhcmlzb24gaW5zdHJ1Y3Rpb25zLgorY2xhc3MgQ21wSW5zdCA6IHB1YmxpYyBJbnN0cnVjdGlvbiB7CitwdWJsaWM6CisgIC8vLyBUaGlzIGVudW1lcmF0aW9uIGxpc3RzIHRoZSBwb3NzaWJsZSBwcmVkaWNhdGVzIGZvciBDbXBJbnN0IHN1YmNsYXNzZXMuCisgIC8vLyBWYWx1ZXMgaW4gdGhlIHJhbmdlIDAtMzEgYXJlIHJlc2VydmVkIGZvciBGQ21wSW5zdCwgd2hpbGUgdmFsdWVzIGluIHRoZQorICAvLy8gcmFuZ2UgMzItNjQgYXJlIHJlc2VydmVkIGZvciBJQ21wSW5zdC4gVGhpcyBpcyBuZWNlc3NhcnkgdG8gZW5zdXJlIHRoZQorICAvLy8gcHJlZGljYXRlIHZhbHVlcyBhcmUgbm90IG92ZXJsYXBwaW5nIGJldHdlZW4gdGhlIGNsYXNzZXMuCisgIC8vLworICAvLy8gU29tZSBwYXNzZXMgKGUuZy4gSW5zdENvbWJpbmUpIGRlcGVuZCBvbiB0aGUgYml0LXdpc2UgY2hhcmFjdGVyaXN0aWNzIG9mCisgIC8vLyBGQ01QXyogdmFsdWVzLiBDaGFuZ2luZyB0aGUgYml0IHBhdHRlcm5zIHJlcXVpcmVzIGEgcG90ZW50aWFsIGNoYW5nZSB0bworICAvLy8gdGhvc2UgcGFzc2VzLgorICBlbnVtIFByZWRpY2F0ZSB7CisgICAgLy8gT3Bjb2RlICAgICAgICAgICAgICBVIEwgRyBFICAgIEludHVpdGl2ZSBvcGVyYXRpb24KKyAgICBGQ01QX0ZBTFNFID0gIDAsICAvLy88IDAgMCAwIDAgICAgQWx3YXlzIGZhbHNlIChhbHdheXMgZm9sZGVkKQorICAgIEZDTVBfT0VRICAgPSAgMSwgIC8vLzwgMCAwIDAgMSAgICBUcnVlIGlmIG9yZGVyZWQgYW5kIGVxdWFsCisgICAgRkNNUF9PR1QgICA9ICAyLCAgLy8vPCAwIDAgMSAwICAgIFRydWUgaWYgb3JkZXJlZCBhbmQgZ3JlYXRlciB0aGFuCisgICAgRkNNUF9PR0UgICA9ICAzLCAgLy8vPCAwIDAgMSAxICAgIFRydWUgaWYgb3JkZXJlZCBhbmQgZ3JlYXRlciB0aGFuIG9yIGVxdWFsCisgICAgRkNNUF9PTFQgICA9ICA0LCAgLy8vPCAwIDEgMCAwICAgIFRydWUgaWYgb3JkZXJlZCBhbmQgbGVzcyB0aGFuCisgICAgRkNNUF9PTEUgICA9ICA1LCAgLy8vPCAwIDEgMCAxICAgIFRydWUgaWYgb3JkZXJlZCBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsCisgICAgRkNNUF9PTkUgICA9ICA2LCAgLy8vPCAwIDEgMSAwICAgIFRydWUgaWYgb3JkZXJlZCBhbmQgb3BlcmFuZHMgYXJlIHVuZXF1YWwKKyAgICBGQ01QX09SRCAgID0gIDcsICAvLy88IDAgMSAxIDEgICAgVHJ1ZSBpZiBvcmRlcmVkIChubyBuYW5zKQorICAgIEZDTVBfVU5PICAgPSAgOCwgIC8vLzwgMSAwIDAgMCAgICBUcnVlIGlmIHVub3JkZXJlZDogaXNuYW4oWCkgfCBpc25hbihZKQorICAgIEZDTVBfVUVRICAgPSAgOSwgIC8vLzwgMSAwIDAgMSAgICBUcnVlIGlmIHVub3JkZXJlZCBvciBlcXVhbAorICAgIEZDTVBfVUdUICAgPSAxMCwgIC8vLzwgMSAwIDEgMCAgICBUcnVlIGlmIHVub3JkZXJlZCBvciBncmVhdGVyIHRoYW4KKyAgICBGQ01QX1VHRSAgID0gMTEsICAvLy88IDEgMCAxIDEgICAgVHJ1ZSBpZiB1bm9yZGVyZWQsIGdyZWF0ZXIgdGhhbiwgb3IgZXF1YWwKKyAgICBGQ01QX1VMVCAgID0gMTIsICAvLy88IDEgMSAwIDAgICAgVHJ1ZSBpZiB1bm9yZGVyZWQgb3IgbGVzcyB0aGFuCisgICAgRkNNUF9VTEUgICA9IDEzLCAgLy8vPCAxIDEgMCAxICAgIFRydWUgaWYgdW5vcmRlcmVkLCBsZXNzIHRoYW4sIG9yIGVxdWFsCisgICAgRkNNUF9VTkUgICA9IDE0LCAgLy8vPCAxIDEgMSAwICAgIFRydWUgaWYgdW5vcmRlcmVkIG9yIG5vdCBlcXVhbAorICAgIEZDTVBfVFJVRSAgPSAxNSwgIC8vLzwgMSAxIDEgMSAgICBBbHdheXMgdHJ1ZSAoYWx3YXlzIGZvbGRlZCkKKyAgICBGSVJTVF9GQ01QX1BSRURJQ0FURSA9IEZDTVBfRkFMU0UsCisgICAgTEFTVF9GQ01QX1BSRURJQ0FURSA9IEZDTVBfVFJVRSwKKyAgICBCQURfRkNNUF9QUkVESUNBVEUgPSBGQ01QX1RSVUUgKyAxLAorICAgIElDTVBfRVEgICAgPSAzMiwgIC8vLzwgZXF1YWwKKyAgICBJQ01QX05FICAgID0gMzMsICAvLy88IG5vdCBlcXVhbAorICAgIElDTVBfVUdUICAgPSAzNCwgIC8vLzwgdW5zaWduZWQgZ3JlYXRlciB0aGFuCisgICAgSUNNUF9VR0UgICA9IDM1LCAgLy8vPCB1bnNpZ25lZCBncmVhdGVyIG9yIGVxdWFsCisgICAgSUNNUF9VTFQgICA9IDM2LCAgLy8vPCB1bnNpZ25lZCBsZXNzIHRoYW4KKyAgICBJQ01QX1VMRSAgID0gMzcsICAvLy88IHVuc2lnbmVkIGxlc3Mgb3IgZXF1YWwKKyAgICBJQ01QX1NHVCAgID0gMzgsICAvLy88IHNpZ25lZCBncmVhdGVyIHRoYW4KKyAgICBJQ01QX1NHRSAgID0gMzksICAvLy88IHNpZ25lZCBncmVhdGVyIG9yIGVxdWFsCisgICAgSUNNUF9TTFQgICA9IDQwLCAgLy8vPCBzaWduZWQgbGVzcyB0aGFuCisgICAgSUNNUF9TTEUgICA9IDQxLCAgLy8vPCBzaWduZWQgbGVzcyBvciBlcXVhbAorICAgIEZJUlNUX0lDTVBfUFJFRElDQVRFID0gSUNNUF9FUSwKKyAgICBMQVNUX0lDTVBfUFJFRElDQVRFID0gSUNNUF9TTEUsCisgICAgQkFEX0lDTVBfUFJFRElDQVRFID0gSUNNUF9TTEUgKyAxCisgIH07CisKK3Byb3RlY3RlZDoKKyAgQ21wSW5zdChUeXBlICp0eSwgSW5zdHJ1Y3Rpb246Ok90aGVyT3BzIG9wLCBQcmVkaWNhdGUgcHJlZCwKKyAgICAgICAgICBWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLCBjb25zdCBUd2luZSAmTmFtZSA9ICIiLAorICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKworICBDbXBJbnN0KFR5cGUgKnR5LCBJbnN0cnVjdGlvbjo6T3RoZXJPcHMgb3AsIFByZWRpY2F0ZSBwcmVkLAorICAgICAgICAgIFZhbHVlICpMSFMsIFZhbHVlICpSSFMsIGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworcHVibGljOgorICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSB0d28gb3BlcmFuZHMKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSB7CisgICAgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzLCAyKTsKKyAgfQorCisgIC8vLyBDb25zdHJ1Y3QgYSBjb21wYXJlIGluc3RydWN0aW9uLCBnaXZlbiB0aGUgb3Bjb2RlLCB0aGUgcHJlZGljYXRlIGFuZAorICAvLy8gdGhlIHR3byBvcGVyYW5kcy4gIE9wdGlvbmFsbHkgKGlmIEluc3RCZWZvcmUgaXMgc3BlY2lmaWVkKSBpbnNlcnQgdGhlCisgIC8vLyBpbnN0cnVjdGlvbiBpbnRvIGEgQmFzaWNCbG9jayByaWdodCBiZWZvcmUgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbi4KKyAgLy8vIFRoZSBzcGVjaWZpZWQgSW5zdHJ1Y3Rpb24gaXMgYWxsb3dlZCB0byBiZSBhIGRlcmVmZXJlbmNlZCBlbmQgaXRlcmF0b3IuCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgQ21wSW5zdAorICBzdGF0aWMgQ21wSW5zdCAqQ3JlYXRlKE90aGVyT3BzIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgIFByZWRpY2F0ZSBwcmVkaWNhdGUsIFZhbHVlICpTMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqUzIsIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworCisgIC8vLyBDb25zdHJ1Y3QgYSBjb21wYXJlIGluc3RydWN0aW9uLCBnaXZlbiB0aGUgb3Bjb2RlLCB0aGUgcHJlZGljYXRlIGFuZCB0aGUKKyAgLy8vIHR3byBvcGVyYW5kcy4gIEFsc28gYXV0b21hdGljYWxseSBpbnNlcnQgdGhpcyBpbnN0cnVjdGlvbiB0byB0aGUgZW5kIG9mCisgIC8vLyB0aGUgQmFzaWNCbG9jayBzcGVjaWZpZWQuCisgIC8vLyBAYnJpZWYgQ3JlYXRlIGEgQ21wSW5zdAorICBzdGF0aWMgQ21wSW5zdCAqQ3JlYXRlKE90aGVyT3BzIE9wLCBQcmVkaWNhdGUgcHJlZGljYXRlLCBWYWx1ZSAqUzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKlMyLCBjb25zdCBUd2luZSAmTmFtZSwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBvcGNvZGUgY2FzdGVkIHRvIHRoZSByaWdodCB0eXBlCisgIE90aGVyT3BzIGdldE9wY29kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8T3RoZXJPcHM+KEluc3RydWN0aW9uOjpnZXRPcGNvZGUoKSk7CisgIH0KKworICAvLy8gQGJyaWVmIFJldHVybiB0aGUgcHJlZGljYXRlIGZvciB0aGlzIGluc3RydWN0aW9uLgorICBQcmVkaWNhdGUgZ2V0UHJlZGljYXRlKCkgY29uc3QgeworICAgIHJldHVybiBQcmVkaWNhdGUoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkpOworICB9CisKKyAgLy8vIEBicmllZiBTZXQgdGhlIHByZWRpY2F0ZSBmb3IgdGhpcyBpbnN0cnVjdGlvbiB0byB0aGUgc3BlY2lmaWVkIHZhbHVlLgorICB2b2lkIHNldFByZWRpY2F0ZShQcmVkaWNhdGUgUCkgeyBzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YShQKTsgfQorCisgIHN0YXRpYyBib29sIGlzRlBQcmVkaWNhdGUoUHJlZGljYXRlIFApIHsKKyAgICByZXR1cm4gUCA+PSBGSVJTVF9GQ01QX1BSRURJQ0FURSAmJiBQIDw9IExBU1RfRkNNUF9QUkVESUNBVEU7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0ludFByZWRpY2F0ZShQcmVkaWNhdGUgUCkgeworICAgIHJldHVybiBQID49IEZJUlNUX0lDTVBfUFJFRElDQVRFICYmIFAgPD0gTEFTVF9JQ01QX1BSRURJQ0FURTsKKyAgfQorCisgIHN0YXRpYyBTdHJpbmdSZWYgZ2V0UHJlZGljYXRlTmFtZShQcmVkaWNhdGUgUCk7CisKKyAgYm9vbCBpc0ZQUHJlZGljYXRlKCkgY29uc3QgeyByZXR1cm4gaXNGUFByZWRpY2F0ZShnZXRQcmVkaWNhdGUoKSk7IH0KKyAgYm9vbCBpc0ludFByZWRpY2F0ZSgpIGNvbnN0IHsgcmV0dXJuIGlzSW50UHJlZGljYXRlKGdldFByZWRpY2F0ZSgpKTsgfQorCisgIC8vLyBGb3IgZXhhbXBsZSwgRVEgLT4gTkUsIFVHVCAtPiBVTEUsIFNMVCAtPiBTR0UsCisgIC8vLyAgICAgICAgICAgICAgT0VRIC0+IFVORSwgVUdUIC0+IE9MRSwgT0xUIC0+IFVHRSwgZXRjLgorICAvLy8gQHJldHVybnMgdGhlIGludmVyc2UgcHJlZGljYXRlIGZvciB0aGUgaW5zdHJ1Y3Rpb24ncyBjdXJyZW50IHByZWRpY2F0ZS4KKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIGludmVyc2Ugb2YgdGhlIGluc3RydWN0aW9uJ3MgcHJlZGljYXRlLgorICBQcmVkaWNhdGUgZ2V0SW52ZXJzZVByZWRpY2F0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SW52ZXJzZVByZWRpY2F0ZShnZXRQcmVkaWNhdGUoKSk7CisgIH0KKworICAvLy8gRm9yIGV4YW1wbGUsIEVRIC0+IE5FLCBVR1QgLT4gVUxFLCBTTFQgLT4gU0dFLAorICAvLy8gICAgICAgICAgICAgIE9FUSAtPiBVTkUsIFVHVCAtPiBPTEUsIE9MVCAtPiBVR0UsIGV0Yy4KKyAgLy8vIEByZXR1cm5zIHRoZSBpbnZlcnNlIHByZWRpY2F0ZSBmb3IgcHJlZGljYXRlIHByb3ZpZGVkIGluIFxwIHByZWQuCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBpbnZlcnNlIG9mIGEgZ2l2ZW4gcHJlZGljYXRlCisgIHN0YXRpYyBQcmVkaWNhdGUgZ2V0SW52ZXJzZVByZWRpY2F0ZShQcmVkaWNhdGUgcHJlZCk7CisKKyAgLy8vIEZvciBleGFtcGxlLCBFUS0+RVEsIFNMRS0+U0dFLCBVTFQtPlVHVCwKKyAgLy8vICAgICAgICAgICAgICBPRVEtPk9FUSwgVUxFLT5VR0UsIE9MVC0+T0dULCBldGMuCisgIC8vLyBAcmV0dXJucyB0aGUgcHJlZGljYXRlIHRoYXQgd291bGQgYmUgdGhlIHJlc3VsdCBvZiBleGNoYW5naW5nIHRoZSB0d28KKyAgLy8vIG9wZXJhbmRzIG9mIHRoZSBDbXBJbnN0IGluc3RydWN0aW9uIHdpdGhvdXQgY2hhbmdpbmcgdGhlIHJlc3VsdAorICAvLy8gcHJvZHVjZWQuCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBwcmVkaWNhdGUgYXMgaWYgdGhlIG9wZXJhbmRzIHdlcmUgc3dhcHBlZAorICBQcmVkaWNhdGUgZ2V0U3dhcHBlZFByZWRpY2F0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3dhcHBlZFByZWRpY2F0ZShnZXRQcmVkaWNhdGUoKSk7CisgIH0KKworICAvLy8gVGhpcyBpcyBhIHN0YXRpYyB2ZXJzaW9uIHRoYXQgeW91IGNhbiB1c2Ugd2l0aG91dCBhbiBpbnN0cnVjdGlvbgorICAvLy8gYXZhaWxhYmxlLgorICAvLy8gQGJyaWVmIFJldHVybiB0aGUgcHJlZGljYXRlIGFzIGlmIHRoZSBvcGVyYW5kcyB3ZXJlIHN3YXBwZWQuCisgIHN0YXRpYyBQcmVkaWNhdGUgZ2V0U3dhcHBlZFByZWRpY2F0ZShQcmVkaWNhdGUgcHJlZCk7CisKKyAgLy8vIEZvciBwcmVkaWNhdGUgb2Yga2luZCAiaXMgWCBvciBlcXVhbCB0byAwIiByZXR1cm5zIHRoZSBwcmVkaWNhdGUgImlzIFgiLgorICAvLy8gRm9yIHByZWRpY2F0ZSBvZiBraW5kICJpcyBYIiByZXR1cm5zIHRoZSBwcmVkaWNhdGUgImlzIFggb3IgZXF1YWwgdG8gMCIuCisgIC8vLyBkb2VzIG5vdCBzdXBwb3J0IG90aGVyIGtpbmQgb2YgcHJlZGljYXRlcy4KKyAgLy8vIEByZXR1cm5zIHRoZSBwcmVkaWNhdGUgdGhhdCBkb2VzIG5vdCBjb250YWlucyBpcyBlcXVhbCB0byB6ZXJvIGlmCisgIC8vLyBpdCBoYWQgYW5kIHZpY2UgdmVyc2EuCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRoZSBmbGlwcGVkIHN0cmljdG5lc3Mgb2YgcHJlZGljYXRlCisgIFByZWRpY2F0ZSBnZXRGbGlwcGVkU3RyaWN0bmVzc1ByZWRpY2F0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RmxpcHBlZFN0cmljdG5lc3NQcmVkaWNhdGUoZ2V0UHJlZGljYXRlKCkpOworICB9CisKKyAgLy8vIFRoaXMgaXMgYSBzdGF0aWMgdmVyc2lvbiB0aGF0IHlvdSBjYW4gdXNlIHdpdGhvdXQgYW4gaW5zdHJ1Y3Rpb24KKyAgLy8vIGF2YWlsYWJsZS4KKyAgLy8vIEBicmllZiBSZXR1cm4gdGhlIGZsaXBwZWQgc3RyaWN0bmVzcyBvZiBwcmVkaWNhdGUKKyAgc3RhdGljIFByZWRpY2F0ZSBnZXRGbGlwcGVkU3RyaWN0bmVzc1ByZWRpY2F0ZShQcmVkaWNhdGUgcHJlZCk7CisKKyAgLy8vIEZvciBleGFtcGxlLCBTR1QgLT4gU0dFLCBTTFQgLT4gU0xFLCBVTFQgLT4gVUxFLCBVR1QgLT4gVUdFLgorICAvLy8gQGJyaWVmIFJldHVybnMgdGhlIG5vbi1zdHJpY3QgdmVyc2lvbiBvZiBzdHJpY3QgY29tcGFyaXNvbnMuCisgIFByZWRpY2F0ZSBnZXROb25TdHJpY3RQcmVkaWNhdGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE5vblN0cmljdFByZWRpY2F0ZShnZXRQcmVkaWNhdGUoKSk7CisgIH0KKworICAvLy8gVGhpcyBpcyBhIHN0YXRpYyB2ZXJzaW9uIHRoYXQgeW91IGNhbiB1c2Ugd2l0aG91dCBhbiBpbnN0cnVjdGlvbgorICAvLy8gYXZhaWxhYmxlLgorICAvLy8gQHJldHVybnMgdGhlIG5vbi1zdHJpY3QgdmVyc2lvbiBvZiBjb21wYXJpc29uIHByb3ZpZGVkIGluIFxwIHByZWQuCisgIC8vLyBJZiBccCBwcmVkIGlzIG5vdCBhIHN0cmljdCBjb21wYXJpc29uIHByZWRpY2F0ZSwgcmV0dXJucyBccCBwcmVkLgorICAvLy8gQGJyaWVmIFJldHVybnMgdGhlIG5vbi1zdHJpY3QgdmVyc2lvbiBvZiBzdHJpY3QgY29tcGFyaXNvbnMuCisgIHN0YXRpYyBQcmVkaWNhdGUgZ2V0Tm9uU3RyaWN0UHJlZGljYXRlKFByZWRpY2F0ZSBwcmVkKTsKKworICAvLy8gQGJyaWVmIFByb3ZpZGUgbW9yZSBlZmZpY2llbnQgZ2V0T3BlcmFuZCBtZXRob2RzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICAvLy8gVGhpcyBpcyBqdXN0IGEgY29udmVuaWVuY2UgdGhhdCBkaXNwYXRjaGVzIHRvIHRoZSBzdWJjbGFzc2VzLgorICAvLy8gQGJyaWVmIFN3YXAgdGhlIG9wZXJhbmRzIGFuZCBhZGp1c3QgcHJlZGljYXRlIGFjY29yZGluZ2x5IHRvIHJldGFpbgorICAvLy8gdGhlIHNhbWUgY29tcGFyaXNvbi4KKyAgdm9pZCBzd2FwT3BlcmFuZHMoKTsKKworICAvLy8gVGhpcyBpcyBqdXN0IGEgY29udmVuaWVuY2UgdGhhdCBkaXNwYXRjaGVzIHRvIHRoZSBzdWJjbGFzc2VzLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGlzIENtcEluc3QgaXMgY29tbXV0YXRpdmUuCisgIGJvb2wgaXNDb21tdXRhdGl2ZSgpIGNvbnN0OworCisgIC8vLyBUaGlzIGlzIGp1c3QgYSBjb252ZW5pZW5jZSB0aGF0IGRpc3BhdGNoZXMgdG8gdGhlIHN1YmNsYXNzZXMuCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYW4gZXF1YWxzL25vdCBlcXVhbHMgcHJlZGljYXRlLgorICBib29sIGlzRXF1YWxpdHkoKSBjb25zdDsKKworICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGUgY29tcGFyaXNvbiBpcyBzaWduZWQsIGZhbHNlIG90aGVyd2lzZS4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBpbnN0cnVjdGlvbiBpcyB1c2luZyBhIHNpZ25lZCBjb21wYXJpc29uLgorICBib29sIGlzU2lnbmVkKCkgY29uc3QgeworICAgIHJldHVybiBpc1NpZ25lZChnZXRQcmVkaWNhdGUoKSk7CisgIH0KKworICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGUgY29tcGFyaXNvbiBpcyB1bnNpZ25lZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGlzIGluc3RydWN0aW9uIGlzIHVzaW5nIGFuIHVuc2lnbmVkIGNvbXBhcmlzb24uCisgIGJvb2wgaXNVbnNpZ25lZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNVbnNpZ25lZChnZXRQcmVkaWNhdGUoKSk7CisgIH0KKworICAvLy8gRm9yIGV4YW1wbGUsIFVMVC0+U0xULCBVTEUtPlNMRSwgVUdULT5TR1QsIFVHRS0+U0dFLCBTTFQtPkZhaWxlZCBhc3NlcnQKKyAgLy8vIEByZXR1cm5zIHRoZSBzaWduZWQgdmVyc2lvbiBvZiB0aGUgdW5zaWduZWQgcHJlZGljYXRlIHByZWQuCisgIC8vLyBAYnJpZWYgcmV0dXJuIHRoZSBzaWduZWQgdmVyc2lvbiBvZiBhIHByZWRpY2F0ZQorICBzdGF0aWMgUHJlZGljYXRlIGdldFNpZ25lZFByZWRpY2F0ZShQcmVkaWNhdGUgcHJlZCk7CisKKyAgLy8vIEZvciBleGFtcGxlLCBVTFQtPlNMVCwgVUxFLT5TTEUsIFVHVC0+U0dULCBVR0UtPlNHRSwgU0xULT5GYWlsZWQgYXNzZXJ0CisgIC8vLyBAcmV0dXJucyB0aGUgc2lnbmVkIHZlcnNpb24gb2YgdGhlIHByZWRpY2F0ZSBmb3IgdGhpcyBpbnN0cnVjdGlvbiAod2hpY2gKKyAgLy8vIGhhcyB0byBiZSBhbiB1bnNpZ25lZCBwcmVkaWNhdGUpLgorICAvLy8gQGJyaWVmIHJldHVybiB0aGUgc2lnbmVkIHZlcnNpb24gb2YgYSBwcmVkaWNhdGUKKyAgUHJlZGljYXRlIGdldFNpZ25lZFByZWRpY2F0ZSgpIHsKKyAgICByZXR1cm4gZ2V0U2lnbmVkUHJlZGljYXRlKGdldFByZWRpY2F0ZSgpKTsKKyAgfQorCisgIC8vLyBUaGlzIGlzIGp1c3QgYSBjb252ZW5pZW5jZS4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhpcyBpcyB0cnVlIHdoZW4gYm90aCBvcGVyYW5kcyBhcmUgdGhlIHNhbWUuCisgIGJvb2wgaXNUcnVlV2hlbkVxdWFsKCkgY29uc3QgeworICAgIHJldHVybiBpc1RydWVXaGVuRXF1YWwoZ2V0UHJlZGljYXRlKCkpOworICB9CisKKyAgLy8vIFRoaXMgaXMganVzdCBhIGNvbnZlbmllbmNlLgorICAvLy8gQGJyaWVmIERldGVybWluZSBpZiB0aGlzIGlzIGZhbHNlIHdoZW4gYm90aCBvcGVyYW5kcyBhcmUgdGhlIHNhbWUuCisgIGJvb2wgaXNGYWxzZVdoZW5FcXVhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNGYWxzZVdoZW5FcXVhbChnZXRQcmVkaWNhdGUoKSk7CisgIH0KKworICAvLy8gQHJldHVybnMgdHJ1ZSBpZiB0aGUgcHJlZGljYXRlIGlzIHVuc2lnbmVkLCBmYWxzZSBvdGhlcndpc2UuCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBwcmVkaWNhdGUgaXMgYW4gdW5zaWduZWQgb3BlcmF0aW9uLgorICBzdGF0aWMgYm9vbCBpc1Vuc2lnbmVkKFByZWRpY2F0ZSBwcmVkaWNhdGUpOworCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmIHRoZSBwcmVkaWNhdGUgaXMgc2lnbmVkLCBmYWxzZSBvdGhlcndpc2UuCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBwcmVkaWNhdGUgaXMgYW4gc2lnbmVkIG9wZXJhdGlvbi4KKyAgc3RhdGljIGJvb2wgaXNTaWduZWQoUHJlZGljYXRlIHByZWRpY2F0ZSk7CisKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIHByZWRpY2F0ZSBpcyBhbiBvcmRlcmVkIG9wZXJhdGlvbi4KKyAgc3RhdGljIGJvb2wgaXNPcmRlcmVkKFByZWRpY2F0ZSBwcmVkaWNhdGUpOworCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBwcmVkaWNhdGUgaXMgYW4gdW5vcmRlcmVkIG9wZXJhdGlvbi4KKyAgc3RhdGljIGJvb2wgaXNVbm9yZGVyZWQoUHJlZGljYXRlIHByZWRpY2F0ZSk7CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgcHJlZGljYXRlIGlzIHRydWUgd2hlbiBjb21wYXJpbmcgYSB2YWx1ZSB3aXRoIGl0c2VsZi4KKyAgc3RhdGljIGJvb2wgaXNUcnVlV2hlbkVxdWFsKFByZWRpY2F0ZSBwcmVkaWNhdGUpOworCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIHByZWRpY2F0ZSBpcyBmYWxzZSB3aGVuIGNvbXBhcmluZyBhIHZhbHVlIHdpdGggaXRzZWxmLgorICBzdGF0aWMgYm9vbCBpc0ZhbHNlV2hlbkVxdWFsKFByZWRpY2F0ZSBwcmVkaWNhdGUpOworCisgIC8vLyBEZXRlcm1pbmUgaWYgUHJlZDEgaW1wbGllcyBQcmVkMiBpcyB0cnVlIHdoZW4gdHdvIGNvbXBhcmVzIGhhdmUgbWF0Y2hpbmcKKyAgLy8vIG9wZXJhbmRzLgorICBzdGF0aWMgYm9vbCBpc0ltcGxpZWRUcnVlQnlNYXRjaGluZ0NtcChQcmVkaWNhdGUgUHJlZDEsIFByZWRpY2F0ZSBQcmVkMik7CisKKyAgLy8vIERldGVybWluZSBpZiBQcmVkMSBpbXBsaWVzIFByZWQyIGlzIGZhbHNlIHdoZW4gdHdvIGNvbXBhcmVzIGhhdmUgbWF0Y2hpbmcKKyAgLy8vIG9wZXJhbmRzLgorICBzdGF0aWMgYm9vbCBpc0ltcGxpZWRGYWxzZUJ5TWF0Y2hpbmdDbXAoUHJlZGljYXRlIFByZWQxLCBQcmVkaWNhdGUgUHJlZDIpOworCisgIC8vLyBAYnJpZWYgTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6SUNtcCB8fAorICAgICAgICAgICBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RkNtcDsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KKworICAvLy8gQGJyaWVmIENyZWF0ZSBhIHJlc3VsdCB0eXBlIGZvciBmY21wL2ljbXAKKyAgc3RhdGljIFR5cGUqIG1ha2VDbXBSZXN1bHRUeXBlKFR5cGUqIG9wbmRfdHlwZSkgeworICAgIGlmIChWZWN0b3JUeXBlKiB2dCA9IGR5bl9jYXN0PFZlY3RvclR5cGU+KG9wbmRfdHlwZSkpIHsKKyAgICAgIHJldHVybiBWZWN0b3JUeXBlOjpnZXQoVHlwZTo6Z2V0SW50MVR5KG9wbmRfdHlwZS0+Z2V0Q29udGV4dCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdnQtPmdldE51bUVsZW1lbnRzKCkpOworICAgIH0KKyAgICByZXR1cm4gVHlwZTo6Z2V0SW50MVR5KG9wbmRfdHlwZS0+Z2V0Q29udGV4dCgpKTsKKyAgfQorCitwcml2YXRlOgorICAvLyBTaGFkb3cgVmFsdWU6OnNldFZhbHVlU3ViY2xhc3NEYXRhIHdpdGggYSBwcml2YXRlIGZvcndhcmRpbmcgbWV0aG9kIHNvIHRoYXQKKyAgLy8gc3ViY2xhc3NlcyBjYW5ub3QgYWNjaWRlbnRhbGx5IHVzZSBpdC4KKyAgdm9pZCBzZXRWYWx1ZVN1YmNsYXNzRGF0YSh1bnNpZ25lZCBzaG9ydCBEKSB7CisgICAgVmFsdWU6OnNldFZhbHVlU3ViY2xhc3NEYXRhKEQpOworICB9Cit9OworCisvLyBGSVhNRTogdGhlc2UgYXJlIHJlZHVuZGFudCBpZiBDbXBJbnN0IDwgQmluYXJ5T3BlcmF0b3IKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxDbXBJbnN0PiA6IHB1YmxpYyBGaXhlZE51bU9wZXJhbmRUcmFpdHM8Q21wSW5zdCwgMj4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKENtcEluc3QsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jbGV0UGFkSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2NsYXNzIEZ1bmNsZXRQYWRJbnN0IDogcHVibGljIEluc3RydWN0aW9uIHsKK3ByaXZhdGU6CisgIEZ1bmNsZXRQYWRJbnN0KGNvbnN0IEZ1bmNsZXRQYWRJbnN0ICZDUEkpOworCisgIGV4cGxpY2l0IEZ1bmNsZXRQYWRJbnN0KEluc3RydWN0aW9uOjpGdW5jbGV0UGFkT3BzIE9wLCBWYWx1ZSAqUGFyZW50UGFkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLCB1bnNpZ25lZCBWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKyAgZXhwbGljaXQgRnVuY2xldFBhZEluc3QoSW5zdHJ1Y3Rpb246OkZ1bmNsZXRQYWRPcHMgT3AsIFZhbHVlICpQYXJlbnRQYWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsIHVuc2lnbmVkIFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICB2b2lkIGluaXQoVmFsdWUgKlBhcmVudFBhZCwgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywgY29uc3QgVHdpbmUgJk5hbWVTdHIpOworCitwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKyAgZnJpZW5kIGNsYXNzIENhdGNoUGFkSW5zdDsKKyAgZnJpZW5kIGNsYXNzIENsZWFudXBQYWRJbnN0OworCisgIEZ1bmNsZXRQYWRJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLy8gUHJvdmlkZSBmYXN0IG9wZXJhbmQgYWNjZXNzb3JzCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworCisgIC8vLyBnZXROdW1BcmdPcGVyYW5kcyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIGZ1bmNsZXRwYWQgYXJndW1lbnRzLgorICAvLy8KKyAgdW5zaWduZWQgZ2V0TnVtQXJnT3BlcmFuZHMoKSBjb25zdCB7IHJldHVybiBnZXROdW1PcGVyYW5kcygpIC0gMTsgfQorCisgIC8vLyBDb252ZW5pZW5jZSBhY2Nlc3NvcnMKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgb3V0ZXIgRUgtcGFkIHRoaXMgZnVuY2xldCBpcyBuZXN0ZWQgd2l0aGluLgorICAvLy8KKyAgLy8vIE5vdGU6IFRoaXMgcmV0dXJucyB0aGUgYXNzb2NpYXRlZCBDYXRjaFN3aXRjaEluc3QgaWYgdGhpcyBGdW5jbGV0UGFkSW5zdAorICAvLy8gaXMgYSBDYXRjaFBhZEluc3QuCisgIFZhbHVlICpnZXRQYXJlbnRQYWQoKSBjb25zdCB7IHJldHVybiBPcDwtMT4oKTsgfQorICB2b2lkIHNldFBhcmVudFBhZChWYWx1ZSAqUGFyZW50UGFkKSB7CisgICAgYXNzZXJ0KFBhcmVudFBhZCk7CisgICAgT3A8LTE+KCkgPSBQYXJlbnRQYWQ7CisgIH0KKworICAvLy8gZ2V0QXJnT3BlcmFuZC9zZXRBcmdPcGVyYW5kIC0gUmV0dXJuL3NldCB0aGUgaS10aCBmdW5jbGV0cGFkIGFyZ3VtZW50LgorICAvLy8KKyAgVmFsdWUgKmdldEFyZ09wZXJhbmQodW5zaWduZWQgaSkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZChpKTsgfQorICB2b2lkIHNldEFyZ09wZXJhbmQodW5zaWduZWQgaSwgVmFsdWUgKnYpIHsgc2V0T3BlcmFuZChpLCB2KTsgfQorCisgIC8vLyBhcmdfb3BlcmFuZHMgLSBpdGVyYXRpb24gYWRhcHRlciBmb3IgcmFuZ2UtZm9yIGxvb3BzLgorICBvcF9yYW5nZSBhcmdfb3BlcmFuZHMoKSB7IHJldHVybiBvcF9yYW5nZShvcF9iZWdpbigpLCBvcF9lbmQoKSAtIDEpOyB9CisKKyAgLy8vIGFyZ19vcGVyYW5kcyAtIGl0ZXJhdGlvbiBhZGFwdGVyIGZvciByYW5nZS1mb3IgbG9vcHMuCisgIGNvbnN0X29wX3JhbmdlIGFyZ19vcGVyYW5kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3Rfb3BfcmFuZ2Uob3BfYmVnaW4oKSwgb3BfZW5kKCkgLSAxKTsKKyAgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsgcmV0dXJuIEktPmlzRnVuY2xldFBhZCgpOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPEZ1bmNsZXRQYWRJbnN0PgorICAgIDogcHVibGljIFZhcmlhZGljT3BlcmFuZFRyYWl0czxGdW5jbGV0UGFkSW5zdCwgLypNSU5BUklUWT0qLzE+IHt9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoRnVuY2xldFBhZEluc3QsIFZhbHVlKQorCisvLy8gXGJyaWVmIEEgbGlnaHR3ZWlnaHQgYWNjZXNzb3IgZm9yIGFuIG9wZXJhbmQgYnVuZGxlIG1lYW50IHRvIGJlIHBhc3NlZAorLy8vIGFyb3VuZCBieSB2YWx1ZS4KK3N0cnVjdCBPcGVyYW5kQnVuZGxlVXNlIHsKKyAgQXJyYXlSZWY8VXNlPiBJbnB1dHM7CisKKyAgT3BlcmFuZEJ1bmRsZVVzZSgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgT3BlcmFuZEJ1bmRsZVVzZShTdHJpbmdNYXBFbnRyeTx1aW50MzJfdD4gKlRhZywgQXJyYXlSZWY8VXNlPiBJbnB1dHMpCisgICAgICA6IElucHV0cyhJbnB1dHMpLCBUYWcoVGFnKSB7fQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIG9wZXJhbmQgYXQgaW5kZXggXHAgSWR4IGluIHRoaXMgb3BlcmFuZCBidW5kbGUKKyAgLy8vIGhhcyB0aGUgYXR0cmlidXRlIEEuCisgIGJvb2wgb3BlcmFuZEhhc0F0dHIodW5zaWduZWQgSWR4LCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEEpIGNvbnN0IHsKKyAgICBpZiAoaXNEZW9wdE9wZXJhbmRCdW5kbGUoKSkKKyAgICAgIGlmIChBID09IEF0dHJpYnV0ZTo6UmVhZE9ubHkgfHwgQSA9PSBBdHRyaWJ1dGU6Ok5vQ2FwdHVyZSkKKyAgICAgICAgcmV0dXJuIElucHV0c1tJZHhdLT5nZXRUeXBlKCktPmlzUG9pbnRlclR5KCk7CisKKyAgICAvLyBDb25zZXJ2YXRpdmUgYW5zd2VyOiAgbm8gb3BlcmFuZHMgaGF2ZSBhbnkgYXR0cmlidXRlcy4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdGFnIG9mIHRoaXMgb3BlcmFuZCBidW5kbGUgYXMgYSBzdHJpbmcuCisgIFN0cmluZ1JlZiBnZXRUYWdOYW1lKCkgY29uc3QgeworICAgIHJldHVybiBUYWctPmdldEtleSgpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHRhZyBvZiB0aGlzIG9wZXJhbmQgYnVuZGxlIGFzIGFuIGludGVnZXIuCisgIC8vLworICAvLy8gT3BlcmFuZCBidW5kbGUgdGFncyBhcmUgaW50ZXJuZWQgYnkgTExWTUNvbnRleHRJbXBsOjpnZXRPckluc2VydEJ1bmRsZVRhZywKKyAgLy8vIGFuZCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHVuaXF1ZSBpbnRlZ2VyIGdldE9ySW5zZXJ0QnVuZGxlVGFnCisgIC8vLyBhc3NvY2lhdGVkIHRoZSB0YWcgb2YgdGhpcyBvcGVyYW5kIGJ1bmRsZSB0by4KKyAgdWludDMyX3QgZ2V0VGFnSUQoKSBjb25zdCB7CisgICAgcmV0dXJuIFRhZy0+Z2V0VmFsdWUoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhICJkZW9wdCIgb3BlcmFuZCBidW5kbGUuCisgIGJvb2wgaXNEZW9wdE9wZXJhbmRCdW5kbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRhZ0lEKCkgPT0gTExWTUNvbnRleHQ6Ok9CX2Rlb3B0OworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgImZ1bmNsZXQiIG9wZXJhbmQgYnVuZGxlLgorICBib29sIGlzRnVuY2xldE9wZXJhbmRCdW5kbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFRhZ0lEKCkgPT0gTExWTUNvbnRleHQ6Ok9CX2Z1bmNsZXQ7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBQb2ludGVyIHRvIGFuIGVudHJ5IGluIExMVk1Db250ZXh0SW1wbDo6Z2V0T3JJbnNlcnRCdW5kbGVUYWcuCisgIFN0cmluZ01hcEVudHJ5PHVpbnQzMl90PiAqVGFnOworfTsKKworLy8vIFxicmllZiBBIGNvbnRhaW5lciBmb3IgYW4gb3BlcmFuZCBidW5kbGUgYmVpbmcgdmlld2VkIGFzIGEgc2V0IG9mIHZhbHVlcworLy8vIHJhdGhlciB0aGFuIGEgc2V0IG9mIHVzZXMuCisvLy8KKy8vLyBVbmxpa2UgT3BlcmFuZEJ1bmRsZVVzZSwgT3BlcmFuZEJ1bmRsZURlZlQgb3ducyB0aGUgbWVtb3J5IGl0IGNhcnJpZXMsIGFuZAorLy8vIHNvIGl0IGlzIHBvc3NpYmxlIHRvIGNyZWF0ZSBhbmQgcGFzcyBhcm91bmQgInNlbGYtY29udGFpbmVkIiBpbnN0YW5jZXMgb2YKKy8vLyBPcGVyYW5kQnVuZGxlRGVmIGFuZCBDb25zdE9wZXJhbmRCdW5kbGVEZWYuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5wdXRUeT4gY2xhc3MgT3BlcmFuZEJ1bmRsZURlZlQgeworICBzdGQ6OnN0cmluZyBUYWc7CisgIHN0ZDo6dmVjdG9yPElucHV0VHk+IElucHV0czsKKworcHVibGljOgorICBleHBsaWNpdCBPcGVyYW5kQnVuZGxlRGVmVChzdGQ6OnN0cmluZyBUYWcsIHN0ZDo6dmVjdG9yPElucHV0VHk+IElucHV0cykKKyAgICAgIDogVGFnKHN0ZDo6bW92ZShUYWcpKSwgSW5wdXRzKHN0ZDo6bW92ZShJbnB1dHMpKSB7fQorICBleHBsaWNpdCBPcGVyYW5kQnVuZGxlRGVmVChzdGQ6OnN0cmluZyBUYWcsIEFycmF5UmVmPElucHV0VHk+IElucHV0cykKKyAgICAgIDogVGFnKHN0ZDo6bW92ZShUYWcpKSwgSW5wdXRzKElucHV0cykge30KKworICBleHBsaWNpdCBPcGVyYW5kQnVuZGxlRGVmVChjb25zdCBPcGVyYW5kQnVuZGxlVXNlICZPQlUpIHsKKyAgICBUYWcgPSBPQlUuZ2V0VGFnTmFtZSgpOworICAgIElucHV0cy5pbnNlcnQoSW5wdXRzLmVuZCgpLCBPQlUuSW5wdXRzLmJlZ2luKCksIE9CVS5JbnB1dHMuZW5kKCkpOworICB9CisKKyAgQXJyYXlSZWY8SW5wdXRUeT4gaW5wdXRzKCkgY29uc3QgeyByZXR1cm4gSW5wdXRzOyB9CisKKyAgdXNpbmcgaW5wdXRfaXRlcmF0b3IgPSB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxJbnB1dFR5Pjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgc2l6ZV90IGlucHV0X3NpemUoKSBjb25zdCB7IHJldHVybiBJbnB1dHMuc2l6ZSgpOyB9CisgIGlucHV0X2l0ZXJhdG9yIGlucHV0X2JlZ2luKCkgY29uc3QgeyByZXR1cm4gSW5wdXRzLmJlZ2luKCk7IH0KKyAgaW5wdXRfaXRlcmF0b3IgaW5wdXRfZW5kKCkgY29uc3QgeyByZXR1cm4gSW5wdXRzLmVuZCgpOyB9CisKKyAgU3RyaW5nUmVmIGdldFRhZygpIGNvbnN0IHsgcmV0dXJuIFRhZzsgfQorfTsKKwordXNpbmcgT3BlcmFuZEJ1bmRsZURlZiA9IE9wZXJhbmRCdW5kbGVEZWZUPFZhbHVlICo+OwordXNpbmcgQ29uc3RPcGVyYW5kQnVuZGxlRGVmID0gT3BlcmFuZEJ1bmRsZURlZlQ8Y29uc3QgVmFsdWUgKj47CisKKy8vLyBcYnJpZWYgQSBtaXhpbiB0byBhZGQgb3BlcmFuZCBidW5kbGUgZnVuY3Rpb25hbGl0eSB0byBsbHZtIGluc3RydWN0aW9uCisvLy8gY2xhc3Nlcy4KKy8vLworLy8vIE9wZXJhbmRCdW5kbGVVc2VyIHVzZXMgdGhlIGRlc2NyaXB0b3IgYXJlYSBjby1hbGxvY2F0ZWQgd2l0aCB0aGUgaG9zdCBVc2VyCisvLy8gdG8gc3RvcmUgc29tZSBtZXRhIGluZm9ybWF0aW9uIGFib3V0IHdoaWNoIG9wZXJhbmRzIGFyZSAibm9ybWFsIiBvcGVyYW5kcywKKy8vLyBhbmQgd2hpY2ggb25lcyBiZWxvbmcgdG8gc29tZSBvcGVyYW5kIGJ1bmRsZS4KKy8vLworLy8vIFRoZSBsYXlvdXQgb2YgYW4gb3BlcmFuZCBidW5kbGUgdXNlciBpcworLy8vCisvLy8gICAgICAgICAgKy0tLS0tLS0tLS0tdWludDMyX3QgRW5kLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vLyAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8vICAgICAgICAgIHwgICstLS0tLS0tLXVpbnQzMl90IEJlZ2luLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgICAgICAgICAgICB8CisvLy8gICAgICAgICAgfCAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgIHwKKy8vLyAgICAgICAgICBeICBeICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdiAgICAgICAgICAgICAgdgorLy8vICB8LS0tLS0tfC0tLS0tLXwtLS0tfC0tLS18LS0tLXwtLS0tfC0tLS18LS0tLS0tLS0tfC0tLS18LS0tLS0tLS0tfC0tLS18LS0tLS0KKy8vLyAgfCBCT0kwIHwgQk9JMSB8IC4uIHwgRFUgfCBVMCB8IFUxIHwgLi4gfCBCT0kwX1UwIHwgLi4gfCBCT0kxX1UwIHwgLi4gfCBVbgorLy8vICB8LS0tLS0tfC0tLS0tLXwtLS0tfC0tLS18LS0tLXwtLS0tfC0tLS18LS0tLS0tLS0tfC0tLS18LS0tLS0tLS0tfC0tLS18LS0tLS0KKy8vLyAgIHYgIHYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgXgorLy8vICAgfCAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICB8CisvLy8gICB8ICArLS0tLS0tLS11aW50MzJfdCBCZWdpbi0tLS0tLS0tLS0tLSsgICAgICAgICAgICAgIHwKKy8vLyAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8vICAgKy0tLS0tLS0tLS0tdWludDMyX3QgRW5kLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLy8KKy8vLworLy8vIEJPSTAsIEJPSTEgLi4uIGFyZSBkZXNjcmlwdGlvbnMgb2Ygb3BlcmFuZCBidW5kbGVzIGluIHRoaXMgVXNlcidzIHVzZSBsaXN0LgorLy8vIFRoZXNlIGRlc2NyaXB0aW9ucyBhcmUgaW5zdGFsbGVkIGFuZCBtYW5hZ2VkIGJ5IHRoaXMgY2xhc3MsIGFuZCB0aGV5J3JlIGFsbAorLy8vIGluc3RhbmNlcyBvZiBPcGVyYW5kQnVuZGxlVXNlcjxUPjo6QnVuZGxlT3BJbmZvLgorLy8vCisvLy8gRFUgaXMgYW4gYWRkaXRpb25hbCBkZXNjcmlwdG9yIGluc3RhbGxlZCBieSBVc2VyJ3MgJ29wZXJhdG9yIG5ldycgdG8ga2VlcAorLy8vIHRyYWNrIG9mIHRoZSAnQk9JMCAuLi4gQk9JTicgY28tYWxsb2NhdGlvbi4gIE9wZXJhbmRCdW5kbGVVc2VyIGRvZXMgbm90CisvLy8gYWNjZXNzIG9yIG1vZGlmeSBEVSBpbiBhbnkgd2F5LCBpdCdzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbCBwcml2YXRlIHRvCisvLy8gVXNlci4KKy8vLworLy8vIFRoZSByZWd1bGFyIFVzZSYgdmVjdG9yIGZvciB0aGUgVXNlciBzdGFydHMgYXQgVTAuICBUaGUgb3BlcmFuZCBidW5kbGUgdXNlcworLy8vIGFyZSBwYXJ0IG9mIHRoZSBVc2UmIHZlY3RvciwganVzdCBsaWtlIG5vcm1hbCB1c2VzLiAgSW4gdGhlIGRpYWdyYW0gYWJvdmUsCisvLy8gdGhlIG9wZXJhbmQgYnVuZGxlIHVzZXMgc3RhcnQgYXQgQk9JMF9VMC4gIEVhY2ggaW5zdGFuY2Ugb2YgQnVuZGxlT3BJbmZvIGhhcworLy8vIGluZm9ybWF0aW9uIGFib3V0IGEgY29udGlndW91cyBzZXQgb2YgdXNlcyBjb25zdGl0dXRpbmcgYW4gb3BlcmFuZCBidW5kbGUsCisvLy8gYW5kIHRoZSB0b3RhbCBzZXQgb2Ygb3BlcmFuZCBidW5kbGUgdXNlcyB0aGVtc2VsdmVzIGZvcm0gYSBjb250aWd1b3VzIHNldCBvZgorLy8vIHVzZXMgKGkuZS4gdGhlcmUgYXJlIG5vIGdhcHMgYmV0d2VlbiB1c2VzIGNvcnJlc3BvbmRpbmcgdG8gaW5kaXZpZHVhbAorLy8vIG9wZXJhbmQgYnVuZGxlcykuCisvLy8KKy8vLyBUaGlzIGNsYXNzIGRvZXMgbm90IGtub3cgdGhlIGxvY2F0aW9uIG9mIHRoZSBzZXQgb2Ygb3BlcmFuZCBidW5kbGUgdXNlcworLy8vIHdpdGhpbiB0aGUgdXNlIGxpc3QgLS0gdGhhdCBpcyBkZWNpZGVkIGJ5IHRoZSBVc2VyIHVzaW5nIHRoaXMgY2xhc3MgdmlhIHRoZQorLy8vIEJlZ2luSWR4IGFyZ3VtZW50IGluIHBvcHVsYXRlQnVuZGxlT3BlcmFuZEluZm9zLgorLy8vCisvLy8gQ3VycmVudGx5IG9wZXJhbmQgYnVuZGxlIHVzZXJzIHdpdGggaHVuZy1vZmYgb3BlcmFuZHMgYXJlIG5vdCBzdXBwb3J0ZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5zdHJUeSwgdHlwZW5hbWUgT3BJdGVyYXRvclR5PiBjbGFzcyBPcGVyYW5kQnVuZGxlVXNlciB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2Ygb3BlcmFuZCBidW5kbGVzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIFVzZXIuCisgIHVuc2lnbmVkIGdldE51bU9wZXJhbmRCdW5kbGVzKCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6OmRpc3RhbmNlKGJ1bmRsZV9vcF9pbmZvX2JlZ2luKCksIGJ1bmRsZV9vcF9pbmZvX2VuZCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBVc2VyIGhhcyBhbnkgb3BlcmFuZCBidW5kbGVzLgorICBib29sIGhhc09wZXJhbmRCdW5kbGVzKCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtT3BlcmFuZEJ1bmRsZXMoKSAhPSAwOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBidW5kbGUgb3BlcmFuZCBpbiB0aGUgVXNlIGFycmF5LgorICB1bnNpZ25lZCBnZXRCdW5kbGVPcGVyYW5kc1N0YXJ0SW5kZXgoKSBjb25zdCB7CisgICAgYXNzZXJ0KGhhc09wZXJhbmRCdW5kbGVzKCkgJiYgIkRvbid0IGNhbGwgb3RoZXJ3aXNlISIpOworICAgIHJldHVybiBidW5kbGVfb3BfaW5mb19iZWdpbigpLT5CZWdpbjsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBpbmRleCBvZiB0aGUgbGFzdCBidW5kbGUgb3BlcmFuZCBpbiB0aGUgVXNlIGFycmF5LgorICB1bnNpZ25lZCBnZXRCdW5kbGVPcGVyYW5kc0VuZEluZGV4KCkgY29uc3QgeworICAgIGFzc2VydChoYXNPcGVyYW5kQnVuZGxlcygpICYmICJEb24ndCBjYWxsIG90aGVyd2lzZSEiKTsKKyAgICByZXR1cm4gYnVuZGxlX29wX2luZm9fZW5kKClbLTFdLkVuZDsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgb3BlcmFuZCBhdCBpbmRleCBccCBJZHggaXMgYSBidW5kbGUgb3BlcmFuZC4KKyAgYm9vbCBpc0J1bmRsZU9wZXJhbmQodW5zaWduZWQgSWR4KSBjb25zdCB7CisgICAgcmV0dXJuIGhhc09wZXJhbmRCdW5kbGVzKCkgJiYgSWR4ID49IGdldEJ1bmRsZU9wZXJhbmRzU3RhcnRJbmRleCgpICYmCisgICAgICAgICAgIElkeCA8IGdldEJ1bmRsZU9wZXJhbmRzRW5kSW5kZXgoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb3BlcmFuZHMgKG5vdCBvcGVyYW5kIGJ1bmRsZXMpIHVzZWQgYnkKKyAgLy8vIGV2ZXJ5IG9wZXJhbmQgYnVuZGxlIGluIHRoaXMgT3BlcmFuZEJ1bmRsZVVzZXIuCisgIHVuc2lnbmVkIGdldE51bVRvdGFsQnVuZGxlT3BlcmFuZHMoKSBjb25zdCB7CisgICAgaWYgKCFoYXNPcGVyYW5kQnVuZGxlcygpKQorICAgICAgcmV0dXJuIDA7CisKKyAgICB1bnNpZ25lZCBCZWdpbiA9IGdldEJ1bmRsZU9wZXJhbmRzU3RhcnRJbmRleCgpOworICAgIHVuc2lnbmVkIEVuZCA9IGdldEJ1bmRsZU9wZXJhbmRzRW5kSW5kZXgoKTsKKworICAgIGFzc2VydChCZWdpbiA8PSBFbmQgJiYgIlNob3VsZCBiZSEiKTsKKyAgICByZXR1cm4gRW5kIC0gQmVnaW47CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgb3BlcmFuZCBidW5kbGUgYXQgYSBzcGVjaWZpYyBpbmRleC4KKyAgT3BlcmFuZEJ1bmRsZVVzZSBnZXRPcGVyYW5kQnVuZGxlQXQodW5zaWduZWQgSW5kZXgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSW5kZXggPCBnZXROdW1PcGVyYW5kQnVuZGxlcygpICYmICJJbmRleCBvdXQgb2YgYm91bmRzISIpOworICAgIHJldHVybiBvcGVyYW5kQnVuZGxlRnJvbUJ1bmRsZU9wSW5mbygqKGJ1bmRsZV9vcF9pbmZvX2JlZ2luKCkgKyBJbmRleCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBvcGVyYW5kIGJ1bmRsZXMgd2l0aCB0aGUgdGFnIE5hbWUgYXR0YWNoZWQgdG8KKyAgLy8vIHRoaXMgaW5zdHJ1Y3Rpb24uCisgIHVuc2lnbmVkIGNvdW50T3BlcmFuZEJ1bmRsZXNPZlR5cGUoU3RyaW5nUmVmIE5hbWUpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBDb3VudCA9IDA7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bU9wZXJhbmRCdW5kbGVzKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKGdldE9wZXJhbmRCdW5kbGVBdChpKS5nZXRUYWdOYW1lKCkgPT0gTmFtZSkKKyAgICAgICAgQ291bnQrKzsKKworICAgIHJldHVybiBDb3VudDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2Ygb3BlcmFuZCBidW5kbGVzIHdpdGggdGhlIHRhZyBJRCBhdHRhY2hlZCB0bworICAvLy8gdGhpcyBpbnN0cnVjdGlvbi4KKyAgdW5zaWduZWQgY291bnRPcGVyYW5kQnVuZGxlc09mVHlwZSh1aW50MzJfdCBJRCkgY29uc3QgeworICAgIHVuc2lnbmVkIENvdW50ID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtT3BlcmFuZEJ1bmRsZXMoKTsgaSAhPSBlOyArK2kpCisgICAgICBpZiAoZ2V0T3BlcmFuZEJ1bmRsZUF0KGkpLmdldFRhZ0lEKCkgPT0gSUQpCisgICAgICAgIENvdW50Kys7CisKKyAgICByZXR1cm4gQ291bnQ7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBhbiBvcGVyYW5kIGJ1bmRsZSBieSBuYW1lLCBpZiBwcmVzZW50LgorICAvLy8KKyAgLy8vIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBmb3Igb3BlcmFuZCBidW5kbGUgdHlwZXMgdGhhdCBtYXkgaGF2ZQorICAvLy8gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZW0gb24gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uCisgIE9wdGlvbmFsPE9wZXJhbmRCdW5kbGVVc2U+IGdldE9wZXJhbmRCdW5kbGUoU3RyaW5nUmVmIE5hbWUpIGNvbnN0IHsKKyAgICBhc3NlcnQoY291bnRPcGVyYW5kQnVuZGxlc09mVHlwZShOYW1lKSA8IDIgJiYgIlByZWNvbmRpdGlvbiB2aW9sYXRlZCEiKTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kQnVuZGxlcygpOyBpICE9IGU7ICsraSkgeworICAgICAgT3BlcmFuZEJ1bmRsZVVzZSBVID0gZ2V0T3BlcmFuZEJ1bmRsZUF0KGkpOworICAgICAgaWYgKFUuZ2V0VGFnTmFtZSgpID09IE5hbWUpCisgICAgICAgIHJldHVybiBVOworICAgIH0KKworICAgIHJldHVybiBOb25lOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYW4gb3BlcmFuZCBidW5kbGUgYnkgdGFnIElELCBpZiBwcmVzZW50LgorICAvLy8KKyAgLy8vIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBmb3Igb3BlcmFuZCBidW5kbGUgdHlwZXMgdGhhdCBtYXkgaGF2ZQorICAvLy8gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZW0gb24gdGhlIHNhbWUgaW5zdHJ1Y3Rpb24uCisgIE9wdGlvbmFsPE9wZXJhbmRCdW5kbGVVc2U+IGdldE9wZXJhbmRCdW5kbGUodWludDMyX3QgSUQpIGNvbnN0IHsKKyAgICBhc3NlcnQoY291bnRPcGVyYW5kQnVuZGxlc09mVHlwZShJRCkgPCAyICYmICJQcmVjb25kaXRpb24gdmlvbGF0ZWQhIik7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtT3BlcmFuZEJ1bmRsZXMoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIE9wZXJhbmRCdW5kbGVVc2UgVSA9IGdldE9wZXJhbmRCdW5kbGVBdChpKTsKKyAgICAgIGlmIChVLmdldFRhZ0lEKCkgPT0gSUQpCisgICAgICAgIHJldHVybiBVOworICAgIH0KKworICAgIHJldHVybiBOb25lOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGxpc3Qgb2Ygb3BlcmFuZCBidW5kbGVzIGF0dGFjaGVkIHRvIHRoaXMgaW5zdHJ1Y3Rpb24gYXMKKyAgLy8vIGEgdmVjdG9yIG9mIE9wZXJhbmRCdW5kbGVEZWZzLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gY29waWVzIHRoZSBPcGVyYW5kQnVuZGVVc2UgaW5zdGFuY2VzIGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgIC8vLyBPcGVyYW5kQnVuZGxlVXNlciB0byBhIHZlY3RvciBvZiBPcGVyYW5kQnVuZGxlRGVmcy4gIE5vdGU6CisgIC8vLyBPcGVyYW5kQnVuZGVVc2VzIGFuZCBPcGVyYW5kQnVuZGxlRGVmcyBhcmUgbm9uLXRyaXZpYWxseSAqZGlmZmVyZW50KgorICAvLy8gcmVwcmVzZW50YXRpb25zIG9mIG9wZXJhbmQgYnVuZGxlcyAoc2VlIGRvY3VtZW50YXRpb24gYWJvdmUpLgorICB2b2lkIGdldE9wZXJhbmRCdW5kbGVzQXNEZWZzKFNtYWxsVmVjdG9ySW1wbDxPcGVyYW5kQnVuZGxlRGVmPiAmRGVmcykgY29uc3QgeworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcGVyYW5kQnVuZGxlcygpOyBpICE9IGU7ICsraSkKKyAgICAgIERlZnMuZW1wbGFjZV9iYWNrKGdldE9wZXJhbmRCdW5kbGVBdChpKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgb3BlcmFuZCBidW5kbGUgZm9yIHRoZSBvcGVyYW5kIGF0IGluZGV4IE9wSWR4LgorICAvLy8KKyAgLy8vIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyB3aXRoIGFuIE9wSWR4IHRoYXQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhbgorICAvLy8gYnVuZGxlIG9wZXJhbmQuCisgIE9wZXJhbmRCdW5kbGVVc2UgZ2V0T3BlcmFuZEJ1bmRsZUZvck9wZXJhbmQodW5zaWduZWQgT3BJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gb3BlcmFuZEJ1bmRsZUZyb21CdW5kbGVPcEluZm8oZ2V0QnVuZGxlT3BJbmZvRm9yT3BlcmFuZChPcElkeCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG9wZXJhbmQgYnVuZGxlIHVzZXIgaGFzIG9wZXJhbmQgYnVuZGxlcyB0aGF0CisgIC8vLyBtYXkgcmVhZCBmcm9tIHRoZSBoZWFwLgorICBib29sIGhhc1JlYWRpbmdPcGVyYW5kQnVuZGxlcygpIGNvbnN0IHsKKyAgICAvLyBJbXBsZW1lbnRhdGlvbiBub3RlOiB0aGlzIGlzIGEgY29uc2VydmF0aXZlIGltcGxlbWVudGF0aW9uIG9mIG9wZXJhbmQKKyAgICAvLyBidW5kbGUgc2VtYW50aWNzLCB3aGVyZSAqYW55KiBvcGVyYW5kIGJ1bmRsZSBmb3JjZXMgYSBjYWxsc2l0ZSB0byBiZSBhdAorICAgIC8vIGxlYXN0IHJlYWRvbmx5LgorICAgIHJldHVybiBoYXNPcGVyYW5kQnVuZGxlcygpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG9wZXJhbmQgYnVuZGxlIHVzZXIgaGFzIG9wZXJhbmQgYnVuZGxlcyB0aGF0CisgIC8vLyBtYXkgd3JpdGUgdG8gdGhlIGhlYXAuCisgIGJvb2wgaGFzQ2xvYmJlcmluZ09wZXJhbmRCdW5kbGVzKCkgY29uc3QgeworICAgIGZvciAoYXV0byAmQk9JIDogYnVuZGxlX29wX2luZm9zKCkpIHsKKyAgICAgIGlmIChCT0kuVGFnLT5zZWNvbmQgPT0gTExWTUNvbnRleHQ6Ok9CX2Rlb3B0IHx8CisgICAgICAgICAgQk9JLlRhZy0+c2Vjb25kID09IExMVk1Db250ZXh0OjpPQl9mdW5jbGV0KQorICAgICAgICBjb250aW51ZTsKKworICAgICAgLy8gVGhpcyBpbnN0cnVjdGlvbiBoYXMgYW4gb3BlcmFuZCBidW5kbGUgdGhhdCBpcyBub3Qga25vd24gdG8gdXMuCisgICAgICAvLyBBc3N1bWUgdGhlIHdvcnN0LgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgYnVuZGxlIG9wZXJhbmQgYXQgaW5kZXggXHAgT3BJZHggaGFzIHRoZQorICAvLy8gYXR0cmlidXRlIFxwIEEuCisgIGJvb2wgYnVuZGxlT3BlcmFuZEhhc0F0dHIodW5zaWduZWQgT3BJZHgsICBBdHRyaWJ1dGU6OkF0dHJLaW5kIEEpIGNvbnN0IHsKKyAgICBhdXRvICZCT0kgPSBnZXRCdW5kbGVPcEluZm9Gb3JPcGVyYW5kKE9wSWR4KTsKKyAgICBhdXRvIE9CVSA9IG9wZXJhbmRCdW5kbGVGcm9tQnVuZGxlT3BJbmZvKEJPSSk7CisgICAgcmV0dXJuIE9CVS5vcGVyYW5kSGFzQXR0cihPcElkeCAtIEJPSS5CZWdpbiwgQSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIFxwIE90aGVyIGhhcyB0aGUgc2FtZSBzZXF1ZW5jZSBvZiBvcGVyYW5kIGJ1bmRsZQorICAvLy8gdGFncyB3aXRoIHRoZSBzYW1lIG51bWJlciBvZiBvcGVyYW5kcyBvbiBlYWNoIG9uZSBvZiB0aGVtIGFzIHRoaXMKKyAgLy8vIE9wZXJhbmRCdW5kbGVVc2VyLgorICBib29sIGhhc0lkZW50aWNhbE9wZXJhbmRCdW5kbGVTY2hlbWEoCisgICAgICBjb25zdCBPcGVyYW5kQnVuZGxlVXNlcjxJbnN0clR5LCBPcEl0ZXJhdG9yVHk+ICZPdGhlcikgY29uc3QgeworICAgIGlmIChnZXROdW1PcGVyYW5kQnVuZGxlcygpICE9IE90aGVyLmdldE51bU9wZXJhbmRCdW5kbGVzKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gc3RkOjplcXVhbChidW5kbGVfb3BfaW5mb19iZWdpbigpLCBidW5kbGVfb3BfaW5mb19lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICBPdGhlci5idW5kbGVfb3BfaW5mb19iZWdpbigpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBvcGVyYW5kIGJ1bmRsZSB1c2VyIGNvbnRhaW5zIG9wZXJhbmQgYnVuZGxlcworICAvLy8gd2l0aCB0YWdzIG90aGVyIHRoYW4gdGhvc2Ugc3BlY2lmaWVkIGluIFxwIElEcy4KKyAgYm9vbCBoYXNPcGVyYW5kQnVuZGxlc090aGVyVGhhbihBcnJheVJlZjx1aW50MzJfdD4gSURzKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bU9wZXJhbmRCdW5kbGVzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICB1aW50MzJfdCBJRCA9IGdldE9wZXJhbmRCdW5kbGVBdChpKS5nZXRUYWdJRCgpOworICAgICAgaWYgKCFpc19jb250YWluZWQoSURzLCBJRCkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworcHJvdGVjdGVkOgorICAvLy8gXGJyaWVmIElzIHRoZSBmdW5jdGlvbiBhdHRyaWJ1dGUgUyBkaXNhbGxvd2VkIGJ5IHNvbWUgb3BlcmFuZCBidW5kbGUgb24KKyAgLy8vIHRoaXMgb3BlcmFuZCBidW5kbGUgdXNlcj8KKyAgYm9vbCBpc0ZuQXR0ckRpc2FsbG93ZWRCeU9wQnVuZGxlKFN0cmluZ1JlZiBTKSBjb25zdCB7CisgICAgLy8gT3BlcmFuZCBidW5kbGVzIG9ubHkgcG9zc2libHkgZGlzYWxsb3cgcmVhZG5vbmUsIHJlYWRvbmx5IGFuZCBhcmdtZW5vbmx5CisgICAgLy8gYXR0cmlidXRlcy4gIEFsbCBTdHJpbmcgYXR0cmlidXRlcyBhcmUgZmluZS4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gXGJyaWVmIElzIHRoZSBmdW5jdGlvbiBhdHRyaWJ1dGUgQSBkaXNhbGxvd2VkIGJ5IHNvbWUgb3BlcmFuZCBidW5kbGUgb24KKyAgLy8vIHRoaXMgb3BlcmFuZCBidW5kbGUgdXNlcj8KKyAgYm9vbCBpc0ZuQXR0ckRpc2FsbG93ZWRCeU9wQnVuZGxlKEF0dHJpYnV0ZTo6QXR0cktpbmQgQSkgY29uc3QgeworICAgIHN3aXRjaCAoQSkgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBjYXNlIEF0dHJpYnV0ZTo6SW5hY2Nlc3NpYmxlTWVtT3JBcmdNZW1Pbmx5OgorICAgICAgcmV0dXJuIGhhc1JlYWRpbmdPcGVyYW5kQnVuZGxlcygpOworCisgICAgY2FzZSBBdHRyaWJ1dGU6OkluYWNjZXNzaWJsZU1lbU9ubHk6CisgICAgICByZXR1cm4gaGFzUmVhZGluZ09wZXJhbmRCdW5kbGVzKCk7CisKKyAgICBjYXNlIEF0dHJpYnV0ZTo6QXJnTWVtT25seToKKyAgICAgIHJldHVybiBoYXNSZWFkaW5nT3BlcmFuZEJ1bmRsZXMoKTsKKworICAgIGNhc2UgQXR0cmlidXRlOjpSZWFkTm9uZToKKyAgICAgIHJldHVybiBoYXNSZWFkaW5nT3BlcmFuZEJ1bmRsZXMoKTsKKworICAgIGNhc2UgQXR0cmlidXRlOjpSZWFkT25seToKKyAgICAgIHJldHVybiBoYXNDbG9iYmVyaW5nT3BlcmFuZEJ1bmRsZXMoKTsKKyAgICB9CisKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJzd2l0Y2ggaGFzIGEgZGVmYXVsdCBjYXNlISIpOworICB9CisKKyAgLy8vIFxicmllZiBVc2VkIHRvIGtlZXAgdHJhY2sgb2YgYW4gb3BlcmFuZCBidW5kbGUuICBTZWUgdGhlIG1haW4gY29tbWVudCBvbgorICAvLy8gT3BlcmFuZEJ1bmRsZVVzZXIgYWJvdmUuCisgIHN0cnVjdCBCdW5kbGVPcEluZm8geworICAgIC8vLyBcYnJpZWYgVGhlIG9wZXJhbmQgYnVuZGxlIHRhZywgaW50ZXJuZWQgYnkKKyAgICAvLy8gTExWTUNvbnRleHRJbXBsOjpnZXRPckluc2VydEJ1bmRsZVRhZy4KKyAgICBTdHJpbmdNYXBFbnRyeTx1aW50MzJfdD4gKlRhZzsKKworICAgIC8vLyBcYnJpZWYgVGhlIGluZGV4IGluIHRoZSBVc2UmIHZlY3RvciB3aGVyZSBvcGVyYW5kcyBmb3IgdGhpcyBvcGVyYW5kCisgICAgLy8vIGJ1bmRsZSBzdGFydHMuCisgICAgdWludDMyX3QgQmVnaW47CisKKyAgICAvLy8gXGJyaWVmIFRoZSBpbmRleCBpbiB0aGUgVXNlJiB2ZWN0b3Igd2hlcmUgb3BlcmFuZHMgZm9yIHRoaXMgb3BlcmFuZAorICAgIC8vLyBidW5kbGUgZW5kcy4KKyAgICB1aW50MzJfdCBFbmQ7CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQnVuZGxlT3BJbmZvICZPdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIFRhZyA9PSBPdGhlci5UYWcgJiYgQmVnaW4gPT0gT3RoZXIuQmVnaW4gJiYgRW5kID09IE90aGVyLkVuZDsKKyAgICB9CisgIH07CisKKyAgLy8vIFxicmllZiBTaW1wbGUgaGVscGVyIGZ1bmN0aW9uIHRvIG1hcCBhIEJ1bmRsZU9wSW5mbyB0byBhbgorICAvLy8gT3BlcmFuZEJ1bmRsZVVzZS4KKyAgT3BlcmFuZEJ1bmRsZVVzZQorICBvcGVyYW5kQnVuZGxlRnJvbUJ1bmRsZU9wSW5mbyhjb25zdCBCdW5kbGVPcEluZm8gJkJPSSkgY29uc3QgeworICAgIGF1dG8gb3BfYmVnaW4gPSBzdGF0aWNfY2FzdDxjb25zdCBJbnN0clR5ICo+KHRoaXMpLT5vcF9iZWdpbigpOworICAgIEFycmF5UmVmPFVzZT4gSW5wdXRzKG9wX2JlZ2luICsgQk9JLkJlZ2luLCBvcF9iZWdpbiArIEJPSS5FbmQpOworICAgIHJldHVybiBPcGVyYW5kQnVuZGxlVXNlKEJPSS5UYWcsIElucHV0cyk7CisgIH0KKworICB1c2luZyBidW5kbGVfb3BfaXRlcmF0b3IgPSBCdW5kbGVPcEluZm8gKjsKKyAgdXNpbmcgY29uc3RfYnVuZGxlX29wX2l0ZXJhdG9yID0gY29uc3QgQnVuZGxlT3BJbmZvICo7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHN0YXJ0IG9mIHRoZSBsaXN0IG9mIEJ1bmRsZU9wSW5mbyBpbnN0YW5jZXMgYXNzb2NpYXRlZAorICAvLy8gd2l0aCB0aGlzIE9wZXJhbmRCdW5kbGVVc2VyLgorICBidW5kbGVfb3BfaXRlcmF0b3IgYnVuZGxlX29wX2luZm9fYmVnaW4oKSB7CisgICAgaWYgKCFzdGF0aWNfY2FzdDxJbnN0clR5ICo+KHRoaXMpLT5oYXNEZXNjcmlwdG9yKCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKworICAgIHVpbnQ4X3QgKkJ5dGVzQmVnaW4gPSBzdGF0aWNfY2FzdDxJbnN0clR5ICo+KHRoaXMpLT5nZXREZXNjcmlwdG9yKCkuYmVnaW4oKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxidW5kbGVfb3BfaXRlcmF0b3I+KEJ5dGVzQmVnaW4pOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHN0YXJ0IG9mIHRoZSBsaXN0IG9mIEJ1bmRsZU9wSW5mbyBpbnN0YW5jZXMgYXNzb2NpYXRlZAorICAvLy8gd2l0aCB0aGlzIE9wZXJhbmRCdW5kbGVVc2VyLgorICBjb25zdF9idW5kbGVfb3BfaXRlcmF0b3IgYnVuZGxlX29wX2luZm9fYmVnaW4oKSBjb25zdCB7CisgICAgYXV0byAqTm9uQ29uc3RUaGlzID0KKyAgICAgICAgY29uc3RfY2FzdDxPcGVyYW5kQnVuZGxlVXNlcjxJbnN0clR5LCBPcEl0ZXJhdG9yVHk+ICo+KHRoaXMpOworICAgIHJldHVybiBOb25Db25zdFRoaXMtPmJ1bmRsZV9vcF9pbmZvX2JlZ2luKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZW5kIG9mIHRoZSBsaXN0IG9mIEJ1bmRsZU9wSW5mbyBpbnN0YW5jZXMgYXNzb2NpYXRlZAorICAvLy8gd2l0aCB0aGlzIE9wZXJhbmRCdW5kbGVVc2VyLgorICBidW5kbGVfb3BfaXRlcmF0b3IgYnVuZGxlX29wX2luZm9fZW5kKCkgeworICAgIGlmICghc3RhdGljX2Nhc3Q8SW5zdHJUeSAqPih0aGlzKS0+aGFzRGVzY3JpcHRvcigpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICB1aW50OF90ICpCeXRlc0VuZCA9IHN0YXRpY19jYXN0PEluc3RyVHkgKj4odGhpcyktPmdldERlc2NyaXB0b3IoKS5lbmQoKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxidW5kbGVfb3BfaXRlcmF0b3I+KEJ5dGVzRW5kKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBlbmQgb2YgdGhlIGxpc3Qgb2YgQnVuZGxlT3BJbmZvIGluc3RhbmNlcyBhc3NvY2lhdGVkCisgIC8vLyB3aXRoIHRoaXMgT3BlcmFuZEJ1bmRsZVVzZXIuCisgIGNvbnN0X2J1bmRsZV9vcF9pdGVyYXRvciBidW5kbGVfb3BfaW5mb19lbmQoKSBjb25zdCB7CisgICAgYXV0byAqTm9uQ29uc3RUaGlzID0KKyAgICAgICAgY29uc3RfY2FzdDxPcGVyYW5kQnVuZGxlVXNlcjxJbnN0clR5LCBPcEl0ZXJhdG9yVHk+ICo+KHRoaXMpOworICAgIHJldHVybiBOb25Db25zdFRoaXMtPmJ1bmRsZV9vcF9pbmZvX2VuZCgpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHJhbmdlIFtccCBidW5kbGVfb3BfaW5mb19iZWdpbiwgXHAgYnVuZGxlX29wX2luZm9fZW5kKS4KKyAgaXRlcmF0b3JfcmFuZ2U8YnVuZGxlX29wX2l0ZXJhdG9yPiBidW5kbGVfb3BfaW5mb3MoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoYnVuZGxlX29wX2luZm9fYmVnaW4oKSwgYnVuZGxlX29wX2luZm9fZW5kKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHJhbmdlIFtccCBidW5kbGVfb3BfaW5mb19iZWdpbiwgXHAgYnVuZGxlX29wX2luZm9fZW5kKS4KKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3RfYnVuZGxlX29wX2l0ZXJhdG9yPiBidW5kbGVfb3BfaW5mb3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoYnVuZGxlX29wX2luZm9fYmVnaW4oKSwgYnVuZGxlX29wX2luZm9fZW5kKCkpOworICB9CisKKyAgLy8vIFxicmllZiBQb3B1bGF0ZSB0aGUgQnVuZGxlT3BJbmZvIGluc3RhbmNlcyBhbmQgdGhlIFVzZSYgdmVjdG9yIGZyb20gXHAKKyAgLy8vIEJ1bmRsZXMuICBSZXR1cm4gdGhlIG9wX2l0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBVc2UmIG9uZSBwYXN0IHRoZSBsYXN0CisgIC8vLyBsYXN0IGJ1bmRsZSBvcGVyYW5kIHVzZS4KKyAgLy8vCisgIC8vLyBFYWNoIFxwIE9wZXJhbmRCdW5kbGVEZWYgaW5zdGFuY2UgaXMgdHJhY2tlZCBieSBhIE9wZXJhbmRCdW5kbGVJbmZvCisgIC8vLyBpbnN0YW5jZSBhbGxvY2F0ZWQgaW4gdGhpcyBVc2VyJ3MgZGVzY3JpcHRvci4KKyAgT3BJdGVyYXRvclR5IHBvcHVsYXRlQnVuZGxlT3BlcmFuZEluZm9zKEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IEJ1bmRsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBCZWdpbkluZGV4KSB7CisgICAgYXV0byBJdCA9IHN0YXRpY19jYXN0PEluc3RyVHkgKj4odGhpcyktPm9wX2JlZ2luKCkgKyBCZWdpbkluZGV4OworICAgIGZvciAoYXV0byAmQiA6IEJ1bmRsZXMpCisgICAgICBJdCA9IHN0ZDo6Y29weShCLmlucHV0X2JlZ2luKCksIEIuaW5wdXRfZW5kKCksIEl0KTsKKworICAgIGF1dG8gKkNvbnRleHRJbXBsID0gc3RhdGljX2Nhc3Q8SW5zdHJUeSAqPih0aGlzKS0+Z2V0Q29udGV4dCgpLnBJbXBsOworICAgIGF1dG8gQkkgPSBCdW5kbGVzLmJlZ2luKCk7CisgICAgdW5zaWduZWQgQ3VycmVudEluZGV4ID0gQmVnaW5JbmRleDsKKworICAgIGZvciAoYXV0byAmQk9JIDogYnVuZGxlX29wX2luZm9zKCkpIHsKKyAgICAgIGFzc2VydChCSSAhPSBCdW5kbGVzLmVuZCgpICYmICJJbmNvcnJlY3QgYWxsb2NhdGlvbj8iKTsKKworICAgICAgQk9JLlRhZyA9IENvbnRleHRJbXBsLT5nZXRPckluc2VydEJ1bmRsZVRhZyhCSS0+Z2V0VGFnKCkpOworICAgICAgQk9JLkJlZ2luID0gQ3VycmVudEluZGV4OworICAgICAgQk9JLkVuZCA9IEN1cnJlbnRJbmRleCArIEJJLT5pbnB1dF9zaXplKCk7CisgICAgICBDdXJyZW50SW5kZXggPSBCT0kuRW5kOworICAgICAgQkkrKzsKKyAgICB9CisKKyAgICBhc3NlcnQoQkkgPT0gQnVuZGxlcy5lbmQoKSAmJiAiSW5jb3JyZWN0IGFsbG9jYXRpb24/Iik7CisKKyAgICByZXR1cm4gSXQ7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgQnVuZGxlT3BJbmZvIGZvciB0aGUgb3BlcmFuZCBhdCBpbmRleCBPcElkeC4KKyAgLy8vCisgIC8vLyBJdCBpcyBhbiBlcnJvciB0byBjYWxsIHRoaXMgd2l0aCBhbiBPcElkeCB0aGF0IGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYW4KKyAgLy8vIGJ1bmRsZSBvcGVyYW5kLgorICBjb25zdCBCdW5kbGVPcEluZm8gJmdldEJ1bmRsZU9wSW5mb0Zvck9wZXJhbmQodW5zaWduZWQgT3BJZHgpIGNvbnN0IHsKKyAgICBmb3IgKGF1dG8gJkJPSSA6IGJ1bmRsZV9vcF9pbmZvcygpKQorICAgICAgaWYgKEJPSS5CZWdpbiA8PSBPcElkeCAmJiBPcElkeCA8IEJPSS5FbmQpCisgICAgICAgIHJldHVybiBCT0k7CisKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJEaWQgbm90IGZpbmQgb3BlcmFuZCBidW5kbGUgZm9yIG9wZXJhbmQhIik7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIHZhbHVlcyB1c2VkIGluIFxwIEJ1bmRsZXMuCisgIHN0YXRpYyB1bnNpZ25lZCBDb3VudEJ1bmRsZUlucHV0cyhBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBCdW5kbGVzKSB7CisgICAgdW5zaWduZWQgVG90YWwgPSAwOworICAgIGZvciAoYXV0byAmQiA6IEJ1bmRsZXMpCisgICAgICBUb3RhbCArPSBCLmlucHV0X3NpemUoKTsKKyAgICByZXR1cm4gVG90YWw7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0lOU1RSVFlQRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnN0cnVjdGlvbi5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0luc3RydWN0aW9uLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjYxNzI5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnN0cnVjdGlvbi5kZWYKQEAgLTAsMCArMSwyMzEgQEAKKy8vPT09LS0gbGx2bS9JbnN0cnVjdGlvbi5kZWYgLSBGaWxlIHRoYXQgZGVzY3JpYmVzIEluc3RydWN0aW9ucyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGRlc2NyaXB0aW9ucyBvZiB0aGUgdmFyaW91cyBMTFZNIGluc3RydWN0aW9ucy4gIFRoaXMgaXMKKy8vIHVzZWQgYXMgYSBjZW50cmFsIHBsYWNlIGZvciBlbnVtZXJhdGluZyB0aGUgZGlmZmVyZW50IGluc3RydWN0aW9ucyBhbmQKKy8vIHNob3VsZCBldmVudHVhbGx5IGJlIHRoZSBwbGFjZSB0byBwdXQgY29tbWVudHMgYWJvdXQgdGhlIGluc3RydWN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBOT1RFOiBOTyBJTkNMVURFIEdVQVJEIERFU0lSRUQhCisKKy8vIFByb3ZpZGUgZGVmaW5pdGlvbnMgb2YgbWFjcm9zIHNvIHRoYXQgdXNlcnMgb2YgdGhpcyBmaWxlIGRvIG5vdCBoYXZlIHRvCisvLyBkZWZpbmUgZXZlcnl0aGluZyB0byB1c2UgaXQuLi4KKy8vCisjaWZuZGVmIEZJUlNUX1RFUk1fSU5TVAorI2RlZmluZSBGSVJTVF9URVJNX0lOU1QobnVtKQorI2VuZGlmCisjaWZuZGVmIEhBTkRMRV9URVJNX0lOU1QKKyNpZm5kZWYgSEFORExFX0lOU1QKKyNkZWZpbmUgSEFORExFX1RFUk1fSU5TVChudW0sIG9wY29kZSwgQ2xhc3MpCisjZWxzZQorI2RlZmluZSBIQU5ETEVfVEVSTV9JTlNUKG51bSwgb3Bjb2RlLCBDbGFzcykgSEFORExFX0lOU1QobnVtLCBvcGNvZGUsIENsYXNzKQorI2VuZGlmCisjZW5kaWYKKyNpZm5kZWYgTEFTVF9URVJNX0lOU1QKKyNkZWZpbmUgTEFTVF9URVJNX0lOU1QobnVtKQorI2VuZGlmCisKKyNpZm5kZWYgRklSU1RfQklOQVJZX0lOU1QKKyNkZWZpbmUgRklSU1RfQklOQVJZX0lOU1QobnVtKQorI2VuZGlmCisjaWZuZGVmIEhBTkRMRV9CSU5BUllfSU5TVAorI2lmbmRlZiBIQU5ETEVfSU5TVAorI2RlZmluZSBIQU5ETEVfQklOQVJZX0lOU1QobnVtLCBvcGNvZGUsIGluc3RjbGFzcykKKyNlbHNlCisjZGVmaW5lIEhBTkRMRV9CSU5BUllfSU5TVChudW0sIG9wY29kZSwgQ2xhc3MpIEhBTkRMRV9JTlNUKG51bSwgb3Bjb2RlLCBDbGFzcykKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIExBU1RfQklOQVJZX0lOU1QKKyNkZWZpbmUgTEFTVF9CSU5BUllfSU5TVChudW0pCisjZW5kaWYKKworI2lmbmRlZiBGSVJTVF9NRU1PUllfSU5TVAorI2RlZmluZSBGSVJTVF9NRU1PUllfSU5TVChudW0pCisjZW5kaWYKKyNpZm5kZWYgSEFORExFX01FTU9SWV9JTlNUCisjaWZuZGVmIEhBTkRMRV9JTlNUCisjZGVmaW5lIEhBTkRMRV9NRU1PUllfSU5TVChudW0sIG9wY29kZSwgQ2xhc3MpCisjZWxzZQorI2RlZmluZSBIQU5ETEVfTUVNT1JZX0lOU1QobnVtLCBvcGNvZGUsIENsYXNzKSBIQU5ETEVfSU5TVChudW0sIG9wY29kZSwgQ2xhc3MpCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMQVNUX01FTU9SWV9JTlNUCisjZGVmaW5lIExBU1RfTUVNT1JZX0lOU1QobnVtKQorI2VuZGlmCisKKyNpZm5kZWYgRklSU1RfQ0FTVF9JTlNUCisjZGVmaW5lIEZJUlNUX0NBU1RfSU5TVChudW0pCisjZW5kaWYKKyNpZm5kZWYgSEFORExFX0NBU1RfSU5TVAorI2lmbmRlZiBIQU5ETEVfSU5TVAorI2RlZmluZSBIQU5ETEVfQ0FTVF9JTlNUKG51bSwgb3Bjb2RlLCBDbGFzcykKKyNlbHNlCisjZGVmaW5lIEhBTkRMRV9DQVNUX0lOU1QobnVtLCBvcGNvZGUsIENsYXNzKSBIQU5ETEVfSU5TVChudW0sIG9wY29kZSwgQ2xhc3MpCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMQVNUX0NBU1RfSU5TVAorI2RlZmluZSBMQVNUX0NBU1RfSU5TVChudW0pCisjZW5kaWYKKworI2lmbmRlZiBGSVJTVF9GVU5DTEVUUEFEX0lOU1QKKyNkZWZpbmUgRklSU1RfRlVOQ0xFVFBBRF9JTlNUKG51bSkKKyNlbmRpZgorI2lmbmRlZiBIQU5ETEVfRlVOQ0xFVFBBRF9JTlNUCisjaWZuZGVmIEhBTkRMRV9JTlNUCisjZGVmaW5lIEhBTkRMRV9GVU5DTEVUUEFEX0lOU1QobnVtLCBvcGNvZGUsIENsYXNzKQorI2Vsc2UKKyNkZWZpbmUgSEFORExFX0ZVTkNMRVRQQURfSU5TVChudW0sIG9wY29kZSwgQ2xhc3MpIEhBTkRMRV9JTlNUKG51bSwgb3Bjb2RlLCBDbGFzcykKKyNlbmRpZgorI2VuZGlmCisjaWZuZGVmIExBU1RfRlVOQ0xFVFBBRF9JTlNUCisjZGVmaW5lIExBU1RfRlVOQ0xFVFBBRF9JTlNUKG51bSkKKyNlbmRpZgorCisjaWZuZGVmIEZJUlNUX09USEVSX0lOU1QKKyNkZWZpbmUgRklSU1RfT1RIRVJfSU5TVChudW0pCisjZW5kaWYKKyNpZm5kZWYgSEFORExFX09USEVSX0lOU1QKKyNpZm5kZWYgSEFORExFX0lOU1QKKyNkZWZpbmUgSEFORExFX09USEVSX0lOU1QobnVtLCBvcGNvZGUsIENsYXNzKQorI2Vsc2UKKyNkZWZpbmUgSEFORExFX09USEVSX0lOU1QobnVtLCBvcGNvZGUsIENsYXNzKSBIQU5ETEVfSU5TVChudW0sIG9wY29kZSwgQ2xhc3MpCisjZW5kaWYKKyNlbmRpZgorI2lmbmRlZiBMQVNUX09USEVSX0lOU1QKKyNkZWZpbmUgTEFTVF9PVEhFUl9JTlNUKG51bSkKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9VU0VSX0lOU1QKKyNkZWZpbmUgSEFORExFX1VTRVJfSU5TVChudW0sIG9wYywgQ2xhc3MpIEhBTkRMRV9PVEhFUl9JTlNUKG51bSwgb3BjLCBDbGFzcykKKyNlbmRpZgorCisvLyBUZXJtaW5hdG9yIEluc3RydWN0aW9ucyAtIFRoZXNlIGluc3RydWN0aW9ucyBhcmUgdXNlZCB0byB0ZXJtaW5hdGUgYSBiYXNpYworLy8gYmxvY2sgb2YgdGhlIHByb2dyYW0uICAgRXZlcnkgYmFzaWMgYmxvY2sgbXVzdCBlbmQgd2l0aCBvbmUgb2YgdGhlc2UKKy8vIGluc3RydWN0aW9ucyBmb3IgaXQgdG8gYmUgYSB3ZWxsIGZvcm1lZCBiYXNpYyBibG9jay4KKy8vCisgRklSU1RfVEVSTV9JTlNUICAoIDEpCitIQU5ETEVfVEVSTV9JTlNUICAoIDEsIFJldCAgICAgICAgICAgLCBSZXR1cm5JbnN0KQorSEFORExFX1RFUk1fSU5TVCAgKCAyLCBCciAgICAgICAgICAgICwgQnJhbmNoSW5zdCkKK0hBTkRMRV9URVJNX0lOU1QgICggMywgU3dpdGNoICAgICAgICAsIFN3aXRjaEluc3QpCitIQU5ETEVfVEVSTV9JTlNUICAoIDQsIEluZGlyZWN0QnIgICAgLCBJbmRpcmVjdEJySW5zdCkKK0hBTkRMRV9URVJNX0lOU1QgICggNSwgSW52b2tlICAgICAgICAsIEludm9rZUluc3QpCitIQU5ETEVfVEVSTV9JTlNUICAoIDYsIFJlc3VtZSAgICAgICAgLCBSZXN1bWVJbnN0KQorSEFORExFX1RFUk1fSU5TVCAgKCA3LCBVbnJlYWNoYWJsZSAgICwgVW5yZWFjaGFibGVJbnN0KQorSEFORExFX1RFUk1fSU5TVCAgKCA4LCBDbGVhbnVwUmV0ICAgICwgQ2xlYW51cFJldHVybkluc3QpCitIQU5ETEVfVEVSTV9JTlNUICAoIDksIENhdGNoUmV0ICAgICAgLCBDYXRjaFJldHVybkluc3QpCitIQU5ETEVfVEVSTV9JTlNUICAoMTAsIENhdGNoU3dpdGNoICAgLCBDYXRjaFN3aXRjaEluc3QpCisgIExBU1RfVEVSTV9JTlNUICAoMTApCisKKy8vIFN0YW5kYXJkIGJpbmFyeSBvcGVyYXRvcnMuLi4KKyBGSVJTVF9CSU5BUllfSU5TVCgxMSkKK0hBTkRMRV9CSU5BUllfSU5TVCgxMSwgQWRkICAsIEJpbmFyeU9wZXJhdG9yKQorSEFORExFX0JJTkFSWV9JTlNUKDEyLCBGQWRkICwgQmluYXJ5T3BlcmF0b3IpCitIQU5ETEVfQklOQVJZX0lOU1QoMTMsIFN1YiAgLCBCaW5hcnlPcGVyYXRvcikKK0hBTkRMRV9CSU5BUllfSU5TVCgxNCwgRlN1YiAsIEJpbmFyeU9wZXJhdG9yKQorSEFORExFX0JJTkFSWV9JTlNUKDE1LCBNdWwgICwgQmluYXJ5T3BlcmF0b3IpCitIQU5ETEVfQklOQVJZX0lOU1QoMTYsIEZNdWwgLCBCaW5hcnlPcGVyYXRvcikKK0hBTkRMRV9CSU5BUllfSU5TVCgxNywgVURpdiAsIEJpbmFyeU9wZXJhdG9yKQorSEFORExFX0JJTkFSWV9JTlNUKDE4LCBTRGl2ICwgQmluYXJ5T3BlcmF0b3IpCitIQU5ETEVfQklOQVJZX0lOU1QoMTksIEZEaXYgLCBCaW5hcnlPcGVyYXRvcikKK0hBTkRMRV9CSU5BUllfSU5TVCgyMCwgVVJlbSAsIEJpbmFyeU9wZXJhdG9yKQorSEFORExFX0JJTkFSWV9JTlNUKDIxLCBTUmVtICwgQmluYXJ5T3BlcmF0b3IpCitIQU5ETEVfQklOQVJZX0lOU1QoMjIsIEZSZW0gLCBCaW5hcnlPcGVyYXRvcikKKworLy8gTG9naWNhbCBvcGVyYXRvcnMgKGludGVnZXIgb3BlcmFuZHMpCitIQU5ETEVfQklOQVJZX0lOU1QoMjMsIFNobCAgLCBCaW5hcnlPcGVyYXRvcikgLy8gU2hpZnQgbGVmdCAgKGxvZ2ljYWwpCitIQU5ETEVfQklOQVJZX0lOU1QoMjQsIExTaHIgLCBCaW5hcnlPcGVyYXRvcikgLy8gU2hpZnQgcmlnaHQgKGxvZ2ljYWwpCitIQU5ETEVfQklOQVJZX0lOU1QoMjUsIEFTaHIgLCBCaW5hcnlPcGVyYXRvcikgLy8gU2hpZnQgcmlnaHQgKGFyaXRobWV0aWMpCitIQU5ETEVfQklOQVJZX0lOU1QoMjYsIEFuZCAgLCBCaW5hcnlPcGVyYXRvcikKK0hBTkRMRV9CSU5BUllfSU5TVCgyNywgT3IgICAsIEJpbmFyeU9wZXJhdG9yKQorSEFORExFX0JJTkFSWV9JTlNUKDI4LCBYb3IgICwgQmluYXJ5T3BlcmF0b3IpCisgIExBU1RfQklOQVJZX0lOU1QoMjgpCisKKy8vIE1lbW9yeSBvcGVyYXRvcnMuLi4KKyBGSVJTVF9NRU1PUllfSU5TVCgyOSkKK0hBTkRMRV9NRU1PUllfSU5TVCgyOSwgQWxsb2NhLCBBbGxvY2FJbnN0KSAgLy8gU3RhY2sgbWFuYWdlbWVudAorSEFORExFX01FTU9SWV9JTlNUKDMwLCBMb2FkICAsIExvYWRJbnN0ICApICAvLyBNZW1vcnkgbWFuaXB1bGF0aW9uIGluc3RycworSEFORExFX01FTU9SWV9JTlNUKDMxLCBTdG9yZSAsIFN0b3JlSW5zdCApCitIQU5ETEVfTUVNT1JZX0lOU1QoMzIsIEdldEVsZW1lbnRQdHIsIEdldEVsZW1lbnRQdHJJbnN0KQorSEFORExFX01FTU9SWV9JTlNUKDMzLCBGZW5jZSAsIEZlbmNlSW5zdCApCitIQU5ETEVfTUVNT1JZX0lOU1QoMzQsIEF0b21pY0NtcFhjaGcgLCBBdG9taWNDbXBYY2hnSW5zdCApCitIQU5ETEVfTUVNT1JZX0lOU1QoMzUsIEF0b21pY1JNVyAsIEF0b21pY1JNV0luc3QgKQorICBMQVNUX01FTU9SWV9JTlNUKDM1KQorCisvLyBDYXN0IG9wZXJhdG9ycyAuLi4KKy8vIE5PVEU6IFRoZSBvcmRlciBtYXR0ZXJzIGhlcmUgYmVjYXVzZSBDYXN0SW5zdDo6aXNFbGltaW5hYmxlQ2FzdFBhaXIKKy8vIE5PVEU6IChzZWUgSW5zdHJ1Y3Rpb25zLmNwcCkgZW5jb2RlcyBhIHRhYmxlIGJhc2VkIG9uIHRoaXMgb3JkZXJpbmcuCisgRklSU1RfQ0FTVF9JTlNUKDM2KQorSEFORExFX0NBU1RfSU5TVCgzNiwgVHJ1bmMgICAsIFRydW5jSW5zdCAgICkgIC8vIFRydW5jYXRlIGludGVnZXJzCitIQU5ETEVfQ0FTVF9JTlNUKDM3LCBaRXh0ICAgICwgWkV4dEluc3QgICAgKSAgLy8gWmVybyBleHRlbmQgaW50ZWdlcnMKK0hBTkRMRV9DQVNUX0lOU1QoMzgsIFNFeHQgICAgLCBTRXh0SW5zdCAgICApICAvLyBTaWduIGV4dGVuZCBpbnRlZ2VycworSEFORExFX0NBU1RfSU5TVCgzOSwgRlBUb1VJICAsIEZQVG9VSUluc3QgICkgIC8vIGZsb2F0aW5nIHBvaW50IC0+IFVJbnQKK0hBTkRMRV9DQVNUX0lOU1QoNDAsIEZQVG9TSSAgLCBGUFRvU0lJbnN0ICApICAvLyBmbG9hdGluZyBwb2ludCAtPiBTSW50CitIQU5ETEVfQ0FTVF9JTlNUKDQxLCBVSVRvRlAgICwgVUlUb0ZQSW5zdCAgKSAgLy8gVUludCAtPiBmbG9hdGluZyBwb2ludAorSEFORExFX0NBU1RfSU5TVCg0MiwgU0lUb0ZQICAsIFNJVG9GUEluc3QgICkgIC8vIFNJbnQgLT4gZmxvYXRpbmcgcG9pbnQKK0hBTkRMRV9DQVNUX0lOU1QoNDMsIEZQVHJ1bmMgLCBGUFRydW5jSW5zdCApICAvLyBUcnVuY2F0ZSBmbG9hdGluZyBwb2ludAorSEFORExFX0NBU1RfSU5TVCg0NCwgRlBFeHQgICAsIEZQRXh0SW5zdCAgICkgIC8vIEV4dGVuZCBmbG9hdGluZyBwb2ludAorSEFORExFX0NBU1RfSU5TVCg0NSwgUHRyVG9JbnQsIFB0clRvSW50SW5zdCkgIC8vIFBvaW50ZXIgLT4gSW50ZWdlcgorSEFORExFX0NBU1RfSU5TVCg0NiwgSW50VG9QdHIsIEludFRvUHRySW5zdCkgIC8vIEludGVnZXIgLT4gUG9pbnRlcgorSEFORExFX0NBU1RfSU5TVCg0NywgQml0Q2FzdCAsIEJpdENhc3RJbnN0ICkgIC8vIFR5cGUgY2FzdAorSEFORExFX0NBU1RfSU5TVCg0OCwgQWRkclNwYWNlQ2FzdCwgQWRkclNwYWNlQ2FzdEluc3QpICAvLyBhZGRyc3BhY2UgY2FzdAorICBMQVNUX0NBU1RfSU5TVCg0OCkKKworIEZJUlNUX0ZVTkNMRVRQQURfSU5TVCg0OSkKK0hBTkRMRV9GVU5DTEVUUEFEX0lOU1QoNDksIENsZWFudXBQYWQsIENsZWFudXBQYWRJbnN0KQorSEFORExFX0ZVTkNMRVRQQURfSU5TVCg1MCwgQ2F0Y2hQYWQgICwgQ2F0Y2hQYWRJbnN0KQorICBMQVNUX0ZVTkNMRVRQQURfSU5TVCg1MCkKKworLy8gT3RoZXIgb3BlcmF0b3JzLi4uCisgRklSU1RfT1RIRVJfSU5TVCg1MSkKK0hBTkRMRV9PVEhFUl9JTlNUKDUxLCBJQ21wICAgLCBJQ21wSW5zdCAgICkgIC8vIEludGVnZXIgY29tcGFyaXNvbiBpbnN0cnVjdGlvbgorSEFORExFX09USEVSX0lOU1QoNTIsIEZDbXAgICAsIEZDbXBJbnN0ICAgKSAgLy8gRmxvYXRpbmcgcG9pbnQgY29tcGFyaXNvbiBpbnN0ci4KK0hBTkRMRV9PVEhFUl9JTlNUKDUzLCBQSEkgICAgLCBQSElOb2RlICAgICkgIC8vIFBISSBub2RlIGluc3RydWN0aW9uCitIQU5ETEVfT1RIRVJfSU5TVCg1NCwgQ2FsbCAgICwgQ2FsbEluc3QgICApICAvLyBDYWxsIGEgZnVuY3Rpb24KK0hBTkRMRV9PVEhFUl9JTlNUKDU1LCBTZWxlY3QgLCBTZWxlY3RJbnN0ICkgIC8vIHNlbGVjdCBpbnN0cnVjdGlvbgorSEFORExFX1VTRVJfSU5TVCAoNTYsIFVzZXJPcDEsIEluc3RydWN0aW9uKSAgLy8gTWF5IGJlIHVzZWQgaW50ZXJuYWxseSBpbiBhIHBhc3MKK0hBTkRMRV9VU0VSX0lOU1QgKDU3LCBVc2VyT3AyLCBJbnN0cnVjdGlvbikgIC8vIEludGVybmFsIHRvIHBhc3NlcyBvbmx5CitIQU5ETEVfT1RIRVJfSU5TVCg1OCwgVkFBcmcgICwgVkFBcmdJbnN0ICApICAvLyB2YWFyZyBpbnN0cnVjdGlvbgorSEFORExFX09USEVSX0lOU1QoNTksIEV4dHJhY3RFbGVtZW50LCBFeHRyYWN0RWxlbWVudEluc3QpLy8gZXh0cmFjdCBmcm9tIHZlY3RvcgorSEFORExFX09USEVSX0lOU1QoNjAsIEluc2VydEVsZW1lbnQsIEluc2VydEVsZW1lbnRJbnN0KSAgLy8gaW5zZXJ0IGludG8gdmVjdG9yCitIQU5ETEVfT1RIRVJfSU5TVCg2MSwgU2h1ZmZsZVZlY3RvciwgU2h1ZmZsZVZlY3Rvckluc3QpICAvLyBzaHVmZmxlIHR3byB2ZWN0b3JzLgorSEFORExFX09USEVSX0lOU1QoNjIsIEV4dHJhY3RWYWx1ZSwgRXh0cmFjdFZhbHVlSW5zdCkvLyBleHRyYWN0IGZyb20gYWdncmVnYXRlCitIQU5ETEVfT1RIRVJfSU5TVCg2MywgSW5zZXJ0VmFsdWUsIEluc2VydFZhbHVlSW5zdCkgIC8vIGluc2VydCBpbnRvIGFnZ3JlZ2F0ZQorSEFORExFX09USEVSX0lOU1QoNjQsIExhbmRpbmdQYWQsIExhbmRpbmdQYWRJbnN0KSAgLy8gTGFuZGluZyBwYWQgaW5zdHJ1Y3Rpb24uCisgIExBU1RfT1RIRVJfSU5TVCg2NCkKKworI3VuZGVmICBGSVJTVF9URVJNX0lOU1QKKyN1bmRlZiBIQU5ETEVfVEVSTV9JTlNUCisjdW5kZWYgICBMQVNUX1RFUk1fSU5TVAorCisjdW5kZWYgIEZJUlNUX0JJTkFSWV9JTlNUCisjdW5kZWYgSEFORExFX0JJTkFSWV9JTlNUCisjdW5kZWYgICBMQVNUX0JJTkFSWV9JTlNUCisKKyN1bmRlZiAgRklSU1RfTUVNT1JZX0lOU1QKKyN1bmRlZiBIQU5ETEVfTUVNT1JZX0lOU1QKKyN1bmRlZiAgIExBU1RfTUVNT1JZX0lOU1QKKworI3VuZGVmICBGSVJTVF9DQVNUX0lOU1QKKyN1bmRlZiBIQU5ETEVfQ0FTVF9JTlNUCisjdW5kZWYgICBMQVNUX0NBU1RfSU5TVAorCisjdW5kZWYgIEZJUlNUX0ZVTkNMRVRQQURfSU5TVAorI3VuZGVmIEhBTkRMRV9GVU5DTEVUUEFEX0lOU1QKKyN1bmRlZiAgIExBU1RfRlVOQ0xFVFBBRF9JTlNUCisKKyN1bmRlZiAgRklSU1RfT1RIRVJfSU5TVAorI3VuZGVmIEhBTkRMRV9PVEhFUl9JTlNUCisjdW5kZWYgICBMQVNUX09USEVSX0lOU1QKKworI3VuZGVmIEhBTkRMRV9VU0VSX0lOU1QKKworI2lmZGVmIEhBTkRMRV9JTlNUCisjdW5kZWYgSEFORExFX0lOU1QKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnN0cnVjdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnN0cnVjdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YmM0MDEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0luc3RydWN0aW9uLmgKQEAgLTAsMCArMSw3MDIgQEAKKy8vPT09LS0gbGx2bS9JbnN0cnVjdGlvbi5oIC0gSW5zdHJ1Y3Rpb24gY2xhc3MgZGVmaW5pdGlvbiAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgSW5zdHJ1Y3Rpb24gY2xhc3MsIHdoaWNoIGlzIHRoZQorLy8gYmFzZSBjbGFzcyBmb3IgYWxsIG9mIHRoZSBMTFZNIGluc3RydWN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfSU5TVFJVQ1RJT05fSAorI2RlZmluZSBMTFZNX0lSX0lOU1RSVUNUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0X25vZGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RlYnVnTG9jLmgiCisjaW5jbHVkZSAibGx2bS9JUi9TeW1ib2xUYWJsZUxpc3RUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1VzZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIEZhc3RNYXRoRmxhZ3M7CitjbGFzcyBNRE5vZGU7CitjbGFzcyBNb2R1bGU7CitzdHJ1Y3QgQUFNRE5vZGVzOworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaWxpc3RfYWxsb2NfdHJhaXRzPEluc3RydWN0aW9uPiB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCBkZWxldGVOb2RlKEluc3RydWN0aW9uICpWKTsKK307CisKK2NsYXNzIEluc3RydWN0aW9uIDogcHVibGljIFVzZXIsCisgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBpbGlzdF9ub2RlX3dpdGhfcGFyZW50PEluc3RydWN0aW9uLCBCYXNpY0Jsb2NrPiB7CisgIEJhc2ljQmxvY2sgKlBhcmVudDsKKyAgRGVidWdMb2MgRGJnTG9jOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyAnZGJnJyBNZXRhZGF0YSBjYWNoZS4KKworICBlbnVtIHsKKyAgICAvLy8gVGhpcyBpcyBhIGJpdCBzdG9yZWQgaW4gdGhlIFN1YkNsYXNzRGF0YSBmaWVsZCB3aGljaCBpbmRpY2F0ZXMgd2hldGhlcgorICAgIC8vLyB0aGlzIGluc3RydWN0aW9uIGhhcyBtZXRhZGF0YSBhdHRhY2hlZCB0byBpdCBvciBub3QuCisgICAgSGFzTWV0YWRhdGFCaXQgPSAxIDw8IDE1CisgIH07CisKK3Byb3RlY3RlZDoKKyAgfkluc3RydWN0aW9uKCk7IC8vIFVzZSBkZWxldGVWYWx1ZSgpIHRvIGRlbGV0ZSBhIGdlbmVyaWMgSW5zdHJ1Y3Rpb24uCisKK3B1YmxpYzoKKyAgSW5zdHJ1Y3Rpb24oY29uc3QgSW5zdHJ1Y3Rpb24gJikgPSBkZWxldGU7CisgIEluc3RydWN0aW9uICZvcGVyYXRvcj0oY29uc3QgSW5zdHJ1Y3Rpb24gJikgPSBkZWxldGU7CisKKyAgLy8vIFNwZWNpYWxpemUgdGhlIG1ldGhvZHMgZGVmaW5lZCBpbiBWYWx1ZSwgYXMgd2Uga25vdyB0aGF0IGFuIGluc3RydWN0aW9uCisgIC8vLyBjYW4gb25seSBiZSB1c2VkIGJ5IG90aGVyIGluc3RydWN0aW9ucy4KKyAgSW5zdHJ1Y3Rpb24gICAgICAgKnVzZXJfYmFjaygpICAgICAgIHsgcmV0dXJuIGNhc3Q8SW5zdHJ1Y3Rpb24+KCp1c2VyX2JlZ2luKCkpO30KKyAgY29uc3QgSW5zdHJ1Y3Rpb24gKnVzZXJfYmFjaygpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8SW5zdHJ1Y3Rpb24+KCp1c2VyX2JlZ2luKCkpO30KKworICBpbmxpbmUgY29uc3QgQmFzaWNCbG9jayAqZ2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4gUGFyZW50OyB9CisgIGlubGluZSAgICAgICBCYXNpY0Jsb2NrICpnZXRQYXJlbnQoKSAgICAgICB7IHJldHVybiBQYXJlbnQ7IH0KKworICAvLy8gUmV0dXJuIHRoZSBtb2R1bGUgb3duaW5nIHRoZSBmdW5jdGlvbiB0aGlzIGluc3RydWN0aW9uIGJlbG9uZ3MgdG8KKyAgLy8vIG9yIG51bGxwdHIgaXQgdGhlIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgYSBtb2R1bGUuCisgIC8vLworICAvLy8gTm90ZTogdGhpcyBpcyB1bmRlZmluZWQgYmVoYXZpb3IgaWYgdGhlIGluc3RydWN0aW9uIGRvZXMgbm90IGhhdmUgYQorICAvLy8gcGFyZW50LCBvciB0aGUgcGFyZW50IGJhc2ljIGJsb2NrIGRvZXMgbm90IGhhdmUgYSBwYXJlbnQgZnVuY3Rpb24uCisgIGNvbnN0IE1vZHVsZSAqZ2V0TW9kdWxlKCkgY29uc3Q7CisgIE1vZHVsZSAqZ2V0TW9kdWxlKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PE1vZHVsZSAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IEluc3RydWN0aW9uICo+KHRoaXMpLT5nZXRNb2R1bGUoKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBmdW5jdGlvbiB0aGlzIGluc3RydWN0aW9uIGJlbG9uZ3MgdG8uCisgIC8vLworICAvLy8gTm90ZTogaXQgaXMgdW5kZWZpbmVkIGJlaGF2aW9yIHRvIGNhbGwgdGhpcyBvbiBhbiBpbnN0cnVjdGlvbiBub3QKKyAgLy8vIGN1cnJlbnRseSBpbnNlcnRlZCBpbnRvIGEgZnVuY3Rpb24uCisgIGNvbnN0IEZ1bmN0aW9uICpnZXRGdW5jdGlvbigpIGNvbnN0OworICBGdW5jdGlvbiAqZ2V0RnVuY3Rpb24oKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8RnVuY3Rpb24gKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgSW5zdHJ1Y3Rpb24gKj4odGhpcyktPmdldEZ1bmN0aW9uKCkpOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIHVubGlua3MgJ3RoaXMnIGZyb20gdGhlIGNvbnRhaW5pbmcgYmFzaWMgYmxvY2ssIGJ1dCBkb2VzIG5vdAorICAvLy8gZGVsZXRlIGl0LgorICB2b2lkIHJlbW92ZUZyb21QYXJlbnQoKTsKKworICAvLy8gVGhpcyBtZXRob2QgdW5saW5rcyAndGhpcycgZnJvbSB0aGUgY29udGFpbmluZyBiYXNpYyBibG9jayBhbmQgZGVsZXRlcyBpdC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhbiBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgZWxlbWVudCBhZnRlciB0aGUgZXJhc2VkIG9uZQorICBTeW1ib2xUYWJsZUxpc3Q8SW5zdHJ1Y3Rpb24+OjppdGVyYXRvciBlcmFzZUZyb21QYXJlbnQoKTsKKworICAvLy8gSW5zZXJ0IGFuIHVubGlua2VkIGluc3RydWN0aW9uIGludG8gYSBiYXNpYyBibG9jayBpbW1lZGlhdGVseSBiZWZvcmUKKyAgLy8vIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgaW5zZXJ0QmVmb3JlKEluc3RydWN0aW9uICpJbnNlcnRQb3MpOworCisgIC8vLyBJbnNlcnQgYW4gdW5saW5rZWQgaW5zdHJ1Y3Rpb24gaW50byBhIGJhc2ljIGJsb2NrIGltbWVkaWF0ZWx5IGFmdGVyIHRoZQorICAvLy8gc3BlY2lmaWVkIGluc3RydWN0aW9uLgorICB2b2lkIGluc2VydEFmdGVyKEluc3RydWN0aW9uICpJbnNlcnRQb3MpOworCisgIC8vLyBVbmxpbmsgdGhpcyBpbnN0cnVjdGlvbiBmcm9tIGl0cyBjdXJyZW50IGJhc2ljIGJsb2NrIGFuZCBpbnNlcnQgaXQgaW50bworICAvLy8gdGhlIGJhc2ljIGJsb2NrIHRoYXQgTW92ZVBvcyBsaXZlcyBpbiwgcmlnaHQgYmVmb3JlIE1vdmVQb3MuCisgIHZvaWQgbW92ZUJlZm9yZShJbnN0cnVjdGlvbiAqTW92ZVBvcyk7CisKKyAgLy8vIFVubGluayB0aGlzIGluc3RydWN0aW9uIGFuZCBpbnNlcnQgaW50byBCQiBiZWZvcmUgSS4KKyAgLy8vCisgIC8vLyBccHJlIEkgaXMgYSB2YWxpZCBpdGVyYXRvciBpbnRvIEJCLgorICB2b2lkIG1vdmVCZWZvcmUoQmFzaWNCbG9jayAmQkIsIFN5bWJvbFRhYmxlTGlzdDxJbnN0cnVjdGlvbj46Oml0ZXJhdG9yIEkpOworCisgIC8vLyBVbmxpbmsgdGhpcyBpbnN0cnVjdGlvbiBmcm9tIGl0cyBjdXJyZW50IGJhc2ljIGJsb2NrIGFuZCBpbnNlcnQgaXQgaW50bworICAvLy8gdGhlIGJhc2ljIGJsb2NrIHRoYXQgTW92ZVBvcyBsaXZlcyBpbiwgcmlnaHQgYWZ0ZXIgTW92ZVBvcy4KKyAgdm9pZCBtb3ZlQWZ0ZXIoSW5zdHJ1Y3Rpb24gKk1vdmVQb3MpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBTdWJjbGFzcyBjbGFzc2lmaWNhdGlvbi4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFJldHVybnMgYSBtZW1iZXIgb2Ygb25lIG9mIHRoZSBlbnVtcyBsaWtlIEluc3RydWN0aW9uOjpBZGQuCisgIHVuc2lnbmVkIGdldE9wY29kZSgpIGNvbnN0IHsgcmV0dXJuIGdldFZhbHVlSUQoKSAtIEluc3RydWN0aW9uVmFsOyB9CisKKyAgY29uc3QgY2hhciAqZ2V0T3Bjb2RlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wY29kZU5hbWUoZ2V0T3Bjb2RlKCkpOyB9CisgIGJvb2wgaXNUZXJtaW5hdG9yKCkgY29uc3QgeyByZXR1cm4gaXNUZXJtaW5hdG9yKGdldE9wY29kZSgpKTsgfQorICBib29sIGlzQmluYXJ5T3AoKSBjb25zdCB7IHJldHVybiBpc0JpbmFyeU9wKGdldE9wY29kZSgpKTsgfQorICBib29sIGlzU2hpZnQoKSB7IHJldHVybiBpc1NoaWZ0KGdldE9wY29kZSgpKTsgfQorICBib29sIGlzQ2FzdCgpIGNvbnN0IHsgcmV0dXJuIGlzQ2FzdChnZXRPcGNvZGUoKSk7IH0KKyAgYm9vbCBpc0Z1bmNsZXRQYWQoKSBjb25zdCB7IHJldHVybiBpc0Z1bmNsZXRQYWQoZ2V0T3Bjb2RlKCkpOyB9CisKKyAgc3RhdGljIGNvbnN0IGNoYXIqIGdldE9wY29kZU5hbWUodW5zaWduZWQgT3BDb2RlKTsKKworICBzdGF0aWMgaW5saW5lIGJvb2wgaXNUZXJtaW5hdG9yKHVuc2lnbmVkIE9wQ29kZSkgeworICAgIHJldHVybiBPcENvZGUgPj0gVGVybU9wc0JlZ2luICYmIE9wQ29kZSA8IFRlcm1PcHNFbmQ7CisgIH0KKworICBzdGF0aWMgaW5saW5lIGJvb2wgaXNCaW5hcnlPcCh1bnNpZ25lZCBPcGNvZGUpIHsKKyAgICByZXR1cm4gT3Bjb2RlID49IEJpbmFyeU9wc0JlZ2luICYmIE9wY29kZSA8IEJpbmFyeU9wc0VuZDsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIE9wY29kZSBpcyBvbmUgb2YgdGhlIHNoaWZ0IGluc3RydWN0aW9ucy4KKyAgc3RhdGljIGlubGluZSBib29sIGlzU2hpZnQodW5zaWduZWQgT3Bjb2RlKSB7CisgICAgcmV0dXJuIE9wY29kZSA+PSBTaGwgJiYgT3Bjb2RlIDw9IEFTaHI7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGxvZ2ljYWwgc2hpZnQgbGVmdCBvciBhIGxvZ2ljYWwgc2hpZnQgcmlnaHQuCisgIGlubGluZSBib29sIGlzTG9naWNhbFNoaWZ0KCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGNvZGUoKSA9PSBTaGwgfHwgZ2V0T3Bjb2RlKCkgPT0gTFNocjsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIGFyaXRobWV0aWMgc2hpZnQgcmlnaHQuCisgIGlubGluZSBib29sIGlzQXJpdGhtZXRpY1NoaWZ0KCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGNvZGUoKSA9PSBBU2hyOworICB9CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgT3Bjb2RlIGlzIGFuZC9vci94b3IuCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0JpdHdpc2VMb2dpY09wKHVuc2lnbmVkIE9wY29kZSkgeworICAgIHJldHVybiBPcGNvZGUgPT0gQW5kIHx8IE9wY29kZSA9PSBPciB8fCBPcGNvZGUgPT0gWG9yOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW5kL29yL3hvci4KKyAgaW5saW5lIGJvb2wgaXNCaXR3aXNlTG9naWNPcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNCaXR3aXNlTG9naWNPcChnZXRPcGNvZGUoKSk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBPcENvZGUgaXMgb25lIG9mIHRoZSBDYXN0SW5zdCBpbnN0cnVjdGlvbnMuCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBpc0Nhc3QodW5zaWduZWQgT3BDb2RlKSB7CisgICAgcmV0dXJuIE9wQ29kZSA+PSBDYXN0T3BzQmVnaW4gJiYgT3BDb2RlIDwgQ2FzdE9wc0VuZDsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIE9wQ29kZSBpcyBvbmUgb2YgdGhlIEZ1bmNsZXRQYWRJbnN0IGluc3RydWN0aW9ucy4KKyAgc3RhdGljIGlubGluZSBib29sIGlzRnVuY2xldFBhZCh1bnNpZ25lZCBPcENvZGUpIHsKKyAgICByZXR1cm4gT3BDb2RlID49IEZ1bmNsZXRQYWRPcHNCZWdpbiAmJiBPcENvZGUgPCBGdW5jbGV0UGFkT3BzRW5kOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIE1ldGFkYXRhIG1hbmlwdWxhdGlvbi4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaGFzIGFueSBtZXRhZGF0YSBhdHRhY2hlZCB0byBpdC4KKyAgYm9vbCBoYXNNZXRhZGF0YSgpIGNvbnN0IHsgcmV0dXJuIERiZ0xvYyB8fCBoYXNNZXRhZGF0YUhhc2hFbnRyeSgpOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaGFzIG1ldGFkYXRhIGF0dGFjaGVkIHRvIGl0IG90aGVyIHRoYW4gYQorICAvLy8gZGVidWcgbG9jYXRpb24uCisgIGJvb2wgaGFzTWV0YWRhdGFPdGhlclRoYW5EZWJ1Z0xvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzTWV0YWRhdGFIYXNoRW50cnkoKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIG1ldGFkYXRhIG9mIGdpdmVuIGtpbmQgYXR0YWNoZWQgdG8gdGhpcyBJbnN0cnVjdGlvbi4KKyAgLy8vIElmIHRoZSBtZXRhZGF0YSBpcyBub3QgZm91bmQgdGhlbiByZXR1cm4gbnVsbC4KKyAgTUROb2RlICpnZXRNZXRhZGF0YSh1bnNpZ25lZCBLaW5kSUQpIGNvbnN0IHsKKyAgICBpZiAoIWhhc01ldGFkYXRhKCkpIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBnZXRNZXRhZGF0YUltcGwoS2luZElEKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIG1ldGFkYXRhIG9mIGdpdmVuIGtpbmQgYXR0YWNoZWQgdG8gdGhpcyBJbnN0cnVjdGlvbi4KKyAgLy8vIElmIHRoZSBtZXRhZGF0YSBpcyBub3QgZm91bmQgdGhlbiByZXR1cm4gbnVsbC4KKyAgTUROb2RlICpnZXRNZXRhZGF0YShTdHJpbmdSZWYgS2luZCkgY29uc3QgeworICAgIGlmICghaGFzTWV0YWRhdGEoKSkgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIGdldE1ldGFkYXRhSW1wbChLaW5kKTsKKyAgfQorCisgIC8vLyBHZXQgYWxsIG1ldGFkYXRhIGF0dGFjaGVkIHRvIHRoaXMgSW5zdHJ1Y3Rpb24uIFRoZSBmaXJzdCBlbGVtZW50IG9mIGVhY2gKKyAgLy8vIHBhaXIgcmV0dXJuZWQgaXMgdGhlIEtpbmRJRCwgdGhlIHNlY29uZCBlbGVtZW50IGlzIHRoZSBtZXRhZGF0YSB2YWx1ZS4KKyAgLy8vIFRoaXMgbGlzdCBpcyByZXR1cm5lZCBzb3J0ZWQgYnkgdGhlIEtpbmRJRC4KKyAgdm9pZAorICBnZXRBbGxNZXRhZGF0YShTbWFsbFZlY3RvckltcGw8c3RkOjpwYWlyPHVuc2lnbmVkLCBNRE5vZGUgKj4+ICZNRHMpIGNvbnN0IHsKKyAgICBpZiAoaGFzTWV0YWRhdGEoKSkKKyAgICAgIGdldEFsbE1ldGFkYXRhSW1wbChNRHMpOworICB9CisKKyAgLy8vIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBnZXRBbGxNZXRhZGF0YSwgZXhjZXB0IHRoYXQgaXQgZmlsdGVycyBvdXQgdGhlCisgIC8vLyBkZWJ1ZyBsb2NhdGlvbi4KKyAgdm9pZCBnZXRBbGxNZXRhZGF0YU90aGVyVGhhbkRlYnVnTG9jKAorICAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjx1bnNpZ25lZCwgTUROb2RlICo+PiAmTURzKSBjb25zdCB7CisgICAgaWYgKGhhc01ldGFkYXRhT3RoZXJUaGFuRGVidWdMb2MoKSkKKyAgICAgIGdldEFsbE1ldGFkYXRhT3RoZXJUaGFuRGVidWdMb2NJbXBsKE1Ecyk7CisgIH0KKworICAvLy8gRmlsbHMgdGhlIEFBTUROb2RlcyBzdHJ1Y3R1cmUgd2l0aCBBQSBtZXRhZGF0YSBmcm9tIHRoaXMgaW5zdHJ1Y3Rpb24uCisgIC8vLyBXaGVuIE1lcmdlIGlzIHRydWUsIHRoZSBleGlzdGluZyBBQSBtZXRhZGF0YSBpcyBtZXJnZWQgd2l0aCB0aGF0IGZyb20gdGhpcworICAvLy8gaW5zdHJ1Y3Rpb24gcHJvdmlkaW5nIHRoZSBtb3N0LWdlbmVyYWwgcmVzdWx0LgorICB2b2lkIGdldEFBTWV0YWRhdGEoQUFNRE5vZGVzICZOLCBib29sIE1lcmdlID0gZmFsc2UpIGNvbnN0OworCisgIC8vLyBTZXQgdGhlIG1ldGFkYXRhIG9mIHRoZSBzcGVjaWZpZWQga2luZCB0byB0aGUgc3BlY2lmaWVkIG5vZGUuIFRoaXMgdXBkYXRlcworICAvLy8gb3IgcmVwbGFjZXMgbWV0YWRhdGEgaWYgYWxyZWFkeSBwcmVzZW50LCBvciByZW1vdmVzIGl0IGlmIE5vZGUgaXMgbnVsbC4KKyAgdm9pZCBzZXRNZXRhZGF0YSh1bnNpZ25lZCBLaW5kSUQsIE1ETm9kZSAqTm9kZSk7CisgIHZvaWQgc2V0TWV0YWRhdGEoU3RyaW5nUmVmIEtpbmQsIE1ETm9kZSAqTm9kZSk7CisKKyAgLy8vIENvcHkgbWV0YWRhdGEgZnJvbSBccCBTcmNJbnN0IHRvIHRoaXMgaW5zdHJ1Y3Rpb24uIFxwIFdMLCBpZiBub3QgZW1wdHksCisgIC8vLyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgbWV0YSBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgY29waWVkLiBJZiBccCBXTCBpcworICAvLy8gZW1wdHksIGFsbCBtZXRhIGRhdGEgd2lsbCBiZSBjb3BpZWQuCisgIHZvaWQgY29weU1ldGFkYXRhKGNvbnN0IEluc3RydWN0aW9uICZTcmNJbnN0LAorICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gV0wgPSBBcnJheVJlZjx1bnNpZ25lZD4oKSk7CisKKyAgLy8vIElmIHRoZSBpbnN0cnVjdGlvbiBoYXMgImJyYW5jaF93ZWlnaHRzIiBNRF9wcm9mIG1ldGFkYXRhIGFuZCB0aGUgTUROb2RlCisgIC8vLyBoYXMgdGhyZWUgb3BlcmFuZHMgKGluY2x1ZGluZyBuYW1lIHN0cmluZyksIHN3YXAgdGhlIG9yZGVyIG9mIHRoZQorICAvLy8gbWV0YWRhdGEuCisgIHZvaWQgc3dhcFByb2ZNZXRhZGF0YSgpOworCisgIC8vLyBEcm9wIGFsbCB1bmtub3duIG1ldGFkYXRhIGV4Y2VwdCBmb3IgZGVidWcgbG9jYXRpb25zLgorICAvLy8gQHsKKyAgLy8vIFBhc3NlcyBhcmUgcmVxdWlyZWQgdG8gZHJvcCBtZXRhZGF0YSB0aGV5IGRvbid0IHVuZGVyc3RhbmQuIFRoaXMgaXMgYQorICAvLy8gY29udmVuaWVuY2UgbWV0aG9kIGZvciBwYXNzZXMgdG8gZG8gc28uCisgIHZvaWQgZHJvcFVua25vd25Ob25EZWJ1Z01ldGFkYXRhKEFycmF5UmVmPHVuc2lnbmVkPiBLbm93bklEcyk7CisgIHZvaWQgZHJvcFVua25vd25Ob25EZWJ1Z01ldGFkYXRhKCkgeworICAgIHJldHVybiBkcm9wVW5rbm93bk5vbkRlYnVnTWV0YWRhdGEoTm9uZSk7CisgIH0KKyAgdm9pZCBkcm9wVW5rbm93bk5vbkRlYnVnTWV0YWRhdGEodW5zaWduZWQgSUQxKSB7CisgICAgcmV0dXJuIGRyb3BVbmtub3duTm9uRGVidWdNZXRhZGF0YShtYWtlQXJyYXlSZWYoSUQxKSk7CisgIH0KKyAgdm9pZCBkcm9wVW5rbm93bk5vbkRlYnVnTWV0YWRhdGEodW5zaWduZWQgSUQxLCB1bnNpZ25lZCBJRDIpIHsKKyAgICB1bnNpZ25lZCBJRHNbXSA9IHtJRDEsIElEMn07CisgICAgcmV0dXJuIGRyb3BVbmtub3duTm9uRGVidWdNZXRhZGF0YShJRHMpOworICB9CisgIC8vLyBAfQorCisgIC8vLyBTZXRzIHRoZSBtZXRhZGF0YSBvbiB0aGlzIGluc3RydWN0aW9uIGZyb20gdGhlIEFBTUROb2RlcyBzdHJ1Y3R1cmUuCisgIHZvaWQgc2V0QUFNZXRhZGF0YShjb25zdCBBQU1ETm9kZXMgJk4pOworCisgIC8vLyBSZXRyaWV2ZSB0aGUgcmF3IHdlaWdodCB2YWx1ZXMgb2YgYSBjb25kaXRpb25hbCBicmFuY2ggb3Igc2VsZWN0LgorICAvLy8gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3Mgd2l0aCBwcm9maWxlIHdlaWdodHMgZmlsbGVkIGluLgorICAvLy8gUmV0dXJucyBmYWxzZSBpZiBubyBtZXRhZGF0YSBvciBpbnZhbGlkIG1ldGFkYXRhIHdhcyBmb3VuZC4KKyAgYm9vbCBleHRyYWN0UHJvZk1ldGFkYXRhKHVpbnQ2NF90ICZUcnVlVmFsLCB1aW50NjRfdCAmRmFsc2VWYWwpIGNvbnN0OworCisgIC8vLyBSZXRyaWV2ZSB0b3RhbCByYXcgd2VpZ2h0IHZhbHVlcyBvZiBhIGJyYW5jaC4KKyAgLy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzIHdpdGggcHJvZmlsZSB0b3RhbCB3ZWlnaHRzIGZpbGxlZCBpbi4KKyAgLy8vIFJldHVybnMgZmFsc2UgaWYgbm8gbWV0YWRhdGEgd2FzIGZvdW5kLgorICBib29sIGV4dHJhY3RQcm9mVG90YWxXZWlnaHQodWludDY0X3QgJlRvdGFsVmFsKSBjb25zdDsKKworICAvLy8gVXBkYXRlcyBicmFuY2hfd2VpZ2h0cyBtZXRhZGF0YSBieSBzY2FsaW5nIGl0IGJ5IFxwIFMgLyBccCBULgorICB2b2lkIHVwZGF0ZVByb2ZXZWlnaHQodWludDY0X3QgUywgdWludDY0X3QgVCk7CisKKyAgLy8vIFNldHMgdGhlIGJyYW5jaF93ZWlnaHRzIG1ldGFkYXRhIHRvIFxwIFcgZm9yIENhbGxJbnN0LgorICB2b2lkIHNldFByb2ZXZWlnaHQodWludDY0X3QgVyk7CisKKyAgLy8vIFNldCB0aGUgZGVidWcgbG9jYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoaXMgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgc2V0RGVidWdMb2MoRGVidWdMb2MgTG9jKSB7IERiZ0xvYyA9IHN0ZDo6bW92ZShMb2MpOyB9CisKKyAgLy8vIFJldHVybiB0aGUgZGVidWcgbG9jYXRpb24gZm9yIHRoaXMgbm9kZSBhcyBhIERlYnVnTG9jLgorICBjb25zdCBEZWJ1Z0xvYyAmZ2V0RGVidWdMb2MoKSBjb25zdCB7IHJldHVybiBEYmdMb2M7IH0KKworICAvLy8gU2V0IG9yIGNsZWFyIHRoZSBuc3cgZmxhZyBvbiB0aGlzIGluc3RydWN0aW9uLCB3aGljaCBtdXN0IGJlIGFuIG9wZXJhdG9yCisgIC8vLyB3aGljaCBzdXBwb3J0cyB0aGlzIGZsYWcuIFNlZSBMYW5nUmVmLmh0bWwgZm9yIHRoZSBtZWFuaW5nIG9mIHRoaXMgZmxhZy4KKyAgdm9pZCBzZXRIYXNOb1Vuc2lnbmVkV3JhcChib29sIGIgPSB0cnVlKTsKKworICAvLy8gU2V0IG9yIGNsZWFyIHRoZSBuc3cgZmxhZyBvbiB0aGlzIGluc3RydWN0aW9uLCB3aGljaCBtdXN0IGJlIGFuIG9wZXJhdG9yCisgIC8vLyB3aGljaCBzdXBwb3J0cyB0aGlzIGZsYWcuIFNlZSBMYW5nUmVmLmh0bWwgZm9yIHRoZSBtZWFuaW5nIG9mIHRoaXMgZmxhZy4KKyAgdm9pZCBzZXRIYXNOb1NpZ25lZFdyYXAoYm9vbCBiID0gdHJ1ZSk7CisKKyAgLy8vIFNldCBvciBjbGVhciB0aGUgZXhhY3QgZmxhZyBvbiB0aGlzIGluc3RydWN0aW9uLCB3aGljaCBtdXN0IGJlIGFuIG9wZXJhdG9yCisgIC8vLyB3aGljaCBzdXBwb3J0cyB0aGlzIGZsYWcuIFNlZSBMYW5nUmVmLmh0bWwgZm9yIHRoZSBtZWFuaW5nIG9mIHRoaXMgZmxhZy4KKyAgdm9pZCBzZXRJc0V4YWN0KGJvb2wgYiA9IHRydWUpOworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgbm8gdW5zaWduZWQgd3JhcCBmbGFnIGlzIHNldC4KKyAgYm9vbCBoYXNOb1Vuc2lnbmVkV3JhcCgpIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgbm8gc2lnbmVkIHdyYXAgZmxhZyBpcyBzZXQuCisgIGJvb2wgaGFzTm9TaWduZWRXcmFwKCkgY29uc3Q7CisKKyAgLy8vIERyb3BzIGZsYWdzIHRoYXQgbWF5IGNhdXNlIHRoaXMgaW5zdHJ1Y3Rpb24gdG8gZXZhbHVhdGUgdG8gcG9pc29uIGRlc3BpdGUKKyAgLy8vIGhhdmluZyBub24tcG9pc29uIGlucHV0cy4KKyAgdm9pZCBkcm9wUG9pc29uR2VuZXJhdGluZ0ZsYWdzKCk7CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBleGFjdCBmbGFnIGlzIHNldC4KKyAgYm9vbCBpc0V4YWN0KCkgY29uc3Q7CisKKyAgLy8vIFNldCBvciBjbGVhciBhbGwgZmFzdC1tYXRoLWZsYWdzIG9uIHRoaXMgaW5zdHJ1Y3Rpb24sIHdoaWNoIG11c3QgYmUgYW4KKyAgLy8vIG9wZXJhdG9yIHdoaWNoIHN1cHBvcnRzIHRoaXMgZmxhZy4gU2VlIExhbmdSZWYuaHRtbCBmb3IgdGhlIG1lYW5pbmcgb2YKKyAgLy8vIHRoaXMgZmxhZy4KKyAgdm9pZCBzZXRGYXN0KGJvb2wgQik7CisKKyAgLy8vIFNldCBvciBjbGVhciB0aGUgcmVhc3NvY2lhdGlvbiBmbGFnIG9uIHRoaXMgaW5zdHJ1Y3Rpb24sIHdoaWNoIG11c3QgYmUKKyAgLy8vIGFuIG9wZXJhdG9yIHdoaWNoIHN1cHBvcnRzIHRoaXMgZmxhZy4gU2VlIExhbmdSZWYuaHRtbCBmb3IgdGhlIG1lYW5pbmcgb2YKKyAgLy8vIHRoaXMgZmxhZy4KKyAgdm9pZCBzZXRIYXNBbGxvd1JlYXNzb2MoYm9vbCBCKTsKKworICAvLy8gU2V0IG9yIGNsZWFyIHRoZSBuby1uYW5zIGZsYWcgb24gdGhpcyBpbnN0cnVjdGlvbiwgd2hpY2ggbXVzdCBiZSBhbgorICAvLy8gb3BlcmF0b3Igd2hpY2ggc3VwcG9ydHMgdGhpcyBmbGFnLiBTZWUgTGFuZ1JlZi5odG1sIGZvciB0aGUgbWVhbmluZyBvZgorICAvLy8gdGhpcyBmbGFnLgorICB2b2lkIHNldEhhc05vTmFOcyhib29sIEIpOworCisgIC8vLyBTZXQgb3IgY2xlYXIgdGhlIG5vLWluZnMgZmxhZyBvbiB0aGlzIGluc3RydWN0aW9uLCB3aGljaCBtdXN0IGJlIGFuCisgIC8vLyBvcGVyYXRvciB3aGljaCBzdXBwb3J0cyB0aGlzIGZsYWcuIFNlZSBMYW5nUmVmLmh0bWwgZm9yIHRoZSBtZWFuaW5nIG9mCisgIC8vLyB0aGlzIGZsYWcuCisgIHZvaWQgc2V0SGFzTm9JbmZzKGJvb2wgQik7CisKKyAgLy8vIFNldCBvciBjbGVhciB0aGUgbm8tc2lnbmVkLXplcm9zIGZsYWcgb24gdGhpcyBpbnN0cnVjdGlvbiwgd2hpY2ggbXVzdCBiZQorICAvLy8gYW4gb3BlcmF0b3Igd2hpY2ggc3VwcG9ydHMgdGhpcyBmbGFnLiBTZWUgTGFuZ1JlZi5odG1sIGZvciB0aGUgbWVhbmluZyBvZgorICAvLy8gdGhpcyBmbGFnLgorICB2b2lkIHNldEhhc05vU2lnbmVkWmVyb3MoYm9vbCBCKTsKKworICAvLy8gU2V0IG9yIGNsZWFyIHRoZSBhbGxvdy1yZWNpcHJvY2FsIGZsYWcgb24gdGhpcyBpbnN0cnVjdGlvbiwgd2hpY2ggbXVzdCBiZQorICAvLy8gYW4gb3BlcmF0b3Igd2hpY2ggc3VwcG9ydHMgdGhpcyBmbGFnLiBTZWUgTGFuZ1JlZi5odG1sIGZvciB0aGUgbWVhbmluZyBvZgorICAvLy8gdGhpcyBmbGFnLgorICB2b2lkIHNldEhhc0FsbG93UmVjaXByb2NhbChib29sIEIpOworCisgIC8vLyBTZXQgb3IgY2xlYXIgdGhlIGFwcHJveGltYXRlLW1hdGgtZnVuY3Rpb25zIGZsYWcgb24gdGhpcyBpbnN0cnVjdGlvbiwKKyAgLy8vIHdoaWNoIG11c3QgYmUgYW4gb3BlcmF0b3Igd2hpY2ggc3VwcG9ydHMgdGhpcyBmbGFnLiBTZWUgTGFuZ1JlZi5odG1sIGZvcgorICAvLy8gdGhlIG1lYW5pbmcgb2YgdGhpcyBmbGFnLgorICB2b2lkIHNldEhhc0FwcHJveEZ1bmMoYm9vbCBCKTsKKworICAvLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIHNldHRpbmcgbXVsdGlwbGUgZmFzdC1tYXRoIGZsYWdzIG9uIHRoaXMKKyAgLy8vIGluc3RydWN0aW9uLCB3aGljaCBtdXN0IGJlIGFuIG9wZXJhdG9yIHdoaWNoIHN1cHBvcnRzIHRoZXNlIGZsYWdzLiBTZWUKKyAgLy8vIExhbmdSZWYuaHRtbCBmb3IgdGhlIG1lYW5pbmcgb2YgdGhlc2UgZmxhZ3MuCisgIHZvaWQgc2V0RmFzdE1hdGhGbGFncyhGYXN0TWF0aEZsYWdzIEZNRik7CisKKyAgLy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciB0cmFuc2ZlcnJpbmcgYWxsIGZhc3QtbWF0aCBmbGFnIHZhbHVlcyB0byB0aGlzCisgIC8vLyBpbnN0cnVjdGlvbiwgd2hpY2ggbXVzdCBiZSBhbiBvcGVyYXRvciB3aGljaCBzdXBwb3J0cyB0aGVzZSBmbGFncy4gU2VlCisgIC8vLyBMYW5nUmVmLmh0bWwgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZXNlIGZsYWdzLgorICB2b2lkIGNvcHlGYXN0TWF0aEZsYWdzKEZhc3RNYXRoRmxhZ3MgRk1GKTsKKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgYWxsIGZhc3QtbWF0aC1mbGFncyBhcmUgc2V0LgorICBib29sIGlzRmFzdCgpIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgYWxsb3ctcmVhc3NvY2lhdGlvbiBmbGFnIGlzIHNldC4KKyAgYm9vbCBoYXNBbGxvd1JlYXNzb2MoKSBjb25zdDsKKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIG5vLU5hTnMgZmxhZyBpcyBzZXQuCisgIGJvb2wgaGFzTm9OYU5zKCkgY29uc3Q7CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBuby1pbmZzIGZsYWcgaXMgc2V0LgorICBib29sIGhhc05vSW5mcygpIGNvbnN0OworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgbm8tc2lnbmVkLXplcm9zIGZsYWcgaXMgc2V0LgorICBib29sIGhhc05vU2lnbmVkWmVyb3MoKSBjb25zdDsKKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhlIGFsbG93LXJlY2lwcm9jYWwgZmxhZyBpcyBzZXQuCisgIGJvb2wgaGFzQWxsb3dSZWNpcHJvY2FsKCkgY29uc3Q7CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBhbGxvdy1jb250cmFjdCBmbGFnIGlzIHNldC4KKyAgYm9vbCBoYXNBbGxvd0NvbnRyYWN0KCkgY29uc3Q7CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBhcHByb3hpbWF0ZS1tYXRoLWZ1bmN0aW9ucyBmbGFnIGlzIHNldC4KKyAgYm9vbCBoYXNBcHByb3hGdW5jKCkgY29uc3Q7CisKKyAgLy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBnZXR0aW5nIGFsbCB0aGUgZmFzdC1tYXRoIGZsYWdzLCB3aGljaCBtdXN0IGJlIGFuCisgIC8vLyBvcGVyYXRvciB3aGljaCBzdXBwb3J0cyB0aGVzZSBmbGFncy4gU2VlIExhbmdSZWYuaHRtbCBmb3IgdGhlIG1lYW5pbmcgb2YKKyAgLy8vIHRoZXNlIGZsYWdzLgorICBGYXN0TWF0aEZsYWdzIGdldEZhc3RNYXRoRmxhZ3MoKSBjb25zdDsKKworICAvLy8gQ29weSBJJ3MgZmFzdC1tYXRoIGZsYWdzCisgIHZvaWQgY29weUZhc3RNYXRoRmxhZ3MoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpOworCisgIC8vLyBDb252ZW5pZW5jZSBtZXRob2QgdG8gY29weSBzdXBwb3J0ZWQgZXhhY3QsIGZhc3QtbWF0aCwgYW5kIChvcHRpb25hbGx5KQorICAvLy8gd3JhcHBpbmcgZmxhZ3MgZnJvbSBWIHRvIHRoaXMgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgY29weUlSRmxhZ3MoY29uc3QgVmFsdWUgKlYsIGJvb2wgSW5jbHVkZVdyYXBGbGFncyA9IHRydWUpOworCisgIC8vLyBMb2dpY2FsICdhbmQnIG9mIGFueSBzdXBwb3J0ZWQgd3JhcHBpbmcsIGV4YWN0LCBhbmQgZmFzdC1tYXRoIGZsYWdzIG9mCisgIC8vLyBWIGFuZCB0aGlzIGluc3RydWN0aW9uLgorICB2b2lkIGFuZElSRmxhZ3MoY29uc3QgVmFsdWUgKlYpOworCisgIC8vLyBNZXJnZSAyIGRlYnVnIGxvY2F0aW9ucyBhbmQgYXBwbHkgaXQgdG8gdGhlIEluc3RydWN0aW9uLiBJZiB0aGUKKyAgLy8vIGluc3RydWN0aW9uIGlzIGEgQ2FsbElucywgd2UgbmVlZCB0byB0cmF2ZXJzZSB0aGUgaW5saW5lIGNoYWluIHRvIGZpbmQKKyAgLy8vIHRoZSBjb21tb24gc2NvcGUuIFRoaXMgaXMgbm90IGVmZmljaWVudCBmb3IgTi13YXkgbWVyZ2luZyBhcyBlYWNoIHRpbWUKKyAgLy8vIHlvdSBtZXJnZSAyIGl0ZXJhdGlvbnMsIHlvdSBuZWVkIHRvIHJlYnVpbGQgdGhlIGhhc2htYXAgdG8gZmluZCB0aGUKKyAgLy8vIGNvbW1vbiBzY29wZS4gSG93ZXZlciwgd2Ugc3RpbGwgY2hvb3NlIHRoaXMgQVBJIGJlY2F1c2U6CisgIC8vLyAgMSkgU2ltcGxpY2l0eTogaXQgdGFrZXMgMiBsb2NhdGlvbnMgaW5zdGVhZCBvZiBhIGxpc3Qgb2YgbG9jYXRpb25zLgorICAvLy8gIDIpIEluIHdvcnN0IGNhc2UsIGl0IGluY3JlYXNlcyB0aGUgY29tcGxleGl0eSBmcm9tIE8oTipJKSB0bworICAvLy8gICAgIE8oMipOKkkpLCB3aGVyZSBOIGlzICMgb2YgSW5zdHJ1Y3Rpb25zIHRvIG1lcmdlLCBhbmQgSSBpcyB0aGUKKyAgLy8vICAgICBtYXhpbXVtIGxldmVsIG9mIGlubGluZSBzdGFjay4gU28gaXQgaXMgc3RpbGwgbGluZWFyLgorICAvLy8gIDMpIE1lcmdpbmcgb2YgY2FsbCBpbnN0cnVjdGlvbnMgc2hvdWxkIGJlIGV4dHJlbWVseSByYXJlIGluIHJlYWwKKyAgLy8vICAgICBhcHBsaWNhdGlvbnMsIHRodXMgdGhlIE4td2F5IG1lcmdpbmcgc2hvdWxkIGJlIGluIGNvZGUgcGF0aC4KKyAgLy8vIFRoZSBEZWJ1Z0xvYyBhdHRhY2hlZCB0byB0aGlzIGluc3RydWN0aW9uIHdpbGwgYmUgb3ZlcndyaXR0ZW4gYnkgdGhlCisgIC8vLyBtZXJnZWQgRGVidWdMb2MuCisgIHZvaWQgYXBwbHlNZXJnZWRMb2NhdGlvbihjb25zdCBESUxvY2F0aW9uICpMb2NBLCBjb25zdCBESUxvY2F0aW9uICpMb2NCKTsKKworcHJpdmF0ZToKKyAgLy8vIFJldHVybiB0cnVlIGlmIHdlIGhhdmUgYW4gZW50cnkgaW4gdGhlIG9uLXRoZS1zaWRlIG1ldGFkYXRhIGhhc2guCisgIGJvb2wgaGFzTWV0YWRhdGFIYXNoRW50cnkoKSBjb25zdCB7CisgICAgcmV0dXJuIChnZXRTdWJjbGFzc0RhdGFGcm9tVmFsdWUoKSAmIEhhc01ldGFkYXRhQml0KSAhPSAwOworICB9CisKKyAgLy8gVGhlc2UgYXJlIGFsbCBpbXBsZW1lbnRlZCBpbiBNZXRhZGF0YS5jcHAuCisgIE1ETm9kZSAqZ2V0TWV0YWRhdGFJbXBsKHVuc2lnbmVkIEtpbmRJRCkgY29uc3Q7CisgIE1ETm9kZSAqZ2V0TWV0YWRhdGFJbXBsKFN0cmluZ1JlZiBLaW5kKSBjb25zdDsKKyAgdm9pZAorICBnZXRBbGxNZXRhZGF0YUltcGwoU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjx1bnNpZ25lZCwgTUROb2RlICo+PiAmKSBjb25zdDsKKyAgdm9pZCBnZXRBbGxNZXRhZGF0YU90aGVyVGhhbkRlYnVnTG9jSW1wbCgKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8dW5zaWduZWQsIE1ETm9kZSAqPj4gJikgY29uc3Q7CisgIC8vLyBDbGVhciBhbGwgaGFzaHRhYmxlLWJhc2VkIG1ldGFkYXRhIGZyb20gdGhpcyBpbnN0cnVjdGlvbi4KKyAgdm9pZCBjbGVhck1ldGFkYXRhSGFzaEVudHJpZXMoKTsKKworcHVibGljOgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUHJlZGljYXRlcyBhbmQgaGVscGVyIG1ldGhvZHMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYXNzb2NpYXRpdmU6CisgIC8vLworICAvLy8gICBBc3NvY2lhdGl2ZSBvcGVyYXRvcnMgc2F0aXNmeTogIHggb3AgKHkgb3AgeikgPT09ICh4IG9wIHkpIG9wIHoKKyAgLy8vCisgIC8vLyBJbiBMTFZNLCB0aGUgQWRkLCBNdWwsIEFuZCwgT3IsIGFuZCBYb3Igb3BlcmF0b3JzIGFyZSBhc3NvY2lhdGl2ZS4KKyAgLy8vCisgIGJvb2wgaXNBc3NvY2lhdGl2ZSgpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisgIHN0YXRpYyBib29sIGlzQXNzb2NpYXRpdmUodW5zaWduZWQgT3Bjb2RlKSB7CisgICAgcmV0dXJuIE9wY29kZSA9PSBBbmQgfHwgT3Bjb2RlID09IE9yIHx8IE9wY29kZSA9PSBYb3IgfHwKKyAgICAgICAgICAgT3Bjb2RlID09IEFkZCB8fCBPcGNvZGUgPT0gTXVsOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbiBpcyBjb21tdXRhdGl2ZToKKyAgLy8vCisgIC8vLyAgIENvbW11dGF0aXZlIG9wZXJhdG9ycyBzYXRpc2Z5OiAoeCBvcCB5KSA9PT0gKHkgb3AgeCkKKyAgLy8vCisgIC8vLyBJbiBMTFZNLCB0aGVzZSBhcmUgdGhlIGNvbW11dGF0aXZlIG9wZXJhdG9ycywgcGx1cyBTZXRFUSBhbmQgU2V0TkUsIHdoZW4KKyAgLy8vIGFwcGxpZWQgdG8gYW55IHR5cGUuCisgIC8vLworICBib29sIGlzQ29tbXV0YXRpdmUoKSBjb25zdCB7IHJldHVybiBpc0NvbW11dGF0aXZlKGdldE9wY29kZSgpKTsgfQorICBzdGF0aWMgYm9vbCBpc0NvbW11dGF0aXZlKHVuc2lnbmVkIE9wY29kZSkgeworICAgIHN3aXRjaCAoT3Bjb2RlKSB7CisgICAgY2FzZSBBZGQ6IGNhc2UgRkFkZDoKKyAgICBjYXNlIE11bDogY2FzZSBGTXVsOgorICAgIGNhc2UgQW5kOiBjYXNlIE9yOiBjYXNlIFhvcjoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgaWRlbXBvdGVudDoKKyAgLy8vCisgIC8vLyAgIElkZW1wb3RlbnQgb3BlcmF0b3JzIHNhdGlzZnk6ICB4IG9wIHggPT09IHgKKyAgLy8vCisgIC8vLyBJbiBMTFZNLCB0aGUgQW5kIGFuZCBPciBvcGVyYXRvcnMgYXJlIGlkZW1wb3RlbnQuCisgIC8vLworICBib29sIGlzSWRlbXBvdGVudCgpIGNvbnN0IHsgcmV0dXJuIGlzSWRlbXBvdGVudChnZXRPcGNvZGUoKSk7IH0KKyAgc3RhdGljIGJvb2wgaXNJZGVtcG90ZW50KHVuc2lnbmVkIE9wY29kZSkgeworICAgIHJldHVybiBPcGNvZGUgPT0gQW5kIHx8IE9wY29kZSA9PSBPcjsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgbmlscG90ZW50OgorICAvLy8KKyAgLy8vICAgTmlscG90ZW50IG9wZXJhdG9ycyBzYXRpc2Z5OiAgeCBvcCB4ID09PSBJZCwKKyAgLy8vCisgIC8vLyAgIHdoZXJlIElkIGlzIHRoZSBpZGVudGl0eSBmb3IgdGhlIG9wZXJhdG9yLCBpLmUuIGEgY29uc3RhbnQgc3VjaCB0aGF0CisgIC8vLyAgICAgeCBvcCBJZCA9PT0geCBhbmQgSWQgb3AgeCA9PT0geCBmb3IgYWxsIHguCisgIC8vLworICAvLy8gSW4gTExWTSwgdGhlIFhvciBvcGVyYXRvciBpcyBuaWxwb3RlbnQuCisgIC8vLworICBib29sIGlzTmlscG90ZW50KCkgY29uc3QgeyByZXR1cm4gaXNOaWxwb3RlbnQoZ2V0T3Bjb2RlKCkpOyB9CisgIHN0YXRpYyBib29sIGlzTmlscG90ZW50KHVuc2lnbmVkIE9wY29kZSkgeworICAgIHJldHVybiBPcGNvZGUgPT0gWG9yOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gbWF5IG1vZGlmeSBtZW1vcnkuCisgIGJvb2wgbWF5V3JpdGVUb01lbW9yeSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIG1heSByZWFkIG1lbW9yeS4KKyAgYm9vbCBtYXlSZWFkRnJvbU1lbW9yeSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIG1heSByZWFkIG9yIHdyaXRlIG1lbW9yeS4KKyAgYm9vbCBtYXlSZWFkT3JXcml0ZU1lbW9yeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gbWF5UmVhZEZyb21NZW1vcnkoKSB8fCBtYXlXcml0ZVRvTWVtb3J5KCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBoYXMgYW4gQXRvbWljT3JkZXJpbmcgb2YgdW5vcmRlcmVkIG9yCisgIC8vLyBoaWdoZXIuCisgIGJvb2wgaXNBdG9taWMoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBhdG9taWMgaW5zdHJ1Y3Rpb24gbG9hZHMgZnJvbSBtZW1vcnkuCisgIGJvb2wgaGFzQXRvbWljTG9hZCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGF0b21pYyBpbnN0cnVjdGlvbiBzdG9yZXMgdG8gbWVtb3J5LgorICBib29sIGhhc0F0b21pY1N0b3JlKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gbWF5IHRocm93IGFuIGV4Y2VwdGlvbi4KKyAgYm9vbCBtYXlUaHJvdygpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGJlaGF2ZXMgbGlrZSBhIG1lbW9yeSBmZW5jZTogaXQgY2FuIGxvYWQKKyAgLy8vIG9yIHN0b3JlIHRvIG1lbW9yeSBsb2NhdGlvbiB3aXRob3V0IGJlaW5nIGdpdmVuIGEgbWVtb3J5IGxvY2F0aW9uLgorICBib29sIGlzRmVuY2VMaWtlKCkgY29uc3QgeworICAgIHN3aXRjaCAoZ2V0T3Bjb2RlKCkpIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIFRoaXMgbGlzdCBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGxpc3QgaW4gbWF5V3JpdGVUb01lbW9yeSBmb3IKKyAgICAvLyBhbGwgb3Bjb2RlcyB3aGljaCBkb24ndCBoYXZlIGEgbWVtb3J5IGxvY2F0aW9uLgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkZlbmNlOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkNhdGNoUGFkOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkNhdGNoUmV0OgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkNhbGw6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6SW52b2tlOgorICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBpbnN0cnVjdGlvbiBtYXkgaGF2ZSBzaWRlIGVmZmVjdHMuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgY29uc2lkZXIgbWFsbG9jIGFuZCBhbGxvY2EgdG8gaGF2ZSBzaWRlCisgIC8vLyBlZmZlY3RzIGJlY2F1c2UgdGhlIG5ld2x5IGFsbG9jYXRlZCBtZW1vcnkgaXMgY29tcGxldGVseSBpbnZpc2libGUgdG8KKyAgLy8vIGluc3RydWN0aW9ucyB3aGljaCBkb24ndCB1c2UgdGhlIHJldHVybmVkIHZhbHVlLiAgRm9yIGNhc2VzIHdoZXJlIHRoaXMKKyAgLy8vIG1hdHRlcnMsIGlzU2FmZVRvU3BlY3VsYXRpdmVseUV4ZWN1dGUgbWF5IGJlIG1vcmUgYXBwcm9wcmlhdGUuCisgIGJvb2wgbWF5SGF2ZVNpZGVFZmZlY3RzKCkgY29uc3QgeyByZXR1cm4gbWF5V3JpdGVUb01lbW9yeSgpIHx8IG1heVRocm93KCk7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGNhbiBiZSByZW1vdmVkIGlmIHRoZSByZXN1bHQgaXMgdW51c2VkLgorICAvLy8KKyAgLy8vIFdoZW4gY29uc3RhbnQgZm9sZGluZyBzb21lIGluc3RydWN0aW9ucyBjYW5ub3QgYmUgcmVtb3ZlZCBldmVuIGlmIHRoZWlyCisgIC8vLyByZXN1bHRzIGFyZSB1bnVzZWQuIFNwZWNpZmljYWxseSB0ZXJtaW5hdG9yIGluc3RydWN0aW9ucyBhbmQgY2FsbHMgdGhhdAorICAvLy8gbWF5IGhhdmUgc2lkZSBlZmZlY3RzIGNhbm5vdCBiZSByZW1vdmVkIHdpdGhvdXQgc2VtYW50aWNhbGx5IGNoYW5naW5nIHRoZQorICAvLy8gZ2VuZXJhdGVkIHByb2dyYW0uCisgIGJvb2wgaXNTYWZlVG9SZW1vdmUoKSBjb25zdDsKKyAgCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYSB2YXJpZXR5IG9mIEVILWJsb2NrLgorICBib29sIGlzRUhQYWQoKSBjb25zdCB7CisgICAgc3dpdGNoIChnZXRPcGNvZGUoKSkgeworICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkNhdGNoU3dpdGNoOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkNhdGNoUGFkOgorICAgIGNhc2UgSW5zdHJ1Y3Rpb246OkNsZWFudXBQYWQ6CisgICAgY2FzZSBJbnN0cnVjdGlvbjo6TGFuZGluZ1BhZDoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8vIENyZWF0ZSBhIGNvcHkgb2YgJ3RoaXMnIGluc3RydWN0aW9uIHRoYXQgaXMgaWRlbnRpY2FsIGluIGFsbCB3YXlzIGV4Y2VwdAorICAvLy8gdGhlIGZvbGxvd2luZzoKKyAgLy8vICAgKiBUaGUgaW5zdHJ1Y3Rpb24gaGFzIG5vIHBhcmVudAorICAvLy8gICAqIFRoZSBpbnN0cnVjdGlvbiBoYXMgbm8gbmFtZQorICAvLy8KKyAgSW5zdHJ1Y3Rpb24gKmNsb25lKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gaXMgZXhhY3RseSBpZGVudGljYWwgdG8gdGhlCisgIC8vLyBjdXJyZW50IG9uZS4gVGhpcyBtZWFucyB0aGF0IGFsbCBvcGVyYW5kcyBtYXRjaCBhbmQgYW55IGV4dHJhIGluZm9ybWF0aW9uCisgIC8vLyAoZS5nLiBsb2FkIGlzIHZvbGF0aWxlKSBhZ3JlZS4KKyAgYm9vbCBpc0lkZW50aWNhbFRvKGNvbnN0IEluc3RydWN0aW9uICpJKSBjb25zdDsKKworICAvLy8gVGhpcyBpcyBsaWtlIGlzSWRlbnRpY2FsVG8sIGV4Y2VwdCB0aGF0IGl0IGlnbm9yZXMgdGhlCisgIC8vLyBTdWJjbGFzc09wdGlvbmFsRGF0YSBmbGFncywgd2hpY2ggbWF5IHNwZWNpZnkgY29uZGl0aW9ucyB1bmRlciB3aGljaCB0aGUKKyAgLy8vIGluc3RydWN0aW9uJ3MgcmVzdWx0IGlzIHVuZGVmaW5lZC4KKyAgYm9vbCBpc0lkZW50aWNhbFRvV2hlbkRlZmluZWQoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIGNvbnN0OworCisgIC8vLyBXaGVuIGNoZWNraW5nIGZvciBvcGVyYXRpb24gZXF1aXZhbGVuY2UgKHVzaW5nIGlzU2FtZU9wZXJhdGlvbkFzKSBpdCBpcworICAvLy8gc29tZXRpbWVzIHVzZWZ1bCB0byBpZ25vcmUgY2VydGFpbiBhdHRyaWJ1dGVzLgorICBlbnVtIE9wZXJhdGlvbkVxdWl2YWxlbmNlRmxhZ3MgeworICAgIC8vLyBDaGVjayBmb3IgZXF1aXZhbGVuY2UgaWdub3JpbmcgbG9hZC9zdG9yZSBhbGlnbm1lbnQuCisgICAgQ29tcGFyZUlnbm9yaW5nQWxpZ25tZW50ID0gMTw8MCwKKyAgICAvLy8gQ2hlY2sgZm9yIGVxdWl2YWxlbmNlIHRyZWF0aW5nIGEgdHlwZSBhbmQgYSB2ZWN0b3Igb2YgdGhhdCB0eXBlCisgICAgLy8vIGFzIGVxdWl2YWxlbnQuCisgICAgQ29tcGFyZVVzaW5nU2NhbGFyVHlwZXMgPSAxPDwxCisgIH07CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIGV4ZWN1dGVzIHRoZSBzYW1lCisgIC8vLyBvcGVyYXRpb24gYXMgdGhlIGN1cnJlbnQgb25lLiBUaGlzIG1lYW5zIHRoYXQgdGhlIG9wY29kZXMsIHR5cGUsIG9wZXJhbmQKKyAgLy8vIHR5cGVzIGFuZCBhbnkgb3RoZXIgZmFjdG9ycyBhZmZlY3RpbmcgdGhlIG9wZXJhdGlvbiBtdXN0IGJlIHRoZSBzYW1lLiBUaGlzCisgIC8vLyBpcyBzaW1pbGFyIHRvIGlzSWRlbnRpY2FsVG8gZXhjZXB0IHRoZSBvcGVyYW5kcyB0aGVtc2VsdmVzIGRvbid0IGhhdmUgdG8KKyAgLy8vIGJlIGlkZW50aWNhbC4KKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBpcyB0aGUgc2FtZSBvcGVyYXRpb24gYXMKKyAgLy8vIHRoZSBjdXJyZW50IG9uZS4KKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgb25lIGluc3RydWN0aW9uIGlzIHRoZSBzYW1lIG9wZXJhdGlvbiBhcyBhbm90aGVyLgorICBib29sIGlzU2FtZU9wZXJhdGlvbkFzKGNvbnN0IEluc3RydWN0aW9uICpJLCB1bnNpZ25lZCBmbGFncyA9IDApIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBhcmUgYW55IHVzZXMgb2YgdGhpcyBpbnN0cnVjdGlvbiBpbiBibG9ja3Mgb3RoZXIgdGhhbgorICAvLy8gdGhlIHNwZWNpZmllZCBibG9jay4gTm90ZSB0aGF0IFBISSBub2RlcyBhcmUgY29uc2lkZXJlZCB0byBldmFsdWF0ZSB0aGVpcgorICAvLy8gb3BlcmFuZHMgaW4gdGhlIGNvcnJlc3BvbmRpbmcgcHJlZGVjZXNzb3IgYmxvY2suCisgIGJvb2wgaXNVc2VkT3V0c2lkZU9mQmxvY2soY29uc3QgQmFzaWNCbG9jayAqQkIpIGNvbnN0OworCisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gVi0+Z2V0VmFsdWVJRCgpID49IFZhbHVlOjpJbnN0cnVjdGlvblZhbDsKKyAgfQorCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBFeHBvcnRlZCBlbnVtZXJhdGlvbnMuCisgIC8vCisgIGVudW0gVGVybU9wcyB7ICAgICAgIC8vIFRoZXNlIHRlcm1pbmF0ZSBiYXNpYyBibG9ja3MKKyNkZWZpbmUgIEZJUlNUX1RFUk1fSU5TVChOKSAgICAgICAgICAgICBUZXJtT3BzQmVnaW4gPSBOLAorI2RlZmluZSBIQU5ETEVfVEVSTV9JTlNUKE4sIE9QQywgQ0xBU1MpIE9QQyA9IE4sCisjZGVmaW5lICAgTEFTVF9URVJNX0lOU1QoTikgICAgICAgICAgICAgVGVybU9wc0VuZCA9IE4rMQorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uZGVmIgorICB9OworCisgIGVudW0gQmluYXJ5T3BzIHsKKyNkZWZpbmUgIEZJUlNUX0JJTkFSWV9JTlNUKE4pICAgICAgICAgICAgIEJpbmFyeU9wc0JlZ2luID0gTiwKKyNkZWZpbmUgSEFORExFX0JJTkFSWV9JTlNUKE4sIE9QQywgQ0xBU1MpIE9QQyA9IE4sCisjZGVmaW5lICAgTEFTVF9CSU5BUllfSU5TVChOKSAgICAgICAgICAgICBCaW5hcnlPcHNFbmQgPSBOKzEKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmRlZiIKKyAgfTsKKworICBlbnVtIE1lbW9yeU9wcyB7CisjZGVmaW5lICBGSVJTVF9NRU1PUllfSU5TVChOKSAgICAgICAgICAgICBNZW1vcnlPcHNCZWdpbiA9IE4sCisjZGVmaW5lIEhBTkRMRV9NRU1PUllfSU5TVChOLCBPUEMsIENMQVNTKSBPUEMgPSBOLAorI2RlZmluZSAgIExBU1RfTUVNT1JZX0lOU1QoTikgICAgICAgICAgICAgTWVtb3J5T3BzRW5kID0gTisxCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5kZWYiCisgIH07CisKKyAgZW51bSBDYXN0T3BzIHsKKyNkZWZpbmUgIEZJUlNUX0NBU1RfSU5TVChOKSAgICAgICAgICAgICBDYXN0T3BzQmVnaW4gPSBOLAorI2RlZmluZSBIQU5ETEVfQ0FTVF9JTlNUKE4sIE9QQywgQ0xBU1MpIE9QQyA9IE4sCisjZGVmaW5lICAgTEFTVF9DQVNUX0lOU1QoTikgICAgICAgICAgICAgQ2FzdE9wc0VuZCA9IE4rMQorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uZGVmIgorICB9OworCisgIGVudW0gRnVuY2xldFBhZE9wcyB7CisjZGVmaW5lICBGSVJTVF9GVU5DTEVUUEFEX0lOU1QoTikgICAgICAgICAgICAgRnVuY2xldFBhZE9wc0JlZ2luID0gTiwKKyNkZWZpbmUgSEFORExFX0ZVTkNMRVRQQURfSU5TVChOLCBPUEMsIENMQVNTKSBPUEMgPSBOLAorI2RlZmluZSAgIExBU1RfRlVOQ0xFVFBBRF9JTlNUKE4pICAgICAgICAgICAgIEZ1bmNsZXRQYWRPcHNFbmQgPSBOKzEKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmRlZiIKKyAgfTsKKworICBlbnVtIE90aGVyT3BzIHsKKyNkZWZpbmUgIEZJUlNUX09USEVSX0lOU1QoTikgICAgICAgICAgICAgT3RoZXJPcHNCZWdpbiA9IE4sCisjZGVmaW5lIEhBTkRMRV9PVEhFUl9JTlNUKE4sIE9QQywgQ0xBU1MpIE9QQyA9IE4sCisjZGVmaW5lICAgTEFTVF9PVEhFUl9JTlNUKE4pICAgICAgICAgICAgIE90aGVyT3BzRW5kID0gTisxCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbi5kZWYiCisgIH07CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8SW5zdHJ1Y3Rpb24+OworCisgIC8vIFNoYWRvdyBWYWx1ZTo6c2V0VmFsdWVTdWJjbGFzc0RhdGEgd2l0aCBhIHByaXZhdGUgZm9yd2FyZGluZyBtZXRob2Qgc28gdGhhdAorICAvLyBzdWJjbGFzc2VzIGNhbm5vdCBhY2NpZGVudGFsbHkgdXNlIGl0LgorICB2b2lkIHNldFZhbHVlU3ViY2xhc3NEYXRhKHVuc2lnbmVkIHNob3J0IEQpIHsKKyAgICBWYWx1ZTo6c2V0VmFsdWVTdWJjbGFzc0RhdGEoRCk7CisgIH0KKworICB1bnNpZ25lZCBzaG9ydCBnZXRTdWJjbGFzc0RhdGFGcm9tVmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlOjpnZXRTdWJjbGFzc0RhdGFGcm9tVmFsdWUoKTsKKyAgfQorCisgIHZvaWQgc2V0SGFzTWV0YWRhdGFIYXNoRW50cnkoYm9vbCBWKSB7CisgICAgc2V0VmFsdWVTdWJjbGFzc0RhdGEoKGdldFN1YmNsYXNzRGF0YUZyb21WYWx1ZSgpICYgfkhhc01ldGFkYXRhQml0KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgKFYgPyBIYXNNZXRhZGF0YUJpdCA6IDApKTsKKyAgfQorCisgIHZvaWQgc2V0UGFyZW50KEJhc2ljQmxvY2sgKlApOworCitwcm90ZWN0ZWQ6CisgIC8vIEluc3RydWN0aW9uIHN1YmNsYXNzZXMgY2FuIHN0aWNrIHVwIHRvIDE1IGJpdHMgb2Ygc3R1ZmYgaW50byB0aGUKKyAgLy8gU3ViY2xhc3NEYXRhIGZpZWxkIG9mIGluc3RydWN0aW9uIHdpdGggdGhlc2UgbWVtYmVycy4KKworICAvLyBWZXJpZnkgdGhhdCBvbmx5IHRoZSBsb3cgMTUgYml0cyBhcmUgdXNlZC4KKyAgdm9pZCBzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSh1bnNpZ25lZCBzaG9ydCBEKSB7CisgICAgYXNzZXJ0KChEICYgSGFzTWV0YWRhdGFCaXQpID09IDAgJiYgIk91dCBvZiByYW5nZSB2YWx1ZSBwdXQgaW50byBmaWVsZCIpOworICAgIHNldFZhbHVlU3ViY2xhc3NEYXRhKChnZXRTdWJjbGFzc0RhdGFGcm9tVmFsdWUoKSAmIEhhc01ldGFkYXRhQml0KSB8IEQpOworICB9CisKKyAgdW5zaWduZWQgZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdWJjbGFzc0RhdGFGcm9tVmFsdWUoKSAmIH5IYXNNZXRhZGF0YUJpdDsKKyAgfQorCisgIEluc3RydWN0aW9uKFR5cGUgKlR5LCB1bnNpZ25lZCBpVHlwZSwgVXNlICpPcHMsIHVuc2lnbmVkIE51bU9wcywKKyAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBJbnN0cnVjdGlvbihUeXBlICpUeSwgdW5zaWduZWQgaVR5cGUsIFVzZSAqT3BzLCB1bnNpZ25lZCBOdW1PcHMsCisgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworcHJpdmF0ZToKKyAgLy8vIENyZWF0ZSBhIGNvcHkgb2YgdGhpcyBpbnN0cnVjdGlvbi4KKyAgSW5zdHJ1Y3Rpb24gKmNsb25lSW1wbCgpIGNvbnN0OworfTsKKworaW5saW5lIHZvaWQgaWxpc3RfYWxsb2NfdHJhaXRzPEluc3RydWN0aW9uPjo6ZGVsZXRlTm9kZShJbnN0cnVjdGlvbiAqVikgeworICBWLT5kZWxldGVWYWx1ZSgpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9JTlNUUlVDVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0luc3RydWN0aW9ucy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnN0cnVjdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzE1ZDVkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnN0cnVjdGlvbnMuaApAQCAtMCwwICsxLDUwNzggQEAKKy8vPT09LSBsbHZtL0luc3RydWN0aW9ucy5oIC0gSW5zdHJ1Y3Rpb24gc3ViY2xhc3MgZGVmaW5pdGlvbnMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGV4cG9zZXMgdGhlIGNsYXNzIGRlZmluaXRpb25zIG9mIGFsbCBvZiB0aGUgc3ViY2xhc3NlcyBvZiB0aGUKKy8vIEluc3RydWN0aW9uIGNsYXNzLiAgVGhpcyBpcyBtZWFudCB0byBiZSBhbiBlYXN5IHdheSB0byBnZXQgYWNjZXNzIHRvIGFsbAorLy8gaW5zdHJ1Y3Rpb24gc3ViY2xhc3Nlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfSU5TVFJVQ1RJT05TX0gKKyNkZWZpbmUgTExWTV9JUl9JTlNUUlVDVElPTlNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ob25lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NhbGxpbmdDb252LmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudC5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGVyaXZlZFR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL09wZXJhbmRUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1VzZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVXNlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQXRvbWljT3JkZXJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQVBJbnQ7CitjbGFzcyBDb25zdGFudEludDsKK2NsYXNzIERhdGFMYXlvdXQ7CitjbGFzcyBMTFZNQ29udGV4dDsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbGxvY2FJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gYW4gaW5zdHJ1Y3Rpb24gdG8gYWxsb2NhdGUgbWVtb3J5IG9uIHRoZSBzdGFjaworY2xhc3MgQWxsb2NhSW5zdCA6IHB1YmxpYyBVbmFyeUluc3RydWN0aW9uIHsKKyAgVHlwZSAqQWxsb2NhdGVkVHlwZTsKKworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgQWxsb2NhSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgQWxsb2NhSW5zdChUeXBlICpUeSwgdW5zaWduZWQgQWRkclNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpBcnJheVNpemUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBBbGxvY2FJbnN0KFR5cGUgKlR5LCB1bnNpZ25lZCBBZGRyU3BhY2UsIFZhbHVlICpBcnJheVNpemUsCisgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICBBbGxvY2FJbnN0KFR5cGUgKlR5LCB1bnNpZ25lZCBBZGRyU3BhY2UsCisgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUsIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKyAgQWxsb2NhSW5zdChUeXBlICpUeSwgdW5zaWduZWQgQWRkclNwYWNlLAorICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgQWxsb2NhSW5zdChUeXBlICpUeSwgdW5zaWduZWQgQWRkclNwYWNlLCBWYWx1ZSAqQXJyYXlTaXplLCB1bnNpZ25lZCBBbGlnbiwKKyAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisgIEFsbG9jYUluc3QoVHlwZSAqVHksIHVuc2lnbmVkIEFkZHJTcGFjZSwgVmFsdWUgKkFycmF5U2l6ZSwgdW5zaWduZWQgQWxpZ24sCisgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgYW4gYWxsb2NhdGlvbiBzaXplIHBhcmFtZXRlciB0byB0aGUgYWxsb2NhdGlvbgorICAvLy8gaW5zdHJ1Y3Rpb24gdGhhdCBpcyBub3QgMS4KKyAgYm9vbCBpc0FycmF5QWxsb2NhdGlvbigpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBhbGxvY2F0ZWQuIEZvciBhIHNpbXBsZSBhbGxvY2F0aW9uIG9mIGEgc2luZ2xlCisgIC8vLyBlbGVtZW50LCB0aGlzIHdpbGwgcmV0dXJuIGEgY29uc3RhbnQgMSB2YWx1ZS4KKyAgY29uc3QgVmFsdWUgKmdldEFycmF5U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMCk7IH0KKyAgVmFsdWUgKmdldEFycmF5U2l6ZSgpIHsgcmV0dXJuIGdldE9wZXJhbmQoMCk7IH0KKworICAvLy8gT3ZlcmxvYWQgdG8gcmV0dXJuIG1vc3Qgc3BlY2lmaWMgcG9pbnRlciB0eXBlLgorICBQb2ludGVyVHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxQb2ludGVyVHlwZT4oSW5zdHJ1Y3Rpb246OmdldFR5cGUoKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSB0eXBlIHRoYXQgaXMgYmVpbmcgYWxsb2NhdGVkIGJ5IHRoZSBpbnN0cnVjdGlvbi4KKyAgVHlwZSAqZ2V0QWxsb2NhdGVkVHlwZSgpIGNvbnN0IHsgcmV0dXJuIEFsbG9jYXRlZFR5cGU7IH0KKyAgLy8vIGZvciB1c2Ugb25seSBpbiBzcGVjaWFsIGNpcmN1bXN0YW5jZXMgdGhhdCBuZWVkIHRvIGdlbmVyaWNhbGx5CisgIC8vLyB0cmFuc2Zvcm0gYSB3aG9sZSBpbnN0cnVjdGlvbiAoZWc6IElSIGxpbmtpbmcgYW5kIHZlY3Rvcml6YXRpb24pLgorICB2b2lkIHNldEFsbG9jYXRlZFR5cGUoVHlwZSAqVHkpIHsgQWxsb2NhdGVkVHlwZSA9IFR5OyB9CisKKyAgLy8vIFJldHVybiB0aGUgYWxpZ25tZW50IG9mIHRoZSBtZW1vcnkgdGhhdCBpcyBiZWluZyBhbGxvY2F0ZWQgYnkgdGhlCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgdW5zaWduZWQgZ2V0QWxpZ25tZW50KCkgY29uc3QgeworICAgIHJldHVybiAoMXUgPDwgKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgMzEpKSA+PiAxOworICB9CisgIHZvaWQgc2V0QWxpZ25tZW50KHVuc2lnbmVkIEFsaWduKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBhbGxvY2EgaXMgaW4gdGhlIGVudHJ5IGJsb2NrIG9mIHRoZSBmdW5jdGlvbiBhbmQgaXMgYQorICAvLy8gY29uc3RhbnQgc2l6ZS4gSWYgc28sIHRoZSBjb2RlIGdlbmVyYXRvciB3aWxsIGZvbGQgaXQgaW50byB0aGUKKyAgLy8vIHByb2xvZy9lcGlsb2cgY29kZSwgc28gaXQgaXMgYmFzaWNhbGx5IGZyZWUuCisgIGJvb2wgaXNTdGF0aWNBbGxvY2EoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBhbGxvY2EgaXMgdXNlZCBhcyBhbiBpbmFsbG9jYSBhcmd1bWVudCB0byBhIGNhbGwuIFN1Y2gKKyAgLy8vIGFsbG9jYXMgYXJlIG5ldmVyIGNvbnNpZGVyZWQgc3RhdGljIGV2ZW4gaWYgdGhleSBhcmUgaW4gdGhlIGVudHJ5IGJsb2NrLgorICBib29sIGlzVXNlZFdpdGhJbkFsbG9jYSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiAzMjsKKyAgfQorCisgIC8vLyBTcGVjaWZ5IHdoZXRoZXIgdGhpcyBhbGxvY2EgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGFyZ3VtZW50cyB0byBhIGNhbGwuCisgIHZvaWQgc2V0VXNlZFdpdGhJbkFsbG9jYShib29sIFYpIHsKKyAgICBzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSgoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiB+MzIpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoViA/IDMyIDogMCkpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgYWxsb2NhIGlzIHVzZWQgYXMgYSBzd2lmdGVycm9yIGFyZ3VtZW50IHRvIGEgY2FsbC4KKyAgYm9vbCBpc1N3aWZ0RXJyb3IoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgNjQ7CisgIH0KKworICAvLy8gU3BlY2lmeSB3aGV0aGVyIHRoaXMgYWxsb2NhIGlzIHVzZWQgdG8gcmVwcmVzZW50IGEgc3dpZnRlcnJvci4KKyAgdm9pZCBzZXRTd2lmdEVycm9yKGJvb2wgVikgeworICAgIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIH42NCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWID8gNjQgOiAwKSk7CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIChJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QWxsb2NhKTsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8gU2hhZG93IEluc3RydWN0aW9uOjpzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSB3aXRoIGEgcHJpdmF0ZSBmb3J3YXJkaW5nCisgIC8vIG1ldGhvZCBzbyB0aGF0IHN1YmNsYXNzZXMgY2Fubm90IGFjY2lkZW50YWxseSB1c2UgaXQuCisgIHZvaWQgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEodW5zaWduZWQgc2hvcnQgRCkgeworICAgIEluc3RydWN0aW9uOjpzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YShEKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb2FkSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEFuIGluc3RydWN0aW9uIGZvciByZWFkaW5nIGZyb20gbWVtb3J5LiBUaGlzIHVzZXMgdGhlIFN1YmNsYXNzRGF0YSBmaWVsZCBpbgorLy8vIFZhbHVlIHRvIHN0b3JlIHdoZXRoZXIgb3Igbm90IHRoZSBsb2FkIGlzIHZvbGF0aWxlLgorY2xhc3MgTG9hZEluc3QgOiBwdWJsaWMgVW5hcnlJbnN0cnVjdGlvbiB7CisgIHZvaWQgQXNzZXJ0T0soKTsKKworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgTG9hZEluc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIExvYWRJbnN0KFZhbHVlICpQdHIsIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKyAgTG9hZEluc3QoVmFsdWUgKlB0ciwgY29uc3QgVHdpbmUgJk5hbWVTdHIsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKyAgTG9hZEluc3QoVHlwZSAqVHksIFZhbHVlICpQdHIsIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBib29sIGlzVm9sYXRpbGUgPSBmYWxzZSwKKyAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBMb2FkSW5zdChWYWx1ZSAqUHRyLCBjb25zdCBUd2luZSAmTmFtZVN0ciwgYm9vbCBpc1ZvbGF0aWxlID0gZmFsc2UsCisgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKQorICAgICAgOiBMb2FkSW5zdChjYXN0PFBvaW50ZXJUeXBlPihQdHItPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCksIFB0ciwKKyAgICAgICAgICAgICAgICAgTmFtZVN0ciwgaXNWb2xhdGlsZSwgSW5zZXJ0QmVmb3JlKSB7fQorICBMb2FkSW5zdChWYWx1ZSAqUHRyLCBjb25zdCBUd2luZSAmTmFtZVN0ciwgYm9vbCBpc1ZvbGF0aWxlLAorICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisgIExvYWRJbnN0KFZhbHVlICpQdHIsIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBib29sIGlzVm9sYXRpbGUsIHVuc2lnbmVkIEFsaWduLAorICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikKKyAgICAgIDogTG9hZEluc3QoY2FzdDxQb2ludGVyVHlwZT4oUHRyLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpLCBQdHIsCisgICAgICAgICAgICAgICAgIE5hbWVTdHIsIGlzVm9sYXRpbGUsIEFsaWduLCBJbnNlcnRCZWZvcmUpIHt9CisgIExvYWRJbnN0KFR5cGUgKlR5LCBWYWx1ZSAqUHRyLCBjb25zdCBUd2luZSAmTmFtZVN0ciwgYm9vbCBpc1ZvbGF0aWxlLAorICAgICAgICAgICB1bnNpZ25lZCBBbGlnbiwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBMb2FkSW5zdChWYWx1ZSAqUHRyLCBjb25zdCBUd2luZSAmTmFtZVN0ciwgYm9vbCBpc1ZvbGF0aWxlLAorICAgICAgICAgICB1bnNpZ25lZCBBbGlnbiwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworICBMb2FkSW5zdChWYWx1ZSAqUHRyLCBjb25zdCBUd2luZSAmTmFtZVN0ciwgYm9vbCBpc1ZvbGF0aWxlLCB1bnNpZ25lZCBBbGlnbiwKKyAgICAgICAgICAgQXRvbWljT3JkZXJpbmcgT3JkZXIsIFN5bmNTY29wZTo6SUQgU1NJRCA9IFN5bmNTY29wZTo6U3lzdGVtLAorICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikKKyAgICAgIDogTG9hZEluc3QoY2FzdDxQb2ludGVyVHlwZT4oUHRyLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpLCBQdHIsCisgICAgICAgICAgICAgICAgIE5hbWVTdHIsIGlzVm9sYXRpbGUsIEFsaWduLCBPcmRlciwgU1NJRCwgSW5zZXJ0QmVmb3JlKSB7fQorICBMb2FkSW5zdChUeXBlICpUeSwgVmFsdWUgKlB0ciwgY29uc3QgVHdpbmUgJk5hbWVTdHIsIGJvb2wgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgdW5zaWduZWQgQWxpZ24sIEF0b21pY09yZGVyaW5nIE9yZGVyLAorICAgICAgICAgICBTeW5jU2NvcGU6OklEIFNTSUQgPSBTeW5jU2NvcGU6OlN5c3RlbSwKKyAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBMb2FkSW5zdChWYWx1ZSAqUHRyLCBjb25zdCBUd2luZSAmTmFtZVN0ciwgYm9vbCBpc1ZvbGF0aWxlLAorICAgICAgICAgICB1bnNpZ25lZCBBbGlnbiwgQXRvbWljT3JkZXJpbmcgT3JkZXIsIFN5bmNTY29wZTo6SUQgU1NJRCwKKyAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworICBMb2FkSW5zdChWYWx1ZSAqUHRyLCBjb25zdCBjaGFyICpOYW1lU3RyLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKyAgTG9hZEluc3QoVmFsdWUgKlB0ciwgY29uc3QgY2hhciAqTmFtZVN0ciwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworICBMb2FkSW5zdChUeXBlICpUeSwgVmFsdWUgKlB0ciwgY29uc3QgY2hhciAqTmFtZVN0ciA9IG51bGxwdHIsCisgICAgICAgICAgIGJvb2wgaXNWb2xhdGlsZSA9IGZhbHNlLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisgIGV4cGxpY2l0IExvYWRJbnN0KFZhbHVlICpQdHIsIGNvbnN0IGNoYXIgKk5hbWVTdHIgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICBib29sIGlzVm9sYXRpbGUgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpCisgICAgICA6IExvYWRJbnN0KGNhc3Q8UG9pbnRlclR5cGU+KFB0ci0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSwgUHRyLAorICAgICAgICAgICAgICAgICBOYW1lU3RyLCBpc1ZvbGF0aWxlLCBJbnNlcnRCZWZvcmUpIHt9CisgIExvYWRJbnN0KFZhbHVlICpQdHIsIGNvbnN0IGNoYXIgKk5hbWVTdHIsIGJvb2wgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgbG9hZCBmcm9tIGEgdm9sYXRpbGUgbWVtb3J5IGxvY2F0aW9uLgorICBib29sIGlzVm9sYXRpbGUoKSBjb25zdCB7IHJldHVybiBnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIDE7IH0KKworICAvLy8gU3BlY2lmeSB3aGV0aGVyIHRoaXMgaXMgYSB2b2xhdGlsZSBsb2FkIG9yIG5vdC4KKyAgdm9pZCBzZXRWb2xhdGlsZShib29sIFYpIHsKKyAgICBzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSgoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiB+MSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWID8gMSA6IDApKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGFsaWdubWVudCBvZiB0aGUgYWNjZXNzIHRoYXQgaXMgYmVpbmcgcGVyZm9ybWVkLgorICB1bnNpZ25lZCBnZXRBbGlnbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuICgxIDw8ICgoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgPj4gMSkgJiAzMSkpID4+IDE7CisgIH0KKworICB2b2lkIHNldEFsaWdubWVudCh1bnNpZ25lZCBBbGlnbik7CisKKyAgLy8vIFJldHVybnMgdGhlIG9yZGVyaW5nIGNvbnN0cmFpbnQgb2YgdGhpcyBsb2FkIGluc3RydWN0aW9uLgorICBBdG9taWNPcmRlcmluZyBnZXRPcmRlcmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gQXRvbWljT3JkZXJpbmcoKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpID4+IDcpICYgNyk7CisgIH0KKworICAvLy8gU2V0cyB0aGUgb3JkZXJpbmcgY29uc3RyYWludCBvZiB0aGlzIGxvYWQgaW5zdHJ1Y3Rpb24uICBNYXkgbm90IGJlIFJlbGVhc2UKKyAgLy8vIG9yIEFjcXVpcmVSZWxlYXNlLgorICB2b2lkIHNldE9yZGVyaW5nKEF0b21pY09yZGVyaW5nIE9yZGVyaW5nKSB7CisgICAgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgfig3IDw8IDcpKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClPcmRlcmluZyA8PCA3KSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgc3luY2hyb25pemF0aW9uIHNjb3BlIElEIG9mIHRoaXMgbG9hZCBpbnN0cnVjdGlvbi4KKyAgU3luY1Njb3BlOjpJRCBnZXRTeW5jU2NvcGVJRCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU1NJRDsKKyAgfQorCisgIC8vLyBTZXRzIHRoZSBzeW5jaHJvbml6YXRpb24gc2NvcGUgSUQgb2YgdGhpcyBsb2FkIGluc3RydWN0aW9uLgorICB2b2lkIHNldFN5bmNTY29wZUlEKFN5bmNTY29wZTo6SUQgU1NJRCkgeworICAgIHRoaXMtPlNTSUQgPSBTU0lEOworICB9CisKKyAgLy8vIFNldHMgdGhlIG9yZGVyaW5nIGNvbnN0cmFpbnQgYW5kIHRoZSBzeW5jaHJvbml6YXRpb24gc2NvcGUgSUQgb2YgdGhpcyBsb2FkCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgdm9pZCBzZXRBdG9taWMoQXRvbWljT3JkZXJpbmcgT3JkZXJpbmcsCisgICAgICAgICAgICAgICAgIFN5bmNTY29wZTo6SUQgU1NJRCA9IFN5bmNTY29wZTo6U3lzdGVtKSB7CisgICAgc2V0T3JkZXJpbmcoT3JkZXJpbmcpOworICAgIHNldFN5bmNTY29wZUlEKFNTSUQpOworICB9CisKKyAgYm9vbCBpc1NpbXBsZSgpIGNvbnN0IHsgcmV0dXJuICFpc0F0b21pYygpICYmICFpc1ZvbGF0aWxlKCk7IH0KKworICBib29sIGlzVW5vcmRlcmVkKCkgY29uc3QgeworICAgIHJldHVybiAoZ2V0T3JkZXJpbmcoKSA9PSBBdG9taWNPcmRlcmluZzo6Tm90QXRvbWljIHx8CisgICAgICAgICAgICBnZXRPcmRlcmluZygpID09IEF0b21pY09yZGVyaW5nOjpVbm9yZGVyZWQpICYmCisgICAgICAgICAgICFpc1ZvbGF0aWxlKCk7CisgIH0KKworICBWYWx1ZSAqZ2V0UG9pbnRlck9wZXJhbmQoKSB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisgIGNvbnN0IFZhbHVlICpnZXRQb2ludGVyT3BlcmFuZCgpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMCk7IH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldFBvaW50ZXJPcGVyYW5kSW5kZXgoKSB7IHJldHVybiAwVTsgfQorICBUeXBlICpnZXRQb2ludGVyT3BlcmFuZFR5cGUoKSBjb25zdCB7IHJldHVybiBnZXRQb2ludGVyT3BlcmFuZCgpLT5nZXRUeXBlKCk7IH0KKworICAvLy8gUmV0dXJucyB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgcG9pbnRlciBvcGVyYW5kLgorICB1bnNpZ25lZCBnZXRQb2ludGVyQWRkcmVzc1NwYWNlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQb2ludGVyT3BlcmFuZFR5cGUoKS0+Z2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpOworICB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6TG9hZDsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8gU2hhZG93IEluc3RydWN0aW9uOjpzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSB3aXRoIGEgcHJpdmF0ZSBmb3J3YXJkaW5nCisgIC8vIG1ldGhvZCBzbyB0aGF0IHN1YmNsYXNzZXMgY2Fubm90IGFjY2lkZW50YWxseSB1c2UgaXQuCisgIHZvaWQgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEodW5zaWduZWQgc2hvcnQgRCkgeworICAgIEluc3RydWN0aW9uOjpzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YShEKTsKKyAgfQorCisgIC8vLyBUaGUgc3luY2hyb25pemF0aW9uIHNjb3BlIElEIG9mIHRoaXMgbG9hZCBpbnN0cnVjdGlvbi4gIE5vdCBxdWl0ZSBlbm91Z2gKKyAgLy8vIHJvb20gaW4gU3ViQ2xhc3NEYXRhIGZvciBldmVyeXRoaW5nLCBzbyBzeW5jaHJvbml6YXRpb24gc2NvcGUgSUQgZ2V0cyBpdHMKKyAgLy8vIG93biBmaWVsZC4KKyAgU3luY1Njb3BlOjpJRCBTU0lEOworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yZUluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBBbiBpbnN0cnVjdGlvbiBmb3Igc3RvcmluZyB0byBtZW1vcnkuCitjbGFzcyBTdG9yZUluc3QgOiBwdWJsaWMgSW5zdHJ1Y3Rpb24geworICB2b2lkIEFzc2VydE9LKCk7CisKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIFN0b3JlSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgU3RvcmVJbnN0KFZhbHVlICpWYWwsIFZhbHVlICpQdHIsIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpOworICBTdG9yZUluc3QoVmFsdWUgKlZhbCwgVmFsdWUgKlB0ciwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworICBTdG9yZUluc3QoVmFsdWUgKlZhbCwgVmFsdWUgKlB0ciwgYm9vbCBpc1ZvbGF0aWxlID0gZmFsc2UsCisgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisgIFN0b3JlSW5zdChWYWx1ZSAqVmFsLCBWYWx1ZSAqUHRyLCBib29sIGlzVm9sYXRpbGUsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKyAgU3RvcmVJbnN0KFZhbHVlICpWYWwsIFZhbHVlICpQdHIsIGJvb2wgaXNWb2xhdGlsZSwKKyAgICAgICAgICAgIHVuc2lnbmVkIEFsaWduLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisgIFN0b3JlSW5zdChWYWx1ZSAqVmFsLCBWYWx1ZSAqUHRyLCBib29sIGlzVm9sYXRpbGUsCisgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbiwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworICBTdG9yZUluc3QoVmFsdWUgKlZhbCwgVmFsdWUgKlB0ciwgYm9vbCBpc1ZvbGF0aWxlLAorICAgICAgICAgICAgdW5zaWduZWQgQWxpZ24sIEF0b21pY09yZGVyaW5nIE9yZGVyLAorICAgICAgICAgICAgU3luY1Njb3BlOjpJRCBTU0lEID0gU3luY1Njb3BlOjpTeXN0ZW0sCisgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisgIFN0b3JlSW5zdChWYWx1ZSAqVmFsLCBWYWx1ZSAqUHRyLCBib29sIGlzVm9sYXRpbGUsCisgICAgICAgICAgICB1bnNpZ25lZCBBbGlnbiwgQXRvbWljT3JkZXJpbmcgT3JkZXIsIFN5bmNTY29wZTo6SUQgU1NJRCwKKyAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSB0d28gb3BlcmFuZHMKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSB7CisgICAgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzLCAyKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgc3RvcmUgdG8gYSB2b2xhdGlsZSBtZW1vcnkgbG9jYXRpb24uCisgIGJvb2wgaXNWb2xhdGlsZSgpIGNvbnN0IHsgcmV0dXJuIGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgMTsgfQorCisgIC8vLyBTcGVjaWZ5IHdoZXRoZXIgdGhpcyBpcyBhIHZvbGF0aWxlIHN0b3JlIG9yIG5vdC4KKyAgdm9pZCBzZXRWb2xhdGlsZShib29sIFYpIHsKKyAgICBzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSgoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiB+MSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChWID8gMSA6IDApKTsKKyAgfQorCisgIC8vLyBUcmFuc3BhcmVudGx5IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgZ2V0T3BlcmFuZCBtZXRob2RzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICAvLy8gUmV0dXJuIHRoZSBhbGlnbm1lbnQgb2YgdGhlIGFjY2VzcyB0aGF0IGlzIGJlaW5nIHBlcmZvcm1lZAorICB1bnNpZ25lZCBnZXRBbGlnbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuICgxIDw8ICgoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgPj4gMSkgJiAzMSkpID4+IDE7CisgIH0KKworICB2b2lkIHNldEFsaWdubWVudCh1bnNpZ25lZCBBbGlnbik7CisKKyAgLy8vIFJldHVybnMgdGhlIG9yZGVyaW5nIGNvbnN0cmFpbnQgb2YgdGhpcyBzdG9yZSBpbnN0cnVjdGlvbi4KKyAgQXRvbWljT3JkZXJpbmcgZ2V0T3JkZXJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIEF0b21pY09yZGVyaW5nKChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSA+PiA3KSAmIDcpOworICB9CisKKyAgLy8vIFNldHMgdGhlIG9yZGVyaW5nIGNvbnN0cmFpbnQgb2YgdGhpcyBzdG9yZSBpbnN0cnVjdGlvbi4gIE1heSBub3QgYmUKKyAgLy8vIEFjcXVpcmUgb3IgQWNxdWlyZVJlbGVhc2UuCisgIHZvaWQgc2V0T3JkZXJpbmcoQXRvbWljT3JkZXJpbmcgT3JkZXJpbmcpIHsKKyAgICBzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSgoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiB+KDcgPDwgNykpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKU9yZGVyaW5nIDw8IDcpKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBzeW5jaHJvbml6YXRpb24gc2NvcGUgSUQgb2YgdGhpcyBzdG9yZSBpbnN0cnVjdGlvbi4KKyAgU3luY1Njb3BlOjpJRCBnZXRTeW5jU2NvcGVJRCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU1NJRDsKKyAgfQorCisgIC8vLyBTZXRzIHRoZSBzeW5jaHJvbml6YXRpb24gc2NvcGUgSUQgb2YgdGhpcyBzdG9yZSBpbnN0cnVjdGlvbi4KKyAgdm9pZCBzZXRTeW5jU2NvcGVJRChTeW5jU2NvcGU6OklEIFNTSUQpIHsKKyAgICB0aGlzLT5TU0lEID0gU1NJRDsKKyAgfQorCisgIC8vLyBTZXRzIHRoZSBvcmRlcmluZyBjb25zdHJhaW50IGFuZCB0aGUgc3luY2hyb25pemF0aW9uIHNjb3BlIElEIG9mIHRoaXMKKyAgLy8vIHN0b3JlIGluc3RydWN0aW9uLgorICB2b2lkIHNldEF0b21pYyhBdG9taWNPcmRlcmluZyBPcmRlcmluZywKKyAgICAgICAgICAgICAgICAgU3luY1Njb3BlOjpJRCBTU0lEID0gU3luY1Njb3BlOjpTeXN0ZW0pIHsKKyAgICBzZXRPcmRlcmluZyhPcmRlcmluZyk7CisgICAgc2V0U3luY1Njb3BlSUQoU1NJRCk7CisgIH0KKworICBib29sIGlzU2ltcGxlKCkgY29uc3QgeyByZXR1cm4gIWlzQXRvbWljKCkgJiYgIWlzVm9sYXRpbGUoKTsgfQorCisgIGJvb2wgaXNVbm9yZGVyZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIChnZXRPcmRlcmluZygpID09IEF0b21pY09yZGVyaW5nOjpOb3RBdG9taWMgfHwKKyAgICAgICAgICAgIGdldE9yZGVyaW5nKCkgPT0gQXRvbWljT3JkZXJpbmc6OlVub3JkZXJlZCkgJiYKKyAgICAgICAgICAgIWlzVm9sYXRpbGUoKTsKKyAgfQorCisgIFZhbHVlICpnZXRWYWx1ZU9wZXJhbmQoKSB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisgIGNvbnN0IFZhbHVlICpnZXRWYWx1ZU9wZXJhbmQoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisKKyAgVmFsdWUgKmdldFBvaW50ZXJPcGVyYW5kKCkgeyByZXR1cm4gZ2V0T3BlcmFuZCgxKTsgfQorICBjb25zdCBWYWx1ZSAqZ2V0UG9pbnRlck9wZXJhbmQoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDEpOyB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRQb2ludGVyT3BlcmFuZEluZGV4KCkgeyByZXR1cm4gMVU7IH0KKyAgVHlwZSAqZ2V0UG9pbnRlck9wZXJhbmRUeXBlKCkgY29uc3QgeyByZXR1cm4gZ2V0UG9pbnRlck9wZXJhbmQoKS0+Z2V0VHlwZSgpOyB9CisKKyAgLy8vIFJldHVybnMgdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIHBvaW50ZXIgb3BlcmFuZC4KKyAgdW5zaWduZWQgZ2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UG9pbnRlck9wZXJhbmRUeXBlKCktPmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKTsKKyAgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlN0b3JlOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorCitwcml2YXRlOgorICAvLyBTaGFkb3cgSW5zdHJ1Y3Rpb246OnNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhIHdpdGggYSBwcml2YXRlIGZvcndhcmRpbmcKKyAgLy8gbWV0aG9kIHNvIHRoYXQgc3ViY2xhc3NlcyBjYW5ub3QgYWNjaWRlbnRhbGx5IHVzZSBpdC4KKyAgdm9pZCBzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSh1bnNpZ25lZCBzaG9ydCBEKSB7CisgICAgSW5zdHJ1Y3Rpb246OnNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKEQpOworICB9CisKKyAgLy8vIFRoZSBzeW5jaHJvbml6YXRpb24gc2NvcGUgSUQgb2YgdGhpcyBzdG9yZSBpbnN0cnVjdGlvbi4gIE5vdCBxdWl0ZSBlbm91Z2gKKyAgLy8vIHJvb20gaW4gU3ViQ2xhc3NEYXRhIGZvciBldmVyeXRoaW5nLCBzbyBzeW5jaHJvbml6YXRpb24gc2NvcGUgSUQgZ2V0cyBpdHMKKyAgLy8vIG93biBmaWVsZC4KKyAgU3luY1Njb3BlOjpJRCBTU0lEOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPFN0b3JlSW5zdD4gOiBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPFN0b3JlSW5zdCwgMj4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFN0b3JlSW5zdCwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmVuY2VJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQW4gaW5zdHJ1Y3Rpb24gZm9yIG9yZGVyaW5nIG90aGVyIG1lbW9yeSBvcGVyYXRpb25zLgorY2xhc3MgRmVuY2VJbnN0IDogcHVibGljIEluc3RydWN0aW9uIHsKKyAgdm9pZCBJbml0KEF0b21pY09yZGVyaW5nIE9yZGVyaW5nLCBTeW5jU2NvcGU6OklEIFNTSUQpOworCitwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICBGZW5jZUluc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIC8vIE9yZGVyaW5nIG1heSBvbmx5IGJlIEFjcXVpcmUsIFJlbGVhc2UsIEFjcXVpcmVSZWxlYXNlLCBvcgorICAvLyBTZXF1ZW50aWFsbHlDb25zaXN0ZW50LgorICBGZW5jZUluc3QoTExWTUNvbnRleHQgJkMsIEF0b21pY09yZGVyaW5nIE9yZGVyaW5nLAorICAgICAgICAgICAgU3luY1Njb3BlOjpJRCBTU0lEID0gU3luY1Njb3BlOjpTeXN0ZW0sCisgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisgIEZlbmNlSW5zdChMTFZNQ29udGV4dCAmQywgQXRvbWljT3JkZXJpbmcgT3JkZXJpbmcsIFN5bmNTY29wZTo6SUQgU1NJRCwKKyAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSB6ZXJvIG9wZXJhbmRzCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeworICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgb3JkZXJpbmcgY29uc3RyYWludCBvZiB0aGlzIGZlbmNlIGluc3RydWN0aW9uLgorICBBdG9taWNPcmRlcmluZyBnZXRPcmRlcmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gQXRvbWljT3JkZXJpbmcoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgPj4gMSk7CisgIH0KKworICAvLy8gU2V0cyB0aGUgb3JkZXJpbmcgY29uc3RyYWludCBvZiB0aGlzIGZlbmNlIGluc3RydWN0aW9uLiAgTWF5IG9ubHkgYmUKKyAgLy8vIEFjcXVpcmUsIFJlbGVhc2UsIEFjcXVpcmVSZWxlYXNlLCBvciBTZXF1ZW50aWFsbHlDb25zaXN0ZW50LgorICB2b2lkIHNldE9yZGVyaW5nKEF0b21pY09yZGVyaW5nIE9yZGVyaW5nKSB7CisgICAgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgMSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQpT3JkZXJpbmcgPDwgMSkpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHN5bmNocm9uaXphdGlvbiBzY29wZSBJRCBvZiB0aGlzIGZlbmNlIGluc3RydWN0aW9uLgorICBTeW5jU2NvcGU6OklEIGdldFN5bmNTY29wZUlEKCkgY29uc3QgeworICAgIHJldHVybiBTU0lEOworICB9CisKKyAgLy8vIFNldHMgdGhlIHN5bmNocm9uaXphdGlvbiBzY29wZSBJRCBvZiB0aGlzIGZlbmNlIGluc3RydWN0aW9uLgorICB2b2lkIHNldFN5bmNTY29wZUlEKFN5bmNTY29wZTo6SUQgU1NJRCkgeworICAgIHRoaXMtPlNTSUQgPSBTU0lEOworICB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RmVuY2U7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9CisKK3ByaXZhdGU6CisgIC8vIFNoYWRvdyBJbnN0cnVjdGlvbjo6c2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEgd2l0aCBhIHByaXZhdGUgZm9yd2FyZGluZworICAvLyBtZXRob2Qgc28gdGhhdCBzdWJjbGFzc2VzIGNhbm5vdCBhY2NpZGVudGFsbHkgdXNlIGl0LgorICB2b2lkIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKHVuc2lnbmVkIHNob3J0IEQpIHsKKyAgICBJbnN0cnVjdGlvbjo6c2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoRCk7CisgIH0KKworICAvLy8gVGhlIHN5bmNocm9uaXphdGlvbiBzY29wZSBJRCBvZiB0aGlzIGZlbmNlIGluc3RydWN0aW9uLiAgTm90IHF1aXRlIGVub3VnaAorICAvLy8gcm9vbSBpbiBTdWJDbGFzc0RhdGEgZm9yIGV2ZXJ5dGhpbmcsIHNvIHN5bmNocm9uaXphdGlvbiBzY29wZSBJRCBnZXRzIGl0cworICAvLy8gb3duIGZpZWxkLgorICBTeW5jU2NvcGU6OklEIFNTSUQ7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY0NtcFhjaGdJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gYW4gaW5zdHJ1Y3Rpb24gdGhhdCBhdG9taWNhbGx5IGNoZWNrcyB3aGV0aGVyIGEKKy8vLyBzcGVjaWZpZWQgdmFsdWUgaXMgaW4gYSBtZW1vcnkgbG9jYXRpb24sIGFuZCwgaWYgaXQgaXMsIHN0b3JlcyBhIG5ldyB2YWx1ZQorLy8vIHRoZXJlLiAgUmV0dXJucyB0aGUgdmFsdWUgdGhhdCB3YXMgbG9hZGVkLgorLy8vCitjbGFzcyBBdG9taWNDbXBYY2hnSW5zdCA6IHB1YmxpYyBJbnN0cnVjdGlvbiB7CisgIHZvaWQgSW5pdChWYWx1ZSAqUHRyLCBWYWx1ZSAqQ21wLCBWYWx1ZSAqTmV3VmFsLAorICAgICAgICAgICAgQXRvbWljT3JkZXJpbmcgU3VjY2Vzc09yZGVyaW5nLCBBdG9taWNPcmRlcmluZyBGYWlsdXJlT3JkZXJpbmcsCisgICAgICAgICAgICBTeW5jU2NvcGU6OklEIFNTSUQpOworCitwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICBBdG9taWNDbXBYY2hnSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgQXRvbWljQ21wWGNoZ0luc3QoVmFsdWUgKlB0ciwgVmFsdWUgKkNtcCwgVmFsdWUgKk5ld1ZhbCwKKyAgICAgICAgICAgICAgICAgICAgQXRvbWljT3JkZXJpbmcgU3VjY2Vzc09yZGVyaW5nLAorICAgICAgICAgICAgICAgICAgICBBdG9taWNPcmRlcmluZyBGYWlsdXJlT3JkZXJpbmcsCisgICAgICAgICAgICAgICAgICAgIFN5bmNTY29wZTo6SUQgU1NJRCwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBBdG9taWNDbXBYY2hnSW5zdChWYWx1ZSAqUHRyLCBWYWx1ZSAqQ21wLCBWYWx1ZSAqTmV3VmFsLAorICAgICAgICAgICAgICAgICAgICBBdG9taWNPcmRlcmluZyBTdWNjZXNzT3JkZXJpbmcsCisgICAgICAgICAgICAgICAgICAgIEF0b21pY09yZGVyaW5nIEZhaWx1cmVPcmRlcmluZywKKyAgICAgICAgICAgICAgICAgICAgU3luY1Njb3BlOjpJRCBTU0lELCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgdGhyZWUgb3BlcmFuZHMKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSB7CisgICAgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzLCAzKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgY21weGNoZyBmcm9tIGEgdm9sYXRpbGUgbWVtb3J5CisgIC8vLyBsb2NhdGlvbi4KKyAgLy8vCisgIGJvb2wgaXNWb2xhdGlsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiAxOworICB9CisKKyAgLy8vIFNwZWNpZnkgd2hldGhlciB0aGlzIGlzIGEgdm9sYXRpbGUgY21weGNoZy4KKyAgLy8vCisgIHZvaWQgc2V0Vm9sYXRpbGUoYm9vbCBWKSB7CisgICAgIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIH4xKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClWKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGNtcHhjaGcgbWF5IHNwdXJpb3VzbHkgZmFpbC4KKyAgYm9vbCBpc1dlYWsoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgMHgxMDA7CisgIH0KKworICB2b2lkIHNldFdlYWsoYm9vbCBJc1dlYWspIHsKKyAgICBzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSgoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiB+MHgxMDApIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSXNXZWFrIDw8IDgpKTsKKyAgfQorCisgIC8vLyBUcmFuc3BhcmVudGx5IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgZ2V0T3BlcmFuZCBtZXRob2RzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICAvLy8gUmV0dXJucyB0aGUgc3VjY2VzcyBvcmRlcmluZyBjb25zdHJhaW50IG9mIHRoaXMgY21weGNoZyBpbnN0cnVjdGlvbi4KKyAgQXRvbWljT3JkZXJpbmcgZ2V0U3VjY2Vzc09yZGVyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBBdG9taWNPcmRlcmluZygoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgPj4gMikgJiA3KTsKKyAgfQorCisgIC8vLyBTZXRzIHRoZSBzdWNjZXNzIG9yZGVyaW5nIGNvbnN0cmFpbnQgb2YgdGhpcyBjbXB4Y2hnIGluc3RydWN0aW9uLgorICB2b2lkIHNldFN1Y2Nlc3NPcmRlcmluZyhBdG9taWNPcmRlcmluZyBPcmRlcmluZykgeworICAgIGFzc2VydChPcmRlcmluZyAhPSBBdG9taWNPcmRlcmluZzo6Tm90QXRvbWljICYmCisgICAgICAgICAgICJDbXBYY2hnIGluc3RydWN0aW9ucyBjYW4gb25seSBiZSBhdG9taWMuIik7CisgICAgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgfjB4MWMpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKHVuc2lnbmVkKU9yZGVyaW5nIDw8IDIpKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBmYWlsdXJlIG9yZGVyaW5nIGNvbnN0cmFpbnQgb2YgdGhpcyBjbXB4Y2hnIGluc3RydWN0aW9uLgorICBBdG9taWNPcmRlcmluZyBnZXRGYWlsdXJlT3JkZXJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIEF0b21pY09yZGVyaW5nKChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSA+PiA1KSAmIDcpOworICB9CisKKyAgLy8vIFNldHMgdGhlIGZhaWx1cmUgb3JkZXJpbmcgY29uc3RyYWludCBvZiB0aGlzIGNtcHhjaGcgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgc2V0RmFpbHVyZU9yZGVyaW5nKEF0b21pY09yZGVyaW5nIE9yZGVyaW5nKSB7CisgICAgYXNzZXJ0KE9yZGVyaW5nICE9IEF0b21pY09yZGVyaW5nOjpOb3RBdG9taWMgJiYKKyAgICAgICAgICAgIkNtcFhjaGcgaW5zdHJ1Y3Rpb25zIGNhbiBvbmx5IGJlIGF0b21pYy4iKTsKKyAgICBzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSgoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiB+MHhlMCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgodW5zaWduZWQpT3JkZXJpbmcgPDwgNSkpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHN5bmNocm9uaXphdGlvbiBzY29wZSBJRCBvZiB0aGlzIGNtcHhjaGcgaW5zdHJ1Y3Rpb24uCisgIFN5bmNTY29wZTo6SUQgZ2V0U3luY1Njb3BlSUQoKSBjb25zdCB7CisgICAgcmV0dXJuIFNTSUQ7CisgIH0KKworICAvLy8gU2V0cyB0aGUgc3luY2hyb25pemF0aW9uIHNjb3BlIElEIG9mIHRoaXMgY21weGNoZyBpbnN0cnVjdGlvbi4KKyAgdm9pZCBzZXRTeW5jU2NvcGVJRChTeW5jU2NvcGU6OklEIFNTSUQpIHsKKyAgICB0aGlzLT5TU0lEID0gU1NJRDsKKyAgfQorCisgIFZhbHVlICpnZXRQb2ludGVyT3BlcmFuZCgpIHsgcmV0dXJuIGdldE9wZXJhbmQoMCk7IH0KKyAgY29uc3QgVmFsdWUgKmdldFBvaW50ZXJPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0UG9pbnRlck9wZXJhbmRJbmRleCgpIHsgcmV0dXJuIDBVOyB9CisKKyAgVmFsdWUgKmdldENvbXBhcmVPcGVyYW5kKCkgeyByZXR1cm4gZ2V0T3BlcmFuZCgxKTsgfQorICBjb25zdCBWYWx1ZSAqZ2V0Q29tcGFyZU9wZXJhbmQoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDEpOyB9CisKKyAgVmFsdWUgKmdldE5ld1ZhbE9wZXJhbmQoKSB7IHJldHVybiBnZXRPcGVyYW5kKDIpOyB9CisgIGNvbnN0IFZhbHVlICpnZXROZXdWYWxPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgyKTsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBwb2ludGVyIG9wZXJhbmQuCisgIHVuc2lnbmVkIGdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFBvaW50ZXJPcGVyYW5kKCktPmdldFR5cGUoKS0+Z2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHN0cm9uZ2VzdCBwZXJtaXR0ZWQgb3JkZXJpbmcgb24gZmFpbHVyZSwgZ2l2ZW4gdGhlCisgIC8vLyBkZXNpcmVkIG9yZGVyaW5nIG9uIHN1Y2Nlc3MuCisgIC8vLworICAvLy8gSWYgdGhlIGNvbXBhcmlzb24gaW4gYSBjbXB4Y2hnIG9wZXJhdGlvbiBmYWlscywgdGhlcmUgaXMgbm8gYXRvbWljIHN0b3JlCisgIC8vLyBzbyByZWxlYXNlIHNlbWFudGljcyBjYW5ub3QgYmUgcHJvdmlkZWQuIFNvIHRoaXMgZnVuY3Rpb24gZHJvcHMgZXhwbGljaXQKKyAgLy8vIFJlbGVhc2UgcmVxdWVzdHMgZnJvbSB0aGUgQXRvbWljT3JkZXJpbmcuIEEgU2VxdWVudGlhbGx5Q29uc2lzdGVudAorICAvLy8gb3BlcmF0aW9uIHdvdWxkIHJlbWFpbiBTZXF1ZW50aWFsbHlDb25zaXN0ZW50LgorICBzdGF0aWMgQXRvbWljT3JkZXJpbmcKKyAgZ2V0U3Ryb25nZXN0RmFpbHVyZU9yZGVyaW5nKEF0b21pY09yZGVyaW5nIFN1Y2Nlc3NPcmRlcmluZykgeworICAgIHN3aXRjaCAoU3VjY2Vzc09yZGVyaW5nKSB7CisgICAgZGVmYXVsdDoKKyAgICAgIGxsdm1fdW5yZWFjaGFibGUoImludmFsaWQgY21weGNoZyBzdWNjZXNzIG9yZGVyaW5nIik7CisgICAgY2FzZSBBdG9taWNPcmRlcmluZzo6UmVsZWFzZToKKyAgICBjYXNlIEF0b21pY09yZGVyaW5nOjpNb25vdG9uaWM6CisgICAgICByZXR1cm4gQXRvbWljT3JkZXJpbmc6Ok1vbm90b25pYzsKKyAgICBjYXNlIEF0b21pY09yZGVyaW5nOjpBY3F1aXJlUmVsZWFzZToKKyAgICBjYXNlIEF0b21pY09yZGVyaW5nOjpBY3F1aXJlOgorICAgICAgcmV0dXJuIEF0b21pY09yZGVyaW5nOjpBY3F1aXJlOworICAgIGNhc2UgQXRvbWljT3JkZXJpbmc6OlNlcXVlbnRpYWxseUNvbnNpc3RlbnQ6CisgICAgICByZXR1cm4gQXRvbWljT3JkZXJpbmc6OlNlcXVlbnRpYWxseUNvbnNpc3RlbnQ7CisgICAgfQorICB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QXRvbWljQ21wWGNoZzsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8gU2hhZG93IEluc3RydWN0aW9uOjpzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSB3aXRoIGEgcHJpdmF0ZSBmb3J3YXJkaW5nCisgIC8vIG1ldGhvZCBzbyB0aGF0IHN1YmNsYXNzZXMgY2Fubm90IGFjY2lkZW50YWxseSB1c2UgaXQuCisgIHZvaWQgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEodW5zaWduZWQgc2hvcnQgRCkgeworICAgIEluc3RydWN0aW9uOjpzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YShEKTsKKyAgfQorCisgIC8vLyBUaGUgc3luY2hyb25pemF0aW9uIHNjb3BlIElEIG9mIHRoaXMgY21weGNoZyBpbnN0cnVjdGlvbi4gIE5vdCBxdWl0ZQorICAvLy8gZW5vdWdoIHJvb20gaW4gU3ViQ2xhc3NEYXRhIGZvciBldmVyeXRoaW5nLCBzbyBzeW5jaHJvbml6YXRpb24gc2NvcGUgSUQKKyAgLy8vIGdldHMgaXRzIG93biBmaWVsZC4KKyAgU3luY1Njb3BlOjpJRCBTU0lEOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPEF0b21pY0NtcFhjaGdJbnN0PiA6CisgICAgcHVibGljIEZpeGVkTnVtT3BlcmFuZFRyYWl0czxBdG9taWNDbXBYY2hnSW5zdCwgMz4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKEF0b21pY0NtcFhjaGdJbnN0LCBWYWx1ZSkKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNSTVdJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gYW4gaW5zdHJ1Y3Rpb24gdGhhdCBhdG9taWNhbGx5IHJlYWRzIGEgbWVtb3J5IGxvY2F0aW9uLAorLy8vIGNvbWJpbmVzIGl0IHdpdGggYW5vdGhlciB2YWx1ZSwgYW5kIHRoZW4gc3RvcmVzIHRoZSByZXN1bHQgYmFjay4gIFJldHVybnMKKy8vLyB0aGUgb2xkIHZhbHVlLgorLy8vCitjbGFzcyBBdG9taWNSTVdJbnN0IDogcHVibGljIEluc3RydWN0aW9uIHsKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIEF0b21pY1JNV0luc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBUaGlzIGVudW1lcmF0aW9uIGxpc3RzIHRoZSBwb3NzaWJsZSBtb2RpZmljYXRpb25zIGF0b21pY3JtdyBjYW4gbWFrZS4gIEluCisgIC8vLyB0aGUgZGVzY3JpcHRpb25zLCAncCcgaXMgdGhlIHBvaW50ZXIgdG8gdGhlIGluc3RydWN0aW9uJ3MgbWVtb3J5IGxvY2F0aW9uLAorICAvLy8gJ29sZCcgaXMgdGhlIGluaXRpYWwgdmFsdWUgb2YgKnAsIGFuZCAndicgaXMgdGhlIG90aGVyIHZhbHVlIHBhc3NlZCB0byB0aGUKKyAgLy8vIGluc3RydWN0aW9uLiAgVGhlc2UgaW5zdHJ1Y3Rpb25zIGFsd2F5cyByZXR1cm4gJ29sZCcuCisgIGVudW0gQmluT3AgeworICAgIC8vLyAqcCA9IHYKKyAgICBYY2hnLAorICAgIC8vLyAqcCA9IG9sZCArIHYKKyAgICBBZGQsCisgICAgLy8vICpwID0gb2xkIC0gdgorICAgIFN1YiwKKyAgICAvLy8gKnAgPSBvbGQgJiB2CisgICAgQW5kLAorICAgIC8vLyAqcCA9IH4ob2xkICYgdikKKyAgICBOYW5kLAorICAgIC8vLyAqcCA9IG9sZCB8IHYKKyAgICBPciwKKyAgICAvLy8gKnAgPSBvbGQgXiB2CisgICAgWG9yLAorICAgIC8vLyAqcCA9IG9sZCA+c2lnbmVkIHYgPyBvbGQgOiB2CisgICAgTWF4LAorICAgIC8vLyAqcCA9IG9sZCA8c2lnbmVkIHYgPyBvbGQgOiB2CisgICAgTWluLAorICAgIC8vLyAqcCA9IG9sZCA+dW5zaWduZWQgdiA/IG9sZCA6IHYKKyAgICBVTWF4LAorICAgIC8vLyAqcCA9IG9sZCA8dW5zaWduZWQgdiA/IG9sZCA6IHYKKyAgICBVTWluLAorCisgICAgRklSU1RfQklOT1AgPSBYY2hnLAorICAgIExBU1RfQklOT1AgPSBVTWluLAorICAgIEJBRF9CSU5PUAorICB9OworCisgIEF0b21pY1JNV0luc3QoQmluT3AgT3BlcmF0aW9uLCBWYWx1ZSAqUHRyLCBWYWx1ZSAqVmFsLAorICAgICAgICAgICAgICAgIEF0b21pY09yZGVyaW5nIE9yZGVyaW5nLCBTeW5jU2NvcGU6OklEIFNTSUQsCisgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBBdG9taWNSTVdJbnN0KEJpbk9wIE9wZXJhdGlvbiwgVmFsdWUgKlB0ciwgVmFsdWUgKlZhbCwKKyAgICAgICAgICAgICAgICBBdG9taWNPcmRlcmluZyBPcmRlcmluZywgU3luY1Njb3BlOjpJRCBTU0lELAorICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSB0d28gb3BlcmFuZHMKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSB7CisgICAgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzLCAyKTsKKyAgfQorCisgIEJpbk9wIGdldE9wZXJhdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8QmluT3A+KGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpID4+IDUpOworICB9CisKKyAgdm9pZCBzZXRPcGVyYXRpb24oQmluT3AgT3BlcmF0aW9uKSB7CisgICAgdW5zaWduZWQgc2hvcnQgU3ViY2xhc3NEYXRhID0gZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCk7CisgICAgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoKFN1YmNsYXNzRGF0YSAmIDMxKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE9wZXJhdGlvbiA8PCA1KSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIFJNVyBvbiBhIHZvbGF0aWxlIG1lbW9yeSBsb2NhdGlvbi4KKyAgLy8vCisgIGJvb2wgaXNWb2xhdGlsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiAxOworICB9CisKKyAgLy8vIFNwZWNpZnkgd2hldGhlciB0aGlzIGlzIGEgdm9sYXRpbGUgUk1XIG9yIG5vdC4KKyAgLy8vCisgIHZvaWQgc2V0Vm9sYXRpbGUoYm9vbCBWKSB7CisgICAgIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIH4xKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZClWKTsKKyAgfQorCisgIC8vLyBUcmFuc3BhcmVudGx5IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgZ2V0T3BlcmFuZCBtZXRob2RzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICAvLy8gUmV0dXJucyB0aGUgb3JkZXJpbmcgY29uc3RyYWludCBvZiB0aGlzIHJtdyBpbnN0cnVjdGlvbi4KKyAgQXRvbWljT3JkZXJpbmcgZ2V0T3JkZXJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIEF0b21pY09yZGVyaW5nKChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSA+PiAyKSAmIDcpOworICB9CisKKyAgLy8vIFNldHMgdGhlIG9yZGVyaW5nIGNvbnN0cmFpbnQgb2YgdGhpcyBybXcgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgc2V0T3JkZXJpbmcoQXRvbWljT3JkZXJpbmcgT3JkZXJpbmcpIHsKKyAgICBhc3NlcnQoT3JkZXJpbmcgIT0gQXRvbWljT3JkZXJpbmc6Ok5vdEF0b21pYyAmJgorICAgICAgICAgICAiYXRvbWljcm13IGluc3RydWN0aW9ucyBjYW4gb25seSBiZSBhdG9taWMuIik7CisgICAgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgfig3IDw8IDIpKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh1bnNpZ25lZClPcmRlcmluZyA8PCAyKSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgc3luY2hyb25pemF0aW9uIHNjb3BlIElEIG9mIHRoaXMgcm13IGluc3RydWN0aW9uLgorICBTeW5jU2NvcGU6OklEIGdldFN5bmNTY29wZUlEKCkgY29uc3QgeworICAgIHJldHVybiBTU0lEOworICB9CisKKyAgLy8vIFNldHMgdGhlIHN5bmNocm9uaXphdGlvbiBzY29wZSBJRCBvZiB0aGlzIHJtdyBpbnN0cnVjdGlvbi4KKyAgdm9pZCBzZXRTeW5jU2NvcGVJRChTeW5jU2NvcGU6OklEIFNTSUQpIHsKKyAgICB0aGlzLT5TU0lEID0gU1NJRDsKKyAgfQorCisgIFZhbHVlICpnZXRQb2ludGVyT3BlcmFuZCgpIHsgcmV0dXJuIGdldE9wZXJhbmQoMCk7IH0KKyAgY29uc3QgVmFsdWUgKmdldFBvaW50ZXJPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0UG9pbnRlck9wZXJhbmRJbmRleCgpIHsgcmV0dXJuIDBVOyB9CisKKyAgVmFsdWUgKmdldFZhbE9wZXJhbmQoKSB7IHJldHVybiBnZXRPcGVyYW5kKDEpOyB9CisgIGNvbnN0IFZhbHVlICpnZXRWYWxPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgxKTsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBwb2ludGVyIG9wZXJhbmQuCisgIHVuc2lnbmVkIGdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFBvaW50ZXJPcGVyYW5kKCktPmdldFR5cGUoKS0+Z2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpOworICB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QXRvbWljUk1XOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorCitwcml2YXRlOgorICB2b2lkIEluaXQoQmluT3AgT3BlcmF0aW9uLCBWYWx1ZSAqUHRyLCBWYWx1ZSAqVmFsLAorICAgICAgICAgICAgQXRvbWljT3JkZXJpbmcgT3JkZXJpbmcsIFN5bmNTY29wZTo6SUQgU1NJRCk7CisKKyAgLy8gU2hhZG93IEluc3RydWN0aW9uOjpzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSB3aXRoIGEgcHJpdmF0ZSBmb3J3YXJkaW5nCisgIC8vIG1ldGhvZCBzbyB0aGF0IHN1YmNsYXNzZXMgY2Fubm90IGFjY2lkZW50YWxseSB1c2UgaXQuCisgIHZvaWQgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEodW5zaWduZWQgc2hvcnQgRCkgeworICAgIEluc3RydWN0aW9uOjpzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YShEKTsKKyAgfQorCisgIC8vLyBUaGUgc3luY2hyb25pemF0aW9uIHNjb3BlIElEIG9mIHRoaXMgcm13IGluc3RydWN0aW9uLiAgTm90IHF1aXRlIGVub3VnaAorICAvLy8gcm9vbSBpbiBTdWJDbGFzc0RhdGEgZm9yIGV2ZXJ5dGhpbmcsIHNvIHN5bmNocm9uaXphdGlvbiBzY29wZSBJRCBnZXRzIGl0cworICAvLy8gb3duIGZpZWxkLgorICBTeW5jU2NvcGU6OklEIFNTSUQ7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8QXRvbWljUk1XSW5zdD4KKyAgICA6IHB1YmxpYyBGaXhlZE51bU9wZXJhbmRUcmFpdHM8QXRvbWljUk1XSW5zdCwyPiB7Cit9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoQXRvbWljUk1XSW5zdCwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0RWxlbWVudFB0ckluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIGNoZWNrR0VQVHlwZSAtIFNpbXBsZSB3cmFwcGVyIGZ1bmN0aW9uIHRvIGdpdmUgYSBiZXR0ZXIgYXNzZXJ0aW9uIGZhaWx1cmUKKy8vIG1lc3NhZ2Ugb24gYmFkIGluZGV4ZXMgZm9yIGEgZ2VwIGluc3RydWN0aW9uLgorLy8KK2lubGluZSBUeXBlICpjaGVja0dFUFR5cGUoVHlwZSAqVHkpIHsKKyAgYXNzZXJ0KFR5ICYmICJJbnZhbGlkIEdldEVsZW1lbnRQdHJJbnN0IGluZGljZXMgZm9yIHR5cGUhIik7CisgIHJldHVybiBUeTsKK30KKworLy8vIGFuIGluc3RydWN0aW9uIGZvciB0eXBlLXNhZmUgcG9pbnRlciBhcml0aG1ldGljIHRvCisvLy8gYWNjZXNzIGVsZW1lbnRzIG9mIGFycmF5cyBhbmQgc3RydWN0cworLy8vCitjbGFzcyBHZXRFbGVtZW50UHRySW5zdCA6IHB1YmxpYyBJbnN0cnVjdGlvbiB7CisgIFR5cGUgKlNvdXJjZUVsZW1lbnRUeXBlOworICBUeXBlICpSZXN1bHRFbGVtZW50VHlwZTsKKworICBHZXRFbGVtZW50UHRySW5zdChjb25zdCBHZXRFbGVtZW50UHRySW5zdCAmR0VQSSk7CisKKyAgLy8vIENvbnN0cnVjdG9ycyAtIENyZWF0ZSBhIGdldGVsZW1lbnRwdHIgaW5zdHJ1Y3Rpb24gd2l0aCBhIGJhc2UgcG9pbnRlciBhbgorICAvLy8gbGlzdCBvZiBpbmRpY2VzLiBUaGUgZmlyc3QgY3RvciBjYW4gb3B0aW9uYWxseSBpbnNlcnQgYmVmb3JlIGFuIGV4aXN0aW5nCisgIC8vLyBpbnN0cnVjdGlvbiwgdGhlIHNlY29uZCBhcHBlbmRzIHRoZSBuZXcgaW5zdHJ1Y3Rpb24gdG8gdGhlIHNwZWNpZmllZAorICAvLy8gQmFzaWNCbG9jay4KKyAgaW5saW5lIEdldEVsZW1lbnRQdHJJbnN0KFR5cGUgKlBvaW50ZWVUeXBlLCBWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gSWR4TGlzdCwgdW5zaWduZWQgVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpOworICBpbmxpbmUgR2V0RWxlbWVudFB0ckluc3QoVHlwZSAqUG9pbnRlZVR5cGUsIFZhbHVlICpQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBJZHhMaXN0LCB1bnNpZ25lZCBWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIHZvaWQgaW5pdChWYWx1ZSAqUHRyLCBBcnJheVJlZjxWYWx1ZSAqPiBJZHhMaXN0LCBjb25zdCBUd2luZSAmTmFtZVN0cik7CisKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIEdldEVsZW1lbnRQdHJJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICBzdGF0aWMgR2V0RWxlbWVudFB0ckluc3QgKkNyZWF0ZShUeXBlICpQb2ludGVlVHlwZSwgVmFsdWUgKlB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gSWR4TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpIHsKKyAgICB1bnNpZ25lZCBWYWx1ZXMgPSAxICsgdW5zaWduZWQoSWR4TGlzdC5zaXplKCkpOworICAgIGlmICghUG9pbnRlZVR5cGUpCisgICAgICBQb2ludGVlVHlwZSA9CisgICAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oUHRyLT5nZXRUeXBlKCktPmdldFNjYWxhclR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgZWxzZQorICAgICAgYXNzZXJ0KAorICAgICAgICAgIFBvaW50ZWVUeXBlID09CisgICAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oUHRyLT5nZXRUeXBlKCktPmdldFNjYWxhclR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpOworICAgIHJldHVybiBuZXcgKFZhbHVlcykgR2V0RWxlbWVudFB0ckluc3QoUG9pbnRlZVR5cGUsIFB0ciwgSWR4TGlzdCwgVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZVN0ciwgSW5zZXJ0QmVmb3JlKTsKKyAgfQorCisgIHN0YXRpYyBHZXRFbGVtZW50UHRySW5zdCAqQ3JlYXRlKFR5cGUgKlBvaW50ZWVUeXBlLCBWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBJZHhMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICB1bnNpZ25lZCBWYWx1ZXMgPSAxICsgdW5zaWduZWQoSWR4TGlzdC5zaXplKCkpOworICAgIGlmICghUG9pbnRlZVR5cGUpCisgICAgICBQb2ludGVlVHlwZSA9CisgICAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oUHRyLT5nZXRUeXBlKCktPmdldFNjYWxhclR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCk7CisgICAgZWxzZQorICAgICAgYXNzZXJ0KAorICAgICAgICAgIFBvaW50ZWVUeXBlID09CisgICAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oUHRyLT5nZXRUeXBlKCktPmdldFNjYWxhclR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpOworICAgIHJldHVybiBuZXcgKFZhbHVlcykgR2V0RWxlbWVudFB0ckluc3QoUG9pbnRlZVR5cGUsIFB0ciwgSWR4TGlzdCwgVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZVN0ciwgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgLy8vIENyZWF0ZSBhbiAiaW5ib3VuZHMiIGdldGVsZW1lbnRwdHIuIFNlZSB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgdGhlCisgIC8vLyAiaW5ib3VuZHMiIGZsYWcgaW4gTGFuZ1JlZi5odG1sIGZvciBkZXRhaWxzLgorICBzdGF0aWMgR2V0RWxlbWVudFB0ckluc3QgKkNyZWF0ZUluQm91bmRzKFZhbHVlICpQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gSWR4TGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKXsKKyAgICByZXR1cm4gQ3JlYXRlSW5Cb3VuZHMobnVsbHB0ciwgUHRyLCBJZHhMaXN0LCBOYW1lU3RyLCBJbnNlcnRCZWZvcmUpOworICB9CisKKyAgc3RhdGljIEdldEVsZW1lbnRQdHJJbnN0ICoKKyAgQ3JlYXRlSW5Cb3VuZHMoVHlwZSAqUG9pbnRlZVR5cGUsIFZhbHVlICpQdHIsIEFycmF5UmVmPFZhbHVlICo+IElkeExpc3QsCisgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsCisgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKSB7CisgICAgR2V0RWxlbWVudFB0ckluc3QgKkdFUCA9CisgICAgICAgIENyZWF0ZShQb2ludGVlVHlwZSwgUHRyLCBJZHhMaXN0LCBOYW1lU3RyLCBJbnNlcnRCZWZvcmUpOworICAgIEdFUC0+c2V0SXNJbkJvdW5kcyh0cnVlKTsKKyAgICByZXR1cm4gR0VQOworICB9CisKKyAgc3RhdGljIEdldEVsZW1lbnRQdHJJbnN0ICpDcmVhdGVJbkJvdW5kcyhWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IElkeExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICByZXR1cm4gQ3JlYXRlSW5Cb3VuZHMobnVsbHB0ciwgUHRyLCBJZHhMaXN0LCBOYW1lU3RyLCBJbnNlcnRBdEVuZCk7CisgIH0KKworICBzdGF0aWMgR2V0RWxlbWVudFB0ckluc3QgKkNyZWF0ZUluQm91bmRzKFR5cGUgKlBvaW50ZWVUeXBlLCBWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IElkeExpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICBHZXRFbGVtZW50UHRySW5zdCAqR0VQID0KKyAgICAgICAgQ3JlYXRlKFBvaW50ZWVUeXBlLCBQdHIsIElkeExpc3QsIE5hbWVTdHIsIEluc2VydEF0RW5kKTsKKyAgICBHRVAtPnNldElzSW5Cb3VuZHModHJ1ZSk7CisgICAgcmV0dXJuIEdFUDsKKyAgfQorCisgIC8vLyBUcmFuc3BhcmVudGx5IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgZ2V0T3BlcmFuZCBtZXRob2RzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICBUeXBlICpnZXRTb3VyY2VFbGVtZW50VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFNvdXJjZUVsZW1lbnRUeXBlOyB9CisKKyAgdm9pZCBzZXRTb3VyY2VFbGVtZW50VHlwZShUeXBlICpUeSkgeyBTb3VyY2VFbGVtZW50VHlwZSA9IFR5OyB9CisgIHZvaWQgc2V0UmVzdWx0RWxlbWVudFR5cGUoVHlwZSAqVHkpIHsgUmVzdWx0RWxlbWVudFR5cGUgPSBUeTsgfQorCisgIFR5cGUgKmdldFJlc3VsdEVsZW1lbnRUeXBlKCkgY29uc3QgeworICAgIGFzc2VydChSZXN1bHRFbGVtZW50VHlwZSA9PQorICAgICAgICAgICBjYXN0PFBvaW50ZXJUeXBlPihnZXRUeXBlKCktPmdldFNjYWxhclR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpOworICAgIHJldHVybiBSZXN1bHRFbGVtZW50VHlwZTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoaXMgaW5zdHJ1Y3Rpb24ncyBwb2ludGVyIHR5cGUuCisgIHVuc2lnbmVkIGdldEFkZHJlc3NTcGFjZSgpIGNvbnN0IHsKKyAgICAvLyBOb3RlIHRoYXQgdGhpcyBpcyBhbHdheXMgdGhlIHNhbWUgYXMgdGhlIHBvaW50ZXIgb3BlcmFuZCdzIGFkZHJlc3Mgc3BhY2UKKyAgICAvLyBhbmQgdGhhdCBpcyBjaGVhcGVyIHRvIGNvbXB1dGUsIHNvIGNoZWF0IGhlcmUuCisgICAgcmV0dXJuIGdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSB0eXBlIG9mIHRoZSBlbGVtZW50IHRoYXQgd291bGQgYmUgbG9hZGVkIHdpdGgKKyAgLy8vIGEgbG9hZCBpbnN0cnVjdGlvbiB3aXRoIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycy4KKyAgLy8vCisgIC8vLyBOdWxsIGlzIHJldHVybmVkIGlmIHRoZSBpbmRpY2VzIGFyZSBpbnZhbGlkIGZvciB0aGUgc3BlY2lmaWVkCisgIC8vLyBwb2ludGVyIHR5cGUuCisgIC8vLworICBzdGF0aWMgVHlwZSAqZ2V0SW5kZXhlZFR5cGUoVHlwZSAqVHksIEFycmF5UmVmPFZhbHVlICo+IElkeExpc3QpOworICBzdGF0aWMgVHlwZSAqZ2V0SW5kZXhlZFR5cGUoVHlwZSAqVHksIEFycmF5UmVmPENvbnN0YW50ICo+IElkeExpc3QpOworICBzdGF0aWMgVHlwZSAqZ2V0SW5kZXhlZFR5cGUoVHlwZSAqVHksIEFycmF5UmVmPHVpbnQ2NF90PiBJZHhMaXN0KTsKKworICBpbmxpbmUgb3BfaXRlcmF0b3IgICAgICAgaWR4X2JlZ2luKCkgICAgICAgeyByZXR1cm4gb3BfYmVnaW4oKSsxOyB9CisgIGlubGluZSBjb25zdF9vcF9pdGVyYXRvciBpZHhfYmVnaW4oKSBjb25zdCB7IHJldHVybiBvcF9iZWdpbigpKzE7IH0KKyAgaW5saW5lIG9wX2l0ZXJhdG9yICAgICAgIGlkeF9lbmQoKSAgICAgICAgIHsgcmV0dXJuIG9wX2VuZCgpOyB9CisgIGlubGluZSBjb25zdF9vcF9pdGVyYXRvciBpZHhfZW5kKCkgICBjb25zdCB7IHJldHVybiBvcF9lbmQoKTsgfQorCisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTxvcF9pdGVyYXRvcj4gaW5kaWNlcygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShpZHhfYmVnaW4oKSwgaWR4X2VuZCgpKTsKKyAgfQorCisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTxjb25zdF9vcF9pdGVyYXRvcj4gaW5kaWNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShpZHhfYmVnaW4oKSwgaWR4X2VuZCgpKTsKKyAgfQorCisgIFZhbHVlICpnZXRQb2ludGVyT3BlcmFuZCgpIHsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZCgwKTsKKyAgfQorICBjb25zdCBWYWx1ZSAqZ2V0UG9pbnRlck9wZXJhbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wZXJhbmQoMCk7CisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldFBvaW50ZXJPcGVyYW5kSW5kZXgoKSB7CisgICAgcmV0dXJuIDBVOyAgICAvLyBnZXQgaW5kZXggZm9yIG1vZGlmeWluZyBjb3JyZWN0IG9wZXJhbmQuCisgIH0KKworICAvLy8gTWV0aG9kIHRvIHJldHVybiB0aGUgcG9pbnRlciBvcGVyYW5kIGFzIGEKKyAgLy8vIFBvaW50ZXJUeXBlLgorICBUeXBlICpnZXRQb2ludGVyT3BlcmFuZFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFBvaW50ZXJPcGVyYW5kKCktPmdldFR5cGUoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSBwb2ludGVyIG9wZXJhbmQuCisgIHVuc2lnbmVkIGdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFBvaW50ZXJPcGVyYW5kVHlwZSgpLT5nZXRQb2ludGVyQWRkcmVzc1NwYWNlKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgcG9pbnRlciB0eXBlIHJldHVybmVkIGJ5IHRoZSBHRVAKKyAgLy8vIGluc3RydWN0aW9uLCB3aGljaCBtYXkgYmUgYSB2ZWN0b3Igb2YgcG9pbnRlcnMuCisgIHN0YXRpYyBUeXBlICpnZXRHRVBSZXR1cm5UeXBlKFZhbHVlICpQdHIsIEFycmF5UmVmPFZhbHVlICo+IElkeExpc3QpIHsKKyAgICByZXR1cm4gZ2V0R0VQUmV0dXJuVHlwZSgKKyAgICAgIGNhc3Q8UG9pbnRlclR5cGU+KFB0ci0+Z2V0VHlwZSgpLT5nZXRTY2FsYXJUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpLAorICAgICAgUHRyLCBJZHhMaXN0KTsKKyAgfQorICBzdGF0aWMgVHlwZSAqZ2V0R0VQUmV0dXJuVHlwZShUeXBlICpFbFR5LCBWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBJZHhMaXN0KSB7CisgICAgVHlwZSAqUHRyVHkgPSBQb2ludGVyVHlwZTo6Z2V0KGNoZWNrR0VQVHlwZShnZXRJbmRleGVkVHlwZShFbFR5LCBJZHhMaXN0KSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0ci0+Z2V0VHlwZSgpLT5nZXRQb2ludGVyQWRkcmVzc1NwYWNlKCkpOworICAgIC8vIFZlY3RvciBHRVAKKyAgICBpZiAoUHRyLT5nZXRUeXBlKCktPmlzVmVjdG9yVHkoKSkgeworICAgICAgdW5zaWduZWQgTnVtRWxlbSA9IFB0ci0+Z2V0VHlwZSgpLT5nZXRWZWN0b3JOdW1FbGVtZW50cygpOworICAgICAgcmV0dXJuIFZlY3RvclR5cGU6OmdldChQdHJUeSwgTnVtRWxlbSk7CisgICAgfQorICAgIGZvciAoVmFsdWUgKkluZGV4IDogSWR4TGlzdCkKKyAgICAgIGlmIChJbmRleC0+Z2V0VHlwZSgpLT5pc1ZlY3RvclR5KCkpIHsKKyAgICAgICAgdW5zaWduZWQgTnVtRWxlbSA9IEluZGV4LT5nZXRUeXBlKCktPmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgICAgICAgIHJldHVybiBWZWN0b3JUeXBlOjpnZXQoUHRyVHksIE51bUVsZW0pOworICAgICAgfQorICAgIC8vIFNjYWxhciBHRVAKKyAgICByZXR1cm4gUHRyVHk7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1JbmRpY2VzKCkgY29uc3QgeyAgLy8gTm90ZTogYWx3YXlzIG5vbi1uZWdhdGl2ZQorICAgIHJldHVybiBnZXROdW1PcGVyYW5kcygpIC0gMTsKKyAgfQorCisgIGJvb2wgaGFzSW5kaWNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKSA+IDE7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgYWxsIG9mIHRoZSBpbmRpY2VzIG9mIHRoaXMgR0VQIGFyZQorICAvLy8gemVyb3MuICBJZiBzbywgdGhlIHJlc3VsdCBwb2ludGVyIGFuZCB0aGUgZmlyc3Qgb3BlcmFuZCBoYXZlIHRoZSBzYW1lCisgIC8vLyB2YWx1ZSwganVzdCBwb3RlbnRpYWxseSBkaWZmZXJlbnQgdHlwZXMuCisgIGJvb2wgaGFzQWxsWmVyb0luZGljZXMoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgYWxsIG9mIHRoZSBpbmRpY2VzIG9mIHRoaXMgR0VQIGFyZQorICAvLy8gY29uc3RhbnQgaW50ZWdlcnMuICBJZiBzbywgdGhlIHJlc3VsdCBwb2ludGVyIGFuZCB0aGUgZmlyc3Qgb3BlcmFuZCBoYXZlCisgIC8vLyBhIGNvbnN0YW50IG9mZnNldCBiZXR3ZWVuIHRoZW0uCisgIGJvb2wgaGFzQWxsQ29uc3RhbnRJbmRpY2VzKCkgY29uc3Q7CisKKyAgLy8vIFNldCBvciBjbGVhciB0aGUgaW5ib3VuZHMgZmxhZyBvbiB0aGlzIEdFUCBpbnN0cnVjdGlvbi4KKyAgLy8vIFNlZSBMYW5nUmVmLmh0bWwgZm9yIHRoZSBtZWFuaW5nIG9mIGluYm91bmRzIG9uIGEgZ2V0ZWxlbWVudHB0ci4KKyAgdm9pZCBzZXRJc0luQm91bmRzKGJvb2wgYiA9IHRydWUpOworCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgR0VQIGhhcyB0aGUgaW5ib3VuZHMgZmxhZy4KKyAgYm9vbCBpc0luQm91bmRzKCkgY29uc3Q7CisKKyAgLy8vIEFjY3VtdWxhdGUgdGhlIGNvbnN0YW50IGFkZHJlc3Mgb2Zmc2V0IG9mIHRoaXMgR0VQIGlmIHBvc3NpYmxlLgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSBhY2NlcHRzIGFuIEFQSW50IGludG8gd2hpY2ggaXQgd2lsbCBhY2N1bXVsYXRlIHRoZSBjb25zdGFudAorICAvLy8gb2Zmc2V0IG9mIHRoaXMgR0VQIGlmIHRoZSBHRVAgaXMgaW4gZmFjdCBjb25zdGFudC4gSWYgdGhlIEdFUCBpcyBub3QKKyAgLy8vIGFsbC1jb25zdGFudCwgaXQgcmV0dXJucyBmYWxzZSBhbmQgdGhlIHZhbHVlIG9mIHRoZSBvZmZzZXQgQVBJbnQgaXMKKyAgLy8vIHVuZGVmaW5lZCAoaXQgaXMgKm5vdCogcHJlc2VydmVkISkuIFRoZSBBUEludCBwYXNzZWQgaW50byB0aGlzIHJvdXRpbmUKKyAgLy8vIG11c3QgYmUgYXQgbGVhc3QgYXMgd2lkZSBhcyB0aGUgSW50UHRyIHR5cGUgZm9yIHRoZSBhZGRyZXNzIHNwYWNlIG9mCisgIC8vLyB0aGUgYmFzZSBHRVAgcG9pbnRlci4KKyAgYm9vbCBhY2N1bXVsYXRlQ29uc3RhbnRPZmZzZXQoY29uc3QgRGF0YUxheW91dCAmREwsIEFQSW50ICZPZmZzZXQpIGNvbnN0OworCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gKEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpHZXRFbGVtZW50UHRyKTsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxHZXRFbGVtZW50UHRySW5zdD4gOgorICBwdWJsaWMgVmFyaWFkaWNPcGVyYW5kVHJhaXRzPEdldEVsZW1lbnRQdHJJbnN0LCAxPiB7Cit9OworCitHZXRFbGVtZW50UHRySW5zdDo6R2V0RWxlbWVudFB0ckluc3QoVHlwZSAqUG9pbnRlZVR5cGUsIFZhbHVlICpQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gSWR4TGlzdCwgdW5zaWduZWQgVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpCisgICAgOiBJbnN0cnVjdGlvbihnZXRHRVBSZXR1cm5UeXBlKFBvaW50ZWVUeXBlLCBQdHIsIElkeExpc3QpLCBHZXRFbGVtZW50UHRyLAorICAgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxHZXRFbGVtZW50UHRySW5zdD46Om9wX2VuZCh0aGlzKSAtIFZhbHVlcywKKyAgICAgICAgICAgICAgICAgIFZhbHVlcywgSW5zZXJ0QmVmb3JlKSwKKyAgICAgIFNvdXJjZUVsZW1lbnRUeXBlKFBvaW50ZWVUeXBlKSwKKyAgICAgIFJlc3VsdEVsZW1lbnRUeXBlKGdldEluZGV4ZWRUeXBlKFBvaW50ZWVUeXBlLCBJZHhMaXN0KSkgeworICBhc3NlcnQoUmVzdWx0RWxlbWVudFR5cGUgPT0KKyAgICAgICAgIGNhc3Q8UG9pbnRlclR5cGU+KGdldFR5cGUoKS0+Z2V0U2NhbGFyVHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgIGluaXQoUHRyLCBJZHhMaXN0LCBOYW1lU3RyKTsKK30KKworR2V0RWxlbWVudFB0ckluc3Q6OkdldEVsZW1lbnRQdHJJbnN0KFR5cGUgKlBvaW50ZWVUeXBlLCBWYWx1ZSAqUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IElkeExpc3QsIHVuc2lnbmVkIFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkKKyAgICA6IEluc3RydWN0aW9uKGdldEdFUFJldHVyblR5cGUoUG9pbnRlZVR5cGUsIFB0ciwgSWR4TGlzdCksIEdldEVsZW1lbnRQdHIsCisgICAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPEdldEVsZW1lbnRQdHJJbnN0Pjo6b3BfZW5kKHRoaXMpIC0gVmFsdWVzLAorICAgICAgICAgICAgICAgICAgVmFsdWVzLCBJbnNlcnRBdEVuZCksCisgICAgICBTb3VyY2VFbGVtZW50VHlwZShQb2ludGVlVHlwZSksCisgICAgICBSZXN1bHRFbGVtZW50VHlwZShnZXRJbmRleGVkVHlwZShQb2ludGVlVHlwZSwgSWR4TGlzdCkpIHsKKyAgYXNzZXJ0KFJlc3VsdEVsZW1lbnRUeXBlID09CisgICAgICAgICBjYXN0PFBvaW50ZXJUeXBlPihnZXRUeXBlKCktPmdldFNjYWxhclR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpOworICBpbml0KFB0ciwgSWR4TGlzdCwgTmFtZVN0cik7Cit9CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhHZXRFbGVtZW50UHRySW5zdCwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJQ21wSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgaW5zdHJ1Y3Rpb24gY29tcGFyZXMgaXRzIG9wZXJhbmRzIGFjY29yZGluZyB0byB0aGUgcHJlZGljYXRlIGdpdmVuCisvLy8gdG8gdGhlIGNvbnN0cnVjdG9yLiBJdCBvbmx5IG9wZXJhdGVzIG9uIGludGVnZXJzIG9yIHBvaW50ZXJzLiBUaGUgb3BlcmFuZHMKKy8vLyBtdXN0IGJlIGlkZW50aWNhbCB0eXBlcy4KKy8vLyBSZXByZXNlbnQgYW4gaW50ZWdlciBjb21wYXJpc29uIG9wZXJhdG9yLgorY2xhc3MgSUNtcEluc3Q6IHB1YmxpYyBDbXBJbnN0IHsKKyAgdm9pZCBBc3NlcnRPSygpIHsKKyAgICBhc3NlcnQoaXNJbnRQcmVkaWNhdGUoKSAmJgorICAgICAgICAgICAiSW52YWxpZCBJQ21wIHByZWRpY2F0ZSB2YWx1ZSIpOworICAgIGFzc2VydChnZXRPcGVyYW5kKDApLT5nZXRUeXBlKCkgPT0gZ2V0T3BlcmFuZCgxKS0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgIkJvdGggb3BlcmFuZHMgdG8gSUNtcCBpbnN0cnVjdGlvbiBhcmUgbm90IG9mIHRoZSBzYW1lIHR5cGUhIik7CisgICAgLy8gQ2hlY2sgdGhhdCB0aGUgb3BlcmFuZHMgYXJlIHRoZSByaWdodCB0eXBlCisgICAgYXNzZXJ0KChnZXRPcGVyYW5kKDApLT5nZXRUeXBlKCktPmlzSW50T3JJbnRWZWN0b3JUeSgpIHx8CisgICAgICAgICAgICBnZXRPcGVyYW5kKDApLT5nZXRUeXBlKCktPmlzUHRyT3JQdHJWZWN0b3JUeSgpKSAmJgorICAgICAgICAgICAiSW52YWxpZCBvcGVyYW5kIHR5cGVzIGZvciBJQ21wIGluc3RydWN0aW9uIik7CisgIH0KKworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgLy8vIENsb25lIGFuIGlkZW50aWNhbCBJQ21wSW5zdAorICBJQ21wSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MuCisgIElDbXBJbnN0KAorICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUsICAvLy88IFdoZXJlIHRvIGluc2VydAorICAgIFByZWRpY2F0ZSBwcmVkLCAgLy8vPCBUaGUgcHJlZGljYXRlIHRvIHVzZSBmb3IgdGhlIGNvbXBhcmlzb24KKyAgICBWYWx1ZSAqTEhTLCAgICAgIC8vLzwgVGhlIGxlZnQtaGFuZC1zaWRlIG9mIHRoZSBleHByZXNzaW9uCisgICAgVmFsdWUgKlJIUywgICAgICAvLy88IFRoZSByaWdodC1oYW5kLXNpZGUgb2YgdGhlIGV4cHJlc3Npb24KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiICAvLy88IE5hbWUgb2YgdGhlIGluc3RydWN0aW9uCisgICkgOiBDbXBJbnN0KG1ha2VDbXBSZXN1bHRUeXBlKExIUy0+Z2V0VHlwZSgpKSwKKyAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb246OklDbXAsIHByZWQsIExIUywgUkhTLCBOYW1lU3RyLAorICAgICAgICAgICAgICBJbnNlcnRCZWZvcmUpIHsKKyNpZm5kZWYgTkRFQlVHCisgIEFzc2VydE9LKCk7CisjZW5kaWYKKyAgfQorCisgIC8vLyBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1hdC1lbmQgc2VtYW50aWNzLgorICBJQ21wSW5zdCgKKyAgICBCYXNpY0Jsb2NrICZJbnNlcnRBdEVuZCwgLy8vPCBCbG9jayB0byBpbnNlcnQgaW50by4KKyAgICBQcmVkaWNhdGUgcHJlZCwgIC8vLzwgVGhlIHByZWRpY2F0ZSB0byB1c2UgZm9yIHRoZSBjb21wYXJpc29uCisgICAgVmFsdWUgKkxIUywgICAgICAvLy88IFRoZSBsZWZ0LWhhbmQtc2lkZSBvZiB0aGUgZXhwcmVzc2lvbgorICAgIFZhbHVlICpSSFMsICAgICAgLy8vPCBUaGUgcmlnaHQtaGFuZC1zaWRlIG9mIHRoZSBleHByZXNzaW9uCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiAgLy8vPCBOYW1lIG9mIHRoZSBpbnN0cnVjdGlvbgorICApIDogQ21wSW5zdChtYWtlQ21wUmVzdWx0VHlwZShMSFMtPmdldFR5cGUoKSksCisgICAgICAgICAgICAgIEluc3RydWN0aW9uOjpJQ21wLCBwcmVkLCBMSFMsIFJIUywgTmFtZVN0ciwKKyAgICAgICAgICAgICAgJkluc2VydEF0RW5kKSB7CisjaWZuZGVmIE5ERUJVRworICBBc3NlcnRPSygpOworI2VuZGlmCisgIH0KKworICAvLy8gQ29uc3RydWN0b3Igd2l0aCBuby1pbnNlcnRpb24gc2VtYW50aWNzCisgIElDbXBJbnN0KAorICAgIFByZWRpY2F0ZSBwcmVkLCAvLy88IFRoZSBwcmVkaWNhdGUgdG8gdXNlIGZvciB0aGUgY29tcGFyaXNvbgorICAgIFZhbHVlICpMSFMsICAgICAvLy88IFRoZSBsZWZ0LWhhbmQtc2lkZSBvZiB0aGUgZXhwcmVzc2lvbgorICAgIFZhbHVlICpSSFMsICAgICAvLy88IFRoZSByaWdodC1oYW5kLXNpZGUgb2YgdGhlIGV4cHJlc3Npb24KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiIC8vLzwgTmFtZSBvZiB0aGUgaW5zdHJ1Y3Rpb24KKyAgKSA6IENtcEluc3QobWFrZUNtcFJlc3VsdFR5cGUoTEhTLT5nZXRUeXBlKCkpLAorICAgICAgICAgICAgICBJbnN0cnVjdGlvbjo6SUNtcCwgcHJlZCwgTEhTLCBSSFMsIE5hbWVTdHIpIHsKKyNpZm5kZWYgTkRFQlVHCisgIEFzc2VydE9LKCk7CisjZW5kaWYKKyAgfQorCisgIC8vLyBGb3IgZXhhbXBsZSwgRVEtPkVRLCBTTEUtPlNMRSwgVUdULT5TR1QsIGV0Yy4KKyAgLy8vIEByZXR1cm5zIHRoZSBwcmVkaWNhdGUgdGhhdCB3b3VsZCBiZSB0aGUgcmVzdWx0IGlmIHRoZSBvcGVyYW5kIHdlcmUKKyAgLy8vIHJlZ2FyZGVkIGFzIHNpZ25lZC4KKyAgLy8vIFJldHVybiB0aGUgc2lnbmVkIHZlcnNpb24gb2YgdGhlIHByZWRpY2F0ZQorICBQcmVkaWNhdGUgZ2V0U2lnbmVkUHJlZGljYXRlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTaWduZWRQcmVkaWNhdGUoZ2V0UHJlZGljYXRlKCkpOworICB9CisKKyAgLy8vIFRoaXMgaXMgYSBzdGF0aWMgdmVyc2lvbiB0aGF0IHlvdSBjYW4gdXNlIHdpdGhvdXQgYW4gaW5zdHJ1Y3Rpb24uCisgIC8vLyBSZXR1cm4gdGhlIHNpZ25lZCB2ZXJzaW9uIG9mIHRoZSBwcmVkaWNhdGUuCisgIHN0YXRpYyBQcmVkaWNhdGUgZ2V0U2lnbmVkUHJlZGljYXRlKFByZWRpY2F0ZSBwcmVkKTsKKworICAvLy8gRm9yIGV4YW1wbGUsIEVRLT5FUSwgU0xFLT5VTEUsIFVHVC0+VUdULCBldGMuCisgIC8vLyBAcmV0dXJucyB0aGUgcHJlZGljYXRlIHRoYXQgd291bGQgYmUgdGhlIHJlc3VsdCBpZiB0aGUgb3BlcmFuZCB3ZXJlCisgIC8vLyByZWdhcmRlZCBhcyB1bnNpZ25lZC4KKyAgLy8vIFJldHVybiB0aGUgdW5zaWduZWQgdmVyc2lvbiBvZiB0aGUgcHJlZGljYXRlCisgIFByZWRpY2F0ZSBnZXRVbnNpZ25lZFByZWRpY2F0ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VW5zaWduZWRQcmVkaWNhdGUoZ2V0UHJlZGljYXRlKCkpOworICB9CisKKyAgLy8vIFRoaXMgaXMgYSBzdGF0aWMgdmVyc2lvbiB0aGF0IHlvdSBjYW4gdXNlIHdpdGhvdXQgYW4gaW5zdHJ1Y3Rpb24uCisgIC8vLyBSZXR1cm4gdGhlIHVuc2lnbmVkIHZlcnNpb24gb2YgdGhlIHByZWRpY2F0ZS4KKyAgc3RhdGljIFByZWRpY2F0ZSBnZXRVbnNpZ25lZFByZWRpY2F0ZShQcmVkaWNhdGUgcHJlZCk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgcHJlZGljYXRlIGlzIGVpdGhlciBFUSBvciBORS4gIFRoaXMgYWxzbworICAvLy8gdGVzdHMgZm9yIGNvbW11dGF0aXZpdHkuCisgIHN0YXRpYyBib29sIGlzRXF1YWxpdHkoUHJlZGljYXRlIFApIHsKKyAgICByZXR1cm4gUCA9PSBJQ01QX0VRIHx8IFAgPT0gSUNNUF9ORTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHByZWRpY2F0ZSBpcyBlaXRoZXIgRVEgb3IgTkUuICBUaGlzIGFsc28KKyAgLy8vIHRlc3RzIGZvciBjb21tdXRhdGl2aXR5LgorICBib29sIGlzRXF1YWxpdHkoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRXF1YWxpdHkoZ2V0UHJlZGljYXRlKCkpOworICB9CisKKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgdGhlIHByZWRpY2F0ZSBvZiB0aGlzIElDbXBJbnN0IGlzIGNvbW11dGF0aXZlCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhpcyByZWxhdGlvbiBpcyBjb21tdXRhdGl2ZS4KKyAgYm9vbCBpc0NvbW11dGF0aXZlKCkgY29uc3QgeyByZXR1cm4gaXNFcXVhbGl0eSgpOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBwcmVkaWNhdGUgaXMgcmVsYXRpb25hbCAobm90IEVRIG9yIE5FKS4KKyAgLy8vCisgIGJvb2wgaXNSZWxhdGlvbmFsKCkgY29uc3QgeworICAgIHJldHVybiAhaXNFcXVhbGl0eSgpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBwcmVkaWNhdGUgaXMgcmVsYXRpb25hbCAobm90IEVRIG9yIE5FKS4KKyAgLy8vCisgIHN0YXRpYyBib29sIGlzUmVsYXRpb25hbChQcmVkaWNhdGUgUCkgeworICAgIHJldHVybiAhaXNFcXVhbGl0eShQKTsKKyAgfQorCisgIC8vLyBFeGNoYW5nZSB0aGUgdHdvIG9wZXJhbmRzIHRvIHRoaXMgaW5zdHJ1Y3Rpb24gaW4gc3VjaCBhIHdheSB0aGF0IGl0IGRvZXMKKyAgLy8vIG5vdCBtb2RpZnkgdGhlIHNlbWFudGljcyBvZiB0aGUgaW5zdHJ1Y3Rpb24uIFRoZSBwcmVkaWNhdGUgdmFsdWUgbWF5IGJlCisgIC8vLyBjaGFuZ2VkIHRvIHJldGFpbiB0aGUgc2FtZSByZXN1bHQgaWYgdGhlIHByZWRpY2F0ZSBpcyBvcmRlciBkZXBlbmRlbnQKKyAgLy8vIChlLmcuIHVsdCkuCisgIC8vLyBTd2FwIG9wZXJhbmRzIGFuZCBhZGp1c3QgcHJlZGljYXRlLgorICB2b2lkIHN3YXBPcGVyYW5kcygpIHsKKyAgICBzZXRQcmVkaWNhdGUoZ2V0U3dhcHBlZFByZWRpY2F0ZSgpKTsKKyAgICBPcDwwPigpLnN3YXAoT3A8MT4oKSk7CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpJQ21wOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZDbXBJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVGhpcyBpbnN0cnVjdGlvbiBjb21wYXJlcyBpdHMgb3BlcmFuZHMgYWNjb3JkaW5nIHRvIHRoZSBwcmVkaWNhdGUgZ2l2ZW4KKy8vLyB0byB0aGUgY29uc3RydWN0b3IuIEl0IG9ubHkgb3BlcmF0ZXMgb24gZmxvYXRpbmcgcG9pbnQgdmFsdWVzIG9yIHBhY2tlZAorLy8vIHZlY3RvcnMgb2YgZmxvYXRpbmcgcG9pbnQgdmFsdWVzLiBUaGUgb3BlcmFuZHMgbXVzdCBiZSBpZGVudGljYWwgdHlwZXMuCisvLy8gUmVwcmVzZW50cyBhIGZsb2F0aW5nIHBvaW50IGNvbXBhcmlzb24gb3BlcmF0b3IuCitjbGFzcyBGQ21wSW5zdDogcHVibGljIENtcEluc3QgeworICB2b2lkIEFzc2VydE9LKCkgeworICAgIGFzc2VydChpc0ZQUHJlZGljYXRlKCkgJiYgIkludmFsaWQgRkNtcCBwcmVkaWNhdGUgdmFsdWUiKTsKKyAgICBhc3NlcnQoZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpID09IGdldE9wZXJhbmQoMSktPmdldFR5cGUoKSAmJgorICAgICAgICAgICAiQm90aCBvcGVyYW5kcyB0byBGQ21wIGluc3RydWN0aW9uIGFyZSBub3Qgb2YgdGhlIHNhbWUgdHlwZSEiKTsKKyAgICAvLyBDaGVjayB0aGF0IHRoZSBvcGVyYW5kcyBhcmUgdGhlIHJpZ2h0IHR5cGUKKyAgICBhc3NlcnQoZ2V0T3BlcmFuZCgwKS0+Z2V0VHlwZSgpLT5pc0ZQT3JGUFZlY3RvclR5KCkgJiYKKyAgICAgICAgICAgIkludmFsaWQgb3BlcmFuZCB0eXBlcyBmb3IgRkNtcCBpbnN0cnVjdGlvbiIpOworICB9CisKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIC8vLyBDbG9uZSBhbiBpZGVudGljYWwgRkNtcEluc3QKKyAgRkNtcEluc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1iZWZvcmUtaW5zdHJ1Y3Rpb24gc2VtYW50aWNzLgorICBGQ21wSW5zdCgKKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlLCAvLy88IFdoZXJlIHRvIGluc2VydAorICAgIFByZWRpY2F0ZSBwcmVkLCAgLy8vPCBUaGUgcHJlZGljYXRlIHRvIHVzZSBmb3IgdGhlIGNvbXBhcmlzb24KKyAgICBWYWx1ZSAqTEhTLCAgICAgIC8vLzwgVGhlIGxlZnQtaGFuZC1zaWRlIG9mIHRoZSBleHByZXNzaW9uCisgICAgVmFsdWUgKlJIUywgICAgICAvLy88IFRoZSByaWdodC1oYW5kLXNpZGUgb2YgdGhlIGV4cHJlc3Npb24KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiICAvLy88IE5hbWUgb2YgdGhlIGluc3RydWN0aW9uCisgICkgOiBDbXBJbnN0KG1ha2VDbXBSZXN1bHRUeXBlKExIUy0+Z2V0VHlwZSgpKSwKKyAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb246OkZDbXAsIHByZWQsIExIUywgUkhTLCBOYW1lU3RyLAorICAgICAgICAgICAgICBJbnNlcnRCZWZvcmUpIHsKKyAgICBBc3NlcnRPSygpOworICB9CisKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWF0LWVuZCBzZW1hbnRpY3MuCisgIEZDbXBJbnN0KAorICAgIEJhc2ljQmxvY2sgJkluc2VydEF0RW5kLCAvLy88IEJsb2NrIHRvIGluc2VydCBpbnRvLgorICAgIFByZWRpY2F0ZSBwcmVkLCAgLy8vPCBUaGUgcHJlZGljYXRlIHRvIHVzZSBmb3IgdGhlIGNvbXBhcmlzb24KKyAgICBWYWx1ZSAqTEhTLCAgICAgIC8vLzwgVGhlIGxlZnQtaGFuZC1zaWRlIG9mIHRoZSBleHByZXNzaW9uCisgICAgVmFsdWUgKlJIUywgICAgICAvLy88IFRoZSByaWdodC1oYW5kLXNpZGUgb2YgdGhlIGV4cHJlc3Npb24KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiICAvLy88IE5hbWUgb2YgdGhlIGluc3RydWN0aW9uCisgICkgOiBDbXBJbnN0KG1ha2VDbXBSZXN1bHRUeXBlKExIUy0+Z2V0VHlwZSgpKSwKKyAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb246OkZDbXAsIHByZWQsIExIUywgUkhTLCBOYW1lU3RyLAorICAgICAgICAgICAgICAmSW5zZXJ0QXRFbmQpIHsKKyAgICBBc3NlcnRPSygpOworICB9CisKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggbm8taW5zZXJ0aW9uIHNlbWFudGljcworICBGQ21wSW5zdCgKKyAgICBQcmVkaWNhdGUgcHJlZCwgLy8vPCBUaGUgcHJlZGljYXRlIHRvIHVzZSBmb3IgdGhlIGNvbXBhcmlzb24KKyAgICBWYWx1ZSAqTEhTLCAgICAgLy8vPCBUaGUgbGVmdC1oYW5kLXNpZGUgb2YgdGhlIGV4cHJlc3Npb24KKyAgICBWYWx1ZSAqUkhTLCAgICAgLy8vPCBUaGUgcmlnaHQtaGFuZC1zaWRlIG9mIHRoZSBleHByZXNzaW9uCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiAvLy88IE5hbWUgb2YgdGhlIGluc3RydWN0aW9uCisgICkgOiBDbXBJbnN0KG1ha2VDbXBSZXN1bHRUeXBlKExIUy0+Z2V0VHlwZSgpKSwKKyAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb246OkZDbXAsIHByZWQsIExIUywgUkhTLCBOYW1lU3RyKSB7CisgICAgQXNzZXJ0T0soKTsKKyAgfQorCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmIHRoZSBwcmVkaWNhdGUgb2YgdGhpcyBpbnN0cnVjdGlvbiBpcyBFUSBvciBORS4KKyAgLy8vIERldGVybWluZSBpZiB0aGlzIGlzIGFuIGVxdWFsaXR5IHByZWRpY2F0ZS4KKyAgc3RhdGljIGJvb2wgaXNFcXVhbGl0eShQcmVkaWNhdGUgUHJlZCkgeworICAgIHJldHVybiBQcmVkID09IEZDTVBfT0VRIHx8IFByZWQgPT0gRkNNUF9PTkUgfHwgUHJlZCA9PSBGQ01QX1VFUSB8fAorICAgICAgICAgICBQcmVkID09IEZDTVBfVU5FOworICB9CisKKyAgLy8vIEByZXR1cm5zIHRydWUgaWYgdGhlIHByZWRpY2F0ZSBvZiB0aGlzIGluc3RydWN0aW9uIGlzIEVRIG9yIE5FLgorICAvLy8gRGV0ZXJtaW5lIGlmIHRoaXMgaXMgYW4gZXF1YWxpdHkgcHJlZGljYXRlLgorICBib29sIGlzRXF1YWxpdHkoKSBjb25zdCB7IHJldHVybiBpc0VxdWFsaXR5KGdldFByZWRpY2F0ZSgpKTsgfQorCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmIHRoZSBwcmVkaWNhdGUgb2YgdGhpcyBpbnN0cnVjdGlvbiBpcyBjb21tdXRhdGl2ZS4KKyAgLy8vIERldGVybWluZSBpZiB0aGlzIGlzIGEgY29tbXV0YXRpdmUgcHJlZGljYXRlLgorICBib29sIGlzQ29tbXV0YXRpdmUoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRXF1YWxpdHkoKSB8fAorICAgICAgICAgICBnZXRQcmVkaWNhdGUoKSA9PSBGQ01QX0ZBTFNFIHx8CisgICAgICAgICAgIGdldFByZWRpY2F0ZSgpID09IEZDTVBfVFJVRSB8fAorICAgICAgICAgICBnZXRQcmVkaWNhdGUoKSA9PSBGQ01QX09SRCB8fAorICAgICAgICAgICBnZXRQcmVkaWNhdGUoKSA9PSBGQ01QX1VOTzsKKyAgfQorCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmIHRoZSBwcmVkaWNhdGUgaXMgcmVsYXRpb25hbCAobm90IEVRIG9yIE5FKS4KKyAgLy8vIERldGVybWluZSBpZiB0aGlzIGEgcmVsYXRpb25hbCBwcmVkaWNhdGUuCisgIGJvb2wgaXNSZWxhdGlvbmFsKCkgY29uc3QgeyByZXR1cm4gIWlzRXF1YWxpdHkoKTsgfQorCisgIC8vLyBFeGNoYW5nZSB0aGUgdHdvIG9wZXJhbmRzIHRvIHRoaXMgaW5zdHJ1Y3Rpb24gaW4gc3VjaCBhIHdheSB0aGF0IGl0IGRvZXMKKyAgLy8vIG5vdCBtb2RpZnkgdGhlIHNlbWFudGljcyBvZiB0aGUgaW5zdHJ1Y3Rpb24uIFRoZSBwcmVkaWNhdGUgdmFsdWUgbWF5IGJlCisgIC8vLyBjaGFuZ2VkIHRvIHJldGFpbiB0aGUgc2FtZSByZXN1bHQgaWYgdGhlIHByZWRpY2F0ZSBpcyBvcmRlciBkZXBlbmRlbnQKKyAgLy8vIChlLmcuIHVsdCkuCisgIC8vLyBTd2FwIG9wZXJhbmRzIGFuZCBhZGp1c3QgcHJlZGljYXRlLgorICB2b2lkIHN3YXBPcGVyYW5kcygpIHsKKyAgICBzZXRQcmVkaWNhdGUoZ2V0U3dhcHBlZFByZWRpY2F0ZSgpKTsKKyAgICBPcDwwPigpLnN3YXAoT3A8MT4oKSk7CisgIH0KKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RkNtcDsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKK2NsYXNzIENhbGxJbnN0OworY2xhc3MgSW52b2tlSW5zdDsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBDYWxsQmFzZVBhcmVudCB7IHVzaW5nIHR5cGUgPSBJbnN0cnVjdGlvbjsgfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IENhbGxCYXNlUGFyZW50PEludm9rZUluc3Q+IHsgdXNpbmcgdHlwZSA9IFRlcm1pbmF0b3JJbnN0OyB9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEJhc2UgY2xhc3MgZm9yIGFsbCBjYWxsYWJsZSBpbnN0cnVjdGlvbnMgKEludm9rZUluc3QgYW5kIENhbGxJbnN0KQorLy8vIEhvbGRzIGV2ZXJ5dGhpbmcgcmVsYXRlZCB0byBjYWxsaW5nIGEgZnVuY3Rpb24sIGFic3RyYWN0aW5nIGZyb20gdGhlIGJhc2UKKy8vLyB0eXBlIEBwIEJhc2VJbnN0VHkgYW5kIHRoZSBjb25jcmV0ZSBpbnN0cnVjdGlvbiBAcCBJbnN0VHkKKy8vLwordGVtcGxhdGUgPGNsYXNzIEluc3RUeT4KK2NsYXNzIENhbGxCYXNlIDogcHVibGljIENhbGxCYXNlUGFyZW50PEluc3RUeT46OnR5cGUsCisgICAgICAgICAgICAgICAgIHB1YmxpYyBPcGVyYW5kQnVuZGxlVXNlcjxJbnN0VHksIFVzZXI6Om9wX2l0ZXJhdG9yPiB7Citwcm90ZWN0ZWQ6CisgIEF0dHJpYnV0ZUxpc3QgQXR0cnM7IC8vLzwgcGFyYW1ldGVyIGF0dHJpYnV0ZXMgZm9yIGNhbGxhYmxlCisgIEZ1bmN0aW9uVHlwZSAqRlR5OworICB1c2luZyBCYXNlSW5zdFR5ID0gdHlwZW5hbWUgQ2FsbEJhc2VQYXJlbnQ8SW5zdFR5Pjo6dHlwZTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gQXJnc1R5PgorICBDYWxsQmFzZShBdHRyaWJ1dGVMaXN0IGNvbnN0ICZBLCBGdW5jdGlvblR5cGUgKkZULCBBcmdzVHkgJiYuLi4gQXJncykKKyAgICAgIDogQmFzZUluc3RUeShzdGQ6OmZvcndhcmQ8QXJnc1R5PihBcmdzKS4uLiksIEF0dHJzKEEpLCBGVHkoRlQpIHt9CisgIGJvb2wgaGFzRGVzY3JpcHRvcigpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOjpIYXNEZXNjcmlwdG9yOyB9CisKKyAgdXNpbmcgQmFzZUluc3RUeTo6QmFzZUluc3RUeTsKKworICB1c2luZyBPcGVyYW5kQnVuZGxlVXNlcjxJbnN0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVzZXI6Om9wX2l0ZXJhdG9yPjo6aXNGbkF0dHJEaXNhbGxvd2VkQnlPcEJ1bmRsZTsKKyAgdXNpbmcgT3BlcmFuZEJ1bmRsZVVzZXI8SW5zdFR5LCBVc2VyOjpvcF9pdGVyYXRvcj46OmdldE51bVRvdGFsQnVuZGxlT3BlcmFuZHM7CisgIHVzaW5nIE9wZXJhbmRCdW5kbGVVc2VyPEluc3RUeSwgVXNlcjo6b3BfaXRlcmF0b3I+OjpidW5kbGVPcGVyYW5kSGFzQXR0cjsKKyAgdXNpbmcgSW5zdHJ1Y3Rpb246OmdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbjsKKyAgdXNpbmcgSW5zdHJ1Y3Rpb246OnNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhOworCitwdWJsaWM6CisgIHVzaW5nIEluc3RydWN0aW9uOjpnZXRDb250ZXh0OworICB1c2luZyBPcGVyYW5kQnVuZGxlVXNlcjxJbnN0VHksIFVzZXI6Om9wX2l0ZXJhdG9yPjo6aGFzT3BlcmFuZEJ1bmRsZXM7CisgIHVzaW5nIE9wZXJhbmRCdW5kbGVVc2VyPEluc3RUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVXNlcjo6b3BfaXRlcmF0b3I+OjpnZXRCdW5kbGVPcGVyYW5kc1N0YXJ0SW5kZXg7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIGxsdm1fdW5yZWFjaGFibGUoCisgICAgICAgICJDYWxsQmFzZSBpcyBub3QgbWVhbnQgdG8gYmUgdXNlZCBhcyBwYXJ0IG9mIHRoZSBjbGFzc29mIGhpZXJhcmNoeSIpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIFJldHVybiB0aGUgcGFyYW1ldGVyIGF0dHJpYnV0ZXMgZm9yIHRoaXMgY2FsbC4KKyAgLy8vCisgIEF0dHJpYnV0ZUxpc3QgZ2V0QXR0cmlidXRlcygpIGNvbnN0IHsgcmV0dXJuIEF0dHJzOyB9CisKKyAgLy8vIFNldCB0aGUgcGFyYW1ldGVyIGF0dHJpYnV0ZXMgZm9yIHRoaXMgY2FsbC4KKyAgLy8vCisgIHZvaWQgc2V0QXR0cmlidXRlcyhBdHRyaWJ1dGVMaXN0IEEpIHsgQXR0cnMgPSBBOyB9CisKKyAgRnVuY3Rpb25UeXBlICpnZXRGdW5jdGlvblR5cGUoKSBjb25zdCB7IHJldHVybiBGVHk7IH0KKworICB2b2lkIG11dGF0ZUZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUgKkZUeSkgeworICAgIFZhbHVlOjptdXRhdGVUeXBlKEZUeS0+Z2V0UmV0dXJuVHlwZSgpKTsKKyAgICB0aGlzLT5GVHkgPSBGVHk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgY2FsbCBhcmd1bWVudHMuCisgIC8vLworICB1bnNpZ25lZCBnZXROdW1BcmdPcGVyYW5kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKSAtIGdldE51bVRvdGFsQnVuZGxlT3BlcmFuZHMoKSAtIEluc3RUeTo6QXJnT2Zmc2V0OworICB9CisKKyAgLy8vIGdldEFyZ09wZXJhbmQvc2V0QXJnT3BlcmFuZCAtIFJldHVybi9zZXQgdGhlIGktdGggY2FsbCBhcmd1bWVudC4KKyAgLy8vCisgIFZhbHVlICpnZXRBcmdPcGVyYW5kKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IGdldE51bUFyZ09wZXJhbmRzKCkgJiYgIk91dCBvZiBib3VuZHMhIik7CisgICAgcmV0dXJuIGdldE9wZXJhbmQoaSk7CisgIH0KKyAgdm9pZCBzZXRBcmdPcGVyYW5kKHVuc2lnbmVkIGksIFZhbHVlICp2KSB7CisgICAgYXNzZXJ0KGkgPCBnZXROdW1BcmdPcGVyYW5kcygpICYmICJPdXQgb2YgYm91bmRzISIpOworICAgIHNldE9wZXJhbmQoaSwgdik7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBpdGVyYXRvciBwb2ludGluZyB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhcmd1bWVudCBsaXN0LgorICBVc2VyOjpvcF9pdGVyYXRvciBhcmdfYmVnaW4oKSB7IHJldHVybiBvcF9iZWdpbigpOyB9CisKKyAgLy8vIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGVuZCBvZiB0aGUgYXJndW1lbnQgbGlzdC4KKyAgVXNlcjo6b3BfaXRlcmF0b3IgYXJnX2VuZCgpIHsKKyAgICAvLyBbIGNhbGwgYXJncyBdLCBbIG9wZXJhbmQgYnVuZGxlcyBdLCBjYWxsZWUKKyAgICByZXR1cm4gb3BfZW5kKCkgLSBnZXROdW1Ub3RhbEJ1bmRsZU9wZXJhbmRzKCkgLSBJbnN0VHk6OkFyZ09mZnNldDsKKyAgfQorCisgIC8vLyBJdGVyYXRpb24gYWRhcHRlciBmb3IgcmFuZ2UtZm9yIGxvb3BzLgorICBpdGVyYXRvcl9yYW5nZTxVc2VyOjpvcF9pdGVyYXRvcj4gYXJnX29wZXJhbmRzKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGFyZ19iZWdpbigpLCBhcmdfZW5kKCkpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgaXRlcmF0b3IgcG9pbnRpbmcgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYXJndW1lbnQgbGlzdC4KKyAgVXNlcjo6Y29uc3Rfb3BfaXRlcmF0b3IgYXJnX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gb3BfYmVnaW4oKTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIGl0ZXJhdG9yIHBvaW50aW5nIHRvIHRoZSBlbmQgb2YgdGhlIGFyZ3VtZW50IGxpc3QuCisgIFVzZXI6OmNvbnN0X29wX2l0ZXJhdG9yIGFyZ19lbmQoKSBjb25zdCB7CisgICAgLy8gWyBjYWxsIGFyZ3MgXSwgWyBvcGVyYW5kIGJ1bmRsZXMgXSwgY2FsbGVlCisgICAgcmV0dXJuIG9wX2VuZCgpIC0gZ2V0TnVtVG90YWxCdW5kbGVPcGVyYW5kcygpIC0gSW5zdFR5OjpBcmdPZmZzZXQ7CisgIH0KKworICAvLy8gSXRlcmF0aW9uIGFkYXB0ZXIgZm9yIHJhbmdlLWZvciBsb29wcy4KKyAgaXRlcmF0b3JfcmFuZ2U8VXNlcjo6Y29uc3Rfb3BfaXRlcmF0b3I+IGFyZ19vcGVyYW5kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShhcmdfYmVnaW4oKSwgYXJnX2VuZCgpKTsKKyAgfQorCisgIC8vLyBXcmFwcGVycyBmb3IgZ2V0dGluZyB0aGUgXGMgVXNlIG9mIGEgY2FsbCBhcmd1bWVudC4KKyAgY29uc3QgVXNlICZnZXRBcmdPcGVyYW5kVXNlKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IGdldE51bUFyZ09wZXJhbmRzKCkgJiYgIk91dCBvZiBib3VuZHMhIik7CisgICAgcmV0dXJuIFVzZXI6OmdldE9wZXJhbmRVc2UoaSk7CisgIH0KKyAgVXNlICZnZXRBcmdPcGVyYW5kVXNlKHVuc2lnbmVkIGkpIHsKKyAgICBhc3NlcnQoaSA8IGdldE51bUFyZ09wZXJhbmRzKCkgJiYgIk91dCBvZiBib3VuZHMhIik7CisgICAgcmV0dXJuIFVzZXI6OmdldE9wZXJhbmRVc2UoaSk7CisgIH0KKworICAvLy8gSWYgb25lIG9mIHRoZSBhcmd1bWVudHMgaGFzIHRoZSAncmV0dXJuZWQnIGF0dHJpYnV0ZSwgcmV0dXJuIGl0cworICAvLy8gb3BlcmFuZCB2YWx1ZS4gT3RoZXJ3aXNlLCByZXR1cm4gbnVsbHB0ci4KKyAgVmFsdWUgKmdldFJldHVybmVkQXJnT3BlcmFuZCgpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBJbmRleDsKKworICAgIGlmIChBdHRycy5oYXNBdHRyU29tZXdoZXJlKEF0dHJpYnV0ZTo6UmV0dXJuZWQsICZJbmRleCkgJiYgSW5kZXgpCisgICAgICByZXR1cm4gZ2V0QXJnT3BlcmFuZChJbmRleCAtIEF0dHJpYnV0ZUxpc3Q6OkZpcnN0QXJnSW5kZXgpOworICAgIGlmIChjb25zdCBGdW5jdGlvbiAqRiA9IGdldENhbGxlZEZ1bmN0aW9uKCkpCisgICAgICBpZiAoRi0+Z2V0QXR0cmlidXRlcygpLmhhc0F0dHJTb21ld2hlcmUoQXR0cmlidXRlOjpSZXR1cm5lZCwgJkluZGV4KSAmJgorICAgICAgICAgIEluZGV4KQorICAgICAgICByZXR1cm4gZ2V0QXJnT3BlcmFuZChJbmRleCAtIEF0dHJpYnV0ZUxpc3Q6OkZpcnN0QXJnSW5kZXgpOworCisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBVc2VyOjpvcF9pdGVyYXRvciBvcF9iZWdpbigpIHsKKyAgICByZXR1cm4gT3BlcmFuZFRyYWl0czxDYWxsQmFzZT46Om9wX2JlZ2luKHRoaXMpOworICB9CisKKyAgVXNlcjo6Y29uc3Rfb3BfaXRlcmF0b3Igb3BfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIE9wZXJhbmRUcmFpdHM8Q2FsbEJhc2U+OjpvcF9iZWdpbihjb25zdF9jYXN0PENhbGxCYXNlICo+KHRoaXMpKTsKKyAgfQorCisgIFVzZXI6Om9wX2l0ZXJhdG9yIG9wX2VuZCgpIHsgcmV0dXJuIE9wZXJhbmRUcmFpdHM8Q2FsbEJhc2U+OjpvcF9lbmQodGhpcyk7IH0KKworICBVc2VyOjpjb25zdF9vcF9pdGVyYXRvciBvcF9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIE9wZXJhbmRUcmFpdHM8Q2FsbEJhc2U+OjpvcF9lbmQoY29uc3RfY2FzdDxDYWxsQmFzZSAqPih0aGlzKSk7CisgIH0KKworICBWYWx1ZSAqZ2V0T3BlcmFuZCh1bnNpZ25lZCBpX25vY2FwdHVyZSkgY29uc3QgeworICAgIGFzc2VydChpX25vY2FwdHVyZSA8IE9wZXJhbmRUcmFpdHM8Q2FsbEJhc2U+OjpvcGVyYW5kcyh0aGlzKSAmJgorICAgICAgICAgICAiZ2V0T3BlcmFuZCgpIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPFZhbHVlPihPcGVyYW5kVHJhaXRzPENhbGxCYXNlPjo6b3BfYmVnaW4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8Q2FsbEJhc2UgKj4odGhpcykpW2lfbm9jYXB0dXJlXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0KCkpOworICB9CisKKyAgdm9pZCBzZXRPcGVyYW5kKHVuc2lnbmVkIGlfbm9jYXB0dXJlLCBWYWx1ZSAqVmFsX25vY2FwdHVyZSkgeworICAgIGFzc2VydChpX25vY2FwdHVyZSA8IE9wZXJhbmRUcmFpdHM8Q2FsbEJhc2U+OjpvcGVyYW5kcyh0aGlzKSAmJgorICAgICAgICAgICAic2V0T3BlcmFuZCgpIG91dCBvZiByYW5nZSEiKTsKKyAgICBPcGVyYW5kVHJhaXRzPENhbGxCYXNlPjo6b3BfYmVnaW4odGhpcylbaV9ub2NhcHR1cmVdID0gVmFsX25vY2FwdHVyZTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bU9wZXJhbmRzKCkgY29uc3QgeworICAgIHJldHVybiBPcGVyYW5kVHJhaXRzPENhbGxCYXNlPjo6b3BlcmFuZHModGhpcyk7CisgIH0KKyAgdGVtcGxhdGUgPGludCBJZHhfbm9jYXB0dXJlPiBVc2UgJk9wKCkgeworICAgIHJldHVybiBVc2VyOjpPcEZyb208SWR4X25vY2FwdHVyZT4odGhpcyk7CisgIH0KKyAgdGVtcGxhdGUgPGludCBJZHhfbm9jYXB0dXJlPiBjb25zdCBVc2UgJk9wKCkgY29uc3QgeworICAgIHJldHVybiBVc2VyOjpPcEZyb208SWR4X25vY2FwdHVyZT4odGhpcyk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBmdW5jdGlvbiBjYWxsZWQsIG9yIG51bGwgaWYgdGhpcyBpcyBhbgorICAvLy8gaW5kaXJlY3QgZnVuY3Rpb24gaW52b2NhdGlvbi4KKyAgLy8vCisgIEZ1bmN0aW9uICpnZXRDYWxsZWRGdW5jdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZHluX2Nhc3Q8RnVuY3Rpb24+KE9wPC1JbnN0VHk6OkFyZ09mZnNldD4oKSk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdGhpcyBjYWxsIGhhcyB0aGUgZ2l2ZW4gYXR0cmlidXRlLgorICBib29sIGhhc0ZuQXR0cihBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0IHsKKyAgICBhc3NlcnQoS2luZCAhPSBBdHRyaWJ1dGU6Ok5vQnVpbHRpbiAmJgorICAgICAgICAgICAiVXNlIENhbGxCYXNlOjppc05vQnVpbHRpbigpIHRvIGNoZWNrIGZvciBBdHRyaWJ1dGU6Ok5vQnVpbHRpbiIpOworICAgIHJldHVybiBoYXNGbkF0dHJJbXBsKEtpbmQpOworICB9CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoaXMgY2FsbCBoYXMgdGhlIGdpdmVuIGF0dHJpYnV0ZS4KKyAgYm9vbCBoYXNGbkF0dHIoU3RyaW5nUmVmIEtpbmQpIGNvbnN0IHsgcmV0dXJuIGhhc0ZuQXR0ckltcGwoS2luZCk7IH0KKworICAvLy8gZ2V0Q2FsbGluZ0NvbnYvc2V0Q2FsbGluZ0NvbnYgLSBHZXQgb3Igc2V0IHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gb2YgdGhpcworICAvLy8gZnVuY3Rpb24gY2FsbC4KKyAgQ2FsbGluZ0NvbnY6OklEIGdldENhbGxpbmdDb252KCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxDYWxsaW5nQ29udjo6SUQ+KGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpID4+IDIpOworICB9CisgIHZvaWQgc2V0Q2FsbGluZ0NvbnYoQ2FsbGluZ0NvbnY6OklEIENDKSB7CisgICAgYXV0byBJRCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkPihDQyk7CisgICAgYXNzZXJ0KCEoSUQgJiB+Q2FsbGluZ0NvbnY6Ok1heElEKSAmJiAiVW5zdXBwb3J0ZWQgY2FsbGluZyBjb252ZW50aW9uIik7CisgICAgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgMykgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJRCA8PCAyKSk7CisgIH0KKworCisgIC8vLyBhZGRzIHRoZSBhdHRyaWJ1dGUgdG8gdGhlIGxpc3Qgb2YgYXR0cmlidXRlcy4KKyAgdm9pZCBhZGRBdHRyaWJ1dGUodW5zaWduZWQgaSwgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSB7CisgICAgQXR0cmlidXRlTGlzdCBQQUwgPSBnZXRBdHRyaWJ1dGVzKCk7CisgICAgUEFMID0gUEFMLmFkZEF0dHJpYnV0ZShnZXRDb250ZXh0KCksIGksIEtpbmQpOworICAgIHNldEF0dHJpYnV0ZXMoUEFMKTsKKyAgfQorCisgIC8vLyBhZGRzIHRoZSBhdHRyaWJ1dGUgdG8gdGhlIGxpc3Qgb2YgYXR0cmlidXRlcy4KKyAgdm9pZCBhZGRBdHRyaWJ1dGUodW5zaWduZWQgaSwgQXR0cmlidXRlIEF0dHIpIHsKKyAgICBBdHRyaWJ1dGVMaXN0IFBBTCA9IGdldEF0dHJpYnV0ZXMoKTsKKyAgICBQQUwgPSBQQUwuYWRkQXR0cmlidXRlKGdldENvbnRleHQoKSwgaSwgQXR0cik7CisgICAgc2V0QXR0cmlidXRlcyhQQUwpOworICB9CisKKyAgLy8vIEFkZHMgdGhlIGF0dHJpYnV0ZSB0byB0aGUgaW5kaWNhdGVkIGFyZ3VtZW50CisgIHZvaWQgYWRkUGFyYW1BdHRyKHVuc2lnbmVkIEFyZ05vLCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIHsKKyAgICBhc3NlcnQoQXJnTm8gPCBnZXROdW1BcmdPcGVyYW5kcygpICYmICJPdXQgb2YgYm91bmRzIik7CisgICAgQXR0cmlidXRlTGlzdCBQQUwgPSBnZXRBdHRyaWJ1dGVzKCk7CisgICAgUEFMID0gUEFMLmFkZFBhcmFtQXR0cmlidXRlKGdldENvbnRleHQoKSwgQXJnTm8sIEtpbmQpOworICAgIHNldEF0dHJpYnV0ZXMoUEFMKTsKKyAgfQorCisgIC8vLyBBZGRzIHRoZSBhdHRyaWJ1dGUgdG8gdGhlIGluZGljYXRlZCBhcmd1bWVudAorICB2b2lkIGFkZFBhcmFtQXR0cih1bnNpZ25lZCBBcmdObywgQXR0cmlidXRlIEF0dHIpIHsKKyAgICBhc3NlcnQoQXJnTm8gPCBnZXROdW1BcmdPcGVyYW5kcygpICYmICJPdXQgb2YgYm91bmRzIik7CisgICAgQXR0cmlidXRlTGlzdCBQQUwgPSBnZXRBdHRyaWJ1dGVzKCk7CisgICAgUEFMID0gUEFMLmFkZFBhcmFtQXR0cmlidXRlKGdldENvbnRleHQoKSwgQXJnTm8sIEF0dHIpOworICAgIHNldEF0dHJpYnV0ZXMoUEFMKTsKKyAgfQorCisgIC8vLyByZW1vdmVzIHRoZSBhdHRyaWJ1dGUgZnJvbSB0aGUgbGlzdCBvZiBhdHRyaWJ1dGVzLgorICB2b2lkIHJlbW92ZUF0dHJpYnV0ZSh1bnNpZ25lZCBpLCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIHsKKyAgICBBdHRyaWJ1dGVMaXN0IFBBTCA9IGdldEF0dHJpYnV0ZXMoKTsKKyAgICBQQUwgPSBQQUwucmVtb3ZlQXR0cmlidXRlKGdldENvbnRleHQoKSwgaSwgS2luZCk7CisgICAgc2V0QXR0cmlidXRlcyhQQUwpOworICB9CisKKyAgLy8vIHJlbW92ZXMgdGhlIGF0dHJpYnV0ZSBmcm9tIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMuCisgIHZvaWQgcmVtb3ZlQXR0cmlidXRlKHVuc2lnbmVkIGksIFN0cmluZ1JlZiBLaW5kKSB7CisgICAgQXR0cmlidXRlTGlzdCBQQUwgPSBnZXRBdHRyaWJ1dGVzKCk7CisgICAgUEFMID0gUEFMLnJlbW92ZUF0dHJpYnV0ZShnZXRDb250ZXh0KCksIGksIEtpbmQpOworICAgIHNldEF0dHJpYnV0ZXMoUEFMKTsKKyAgfQorCisgIC8vLyBSZW1vdmVzIHRoZSBhdHRyaWJ1dGUgZnJvbSB0aGUgZ2l2ZW4gYXJndW1lbnQKKyAgdm9pZCByZW1vdmVQYXJhbUF0dHIodW5zaWduZWQgQXJnTm8sIEF0dHJpYnV0ZTo6QXR0cktpbmQgS2luZCkgeworICAgIGFzc2VydChBcmdObyA8IGdldE51bUFyZ09wZXJhbmRzKCkgJiYgIk91dCBvZiBib3VuZHMiKTsKKyAgICBBdHRyaWJ1dGVMaXN0IFBBTCA9IGdldEF0dHJpYnV0ZXMoKTsKKyAgICBQQUwgPSBQQUwucmVtb3ZlUGFyYW1BdHRyaWJ1dGUoZ2V0Q29udGV4dCgpLCBBcmdObywgS2luZCk7CisgICAgc2V0QXR0cmlidXRlcyhQQUwpOworICB9CisKKyAgLy8vIFJlbW92ZXMgdGhlIGF0dHJpYnV0ZSBmcm9tIHRoZSBnaXZlbiBhcmd1bWVudAorICB2b2lkIHJlbW92ZVBhcmFtQXR0cih1bnNpZ25lZCBBcmdObywgU3RyaW5nUmVmIEtpbmQpIHsKKyAgICBhc3NlcnQoQXJnTm8gPCBnZXROdW1BcmdPcGVyYW5kcygpICYmICJPdXQgb2YgYm91bmRzIik7CisgICAgQXR0cmlidXRlTGlzdCBQQUwgPSBnZXRBdHRyaWJ1dGVzKCk7CisgICAgUEFMID0gUEFMLnJlbW92ZVBhcmFtQXR0cmlidXRlKGdldENvbnRleHQoKSwgQXJnTm8sIEtpbmQpOworICAgIHNldEF0dHJpYnV0ZXMoUEFMKTsKKyAgfQorCisgIC8vLyBhZGRzIHRoZSBkZXJlZmVyZW5jZWFibGUgYXR0cmlidXRlIHRvIHRoZSBsaXN0IG9mIGF0dHJpYnV0ZXMuCisgIHZvaWQgYWRkRGVyZWZlcmVuY2VhYmxlQXR0cih1bnNpZ25lZCBpLCB1aW50NjRfdCBCeXRlcykgeworICAgIEF0dHJpYnV0ZUxpc3QgUEFMID0gZ2V0QXR0cmlidXRlcygpOworICAgIFBBTCA9IFBBTC5hZGREZXJlZmVyZW5jZWFibGVBdHRyKGdldENvbnRleHQoKSwgaSwgQnl0ZXMpOworICAgIHNldEF0dHJpYnV0ZXMoUEFMKTsKKyAgfQorCisgIC8vLyBhZGRzIHRoZSBkZXJlZmVyZW5jZWFibGVfb3JfbnVsbCBhdHRyaWJ1dGUgdG8gdGhlIGxpc3Qgb2YKKyAgLy8vIGF0dHJpYnV0ZXMuCisgIHZvaWQgYWRkRGVyZWZlcmVuY2VhYmxlT3JOdWxsQXR0cih1bnNpZ25lZCBpLCB1aW50NjRfdCBCeXRlcykgeworICAgIEF0dHJpYnV0ZUxpc3QgUEFMID0gZ2V0QXR0cmlidXRlcygpOworICAgIFBBTCA9IFBBTC5hZGREZXJlZmVyZW5jZWFibGVPck51bGxBdHRyKGdldENvbnRleHQoKSwgaSwgQnl0ZXMpOworICAgIHNldEF0dHJpYnV0ZXMoUEFMKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgd2hldGhlciB0aGUgcmV0dXJuIHZhbHVlIGhhcyB0aGUgZ2l2ZW4gYXR0cmlidXRlLgorICBib29sIGhhc1JldEF0dHIoQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdCB7CisgICAgaWYgKEF0dHJzLmhhc0F0dHJpYnV0ZShBdHRyaWJ1dGVMaXN0OjpSZXR1cm5JbmRleCwgS2luZCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIExvb2sgYXQgdGhlIGNhbGxlZSwgaWYgYXZhaWxhYmxlLgorICAgIGlmIChjb25zdCBGdW5jdGlvbiAqRiA9IGdldENhbGxlZEZ1bmN0aW9uKCkpCisgICAgICByZXR1cm4gRi0+Z2V0QXR0cmlidXRlcygpLmhhc0F0dHJpYnV0ZShBdHRyaWJ1dGVMaXN0OjpSZXR1cm5JbmRleCwgS2luZCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIHRoZSBhcmd1bWVudCBvciBwYXJhbWV0ZXIgaGFzIHRoZSBnaXZlbiBhdHRyaWJ1dGUuCisgIGJvb2wgcGFyYW1IYXNBdHRyKHVuc2lnbmVkIEFyZ05vLCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0IHsKKyAgICBhc3NlcnQoQXJnTm8gPCBnZXROdW1BcmdPcGVyYW5kcygpICYmICJQYXJhbSBpbmRleCBvdXQgb2YgYm91bmRzISIpOworCisgICAgaWYgKEF0dHJzLmhhc1BhcmFtQXR0cmlidXRlKEFyZ05vLCBLaW5kKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChjb25zdCBGdW5jdGlvbiAqRiA9IGdldENhbGxlZEZ1bmN0aW9uKCkpCisgICAgICByZXR1cm4gRi0+Z2V0QXR0cmlidXRlcygpLmhhc1BhcmFtQXR0cmlidXRlKEFyZ05vLCBLaW5kKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gR2V0IHRoZSBhdHRyaWJ1dGUgb2YgYSBnaXZlbiBraW5kIGF0IGEgcG9zaXRpb24uCisgIEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUodW5zaWduZWQgaSwgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEF0dHJpYnV0ZXMoKS5nZXRBdHRyaWJ1dGUoaSwgS2luZCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBhdHRyaWJ1dGUgb2YgYSBnaXZlbiBraW5kIGF0IGEgcG9zaXRpb24uCisgIEF0dHJpYnV0ZSBnZXRBdHRyaWJ1dGUodW5zaWduZWQgaSwgU3RyaW5nUmVmIEtpbmQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QXR0cmlidXRlcygpLmdldEF0dHJpYnV0ZShpLCBLaW5kKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGF0dHJpYnV0ZSBvZiBhIGdpdmVuIGtpbmQgZnJvbSBhIGdpdmVuIGFyZworICBBdHRyaWJ1dGUgZ2V0UGFyYW1BdHRyKHVuc2lnbmVkIEFyZ05vLCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEtpbmQpIGNvbnN0IHsKKyAgICBhc3NlcnQoQXJnTm8gPCBnZXROdW1BcmdPcGVyYW5kcygpICYmICJPdXQgb2YgYm91bmRzIik7CisgICAgcmV0dXJuIGdldEF0dHJpYnV0ZXMoKS5nZXRQYXJhbUF0dHIoQXJnTm8sIEtpbmQpOworICB9CisKKyAgLy8vIEdldCB0aGUgYXR0cmlidXRlIG9mIGEgZ2l2ZW4ga2luZCBmcm9tIGEgZ2l2ZW4gYXJnCisgIEF0dHJpYnV0ZSBnZXRQYXJhbUF0dHIodW5zaWduZWQgQXJnTm8sIFN0cmluZ1JlZiBLaW5kKSBjb25zdCB7CisgICAgYXNzZXJ0KEFyZ05vIDwgZ2V0TnVtQXJnT3BlcmFuZHMoKSAmJiAiT3V0IG9mIGJvdW5kcyIpOworICAgIHJldHVybiBnZXRBdHRyaWJ1dGVzKCkuZ2V0UGFyYW1BdHRyKEFyZ05vLCBLaW5kKTsKKyAgfQorICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGRhdGEgb3BlcmFuZCBhdCBpbmRleCBccCBpIGhhcyB0aGUgYXR0cmlidXRlIFxwCisgIC8vLyBBLgorICAvLy8KKyAgLy8vIERhdGEgb3BlcmFuZHMgaW5jbHVkZSBjYWxsIGFyZ3VtZW50cyBhbmQgdmFsdWVzIHVzZWQgaW4gb3BlcmFuZCBidW5kbGVzLAorICAvLy8gYnV0IGRvZXMgbm90IGluY2x1ZGUgdGhlIGNhbGxlZSBvcGVyYW5kLiAgVGhpcyByb3V0aW5lIGRpc3BhdGNoZXMgdG8gdGhlCisgIC8vLyB1bmRlcmx5aW5nIEF0dHJpYnV0ZUxpc3Qgb3IgdGhlIE9wZXJhbmRCdW5kbGVVc2VyIGFzIGFwcHJvcHJpYXRlLgorICAvLy8KKyAgLy8vIFRoZSBpbmRleCBccCBpIGlzIGludGVycHJldGVkIGFzCisgIC8vLworICAvLy8gIFxwIGkgPT0gQXR0cmlidXRlOjpSZXR1cm5JbmRleCAgLT4gdGhlIHJldHVybiB2YWx1ZQorICAvLy8gIFxwIGkgaW4gWzEsIGFyZ19zaXplICsgMSkgIC0+IGFyZ3VtZW50IG51bWJlciAoXHAgaSAtIDEpCisgIC8vLyAgXHAgaSBpbiBbYXJnX3NpemUgKyAxLCBkYXRhX29wZXJhbmRfc2l6ZSArIDEpIC0+IGJ1bmRsZSBvcGVyYW5kIGF0IGluZGV4CisgIC8vLyAgICAgKFxwIGkgLSAxKSBpbiB0aGUgb3BlcmFuZCBsaXN0LgorICBib29sIGRhdGFPcGVyYW5kSGFzSW1wbGllZEF0dHIodW5zaWduZWQgaSwgQXR0cmlidXRlOjpBdHRyS2luZCBLaW5kKSBjb25zdCB7CisgICAgLy8gVGhlcmUgYXJlIGdldE51bU9wZXJhbmRzKCkgLSAoSW5zdFR5OjpBcmdPZmZzZXQgLSAxKSBkYXRhIG9wZXJhbmRzLgorICAgIC8vIFRoZSBsYXN0IG9wZXJhbmQgaXMgdGhlIGNhbGxlZS4KKyAgICBhc3NlcnQoaSA8IChnZXROdW1PcGVyYW5kcygpIC0gSW5zdFR5OjpBcmdPZmZzZXQgKyAxKSAmJgorICAgICAgICAgICAiRGF0YSBvcGVyYW5kIGluZGV4IG91dCBvZiBib3VuZHMhIik7CisKKyAgICAvLyBUaGUgYXR0cmlidXRlIEEgY2FuIGVpdGhlciBiZSBkaXJlY3RseSBzcGVjaWZpZWQsIGlmIHRoZSBvcGVyYW5kIGluCisgICAgLy8gcXVlc3Rpb24gaXMgYSBjYWxsIGFyZ3VtZW50OyBvciBiZSBpbmRpcmVjdGx5IGltcGxpZWQgYnkgdGhlIGtpbmQgb2YgaXRzCisgICAgLy8gY29udGFpbmluZyBvcGVyYW5kIGJ1bmRsZSwgaWYgdGhlIG9wZXJhbmQgaXMgYSBidW5kbGUgb3BlcmFuZC4KKworICAgIGlmIChpID09IEF0dHJpYnV0ZUxpc3Q6OlJldHVybkluZGV4KQorICAgICAgcmV0dXJuIGhhc1JldEF0dHIoS2luZCk7CisKKyAgICAvLyBGSVhNRTogQXZvaWQgdGhlc2UgaSAtIDEgY2FsY3VsYXRpb25zIGFuZCB1cGRhdGUgdGhlIEFQSSB0byB1c2UKKyAgICAvLyB6ZXJvLWJhc2VkIGluZGljZXMuCisgICAgaWYgKGkgPCAoZ2V0TnVtQXJnT3BlcmFuZHMoKSArIDEpKQorICAgICAgcmV0dXJuIHBhcmFtSGFzQXR0cihpIC0gMSwgS2luZCk7CisKKyAgICBhc3NlcnQoaGFzT3BlcmFuZEJ1bmRsZXMoKSAmJiBpID49IChnZXRCdW5kbGVPcGVyYW5kc1N0YXJ0SW5kZXgoKSArIDEpICYmCisgICAgICAgICAgICJNdXN0IGJlIGVpdGhlciBhIGNhbGwgYXJndW1lbnQgb3IgYW4gb3BlcmFuZCBidW5kbGUhIik7CisgICAgcmV0dXJuIGJ1bmRsZU9wZXJhbmRIYXNBdHRyKGkgLSAxLCBLaW5kKTsKKyAgfQorCisgIC8vLyBFeHRyYWN0IHRoZSBhbGlnbm1lbnQgb2YgdGhlIHJldHVybiB2YWx1ZS4KKyAgdW5zaWduZWQgZ2V0UmV0QWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gQXR0cnMuZ2V0UmV0QWxpZ25tZW50KCk7IH0KKworICAvLy8gRXh0cmFjdCB0aGUgYWxpZ25tZW50IGZvciBhIGNhbGwgb3IgcGFyYW1ldGVyICgwPXVua25vd24pLgorICB1bnNpZ25lZCBnZXRQYXJhbUFsaWdubWVudCh1bnNpZ25lZCBBcmdObykgY29uc3QgeworICAgIHJldHVybiBBdHRycy5nZXRQYXJhbUFsaWdubWVudChBcmdObyk7CisgIH0KKworICAvLy8gRXh0cmFjdCB0aGUgbnVtYmVyIG9mIGRlcmVmZXJlbmNlYWJsZSBieXRlcyBmb3IgYSBjYWxsIG9yCisgIC8vLyBwYXJhbWV0ZXIgKDA9dW5rbm93bikuCisgIHVpbnQ2NF90IGdldERlcmVmZXJlbmNlYWJsZUJ5dGVzKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICByZXR1cm4gQXR0cnMuZ2V0RGVyZWZlcmVuY2VhYmxlQnl0ZXMoaSk7CisgIH0KKworICAvLy8gRXh0cmFjdCB0aGUgbnVtYmVyIG9mIGRlcmVmZXJlbmNlYWJsZV9vcl9udWxsIGJ5dGVzIGZvciBhIGNhbGwgb3IKKyAgLy8vIHBhcmFtZXRlciAoMD11bmtub3duKS4KKyAgdWludDY0X3QgZ2V0RGVyZWZlcmVuY2VhYmxlT3JOdWxsQnl0ZXModW5zaWduZWQgaSkgY29uc3QgeworICAgIHJldHVybiBBdHRycy5nZXREZXJlZmVyZW5jZWFibGVPck51bGxCeXRlcyhpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSByZXR1cm4gdmFsdWUgaXMgbWFya2VkIHdpdGggTm9BbGlhcyBhdHRyaWJ1dGUuCisgIGJvb2wgcmV0dXJuRG9lc05vdEFsaWFzKCkgY29uc3QgeworICAgIHJldHVybiBBdHRycy5oYXNBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6UmV0dXJuSW5kZXgsIEF0dHJpYnV0ZTo6Tm9BbGlhcyk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGNhbGwgc2hvdWxkIG5vdCBiZSB0cmVhdGVkIGFzIGEgY2FsbCB0byBhCisgIC8vLyBidWlsdGluLgorICBib29sIGlzTm9CdWlsdGluKCkgY29uc3QgeworICAgIHJldHVybiBoYXNGbkF0dHJJbXBsKEF0dHJpYnV0ZTo6Tm9CdWlsdGluKSAmJgorICAgICAgIWhhc0ZuQXR0ckltcGwoQXR0cmlidXRlOjpCdWlsdGluKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIGNhbGwgcmVxdWlyZXMgc3RyaWN0IGZsb2F0aW5nIHBvaW50IHNlbWFudGljcy4KKyAgYm9vbCBpc1N0cmljdEZQKCkgY29uc3QgeyByZXR1cm4gaGFzRm5BdHRyKEF0dHJpYnV0ZTo6U3RyaWN0RlApOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBjYWxsIHNob3VsZCBub3QgYmUgaW5saW5lZC4KKyAgYm9vbCBpc05vSW5saW5lKCkgY29uc3QgeyByZXR1cm4gaGFzRm5BdHRyKEF0dHJpYnV0ZTo6Tm9JbmxpbmUpOyB9CisgIHZvaWQgc2V0SXNOb0lubGluZSgpIHsKKyAgICBhZGRBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cmlidXRlOjpOb0lubGluZSk7CisgIH0KKyAgLy8vIERldGVybWluZSBpZiB0aGUgY2FsbCBkb2VzIG5vdCBhY2Nlc3MgbWVtb3J5LgorICBib29sIGRvZXNOb3RBY2Nlc3NNZW1vcnkoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0ZuQXR0cihBdHRyaWJ1dGU6OlJlYWROb25lKTsKKyAgfQorICB2b2lkIHNldERvZXNOb3RBY2Nlc3NNZW1vcnkoKSB7CisgICAgYWRkQXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHJpYnV0ZTo6UmVhZE5vbmUpOworICB9CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgY2FsbCBkb2VzIG5vdCBhY2Nlc3Mgb3Igb25seSByZWFkcyBtZW1vcnkuCisgIGJvb2wgb25seVJlYWRzTWVtb3J5KCkgY29uc3QgeworICAgIHJldHVybiBkb2VzTm90QWNjZXNzTWVtb3J5KCkgfHwgaGFzRm5BdHRyKEF0dHJpYnV0ZTo6UmVhZE9ubHkpOworICB9CisgIHZvaWQgc2V0T25seVJlYWRzTWVtb3J5KCkgeworICAgIGFkZEF0dHJpYnV0ZShBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRyaWJ1dGU6OlJlYWRPbmx5KTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIGNhbGwgZG9lcyBub3QgYWNjZXNzIG9yIG9ubHkgd3JpdGVzIG1lbW9yeS4KKyAgYm9vbCBkb2VzTm90UmVhZE1lbW9yeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZG9lc05vdEFjY2Vzc01lbW9yeSgpIHx8IGhhc0ZuQXR0cihBdHRyaWJ1dGU6OldyaXRlT25seSk7CisgIH0KKyAgdm9pZCBzZXREb2VzTm90UmVhZE1lbW9yeSgpIHsKKyAgICBhZGRBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cmlidXRlOjpXcml0ZU9ubHkpOworICB9CisKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIGNhbGwgY2FuIGFjY2VzcyBtZW1tb3J5IG9ubHkgdXNpbmcgcG9pbnRlcnMgYmFzZWQKKyAgLy8vIG9uIGl0cyBhcmd1bWVudHMuCisgIGJvb2wgb25seUFjY2Vzc2VzQXJnTWVtb3J5KCkgY29uc3QgeworICAgIHJldHVybiBoYXNGbkF0dHIoQXR0cmlidXRlOjpBcmdNZW1Pbmx5KTsKKyAgfQorICB2b2lkIHNldE9ubHlBY2Nlc3Nlc0FyZ01lbW9yeSgpIHsKKyAgICBhZGRBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cmlidXRlOjpBcmdNZW1Pbmx5KTsKKyAgfQorCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBmdW5jdGlvbiBtYXkgb25seSBhY2Nlc3MgbWVtb3J5IHRoYXQgaXMKKyAgLy8vIGluYWNjZXNzaWJsZSBmcm9tIHRoZSBJUi4KKyAgYm9vbCBvbmx5QWNjZXNzZXNJbmFjY2Vzc2libGVNZW1vcnkoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0ZuQXR0cihBdHRyaWJ1dGU6OkluYWNjZXNzaWJsZU1lbU9ubHkpOworICB9CisgIHZvaWQgc2V0T25seUFjY2Vzc2VzSW5hY2Nlc3NpYmxlTWVtb3J5KCkgeworICAgIGFkZEF0dHJpYnV0ZShBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRyaWJ1dGU6OkluYWNjZXNzaWJsZU1lbU9ubHkpOworICB9CisKKyAgLy8vIEBicmllZiBEZXRlcm1pbmUgaWYgdGhlIGZ1bmN0aW9uIG1heSBvbmx5IGFjY2VzcyBtZW1vcnkgdGhhdCBpcworICAvLy8gZWl0aGVyIGluYWNjZXNzaWJsZSBmcm9tIHRoZSBJUiBvciBwb2ludGVkIHRvIGJ5IGl0cyBhcmd1bWVudHMuCisgIGJvb2wgb25seUFjY2Vzc2VzSW5hY2Nlc3NpYmxlTWVtT3JBcmdNZW0oKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0ZuQXR0cihBdHRyaWJ1dGU6OkluYWNjZXNzaWJsZU1lbU9yQXJnTWVtT25seSk7CisgIH0KKyAgdm9pZCBzZXRPbmx5QWNjZXNzZXNJbmFjY2Vzc2libGVNZW1PckFyZ01lbSgpIHsKKyAgICBhZGRBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cmlidXRlOjpJbmFjY2Vzc2libGVNZW1PckFyZ01lbU9ubHkpOworICB9CisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIGNhbGwgY2Fubm90IHJldHVybi4KKyAgYm9vbCBkb2VzTm90UmV0dXJuKCkgY29uc3QgeyByZXR1cm4gaGFzRm5BdHRyKEF0dHJpYnV0ZTo6Tm9SZXR1cm4pOyB9CisgIHZvaWQgc2V0RG9lc05vdFJldHVybigpIHsKKyAgICBhZGRBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cmlidXRlOjpOb1JldHVybik7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBjYWxsIHNob3VsZCBub3QgcGVyZm9ybSBpbmRpcmVjdCBicmFuY2ggdHJhY2tpbmcuCisgIGJvb2wgZG9lc05vQ2ZDaGVjaygpIGNvbnN0IHsgcmV0dXJuIGhhc0ZuQXR0cihBdHRyaWJ1dGU6Ok5vQ2ZDaGVjayk7IH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBjYWxsIGNhbm5vdCB1bndpbmQuCisgIGJvb2wgZG9lc05vdFRocm93KCkgY29uc3QgeyByZXR1cm4gaGFzRm5BdHRyKEF0dHJpYnV0ZTo6Tm9VbndpbmQpOyB9CisgIHZvaWQgc2V0RG9lc05vdFRocm93KCkgeworICAgIGFkZEF0dHJpYnV0ZShBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRyaWJ1dGU6Ok5vVW53aW5kKTsKKyAgfQorCisgIC8vLyBEZXRlcm1pbmUgaWYgdGhlIGludm9rZSBjYW5ub3QgYmUgZHVwbGljYXRlZC4KKyAgYm9vbCBjYW5ub3REdXBsaWNhdGUoKSBjb25zdCB7cmV0dXJuIGhhc0ZuQXR0cihBdHRyaWJ1dGU6Ok5vRHVwbGljYXRlKTsgfQorICB2b2lkIHNldENhbm5vdER1cGxpY2F0ZSgpIHsKKyAgICBhZGRBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cmlidXRlOjpOb0R1cGxpY2F0ZSk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBpbnZva2UgaXMgY29udmVyZ2VudAorICBib29sIGlzQ29udmVyZ2VudCgpIGNvbnN0IHsgcmV0dXJuIGhhc0ZuQXR0cihBdHRyaWJ1dGU6OkNvbnZlcmdlbnQpOyB9CisgIHZvaWQgc2V0Q29udmVyZ2VudCgpIHsKKyAgICBhZGRBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cmlidXRlOjpDb252ZXJnZW50KTsKKyAgfQorICB2b2lkIHNldE5vdENvbnZlcmdlbnQoKSB7CisgICAgcmVtb3ZlQXR0cmlidXRlKEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHJpYnV0ZTo6Q29udmVyZ2VudCk7CisgIH0KKworICAvLy8gRGV0ZXJtaW5lIGlmIHRoZSBjYWxsIHJldHVybnMgYSBzdHJ1Y3R1cmUgdGhyb3VnaCBmaXJzdAorICAvLy8gcG9pbnRlciBhcmd1bWVudC4KKyAgYm9vbCBoYXNTdHJ1Y3RSZXRBdHRyKCkgY29uc3QgeworICAgIGlmIChnZXROdW1BcmdPcGVyYW5kcygpID09IDApCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBCZSBmcmllbmRseSBhbmQgYWxzbyBjaGVjayB0aGUgY2FsbGVlLgorICAgIHJldHVybiBwYXJhbUhhc0F0dHIoMCwgQXR0cmlidXRlOjpTdHJ1Y3RSZXQpOworICB9CisKKyAgLy8vIERldGVybWluZSBpZiBhbnkgY2FsbCBhcmd1bWVudCBpcyBhbiBhZ2dyZWdhdGUgcGFzc2VkIGJ5IHZhbHVlLgorICBib29sIGhhc0J5VmFsQXJndW1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJzLmhhc0F0dHJTb21ld2hlcmUoQXR0cmlidXRlOjpCeVZhbCk7CisgIH0KKyAgLy8vIEdldCBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCBieSB0aGlzCisgIC8vLyBpbnN0cnVjdGlvbi4KKyAgY29uc3QgVmFsdWUgKmdldENhbGxlZFZhbHVlKCkgY29uc3QgeyByZXR1cm4gT3A8LUluc3RUeTo6QXJnT2Zmc2V0PigpOyB9CisgIFZhbHVlICpnZXRDYWxsZWRWYWx1ZSgpIHsgcmV0dXJuIE9wPC1JbnN0VHk6OkFyZ09mZnNldD4oKTsgfQorCisgIC8vLyBTZXQgdGhlIGZ1bmN0aW9uIGNhbGxlZC4KKyAgdm9pZCBzZXRDYWxsZWRGdW5jdGlvbihWYWx1ZSogRm4pIHsKKyAgICBzZXRDYWxsZWRGdW5jdGlvbigKKyAgICAgICAgY2FzdDxGdW5jdGlvblR5cGU+KGNhc3Q8UG9pbnRlclR5cGU+KEZuLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpKSwKKyAgICAgICAgRm4pOworICB9CisgIHZvaWQgc2V0Q2FsbGVkRnVuY3Rpb24oRnVuY3Rpb25UeXBlICpGVHksIFZhbHVlICpGbikgeworICAgIHRoaXMtPkZUeSA9IEZUeTsKKyAgICBhc3NlcnQoRlR5ID09IGNhc3Q8RnVuY3Rpb25UeXBlPigKKyAgICAgICAgICAgICAgICAgICAgICBjYXN0PFBvaW50ZXJUeXBlPihGbi0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSkpOworICAgIE9wPC1JbnN0VHk6OkFyZ09mZnNldD4oKSA9IEZuOworICB9CisKK3Byb3RlY3RlZDoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEF0dHJLaW5kPiBib29sIGhhc0ZuQXR0ckltcGwoQXR0cktpbmQgS2luZCkgY29uc3QgeworICAgIGlmIChBdHRycy5oYXNBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgS2luZCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIC8vIE9wZXJhbmQgYnVuZGxlcyBvdmVycmlkZSBhdHRyaWJ1dGVzIG9uIHRoZSBjYWxsZWQgZnVuY3Rpb24sIGJ1dCBkb24ndAorICAgIC8vIG92ZXJyaWRlIGF0dHJpYnV0ZXMgZGlyZWN0bHkgcHJlc2VudCBvbiB0aGUgY2FsbCBpbnN0cnVjdGlvbi4KKyAgICBpZiAoaXNGbkF0dHJEaXNhbGxvd2VkQnlPcEJ1bmRsZShLaW5kKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGlmIChjb25zdCBGdW5jdGlvbiAqRiA9IGdldENhbGxlZEZ1bmN0aW9uKCkpCisgICAgICByZXR1cm4gRi0+Z2V0QXR0cmlidXRlcygpLmhhc0F0dHJpYnV0ZShBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS2luZCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGZ1bmN0aW9uIGNhbGwsIGFic3RyYWN0aW5nIGEgdGFyZ2V0CisvLy8gbWFjaGluZSdzIGNhbGxpbmcgY29udmVudGlvbi4gIFRoaXMgY2xhc3MgdXNlcyBsb3cgYml0IG9mIHRoZSBTdWJDbGFzc0RhdGEKKy8vLyBmaWVsZCB0byBpbmRpY2F0ZSB3aGV0aGVyIG9yIG5vdCB0aGlzIGlzIGEgdGFpbCBjYWxsLiAgVGhlIHJlc3Qgb2YgdGhlIGJpdHMKKy8vLyBob2xkIHRoZSBjYWxsaW5nIGNvbnZlbnRpb24gb2YgdGhlIGNhbGwuCisvLy8KK2NsYXNzIENhbGxJbnN0IDogcHVibGljIENhbGxCYXNlPENhbGxJbnN0PiB7CisgIGZyaWVuZCBjbGFzcyBPcGVyYW5kQnVuZGxlVXNlcjxDYWxsSW5zdCwgVXNlcjo6b3BfaXRlcmF0b3I+OworCisgIENhbGxJbnN0KGNvbnN0IENhbGxJbnN0ICZDSSk7CisKKyAgLy8vIENvbnN0cnVjdCBhIENhbGxJbnN0IGdpdmVuIGEgcmFuZ2Ugb2YgYXJndW1lbnRzLgorICAvLy8gQ29uc3RydWN0IGEgQ2FsbEluc3QgZnJvbSBhIHJhbmdlIG9mIGFyZ3VtZW50cworICBpbmxpbmUgQ2FsbEluc3QoRnVuY3Rpb25UeXBlICpUeSwgVmFsdWUgKkZ1bmMsIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBCdW5kbGVzLCBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpOworCisgIGlubGluZSBDYWxsSW5zdChWYWx1ZSAqRnVuYywgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IEJ1bmRsZXMsIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkKKyAgICAgIDogQ2FsbEluc3QoY2FzdDxGdW5jdGlvblR5cGU+KAorICAgICAgICAgICAgICAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oRnVuYy0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSksCisgICAgICAgICAgICAgICAgIEZ1bmMsIEFyZ3MsIEJ1bmRsZXMsIE5hbWVTdHIsIEluc2VydEJlZm9yZSkge30KKworICBpbmxpbmUgQ2FsbEluc3QoVmFsdWUgKkZ1bmMsIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkKKyAgICAgIDogQ2FsbEluc3QoRnVuYywgQXJncywgTm9uZSwgTmFtZVN0ciwgSW5zZXJ0QmVmb3JlKSB7fQorCisgIC8vLyBDb25zdHJ1Y3QgYSBDYWxsSW5zdCBnaXZlbiBhIHJhbmdlIG9mIGFyZ3VtZW50cy4KKyAgLy8vIENvbnN0cnVjdCBhIENhbGxJbnN0IGZyb20gYSByYW5nZSBvZiBhcmd1bWVudHMKKyAgaW5saW5lIENhbGxJbnN0KFZhbHVlICpGdW5jLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gQnVuZGxlcywgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgZXhwbGljaXQgQ2FsbEluc3QoVmFsdWUgKkYsIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKworICBDYWxsSW5zdChWYWx1ZSAqRiwgY29uc3QgVHdpbmUgJk5hbWVTdHIsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICB2b2lkIGluaXQoVmFsdWUgKkZ1bmMsIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBCdW5kbGVzLCBjb25zdCBUd2luZSAmTmFtZVN0cikgeworICAgIGluaXQoY2FzdDxGdW5jdGlvblR5cGU+KAorICAgICAgICAgICAgIGNhc3Q8UG9pbnRlclR5cGU+KEZ1bmMtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpLAorICAgICAgICAgRnVuYywgQXJncywgQnVuZGxlcywgTmFtZVN0cik7CisgIH0KKyAgdm9pZCBpbml0KEZ1bmN0aW9uVHlwZSAqRlR5LCBWYWx1ZSAqRnVuYywgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IEJ1bmRsZXMsIGNvbnN0IFR3aW5lICZOYW1lU3RyKTsKKyAgdm9pZCBpbml0KFZhbHVlICpGdW5jLCBjb25zdCBUd2luZSAmTmFtZVN0cik7CisKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIENhbGxJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICBzdGF0aWMgY29uc3RleHByIGludCBBcmdPZmZzZXQgPSAxOworCisgIHN0YXRpYyBDYWxsSW5zdCAqQ3JlYXRlKFZhbHVlICpGdW5jLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBCdW5kbGVzID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gQ3JlYXRlKGNhc3Q8RnVuY3Rpb25UeXBlPigKKyAgICAgICAgICAgICAgICAgICAgICBjYXN0PFBvaW50ZXJUeXBlPihGdW5jLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgIEZ1bmMsIEFyZ3MsIEJ1bmRsZXMsIE5hbWVTdHIsIEluc2VydEJlZm9yZSk7CisgIH0KKworICBzdGF0aWMgQ2FsbEluc3QgKkNyZWF0ZShWYWx1ZSAqRnVuYywgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIENyZWF0ZShjYXN0PEZ1bmN0aW9uVHlwZT4oCisgICAgICAgICAgICAgICAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oRnVuYy0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSksCisgICAgICAgICAgICAgICAgICBGdW5jLCBBcmdzLCBOb25lLCBOYW1lU3RyLCBJbnNlcnRCZWZvcmUpOworICB9CisKKyAgc3RhdGljIENhbGxJbnN0ICpDcmVhdGUoRnVuY3Rpb25UeXBlICpUeSwgVmFsdWUgKkZ1bmMsIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIHJldHVybiBuZXcgKHVuc2lnbmVkKEFyZ3Muc2l6ZSgpICsgMSkpCisgICAgICAgIENhbGxJbnN0KFR5LCBGdW5jLCBBcmdzLCBOb25lLCBOYW1lU3RyLCBJbnNlcnRCZWZvcmUpOworICB9CisKKyAgc3RhdGljIENhbGxJbnN0ICpDcmVhdGUoRnVuY3Rpb25UeXBlICpUeSwgVmFsdWUgKkZ1bmMsIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IEJ1bmRsZXMgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIGNvbnN0IHVuc2lnbmVkIFRvdGFsT3BzID0KKyAgICAgICAgdW5zaWduZWQoQXJncy5zaXplKCkpICsgQ291bnRCdW5kbGVJbnB1dHMoQnVuZGxlcykgKyAxOworICAgIGNvbnN0IHVuc2lnbmVkIERlc2NyaXB0b3JCeXRlcyA9IEJ1bmRsZXMuc2l6ZSgpICogc2l6ZW9mKEJ1bmRsZU9wSW5mbyk7CisKKyAgICByZXR1cm4gbmV3IChUb3RhbE9wcywgRGVzY3JpcHRvckJ5dGVzKQorICAgICAgICBDYWxsSW5zdChUeSwgRnVuYywgQXJncywgQnVuZGxlcywgTmFtZVN0ciwgSW5zZXJ0QmVmb3JlKTsKKyAgfQorCisgIHN0YXRpYyBDYWxsSW5zdCAqQ3JlYXRlKFZhbHVlICpGdW5jLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBCdW5kbGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICBjb25zdCB1bnNpZ25lZCBUb3RhbE9wcyA9CisgICAgICAgIHVuc2lnbmVkKEFyZ3Muc2l6ZSgpKSArIENvdW50QnVuZGxlSW5wdXRzKEJ1bmRsZXMpICsgMTsKKyAgICBjb25zdCB1bnNpZ25lZCBEZXNjcmlwdG9yQnl0ZXMgPSBCdW5kbGVzLnNpemUoKSAqIHNpemVvZihCdW5kbGVPcEluZm8pOworCisgICAgcmV0dXJuIG5ldyAoVG90YWxPcHMsIERlc2NyaXB0b3JCeXRlcykKKyAgICAgICAgQ2FsbEluc3QoRnVuYywgQXJncywgQnVuZGxlcywgTmFtZVN0ciwgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgc3RhdGljIENhbGxJbnN0ICpDcmVhdGUoVmFsdWUgKkZ1bmMsIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICAgIHJldHVybiBuZXcgKHVuc2lnbmVkKEFyZ3Muc2l6ZSgpICsgMSkpCisgICAgICAgIENhbGxJbnN0KEZ1bmMsIEFyZ3MsIE5vbmUsIE5hbWVTdHIsIEluc2VydEF0RW5kKTsKKyAgfQorCisgIHN0YXRpYyBDYWxsSW5zdCAqQ3JlYXRlKFZhbHVlICpGLCBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIHJldHVybiBuZXcgKDEpIENhbGxJbnN0KEYsIE5hbWVTdHIsIEluc2VydEJlZm9yZSk7CisgIH0KKworICBzdGF0aWMgQ2FsbEluc3QgKkNyZWF0ZShWYWx1ZSAqRiwgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgcmV0dXJuIG5ldyAoMSkgQ2FsbEluc3QoRiwgTmFtZVN0ciwgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgLy8vIENyZWF0ZSBhIGNsb25lIG9mIFxwIENJIHdpdGggYSBkaWZmZXJlbnQgc2V0IG9mIG9wZXJhbmQgYnVuZGxlcyBhbmQKKyAgLy8vIGluc2VydCBpdCBiZWZvcmUgXHAgSW5zZXJ0UHQuCisgIC8vLworICAvLy8gVGhlIHJldHVybmVkIGNhbGwgaW5zdHJ1Y3Rpb24gaXMgaWRlbnRpY2FsIFxwIENJIGluIGV2ZXJ5IHdheSBleGNlcHQgdGhhdAorICAvLy8gdGhlIG9wZXJhbmQgYnVuZGxlcyBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbiBhcmUgc2V0IHRvIHRoZSBvcGVyYW5kIGJ1bmRsZXMKKyAgLy8vIGluIFxwIEJ1bmRsZXMuCisgIHN0YXRpYyBDYWxsSW5zdCAqQ3JlYXRlKENhbGxJbnN0ICpDSSwgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gQnVuZGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydFB0ID0gbnVsbHB0cik7CisKKyAgLy8vIEdlbmVyYXRlIHRoZSBJUiBmb3IgYSBjYWxsIHRvIG1hbGxvYzoKKyAgLy8vIDEuIENvbXB1dGUgdGhlIG1hbGxvYyBjYWxsJ3MgYXJndW1lbnQgYXMgdGhlIHNwZWNpZmllZCB0eXBlJ3Mgc2l6ZSwKKyAgLy8vICAgIHBvc3NpYmx5IG11bHRpcGxpZWQgYnkgdGhlIGFycmF5IHNpemUgaWYgdGhlIGFycmF5IHNpemUgaXMgbm90CisgIC8vLyAgICBjb25zdGFudCAxLgorICAvLy8gMi4gQ2FsbCBtYWxsb2Mgd2l0aCB0aGF0IGFyZ3VtZW50LgorICAvLy8gMy4gQml0Y2FzdCB0aGUgcmVzdWx0IG9mIHRoZSBtYWxsb2MgY2FsbCB0byB0aGUgc3BlY2lmaWVkIHR5cGUuCisgIHN0YXRpYyBJbnN0cnVjdGlvbiAqQ3JlYXRlTWFsbG9jKEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUsIFR5cGUgKkludFB0clR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpBbGxvY1R5LCBWYWx1ZSAqQWxsb2NTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQXJyYXlTaXplID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gKk1hbGxvY0YgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKTsKKyAgc3RhdGljIEluc3RydWN0aW9uICpDcmVhdGVNYWxsb2MoQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQsIFR5cGUgKkludFB0clR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpBbGxvY1R5LCBWYWx1ZSAqQWxsb2NTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQXJyYXlTaXplID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gKk1hbGxvY0YgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKTsKKyAgc3RhdGljIEluc3RydWN0aW9uICpDcmVhdGVNYWxsb2MoSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSwgVHlwZSAqSW50UHRyVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKkFsbG9jVHksIFZhbHVlICpBbGxvY1NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpBcnJheVNpemUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBCdW5kbGVzID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gKk1hbGxvY0YgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZSA9ICIiKTsKKyAgc3RhdGljIEluc3RydWN0aW9uICpDcmVhdGVNYWxsb2MoQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQsIFR5cGUgKkludFB0clR5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpBbGxvY1R5LCBWYWx1ZSAqQWxsb2NTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQXJyYXlTaXplID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gQnVuZGxlcyA9IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uICpNYWxsb2NGID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWUgPSAiIik7CisgIC8vLyBHZW5lcmF0ZSB0aGUgSVIgZm9yIGEgY2FsbCB0byB0aGUgYnVpbHRpbiBmcmVlIGZ1bmN0aW9uLgorICBzdGF0aWMgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUZyZWUoVmFsdWUgKlNvdXJjZSwgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSk7CisgIHN0YXRpYyBJbnN0cnVjdGlvbiAqQ3JlYXRlRnJlZShWYWx1ZSAqU291cmNlLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisgIHN0YXRpYyBJbnN0cnVjdGlvbiAqQ3JlYXRlRnJlZShWYWx1ZSAqU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gQnVuZGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpOworICBzdGF0aWMgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUZyZWUoVmFsdWUgKlNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IEJ1bmRsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgLy8gTm90ZSB0aGF0ICdtdXN0dGFpbCcgaW1wbGllcyAndGFpbCcuCisgIGVudW0gVGFpbENhbGxLaW5kIHsKKyAgICBUQ0tfTm9uZSA9IDAsCisgICAgVENLX1RhaWwgPSAxLAorICAgIFRDS19NdXN0VGFpbCA9IDIsCisgICAgVENLX05vVGFpbCA9IDMKKyAgfTsKKyAgVGFpbENhbGxLaW5kIGdldFRhaWxDYWxsS2luZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVGFpbENhbGxLaW5kKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgMyk7CisgIH0KKworICBib29sIGlzVGFpbENhbGwoKSBjb25zdCB7CisgICAgdW5zaWduZWQgS2luZCA9IGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgMzsKKyAgICByZXR1cm4gS2luZCA9PSBUQ0tfVGFpbCB8fCBLaW5kID09IFRDS19NdXN0VGFpbDsKKyAgfQorCisgIGJvb2wgaXNNdXN0VGFpbENhbGwoKSBjb25zdCB7CisgICAgcmV0dXJuIChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIDMpID09IFRDS19NdXN0VGFpbDsKKyAgfQorCisgIGJvb2wgaXNOb1RhaWxDYWxsKCkgY29uc3QgeworICAgIHJldHVybiAoZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiAzKSA9PSBUQ0tfTm9UYWlsOworICB9CisKKyAgdm9pZCBzZXRUYWlsQ2FsbChib29sIGlzVEMgPSB0cnVlKSB7CisgICAgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgfjMpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZChpc1RDID8gVENLX1RhaWwgOiBUQ0tfTm9uZSkpOworICB9CisKKyAgdm9pZCBzZXRUYWlsQ2FsbEtpbmQoVGFpbENhbGxLaW5kIFRDSykgeworICAgIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKChnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIH4zKSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQoVENLKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGNhbGwgY2FuIHJldHVybiB0d2ljZQorICBib29sIGNhblJldHVyblR3aWNlKCkgY29uc3QgeyByZXR1cm4gaGFzRm5BdHRyKEF0dHJpYnV0ZTo6UmV0dXJuc1R3aWNlKTsgfQorICB2b2lkIHNldENhblJldHVyblR3aWNlKCkgeworICAgIGFkZEF0dHJpYnV0ZShBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRyaWJ1dGU6OlJldHVybnNUd2ljZSk7CisgIH0KKworICAvLy8gQ2hlY2sgaWYgdGhpcyBjYWxsIGlzIGFuIGlubGluZSBhc20gc3RhdGVtZW50LgorICBib29sIGlzSW5saW5lQXNtKCkgY29uc3QgeyByZXR1cm4gaXNhPElubGluZUFzbT4oT3A8LTE+KCkpOyB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6Q2FsbDsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8gU2hhZG93IEluc3RydWN0aW9uOjpzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSB3aXRoIGEgcHJpdmF0ZSBmb3J3YXJkaW5nCisgIC8vIG1ldGhvZCBzbyB0aGF0IHN1YmNsYXNzZXMgY2Fubm90IGFjY2lkZW50YWxseSB1c2UgaXQuCisgIHZvaWQgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEodW5zaWduZWQgc2hvcnQgRCkgeworICAgIEluc3RydWN0aW9uOjpzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YShEKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPENhbGxCYXNlPENhbGxJbnN0Pj4KKyAgICA6IHB1YmxpYyBWYXJpYWRpY09wZXJhbmRUcmFpdHM8Q2FsbEJhc2U8Q2FsbEluc3Q+LCAxPiB7fTsKKworQ2FsbEluc3Q6OkNhbGxJbnN0KFZhbHVlICpGdW5jLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IEJ1bmRsZXMsIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKQorICAgIDogQ2FsbEJhc2U8Q2FsbEluc3Q+KAorICAgICAgICAgIGNhc3Q8RnVuY3Rpb25UeXBlPigKKyAgICAgICAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oRnVuYy0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSkKKyAgICAgICAgICAgICAgLT5nZXRSZXR1cm5UeXBlKCksCisgICAgICAgICAgSW5zdHJ1Y3Rpb246OkNhbGwsCisgICAgICAgICAgT3BlcmFuZFRyYWl0czxDYWxsQmFzZTxDYWxsSW5zdD4+OjpvcF9lbmQodGhpcykgLQorICAgICAgICAgICAgICAoQXJncy5zaXplKCkgKyBDb3VudEJ1bmRsZUlucHV0cyhCdW5kbGVzKSArIDEpLAorICAgICAgICAgIHVuc2lnbmVkKEFyZ3Muc2l6ZSgpICsgQ291bnRCdW5kbGVJbnB1dHMoQnVuZGxlcykgKyAxKSwgSW5zZXJ0QXRFbmQpIHsKKyAgaW5pdChGdW5jLCBBcmdzLCBCdW5kbGVzLCBOYW1lU3RyKTsKK30KKworQ2FsbEluc3Q6OkNhbGxJbnN0KEZ1bmN0aW9uVHlwZSAqVHksIFZhbHVlICpGdW5jLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IEJ1bmRsZXMsIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpCisgICAgOiBDYWxsQmFzZTxDYWxsSW5zdD4oVHktPmdldFJldHVyblR5cGUoKSwgSW5zdHJ1Y3Rpb246OkNhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxDYWxsQmFzZTxDYWxsSW5zdD4+OjpvcF9lbmQodGhpcykgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQXJncy5zaXplKCkgKyBDb3VudEJ1bmRsZUlucHV0cyhCdW5kbGVzKSArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkKEFyZ3Muc2l6ZSgpICsgQ291bnRCdW5kbGVJbnB1dHMoQnVuZGxlcykgKyAxKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBJbnNlcnRCZWZvcmUpIHsKKyAgaW5pdChUeSwgRnVuYywgQXJncywgQnVuZGxlcywgTmFtZVN0cik7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWxlY3RJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIHRoZSBMTFZNICdzZWxlY3QnIGluc3RydWN0aW9uLgorLy8vCitjbGFzcyBTZWxlY3RJbnN0IDogcHVibGljIEluc3RydWN0aW9uIHsKKyAgU2VsZWN0SW5zdChWYWx1ZSAqQywgVmFsdWUgKlMxLCBWYWx1ZSAqUzIsIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpCisgICAgOiBJbnN0cnVjdGlvbihTMS0+Z2V0VHlwZSgpLCBJbnN0cnVjdGlvbjo6U2VsZWN0LAorICAgICAgICAgICAgICAgICAgJk9wPDA+KCksIDMsIEluc2VydEJlZm9yZSkgeworICAgIGluaXQoQywgUzEsIFMyKTsKKyAgICBzZXROYW1lKE5hbWVTdHIpOworICB9CisKKyAgU2VsZWN0SW5zdChWYWx1ZSAqQywgVmFsdWUgKlMxLCBWYWx1ZSAqUzIsIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKQorICAgIDogSW5zdHJ1Y3Rpb24oUzEtPmdldFR5cGUoKSwgSW5zdHJ1Y3Rpb246OlNlbGVjdCwKKyAgICAgICAgICAgICAgICAgICZPcDwwPigpLCAzLCBJbnNlcnRBdEVuZCkgeworICAgIGluaXQoQywgUzEsIFMyKTsKKyAgICBzZXROYW1lKE5hbWVTdHIpOworICB9CisKKyAgdm9pZCBpbml0KFZhbHVlICpDLCBWYWx1ZSAqUzEsIFZhbHVlICpTMikgeworICAgIGFzc2VydCghYXJlSW52YWxpZE9wZXJhbmRzKEMsIFMxLCBTMikgJiYgIkludmFsaWQgb3BlcmFuZHMgZm9yIHNlbGVjdCIpOworICAgIE9wPDA+KCkgPSBDOworICAgIE9wPDE+KCkgPSBTMTsKKyAgICBPcDwyPigpID0gUzI7CisgIH0KKworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgU2VsZWN0SW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgc3RhdGljIFNlbGVjdEluc3QgKkNyZWF0ZShWYWx1ZSAqQywgVmFsdWUgKlMxLCBWYWx1ZSAqUzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqTURGcm9tID0gbnVsbHB0cikgeworICAgIFNlbGVjdEluc3QgKlNlbCA9IG5ldygzKSBTZWxlY3RJbnN0KEMsIFMxLCBTMiwgTmFtZVN0ciwgSW5zZXJ0QmVmb3JlKTsKKyAgICBpZiAoTURGcm9tKQorICAgICAgU2VsLT5jb3B5TWV0YWRhdGEoKk1ERnJvbSk7CisgICAgcmV0dXJuIFNlbDsKKyAgfQorCisgIHN0YXRpYyBTZWxlY3RJbnN0ICpDcmVhdGUoVmFsdWUgKkMsIFZhbHVlICpTMSwgVmFsdWUgKlMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgcmV0dXJuIG5ldygzKSBTZWxlY3RJbnN0KEMsIFMxLCBTMiwgTmFtZVN0ciwgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgY29uc3QgVmFsdWUgKmdldENvbmRpdGlvbigpIGNvbnN0IHsgcmV0dXJuIE9wPDA+KCk7IH0KKyAgY29uc3QgVmFsdWUgKmdldFRydWVWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIE9wPDE+KCk7IH0KKyAgY29uc3QgVmFsdWUgKmdldEZhbHNlVmFsdWUoKSBjb25zdCB7IHJldHVybiBPcDwyPigpOyB9CisgIFZhbHVlICpnZXRDb25kaXRpb24oKSB7IHJldHVybiBPcDwwPigpOyB9CisgIFZhbHVlICpnZXRUcnVlVmFsdWUoKSB7IHJldHVybiBPcDwxPigpOyB9CisgIFZhbHVlICpnZXRGYWxzZVZhbHVlKCkgeyByZXR1cm4gT3A8Mj4oKTsgfQorCisgIHZvaWQgc2V0Q29uZGl0aW9uKFZhbHVlICpWKSB7IE9wPDA+KCkgPSBWOyB9CisgIHZvaWQgc2V0VHJ1ZVZhbHVlKFZhbHVlICpWKSB7IE9wPDE+KCkgPSBWOyB9CisgIHZvaWQgc2V0RmFsc2VWYWx1ZShWYWx1ZSAqVikgeyBPcDwyPigpID0gVjsgfQorCisgIC8vLyBSZXR1cm4gYSBzdHJpbmcgaWYgdGhlIHNwZWNpZmllZCBvcGVyYW5kcyBhcmUgaW52YWxpZAorICAvLy8gZm9yIGEgc2VsZWN0IG9wZXJhdGlvbiwgb3RoZXJ3aXNlIHJldHVybiBudWxsLgorICBzdGF0aWMgY29uc3QgY2hhciAqYXJlSW52YWxpZE9wZXJhbmRzKFZhbHVlICpDb25kLCBWYWx1ZSAqVHJ1ZSwgVmFsdWUgKkZhbHNlKTsKKworICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgT3RoZXJPcHMgZ2V0T3Bjb2RlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxPdGhlck9wcz4oSW5zdHJ1Y3Rpb246OmdldE9wY29kZSgpKTsKKyAgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlNlbGVjdDsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxTZWxlY3RJbnN0PiA6IHB1YmxpYyBGaXhlZE51bU9wZXJhbmRUcmFpdHM8U2VsZWN0SW5zdCwgMz4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFNlbGVjdEluc3QsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBQXJnSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgdmFfYXJnIGxsdm0gaW5zdHJ1Y3Rpb24sIHdoaWNoIHJldHVybnMKKy8vLyBhbiBhcmd1bWVudCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUgZ2l2ZW4gYSB2YV9saXN0IGFuZCBpbmNyZW1lbnRzIHRoYXQgbGlzdAorLy8vCitjbGFzcyBWQUFyZ0luc3QgOiBwdWJsaWMgVW5hcnlJbnN0cnVjdGlvbiB7Citwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICBWQUFyZ0luc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIFZBQXJnSW5zdChWYWx1ZSAqTGlzdCwgVHlwZSAqVHksIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsCisgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpCisgICAgOiBVbmFyeUluc3RydWN0aW9uKFR5LCBWQUFyZywgTGlzdCwgSW5zZXJ0QmVmb3JlKSB7CisgICAgc2V0TmFtZShOYW1lU3RyKTsKKyAgfQorCisgIFZBQXJnSW5zdChWYWx1ZSAqTGlzdCwgVHlwZSAqVHksIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpCisgICAgOiBVbmFyeUluc3RydWN0aW9uKFR5LCBWQUFyZywgTGlzdCwgSW5zZXJ0QXRFbmQpIHsKKyAgICBzZXROYW1lKE5hbWVTdHIpOworICB9CisKKyAgVmFsdWUgKmdldFBvaW50ZXJPcGVyYW5kKCkgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorICBjb25zdCBWYWx1ZSAqZ2V0UG9pbnRlck9wZXJhbmQoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRQb2ludGVyT3BlcmFuZEluZGV4KCkgeyByZXR1cm4gMFU7IH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IFZBQXJnOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYWN0RWxlbWVudEluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBUaGlzIGluc3RydWN0aW9uIGV4dHJhY3RzIGEgc2luZ2xlIChzY2FsYXIpCisvLy8gZWxlbWVudCBmcm9tIGEgVmVjdG9yVHlwZSB2YWx1ZQorLy8vCitjbGFzcyBFeHRyYWN0RWxlbWVudEluc3QgOiBwdWJsaWMgSW5zdHJ1Y3Rpb24geworICBFeHRyYWN0RWxlbWVudEluc3QoVmFsdWUgKlZlYywgVmFsdWUgKklkeCwgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKyAgRXh0cmFjdEVsZW1lbnRJbnN0KFZhbHVlICpWZWMsIFZhbHVlICpJZHgsIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCitwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICBFeHRyYWN0RWxlbWVudEluc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIHN0YXRpYyBFeHRyYWN0RWxlbWVudEluc3QgKkNyZWF0ZShWYWx1ZSAqVmVjLCBWYWx1ZSAqSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIHJldHVybiBuZXcoMikgRXh0cmFjdEVsZW1lbnRJbnN0KFZlYywgSWR4LCBOYW1lU3RyLCBJbnNlcnRCZWZvcmUpOworICB9CisKKyAgc3RhdGljIEV4dHJhY3RFbGVtZW50SW5zdCAqQ3JlYXRlKFZhbHVlICpWZWMsIFZhbHVlICpJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICAgIHJldHVybiBuZXcoMikgRXh0cmFjdEVsZW1lbnRJbnN0KFZlYywgSWR4LCBOYW1lU3RyLCBJbnNlcnRBdEVuZCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgYW4gZXh0cmFjdGVsZW1lbnQgaW5zdHJ1Y3Rpb24gY2FuIGJlCisgIC8vLyBmb3JtZWQgd2l0aCB0aGUgc3BlY2lmaWVkIG9wZXJhbmRzLgorICBzdGF0aWMgYm9vbCBpc1ZhbGlkT3BlcmFuZHMoY29uc3QgVmFsdWUgKlZlYywgY29uc3QgVmFsdWUgKklkeCk7CisKKyAgVmFsdWUgKmdldFZlY3Rvck9wZXJhbmQoKSB7IHJldHVybiBPcDwwPigpOyB9CisgIFZhbHVlICpnZXRJbmRleE9wZXJhbmQoKSB7IHJldHVybiBPcDwxPigpOyB9CisgIGNvbnN0IFZhbHVlICpnZXRWZWN0b3JPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gT3A8MD4oKTsgfQorICBjb25zdCBWYWx1ZSAqZ2V0SW5kZXhPcGVyYW5kKCkgY29uc3QgeyByZXR1cm4gT3A8MT4oKTsgfQorCisgIFZlY3RvclR5cGUgKmdldFZlY3Rvck9wZXJhbmRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PFZlY3RvclR5cGU+KGdldFZlY3Rvck9wZXJhbmQoKS0+Z2V0VHlwZSgpKTsKKyAgfQorCisgIC8vLyBUcmFuc3BhcmVudGx5IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgZ2V0T3BlcmFuZCBtZXRob2RzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpFeHRyYWN0RWxlbWVudDsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxFeHRyYWN0RWxlbWVudEluc3Q+IDoKKyAgcHVibGljIEZpeGVkTnVtT3BlcmFuZFRyYWl0czxFeHRyYWN0RWxlbWVudEluc3QsIDI+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhFeHRyYWN0RWxlbWVudEluc3QsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydEVsZW1lbnRJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVGhpcyBpbnN0cnVjdGlvbiBpbnNlcnRzIGEgc2luZ2xlIChzY2FsYXIpCisvLy8gZWxlbWVudCBpbnRvIGEgVmVjdG9yVHlwZSB2YWx1ZQorLy8vCitjbGFzcyBJbnNlcnRFbGVtZW50SW5zdCA6IHB1YmxpYyBJbnN0cnVjdGlvbiB7CisgIEluc2VydEVsZW1lbnRJbnN0KFZhbHVlICpWZWMsIFZhbHVlICpOZXdFbHQsIFZhbHVlICpJZHgsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsCisgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKyAgSW5zZXJ0RWxlbWVudEluc3QoVmFsdWUgKlZlYywgVmFsdWUgKk5ld0VsdCwgVmFsdWUgKklkeCwgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgSW5zZXJ0RWxlbWVudEluc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIHN0YXRpYyBJbnNlcnRFbGVtZW50SW5zdCAqQ3JlYXRlKFZhbHVlICpWZWMsIFZhbHVlICpOZXdFbHQsIFZhbHVlICpJZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIG5ldygzKSBJbnNlcnRFbGVtZW50SW5zdChWZWMsIE5ld0VsdCwgSWR4LCBOYW1lU3RyLCBJbnNlcnRCZWZvcmUpOworICB9CisKKyAgc3RhdGljIEluc2VydEVsZW1lbnRJbnN0ICpDcmVhdGUoVmFsdWUgKlZlYywgVmFsdWUgKk5ld0VsdCwgVmFsdWUgKklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgcmV0dXJuIG5ldygzKSBJbnNlcnRFbGVtZW50SW5zdChWZWMsIE5ld0VsdCwgSWR4LCBOYW1lU3RyLCBJbnNlcnRBdEVuZCk7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgYW4gaW5zZXJ0ZWxlbWVudCBpbnN0cnVjdGlvbiBjYW4gYmUKKyAgLy8vIGZvcm1lZCB3aXRoIHRoZSBzcGVjaWZpZWQgb3BlcmFuZHMuCisgIHN0YXRpYyBib29sIGlzVmFsaWRPcGVyYW5kcyhjb25zdCBWYWx1ZSAqVmVjLCBjb25zdCBWYWx1ZSAqTmV3RWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWUgKklkeCk7CisKKyAgLy8vIE92ZXJsb2FkIHRvIHJldHVybiBtb3N0IHNwZWNpZmljIHZlY3RvciB0eXBlLgorICAvLy8KKyAgVmVjdG9yVHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxWZWN0b3JUeXBlPihJbnN0cnVjdGlvbjo6Z2V0VHlwZSgpKTsKKyAgfQorCisgIC8vLyBUcmFuc3BhcmVudGx5IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgZ2V0T3BlcmFuZCBtZXRob2RzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpJbnNlcnRFbGVtZW50OworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPEluc2VydEVsZW1lbnRJbnN0PiA6CisgIHB1YmxpYyBGaXhlZE51bU9wZXJhbmRUcmFpdHM8SW5zZXJ0RWxlbWVudEluc3QsIDM+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhJbnNlcnRFbGVtZW50SW5zdCwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNodWZmbGVWZWN0b3JJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVGhpcyBpbnN0cnVjdGlvbiBjb25zdHJ1Y3RzIGEgZml4ZWQgcGVybXV0YXRpb24gb2YgdHdvCisvLy8gaW5wdXQgdmVjdG9ycy4KKy8vLworY2xhc3MgU2h1ZmZsZVZlY3Rvckluc3QgOiBwdWJsaWMgSW5zdHJ1Y3Rpb24geworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgU2h1ZmZsZVZlY3Rvckluc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIFNodWZmbGVWZWN0b3JJbnN0KFZhbHVlICpWMSwgVmFsdWUgKlYyLCBWYWx1ZSAqTWFzaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yID0gbnVsbHB0cik7CisgIFNodWZmbGVWZWN0b3JJbnN0KFZhbHVlICpWMSwgVmFsdWUgKlYyLCBWYWx1ZSAqTWFzaywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSB0aHJlZSBvcGVyYW5kcworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMsIDMpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGEgc2h1ZmZsZXZlY3RvciBpbnN0cnVjdGlvbiBjYW4gYmUKKyAgLy8vIGZvcm1lZCB3aXRoIHRoZSBzcGVjaWZpZWQgb3BlcmFuZHMuCisgIHN0YXRpYyBib29sIGlzVmFsaWRPcGVyYW5kcyhjb25zdCBWYWx1ZSAqVjEsIGNvbnN0IFZhbHVlICpWMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlICpNYXNrKTsKKworICAvLy8gT3ZlcmxvYWQgdG8gcmV0dXJuIG1vc3Qgc3BlY2lmaWMgdmVjdG9yIHR5cGUuCisgIC8vLworICBWZWN0b3JUeXBlICpnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PFZlY3RvclR5cGU+KEluc3RydWN0aW9uOjpnZXRUeXBlKCkpOworICB9CisKKyAgLy8vIFRyYW5zcGFyZW50bHkgcHJvdmlkZSBtb3JlIGVmZmljaWVudCBnZXRPcGVyYW5kIG1ldGhvZHMuCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworCisgIENvbnN0YW50ICpnZXRNYXNrKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PENvbnN0YW50PihnZXRPcGVyYW5kKDIpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHNodWZmbGUgbWFzayB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBlbGVtZW50IG9mIHRoZSBtYXNrLgorICAvLy8gUmV0dXJuIC0xIGlmIHRoZSBlbGVtZW50IGlzIHVuZGVmLgorICBzdGF0aWMgaW50IGdldE1hc2tWYWx1ZShDb25zdGFudCAqTWFzaywgdW5zaWduZWQgRWx0KTsKKworICAvLy8gUmV0dXJuIHRoZSBzaHVmZmxlIG1hc2sgdmFsdWUgb2YgdGhpcyBpbnN0cnVjdGlvbiBmb3IgdGhlIGdpdmVuIGVsZW1lbnQKKyAgLy8vIGluZGV4LiBSZXR1cm4gLTEgaWYgdGhlIGVsZW1lbnQgaXMgdW5kZWYuCisgIGludCBnZXRNYXNrVmFsdWUodW5zaWduZWQgRWx0KSBjb25zdCB7CisgICAgcmV0dXJuIGdldE1hc2tWYWx1ZShnZXRNYXNrKCksIEVsdCk7CisgIH0KKworICAvLy8gQ29udmVydCB0aGUgaW5wdXQgc2h1ZmZsZSBtYXNrIG9wZXJhbmQgdG8gYSB2ZWN0b3Igb2YgaW50ZWdlcnMuIFVuZGVmaW5lZAorICAvLy8gZWxlbWVudHMgb2YgdGhlIG1hc2sgYXJlIHJldHVybmVkIGFzIC0xLgorICBzdGF0aWMgdm9pZCBnZXRTaHVmZmxlTWFzayhDb25zdGFudCAqTWFzaywgU21hbGxWZWN0b3JJbXBsPGludD4gJlJlc3VsdCk7CisKKyAgLy8vIFJldHVybiB0aGUgbWFzayBmb3IgdGhpcyBpbnN0cnVjdGlvbiBhcyBhIHZlY3RvciBvZiBpbnRlZ2Vycy4gVW5kZWZpbmVkCisgIC8vLyBlbGVtZW50cyBvZiB0aGUgbWFzayBhcmUgcmV0dXJuZWQgYXMgLTEuCisgIHZvaWQgZ2V0U2h1ZmZsZU1hc2soU21hbGxWZWN0b3JJbXBsPGludD4gJlJlc3VsdCkgY29uc3QgeworICAgIHJldHVybiBnZXRTaHVmZmxlTWFzayhnZXRNYXNrKCksIFJlc3VsdCk7CisgIH0KKworICBTbWFsbFZlY3RvcjxpbnQsIDE2PiBnZXRTaHVmZmxlTWFzaygpIGNvbnN0IHsKKyAgICBTbWFsbFZlY3RvcjxpbnQsIDE2PiBNYXNrOworICAgIGdldFNodWZmbGVNYXNrKE1hc2spOworICAgIHJldHVybiBNYXNrOworICB9CisKKyAgLy8vIENoYW5nZSB2YWx1ZXMgaW4gYSBzaHVmZmxlIHBlcm11dGUgbWFzayBhc3N1bWluZyB0aGUgdHdvIHZlY3RvciBvcGVyYW5kcworICAvLy8gb2YgbGVuZ3RoIEluVmVjTnVtRWx0cyBoYXZlIHN3YXBwZWQgcG9zaXRpb24uCisgIHN0YXRpYyB2b2lkIGNvbW11dGVTaHVmZmxlTWFzayhNdXRhYmxlQXJyYXlSZWY8aW50PiBNYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgSW5WZWNOdW1FbHRzKSB7CisgICAgZm9yIChpbnQgJklkeCA6IE1hc2spIHsKKyAgICAgIGlmIChJZHggPT0gLTEpCisgICAgICAgIGNvbnRpbnVlOworICAgICAgSWR4ID0gSWR4IDwgKGludClJblZlY051bUVsdHMgPyBJZHggKyBJblZlY051bUVsdHMgOiBJZHggLSBJblZlY051bUVsdHM7CisgICAgICBhc3NlcnQoSWR4ID49IDAgJiYgSWR4IDwgKGludClJblZlY051bUVsdHMgKiAyICYmCisgICAgICAgICAgICAgInNodWZmbGV2ZWN0b3IgbWFzayBpbmRleCBvdXQgb2YgcmFuZ2UiKTsKKyAgICB9CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTaHVmZmxlVmVjdG9yOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPFNodWZmbGVWZWN0b3JJbnN0PiA6CisgIHB1YmxpYyBGaXhlZE51bU9wZXJhbmRUcmFpdHM8U2h1ZmZsZVZlY3Rvckluc3QsIDM+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhTaHVmZmxlVmVjdG9ySW5zdCwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFjdFZhbHVlSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgaW5zdHJ1Y3Rpb24gZXh0cmFjdHMgYSBzdHJ1Y3QgbWVtYmVyIG9yIGFycmF5CisvLy8gZWxlbWVudCB2YWx1ZSBmcm9tIGFuIGFnZ3JlZ2F0ZSB2YWx1ZS4KKy8vLworY2xhc3MgRXh0cmFjdFZhbHVlSW5zdCA6IHB1YmxpYyBVbmFyeUluc3RydWN0aW9uIHsKKyAgU21hbGxWZWN0b3I8dW5zaWduZWQsIDQ+IEluZGljZXM7CisKKyAgRXh0cmFjdFZhbHVlSW5zdChjb25zdCBFeHRyYWN0VmFsdWVJbnN0ICZFVkkpOworCisgIC8vLyBDb25zdHJ1Y3RvcnMgLSBDcmVhdGUgYSBleHRyYWN0dmFsdWUgaW5zdHJ1Y3Rpb24gd2l0aCBhIGJhc2UgYWdncmVnYXRlCisgIC8vLyB2YWx1ZSBhbmQgYSBsaXN0IG9mIGluZGljZXMuICBUaGUgZmlyc3QgY3RvciBjYW4gb3B0aW9uYWxseSBpbnNlcnQgYmVmb3JlCisgIC8vLyBhbiBleGlzdGluZyBpbnN0cnVjdGlvbiwgdGhlIHNlY29uZCBhcHBlbmRzIHRoZSBuZXcgaW5zdHJ1Y3Rpb24gdG8gdGhlCisgIC8vLyBzcGVjaWZpZWQgQmFzaWNCbG9jay4KKyAgaW5saW5lIEV4dHJhY3RWYWx1ZUluc3QoVmFsdWUgKkFnZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IElkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKyAgaW5saW5lIEV4dHJhY3RWYWx1ZUluc3QoVmFsdWUgKkFnZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IElkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgdm9pZCBpbml0KEFycmF5UmVmPHVuc2lnbmVkPiBJZHhzLCBjb25zdCBUd2luZSAmTmFtZVN0cik7CisKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIEV4dHJhY3RWYWx1ZUluc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIHN0YXRpYyBFeHRyYWN0VmFsdWVJbnN0ICpDcmVhdGUoVmFsdWUgKkFnZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gSWR4cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIG5ldworICAgICAgRXh0cmFjdFZhbHVlSW5zdChBZ2csIElkeHMsIE5hbWVTdHIsIEluc2VydEJlZm9yZSk7CisgIH0KKworICBzdGF0aWMgRXh0cmFjdFZhbHVlSW5zdCAqQ3JlYXRlKFZhbHVlICpBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IElkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICByZXR1cm4gbmV3IEV4dHJhY3RWYWx1ZUluc3QoQWdnLCBJZHhzLCBOYW1lU3RyLCBJbnNlcnRBdEVuZCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgZWxlbWVudCB0aGF0IHdvdWxkIGJlIGV4dHJhY3RlZAorICAvLy8gd2l0aCBhbiBleHRyYWN0dmFsdWUgaW5zdHJ1Y3Rpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHBhcmFtZXRlcnMuCisgIC8vLworICAvLy8gTnVsbCBpcyByZXR1cm5lZCBpZiB0aGUgaW5kaWNlcyBhcmUgaW52YWxpZCBmb3IgdGhlIHNwZWNpZmllZCB0eXBlLgorICBzdGF0aWMgVHlwZSAqZ2V0SW5kZXhlZFR5cGUoVHlwZSAqQWdnLCBBcnJheVJlZjx1bnNpZ25lZD4gSWR4cyk7CisKKyAgdXNpbmcgaWR4X2l0ZXJhdG9yID0gY29uc3QgdW5zaWduZWQqOworCisgIGlubGluZSBpZHhfaXRlcmF0b3IgaWR4X2JlZ2luKCkgY29uc3QgeyByZXR1cm4gSW5kaWNlcy5iZWdpbigpOyB9CisgIGlubGluZSBpZHhfaXRlcmF0b3IgaWR4X2VuZCgpICAgY29uc3QgeyByZXR1cm4gSW5kaWNlcy5lbmQoKTsgfQorICBpbmxpbmUgaXRlcmF0b3JfcmFuZ2U8aWR4X2l0ZXJhdG9yPiBpbmRpY2VzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGlkeF9iZWdpbigpLCBpZHhfZW5kKCkpOworICB9CisKKyAgVmFsdWUgKmdldEFnZ3JlZ2F0ZU9wZXJhbmQoKSB7CisgICAgcmV0dXJuIGdldE9wZXJhbmQoMCk7CisgIH0KKyAgY29uc3QgVmFsdWUgKmdldEFnZ3JlZ2F0ZU9wZXJhbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wZXJhbmQoMCk7CisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldEFnZ3JlZ2F0ZU9wZXJhbmRJbmRleCgpIHsKKyAgICByZXR1cm4gMFU7ICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBpbmRleCBmb3IgbW9kaWZ5aW5nIGNvcnJlY3Qgb3BlcmFuZAorICB9CisKKyAgQXJyYXlSZWY8dW5zaWduZWQ+IGdldEluZGljZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEluZGljZXM7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1JbmRpY2VzKCkgY29uc3QgeworICAgIHJldHVybiAodW5zaWduZWQpSW5kaWNlcy5zaXplKCk7CisgIH0KKworICBib29sIGhhc0luZGljZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpFeHRyYWN0VmFsdWU7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCitFeHRyYWN0VmFsdWVJbnN0OjpFeHRyYWN0VmFsdWVJbnN0KFZhbHVlICpBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkKKyAgOiBVbmFyeUluc3RydWN0aW9uKGNoZWNrR0VQVHlwZShnZXRJbmRleGVkVHlwZShBZ2ctPmdldFR5cGUoKSwgSWR4cykpLAorICAgICAgICAgICAgICAgICAgICAgRXh0cmFjdFZhbHVlLCBBZ2csIEluc2VydEJlZm9yZSkgeworICBpbml0KElkeHMsIE5hbWVTdHIpOworfQorCitFeHRyYWN0VmFsdWVJbnN0OjpFeHRyYWN0VmFsdWVJbnN0KFZhbHVlICpBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpCisgIDogVW5hcnlJbnN0cnVjdGlvbihjaGVja0dFUFR5cGUoZ2V0SW5kZXhlZFR5cGUoQWdnLT5nZXRUeXBlKCksIElkeHMpKSwKKyAgICAgICAgICAgICAgICAgICAgIEV4dHJhY3RWYWx1ZSwgQWdnLCBJbnNlcnRBdEVuZCkgeworICBpbml0KElkeHMsIE5hbWVTdHIpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydFZhbHVlSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgaW5zdHJ1Y3Rpb24gaW5zZXJ0cyBhIHN0cnVjdCBmaWVsZCBvZiBhcnJheSBlbGVtZW50CisvLy8gdmFsdWUgaW50byBhbiBhZ2dyZWdhdGUgdmFsdWUuCisvLy8KK2NsYXNzIEluc2VydFZhbHVlSW5zdCA6IHB1YmxpYyBJbnN0cnVjdGlvbiB7CisgIFNtYWxsVmVjdG9yPHVuc2lnbmVkLCA0PiBJbmRpY2VzOworCisgIEluc2VydFZhbHVlSW5zdChjb25zdCBJbnNlcnRWYWx1ZUluc3QgJklWSSk7CisKKyAgLy8vIENvbnN0cnVjdG9ycyAtIENyZWF0ZSBhIGluc2VydHZhbHVlIGluc3RydWN0aW9uIHdpdGggYSBiYXNlIGFnZ3JlZ2F0ZQorICAvLy8gdmFsdWUsIGEgdmFsdWUgdG8gaW5zZXJ0LCBhbmQgYSBsaXN0IG9mIGluZGljZXMuICBUaGUgZmlyc3QgY3RvciBjYW4KKyAgLy8vIG9wdGlvbmFsbHkgaW5zZXJ0IGJlZm9yZSBhbiBleGlzdGluZyBpbnN0cnVjdGlvbiwgdGhlIHNlY29uZCBhcHBlbmRzCisgIC8vLyB0aGUgbmV3IGluc3RydWN0aW9uIHRvIHRoZSBzcGVjaWZpZWQgQmFzaWNCbG9jay4KKyAgaW5saW5lIEluc2VydFZhbHVlSW5zdChWYWx1ZSAqQWdnLCBWYWx1ZSAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJZHhzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpOworICBpbmxpbmUgSW5zZXJ0VmFsdWVJbnN0KFZhbHVlICpBZ2csIFZhbHVlICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IElkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICAvLy8gQ29uc3RydWN0b3JzIC0gVGhlc2UgdHdvIGNvbnN0cnVjdG9ycyBhcmUgY29udmVuaWVuY2UgbWV0aG9kcyBiZWNhdXNlIG9uZQorICAvLy8gYW5kIHR3byBpbmRleCBpbnNlcnR2YWx1ZSBpbnN0cnVjdGlvbnMgYXJlIHNvIGNvbW1vbi4KKyAgSW5zZXJ0VmFsdWVJbnN0KFZhbHVlICpBZ2csIFZhbHVlICpWYWwsIHVuc2lnbmVkIElkeCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsCisgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisgIEluc2VydFZhbHVlSW5zdChWYWx1ZSAqQWdnLCBWYWx1ZSAqVmFsLCB1bnNpZ25lZCBJZHgsIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIHZvaWQgaW5pdChWYWx1ZSAqQWdnLCBWYWx1ZSAqVmFsLCBBcnJheVJlZjx1bnNpZ25lZD4gSWR4cywKKyAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyKTsKKworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgSW5zZXJ0VmFsdWVJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSB0d28gb3BlcmFuZHMKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBzKSB7CisgICAgcmV0dXJuIFVzZXI6Om9wZXJhdG9yIG5ldyhzLCAyKTsKKyAgfQorCisgIHN0YXRpYyBJbnNlcnRWYWx1ZUluc3QgKkNyZWF0ZShWYWx1ZSAqQWdnLCBWYWx1ZSAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IElkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gbmV3IEluc2VydFZhbHVlSW5zdChBZ2csIFZhbCwgSWR4cywgTmFtZVN0ciwgSW5zZXJ0QmVmb3JlKTsKKyAgfQorCisgIHN0YXRpYyBJbnNlcnRWYWx1ZUluc3QgKkNyZWF0ZShWYWx1ZSAqQWdnLCBWYWx1ZSAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IElkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgcmV0dXJuIG5ldyBJbnNlcnRWYWx1ZUluc3QoQWdnLCBWYWwsIElkeHMsIE5hbWVTdHIsIEluc2VydEF0RW5kKTsKKyAgfQorCisgIC8vLyBUcmFuc3BhcmVudGx5IHByb3ZpZGUgbW9yZSBlZmZpY2llbnQgZ2V0T3BlcmFuZCBtZXRob2RzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICB1c2luZyBpZHhfaXRlcmF0b3IgPSBjb25zdCB1bnNpZ25lZCo7CisKKyAgaW5saW5lIGlkeF9pdGVyYXRvciBpZHhfYmVnaW4oKSBjb25zdCB7IHJldHVybiBJbmRpY2VzLmJlZ2luKCk7IH0KKyAgaW5saW5lIGlkeF9pdGVyYXRvciBpZHhfZW5kKCkgICBjb25zdCB7IHJldHVybiBJbmRpY2VzLmVuZCgpOyB9CisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTxpZHhfaXRlcmF0b3I+IGluZGljZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoaWR4X2JlZ2luKCksIGlkeF9lbmQoKSk7CisgIH0KKworICBWYWx1ZSAqZ2V0QWdncmVnYXRlT3BlcmFuZCgpIHsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZCgwKTsKKyAgfQorICBjb25zdCBWYWx1ZSAqZ2V0QWdncmVnYXRlT3BlcmFuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZCgwKTsKKyAgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0QWdncmVnYXRlT3BlcmFuZEluZGV4KCkgeworICAgIHJldHVybiAwVTsgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGluZGV4IGZvciBtb2RpZnlpbmcgY29ycmVjdCBvcGVyYW5kCisgIH0KKworICBWYWx1ZSAqZ2V0SW5zZXJ0ZWRWYWx1ZU9wZXJhbmQoKSB7CisgICAgcmV0dXJuIGdldE9wZXJhbmQoMSk7CisgIH0KKyAgY29uc3QgVmFsdWUgKmdldEluc2VydGVkVmFsdWVPcGVyYW5kKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGVyYW5kKDEpOworICB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRJbnNlcnRlZFZhbHVlT3BlcmFuZEluZGV4KCkgeworICAgIHJldHVybiAxVTsgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGluZGV4IGZvciBtb2RpZnlpbmcgY29ycmVjdCBvcGVyYW5kCisgIH0KKworICBBcnJheVJlZjx1bnNpZ25lZD4gZ2V0SW5kaWNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5kaWNlczsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bUluZGljZXMoKSBjb25zdCB7CisgICAgcmV0dXJuICh1bnNpZ25lZClJbmRpY2VzLnNpemUoKTsKKyAgfQorCisgIGJvb2wgaGFzSW5kaWNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246Okluc2VydFZhbHVlOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPEluc2VydFZhbHVlSW5zdD4gOgorICBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPEluc2VydFZhbHVlSW5zdCwgMj4geworfTsKKworSW5zZXJ0VmFsdWVJbnN0OjpJbnNlcnRWYWx1ZUluc3QoVmFsdWUgKkFnZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gSWR4cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkKKyAgOiBJbnN0cnVjdGlvbihBZ2ctPmdldFR5cGUoKSwgSW5zZXJ0VmFsdWUsCisgICAgICAgICAgICAgICAgT3BlcmFuZFRyYWl0czxJbnNlcnRWYWx1ZUluc3Q+OjpvcF9iZWdpbih0aGlzKSwKKyAgICAgICAgICAgICAgICAyLCBJbnNlcnRCZWZvcmUpIHsKKyAgaW5pdChBZ2csIFZhbCwgSWR4cywgTmFtZVN0cik7Cit9CisKK0luc2VydFZhbHVlSW5zdDo6SW5zZXJ0VmFsdWVJbnN0KFZhbHVlICpBZ2csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqVmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dW5zaWduZWQ+IElkeHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKQorICA6IEluc3RydWN0aW9uKEFnZy0+Z2V0VHlwZSgpLCBJbnNlcnRWYWx1ZSwKKyAgICAgICAgICAgICAgICBPcGVyYW5kVHJhaXRzPEluc2VydFZhbHVlSW5zdD46Om9wX2JlZ2luKHRoaXMpLAorICAgICAgICAgICAgICAgIDIsIEluc2VydEF0RW5kKSB7CisgIGluaXQoQWdnLCBWYWwsIElkeHMsIE5hbWVTdHIpOworfQorCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoSW5zZXJ0VmFsdWVJbnN0LCBWYWx1ZSkKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBISU5vZGUgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFBISU5vZGUgLSBUaGUgUEhJTm9kZSBjbGFzcyBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgbWFnaWNhbCBteXN0aWNhbCBQSEkKKy8vIG5vZGUsIHRoYXQgY2FuIG5vdCBleGlzdCBpbiBuYXR1cmUsIGJ1dCBjYW4gYmUgc3ludGhlc2l6ZWQgaW4gYSBjb21wdXRlcgorLy8gc2NpZW50aXN0J3Mgb3ZlcmFjdGl2ZSBpbWFnaW5hdGlvbi4KKy8vCitjbGFzcyBQSElOb2RlIDogcHVibGljIEluc3RydWN0aW9uIHsKKyAgLy8vIFRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgYWN0dWFsbHkgYWxsb2NhdGVkLiAgTnVtT3BlcmFuZHMgaXMKKyAgLy8vIHRoZSBudW1iZXIgYWN0dWFsbHkgaW4gdXNlLgorICB1bnNpZ25lZCBSZXNlcnZlZFNwYWNlOworCisgIFBISU5vZGUoY29uc3QgUEhJTm9kZSAmUE4pOworCisgIGV4cGxpY2l0IFBISU5vZGUoVHlwZSAqVHksIHVuc2lnbmVkIE51bVJlc2VydmVkVmFsdWVzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsCisgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpCisgICAgOiBJbnN0cnVjdGlvbihUeSwgSW5zdHJ1Y3Rpb246OlBISSwgbnVsbHB0ciwgMCwgSW5zZXJ0QmVmb3JlKSwKKyAgICAgIFJlc2VydmVkU3BhY2UoTnVtUmVzZXJ2ZWRWYWx1ZXMpIHsKKyAgICBzZXROYW1lKE5hbWVTdHIpOworICAgIGFsbG9jSHVuZ29mZlVzZXMoUmVzZXJ2ZWRTcGFjZSk7CisgIH0KKworICBQSElOb2RlKFR5cGUgKlR5LCB1bnNpZ25lZCBOdW1SZXNlcnZlZFZhbHVlcywgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpCisgICAgOiBJbnN0cnVjdGlvbihUeSwgSW5zdHJ1Y3Rpb246OlBISSwgbnVsbHB0ciwgMCwgSW5zZXJ0QXRFbmQpLAorICAgICAgUmVzZXJ2ZWRTcGFjZShOdW1SZXNlcnZlZFZhbHVlcykgeworICAgIHNldE5hbWUoTmFtZVN0cik7CisgICAgYWxsb2NIdW5nb2ZmVXNlcyhSZXNlcnZlZFNwYWNlKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICBQSElOb2RlICpjbG9uZUltcGwoKSBjb25zdDsKKworICAvLyBhbGxvY0h1bmdvZmZVc2VzIC0gdGhpcyBpcyBtb3JlIGNvbXBsaWNhdGVkIHRoYW4gdGhlIGdlbmVyaWMKKyAgLy8gVXNlcjo6YWxsb2NIdW5nb2ZmVXNlcywgYmVjYXVzZSB3ZSBoYXZlIHRvIGFsbG9jYXRlIFVzZXMgZm9yIHRoZSBpbmNvbWluZworICAvLyB2YWx1ZXMgYW5kIHBvaW50ZXJzIHRvIHRoZSBpbmNvbWluZyBibG9ja3MsIGFsbCBpbiBvbmUgYWxsb2NhdGlvbi4KKyAgdm9pZCBhbGxvY0h1bmdvZmZVc2VzKHVuc2lnbmVkIE4pIHsKKyAgICBVc2VyOjphbGxvY0h1bmdvZmZVc2VzKE4sIC8qIElzUGhpICovIHRydWUpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9ycyAtIE51bVJlc2VydmVkVmFsdWVzIGlzIGEgaGludCBmb3IgdGhlIG51bWJlciBvZiBpbmNvbWluZworICAvLy8gZWRnZXMgdGhhdCB0aGlzIHBoaSBub2RlIHdpbGwgaGF2ZSAodXNlIDAgaWYgeW91IHJlYWxseSBoYXZlIG5vIGlkZWEpLgorICBzdGF0aWMgUEhJTm9kZSAqQ3JlYXRlKFR5cGUgKlR5LCB1bnNpZ25lZCBOdW1SZXNlcnZlZFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIG5ldyBQSElOb2RlKFR5LCBOdW1SZXNlcnZlZFZhbHVlcywgTmFtZVN0ciwgSW5zZXJ0QmVmb3JlKTsKKyAgfQorCisgIHN0YXRpYyBQSElOb2RlICpDcmVhdGUoVHlwZSAqVHksIHVuc2lnbmVkIE51bVJlc2VydmVkVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICAgIHJldHVybiBuZXcgUEhJTm9kZShUeSwgTnVtUmVzZXJ2ZWRWYWx1ZXMsIE5hbWVTdHIsIEluc2VydEF0RW5kKTsKKyAgfQorCisgIC8vLyBQcm92aWRlIGZhc3Qgb3BlcmFuZCBhY2Nlc3NvcnMKKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgLy8gQmxvY2sgaXRlcmF0b3IgaW50ZXJmYWNlLiBUaGlzIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbGlzdCBvZiBpbmNvbWluZworICAvLyBiYXNpYyBibG9ja3MsIHdoaWNoIHBhcmFsbGVscyB0aGUgbGlzdCBvZiBpbmNvbWluZyB2YWx1ZXMuCisKKyAgdXNpbmcgYmxvY2tfaXRlcmF0b3IgPSBCYXNpY0Jsb2NrICoqOworICB1c2luZyBjb25zdF9ibG9ja19pdGVyYXRvciA9IEJhc2ljQmxvY2sgKiBjb25zdCAqOworCisgIGJsb2NrX2l0ZXJhdG9yIGJsb2NrX2JlZ2luKCkgeworICAgIFVzZTo6VXNlclJlZiAqcmVmID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VXNlOjpVc2VyUmVmKj4ob3BfYmVnaW4oKSArIFJlc2VydmVkU3BhY2UpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGJsb2NrX2l0ZXJhdG9yPihyZWYgKyAxKTsKKyAgfQorCisgIGNvbnN0X2Jsb2NrX2l0ZXJhdG9yIGJsb2NrX2JlZ2luKCkgY29uc3QgeworICAgIGNvbnN0IFVzZTo6VXNlclJlZiAqcmVmID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVXNlOjpVc2VyUmVmKj4ob3BfYmVnaW4oKSArIFJlc2VydmVkU3BhY2UpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0X2Jsb2NrX2l0ZXJhdG9yPihyZWYgKyAxKTsKKyAgfQorCisgIGJsb2NrX2l0ZXJhdG9yIGJsb2NrX2VuZCgpIHsKKyAgICByZXR1cm4gYmxvY2tfYmVnaW4oKSArIGdldE51bU9wZXJhbmRzKCk7CisgIH0KKworICBjb25zdF9ibG9ja19pdGVyYXRvciBibG9ja19lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGJsb2NrX2JlZ2luKCkgKyBnZXROdW1PcGVyYW5kcygpOworICB9CisKKyAgaXRlcmF0b3JfcmFuZ2U8YmxvY2tfaXRlcmF0b3I+IGJsb2NrcygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShibG9ja19iZWdpbigpLCBibG9ja19lbmQoKSk7CisgIH0KKworICBpdGVyYXRvcl9yYW5nZTxjb25zdF9ibG9ja19pdGVyYXRvcj4gYmxvY2tzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGJsb2NrX2JlZ2luKCksIGJsb2NrX2VuZCgpKTsKKyAgfQorCisgIG9wX3JhbmdlIGluY29taW5nX3ZhbHVlcygpIHsgcmV0dXJuIG9wZXJhbmRzKCk7IH0KKworICBjb25zdF9vcF9yYW5nZSBpbmNvbWluZ192YWx1ZXMoKSBjb25zdCB7IHJldHVybiBvcGVyYW5kcygpOyB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGluY29taW5nIGVkZ2VzCisgIC8vLworICB1bnNpZ25lZCBnZXROdW1JbmNvbWluZ1ZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIGdldE51bU9wZXJhbmRzKCk7IH0KKworICAvLy8gUmV0dXJuIGluY29taW5nIHZhbHVlIG51bWJlciB4CisgIC8vLworICBWYWx1ZSAqZ2V0SW5jb21pbmdWYWx1ZSh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wZXJhbmQoaSk7CisgIH0KKyAgdm9pZCBzZXRJbmNvbWluZ1ZhbHVlKHVuc2lnbmVkIGksIFZhbHVlICpWKSB7CisgICAgYXNzZXJ0KFYgJiYgIlBISSBub2RlIGdvdCBhIG51bGwgdmFsdWUhIik7CisgICAgYXNzZXJ0KGdldFR5cGUoKSA9PSBWLT5nZXRUeXBlKCkgJiYKKyAgICAgICAgICAgIkFsbCBvcGVyYW5kcyB0byBQSEkgbm9kZSBtdXN0IGJlIHRoZSBzYW1lIHR5cGUgYXMgdGhlIFBISSBub2RlISIpOworICAgIHNldE9wZXJhbmQoaSwgVik7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0T3BlcmFuZE51bUZvckluY29taW5nVmFsdWUodW5zaWduZWQgaSkgeworICAgIHJldHVybiBpOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEluY29taW5nVmFsdWVOdW1Gb3JPcGVyYW5kKHVuc2lnbmVkIGkpIHsKKyAgICByZXR1cm4gaTsKKyAgfQorCisgIC8vLyBSZXR1cm4gaW5jb21pbmcgYmFzaWMgYmxvY2sgbnVtYmVyIEBwIGkuCisgIC8vLworICBCYXNpY0Jsb2NrICpnZXRJbmNvbWluZ0Jsb2NrKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICByZXR1cm4gYmxvY2tfYmVnaW4oKVtpXTsKKyAgfQorCisgIC8vLyBSZXR1cm4gaW5jb21pbmcgYmFzaWMgYmxvY2sgY29ycmVzcG9uZGluZworICAvLy8gdG8gYW4gb3BlcmFuZCBvZiB0aGUgUEhJLgorICAvLy8KKyAgQmFzaWNCbG9jayAqZ2V0SW5jb21pbmdCbG9jayhjb25zdCBVc2UgJlUpIGNvbnN0IHsKKyAgICBhc3NlcnQodGhpcyA9PSBVLmdldFVzZXIoKSAmJiAiSXRlcmF0b3IgZG9lc24ndCBwb2ludCB0byBQSEkncyBVc2VzPyIpOworICAgIHJldHVybiBnZXRJbmNvbWluZ0Jsb2NrKHVuc2lnbmVkKCZVIC0gb3BfYmVnaW4oKSkpOworICB9CisKKyAgLy8vIFJldHVybiBpbmNvbWluZyBiYXNpYyBibG9jayBjb3JyZXNwb25kaW5nCisgIC8vLyB0byB2YWx1ZSB1c2UgaXRlcmF0b3IuCisgIC8vLworICBCYXNpY0Jsb2NrICpnZXRJbmNvbWluZ0Jsb2NrKFZhbHVlOjpjb25zdF91c2VyX2l0ZXJhdG9yIEkpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SW5jb21pbmdCbG9jayhJLmdldFVzZSgpKTsKKyAgfQorCisgIHZvaWQgc2V0SW5jb21pbmdCbG9jayh1bnNpZ25lZCBpLCBCYXNpY0Jsb2NrICpCQikgeworICAgIGFzc2VydChCQiAmJiAiUEhJIG5vZGUgZ290IGEgbnVsbCBiYXNpYyBibG9jayEiKTsKKyAgICBibG9ja19iZWdpbigpW2ldID0gQkI7CisgIH0KKworICAvLy8gQWRkIGFuIGluY29taW5nIHZhbHVlIHRvIHRoZSBlbmQgb2YgdGhlIFBISSBsaXN0CisgIC8vLworICB2b2lkIGFkZEluY29taW5nKFZhbHVlICpWLCBCYXNpY0Jsb2NrICpCQikgeworICAgIGlmIChnZXROdW1PcGVyYW5kcygpID09IFJlc2VydmVkU3BhY2UpCisgICAgICBncm93T3BlcmFuZHMoKTsgIC8vIEdldCBtb3JlIHNwYWNlIQorICAgIC8vIEluaXRpYWxpemUgc29tZSBuZXcgb3BlcmFuZHMuCisgICAgc2V0TnVtSHVuZ09mZlVzZU9wZXJhbmRzKGdldE51bU9wZXJhbmRzKCkgKyAxKTsKKyAgICBzZXRJbmNvbWluZ1ZhbHVlKGdldE51bU9wZXJhbmRzKCkgLSAxLCBWKTsKKyAgICBzZXRJbmNvbWluZ0Jsb2NrKGdldE51bU9wZXJhbmRzKCkgLSAxLCBCQik7CisgIH0KKworICAvLy8gUmVtb3ZlIGFuIGluY29taW5nIHZhbHVlLiAgVGhpcyBpcyB1c2VmdWwgaWYgYQorICAvLy8gcHJlZGVjZXNzb3IgYmFzaWMgYmxvY2sgaXMgZGVsZXRlZC4gIFRoZSB2YWx1ZSByZW1vdmVkIGlzIHJldHVybmVkLgorICAvLy8KKyAgLy8vIElmIHRoZSBsYXN0IGluY29taW5nIHZhbHVlIGZvciBhIFBISSBub2RlIGlzIHJlbW92ZWQgKGFuZCBEZWxldGVQSElJZkVtcHR5CisgIC8vLyBpcyB0cnVlKSwgdGhlIFBISSBub2RlIGlzIGRlc3Ryb3llZCBhbmQgYW55IHVzZXMgb2YgaXQgYXJlIHJlcGxhY2VkIHdpdGgKKyAgLy8vIGR1bW15IHZhbHVlcy4gIFRoZSBvbmx5IHRpbWUgdGhlcmUgc2hvdWxkIGJlIHplcm8gaW5jb21pbmcgdmFsdWVzIHRvIGEgUEhJCisgIC8vLyBub2RlIGlzIHdoZW4gdGhlIGJsb2NrIGlzIGRlYWQsIHNvIHRoaXMgc3RyYXRlZ3kgaXMgc291bmQuCisgIC8vLworICBWYWx1ZSAqcmVtb3ZlSW5jb21pbmdWYWx1ZSh1bnNpZ25lZCBJZHgsIGJvb2wgRGVsZXRlUEhJSWZFbXB0eSA9IHRydWUpOworCisgIFZhbHVlICpyZW1vdmVJbmNvbWluZ1ZhbHVlKGNvbnN0IEJhc2ljQmxvY2sgKkJCLCBib29sIERlbGV0ZVBISUlmRW1wdHk9dHJ1ZSkgeworICAgIGludCBJZHggPSBnZXRCYXNpY0Jsb2NrSW5kZXgoQkIpOworICAgIGFzc2VydChJZHggPj0gMCAmJiAiSW52YWxpZCBiYXNpYyBibG9jayBhcmd1bWVudCB0byByZW1vdmUhIik7CisgICAgcmV0dXJuIHJlbW92ZUluY29taW5nVmFsdWUoSWR4LCBEZWxldGVQSElJZkVtcHR5KTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGZpcnN0IGluZGV4IG9mIHRoZSBzcGVjaWZpZWQgYmFzaWMKKyAgLy8vIGJsb2NrIGluIHRoZSB2YWx1ZSBsaXN0IGZvciB0aGlzIFBISS4gIFJldHVybnMgLTEgaWYgbm8gaW5zdGFuY2UuCisgIC8vLworICBpbnQgZ2V0QmFzaWNCbG9ja0luZGV4KGNvbnN0IEJhc2ljQmxvY2sgKkJCKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKGJsb2NrX2JlZ2luKClbaV0gPT0gQkIpCisgICAgICAgIHJldHVybiBpOworICAgIHJldHVybiAtMTsKKyAgfQorCisgIFZhbHVlICpnZXRJbmNvbWluZ1ZhbHVlRm9yQmxvY2soY29uc3QgQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICBpbnQgSWR4ID0gZ2V0QmFzaWNCbG9ja0luZGV4KEJCKTsKKyAgICBhc3NlcnQoSWR4ID49IDAgJiYgIkludmFsaWQgYmFzaWMgYmxvY2sgYXJndW1lbnQhIik7CisgICAgcmV0dXJuIGdldEluY29taW5nVmFsdWUoSWR4KTsKKyAgfQorCisgIC8vLyBJZiB0aGUgc3BlY2lmaWVkIFBISSBub2RlIGFsd2F5cyBtZXJnZXMgdG9nZXRoZXIgdGhlCisgIC8vLyBzYW1lIHZhbHVlLCByZXR1cm4gdGhlIHZhbHVlLCBvdGhlcndpc2UgcmV0dXJuIG51bGwuCisgIFZhbHVlICpoYXNDb25zdGFudFZhbHVlKCkgY29uc3Q7CisKKyAgLy8vIFdoZXRoZXIgdGhlIHNwZWNpZmllZCBQSEkgbm9kZSBhbHdheXMgbWVyZ2VzCisgIC8vLyB0b2dldGhlciB0aGUgc2FtZSB2YWx1ZSwgYXNzdW1pbmcgdW5kZWZzIGFyZSBlcXVhbCB0byBhIHVuaXF1ZQorICAvLy8gbm9uLXVuZGVmIHZhbHVlLgorICBib29sIGhhc0NvbnN0YW50T3JVbmRlZlZhbHVlKCkgY29uc3Q7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlBISTsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBncm93T3BlcmFuZHMoKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxQSElOb2RlPiA6IHB1YmxpYyBIdW5nb2ZmT3BlcmFuZFRyYWl0czwyPiB7Cit9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoUEhJTm9kZSwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIExhbmRpbmdQYWRJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vIFRoZSBsYW5kaW5ncGFkIGluc3RydWN0aW9uIGhvbGRzIGFsbCBvZiB0aGUgaW5mb3JtYXRpb24KKy8vLyBuZWNlc3NhcnkgdG8gZ2VuZXJhdGUgY29ycmVjdCBleGNlcHRpb24gaGFuZGxpbmcuIFRoZSBsYW5kaW5ncGFkIGluc3RydWN0aW9uCisvLy8gY2Fubm90IGJlIG1vdmVkIGZyb20gdGhlIHRvcCBvZiBhIGxhbmRpbmcgcGFkIGJsb2NrLCB3aGljaCBpdHNlbGYgaXMKKy8vLyBhY2Nlc3NpYmxlIG9ubHkgZnJvbSB0aGUgJ3Vud2luZCcgZWRnZSBvZiBhbiBpbnZva2UuIFRoaXMgdXNlcyB0aGUKKy8vLyBTdWJjbGFzc0RhdGEgZmllbGQgaW4gVmFsdWUgdG8gc3RvcmUgd2hldGhlciBvciBub3QgdGhlIGxhbmRpbmdwYWQgaXMgYQorLy8vIGNsZWFudXAuCisvLy8KK2NsYXNzIExhbmRpbmdQYWRJbnN0IDogcHVibGljIEluc3RydWN0aW9uIHsKKyAgLy8vIFRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgYWN0dWFsbHkgYWxsb2NhdGVkLiAgTnVtT3BlcmFuZHMgaXMKKyAgLy8vIHRoZSBudW1iZXIgYWN0dWFsbHkgaW4gdXNlLgorICB1bnNpZ25lZCBSZXNlcnZlZFNwYWNlOworCisgIExhbmRpbmdQYWRJbnN0KGNvbnN0IExhbmRpbmdQYWRJbnN0ICZMUCk7CisKK3B1YmxpYzoKKyAgZW51bSBDbGF1c2VUeXBlIHsgQ2F0Y2gsIEZpbHRlciB9OworCitwcml2YXRlOgorICBleHBsaWNpdCBMYW5kaW5nUGFkSW5zdChUeXBlICpSZXRUeSwgdW5zaWduZWQgTnVtUmVzZXJ2ZWRWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKyAgZXhwbGljaXQgTGFuZGluZ1BhZEluc3QoVHlwZSAqUmV0VHksIHVuc2lnbmVkIE51bVJlc2VydmVkVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIC8vIEFsbG9jYXRlIHNwYWNlIGZvciBleGFjdGx5IHplcm8gb3BlcmFuZHMuCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeworICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocyk7CisgIH0KKworICB2b2lkIGdyb3dPcGVyYW5kcyh1bnNpZ25lZCBTaXplKTsKKyAgdm9pZCBpbml0KHVuc2lnbmVkIE51bVJlc2VydmVkVmFsdWVzLCBjb25zdCBUd2luZSAmTmFtZVN0cik7CisKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIExhbmRpbmdQYWRJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0b3JzIC0gTnVtUmVzZXJ2ZWRDbGF1c2VzIGlzIGEgaGludCBmb3IgdGhlIG51bWJlciBvZiBpbmNvbWluZworICAvLy8gY2xhdXNlcyB0aGF0IHRoaXMgbGFuZGluZ3BhZCB3aWxsIGhhdmUgKHVzZSAwIGlmIHlvdSByZWFsbHkgaGF2ZSBubyBpZGVhKS4KKyAgc3RhdGljIExhbmRpbmdQYWRJbnN0ICpDcmVhdGUoVHlwZSAqUmV0VHksIHVuc2lnbmVkIE51bVJlc2VydmVkQ2xhdXNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBzdGF0aWMgTGFuZGluZ1BhZEluc3QgKkNyZWF0ZShUeXBlICpSZXRUeSwgdW5zaWduZWQgTnVtUmVzZXJ2ZWRDbGF1c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIC8vLyBQcm92aWRlIGZhc3Qgb3BlcmFuZCBhY2Nlc3NvcnMKKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgLy8vIFJldHVybiAndHJ1ZScgaWYgdGhpcyBsYW5kaW5ncGFkIGluc3RydWN0aW9uIGlzIGEKKyAgLy8vIGNsZWFudXAuIEkuZS4sIGl0IHNob3VsZCBiZSBydW4gd2hlbiB1bndpbmRpbmcgZXZlbiBpZiBpdHMgbGFuZGluZyBwYWQKKyAgLy8vIGRvZXNuJ3QgY2F0Y2ggdGhlIGV4Y2VwdGlvbi4KKyAgYm9vbCBpc0NsZWFudXAoKSBjb25zdCB7IHJldHVybiBnZXRTdWJjbGFzc0RhdGFGcm9tSW5zdHJ1Y3Rpb24oKSAmIDE7IH0KKworICAvLy8gSW5kaWNhdGUgdGhhdCB0aGlzIGxhbmRpbmdwYWQgaW5zdHJ1Y3Rpb24gaXMgYSBjbGVhbnVwLgorICB2b2lkIHNldENsZWFudXAoYm9vbCBWKSB7CisgICAgc2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoKGdldFN1YmNsYXNzRGF0YUZyb21JbnN0cnVjdGlvbigpICYgfjEpIHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoViA/IDEgOiAwKSk7CisgIH0KKworICAvLy8gQWRkIGEgY2F0Y2ggb3IgZmlsdGVyIGNsYXVzZSB0byB0aGUgbGFuZGluZyBwYWQuCisgIHZvaWQgYWRkQ2xhdXNlKENvbnN0YW50ICpDbGF1c2VWYWwpOworCisgIC8vLyBHZXQgdGhlIHZhbHVlIG9mIHRoZSBjbGF1c2UgYXQgaW5kZXggSWR4LiBVc2UgaXNDYXRjaC9pc0ZpbHRlciB0bworICAvLy8gZGV0ZXJtaW5lIHdoYXQgdHlwZSBvZiBjbGF1c2UgdGhpcyBpcy4KKyAgQ29uc3RhbnQgKmdldENsYXVzZSh1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxDb25zdGFudD4oZ2V0T3BlcmFuZExpc3QoKVtJZHhdKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gJ3RydWUnIGlmIHRoZSBjbGF1c2UgYW5kIGluZGV4IElkeCBpcyBhIGNhdGNoIGNsYXVzZS4KKyAgYm9vbCBpc0NhdGNoKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIHJldHVybiAhaXNhPEFycmF5VHlwZT4oZ2V0T3BlcmFuZExpc3QoKVtJZHhdLT5nZXRUeXBlKCkpOworICB9CisKKyAgLy8vIFJldHVybiAndHJ1ZScgaWYgdGhlIGNsYXVzZSBhbmQgaW5kZXggSWR4IGlzIGEgZmlsdGVyIGNsYXVzZS4KKyAgYm9vbCBpc0ZpbHRlcih1bnNpZ25lZCBJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNhPEFycmF5VHlwZT4oZ2V0T3BlcmFuZExpc3QoKVtJZHhdLT5nZXRUeXBlKCkpOworICB9CisKKyAgLy8vIEdldCB0aGUgbnVtYmVyIG9mIGNsYXVzZXMgZm9yIHRoaXMgbGFuZGluZyBwYWQuCisgIHVuc2lnbmVkIGdldE51bUNsYXVzZXMoKSBjb25zdCB7IHJldHVybiBnZXROdW1PcGVyYW5kcygpOyB9CisKKyAgLy8vIEdyb3cgdGhlIHNpemUgb2YgdGhlIG9wZXJhbmQgbGlzdCB0byBhY2NvbW1vZGF0ZSB0aGUgbmV3CisgIC8vLyBudW1iZXIgb2YgY2xhdXNlcy4KKyAgdm9pZCByZXNlcnZlQ2xhdXNlcyh1bnNpZ25lZCBTaXplKSB7IGdyb3dPcGVyYW5kcyhTaXplKTsgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkxhbmRpbmdQYWQ7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8TGFuZGluZ1BhZEluc3Q+IDogcHVibGljIEh1bmdvZmZPcGVyYW5kVHJhaXRzPDE+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhMYW5kaW5nUGFkSW5zdCwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXR1cm5JbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vIFJldHVybiBhIHZhbHVlIChwb3NzaWJseSB2b2lkKSwgZnJvbSBhIGZ1bmN0aW9uLiAgRXhlY3V0aW9uCisvLy8gZG9lcyBub3QgY29udGludWUgaW4gdGhpcyBmdW5jdGlvbiBhbnkgbG9uZ2VyLgorLy8vCitjbGFzcyBSZXR1cm5JbnN0IDogcHVibGljIFRlcm1pbmF0b3JJbnN0IHsKKyAgUmV0dXJuSW5zdChjb25zdCBSZXR1cm5JbnN0ICZSSSk7CisKK3ByaXZhdGU6CisgIC8vIFJldHVybkluc3QgY29uc3RydWN0b3JzOgorICAvLyBSZXR1cm5JbnN0KCkgICAgICAgICAgICAgICAgICAtICdyZXQgdm9pZCcgaW5zdHJ1Y3Rpb24KKyAgLy8gUmV0dXJuSW5zdCggICAgbnVsbCkgICAgICAgICAgLSAncmV0IHZvaWQnIGluc3RydWN0aW9uCisgIC8vIFJldHVybkluc3QoVmFsdWUqIFgpICAgICAgICAgIC0gJ3JldCBYJyAgICBpbnN0cnVjdGlvbgorICAvLyBSZXR1cm5JbnN0KCAgICBudWxsLCBJbnN0ICpJKSAtICdyZXQgdm9pZCcgaW5zdHJ1Y3Rpb24sIGluc2VydCBiZWZvcmUgSQorICAvLyBSZXR1cm5JbnN0KFZhbHVlKiBYLCBJbnN0ICpJKSAtICdyZXQgWCcgICAgaW5zdHJ1Y3Rpb24sIGluc2VydCBiZWZvcmUgSQorICAvLyBSZXR1cm5JbnN0KCAgICBudWxsLCBCQiAqQikgICAtICdyZXQgdm9pZCcgaW5zdHJ1Y3Rpb24sIGluc2VydCBAIGVuZCBvZiBCCisgIC8vIFJldHVybkluc3QoVmFsdWUqIFgsIEJCICpCKSAgIC0gJ3JldCBYJyAgICBpbnN0cnVjdGlvbiwgaW5zZXJ0IEAgZW5kIG9mIEIKKyAgLy8KKyAgLy8gTk9URTogSWYgdGhlIFZhbHVlKiBwYXNzZWQgaXMgb2YgdHlwZSB2b2lkIHRoZW4gdGhlIGNvbnN0cnVjdG9yIGJlaGF2ZXMgYXMKKyAgLy8gaWYgaXQgd2FzIHBhc3NlZCBOVUxMLgorICBleHBsaWNpdCBSZXR1cm5JbnN0KExMVk1Db250ZXh0ICZDLCBWYWx1ZSAqcmV0VmFsID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisgIFJldHVybkluc3QoTExWTUNvbnRleHQgJkMsIFZhbHVlICpyZXRWYWwsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKyAgZXhwbGljaXQgUmV0dXJuSW5zdChMTFZNQ29udGV4dCAmQywgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCitwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICBSZXR1cm5JbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICBzdGF0aWMgUmV0dXJuSW5zdCogQ3JlYXRlKExMVk1Db250ZXh0ICZDLCBWYWx1ZSAqcmV0VmFsID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIHJldHVybiBuZXcoISFyZXRWYWwpIFJldHVybkluc3QoQywgcmV0VmFsLCBJbnNlcnRCZWZvcmUpOworICB9CisKKyAgc3RhdGljIFJldHVybkluc3QqIENyZWF0ZShMTFZNQ29udGV4dCAmQywgVmFsdWUgKnJldFZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICAgIHJldHVybiBuZXcoISFyZXRWYWwpIFJldHVybkluc3QoQywgcmV0VmFsLCBJbnNlcnRBdEVuZCk7CisgIH0KKworICBzdGF0aWMgUmV0dXJuSW5zdCogQ3JlYXRlKExMVk1Db250ZXh0ICZDLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICAgIHJldHVybiBuZXcoMCkgUmV0dXJuSW5zdChDLCBJbnNlcnRBdEVuZCk7CisgIH0KKworICAvLy8gUHJvdmlkZSBmYXN0IG9wZXJhbmQgYWNjZXNzb3JzCisgIERFQ0xBUkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoVmFsdWUpOworCisgIC8vLyBDb252ZW5pZW5jZSBhY2Nlc3Nvci4gUmV0dXJucyBudWxsIGlmIHRoZXJlIGlzIG5vIHJldHVybiB2YWx1ZS4KKyAgVmFsdWUgKmdldFJldHVyblZhbHVlKCkgY29uc3QgeworICAgIHJldHVybiBnZXROdW1PcGVyYW5kcygpICE9IDAgPyBnZXRPcGVyYW5kKDApIDogbnVsbHB0cjsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bVN1Y2Nlc3NvcnMoKSBjb25zdCB7IHJldHVybiAwOyB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiAoSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlJldCk7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBUZXJtaW5hdG9ySW5zdDsKKworICBCYXNpY0Jsb2NrICpnZXRTdWNjZXNzb3IodW5zaWduZWQgaWR4KSBjb25zdCB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiUmV0dXJuSW5zdCBoYXMgbm8gc3VjY2Vzc29ycyEiKTsKKyAgfQorCisgIHZvaWQgc2V0U3VjY2Vzc29yKHVuc2lnbmVkIGlkeCwgQmFzaWNCbG9jayAqQikgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlJldHVybkluc3QgaGFzIG5vIHN1Y2Nlc3NvcnMhIik7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxSZXR1cm5JbnN0PiA6IHB1YmxpYyBWYXJpYWRpY09wZXJhbmRUcmFpdHM8UmV0dXJuSW5zdD4geworfTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFJldHVybkluc3QsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnJhbmNoSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLyBDb25kaXRpb25hbCBvciBVbmNvbmRpdGlvbmFsIEJyYW5jaCBpbnN0cnVjdGlvbi4KKy8vLworY2xhc3MgQnJhbmNoSW5zdCA6IHB1YmxpYyBUZXJtaW5hdG9ySW5zdCB7CisgIC8vLyBPcHMgbGlzdCAtIEJyYW5jaGVzIGFyZSBzdHJhbmdlLiAgVGhlIG9wZXJhbmRzIGFyZSBvcmRlcmVkOgorICAvLy8gIFtDb25kLCBGYWxzZURlc3QsXSBUcnVlRGVzdC4gIFRoaXMgbWFrZXMgc29tZSBhY2Nlc3NvcnMgZmFzdGVyIGJlY2F1c2UKKyAgLy8vIHRoZXkgZG9uJ3QgaGF2ZSB0byBjaGVjayBmb3IgY29uZC91bmNvbmQgYnJhbmNobmVzcy4gVGhlc2UgYXJlIG1vc3RseQorICAvLy8gYWNjZXNzZWQgcmVsYXRpdmUgZnJvbSBvcF9lbmQoKS4KKyAgQnJhbmNoSW5zdChjb25zdCBCcmFuY2hJbnN0ICZCSSk7CisgIC8vIEJyYW5jaEluc3QgY29uc3RydWN0b3JzICh3aGVyZSB7QiwgVCwgRn0gYXJlIGJsb2NrcywgYW5kIEMgaXMgYSBjb25kaXRpb24pOgorICAvLyBCcmFuY2hJbnN0KEJCICpCKSAgICAgICAgICAgICAgICAgICAgICAgICAgIC0gJ2JyIEInCisgIC8vIEJyYW5jaEluc3QoQkIqIFQsIEJCICpGLCBWYWx1ZSAqQykgICAgICAgICAgLSAnYnIgQywgVCwgRicKKyAgLy8gQnJhbmNoSW5zdChCQiogQiwgSW5zdCAqSSkgICAgICAgICAgICAgICAgICAtICdiciBCJyAgICAgICAgaW5zZXJ0IGJlZm9yZSBJCisgIC8vIEJyYW5jaEluc3QoQkIqIFQsIEJCICpGLCBWYWx1ZSAqQywgSW5zdCAqSSkgLSAnYnIgQywgVCwgRicsIGluc2VydCBiZWZvcmUgSQorICAvLyBCcmFuY2hJbnN0KEJCKiBCLCBCQiAqSSkgICAgICAgICAgICAgICAgICAgIC0gJ2JyIEInICAgICAgICBpbnNlcnQgYXQgZW5kCisgIC8vIEJyYW5jaEluc3QoQkIqIFQsIEJCICpGLCBWYWx1ZSAqQywgQkIgKkkpICAgLSAnYnIgQywgVCwgRicsIGluc2VydCBhdCBlbmQKKyAgZXhwbGljaXQgQnJhbmNoSW5zdChCYXNpY0Jsb2NrICpJZlRydWUsIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKyAgQnJhbmNoSW5zdChCYXNpY0Jsb2NrICpJZlRydWUsIEJhc2ljQmxvY2sgKklmRmFsc2UsIFZhbHVlICpDb25kLAorICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKTsKKyAgQnJhbmNoSW5zdChCYXNpY0Jsb2NrICpJZlRydWUsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKyAgQnJhbmNoSW5zdChCYXNpY0Jsb2NrICpJZlRydWUsIEJhc2ljQmxvY2sgKklmRmFsc2UsIFZhbHVlICpDb25kLAorICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICB2b2lkIEFzc2VydE9LKCk7CisKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIEJyYW5jaEluc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIHN0YXRpYyBCcmFuY2hJbnN0ICpDcmVhdGUoQmFzaWNCbG9jayAqSWZUcnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIG5ldygxKSBCcmFuY2hJbnN0KElmVHJ1ZSwgSW5zZXJ0QmVmb3JlKTsKKyAgfQorCisgIHN0YXRpYyBCcmFuY2hJbnN0ICpDcmVhdGUoQmFzaWNCbG9jayAqSWZUcnVlLCBCYXNpY0Jsb2NrICpJZkZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpDb25kLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIHJldHVybiBuZXcoMykgQnJhbmNoSW5zdChJZlRydWUsIElmRmFsc2UsIENvbmQsIEluc2VydEJlZm9yZSk7CisgIH0KKworICBzdGF0aWMgQnJhbmNoSW5zdCAqQ3JlYXRlKEJhc2ljQmxvY2sgKklmVHJ1ZSwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICByZXR1cm4gbmV3KDEpIEJyYW5jaEluc3QoSWZUcnVlLCBJbnNlcnRBdEVuZCk7CisgIH0KKworICBzdGF0aWMgQnJhbmNoSW5zdCAqQ3JlYXRlKEJhc2ljQmxvY2sgKklmVHJ1ZSwgQmFzaWNCbG9jayAqSWZGYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqQ29uZCwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICByZXR1cm4gbmV3KDMpIEJyYW5jaEluc3QoSWZUcnVlLCBJZkZhbHNlLCBDb25kLCBJbnNlcnRBdEVuZCk7CisgIH0KKworICAvLy8gVHJhbnNwYXJlbnRseSBwcm92aWRlIG1vcmUgZWZmaWNpZW50IGdldE9wZXJhbmQgbWV0aG9kcy4KKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgYm9vbCBpc1VuY29uZGl0aW9uYWwoKSBjb25zdCB7IHJldHVybiBnZXROdW1PcGVyYW5kcygpID09IDE7IH0KKyAgYm9vbCBpc0NvbmRpdGlvbmFsKCkgICBjb25zdCB7IHJldHVybiBnZXROdW1PcGVyYW5kcygpID09IDM7IH0KKworICBWYWx1ZSAqZ2V0Q29uZGl0aW9uKCkgY29uc3QgeworICAgIGFzc2VydChpc0NvbmRpdGlvbmFsKCkgJiYgIkNhbm5vdCBnZXQgY29uZGl0aW9uIG9mIGFuIHVuY29uZCBicmFuY2ghIik7CisgICAgcmV0dXJuIE9wPC0zPigpOworICB9CisKKyAgdm9pZCBzZXRDb25kaXRpb24oVmFsdWUgKlYpIHsKKyAgICBhc3NlcnQoaXNDb25kaXRpb25hbCgpICYmICJDYW5ub3Qgc2V0IGNvbmRpdGlvbiBvZiB1bmNvbmRpdGlvbmFsIGJyYW5jaCEiKTsKKyAgICBPcDwtMz4oKSA9IFY7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1TdWNjZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gMStpc0NvbmRpdGlvbmFsKCk7IH0KKworICBCYXNpY0Jsb2NrICpnZXRTdWNjZXNzb3IodW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgZ2V0TnVtU3VjY2Vzc29ycygpICYmICJTdWNjZXNzb3IgIyBvdXQgb2YgcmFuZ2UgZm9yIEJyYW5jaCEiKTsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPEJhc2ljQmxvY2s+KCgmT3A8LTE+KCkgLSBpKS0+Z2V0KCkpOworICB9CisKKyAgdm9pZCBzZXRTdWNjZXNzb3IodW5zaWduZWQgaWR4LCBCYXNpY0Jsb2NrICpOZXdTdWNjKSB7CisgICAgYXNzZXJ0KGlkeCA8IGdldE51bVN1Y2Nlc3NvcnMoKSAmJiAiU3VjY2Vzc29yICMgb3V0IG9mIHJhbmdlIGZvciBCcmFuY2ghIik7CisgICAgKigmT3A8LTE+KCkgLSBpZHgpID0gTmV3U3VjYzsKKyAgfQorCisgIC8vLyBTd2FwIHRoZSBzdWNjZXNzb3JzIG9mIHRoaXMgYnJhbmNoIGluc3RydWN0aW9uLgorICAvLy8KKyAgLy8vIFN3YXBzIHRoZSBzdWNjZXNzb3JzIG9mIHRoZSBicmFuY2ggaW5zdHJ1Y3Rpb24uIFRoaXMgYWxzbyBzd2FwcyBhbnkKKyAgLy8vIGJyYW5jaCB3ZWlnaHQgbWV0YWRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnN0cnVjdGlvbiBzbyB0aGF0IGl0CisgIC8vLyBjb250aW51ZXMgdG8gbWFwIGNvcnJlY3RseSB0byBlYWNoIG9wZXJhbmQuCisgIHZvaWQgc3dhcFN1Y2Nlc3NvcnMoKTsKKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIChJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6QnIpOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPEJyYW5jaEluc3Q+IDogcHVibGljIFZhcmlhZGljT3BlcmFuZFRyYWl0czxCcmFuY2hJbnN0LCAxPiB7Cit9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoQnJhbmNoSW5zdCwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTd2l0Y2hJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vIE11bHRpd2F5IHN3aXRjaAorLy8vCitjbGFzcyBTd2l0Y2hJbnN0IDogcHVibGljIFRlcm1pbmF0b3JJbnN0IHsKKyAgdW5zaWduZWQgUmVzZXJ2ZWRTcGFjZTsKKworICAvLyBPcGVyYW5kWzBdICAgID0gVmFsdWUgdG8gc3dpdGNoIG9uCisgIC8vIE9wZXJhbmRbMV0gICAgPSBEZWZhdWx0IGJhc2ljIGJsb2NrIGRlc3RpbmF0aW9uCisgIC8vIE9wZXJhbmRbMm4gIF0gPSBWYWx1ZSB0byBtYXRjaAorICAvLyBPcGVyYW5kWzJuKzFdID0gQmFzaWNCbG9jayB0byBnbyB0byBvbiBtYXRjaAorICBTd2l0Y2hJbnN0KGNvbnN0IFN3aXRjaEluc3QgJlNJKTsKKworICAvLy8gQ3JlYXRlIGEgbmV3IHN3aXRjaCBpbnN0cnVjdGlvbiwgc3BlY2lmeWluZyBhIHZhbHVlIHRvIHN3aXRjaCBvbiBhbmQgYQorICAvLy8gZGVmYXVsdCBkZXN0aW5hdGlvbi4gVGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGNhc2VzIGNhbiBiZSBzcGVjaWZpZWQgaGVyZQorICAvLy8gdG8gbWFrZSBtZW1vcnkgYWxsb2NhdGlvbiBtb3JlIGVmZmljaWVudC4gVGhpcyBjb25zdHJ1Y3RvciBjYW4gYWxzbworICAvLy8gYXV0by1pbnNlcnQgYmVmb3JlIGFub3RoZXIgaW5zdHJ1Y3Rpb24uCisgIFN3aXRjaEluc3QoVmFsdWUgKlZhbHVlLCBCYXNpY0Jsb2NrICpEZWZhdWx0LCB1bnNpZ25lZCBOdW1DYXNlcywKKyAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKworICAvLy8gQ3JlYXRlIGEgbmV3IHN3aXRjaCBpbnN0cnVjdGlvbiwgc3BlY2lmeWluZyBhIHZhbHVlIHRvIHN3aXRjaCBvbiBhbmQgYQorICAvLy8gZGVmYXVsdCBkZXN0aW5hdGlvbi4gVGhlIG51bWJlciBvZiBhZGRpdGlvbmFsIGNhc2VzIGNhbiBiZSBzcGVjaWZpZWQgaGVyZQorICAvLy8gdG8gbWFrZSBtZW1vcnkgYWxsb2NhdGlvbiBtb3JlIGVmZmljaWVudC4gVGhpcyBjb25zdHJ1Y3RvciBhbHNvCisgIC8vLyBhdXRvLWluc2VydHMgYXQgdGhlIGVuZCBvZiB0aGUgc3BlY2lmaWVkIEJhc2ljQmxvY2suCisgIFN3aXRjaEluc3QoVmFsdWUgKlZhbHVlLCBCYXNpY0Jsb2NrICpEZWZhdWx0LCB1bnNpZ25lZCBOdW1DYXNlcywKKyAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgemVybyBvcGVyYW5kcworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMpOworICB9CisKKyAgdm9pZCBpbml0KFZhbHVlICpWYWx1ZSwgQmFzaWNCbG9jayAqRGVmYXVsdCwgdW5zaWduZWQgTnVtUmVzZXJ2ZWQpOworICB2b2lkIGdyb3dPcGVyYW5kcygpOworCitwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICBTd2l0Y2hJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLyAtMgorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgRGVmYXVsdFBzZXVkb0luZGV4ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KH4wTC0xKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FzZUhhbmRsZVQ+IGNsYXNzIENhc2VJdGVyYXRvckltcGw7CisKKyAgLy8vIEEgaGFuZGxlIHRvIGEgcGFydGljdWxhciBzd2l0Y2ggY2FzZS4gSXQgZXhwb3NlcyBhIGNvbnZlbmllbnQgaW50ZXJmYWNlCisgIC8vLyB0byBib3RoIHRoZSBjYXNlIHZhbHVlIGFuZCB0aGUgc3VjY2Vzc29yIGJsb2NrLgorICAvLy8KKyAgLy8vIFdlIGRlZmluZSB0aGlzIGFzIGEgdGVtcGxhdGUgYW5kIGluc3RhbnRpYXRlIGl0IHRvIGZvcm0gYm90aCBhIGNvbnN0IGFuZAorICAvLy8gbm9uLWNvbnN0IGhhbmRsZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFN3aXRjaEluc3RULCB0eXBlbmFtZSBDb25zdGFudEludFQsIHR5cGVuYW1lIEJhc2ljQmxvY2tUPgorICBjbGFzcyBDYXNlSGFuZGxlSW1wbCB7CisgICAgLy8gRGlyZWN0bHkgYmVmcmllbmQgYm90aCBjb25zdCBhbmQgbm9uLWNvbnN0IGl0ZXJhdG9ycy4KKyAgICBmcmllbmQgY2xhc3MgU3dpdGNoSW5zdDo6Q2FzZUl0ZXJhdG9ySW1wbDwKKyAgICAgICAgQ2FzZUhhbmRsZUltcGw8U3dpdGNoSW5zdFQsIENvbnN0YW50SW50VCwgQmFzaWNCbG9ja1Q+PjsKKworICBwcm90ZWN0ZWQ6CisgICAgLy8gRXhwb3NlIHRoZSBzd2l0Y2ggdHlwZSB3ZSdyZSBwYXJhbWV0ZXJpemVkIHdpdGggdG8gdGhlIGl0ZXJhdG9yLgorICAgIHVzaW5nIFN3aXRjaEluc3RUeXBlID0gU3dpdGNoSW5zdFQ7CisKKyAgICBTd2l0Y2hJbnN0VCAqU0k7CisgICAgcHRyZGlmZl90IEluZGV4OworCisgICAgQ2FzZUhhbmRsZUltcGwoKSA9IGRlZmF1bHQ7CisgICAgQ2FzZUhhbmRsZUltcGwoU3dpdGNoSW5zdFQgKlNJLCBwdHJkaWZmX3QgSW5kZXgpIDogU0koU0kpLCBJbmRleChJbmRleCkge30KKworICBwdWJsaWM6CisgICAgLy8vIFJlc29sdmVzIGNhc2UgdmFsdWUgZm9yIGN1cnJlbnQgY2FzZS4KKyAgICBDb25zdGFudEludFQgKmdldENhc2VWYWx1ZSgpIGNvbnN0IHsKKyAgICAgIGFzc2VydCgodW5zaWduZWQpSW5kZXggPCBTSS0+Z2V0TnVtQ2FzZXMoKSAmJgorICAgICAgICAgICAgICJJbmRleCBvdXQgdGhlIG51bWJlciBvZiBjYXNlcy4iKTsKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PENvbnN0YW50SW50VCAqPihTSS0+Z2V0T3BlcmFuZCgyICsgSW5kZXggKiAyKSk7CisgICAgfQorCisgICAgLy8vIFJlc29sdmVzIHN1Y2Nlc3NvciBmb3IgY3VycmVudCBjYXNlLgorICAgIEJhc2ljQmxvY2tUICpnZXRDYXNlU3VjY2Vzc29yKCkgY29uc3QgeworICAgICAgYXNzZXJ0KCgodW5zaWduZWQpSW5kZXggPCBTSS0+Z2V0TnVtQ2FzZXMoKSB8fAorICAgICAgICAgICAgICAodW5zaWduZWQpSW5kZXggPT0gRGVmYXVsdFBzZXVkb0luZGV4KSAmJgorICAgICAgICAgICAgICJJbmRleCBvdXQgdGhlIG51bWJlciBvZiBjYXNlcy4iKTsKKyAgICAgIHJldHVybiBTSS0+Z2V0U3VjY2Vzc29yKGdldFN1Y2Nlc3NvckluZGV4KCkpOworICAgIH0KKworICAgIC8vLyBSZXR1cm5zIG51bWJlciBvZiBjdXJyZW50IGNhc2UuCisgICAgdW5zaWduZWQgZ2V0Q2FzZUluZGV4KCkgY29uc3QgeyByZXR1cm4gSW5kZXg7IH0KKworICAgIC8vLyBSZXR1cm5zIFRlcm1pbmF0b3JJbnN0J3Mgc3VjY2Vzc29yIGluZGV4IGZvciBjdXJyZW50IGNhc2Ugc3VjY2Vzc29yLgorICAgIHVuc2lnbmVkIGdldFN1Y2Nlc3NvckluZGV4KCkgY29uc3QgeworICAgICAgYXNzZXJ0KCgodW5zaWduZWQpSW5kZXggPT0gRGVmYXVsdFBzZXVkb0luZGV4IHx8CisgICAgICAgICAgICAgICh1bnNpZ25lZClJbmRleCA8IFNJLT5nZXROdW1DYXNlcygpKSAmJgorICAgICAgICAgICAgICJJbmRleCBvdXQgdGhlIG51bWJlciBvZiBjYXNlcy4iKTsKKyAgICAgIHJldHVybiAodW5zaWduZWQpSW5kZXggIT0gRGVmYXVsdFBzZXVkb0luZGV4ID8gSW5kZXggKyAxIDogMDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ2FzZUhhbmRsZUltcGwgJlJIUykgY29uc3QgeworICAgICAgYXNzZXJ0KFNJID09IFJIUy5TSSAmJiAiSW5jb21wYXRpYmxlIG9wZXJhdG9ycy4iKTsKKyAgICAgIHJldHVybiBJbmRleCA9PSBSSFMuSW5kZXg7CisgICAgfQorICB9OworCisgIHVzaW5nIENvbnN0Q2FzZUhhbmRsZSA9CisgICAgICBDYXNlSGFuZGxlSW1wbDxjb25zdCBTd2l0Y2hJbnN0LCBjb25zdCBDb25zdGFudEludCwgY29uc3QgQmFzaWNCbG9jaz47CisKKyAgY2xhc3MgQ2FzZUhhbmRsZQorICAgICAgOiBwdWJsaWMgQ2FzZUhhbmRsZUltcGw8U3dpdGNoSW5zdCwgQ29uc3RhbnRJbnQsIEJhc2ljQmxvY2s+IHsKKyAgICBmcmllbmQgY2xhc3MgU3dpdGNoSW5zdDo6Q2FzZUl0ZXJhdG9ySW1wbDxDYXNlSGFuZGxlPjsKKworICBwdWJsaWM6CisgICAgQ2FzZUhhbmRsZShTd2l0Y2hJbnN0ICpTSSwgcHRyZGlmZl90IEluZGV4KSA6IENhc2VIYW5kbGVJbXBsKFNJLCBJbmRleCkge30KKworICAgIC8vLyBTZXRzIHRoZSBuZXcgdmFsdWUgZm9yIGN1cnJlbnQgY2FzZS4KKyAgICB2b2lkIHNldFZhbHVlKENvbnN0YW50SW50ICpWKSB7CisgICAgICBhc3NlcnQoKHVuc2lnbmVkKUluZGV4IDwgU0ktPmdldE51bUNhc2VzKCkgJiYKKyAgICAgICAgICAgICAiSW5kZXggb3V0IHRoZSBudW1iZXIgb2YgY2FzZXMuIik7CisgICAgICBTSS0+c2V0T3BlcmFuZCgyICsgSW5kZXgqMiwgcmVpbnRlcnByZXRfY2FzdDxWYWx1ZSo+KFYpKTsKKyAgICB9CisKKyAgICAvLy8gU2V0cyB0aGUgbmV3IHN1Y2Nlc3NvciBmb3IgY3VycmVudCBjYXNlLgorICAgIHZvaWQgc2V0U3VjY2Vzc29yKEJhc2ljQmxvY2sgKlMpIHsKKyAgICAgIFNJLT5zZXRTdWNjZXNzb3IoZ2V0U3VjY2Vzc29ySW5kZXgoKSwgUyk7CisgICAgfQorICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDYXNlSGFuZGxlVD4KKyAgY2xhc3MgQ2FzZUl0ZXJhdG9ySW1wbAorICAgICAgOiBwdWJsaWMgaXRlcmF0b3JfZmFjYWRlX2Jhc2U8Q2FzZUl0ZXJhdG9ySW1wbDxDYXNlSGFuZGxlVD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzZUhhbmRsZVQ+IHsKKyAgICB1c2luZyBTd2l0Y2hJbnN0VCA9IHR5cGVuYW1lIENhc2VIYW5kbGVUOjpTd2l0Y2hJbnN0VHlwZTsKKworICAgIENhc2VIYW5kbGVUIENhc2U7CisKKyAgcHVibGljOgorICAgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdGVkIGl0ZXJhdG9yIGlzIGluIGFuIGludmFsaWQgc3RhdGUgdW50aWwgYXNzaWduZWQgdG8KKyAgICAvLy8gYSBjYXNlIGZvciBhIHBhcnRpY3VsYXIgc3dpdGNoLgorICAgIENhc2VJdGVyYXRvckltcGwoKSA9IGRlZmF1bHQ7CisKKyAgICAvLy8gSW5pdGlhbGl6ZXMgY2FzZSBpdGVyYXRvciBmb3IgZ2l2ZW4gU3dpdGNoSW5zdCBhbmQgZm9yIGdpdmVuCisgICAgLy8vIGNhc2UgbnVtYmVyLgorICAgIENhc2VJdGVyYXRvckltcGwoU3dpdGNoSW5zdFQgKlNJLCB1bnNpZ25lZCBDYXNlTnVtKSA6IENhc2UoU0ksIENhc2VOdW0pIHt9CisKKyAgICAvLy8gSW5pdGlhbGl6ZXMgY2FzZSBpdGVyYXRvciBmb3IgZ2l2ZW4gU3dpdGNoSW5zdCBhbmQgZm9yIGdpdmVuCisgICAgLy8vIFRlcm1pbmF0b3JJbnN0J3Mgc3VjY2Vzc29yIGluZGV4LgorICAgIHN0YXRpYyBDYXNlSXRlcmF0b3JJbXBsIGZyb21TdWNjZXNzb3JJbmRleChTd2l0Y2hJbnN0VCAqU0ksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFN1Y2Nlc3NvckluZGV4KSB7CisgICAgICBhc3NlcnQoU3VjY2Vzc29ySW5kZXggPCBTSS0+Z2V0TnVtU3VjY2Vzc29ycygpICYmCisgICAgICAgICAgICAgIlN1Y2Nlc3NvciBpbmRleCAjIG91dCBvZiByYW5nZSEiKTsKKyAgICAgIHJldHVybiBTdWNjZXNzb3JJbmRleCAhPSAwID8gQ2FzZUl0ZXJhdG9ySW1wbChTSSwgU3VjY2Vzc29ySW5kZXggLSAxKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDYXNlSXRlcmF0b3JJbXBsKFNJLCBEZWZhdWx0UHNldWRvSW5kZXgpOworICAgIH0KKworICAgIC8vLyBTdXBwb3J0IGNvbnZlcnRpbmcgdG8gdGhlIGNvbnN0IHZhcmlhbnQuIFRoaXMgd2lsbCBiZSBhIG5vLW9wIGZvciBjb25zdAorICAgIC8vLyB2YXJpYW50LgorICAgIG9wZXJhdG9yIENhc2VJdGVyYXRvckltcGw8Q29uc3RDYXNlSGFuZGxlPigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBDYXNlSXRlcmF0b3JJbXBsPENvbnN0Q2FzZUhhbmRsZT4oQ2FzZS5TSSwgQ2FzZS5JbmRleCk7CisgICAgfQorCisgICAgQ2FzZUl0ZXJhdG9ySW1wbCAmb3BlcmF0b3IrPShwdHJkaWZmX3QgTikgeworICAgICAgLy8gQ2hlY2sgaW5kZXggY29ycmVjdG5lc3MgYWZ0ZXIgYWRkaXRpb24uCisgICAgICAvLyBOb3RlOiBJbmRleCA9PSBnZXROdW1DYXNlcygpIG1lYW5zIGVuZCgpLgorICAgICAgYXNzZXJ0KENhc2UuSW5kZXggKyBOID49IDAgJiYKKyAgICAgICAgICAgICAodW5zaWduZWQpKENhc2UuSW5kZXggKyBOKSA8PSBDYXNlLlNJLT5nZXROdW1DYXNlcygpICYmCisgICAgICAgICAgICAgIkNhc2UuSW5kZXggb3V0IHRoZSBudW1iZXIgb2YgY2FzZXMuIik7CisgICAgICBDYXNlLkluZGV4ICs9IE47CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIENhc2VJdGVyYXRvckltcGwgJm9wZXJhdG9yLT0ocHRyZGlmZl90IE4pIHsKKyAgICAgIC8vIENoZWNrIGluZGV4IGNvcnJlY3RuZXNzIGFmdGVyIHN1YnRyYWN0aW9uLgorICAgICAgLy8gTm90ZTogQ2FzZS5JbmRleCA9PSBnZXROdW1DYXNlcygpIG1lYW5zIGVuZCgpLgorICAgICAgYXNzZXJ0KENhc2UuSW5kZXggLSBOID49IDAgJiYKKyAgICAgICAgICAgICAodW5zaWduZWQpKENhc2UuSW5kZXggLSBOKSA8PSBDYXNlLlNJLT5nZXROdW1DYXNlcygpICYmCisgICAgICAgICAgICAgIkNhc2UuSW5kZXggb3V0IHRoZSBudW1iZXIgb2YgY2FzZXMuIik7CisgICAgICBDYXNlLkluZGV4IC09IE47CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIHB0cmRpZmZfdCBvcGVyYXRvci0oY29uc3QgQ2FzZUl0ZXJhdG9ySW1wbCAmUkhTKSBjb25zdCB7CisgICAgICBhc3NlcnQoQ2FzZS5TSSA9PSBSSFMuQ2FzZS5TSSAmJiAiSW5jb21wYXRpYmxlIG9wZXJhdG9ycy4iKTsKKyAgICAgIHJldHVybiBDYXNlLkluZGV4IC0gUkhTLkNhc2UuSW5kZXg7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDYXNlSXRlcmF0b3JJbXBsICZSSFMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBDYXNlID09IFJIUy5DYXNlOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBDYXNlSXRlcmF0b3JJbXBsICZSSFMpIGNvbnN0IHsKKyAgICAgIGFzc2VydChDYXNlLlNJID09IFJIUy5DYXNlLlNJICYmICJJbmNvbXBhdGlibGUgb3BlcmF0b3JzLiIpOworICAgICAgcmV0dXJuIENhc2UuSW5kZXggPCBSSFMuQ2FzZS5JbmRleDsKKyAgICB9CisgICAgQ2FzZUhhbmRsZVQgJm9wZXJhdG9yKigpIHsgcmV0dXJuIENhc2U7IH0KKyAgICBjb25zdCBDYXNlSGFuZGxlVCAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gQ2FzZTsgfQorICB9OworCisgIHVzaW5nIENhc2VJdCA9IENhc2VJdGVyYXRvckltcGw8Q2FzZUhhbmRsZT47CisgIHVzaW5nIENvbnN0Q2FzZUl0ID0gQ2FzZUl0ZXJhdG9ySW1wbDxDb25zdENhc2VIYW5kbGU+OworCisgIHN0YXRpYyBTd2l0Y2hJbnN0ICpDcmVhdGUoVmFsdWUgKlZhbHVlLCBCYXNpY0Jsb2NrICpEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNhc2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIG5ldyBTd2l0Y2hJbnN0KFZhbHVlLCBEZWZhdWx0LCBOdW1DYXNlcywgSW5zZXJ0QmVmb3JlKTsKKyAgfQorCisgIHN0YXRpYyBTd2l0Y2hJbnN0ICpDcmVhdGUoVmFsdWUgKlZhbHVlLCBCYXNpY0Jsb2NrICpEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUNhc2VzLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICAgIHJldHVybiBuZXcgU3dpdGNoSW5zdChWYWx1ZSwgRGVmYXVsdCwgTnVtQ2FzZXMsIEluc2VydEF0RW5kKTsKKyAgfQorCisgIC8vLyBQcm92aWRlIGZhc3Qgb3BlcmFuZCBhY2Nlc3NvcnMKKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgLy8gQWNjZXNzb3IgTWV0aG9kcyBmb3IgU3dpdGNoIHN0bXQKKyAgVmFsdWUgKmdldENvbmRpdGlvbigpIGNvbnN0IHsgcmV0dXJuIGdldE9wZXJhbmQoMCk7IH0KKyAgdm9pZCBzZXRDb25kaXRpb24oVmFsdWUgKlYpIHsgc2V0T3BlcmFuZCgwLCBWKTsgfQorCisgIEJhc2ljQmxvY2sgKmdldERlZmF1bHREZXN0KCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PEJhc2ljQmxvY2s+KGdldE9wZXJhbmQoMSkpOworICB9CisKKyAgdm9pZCBzZXREZWZhdWx0RGVzdChCYXNpY0Jsb2NrICpEZWZhdWx0Q2FzZSkgeworICAgIHNldE9wZXJhbmQoMSwgcmVpbnRlcnByZXRfY2FzdDxWYWx1ZSo+KERlZmF1bHRDYXNlKSk7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgJ2Nhc2VzJyBpbiB0aGlzIHN3aXRjaCBpbnN0cnVjdGlvbiwgZXhjbHVkaW5nIHRoZQorICAvLy8gZGVmYXVsdCBjYXNlLgorICB1bnNpZ25lZCBnZXROdW1DYXNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKS8yIC0gMTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGEgcmVhZC93cml0ZSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QgY2FzZSBpbiB0aGUKKyAgLy8vIFN3aXRjaEluc3QuCisgIENhc2VJdCBjYXNlX2JlZ2luKCkgeworICAgIHJldHVybiBDYXNlSXQodGhpcywgMCk7CisgIH0KKworICAvLy8gUmV0dXJucyBhIHJlYWQtb25seSBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZmlyc3QgY2FzZSBpbiB0aGUKKyAgLy8vIFN3aXRjaEluc3QuCisgIENvbnN0Q2FzZUl0IGNhc2VfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0Q2FzZUl0KHRoaXMsIDApOworICB9CisKKyAgLy8vIFJldHVybnMgYSByZWFkL3dyaXRlIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIG9uZSBwYXN0IHRoZSBsYXN0IGluIHRoZQorICAvLy8gU3dpdGNoSW5zdC4KKyAgQ2FzZUl0IGNhc2VfZW5kKCkgeworICAgIHJldHVybiBDYXNlSXQodGhpcywgZ2V0TnVtQ2FzZXMoKSk7CisgIH0KKworICAvLy8gUmV0dXJucyBhIHJlYWQtb25seSBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdCBpbiB0aGUKKyAgLy8vIFN3aXRjaEluc3QuCisgIENvbnN0Q2FzZUl0IGNhc2VfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBDb25zdENhc2VJdCh0aGlzLCBnZXROdW1DYXNlcygpKTsKKyAgfQorCisgIC8vLyBJdGVyYXRpb24gYWRhcHRlciBmb3IgcmFuZ2UtZm9yIGxvb3BzLgorICBpdGVyYXRvcl9yYW5nZTxDYXNlSXQ+IGNhc2VzKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGNhc2VfYmVnaW4oKSwgY2FzZV9lbmQoKSk7CisgIH0KKworICAvLy8gQ29uc3RhbnQgaXRlcmF0aW9uIGFkYXB0ZXIgZm9yIHJhbmdlLWZvciBsb29wcy4KKyAgaXRlcmF0b3JfcmFuZ2U8Q29uc3RDYXNlSXQ+IGNhc2VzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGNhc2VfYmVnaW4oKSwgY2FzZV9lbmQoKSk7CisgIH0KKworICAvLy8gUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IHBvaW50cyB0byB0aGUgZGVmYXVsdCBjYXNlLgorICAvLy8gTm90ZTogdGhpcyBpdGVyYXRvciBhbGxvd3MgdG8gcmVzb2x2ZSBzdWNjZXNzb3Igb25seS4gQXR0ZW1wdAorICAvLy8gdG8gcmVzb2x2ZSBjYXNlIHZhbHVlIGNhdXNlcyBhbiBhc3NlcnRpb24uCisgIC8vLyBBbHNvIG5vdGUsIHRoYXQgaW5jcmVtZW50IGFuZCBkZWNyZW1lbnQgYWxzbyBjYXVzZXMgYW4gYXNzZXJ0aW9uIGFuZAorICAvLy8gbWFrZXMgaXRlcmF0b3IgaW52YWxpZC4KKyAgQ2FzZUl0IGNhc2VfZGVmYXVsdCgpIHsKKyAgICByZXR1cm4gQ2FzZUl0KHRoaXMsIERlZmF1bHRQc2V1ZG9JbmRleCk7CisgIH0KKyAgQ29uc3RDYXNlSXQgY2FzZV9kZWZhdWx0KCkgY29uc3QgeworICAgIHJldHVybiBDb25zdENhc2VJdCh0aGlzLCBEZWZhdWx0UHNldWRvSW5kZXgpOworICB9CisKKyAgLy8vIFNlYXJjaCBhbGwgb2YgdGhlIGNhc2UgdmFsdWVzIGZvciB0aGUgc3BlY2lmaWVkIGNvbnN0YW50LiBJZiBpdCBpcworICAvLy8gZXhwbGljaXRseSBoYW5kbGVkLCByZXR1cm4gdGhlIGNhc2UgaXRlcmF0b3Igb2YgaXQsIG90aGVyd2lzZSByZXR1cm4KKyAgLy8vIGRlZmF1bHQgY2FzZSBpdGVyYXRvciB0byBpbmRpY2F0ZSB0aGF0IGl0IGlzIGhhbmRsZWQgYnkgdGhlIGRlZmF1bHQKKyAgLy8vIGhhbmRsZXIuCisgIENhc2VJdCBmaW5kQ2FzZVZhbHVlKGNvbnN0IENvbnN0YW50SW50ICpDKSB7CisgICAgQ2FzZUl0IEkgPSBsbHZtOjpmaW5kX2lmKAorICAgICAgICBjYXNlcygpLCBbQ10oQ2FzZUhhbmRsZSAmQ2FzZSkgeyByZXR1cm4gQ2FzZS5nZXRDYXNlVmFsdWUoKSA9PSBDOyB9KTsKKyAgICBpZiAoSSAhPSBjYXNlX2VuZCgpKQorICAgICAgcmV0dXJuIEk7CisKKyAgICByZXR1cm4gY2FzZV9kZWZhdWx0KCk7CisgIH0KKyAgQ29uc3RDYXNlSXQgZmluZENhc2VWYWx1ZShjb25zdCBDb25zdGFudEludCAqQykgY29uc3QgeworICAgIENvbnN0Q2FzZUl0IEkgPSBsbHZtOjpmaW5kX2lmKGNhc2VzKCksIFtDXShDb25zdENhc2VIYW5kbGUgJkNhc2UpIHsKKyAgICAgIHJldHVybiBDYXNlLmdldENhc2VWYWx1ZSgpID09IEM7CisgICAgfSk7CisgICAgaWYgKEkgIT0gY2FzZV9lbmQoKSkKKyAgICAgIHJldHVybiBJOworCisgICAgcmV0dXJuIGNhc2VfZGVmYXVsdCgpOworICB9CisKKyAgLy8vIEZpbmRzIHRoZSB1bmlxdWUgY2FzZSB2YWx1ZSBmb3IgYSBnaXZlbiBzdWNjZXNzb3IuIFJldHVybnMgbnVsbCBpZiB0aGUKKyAgLy8vIHN1Y2Nlc3NvciBpcyBub3QgZm91bmQsIG5vdCB1bmlxdWUsIG9yIGlzIHRoZSBkZWZhdWx0IGNhc2UuCisgIENvbnN0YW50SW50ICpmaW5kQ2FzZURlc3QoQmFzaWNCbG9jayAqQkIpIHsKKyAgICBpZiAoQkIgPT0gZ2V0RGVmYXVsdERlc3QoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworCisgICAgQ29uc3RhbnRJbnQgKkNJID0gbnVsbHB0cjsKKyAgICBmb3IgKGF1dG8gQ2FzZSA6IGNhc2VzKCkpIHsKKyAgICAgIGlmIChDYXNlLmdldENhc2VTdWNjZXNzb3IoKSAhPSBCQikKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGlmIChDSSkKKyAgICAgICAgcmV0dXJuIG51bGxwdHI7IC8vIE11bHRpcGxlIGNhc2VzIGxlYWQgdG8gQkIuCisKKyAgICAgIENJID0gQ2FzZS5nZXRDYXNlVmFsdWUoKTsKKyAgICB9CisKKyAgICByZXR1cm4gQ0k7CisgIH0KKworICAvLy8gQWRkIGFuIGVudHJ5IHRvIHRoZSBzd2l0Y2ggaW5zdHJ1Y3Rpb24uCisgIC8vLyBOb3RlOgorICAvLy8gVGhpcyBhY3Rpb24gaW52YWxpZGF0ZXMgY2FzZV9lbmQoKS4gT2xkIGNhc2VfZW5kKCkgaXRlcmF0b3Igd2lsbAorICAvLy8gcG9pbnQgdG8gdGhlIGFkZGVkIGNhc2UuCisgIHZvaWQgYWRkQ2FzZShDb25zdGFudEludCAqT25WYWwsIEJhc2ljQmxvY2sgKkRlc3QpOworCisgIC8vLyBUaGlzIG1ldGhvZCByZW1vdmVzIHRoZSBzcGVjaWZpZWQgY2FzZSBhbmQgaXRzIHN1Y2Nlc3NvciBmcm9tIHRoZSBzd2l0Y2gKKyAgLy8vIGluc3RydWN0aW9uLiBOb3RlIHRoYXQgdGhpcyBvcGVyYXRpb24gbWF5IHJlb3JkZXIgdGhlIHJlbWFpbmluZyBjYXNlcyBhdAorICAvLy8gaW5kZXggaWR4IGFuZCBhYm92ZS4KKyAgLy8vIE5vdGU6CisgIC8vLyBUaGlzIGFjdGlvbiBpbnZhbGlkYXRlcyBpdGVyYXRvcnMgZm9yIGFsbCBjYXNlcyBmb2xsb3dpbmcgdGhlIG9uZSByZW1vdmVkLAorICAvLy8gaW5jbHVkaW5nIHRoZSBjYXNlX2VuZCgpIGl0ZXJhdG9yLiBJdCByZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciB0aGUgbmV4dAorICAvLy8gY2FzZS4KKyAgQ2FzZUl0IHJlbW92ZUNhc2UoQ2FzZUl0IEkpOworCisgIHVuc2lnbmVkIGdldE51bVN1Y2Nlc3NvcnMoKSBjb25zdCB7IHJldHVybiBnZXROdW1PcGVyYW5kcygpLzI7IH0KKyAgQmFzaWNCbG9jayAqZ2V0U3VjY2Vzc29yKHVuc2lnbmVkIGlkeCkgY29uc3QgeworICAgIGFzc2VydChpZHggPCBnZXROdW1TdWNjZXNzb3JzKCkgJiYiU3VjY2Vzc29yIGlkeCBvdXQgb2YgcmFuZ2UgZm9yIHN3aXRjaCEiKTsKKyAgICByZXR1cm4gY2FzdDxCYXNpY0Jsb2NrPihnZXRPcGVyYW5kKGlkeCoyKzEpKTsKKyAgfQorICB2b2lkIHNldFN1Y2Nlc3Nvcih1bnNpZ25lZCBpZHgsIEJhc2ljQmxvY2sgKk5ld1N1Y2MpIHsKKyAgICBhc3NlcnQoaWR4IDwgZ2V0TnVtU3VjY2Vzc29ycygpICYmICJTdWNjZXNzb3IgIyBvdXQgb2YgcmFuZ2UgZm9yIHN3aXRjaCEiKTsKKyAgICBzZXRPcGVyYW5kKGlkeCAqIDIgKyAxLCBOZXdTdWNjKTsKKyAgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlN3aXRjaDsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxTd2l0Y2hJbnN0PiA6IHB1YmxpYyBIdW5nb2ZmT3BlcmFuZFRyYWl0czwyPiB7Cit9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoU3dpdGNoSW5zdCwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5kaXJlY3RCckluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8gSW5kaXJlY3QgQnJhbmNoIEluc3RydWN0aW9uLgorLy8vCitjbGFzcyBJbmRpcmVjdEJySW5zdCA6IHB1YmxpYyBUZXJtaW5hdG9ySW5zdCB7CisgIHVuc2lnbmVkIFJlc2VydmVkU3BhY2U7CisKKyAgLy8gT3BlcmFuZFswXSAgID0gQWRkcmVzcyB0byBqdW1wIHRvCisgIC8vIE9wZXJhbmRbbisxXSA9IG4tdGggZGVzdGluYXRpb24KKyAgSW5kaXJlY3RCckluc3QoY29uc3QgSW5kaXJlY3RCckluc3QgJklCSSk7CisKKyAgLy8vIENyZWF0ZSBhIG5ldyBpbmRpcmVjdGJyIGluc3RydWN0aW9uLCBzcGVjaWZ5aW5nIGFuCisgIC8vLyBBZGRyZXNzIHRvIGp1bXAgdG8uICBUaGUgbnVtYmVyIG9mIGV4cGVjdGVkIGRlc3RpbmF0aW9ucyBjYW4gYmUgc3BlY2lmaWVkCisgIC8vLyBoZXJlIHRvIG1ha2UgbWVtb3J5IGFsbG9jYXRpb24gbW9yZSBlZmZpY2llbnQuICBUaGlzIGNvbnN0cnVjdG9yIGNhbiBhbHNvCisgIC8vLyBhdXRvaW5zZXJ0IGJlZm9yZSBhbm90aGVyIGluc3RydWN0aW9uLgorICBJbmRpcmVjdEJySW5zdChWYWx1ZSAqQWRkcmVzcywgdW5zaWduZWQgTnVtRGVzdHMsIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpOworCisgIC8vLyBDcmVhdGUgYSBuZXcgaW5kaXJlY3RiciBpbnN0cnVjdGlvbiwgc3BlY2lmeWluZyBhbgorICAvLy8gQWRkcmVzcyB0byBqdW1wIHRvLiAgVGhlIG51bWJlciBvZiBleHBlY3RlZCBkZXN0aW5hdGlvbnMgY2FuIGJlIHNwZWNpZmllZAorICAvLy8gaGVyZSB0byBtYWtlIG1lbW9yeSBhbGxvY2F0aW9uIG1vcmUgZWZmaWNpZW50LiAgVGhpcyBjb25zdHJ1Y3RvciBhbHNvCisgIC8vLyBhdXRvaW5zZXJ0cyBhdCB0aGUgZW5kIG9mIHRoZSBzcGVjaWZpZWQgQmFzaWNCbG9jay4KKyAgSW5kaXJlY3RCckluc3QoVmFsdWUgKkFkZHJlc3MsIHVuc2lnbmVkIE51bURlc3RzLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGV4YWN0bHkgemVybyBvcGVyYW5kcworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpIHsKKyAgICByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMpOworICB9CisKKyAgdm9pZCBpbml0KFZhbHVlICpBZGRyZXNzLCB1bnNpZ25lZCBOdW1EZXN0cyk7CisgIHZvaWQgZ3Jvd09wZXJhbmRzKCk7CisKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIEluZGlyZWN0QnJJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICBzdGF0aWMgSW5kaXJlY3RCckluc3QgKkNyZWF0ZShWYWx1ZSAqQWRkcmVzcywgdW5zaWduZWQgTnVtRGVzdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIG5ldyBJbmRpcmVjdEJySW5zdChBZGRyZXNzLCBOdW1EZXN0cywgSW5zZXJ0QmVmb3JlKTsKKyAgfQorCisgIHN0YXRpYyBJbmRpcmVjdEJySW5zdCAqQ3JlYXRlKFZhbHVlICpBZGRyZXNzLCB1bnNpZ25lZCBOdW1EZXN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICByZXR1cm4gbmV3IEluZGlyZWN0QnJJbnN0KEFkZHJlc3MsIE51bURlc3RzLCBJbnNlcnRBdEVuZCk7CisgIH0KKworICAvLy8gUHJvdmlkZSBmYXN0IG9wZXJhbmQgYWNjZXNzb3JzLgorICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICAvLyBBY2Nlc3NvciBNZXRob2RzIGZvciBJbmRpcmVjdEJySW5zdCBpbnN0cnVjdGlvbi4KKyAgVmFsdWUgKmdldEFkZHJlc3MoKSB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisgIGNvbnN0IFZhbHVlICpnZXRBZGRyZXNzKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorICB2b2lkIHNldEFkZHJlc3MoVmFsdWUgKlYpIHsgc2V0T3BlcmFuZCgwLCBWKTsgfQorCisgIC8vLyByZXR1cm4gdGhlIG51bWJlciBvZiBwb3NzaWJsZSBkZXN0aW5hdGlvbnMgaW4gdGhpcworICAvLy8gaW5kaXJlY3RiciBpbnN0cnVjdGlvbi4KKyAgdW5zaWduZWQgZ2V0TnVtRGVzdGluYXRpb25zKCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKS0xOyB9CisKKyAgLy8vIFJldHVybiB0aGUgc3BlY2lmaWVkIGRlc3RpbmF0aW9uLgorICBCYXNpY0Jsb2NrICpnZXREZXN0aW5hdGlvbih1bnNpZ25lZCBpKSB7IHJldHVybiBnZXRTdWNjZXNzb3IoaSk7IH0KKyAgY29uc3QgQmFzaWNCbG9jayAqZ2V0RGVzdGluYXRpb24odW5zaWduZWQgaSkgY29uc3QgeyByZXR1cm4gZ2V0U3VjY2Vzc29yKGkpOyB9CisKKyAgLy8vIEFkZCBhIGRlc3RpbmF0aW9uLgorICAvLy8KKyAgdm9pZCBhZGREZXN0aW5hdGlvbihCYXNpY0Jsb2NrICpEZXN0KTsKKworICAvLy8gVGhpcyBtZXRob2QgcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIHN1Y2Nlc3NvciBmcm9tIHRoZQorICAvLy8gaW5kaXJlY3RiciBpbnN0cnVjdGlvbi4KKyAgdm9pZCByZW1vdmVEZXN0aW5hdGlvbih1bnNpZ25lZCBpKTsKKworICB1bnNpZ25lZCBnZXROdW1TdWNjZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKS0xOyB9CisgIEJhc2ljQmxvY2sgKmdldFN1Y2Nlc3Nvcih1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8QmFzaWNCbG9jaz4oZ2V0T3BlcmFuZChpKzEpKTsKKyAgfQorICB2b2lkIHNldFN1Y2Nlc3Nvcih1bnNpZ25lZCBpLCBCYXNpY0Jsb2NrICpOZXdTdWNjKSB7CisgICAgc2V0T3BlcmFuZChpICsgMSwgTmV3U3VjYyk7CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpJbmRpcmVjdEJyOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPEluZGlyZWN0QnJJbnN0PiA6IHB1YmxpYyBIdW5nb2ZmT3BlcmFuZFRyYWl0czwxPiB7Cit9OworCitERUZJTkVfVFJBTlNQQVJFTlRfT1BFUkFORF9BQ0NFU1NPUlMoSW5kaXJlY3RCckluc3QsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52b2tlSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEludm9rZSBpbnN0cnVjdGlvbi4gIFRoZSBTdWJjbGFzc0RhdGEgZmllbGQgaXMgdXNlZCB0byBob2xkIHRoZQorLy8vIGNhbGxpbmcgY29udmVudGlvbiBvZiB0aGUgY2FsbC4KKy8vLworY2xhc3MgSW52b2tlSW5zdCA6IHB1YmxpYyBDYWxsQmFzZTxJbnZva2VJbnN0PiB7CisgIGZyaWVuZCBjbGFzcyBPcGVyYW5kQnVuZGxlVXNlcjxJbnZva2VJbnN0LCBVc2VyOjpvcF9pdGVyYXRvcj47CisKKyAgSW52b2tlSW5zdChjb25zdCBJbnZva2VJbnN0ICZCSSk7CisKKyAgLy8vIENvbnN0cnVjdCBhbiBJbnZva2VJbnN0IGdpdmVuIGEgcmFuZ2Ugb2YgYXJndW1lbnRzLgorICAvLy8KKyAgLy8vIENvbnN0cnVjdCBhbiBJbnZva2VJbnN0IGZyb20gYSByYW5nZSBvZiBhcmd1bWVudHMKKyAgaW5saW5lIEludm9rZUluc3QoVmFsdWUgKkZ1bmMsIEJhc2ljQmxvY2sgKklmTm9ybWFsLCBCYXNpY0Jsb2NrICpJZkV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gQnVuZGxlcywKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmFsdWVzLCBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSkKKyAgICAgIDogSW52b2tlSW5zdChjYXN0PEZ1bmN0aW9uVHlwZT4oCisgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8UG9pbnRlclR5cGU+KEZ1bmMtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgIEZ1bmMsIElmTm9ybWFsLCBJZkV4Y2VwdGlvbiwgQXJncywgQnVuZGxlcywgVmFsdWVzLCBOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgIEluc2VydEJlZm9yZSkge30KKworICBpbmxpbmUgSW52b2tlSW5zdChGdW5jdGlvblR5cGUgKlR5LCBWYWx1ZSAqRnVuYywgQmFzaWNCbG9jayAqSWZOb3JtYWwsCisgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKklmRXhjZXB0aW9uLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBCdW5kbGVzLCB1bnNpZ25lZCBWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKTsKKyAgLy8vIENvbnN0cnVjdCBhbiBJbnZva2VJbnN0IGdpdmVuIGEgcmFuZ2Ugb2YgYXJndW1lbnRzLgorICAvLy8KKyAgLy8vIENvbnN0cnVjdCBhbiBJbnZva2VJbnN0IGZyb20gYSByYW5nZSBvZiBhcmd1bWVudHMKKyAgaW5saW5lIEludm9rZUluc3QoVmFsdWUgKkZ1bmMsIEJhc2ljQmxvY2sgKklmTm9ybWFsLCBCYXNpY0Jsb2NrICpJZkV4Y2VwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gQnVuZGxlcywKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmFsdWVzLCBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisKKyAgdm9pZCBpbml0KFZhbHVlICpGdW5jLCBCYXNpY0Jsb2NrICpJZk5vcm1hbCwgQmFzaWNCbG9jayAqSWZFeGNlcHRpb24sCisgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLCBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBCdW5kbGVzLAorICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIpIHsKKyAgICBpbml0KGNhc3Q8RnVuY3Rpb25UeXBlPigKKyAgICAgICAgICAgICBjYXN0PFBvaW50ZXJUeXBlPihGdW5jLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpKSwKKyAgICAgICAgIEZ1bmMsIElmTm9ybWFsLCBJZkV4Y2VwdGlvbiwgQXJncywgQnVuZGxlcywgTmFtZVN0cik7CisgIH0KKworICB2b2lkIGluaXQoRnVuY3Rpb25UeXBlICpGVHksIFZhbHVlICpGdW5jLCBCYXNpY0Jsb2NrICpJZk5vcm1hbCwKKyAgICAgICAgICAgIEJhc2ljQmxvY2sgKklmRXhjZXB0aW9uLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gQnVuZGxlcywgY29uc3QgVHdpbmUgJk5hbWVTdHIpOworCitwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICBJbnZva2VJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICBzdGF0aWMgY29uc3RleHByIGludCBBcmdPZmZzZXQgPSAzOworICBzdGF0aWMgSW52b2tlSW5zdCAqQ3JlYXRlKFZhbHVlICpGdW5jLCBCYXNpY0Jsb2NrICpJZk5vcm1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJZkV4Y2VwdGlvbiwgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIHJldHVybiBDcmVhdGUoY2FzdDxGdW5jdGlvblR5cGU+KAorICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8UG9pbnRlclR5cGU+KEZ1bmMtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpLAorICAgICAgICAgICAgICAgICAgRnVuYywgSWZOb3JtYWwsIElmRXhjZXB0aW9uLCBBcmdzLCBOb25lLCBOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgSW5zZXJ0QmVmb3JlKTsKKyAgfQorCisgIHN0YXRpYyBJbnZva2VJbnN0ICpDcmVhdGUoVmFsdWUgKkZ1bmMsIEJhc2ljQmxvY2sgKklmTm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKklmRXhjZXB0aW9uLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IEJ1bmRsZXMgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpIHsKKyAgICByZXR1cm4gQ3JlYXRlKGNhc3Q8RnVuY3Rpb25UeXBlPigKKyAgICAgICAgICAgICAgICAgICAgICBjYXN0PFBvaW50ZXJUeXBlPihGdW5jLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpKSwKKyAgICAgICAgICAgICAgICAgIEZ1bmMsIElmTm9ybWFsLCBJZkV4Y2VwdGlvbiwgQXJncywgQnVuZGxlcywgTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgIEluc2VydEJlZm9yZSk7CisgIH0KKworICBzdGF0aWMgSW52b2tlSW5zdCAqQ3JlYXRlKEZ1bmN0aW9uVHlwZSAqVHksIFZhbHVlICpGdW5jLCBCYXNpY0Jsb2NrICpJZk5vcm1hbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJZkV4Y2VwdGlvbiwgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIHVuc2lnbmVkIFZhbHVlcyA9IHVuc2lnbmVkKEFyZ3Muc2l6ZSgpKSArIDM7CisgICAgcmV0dXJuIG5ldyAoVmFsdWVzKSBJbnZva2VJbnN0KFR5LCBGdW5jLCBJZk5vcm1hbCwgSWZFeGNlcHRpb24sIEFyZ3MsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcywgTmFtZVN0ciwgSW5zZXJ0QmVmb3JlKTsKKyAgfQorCisgIHN0YXRpYyBJbnZva2VJbnN0ICpDcmVhdGUoRnVuY3Rpb25UeXBlICpUeSwgVmFsdWUgKkZ1bmMsIEJhc2ljQmxvY2sgKklmTm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKklmRXhjZXB0aW9uLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IEJ1bmRsZXMgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpIHsKKyAgICB1bnNpZ25lZCBWYWx1ZXMgPSB1bnNpZ25lZChBcmdzLnNpemUoKSkgKyBDb3VudEJ1bmRsZUlucHV0cyhCdW5kbGVzKSArIDM7CisgICAgdW5zaWduZWQgRGVzY3JpcHRvckJ5dGVzID0gQnVuZGxlcy5zaXplKCkgKiBzaXplb2YoQnVuZGxlT3BJbmZvKTsKKworICAgIHJldHVybiBuZXcgKFZhbHVlcywgRGVzY3JpcHRvckJ5dGVzKQorICAgICAgICBJbnZva2VJbnN0KFR5LCBGdW5jLCBJZk5vcm1hbCwgSWZFeGNlcHRpb24sIEFyZ3MsIEJ1bmRsZXMsIFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICBOYW1lU3RyLCBJbnNlcnRCZWZvcmUpOworICB9CisKKyAgc3RhdGljIEludm9rZUluc3QgKkNyZWF0ZShWYWx1ZSAqRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJZk5vcm1hbCwgQmFzaWNCbG9jayAqSWZFeGNlcHRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICB1bnNpZ25lZCBWYWx1ZXMgPSB1bnNpZ25lZChBcmdzLnNpemUoKSkgKyAzOworICAgIHJldHVybiBuZXcgKFZhbHVlcykgSW52b2tlSW5zdChGdW5jLCBJZk5vcm1hbCwgSWZFeGNlcHRpb24sIEFyZ3MsIE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcywgTmFtZVN0ciwgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgc3RhdGljIEludm9rZUluc3QgKkNyZWF0ZShWYWx1ZSAqRnVuYywgQmFzaWNCbG9jayAqSWZOb3JtYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSWZFeGNlcHRpb24sIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gQnVuZGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICB1bnNpZ25lZCBWYWx1ZXMgPSB1bnNpZ25lZChBcmdzLnNpemUoKSkgKyBDb3VudEJ1bmRsZUlucHV0cyhCdW5kbGVzKSArIDM7CisgICAgdW5zaWduZWQgRGVzY3JpcHRvckJ5dGVzID0gQnVuZGxlcy5zaXplKCkgKiBzaXplb2YoQnVuZGxlT3BJbmZvKTsKKworICAgIHJldHVybiBuZXcgKFZhbHVlcywgRGVzY3JpcHRvckJ5dGVzKQorICAgICAgICBJbnZva2VJbnN0KEZ1bmMsIElmTm9ybWFsLCBJZkV4Y2VwdGlvbiwgQXJncywgQnVuZGxlcywgVmFsdWVzLCBOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgIEluc2VydEF0RW5kKTsKKyAgfQorCisgIC8vLyBDcmVhdGUgYSBjbG9uZSBvZiBccCBJSSB3aXRoIGEgZGlmZmVyZW50IHNldCBvZiBvcGVyYW5kIGJ1bmRsZXMgYW5kCisgIC8vLyBpbnNlcnQgaXQgYmVmb3JlIFxwIEluc2VydFB0LgorICAvLy8KKyAgLy8vIFRoZSByZXR1cm5lZCBpbnZva2UgaW5zdHJ1Y3Rpb24gaXMgaWRlbnRpY2FsIHRvIFxwIElJIGluIGV2ZXJ5IHdheSBleGNlcHQKKyAgLy8vIHRoYXQgdGhlIG9wZXJhbmQgYnVuZGxlcyBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbiBhcmUgc2V0IHRvIHRoZSBvcGVyYW5kCisgIC8vLyBidW5kbGVzIGluIFxwIEJ1bmRsZXMuCisgIHN0YXRpYyBJbnZva2VJbnN0ICpDcmVhdGUoSW52b2tlSW5zdCAqSUksIEFycmF5UmVmPE9wZXJhbmRCdW5kbGVEZWY+IEJ1bmRsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydFB0ID0gbnVsbHB0cik7CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgY2FsbCBzaG91bGQgbm90IHBlcmZvcm0gaW5kaXJlY3QgYnJhbmNoIHRyYWNraW5nLgorICBib29sIGRvZXNOb0NmQ2hlY2soKSBjb25zdCB7IHJldHVybiBoYXNGbkF0dHIoQXR0cmlidXRlOjpOb0NmQ2hlY2spOyB9CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgY2FsbCBjYW5ub3QgdW53aW5kLgorICBib29sIGRvZXNOb3RUaHJvdygpIGNvbnN0IHsgcmV0dXJuIGhhc0ZuQXR0cihBdHRyaWJ1dGU6Ok5vVW53aW5kKTsgfQorICB2b2lkIHNldERvZXNOb3RUaHJvdygpIHsKKyAgICBhZGRBdHRyaWJ1dGUoQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cmlidXRlOjpOb1Vud2luZCk7CisgIH0KKyAgCisgIC8vLyBSZXR1cm4gdGhlIGZ1bmN0aW9uIGNhbGxlZCwgb3IgbnVsbCBpZiB0aGlzIGlzIGFuCisgIC8vLyBpbmRpcmVjdCBmdW5jdGlvbiBpbnZvY2F0aW9uLgorICAvLy8KKyAgRnVuY3Rpb24gKmdldENhbGxlZEZ1bmN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBkeW5fY2FzdDxGdW5jdGlvbj4oT3A8LTM+KCkpOworICB9CisKKyAgLy8vIEdldCBhIHBvaW50ZXIgdG8gdGhlIGZ1bmN0aW9uIHRoYXQgaXMgaW52b2tlZCBieSB0aGlzCisgIC8vLyBpbnN0cnVjdGlvbgorICBjb25zdCBWYWx1ZSAqZ2V0Q2FsbGVkVmFsdWUoKSBjb25zdCB7IHJldHVybiBPcDwtMz4oKTsgfQorICAgICAgICBWYWx1ZSAqZ2V0Q2FsbGVkVmFsdWUoKSAgICAgICB7IHJldHVybiBPcDwtMz4oKTsgfQorCisgIC8vLyBTZXQgdGhlIGZ1bmN0aW9uIGNhbGxlZC4KKyAgdm9pZCBzZXRDYWxsZWRGdW5jdGlvbihWYWx1ZSogRm4pIHsKKyAgICBzZXRDYWxsZWRGdW5jdGlvbigKKyAgICAgICAgY2FzdDxGdW5jdGlvblR5cGU+KGNhc3Q8UG9pbnRlclR5cGU+KEZuLT5nZXRUeXBlKCkpLT5nZXRFbGVtZW50VHlwZSgpKSwKKyAgICAgICAgRm4pOworICB9CisgIHZvaWQgc2V0Q2FsbGVkRnVuY3Rpb24oRnVuY3Rpb25UeXBlICpGVHksIFZhbHVlICpGbikgeworICAgIHRoaXMtPkZUeSA9IEZUeTsKKyAgICBhc3NlcnQoRlR5ID09IGNhc3Q8RnVuY3Rpb25UeXBlPigKKyAgICAgICAgICAgICAgICAgICAgICBjYXN0PFBvaW50ZXJUeXBlPihGbi0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSkpOworICAgIE9wPC0zPigpID0gRm47CisgIH0KKworICAvLyBnZXQqRGVzdCAtIFJldHVybiB0aGUgZGVzdGluYXRpb24gYmFzaWMgYmxvY2tzLi4uCisgIEJhc2ljQmxvY2sgKmdldE5vcm1hbERlc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8QmFzaWNCbG9jaz4oT3A8LTI+KCkpOworICB9CisgIEJhc2ljQmxvY2sgKmdldFVud2luZERlc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8QmFzaWNCbG9jaz4oT3A8LTE+KCkpOworICB9CisgIHZvaWQgc2V0Tm9ybWFsRGVzdChCYXNpY0Jsb2NrICpCKSB7CisgICAgT3A8LTI+KCkgPSByZWludGVycHJldF9jYXN0PFZhbHVlKj4oQik7CisgIH0KKyAgdm9pZCBzZXRVbndpbmREZXN0KEJhc2ljQmxvY2sgKkIpIHsKKyAgICBPcDwtMT4oKSA9IHJlaW50ZXJwcmV0X2Nhc3Q8VmFsdWUqPihCKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGxhbmRpbmdwYWQgaW5zdHJ1Y3Rpb24gZnJvbSB0aGUgbGFuZGluZyBwYWQKKyAgLy8vIGJsb2NrICh0aGUgdW53aW5kIGRlc3RpbmF0aW9uKS4KKyAgTGFuZGluZ1BhZEluc3QgKmdldExhbmRpbmdQYWRJbnN0KCkgY29uc3Q7CisKKyAgQmFzaWNCbG9jayAqZ2V0U3VjY2Vzc29yKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IDIgJiYgIlN1Y2Nlc3NvciAjIG91dCBvZiByYW5nZSBmb3IgaW52b2tlISIpOworICAgIHJldHVybiBpID09IDAgPyBnZXROb3JtYWxEZXN0KCkgOiBnZXRVbndpbmREZXN0KCk7CisgIH0KKworICB2b2lkIHNldFN1Y2Nlc3Nvcih1bnNpZ25lZCBpZHgsIEJhc2ljQmxvY2sgKk5ld1N1Y2MpIHsKKyAgICBhc3NlcnQoaWR4IDwgMiAmJiAiU3VjY2Vzc29yICMgb3V0IG9mIHJhbmdlIGZvciBpbnZva2UhIik7CisgICAgKigmT3A8LTI+KCkgKyBpZHgpID0gcmVpbnRlcnByZXRfY2FzdDxWYWx1ZSo+KE5ld1N1Y2MpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtU3VjY2Vzc29ycygpIGNvbnN0IHsgcmV0dXJuIDI7IH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIChJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6SW52b2tlKTsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KKworcHJpdmF0ZToKKworICAvLyBTaGFkb3cgSW5zdHJ1Y3Rpb246OnNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhIHdpdGggYSBwcml2YXRlIGZvcndhcmRpbmcKKyAgLy8gbWV0aG9kIHNvIHRoYXQgc3ViY2xhc3NlcyBjYW5ub3QgYWNjaWRlbnRhbGx5IHVzZSBpdC4KKyAgdm9pZCBzZXRJbnN0cnVjdGlvblN1YmNsYXNzRGF0YSh1bnNpZ25lZCBzaG9ydCBEKSB7CisgICAgSW5zdHJ1Y3Rpb246OnNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKEQpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8Q2FsbEJhc2U8SW52b2tlSW5zdD4+CisgICAgOiBwdWJsaWMgVmFyaWFkaWNPcGVyYW5kVHJhaXRzPENhbGxCYXNlPEludm9rZUluc3Q+LCAzPiB7fTsKKworSW52b2tlSW5zdDo6SW52b2tlSW5zdChGdW5jdGlvblR5cGUgKlR5LCBWYWx1ZSAqRnVuYywgQmFzaWNCbG9jayAqSWZOb3JtYWwsCisgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKklmRXhjZXB0aW9uLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPcGVyYW5kQnVuZGxlRGVmPiBCdW5kbGVzLCB1bnNpZ25lZCBWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKQorICAgIDogQ2FsbEJhc2U8SW52b2tlSW5zdD4oVHktPmdldFJldHVyblR5cGUoKSwgSW5zdHJ1Y3Rpb246Okludm9rZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhbmRUcmFpdHM8Q2FsbEJhc2U8SW52b2tlSW5zdD4+OjpvcF9lbmQodGhpcykgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlcywgSW5zZXJ0QmVmb3JlKSB7CisgIGluaXQoVHksIEZ1bmMsIElmTm9ybWFsLCBJZkV4Y2VwdGlvbiwgQXJncywgQnVuZGxlcywgTmFtZVN0cik7Cit9CisKK0ludm9rZUluc3Q6Okludm9rZUluc3QoVmFsdWUgKkZ1bmMsIEJhc2ljQmxvY2sgKklmTm9ybWFsLAorICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJZkV4Y2VwdGlvbiwgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T3BlcmFuZEJ1bmRsZURlZj4gQnVuZGxlcywgdW5zaWduZWQgVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpCisgICAgOiBDYWxsQmFzZTxJbnZva2VJbnN0PigKKyAgICAgICAgICBjYXN0PEZ1bmN0aW9uVHlwZT4oCisgICAgICAgICAgICAgIGNhc3Q8UG9pbnRlclR5cGU+KEZ1bmMtPmdldFR5cGUoKSktPmdldEVsZW1lbnRUeXBlKCkpCisgICAgICAgICAgICAgIC0+Z2V0UmV0dXJuVHlwZSgpLAorICAgICAgICAgIEluc3RydWN0aW9uOjpJbnZva2UsCisgICAgICAgICAgT3BlcmFuZFRyYWl0czxDYWxsQmFzZTxJbnZva2VJbnN0Pj46Om9wX2VuZCh0aGlzKSAtIFZhbHVlcywgVmFsdWVzLAorICAgICAgICAgIEluc2VydEF0RW5kKSB7CisgIGluaXQoRnVuYywgSWZOb3JtYWwsIElmRXhjZXB0aW9uLCBBcmdzLCBCdW5kbGVzLCBOYW1lU3RyKTsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXN1bWVJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vIFJlc3VtZSB0aGUgcHJvcGFnYXRpb24gb2YgYW4gZXhjZXB0aW9uLgorLy8vCitjbGFzcyBSZXN1bWVJbnN0IDogcHVibGljIFRlcm1pbmF0b3JJbnN0IHsKKyAgUmVzdW1lSW5zdChjb25zdCBSZXN1bWVJbnN0ICZSSSk7CisKKyAgZXhwbGljaXQgUmVzdW1lSW5zdChWYWx1ZSAqRXhuLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlPW51bGxwdHIpOworICBSZXN1bWVJbnN0KFZhbHVlICpFeG4sIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgUmVzdW1lSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgc3RhdGljIFJlc3VtZUluc3QgKkNyZWF0ZShWYWx1ZSAqRXhuLCBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIHJldHVybiBuZXcoMSkgUmVzdW1lSW5zdChFeG4sIEluc2VydEJlZm9yZSk7CisgIH0KKworICBzdGF0aWMgUmVzdW1lSW5zdCAqQ3JlYXRlKFZhbHVlICpFeG4sIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgcmV0dXJuIG5ldygxKSBSZXN1bWVJbnN0KEV4biwgSW5zZXJ0QXRFbmQpOworICB9CisKKyAgLy8vIFByb3ZpZGUgZmFzdCBvcGVyYW5kIGFjY2Vzc29ycworICBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZhbHVlKTsKKworICAvLy8gQ29udmVuaWVuY2UgYWNjZXNzb3IuCisgIFZhbHVlICpnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIE9wPDA+KCk7IH0KKworICB1bnNpZ25lZCBnZXROdW1TdWNjZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gMDsgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlJlc3VtZTsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIFRlcm1pbmF0b3JJbnN0OworCisgIEJhc2ljQmxvY2sgKmdldFN1Y2Nlc3Nvcih1bnNpZ25lZCBpZHgpIGNvbnN0IHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJSZXN1bWVJbnN0IGhhcyBubyBzdWNjZXNzb3JzISIpOworICB9CisKKyAgdm9pZCBzZXRTdWNjZXNzb3IodW5zaWduZWQgaWR4LCBCYXNpY0Jsb2NrICpOZXdTdWNjKSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiUmVzdW1lSW5zdCBoYXMgbm8gc3VjY2Vzc29ycyEiKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzPFJlc3VtZUluc3Q+IDoKKyAgICBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPFJlc3VtZUluc3QsIDE+IHsKK307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhSZXN1bWVJbnN0LCBWYWx1ZSkKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgIENhdGNoU3dpdGNoSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2NsYXNzIENhdGNoU3dpdGNoSW5zdCA6IHB1YmxpYyBUZXJtaW5hdG9ySW5zdCB7CisgIC8vLyBUaGUgbnVtYmVyIG9mIG9wZXJhbmRzIGFjdHVhbGx5IGFsbG9jYXRlZC4gIE51bU9wZXJhbmRzIGlzCisgIC8vLyB0aGUgbnVtYmVyIGFjdHVhbGx5IGluIHVzZS4KKyAgdW5zaWduZWQgUmVzZXJ2ZWRTcGFjZTsKKworICAvLyBPcGVyYW5kWzBdID0gT3V0ZXIgc2NvcGUKKyAgLy8gT3BlcmFuZFsxXSA9IFVud2luZCBibG9jayBkZXN0aW5hdGlvbgorICAvLyBPcGVyYW5kW25dID0gQmFzaWNCbG9jayB0byBnbyB0byBvbiBtYXRjaAorICBDYXRjaFN3aXRjaEluc3QoY29uc3QgQ2F0Y2hTd2l0Y2hJbnN0ICZDU0kpOworCisgIC8vLyBDcmVhdGUgYSBuZXcgc3dpdGNoIGluc3RydWN0aW9uLCBzcGVjaWZ5aW5nIGEKKyAgLy8vIGRlZmF1bHQgZGVzdGluYXRpb24uICBUaGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgaGFuZGxlcnMgY2FuIGJlIHNwZWNpZmllZAorICAvLy8gaGVyZSB0byBtYWtlIG1lbW9yeSBhbGxvY2F0aW9uIG1vcmUgZWZmaWNpZW50LgorICAvLy8gVGhpcyBjb25zdHJ1Y3RvciBjYW4gYWxzbyBhdXRvaW5zZXJ0IGJlZm9yZSBhbm90aGVyIGluc3RydWN0aW9uLgorICBDYXRjaFN3aXRjaEluc3QoVmFsdWUgKlBhcmVudFBhZCwgQmFzaWNCbG9jayAqVW53aW5kRGVzdCwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUhhbmRsZXJzLCBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpOworCisgIC8vLyBDcmVhdGUgYSBuZXcgc3dpdGNoIGluc3RydWN0aW9uLCBzcGVjaWZ5aW5nIGEKKyAgLy8vIGRlZmF1bHQgZGVzdGluYXRpb24uICBUaGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgaGFuZGxlcnMgY2FuIGJlIHNwZWNpZmllZAorICAvLy8gaGVyZSB0byBtYWtlIG1lbW9yeSBhbGxvY2F0aW9uIG1vcmUgZWZmaWNpZW50LgorICAvLy8gVGhpcyBjb25zdHJ1Y3RvciBhbHNvIGF1dG9pbnNlcnRzIGF0IHRoZSBlbmQgb2YgdGhlIHNwZWNpZmllZCBCYXNpY0Jsb2NrLgorICBDYXRjaFN3aXRjaEluc3QoVmFsdWUgKlBhcmVudFBhZCwgQmFzaWNCbG9jayAqVW53aW5kRGVzdCwKKyAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE51bUhhbmRsZXJzLCBjb25zdCBUd2luZSAmTmFtZVN0ciwKKyAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSB6ZXJvIG9wZXJhbmRzCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeyByZXR1cm4gVXNlcjo6b3BlcmF0b3IgbmV3KHMpOyB9CisKKyAgdm9pZCBpbml0KFZhbHVlICpQYXJlbnRQYWQsIEJhc2ljQmxvY2sgKlVud2luZERlc3QsIHVuc2lnbmVkIE51bVJlc2VydmVkKTsKKyAgdm9pZCBncm93T3BlcmFuZHModW5zaWduZWQgU2l6ZSk7CisKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIENhdGNoU3dpdGNoSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgc3RhdGljIENhdGNoU3dpdGNoSW5zdCAqQ3JlYXRlKFZhbHVlICpQYXJlbnRQYWQsIEJhc2ljQmxvY2sgKlVud2luZERlc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1IYW5kbGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIHJldHVybiBuZXcgQ2F0Y2hTd2l0Y2hJbnN0KFBhcmVudFBhZCwgVW53aW5kRGVzdCwgTnVtSGFuZGxlcnMsIE5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zZXJ0QmVmb3JlKTsKKyAgfQorCisgIHN0YXRpYyBDYXRjaFN3aXRjaEluc3QgKkNyZWF0ZShWYWx1ZSAqUGFyZW50UGFkLCBCYXNpY0Jsb2NrICpVbndpbmREZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTnVtSGFuZGxlcnMsIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICByZXR1cm4gbmV3IENhdGNoU3dpdGNoSW5zdChQYXJlbnRQYWQsIFVud2luZERlc3QsIE51bUhhbmRsZXJzLCBOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc2VydEF0RW5kKTsKKyAgfQorCisgIC8vLyBQcm92aWRlIGZhc3Qgb3BlcmFuZCBhY2Nlc3NvcnMKKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgLy8gQWNjZXNzb3IgTWV0aG9kcyBmb3IgQ2F0Y2hTd2l0Y2ggc3RtdAorICBWYWx1ZSAqZ2V0UGFyZW50UGFkKCkgY29uc3QgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorICB2b2lkIHNldFBhcmVudFBhZChWYWx1ZSAqUGFyZW50UGFkKSB7IHNldE9wZXJhbmQoMCwgUGFyZW50UGFkKTsgfQorCisgIC8vIEFjY2Vzc29yIE1ldGhvZHMgZm9yIENhdGNoU3dpdGNoIHN0bXQKKyAgYm9vbCBoYXNVbndpbmREZXN0KCkgY29uc3QgeyByZXR1cm4gZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiAxOyB9CisgIGJvb2wgdW53aW5kc1RvQ2FsbGVyKCkgY29uc3QgeyByZXR1cm4gIWhhc1Vud2luZERlc3QoKTsgfQorICBCYXNpY0Jsb2NrICpnZXRVbndpbmREZXN0KCkgY29uc3QgeworICAgIGlmIChoYXNVbndpbmREZXN0KCkpCisgICAgICByZXR1cm4gY2FzdDxCYXNpY0Jsb2NrPihnZXRPcGVyYW5kKDEpKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorICB2b2lkIHNldFVud2luZERlc3QoQmFzaWNCbG9jayAqVW53aW5kRGVzdCkgeworICAgIGFzc2VydChVbndpbmREZXN0KTsKKyAgICBhc3NlcnQoaGFzVW53aW5kRGVzdCgpKTsKKyAgICBzZXRPcGVyYW5kKDEsIFVud2luZERlc3QpOworICB9CisKKyAgLy8vIHJldHVybiB0aGUgbnVtYmVyIG9mICdoYW5kbGVycycgaW4gdGhpcyBjYXRjaHN3aXRjaAorICAvLy8gaW5zdHJ1Y3Rpb24sIGV4Y2VwdCB0aGUgZGVmYXVsdCBoYW5kbGVyCisgIHVuc2lnbmVkIGdldE51bUhhbmRsZXJzKCkgY29uc3QgeworICAgIGlmIChoYXNVbndpbmREZXN0KCkpCisgICAgICByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKSAtIDI7CisgICAgcmV0dXJuIGdldE51bU9wZXJhbmRzKCkgLSAxOworICB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyBCYXNpY0Jsb2NrICpoYW5kbGVyX2hlbHBlcihWYWx1ZSAqVikgeyByZXR1cm4gY2FzdDxCYXNpY0Jsb2NrPihWKTsgfQorICBzdGF0aWMgY29uc3QgQmFzaWNCbG9jayAqaGFuZGxlcl9oZWxwZXIoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gY2FzdDxCYXNpY0Jsb2NrPihWKTsKKyAgfQorCitwdWJsaWM6CisgIHVzaW5nIERlcmVmRm5UeSA9IEJhc2ljQmxvY2sgKigqKShWYWx1ZSAqKTsKKyAgdXNpbmcgaGFuZGxlcl9pdGVyYXRvciA9IG1hcHBlZF9pdGVyYXRvcjxvcF9pdGVyYXRvciwgRGVyZWZGblR5PjsKKyAgdXNpbmcgaGFuZGxlcl9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPGhhbmRsZXJfaXRlcmF0b3I+OworICB1c2luZyBDb25zdERlcmVmRm5UeSA9IGNvbnN0IEJhc2ljQmxvY2sgKigqKShjb25zdCBWYWx1ZSAqKTsKKyAgdXNpbmcgY29uc3RfaGFuZGxlcl9pdGVyYXRvciA9CisgICAgICBtYXBwZWRfaXRlcmF0b3I8Y29uc3Rfb3BfaXRlcmF0b3IsIENvbnN0RGVyZWZGblR5PjsKKyAgdXNpbmcgY29uc3RfaGFuZGxlcl9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPGNvbnN0X2hhbmRsZXJfaXRlcmF0b3I+OworCisgIC8vLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRoYXQgcG9pbnRzIHRvIHRoZSBmaXJzdCBoYW5kbGVyIGluIENhdGNoU3dpdGNoSW5zdC4KKyAgaGFuZGxlcl9pdGVyYXRvciBoYW5kbGVyX2JlZ2luKCkgeworICAgIG9wX2l0ZXJhdG9yIEl0ID0gb3BfYmVnaW4oKSArIDE7CisgICAgaWYgKGhhc1Vud2luZERlc3QoKSkKKyAgICAgICsrSXQ7CisgICAgcmV0dXJuIGhhbmRsZXJfaXRlcmF0b3IoSXQsIERlcmVmRm5UeShoYW5kbGVyX2hlbHBlcikpOworICB9CisKKyAgLy8vIFJldHVybnMgYW4gaXRlcmF0b3IgdGhhdCBwb2ludHMgdG8gdGhlIGZpcnN0IGhhbmRsZXIgaW4gdGhlCisgIC8vLyBDYXRjaFN3aXRjaEluc3QuCisgIGNvbnN0X2hhbmRsZXJfaXRlcmF0b3IgaGFuZGxlcl9iZWdpbigpIGNvbnN0IHsKKyAgICBjb25zdF9vcF9pdGVyYXRvciBJdCA9IG9wX2JlZ2luKCkgKyAxOworICAgIGlmIChoYXNVbndpbmREZXN0KCkpCisgICAgICArK0l0OworICAgIHJldHVybiBjb25zdF9oYW5kbGVyX2l0ZXJhdG9yKEl0LCBDb25zdERlcmVmRm5UeShoYW5kbGVyX2hlbHBlcikpOworICB9CisKKyAgLy8vIFJldHVybnMgYSByZWFkLW9ubHkgaXRlcmF0b3IgdGhhdCBwb2ludHMgb25lIHBhc3QgdGhlIGxhc3QKKyAgLy8vIGhhbmRsZXIgaW4gdGhlIENhdGNoU3dpdGNoSW5zdC4KKyAgaGFuZGxlcl9pdGVyYXRvciBoYW5kbGVyX2VuZCgpIHsKKyAgICByZXR1cm4gaGFuZGxlcl9pdGVyYXRvcihvcF9lbmQoKSwgRGVyZWZGblR5KGhhbmRsZXJfaGVscGVyKSk7CisgIH0KKworICAvLy8gUmV0dXJucyBhbiBpdGVyYXRvciB0aGF0IHBvaW50cyBvbmUgcGFzdCB0aGUgbGFzdCBoYW5kbGVyIGluIHRoZQorICAvLy8gQ2F0Y2hTd2l0Y2hJbnN0LgorICBjb25zdF9oYW5kbGVyX2l0ZXJhdG9yIGhhbmRsZXJfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9oYW5kbGVyX2l0ZXJhdG9yKG9wX2VuZCgpLCBDb25zdERlcmVmRm5UeShoYW5kbGVyX2hlbHBlcikpOworICB9CisKKyAgLy8vIGl0ZXJhdGlvbiBhZGFwdGVyIGZvciByYW5nZS1mb3IgbG9vcHMuCisgIGhhbmRsZXJfcmFuZ2UgaGFuZGxlcnMoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoaGFuZGxlcl9iZWdpbigpLCBoYW5kbGVyX2VuZCgpKTsKKyAgfQorCisgIC8vLyBpdGVyYXRpb24gYWRhcHRlciBmb3IgcmFuZ2UtZm9yIGxvb3BzLgorICBjb25zdF9oYW5kbGVyX3JhbmdlIGhhbmRsZXJzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGhhbmRsZXJfYmVnaW4oKSwgaGFuZGxlcl9lbmQoKSk7CisgIH0KKworICAvLy8gQWRkIGFuIGVudHJ5IHRvIHRoZSBzd2l0Y2ggaW5zdHJ1Y3Rpb24uLi4KKyAgLy8vIE5vdGU6CisgIC8vLyBUaGlzIGFjdGlvbiBpbnZhbGlkYXRlcyBoYW5kbGVyX2VuZCgpLiBPbGQgaGFuZGxlcl9lbmQoKSBpdGVyYXRvciB3aWxsCisgIC8vLyBwb2ludCB0byB0aGUgYWRkZWQgaGFuZGxlci4KKyAgdm9pZCBhZGRIYW5kbGVyKEJhc2ljQmxvY2sgKkRlc3QpOworCisgIHZvaWQgcmVtb3ZlSGFuZGxlcihoYW5kbGVyX2l0ZXJhdG9yIEhJKTsKKworICB1bnNpZ25lZCBnZXROdW1TdWNjZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKSAtIDE7IH0KKyAgQmFzaWNCbG9jayAqZ2V0U3VjY2Vzc29yKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIGFzc2VydChJZHggPCBnZXROdW1TdWNjZXNzb3JzKCkgJiYKKyAgICAgICAgICAgIlN1Y2Nlc3NvciAjIG91dCBvZiByYW5nZSBmb3IgY2F0Y2hzd2l0Y2ghIik7CisgICAgcmV0dXJuIGNhc3Q8QmFzaWNCbG9jaz4oZ2V0T3BlcmFuZChJZHggKyAxKSk7CisgIH0KKyAgdm9pZCBzZXRTdWNjZXNzb3IodW5zaWduZWQgSWR4LCBCYXNpY0Jsb2NrICpOZXdTdWNjKSB7CisgICAgYXNzZXJ0KElkeCA8IGdldE51bVN1Y2Nlc3NvcnMoKSAmJgorICAgICAgICAgICAiU3VjY2Vzc29yICMgb3V0IG9mIHJhbmdlIGZvciBjYXRjaHN3aXRjaCEiKTsKKyAgICBzZXRPcGVyYW5kKElkeCArIDEsIE5ld1N1Y2MpOworICB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6Q2F0Y2hTd2l0Y2g7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE9wZXJhbmRUcmFpdHM8Q2F0Y2hTd2l0Y2hJbnN0PiA6IHB1YmxpYyBIdW5nb2ZmT3BlcmFuZFRyYWl0czwyPiB7fTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKENhdGNoU3dpdGNoSW5zdCwgVmFsdWUpCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGVhbnVwUGFkSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2NsYXNzIENsZWFudXBQYWRJbnN0IDogcHVibGljIEZ1bmNsZXRQYWRJbnN0IHsKK3ByaXZhdGU6CisgIGV4cGxpY2l0IENsZWFudXBQYWRJbnN0KFZhbHVlICpQYXJlbnRQYWQsIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZhbHVlcywgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpCisgICAgICA6IEZ1bmNsZXRQYWRJbnN0KEluc3RydWN0aW9uOjpDbGVhbnVwUGFkLCBQYXJlbnRQYWQsIEFyZ3MsIFZhbHVlcywKKyAgICAgICAgICAgICAgICAgICAgICAgTmFtZVN0ciwgSW5zZXJ0QmVmb3JlKSB7fQorICBleHBsaWNpdCBDbGVhbnVwUGFkSW5zdChWYWx1ZSAqUGFyZW50UGFkLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWYWx1ZXMsIGNvbnN0IFR3aW5lICZOYW1lU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkKKyAgICAgIDogRnVuY2xldFBhZEluc3QoSW5zdHJ1Y3Rpb246OkNsZWFudXBQYWQsIFBhcmVudFBhZCwgQXJncywgVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICBOYW1lU3RyLCBJbnNlcnRBdEVuZCkge30KKworcHVibGljOgorICBzdGF0aWMgQ2xlYW51cFBhZEluc3QgKkNyZWF0ZShWYWx1ZSAqUGFyZW50UGFkLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzID0gTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpIHsKKyAgICB1bnNpZ25lZCBWYWx1ZXMgPSAxICsgQXJncy5zaXplKCk7CisgICAgcmV0dXJuIG5ldyAoVmFsdWVzKQorICAgICAgICBDbGVhbnVwUGFkSW5zdChQYXJlbnRQYWQsIEFyZ3MsIFZhbHVlcywgTmFtZVN0ciwgSW5zZXJ0QmVmb3JlKTsKKyAgfQorCisgIHN0YXRpYyBDbGVhbnVwUGFkSW5zdCAqQ3JlYXRlKFZhbHVlICpQYXJlbnRQYWQsIEFycmF5UmVmPFZhbHVlICo+IEFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkgeworICAgIHVuc2lnbmVkIFZhbHVlcyA9IDEgKyBBcmdzLnNpemUoKTsKKyAgICByZXR1cm4gbmV3IChWYWx1ZXMpCisgICAgICAgIENsZWFudXBQYWRJbnN0KFBhcmVudFBhZCwgQXJncywgVmFsdWVzLCBOYW1lU3RyLCBJbnNlcnRBdEVuZCk7CisgIH0KKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6Q2xlYW51cFBhZDsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRjaFBhZEluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCitjbGFzcyBDYXRjaFBhZEluc3QgOiBwdWJsaWMgRnVuY2xldFBhZEluc3QgeworcHJpdmF0ZToKKyAgZXhwbGljaXQgQ2F0Y2hQYWRJbnN0KFZhbHVlICpDYXRjaFN3aXRjaCwgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZhbHVlcywgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlKQorICAgICAgOiBGdW5jbGV0UGFkSW5zdChJbnN0cnVjdGlvbjo6Q2F0Y2hQYWQsIENhdGNoU3dpdGNoLCBBcmdzLCBWYWx1ZXMsCisgICAgICAgICAgICAgICAgICAgICAgIE5hbWVTdHIsIEluc2VydEJlZm9yZSkge30KKyAgZXhwbGljaXQgQ2F0Y2hQYWRJbnN0KFZhbHVlICpDYXRjaFN3aXRjaCwgQXJyYXlSZWY8VmFsdWUgKj4gQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZhbHVlcywgY29uc3QgVHdpbmUgJk5hbWVTdHIsCisgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCkKKyAgICAgIDogRnVuY2xldFBhZEluc3QoSW5zdHJ1Y3Rpb246OkNhdGNoUGFkLCBDYXRjaFN3aXRjaCwgQXJncywgVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICAgICBOYW1lU3RyLCBJbnNlcnRBdEVuZCkge30KKworcHVibGljOgorICBzdGF0aWMgQ2F0Y2hQYWRJbnN0ICpDcmVhdGUoVmFsdWUgKkNhdGNoU3dpdGNoLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKSB7CisgICAgdW5zaWduZWQgVmFsdWVzID0gMSArIEFyZ3Muc2l6ZSgpOworICAgIHJldHVybiBuZXcgKFZhbHVlcykKKyAgICAgICAgQ2F0Y2hQYWRJbnN0KENhdGNoU3dpdGNoLCBBcmdzLCBWYWx1ZXMsIE5hbWVTdHIsIEluc2VydEJlZm9yZSk7CisgIH0KKworICBzdGF0aWMgQ2F0Y2hQYWRJbnN0ICpDcmVhdGUoVmFsdWUgKkNhdGNoU3dpdGNoLCBBcnJheVJlZjxWYWx1ZSAqPiBBcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgdW5zaWduZWQgVmFsdWVzID0gMSArIEFyZ3Muc2l6ZSgpOworICAgIHJldHVybiBuZXcgKFZhbHVlcykKKyAgICAgICAgQ2F0Y2hQYWRJbnN0KENhdGNoU3dpdGNoLCBBcmdzLCBWYWx1ZXMsIE5hbWVTdHIsIEluc2VydEF0RW5kKTsKKyAgfQorCisgIC8vLyBDb252ZW5pZW5jZSBhY2Nlc3NvcnMKKyAgQ2F0Y2hTd2l0Y2hJbnN0ICpnZXRDYXRjaFN3aXRjaCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxDYXRjaFN3aXRjaEluc3Q+KE9wPC0xPigpKTsKKyAgfQorICB2b2lkIHNldENhdGNoU3dpdGNoKFZhbHVlICpDYXRjaFN3aXRjaCkgeworICAgIGFzc2VydChDYXRjaFN3aXRjaCk7CisgICAgT3A8LTE+KCkgPSBDYXRjaFN3aXRjaDsKKyAgfQorCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpDYXRjaFBhZDsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYXRjaFJldHVybkluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIENhdGNoUmV0dXJuSW5zdCA6IHB1YmxpYyBUZXJtaW5hdG9ySW5zdCB7CisgIENhdGNoUmV0dXJuSW5zdChjb25zdCBDYXRjaFJldHVybkluc3QgJlJJKTsKKyAgQ2F0Y2hSZXR1cm5JbnN0KFZhbHVlICpDYXRjaFBhZCwgQmFzaWNCbG9jayAqQkIsIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUpOworICBDYXRjaFJldHVybkluc3QoVmFsdWUgKkNhdGNoUGFkLCBCYXNpY0Jsb2NrICpCQiwgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpOworCisgIHZvaWQgaW5pdChWYWx1ZSAqQ2F0Y2hQYWQsIEJhc2ljQmxvY2sgKkJCKTsKKworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgQ2F0Y2hSZXR1cm5JbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICBzdGF0aWMgQ2F0Y2hSZXR1cm5JbnN0ICpDcmVhdGUoVmFsdWUgKkNhdGNoUGFkLCBCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyKSB7CisgICAgYXNzZXJ0KENhdGNoUGFkKTsKKyAgICBhc3NlcnQoQkIpOworICAgIHJldHVybiBuZXcgKDIpIENhdGNoUmV0dXJuSW5zdChDYXRjaFBhZCwgQkIsIEluc2VydEJlZm9yZSk7CisgIH0KKworICBzdGF0aWMgQ2F0Y2hSZXR1cm5JbnN0ICpDcmVhdGUoVmFsdWUgKkNhdGNoUGFkLCBCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKSB7CisgICAgYXNzZXJ0KENhdGNoUGFkKTsKKyAgICBhc3NlcnQoQkIpOworICAgIHJldHVybiBuZXcgKDIpIENhdGNoUmV0dXJuSW5zdChDYXRjaFBhZCwgQkIsIEluc2VydEF0RW5kKTsKKyAgfQorCisgIC8vLyBQcm92aWRlIGZhc3Qgb3BlcmFuZCBhY2Nlc3NvcnMKKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgLy8vIENvbnZlbmllbmNlIGFjY2Vzc29ycy4KKyAgQ2F0Y2hQYWRJbnN0ICpnZXRDYXRjaFBhZCgpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8Q2F0Y2hQYWRJbnN0PihPcDwwPigpKTsgfQorICB2b2lkIHNldENhdGNoUGFkKENhdGNoUGFkSW5zdCAqQ2F0Y2hQYWQpIHsKKyAgICBhc3NlcnQoQ2F0Y2hQYWQpOworICAgIE9wPDA+KCkgPSBDYXRjaFBhZDsKKyAgfQorCisgIEJhc2ljQmxvY2sgKmdldFN1Y2Nlc3NvcigpIGNvbnN0IHsgcmV0dXJuIGNhc3Q8QmFzaWNCbG9jaz4oT3A8MT4oKSk7IH0KKyAgdm9pZCBzZXRTdWNjZXNzb3IoQmFzaWNCbG9jayAqTmV3U3VjYykgeworICAgIGFzc2VydChOZXdTdWNjKTsKKyAgICBPcDwxPigpID0gTmV3U3VjYzsKKyAgfQorICB1bnNpZ25lZCBnZXROdW1TdWNjZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gMTsgfQorCisgIC8vLyBHZXQgdGhlIHBhcmVudFBhZCBvZiB0aGlzIGNhdGNocmV0J3MgY2F0Y2hwYWQncyBjYXRjaHN3aXRjaC4KKyAgLy8vIFRoZSBzdWNjZXNzb3IgYmxvY2sgaXMgaW1wbGljaXRseSBhIG1lbWJlciBvZiB0aGlzIGZ1bmNsZXQuCisgIFZhbHVlICpnZXRDYXRjaFN3aXRjaFBhcmVudFBhZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0Q2F0Y2hQYWQoKS0+Z2V0Q2F0Y2hTd2l0Y2goKS0+Z2V0UGFyZW50UGFkKCk7CisgIH0KKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIChJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6Q2F0Y2hSZXQpOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorCitwcml2YXRlOgorICBmcmllbmQgVGVybWluYXRvckluc3Q7CisKKyAgQmFzaWNCbG9jayAqZ2V0U3VjY2Vzc29yKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIGFzc2VydChJZHggPCBnZXROdW1TdWNjZXNzb3JzKCkgJiYgIlN1Y2Nlc3NvciAjIG91dCBvZiByYW5nZSBmb3IgY2F0Y2hyZXQhIik7CisgICAgcmV0dXJuIGdldFN1Y2Nlc3NvcigpOworICB9CisKKyAgdm9pZCBzZXRTdWNjZXNzb3IodW5zaWduZWQgSWR4LCBCYXNpY0Jsb2NrICpCKSB7CisgICAgYXNzZXJ0KElkeCA8IGdldE51bVN1Y2Nlc3NvcnMoKSAmJiAiU3VjY2Vzc29yICMgb3V0IG9mIHJhbmdlIGZvciBjYXRjaHJldCEiKTsKKyAgICBzZXRTdWNjZXNzb3IoQik7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxDYXRjaFJldHVybkluc3Q+CisgICAgOiBwdWJsaWMgRml4ZWROdW1PcGVyYW5kVHJhaXRzPENhdGNoUmV0dXJuSW5zdCwgMj4ge307CisKK0RFRklORV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhDYXRjaFJldHVybkluc3QsIFZhbHVlKQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xlYW51cFJldHVybkluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIENsZWFudXBSZXR1cm5JbnN0IDogcHVibGljIFRlcm1pbmF0b3JJbnN0IHsKK3ByaXZhdGU6CisgIENsZWFudXBSZXR1cm5JbnN0KGNvbnN0IENsZWFudXBSZXR1cm5JbnN0ICZSSSk7CisgIENsZWFudXBSZXR1cm5JbnN0KFZhbHVlICpDbGVhbnVwUGFkLCBCYXNpY0Jsb2NrICpVbndpbmRCQiwgdW5zaWduZWQgVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cik7CisgIENsZWFudXBSZXR1cm5JbnN0KFZhbHVlICpDbGVhbnVwUGFkLCBCYXNpY0Jsb2NrICpVbndpbmRCQiwgdW5zaWduZWQgVmFsdWVzLAorICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCk7CisKKyAgdm9pZCBpbml0KFZhbHVlICpDbGVhbnVwUGFkLCBCYXNpY0Jsb2NrICpVbndpbmRCQik7CisKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIENsZWFudXBSZXR1cm5JbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICBzdGF0aWMgQ2xlYW51cFJldHVybkluc3QgKkNyZWF0ZShWYWx1ZSAqQ2xlYW51cFBhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqVW53aW5kQkIgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0cikgeworICAgIGFzc2VydChDbGVhbnVwUGFkKTsKKyAgICB1bnNpZ25lZCBWYWx1ZXMgPSAxOworICAgIGlmIChVbndpbmRCQikKKyAgICAgICsrVmFsdWVzOworICAgIHJldHVybiBuZXcgKFZhbHVlcykKKyAgICAgICAgQ2xlYW51cFJldHVybkluc3QoQ2xlYW51cFBhZCwgVW53aW5kQkIsIFZhbHVlcywgSW5zZXJ0QmVmb3JlKTsKKyAgfQorCisgIHN0YXRpYyBDbGVhbnVwUmV0dXJuSW5zdCAqQ3JlYXRlKFZhbHVlICpDbGVhbnVwUGFkLCBCYXNpY0Jsb2NrICpVbndpbmRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQpIHsKKyAgICBhc3NlcnQoQ2xlYW51cFBhZCk7CisgICAgdW5zaWduZWQgVmFsdWVzID0gMTsKKyAgICBpZiAoVW53aW5kQkIpCisgICAgICArK1ZhbHVlczsKKyAgICByZXR1cm4gbmV3IChWYWx1ZXMpCisgICAgICAgIENsZWFudXBSZXR1cm5JbnN0KENsZWFudXBQYWQsIFVud2luZEJCLCBWYWx1ZXMsIEluc2VydEF0RW5kKTsKKyAgfQorCisgIC8vLyBQcm92aWRlIGZhc3Qgb3BlcmFuZCBhY2Nlc3NvcnMKKyAgREVDTEFSRV9UUkFOU1BBUkVOVF9PUEVSQU5EX0FDQ0VTU09SUyhWYWx1ZSk7CisKKyAgYm9vbCBoYXNVbndpbmREZXN0KCkgY29uc3QgeyByZXR1cm4gZ2V0U3ViY2xhc3NEYXRhRnJvbUluc3RydWN0aW9uKCkgJiAxOyB9CisgIGJvb2wgdW53aW5kc1RvQ2FsbGVyKCkgY29uc3QgeyByZXR1cm4gIWhhc1Vud2luZERlc3QoKTsgfQorCisgIC8vLyBDb252ZW5pZW5jZSBhY2Nlc3Nvci4KKyAgQ2xlYW51cFBhZEluc3QgKmdldENsZWFudXBQYWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8Q2xlYW51cFBhZEluc3Q+KE9wPDA+KCkpOworICB9CisgIHZvaWQgc2V0Q2xlYW51cFBhZChDbGVhbnVwUGFkSW5zdCAqQ2xlYW51cFBhZCkgeworICAgIGFzc2VydChDbGVhbnVwUGFkKTsKKyAgICBPcDwwPigpID0gQ2xlYW51cFBhZDsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bVN1Y2Nlc3NvcnMoKSBjb25zdCB7IHJldHVybiBoYXNVbndpbmREZXN0KCkgPyAxIDogMDsgfQorCisgIEJhc2ljQmxvY2sgKmdldFVud2luZERlc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc1Vud2luZERlc3QoKSA/IGNhc3Q8QmFzaWNCbG9jaz4oT3A8MT4oKSkgOiBudWxscHRyOworICB9CisgIHZvaWQgc2V0VW53aW5kRGVzdChCYXNpY0Jsb2NrICpOZXdEZXN0KSB7CisgICAgYXNzZXJ0KE5ld0Rlc3QpOworICAgIGFzc2VydChoYXNVbndpbmREZXN0KCkpOworICAgIE9wPDE+KCkgPSBOZXdEZXN0OworICB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiAoSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkNsZWFudXBSZXQpOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorCitwcml2YXRlOgorICBmcmllbmQgVGVybWluYXRvckluc3Q7CisKKyAgQmFzaWNCbG9jayAqZ2V0U3VjY2Vzc29yKHVuc2lnbmVkIElkeCkgY29uc3QgeworICAgIGFzc2VydChJZHggPT0gMCk7CisgICAgcmV0dXJuIGdldFVud2luZERlc3QoKTsKKyAgfQorCisgIHZvaWQgc2V0U3VjY2Vzc29yKHVuc2lnbmVkIElkeCwgQmFzaWNCbG9jayAqQikgeworICAgIGFzc2VydChJZHggPT0gMCk7CisgICAgc2V0VW53aW5kRGVzdChCKTsKKyAgfQorCisgIC8vIFNoYWRvdyBJbnN0cnVjdGlvbjo6c2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEgd2l0aCBhIHByaXZhdGUgZm9yd2FyZGluZworICAvLyBtZXRob2Qgc28gdGhhdCBzdWJjbGFzc2VzIGNhbm5vdCBhY2NpZGVudGFsbHkgdXNlIGl0LgorICB2b2lkIHNldEluc3RydWN0aW9uU3ViY2xhc3NEYXRhKHVuc2lnbmVkIHNob3J0IEQpIHsKKyAgICBJbnN0cnVjdGlvbjo6c2V0SW5zdHJ1Y3Rpb25TdWJjbGFzc0RhdGEoRCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3BlcmFuZFRyYWl0czxDbGVhbnVwUmV0dXJuSW5zdD4KKyAgICA6IHB1YmxpYyBWYXJpYWRpY09wZXJhbmRUcmFpdHM8Q2xlYW51cFJldHVybkluc3QsIC8qTUlOQVJJVFk9Ki8xPiB7fTsKKworREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKENsZWFudXBSZXR1cm5JbnN0LCBWYWx1ZSkKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5yZWFjaGFibGVJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vIFRoaXMgZnVuY3Rpb24gaGFzIHVuZGVmaW5lZCBiZWhhdmlvci4gIEluIHBhcnRpY3VsYXIsIHRoZQorLy8vIHByZXNlbmNlIG9mIHRoaXMgaW5zdHJ1Y3Rpb24gaW5kaWNhdGVzIHNvbWUgaGlnaGVyIGxldmVsIGtub3dsZWRnZSB0aGF0IHRoZQorLy8vIGVuZCBvZiB0aGUgYmxvY2sgY2Fubm90IGJlIHJlYWNoZWQuCisvLy8KK2NsYXNzIFVucmVhY2hhYmxlSW5zdCA6IHB1YmxpYyBUZXJtaW5hdG9ySW5zdCB7Citwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICBVbnJlYWNoYWJsZUluc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIGV4cGxpY2l0IFVucmVhY2hhYmxlSW5zdChMTFZNQ29udGV4dCAmQywgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIpOworICBleHBsaWNpdCBVbnJlYWNoYWJsZUluc3QoTExWTUNvbnRleHQgJkMsIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kKTsKKworICAvLyBhbGxvY2F0ZSBzcGFjZSBmb3IgZXhhY3RseSB6ZXJvIG9wZXJhbmRzCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgcykgeworICAgIHJldHVybiBVc2VyOjpvcGVyYXRvciBuZXcocywgMCk7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1TdWNjZXNzb3JzKCkgY29uc3QgeyByZXR1cm4gMDsgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlVucmVhY2hhYmxlOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorCitwcml2YXRlOgorICBmcmllbmQgVGVybWluYXRvckluc3Q7CisKKyAgQmFzaWNCbG9jayAqZ2V0U3VjY2Vzc29yKHVuc2lnbmVkIGlkeCkgY29uc3QgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlVucmVhY2hhYmxlSW5zdCBoYXMgbm8gc3VjY2Vzc29ycyEiKTsKKyAgfQorCisgIHZvaWQgc2V0U3VjY2Vzc29yKHVuc2lnbmVkIGlkeCwgQmFzaWNCbG9jayAqQikgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlVucmVhY2hhYmxlSW5zdCBoYXMgbm8gc3VjY2Vzc29ycyEiKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJ1bmNJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgdHJ1bmNhdGlvbiBvZiBpbnRlZ2VyIHR5cGVzLgorY2xhc3MgVHJ1bmNJbnN0IDogcHVibGljIENhc3RJbnN0IHsKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIC8vLyBDbG9uZSBhbiBpZGVudGljYWwgVHJ1bmNJbnN0CisgIFRydW5jSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MKKyAgVHJ1bmNJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIHRydW5jYXRlZAorICAgIFR5cGUgKlR5LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIChzbWFsbGVyKSB0eXBlIHRvIHRydW5jYXRlIHRvCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwgICAgICAgICAgLy8vPCBBIG5hbWUgZm9yIHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0ciAvLy88IFdoZXJlIHRvIGluc2VydCB0aGUgbmV3IGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWF0LWVuZC1vZi1ibG9jayBzZW1hbnRpY3MKKyAgVHJ1bmNJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIHRydW5jYXRlZAorICAgIFR5cGUgKlR5LCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIChzbWFsbGVyKSB0eXBlIHRvIHRydW5jYXRlIHRvCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsICAgICAgICAgLy8vPCBBIG5hbWUgZm9yIHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCAgICAgICAvLy88IFRoZSBibG9jayB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uIGludG8KKyAgKTsKKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBUcnVuYzsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFpFeHRJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIHplcm8gZXh0ZW5zaW9uIG9mIGludGVnZXIgdHlwZXMuCitjbGFzcyBaRXh0SW5zdCA6IHB1YmxpYyBDYXN0SW5zdCB7Citwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICAvLy8gQ2xvbmUgYW4gaWRlbnRpY2FsIFpFeHRJbnN0CisgIFpFeHRJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYmVmb3JlLWluc3RydWN0aW9uIHNlbWFudGljcworICBaRXh0SW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSB6ZXJvIGV4dGVuZGVkCisgICAgVHlwZSAqVHksICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byB6ZXJvIGV4dGVuZCB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsICAgICAgICAgIC8vLzwgQSBuYW1lIGZvciB0aGUgbmV3IGluc3RydWN0aW9uCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIgLy8vPCBXaGVyZSB0byBpbnNlcnQgdGhlIG5ldyBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1hdC1lbmQgc2VtYW50aWNzLgorICBaRXh0SW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSB6ZXJvIGV4dGVuZGVkCisgICAgVHlwZSAqVHksICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byB6ZXJvIGV4dGVuZCB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCAgICAgICAgIC8vLzwgQSBuYW1lIGZvciB0aGUgbmV3IGluc3RydWN0aW9uCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgICAgICAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gWkV4dDsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNFeHRJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgc2lnbiBleHRlbnNpb24gb2YgaW50ZWdlciB0eXBlcy4KK2NsYXNzIFNFeHRJbnN0IDogcHVibGljIENhc3RJbnN0IHsKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIC8vLyBDbG9uZSBhbiBpZGVudGljYWwgU0V4dEluc3QKKyAgU0V4dEluc3QgKmNsb25lSW1wbCgpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1iZWZvcmUtaW5zdHJ1Y3Rpb24gc2VtYW50aWNzCisgIFNFeHRJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIHNpZ24gZXh0ZW5kZWQKKyAgICBUeXBlICpUeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHNpZ24gZXh0ZW5kIHRvCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwgICAgICAgICAgLy8vPCBBIG5hbWUgZm9yIHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0ciAvLy88IFdoZXJlIHRvIGluc2VydCB0aGUgbmV3IGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWF0LWVuZC1vZi1ibG9jayBzZW1hbnRpY3MKKyAgU0V4dEluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgc2lnbiBleHRlbmRlZAorICAgIFR5cGUgKlR5LCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gc2lnbiBleHRlbmQgdG8KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciwgICAgICAgICAvLy88IEEgbmFtZSBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbgorICAgIEJhc2ljQmxvY2sgKkluc2VydEF0RW5kICAgICAgIC8vLzwgVGhlIGJsb2NrIHRvIGluc2VydCB0aGUgaW5zdHJ1Y3Rpb24gaW50bworICApOworCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IFNFeHQ7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGUFRydW5jSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHRydW5jYXRpb24gb2YgZmxvYXRpbmcgcG9pbnQgdHlwZXMuCitjbGFzcyBGUFRydW5jSW5zdCA6IHB1YmxpYyBDYXN0SW5zdCB7Citwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICAvLy8gQ2xvbmUgYW4gaWRlbnRpY2FsIEZQVHJ1bmNJbnN0CisgIEZQVHJ1bmNJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYmVmb3JlLWluc3RydWN0aW9uIHNlbWFudGljcworICBGUFRydW5jSW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSB0cnVuY2F0ZWQKKyAgICBUeXBlICpUeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIHRydW5jYXRlIHRvCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwgICAgICAgICAgLy8vPCBBIG5hbWUgZm9yIHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0ciAvLy88IFdoZXJlIHRvIGluc2VydCB0aGUgbmV3IGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MKKyAgRlBUcnVuY0luc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgdHJ1bmNhdGVkCisgICAgVHlwZSAqVHksICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byB0cnVuY2F0ZSB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCAgICAgICAgIC8vLzwgQSBuYW1lIGZvciB0aGUgbmV3IGluc3RydWN0aW9uCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgICAgICAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gRlBUcnVuYzsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQRXh0SW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbiBleHRlbnNpb24gb2YgZmxvYXRpbmcgcG9pbnQgdHlwZXMuCitjbGFzcyBGUEV4dEluc3QgOiBwdWJsaWMgQ2FzdEluc3QgeworcHJvdGVjdGVkOgorICAvLyBOb3RlOiBJbnN0cnVjdGlvbiBuZWVkcyB0byBiZSBhIGZyaWVuZCBoZXJlIHRvIGNhbGwgY2xvbmVJbXBsLgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgLy8vIENsb25lIGFuIGlkZW50aWNhbCBGUEV4dEluc3QKKyAgRlBFeHRJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYmVmb3JlLWluc3RydWN0aW9uIHNlbWFudGljcworICBGUEV4dEluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgZXh0ZW5kZWQKKyAgICBUeXBlICpUeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIGV4dGVuZCB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsICAgICAgICAgIC8vLzwgQSBuYW1lIGZvciB0aGUgbmV3IGluc3RydWN0aW9uCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIgLy8vPCBXaGVyZSB0byBpbnNlcnQgdGhlIG5ldyBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1hdC1lbmQtb2YtYmxvY2sgc2VtYW50aWNzCisgIEZQRXh0SW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBleHRlbmRlZAorICAgIFR5cGUgKlR5LCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gZXh0ZW5kIHRvCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsICAgICAgICAgLy8vPCBBIG5hbWUgZm9yIHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCAgICAgICAvLy88IFRoZSBibG9jayB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uIGludG8KKyAgKTsKKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBGUEV4dDsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJVG9GUEluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBjYXN0IHVuc2lnbmVkIGludGVnZXIgdG8gZmxvYXRpbmcgcG9pbnQuCitjbGFzcyBVSVRvRlBJbnN0IDogcHVibGljIENhc3RJbnN0IHsKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIC8vLyBDbG9uZSBhbiBpZGVudGljYWwgVUlUb0ZQSW5zdAorICBVSVRvRlBJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYmVmb3JlLWluc3RydWN0aW9uIHNlbWFudGljcworICBVSVRvRlBJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAgIFR5cGUgKlR5LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gY29udmVydCB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsICAgICAgICAgIC8vLzwgQSBuYW1lIGZvciB0aGUgbmV3IGluc3RydWN0aW9uCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIgLy8vPCBXaGVyZSB0byBpbnNlcnQgdGhlIG5ldyBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1hdC1lbmQtb2YtYmxvY2sgc2VtYW50aWNzCisgIFVJVG9GUEluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICAgVHlwZSAqVHksICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byBjb252ZXJ0IHRvCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsICAgICAgICAgLy8vPCBBIG5hbWUgZm9yIHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCAgICAgICAvLy88IFRoZSBibG9jayB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uIGludG8KKyAgKTsKKworICAvLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBVSVRvRlA7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSVRvRlBJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgY2FzdCBmcm9tIHNpZ25lZCBpbnRlZ2VyIHRvIGZsb2F0aW5nIHBvaW50LgorY2xhc3MgU0lUb0ZQSW5zdCA6IHB1YmxpYyBDYXN0SW5zdCB7Citwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICAvLy8gQ2xvbmUgYW4gaWRlbnRpY2FsIFNJVG9GUEluc3QKKyAgU0lUb0ZQSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MKKyAgU0lUb0ZQSW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAgICBUeXBlICpUeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIGNvbnZlcnQgdG8KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLCAgICAgICAgICAvLy88IEEgbmFtZSBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbgorICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyIC8vLzwgV2hlcmUgdG8gaW5zZXJ0IHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgKTsKKworICAvLy8gQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYXQtZW5kLW9mLWJsb2NrIHNlbWFudGljcworICBTSVRvRlBJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAgIFR5cGUgKlR5LCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gY29udmVydCB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCAgICAgICAgIC8vLzwgQSBuYW1lIGZvciB0aGUgbmV3IGluc3RydWN0aW9uCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgICAgICAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gU0lUb0ZQOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRlBUb1VJSW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNhc3QgZnJvbSBmbG9hdGluZyBwb2ludCB0byB1bnNpZ25lZCBpbnRlZ2VyCitjbGFzcyBGUFRvVUlJbnN0ICA6IHB1YmxpYyBDYXN0SW5zdCB7Citwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICAvLy8gQ2xvbmUgYW4gaWRlbnRpY2FsIEZQVG9VSUluc3QKKyAgRlBUb1VJSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MKKyAgRlBUb1VJSW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAgICBUeXBlICpUeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIGNvbnZlcnQgdG8KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLCAgICAgICAgICAvLy88IEEgbmFtZSBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbgorICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyIC8vLzwgV2hlcmUgdG8gaW5zZXJ0IHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgKTsKKworICAvLy8gQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYXQtZW5kLW9mLWJsb2NrIHNlbWFudGljcworICBGUFRvVUlJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAgIFR5cGUgKlR5LCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gY29udmVydCB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCAgICAgICAgIC8vLzwgQSBuYW1lIGZvciB0aGUgbmV3IGluc3RydWN0aW9uCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgICAgICAgLy8vPCBXaGVyZSB0byBpbnNlcnQgdGhlIG5ldyBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEZQVG9VSTsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQVG9TSUluc3QgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBjYXN0IGZyb20gZmxvYXRpbmcgcG9pbnQgdG8gc2lnbmVkIGludGVnZXIuCitjbGFzcyBGUFRvU0lJbnN0ICA6IHB1YmxpYyBDYXN0SW5zdCB7Citwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICAvLy8gQ2xvbmUgYW4gaWRlbnRpY2FsIEZQVG9TSUluc3QKKyAgRlBUb1NJSW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MKKyAgRlBUb1NJSW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAgICBUeXBlICpUeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIGNvbnZlcnQgdG8KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLCAgICAgICAgICAvLy88IEEgbmFtZSBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbgorICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyIC8vLzwgV2hlcmUgdG8gaW5zZXJ0IHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgKTsKKworICAvLy8gQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYXQtZW5kLW9mLWJsb2NrIHNlbWFudGljcworICBGUFRvU0lJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAgIFR5cGUgKlR5LCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gY29udmVydCB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCAgICAgICAgIC8vLzwgQSBuYW1lIGZvciB0aGUgbmV3IGluc3RydWN0aW9uCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgICAgICAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gRlBUb1NJOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50VG9QdHJJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgY2FzdCBmcm9tIGFuIGludGVnZXIgdG8gYSBwb2ludGVyLgorY2xhc3MgSW50VG9QdHJJbnN0IDogcHVibGljIENhc3RJbnN0IHsKK3B1YmxpYzoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIC8vLyBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1iZWZvcmUtaW5zdHJ1Y3Rpb24gc2VtYW50aWNzCisgIEludFRvUHRySW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjb252ZXJ0ZWQKKyAgICBUeXBlICpUeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIGNvbnZlcnQgdG8KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLCAgICAgICAgICAvLy88IEEgbmFtZSBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbgorICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyIC8vLzwgV2hlcmUgdG8gaW5zZXJ0IHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgKTsKKworICAvLy8gQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYXQtZW5kLW9mLWJsb2NrIHNlbWFudGljcworICBJbnRUb1B0ckluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICAgVHlwZSAqVHksICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byBjb252ZXJ0IHRvCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsICAgICAgICAgLy8vPCBBIG5hbWUgZm9yIHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCAgICAgICAvLy88IFRoZSBibG9jayB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uIGludG8KKyAgKTsKKworICAvLy8gQ2xvbmUgYW4gaWRlbnRpY2FsIEludFRvUHRySW5zdC4KKyAgSW50VG9QdHJJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGlzIGluc3RydWN0aW9uJ3MgcG9pbnRlciB0eXBlLgorICB1bnNpZ25lZCBnZXRBZGRyZXNzU3BhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFR5cGUoKS0+Z2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpOworICB9CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBJbnRUb1B0cjsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB0clRvSW50SW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNhc3QgZnJvbSBhIHBvaW50ZXIgdG8gYW4gaW50ZWdlci4KK2NsYXNzIFB0clRvSW50SW5zdCA6IHB1YmxpYyBDYXN0SW5zdCB7Citwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICAvLy8gQ2xvbmUgYW4gaWRlbnRpY2FsIFB0clRvSW50SW5zdC4KKyAgUHRyVG9JbnRJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYmVmb3JlLWluc3RydWN0aW9uIHNlbWFudGljcworICBQdHJUb0ludEluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY29udmVydGVkCisgICAgVHlwZSAqVHksICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byBjb252ZXJ0IHRvCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIgPSAiIiwgICAgICAgICAgLy8vPCBBIG5hbWUgZm9yIHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0QmVmb3JlID0gbnVsbHB0ciAvLy88IFdoZXJlIHRvIGluc2VydCB0aGUgbmV3IGluc3RydWN0aW9uCisgICk7CisKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWF0LWVuZC1vZi1ibG9jayBzZW1hbnRpY3MKKyAgUHRyVG9JbnRJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNvbnZlcnRlZAorICAgIFR5cGUgKlR5LCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gY29udmVydCB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCAgICAgICAgIC8vLzwgQSBuYW1lIGZvciB0aGUgbmV3IGluc3RydWN0aW9uCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgICAgICAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8vIEdldHMgdGhlIHBvaW50ZXIgb3BlcmFuZC4KKyAgVmFsdWUgKmdldFBvaW50ZXJPcGVyYW5kKCkgeyByZXR1cm4gZ2V0T3BlcmFuZCgwKTsgfQorICAvLy8gR2V0cyB0aGUgcG9pbnRlciBvcGVyYW5kLgorICBjb25zdCBWYWx1ZSAqZ2V0UG9pbnRlck9wZXJhbmQoKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kKDApOyB9CisgIC8vLyBHZXRzIHRoZSBvcGVyYW5kIGluZGV4IG9mIHRoZSBwb2ludGVyIG9wZXJhbmQuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRQb2ludGVyT3BlcmFuZEluZGV4KCkgeyByZXR1cm4gMFU7IH0KKworICAvLy8gUmV0dXJucyB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgcG9pbnRlciBvcGVyYW5kLgorICB1bnNpZ25lZCBnZXRQb2ludGVyQWRkcmVzc1NwYWNlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQb2ludGVyT3BlcmFuZCgpLT5nZXRUeXBlKCktPmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKTsKKyAgfQorCisgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gUHRyVG9JbnQ7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJpdENhc3RJbnN0IENsYXNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgbm8tb3AgY2FzdCBmcm9tIG9uZSB0eXBlIHRvIGFub3RoZXIuCitjbGFzcyBCaXRDYXN0SW5zdCA6IHB1YmxpYyBDYXN0SW5zdCB7Citwcm90ZWN0ZWQ6CisgIC8vIE5vdGU6IEluc3RydWN0aW9uIG5lZWRzIHRvIGJlIGEgZnJpZW5kIGhlcmUgdG8gY2FsbCBjbG9uZUltcGwuCisgIGZyaWVuZCBjbGFzcyBJbnN0cnVjdGlvbjsKKworICAvLy8gQ2xvbmUgYW4gaWRlbnRpY2FsIEJpdENhc3RJbnN0LgorICBCaXRDYXN0SW5zdCAqY2xvbmVJbXBsKCkgY29uc3Q7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdG9yIHdpdGggaW5zZXJ0LWJlZm9yZS1pbnN0cnVjdGlvbiBzZW1hbnRpY3MKKyAgQml0Q2FzdEluc3QoCisgICAgVmFsdWUgKlMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdmFsdWUgdG8gYmUgY2FzdGVkCisgICAgVHlwZSAqVHksICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgdHlwZSB0byBjYXN0ZWQgdG8KKyAgICBjb25zdCBUd2luZSAmTmFtZVN0ciA9ICIiLCAgICAgICAgICAvLy88IEEgbmFtZSBmb3IgdGhlIG5ldyBpbnN0cnVjdGlvbgorICAgIEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUgPSBudWxscHRyIC8vLzwgV2hlcmUgdG8gaW5zZXJ0IHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgKTsKKworICAvLy8gQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYXQtZW5kLW9mLWJsb2NrIHNlbWFudGljcworICBCaXRDYXN0SW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjYXN0ZWQKKyAgICBUeXBlICpUeSwgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIGNhc3RlZCB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyLCAgICAgICAgIC8vLzwgQSBuYW1lIGZvciB0aGUgbmV3IGluc3RydWN0aW9uCisgICAgQmFzaWNCbG9jayAqSW5zZXJ0QXRFbmQgICAgICAgLy8vPCBUaGUgYmxvY2sgdG8gaW5zZXJ0IHRoZSBpbnN0cnVjdGlvbiBpbnRvCisgICk7CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBJLT5nZXRPcGNvZGUoKSA9PSBCaXRDYXN0OworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyU3BhY2VDYXN0SW5zdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIGNvbnZlcnNpb24gYmV0d2VlbiBwb2ludGVycyBmcm9tIG9uZSBhZGRyZXNzIHNwYWNlCisvLy8gdG8gYW5vdGhlci4KK2NsYXNzIEFkZHJTcGFjZUNhc3RJbnN0IDogcHVibGljIENhc3RJbnN0IHsKK3Byb3RlY3RlZDoKKyAgLy8gTm90ZTogSW5zdHJ1Y3Rpb24gbmVlZHMgdG8gYmUgYSBmcmllbmQgaGVyZSB0byBjYWxsIGNsb25lSW1wbC4KKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworCisgIC8vLyBDbG9uZSBhbiBpZGVudGljYWwgQWRkclNwYWNlQ2FzdEluc3QuCisgIEFkZHJTcGFjZUNhc3RJbnN0ICpjbG9uZUltcGwoKSBjb25zdDsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0b3Igd2l0aCBpbnNlcnQtYmVmb3JlLWluc3RydWN0aW9uIHNlbWFudGljcworICBBZGRyU3BhY2VDYXN0SW5zdCgKKyAgICBWYWx1ZSAqUywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB2YWx1ZSB0byBiZSBjYXN0ZWQKKyAgICBUeXBlICpUeSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IFRoZSB0eXBlIHRvIGNhc3RlZCB0bworICAgIGNvbnN0IFR3aW5lICZOYW1lU3RyID0gIiIsICAgICAgICAgIC8vLzwgQSBuYW1lIGZvciB0aGUgbmV3IGluc3RydWN0aW9uCisgICAgSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSA9IG51bGxwdHIgLy8vPCBXaGVyZSB0byBpbnNlcnQgdGhlIG5ldyBpbnN0cnVjdGlvbgorICApOworCisgIC8vLyBDb25zdHJ1Y3RvciB3aXRoIGluc2VydC1hdC1lbmQtb2YtYmxvY2sgc2VtYW50aWNzCisgIEFkZHJTcGFjZUNhc3RJbnN0KAorICAgIFZhbHVlICpTLCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHZhbHVlIHRvIGJlIGNhc3RlZAorICAgIFR5cGUgKlR5LCAgICAgICAgICAgICAgICAgICAgIC8vLzwgVGhlIHR5cGUgdG8gY2FzdGVkIHRvCisgICAgY29uc3QgVHdpbmUgJk5hbWVTdHIsICAgICAgICAgLy8vPCBBIG5hbWUgZm9yIHRoZSBuZXcgaW5zdHJ1Y3Rpb24KKyAgICBCYXNpY0Jsb2NrICpJbnNlcnRBdEVuZCAgICAgICAvLy88IFRoZSBibG9jayB0byBpbnNlcnQgdGhlIGluc3RydWN0aW9uIGludG8KKyAgKTsKKworICAvLyBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IEFkZHJTcGFjZUNhc3Q7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpOworICB9CisKKyAgLy8vIEdldHMgdGhlIHBvaW50ZXIgb3BlcmFuZC4KKyAgVmFsdWUgKmdldFBvaW50ZXJPcGVyYW5kKCkgeworICAgIHJldHVybiBnZXRPcGVyYW5kKDApOworICB9CisKKyAgLy8vIEdldHMgdGhlIHBvaW50ZXIgb3BlcmFuZC4KKyAgY29uc3QgVmFsdWUgKmdldFBvaW50ZXJPcGVyYW5kKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGVyYW5kKDApOworICB9CisKKyAgLy8vIEdldHMgdGhlIG9wZXJhbmQgaW5kZXggb2YgdGhlIHBvaW50ZXIgb3BlcmFuZC4KKyAgc3RhdGljIHVuc2lnbmVkIGdldFBvaW50ZXJPcGVyYW5kSW5kZXgoKSB7CisgICAgcmV0dXJuIDBVOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlIHBvaW50ZXIgb3BlcmFuZC4KKyAgdW5zaWduZWQgZ2V0U3JjQWRkcmVzc1NwYWNlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQb2ludGVyT3BlcmFuZCgpLT5nZXRUeXBlKCktPmdldFBvaW50ZXJBZGRyZXNzU3BhY2UoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBhZGRyZXNzIHNwYWNlIG9mIHRoZSByZXN1bHQuCisgIHVuc2lnbmVkIGdldERlc3RBZGRyZXNzU3BhY2UoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFR5cGUoKS0+Z2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpOworICB9Cit9OworCisvLy8gQSBoZWxwZXIgZnVuY3Rpb24gdGhhdCByZXR1cm5zIHRoZSBwb2ludGVyIG9wZXJhbmQgb2YgYSBsb2FkIG9yIHN0b3JlCisvLy8gaW5zdHJ1Y3Rpb24uIFJldHVybnMgbnVsbHB0ciBpZiBub3QgbG9hZCBvciBzdG9yZS4KK2lubGluZSBWYWx1ZSAqZ2V0TG9hZFN0b3JlUG9pbnRlck9wZXJhbmQoVmFsdWUgKlYpIHsKKyAgaWYgKGF1dG8gKkxvYWQgPSBkeW5fY2FzdDxMb2FkSW5zdD4oVikpCisgICAgcmV0dXJuIExvYWQtPmdldFBvaW50ZXJPcGVyYW5kKCk7CisgIGlmIChhdXRvICpTdG9yZSA9IGR5bl9jYXN0PFN0b3JlSW5zdD4oVikpCisgICAgcmV0dXJuIFN0b3JlLT5nZXRQb2ludGVyT3BlcmFuZCgpOworICByZXR1cm4gbnVsbHB0cjsKK30KKworLy8vIEEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgcG9pbnRlciBvcGVyYW5kIG9mIGEgbG9hZCwgc3RvcmUKKy8vLyBvciBHRVAgaW5zdHJ1Y3Rpb24uIFJldHVybnMgbnVsbHB0ciBpZiBub3QgbG9hZCwgc3RvcmUsIG9yIEdFUC4KK2lubGluZSBWYWx1ZSAqZ2V0UG9pbnRlck9wZXJhbmQoVmFsdWUgKlYpIHsKKyAgaWYgKGF1dG8gKlB0ciA9IGdldExvYWRTdG9yZVBvaW50ZXJPcGVyYW5kKFYpKQorICAgIHJldHVybiBQdHI7CisgIGlmIChhdXRvICpHZXAgPSBkeW5fY2FzdDxHZXRFbGVtZW50UHRySW5zdD4oVikpCisgICAgcmV0dXJuIEdlcC0+Z2V0UG9pbnRlck9wZXJhbmQoKTsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX0lOU1RSVUNUSU9OU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY0luc3QuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljSW5zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZDQyOGMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY0luc3QuaApAQCAtMCwwICsxLDgxNSBAQAorLy89PT0tLSBsbHZtL0ludHJpbnNpY0luc3QuaCAtIEludHJpbnNpYyBJbnN0cnVjdGlvbiBXcmFwcGVycyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBjbGFzc2VzIHRoYXQgbWFrZSBpdCByZWFsbHkgZWFzeSB0byBkZWFsIHdpdGggaW50cmluc2ljCisvLyBmdW5jdGlvbnMgd2l0aCB0aGUgaXNhL2R5bmNhc3QgZmFtaWx5IG9mIGZ1bmN0aW9ucy4gIEluIHBhcnRpY3VsYXIsIHRoaXMKKy8vIGFsbG93cyB5b3UgdG8gZG8gdGhpbmdzIGxpa2U6CisvLworLy8gICAgIGlmIChNZW1DcHlJbnN0ICpNQ0kgPSBkeW5fY2FzdDxNZW1DcHlJbnN0PihJbnN0KSkKKy8vICAgICAgICAuLi4gTUNJLT5nZXREZXN0KCkgLi4uIE1DSS0+Z2V0U291cmNlKCkgLi4uCisvLworLy8gQWxsIGludHJpbnNpYyBmdW5jdGlvbiBjYWxscyBhcmUgaW5zdGFuY2VzIG9mIHRoZSBjYWxsIGluc3RydWN0aW9uLCBzbyB0aGVzZQorLy8gYXJlIGFsbCBzdWJjbGFzc2VzIG9mIHRoZSBDYWxsSW5zdCBjbGFzcy4gIE5vdGUgdGhhdCBub25lIG9mIHRoZXNlIGNsYXNzZXMKKy8vIGhhcyBzdGF0ZSBvciB2aXJ0dWFsIG1ldGhvZHMsIHdoaWNoIGlzIGFuIGltcG9ydGFudCBwYXJ0IG9mIHRoaXMgZ3Jvc3MvbmVhdAorLy8gaGFjayB3b3JraW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9JTlRSSU5TSUNJTlNUX0gKKyNkZWZpbmUgTExWTV9JUl9JTlRSSU5TSUNJTlNUX0gKKworI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EZXJpdmVkVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9HbG9iYWxWYXJpYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9NZXRhZGF0YS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCisgIC8vLyBBIHdyYXBwZXIgY2xhc3MgZm9yIGluc3BlY3RpbmcgY2FsbHMgdG8gaW50cmluc2ljIGZ1bmN0aW9ucy4KKyAgLy8vIFRoaXMgYWxsb3dzIHRoZSBzdGFuZGFyZCBpc2EvZHluY2FzdC9jYXN0IGZ1bmN0aW9uYWxpdHkgdG8gd29yayB3aXRoIGNhbGxzCisgIC8vLyB0byBpbnRyaW5zaWMgZnVuY3Rpb25zLgorICBjbGFzcyBJbnRyaW5zaWNJbnN0IDogcHVibGljIENhbGxJbnN0IHsKKyAgcHVibGljOgorICAgIEludHJpbnNpY0luc3QoKSA9IGRlbGV0ZTsKKyAgICBJbnRyaW5zaWNJbnN0KGNvbnN0IEludHJpbnNpY0luc3QgJikgPSBkZWxldGU7CisgICAgSW50cmluc2ljSW5zdCAmb3BlcmF0b3I9KGNvbnN0IEludHJpbnNpY0luc3QgJikgPSBkZWxldGU7CisKKyAgICAvLy8gUmV0dXJuIHRoZSBpbnRyaW5zaWMgSUQgb2YgdGhpcyBpbnRyaW5zaWMuCisgICAgSW50cmluc2ljOjpJRCBnZXRJbnRyaW5zaWNJRCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRDYWxsZWRGdW5jdGlvbigpLT5nZXRJbnRyaW5zaWNJRCgpOworICAgIH0KKworICAgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBDYWxsSW5zdCAqSSkgeworICAgICAgaWYgKGNvbnN0IEZ1bmN0aW9uICpDRiA9IEktPmdldENhbGxlZEZ1bmN0aW9uKCkpCisgICAgICAgIHJldHVybiBDRi0+aXNJbnRyaW5zaWMoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxDYWxsSW5zdD4oVikgJiYgY2xhc3NvZihjYXN0PENhbGxJbnN0PihWKSk7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIGlzIHRoZSBjb21tb24gYmFzZSBjbGFzcyBmb3IgZGVidWcgaW5mbyBpbnRyaW5zaWNzLgorICBjbGFzcyBEYmdJbmZvSW50cmluc2ljIDogcHVibGljIEludHJpbnNpY0luc3QgeworICBwdWJsaWM6CisgICAgLy8vIEdldCB0aGUgbG9jYXRpb24gY29ycmVzcG9uZGluZyB0byB0aGUgdmFyaWFibGUgcmVmZXJlbmNlZCBieSB0aGUgZGVidWcKKyAgICAvLy8gaW5mbyBpbnRyaW5zaWMuICBEZXBlbmRpbmcgb24gdGhlIGludHJpbnNpYywgdGhpcyBjb3VsZCBiZSB0aGUKKyAgICAvLy8gdmFyaWFibGUncyB2YWx1ZSBvciBpdHMgYWRkcmVzcy4KKyAgICBWYWx1ZSAqZ2V0VmFyaWFibGVMb2NhdGlvbihib29sIEFsbG93TnVsbE9wID0gdHJ1ZSkgY29uc3Q7CisKKyAgICAvLy8gRG9lcyB0aGlzIGRlc2NyaWJlIHRoZSBhZGRyZXNzIG9mIGEgbG9jYWwgdmFyaWFibGUuIFRydWUgZm9yIGRiZy5hZGRyCisgICAgLy8vIGFuZCBkYmcuZGVjbGFyZSwgYnV0IG5vdCBkYmcudmFsdWUsIHdoaWNoIGRlc2NyaWJlcyBpdHMgdmFsdWUuCisgICAgYm9vbCBpc0FkZHJlc3NPZlZhcmlhYmxlKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldEludHJpbnNpY0lEKCkgIT0gSW50cmluc2ljOjpkYmdfdmFsdWU7CisgICAgfQorCisgICAgRElMb2NhbFZhcmlhYmxlICpnZXRWYXJpYWJsZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjYXN0PERJTG9jYWxWYXJpYWJsZT4oZ2V0UmF3VmFyaWFibGUoKSk7CisgICAgfQorCisgICAgRElFeHByZXNzaW9uICpnZXRFeHByZXNzaW9uKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNhc3Q8RElFeHByZXNzaW9uPihnZXRSYXdFeHByZXNzaW9uKCkpOworICAgIH0KKworICAgIE1ldGFkYXRhICpnZXRSYXdWYXJpYWJsZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjYXN0PE1ldGFkYXRhQXNWYWx1ZT4oZ2V0QXJnT3BlcmFuZCgxKSktPmdldE1ldGFkYXRhKCk7CisgICAgfQorCisgICAgTWV0YWRhdGEgKmdldFJhd0V4cHJlc3Npb24oKSBjb25zdCB7CisgICAgICByZXR1cm4gY2FzdDxNZXRhZGF0YUFzVmFsdWU+KGdldEFyZ09wZXJhbmQoMikpLT5nZXRNZXRhZGF0YSgpOworICAgIH0KKworICAgIC8vLyBcbmFtZSBDYXN0aW5nIG1ldGhvZHMKKyAgICAvLy8gQHsKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHN3aXRjaCAoSS0+Z2V0SW50cmluc2ljSUQoKSkgeworICAgICAgY2FzZSBJbnRyaW5zaWM6OmRiZ19kZWNsYXJlOgorICAgICAgY2FzZSBJbnRyaW5zaWM6OmRiZ192YWx1ZToKKyAgICAgIGNhc2UgSW50cmluc2ljOjpkYmdfYWRkcjoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICAgIHJldHVybiBpc2E8SW50cmluc2ljSW5zdD4oVikgJiYgY2xhc3NvZihjYXN0PEludHJpbnNpY0luc3Q+KFYpKTsKKyAgICB9CisgICAgLy8vIEB9CisgIH07CisKKyAgLy8vIFRoaXMgcmVwcmVzZW50cyB0aGUgbGx2bS5kYmcuZGVjbGFyZSBpbnN0cnVjdGlvbi4KKyAgY2xhc3MgRGJnRGVjbGFyZUluc3QgOiBwdWJsaWMgRGJnSW5mb0ludHJpbnNpYyB7CisgIHB1YmxpYzoKKyAgICBWYWx1ZSAqZ2V0QWRkcmVzcygpIGNvbnN0IHsgcmV0dXJuIGdldFZhcmlhYmxlTG9jYXRpb24oKTsgfQorCisgICAgLy8vIFxuYW1lIENhc3RpbmcgbWV0aG9kcworICAgIC8vLyBAeworICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW50cmluc2ljSW5zdCAqSSkgeworICAgICAgcmV0dXJuIEktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjpkYmdfZGVjbGFyZTsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICAgIH0KKyAgICAvLy8gQH0KKyAgfTsKKworICAvLy8gVGhpcyByZXByZXNlbnRzIHRoZSBsbHZtLmRiZy5hZGRyIGluc3RydWN0aW9uLgorICBjbGFzcyBEYmdBZGRySW50cmluc2ljIDogcHVibGljIERiZ0luZm9JbnRyaW5zaWMgeworICBwdWJsaWM6CisgICAgVmFsdWUgKmdldEFkZHJlc3MoKSBjb25zdCB7IHJldHVybiBnZXRWYXJpYWJsZUxvY2F0aW9uKCk7IH0KKworICAgIC8vLyBcbmFtZSBDYXN0aW5nIG1ldGhvZHMKKyAgICAvLy8gQHsKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHJldHVybiBJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6ZGJnX2FkZHI7CisgICAgfQorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICAgIHJldHVybiBpc2E8SW50cmluc2ljSW5zdD4oVikgJiYgY2xhc3NvZihjYXN0PEludHJpbnNpY0luc3Q+KFYpKTsKKyAgICB9CisgIH07CisKKyAgLy8vIFRoaXMgcmVwcmVzZW50cyB0aGUgbGx2bS5kYmcudmFsdWUgaW5zdHJ1Y3Rpb24uCisgIGNsYXNzIERiZ1ZhbHVlSW5zdCA6IHB1YmxpYyBEYmdJbmZvSW50cmluc2ljIHsKKyAgcHVibGljOgorICAgIFZhbHVlICpnZXRWYWx1ZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRWYXJpYWJsZUxvY2F0aW9uKC8qIEFsbG93TnVsbE9wID0gKi8gZmFsc2UpOworICAgIH0KKworICAgIC8vLyBcbmFtZSBDYXN0aW5nIG1ldGhvZHMKKyAgICAvLy8gQHsKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHJldHVybiBJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6ZGJnX3ZhbHVlOworICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorICAgIC8vLyBAfQorICB9OworCisgIC8vLyBUaGlzIGlzIHRoZSBjb21tb24gYmFzZSBjbGFzcyBmb3IgY29uc3RyYWluZWQgZmxvYXRpbmcgcG9pbnQgaW50cmluc2ljcy4KKyAgY2xhc3MgQ29uc3RyYWluZWRGUEludHJpbnNpYyA6IHB1YmxpYyBJbnRyaW5zaWNJbnN0IHsKKyAgcHVibGljOgorICAgIGVudW0gUm91bmRpbmdNb2RlIHsKKyAgICAgIHJtSW52YWxpZCwKKyAgICAgIHJtRHluYW1pYywKKyAgICAgIHJtVG9OZWFyZXN0LAorICAgICAgcm1Eb3dud2FyZCwKKyAgICAgIHJtVXB3YXJkLAorICAgICAgcm1Ub3dhcmRaZXJvCisgICAgfTsKKworICAgIGVudW0gRXhjZXB0aW9uQmVoYXZpb3IgeworICAgICAgZWJJbnZhbGlkLAorICAgICAgZWJJZ25vcmUsCisgICAgICBlYk1heVRyYXAsCisgICAgICBlYlN0cmljdAorICAgIH07CisKKyAgICBib29sIGlzVW5hcnlPcCgpIGNvbnN0OworICAgIGJvb2wgaXNUZXJuYXJ5T3AoKSBjb25zdDsKKyAgICBSb3VuZGluZ01vZGUgZ2V0Um91bmRpbmdNb2RlKCkgY29uc3Q7CisgICAgRXhjZXB0aW9uQmVoYXZpb3IgZ2V0RXhjZXB0aW9uQmVoYXZpb3IoKSBjb25zdDsKKworICAgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgICBzd2l0Y2ggKEktPmdldEludHJpbnNpY0lEKCkpIHsKKyAgICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfY29uc3RyYWluZWRfZmFkZDoKKyAgICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfY29uc3RyYWluZWRfZnN1YjoKKyAgICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfY29uc3RyYWluZWRfZm11bDoKKyAgICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfY29uc3RyYWluZWRfZmRpdjoKKyAgICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfY29uc3RyYWluZWRfZnJlbToKKyAgICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfY29uc3RyYWluZWRfZm1hOgorICAgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9zcXJ0OgorICAgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9wb3c6CisgICAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX3Bvd2k6CisgICAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX3NpbjoKKyAgICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfY29uc3RyYWluZWRfY29zOgorICAgICAgY2FzZSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9leHA6CisgICAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2V4cDI6CisgICAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2xvZzoKKyAgICAgIGNhc2UgSW50cmluc2ljOjpleHBlcmltZW50YWxfY29uc3RyYWluZWRfbG9nMTA6CisgICAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2xvZzI6CisgICAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX3JpbnQ6CisgICAgICBjYXNlIEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX25lYXJieWludDoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICAgIHJldHVybiBpc2E8SW50cmluc2ljSW5zdD4oVikgJiYgY2xhc3NvZihjYXN0PEludHJpbnNpY0luc3Q+KFYpKTsKKyAgICB9CisgIH07CisKKyAgLy8vIENvbW1vbiBiYXNlIGNsYXNzIGZvciBhbGwgbWVtb3J5IGludHJpbnNpY3MuIFNpbXBseSBwcm92aWRlcworICAvLy8gY29tbW9uIG1ldGhvZHMuCisgIC8vLyBXcml0dGVuIGFzIENSVFAgdG8gYXZvaWQgYSBjb21tb24gYmFzZSBjbGFzcyBhbW9uZ3N0IHRoZQorICAvLy8gdGhyZWUgYXRvbWljaXR5IGhpZXJhcmNoaWVzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVyaXZlZD4gY2xhc3MgTWVtSW50cmluc2ljQmFzZSA6IHB1YmxpYyBJbnRyaW5zaWNJbnN0IHsKKyAgcHJpdmF0ZToKKyAgICBlbnVtIHsgQVJHX0RFU1QgPSAwLCBBUkdfTEVOR1RIID0gMiB9OworCisgIHB1YmxpYzoKKyAgICBWYWx1ZSAqZ2V0UmF3RGVzdCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjb25zdF9jYXN0PFZhbHVlICo+KGdldEFyZ09wZXJhbmQoQVJHX0RFU1QpKTsKKyAgICB9CisgICAgY29uc3QgVXNlICZnZXRSYXdEZXN0VXNlKCkgY29uc3QgeyByZXR1cm4gZ2V0QXJnT3BlcmFuZFVzZShBUkdfREVTVCk7IH0KKyAgICBVc2UgJmdldFJhd0Rlc3RVc2UoKSB7IHJldHVybiBnZXRBcmdPcGVyYW5kVXNlKEFSR19ERVNUKTsgfQorCisgICAgVmFsdWUgKmdldExlbmd0aCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjb25zdF9jYXN0PFZhbHVlICo+KGdldEFyZ09wZXJhbmQoQVJHX0xFTkdUSCkpOworICAgIH0KKyAgICBjb25zdCBVc2UgJmdldExlbmd0aFVzZSgpIGNvbnN0IHsgcmV0dXJuIGdldEFyZ09wZXJhbmRVc2UoQVJHX0xFTkdUSCk7IH0KKyAgICBVc2UgJmdldExlbmd0aFVzZSgpIHsgcmV0dXJuIGdldEFyZ09wZXJhbmRVc2UoQVJHX0xFTkdUSCk7IH0KKworICAgIC8vLyBUaGlzIGlzIGp1c3QgbGlrZSBnZXRSYXdEZXN0LCBidXQgaXQgc3RyaXBzIG9mZiBhbnkgY2FzdAorICAgIC8vLyBpbnN0cnVjdGlvbnMgKGluY2x1ZGluZyBhZGRyc3BhY2VjYXN0KSB0aGF0IGZlZWQgaXQsIGdpdmluZyB0aGUKKyAgICAvLy8gb3JpZ2luYWwgaW5wdXQuICBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSBhIHBvaW50ZXIuCisgICAgVmFsdWUgKmdldERlc3QoKSBjb25zdCB7IHJldHVybiBnZXRSYXdEZXN0KCktPnN0cmlwUG9pbnRlckNhc3RzKCk7IH0KKworICAgIHVuc2lnbmVkIGdldERlc3RBZGRyZXNzU3BhY2UoKSBjb25zdCB7CisgICAgICByZXR1cm4gY2FzdDxQb2ludGVyVHlwZT4oZ2V0UmF3RGVzdCgpLT5nZXRUeXBlKCkpLT5nZXRBZGRyZXNzU3BhY2UoKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBnZXREZXN0QWxpZ25tZW50KCkgY29uc3QgeyByZXR1cm4gZ2V0UGFyYW1BbGlnbm1lbnQoQVJHX0RFU1QpOyB9CisKKyAgICAvLy8gU2V0IHRoZSBzcGVjaWZpZWQgYXJndW1lbnRzIG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgICB2b2lkIHNldERlc3QoVmFsdWUgKlB0cikgeworICAgICAgYXNzZXJ0KGdldFJhd0Rlc3QoKS0+Z2V0VHlwZSgpID09IFB0ci0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICAgInNldERlc3QgY2FsbGVkIHdpdGggcG9pbnRlciBvZiB3cm9uZyB0eXBlISIpOworICAgICAgc2V0QXJnT3BlcmFuZChBUkdfREVTVCwgUHRyKTsKKyAgICB9CisKKyAgICB2b2lkIHNldERlc3RBbGlnbm1lbnQodW5zaWduZWQgQWxpZ24pIHsKKyAgICAgIHJlbW92ZVBhcmFtQXR0cihBUkdfREVTVCwgQXR0cmlidXRlOjpBbGlnbm1lbnQpOworICAgICAgaWYgKEFsaWduID4gMCkKKyAgICAgICAgYWRkUGFyYW1BdHRyKEFSR19ERVNULAorICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlOjpnZXRXaXRoQWxpZ25tZW50KGdldENvbnRleHQoKSwgQWxpZ24pKTsKKyAgICB9CisKKyAgICB2b2lkIHNldExlbmd0aChWYWx1ZSAqTCkgeworICAgICAgYXNzZXJ0KGdldExlbmd0aCgpLT5nZXRUeXBlKCkgPT0gTC0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICAgInNldExlbmd0aCBjYWxsZWQgd2l0aCB2YWx1ZSBvZiB3cm9uZyB0eXBlISIpOworICAgICAgc2V0QXJnT3BlcmFuZChBUkdfTEVOR1RILCBMKTsKKyAgICB9CisgIH07CisKKyAgLy8gVGhlIGNvbW1vbiBiYXNlIGNsYXNzIGZvciB0aGUgYXRvbWljIG1lbXNldC9tZW1tb3ZlL21lbWNweSBpbnRyaW5zaWNzCisgIC8vIGkuZS4gbGx2bS5lbGVtZW50LnVub3JkZXJlZC5hdG9taWMubWVtc2V0L21lbWNweS9tZW1tb3ZlCisgIGNsYXNzIEF0b21pY01lbUludHJpbnNpYyA6IHB1YmxpYyBNZW1JbnRyaW5zaWNCYXNlPEF0b21pY01lbUludHJpbnNpYz4geworICBwcml2YXRlOgorICAgIGVudW0geyBBUkdfRUxFTUVOVFNJWkUgPSAzIH07CisKKyAgcHVibGljOgorICAgIFZhbHVlICpnZXRSYXdFbGVtZW50U2l6ZUluQnl0ZXMoKSBjb25zdCB7CisgICAgICByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSAqPihnZXRBcmdPcGVyYW5kKEFSR19FTEVNRU5UU0laRSkpOworICAgIH0KKworICAgIENvbnN0YW50SW50ICpnZXRFbGVtZW50U2l6ZUluQnl0ZXNDc3QoKSBjb25zdCB7CisgICAgICByZXR1cm4gY2FzdDxDb25zdGFudEludD4oZ2V0UmF3RWxlbWVudFNpemVJbkJ5dGVzKCkpOworICAgIH0KKworICAgIHVpbnQzMl90IGdldEVsZW1lbnRTaXplSW5CeXRlcygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRFbGVtZW50U2l6ZUluQnl0ZXNDc3QoKS0+Z2V0WkV4dFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBzZXRFbGVtZW50U2l6ZUluQnl0ZXMoQ29uc3RhbnQgKlYpIHsKKyAgICAgIGFzc2VydChWLT5nZXRUeXBlKCkgPT0gVHlwZTo6Z2V0SW50OFR5KGdldENvbnRleHQoKSkgJiYKKyAgICAgICAgICAgICAic2V0RWxlbWVudFNpemVJbkJ5dGVzIGNhbGxlZCB3aXRoIHZhbHVlIG9mIHdyb25nIHR5cGUhIik7CisgICAgICBzZXRBcmdPcGVyYW5kKEFSR19FTEVNRU5UU0laRSwgVik7CisgICAgfQorCisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgICBzd2l0Y2ggKEktPmdldEludHJpbnNpY0lEKCkpIHsKKyAgICAgIGNhc2UgSW50cmluc2ljOjptZW1jcHlfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljOgorICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbW1vdmVfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljOgorICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbXNldF9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWM6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYXRvbWljIG1lbXNldCBpbnRyaW5zaWMKKyAgLy8gaS5lLiBsbHZtLmVsZW1lbnQudW5vcmRlcmVkLmF0b21pYy5tZW1zZXQKKyAgY2xhc3MgQXRvbWljTWVtU2V0SW5zdCA6IHB1YmxpYyBBdG9taWNNZW1JbnRyaW5zaWMgeworICBwcml2YXRlOgorICAgIGVudW0geyBBUkdfVkFMVUUgPSAxIH07CisKKyAgcHVibGljOgorICAgIFZhbHVlICpnZXRWYWx1ZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjb25zdF9jYXN0PFZhbHVlICo+KGdldEFyZ09wZXJhbmQoQVJHX1ZBTFVFKSk7CisgICAgfQorICAgIGNvbnN0IFVzZSAmZ2V0VmFsdWVVc2UoKSBjb25zdCB7IHJldHVybiBnZXRBcmdPcGVyYW5kVXNlKEFSR19WQUxVRSk7IH0KKyAgICBVc2UgJmdldFZhbHVlVXNlKCkgeyByZXR1cm4gZ2V0QXJnT3BlcmFuZFVzZShBUkdfVkFMVUUpOyB9CisKKyAgICB2b2lkIHNldFZhbHVlKFZhbHVlICpWYWwpIHsKKyAgICAgIGFzc2VydChnZXRWYWx1ZSgpLT5nZXRUeXBlKCkgPT0gVmFsLT5nZXRUeXBlKCkgJiYKKyAgICAgICAgICAgICAic2V0VmFsdWUgY2FsbGVkIHdpdGggdmFsdWUgb2Ygd3JvbmcgdHlwZSEiKTsKKyAgICAgIHNldEFyZ09wZXJhbmQoQVJHX1ZBTFVFLCBWYWwpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW50cmluc2ljSW5zdCAqSSkgeworICAgICAgcmV0dXJuIEktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjptZW1zZXRfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljOworICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorICB9OworCisgIC8vIFRoaXMgY2xhc3Mgd3JhcHMgdGhlIGF0b21pYyBtZW1jcHkvbWVtbW92ZSBpbnRyaW5zaWNzCisgIC8vIGkuZS4gbGx2bS5lbGVtZW50LnVub3JkZXJlZC5hdG9taWMubWVtY3B5L21lbW1vdmUKKyAgY2xhc3MgQXRvbWljTWVtVHJhbnNmZXJJbnN0IDogcHVibGljIEF0b21pY01lbUludHJpbnNpYyB7CisgIHByaXZhdGU6CisgICAgZW51bSB7IEFSR19TT1VSQ0UgPSAxIH07CisKKyAgcHVibGljOgorICAgIC8vLyBSZXR1cm4gdGhlIGFyZ3VtZW50cyB0byB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgVmFsdWUgKmdldFJhd1NvdXJjZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjb25zdF9jYXN0PFZhbHVlICo+KGdldEFyZ09wZXJhbmQoQVJHX1NPVVJDRSkpOworICAgIH0KKyAgICBjb25zdCBVc2UgJmdldFJhd1NvdXJjZVVzZSgpIGNvbnN0IHsgcmV0dXJuIGdldEFyZ09wZXJhbmRVc2UoQVJHX1NPVVJDRSk7IH0KKyAgICBVc2UgJmdldFJhd1NvdXJjZVVzZSgpIHsgcmV0dXJuIGdldEFyZ09wZXJhbmRVc2UoQVJHX1NPVVJDRSk7IH0KKworICAgIC8vLyBUaGlzIGlzIGp1c3QgbGlrZSBnZXRSYXdTb3VyY2UsIGJ1dCBpdCBzdHJpcHMgb2ZmIGFueSBjYXN0CisgICAgLy8vIGluc3RydWN0aW9ucyB0aGF0IGZlZWQgaXQsIGdpdmluZyB0aGUgb3JpZ2luYWwgaW5wdXQuICBUaGUgcmV0dXJuZWQKKyAgICAvLy8gdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSBhIHBvaW50ZXIuCisgICAgVmFsdWUgKmdldFNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIGdldFJhd1NvdXJjZSgpLT5zdHJpcFBvaW50ZXJDYXN0cygpOyB9CisKKyAgICB1bnNpZ25lZCBnZXRTb3VyY2VBZGRyZXNzU3BhY2UoKSBjb25zdCB7CisgICAgICByZXR1cm4gY2FzdDxQb2ludGVyVHlwZT4oZ2V0UmF3U291cmNlKCktPmdldFR5cGUoKSktPmdldEFkZHJlc3NTcGFjZSgpOworICAgIH0KKworICAgIHVuc2lnbmVkIGdldFNvdXJjZUFsaWdubWVudCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRQYXJhbUFsaWdubWVudChBUkdfU09VUkNFKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFNvdXJjZShWYWx1ZSAqUHRyKSB7CisgICAgICBhc3NlcnQoZ2V0UmF3U291cmNlKCktPmdldFR5cGUoKSA9PSBQdHItPmdldFR5cGUoKSAmJgorICAgICAgICAgICAgICJzZXRTb3VyY2UgY2FsbGVkIHdpdGggcG9pbnRlciBvZiB3cm9uZyB0eXBlISIpOworICAgICAgc2V0QXJnT3BlcmFuZChBUkdfU09VUkNFLCBQdHIpOworICAgIH0KKworICAgIHZvaWQgc2V0U291cmNlQWxpZ25tZW50KHVuc2lnbmVkIEFsaWduKSB7CisgICAgICByZW1vdmVQYXJhbUF0dHIoQVJHX1NPVVJDRSwgQXR0cmlidXRlOjpBbGlnbm1lbnQpOworICAgICAgaWYgKEFsaWduID4gMCkKKyAgICAgICAgYWRkUGFyYW1BdHRyKEFSR19TT1VSQ0UsCisgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGU6OmdldFdpdGhBbGlnbm1lbnQoZ2V0Q29udGV4dCgpLCBBbGlnbikpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW50cmluc2ljSW5zdCAqSSkgeworICAgICAgc3dpdGNoIChJLT5nZXRJbnRyaW5zaWNJRCgpKSB7CisgICAgICBjYXNlIEludHJpbnNpYzo6bWVtY3B5X2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pYzoKKyAgICAgIGNhc2UgSW50cmluc2ljOjptZW1tb3ZlX2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pYzoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICAgIHJldHVybiBpc2E8SW50cmluc2ljSW5zdD4oVikgJiYgY2xhc3NvZihjYXN0PEludHJpbnNpY0luc3Q+KFYpKTsKKyAgICB9CisgIH07CisKKyAgLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyB0aGUgYXRvbWljIG1lbWNweSBpbnRyaW5zaWMKKyAgLy8vIGkuZS4gbGx2bS5lbGVtZW50LnVub3JkZXJlZC5hdG9taWMubWVtY3B5CisgIGNsYXNzIEF0b21pY01lbUNweUluc3QgOiBwdWJsaWMgQXRvbWljTWVtVHJhbnNmZXJJbnN0IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW50cmluc2ljSW5zdCAqSSkgeworICAgICAgcmV0dXJuIEktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjptZW1jcHlfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljOworICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgdGhlIGF0b21pYyBtZW1tb3ZlIGludHJpbnNpYworICAvLy8gaS5lLiBsbHZtLmVsZW1lbnQudW5vcmRlcmVkLmF0b21pYy5tZW1tb3ZlCisgIGNsYXNzIEF0b21pY01lbU1vdmVJbnN0IDogcHVibGljIEF0b21pY01lbVRyYW5zZmVySW5zdCB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHJldHVybiBJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6bWVtbW92ZV9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWM7CisgICAgfQorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICAgIHJldHVybiBpc2E8SW50cmluc2ljSW5zdD4oVikgJiYgY2xhc3NvZihjYXN0PEludHJpbnNpY0luc3Q+KFYpKTsKKyAgICB9CisgIH07CisKKyAgLy8vIFRoaXMgaXMgdGhlIGNvbW1vbiBiYXNlIGNsYXNzIGZvciBtZW1zZXQvbWVtY3B5L21lbW1vdmUuCisgIGNsYXNzIE1lbUludHJpbnNpYyA6IHB1YmxpYyBNZW1JbnRyaW5zaWNCYXNlPE1lbUludHJpbnNpYz4geworICBwcml2YXRlOgorICAgIGVudW0geyBBUkdfVk9MQVRJTEUgPSAzIH07CisKKyAgcHVibGljOgorICAgIENvbnN0YW50SW50ICpnZXRWb2xhdGlsZUNzdCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjYXN0PENvbnN0YW50SW50PigKKyAgICAgICAgICBjb25zdF9jYXN0PFZhbHVlICo+KGdldEFyZ09wZXJhbmQoQVJHX1ZPTEFUSUxFKSkpOworICAgIH0KKworICAgIGJvb2wgaXNWb2xhdGlsZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhZ2V0Vm9sYXRpbGVDc3QoKS0+aXNaZXJvKCk7CisgICAgfQorCisgICAgdm9pZCBzZXRWb2xhdGlsZShDb25zdGFudCAqVikgeyBzZXRBcmdPcGVyYW5kKEFSR19WT0xBVElMRSwgVik7IH0KKworICAgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgICBzd2l0Y2ggKEktPmdldEludHJpbnNpY0lEKCkpIHsKKyAgICAgIGNhc2UgSW50cmluc2ljOjptZW1jcHk6CisgICAgICBjYXNlIEludHJpbnNpYzo6bWVtbW92ZToKKyAgICAgIGNhc2UgSW50cmluc2ljOjptZW1zZXQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZGVmYXVsdDogcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIGNsYXNzIHdyYXBzIHRoZSBsbHZtLm1lbXNldCBpbnRyaW5zaWMuCisgIGNsYXNzIE1lbVNldEluc3QgOiBwdWJsaWMgTWVtSW50cmluc2ljIHsKKyAgcHVibGljOgorICAgIC8vLyBSZXR1cm4gdGhlIGFyZ3VtZW50cyB0byB0aGUgaW5zdHJ1Y3Rpb24uCisgICAgVmFsdWUgKmdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSo+KGdldEFyZ09wZXJhbmQoMSkpOyB9CisgICAgY29uc3QgVXNlICZnZXRWYWx1ZVVzZSgpIGNvbnN0IHsgcmV0dXJuIGdldEFyZ09wZXJhbmRVc2UoMSk7IH0KKyAgICBVc2UgJmdldFZhbHVlVXNlKCkgeyByZXR1cm4gZ2V0QXJnT3BlcmFuZFVzZSgxKTsgfQorCisgICAgdm9pZCBzZXRWYWx1ZShWYWx1ZSAqVmFsKSB7CisgICAgICBhc3NlcnQoZ2V0VmFsdWUoKS0+Z2V0VHlwZSgpID09IFZhbC0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICAgInNldFZhbHVlIGNhbGxlZCB3aXRoIHZhbHVlIG9mIHdyb25nIHR5cGUhIik7CisgICAgICBzZXRBcmdPcGVyYW5kKDEsIFZhbCk7CisgICAgfQorCisgICAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHJldHVybiBJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6bWVtc2V0OworICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIGNsYXNzIHdyYXBzIHRoZSBsbHZtLm1lbWNweS9tZW1tb3ZlIGludHJpbnNpY3MuCisgIGNsYXNzIE1lbVRyYW5zZmVySW5zdCA6IHB1YmxpYyBNZW1JbnRyaW5zaWMgeworICBwcml2YXRlOgorICAgIGVudW0geyBBUkdfU09VUkNFID0gMSB9OworCisgIHB1YmxpYzoKKyAgICAvLy8gUmV0dXJuIHRoZSBhcmd1bWVudHMgdG8gdGhlIGluc3RydWN0aW9uLgorICAgIFZhbHVlICpnZXRSYXdTb3VyY2UoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PFZhbHVlKj4oZ2V0QXJnT3BlcmFuZChBUkdfU09VUkNFKSk7IH0KKyAgICBjb25zdCBVc2UgJmdldFJhd1NvdXJjZVVzZSgpIGNvbnN0IHsgcmV0dXJuIGdldEFyZ09wZXJhbmRVc2UoQVJHX1NPVVJDRSk7IH0KKyAgICBVc2UgJmdldFJhd1NvdXJjZVVzZSgpIHsgcmV0dXJuIGdldEFyZ09wZXJhbmRVc2UoQVJHX1NPVVJDRSk7IH0KKworICAgIC8vLyBUaGlzIGlzIGp1c3QgbGlrZSBnZXRSYXdTb3VyY2UsIGJ1dCBpdCBzdHJpcHMgb2ZmIGFueSBjYXN0CisgICAgLy8vIGluc3RydWN0aW9ucyB0aGF0IGZlZWQgaXQsIGdpdmluZyB0aGUgb3JpZ2luYWwgaW5wdXQuICBUaGUgcmV0dXJuZWQKKyAgICAvLy8gdmFsdWUgaXMgZ3VhcmFudGVlZCB0byBiZSBhIHBvaW50ZXIuCisgICAgVmFsdWUgKmdldFNvdXJjZSgpIGNvbnN0IHsgcmV0dXJuIGdldFJhd1NvdXJjZSgpLT5zdHJpcFBvaW50ZXJDYXN0cygpOyB9CisKKyAgICB1bnNpZ25lZCBnZXRTb3VyY2VBZGRyZXNzU3BhY2UoKSBjb25zdCB7CisgICAgICByZXR1cm4gY2FzdDxQb2ludGVyVHlwZT4oZ2V0UmF3U291cmNlKCktPmdldFR5cGUoKSktPmdldEFkZHJlc3NTcGFjZSgpOworICAgIH0KKworICAgIHVuc2lnbmVkIGdldFNvdXJjZUFsaWdubWVudCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRQYXJhbUFsaWdubWVudChBUkdfU09VUkNFKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFNvdXJjZShWYWx1ZSAqUHRyKSB7CisgICAgICBhc3NlcnQoZ2V0UmF3U291cmNlKCktPmdldFR5cGUoKSA9PSBQdHItPmdldFR5cGUoKSAmJgorICAgICAgICAgICAgICJzZXRTb3VyY2UgY2FsbGVkIHdpdGggcG9pbnRlciBvZiB3cm9uZyB0eXBlISIpOworICAgICAgc2V0QXJnT3BlcmFuZChBUkdfU09VUkNFLCBQdHIpOworICAgIH0KKworICAgIHZvaWQgc2V0U291cmNlQWxpZ25tZW50KHVuc2lnbmVkIEFsaWduKSB7CisgICAgICByZW1vdmVQYXJhbUF0dHIoQVJHX1NPVVJDRSwgQXR0cmlidXRlOjpBbGlnbm1lbnQpOworICAgICAgaWYgKEFsaWduID4gMCkKKyAgICAgICAgYWRkUGFyYW1BdHRyKEFSR19TT1VSQ0UsCisgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGU6OmdldFdpdGhBbGlnbm1lbnQoZ2V0Q29udGV4dCgpLCBBbGlnbikpOworICAgIH0KKworICAgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgICByZXR1cm4gSS0+Z2V0SW50cmluc2ljSUQoKSA9PSBJbnRyaW5zaWM6Om1lbWNweSB8fAorICAgICAgICAgICAgIEktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjptZW1tb3ZlOworICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIGNsYXNzIHdyYXBzIHRoZSBsbHZtLm1lbWNweSBpbnRyaW5zaWMuCisgIGNsYXNzIE1lbUNweUluc3QgOiBwdWJsaWMgTWVtVHJhbnNmZXJJbnN0IHsKKyAgcHVibGljOgorICAgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgICByZXR1cm4gSS0+Z2V0SW50cmluc2ljSUQoKSA9PSBJbnRyaW5zaWM6Om1lbWNweTsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICAgIH0KKyAgfTsKKworICAvLy8gVGhpcyBjbGFzcyB3cmFwcyB0aGUgbGx2bS5tZW1tb3ZlIGludHJpbnNpYy4KKyAgY2xhc3MgTWVtTW92ZUluc3QgOiBwdWJsaWMgTWVtVHJhbnNmZXJJbnN0IHsKKyAgcHVibGljOgorICAgIC8vIE1ldGhvZHMgZm9yIHN1cHBvcnQgdHlwZSBpbnF1aXJ5IHRocm91Z2ggaXNhLCBjYXN0LCBhbmQgZHluX2Nhc3Q6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgICByZXR1cm4gSS0+Z2V0SW50cmluc2ljSUQoKSA9PSBJbnRyaW5zaWM6Om1lbW1vdmU7CisgICAgfQorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICAgIHJldHVybiBpc2E8SW50cmluc2ljSW5zdD4oVikgJiYgY2xhc3NvZihjYXN0PEludHJpbnNpY0luc3Q+KFYpKTsKKyAgICB9CisgIH07CisKKyAgLy8gVGhlIGNvbW1vbiBiYXNlIGNsYXNzIGZvciBhbnkgbWVtc2V0L21lbW1vdmUvbWVtY3B5IGludHJpbnNpY3M7CisgIC8vIHdoZXRoZXIgdGhleSBiZSBhdG9taWMgb3Igbm9uLWF0b21pYy4KKyAgLy8gaS5lLiBsbHZtLmVsZW1lbnQudW5vcmRlcmVkLmF0b21pYy5tZW1zZXQvbWVtY3B5L21lbW1vdmUKKyAgLy8gIGFuZCBsbHZtLm1lbXNldC9tZW1jcHkvbWVtbW92ZQorICBjbGFzcyBBbnlNZW1JbnRyaW5zaWMgOiBwdWJsaWMgTWVtSW50cmluc2ljQmFzZTxBbnlNZW1JbnRyaW5zaWM+IHsKKyAgcHVibGljOgorICAgIGJvb2wgaXNWb2xhdGlsZSgpIGNvbnN0IHsKKyAgICAgIC8vIE9ubHkgdGhlIG5vbi1hdG9taWMgaW50cmluc2ljcyBjYW4gYmUgdm9sYXRpbGUKKyAgICAgIGlmIChhdXRvICpNSSA9IGR5bl9jYXN0PE1lbUludHJpbnNpYz4odGhpcykpCisgICAgICAgIHJldHVybiBNSS0+aXNWb2xhdGlsZSgpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW50cmluc2ljSW5zdCAqSSkgeworICAgICAgc3dpdGNoIChJLT5nZXRJbnRyaW5zaWNJRCgpKSB7CisgICAgICBjYXNlIEludHJpbnNpYzo6bWVtY3B5OgorICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbW1vdmU6CisgICAgICBjYXNlIEludHJpbnNpYzo6bWVtc2V0OgorICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbWNweV9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWM6CisgICAgICBjYXNlIEludHJpbnNpYzo6bWVtbW92ZV9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWM6CisgICAgICBjYXNlIEludHJpbnNpYzo6bWVtc2V0X2VsZW1lbnRfdW5vcmRlcmVkX2F0b21pYzoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICAgIHJldHVybiBpc2E8SW50cmluc2ljSW5zdD4oVikgJiYgY2xhc3NvZihjYXN0PEludHJpbnNpY0luc3Q+KFYpKTsKKyAgICB9CisgIH07CisKKyAgLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhbnkgbWVtc2V0IGludHJpbnNpYworICAvLyBpLmUuIGxsdm0uZWxlbWVudC51bm9yZGVyZWQuYXRvbWljLm1lbXNldAorICAvLyBhbmQgIGxsdm0ubWVtc2V0CisgIGNsYXNzIEFueU1lbVNldEluc3QgOiBwdWJsaWMgQW55TWVtSW50cmluc2ljIHsKKyAgcHJpdmF0ZToKKyAgICBlbnVtIHsgQVJHX1ZBTFVFID0gMSB9OworCisgIHB1YmxpYzoKKyAgICBWYWx1ZSAqZ2V0VmFsdWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSAqPihnZXRBcmdPcGVyYW5kKEFSR19WQUxVRSkpOworICAgIH0KKyAgICBjb25zdCBVc2UgJmdldFZhbHVlVXNlKCkgY29uc3QgeyByZXR1cm4gZ2V0QXJnT3BlcmFuZFVzZShBUkdfVkFMVUUpOyB9CisgICAgVXNlICZnZXRWYWx1ZVVzZSgpIHsgcmV0dXJuIGdldEFyZ09wZXJhbmRVc2UoQVJHX1ZBTFVFKTsgfQorCisgICAgdm9pZCBzZXRWYWx1ZShWYWx1ZSAqVmFsKSB7CisgICAgICBhc3NlcnQoZ2V0VmFsdWUoKS0+Z2V0VHlwZSgpID09IFZhbC0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgICAgInNldFZhbHVlIGNhbGxlZCB3aXRoIHZhbHVlIG9mIHdyb25nIHR5cGUhIik7CisgICAgICBzZXRBcmdPcGVyYW5kKEFSR19WQUxVRSwgVmFsKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHN3aXRjaCAoSS0+Z2V0SW50cmluc2ljSUQoKSkgeworICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbXNldDoKKyAgICAgIGNhc2UgSW50cmluc2ljOjptZW1zZXRfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICAgIH0KKyAgfTsKKworICAvLyBUaGlzIGNsYXNzIHdyYXBzIGFueSBtZW1jcHkvbWVtbW92ZSBpbnRyaW5zaWNzCisgIC8vIGkuZS4gbGx2bS5lbGVtZW50LnVub3JkZXJlZC5hdG9taWMubWVtY3B5L21lbW1vdmUKKyAgLy8gYW5kICBsbHZtLm1lbWNweS9tZW1tb3ZlCisgIGNsYXNzIEFueU1lbVRyYW5zZmVySW5zdCA6IHB1YmxpYyBBbnlNZW1JbnRyaW5zaWMgeworICBwcml2YXRlOgorICAgIGVudW0geyBBUkdfU09VUkNFID0gMSB9OworCisgIHB1YmxpYzoKKyAgICAvLy8gUmV0dXJuIHRoZSBhcmd1bWVudHMgdG8gdGhlIGluc3RydWN0aW9uLgorICAgIFZhbHVlICpnZXRSYXdTb3VyY2UoKSBjb25zdCB7CisgICAgICByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSAqPihnZXRBcmdPcGVyYW5kKEFSR19TT1VSQ0UpKTsKKyAgICB9CisgICAgY29uc3QgVXNlICZnZXRSYXdTb3VyY2VVc2UoKSBjb25zdCB7IHJldHVybiBnZXRBcmdPcGVyYW5kVXNlKEFSR19TT1VSQ0UpOyB9CisgICAgVXNlICZnZXRSYXdTb3VyY2VVc2UoKSB7IHJldHVybiBnZXRBcmdPcGVyYW5kVXNlKEFSR19TT1VSQ0UpOyB9CisKKyAgICAvLy8gVGhpcyBpcyBqdXN0IGxpa2UgZ2V0UmF3U291cmNlLCBidXQgaXQgc3RyaXBzIG9mZiBhbnkgY2FzdAorICAgIC8vLyBpbnN0cnVjdGlvbnMgdGhhdCBmZWVkIGl0LCBnaXZpbmcgdGhlIG9yaWdpbmFsIGlucHV0LiAgVGhlIHJldHVybmVkCisgICAgLy8vIHZhbHVlIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBwb2ludGVyLgorICAgIFZhbHVlICpnZXRTb3VyY2UoKSBjb25zdCB7IHJldHVybiBnZXRSYXdTb3VyY2UoKS0+c3RyaXBQb2ludGVyQ2FzdHMoKTsgfQorCisgICAgdW5zaWduZWQgZ2V0U291cmNlQWRkcmVzc1NwYWNlKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNhc3Q8UG9pbnRlclR5cGU+KGdldFJhd1NvdXJjZSgpLT5nZXRUeXBlKCkpLT5nZXRBZGRyZXNzU3BhY2UoKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBnZXRTb3VyY2VBbGlnbm1lbnQoKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0UGFyYW1BbGlnbm1lbnQoQVJHX1NPVVJDRSk7CisgICAgfQorCisgICAgdm9pZCBzZXRTb3VyY2UoVmFsdWUgKlB0cikgeworICAgICAgYXNzZXJ0KGdldFJhd1NvdXJjZSgpLT5nZXRUeXBlKCkgPT0gUHRyLT5nZXRUeXBlKCkgJiYKKyAgICAgICAgICAgICAic2V0U291cmNlIGNhbGxlZCB3aXRoIHBvaW50ZXIgb2Ygd3JvbmcgdHlwZSEiKTsKKyAgICAgIHNldEFyZ09wZXJhbmQoQVJHX1NPVVJDRSwgUHRyKTsKKyAgICB9CisKKyAgICB2b2lkIHNldFNvdXJjZUFsaWdubWVudCh1bnNpZ25lZCBBbGlnbikgeworICAgICAgcmVtb3ZlUGFyYW1BdHRyKEFSR19TT1VSQ0UsIEF0dHJpYnV0ZTo6QWxpZ25tZW50KTsKKyAgICAgIGlmIChBbGlnbiA+IDApCisgICAgICAgIGFkZFBhcmFtQXR0cihBUkdfU09VUkNFLAorICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlOjpnZXRXaXRoQWxpZ25tZW50KGdldENvbnRleHQoKSwgQWxpZ24pKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHN3aXRjaCAoSS0+Z2V0SW50cmluc2ljSUQoKSkgeworICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbWNweToKKyAgICAgIGNhc2UgSW50cmluc2ljOjptZW1tb3ZlOgorICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbWNweV9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWM6CisgICAgICBjYXNlIEludHJpbnNpYzo6bWVtbW92ZV9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWM6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW55IG1lbWNweSBpbnRyaW5zaWMKKyAgLy8vIGkuZS4gbGx2bS5lbGVtZW50LnVub3JkZXJlZC5hdG9taWMubWVtY3B5CisgIC8vLyAgYW5kIGxsdm0ubWVtY3B5CisgIGNsYXNzIEFueU1lbUNweUluc3QgOiBwdWJsaWMgQW55TWVtVHJhbnNmZXJJbnN0IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW50cmluc2ljSW5zdCAqSSkgeworICAgICAgc3dpdGNoIChJLT5nZXRJbnRyaW5zaWNJRCgpKSB7CisgICAgICBjYXNlIEludHJpbnNpYzo6bWVtY3B5OgorICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbWNweV9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWM6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYW55IG1lbW1vdmUgaW50cmluc2ljCisgIC8vLyBpLmUuIGxsdm0uZWxlbWVudC51bm9yZGVyZWQuYXRvbWljLm1lbW1vdmUKKyAgLy8vICBhbmQgbGx2bS5tZW1tb3ZlCisgIGNsYXNzIEFueU1lbU1vdmVJbnN0IDogcHVibGljIEFueU1lbVRyYW5zZmVySW5zdCB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHN3aXRjaCAoSS0+Z2V0SW50cmluc2ljSUQoKSkgeworICAgICAgY2FzZSBJbnRyaW5zaWM6Om1lbW1vdmU6CisgICAgICBjYXNlIEludHJpbnNpYzo6bWVtbW92ZV9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWM6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIHJlcHJlc2VudHMgdGhlIGxsdm0udmFfc3RhcnQgaW50cmluc2ljLgorICBjbGFzcyBWQVN0YXJ0SW5zdCA6IHB1YmxpYyBJbnRyaW5zaWNJbnN0IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW50cmluc2ljSW5zdCAqSSkgeworICAgICAgcmV0dXJuIEktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjp2YXN0YXJ0OworICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorCisgICAgVmFsdWUgKmdldEFyZ0xpc3QoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PFZhbHVlKj4oZ2V0QXJnT3BlcmFuZCgwKSk7IH0KKyAgfTsKKworICAvLy8gVGhpcyByZXByZXNlbnRzIHRoZSBsbHZtLnZhX2VuZCBpbnRyaW5zaWMuCisgIGNsYXNzIFZBRW5kSW5zdCA6IHB1YmxpYyBJbnRyaW5zaWNJbnN0IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW50cmluc2ljSW5zdCAqSSkgeworICAgICAgcmV0dXJuIEktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjp2YWVuZDsKKyAgICB9CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgICAgcmV0dXJuIGlzYTxJbnRyaW5zaWNJbnN0PihWKSAmJiBjbGFzc29mKGNhc3Q8SW50cmluc2ljSW5zdD4oVikpOworICAgIH0KKworICAgIFZhbHVlICpnZXRBcmdMaXN0KCkgY29uc3QgeyByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSo+KGdldEFyZ09wZXJhbmQoMCkpOyB9CisgIH07CisKKyAgLy8vIFRoaXMgcmVwcmVzZW50cyB0aGUgbGx2bS52YV9jb3B5IGludHJpbnNpYy4KKyAgY2xhc3MgVkFDb3B5SW5zdCA6IHB1YmxpYyBJbnRyaW5zaWNJbnN0IHsKKyAgcHVibGljOgorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW50cmluc2ljSW5zdCAqSSkgeworICAgICAgcmV0dXJuIEktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjp2YWNvcHk7CisgICAgfQorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICAgIHJldHVybiBpc2E8SW50cmluc2ljSW5zdD4oVikgJiYgY2xhc3NvZihjYXN0PEludHJpbnNpY0luc3Q+KFYpKTsKKyAgICB9CisKKyAgICBWYWx1ZSAqZ2V0RGVzdCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUqPihnZXRBcmdPcGVyYW5kKDApKTsgfQorICAgIFZhbHVlICpnZXRTcmMoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PFZhbHVlKj4oZ2V0QXJnT3BlcmFuZCgxKSk7IH0KKyAgfTsKKworICAvLy8gVGhpcyByZXByZXNlbnRzIHRoZSBsbHZtLmluc3RycHJvZl9pbmNyZW1lbnQgaW50cmluc2ljLgorICBjbGFzcyBJbnN0clByb2ZJbmNyZW1lbnRJbnN0IDogcHVibGljIEludHJpbnNpY0luc3QgeworICBwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgICByZXR1cm4gSS0+Z2V0SW50cmluc2ljSUQoKSA9PSBJbnRyaW5zaWM6Omluc3RycHJvZl9pbmNyZW1lbnQ7CisgICAgfQorICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICAgIHJldHVybiBpc2E8SW50cmluc2ljSW5zdD4oVikgJiYgY2xhc3NvZihjYXN0PEludHJpbnNpY0luc3Q+KFYpKTsKKyAgICB9CisKKyAgICBHbG9iYWxWYXJpYWJsZSAqZ2V0TmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjYXN0PEdsb2JhbFZhcmlhYmxlPigKKyAgICAgICAgICBjb25zdF9jYXN0PFZhbHVlICo+KGdldEFyZ09wZXJhbmQoMCkpLT5zdHJpcFBvaW50ZXJDYXN0cygpKTsKKyAgICB9CisKKyAgICBDb25zdGFudEludCAqZ2V0SGFzaCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBjYXN0PENvbnN0YW50SW50Pihjb25zdF9jYXN0PFZhbHVlICo+KGdldEFyZ09wZXJhbmQoMSkpKTsKKyAgICB9CisKKyAgICBDb25zdGFudEludCAqZ2V0TnVtQ291bnRlcnMoKSBjb25zdCB7CisgICAgICByZXR1cm4gY2FzdDxDb25zdGFudEludD4oY29uc3RfY2FzdDxWYWx1ZSAqPihnZXRBcmdPcGVyYW5kKDIpKSk7CisgICAgfQorCisgICAgQ29uc3RhbnRJbnQgKmdldEluZGV4KCkgY29uc3QgeworICAgICAgcmV0dXJuIGNhc3Q8Q29uc3RhbnRJbnQ+KGNvbnN0X2Nhc3Q8VmFsdWUgKj4oZ2V0QXJnT3BlcmFuZCgzKSkpOworICAgIH0KKworICAgIFZhbHVlICpnZXRTdGVwKCkgY29uc3Q7CisgIH07CisKKyAgY2xhc3MgSW5zdHJQcm9mSW5jcmVtZW50SW5zdFN0ZXAgOiBwdWJsaWMgSW5zdHJQcm9mSW5jcmVtZW50SW5zdCB7CisgIHB1YmxpYzoKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICAgIHJldHVybiBJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6aW5zdHJwcm9mX2luY3JlbWVudF9zdGVwOworICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorICB9OworCisgIC8vLyBUaGlzIHJlcHJlc2VudHMgdGhlIGxsdm0uaW5zdHJwcm9mX3ZhbHVlX3Byb2ZpbGUgaW50cmluc2ljLgorICBjbGFzcyBJbnN0clByb2ZWYWx1ZVByb2ZpbGVJbnN0IDogcHVibGljIEludHJpbnNpY0luc3QgeworICBwdWJsaWM6CisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgICByZXR1cm4gSS0+Z2V0SW50cmluc2ljSUQoKSA9PSBJbnRyaW5zaWM6Omluc3RycHJvZl92YWx1ZV9wcm9maWxlOworICAgIH0KKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgICAgfQorCisgICAgR2xvYmFsVmFyaWFibGUgKmdldE5hbWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gY2FzdDxHbG9iYWxWYXJpYWJsZT4oCisgICAgICAgICAgY29uc3RfY2FzdDxWYWx1ZSAqPihnZXRBcmdPcGVyYW5kKDApKS0+c3RyaXBQb2ludGVyQ2FzdHMoKSk7CisgICAgfQorCisgICAgQ29uc3RhbnRJbnQgKmdldEhhc2goKSBjb25zdCB7CisgICAgICByZXR1cm4gY2FzdDxDb25zdGFudEludD4oY29uc3RfY2FzdDxWYWx1ZSAqPihnZXRBcmdPcGVyYW5kKDEpKSk7CisgICAgfQorCisgICAgVmFsdWUgKmdldFRhcmdldFZhbHVlKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNhc3Q8VmFsdWU+KGNvbnN0X2Nhc3Q8VmFsdWUgKj4oZ2V0QXJnT3BlcmFuZCgyKSkpOworICAgIH0KKworICAgIENvbnN0YW50SW50ICpnZXRWYWx1ZUtpbmQoKSBjb25zdCB7CisgICAgICByZXR1cm4gY2FzdDxDb25zdGFudEludD4oY29uc3RfY2FzdDxWYWx1ZSAqPihnZXRBcmdPcGVyYW5kKDMpKSk7CisgICAgfQorCisgICAgLy8gUmV0dXJucyB0aGUgdmFsdWUgc2l0ZSBpbmRleC4KKyAgICBDb25zdGFudEludCAqZ2V0SW5kZXgoKSBjb25zdCB7CisgICAgICByZXR1cm4gY2FzdDxDb25zdGFudEludD4oY29uc3RfY2FzdDxWYWx1ZSAqPihnZXRBcmdPcGVyYW5kKDQpKSk7CisgICAgfQorICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9JTlRSSU5TSUNJTlNUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljcy5nZW4gYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3MuZ2VuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc5MTlmMDcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3MuZ2VuCkBAIC0wLDAgKzEsMzYxNjkgQEAKKy8qPT09LSBUYWJsZUdlbidlcmF0ZWQgZmlsZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PSpcCit8KiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogSW50cmluc2ljIEZ1bmN0aW9uIFNvdXJjZSBGcmFnbWVudCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK3wqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICp8Cit8KiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBmaWxlLCBkbyBub3QgZWRpdCEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqfAorfCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnwKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKy8vIFZpc3VhbFN0dWRpbyBkZWZpbmVzIHNldGptcCBhcyBfc2V0am1wCisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgZGVmaW5lZChzZXRqbXApICYmIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAhZGVmaW5lZChzZXRqbXBfdW5kZWZpbmVkX2Zvcl9tc3ZjKQorIyAgcHJhZ21hIHB1c2hfbWFjcm8oInNldGptcCIpCisjICB1bmRlZiBzZXRqbXAKKyMgIGRlZmluZSBzZXRqbXBfdW5kZWZpbmVkX2Zvcl9tc3ZjCisjZW5kaWYKKworLy8gRW51bSB2YWx1ZXMgZm9yIEludHJpbnNpY3MuaAorI2lmZGVmIEdFVF9JTlRSSU5TSUNfRU5VTV9WQUxVRVMKKyAgICBhZGRyZXNzb2ZyZXR1cm5hZGRyZXNzLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hZGRyZXNzb2ZyZXR1cm5hZGRyZXNzCisgICAgYWRqdXN0X3RyYW1wb2xpbmUsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWRqdXN0LnRyYW1wb2xpbmUKKyAgICBhbm5vdGF0aW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbm5vdGF0aW9uCisgICAgYXNzdW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXNzdW1lCisgICAgYml0cmV2ZXJzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYml0cmV2ZXJzZQorICAgIGJzd2FwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmJzd2FwCisgICAgY2Fub25pY2FsaXplLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uY2Fub25pY2FsaXplCisgICAgY2VpbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uY2VpbAorICAgIGNsZWFyX2NhY2hlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmNsZWFyX2NhY2hlCisgICAgY29kZXZpZXdfYW5ub3RhdGlvbiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uY29kZXZpZXcuYW5ub3RhdGlvbgorICAgIGNvbnZlcnRfZnJvbV9mcDE2LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmNvbnZlcnQuZnJvbS5mcDE2CisgICAgY29udmVydF90b19mcDE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uY29udmVydC50by5mcDE2CisgICAgY29weXNpZ24sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uY29weXNpZ24KKyAgICBjb3JvX2FsbG9jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5jb3JvLmFsbG9jCisgICAgY29yb19iZWdpbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uY29yby5iZWdpbgorICAgIGNvcm9fZGVzdHJveSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmNvcm8uZGVzdHJveQorICAgIGNvcm9fZG9uZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmNvcm8uZG9uZQorICAgIGNvcm9fZW5kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmNvcm8uZW5kCisgICAgY29yb19mcmFtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uY29yby5mcmFtZQorICAgIGNvcm9fZnJlZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmNvcm8uZnJlZQorICAgIGNvcm9faWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmNvcm8uaWQKKyAgICBjb3JvX3BhcmFtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5jb3JvLnBhcmFtCisgICAgY29yb19wcm9taXNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uY29yby5wcm9taXNlCisgICAgY29yb19yZXN1bWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uY29yby5yZXN1bWUKKyAgICBjb3JvX3NhdmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5jb3JvLnNhdmUKKyAgICBjb3JvX3NpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5jb3JvLnNpemUKKyAgICBjb3JvX3N1YmZuX2FkZHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5jb3JvLnN1YmZuLmFkZHIKKyAgICBjb3JvX3N1c3BlbmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5jb3JvLnN1c3BlbmQKKyAgICBjb3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5jb3MKKyAgICBjdGx6LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5jdGx6CisgICAgY3Rwb3AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uY3Rwb3AKKyAgICBjdHR6LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5jdHR6CisgICAgZGJnX2FkZHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZGJnLmFkZHIKKyAgICBkYmdfZGVjbGFyZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5kYmcuZGVjbGFyZQorICAgIGRiZ192YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmRiZy52YWx1ZQorICAgIGRlYnVndHJhcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmRlYnVndHJhcAorICAgIGRvbm90aGluZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmRvbm90aGluZworICAgIGVoX2R3YXJmX2NmYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmVoLmR3YXJmLmNmYQorICAgIGVoX2V4Y2VwdGlvbmNvZGUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmVoLmV4Y2VwdGlvbmNvZGUKKyAgICBlaF9leGNlcHRpb25wb2ludGVyLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5laC5leGNlcHRpb25wb2ludGVyCisgICAgZWhfcmV0dXJuX2kzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZWgucmV0dXJuLmkzMgorICAgIGVoX3JldHVybl9pNjQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmVoLnJldHVybi5pNjQKKyAgICBlaF9zamxqX2NhbGxzaXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5laC5zamxqLmNhbGxzaXRlCisgICAgZWhfc2psal9mdW5jdGlvbmNvbnRleHQsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZWguc2psai5mdW5jdGlvbmNvbnRleHQKKyAgICBlaF9zamxqX2xvbmdqbXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5laC5zamxqLmxvbmdqbXAKKyAgICBlaF9zamxqX2xzZGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5laC5zamxqLmxzZGEKKyAgICBlaF9zamxqX3NldGptcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5laC5zamxqLnNldGptcAorICAgIGVoX3NqbGpfc2V0dXBfZGlzcGF0Y2gsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmVoLnNqbGouc2V0dXAuZGlzcGF0Y2gKKyAgICBlaF90eXBlaWRfZm9yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5laC50eXBlaWQuZm9yCisgICAgZWhfdW53aW5kX2luaXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZWgudW53aW5kLmluaXQKKyAgICBleHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5leHAKKyAgICBleHAyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5leHAyCisgICAgZXhwZWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZXhwZWN0CisgICAgZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2NvcywgICAgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmNvcworICAgIGV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9leHAsICAgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5leHAKKyAgICBleHBlcmltZW50YWxfY29uc3RyYWluZWRfZXhwMiwgICAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuZXhwMgorICAgIGV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9mYWRkLCAgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5mYWRkCisgICAgZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2ZkaXYsICAgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmZkaXYKKyAgICBleHBlcmltZW50YWxfY29uc3RyYWluZWRfZm1hLCAgICAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuZm1hCisgICAgZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2ZtdWwsICAgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmZtdWwKKyAgICBleHBlcmltZW50YWxfY29uc3RyYWluZWRfZnJlbSwgICAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuZnJlbQorICAgIGV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9mc3ViLCAgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5mc3ViCisgICAgZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2xvZywgICAgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmxvZworICAgIGV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9sb2cxMCwgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5sb2cxMAorICAgIGV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9sb2cyLCAgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5sb2cyCisgICAgZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX25lYXJieWludCwgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLm5lYXJieWludAorICAgIGV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9wb3csICAgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5wb3cKKyAgICBleHBlcmltZW50YWxfY29uc3RyYWluZWRfcG93aSwgICAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQucG93aQorICAgIGV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9yaW50LCAgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5yaW50CisgICAgZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX3NpbiwgICAgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLnNpbgorICAgIGV4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9zcXJ0LCAgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5zcXJ0CisgICAgZXhwZXJpbWVudGFsX2Rlb3B0aW1pemUsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLmRlb3B0aW1pemUKKyAgICBleHBlcmltZW50YWxfZ2NfcmVsb2NhdGUsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwuZ2MucmVsb2NhdGUKKyAgICBleHBlcmltZW50YWxfZ2NfcmVzdWx0LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwuZ2MucmVzdWx0CisgICAgZXhwZXJpbWVudGFsX2djX3N0YXRlcG9pbnQsICAgICAgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLmdjLnN0YXRlcG9pbnQKKyAgICBleHBlcmltZW50YWxfZ3VhcmQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwuZ3VhcmQKKyAgICBleHBlcmltZW50YWxfcGF0Y2hwb2ludF9pNjQsICAgICAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwucGF0Y2hwb2ludC5pNjQKKyAgICBleHBlcmltZW50YWxfcGF0Y2hwb2ludF92b2lkLCAgICAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwucGF0Y2hwb2ludC52b2lkCisgICAgZXhwZXJpbWVudGFsX3N0YWNrbWFwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLnN0YWNrbWFwCisgICAgZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfYWRkLCAgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UuYWRkCisgICAgZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfYW5kLCAgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UuYW5kCisgICAgZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfZmFkZCwgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UuZmFkZAorICAgIGV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX2ZtYXgsICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLmZtYXgKKyAgICBleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9mbWluLCAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5mbWluCisgICAgZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfZm11bCwgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UuZm11bAorICAgIGV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX211bCwgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLm11bAorICAgIGV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX29yLCAgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLm9yCisgICAgZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2Vfc21heCwgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2Uuc21heAorICAgIGV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX3NtaW4sICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLnNtaW4KKyAgICBleHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV91bWF4LCAgICAgICAgICAgLy8gbGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS51bWF4CisgICAgZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfdW1pbiwgICAgICAgICAgIC8vIGxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UudW1pbgorICAgIGV4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX3hvciwgICAgICAgICAgICAvLyBsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLnhvcgorICAgIGZhYnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmZhYnMKKyAgICBmbG9vciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5mbG9vcgorICAgIGZsdF9yb3VuZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmZsdC5yb3VuZHMKKyAgICBmbWEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5mbWEKKyAgICBmbXVsYWRkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5mbXVsYWRkCisgICAgZnJhbWVhZGRyZXNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZnJhbWVhZGRyZXNzCisgICAgZ2NyZWFkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZ2NyZWFkCisgICAgZ2Nyb290LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZ2Nyb290CisgICAgZ2N3cml0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uZ2N3cml0ZQorICAgIGdldF9keW5hbWljX2FyZWFfb2Zmc2V0LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmdldC5keW5hbWljLmFyZWEub2Zmc2V0CisgICAgaWNhbGxfYnJhbmNoX2Z1bm5lbCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaWNhbGwuYnJhbmNoLmZ1bm5lbAorICAgIGluaXRfdHJhbXBvbGluZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmluaXQudHJhbXBvbGluZQorICAgIGluc3RycHJvZl9pbmNyZW1lbnQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmluc3RycHJvZi5pbmNyZW1lbnQKKyAgICBpbnN0cnByb2ZfaW5jcmVtZW50X3N0ZXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5pbnN0cnByb2YuaW5jcmVtZW50LnN0ZXAKKyAgICBpbnN0cnByb2ZfdmFsdWVfcHJvZmlsZSwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5pbnN0cnByb2YudmFsdWUucHJvZmlsZQorICAgIGludmFyaWFudF9lbmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmludmFyaWFudC5lbmQKKyAgICBpbnZhcmlhbnRfZ3JvdXBfYmFycmllciwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5pbnZhcmlhbnQuZ3JvdXAuYmFycmllcgorICAgIGludmFyaWFudF9zdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmludmFyaWFudC5zdGFydAorICAgIGxpZmV0aW1lX2VuZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmxpZmV0aW1lLmVuZAorICAgIGxpZmV0aW1lX3N0YXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmxpZmV0aW1lLnN0YXJ0CisgICAgbG9hZF9yZWxhdGl2ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubG9hZC5yZWxhdGl2ZQorICAgIGxvY2FsYWRkcmVzcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmxvY2FsYWRkcmVzcworICAgIGxvY2FsZXNjYXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmxvY2FsZXNjYXBlCisgICAgbG9jYWxyZWNvdmVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubG9jYWxyZWNvdmVyCisgICAgbG9nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubG9nCisgICAgbG9nMTAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubG9nMTAKKyAgICBsb2cyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5sb2cyCisgICAgbG9uZ2ptcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubG9uZ2ptcAorICAgIG1hc2tlZF9jb21wcmVzc3N0b3JlLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1hc2tlZC5jb21wcmVzc3N0b3JlCisgICAgbWFza2VkX2V4cGFuZGxvYWQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWFza2VkLmV4cGFuZGxvYWQKKyAgICBtYXNrZWRfZ2F0aGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5tYXNrZWQuZ2F0aGVyCisgICAgbWFza2VkX2xvYWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWFza2VkLmxvYWQKKyAgICBtYXNrZWRfc2NhdHRlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5tYXNrZWQuc2NhdHRlcgorICAgIG1hc2tlZF9zdG9yZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1hc2tlZC5zdG9yZQorICAgIG1heG51bSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1heG51bQorICAgIG1lbWNweSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1lbWNweQorICAgIG1lbWNweV9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWMsICAgICAgICAgICAvLyBsbHZtLm1lbWNweS5lbGVtZW50LnVub3JkZXJlZC5hdG9taWMKKyAgICBtZW1tb3ZlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5tZW1tb3ZlCisgICAgbWVtbW92ZV9lbGVtZW50X3Vub3JkZXJlZF9hdG9taWMsICAgICAgICAgIC8vIGxsdm0ubWVtbW92ZS5lbGVtZW50LnVub3JkZXJlZC5hdG9taWMKKyAgICBtZW1zZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5tZW1zZXQKKyAgICBtZW1zZXRfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljLCAgICAgICAgICAgLy8gbGx2bS5tZW1zZXQuZWxlbWVudC51bm9yZGVyZWQuYXRvbWljCisgICAgbWlubnVtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlubnVtCisgICAgbmVhcmJ5aW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubmVhcmJ5aW50CisgICAgb2JqZWN0c2l6ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ub2JqZWN0c2l6ZQorICAgIHBjbWFya2VyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBjbWFya2VyCisgICAgcG93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucG93CisgICAgcG93aSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucG93aQorICAgIHByZWZldGNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnByZWZldGNoCisgICAgcHRyX2Fubm90YXRpb24sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHRyLmFubm90YXRpb24KKyAgICByZWFkX3JlZ2lzdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5yZWFkX3JlZ2lzdGVyCisgICAgcmVhZGN5Y2xlY291bnRlciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucmVhZGN5Y2xlY291bnRlcgorICAgIHJldHVybmFkZHJlc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnJldHVybmFkZHJlc3MKKyAgICByaW50LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5yaW50CisgICAgcm91bmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucm91bmQKKyAgICBzYWRkX3dpdGhfb3ZlcmZsb3csICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zYWRkLndpdGgub3ZlcmZsb3cKKyAgICBzZXRqbXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zZXRqbXAKKyAgICBzaWRlZWZmZWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zaWRlZWZmZWN0CisgICAgc2lnbG9uZ2ptcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uc2lnbG9uZ2ptcAorICAgIHNpZ3NldGptcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnNpZ3NldGptcAorICAgIHNpbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnNpbgorICAgIHNtdWxfd2l0aF9vdmVyZmxvdywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnNtdWwud2l0aC5vdmVyZmxvdworICAgIHNxcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnNxcnQKKyAgICBzc2FfY29weSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zc2EuY29weQorICAgIHNzdWJfd2l0aF9vdmVyZmxvdywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnNzdWIud2l0aC5vdmVyZmxvdworICAgIHN0YWNrZ3VhcmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnN0YWNrZ3VhcmQKKyAgICBzdGFja3Byb3RlY3RvciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zdGFja3Byb3RlY3RvcgorICAgIHN0YWNrcmVzdG9yZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnN0YWNrcmVzdG9yZQorICAgIHN0YWNrc2F2ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnN0YWNrc2F2ZQorICAgIHRocmVhZF9wb2ludGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnRocmVhZC5wb2ludGVyCisgICAgdHJhcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0udHJhcAorICAgIHRydW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnRydW5jCisgICAgdHlwZV9jaGVja2VkX2xvYWQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0udHlwZS5jaGVja2VkLmxvYWQKKyAgICB0eXBlX3Rlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS50eXBlLnRlc3QKKyAgICB1YWRkX3dpdGhfb3ZlcmZsb3csICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS51YWRkLndpdGgub3ZlcmZsb3cKKyAgICB1bXVsX3dpdGhfb3ZlcmZsb3csICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS51bXVsLndpdGgub3ZlcmZsb3cKKyAgICB1c3ViX3dpdGhfb3ZlcmZsb3csICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS51c3ViLndpdGgub3ZlcmZsb3cKKyAgICB2YWNvcHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS52YV9jb3B5CisgICAgdmFlbmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0udmFfZW5kCisgICAgdmFzdGFydCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0udmFfc3RhcnQKKyAgICB2YXJfYW5ub3RhdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS52YXIuYW5ub3RhdGlvbgorICAgIHdyaXRlX3JlZ2lzdGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLndyaXRlX3JlZ2lzdGVyCisgICAgeHJheV9jdXN0b21ldmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueHJheS5jdXN0b21ldmVudAorICAgIGFhcmNoNjRfY2xyZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuY2xyZXgKKyAgICBhYXJjaDY0X2NyYzMyYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmNyYzMyYgorICAgIGFhcmNoNjRfY3JjMzJjYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuY3JjMzJjYgorICAgIGFhcmNoNjRfY3JjMzJjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuY3JjMzJjaAorICAgIGFhcmNoNjRfY3JjMzJjdywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuY3JjMzJjdworICAgIGFhcmNoNjRfY3JjMzJjeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuY3JjMzJjeAorICAgIGFhcmNoNjRfY3JjMzJoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuY3JjMzJoCisgICAgYWFyY2g2NF9jcmMzMncsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5jcmMzMncKKyAgICBhYXJjaDY0X2NyYzMyeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmNyYzMyeAorICAgIGFhcmNoNjRfY3J5cHRvX2Flc2QsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLmFlc2QKKyAgICBhYXJjaDY0X2NyeXB0b19hZXNlLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmNyeXB0by5hZXNlCisgICAgYWFyY2g2NF9jcnlwdG9fYWVzaW1jLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5jcnlwdG8uYWVzaW1jCisgICAgYWFyY2g2NF9jcnlwdG9fYWVzbWMsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5jcnlwdG8uYWVzbWMKKyAgICBhYXJjaDY0X2NyeXB0b19zaGExYywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmNyeXB0by5zaGExYworICAgIGFhcmNoNjRfY3J5cHRvX3NoYTFoLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTFoCisgICAgYWFyY2g2NF9jcnlwdG9fc2hhMW0sICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5jcnlwdG8uc2hhMW0KKyAgICBhYXJjaDY0X2NyeXB0b19zaGExcCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmNyeXB0by5zaGExcAorICAgIGFhcmNoNjRfY3J5cHRvX3NoYTFzdTAsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTFzdTAKKyAgICBhYXJjaDY0X2NyeXB0b19zaGExc3UxLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmNyeXB0by5zaGExc3UxCisgICAgYWFyY2g2NF9jcnlwdG9fc2hhMjU2aCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5jcnlwdG8uc2hhMjU2aAorICAgIGFhcmNoNjRfY3J5cHRvX3NoYTI1NmgyLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTI1NmgyCisgICAgYWFyY2g2NF9jcnlwdG9fc2hhMjU2c3UwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5jcnlwdG8uc2hhMjU2c3UwCisgICAgYWFyY2g2NF9jcnlwdG9fc2hhMjU2c3UxLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5jcnlwdG8uc2hhMjU2c3UxCisgICAgYWFyY2g2NF9kbWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5kbWIKKyAgICBhYXJjaDY0X2RzYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmRzYgorICAgIGFhcmNoNjRfaGludCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuaGludAorICAgIGFhcmNoNjRfaXNiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuaXNiCisgICAgYWFyY2g2NF9sZGF4cCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5sZGF4cAorICAgIGFhcmNoNjRfbGRheHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubGRheHIKKyAgICBhYXJjaDY0X2xkeHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmxkeHAKKyAgICBhYXJjaDY0X2xkeHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LmxkeHIKKyAgICBhYXJjaDY0X25lb25fYWJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uYWJzCisgICAgYWFyY2g2NF9uZW9uX2FkZGhuLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmFkZGhuCisgICAgYWFyY2g2NF9uZW9uX2FkZHAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmFkZHAKKyAgICBhYXJjaDY0X25lb25fY2xzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uY2xzCisgICAgYWFyY2g2NF9uZW9uX2ZhYmQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZhYmQKKyAgICBhYXJjaDY0X25lb25fZmFjZ2UsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmFjZ2UKKyAgICBhYXJjaDY0X25lb25fZmFjZ3QsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmFjZ3QKKyAgICBhYXJjaDY0X25lb25fZmFkZHYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmFkZHYKKyAgICBhYXJjaDY0X25lb25fZmN2dGFzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmN2dGFzCisgICAgYWFyY2g2NF9uZW9uX2ZjdnRhdSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZjdnRhdQorICAgIGFhcmNoNjRfbmVvbl9mY3Z0bXMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mY3Z0bXMKKyAgICBhYXJjaDY0X25lb25fZmN2dG11LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmN2dG11CisgICAgYWFyY2g2NF9uZW9uX2ZjdnRucywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZjdnRucworICAgIGFhcmNoNjRfbmVvbl9mY3Z0bnUsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mY3Z0bnUKKyAgICBhYXJjaDY0X25lb25fZmN2dHBzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmN2dHBzCisgICAgYWFyY2g2NF9uZW9uX2ZjdnRwdSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZjdnRwdQorICAgIGFhcmNoNjRfbmVvbl9mY3Z0eG4sICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mY3Z0eG4KKyAgICBhYXJjaDY0X25lb25fZmN2dHpzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmN2dHpzCisgICAgYWFyY2g2NF9uZW9uX2ZjdnR6dSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZjdnR6dQorICAgIGFhcmNoNjRfbmVvbl9mbWF4LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mbWF4CisgICAgYWFyY2g2NF9uZW9uX2ZtYXhubSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZtYXhubQorICAgIGFhcmNoNjRfbmVvbl9mbWF4bm1wLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mbWF4bm1wCisgICAgYWFyY2g2NF9uZW9uX2ZtYXhubXYsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZtYXhubXYKKyAgICBhYXJjaDY0X25lb25fZm1heHAsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZm1heHAKKyAgICBhYXJjaDY0X25lb25fZm1heHYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZm1heHYKKyAgICBhYXJjaDY0X25lb25fZm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZm1pbgorICAgIGFhcmNoNjRfbmVvbl9mbWlubm0sICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mbWlubm0KKyAgICBhYXJjaDY0X25lb25fZm1pbm5tcCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZm1pbm5tcAorICAgIGFhcmNoNjRfbmVvbl9mbWlubm12LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mbWlubm12CisgICAgYWFyY2g2NF9uZW9uX2ZtaW5wLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZtaW5wCisgICAgYWFyY2g2NF9uZW9uX2ZtaW52LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZtaW52CisgICAgYWFyY2g2NF9uZW9uX2ZtdWx4LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZtdWx4CisgICAgYWFyY2g2NF9uZW9uX2ZyZWNwZSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZyZWNwZQorICAgIGFhcmNoNjRfbmVvbl9mcmVjcHMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mcmVjcHMKKyAgICBhYXJjaDY0X25lb25fZnJlY3B4LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZnJlY3B4CisgICAgYWFyY2g2NF9uZW9uX2ZyaW50biwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZyaW50bgorICAgIGFhcmNoNjRfbmVvbl9mcnNxcnRlLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5mcnNxcnRlCisgICAgYWFyY2g2NF9uZW9uX2Zyc3FydHMsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZyc3FydHMKKyAgICBhYXJjaDY0X25lb25fbGQxeDIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24ubGQxeDIKKyAgICBhYXJjaDY0X25lb25fbGQxeDMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24ubGQxeDMKKyAgICBhYXJjaDY0X25lb25fbGQxeDQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24ubGQxeDQKKyAgICBhYXJjaDY0X25lb25fbGQyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24ubGQyCisgICAgYWFyY2g2NF9uZW9uX2xkMmxhbmUsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmxkMmxhbmUKKyAgICBhYXJjaDY0X25lb25fbGQyciwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24ubGQycgorICAgIGFhcmNoNjRfbmVvbl9sZDMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5sZDMKKyAgICBhYXJjaDY0X25lb25fbGQzbGFuZSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24ubGQzbGFuZQorICAgIGFhcmNoNjRfbmVvbl9sZDNyLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5sZDNyCisgICAgYWFyY2g2NF9uZW9uX2xkNCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmxkNAorICAgIGFhcmNoNjRfbmVvbl9sZDRsYW5lLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5sZDRsYW5lCisgICAgYWFyY2g2NF9uZW9uX2xkNHIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmxkNHIKKyAgICBhYXJjaDY0X25lb25fcG11bCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24ucG11bAorICAgIGFhcmNoNjRfbmVvbl9wbXVsbCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5wbXVsbAorICAgIGFhcmNoNjRfbmVvbl9wbXVsbDY0LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5wbXVsbDY0CisgICAgYWFyY2g2NF9uZW9uX3JhZGRobiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnJhZGRobgorICAgIGFhcmNoNjRfbmVvbl9yYml0LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5yYml0CisgICAgYWFyY2g2NF9uZW9uX3JzaHJuLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnJzaHJuCisgICAgYWFyY2g2NF9uZW9uX3JzdWJobiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnJzdWJobgorICAgIGFhcmNoNjRfbmVvbl9zYWJkLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zYWJkCisgICAgYWFyY2g2NF9uZW9uX3NhZGRscCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNhZGRscAorICAgIGFhcmNoNjRfbmVvbl9zYWRkbHYsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zYWRkbHYKKyAgICBhYXJjaDY0X25lb25fc2FkZHYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc2FkZHYKKyAgICBhYXJjaDY0X25lb25fc2NhbGFyX3NxeHRuLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc2NhbGFyLnNxeHRuCisgICAgYWFyY2g2NF9uZW9uX3NjYWxhcl9zcXh0dW4sICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNjYWxhci5zcXh0dW4KKyAgICBhYXJjaDY0X25lb25fc2NhbGFyX3VxeHRuLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc2NhbGFyLnVxeHRuCisgICAgYWFyY2g2NF9uZW9uX3NoYWRkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNoYWRkCisgICAgYWFyY2g2NF9uZW9uX3NobGwsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNobGwKKyAgICBhYXJjaDY0X25lb25fc2hzdWIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc2hzdWIKKyAgICBhYXJjaDY0X25lb25fc21heCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc21heAorICAgIGFhcmNoNjRfbmVvbl9zbWF4cCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zbWF4cAorICAgIGFhcmNoNjRfbmVvbl9zbWF4diwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zbWF4dgorICAgIGFhcmNoNjRfbmVvbl9zbWluLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zbWluCisgICAgYWFyY2g2NF9uZW9uX3NtaW5wLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNtaW5wCisgICAgYWFyY2g2NF9uZW9uX3NtaW52LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNtaW52CisgICAgYWFyY2g2NF9uZW9uX3NtdWxsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNtdWxsCisgICAgYWFyY2g2NF9uZW9uX3NxYWJzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxYWJzCisgICAgYWFyY2g2NF9uZW9uX3NxYWRkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxYWRkCisgICAgYWFyY2g2NF9uZW9uX3NxZG11bGgsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxZG11bGgKKyAgICBhYXJjaDY0X25lb25fc3FkbXVsbCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3FkbXVsbAorICAgIGFhcmNoNjRfbmVvbl9zcWRtdWxsc19zY2FsYXIsICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcWRtdWxscy5zY2FsYXIKKyAgICBhYXJjaDY0X25lb25fc3FuZWcsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3FuZWcKKyAgICBhYXJjaDY0X25lb25fc3FyZG11bGgsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3FyZG11bGgKKyAgICBhYXJjaDY0X25lb25fc3Fyc2hsLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3Fyc2hsCisgICAgYWFyY2g2NF9uZW9uX3NxcnNocm4sICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxcnNocm4KKyAgICBhYXJjaDY0X25lb25fc3Fyc2hydW4sICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3Fyc2hydW4KKyAgICBhYXJjaDY0X25lb25fc3FzaGwsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3FzaGwKKyAgICBhYXJjaDY0X25lb25fc3FzaGx1LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3FzaGx1CisgICAgYWFyY2g2NF9uZW9uX3Nxc2hybiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxc2hybgorICAgIGFhcmNoNjRfbmVvbl9zcXNocnVuLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcXNocnVuCisgICAgYWFyY2g2NF9uZW9uX3Nxc3ViLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxc3ViCisgICAgYWFyY2g2NF9uZW9uX3NxeHRuLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxeHRuCisgICAgYWFyY2g2NF9uZW9uX3NxeHR1biwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxeHR1bgorICAgIGFhcmNoNjRfbmVvbl9zcmhhZGQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcmhhZGQKKyAgICBhYXJjaDY0X25lb25fc3JzaGwsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3JzaGwKKyAgICBhYXJjaDY0X25lb25fc3NobCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3NobAorICAgIGFhcmNoNjRfbmVvbl9zc2hsbCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zc2hsbAorICAgIGFhcmNoNjRfbmVvbl9zdDF4MiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zdDF4MgorICAgIGFhcmNoNjRfbmVvbl9zdDF4MywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zdDF4MworICAgIGFhcmNoNjRfbmVvbl9zdDF4NCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zdDF4NAorICAgIGFhcmNoNjRfbmVvbl9zdDIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zdDIKKyAgICBhYXJjaDY0X25lb25fc3QybGFuZSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3QybGFuZQorICAgIGFhcmNoNjRfbmVvbl9zdDMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zdDMKKyAgICBhYXJjaDY0X25lb25fc3QzbGFuZSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3QzbGFuZQorICAgIGFhcmNoNjRfbmVvbl9zdDQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zdDQKKyAgICBhYXJjaDY0X25lb25fc3Q0bGFuZSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3Q0bGFuZQorICAgIGFhcmNoNjRfbmVvbl9zdWJobiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zdWJobgorICAgIGFhcmNoNjRfbmVvbl9zdXFhZGQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi5zdXFhZGQKKyAgICBhYXJjaDY0X25lb25fdGJsMSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udGJsMQorICAgIGFhcmNoNjRfbmVvbl90YmwyLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi50YmwyCisgICAgYWFyY2g2NF9uZW9uX3RibDMsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnRibDMKKyAgICBhYXJjaDY0X25lb25fdGJsNCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udGJsNAorICAgIGFhcmNoNjRfbmVvbl90YngxLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi50YngxCisgICAgYWFyY2g2NF9uZW9uX3RieDIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnRieDIKKyAgICBhYXJjaDY0X25lb25fdGJ4MywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udGJ4MworICAgIGFhcmNoNjRfbmVvbl90Yng0LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi50Yng0CisgICAgYWFyY2g2NF9uZW9uX3VhYmQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVhYmQKKyAgICBhYXJjaDY0X25lb25fdWFkZGxwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udWFkZGxwCisgICAgYWFyY2g2NF9uZW9uX3VhZGRsdiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVhZGRsdgorICAgIGFhcmNoNjRfbmVvbl91YWRkdiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi51YWRkdgorICAgIGFhcmNoNjRfbmVvbl91aGFkZCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi51aGFkZAorICAgIGFhcmNoNjRfbmVvbl91aHN1YiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi51aHN1YgorICAgIGFhcmNoNjRfbmVvbl91bWF4LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi51bWF4CisgICAgYWFyY2g2NF9uZW9uX3VtYXhwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVtYXhwCisgICAgYWFyY2g2NF9uZW9uX3VtYXh2LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVtYXh2CisgICAgYWFyY2g2NF9uZW9uX3VtaW4sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVtaW4KKyAgICBhYXJjaDY0X25lb25fdW1pbnAsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udW1pbnAKKyAgICBhYXJjaDY0X25lb25fdW1pbnYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udW1pbnYKKyAgICBhYXJjaDY0X25lb25fdW11bGwsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udW11bGwKKyAgICBhYXJjaDY0X25lb25fdXFhZGQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udXFhZGQKKyAgICBhYXJjaDY0X25lb25fdXFyc2hsLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udXFyc2hsCisgICAgYWFyY2g2NF9uZW9uX3VxcnNocm4sICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVxcnNocm4KKyAgICBhYXJjaDY0X25lb25fdXFzaGwsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udXFzaGwKKyAgICBhYXJjaDY0X25lb25fdXFzaHJuLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udXFzaHJuCisgICAgYWFyY2g2NF9uZW9uX3Vxc3ViLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVxc3ViCisgICAgYWFyY2g2NF9uZW9uX3VxeHRuLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVxeHRuCisgICAgYWFyY2g2NF9uZW9uX3VyZWNwZSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVyZWNwZQorICAgIGFhcmNoNjRfbmVvbl91cmhhZGQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi51cmhhZGQKKyAgICBhYXJjaDY0X25lb25fdXJzaGwsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udXJzaGwKKyAgICBhYXJjaDY0X25lb25fdXJzcXJ0ZSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udXJzcXJ0ZQorICAgIGFhcmNoNjRfbmVvbl91c2hsLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi51c2hsCisgICAgYWFyY2g2NF9uZW9uX3VzaGxsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVzaGxsCisgICAgYWFyY2g2NF9uZW9uX3VzcWFkZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVzcWFkZAorICAgIGFhcmNoNjRfbmVvbl92Y29weV9sYW5lLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi52Y29weS5sYW5lCisgICAgYWFyY2g2NF9uZW9uX3ZjdnRmcDJmeHMsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnZjdnRmcDJmeHMKKyAgICBhYXJjaDY0X25lb25fdmN2dGZwMmZ4dSwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udmN2dGZwMmZ4dQorICAgIGFhcmNoNjRfbmVvbl92Y3Z0ZnAyaGYsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi52Y3Z0ZnAyaGYKKyAgICBhYXJjaDY0X25lb25fdmN2dGZ4czJmcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0Lm5lb24udmN2dGZ4czJmcAorICAgIGFhcmNoNjRfbmVvbl92Y3Z0Znh1MmZwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi52Y3Z0Znh1MmZwCisgICAgYWFyY2g2NF9uZW9uX3ZjdnRoZjJmcCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnZjdnRoZjJmcAorICAgIGFhcmNoNjRfbmVvbl92c2xpLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQubmVvbi52c2xpCisgICAgYWFyY2g2NF9uZW9uX3ZzcmksICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnZzcmkKKyAgICBhYXJjaDY0X3NkaXYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LnNkaXYKKyAgICBhYXJjaDY0X3Npc2RfZmFiZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LnNpc2QuZmFiZAorICAgIGFhcmNoNjRfc2lzZF9mY3Z0eG4sICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuc2lzZC5mY3Z0eG4KKyAgICBhYXJjaDY0X3N0bHhwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hYXJjaDY0LnN0bHhwCisgICAgYWFyY2g2NF9zdGx4ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYWFyY2g2NC5zdGx4cgorICAgIGFhcmNoNjRfc3R4cCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuc3R4cAorICAgIGFhcmNoNjRfc3R4ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQuc3R4cgorICAgIGFhcmNoNjRfdWRpdiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFhcmNoNjQudWRpdgorICAgIGFtZGdjbl9hbGlnbmJpdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5hbGlnbmJpdAorICAgIGFtZGdjbl9hbGlnbmJ5dGUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5hbGlnbmJ5dGUKKyAgICBhbWRnY25fYXRvbWljX2RlYywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uYXRvbWljLmRlYworICAgIGFtZGdjbl9hdG9taWNfaW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5hdG9taWMuaW5jCisgICAgYW1kZ2NuX2JyZWFrLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmJyZWFrCisgICAgYW1kZ2NuX2J1ZmZlcl9hdG9taWNfYWRkLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci5hdG9taWMuYWRkCisgICAgYW1kZ2NuX2J1ZmZlcl9hdG9taWNfYW5kLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci5hdG9taWMuYW5kCisgICAgYW1kZ2NuX2J1ZmZlcl9hdG9taWNfY21wc3dhcCwgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci5hdG9taWMuY21wc3dhcAorICAgIGFtZGdjbl9idWZmZXJfYXRvbWljX29yLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLm9yCisgICAgYW1kZ2NuX2J1ZmZlcl9hdG9taWNfc21heCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci5hdG9taWMuc21heAorICAgIGFtZGdjbl9idWZmZXJfYXRvbWljX3NtaW4sICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLnNtaW4KKyAgICBhbWRnY25fYnVmZmVyX2F0b21pY19zdWIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy5zdWIKKyAgICBhbWRnY25fYnVmZmVyX2F0b21pY19zd2FwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy5zd2FwCisgICAgYW1kZ2NuX2J1ZmZlcl9hdG9taWNfdW1heCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci5hdG9taWMudW1heAorICAgIGFtZGdjbl9idWZmZXJfYXRvbWljX3VtaW4sICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLnVtaW4KKyAgICBhbWRnY25fYnVmZmVyX2F0b21pY194b3IsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy54b3IKKyAgICBhbWRnY25fYnVmZmVyX2xvYWQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uYnVmZmVyLmxvYWQKKyAgICBhbWRnY25fYnVmZmVyX2xvYWRfZm9ybWF0LCAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uYnVmZmVyLmxvYWQuZm9ybWF0CisgICAgYW1kZ2NuX2J1ZmZlcl9zdG9yZSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci5zdG9yZQorICAgIGFtZGdjbl9idWZmZXJfc3RvcmVfZm9ybWF0LCAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5idWZmZXIuc3RvcmUuZm9ybWF0CisgICAgYW1kZ2NuX2J1ZmZlcl93YmludmwxLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci53YmludmwxCisgICAgYW1kZ2NuX2J1ZmZlcl93YmludmwxX3NjLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci53YmludmwxLnNjCisgICAgYW1kZ2NuX2J1ZmZlcl93YmludmwxX3ZvbCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci53YmludmwxLnZvbAorICAgIGFtZGdjbl9jbGFzcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5jbGFzcworICAgIGFtZGdjbl9jb3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5jb3MKKyAgICBhbWRnY25fY3ViZWlkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uY3ViZWlkCisgICAgYW1kZ2NuX2N1YmVtYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmN1YmVtYQorICAgIGFtZGdjbl9jdWJlc2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5jdWJlc2MKKyAgICBhbWRnY25fY3ViZXRjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uY3ViZXRjCisgICAgYW1kZ2NuX2N2dF9wa19pMTYsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmN2dC5way5pMTYKKyAgICBhbWRnY25fY3Z0X3BrX3UxNiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uY3Z0LnBrLnUxNgorICAgIGFtZGdjbl9jdnRfcGtfdThfZjMyLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5jdnQucGsudTguZjMyCisgICAgYW1kZ2NuX2N2dF9wa25vcm1faTE2LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmN2dC5wa25vcm0uaTE2CisgICAgYW1kZ2NuX2N2dF9wa25vcm1fdTE2LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmN2dC5wa25vcm0udTE2CisgICAgYW1kZ2NuX2N2dF9wa3J0eiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmN2dC5wa3J0egorICAgIGFtZGdjbl9kaXNwYXRjaF9pZCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5kaXNwYXRjaC5pZAorICAgIGFtZGdjbl9kaXNwYXRjaF9wdHIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5kaXNwYXRjaC5wdHIKKyAgICBhbWRnY25fZGl2X2ZpeHVwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uZGl2LmZpeHVwCisgICAgYW1kZ2NuX2Rpdl9mbWFzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmRpdi5mbWFzCisgICAgYW1kZ2NuX2Rpdl9zY2FsZSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmRpdi5zY2FsZQorICAgIGFtZGdjbl9kc19icGVybXV0ZSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5kcy5icGVybXV0ZQorICAgIGFtZGdjbl9kc19mYWRkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5kcy5mYWRkCisgICAgYW1kZ2NuX2RzX2ZtYXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmRzLmZtYXgKKyAgICBhbWRnY25fZHNfZm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uZHMuZm1pbgorICAgIGFtZGdjbl9kc19wZXJtdXRlLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5kcy5wZXJtdXRlCisgICAgYW1kZ2NuX2RzX3N3aXp6bGUsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmRzLnN3aXp6bGUKKyAgICBhbWRnY25fZWxzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uZWxzZQorICAgIGFtZGdjbl9lbHNlX2JyZWFrLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5lbHNlLmJyZWFrCisgICAgYW1kZ2NuX2VuZF9jZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmVuZC5jZgorICAgIGFtZGdjbl9leHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5leHAKKyAgICBhbWRnY25fZXhwX2NvbXByLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uZXhwLmNvbXByCisgICAgYW1kZ2NuX2ZjbXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmZjbXAKKyAgICBhbWRnY25fZmRpdl9mYXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uZmRpdi5mYXN0CisgICAgYW1kZ2NuX2ZtZWQzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmZtZWQzCisgICAgYW1kZ2NuX2ZtdWxfbGVnYWN5LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmZtdWwubGVnYWN5CisgICAgYW1kZ2NuX2ZyYWN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmZyYWN0CisgICAgYW1kZ2NuX2ZyZXhwX2V4cCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmZyZXhwLmV4cAorICAgIGFtZGdjbl9mcmV4cF9tYW50LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5mcmV4cC5tYW50CisgICAgYW1kZ2NuX2dyb3Vwc3RhdGljc2l6ZSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmdyb3Vwc3RhdGljc2l6ZQorICAgIGFtZGdjbl9pY21wLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pY21wCisgICAgYW1kZ2NuX2lmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmlmCisgICAgYW1kZ2NuX2lmX2JyZWFrLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmlmLmJyZWFrCisgICAgYW1kZ2NuX2ltYWdlX2F0b21pY19hZGQsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy5hZGQKKyAgICBhbWRnY25faW1hZ2VfYXRvbWljX2FuZCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLmFuZAorICAgIGFtZGdjbl9pbWFnZV9hdG9taWNfY21wc3dhcCwgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuY21wc3dhcAorICAgIGFtZGdjbl9pbWFnZV9hdG9taWNfZGVjLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuZGVjCisgICAgYW1kZ2NuX2ltYWdlX2F0b21pY19pbmMsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy5pbmMKKyAgICBhbWRnY25faW1hZ2VfYXRvbWljX29yLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLm9yCisgICAgYW1kZ2NuX2ltYWdlX2F0b21pY19zbWF4LCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy5zbWF4CisgICAgYW1kZ2NuX2ltYWdlX2F0b21pY19zbWluLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy5zbWluCisgICAgYW1kZ2NuX2ltYWdlX2F0b21pY19zdWIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy5zdWIKKyAgICBhbWRnY25faW1hZ2VfYXRvbWljX3N3YXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLnN3YXAKKyAgICBhbWRnY25faW1hZ2VfYXRvbWljX3VtYXgsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLnVtYXgKKyAgICBhbWRnY25faW1hZ2VfYXRvbWljX3VtaW4sICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLnVtaW4KKyAgICBhbWRnY25faW1hZ2VfYXRvbWljX3hvciwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLnhvcgorICAgIGFtZGdjbl9pbWFnZV9nYXRoZXI0LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0CisgICAgYW1kZ2NuX2ltYWdlX2dhdGhlcjRfYiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYgorICAgIGFtZGdjbl9pbWFnZV9nYXRoZXI0X2JfY2wsICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmIuY2wKKyAgICBhbWRnY25faW1hZ2VfZ2F0aGVyNF9iX2NsX28sICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5iLmNsLm8KKyAgICBhbWRnY25faW1hZ2VfZ2F0aGVyNF9iX28sICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5iLm8KKyAgICBhbWRnY25faW1hZ2VfZ2F0aGVyNF9jLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jCisgICAgYW1kZ2NuX2ltYWdlX2dhdGhlcjRfY19iLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5iCisgICAgYW1kZ2NuX2ltYWdlX2dhdGhlcjRfY19iX2NsLCAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5iLmNsCisgICAgYW1kZ2NuX2ltYWdlX2dhdGhlcjRfY19iX2NsX28sICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5iLmNsLm8KKyAgICBhbWRnY25faW1hZ2VfZ2F0aGVyNF9jX2JfbywgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLmIubworICAgIGFtZGdjbl9pbWFnZV9nYXRoZXI0X2NfY2wsICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMuY2wKKyAgICBhbWRnY25faW1hZ2VfZ2F0aGVyNF9jX2NsX28sICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLmNsLm8KKyAgICBhbWRnY25faW1hZ2VfZ2F0aGVyNF9jX2wsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLmwKKyAgICBhbWRnY25faW1hZ2VfZ2F0aGVyNF9jX2xfbywgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLmwubworICAgIGFtZGdjbl9pbWFnZV9nYXRoZXI0X2NfbHosICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMubHoKKyAgICBhbWRnY25faW1hZ2VfZ2F0aGVyNF9jX2x6X28sICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLmx6Lm8KKyAgICBhbWRnY25faW1hZ2VfZ2F0aGVyNF9jX28sICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLm8KKyAgICBhbWRnY25faW1hZ2VfZ2F0aGVyNF9jbCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jbAorICAgIGFtZGdjbl9pbWFnZV9nYXRoZXI0X2NsX28sICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmNsLm8KKyAgICBhbWRnY25faW1hZ2VfZ2F0aGVyNF9sLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5sCisgICAgYW1kZ2NuX2ltYWdlX2dhdGhlcjRfbF9vLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQubC5vCisgICAgYW1kZ2NuX2ltYWdlX2dhdGhlcjRfbHosICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQubHoKKyAgICBhbWRnY25faW1hZ2VfZ2F0aGVyNF9sel9vLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5sei5vCisgICAgYW1kZ2NuX2ltYWdlX2dhdGhlcjRfbywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQubworICAgIGFtZGdjbl9pbWFnZV9nZXRsb2QsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nZXRsb2QKKyAgICBhbWRnY25faW1hZ2VfZ2V0cmVzaW5mbywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2V0cmVzaW5mbworICAgIGFtZGdjbl9pbWFnZV9sb2FkLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5sb2FkCisgICAgYW1kZ2NuX2ltYWdlX2xvYWRfbWlwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmxvYWQubWlwCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZQorICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfYiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYgorICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfYl9jbCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYi5jbAorICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfYl9jbF9vLCAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYi5jbC5vCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9iX28sICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5iLm8KKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2MsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMKKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2NfYiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuYgorICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfY19iX2NsLCAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5iLmNsCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2JfY2xfbywgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmIuY2wubworICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfY19iX28sICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5iLm8KKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2NfY2QsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuY2QKKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2NfY2RfY2wsICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuY2QuY2wKKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2NfY2RfY2xfbywgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuY2QuY2wubworICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfY19jZF9vLCAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5jZC5vCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2NsLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmNsCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2NsX28sICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmNsLm8KKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2NfZCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuZAorICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfY19kX2NsLCAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5kLmNsCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2RfY2xfbywgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmQuY2wubworICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfY19kX28sICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5kLm8KKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2NfbCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMubAorICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfY19sX28sICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5sLm8KKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2NfbHosICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMubHoKKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2NfbHpfbywgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMubHoubworICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfY19vLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5vCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9jZCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jZAorICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfY2RfY2wsICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuY2QuY2wKKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2NkX2NsX28sICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmNkLmNsLm8KKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2NkX28sICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmNkLm8KKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2NsLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmNsCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9jbF9vLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jbC5vCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9kLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5kCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9kX2NsLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5kLmNsCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9kX2NsX28sICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5kLmNsLm8KKyAgICBhbWRnY25faW1hZ2Vfc2FtcGxlX2RfbywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmQubworICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfbCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUubAorICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfbF9vLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUubC5vCisgICAgYW1kZ2NuX2ltYWdlX3NhbXBsZV9seiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5segorICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfbHpfbywgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUubHoubworICAgIGFtZGdjbl9pbWFnZV9zYW1wbGVfbywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUubworICAgIGFtZGdjbl9pbWFnZV9zdG9yZSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zdG9yZQorICAgIGFtZGdjbl9pbWFnZV9zdG9yZV9taXAsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zdG9yZS5taXAKKyAgICBhbWRnY25faW1wbGljaXRfYnVmZmVyX3B0ciwgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW1wbGljaXQuYnVmZmVyLnB0cgorICAgIGFtZGdjbl9pbXBsaWNpdGFyZ19wdHIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5pbXBsaWNpdGFyZy5wdHIKKyAgICBhbWRnY25faW5pdF9leGVjLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW5pdC5leGVjCisgICAgYW1kZ2NuX2luaXRfZXhlY19mcm9tX2lucHV0LCAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmluaXQuZXhlYy5mcm9tLmlucHV0CisgICAgYW1kZ2NuX2ludGVycF9tb3YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmludGVycC5tb3YKKyAgICBhbWRnY25faW50ZXJwX3AxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uaW50ZXJwLnAxCisgICAgYW1kZ2NuX2ludGVycF9wMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmludGVycC5wMgorICAgIGFtZGdjbl9rZXJuYXJnX3NlZ21lbnRfcHRyLCAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5rZXJuYXJnLnNlZ21lbnQucHRyCisgICAgYW1kZ2NuX2tpbGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLmtpbGwKKyAgICBhbWRnY25fbGRleHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ubGRleHAKKyAgICBhbWRnY25fbGVycCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ubGVycAorICAgIGFtZGdjbl9sb2dfY2xhbXAsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5sb2cuY2xhbXAKKyAgICBhbWRnY25fbG9vcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ubG9vcAorICAgIGFtZGdjbl9tYmNudF9oaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5tYmNudC5oaQorICAgIGFtZGdjbl9tYmNudF9sbywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5tYmNudC5sbworICAgIGFtZGdjbl9tb3ZfZHBwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5tb3YuZHBwCisgICAgYW1kZ2NuX21xc2FkX3BrX3UxNl91OCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLm1xc2FkLnBrLnUxNi51OAorICAgIGFtZGdjbl9tcXNhZF91MzJfdTgsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5tcXNhZC51MzIudTgKKyAgICBhbWRnY25fbXNhZF91OCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ubXNhZC51OAorICAgIGFtZGdjbl9wc19saXZlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5wcy5saXZlCisgICAgYW1kZ2NuX3FzYWRfcGtfdTE2X3U4LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnFzYWQucGsudTE2LnU4CisgICAgYW1kZ2NuX3F1ZXVlX3B0ciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnF1ZXVlLnB0cgorICAgIGFtZGdjbl9yY3AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5yY3AKKyAgICBhbWRnY25fcmNwX2xlZ2FjeSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ucmNwLmxlZ2FjeQorICAgIGFtZGdjbl9yZWFkZmlyc3RsYW5lLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5yZWFkZmlyc3RsYW5lCisgICAgYW1kZ2NuX3JlYWRsYW5lLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnJlYWRsYW5lCisgICAgYW1kZ2NuX3JzcSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnJzcQorICAgIGFtZGdjbl9yc3FfY2xhbXAsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5yc3EuY2xhbXAKKyAgICBhbWRnY25fcnNxX2xlZ2FjeSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ucnNxLmxlZ2FjeQorICAgIGFtZGdjbl9zX2JhcnJpZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5zLmJhcnJpZXIKKyAgICBhbWRnY25fc19kY2FjaGVfaW52LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ucy5kY2FjaGUuaW52CisgICAgYW1kZ2NuX3NfZGNhY2hlX2ludl92b2wsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnMuZGNhY2hlLmludi52b2wKKyAgICBhbWRnY25fc19kY2FjaGVfd2IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ucy5kY2FjaGUud2IKKyAgICBhbWRnY25fc19kY2FjaGVfd2Jfdm9sLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ucy5kY2FjaGUud2Iudm9sCisgICAgYW1kZ2NuX3NfZGVjcGVyZmxldmVsLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnMuZGVjcGVyZmxldmVsCisgICAgYW1kZ2NuX3NfZ2V0cGMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnMuZ2V0cGMKKyAgICBhbWRnY25fc19nZXRyZWcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ucy5nZXRyZWcKKyAgICBhbWRnY25fc19pbmNwZXJmbGV2ZWwsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ucy5pbmNwZXJmbGV2ZWwKKyAgICBhbWRnY25fc19tZW1yZWFsdGltZSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ucy5tZW1yZWFsdGltZQorICAgIGFtZGdjbl9zX21lbXRpbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5zLm1lbXRpbWUKKyAgICBhbWRnY25fc19zZW5kbXNnLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ucy5zZW5kbXNnCisgICAgYW1kZ2NuX3Nfc2VuZG1zZ2hhbHQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnMuc2VuZG1zZ2hhbHQKKyAgICBhbWRnY25fc19zbGVlcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ucy5zbGVlcAorICAgIGFtZGdjbl9zX3dhaXRjbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi5zLndhaXRjbnQKKyAgICBhbWRnY25fc2FkX2hpX3U4LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uc2FkLmhpLnU4CisgICAgYW1kZ2NuX3NhZF91MTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnNhZC51MTYKKyAgICBhbWRnY25fc2FkX3U4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uc2FkLnU4CisgICAgYW1kZ2NuX3NiZmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnNiZmUKKyAgICBhbWRnY25fc2V0X2luYWN0aXZlLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24uc2V0LmluYWN0aXZlCisgICAgYW1kZ2NuX3NmZmJoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnNmZmJoCisgICAgYW1kZ2NuX3NpbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnNpbgorICAgIGFtZGdjbl90YnVmZmVyX2xvYWQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi50YnVmZmVyLmxvYWQKKyAgICBhbWRnY25fdGJ1ZmZlcl9zdG9yZSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24udGJ1ZmZlci5zdG9yZQorICAgIGFtZGdjbl90cmlnX3ByZW9wLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi50cmlnLnByZW9wCisgICAgYW1kZ2NuX3ViZmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLnViZmUKKyAgICBhbWRnY25fdW5yZWFjaGFibGUsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24udW5yZWFjaGFibGUKKyAgICBhbWRnY25fdXBkYXRlX2RwcCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24udXBkYXRlLmRwcAorICAgIGFtZGdjbl93YXZlX2JhcnJpZXIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi53YXZlLmJhcnJpZXIKKyAgICBhbWRnY25fd29ya2dyb3VwX2lkX3gsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ud29ya2dyb3VwLmlkLngKKyAgICBhbWRnY25fd29ya2dyb3VwX2lkX3ksICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ud29ya2dyb3VwLmlkLnkKKyAgICBhbWRnY25fd29ya2dyb3VwX2lkX3osICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ud29ya2dyb3VwLmlkLnoKKyAgICBhbWRnY25fd29ya2l0ZW1faWRfeCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ud29ya2l0ZW0uaWQueAorICAgIGFtZGdjbl93b3JraXRlbV9pZF95LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi53b3JraXRlbS5pZC55CisgICAgYW1kZ2NuX3dvcmtpdGVtX2lkX3osICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLndvcmtpdGVtLmlkLnoKKyAgICBhbWRnY25fd3FtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hbWRnY24ud3FtCisgICAgYW1kZ2NuX3dxbV92b3RlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLndxbS52b3RlCisgICAgYW1kZ2NuX3dyaXRlbGFuZSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYW1kZ2NuLndyaXRlbGFuZQorICAgIGFtZGdjbl93d20sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFtZGdjbi53d20KKyAgICBhcm1fY2RwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uY2RwCisgICAgYXJtX2NkcDIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLmNkcDIKKyAgICBhcm1fY2xyZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uY2xyZXgKKyAgICBhcm1fY3JjMzJiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uY3JjMzJiCisgICAgYXJtX2NyYzMyY2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLmNyYzMyY2IKKyAgICBhcm1fY3JjMzJjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uY3JjMzJjaAorICAgIGFybV9jcmMzMmN3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5jcmMzMmN3CisgICAgYXJtX2NyYzMyaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLmNyYzMyaAorICAgIGFybV9jcmMzMncsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5jcmMzMncKKyAgICBhcm1fZGJnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uZGJnCisgICAgYXJtX2RtYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLmRtYgorICAgIGFybV9kc2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5kc2IKKyAgICBhcm1fZ2V0X2Zwc2NyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uZ2V0LmZwc2NyCisgICAgYXJtX2hpbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLmhpbnQKKyAgICBhcm1faXNiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uaXNiCisgICAgYXJtX2xkYWV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLmxkYWV4CisgICAgYXJtX2xkYWV4ZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLmxkYWV4ZAorICAgIGFybV9sZGMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5sZGMKKyAgICBhcm1fbGRjMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubGRjMgorICAgIGFybV9sZGMybCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5sZGMybAorICAgIGFybV9sZGNsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5sZGNsCisgICAgYXJtX2xkcmV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLmxkcmV4CisgICAgYXJtX2xkcmV4ZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLmxkcmV4ZAorICAgIGFybV9tY3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5tY3IKKyAgICBhcm1fbWNyMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubWNyMgorICAgIGFybV9tY3JyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5tY3JyCisgICAgYXJtX21jcnIyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm1jcnIyCisgICAgYXJtX21yYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm1yYworICAgIGFybV9tcmMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5tcmMyCisgICAgYXJtX21ycmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm1ycmMKKyAgICBhcm1fbXJyYzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubXJyYzIKKyAgICBhcm1fbmVvbl9hZXNkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi5hZXNkCisgICAgYXJtX25lb25fYWVzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24uYWVzZQorICAgIGFybV9uZW9uX2Flc2ltYywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLmFlc2ltYworICAgIGFybV9uZW9uX2Flc21jLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLmFlc21jCisgICAgYXJtX25lb25fc2hhMWMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24uc2hhMWMKKyAgICBhcm1fbmVvbl9zaGExaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi5zaGExaAorICAgIGFybV9uZW9uX3NoYTFtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnNoYTFtCisgICAgYXJtX25lb25fc2hhMXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24uc2hhMXAKKyAgICBhcm1fbmVvbl9zaGExc3UwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi5zaGExc3UwCisgICAgYXJtX25lb25fc2hhMXN1MSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24uc2hhMXN1MQorICAgIGFybV9uZW9uX3NoYTI1NmgsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnNoYTI1NmgKKyAgICBhcm1fbmVvbl9zaGEyNTZoMiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi5zaGEyNTZoMgorICAgIGFybV9uZW9uX3NoYTI1NnN1MCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnNoYTI1NnN1MAorICAgIGFybV9uZW9uX3NoYTI1NnN1MSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnNoYTI1NnN1MQorICAgIGFybV9uZW9uX3ZhYmRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZhYmRzCisgICAgYXJtX25lb25fdmFiZHUsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udmFiZHUKKyAgICBhcm1fbmVvbl92YWJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52YWJzCisgICAgYXJtX25lb25fdmFjZ2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udmFjZ2UKKyAgICBhcm1fbmVvbl92YWNndCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52YWNndAorICAgIGFybV9uZW9uX3Zic2wsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZic2wKKyAgICBhcm1fbmVvbl92Y2xzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52Y2xzCisgICAgYXJtX25lb25fdmN2dGFzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udmN2dGFzCisgICAgYXJtX25lb25fdmN2dGF1LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udmN2dGF1CisgICAgYXJtX25lb25fdmN2dGZwMmZ4cywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udmN2dGZwMmZ4cworICAgIGFybV9uZW9uX3ZjdnRmcDJmeHUsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZjdnRmcDJmeHUKKyAgICBhcm1fbmVvbl92Y3Z0ZnAyaGYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52Y3Z0ZnAyaGYKKyAgICBhcm1fbmVvbl92Y3Z0ZnhzMmZwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52Y3Z0ZnhzMmZwCisgICAgYXJtX25lb25fdmN2dGZ4dTJmcCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udmN2dGZ4dTJmcAorICAgIGFybV9uZW9uX3ZjdnRoZjJmcCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZjdnRoZjJmcAorICAgIGFybV9uZW9uX3ZjdnRtcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZjdnRtcworICAgIGFybV9uZW9uX3ZjdnRtdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZjdnRtdQorICAgIGFybV9uZW9uX3ZjdnRucywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZjdnRucworICAgIGFybV9uZW9uX3ZjdnRudSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZjdnRudQorICAgIGFybV9uZW9uX3ZjdnRwcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZjdnRwcworICAgIGFybV9uZW9uX3ZjdnRwdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZjdnRwdQorICAgIGFybV9uZW9uX3ZoYWRkcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZoYWRkcworICAgIGFybV9uZW9uX3ZoYWRkdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZoYWRkdQorICAgIGFybV9uZW9uX3Zoc3VicywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZoc3VicworICAgIGFybV9uZW9uX3Zoc3VidSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZoc3VidQorICAgIGFybV9uZW9uX3ZsZDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZsZDEKKyAgICBhcm1fbmVvbl92bGQyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52bGQyCisgICAgYXJtX25lb25fdmxkMmxhbmUsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udmxkMmxhbmUKKyAgICBhcm1fbmVvbl92bGQzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52bGQzCisgICAgYXJtX25lb25fdmxkM2xhbmUsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udmxkM2xhbmUKKyAgICBhcm1fbmVvbl92bGQ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52bGQ0CisgICAgYXJtX25lb25fdmxkNGxhbmUsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udmxkNGxhbmUKKyAgICBhcm1fbmVvbl92bWF4bm0sICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52bWF4bm0KKyAgICBhcm1fbmVvbl92bWF4cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52bWF4cworICAgIGFybV9uZW9uX3ZtYXh1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZtYXh1CisgICAgYXJtX25lb25fdm1pbm5tLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udm1pbm5tCisgICAgYXJtX25lb25fdm1pbnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udm1pbnMKKyAgICBhcm1fbmVvbl92bWludSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52bWludQorICAgIGFybV9uZW9uX3ZtdWxscCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZtdWxscAorICAgIGFybV9uZW9uX3ZtdWxscywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZtdWxscworICAgIGFybV9uZW9uX3ZtdWxsdSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZtdWxsdQorICAgIGFybV9uZW9uX3ZtdWxwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZtdWxwCisgICAgYXJtX25lb25fdnBhZGFscywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnBhZGFscworICAgIGFybV9uZW9uX3ZwYWRhbHUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZwYWRhbHUKKyAgICBhcm1fbmVvbl92cGFkZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cGFkZAorICAgIGFybV9uZW9uX3ZwYWRkbHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZwYWRkbHMKKyAgICBhcm1fbmVvbl92cGFkZGx1LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cGFkZGx1CisgICAgYXJtX25lb25fdnBtYXhzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnBtYXhzCisgICAgYXJtX25lb25fdnBtYXh1LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnBtYXh1CisgICAgYXJtX25lb25fdnBtaW5zLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnBtaW5zCisgICAgYXJtX25lb25fdnBtaW51LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnBtaW51CisgICAgYXJtX25lb25fdnFhYnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnFhYnMKKyAgICBhcm1fbmVvbl92cWFkZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cWFkZHMKKyAgICBhcm1fbmVvbl92cWFkZHUsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cWFkZHUKKyAgICBhcm1fbmVvbl92cWRtdWxoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cWRtdWxoCisgICAgYXJtX25lb25fdnFkbXVsbCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnFkbXVsbAorICAgIGFybV9uZW9uX3ZxbW92bnMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZxbW92bnMKKyAgICBhcm1fbmVvbl92cW1vdm5zdSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cW1vdm5zdQorICAgIGFybV9uZW9uX3ZxbW92bnUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZxbW92bnUKKyAgICBhcm1fbmVvbl92cW5lZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cW5lZworICAgIGFybV9uZW9uX3ZxcmRtdWxoLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZxcmRtdWxoCisgICAgYXJtX25lb25fdnFyc2hpZnRucywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnFyc2hpZnRucworICAgIGFybV9uZW9uX3ZxcnNoaWZ0bnN1LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZxcnNoaWZ0bnN1CisgICAgYXJtX25lb25fdnFyc2hpZnRudSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnFyc2hpZnRudQorICAgIGFybV9uZW9uX3ZxcnNoaWZ0cywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZxcnNoaWZ0cworICAgIGFybV9uZW9uX3ZxcnNoaWZ0dSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZxcnNoaWZ0dQorICAgIGFybV9uZW9uX3Zxc2hpZnRucywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZxc2hpZnRucworICAgIGFybV9uZW9uX3Zxc2hpZnRuc3UsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZxc2hpZnRuc3UKKyAgICBhcm1fbmVvbl92cXNoaWZ0bnUsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cXNoaWZ0bnUKKyAgICBhcm1fbmVvbl92cXNoaWZ0cywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cXNoaWZ0cworICAgIGFybV9uZW9uX3Zxc2hpZnRzdSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZxc2hpZnRzdQorICAgIGFybV9uZW9uX3Zxc2hpZnR1LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZxc2hpZnR1CisgICAgYXJtX25lb25fdnFzdWJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnFzdWJzCisgICAgYXJtX25lb25fdnFzdWJ1LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnFzdWJ1CisgICAgYXJtX25lb25fdnJhZGRobiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnJhZGRobgorICAgIGFybV9uZW9uX3ZyZWNwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZyZWNwZQorICAgIGFybV9uZW9uX3ZyZWNwcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZyZWNwcworICAgIGFybV9uZW9uX3ZyaGFkZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZyaGFkZHMKKyAgICBhcm1fbmVvbl92cmhhZGR1LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cmhhZGR1CisgICAgYXJtX25lb25fdnJpbnRhLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnJpbnRhCisgICAgYXJtX25lb25fdnJpbnRtLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnJpbnRtCisgICAgYXJtX25lb25fdnJpbnRuLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnJpbnRuCisgICAgYXJtX25lb25fdnJpbnRwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnJpbnRwCisgICAgYXJtX25lb25fdnJpbnR4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnJpbnR4CisgICAgYXJtX25lb25fdnJpbnR6LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnJpbnR6CisgICAgYXJtX25lb25fdnJzaGlmdG4sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnJzaGlmdG4KKyAgICBhcm1fbmVvbl92cnNoaWZ0cywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cnNoaWZ0cworICAgIGFybV9uZW9uX3Zyc2hpZnR1LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZyc2hpZnR1CisgICAgYXJtX25lb25fdnJzcXJ0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnJzcXJ0ZQorICAgIGFybV9uZW9uX3Zyc3FydHMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZyc3FydHMKKyAgICBhcm1fbmVvbl92cnN1YmhuLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52cnN1YmhuCisgICAgYXJtX25lb25fdnNoaWZ0aW5zLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnNoaWZ0aW5zCisgICAgYXJtX25lb25fdnNoaWZ0cywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnNoaWZ0cworICAgIGFybV9uZW9uX3ZzaGlmdHUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZzaGlmdHUKKyAgICBhcm1fbmVvbl92c3QxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52c3QxCisgICAgYXJtX25lb25fdnN0MiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnN0MgorICAgIGFybV9uZW9uX3ZzdDJsYW5lLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZzdDJsYW5lCisgICAgYXJtX25lb25fdnN0MywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnN0MworICAgIGFybV9uZW9uX3ZzdDNsYW5lLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZzdDNsYW5lCisgICAgYXJtX25lb25fdnN0NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnN0NAorICAgIGFybV9uZW9uX3ZzdDRsYW5lLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZzdDRsYW5lCisgICAgYXJtX25lb25fdnRibDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnRibDEKKyAgICBhcm1fbmVvbl92dGJsMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52dGJsMgorICAgIGFybV9uZW9uX3Z0YmwzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZ0YmwzCisgICAgYXJtX25lb25fdnRibDQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnRibDQKKyAgICBhcm1fbmVvbl92dGJ4MSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52dGJ4MQorICAgIGFybV9uZW9uX3Z0YngyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5uZW9uLnZ0YngyCisgICAgYXJtX25lb25fdnRieDMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLm5lb24udnRieDMKKyAgICBhcm1fbmVvbl92dGJ4NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ubmVvbi52dGJ4NAorICAgIGFybV9xYWRkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5xYWRkCisgICAgYXJtX3FhZGQxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnFhZGQxNgorICAgIGFybV9xYWRkOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5xYWRkOAorICAgIGFybV9xYXN4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5xYXN4CisgICAgYXJtX3FzYXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnFzYXgKKyAgICBhcm1fcXN1YiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ucXN1YgorICAgIGFybV9xc3ViMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5xc3ViMTYKKyAgICBhcm1fcXN1YjgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0ucXN1YjgKKyAgICBhcm1fc2FkZDE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc2FkZDE2CisgICAgYXJtX3NhZGQ4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNhZGQ4CisgICAgYXJtX3Nhc3gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNhc3gKKyAgICBhcm1fc2VsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc2VsCisgICAgYXJtX3NldF9mcHNjciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNldC5mcHNjcgorICAgIGFybV9zaGFkZDE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zaGFkZDE2CisgICAgYXJtX3NoYWRkOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNoYWRkOAorICAgIGFybV9zaGFzeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zaGFzeAorICAgIGFybV9zaHNheCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zaHNheAorICAgIGFybV9zaHN1YjE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zaHN1YjE2CisgICAgYXJtX3Noc3ViOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNoc3ViOAorICAgIGFybV9zbWxhYmIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zbWxhYmIKKyAgICBhcm1fc21sYWJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc21sYWJ0CisgICAgYXJtX3NtbGFkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNtbGFkCisgICAgYXJtX3NtbGFkeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNtbGFkeAorICAgIGFybV9zbWxhbGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zbWxhbGQKKyAgICBhcm1fc21sYWxkeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc21sYWxkeAorICAgIGFybV9zbWxhdGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zbWxhdGIKKyAgICBhcm1fc21sYXR0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc21sYXR0CisgICAgYXJtX3NtbGF3YiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNtbGF3YgorICAgIGFybV9zbWxhd3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zbWxhd3QKKyAgICBhcm1fc21sc2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc21sc2QKKyAgICBhcm1fc21sc2R4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc21sc2R4CisgICAgYXJtX3NtbHNsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNtbHNsZAorICAgIGFybV9zbWxzbGR4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zbWxzbGR4CisgICAgYXJtX3NtdWFkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNtdWFkCisgICAgYXJtX3NtdWFkeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNtdWFkeAorICAgIGFybV9zbXVsYmIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zbXVsYmIKKyAgICBhcm1fc211bGJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc211bGJ0CisgICAgYXJtX3NtdWx0YiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNtdWx0YgorICAgIGFybV9zbXVsdHQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zbXVsdHQKKyAgICBhcm1fc211bHdiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc211bHdiCisgICAgYXJtX3NtdWx3dCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnNtdWx3dAorICAgIGFybV9zbXVzZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zbXVzZAorICAgIGFybV9zbXVzZHgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zbXVzZHgKKyAgICBhcm1fc3BhY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc3BhY2UKKyAgICBhcm1fc3NhdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc3NhdAorICAgIGFybV9zc2F0MTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zc2F0MTYKKyAgICBhcm1fc3NheCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc3NheAorICAgIGFybV9zc3ViMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zc3ViMTYKKyAgICBhcm1fc3N1YjgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc3N1YjgKKyAgICBhcm1fc3RjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc3RjCisgICAgYXJtX3N0YzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnN0YzIKKyAgICBhcm1fc3RjMmwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc3RjMmwKKyAgICBhcm1fc3RjbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc3RjbAorICAgIGFybV9zdGxleCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zdGxleAorICAgIGFybV9zdGxleGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS5zdGxleGQKKyAgICBhcm1fc3RyZXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc3RyZXgKKyAgICBhcm1fc3RyZXhkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc3RyZXhkCisgICAgYXJtX3N4dGFiMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnN4dGFiMTYKKyAgICBhcm1fc3h0YjE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0uc3h0YjE2CisgICAgYXJtX3VhZGQxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnVhZGQxNgorICAgIGFybV91YWRkOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS51YWRkOAorICAgIGFybV91YXN4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS51YXN4CisgICAgYXJtX3VoYWRkMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnVoYWRkMTYKKyAgICBhcm1fdWhhZGQ4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0udWhhZGQ4CisgICAgYXJtX3VoYXN4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnVoYXN4CisgICAgYXJtX3Voc2F4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnVoc2F4CisgICAgYXJtX3Voc3ViMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnVoc3ViMTYKKyAgICBhcm1fdWhzdWI4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0udWhzdWI4CisgICAgYXJtX3VuZGVmaW5lZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnVuZGVmaW5lZAorICAgIGFybV91cWFkZDE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS51cWFkZDE2CisgICAgYXJtX3VxYWRkOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnVxYWRkOAorICAgIGFybV91cWFzeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS51cWFzeAorICAgIGFybV91cXNheCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS51cXNheAorICAgIGFybV91cXN1YjE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS51cXN1YjE2CisgICAgYXJtX3Vxc3ViOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYXJtLnVxc3ViOAorICAgIGFybV91c2FkOCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS51c2FkOAorICAgIGFybV91c2FkYTgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS51c2FkYTgKKyAgICBhcm1fdXNhdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0udXNhdAorICAgIGFybV91c2F0MTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS51c2F0MTYKKyAgICBhcm1fdXNheCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0udXNheAorICAgIGFybV91c3ViMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS51c3ViMTYKKyAgICBhcm1fdXN1YjgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0udXN1YjgKKyAgICBhcm1fdXh0YWIxNiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0udXh0YWIxNgorICAgIGFybV91eHRiMTYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmFybS51eHRiMTYKKyAgICBhcm1fdmN2dHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0udmN2dHIKKyAgICBhcm1fdmN2dHJ1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5hcm0udmN2dHJ1CisgICAgYnBmX2xvYWRfYnl0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYnBmLmxvYWQuYnl0ZQorICAgIGJwZl9sb2FkX2hhbGYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmJwZi5sb2FkLmhhbGYKKyAgICBicGZfbG9hZF93b3JkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5icGYubG9hZC53b3JkCisgICAgYnBmX3BzZXVkbywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uYnBmLnBzZXVkbworICAgIGhleGFnb25fQTJfYWJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuYWJzCisgICAgaGV4YWdvbl9BMl9hYnNwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5hYnNwCisgICAgaGV4YWdvbl9BMl9hYnNzYXQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5hYnNzYXQKKyAgICBoZXhhZ29uX0EyX2FkZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZAorICAgIGhleGFnb25fQTJfYWRkaF9oMTZfaGgsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuYWRkaC5oMTYuaGgKKyAgICBoZXhhZ29uX0EyX2FkZGhfaDE2X2hsLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGguaDE2LmhsCisgICAgaGV4YWdvbl9BMl9hZGRoX2gxNl9saCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5hZGRoLmgxNi5saAorICAgIGhleGFnb25fQTJfYWRkaF9oMTZfbGwsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuYWRkaC5oMTYubGwKKyAgICBoZXhhZ29uX0EyX2FkZGhfaDE2X3NhdF9oaCwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGguaDE2LnNhdC5oaAorICAgIGhleGFnb25fQTJfYWRkaF9oMTZfc2F0X2hsLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuYWRkaC5oMTYuc2F0LmhsCisgICAgaGV4YWdvbl9BMl9hZGRoX2gxNl9zYXRfbGgsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5hZGRoLmgxNi5zYXQubGgKKyAgICBoZXhhZ29uX0EyX2FkZGhfaDE2X3NhdF9sbCwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGguaDE2LnNhdC5sbAorICAgIGhleGFnb25fQTJfYWRkaF9sMTZfaGwsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuYWRkaC5sMTYuaGwKKyAgICBoZXhhZ29uX0EyX2FkZGhfbDE2X2xsLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGgubDE2LmxsCisgICAgaGV4YWdvbl9BMl9hZGRoX2wxNl9zYXRfaGwsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5hZGRoLmwxNi5zYXQuaGwKKyAgICBoZXhhZ29uX0EyX2FkZGhfbDE2X3NhdF9sbCwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGgubDE2LnNhdC5sbAorICAgIGhleGFnb25fQTJfYWRkaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuYWRkaQorICAgIGhleGFnb25fQTJfYWRkcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuYWRkcAorICAgIGhleGFnb25fQTJfYWRkcHNhdCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuYWRkcHNhdAorICAgIGhleGFnb25fQTJfYWRkc2F0LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuYWRkc2F0CisgICAgaGV4YWdvbl9BMl9hZGRzcCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5hZGRzcAorICAgIGhleGFnb25fQTJfYW5kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuYW5kCisgICAgaGV4YWdvbl9BMl9hbmRpciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5hbmRpcgorICAgIGhleGFnb25fQTJfYW5kcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuYW5kcAorICAgIGhleGFnb25fQTJfYXNsaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuYXNsaAorICAgIGhleGFnb25fQTJfYXNyaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuYXNyaAorICAgIGhleGFnb25fQTJfY29tYmluZV9oaCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuY29tYmluZS5oaAorICAgIGhleGFnb25fQTJfY29tYmluZV9obCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuY29tYmluZS5obAorICAgIGhleGFnb25fQTJfY29tYmluZV9saCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuY29tYmluZS5saAorICAgIGhleGFnb25fQTJfY29tYmluZV9sbCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuY29tYmluZS5sbAorICAgIGhleGFnb25fQTJfY29tYmluZWlpLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuY29tYmluZWlpCisgICAgaGV4YWdvbl9BMl9jb21iaW5ldywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5jb21iaW5ldworICAgIGhleGFnb25fQTJfbWF4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIubWF4CisgICAgaGV4YWdvbl9BMl9tYXhwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5tYXhwCisgICAgaGV4YWdvbl9BMl9tYXh1LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5tYXh1CisgICAgaGV4YWdvbl9BMl9tYXh1cCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5tYXh1cAorICAgIGhleGFnb25fQTJfbWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIubWluCisgICAgaGV4YWdvbl9BMl9taW5wLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5taW5wCisgICAgaGV4YWdvbl9BMl9taW51LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5taW51CisgICAgaGV4YWdvbl9BMl9taW51cCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5taW51cAorICAgIGhleGFnb25fQTJfbmVnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIubmVnCisgICAgaGV4YWdvbl9BMl9uZWdwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5uZWdwCisgICAgaGV4YWdvbl9BMl9uZWdzYXQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5uZWdzYXQKKyAgICBoZXhhZ29uX0EyX25vdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLm5vdAorICAgIGhleGFnb25fQTJfbm90cCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIubm90cAorICAgIGhleGFnb25fQTJfb3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIub3IKKyAgICBoZXhhZ29uX0EyX29yaXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLm9yaXIKKyAgICBoZXhhZ29uX0EyX29ycCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLm9ycAorICAgIGhleGFnb25fQTJfcm91bmRzYXQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIucm91bmRzYXQKKyAgICBoZXhhZ29uX0EyX3NhdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnNhdAorICAgIGhleGFnb25fQTJfc2F0YiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc2F0YgorICAgIGhleGFnb25fQTJfc2F0aCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc2F0aAorICAgIGhleGFnb25fQTJfc2F0dWIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc2F0dWIKKyAgICBoZXhhZ29uX0EyX3NhdHVoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnNhdHVoCisgICAgaGV4YWdvbl9BMl9zdWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWIKKyAgICBoZXhhZ29uX0EyX3N1YmhfaDE2X2hoLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YmguaDE2LmhoCisgICAgaGV4YWdvbl9BMl9zdWJoX2gxNl9obCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJoLmgxNi5obAorICAgIGhleGFnb25fQTJfc3ViaF9oMTZfbGgsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3ViaC5oMTYubGgKKyAgICBoZXhhZ29uX0EyX3N1YmhfaDE2X2xsLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YmguaDE2LmxsCisgICAgaGV4YWdvbl9BMl9zdWJoX2gxNl9zYXRfaGgsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJoLmgxNi5zYXQuaGgKKyAgICBoZXhhZ29uX0EyX3N1YmhfaDE2X3NhdF9obCwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YmguaDE2LnNhdC5obAorICAgIGhleGFnb25fQTJfc3ViaF9oMTZfc2F0X2xoLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3ViaC5oMTYuc2F0LmxoCisgICAgaGV4YWdvbl9BMl9zdWJoX2gxNl9zYXRfbGwsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJoLmgxNi5zYXQubGwKKyAgICBoZXhhZ29uX0EyX3N1YmhfbDE2X2hsLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YmgubDE2LmhsCisgICAgaGV4YWdvbl9BMl9zdWJoX2wxNl9sbCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJoLmwxNi5sbAorICAgIGhleGFnb25fQTJfc3ViaF9sMTZfc2F0X2hsLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3ViaC5sMTYuc2F0LmhsCisgICAgaGV4YWdvbl9BMl9zdWJoX2wxNl9zYXRfbGwsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJoLmwxNi5zYXQubGwKKyAgICBoZXhhZ29uX0EyX3N1YnAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YnAKKyAgICBoZXhhZ29uX0EyX3N1YnJpLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YnJpCisgICAgaGV4YWdvbl9BMl9zdWJzYXQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJzYXQKKyAgICBoZXhhZ29uX0EyX3N2YWRkaCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnN2YWRkaAorICAgIGhleGFnb25fQTJfc3ZhZGRocywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3ZhZGRocworICAgIGhleGFnb25fQTJfc3ZhZGR1aHMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3ZhZGR1aHMKKyAgICBoZXhhZ29uX0EyX3N2YXZnaCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnN2YXZnaAorICAgIGhleGFnb25fQTJfc3ZhdmdocywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3ZhdmdocworICAgIGhleGFnb25fQTJfc3ZuYXZnaCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3ZuYXZnaAorICAgIGhleGFnb25fQTJfc3ZzdWJoLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3ZzdWJoCisgICAgaGV4YWdvbl9BMl9zdnN1YmhzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5zdnN1YmhzCisgICAgaGV4YWdvbl9BMl9zdnN1YnVocywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi5zdnN1YnVocworICAgIGhleGFnb25fQTJfc3dpeiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3dpegorICAgIGhleGFnb25fQTJfc3h0YiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3h0YgorICAgIGhleGFnb25fQTJfc3h0aCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3h0aAorICAgIGhleGFnb25fQTJfc3h0dywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIuc3h0dworICAgIGhleGFnb25fQTJfdGZyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudGZyCisgICAgaGV4YWdvbl9BMl90ZnJpaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi50ZnJpaAorICAgIGhleGFnb25fQTJfdGZyaWwsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudGZyaWwKKyAgICBoZXhhZ29uX0EyX3RmcnAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnRmcnAKKyAgICBoZXhhZ29uX0EyX3RmcnBpLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnRmcnBpCisgICAgaGV4YWdvbl9BMl90ZnJzaSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi50ZnJzaQorICAgIGhleGFnb25fQTJfdmFic2gsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmFic2gKKyAgICBoZXhhZ29uX0EyX3ZhYnNoc2F0LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZhYnNoc2F0CisgICAgaGV4YWdvbl9BMl92YWJzdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52YWJzdworICAgIGhleGFnb25fQTJfdmFic3dzYXQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmFic3dzYXQKKyAgICBoZXhhZ29uX0EyX3ZhZGRiX21hcCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZhZGRiLm1hcAorICAgIGhleGFnb25fQTJfdmFkZGgsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmFkZGgKKyAgICBoZXhhZ29uX0EyX3ZhZGRocywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZhZGRocworICAgIGhleGFnb25fQTJfdmFkZHViLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmFkZHViCisgICAgaGV4YWdvbl9BMl92YWRkdWJzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52YWRkdWJzCisgICAgaGV4YWdvbl9BMl92YWRkdWhzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52YWRkdWhzCisgICAgaGV4YWdvbl9BMl92YWRkdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52YWRkdworICAgIGhleGFnb25fQTJfdmFkZHdzLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmFkZHdzCisgICAgaGV4YWdvbl9BMl92YXZnaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52YXZnaAorICAgIGhleGFnb25fQTJfdmF2Z2hjciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmF2Z2hjcgorICAgIGhleGFnb25fQTJfdmF2Z2hyLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmF2Z2hyCisgICAgaGV4YWdvbl9BMl92YXZndWIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52YXZndWIKKyAgICBoZXhhZ29uX0EyX3Zhdmd1YnIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZhdmd1YnIKKyAgICBoZXhhZ29uX0EyX3Zhdmd1aCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZhdmd1aAorICAgIGhleGFnb25fQTJfdmF2Z3VociwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmF2Z3VocgorICAgIGhleGFnb25fQTJfdmF2Z3V3LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmF2Z3V3CisgICAgaGV4YWdvbl9BMl92YXZndXdyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52YXZndXdyCisgICAgaGV4YWdvbl9BMl92YXZndywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52YXZndworICAgIGhleGFnb25fQTJfdmF2Z3djciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmF2Z3djcgorICAgIGhleGFnb25fQTJfdmF2Z3dyLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmF2Z3dyCisgICAgaGV4YWdvbl9BMl92Y21wYmVxLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52Y21wYmVxCisgICAgaGV4YWdvbl9BMl92Y21wYmd0dSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52Y21wYmd0dQorICAgIGhleGFnb25fQTJfdmNtcGhlcSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmNtcGhlcQorICAgIGhleGFnb25fQTJfdmNtcGhndCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmNtcGhndAorICAgIGhleGFnb25fQTJfdmNtcGhndHUsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudmNtcGhndHUKKyAgICBoZXhhZ29uX0EyX3ZjbXB3ZXEsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZjbXB3ZXEKKyAgICBoZXhhZ29uX0EyX3ZjbXB3Z3QsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZjbXB3Z3QKKyAgICBoZXhhZ29uX0EyX3ZjbXB3Z3R1LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZjbXB3Z3R1CisgICAgaGV4YWdvbl9BMl92Y29uaiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52Y29uagorICAgIGhleGFnb25fQTJfdm1heGIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudm1heGIKKyAgICBoZXhhZ29uX0EyX3ZtYXhoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZtYXhoCisgICAgaGV4YWdvbl9BMl92bWF4dWIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52bWF4dWIKKyAgICBoZXhhZ29uX0EyX3ZtYXh1aCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZtYXh1aAorICAgIGhleGFnb25fQTJfdm1heHV3LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudm1heHV3CisgICAgaGV4YWdvbl9BMl92bWF4dywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52bWF4dworICAgIGhleGFnb25fQTJfdm1pbmIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudm1pbmIKKyAgICBoZXhhZ29uX0EyX3ZtaW5oLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZtaW5oCisgICAgaGV4YWdvbl9BMl92bWludWIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52bWludWIKKyAgICBoZXhhZ29uX0EyX3ZtaW51aCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZtaW51aAorICAgIGhleGFnb25fQTJfdm1pbnV3LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudm1pbnV3CisgICAgaGV4YWdvbl9BMl92bWludywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52bWludworICAgIGhleGFnb25fQTJfdm5hdmdoLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudm5hdmdoCisgICAgaGV4YWdvbl9BMl92bmF2Z2hjciwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52bmF2Z2hjcgorICAgIGhleGFnb25fQTJfdm5hdmdociwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudm5hdmdocgorICAgIGhleGFnb25fQTJfdm5hdmd3LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudm5hdmd3CisgICAgaGV4YWdvbl9BMl92bmF2Z3djciwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52bmF2Z3djcgorICAgIGhleGFnb25fQTJfdm5hdmd3ciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudm5hdmd3cgorICAgIGhleGFnb25fQTJfdnJhZGR1YiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudnJhZGR1YgorICAgIGhleGFnb25fQTJfdnJhZGR1Yl9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudnJhZGR1Yi5hY2MKKyAgICBoZXhhZ29uX0EyX3Zyc2FkdWIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZyc2FkdWIKKyAgICBoZXhhZ29uX0EyX3Zyc2FkdWJfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZyc2FkdWIuYWNjCisgICAgaGV4YWdvbl9BMl92c3ViYl9tYXAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52c3ViYi5tYXAKKyAgICBoZXhhZ29uX0EyX3ZzdWJoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZzdWJoCisgICAgaGV4YWdvbl9BMl92c3ViaHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi52c3ViaHMKKyAgICBoZXhhZ29uX0EyX3ZzdWJ1YiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZzdWJ1YgorICAgIGhleGFnb25fQTJfdnN1YnVicywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudnN1YnVicworICAgIGhleGFnb25fQTJfdnN1YnVocywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudnN1YnVocworICAgIGhleGFnb25fQTJfdnN1YncsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIudnN1YncKKyAgICBoZXhhZ29uX0EyX3ZzdWJ3cywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkEyLnZzdWJ3cworICAgIGhleGFnb25fQTJfeG9yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTIueG9yCisgICAgaGV4YWdvbl9BMl94b3JwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi54b3JwCisgICAgaGV4YWdvbl9BMl96eHRiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi56eHRiCisgICAgaGV4YWdvbl9BMl96eHRoLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BMi56eHRoCisgICAgaGV4YWdvbl9BNF9hbmRuLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5hbmRuCisgICAgaGV4YWdvbl9BNF9hbmRucCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5hbmRucAorICAgIGhleGFnb25fQTRfYml0c3BsaXQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQuYml0c3BsaXQKKyAgICBoZXhhZ29uX0E0X2JpdHNwbGl0aSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LmJpdHNwbGl0aQorICAgIGhleGFnb25fQTRfYm91bmRzY2hlY2ssICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQuYm91bmRzY2hlY2sKKyAgICBoZXhhZ29uX0E0X2NtcGJlcSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LmNtcGJlcQorICAgIGhleGFnb25fQTRfY21wYmVxaSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQuY21wYmVxaQorICAgIGhleGFnb25fQTRfY21wYmd0LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQuY21wYmd0CisgICAgaGV4YWdvbl9BNF9jbXBiZ3RpLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5jbXBiZ3RpCisgICAgaGV4YWdvbl9BNF9jbXBiZ3R1LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5jbXBiZ3R1CisgICAgaGV4YWdvbl9BNF9jbXBiZ3R1aSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5jbXBiZ3R1aQorICAgIGhleGFnb25fQTRfY21waGVxLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQuY21waGVxCisgICAgaGV4YWdvbl9BNF9jbXBoZXFpLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5jbXBoZXFpCisgICAgaGV4YWdvbl9BNF9jbXBoZ3QsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5jbXBoZ3QKKyAgICBoZXhhZ29uX0E0X2NtcGhndGksICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LmNtcGhndGkKKyAgICBoZXhhZ29uX0E0X2NtcGhndHUsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LmNtcGhndHUKKyAgICBoZXhhZ29uX0E0X2NtcGhndHVpLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LmNtcGhndHVpCisgICAgaGV4YWdvbl9BNF9jb21iaW5laXIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5jb21iaW5laXIKKyAgICBoZXhhZ29uX0E0X2NvbWJpbmVyaSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LmNvbWJpbmVyaQorICAgIGhleGFnb25fQTRfY3JvdW5kX3JpLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQuY3JvdW5kLnJpCisgICAgaGV4YWdvbl9BNF9jcm91bmRfcnIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5jcm91bmQucnIKKyAgICBoZXhhZ29uX0E0X21vZHdyYXB1LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0Lm1vZHdyYXB1CisgICAgaGV4YWdvbl9BNF9vcm4sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5vcm4KKyAgICBoZXhhZ29uX0E0X29ybnAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0Lm9ybnAKKyAgICBoZXhhZ29uX0E0X3JjbXBlcSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LnJjbXBlcQorICAgIGhleGFnb25fQTRfcmNtcGVxaSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQucmNtcGVxaQorICAgIGhleGFnb25fQTRfcmNtcG5lcSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQucmNtcG5lcQorICAgIGhleGFnb25fQTRfcmNtcG5lcWksICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQucmNtcG5lcWkKKyAgICBoZXhhZ29uX0E0X3JvdW5kX3JpLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LnJvdW5kLnJpCisgICAgaGV4YWdvbl9BNF9yb3VuZF9yaV9zYXQsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5yb3VuZC5yaS5zYXQKKyAgICBoZXhhZ29uX0E0X3JvdW5kX3JyLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LnJvdW5kLnJyCisgICAgaGV4YWdvbl9BNF9yb3VuZF9ycl9zYXQsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC5yb3VuZC5yci5zYXQKKyAgICBoZXhhZ29uX0E0X3RsYm1hdGNoLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LnRsYm1hdGNoCisgICAgaGV4YWdvbl9BNF92Y21wYmVxX2FueSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC52Y21wYmVxLmFueQorICAgIGhleGFnb25fQTRfdmNtcGJlcWksICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQudmNtcGJlcWkKKyAgICBoZXhhZ29uX0E0X3ZjbXBiZ3QsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LnZjbXBiZ3QKKyAgICBoZXhhZ29uX0E0X3ZjbXBiZ3RpLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LnZjbXBiZ3RpCisgICAgaGV4YWdvbl9BNF92Y21wYmd0dWksICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC52Y21wYmd0dWkKKyAgICBoZXhhZ29uX0E0X3ZjbXBoZXFpLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LnZjbXBoZXFpCisgICAgaGV4YWdvbl9BNF92Y21waGd0aSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC52Y21waGd0aQorICAgIGhleGFnb25fQTRfdmNtcGhndHVpLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQudmNtcGhndHVpCisgICAgaGV4YWdvbl9BNF92Y21wd2VxaSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC52Y21wd2VxaQorICAgIGhleGFnb25fQTRfdmNtcHdndGksICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQudmNtcHdndGkKKyAgICBoZXhhZ29uX0E0X3ZjbXB3Z3R1aSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LnZjbXB3Z3R1aQorICAgIGhleGFnb25fQTRfdnJtYXhoLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQudnJtYXhoCisgICAgaGV4YWdvbl9BNF92cm1heHVoLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC52cm1heHVoCisgICAgaGV4YWdvbl9BNF92cm1heHV3LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC52cm1heHV3CisgICAgaGV4YWdvbl9BNF92cm1heHcsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNC52cm1heHcKKyAgICBoZXhhZ29uX0E0X3ZybWluaCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE0LnZybWluaAorICAgIGhleGFnb25fQTRfdnJtaW51aCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQudnJtaW51aAorICAgIGhleGFnb25fQTRfdnJtaW51dywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQudnJtaW51dworICAgIGhleGFnb25fQTRfdnJtaW53LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTQudnJtaW53CisgICAgaGV4YWdvbl9BNV92YWRkaHVicywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5BNS52YWRkaHVicworICAgIGhleGFnb25fQTZfdmNtcGJlcV9ub3RhbnksICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQTYudmNtcGJlcS5ub3RhbnkKKyAgICBoZXhhZ29uX0E2X3ZjbXBiZXFfbm90YW55XzEyOEIsICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkE2LnZjbXBiZXEubm90YW55LjEyOEIKKyAgICBoZXhhZ29uX0MyX2FsbDgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLmFsbDgKKyAgICBoZXhhZ29uX0MyX2FuZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLmFuZAorICAgIGhleGFnb25fQzJfYW5kbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIuYW5kbgorICAgIGhleGFnb25fQzJfYW55OCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIuYW55OAorICAgIGhleGFnb25fQzJfYml0c2NsciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIuYml0c2NscgorICAgIGhleGFnb25fQzJfYml0c2NscmksICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIuYml0c2NscmkKKyAgICBoZXhhZ29uX0MyX2JpdHNzZXQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLmJpdHNzZXQKKyAgICBoZXhhZ29uX0MyX2NtcGVxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLmNtcGVxCisgICAgaGV4YWdvbl9DMl9jbXBlcWksICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi5jbXBlcWkKKyAgICBoZXhhZ29uX0MyX2NtcGVxcCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLmNtcGVxcAorICAgIGhleGFnb25fQzJfY21wZ2VpLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIuY21wZ2VpCisgICAgaGV4YWdvbl9DMl9jbXBnZXVpLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi5jbXBnZXVpCisgICAgaGV4YWdvbl9DMl9jbXBndCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi5jbXBndAorICAgIGhleGFnb25fQzJfY21wZ3RpLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIuY21wZ3RpCisgICAgaGV4YWdvbl9DMl9jbXBndHAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi5jbXBndHAKKyAgICBoZXhhZ29uX0MyX2NtcGd0dSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLmNtcGd0dQorICAgIGhleGFnb25fQzJfY21wZ3R1aSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIuY21wZ3R1aQorICAgIGhleGFnb25fQzJfY21wZ3R1cCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIuY21wZ3R1cAorICAgIGhleGFnb25fQzJfY21wbHQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIuY21wbHQKKyAgICBoZXhhZ29uX0MyX2NtcGx0dSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLmNtcGx0dQorICAgIGhleGFnb25fQzJfbWFzaywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIubWFzaworICAgIGhleGFnb25fQzJfbXV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIubXV4CisgICAgaGV4YWdvbl9DMl9tdXhpaSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi5tdXhpaQorICAgIGhleGFnb25fQzJfbXV4aXIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIubXV4aXIKKyAgICBoZXhhZ29uX0MyX211eHJpLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLm11eHJpCisgICAgaGV4YWdvbl9DMl9ub3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi5ub3QKKyAgICBoZXhhZ29uX0MyX29yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLm9yCisgICAgaGV4YWdvbl9DMl9vcm4sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi5vcm4KKyAgICBoZXhhZ29uX0MyX3B4ZmVyX21hcCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLnB4ZmVyLm1hcAorICAgIGhleGFnb25fQzJfdGZycHIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzIudGZycHIKKyAgICBoZXhhZ29uX0MyX3RmcnJwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkMyLnRmcnJwCisgICAgaGV4YWdvbl9DMl92aXRwYWNrLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi52aXRwYWNrCisgICAgaGV4YWdvbl9DMl92bXV4LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi52bXV4CisgICAgaGV4YWdvbl9DMl94b3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DMi54b3IKKyAgICBoZXhhZ29uX0M0X2FuZF9hbmQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkM0LmFuZC5hbmQKKyAgICBoZXhhZ29uX0M0X2FuZF9hbmRuLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkM0LmFuZC5hbmRuCisgICAgaGV4YWdvbl9DNF9hbmRfb3IsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5DNC5hbmQub3IKKyAgICBoZXhhZ29uX0M0X2FuZF9vcm4sICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkM0LmFuZC5vcm4KKyAgICBoZXhhZ29uX0M0X2NtcGx0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkM0LmNtcGx0ZQorICAgIGhleGFnb25fQzRfY21wbHRlaSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzQuY21wbHRlaQorICAgIGhleGFnb25fQzRfY21wbHRldSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzQuY21wbHRldQorICAgIGhleGFnb25fQzRfY21wbHRldWksICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzQuY21wbHRldWkKKyAgICBoZXhhZ29uX0M0X2NtcG5lcSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkM0LmNtcG5lcQorICAgIGhleGFnb25fQzRfY21wbmVxaSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzQuY21wbmVxaQorICAgIGhleGFnb25fQzRfZmFzdGNvcm5lcjksICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzQuZmFzdGNvcm5lcjkKKyAgICBoZXhhZ29uX0M0X2Zhc3Rjb3JuZXI5X25vdCwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkM0LmZhc3Rjb3JuZXI5Lm5vdAorICAgIGhleGFnb25fQzRfbmJpdHNjbHIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzQubmJpdHNjbHIKKyAgICBoZXhhZ29uX0M0X25iaXRzY2xyaSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkM0Lm5iaXRzY2xyaQorICAgIGhleGFnb25fQzRfbmJpdHNzZXQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzQubmJpdHNzZXQKKyAgICBoZXhhZ29uX0M0X29yX2FuZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkM0Lm9yLmFuZAorICAgIGhleGFnb25fQzRfb3JfYW5kbiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzQub3IuYW5kbgorICAgIGhleGFnb25fQzRfb3Jfb3IsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uQzQub3Iub3IKKyAgICBoZXhhZ29uX0M0X29yX29ybiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkM0Lm9yLm9ybgorICAgIGhleGFnb25fRjJfY29udl9kMmRmLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuY29udi5kMmRmCisgICAgaGV4YWdvbl9GMl9jb252X2Qyc2YsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LmQyc2YKKyAgICBoZXhhZ29uX0YyX2NvbnZfZGYyZCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuZGYyZAorICAgIGhleGFnb25fRjJfY29udl9kZjJkX2Nob3AsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuY29udi5kZjJkLmNob3AKKyAgICBoZXhhZ29uX0YyX2NvbnZfZGYyc2YsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuZGYyc2YKKyAgICBoZXhhZ29uX0YyX2NvbnZfZGYydWQsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuZGYydWQKKyAgICBoZXhhZ29uX0YyX2NvbnZfZGYydWRfY2hvcCwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuZGYydWQuY2hvcAorICAgIGhleGFnb25fRjJfY29udl9kZjJ1dywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuY29udi5kZjJ1dworICAgIGhleGFnb25fRjJfY29udl9kZjJ1d19jaG9wLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuY29udi5kZjJ1dy5jaG9wCisgICAgaGV4YWdvbl9GMl9jb252X2RmMncsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LmRmMncKKyAgICBoZXhhZ29uX0YyX2NvbnZfZGYyd19jaG9wLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuZGYydy5jaG9wCisgICAgaGV4YWdvbl9GMl9jb252X3NmMmQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LnNmMmQKKyAgICBoZXhhZ29uX0YyX2NvbnZfc2YyZF9jaG9wLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuc2YyZC5jaG9wCisgICAgaGV4YWdvbl9GMl9jb252X3NmMmRmLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LnNmMmRmCisgICAgaGV4YWdvbl9GMl9jb252X3NmMnVkLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LnNmMnVkCisgICAgaGV4YWdvbl9GMl9jb252X3NmMnVkX2Nob3AsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LnNmMnVkLmNob3AKKyAgICBoZXhhZ29uX0YyX2NvbnZfc2YydXcsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuc2YydXcKKyAgICBoZXhhZ29uX0YyX2NvbnZfc2YydXdfY2hvcCwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuc2YydXcuY2hvcAorICAgIGhleGFnb25fRjJfY29udl9zZjJ3LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuY29udi5zZjJ3CisgICAgaGV4YWdvbl9GMl9jb252X3NmMndfY2hvcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LnNmMncuY2hvcAorICAgIGhleGFnb25fRjJfY29udl91ZDJkZiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuY29udi51ZDJkZgorICAgIGhleGFnb25fRjJfY29udl91ZDJzZiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuY29udi51ZDJzZgorICAgIGhleGFnb25fRjJfY29udl91dzJkZiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuY29udi51dzJkZgorICAgIGhleGFnb25fRjJfY29udl91dzJzZiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuY29udi51dzJzZgorICAgIGhleGFnb25fRjJfY29udl93MmRmLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuY29udi53MmRmCisgICAgaGV4YWdvbl9GMl9jb252X3cyc2YsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252Lncyc2YKKyAgICBoZXhhZ29uX0YyX2RmY2xhc3MsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmRmY2xhc3MKKyAgICBoZXhhZ29uX0YyX2RmY21wZXEsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmRmY21wZXEKKyAgICBoZXhhZ29uX0YyX2RmY21wZ2UsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmRmY21wZ2UKKyAgICBoZXhhZ29uX0YyX2RmY21wZ3QsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmRmY21wZ3QKKyAgICBoZXhhZ29uX0YyX2RmY21wdW8sICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmRmY21wdW8KKyAgICBoZXhhZ29uX0YyX2RmaW1tX24sICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmRmaW1tLm4KKyAgICBoZXhhZ29uX0YyX2RmaW1tX3AsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLmRmaW1tLnAKKyAgICBoZXhhZ29uX0YyX3NmYWRkLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLnNmYWRkCisgICAgaGV4YWdvbl9GMl9zZmNsYXNzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5zZmNsYXNzCisgICAgaGV4YWdvbl9GMl9zZmNtcGVxLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5zZmNtcGVxCisgICAgaGV4YWdvbl9GMl9zZmNtcGdlLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5zZmNtcGdlCisgICAgaGV4YWdvbl9GMl9zZmNtcGd0LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5zZmNtcGd0CisgICAgaGV4YWdvbl9GMl9zZmNtcHVvLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5zZmNtcHVvCisgICAgaGV4YWdvbl9GMl9zZmZpeHVwZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5zZmZpeHVwZAorICAgIGhleGFnb25fRjJfc2ZmaXh1cG4sICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuc2ZmaXh1cG4KKyAgICBoZXhhZ29uX0YyX3NmZml4dXByLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLnNmZml4dXByCisgICAgaGV4YWdvbl9GMl9zZmZtYSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5zZmZtYQorICAgIGhleGFnb25fRjJfc2ZmbWFfbGliLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuc2ZmbWEubGliCisgICAgaGV4YWdvbl9GMl9zZmZtYV9zYywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5zZmZtYS5zYworICAgIGhleGFnb25fRjJfc2ZmbXMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuc2ZmbXMKKyAgICBoZXhhZ29uX0YyX3NmZm1zX2xpYiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLnNmZm1zLmxpYgorICAgIGhleGFnb25fRjJfc2ZpbW1fbiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuc2ZpbW0ubgorICAgIGhleGFnb25fRjJfc2ZpbW1fcCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuc2ZpbW0ucAorICAgIGhleGFnb25fRjJfc2ZtYXgsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuc2ZtYXgKKyAgICBoZXhhZ29uX0YyX3NmbWluLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkYyLnNmbWluCisgICAgaGV4YWdvbl9GMl9zZm1weSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5GMi5zZm1weQorICAgIGhleGFnb25fRjJfc2ZzdWIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uRjIuc2ZzdWIKKyAgICBoZXhhZ29uX0wyX2xvYWRyYl9wYnIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyYi5wYnIKKyAgICBoZXhhZ29uX0wyX2xvYWRyYl9wY2ksICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyYi5wY2kKKyAgICBoZXhhZ29uX0wyX2xvYWRyYl9wY3IsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyYi5wY3IKKyAgICBoZXhhZ29uX0wyX2xvYWRyZF9wYnIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyZC5wYnIKKyAgICBoZXhhZ29uX0wyX2xvYWRyZF9wY2ksICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyZC5wY2kKKyAgICBoZXhhZ29uX0wyX2xvYWRyZF9wY3IsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyZC5wY3IKKyAgICBoZXhhZ29uX0wyX2xvYWRyaF9wYnIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyaC5wYnIKKyAgICBoZXhhZ29uX0wyX2xvYWRyaF9wY2ksICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyaC5wY2kKKyAgICBoZXhhZ29uX0wyX2xvYWRyaF9wY3IsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyaC5wY3IKKyAgICBoZXhhZ29uX0wyX2xvYWRyaV9wYnIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyaS5wYnIKKyAgICBoZXhhZ29uX0wyX2xvYWRyaV9wY2ksICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyaS5wY2kKKyAgICBoZXhhZ29uX0wyX2xvYWRyaV9wY3IsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyaS5wY3IKKyAgICBoZXhhZ29uX0wyX2xvYWRydWJfcGJyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRydWIucGJyCisgICAgaGV4YWdvbl9MMl9sb2FkcnViX3BjaSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcnViLnBjaQorICAgIGhleGFnb25fTDJfbG9hZHJ1Yl9wY3IsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTDIubG9hZHJ1Yi5wY3IKKyAgICBoZXhhZ29uX0wyX2xvYWRydWhfcGJyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRydWgucGJyCisgICAgaGV4YWdvbl9MMl9sb2FkcnVoX3BjaSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcnVoLnBjaQorICAgIGhleGFnb25fTDJfbG9hZHJ1aF9wY3IsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTDIubG9hZHJ1aC5wY3IKKyAgICBoZXhhZ29uX0wyX2xvYWR3X2xvY2tlZCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWR3LmxvY2tlZAorICAgIGhleGFnb25fTDRfbG9hZGRfbG9ja2VkLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTDQubG9hZGQubG9ja2VkCisgICAgaGV4YWdvbl9NMl9hY2NpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5hY2NpCisgICAgaGV4YWdvbl9NMl9hY2NpaSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5hY2NpaQorICAgIGhleGFnb25fTTJfY21hY2lfczAsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuY21hY2kuczAKKyAgICBoZXhhZ29uX00yX2NtYWNyX3MwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmNtYWNyLnMwCisgICAgaGV4YWdvbl9NMl9jbWFjc19zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5jbWFjcy5zMAorICAgIGhleGFnb25fTTJfY21hY3NfczEsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuY21hY3MuczEKKyAgICBoZXhhZ29uX00yX2NtYWNzY19zMCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmNtYWNzYy5zMAorICAgIGhleGFnb25fTTJfY21hY3NjX3MxLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuY21hY3NjLnMxCisgICAgaGV4YWdvbl9NMl9jbXB5aV9zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5jbXB5aS5zMAorICAgIGhleGFnb25fTTJfY21weXJfczAsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuY21weXIuczAKKyAgICBoZXhhZ29uX00yX2NtcHlyc19zMCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmNtcHlycy5zMAorICAgIGhleGFnb25fTTJfY21weXJzX3MxLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuY21weXJzLnMxCisgICAgaGV4YWdvbl9NMl9jbXB5cnNjX3MwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5jbXB5cnNjLnMwCisgICAgaGV4YWdvbl9NMl9jbXB5cnNjX3MxLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5jbXB5cnNjLnMxCisgICAgaGV4YWdvbl9NMl9jbXB5c19zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5jbXB5cy5zMAorICAgIGhleGFnb25fTTJfY21weXNfczEsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuY21weXMuczEKKyAgICBoZXhhZ29uX00yX2NtcHlzY19zMCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmNtcHlzYy5zMAorICAgIGhleGFnb25fTTJfY21weXNjX3MxLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuY21weXNjLnMxCisgICAgaGV4YWdvbl9NMl9jbmFjc19zMCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5jbmFjcy5zMAorICAgIGhleGFnb25fTTJfY25hY3NfczEsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuY25hY3MuczEKKyAgICBoZXhhZ29uX00yX2NuYWNzY19zMCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmNuYWNzYy5zMAorICAgIGhleGFnb25fTTJfY25hY3NjX3MxLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuY25hY3NjLnMxCisgICAgaGV4YWdvbl9NMl9kcG1weXNzX2FjY19zMCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5kcG1weXNzLmFjYy5zMAorICAgIGhleGFnb25fTTJfZHBtcHlzc19uYWNfczAsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuZHBtcHlzcy5uYWMuczAKKyAgICBoZXhhZ29uX00yX2RwbXB5c3Nfcm5kX3MwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmRwbXB5c3Mucm5kLnMwCisgICAgaGV4YWdvbl9NMl9kcG1weXNzX3MwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5kcG1weXNzLnMwCisgICAgaGV4YWdvbl9NMl9kcG1weXV1X2FjY19zMCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5kcG1weXV1LmFjYy5zMAorICAgIGhleGFnb25fTTJfZHBtcHl1dV9uYWNfczAsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuZHBtcHl1dS5uYWMuczAKKyAgICBoZXhhZ29uX00yX2RwbXB5dXVfczAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmRwbXB5dXUuczAKKyAgICBoZXhhZ29uX00yX2htbXB5aF9yczEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmhtbXB5aC5yczEKKyAgICBoZXhhZ29uX00yX2htbXB5aF9zMSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLmhtbXB5aC5zMQorICAgIGhleGFnb25fTTJfaG1tcHlsX3JzMSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuaG1tcHlsLnJzMQorICAgIGhleGFnb25fTTJfaG1tcHlsX3MxLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIuaG1tcHlsLnMxCisgICAgaGV4YWdvbl9NMl9tYWNpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tYWNpCisgICAgaGV4YWdvbl9NMl9tYWNzaW4sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tYWNzaW4KKyAgICBoZXhhZ29uX00yX21hY3NpcCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1hY3NpcAorICAgIGhleGFnb25fTTJfbW1hY2hzX3JzMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1hY2hzLnJzMAorICAgIGhleGFnb25fTTJfbW1hY2hzX3JzMSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1hY2hzLnJzMQorICAgIGhleGFnb25fTTJfbW1hY2hzX3MwLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1hY2hzLnMwCisgICAgaGV4YWdvbl9NMl9tbWFjaHNfczEsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tbWFjaHMuczEKKyAgICBoZXhhZ29uX00yX21tYWNsc19yczAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWNscy5yczAKKyAgICBoZXhhZ29uX00yX21tYWNsc19yczEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWNscy5yczEKKyAgICBoZXhhZ29uX00yX21tYWNsc19zMCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWNscy5zMAorICAgIGhleGFnb25fTTJfbW1hY2xzX3MxLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1hY2xzLnMxCisgICAgaGV4YWdvbl9NMl9tbWFjdWhzX3JzMCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tbWFjdWhzLnJzMAorICAgIGhleGFnb25fTTJfbW1hY3Voc19yczEsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1hY3Vocy5yczEKKyAgICBoZXhhZ29uX00yX21tYWN1aHNfczAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWN1aHMuczAKKyAgICBoZXhhZ29uX00yX21tYWN1aHNfczEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWN1aHMuczEKKyAgICBoZXhhZ29uX00yX21tYWN1bHNfcnMwLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWN1bHMucnMwCisgICAgaGV4YWdvbl9NMl9tbWFjdWxzX3JzMSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tbWFjdWxzLnJzMQorICAgIGhleGFnb25fTTJfbW1hY3Vsc19zMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1hY3Vscy5zMAorICAgIGhleGFnb25fTTJfbW1hY3Vsc19zMSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1hY3Vscy5zMQorICAgIGhleGFnb25fTTJfbW1weWhfcnMwLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1weWgucnMwCisgICAgaGV4YWdvbl9NMl9tbXB5aF9yczEsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5aC5yczEKKyAgICBoZXhhZ29uX00yX21tcHloX3MwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHloLnMwCisgICAgaGV4YWdvbl9NMl9tbXB5aF9zMSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5aC5zMQorICAgIGhleGFnb25fTTJfbW1weWxfcnMwLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1weWwucnMwCisgICAgaGV4YWdvbl9NMl9tbXB5bF9yczEsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5bC5yczEKKyAgICBoZXhhZ29uX00yX21tcHlsX3MwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHlsLnMwCisgICAgaGV4YWdvbl9NMl9tbXB5bF9zMSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5bC5zMQorICAgIGhleGFnb25fTTJfbW1weXVoX3JzMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1weXVoLnJzMAorICAgIGhleGFnb25fTTJfbW1weXVoX3JzMSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1weXVoLnJzMQorICAgIGhleGFnb25fTTJfbW1weXVoX3MwLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1weXVoLnMwCisgICAgaGV4YWdvbl9NMl9tbXB5dWhfczEsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5dWguczEKKyAgICBoZXhhZ29uX00yX21tcHl1bF9yczAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHl1bC5yczAKKyAgICBoZXhhZ29uX00yX21tcHl1bF9yczEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHl1bC5yczEKKyAgICBoZXhhZ29uX00yX21tcHl1bF9zMCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHl1bC5zMAorICAgIGhleGFnb25fTTJfbW1weXVsX3MxLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubW1weXVsLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfYWNjX2hoX3MwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLmhoLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfYWNjX2hoX3MxLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLmhoLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfYWNjX2hsX3MwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLmhsLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfYWNjX2hsX3MxLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLmhsLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfYWNjX2xoX3MwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLmxoLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfYWNjX2xoX3MxLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLmxoLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfYWNjX2xsX3MwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLmxsLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfYWNjX2xsX3MxLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLmxsLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfYWNjX3NhdF9oaF9zMCwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLnNhdC5oaC5zMAorICAgIGhleGFnb25fTTJfbXB5X2FjY19zYXRfaGhfczEsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5zYXQuaGguczEKKyAgICBoZXhhZ29uX00yX21weV9hY2Nfc2F0X2hsX3MwLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5hY2Muc2F0LmhsLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfYWNjX3NhdF9obF9zMSwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLnNhdC5obC5zMQorICAgIGhleGFnb25fTTJfbXB5X2FjY19zYXRfbGhfczAsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5zYXQubGguczAKKyAgICBoZXhhZ29uX00yX21weV9hY2Nfc2F0X2xoX3MxLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5hY2Muc2F0LmxoLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfYWNjX3NhdF9sbF9zMCwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLnNhdC5sbC5zMAorICAgIGhleGFnb25fTTJfbXB5X2FjY19zYXRfbGxfczEsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5zYXQubGwuczEKKyAgICBoZXhhZ29uX00yX21weV9oaF9zMCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5oaC5zMAorICAgIGhleGFnb25fTTJfbXB5X2hoX3MxLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LmhoLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfaGxfczAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuaGwuczAKKyAgICBoZXhhZ29uX00yX21weV9obF9zMSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5obC5zMQorICAgIGhleGFnb25fTTJfbXB5X2xoX3MwLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LmxoLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfbGhfczEsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubGguczEKKyAgICBoZXhhZ29uX00yX21weV9sbF9zMCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5sbC5zMAorICAgIGhleGFnb25fTTJfbXB5X2xsX3MxLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LmxsLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfbmFjX2hoX3MwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLmhoLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfbmFjX2hoX3MxLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLmhoLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfbmFjX2hsX3MwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLmhsLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfbmFjX2hsX3MxLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLmhsLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfbmFjX2xoX3MwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLmxoLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfbmFjX2xoX3MxLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLmxoLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfbmFjX2xsX3MwLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLmxsLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfbmFjX2xsX3MxLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLmxsLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfbmFjX3NhdF9oaF9zMCwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLnNhdC5oaC5zMAorICAgIGhleGFnb25fTTJfbXB5X25hY19zYXRfaGhfczEsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5zYXQuaGguczEKKyAgICBoZXhhZ29uX00yX21weV9uYWNfc2F0X2hsX3MwLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuc2F0LmhsLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfbmFjX3NhdF9obF9zMSwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLnNhdC5obC5zMQorICAgIGhleGFnb25fTTJfbXB5X25hY19zYXRfbGhfczAsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5zYXQubGguczAKKyAgICBoZXhhZ29uX00yX21weV9uYWNfc2F0X2xoX3MxLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuc2F0LmxoLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfbmFjX3NhdF9sbF9zMCwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLnNhdC5sbC5zMAorICAgIGhleGFnb25fTTJfbXB5X25hY19zYXRfbGxfczEsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5zYXQubGwuczEKKyAgICBoZXhhZ29uX00yX21weV9ybmRfaGhfczAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5ybmQuaGguczAKKyAgICBoZXhhZ29uX00yX21weV9ybmRfaGhfczEsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5ybmQuaGguczEKKyAgICBoZXhhZ29uX00yX21weV9ybmRfaGxfczAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5ybmQuaGwuczAKKyAgICBoZXhhZ29uX00yX21weV9ybmRfaGxfczEsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5ybmQuaGwuczEKKyAgICBoZXhhZ29uX00yX21weV9ybmRfbGhfczAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5ybmQubGguczAKKyAgICBoZXhhZ29uX00yX21weV9ybmRfbGhfczEsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5ybmQubGguczEKKyAgICBoZXhhZ29uX00yX21weV9ybmRfbGxfczAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5ybmQubGwuczAKKyAgICBoZXhhZ29uX00yX21weV9ybmRfbGxfczEsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5ybmQubGwuczEKKyAgICBoZXhhZ29uX00yX21weV9zYXRfaGhfczAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5zYXQuaGguczAKKyAgICBoZXhhZ29uX00yX21weV9zYXRfaGhfczEsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5zYXQuaGguczEKKyAgICBoZXhhZ29uX00yX21weV9zYXRfaGxfczAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5zYXQuaGwuczAKKyAgICBoZXhhZ29uX00yX21weV9zYXRfaGxfczEsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5zYXQuaGwuczEKKyAgICBoZXhhZ29uX00yX21weV9zYXRfbGhfczAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5zYXQubGguczAKKyAgICBoZXhhZ29uX00yX21weV9zYXRfbGhfczEsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5zYXQubGguczEKKyAgICBoZXhhZ29uX00yX21weV9zYXRfbGxfczAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5zYXQubGwuczAKKyAgICBoZXhhZ29uX00yX21weV9zYXRfbGxfczEsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5zYXQubGwuczEKKyAgICBoZXhhZ29uX00yX21weV9zYXRfcm5kX2hoX3MwLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5zYXQucm5kLmhoLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9oaF9zMSwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LnJuZC5oaC5zMQorICAgIGhleGFnb25fTTJfbXB5X3NhdF9ybmRfaGxfczAsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LnNhdC5ybmQuaGwuczAKKyAgICBoZXhhZ29uX00yX21weV9zYXRfcm5kX2hsX3MxLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5zYXQucm5kLmhsLnMxCisgICAgaGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9saF9zMCwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LnJuZC5saC5zMAorICAgIGhleGFnb25fTTJfbXB5X3NhdF9ybmRfbGhfczEsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LnNhdC5ybmQubGguczEKKyAgICBoZXhhZ29uX00yX21weV9zYXRfcm5kX2xsX3MwLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5zYXQucm5kLmxsLnMwCisgICAgaGV4YWdvbl9NMl9tcHlfc2F0X3JuZF9sbF9zMSwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LnJuZC5sbC5zMQorICAgIGhleGFnb25fTTJfbXB5X3VwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5LnVwCisgICAgaGV4YWdvbl9NMl9tcHlfdXBfczEsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkudXAuczEKKyAgICBoZXhhZ29uX00yX21weV91cF9zMV9zYXQsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS51cC5zMS5zYXQKKyAgICBoZXhhZ29uX00yX21weWRfYWNjX2hoX3MwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQuYWNjLmhoLnMwCisgICAgaGV4YWdvbl9NMl9tcHlkX2FjY19oaF9zMSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLmFjYy5oaC5zMQorICAgIGhleGFnb25fTTJfbXB5ZF9hY2NfaGxfczAsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5hY2MuaGwuczAKKyAgICBoZXhhZ29uX00yX21weWRfYWNjX2hsX3MxLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQuYWNjLmhsLnMxCisgICAgaGV4YWdvbl9NMl9tcHlkX2FjY19saF9zMCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLmFjYy5saC5zMAorICAgIGhleGFnb25fTTJfbXB5ZF9hY2NfbGhfczEsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5hY2MubGguczEKKyAgICBoZXhhZ29uX00yX21weWRfYWNjX2xsX3MwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQuYWNjLmxsLnMwCisgICAgaGV4YWdvbl9NMl9tcHlkX2FjY19sbF9zMSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLmFjYy5sbC5zMQorICAgIGhleGFnb25fTTJfbXB5ZF9oaF9zMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5oaC5zMAorICAgIGhleGFnb25fTTJfbXB5ZF9oaF9zMSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5oaC5zMQorICAgIGhleGFnb25fTTJfbXB5ZF9obF9zMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5obC5zMAorICAgIGhleGFnb25fTTJfbXB5ZF9obF9zMSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5obC5zMQorICAgIGhleGFnb25fTTJfbXB5ZF9saF9zMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5saC5zMAorICAgIGhleGFnb25fTTJfbXB5ZF9saF9zMSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5saC5zMQorICAgIGhleGFnb25fTTJfbXB5ZF9sbF9zMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5sbC5zMAorICAgIGhleGFnb25fTTJfbXB5ZF9sbF9zMSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5sbC5zMQorICAgIGhleGFnb25fTTJfbXB5ZF9uYWNfaGhfczAsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5uYWMuaGguczAKKyAgICBoZXhhZ29uX00yX21weWRfbmFjX2hoX3MxLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQubmFjLmhoLnMxCisgICAgaGV4YWdvbl9NMl9tcHlkX25hY19obF9zMCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLm5hYy5obC5zMAorICAgIGhleGFnb25fTTJfbXB5ZF9uYWNfaGxfczEsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5uYWMuaGwuczEKKyAgICBoZXhhZ29uX00yX21weWRfbmFjX2xoX3MwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQubmFjLmxoLnMwCisgICAgaGV4YWdvbl9NMl9tcHlkX25hY19saF9zMSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLm5hYy5saC5zMQorICAgIGhleGFnb25fTTJfbXB5ZF9uYWNfbGxfczAsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5uYWMubGwuczAKKyAgICBoZXhhZ29uX00yX21weWRfbmFjX2xsX3MxLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQubmFjLmxsLnMxCisgICAgaGV4YWdvbl9NMl9tcHlkX3JuZF9oaF9zMCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLnJuZC5oaC5zMAorICAgIGhleGFnb25fTTJfbXB5ZF9ybmRfaGhfczEsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5ybmQuaGguczEKKyAgICBoZXhhZ29uX00yX21weWRfcm5kX2hsX3MwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQucm5kLmhsLnMwCisgICAgaGV4YWdvbl9NMl9tcHlkX3JuZF9obF9zMSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLnJuZC5obC5zMQorICAgIGhleGFnb25fTTJfbXB5ZF9ybmRfbGhfczAsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5ybmQubGguczAKKyAgICBoZXhhZ29uX00yX21weWRfcm5kX2xoX3MxLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQucm5kLmxoLnMxCisgICAgaGV4YWdvbl9NMl9tcHlkX3JuZF9sbF9zMCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLnJuZC5sbC5zMAorICAgIGhleGFnb25fTTJfbXB5ZF9ybmRfbGxfczEsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5ybmQubGwuczEKKyAgICBoZXhhZ29uX00yX21weWksICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWkKKyAgICBoZXhhZ29uX00yX21weXNtaSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXNtaQorICAgIGhleGFnb25fTTJfbXB5c3VfdXAsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5c3UudXAKKyAgICBoZXhhZ29uX00yX21weXVfYWNjX2hoX3MwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUuYWNjLmhoLnMwCisgICAgaGV4YWdvbl9NMl9tcHl1X2FjY19oaF9zMSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LmFjYy5oaC5zMQorICAgIGhleGFnb25fTTJfbXB5dV9hY2NfaGxfczAsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5hY2MuaGwuczAKKyAgICBoZXhhZ29uX00yX21weXVfYWNjX2hsX3MxLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUuYWNjLmhsLnMxCisgICAgaGV4YWdvbl9NMl9tcHl1X2FjY19saF9zMCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LmFjYy5saC5zMAorICAgIGhleGFnb25fTTJfbXB5dV9hY2NfbGhfczEsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5hY2MubGguczEKKyAgICBoZXhhZ29uX00yX21weXVfYWNjX2xsX3MwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUuYWNjLmxsLnMwCisgICAgaGV4YWdvbl9NMl9tcHl1X2FjY19sbF9zMSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LmFjYy5sbC5zMQorICAgIGhleGFnb25fTTJfbXB5dV9oaF9zMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5oaC5zMAorICAgIGhleGFnb25fTTJfbXB5dV9oaF9zMSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5oaC5zMQorICAgIGhleGFnb25fTTJfbXB5dV9obF9zMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5obC5zMAorICAgIGhleGFnb25fTTJfbXB5dV9obF9zMSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5obC5zMQorICAgIGhleGFnb25fTTJfbXB5dV9saF9zMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5saC5zMAorICAgIGhleGFnb25fTTJfbXB5dV9saF9zMSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5saC5zMQorICAgIGhleGFnb25fTTJfbXB5dV9sbF9zMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5sbC5zMAorICAgIGhleGFnb25fTTJfbXB5dV9sbF9zMSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5sbC5zMQorICAgIGhleGFnb25fTTJfbXB5dV9uYWNfaGhfczAsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5uYWMuaGguczAKKyAgICBoZXhhZ29uX00yX21weXVfbmFjX2hoX3MxLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUubmFjLmhoLnMxCisgICAgaGV4YWdvbl9NMl9tcHl1X25hY19obF9zMCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1Lm5hYy5obC5zMAorICAgIGhleGFnb25fTTJfbXB5dV9uYWNfaGxfczEsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5uYWMuaGwuczEKKyAgICBoZXhhZ29uX00yX21weXVfbmFjX2xoX3MwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUubmFjLmxoLnMwCisgICAgaGV4YWdvbl9NMl9tcHl1X25hY19saF9zMSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1Lm5hYy5saC5zMQorICAgIGhleGFnb25fTTJfbXB5dV9uYWNfbGxfczAsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5uYWMubGwuczAKKyAgICBoZXhhZ29uX00yX21weXVfbmFjX2xsX3MxLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUubmFjLmxsLnMxCisgICAgaGV4YWdvbl9NMl9tcHl1X3VwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LnVwCisgICAgaGV4YWdvbl9NMl9tcHl1ZF9hY2NfaGhfczAsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5hY2MuaGguczAKKyAgICBoZXhhZ29uX00yX21weXVkX2FjY19oaF9zMSwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmFjYy5oaC5zMQorICAgIGhleGFnb25fTTJfbXB5dWRfYWNjX2hsX3MwLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQuYWNjLmhsLnMwCisgICAgaGV4YWdvbl9NMl9tcHl1ZF9hY2NfaGxfczEsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5hY2MuaGwuczEKKyAgICBoZXhhZ29uX00yX21weXVkX2FjY19saF9zMCwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmFjYy5saC5zMAorICAgIGhleGFnb25fTTJfbXB5dWRfYWNjX2xoX3MxLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQuYWNjLmxoLnMxCisgICAgaGV4YWdvbl9NMl9tcHl1ZF9hY2NfbGxfczAsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5hY2MubGwuczAKKyAgICBoZXhhZ29uX00yX21weXVkX2FjY19sbF9zMSwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmFjYy5sbC5zMQorICAgIGhleGFnb25fTTJfbXB5dWRfaGhfczAsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQuaGguczAKKyAgICBoZXhhZ29uX00yX21weXVkX2hoX3MxLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmhoLnMxCisgICAgaGV4YWdvbl9NMl9tcHl1ZF9obF9zMCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5obC5zMAorICAgIGhleGFnb25fTTJfbXB5dWRfaGxfczEsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQuaGwuczEKKyAgICBoZXhhZ29uX00yX21weXVkX2xoX3MwLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmxoLnMwCisgICAgaGV4YWdvbl9NMl9tcHl1ZF9saF9zMSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5saC5zMQorICAgIGhleGFnb25fTTJfbXB5dWRfbGxfczAsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQubGwuczAKKyAgICBoZXhhZ29uX00yX21weXVkX2xsX3MxLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmxsLnMxCisgICAgaGV4YWdvbl9NMl9tcHl1ZF9uYWNfaGhfczAsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5uYWMuaGguczAKKyAgICBoZXhhZ29uX00yX21weXVkX25hY19oaF9zMSwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLm5hYy5oaC5zMQorICAgIGhleGFnb25fTTJfbXB5dWRfbmFjX2hsX3MwLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQubmFjLmhsLnMwCisgICAgaGV4YWdvbl9NMl9tcHl1ZF9uYWNfaGxfczEsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5uYWMuaGwuczEKKyAgICBoZXhhZ29uX00yX21weXVkX25hY19saF9zMCwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLm5hYy5saC5zMAorICAgIGhleGFnb25fTTJfbXB5dWRfbmFjX2xoX3MxLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQubmFjLmxoLnMxCisgICAgaGV4YWdvbl9NMl9tcHl1ZF9uYWNfbGxfczAsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5uYWMubGwuczAKKyAgICBoZXhhZ29uX00yX21weXVkX25hY19sbF9zMSwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLm5hYy5sbC5zMQorICAgIGhleGFnb25fTTJfbXB5dWksICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIubXB5dWkKKyAgICBoZXhhZ29uX00yX25hY2NpLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLm5hY2NpCisgICAgaGV4YWdvbl9NMl9uYWNjaWksICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi5uYWNjaWkKKyAgICBoZXhhZ29uX00yX3N1YmFjYywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnN1YmFjYworICAgIGhleGFnb25fTTJfdmFic2RpZmZoLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudmFic2RpZmZoCisgICAgaGV4YWdvbl9NMl92YWJzZGlmZncsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52YWJzZGlmZncKKyAgICBoZXhhZ29uX00yX3ZjbWFjX3MwX3NhdF9pLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZjbWFjLnMwLnNhdC5pCisgICAgaGV4YWdvbl9NMl92Y21hY19zMF9zYXRfciwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52Y21hYy5zMC5zYXQucgorICAgIGhleGFnb25fTTJfdmNtcHlfczBfc2F0X2ksICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudmNtcHkuczAuc2F0LmkKKyAgICBoZXhhZ29uX00yX3ZjbXB5X3MwX3NhdF9yLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZjbXB5LnMwLnNhdC5yCisgICAgaGV4YWdvbl9NMl92Y21weV9zMV9zYXRfaSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52Y21weS5zMS5zYXQuaQorICAgIGhleGFnb25fTTJfdmNtcHlfczFfc2F0X3IsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudmNtcHkuczEuc2F0LnIKKyAgICBoZXhhZ29uX00yX3ZkbWFjc19zMCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZkbWFjcy5zMAorICAgIGhleGFnb25fTTJfdmRtYWNzX3MxLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudmRtYWNzLnMxCisgICAgaGV4YWdvbl9NMl92ZG1weXJzX3MwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52ZG1weXJzLnMwCisgICAgaGV4YWdvbl9NMl92ZG1weXJzX3MxLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52ZG1weXJzLnMxCisgICAgaGV4YWdvbl9NMl92ZG1weXNfczAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52ZG1weXMuczAKKyAgICBoZXhhZ29uX00yX3ZkbXB5c19zMSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZkbXB5cy5zMQorICAgIGhleGFnb25fTTJfdm1hYzIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudm1hYzIKKyAgICBoZXhhZ29uX00yX3ZtYWMyZXMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZtYWMyZXMKKyAgICBoZXhhZ29uX00yX3ZtYWMyZXNfczAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZtYWMyZXMuczAKKyAgICBoZXhhZ29uX00yX3ZtYWMyZXNfczEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZtYWMyZXMuczEKKyAgICBoZXhhZ29uX00yX3ZtYWMyc19zMCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZtYWMycy5zMAorICAgIGhleGFnb25fTTJfdm1hYzJzX3MxLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudm1hYzJzLnMxCisgICAgaGV4YWdvbl9NMl92bWFjMnN1X3MwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52bWFjMnN1LnMwCisgICAgaGV4YWdvbl9NMl92bWFjMnN1X3MxLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52bWFjMnN1LnMxCisgICAgaGV4YWdvbl9NMl92bXB5MmVzX3MwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52bXB5MmVzLnMwCisgICAgaGV4YWdvbl9NMl92bXB5MmVzX3MxLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52bXB5MmVzLnMxCisgICAgaGV4YWdvbl9NMl92bXB5MnNfczAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52bXB5MnMuczAKKyAgICBoZXhhZ29uX00yX3ZtcHkyc19zMHBhY2ssICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZtcHkycy5zMHBhY2sKKyAgICBoZXhhZ29uX00yX3ZtcHkyc19zMSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZtcHkycy5zMQorICAgIGhleGFnb25fTTJfdm1weTJzX3MxcGFjaywgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudm1weTJzLnMxcGFjaworICAgIGhleGFnb25fTTJfdm1weTJzdV9zMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudm1weTJzdS5zMAorICAgIGhleGFnb25fTTJfdm1weTJzdV9zMSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudm1weTJzdS5zMQorICAgIGhleGFnb25fTTJfdnJhZGRoLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudnJhZGRoCisgICAgaGV4YWdvbl9NMl92cmFkZHVoLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52cmFkZHVoCisgICAgaGV4YWdvbl9NMl92cmNtYWNpX3MwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52cmNtYWNpLnMwCisgICAgaGV4YWdvbl9NMl92cmNtYWNpX3MwYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52cmNtYWNpLnMwYworICAgIGhleGFnb25fTTJfdnJjbWFjcl9zMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudnJjbWFjci5zMAorICAgIGhleGFnb25fTTJfdnJjbWFjcl9zMGMsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudnJjbWFjci5zMGMKKyAgICBoZXhhZ29uX00yX3ZyY21weWlfczAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZyY21weWkuczAKKyAgICBoZXhhZ29uX00yX3ZyY21weWlfczBjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZyY21weWkuczBjCisgICAgaGV4YWdvbl9NMl92cmNtcHlyX3MwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52cmNtcHlyLnMwCisgICAgaGV4YWdvbl9NMl92cmNtcHlyX3MwYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi52cmNtcHlyLnMwYworICAgIGhleGFnb25fTTJfdnJjbXB5c19hY2NfczEsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudnJjbXB5cy5hY2MuczEKKyAgICBoZXhhZ29uX00yX3ZyY21weXNfczEsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZyY21weXMuczEKKyAgICBoZXhhZ29uX00yX3ZyY21weXNfczFycCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZyY21weXMuczFycAorICAgIGhleGFnb25fTTJfdnJtYWNfczAsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTIudnJtYWMuczAKKyAgICBoZXhhZ29uX00yX3ZybXB5X3MwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk0yLnZybXB5LnMwCisgICAgaGV4YWdvbl9NMl94b3JfeGFjYywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NMi54b3IueGFjYworICAgIGhleGFnb25fTTRfYW5kX2FuZCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQuYW5kLmFuZAorICAgIGhleGFnb25fTTRfYW5kX2FuZG4sICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQuYW5kLmFuZG4KKyAgICBoZXhhZ29uX000X2FuZF9vciwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00LmFuZC5vcgorICAgIGhleGFnb25fTTRfYW5kX3hvciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQuYW5kLnhvcgorICAgIGhleGFnb25fTTRfY21weWlfd2gsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQuY21weWkud2gKKyAgICBoZXhhZ29uX000X2NtcHlpX3doYywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00LmNtcHlpLndoYworICAgIGhleGFnb25fTTRfY21weXJfd2gsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQuY21weXIud2gKKyAgICBoZXhhZ29uX000X2NtcHlyX3doYywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00LmNtcHlyLndoYworICAgIGhleGFnb25fTTRfbWFjX3VwX3MxX3NhdCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQubWFjLnVwLnMxLnNhdAorICAgIGhleGFnb25fTTRfbXB5cmlfYWRkaSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQubXB5cmkuYWRkaQorICAgIGhleGFnb25fTTRfbXB5cmlfYWRkciwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQubXB5cmkuYWRkcgorICAgIGhleGFnb25fTTRfbXB5cmlfYWRkcl91MiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQubXB5cmkuYWRkci51MgorICAgIGhleGFnb25fTTRfbXB5cnJfYWRkaSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQubXB5cnIuYWRkaQorICAgIGhleGFnb25fTTRfbXB5cnJfYWRkciwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQubXB5cnIuYWRkcgorICAgIGhleGFnb25fTTRfbmFjX3VwX3MxX3NhdCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQubmFjLnVwLnMxLnNhdAorICAgIGhleGFnb25fTTRfb3JfYW5kLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQub3IuYW5kCisgICAgaGV4YWdvbl9NNF9vcl9hbmRuLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNC5vci5hbmRuCisgICAgaGV4YWdvbl9NNF9vcl9vciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNC5vci5vcgorICAgIGhleGFnb25fTTRfb3JfeG9yLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQub3IueG9yCisgICAgaGV4YWdvbl9NNF9wbXB5dywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNC5wbXB5dworICAgIGhleGFnb25fTTRfcG1weXdfYWNjLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQucG1weXcuYWNjCisgICAgaGV4YWdvbl9NNF92cG1weWgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNC52cG1weWgKKyAgICBoZXhhZ29uX000X3ZwbXB5aF9hY2MsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00LnZwbXB5aC5hY2MKKyAgICBoZXhhZ29uX000X3ZybXB5ZWhfYWNjX3MwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00LnZybXB5ZWguYWNjLnMwCisgICAgaGV4YWdvbl9NNF92cm1weWVoX2FjY19zMSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNC52cm1weWVoLmFjYy5zMQorICAgIGhleGFnb25fTTRfdnJtcHllaF9zMCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQudnJtcHllaC5zMAorICAgIGhleGFnb25fTTRfdnJtcHllaF9zMSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQudnJtcHllaC5zMQorICAgIGhleGFnb25fTTRfdnJtcHlvaF9hY2NfczAsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQudnJtcHlvaC5hY2MuczAKKyAgICBoZXhhZ29uX000X3ZybXB5b2hfYWNjX3MxLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk00LnZybXB5b2guYWNjLnMxCisgICAgaGV4YWdvbl9NNF92cm1weW9oX3MwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNC52cm1weW9oLnMwCisgICAgaGV4YWdvbl9NNF92cm1weW9oX3MxLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNC52cm1weW9oLnMxCisgICAgaGV4YWdvbl9NNF94b3JfYW5kLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNC54b3IuYW5kCisgICAgaGV4YWdvbl9NNF94b3JfYW5kbiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNC54b3IuYW5kbgorICAgIGhleGFnb25fTTRfeG9yX29yLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTQueG9yLm9yCisgICAgaGV4YWdvbl9NNF94b3JfeGFjYywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNC54b3IueGFjYworICAgIGhleGFnb25fTTVfdmRtYWNic3UsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTUudmRtYWNic3UKKyAgICBoZXhhZ29uX001X3ZkbXB5YnN1LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk01LnZkbXB5YnN1CisgICAgaGV4YWdvbl9NNV92bWFjYnN1LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNS52bWFjYnN1CisgICAgaGV4YWdvbl9NNV92bWFjYnV1LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNS52bWFjYnV1CisgICAgaGV4YWdvbl9NNV92bXB5YnN1LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNS52bXB5YnN1CisgICAgaGV4YWdvbl9NNV92bXB5YnV1LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNS52bXB5YnV1CisgICAgaGV4YWdvbl9NNV92cm1hY2JzdSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNS52cm1hY2JzdQorICAgIGhleGFnb25fTTVfdnJtYWNidXUsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTUudnJtYWNidXUKKyAgICBoZXhhZ29uX001X3ZybXB5YnN1LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLk01LnZybXB5YnN1CisgICAgaGV4YWdvbl9NNV92cm1weWJ1dSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNS52cm1weWJ1dQorICAgIGhleGFnb25fTTZfdmFic2RpZmZiLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uTTYudmFic2RpZmZiCisgICAgaGV4YWdvbl9NNl92YWJzZGlmZnViLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5NNi52YWJzZGlmZnViCisgICAgaGV4YWdvbl9TMl9hZGRhc2xfcnJyaSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hZGRhc2wucnJyaQorICAgIGhleGFnb25fUzJfYXNsX2lfcCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkucAorICAgIGhleGFnb25fUzJfYXNsX2lfcF9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkucC5hY2MKKyAgICBoZXhhZ29uX1MyX2FzbF9pX3BfYW5kLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5pLnAuYW5kCisgICAgaGV4YWdvbl9TMl9hc2xfaV9wX25hYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuaS5wLm5hYworICAgIGhleGFnb25fUzJfYXNsX2lfcF9vciwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkucC5vcgorICAgIGhleGFnb25fUzJfYXNsX2lfcF94YWNjLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkucC54YWNjCisgICAgaGV4YWdvbl9TMl9hc2xfaV9yLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuaS5yCisgICAgaGV4YWdvbl9TMl9hc2xfaV9yX2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuaS5yLmFjYworICAgIGhleGFnb25fUzJfYXNsX2lfcl9hbmQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkuci5hbmQKKyAgICBoZXhhZ29uX1MyX2FzbF9pX3JfbmFjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5pLnIubmFjCisgICAgaGV4YWdvbl9TMl9hc2xfaV9yX29yLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuaS5yLm9yCisgICAgaGV4YWdvbl9TMl9hc2xfaV9yX3NhdCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuaS5yLnNhdAorICAgIGhleGFnb25fUzJfYXNsX2lfcl94YWNjLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkuci54YWNjCisgICAgaGV4YWdvbl9TMl9hc2xfaV92aCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuaS52aAorICAgIGhleGFnb25fUzJfYXNsX2lfdncsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkudncKKyAgICBoZXhhZ29uX1MyX2FzbF9yX3AsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnAKKyAgICBoZXhhZ29uX1MyX2FzbF9yX3BfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnAuYWNjCisgICAgaGV4YWdvbl9TMl9hc2xfcl9wX2FuZCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuci5wLmFuZAorICAgIGhleGFnb25fUzJfYXNsX3JfcF9uYWMsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLnIucC5uYWMKKyAgICBoZXhhZ29uX1MyX2FzbF9yX3Bfb3IsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnAub3IKKyAgICBoZXhhZ29uX1MyX2FzbF9yX3BfeG9yLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnAueG9yCisgICAgaGV4YWdvbl9TMl9hc2xfcl9yLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuci5yCisgICAgaGV4YWdvbl9TMl9hc2xfcl9yX2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuci5yLmFjYworICAgIGhleGFnb25fUzJfYXNsX3Jfcl9hbmQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLnIuci5hbmQKKyAgICBoZXhhZ29uX1MyX2FzbF9yX3JfbmFjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnIubmFjCisgICAgaGV4YWdvbl9TMl9hc2xfcl9yX29yLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuci5yLm9yCisgICAgaGV4YWdvbl9TMl9hc2xfcl9yX3NhdCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuci5yLnNhdAorICAgIGhleGFnb25fUzJfYXNsX3JfdmgsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNsLnIudmgKKyAgICBoZXhhZ29uX1MyX2FzbF9yX3Z3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnZ3CisgICAgaGV4YWdvbl9TMl9hc3JfaV9wLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5wCisgICAgaGV4YWdvbl9TMl9hc3JfaV9wX2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5wLmFjYworICAgIGhleGFnb25fUzJfYXNyX2lfcF9hbmQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkucC5hbmQKKyAgICBoZXhhZ29uX1MyX2Fzcl9pX3BfbmFjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5pLnAubmFjCisgICAgaGV4YWdvbl9TMl9hc3JfaV9wX29yLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5wLm9yCisgICAgaGV4YWdvbl9TMl9hc3JfaV9wX3JuZCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5wLnJuZAorICAgIGhleGFnb25fUzJfYXNyX2lfcF9ybmRfZ29vZHN5bnRheCwgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkucC5ybmQuZ29vZHN5bnRheAorICAgIGhleGFnb25fUzJfYXNyX2lfciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkucgorICAgIGhleGFnb25fUzJfYXNyX2lfcl9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkuci5hY2MKKyAgICBoZXhhZ29uX1MyX2Fzcl9pX3JfYW5kLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5pLnIuYW5kCisgICAgaGV4YWdvbl9TMl9hc3JfaV9yX25hYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5yLm5hYworICAgIGhleGFnb25fUzJfYXNyX2lfcl9vciwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkuci5vcgorICAgIGhleGFnb25fUzJfYXNyX2lfcl9ybmQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkuci5ybmQKKyAgICBoZXhhZ29uX1MyX2Fzcl9pX3Jfcm5kX2dvb2RzeW50YXgsICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5pLnIucm5kLmdvb2RzeW50YXgKKyAgICBoZXhhZ29uX1MyX2Fzcl9pX3N2d190cnVuLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5pLnN2dy50cnVuCisgICAgaGV4YWdvbl9TMl9hc3JfaV92aCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS52aAorICAgIGhleGFnb25fUzJfYXNyX2lfdncsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkudncKKyAgICBoZXhhZ29uX1MyX2Fzcl9yX3AsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5yLnAKKyAgICBoZXhhZ29uX1MyX2Fzcl9yX3BfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5yLnAuYWNjCisgICAgaGV4YWdvbl9TMl9hc3Jfcl9wX2FuZCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci5wLmFuZAorICAgIGhleGFnb25fUzJfYXNyX3JfcF9uYWMsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIucC5uYWMKKyAgICBoZXhhZ29uX1MyX2Fzcl9yX3Bfb3IsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5yLnAub3IKKyAgICBoZXhhZ29uX1MyX2Fzcl9yX3BfeG9yLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5yLnAueG9yCisgICAgaGV4YWdvbl9TMl9hc3Jfcl9yLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci5yCisgICAgaGV4YWdvbl9TMl9hc3Jfcl9yX2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci5yLmFjYworICAgIGhleGFnb25fUzJfYXNyX3Jfcl9hbmQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIuci5hbmQKKyAgICBoZXhhZ29uX1MyX2Fzcl9yX3JfbmFjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5yLnIubmFjCisgICAgaGV4YWdvbl9TMl9hc3Jfcl9yX29yLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci5yLm9yCisgICAgaGV4YWdvbl9TMl9hc3Jfcl9yX3NhdCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci5yLnNhdAorICAgIGhleGFnb25fUzJfYXNyX3Jfc3Z3X3RydW4sICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIuc3Z3LnRydW4KKyAgICBoZXhhZ29uX1MyX2Fzcl9yX3ZoLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5yLnZoCisgICAgaGV4YWdvbl9TMl9hc3Jfcl92dywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci52dworICAgIGhleGFnb25fUzJfYnJldiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYnJldgorICAgIGhleGFnb25fUzJfYnJldnAsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuYnJldnAKKyAgICBoZXhhZ29uX1MyX2NhYmFjZW5jYmluLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmNhYmFjZW5jYmluCisgICAgaGV4YWdvbl9TMl9jbDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5jbDAKKyAgICBoZXhhZ29uX1MyX2NsMHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmNsMHAKKyAgICBoZXhhZ29uX1MyX2NsMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmNsMQorICAgIGhleGFnb25fUzJfY2wxcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuY2wxcAorICAgIGhleGFnb25fUzJfY2xiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuY2xiCisgICAgaGV4YWdvbl9TMl9jbGJub3JtLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5jbGJub3JtCisgICAgaGV4YWdvbl9TMl9jbGJwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5jbGJwCisgICAgaGV4YWdvbl9TMl9jbHJiaXRfaSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5jbHJiaXQuaQorICAgIGhleGFnb25fUzJfY2xyYml0X3IsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuY2xyYml0LnIKKyAgICBoZXhhZ29uX1MyX2N0MCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmN0MAorICAgIGhleGFnb25fUzJfY3QwcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuY3QwcAorICAgIGhleGFnb25fUzJfY3QxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuY3QxCisgICAgaGV4YWdvbl9TMl9jdDFwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5jdDFwCisgICAgaGV4YWdvbl9TMl9kZWludGVybGVhdmUsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5kZWludGVybGVhdmUKKyAgICBoZXhhZ29uX1MyX2V4dHJhY3R1LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmV4dHJhY3R1CisgICAgaGV4YWdvbl9TMl9leHRyYWN0dV9ycCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5leHRyYWN0dS5ycAorICAgIGhleGFnb25fUzJfZXh0cmFjdHVwLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuZXh0cmFjdHVwCisgICAgaGV4YWdvbl9TMl9leHRyYWN0dXBfcnAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5leHRyYWN0dXAucnAKKyAgICBoZXhhZ29uX1MyX2luc2VydCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmluc2VydAorICAgIGhleGFnb25fUzJfaW5zZXJ0X3JwLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuaW5zZXJ0LnJwCisgICAgaGV4YWdvbl9TMl9pbnNlcnRwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5pbnNlcnRwCisgICAgaGV4YWdvbl9TMl9pbnNlcnRwX3JwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5pbnNlcnRwLnJwCisgICAgaGV4YWdvbl9TMl9pbnRlcmxlYXZlLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5pbnRlcmxlYXZlCisgICAgaGV4YWdvbl9TMl9sZnNwLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sZnNwCisgICAgaGV4YWdvbl9TMl9sc2xfcl9wLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc2wuci5wCisgICAgaGV4YWdvbl9TMl9sc2xfcl9wX2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc2wuci5wLmFjYworICAgIGhleGFnb25fUzJfbHNsX3JfcF9hbmQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNsLnIucC5hbmQKKyAgICBoZXhhZ29uX1MyX2xzbF9yX3BfbmFjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzbC5yLnAubmFjCisgICAgaGV4YWdvbl9TMl9sc2xfcl9wX29yLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc2wuci5wLm9yCisgICAgaGV4YWdvbl9TMl9sc2xfcl9wX3hvciwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc2wuci5wLnhvcgorICAgIGhleGFnb25fUzJfbHNsX3JfciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNsLnIucgorICAgIGhleGFnb25fUzJfbHNsX3Jfcl9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNsLnIuci5hY2MKKyAgICBoZXhhZ29uX1MyX2xzbF9yX3JfYW5kLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzbC5yLnIuYW5kCisgICAgaGV4YWdvbl9TMl9sc2xfcl9yX25hYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc2wuci5yLm5hYworICAgIGhleGFnb25fUzJfbHNsX3Jfcl9vciwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNsLnIuci5vcgorICAgIGhleGFnb25fUzJfbHNsX3JfdmgsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNsLnIudmgKKyAgICBoZXhhZ29uX1MyX2xzbF9yX3Z3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzbC5yLnZ3CisgICAgaGV4YWdvbl9TMl9sc3JfaV9wLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS5wCisgICAgaGV4YWdvbl9TMl9sc3JfaV9wX2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS5wLmFjYworICAgIGhleGFnb25fUzJfbHNyX2lfcF9hbmQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNyLmkucC5hbmQKKyAgICBoZXhhZ29uX1MyX2xzcl9pX3BfbmFjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5pLnAubmFjCisgICAgaGV4YWdvbl9TMl9sc3JfaV9wX29yLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS5wLm9yCisgICAgaGV4YWdvbl9TMl9sc3JfaV9wX3hhY2MsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS5wLnhhY2MKKyAgICBoZXhhZ29uX1MyX2xzcl9pX3IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5pLnIKKyAgICBoZXhhZ29uX1MyX2xzcl9pX3JfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5pLnIuYWNjCisgICAgaGV4YWdvbl9TMl9sc3JfaV9yX2FuZCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS5yLmFuZAorICAgIGhleGFnb25fUzJfbHNyX2lfcl9uYWMsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNyLmkuci5uYWMKKyAgICBoZXhhZ29uX1MyX2xzcl9pX3Jfb3IsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5pLnIub3IKKyAgICBoZXhhZ29uX1MyX2xzcl9pX3JfeGFjYywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5pLnIueGFjYworICAgIGhleGFnb25fUzJfbHNyX2lfdmgsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNyLmkudmgKKyAgICBoZXhhZ29uX1MyX2xzcl9pX3Z3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5pLnZ3CisgICAgaGV4YWdvbl9TMl9sc3Jfcl9wLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3Iuci5wCisgICAgaGV4YWdvbl9TMl9sc3Jfcl9wX2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3Iuci5wLmFjYworICAgIGhleGFnb25fUzJfbHNyX3JfcF9hbmQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNyLnIucC5hbmQKKyAgICBoZXhhZ29uX1MyX2xzcl9yX3BfbmFjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5yLnAubmFjCisgICAgaGV4YWdvbl9TMl9sc3Jfcl9wX29yLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3Iuci5wLm9yCisgICAgaGV4YWdvbl9TMl9sc3Jfcl9wX3hvciwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3Iuci5wLnhvcgorICAgIGhleGFnb25fUzJfbHNyX3JfciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNyLnIucgorICAgIGhleGFnb25fUzJfbHNyX3Jfcl9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNyLnIuci5hY2MKKyAgICBoZXhhZ29uX1MyX2xzcl9yX3JfYW5kLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5yLnIuYW5kCisgICAgaGV4YWdvbl9TMl9sc3Jfcl9yX25hYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3Iuci5yLm5hYworICAgIGhleGFnb25fUzJfbHNyX3Jfcl9vciwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNyLnIuci5vcgorICAgIGhleGFnb25fUzJfbHNyX3JfdmgsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIubHNyLnIudmgKKyAgICBoZXhhZ29uX1MyX2xzcl9yX3Z3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5yLnZ3CisgICAgaGV4YWdvbl9TMl9wYWNraGwsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5wYWNraGwKKyAgICBoZXhhZ29uX1MyX3Bhcml0eXAsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnBhcml0eXAKKyAgICBoZXhhZ29uX1MyX3NldGJpdF9pLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnNldGJpdC5pCisgICAgaGV4YWdvbl9TMl9zZXRiaXRfciwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5zZXRiaXQucgorICAgIGhleGFnb25fUzJfc2h1ZmZlYiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuc2h1ZmZlYgorICAgIGhleGFnb25fUzJfc2h1ZmZlaCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuc2h1ZmZlaAorICAgIGhleGFnb25fUzJfc2h1ZmZvYiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuc2h1ZmZvYgorICAgIGhleGFnb25fUzJfc2h1ZmZvaCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuc2h1ZmZvaAorICAgIGhleGFnb25fUzJfc3RvcmVyYl9wYnIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmVyYi5wYnIKKyAgICBoZXhhZ29uX1MyX3N0b3JlcmJfcGNpLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3JlcmIucGNpCisgICAgaGV4YWdvbl9TMl9zdG9yZXJiX3BjciwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5zdG9yZXJiLnBjcgorICAgIGhleGFnb25fUzJfc3RvcmVyZF9wYnIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmVyZC5wYnIKKyAgICBoZXhhZ29uX1MyX3N0b3JlcmRfcGNpLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3JlcmQucGNpCisgICAgaGV4YWdvbl9TMl9zdG9yZXJkX3BjciwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5zdG9yZXJkLnBjcgorICAgIGhleGFnb25fUzJfc3RvcmVyZl9wYnIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmVyZi5wYnIKKyAgICBoZXhhZ29uX1MyX3N0b3JlcmZfcGNpLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3JlcmYucGNpCisgICAgaGV4YWdvbl9TMl9zdG9yZXJmX3BjciwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5zdG9yZXJmLnBjcgorICAgIGhleGFnb25fUzJfc3RvcmVyaF9wYnIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmVyaC5wYnIKKyAgICBoZXhhZ29uX1MyX3N0b3JlcmhfcGNpLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3JlcmgucGNpCisgICAgaGV4YWdvbl9TMl9zdG9yZXJoX3BjciwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5zdG9yZXJoLnBjcgorICAgIGhleGFnb25fUzJfc3RvcmVyaV9wYnIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmVyaS5wYnIKKyAgICBoZXhhZ29uX1MyX3N0b3JlcmlfcGNpLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3JlcmkucGNpCisgICAgaGV4YWdvbl9TMl9zdG9yZXJpX3BjciwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi5zdG9yZXJpLnBjcgorICAgIGhleGFnb25fUzJfc3RvcmV3X2xvY2tlZCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmV3LmxvY2tlZAorICAgIGhleGFnb25fUzJfc3ZzYXRoYiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuc3ZzYXRoYgorICAgIGhleGFnb25fUzJfc3ZzYXRodWIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIuc3ZzYXRodWIKKyAgICBoZXhhZ29uX1MyX3RhYmxlaWR4Yl9nb29kc3ludGF4LCAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnRhYmxlaWR4Yi5nb29kc3ludGF4CisgICAgaGV4YWdvbl9TMl90YWJsZWlkeGRfZ29vZHN5bnRheCwgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi50YWJsZWlkeGQuZ29vZHN5bnRheAorICAgIGhleGFnb25fUzJfdGFibGVpZHhoX2dvb2RzeW50YXgsICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudGFibGVpZHhoLmdvb2RzeW50YXgKKyAgICBoZXhhZ29uX1MyX3RhYmxlaWR4d19nb29kc3ludGF4LCAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnRhYmxlaWR4dy5nb29kc3ludGF4CisgICAgaGV4YWdvbl9TMl90b2dnbGViaXRfaSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi50b2dnbGViaXQuaQorICAgIGhleGFnb25fUzJfdG9nZ2xlYml0X3IsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudG9nZ2xlYml0LnIKKyAgICBoZXhhZ29uX1MyX3RzdGJpdF9pLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnRzdGJpdC5pCisgICAgaGV4YWdvbl9TMl90c3RiaXRfciwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi50c3RiaXQucgorICAgIGhleGFnb25fUzJfdmFsaWduaWIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudmFsaWduaWIKKyAgICBoZXhhZ29uX1MyX3ZhbGlnbnJiLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnZhbGlnbnJiCisgICAgaGV4YWdvbl9TMl92Y25lZ2gsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52Y25lZ2gKKyAgICBoZXhhZ29uX1MyX3Zjcm90YXRlLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnZjcm90YXRlCisgICAgaGV4YWdvbl9TMl92cmNuZWdoLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52cmNuZWdoCisgICAgaGV4YWdvbl9TMl92cm5kcGFja3doLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52cm5kcGFja3doCisgICAgaGV4YWdvbl9TMl92cm5kcGFja3docywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52cm5kcGFja3docworICAgIGhleGFnb25fUzJfdnNhdGhiLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudnNhdGhiCisgICAgaGV4YWdvbl9TMl92c2F0aGJfbm9wYWNrLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52c2F0aGIubm9wYWNrCisgICAgaGV4YWdvbl9TMl92c2F0aHViLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52c2F0aHViCisgICAgaGV4YWdvbl9TMl92c2F0aHViX25vcGFjaywgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52c2F0aHViLm5vcGFjaworICAgIGhleGFnb25fUzJfdnNhdHdoLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudnNhdHdoCisgICAgaGV4YWdvbl9TMl92c2F0d2hfbm9wYWNrLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52c2F0d2gubm9wYWNrCisgICAgaGV4YWdvbl9TMl92c2F0d3VoLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52c2F0d3VoCisgICAgaGV4YWdvbl9TMl92c2F0d3VoX25vcGFjaywgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52c2F0d3VoLm5vcGFjaworICAgIGhleGFnb25fUzJfdnNwbGF0cmIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudnNwbGF0cmIKKyAgICBoZXhhZ29uX1MyX3ZzcGxhdHJoLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnZzcGxhdHJoCisgICAgaGV4YWdvbl9TMl92c3BsaWNlaWIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52c3BsaWNlaWIKKyAgICBoZXhhZ29uX1MyX3ZzcGxpY2VyYiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnZzcGxpY2VyYgorICAgIGhleGFnb25fUzJfdnN4dGJoLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudnN4dGJoCisgICAgaGV4YWdvbl9TMl92c3h0aHcsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52c3h0aHcKKyAgICBoZXhhZ29uX1MyX3Z0cnVuZWhiLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnZ0cnVuZWhiCisgICAgaGV4YWdvbl9TMl92dHJ1bmV3aCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52dHJ1bmV3aAorICAgIGhleGFnb25fUzJfdnRydW5vaGIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzIudnRydW5vaGIKKyAgICBoZXhhZ29uX1MyX3Z0cnVub3doLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnZ0cnVub3doCisgICAgaGV4YWdvbl9TMl92enh0YmgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TMi52enh0YmgKKyAgICBoZXhhZ29uX1MyX3Z6eHRodywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlMyLnZ6eHRodworICAgIGhleGFnb25fUzRfYWRkYWRkaSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQuYWRkYWRkaQorICAgIGhleGFnb25fUzRfYWRkaV9hc2xfcmksICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQuYWRkaS5hc2wucmkKKyAgICBoZXhhZ29uX1M0X2FkZGlfbHNyX3JpLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0LmFkZGkubHNyLnJpCisgICAgaGV4YWdvbl9TNF9hbmRpX2FzbF9yaSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNC5hbmRpLmFzbC5yaQorICAgIGhleGFnb25fUzRfYW5kaV9sc3JfcmksICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQuYW5kaS5sc3IucmkKKyAgICBoZXhhZ29uX1M0X2NsYmFkZGksICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0LmNsYmFkZGkKKyAgICBoZXhhZ29uX1M0X2NsYnBhZGRpLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0LmNsYnBhZGRpCisgICAgaGV4YWdvbl9TNF9jbGJwbm9ybSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNC5jbGJwbm9ybQorICAgIGhleGFnb25fUzRfZXh0cmFjdCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQuZXh0cmFjdAorICAgIGhleGFnb25fUzRfZXh0cmFjdF9ycCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQuZXh0cmFjdC5ycAorICAgIGhleGFnb25fUzRfZXh0cmFjdHAsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQuZXh0cmFjdHAKKyAgICBoZXhhZ29uX1M0X2V4dHJhY3RwX3JwLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0LmV4dHJhY3RwLnJwCisgICAgaGV4YWdvbl9TNF9sc2xpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNC5sc2xpCisgICAgaGV4YWdvbl9TNF9udHN0Yml0X2ksICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNC5udHN0Yml0LmkKKyAgICBoZXhhZ29uX1M0X250c3RiaXRfciwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0Lm50c3RiaXQucgorICAgIGhleGFnb25fUzRfb3JfYW5kaSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQub3IuYW5kaQorICAgIGhleGFnb25fUzRfb3JfYW5kaXgsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQub3IuYW5kaXgKKyAgICBoZXhhZ29uX1M0X29yX29yaSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0Lm9yLm9yaQorICAgIGhleGFnb25fUzRfb3JpX2FzbF9yaSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQub3JpLmFzbC5yaQorICAgIGhleGFnb25fUzRfb3JpX2xzcl9yaSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQub3JpLmxzci5yaQorICAgIGhleGFnb25fUzRfcGFyaXR5LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQucGFyaXR5CisgICAgaGV4YWdvbl9TNF9zdG9yZWRfbG9ja2VkLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNC5zdG9yZWQubG9ja2VkCisgICAgaGV4YWdvbl9TNF9zdWJhZGRpLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNC5zdWJhZGRpCisgICAgaGV4YWdvbl9TNF9zdWJpX2FzbF9yaSwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNC5zdWJpLmFzbC5yaQorICAgIGhleGFnb25fUzRfc3ViaV9sc3JfcmksICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQuc3ViaS5sc3IucmkKKyAgICBoZXhhZ29uX1M0X3ZyY3JvdGF0ZSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0LnZyY3JvdGF0ZQorICAgIGhleGFnb25fUzRfdnJjcm90YXRlX2FjYywgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQudnJjcm90YXRlLmFjYworICAgIGhleGFnb25fUzRfdnhhZGRzdWJoLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQudnhhZGRzdWJoCisgICAgaGV4YWdvbl9TNF92eGFkZHN1YmhyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNC52eGFkZHN1YmhyCisgICAgaGV4YWdvbl9TNF92eGFkZHN1YncsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNC52eGFkZHN1YncKKyAgICBoZXhhZ29uX1M0X3Z4c3ViYWRkaCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM0LnZ4c3ViYWRkaAorICAgIGhleGFnb25fUzRfdnhzdWJhZGRociwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQudnhzdWJhZGRocgorICAgIGhleGFnb25fUzRfdnhzdWJhZGR3LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzQudnhzdWJhZGR3CisgICAgaGV4YWdvbl9TNV9hc3JodWJfcm5kX3NhdF9nb29kc3ludGF4LCAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNS5hc3JodWIucm5kLnNhdC5nb29kc3ludGF4CisgICAgaGV4YWdvbl9TNV9hc3JodWJfc2F0LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNS5hc3JodWIuc2F0CisgICAgaGV4YWdvbl9TNV9wb3Bjb3VudHAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNS5wb3Bjb3VudHAKKyAgICBoZXhhZ29uX1M1X3Zhc3Jocm5kX2dvb2RzeW50YXgsICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM1LnZhc3Jocm5kLmdvb2RzeW50YXgKKyAgICBoZXhhZ29uX1M2X3JvbF9pX3AsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM2LnJvbC5pLnAKKyAgICBoZXhhZ29uX1M2X3JvbF9pX3BfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM2LnJvbC5pLnAuYWNjCisgICAgaGV4YWdvbl9TNl9yb2xfaV9wX2FuZCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNi5yb2wuaS5wLmFuZAorICAgIGhleGFnb25fUzZfcm9sX2lfcF9uYWMsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzYucm9sLmkucC5uYWMKKyAgICBoZXhhZ29uX1M2X3JvbF9pX3Bfb3IsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM2LnJvbC5pLnAub3IKKyAgICBoZXhhZ29uX1M2X3JvbF9pX3BfeGFjYywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM2LnJvbC5pLnAueGFjYworICAgIGhleGFnb25fUzZfcm9sX2lfciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzYucm9sLmkucgorICAgIGhleGFnb25fUzZfcm9sX2lfcl9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzYucm9sLmkuci5hY2MKKyAgICBoZXhhZ29uX1M2X3JvbF9pX3JfYW5kLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM2LnJvbC5pLnIuYW5kCisgICAgaGV4YWdvbl9TNl9yb2xfaV9yX25hYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNi5yb2wuaS5yLm5hYworICAgIGhleGFnb25fUzZfcm9sX2lfcl9vciwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzYucm9sLmkuci5vcgorICAgIGhleGFnb25fUzZfcm9sX2lfcl94YWNjLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzYucm9sLmkuci54YWNjCisgICAgaGV4YWdvbl9TNl92c3BsYXRyYnAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5TNi52c3BsYXRyYnAKKyAgICBoZXhhZ29uX1M2X3Z0cnVuZWhiX3BwcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlM2LnZ0cnVuZWhiLnBwcAorICAgIGhleGFnb25fUzZfdnRydW5vaGJfcHBwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uUzYudnRydW5vaGIucHBwCisgICAgaGV4YWdvbl9WNl9leHRyYWN0dywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi5leHRyYWN0dworICAgIGhleGFnb25fVjZfZXh0cmFjdHdfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYuZXh0cmFjdHcuMTI4QgorICAgIGhleGFnb25fVjZfaGksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYuaGkKKyAgICBoZXhhZ29uX1Y2X2hpXzEyOEIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LmhpLjEyOEIKKyAgICBoZXhhZ29uX1Y2X2xvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LmxvCisgICAgaGV4YWdvbl9WNl9sb18xMjhCLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi5sby4xMjhCCisgICAgaGV4YWdvbl9WNl9sdnNwbGF0YiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi5sdnNwbGF0YgorICAgIGhleGFnb25fVjZfbHZzcGxhdGJfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYubHZzcGxhdGIuMTI4QgorICAgIGhleGFnb25fVjZfbHZzcGxhdGgsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYubHZzcGxhdGgKKyAgICBoZXhhZ29uX1Y2X2x2c3BsYXRoXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2Lmx2c3BsYXRoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X2x2c3BsYXR3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2Lmx2c3BsYXR3CisgICAgaGV4YWdvbl9WNl9sdnNwbGF0d18xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi5sdnNwbGF0dy4xMjhCCisgICAgaGV4YWdvbl9WNl9wcmVkX2FuZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi5wcmVkLmFuZAorICAgIGhleGFnb25fVjZfcHJlZF9hbmRfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5hbmQuMTI4QgorICAgIGhleGFnb25fVjZfcHJlZF9hbmRfbiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5hbmQubgorICAgIGhleGFnb25fVjZfcHJlZF9hbmRfbl8xMjhCLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5hbmQubi4xMjhCCisgICAgaGV4YWdvbl9WNl9wcmVkX25vdCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi5wcmVkLm5vdAorICAgIGhleGFnb25fVjZfcHJlZF9ub3RfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5ub3QuMTI4QgorICAgIGhleGFnb25fVjZfcHJlZF9vciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5vcgorICAgIGhleGFnb25fVjZfcHJlZF9vcl8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5vci4xMjhCCisgICAgaGV4YWdvbl9WNl9wcmVkX29yX24sICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi5wcmVkLm9yLm4KKyAgICBoZXhhZ29uX1Y2X3ByZWRfb3Jfbl8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnByZWQub3Iubi4xMjhCCisgICAgaGV4YWdvbl9WNl9wcmVkX3NjYWxhcjIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi5wcmVkLnNjYWxhcjIKKyAgICBoZXhhZ29uX1Y2X3ByZWRfc2NhbGFyMl8xMjhCLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnByZWQuc2NhbGFyMi4xMjhCCisgICAgaGV4YWdvbl9WNl9wcmVkX3NjYWxhcjJ2MiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi5wcmVkLnNjYWxhcjJ2MgorICAgIGhleGFnb25fVjZfcHJlZF9zY2FsYXIydjJfMTI4QiwgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5zY2FsYXIydjIuMTI4QgorICAgIGhleGFnb25fVjZfcHJlZF94b3IsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYucHJlZC54b3IKKyAgICBoZXhhZ29uX1Y2X3ByZWRfeG9yXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnByZWQueG9yLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3NodWZmZXFoLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnNodWZmZXFoCisgICAgaGV4YWdvbl9WNl9zaHVmZmVxaF8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi5zaHVmZmVxaC4xMjhCCisgICAgaGV4YWdvbl9WNl9zaHVmZmVxdywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi5zaHVmZmVxdworICAgIGhleGFnb25fVjZfc2h1ZmZlcXdfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYuc2h1ZmZlcXcuMTI4QgorICAgIGhleGFnb25fVjZfdlMzMmJfbnFwcmVkX2FpLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudlMzMmIubnFwcmVkLmFpCisgICAgaGV4YWdvbl9WNl92UzMyYl9ucXByZWRfYWlfMTI4QiwgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52UzMyYi5ucXByZWQuYWkuMTI4QgorICAgIGhleGFnb25fVjZfdlMzMmJfbnRfbnFwcmVkX2FpLCAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudlMzMmIubnQubnFwcmVkLmFpCisgICAgaGV4YWdvbl9WNl92UzMyYl9udF9ucXByZWRfYWlfMTI4QiwgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52UzMyYi5udC5ucXByZWQuYWkuMTI4QgorICAgIGhleGFnb25fVjZfdlMzMmJfbnRfcXByZWRfYWksICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudlMzMmIubnQucXByZWQuYWkKKyAgICBoZXhhZ29uX1Y2X3ZTMzJiX250X3FwcmVkX2FpXzEyOEIsICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZTMzJiLm50LnFwcmVkLmFpLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZTMzJiX3FwcmVkX2FpLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZTMzJiLnFwcmVkLmFpCisgICAgaGV4YWdvbl9WNl92UzMyYl9xcHJlZF9haV8xMjhCLCAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52UzMyYi5xcHJlZC5haS4xMjhCCisgICAgaGV4YWdvbl9WNl92YWJzYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzYgorICAgIGhleGFnb25fVjZfdmFic2JfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFic2IuMTI4QgorICAgIGhleGFnb25fVjZfdmFic2Jfc2F0LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFic2Iuc2F0CisgICAgaGV4YWdvbl9WNl92YWJzYl9zYXRfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzYi5zYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmFic2RpZmZoLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFic2RpZmZoCisgICAgaGV4YWdvbl9WNl92YWJzZGlmZmhfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzZGlmZmguMTI4QgorICAgIGhleGFnb25fVjZfdmFic2RpZmZ1YiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFic2RpZmZ1YgorICAgIGhleGFnb25fVjZfdmFic2RpZmZ1Yl8xMjhCLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFic2RpZmZ1Yi4xMjhCCisgICAgaGV4YWdvbl9WNl92YWJzZGlmZnVoLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzZGlmZnVoCisgICAgaGV4YWdvbl9WNl92YWJzZGlmZnVoXzEyOEIsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzZGlmZnVoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhYnNkaWZmdywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnNkaWZmdworICAgIGhleGFnb25fVjZfdmFic2RpZmZ3XzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFic2RpZmZ3LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhYnNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnNoCisgICAgaGV4YWdvbl9WNl92YWJzaF8xMjhCLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzaC4xMjhCCisgICAgaGV4YWdvbl9WNl92YWJzaF9zYXQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzaC5zYXQKKyAgICBoZXhhZ29uX1Y2X3ZhYnNoX3NhdF8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnNoLnNhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92YWJzdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzdworICAgIGhleGFnb25fVjZfdmFic3dfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFic3cuMTI4QgorICAgIGhleGFnb25fVjZfdmFic3dfc2F0LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFic3cuc2F0CisgICAgaGV4YWdvbl9WNl92YWJzd19zYXRfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzdy5zYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmFkZGIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGIKKyAgICBoZXhhZ29uX1Y2X3ZhZGRiXzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRiLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGRiX2R2LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRiLmR2CisgICAgaGV4YWdvbl9WNl92YWRkYl9kdl8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkYi5kdi4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkYm5xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkYm5xCisgICAgaGV4YWdvbl9WNl92YWRkYm5xXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkYm5xLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGRicSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRicQorICAgIGhleGFnb25fVjZfdmFkZGJxXzEyOEIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGJxLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGRic2F0LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRic2F0CisgICAgaGV4YWdvbl9WNl92YWRkYnNhdF8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkYnNhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkYnNhdF9kdiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkYnNhdC5kdgorICAgIGhleGFnb25fVjZfdmFkZGJzYXRfZHZfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGJzYXQuZHYuMTI4QgorICAgIGhleGFnb25fVjZfdmFkZGNhcnJ5LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGNhcnJ5CisgICAgaGV4YWdvbl9WNl92YWRkY2FycnlfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkY2FycnkuMTI4QgorICAgIGhleGFnb25fVjZfdmFkZGNsYmgsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGNsYmgKKyAgICBoZXhhZ29uX1Y2X3ZhZGRjbGJoXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRjbGJoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGRjbGJ3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRjbGJ3CisgICAgaGV4YWdvbl9WNl92YWRkY2xid18xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkY2xidy4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaAorICAgIGhleGFnb25fVjZfdmFkZGhfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGguMTI4QgorICAgIGhleGFnb25fVjZfdmFkZGhfZHYsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGguZHYKKyAgICBoZXhhZ29uX1Y2X3ZhZGRoX2R2XzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRoLmR2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGRobnEsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRobnEKKyAgICBoZXhhZ29uX1Y2X3ZhZGRobnFfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRobnEuMTI4QgorICAgIGhleGFnb25fVjZfdmFkZGhxLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGhxCisgICAgaGV4YWdvbl9WNl92YWRkaHFfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaHEuMTI4QgorICAgIGhleGFnb25fVjZfdmFkZGhzYXQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZGhzYXQKKyAgICBoZXhhZ29uX1Y2X3ZhZGRoc2F0XzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRoc2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGRoc2F0X2R2LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRoc2F0LmR2CisgICAgaGV4YWdvbl9WNl92YWRkaHNhdF9kdl8xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaHNhdC5kdi4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkaHcsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaHcKKyAgICBoZXhhZ29uX1Y2X3ZhZGRod18xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRody4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkaHdfYWNjLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaHcuYWNjCisgICAgaGV4YWdvbl9WNl92YWRkaHdfYWNjXzEyOEIsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaHcuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGR1YmgsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1YmgKKyAgICBoZXhhZ29uX1Y2X3ZhZGR1YmhfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1YmguMTI4QgorICAgIGhleGFnb25fVjZfdmFkZHViaF9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHViaC5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZhZGR1YmhfYWNjXzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1YmguYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGR1YnNhdCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1YnNhdAorICAgIGhleGFnb25fVjZfdmFkZHVic2F0XzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVic2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGR1YnNhdF9kdiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1YnNhdC5kdgorICAgIGhleGFnb25fVjZfdmFkZHVic2F0X2R2XzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVic2F0LmR2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGR1YnViYl9zYXQsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1YnViYi5zYXQKKyAgICBoZXhhZ29uX1Y2X3ZhZGR1YnViYl9zYXRfMTI4QiwgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1YnViYi5zYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmFkZHVoc2F0LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVoc2F0CisgICAgaGV4YWdvbl9WNl92YWRkdWhzYXRfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdWhzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmFkZHVoc2F0X2R2LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVoc2F0LmR2CisgICAgaGV4YWdvbl9WNl92YWRkdWhzYXRfZHZfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdWhzYXQuZHYuMTI4QgorICAgIGhleGFnb25fVjZfdmFkZHVodywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVodworICAgIGhleGFnb25fVjZfdmFkZHVod18xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVody4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkdWh3X2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdWh3LmFjYworICAgIGhleGFnb25fVjZfdmFkZHVod19hY2NfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVody5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdmFkZHV3c2F0LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHV3c2F0CisgICAgaGV4YWdvbl9WNl92YWRkdXdzYXRfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdXdzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmFkZHV3c2F0X2R2LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHV3c2F0LmR2CisgICAgaGV4YWdvbl9WNl92YWRkdXdzYXRfZHZfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdXdzYXQuZHYuMTI4QgorICAgIGhleGFnb25fVjZfdmFkZHcsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHcKKyAgICBoZXhhZ29uX1Y2X3ZhZGR3XzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR3LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGR3X2R2LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR3LmR2CisgICAgaGV4YWdvbl9WNl92YWRkd19kdl8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdy5kdi4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkd25xLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkd25xCisgICAgaGV4YWdvbl9WNl92YWRkd25xXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkd25xLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGR3cSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR3cQorICAgIGhleGFnb25fVjZfdmFkZHdxXzEyOEIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHdxLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhZGR3c2F0LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR3c2F0CisgICAgaGV4YWdvbl9WNl92YWRkd3NhdF8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkd3NhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92YWRkd3NhdF9kdiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkd3NhdC5kdgorICAgIGhleGFnb25fVjZfdmFkZHdzYXRfZHZfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFkZHdzYXQuZHYuMTI4QgorICAgIGhleGFnb25fVjZfdmFsaWduYiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFsaWduYgorICAgIGhleGFnb25fVjZfdmFsaWduYl8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFsaWduYi4xMjhCCisgICAgaGV4YWdvbl9WNl92YWxpZ25iaSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YWxpZ25iaQorICAgIGhleGFnb25fVjZfdmFsaWduYmlfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFsaWduYmkuMTI4QgorICAgIGhleGFnb25fVjZfdmFuZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFuZAorICAgIGhleGFnb25fVjZfdmFuZF8xMjhCLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFuZC4xMjhCCisgICAgaGV4YWdvbl9WNl92YW5kbnFydCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YW5kbnFydAorICAgIGhleGFnb25fVjZfdmFuZG5xcnRfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFuZG5xcnQuMTI4QgorICAgIGhleGFnb25fVjZfdmFuZG5xcnRfYWNjLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFuZG5xcnQuYWNjCisgICAgaGV4YWdvbl9WNl92YW5kbnFydF9hY2NfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YW5kbnFydC5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdmFuZHFydCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFuZHFydAorICAgIGhleGFnb25fVjZfdmFuZHFydF8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFuZHFydC4xMjhCCisgICAgaGV4YWdvbl9WNl92YW5kcXJ0X2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YW5kcXJ0LmFjYworICAgIGhleGFnb25fVjZfdmFuZHFydF9hY2NfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFuZHFydC5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdmFuZHZucXYsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFuZHZucXYKKyAgICBoZXhhZ29uX1Y2X3ZhbmR2bnF2XzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmR2bnF2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhbmR2cXYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmR2cXYKKyAgICBoZXhhZ29uX1Y2X3ZhbmR2cXZfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmR2cXYuMTI4QgorICAgIGhleGFnb25fVjZfdmFuZHZydCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFuZHZydAorICAgIGhleGFnb25fVjZfdmFuZHZydF8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFuZHZydC4xMjhCCisgICAgaGV4YWdvbl9WNl92YW5kdnJ0X2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YW5kdnJ0LmFjYworICAgIGhleGFnb25fVjZfdmFuZHZydF9hY2NfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFuZHZydC5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdmFzbGgsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzbGgKKyAgICBoZXhhZ29uX1Y2X3Zhc2xoXzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc2xoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhc2xoX2FjYywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc2xoLmFjYworICAgIGhleGFnb25fVjZfdmFzbGhfYWNjXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzbGguYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhc2xodiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc2xodgorICAgIGhleGFnb25fVjZfdmFzbGh2XzEyOEIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzbGh2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhc2x3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc2x3CisgICAgaGV4YWdvbl9WNl92YXNsd18xMjhCLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNsdy4xMjhCCisgICAgaGV4YWdvbl9WNl92YXNsd19hY2MsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNsdy5hY2MKKyAgICBoZXhhZ29uX1Y2X3Zhc2x3X2FjY18xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc2x3LmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92YXNsd3YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNsd3YKKyAgICBoZXhhZ29uX1Y2X3Zhc2x3dl8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc2x3di4xMjhCCisgICAgaGV4YWdvbl9WNl92YXNyaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyaAorICAgIGhleGFnb25fVjZfdmFzcmhfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcmguMTI4QgorICAgIGhleGFnb25fVjZfdmFzcmhfYWNjLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcmguYWNjCisgICAgaGV4YWdvbl9WNl92YXNyaF9hY2NfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyaC5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdmFzcmhicm5kc2F0LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcmhicm5kc2F0CisgICAgaGV4YWdvbl9WNl92YXNyaGJybmRzYXRfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyaGJybmRzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmFzcmhic2F0LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcmhic2F0CisgICAgaGV4YWdvbl9WNl92YXNyaGJzYXRfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyaGJzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmFzcmh1YnJuZHNhdCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcmh1YnJuZHNhdAorICAgIGhleGFnb25fVjZfdmFzcmh1YnJuZHNhdF8xMjhCLCAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcmh1YnJuZHNhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92YXNyaHVic2F0LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyaHVic2F0CisgICAgaGV4YWdvbl9WNl92YXNyaHVic2F0XzEyOEIsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyaHVic2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhc3JodiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3JodgorICAgIGhleGFnb25fVjZfdmFzcmh2XzEyOEIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcmh2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhc3J1aHVicm5kc2F0LCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J1aHVicm5kc2F0CisgICAgaGV4YWdvbl9WNl92YXNydWh1YnJuZHNhdF8xMjhCLCAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNydWh1YnJuZHNhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92YXNydWh1YnNhdCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNydWh1YnNhdAorICAgIGhleGFnb25fVjZfdmFzcnVodWJzYXRfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcnVodWJzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmFzcnV3dWhybmRzYXQsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcnV3dWhybmRzYXQKKyAgICBoZXhhZ29uX1Y2X3Zhc3J1d3Vocm5kc2F0XzEyOEIsICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J1d3Vocm5kc2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhc3J1d3Voc2F0LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J1d3Voc2F0CisgICAgaGV4YWdvbl9WNl92YXNydXd1aHNhdF8xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNydXd1aHNhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92YXNydywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNydworICAgIGhleGFnb25fVjZfdmFzcndfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcncuMTI4QgorICAgIGhleGFnb25fVjZfdmFzcndfYWNjLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcncuYWNjCisgICAgaGV4YWdvbl9WNl92YXNyd19hY2NfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNydy5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdmFzcndoLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcndoCisgICAgaGV4YWdvbl9WNl92YXNyd2hfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyd2guMTI4QgorICAgIGhleGFnb25fVjZfdmFzcndocm5kc2F0LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcndocm5kc2F0CisgICAgaGV4YWdvbl9WNl92YXNyd2hybmRzYXRfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyd2hybmRzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmFzcndoc2F0LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcndoc2F0CisgICAgaGV4YWdvbl9WNl92YXNyd2hzYXRfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyd2hzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmFzcnd1aHJuZHNhdCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcnd1aHJuZHNhdAorICAgIGhleGFnb25fVjZfdmFzcnd1aHJuZHNhdF8xMjhCLCAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcnd1aHJuZHNhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92YXNyd3Voc2F0LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyd3Voc2F0CisgICAgaGV4YWdvbl9WNl92YXNyd3Voc2F0XzEyOEIsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyd3Voc2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhc3J3diwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3dgorICAgIGhleGFnb25fVjZfdmFzcnd2XzEyOEIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzcnd2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhc3NpZ24sICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3NpZ24KKyAgICBoZXhhZ29uX1Y2X3Zhc3NpZ25fMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3NpZ24uMTI4QgorICAgIGhleGFnb25fVjZfdmFzc2lnbnAsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmFzc2lnbnAKKyAgICBoZXhhZ29uX1Y2X3Zhc3NpZ25wXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3NpZ25wLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZhdmdiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmdiCisgICAgaGV4YWdvbl9WNl92YXZnYl8xMjhCLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZnYi4xMjhCCisgICAgaGV4YWdvbl9WNl92YXZnYnJuZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZnYnJuZAorICAgIGhleGFnb25fVjZfdmF2Z2JybmRfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmF2Z2JybmQuMTI4QgorICAgIGhleGFnb25fVjZfdmF2Z2gsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmF2Z2gKKyAgICBoZXhhZ29uX1Y2X3ZhdmdoXzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmdoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zhdmdocm5kLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmdocm5kCisgICAgaGV4YWdvbl9WNl92YXZnaHJuZF8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZnaHJuZC4xMjhCCisgICAgaGV4YWdvbl9WNl92YXZndWIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndWIKKyAgICBoZXhhZ29uX1Y2X3Zhdmd1Yl8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmd1Yi4xMjhCCisgICAgaGV4YWdvbl9WNl92YXZndWJybmQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndWJybmQKKyAgICBoZXhhZ29uX1Y2X3Zhdmd1YnJuZF8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmd1YnJuZC4xMjhCCisgICAgaGV4YWdvbl9WNl92YXZndWgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndWgKKyAgICBoZXhhZ29uX1Y2X3Zhdmd1aF8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmd1aC4xMjhCCisgICAgaGV4YWdvbl9WNl92YXZndWhybmQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndWhybmQKKyAgICBoZXhhZ29uX1Y2X3Zhdmd1aHJuZF8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmd1aHJuZC4xMjhCCisgICAgaGV4YWdvbl9WNl92YXZndXcsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndXcKKyAgICBoZXhhZ29uX1Y2X3Zhdmd1d18xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmd1dy4xMjhCCisgICAgaGV4YWdvbl9WNl92YXZndXdybmQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndXdybmQKKyAgICBoZXhhZ29uX1Y2X3Zhdmd1d3JuZF8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmd1d3JuZC4xMjhCCisgICAgaGV4YWdvbl9WNl92YXZndywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndworICAgIGhleGFnb25fVjZfdmF2Z3dfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3cuMTI4QgorICAgIGhleGFnb25fVjZfdmF2Z3dybmQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3dybmQKKyAgICBoZXhhZ29uX1Y2X3Zhdmd3cm5kXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmd3cm5kLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZjbDBoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZjbDBoCisgICAgaGV4YWdvbl9WNl92Y2wwaF8xMjhCLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Y2wwaC4xMjhCCisgICAgaGV4YWdvbl9WNl92Y2wwdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Y2wwdworICAgIGhleGFnb25fVjZfdmNsMHdfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmNsMHcuMTI4QgorICAgIGhleGFnb25fVjZfdmNvbWJpbmUsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmNvbWJpbmUKKyAgICBoZXhhZ29uX1Y2X3Zjb21iaW5lXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZjb21iaW5lLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkMAorICAgIGhleGFnb25fVjZfdmQwXzEyOEIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmQwLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkZDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkZDAKKyAgICBoZXhhZ29uX1Y2X3ZkZDBfMTI4QiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkZDAuMTI4QgorICAgIGhleGFnb25fVjZfdmRlYWxiLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRlYWxiCisgICAgaGV4YWdvbl9WNl92ZGVhbGJfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZGVhbGIuMTI4QgorICAgIGhleGFnb25fVjZfdmRlYWxiNHcsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRlYWxiNHcKKyAgICBoZXhhZ29uX1Y2X3ZkZWFsYjR3XzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkZWFsYjR3LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkZWFsaCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkZWFsaAorICAgIGhleGFnb25fVjZfdmRlYWxoXzEyOEIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRlYWxoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkZWFsdmRkLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkZWFsdmRkCisgICAgaGV4YWdvbl9WNl92ZGVhbHZkZF8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZGVhbHZkZC4xMjhCCisgICAgaGV4YWdvbl9WNl92ZGVsdGEsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZGVsdGEKKyAgICBoZXhhZ29uX1Y2X3ZkZWx0YV8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkZWx0YS4xMjhCCisgICAgaGV4YWdvbl9WNl92ZG1weWJ1cywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWJ1cworICAgIGhleGFnb25fVjZfdmRtcHlidXNfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlidXMuMTI4QgorICAgIGhleGFnb25fVjZfdmRtcHlidXNfYWNjLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlidXMuYWNjCisgICAgaGV4YWdvbl9WNl92ZG1weWJ1c19hY2NfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWJ1cy5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdmRtcHlidXNfZHYsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlidXMuZHYKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5YnVzX2R2XzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5YnVzLmR2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5YnVzX2R2X2FjYywgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5YnVzLmR2LmFjYworICAgIGhleGFnb25fVjZfdmRtcHlidXNfZHZfYWNjXzEyOEIsICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlidXMuZHYuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aGIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aGIKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aGJfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aGIuMTI4QgorICAgIGhleGFnb25fVjZfdmRtcHloYl9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloYi5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aGJfYWNjXzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aGIuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aGJfZHYsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aGIuZHYKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aGJfZHZfMTI4QiwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aGIuZHYuMTI4QgorICAgIGhleGFnb25fVjZfdmRtcHloYl9kdl9hY2MsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloYi5kdi5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aGJfZHZfYWNjXzEyOEIsICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aGIuZHYuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aGlzYXQsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aGlzYXQKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aGlzYXRfMTI4QiwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aGlzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmRtcHloaXNhdF9hY2MsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloaXNhdC5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aGlzYXRfYWNjXzEyOEIsICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aGlzYXQuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aHNhdCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aHNhdAorICAgIGhleGFnb25fVjZfdmRtcHloc2F0XzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloc2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aHNhdF9hY2MsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aHNhdC5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZkbXB5aHNhdF9hY2NfMTI4QiwgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aHNhdC5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdmRtcHloc3Vpc2F0LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloc3Vpc2F0CisgICAgaGV4YWdvbl9WNl92ZG1weWhzdWlzYXRfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhzdWlzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmRtcHloc3Vpc2F0X2FjYywgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloc3Vpc2F0LmFjYworICAgIGhleGFnb25fVjZfdmRtcHloc3Vpc2F0X2FjY18xMjhCLCAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloc3Vpc2F0LmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92ZG1weWhzdXNhdCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhzdXNhdAorICAgIGhleGFnb25fVjZfdmRtcHloc3VzYXRfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloc3VzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdmRtcHloc3VzYXRfYWNjLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloc3VzYXQuYWNjCisgICAgaGV4YWdvbl9WNl92ZG1weWhzdXNhdF9hY2NfMTI4QiwgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhzdXNhdC5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdmRtcHlodnNhdCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlodnNhdAorICAgIGhleGFnb25fVjZfdmRtcHlodnNhdF8xMjhCLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlodnNhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92ZG1weWh2c2F0X2FjYywgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWh2c2F0LmFjYworICAgIGhleGFnb25fVjZfdmRtcHlodnNhdF9hY2NfMTI4QiwgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlodnNhdC5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdmRzYWR1aCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRzYWR1aAorICAgIGhleGFnb25fVjZfdmRzYWR1aF8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRzYWR1aC4xMjhCCisgICAgaGV4YWdvbl9WNl92ZHNhZHVoX2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZHNhZHVoLmFjYworICAgIGhleGFnb25fVjZfdmRzYWR1aF9hY2NfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmRzYWR1aC5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdmVxYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxYgorICAgIGhleGFnb25fVjZfdmVxYl8xMjhCLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxYi4xMjhCCisgICAgaGV4YWdvbl9WNl92ZXFiX2FuZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXFiLmFuZAorICAgIGhleGFnb25fVjZfdmVxYl9hbmRfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxYi5hbmQuMTI4QgorICAgIGhleGFnb25fVjZfdmVxYl9vciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxYi5vcgorICAgIGhleGFnb25fVjZfdmVxYl9vcl8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxYi5vci4xMjhCCisgICAgaGV4YWdvbl9WNl92ZXFiX3hvciwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXFiLnhvcgorICAgIGhleGFnb25fVjZfdmVxYl94b3JfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxYi54b3IuMTI4QgorICAgIGhleGFnb25fVjZfdmVxaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxaAorICAgIGhleGFnb25fVjZfdmVxaF8xMjhCLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxaC4xMjhCCisgICAgaGV4YWdvbl9WNl92ZXFoX2FuZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXFoLmFuZAorICAgIGhleGFnb25fVjZfdmVxaF9hbmRfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxaC5hbmQuMTI4QgorICAgIGhleGFnb25fVjZfdmVxaF9vciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxaC5vcgorICAgIGhleGFnb25fVjZfdmVxaF9vcl8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxaC5vci4xMjhCCisgICAgaGV4YWdvbl9WNl92ZXFoX3hvciwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXFoLnhvcgorICAgIGhleGFnb25fVjZfdmVxaF94b3JfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxaC54b3IuMTI4QgorICAgIGhleGFnb25fVjZfdmVxdywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxdworICAgIGhleGFnb25fVjZfdmVxd18xMjhCLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxdy4xMjhCCisgICAgaGV4YWdvbl9WNl92ZXF3X2FuZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXF3LmFuZAorICAgIGhleGFnb25fVjZfdmVxd19hbmRfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxdy5hbmQuMTI4QgorICAgIGhleGFnb25fVjZfdmVxd19vciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxdy5vcgorICAgIGhleGFnb25fVjZfdmVxd19vcl8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxdy5vci4xMjhCCisgICAgaGV4YWdvbl9WNl92ZXF3X3hvciwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXF3LnhvcgorICAgIGhleGFnb25fVjZfdmVxd194b3JfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmVxdy54b3IuMTI4QgorICAgIGhleGFnb25fVjZfdmdhdGhlcm1oLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmdhdGhlcm1oCisgICAgaGV4YWdvbl9WNl92Z2F0aGVybWhfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z2F0aGVybWguMTI4QgorICAgIGhleGFnb25fVjZfdmdhdGhlcm1ocSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmdhdGhlcm1ocQorICAgIGhleGFnb25fVjZfdmdhdGhlcm1ocV8xMjhCLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmdhdGhlcm1ocS4xMjhCCisgICAgaGV4YWdvbl9WNl92Z2F0aGVybWh3LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z2F0aGVybWh3CisgICAgaGV4YWdvbl9WNl92Z2F0aGVybWh3XzEyOEIsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z2F0aGVybWh3LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZnYXRoZXJtaHdxLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtaHdxCisgICAgaGV4YWdvbl9WNl92Z2F0aGVybWh3cV8xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z2F0aGVybWh3cS4xMjhCCisgICAgaGV4YWdvbl9WNl92Z2F0aGVybXcsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z2F0aGVybXcKKyAgICBoZXhhZ29uX1Y2X3ZnYXRoZXJtd18xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtdy4xMjhCCisgICAgaGV4YWdvbl9WNl92Z2F0aGVybXdxLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z2F0aGVybXdxCisgICAgaGV4YWdvbl9WNl92Z2F0aGVybXdxXzEyOEIsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z2F0aGVybXdxLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZndGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGIKKyAgICBoZXhhZ29uX1Y2X3ZndGJfMTI4QiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGIuMTI4QgorICAgIGhleGFnb25fVjZfdmd0Yl9hbmQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0Yi5hbmQKKyAgICBoZXhhZ29uX1Y2X3ZndGJfYW5kXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGIuYW5kLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZndGJfb3IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGIub3IKKyAgICBoZXhhZ29uX1Y2X3ZndGJfb3JfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGIub3IuMTI4QgorICAgIGhleGFnb25fVjZfdmd0Yl94b3IsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0Yi54b3IKKyAgICBoZXhhZ29uX1Y2X3ZndGJfeG9yXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGIueG9yLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZndGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGgKKyAgICBoZXhhZ29uX1Y2X3ZndGhfMTI4QiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGguMTI4QgorICAgIGhleGFnb25fVjZfdmd0aF9hbmQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0aC5hbmQKKyAgICBoZXhhZ29uX1Y2X3ZndGhfYW5kXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGguYW5kLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZndGhfb3IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGgub3IKKyAgICBoZXhhZ29uX1Y2X3ZndGhfb3JfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGgub3IuMTI4QgorICAgIGhleGFnb25fVjZfdmd0aF94b3IsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0aC54b3IKKyAgICBoZXhhZ29uX1Y2X3ZndGhfeG9yXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGgueG9yLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZndHViLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHViCisgICAgaGV4YWdvbl9WNl92Z3R1Yl8xMjhCLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1Yi4xMjhCCisgICAgaGV4YWdvbl9WNl92Z3R1Yl9hbmQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1Yi5hbmQKKyAgICBoZXhhZ29uX1Y2X3ZndHViX2FuZF8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHViLmFuZC4xMjhCCisgICAgaGV4YWdvbl9WNl92Z3R1Yl9vciwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1Yi5vcgorICAgIGhleGFnb25fVjZfdmd0dWJfb3JfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0dWIub3IuMTI4QgorICAgIGhleGFnb25fVjZfdmd0dWJfeG9yLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0dWIueG9yCisgICAgaGV4YWdvbl9WNl92Z3R1Yl94b3JfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1Yi54b3IuMTI4QgorICAgIGhleGFnb25fVjZfdmd0dWgsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0dWgKKyAgICBoZXhhZ29uX1Y2X3ZndHVoXzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHVoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZndHVoX2FuZCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHVoLmFuZAorICAgIGhleGFnb25fVjZfdmd0dWhfYW5kXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0dWguYW5kLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZndHVoX29yLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHVoLm9yCisgICAgaGV4YWdvbl9WNl92Z3R1aF9vcl8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1aC5vci4xMjhCCisgICAgaGV4YWdvbl9WNl92Z3R1aF94b3IsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1aC54b3IKKyAgICBoZXhhZ29uX1Y2X3ZndHVoX3hvcl8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHVoLnhvci4xMjhCCisgICAgaGV4YWdvbl9WNl92Z3R1dywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1dworICAgIGhleGFnb25fVjZfdmd0dXdfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0dXcuMTI4QgorICAgIGhleGFnb25fVjZfdmd0dXdfYW5kLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0dXcuYW5kCisgICAgaGV4YWdvbl9WNl92Z3R1d19hbmRfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1dy5hbmQuMTI4QgorICAgIGhleGFnb25fVjZfdmd0dXdfb3IsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0dXcub3IKKyAgICBoZXhhZ29uX1Y2X3ZndHV3X29yXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHV3Lm9yLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZndHV3X3hvciwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHV3LnhvcgorICAgIGhleGFnb25fVjZfdmd0dXdfeG9yXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0dXcueG9yLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZndHcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHcKKyAgICBoZXhhZ29uX1Y2X3ZndHdfMTI4QiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHcuMTI4QgorICAgIGhleGFnb25fVjZfdmd0d19hbmQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0dy5hbmQKKyAgICBoZXhhZ29uX1Y2X3ZndHdfYW5kXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHcuYW5kLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZndHdfb3IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHcub3IKKyAgICBoZXhhZ29uX1Y2X3ZndHdfb3JfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHcub3IuMTI4QgorICAgIGhleGFnb25fVjZfdmd0d194b3IsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmd0dy54b3IKKyAgICBoZXhhZ29uX1Y2X3ZndHdfeG9yXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHcueG9yLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZpbnNlcnR3ciwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZpbnNlcnR3cgorICAgIGhleGFnb25fVjZfdmluc2VydHdyXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmluc2VydHdyLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZsYWxpZ25iLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsYWxpZ25iCisgICAgaGV4YWdvbl9WNl92bGFsaWduYl8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bGFsaWduYi4xMjhCCisgICAgaGV4YWdvbl9WNl92bGFsaWduYmksICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bGFsaWduYmkKKyAgICBoZXhhZ29uX1Y2X3ZsYWxpZ25iaV8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsYWxpZ25iaS4xMjhCCisgICAgaGV4YWdvbl9WNl92bHNyYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHNyYgorICAgIGhleGFnb25fVjZfdmxzcmJfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmxzcmIuMTI4QgorICAgIGhleGFnb25fVjZfdmxzcmgsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmxzcmgKKyAgICBoZXhhZ29uX1Y2X3Zsc3JoXzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsc3JoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zsc3JodiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsc3JodgorICAgIGhleGFnb25fVjZfdmxzcmh2XzEyOEIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmxzcmh2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zsc3J3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsc3J3CisgICAgaGV4YWdvbl9WNl92bHNyd18xMjhCLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHNydy4xMjhCCisgICAgaGV4YWdvbl9WNl92bHNyd3YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHNyd3YKKyAgICBoZXhhZ29uX1Y2X3Zsc3J3dl8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsc3J3di4xMjhCCisgICAgaGV4YWdvbl9WNl92bHV0NCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0NAorICAgIGhleGFnb25fVjZfdmx1dDRfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmx1dDQuMTI4QgorICAgIGhleGFnb25fVjZfdmx1dHZ2YiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ2YgorICAgIGhleGFnb25fVjZfdmx1dHZ2Yl8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ2Yi4xMjhCCisgICAgaGV4YWdvbl9WNl92bHV0dnZiX25tLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dnZiLm5tCisgICAgaGV4YWdvbl9WNl92bHV0dnZiX25tXzEyOEIsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dnZiLm5tLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZsdXR2dmJfb3JhY2MsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2dmIub3JhY2MKKyAgICBoZXhhZ29uX1Y2X3ZsdXR2dmJfb3JhY2NfMTI4QiwgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2dmIub3JhY2MuMTI4QgorICAgIGhleGFnb25fVjZfdmx1dHZ2Yl9vcmFjY2ksICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ2Yi5vcmFjY2kKKyAgICBoZXhhZ29uX1Y2X3ZsdXR2dmJfb3JhY2NpXzEyOEIsICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2dmIub3JhY2NpLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZsdXR2dmJpLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2dmJpCisgICAgaGV4YWdvbl9WNl92bHV0dnZiaV8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dnZiaS4xMjhCCisgICAgaGV4YWdvbl9WNl92bHV0dndoLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dndoCisgICAgaGV4YWdvbl9WNl92bHV0dndoXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dndoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZsdXR2d2hfbm0sICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2d2gubm0KKyAgICBoZXhhZ29uX1Y2X3ZsdXR2d2hfbm1fMTI4QiwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2d2gubm0uMTI4QgorICAgIGhleGFnb25fVjZfdmx1dHZ3aF9vcmFjYywgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ3aC5vcmFjYworICAgIGhleGFnb25fVjZfdmx1dHZ3aF9vcmFjY18xMjhCLCAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ3aC5vcmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92bHV0dndoX29yYWNjaSwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dndoLm9yYWNjaQorICAgIGhleGFnb25fVjZfdmx1dHZ3aF9vcmFjY2lfMTI4QiwgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ3aC5vcmFjY2kuMTI4QgorICAgIGhleGFnb25fVjZfdmx1dHZ3aGksICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ3aGkKKyAgICBoZXhhZ29uX1Y2X3ZsdXR2d2hpXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2d2hpLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtYXNrZWRzdG9yZW5xLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXNrZWRzdG9yZW5xCisgICAgaGV4YWdvbl9WNl92bWFza2Vkc3RvcmVucV8xMjhCLCAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWFza2Vkc3RvcmVucS4xMjhCCisgICAgaGV4YWdvbl9WNl92bWFza2Vkc3RvcmVudG5xLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWFza2Vkc3RvcmVudG5xCisgICAgaGV4YWdvbl9WNl92bWFza2Vkc3RvcmVudG5xXzEyOEIsICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWFza2Vkc3RvcmVudG5xLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtYXNrZWRzdG9yZW50cSwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXNrZWRzdG9yZW50cQorICAgIGhleGFnb25fVjZfdm1hc2tlZHN0b3JlbnRxXzEyOEIsICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1hc2tlZHN0b3JlbnRxLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtYXNrZWRzdG9yZXEsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXNrZWRzdG9yZXEKKyAgICBoZXhhZ29uX1Y2X3ZtYXNrZWRzdG9yZXFfMTI4QiwgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXNrZWRzdG9yZXEuMTI4QgorICAgIGhleGFnb25fVjZfdm1heGIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1heGIKKyAgICBoZXhhZ29uX1Y2X3ZtYXhiXzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXhiLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtYXhoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXhoCisgICAgaGV4YWdvbl9WNl92bWF4aF8xMjhCLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWF4aC4xMjhCCisgICAgaGV4YWdvbl9WNl92bWF4dWIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWF4dWIKKyAgICBoZXhhZ29uX1Y2X3ZtYXh1Yl8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXh1Yi4xMjhCCisgICAgaGV4YWdvbl9WNl92bWF4dWgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWF4dWgKKyAgICBoZXhhZ29uX1Y2X3ZtYXh1aF8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXh1aC4xMjhCCisgICAgaGV4YWdvbl9WNl92bWF4dywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWF4dworICAgIGhleGFnb25fVjZfdm1heHdfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1heHcuMTI4QgorICAgIGhleGFnb25fVjZfdm1pbmIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1pbmIKKyAgICBoZXhhZ29uX1Y2X3ZtaW5iXzEyOEIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtaW5iLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtaW5oLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtaW5oCisgICAgaGV4YWdvbl9WNl92bWluaF8xMjhCLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWluaC4xMjhCCisgICAgaGV4YWdvbl9WNl92bWludWIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWludWIKKyAgICBoZXhhZ29uX1Y2X3ZtaW51Yl8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtaW51Yi4xMjhCCisgICAgaGV4YWdvbl9WNl92bWludWgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWludWgKKyAgICBoZXhhZ29uX1Y2X3ZtaW51aF8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtaW51aC4xMjhCCisgICAgaGV4YWdvbl9WNl92bWludywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bWludworICAgIGhleGFnb25fVjZfdm1pbndfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1pbncuMTI4QgorICAgIGhleGFnb25fVjZfdm1wYWJ1cywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1wYWJ1cworICAgIGhleGFnb25fVjZfdm1wYWJ1c18xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1wYWJ1cy4xMjhCCisgICAgaGV4YWdvbl9WNl92bXBhYnVzX2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhYnVzLmFjYworICAgIGhleGFnb25fVjZfdm1wYWJ1c19hY2NfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1wYWJ1cy5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdm1wYWJ1c3YsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1wYWJ1c3YKKyAgICBoZXhhZ29uX1Y2X3ZtcGFidXN2XzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFidXN2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcGFidXUsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFidXUKKyAgICBoZXhhZ29uX1Y2X3ZtcGFidXVfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFidXUuMTI4QgorICAgIGhleGFnb25fVjZfdm1wYWJ1dV9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1wYWJ1dS5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZtcGFidXVfYWNjXzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFidXUuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcGFidXV2LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFidXV2CisgICAgaGV4YWdvbl9WNl92bXBhYnV1dl8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhYnV1di4xMjhCCisgICAgaGV4YWdvbl9WNl92bXBhaGIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhaGIKKyAgICBoZXhhZ29uX1Y2X3ZtcGFoYl8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFoYi4xMjhCCisgICAgaGV4YWdvbl9WNl92bXBhaGJfYWNjLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhaGIuYWNjCisgICAgaGV4YWdvbl9WNl92bXBhaGJfYWNjXzEyOEIsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhaGIuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcGFoaHNhdCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFoaHNhdAorICAgIGhleGFnb25fVjZfdm1wYWhoc2F0XzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1wYWhoc2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcGF1aGIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGF1aGIKKyAgICBoZXhhZ29uX1Y2X3ZtcGF1aGJfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGF1aGIuMTI4QgorICAgIGhleGFnb25fVjZfdm1wYXVoYl9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1wYXVoYi5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZtcGF1aGJfYWNjXzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGF1aGIuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcGF1aHVoc2F0LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGF1aHVoc2F0CisgICAgaGV4YWdvbl9WNl92bXBhdWh1aHNhdF8xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhdWh1aHNhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92bXBzdWh1aHNhdCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBzdWh1aHNhdAorICAgIGhleGFnb25fVjZfdm1wc3VodWhzYXRfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1wc3VodWhzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdm1weWJ1cywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWJ1cworICAgIGhleGFnb25fVjZfdm1weWJ1c18xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWJ1cy4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5YnVzX2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5YnVzLmFjYworICAgIGhleGFnb25fVjZfdm1weWJ1c19hY2NfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWJ1cy5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdm1weWJ1c3YsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWJ1c3YKKyAgICBoZXhhZ29uX1Y2X3ZtcHlidXN2XzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlidXN2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlidXN2X2FjYywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlidXN2LmFjYworICAgIGhleGFnb25fVjZfdm1weWJ1c3ZfYWNjXzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWJ1c3YuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlidiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlidgorICAgIGhleGFnb25fVjZfdm1weWJ2XzEyOEIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWJ2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlidl9hY2MsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlidi5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZtcHlidl9hY2NfMTI4QiwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlidi5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdm1weWV3dWgsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWV3dWgKKyAgICBoZXhhZ29uX1Y2X3ZtcHlld3VoXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlld3VoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlld3VoXzY0LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlld3VoLjY0CisgICAgaGV4YWdvbl9WNl92bXB5ZXd1aF82NF8xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5ZXd1aC42NC4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5aCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aAorICAgIGhleGFnb25fVjZfdm1weWhfMTI4QiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWguMTI4QgorICAgIGhleGFnb25fVjZfdm1weWhfYWNjLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWguYWNjCisgICAgaGV4YWdvbl9WNl92bXB5aF9hY2NfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aC5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdm1weWhzYXRfYWNjLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWhzYXQuYWNjCisgICAgaGV4YWdvbl9WNl92bXB5aHNhdF9hY2NfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aHNhdC5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdm1weWhzcnMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWhzcnMKKyAgICBoZXhhZ29uX1Y2X3ZtcHloc3JzXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHloc3JzLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHloc3MsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHloc3MKKyAgICBoZXhhZ29uX1Y2X3ZtcHloc3NfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHloc3MuMTI4QgorICAgIGhleGFnb25fVjZfdm1weWh1cywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWh1cworICAgIGhleGFnb25fVjZfdm1weWh1c18xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWh1cy4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5aHVzX2FjYywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aHVzLmFjYworICAgIGhleGFnb25fVjZfdm1weWh1c19hY2NfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWh1cy5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdm1weWh2LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWh2CisgICAgaGV4YWdvbl9WNl92bXB5aHZfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aHYuMTI4QgorICAgIGhleGFnb25fVjZfdm1weWh2X2FjYywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWh2LmFjYworICAgIGhleGFnb25fVjZfdm1weWh2X2FjY18xMjhCLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWh2LmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5aHZzcnMsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aHZzcnMKKyAgICBoZXhhZ29uX1Y2X3ZtcHlodnNyc18xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlodnNycy4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5aWVvaCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWVvaAorICAgIGhleGFnb25fVjZfdm1weWllb2hfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWllb2guMTI4QgorICAgIGhleGFnb25fVjZfdm1weWlld2hfYWNjLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWlld2guYWNjCisgICAgaGV4YWdvbl9WNl92bXB5aWV3aF9hY2NfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWV3aC5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdm1weWlld3VoLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWlld3VoCisgICAgaGV4YWdvbl9WNl92bXB5aWV3dWhfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWV3dWguMTI4QgorICAgIGhleGFnb25fVjZfdm1weWlld3VoX2FjYywgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWlld3VoLmFjYworICAgIGhleGFnb25fVjZfdm1weWlld3VoX2FjY18xMjhCLCAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWlld3VoLmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5aWgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWgKKyAgICBoZXhhZ29uX1Y2X3ZtcHlpaF8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpaC4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5aWhfYWNjLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWguYWNjCisgICAgaGV4YWdvbl9WNl92bXB5aWhfYWNjXzEyOEIsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWguYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlpaGIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpaGIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlpaGJfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpaGIuMTI4QgorICAgIGhleGFnb25fVjZfdm1weWloYl9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWloYi5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZtcHlpaGJfYWNjXzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpaGIuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlpb3doLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpb3doCisgICAgaGV4YWdvbl9WNl92bXB5aW93aF8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aW93aC4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5aXdiLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aXdiCisgICAgaGV4YWdvbl9WNl92bXB5aXdiXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aXdiLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlpd2JfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpd2IuYWNjCisgICAgaGV4YWdvbl9WNl92bXB5aXdiX2FjY18xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aXdiLmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5aXdoLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aXdoCisgICAgaGV4YWdvbl9WNl92bXB5aXdoXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aXdoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlpd2hfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpd2guYWNjCisgICAgaGV4YWdvbl9WNl92bXB5aXdoX2FjY18xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aXdoLmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5aXd1YiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aXd1YgorICAgIGhleGFnb25fVjZfdm1weWl3dWJfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWl3dWIuMTI4QgorICAgIGhleGFnb25fVjZfdm1weWl3dWJfYWNjLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weWl3dWIuYWNjCisgICAgaGV4YWdvbl9WNl92bXB5aXd1Yl9hY2NfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aXd1Yi5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdm1weW93aCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weW93aAorICAgIGhleGFnb25fVjZfdm1weW93aF8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weW93aC4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5b3doXzY0X2FjYywgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5b3doLjY0LmFjYworICAgIGhleGFnb25fVjZfdm1weW93aF82NF9hY2NfMTI4QiwgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weW93aC42NC5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdm1weW93aF9ybmQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weW93aC5ybmQKKyAgICBoZXhhZ29uX1Y2X3ZtcHlvd2hfcm5kXzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlvd2gucm5kLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHlvd2hfcm5kX3NhY2MsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlvd2gucm5kLnNhY2MKKyAgICBoZXhhZ29uX1Y2X3ZtcHlvd2hfcm5kX3NhY2NfMTI4QiwgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlvd2gucm5kLnNhY2MuMTI4QgorICAgIGhleGFnb25fVjZfdm1weW93aF9zYWNjLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weW93aC5zYWNjCisgICAgaGV4YWdvbl9WNl92bXB5b3doX3NhY2NfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5b3doLnNhY2MuMTI4QgorICAgIGhleGFnb25fVjZfdm1weXViLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weXViCisgICAgaGV4YWdvbl9WNl92bXB5dWJfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWIuMTI4QgorICAgIGhleGFnb25fVjZfdm1weXViX2FjYywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weXViLmFjYworICAgIGhleGFnb25fVjZfdm1weXViX2FjY18xMjhCLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weXViLmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5dWJ2LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWJ2CisgICAgaGV4YWdvbl9WNl92bXB5dWJ2XzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWJ2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHl1YnZfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1YnYuYWNjCisgICAgaGV4YWdvbl9WNl92bXB5dWJ2X2FjY18xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWJ2LmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5dWgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWgKKyAgICBoZXhhZ29uX1Y2X3ZtcHl1aF8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1aC4xMjhCCisgICAgaGV4YWdvbl9WNl92bXB5dWhfYWNjLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWguYWNjCisgICAgaGV4YWdvbl9WNl92bXB5dWhfYWNjXzEyOEIsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWguYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHl1aGUsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1aGUKKyAgICBoZXhhZ29uX1Y2X3ZtcHl1aGVfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1aGUuMTI4QgorICAgIGhleGFnb25fVjZfdm1weXVoZV9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weXVoZS5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZtcHl1aGVfYWNjXzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1aGUuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtcHl1aHYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1aHYKKyAgICBoZXhhZ29uX1Y2X3ZtcHl1aHZfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1aHYuMTI4QgorICAgIGhleGFnb25fVjZfdm1weXVodl9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm1weXVodi5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZtcHl1aHZfYWNjXzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1aHYuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZtdXgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtdXgKKyAgICBoZXhhZ29uX1Y2X3ZtdXhfMTI4QiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZtdXguMTI4QgorICAgIGhleGFnb25fVjZfdm5hdmdiLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm5hdmdiCisgICAgaGV4YWdvbl9WNl92bmF2Z2JfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bmF2Z2IuMTI4QgorICAgIGhleGFnb25fVjZfdm5hdmdoLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm5hdmdoCisgICAgaGV4YWdvbl9WNl92bmF2Z2hfMTI4QiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bmF2Z2guMTI4QgorICAgIGhleGFnb25fVjZfdm5hdmd1YiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm5hdmd1YgorICAgIGhleGFnb25fVjZfdm5hdmd1Yl8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm5hdmd1Yi4xMjhCCisgICAgaGV4YWdvbl9WNl92bmF2Z3csICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bmF2Z3cKKyAgICBoZXhhZ29uX1Y2X3ZuYXZnd18xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZuYXZndy4xMjhCCisgICAgaGV4YWdvbl9WNl92bm9ybWFtdGgsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bm9ybWFtdGgKKyAgICBoZXhhZ29uX1Y2X3Zub3JtYW10aF8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZub3JtYW10aC4xMjhCCisgICAgaGV4YWdvbl9WNl92bm9ybWFtdHcsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bm9ybWFtdHcKKyAgICBoZXhhZ29uX1Y2X3Zub3JtYW10d18xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZub3JtYW10dy4xMjhCCisgICAgaGV4YWdvbl9WNl92bm90LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bm90CisgICAgaGV4YWdvbl9WNl92bm90XzEyOEIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52bm90LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZvciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZvcgorICAgIGhleGFnb25fVjZfdm9yXzEyOEIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudm9yLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZwYWNrZWIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNrZWIKKyAgICBoZXhhZ29uX1Y2X3ZwYWNrZWJfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNrZWIuMTI4QgorICAgIGhleGFnb25fVjZfdnBhY2tlaCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnBhY2tlaAorICAgIGhleGFnb25fVjZfdnBhY2tlaF8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnBhY2tlaC4xMjhCCisgICAgaGV4YWdvbl9WNl92cGFja2hiX3NhdCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cGFja2hiLnNhdAorICAgIGhleGFnb25fVjZfdnBhY2toYl9zYXRfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnBhY2toYi5zYXQuMTI4QgorICAgIGhleGFnb25fVjZfdnBhY2todWJfc2F0LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnBhY2todWIuc2F0CisgICAgaGV4YWdvbl9WNl92cGFja2h1Yl9zYXRfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cGFja2h1Yi5zYXQuMTI4QgorICAgIGhleGFnb25fVjZfdnBhY2tvYiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnBhY2tvYgorICAgIGhleGFnb25fVjZfdnBhY2tvYl8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnBhY2tvYi4xMjhCCisgICAgaGV4YWdvbl9WNl92cGFja29oLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cGFja29oCisgICAgaGV4YWdvbl9WNl92cGFja29oXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cGFja29oLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZwYWNrd2hfc2F0LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNrd2guc2F0CisgICAgaGV4YWdvbl9WNl92cGFja3doX3NhdF8xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cGFja3doLnNhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92cGFja3d1aF9zYXQsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cGFja3d1aC5zYXQKKyAgICBoZXhhZ29uX1Y2X3ZwYWNrd3VoX3NhdF8xMjhCLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNrd3VoLnNhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92cG9wY291bnRoLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cG9wY291bnRoCisgICAgaGV4YWdvbl9WNl92cG9wY291bnRoXzEyOEIsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cG9wY291bnRoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZwcmVmaXhxYiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZwcmVmaXhxYgorICAgIGhleGFnb25fVjZfdnByZWZpeHFiXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnByZWZpeHFiLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZwcmVmaXhxaCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZwcmVmaXhxaAorICAgIGhleGFnb25fVjZfdnByZWZpeHFoXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnByZWZpeHFoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZwcmVmaXhxdywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZwcmVmaXhxdworICAgIGhleGFnb25fVjZfdnByZWZpeHF3XzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnByZWZpeHF3LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZyZGVsdGEsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZyZGVsdGEKKyAgICBoZXhhZ29uX1Y2X3ZyZGVsdGFfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZyZGVsdGEuMTI4QgorICAgIGhleGFnb25fVjZfdnJtcHlidWJfcnR0LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidWIucnR0CisgICAgaGV4YWdvbl9WNl92cm1weWJ1Yl9ydHRfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ1Yi5ydHQuMTI4QgorICAgIGhleGFnb25fVjZfdnJtcHlidWJfcnR0X2FjYywgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidWIucnR0LmFjYworICAgIGhleGFnb25fVjZfdnJtcHlidWJfcnR0X2FjY18xMjhCLCAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidWIucnR0LmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92cm1weWJ1cywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ1cworICAgIGhleGFnb25fVjZfdnJtcHlidXNfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidXMuMTI4QgorICAgIGhleGFnb25fVjZfdnJtcHlidXNfYWNjLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidXMuYWNjCisgICAgaGV4YWdvbl9WNl92cm1weWJ1c19hY2NfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ1cy5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdnJtcHlidXNpLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidXNpCisgICAgaGV4YWdvbl9WNl92cm1weWJ1c2lfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ1c2kuMTI4QgorICAgIGhleGFnb25fVjZfdnJtcHlidXNpX2FjYywgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidXNpLmFjYworICAgIGhleGFnb25fVjZfdnJtcHlidXNpX2FjY18xMjhCLCAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidXNpLmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92cm1weWJ1c3YsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ1c3YKKyAgICBoZXhhZ29uX1Y2X3ZybXB5YnVzdl8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzdi4xMjhCCisgICAgaGV4YWdvbl9WNl92cm1weWJ1c3ZfYWNjLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ1c3YuYWNjCisgICAgaGV4YWdvbl9WNl92cm1weWJ1c3ZfYWNjXzEyOEIsICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ1c3YuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZybXB5YnYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnYKKyAgICBoZXhhZ29uX1Y2X3ZybXB5YnZfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnYuMTI4QgorICAgIGhleGFnb25fVjZfdnJtcHlidl9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidi5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZybXB5YnZfYWNjXzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnYuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZybXB5dWIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5dWIKKyAgICBoZXhhZ29uX1Y2X3ZybXB5dWJfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5dWIuMTI4QgorICAgIGhleGFnb25fVjZfdnJtcHl1Yl9hY2MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1Yi5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZybXB5dWJfYWNjXzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5dWIuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZybXB5dWJfcnR0LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5dWIucnR0CisgICAgaGV4YWdvbl9WNl92cm1weXViX3J0dF8xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXViLnJ0dC4xMjhCCisgICAgaGV4YWdvbl9WNl92cm1weXViX3J0dF9hY2MsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXViLnJ0dC5hY2MKKyAgICBoZXhhZ29uX1Y2X3ZybXB5dWJfcnR0X2FjY18xMjhCLCAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5dWIucnR0LmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92cm1weXViaSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXViaQorICAgIGhleGFnb25fVjZfdnJtcHl1YmlfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1YmkuMTI4QgorICAgIGhleGFnb25fVjZfdnJtcHl1YmlfYWNjLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1YmkuYWNjCisgICAgaGV4YWdvbl9WNl92cm1weXViaV9hY2NfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXViaS5hY2MuMTI4QgorICAgIGhleGFnb25fVjZfdnJtcHl1YnYsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1YnYKKyAgICBoZXhhZ29uX1Y2X3ZybXB5dWJ2XzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5dWJ2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZybXB5dWJ2X2FjYywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5dWJ2LmFjYworICAgIGhleGFnb25fVjZfdnJtcHl1YnZfYWNjXzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1YnYuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zyb3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZyb3IKKyAgICBoZXhhZ29uX1Y2X3Zyb3JfMTI4QiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZyb3IuMTI4QgorICAgIGhleGFnb25fVjZfdnJvdW5kaGIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJvdW5kaGIKKyAgICBoZXhhZ29uX1Y2X3Zyb3VuZGhiXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZyb3VuZGhiLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zyb3VuZGh1YiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZyb3VuZGh1YgorICAgIGhleGFnb25fVjZfdnJvdW5kaHViXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJvdW5kaHViLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zyb3VuZHVodWIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZyb3VuZHVodWIKKyAgICBoZXhhZ29uX1Y2X3Zyb3VuZHVodWJfMTI4QiwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZyb3VuZHVodWIuMTI4QgorICAgIGhleGFnb25fVjZfdnJvdW5kdXd1aCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJvdW5kdXd1aAorICAgIGhleGFnb25fVjZfdnJvdW5kdXd1aF8xMjhCLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJvdW5kdXd1aC4xMjhCCisgICAgaGV4YWdvbl9WNl92cm91bmR3aCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm91bmR3aAorICAgIGhleGFnb25fVjZfdnJvdW5kd2hfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJvdW5kd2guMTI4QgorICAgIGhleGFnb25fVjZfdnJvdW5kd3VoLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJvdW5kd3VoCisgICAgaGV4YWdvbl9WNl92cm91bmR3dWhfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52cm91bmR3dWguMTI4QgorICAgIGhleGFnb25fVjZfdnJzYWR1YmksICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJzYWR1YmkKKyAgICBoZXhhZ29uX1Y2X3Zyc2FkdWJpXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZyc2FkdWJpLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zyc2FkdWJpX2FjYywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZyc2FkdWJpLmFjYworICAgIGhleGFnb25fVjZfdnJzYWR1YmlfYWNjXzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnJzYWR1YmkuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzYXRodWIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzYXRodWIKKyAgICBoZXhhZ29uX1Y2X3ZzYXRodWJfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzYXRodWIuMTI4QgorICAgIGhleGFnb25fVjZfdnNhdHV3dWgsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNhdHV3dWgKKyAgICBoZXhhZ29uX1Y2X3ZzYXR1d3VoXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzYXR1d3VoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzYXR3aCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzYXR3aAorICAgIGhleGFnb25fVjZfdnNhdHdoXzEyOEIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNhdHdoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzYgorICAgIGhleGFnb25fVjZfdnNiXzEyOEIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNiLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzY2F0dGVybWgsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWgKKyAgICBoZXhhZ29uX1Y2X3ZzY2F0dGVybWhfMTI4QiwgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWguMTI4QgorICAgIGhleGFnb25fVjZfdnNjYXR0ZXJtaF9hZGQsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaC5hZGQKKyAgICBoZXhhZ29uX1Y2X3ZzY2F0dGVybWhfYWRkXzEyOEIsICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWguYWRkLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzY2F0dGVybWhxLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWhxCisgICAgaGV4YWdvbl9WNl92c2NhdHRlcm1ocV8xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1ocS4xMjhCCisgICAgaGV4YWdvbl9WNl92c2NhdHRlcm1odywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1odworICAgIGhleGFnb25fVjZfdnNjYXR0ZXJtaHdfMTI4QiwgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaHcuMTI4QgorICAgIGhleGFnb25fVjZfdnNjYXR0ZXJtaHdfYWRkLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaHcuYWRkCisgICAgaGV4YWdvbl9WNl92c2NhdHRlcm1od19hZGRfMTI4QiwgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1ody5hZGQuMTI4QgorICAgIGhleGFnb25fVjZfdnNjYXR0ZXJtaHdxLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaHdxCisgICAgaGV4YWdvbl9WNl92c2NhdHRlcm1od3FfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1od3EuMTI4QgorICAgIGhleGFnb25fVjZfdnNjYXR0ZXJtdywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtdworICAgIGhleGFnb25fVjZfdnNjYXR0ZXJtd18xMjhCLCAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtdy4xMjhCCisgICAgaGV4YWdvbl9WNl92c2NhdHRlcm13X2FkZCwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm13LmFkZAorICAgIGhleGFnb25fVjZfdnNjYXR0ZXJtd19hZGRfMTI4QiwgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtdy5hZGQuMTI4QgorICAgIGhleGFnb25fVjZfdnNjYXR0ZXJtd3EsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtd3EKKyAgICBoZXhhZ29uX1Y2X3ZzY2F0dGVybXdxXzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybXdxLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaAorICAgIGhleGFnb25fVjZfdnNoXzEyOEIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzaHVmZWgsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmZWgKKyAgICBoZXhhZ29uX1Y2X3ZzaHVmZWhfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmZWguMTI4QgorICAgIGhleGFnb25fVjZfdnNodWZmYiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNodWZmYgorICAgIGhleGFnb25fVjZfdnNodWZmYl8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNodWZmYi4xMjhCCisgICAgaGV4YWdvbl9WNl92c2h1ZmZlYiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2h1ZmZlYgorICAgIGhleGFnb25fVjZfdnNodWZmZWJfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNodWZmZWIuMTI4QgorICAgIGhleGFnb25fVjZfdnNodWZmaCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNodWZmaAorICAgIGhleGFnb25fVjZfdnNodWZmaF8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNodWZmaC4xMjhCCisgICAgaGV4YWdvbl9WNl92c2h1ZmZvYiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2h1ZmZvYgorICAgIGhleGFnb25fVjZfdnNodWZmb2JfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNodWZmb2IuMTI4QgorICAgIGhleGFnb25fVjZfdnNodWZmdmRkLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNodWZmdmRkCisgICAgaGV4YWdvbl9WNl92c2h1ZmZ2ZGRfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2h1ZmZ2ZGQuMTI4QgorICAgIGhleGFnb25fVjZfdnNodWZvZWIsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnNodWZvZWIKKyAgICBoZXhhZ29uX1Y2X3ZzaHVmb2ViXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmb2ViLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzaHVmb2VoLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmb2VoCisgICAgaGV4YWdvbl9WNl92c2h1Zm9laF8xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2h1Zm9laC4xMjhCCisgICAgaGV4YWdvbl9WNl92c2h1Zm9oLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2h1Zm9oCisgICAgaGV4YWdvbl9WNl92c2h1Zm9oXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c2h1Zm9oLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzdWJiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJiCisgICAgaGV4YWdvbl9WNl92c3ViYl8xMjhCLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViYi4xMjhCCisgICAgaGV4YWdvbl9WNl92c3ViYl9kdiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViYi5kdgorICAgIGhleGFnb25fVjZfdnN1YmJfZHZfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YmIuZHYuMTI4QgorICAgIGhleGFnb25fVjZfdnN1YmJucSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YmJucQorICAgIGhleGFnb25fVjZfdnN1YmJucV8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YmJucS4xMjhCCisgICAgaGV4YWdvbl9WNl92c3ViYnEsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViYnEKKyAgICBoZXhhZ29uX1Y2X3ZzdWJicV8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJicS4xMjhCCisgICAgaGV4YWdvbl9WNl92c3ViYnNhdCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViYnNhdAorICAgIGhleGFnb25fVjZfdnN1YmJzYXRfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YmJzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdnN1YmJzYXRfZHYsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YmJzYXQuZHYKKyAgICBoZXhhZ29uX1Y2X3ZzdWJic2F0X2R2XzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJic2F0LmR2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzdWJjYXJyeSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJjYXJyeQorICAgIGhleGFnb25fVjZfdnN1YmNhcnJ5XzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YmNhcnJ5LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzdWJoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJoCisgICAgaGV4YWdvbl9WNl92c3ViaF8xMjhCLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViaC4xMjhCCisgICAgaGV4YWdvbl9WNl92c3ViaF9kdiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViaC5kdgorICAgIGhleGFnb25fVjZfdnN1YmhfZHZfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YmguZHYuMTI4QgorICAgIGhleGFnb25fVjZfdnN1YmhucSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YmhucQorICAgIGhleGFnb25fVjZfdnN1YmhucV8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YmhucS4xMjhCCisgICAgaGV4YWdvbl9WNl92c3ViaHEsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViaHEKKyAgICBoZXhhZ29uX1Y2X3ZzdWJocV8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJocS4xMjhCCisgICAgaGV4YWdvbl9WNl92c3ViaHNhdCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViaHNhdAorICAgIGhleGFnb25fVjZfdnN1YmhzYXRfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YmhzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdnN1YmhzYXRfZHYsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YmhzYXQuZHYKKyAgICBoZXhhZ29uX1Y2X3ZzdWJoc2F0X2R2XzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJoc2F0LmR2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzdWJodywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJodworICAgIGhleGFnb25fVjZfdnN1Ymh3XzEyOEIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1Ymh3LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzdWJ1YmgsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1YmgKKyAgICBoZXhhZ29uX1Y2X3ZzdWJ1YmhfMTI4QiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1YmguMTI4QgorICAgIGhleGFnb25fVjZfdnN1YnVic2F0LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YnVic2F0CisgICAgaGV4YWdvbl9WNl92c3VidWJzYXRfMTI4QiwgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidWJzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdnN1YnVic2F0X2R2LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YnVic2F0LmR2CisgICAgaGV4YWdvbl9WNl92c3VidWJzYXRfZHZfMTI4QiwgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidWJzYXQuZHYuMTI4QgorICAgIGhleGFnb25fVjZfdnN1YnVidWJiX3NhdCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YnVidWJiLnNhdAorICAgIGhleGFnb25fVjZfdnN1YnVidWJiX3NhdF8xMjhCLCAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YnVidWJiLnNhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92c3VidWhzYXQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidWhzYXQKKyAgICBoZXhhZ29uX1Y2X3ZzdWJ1aHNhdF8xMjhCLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1aHNhdC4xMjhCCisgICAgaGV4YWdvbl9WNl92c3VidWhzYXRfZHYsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidWhzYXQuZHYKKyAgICBoZXhhZ29uX1Y2X3ZzdWJ1aHNhdF9kdl8xMjhCLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1aHNhdC5kdi4xMjhCCisgICAgaGV4YWdvbl9WNl92c3VidWh3LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidWh3CisgICAgaGV4YWdvbl9WNl92c3VidWh3XzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidWh3LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzdWJ1d3NhdCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1d3NhdAorICAgIGhleGFnb25fVjZfdnN1YnV3c2F0XzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YnV3c2F0LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzdWJ1d3NhdF9kdiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1d3NhdC5kdgorICAgIGhleGFnb25fVjZfdnN1YnV3c2F0X2R2XzEyOEIsICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YnV3c2F0LmR2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3ZzdWJ3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ3CisgICAgaGV4YWdvbl9WNl92c3Vid18xMjhCLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3Vidy4xMjhCCisgICAgaGV4YWdvbl9WNl92c3Vid19kdiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3Vidy5kdgorICAgIGhleGFnb25fVjZfdnN1YndfZHZfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YncuZHYuMTI4QgorICAgIGhleGFnb25fVjZfdnN1YnducSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YnducQorICAgIGhleGFnb25fVjZfdnN1YnducV8xMjhCLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YnducS4xMjhCCisgICAgaGV4YWdvbl9WNl92c3Vid3EsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3Vid3EKKyAgICBoZXhhZ29uX1Y2X3ZzdWJ3cV8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ3cS4xMjhCCisgICAgaGV4YWdvbl9WNl92c3Vid3NhdCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3Vid3NhdAorICAgIGhleGFnb25fVjZfdnN1YndzYXRfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YndzYXQuMTI4QgorICAgIGhleGFnb25fVjZfdnN1YndzYXRfZHYsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnN1YndzYXQuZHYKKyAgICBoZXhhZ29uX1Y2X3ZzdWJ3c2F0X2R2XzEyOEIsICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ3c2F0LmR2LjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Zzd2FwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZzd2FwCisgICAgaGV4YWdvbl9WNl92c3dhcF8xMjhCLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52c3dhcC4xMjhCCisgICAgaGV4YWdvbl9WNl92dG1weWIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52dG1weWIKKyAgICBoZXhhZ29uX1Y2X3Z0bXB5Yl8xMjhCLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZ0bXB5Yi4xMjhCCisgICAgaGV4YWdvbl9WNl92dG1weWJfYWNjLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52dG1weWIuYWNjCisgICAgaGV4YWdvbl9WNl92dG1weWJfYWNjXzEyOEIsICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52dG1weWIuYWNjLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Z0bXB5YnVzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZ0bXB5YnVzCisgICAgaGV4YWdvbl9WNl92dG1weWJ1c18xMjhCLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52dG1weWJ1cy4xMjhCCisgICAgaGV4YWdvbl9WNl92dG1weWJ1c19hY2MsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52dG1weWJ1cy5hY2MKKyAgICBoZXhhZ29uX1Y2X3Z0bXB5YnVzX2FjY18xMjhCLCAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZ0bXB5YnVzLmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92dG1weWhiLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52dG1weWhiCisgICAgaGV4YWdvbl9WNl92dG1weWhiXzEyOEIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52dG1weWhiLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Z0bXB5aGJfYWNjLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZ0bXB5aGIuYWNjCisgICAgaGV4YWdvbl9WNl92dG1weWhiX2FjY18xMjhCLCAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52dG1weWhiLmFjYy4xMjhCCisgICAgaGV4YWdvbl9WNl92dW5wYWNrYiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52dW5wYWNrYgorICAgIGhleGFnb25fVjZfdnVucGFja2JfMTI4QiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnVucGFja2IuMTI4QgorICAgIGhleGFnb25fVjZfdnVucGFja2gsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnVucGFja2gKKyAgICBoZXhhZ29uX1Y2X3Z1bnBhY2toXzEyOEIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2toLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Z1bnBhY2tvYiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2tvYgorICAgIGhleGFnb25fVjZfdnVucGFja29iXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnVucGFja29iLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Z1bnBhY2tvaCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2tvaAorICAgIGhleGFnb25fVjZfdnVucGFja29oXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnVucGFja29oLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Z1bnBhY2t1YiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2t1YgorICAgIGhleGFnb25fVjZfdnVucGFja3ViXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnVucGFja3ViLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Z1bnBhY2t1aCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2t1aAorICAgIGhleGFnb25fVjZfdnVucGFja3VoXzEyOEIsICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnVucGFja3VoLjEyOEIKKyAgICBoZXhhZ29uX1Y2X3Z4b3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZ4b3IKKyAgICBoZXhhZ29uX1Y2X3Z4b3JfMTI4QiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlY2LnZ4b3IuMTI4QgorICAgIGhleGFnb25fVjZfdnpiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnpiCisgICAgaGV4YWdvbl9WNl92emJfMTI4QiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52emIuMTI4QgorICAgIGhleGFnb25fVjZfdnpoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uVjYudnpoCisgICAgaGV4YWdvbl9WNl92emhfMTI4QiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5WNi52emguMTI4QgorICAgIGhleGFnb25fWTJfZGNjbGVhbmEsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uWTIuZGNjbGVhbmEKKyAgICBoZXhhZ29uX1kyX2RjY2xlYW5pbnZhLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlkyLmRjY2xlYW5pbnZhCisgICAgaGV4YWdvbl9ZMl9kY2ludmEsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5ZMi5kY2ludmEKKyAgICBoZXhhZ29uX1kyX2RjemVyb2EsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlkyLmRjemVyb2EKKyAgICBoZXhhZ29uX1k0X2wyZmV0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlk0LmwyZmV0Y2gKKyAgICBoZXhhZ29uX1k1X2wyZmV0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLlk1LmwyZmV0Y2gKKyAgICBoZXhhZ29uX2NpcmNfbGRiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLmNpcmMubGRiCisgICAgaGV4YWdvbl9jaXJjX2xkZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5jaXJjLmxkZAorICAgIGhleGFnb25fY2lyY19sZGgsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uY2lyYy5sZGgKKyAgICBoZXhhZ29uX2NpcmNfbGR1YiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLmNpcmMubGR1YgorICAgIGhleGFnb25fY2lyY19sZHVoLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uY2lyYy5sZHVoCisgICAgaGV4YWdvbl9jaXJjX2xkdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5jaXJjLmxkdworICAgIGhleGFnb25fY2lyY19zdGIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uY2lyYy5zdGIKKyAgICBoZXhhZ29uX2NpcmNfc3RkLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLmNpcmMuc3RkCisgICAgaGV4YWdvbl9jaXJjX3N0aCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uaGV4YWdvbi5jaXJjLnN0aAorICAgIGhleGFnb25fY2lyY19zdGhoaSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uY2lyYy5zdGhoaQorICAgIGhleGFnb25fY2lyY19zdHcsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24uY2lyYy5zdHcKKyAgICBoZXhhZ29uX21tMjU2aV92YWRkdywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5oZXhhZ29uLm1tMjU2aS52YWRkdworICAgIGhleGFnb25fcHJlZmV0Y2gsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLmhleGFnb24ucHJlZmV0Y2gKKyAgICBtaXBzX2Fic3Ffc19waCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFic3Eucy5waAorICAgIG1pcHNfYWJzcV9zX3FiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWJzcS5zLnFiCisgICAgbWlwc19hYnNxX3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hYnNxLnMudworICAgIG1pcHNfYWRkX2FfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkLmEuYgorICAgIG1pcHNfYWRkX2FfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkLmEuZAorICAgIG1pcHNfYWRkX2FfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkLmEuaAorICAgIG1pcHNfYWRkX2FfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkLmEudworICAgIG1pcHNfYWRkcV9waCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkcS5waAorICAgIG1pcHNfYWRkcV9zX3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkcS5zLnBoCisgICAgbWlwc19hZGRxX3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGRxLnMudworICAgIG1pcHNfYWRkcWhfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkcWgucGgKKyAgICBtaXBzX2FkZHFoX3JfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHFoLnIucGgKKyAgICBtaXBzX2FkZHFoX3JfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHFoLnIudworICAgIG1pcHNfYWRkcWhfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkcWgudworICAgIG1pcHNfYWRkc19hX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkcy5hLmIKKyAgICBtaXBzX2FkZHNfYV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHMuYS5kCisgICAgbWlwc19hZGRzX2FfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGRzLmEuaAorICAgIG1pcHNfYWRkc19hX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkcy5hLncKKyAgICBtaXBzX2FkZHNfc19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHMucy5iCisgICAgbWlwc19hZGRzX3NfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGRzLnMuZAorICAgIG1pcHNfYWRkc19zX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkcy5zLmgKKyAgICBtaXBzX2FkZHNfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHMucy53CisgICAgbWlwc19hZGRzX3VfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGRzLnUuYgorICAgIG1pcHNfYWRkc191X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkcy51LmQKKyAgICBtaXBzX2FkZHNfdV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHMudS5oCisgICAgbWlwc19hZGRzX3VfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGRzLnUudworICAgIG1pcHNfYWRkc2MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkc2MKKyAgICBtaXBzX2FkZHVfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHUucGgKKyAgICBtaXBzX2FkZHVfcWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHUucWIKKyAgICBtaXBzX2FkZHVfc19waCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHUucy5waAorICAgIG1pcHNfYWRkdV9zX3FiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkdS5zLnFiCisgICAgbWlwc19hZGR1aF9xYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGR1aC5xYgorICAgIG1pcHNfYWRkdWhfcl9xYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkdWguci5xYgorICAgIG1pcHNfYWRkdl9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkdi5iCisgICAgbWlwc19hZGR2X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGR2LmQKKyAgICBtaXBzX2FkZHZfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFkZHYuaAorICAgIG1pcHNfYWRkdl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYWRkdi53CisgICAgbWlwc19hZGR2aV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGR2aS5iCisgICAgbWlwc19hZGR2aV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGR2aS5kCisgICAgbWlwc19hZGR2aV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGR2aS5oCisgICAgbWlwc19hZGR2aV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGR2aS53CisgICAgbWlwc19hZGR3YywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hZGR3YworICAgIG1pcHNfYW5kX3YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYW5kLnYKKyAgICBtaXBzX2FuZGlfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFuZGkuYgorICAgIG1pcHNfYXBwZW5kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYXBwZW5kCisgICAgbWlwc19hc3ViX3NfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hc3ViLnMuYgorICAgIG1pcHNfYXN1Yl9zX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYXN1Yi5zLmQKKyAgICBtaXBzX2FzdWJfc19oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFzdWIucy5oCisgICAgbWlwc19hc3ViX3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hc3ViLnMudworICAgIG1pcHNfYXN1Yl91X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYXN1Yi51LmIKKyAgICBtaXBzX2FzdWJfdV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmFzdWIudS5kCisgICAgbWlwc19hc3ViX3VfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hc3ViLnUuaAorICAgIG1pcHNfYXN1Yl91X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYXN1Yi51LncKKyAgICBtaXBzX2F2ZV9zX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmF2ZS5zLmIKKyAgICBtaXBzX2F2ZV9zX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmF2ZS5zLmQKKyAgICBtaXBzX2F2ZV9zX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmF2ZS5zLmgKKyAgICBtaXBzX2F2ZV9zX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmF2ZS5zLncKKyAgICBtaXBzX2F2ZV91X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmF2ZS51LmIKKyAgICBtaXBzX2F2ZV91X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmF2ZS51LmQKKyAgICBtaXBzX2F2ZV91X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmF2ZS51LmgKKyAgICBtaXBzX2F2ZV91X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmF2ZS51LncKKyAgICBtaXBzX2F2ZXJfc19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmF2ZXIucy5iCisgICAgbWlwc19hdmVyX3NfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hdmVyLnMuZAorICAgIG1pcHNfYXZlcl9zX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYXZlci5zLmgKKyAgICBtaXBzX2F2ZXJfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmF2ZXIucy53CisgICAgbWlwc19hdmVyX3VfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hdmVyLnUuYgorICAgIG1pcHNfYXZlcl91X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYXZlci51LmQKKyAgICBtaXBzX2F2ZXJfdV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmF2ZXIudS5oCisgICAgbWlwc19hdmVyX3VfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5hdmVyLnUudworICAgIG1pcHNfYmFsaWduLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYmFsaWduCisgICAgbWlwc19iY2xyX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iY2xyLmIKKyAgICBtaXBzX2JjbHJfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJjbHIuZAorICAgIG1pcHNfYmNscl9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYmNsci5oCisgICAgbWlwc19iY2xyX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iY2xyLncKKyAgICBtaXBzX2JjbHJpX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJjbHJpLmIKKyAgICBtaXBzX2JjbHJpX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJjbHJpLmQKKyAgICBtaXBzX2JjbHJpX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJjbHJpLmgKKyAgICBtaXBzX2JjbHJpX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJjbHJpLncKKyAgICBtaXBzX2JpbnNsX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJpbnNsLmIKKyAgICBtaXBzX2JpbnNsX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJpbnNsLmQKKyAgICBtaXBzX2JpbnNsX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJpbnNsLmgKKyAgICBtaXBzX2JpbnNsX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJpbnNsLncKKyAgICBtaXBzX2JpbnNsaV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJpbnNsaS5iCisgICAgbWlwc19iaW5zbGlfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iaW5zbGkuZAorICAgIG1pcHNfYmluc2xpX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYmluc2xpLmgKKyAgICBtaXBzX2JpbnNsaV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJpbnNsaS53CisgICAgbWlwc19iaW5zcl9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iaW5zci5iCisgICAgbWlwc19iaW5zcl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iaW5zci5kCisgICAgbWlwc19iaW5zcl9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iaW5zci5oCisgICAgbWlwc19iaW5zcl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iaW5zci53CisgICAgbWlwc19iaW5zcmlfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iaW5zcmkuYgorICAgIG1pcHNfYmluc3JpX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYmluc3JpLmQKKyAgICBtaXBzX2JpbnNyaV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJpbnNyaS5oCisgICAgbWlwc19iaW5zcmlfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5iaW5zcmkudworICAgIG1pcHNfYml0cmV2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYml0cmV2CisgICAgbWlwc19ibW56X3YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ibW56LnYKKyAgICBtaXBzX2JtbnppX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJtbnppLmIKKyAgICBtaXBzX2Jtel92LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJtei52CisgICAgbWlwc19ibXppX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ibXppLmIKKyAgICBtaXBzX2JuZWdfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJuZWcuYgorICAgIG1pcHNfYm5lZ19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYm5lZy5kCisgICAgbWlwc19ibmVnX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ibmVnLmgKKyAgICBtaXBzX2JuZWdfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJuZWcudworICAgIG1pcHNfYm5lZ2lfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYm5lZ2kuYgorICAgIG1pcHNfYm5lZ2lfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYm5lZ2kuZAorICAgIG1pcHNfYm5lZ2lfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYm5lZ2kuaAorICAgIG1pcHNfYm5lZ2lfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYm5lZ2kudworICAgIG1pcHNfYm56X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYm56LmIKKyAgICBtaXBzX2Juel9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJuei5kCisgICAgbWlwc19ibnpfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ibnouaAorICAgIG1pcHNfYm56X3YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYm56LnYKKyAgICBtaXBzX2Juel93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJuei53CisgICAgbWlwc19icG9zZ2UzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5icG9zZ2UzMgorICAgIG1pcHNfYnNlbF92LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYnNlbC52CisgICAgbWlwc19ic2VsaV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ic2VsaS5iCisgICAgbWlwc19ic2V0X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ic2V0LmIKKyAgICBtaXBzX2JzZXRfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJzZXQuZAorICAgIG1pcHNfYnNldF9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuYnNldC5oCisgICAgbWlwc19ic2V0X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ic2V0LncKKyAgICBtaXBzX2JzZXRpX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJzZXRpLmIKKyAgICBtaXBzX2JzZXRpX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJzZXRpLmQKKyAgICBtaXBzX2JzZXRpX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJzZXRpLmgKKyAgICBtaXBzX2JzZXRpX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJzZXRpLncKKyAgICBtaXBzX2J6X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJ6LmIKKyAgICBtaXBzX2J6X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJ6LmQKKyAgICBtaXBzX2J6X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJ6LmgKKyAgICBtaXBzX2J6X3YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJ6LnYKKyAgICBtaXBzX2J6X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmJ6LncKKyAgICBtaXBzX2NlcV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNlcS5iCisgICAgbWlwc19jZXFfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jZXEuZAorICAgIG1pcHNfY2VxX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2VxLmgKKyAgICBtaXBzX2NlcV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNlcS53CisgICAgbWlwc19jZXFpX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jZXFpLmIKKyAgICBtaXBzX2NlcWlfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNlcWkuZAorICAgIG1pcHNfY2VxaV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2VxaS5oCisgICAgbWlwc19jZXFpX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jZXFpLncKKyAgICBtaXBzX2NmY21zYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNmY21zYQorICAgIG1pcHNfY2xlX3NfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2xlLnMuYgorICAgIG1pcHNfY2xlX3NfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2xlLnMuZAorICAgIG1pcHNfY2xlX3NfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2xlLnMuaAorICAgIG1pcHNfY2xlX3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2xlLnMudworICAgIG1pcHNfY2xlX3VfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2xlLnUuYgorICAgIG1pcHNfY2xlX3VfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2xlLnUuZAorICAgIG1pcHNfY2xlX3VfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2xlLnUuaAorICAgIG1pcHNfY2xlX3VfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2xlLnUudworICAgIG1pcHNfY2xlaV9zX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2xlaS5zLmIKKyAgICBtaXBzX2NsZWlfc19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNsZWkucy5kCisgICAgbWlwc19jbGVpX3NfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbGVpLnMuaAorICAgIG1pcHNfY2xlaV9zX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2xlaS5zLncKKyAgICBtaXBzX2NsZWlfdV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNsZWkudS5iCisgICAgbWlwc19jbGVpX3VfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbGVpLnUuZAorICAgIG1pcHNfY2xlaV91X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2xlaS51LmgKKyAgICBtaXBzX2NsZWlfdV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNsZWkudS53CisgICAgbWlwc19jbHRfc19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbHQucy5iCisgICAgbWlwc19jbHRfc19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbHQucy5kCisgICAgbWlwc19jbHRfc19oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbHQucy5oCisgICAgbWlwc19jbHRfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbHQucy53CisgICAgbWlwc19jbHRfdV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbHQudS5iCisgICAgbWlwc19jbHRfdV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbHQudS5kCisgICAgbWlwc19jbHRfdV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbHQudS5oCisgICAgbWlwc19jbHRfdV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbHQudS53CisgICAgbWlwc19jbHRpX3NfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbHRpLnMuYgorICAgIG1pcHNfY2x0aV9zX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2x0aS5zLmQKKyAgICBtaXBzX2NsdGlfc19oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNsdGkucy5oCisgICAgbWlwc19jbHRpX3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbHRpLnMudworICAgIG1pcHNfY2x0aV91X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2x0aS51LmIKKyAgICBtaXBzX2NsdGlfdV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNsdGkudS5kCisgICAgbWlwc19jbHRpX3VfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbHRpLnUuaAorICAgIG1pcHNfY2x0aV91X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY2x0aS51LncKKyAgICBtaXBzX2NtcF9lcV9waCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNtcC5lcS5waAorICAgIG1pcHNfY21wX2xlX3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY21wLmxlLnBoCisgICAgbWlwc19jbXBfbHRfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbXAubHQucGgKKyAgICBtaXBzX2NtcGdkdV9lcV9xYiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNtcGdkdS5lcS5xYgorICAgIG1pcHNfY21wZ2R1X2xlX3FiLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY21wZ2R1LmxlLnFiCisgICAgbWlwc19jbXBnZHVfbHRfcWIsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbXBnZHUubHQucWIKKyAgICBtaXBzX2NtcGd1X2VxX3FiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNtcGd1LmVxLnFiCisgICAgbWlwc19jbXBndV9sZV9xYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jbXBndS5sZS5xYgorICAgIG1pcHNfY21wZ3VfbHRfcWIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY21wZ3UubHQucWIKKyAgICBtaXBzX2NtcHVfZXFfcWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNtcHUuZXEucWIKKyAgICBtaXBzX2NtcHVfbGVfcWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNtcHUubGUucWIKKyAgICBtaXBzX2NtcHVfbHRfcWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNtcHUubHQucWIKKyAgICBtaXBzX2NvcHlfc19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNvcHkucy5iCisgICAgbWlwc19jb3B5X3NfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jb3B5LnMuZAorICAgIG1pcHNfY29weV9zX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY29weS5zLmgKKyAgICBtaXBzX2NvcHlfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNvcHkucy53CisgICAgbWlwc19jb3B5X3VfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jb3B5LnUuYgorICAgIG1pcHNfY29weV91X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY29weS51LmQKKyAgICBtaXBzX2NvcHlfdV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmNvcHkudS5oCisgICAgbWlwc19jb3B5X3VfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5jb3B5LnUudworICAgIG1pcHNfY3RjbXNhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuY3RjbXNhCisgICAgbWlwc19kaXZfc19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kaXYucy5iCisgICAgbWlwc19kaXZfc19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kaXYucy5kCisgICAgbWlwc19kaXZfc19oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kaXYucy5oCisgICAgbWlwc19kaXZfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kaXYucy53CisgICAgbWlwc19kaXZfdV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kaXYudS5iCisgICAgbWlwc19kaXZfdV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kaXYudS5kCisgICAgbWlwc19kaXZfdV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kaXYudS5oCisgICAgbWlwc19kaXZfdV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kaXYudS53CisgICAgbWlwc19kbHNhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kbHNhCisgICAgbWlwc19kb3RwX3NfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kb3RwLnMuZAorICAgIG1pcHNfZG90cF9zX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZG90cC5zLmgKKyAgICBtaXBzX2RvdHBfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRvdHAucy53CisgICAgbWlwc19kb3RwX3VfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kb3RwLnUuZAorICAgIG1pcHNfZG90cF91X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZG90cC51LmgKKyAgICBtaXBzX2RvdHBfdV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRvdHAudS53CisgICAgbWlwc19kcGFfd19waCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcGEudy5waAorICAgIG1pcHNfZHBhZGRfc19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZHBhZGQucy5kCisgICAgbWlwc19kcGFkZF9zX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcGFkZC5zLmgKKyAgICBtaXBzX2RwYWRkX3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRwYWRkLnMudworICAgIG1pcHNfZHBhZGRfdV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZHBhZGQudS5kCisgICAgbWlwc19kcGFkZF91X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcGFkZC51LmgKKyAgICBtaXBzX2RwYWRkX3VfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRwYWRkLnUudworICAgIG1pcHNfZHBhcV9zX3dfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZHBhcS5zLncucGgKKyAgICBtaXBzX2RwYXFfc2FfbF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRwYXEuc2EubC53CisgICAgbWlwc19kcGFxeF9zX3dfcGgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcGFxeC5zLncucGgKKyAgICBtaXBzX2RwYXF4X3NhX3dfcGgsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRwYXF4LnNhLncucGgKKyAgICBtaXBzX2RwYXVfaF9xYmwsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRwYXUuaC5xYmwKKyAgICBtaXBzX2RwYXVfaF9xYnIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRwYXUuaC5xYnIKKyAgICBtaXBzX2RwYXhfd19waCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRwYXgudy5waAorICAgIG1pcHNfZHBzX3dfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZHBzLncucGgKKyAgICBtaXBzX2Rwc3Ffc193X3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRwc3Eucy53LnBoCisgICAgbWlwc19kcHNxX3NhX2xfdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcHNxLnNhLmwudworICAgIG1pcHNfZHBzcXhfc193X3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZHBzcXgucy53LnBoCisgICAgbWlwc19kcHNxeF9zYV93X3BoLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcHNxeC5zYS53LnBoCisgICAgbWlwc19kcHN1X2hfcWJsLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcHN1LmgucWJsCisgICAgbWlwc19kcHN1X2hfcWJyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcHN1LmgucWJyCisgICAgbWlwc19kcHN1Yl9zX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcHN1Yi5zLmQKKyAgICBtaXBzX2Rwc3ViX3NfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRwc3ViLnMuaAorICAgIG1pcHNfZHBzdWJfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZHBzdWIucy53CisgICAgbWlwc19kcHN1Yl91X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcHN1Yi51LmQKKyAgICBtaXBzX2Rwc3ViX3VfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmRwc3ViLnUuaAorICAgIG1pcHNfZHBzdWJfdV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZHBzdWIudS53CisgICAgbWlwc19kcHN4X3dfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5kcHN4LncucGgKKyAgICBtaXBzX2V4dHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmV4dHAKKyAgICBtaXBzX2V4dHBkcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmV4dHBkcAorICAgIG1pcHNfZXh0cl9yX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZXh0ci5yLncKKyAgICBtaXBzX2V4dHJfcnNfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmV4dHIucnMudworICAgIG1pcHNfZXh0cl9zX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZXh0ci5zLmgKKyAgICBtaXBzX2V4dHJfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmV4dHIudworICAgIG1pcHNfZmFkZF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmFkZC5kCisgICAgbWlwc19mYWRkX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mYWRkLncKKyAgICBtaXBzX2ZjYWZfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZjYWYuZAorICAgIG1pcHNfZmNhZl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmNhZi53CisgICAgbWlwc19mY2VxX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mY2VxLmQKKyAgICBtaXBzX2ZjZXFfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZjZXEudworICAgIG1pcHNfZmNsYXNzX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmNsYXNzLmQKKyAgICBtaXBzX2ZjbGFzc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZjbGFzcy53CisgICAgbWlwc19mY2xlX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mY2xlLmQKKyAgICBtaXBzX2ZjbGVfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZjbGUudworICAgIG1pcHNfZmNsdF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmNsdC5kCisgICAgbWlwc19mY2x0X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mY2x0LncKKyAgICBtaXBzX2ZjbmVfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZjbmUuZAorICAgIG1pcHNfZmNuZV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmNuZS53CisgICAgbWlwc19mY29yX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mY29yLmQKKyAgICBtaXBzX2Zjb3JfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZjb3IudworICAgIG1pcHNfZmN1ZXFfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmN1ZXEuZAorICAgIG1pcHNfZmN1ZXFfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmN1ZXEudworICAgIG1pcHNfZmN1bGVfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmN1bGUuZAorICAgIG1pcHNfZmN1bGVfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmN1bGUudworICAgIG1pcHNfZmN1bHRfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmN1bHQuZAorICAgIG1pcHNfZmN1bHRfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmN1bHQudworICAgIG1pcHNfZmN1bl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmN1bi5kCisgICAgbWlwc19mY3VuX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mY3VuLncKKyAgICBtaXBzX2ZjdW5lX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZjdW5lLmQKKyAgICBtaXBzX2ZjdW5lX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZjdW5lLncKKyAgICBtaXBzX2ZkaXZfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZkaXYuZAorICAgIG1pcHNfZmRpdl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmRpdi53CisgICAgbWlwc19mZXhkb19oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mZXhkby5oCisgICAgbWlwc19mZXhkb193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mZXhkby53CisgICAgbWlwc19mZXhwMl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mZXhwMi5kCisgICAgbWlwc19mZXhwMl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mZXhwMi53CisgICAgbWlwc19mZXh1cGxfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mZXh1cGwuZAorICAgIG1pcHNfZmV4dXBsX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmV4dXBsLncKKyAgICBtaXBzX2ZleHVwcl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZleHVwci5kCisgICAgbWlwc19mZXh1cHJfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mZXh1cHIudworICAgIG1pcHNfZmZpbnRfc19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmZpbnQucy5kCisgICAgbWlwc19mZmludF9zX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mZmludC5zLncKKyAgICBtaXBzX2ZmaW50X3VfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZmaW50LnUuZAorICAgIG1pcHNfZmZpbnRfdV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmZpbnQudS53CisgICAgbWlwc19mZnFsX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mZnFsLmQKKyAgICBtaXBzX2ZmcWxfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZmcWwudworICAgIG1pcHNfZmZxcl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmZxci5kCisgICAgbWlwc19mZnFyX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mZnFyLncKKyAgICBtaXBzX2ZpbGxfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZpbGwuYgorICAgIG1pcHNfZmlsbF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmlsbC5kCisgICAgbWlwc19maWxsX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5maWxsLmgKKyAgICBtaXBzX2ZpbGxfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZpbGwudworICAgIG1pcHNfZmxvZzJfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmxvZzIuZAorICAgIG1pcHNfZmxvZzJfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZmxvZzIudworICAgIG1pcHNfZm1hZGRfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZm1hZGQuZAorICAgIG1pcHNfZm1hZGRfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZm1hZGQudworICAgIG1pcHNfZm1heF9hX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZm1heC5hLmQKKyAgICBtaXBzX2ZtYXhfYV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZtYXguYS53CisgICAgbWlwc19mbWF4X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mbWF4LmQKKyAgICBtaXBzX2ZtYXhfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZtYXgudworICAgIG1pcHNfZm1pbl9hX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZm1pbi5hLmQKKyAgICBtaXBzX2ZtaW5fYV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZtaW4uYS53CisgICAgbWlwc19mbWluX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mbWluLmQKKyAgICBtaXBzX2ZtaW5fdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZtaW4udworICAgIG1pcHNfZm1zdWJfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZm1zdWIuZAorICAgIG1pcHNfZm1zdWJfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZm1zdWIudworICAgIG1pcHNfZm11bF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZm11bC5kCisgICAgbWlwc19mbXVsX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mbXVsLncKKyAgICBtaXBzX2ZyY3BfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZyY3AuZAorICAgIG1pcHNfZnJjcF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnJjcC53CisgICAgbWlwc19mcmludF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mcmludC5kCisgICAgbWlwc19mcmludF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mcmludC53CisgICAgbWlwc19mcnNxcnRfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mcnNxcnQuZAorICAgIG1pcHNfZnJzcXJ0X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnJzcXJ0LncKKyAgICBtaXBzX2ZzYWZfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZzYWYuZAorICAgIG1pcHNfZnNhZl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnNhZi53CisgICAgbWlwc19mc2VxX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mc2VxLmQKKyAgICBtaXBzX2ZzZXFfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZzZXEudworICAgIG1pcHNfZnNsZV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnNsZS5kCisgICAgbWlwc19mc2xlX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mc2xlLncKKyAgICBtaXBzX2ZzbHRfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZzbHQuZAorICAgIG1pcHNfZnNsdF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnNsdC53CisgICAgbWlwc19mc25lX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mc25lLmQKKyAgICBtaXBzX2ZzbmVfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZzbmUudworICAgIG1pcHNfZnNvcl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnNvci5kCisgICAgbWlwc19mc29yX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mc29yLncKKyAgICBtaXBzX2ZzcXJ0X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZzcXJ0LmQKKyAgICBtaXBzX2ZzcXJ0X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZzcXJ0LncKKyAgICBtaXBzX2ZzdWJfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZzdWIuZAorICAgIG1pcHNfZnN1Yl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnN1Yi53CisgICAgbWlwc19mc3VlcV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mc3VlcS5kCisgICAgbWlwc19mc3VlcV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mc3VlcS53CisgICAgbWlwc19mc3VsZV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mc3VsZS5kCisgICAgbWlwc19mc3VsZV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mc3VsZS53CisgICAgbWlwc19mc3VsdF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mc3VsdC5kCisgICAgbWlwc19mc3VsdF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mc3VsdC53CisgICAgbWlwc19mc3VuX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mc3VuLmQKKyAgICBtaXBzX2ZzdW5fdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZzdW4udworICAgIG1pcHNfZnN1bmVfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnN1bmUuZAorICAgIG1pcHNfZnN1bmVfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnN1bmUudworICAgIG1pcHNfZnRpbnRfc19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnRpbnQucy5kCisgICAgbWlwc19mdGludF9zX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mdGludC5zLncKKyAgICBtaXBzX2Z0aW50X3VfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZ0aW50LnUuZAorICAgIG1pcHNfZnRpbnRfdV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnRpbnQudS53CisgICAgbWlwc19mdHFfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5mdHEuaAorICAgIG1pcHNfZnRxX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuZnRxLncKKyAgICBtaXBzX2Z0cnVuY19zX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZ0cnVuYy5zLmQKKyAgICBtaXBzX2Z0cnVuY19zX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZ0cnVuYy5zLncKKyAgICBtaXBzX2Z0cnVuY191X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZ0cnVuYy51LmQKKyAgICBtaXBzX2Z0cnVuY191X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmZ0cnVuYy51LncKKyAgICBtaXBzX2hhZGRfc19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmhhZGQucy5kCisgICAgbWlwc19oYWRkX3NfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5oYWRkLnMuaAorICAgIG1pcHNfaGFkZF9zX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaGFkZC5zLncKKyAgICBtaXBzX2hhZGRfdV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmhhZGQudS5kCisgICAgbWlwc19oYWRkX3VfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5oYWRkLnUuaAorICAgIG1pcHNfaGFkZF91X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaGFkZC51LncKKyAgICBtaXBzX2hzdWJfc19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmhzdWIucy5kCisgICAgbWlwc19oc3ViX3NfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5oc3ViLnMuaAorICAgIG1pcHNfaHN1Yl9zX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaHN1Yi5zLncKKyAgICBtaXBzX2hzdWJfdV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmhzdWIudS5kCisgICAgbWlwc19oc3ViX3VfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5oc3ViLnUuaAorICAgIG1pcHNfaHN1Yl91X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaHN1Yi51LncKKyAgICBtaXBzX2lsdmV2X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmlsdmV2LmIKKyAgICBtaXBzX2lsdmV2X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmlsdmV2LmQKKyAgICBtaXBzX2lsdmV2X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmlsdmV2LmgKKyAgICBtaXBzX2lsdmV2X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmlsdmV2LncKKyAgICBtaXBzX2lsdmxfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmlsdmwuYgorICAgIG1pcHNfaWx2bF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaWx2bC5kCisgICAgbWlwc19pbHZsX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5pbHZsLmgKKyAgICBtaXBzX2lsdmxfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmlsdmwudworICAgIG1pcHNfaWx2b2RfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaWx2b2QuYgorICAgIG1pcHNfaWx2b2RfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaWx2b2QuZAorICAgIG1pcHNfaWx2b2RfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaWx2b2QuaAorICAgIG1pcHNfaWx2b2RfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaWx2b2QudworICAgIG1pcHNfaWx2cl9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaWx2ci5iCisgICAgbWlwc19pbHZyX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5pbHZyLmQKKyAgICBtaXBzX2lsdnJfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmlsdnIuaAorICAgIG1pcHNfaWx2cl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaWx2ci53CisgICAgbWlwc19pbnNlcnRfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5pbnNlcnQuYgorICAgIG1pcHNfaW5zZXJ0X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaW5zZXJ0LmQKKyAgICBtaXBzX2luc2VydF9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmluc2VydC5oCisgICAgbWlwc19pbnNlcnRfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5pbnNlcnQudworICAgIG1pcHNfaW5zdiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaW5zdgorICAgIG1pcHNfaW5zdmVfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaW5zdmUuYgorICAgIG1pcHNfaW5zdmVfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaW5zdmUuZAorICAgIG1pcHNfaW5zdmVfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaW5zdmUuaAorICAgIG1pcHNfaW5zdmVfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuaW5zdmUudworICAgIG1pcHNfbGJ1eCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubGJ1eAorICAgIG1pcHNfbGRfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubGQuYgorICAgIG1pcHNfbGRfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubGQuZAorICAgIG1pcHNfbGRfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubGQuaAorICAgIG1pcHNfbGRfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubGQudworICAgIG1pcHNfbGRpX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubGRpLmIKKyAgICBtaXBzX2xkaV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmxkaS5kCisgICAgbWlwc19sZGlfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5sZGkuaAorICAgIG1pcHNfbGRpX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubGRpLncKKyAgICBtaXBzX2xoeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLmxoeAorICAgIG1pcHNfbHNhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubHNhCisgICAgbWlwc19sd3gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5sd3gKKyAgICBtaXBzX21hZGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1hZGQKKyAgICBtaXBzX21hZGRfcV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1hZGQucS5oCisgICAgbWlwc19tYWRkX3FfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYWRkLnEudworICAgIG1pcHNfbWFkZHJfcV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWFkZHIucS5oCisgICAgbWlwc19tYWRkcl9xX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYWRkci5xLncKKyAgICBtaXBzX21hZGR1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1hZGR1CisgICAgbWlwc19tYWRkdl9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYWRkdi5iCisgICAgbWlwc19tYWRkdl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYWRkdi5kCisgICAgbWlwc19tYWRkdl9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYWRkdi5oCisgICAgbWlwc19tYWRkdl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYWRkdi53CisgICAgbWlwc19tYXFfc193X3BobCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYXEucy53LnBobAorICAgIG1pcHNfbWFxX3Nfd19waHIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWFxLnMudy5waHIKKyAgICBtaXBzX21hcV9zYV93X3BobCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1hcS5zYS53LnBobAorICAgIG1pcHNfbWFxX3NhX3dfcGhyLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWFxLnNhLncucGhyCisgICAgbWlwc19tYXhfYV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYXguYS5iCisgICAgbWlwc19tYXhfYV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYXguYS5kCisgICAgbWlwc19tYXhfYV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYXguYS5oCisgICAgbWlwc19tYXhfYV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYXguYS53CisgICAgbWlwc19tYXhfc19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYXgucy5iCisgICAgbWlwc19tYXhfc19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYXgucy5kCisgICAgbWlwc19tYXhfc19oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYXgucy5oCisgICAgbWlwc19tYXhfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYXgucy53CisgICAgbWlwc19tYXhfdV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYXgudS5iCisgICAgbWlwc19tYXhfdV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYXgudS5kCisgICAgbWlwc19tYXhfdV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYXgudS5oCisgICAgbWlwc19tYXhfdV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYXgudS53CisgICAgbWlwc19tYXhpX3NfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYXhpLnMuYgorICAgIG1pcHNfbWF4aV9zX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWF4aS5zLmQKKyAgICBtaXBzX21heGlfc19oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1heGkucy5oCisgICAgbWlwc19tYXhpX3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYXhpLnMudworICAgIG1pcHNfbWF4aV91X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWF4aS51LmIKKyAgICBtaXBzX21heGlfdV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1heGkudS5kCisgICAgbWlwc19tYXhpX3VfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tYXhpLnUuaAorICAgIG1pcHNfbWF4aV91X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWF4aS51LncKKyAgICBtaXBzX21pbl9hX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1pbi5hLmIKKyAgICBtaXBzX21pbl9hX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1pbi5hLmQKKyAgICBtaXBzX21pbl9hX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1pbi5hLmgKKyAgICBtaXBzX21pbl9hX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1pbi5hLncKKyAgICBtaXBzX21pbl9zX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1pbi5zLmIKKyAgICBtaXBzX21pbl9zX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1pbi5zLmQKKyAgICBtaXBzX21pbl9zX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1pbi5zLmgKKyAgICBtaXBzX21pbl9zX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1pbi5zLncKKyAgICBtaXBzX21pbl91X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1pbi51LmIKKyAgICBtaXBzX21pbl91X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1pbi51LmQKKyAgICBtaXBzX21pbl91X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1pbi51LmgKKyAgICBtaXBzX21pbl91X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1pbi51LncKKyAgICBtaXBzX21pbmlfc19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1pbmkucy5iCisgICAgbWlwc19taW5pX3NfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5taW5pLnMuZAorICAgIG1pcHNfbWluaV9zX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWluaS5zLmgKKyAgICBtaXBzX21pbmlfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1pbmkucy53CisgICAgbWlwc19taW5pX3VfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5taW5pLnUuYgorICAgIG1pcHNfbWluaV91X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubWluaS51LmQKKyAgICBtaXBzX21pbmlfdV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1pbmkudS5oCisgICAgbWlwc19taW5pX3VfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5taW5pLnUudworICAgIG1pcHNfbW9kX3NfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubW9kLnMuYgorICAgIG1pcHNfbW9kX3NfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubW9kLnMuZAorICAgIG1pcHNfbW9kX3NfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubW9kLnMuaAorICAgIG1pcHNfbW9kX3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubW9kLnMudworICAgIG1pcHNfbW9kX3VfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubW9kLnUuYgorICAgIG1pcHNfbW9kX3VfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubW9kLnUuZAorICAgIG1pcHNfbW9kX3VfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubW9kLnUuaAorICAgIG1pcHNfbW9kX3VfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubW9kLnUudworICAgIG1pcHNfbW9kc3ViLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubW9kc3ViCisgICAgbWlwc19tb3ZlX3YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tb3ZlLnYKKyAgICBtaXBzX21zdWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1zdWIKKyAgICBtaXBzX21zdWJfcV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1zdWIucS5oCisgICAgbWlwc19tc3ViX3FfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tc3ViLnEudworICAgIG1pcHNfbXN1YnJfcV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubXN1YnIucS5oCisgICAgbWlwc19tc3Vicl9xX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tc3Vici5xLncKKyAgICBtaXBzX21zdWJ1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm1zdWJ1CisgICAgbWlwc19tc3Vidl9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tc3Vidi5iCisgICAgbWlwc19tc3Vidl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tc3Vidi5kCisgICAgbWlwc19tc3Vidl9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tc3Vidi5oCisgICAgbWlwc19tc3Vidl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tc3Vidi53CisgICAgbWlwc19tdGhsaXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tdGhsaXAKKyAgICBtaXBzX211bF9waCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm11bC5waAorICAgIG1pcHNfbXVsX3FfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubXVsLnEuaAorICAgIG1pcHNfbXVsX3FfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubXVsLnEudworICAgIG1pcHNfbXVsX3NfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubXVsLnMucGgKKyAgICBtaXBzX211bGVxX3Nfd19waGwsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm11bGVxLnMudy5waGwKKyAgICBtaXBzX211bGVxX3Nfd19waHIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm11bGVxLnMudy5waHIKKyAgICBtaXBzX211bGV1X3NfcGhfcWJsLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm11bGV1LnMucGgucWJsCisgICAgbWlwc19tdWxldV9zX3BoX3FiciwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tdWxldS5zLnBoLnFicgorICAgIG1pcHNfbXVscV9yc19waCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubXVscS5ycy5waAorICAgIG1pcHNfbXVscV9yc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubXVscS5ycy53CisgICAgbWlwc19tdWxxX3NfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tdWxxLnMucGgKKyAgICBtaXBzX211bHFfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm11bHEucy53CisgICAgbWlwc19tdWxyX3FfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tdWxyLnEuaAorICAgIG1pcHNfbXVscl9xX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubXVsci5xLncKKyAgICBtaXBzX211bHNhX3dfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm11bHNhLncucGgKKyAgICBtaXBzX211bHNhcV9zX3dfcGgsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm11bHNhcS5zLncucGgKKyAgICBtaXBzX211bHQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm11bHQKKyAgICBtaXBzX211bHR1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm11bHR1CisgICAgbWlwc19tdWx2X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tdWx2LmIKKyAgICBtaXBzX211bHZfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm11bHYuZAorICAgIG1pcHNfbXVsdl9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubXVsdi5oCisgICAgbWlwc19tdWx2X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5tdWx2LncKKyAgICBtaXBzX25sb2NfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm5sb2MuYgorICAgIG1pcHNfbmxvY19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubmxvYy5kCisgICAgbWlwc19ubG9jX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ubG9jLmgKKyAgICBtaXBzX25sb2NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm5sb2MudworICAgIG1pcHNfbmx6Y19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubmx6Yy5iCisgICAgbWlwc19ubHpjX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ubHpjLmQKKyAgICBtaXBzX25semNfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLm5semMuaAorICAgIG1pcHNfbmx6Y193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubmx6Yy53CisgICAgbWlwc19ub3JfdiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5ub3IudgorICAgIG1pcHNfbm9yaV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMubm9yaS5iCisgICAgbWlwc19vcl92LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5vci52CisgICAgbWlwc19vcmlfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5vcmkuYgorICAgIG1pcHNfcGFja3JsX3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucGFja3JsLnBoCisgICAgbWlwc19wY2tldl9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5wY2tldi5iCisgICAgbWlwc19wY2tldl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5wY2tldi5kCisgICAgbWlwc19wY2tldl9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5wY2tldi5oCisgICAgbWlwc19wY2tldl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5wY2tldi53CisgICAgbWlwc19wY2tvZF9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5wY2tvZC5iCisgICAgbWlwc19wY2tvZF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5wY2tvZC5kCisgICAgbWlwc19wY2tvZF9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5wY2tvZC5oCisgICAgbWlwc19wY2tvZF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5wY2tvZC53CisgICAgbWlwc19wY250X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5wY250LmIKKyAgICBtaXBzX3BjbnRfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnBjbnQuZAorICAgIG1pcHNfcGNudF9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucGNudC5oCisgICAgbWlwc19wY250X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5wY250LncKKyAgICBtaXBzX3BpY2tfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnBpY2sucGgKKyAgICBtaXBzX3BpY2tfcWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnBpY2sucWIKKyAgICBtaXBzX3ByZWNlcV93X3BobCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnByZWNlcS53LnBobAorICAgIG1pcHNfcHJlY2VxX3dfcGhyLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucHJlY2VxLncucGhyCisgICAgbWlwc19wcmVjZXF1X3BoX3FibCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5wcmVjZXF1LnBoLnFibAorICAgIG1pcHNfcHJlY2VxdV9waF9xYmxhLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucHJlY2VxdS5waC5xYmxhCisgICAgbWlwc19wcmVjZXF1X3BoX3FiciwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5wcmVjZXF1LnBoLnFicgorICAgIG1pcHNfcHJlY2VxdV9waF9xYnJhLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucHJlY2VxdS5waC5xYnJhCisgICAgbWlwc19wcmVjZXVfcGhfcWJsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5wcmVjZXUucGgucWJsCisgICAgbWlwc19wcmVjZXVfcGhfcWJsYSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5wcmVjZXUucGgucWJsYQorICAgIG1pcHNfcHJlY2V1X3BoX3FiciwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucHJlY2V1LnBoLnFicgorICAgIG1pcHNfcHJlY2V1X3BoX3FicmEsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucHJlY2V1LnBoLnFicmEKKyAgICBtaXBzX3ByZWNyX3FiX3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnByZWNyLnFiLnBoCisgICAgbWlwc19wcmVjcl9zcmFfcGhfdywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5wcmVjci5zcmEucGgudworICAgIG1pcHNfcHJlY3Jfc3JhX3JfcGhfdywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucHJlY3Iuc3JhLnIucGgudworICAgIG1pcHNfcHJlY3JxX3BoX3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucHJlY3JxLnBoLncKKyAgICBtaXBzX3ByZWNycV9xYl9waCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnByZWNycS5xYi5waAorICAgIG1pcHNfcHJlY3JxX3JzX3BoX3csICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucHJlY3JxLnJzLnBoLncKKyAgICBtaXBzX3ByZWNycXVfc19xYl9waCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnByZWNycXUucy5xYi5waAorICAgIG1pcHNfcHJlcGVuZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucHJlcGVuZAorICAgIG1pcHNfcmFkZHVfd19xYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucmFkZHUudy5xYgorICAgIG1pcHNfcmRkc3AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMucmRkc3AKKyAgICBtaXBzX3JlcGxfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnJlcGwucGgKKyAgICBtaXBzX3JlcGxfcWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnJlcGwucWIKKyAgICBtaXBzX3NhdF9zX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNhdC5zLmIKKyAgICBtaXBzX3NhdF9zX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNhdC5zLmQKKyAgICBtaXBzX3NhdF9zX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNhdC5zLmgKKyAgICBtaXBzX3NhdF9zX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNhdC5zLncKKyAgICBtaXBzX3NhdF91X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNhdC51LmIKKyAgICBtaXBzX3NhdF91X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNhdC51LmQKKyAgICBtaXBzX3NhdF91X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNhdC51LmgKKyAgICBtaXBzX3NhdF91X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNhdC51LncKKyAgICBtaXBzX3NoZl9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNoZi5iCisgICAgbWlwc19zaGZfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zaGYuaAorICAgIG1pcHNfc2hmX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc2hmLncKKyAgICBtaXBzX3NoaWxvLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNoaWxvCisgICAgbWlwc19zaGxsX3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zaGxsLnBoCisgICAgbWlwc19zaGxsX3FiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zaGxsLnFiCisgICAgbWlwc19zaGxsX3NfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zaGxsLnMucGgKKyAgICBtaXBzX3NobGxfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNobGwucy53CisgICAgbWlwc19zaHJhX3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zaHJhLnBoCisgICAgbWlwc19zaHJhX3FiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zaHJhLnFiCisgICAgbWlwc19zaHJhX3JfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zaHJhLnIucGgKKyAgICBtaXBzX3NocmFfcl9xYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNocmEuci5xYgorICAgIG1pcHNfc2hyYV9yX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc2hyYS5yLncKKyAgICBtaXBzX3NocmxfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNocmwucGgKKyAgICBtaXBzX3NocmxfcWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNocmwucWIKKyAgICBtaXBzX3NsZF9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNsZC5iCisgICAgbWlwc19zbGRfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zbGQuZAorICAgIG1pcHNfc2xkX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc2xkLmgKKyAgICBtaXBzX3NsZF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNsZC53CisgICAgbWlwc19zbGRpX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zbGRpLmIKKyAgICBtaXBzX3NsZGlfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNsZGkuZAorICAgIG1pcHNfc2xkaV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc2xkaS5oCisgICAgbWlwc19zbGRpX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zbGRpLncKKyAgICBtaXBzX3NsbF9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNsbC5iCisgICAgbWlwc19zbGxfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zbGwuZAorICAgIG1pcHNfc2xsX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc2xsLmgKKyAgICBtaXBzX3NsbF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNsbC53CisgICAgbWlwc19zbGxpX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zbGxpLmIKKyAgICBtaXBzX3NsbGlfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNsbGkuZAorICAgIG1pcHNfc2xsaV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc2xsaS5oCisgICAgbWlwc19zbGxpX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zbGxpLncKKyAgICBtaXBzX3NwbGF0X2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNwbGF0LmIKKyAgICBtaXBzX3NwbGF0X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNwbGF0LmQKKyAgICBtaXBzX3NwbGF0X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNwbGF0LmgKKyAgICBtaXBzX3NwbGF0X3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNwbGF0LncKKyAgICBtaXBzX3NwbGF0aV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNwbGF0aS5iCisgICAgbWlwc19zcGxhdGlfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcGxhdGkuZAorICAgIG1pcHNfc3BsYXRpX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3BsYXRpLmgKKyAgICBtaXBzX3NwbGF0aV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNwbGF0aS53CisgICAgbWlwc19zcmFfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmEuYgorICAgIG1pcHNfc3JhX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3JhLmQKKyAgICBtaXBzX3NyYV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNyYS5oCisgICAgbWlwc19zcmFfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmEudworICAgIG1pcHNfc3JhaV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3JhaS5iCisgICAgbWlwc19zcmFpX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmFpLmQKKyAgICBtaXBzX3NyYWlfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNyYWkuaAorICAgIG1pcHNfc3JhaV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3JhaS53CisgICAgbWlwc19zcmFyX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmFyLmIKKyAgICBtaXBzX3NyYXJfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNyYXIuZAorICAgIG1pcHNfc3Jhcl9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3Jhci5oCisgICAgbWlwc19zcmFyX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmFyLncKKyAgICBtaXBzX3NyYXJpX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNyYXJpLmIKKyAgICBtaXBzX3NyYXJpX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNyYXJpLmQKKyAgICBtaXBzX3NyYXJpX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNyYXJpLmgKKyAgICBtaXBzX3NyYXJpX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNyYXJpLncKKyAgICBtaXBzX3NybF9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNybC5iCisgICAgbWlwc19zcmxfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmwuZAorICAgIG1pcHNfc3JsX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3JsLmgKKyAgICBtaXBzX3NybF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNybC53CisgICAgbWlwc19zcmxpX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmxpLmIKKyAgICBtaXBzX3NybGlfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNybGkuZAorICAgIG1pcHNfc3JsaV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3JsaS5oCisgICAgbWlwc19zcmxpX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmxpLncKKyAgICBtaXBzX3NybHJfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNybHIuYgorICAgIG1pcHNfc3Jscl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3Jsci5kCisgICAgbWlwc19zcmxyX2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zcmxyLmgKKyAgICBtaXBzX3NybHJfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnNybHIudworICAgIG1pcHNfc3JscmlfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3JscmkuYgorICAgIG1pcHNfc3JscmlfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3JscmkuZAorICAgIG1pcHNfc3JscmlfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3JscmkuaAorICAgIG1pcHNfc3JscmlfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3JscmkudworICAgIG1pcHNfc3RfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3QuYgorICAgIG1pcHNfc3RfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3QuZAorICAgIG1pcHNfc3RfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3QuaAorICAgIG1pcHNfc3RfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3QudworICAgIG1pcHNfc3VicV9waCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3VicS5waAorICAgIG1pcHNfc3VicV9zX3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3VicS5zLnBoCisgICAgbWlwc19zdWJxX3NfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJxLnMudworICAgIG1pcHNfc3VicWhfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3VicWgucGgKKyAgICBtaXBzX3N1YnFoX3JfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnFoLnIucGgKKyAgICBtaXBzX3N1YnFoX3JfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnFoLnIudworICAgIG1pcHNfc3VicWhfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3VicWgudworICAgIG1pcHNfc3Vic19zX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3Vicy5zLmIKKyAgICBtaXBzX3N1YnNfc19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnMucy5kCisgICAgbWlwc19zdWJzX3NfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJzLnMuaAorICAgIG1pcHNfc3Vic19zX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3Vicy5zLncKKyAgICBtaXBzX3N1YnNfdV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnMudS5iCisgICAgbWlwc19zdWJzX3VfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJzLnUuZAorICAgIG1pcHNfc3Vic191X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3Vicy51LmgKKyAgICBtaXBzX3N1YnNfdV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnMudS53CisgICAgbWlwc19zdWJzdXNfdV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJzdXMudS5iCisgICAgbWlwc19zdWJzdXNfdV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJzdXMudS5kCisgICAgbWlwc19zdWJzdXNfdV9oLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJzdXMudS5oCisgICAgbWlwc19zdWJzdXNfdV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJzdXMudS53CisgICAgbWlwc19zdWJzdXVfc19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJzdXUucy5iCisgICAgbWlwc19zdWJzdXVfc19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJzdXUucy5kCisgICAgbWlwc19zdWJzdXVfc19oLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJzdXUucy5oCisgICAgbWlwc19zdWJzdXVfc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJzdXUucy53CisgICAgbWlwc19zdWJ1X3BoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJ1LnBoCisgICAgbWlwc19zdWJ1X3FiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJ1LnFiCisgICAgbWlwc19zdWJ1X3NfcGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJ1LnMucGgKKyAgICBtaXBzX3N1YnVfc19xYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnUucy5xYgorICAgIG1pcHNfc3VidWhfcWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3VidWgucWIKKyAgICBtaXBzX3N1YnVoX3JfcWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnVoLnIucWIKKyAgICBtaXBzX3N1YnZfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnYuYgorICAgIG1pcHNfc3Vidl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3Vidi5kCisgICAgbWlwc19zdWJ2X2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy5zdWJ2LmgKKyAgICBtaXBzX3N1YnZfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnN1YnYudworICAgIG1pcHNfc3VidmlfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3VidmkuYgorICAgIG1pcHNfc3VidmlfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3VidmkuZAorICAgIG1pcHNfc3VidmlfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3VidmkuaAorICAgIG1pcHNfc3VidmlfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMuc3VidmkudworICAgIG1pcHNfdnNoZl9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMudnNoZi5iCisgICAgbWlwc192c2hmX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy52c2hmLmQKKyAgICBtaXBzX3ZzaGZfaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnZzaGYuaAorICAgIG1pcHNfdnNoZl93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMudnNoZi53CisgICAgbWlwc193cmRzcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubWlwcy53cmRzcAorICAgIG1pcHNfeG9yX3YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm1pcHMueG9yLnYKKyAgICBtaXBzX3hvcmlfYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5taXBzLnhvcmkuYgorICAgIG52dm1fYWRkX3JtX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYWRkLnJtLmQKKyAgICBudnZtX2FkZF9ybV9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmFkZC5ybS5mCisgICAgbnZ2bV9hZGRfcm1fZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hZGQucm0uZnR6LmYKKyAgICBudnZtX2FkZF9ybl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmFkZC5ybi5kCisgICAgbnZ2bV9hZGRfcm5fZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hZGQucm4uZgorICAgIG52dm1fYWRkX3JuX2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYWRkLnJuLmZ0ei5mCisgICAgbnZ2bV9hZGRfcnBfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hZGQucnAuZAorICAgIG52dm1fYWRkX3JwX2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYWRkLnJwLmYKKyAgICBudnZtX2FkZF9ycF9mdHpfZiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmFkZC5ycC5mdHouZgorICAgIG52dm1fYWRkX3J6X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYWRkLnJ6LmQKKyAgICBudnZtX2FkZF9yel9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmFkZC5yei5mCisgICAgbnZ2bV9hZGRfcnpfZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hZGQucnouZnR6LmYKKyAgICBudnZtX2F0b21pY19hZGRfZ2VuX2ZfY3RhLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmF0b21pYy5hZGQuZ2VuLmYuY3RhCisgICAgbnZ2bV9hdG9taWNfYWRkX2dlbl9mX3N5cywgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hdG9taWMuYWRkLmdlbi5mLnN5cworICAgIG52dm1fYXRvbWljX2FkZF9nZW5faV9jdGEsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYXRvbWljLmFkZC5nZW4uaS5jdGEKKyAgICBudnZtX2F0b21pY19hZGRfZ2VuX2lfc3lzLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmF0b21pYy5hZGQuZ2VuLmkuc3lzCisgICAgbnZ2bV9hdG9taWNfYW5kX2dlbl9pX2N0YSwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hdG9taWMuYW5kLmdlbi5pLmN0YQorICAgIG52dm1fYXRvbWljX2FuZF9nZW5faV9zeXMsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYXRvbWljLmFuZC5nZW4uaS5zeXMKKyAgICBudnZtX2F0b21pY19jYXNfZ2VuX2lfY3RhLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmF0b21pYy5jYXMuZ2VuLmkuY3RhCisgICAgbnZ2bV9hdG9taWNfY2FzX2dlbl9pX3N5cywgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hdG9taWMuY2FzLmdlbi5pLnN5cworICAgIG52dm1fYXRvbWljX2RlY19nZW5faV9jdGEsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYXRvbWljLmRlYy5nZW4uaS5jdGEKKyAgICBudnZtX2F0b21pY19kZWNfZ2VuX2lfc3lzLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmF0b21pYy5kZWMuZ2VuLmkuc3lzCisgICAgbnZ2bV9hdG9taWNfZXhjaF9nZW5faV9jdGEsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hdG9taWMuZXhjaC5nZW4uaS5jdGEKKyAgICBudnZtX2F0b21pY19leGNoX2dlbl9pX3N5cywgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmF0b21pYy5leGNoLmdlbi5pLnN5cworICAgIG52dm1fYXRvbWljX2luY19nZW5faV9jdGEsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYXRvbWljLmluYy5nZW4uaS5jdGEKKyAgICBudnZtX2F0b21pY19pbmNfZ2VuX2lfc3lzLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmF0b21pYy5pbmMuZ2VuLmkuc3lzCisgICAgbnZ2bV9hdG9taWNfbG9hZF9hZGRfZjMyLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hdG9taWMubG9hZC5hZGQuZjMyCisgICAgbnZ2bV9hdG9taWNfbG9hZF9hZGRfZjY0LCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hdG9taWMubG9hZC5hZGQuZjY0CisgICAgbnZ2bV9hdG9taWNfbG9hZF9kZWNfMzIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hdG9taWMubG9hZC5kZWMuMzIKKyAgICBudnZtX2F0b21pY19sb2FkX2luY18zMiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmF0b21pYy5sb2FkLmluYy4zMgorICAgIG52dm1fYXRvbWljX21heF9nZW5faV9jdGEsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYXRvbWljLm1heC5nZW4uaS5jdGEKKyAgICBudnZtX2F0b21pY19tYXhfZ2VuX2lfc3lzLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmF0b21pYy5tYXguZ2VuLmkuc3lzCisgICAgbnZ2bV9hdG9taWNfbWluX2dlbl9pX2N0YSwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hdG9taWMubWluLmdlbi5pLmN0YQorICAgIG52dm1fYXRvbWljX21pbl9nZW5faV9zeXMsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYXRvbWljLm1pbi5nZW4uaS5zeXMKKyAgICBudnZtX2F0b21pY19vcl9nZW5faV9jdGEsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmF0b21pYy5vci5nZW4uaS5jdGEKKyAgICBudnZtX2F0b21pY19vcl9nZW5faV9zeXMsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmF0b21pYy5vci5nZW4uaS5zeXMKKyAgICBudnZtX2F0b21pY194b3JfZ2VuX2lfY3RhLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmF0b21pYy54b3IuZ2VuLmkuY3RhCisgICAgbnZ2bV9hdG9taWNfeG9yX2dlbl9pX3N5cywgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5hdG9taWMueG9yLmdlbi5pLnN5cworICAgIG52dm1fYmFyX3N5bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYmFyLnN5bmMKKyAgICBudnZtX2Jhcl93YXJwX3N5bmMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmJhci53YXJwLnN5bmMKKyAgICBudnZtX2JhcnJpZXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmJhcnJpZXIKKyAgICBudnZtX2JhcnJpZXJfbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmJhcnJpZXIubgorICAgIG52dm1fYmFycmllcl9zeW5jLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYmFycmllci5zeW5jCisgICAgbnZ2bV9iYXJyaWVyX3N5bmNfY250LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5iYXJyaWVyLnN5bmMuY250CisgICAgbnZ2bV9iYXJyaWVyMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5iYXJyaWVyMAorICAgIG52dm1fYmFycmllcjBfYW5kLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYmFycmllcjAuYW5kCisgICAgbnZ2bV9iYXJyaWVyMF9vciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5iYXJyaWVyMC5vcgorICAgIG52dm1fYmFycmllcjBfcG9wYywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYmFycmllcjAucG9wYworICAgIG52dm1fYml0Y2FzdF9kMmxsLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYml0Y2FzdC5kMmxsCisgICAgbnZ2bV9iaXRjYXN0X2YyaSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5iaXRjYXN0LmYyaQorICAgIG52dm1fYml0Y2FzdF9pMmYsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uYml0Y2FzdC5pMmYKKyAgICBudnZtX2JpdGNhc3RfbGwyZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmJpdGNhc3QubGwyZAorICAgIG52dm1fY2VpbF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uY2VpbC5kCisgICAgbnZ2bV9jZWlsX2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5jZWlsLmYKKyAgICBudnZtX2NlaWxfZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmNlaWwuZnR6LmYKKyAgICBudnZtX2NvbXBpbGVyX2Vycm9yLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmNvbXBpbGVyLmVycm9yCisgICAgbnZ2bV9jb21waWxlcl93YXJuLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5jb21waWxlci53YXJuCisgICAgbnZ2bV9jb3NfYXBwcm94X2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5jb3MuYXBwcm94LmYKKyAgICBudnZtX2Nvc19hcHByb3hfZnR6X2YsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmNvcy5hcHByb3guZnR6LmYKKyAgICBudnZtX2QyZl9ybSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQyZi5ybQorICAgIG52dm1fZDJmX3JtX2Z0eiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZDJmLnJtLmZ0egorICAgIG52dm1fZDJmX3JuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZDJmLnJuCisgICAgbnZ2bV9kMmZfcm5fZnR6LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5kMmYucm4uZnR6CisgICAgbnZ2bV9kMmZfcnAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5kMmYucnAKKyAgICBudnZtX2QyZl9ycF9mdHosICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQyZi5ycC5mdHoKKyAgICBudnZtX2QyZl9yeiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQyZi5yegorICAgIG52dm1fZDJmX3J6X2Z0eiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZDJmLnJ6LmZ0egorICAgIG52dm1fZDJpX2hpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZDJpLmhpCisgICAgbnZ2bV9kMmlfbG8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5kMmkubG8KKyAgICBudnZtX2QyaV9ybSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQyaS5ybQorICAgIG52dm1fZDJpX3JuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZDJpLnJuCisgICAgbnZ2bV9kMmlfcnAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5kMmkucnAKKyAgICBudnZtX2QyaV9yeiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQyaS5yegorICAgIG52dm1fZDJsbF9ybSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZDJsbC5ybQorICAgIG52dm1fZDJsbF9ybiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZDJsbC5ybgorICAgIG52dm1fZDJsbF9ycCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZDJsbC5ycAorICAgIG52dm1fZDJsbF9yeiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZDJsbC5yegorICAgIG52dm1fZDJ1aV9ybSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZDJ1aS5ybQorICAgIG52dm1fZDJ1aV9ybiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZDJ1aS5ybgorICAgIG52dm1fZDJ1aV9ycCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZDJ1aS5ycAorICAgIG52dm1fZDJ1aV9yeiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZDJ1aS5yegorICAgIG52dm1fZDJ1bGxfcm0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZDJ1bGwucm0KKyAgICBudnZtX2QydWxsX3JuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmQydWxsLnJuCisgICAgbnZ2bV9kMnVsbF9ycCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5kMnVsbC5ycAorICAgIG52dm1fZDJ1bGxfcnosICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZDJ1bGwucnoKKyAgICBudnZtX2Rpdl9hcHByb3hfZiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmRpdi5hcHByb3guZgorICAgIG52dm1fZGl2X2FwcHJveF9mdHpfZiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZGl2LmFwcHJveC5mdHouZgorICAgIG52dm1fZGl2X3JtX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZGl2LnJtLmQKKyAgICBudnZtX2Rpdl9ybV9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmRpdi5ybS5mCisgICAgbnZ2bV9kaXZfcm1fZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5kaXYucm0uZnR6LmYKKyAgICBudnZtX2Rpdl9ybl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmRpdi5ybi5kCisgICAgbnZ2bV9kaXZfcm5fZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5kaXYucm4uZgorICAgIG52dm1fZGl2X3JuX2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZGl2LnJuLmZ0ei5mCisgICAgbnZ2bV9kaXZfcnBfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5kaXYucnAuZAorICAgIG52dm1fZGl2X3JwX2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZGl2LnJwLmYKKyAgICBudnZtX2Rpdl9ycF9mdHpfZiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmRpdi5ycC5mdHouZgorICAgIG52dm1fZGl2X3J6X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZGl2LnJ6LmQKKyAgICBudnZtX2Rpdl9yel9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmRpdi5yei5mCisgICAgbnZ2bV9kaXZfcnpfZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5kaXYucnouZnR6LmYKKyAgICBudnZtX2V4Ml9hcHByb3hfZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmV4Mi5hcHByb3guZAorICAgIG52dm1fZXgyX2FwcHJveF9mLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZXgyLmFwcHJveC5mCisgICAgbnZ2bV9leDJfYXBwcm94X2Z0el9mLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5leDIuYXBwcm94LmZ0ei5mCisgICAgbnZ2bV9mMmhfcm4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMmgucm4KKyAgICBudnZtX2YyaF9ybl9mdHosICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYyaC5ybi5mdHoKKyAgICBudnZtX2YyaV9ybSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYyaS5ybQorICAgIG52dm1fZjJpX3JtX2Z0eiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJpLnJtLmZ0egorICAgIG52dm1fZjJpX3JuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJpLnJuCisgICAgbnZ2bV9mMmlfcm5fZnR6LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMmkucm4uZnR6CisgICAgbnZ2bV9mMmlfcnAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMmkucnAKKyAgICBudnZtX2YyaV9ycF9mdHosICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYyaS5ycC5mdHoKKyAgICBudnZtX2YyaV9yeiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYyaS5yegorICAgIG52dm1fZjJpX3J6X2Z0eiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJpLnJ6LmZ0egorICAgIG52dm1fZjJsbF9ybSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJsbC5ybQorICAgIG52dm1fZjJsbF9ybV9mdHosICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJsbC5ybS5mdHoKKyAgICBudnZtX2YybGxfcm4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYybGwucm4KKyAgICBudnZtX2YybGxfcm5fZnR6LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYybGwucm4uZnR6CisgICAgbnZ2bV9mMmxsX3JwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMmxsLnJwCisgICAgbnZ2bV9mMmxsX3JwX2Z0eiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMmxsLnJwLmZ0egorICAgIG52dm1fZjJsbF9yeiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJsbC5yegorICAgIG52dm1fZjJsbF9yel9mdHosICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJsbC5yei5mdHoKKyAgICBudnZtX2YydWlfcm0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYydWkucm0KKyAgICBudnZtX2YydWlfcm1fZnR6LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYydWkucm0uZnR6CisgICAgbnZ2bV9mMnVpX3JuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMnVpLnJuCisgICAgbnZ2bV9mMnVpX3JuX2Z0eiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMnVpLnJuLmZ0egorICAgIG52dm1fZjJ1aV9ycCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJ1aS5ycAorICAgIG52dm1fZjJ1aV9ycF9mdHosICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJ1aS5ycC5mdHoKKyAgICBudnZtX2YydWlfcnosICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYydWkucnoKKyAgICBudnZtX2YydWlfcnpfZnR6LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmYydWkucnouZnR6CisgICAgbnZ2bV9mMnVsbF9ybSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMnVsbC5ybQorICAgIG52dm1fZjJ1bGxfcm1fZnR6LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJ1bGwucm0uZnR6CisgICAgbnZ2bV9mMnVsbF9ybiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMnVsbC5ybgorICAgIG52dm1fZjJ1bGxfcm5fZnR6LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJ1bGwucm4uZnR6CisgICAgbnZ2bV9mMnVsbF9ycCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMnVsbC5ycAorICAgIG52dm1fZjJ1bGxfcnBfZnR6LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJ1bGwucnAuZnR6CisgICAgbnZ2bV9mMnVsbF9yeiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mMnVsbC5yegorICAgIG52dm1fZjJ1bGxfcnpfZnR6LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZjJ1bGwucnouZnR6CisgICAgbnZ2bV9mYWJzX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mYWJzLmQKKyAgICBudnZtX2ZhYnNfZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmZhYnMuZgorICAgIG52dm1fZmFic19mdHpfZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZmFicy5mdHouZgorICAgIG52dm1fZmxvb3JfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZmxvb3IuZAorICAgIG52dm1fZmxvb3JfZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZmxvb3IuZgorICAgIG52dm1fZmxvb3JfZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZmxvb3IuZnR6LmYKKyAgICBudnZtX2ZtYV9ybV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmZtYS5ybS5kCisgICAgbnZ2bV9mbWFfcm1fZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mbWEucm0uZgorICAgIG52dm1fZm1hX3JtX2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZm1hLnJtLmZ0ei5mCisgICAgbnZ2bV9mbWFfcm5fZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mbWEucm4uZAorICAgIG52dm1fZm1hX3JuX2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZm1hLnJuLmYKKyAgICBudnZtX2ZtYV9ybl9mdHpfZiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmZtYS5ybi5mdHouZgorICAgIG52dm1fZm1hX3JwX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZm1hLnJwLmQKKyAgICBudnZtX2ZtYV9ycF9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmZtYS5ycC5mCisgICAgbnZ2bV9mbWFfcnBfZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mbWEucnAuZnR6LmYKKyAgICBudnZtX2ZtYV9yel9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmZtYS5yei5kCisgICAgbnZ2bV9mbWFfcnpfZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mbWEucnouZgorICAgIG52dm1fZm1hX3J6X2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZm1hLnJ6LmZ0ei5mCisgICAgbnZ2bV9mbWF4X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mbWF4LmQKKyAgICBudnZtX2ZtYXhfZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmZtYXguZgorICAgIG52dm1fZm1heF9mdHpfZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZm1heC5mdHouZgorICAgIG52dm1fZm1pbl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uZm1pbi5kCisgICAgbnZ2bV9mbWluX2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5mbWluLmYKKyAgICBudnZtX2ZtaW5fZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmZtaW4uZnR6LmYKKyAgICBudnZtX2ZucywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmZucworICAgIG52dm1faTJkX3JtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uaTJkLnJtCisgICAgbnZ2bV9pMmRfcm4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5pMmQucm4KKyAgICBudnZtX2kyZF9ycCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmkyZC5ycAorICAgIG52dm1faTJkX3J6LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uaTJkLnJ6CisgICAgbnZ2bV9pMmZfcm0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5pMmYucm0KKyAgICBudnZtX2kyZl9ybiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmkyZi5ybgorICAgIG52dm1faTJmX3JwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uaTJmLnJwCisgICAgbnZ2bV9pMmZfcnosICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5pMmYucnoKKyAgICBudnZtX2lzc3BhY2VwX2NvbnN0LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmlzc3BhY2VwLmNvbnN0CisgICAgbnZ2bV9pc3NwYWNlcF9nbG9iYWwsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5pc3NwYWNlcC5nbG9iYWwKKyAgICBudnZtX2lzc3BhY2VwX2xvY2FsLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmlzc3BhY2VwLmxvY2FsCisgICAgbnZ2bV9pc3NwYWNlcF9zaGFyZWQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5pc3NwYWNlcC5zaGFyZWQKKyAgICBudnZtX2lzdHlwZXBfc2FtcGxlciwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmlzdHlwZXAuc2FtcGxlcgorICAgIG52dm1faXN0eXBlcF9zdXJmYWNlLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uaXN0eXBlcC5zdXJmYWNlCisgICAgbnZ2bV9pc3R5cGVwX3RleHR1cmUsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5pc3R5cGVwLnRleHR1cmUKKyAgICBudnZtX2xkZ19nbG9iYWxfZiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmxkZy5nbG9iYWwuZgorICAgIG52dm1fbGRnX2dsb2JhbF9pLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubGRnLmdsb2JhbC5pCisgICAgbnZ2bV9sZGdfZ2xvYmFsX3AsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5sZGcuZ2xvYmFsLnAKKyAgICBudnZtX2xkdV9nbG9iYWxfZiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmxkdS5nbG9iYWwuZgorICAgIG52dm1fbGR1X2dsb2JhbF9pLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubGR1Lmdsb2JhbC5pCisgICAgbnZ2bV9sZHVfZ2xvYmFsX3AsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5sZHUuZ2xvYmFsLnAKKyAgICBudnZtX2xnMl9hcHByb3hfZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLmxnMi5hcHByb3guZAorICAgIG52dm1fbGcyX2FwcHJveF9mLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubGcyLmFwcHJveC5mCisgICAgbnZ2bV9sZzJfYXBwcm94X2Z0el9mLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5sZzIuYXBwcm94LmZ0ei5mCisgICAgbnZ2bV9sbDJkX3JtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5sbDJkLnJtCisgICAgbnZ2bV9sbDJkX3JuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5sbDJkLnJuCisgICAgbnZ2bV9sbDJkX3JwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5sbDJkLnJwCisgICAgbnZ2bV9sbDJkX3J6LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5sbDJkLnJ6CisgICAgbnZ2bV9sbDJmX3JtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5sbDJmLnJtCisgICAgbnZ2bV9sbDJmX3JuLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5sbDJmLnJuCisgICAgbnZ2bV9sbDJmX3JwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5sbDJmLnJwCisgICAgbnZ2bV9sbDJmX3J6LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5sbDJmLnJ6CisgICAgbnZ2bV9sb2hpX2kyZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5sb2hpLmkyZAorICAgIG52dm1fbWF0Y2hfYWxsX3N5bmNfaTMycCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubWF0Y2guYWxsLnN5bmMuaTMycAorICAgIG52dm1fbWF0Y2hfYWxsX3N5bmNfaTY0cCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubWF0Y2guYWxsLnN5bmMuaTY0cAorICAgIG52dm1fbWF0Y2hfYW55X3N5bmNfaTMyLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubWF0Y2guYW55LnN5bmMuaTMyCisgICAgbnZ2bV9tYXRjaF9hbnlfc3luY19pNjQsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5tYXRjaC5hbnkuc3luYy5pNjQKKyAgICBudnZtX21lbWJhcl9jdGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm1lbWJhci5jdGEKKyAgICBudnZtX21lbWJhcl9nbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm1lbWJhci5nbAorICAgIG52dm1fbWVtYmFyX3N5cywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubWVtYmFyLnN5cworICAgIG52dm1fbW92ZV9kb3VibGUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubW92ZS5kb3VibGUKKyAgICBudnZtX21vdmVfZmxvYXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm1vdmUuZmxvYXQKKyAgICBudnZtX21vdmVfaTE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm1vdmUuaTE2CisgICAgbnZ2bV9tb3ZlX2kzMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5tb3ZlLmkzMgorICAgIG52dm1fbW92ZV9pNjQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubW92ZS5pNjQKKyAgICBudnZtX21vdmVfcHRyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm1vdmUucHRyCisgICAgbnZ2bV9tdWxfcm1fZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5tdWwucm0uZAorICAgIG52dm1fbXVsX3JtX2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubXVsLnJtLmYKKyAgICBudnZtX211bF9ybV9mdHpfZiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm11bC5ybS5mdHouZgorICAgIG52dm1fbXVsX3JuX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubXVsLnJuLmQKKyAgICBudnZtX211bF9ybl9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm11bC5ybi5mCisgICAgbnZ2bV9tdWxfcm5fZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5tdWwucm4uZnR6LmYKKyAgICBudnZtX211bF9ycF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm11bC5ycC5kCisgICAgbnZ2bV9tdWxfcnBfZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5tdWwucnAuZgorICAgIG52dm1fbXVsX3JwX2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubXVsLnJwLmZ0ei5mCisgICAgbnZ2bV9tdWxfcnpfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5tdWwucnouZAorICAgIG52dm1fbXVsX3J6X2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubXVsLnJ6LmYKKyAgICBudnZtX211bF9yel9mdHpfZiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm11bC5yei5mdHouZgorICAgIG52dm1fbXVsMjRfaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubXVsMjQuaQorICAgIG52dm1fbXVsMjRfdWksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubXVsMjQudWkKKyAgICBudnZtX211bGhpX2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm11bGhpLmkKKyAgICBudnZtX211bGhpX2xsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLm11bGhpLmxsCisgICAgbnZ2bV9tdWxoaV91aSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5tdWxoaS51aQorICAgIG52dm1fbXVsaGlfdWxsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ubXVsaGkudWxsCisgICAgbnZ2bV9wcm10LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5wcm10CisgICAgbnZ2bV9wdHJfY29uc3RhbnRfdG9fZ2VuLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5wdHIuY29uc3RhbnQudG8uZ2VuCisgICAgbnZ2bV9wdHJfZ2VuX3RvX2NvbnN0YW50LCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5wdHIuZ2VuLnRvLmNvbnN0YW50CisgICAgbnZ2bV9wdHJfZ2VuX3RvX2dsb2JhbCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5wdHIuZ2VuLnRvLmdsb2JhbAorICAgIG52dm1fcHRyX2dlbl90b19sb2NhbCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucHRyLmdlbi50by5sb2NhbAorICAgIG52dm1fcHRyX2dlbl90b19wYXJhbSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucHRyLmdlbi50by5wYXJhbQorICAgIG52dm1fcHRyX2dlbl90b19zaGFyZWQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucHRyLmdlbi50by5zaGFyZWQKKyAgICBudnZtX3B0cl9nbG9iYWxfdG9fZ2VuLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnB0ci5nbG9iYWwudG8uZ2VuCisgICAgbnZ2bV9wdHJfbG9jYWxfdG9fZ2VuLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5wdHIubG9jYWwudG8uZ2VuCisgICAgbnZ2bV9wdHJfc2hhcmVkX3RvX2dlbiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5wdHIuc2hhcmVkLnRvLmdlbgorICAgIG52dm1fcmNwX2FwcHJveF9mdHpfZCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmNwLmFwcHJveC5mdHouZAorICAgIG52dm1fcmNwX3JtX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmNwLnJtLmQKKyAgICBudnZtX3JjcF9ybV9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJjcC5ybS5mCisgICAgbnZ2bV9yY3Bfcm1fZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yY3Aucm0uZnR6LmYKKyAgICBudnZtX3JjcF9ybl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJjcC5ybi5kCisgICAgbnZ2bV9yY3Bfcm5fZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yY3Aucm4uZgorICAgIG52dm1fcmNwX3JuX2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmNwLnJuLmZ0ei5mCisgICAgbnZ2bV9yY3BfcnBfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yY3AucnAuZAorICAgIG52dm1fcmNwX3JwX2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmNwLnJwLmYKKyAgICBudnZtX3JjcF9ycF9mdHpfZiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJjcC5ycC5mdHouZgorICAgIG52dm1fcmNwX3J6X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmNwLnJ6LmQKKyAgICBudnZtX3JjcF9yel9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJjcC5yei5mCisgICAgbnZ2bV9yY3BfcnpfZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yY3AucnouZnR6LmYKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfY2xvY2ssICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuY2xvY2sKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfY2xvY2s2NCwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuY2xvY2s2NAorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19jdGFpZF93LCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5jdGFpZC53CisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2N0YWlkX3gsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmN0YWlkLngKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfY3RhaWRfeSwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuY3RhaWQueQorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19jdGFpZF96LCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5jdGFpZC56CisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzAsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzAKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMSwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMQorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxMCwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxMAorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxMSwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxMQorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxMiwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxMgorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxMywgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxMworICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxNCwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxNAorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxNSwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxNQorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxNiwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxNgorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxNywgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxNworICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxOCwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxOAorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxOSwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxOQorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyCisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzIwLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzIwCisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzIxLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzIxCisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzIyLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzIyCisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzIzLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzIzCisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzI0LCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzI0CisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzI1LCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzI1CisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzI2LCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzI2CisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzI3LCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzI3CisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzI4LCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzI4CisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzI5LCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzI5CisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzMsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzMKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMzAsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMzAKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMzEsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMzEKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnNCwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnNAorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc1LCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWc1CisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzYsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzYKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnNywgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnNworICAgIG52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc4LCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWc4CisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzksICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzkKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfZ3JpZGlkLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZ3JpZGlkCisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX2xhbmVpZCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmxhbmVpZAorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19sYW5lbWFza19lcSwgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5sYW5lbWFzay5lcQorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19sYW5lbWFza19nZSwgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5sYW5lbWFzay5nZQorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19sYW5lbWFza19ndCwgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5sYW5lbWFzay5ndAorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19sYW5lbWFza19sZSwgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5sYW5lbWFzay5sZQorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19sYW5lbWFza19sdCwgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5sYW5lbWFzay5sdAorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19uY3RhaWRfdywgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5uY3RhaWQudworICAgIG52dm1fcmVhZF9wdHhfc3JlZ19uY3RhaWRfeCwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5uY3RhaWQueAorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19uY3RhaWRfeSwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5uY3RhaWQueQorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19uY3RhaWRfeiwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5uY3RhaWQuegorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19uc21pZCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5uc21pZAorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19udGlkX3csICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5udGlkLncKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfbnRpZF94LCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubnRpZC54CisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX250aWRfeSwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLm50aWQueQorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19udGlkX3osICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5udGlkLnoKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfbndhcnBpZCwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubndhcnBpZAorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19wbTAsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5wbTAKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfcG0xLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcucG0xCisgICAgbnZ2bV9yZWFkX3B0eF9zcmVnX3BtMiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLnBtMgorICAgIG52dm1fcmVhZF9wdHhfc3JlZ19wbTMsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5wbTMKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfc21pZCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuc21pZAorICAgIG52dm1fcmVhZF9wdHhfc3JlZ190aWRfdywgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy50aWQudworICAgIG52dm1fcmVhZF9wdHhfc3JlZ190aWRfeCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy50aWQueAorICAgIG52dm1fcmVhZF9wdHhfc3JlZ190aWRfeSwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy50aWQueQorICAgIG52dm1fcmVhZF9wdHhfc3JlZ190aWRfeiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy50aWQuegorICAgIG52dm1fcmVhZF9wdHhfc3JlZ193YXJwaWQsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy53YXJwaWQKKyAgICBudnZtX3JlYWRfcHR4X3NyZWdfd2FycHNpemUsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcud2FycHNpemUKKyAgICBudnZtX3JlZmxlY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJlZmxlY3QKKyAgICBudnZtX3JvdGF0ZV9iMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJvdGF0ZS5iMzIKKyAgICBudnZtX3JvdGF0ZV9iNjQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJvdGF0ZS5iNjQKKyAgICBudnZtX3JvdGF0ZV9yaWdodF9iNjQsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJvdGF0ZS5yaWdodC5iNjQKKyAgICBudnZtX3JvdW5kX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJvdW5kLmQKKyAgICBudnZtX3JvdW5kX2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJvdW5kLmYKKyAgICBudnZtX3JvdW5kX2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJvdW5kLmZ0ei5mCisgICAgbnZ2bV9yc3FydF9hcHByb3hfZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5yc3FydC5hcHByb3guZAorICAgIG52dm1fcnNxcnRfYXBwcm94X2YsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0ucnNxcnQuYXBwcm94LmYKKyAgICBudnZtX3JzcXJ0X2FwcHJveF9mdHpfZiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnJzcXJ0LmFwcHJveC5mdHouZgorICAgIG52dm1fc2FkX2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc2FkLmkKKyAgICBudnZtX3NhZF91aSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNhZC51aQorICAgIG52dm1fc2F0dXJhdGVfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc2F0dXJhdGUuZAorICAgIG52dm1fc2F0dXJhdGVfZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc2F0dXJhdGUuZgorICAgIG52dm1fc2F0dXJhdGVfZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc2F0dXJhdGUuZnR6LmYKKyAgICBudnZtX3NoZmxfYmZseV9mMzIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNoZmwuYmZseS5mMzIKKyAgICBudnZtX3NoZmxfYmZseV9pMzIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNoZmwuYmZseS5pMzIKKyAgICBudnZtX3NoZmxfZG93bl9mMzIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNoZmwuZG93bi5mMzIKKyAgICBudnZtX3NoZmxfZG93bl9pMzIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNoZmwuZG93bi5pMzIKKyAgICBudnZtX3NoZmxfaWR4X2YzMiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNoZmwuaWR4LmYzMgorICAgIG52dm1fc2hmbF9pZHhfaTMyLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc2hmbC5pZHguaTMyCisgICAgbnZ2bV9zaGZsX3N5bmNfYmZseV9mMzIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zaGZsLnN5bmMuYmZseS5mMzIKKyAgICBudnZtX3NoZmxfc3luY19iZmx5X2kzMiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNoZmwuc3luYy5iZmx5LmkzMgorICAgIG52dm1fc2hmbF9zeW5jX2Rvd25fZjMyLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc2hmbC5zeW5jLmRvd24uZjMyCisgICAgbnZ2bV9zaGZsX3N5bmNfZG93bl9pMzIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zaGZsLnN5bmMuZG93bi5pMzIKKyAgICBudnZtX3NoZmxfc3luY19pZHhfZjMyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNoZmwuc3luYy5pZHguZjMyCisgICAgbnZ2bV9zaGZsX3N5bmNfaWR4X2kzMiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zaGZsLnN5bmMuaWR4LmkzMgorICAgIG52dm1fc2hmbF9zeW5jX3VwX2YzMiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc2hmbC5zeW5jLnVwLmYzMgorICAgIG52dm1fc2hmbF9zeW5jX3VwX2kzMiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc2hmbC5zeW5jLnVwLmkzMgorICAgIG52dm1fc2hmbF91cF9mMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc2hmbC51cC5mMzIKKyAgICBudnZtX3NoZmxfdXBfaTMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNoZmwudXAuaTMyCisgICAgbnZ2bV9zaW5fYXBwcm94X2YsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zaW4uYXBwcm94LmYKKyAgICBudnZtX3Npbl9hcHByb3hfZnR6X2YsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNpbi5hcHByb3guZnR6LmYKKyAgICBudnZtX3NxcnRfYXBwcm94X2YsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNxcnQuYXBwcm94LmYKKyAgICBudnZtX3NxcnRfYXBwcm94X2Z0el9mLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNxcnQuYXBwcm94LmZ0ei5mCisgICAgbnZ2bV9zcXJ0X2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zcXJ0LmYKKyAgICBudnZtX3NxcnRfcm1fZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNxcnQucm0uZAorICAgIG52dm1fc3FydF9ybV9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3FydC5ybS5mCisgICAgbnZ2bV9zcXJ0X3JtX2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zcXJ0LnJtLmZ0ei5mCisgICAgbnZ2bV9zcXJ0X3JuX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zcXJ0LnJuLmQKKyAgICBudnZtX3NxcnRfcm5fZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNxcnQucm4uZgorICAgIG52dm1fc3FydF9ybl9mdHpfZiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3FydC5ybi5mdHouZgorICAgIG52dm1fc3FydF9ycF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3FydC5ycC5kCisgICAgbnZ2bV9zcXJ0X3JwX2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zcXJ0LnJwLmYKKyAgICBudnZtX3NxcnRfcnBfZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNxcnQucnAuZnR6LmYKKyAgICBudnZtX3NxcnRfcnpfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnNxcnQucnouZAorICAgIG52dm1fc3FydF9yel9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3FydC5yei5mCisgICAgbnZ2bV9zcXJ0X3J6X2Z0el9mLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zcXJ0LnJ6LmZ0ei5mCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X2kxNl9jbGFtcCwgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LmkxNi5jbGFtcAorICAgIG52dm1fc3VsZF8xZF9hcnJheV9pMTZfdHJhcCwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pMTYudHJhcAorICAgIG52dm1fc3VsZF8xZF9hcnJheV9pMTZfemVybywgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pMTYuemVybworICAgIG52dm1fc3VsZF8xZF9hcnJheV9pMzJfY2xhbXAsICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pMzIuY2xhbXAKKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfaTMyX3RyYXAsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTMyLnRyYXAKKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfaTMyX3plcm8sICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTMyLnplcm8KKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfaTY0X2NsYW1wLCAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTY0LmNsYW1wCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X2k2NF90cmFwLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5Lmk2NC50cmFwCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X2k2NF96ZXJvLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5Lmk2NC56ZXJvCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X2k4X2NsYW1wLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5Lmk4LmNsYW1wCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X2k4X3RyYXAsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5Lmk4LnRyYXAKKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfaThfemVybywgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTguemVybworICAgIG52dm1fc3VsZF8xZF9hcnJheV92MmkxNl9jbGFtcCwgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52MmkxNi5jbGFtcAorICAgIG52dm1fc3VsZF8xZF9hcnJheV92MmkxNl90cmFwLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52MmkxNi50cmFwCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X3YyaTE2X3plcm8sICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTE2Lnplcm8KKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfdjJpMzJfY2xhbXAsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpMzIuY2xhbXAKKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfdjJpMzJfdHJhcCwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpMzIudHJhcAorICAgIG52dm1fc3VsZF8xZF9hcnJheV92MmkzMl96ZXJvLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52MmkzMi56ZXJvCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X3YyaTY0X2NsYW1wLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTY0LmNsYW1wCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X3YyaTY0X3RyYXAsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTY0LnRyYXAKKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfdjJpNjRfemVybywgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpNjQuemVybworICAgIG52dm1fc3VsZF8xZF9hcnJheV92Mmk4X2NsYW1wLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52Mmk4LmNsYW1wCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X3YyaThfdHJhcCwgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTgudHJhcAorICAgIG52dm1fc3VsZF8xZF9hcnJheV92Mmk4X3plcm8sICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52Mmk4Lnplcm8KKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfdjRpMTZfY2xhbXAsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpMTYuY2xhbXAKKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfdjRpMTZfdHJhcCwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpMTYudHJhcAorICAgIG52dm1fc3VsZF8xZF9hcnJheV92NGkxNl96ZXJvLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGkxNi56ZXJvCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X3Y0aTMyX2NsYW1wLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTMyLmNsYW1wCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X3Y0aTMyX3RyYXAsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTMyLnRyYXAKKyAgICBudnZtX3N1bGRfMWRfYXJyYXlfdjRpMzJfemVybywgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpMzIuemVybworICAgIG52dm1fc3VsZF8xZF9hcnJheV92NGk4X2NsYW1wLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGk4LmNsYW1wCisgICAgbnZ2bV9zdWxkXzFkX2FycmF5X3Y0aThfdHJhcCwgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTgudHJhcAorICAgIG52dm1fc3VsZF8xZF9hcnJheV92NGk4X3plcm8sICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGk4Lnplcm8KKyAgICBudnZtX3N1bGRfMWRfaTE2X2NsYW1wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuaTE2LmNsYW1wCisgICAgbnZ2bV9zdWxkXzFkX2kxNl90cmFwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmkxNi50cmFwCisgICAgbnZ2bV9zdWxkXzFkX2kxNl96ZXJvLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmkxNi56ZXJvCisgICAgbnZ2bV9zdWxkXzFkX2kzMl9jbGFtcCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmkzMi5jbGFtcAorICAgIG52dm1fc3VsZF8xZF9pMzJfdHJhcCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5pMzIudHJhcAorICAgIG52dm1fc3VsZF8xZF9pMzJfemVybywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5pMzIuemVybworICAgIG52dm1fc3VsZF8xZF9pNjRfY2xhbXAsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5pNjQuY2xhbXAKKyAgICBudnZtX3N1bGRfMWRfaTY0X3RyYXAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuaTY0LnRyYXAKKyAgICBudnZtX3N1bGRfMWRfaTY0X3plcm8sICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuaTY0Lnplcm8KKyAgICBudnZtX3N1bGRfMWRfaThfY2xhbXAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuaTguY2xhbXAKKyAgICBudnZtX3N1bGRfMWRfaThfdHJhcCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQuaTgudHJhcAorICAgIG52dm1fc3VsZF8xZF9pOF96ZXJvLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC5pOC56ZXJvCisgICAgbnZ2bV9zdWxkXzFkX3YyaTE2X2NsYW1wLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnYyaTE2LmNsYW1wCisgICAgbnZ2bV9zdWxkXzFkX3YyaTE2X3RyYXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnYyaTE2LnRyYXAKKyAgICBudnZtX3N1bGRfMWRfdjJpMTZfemVybywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQudjJpMTYuemVybworICAgIG52dm1fc3VsZF8xZF92MmkzMl9jbGFtcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC52MmkzMi5jbGFtcAorICAgIG52dm1fc3VsZF8xZF92MmkzMl90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC52MmkzMi50cmFwCisgICAgbnZ2bV9zdWxkXzFkX3YyaTMyX3plcm8sICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnYyaTMyLnplcm8KKyAgICBudnZtX3N1bGRfMWRfdjJpNjRfY2xhbXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQudjJpNjQuY2xhbXAKKyAgICBudnZtX3N1bGRfMWRfdjJpNjRfdHJhcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQudjJpNjQudHJhcAorICAgIG52dm1fc3VsZF8xZF92Mmk2NF96ZXJvLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC52Mmk2NC56ZXJvCisgICAgbnZ2bV9zdWxkXzFkX3YyaThfY2xhbXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnYyaTguY2xhbXAKKyAgICBudnZtX3N1bGRfMWRfdjJpOF90cmFwLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQudjJpOC50cmFwCisgICAgbnZ2bV9zdWxkXzFkX3YyaThfemVybywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnYyaTguemVybworICAgIG52dm1fc3VsZF8xZF92NGkxNl9jbGFtcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC52NGkxNi5jbGFtcAorICAgIG52dm1fc3VsZF8xZF92NGkxNl90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC52NGkxNi50cmFwCisgICAgbnZ2bV9zdWxkXzFkX3Y0aTE2X3plcm8sICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnY0aTE2Lnplcm8KKyAgICBudnZtX3N1bGRfMWRfdjRpMzJfY2xhbXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQudjRpMzIuY2xhbXAKKyAgICBudnZtX3N1bGRfMWRfdjRpMzJfdHJhcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQudjRpMzIudHJhcAorICAgIG52dm1fc3VsZF8xZF92NGkzMl96ZXJvLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4xZC52NGkzMi56ZXJvCisgICAgbnZ2bV9zdWxkXzFkX3Y0aThfY2xhbXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnY0aTguY2xhbXAKKyAgICBudnZtX3N1bGRfMWRfdjRpOF90cmFwLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMWQudjRpOC50cmFwCisgICAgbnZ2bV9zdWxkXzFkX3Y0aThfemVybywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnY0aTguemVybworICAgIG52dm1fc3VsZF8yZF9hcnJheV9pMTZfY2xhbXAsICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pMTYuY2xhbXAKKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfaTE2X3RyYXAsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTE2LnRyYXAKKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfaTE2X3plcm8sICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTE2Lnplcm8KKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfaTMyX2NsYW1wLCAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTMyLmNsYW1wCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X2kzMl90cmFwLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LmkzMi50cmFwCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X2kzMl96ZXJvLCAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LmkzMi56ZXJvCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X2k2NF9jbGFtcCwgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5Lmk2NC5jbGFtcAorICAgIG52dm1fc3VsZF8yZF9hcnJheV9pNjRfdHJhcCwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pNjQudHJhcAorICAgIG52dm1fc3VsZF8yZF9hcnJheV9pNjRfemVybywgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pNjQuemVybworICAgIG52dm1fc3VsZF8yZF9hcnJheV9pOF9jbGFtcCwgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pOC5jbGFtcAorICAgIG52dm1fc3VsZF8yZF9hcnJheV9pOF90cmFwLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pOC50cmFwCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X2k4X3plcm8sICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5Lmk4Lnplcm8KKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfdjJpMTZfY2xhbXAsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpMTYuY2xhbXAKKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfdjJpMTZfdHJhcCwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpMTYudHJhcAorICAgIG52dm1fc3VsZF8yZF9hcnJheV92MmkxNl96ZXJvLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52MmkxNi56ZXJvCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X3YyaTMyX2NsYW1wLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTMyLmNsYW1wCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X3YyaTMyX3RyYXAsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTMyLnRyYXAKKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfdjJpMzJfemVybywgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpMzIuemVybworICAgIG52dm1fc3VsZF8yZF9hcnJheV92Mmk2NF9jbGFtcCwgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52Mmk2NC5jbGFtcAorICAgIG52dm1fc3VsZF8yZF9hcnJheV92Mmk2NF90cmFwLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52Mmk2NC50cmFwCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X3YyaTY0X3plcm8sICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTY0Lnplcm8KKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfdjJpOF9jbGFtcCwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpOC5jbGFtcAorICAgIG52dm1fc3VsZF8yZF9hcnJheV92Mmk4X3RyYXAsICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52Mmk4LnRyYXAKKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfdjJpOF96ZXJvLCAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpOC56ZXJvCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X3Y0aTE2X2NsYW1wLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTE2LmNsYW1wCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X3Y0aTE2X3RyYXAsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTE2LnRyYXAKKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfdjRpMTZfemVybywgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjRpMTYuemVybworICAgIG52dm1fc3VsZF8yZF9hcnJheV92NGkzMl9jbGFtcCwgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGkzMi5jbGFtcAorICAgIG52dm1fc3VsZF8yZF9hcnJheV92NGkzMl90cmFwLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGkzMi50cmFwCisgICAgbnZ2bV9zdWxkXzJkX2FycmF5X3Y0aTMyX3plcm8sICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTMyLnplcm8KKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfdjRpOF9jbGFtcCwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjRpOC5jbGFtcAorICAgIG52dm1fc3VsZF8yZF9hcnJheV92NGk4X3RyYXAsICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGk4LnRyYXAKKyAgICBudnZtX3N1bGRfMmRfYXJyYXlfdjRpOF96ZXJvLCAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjRpOC56ZXJvCisgICAgbnZ2bV9zdWxkXzJkX2kxNl9jbGFtcCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmkxNi5jbGFtcAorICAgIG52dm1fc3VsZF8yZF9pMTZfdHJhcCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5pMTYudHJhcAorICAgIG52dm1fc3VsZF8yZF9pMTZfemVybywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5pMTYuemVybworICAgIG52dm1fc3VsZF8yZF9pMzJfY2xhbXAsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC5pMzIuY2xhbXAKKyAgICBudnZtX3N1bGRfMmRfaTMyX3RyYXAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuaTMyLnRyYXAKKyAgICBudnZtX3N1bGRfMmRfaTMyX3plcm8sICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuaTMyLnplcm8KKyAgICBudnZtX3N1bGRfMmRfaTY0X2NsYW1wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuaTY0LmNsYW1wCisgICAgbnZ2bV9zdWxkXzJkX2k2NF90cmFwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmk2NC50cmFwCisgICAgbnZ2bV9zdWxkXzJkX2k2NF96ZXJvLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmk2NC56ZXJvCisgICAgbnZ2bV9zdWxkXzJkX2k4X2NsYW1wLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmk4LmNsYW1wCisgICAgbnZ2bV9zdWxkXzJkX2k4X3RyYXAsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmk4LnRyYXAKKyAgICBudnZtX3N1bGRfMmRfaThfemVybywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQuaTguemVybworICAgIG52dm1fc3VsZF8yZF92MmkxNl9jbGFtcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC52MmkxNi5jbGFtcAorICAgIG52dm1fc3VsZF8yZF92MmkxNl90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC52MmkxNi50cmFwCisgICAgbnZ2bV9zdWxkXzJkX3YyaTE2X3plcm8sICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnYyaTE2Lnplcm8KKyAgICBudnZtX3N1bGRfMmRfdjJpMzJfY2xhbXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQudjJpMzIuY2xhbXAKKyAgICBudnZtX3N1bGRfMmRfdjJpMzJfdHJhcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQudjJpMzIudHJhcAorICAgIG52dm1fc3VsZF8yZF92MmkzMl96ZXJvLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC52MmkzMi56ZXJvCisgICAgbnZ2bV9zdWxkXzJkX3YyaTY0X2NsYW1wLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnYyaTY0LmNsYW1wCisgICAgbnZ2bV9zdWxkXzJkX3YyaTY0X3RyYXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnYyaTY0LnRyYXAKKyAgICBudnZtX3N1bGRfMmRfdjJpNjRfemVybywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQudjJpNjQuemVybworICAgIG52dm1fc3VsZF8yZF92Mmk4X2NsYW1wLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC52Mmk4LmNsYW1wCisgICAgbnZ2bV9zdWxkXzJkX3YyaThfdHJhcCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnYyaTgudHJhcAorICAgIG52dm1fc3VsZF8yZF92Mmk4X3plcm8sICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC52Mmk4Lnplcm8KKyAgICBudnZtX3N1bGRfMmRfdjRpMTZfY2xhbXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQudjRpMTYuY2xhbXAKKyAgICBudnZtX3N1bGRfMmRfdjRpMTZfdHJhcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQudjRpMTYudHJhcAorICAgIG52dm1fc3VsZF8yZF92NGkxNl96ZXJvLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC52NGkxNi56ZXJvCisgICAgbnZ2bV9zdWxkXzJkX3Y0aTMyX2NsYW1wLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnY0aTMyLmNsYW1wCisgICAgbnZ2bV9zdWxkXzJkX3Y0aTMyX3RyYXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnY0aTMyLnRyYXAKKyAgICBudnZtX3N1bGRfMmRfdjRpMzJfemVybywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuMmQudjRpMzIuemVybworICAgIG52dm1fc3VsZF8yZF92NGk4X2NsYW1wLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC52NGk4LmNsYW1wCisgICAgbnZ2bV9zdWxkXzJkX3Y0aThfdHJhcCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnY0aTgudHJhcAorICAgIG52dm1fc3VsZF8yZF92NGk4X3plcm8sICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4yZC52NGk4Lnplcm8KKyAgICBudnZtX3N1bGRfM2RfaTE2X2NsYW1wLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QuaTE2LmNsYW1wCisgICAgbnZ2bV9zdWxkXzNkX2kxNl90cmFwLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLmkxNi50cmFwCisgICAgbnZ2bV9zdWxkXzNkX2kxNl96ZXJvLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLmkxNi56ZXJvCisgICAgbnZ2bV9zdWxkXzNkX2kzMl9jbGFtcCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLmkzMi5jbGFtcAorICAgIG52dm1fc3VsZF8zZF9pMzJfdHJhcCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC5pMzIudHJhcAorICAgIG52dm1fc3VsZF8zZF9pMzJfemVybywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC5pMzIuemVybworICAgIG52dm1fc3VsZF8zZF9pNjRfY2xhbXAsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC5pNjQuY2xhbXAKKyAgICBudnZtX3N1bGRfM2RfaTY0X3RyYXAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QuaTY0LnRyYXAKKyAgICBudnZtX3N1bGRfM2RfaTY0X3plcm8sICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QuaTY0Lnplcm8KKyAgICBudnZtX3N1bGRfM2RfaThfY2xhbXAsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QuaTguY2xhbXAKKyAgICBudnZtX3N1bGRfM2RfaThfdHJhcCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QuaTgudHJhcAorICAgIG52dm1fc3VsZF8zZF9pOF96ZXJvLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC5pOC56ZXJvCisgICAgbnZ2bV9zdWxkXzNkX3YyaTE2X2NsYW1wLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnYyaTE2LmNsYW1wCisgICAgbnZ2bV9zdWxkXzNkX3YyaTE2X3RyYXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnYyaTE2LnRyYXAKKyAgICBudnZtX3N1bGRfM2RfdjJpMTZfemVybywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QudjJpMTYuemVybworICAgIG52dm1fc3VsZF8zZF92MmkzMl9jbGFtcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC52MmkzMi5jbGFtcAorICAgIG52dm1fc3VsZF8zZF92MmkzMl90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC52MmkzMi50cmFwCisgICAgbnZ2bV9zdWxkXzNkX3YyaTMyX3plcm8sICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnYyaTMyLnplcm8KKyAgICBudnZtX3N1bGRfM2RfdjJpNjRfY2xhbXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QudjJpNjQuY2xhbXAKKyAgICBudnZtX3N1bGRfM2RfdjJpNjRfdHJhcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QudjJpNjQudHJhcAorICAgIG52dm1fc3VsZF8zZF92Mmk2NF96ZXJvLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC52Mmk2NC56ZXJvCisgICAgbnZ2bV9zdWxkXzNkX3YyaThfY2xhbXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnYyaTguY2xhbXAKKyAgICBudnZtX3N1bGRfM2RfdjJpOF90cmFwLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QudjJpOC50cmFwCisgICAgbnZ2bV9zdWxkXzNkX3YyaThfemVybywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnYyaTguemVybworICAgIG52dm1fc3VsZF8zZF92NGkxNl9jbGFtcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC52NGkxNi5jbGFtcAorICAgIG52dm1fc3VsZF8zZF92NGkxNl90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC52NGkxNi50cmFwCisgICAgbnZ2bV9zdWxkXzNkX3Y0aTE2X3plcm8sICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnY0aTE2Lnplcm8KKyAgICBudnZtX3N1bGRfM2RfdjRpMzJfY2xhbXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QudjRpMzIuY2xhbXAKKyAgICBudnZtX3N1bGRfM2RfdjRpMzJfdHJhcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QudjRpMzIudHJhcAorICAgIG52dm1fc3VsZF8zZF92NGkzMl96ZXJvLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VsZC4zZC52NGkzMi56ZXJvCisgICAgbnZ2bV9zdWxkXzNkX3Y0aThfY2xhbXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnY0aTguY2xhbXAKKyAgICBudnZtX3N1bGRfM2RfdjRpOF90cmFwLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1bGQuM2QudjRpOC50cmFwCisgICAgbnZ2bV9zdWxkXzNkX3Y0aThfemVybywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnY0aTguemVybworICAgIG52dm1fc3VxX2FycmF5X3NpemUsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VxLmFycmF5LnNpemUKKyAgICBudnZtX3N1cV9jaGFubmVsX2RhdGFfdHlwZSwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1cS5jaGFubmVsLmRhdGEudHlwZQorICAgIG52dm1fc3VxX2NoYW5uZWxfb3JkZXIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VxLmNoYW5uZWwub3JkZXIKKyAgICBudnZtX3N1cV9kZXB0aCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1cS5kZXB0aAorICAgIG52dm1fc3VxX2hlaWdodCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VxLmhlaWdodAorICAgIG52dm1fc3VxX3dpZHRoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VxLndpZHRoCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTE2X2NsYW1wLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTE2LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTE2X3RyYXAsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTE2LnRyYXAKKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV9pMTZfemVybywgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pMTYuemVybworICAgIG52dm1fc3VzdF9iXzFkX2FycmF5X2kzMl9jbGFtcCwgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LmkzMi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzFkX2FycmF5X2kzMl90cmFwLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LmkzMi50cmFwCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTMyX3plcm8sICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTMyLnplcm8KKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV9pNjRfY2xhbXAsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pNjQuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV9pNjRfdHJhcCwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pNjQudHJhcAorICAgIG52dm1fc3VzdF9iXzFkX2FycmF5X2k2NF96ZXJvLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5Lmk2NC56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaThfY2xhbXAsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTguY2xhbXAKKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV9pOF90cmFwLCAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pOC50cmFwCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaThfemVybywgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTguemVybworICAgIG52dm1fc3VzdF9iXzFkX2FycmF5X3YyaTE2X2NsYW1wLCAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTE2LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpMTZfdHJhcCwgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpMTYudHJhcAorICAgIG52dm1fc3VzdF9iXzFkX2FycmF5X3YyaTE2X3plcm8sICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTE2Lnplcm8KKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV92MmkzMl9jbGFtcCwgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52MmkzMi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzFkX2FycmF5X3YyaTMyX3RyYXAsICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTMyLnRyYXAKKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV92MmkzMl96ZXJvLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52MmkzMi56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpNjRfY2xhbXAsICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpNjQuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV92Mmk2NF90cmFwLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52Mmk2NC50cmFwCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpNjRfemVybywgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpNjQuemVybworICAgIG52dm1fc3VzdF9iXzFkX2FycmF5X3YyaThfY2xhbXAsICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTguY2xhbXAKKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV92Mmk4X3RyYXAsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52Mmk4LnRyYXAKKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV92Mmk4X3plcm8sICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52Mmk4Lnplcm8KKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV92NGkxNl9jbGFtcCwgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52NGkxNi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzFkX2FycmF5X3Y0aTE2X3RyYXAsICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTE2LnRyYXAKKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV92NGkxNl96ZXJvLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52NGkxNi56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMzJfY2xhbXAsICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpMzIuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV92NGkzMl90cmFwLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52NGkzMi50cmFwCisgICAgbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMzJfemVybywgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpMzIuemVybworICAgIG52dm1fc3VzdF9iXzFkX2FycmF5X3Y0aThfY2xhbXAsICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTguY2xhbXAKKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV92NGk4X3RyYXAsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52NGk4LnRyYXAKKyAgICBudnZtX3N1c3RfYl8xZF9hcnJheV92NGk4X3plcm8sICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52NGk4Lnplcm8KKyAgICBudnZtX3N1c3RfYl8xZF9pMTZfY2xhbXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5pMTYuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8xZF9pMTZfdHJhcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5pMTYudHJhcAorICAgIG52dm1fc3VzdF9iXzFkX2kxNl96ZXJvLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmkxNi56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMWRfaTMyX2NsYW1wLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuaTMyLmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMWRfaTMyX3RyYXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuaTMyLnRyYXAKKyAgICBudnZtX3N1c3RfYl8xZF9pMzJfemVybywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5pMzIuemVybworICAgIG52dm1fc3VzdF9iXzFkX2k2NF9jbGFtcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmk2NC5jbGFtcAorICAgIG52dm1fc3VzdF9iXzFkX2k2NF90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmk2NC50cmFwCisgICAgbnZ2bV9zdXN0X2JfMWRfaTY0X3plcm8sICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuaTY0Lnplcm8KKyAgICBudnZtX3N1c3RfYl8xZF9pOF9jbGFtcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5pOC5jbGFtcAorICAgIG52dm1fc3VzdF9iXzFkX2k4X3RyYXAsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmk4LnRyYXAKKyAgICBudnZtX3N1c3RfYl8xZF9pOF96ZXJvLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5pOC56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMWRfdjJpMTZfY2xhbXAsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpMTYuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8xZF92MmkxNl90cmFwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52MmkxNi50cmFwCisgICAgbnZ2bV9zdXN0X2JfMWRfdjJpMTZfemVybywgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpMTYuemVybworICAgIG52dm1fc3VzdF9iXzFkX3YyaTMyX2NsYW1wLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTMyLmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMWRfdjJpMzJfdHJhcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpMzIudHJhcAorICAgIG52dm1fc3VzdF9iXzFkX3YyaTMyX3plcm8sICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTMyLnplcm8KKyAgICBudnZtX3N1c3RfYl8xZF92Mmk2NF9jbGFtcCwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52Mmk2NC5jbGFtcAorICAgIG52dm1fc3VzdF9iXzFkX3YyaTY0X3RyYXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTY0LnRyYXAKKyAgICBudnZtX3N1c3RfYl8xZF92Mmk2NF96ZXJvLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52Mmk2NC56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMWRfdjJpOF9jbGFtcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpOC5jbGFtcAorICAgIG52dm1fc3VzdF9iXzFkX3YyaThfdHJhcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTgudHJhcAorICAgIG52dm1fc3VzdF9iXzFkX3YyaThfemVybywgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTguemVybworICAgIG52dm1fc3VzdF9iXzFkX3Y0aTE2X2NsYW1wLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTE2LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMWRfdjRpMTZfdHJhcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpMTYudHJhcAorICAgIG52dm1fc3VzdF9iXzFkX3Y0aTE2X3plcm8sICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTE2Lnplcm8KKyAgICBudnZtX3N1c3RfYl8xZF92NGkzMl9jbGFtcCwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52NGkzMi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzFkX3Y0aTMyX3RyYXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTMyLnRyYXAKKyAgICBudnZtX3N1c3RfYl8xZF92NGkzMl96ZXJvLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52NGkzMi56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMWRfdjRpOF9jbGFtcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpOC5jbGFtcAorICAgIG52dm1fc3VzdF9iXzFkX3Y0aThfdHJhcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTgudHJhcAorICAgIG52dm1fc3VzdF9iXzFkX3Y0aThfemVybywgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTguemVybworICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X2kxNl9jbGFtcCwgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LmkxNi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X2kxNl90cmFwLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LmkxNi50cmFwCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTE2X3plcm8sICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTE2Lnplcm8KKyAgICBudnZtX3N1c3RfYl8yZF9hcnJheV9pMzJfY2xhbXAsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pMzIuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8yZF9hcnJheV9pMzJfdHJhcCwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pMzIudHJhcAorICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X2kzMl96ZXJvLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LmkzMi56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTY0X2NsYW1wLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTY0LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTY0X3RyYXAsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTY0LnRyYXAKKyAgICBudnZtX3N1c3RfYl8yZF9hcnJheV9pNjRfemVybywgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pNjQuemVybworICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X2k4X2NsYW1wLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5Lmk4LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaThfdHJhcCwgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTgudHJhcAorICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X2k4X3plcm8sICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5Lmk4Lnplcm8KKyAgICBudnZtX3N1c3RfYl8yZF9hcnJheV92MmkxNl9jbGFtcCwgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52MmkxNi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X3YyaTE2X3RyYXAsICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTE2LnRyYXAKKyAgICBudnZtX3N1c3RfYl8yZF9hcnJheV92MmkxNl96ZXJvLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52MmkxNi56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpMzJfY2xhbXAsICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpMzIuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8yZF9hcnJheV92MmkzMl90cmFwLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52MmkzMi50cmFwCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpMzJfemVybywgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpMzIuemVybworICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X3YyaTY0X2NsYW1wLCAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTY0LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpNjRfdHJhcCwgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpNjQudHJhcAorICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X3YyaTY0X3plcm8sICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTY0Lnplcm8KKyAgICBudnZtX3N1c3RfYl8yZF9hcnJheV92Mmk4X2NsYW1wLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52Mmk4LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpOF90cmFwLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpOC50cmFwCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpOF96ZXJvLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpOC56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpMTZfY2xhbXAsICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpMTYuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8yZF9hcnJheV92NGkxNl90cmFwLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGkxNi50cmFwCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpMTZfemVybywgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpMTYuemVybworICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTMyX2NsYW1wLCAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTMyLmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpMzJfdHJhcCwgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpMzIudHJhcAorICAgIG52dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTMyX3plcm8sICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTMyLnplcm8KKyAgICBudnZtX3N1c3RfYl8yZF9hcnJheV92NGk4X2NsYW1wLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGk4LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpOF90cmFwLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpOC50cmFwCisgICAgbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpOF96ZXJvLCAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpOC56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMmRfaTE2X2NsYW1wLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuaTE2LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMmRfaTE2X3RyYXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuaTE2LnRyYXAKKyAgICBudnZtX3N1c3RfYl8yZF9pMTZfemVybywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5pMTYuemVybworICAgIG52dm1fc3VzdF9iXzJkX2kzMl9jbGFtcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmkzMi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzJkX2kzMl90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmkzMi50cmFwCisgICAgbnZ2bV9zdXN0X2JfMmRfaTMyX3plcm8sICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuaTMyLnplcm8KKyAgICBudnZtX3N1c3RfYl8yZF9pNjRfY2xhbXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5pNjQuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8yZF9pNjRfdHJhcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5pNjQudHJhcAorICAgIG52dm1fc3VzdF9iXzJkX2k2NF96ZXJvLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmk2NC56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMmRfaThfY2xhbXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuaTguY2xhbXAKKyAgICBudnZtX3N1c3RfYl8yZF9pOF90cmFwLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5pOC50cmFwCisgICAgbnZ2bV9zdXN0X2JfMmRfaThfemVybywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuaTguemVybworICAgIG52dm1fc3VzdF9iXzJkX3YyaTE2X2NsYW1wLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTE2LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfMmRfdjJpMTZfdHJhcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpMTYudHJhcAorICAgIG52dm1fc3VzdF9iXzJkX3YyaTE2X3plcm8sICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTE2Lnplcm8KKyAgICBudnZtX3N1c3RfYl8yZF92MmkzMl9jbGFtcCwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52MmkzMi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzJkX3YyaTMyX3RyYXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTMyLnRyYXAKKyAgICBudnZtX3N1c3RfYl8yZF92MmkzMl96ZXJvLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52MmkzMi56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMmRfdjJpNjRfY2xhbXAsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpNjQuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8yZF92Mmk2NF90cmFwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52Mmk2NC50cmFwCisgICAgbnZ2bV9zdXN0X2JfMmRfdjJpNjRfemVybywgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpNjQuemVybworICAgIG52dm1fc3VzdF9iXzJkX3YyaThfY2xhbXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTguY2xhbXAKKyAgICBudnZtX3N1c3RfYl8yZF92Mmk4X3RyYXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52Mmk4LnRyYXAKKyAgICBudnZtX3N1c3RfYl8yZF92Mmk4X3plcm8sICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52Mmk4Lnplcm8KKyAgICBudnZtX3N1c3RfYl8yZF92NGkxNl9jbGFtcCwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52NGkxNi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzJkX3Y0aTE2X3RyYXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTE2LnRyYXAKKyAgICBudnZtX3N1c3RfYl8yZF92NGkxNl96ZXJvLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52NGkxNi56ZXJvCisgICAgbnZ2bV9zdXN0X2JfMmRfdjRpMzJfY2xhbXAsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpMzIuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8yZF92NGkzMl90cmFwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52NGkzMi50cmFwCisgICAgbnZ2bV9zdXN0X2JfMmRfdjRpMzJfemVybywgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpMzIuemVybworICAgIG52dm1fc3VzdF9iXzJkX3Y0aThfY2xhbXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTguY2xhbXAKKyAgICBudnZtX3N1c3RfYl8yZF92NGk4X3RyYXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52NGk4LnRyYXAKKyAgICBudnZtX3N1c3RfYl8yZF92NGk4X3plcm8sICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52NGk4Lnplcm8KKyAgICBudnZtX3N1c3RfYl8zZF9pMTZfY2xhbXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC5pMTYuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8zZF9pMTZfdHJhcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC5pMTYudHJhcAorICAgIG52dm1fc3VzdF9iXzNkX2kxNl96ZXJvLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLmkxNi56ZXJvCisgICAgbnZ2bV9zdXN0X2JfM2RfaTMyX2NsYW1wLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QuaTMyLmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfM2RfaTMyX3RyYXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QuaTMyLnRyYXAKKyAgICBudnZtX3N1c3RfYl8zZF9pMzJfemVybywgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC5pMzIuemVybworICAgIG52dm1fc3VzdF9iXzNkX2k2NF9jbGFtcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLmk2NC5jbGFtcAorICAgIG52dm1fc3VzdF9iXzNkX2k2NF90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLmk2NC50cmFwCisgICAgbnZ2bV9zdXN0X2JfM2RfaTY0X3plcm8sICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QuaTY0Lnplcm8KKyAgICBudnZtX3N1c3RfYl8zZF9pOF9jbGFtcCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC5pOC5jbGFtcAorICAgIG52dm1fc3VzdF9iXzNkX2k4X3RyYXAsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLmk4LnRyYXAKKyAgICBudnZtX3N1c3RfYl8zZF9pOF96ZXJvLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC5pOC56ZXJvCisgICAgbnZ2bV9zdXN0X2JfM2RfdjJpMTZfY2xhbXAsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpMTYuY2xhbXAKKyAgICBudnZtX3N1c3RfYl8zZF92MmkxNl90cmFwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52MmkxNi50cmFwCisgICAgbnZ2bV9zdXN0X2JfM2RfdjJpMTZfemVybywgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpMTYuemVybworICAgIG52dm1fc3VzdF9iXzNkX3YyaTMyX2NsYW1wLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTMyLmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfM2RfdjJpMzJfdHJhcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpMzIudHJhcAorICAgIG52dm1fc3VzdF9iXzNkX3YyaTMyX3plcm8sICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTMyLnplcm8KKyAgICBudnZtX3N1c3RfYl8zZF92Mmk2NF9jbGFtcCwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52Mmk2NC5jbGFtcAorICAgIG52dm1fc3VzdF9iXzNkX3YyaTY0X3RyYXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTY0LnRyYXAKKyAgICBudnZtX3N1c3RfYl8zZF92Mmk2NF96ZXJvLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52Mmk2NC56ZXJvCisgICAgbnZ2bV9zdXN0X2JfM2RfdjJpOF9jbGFtcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpOC5jbGFtcAorICAgIG52dm1fc3VzdF9iXzNkX3YyaThfdHJhcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTgudHJhcAorICAgIG52dm1fc3VzdF9iXzNkX3YyaThfemVybywgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTguemVybworICAgIG52dm1fc3VzdF9iXzNkX3Y0aTE2X2NsYW1wLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTE2LmNsYW1wCisgICAgbnZ2bV9zdXN0X2JfM2RfdjRpMTZfdHJhcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpMTYudHJhcAorICAgIG52dm1fc3VzdF9iXzNkX3Y0aTE2X3plcm8sICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTE2Lnplcm8KKyAgICBudnZtX3N1c3RfYl8zZF92NGkzMl9jbGFtcCwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52NGkzMi5jbGFtcAorICAgIG52dm1fc3VzdF9iXzNkX3Y0aTMyX3RyYXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTMyLnRyYXAKKyAgICBudnZtX3N1c3RfYl8zZF92NGkzMl96ZXJvLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52NGkzMi56ZXJvCisgICAgbnZ2bV9zdXN0X2JfM2RfdjRpOF9jbGFtcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpOC5jbGFtcAorICAgIG52dm1fc3VzdF9iXzNkX3Y0aThfdHJhcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTgudHJhcAorICAgIG52dm1fc3VzdF9iXzNkX3Y0aThfemVybywgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTguemVybworICAgIG52dm1fc3VzdF9wXzFkX2FycmF5X2kxNl90cmFwLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LmkxNi50cmFwCisgICAgbnZ2bV9zdXN0X3BfMWRfYXJyYXlfaTMyX3RyYXAsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkuaTMyLnRyYXAKKyAgICBudnZtX3N1c3RfcF8xZF9hcnJheV9pOF90cmFwLCAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS5pOC50cmFwCisgICAgbnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjJpMTZfdHJhcCwgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkudjJpMTYudHJhcAorICAgIG52dm1fc3VzdF9wXzFkX2FycmF5X3YyaTMyX3RyYXAsICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LnYyaTMyLnRyYXAKKyAgICBudnZtX3N1c3RfcF8xZF9hcnJheV92Mmk4X3RyYXAsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS52Mmk4LnRyYXAKKyAgICBudnZtX3N1c3RfcF8xZF9hcnJheV92NGkxNl90cmFwLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS52NGkxNi50cmFwCisgICAgbnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjRpMzJfdHJhcCwgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkudjRpMzIudHJhcAorICAgIG52dm1fc3VzdF9wXzFkX2FycmF5X3Y0aThfdHJhcCwgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LnY0aTgudHJhcAorICAgIG52dm1fc3VzdF9wXzFkX2kxNl90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLmkxNi50cmFwCisgICAgbnZ2bV9zdXN0X3BfMWRfaTMyX3RyYXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQuaTMyLnRyYXAKKyAgICBudnZtX3N1c3RfcF8xZF9pOF90cmFwLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4xZC5pOC50cmFwCisgICAgbnZ2bV9zdXN0X3BfMWRfdjJpMTZfdHJhcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQudjJpMTYudHJhcAorICAgIG52dm1fc3VzdF9wXzFkX3YyaTMyX3RyYXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLnYyaTMyLnRyYXAKKyAgICBudnZtX3N1c3RfcF8xZF92Mmk4X3RyYXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4xZC52Mmk4LnRyYXAKKyAgICBudnZtX3N1c3RfcF8xZF92NGkxNl90cmFwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4xZC52NGkxNi50cmFwCisgICAgbnZ2bV9zdXN0X3BfMWRfdjRpMzJfdHJhcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQudjRpMzIudHJhcAorICAgIG52dm1fc3VzdF9wXzFkX3Y0aThfdHJhcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLnY0aTgudHJhcAorICAgIG52dm1fc3VzdF9wXzJkX2FycmF5X2kxNl90cmFwLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5LmkxNi50cmFwCisgICAgbnZ2bV9zdXN0X3BfMmRfYXJyYXlfaTMyX3RyYXAsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkuaTMyLnRyYXAKKyAgICBudnZtX3N1c3RfcF8yZF9hcnJheV9pOF90cmFwLCAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS5pOC50cmFwCisgICAgbnZ2bV9zdXN0X3BfMmRfYXJyYXlfdjJpMTZfdHJhcCwgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkudjJpMTYudHJhcAorICAgIG52dm1fc3VzdF9wXzJkX2FycmF5X3YyaTMyX3RyYXAsICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5LnYyaTMyLnRyYXAKKyAgICBudnZtX3N1c3RfcF8yZF9hcnJheV92Mmk4X3RyYXAsICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS52Mmk4LnRyYXAKKyAgICBudnZtX3N1c3RfcF8yZF9hcnJheV92NGkxNl90cmFwLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS52NGkxNi50cmFwCisgICAgbnZ2bV9zdXN0X3BfMmRfYXJyYXlfdjRpMzJfdHJhcCwgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkudjRpMzIudHJhcAorICAgIG52dm1fc3VzdF9wXzJkX2FycmF5X3Y0aThfdHJhcCwgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5LnY0aTgudHJhcAorICAgIG52dm1fc3VzdF9wXzJkX2kxNl90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLmkxNi50cmFwCisgICAgbnZ2bV9zdXN0X3BfMmRfaTMyX3RyYXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQuaTMyLnRyYXAKKyAgICBudnZtX3N1c3RfcF8yZF9pOF90cmFwLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4yZC5pOC50cmFwCisgICAgbnZ2bV9zdXN0X3BfMmRfdjJpMTZfdHJhcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQudjJpMTYudHJhcAorICAgIG52dm1fc3VzdF9wXzJkX3YyaTMyX3RyYXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLnYyaTMyLnRyYXAKKyAgICBudnZtX3N1c3RfcF8yZF92Mmk4X3RyYXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4yZC52Mmk4LnRyYXAKKyAgICBudnZtX3N1c3RfcF8yZF92NGkxNl90cmFwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4yZC52NGkxNi50cmFwCisgICAgbnZ2bV9zdXN0X3BfMmRfdjRpMzJfdHJhcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQudjRpMzIudHJhcAorICAgIG52dm1fc3VzdF9wXzJkX3Y0aThfdHJhcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLnY0aTgudHJhcAorICAgIG52dm1fc3VzdF9wXzNkX2kxNl90cmFwLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjNkLmkxNi50cmFwCisgICAgbnZ2bV9zdXN0X3BfM2RfaTMyX3RyYXAsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuM2QuaTMyLnRyYXAKKyAgICBudnZtX3N1c3RfcF8zZF9pOF90cmFwLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4zZC5pOC50cmFwCisgICAgbnZ2bV9zdXN0X3BfM2RfdjJpMTZfdHJhcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuM2QudjJpMTYudHJhcAorICAgIG52dm1fc3VzdF9wXzNkX3YyaTMyX3RyYXAsICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjNkLnYyaTMyLnRyYXAKKyAgICBudnZtX3N1c3RfcF8zZF92Mmk4X3RyYXAsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4zZC52Mmk4LnRyYXAKKyAgICBudnZtX3N1c3RfcF8zZF92NGkxNl90cmFwLCAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnN1c3QucC4zZC52NGkxNi50cmFwCisgICAgbnZ2bV9zdXN0X3BfM2RfdjRpMzJfdHJhcCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS5zdXN0LnAuM2QudjRpMzIudHJhcAorICAgIG52dm1fc3VzdF9wXzNkX3Y0aThfdHJhcCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3VzdC5wLjNkLnY0aTgudHJhcAorICAgIG52dm1fc3dhcF9sb19oaV9iNjQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0uc3dhcC5sby5oaS5iNjQKKyAgICBudnZtX3RleF8xZF9hcnJheV9ncmFkX3Y0ZjMyX2YzMiwgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC5hcnJheS5ncmFkLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4XzFkX2FycmF5X2dyYWRfdjRzMzJfZjMyLCAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LjFkLmFycmF5LmdyYWQudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfMWRfYXJyYXlfZ3JhZF92NHUzMl9mMzIsICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQuYXJyYXkuZ3JhZC52NHUzMi5mMzIKKyAgICBudnZtX3RleF8xZF9hcnJheV9sZXZlbF92NGYzMl9mMzIsICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC5hcnJheS5sZXZlbC52NGYzMi5mMzIKKyAgICBudnZtX3RleF8xZF9hcnJheV9sZXZlbF92NHMzMl9mMzIsICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC5hcnJheS5sZXZlbC52NHMzMi5mMzIKKyAgICBudnZtX3RleF8xZF9hcnJheV9sZXZlbF92NHUzMl9mMzIsICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC5hcnJheS5sZXZlbC52NHUzMi5mMzIKKyAgICBudnZtX3RleF8xZF9hcnJheV92NGYzMl9mMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC5hcnJheS52NGYzMi5mMzIKKyAgICBudnZtX3RleF8xZF9hcnJheV92NGYzMl9zMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC5hcnJheS52NGYzMi5zMzIKKyAgICBudnZtX3RleF8xZF9hcnJheV92NHMzMl9mMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC5hcnJheS52NHMzMi5mMzIKKyAgICBudnZtX3RleF8xZF9hcnJheV92NHMzMl9zMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC5hcnJheS52NHMzMi5zMzIKKyAgICBudnZtX3RleF8xZF9hcnJheV92NHUzMl9mMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC5hcnJheS52NHUzMi5mMzIKKyAgICBudnZtX3RleF8xZF9hcnJheV92NHUzMl9zMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC5hcnJheS52NHUzMi5zMzIKKyAgICBudnZtX3RleF8xZF9ncmFkX3Y0ZjMyX2YzMiwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC5ncmFkLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4XzFkX2dyYWRfdjRzMzJfZjMyLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LjFkLmdyYWQudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfMWRfZ3JhZF92NHUzMl9mMzIsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMWQuZ3JhZC52NHUzMi5mMzIKKyAgICBudnZtX3RleF8xZF9sZXZlbF92NGYzMl9mMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC5sZXZlbC52NGYzMi5mMzIKKyAgICBudnZtX3RleF8xZF9sZXZlbF92NHMzMl9mMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC5sZXZlbC52NHMzMi5mMzIKKyAgICBudnZtX3RleF8xZF9sZXZlbF92NHUzMl9mMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC5sZXZlbC52NHUzMi5mMzIKKyAgICBudnZtX3RleF8xZF92NGYzMl9mMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC52NGYzMi5mMzIKKyAgICBudnZtX3RleF8xZF92NGYzMl9zMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC52NGYzMi5zMzIKKyAgICBudnZtX3RleF8xZF92NHMzMl9mMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC52NHMzMi5mMzIKKyAgICBudnZtX3RleF8xZF92NHMzMl9zMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC52NHMzMi5zMzIKKyAgICBudnZtX3RleF8xZF92NHUzMl9mMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC52NHUzMi5mMzIKKyAgICBudnZtX3RleF8xZF92NHUzMl9zMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4xZC52NHUzMi5zMzIKKyAgICBudnZtX3RleF8yZF9hcnJheV9ncmFkX3Y0ZjMyX2YzMiwgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC5hcnJheS5ncmFkLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4XzJkX2FycmF5X2dyYWRfdjRzMzJfZjMyLCAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LjJkLmFycmF5LmdyYWQudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfMmRfYXJyYXlfZ3JhZF92NHUzMl9mMzIsICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQuYXJyYXkuZ3JhZC52NHUzMi5mMzIKKyAgICBudnZtX3RleF8yZF9hcnJheV9sZXZlbF92NGYzMl9mMzIsICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC5hcnJheS5sZXZlbC52NGYzMi5mMzIKKyAgICBudnZtX3RleF8yZF9hcnJheV9sZXZlbF92NHMzMl9mMzIsICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC5hcnJheS5sZXZlbC52NHMzMi5mMzIKKyAgICBudnZtX3RleF8yZF9hcnJheV9sZXZlbF92NHUzMl9mMzIsICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC5hcnJheS5sZXZlbC52NHUzMi5mMzIKKyAgICBudnZtX3RleF8yZF9hcnJheV92NGYzMl9mMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC5hcnJheS52NGYzMi5mMzIKKyAgICBudnZtX3RleF8yZF9hcnJheV92NGYzMl9zMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC5hcnJheS52NGYzMi5zMzIKKyAgICBudnZtX3RleF8yZF9hcnJheV92NHMzMl9mMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC5hcnJheS52NHMzMi5mMzIKKyAgICBudnZtX3RleF8yZF9hcnJheV92NHMzMl9zMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC5hcnJheS52NHMzMi5zMzIKKyAgICBudnZtX3RleF8yZF9hcnJheV92NHUzMl9mMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC5hcnJheS52NHUzMi5mMzIKKyAgICBudnZtX3RleF8yZF9hcnJheV92NHUzMl9zMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC5hcnJheS52NHUzMi5zMzIKKyAgICBudnZtX3RleF8yZF9ncmFkX3Y0ZjMyX2YzMiwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC5ncmFkLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4XzJkX2dyYWRfdjRzMzJfZjMyLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LjJkLmdyYWQudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfMmRfZ3JhZF92NHUzMl9mMzIsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguMmQuZ3JhZC52NHUzMi5mMzIKKyAgICBudnZtX3RleF8yZF9sZXZlbF92NGYzMl9mMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC5sZXZlbC52NGYzMi5mMzIKKyAgICBudnZtX3RleF8yZF9sZXZlbF92NHMzMl9mMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC5sZXZlbC52NHMzMi5mMzIKKyAgICBudnZtX3RleF8yZF9sZXZlbF92NHUzMl9mMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC5sZXZlbC52NHUzMi5mMzIKKyAgICBudnZtX3RleF8yZF92NGYzMl9mMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC52NGYzMi5mMzIKKyAgICBudnZtX3RleF8yZF92NGYzMl9zMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC52NGYzMi5zMzIKKyAgICBudnZtX3RleF8yZF92NHMzMl9mMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC52NHMzMi5mMzIKKyAgICBudnZtX3RleF8yZF92NHMzMl9zMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC52NHMzMi5zMzIKKyAgICBudnZtX3RleF8yZF92NHUzMl9mMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC52NHUzMi5mMzIKKyAgICBudnZtX3RleF8yZF92NHUzMl9zMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4yZC52NHUzMi5zMzIKKyAgICBudnZtX3RleF8zZF9ncmFkX3Y0ZjMyX2YzMiwgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4zZC5ncmFkLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4XzNkX2dyYWRfdjRzMzJfZjMyLCAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LjNkLmdyYWQudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfM2RfZ3JhZF92NHUzMl9mMzIsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguM2QuZ3JhZC52NHUzMi5mMzIKKyAgICBudnZtX3RleF8zZF9sZXZlbF92NGYzMl9mMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4zZC5sZXZlbC52NGYzMi5mMzIKKyAgICBudnZtX3RleF8zZF9sZXZlbF92NHMzMl9mMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4zZC5sZXZlbC52NHMzMi5mMzIKKyAgICBudnZtX3RleF8zZF9sZXZlbF92NHUzMl9mMzIsICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4zZC5sZXZlbC52NHUzMi5mMzIKKyAgICBudnZtX3RleF8zZF92NGYzMl9mMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4zZC52NGYzMi5mMzIKKyAgICBudnZtX3RleF8zZF92NGYzMl9zMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4zZC52NGYzMi5zMzIKKyAgICBudnZtX3RleF8zZF92NHMzMl9mMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4zZC52NHMzMi5mMzIKKyAgICBudnZtX3RleF8zZF92NHMzMl9zMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4zZC52NHMzMi5zMzIKKyAgICBudnZtX3RleF8zZF92NHUzMl9mMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4zZC52NHUzMi5mMzIKKyAgICBudnZtX3RleF8zZF92NHUzMl9zMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC4zZC52NHUzMi5zMzIKKyAgICBudnZtX3RleF9jdWJlX2FycmF5X2xldmVsX3Y0ZjMyX2YzMiwgICAgICAgLy8gbGx2bS5udnZtLnRleC5jdWJlLmFycmF5LmxldmVsLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X2N1YmVfYXJyYXlfbGV2ZWxfdjRzMzJfZjMyLCAgICAgICAvLyBsbHZtLm52dm0udGV4LmN1YmUuYXJyYXkubGV2ZWwudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfY3ViZV9hcnJheV9sZXZlbF92NHUzMl9mMzIsICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguY3ViZS5hcnJheS5sZXZlbC52NHUzMi5mMzIKKyAgICBudnZtX3RleF9jdWJlX2FycmF5X3Y0ZjMyX2YzMiwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC5jdWJlLmFycmF5LnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X2N1YmVfYXJyYXlfdjRzMzJfZjMyLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LmN1YmUuYXJyYXkudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfY3ViZV9hcnJheV92NHUzMl9mMzIsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguY3ViZS5hcnJheS52NHUzMi5mMzIKKyAgICBudnZtX3RleF9jdWJlX2xldmVsX3Y0ZjMyX2YzMiwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC5jdWJlLmxldmVsLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X2N1YmVfbGV2ZWxfdjRzMzJfZjMyLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LmN1YmUubGV2ZWwudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfY3ViZV9sZXZlbF92NHUzMl9mMzIsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguY3ViZS5sZXZlbC52NHUzMi5mMzIKKyAgICBudnZtX3RleF9jdWJlX3Y0ZjMyX2YzMiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC5jdWJlLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X2N1YmVfdjRzMzJfZjMyLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LmN1YmUudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfY3ViZV92NHUzMl9mMzIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXguY3ViZS52NHUzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzFkX2FycmF5X2dyYWRfdjRmMzJfZjMyLCAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LmdyYWQudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8xZF9hcnJheV9ncmFkX3Y0czMyX2YzMiwgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS5ncmFkLnY0czMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMWRfYXJyYXlfZ3JhZF92NHUzMl9mMzIsICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkuZ3JhZC52NHUzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzFkX2FycmF5X2xldmVsX3Y0ZjMyX2YzMiwgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS5sZXZlbC52NGYzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzFkX2FycmF5X2xldmVsX3Y0czMyX2YzMiwgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS5sZXZlbC52NHMzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzFkX2FycmF5X2xldmVsX3Y0dTMyX2YzMiwgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS5sZXZlbC52NHUzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzFkX2FycmF5X3Y0ZjMyX2YzMiwgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMWRfYXJyYXlfdjRmMzJfczMyLCAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkudjRmMzIuczMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8xZF9hcnJheV92NHMzMl9mMzIsICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS52NHMzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzFkX2FycmF5X3Y0czMyX3MzMiwgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LnY0czMyLnMzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMWRfYXJyYXlfdjR1MzJfZjMyLCAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8xZF9hcnJheV92NHUzMl9zMzIsICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS52NHUzMi5zMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzFkX2dyYWRfdjRmMzJfZjMyLCAgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmdyYWQudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8xZF9ncmFkX3Y0czMyX2YzMiwgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5ncmFkLnY0czMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMWRfZ3JhZF92NHUzMl9mMzIsICAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuZ3JhZC52NHUzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzFkX2xldmVsX3Y0ZjMyX2YzMiwgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmxldmVsLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMWRfbGV2ZWxfdjRzMzJfZjMyLCAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQubGV2ZWwudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8xZF9sZXZlbF92NHUzMl9mMzIsICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5sZXZlbC52NHUzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzFkX3Y0ZjMyX2YzMiwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMWRfdjRmMzJfczMyLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQudjRmMzIuczMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8xZF92NHMzMl9mMzIsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC52NHMzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzFkX3Y0czMyX3MzMiwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLnY0czMyLnMzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMWRfdjR1MzJfZjMyLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8xZF92NHUzMl9zMzIsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC52NHUzMi5zMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzJkX2FycmF5X2dyYWRfdjRmMzJfZjMyLCAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LmdyYWQudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8yZF9hcnJheV9ncmFkX3Y0czMyX2YzMiwgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS5ncmFkLnY0czMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMmRfYXJyYXlfZ3JhZF92NHUzMl9mMzIsICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkuZ3JhZC52NHUzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzJkX2FycmF5X2xldmVsX3Y0ZjMyX2YzMiwgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS5sZXZlbC52NGYzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzJkX2FycmF5X2xldmVsX3Y0czMyX2YzMiwgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS5sZXZlbC52NHMzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzJkX2FycmF5X2xldmVsX3Y0dTMyX2YzMiwgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS5sZXZlbC52NHUzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzJkX2FycmF5X3Y0ZjMyX2YzMiwgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMmRfYXJyYXlfdjRmMzJfczMyLCAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkudjRmMzIuczMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8yZF9hcnJheV92NHMzMl9mMzIsICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS52NHMzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzJkX2FycmF5X3Y0czMyX3MzMiwgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LnY0czMyLnMzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMmRfYXJyYXlfdjR1MzJfZjMyLCAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8yZF9hcnJheV92NHUzMl9zMzIsICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS52NHUzMi5zMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzJkX2dyYWRfdjRmMzJfZjMyLCAgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmdyYWQudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8yZF9ncmFkX3Y0czMyX2YzMiwgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5ncmFkLnY0czMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMmRfZ3JhZF92NHUzMl9mMzIsICAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuZ3JhZC52NHUzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzJkX2xldmVsX3Y0ZjMyX2YzMiwgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmxldmVsLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMmRfbGV2ZWxfdjRzMzJfZjMyLCAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQubGV2ZWwudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8yZF9sZXZlbF92NHUzMl9mMzIsICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5sZXZlbC52NHUzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzJkX3Y0ZjMyX2YzMiwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMmRfdjRmMzJfczMyLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQudjRmMzIuczMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8yZF92NHMzMl9mMzIsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC52NHMzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzJkX3Y0czMyX3MzMiwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLnY0czMyLnMzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfMmRfdjR1MzJfZjMyLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8yZF92NHUzMl9zMzIsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC52NHUzMi5zMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzNkX2dyYWRfdjRmMzJfZjMyLCAgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjNkLmdyYWQudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8zZF9ncmFkX3Y0czMyX2YzMiwgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC5ncmFkLnY0czMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfM2RfZ3JhZF92NHUzMl9mMzIsICAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QuZ3JhZC52NHUzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzNkX2xldmVsX3Y0ZjMyX2YzMiwgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjNkLmxldmVsLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfM2RfbGV2ZWxfdjRzMzJfZjMyLCAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QubGV2ZWwudjRzMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8zZF9sZXZlbF92NHUzMl9mMzIsICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC5sZXZlbC52NHUzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzNkX3Y0ZjMyX2YzMiwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjNkLnY0ZjMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfM2RfdjRmMzJfczMyLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QudjRmMzIuczMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8zZF92NHMzMl9mMzIsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC52NHMzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkXzNkX3Y0czMyX3MzMiwgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjNkLnY0czMyLnMzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfM2RfdjR1MzJfZjMyLCAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QudjR1MzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF8zZF92NHUzMl9zMzIsICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC52NHUzMi5zMzIKKyAgICBudnZtX3RleF91bmlmaWVkX2N1YmVfYXJyYXlfbGV2ZWxfdjRmMzJfZjMyLCAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUuYXJyYXkubGV2ZWwudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF9jdWJlX2FycmF5X2xldmVsX3Y0czMyX2YzMiwgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLmFycmF5LmxldmVsLnY0czMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfY3ViZV9hcnJheV9sZXZlbF92NHUzMl9mMzIsICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5hcnJheS5sZXZlbC52NHUzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkX2N1YmVfYXJyYXlfdjRmMzJfZjMyLCAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUuYXJyYXkudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF9jdWJlX2FycmF5X3Y0czMyX2YzMiwgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLmFycmF5LnY0czMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfY3ViZV9hcnJheV92NHUzMl9mMzIsICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5hcnJheS52NHUzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkX2N1YmVfbGV2ZWxfdjRmMzJfZjMyLCAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUubGV2ZWwudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF9jdWJlX2xldmVsX3Y0czMyX2YzMiwgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLmxldmVsLnY0czMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfY3ViZV9sZXZlbF92NHUzMl9mMzIsICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5sZXZlbC52NHUzMi5mMzIKKyAgICBudnZtX3RleF91bmlmaWVkX2N1YmVfdjRmMzJfZjMyLCAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUudjRmMzIuZjMyCisgICAgbnZ2bV90ZXhfdW5pZmllZF9jdWJlX3Y0czMyX2YzMiwgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLnY0czMyLmYzMgorICAgIG52dm1fdGV4X3VuaWZpZWRfY3ViZV92NHUzMl9mMzIsICAgICAgICAgICAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS52NHUzMi5mMzIKKyAgICBudnZtX3RleHN1cmZfaGFuZGxlLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnRleHN1cmYuaGFuZGxlCisgICAgbnZ2bV90ZXhzdXJmX2hhbmRsZV9pbnRlcm5hbCwgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50ZXhzdXJmLmhhbmRsZS5pbnRlcm5hbAorICAgIG52dm1fdGxkNF9hXzJkX3Y0ZjMyX2YzMiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGxkNC5hLjJkLnY0ZjMyLmYzMgorICAgIG52dm1fdGxkNF9hXzJkX3Y0czMyX2YzMiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGxkNC5hLjJkLnY0czMyLmYzMgorICAgIG52dm1fdGxkNF9hXzJkX3Y0dTMyX2YzMiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGxkNC5hLjJkLnY0dTMyLmYzMgorICAgIG52dm1fdGxkNF9iXzJkX3Y0ZjMyX2YzMiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGxkNC5iLjJkLnY0ZjMyLmYzMgorICAgIG52dm1fdGxkNF9iXzJkX3Y0czMyX2YzMiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGxkNC5iLjJkLnY0czMyLmYzMgorICAgIG52dm1fdGxkNF9iXzJkX3Y0dTMyX2YzMiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGxkNC5iLjJkLnY0dTMyLmYzMgorICAgIG52dm1fdGxkNF9nXzJkX3Y0ZjMyX2YzMiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGxkNC5nLjJkLnY0ZjMyLmYzMgorICAgIG52dm1fdGxkNF9nXzJkX3Y0czMyX2YzMiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGxkNC5nLjJkLnY0czMyLmYzMgorICAgIG52dm1fdGxkNF9nXzJkX3Y0dTMyX2YzMiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGxkNC5nLjJkLnY0dTMyLmYzMgorICAgIG52dm1fdGxkNF9yXzJkX3Y0ZjMyX2YzMiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGxkNC5yLjJkLnY0ZjMyLmYzMgorICAgIG52dm1fdGxkNF9yXzJkX3Y0czMyX2YzMiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGxkNC5yLjJkLnY0czMyLmYzMgorICAgIG52dm1fdGxkNF9yXzJkX3Y0dTMyX2YzMiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udGxkNC5yLjJkLnY0dTMyLmYzMgorICAgIG52dm1fdGxkNF91bmlmaWVkX2FfMmRfdjRmMzJfZjMyLCAgICAgICAgICAvLyBsbHZtLm52dm0udGxkNC51bmlmaWVkLmEuMmQudjRmMzIuZjMyCisgICAgbnZ2bV90bGQ0X3VuaWZpZWRfYV8yZF92NHMzMl9mMzIsICAgICAgICAgIC8vIGxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuYS4yZC52NHMzMi5mMzIKKyAgICBudnZtX3RsZDRfdW5pZmllZF9hXzJkX3Y0dTMyX2YzMiwgICAgICAgICAgLy8gbGx2bS5udnZtLnRsZDQudW5pZmllZC5hLjJkLnY0dTMyLmYzMgorICAgIG52dm1fdGxkNF91bmlmaWVkX2JfMmRfdjRmMzJfZjMyLCAgICAgICAgICAvLyBsbHZtLm52dm0udGxkNC51bmlmaWVkLmIuMmQudjRmMzIuZjMyCisgICAgbnZ2bV90bGQ0X3VuaWZpZWRfYl8yZF92NHMzMl9mMzIsICAgICAgICAgIC8vIGxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuYi4yZC52NHMzMi5mMzIKKyAgICBudnZtX3RsZDRfdW5pZmllZF9iXzJkX3Y0dTMyX2YzMiwgICAgICAgICAgLy8gbGx2bS5udnZtLnRsZDQudW5pZmllZC5iLjJkLnY0dTMyLmYzMgorICAgIG52dm1fdGxkNF91bmlmaWVkX2dfMmRfdjRmMzJfZjMyLCAgICAgICAgICAvLyBsbHZtLm52dm0udGxkNC51bmlmaWVkLmcuMmQudjRmMzIuZjMyCisgICAgbnZ2bV90bGQ0X3VuaWZpZWRfZ18yZF92NHMzMl9mMzIsICAgICAgICAgIC8vIGxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuZy4yZC52NHMzMi5mMzIKKyAgICBudnZtX3RsZDRfdW5pZmllZF9nXzJkX3Y0dTMyX2YzMiwgICAgICAgICAgLy8gbGx2bS5udnZtLnRsZDQudW5pZmllZC5nLjJkLnY0dTMyLmYzMgorICAgIG52dm1fdGxkNF91bmlmaWVkX3JfMmRfdjRmMzJfZjMyLCAgICAgICAgICAvLyBsbHZtLm52dm0udGxkNC51bmlmaWVkLnIuMmQudjRmMzIuZjMyCisgICAgbnZ2bV90bGQ0X3VuaWZpZWRfcl8yZF92NHMzMl9mMzIsICAgICAgICAgIC8vIGxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuci4yZC52NHMzMi5mMzIKKyAgICBudnZtX3RsZDRfdW5pZmllZF9yXzJkX3Y0dTMyX2YzMiwgICAgICAgICAgLy8gbGx2bS5udnZtLnRsZDQudW5pZmllZC5yLjJkLnY0dTMyLmYzMgorICAgIG52dm1fdHJ1bmNfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udHJ1bmMuZAorICAgIG52dm1fdHJ1bmNfZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udHJ1bmMuZgorICAgIG52dm1fdHJ1bmNfZnR6X2YsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udHJ1bmMuZnR6LmYKKyAgICBudnZtX3R4cV9hcnJheV9zaXplLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnR4cS5hcnJheS5zaXplCisgICAgbnZ2bV90eHFfY2hhbm5lbF9kYXRhX3R5cGUsICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50eHEuY2hhbm5lbC5kYXRhLnR5cGUKKyAgICBudnZtX3R4cV9jaGFubmVsX29yZGVyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnR4cS5jaGFubmVsLm9yZGVyCisgICAgbnZ2bV90eHFfZGVwdGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50eHEuZGVwdGgKKyAgICBudnZtX3R4cV9oZWlnaHQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnR4cS5oZWlnaHQKKyAgICBudnZtX3R4cV9udW1fbWlwbWFwX2xldmVscywgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnR4cS5udW0ubWlwbWFwLmxldmVscworICAgIG52dm1fdHhxX251bV9zYW1wbGVzLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udHhxLm51bS5zYW1wbGVzCisgICAgbnZ2bV90eHFfd2lkdGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS50eHEud2lkdGgKKyAgICBudnZtX3VpMmRfcm0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnVpMmQucm0KKyAgICBudnZtX3VpMmRfcm4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnVpMmQucm4KKyAgICBudnZtX3VpMmRfcnAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnVpMmQucnAKKyAgICBudnZtX3VpMmRfcnosICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnVpMmQucnoKKyAgICBudnZtX3VpMmZfcm0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnVpMmYucm0KKyAgICBudnZtX3VpMmZfcm4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnVpMmYucm4KKyAgICBudnZtX3VpMmZfcnAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnVpMmYucnAKKyAgICBudnZtX3VpMmZfcnosICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnVpMmYucnoKKyAgICBudnZtX3VsbDJkX3JtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnVsbDJkLnJtCisgICAgbnZ2bV91bGwyZF9ybiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS51bGwyZC5ybgorICAgIG52dm1fdWxsMmRfcnAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udWxsMmQucnAKKyAgICBudnZtX3VsbDJkX3J6LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnVsbDJkLnJ6CisgICAgbnZ2bV91bGwyZl9ybSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS51bGwyZi5ybQorICAgIG52dm1fdWxsMmZfcm4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udWxsMmYucm4KKyAgICBudnZtX3VsbDJmX3JwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnVsbDJmLnJwCisgICAgbnZ2bV91bGwyZl9yeiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS51bGwyZi5yegorICAgIG52dm1fdm90ZV9hbGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udm90ZS5hbGwKKyAgICBudnZtX3ZvdGVfYWxsX3N5bmMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnZvdGUuYWxsLnN5bmMKKyAgICBudnZtX3ZvdGVfYW55LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnZvdGUuYW55CisgICAgbnZ2bV92b3RlX2FueV9zeW5jLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS52b3RlLmFueS5zeW5jCisgICAgbnZ2bV92b3RlX2JhbGxvdCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ubnZ2bS52b3RlLmJhbGxvdAorICAgIG52dm1fdm90ZV9iYWxsb3Rfc3luYywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udm90ZS5iYWxsb3Quc3luYworICAgIG52dm1fdm90ZV91bmksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLm52dm0udm90ZS51bmkKKyAgICBudnZtX3ZvdGVfdW5pX3N5bmMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5udnZtLnZvdGUudW5pLnN5bmMKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X2xvYWRfYV9mMTZfY29sLCAgICAgICAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYS5jb2wuZjE2CisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9sb2FkX2FfZjE2X2NvbF9zdHJpZGUsICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5hLmNvbC5zdHJpZGUuZjE2CisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9sb2FkX2FfZjE2X3JvdywgICAgICAgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmEucm93LmYxNgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbG9hZF9hX2YxNl9yb3dfc3RyaWRlLCAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYS5yb3cuc3RyaWRlLmYxNgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbG9hZF9iX2YxNl9jb2wsICAgICAgICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5iLmNvbC5mMTYKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X2xvYWRfYl9mMTZfY29sX3N0cmlkZSwgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmIuY29sLnN0cmlkZS5mMTYKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X2xvYWRfYl9mMTZfcm93LCAgICAgICAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYi5yb3cuZjE2CisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9sb2FkX2JfZjE2X3Jvd19zdHJpZGUsICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5iLnJvdy5zdHJpZGUuZjE2CisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9sb2FkX2NfZjE2X2NvbCwgICAgICAgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmMuY29sLmYxNgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbG9hZF9jX2YzMl9jb2wsICAgICAgICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5jLmNvbC5mMzIKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X2xvYWRfY19mMTZfY29sX3N0cmlkZSwgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmMuY29sLnN0cmlkZS5mMTYKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X2xvYWRfY19mMzJfY29sX3N0cmlkZSwgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmMuY29sLnN0cmlkZS5mMzIKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X2xvYWRfY19mMTZfcm93LCAgICAgICAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYy5yb3cuZjE2CisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9sb2FkX2NfZjMyX3JvdywgICAgICAgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmMucm93LmYzMgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbG9hZF9jX2YxNl9yb3dfc3RyaWRlLCAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYy5yb3cuc3RyaWRlLmYxNgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbG9hZF9jX2YzMl9yb3dfc3RyaWRlLCAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYy5yb3cuc3RyaWRlLmYzMgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX2NvbF9jb2xfZjE2X2YxNiwgICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5jb2wuZjE2LmYxNgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX2NvbF9jb2xfZjE2X2YxNl9zYXRmaW5pdGUsICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5jb2wuZjE2LmYxNi5zYXRmaW5pdGUKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9jb2xfY29sX2YxNl9mMzIsICAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wuY29sLmYxNi5mMzIKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9jb2xfY29sX2YxNl9mMzJfc2F0ZmluaXRlLCAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wuY29sLmYxNi5mMzIuc2F0ZmluaXRlCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9tbWFfY29sX2NvbF9mMzJfZjE2LCAgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLmNvbC5mMzIuZjE2CisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9tbWFfY29sX2NvbF9mMzJfZjE2X3NhdGZpbml0ZSwgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLmNvbC5mMzIuZjE2LnNhdGZpbml0ZQorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX2NvbF9jb2xfZjMyX2YzMiwgICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5jb2wuZjMyLmYzMgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX2NvbF9jb2xfZjMyX2YzMl9zYXRmaW5pdGUsICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5jb2wuZjMyLmYzMi5zYXRmaW5pdGUKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9jb2xfcm93X2YxNl9mMTYsICAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wucm93LmYxNi5mMTYKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9jb2xfcm93X2YxNl9mMTZfc2F0ZmluaXRlLCAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wucm93LmYxNi5mMTYuc2F0ZmluaXRlCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9tbWFfY29sX3Jvd19mMTZfZjMyLCAgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLnJvdy5mMTYuZjMyCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9tbWFfY29sX3Jvd19mMTZfZjMyX3NhdGZpbml0ZSwgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLnJvdy5mMTYuZjMyLnNhdGZpbml0ZQorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX2NvbF9yb3dfZjMyX2YxNiwgICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5yb3cuZjMyLmYxNgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX2NvbF9yb3dfZjMyX2YxNl9zYXRmaW5pdGUsICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5yb3cuZjMyLmYxNi5zYXRmaW5pdGUKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9jb2xfcm93X2YzMl9mMzIsICAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wucm93LmYzMi5mMzIKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9jb2xfcm93X2YzMl9mMzJfc2F0ZmluaXRlLCAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wucm93LmYzMi5mMzIuc2F0ZmluaXRlCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9tbWFfcm93X2NvbF9mMTZfZjE2LCAgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LmNvbC5mMTYuZjE2CisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9tbWFfcm93X2NvbF9mMTZfZjE2X3NhdGZpbml0ZSwgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LmNvbC5mMTYuZjE2LnNhdGZpbml0ZQorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX3Jvd19jb2xfZjE2X2YzMiwgICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5jb2wuZjE2LmYzMgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX3Jvd19jb2xfZjE2X2YzMl9zYXRmaW5pdGUsICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5jb2wuZjE2LmYzMi5zYXRmaW5pdGUKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9yb3dfY29sX2YzMl9mMTYsICAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cuY29sLmYzMi5mMTYKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9yb3dfY29sX2YzMl9mMTZfc2F0ZmluaXRlLCAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cuY29sLmYzMi5mMTYuc2F0ZmluaXRlCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9tbWFfcm93X2NvbF9mMzJfZjMyLCAgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LmNvbC5mMzIuZjMyCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9tbWFfcm93X2NvbF9mMzJfZjMyX3NhdGZpbml0ZSwgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LmNvbC5mMzIuZjMyLnNhdGZpbml0ZQorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX3Jvd19yb3dfZjE2X2YxNiwgICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5yb3cuZjE2LmYxNgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX3Jvd19yb3dfZjE2X2YxNl9zYXRmaW5pdGUsICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5yb3cuZjE2LmYxNi5zYXRmaW5pdGUKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9yb3dfcm93X2YxNl9mMzIsICAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cucm93LmYxNi5mMzIKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X21tYV9yb3dfcm93X2YxNl9mMzJfc2F0ZmluaXRlLCAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cucm93LmYxNi5mMzIuc2F0ZmluaXRlCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9tbWFfcm93X3Jvd19mMzJfZjE2LCAgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LnJvdy5mMzIuZjE2CisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9tbWFfcm93X3Jvd19mMzJfZjE2X3NhdGZpbml0ZSwgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LnJvdy5mMzIuZjE2LnNhdGZpbml0ZQorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX3Jvd19yb3dfZjMyX2YzMiwgICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5yb3cuZjMyLmYzMgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfbW1hX3Jvd19yb3dfZjMyX2YzMl9zYXRmaW5pdGUsICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5yb3cuZjMyLmYzMi5zYXRmaW5pdGUKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X3N0b3JlX2RfZjE2X2NvbCwgICAgICAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LnN0b3JlLmQuY29sLmYxNgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfc3RvcmVfZF9mMzJfY29sLCAgICAgICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYuc3RvcmUuZC5jb2wuZjMyCisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9zdG9yZV9kX2YxNl9jb2xfc3RyaWRlLCAgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LnN0b3JlLmQuY29sLnN0cmlkZS5mMTYKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X3N0b3JlX2RfZjMyX2NvbF9zdHJpZGUsICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYuc3RvcmUuZC5jb2wuc3RyaWRlLmYzMgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfc3RvcmVfZF9mMTZfcm93LCAgICAgICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYuc3RvcmUuZC5yb3cuZjE2CisgICAgbnZ2bV93bW1hX20xNm4xNmsxNl9zdG9yZV9kX2YzMl9yb3csICAgICAgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5zdG9yZS5kLnJvdy5mMzIKKyAgICBudnZtX3dtbWFfbTE2bjE2azE2X3N0b3JlX2RfZjE2X3Jvd19zdHJpZGUsICAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYuc3RvcmUuZC5yb3cuc3RyaWRlLmYxNgorICAgIG52dm1fd21tYV9tMTZuMTZrMTZfc3RvcmVfZF9mMzJfcm93X3N0cmlkZSwgIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5zdG9yZS5kLnJvdy5zdHJpZGUuZjMyCisgICAgcHBjX2FsdGl2ZWNfY3J5cHRvX3ZjaXBoZXIsICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZjaXBoZXIKKyAgICBwcGNfYWx0aXZlY19jcnlwdG9fdmNpcGhlcmxhc3QsICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udmNpcGhlcmxhc3QKKyAgICBwcGNfYWx0aXZlY19jcnlwdG9fdm5jaXBoZXIsICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udm5jaXBoZXIKKyAgICBwcGNfYWx0aXZlY19jcnlwdG9fdm5jaXBoZXJsYXN0LCAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udm5jaXBoZXJsYXN0CisgICAgcHBjX2FsdGl2ZWNfY3J5cHRvX3ZwZXJteG9yLCAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZwZXJteG9yCisgICAgcHBjX2FsdGl2ZWNfY3J5cHRvX3ZwbXN1bWIsICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZwbXN1bWIKKyAgICBwcGNfYWx0aXZlY19jcnlwdG9fdnBtc3VtZCwgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udnBtc3VtZAorICAgIHBwY19hbHRpdmVjX2NyeXB0b192cG1zdW1oLCAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLmNyeXB0by52cG1zdW1oCisgICAgcHBjX2FsdGl2ZWNfY3J5cHRvX3ZwbXN1bXcsICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZwbXN1bXcKKyAgICBwcGNfYWx0aXZlY19jcnlwdG9fdnNib3gsICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udnNib3gKKyAgICBwcGNfYWx0aXZlY19jcnlwdG9fdnNoYXNpZ21hZCwgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udnNoYXNpZ21hZAorICAgIHBwY19hbHRpdmVjX2NyeXB0b192c2hhc2lnbWF3LCAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLmNyeXB0by52c2hhc2lnbWF3CisgICAgcHBjX2FsdGl2ZWNfZHNzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMuZHNzCisgICAgcHBjX2FsdGl2ZWNfZHNzYWxsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMuZHNzYWxsCisgICAgcHBjX2FsdGl2ZWNfZHN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMuZHN0CisgICAgcHBjX2FsdGl2ZWNfZHN0c3QsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMuZHN0c3QKKyAgICBwcGNfYWx0aXZlY19kc3RzdHQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy5kc3RzdHQKKyAgICBwcGNfYWx0aXZlY19kc3R0LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy5kc3R0CisgICAgcHBjX2FsdGl2ZWNfbHZlYngsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMubHZlYngKKyAgICBwcGNfYWx0aXZlY19sdmVoeCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy5sdmVoeAorICAgIHBwY19hbHRpdmVjX2x2ZXd4LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLmx2ZXd4CisgICAgcHBjX2FsdGl2ZWNfbHZzbCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMubHZzbAorICAgIHBwY19hbHRpdmVjX2x2c3IsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLmx2c3IKKyAgICBwcGNfYWx0aXZlY19sdngsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy5sdngKKyAgICBwcGNfYWx0aXZlY19sdnhsLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy5sdnhsCisgICAgcHBjX2FsdGl2ZWNfbWZ2c2NyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMubWZ2c2NyCisgICAgcHBjX2FsdGl2ZWNfbXR2c2NyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMubXR2c2NyCisgICAgcHBjX2FsdGl2ZWNfc3R2ZWJ4LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMuc3R2ZWJ4CisgICAgcHBjX2FsdGl2ZWNfc3R2ZWh4LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMuc3R2ZWh4CisgICAgcHBjX2FsdGl2ZWNfc3R2ZXd4LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMuc3R2ZXd4CisgICAgcHBjX2FsdGl2ZWNfc3R2eCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMuc3R2eAorICAgIHBwY19hbHRpdmVjX3N0dnhsLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnN0dnhsCisgICAgcHBjX2FsdGl2ZWNfdmFic2R1YiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmFic2R1YgorICAgIHBwY19hbHRpdmVjX3ZhYnNkdWgsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhYnNkdWgKKyAgICBwcGNfYWx0aXZlY192YWJzZHV3LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52YWJzZHV3CisgICAgcHBjX2FsdGl2ZWNfdmFkZGN1cSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmFkZGN1cQorICAgIHBwY19hbHRpdmVjX3ZhZGRjdXcsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhZGRjdXcKKyAgICBwcGNfYWx0aXZlY192YWRkZWN1cSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52YWRkZWN1cQorICAgIHBwY19hbHRpdmVjX3ZhZGRldXFtLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhZGRldXFtCisgICAgcHBjX2FsdGl2ZWNfdmFkZHNicywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmFkZHNicworICAgIHBwY19hbHRpdmVjX3ZhZGRzaHMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhZGRzaHMKKyAgICBwcGNfYWx0aXZlY192YWRkc3dzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52YWRkc3dzCisgICAgcHBjX2FsdGl2ZWNfdmFkZHVicywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmFkZHVicworICAgIHBwY19hbHRpdmVjX3ZhZGR1aHMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhZGR1aHMKKyAgICBwcGNfYWx0aXZlY192YWRkdXdzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52YWRkdXdzCisgICAgcHBjX2FsdGl2ZWNfdmF2Z3NiLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmF2Z3NiCisgICAgcHBjX2FsdGl2ZWNfdmF2Z3NoLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmF2Z3NoCisgICAgcHBjX2FsdGl2ZWNfdmF2Z3N3LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmF2Z3N3CisgICAgcHBjX2FsdGl2ZWNfdmF2Z3ViLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmF2Z3ViCisgICAgcHBjX2FsdGl2ZWNfdmF2Z3VoLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmF2Z3VoCisgICAgcHBjX2FsdGl2ZWNfdmF2Z3V3LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmF2Z3V3CisgICAgcHBjX2FsdGl2ZWNfdmJwZXJtcSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmJwZXJtcQorICAgIHBwY19hbHRpdmVjX3ZjZnN4LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjZnN4CisgICAgcHBjX2FsdGl2ZWNfdmNmdXgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNmdXgKKyAgICBwcGNfYWx0aXZlY192Y2x6bHNiYiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y2x6bHNiYgorICAgIHBwY19hbHRpdmVjX3ZjbXBiZnAsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBiZnAKKyAgICBwcGNfYWx0aXZlY192Y21wYmZwX3AsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wYmZwLnAKKyAgICBwcGNfYWx0aXZlY192Y21wZXFmcCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZXFmcAorICAgIHBwY19hbHRpdmVjX3ZjbXBlcWZwX3AsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBlcWZwLnAKKyAgICBwcGNfYWx0aXZlY192Y21wZXF1YiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1YgorICAgIHBwY19hbHRpdmVjX3ZjbXBlcXViX3AsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBlcXViLnAKKyAgICBwcGNfYWx0aXZlY192Y21wZXF1ZCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1ZAorICAgIHBwY19hbHRpdmVjX3ZjbXBlcXVkX3AsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBlcXVkLnAKKyAgICBwcGNfYWx0aXZlY192Y21wZXF1aCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1aAorICAgIHBwY19hbHRpdmVjX3ZjbXBlcXVoX3AsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBlcXVoLnAKKyAgICBwcGNfYWx0aXZlY192Y21wZXF1dywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1dworICAgIHBwY19hbHRpdmVjX3ZjbXBlcXV3X3AsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBlcXV3LnAKKyAgICBwcGNfYWx0aXZlY192Y21wZ2VmcCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ2VmcAorICAgIHBwY19hbHRpdmVjX3ZjbXBnZWZwX3AsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBnZWZwLnAKKyAgICBwcGNfYWx0aXZlY192Y21wZ3RmcCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RmcAorICAgIHBwY19hbHRpdmVjX3ZjbXBndGZwX3AsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndGZwLnAKKyAgICBwcGNfYWx0aXZlY192Y21wZ3RzYiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RzYgorICAgIHBwY19hbHRpdmVjX3ZjbXBndHNiX3AsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHNiLnAKKyAgICBwcGNfYWx0aXZlY192Y21wZ3RzZCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RzZAorICAgIHBwY19hbHRpdmVjX3ZjbXBndHNkX3AsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHNkLnAKKyAgICBwcGNfYWx0aXZlY192Y21wZ3RzaCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RzaAorICAgIHBwY19hbHRpdmVjX3ZjbXBndHNoX3AsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHNoLnAKKyAgICBwcGNfYWx0aXZlY192Y21wZ3RzdywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RzdworICAgIHBwY19hbHRpdmVjX3ZjbXBndHN3X3AsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHN3LnAKKyAgICBwcGNfYWx0aXZlY192Y21wZ3R1YiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1YgorICAgIHBwY19hbHRpdmVjX3ZjbXBndHViX3AsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHViLnAKKyAgICBwcGNfYWx0aXZlY192Y21wZ3R1ZCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1ZAorICAgIHBwY19hbHRpdmVjX3ZjbXBndHVkX3AsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHVkLnAKKyAgICBwcGNfYWx0aXZlY192Y21wZ3R1aCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1aAorICAgIHBwY19hbHRpdmVjX3ZjbXBndHVoX3AsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHVoLnAKKyAgICBwcGNfYWx0aXZlY192Y21wZ3R1dywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1dworICAgIHBwY19hbHRpdmVjX3ZjbXBndHV3X3AsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHV3LnAKKyAgICBwcGNfYWx0aXZlY192Y21wbmViLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wbmViCisgICAgcHBjX2FsdGl2ZWNfdmNtcG5lYl9wLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcG5lYi5wCisgICAgcHBjX2FsdGl2ZWNfdmNtcG5laCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcG5laAorICAgIHBwY19hbHRpdmVjX3ZjbXBuZWhfcCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZWgucAorICAgIHBwY19hbHRpdmVjX3ZjbXBuZXcsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZXcKKyAgICBwcGNfYWx0aXZlY192Y21wbmV3X3AsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wbmV3LnAKKyAgICBwcGNfYWx0aXZlY192Y21wbmV6YiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wbmV6YgorICAgIHBwY19hbHRpdmVjX3ZjbXBuZXpiX3AsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZXpiLnAKKyAgICBwcGNfYWx0aXZlY192Y21wbmV6aCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wbmV6aAorICAgIHBwY19hbHRpdmVjX3ZjbXBuZXpoX3AsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZXpoLnAKKyAgICBwcGNfYWx0aXZlY192Y21wbmV6dywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wbmV6dworICAgIHBwY19hbHRpdmVjX3ZjbXBuZXp3X3AsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZXp3LnAKKyAgICBwcGNfYWx0aXZlY192Y3RzeHMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y3RzeHMKKyAgICBwcGNfYWx0aXZlY192Y3R1eHMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y3R1eHMKKyAgICBwcGNfYWx0aXZlY192Y3R6bHNiYiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y3R6bHNiYgorICAgIHBwY19hbHRpdmVjX3ZleHB0ZWZwLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZleHB0ZWZwCisgICAgcHBjX2FsdGl2ZWNfdmdiYmQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmdiYmQKKyAgICBwcGNfYWx0aXZlY192bG9nZWZwLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bG9nZWZwCisgICAgcHBjX2FsdGl2ZWNfdm1hZGRmcCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1hZGRmcAorICAgIHBwY19hbHRpdmVjX3ZtYXhmcCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtYXhmcAorICAgIHBwY19hbHRpdmVjX3ZtYXhzYiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtYXhzYgorICAgIHBwY19hbHRpdmVjX3ZtYXhzZCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtYXhzZAorICAgIHBwY19hbHRpdmVjX3ZtYXhzaCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtYXhzaAorICAgIHBwY19hbHRpdmVjX3ZtYXhzdywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtYXhzdworICAgIHBwY19hbHRpdmVjX3ZtYXh1YiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtYXh1YgorICAgIHBwY19hbHRpdmVjX3ZtYXh1ZCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtYXh1ZAorICAgIHBwY19hbHRpdmVjX3ZtYXh1aCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtYXh1aAorICAgIHBwY19hbHRpdmVjX3ZtYXh1dywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtYXh1dworICAgIHBwY19hbHRpdmVjX3ZtaGFkZHNocywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtaGFkZHNocworICAgIHBwY19hbHRpdmVjX3ZtaHJhZGRzaHMsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtaHJhZGRzaHMKKyAgICBwcGNfYWx0aXZlY192bWluZnAsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWluZnAKKyAgICBwcGNfYWx0aXZlY192bWluc2IsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWluc2IKKyAgICBwcGNfYWx0aXZlY192bWluc2QsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWluc2QKKyAgICBwcGNfYWx0aXZlY192bWluc2gsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWluc2gKKyAgICBwcGNfYWx0aXZlY192bWluc3csICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWluc3cKKyAgICBwcGNfYWx0aXZlY192bWludWIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWludWIKKyAgICBwcGNfYWx0aXZlY192bWludWQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWludWQKKyAgICBwcGNfYWx0aXZlY192bWludWgsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWludWgKKyAgICBwcGNfYWx0aXZlY192bWludXcsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWludXcKKyAgICBwcGNfYWx0aXZlY192bWxhZGR1aG0sICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWxhZGR1aG0KKyAgICBwcGNfYWx0aXZlY192bXN1bW1ibSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXN1bW1ibQorICAgIHBwY19hbHRpdmVjX3Ztc3Vtc2htLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtc3Vtc2htCisgICAgcHBjX2FsdGl2ZWNfdm1zdW1zaHMsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1zdW1zaHMKKyAgICBwcGNfYWx0aXZlY192bXN1bXVibSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXN1bXVibQorICAgIHBwY19hbHRpdmVjX3Ztc3VtdWhtLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtc3VtdWhtCisgICAgcHBjX2FsdGl2ZWNfdm1zdW11aHMsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1zdW11aHMKKyAgICBwcGNfYWx0aXZlY192bXVsZXNiLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXVsZXNiCisgICAgcHBjX2FsdGl2ZWNfdm11bGVzaCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm11bGVzaAorICAgIHBwY19hbHRpdmVjX3ZtdWxlc3csICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtdWxlc3cKKyAgICBwcGNfYWx0aXZlY192bXVsZXViLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXVsZXViCisgICAgcHBjX2FsdGl2ZWNfdm11bGV1aCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm11bGV1aAorICAgIHBwY19hbHRpdmVjX3ZtdWxldXcsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtdWxldXcKKyAgICBwcGNfYWx0aXZlY192bXVsb3NiLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXVsb3NiCisgICAgcHBjX2FsdGl2ZWNfdm11bG9zaCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm11bG9zaAorICAgIHBwY19hbHRpdmVjX3ZtdWxvc3csICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtdWxvc3cKKyAgICBwcGNfYWx0aXZlY192bXVsb3ViLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXVsb3ViCisgICAgcHBjX2FsdGl2ZWNfdm11bG91aCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm11bG91aAorICAgIHBwY19hbHRpdmVjX3ZtdWxvdXcsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtdWxvdXcKKyAgICBwcGNfYWx0aXZlY192bm1zdWJmcCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52bm1zdWJmcAorICAgIHBwY19hbHRpdmVjX3ZwZXJtLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwZXJtCisgICAgcHBjX2FsdGl2ZWNfdnBrcHgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnBrcHgKKyAgICBwcGNfYWx0aXZlY192cGtzZHNzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52cGtzZHNzCisgICAgcHBjX2FsdGl2ZWNfdnBrc2R1cywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnBrc2R1cworICAgIHBwY19hbHRpdmVjX3Zwa3Noc3MsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwa3Noc3MKKyAgICBwcGNfYWx0aXZlY192cGtzaHVzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52cGtzaHVzCisgICAgcHBjX2FsdGl2ZWNfdnBrc3dzcywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnBrc3dzcworICAgIHBwY19hbHRpdmVjX3Zwa3N3dXMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwa3N3dXMKKyAgICBwcGNfYWx0aXZlY192cGt1ZHVzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52cGt1ZHVzCisgICAgcHBjX2FsdGl2ZWNfdnBrdWh1cywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnBrdWh1cworICAgIHBwY19hbHRpdmVjX3Zwa3V3dXMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwa3V3dXMKKyAgICBwcGNfYWx0aXZlY192cHJ0eWJkLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52cHJ0eWJkCisgICAgcHBjX2FsdGl2ZWNfdnBydHlicSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnBydHlicQorICAgIHBwY19hbHRpdmVjX3ZwcnR5YncsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwcnR5YncKKyAgICBwcGNfYWx0aXZlY192cmVmcCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52cmVmcAorICAgIHBwY19hbHRpdmVjX3ZyZmltLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZyZmltCisgICAgcHBjX2FsdGl2ZWNfdnJmaW4sICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnJmaW4KKyAgICBwcGNfYWx0aXZlY192cmZpcCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52cmZpcAorICAgIHBwY19hbHRpdmVjX3ZyZml6LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZyZml6CisgICAgcHBjX2FsdGl2ZWNfdnJsYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnJsYgorICAgIHBwY19hbHRpdmVjX3ZybGQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZybGQKKyAgICBwcGNfYWx0aXZlY192cmxkbWksICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52cmxkbWkKKyAgICBwcGNfYWx0aXZlY192cmxkbm0sICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52cmxkbm0KKyAgICBwcGNfYWx0aXZlY192cmxoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52cmxoCisgICAgcHBjX2FsdGl2ZWNfdnJsdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnJsdworICAgIHBwY19hbHRpdmVjX3ZybHdtaSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZybHdtaQorICAgIHBwY19hbHRpdmVjX3ZybHdubSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZybHdubQorICAgIHBwY19hbHRpdmVjX3Zyc3FydGVmcCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZyc3FydGVmcAorICAgIHBwY19hbHRpdmVjX3ZzZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzZWwKKyAgICBwcGNfYWx0aXZlY192c2wsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c2wKKyAgICBwcGNfYWx0aXZlY192c2xiLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c2xiCisgICAgcHBjX2FsdGl2ZWNfdnNsaCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNsaAorICAgIHBwY19hbHRpdmVjX3ZzbG8sICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzbG8KKyAgICBwcGNfYWx0aXZlY192c2x2LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c2x2CisgICAgcHBjX2FsdGl2ZWNfdnNsdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNsdworICAgIHBwY19hbHRpdmVjX3ZzciwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzcgorICAgIHBwY19hbHRpdmVjX3ZzcmFiLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzcmFiCisgICAgcHBjX2FsdGl2ZWNfdnNyYWgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNyYWgKKyAgICBwcGNfYWx0aXZlY192c3JhdywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3JhdworICAgIHBwY19hbHRpdmVjX3ZzcmIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzcmIKKyAgICBwcGNfYWx0aXZlY192c3JoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3JoCisgICAgcHBjX2FsdGl2ZWNfdnNybywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNybworICAgIHBwY19hbHRpdmVjX3ZzcnYsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzcnYKKyAgICBwcGNfYWx0aXZlY192c3J3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3J3CisgICAgcHBjX2FsdGl2ZWNfdnN1YmN1cSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnN1YmN1cQorICAgIHBwY19hbHRpdmVjX3ZzdWJjdXcsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzdWJjdXcKKyAgICBwcGNfYWx0aXZlY192c3ViZWN1cSwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3ViZWN1cQorICAgIHBwY19hbHRpdmVjX3ZzdWJldXFtLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzdWJldXFtCisgICAgcHBjX2FsdGl2ZWNfdnN1YnNicywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnN1YnNicworICAgIHBwY19hbHRpdmVjX3ZzdWJzaHMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzdWJzaHMKKyAgICBwcGNfYWx0aXZlY192c3Vic3dzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3Vic3dzCisgICAgcHBjX2FsdGl2ZWNfdnN1YnVicywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnN1YnVicworICAgIHBwY19hbHRpdmVjX3ZzdWJ1aHMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzdWJ1aHMKKyAgICBwcGNfYWx0aXZlY192c3VidXdzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3VidXdzCisgICAgcHBjX2FsdGl2ZWNfdnN1bTJzd3MsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnN1bTJzd3MKKyAgICBwcGNfYWx0aXZlY192c3VtNHNicywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3VtNHNicworICAgIHBwY19hbHRpdmVjX3ZzdW00c2hzLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzdW00c2hzCisgICAgcHBjX2FsdGl2ZWNfdnN1bTR1YnMsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnN1bTR1YnMKKyAgICBwcGNfYWx0aXZlY192c3Vtc3dzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3Vtc3dzCisgICAgcHBjX2FsdGl2ZWNfdnVwa2hweCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnVwa2hweAorICAgIHBwY19hbHRpdmVjX3Z1cGtoc2IsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZ1cGtoc2IKKyAgICBwcGNfYWx0aXZlY192dXBraHNoLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52dXBraHNoCisgICAgcHBjX2FsdGl2ZWNfdnVwa2hzdywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnVwa2hzdworICAgIHBwY19hbHRpdmVjX3Z1cGtscHgsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZ1cGtscHgKKyAgICBwcGNfYWx0aXZlY192dXBrbHNiLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYWx0aXZlYy52dXBrbHNiCisgICAgcHBjX2FsdGl2ZWNfdnVwa2xzaCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnVwa2xzaAorICAgIHBwY19hbHRpdmVjX3Z1cGtsc3csICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5hbHRpdmVjLnZ1cGtsc3cKKyAgICBwcGNfYnBlcm1kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuYnBlcm1kCisgICAgcHBjX2NmZW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmNmZW5jZQorICAgIHBwY19kY2JhLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5kY2JhCisgICAgcHBjX2RjYmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmRjYmYKKyAgICBwcGNfZGNiaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuZGNiaQorICAgIHBwY19kY2JzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5kY2JzdAorICAgIHBwY19kY2J0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5kY2J0CisgICAgcHBjX2RjYnRzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmRjYnRzdAorICAgIHBwY19kY2J6LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5kY2J6CisgICAgcHBjX2RjYnpsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmRjYnpsCisgICAgcHBjX2RpdmRlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmRpdmRlCisgICAgcHBjX2RpdmRldSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmRpdmRldQorICAgIHBwY19kaXZ3ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5kaXZ3ZQorICAgIHBwY19kaXZ3ZXUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5kaXZ3ZXUKKyAgICBwcGNfZ2V0X3RleGFzciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuZ2V0LnRleGFzcgorICAgIHBwY19nZXRfdGV4YXNydSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5nZXQudGV4YXNydQorICAgIHBwY19nZXRfdGZoYXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5nZXQudGZoYXIKKyAgICBwcGNfZ2V0X3RmaWFyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuZ2V0LnRmaWFyCisgICAgcHBjX2lzX2RlY3JlbWVudGVkX2N0cl9ub256ZXJvLCAgICAgICAgICAgIC8vIGxsdm0ucHBjLmlzLmRlY3JlbWVudGVkLmN0ci5ub256ZXJvCisgICAgcHBjX2x3c3luYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLmx3c3luYworICAgIHBwY19tdGN0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5tdGN0cgorICAgIHBwY19xcHhfcXZmYWJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmYWJzCisgICAgcHBjX3FweF9xdmZhZGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZhZGQKKyAgICBwcGNfcXB4X3F2ZmFkZHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZmFkZHMKKyAgICBwcGNfcXB4X3F2ZmNmaWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZmNmaWQKKyAgICBwcGNfcXB4X3F2ZmNmaWRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZmNmaWRzCisgICAgcHBjX3FweF9xdmZjZmlkdSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZjZmlkdQorICAgIHBwY19xcHhfcXZmY2ZpZHVzLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmY2ZpZHVzCisgICAgcHBjX3FweF9xdmZjbXBlcSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZjbXBlcQorICAgIHBwY19xcHhfcXZmY21wZ3QsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmY21wZ3QKKyAgICBwcGNfcXB4X3F2ZmNtcGx0LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZmNtcGx0CisgICAgcHBjX3FweF9xdmZjcHNnbiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZjcHNnbgorICAgIHBwY19xcHhfcXZmY3RpZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmY3RpZAorICAgIHBwY19xcHhfcXZmY3RpZHUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmY3RpZHUKKyAgICBwcGNfcXB4X3F2ZmN0aWR1eiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZmN0aWR1egorICAgIHBwY19xcHhfcXZmY3RpZHosICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmY3RpZHoKKyAgICBwcGNfcXB4X3F2ZmN0aXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZmN0aXcKKyAgICBwcGNfcXB4X3F2ZmN0aXd1LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZmN0aXd1CisgICAgcHBjX3FweF9xdmZjdGl3dXosICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZjdGl3dXoKKyAgICBwcGNfcXB4X3F2ZmN0aXd6LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZmN0aXd6CisgICAgcHBjX3FweF9xdmZsb2dpY2FsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZsb2dpY2FsCisgICAgcHBjX3FweF9xdmZtYWRkLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZtYWRkCisgICAgcHBjX3FweF9xdmZtYWRkcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZtYWRkcworICAgIHBwY19xcHhfcXZmbXN1YiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmbXN1YgorICAgIHBwY19xcHhfcXZmbXN1YnMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmbXN1YnMKKyAgICBwcGNfcXB4X3F2Zm11bCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2Zm11bAorICAgIHBwY19xcHhfcXZmbXVscywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmbXVscworICAgIHBwY19xcHhfcXZmbmFicywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmbmFicworICAgIHBwY19xcHhfcXZmbmVnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmbmVnCisgICAgcHBjX3FweF9xdmZubWFkZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZubWFkZAorICAgIHBwY19xcHhfcXZmbm1hZGRzLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmbm1hZGRzCisgICAgcHBjX3FweF9xdmZubXN1YiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZubXN1YgorICAgIHBwY19xcHhfcXZmbm1zdWJzLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmbm1zdWJzCisgICAgcHBjX3FweF9xdmZwZXJtLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZwZXJtCisgICAgcHBjX3FweF9xdmZyZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZyZQorICAgIHBwY19xcHhfcXZmcmVzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmcmVzCisgICAgcHBjX3FweF9xdmZyaW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZyaW0KKyAgICBwcGNfcXB4X3F2ZnJpbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZnJpbgorICAgIHBwY19xcHhfcXZmcmlwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmcmlwCisgICAgcHBjX3FweF9xdmZyaXosICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZyaXoKKyAgICBwcGNfcXB4X3F2ZnJzcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZnJzcAorICAgIHBwY19xcHhfcXZmcnNxcnRlLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmcnNxcnRlCisgICAgcHBjX3FweF9xdmZyc3FydGVzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZyc3FydGVzCisgICAgcHBjX3FweF9xdmZzZWwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZzZWwKKyAgICBwcGNfcXB4X3F2ZnN1YiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2ZnN1YgorICAgIHBwY19xcHhfcXZmc3VicywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmc3VicworICAgIHBwY19xcHhfcXZmdHN0bmFuLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmdHN0bmFuCisgICAgcHBjX3FweF9xdmZ4bWFkZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZ4bWFkZAorICAgIHBwY19xcHhfcXZmeG1hZGRzLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmeG1hZGRzCisgICAgcHBjX3FweF9xdmZ4bXVsLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZ4bXVsCisgICAgcHBjX3FweF9xdmZ4bXVscywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZ4bXVscworICAgIHBwY19xcHhfcXZmeHhjcG5tYWRkLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZmeHhjcG5tYWRkCisgICAgcHBjX3FweF9xdmZ4eGNwbm1hZGRzLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZ4eGNwbm1hZGRzCisgICAgcHBjX3FweF9xdmZ4eG1hZGQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZ4eG1hZGQKKyAgICBwcGNfcXB4X3F2Znh4bWFkZHMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2Znh4bWFkZHMKKyAgICBwcGNfcXB4X3F2Znh4bnBtYWRkLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2Znh4bnBtYWRkCisgICAgcHBjX3FweF9xdmZ4eG5wbWFkZHMsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmZ4eG5wbWFkZHMKKyAgICBwcGNfcXB4X3F2Z3BjaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2Z3BjaQorICAgIHBwY19xcHhfcXZsZmNkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZsZmNkCisgICAgcHBjX3FweF9xdmxmY2RhLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmxmY2RhCisgICAgcHBjX3FweF9xdmxmY3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmxmY3MKKyAgICBwcGNfcXB4X3F2bGZjc2EsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2bGZjc2EKKyAgICBwcGNfcXB4X3F2bGZkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2bGZkCisgICAgcHBjX3FweF9xdmxmZGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmxmZGEKKyAgICBwcGNfcXB4X3F2bGZpd2EsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2bGZpd2EKKyAgICBwcGNfcXB4X3F2bGZpd2FhLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2bGZpd2FhCisgICAgcHBjX3FweF9xdmxmaXd6LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmxmaXd6CisgICAgcHBjX3FweF9xdmxmaXd6YSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdmxmaXd6YQorICAgIHBwY19xcHhfcXZsZnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZsZnMKKyAgICBwcGNfcXB4X3F2bGZzYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2bGZzYQorICAgIHBwY19xcHhfcXZscGNsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZscGNsZAorICAgIHBwY19xcHhfcXZscGNscywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZscGNscworICAgIHBwY19xcHhfcXZscGNyZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZscGNyZAorICAgIHBwY19xcHhfcXZscGNycywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZscGNycworICAgIHBwY19xcHhfcXZzdGZjZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZzdGZjZAorICAgIHBwY19xcHhfcXZzdGZjZGEsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5xcHgucXZzdGZjZGEKKyAgICBwcGNfcXB4X3F2c3RmY3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2c3RmY3MKKyAgICBwcGNfcXB4X3F2c3RmY3NhLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2c3RmY3NhCisgICAgcHBjX3FweF9xdnN0ZmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdnN0ZmQKKyAgICBwcGNfcXB4X3F2c3RmZGEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2c3RmZGEKKyAgICBwcGNfcXB4X3F2c3RmaXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2c3RmaXcKKyAgICBwcGNfcXB4X3F2c3RmaXdhLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2c3RmaXdhCisgICAgcHBjX3FweF9xdnN0ZnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnFweC5xdnN0ZnMKKyAgICBwcGNfcXB4X3F2c3Rmc2EsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMucXB4LnF2c3Rmc2EKKyAgICBwcGNfc2V0X3RleGFzciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuc2V0LnRleGFzcgorICAgIHBwY19zZXRfdGV4YXNydSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5zZXQudGV4YXNydQorICAgIHBwY19zZXRfdGZoYXIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy5zZXQudGZoYXIKKyAgICBwcGNfc2V0X3RmaWFyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMuc2V0LnRmaWFyCisgICAgcHBjX3N5bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnN5bmMKKyAgICBwcGNfdGFib3J0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudGFib3J0CisgICAgcHBjX3RhYm9ydGRjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnRhYm9ydGRjCisgICAgcHBjX3RhYm9ydGRjaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnRhYm9ydGRjaQorICAgIHBwY190YWJvcnR3YywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy50YWJvcnR3YworICAgIHBwY190YWJvcnR3Y2ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy50YWJvcnR3Y2kKKyAgICBwcGNfdGJlZ2luLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudGJlZ2luCisgICAgcHBjX3RjaGVjaywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnRjaGVjaworICAgIHBwY190ZW5kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy50ZW5kCisgICAgcHBjX3RlbmRhbGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnRlbmRhbGwKKyAgICBwcGNfdHJlY2hrcHQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudHJlY2hrcHQKKyAgICBwcGNfdHJlY2xhaW0sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudHJlY2xhaW0KKyAgICBwcGNfdHJlc3VtZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudHJlc3VtZQorICAgIHBwY190c3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy50c3IKKyAgICBwcGNfdHN1c3BlbmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudHN1c3BlbmQKKyAgICBwcGNfdHRlc3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudHRlc3QKKyAgICBwcGNfdnN4X2x4dmQyeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lmx4dmQyeAorICAgIHBwY192c3hfbHh2ZDJ4X2JlLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gubHh2ZDJ4LmJlCisgICAgcHBjX3ZzeF9seHZsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC5seHZsCisgICAgcHBjX3ZzeF9seHZsbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC5seHZsbAorICAgIHBwY192c3hfbHh2dzR4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gubHh2dzR4CisgICAgcHBjX3ZzeF9seHZ3NHhfYmUsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC5seHZ3NHguYmUKKyAgICBwcGNfdnN4X3N0eHZkMngsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4LnN0eHZkMngKKyAgICBwcGNfdnN4X3N0eHZkMnhfYmUsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4LnN0eHZkMnguYmUKKyAgICBwcGNfdnN4X3N0eHZsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4LnN0eHZsCisgICAgcHBjX3ZzeF9zdHh2bGwsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC5zdHh2bGwKKyAgICBwcGNfdnN4X3N0eHZ3NHgsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4LnN0eHZ3NHgKKyAgICBwcGNfdnN4X3N0eHZ3NHhfYmUsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4LnN0eHZ3NHguYmUKKyAgICBwcGNfdnN4X3hzbWF4ZHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4LnhzbWF4ZHAKKyAgICBwcGNfdnN4X3hzbWluZHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4LnhzbWluZHAKKyAgICBwcGNfdnN4X3h2Y21wZXFkcCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2Y21wZXFkcAorICAgIHBwY192c3hfeHZjbXBlcWRwX3AsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZjbXBlcWRwLnAKKyAgICBwcGNfdnN4X3h2Y21wZXFzcCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2Y21wZXFzcAorICAgIHBwY192c3hfeHZjbXBlcXNwX3AsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZjbXBlcXNwLnAKKyAgICBwcGNfdnN4X3h2Y21wZ2VkcCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2Y21wZ2VkcAorICAgIHBwY192c3hfeHZjbXBnZWRwX3AsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZjbXBnZWRwLnAKKyAgICBwcGNfdnN4X3h2Y21wZ2VzcCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2Y21wZ2VzcAorICAgIHBwY192c3hfeHZjbXBnZXNwX3AsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZjbXBnZXNwLnAKKyAgICBwcGNfdnN4X3h2Y21wZ3RkcCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2Y21wZ3RkcAorICAgIHBwY192c3hfeHZjbXBndGRwX3AsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZjbXBndGRwLnAKKyAgICBwcGNfdnN4X3h2Y21wZ3RzcCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2Y21wZ3RzcAorICAgIHBwY192c3hfeHZjbXBndHNwX3AsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZjbXBndHNwLnAKKyAgICBwcGNfdnN4X3h2Y3ZkcHNwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2Y3ZkcHNwCisgICAgcHBjX3ZzeF94dmN2ZHBzeHdzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dmN2ZHBzeHdzCisgICAgcHBjX3ZzeF94dmN2ZHB1eHdzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dmN2ZHB1eHdzCisgICAgcHBjX3ZzeF94dmN2aHBzcCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dmN2aHBzcAorICAgIHBwY192c3hfeHZjdnNwZHAsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZjdnNwZHAKKyAgICBwcGNfdnN4X3h2Y3ZzcGhwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2Y3ZzcGhwCisgICAgcHBjX3ZzeF94dmN2c3hkc3AsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dmN2c3hkc3AKKyAgICBwcGNfdnN4X3h2Y3ZzeHdkcCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2Y3ZzeHdkcAorICAgIHBwY192c3hfeHZjdnV4ZHNwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZjdnV4ZHNwCisgICAgcHBjX3ZzeF94dmN2dXh3ZHAsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dmN2dXh3ZHAKKyAgICBwcGNfdnN4X3h2ZGl2ZHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2ZGl2ZHAKKyAgICBwcGNfdnN4X3h2ZGl2c3AsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2ZGl2c3AKKyAgICBwcGNfdnN4X3h2aWV4cGRwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2aWV4cGRwCisgICAgcHBjX3ZzeF94dmlleHBzcCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dmlleHBzcAorICAgIHBwY192c3hfeHZtYXhkcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZtYXhkcAorICAgIHBwY192c3hfeHZtYXhzcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZtYXhzcAorICAgIHBwY192c3hfeHZtaW5kcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZtaW5kcAorICAgIHBwY192c3hfeHZtaW5zcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZtaW5zcAorICAgIHBwY192c3hfeHZyZHBpcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZyZHBpcAorICAgIHBwY192c3hfeHZyZWRwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZyZWRwCisgICAgcHBjX3ZzeF94dnJlc3AsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dnJlc3AKKyAgICBwcGNfdnN4X3h2cnNwaXAsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2cnNwaXAKKyAgICBwcGNfdnN4X3h2cnNxcnRlZHAsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2cnNxcnRlZHAKKyAgICBwcGNfdnN4X3h2cnNxcnRlc3AsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2cnNxcnRlc3AKKyAgICBwcGNfdnN4X3h2dHN0ZGNkcCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2dHN0ZGNkcAorICAgIHBwY192c3hfeHZ0c3RkY3NwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZ0c3RkY3NwCisgICAgcHBjX3ZzeF94dnhleHBkcCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dnhleHBkcAorICAgIHBwY192c3hfeHZ4ZXhwc3AsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHZ4ZXhwc3AKKyAgICBwcGNfdnN4X3h2eHNpZ2RwLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh2eHNpZ2RwCisgICAgcHBjX3ZzeF94dnhzaWdzcCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucHBjLnZzeC54dnhzaWdzcAorICAgIHBwY192c3hfeHhleHRyYWN0dXcsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHhleHRyYWN0dXcKKyAgICBwcGNfdnN4X3h4aW5zZXJ0dywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5wcGMudnN4Lnh4aW5zZXJ0dworICAgIHBwY192c3hfeHhsZXF2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnBwYy52c3gueHhsZXF2CisgICAgcjYwMF9jdWJlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucjYwMC5jdWJlCisgICAgcjYwMF9ncm91cF9iYXJyaWVyLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucjYwMC5ncm91cC5iYXJyaWVyCisgICAgcjYwMF9pbXBsaWNpdGFyZ19wdHIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucjYwMC5pbXBsaWNpdGFyZy5wdHIKKyAgICByNjAwX3JhdF9zdG9yZV90eXBlZCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5yNjAwLnJhdC5zdG9yZS50eXBlZAorICAgIHI2MDBfcmVhZF9nbG9iYWxfc2l6ZV94LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnI2MDAucmVhZC5nbG9iYWwuc2l6ZS54CisgICAgcjYwMF9yZWFkX2dsb2JhbF9zaXplX3ksICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucjYwMC5yZWFkLmdsb2JhbC5zaXplLnkKKyAgICByNjAwX3JlYWRfZ2xvYmFsX3NpemVfeiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5yNjAwLnJlYWQuZ2xvYmFsLnNpemUuegorICAgIHI2MDBfcmVhZF9sb2NhbF9zaXplX3gsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnI2MDAucmVhZC5sb2NhbC5zaXplLngKKyAgICByNjAwX3JlYWRfbG9jYWxfc2l6ZV95LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5yNjAwLnJlYWQubG9jYWwuc2l6ZS55CisgICAgcjYwMF9yZWFkX2xvY2FsX3NpemVfeiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucjYwMC5yZWFkLmxvY2FsLnNpemUuegorICAgIHI2MDBfcmVhZF9uZ3JvdXBzX3gsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnI2MDAucmVhZC5uZ3JvdXBzLngKKyAgICByNjAwX3JlYWRfbmdyb3Vwc195LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5yNjAwLnJlYWQubmdyb3Vwcy55CisgICAgcjYwMF9yZWFkX25ncm91cHNfeiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucjYwMC5yZWFkLm5ncm91cHMuegorICAgIHI2MDBfcmVhZF90Z2lkX3gsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnI2MDAucmVhZC50Z2lkLngKKyAgICByNjAwX3JlYWRfdGdpZF95LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5yNjAwLnJlYWQudGdpZC55CisgICAgcjYwMF9yZWFkX3RnaWRfeiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucjYwMC5yZWFkLnRnaWQuegorICAgIHI2MDBfcmVhZF90aWRpZ194LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnI2MDAucmVhZC50aWRpZy54CisgICAgcjYwMF9yZWFkX3RpZGlnX3ksICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ucjYwMC5yZWFkLnRpZGlnLnkKKyAgICByNjAwX3JlYWRfdGlkaWdfeiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5yNjAwLnJlYWQudGlkaWcuegorICAgIHI2MDBfcmVjaXBzcXJ0X2NsYW1wZWQsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnI2MDAucmVjaXBzcXJ0LmNsYW1wZWQKKyAgICByNjAwX3JlY2lwc3FydF9pZWVlLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5yNjAwLnJlY2lwc3FydC5pZWVlCisgICAgczM5MF9lZnBjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC5lZnBjCisgICAgczM5MF9ldG5kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC5ldG5kCisgICAgczM5MF9sY2JiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC5sY2JiCisgICAgczM5MF9udHN0ZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC5udHN0ZworICAgIHMzOTBfcHBhX3R4YXNzaXN0LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAucHBhLnR4YXNzaXN0CisgICAgczM5MF9zZnBjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC5zZnBjCisgICAgczM5MF90YWJvcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC50YWJvcnQKKyAgICBzMzkwX3RiZWdpbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnRiZWdpbgorICAgIHMzOTBfdGJlZ2luX25vZmxvYXQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudGJlZ2luLm5vZmxvYXQKKyAgICBzMzkwX3RiZWdpbmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnRiZWdpbmMKKyAgICBzMzkwX3RkYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnRkYworICAgIHMzOTBfdGVuZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudGVuZAorICAgIHMzOTBfdmFjY2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmFjY2IKKyAgICBzMzkwX3ZhY2NjcSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZhY2NjcQorICAgIHMzOTBfdmFjY2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmFjY2YKKyAgICBzMzkwX3ZhY2NnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZhY2NnCisgICAgczM5MF92YWNjaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52YWNjaAorICAgIHMzOTBfdmFjY3EsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmFjY3EKKyAgICBzMzkwX3ZhY3EsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZhY3EKKyAgICBzMzkwX3ZhcSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZhcQorICAgIHMzOTBfdmF2Z2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmF2Z2IKKyAgICBzMzkwX3ZhdmdmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZhdmdmCisgICAgczM5MF92YXZnZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52YXZnZworICAgIHMzOTBfdmF2Z2gsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmF2Z2gKKyAgICBzMzkwX3ZhdmdsYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZhdmdsYgorICAgIHMzOTBfdmF2Z2xmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmF2Z2xmCisgICAgczM5MF92YXZnbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52YXZnbGcKKyAgICBzMzkwX3ZhdmdsaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZhdmdsaAorICAgIHMzOTBfdmJwZXJtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmJwZXJtCisgICAgczM5MF92Y2VxYnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52Y2VxYnMKKyAgICBzMzkwX3ZjZXFmcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZjZXFmcworICAgIHMzOTBfdmNlcWdzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmNlcWdzCisgICAgczM5MF92Y2VxaHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52Y2VxaHMKKyAgICBzMzkwX3ZjaGJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZjaGJzCisgICAgczM5MF92Y2hmcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52Y2hmcworICAgIHMzOTBfdmNoZ3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmNoZ3MKKyAgICBzMzkwX3ZjaGhzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZjaGhzCisgICAgczM5MF92Y2hsYnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52Y2hsYnMKKyAgICBzMzkwX3ZjaGxmcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZjaGxmcworICAgIHMzOTBfdmNobGdzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmNobGdzCisgICAgczM5MF92Y2hsaHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52Y2hsaHMKKyAgICBzMzkwX3Zja3NtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZja3NtCisgICAgczM5MF92ZXJpbWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZXJpbWIKKyAgICBzMzkwX3ZlcmltZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZlcmltZgorICAgIHMzOTBfdmVyaW1nLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmVyaW1nCisgICAgczM5MF92ZXJpbWgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZXJpbWgKKyAgICBzMzkwX3ZlcmxsYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZlcmxsYgorICAgIHMzOTBfdmVybGxmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmVybGxmCisgICAgczM5MF92ZXJsbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZXJsbGcKKyAgICBzMzkwX3ZlcmxsaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZlcmxsaAorICAgIHMzOTBfdmVybGx2YiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmVybGx2YgorICAgIHMzOTBfdmVybGx2ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmVybGx2ZgorICAgIHMzOTBfdmVybGx2ZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmVybGx2ZworICAgIHMzOTBfdmVybGx2aCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmVybGx2aAorICAgIHMzOTBfdmZhZWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZhZWIKKyAgICBzMzkwX3ZmYWVicywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmYWVicworICAgIHMzOTBfdmZhZWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZhZWYKKyAgICBzMzkwX3ZmYWVmcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmYWVmcworICAgIHMzOTBfdmZhZWgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZhZWgKKyAgICBzMzkwX3ZmYWVocywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmYWVocworICAgIHMzOTBfdmZhZXpiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZhZXpiCisgICAgczM5MF92ZmFlemJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmFlemJzCisgICAgczM5MF92ZmFlemYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmFlemYKKyAgICBzMzkwX3ZmYWV6ZnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmYWV6ZnMKKyAgICBzMzkwX3ZmYWV6aCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmYWV6aAorICAgIHMzOTBfdmZhZXpocywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZhZXpocworICAgIHMzOTBfdmZjZWRicywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZjZWRicworICAgIHMzOTBfdmZjZXNicywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZjZXNicworICAgIHMzOTBfdmZjaGRicywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZjaGRicworICAgIHMzOTBfdmZjaGVkYnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZjaGVkYnMKKyAgICBzMzkwX3ZmY2hlc2JzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmY2hlc2JzCisgICAgczM5MF92ZmNoc2JzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmNoc2JzCisgICAgczM5MF92ZmVlYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmVlYgorICAgIHMzOTBfdmZlZWJzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZlZWJzCisgICAgczM5MF92ZmVlZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmVlZgorICAgIHMzOTBfdmZlZWZzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZlZWZzCisgICAgczM5MF92ZmVlaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmVlaAorICAgIHMzOTBfdmZlZWhzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZlZWhzCisgICAgczM5MF92ZmVlemIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmVlemIKKyAgICBzMzkwX3ZmZWV6YnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmZWV6YnMKKyAgICBzMzkwX3ZmZWV6ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmZWV6ZgorICAgIHMzOTBfdmZlZXpmcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZlZXpmcworICAgIHMzOTBfdmZlZXpoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZlZXpoCisgICAgczM5MF92ZmVlemhzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmVlemhzCisgICAgczM5MF92ZmVuZWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmVuZWIKKyAgICBzMzkwX3ZmZW5lYnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmZW5lYnMKKyAgICBzMzkwX3ZmZW5lZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmZW5lZgorICAgIHMzOTBfdmZlbmVmcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZlbmVmcworICAgIHMzOTBfdmZlbmVoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZlbmVoCisgICAgczM5MF92ZmVuZWhzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmVuZWhzCisgICAgczM5MF92ZmVuZXpiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmVuZXpiCisgICAgczM5MF92ZmVuZXpicywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmVuZXpicworICAgIHMzOTBfdmZlbmV6ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZlbmV6ZgorICAgIHMzOTBfdmZlbmV6ZnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZlbmV6ZnMKKyAgICBzMzkwX3ZmZW5lemgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmZW5lemgKKyAgICBzMzkwX3ZmZW5lemhzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmZW5lemhzCisgICAgczM5MF92ZmlkYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52ZmlkYgorICAgIHMzOTBfdmZpc2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmZpc2IKKyAgICBzMzkwX3ZmbWF4ZGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmbWF4ZGIKKyAgICBzMzkwX3ZmbWF4c2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmbWF4c2IKKyAgICBzMzkwX3ZmbWluZGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmbWluZGIKKyAgICBzMzkwX3ZmbWluc2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmbWluc2IKKyAgICBzMzkwX3ZmdGNpZGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmdGNpZGIKKyAgICBzMzkwX3ZmdGNpc2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZmdGNpc2IKKyAgICBzMzkwX3ZnZm1hYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZnZm1hYgorICAgIHMzOTBfdmdmbWFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmdmbWFmCisgICAgczM5MF92Z2ZtYWcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52Z2ZtYWcKKyAgICBzMzkwX3ZnZm1haCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZnZm1haAorICAgIHMzOTBfdmdmbWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmdmbWIKKyAgICBzMzkwX3ZnZm1mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZnZm1mCisgICAgczM5MF92Z2ZtZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52Z2ZtZworICAgIHMzOTBfdmdmbWgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmdmbWgKKyAgICBzMzkwX3Zpc3RyYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZpc3RyYgorICAgIHMzOTBfdmlzdHJicywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmlzdHJicworICAgIHMzOTBfdmlzdHJmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmlzdHJmCisgICAgczM5MF92aXN0cmZzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52aXN0cmZzCisgICAgczM5MF92aXN0cmgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52aXN0cmgKKyAgICBzMzkwX3Zpc3RyaHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZpc3RyaHMKKyAgICBzMzkwX3ZsYmIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZsYmIKKyAgICBzMzkwX3ZsbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZsbAorICAgIHMzOTBfdmxybCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudmxybAorICAgIHMzOTBfdm1hZWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1hZWIKKyAgICBzMzkwX3ZtYWVmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtYWVmCisgICAgczM5MF92bWFlaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52bWFlaAorICAgIHMzOTBfdm1haGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1haGIKKyAgICBzMzkwX3ZtYWhmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtYWhmCisgICAgczM5MF92bWFoaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52bWFoaAorICAgIHMzOTBfdm1hbGViLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1hbGViCisgICAgczM5MF92bWFsZWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52bWFsZWYKKyAgICBzMzkwX3ZtYWxlaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtYWxlaAorICAgIHMzOTBfdm1hbGhiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1hbGhiCisgICAgczM5MF92bWFsaGYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52bWFsaGYKKyAgICBzMzkwX3ZtYWxoaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtYWxoaAorICAgIHMzOTBfdm1hbG9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1hbG9iCisgICAgczM5MF92bWFsb2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52bWFsb2YKKyAgICBzMzkwX3ZtYWxvaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtYWxvaAorICAgIHMzOTBfdm1hb2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1hb2IKKyAgICBzMzkwX3ZtYW9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtYW9mCisgICAgczM5MF92bWFvaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52bWFvaAorICAgIHMzOTBfdm1lYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1lYgorICAgIHMzOTBfdm1lZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1lZgorICAgIHMzOTBfdm1laCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1laAorICAgIHMzOTBfdm1oYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1oYgorICAgIHMzOTBfdm1oZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1oZgorICAgIHMzOTBfdm1oaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1oaAorICAgIHMzOTBfdm1sZWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1sZWIKKyAgICBzMzkwX3ZtbGVmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtbGVmCisgICAgczM5MF92bWxlaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52bWxlaAorICAgIHMzOTBfdm1saGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1saGIKKyAgICBzMzkwX3ZtbGhmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtbGhmCisgICAgczM5MF92bWxoaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52bWxoaAorICAgIHMzOTBfdm1sb2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1sb2IKKyAgICBzMzkwX3ZtbG9mLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZtbG9mCisgICAgczM5MF92bWxvaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52bWxvaAorICAgIHMzOTBfdm1vYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1vYgorICAgIHMzOTBfdm1vZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1vZgorICAgIHMzOTBfdm1vaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1vaAorICAgIHMzOTBfdm1zbGcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudm1zbGcKKyAgICBzMzkwX3ZwZGksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZwZGkKKyAgICBzMzkwX3ZwZXJtLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZwZXJtCisgICAgczM5MF92cGtsc2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52cGtsc2YKKyAgICBzMzkwX3Zwa2xzZnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZwa2xzZnMKKyAgICBzMzkwX3Zwa2xzZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZwa2xzZworICAgIHMzOTBfdnBrbHNncywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnBrbHNncworICAgIHMzOTBfdnBrbHNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnBrbHNoCisgICAgczM5MF92cGtsc2hzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52cGtsc2hzCisgICAgczM5MF92cGtzZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52cGtzZgorICAgIHMzOTBfdnBrc2ZzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnBrc2ZzCisgICAgczM5MF92cGtzZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52cGtzZworICAgIHMzOTBfdnBrc2dzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnBrc2dzCisgICAgczM5MF92cGtzaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52cGtzaAorICAgIHMzOTBfdnBrc2hzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnBrc2hzCisgICAgczM5MF92c2JjYmlxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c2JjYmlxCisgICAgczM5MF92c2JpcSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c2JpcQorICAgIHMzOTBfdnNjYmliLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnNjYmliCisgICAgczM5MF92c2NiaWYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c2NiaWYKKyAgICBzMzkwX3ZzY2JpZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzY2JpZworICAgIHMzOTBfdnNjYmloLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnNjYmloCisgICAgczM5MF92c2NiaXEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c2NiaXEKKyAgICBzMzkwX3ZzbCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzbAorICAgIHMzOTBfdnNsYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnNsYgorICAgIHMzOTBfdnNsZGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnNsZGIKKyAgICBzMzkwX3ZzcSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzcQorICAgIHMzOTBfdnNyYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnNyYQorICAgIHMzOTBfdnNyYWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnNyYWIKKyAgICBzMzkwX3ZzcmwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzcmwKKyAgICBzMzkwX3ZzcmxiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzcmxiCisgICAgczM5MF92c3RsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c3RsCisgICAgczM5MF92c3RyY2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c3RyY2IKKyAgICBzMzkwX3ZzdHJjYnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzdHJjYnMKKyAgICBzMzkwX3ZzdHJjZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzdHJjZgorICAgIHMzOTBfdnN0cmNmcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnN0cmNmcworICAgIHMzOTBfdnN0cmNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnN0cmNoCisgICAgczM5MF92c3RyY2hzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c3RyY2hzCisgICAgczM5MF92c3RyY3piLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c3RyY3piCisgICAgczM5MF92c3RyY3picywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c3RyY3picworICAgIHMzOTBfdnN0cmN6ZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnN0cmN6ZgorICAgIHMzOTBfdnN0cmN6ZnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnN0cmN6ZnMKKyAgICBzMzkwX3ZzdHJjemgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzdHJjemgKKyAgICBzMzkwX3ZzdHJjemhzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzdHJjemhzCisgICAgczM5MF92c3RybCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c3RybAorICAgIHMzOTBfdnN1bWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnN1bWIKKyAgICBzMzkwX3ZzdW1nZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZzdW1nZgorICAgIHMzOTBfdnN1bWdoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnN1bWdoCisgICAgczM5MF92c3VtaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c3VtaAorICAgIHMzOTBfdnN1bXFmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnN1bXFmCisgICAgczM5MF92c3VtcWcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52c3VtcWcKKyAgICBzMzkwX3Z0bSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZ0bQorICAgIHMzOTBfdnVwaGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnVwaGIKKyAgICBzMzkwX3Z1cGhmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZ1cGhmCisgICAgczM5MF92dXBoaCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52dXBoaAorICAgIHMzOTBfdnVwbGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnVwbGIKKyAgICBzMzkwX3Z1cGxmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZ1cGxmCisgICAgczM5MF92dXBsaGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52dXBsaGIKKyAgICBzMzkwX3Z1cGxoZiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZ1cGxoZgorICAgIHMzOTBfdnVwbGhoLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnVwbGhoCisgICAgczM5MF92dXBsaHcsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52dXBsaHcKKyAgICBzMzkwX3Z1cGxsYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS5zMzkwLnZ1cGxsYgorICAgIHMzOTBfdnVwbGxmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnMzOTAudnVwbGxmCisgICAgczM5MF92dXBsbGgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0uczM5MC52dXBsbGgKKyAgICB3YXNtX2N1cnJlbnRfbWVtb3J5LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS53YXNtLmN1cnJlbnQubWVtb3J5CisgICAgd2FzbV9nZXRfZWhzZWxlY3RvciwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ud2FzbS5nZXQuZWhzZWxlY3RvcgorICAgIHdhc21fZ2V0X2V4Y2VwdGlvbiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLndhc20uZ2V0LmV4Y2VwdGlvbgorICAgIHdhc21fZ3Jvd19tZW1vcnksICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLndhc20uZ3Jvdy5tZW1vcnkKKyAgICB3YXNtX21lbV9ncm93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS53YXNtLm1lbS5ncm93CisgICAgd2FzbV9tZW1fc2l6ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ud2FzbS5tZW0uc2l6ZQorICAgIHdhc21fcmV0aHJvdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLndhc20ucmV0aHJvdworICAgIHdhc21fdGhyb3csICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLndhc20udGhyb3cKKyAgICB4ODZfM2Rub3dfcGF2Z3VzYiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuM2Rub3cucGF2Z3VzYgorICAgIHg4Nl8zZG5vd19wZjJpZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vdy5wZjJpZAorICAgIHg4Nl8zZG5vd19wZmFjYywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vdy5wZmFjYworICAgIHg4Nl8zZG5vd19wZmFkZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vdy5wZmFkZAorICAgIHg4Nl8zZG5vd19wZmNtcGVxLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vdy5wZmNtcGVxCisgICAgeDg2XzNkbm93X3BmY21wZ2UsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LjNkbm93LnBmY21wZ2UKKyAgICB4ODZfM2Rub3dfcGZjbXBndCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuM2Rub3cucGZjbXBndAorICAgIHg4Nl8zZG5vd19wZm1heCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vdy5wZm1heAorICAgIHg4Nl8zZG5vd19wZm1pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vdy5wZm1pbgorICAgIHg4Nl8zZG5vd19wZm11bCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vdy5wZm11bAorICAgIHg4Nl8zZG5vd19wZnJjcCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vdy5wZnJjcAorICAgIHg4Nl8zZG5vd19wZnJjcGl0MSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vdy5wZnJjcGl0MQorICAgIHg4Nl8zZG5vd19wZnJjcGl0MiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vdy5wZnJjcGl0MgorICAgIHg4Nl8zZG5vd19wZnJzcWl0MSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vdy5wZnJzcWl0MQorICAgIHg4Nl8zZG5vd19wZnJzcXJ0LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vdy5wZnJzcXJ0CisgICAgeDg2XzNkbm93X3Bmc3ViLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LjNkbm93LnBmc3ViCisgICAgeDg2XzNkbm93X3Bmc3ViciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LjNkbm93LnBmc3VicgorICAgIHg4Nl8zZG5vd19waTJmZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vdy5waTJmZAorICAgIHg4Nl8zZG5vd19wbXVsaHJ3LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vdy5wbXVsaHJ3CisgICAgeDg2XzNkbm93YV9wZjJpdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LjNkbm93YS5wZjJpdworICAgIHg4Nl8zZG5vd2FfcGZuYWNjLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vd2EucGZuYWNjCisgICAgeDg2XzNkbm93YV9wZnBuYWNjLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LjNkbm93YS5wZnBuYWNjCisgICAgeDg2XzNkbm93YV9waTJmdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LjNkbm93YS5waTJmdworICAgIHg4Nl8zZG5vd2FfcHN3YXBkLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni4zZG5vd2EucHN3YXBkCisgICAgeDg2X2FkZGNhcnJ5X3UzMiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmFkZGNhcnJ5LnUzMgorICAgIHg4Nl9hZGRjYXJyeV91NjQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hZGRjYXJyeS51NjQKKyAgICB4ODZfYWRkY2Fycnl4X3UzMiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYWRkY2Fycnl4LnUzMgorICAgIHg4Nl9hZGRjYXJyeXhfdTY0LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hZGRjYXJyeXgudTY0CisgICAgeDg2X2Flc25pX2Flc2RlYywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmFlc25pLmFlc2RlYworICAgIHg4Nl9hZXNuaV9hZXNkZWNfMjU2LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hZXNuaS5hZXNkZWMuMjU2CisgICAgeDg2X2Flc25pX2Flc2RlY181MTIsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmFlc25pLmFlc2RlYy41MTIKKyAgICB4ODZfYWVzbmlfYWVzZGVjbGFzdCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYWVzbmkuYWVzZGVjbGFzdAorICAgIHg4Nl9hZXNuaV9hZXNkZWNsYXN0XzI1NiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hZXNuaS5hZXNkZWNsYXN0LjI1NgorICAgIHg4Nl9hZXNuaV9hZXNkZWNsYXN0XzUxMiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hZXNuaS5hZXNkZWNsYXN0LjUxMgorICAgIHg4Nl9hZXNuaV9hZXNlbmMsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hZXNuaS5hZXNlbmMKKyAgICB4ODZfYWVzbmlfYWVzZW5jXzI1NiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYWVzbmkuYWVzZW5jLjI1NgorICAgIHg4Nl9hZXNuaV9hZXNlbmNfNTEyLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hZXNuaS5hZXNlbmMuNTEyCisgICAgeDg2X2Flc25pX2Flc2VuY2xhc3QsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmFlc25pLmFlc2VuY2xhc3QKKyAgICB4ODZfYWVzbmlfYWVzZW5jbGFzdF8yNTYsICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYWVzbmkuYWVzZW5jbGFzdC4yNTYKKyAgICB4ODZfYWVzbmlfYWVzZW5jbGFzdF81MTIsICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYWVzbmkuYWVzZW5jbGFzdC41MTIKKyAgICB4ODZfYWVzbmlfYWVzaW1jLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYWVzbmkuYWVzaW1jCisgICAgeDg2X2Flc25pX2Flc2tleWdlbmFzc2lzdCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmFlc25pLmFlc2tleWdlbmFzc2lzdAorICAgIHg4Nl9hdnhfYWRkc3ViX3BkXzI1NiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdnguYWRkc3ViLnBkLjI1NgorICAgIHg4Nl9hdnhfYWRkc3ViX3BzXzI1NiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdnguYWRkc3ViLnBzLjI1NgorICAgIHg4Nl9hdnhfYmxlbmR2X3BkXzI1NiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdnguYmxlbmR2LnBkLjI1NgorICAgIHg4Nl9hdnhfYmxlbmR2X3BzXzI1NiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdnguYmxlbmR2LnBzLjI1NgorICAgIHg4Nl9hdnhfY21wX3BkXzI1NiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdnguY21wLnBkLjI1NgorICAgIHg4Nl9hdnhfY21wX3BzXzI1NiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdnguY21wLnBzLjI1NgorICAgIHg4Nl9hdnhfY3Z0X3BkMl9wc18yNTYsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdnguY3Z0LnBkMi5wcy4yNTYKKyAgICB4ODZfYXZ4X2N2dF9wZDJkcV8yNTYsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LmN2dC5wZDJkcS4yNTYKKyAgICB4ODZfYXZ4X2N2dF9wczJkcV8yNTYsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LmN2dC5wczJkcS4yNTYKKyAgICB4ODZfYXZ4X2N2dGRxMl9wc18yNTYsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LmN2dGRxMi5wcy4yNTYKKyAgICB4ODZfYXZ4X2N2dHRfcGQyZHFfMjU2LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LmN2dHQucGQyZHEuMjU2CisgICAgeDg2X2F2eF9jdnR0X3BzMmRxXzI1NiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5jdnR0LnBzMmRxLjI1NgorICAgIHg4Nl9hdnhfZHBfcHNfMjU2LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdnguZHAucHMuMjU2CisgICAgeDg2X2F2eF9oYWRkX3BkXzI1NiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5oYWRkLnBkLjI1NgorICAgIHg4Nl9hdnhfaGFkZF9wc18yNTYsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdnguaGFkZC5wcy4yNTYKKyAgICB4ODZfYXZ4X2hzdWJfcGRfMjU2LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LmhzdWIucGQuMjU2CisgICAgeDg2X2F2eF9oc3ViX3BzXzI1NiwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5oc3ViLnBzLjI1NgorICAgIHg4Nl9hdnhfbGR1X2RxXzI1NiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngubGR1LmRxLjI1NgorICAgIHg4Nl9hdnhfbWFza2xvYWRfcGQsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngubWFza2xvYWQucGQKKyAgICB4ODZfYXZ4X21hc2tsb2FkX3BkXzI1NiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Lm1hc2tsb2FkLnBkLjI1NgorICAgIHg4Nl9hdnhfbWFza2xvYWRfcHMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngubWFza2xvYWQucHMKKyAgICB4ODZfYXZ4X21hc2tsb2FkX3BzXzI1NiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Lm1hc2tsb2FkLnBzLjI1NgorICAgIHg4Nl9hdnhfbWFza3N0b3JlX3BkLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngubWFza3N0b3JlLnBkCisgICAgeDg2X2F2eF9tYXNrc3RvcmVfcGRfMjU2LCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5tYXNrc3RvcmUucGQuMjU2CisgICAgeDg2X2F2eF9tYXNrc3RvcmVfcHMsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5tYXNrc3RvcmUucHMKKyAgICB4ODZfYXZ4X21hc2tzdG9yZV9wc18yNTYsICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Lm1hc2tzdG9yZS5wcy4yNTYKKyAgICB4ODZfYXZ4X21heF9wZF8yNTYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Lm1heC5wZC4yNTYKKyAgICB4ODZfYXZ4X21heF9wc18yNTYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Lm1heC5wcy4yNTYKKyAgICB4ODZfYXZ4X21pbl9wZF8yNTYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Lm1pbi5wZC4yNTYKKyAgICB4ODZfYXZ4X21pbl9wc18yNTYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Lm1pbi5wcy4yNTYKKyAgICB4ODZfYXZ4X21vdm1za19wZF8yNTYsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Lm1vdm1zay5wZC4yNTYKKyAgICB4ODZfYXZ4X21vdm1za19wc18yNTYsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Lm1vdm1zay5wcy4yNTYKKyAgICB4ODZfYXZ4X3B0ZXN0Y18yNTYsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LnB0ZXN0Yy4yNTYKKyAgICB4ODZfYXZ4X3B0ZXN0bnpjXzI1NiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LnB0ZXN0bnpjLjI1NgorICAgIHg4Nl9hdnhfcHRlc3R6XzI1NiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngucHRlc3R6LjI1NgorICAgIHg4Nl9hdnhfcmNwX3BzXzI1NiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngucmNwLnBzLjI1NgorICAgIHg4Nl9hdnhfcm91bmRfcGRfMjU2LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngucm91bmQucGQuMjU2CisgICAgeDg2X2F2eF9yb3VuZF9wc18yNTYsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC5yb3VuZC5wcy4yNTYKKyAgICB4ODZfYXZ4X3JzcXJ0X3BzXzI1NiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LnJzcXJ0LnBzLjI1NgorICAgIHg4Nl9hdnhfc3FydF9wZF8yNTYsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdnguc3FydC5wZC4yNTYKKyAgICB4ODZfYXZ4X3NxcnRfcHNfMjU2LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LnNxcnQucHMuMjU2CisgICAgeDg2X2F2eF92cGVybWlsdmFyX3BkLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC52cGVybWlsdmFyLnBkCisgICAgeDg2X2F2eF92cGVybWlsdmFyX3BkXzI1NiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC52cGVybWlsdmFyLnBkLjI1NgorICAgIHg4Nl9hdnhfdnBlcm1pbHZhcl9wcywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngudnBlcm1pbHZhci5wcworICAgIHg4Nl9hdnhfdnBlcm1pbHZhcl9wc18yNTYsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngudnBlcm1pbHZhci5wcy4yNTYKKyAgICB4ODZfYXZ4X3Z0ZXN0Y19wZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LnZ0ZXN0Yy5wZAorICAgIHg4Nl9hdnhfdnRlc3RjX3BkXzI1NiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngudnRlc3RjLnBkLjI1NgorICAgIHg4Nl9hdnhfdnRlc3RjX3BzLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngudnRlc3RjLnBzCisgICAgeDg2X2F2eF92dGVzdGNfcHNfMjU2LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC52dGVzdGMucHMuMjU2CisgICAgeDg2X2F2eF92dGVzdG56Y19wZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC52dGVzdG56Yy5wZAorICAgIHg4Nl9hdnhfdnRlc3RuemNfcGRfMjU2LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngudnRlc3RuemMucGQuMjU2CisgICAgeDg2X2F2eF92dGVzdG56Y19wcywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC52dGVzdG56Yy5wcworICAgIHg4Nl9hdnhfdnRlc3RuemNfcHNfMjU2LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngudnRlc3RuemMucHMuMjU2CisgICAgeDg2X2F2eF92dGVzdHpfcGQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eC52dGVzdHoucGQKKyAgICB4ODZfYXZ4X3Z0ZXN0el9wZF8yNTYsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LnZ0ZXN0ei5wZC4yNTYKKyAgICB4ODZfYXZ4X3Z0ZXN0el9wcywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LnZ0ZXN0ei5wcworICAgIHg4Nl9hdnhfdnRlc3R6X3BzXzI1NiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngudnRlc3R6LnBzLjI1NgorICAgIHg4Nl9hdnhfdnplcm9hbGwsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngudnplcm9hbGwKKyAgICB4ODZfYXZ4X3Z6ZXJvdXBwZXIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4LnZ6ZXJvdXBwZXIKKyAgICB4ODZfYXZ4Ml9nYXRoZXJfZF9kLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIuZC5kCisgICAgeDg2X2F2eDJfZ2F0aGVyX2RfZF8yNTYsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLmQuZC4yNTYKKyAgICB4ODZfYXZ4Ml9nYXRoZXJfZF9wZCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIuZC5wZAorICAgIHg4Nl9hdngyX2dhdGhlcl9kX3BkXzI1NiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5kLnBkLjI1NgorICAgIHg4Nl9hdngyX2dhdGhlcl9kX3BzLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5kLnBzCisgICAgeDg2X2F2eDJfZ2F0aGVyX2RfcHNfMjU2LCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLmQucHMuMjU2CisgICAgeDg2X2F2eDJfZ2F0aGVyX2RfcSwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLmQucQorICAgIHg4Nl9hdngyX2dhdGhlcl9kX3FfMjU2LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5kLnEuMjU2CisgICAgeDg2X2F2eDJfZ2F0aGVyX3FfZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLnEuZAorICAgIHg4Nl9hdngyX2dhdGhlcl9xX2RfMjU2LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5xLmQuMjU2CisgICAgeDg2X2F2eDJfZ2F0aGVyX3FfcGQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLnEucGQKKyAgICB4ODZfYXZ4Ml9nYXRoZXJfcV9wZF8yNTYsICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIucS5wZC4yNTYKKyAgICB4ODZfYXZ4Ml9nYXRoZXJfcV9wcywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIucS5wcworICAgIHg4Nl9hdngyX2dhdGhlcl9xX3BzXzI1NiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5xLnBzLjI1NgorICAgIHg4Nl9hdngyX2dhdGhlcl9xX3EsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5xLnEKKyAgICB4ODZfYXZ4Ml9nYXRoZXJfcV9xXzI1NiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIucS5xLjI1NgorICAgIHg4Nl9hdngyX21hc2tsb2FkX2QsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLm1hc2tsb2FkLmQKKyAgICB4ODZfYXZ4Ml9tYXNrbG9hZF9kXzI1NiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5tYXNrbG9hZC5kLjI1NgorICAgIHg4Nl9hdngyX21hc2tsb2FkX3EsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLm1hc2tsb2FkLnEKKyAgICB4ODZfYXZ4Ml9tYXNrbG9hZF9xXzI1NiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5tYXNrbG9hZC5xLjI1NgorICAgIHg4Nl9hdngyX21hc2tzdG9yZV9kLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLm1hc2tzdG9yZS5kCisgICAgeDg2X2F2eDJfbWFza3N0b3JlX2RfMjU2LCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIubWFza3N0b3JlLmQuMjU2CisgICAgeDg2X2F2eDJfbWFza3N0b3JlX3EsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIubWFza3N0b3JlLnEKKyAgICB4ODZfYXZ4Ml9tYXNrc3RvcmVfcV8yNTYsICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5tYXNrc3RvcmUucS4yNTYKKyAgICB4ODZfYXZ4Ml9tcHNhZGJ3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5tcHNhZGJ3CisgICAgeDg2X2F2eDJfcGFja3NzZHcsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucGFja3NzZHcKKyAgICB4ODZfYXZ4Ml9wYWNrc3N3YiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wYWNrc3N3YgorICAgIHg4Nl9hdngyX3BhY2t1c2R3LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBhY2t1c2R3CisgICAgeDg2X2F2eDJfcGFja3Vzd2IsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucGFja3Vzd2IKKyAgICB4ODZfYXZ4Ml9wYWRkc19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wYWRkcy5iCisgICAgeDg2X2F2eDJfcGFkZHNfdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucGFkZHMudworICAgIHg4Nl9hdngyX3BhZGR1c19iLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBhZGR1cy5iCisgICAgeDg2X2F2eDJfcGFkZHVzX3csICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucGFkZHVzLncKKyAgICB4ODZfYXZ4Ml9wYmxlbmR2YiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wYmxlbmR2YgorICAgIHg4Nl9hdngyX3Blcm1kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBlcm1kCisgICAgeDg2X2F2eDJfcGVybXBzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucGVybXBzCisgICAgeDg2X2F2eDJfcGhhZGRfZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucGhhZGQuZAorICAgIHg4Nl9hdngyX3BoYWRkX3N3LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBoYWRkLnN3CisgICAgeDg2X2F2eDJfcGhhZGRfdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucGhhZGQudworICAgIHg4Nl9hdngyX3Boc3ViX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBoc3ViLmQKKyAgICB4ODZfYXZ4Ml9waHN1Yl9zdywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5waHN1Yi5zdworICAgIHg4Nl9hdngyX3Boc3ViX3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBoc3ViLncKKyAgICB4ODZfYXZ4Ml9wbWFkZF91Yl9zdywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wbWFkZC51Yi5zdworICAgIHg4Nl9hdngyX3BtYWRkX3dkLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBtYWRkLndkCisgICAgeDg2X2F2eDJfcG1vdm1za2IsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucG1vdm1za2IKKyAgICB4ODZfYXZ4Ml9wbXVsX2RxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wbXVsLmRxCisgICAgeDg2X2F2eDJfcG11bF9ocl9zdywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucG11bC5oci5zdworICAgIHg4Nl9hdngyX3BtdWxoX3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBtdWxoLncKKyAgICB4ODZfYXZ4Ml9wbXVsaHVfdywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wbXVsaHUudworICAgIHg4Nl9hdngyX3BtdWx1X2RxLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBtdWx1LmRxCisgICAgeDg2X2F2eDJfcHNhZF9idywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNhZC5idworICAgIHg4Nl9hdngyX3BzaHVmX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBzaHVmLmIKKyAgICB4ODZfYXZ4Ml9wc2lnbl9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc2lnbi5iCisgICAgeDg2X2F2eDJfcHNpZ25fZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNpZ24uZAorICAgIHg4Nl9hdngyX3BzaWduX3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBzaWduLncKKyAgICB4ODZfYXZ4Ml9wc2xsX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc2xsLmQKKyAgICB4ODZfYXZ4Ml9wc2xsX3EsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc2xsLnEKKyAgICB4ODZfYXZ4Ml9wc2xsX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc2xsLncKKyAgICB4ODZfYXZ4Ml9wc2xsaV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc2xsaS5kCisgICAgeDg2X2F2eDJfcHNsbGlfcSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNsbGkucQorICAgIHg4Nl9hdngyX3BzbGxpX3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBzbGxpLncKKyAgICB4ODZfYXZ4Ml9wc2xsdl9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc2xsdi5kCisgICAgeDg2X2F2eDJfcHNsbHZfZF8yNTYsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNsbHYuZC4yNTYKKyAgICB4ODZfYXZ4Ml9wc2xsdl9xLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc2xsdi5xCisgICAgeDg2X2F2eDJfcHNsbHZfcV8yNTYsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNsbHYucS4yNTYKKyAgICB4ODZfYXZ4Ml9wc3JhX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc3JhLmQKKyAgICB4ODZfYXZ4Ml9wc3JhX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc3JhLncKKyAgICB4ODZfYXZ4Ml9wc3JhaV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc3JhaS5kCisgICAgeDg2X2F2eDJfcHNyYWlfdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNyYWkudworICAgIHg4Nl9hdngyX3BzcmF2X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBzcmF2LmQKKyAgICB4ODZfYXZ4Ml9wc3Jhdl9kXzI1NiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc3Jhdi5kLjI1NgorICAgIHg4Nl9hdngyX3BzcmxfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBzcmwuZAorICAgIHg4Nl9hdngyX3BzcmxfcSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBzcmwucQorICAgIHg4Nl9hdngyX3BzcmxfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBzcmwudworICAgIHg4Nl9hdngyX3BzcmxpX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBzcmxpLmQKKyAgICB4ODZfYXZ4Ml9wc3JsaV9xLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc3JsaS5xCisgICAgeDg2X2F2eDJfcHNybGlfdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHNybGkudworICAgIHg4Nl9hdngyX3Bzcmx2X2QsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBzcmx2LmQKKyAgICB4ODZfYXZ4Ml9wc3Jsdl9kXzI1NiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc3Jsdi5kLjI1NgorICAgIHg4Nl9hdngyX3Bzcmx2X3EsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBzcmx2LnEKKyAgICB4ODZfYXZ4Ml9wc3Jsdl9xXzI1NiwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc3Jsdi5xLjI1NgorICAgIHg4Nl9hdngyX3BzdWJzX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdngyLnBzdWJzLmIKKyAgICB4ODZfYXZ4Ml9wc3Vic193LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc3Vicy53CisgICAgeDg2X2F2eDJfcHN1YnVzX2IsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDIucHN1YnVzLmIKKyAgICB4ODZfYXZ4Ml9wc3VidXNfdywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4Mi5wc3VidXMudworICAgIHg4Nl9hdng1MTJfYnJvYWRjYXN0bWJfMTI4LCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuYnJvYWRjYXN0bWIuMTI4CisgICAgeDg2X2F2eDUxMl9icm9hZGNhc3RtYl8yNTYsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5icm9hZGNhc3RtYi4yNTYKKyAgICB4ODZfYXZ4NTEyX2Jyb2FkY2FzdG1iXzUxMiwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmJyb2FkY2FzdG1iLjUxMgorICAgIHg4Nl9hdng1MTJfYnJvYWRjYXN0bXdfMTI4LCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuYnJvYWRjYXN0bXcuMTI4CisgICAgeDg2X2F2eDUxMl9icm9hZGNhc3Rtd18yNTYsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5icm9hZGNhc3Rtdy4yNTYKKyAgICB4ODZfYXZ4NTEyX2Jyb2FkY2FzdG13XzUxMiwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmJyb2FkY2FzdG13LjUxMgorICAgIHg4Nl9hdng1MTJfY3Z0c2kyc2Q2NCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0c2kyc2Q2NAorICAgIHg4Nl9hdng1MTJfY3Z0c2kyc3MzMiwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0c2kyc3MzMgorICAgIHg4Nl9hdng1MTJfY3Z0c2kyc3M2NCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0c2kyc3M2NAorICAgIHg4Nl9hdng1MTJfY3Z0dHNkMnNpLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0dHNkMnNpCisgICAgeDg2X2F2eDUxMl9jdnR0c2Qyc2k2NCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5jdnR0c2Qyc2k2NAorICAgIHg4Nl9hdng1MTJfY3Z0dHNkMnVzaSwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0dHNkMnVzaQorICAgIHg4Nl9hdng1MTJfY3Z0dHNkMnVzaTY0LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0dHNkMnVzaTY0CisgICAgeDg2X2F2eDUxMl9jdnR0c3Myc2ksICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5jdnR0c3Myc2kKKyAgICB4ODZfYXZ4NTEyX2N2dHRzczJzaTY0LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHRzczJzaTY0CisgICAgeDg2X2F2eDUxMl9jdnR0c3MydXNpLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5jdnR0c3MydXNpCisgICAgeDg2X2F2eDUxMl9jdnR0c3MydXNpNjQsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5jdnR0c3MydXNpNjQKKyAgICB4ODZfYXZ4NTEyX2N2dHVzaTJzZCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHVzaTJzZAorICAgIHg4Nl9hdng1MTJfY3Z0dXNpMnNzLCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0dXNpMnNzCisgICAgeDg2X2F2eDUxMl9jdnR1c2k2NDJzZCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5jdnR1c2k2NDJzZAorICAgIHg4Nl9hdng1MTJfY3Z0dXNpNjQyc3MsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0dXNpNjQyc3MKKyAgICB4ODZfYXZ4NTEyX2V4cDJfcGQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmV4cDIucGQKKyAgICB4ODZfYXZ4NTEyX2V4cDJfcHMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmV4cDIucHMKKyAgICB4ODZfYXZ4NTEyX2dhdGhlcl9kcGRfNTEyLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlci5kcGQuNTEyCisgICAgeDg2X2F2eDUxMl9nYXRoZXJfZHBpXzUxMiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIuZHBpLjUxMgorICAgIHg4Nl9hdng1MTJfZ2F0aGVyX2RwcV81MTIsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyLmRwcS41MTIKKyAgICB4ODZfYXZ4NTEyX2dhdGhlcl9kcHNfNTEyLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlci5kcHMuNTEyCisgICAgeDg2X2F2eDUxMl9nYXRoZXJfcXBkXzUxMiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIucXBkLjUxMgorICAgIHg4Nl9hdng1MTJfZ2F0aGVyX3FwaV81MTIsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyLnFwaS41MTIKKyAgICB4ODZfYXZ4NTEyX2dhdGhlcl9xcHFfNTEyLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlci5xcHEuNTEyCisgICAgeDg2X2F2eDUxMl9nYXRoZXJfcXBzXzUxMiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIucXBzLjUxMgorICAgIHg4Nl9hdng1MTJfZ2F0aGVyM2RpdjJfZGYsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM2RpdjIuZGYKKyAgICB4ODZfYXZ4NTEyX2dhdGhlcjNkaXYyX2RpLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNkaXYyLmRpCisgICAgeDg2X2F2eDUxMl9nYXRoZXIzZGl2NF9kZiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzZGl2NC5kZgorICAgIHg4Nl9hdng1MTJfZ2F0aGVyM2RpdjRfZGksICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM2RpdjQuZGkKKyAgICB4ODZfYXZ4NTEyX2dhdGhlcjNkaXY0X3NmLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNkaXY0LnNmCisgICAgeDg2X2F2eDUxMl9nYXRoZXIzZGl2NF9zaSwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzZGl2NC5zaQorICAgIHg4Nl9hdng1MTJfZ2F0aGVyM2Rpdjhfc2YsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM2Rpdjguc2YKKyAgICB4ODZfYXZ4NTEyX2dhdGhlcjNkaXY4X3NpLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNkaXY4LnNpCisgICAgeDg2X2F2eDUxMl9nYXRoZXIzc2l2Ml9kZiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzc2l2Mi5kZgorICAgIHg4Nl9hdng1MTJfZ2F0aGVyM3NpdjJfZGksICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM3NpdjIuZGkKKyAgICB4ODZfYXZ4NTEyX2dhdGhlcjNzaXY0X2RmLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNzaXY0LmRmCisgICAgeDg2X2F2eDUxMl9nYXRoZXIzc2l2NF9kaSwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzc2l2NC5kaQorICAgIHg4Nl9hdng1MTJfZ2F0aGVyM3NpdjRfc2YsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM3NpdjQuc2YKKyAgICB4ODZfYXZ4NTEyX2dhdGhlcjNzaXY0X3NpLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNzaXY0LnNpCisgICAgeDg2X2F2eDUxMl9nYXRoZXIzc2l2OF9zZiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzc2l2OC5zZgorICAgIHg4Nl9hdng1MTJfZ2F0aGVyM3Npdjhfc2ksICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM3Npdjguc2kKKyAgICB4ODZfYXZ4NTEyX2dhdGhlcnBmX2RwZF81MTIsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlcnBmLmRwZC41MTIKKyAgICB4ODZfYXZ4NTEyX2dhdGhlcnBmX2Rwc181MTIsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlcnBmLmRwcy41MTIKKyAgICB4ODZfYXZ4NTEyX2dhdGhlcnBmX3FwZF81MTIsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlcnBmLnFwZC41MTIKKyAgICB4ODZfYXZ4NTEyX2dhdGhlcnBmX3Fwc181MTIsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLmdhdGhlcnBmLnFwcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfYWRkX3BkXzUxMiwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suYWRkLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19hZGRfcHNfNTEyLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5hZGQucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2FkZF9zZF9yb3VuZCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmFkZC5zZC5yb3VuZAorICAgIHg4Nl9hdng1MTJfbWFza19hZGRfc3Nfcm91bmQsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5hZGQuc3Mucm91bmQKKyAgICB4ODZfYXZ4NTEyX21hc2tfY21wX3BkXzEyOCwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY21wLnBkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jbXBfcGRfMjU2LCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jbXAucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2NtcF9wZF81MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNtcC5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfY21wX3BzXzEyOCwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY21wLnBzLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jbXBfcHNfMjU2LCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jbXAucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2NtcF9wc181MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNtcC5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfY21wX3NkLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY21wLnNkCisgICAgeDg2X2F2eDUxMl9tYXNrX2NtcF9zcywgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNtcC5zcworICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19iXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5iLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19iXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5iLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19iXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5iLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19kXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5kLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19kXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5kLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19kXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5kLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19wZF8xMjgsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfcGRfMjU2LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3BkXzUxMiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19wc18xMjgsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfcHNfMjU2LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3BzXzUxMiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19xXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5xLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19xXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5xLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19xXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5xLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9iXzEyOCwgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5iLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9iXzI1NiwgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5iLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9iXzUxMiwgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5iLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9kXzEyOCwgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5kLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9kXzI1NiwgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5kLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9kXzUxMiwgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5kLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9wZF8xMjgsICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcGRfMjU2LCAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3N0b3JlX3BkXzUxMiwgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9wc18xMjgsICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcHNfMjU2LCAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3N0b3JlX3BzXzUxMiwgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9xXzEyOCwgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5xLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9xXzI1NiwgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5xLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9xXzUxMiwgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5xLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV93XzEyOCwgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS53LjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV93XzI1NiwgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS53LjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV93XzUxMiwgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS53LjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc193XzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy53LjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc193XzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy53LjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jb21wcmVzc193XzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy53LjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jb25mbGljdF9kXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb25mbGljdC5kLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jb25mbGljdF9kXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb25mbGljdC5kLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jb25mbGljdF9kXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb25mbGljdC5kLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jb25mbGljdF9xXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb25mbGljdC5xLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jb25mbGljdF9xXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb25mbGljdC5xLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jb25mbGljdF9xXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb25mbGljdC5xLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnRkcTJwc18xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRkcTJwcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0ZHEycHNfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0ZHEycHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dGRxMnBzXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dGRxMnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnRwZDJkcV8xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJkcS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cGQyZHFfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQyZHEuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHBkMmRxXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMmRxLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19jdnRwZDJwcywgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJwcworICAgIHg4Nl9hdng1MTJfbWFza19jdnRwZDJwc18yNTYsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJwcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cGQycHNfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQycHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHBkMnFxXzEyOCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMnFxLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jdnRwZDJxcV8yNTYsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJxcS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cGQycXFfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQycXEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHBkMnVkcV8xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMnVkcS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cGQydWRxXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQydWRxLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jdnRwZDJ1ZHFfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJ1ZHEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHBkMnVxcV8xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMnVxcS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cGQydXFxXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQydXFxLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jdnRwZDJ1cXFfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJ1cXEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHBzMmRxXzEyOCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMmRxLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jdnRwczJkcV8yNTYsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJkcS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cHMyZHFfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMyZHEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHBzMnBkXzEyOCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMnBkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jdnRwczJwZF8yNTYsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJwZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cHMycGRfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMycGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHBzMnFxXzEyOCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMnFxLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jdnRwczJxcV8yNTYsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJxcS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cHMycXFfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMycXEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHBzMnVkcV8xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMnVkcS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cHMydWRxXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMydWRxLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jdnRwczJ1ZHFfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJ1ZHEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHBzMnVxcV8xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMnVxcS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cHMydXFxXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMydXFxLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jdnRwczJ1cXFfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJ1cXEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHFxMnBkXzEyOCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHFxMnBkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jdnRxcTJwZF8yNTYsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRxcTJwZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cXEycGRfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cXEycGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHFxMnBzXzEyOCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHFxMnBzLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19jdnRxcTJwc18yNTYsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRxcTJwcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0cXEycHNfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cXEycHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHNkMnNzX3JvdW5kLCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHNkMnNzLnJvdW5kCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHNzMnNkX3JvdW5kLCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHNzMnNkLnJvdW5kCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJkcV8xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJkcS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMmRxXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBkMmRxLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR0cGQyZHFfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQyZHEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJxcV8xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJxcS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMnFxXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBkMnFxLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR0cGQycXFfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQycXEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJ1ZHFfMTI4LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJ1ZHEuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJ1ZHFfMjU2LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJ1ZHEuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJ1ZHFfNTEyLCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJ1ZHEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJ1cXFfMTI4LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJ1cXEuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJ1cXFfMjU2LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJ1cXEuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJ1cXFfNTEyLCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJ1cXEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHRwczJkcV8xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJkcS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0dHBzMmRxXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBzMmRxLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR0cHMyZHFfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMyZHEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHRwczJxcV8xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJxcS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0dHBzMnFxXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBzMnFxLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR0cHMycXFfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMycXEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHRwczJ1ZHFfMTI4LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJ1ZHEuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHRwczJ1ZHFfMjU2LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJ1ZHEuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHRwczJ1ZHFfNTEyLCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJ1ZHEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHRwczJ1cXFfMTI4LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJ1cXEuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHRwczJ1cXFfMjU2LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJ1cXEuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHRwczJ1cXFfNTEyLCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJ1cXEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHVkcTJwc18xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHVkcTJwcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0dWRxMnBzXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dWRxMnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR1ZHEycHNfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR1ZHEycHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHVxcTJwZF8xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHVxcTJwZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0dXFxMnBkXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dXFxMnBkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR1cXEycGRfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR1cXEycGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2N2dHVxcTJwc18xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHVxcTJwcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfY3Z0dXFxMnBzXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dXFxMnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19jdnR1cXEycHNfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR1cXEycHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2RicHNhZGJ3XzEyOCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmRicHNhZGJ3LjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19kYnBzYWRid18yNTYsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5kYnBzYWRidy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfZGJwc2FkYndfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZGJwc2FkYncuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2Rpdl9wZF81MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmRpdi5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfZGl2X3BzXzUxMiwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZGl2LnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19kaXZfc2Rfcm91bmQsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5kaXYuc2Qucm91bmQKKyAgICB4ODZfYXZ4NTEyX21hc2tfZGl2X3NzX3JvdW5kLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZGl2LnNzLnJvdW5kCisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9iXzEyOCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5iLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfYl8yNTYsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQuYi4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2JfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmIuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9kXzEyOCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5kLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfZF8yNTYsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQuZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2RfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX2JfMTI4LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLmIuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX2JfMjU2LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLmIuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX2JfNTEyLCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLmIuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX2RfMTI4LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLmQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX2RfMjU2LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLmQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX2RfNTEyLCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLmQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3BkXzEyOCwgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLnBkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9wZF8yNTYsICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5wZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfcGRfNTEyLCAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3BzXzEyOCwgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLnBzLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9wc18yNTYsICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5wcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfcHNfNTEyLCAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3FfMTI4LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLnEuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3FfMjU2LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLnEuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3FfNTEyLCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLnEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3dfMTI4LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLncuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3dfMjU2LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLncuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3dfNTEyLCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLncuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9wZF8xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3BkXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLnBkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfcGRfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9wc18xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3BzXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfcHNfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9xXzEyOCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5xLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfcV8yNTYsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQucS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3FfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLnEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF93XzEyOCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC53LjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19leHBhbmRfd18yNTYsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQudy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3dfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLncuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2ZpeHVwaW1tX3BkXzEyOCwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZpeHVwaW1tLnBkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19maXh1cGltbV9wZF8yNTYsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5maXh1cGltbS5wZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfZml4dXBpbW1fcGRfNTEyLCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZml4dXBpbW0ucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2ZpeHVwaW1tX3BzXzEyOCwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZpeHVwaW1tLnBzLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19maXh1cGltbV9wc18yNTYsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5maXh1cGltbS5wcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfZml4dXBpbW1fcHNfNTEyLCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZml4dXBpbW0ucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2ZpeHVwaW1tX3NkLCAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZpeHVwaW1tLnNkCisgICAgeDg2X2F2eDUxMl9tYXNrX2ZpeHVwaW1tX3NzLCAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZpeHVwaW1tLnNzCisgICAgeDg2X2F2eDUxMl9tYXNrX2ZwY2xhc3NfcGRfMTI4LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3MucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2ZwY2xhc3NfcGRfMjU2LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3MucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2ZwY2xhc3NfcGRfNTEyLCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3MucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2ZwY2xhc3NfcHNfMTI4LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3MucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2ZwY2xhc3NfcHNfMjU2LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3MucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2ZwY2xhc3NfcHNfNTEyLCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3MucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2ZwY2xhc3Nfc2QsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3Muc2QKKyAgICB4ODZfYXZ4NTEyX21hc2tfZnBjbGFzc19zcywgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZnBjbGFzcy5zcworICAgIHg4Nl9hdng1MTJfbWFza19nZXRleHBfcGRfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRleHAucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2dldGV4cF9wZF8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldGV4cC5wZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfZ2V0ZXhwX3BkXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0ZXhwLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19nZXRleHBfcHNfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRleHAucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2dldGV4cF9wc18yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldGV4cC5wcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfZ2V0ZXhwX3BzXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0ZXhwLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19nZXRleHBfc2QsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRleHAuc2QKKyAgICB4ODZfYXZ4NTEyX21hc2tfZ2V0ZXhwX3NzLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0ZXhwLnNzCisgICAgeDg2X2F2eDUxMl9tYXNrX2dldG1hbnRfcGRfMTI4LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2dldG1hbnRfcGRfMjU2LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2dldG1hbnRfcGRfNTEyLCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2dldG1hbnRfcHNfMTI4LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX2dldG1hbnRfcHNfMjU2LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX2dldG1hbnRfcHNfNTEyLCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX2dldG1hbnRfc2QsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQuc2QKKyAgICB4ODZfYXZ4NTEyX21hc2tfZ2V0bWFudF9zcywgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0bWFudC5zcworICAgIHg4Nl9hdng1MTJfbWFza19tYXhfcGRfNTEyLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5tYXgucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX21heF9wc181MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLm1heC5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfbWF4X3NkX3JvdW5kLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2subWF4LnNkLnJvdW5kCisgICAgeDg2X2F2eDUxMl9tYXNrX21heF9zc19yb3VuZCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLm1heC5zcy5yb3VuZAorICAgIHg4Nl9hdng1MTJfbWFza19taW5fcGRfNTEyLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5taW4ucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX21pbl9wc181MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLm1pbi5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfbWluX3NkX3JvdW5kLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2subWluLnNkLnJvdW5kCisgICAgeDg2X2F2eDUxMl9tYXNrX21pbl9zc19yb3VuZCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLm1pbi5zcy5yb3VuZAorICAgIHg4Nl9hdng1MTJfbWFza19tdWxfcGRfNTEyLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5tdWwucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX211bF9wc181MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLm11bC5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfbXVsX3NkX3JvdW5kLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2subXVsLnNkLnJvdW5kCisgICAgeDg2X2F2eDUxMl9tYXNrX211bF9zc19yb3VuZCwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLm11bC5zcy5yb3VuZAorICAgIHg4Nl9hdng1MTJfbWFza19wYWRkc19iXzEyOCwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkcy5iLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wYWRkc19iXzI1NiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkcy5iLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wYWRkc19iXzUxMiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkcy5iLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wYWRkc193XzEyOCwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkcy53LjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wYWRkc193XzI1NiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkcy53LjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wYWRkc193XzUxMiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkcy53LjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wYWRkdXNfYl8xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkdXMuYi4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGFkZHVzX2JfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHVzLmIuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3BhZGR1c19iXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBhZGR1cy5iLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wYWRkdXNfd18xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkdXMudy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcGFkZHVzX3dfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHVzLncuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3BhZGR1c193XzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBhZGR1cy53LjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wZXJtdmFyX2RmXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLmRmLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wZXJtdmFyX2RmXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLmRmLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wZXJtdmFyX2RpXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLmRpLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wZXJtdmFyX2RpXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLmRpLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wZXJtdmFyX2hpXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLmhpLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wZXJtdmFyX2hpXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLmhpLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wZXJtdmFyX2hpXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLmhpLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wZXJtdmFyX3FpXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLnFpLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wZXJtdmFyX3FpXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLnFpLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wZXJtdmFyX3FpXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLnFpLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wZXJtdmFyX3NmXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLnNmLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wZXJtdmFyX3NmXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLnNmLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wZXJtdmFyX3NpXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLnNpLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wZXJtdmFyX3NpXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLnNpLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbWFkZHVic193XzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbWFkZHVicy53LjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbWFkZHVic193XzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbWFkZHVicy53LjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbWFkZHVic193XzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbWFkZHVicy53LjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbWFkZHdfZF8xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbWFkZHcuZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1hZGR3X2RfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1hZGR3LmQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3BtYWRkd19kXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtYWRkdy5kLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X2RiXzEyOCwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmRiLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X2RiXzI1NiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmRiLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X2RiXzUxMiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmRiLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X2RiX21lbV8xMjgsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmRiLm1lbS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9kYl9tZW1fMjU2LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kYi5tZW0uMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZfZGJfbWVtXzUxMiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YuZGIubWVtLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X2R3XzEyOCwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmR3LjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X2R3XzI1NiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmR3LjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X2R3XzUxMiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmR3LjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X2R3X21lbV8xMjgsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmR3Lm1lbS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9kd19tZW1fMjU2LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kdy5tZW0uMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZfZHdfbWVtXzUxMiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YuZHcubWVtLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X3FiXzEyOCwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFiLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X3FiXzI1NiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFiLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X3FiXzUxMiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFiLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X3FiX21lbV8xMjgsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFiLm1lbS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9xYl9tZW1fMjU2LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xYi5tZW0uMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZfcWJfbWVtXzUxMiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucWIubWVtLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X3FkXzEyOCwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X3FkXzI1NiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X3FkXzUxMiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X3FkX21lbV8xMjgsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFkLm1lbS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9xZF9tZW1fMjU2LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xZC5tZW0uMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZfcWRfbWVtXzUxMiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucWQubWVtLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X3F3XzEyOCwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnF3LjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X3F3XzI1NiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnF3LjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X3F3XzUxMiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnF3LjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X3F3X21lbV8xMjgsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnF3Lm1lbS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl9xd19tZW1fMjU2LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xdy5tZW0uMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZfcXdfbWVtXzUxMiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucXcubWVtLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X3diXzEyOCwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LndiLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X3diXzI1NiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LndiLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X3diXzUxMiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LndiLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92X3diX21lbV8xMjgsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LndiLm1lbS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdl93Yl9tZW1fMjU2LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi53Yi5tZW0uMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3Zfd2JfbWVtXzUxMiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Yud2IubWVtLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c19kYl8xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kYi4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfZGJfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZGIuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2RiXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLmRiLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c19kYl9tZW1fMTI4LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kYi5tZW0uMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2RiX21lbV8yNTYsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLmRiLm1lbS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfZGJfbWVtXzUxMiwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZGIubWVtLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c19kd18xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kdy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfZHdfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZHcuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2R3XzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLmR3LjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c19kd19tZW1fMTI4LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kdy5tZW0uMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2R3X21lbV8yNTYsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLmR3Lm1lbS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfZHdfbWVtXzUxMiwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZHcubWVtLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c19xYl8xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xYi4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWJfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWIuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FiXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnFiLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c19xYl9tZW1fMTI4LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xYi5tZW0uMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FiX21lbV8yNTYsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnFiLm1lbS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWJfbWVtXzUxMiwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWIubWVtLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c19xZF8xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWRfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FkXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnFkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c19xZF9tZW1fMTI4LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xZC5tZW0uMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FkX21lbV8yNTYsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnFkLm1lbS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWRfbWVtXzUxMiwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWQubWVtLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c19xd18xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xdy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcXdfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucXcuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3F3XzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnF3LjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c19xd19tZW1fMTI4LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xdy5tZW0uMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3F3X21lbV8yNTYsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnF3Lm1lbS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcXdfbWVtXzUxMiwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucXcubWVtLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c193Yl8xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy53Yi4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfd2JfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMud2IuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3diXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLndiLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92c193Yl9tZW1fMTI4LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy53Yi5tZW0uMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3diX21lbV8yNTYsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLndiLm1lbS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnNfd2JfbWVtXzUxMiwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMud2IubWVtLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfZGJfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZGIuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kYl8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5kYi4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2RiXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmRiLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfZGJfbWVtXzEyOCwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZGIubWVtLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfZGJfbWVtXzI1NiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZGIubWVtLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfZGJfbWVtXzUxMiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZGIubWVtLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfZHdfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZHcuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kd18yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5kdy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2R3XzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmR3LjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfZHdfbWVtXzEyOCwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZHcubWVtLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfZHdfbWVtXzI1NiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZHcubWVtLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfZHdfbWVtXzUxMiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZHcubWVtLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfcWJfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWIuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xYl8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xYi4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FiXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFiLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfcWJfbWVtXzEyOCwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWIubWVtLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfcWJfbWVtXzI1NiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWIubWVtLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfcWJfbWVtXzUxMiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWIubWVtLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfcWRfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xZF8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FkXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfcWRfbWVtXzEyOCwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWQubWVtLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfcWRfbWVtXzI1NiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWQubWVtLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfcWRfbWVtXzUxMiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWQubWVtLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfcXdfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucXcuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xd18yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xdy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3F3XzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnF3LjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfcXdfbWVtXzEyOCwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucXcubWVtLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfcXdfbWVtXzI1NiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucXcubWVtLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfcXdfbWVtXzUxMiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucXcubWVtLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfd2JfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMud2IuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Btb3Z1c193Yl8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy53Yi4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3diXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLndiLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfd2JfbWVtXzEyOCwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMud2IubWVtLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfd2JfbWVtXzI1NiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMud2IubWVtLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wbW92dXNfd2JfbWVtXzUxMiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMud2IubWVtLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wbXVsdGlzaGlmdF9xYl8xMjgsICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbXVsdGlzaGlmdC5xYi4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcG11bHRpc2hpZnRfcWJfMjU2LCAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG11bHRpc2hpZnQucWIuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3BtdWx0aXNoaWZ0X3FiXzUxMiwgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtdWx0aXNoaWZ0LnFiLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wcm9sX2RfMTI4LCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sLmQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Byb2xfZF8yNTYsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb2wuZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHJvbF9kXzUxMiwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbC5kLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wcm9sX3FfMTI4LCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sLnEuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Byb2xfcV8yNTYsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb2wucS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHJvbF9xXzUxMiwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbC5xLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wcm9sdl9kXzEyOCwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sdi5kLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wcm9sdl9kXzI1NiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sdi5kLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wcm9sdl9kXzUxMiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sdi5kLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wcm9sdl9xXzEyOCwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sdi5xLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wcm9sdl9xXzI1NiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sdi5xLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wcm9sdl9xXzUxMiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sdi5xLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wcm9yX2RfMTI4LCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9yLmQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Byb3JfZF8yNTYsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb3IuZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHJvcl9kXzUxMiwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvci5kLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wcm9yX3FfMTI4LCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9yLnEuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Byb3JfcV8yNTYsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb3IucS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHJvcl9xXzUxMiwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvci5xLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wcm9ydl9kXzEyOCwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9ydi5kLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wcm9ydl9kXzI1NiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9ydi5kLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wcm9ydl9kXzUxMiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9ydi5kLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wcm9ydl9xXzEyOCwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9ydi5xLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wcm9ydl9xXzI1NiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9ydi5xLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wcm9ydl9xXzUxMiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9ydi5xLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wc3Vic19iXzEyOCwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wc3Vicy5iLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wc3Vic19iXzI1NiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wc3Vicy5iLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wc3Vic19iXzUxMiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wc3Vicy5iLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wc3Vic193XzEyOCwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wc3Vicy53LjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wc3Vic193XzI1NiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wc3Vicy53LjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wc3Vic193XzUxMiwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wc3Vicy53LjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wc3VidXNfYl8xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wc3VidXMuYi4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHN1YnVzX2JfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnVzLmIuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3BzdWJ1c19iXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBzdWJ1cy5iLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wc3VidXNfd18xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wc3VidXMudy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcHN1YnVzX3dfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnVzLncuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3BzdWJ1c193XzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBzdWJ1cy53LjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wdGVybmxvZ19kXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wdGVybmxvZy5kLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wdGVybmxvZ19kXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wdGVybmxvZy5kLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wdGVybmxvZ19kXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wdGVybmxvZy5kLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19wdGVybmxvZ19xXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wdGVybmxvZy5xLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19wdGVybmxvZ19xXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wdGVybmxvZy5xLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19wdGVybmxvZ19xXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wdGVybmxvZy5xLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19yYW5nZV9wZF8xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yYW5nZS5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcmFuZ2VfcGRfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmFuZ2UucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3JhbmdlX3BkXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJhbmdlLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19yYW5nZV9wc18xMjgsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yYW5nZS5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfcmFuZ2VfcHNfMjU2LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmFuZ2UucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3JhbmdlX3BzXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJhbmdlLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19yYW5nZV9zZCwgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yYW5nZS5zZAorICAgIHg4Nl9hdng1MTJfbWFza19yYW5nZV9zcywgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yYW5nZS5zcworICAgIHg4Nl9hdng1MTJfbWFza19yZWR1Y2VfcGRfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yZWR1Y2UucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3JlZHVjZV9wZF8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJlZHVjZS5wZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcmVkdWNlX3BkXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmVkdWNlLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19yZWR1Y2VfcHNfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yZWR1Y2UucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3JlZHVjZV9wc18yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJlZHVjZS5wcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcmVkdWNlX3BzXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmVkdWNlLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19yZWR1Y2Vfc2QsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yZWR1Y2Uuc2QKKyAgICB4ODZfYXZ4NTEyX21hc2tfcmVkdWNlX3NzLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmVkdWNlLnNzCisgICAgeDg2X2F2eDUxMl9tYXNrX3JuZHNjYWxlX3BkXzEyOCwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJuZHNjYWxlLnBkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19ybmRzY2FsZV9wZF8yNTYsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5ybmRzY2FsZS5wZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcm5kc2NhbGVfcGRfNTEyLCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucm5kc2NhbGUucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3JuZHNjYWxlX3BzXzEyOCwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJuZHNjYWxlLnBzLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza19ybmRzY2FsZV9wc18yNTYsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5ybmRzY2FsZS5wcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfcm5kc2NhbGVfcHNfNTEyLCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucm5kc2NhbGUucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3JuZHNjYWxlX3NkLCAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJuZHNjYWxlLnNkCisgICAgeDg2X2F2eDUxMl9tYXNrX3JuZHNjYWxlX3NzLCAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJuZHNjYWxlLnNzCisgICAgeDg2X2F2eDUxMl9tYXNrX3NjYWxlZl9wZF8xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNjYWxlZi5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfc2NhbGVmX3BkXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc2NhbGVmLnBkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19zY2FsZWZfcGRfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zY2FsZWYucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3NjYWxlZl9wc18xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNjYWxlZi5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfc2NhbGVmX3BzXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc2NhbGVmLnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza19zY2FsZWZfcHNfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zY2FsZWYucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3NjYWxlZl9zZCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNjYWxlZi5zZAorICAgIHg4Nl9hdng1MTJfbWFza19zY2FsZWZfc3MsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zY2FsZWYuc3MKKyAgICB4ODZfYXZ4NTEyX21hc2tfc3FydF9wZF8xMjgsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfc3FydF9wZF8yNTYsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5wZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfc3FydF9wZF81MTIsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfc3FydF9wc18xMjgsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfc3FydF9wc18yNTYsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5wcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfc3FydF9wc181MTIsICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfc3FydF9zZCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5zZAorICAgIHg4Nl9hdng1MTJfbWFza19zcXJ0X3NzLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zcXJ0LnNzCisgICAgeDg2X2F2eDUxMl9tYXNrX3N0b3JlX3NzLCAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnN0b3JlLnNzCisgICAgeDg2X2F2eDUxMl9tYXNrX3N1Yl9wZF81MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnN1Yi5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfc3ViX3BzXzUxMiwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc3ViLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza19zdWJfc2Rfcm91bmQsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zdWIuc2Qucm91bmQKKyAgICB4ODZfYXZ4NTEyX21hc2tfc3ViX3NzX3JvdW5kLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc3ViLnNzLnJvdW5kCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZjdnRwaDJwc18xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZjdnRwaDJwcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmN2dHBoMnBzXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmN2dHBoMnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192Y3Z0cGgycHNfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Y3Z0cGgycHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZjdnRwczJwaF8xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZjdnRwczJwaC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmN2dHBzMnBoXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmN2dHBzMnBoLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192Y3Z0cHMycGhfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Y3Z0cHMycGguNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZmbWFkZF9wZF8xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZC5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZtYWRkX3BkXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkLnBkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192Zm1hZGRfcGRfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGQucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZmbWFkZF9wc18xMjgsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZC5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZtYWRkX3BzXzI1NiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkLnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192Zm1hZGRfcHNfNTEyLCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGQucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrX3ZmbWFkZF9zZCwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZC5zZAorICAgIHg4Nl9hdng1MTJfbWFza192Zm1hZGRfc3MsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGQuc3MKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZtYWRkc3ViX3BkXzEyOCwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkc3ViLnBkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192Zm1hZGRzdWJfcGRfMjU2LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGRzdWIucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZmbWFkZHN1Yl9wZF81MTIsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZHN1Yi5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZtYWRkc3ViX3BzXzEyOCwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkc3ViLnBzLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192Zm1hZGRzdWJfcHNfMjU2LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGRzdWIucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZmbWFkZHN1Yl9wc181MTIsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZHN1Yi5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZubWFkZF9wZF8xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubWFkZC5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZubWFkZF9wZF8yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubWFkZC5wZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZubWFkZF9wZF81MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubWFkZC5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZubWFkZF9wc18xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubWFkZC5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZubWFkZF9wc18yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubWFkZC5wcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZubWFkZF9wc181MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubWFkZC5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZubXN1Yl9wZF8xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubXN1Yi5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZubXN1Yl9wZF8yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubXN1Yi5wZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZubXN1Yl9wZF81MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubXN1Yi5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZubXN1Yl9wc18xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubXN1Yi5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZubXN1Yl9wc18yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubXN1Yi5wcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdmZubXN1Yl9wc181MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubXN1Yi5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBkcGJ1c2RfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcGJ1c2QuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZHBidXNkXzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZHBidXNkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cGRwYnVzZF81MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGRwYnVzZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBkcGJ1c2RzXzEyOCwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcGJ1c2RzLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cGRwYnVzZHNfMjU2LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGRwYnVzZHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZHBidXNkc181MTIsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZHBidXNkcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBkcHdzc2RfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcHdzc2QuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZHB3c3NkXzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZHB3c3NkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cGRwd3NzZF81MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGRwd3NzZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBkcHdzc2RzXzEyOCwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcHdzc2RzLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cGRwd3NzZHNfMjU2LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGRwd3NzZHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZHB3c3Nkc181MTIsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZHB3c3Nkcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9kXzEyOCwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5kLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cGVybWkydmFyX2RfMjU2LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybWkydmFyLmQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfZF81MTIsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIuZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9oaV8xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5oaS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9oaV8yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5oaS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9oaV81MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5oaS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9wZF8xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9wZF8yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5wZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9wZF81MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9wc18xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9wc18yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5wcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9wc181MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9xXzEyOCwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5xLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cGVybWkydmFyX3FfMjU2LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybWkydmFyLnEuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcV81MTIsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9xaV8xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5xaS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9xaV8yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5xaS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9xaV81MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5xaS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9kXzEyOCwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5kLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cGVybXQydmFyX2RfMjU2LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybXQydmFyLmQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfZF81MTIsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIuZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9oaV8xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5oaS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9oaV8yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5oaS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9oaV81MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5oaS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9wZF8xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9wZF8yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5wZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9wZF81MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9wc18xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9wc18yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5wcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9wc181MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9xXzEyOCwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5xLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cGVybXQydmFyX3FfMjU2LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybXQydmFyLnEuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcV81MTIsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9xaV8xMjgsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5xaS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9xaV8yNTYsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5xaS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9xaV81MTIsICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5xaS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBtYWRkNTJoX3VxXzEyOCwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBtYWRkNTJoLnVxLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cG1hZGQ1MmhfdXFfMjU2LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cG1hZGQ1MmgudXEuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwbWFkZDUyaF91cV81MTIsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwbWFkZDUyaC51cS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBtYWRkNTJsX3VxXzEyOCwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBtYWRkNTJsLnVxLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cG1hZGQ1MmxfdXFfMjU2LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cG1hZGQ1MmwudXEuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3ZwbWFkZDUybF91cV81MTIsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwbWFkZDUybC51cS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaGxkX2RfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLmQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZF9kXzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZC5kLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cHNobGRfZF81MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQuZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaGxkX3FfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLnEuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZF9xXzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZC5xLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cHNobGRfcV81MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQucS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaGxkX3dfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLncuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZF93XzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZC53LjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cHNobGRfd181MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQudy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaGxkdl9kXzEyOCwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkdi5kLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cHNobGR2X2RfMjU2LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGR2LmQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZHZfZF81MTIsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZHYuZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaGxkdl9xXzEyOCwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkdi5xLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cHNobGR2X3FfMjU2LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGR2LnEuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZHZfcV81MTIsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZHYucS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaGxkdl93XzEyOCwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkdi53LjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cHNobGR2X3dfMjU2LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGR2LncuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZHZfd181MTIsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZHYudy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaHJkX2RfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLmQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZF9kXzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZC5kLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cHNocmRfZF81MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQuZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaHJkX3FfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLnEuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZF9xXzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZC5xLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cHNocmRfcV81MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQucS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaHJkX3dfMTI4LCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLncuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZF93XzI1NiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZC53LjI1NgorICAgIHg4Nl9hdng1MTJfbWFza192cHNocmRfd181MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQudy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaHJkdl9kXzEyOCwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkdi5kLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cHNocmR2X2RfMjU2LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmR2LmQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZHZfZF81MTIsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZHYuZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaHJkdl9xXzEyOCwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkdi5xLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cHNocmR2X3FfMjU2LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmR2LnEuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZHZfcV81MTIsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZHYucS41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaHJkdl93XzEyOCwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkdi53LjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cHNocmR2X3dfMjU2LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmR2LncuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZHZfd181MTIsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZHYudy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2tfdnBzaHVmYml0cW1iXzEyOCwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHVmYml0cW1iLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza192cHNodWZiaXRxbWJfMjU2LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNodWZiaXRxbWIuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrX3Zwc2h1ZmJpdHFtYl81MTIsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2h1ZmJpdHFtYi41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9wZF8xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9wZF8yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5wZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9wZF81MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5wZC41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9wc18xMjgsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9wc18yNTYsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5wcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9wc181MTIsICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5wcy41MTIKKyAgICB4ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9zZCwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5zZAorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZtYWRkX3NzLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkLnNzCisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1hZGRzdWJfcGRfMTI4LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGRzdWIucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1hZGRzdWJfcGRfMjU2LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGRzdWIucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1hZGRzdWJfcGRfNTEyLCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGRzdWIucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1hZGRzdWJfcHNfMTI4LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGRzdWIucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1hZGRzdWJfcHNfMjU2LCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGRzdWIucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1hZGRzdWJfcHNfNTEyLCAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGRzdWIucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfcGRfMTI4LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfcGRfMjU2LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfcGRfNTEyLCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfcHNfMTI4LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfcHNfMjU2LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfcHNfNTEyLCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfc2QsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIuc2QKKyAgICB4ODZfYXZ4NTEyX21hc2szX3ZmbXN1Yl9zcywgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1Yi5zcworICAgIHg4Nl9hdng1MTJfbWFzazNfdmZtc3ViYWRkX3BkXzEyOCwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViYWRkLnBkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZtc3ViYWRkX3BkXzI1NiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViYWRkLnBkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZtc3ViYWRkX3BkXzUxMiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViYWRkLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZtc3ViYWRkX3BzXzEyOCwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViYWRkLnBzLjEyOAorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZtc3ViYWRkX3BzXzI1NiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViYWRkLnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZtc3ViYWRkX3BzXzUxMiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViYWRkLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZubXN1Yl9wZF8xMjgsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZubXN1Yi5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2szX3Zmbm1zdWJfcGRfMjU2LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbm1zdWIucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm5tc3ViX3BkXzUxMiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm5tc3ViLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZubXN1Yl9wc18xMjgsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZubXN1Yi5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2szX3Zmbm1zdWJfcHNfMjU2LCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbm1zdWIucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrM192Zm5tc3ViX3BzXzUxMiwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm5tc3ViLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZubXN1Yl9zZCwgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZubXN1Yi5zZAorICAgIHg4Nl9hdng1MTJfbWFzazNfdmZubXN1Yl9zcywgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZubXN1Yi5zcworICAgIHg4Nl9hdng1MTJfbWFza3pfZml4dXBpbW1fcGRfMTI4LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3ouZml4dXBpbW0ucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrel9maXh1cGltbV9wZF8yNTYsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5maXh1cGltbS5wZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2t6X2ZpeHVwaW1tX3BkXzUxMiwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LmZpeHVwaW1tLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfZml4dXBpbW1fcHNfMTI4LCAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3ouZml4dXBpbW0ucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrel9maXh1cGltbV9wc18yNTYsICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5maXh1cGltbS5wcy4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2t6X2ZpeHVwaW1tX3BzXzUxMiwgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LmZpeHVwaW1tLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfZml4dXBpbW1fc2QsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3ouZml4dXBpbW0uc2QKKyAgICB4ODZfYXZ4NTEyX21hc2t6X2ZpeHVwaW1tX3NzLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LmZpeHVwaW1tLnNzCisgICAgeDg2X2F2eDUxMl9tYXNrel9wdGVybmxvZ19kXzEyOCwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5wdGVybmxvZy5kLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfcHRlcm5sb2dfZF8yNTYsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oucHRlcm5sb2cuZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3B0ZXJubG9nX2RfNTEyLCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnB0ZXJubG9nLmQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrel9wdGVybmxvZ19xXzEyOCwgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5wdGVybmxvZy5xLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfcHRlcm5sb2dfcV8yNTYsICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oucHRlcm5sb2cucS4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3B0ZXJubG9nX3FfNTEyLCAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnB0ZXJubG9nLnEuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrel92Zm1hZGRfcGRfMTI4LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQucGQuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrel92Zm1hZGRfcGRfMjU2LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrel92Zm1hZGRfcGRfNTEyLCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQucGQuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrel92Zm1hZGRfcHNfMTI4LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQucHMuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrel92Zm1hZGRfcHNfMjU2LCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrel92Zm1hZGRfcHNfNTEyLCAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQucHMuNTEyCisgICAgeDg2X2F2eDUxMl9tYXNrel92Zm1hZGRfc2QsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQuc2QKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZF9zcywgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZC5zcworICAgIHg4Nl9hdng1MTJfbWFza3pfdmZtYWRkc3ViX3BkXzEyOCwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkc3ViLnBkLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfdmZtYWRkc3ViX3BkXzI1NiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkc3ViLnBkLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza3pfdmZtYWRkc3ViX3BkXzUxMiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkc3ViLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdmZtYWRkc3ViX3BzXzEyOCwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkc3ViLnBzLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfdmZtYWRkc3ViX3BzXzI1NiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkc3ViLnBzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza3pfdmZtYWRkc3ViX3BzXzUxMiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkc3ViLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBkcGJ1c2RfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcGJ1c2QuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrel92cGRwYnVzZF8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGRwYnVzZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZHBidXNkXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHBidXNkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBkcGJ1c2RzXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcGJ1c2RzLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBkcGJ1c2RzXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcGJ1c2RzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBkcGJ1c2RzXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcGJ1c2RzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBkcHdzc2RfMTI4LCAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcHdzc2QuMTI4CisgICAgeDg2X2F2eDUxMl9tYXNrel92cGRwd3NzZF8yNTYsICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGRwd3NzZC4yNTYKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZHB3c3NkXzUxMiwgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHB3c3NkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBkcHdzc2RzXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcHdzc2RzLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBkcHdzc2RzXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcHdzc2RzLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBkcHdzc2RzXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcHdzc2RzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9kXzEyOCwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5kLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9kXzI1NiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5kLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9kXzUxMiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5kLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9oaV8xMjgsICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5oaS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfaGlfMjU2LCAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIuaGkuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX2hpXzUxMiwgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLmhpLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9wZF8xMjgsICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcGRfMjU2LCAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucGQuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3BkXzUxMiwgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnBkLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9wc18xMjgsICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcHNfMjU2LCAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucHMuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3BzXzUxMiwgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnBzLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9xXzEyOCwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5xLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9xXzI1NiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5xLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9xXzUxMiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5xLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9xaV8xMjgsICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5xaS4xMjgKKyAgICB4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcWlfMjU2LCAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucWkuMjU2CisgICAgeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3FpXzUxMiwgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnFpLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBtYWRkNTJoX3VxXzEyOCwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBtYWRkNTJoLnVxLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBtYWRkNTJoX3VxXzI1NiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBtYWRkNTJoLnVxLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBtYWRkNTJoX3VxXzUxMiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBtYWRkNTJoLnVxLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBtYWRkNTJsX3VxXzEyOCwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBtYWRkNTJsLnVxLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBtYWRkNTJsX3VxXzI1NiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBtYWRkNTJsLnVxLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBtYWRkNTJsX3VxXzUxMiwgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBtYWRkNTJsLnVxLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl9kXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi5kLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl9kXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi5kLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl9kXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi5kLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl9xXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi5xLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl9xXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi5xLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl9xXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi5xLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl93XzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi53LjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl93XzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi53LjI1NgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl93XzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi53LjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl9kXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi5kLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl9kXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi5kLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl9kXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi5kLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl9xXzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi5xLjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl9xXzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi5xLjI1NgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl9xXzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi5xLjUxMgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl93XzEyOCwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi53LjEyOAorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl93XzI1NiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi53LjI1NgorICAgIHg4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl93XzUxMiwgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi53LjUxMgorICAgIHg4Nl9hdng1MTJfcGFja3NzZHdfNTEyLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucGFja3NzZHcuNTEyCisgICAgeDg2X2F2eDUxMl9wYWNrc3N3Yl81MTIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wYWNrc3N3Yi41MTIKKyAgICB4ODZfYXZ4NTEyX3BhY2t1c2R3XzUxMiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBhY2t1c2R3LjUxMgorICAgIHg4Nl9hdng1MTJfcGFja3Vzd2JfNTEyLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucGFja3Vzd2IuNTEyCisgICAgeDg2X2F2eDUxMl9wbXVsX2RxXzUxMiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wbXVsLmRxLjUxMgorICAgIHg4Nl9hdng1MTJfcG11bF9ocl9zd181MTIsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucG11bC5oci5zdy41MTIKKyAgICB4ODZfYXZ4NTEyX3BtdWxoX3dfNTEyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBtdWxoLncuNTEyCisgICAgeDg2X2F2eDUxMl9wbXVsaHVfd181MTIsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wbXVsaHUudy41MTIKKyAgICB4ODZfYXZ4NTEyX3BtdWx1X2RxXzUxMiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBtdWx1LmRxLjUxMgorICAgIHg4Nl9hdng1MTJfcHNhZF9id181MTIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNhZC5idy41MTIKKyAgICB4ODZfYXZ4NTEyX3BzaHVmX2JfNTEyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzaHVmLmIuNTEyCisgICAgeDg2X2F2eDUxMl9wc2xsX2RfNTEyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2xsLmQuNTEyCisgICAgeDg2X2F2eDUxMl9wc2xsX3FfNTEyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2xsLnEuNTEyCisgICAgeDg2X2F2eDUxMl9wc2xsX3dfNTEyLCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2xsLncuNTEyCisgICAgeDg2X2F2eDUxMl9wc2xsaV9kXzUxMiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2xsaS5kLjUxMgorICAgIHg4Nl9hdng1MTJfcHNsbGlfcV81MTIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNsbGkucS41MTIKKyAgICB4ODZfYXZ4NTEyX3BzbGxpX3dfNTEyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzbGxpLncuNTEyCisgICAgeDg2X2F2eDUxMl9wc2xsdl9kXzUxMiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2xsdi5kLjUxMgorICAgIHg4Nl9hdng1MTJfcHNsbHZfcV81MTIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNsbHYucS41MTIKKyAgICB4ODZfYXZ4NTEyX3BzbGx2X3dfMTI4LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzbGx2LncuMTI4CisgICAgeDg2X2F2eDUxMl9wc2xsdl93XzI1NiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2xsdi53LjI1NgorICAgIHg4Nl9hdng1MTJfcHNsbHZfd181MTIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNsbHYudy41MTIKKyAgICB4ODZfYXZ4NTEyX3BzcmFfZF81MTIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmEuZC41MTIKKyAgICB4ODZfYXZ4NTEyX3BzcmFfcV8xMjgsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmEucS4xMjgKKyAgICB4ODZfYXZ4NTEyX3BzcmFfcV8yNTYsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmEucS4yNTYKKyAgICB4ODZfYXZ4NTEyX3BzcmFfcV81MTIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmEucS41MTIKKyAgICB4ODZfYXZ4NTEyX3BzcmFfd181MTIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmEudy41MTIKKyAgICB4ODZfYXZ4NTEyX3BzcmFpX2RfNTEyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmFpLmQuNTEyCisgICAgeDg2X2F2eDUxMl9wc3JhaV9xXzEyOCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JhaS5xLjEyOAorICAgIHg4Nl9hdng1MTJfcHNyYWlfcV8yNTYsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNyYWkucS4yNTYKKyAgICB4ODZfYXZ4NTEyX3BzcmFpX3FfNTEyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmFpLnEuNTEyCisgICAgeDg2X2F2eDUxMl9wc3JhaV93XzUxMiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JhaS53LjUxMgorICAgIHg4Nl9hdng1MTJfcHNyYXZfZF81MTIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNyYXYuZC41MTIKKyAgICB4ODZfYXZ4NTEyX3BzcmF2X3FfMTI4LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmF2LnEuMTI4CisgICAgeDg2X2F2eDUxMl9wc3Jhdl9xXzI1NiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3Jhdi5xLjI1NgorICAgIHg4Nl9hdng1MTJfcHNyYXZfcV81MTIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNyYXYucS41MTIKKyAgICB4ODZfYXZ4NTEyX3BzcmF2X3dfMTI4LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmF2LncuMTI4CisgICAgeDg2X2F2eDUxMl9wc3Jhdl93XzI1NiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3Jhdi53LjI1NgorICAgIHg4Nl9hdng1MTJfcHNyYXZfd181MTIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNyYXYudy41MTIKKyAgICB4ODZfYXZ4NTEyX3BzcmxfZF81MTIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmwuZC41MTIKKyAgICB4ODZfYXZ4NTEyX3BzcmxfcV81MTIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmwucS41MTIKKyAgICB4ODZfYXZ4NTEyX3Bzcmxfd181MTIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmwudy41MTIKKyAgICB4ODZfYXZ4NTEyX3BzcmxpX2RfNTEyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmxpLmQuNTEyCisgICAgeDg2X2F2eDUxMl9wc3JsaV9xXzUxMiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JsaS5xLjUxMgorICAgIHg4Nl9hdng1MTJfcHNybGlfd181MTIsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNybGkudy41MTIKKyAgICB4ODZfYXZ4NTEyX3Bzcmx2X2RfNTEyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmx2LmQuNTEyCisgICAgeDg2X2F2eDUxMl9wc3Jsdl9xXzUxMiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3Jsdi5xLjUxMgorICAgIHg4Nl9hdng1MTJfcHNybHZfd18xMjgsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucHNybHYudy4xMjgKKyAgICB4ODZfYXZ4NTEyX3Bzcmx2X3dfMjU2LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmx2LncuMjU2CisgICAgeDg2X2F2eDUxMl9wc3Jsdl93XzUxMiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3Jsdi53LjUxMgorICAgIHg4Nl9hdng1MTJfcmNwMTRfcGRfMTI4LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucmNwMTQucGQuMTI4CisgICAgeDg2X2F2eDUxMl9yY3AxNF9wZF8yNTYsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5yY3AxNC5wZC4yNTYKKyAgICB4ODZfYXZ4NTEyX3JjcDE0X3BkXzUxMiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnJjcDE0LnBkLjUxMgorICAgIHg4Nl9hdng1MTJfcmNwMTRfcHNfMTI4LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucmNwMTQucHMuMTI4CisgICAgeDg2X2F2eDUxMl9yY3AxNF9wc18yNTYsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5yY3AxNC5wcy4yNTYKKyAgICB4ODZfYXZ4NTEyX3JjcDE0X3BzXzUxMiwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnJjcDE0LnBzLjUxMgorICAgIHg4Nl9hdng1MTJfcmNwMTRfc2QsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucmNwMTQuc2QKKyAgICB4ODZfYXZ4NTEyX3JjcDE0X3NzLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnJjcDE0LnNzCisgICAgeDg2X2F2eDUxMl9yY3AyOF9wZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5yY3AyOC5wZAorICAgIHg4Nl9hdng1MTJfcmNwMjhfcHMsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucmNwMjgucHMKKyAgICB4ODZfYXZ4NTEyX3JjcDI4X3NkLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnJjcDI4LnNkCisgICAgeDg2X2F2eDUxMl9yY3AyOF9zcywgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5yY3AyOC5zcworICAgIHg4Nl9hdng1MTJfcnNxcnQxNF9wZF8xMjgsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucnNxcnQxNC5wZC4xMjgKKyAgICB4ODZfYXZ4NTEyX3JzcXJ0MTRfcGRfMjU2LCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnJzcXJ0MTQucGQuMjU2CisgICAgeDg2X2F2eDUxMl9yc3FydDE0X3BkXzUxMiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5yc3FydDE0LnBkLjUxMgorICAgIHg4Nl9hdng1MTJfcnNxcnQxNF9wc18xMjgsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucnNxcnQxNC5wcy4xMjgKKyAgICB4ODZfYXZ4NTEyX3JzcXJ0MTRfcHNfMjU2LCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnJzcXJ0MTQucHMuMjU2CisgICAgeDg2X2F2eDUxMl9yc3FydDE0X3BzXzUxMiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5yc3FydDE0LnBzLjUxMgorICAgIHg4Nl9hdng1MTJfcnNxcnQxNF9zZCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucnNxcnQxNC5zZAorICAgIHg4Nl9hdng1MTJfcnNxcnQxNF9zcywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucnNxcnQxNC5zcworICAgIHg4Nl9hdng1MTJfcnNxcnQyOF9wZCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucnNxcnQyOC5wZAorICAgIHg4Nl9hdng1MTJfcnNxcnQyOF9wcywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucnNxcnQyOC5wcworICAgIHg4Nl9hdng1MTJfcnNxcnQyOF9zZCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucnNxcnQyOC5zZAorICAgIHg4Nl9hdng1MTJfcnNxcnQyOF9zcywgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIucnNxcnQyOC5zcworICAgIHg4Nl9hdng1MTJfc2NhdHRlcl9kcGRfNTEyLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlci5kcGQuNTEyCisgICAgeDg2X2F2eDUxMl9zY2F0dGVyX2RwaV81MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyLmRwaS41MTIKKyAgICB4ODZfYXZ4NTEyX3NjYXR0ZXJfZHBxXzUxMiwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXIuZHBxLjUxMgorICAgIHg4Nl9hdng1MTJfc2NhdHRlcl9kcHNfNTEyLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlci5kcHMuNTEyCisgICAgeDg2X2F2eDUxMl9zY2F0dGVyX3FwZF81MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyLnFwZC41MTIKKyAgICB4ODZfYXZ4NTEyX3NjYXR0ZXJfcXBpXzUxMiwgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXIucXBpLjUxMgorICAgIHg4Nl9hdng1MTJfc2NhdHRlcl9xcHFfNTEyLCAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlci5xcHEuNTEyCisgICAgeDg2X2F2eDUxMl9zY2F0dGVyX3Fwc181MTIsICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyLnFwcy41MTIKKyAgICB4ODZfYXZ4NTEyX3NjYXR0ZXJkaXYyX2RmLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJkaXYyLmRmCisgICAgeDg2X2F2eDUxMl9zY2F0dGVyZGl2Ml9kaSwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyZGl2Mi5kaQorICAgIHg4Nl9hdng1MTJfc2NhdHRlcmRpdjRfZGYsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcmRpdjQuZGYKKyAgICB4ODZfYXZ4NTEyX3NjYXR0ZXJkaXY0X2RpLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJkaXY0LmRpCisgICAgeDg2X2F2eDUxMl9zY2F0dGVyZGl2NF9zZiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyZGl2NC5zZgorICAgIHg4Nl9hdng1MTJfc2NhdHRlcmRpdjRfc2ksICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcmRpdjQuc2kKKyAgICB4ODZfYXZ4NTEyX3NjYXR0ZXJkaXY4X3NmLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJkaXY4LnNmCisgICAgeDg2X2F2eDUxMl9zY2F0dGVyZGl2OF9zaSwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyZGl2OC5zaQorICAgIHg4Nl9hdng1MTJfc2NhdHRlcnBmX2RwZF81MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnBmLmRwZC41MTIKKyAgICB4ODZfYXZ4NTEyX3NjYXR0ZXJwZl9kcHNfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJwZi5kcHMuNTEyCisgICAgeDg2X2F2eDUxMl9zY2F0dGVycGZfcXBkXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVycGYucXBkLjUxMgorICAgIHg4Nl9hdng1MTJfc2NhdHRlcnBmX3Fwc181MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnBmLnFwcy41MTIKKyAgICB4ODZfYXZ4NTEyX3NjYXR0ZXJzaXYyX2RmLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJzaXYyLmRmCisgICAgeDg2X2F2eDUxMl9zY2F0dGVyc2l2Ml9kaSwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyc2l2Mi5kaQorICAgIHg4Nl9hdng1MTJfc2NhdHRlcnNpdjRfZGYsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnNpdjQuZGYKKyAgICB4ODZfYXZ4NTEyX3NjYXR0ZXJzaXY0X2RpLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJzaXY0LmRpCisgICAgeDg2X2F2eDUxMl9zY2F0dGVyc2l2NF9zZiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyc2l2NC5zZgorICAgIHg4Nl9hdng1MTJfc2NhdHRlcnNpdjRfc2ksICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnNpdjQuc2kKKyAgICB4ODZfYXZ4NTEyX3NjYXR0ZXJzaXY4X3NmLCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJzaXY4LnNmCisgICAgeDg2X2F2eDUxMl9zY2F0dGVyc2l2OF9zaSwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyc2l2OC5zaQorICAgIHg4Nl9hdng1MTJfdmJyb2FkY2FzdF9zZF81MTIsICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIudmJyb2FkY2FzdC5zZC41MTIKKyAgICB4ODZfYXZ4NTEyX3Zicm9hZGNhc3Rfc3NfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnZicm9hZGNhc3Quc3MuNTEyCisgICAgeDg2X2F2eDUxMl92Y29taV9zZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi52Y29taS5zZAorICAgIHg4Nl9hdng1MTJfdmNvbWlfc3MsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIudmNvbWkuc3MKKyAgICB4ODZfYXZ4NTEyX3ZjdnRzZDJzaTMyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnZjdnRzZDJzaTMyCisgICAgeDg2X2F2eDUxMl92Y3Z0c2Qyc2k2NCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi52Y3Z0c2Qyc2k2NAorICAgIHg4Nl9hdng1MTJfdmN2dHNkMnVzaTMyLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIudmN2dHNkMnVzaTMyCisgICAgeDg2X2F2eDUxMl92Y3Z0c2QydXNpNjQsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi52Y3Z0c2QydXNpNjQKKyAgICB4ODZfYXZ4NTEyX3ZjdnRzczJzaTMyLCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnZjdnRzczJzaTMyCisgICAgeDg2X2F2eDUxMl92Y3Z0c3Myc2k2NCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi52Y3Z0c3Myc2k2NAorICAgIHg4Nl9hdng1MTJfdmN2dHNzMnVzaTMyLCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5hdng1MTIudmN2dHNzMnVzaTMyCisgICAgeDg2X2F2eDUxMl92Y3Z0c3MydXNpNjQsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi52Y3Z0c3MydXNpNjQKKyAgICB4ODZfYXZ4NTEyX3ZwZXJtaWx2YXJfcGRfNTEyLCAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYXZ4NTEyLnZwZXJtaWx2YXIucGQuNTEyCisgICAgeDg2X2F2eDUxMl92cGVybWlsdmFyX3BzXzUxMiwgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmF2eDUxMi52cGVybWlsdmFyLnBzLjUxMgorICAgIHg4Nl9ibWlfYmV4dHJfMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5ibWkuYmV4dHIuMzIKKyAgICB4ODZfYm1pX2JleHRyXzY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuYm1pLmJleHRyLjY0CisgICAgeDg2X2JtaV9iemhpXzMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmJtaS5iemhpLjMyCisgICAgeDg2X2JtaV9iemhpXzY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmJtaS5iemhpLjY0CisgICAgeDg2X2JtaV9wZGVwXzMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmJtaS5wZGVwLjMyCisgICAgeDg2X2JtaV9wZGVwXzY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmJtaS5wZGVwLjY0CisgICAgeDg2X2JtaV9wZXh0XzMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmJtaS5wZXh0LjMyCisgICAgeDg2X2JtaV9wZXh0XzY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmJtaS5wZXh0LjY0CisgICAgeDg2X2NsZmx1c2hvcHQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmNsZmx1c2hvcHQKKyAgICB4ODZfY2xyc3Nic3ksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuY2xyc3Nic3kKKyAgICB4ODZfY2x3YiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuY2x3YgorICAgIHg4Nl9jbHplcm8sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5jbHplcm8KKyAgICB4ODZfZmxhZ3NfcmVhZF91MzIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZmxhZ3MucmVhZC51MzIKKyAgICB4ODZfZmxhZ3NfcmVhZF91NjQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZmxhZ3MucmVhZC51NjQKKyAgICB4ODZfZmxhZ3Nfd3JpdGVfdTMyLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZmxhZ3Mud3JpdGUudTMyCisgICAgeDg2X2ZsYWdzX3dyaXRlX3U2NCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZsYWdzLndyaXRlLnU2NAorICAgIHg4Nl9mbWFfdmZtYWRkX3BkLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbWEudmZtYWRkLnBkCisgICAgeDg2X2ZtYV92Zm1hZGRfcGRfMjU2LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm1hZGQucGQuMjU2CisgICAgeDg2X2ZtYV92Zm1hZGRfcHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm1hZGQucHMKKyAgICB4ODZfZm1hX3ZmbWFkZF9wc18yNTYsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbWFkZC5wcy4yNTYKKyAgICB4ODZfZm1hX3ZmbWFkZF9zZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbWFkZC5zZAorICAgIHg4Nl9mbWFfdmZtYWRkX3NzLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbWEudmZtYWRkLnNzCisgICAgeDg2X2ZtYV92Zm1hZGRzdWJfcGQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm1hZGRzdWIucGQKKyAgICB4ODZfZm1hX3ZmbWFkZHN1Yl9wZF8yNTYsICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbWFkZHN1Yi5wZC4yNTYKKyAgICB4ODZfZm1hX3ZmbWFkZHN1Yl9wcywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbWFkZHN1Yi5wcworICAgIHg4Nl9mbWFfdmZtYWRkc3ViX3BzXzI1NiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbWEudmZtYWRkc3ViLnBzLjI1NgorICAgIHg4Nl9mbWFfdmZtc3ViX3BkLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbWEudmZtc3ViLnBkCisgICAgeDg2X2ZtYV92Zm1zdWJfcGRfMjU2LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm1zdWIucGQuMjU2CisgICAgeDg2X2ZtYV92Zm1zdWJfcHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm1zdWIucHMKKyAgICB4ODZfZm1hX3ZmbXN1Yl9wc18yNTYsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbXN1Yi5wcy4yNTYKKyAgICB4ODZfZm1hX3ZmbXN1Yl9zZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbXN1Yi5zZAorICAgIHg4Nl9mbWFfdmZtc3ViX3NzLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbWEudmZtc3ViLnNzCisgICAgeDg2X2ZtYV92Zm1zdWJhZGRfcGQsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm1zdWJhZGQucGQKKyAgICB4ODZfZm1hX3ZmbXN1YmFkZF9wZF8yNTYsICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbXN1YmFkZC5wZC4yNTYKKyAgICB4ODZfZm1hX3ZmbXN1YmFkZF9wcywgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbXN1YmFkZC5wcworICAgIHg4Nl9mbWFfdmZtc3ViYWRkX3BzXzI1NiwgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbWEudmZtc3ViYWRkLnBzLjI1NgorICAgIHg4Nl9mbWFfdmZubWFkZF9wZCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbWEudmZubWFkZC5wZAorICAgIHg4Nl9mbWFfdmZubWFkZF9wZF8yNTYsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbWEudmZubWFkZC5wZC4yNTYKKyAgICB4ODZfZm1hX3Zmbm1hZGRfcHMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbm1hZGQucHMKKyAgICB4ODZfZm1hX3Zmbm1hZGRfcHNfMjU2LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbm1hZGQucHMuMjU2CisgICAgeDg2X2ZtYV92Zm5tYWRkX3NkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm5tYWRkLnNkCisgICAgeDg2X2ZtYV92Zm5tYWRkX3NzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm5tYWRkLnNzCisgICAgeDg2X2ZtYV92Zm5tc3ViX3BkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm5tc3ViLnBkCisgICAgeDg2X2ZtYV92Zm5tc3ViX3BkXzI1NiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZtYS52Zm5tc3ViLnBkLjI1NgorICAgIHg4Nl9mbWFfdmZubXN1Yl9wcywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbWEudmZubXN1Yi5wcworICAgIHg4Nl9mbWFfdmZubXN1Yl9wc18yNTYsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5mbWEudmZubXN1Yi5wcy4yNTYKKyAgICB4ODZfZm1hX3Zmbm1zdWJfc2QsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbm1zdWIuc2QKKyAgICB4ODZfZm1hX3Zmbm1zdWJfc3MsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hLnZmbm1zdWIuc3MKKyAgICB4ODZfZm1hNF92Zm1hZGRfc2QsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hNC52Zm1hZGQuc2QKKyAgICB4ODZfZm1hNF92Zm1hZGRfc3MsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZm1hNC52Zm1hZGQuc3MKKyAgICB4ODZfZnhyc3RvciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZnhyc3RvcgorICAgIHg4Nl9meHJzdG9yNjQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5meHJzdG9yNjQKKyAgICB4ODZfZnhzYXZlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuZnhzYXZlCisgICAgeDg2X2Z4c2F2ZTY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmZ4c2F2ZTY0CisgICAgeDg2X2luY3NzcGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LmluY3NzcGQKKyAgICB4ODZfaW5jc3NwcSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuaW5jc3NwcQorICAgIHg4Nl9pbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5pbnQKKyAgICB4ODZfbGx3cGNiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubGx3cGNiCisgICAgeDg2X2x3cGluczMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lmx3cGluczMyCisgICAgeDg2X2x3cGluczY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lmx3cGluczY0CisgICAgeDg2X2x3cHZhbDMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lmx3cHZhbDMyCisgICAgeDg2X2x3cHZhbDY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lmx3cHZhbDY0CisgICAgeDg2X21teF9lbW1zLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5lbW1zCisgICAgeDg2X21teF9mZW1tcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5mZW1tcworICAgIHg4Nl9tbXhfbWFza21vdnEsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgubWFza21vdnEKKyAgICB4ODZfbW14X21vdm50X2RxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14Lm1vdm50LmRxCisgICAgeDg2X21teF9wYWNrc3NkdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wYWNrc3NkdworICAgIHg4Nl9tbXhfcGFja3Nzd2IsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucGFja3Nzd2IKKyAgICB4ODZfbW14X3BhY2t1c3diLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBhY2t1c3diCisgICAgeDg2X21teF9wYWRkX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wYWRkLmIKKyAgICB4ODZfbW14X3BhZGRfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBhZGQuZAorICAgIHg4Nl9tbXhfcGFkZF9xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucGFkZC5xCisgICAgeDg2X21teF9wYWRkX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wYWRkLncKKyAgICB4ODZfbW14X3BhZGRzX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBhZGRzLmIKKyAgICB4ODZfbW14X3BhZGRzX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBhZGRzLncKKyAgICB4ODZfbW14X3BhZGR1c19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBhZGR1cy5iCisgICAgeDg2X21teF9wYWRkdXNfdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wYWRkdXMudworICAgIHg4Nl9tbXhfcGFsaWducl9iLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucGFsaWduci5iCisgICAgeDg2X21teF9wYW5kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wYW5kCisgICAgeDg2X21teF9wYW5kbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wYW5kbgorICAgIHg4Nl9tbXhfcGF2Z19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucGF2Zy5iCisgICAgeDg2X21teF9wYXZnX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wYXZnLncKKyAgICB4ODZfbW14X3BjbXBlcV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBjbXBlcS5iCisgICAgeDg2X21teF9wY21wZXFfZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wY21wZXEuZAorICAgIHg4Nl9tbXhfcGNtcGVxX3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucGNtcGVxLncKKyAgICB4ODZfbW14X3BjbXBndF9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBjbXBndC5iCisgICAgeDg2X21teF9wY21wZ3RfZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wY21wZ3QuZAorICAgIHg4Nl9tbXhfcGNtcGd0X3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucGNtcGd0LncKKyAgICB4ODZfbW14X3BleHRyX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBleHRyLncKKyAgICB4ODZfbW14X3BpbnNyX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBpbnNyLncKKyAgICB4ODZfbW14X3BtYWRkX3dkLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBtYWRkLndkCisgICAgeDg2X21teF9wbWF4c193LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wbWF4cy53CisgICAgeDg2X21teF9wbWF4dV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wbWF4dS5iCisgICAgeDg2X21teF9wbWluc193LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wbWlucy53CisgICAgeDg2X21teF9wbWludV9iLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wbWludS5iCisgICAgeDg2X21teF9wbW92bXNrYiwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wbW92bXNrYgorICAgIHg4Nl9tbXhfcG11bGhfdywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucG11bGgudworICAgIHg4Nl9tbXhfcG11bGh1X3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucG11bGh1LncKKyAgICB4ODZfbW14X3BtdWxsX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBtdWxsLncKKyAgICB4ODZfbW14X3BtdWx1X2RxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBtdWx1LmRxCisgICAgeDg2X21teF9wb3IsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wb3IKKyAgICB4ODZfbW14X3BzYWRfYncsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBzYWQuYncKKyAgICB4ODZfbW14X3BzbGxfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBzbGwuZAorICAgIHg4Nl9tbXhfcHNsbF9xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucHNsbC5xCisgICAgeDg2X21teF9wc2xsX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc2xsLncKKyAgICB4ODZfbW14X3BzbGxpX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBzbGxpLmQKKyAgICB4ODZfbW14X3BzbGxpX3EsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBzbGxpLnEKKyAgICB4ODZfbW14X3BzbGxpX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBzbGxpLncKKyAgICB4ODZfbW14X3BzcmFfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBzcmEuZAorICAgIHg4Nl9tbXhfcHNyYV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucHNyYS53CisgICAgeDg2X21teF9wc3JhaV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc3JhaS5kCisgICAgeDg2X21teF9wc3JhaV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc3JhaS53CisgICAgeDg2X21teF9wc3JsX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc3JsLmQKKyAgICB4ODZfbW14X3BzcmxfcSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBzcmwucQorICAgIHg4Nl9tbXhfcHNybF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucHNybC53CisgICAgeDg2X21teF9wc3JsaV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc3JsaS5kCisgICAgeDg2X21teF9wc3JsaV9xLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc3JsaS5xCisgICAgeDg2X21teF9wc3JsaV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc3JsaS53CisgICAgeDg2X21teF9wc3ViX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc3ViLmIKKyAgICB4ODZfbW14X3BzdWJfZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBzdWIuZAorICAgIHg4Nl9tbXhfcHN1Yl9xLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucHN1Yi5xCisgICAgeDg2X21teF9wc3ViX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc3ViLncKKyAgICB4ODZfbW14X3BzdWJzX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBzdWJzLmIKKyAgICB4ODZfbW14X3BzdWJzX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBzdWJzLncKKyAgICB4ODZfbW14X3BzdWJ1c19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnBzdWJ1cy5iCisgICAgeDg2X21teF9wc3VidXNfdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wc3VidXMudworICAgIHg4Nl9tbXhfcHVucGNraGJ3LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucHVucGNraGJ3CisgICAgeDg2X21teF9wdW5wY2toZHEsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wdW5wY2toZHEKKyAgICB4ODZfbW14X3B1bnBja2h3ZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnB1bnBja2h3ZAorICAgIHg4Nl9tbXhfcHVucGNrbGJ3LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucHVucGNrbGJ3CisgICAgeDg2X21teF9wdW5wY2tsZHEsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lm1teC5wdW5wY2tsZHEKKyAgICB4ODZfbW14X3B1bnBja2x3ZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYubW14LnB1bnBja2x3ZAorICAgIHg4Nl9tbXhfcHhvciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tbXgucHhvcgorICAgIHg4Nl9tb25pdG9yeCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5tb25pdG9yeAorICAgIHg4Nl9td2FpdHgsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5td2FpdHgKKyAgICB4ODZfcGNsbXVscWRxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYucGNsbXVscWRxCisgICAgeDg2X3BjbG11bHFkcV8yNTYsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnBjbG11bHFkcS4yNTYKKyAgICB4ODZfcGNsbXVscWRxXzUxMiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYucGNsbXVscWRxLjUxMgorICAgIHg4Nl9yZGZzYmFzZV8zMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5yZGZzYmFzZS4zMgorICAgIHg4Nl9yZGZzYmFzZV82NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5yZGZzYmFzZS42NAorICAgIHg4Nl9yZGdzYmFzZV8zMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5yZGdzYmFzZS4zMgorICAgIHg4Nl9yZGdzYmFzZV82NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5yZGdzYmFzZS42NAorICAgIHg4Nl9yZHBpZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5yZHBpZAorICAgIHg4Nl9yZHBrcnUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5yZHBrcnUKKyAgICB4ODZfcmRwbWMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYucmRwbWMKKyAgICB4ODZfcmRyYW5kXzE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYucmRyYW5kLjE2CisgICAgeDg2X3JkcmFuZF8zMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnJkcmFuZC4zMgorICAgIHg4Nl9yZHJhbmRfNjQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5yZHJhbmQuNjQKKyAgICB4ODZfcmRzZWVkXzE2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYucmRzZWVkLjE2CisgICAgeDg2X3Jkc2VlZF8zMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnJkc2VlZC4zMgorICAgIHg4Nl9yZHNlZWRfNjQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5yZHNlZWQuNjQKKyAgICB4ODZfcmRzc3BkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYucmRzc3BkCisgICAgeDg2X3Jkc3NwcSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnJkc3NwcQorICAgIHg4Nl9yZHRzYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5yZHRzYworICAgIHg4Nl9yZHRzY3AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5yZHRzY3AKKyAgICB4ODZfcnN0b3Jzc3AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYucnN0b3Jzc3AKKyAgICB4ODZfc2F2ZXByZXZzc3AsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc2F2ZXByZXZzc3AKKyAgICB4ODZfc2VoX2VoZ3VhcmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc2VoLmVoZ3VhcmQKKyAgICB4ODZfc2VoX2VocmVnbm9kZSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc2VoLmVocmVnbm9kZQorICAgIHg4Nl9zZWhfbHNkYSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zZWgubHNkYQorICAgIHg4Nl9zZWhfcmVjb3ZlcmZwLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zZWgucmVjb3ZlcmZwCisgICAgeDg2X3NldHNzYnN5LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNldHNzYnN5CisgICAgeDg2X3NoYTFtc2cxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNoYTFtc2cxCisgICAgeDg2X3NoYTFtc2cyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNoYTFtc2cyCisgICAgeDg2X3NoYTFuZXh0ZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNoYTFuZXh0ZQorICAgIHg4Nl9zaGExcm5kczQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zaGExcm5kczQKKyAgICB4ODZfc2hhMjU2bXNnMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc2hhMjU2bXNnMQorICAgIHg4Nl9zaGEyNTZtc2cyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zaGEyNTZtc2cyCisgICAgeDg2X3NoYTI1NnJuZHMyLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNoYTI1NnJuZHMyCisgICAgeDg2X3Nsd3BjYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNsd3BjYgorICAgIHg4Nl9zc2VfY21wX3BzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UuY21wLnBzCisgICAgeDg2X3NzZV9jbXBfc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5jbXAuc3MKKyAgICB4ODZfc3NlX2NvbWllcV9zcywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLmNvbWllcS5zcworICAgIHg4Nl9zc2VfY29taWdlX3NzLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UuY29taWdlLnNzCisgICAgeDg2X3NzZV9jb21pZ3Rfc3MsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5jb21pZ3Quc3MKKyAgICB4ODZfc3NlX2NvbWlsZV9zcywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLmNvbWlsZS5zcworICAgIHg4Nl9zc2VfY29taWx0X3NzLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UuY29taWx0LnNzCisgICAgeDg2X3NzZV9jb21pbmVxX3NzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5jb21pbmVxLnNzCisgICAgeDg2X3NzZV9jdnRwZDJwaSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5jdnRwZDJwaQorICAgIHg4Nl9zc2VfY3Z0cGkycGQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UuY3Z0cGkycGQKKyAgICB4ODZfc3NlX2N2dHBpMnBzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLmN2dHBpMnBzCisgICAgeDg2X3NzZV9jdnRwczJwaSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5jdnRwczJwaQorICAgIHg4Nl9zc2VfY3Z0c2kyc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UuY3Z0c2kyc3MKKyAgICB4ODZfc3NlX2N2dHNpNjQyc3MsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLmN2dHNpNjQyc3MKKyAgICB4ODZfc3NlX2N2dHNzMnNpLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLmN2dHNzMnNpCisgICAgeDg2X3NzZV9jdnRzczJzaTY0LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5jdnRzczJzaTY0CisgICAgeDg2X3NzZV9jdnR0cGQycGksICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5jdnR0cGQycGkKKyAgICB4ODZfc3NlX2N2dHRwczJwaSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLmN2dHRwczJwaQorICAgIHg4Nl9zc2VfY3Z0dHNzMnNpLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UuY3Z0dHNzMnNpCisgICAgeDg2X3NzZV9jdnR0c3Myc2k2NCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5jdnR0c3Myc2k2NAorICAgIHg4Nl9zc2VfbGRteGNzciwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UubGRteGNzcgorICAgIHg4Nl9zc2VfbWF4X3BzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UubWF4LnBzCisgICAgeDg2X3NzZV9tYXhfc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5tYXguc3MKKyAgICB4ODZfc3NlX21pbl9wcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLm1pbi5wcworICAgIHg4Nl9zc2VfbWluX3NzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UubWluLnNzCisgICAgeDg2X3NzZV9tb3Ztc2tfcHMsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5tb3Ztc2sucHMKKyAgICB4ODZfc3NlX3BzaHVmX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLnBzaHVmLncKKyAgICB4ODZfc3NlX3JjcF9wcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLnJjcC5wcworICAgIHg4Nl9zc2VfcmNwX3NzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UucmNwLnNzCisgICAgeDg2X3NzZV9yc3FydF9wcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZS5yc3FydC5wcworICAgIHg4Nl9zc2VfcnNxcnRfc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UucnNxcnQuc3MKKyAgICB4ODZfc3NlX3NmZW5jZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlLnNmZW5jZQorICAgIHg4Nl9zc2Vfc3FydF9wcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2Uuc3FydC5wcworICAgIHg4Nl9zc2Vfc3FydF9zcywgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2Uuc3FydC5zcworICAgIHg4Nl9zc2Vfc3RteGNzciwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2Uuc3RteGNzcgorICAgIHg4Nl9zc2VfdWNvbWllcV9zcywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UudWNvbWllcS5zcworICAgIHg4Nl9zc2VfdWNvbWlnZV9zcywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UudWNvbWlnZS5zcworICAgIHg4Nl9zc2VfdWNvbWlndF9zcywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UudWNvbWlndC5zcworICAgIHg4Nl9zc2VfdWNvbWlsZV9zcywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UudWNvbWlsZS5zcworICAgIHg4Nl9zc2VfdWNvbWlsdF9zcywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UudWNvbWlsdC5zcworICAgIHg4Nl9zc2VfdWNvbWluZXFfc3MsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UudWNvbWluZXEuc3MKKyAgICB4ODZfc3NlMl9jbGZsdXNoLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5jbGZsdXNoCisgICAgeDg2X3NzZTJfY21wX3BkLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIuY21wLnBkCisgICAgeDg2X3NzZTJfY21wX3NkLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIuY21wLnNkCisgICAgeDg2X3NzZTJfY29taWVxX3NkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIuY29taWVxLnNkCisgICAgeDg2X3NzZTJfY29taWdlX3NkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIuY29taWdlLnNkCisgICAgeDg2X3NzZTJfY29taWd0X3NkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIuY29taWd0LnNkCisgICAgeDg2X3NzZTJfY29taWxlX3NkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIuY29taWxlLnNkCisgICAgeDg2X3NzZTJfY29taWx0X3NkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIuY29taWx0LnNkCisgICAgeDg2X3NzZTJfY29taW5lcV9zZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIuY29taW5lcS5zZAorICAgIHg4Nl9zc2UyX2N2dGRxMnBzLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLmN2dGRxMnBzCisgICAgeDg2X3NzZTJfY3Z0cGQyZHEsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIuY3Z0cGQyZHEKKyAgICB4ODZfc3NlMl9jdnRwZDJwcywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5jdnRwZDJwcworICAgIHg4Nl9zc2UyX2N2dHBzMmRxLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLmN2dHBzMmRxCisgICAgeDg2X3NzZTJfY3Z0c2Qyc2ksICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIuY3Z0c2Qyc2kKKyAgICB4ODZfc3NlMl9jdnRzZDJzaTY0LCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5jdnRzZDJzaTY0CisgICAgeDg2X3NzZTJfY3Z0c2Qyc3MsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIuY3Z0c2Qyc3MKKyAgICB4ODZfc3NlMl9jdnRzaTJzZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5jdnRzaTJzZAorICAgIHg4Nl9zc2UyX2N2dHNpNjQyc2QsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLmN2dHNpNjQyc2QKKyAgICB4ODZfc3NlMl9jdnRzczJzZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5jdnRzczJzZAorICAgIHg4Nl9zc2UyX2N2dHRwZDJkcSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLmN2dHRwZDJkcQorICAgIHg4Nl9zc2UyX2N2dHRwczJkcSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLmN2dHRwczJkcQorICAgIHg4Nl9zc2UyX2N2dHRzZDJzaSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLmN2dHRzZDJzaQorICAgIHg4Nl9zc2UyX2N2dHRzZDJzaTY0LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLmN2dHRzZDJzaTY0CisgICAgeDg2X3NzZTJfbGZlbmNlLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIubGZlbmNlCisgICAgeDg2X3NzZTJfbWFza21vdl9kcXUsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIubWFza21vdi5kcXUKKyAgICB4ODZfc3NlMl9tYXhfcGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5tYXgucGQKKyAgICB4ODZfc3NlMl9tYXhfc2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5tYXguc2QKKyAgICB4ODZfc3NlMl9tZmVuY2UsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5tZmVuY2UKKyAgICB4ODZfc3NlMl9taW5fcGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5taW4ucGQKKyAgICB4ODZfc3NlMl9taW5fc2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5taW4uc2QKKyAgICB4ODZfc3NlMl9tb3Ztc2tfcGQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5tb3Ztc2sucGQKKyAgICB4ODZfc3NlMl9wYWNrc3Nkd18xMjgsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5wYWNrc3Nkdy4xMjgKKyAgICB4ODZfc3NlMl9wYWNrc3N3Yl8xMjgsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5wYWNrc3N3Yi4xMjgKKyAgICB4ODZfc3NlMl9wYWNrdXN3Yl8xMjgsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5wYWNrdXN3Yi4xMjgKKyAgICB4ODZfc3NlMl9wYWRkc19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5wYWRkcy5iCisgICAgeDg2X3NzZTJfcGFkZHNfdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucGFkZHMudworICAgIHg4Nl9zc2UyX3BhZGR1c19iLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBhZGR1cy5iCisgICAgeDg2X3NzZTJfcGFkZHVzX3csICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucGFkZHVzLncKKyAgICB4ODZfc3NlMl9wYXVzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5wYXVzZQorICAgIHg4Nl9zc2UyX3BtYWRkX3dkLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBtYWRkLndkCisgICAgeDg2X3NzZTJfcG1vdm1za2JfMTI4LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucG1vdm1za2IuMTI4CisgICAgeDg2X3NzZTJfcG11bGhfdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucG11bGgudworICAgIHg4Nl9zc2UyX3BtdWxodV93LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBtdWxodS53CisgICAgeDg2X3NzZTJfcG11bHVfZHEsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucG11bHUuZHEKKyAgICB4ODZfc3NlMl9wc2FkX2J3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5wc2FkLmJ3CisgICAgeDg2X3NzZTJfcHNsbF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucHNsbC5kCisgICAgeDg2X3NzZTJfcHNsbF9xLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucHNsbC5xCisgICAgeDg2X3NzZTJfcHNsbF93LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucHNsbC53CisgICAgeDg2X3NzZTJfcHNsbGlfZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucHNsbGkuZAorICAgIHg4Nl9zc2UyX3BzbGxpX3EsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBzbGxpLnEKKyAgICB4ODZfc3NlMl9wc2xsaV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5wc2xsaS53CisgICAgeDg2X3NzZTJfcHNyYV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucHNyYS5kCisgICAgeDg2X3NzZTJfcHNyYV93LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucHNyYS53CisgICAgeDg2X3NzZTJfcHNyYWlfZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucHNyYWkuZAorICAgIHg4Nl9zc2UyX3BzcmFpX3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBzcmFpLncKKyAgICB4ODZfc3NlMl9wc3JsX2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5wc3JsLmQKKyAgICB4ODZfc3NlMl9wc3JsX3EsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5wc3JsLnEKKyAgICB4ODZfc3NlMl9wc3JsX3csICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5wc3JsLncKKyAgICB4ODZfc3NlMl9wc3JsaV9kLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5wc3JsaS5kCisgICAgeDg2X3NzZTJfcHNybGlfcSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucHNybGkucQorICAgIHg4Nl9zc2UyX3BzcmxpX3csICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBzcmxpLncKKyAgICB4ODZfc3NlMl9wc3Vic19iLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5wc3Vicy5iCisgICAgeDg2X3NzZTJfcHN1YnNfdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucHN1YnMudworICAgIHg4Nl9zc2UyX3BzdWJ1c19iLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnBzdWJ1cy5iCisgICAgeDg2X3NzZTJfcHN1YnVzX3csICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIucHN1YnVzLncKKyAgICB4ODZfc3NlMl9zcXJ0X3BkLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi5zcXJ0LnBkCisgICAgeDg2X3NzZTJfc3FydF9zZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIuc3FydC5zZAorICAgIHg4Nl9zc2UyX3Vjb21pZXFfc2QsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnVjb21pZXEuc2QKKyAgICB4ODZfc3NlMl91Y29taWdlX3NkLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi51Y29taWdlLnNkCisgICAgeDg2X3NzZTJfdWNvbWlndF9zZCwgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIudWNvbWlndC5zZAorICAgIHg4Nl9zc2UyX3Vjb21pbGVfc2QsICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UyLnVjb21pbGUuc2QKKyAgICB4ODZfc3NlMl91Y29taWx0X3NkLCAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMi51Y29taWx0LnNkCisgICAgeDg2X3NzZTJfdWNvbWluZXFfc2QsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTIudWNvbWluZXEuc2QKKyAgICB4ODZfc3NlM19hZGRzdWJfcGQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMy5hZGRzdWIucGQKKyAgICB4ODZfc3NlM19hZGRzdWJfcHMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMy5hZGRzdWIucHMKKyAgICB4ODZfc3NlM19oYWRkX3BkLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMy5oYWRkLnBkCisgICAgeDg2X3NzZTNfaGFkZF9wcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTMuaGFkZC5wcworICAgIHg4Nl9zc2UzX2hzdWJfcGQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UzLmhzdWIucGQKKyAgICB4ODZfc3NlM19oc3ViX3BzLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlMy5oc3ViLnBzCisgICAgeDg2X3NzZTNfbGR1X2RxLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTMubGR1LmRxCisgICAgeDg2X3NzZTNfbW9uaXRvciwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTMubW9uaXRvcgorICAgIHg4Nl9zc2UzX213YWl0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2UzLm13YWl0CisgICAgeDg2X3NzZTQxX2JsZW5kdnBkLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQxLmJsZW5kdnBkCisgICAgeDg2X3NzZTQxX2JsZW5kdnBzLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQxLmJsZW5kdnBzCisgICAgeDg2X3NzZTQxX2RwcGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQxLmRwcGQKKyAgICB4ODZfc3NlNDFfZHBwcywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDEuZHBwcworICAgIHg4Nl9zc2U0MV9pbnNlcnRwcywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0MS5pbnNlcnRwcworICAgIHg4Nl9zc2U0MV9tcHNhZGJ3LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0MS5tcHNhZGJ3CisgICAgeDg2X3NzZTQxX3BhY2t1c2R3LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQxLnBhY2t1c2R3CisgICAgeDg2X3NzZTQxX3BibGVuZHZiLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQxLnBibGVuZHZiCisgICAgeDg2X3NzZTQxX3BobWlucG9zdXcsICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQxLnBobWlucG9zdXcKKyAgICB4ODZfc3NlNDFfcG11bGRxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDEucG11bGRxCisgICAgeDg2X3NzZTQxX3B0ZXN0YywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQxLnB0ZXN0YworICAgIHg4Nl9zc2U0MV9wdGVzdG56YywgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0MS5wdGVzdG56YworICAgIHg4Nl9zc2U0MV9wdGVzdHosICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0MS5wdGVzdHoKKyAgICB4ODZfc3NlNDFfcm91bmRfcGQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDEucm91bmQucGQKKyAgICB4ODZfc3NlNDFfcm91bmRfcHMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDEucm91bmQucHMKKyAgICB4ODZfc3NlNDFfcm91bmRfc2QsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDEucm91bmQuc2QKKyAgICB4ODZfc3NlNDFfcm91bmRfc3MsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDEucm91bmQuc3MKKyAgICB4ODZfc3NlNDJfY3JjMzJfMzJfMTYsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDIuY3JjMzIuMzIuMTYKKyAgICB4ODZfc3NlNDJfY3JjMzJfMzJfMzIsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDIuY3JjMzIuMzIuMzIKKyAgICB4ODZfc3NlNDJfY3JjMzJfMzJfOCwgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDIuY3JjMzIuMzIuOAorICAgIHg4Nl9zc2U0Ml9jcmMzMl82NF82NCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0Mi5jcmMzMi42NC42NAorICAgIHg4Nl9zc2U0Ml9wY21wZXN0cmkxMjgsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0Mi5wY21wZXN0cmkxMjgKKyAgICB4ODZfc3NlNDJfcGNtcGVzdHJpYTEyOCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDIucGNtcGVzdHJpYTEyOAorICAgIHg4Nl9zc2U0Ml9wY21wZXN0cmljMTI4LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0Mi5wY21wZXN0cmljMTI4CisgICAgeDg2X3NzZTQyX3BjbXBlc3RyaW8xMjgsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQyLnBjbXBlc3RyaW8xMjgKKyAgICB4ODZfc3NlNDJfcGNtcGVzdHJpczEyOCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDIucGNtcGVzdHJpczEyOAorICAgIHg4Nl9zc2U0Ml9wY21wZXN0cml6MTI4LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0Mi5wY21wZXN0cml6MTI4CisgICAgeDg2X3NzZTQyX3BjbXBlc3RybTEyOCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQyLnBjbXBlc3RybTEyOAorICAgIHg4Nl9zc2U0Ml9wY21waXN0cmkxMjgsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0Mi5wY21waXN0cmkxMjgKKyAgICB4ODZfc3NlNDJfcGNtcGlzdHJpYTEyOCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDIucGNtcGlzdHJpYTEyOAorICAgIHg4Nl9zc2U0Ml9wY21waXN0cmljMTI4LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0Mi5wY21waXN0cmljMTI4CisgICAgeDg2X3NzZTQyX3BjbXBpc3RyaW8xMjgsICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQyLnBjbXBpc3RyaW8xMjgKKyAgICB4ODZfc3NlNDJfcGNtcGlzdHJpczEyOCwgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNDIucGNtcGlzdHJpczEyOAorICAgIHg4Nl9zc2U0Ml9wY21waXN0cml6MTI4LCAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0Mi5wY21waXN0cml6MTI4CisgICAgeDg2X3NzZTQyX3BjbXBpc3RybTEyOCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzZTQyLnBjbXBpc3RybTEyOAorICAgIHg4Nl9zc2U0YV9leHRycSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0YS5leHRycQorICAgIHg4Nl9zc2U0YV9leHRycWksICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0YS5leHRycWkKKyAgICB4ODZfc3NlNGFfaW5zZXJ0cSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NlNGEuaW5zZXJ0cQorICAgIHg4Nl9zc2U0YV9pbnNlcnRxaSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc2U0YS5pbnNlcnRxaQorICAgIHg4Nl9zc3NlM19wYWJzX2IsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc3NlMy5wYWJzLmIKKyAgICB4ODZfc3NzZTNfcGFic19kLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NzZTMucGFicy5kCisgICAgeDg2X3Nzc2UzX3BhYnNfdywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBhYnMudworICAgIHg4Nl9zc3NlM19waGFkZF9kLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc3NlMy5waGFkZC5kCisgICAgeDg2X3Nzc2UzX3BoYWRkX2RfMTI4LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBoYWRkLmQuMTI4CisgICAgeDg2X3Nzc2UzX3BoYWRkX3N3LCAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBoYWRkLnN3CisgICAgeDg2X3Nzc2UzX3BoYWRkX3N3XzEyOCwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBoYWRkLnN3LjEyOAorICAgIHg4Nl9zc3NlM19waGFkZF93LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc3NlMy5waGFkZC53CisgICAgeDg2X3Nzc2UzX3BoYWRkX3dfMTI4LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBoYWRkLncuMTI4CisgICAgeDg2X3Nzc2UzX3Boc3ViX2QsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBoc3ViLmQKKyAgICB4ODZfc3NzZTNfcGhzdWJfZF8xMjgsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NzZTMucGhzdWIuZC4xMjgKKyAgICB4ODZfc3NzZTNfcGhzdWJfc3csICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NzZTMucGhzdWIuc3cKKyAgICB4ODZfc3NzZTNfcGhzdWJfc3dfMTI4LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NzZTMucGhzdWIuc3cuMTI4CisgICAgeDg2X3Nzc2UzX3Boc3ViX3csICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBoc3ViLncKKyAgICB4ODZfc3NzZTNfcGhzdWJfd18xMjgsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NzZTMucGhzdWIudy4xMjgKKyAgICB4ODZfc3NzZTNfcG1hZGRfdWJfc3csICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NzZTMucG1hZGQudWIuc3cKKyAgICB4ODZfc3NzZTNfcG1hZGRfdWJfc3dfMTI4LCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NzZTMucG1hZGQudWIuc3cuMTI4CisgICAgeDg2X3Nzc2UzX3BtdWxfaHJfc3csICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBtdWwuaHIuc3cKKyAgICB4ODZfc3NzZTNfcG11bF9ocl9zd18xMjgsICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NzZTMucG11bC5oci5zdy4xMjgKKyAgICB4ODZfc3NzZTNfcHNodWZfYiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NzZTMucHNodWYuYgorICAgIHg4Nl9zc3NlM19wc2h1Zl9iXzEyOCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc3NlMy5wc2h1Zi5iLjEyOAorICAgIHg4Nl9zc3NlM19wc2lnbl9iLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc3NlMy5wc2lnbi5iCisgICAgeDg2X3Nzc2UzX3BzaWduX2JfMTI4LCAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBzaWduLmIuMTI4CisgICAgeDg2X3Nzc2UzX3BzaWduX2QsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnNzc2UzLnBzaWduLmQKKyAgICB4ODZfc3NzZTNfcHNpZ25fZF8xMjgsICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NzZTMucHNpZ24uZC4xMjgKKyAgICB4ODZfc3NzZTNfcHNpZ25fdywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYuc3NzZTMucHNpZ24udworICAgIHg4Nl9zc3NlM19wc2lnbl93XzEyOCwgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zc3NlMy5wc2lnbi53LjEyOAorICAgIHg4Nl9zdWJib3Jyb3dfdTMyLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni5zdWJib3Jyb3cudTMyCisgICAgeDg2X3N1YmJvcnJvd191NjQsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnN1YmJvcnJvdy51NjQKKyAgICB4ODZfdGJtX2JleHRyaV91MzIsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYudGJtLmJleHRyaS51MzIKKyAgICB4ODZfdGJtX2JleHRyaV91NjQsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYudGJtLmJleHRyaS51NjQKKyAgICB4ODZfdmN2dHBoMnBzXzEyOCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYudmN2dHBoMnBzLjEyOAorICAgIHg4Nl92Y3Z0cGgycHNfMjU2LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni52Y3Z0cGgycHMuMjU2CisgICAgeDg2X3ZjdnRwczJwaF8xMjgsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnZjdnRwczJwaC4xMjgKKyAgICB4ODZfdmN2dHBzMnBoXzI1NiwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYudmN2dHBzMnBoLjI1NgorICAgIHg4Nl92Z2YycDhhZmZpbmVpbnZxYl8xMjgsICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni52Z2YycDhhZmZpbmVpbnZxYi4xMjgKKyAgICB4ODZfdmdmMnA4YWZmaW5laW52cWJfMjU2LCAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYudmdmMnA4YWZmaW5laW52cWIuMjU2CisgICAgeDg2X3ZnZjJwOGFmZmluZWludnFiXzUxMiwgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnZnZjJwOGFmZmluZWludnFiLjUxMgorICAgIHg4Nl92Z2YycDhhZmZpbmVxYl8xMjgsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni52Z2YycDhhZmZpbmVxYi4xMjgKKyAgICB4ODZfdmdmMnA4YWZmaW5lcWJfMjU2LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYudmdmMnA4YWZmaW5lcWIuMjU2CisgICAgeDg2X3ZnZjJwOGFmZmluZXFiXzUxMiwgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnZnZjJwOGFmZmluZXFiLjUxMgorICAgIHg4Nl92Z2YycDhtdWxiXzEyOCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni52Z2YycDhtdWxiLjEyOAorICAgIHg4Nl92Z2YycDhtdWxiXzI1NiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni52Z2YycDhtdWxiLjI1NgorICAgIHg4Nl92Z2YycDhtdWxiXzUxMiwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni52Z2YycDhtdWxiLjUxMgorICAgIHg4Nl93cmZzYmFzZV8zMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni53cmZzYmFzZS4zMgorICAgIHg4Nl93cmZzYmFzZV82NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni53cmZzYmFzZS42NAorICAgIHg4Nl93cmdzYmFzZV8zMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni53cmdzYmFzZS4zMgorICAgIHg4Nl93cmdzYmFzZV82NCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni53cmdzYmFzZS42NAorICAgIHg4Nl93cnBrcnUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni53cnBrcnUKKyAgICB4ODZfd3Jzc2QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYud3Jzc2QKKyAgICB4ODZfd3Jzc3EsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYud3Jzc3EKKyAgICB4ODZfd3J1c3NkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYud3J1c3NkCisgICAgeDg2X3dydXNzcSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LndydXNzcQorICAgIHg4Nl94YWJvcnQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54YWJvcnQKKyAgICB4ODZfeGJlZ2luLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueGJlZ2luCisgICAgeDg2X3hlbmQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhlbmQKKyAgICB4ODZfeGdldGJ2LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueGdldGJ2CisgICAgeDg2X3hvcF92ZnJjel9wZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52ZnJjei5wZAorICAgIHg4Nl94b3BfdmZyY3pfcGRfMjU2LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudmZyY3oucGQuMjU2CisgICAgeDg2X3hvcF92ZnJjel9wcywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52ZnJjei5wcworICAgIHg4Nl94b3BfdmZyY3pfcHNfMjU2LCAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudmZyY3oucHMuMjU2CisgICAgeDg2X3hvcF92ZnJjel9zZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52ZnJjei5zZAorICAgIHg4Nl94b3BfdmZyY3pfc3MsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudmZyY3ouc3MKKyAgICB4ODZfeG9wX3ZwY29tYiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwY29tYgorICAgIHg4Nl94b3BfdnBjb21kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBjb21kCisgICAgeDg2X3hvcF92cGNvbXEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cGNvbXEKKyAgICB4ODZfeG9wX3ZwY29tdWIsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwY29tdWIKKyAgICB4ODZfeG9wX3ZwY29tdWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwY29tdWQKKyAgICB4ODZfeG9wX3ZwY29tdXEsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwY29tdXEKKyAgICB4ODZfeG9wX3ZwY29tdXcsICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwY29tdXcKKyAgICB4ODZfeG9wX3ZwY29tdywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwY29tdworICAgIHg4Nl94b3BfdnBlcm1pbDJwZCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBlcm1pbDJwZAorICAgIHg4Nl94b3BfdnBlcm1pbDJwZF8yNTYsICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBlcm1pbDJwZC4yNTYKKyAgICB4ODZfeG9wX3ZwZXJtaWwycHMsICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwZXJtaWwycHMKKyAgICB4ODZfeG9wX3ZwZXJtaWwycHNfMjU2LCAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwZXJtaWwycHMuMjU2CisgICAgeDg2X3hvcF92cGhhZGRiZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cGhhZGRiZAorICAgIHg4Nl94b3BfdnBoYWRkYnEsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBoYWRkYnEKKyAgICB4ODZfeG9wX3ZwaGFkZGJ3LCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwaGFkZGJ3CisgICAgeDg2X3hvcF92cGhhZGRkcSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cGhhZGRkcQorICAgIHg4Nl94b3BfdnBoYWRkdWJkLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBoYWRkdWJkCisgICAgeDg2X3hvcF92cGhhZGR1YnEsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cGhhZGR1YnEKKyAgICB4ODZfeG9wX3ZwaGFkZHVidywgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwaGFkZHVidworICAgIHg4Nl94b3BfdnBoYWRkdWRxLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBoYWRkdWRxCisgICAgeDg2X3hvcF92cGhhZGR1d2QsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cGhhZGR1d2QKKyAgICB4ODZfeG9wX3ZwaGFkZHV3cSwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwaGFkZHV3cQorICAgIHg4Nl94b3BfdnBoYWRkd2QsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBoYWRkd2QKKyAgICB4ODZfeG9wX3ZwaGFkZHdxLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwaGFkZHdxCisgICAgeDg2X3hvcF92cGhzdWJidywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cGhzdWJidworICAgIHg4Nl94b3BfdnBoc3ViZHEsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBoc3ViZHEKKyAgICB4ODZfeG9wX3ZwaHN1YndkLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwaHN1YndkCisgICAgeDg2X3hvcF92cG1hY3NkZCwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cG1hY3NkZAorICAgIHg4Nl94b3BfdnBtYWNzZHFoLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBtYWNzZHFoCisgICAgeDg2X3hvcF92cG1hY3NkcWwsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cG1hY3NkcWwKKyAgICB4ODZfeG9wX3ZwbWFjc3NkZCwgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwbWFjc3NkZAorICAgIHg4Nl94b3BfdnBtYWNzc2RxaCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBtYWNzc2RxaAorICAgIHg4Nl94b3BfdnBtYWNzc2RxbCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBtYWNzc2RxbAorICAgIHg4Nl94b3BfdnBtYWNzc3dkLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBtYWNzc3dkCisgICAgeDg2X3hvcF92cG1hY3Nzd3csICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cG1hY3Nzd3cKKyAgICB4ODZfeG9wX3ZwbWFjc3dkLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwbWFjc3dkCisgICAgeDg2X3hvcF92cG1hY3N3dywgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cG1hY3N3dworICAgIHg4Nl94b3BfdnBtYWRjc3N3ZCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBtYWRjc3N3ZAorICAgIHg4Nl94b3BfdnBtYWRjc3dkLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBtYWRjc3dkCisgICAgeDg2X3hvcF92cHBlcm0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cHBlcm0KKyAgICB4ODZfeG9wX3Zwcm90YiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwcm90YgorICAgIHg4Nl94b3BfdnByb3RiaSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnByb3RiaQorICAgIHg4Nl94b3BfdnByb3RkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnByb3RkCisgICAgeDg2X3hvcF92cHJvdGRpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cHJvdGRpCisgICAgeDg2X3hvcF92cHJvdHEsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cHJvdHEKKyAgICB4ODZfeG9wX3Zwcm90cWksICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwcm90cWkKKyAgICB4ODZfeG9wX3Zwcm90dywgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwcm90dworICAgIHg4Nl94b3BfdnByb3R3aSwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnByb3R3aQorICAgIHg4Nl94b3BfdnBzaGFiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBzaGFiCisgICAgeDg2X3hvcF92cHNoYWQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cHNoYWQKKyAgICB4ODZfeG9wX3Zwc2hhcSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwc2hhcQorICAgIHg4Nl94b3BfdnBzaGF3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBzaGF3CisgICAgeDg2X3hvcF92cHNobGIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cHNobGIKKyAgICB4ODZfeG9wX3Zwc2hsZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueG9wLnZwc2hsZAorICAgIHg4Nl94b3BfdnBzaGxxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54b3AudnBzaGxxCisgICAgeDg2X3hvcF92cHNobHcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhvcC52cHNobHcKKyAgICB4ODZfeHJzdG9yLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueHJzdG9yCisgICAgeDg2X3hyc3RvcjY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lnhyc3RvcjY0CisgICAgeDg2X3hyc3RvcnMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2Lnhyc3RvcnMKKyAgICB4ODZfeHJzdG9yczY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueHJzdG9yczY0CisgICAgeDg2X3hzYXZlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhzYXZlCisgICAgeDg2X3hzYXZlNjQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhzYXZlNjQKKyAgICB4ODZfeHNhdmVjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueHNhdmVjCisgICAgeDg2X3hzYXZlYzY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhzYXZlYzY0CisgICAgeDg2X3hzYXZlb3B0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhzYXZlb3B0CisgICAgeDg2X3hzYXZlb3B0NjQsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhzYXZlb3B0NjQKKyAgICB4ODZfeHNhdmVzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54ODYueHNhdmVzCisgICAgeDg2X3hzYXZlczY0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhzYXZlczY0CisgICAgeDg2X3hzZXRidiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueDg2LnhzZXRidgorICAgIHg4Nl94dGVzdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLng4Ni54dGVzdAorICAgIHhjb3JlX2JpdHJldiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLmJpdHJldgorICAgIHhjb3JlX2NoZWNrZXZlbnQsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLmNoZWNrZXZlbnQKKyAgICB4Y29yZV9jaGtjdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5jaGtjdAorICAgIHhjb3JlX2NscmUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLmNscmUKKyAgICB4Y29yZV9jbHJwdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5jbHJwdAorICAgIHhjb3JlX2NscnNyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLmNscnNyCisgICAgeGNvcmVfY3JjMzIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuY3JjMzIKKyAgICB4Y29yZV9jcmM4LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5jcmM4CisgICAgeGNvcmVfZWR1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuZWR1CisgICAgeGNvcmVfZWV1LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuZWV1CisgICAgeGNvcmVfZW5kaW4sICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuZW5kaW4KKyAgICB4Y29yZV9mcmVlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5mcmVlcgorICAgIHhjb3JlX2dldGVkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLmdldGVkCisgICAgeGNvcmVfZ2V0ZXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuZ2V0ZXQKKyAgICB4Y29yZV9nZXRpZCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5nZXRpZAorICAgIHhjb3JlX2dldHBzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLmdldHBzCisgICAgeGNvcmVfZ2V0ciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuZ2V0cgorICAgIHhjb3JlX2dldHN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLmdldHN0CisgICAgeGNvcmVfZ2V0dHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuZ2V0dHMKKyAgICB4Y29yZV9pbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5pbgorICAgIHhjb3JlX2luY3QsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLmluY3QKKyAgICB4Y29yZV9pbml0Y3AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5pbml0Y3AKKyAgICB4Y29yZV9pbml0ZHAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5pbml0ZHAKKyAgICB4Y29yZV9pbml0bHIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5pbml0bHIKKyAgICB4Y29yZV9pbml0cGMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5pbml0cGMKKyAgICB4Y29yZV9pbml0c3AsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5pbml0c3AKKyAgICB4Y29yZV9pbnNociwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5pbnNocgorICAgIHhjb3JlX2ludCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLmludAorICAgIHhjb3JlX21qb2luLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLm1qb2luCisgICAgeGNvcmVfbXN5bmMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUubXN5bmMKKyAgICB4Y29yZV9vdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5vdXQKKyAgICB4Y29yZV9vdXRjdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5vdXRjdAorICAgIHhjb3JlX291dHNociwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLm91dHNocgorICAgIHhjb3JlX291dHQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLm91dHQKKyAgICB4Y29yZV9wZWVrLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5wZWVrCisgICAgeGNvcmVfc2V0YywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuc2V0YworICAgIHhjb3JlX3NldGNsaywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLnNldGNsaworICAgIHhjb3JlX3NldGQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLnNldGQKKyAgICB4Y29yZV9zZXRldiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5zZXRldgorICAgIHhjb3JlX3NldHBzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLnNldHBzCisgICAgeGNvcmVfc2V0cHNjLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuc2V0cHNjCisgICAgeGNvcmVfc2V0cHQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuc2V0cHQKKyAgICB4Y29yZV9zZXRyZHksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5zZXRyZHkKKyAgICB4Y29yZV9zZXRzciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5zZXRzcgorICAgIHhjb3JlX3NldHR3LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLnNldHR3CisgICAgeGNvcmVfc2V0diwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUuc2V0dgorICAgIHhjb3JlX3NleHQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLnNleHQKKyAgICB4Y29yZV9zc3luYywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbGx2bS54Y29yZS5zc3luYworICAgIHhjb3JlX3N5bmNyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLnN5bmNyCisgICAgeGNvcmVfdGVzdGN0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUudGVzdGN0CisgICAgeGNvcmVfdGVzdHdjdCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxsdm0ueGNvcmUudGVzdHdjdAorICAgIHhjb3JlX3dhaXRldmVudCwgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLndhaXRldmVudAorICAgIHhjb3JlX3pleHQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsbHZtLnhjb3JlLnpleHQKKyNlbmRpZgorCisvLyBUYXJnZXQgbWFwcGluZworI2lmZGVmIEdFVF9JTlRSSU5TSUNfVEFSR0VUX0RBVEEKK3N0cnVjdCBJbnRyaW5zaWNUYXJnZXRJbmZvIHsKKyAgbGx2bTo6U3RyaW5nTGl0ZXJhbCBOYW1lOworICBzaXplX3QgT2Zmc2V0OworICBzaXplX3QgQ291bnQ7Cit9Oworc3RhdGljIGNvbnN0ZXhwciBJbnRyaW5zaWNUYXJnZXRJbmZvIFRhcmdldEluZm9zW10gPSB7CisgIHtsbHZtOjpTdHJpbmdMaXRlcmFsKCIiKSwgMCwgMTc0fSwKKyAge2xsdm06OlN0cmluZ0xpdGVyYWwoImFhcmNoNjQiKSwgMTc0LCAxODl9LAorICB7bGx2bTo6U3RyaW5nTGl0ZXJhbCgiYW1kZ2NuIiksIDM2MywgMjEzfSwKKyAge2xsdm06OlN0cmluZ0xpdGVyYWwoImFybSIpLCA1NzYsIDI0MH0sCisgIHtsbHZtOjpTdHJpbmdMaXRlcmFsKCJicGYiKSwgODE2LCA0fSwKKyAge2xsdm06OlN0cmluZ0xpdGVyYWwoImhleGFnb24iKSwgODIwLCAxNzA4fSwKKyAge2xsdm06OlN0cmluZ0xpdGVyYWwoIm1pcHMiKSwgMjUyOCwgNjY3fSwKKyAge2xsdm06OlN0cmluZ0xpdGVyYWwoIm52dm0iKSwgMzE5NSwgMTAwNX0sCisgIHtsbHZtOjpTdHJpbmdMaXRlcmFsKCJwcGMiKSwgNDIwMCwgMzk2fSwKKyAge2xsdm06OlN0cmluZ0xpdGVyYWwoInI2MDAiKSwgNDU5NiwgMjF9LAorICB7bGx2bTo6U3RyaW5nTGl0ZXJhbCgiczM5MCIpLCA0NjE3LCAyMjB9LAorICB7bGx2bTo6U3RyaW5nTGl0ZXJhbCgid2FzbSIpLCA0ODM3LCA4fSwKKyAge2xsdm06OlN0cmluZ0xpdGVyYWwoIng4NiIpLCA0ODQ1LCAxNTA2fSwKKyAge2xsdm06OlN0cmluZ0xpdGVyYWwoInhjb3JlIiksIDYzNTEsIDUzfSwKK307CisjZW5kaWYKKworLy8gSW50cmluc2ljIElEIHRvIG5hbWUgdGFibGUKKyNpZmRlZiBHRVRfSU5UUklOU0lDX05BTUVfVEFCTEUKKyAgLy8gTm90ZSB0aGF0IGVudHJ5ICMwIGlzIHRoZSBpbnZhbGlkIGludHJpbnNpYyEKKyAgImxsdm0uYWRkcmVzc29mcmV0dXJuYWRkcmVzcyIsCisgICJsbHZtLmFkanVzdC50cmFtcG9saW5lIiwKKyAgImxsdm0uYW5ub3RhdGlvbiIsCisgICJsbHZtLmFzc3VtZSIsCisgICJsbHZtLmJpdHJldmVyc2UiLAorICAibGx2bS5ic3dhcCIsCisgICJsbHZtLmNhbm9uaWNhbGl6ZSIsCisgICJsbHZtLmNlaWwiLAorICAibGx2bS5jbGVhcl9jYWNoZSIsCisgICJsbHZtLmNvZGV2aWV3LmFubm90YXRpb24iLAorICAibGx2bS5jb252ZXJ0LmZyb20uZnAxNiIsCisgICJsbHZtLmNvbnZlcnQudG8uZnAxNiIsCisgICJsbHZtLmNvcHlzaWduIiwKKyAgImxsdm0uY29yby5hbGxvYyIsCisgICJsbHZtLmNvcm8uYmVnaW4iLAorICAibGx2bS5jb3JvLmRlc3Ryb3kiLAorICAibGx2bS5jb3JvLmRvbmUiLAorICAibGx2bS5jb3JvLmVuZCIsCisgICJsbHZtLmNvcm8uZnJhbWUiLAorICAibGx2bS5jb3JvLmZyZWUiLAorICAibGx2bS5jb3JvLmlkIiwKKyAgImxsdm0uY29yby5wYXJhbSIsCisgICJsbHZtLmNvcm8ucHJvbWlzZSIsCisgICJsbHZtLmNvcm8ucmVzdW1lIiwKKyAgImxsdm0uY29yby5zYXZlIiwKKyAgImxsdm0uY29yby5zaXplIiwKKyAgImxsdm0uY29yby5zdWJmbi5hZGRyIiwKKyAgImxsdm0uY29yby5zdXNwZW5kIiwKKyAgImxsdm0uY29zIiwKKyAgImxsdm0uY3RseiIsCisgICJsbHZtLmN0cG9wIiwKKyAgImxsdm0uY3R0eiIsCisgICJsbHZtLmRiZy5hZGRyIiwKKyAgImxsdm0uZGJnLmRlY2xhcmUiLAorICAibGx2bS5kYmcudmFsdWUiLAorICAibGx2bS5kZWJ1Z3RyYXAiLAorICAibGx2bS5kb25vdGhpbmciLAorICAibGx2bS5laC5kd2FyZi5jZmEiLAorICAibGx2bS5laC5leGNlcHRpb25jb2RlIiwKKyAgImxsdm0uZWguZXhjZXB0aW9ucG9pbnRlciIsCisgICJsbHZtLmVoLnJldHVybi5pMzIiLAorICAibGx2bS5laC5yZXR1cm4uaTY0IiwKKyAgImxsdm0uZWguc2psai5jYWxsc2l0ZSIsCisgICJsbHZtLmVoLnNqbGouZnVuY3Rpb25jb250ZXh0IiwKKyAgImxsdm0uZWguc2psai5sb25nam1wIiwKKyAgImxsdm0uZWguc2psai5sc2RhIiwKKyAgImxsdm0uZWguc2psai5zZXRqbXAiLAorICAibGx2bS5laC5zamxqLnNldHVwLmRpc3BhdGNoIiwKKyAgImxsdm0uZWgudHlwZWlkLmZvciIsCisgICJsbHZtLmVoLnVud2luZC5pbml0IiwKKyAgImxsdm0uZXhwIiwKKyAgImxsdm0uZXhwMiIsCisgICJsbHZtLmV4cGVjdCIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5jb3MiLAorICAibGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuZXhwIiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmV4cDIiLAorICAibGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuZmFkZCIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5mZGl2IiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmZtYSIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5mbXVsIiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmZyZW0iLAorICAibGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuZnN1YiIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5sb2ciLAorICAibGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQubG9nMTAiLAorICAibGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQubG9nMiIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5uZWFyYnlpbnQiLAorICAibGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQucG93IiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLnBvd2kiLAorICAibGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQucmludCIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5zaW4iLAorICAibGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuc3FydCIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC5kZW9wdGltaXplIiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLmdjLnJlbG9jYXRlIiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLmdjLnJlc3VsdCIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC5nYy5zdGF0ZXBvaW50IiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLmd1YXJkIiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLnBhdGNocG9pbnQuaTY0IiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLnBhdGNocG9pbnQudm9pZCIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC5zdGFja21hcCIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLmFkZCIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLmFuZCIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLmZhZGQiLAorICAibGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5mbWF4IiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UuZm1pbiIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLmZtdWwiLAorICAibGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5tdWwiLAorICAibGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5vciIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLnNtYXgiLAorICAibGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5zbWluIiwKKyAgImxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UudW1heCIsCisgICJsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLnVtaW4iLAorICAibGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS54b3IiLAorICAibGx2bS5mYWJzIiwKKyAgImxsdm0uZmxvb3IiLAorICAibGx2bS5mbHQucm91bmRzIiwKKyAgImxsdm0uZm1hIiwKKyAgImxsdm0uZm11bGFkZCIsCisgICJsbHZtLmZyYW1lYWRkcmVzcyIsCisgICJsbHZtLmdjcmVhZCIsCisgICJsbHZtLmdjcm9vdCIsCisgICJsbHZtLmdjd3JpdGUiLAorICAibGx2bS5nZXQuZHluYW1pYy5hcmVhLm9mZnNldCIsCisgICJsbHZtLmljYWxsLmJyYW5jaC5mdW5uZWwiLAorICAibGx2bS5pbml0LnRyYW1wb2xpbmUiLAorICAibGx2bS5pbnN0cnByb2YuaW5jcmVtZW50IiwKKyAgImxsdm0uaW5zdHJwcm9mLmluY3JlbWVudC5zdGVwIiwKKyAgImxsdm0uaW5zdHJwcm9mLnZhbHVlLnByb2ZpbGUiLAorICAibGx2bS5pbnZhcmlhbnQuZW5kIiwKKyAgImxsdm0uaW52YXJpYW50Lmdyb3VwLmJhcnJpZXIiLAorICAibGx2bS5pbnZhcmlhbnQuc3RhcnQiLAorICAibGx2bS5saWZldGltZS5lbmQiLAorICAibGx2bS5saWZldGltZS5zdGFydCIsCisgICJsbHZtLmxvYWQucmVsYXRpdmUiLAorICAibGx2bS5sb2NhbGFkZHJlc3MiLAorICAibGx2bS5sb2NhbGVzY2FwZSIsCisgICJsbHZtLmxvY2FscmVjb3ZlciIsCisgICJsbHZtLmxvZyIsCisgICJsbHZtLmxvZzEwIiwKKyAgImxsdm0ubG9nMiIsCisgICJsbHZtLmxvbmdqbXAiLAorICAibGx2bS5tYXNrZWQuY29tcHJlc3NzdG9yZSIsCisgICJsbHZtLm1hc2tlZC5leHBhbmRsb2FkIiwKKyAgImxsdm0ubWFza2VkLmdhdGhlciIsCisgICJsbHZtLm1hc2tlZC5sb2FkIiwKKyAgImxsdm0ubWFza2VkLnNjYXR0ZXIiLAorICAibGx2bS5tYXNrZWQuc3RvcmUiLAorICAibGx2bS5tYXhudW0iLAorICAibGx2bS5tZW1jcHkiLAorICAibGx2bS5tZW1jcHkuZWxlbWVudC51bm9yZGVyZWQuYXRvbWljIiwKKyAgImxsdm0ubWVtbW92ZSIsCisgICJsbHZtLm1lbW1vdmUuZWxlbWVudC51bm9yZGVyZWQuYXRvbWljIiwKKyAgImxsdm0ubWVtc2V0IiwKKyAgImxsdm0ubWVtc2V0LmVsZW1lbnQudW5vcmRlcmVkLmF0b21pYyIsCisgICJsbHZtLm1pbm51bSIsCisgICJsbHZtLm5lYXJieWludCIsCisgICJsbHZtLm9iamVjdHNpemUiLAorICAibGx2bS5wY21hcmtlciIsCisgICJsbHZtLnBvdyIsCisgICJsbHZtLnBvd2kiLAorICAibGx2bS5wcmVmZXRjaCIsCisgICJsbHZtLnB0ci5hbm5vdGF0aW9uIiwKKyAgImxsdm0ucmVhZF9yZWdpc3RlciIsCisgICJsbHZtLnJlYWRjeWNsZWNvdW50ZXIiLAorICAibGx2bS5yZXR1cm5hZGRyZXNzIiwKKyAgImxsdm0ucmludCIsCisgICJsbHZtLnJvdW5kIiwKKyAgImxsdm0uc2FkZC53aXRoLm92ZXJmbG93IiwKKyAgImxsdm0uc2V0am1wIiwKKyAgImxsdm0uc2lkZWVmZmVjdCIsCisgICJsbHZtLnNpZ2xvbmdqbXAiLAorICAibGx2bS5zaWdzZXRqbXAiLAorICAibGx2bS5zaW4iLAorICAibGx2bS5zbXVsLndpdGgub3ZlcmZsb3ciLAorICAibGx2bS5zcXJ0IiwKKyAgImxsdm0uc3NhLmNvcHkiLAorICAibGx2bS5zc3ViLndpdGgub3ZlcmZsb3ciLAorICAibGx2bS5zdGFja2d1YXJkIiwKKyAgImxsdm0uc3RhY2twcm90ZWN0b3IiLAorICAibGx2bS5zdGFja3Jlc3RvcmUiLAorICAibGx2bS5zdGFja3NhdmUiLAorICAibGx2bS50aHJlYWQucG9pbnRlciIsCisgICJsbHZtLnRyYXAiLAorICAibGx2bS50cnVuYyIsCisgICJsbHZtLnR5cGUuY2hlY2tlZC5sb2FkIiwKKyAgImxsdm0udHlwZS50ZXN0IiwKKyAgImxsdm0udWFkZC53aXRoLm92ZXJmbG93IiwKKyAgImxsdm0udW11bC53aXRoLm92ZXJmbG93IiwKKyAgImxsdm0udXN1Yi53aXRoLm92ZXJmbG93IiwKKyAgImxsdm0udmFfY29weSIsCisgICJsbHZtLnZhX2VuZCIsCisgICJsbHZtLnZhX3N0YXJ0IiwKKyAgImxsdm0udmFyLmFubm90YXRpb24iLAorICAibGx2bS53cml0ZV9yZWdpc3RlciIsCisgICJsbHZtLnhyYXkuY3VzdG9tZXZlbnQiLAorICAibGx2bS5hYXJjaDY0LmNscmV4IiwKKyAgImxsdm0uYWFyY2g2NC5jcmMzMmIiLAorICAibGx2bS5hYXJjaDY0LmNyYzMyY2IiLAorICAibGx2bS5hYXJjaDY0LmNyYzMyY2giLAorICAibGx2bS5hYXJjaDY0LmNyYzMyY3ciLAorICAibGx2bS5hYXJjaDY0LmNyYzMyY3giLAorICAibGx2bS5hYXJjaDY0LmNyYzMyaCIsCisgICJsbHZtLmFhcmNoNjQuY3JjMzJ3IiwKKyAgImxsdm0uYWFyY2g2NC5jcmMzMngiLAorICAibGx2bS5hYXJjaDY0LmNyeXB0by5hZXNkIiwKKyAgImxsdm0uYWFyY2g2NC5jcnlwdG8uYWVzZSIsCisgICJsbHZtLmFhcmNoNjQuY3J5cHRvLmFlc2ltYyIsCisgICJsbHZtLmFhcmNoNjQuY3J5cHRvLmFlc21jIiwKKyAgImxsdm0uYWFyY2g2NC5jcnlwdG8uc2hhMWMiLAorICAibGx2bS5hYXJjaDY0LmNyeXB0by5zaGExaCIsCisgICJsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTFtIiwKKyAgImxsdm0uYWFyY2g2NC5jcnlwdG8uc2hhMXAiLAorICAibGx2bS5hYXJjaDY0LmNyeXB0by5zaGExc3UwIiwKKyAgImxsdm0uYWFyY2g2NC5jcnlwdG8uc2hhMXN1MSIsCisgICJsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTI1NmgiLAorICAibGx2bS5hYXJjaDY0LmNyeXB0by5zaGEyNTZoMiIsCisgICJsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTI1NnN1MCIsCisgICJsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTI1NnN1MSIsCisgICJsbHZtLmFhcmNoNjQuZG1iIiwKKyAgImxsdm0uYWFyY2g2NC5kc2IiLAorICAibGx2bS5hYXJjaDY0LmhpbnQiLAorICAibGx2bS5hYXJjaDY0LmlzYiIsCisgICJsbHZtLmFhcmNoNjQubGRheHAiLAorICAibGx2bS5hYXJjaDY0LmxkYXhyIiwKKyAgImxsdm0uYWFyY2g2NC5sZHhwIiwKKyAgImxsdm0uYWFyY2g2NC5sZHhyIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmFicyIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5hZGRobiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5hZGRwIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmNscyIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mYWJkIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZhY2dlIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZhY2d0IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZhZGR2IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZjdnRhcyIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mY3Z0YXUiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZmN2dG1zIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZjdnRtdSIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mY3Z0bnMiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZmN2dG51IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZjdnRwcyIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mY3Z0cHUiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZmN2dHhuIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZjdnR6cyIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mY3Z0enUiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZm1heCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mbWF4bm0iLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZm1heG5tcCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mbWF4bm12IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZtYXhwIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZtYXh2IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZtaW4iLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZm1pbm5tIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZtaW5ubXAiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZm1pbm5tdiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mbWlucCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mbWludiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mbXVseCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mcmVjcGUiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZnJlY3BzIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmZyZWNweCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mcmludG4iLAorICAibGx2bS5hYXJjaDY0Lm5lb24uZnJzcXJ0ZSIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5mcnNxcnRzIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmxkMXgyIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmxkMXgzIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmxkMXg0IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmxkMiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5sZDJsYW5lIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmxkMnIiLAorICAibGx2bS5hYXJjaDY0Lm5lb24ubGQzIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLmxkM2xhbmUiLAorICAibGx2bS5hYXJjaDY0Lm5lb24ubGQzciIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5sZDQiLAorICAibGx2bS5hYXJjaDY0Lm5lb24ubGQ0bGFuZSIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5sZDRyIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnBtdWwiLAorICAibGx2bS5hYXJjaDY0Lm5lb24ucG11bGwiLAorICAibGx2bS5hYXJjaDY0Lm5lb24ucG11bGw2NCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5yYWRkaG4iLAorICAibGx2bS5hYXJjaDY0Lm5lb24ucmJpdCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5yc2hybiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5yc3ViaG4iLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc2FiZCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zYWRkbHAiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc2FkZGx2IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNhZGR2IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNjYWxhci5zcXh0biIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zY2FsYXIuc3F4dHVuIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNjYWxhci51cXh0biIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zaGFkZCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zaGxsIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNoc3ViIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNtYXgiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc21heHAiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc21heHYiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc21pbiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zbWlucCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zbWludiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zbXVsbCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zcWFicyIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zcWFkZCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zcWRtdWxoIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNxZG11bGwiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc3FkbXVsbHMuc2NhbGFyIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNxbmVnIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNxcmRtdWxoIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNxcnNobCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zcXJzaHJuIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNxcnNocnVuIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNxc2hsIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNxc2hsdSIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zcXNocm4iLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc3FzaHJ1biIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zcXN1YiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zcXh0biIsCisgICJsbHZtLmFhcmNoNjQubmVvbi5zcXh0dW4iLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc3JoYWRkIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNyc2hsIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnNzaGwiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc3NobGwiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc3QxeDIiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc3QxeDMiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc3QxeDQiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc3QyIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnN0MmxhbmUiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc3QzIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnN0M2xhbmUiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc3Q0IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnN0NGxhbmUiLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc3ViaG4iLAorICAibGx2bS5hYXJjaDY0Lm5lb24uc3VxYWRkIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnRibDEiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udGJsMiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi50YmwzIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnRibDQiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udGJ4MSIsCisgICJsbHZtLmFhcmNoNjQubmVvbi50YngyIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnRieDMiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udGJ4NCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51YWJkIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnVhZGRscCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51YWRkbHYiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udWFkZHYiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udWhhZGQiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udWhzdWIiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udW1heCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51bWF4cCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51bWF4diIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51bWluIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnVtaW5wIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnVtaW52IiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnVtdWxsIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnVxYWRkIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnVxcnNobCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51cXJzaHJuIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnVxc2hsIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnVxc2hybiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51cXN1YiIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51cXh0biIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51cmVjcGUiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udXJoYWRkIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnVyc2hsIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnVyc3FydGUiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udXNobCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51c2hsbCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi51c3FhZGQiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udmNvcHkubGFuZSIsCisgICJsbHZtLmFhcmNoNjQubmVvbi52Y3Z0ZnAyZnhzIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnZjdnRmcDJmeHUiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udmN2dGZwMmhmIiwKKyAgImxsdm0uYWFyY2g2NC5uZW9uLnZjdnRmeHMyZnAiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udmN2dGZ4dTJmcCIsCisgICJsbHZtLmFhcmNoNjQubmVvbi52Y3Z0aGYyZnAiLAorICAibGx2bS5hYXJjaDY0Lm5lb24udnNsaSIsCisgICJsbHZtLmFhcmNoNjQubmVvbi52c3JpIiwKKyAgImxsdm0uYWFyY2g2NC5zZGl2IiwKKyAgImxsdm0uYWFyY2g2NC5zaXNkLmZhYmQiLAorICAibGx2bS5hYXJjaDY0LnNpc2QuZmN2dHhuIiwKKyAgImxsdm0uYWFyY2g2NC5zdGx4cCIsCisgICJsbHZtLmFhcmNoNjQuc3RseHIiLAorICAibGx2bS5hYXJjaDY0LnN0eHAiLAorICAibGx2bS5hYXJjaDY0LnN0eHIiLAorICAibGx2bS5hYXJjaDY0LnVkaXYiLAorICAibGx2bS5hbWRnY24uYWxpZ25iaXQiLAorICAibGx2bS5hbWRnY24uYWxpZ25ieXRlIiwKKyAgImxsdm0uYW1kZ2NuLmF0b21pYy5kZWMiLAorICAibGx2bS5hbWRnY24uYXRvbWljLmluYyIsCisgICJsbHZtLmFtZGdjbi5icmVhayIsCisgICJsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLmFkZCIsCisgICJsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLmFuZCIsCisgICJsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLmNtcHN3YXAiLAorICAibGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy5vciIsCisgICJsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLnNtYXgiLAorICAibGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy5zbWluIiwKKyAgImxsdm0uYW1kZ2NuLmJ1ZmZlci5hdG9taWMuc3ViIiwKKyAgImxsdm0uYW1kZ2NuLmJ1ZmZlci5hdG9taWMuc3dhcCIsCisgICJsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLnVtYXgiLAorICAibGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy51bWluIiwKKyAgImxsdm0uYW1kZ2NuLmJ1ZmZlci5hdG9taWMueG9yIiwKKyAgImxsdm0uYW1kZ2NuLmJ1ZmZlci5sb2FkIiwKKyAgImxsdm0uYW1kZ2NuLmJ1ZmZlci5sb2FkLmZvcm1hdCIsCisgICJsbHZtLmFtZGdjbi5idWZmZXIuc3RvcmUiLAorICAibGx2bS5hbWRnY24uYnVmZmVyLnN0b3JlLmZvcm1hdCIsCisgICJsbHZtLmFtZGdjbi5idWZmZXIud2JpbnZsMSIsCisgICJsbHZtLmFtZGdjbi5idWZmZXIud2JpbnZsMS5zYyIsCisgICJsbHZtLmFtZGdjbi5idWZmZXIud2JpbnZsMS52b2wiLAorICAibGx2bS5hbWRnY24uY2xhc3MiLAorICAibGx2bS5hbWRnY24uY29zIiwKKyAgImxsdm0uYW1kZ2NuLmN1YmVpZCIsCisgICJsbHZtLmFtZGdjbi5jdWJlbWEiLAorICAibGx2bS5hbWRnY24uY3ViZXNjIiwKKyAgImxsdm0uYW1kZ2NuLmN1YmV0YyIsCisgICJsbHZtLmFtZGdjbi5jdnQucGsuaTE2IiwKKyAgImxsdm0uYW1kZ2NuLmN2dC5way51MTYiLAorICAibGx2bS5hbWRnY24uY3Z0LnBrLnU4LmYzMiIsCisgICJsbHZtLmFtZGdjbi5jdnQucGtub3JtLmkxNiIsCisgICJsbHZtLmFtZGdjbi5jdnQucGtub3JtLnUxNiIsCisgICJsbHZtLmFtZGdjbi5jdnQucGtydHoiLAorICAibGx2bS5hbWRnY24uZGlzcGF0Y2guaWQiLAorICAibGx2bS5hbWRnY24uZGlzcGF0Y2gucHRyIiwKKyAgImxsdm0uYW1kZ2NuLmRpdi5maXh1cCIsCisgICJsbHZtLmFtZGdjbi5kaXYuZm1hcyIsCisgICJsbHZtLmFtZGdjbi5kaXYuc2NhbGUiLAorICAibGx2bS5hbWRnY24uZHMuYnBlcm11dGUiLAorICAibGx2bS5hbWRnY24uZHMuZmFkZCIsCisgICJsbHZtLmFtZGdjbi5kcy5mbWF4IiwKKyAgImxsdm0uYW1kZ2NuLmRzLmZtaW4iLAorICAibGx2bS5hbWRnY24uZHMucGVybXV0ZSIsCisgICJsbHZtLmFtZGdjbi5kcy5zd2l6emxlIiwKKyAgImxsdm0uYW1kZ2NuLmVsc2UiLAorICAibGx2bS5hbWRnY24uZWxzZS5icmVhayIsCisgICJsbHZtLmFtZGdjbi5lbmQuY2YiLAorICAibGx2bS5hbWRnY24uZXhwIiwKKyAgImxsdm0uYW1kZ2NuLmV4cC5jb21wciIsCisgICJsbHZtLmFtZGdjbi5mY21wIiwKKyAgImxsdm0uYW1kZ2NuLmZkaXYuZmFzdCIsCisgICJsbHZtLmFtZGdjbi5mbWVkMyIsCisgICJsbHZtLmFtZGdjbi5mbXVsLmxlZ2FjeSIsCisgICJsbHZtLmFtZGdjbi5mcmFjdCIsCisgICJsbHZtLmFtZGdjbi5mcmV4cC5leHAiLAorICAibGx2bS5hbWRnY24uZnJleHAubWFudCIsCisgICJsbHZtLmFtZGdjbi5ncm91cHN0YXRpY3NpemUiLAorICAibGx2bS5hbWRnY24uaWNtcCIsCisgICJsbHZtLmFtZGdjbi5pZiIsCisgICJsbHZtLmFtZGdjbi5pZi5icmVhayIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuYWRkIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy5hbmQiLAorICAibGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLmNtcHN3YXAiLAorICAibGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLmRlYyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuaW5jIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy5vciIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuc21heCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuc21pbiIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuc3ViIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy5zd2FwIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy51bWF4IiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy51bWluIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy54b3IiLAorICAibGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmIiLAorICAibGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5iLmNsIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYi5jbC5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYi5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMuYiIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMuYi5jbCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMuYi5jbC5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5iLm8iLAorICAibGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLmNsIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5jbC5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5sIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5sLm8iLAorICAibGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLmx6IiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5sei5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuY2wiLAorICAibGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jbC5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQubCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmwubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0Lmx6IiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQubHoubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0Lm8iLAorICAibGx2bS5hbWRnY24uaW1hZ2UuZ2V0bG9kIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLmdldHJlc2luZm8iLAorICAibGx2bS5hbWRnY24uaW1hZ2UubG9hZCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5sb2FkLm1pcCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUiLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmIiLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmIuY2wiLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmIuY2wubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYi5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmIiLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuYi5jbCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5iLmNsLm8iLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuYi5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmNkIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmNkLmNsIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmNkLmNsLm8iLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuY2QubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5jbCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5jbC5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmQiLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuZC5jbCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5kLmNsLm8iLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuZC5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmwiLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMubC5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmx6IiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmx6Lm8iLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuY2QiLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmNkLmNsIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jZC5jbC5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jZC5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jbCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuY2wubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuZCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuZC5jbCIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuZC5jbC5vIiwKKyAgImxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5kLm8iLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmwiLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmwubyIsCisgICJsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUubHoiLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmx6Lm8iLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLm8iLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc3RvcmUiLAorICAibGx2bS5hbWRnY24uaW1hZ2Uuc3RvcmUubWlwIiwKKyAgImxsdm0uYW1kZ2NuLmltcGxpY2l0LmJ1ZmZlci5wdHIiLAorICAibGx2bS5hbWRnY24uaW1wbGljaXRhcmcucHRyIiwKKyAgImxsdm0uYW1kZ2NuLmluaXQuZXhlYyIsCisgICJsbHZtLmFtZGdjbi5pbml0LmV4ZWMuZnJvbS5pbnB1dCIsCisgICJsbHZtLmFtZGdjbi5pbnRlcnAubW92IiwKKyAgImxsdm0uYW1kZ2NuLmludGVycC5wMSIsCisgICJsbHZtLmFtZGdjbi5pbnRlcnAucDIiLAorICAibGx2bS5hbWRnY24ua2VybmFyZy5zZWdtZW50LnB0ciIsCisgICJsbHZtLmFtZGdjbi5raWxsIiwKKyAgImxsdm0uYW1kZ2NuLmxkZXhwIiwKKyAgImxsdm0uYW1kZ2NuLmxlcnAiLAorICAibGx2bS5hbWRnY24ubG9nLmNsYW1wIiwKKyAgImxsdm0uYW1kZ2NuLmxvb3AiLAorICAibGx2bS5hbWRnY24ubWJjbnQuaGkiLAorICAibGx2bS5hbWRnY24ubWJjbnQubG8iLAorICAibGx2bS5hbWRnY24ubW92LmRwcCIsCisgICJsbHZtLmFtZGdjbi5tcXNhZC5way51MTYudTgiLAorICAibGx2bS5hbWRnY24ubXFzYWQudTMyLnU4IiwKKyAgImxsdm0uYW1kZ2NuLm1zYWQudTgiLAorICAibGx2bS5hbWRnY24ucHMubGl2ZSIsCisgICJsbHZtLmFtZGdjbi5xc2FkLnBrLnUxNi51OCIsCisgICJsbHZtLmFtZGdjbi5xdWV1ZS5wdHIiLAorICAibGx2bS5hbWRnY24ucmNwIiwKKyAgImxsdm0uYW1kZ2NuLnJjcC5sZWdhY3kiLAorICAibGx2bS5hbWRnY24ucmVhZGZpcnN0bGFuZSIsCisgICJsbHZtLmFtZGdjbi5yZWFkbGFuZSIsCisgICJsbHZtLmFtZGdjbi5yc3EiLAorICAibGx2bS5hbWRnY24ucnNxLmNsYW1wIiwKKyAgImxsdm0uYW1kZ2NuLnJzcS5sZWdhY3kiLAorICAibGx2bS5hbWRnY24ucy5iYXJyaWVyIiwKKyAgImxsdm0uYW1kZ2NuLnMuZGNhY2hlLmludiIsCisgICJsbHZtLmFtZGdjbi5zLmRjYWNoZS5pbnYudm9sIiwKKyAgImxsdm0uYW1kZ2NuLnMuZGNhY2hlLndiIiwKKyAgImxsdm0uYW1kZ2NuLnMuZGNhY2hlLndiLnZvbCIsCisgICJsbHZtLmFtZGdjbi5zLmRlY3BlcmZsZXZlbCIsCisgICJsbHZtLmFtZGdjbi5zLmdldHBjIiwKKyAgImxsdm0uYW1kZ2NuLnMuZ2V0cmVnIiwKKyAgImxsdm0uYW1kZ2NuLnMuaW5jcGVyZmxldmVsIiwKKyAgImxsdm0uYW1kZ2NuLnMubWVtcmVhbHRpbWUiLAorICAibGx2bS5hbWRnY24ucy5tZW10aW1lIiwKKyAgImxsdm0uYW1kZ2NuLnMuc2VuZG1zZyIsCisgICJsbHZtLmFtZGdjbi5zLnNlbmRtc2doYWx0IiwKKyAgImxsdm0uYW1kZ2NuLnMuc2xlZXAiLAorICAibGx2bS5hbWRnY24ucy53YWl0Y250IiwKKyAgImxsdm0uYW1kZ2NuLnNhZC5oaS51OCIsCisgICJsbHZtLmFtZGdjbi5zYWQudTE2IiwKKyAgImxsdm0uYW1kZ2NuLnNhZC51OCIsCisgICJsbHZtLmFtZGdjbi5zYmZlIiwKKyAgImxsdm0uYW1kZ2NuLnNldC5pbmFjdGl2ZSIsCisgICJsbHZtLmFtZGdjbi5zZmZiaCIsCisgICJsbHZtLmFtZGdjbi5zaW4iLAorICAibGx2bS5hbWRnY24udGJ1ZmZlci5sb2FkIiwKKyAgImxsdm0uYW1kZ2NuLnRidWZmZXIuc3RvcmUiLAorICAibGx2bS5hbWRnY24udHJpZy5wcmVvcCIsCisgICJsbHZtLmFtZGdjbi51YmZlIiwKKyAgImxsdm0uYW1kZ2NuLnVucmVhY2hhYmxlIiwKKyAgImxsdm0uYW1kZ2NuLnVwZGF0ZS5kcHAiLAorICAibGx2bS5hbWRnY24ud2F2ZS5iYXJyaWVyIiwKKyAgImxsdm0uYW1kZ2NuLndvcmtncm91cC5pZC54IiwKKyAgImxsdm0uYW1kZ2NuLndvcmtncm91cC5pZC55IiwKKyAgImxsdm0uYW1kZ2NuLndvcmtncm91cC5pZC56IiwKKyAgImxsdm0uYW1kZ2NuLndvcmtpdGVtLmlkLngiLAorICAibGx2bS5hbWRnY24ud29ya2l0ZW0uaWQueSIsCisgICJsbHZtLmFtZGdjbi53b3JraXRlbS5pZC56IiwKKyAgImxsdm0uYW1kZ2NuLndxbSIsCisgICJsbHZtLmFtZGdjbi53cW0udm90ZSIsCisgICJsbHZtLmFtZGdjbi53cml0ZWxhbmUiLAorICAibGx2bS5hbWRnY24ud3dtIiwKKyAgImxsdm0uYXJtLmNkcCIsCisgICJsbHZtLmFybS5jZHAyIiwKKyAgImxsdm0uYXJtLmNscmV4IiwKKyAgImxsdm0uYXJtLmNyYzMyYiIsCisgICJsbHZtLmFybS5jcmMzMmNiIiwKKyAgImxsdm0uYXJtLmNyYzMyY2giLAorICAibGx2bS5hcm0uY3JjMzJjdyIsCisgICJsbHZtLmFybS5jcmMzMmgiLAorICAibGx2bS5hcm0uY3JjMzJ3IiwKKyAgImxsdm0uYXJtLmRiZyIsCisgICJsbHZtLmFybS5kbWIiLAorICAibGx2bS5hcm0uZHNiIiwKKyAgImxsdm0uYXJtLmdldC5mcHNjciIsCisgICJsbHZtLmFybS5oaW50IiwKKyAgImxsdm0uYXJtLmlzYiIsCisgICJsbHZtLmFybS5sZGFleCIsCisgICJsbHZtLmFybS5sZGFleGQiLAorICAibGx2bS5hcm0ubGRjIiwKKyAgImxsdm0uYXJtLmxkYzIiLAorICAibGx2bS5hcm0ubGRjMmwiLAorICAibGx2bS5hcm0ubGRjbCIsCisgICJsbHZtLmFybS5sZHJleCIsCisgICJsbHZtLmFybS5sZHJleGQiLAorICAibGx2bS5hcm0ubWNyIiwKKyAgImxsdm0uYXJtLm1jcjIiLAorICAibGx2bS5hcm0ubWNyciIsCisgICJsbHZtLmFybS5tY3JyMiIsCisgICJsbHZtLmFybS5tcmMiLAorICAibGx2bS5hcm0ubXJjMiIsCisgICJsbHZtLmFybS5tcnJjIiwKKyAgImxsdm0uYXJtLm1ycmMyIiwKKyAgImxsdm0uYXJtLm5lb24uYWVzZCIsCisgICJsbHZtLmFybS5uZW9uLmFlc2UiLAorICAibGx2bS5hcm0ubmVvbi5hZXNpbWMiLAorICAibGx2bS5hcm0ubmVvbi5hZXNtYyIsCisgICJsbHZtLmFybS5uZW9uLnNoYTFjIiwKKyAgImxsdm0uYXJtLm5lb24uc2hhMWgiLAorICAibGx2bS5hcm0ubmVvbi5zaGExbSIsCisgICJsbHZtLmFybS5uZW9uLnNoYTFwIiwKKyAgImxsdm0uYXJtLm5lb24uc2hhMXN1MCIsCisgICJsbHZtLmFybS5uZW9uLnNoYTFzdTEiLAorICAibGx2bS5hcm0ubmVvbi5zaGEyNTZoIiwKKyAgImxsdm0uYXJtLm5lb24uc2hhMjU2aDIiLAorICAibGx2bS5hcm0ubmVvbi5zaGEyNTZzdTAiLAorICAibGx2bS5hcm0ubmVvbi5zaGEyNTZzdTEiLAorICAibGx2bS5hcm0ubmVvbi52YWJkcyIsCisgICJsbHZtLmFybS5uZW9uLnZhYmR1IiwKKyAgImxsdm0uYXJtLm5lb24udmFicyIsCisgICJsbHZtLmFybS5uZW9uLnZhY2dlIiwKKyAgImxsdm0uYXJtLm5lb24udmFjZ3QiLAorICAibGx2bS5hcm0ubmVvbi52YnNsIiwKKyAgImxsdm0uYXJtLm5lb24udmNscyIsCisgICJsbHZtLmFybS5uZW9uLnZjdnRhcyIsCisgICJsbHZtLmFybS5uZW9uLnZjdnRhdSIsCisgICJsbHZtLmFybS5uZW9uLnZjdnRmcDJmeHMiLAorICAibGx2bS5hcm0ubmVvbi52Y3Z0ZnAyZnh1IiwKKyAgImxsdm0uYXJtLm5lb24udmN2dGZwMmhmIiwKKyAgImxsdm0uYXJtLm5lb24udmN2dGZ4czJmcCIsCisgICJsbHZtLmFybS5uZW9uLnZjdnRmeHUyZnAiLAorICAibGx2bS5hcm0ubmVvbi52Y3Z0aGYyZnAiLAorICAibGx2bS5hcm0ubmVvbi52Y3Z0bXMiLAorICAibGx2bS5hcm0ubmVvbi52Y3Z0bXUiLAorICAibGx2bS5hcm0ubmVvbi52Y3Z0bnMiLAorICAibGx2bS5hcm0ubmVvbi52Y3Z0bnUiLAorICAibGx2bS5hcm0ubmVvbi52Y3Z0cHMiLAorICAibGx2bS5hcm0ubmVvbi52Y3Z0cHUiLAorICAibGx2bS5hcm0ubmVvbi52aGFkZHMiLAorICAibGx2bS5hcm0ubmVvbi52aGFkZHUiLAorICAibGx2bS5hcm0ubmVvbi52aHN1YnMiLAorICAibGx2bS5hcm0ubmVvbi52aHN1YnUiLAorICAibGx2bS5hcm0ubmVvbi52bGQxIiwKKyAgImxsdm0uYXJtLm5lb24udmxkMiIsCisgICJsbHZtLmFybS5uZW9uLnZsZDJsYW5lIiwKKyAgImxsdm0uYXJtLm5lb24udmxkMyIsCisgICJsbHZtLmFybS5uZW9uLnZsZDNsYW5lIiwKKyAgImxsdm0uYXJtLm5lb24udmxkNCIsCisgICJsbHZtLmFybS5uZW9uLnZsZDRsYW5lIiwKKyAgImxsdm0uYXJtLm5lb24udm1heG5tIiwKKyAgImxsdm0uYXJtLm5lb24udm1heHMiLAorICAibGx2bS5hcm0ubmVvbi52bWF4dSIsCisgICJsbHZtLmFybS5uZW9uLnZtaW5ubSIsCisgICJsbHZtLmFybS5uZW9uLnZtaW5zIiwKKyAgImxsdm0uYXJtLm5lb24udm1pbnUiLAorICAibGx2bS5hcm0ubmVvbi52bXVsbHAiLAorICAibGx2bS5hcm0ubmVvbi52bXVsbHMiLAorICAibGx2bS5hcm0ubmVvbi52bXVsbHUiLAorICAibGx2bS5hcm0ubmVvbi52bXVscCIsCisgICJsbHZtLmFybS5uZW9uLnZwYWRhbHMiLAorICAibGx2bS5hcm0ubmVvbi52cGFkYWx1IiwKKyAgImxsdm0uYXJtLm5lb24udnBhZGQiLAorICAibGx2bS5hcm0ubmVvbi52cGFkZGxzIiwKKyAgImxsdm0uYXJtLm5lb24udnBhZGRsdSIsCisgICJsbHZtLmFybS5uZW9uLnZwbWF4cyIsCisgICJsbHZtLmFybS5uZW9uLnZwbWF4dSIsCisgICJsbHZtLmFybS5uZW9uLnZwbWlucyIsCisgICJsbHZtLmFybS5uZW9uLnZwbWludSIsCisgICJsbHZtLmFybS5uZW9uLnZxYWJzIiwKKyAgImxsdm0uYXJtLm5lb24udnFhZGRzIiwKKyAgImxsdm0uYXJtLm5lb24udnFhZGR1IiwKKyAgImxsdm0uYXJtLm5lb24udnFkbXVsaCIsCisgICJsbHZtLmFybS5uZW9uLnZxZG11bGwiLAorICAibGx2bS5hcm0ubmVvbi52cW1vdm5zIiwKKyAgImxsdm0uYXJtLm5lb24udnFtb3Zuc3UiLAorICAibGx2bS5hcm0ubmVvbi52cW1vdm51IiwKKyAgImxsdm0uYXJtLm5lb24udnFuZWciLAorICAibGx2bS5hcm0ubmVvbi52cXJkbXVsaCIsCisgICJsbHZtLmFybS5uZW9uLnZxcnNoaWZ0bnMiLAorICAibGx2bS5hcm0ubmVvbi52cXJzaGlmdG5zdSIsCisgICJsbHZtLmFybS5uZW9uLnZxcnNoaWZ0bnUiLAorICAibGx2bS5hcm0ubmVvbi52cXJzaGlmdHMiLAorICAibGx2bS5hcm0ubmVvbi52cXJzaGlmdHUiLAorICAibGx2bS5hcm0ubmVvbi52cXNoaWZ0bnMiLAorICAibGx2bS5hcm0ubmVvbi52cXNoaWZ0bnN1IiwKKyAgImxsdm0uYXJtLm5lb24udnFzaGlmdG51IiwKKyAgImxsdm0uYXJtLm5lb24udnFzaGlmdHMiLAorICAibGx2bS5hcm0ubmVvbi52cXNoaWZ0c3UiLAorICAibGx2bS5hcm0ubmVvbi52cXNoaWZ0dSIsCisgICJsbHZtLmFybS5uZW9uLnZxc3VicyIsCisgICJsbHZtLmFybS5uZW9uLnZxc3VidSIsCisgICJsbHZtLmFybS5uZW9uLnZyYWRkaG4iLAorICAibGx2bS5hcm0ubmVvbi52cmVjcGUiLAorICAibGx2bS5hcm0ubmVvbi52cmVjcHMiLAorICAibGx2bS5hcm0ubmVvbi52cmhhZGRzIiwKKyAgImxsdm0uYXJtLm5lb24udnJoYWRkdSIsCisgICJsbHZtLmFybS5uZW9uLnZyaW50YSIsCisgICJsbHZtLmFybS5uZW9uLnZyaW50bSIsCisgICJsbHZtLmFybS5uZW9uLnZyaW50biIsCisgICJsbHZtLmFybS5uZW9uLnZyaW50cCIsCisgICJsbHZtLmFybS5uZW9uLnZyaW50eCIsCisgICJsbHZtLmFybS5uZW9uLnZyaW50eiIsCisgICJsbHZtLmFybS5uZW9uLnZyc2hpZnRuIiwKKyAgImxsdm0uYXJtLm5lb24udnJzaGlmdHMiLAorICAibGx2bS5hcm0ubmVvbi52cnNoaWZ0dSIsCisgICJsbHZtLmFybS5uZW9uLnZyc3FydGUiLAorICAibGx2bS5hcm0ubmVvbi52cnNxcnRzIiwKKyAgImxsdm0uYXJtLm5lb24udnJzdWJobiIsCisgICJsbHZtLmFybS5uZW9uLnZzaGlmdGlucyIsCisgICJsbHZtLmFybS5uZW9uLnZzaGlmdHMiLAorICAibGx2bS5hcm0ubmVvbi52c2hpZnR1IiwKKyAgImxsdm0uYXJtLm5lb24udnN0MSIsCisgICJsbHZtLmFybS5uZW9uLnZzdDIiLAorICAibGx2bS5hcm0ubmVvbi52c3QybGFuZSIsCisgICJsbHZtLmFybS5uZW9uLnZzdDMiLAorICAibGx2bS5hcm0ubmVvbi52c3QzbGFuZSIsCisgICJsbHZtLmFybS5uZW9uLnZzdDQiLAorICAibGx2bS5hcm0ubmVvbi52c3Q0bGFuZSIsCisgICJsbHZtLmFybS5uZW9uLnZ0YmwxIiwKKyAgImxsdm0uYXJtLm5lb24udnRibDIiLAorICAibGx2bS5hcm0ubmVvbi52dGJsMyIsCisgICJsbHZtLmFybS5uZW9uLnZ0Ymw0IiwKKyAgImxsdm0uYXJtLm5lb24udnRieDEiLAorICAibGx2bS5hcm0ubmVvbi52dGJ4MiIsCisgICJsbHZtLmFybS5uZW9uLnZ0YngzIiwKKyAgImxsdm0uYXJtLm5lb24udnRieDQiLAorICAibGx2bS5hcm0ucWFkZCIsCisgICJsbHZtLmFybS5xYWRkMTYiLAorICAibGx2bS5hcm0ucWFkZDgiLAorICAibGx2bS5hcm0ucWFzeCIsCisgICJsbHZtLmFybS5xc2F4IiwKKyAgImxsdm0uYXJtLnFzdWIiLAorICAibGx2bS5hcm0ucXN1YjE2IiwKKyAgImxsdm0uYXJtLnFzdWI4IiwKKyAgImxsdm0uYXJtLnNhZGQxNiIsCisgICJsbHZtLmFybS5zYWRkOCIsCisgICJsbHZtLmFybS5zYXN4IiwKKyAgImxsdm0uYXJtLnNlbCIsCisgICJsbHZtLmFybS5zZXQuZnBzY3IiLAorICAibGx2bS5hcm0uc2hhZGQxNiIsCisgICJsbHZtLmFybS5zaGFkZDgiLAorICAibGx2bS5hcm0uc2hhc3giLAorICAibGx2bS5hcm0uc2hzYXgiLAorICAibGx2bS5hcm0uc2hzdWIxNiIsCisgICJsbHZtLmFybS5zaHN1YjgiLAorICAibGx2bS5hcm0uc21sYWJiIiwKKyAgImxsdm0uYXJtLnNtbGFidCIsCisgICJsbHZtLmFybS5zbWxhZCIsCisgICJsbHZtLmFybS5zbWxhZHgiLAorICAibGx2bS5hcm0uc21sYWxkIiwKKyAgImxsdm0uYXJtLnNtbGFsZHgiLAorICAibGx2bS5hcm0uc21sYXRiIiwKKyAgImxsdm0uYXJtLnNtbGF0dCIsCisgICJsbHZtLmFybS5zbWxhd2IiLAorICAibGx2bS5hcm0uc21sYXd0IiwKKyAgImxsdm0uYXJtLnNtbHNkIiwKKyAgImxsdm0uYXJtLnNtbHNkeCIsCisgICJsbHZtLmFybS5zbWxzbGQiLAorICAibGx2bS5hcm0uc21sc2xkeCIsCisgICJsbHZtLmFybS5zbXVhZCIsCisgICJsbHZtLmFybS5zbXVhZHgiLAorICAibGx2bS5hcm0uc211bGJiIiwKKyAgImxsdm0uYXJtLnNtdWxidCIsCisgICJsbHZtLmFybS5zbXVsdGIiLAorICAibGx2bS5hcm0uc211bHR0IiwKKyAgImxsdm0uYXJtLnNtdWx3YiIsCisgICJsbHZtLmFybS5zbXVsd3QiLAorICAibGx2bS5hcm0uc211c2QiLAorICAibGx2bS5hcm0uc211c2R4IiwKKyAgImxsdm0uYXJtLnNwYWNlIiwKKyAgImxsdm0uYXJtLnNzYXQiLAorICAibGx2bS5hcm0uc3NhdDE2IiwKKyAgImxsdm0uYXJtLnNzYXgiLAorICAibGx2bS5hcm0uc3N1YjE2IiwKKyAgImxsdm0uYXJtLnNzdWI4IiwKKyAgImxsdm0uYXJtLnN0YyIsCisgICJsbHZtLmFybS5zdGMyIiwKKyAgImxsdm0uYXJtLnN0YzJsIiwKKyAgImxsdm0uYXJtLnN0Y2wiLAorICAibGx2bS5hcm0uc3RsZXgiLAorICAibGx2bS5hcm0uc3RsZXhkIiwKKyAgImxsdm0uYXJtLnN0cmV4IiwKKyAgImxsdm0uYXJtLnN0cmV4ZCIsCisgICJsbHZtLmFybS5zeHRhYjE2IiwKKyAgImxsdm0uYXJtLnN4dGIxNiIsCisgICJsbHZtLmFybS51YWRkMTYiLAorICAibGx2bS5hcm0udWFkZDgiLAorICAibGx2bS5hcm0udWFzeCIsCisgICJsbHZtLmFybS51aGFkZDE2IiwKKyAgImxsdm0uYXJtLnVoYWRkOCIsCisgICJsbHZtLmFybS51aGFzeCIsCisgICJsbHZtLmFybS51aHNheCIsCisgICJsbHZtLmFybS51aHN1YjE2IiwKKyAgImxsdm0uYXJtLnVoc3ViOCIsCisgICJsbHZtLmFybS51bmRlZmluZWQiLAorICAibGx2bS5hcm0udXFhZGQxNiIsCisgICJsbHZtLmFybS51cWFkZDgiLAorICAibGx2bS5hcm0udXFhc3giLAorICAibGx2bS5hcm0udXFzYXgiLAorICAibGx2bS5hcm0udXFzdWIxNiIsCisgICJsbHZtLmFybS51cXN1YjgiLAorICAibGx2bS5hcm0udXNhZDgiLAorICAibGx2bS5hcm0udXNhZGE4IiwKKyAgImxsdm0uYXJtLnVzYXQiLAorICAibGx2bS5hcm0udXNhdDE2IiwKKyAgImxsdm0uYXJtLnVzYXgiLAorICAibGx2bS5hcm0udXN1YjE2IiwKKyAgImxsdm0uYXJtLnVzdWI4IiwKKyAgImxsdm0uYXJtLnV4dGFiMTYiLAorICAibGx2bS5hcm0udXh0YjE2IiwKKyAgImxsdm0uYXJtLnZjdnRyIiwKKyAgImxsdm0uYXJtLnZjdnRydSIsCisgICJsbHZtLmJwZi5sb2FkLmJ5dGUiLAorICAibGx2bS5icGYubG9hZC5oYWxmIiwKKyAgImxsdm0uYnBmLmxvYWQud29yZCIsCisgICJsbHZtLmJwZi5wc2V1ZG8iLAorICAibGx2bS5oZXhhZ29uLkEyLmFicyIsCisgICJsbHZtLmhleGFnb24uQTIuYWJzcCIsCisgICJsbHZtLmhleGFnb24uQTIuYWJzc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5BMi5hZGQiLAorICAibGx2bS5oZXhhZ29uLkEyLmFkZGguaDE2LmhoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5hZGRoLmgxNi5obCIsCisgICJsbHZtLmhleGFnb24uQTIuYWRkaC5oMTYubGgiLAorICAibGx2bS5oZXhhZ29uLkEyLmFkZGguaDE2LmxsIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5hZGRoLmgxNi5zYXQuaGgiLAorICAibGx2bS5oZXhhZ29uLkEyLmFkZGguaDE2LnNhdC5obCIsCisgICJsbHZtLmhleGFnb24uQTIuYWRkaC5oMTYuc2F0LmxoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5hZGRoLmgxNi5zYXQubGwiLAorICAibGx2bS5oZXhhZ29uLkEyLmFkZGgubDE2LmhsIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5hZGRoLmwxNi5sbCIsCisgICJsbHZtLmhleGFnb24uQTIuYWRkaC5sMTYuc2F0LmhsIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5hZGRoLmwxNi5zYXQubGwiLAorICAibGx2bS5oZXhhZ29uLkEyLmFkZGkiLAorICAibGx2bS5oZXhhZ29uLkEyLmFkZHAiLAorICAibGx2bS5oZXhhZ29uLkEyLmFkZHBzYXQiLAorICAibGx2bS5oZXhhZ29uLkEyLmFkZHNhdCIsCisgICJsbHZtLmhleGFnb24uQTIuYWRkc3AiLAorICAibGx2bS5oZXhhZ29uLkEyLmFuZCIsCisgICJsbHZtLmhleGFnb24uQTIuYW5kaXIiLAorICAibGx2bS5oZXhhZ29uLkEyLmFuZHAiLAorICAibGx2bS5oZXhhZ29uLkEyLmFzbGgiLAorICAibGx2bS5oZXhhZ29uLkEyLmFzcmgiLAorICAibGx2bS5oZXhhZ29uLkEyLmNvbWJpbmUuaGgiLAorICAibGx2bS5oZXhhZ29uLkEyLmNvbWJpbmUuaGwiLAorICAibGx2bS5oZXhhZ29uLkEyLmNvbWJpbmUubGgiLAorICAibGx2bS5oZXhhZ29uLkEyLmNvbWJpbmUubGwiLAorICAibGx2bS5oZXhhZ29uLkEyLmNvbWJpbmVpaSIsCisgICJsbHZtLmhleGFnb24uQTIuY29tYmluZXciLAorICAibGx2bS5oZXhhZ29uLkEyLm1heCIsCisgICJsbHZtLmhleGFnb24uQTIubWF4cCIsCisgICJsbHZtLmhleGFnb24uQTIubWF4dSIsCisgICJsbHZtLmhleGFnb24uQTIubWF4dXAiLAorICAibGx2bS5oZXhhZ29uLkEyLm1pbiIsCisgICJsbHZtLmhleGFnb24uQTIubWlucCIsCisgICJsbHZtLmhleGFnb24uQTIubWludSIsCisgICJsbHZtLmhleGFnb24uQTIubWludXAiLAorICAibGx2bS5oZXhhZ29uLkEyLm5lZyIsCisgICJsbHZtLmhleGFnb24uQTIubmVncCIsCisgICJsbHZtLmhleGFnb24uQTIubmVnc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5BMi5ub3QiLAorICAibGx2bS5oZXhhZ29uLkEyLm5vdHAiLAorICAibGx2bS5oZXhhZ29uLkEyLm9yIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5vcmlyIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5vcnAiLAorICAibGx2bS5oZXhhZ29uLkEyLnJvdW5kc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zYXQiLAorICAibGx2bS5oZXhhZ29uLkEyLnNhdGIiLAorICAibGx2bS5oZXhhZ29uLkEyLnNhdGgiLAorICAibGx2bS5oZXhhZ29uLkEyLnNhdHViIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zYXR1aCIsCisgICJsbHZtLmhleGFnb24uQTIuc3ViIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zdWJoLmgxNi5oaCIsCisgICJsbHZtLmhleGFnb24uQTIuc3ViaC5oMTYuaGwiLAorICAibGx2bS5oZXhhZ29uLkEyLnN1YmguaDE2LmxoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zdWJoLmgxNi5sbCIsCisgICJsbHZtLmhleGFnb24uQTIuc3ViaC5oMTYuc2F0LmhoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zdWJoLmgxNi5zYXQuaGwiLAorICAibGx2bS5oZXhhZ29uLkEyLnN1YmguaDE2LnNhdC5saCIsCisgICJsbHZtLmhleGFnb24uQTIuc3ViaC5oMTYuc2F0LmxsIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zdWJoLmwxNi5obCIsCisgICJsbHZtLmhleGFnb24uQTIuc3ViaC5sMTYubGwiLAorICAibGx2bS5oZXhhZ29uLkEyLnN1YmgubDE2LnNhdC5obCIsCisgICJsbHZtLmhleGFnb24uQTIuc3ViaC5sMTYuc2F0LmxsIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zdWJwIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zdWJyaSIsCisgICJsbHZtLmhleGFnb24uQTIuc3Vic2F0IiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zdmFkZGgiLAorICAibGx2bS5oZXhhZ29uLkEyLnN2YWRkaHMiLAorICAibGx2bS5oZXhhZ29uLkEyLnN2YWRkdWhzIiwKKyAgImxsdm0uaGV4YWdvbi5BMi5zdmF2Z2giLAorICAibGx2bS5oZXhhZ29uLkEyLnN2YXZnaHMiLAorICAibGx2bS5oZXhhZ29uLkEyLnN2bmF2Z2giLAorICAibGx2bS5oZXhhZ29uLkEyLnN2c3ViaCIsCisgICJsbHZtLmhleGFnb24uQTIuc3ZzdWJocyIsCisgICJsbHZtLmhleGFnb24uQTIuc3ZzdWJ1aHMiLAorICAibGx2bS5oZXhhZ29uLkEyLnN3aXoiLAorICAibGx2bS5oZXhhZ29uLkEyLnN4dGIiLAorICAibGx2bS5oZXhhZ29uLkEyLnN4dGgiLAorICAibGx2bS5oZXhhZ29uLkEyLnN4dHciLAorICAibGx2bS5oZXhhZ29uLkEyLnRmciIsCisgICJsbHZtLmhleGFnb24uQTIudGZyaWgiLAorICAibGx2bS5oZXhhZ29uLkEyLnRmcmlsIiwKKyAgImxsdm0uaGV4YWdvbi5BMi50ZnJwIiwKKyAgImxsdm0uaGV4YWdvbi5BMi50ZnJwaSIsCisgICJsbHZtLmhleGFnb24uQTIudGZyc2kiLAorICAibGx2bS5oZXhhZ29uLkEyLnZhYnNoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52YWJzaHNhdCIsCisgICJsbHZtLmhleGFnb24uQTIudmFic3ciLAorICAibGx2bS5oZXhhZ29uLkEyLnZhYnN3c2F0IiwKKyAgImxsdm0uaGV4YWdvbi5BMi52YWRkYi5tYXAiLAorICAibGx2bS5oZXhhZ29uLkEyLnZhZGRoIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52YWRkaHMiLAorICAibGx2bS5oZXhhZ29uLkEyLnZhZGR1YiIsCisgICJsbHZtLmhleGFnb24uQTIudmFkZHVicyIsCisgICJsbHZtLmhleGFnb24uQTIudmFkZHVocyIsCisgICJsbHZtLmhleGFnb24uQTIudmFkZHciLAorICAibGx2bS5oZXhhZ29uLkEyLnZhZGR3cyIsCisgICJsbHZtLmhleGFnb24uQTIudmF2Z2giLAorICAibGx2bS5oZXhhZ29uLkEyLnZhdmdoY3IiLAorICAibGx2bS5oZXhhZ29uLkEyLnZhdmdociIsCisgICJsbHZtLmhleGFnb24uQTIudmF2Z3ViIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52YXZndWJyIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52YXZndWgiLAorICAibGx2bS5oZXhhZ29uLkEyLnZhdmd1aHIiLAorICAibGx2bS5oZXhhZ29uLkEyLnZhdmd1dyIsCisgICJsbHZtLmhleGFnb24uQTIudmF2Z3V3ciIsCisgICJsbHZtLmhleGFnb24uQTIudmF2Z3ciLAorICAibGx2bS5oZXhhZ29uLkEyLnZhdmd3Y3IiLAorICAibGx2bS5oZXhhZ29uLkEyLnZhdmd3ciIsCisgICJsbHZtLmhleGFnb24uQTIudmNtcGJlcSIsCisgICJsbHZtLmhleGFnb24uQTIudmNtcGJndHUiLAorICAibGx2bS5oZXhhZ29uLkEyLnZjbXBoZXEiLAorICAibGx2bS5oZXhhZ29uLkEyLnZjbXBoZ3QiLAorICAibGx2bS5oZXhhZ29uLkEyLnZjbXBoZ3R1IiwKKyAgImxsdm0uaGV4YWdvbi5BMi52Y21wd2VxIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52Y21wd2d0IiwKKyAgImxsdm0uaGV4YWdvbi5BMi52Y21wd2d0dSIsCisgICJsbHZtLmhleGFnb24uQTIudmNvbmoiLAorICAibGx2bS5oZXhhZ29uLkEyLnZtYXhiIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52bWF4aCIsCisgICJsbHZtLmhleGFnb24uQTIudm1heHViIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52bWF4dWgiLAorICAibGx2bS5oZXhhZ29uLkEyLnZtYXh1dyIsCisgICJsbHZtLmhleGFnb24uQTIudm1heHciLAorICAibGx2bS5oZXhhZ29uLkEyLnZtaW5iIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52bWluaCIsCisgICJsbHZtLmhleGFnb24uQTIudm1pbnViIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52bWludWgiLAorICAibGx2bS5oZXhhZ29uLkEyLnZtaW51dyIsCisgICJsbHZtLmhleGFnb24uQTIudm1pbnciLAorICAibGx2bS5oZXhhZ29uLkEyLnZuYXZnaCIsCisgICJsbHZtLmhleGFnb24uQTIudm5hdmdoY3IiLAorICAibGx2bS5oZXhhZ29uLkEyLnZuYXZnaHIiLAorICAibGx2bS5oZXhhZ29uLkEyLnZuYXZndyIsCisgICJsbHZtLmhleGFnb24uQTIudm5hdmd3Y3IiLAorICAibGx2bS5oZXhhZ29uLkEyLnZuYXZnd3IiLAorICAibGx2bS5oZXhhZ29uLkEyLnZyYWRkdWIiLAorICAibGx2bS5oZXhhZ29uLkEyLnZyYWRkdWIuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52cnNhZHViIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52cnNhZHViLmFjYyIsCisgICJsbHZtLmhleGFnb24uQTIudnN1YmIubWFwIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52c3ViaCIsCisgICJsbHZtLmhleGFnb24uQTIudnN1YmhzIiwKKyAgImxsdm0uaGV4YWdvbi5BMi52c3VidWIiLAorICAibGx2bS5oZXhhZ29uLkEyLnZzdWJ1YnMiLAorICAibGx2bS5oZXhhZ29uLkEyLnZzdWJ1aHMiLAorICAibGx2bS5oZXhhZ29uLkEyLnZzdWJ3IiwKKyAgImxsdm0uaGV4YWdvbi5BMi52c3Vid3MiLAorICAibGx2bS5oZXhhZ29uLkEyLnhvciIsCisgICJsbHZtLmhleGFnb24uQTIueG9ycCIsCisgICJsbHZtLmhleGFnb24uQTIuenh0YiIsCisgICJsbHZtLmhleGFnb24uQTIuenh0aCIsCisgICJsbHZtLmhleGFnb24uQTQuYW5kbiIsCisgICJsbHZtLmhleGFnb24uQTQuYW5kbnAiLAorICAibGx2bS5oZXhhZ29uLkE0LmJpdHNwbGl0IiwKKyAgImxsdm0uaGV4YWdvbi5BNC5iaXRzcGxpdGkiLAorICAibGx2bS5oZXhhZ29uLkE0LmJvdW5kc2NoZWNrIiwKKyAgImxsdm0uaGV4YWdvbi5BNC5jbXBiZXEiLAorICAibGx2bS5oZXhhZ29uLkE0LmNtcGJlcWkiLAorICAibGx2bS5oZXhhZ29uLkE0LmNtcGJndCIsCisgICJsbHZtLmhleGFnb24uQTQuY21wYmd0aSIsCisgICJsbHZtLmhleGFnb24uQTQuY21wYmd0dSIsCisgICJsbHZtLmhleGFnb24uQTQuY21wYmd0dWkiLAorICAibGx2bS5oZXhhZ29uLkE0LmNtcGhlcSIsCisgICJsbHZtLmhleGFnb24uQTQuY21waGVxaSIsCisgICJsbHZtLmhleGFnb24uQTQuY21waGd0IiwKKyAgImxsdm0uaGV4YWdvbi5BNC5jbXBoZ3RpIiwKKyAgImxsdm0uaGV4YWdvbi5BNC5jbXBoZ3R1IiwKKyAgImxsdm0uaGV4YWdvbi5BNC5jbXBoZ3R1aSIsCisgICJsbHZtLmhleGFnb24uQTQuY29tYmluZWlyIiwKKyAgImxsdm0uaGV4YWdvbi5BNC5jb21iaW5lcmkiLAorICAibGx2bS5oZXhhZ29uLkE0LmNyb3VuZC5yaSIsCisgICJsbHZtLmhleGFnb24uQTQuY3JvdW5kLnJyIiwKKyAgImxsdm0uaGV4YWdvbi5BNC5tb2R3cmFwdSIsCisgICJsbHZtLmhleGFnb24uQTQub3JuIiwKKyAgImxsdm0uaGV4YWdvbi5BNC5vcm5wIiwKKyAgImxsdm0uaGV4YWdvbi5BNC5yY21wZXEiLAorICAibGx2bS5oZXhhZ29uLkE0LnJjbXBlcWkiLAorICAibGx2bS5oZXhhZ29uLkE0LnJjbXBuZXEiLAorICAibGx2bS5oZXhhZ29uLkE0LnJjbXBuZXFpIiwKKyAgImxsdm0uaGV4YWdvbi5BNC5yb3VuZC5yaSIsCisgICJsbHZtLmhleGFnb24uQTQucm91bmQucmkuc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5BNC5yb3VuZC5yciIsCisgICJsbHZtLmhleGFnb24uQTQucm91bmQucnIuc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5BNC50bGJtYXRjaCIsCisgICJsbHZtLmhleGFnb24uQTQudmNtcGJlcS5hbnkiLAorICAibGx2bS5oZXhhZ29uLkE0LnZjbXBiZXFpIiwKKyAgImxsdm0uaGV4YWdvbi5BNC52Y21wYmd0IiwKKyAgImxsdm0uaGV4YWdvbi5BNC52Y21wYmd0aSIsCisgICJsbHZtLmhleGFnb24uQTQudmNtcGJndHVpIiwKKyAgImxsdm0uaGV4YWdvbi5BNC52Y21waGVxaSIsCisgICJsbHZtLmhleGFnb24uQTQudmNtcGhndGkiLAorICAibGx2bS5oZXhhZ29uLkE0LnZjbXBoZ3R1aSIsCisgICJsbHZtLmhleGFnb24uQTQudmNtcHdlcWkiLAorICAibGx2bS5oZXhhZ29uLkE0LnZjbXB3Z3RpIiwKKyAgImxsdm0uaGV4YWdvbi5BNC52Y21wd2d0dWkiLAorICAibGx2bS5oZXhhZ29uLkE0LnZybWF4aCIsCisgICJsbHZtLmhleGFnb24uQTQudnJtYXh1aCIsCisgICJsbHZtLmhleGFnb24uQTQudnJtYXh1dyIsCisgICJsbHZtLmhleGFnb24uQTQudnJtYXh3IiwKKyAgImxsdm0uaGV4YWdvbi5BNC52cm1pbmgiLAorICAibGx2bS5oZXhhZ29uLkE0LnZybWludWgiLAorICAibGx2bS5oZXhhZ29uLkE0LnZybWludXciLAorICAibGx2bS5oZXhhZ29uLkE0LnZybWludyIsCisgICJsbHZtLmhleGFnb24uQTUudmFkZGh1YnMiLAorICAibGx2bS5oZXhhZ29uLkE2LnZjbXBiZXEubm90YW55IiwKKyAgImxsdm0uaGV4YWdvbi5BNi52Y21wYmVxLm5vdGFueS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5DMi5hbGw4IiwKKyAgImxsdm0uaGV4YWdvbi5DMi5hbmQiLAorICAibGx2bS5oZXhhZ29uLkMyLmFuZG4iLAorICAibGx2bS5oZXhhZ29uLkMyLmFueTgiLAorICAibGx2bS5oZXhhZ29uLkMyLmJpdHNjbHIiLAorICAibGx2bS5oZXhhZ29uLkMyLmJpdHNjbHJpIiwKKyAgImxsdm0uaGV4YWdvbi5DMi5iaXRzc2V0IiwKKyAgImxsdm0uaGV4YWdvbi5DMi5jbXBlcSIsCisgICJsbHZtLmhleGFnb24uQzIuY21wZXFpIiwKKyAgImxsdm0uaGV4YWdvbi5DMi5jbXBlcXAiLAorICAibGx2bS5oZXhhZ29uLkMyLmNtcGdlaSIsCisgICJsbHZtLmhleGFnb24uQzIuY21wZ2V1aSIsCisgICJsbHZtLmhleGFnb24uQzIuY21wZ3QiLAorICAibGx2bS5oZXhhZ29uLkMyLmNtcGd0aSIsCisgICJsbHZtLmhleGFnb24uQzIuY21wZ3RwIiwKKyAgImxsdm0uaGV4YWdvbi5DMi5jbXBndHUiLAorICAibGx2bS5oZXhhZ29uLkMyLmNtcGd0dWkiLAorICAibGx2bS5oZXhhZ29uLkMyLmNtcGd0dXAiLAorICAibGx2bS5oZXhhZ29uLkMyLmNtcGx0IiwKKyAgImxsdm0uaGV4YWdvbi5DMi5jbXBsdHUiLAorICAibGx2bS5oZXhhZ29uLkMyLm1hc2siLAorICAibGx2bS5oZXhhZ29uLkMyLm11eCIsCisgICJsbHZtLmhleGFnb24uQzIubXV4aWkiLAorICAibGx2bS5oZXhhZ29uLkMyLm11eGlyIiwKKyAgImxsdm0uaGV4YWdvbi5DMi5tdXhyaSIsCisgICJsbHZtLmhleGFnb24uQzIubm90IiwKKyAgImxsdm0uaGV4YWdvbi5DMi5vciIsCisgICJsbHZtLmhleGFnb24uQzIub3JuIiwKKyAgImxsdm0uaGV4YWdvbi5DMi5weGZlci5tYXAiLAorICAibGx2bS5oZXhhZ29uLkMyLnRmcnByIiwKKyAgImxsdm0uaGV4YWdvbi5DMi50ZnJycCIsCisgICJsbHZtLmhleGFnb24uQzIudml0cGFjayIsCisgICJsbHZtLmhleGFnb24uQzIudm11eCIsCisgICJsbHZtLmhleGFnb24uQzIueG9yIiwKKyAgImxsdm0uaGV4YWdvbi5DNC5hbmQuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5DNC5hbmQuYW5kbiIsCisgICJsbHZtLmhleGFnb24uQzQuYW5kLm9yIiwKKyAgImxsdm0uaGV4YWdvbi5DNC5hbmQub3JuIiwKKyAgImxsdm0uaGV4YWdvbi5DNC5jbXBsdGUiLAorICAibGx2bS5oZXhhZ29uLkM0LmNtcGx0ZWkiLAorICAibGx2bS5oZXhhZ29uLkM0LmNtcGx0ZXUiLAorICAibGx2bS5oZXhhZ29uLkM0LmNtcGx0ZXVpIiwKKyAgImxsdm0uaGV4YWdvbi5DNC5jbXBuZXEiLAorICAibGx2bS5oZXhhZ29uLkM0LmNtcG5lcWkiLAorICAibGx2bS5oZXhhZ29uLkM0LmZhc3Rjb3JuZXI5IiwKKyAgImxsdm0uaGV4YWdvbi5DNC5mYXN0Y29ybmVyOS5ub3QiLAorICAibGx2bS5oZXhhZ29uLkM0Lm5iaXRzY2xyIiwKKyAgImxsdm0uaGV4YWdvbi5DNC5uYml0c2NscmkiLAorICAibGx2bS5oZXhhZ29uLkM0Lm5iaXRzc2V0IiwKKyAgImxsdm0uaGV4YWdvbi5DNC5vci5hbmQiLAorICAibGx2bS5oZXhhZ29uLkM0Lm9yLmFuZG4iLAorICAibGx2bS5oZXhhZ29uLkM0Lm9yLm9yIiwKKyAgImxsdm0uaGV4YWdvbi5DNC5vci5vcm4iLAorICAibGx2bS5oZXhhZ29uLkYyLmNvbnYuZDJkZiIsCisgICJsbHZtLmhleGFnb24uRjIuY29udi5kMnNmIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5jb252LmRmMmQiLAorICAibGx2bS5oZXhhZ29uLkYyLmNvbnYuZGYyZC5jaG9wIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5jb252LmRmMnNmIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5jb252LmRmMnVkIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5jb252LmRmMnVkLmNob3AiLAorICAibGx2bS5oZXhhZ29uLkYyLmNvbnYuZGYydXciLAorICAibGx2bS5oZXhhZ29uLkYyLmNvbnYuZGYydXcuY2hvcCIsCisgICJsbHZtLmhleGFnb24uRjIuY29udi5kZjJ3IiwKKyAgImxsdm0uaGV4YWdvbi5GMi5jb252LmRmMncuY2hvcCIsCisgICJsbHZtLmhleGFnb24uRjIuY29udi5zZjJkIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5jb252LnNmMmQuY2hvcCIsCisgICJsbHZtLmhleGFnb24uRjIuY29udi5zZjJkZiIsCisgICJsbHZtLmhleGFnb24uRjIuY29udi5zZjJ1ZCIsCisgICJsbHZtLmhleGFnb24uRjIuY29udi5zZjJ1ZC5jaG9wIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5jb252LnNmMnV3IiwKKyAgImxsdm0uaGV4YWdvbi5GMi5jb252LnNmMnV3LmNob3AiLAorICAibGx2bS5oZXhhZ29uLkYyLmNvbnYuc2YydyIsCisgICJsbHZtLmhleGFnb24uRjIuY29udi5zZjJ3LmNob3AiLAorICAibGx2bS5oZXhhZ29uLkYyLmNvbnYudWQyZGYiLAorICAibGx2bS5oZXhhZ29uLkYyLmNvbnYudWQyc2YiLAorICAibGx2bS5oZXhhZ29uLkYyLmNvbnYudXcyZGYiLAorICAibGx2bS5oZXhhZ29uLkYyLmNvbnYudXcyc2YiLAorICAibGx2bS5oZXhhZ29uLkYyLmNvbnYudzJkZiIsCisgICJsbHZtLmhleGFnb24uRjIuY29udi53MnNmIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5kZmNsYXNzIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5kZmNtcGVxIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5kZmNtcGdlIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5kZmNtcGd0IiwKKyAgImxsdm0uaGV4YWdvbi5GMi5kZmNtcHVvIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5kZmltbS5uIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5kZmltbS5wIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5zZmFkZCIsCisgICJsbHZtLmhleGFnb24uRjIuc2ZjbGFzcyIsCisgICJsbHZtLmhleGFnb24uRjIuc2ZjbXBlcSIsCisgICJsbHZtLmhleGFnb24uRjIuc2ZjbXBnZSIsCisgICJsbHZtLmhleGFnb24uRjIuc2ZjbXBndCIsCisgICJsbHZtLmhleGFnb24uRjIuc2ZjbXB1byIsCisgICJsbHZtLmhleGFnb24uRjIuc2ZmaXh1cGQiLAorICAibGx2bS5oZXhhZ29uLkYyLnNmZml4dXBuIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5zZmZpeHVwciIsCisgICJsbHZtLmhleGFnb24uRjIuc2ZmbWEiLAorICAibGx2bS5oZXhhZ29uLkYyLnNmZm1hLmxpYiIsCisgICJsbHZtLmhleGFnb24uRjIuc2ZmbWEuc2MiLAorICAibGx2bS5oZXhhZ29uLkYyLnNmZm1zIiwKKyAgImxsdm0uaGV4YWdvbi5GMi5zZmZtcy5saWIiLAorICAibGx2bS5oZXhhZ29uLkYyLnNmaW1tLm4iLAorICAibGx2bS5oZXhhZ29uLkYyLnNmaW1tLnAiLAorICAibGx2bS5oZXhhZ29uLkYyLnNmbWF4IiwKKyAgImxsdm0uaGV4YWdvbi5GMi5zZm1pbiIsCisgICJsbHZtLmhleGFnb24uRjIuc2ZtcHkiLAorICAibGx2bS5oZXhhZ29uLkYyLnNmc3ViIiwKKyAgImxsdm0uaGV4YWdvbi5MMi5sb2FkcmIucGJyIiwKKyAgImxsdm0uaGV4YWdvbi5MMi5sb2FkcmIucGNpIiwKKyAgImxsdm0uaGV4YWdvbi5MMi5sb2FkcmIucGNyIiwKKyAgImxsdm0uaGV4YWdvbi5MMi5sb2FkcmQucGJyIiwKKyAgImxsdm0uaGV4YWdvbi5MMi5sb2FkcmQucGNpIiwKKyAgImxsdm0uaGV4YWdvbi5MMi5sb2FkcmQucGNyIiwKKyAgImxsdm0uaGV4YWdvbi5MMi5sb2FkcmgucGJyIiwKKyAgImxsdm0uaGV4YWdvbi5MMi5sb2FkcmgucGNpIiwKKyAgImxsdm0uaGV4YWdvbi5MMi5sb2FkcmgucGNyIiwKKyAgImxsdm0uaGV4YWdvbi5MMi5sb2FkcmkucGJyIiwKKyAgImxsdm0uaGV4YWdvbi5MMi5sb2FkcmkucGNpIiwKKyAgImxsdm0uaGV4YWdvbi5MMi5sb2FkcmkucGNyIiwKKyAgImxsdm0uaGV4YWdvbi5MMi5sb2FkcnViLnBiciIsCisgICJsbHZtLmhleGFnb24uTDIubG9hZHJ1Yi5wY2kiLAorICAibGx2bS5oZXhhZ29uLkwyLmxvYWRydWIucGNyIiwKKyAgImxsdm0uaGV4YWdvbi5MMi5sb2FkcnVoLnBiciIsCisgICJsbHZtLmhleGFnb24uTDIubG9hZHJ1aC5wY2kiLAorICAibGx2bS5oZXhhZ29uLkwyLmxvYWRydWgucGNyIiwKKyAgImxsdm0uaGV4YWdvbi5MMi5sb2Fkdy5sb2NrZWQiLAorICAibGx2bS5oZXhhZ29uLkw0LmxvYWRkLmxvY2tlZCIsCisgICJsbHZtLmhleGFnb24uTTIuYWNjaSIsCisgICJsbHZtLmhleGFnb24uTTIuYWNjaWkiLAorICAibGx2bS5oZXhhZ29uLk0yLmNtYWNpLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5jbWFjci5zMCIsCisgICJsbHZtLmhleGFnb24uTTIuY21hY3MuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLmNtYWNzLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5jbWFjc2MuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLmNtYWNzYy5zMSIsCisgICJsbHZtLmhleGFnb24uTTIuY21weWkuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLmNtcHlyLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5jbXB5cnMuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLmNtcHlycy5zMSIsCisgICJsbHZtLmhleGFnb24uTTIuY21weXJzYy5zMCIsCisgICJsbHZtLmhleGFnb24uTTIuY21weXJzYy5zMSIsCisgICJsbHZtLmhleGFnb24uTTIuY21weXMuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLmNtcHlzLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5jbXB5c2MuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLmNtcHlzYy5zMSIsCisgICJsbHZtLmhleGFnb24uTTIuY25hY3MuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLmNuYWNzLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5jbmFjc2MuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLmNuYWNzYy5zMSIsCisgICJsbHZtLmhleGFnb24uTTIuZHBtcHlzcy5hY2MuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLmRwbXB5c3MubmFjLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5kcG1weXNzLnJuZC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIuZHBtcHlzcy5zMCIsCisgICJsbHZtLmhleGFnb24uTTIuZHBtcHl1dS5hY2MuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLmRwbXB5dXUubmFjLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5kcG1weXV1LnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5obW1weWgucnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5obW1weWguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLmhtbXB5bC5yczEiLAorICAibGx2bS5oZXhhZ29uLk0yLmhtbXB5bC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubWFjaSIsCisgICJsbHZtLmhleGFnb24uTTIubWFjc2luIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tYWNzaXAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tYWNocy5yczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tYWNocy5yczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tYWNocy5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubW1hY2hzLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbWFjbHMucnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbWFjbHMucnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbWFjbHMuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tYWNscy5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubW1hY3Vocy5yczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tYWN1aHMucnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbWFjdWhzLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbWFjdWhzLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbWFjdWxzLnJzMCIsCisgICJsbHZtLmhleGFnb24uTTIubW1hY3Vscy5yczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tYWN1bHMuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tYWN1bHMuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tcHloLnJzMCIsCisgICJsbHZtLmhleGFnb24uTTIubW1weWgucnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbXB5aC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubW1weWguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tcHlsLnJzMCIsCisgICJsbHZtLmhleGFnb24uTTIubW1weWwucnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbXB5bC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubW1weWwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tcHl1aC5yczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tcHl1aC5yczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tcHl1aC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubW1weXVoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbXB5dWwucnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbXB5dWwucnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tbXB5dWwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1tcHl1bC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LmFjYy5oaC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LmFjYy5oaC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LmFjYy5obC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LmFjYy5obC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LmFjYy5saC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LmFjYy5saC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LmFjYy5sbC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LmFjYy5sbC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LmFjYy5zYXQuaGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5hY2Muc2F0LmhoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLnNhdC5obC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LmFjYy5zYXQuaGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5hY2Muc2F0LmxoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLnNhdC5saC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LmFjYy5zYXQubGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5hY2Muc2F0LmxsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuaGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5oaC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LmhsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuaGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5saC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LmxoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkubGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5sbC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5oaC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5oaC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5obC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5obC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5saC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5saC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5sbC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5sbC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5zYXQuaGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuc2F0LmhoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLnNhdC5obC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5zYXQuaGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuc2F0LmxoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLnNhdC5saC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5zYXQubGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuc2F0LmxsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmhoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmhoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmhsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmhsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmxoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmxoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmxsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmxsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmhoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmhoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmhsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmhsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmxoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmxoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmxsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmxsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LnJuZC5oaC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnNhdC5ybmQuaGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5zYXQucm5kLmhsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LnJuZC5obC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnNhdC5ybmQubGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS5zYXQucm5kLmxoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LnJuZC5sbC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnNhdC5ybmQubGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weS51cCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5LnVwLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHkudXAuczEuc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLmFjYy5oaC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5ZC5hY2MuaGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQuYWNjLmhsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLmFjYy5obC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5ZC5hY2MubGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQuYWNjLmxoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLmFjYy5sbC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5ZC5hY2MubGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQuaGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQuaGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQuaGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQuaGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQubGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQubGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQubGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQubGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQubmFjLmhoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLm5hYy5oaC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5ZC5uYWMuaGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQubmFjLmhsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLm5hYy5saC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5ZC5uYWMubGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQubmFjLmxsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLm5hYy5sbC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5ZC5ybmQuaGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQucm5kLmhoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLnJuZC5obC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5ZC5ybmQuaGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQucm5kLmxoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlkLnJuZC5saC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5ZC5ybmQubGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weWQucm5kLmxsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlpIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHlzbWkiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXN1LnVwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1LmFjYy5oaC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dS5hY2MuaGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXUuYWNjLmhsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1LmFjYy5obC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dS5hY2MubGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXUuYWNjLmxoLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1LmFjYy5sbC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dS5hY2MubGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXUuaGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXUuaGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXUuaGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXUuaGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXUubGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXUubGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXUubGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXUubGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXUubmFjLmhoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1Lm5hYy5oaC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dS5uYWMuaGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXUubmFjLmhsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1Lm5hYy5saC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dS5uYWMubGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXUubmFjLmxsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1Lm5hYy5sbC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dS51cCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dWQuYWNjLmhoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5hY2MuaGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXVkLmFjYy5obC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dWQuYWNjLmhsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5hY2MubGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXVkLmFjYy5saC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dWQuYWNjLmxsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5hY2MubGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXVkLmhoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5oaC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dWQuaGwuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXVkLmhsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5saC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dWQubGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXVkLmxsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5sbC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dWQubmFjLmhoLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5uYWMuaGguczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXVkLm5hYy5obC5zMCIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dWQubmFjLmhsLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5uYWMubGguczAiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXVkLm5hYy5saC5zMSIsCisgICJsbHZtLmhleGFnb24uTTIubXB5dWQubmFjLmxsLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5uYWMubGwuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLm1weXVpIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5uYWNjaSIsCisgICJsbHZtLmhleGFnb24uTTIubmFjY2lpIiwKKyAgImxsdm0uaGV4YWdvbi5NMi5zdWJhY2MiLAorICAibGx2bS5oZXhhZ29uLk0yLnZhYnNkaWZmaCIsCisgICJsbHZtLmhleGFnb24uTTIudmFic2RpZmZ3IiwKKyAgImxsdm0uaGV4YWdvbi5NMi52Y21hYy5zMC5zYXQuaSIsCisgICJsbHZtLmhleGFnb24uTTIudmNtYWMuczAuc2F0LnIiLAorICAibGx2bS5oZXhhZ29uLk0yLnZjbXB5LnMwLnNhdC5pIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52Y21weS5zMC5zYXQuciIsCisgICJsbHZtLmhleGFnb24uTTIudmNtcHkuczEuc2F0LmkiLAorICAibGx2bS5oZXhhZ29uLk0yLnZjbXB5LnMxLnNhdC5yIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52ZG1hY3MuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLnZkbWFjcy5zMSIsCisgICJsbHZtLmhleGFnb24uTTIudmRtcHlycy5zMCIsCisgICJsbHZtLmhleGFnb24uTTIudmRtcHlycy5zMSIsCisgICJsbHZtLmhleGFnb24uTTIudmRtcHlzLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52ZG1weXMuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLnZtYWMyIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52bWFjMmVzIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52bWFjMmVzLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52bWFjMmVzLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52bWFjMnMuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLnZtYWMycy5zMSIsCisgICJsbHZtLmhleGFnb24uTTIudm1hYzJzdS5zMCIsCisgICJsbHZtLmhleGFnb24uTTIudm1hYzJzdS5zMSIsCisgICJsbHZtLmhleGFnb24uTTIudm1weTJlcy5zMCIsCisgICJsbHZtLmhleGFnb24uTTIudm1weTJlcy5zMSIsCisgICJsbHZtLmhleGFnb24uTTIudm1weTJzLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52bXB5MnMuczBwYWNrIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52bXB5MnMuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLnZtcHkycy5zMXBhY2siLAorICAibGx2bS5oZXhhZ29uLk0yLnZtcHkyc3UuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLnZtcHkyc3UuczEiLAorICAibGx2bS5oZXhhZ29uLk0yLnZyYWRkaCIsCisgICJsbHZtLmhleGFnb24uTTIudnJhZGR1aCIsCisgICJsbHZtLmhleGFnb24uTTIudnJjbWFjaS5zMCIsCisgICJsbHZtLmhleGFnb24uTTIudnJjbWFjaS5zMGMiLAorICAibGx2bS5oZXhhZ29uLk0yLnZyY21hY3IuczAiLAorICAibGx2bS5oZXhhZ29uLk0yLnZyY21hY3IuczBjIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52cmNtcHlpLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52cmNtcHlpLnMwYyIsCisgICJsbHZtLmhleGFnb24uTTIudnJjbXB5ci5zMCIsCisgICJsbHZtLmhleGFnb24uTTIudnJjbXB5ci5zMGMiLAorICAibGx2bS5oZXhhZ29uLk0yLnZyY21weXMuYWNjLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52cmNtcHlzLnMxIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52cmNtcHlzLnMxcnAiLAorICAibGx2bS5oZXhhZ29uLk0yLnZybWFjLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NMi52cm1weS5zMCIsCisgICJsbHZtLmhleGFnb24uTTIueG9yLnhhY2MiLAorICAibGx2bS5oZXhhZ29uLk00LmFuZC5hbmQiLAorICAibGx2bS5oZXhhZ29uLk00LmFuZC5hbmRuIiwKKyAgImxsdm0uaGV4YWdvbi5NNC5hbmQub3IiLAorICAibGx2bS5oZXhhZ29uLk00LmFuZC54b3IiLAorICAibGx2bS5oZXhhZ29uLk00LmNtcHlpLndoIiwKKyAgImxsdm0uaGV4YWdvbi5NNC5jbXB5aS53aGMiLAorICAibGx2bS5oZXhhZ29uLk00LmNtcHlyLndoIiwKKyAgImxsdm0uaGV4YWdvbi5NNC5jbXB5ci53aGMiLAorICAibGx2bS5oZXhhZ29uLk00Lm1hYy51cC5zMS5zYXQiLAorICAibGx2bS5oZXhhZ29uLk00Lm1weXJpLmFkZGkiLAorICAibGx2bS5oZXhhZ29uLk00Lm1weXJpLmFkZHIiLAorICAibGx2bS5oZXhhZ29uLk00Lm1weXJpLmFkZHIudTIiLAorICAibGx2bS5oZXhhZ29uLk00Lm1weXJyLmFkZGkiLAorICAibGx2bS5oZXhhZ29uLk00Lm1weXJyLmFkZHIiLAorICAibGx2bS5oZXhhZ29uLk00Lm5hYy51cC5zMS5zYXQiLAorICAibGx2bS5oZXhhZ29uLk00Lm9yLmFuZCIsCisgICJsbHZtLmhleGFnb24uTTQub3IuYW5kbiIsCisgICJsbHZtLmhleGFnb24uTTQub3Iub3IiLAorICAibGx2bS5oZXhhZ29uLk00Lm9yLnhvciIsCisgICJsbHZtLmhleGFnb24uTTQucG1weXciLAorICAibGx2bS5oZXhhZ29uLk00LnBtcHl3LmFjYyIsCisgICJsbHZtLmhleGFnb24uTTQudnBtcHloIiwKKyAgImxsdm0uaGV4YWdvbi5NNC52cG1weWguYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5NNC52cm1weWVoLmFjYy5zMCIsCisgICJsbHZtLmhleGFnb24uTTQudnJtcHllaC5hY2MuczEiLAorICAibGx2bS5oZXhhZ29uLk00LnZybXB5ZWguczAiLAorICAibGx2bS5oZXhhZ29uLk00LnZybXB5ZWguczEiLAorICAibGx2bS5oZXhhZ29uLk00LnZybXB5b2guYWNjLnMwIiwKKyAgImxsdm0uaGV4YWdvbi5NNC52cm1weW9oLmFjYy5zMSIsCisgICJsbHZtLmhleGFnb24uTTQudnJtcHlvaC5zMCIsCisgICJsbHZtLmhleGFnb24uTTQudnJtcHlvaC5zMSIsCisgICJsbHZtLmhleGFnb24uTTQueG9yLmFuZCIsCisgICJsbHZtLmhleGFnb24uTTQueG9yLmFuZG4iLAorICAibGx2bS5oZXhhZ29uLk00Lnhvci5vciIsCisgICJsbHZtLmhleGFnb24uTTQueG9yLnhhY2MiLAorICAibGx2bS5oZXhhZ29uLk01LnZkbWFjYnN1IiwKKyAgImxsdm0uaGV4YWdvbi5NNS52ZG1weWJzdSIsCisgICJsbHZtLmhleGFnb24uTTUudm1hY2JzdSIsCisgICJsbHZtLmhleGFnb24uTTUudm1hY2J1dSIsCisgICJsbHZtLmhleGFnb24uTTUudm1weWJzdSIsCisgICJsbHZtLmhleGFnb24uTTUudm1weWJ1dSIsCisgICJsbHZtLmhleGFnb24uTTUudnJtYWNic3UiLAorICAibGx2bS5oZXhhZ29uLk01LnZybWFjYnV1IiwKKyAgImxsdm0uaGV4YWdvbi5NNS52cm1weWJzdSIsCisgICJsbHZtLmhleGFnb24uTTUudnJtcHlidXUiLAorICAibGx2bS5oZXhhZ29uLk02LnZhYnNkaWZmYiIsCisgICJsbHZtLmhleGFnb24uTTYudmFic2RpZmZ1YiIsCisgICJsbHZtLmhleGFnb24uUzIuYWRkYXNsLnJycmkiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5pLnAiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5pLnAuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc2wuaS5wLmFuZCIsCisgICJsbHZtLmhleGFnb24uUzIuYXNsLmkucC5uYWMiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5pLnAub3IiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5pLnAueGFjYyIsCisgICJsbHZtLmhleGFnb24uUzIuYXNsLmkuciIsCisgICJsbHZtLmhleGFnb24uUzIuYXNsLmkuci5hY2MiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5pLnIuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc2wuaS5yLm5hYyIsCisgICJsbHZtLmhleGFnb24uUzIuYXNsLmkuci5vciIsCisgICJsbHZtLmhleGFnb24uUzIuYXNsLmkuci5zYXQiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5pLnIueGFjYyIsCisgICJsbHZtLmhleGFnb24uUzIuYXNsLmkudmgiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5pLnZ3IiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc2wuci5wIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc2wuci5wLmFjYyIsCisgICJsbHZtLmhleGFnb24uUzIuYXNsLnIucC5hbmQiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5yLnAubmFjIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc2wuci5wLm9yIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc2wuci5wLnhvciIsCisgICJsbHZtLmhleGFnb24uUzIuYXNsLnIuciIsCisgICJsbHZtLmhleGFnb24uUzIuYXNsLnIuci5hY2MiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5yLnIuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc2wuci5yLm5hYyIsCisgICJsbHZtLmhleGFnb24uUzIuYXNsLnIuci5vciIsCisgICJsbHZtLmhleGFnb24uUzIuYXNsLnIuci5zYXQiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzbC5yLnZoIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc2wuci52dyIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLmkucCIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLmkucC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5pLnAuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc3IuaS5wLm5hYyIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLmkucC5vciIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLmkucC5ybmQiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5pLnAucm5kLmdvb2RzeW50YXgiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5pLnIiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5pLnIuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc3IuaS5yLmFuZCIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLmkuci5uYWMiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5pLnIub3IiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5pLnIucm5kIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc3IuaS5yLnJuZC5nb29kc3ludGF4IiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc3IuaS5zdncudHJ1biIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLmkudmgiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5pLnZ3IiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc3Iuci5wIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc3Iuci5wLmFjYyIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLnIucC5hbmQiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5yLnAubmFjIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc3Iuci5wLm9yIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc3Iuci5wLnhvciIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLnIuciIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLnIuci5hY2MiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5yLnIuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc3Iuci5yLm5hYyIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLnIuci5vciIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLnIuci5zYXQiLAorICAibGx2bS5oZXhhZ29uLlMyLmFzci5yLnN2dy50cnVuIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5hc3Iuci52aCIsCisgICJsbHZtLmhleGFnb24uUzIuYXNyLnIudnciLAorICAibGx2bS5oZXhhZ29uLlMyLmJyZXYiLAorICAibGx2bS5oZXhhZ29uLlMyLmJyZXZwIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5jYWJhY2VuY2JpbiIsCisgICJsbHZtLmhleGFnb24uUzIuY2wwIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5jbDBwIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5jbDEiLAorICAibGx2bS5oZXhhZ29uLlMyLmNsMXAiLAorICAibGx2bS5oZXhhZ29uLlMyLmNsYiIsCisgICJsbHZtLmhleGFnb24uUzIuY2xibm9ybSIsCisgICJsbHZtLmhleGFnb24uUzIuY2xicCIsCisgICJsbHZtLmhleGFnb24uUzIuY2xyYml0LmkiLAorICAibGx2bS5oZXhhZ29uLlMyLmNscmJpdC5yIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5jdDAiLAorICAibGx2bS5oZXhhZ29uLlMyLmN0MHAiLAorICAibGx2bS5oZXhhZ29uLlMyLmN0MSIsCisgICJsbHZtLmhleGFnb24uUzIuY3QxcCIsCisgICJsbHZtLmhleGFnb24uUzIuZGVpbnRlcmxlYXZlIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5leHRyYWN0dSIsCisgICJsbHZtLmhleGFnb24uUzIuZXh0cmFjdHUucnAiLAorICAibGx2bS5oZXhhZ29uLlMyLmV4dHJhY3R1cCIsCisgICJsbHZtLmhleGFnb24uUzIuZXh0cmFjdHVwLnJwIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5pbnNlcnQiLAorICAibGx2bS5oZXhhZ29uLlMyLmluc2VydC5ycCIsCisgICJsbHZtLmhleGFnb24uUzIuaW5zZXJ0cCIsCisgICJsbHZtLmhleGFnb24uUzIuaW5zZXJ0cC5ycCIsCisgICJsbHZtLmhleGFnb24uUzIuaW50ZXJsZWF2ZSIsCisgICJsbHZtLmhleGFnb24uUzIubGZzcCIsCisgICJsbHZtLmhleGFnb24uUzIubHNsLnIucCIsCisgICJsbHZtLmhleGFnb24uUzIubHNsLnIucC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzbC5yLnAuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc2wuci5wLm5hYyIsCisgICJsbHZtLmhleGFnb24uUzIubHNsLnIucC5vciIsCisgICJsbHZtLmhleGFnb24uUzIubHNsLnIucC54b3IiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzbC5yLnIiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzbC5yLnIuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc2wuci5yLmFuZCIsCisgICJsbHZtLmhleGFnb24uUzIubHNsLnIuci5uYWMiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzbC5yLnIub3IiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzbC5yLnZoIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc2wuci52dyIsCisgICJsbHZtLmhleGFnb24uUzIubHNyLmkucCIsCisgICJsbHZtLmhleGFnb24uUzIubHNyLmkucC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzci5pLnAuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc3IuaS5wLm5hYyIsCisgICJsbHZtLmhleGFnb24uUzIubHNyLmkucC5vciIsCisgICJsbHZtLmhleGFnb24uUzIubHNyLmkucC54YWNjIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc3IuaS5yIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc3IuaS5yLmFjYyIsCisgICJsbHZtLmhleGFnb24uUzIubHNyLmkuci5hbmQiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzci5pLnIubmFjIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc3IuaS5yLm9yIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc3IuaS5yLnhhY2MiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzci5pLnZoIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc3IuaS52dyIsCisgICJsbHZtLmhleGFnb24uUzIubHNyLnIucCIsCisgICJsbHZtLmhleGFnb24uUzIubHNyLnIucC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzci5yLnAuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc3Iuci5wLm5hYyIsCisgICJsbHZtLmhleGFnb24uUzIubHNyLnIucC5vciIsCisgICJsbHZtLmhleGFnb24uUzIubHNyLnIucC54b3IiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzci5yLnIiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzci5yLnIuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc3Iuci5yLmFuZCIsCisgICJsbHZtLmhleGFnb24uUzIubHNyLnIuci5uYWMiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzci5yLnIub3IiLAorICAibGx2bS5oZXhhZ29uLlMyLmxzci5yLnZoIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5sc3Iuci52dyIsCisgICJsbHZtLmhleGFnb24uUzIucGFja2hsIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5wYXJpdHlwIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5zZXRiaXQuaSIsCisgICJsbHZtLmhleGFnb24uUzIuc2V0Yml0LnIiLAorICAibGx2bS5oZXhhZ29uLlMyLnNodWZmZWIiLAorICAibGx2bS5oZXhhZ29uLlMyLnNodWZmZWgiLAorICAibGx2bS5oZXhhZ29uLlMyLnNodWZmb2IiLAorICAibGx2bS5oZXhhZ29uLlMyLnNodWZmb2giLAorICAibGx2bS5oZXhhZ29uLlMyLnN0b3JlcmIucGJyIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5zdG9yZXJiLnBjaSIsCisgICJsbHZtLmhleGFnb24uUzIuc3RvcmVyYi5wY3IiLAorICAibGx2bS5oZXhhZ29uLlMyLnN0b3JlcmQucGJyIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5zdG9yZXJkLnBjaSIsCisgICJsbHZtLmhleGFnb24uUzIuc3RvcmVyZC5wY3IiLAorICAibGx2bS5oZXhhZ29uLlMyLnN0b3JlcmYucGJyIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5zdG9yZXJmLnBjaSIsCisgICJsbHZtLmhleGFnb24uUzIuc3RvcmVyZi5wY3IiLAorICAibGx2bS5oZXhhZ29uLlMyLnN0b3JlcmgucGJyIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5zdG9yZXJoLnBjaSIsCisgICJsbHZtLmhleGFnb24uUzIuc3RvcmVyaC5wY3IiLAorICAibGx2bS5oZXhhZ29uLlMyLnN0b3JlcmkucGJyIiwKKyAgImxsdm0uaGV4YWdvbi5TMi5zdG9yZXJpLnBjaSIsCisgICJsbHZtLmhleGFnb24uUzIuc3RvcmVyaS5wY3IiLAorICAibGx2bS5oZXhhZ29uLlMyLnN0b3Jldy5sb2NrZWQiLAorICAibGx2bS5oZXhhZ29uLlMyLnN2c2F0aGIiLAorICAibGx2bS5oZXhhZ29uLlMyLnN2c2F0aHViIiwKKyAgImxsdm0uaGV4YWdvbi5TMi50YWJsZWlkeGIuZ29vZHN5bnRheCIsCisgICJsbHZtLmhleGFnb24uUzIudGFibGVpZHhkLmdvb2RzeW50YXgiLAorICAibGx2bS5oZXhhZ29uLlMyLnRhYmxlaWR4aC5nb29kc3ludGF4IiwKKyAgImxsdm0uaGV4YWdvbi5TMi50YWJsZWlkeHcuZ29vZHN5bnRheCIsCisgICJsbHZtLmhleGFnb24uUzIudG9nZ2xlYml0LmkiLAorICAibGx2bS5oZXhhZ29uLlMyLnRvZ2dsZWJpdC5yIiwKKyAgImxsdm0uaGV4YWdvbi5TMi50c3RiaXQuaSIsCisgICJsbHZtLmhleGFnb24uUzIudHN0Yml0LnIiLAorICAibGx2bS5oZXhhZ29uLlMyLnZhbGlnbmliIiwKKyAgImxsdm0uaGV4YWdvbi5TMi52YWxpZ25yYiIsCisgICJsbHZtLmhleGFnb24uUzIudmNuZWdoIiwKKyAgImxsdm0uaGV4YWdvbi5TMi52Y3JvdGF0ZSIsCisgICJsbHZtLmhleGFnb24uUzIudnJjbmVnaCIsCisgICJsbHZtLmhleGFnb24uUzIudnJuZHBhY2t3aCIsCisgICJsbHZtLmhleGFnb24uUzIudnJuZHBhY2t3aHMiLAorICAibGx2bS5oZXhhZ29uLlMyLnZzYXRoYiIsCisgICJsbHZtLmhleGFnb24uUzIudnNhdGhiLm5vcGFjayIsCisgICJsbHZtLmhleGFnb24uUzIudnNhdGh1YiIsCisgICJsbHZtLmhleGFnb24uUzIudnNhdGh1Yi5ub3BhY2siLAorICAibGx2bS5oZXhhZ29uLlMyLnZzYXR3aCIsCisgICJsbHZtLmhleGFnb24uUzIudnNhdHdoLm5vcGFjayIsCisgICJsbHZtLmhleGFnb24uUzIudnNhdHd1aCIsCisgICJsbHZtLmhleGFnb24uUzIudnNhdHd1aC5ub3BhY2siLAorICAibGx2bS5oZXhhZ29uLlMyLnZzcGxhdHJiIiwKKyAgImxsdm0uaGV4YWdvbi5TMi52c3BsYXRyaCIsCisgICJsbHZtLmhleGFnb24uUzIudnNwbGljZWliIiwKKyAgImxsdm0uaGV4YWdvbi5TMi52c3BsaWNlcmIiLAorICAibGx2bS5oZXhhZ29uLlMyLnZzeHRiaCIsCisgICJsbHZtLmhleGFnb24uUzIudnN4dGh3IiwKKyAgImxsdm0uaGV4YWdvbi5TMi52dHJ1bmVoYiIsCisgICJsbHZtLmhleGFnb24uUzIudnRydW5ld2giLAorICAibGx2bS5oZXhhZ29uLlMyLnZ0cnVub2hiIiwKKyAgImxsdm0uaGV4YWdvbi5TMi52dHJ1bm93aCIsCisgICJsbHZtLmhleGFnb24uUzIudnp4dGJoIiwKKyAgImxsdm0uaGV4YWdvbi5TMi52enh0aHciLAorICAibGx2bS5oZXhhZ29uLlM0LmFkZGFkZGkiLAorICAibGx2bS5oZXhhZ29uLlM0LmFkZGkuYXNsLnJpIiwKKyAgImxsdm0uaGV4YWdvbi5TNC5hZGRpLmxzci5yaSIsCisgICJsbHZtLmhleGFnb24uUzQuYW5kaS5hc2wucmkiLAorICAibGx2bS5oZXhhZ29uLlM0LmFuZGkubHNyLnJpIiwKKyAgImxsdm0uaGV4YWdvbi5TNC5jbGJhZGRpIiwKKyAgImxsdm0uaGV4YWdvbi5TNC5jbGJwYWRkaSIsCisgICJsbHZtLmhleGFnb24uUzQuY2xicG5vcm0iLAorICAibGx2bS5oZXhhZ29uLlM0LmV4dHJhY3QiLAorICAibGx2bS5oZXhhZ29uLlM0LmV4dHJhY3QucnAiLAorICAibGx2bS5oZXhhZ29uLlM0LmV4dHJhY3RwIiwKKyAgImxsdm0uaGV4YWdvbi5TNC5leHRyYWN0cC5ycCIsCisgICJsbHZtLmhleGFnb24uUzQubHNsaSIsCisgICJsbHZtLmhleGFnb24uUzQubnRzdGJpdC5pIiwKKyAgImxsdm0uaGV4YWdvbi5TNC5udHN0Yml0LnIiLAorICAibGx2bS5oZXhhZ29uLlM0Lm9yLmFuZGkiLAorICAibGx2bS5oZXhhZ29uLlM0Lm9yLmFuZGl4IiwKKyAgImxsdm0uaGV4YWdvbi5TNC5vci5vcmkiLAorICAibGx2bS5oZXhhZ29uLlM0Lm9yaS5hc2wucmkiLAorICAibGx2bS5oZXhhZ29uLlM0Lm9yaS5sc3IucmkiLAorICAibGx2bS5oZXhhZ29uLlM0LnBhcml0eSIsCisgICJsbHZtLmhleGFnb24uUzQuc3RvcmVkLmxvY2tlZCIsCisgICJsbHZtLmhleGFnb24uUzQuc3ViYWRkaSIsCisgICJsbHZtLmhleGFnb24uUzQuc3ViaS5hc2wucmkiLAorICAibGx2bS5oZXhhZ29uLlM0LnN1YmkubHNyLnJpIiwKKyAgImxsdm0uaGV4YWdvbi5TNC52cmNyb3RhdGUiLAorICAibGx2bS5oZXhhZ29uLlM0LnZyY3JvdGF0ZS5hY2MiLAorICAibGx2bS5oZXhhZ29uLlM0LnZ4YWRkc3ViaCIsCisgICJsbHZtLmhleGFnb24uUzQudnhhZGRzdWJociIsCisgICJsbHZtLmhleGFnb24uUzQudnhhZGRzdWJ3IiwKKyAgImxsdm0uaGV4YWdvbi5TNC52eHN1YmFkZGgiLAorICAibGx2bS5oZXhhZ29uLlM0LnZ4c3ViYWRkaHIiLAorICAibGx2bS5oZXhhZ29uLlM0LnZ4c3ViYWRkdyIsCisgICJsbHZtLmhleGFnb24uUzUuYXNyaHViLnJuZC5zYXQuZ29vZHN5bnRheCIsCisgICJsbHZtLmhleGFnb24uUzUuYXNyaHViLnNhdCIsCisgICJsbHZtLmhleGFnb24uUzUucG9wY291bnRwIiwKKyAgImxsdm0uaGV4YWdvbi5TNS52YXNyaHJuZC5nb29kc3ludGF4IiwKKyAgImxsdm0uaGV4YWdvbi5TNi5yb2wuaS5wIiwKKyAgImxsdm0uaGV4YWdvbi5TNi5yb2wuaS5wLmFjYyIsCisgICJsbHZtLmhleGFnb24uUzYucm9sLmkucC5hbmQiLAorICAibGx2bS5oZXhhZ29uLlM2LnJvbC5pLnAubmFjIiwKKyAgImxsdm0uaGV4YWdvbi5TNi5yb2wuaS5wLm9yIiwKKyAgImxsdm0uaGV4YWdvbi5TNi5yb2wuaS5wLnhhY2MiLAorICAibGx2bS5oZXhhZ29uLlM2LnJvbC5pLnIiLAorICAibGx2bS5oZXhhZ29uLlM2LnJvbC5pLnIuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5TNi5yb2wuaS5yLmFuZCIsCisgICJsbHZtLmhleGFnb24uUzYucm9sLmkuci5uYWMiLAorICAibGx2bS5oZXhhZ29uLlM2LnJvbC5pLnIub3IiLAorICAibGx2bS5oZXhhZ29uLlM2LnJvbC5pLnIueGFjYyIsCisgICJsbHZtLmhleGFnb24uUzYudnNwbGF0cmJwIiwKKyAgImxsdm0uaGV4YWdvbi5TNi52dHJ1bmVoYi5wcHAiLAorICAibGx2bS5oZXhhZ29uLlM2LnZ0cnVub2hiLnBwcCIsCisgICJsbHZtLmhleGFnb24uVjYuZXh0cmFjdHciLAorICAibGx2bS5oZXhhZ29uLlY2LmV4dHJhY3R3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LmhpIiwKKyAgImxsdm0uaGV4YWdvbi5WNi5oaS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi5sbyIsCisgICJsbHZtLmhleGFnb24uVjYubG8uMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYubHZzcGxhdGIiLAorICAibGx2bS5oZXhhZ29uLlY2Lmx2c3BsYXRiLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2Lmx2c3BsYXRoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi5sdnNwbGF0aC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi5sdnNwbGF0dyIsCisgICJsbHZtLmhleGFnb24uVjYubHZzcGxhdHcuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYucHJlZC5hbmQiLAorICAibGx2bS5oZXhhZ29uLlY2LnByZWQuYW5kLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnByZWQuYW5kLm4iLAorICAibGx2bS5oZXhhZ29uLlY2LnByZWQuYW5kLm4uMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYucHJlZC5ub3QiLAorICAibGx2bS5oZXhhZ29uLlY2LnByZWQubm90LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnByZWQub3IiLAorICAibGx2bS5oZXhhZ29uLlY2LnByZWQub3IuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYucHJlZC5vci5uIiwKKyAgImxsdm0uaGV4YWdvbi5WNi5wcmVkLm9yLm4uMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYucHJlZC5zY2FsYXIyIiwKKyAgImxsdm0uaGV4YWdvbi5WNi5wcmVkLnNjYWxhcjIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYucHJlZC5zY2FsYXIydjIiLAorICAibGx2bS5oZXhhZ29uLlY2LnByZWQuc2NhbGFyMnYyLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnByZWQueG9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi5wcmVkLnhvci4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi5zaHVmZmVxaCIsCisgICJsbHZtLmhleGFnb24uVjYuc2h1ZmZlcWguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYuc2h1ZmZlcXciLAorICAibGx2bS5oZXhhZ29uLlY2LnNodWZmZXF3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZTMzJiLm5xcHJlZC5haSIsCisgICJsbHZtLmhleGFnb24uVjYudlMzMmIubnFwcmVkLmFpLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZTMzJiLm50Lm5xcHJlZC5haSIsCisgICJsbHZtLmhleGFnb24uVjYudlMzMmIubnQubnFwcmVkLmFpLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZTMzJiLm50LnFwcmVkLmFpIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52UzMyYi5udC5xcHJlZC5haS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52UzMyYi5xcHJlZC5haSIsCisgICJsbHZtLmhleGFnb24uVjYudlMzMmIucXByZWQuYWkuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFic2IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhYnNiLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhYnNiLnNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudmFic2Iuc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhYnNkaWZmaCIsCisgICJsbHZtLmhleGFnb24uVjYudmFic2RpZmZoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhYnNkaWZmdWIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhYnNkaWZmdWIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFic2RpZmZ1aCIsCisgICJsbHZtLmhleGFnb24uVjYudmFic2RpZmZ1aC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWJzZGlmZnciLAorICAibGx2bS5oZXhhZ29uLlY2LnZhYnNkaWZmdy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWJzaCIsCisgICJsbHZtLmhleGFnb24uVjYudmFic2guMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFic2guc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWJzaC5zYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFic3ciLAorICAibGx2bS5oZXhhZ29uLlY2LnZhYnN3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhYnN3LnNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudmFic3cuc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRiIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkYi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkYi5kdiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGIuZHYuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGJucSIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGJucS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkYnEiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRicS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkYnNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGJzYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGJzYXQuZHYiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRic2F0LmR2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRjYXJyeSIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGNhcnJ5LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRjbGJoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkY2xiaC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkY2xidyIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGNsYncuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRoLmR2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkaC5kdi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkaG5xIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkaG5xLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRocSIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGhxLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGRoc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkaHNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkaHNhdC5kdiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGhzYXQuZHYuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGh3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkaHcuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGh3LmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZGh3LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkdWJoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkdWJoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR1YmguYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkdWJoLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkdWJzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR1YnNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkdWJzYXQuZHYiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR1YnNhdC5kdi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkdWJ1YmIuc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkdWJ1YmIuc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR1aHNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHVoc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR1aHNhdC5kdiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHVoc2F0LmR2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR1aHciLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR1aHcuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHVody5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR1aHcuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR1d3NhdCIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHV3c2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR1d3NhdC5kdiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHV3c2F0LmR2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkdy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkdy5kdiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHcuZHYuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHducSIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHducS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkd3EiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR3cS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YWRkd3NhdCIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHdzYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFkZHdzYXQuZHYiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhZGR3c2F0LmR2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhbGlnbmIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhbGlnbmIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFsaWduYmkiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhbGlnbmJpLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhbmQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhbmQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFuZG5xcnQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhbmRucXJ0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhbmRucXJ0LmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudmFuZG5xcnQuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhbmRxcnQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhbmRxcnQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFuZHFydC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhbmRxcnQuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhbmR2bnF2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YW5kdm5xdi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YW5kdnF2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YW5kdnF2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhbmR2cnQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhbmR2cnQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFuZHZydC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhbmR2cnQuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc2xoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNsaC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNsaC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc2xoLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNsaHYiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc2xodi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNsdyIsCisgICJsbHZtLmhleGFnb24uVjYudmFzbHcuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFzbHcuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNsdy5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFzbHd2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNsd3YuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcmgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3JoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3JoLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcmguYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3JoYnJuZHNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcmhicm5kc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3JoYnNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcmhic2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3JodWJybmRzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3JodWJybmRzYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcmh1YnNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcmh1YnNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNyaHYiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3Jodi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNydWh1YnJuZHNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcnVodWJybmRzYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcnVodWJzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3J1aHVic2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3J1d3Vocm5kc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNydXd1aHJuZHNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNydXd1aHNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcnV3dWhzYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcnciLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3J3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3J3LmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcncuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3J3aCIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcndoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3J3aHJuZHNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcndocm5kc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3J3aHNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcndoc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3J3dWhybmRzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3J3dWhybmRzYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcnd1aHNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudmFzcnd1aHNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNyd3YiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3J3di4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNzaWduIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNzaWduLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhc3NpZ25wIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXNzaWducC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXZnYiIsCisgICJsbHZtLmhleGFnb24uVjYudmF2Z2IuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmF2Z2JybmQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhdmdicm5kLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhdmdoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXZnaC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXZnaHJuZCIsCisgICJsbHZtLmhleGFnb24uVjYudmF2Z2hybmQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmF2Z3ViIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXZndWIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmF2Z3Vicm5kIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXZndWJybmQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmF2Z3VoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXZndWguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmF2Z3Vocm5kIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXZndWhybmQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmF2Z3V3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXZndXcuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmF2Z3V3cm5kIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXZndXdybmQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmF2Z3ciLAorICAibGx2bS5oZXhhZ29uLlY2LnZhdmd3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZhdmd3cm5kIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52YXZnd3JuZC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Y2wwaCIsCisgICJsbHZtLmhleGFnb24uVjYudmNsMGguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmNsMHciLAorICAibGx2bS5oZXhhZ29uLlY2LnZjbDB3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZjb21iaW5lIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Y29tYmluZS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZDAiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkMC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZGQwIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZGQwLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkZWFsYiIsCisgICJsbHZtLmhleGFnb24uVjYudmRlYWxiLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkZWFsYjR3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZGVhbGI0dy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZGVhbGgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkZWFsaC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZGVhbHZkZCIsCisgICJsbHZtLmhleGFnb24uVjYudmRlYWx2ZGQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmRlbHRhIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZGVsdGEuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmRtcHlidXMiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5YnVzLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5YnVzLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudmRtcHlidXMuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5YnVzLmR2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWJ1cy5kdi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWJ1cy5kdi5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5YnVzLmR2LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhiIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhiLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5aGIuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhiLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhiLmR2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhiLmR2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5aGIuZHYuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhiLmR2LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhpc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhpc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5aGlzYXQuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhpc2F0LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5aHNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhzYXQuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52ZG1weWhzYXQuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5aHN1aXNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudmRtcHloc3Vpc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5aHN1aXNhdC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5aHN1aXNhdC5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmRtcHloc3VzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5aHN1c2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5aHN1c2F0LmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudmRtcHloc3VzYXQuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5aHZzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5aHZzYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmRtcHlodnNhdC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkbXB5aHZzYXQuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkc2FkdWgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkc2FkdWguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmRzYWR1aC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZkc2FkdWguYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcWIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcWIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmVxYi5hbmQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcWIuYW5kLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcWIub3IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcWIub3IuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmVxYi54b3IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcWIueG9yLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcWgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcWguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmVxaC5hbmQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcWguYW5kLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcWgub3IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcWgub3IuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmVxaC54b3IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcWgueG9yLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcXciLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcXcuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmVxdy5hbmQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcXcuYW5kLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcXcub3IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcXcub3IuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmVxdy54b3IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZlcXcueG9yLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtaCIsCisgICJsbHZtLmhleGFnb24uVjYudmdhdGhlcm1oLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtaHEiLAorICAibGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtaHEuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmdhdGhlcm1odyIsCisgICJsbHZtLmhleGFnb24uVjYudmdhdGhlcm1ody4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z2F0aGVybWh3cSIsCisgICJsbHZtLmhleGFnb24uVjYudmdhdGhlcm1od3EuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmdhdGhlcm13IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z2F0aGVybXcuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmdhdGhlcm13cSIsCisgICJsbHZtLmhleGFnb24uVjYudmdhdGhlcm13cS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3RiIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3RiLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndGIuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3RiLmFuZC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3RiLm9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3RiLm9yLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndGIueG9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3RiLnhvci4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3RoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3RoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndGguYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3RoLmFuZC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3RoLm9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3RoLm9yLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndGgueG9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3RoLnhvci4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R1YiIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dWIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dWIuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R1Yi5hbmQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dWIub3IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndHViLm9yLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndHViLnhvciIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dWIueG9yLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndHVoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R1aC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R1aC5hbmQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndHVoLmFuZC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R1aC5vciIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dWgub3IuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dWgueG9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R1aC54b3IuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dXciLAorICAibGx2bS5oZXhhZ29uLlY2LnZndHV3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndHV3LmFuZCIsCisgICJsbHZtLmhleGFnb24uVjYudmd0dXcuYW5kLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndHV3Lm9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R1dy5vci4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R1dy54b3IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndHV3Lnhvci4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndHcuYW5kIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R3LmFuZC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R3Lm9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R3Lm9yLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZndHcueG9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52Z3R3Lnhvci4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52aW5zZXJ0d3IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZpbnNlcnR3ci4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bGFsaWduYiIsCisgICJsbHZtLmhleGFnb24uVjYudmxhbGlnbmIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmxhbGlnbmJpIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bGFsaWduYmkuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmxzcmIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZsc3JiLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZsc3JoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHNyaC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHNyaHYiLAorICAibGx2bS5oZXhhZ29uLlY2LnZsc3Jodi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHNydyIsCisgICJsbHZtLmhleGFnb24uVjYudmxzcncuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmxzcnd2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHNyd3YuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmx1dDQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZsdXQ0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZsdXR2dmIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZsdXR2dmIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmx1dHZ2Yi5ubSIsCisgICJsbHZtLmhleGFnb24uVjYudmx1dHZ2Yi5ubS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHV0dnZiLm9yYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHV0dnZiLm9yYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZsdXR2dmIub3JhY2NpIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHV0dnZiLm9yYWNjaS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHV0dnZiaSIsCisgICJsbHZtLmhleGFnb24uVjYudmx1dHZ2YmkuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmx1dHZ3aCIsCisgICJsbHZtLmhleGFnb24uVjYudmx1dHZ3aC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHV0dndoLm5tIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHV0dndoLm5tLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZsdXR2d2gub3JhY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZsdXR2d2gub3JhY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudmx1dHZ3aC5vcmFjY2kiLAorICAibGx2bS5oZXhhZ29uLlY2LnZsdXR2d2gub3JhY2NpLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZsdXR2d2hpIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bHV0dndoaS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bWFza2Vkc3RvcmVucSIsCisgICJsbHZtLmhleGFnb24uVjYudm1hc2tlZHN0b3JlbnEuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1hc2tlZHN0b3JlbnRucSIsCisgICJsbHZtLmhleGFnb24uVjYudm1hc2tlZHN0b3JlbnRucS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bWFza2Vkc3RvcmVudHEiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtYXNrZWRzdG9yZW50cS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bWFza2Vkc3RvcmVxIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bWFza2Vkc3RvcmVxLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtYXhiIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bWF4Yi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bWF4aCIsCisgICJsbHZtLmhleGFnb24uVjYudm1heGguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1heHViIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bWF4dWIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1heHVoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bWF4dWguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1heHciLAorICAibGx2bS5oZXhhZ29uLlY2LnZtYXh3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtaW5iIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bWluYi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bWluaCIsCisgICJsbHZtLmhleGFnb24uVjYudm1pbmguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1pbnViIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bWludWIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1pbnVoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bWludWguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1pbnciLAorICAibGx2bS5oZXhhZ29uLlY2LnZtaW53LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcGFidXMiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcGFidXMuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1wYWJ1cy5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcGFidXMuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcGFidXN2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXBhYnVzdi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXBhYnV1IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXBhYnV1LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcGFidXUuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXBhYnV1LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXBhYnV1diIsCisgICJsbHZtLmhleGFnb24uVjYudm1wYWJ1dXYuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1wYWhiIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXBhaGIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1wYWhiLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudm1wYWhiLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXBhaGhzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcGFoaHNhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXBhdWhiIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXBhdWhiLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcGF1aGIuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXBhdWhiLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXBhdWh1aHNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudm1wYXVodWhzYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1wc3VodWhzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHN1aHVoc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlidXMiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlidXMuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWJ1cy5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlidXMuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlidXN2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5YnVzdi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5YnVzdi5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlidXN2LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5YnYiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlidi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5YnYuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5YnYuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlld3VoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5ZXd1aC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5ZXd1aC42NCIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWV3dWguNjQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHloLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHloLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWguYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHloc2F0LmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWhzYXQuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHloc3JzIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aHNycy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aHNzIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aHNzLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlodXMiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlodXMuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWh1cy5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlodXMuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlodiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWh2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlodi5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlodi5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWh2c3JzIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aHZzcnMuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWllb2giLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpZW9oLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpZXdoLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWlld2guYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpZXd1aCIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWlld3VoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpZXd1aC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpZXd1aC5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWloIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aWguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWloLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWloLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aWhiIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aWhiLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpaGIuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aWhiLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aW93aCIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWlvd2guMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWl3YiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWl3Yi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aXdiLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWl3Yi5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWl3aCIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWl3aC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5aXdoLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWl3aC5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWl3dWIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpd3ViLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlpd3ViLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudm1weWl3dWIuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlvd2giLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlvd2guMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weW93aC42NC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlvd2guNjQuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlvd2gucm5kIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5b3doLnJuZC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5b3doLnJuZC5zYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5b3doLnJuZC5zYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHlvd2guc2FjYyIsCisgICJsbHZtLmhleGFnb24uVjYudm1weW93aC5zYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHl1YiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weXViLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHl1Yi5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHl1Yi5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weXVidiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weXVidi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5dWJ2LmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudm1weXVidi5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weXVoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5dWguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm1weXVoLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudm1weXVoLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5dWhlIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5dWhlLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHl1aGUuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5dWhlLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5dWh2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5dWh2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZtcHl1aHYuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXB5dWh2LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXV4IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bXV4LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZuYXZnYiIsCisgICJsbHZtLmhleGFnb24uVjYudm5hdmdiLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZuYXZnaCIsCisgICJsbHZtLmhleGFnb24uVjYudm5hdmdoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZuYXZndWIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZuYXZndWIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm5hdmd3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bmF2Z3cuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm5vcm1hbXRoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bm9ybWFtdGguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm5vcm1hbXR3IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52bm9ybWFtdHcuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudm5vdCIsCisgICJsbHZtLmhleGFnb24uVjYudm5vdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52b3IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZvci4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cGFja2ViIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cGFja2ViLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZwYWNrZWgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZwYWNrZWguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnBhY2toYi5zYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZwYWNraGIuc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZwYWNraHViLnNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudnBhY2todWIuc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZwYWNrb2IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZwYWNrb2IuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnBhY2tvaCIsCisgICJsbHZtLmhleGFnb24uVjYudnBhY2tvaC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cGFja3doLnNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudnBhY2t3aC5zYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnBhY2t3dWguc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cGFja3d1aC5zYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnBvcGNvdW50aCIsCisgICJsbHZtLmhleGFnb24uVjYudnBvcGNvdW50aC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cHJlZml4cWIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZwcmVmaXhxYi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cHJlZml4cWgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZwcmVmaXhxaC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cHJlZml4cXciLAorICAibGx2bS5oZXhhZ29uLlY2LnZwcmVmaXhxdy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cmRlbHRhIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cmRlbHRhLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5YnViLnJ0dCIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHlidWIucnR0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5YnViLnJ0dC5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5YnViLnJ0dC5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHlidXMiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHlidXMuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzaSIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHlidXNpLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzaS5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzaS5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHlidXN2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weWJ1c3YuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHlidXN2LmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHlidXN2LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weWJ2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weWJ2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5YnYuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weWJ2LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weXViIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weXViLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5dWIuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weXViLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weXViLnJ0dCIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHl1Yi5ydHQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHl1Yi5ydHQuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weXViLnJ0dC5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHl1YmkiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5dWJpLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5dWJpLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudnJtcHl1YmkuYWNjLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5dWJ2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weXVidi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm1weXVidi5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZybXB5dWJ2LmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm9yLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZyb3VuZGhiIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm91bmRoYi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm91bmRodWIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZyb3VuZGh1Yi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm91bmR1aHViIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cm91bmR1aHViLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZyb3VuZHV3dWgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZyb3VuZHV3dWguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnJvdW5kd2giLAorICAibGx2bS5oZXhhZ29uLlY2LnZyb3VuZHdoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZyb3VuZHd1aCIsCisgICJsbHZtLmhleGFnb24uVjYudnJvdW5kd3VoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZyc2FkdWJpIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cnNhZHViaS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52cnNhZHViaS5hY2MiLAorICAibGx2bS5oZXhhZ29uLlY2LnZyc2FkdWJpLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2F0aHViIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2F0aHViLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzYXR1d3VoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2F0dXd1aC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2F0d2giLAorICAibGx2bS5oZXhhZ29uLlY2LnZzYXR3aC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzYi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1oIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1oLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWguYWRkIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1oLmFkZC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1ocSIsCisgICJsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaHEuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaHciLAorICAibGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWh3LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWh3LmFkZCIsCisgICJsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaHcuYWRkLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWh3cSIsCisgICJsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaHdxLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybXciLAorICAibGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybXcuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtdy5hZGQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybXcuYWRkLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybXdxIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm13cS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2giLAorICAibGx2bS5oZXhhZ29uLlY2LnZzaC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2h1ZmVoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2h1ZmVoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzaHVmZmIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzaHVmZmIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnNodWZmZWIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzaHVmZmViLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzaHVmZmgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzaHVmZmguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnNodWZmb2IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzaHVmZm9iLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzaHVmZnZkZCIsCisgICJsbHZtLmhleGFnb24uVjYudnNodWZmdmRkLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzaHVmb2ViIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2h1Zm9lYi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c2h1Zm9laCIsCisgICJsbHZtLmhleGFnb24uVjYudnNodWZvZWguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnNodWZvaCIsCisgICJsbHZtLmhleGFnb24uVjYudnNodWZvaC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3ViYiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YmIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YmIuZHYiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJiLmR2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJibnEiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJibnEuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YmJxIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3ViYnEuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YmJzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJic2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJic2F0LmR2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3ViYnNhdC5kdi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3ViY2FycnkiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJjYXJyeS4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3ViaCIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YmguMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YmguZHYiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJoLmR2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJobnEiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJobnEuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YmhxIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3ViaHEuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YmhzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJoc2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJoc2F0LmR2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3ViaHNhdC5kdi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3ViaHciLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJody4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3VidWJoIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3VidWJoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ1YnNhdCIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YnVic2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ1YnNhdC5kdiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YnVic2F0LmR2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ1YnViYi5zYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ1YnViYi5zYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YnVoc2F0IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3VidWhzYXQuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YnVoc2F0LmR2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3VidWhzYXQuZHYuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YnVodyIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YnVody4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3VidXdzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ1d3NhdC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3VidXdzYXQuZHYiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ1d3NhdC5kdi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3VidyIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YncuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YncuZHYiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ3LmR2LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ3bnEiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ3bnEuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YndxIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3Vid3EuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnN1YndzYXQiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ3c2F0LjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZzdWJ3c2F0LmR2IiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3Vid3NhdC5kdi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52c3dhcCIsCisgICJsbHZtLmhleGFnb24uVjYudnN3YXAuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnRtcHliIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52dG1weWIuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnRtcHliLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudnRtcHliLmFjYy4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52dG1weWJ1cyIsCisgICJsbHZtLmhleGFnb24uVjYudnRtcHlidXMuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnRtcHlidXMuYWNjIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52dG1weWJ1cy5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnRtcHloYiIsCisgICJsbHZtLmhleGFnb24uVjYudnRtcHloYi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52dG1weWhiLmFjYyIsCisgICJsbHZtLmhleGFnb24uVjYudnRtcHloYi5hY2MuMTI4QiIsCisgICJsbHZtLmhleGFnb24uVjYudnVucGFja2IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2tiLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2toIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52dW5wYWNraC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52dW5wYWNrb2IiLAorICAibGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2tvYi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52dW5wYWNrb2giLAorICAibGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2tvaC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52dW5wYWNrdWIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2t1Yi4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52dW5wYWNrdWgiLAorICAibGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2t1aC4xMjhCIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52eG9yIiwKKyAgImxsdm0uaGV4YWdvbi5WNi52eG9yLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZ6YiIsCisgICJsbHZtLmhleGFnb24uVjYudnpiLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlY2LnZ6aCIsCisgICJsbHZtLmhleGFnb24uVjYudnpoLjEyOEIiLAorICAibGx2bS5oZXhhZ29uLlkyLmRjY2xlYW5hIiwKKyAgImxsdm0uaGV4YWdvbi5ZMi5kY2NsZWFuaW52YSIsCisgICJsbHZtLmhleGFnb24uWTIuZGNpbnZhIiwKKyAgImxsdm0uaGV4YWdvbi5ZMi5kY3plcm9hIiwKKyAgImxsdm0uaGV4YWdvbi5ZNC5sMmZldGNoIiwKKyAgImxsdm0uaGV4YWdvbi5ZNS5sMmZldGNoIiwKKyAgImxsdm0uaGV4YWdvbi5jaXJjLmxkYiIsCisgICJsbHZtLmhleGFnb24uY2lyYy5sZGQiLAorICAibGx2bS5oZXhhZ29uLmNpcmMubGRoIiwKKyAgImxsdm0uaGV4YWdvbi5jaXJjLmxkdWIiLAorICAibGx2bS5oZXhhZ29uLmNpcmMubGR1aCIsCisgICJsbHZtLmhleGFnb24uY2lyYy5sZHciLAorICAibGx2bS5oZXhhZ29uLmNpcmMuc3RiIiwKKyAgImxsdm0uaGV4YWdvbi5jaXJjLnN0ZCIsCisgICJsbHZtLmhleGFnb24uY2lyYy5zdGgiLAorICAibGx2bS5oZXhhZ29uLmNpcmMuc3RoaGkiLAorICAibGx2bS5oZXhhZ29uLmNpcmMuc3R3IiwKKyAgImxsdm0uaGV4YWdvbi5tbTI1NmkudmFkZHciLAorICAibGx2bS5oZXhhZ29uLnByZWZldGNoIiwKKyAgImxsdm0ubWlwcy5hYnNxLnMucGgiLAorICAibGx2bS5taXBzLmFic3Eucy5xYiIsCisgICJsbHZtLm1pcHMuYWJzcS5zLnciLAorICAibGx2bS5taXBzLmFkZC5hLmIiLAorICAibGx2bS5taXBzLmFkZC5hLmQiLAorICAibGx2bS5taXBzLmFkZC5hLmgiLAorICAibGx2bS5taXBzLmFkZC5hLnciLAorICAibGx2bS5taXBzLmFkZHEucGgiLAorICAibGx2bS5taXBzLmFkZHEucy5waCIsCisgICJsbHZtLm1pcHMuYWRkcS5zLnciLAorICAibGx2bS5taXBzLmFkZHFoLnBoIiwKKyAgImxsdm0ubWlwcy5hZGRxaC5yLnBoIiwKKyAgImxsdm0ubWlwcy5hZGRxaC5yLnciLAorICAibGx2bS5taXBzLmFkZHFoLnciLAorICAibGx2bS5taXBzLmFkZHMuYS5iIiwKKyAgImxsdm0ubWlwcy5hZGRzLmEuZCIsCisgICJsbHZtLm1pcHMuYWRkcy5hLmgiLAorICAibGx2bS5taXBzLmFkZHMuYS53IiwKKyAgImxsdm0ubWlwcy5hZGRzLnMuYiIsCisgICJsbHZtLm1pcHMuYWRkcy5zLmQiLAorICAibGx2bS5taXBzLmFkZHMucy5oIiwKKyAgImxsdm0ubWlwcy5hZGRzLnMudyIsCisgICJsbHZtLm1pcHMuYWRkcy51LmIiLAorICAibGx2bS5taXBzLmFkZHMudS5kIiwKKyAgImxsdm0ubWlwcy5hZGRzLnUuaCIsCisgICJsbHZtLm1pcHMuYWRkcy51LnciLAorICAibGx2bS5taXBzLmFkZHNjIiwKKyAgImxsdm0ubWlwcy5hZGR1LnBoIiwKKyAgImxsdm0ubWlwcy5hZGR1LnFiIiwKKyAgImxsdm0ubWlwcy5hZGR1LnMucGgiLAorICAibGx2bS5taXBzLmFkZHUucy5xYiIsCisgICJsbHZtLm1pcHMuYWRkdWgucWIiLAorICAibGx2bS5taXBzLmFkZHVoLnIucWIiLAorICAibGx2bS5taXBzLmFkZHYuYiIsCisgICJsbHZtLm1pcHMuYWRkdi5kIiwKKyAgImxsdm0ubWlwcy5hZGR2LmgiLAorICAibGx2bS5taXBzLmFkZHYudyIsCisgICJsbHZtLm1pcHMuYWRkdmkuYiIsCisgICJsbHZtLm1pcHMuYWRkdmkuZCIsCisgICJsbHZtLm1pcHMuYWRkdmkuaCIsCisgICJsbHZtLm1pcHMuYWRkdmkudyIsCisgICJsbHZtLm1pcHMuYWRkd2MiLAorICAibGx2bS5taXBzLmFuZC52IiwKKyAgImxsdm0ubWlwcy5hbmRpLmIiLAorICAibGx2bS5taXBzLmFwcGVuZCIsCisgICJsbHZtLm1pcHMuYXN1Yi5zLmIiLAorICAibGx2bS5taXBzLmFzdWIucy5kIiwKKyAgImxsdm0ubWlwcy5hc3ViLnMuaCIsCisgICJsbHZtLm1pcHMuYXN1Yi5zLnciLAorICAibGx2bS5taXBzLmFzdWIudS5iIiwKKyAgImxsdm0ubWlwcy5hc3ViLnUuZCIsCisgICJsbHZtLm1pcHMuYXN1Yi51LmgiLAorICAibGx2bS5taXBzLmFzdWIudS53IiwKKyAgImxsdm0ubWlwcy5hdmUucy5iIiwKKyAgImxsdm0ubWlwcy5hdmUucy5kIiwKKyAgImxsdm0ubWlwcy5hdmUucy5oIiwKKyAgImxsdm0ubWlwcy5hdmUucy53IiwKKyAgImxsdm0ubWlwcy5hdmUudS5iIiwKKyAgImxsdm0ubWlwcy5hdmUudS5kIiwKKyAgImxsdm0ubWlwcy5hdmUudS5oIiwKKyAgImxsdm0ubWlwcy5hdmUudS53IiwKKyAgImxsdm0ubWlwcy5hdmVyLnMuYiIsCisgICJsbHZtLm1pcHMuYXZlci5zLmQiLAorICAibGx2bS5taXBzLmF2ZXIucy5oIiwKKyAgImxsdm0ubWlwcy5hdmVyLnMudyIsCisgICJsbHZtLm1pcHMuYXZlci51LmIiLAorICAibGx2bS5taXBzLmF2ZXIudS5kIiwKKyAgImxsdm0ubWlwcy5hdmVyLnUuaCIsCisgICJsbHZtLm1pcHMuYXZlci51LnciLAorICAibGx2bS5taXBzLmJhbGlnbiIsCisgICJsbHZtLm1pcHMuYmNsci5iIiwKKyAgImxsdm0ubWlwcy5iY2xyLmQiLAorICAibGx2bS5taXBzLmJjbHIuaCIsCisgICJsbHZtLm1pcHMuYmNsci53IiwKKyAgImxsdm0ubWlwcy5iY2xyaS5iIiwKKyAgImxsdm0ubWlwcy5iY2xyaS5kIiwKKyAgImxsdm0ubWlwcy5iY2xyaS5oIiwKKyAgImxsdm0ubWlwcy5iY2xyaS53IiwKKyAgImxsdm0ubWlwcy5iaW5zbC5iIiwKKyAgImxsdm0ubWlwcy5iaW5zbC5kIiwKKyAgImxsdm0ubWlwcy5iaW5zbC5oIiwKKyAgImxsdm0ubWlwcy5iaW5zbC53IiwKKyAgImxsdm0ubWlwcy5iaW5zbGkuYiIsCisgICJsbHZtLm1pcHMuYmluc2xpLmQiLAorICAibGx2bS5taXBzLmJpbnNsaS5oIiwKKyAgImxsdm0ubWlwcy5iaW5zbGkudyIsCisgICJsbHZtLm1pcHMuYmluc3IuYiIsCisgICJsbHZtLm1pcHMuYmluc3IuZCIsCisgICJsbHZtLm1pcHMuYmluc3IuaCIsCisgICJsbHZtLm1pcHMuYmluc3IudyIsCisgICJsbHZtLm1pcHMuYmluc3JpLmIiLAorICAibGx2bS5taXBzLmJpbnNyaS5kIiwKKyAgImxsdm0ubWlwcy5iaW5zcmkuaCIsCisgICJsbHZtLm1pcHMuYmluc3JpLnciLAorICAibGx2bS5taXBzLmJpdHJldiIsCisgICJsbHZtLm1pcHMuYm1uei52IiwKKyAgImxsdm0ubWlwcy5ibW56aS5iIiwKKyAgImxsdm0ubWlwcy5ibXoudiIsCisgICJsbHZtLm1pcHMuYm16aS5iIiwKKyAgImxsdm0ubWlwcy5ibmVnLmIiLAorICAibGx2bS5taXBzLmJuZWcuZCIsCisgICJsbHZtLm1pcHMuYm5lZy5oIiwKKyAgImxsdm0ubWlwcy5ibmVnLnciLAorICAibGx2bS5taXBzLmJuZWdpLmIiLAorICAibGx2bS5taXBzLmJuZWdpLmQiLAorICAibGx2bS5taXBzLmJuZWdpLmgiLAorICAibGx2bS5taXBzLmJuZWdpLnciLAorICAibGx2bS5taXBzLmJuei5iIiwKKyAgImxsdm0ubWlwcy5ibnouZCIsCisgICJsbHZtLm1pcHMuYm56LmgiLAorICAibGx2bS5taXBzLmJuei52IiwKKyAgImxsdm0ubWlwcy5ibnoudyIsCisgICJsbHZtLm1pcHMuYnBvc2dlMzIiLAorICAibGx2bS5taXBzLmJzZWwudiIsCisgICJsbHZtLm1pcHMuYnNlbGkuYiIsCisgICJsbHZtLm1pcHMuYnNldC5iIiwKKyAgImxsdm0ubWlwcy5ic2V0LmQiLAorICAibGx2bS5taXBzLmJzZXQuaCIsCisgICJsbHZtLm1pcHMuYnNldC53IiwKKyAgImxsdm0ubWlwcy5ic2V0aS5iIiwKKyAgImxsdm0ubWlwcy5ic2V0aS5kIiwKKyAgImxsdm0ubWlwcy5ic2V0aS5oIiwKKyAgImxsdm0ubWlwcy5ic2V0aS53IiwKKyAgImxsdm0ubWlwcy5iei5iIiwKKyAgImxsdm0ubWlwcy5iei5kIiwKKyAgImxsdm0ubWlwcy5iei5oIiwKKyAgImxsdm0ubWlwcy5iei52IiwKKyAgImxsdm0ubWlwcy5iei53IiwKKyAgImxsdm0ubWlwcy5jZXEuYiIsCisgICJsbHZtLm1pcHMuY2VxLmQiLAorICAibGx2bS5taXBzLmNlcS5oIiwKKyAgImxsdm0ubWlwcy5jZXEudyIsCisgICJsbHZtLm1pcHMuY2VxaS5iIiwKKyAgImxsdm0ubWlwcy5jZXFpLmQiLAorICAibGx2bS5taXBzLmNlcWkuaCIsCisgICJsbHZtLm1pcHMuY2VxaS53IiwKKyAgImxsdm0ubWlwcy5jZmNtc2EiLAorICAibGx2bS5taXBzLmNsZS5zLmIiLAorICAibGx2bS5taXBzLmNsZS5zLmQiLAorICAibGx2bS5taXBzLmNsZS5zLmgiLAorICAibGx2bS5taXBzLmNsZS5zLnciLAorICAibGx2bS5taXBzLmNsZS51LmIiLAorICAibGx2bS5taXBzLmNsZS51LmQiLAorICAibGx2bS5taXBzLmNsZS51LmgiLAorICAibGx2bS5taXBzLmNsZS51LnciLAorICAibGx2bS5taXBzLmNsZWkucy5iIiwKKyAgImxsdm0ubWlwcy5jbGVpLnMuZCIsCisgICJsbHZtLm1pcHMuY2xlaS5zLmgiLAorICAibGx2bS5taXBzLmNsZWkucy53IiwKKyAgImxsdm0ubWlwcy5jbGVpLnUuYiIsCisgICJsbHZtLm1pcHMuY2xlaS51LmQiLAorICAibGx2bS5taXBzLmNsZWkudS5oIiwKKyAgImxsdm0ubWlwcy5jbGVpLnUudyIsCisgICJsbHZtLm1pcHMuY2x0LnMuYiIsCisgICJsbHZtLm1pcHMuY2x0LnMuZCIsCisgICJsbHZtLm1pcHMuY2x0LnMuaCIsCisgICJsbHZtLm1pcHMuY2x0LnMudyIsCisgICJsbHZtLm1pcHMuY2x0LnUuYiIsCisgICJsbHZtLm1pcHMuY2x0LnUuZCIsCisgICJsbHZtLm1pcHMuY2x0LnUuaCIsCisgICJsbHZtLm1pcHMuY2x0LnUudyIsCisgICJsbHZtLm1pcHMuY2x0aS5zLmIiLAorICAibGx2bS5taXBzLmNsdGkucy5kIiwKKyAgImxsdm0ubWlwcy5jbHRpLnMuaCIsCisgICJsbHZtLm1pcHMuY2x0aS5zLnciLAorICAibGx2bS5taXBzLmNsdGkudS5iIiwKKyAgImxsdm0ubWlwcy5jbHRpLnUuZCIsCisgICJsbHZtLm1pcHMuY2x0aS51LmgiLAorICAibGx2bS5taXBzLmNsdGkudS53IiwKKyAgImxsdm0ubWlwcy5jbXAuZXEucGgiLAorICAibGx2bS5taXBzLmNtcC5sZS5waCIsCisgICJsbHZtLm1pcHMuY21wLmx0LnBoIiwKKyAgImxsdm0ubWlwcy5jbXBnZHUuZXEucWIiLAorICAibGx2bS5taXBzLmNtcGdkdS5sZS5xYiIsCisgICJsbHZtLm1pcHMuY21wZ2R1Lmx0LnFiIiwKKyAgImxsdm0ubWlwcy5jbXBndS5lcS5xYiIsCisgICJsbHZtLm1pcHMuY21wZ3UubGUucWIiLAorICAibGx2bS5taXBzLmNtcGd1Lmx0LnFiIiwKKyAgImxsdm0ubWlwcy5jbXB1LmVxLnFiIiwKKyAgImxsdm0ubWlwcy5jbXB1LmxlLnFiIiwKKyAgImxsdm0ubWlwcy5jbXB1Lmx0LnFiIiwKKyAgImxsdm0ubWlwcy5jb3B5LnMuYiIsCisgICJsbHZtLm1pcHMuY29weS5zLmQiLAorICAibGx2bS5taXBzLmNvcHkucy5oIiwKKyAgImxsdm0ubWlwcy5jb3B5LnMudyIsCisgICJsbHZtLm1pcHMuY29weS51LmIiLAorICAibGx2bS5taXBzLmNvcHkudS5kIiwKKyAgImxsdm0ubWlwcy5jb3B5LnUuaCIsCisgICJsbHZtLm1pcHMuY29weS51LnciLAorICAibGx2bS5taXBzLmN0Y21zYSIsCisgICJsbHZtLm1pcHMuZGl2LnMuYiIsCisgICJsbHZtLm1pcHMuZGl2LnMuZCIsCisgICJsbHZtLm1pcHMuZGl2LnMuaCIsCisgICJsbHZtLm1pcHMuZGl2LnMudyIsCisgICJsbHZtLm1pcHMuZGl2LnUuYiIsCisgICJsbHZtLm1pcHMuZGl2LnUuZCIsCisgICJsbHZtLm1pcHMuZGl2LnUuaCIsCisgICJsbHZtLm1pcHMuZGl2LnUudyIsCisgICJsbHZtLm1pcHMuZGxzYSIsCisgICJsbHZtLm1pcHMuZG90cC5zLmQiLAorICAibGx2bS5taXBzLmRvdHAucy5oIiwKKyAgImxsdm0ubWlwcy5kb3RwLnMudyIsCisgICJsbHZtLm1pcHMuZG90cC51LmQiLAorICAibGx2bS5taXBzLmRvdHAudS5oIiwKKyAgImxsdm0ubWlwcy5kb3RwLnUudyIsCisgICJsbHZtLm1pcHMuZHBhLncucGgiLAorICAibGx2bS5taXBzLmRwYWRkLnMuZCIsCisgICJsbHZtLm1pcHMuZHBhZGQucy5oIiwKKyAgImxsdm0ubWlwcy5kcGFkZC5zLnciLAorICAibGx2bS5taXBzLmRwYWRkLnUuZCIsCisgICJsbHZtLm1pcHMuZHBhZGQudS5oIiwKKyAgImxsdm0ubWlwcy5kcGFkZC51LnciLAorICAibGx2bS5taXBzLmRwYXEucy53LnBoIiwKKyAgImxsdm0ubWlwcy5kcGFxLnNhLmwudyIsCisgICJsbHZtLm1pcHMuZHBhcXgucy53LnBoIiwKKyAgImxsdm0ubWlwcy5kcGFxeC5zYS53LnBoIiwKKyAgImxsdm0ubWlwcy5kcGF1LmgucWJsIiwKKyAgImxsdm0ubWlwcy5kcGF1LmgucWJyIiwKKyAgImxsdm0ubWlwcy5kcGF4LncucGgiLAorICAibGx2bS5taXBzLmRwcy53LnBoIiwKKyAgImxsdm0ubWlwcy5kcHNxLnMudy5waCIsCisgICJsbHZtLm1pcHMuZHBzcS5zYS5sLnciLAorICAibGx2bS5taXBzLmRwc3F4LnMudy5waCIsCisgICJsbHZtLm1pcHMuZHBzcXguc2Eudy5waCIsCisgICJsbHZtLm1pcHMuZHBzdS5oLnFibCIsCisgICJsbHZtLm1pcHMuZHBzdS5oLnFiciIsCisgICJsbHZtLm1pcHMuZHBzdWIucy5kIiwKKyAgImxsdm0ubWlwcy5kcHN1Yi5zLmgiLAorICAibGx2bS5taXBzLmRwc3ViLnMudyIsCisgICJsbHZtLm1pcHMuZHBzdWIudS5kIiwKKyAgImxsdm0ubWlwcy5kcHN1Yi51LmgiLAorICAibGx2bS5taXBzLmRwc3ViLnUudyIsCisgICJsbHZtLm1pcHMuZHBzeC53LnBoIiwKKyAgImxsdm0ubWlwcy5leHRwIiwKKyAgImxsdm0ubWlwcy5leHRwZHAiLAorICAibGx2bS5taXBzLmV4dHIuci53IiwKKyAgImxsdm0ubWlwcy5leHRyLnJzLnciLAorICAibGx2bS5taXBzLmV4dHIucy5oIiwKKyAgImxsdm0ubWlwcy5leHRyLnciLAorICAibGx2bS5taXBzLmZhZGQuZCIsCisgICJsbHZtLm1pcHMuZmFkZC53IiwKKyAgImxsdm0ubWlwcy5mY2FmLmQiLAorICAibGx2bS5taXBzLmZjYWYudyIsCisgICJsbHZtLm1pcHMuZmNlcS5kIiwKKyAgImxsdm0ubWlwcy5mY2VxLnciLAorICAibGx2bS5taXBzLmZjbGFzcy5kIiwKKyAgImxsdm0ubWlwcy5mY2xhc3MudyIsCisgICJsbHZtLm1pcHMuZmNsZS5kIiwKKyAgImxsdm0ubWlwcy5mY2xlLnciLAorICAibGx2bS5taXBzLmZjbHQuZCIsCisgICJsbHZtLm1pcHMuZmNsdC53IiwKKyAgImxsdm0ubWlwcy5mY25lLmQiLAorICAibGx2bS5taXBzLmZjbmUudyIsCisgICJsbHZtLm1pcHMuZmNvci5kIiwKKyAgImxsdm0ubWlwcy5mY29yLnciLAorICAibGx2bS5taXBzLmZjdWVxLmQiLAorICAibGx2bS5taXBzLmZjdWVxLnciLAorICAibGx2bS5taXBzLmZjdWxlLmQiLAorICAibGx2bS5taXBzLmZjdWxlLnciLAorICAibGx2bS5taXBzLmZjdWx0LmQiLAorICAibGx2bS5taXBzLmZjdWx0LnciLAorICAibGx2bS5taXBzLmZjdW4uZCIsCisgICJsbHZtLm1pcHMuZmN1bi53IiwKKyAgImxsdm0ubWlwcy5mY3VuZS5kIiwKKyAgImxsdm0ubWlwcy5mY3VuZS53IiwKKyAgImxsdm0ubWlwcy5mZGl2LmQiLAorICAibGx2bS5taXBzLmZkaXYudyIsCisgICJsbHZtLm1pcHMuZmV4ZG8uaCIsCisgICJsbHZtLm1pcHMuZmV4ZG8udyIsCisgICJsbHZtLm1pcHMuZmV4cDIuZCIsCisgICJsbHZtLm1pcHMuZmV4cDIudyIsCisgICJsbHZtLm1pcHMuZmV4dXBsLmQiLAorICAibGx2bS5taXBzLmZleHVwbC53IiwKKyAgImxsdm0ubWlwcy5mZXh1cHIuZCIsCisgICJsbHZtLm1pcHMuZmV4dXByLnciLAorICAibGx2bS5taXBzLmZmaW50LnMuZCIsCisgICJsbHZtLm1pcHMuZmZpbnQucy53IiwKKyAgImxsdm0ubWlwcy5mZmludC51LmQiLAorICAibGx2bS5taXBzLmZmaW50LnUudyIsCisgICJsbHZtLm1pcHMuZmZxbC5kIiwKKyAgImxsdm0ubWlwcy5mZnFsLnciLAorICAibGx2bS5taXBzLmZmcXIuZCIsCisgICJsbHZtLm1pcHMuZmZxci53IiwKKyAgImxsdm0ubWlwcy5maWxsLmIiLAorICAibGx2bS5taXBzLmZpbGwuZCIsCisgICJsbHZtLm1pcHMuZmlsbC5oIiwKKyAgImxsdm0ubWlwcy5maWxsLnciLAorICAibGx2bS5taXBzLmZsb2cyLmQiLAorICAibGx2bS5taXBzLmZsb2cyLnciLAorICAibGx2bS5taXBzLmZtYWRkLmQiLAorICAibGx2bS5taXBzLmZtYWRkLnciLAorICAibGx2bS5taXBzLmZtYXguYS5kIiwKKyAgImxsdm0ubWlwcy5mbWF4LmEudyIsCisgICJsbHZtLm1pcHMuZm1heC5kIiwKKyAgImxsdm0ubWlwcy5mbWF4LnciLAorICAibGx2bS5taXBzLmZtaW4uYS5kIiwKKyAgImxsdm0ubWlwcy5mbWluLmEudyIsCisgICJsbHZtLm1pcHMuZm1pbi5kIiwKKyAgImxsdm0ubWlwcy5mbWluLnciLAorICAibGx2bS5taXBzLmZtc3ViLmQiLAorICAibGx2bS5taXBzLmZtc3ViLnciLAorICAibGx2bS5taXBzLmZtdWwuZCIsCisgICJsbHZtLm1pcHMuZm11bC53IiwKKyAgImxsdm0ubWlwcy5mcmNwLmQiLAorICAibGx2bS5taXBzLmZyY3AudyIsCisgICJsbHZtLm1pcHMuZnJpbnQuZCIsCisgICJsbHZtLm1pcHMuZnJpbnQudyIsCisgICJsbHZtLm1pcHMuZnJzcXJ0LmQiLAorICAibGx2bS5taXBzLmZyc3FydC53IiwKKyAgImxsdm0ubWlwcy5mc2FmLmQiLAorICAibGx2bS5taXBzLmZzYWYudyIsCisgICJsbHZtLm1pcHMuZnNlcS5kIiwKKyAgImxsdm0ubWlwcy5mc2VxLnciLAorICAibGx2bS5taXBzLmZzbGUuZCIsCisgICJsbHZtLm1pcHMuZnNsZS53IiwKKyAgImxsdm0ubWlwcy5mc2x0LmQiLAorICAibGx2bS5taXBzLmZzbHQudyIsCisgICJsbHZtLm1pcHMuZnNuZS5kIiwKKyAgImxsdm0ubWlwcy5mc25lLnciLAorICAibGx2bS5taXBzLmZzb3IuZCIsCisgICJsbHZtLm1pcHMuZnNvci53IiwKKyAgImxsdm0ubWlwcy5mc3FydC5kIiwKKyAgImxsdm0ubWlwcy5mc3FydC53IiwKKyAgImxsdm0ubWlwcy5mc3ViLmQiLAorICAibGx2bS5taXBzLmZzdWIudyIsCisgICJsbHZtLm1pcHMuZnN1ZXEuZCIsCisgICJsbHZtLm1pcHMuZnN1ZXEudyIsCisgICJsbHZtLm1pcHMuZnN1bGUuZCIsCisgICJsbHZtLm1pcHMuZnN1bGUudyIsCisgICJsbHZtLm1pcHMuZnN1bHQuZCIsCisgICJsbHZtLm1pcHMuZnN1bHQudyIsCisgICJsbHZtLm1pcHMuZnN1bi5kIiwKKyAgImxsdm0ubWlwcy5mc3VuLnciLAorICAibGx2bS5taXBzLmZzdW5lLmQiLAorICAibGx2bS5taXBzLmZzdW5lLnciLAorICAibGx2bS5taXBzLmZ0aW50LnMuZCIsCisgICJsbHZtLm1pcHMuZnRpbnQucy53IiwKKyAgImxsdm0ubWlwcy5mdGludC51LmQiLAorICAibGx2bS5taXBzLmZ0aW50LnUudyIsCisgICJsbHZtLm1pcHMuZnRxLmgiLAorICAibGx2bS5taXBzLmZ0cS53IiwKKyAgImxsdm0ubWlwcy5mdHJ1bmMucy5kIiwKKyAgImxsdm0ubWlwcy5mdHJ1bmMucy53IiwKKyAgImxsdm0ubWlwcy5mdHJ1bmMudS5kIiwKKyAgImxsdm0ubWlwcy5mdHJ1bmMudS53IiwKKyAgImxsdm0ubWlwcy5oYWRkLnMuZCIsCisgICJsbHZtLm1pcHMuaGFkZC5zLmgiLAorICAibGx2bS5taXBzLmhhZGQucy53IiwKKyAgImxsdm0ubWlwcy5oYWRkLnUuZCIsCisgICJsbHZtLm1pcHMuaGFkZC51LmgiLAorICAibGx2bS5taXBzLmhhZGQudS53IiwKKyAgImxsdm0ubWlwcy5oc3ViLnMuZCIsCisgICJsbHZtLm1pcHMuaHN1Yi5zLmgiLAorICAibGx2bS5taXBzLmhzdWIucy53IiwKKyAgImxsdm0ubWlwcy5oc3ViLnUuZCIsCisgICJsbHZtLm1pcHMuaHN1Yi51LmgiLAorICAibGx2bS5taXBzLmhzdWIudS53IiwKKyAgImxsdm0ubWlwcy5pbHZldi5iIiwKKyAgImxsdm0ubWlwcy5pbHZldi5kIiwKKyAgImxsdm0ubWlwcy5pbHZldi5oIiwKKyAgImxsdm0ubWlwcy5pbHZldi53IiwKKyAgImxsdm0ubWlwcy5pbHZsLmIiLAorICAibGx2bS5taXBzLmlsdmwuZCIsCisgICJsbHZtLm1pcHMuaWx2bC5oIiwKKyAgImxsdm0ubWlwcy5pbHZsLnciLAorICAibGx2bS5taXBzLmlsdm9kLmIiLAorICAibGx2bS5taXBzLmlsdm9kLmQiLAorICAibGx2bS5taXBzLmlsdm9kLmgiLAorICAibGx2bS5taXBzLmlsdm9kLnciLAorICAibGx2bS5taXBzLmlsdnIuYiIsCisgICJsbHZtLm1pcHMuaWx2ci5kIiwKKyAgImxsdm0ubWlwcy5pbHZyLmgiLAorICAibGx2bS5taXBzLmlsdnIudyIsCisgICJsbHZtLm1pcHMuaW5zZXJ0LmIiLAorICAibGx2bS5taXBzLmluc2VydC5kIiwKKyAgImxsdm0ubWlwcy5pbnNlcnQuaCIsCisgICJsbHZtLm1pcHMuaW5zZXJ0LnciLAorICAibGx2bS5taXBzLmluc3YiLAorICAibGx2bS5taXBzLmluc3ZlLmIiLAorICAibGx2bS5taXBzLmluc3ZlLmQiLAorICAibGx2bS5taXBzLmluc3ZlLmgiLAorICAibGx2bS5taXBzLmluc3ZlLnciLAorICAibGx2bS5taXBzLmxidXgiLAorICAibGx2bS5taXBzLmxkLmIiLAorICAibGx2bS5taXBzLmxkLmQiLAorICAibGx2bS5taXBzLmxkLmgiLAorICAibGx2bS5taXBzLmxkLnciLAorICAibGx2bS5taXBzLmxkaS5iIiwKKyAgImxsdm0ubWlwcy5sZGkuZCIsCisgICJsbHZtLm1pcHMubGRpLmgiLAorICAibGx2bS5taXBzLmxkaS53IiwKKyAgImxsdm0ubWlwcy5saHgiLAorICAibGx2bS5taXBzLmxzYSIsCisgICJsbHZtLm1pcHMubHd4IiwKKyAgImxsdm0ubWlwcy5tYWRkIiwKKyAgImxsdm0ubWlwcy5tYWRkLnEuaCIsCisgICJsbHZtLm1pcHMubWFkZC5xLnciLAorICAibGx2bS5taXBzLm1hZGRyLnEuaCIsCisgICJsbHZtLm1pcHMubWFkZHIucS53IiwKKyAgImxsdm0ubWlwcy5tYWRkdSIsCisgICJsbHZtLm1pcHMubWFkZHYuYiIsCisgICJsbHZtLm1pcHMubWFkZHYuZCIsCisgICJsbHZtLm1pcHMubWFkZHYuaCIsCisgICJsbHZtLm1pcHMubWFkZHYudyIsCisgICJsbHZtLm1pcHMubWFxLnMudy5waGwiLAorICAibGx2bS5taXBzLm1hcS5zLncucGhyIiwKKyAgImxsdm0ubWlwcy5tYXEuc2Eudy5waGwiLAorICAibGx2bS5taXBzLm1hcS5zYS53LnBociIsCisgICJsbHZtLm1pcHMubWF4LmEuYiIsCisgICJsbHZtLm1pcHMubWF4LmEuZCIsCisgICJsbHZtLm1pcHMubWF4LmEuaCIsCisgICJsbHZtLm1pcHMubWF4LmEudyIsCisgICJsbHZtLm1pcHMubWF4LnMuYiIsCisgICJsbHZtLm1pcHMubWF4LnMuZCIsCisgICJsbHZtLm1pcHMubWF4LnMuaCIsCisgICJsbHZtLm1pcHMubWF4LnMudyIsCisgICJsbHZtLm1pcHMubWF4LnUuYiIsCisgICJsbHZtLm1pcHMubWF4LnUuZCIsCisgICJsbHZtLm1pcHMubWF4LnUuaCIsCisgICJsbHZtLm1pcHMubWF4LnUudyIsCisgICJsbHZtLm1pcHMubWF4aS5zLmIiLAorICAibGx2bS5taXBzLm1heGkucy5kIiwKKyAgImxsdm0ubWlwcy5tYXhpLnMuaCIsCisgICJsbHZtLm1pcHMubWF4aS5zLnciLAorICAibGx2bS5taXBzLm1heGkudS5iIiwKKyAgImxsdm0ubWlwcy5tYXhpLnUuZCIsCisgICJsbHZtLm1pcHMubWF4aS51LmgiLAorICAibGx2bS5taXBzLm1heGkudS53IiwKKyAgImxsdm0ubWlwcy5taW4uYS5iIiwKKyAgImxsdm0ubWlwcy5taW4uYS5kIiwKKyAgImxsdm0ubWlwcy5taW4uYS5oIiwKKyAgImxsdm0ubWlwcy5taW4uYS53IiwKKyAgImxsdm0ubWlwcy5taW4ucy5iIiwKKyAgImxsdm0ubWlwcy5taW4ucy5kIiwKKyAgImxsdm0ubWlwcy5taW4ucy5oIiwKKyAgImxsdm0ubWlwcy5taW4ucy53IiwKKyAgImxsdm0ubWlwcy5taW4udS5iIiwKKyAgImxsdm0ubWlwcy5taW4udS5kIiwKKyAgImxsdm0ubWlwcy5taW4udS5oIiwKKyAgImxsdm0ubWlwcy5taW4udS53IiwKKyAgImxsdm0ubWlwcy5taW5pLnMuYiIsCisgICJsbHZtLm1pcHMubWluaS5zLmQiLAorICAibGx2bS5taXBzLm1pbmkucy5oIiwKKyAgImxsdm0ubWlwcy5taW5pLnMudyIsCisgICJsbHZtLm1pcHMubWluaS51LmIiLAorICAibGx2bS5taXBzLm1pbmkudS5kIiwKKyAgImxsdm0ubWlwcy5taW5pLnUuaCIsCisgICJsbHZtLm1pcHMubWluaS51LnciLAorICAibGx2bS5taXBzLm1vZC5zLmIiLAorICAibGx2bS5taXBzLm1vZC5zLmQiLAorICAibGx2bS5taXBzLm1vZC5zLmgiLAorICAibGx2bS5taXBzLm1vZC5zLnciLAorICAibGx2bS5taXBzLm1vZC51LmIiLAorICAibGx2bS5taXBzLm1vZC51LmQiLAorICAibGx2bS5taXBzLm1vZC51LmgiLAorICAibGx2bS5taXBzLm1vZC51LnciLAorICAibGx2bS5taXBzLm1vZHN1YiIsCisgICJsbHZtLm1pcHMubW92ZS52IiwKKyAgImxsdm0ubWlwcy5tc3ViIiwKKyAgImxsdm0ubWlwcy5tc3ViLnEuaCIsCisgICJsbHZtLm1pcHMubXN1Yi5xLnciLAorICAibGx2bS5taXBzLm1zdWJyLnEuaCIsCisgICJsbHZtLm1pcHMubXN1YnIucS53IiwKKyAgImxsdm0ubWlwcy5tc3VidSIsCisgICJsbHZtLm1pcHMubXN1YnYuYiIsCisgICJsbHZtLm1pcHMubXN1YnYuZCIsCisgICJsbHZtLm1pcHMubXN1YnYuaCIsCisgICJsbHZtLm1pcHMubXN1YnYudyIsCisgICJsbHZtLm1pcHMubXRobGlwIiwKKyAgImxsdm0ubWlwcy5tdWwucGgiLAorICAibGx2bS5taXBzLm11bC5xLmgiLAorICAibGx2bS5taXBzLm11bC5xLnciLAorICAibGx2bS5taXBzLm11bC5zLnBoIiwKKyAgImxsdm0ubWlwcy5tdWxlcS5zLncucGhsIiwKKyAgImxsdm0ubWlwcy5tdWxlcS5zLncucGhyIiwKKyAgImxsdm0ubWlwcy5tdWxldS5zLnBoLnFibCIsCisgICJsbHZtLm1pcHMubXVsZXUucy5waC5xYnIiLAorICAibGx2bS5taXBzLm11bHEucnMucGgiLAorICAibGx2bS5taXBzLm11bHEucnMudyIsCisgICJsbHZtLm1pcHMubXVscS5zLnBoIiwKKyAgImxsdm0ubWlwcy5tdWxxLnMudyIsCisgICJsbHZtLm1pcHMubXVsci5xLmgiLAorICAibGx2bS5taXBzLm11bHIucS53IiwKKyAgImxsdm0ubWlwcy5tdWxzYS53LnBoIiwKKyAgImxsdm0ubWlwcy5tdWxzYXEucy53LnBoIiwKKyAgImxsdm0ubWlwcy5tdWx0IiwKKyAgImxsdm0ubWlwcy5tdWx0dSIsCisgICJsbHZtLm1pcHMubXVsdi5iIiwKKyAgImxsdm0ubWlwcy5tdWx2LmQiLAorICAibGx2bS5taXBzLm11bHYuaCIsCisgICJsbHZtLm1pcHMubXVsdi53IiwKKyAgImxsdm0ubWlwcy5ubG9jLmIiLAorICAibGx2bS5taXBzLm5sb2MuZCIsCisgICJsbHZtLm1pcHMubmxvYy5oIiwKKyAgImxsdm0ubWlwcy5ubG9jLnciLAorICAibGx2bS5taXBzLm5semMuYiIsCisgICJsbHZtLm1pcHMubmx6Yy5kIiwKKyAgImxsdm0ubWlwcy5ubHpjLmgiLAorICAibGx2bS5taXBzLm5semMudyIsCisgICJsbHZtLm1pcHMubm9yLnYiLAorICAibGx2bS5taXBzLm5vcmkuYiIsCisgICJsbHZtLm1pcHMub3IudiIsCisgICJsbHZtLm1pcHMub3JpLmIiLAorICAibGx2bS5taXBzLnBhY2tybC5waCIsCisgICJsbHZtLm1pcHMucGNrZXYuYiIsCisgICJsbHZtLm1pcHMucGNrZXYuZCIsCisgICJsbHZtLm1pcHMucGNrZXYuaCIsCisgICJsbHZtLm1pcHMucGNrZXYudyIsCisgICJsbHZtLm1pcHMucGNrb2QuYiIsCisgICJsbHZtLm1pcHMucGNrb2QuZCIsCisgICJsbHZtLm1pcHMucGNrb2QuaCIsCisgICJsbHZtLm1pcHMucGNrb2QudyIsCisgICJsbHZtLm1pcHMucGNudC5iIiwKKyAgImxsdm0ubWlwcy5wY250LmQiLAorICAibGx2bS5taXBzLnBjbnQuaCIsCisgICJsbHZtLm1pcHMucGNudC53IiwKKyAgImxsdm0ubWlwcy5waWNrLnBoIiwKKyAgImxsdm0ubWlwcy5waWNrLnFiIiwKKyAgImxsdm0ubWlwcy5wcmVjZXEudy5waGwiLAorICAibGx2bS5taXBzLnByZWNlcS53LnBociIsCisgICJsbHZtLm1pcHMucHJlY2VxdS5waC5xYmwiLAorICAibGx2bS5taXBzLnByZWNlcXUucGgucWJsYSIsCisgICJsbHZtLm1pcHMucHJlY2VxdS5waC5xYnIiLAorICAibGx2bS5taXBzLnByZWNlcXUucGgucWJyYSIsCisgICJsbHZtLm1pcHMucHJlY2V1LnBoLnFibCIsCisgICJsbHZtLm1pcHMucHJlY2V1LnBoLnFibGEiLAorICAibGx2bS5taXBzLnByZWNldS5waC5xYnIiLAorICAibGx2bS5taXBzLnByZWNldS5waC5xYnJhIiwKKyAgImxsdm0ubWlwcy5wcmVjci5xYi5waCIsCisgICJsbHZtLm1pcHMucHJlY3Iuc3JhLnBoLnciLAorICAibGx2bS5taXBzLnByZWNyLnNyYS5yLnBoLnciLAorICAibGx2bS5taXBzLnByZWNycS5waC53IiwKKyAgImxsdm0ubWlwcy5wcmVjcnEucWIucGgiLAorICAibGx2bS5taXBzLnByZWNycS5ycy5waC53IiwKKyAgImxsdm0ubWlwcy5wcmVjcnF1LnMucWIucGgiLAorICAibGx2bS5taXBzLnByZXBlbmQiLAorICAibGx2bS5taXBzLnJhZGR1LncucWIiLAorICAibGx2bS5taXBzLnJkZHNwIiwKKyAgImxsdm0ubWlwcy5yZXBsLnBoIiwKKyAgImxsdm0ubWlwcy5yZXBsLnFiIiwKKyAgImxsdm0ubWlwcy5zYXQucy5iIiwKKyAgImxsdm0ubWlwcy5zYXQucy5kIiwKKyAgImxsdm0ubWlwcy5zYXQucy5oIiwKKyAgImxsdm0ubWlwcy5zYXQucy53IiwKKyAgImxsdm0ubWlwcy5zYXQudS5iIiwKKyAgImxsdm0ubWlwcy5zYXQudS5kIiwKKyAgImxsdm0ubWlwcy5zYXQudS5oIiwKKyAgImxsdm0ubWlwcy5zYXQudS53IiwKKyAgImxsdm0ubWlwcy5zaGYuYiIsCisgICJsbHZtLm1pcHMuc2hmLmgiLAorICAibGx2bS5taXBzLnNoZi53IiwKKyAgImxsdm0ubWlwcy5zaGlsbyIsCisgICJsbHZtLm1pcHMuc2hsbC5waCIsCisgICJsbHZtLm1pcHMuc2hsbC5xYiIsCisgICJsbHZtLm1pcHMuc2hsbC5zLnBoIiwKKyAgImxsdm0ubWlwcy5zaGxsLnMudyIsCisgICJsbHZtLm1pcHMuc2hyYS5waCIsCisgICJsbHZtLm1pcHMuc2hyYS5xYiIsCisgICJsbHZtLm1pcHMuc2hyYS5yLnBoIiwKKyAgImxsdm0ubWlwcy5zaHJhLnIucWIiLAorICAibGx2bS5taXBzLnNocmEuci53IiwKKyAgImxsdm0ubWlwcy5zaHJsLnBoIiwKKyAgImxsdm0ubWlwcy5zaHJsLnFiIiwKKyAgImxsdm0ubWlwcy5zbGQuYiIsCisgICJsbHZtLm1pcHMuc2xkLmQiLAorICAibGx2bS5taXBzLnNsZC5oIiwKKyAgImxsdm0ubWlwcy5zbGQudyIsCisgICJsbHZtLm1pcHMuc2xkaS5iIiwKKyAgImxsdm0ubWlwcy5zbGRpLmQiLAorICAibGx2bS5taXBzLnNsZGkuaCIsCisgICJsbHZtLm1pcHMuc2xkaS53IiwKKyAgImxsdm0ubWlwcy5zbGwuYiIsCisgICJsbHZtLm1pcHMuc2xsLmQiLAorICAibGx2bS5taXBzLnNsbC5oIiwKKyAgImxsdm0ubWlwcy5zbGwudyIsCisgICJsbHZtLm1pcHMuc2xsaS5iIiwKKyAgImxsdm0ubWlwcy5zbGxpLmQiLAorICAibGx2bS5taXBzLnNsbGkuaCIsCisgICJsbHZtLm1pcHMuc2xsaS53IiwKKyAgImxsdm0ubWlwcy5zcGxhdC5iIiwKKyAgImxsdm0ubWlwcy5zcGxhdC5kIiwKKyAgImxsdm0ubWlwcy5zcGxhdC5oIiwKKyAgImxsdm0ubWlwcy5zcGxhdC53IiwKKyAgImxsdm0ubWlwcy5zcGxhdGkuYiIsCisgICJsbHZtLm1pcHMuc3BsYXRpLmQiLAorICAibGx2bS5taXBzLnNwbGF0aS5oIiwKKyAgImxsdm0ubWlwcy5zcGxhdGkudyIsCisgICJsbHZtLm1pcHMuc3JhLmIiLAorICAibGx2bS5taXBzLnNyYS5kIiwKKyAgImxsdm0ubWlwcy5zcmEuaCIsCisgICJsbHZtLm1pcHMuc3JhLnciLAorICAibGx2bS5taXBzLnNyYWkuYiIsCisgICJsbHZtLm1pcHMuc3JhaS5kIiwKKyAgImxsdm0ubWlwcy5zcmFpLmgiLAorICAibGx2bS5taXBzLnNyYWkudyIsCisgICJsbHZtLm1pcHMuc3Jhci5iIiwKKyAgImxsdm0ubWlwcy5zcmFyLmQiLAorICAibGx2bS5taXBzLnNyYXIuaCIsCisgICJsbHZtLm1pcHMuc3Jhci53IiwKKyAgImxsdm0ubWlwcy5zcmFyaS5iIiwKKyAgImxsdm0ubWlwcy5zcmFyaS5kIiwKKyAgImxsdm0ubWlwcy5zcmFyaS5oIiwKKyAgImxsdm0ubWlwcy5zcmFyaS53IiwKKyAgImxsdm0ubWlwcy5zcmwuYiIsCisgICJsbHZtLm1pcHMuc3JsLmQiLAorICAibGx2bS5taXBzLnNybC5oIiwKKyAgImxsdm0ubWlwcy5zcmwudyIsCisgICJsbHZtLm1pcHMuc3JsaS5iIiwKKyAgImxsdm0ubWlwcy5zcmxpLmQiLAorICAibGx2bS5taXBzLnNybGkuaCIsCisgICJsbHZtLm1pcHMuc3JsaS53IiwKKyAgImxsdm0ubWlwcy5zcmxyLmIiLAorICAibGx2bS5taXBzLnNybHIuZCIsCisgICJsbHZtLm1pcHMuc3Jsci5oIiwKKyAgImxsdm0ubWlwcy5zcmxyLnciLAorICAibGx2bS5taXBzLnNybHJpLmIiLAorICAibGx2bS5taXBzLnNybHJpLmQiLAorICAibGx2bS5taXBzLnNybHJpLmgiLAorICAibGx2bS5taXBzLnNybHJpLnciLAorICAibGx2bS5taXBzLnN0LmIiLAorICAibGx2bS5taXBzLnN0LmQiLAorICAibGx2bS5taXBzLnN0LmgiLAorICAibGx2bS5taXBzLnN0LnciLAorICAibGx2bS5taXBzLnN1YnEucGgiLAorICAibGx2bS5taXBzLnN1YnEucy5waCIsCisgICJsbHZtLm1pcHMuc3VicS5zLnciLAorICAibGx2bS5taXBzLnN1YnFoLnBoIiwKKyAgImxsdm0ubWlwcy5zdWJxaC5yLnBoIiwKKyAgImxsdm0ubWlwcy5zdWJxaC5yLnciLAorICAibGx2bS5taXBzLnN1YnFoLnciLAorICAibGx2bS5taXBzLnN1YnMucy5iIiwKKyAgImxsdm0ubWlwcy5zdWJzLnMuZCIsCisgICJsbHZtLm1pcHMuc3Vicy5zLmgiLAorICAibGx2bS5taXBzLnN1YnMucy53IiwKKyAgImxsdm0ubWlwcy5zdWJzLnUuYiIsCisgICJsbHZtLm1pcHMuc3Vicy51LmQiLAorICAibGx2bS5taXBzLnN1YnMudS5oIiwKKyAgImxsdm0ubWlwcy5zdWJzLnUudyIsCisgICJsbHZtLm1pcHMuc3Vic3VzLnUuYiIsCisgICJsbHZtLm1pcHMuc3Vic3VzLnUuZCIsCisgICJsbHZtLm1pcHMuc3Vic3VzLnUuaCIsCisgICJsbHZtLm1pcHMuc3Vic3VzLnUudyIsCisgICJsbHZtLm1pcHMuc3Vic3V1LnMuYiIsCisgICJsbHZtLm1pcHMuc3Vic3V1LnMuZCIsCisgICJsbHZtLm1pcHMuc3Vic3V1LnMuaCIsCisgICJsbHZtLm1pcHMuc3Vic3V1LnMudyIsCisgICJsbHZtLm1pcHMuc3VidS5waCIsCisgICJsbHZtLm1pcHMuc3VidS5xYiIsCisgICJsbHZtLm1pcHMuc3VidS5zLnBoIiwKKyAgImxsdm0ubWlwcy5zdWJ1LnMucWIiLAorICAibGx2bS5taXBzLnN1YnVoLnFiIiwKKyAgImxsdm0ubWlwcy5zdWJ1aC5yLnFiIiwKKyAgImxsdm0ubWlwcy5zdWJ2LmIiLAorICAibGx2bS5taXBzLnN1YnYuZCIsCisgICJsbHZtLm1pcHMuc3Vidi5oIiwKKyAgImxsdm0ubWlwcy5zdWJ2LnciLAorICAibGx2bS5taXBzLnN1YnZpLmIiLAorICAibGx2bS5taXBzLnN1YnZpLmQiLAorICAibGx2bS5taXBzLnN1YnZpLmgiLAorICAibGx2bS5taXBzLnN1YnZpLnciLAorICAibGx2bS5taXBzLnZzaGYuYiIsCisgICJsbHZtLm1pcHMudnNoZi5kIiwKKyAgImxsdm0ubWlwcy52c2hmLmgiLAorICAibGx2bS5taXBzLnZzaGYudyIsCisgICJsbHZtLm1pcHMud3Jkc3AiLAorICAibGx2bS5taXBzLnhvci52IiwKKyAgImxsdm0ubWlwcy54b3JpLmIiLAorICAibGx2bS5udnZtLmFkZC5ybS5kIiwKKyAgImxsdm0ubnZ2bS5hZGQucm0uZiIsCisgICJsbHZtLm52dm0uYWRkLnJtLmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5hZGQucm4uZCIsCisgICJsbHZtLm52dm0uYWRkLnJuLmYiLAorICAibGx2bS5udnZtLmFkZC5ybi5mdHouZiIsCisgICJsbHZtLm52dm0uYWRkLnJwLmQiLAorICAibGx2bS5udnZtLmFkZC5ycC5mIiwKKyAgImxsdm0ubnZ2bS5hZGQucnAuZnR6LmYiLAorICAibGx2bS5udnZtLmFkZC5yei5kIiwKKyAgImxsdm0ubnZ2bS5hZGQucnouZiIsCisgICJsbHZtLm52dm0uYWRkLnJ6LmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5hdG9taWMuYWRkLmdlbi5mLmN0YSIsCisgICJsbHZtLm52dm0uYXRvbWljLmFkZC5nZW4uZi5zeXMiLAorICAibGx2bS5udnZtLmF0b21pYy5hZGQuZ2VuLmkuY3RhIiwKKyAgImxsdm0ubnZ2bS5hdG9taWMuYWRkLmdlbi5pLnN5cyIsCisgICJsbHZtLm52dm0uYXRvbWljLmFuZC5nZW4uaS5jdGEiLAorICAibGx2bS5udnZtLmF0b21pYy5hbmQuZ2VuLmkuc3lzIiwKKyAgImxsdm0ubnZ2bS5hdG9taWMuY2FzLmdlbi5pLmN0YSIsCisgICJsbHZtLm52dm0uYXRvbWljLmNhcy5nZW4uaS5zeXMiLAorICAibGx2bS5udnZtLmF0b21pYy5kZWMuZ2VuLmkuY3RhIiwKKyAgImxsdm0ubnZ2bS5hdG9taWMuZGVjLmdlbi5pLnN5cyIsCisgICJsbHZtLm52dm0uYXRvbWljLmV4Y2guZ2VuLmkuY3RhIiwKKyAgImxsdm0ubnZ2bS5hdG9taWMuZXhjaC5nZW4uaS5zeXMiLAorICAibGx2bS5udnZtLmF0b21pYy5pbmMuZ2VuLmkuY3RhIiwKKyAgImxsdm0ubnZ2bS5hdG9taWMuaW5jLmdlbi5pLnN5cyIsCisgICJsbHZtLm52dm0uYXRvbWljLmxvYWQuYWRkLmYzMiIsCisgICJsbHZtLm52dm0uYXRvbWljLmxvYWQuYWRkLmY2NCIsCisgICJsbHZtLm52dm0uYXRvbWljLmxvYWQuZGVjLjMyIiwKKyAgImxsdm0ubnZ2bS5hdG9taWMubG9hZC5pbmMuMzIiLAorICAibGx2bS5udnZtLmF0b21pYy5tYXguZ2VuLmkuY3RhIiwKKyAgImxsdm0ubnZ2bS5hdG9taWMubWF4Lmdlbi5pLnN5cyIsCisgICJsbHZtLm52dm0uYXRvbWljLm1pbi5nZW4uaS5jdGEiLAorICAibGx2bS5udnZtLmF0b21pYy5taW4uZ2VuLmkuc3lzIiwKKyAgImxsdm0ubnZ2bS5hdG9taWMub3IuZ2VuLmkuY3RhIiwKKyAgImxsdm0ubnZ2bS5hdG9taWMub3IuZ2VuLmkuc3lzIiwKKyAgImxsdm0ubnZ2bS5hdG9taWMueG9yLmdlbi5pLmN0YSIsCisgICJsbHZtLm52dm0uYXRvbWljLnhvci5nZW4uaS5zeXMiLAorICAibGx2bS5udnZtLmJhci5zeW5jIiwKKyAgImxsdm0ubnZ2bS5iYXIud2FycC5zeW5jIiwKKyAgImxsdm0ubnZ2bS5iYXJyaWVyIiwKKyAgImxsdm0ubnZ2bS5iYXJyaWVyLm4iLAorICAibGx2bS5udnZtLmJhcnJpZXIuc3luYyIsCisgICJsbHZtLm52dm0uYmFycmllci5zeW5jLmNudCIsCisgICJsbHZtLm52dm0uYmFycmllcjAiLAorICAibGx2bS5udnZtLmJhcnJpZXIwLmFuZCIsCisgICJsbHZtLm52dm0uYmFycmllcjAub3IiLAorICAibGx2bS5udnZtLmJhcnJpZXIwLnBvcGMiLAorICAibGx2bS5udnZtLmJpdGNhc3QuZDJsbCIsCisgICJsbHZtLm52dm0uYml0Y2FzdC5mMmkiLAorICAibGx2bS5udnZtLmJpdGNhc3QuaTJmIiwKKyAgImxsdm0ubnZ2bS5iaXRjYXN0LmxsMmQiLAorICAibGx2bS5udnZtLmNlaWwuZCIsCisgICJsbHZtLm52dm0uY2VpbC5mIiwKKyAgImxsdm0ubnZ2bS5jZWlsLmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5jb21waWxlci5lcnJvciIsCisgICJsbHZtLm52dm0uY29tcGlsZXIud2FybiIsCisgICJsbHZtLm52dm0uY29zLmFwcHJveC5mIiwKKyAgImxsdm0ubnZ2bS5jb3MuYXBwcm94LmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5kMmYucm0iLAorICAibGx2bS5udnZtLmQyZi5ybS5mdHoiLAorICAibGx2bS5udnZtLmQyZi5ybiIsCisgICJsbHZtLm52dm0uZDJmLnJuLmZ0eiIsCisgICJsbHZtLm52dm0uZDJmLnJwIiwKKyAgImxsdm0ubnZ2bS5kMmYucnAuZnR6IiwKKyAgImxsdm0ubnZ2bS5kMmYucnoiLAorICAibGx2bS5udnZtLmQyZi5yei5mdHoiLAorICAibGx2bS5udnZtLmQyaS5oaSIsCisgICJsbHZtLm52dm0uZDJpLmxvIiwKKyAgImxsdm0ubnZ2bS5kMmkucm0iLAorICAibGx2bS5udnZtLmQyaS5ybiIsCisgICJsbHZtLm52dm0uZDJpLnJwIiwKKyAgImxsdm0ubnZ2bS5kMmkucnoiLAorICAibGx2bS5udnZtLmQybGwucm0iLAorICAibGx2bS5udnZtLmQybGwucm4iLAorICAibGx2bS5udnZtLmQybGwucnAiLAorICAibGx2bS5udnZtLmQybGwucnoiLAorICAibGx2bS5udnZtLmQydWkucm0iLAorICAibGx2bS5udnZtLmQydWkucm4iLAorICAibGx2bS5udnZtLmQydWkucnAiLAorICAibGx2bS5udnZtLmQydWkucnoiLAorICAibGx2bS5udnZtLmQydWxsLnJtIiwKKyAgImxsdm0ubnZ2bS5kMnVsbC5ybiIsCisgICJsbHZtLm52dm0uZDJ1bGwucnAiLAorICAibGx2bS5udnZtLmQydWxsLnJ6IiwKKyAgImxsdm0ubnZ2bS5kaXYuYXBwcm94LmYiLAorICAibGx2bS5udnZtLmRpdi5hcHByb3guZnR6LmYiLAorICAibGx2bS5udnZtLmRpdi5ybS5kIiwKKyAgImxsdm0ubnZ2bS5kaXYucm0uZiIsCisgICJsbHZtLm52dm0uZGl2LnJtLmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5kaXYucm4uZCIsCisgICJsbHZtLm52dm0uZGl2LnJuLmYiLAorICAibGx2bS5udnZtLmRpdi5ybi5mdHouZiIsCisgICJsbHZtLm52dm0uZGl2LnJwLmQiLAorICAibGx2bS5udnZtLmRpdi5ycC5mIiwKKyAgImxsdm0ubnZ2bS5kaXYucnAuZnR6LmYiLAorICAibGx2bS5udnZtLmRpdi5yei5kIiwKKyAgImxsdm0ubnZ2bS5kaXYucnouZiIsCisgICJsbHZtLm52dm0uZGl2LnJ6LmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5leDIuYXBwcm94LmQiLAorICAibGx2bS5udnZtLmV4Mi5hcHByb3guZiIsCisgICJsbHZtLm52dm0uZXgyLmFwcHJveC5mdHouZiIsCisgICJsbHZtLm52dm0uZjJoLnJuIiwKKyAgImxsdm0ubnZ2bS5mMmgucm4uZnR6IiwKKyAgImxsdm0ubnZ2bS5mMmkucm0iLAorICAibGx2bS5udnZtLmYyaS5ybS5mdHoiLAorICAibGx2bS5udnZtLmYyaS5ybiIsCisgICJsbHZtLm52dm0uZjJpLnJuLmZ0eiIsCisgICJsbHZtLm52dm0uZjJpLnJwIiwKKyAgImxsdm0ubnZ2bS5mMmkucnAuZnR6IiwKKyAgImxsdm0ubnZ2bS5mMmkucnoiLAorICAibGx2bS5udnZtLmYyaS5yei5mdHoiLAorICAibGx2bS5udnZtLmYybGwucm0iLAorICAibGx2bS5udnZtLmYybGwucm0uZnR6IiwKKyAgImxsdm0ubnZ2bS5mMmxsLnJuIiwKKyAgImxsdm0ubnZ2bS5mMmxsLnJuLmZ0eiIsCisgICJsbHZtLm52dm0uZjJsbC5ycCIsCisgICJsbHZtLm52dm0uZjJsbC5ycC5mdHoiLAorICAibGx2bS5udnZtLmYybGwucnoiLAorICAibGx2bS5udnZtLmYybGwucnouZnR6IiwKKyAgImxsdm0ubnZ2bS5mMnVpLnJtIiwKKyAgImxsdm0ubnZ2bS5mMnVpLnJtLmZ0eiIsCisgICJsbHZtLm52dm0uZjJ1aS5ybiIsCisgICJsbHZtLm52dm0uZjJ1aS5ybi5mdHoiLAorICAibGx2bS5udnZtLmYydWkucnAiLAorICAibGx2bS5udnZtLmYydWkucnAuZnR6IiwKKyAgImxsdm0ubnZ2bS5mMnVpLnJ6IiwKKyAgImxsdm0ubnZ2bS5mMnVpLnJ6LmZ0eiIsCisgICJsbHZtLm52dm0uZjJ1bGwucm0iLAorICAibGx2bS5udnZtLmYydWxsLnJtLmZ0eiIsCisgICJsbHZtLm52dm0uZjJ1bGwucm4iLAorICAibGx2bS5udnZtLmYydWxsLnJuLmZ0eiIsCisgICJsbHZtLm52dm0uZjJ1bGwucnAiLAorICAibGx2bS5udnZtLmYydWxsLnJwLmZ0eiIsCisgICJsbHZtLm52dm0uZjJ1bGwucnoiLAorICAibGx2bS5udnZtLmYydWxsLnJ6LmZ0eiIsCisgICJsbHZtLm52dm0uZmFicy5kIiwKKyAgImxsdm0ubnZ2bS5mYWJzLmYiLAorICAibGx2bS5udnZtLmZhYnMuZnR6LmYiLAorICAibGx2bS5udnZtLmZsb29yLmQiLAorICAibGx2bS5udnZtLmZsb29yLmYiLAorICAibGx2bS5udnZtLmZsb29yLmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5mbWEucm0uZCIsCisgICJsbHZtLm52dm0uZm1hLnJtLmYiLAorICAibGx2bS5udnZtLmZtYS5ybS5mdHouZiIsCisgICJsbHZtLm52dm0uZm1hLnJuLmQiLAorICAibGx2bS5udnZtLmZtYS5ybi5mIiwKKyAgImxsdm0ubnZ2bS5mbWEucm4uZnR6LmYiLAorICAibGx2bS5udnZtLmZtYS5ycC5kIiwKKyAgImxsdm0ubnZ2bS5mbWEucnAuZiIsCisgICJsbHZtLm52dm0uZm1hLnJwLmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5mbWEucnouZCIsCisgICJsbHZtLm52dm0uZm1hLnJ6LmYiLAorICAibGx2bS5udnZtLmZtYS5yei5mdHouZiIsCisgICJsbHZtLm52dm0uZm1heC5kIiwKKyAgImxsdm0ubnZ2bS5mbWF4LmYiLAorICAibGx2bS5udnZtLmZtYXguZnR6LmYiLAorICAibGx2bS5udnZtLmZtaW4uZCIsCisgICJsbHZtLm52dm0uZm1pbi5mIiwKKyAgImxsdm0ubnZ2bS5mbWluLmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5mbnMiLAorICAibGx2bS5udnZtLmkyZC5ybSIsCisgICJsbHZtLm52dm0uaTJkLnJuIiwKKyAgImxsdm0ubnZ2bS5pMmQucnAiLAorICAibGx2bS5udnZtLmkyZC5yeiIsCisgICJsbHZtLm52dm0uaTJmLnJtIiwKKyAgImxsdm0ubnZ2bS5pMmYucm4iLAorICAibGx2bS5udnZtLmkyZi5ycCIsCisgICJsbHZtLm52dm0uaTJmLnJ6IiwKKyAgImxsdm0ubnZ2bS5pc3NwYWNlcC5jb25zdCIsCisgICJsbHZtLm52dm0uaXNzcGFjZXAuZ2xvYmFsIiwKKyAgImxsdm0ubnZ2bS5pc3NwYWNlcC5sb2NhbCIsCisgICJsbHZtLm52dm0uaXNzcGFjZXAuc2hhcmVkIiwKKyAgImxsdm0ubnZ2bS5pc3R5cGVwLnNhbXBsZXIiLAorICAibGx2bS5udnZtLmlzdHlwZXAuc3VyZmFjZSIsCisgICJsbHZtLm52dm0uaXN0eXBlcC50ZXh0dXJlIiwKKyAgImxsdm0ubnZ2bS5sZGcuZ2xvYmFsLmYiLAorICAibGx2bS5udnZtLmxkZy5nbG9iYWwuaSIsCisgICJsbHZtLm52dm0ubGRnLmdsb2JhbC5wIiwKKyAgImxsdm0ubnZ2bS5sZHUuZ2xvYmFsLmYiLAorICAibGx2bS5udnZtLmxkdS5nbG9iYWwuaSIsCisgICJsbHZtLm52dm0ubGR1Lmdsb2JhbC5wIiwKKyAgImxsdm0ubnZ2bS5sZzIuYXBwcm94LmQiLAorICAibGx2bS5udnZtLmxnMi5hcHByb3guZiIsCisgICJsbHZtLm52dm0ubGcyLmFwcHJveC5mdHouZiIsCisgICJsbHZtLm52dm0ubGwyZC5ybSIsCisgICJsbHZtLm52dm0ubGwyZC5ybiIsCisgICJsbHZtLm52dm0ubGwyZC5ycCIsCisgICJsbHZtLm52dm0ubGwyZC5yeiIsCisgICJsbHZtLm52dm0ubGwyZi5ybSIsCisgICJsbHZtLm52dm0ubGwyZi5ybiIsCisgICJsbHZtLm52dm0ubGwyZi5ycCIsCisgICJsbHZtLm52dm0ubGwyZi5yeiIsCisgICJsbHZtLm52dm0ubG9oaS5pMmQiLAorICAibGx2bS5udnZtLm1hdGNoLmFsbC5zeW5jLmkzMnAiLAorICAibGx2bS5udnZtLm1hdGNoLmFsbC5zeW5jLmk2NHAiLAorICAibGx2bS5udnZtLm1hdGNoLmFueS5zeW5jLmkzMiIsCisgICJsbHZtLm52dm0ubWF0Y2guYW55LnN5bmMuaTY0IiwKKyAgImxsdm0ubnZ2bS5tZW1iYXIuY3RhIiwKKyAgImxsdm0ubnZ2bS5tZW1iYXIuZ2wiLAorICAibGx2bS5udnZtLm1lbWJhci5zeXMiLAorICAibGx2bS5udnZtLm1vdmUuZG91YmxlIiwKKyAgImxsdm0ubnZ2bS5tb3ZlLmZsb2F0IiwKKyAgImxsdm0ubnZ2bS5tb3ZlLmkxNiIsCisgICJsbHZtLm52dm0ubW92ZS5pMzIiLAorICAibGx2bS5udnZtLm1vdmUuaTY0IiwKKyAgImxsdm0ubnZ2bS5tb3ZlLnB0ciIsCisgICJsbHZtLm52dm0ubXVsLnJtLmQiLAorICAibGx2bS5udnZtLm11bC5ybS5mIiwKKyAgImxsdm0ubnZ2bS5tdWwucm0uZnR6LmYiLAorICAibGx2bS5udnZtLm11bC5ybi5kIiwKKyAgImxsdm0ubnZ2bS5tdWwucm4uZiIsCisgICJsbHZtLm52dm0ubXVsLnJuLmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5tdWwucnAuZCIsCisgICJsbHZtLm52dm0ubXVsLnJwLmYiLAorICAibGx2bS5udnZtLm11bC5ycC5mdHouZiIsCisgICJsbHZtLm52dm0ubXVsLnJ6LmQiLAorICAibGx2bS5udnZtLm11bC5yei5mIiwKKyAgImxsdm0ubnZ2bS5tdWwucnouZnR6LmYiLAorICAibGx2bS5udnZtLm11bDI0LmkiLAorICAibGx2bS5udnZtLm11bDI0LnVpIiwKKyAgImxsdm0ubnZ2bS5tdWxoaS5pIiwKKyAgImxsdm0ubnZ2bS5tdWxoaS5sbCIsCisgICJsbHZtLm52dm0ubXVsaGkudWkiLAorICAibGx2bS5udnZtLm11bGhpLnVsbCIsCisgICJsbHZtLm52dm0ucHJtdCIsCisgICJsbHZtLm52dm0ucHRyLmNvbnN0YW50LnRvLmdlbiIsCisgICJsbHZtLm52dm0ucHRyLmdlbi50by5jb25zdGFudCIsCisgICJsbHZtLm52dm0ucHRyLmdlbi50by5nbG9iYWwiLAorICAibGx2bS5udnZtLnB0ci5nZW4udG8ubG9jYWwiLAorICAibGx2bS5udnZtLnB0ci5nZW4udG8ucGFyYW0iLAorICAibGx2bS5udnZtLnB0ci5nZW4udG8uc2hhcmVkIiwKKyAgImxsdm0ubnZ2bS5wdHIuZ2xvYmFsLnRvLmdlbiIsCisgICJsbHZtLm52dm0ucHRyLmxvY2FsLnRvLmdlbiIsCisgICJsbHZtLm52dm0ucHRyLnNoYXJlZC50by5nZW4iLAorICAibGx2bS5udnZtLnJjcC5hcHByb3guZnR6LmQiLAorICAibGx2bS5udnZtLnJjcC5ybS5kIiwKKyAgImxsdm0ubnZ2bS5yY3Aucm0uZiIsCisgICJsbHZtLm52dm0ucmNwLnJtLmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5yY3Aucm4uZCIsCisgICJsbHZtLm52dm0ucmNwLnJuLmYiLAorICAibGx2bS5udnZtLnJjcC5ybi5mdHouZiIsCisgICJsbHZtLm52dm0ucmNwLnJwLmQiLAorICAibGx2bS5udnZtLnJjcC5ycC5mIiwKKyAgImxsdm0ubnZ2bS5yY3AucnAuZnR6LmYiLAorICAibGx2bS5udnZtLnJjcC5yei5kIiwKKyAgImxsdm0ubnZ2bS5yY3AucnouZiIsCisgICJsbHZtLm52dm0ucmNwLnJ6LmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmNsb2NrIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmNsb2NrNjQiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuY3RhaWQudyIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5jdGFpZC54IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmN0YWlkLnkiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuY3RhaWQueiIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcwIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzEiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTAiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTEiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTIiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTMiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTQiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTUiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTYiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTciLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTgiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTkiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMiIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyMCIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyMSIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyMiIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyMyIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyNCIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyNSIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyNiIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyNyIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyOCIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyOSIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWczIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzMwIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzMxIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzQiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnNSIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWc2IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzciLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnOCIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWc5IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmdyaWRpZCIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5sYW5laWQiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcubGFuZW1hc2suZXEiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcubGFuZW1hc2suZ2UiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcubGFuZW1hc2suZ3QiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcubGFuZW1hc2subGUiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcubGFuZW1hc2subHQiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcubmN0YWlkLnciLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcubmN0YWlkLngiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcubmN0YWlkLnkiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcubmN0YWlkLnoiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcubnNtaWQiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcubnRpZC53IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLm50aWQueCIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5udGlkLnkiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcubnRpZC56IiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLm53YXJwaWQiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcucG0wIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLnBtMSIsCisgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5wbTIiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcucG0zIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLnNtaWQiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcudGlkLnciLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcudGlkLngiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcudGlkLnkiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcudGlkLnoiLAorICAibGx2bS5udnZtLnJlYWQucHR4LnNyZWcud2FycGlkIiwKKyAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLndhcnBzaXplIiwKKyAgImxsdm0ubnZ2bS5yZWZsZWN0IiwKKyAgImxsdm0ubnZ2bS5yb3RhdGUuYjMyIiwKKyAgImxsdm0ubnZ2bS5yb3RhdGUuYjY0IiwKKyAgImxsdm0ubnZ2bS5yb3RhdGUucmlnaHQuYjY0IiwKKyAgImxsdm0ubnZ2bS5yb3VuZC5kIiwKKyAgImxsdm0ubnZ2bS5yb3VuZC5mIiwKKyAgImxsdm0ubnZ2bS5yb3VuZC5mdHouZiIsCisgICJsbHZtLm52dm0ucnNxcnQuYXBwcm94LmQiLAorICAibGx2bS5udnZtLnJzcXJ0LmFwcHJveC5mIiwKKyAgImxsdm0ubnZ2bS5yc3FydC5hcHByb3guZnR6LmYiLAorICAibGx2bS5udnZtLnNhZC5pIiwKKyAgImxsdm0ubnZ2bS5zYWQudWkiLAorICAibGx2bS5udnZtLnNhdHVyYXRlLmQiLAorICAibGx2bS5udnZtLnNhdHVyYXRlLmYiLAorICAibGx2bS5udnZtLnNhdHVyYXRlLmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5zaGZsLmJmbHkuZjMyIiwKKyAgImxsdm0ubnZ2bS5zaGZsLmJmbHkuaTMyIiwKKyAgImxsdm0ubnZ2bS5zaGZsLmRvd24uZjMyIiwKKyAgImxsdm0ubnZ2bS5zaGZsLmRvd24uaTMyIiwKKyAgImxsdm0ubnZ2bS5zaGZsLmlkeC5mMzIiLAorICAibGx2bS5udnZtLnNoZmwuaWR4LmkzMiIsCisgICJsbHZtLm52dm0uc2hmbC5zeW5jLmJmbHkuZjMyIiwKKyAgImxsdm0ubnZ2bS5zaGZsLnN5bmMuYmZseS5pMzIiLAorICAibGx2bS5udnZtLnNoZmwuc3luYy5kb3duLmYzMiIsCisgICJsbHZtLm52dm0uc2hmbC5zeW5jLmRvd24uaTMyIiwKKyAgImxsdm0ubnZ2bS5zaGZsLnN5bmMuaWR4LmYzMiIsCisgICJsbHZtLm52dm0uc2hmbC5zeW5jLmlkeC5pMzIiLAorICAibGx2bS5udnZtLnNoZmwuc3luYy51cC5mMzIiLAorICAibGx2bS5udnZtLnNoZmwuc3luYy51cC5pMzIiLAorICAibGx2bS5udnZtLnNoZmwudXAuZjMyIiwKKyAgImxsdm0ubnZ2bS5zaGZsLnVwLmkzMiIsCisgICJsbHZtLm52dm0uc2luLmFwcHJveC5mIiwKKyAgImxsdm0ubnZ2bS5zaW4uYXBwcm94LmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5zcXJ0LmFwcHJveC5mIiwKKyAgImxsdm0ubnZ2bS5zcXJ0LmFwcHJveC5mdHouZiIsCisgICJsbHZtLm52dm0uc3FydC5mIiwKKyAgImxsdm0ubnZ2bS5zcXJ0LnJtLmQiLAorICAibGx2bS5udnZtLnNxcnQucm0uZiIsCisgICJsbHZtLm52dm0uc3FydC5ybS5mdHouZiIsCisgICJsbHZtLm52dm0uc3FydC5ybi5kIiwKKyAgImxsdm0ubnZ2bS5zcXJ0LnJuLmYiLAorICAibGx2bS5udnZtLnNxcnQucm4uZnR6LmYiLAorICAibGx2bS5udnZtLnNxcnQucnAuZCIsCisgICJsbHZtLm52dm0uc3FydC5ycC5mIiwKKyAgImxsdm0ubnZ2bS5zcXJ0LnJwLmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS5zcXJ0LnJ6LmQiLAorICAibGx2bS5udnZtLnNxcnQucnouZiIsCisgICJsbHZtLm52dm0uc3FydC5yei5mdHouZiIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTE2Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LmkzMi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5Lmk2NC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pNjQudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pNjQuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5Lmk4Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52MmkxNi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpMzIuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52Mmk2NC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52Mmk2NC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTY0Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52Mmk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTE2LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpMTYuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGkzMi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTMyLnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmkxNi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5pMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5pMTYuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4xZC5pMzIuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQuaTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQuaTMyLnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMWQuaTY0LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmk2NC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmk2NC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLmk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQuaTguemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4xZC52MmkxNi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC52MmkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLnYyaTE2Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMWQudjJpMzIuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQudjJpMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC52MmkzMi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLnYyaTY0LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLnYyaTY0LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQudjJpNjQuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4xZC52Mmk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLnYyaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC52Mmk4Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMWQudjRpMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQudjRpMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC52NGkxNi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLnY0aTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLnY0aTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMWQudjRpMzIuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4xZC52NGk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjFkLnY0aTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4xZC52NGk4Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTE2LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LmkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LmkxNi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LmkzMi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pMzIuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pNjQuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTY0LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTY0Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTguY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTE2LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpMTYuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52MmkzMi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52MmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTMyLnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpNjQuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpNjQudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52Mmk2NC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTguY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTguemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGkxNi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTE2Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjRpMzIuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjRpMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGkzMi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTguY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjRpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTguemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5pMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQuaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQuaTE2Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMmQuaTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmkzMi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmk2NC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5pNjQudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5pNjQuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5pOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC5pOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLmk4Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMmQudjJpMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQudjJpMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC52MmkxNi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLnYyaTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLnYyaTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQudjJpMzIuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4yZC52Mmk2NC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC52Mmk2NC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLnYyaTY0Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMmQudjJpOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC52Mmk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQudjJpOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLnY0aTE2LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLnY0aTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQudjRpMTYuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4yZC52NGkzMi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC52NGkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjJkLnY0aTMyLnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuMmQudjRpOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4yZC52NGk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuMmQudjRpOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLmkxNi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4zZC5pMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4zZC5pMTYuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4zZC5pMzIuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuM2QuaTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuM2QuaTMyLnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuM2QuaTY0LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLmk2NC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLmk2NC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLmk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLmk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuM2QuaTguemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4zZC52MmkxNi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VsZC4zZC52MmkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLnYyaTE2Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuM2QudjJpMzIuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuM2QudjJpMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4zZC52MmkzMi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLnYyaTY0LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLnYyaTY0LnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuM2QudjJpNjQuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4zZC52Mmk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLnYyaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4zZC52Mmk4Lnplcm8iLAorICAibGx2bS5udnZtLnN1bGQuM2QudjRpMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1bGQuM2QudjRpMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4zZC52NGkxNi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLnY0aTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLnY0aTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1bGQuM2QudjRpMzIuemVybyIsCisgICJsbHZtLm52dm0uc3VsZC4zZC52NGk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdWxkLjNkLnY0aTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VsZC4zZC52NGk4Lnplcm8iLAorICAibGx2bS5udnZtLnN1cS5hcnJheS5zaXplIiwKKyAgImxsdm0ubnZ2bS5zdXEuY2hhbm5lbC5kYXRhLnR5cGUiLAorICAibGx2bS5udnZtLnN1cS5jaGFubmVsLm9yZGVyIiwKKyAgImxsdm0ubnZ2bS5zdXEuZGVwdGgiLAorICAibGx2bS5udnZtLnN1cS5oZWlnaHQiLAorICAibGx2bS5udnZtLnN1cS53aWR0aCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LmkxNi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LmkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTE2Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pMzIuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LmkzMi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTY0LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTY0LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pNjQuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5Lmk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5Lmk4Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52MmkxNi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52MmkxNi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpMzIuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52MmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpMzIuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTY0LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpNjQudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTY0Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52Mmk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52NGkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpMTYuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTMyLnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52NGk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuaTE2LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5pMTYuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmkzMi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuaTMyLnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5pNjQuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5pNjQudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLmk2NC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuaTguY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC5pOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuaTguemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTE2LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTE2Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC52MmkzMi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC52MmkzMi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpNjQuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC52Mmk2NC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpNjQuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTguY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC52Mmk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC52Mmk4Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC52NGkxNi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC52NGkxNi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpMzIuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC52NGkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpMzIuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTguY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC52NGk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4xZC52NGk4Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LmkxNi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pMzIuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5Lmk2NC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5Lmk2NC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTY0Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5Lmk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52MmkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpMTYuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTMyLnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52Mmk2NC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTY0LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52Mmk2NC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTguemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTE2LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTE2Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGkzMi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGkzMi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpOC5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTguemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmkxNi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuaTE2Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5pMzIuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5pMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmkzMi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuaTY0LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuaTY0LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC5pNjQuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLmk4Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC52MmkxNi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC52MmkxNi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpMzIuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC52MmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpMzIuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTY0LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpNjQudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTY0Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC52Mmk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpMTYuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC52NGkxNi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpMTYuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTMyLmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpMzIudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTMyLnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4yZC52NGk4LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpOC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QuaTE2LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QuaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC5pMTYuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjNkLmkzMi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjNkLmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QuaTMyLnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC5pNjQuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC5pNjQudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjNkLmk2NC56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QuaTguY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC5pOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QuaTguemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTE2LmNsYW1wIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTE2Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC52MmkzMi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC52MmkzMi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpNjQuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC52Mmk2NC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpNjQuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTguY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC52Mmk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC52Mmk4Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC52NGkxNi5jbGFtcCIsCisgICJsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC52NGkxNi56ZXJvIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpMzIuY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC52NGkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpMzIuemVybyIsCisgICJsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTguY2xhbXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC52NGk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QuYi4zZC52NGk4Lnplcm8iLAorICAibGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS5pMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkuaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LnYyaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS52MmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkudjJpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkudjRpMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LnY0aTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS52NGk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4xZC5pMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjFkLmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMWQuaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjFkLnYyaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4xZC52MmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMWQudjJpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMWQudjRpMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjFkLnY0aTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4xZC52NGk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS5pMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5LmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkuaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5LnYyaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS52MmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkudjJpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkudjRpMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5LnY0aTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS52NGk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4yZC5pMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjJkLmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMmQuaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjJkLnYyaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4yZC52MmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMmQudjJpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuMmQudjRpMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjJkLnY0aTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4yZC52NGk4LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4zZC5pMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjNkLmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuM2QuaTgudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjNkLnYyaTE2LnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4zZC52MmkzMi50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuM2QudjJpOC50cmFwIiwKKyAgImxsdm0ubnZ2bS5zdXN0LnAuM2QudjRpMTYudHJhcCIsCisgICJsbHZtLm52dm0uc3VzdC5wLjNkLnY0aTMyLnRyYXAiLAorICAibGx2bS5udnZtLnN1c3QucC4zZC52NGk4LnRyYXAiLAorICAibGx2bS5udnZtLnN3YXAubG8uaGkuYjY0IiwKKyAgImxsdm0ubnZ2bS50ZXguMWQuYXJyYXkuZ3JhZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC4xZC5hcnJheS5ncmFkLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLmFycmF5LmdyYWQudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQuYXJyYXkubGV2ZWwudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQuYXJyYXkubGV2ZWwudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQuYXJyYXkubGV2ZWwudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQuYXJyYXkudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQuYXJyYXkudjRmMzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQuYXJyYXkudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQuYXJyYXkudjRzMzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQuYXJyYXkudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQuYXJyYXkudjR1MzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQuZ3JhZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC4xZC5ncmFkLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjFkLmdyYWQudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQubGV2ZWwudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQubGV2ZWwudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQubGV2ZWwudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQudjRmMzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQudjRzMzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMWQudjR1MzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQuYXJyYXkuZ3JhZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC4yZC5hcnJheS5ncmFkLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LmdyYWQudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQuYXJyYXkubGV2ZWwudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQuYXJyYXkubGV2ZWwudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQuYXJyYXkubGV2ZWwudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQuYXJyYXkudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQuYXJyYXkudjRmMzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQuYXJyYXkudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQuYXJyYXkudjRzMzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQuYXJyYXkudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQuYXJyYXkudjR1MzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQuZ3JhZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC4yZC5ncmFkLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjJkLmdyYWQudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQubGV2ZWwudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQubGV2ZWwudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQubGV2ZWwudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQudjRmMzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQudjRzMzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguMmQudjR1MzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXguM2QuZ3JhZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC4zZC5ncmFkLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LjNkLmdyYWQudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguM2QubGV2ZWwudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguM2QubGV2ZWwudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguM2QubGV2ZWwudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguM2QudjRmMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguM2QudjRmMzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXguM2QudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguM2QudjRzMzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXguM2QudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguM2QudjR1MzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXguY3ViZS5hcnJheS5sZXZlbC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC5jdWJlLmFycmF5LmxldmVsLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LmN1YmUuYXJyYXkubGV2ZWwudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguY3ViZS5hcnJheS52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC5jdWJlLmFycmF5LnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LmN1YmUuYXJyYXkudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguY3ViZS5sZXZlbC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC5jdWJlLmxldmVsLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LmN1YmUubGV2ZWwudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXguY3ViZS52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC5jdWJlLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LmN1YmUudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS5ncmFkLnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkuZ3JhZC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LmdyYWQudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS5sZXZlbC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LmxldmVsLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkubGV2ZWwudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LnY0ZjMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS52NHMzMi5zMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkudjR1MzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5ncmFkLnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuZ3JhZC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmdyYWQudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5sZXZlbC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmxldmVsLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQubGV2ZWwudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLnY0ZjMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC52NHMzMi5zMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQudjR1MzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS5ncmFkLnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkuZ3JhZC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LmdyYWQudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS5sZXZlbC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LmxldmVsLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkubGV2ZWwudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LnY0ZjMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS52NHMzMi5zMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkudjR1MzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5ncmFkLnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuZ3JhZC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmdyYWQudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5sZXZlbC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmxldmVsLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQubGV2ZWwudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLnY0ZjMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC52NHMzMi5zMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQudjR1MzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC5ncmFkLnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QuZ3JhZC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjNkLmdyYWQudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC5sZXZlbC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjNkLmxldmVsLnY0czMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QubGV2ZWwudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjNkLnY0ZjMyLnMzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC52NHMzMi5zMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLjNkLnY0dTMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QudjR1MzIuczMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLmFycmF5LmxldmVsLnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5hcnJheS5sZXZlbC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUuYXJyYXkubGV2ZWwudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLmFycmF5LnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5hcnJheS52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUuYXJyYXkudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLmxldmVsLnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5sZXZlbC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUubGV2ZWwudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUudjR1MzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50ZXhzdXJmLmhhbmRsZSIsCisgICJsbHZtLm52dm0udGV4c3VyZi5oYW5kbGUuaW50ZXJuYWwiLAorICAibGx2bS5udnZtLnRsZDQuYS4yZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRsZDQuYS4yZC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRsZDQuYS4yZC52NHUzMi5mMzIiLAorICAibGx2bS5udnZtLnRsZDQuYi4yZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRsZDQuYi4yZC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRsZDQuYi4yZC52NHUzMi5mMzIiLAorICAibGx2bS5udnZtLnRsZDQuZy4yZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRsZDQuZy4yZC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRsZDQuZy4yZC52NHUzMi5mMzIiLAorICAibGx2bS5udnZtLnRsZDQuci4yZC52NGYzMi5mMzIiLAorICAibGx2bS5udnZtLnRsZDQuci4yZC52NHMzMi5mMzIiLAorICAibGx2bS5udnZtLnRsZDQuci4yZC52NHUzMi5mMzIiLAorICAibGx2bS5udnZtLnRsZDQudW5pZmllZC5hLjJkLnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGxkNC51bmlmaWVkLmEuMmQudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuYS4yZC52NHUzMi5mMzIiLAorICAibGx2bS5udnZtLnRsZDQudW5pZmllZC5iLjJkLnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGxkNC51bmlmaWVkLmIuMmQudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuYi4yZC52NHUzMi5mMzIiLAorICAibGx2bS5udnZtLnRsZDQudW5pZmllZC5nLjJkLnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGxkNC51bmlmaWVkLmcuMmQudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuZy4yZC52NHUzMi5mMzIiLAorICAibGx2bS5udnZtLnRsZDQudW5pZmllZC5yLjJkLnY0ZjMyLmYzMiIsCisgICJsbHZtLm52dm0udGxkNC51bmlmaWVkLnIuMmQudjRzMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuci4yZC52NHUzMi5mMzIiLAorICAibGx2bS5udnZtLnRydW5jLmQiLAorICAibGx2bS5udnZtLnRydW5jLmYiLAorICAibGx2bS5udnZtLnRydW5jLmZ0ei5mIiwKKyAgImxsdm0ubnZ2bS50eHEuYXJyYXkuc2l6ZSIsCisgICJsbHZtLm52dm0udHhxLmNoYW5uZWwuZGF0YS50eXBlIiwKKyAgImxsdm0ubnZ2bS50eHEuY2hhbm5lbC5vcmRlciIsCisgICJsbHZtLm52dm0udHhxLmRlcHRoIiwKKyAgImxsdm0ubnZ2bS50eHEuaGVpZ2h0IiwKKyAgImxsdm0ubnZ2bS50eHEubnVtLm1pcG1hcC5sZXZlbHMiLAorICAibGx2bS5udnZtLnR4cS5udW0uc2FtcGxlcyIsCisgICJsbHZtLm52dm0udHhxLndpZHRoIiwKKyAgImxsdm0ubnZ2bS51aTJkLnJtIiwKKyAgImxsdm0ubnZ2bS51aTJkLnJuIiwKKyAgImxsdm0ubnZ2bS51aTJkLnJwIiwKKyAgImxsdm0ubnZ2bS51aTJkLnJ6IiwKKyAgImxsdm0ubnZ2bS51aTJmLnJtIiwKKyAgImxsdm0ubnZ2bS51aTJmLnJuIiwKKyAgImxsdm0ubnZ2bS51aTJmLnJwIiwKKyAgImxsdm0ubnZ2bS51aTJmLnJ6IiwKKyAgImxsdm0ubnZ2bS51bGwyZC5ybSIsCisgICJsbHZtLm52dm0udWxsMmQucm4iLAorICAibGx2bS5udnZtLnVsbDJkLnJwIiwKKyAgImxsdm0ubnZ2bS51bGwyZC5yeiIsCisgICJsbHZtLm52dm0udWxsMmYucm0iLAorICAibGx2bS5udnZtLnVsbDJmLnJuIiwKKyAgImxsdm0ubnZ2bS51bGwyZi5ycCIsCisgICJsbHZtLm52dm0udWxsMmYucnoiLAorICAibGx2bS5udnZtLnZvdGUuYWxsIiwKKyAgImxsdm0ubnZ2bS52b3RlLmFsbC5zeW5jIiwKKyAgImxsdm0ubnZ2bS52b3RlLmFueSIsCisgICJsbHZtLm52dm0udm90ZS5hbnkuc3luYyIsCisgICJsbHZtLm52dm0udm90ZS5iYWxsb3QiLAorICAibGx2bS5udnZtLnZvdGUuYmFsbG90LnN5bmMiLAorICAibGx2bS5udnZtLnZvdGUudW5pIiwKKyAgImxsdm0ubnZ2bS52b3RlLnVuaS5zeW5jIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmEuY29sLmYxNiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5hLmNvbC5zdHJpZGUuZjE2IiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmEucm93LmYxNiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5hLnJvdy5zdHJpZGUuZjE2IiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmIuY29sLmYxNiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5iLmNvbC5zdHJpZGUuZjE2IiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmIucm93LmYxNiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5iLnJvdy5zdHJpZGUuZjE2IiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmMuY29sLmYxNiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5jLmNvbC5mMzIiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYy5jb2wuc3RyaWRlLmYxNiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5jLmNvbC5zdHJpZGUuZjMyIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmMucm93LmYxNiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5jLnJvdy5mMzIiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYy5yb3cuc3RyaWRlLmYxNiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5jLnJvdy5zdHJpZGUuZjMyIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLmNvbC5mMTYuZjE2IiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLmNvbC5mMTYuZjE2LnNhdGZpbml0ZSIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5jb2wuZjE2LmYzMiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5jb2wuZjE2LmYzMi5zYXRmaW5pdGUiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wuY29sLmYzMi5mMTYiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wuY29sLmYzMi5mMTYuc2F0ZmluaXRlIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLmNvbC5mMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLmNvbC5mMzIuZjMyLnNhdGZpbml0ZSIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5yb3cuZjE2LmYxNiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5yb3cuZjE2LmYxNi5zYXRmaW5pdGUiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wucm93LmYxNi5mMzIiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wucm93LmYxNi5mMzIuc2F0ZmluaXRlIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLnJvdy5mMzIuZjE2IiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLnJvdy5mMzIuZjE2LnNhdGZpbml0ZSIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5yb3cuZjMyLmYzMiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5yb3cuZjMyLmYzMi5zYXRmaW5pdGUiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cuY29sLmYxNi5mMTYiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cuY29sLmYxNi5mMTYuc2F0ZmluaXRlIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LmNvbC5mMTYuZjMyIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LmNvbC5mMTYuZjMyLnNhdGZpbml0ZSIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5jb2wuZjMyLmYxNiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5jb2wuZjMyLmYxNi5zYXRmaW5pdGUiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cuY29sLmYzMi5mMzIiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cuY29sLmYzMi5mMzIuc2F0ZmluaXRlIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LnJvdy5mMTYuZjE2IiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LnJvdy5mMTYuZjE2LnNhdGZpbml0ZSIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5yb3cuZjE2LmYzMiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5yb3cuZjE2LmYzMi5zYXRmaW5pdGUiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cucm93LmYzMi5mMTYiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cucm93LmYzMi5mMTYuc2F0ZmluaXRlIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LnJvdy5mMzIuZjMyIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LnJvdy5mMzIuZjMyLnNhdGZpbml0ZSIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYuc3RvcmUuZC5jb2wuZjE2IiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5zdG9yZS5kLmNvbC5mMzIiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2LnN0b3JlLmQuY29sLnN0cmlkZS5mMTYiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2LnN0b3JlLmQuY29sLnN0cmlkZS5mMzIiLAorICAibGx2bS5udnZtLndtbWEubTE2bjE2azE2LnN0b3JlLmQucm93LmYxNiIsCisgICJsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYuc3RvcmUuZC5yb3cuZjMyIiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5zdG9yZS5kLnJvdy5zdHJpZGUuZjE2IiwKKyAgImxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5zdG9yZS5kLnJvdy5zdHJpZGUuZjMyIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZjaXBoZXIiLAorICAibGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udmNpcGhlcmxhc3QiLAorICAibGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udm5jaXBoZXIiLAorICAibGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udm5jaXBoZXJsYXN0IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZwZXJteG9yIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZwbXN1bWIiLAorICAibGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udnBtc3VtZCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLmNyeXB0by52cG1zdW1oIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZwbXN1bXciLAorICAibGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udnNib3giLAorICAibGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udnNoYXNpZ21hZCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLmNyeXB0by52c2hhc2lnbWF3IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMuZHNzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMuZHNzYWxsIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMuZHN0IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMuZHN0c3QiLAorICAibGx2bS5wcGMuYWx0aXZlYy5kc3RzdHQiLAorICAibGx2bS5wcGMuYWx0aXZlYy5kc3R0IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMubHZlYngiLAorICAibGx2bS5wcGMuYWx0aXZlYy5sdmVoeCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLmx2ZXd4IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMubHZzbCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLmx2c3IiLAorICAibGx2bS5wcGMuYWx0aXZlYy5sdngiLAorICAibGx2bS5wcGMuYWx0aXZlYy5sdnhsIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMubWZ2c2NyIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMubXR2c2NyIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMuc3R2ZWJ4IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMuc3R2ZWh4IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMuc3R2ZXd4IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMuc3R2eCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnN0dnhsIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmFic2R1YiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZhYnNkdWgiLAorICAibGx2bS5wcGMuYWx0aXZlYy52YWJzZHV3IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmFkZGN1cSIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZhZGRjdXciLAorICAibGx2bS5wcGMuYWx0aXZlYy52YWRkZWN1cSIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZhZGRldXFtIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmFkZHNicyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZhZGRzaHMiLAorICAibGx2bS5wcGMuYWx0aXZlYy52YWRkc3dzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmFkZHVicyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZhZGR1aHMiLAorICAibGx2bS5wcGMuYWx0aXZlYy52YWRkdXdzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmF2Z3NiIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmF2Z3NoIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmF2Z3N3IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmF2Z3ViIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmF2Z3VoIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmF2Z3V3IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmJwZXJtcSIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjZnN4IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNmdXgiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y2x6bHNiYiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBiZnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wYmZwLnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZXFmcCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBlcWZwLnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1YiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBlcXViLnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1ZCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBlcXVkLnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1aCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBlcXVoLnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1dyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBlcXV3LnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZ2VmcCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBnZWZwLnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RmcCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBndGZwLnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RzYiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHNiLnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RzZCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHNkLnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RzaCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHNoLnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RzdyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHN3LnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1YiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHViLnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1ZCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHVkLnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1aCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHVoLnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1dyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHV3LnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wbmViIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcG5lYi5wIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmNtcG5laCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZWgucCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZXciLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wbmV3LnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wbmV6YiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZXpiLnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wbmV6aCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZXpoLnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y21wbmV6dyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZXp3LnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y3RzeHMiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y3R1eHMiLAorICAibGx2bS5wcGMuYWx0aXZlYy52Y3R6bHNiYiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZleHB0ZWZwIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudmdiYmQiLAorICAibGx2bS5wcGMuYWx0aXZlYy52bG9nZWZwIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm1hZGRmcCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtYXhmcCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtYXhzYiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtYXhzZCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtYXhzaCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtYXhzdyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtYXh1YiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtYXh1ZCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtYXh1aCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtYXh1dyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtaGFkZHNocyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtaHJhZGRzaHMiLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWluZnAiLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWluc2IiLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWluc2QiLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWluc2giLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWluc3ciLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWludWIiLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWludWQiLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWludWgiLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWludXciLAorICAibGx2bS5wcGMuYWx0aXZlYy52bWxhZGR1aG0iLAorICAibGx2bS5wcGMuYWx0aXZlYy52bXN1bW1ibSIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtc3Vtc2htIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm1zdW1zaHMiLAorICAibGx2bS5wcGMuYWx0aXZlYy52bXN1bXVibSIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtc3VtdWhtIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm1zdW11aHMiLAorICAibGx2bS5wcGMuYWx0aXZlYy52bXVsZXNiIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm11bGVzaCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtdWxlc3ciLAorICAibGx2bS5wcGMuYWx0aXZlYy52bXVsZXViIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm11bGV1aCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtdWxldXciLAorICAibGx2bS5wcGMuYWx0aXZlYy52bXVsb3NiIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm11bG9zaCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtdWxvc3ciLAorICAibGx2bS5wcGMuYWx0aXZlYy52bXVsb3ViIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudm11bG91aCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZtdWxvdXciLAorICAibGx2bS5wcGMuYWx0aXZlYy52bm1zdWJmcCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZwZXJtIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnBrcHgiLAorICAibGx2bS5wcGMuYWx0aXZlYy52cGtzZHNzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnBrc2R1cyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZwa3Noc3MiLAorICAibGx2bS5wcGMuYWx0aXZlYy52cGtzaHVzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnBrc3dzcyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZwa3N3dXMiLAorICAibGx2bS5wcGMuYWx0aXZlYy52cGt1ZHVzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnBrdWh1cyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZwa3V3dXMiLAorICAibGx2bS5wcGMuYWx0aXZlYy52cHJ0eWJkIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnBydHlicSIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZwcnR5YnciLAorICAibGx2bS5wcGMuYWx0aXZlYy52cmVmcCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZyZmltIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnJmaW4iLAorICAibGx2bS5wcGMuYWx0aXZlYy52cmZpcCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZyZml6IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnJsYiIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZybGQiLAorICAibGx2bS5wcGMuYWx0aXZlYy52cmxkbWkiLAorICAibGx2bS5wcGMuYWx0aXZlYy52cmxkbm0iLAorICAibGx2bS5wcGMuYWx0aXZlYy52cmxoIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnJsdyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZybHdtaSIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZybHdubSIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZyc3FydGVmcCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZzZWwiLAorICAibGx2bS5wcGMuYWx0aXZlYy52c2wiLAorICAibGx2bS5wcGMuYWx0aXZlYy52c2xiIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnNsaCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZzbG8iLAorICAibGx2bS5wcGMuYWx0aXZlYy52c2x2IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnNsdyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZzciIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZzcmFiIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnNyYWgiLAorICAibGx2bS5wcGMuYWx0aXZlYy52c3JhdyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZzcmIiLAorICAibGx2bS5wcGMuYWx0aXZlYy52c3JoIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnNybyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZzcnYiLAorICAibGx2bS5wcGMuYWx0aXZlYy52c3J3IiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnN1YmN1cSIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZzdWJjdXciLAorICAibGx2bS5wcGMuYWx0aXZlYy52c3ViZWN1cSIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZzdWJldXFtIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnN1YnNicyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZzdWJzaHMiLAorICAibGx2bS5wcGMuYWx0aXZlYy52c3Vic3dzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnN1YnVicyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZzdWJ1aHMiLAorICAibGx2bS5wcGMuYWx0aXZlYy52c3VidXdzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnN1bTJzd3MiLAorICAibGx2bS5wcGMuYWx0aXZlYy52c3VtNHNicyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZzdW00c2hzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnN1bTR1YnMiLAorICAibGx2bS5wcGMuYWx0aXZlYy52c3Vtc3dzIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnVwa2hweCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZ1cGtoc2IiLAorICAibGx2bS5wcGMuYWx0aXZlYy52dXBraHNoIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnVwa2hzdyIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZ1cGtscHgiLAorICAibGx2bS5wcGMuYWx0aXZlYy52dXBrbHNiIiwKKyAgImxsdm0ucHBjLmFsdGl2ZWMudnVwa2xzaCIsCisgICJsbHZtLnBwYy5hbHRpdmVjLnZ1cGtsc3ciLAorICAibGx2bS5wcGMuYnBlcm1kIiwKKyAgImxsdm0ucHBjLmNmZW5jZSIsCisgICJsbHZtLnBwYy5kY2JhIiwKKyAgImxsdm0ucHBjLmRjYmYiLAorICAibGx2bS5wcGMuZGNiaSIsCisgICJsbHZtLnBwYy5kY2JzdCIsCisgICJsbHZtLnBwYy5kY2J0IiwKKyAgImxsdm0ucHBjLmRjYnRzdCIsCisgICJsbHZtLnBwYy5kY2J6IiwKKyAgImxsdm0ucHBjLmRjYnpsIiwKKyAgImxsdm0ucHBjLmRpdmRlIiwKKyAgImxsdm0ucHBjLmRpdmRldSIsCisgICJsbHZtLnBwYy5kaXZ3ZSIsCisgICJsbHZtLnBwYy5kaXZ3ZXUiLAorICAibGx2bS5wcGMuZ2V0LnRleGFzciIsCisgICJsbHZtLnBwYy5nZXQudGV4YXNydSIsCisgICJsbHZtLnBwYy5nZXQudGZoYXIiLAorICAibGx2bS5wcGMuZ2V0LnRmaWFyIiwKKyAgImxsdm0ucHBjLmlzLmRlY3JlbWVudGVkLmN0ci5ub256ZXJvIiwKKyAgImxsdm0ucHBjLmx3c3luYyIsCisgICJsbHZtLnBwYy5tdGN0ciIsCisgICJsbHZtLnBwYy5xcHgucXZmYWJzIiwKKyAgImxsdm0ucHBjLnFweC5xdmZhZGQiLAorICAibGx2bS5wcGMucXB4LnF2ZmFkZHMiLAorICAibGx2bS5wcGMucXB4LnF2ZmNmaWQiLAorICAibGx2bS5wcGMucXB4LnF2ZmNmaWRzIiwKKyAgImxsdm0ucHBjLnFweC5xdmZjZmlkdSIsCisgICJsbHZtLnBwYy5xcHgucXZmY2ZpZHVzIiwKKyAgImxsdm0ucHBjLnFweC5xdmZjbXBlcSIsCisgICJsbHZtLnBwYy5xcHgucXZmY21wZ3QiLAorICAibGx2bS5wcGMucXB4LnF2ZmNtcGx0IiwKKyAgImxsdm0ucHBjLnFweC5xdmZjcHNnbiIsCisgICJsbHZtLnBwYy5xcHgucXZmY3RpZCIsCisgICJsbHZtLnBwYy5xcHgucXZmY3RpZHUiLAorICAibGx2bS5wcGMucXB4LnF2ZmN0aWR1eiIsCisgICJsbHZtLnBwYy5xcHgucXZmY3RpZHoiLAorICAibGx2bS5wcGMucXB4LnF2ZmN0aXciLAorICAibGx2bS5wcGMucXB4LnF2ZmN0aXd1IiwKKyAgImxsdm0ucHBjLnFweC5xdmZjdGl3dXoiLAorICAibGx2bS5wcGMucXB4LnF2ZmN0aXd6IiwKKyAgImxsdm0ucHBjLnFweC5xdmZsb2dpY2FsIiwKKyAgImxsdm0ucHBjLnFweC5xdmZtYWRkIiwKKyAgImxsdm0ucHBjLnFweC5xdmZtYWRkcyIsCisgICJsbHZtLnBwYy5xcHgucXZmbXN1YiIsCisgICJsbHZtLnBwYy5xcHgucXZmbXN1YnMiLAorICAibGx2bS5wcGMucXB4LnF2Zm11bCIsCisgICJsbHZtLnBwYy5xcHgucXZmbXVscyIsCisgICJsbHZtLnBwYy5xcHgucXZmbmFicyIsCisgICJsbHZtLnBwYy5xcHgucXZmbmVnIiwKKyAgImxsdm0ucHBjLnFweC5xdmZubWFkZCIsCisgICJsbHZtLnBwYy5xcHgucXZmbm1hZGRzIiwKKyAgImxsdm0ucHBjLnFweC5xdmZubXN1YiIsCisgICJsbHZtLnBwYy5xcHgucXZmbm1zdWJzIiwKKyAgImxsdm0ucHBjLnFweC5xdmZwZXJtIiwKKyAgImxsdm0ucHBjLnFweC5xdmZyZSIsCisgICJsbHZtLnBwYy5xcHgucXZmcmVzIiwKKyAgImxsdm0ucHBjLnFweC5xdmZyaW0iLAorICAibGx2bS5wcGMucXB4LnF2ZnJpbiIsCisgICJsbHZtLnBwYy5xcHgucXZmcmlwIiwKKyAgImxsdm0ucHBjLnFweC5xdmZyaXoiLAorICAibGx2bS5wcGMucXB4LnF2ZnJzcCIsCisgICJsbHZtLnBwYy5xcHgucXZmcnNxcnRlIiwKKyAgImxsdm0ucHBjLnFweC5xdmZyc3FydGVzIiwKKyAgImxsdm0ucHBjLnFweC5xdmZzZWwiLAorICAibGx2bS5wcGMucXB4LnF2ZnN1YiIsCisgICJsbHZtLnBwYy5xcHgucXZmc3VicyIsCisgICJsbHZtLnBwYy5xcHgucXZmdHN0bmFuIiwKKyAgImxsdm0ucHBjLnFweC5xdmZ4bWFkZCIsCisgICJsbHZtLnBwYy5xcHgucXZmeG1hZGRzIiwKKyAgImxsdm0ucHBjLnFweC5xdmZ4bXVsIiwKKyAgImxsdm0ucHBjLnFweC5xdmZ4bXVscyIsCisgICJsbHZtLnBwYy5xcHgucXZmeHhjcG5tYWRkIiwKKyAgImxsdm0ucHBjLnFweC5xdmZ4eGNwbm1hZGRzIiwKKyAgImxsdm0ucHBjLnFweC5xdmZ4eG1hZGQiLAorICAibGx2bS5wcGMucXB4LnF2Znh4bWFkZHMiLAorICAibGx2bS5wcGMucXB4LnF2Znh4bnBtYWRkIiwKKyAgImxsdm0ucHBjLnFweC5xdmZ4eG5wbWFkZHMiLAorICAibGx2bS5wcGMucXB4LnF2Z3BjaSIsCisgICJsbHZtLnBwYy5xcHgucXZsZmNkIiwKKyAgImxsdm0ucHBjLnFweC5xdmxmY2RhIiwKKyAgImxsdm0ucHBjLnFweC5xdmxmY3MiLAorICAibGx2bS5wcGMucXB4LnF2bGZjc2EiLAorICAibGx2bS5wcGMucXB4LnF2bGZkIiwKKyAgImxsdm0ucHBjLnFweC5xdmxmZGEiLAorICAibGx2bS5wcGMucXB4LnF2bGZpd2EiLAorICAibGx2bS5wcGMucXB4LnF2bGZpd2FhIiwKKyAgImxsdm0ucHBjLnFweC5xdmxmaXd6IiwKKyAgImxsdm0ucHBjLnFweC5xdmxmaXd6YSIsCisgICJsbHZtLnBwYy5xcHgucXZsZnMiLAorICAibGx2bS5wcGMucXB4LnF2bGZzYSIsCisgICJsbHZtLnBwYy5xcHgucXZscGNsZCIsCisgICJsbHZtLnBwYy5xcHgucXZscGNscyIsCisgICJsbHZtLnBwYy5xcHgucXZscGNyZCIsCisgICJsbHZtLnBwYy5xcHgucXZscGNycyIsCisgICJsbHZtLnBwYy5xcHgucXZzdGZjZCIsCisgICJsbHZtLnBwYy5xcHgucXZzdGZjZGEiLAorICAibGx2bS5wcGMucXB4LnF2c3RmY3MiLAorICAibGx2bS5wcGMucXB4LnF2c3RmY3NhIiwKKyAgImxsdm0ucHBjLnFweC5xdnN0ZmQiLAorICAibGx2bS5wcGMucXB4LnF2c3RmZGEiLAorICAibGx2bS5wcGMucXB4LnF2c3RmaXciLAorICAibGx2bS5wcGMucXB4LnF2c3RmaXdhIiwKKyAgImxsdm0ucHBjLnFweC5xdnN0ZnMiLAorICAibGx2bS5wcGMucXB4LnF2c3Rmc2EiLAorICAibGx2bS5wcGMuc2V0LnRleGFzciIsCisgICJsbHZtLnBwYy5zZXQudGV4YXNydSIsCisgICJsbHZtLnBwYy5zZXQudGZoYXIiLAorICAibGx2bS5wcGMuc2V0LnRmaWFyIiwKKyAgImxsdm0ucHBjLnN5bmMiLAorICAibGx2bS5wcGMudGFib3J0IiwKKyAgImxsdm0ucHBjLnRhYm9ydGRjIiwKKyAgImxsdm0ucHBjLnRhYm9ydGRjaSIsCisgICJsbHZtLnBwYy50YWJvcnR3YyIsCisgICJsbHZtLnBwYy50YWJvcnR3Y2kiLAorICAibGx2bS5wcGMudGJlZ2luIiwKKyAgImxsdm0ucHBjLnRjaGVjayIsCisgICJsbHZtLnBwYy50ZW5kIiwKKyAgImxsdm0ucHBjLnRlbmRhbGwiLAorICAibGx2bS5wcGMudHJlY2hrcHQiLAorICAibGx2bS5wcGMudHJlY2xhaW0iLAorICAibGx2bS5wcGMudHJlc3VtZSIsCisgICJsbHZtLnBwYy50c3IiLAorICAibGx2bS5wcGMudHN1c3BlbmQiLAorICAibGx2bS5wcGMudHRlc3QiLAorICAibGx2bS5wcGMudnN4Lmx4dmQyeCIsCisgICJsbHZtLnBwYy52c3gubHh2ZDJ4LmJlIiwKKyAgImxsdm0ucHBjLnZzeC5seHZsIiwKKyAgImxsdm0ucHBjLnZzeC5seHZsbCIsCisgICJsbHZtLnBwYy52c3gubHh2dzR4IiwKKyAgImxsdm0ucHBjLnZzeC5seHZ3NHguYmUiLAorICAibGx2bS5wcGMudnN4LnN0eHZkMngiLAorICAibGx2bS5wcGMudnN4LnN0eHZkMnguYmUiLAorICAibGx2bS5wcGMudnN4LnN0eHZsIiwKKyAgImxsdm0ucHBjLnZzeC5zdHh2bGwiLAorICAibGx2bS5wcGMudnN4LnN0eHZ3NHgiLAorICAibGx2bS5wcGMudnN4LnN0eHZ3NHguYmUiLAorICAibGx2bS5wcGMudnN4LnhzbWF4ZHAiLAorICAibGx2bS5wcGMudnN4LnhzbWluZHAiLAorICAibGx2bS5wcGMudnN4Lnh2Y21wZXFkcCIsCisgICJsbHZtLnBwYy52c3gueHZjbXBlcWRwLnAiLAorICAibGx2bS5wcGMudnN4Lnh2Y21wZXFzcCIsCisgICJsbHZtLnBwYy52c3gueHZjbXBlcXNwLnAiLAorICAibGx2bS5wcGMudnN4Lnh2Y21wZ2VkcCIsCisgICJsbHZtLnBwYy52c3gueHZjbXBnZWRwLnAiLAorICAibGx2bS5wcGMudnN4Lnh2Y21wZ2VzcCIsCisgICJsbHZtLnBwYy52c3gueHZjbXBnZXNwLnAiLAorICAibGx2bS5wcGMudnN4Lnh2Y21wZ3RkcCIsCisgICJsbHZtLnBwYy52c3gueHZjbXBndGRwLnAiLAorICAibGx2bS5wcGMudnN4Lnh2Y21wZ3RzcCIsCisgICJsbHZtLnBwYy52c3gueHZjbXBndHNwLnAiLAorICAibGx2bS5wcGMudnN4Lnh2Y3ZkcHNwIiwKKyAgImxsdm0ucHBjLnZzeC54dmN2ZHBzeHdzIiwKKyAgImxsdm0ucHBjLnZzeC54dmN2ZHB1eHdzIiwKKyAgImxsdm0ucHBjLnZzeC54dmN2aHBzcCIsCisgICJsbHZtLnBwYy52c3gueHZjdnNwZHAiLAorICAibGx2bS5wcGMudnN4Lnh2Y3ZzcGhwIiwKKyAgImxsdm0ucHBjLnZzeC54dmN2c3hkc3AiLAorICAibGx2bS5wcGMudnN4Lnh2Y3ZzeHdkcCIsCisgICJsbHZtLnBwYy52c3gueHZjdnV4ZHNwIiwKKyAgImxsdm0ucHBjLnZzeC54dmN2dXh3ZHAiLAorICAibGx2bS5wcGMudnN4Lnh2ZGl2ZHAiLAorICAibGx2bS5wcGMudnN4Lnh2ZGl2c3AiLAorICAibGx2bS5wcGMudnN4Lnh2aWV4cGRwIiwKKyAgImxsdm0ucHBjLnZzeC54dmlleHBzcCIsCisgICJsbHZtLnBwYy52c3gueHZtYXhkcCIsCisgICJsbHZtLnBwYy52c3gueHZtYXhzcCIsCisgICJsbHZtLnBwYy52c3gueHZtaW5kcCIsCisgICJsbHZtLnBwYy52c3gueHZtaW5zcCIsCisgICJsbHZtLnBwYy52c3gueHZyZHBpcCIsCisgICJsbHZtLnBwYy52c3gueHZyZWRwIiwKKyAgImxsdm0ucHBjLnZzeC54dnJlc3AiLAorICAibGx2bS5wcGMudnN4Lnh2cnNwaXAiLAorICAibGx2bS5wcGMudnN4Lnh2cnNxcnRlZHAiLAorICAibGx2bS5wcGMudnN4Lnh2cnNxcnRlc3AiLAorICAibGx2bS5wcGMudnN4Lnh2dHN0ZGNkcCIsCisgICJsbHZtLnBwYy52c3gueHZ0c3RkY3NwIiwKKyAgImxsdm0ucHBjLnZzeC54dnhleHBkcCIsCisgICJsbHZtLnBwYy52c3gueHZ4ZXhwc3AiLAorICAibGx2bS5wcGMudnN4Lnh2eHNpZ2RwIiwKKyAgImxsdm0ucHBjLnZzeC54dnhzaWdzcCIsCisgICJsbHZtLnBwYy52c3gueHhleHRyYWN0dXciLAorICAibGx2bS5wcGMudnN4Lnh4aW5zZXJ0dyIsCisgICJsbHZtLnBwYy52c3gueHhsZXF2IiwKKyAgImxsdm0ucjYwMC5jdWJlIiwKKyAgImxsdm0ucjYwMC5ncm91cC5iYXJyaWVyIiwKKyAgImxsdm0ucjYwMC5pbXBsaWNpdGFyZy5wdHIiLAorICAibGx2bS5yNjAwLnJhdC5zdG9yZS50eXBlZCIsCisgICJsbHZtLnI2MDAucmVhZC5nbG9iYWwuc2l6ZS54IiwKKyAgImxsdm0ucjYwMC5yZWFkLmdsb2JhbC5zaXplLnkiLAorICAibGx2bS5yNjAwLnJlYWQuZ2xvYmFsLnNpemUueiIsCisgICJsbHZtLnI2MDAucmVhZC5sb2NhbC5zaXplLngiLAorICAibGx2bS5yNjAwLnJlYWQubG9jYWwuc2l6ZS55IiwKKyAgImxsdm0ucjYwMC5yZWFkLmxvY2FsLnNpemUueiIsCisgICJsbHZtLnI2MDAucmVhZC5uZ3JvdXBzLngiLAorICAibGx2bS5yNjAwLnJlYWQubmdyb3Vwcy55IiwKKyAgImxsdm0ucjYwMC5yZWFkLm5ncm91cHMueiIsCisgICJsbHZtLnI2MDAucmVhZC50Z2lkLngiLAorICAibGx2bS5yNjAwLnJlYWQudGdpZC55IiwKKyAgImxsdm0ucjYwMC5yZWFkLnRnaWQueiIsCisgICJsbHZtLnI2MDAucmVhZC50aWRpZy54IiwKKyAgImxsdm0ucjYwMC5yZWFkLnRpZGlnLnkiLAorICAibGx2bS5yNjAwLnJlYWQudGlkaWcueiIsCisgICJsbHZtLnI2MDAucmVjaXBzcXJ0LmNsYW1wZWQiLAorICAibGx2bS5yNjAwLnJlY2lwc3FydC5pZWVlIiwKKyAgImxsdm0uczM5MC5lZnBjIiwKKyAgImxsdm0uczM5MC5ldG5kIiwKKyAgImxsdm0uczM5MC5sY2JiIiwKKyAgImxsdm0uczM5MC5udHN0ZyIsCisgICJsbHZtLnMzOTAucHBhLnR4YXNzaXN0IiwKKyAgImxsdm0uczM5MC5zZnBjIiwKKyAgImxsdm0uczM5MC50YWJvcnQiLAorICAibGx2bS5zMzkwLnRiZWdpbiIsCisgICJsbHZtLnMzOTAudGJlZ2luLm5vZmxvYXQiLAorICAibGx2bS5zMzkwLnRiZWdpbmMiLAorICAibGx2bS5zMzkwLnRkYyIsCisgICJsbHZtLnMzOTAudGVuZCIsCisgICJsbHZtLnMzOTAudmFjY2IiLAorICAibGx2bS5zMzkwLnZhY2NjcSIsCisgICJsbHZtLnMzOTAudmFjY2YiLAorICAibGx2bS5zMzkwLnZhY2NnIiwKKyAgImxsdm0uczM5MC52YWNjaCIsCisgICJsbHZtLnMzOTAudmFjY3EiLAorICAibGx2bS5zMzkwLnZhY3EiLAorICAibGx2bS5zMzkwLnZhcSIsCisgICJsbHZtLnMzOTAudmF2Z2IiLAorICAibGx2bS5zMzkwLnZhdmdmIiwKKyAgImxsdm0uczM5MC52YXZnZyIsCisgICJsbHZtLnMzOTAudmF2Z2giLAorICAibGx2bS5zMzkwLnZhdmdsYiIsCisgICJsbHZtLnMzOTAudmF2Z2xmIiwKKyAgImxsdm0uczM5MC52YXZnbGciLAorICAibGx2bS5zMzkwLnZhdmdsaCIsCisgICJsbHZtLnMzOTAudmJwZXJtIiwKKyAgImxsdm0uczM5MC52Y2VxYnMiLAorICAibGx2bS5zMzkwLnZjZXFmcyIsCisgICJsbHZtLnMzOTAudmNlcWdzIiwKKyAgImxsdm0uczM5MC52Y2VxaHMiLAorICAibGx2bS5zMzkwLnZjaGJzIiwKKyAgImxsdm0uczM5MC52Y2hmcyIsCisgICJsbHZtLnMzOTAudmNoZ3MiLAorICAibGx2bS5zMzkwLnZjaGhzIiwKKyAgImxsdm0uczM5MC52Y2hsYnMiLAorICAibGx2bS5zMzkwLnZjaGxmcyIsCisgICJsbHZtLnMzOTAudmNobGdzIiwKKyAgImxsdm0uczM5MC52Y2hsaHMiLAorICAibGx2bS5zMzkwLnZja3NtIiwKKyAgImxsdm0uczM5MC52ZXJpbWIiLAorICAibGx2bS5zMzkwLnZlcmltZiIsCisgICJsbHZtLnMzOTAudmVyaW1nIiwKKyAgImxsdm0uczM5MC52ZXJpbWgiLAorICAibGx2bS5zMzkwLnZlcmxsYiIsCisgICJsbHZtLnMzOTAudmVybGxmIiwKKyAgImxsdm0uczM5MC52ZXJsbGciLAorICAibGx2bS5zMzkwLnZlcmxsaCIsCisgICJsbHZtLnMzOTAudmVybGx2YiIsCisgICJsbHZtLnMzOTAudmVybGx2ZiIsCisgICJsbHZtLnMzOTAudmVybGx2ZyIsCisgICJsbHZtLnMzOTAudmVybGx2aCIsCisgICJsbHZtLnMzOTAudmZhZWIiLAorICAibGx2bS5zMzkwLnZmYWVicyIsCisgICJsbHZtLnMzOTAudmZhZWYiLAorICAibGx2bS5zMzkwLnZmYWVmcyIsCisgICJsbHZtLnMzOTAudmZhZWgiLAorICAibGx2bS5zMzkwLnZmYWVocyIsCisgICJsbHZtLnMzOTAudmZhZXpiIiwKKyAgImxsdm0uczM5MC52ZmFlemJzIiwKKyAgImxsdm0uczM5MC52ZmFlemYiLAorICAibGx2bS5zMzkwLnZmYWV6ZnMiLAorICAibGx2bS5zMzkwLnZmYWV6aCIsCisgICJsbHZtLnMzOTAudmZhZXpocyIsCisgICJsbHZtLnMzOTAudmZjZWRicyIsCisgICJsbHZtLnMzOTAudmZjZXNicyIsCisgICJsbHZtLnMzOTAudmZjaGRicyIsCisgICJsbHZtLnMzOTAudmZjaGVkYnMiLAorICAibGx2bS5zMzkwLnZmY2hlc2JzIiwKKyAgImxsdm0uczM5MC52ZmNoc2JzIiwKKyAgImxsdm0uczM5MC52ZmVlYiIsCisgICJsbHZtLnMzOTAudmZlZWJzIiwKKyAgImxsdm0uczM5MC52ZmVlZiIsCisgICJsbHZtLnMzOTAudmZlZWZzIiwKKyAgImxsdm0uczM5MC52ZmVlaCIsCisgICJsbHZtLnMzOTAudmZlZWhzIiwKKyAgImxsdm0uczM5MC52ZmVlemIiLAorICAibGx2bS5zMzkwLnZmZWV6YnMiLAorICAibGx2bS5zMzkwLnZmZWV6ZiIsCisgICJsbHZtLnMzOTAudmZlZXpmcyIsCisgICJsbHZtLnMzOTAudmZlZXpoIiwKKyAgImxsdm0uczM5MC52ZmVlemhzIiwKKyAgImxsdm0uczM5MC52ZmVuZWIiLAorICAibGx2bS5zMzkwLnZmZW5lYnMiLAorICAibGx2bS5zMzkwLnZmZW5lZiIsCisgICJsbHZtLnMzOTAudmZlbmVmcyIsCisgICJsbHZtLnMzOTAudmZlbmVoIiwKKyAgImxsdm0uczM5MC52ZmVuZWhzIiwKKyAgImxsdm0uczM5MC52ZmVuZXpiIiwKKyAgImxsdm0uczM5MC52ZmVuZXpicyIsCisgICJsbHZtLnMzOTAudmZlbmV6ZiIsCisgICJsbHZtLnMzOTAudmZlbmV6ZnMiLAorICAibGx2bS5zMzkwLnZmZW5lemgiLAorICAibGx2bS5zMzkwLnZmZW5lemhzIiwKKyAgImxsdm0uczM5MC52ZmlkYiIsCisgICJsbHZtLnMzOTAudmZpc2IiLAorICAibGx2bS5zMzkwLnZmbWF4ZGIiLAorICAibGx2bS5zMzkwLnZmbWF4c2IiLAorICAibGx2bS5zMzkwLnZmbWluZGIiLAorICAibGx2bS5zMzkwLnZmbWluc2IiLAorICAibGx2bS5zMzkwLnZmdGNpZGIiLAorICAibGx2bS5zMzkwLnZmdGNpc2IiLAorICAibGx2bS5zMzkwLnZnZm1hYiIsCisgICJsbHZtLnMzOTAudmdmbWFmIiwKKyAgImxsdm0uczM5MC52Z2ZtYWciLAorICAibGx2bS5zMzkwLnZnZm1haCIsCisgICJsbHZtLnMzOTAudmdmbWIiLAorICAibGx2bS5zMzkwLnZnZm1mIiwKKyAgImxsdm0uczM5MC52Z2ZtZyIsCisgICJsbHZtLnMzOTAudmdmbWgiLAorICAibGx2bS5zMzkwLnZpc3RyYiIsCisgICJsbHZtLnMzOTAudmlzdHJicyIsCisgICJsbHZtLnMzOTAudmlzdHJmIiwKKyAgImxsdm0uczM5MC52aXN0cmZzIiwKKyAgImxsdm0uczM5MC52aXN0cmgiLAorICAibGx2bS5zMzkwLnZpc3RyaHMiLAorICAibGx2bS5zMzkwLnZsYmIiLAorICAibGx2bS5zMzkwLnZsbCIsCisgICJsbHZtLnMzOTAudmxybCIsCisgICJsbHZtLnMzOTAudm1hZWIiLAorICAibGx2bS5zMzkwLnZtYWVmIiwKKyAgImxsdm0uczM5MC52bWFlaCIsCisgICJsbHZtLnMzOTAudm1haGIiLAorICAibGx2bS5zMzkwLnZtYWhmIiwKKyAgImxsdm0uczM5MC52bWFoaCIsCisgICJsbHZtLnMzOTAudm1hbGViIiwKKyAgImxsdm0uczM5MC52bWFsZWYiLAorICAibGx2bS5zMzkwLnZtYWxlaCIsCisgICJsbHZtLnMzOTAudm1hbGhiIiwKKyAgImxsdm0uczM5MC52bWFsaGYiLAorICAibGx2bS5zMzkwLnZtYWxoaCIsCisgICJsbHZtLnMzOTAudm1hbG9iIiwKKyAgImxsdm0uczM5MC52bWFsb2YiLAorICAibGx2bS5zMzkwLnZtYWxvaCIsCisgICJsbHZtLnMzOTAudm1hb2IiLAorICAibGx2bS5zMzkwLnZtYW9mIiwKKyAgImxsdm0uczM5MC52bWFvaCIsCisgICJsbHZtLnMzOTAudm1lYiIsCisgICJsbHZtLnMzOTAudm1lZiIsCisgICJsbHZtLnMzOTAudm1laCIsCisgICJsbHZtLnMzOTAudm1oYiIsCisgICJsbHZtLnMzOTAudm1oZiIsCisgICJsbHZtLnMzOTAudm1oaCIsCisgICJsbHZtLnMzOTAudm1sZWIiLAorICAibGx2bS5zMzkwLnZtbGVmIiwKKyAgImxsdm0uczM5MC52bWxlaCIsCisgICJsbHZtLnMzOTAudm1saGIiLAorICAibGx2bS5zMzkwLnZtbGhmIiwKKyAgImxsdm0uczM5MC52bWxoaCIsCisgICJsbHZtLnMzOTAudm1sb2IiLAorICAibGx2bS5zMzkwLnZtbG9mIiwKKyAgImxsdm0uczM5MC52bWxvaCIsCisgICJsbHZtLnMzOTAudm1vYiIsCisgICJsbHZtLnMzOTAudm1vZiIsCisgICJsbHZtLnMzOTAudm1vaCIsCisgICJsbHZtLnMzOTAudm1zbGciLAorICAibGx2bS5zMzkwLnZwZGkiLAorICAibGx2bS5zMzkwLnZwZXJtIiwKKyAgImxsdm0uczM5MC52cGtsc2YiLAorICAibGx2bS5zMzkwLnZwa2xzZnMiLAorICAibGx2bS5zMzkwLnZwa2xzZyIsCisgICJsbHZtLnMzOTAudnBrbHNncyIsCisgICJsbHZtLnMzOTAudnBrbHNoIiwKKyAgImxsdm0uczM5MC52cGtsc2hzIiwKKyAgImxsdm0uczM5MC52cGtzZiIsCisgICJsbHZtLnMzOTAudnBrc2ZzIiwKKyAgImxsdm0uczM5MC52cGtzZyIsCisgICJsbHZtLnMzOTAudnBrc2dzIiwKKyAgImxsdm0uczM5MC52cGtzaCIsCisgICJsbHZtLnMzOTAudnBrc2hzIiwKKyAgImxsdm0uczM5MC52c2JjYmlxIiwKKyAgImxsdm0uczM5MC52c2JpcSIsCisgICJsbHZtLnMzOTAudnNjYmliIiwKKyAgImxsdm0uczM5MC52c2NiaWYiLAorICAibGx2bS5zMzkwLnZzY2JpZyIsCisgICJsbHZtLnMzOTAudnNjYmloIiwKKyAgImxsdm0uczM5MC52c2NiaXEiLAorICAibGx2bS5zMzkwLnZzbCIsCisgICJsbHZtLnMzOTAudnNsYiIsCisgICJsbHZtLnMzOTAudnNsZGIiLAorICAibGx2bS5zMzkwLnZzcSIsCisgICJsbHZtLnMzOTAudnNyYSIsCisgICJsbHZtLnMzOTAudnNyYWIiLAorICAibGx2bS5zMzkwLnZzcmwiLAorICAibGx2bS5zMzkwLnZzcmxiIiwKKyAgImxsdm0uczM5MC52c3RsIiwKKyAgImxsdm0uczM5MC52c3RyY2IiLAorICAibGx2bS5zMzkwLnZzdHJjYnMiLAorICAibGx2bS5zMzkwLnZzdHJjZiIsCisgICJsbHZtLnMzOTAudnN0cmNmcyIsCisgICJsbHZtLnMzOTAudnN0cmNoIiwKKyAgImxsdm0uczM5MC52c3RyY2hzIiwKKyAgImxsdm0uczM5MC52c3RyY3piIiwKKyAgImxsdm0uczM5MC52c3RyY3picyIsCisgICJsbHZtLnMzOTAudnN0cmN6ZiIsCisgICJsbHZtLnMzOTAudnN0cmN6ZnMiLAorICAibGx2bS5zMzkwLnZzdHJjemgiLAorICAibGx2bS5zMzkwLnZzdHJjemhzIiwKKyAgImxsdm0uczM5MC52c3RybCIsCisgICJsbHZtLnMzOTAudnN1bWIiLAorICAibGx2bS5zMzkwLnZzdW1nZiIsCisgICJsbHZtLnMzOTAudnN1bWdoIiwKKyAgImxsdm0uczM5MC52c3VtaCIsCisgICJsbHZtLnMzOTAudnN1bXFmIiwKKyAgImxsdm0uczM5MC52c3VtcWciLAorICAibGx2bS5zMzkwLnZ0bSIsCisgICJsbHZtLnMzOTAudnVwaGIiLAorICAibGx2bS5zMzkwLnZ1cGhmIiwKKyAgImxsdm0uczM5MC52dXBoaCIsCisgICJsbHZtLnMzOTAudnVwbGIiLAorICAibGx2bS5zMzkwLnZ1cGxmIiwKKyAgImxsdm0uczM5MC52dXBsaGIiLAorICAibGx2bS5zMzkwLnZ1cGxoZiIsCisgICJsbHZtLnMzOTAudnVwbGhoIiwKKyAgImxsdm0uczM5MC52dXBsaHciLAorICAibGx2bS5zMzkwLnZ1cGxsYiIsCisgICJsbHZtLnMzOTAudnVwbGxmIiwKKyAgImxsdm0uczM5MC52dXBsbGgiLAorICAibGx2bS53YXNtLmN1cnJlbnQubWVtb3J5IiwKKyAgImxsdm0ud2FzbS5nZXQuZWhzZWxlY3RvciIsCisgICJsbHZtLndhc20uZ2V0LmV4Y2VwdGlvbiIsCisgICJsbHZtLndhc20uZ3Jvdy5tZW1vcnkiLAorICAibGx2bS53YXNtLm1lbS5ncm93IiwKKyAgImxsdm0ud2FzbS5tZW0uc2l6ZSIsCisgICJsbHZtLndhc20ucmV0aHJvdyIsCisgICJsbHZtLndhc20udGhyb3ciLAorICAibGx2bS54ODYuM2Rub3cucGF2Z3VzYiIsCisgICJsbHZtLng4Ni4zZG5vdy5wZjJpZCIsCisgICJsbHZtLng4Ni4zZG5vdy5wZmFjYyIsCisgICJsbHZtLng4Ni4zZG5vdy5wZmFkZCIsCisgICJsbHZtLng4Ni4zZG5vdy5wZmNtcGVxIiwKKyAgImxsdm0ueDg2LjNkbm93LnBmY21wZ2UiLAorICAibGx2bS54ODYuM2Rub3cucGZjbXBndCIsCisgICJsbHZtLng4Ni4zZG5vdy5wZm1heCIsCisgICJsbHZtLng4Ni4zZG5vdy5wZm1pbiIsCisgICJsbHZtLng4Ni4zZG5vdy5wZm11bCIsCisgICJsbHZtLng4Ni4zZG5vdy5wZnJjcCIsCisgICJsbHZtLng4Ni4zZG5vdy5wZnJjcGl0MSIsCisgICJsbHZtLng4Ni4zZG5vdy5wZnJjcGl0MiIsCisgICJsbHZtLng4Ni4zZG5vdy5wZnJzcWl0MSIsCisgICJsbHZtLng4Ni4zZG5vdy5wZnJzcXJ0IiwKKyAgImxsdm0ueDg2LjNkbm93LnBmc3ViIiwKKyAgImxsdm0ueDg2LjNkbm93LnBmc3ViciIsCisgICJsbHZtLng4Ni4zZG5vdy5waTJmZCIsCisgICJsbHZtLng4Ni4zZG5vdy5wbXVsaHJ3IiwKKyAgImxsdm0ueDg2LjNkbm93YS5wZjJpdyIsCisgICJsbHZtLng4Ni4zZG5vd2EucGZuYWNjIiwKKyAgImxsdm0ueDg2LjNkbm93YS5wZnBuYWNjIiwKKyAgImxsdm0ueDg2LjNkbm93YS5waTJmdyIsCisgICJsbHZtLng4Ni4zZG5vd2EucHN3YXBkIiwKKyAgImxsdm0ueDg2LmFkZGNhcnJ5LnUzMiIsCisgICJsbHZtLng4Ni5hZGRjYXJyeS51NjQiLAorICAibGx2bS54ODYuYWRkY2Fycnl4LnUzMiIsCisgICJsbHZtLng4Ni5hZGRjYXJyeXgudTY0IiwKKyAgImxsdm0ueDg2LmFlc25pLmFlc2RlYyIsCisgICJsbHZtLng4Ni5hZXNuaS5hZXNkZWMuMjU2IiwKKyAgImxsdm0ueDg2LmFlc25pLmFlc2RlYy41MTIiLAorICAibGx2bS54ODYuYWVzbmkuYWVzZGVjbGFzdCIsCisgICJsbHZtLng4Ni5hZXNuaS5hZXNkZWNsYXN0LjI1NiIsCisgICJsbHZtLng4Ni5hZXNuaS5hZXNkZWNsYXN0LjUxMiIsCisgICJsbHZtLng4Ni5hZXNuaS5hZXNlbmMiLAorICAibGx2bS54ODYuYWVzbmkuYWVzZW5jLjI1NiIsCisgICJsbHZtLng4Ni5hZXNuaS5hZXNlbmMuNTEyIiwKKyAgImxsdm0ueDg2LmFlc25pLmFlc2VuY2xhc3QiLAorICAibGx2bS54ODYuYWVzbmkuYWVzZW5jbGFzdC4yNTYiLAorICAibGx2bS54ODYuYWVzbmkuYWVzZW5jbGFzdC41MTIiLAorICAibGx2bS54ODYuYWVzbmkuYWVzaW1jIiwKKyAgImxsdm0ueDg2LmFlc25pLmFlc2tleWdlbmFzc2lzdCIsCisgICJsbHZtLng4Ni5hdnguYWRkc3ViLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdnguYWRkc3ViLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdnguYmxlbmR2LnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdnguYmxlbmR2LnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdnguY21wLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdnguY21wLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdnguY3Z0LnBkMi5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4LmN2dC5wZDJkcS4yNTYiLAorICAibGx2bS54ODYuYXZ4LmN2dC5wczJkcS4yNTYiLAorICAibGx2bS54ODYuYXZ4LmN2dGRxMi5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4LmN2dHQucGQyZHEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC5jdnR0LnBzMmRxLjI1NiIsCisgICJsbHZtLng4Ni5hdnguZHAucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC5oYWRkLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdnguaGFkZC5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4LmhzdWIucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC5oc3ViLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdngubGR1LmRxLjI1NiIsCisgICJsbHZtLng4Ni5hdngubWFza2xvYWQucGQiLAorICAibGx2bS54ODYuYXZ4Lm1hc2tsb2FkLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdngubWFza2xvYWQucHMiLAorICAibGx2bS54ODYuYXZ4Lm1hc2tsb2FkLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdngubWFza3N0b3JlLnBkIiwKKyAgImxsdm0ueDg2LmF2eC5tYXNrc3RvcmUucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC5tYXNrc3RvcmUucHMiLAorICAibGx2bS54ODYuYXZ4Lm1hc2tzdG9yZS5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4Lm1heC5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4Lm1heC5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4Lm1pbi5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4Lm1pbi5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4Lm1vdm1zay5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4Lm1vdm1zay5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4LnB0ZXN0Yy4yNTYiLAorICAibGx2bS54ODYuYXZ4LnB0ZXN0bnpjLjI1NiIsCisgICJsbHZtLng4Ni5hdngucHRlc3R6LjI1NiIsCisgICJsbHZtLng4Ni5hdngucmNwLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdngucm91bmQucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC5yb3VuZC5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4LnJzcXJ0LnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdnguc3FydC5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4LnNxcnQucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC52cGVybWlsdmFyLnBkIiwKKyAgImxsdm0ueDg2LmF2eC52cGVybWlsdmFyLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdngudnBlcm1pbHZhci5wcyIsCisgICJsbHZtLng4Ni5hdngudnBlcm1pbHZhci5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4LnZ0ZXN0Yy5wZCIsCisgICJsbHZtLng4Ni5hdngudnRlc3RjLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdngudnRlc3RjLnBzIiwKKyAgImxsdm0ueDg2LmF2eC52dGVzdGMucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC52dGVzdG56Yy5wZCIsCisgICJsbHZtLng4Ni5hdngudnRlc3RuemMucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC52dGVzdG56Yy5wcyIsCisgICJsbHZtLng4Ni5hdngudnRlc3RuemMucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eC52dGVzdHoucGQiLAorICAibGx2bS54ODYuYXZ4LnZ0ZXN0ei5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4LnZ0ZXN0ei5wcyIsCisgICJsbHZtLng4Ni5hdngudnRlc3R6LnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdngudnplcm9hbGwiLAorICAibGx2bS54ODYuYXZ4LnZ6ZXJvdXBwZXIiLAorICAibGx2bS54ODYuYXZ4Mi5nYXRoZXIuZC5kIiwKKyAgImxsdm0ueDg2LmF2eDIuZ2F0aGVyLmQuZC4yNTYiLAorICAibGx2bS54ODYuYXZ4Mi5nYXRoZXIuZC5wZCIsCisgICJsbHZtLng4Ni5hdngyLmdhdGhlci5kLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdngyLmdhdGhlci5kLnBzIiwKKyAgImxsdm0ueDg2LmF2eDIuZ2F0aGVyLmQucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDIuZ2F0aGVyLmQucSIsCisgICJsbHZtLng4Ni5hdngyLmdhdGhlci5kLnEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDIuZ2F0aGVyLnEuZCIsCisgICJsbHZtLng4Ni5hdngyLmdhdGhlci5xLmQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDIuZ2F0aGVyLnEucGQiLAorICAibGx2bS54ODYuYXZ4Mi5nYXRoZXIucS5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4Mi5nYXRoZXIucS5wcyIsCisgICJsbHZtLng4Ni5hdngyLmdhdGhlci5xLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdngyLmdhdGhlci5xLnEiLAorICAibGx2bS54ODYuYXZ4Mi5nYXRoZXIucS5xLjI1NiIsCisgICJsbHZtLng4Ni5hdngyLm1hc2tsb2FkLmQiLAorICAibGx2bS54ODYuYXZ4Mi5tYXNrbG9hZC5kLjI1NiIsCisgICJsbHZtLng4Ni5hdngyLm1hc2tsb2FkLnEiLAorICAibGx2bS54ODYuYXZ4Mi5tYXNrbG9hZC5xLjI1NiIsCisgICJsbHZtLng4Ni5hdngyLm1hc2tzdG9yZS5kIiwKKyAgImxsdm0ueDg2LmF2eDIubWFza3N0b3JlLmQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDIubWFza3N0b3JlLnEiLAorICAibGx2bS54ODYuYXZ4Mi5tYXNrc3RvcmUucS4yNTYiLAorICAibGx2bS54ODYuYXZ4Mi5tcHNhZGJ3IiwKKyAgImxsdm0ueDg2LmF2eDIucGFja3NzZHciLAorICAibGx2bS54ODYuYXZ4Mi5wYWNrc3N3YiIsCisgICJsbHZtLng4Ni5hdngyLnBhY2t1c2R3IiwKKyAgImxsdm0ueDg2LmF2eDIucGFja3Vzd2IiLAorICAibGx2bS54ODYuYXZ4Mi5wYWRkcy5iIiwKKyAgImxsdm0ueDg2LmF2eDIucGFkZHMudyIsCisgICJsbHZtLng4Ni5hdngyLnBhZGR1cy5iIiwKKyAgImxsdm0ueDg2LmF2eDIucGFkZHVzLnciLAorICAibGx2bS54ODYuYXZ4Mi5wYmxlbmR2YiIsCisgICJsbHZtLng4Ni5hdngyLnBlcm1kIiwKKyAgImxsdm0ueDg2LmF2eDIucGVybXBzIiwKKyAgImxsdm0ueDg2LmF2eDIucGhhZGQuZCIsCisgICJsbHZtLng4Ni5hdngyLnBoYWRkLnN3IiwKKyAgImxsdm0ueDg2LmF2eDIucGhhZGQudyIsCisgICJsbHZtLng4Ni5hdngyLnBoc3ViLmQiLAorICAibGx2bS54ODYuYXZ4Mi5waHN1Yi5zdyIsCisgICJsbHZtLng4Ni5hdngyLnBoc3ViLnciLAorICAibGx2bS54ODYuYXZ4Mi5wbWFkZC51Yi5zdyIsCisgICJsbHZtLng4Ni5hdngyLnBtYWRkLndkIiwKKyAgImxsdm0ueDg2LmF2eDIucG1vdm1za2IiLAorICAibGx2bS54ODYuYXZ4Mi5wbXVsLmRxIiwKKyAgImxsdm0ueDg2LmF2eDIucG11bC5oci5zdyIsCisgICJsbHZtLng4Ni5hdngyLnBtdWxoLnciLAorICAibGx2bS54ODYuYXZ4Mi5wbXVsaHUudyIsCisgICJsbHZtLng4Ni5hdngyLnBtdWx1LmRxIiwKKyAgImxsdm0ueDg2LmF2eDIucHNhZC5idyIsCisgICJsbHZtLng4Ni5hdngyLnBzaHVmLmIiLAorICAibGx2bS54ODYuYXZ4Mi5wc2lnbi5iIiwKKyAgImxsdm0ueDg2LmF2eDIucHNpZ24uZCIsCisgICJsbHZtLng4Ni5hdngyLnBzaWduLnciLAorICAibGx2bS54ODYuYXZ4Mi5wc2xsLmQiLAorICAibGx2bS54ODYuYXZ4Mi5wc2xsLnEiLAorICAibGx2bS54ODYuYXZ4Mi5wc2xsLnciLAorICAibGx2bS54ODYuYXZ4Mi5wc2xsaS5kIiwKKyAgImxsdm0ueDg2LmF2eDIucHNsbGkucSIsCisgICJsbHZtLng4Ni5hdngyLnBzbGxpLnciLAorICAibGx2bS54ODYuYXZ4Mi5wc2xsdi5kIiwKKyAgImxsdm0ueDg2LmF2eDIucHNsbHYuZC4yNTYiLAorICAibGx2bS54ODYuYXZ4Mi5wc2xsdi5xIiwKKyAgImxsdm0ueDg2LmF2eDIucHNsbHYucS4yNTYiLAorICAibGx2bS54ODYuYXZ4Mi5wc3JhLmQiLAorICAibGx2bS54ODYuYXZ4Mi5wc3JhLnciLAorICAibGx2bS54ODYuYXZ4Mi5wc3JhaS5kIiwKKyAgImxsdm0ueDg2LmF2eDIucHNyYWkudyIsCisgICJsbHZtLng4Ni5hdngyLnBzcmF2LmQiLAorICAibGx2bS54ODYuYXZ4Mi5wc3Jhdi5kLjI1NiIsCisgICJsbHZtLng4Ni5hdngyLnBzcmwuZCIsCisgICJsbHZtLng4Ni5hdngyLnBzcmwucSIsCisgICJsbHZtLng4Ni5hdngyLnBzcmwudyIsCisgICJsbHZtLng4Ni5hdngyLnBzcmxpLmQiLAorICAibGx2bS54ODYuYXZ4Mi5wc3JsaS5xIiwKKyAgImxsdm0ueDg2LmF2eDIucHNybGkudyIsCisgICJsbHZtLng4Ni5hdngyLnBzcmx2LmQiLAorICAibGx2bS54ODYuYXZ4Mi5wc3Jsdi5kLjI1NiIsCisgICJsbHZtLng4Ni5hdngyLnBzcmx2LnEiLAorICAibGx2bS54ODYuYXZ4Mi5wc3Jsdi5xLjI1NiIsCisgICJsbHZtLng4Ni5hdngyLnBzdWJzLmIiLAorICAibGx2bS54ODYuYXZ4Mi5wc3Vicy53IiwKKyAgImxsdm0ueDg2LmF2eDIucHN1YnVzLmIiLAorICAibGx2bS54ODYuYXZ4Mi5wc3VidXMudyIsCisgICJsbHZtLng4Ni5hdng1MTIuYnJvYWRjYXN0bWIuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5icm9hZGNhc3RtYi4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLmJyb2FkY2FzdG1iLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIuYnJvYWRjYXN0bXcuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5icm9hZGNhc3Rtdy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLmJyb2FkY2FzdG13LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIuY3Z0c2kyc2Q2NCIsCisgICJsbHZtLng4Ni5hdng1MTIuY3Z0c2kyc3MzMiIsCisgICJsbHZtLng4Ni5hdng1MTIuY3Z0c2kyc3M2NCIsCisgICJsbHZtLng4Ni5hdng1MTIuY3Z0dHNkMnNpIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5jdnR0c2Qyc2k2NCIsCisgICJsbHZtLng4Ni5hdng1MTIuY3Z0dHNkMnVzaSIsCisgICJsbHZtLng4Ni5hdng1MTIuY3Z0dHNkMnVzaTY0IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5jdnR0c3Myc2kiLAorICAibGx2bS54ODYuYXZ4NTEyLmN2dHRzczJzaTY0IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5jdnR0c3MydXNpIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5jdnR0c3MydXNpNjQiLAorICAibGx2bS54ODYuYXZ4NTEyLmN2dHVzaTJzZCIsCisgICJsbHZtLng4Ni5hdng1MTIuY3Z0dXNpMnNzIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5jdnR1c2k2NDJzZCIsCisgICJsbHZtLng4Ni5hdng1MTIuY3Z0dXNpNjQyc3MiLAorICAibGx2bS54ODYuYXZ4NTEyLmV4cDIucGQiLAorICAibGx2bS54ODYuYXZ4NTEyLmV4cDIucHMiLAorICAibGx2bS54ODYuYXZ4NTEyLmdhdGhlci5kcGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5nYXRoZXIuZHBpLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIuZ2F0aGVyLmRwcS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLmdhdGhlci5kcHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5nYXRoZXIucXBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIuZ2F0aGVyLnFwaS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLmdhdGhlci5xcHEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5nYXRoZXIucXBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM2RpdjIuZGYiLAorICAibGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNkaXYyLmRpIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzZGl2NC5kZiIsCisgICJsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM2RpdjQuZGkiLAorICAibGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNkaXY0LnNmIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzZGl2NC5zaSIsCisgICJsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM2Rpdjguc2YiLAorICAibGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNkaXY4LnNpIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzc2l2Mi5kZiIsCisgICJsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM3NpdjIuZGkiLAorICAibGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNzaXY0LmRmIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzc2l2NC5kaSIsCisgICJsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM3NpdjQuc2YiLAorICAibGx2bS54ODYuYXZ4NTEyLmdhdGhlcjNzaXY0LnNpIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzc2l2OC5zZiIsCisgICJsbHZtLng4Ni5hdng1MTIuZ2F0aGVyM3Npdjguc2kiLAorICAibGx2bS54ODYuYXZ4NTEyLmdhdGhlcnBmLmRwZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLmdhdGhlcnBmLmRwcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLmdhdGhlcnBmLnFwZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLmdhdGhlcnBmLnFwcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suYWRkLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5hZGQucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmFkZC5zZC5yb3VuZCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5hZGQuc3Mucm91bmQiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY21wLnBkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jbXAucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmNtcC5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY21wLnBzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jbXAucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmNtcC5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY21wLnNkIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmNtcC5zcyIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5iLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5iLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5iLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5kLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5kLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5xLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5xLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5iLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5iLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5iLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5kLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5kLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5xLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5xLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS53LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS53LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS53LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy53LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy53LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy53LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb25mbGljdC5kLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb25mbGljdC5kLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb25mbGljdC5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb25mbGljdC5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb25mbGljdC5xLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jb25mbGljdC5xLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRkcTJwcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0ZHEycHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dGRxMnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJkcS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQyZHEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMmRxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJwcyIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJwcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQycHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMnFxLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJxcS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQycXEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMnVkcS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQydWRxLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJ1ZHEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMnVxcS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQydXFxLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJ1cXEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMmRxLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJkcS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMyZHEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMnBkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJwZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMycGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMnFxLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJxcS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMycXEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMnVkcS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMydWRxLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJ1ZHEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMnVxcS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMydXFxLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJ1cXEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHFxMnBkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRxcTJwZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cXEycGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHFxMnBzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnRxcTJwcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cXEycHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHNkMnNzLnJvdW5kIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHNzMnNkLnJvdW5kIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJkcS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBkMmRxLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQyZHEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJxcS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBkMnFxLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQycXEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJ1ZHEuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJ1ZHEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJ1ZHEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJ1cXEuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJ1cXEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJ1cXEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJkcS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBzMmRxLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMyZHEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJxcS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBzMnFxLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMycXEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJ1ZHEuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJ1ZHEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJ1ZHEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJ1cXEuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJ1cXEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJ1cXEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHVkcTJwcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dWRxMnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR1ZHEycHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHVxcTJwZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dXFxMnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR1cXEycGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHVxcTJwcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dXFxMnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5jdnR1cXEycHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmRicHNhZGJ3LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5kYnBzYWRidy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZGJwc2FkYncuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmRpdi5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZGl2LnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5kaXYuc2Qucm91bmQiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZGl2LnNzLnJvdW5kIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5iLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQuYi4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmIuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5kLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQuZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLmIuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLmIuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLmIuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLmQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLmQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLmQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLnBkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLnBzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLnEuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLnEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLnEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLncuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLncuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLncuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQucS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLnEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC53LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQudy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLncuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmZpeHVwaW1tLnBkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5maXh1cGltbS5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZml4dXBpbW0ucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmZpeHVwaW1tLnBzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5maXh1cGltbS5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZml4dXBpbW0ucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmZpeHVwaW1tLnNkIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmZpeHVwaW1tLnNzIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3MucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3MucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3MucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3MucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3MucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3MucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3Muc2QiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZnBjbGFzcy5zcyIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5nZXRleHAucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldGV4cC5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0ZXhwLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5nZXRleHAucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldGV4cC5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0ZXhwLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5nZXRleHAuc2QiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0ZXhwLnNzIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQuc2QiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0bWFudC5zcyIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5tYXgucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLm1heC5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2subWF4LnNkLnJvdW5kIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLm1heC5zcy5yb3VuZCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5taW4ucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLm1pbi5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2subWluLnNkLnJvdW5kIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLm1pbi5zcy5yb3VuZCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5tdWwucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLm11bC5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2subXVsLnNkLnJvdW5kIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLm11bC5zcy5yb3VuZCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkcy5iLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkcy5iLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkcy5iLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkcy53LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkcy53LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkcy53LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkdXMuYi4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHVzLmIuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBhZGR1cy5iLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkdXMudy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHVzLncuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBhZGR1cy53LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLmRmLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLmRmLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLmRpLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLmRpLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLmhpLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLmhpLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLmhpLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLnFpLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLnFpLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLnFpLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLnNmLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLnNmLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLnNpLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLnNpLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbWFkZHVicy53LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbWFkZHVicy53LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbWFkZHVicy53LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbWFkZHcuZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1hZGR3LmQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtYWRkdy5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmRiLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmRiLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmRiLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmRiLm1lbS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kYi5tZW0uMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YuZGIubWVtLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmR3LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmR3LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmR3LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmR3Lm1lbS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kdy5tZW0uMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YuZHcubWVtLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFiLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFiLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFiLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFiLm1lbS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xYi5tZW0uMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucWIubWVtLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFkLm1lbS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xZC5tZW0uMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucWQubWVtLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnF3LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnF3LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnF3LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnF3Lm1lbS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xdy5tZW0uMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucXcubWVtLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LndiLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LndiLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LndiLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LndiLm1lbS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi53Yi5tZW0uMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Yud2IubWVtLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kYi4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZGIuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLmRiLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kYi5tZW0uMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLmRiLm1lbS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZGIubWVtLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kdy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZHcuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLmR3LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kdy5tZW0uMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLmR3Lm1lbS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZHcubWVtLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xYi4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWIuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnFiLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xYi5tZW0uMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnFiLm1lbS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWIubWVtLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnFkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xZC5tZW0uMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnFkLm1lbS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWQubWVtLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xdy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucXcuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnF3LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xdy5tZW0uMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnF3Lm1lbS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucXcubWVtLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy53Yi4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMud2IuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLndiLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy53Yi5tZW0uMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLndiLm1lbS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMud2IubWVtLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZGIuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5kYi4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmRiLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZGIubWVtLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZGIubWVtLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZGIubWVtLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZHcuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5kdy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmR3LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZHcubWVtLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZHcubWVtLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZHcubWVtLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWIuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xYi4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFiLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWIubWVtLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWIubWVtLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWIubWVtLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWQubWVtLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWQubWVtLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWQubWVtLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucXcuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xdy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnF3LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucXcubWVtLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucXcubWVtLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucXcubWVtLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMud2IuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy53Yi4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLndiLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMud2IubWVtLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMud2IubWVtLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMud2IubWVtLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wbXVsdGlzaGlmdC5xYi4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucG11bHRpc2hpZnQucWIuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtdWx0aXNoaWZ0LnFiLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sLmQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb2wuZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbC5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sLnEuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb2wucS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbC5xLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sdi5kLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sdi5kLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sdi5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sdi5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sdi5xLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sdi5xLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wcm9yLmQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb3IuZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvci5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wcm9yLnEuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb3IucS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvci5xLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wcm9ydi5kLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wcm9ydi5kLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wcm9ydi5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wcm9ydi5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wcm9ydi5xLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wcm9ydi5xLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wc3Vicy5iLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wc3Vicy5iLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wc3Vicy5iLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wc3Vicy53LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wc3Vicy53LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wc3Vicy53LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wc3VidXMuYi4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnVzLmIuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBzdWJ1cy5iLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wc3VidXMudy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnVzLncuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnBzdWJ1cy53LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wdGVybmxvZy5kLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wdGVybmxvZy5kLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wdGVybmxvZy5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wdGVybmxvZy5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wdGVybmxvZy5xLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5wdGVybmxvZy5xLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5yYW5nZS5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucmFuZ2UucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnJhbmdlLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5yYW5nZS5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucmFuZ2UucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnJhbmdlLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5yYW5nZS5zZCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5yYW5nZS5zcyIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5yZWR1Y2UucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnJlZHVjZS5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucmVkdWNlLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5yZWR1Y2UucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnJlZHVjZS5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucmVkdWNlLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5yZWR1Y2Uuc2QiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucmVkdWNlLnNzIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnJuZHNjYWxlLnBkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5ybmRzY2FsZS5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucm5kc2NhbGUucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnJuZHNjYWxlLnBzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5ybmRzY2FsZS5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sucm5kc2NhbGUucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnJuZHNjYWxlLnNkIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnJuZHNjYWxlLnNzIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnNjYWxlZi5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suc2NhbGVmLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5zY2FsZWYucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnNjYWxlZi5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suc2NhbGVmLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5zY2FsZWYucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnNjYWxlZi5zZCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5zY2FsZWYuc3MiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5zZCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5zcXJ0LnNzIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnN0b3JlLnNzIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnN1Yi5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suc3ViLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay5zdWIuc2Qucm91bmQiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2suc3ViLnNzLnJvdW5kIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZjdnRwaDJwcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmN2dHBoMnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52Y3Z0cGgycHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZjdnRwczJwaC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmN2dHBzMnBoLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52Y3Z0cHMycGguNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZC5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGQucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZC5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGQucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZC5zZCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGQuc3MiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkc3ViLnBkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGRzdWIucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZHN1Yi5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkc3ViLnBzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGRzdWIucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZHN1Yi5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubWFkZC5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubWFkZC5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubWFkZC5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubWFkZC5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubWFkZC5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubWFkZC5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubXN1Yi5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubXN1Yi5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubXN1Yi5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubXN1Yi5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubXN1Yi5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubXN1Yi5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcGJ1c2QuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZHBidXNkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cGRwYnVzZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcGJ1c2RzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cGRwYnVzZHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZHBidXNkcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcHdzc2QuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZHB3c3NkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cGRwd3NzZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcHdzc2RzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cGRwd3NzZHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZHB3c3Nkcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5kLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cGVybWkydmFyLmQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5oaS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5oaS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5oaS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cGVybWkydmFyLnEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5xaS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5xaS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5xaS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5kLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cGVybXQydmFyLmQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5oaS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5oaS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5oaS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cGVybXQydmFyLnEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5xaS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5xaS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5xaS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBtYWRkNTJoLnVxLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cG1hZGQ1MmgudXEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwbWFkZDUyaC51cS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBtYWRkNTJsLnVxLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cG1hZGQ1MmwudXEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwbWFkZDUybC51cS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLmQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZC5kLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLnEuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZC5xLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkLncuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZC53LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkdi5kLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGR2LmQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZHYuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkdi5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGR2LnEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZHYucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkdi53LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGR2LncuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZHYudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLmQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZC5kLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLnEuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZC5xLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkLncuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZC53LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkdi5kLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmR2LmQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZHYuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkdi5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmR2LnEuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZHYucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkdi53LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmR2LncuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZHYudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHVmYml0cW1iLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzay52cHNodWZiaXRxbWIuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2h1ZmJpdHFtYi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5wZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5wcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5zZCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkLnNzIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGRzdWIucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGRzdWIucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGRzdWIucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGRzdWIucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGRzdWIucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGRzdWIucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIuc2QiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1Yi5zcyIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViYWRkLnBkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViYWRkLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViYWRkLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViYWRkLnBzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViYWRkLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViYWRkLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZubXN1Yi5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbm1zdWIucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm5tc3ViLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZubXN1Yi5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbm1zdWIucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm5tc3ViLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZubXN1Yi5zZCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFzazMudmZubXN1Yi5zcyIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3ouZml4dXBpbW0ucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei5maXh1cGltbS5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LmZpeHVwaW1tLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3ouZml4dXBpbW0ucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei5maXh1cGltbS5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LmZpeHVwaW1tLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3ouZml4dXBpbW0uc2QiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LmZpeHVwaW1tLnNzIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei5wdGVybmxvZy5kLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oucHRlcm5sb2cuZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnB0ZXJubG9nLmQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei5wdGVybmxvZy5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oucHRlcm5sb2cucS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnB0ZXJubG9nLnEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQucHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQuc2QiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZC5zcyIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkc3ViLnBkLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkc3ViLnBkLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkc3ViLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkc3ViLnBzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkc3ViLnBzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkc3ViLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcGJ1c2QuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGRwYnVzZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHBidXNkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcGJ1c2RzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcGJ1c2RzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcGJ1c2RzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcHdzc2QuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGRwd3NzZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHB3c3NkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcHdzc2RzLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcHdzc2RzLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcHdzc2RzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5kLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5kLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5oaS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIuaGkuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLmhpLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5xLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5xLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5xaS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucWkuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnFpLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBtYWRkNTJoLnVxLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBtYWRkNTJoLnVxLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBtYWRkNTJoLnVxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBtYWRkNTJsLnVxLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBtYWRkNTJsLnVxLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBtYWRkNTJsLnVxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi5kLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi5kLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi5xLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi5xLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi53LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi53LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi53LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi5kLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi5kLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi5xLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi5xLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi53LjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi53LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi53LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucGFja3NzZHcuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wYWNrc3N3Yi41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBhY2t1c2R3LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucGFja3Vzd2IuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wbXVsLmRxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucG11bC5oci5zdy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBtdWxoLncuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wbXVsaHUudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBtdWx1LmRxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucHNhZC5idy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzaHVmLmIuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc2xsLmQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc2xsLnEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc2xsLncuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc2xsaS5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucHNsbGkucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzbGxpLncuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc2xsdi5kLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucHNsbHYucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzbGx2LncuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc2xsdi53LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIucHNsbHYudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmEuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmEucS4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmEucS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmEucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmEudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmFpLmQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3JhaS5xLjEyOCIsCisgICJsbHZtLng4Ni5hdng1MTIucHNyYWkucS4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmFpLnEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3JhaS53LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucHNyYXYuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmF2LnEuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3Jhdi5xLjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIucHNyYXYucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmF2LncuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3Jhdi53LjI1NiIsCisgICJsbHZtLng4Ni5hdng1MTIucHNyYXYudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmwuZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmwucS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmwudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmxpLmQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3JsaS5xLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucHNybGkudy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmx2LmQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3Jsdi5xLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucHNybHYudy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLnBzcmx2LncuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5wc3Jsdi53LjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucmNwMTQucGQuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5yY3AxNC5wZC4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLnJjcDE0LnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucmNwMTQucHMuMTI4IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5yY3AxNC5wcy4yNTYiLAorICAibGx2bS54ODYuYXZ4NTEyLnJjcDE0LnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucmNwMTQuc2QiLAorICAibGx2bS54ODYuYXZ4NTEyLnJjcDE0LnNzIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5yY3AyOC5wZCIsCisgICJsbHZtLng4Ni5hdng1MTIucmNwMjgucHMiLAorICAibGx2bS54ODYuYXZ4NTEyLnJjcDI4LnNkIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5yY3AyOC5zcyIsCisgICJsbHZtLng4Ni5hdng1MTIucnNxcnQxNC5wZC4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLnJzcXJ0MTQucGQuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5yc3FydDE0LnBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucnNxcnQxNC5wcy4xMjgiLAorICAibGx2bS54ODYuYXZ4NTEyLnJzcXJ0MTQucHMuMjU2IiwKKyAgImxsdm0ueDg2LmF2eDUxMi5yc3FydDE0LnBzLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIucnNxcnQxNC5zZCIsCisgICJsbHZtLng4Ni5hdng1MTIucnNxcnQxNC5zcyIsCisgICJsbHZtLng4Ni5hdng1MTIucnNxcnQyOC5wZCIsCisgICJsbHZtLng4Ni5hdng1MTIucnNxcnQyOC5wcyIsCisgICJsbHZtLng4Ni5hdng1MTIucnNxcnQyOC5zZCIsCisgICJsbHZtLng4Ni5hdng1MTIucnNxcnQyOC5zcyIsCisgICJsbHZtLng4Ni5hdng1MTIuc2NhdHRlci5kcGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyLmRwaS41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXIuZHBxLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIuc2NhdHRlci5kcHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyLnFwZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXIucXBpLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIuc2NhdHRlci5xcHEuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyLnFwcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJkaXYyLmRmIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyZGl2Mi5kaSIsCisgICJsbHZtLng4Ni5hdng1MTIuc2NhdHRlcmRpdjQuZGYiLAorICAibGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJkaXY0LmRpIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyZGl2NC5zZiIsCisgICJsbHZtLng4Ni5hdng1MTIuc2NhdHRlcmRpdjQuc2kiLAorICAibGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJkaXY4LnNmIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyZGl2OC5zaSIsCisgICJsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnBmLmRwZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJwZi5kcHMuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5zY2F0dGVycGYucXBkLjUxMiIsCisgICJsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnBmLnFwcy41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJzaXYyLmRmIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyc2l2Mi5kaSIsCisgICJsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnNpdjQuZGYiLAorICAibGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJzaXY0LmRpIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyc2l2NC5zZiIsCisgICJsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnNpdjQuc2kiLAorICAibGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJzaXY4LnNmIiwKKyAgImxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyc2l2OC5zaSIsCisgICJsbHZtLng4Ni5hdng1MTIudmJyb2FkY2FzdC5zZC41MTIiLAorICAibGx2bS54ODYuYXZ4NTEyLnZicm9hZGNhc3Quc3MuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi52Y29taS5zZCIsCisgICJsbHZtLng4Ni5hdng1MTIudmNvbWkuc3MiLAorICAibGx2bS54ODYuYXZ4NTEyLnZjdnRzZDJzaTMyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi52Y3Z0c2Qyc2k2NCIsCisgICJsbHZtLng4Ni5hdng1MTIudmN2dHNkMnVzaTMyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi52Y3Z0c2QydXNpNjQiLAorICAibGx2bS54ODYuYXZ4NTEyLnZjdnRzczJzaTMyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi52Y3Z0c3Myc2k2NCIsCisgICJsbHZtLng4Ni5hdng1MTIudmN2dHNzMnVzaTMyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi52Y3Z0c3MydXNpNjQiLAorICAibGx2bS54ODYuYXZ4NTEyLnZwZXJtaWx2YXIucGQuNTEyIiwKKyAgImxsdm0ueDg2LmF2eDUxMi52cGVybWlsdmFyLnBzLjUxMiIsCisgICJsbHZtLng4Ni5ibWkuYmV4dHIuMzIiLAorICAibGx2bS54ODYuYm1pLmJleHRyLjY0IiwKKyAgImxsdm0ueDg2LmJtaS5iemhpLjMyIiwKKyAgImxsdm0ueDg2LmJtaS5iemhpLjY0IiwKKyAgImxsdm0ueDg2LmJtaS5wZGVwLjMyIiwKKyAgImxsdm0ueDg2LmJtaS5wZGVwLjY0IiwKKyAgImxsdm0ueDg2LmJtaS5wZXh0LjMyIiwKKyAgImxsdm0ueDg2LmJtaS5wZXh0LjY0IiwKKyAgImxsdm0ueDg2LmNsZmx1c2hvcHQiLAorICAibGx2bS54ODYuY2xyc3Nic3kiLAorICAibGx2bS54ODYuY2x3YiIsCisgICJsbHZtLng4Ni5jbHplcm8iLAorICAibGx2bS54ODYuZmxhZ3MucmVhZC51MzIiLAorICAibGx2bS54ODYuZmxhZ3MucmVhZC51NjQiLAorICAibGx2bS54ODYuZmxhZ3Mud3JpdGUudTMyIiwKKyAgImxsdm0ueDg2LmZsYWdzLndyaXRlLnU2NCIsCisgICJsbHZtLng4Ni5mbWEudmZtYWRkLnBkIiwKKyAgImxsdm0ueDg2LmZtYS52Zm1hZGQucGQuMjU2IiwKKyAgImxsdm0ueDg2LmZtYS52Zm1hZGQucHMiLAorICAibGx2bS54ODYuZm1hLnZmbWFkZC5wcy4yNTYiLAorICAibGx2bS54ODYuZm1hLnZmbWFkZC5zZCIsCisgICJsbHZtLng4Ni5mbWEudmZtYWRkLnNzIiwKKyAgImxsdm0ueDg2LmZtYS52Zm1hZGRzdWIucGQiLAorICAibGx2bS54ODYuZm1hLnZmbWFkZHN1Yi5wZC4yNTYiLAorICAibGx2bS54ODYuZm1hLnZmbWFkZHN1Yi5wcyIsCisgICJsbHZtLng4Ni5mbWEudmZtYWRkc3ViLnBzLjI1NiIsCisgICJsbHZtLng4Ni5mbWEudmZtc3ViLnBkIiwKKyAgImxsdm0ueDg2LmZtYS52Zm1zdWIucGQuMjU2IiwKKyAgImxsdm0ueDg2LmZtYS52Zm1zdWIucHMiLAorICAibGx2bS54ODYuZm1hLnZmbXN1Yi5wcy4yNTYiLAorICAibGx2bS54ODYuZm1hLnZmbXN1Yi5zZCIsCisgICJsbHZtLng4Ni5mbWEudmZtc3ViLnNzIiwKKyAgImxsdm0ueDg2LmZtYS52Zm1zdWJhZGQucGQiLAorICAibGx2bS54ODYuZm1hLnZmbXN1YmFkZC5wZC4yNTYiLAorICAibGx2bS54ODYuZm1hLnZmbXN1YmFkZC5wcyIsCisgICJsbHZtLng4Ni5mbWEudmZtc3ViYWRkLnBzLjI1NiIsCisgICJsbHZtLng4Ni5mbWEudmZubWFkZC5wZCIsCisgICJsbHZtLng4Ni5mbWEudmZubWFkZC5wZC4yNTYiLAorICAibGx2bS54ODYuZm1hLnZmbm1hZGQucHMiLAorICAibGx2bS54ODYuZm1hLnZmbm1hZGQucHMuMjU2IiwKKyAgImxsdm0ueDg2LmZtYS52Zm5tYWRkLnNkIiwKKyAgImxsdm0ueDg2LmZtYS52Zm5tYWRkLnNzIiwKKyAgImxsdm0ueDg2LmZtYS52Zm5tc3ViLnBkIiwKKyAgImxsdm0ueDg2LmZtYS52Zm5tc3ViLnBkLjI1NiIsCisgICJsbHZtLng4Ni5mbWEudmZubXN1Yi5wcyIsCisgICJsbHZtLng4Ni5mbWEudmZubXN1Yi5wcy4yNTYiLAorICAibGx2bS54ODYuZm1hLnZmbm1zdWIuc2QiLAorICAibGx2bS54ODYuZm1hLnZmbm1zdWIuc3MiLAorICAibGx2bS54ODYuZm1hNC52Zm1hZGQuc2QiLAorICAibGx2bS54ODYuZm1hNC52Zm1hZGQuc3MiLAorICAibGx2bS54ODYuZnhyc3RvciIsCisgICJsbHZtLng4Ni5meHJzdG9yNjQiLAorICAibGx2bS54ODYuZnhzYXZlIiwKKyAgImxsdm0ueDg2LmZ4c2F2ZTY0IiwKKyAgImxsdm0ueDg2LmluY3NzcGQiLAorICAibGx2bS54ODYuaW5jc3NwcSIsCisgICJsbHZtLng4Ni5pbnQiLAorICAibGx2bS54ODYubGx3cGNiIiwKKyAgImxsdm0ueDg2Lmx3cGluczMyIiwKKyAgImxsdm0ueDg2Lmx3cGluczY0IiwKKyAgImxsdm0ueDg2Lmx3cHZhbDMyIiwKKyAgImxsdm0ueDg2Lmx3cHZhbDY0IiwKKyAgImxsdm0ueDg2Lm1teC5lbW1zIiwKKyAgImxsdm0ueDg2Lm1teC5mZW1tcyIsCisgICJsbHZtLng4Ni5tbXgubWFza21vdnEiLAorICAibGx2bS54ODYubW14Lm1vdm50LmRxIiwKKyAgImxsdm0ueDg2Lm1teC5wYWNrc3NkdyIsCisgICJsbHZtLng4Ni5tbXgucGFja3Nzd2IiLAorICAibGx2bS54ODYubW14LnBhY2t1c3diIiwKKyAgImxsdm0ueDg2Lm1teC5wYWRkLmIiLAorICAibGx2bS54ODYubW14LnBhZGQuZCIsCisgICJsbHZtLng4Ni5tbXgucGFkZC5xIiwKKyAgImxsdm0ueDg2Lm1teC5wYWRkLnciLAorICAibGx2bS54ODYubW14LnBhZGRzLmIiLAorICAibGx2bS54ODYubW14LnBhZGRzLnciLAorICAibGx2bS54ODYubW14LnBhZGR1cy5iIiwKKyAgImxsdm0ueDg2Lm1teC5wYWRkdXMudyIsCisgICJsbHZtLng4Ni5tbXgucGFsaWduci5iIiwKKyAgImxsdm0ueDg2Lm1teC5wYW5kIiwKKyAgImxsdm0ueDg2Lm1teC5wYW5kbiIsCisgICJsbHZtLng4Ni5tbXgucGF2Zy5iIiwKKyAgImxsdm0ueDg2Lm1teC5wYXZnLnciLAorICAibGx2bS54ODYubW14LnBjbXBlcS5iIiwKKyAgImxsdm0ueDg2Lm1teC5wY21wZXEuZCIsCisgICJsbHZtLng4Ni5tbXgucGNtcGVxLnciLAorICAibGx2bS54ODYubW14LnBjbXBndC5iIiwKKyAgImxsdm0ueDg2Lm1teC5wY21wZ3QuZCIsCisgICJsbHZtLng4Ni5tbXgucGNtcGd0LnciLAorICAibGx2bS54ODYubW14LnBleHRyLnciLAorICAibGx2bS54ODYubW14LnBpbnNyLnciLAorICAibGx2bS54ODYubW14LnBtYWRkLndkIiwKKyAgImxsdm0ueDg2Lm1teC5wbWF4cy53IiwKKyAgImxsdm0ueDg2Lm1teC5wbWF4dS5iIiwKKyAgImxsdm0ueDg2Lm1teC5wbWlucy53IiwKKyAgImxsdm0ueDg2Lm1teC5wbWludS5iIiwKKyAgImxsdm0ueDg2Lm1teC5wbW92bXNrYiIsCisgICJsbHZtLng4Ni5tbXgucG11bGgudyIsCisgICJsbHZtLng4Ni5tbXgucG11bGh1LnciLAorICAibGx2bS54ODYubW14LnBtdWxsLnciLAorICAibGx2bS54ODYubW14LnBtdWx1LmRxIiwKKyAgImxsdm0ueDg2Lm1teC5wb3IiLAorICAibGx2bS54ODYubW14LnBzYWQuYnciLAorICAibGx2bS54ODYubW14LnBzbGwuZCIsCisgICJsbHZtLng4Ni5tbXgucHNsbC5xIiwKKyAgImxsdm0ueDg2Lm1teC5wc2xsLnciLAorICAibGx2bS54ODYubW14LnBzbGxpLmQiLAorICAibGx2bS54ODYubW14LnBzbGxpLnEiLAorICAibGx2bS54ODYubW14LnBzbGxpLnciLAorICAibGx2bS54ODYubW14LnBzcmEuZCIsCisgICJsbHZtLng4Ni5tbXgucHNyYS53IiwKKyAgImxsdm0ueDg2Lm1teC5wc3JhaS5kIiwKKyAgImxsdm0ueDg2Lm1teC5wc3JhaS53IiwKKyAgImxsdm0ueDg2Lm1teC5wc3JsLmQiLAorICAibGx2bS54ODYubW14LnBzcmwucSIsCisgICJsbHZtLng4Ni5tbXgucHNybC53IiwKKyAgImxsdm0ueDg2Lm1teC5wc3JsaS5kIiwKKyAgImxsdm0ueDg2Lm1teC5wc3JsaS5xIiwKKyAgImxsdm0ueDg2Lm1teC5wc3JsaS53IiwKKyAgImxsdm0ueDg2Lm1teC5wc3ViLmIiLAorICAibGx2bS54ODYubW14LnBzdWIuZCIsCisgICJsbHZtLng4Ni5tbXgucHN1Yi5xIiwKKyAgImxsdm0ueDg2Lm1teC5wc3ViLnciLAorICAibGx2bS54ODYubW14LnBzdWJzLmIiLAorICAibGx2bS54ODYubW14LnBzdWJzLnciLAorICAibGx2bS54ODYubW14LnBzdWJ1cy5iIiwKKyAgImxsdm0ueDg2Lm1teC5wc3VidXMudyIsCisgICJsbHZtLng4Ni5tbXgucHVucGNraGJ3IiwKKyAgImxsdm0ueDg2Lm1teC5wdW5wY2toZHEiLAorICAibGx2bS54ODYubW14LnB1bnBja2h3ZCIsCisgICJsbHZtLng4Ni5tbXgucHVucGNrbGJ3IiwKKyAgImxsdm0ueDg2Lm1teC5wdW5wY2tsZHEiLAorICAibGx2bS54ODYubW14LnB1bnBja2x3ZCIsCisgICJsbHZtLng4Ni5tbXgucHhvciIsCisgICJsbHZtLng4Ni5tb25pdG9yeCIsCisgICJsbHZtLng4Ni5td2FpdHgiLAorICAibGx2bS54ODYucGNsbXVscWRxIiwKKyAgImxsdm0ueDg2LnBjbG11bHFkcS4yNTYiLAorICAibGx2bS54ODYucGNsbXVscWRxLjUxMiIsCisgICJsbHZtLng4Ni5yZGZzYmFzZS4zMiIsCisgICJsbHZtLng4Ni5yZGZzYmFzZS42NCIsCisgICJsbHZtLng4Ni5yZGdzYmFzZS4zMiIsCisgICJsbHZtLng4Ni5yZGdzYmFzZS42NCIsCisgICJsbHZtLng4Ni5yZHBpZCIsCisgICJsbHZtLng4Ni5yZHBrcnUiLAorICAibGx2bS54ODYucmRwbWMiLAorICAibGx2bS54ODYucmRyYW5kLjE2IiwKKyAgImxsdm0ueDg2LnJkcmFuZC4zMiIsCisgICJsbHZtLng4Ni5yZHJhbmQuNjQiLAorICAibGx2bS54ODYucmRzZWVkLjE2IiwKKyAgImxsdm0ueDg2LnJkc2VlZC4zMiIsCisgICJsbHZtLng4Ni5yZHNlZWQuNjQiLAorICAibGx2bS54ODYucmRzc3BkIiwKKyAgImxsdm0ueDg2LnJkc3NwcSIsCisgICJsbHZtLng4Ni5yZHRzYyIsCisgICJsbHZtLng4Ni5yZHRzY3AiLAorICAibGx2bS54ODYucnN0b3Jzc3AiLAorICAibGx2bS54ODYuc2F2ZXByZXZzc3AiLAorICAibGx2bS54ODYuc2VoLmVoZ3VhcmQiLAorICAibGx2bS54ODYuc2VoLmVocmVnbm9kZSIsCisgICJsbHZtLng4Ni5zZWgubHNkYSIsCisgICJsbHZtLng4Ni5zZWgucmVjb3ZlcmZwIiwKKyAgImxsdm0ueDg2LnNldHNzYnN5IiwKKyAgImxsdm0ueDg2LnNoYTFtc2cxIiwKKyAgImxsdm0ueDg2LnNoYTFtc2cyIiwKKyAgImxsdm0ueDg2LnNoYTFuZXh0ZSIsCisgICJsbHZtLng4Ni5zaGExcm5kczQiLAorICAibGx2bS54ODYuc2hhMjU2bXNnMSIsCisgICJsbHZtLng4Ni5zaGEyNTZtc2cyIiwKKyAgImxsdm0ueDg2LnNoYTI1NnJuZHMyIiwKKyAgImxsdm0ueDg2LnNsd3BjYiIsCisgICJsbHZtLng4Ni5zc2UuY21wLnBzIiwKKyAgImxsdm0ueDg2LnNzZS5jbXAuc3MiLAorICAibGx2bS54ODYuc3NlLmNvbWllcS5zcyIsCisgICJsbHZtLng4Ni5zc2UuY29taWdlLnNzIiwKKyAgImxsdm0ueDg2LnNzZS5jb21pZ3Quc3MiLAorICAibGx2bS54ODYuc3NlLmNvbWlsZS5zcyIsCisgICJsbHZtLng4Ni5zc2UuY29taWx0LnNzIiwKKyAgImxsdm0ueDg2LnNzZS5jb21pbmVxLnNzIiwKKyAgImxsdm0ueDg2LnNzZS5jdnRwZDJwaSIsCisgICJsbHZtLng4Ni5zc2UuY3Z0cGkycGQiLAorICAibGx2bS54ODYuc3NlLmN2dHBpMnBzIiwKKyAgImxsdm0ueDg2LnNzZS5jdnRwczJwaSIsCisgICJsbHZtLng4Ni5zc2UuY3Z0c2kyc3MiLAorICAibGx2bS54ODYuc3NlLmN2dHNpNjQyc3MiLAorICAibGx2bS54ODYuc3NlLmN2dHNzMnNpIiwKKyAgImxsdm0ueDg2LnNzZS5jdnRzczJzaTY0IiwKKyAgImxsdm0ueDg2LnNzZS5jdnR0cGQycGkiLAorICAibGx2bS54ODYuc3NlLmN2dHRwczJwaSIsCisgICJsbHZtLng4Ni5zc2UuY3Z0dHNzMnNpIiwKKyAgImxsdm0ueDg2LnNzZS5jdnR0c3Myc2k2NCIsCisgICJsbHZtLng4Ni5zc2UubGRteGNzciIsCisgICJsbHZtLng4Ni5zc2UubWF4LnBzIiwKKyAgImxsdm0ueDg2LnNzZS5tYXguc3MiLAorICAibGx2bS54ODYuc3NlLm1pbi5wcyIsCisgICJsbHZtLng4Ni5zc2UubWluLnNzIiwKKyAgImxsdm0ueDg2LnNzZS5tb3Ztc2sucHMiLAorICAibGx2bS54ODYuc3NlLnBzaHVmLnciLAorICAibGx2bS54ODYuc3NlLnJjcC5wcyIsCisgICJsbHZtLng4Ni5zc2UucmNwLnNzIiwKKyAgImxsdm0ueDg2LnNzZS5yc3FydC5wcyIsCisgICJsbHZtLng4Ni5zc2UucnNxcnQuc3MiLAorICAibGx2bS54ODYuc3NlLnNmZW5jZSIsCisgICJsbHZtLng4Ni5zc2Uuc3FydC5wcyIsCisgICJsbHZtLng4Ni5zc2Uuc3FydC5zcyIsCisgICJsbHZtLng4Ni5zc2Uuc3RteGNzciIsCisgICJsbHZtLng4Ni5zc2UudWNvbWllcS5zcyIsCisgICJsbHZtLng4Ni5zc2UudWNvbWlnZS5zcyIsCisgICJsbHZtLng4Ni5zc2UudWNvbWlndC5zcyIsCisgICJsbHZtLng4Ni5zc2UudWNvbWlsZS5zcyIsCisgICJsbHZtLng4Ni5zc2UudWNvbWlsdC5zcyIsCisgICJsbHZtLng4Ni5zc2UudWNvbWluZXEuc3MiLAorICAibGx2bS54ODYuc3NlMi5jbGZsdXNoIiwKKyAgImxsdm0ueDg2LnNzZTIuY21wLnBkIiwKKyAgImxsdm0ueDg2LnNzZTIuY21wLnNkIiwKKyAgImxsdm0ueDg2LnNzZTIuY29taWVxLnNkIiwKKyAgImxsdm0ueDg2LnNzZTIuY29taWdlLnNkIiwKKyAgImxsdm0ueDg2LnNzZTIuY29taWd0LnNkIiwKKyAgImxsdm0ueDg2LnNzZTIuY29taWxlLnNkIiwKKyAgImxsdm0ueDg2LnNzZTIuY29taWx0LnNkIiwKKyAgImxsdm0ueDg2LnNzZTIuY29taW5lcS5zZCIsCisgICJsbHZtLng4Ni5zc2UyLmN2dGRxMnBzIiwKKyAgImxsdm0ueDg2LnNzZTIuY3Z0cGQyZHEiLAorICAibGx2bS54ODYuc3NlMi5jdnRwZDJwcyIsCisgICJsbHZtLng4Ni5zc2UyLmN2dHBzMmRxIiwKKyAgImxsdm0ueDg2LnNzZTIuY3Z0c2Qyc2kiLAorICAibGx2bS54ODYuc3NlMi5jdnRzZDJzaTY0IiwKKyAgImxsdm0ueDg2LnNzZTIuY3Z0c2Qyc3MiLAorICAibGx2bS54ODYuc3NlMi5jdnRzaTJzZCIsCisgICJsbHZtLng4Ni5zc2UyLmN2dHNpNjQyc2QiLAorICAibGx2bS54ODYuc3NlMi5jdnRzczJzZCIsCisgICJsbHZtLng4Ni5zc2UyLmN2dHRwZDJkcSIsCisgICJsbHZtLng4Ni5zc2UyLmN2dHRwczJkcSIsCisgICJsbHZtLng4Ni5zc2UyLmN2dHRzZDJzaSIsCisgICJsbHZtLng4Ni5zc2UyLmN2dHRzZDJzaTY0IiwKKyAgImxsdm0ueDg2LnNzZTIubGZlbmNlIiwKKyAgImxsdm0ueDg2LnNzZTIubWFza21vdi5kcXUiLAorICAibGx2bS54ODYuc3NlMi5tYXgucGQiLAorICAibGx2bS54ODYuc3NlMi5tYXguc2QiLAorICAibGx2bS54ODYuc3NlMi5tZmVuY2UiLAorICAibGx2bS54ODYuc3NlMi5taW4ucGQiLAorICAibGx2bS54ODYuc3NlMi5taW4uc2QiLAorICAibGx2bS54ODYuc3NlMi5tb3Ztc2sucGQiLAorICAibGx2bS54ODYuc3NlMi5wYWNrc3Nkdy4xMjgiLAorICAibGx2bS54ODYuc3NlMi5wYWNrc3N3Yi4xMjgiLAorICAibGx2bS54ODYuc3NlMi5wYWNrdXN3Yi4xMjgiLAorICAibGx2bS54ODYuc3NlMi5wYWRkcy5iIiwKKyAgImxsdm0ueDg2LnNzZTIucGFkZHMudyIsCisgICJsbHZtLng4Ni5zc2UyLnBhZGR1cy5iIiwKKyAgImxsdm0ueDg2LnNzZTIucGFkZHVzLnciLAorICAibGx2bS54ODYuc3NlMi5wYXVzZSIsCisgICJsbHZtLng4Ni5zc2UyLnBtYWRkLndkIiwKKyAgImxsdm0ueDg2LnNzZTIucG1vdm1za2IuMTI4IiwKKyAgImxsdm0ueDg2LnNzZTIucG11bGgudyIsCisgICJsbHZtLng4Ni5zc2UyLnBtdWxodS53IiwKKyAgImxsdm0ueDg2LnNzZTIucG11bHUuZHEiLAorICAibGx2bS54ODYuc3NlMi5wc2FkLmJ3IiwKKyAgImxsdm0ueDg2LnNzZTIucHNsbC5kIiwKKyAgImxsdm0ueDg2LnNzZTIucHNsbC5xIiwKKyAgImxsdm0ueDg2LnNzZTIucHNsbC53IiwKKyAgImxsdm0ueDg2LnNzZTIucHNsbGkuZCIsCisgICJsbHZtLng4Ni5zc2UyLnBzbGxpLnEiLAorICAibGx2bS54ODYuc3NlMi5wc2xsaS53IiwKKyAgImxsdm0ueDg2LnNzZTIucHNyYS5kIiwKKyAgImxsdm0ueDg2LnNzZTIucHNyYS53IiwKKyAgImxsdm0ueDg2LnNzZTIucHNyYWkuZCIsCisgICJsbHZtLng4Ni5zc2UyLnBzcmFpLnciLAorICAibGx2bS54ODYuc3NlMi5wc3JsLmQiLAorICAibGx2bS54ODYuc3NlMi5wc3JsLnEiLAorICAibGx2bS54ODYuc3NlMi5wc3JsLnciLAorICAibGx2bS54ODYuc3NlMi5wc3JsaS5kIiwKKyAgImxsdm0ueDg2LnNzZTIucHNybGkucSIsCisgICJsbHZtLng4Ni5zc2UyLnBzcmxpLnciLAorICAibGx2bS54ODYuc3NlMi5wc3Vicy5iIiwKKyAgImxsdm0ueDg2LnNzZTIucHN1YnMudyIsCisgICJsbHZtLng4Ni5zc2UyLnBzdWJ1cy5iIiwKKyAgImxsdm0ueDg2LnNzZTIucHN1YnVzLnciLAorICAibGx2bS54ODYuc3NlMi5zcXJ0LnBkIiwKKyAgImxsdm0ueDg2LnNzZTIuc3FydC5zZCIsCisgICJsbHZtLng4Ni5zc2UyLnVjb21pZXEuc2QiLAorICAibGx2bS54ODYuc3NlMi51Y29taWdlLnNkIiwKKyAgImxsdm0ueDg2LnNzZTIudWNvbWlndC5zZCIsCisgICJsbHZtLng4Ni5zc2UyLnVjb21pbGUuc2QiLAorICAibGx2bS54ODYuc3NlMi51Y29taWx0LnNkIiwKKyAgImxsdm0ueDg2LnNzZTIudWNvbWluZXEuc2QiLAorICAibGx2bS54ODYuc3NlMy5hZGRzdWIucGQiLAorICAibGx2bS54ODYuc3NlMy5hZGRzdWIucHMiLAorICAibGx2bS54ODYuc3NlMy5oYWRkLnBkIiwKKyAgImxsdm0ueDg2LnNzZTMuaGFkZC5wcyIsCisgICJsbHZtLng4Ni5zc2UzLmhzdWIucGQiLAorICAibGx2bS54ODYuc3NlMy5oc3ViLnBzIiwKKyAgImxsdm0ueDg2LnNzZTMubGR1LmRxIiwKKyAgImxsdm0ueDg2LnNzZTMubW9uaXRvciIsCisgICJsbHZtLng4Ni5zc2UzLm13YWl0IiwKKyAgImxsdm0ueDg2LnNzZTQxLmJsZW5kdnBkIiwKKyAgImxsdm0ueDg2LnNzZTQxLmJsZW5kdnBzIiwKKyAgImxsdm0ueDg2LnNzZTQxLmRwcGQiLAorICAibGx2bS54ODYuc3NlNDEuZHBwcyIsCisgICJsbHZtLng4Ni5zc2U0MS5pbnNlcnRwcyIsCisgICJsbHZtLng4Ni5zc2U0MS5tcHNhZGJ3IiwKKyAgImxsdm0ueDg2LnNzZTQxLnBhY2t1c2R3IiwKKyAgImxsdm0ueDg2LnNzZTQxLnBibGVuZHZiIiwKKyAgImxsdm0ueDg2LnNzZTQxLnBobWlucG9zdXciLAorICAibGx2bS54ODYuc3NlNDEucG11bGRxIiwKKyAgImxsdm0ueDg2LnNzZTQxLnB0ZXN0YyIsCisgICJsbHZtLng4Ni5zc2U0MS5wdGVzdG56YyIsCisgICJsbHZtLng4Ni5zc2U0MS5wdGVzdHoiLAorICAibGx2bS54ODYuc3NlNDEucm91bmQucGQiLAorICAibGx2bS54ODYuc3NlNDEucm91bmQucHMiLAorICAibGx2bS54ODYuc3NlNDEucm91bmQuc2QiLAorICAibGx2bS54ODYuc3NlNDEucm91bmQuc3MiLAorICAibGx2bS54ODYuc3NlNDIuY3JjMzIuMzIuMTYiLAorICAibGx2bS54ODYuc3NlNDIuY3JjMzIuMzIuMzIiLAorICAibGx2bS54ODYuc3NlNDIuY3JjMzIuMzIuOCIsCisgICJsbHZtLng4Ni5zc2U0Mi5jcmMzMi42NC42NCIsCisgICJsbHZtLng4Ni5zc2U0Mi5wY21wZXN0cmkxMjgiLAorICAibGx2bS54ODYuc3NlNDIucGNtcGVzdHJpYTEyOCIsCisgICJsbHZtLng4Ni5zc2U0Mi5wY21wZXN0cmljMTI4IiwKKyAgImxsdm0ueDg2LnNzZTQyLnBjbXBlc3RyaW8xMjgiLAorICAibGx2bS54ODYuc3NlNDIucGNtcGVzdHJpczEyOCIsCisgICJsbHZtLng4Ni5zc2U0Mi5wY21wZXN0cml6MTI4IiwKKyAgImxsdm0ueDg2LnNzZTQyLnBjbXBlc3RybTEyOCIsCisgICJsbHZtLng4Ni5zc2U0Mi5wY21waXN0cmkxMjgiLAorICAibGx2bS54ODYuc3NlNDIucGNtcGlzdHJpYTEyOCIsCisgICJsbHZtLng4Ni5zc2U0Mi5wY21waXN0cmljMTI4IiwKKyAgImxsdm0ueDg2LnNzZTQyLnBjbXBpc3RyaW8xMjgiLAorICAibGx2bS54ODYuc3NlNDIucGNtcGlzdHJpczEyOCIsCisgICJsbHZtLng4Ni5zc2U0Mi5wY21waXN0cml6MTI4IiwKKyAgImxsdm0ueDg2LnNzZTQyLnBjbXBpc3RybTEyOCIsCisgICJsbHZtLng4Ni5zc2U0YS5leHRycSIsCisgICJsbHZtLng4Ni5zc2U0YS5leHRycWkiLAorICAibGx2bS54ODYuc3NlNGEuaW5zZXJ0cSIsCisgICJsbHZtLng4Ni5zc2U0YS5pbnNlcnRxaSIsCisgICJsbHZtLng4Ni5zc3NlMy5wYWJzLmIiLAorICAibGx2bS54ODYuc3NzZTMucGFicy5kIiwKKyAgImxsdm0ueDg2LnNzc2UzLnBhYnMudyIsCisgICJsbHZtLng4Ni5zc3NlMy5waGFkZC5kIiwKKyAgImxsdm0ueDg2LnNzc2UzLnBoYWRkLmQuMTI4IiwKKyAgImxsdm0ueDg2LnNzc2UzLnBoYWRkLnN3IiwKKyAgImxsdm0ueDg2LnNzc2UzLnBoYWRkLnN3LjEyOCIsCisgICJsbHZtLng4Ni5zc3NlMy5waGFkZC53IiwKKyAgImxsdm0ueDg2LnNzc2UzLnBoYWRkLncuMTI4IiwKKyAgImxsdm0ueDg2LnNzc2UzLnBoc3ViLmQiLAorICAibGx2bS54ODYuc3NzZTMucGhzdWIuZC4xMjgiLAorICAibGx2bS54ODYuc3NzZTMucGhzdWIuc3ciLAorICAibGx2bS54ODYuc3NzZTMucGhzdWIuc3cuMTI4IiwKKyAgImxsdm0ueDg2LnNzc2UzLnBoc3ViLnciLAorICAibGx2bS54ODYuc3NzZTMucGhzdWIudy4xMjgiLAorICAibGx2bS54ODYuc3NzZTMucG1hZGQudWIuc3ciLAorICAibGx2bS54ODYuc3NzZTMucG1hZGQudWIuc3cuMTI4IiwKKyAgImxsdm0ueDg2LnNzc2UzLnBtdWwuaHIuc3ciLAorICAibGx2bS54ODYuc3NzZTMucG11bC5oci5zdy4xMjgiLAorICAibGx2bS54ODYuc3NzZTMucHNodWYuYiIsCisgICJsbHZtLng4Ni5zc3NlMy5wc2h1Zi5iLjEyOCIsCisgICJsbHZtLng4Ni5zc3NlMy5wc2lnbi5iIiwKKyAgImxsdm0ueDg2LnNzc2UzLnBzaWduLmIuMTI4IiwKKyAgImxsdm0ueDg2LnNzc2UzLnBzaWduLmQiLAorICAibGx2bS54ODYuc3NzZTMucHNpZ24uZC4xMjgiLAorICAibGx2bS54ODYuc3NzZTMucHNpZ24udyIsCisgICJsbHZtLng4Ni5zc3NlMy5wc2lnbi53LjEyOCIsCisgICJsbHZtLng4Ni5zdWJib3Jyb3cudTMyIiwKKyAgImxsdm0ueDg2LnN1YmJvcnJvdy51NjQiLAorICAibGx2bS54ODYudGJtLmJleHRyaS51MzIiLAorICAibGx2bS54ODYudGJtLmJleHRyaS51NjQiLAorICAibGx2bS54ODYudmN2dHBoMnBzLjEyOCIsCisgICJsbHZtLng4Ni52Y3Z0cGgycHMuMjU2IiwKKyAgImxsdm0ueDg2LnZjdnRwczJwaC4xMjgiLAorICAibGx2bS54ODYudmN2dHBzMnBoLjI1NiIsCisgICJsbHZtLng4Ni52Z2YycDhhZmZpbmVpbnZxYi4xMjgiLAorICAibGx2bS54ODYudmdmMnA4YWZmaW5laW52cWIuMjU2IiwKKyAgImxsdm0ueDg2LnZnZjJwOGFmZmluZWludnFiLjUxMiIsCisgICJsbHZtLng4Ni52Z2YycDhhZmZpbmVxYi4xMjgiLAorICAibGx2bS54ODYudmdmMnA4YWZmaW5lcWIuMjU2IiwKKyAgImxsdm0ueDg2LnZnZjJwOGFmZmluZXFiLjUxMiIsCisgICJsbHZtLng4Ni52Z2YycDhtdWxiLjEyOCIsCisgICJsbHZtLng4Ni52Z2YycDhtdWxiLjI1NiIsCisgICJsbHZtLng4Ni52Z2YycDhtdWxiLjUxMiIsCisgICJsbHZtLng4Ni53cmZzYmFzZS4zMiIsCisgICJsbHZtLng4Ni53cmZzYmFzZS42NCIsCisgICJsbHZtLng4Ni53cmdzYmFzZS4zMiIsCisgICJsbHZtLng4Ni53cmdzYmFzZS42NCIsCisgICJsbHZtLng4Ni53cnBrcnUiLAorICAibGx2bS54ODYud3Jzc2QiLAorICAibGx2bS54ODYud3Jzc3EiLAorICAibGx2bS54ODYud3J1c3NkIiwKKyAgImxsdm0ueDg2LndydXNzcSIsCisgICJsbHZtLng4Ni54YWJvcnQiLAorICAibGx2bS54ODYueGJlZ2luIiwKKyAgImxsdm0ueDg2LnhlbmQiLAorICAibGx2bS54ODYueGdldGJ2IiwKKyAgImxsdm0ueDg2LnhvcC52ZnJjei5wZCIsCisgICJsbHZtLng4Ni54b3AudmZyY3oucGQuMjU2IiwKKyAgImxsdm0ueDg2LnhvcC52ZnJjei5wcyIsCisgICJsbHZtLng4Ni54b3AudmZyY3oucHMuMjU2IiwKKyAgImxsdm0ueDg2LnhvcC52ZnJjei5zZCIsCisgICJsbHZtLng4Ni54b3AudmZyY3ouc3MiLAorICAibGx2bS54ODYueG9wLnZwY29tYiIsCisgICJsbHZtLng4Ni54b3AudnBjb21kIiwKKyAgImxsdm0ueDg2LnhvcC52cGNvbXEiLAorICAibGx2bS54ODYueG9wLnZwY29tdWIiLAorICAibGx2bS54ODYueG9wLnZwY29tdWQiLAorICAibGx2bS54ODYueG9wLnZwY29tdXEiLAorICAibGx2bS54ODYueG9wLnZwY29tdXciLAorICAibGx2bS54ODYueG9wLnZwY29tdyIsCisgICJsbHZtLng4Ni54b3AudnBlcm1pbDJwZCIsCisgICJsbHZtLng4Ni54b3AudnBlcm1pbDJwZC4yNTYiLAorICAibGx2bS54ODYueG9wLnZwZXJtaWwycHMiLAorICAibGx2bS54ODYueG9wLnZwZXJtaWwycHMuMjU2IiwKKyAgImxsdm0ueDg2LnhvcC52cGhhZGRiZCIsCisgICJsbHZtLng4Ni54b3AudnBoYWRkYnEiLAorICAibGx2bS54ODYueG9wLnZwaGFkZGJ3IiwKKyAgImxsdm0ueDg2LnhvcC52cGhhZGRkcSIsCisgICJsbHZtLng4Ni54b3AudnBoYWRkdWJkIiwKKyAgImxsdm0ueDg2LnhvcC52cGhhZGR1YnEiLAorICAibGx2bS54ODYueG9wLnZwaGFkZHVidyIsCisgICJsbHZtLng4Ni54b3AudnBoYWRkdWRxIiwKKyAgImxsdm0ueDg2LnhvcC52cGhhZGR1d2QiLAorICAibGx2bS54ODYueG9wLnZwaGFkZHV3cSIsCisgICJsbHZtLng4Ni54b3AudnBoYWRkd2QiLAorICAibGx2bS54ODYueG9wLnZwaGFkZHdxIiwKKyAgImxsdm0ueDg2LnhvcC52cGhzdWJidyIsCisgICJsbHZtLng4Ni54b3AudnBoc3ViZHEiLAorICAibGx2bS54ODYueG9wLnZwaHN1YndkIiwKKyAgImxsdm0ueDg2LnhvcC52cG1hY3NkZCIsCisgICJsbHZtLng4Ni54b3AudnBtYWNzZHFoIiwKKyAgImxsdm0ueDg2LnhvcC52cG1hY3NkcWwiLAorICAibGx2bS54ODYueG9wLnZwbWFjc3NkZCIsCisgICJsbHZtLng4Ni54b3AudnBtYWNzc2RxaCIsCisgICJsbHZtLng4Ni54b3AudnBtYWNzc2RxbCIsCisgICJsbHZtLng4Ni54b3AudnBtYWNzc3dkIiwKKyAgImxsdm0ueDg2LnhvcC52cG1hY3Nzd3ciLAorICAibGx2bS54ODYueG9wLnZwbWFjc3dkIiwKKyAgImxsdm0ueDg2LnhvcC52cG1hY3N3dyIsCisgICJsbHZtLng4Ni54b3AudnBtYWRjc3N3ZCIsCisgICJsbHZtLng4Ni54b3AudnBtYWRjc3dkIiwKKyAgImxsdm0ueDg2LnhvcC52cHBlcm0iLAorICAibGx2bS54ODYueG9wLnZwcm90YiIsCisgICJsbHZtLng4Ni54b3AudnByb3RiaSIsCisgICJsbHZtLng4Ni54b3AudnByb3RkIiwKKyAgImxsdm0ueDg2LnhvcC52cHJvdGRpIiwKKyAgImxsdm0ueDg2LnhvcC52cHJvdHEiLAorICAibGx2bS54ODYueG9wLnZwcm90cWkiLAorICAibGx2bS54ODYueG9wLnZwcm90dyIsCisgICJsbHZtLng4Ni54b3AudnByb3R3aSIsCisgICJsbHZtLng4Ni54b3AudnBzaGFiIiwKKyAgImxsdm0ueDg2LnhvcC52cHNoYWQiLAorICAibGx2bS54ODYueG9wLnZwc2hhcSIsCisgICJsbHZtLng4Ni54b3AudnBzaGF3IiwKKyAgImxsdm0ueDg2LnhvcC52cHNobGIiLAorICAibGx2bS54ODYueG9wLnZwc2hsZCIsCisgICJsbHZtLng4Ni54b3AudnBzaGxxIiwKKyAgImxsdm0ueDg2LnhvcC52cHNobHciLAorICAibGx2bS54ODYueHJzdG9yIiwKKyAgImxsdm0ueDg2Lnhyc3RvcjY0IiwKKyAgImxsdm0ueDg2Lnhyc3RvcnMiLAorICAibGx2bS54ODYueHJzdG9yczY0IiwKKyAgImxsdm0ueDg2LnhzYXZlIiwKKyAgImxsdm0ueDg2LnhzYXZlNjQiLAorICAibGx2bS54ODYueHNhdmVjIiwKKyAgImxsdm0ueDg2LnhzYXZlYzY0IiwKKyAgImxsdm0ueDg2LnhzYXZlb3B0IiwKKyAgImxsdm0ueDg2LnhzYXZlb3B0NjQiLAorICAibGx2bS54ODYueHNhdmVzIiwKKyAgImxsdm0ueDg2LnhzYXZlczY0IiwKKyAgImxsdm0ueDg2LnhzZXRidiIsCisgICJsbHZtLng4Ni54dGVzdCIsCisgICJsbHZtLnhjb3JlLmJpdHJldiIsCisgICJsbHZtLnhjb3JlLmNoZWNrZXZlbnQiLAorICAibGx2bS54Y29yZS5jaGtjdCIsCisgICJsbHZtLnhjb3JlLmNscmUiLAorICAibGx2bS54Y29yZS5jbHJwdCIsCisgICJsbHZtLnhjb3JlLmNscnNyIiwKKyAgImxsdm0ueGNvcmUuY3JjMzIiLAorICAibGx2bS54Y29yZS5jcmM4IiwKKyAgImxsdm0ueGNvcmUuZWR1IiwKKyAgImxsdm0ueGNvcmUuZWV1IiwKKyAgImxsdm0ueGNvcmUuZW5kaW4iLAorICAibGx2bS54Y29yZS5mcmVlciIsCisgICJsbHZtLnhjb3JlLmdldGVkIiwKKyAgImxsdm0ueGNvcmUuZ2V0ZXQiLAorICAibGx2bS54Y29yZS5nZXRpZCIsCisgICJsbHZtLnhjb3JlLmdldHBzIiwKKyAgImxsdm0ueGNvcmUuZ2V0ciIsCisgICJsbHZtLnhjb3JlLmdldHN0IiwKKyAgImxsdm0ueGNvcmUuZ2V0dHMiLAorICAibGx2bS54Y29yZS5pbiIsCisgICJsbHZtLnhjb3JlLmluY3QiLAorICAibGx2bS54Y29yZS5pbml0Y3AiLAorICAibGx2bS54Y29yZS5pbml0ZHAiLAorICAibGx2bS54Y29yZS5pbml0bHIiLAorICAibGx2bS54Y29yZS5pbml0cGMiLAorICAibGx2bS54Y29yZS5pbml0c3AiLAorICAibGx2bS54Y29yZS5pbnNociIsCisgICJsbHZtLnhjb3JlLmludCIsCisgICJsbHZtLnhjb3JlLm1qb2luIiwKKyAgImxsdm0ueGNvcmUubXN5bmMiLAorICAibGx2bS54Y29yZS5vdXQiLAorICAibGx2bS54Y29yZS5vdXRjdCIsCisgICJsbHZtLnhjb3JlLm91dHNociIsCisgICJsbHZtLnhjb3JlLm91dHQiLAorICAibGx2bS54Y29yZS5wZWVrIiwKKyAgImxsdm0ueGNvcmUuc2V0YyIsCisgICJsbHZtLnhjb3JlLnNldGNsayIsCisgICJsbHZtLnhjb3JlLnNldGQiLAorICAibGx2bS54Y29yZS5zZXRldiIsCisgICJsbHZtLnhjb3JlLnNldHBzIiwKKyAgImxsdm0ueGNvcmUuc2V0cHNjIiwKKyAgImxsdm0ueGNvcmUuc2V0cHQiLAorICAibGx2bS54Y29yZS5zZXRyZHkiLAorICAibGx2bS54Y29yZS5zZXRzciIsCisgICJsbHZtLnhjb3JlLnNldHR3IiwKKyAgImxsdm0ueGNvcmUuc2V0diIsCisgICJsbHZtLnhjb3JlLnNleHQiLAorICAibGx2bS54Y29yZS5zc3luYyIsCisgICJsbHZtLnhjb3JlLnN5bmNyIiwKKyAgImxsdm0ueGNvcmUudGVzdGN0IiwKKyAgImxsdm0ueGNvcmUudGVzdHdjdCIsCisgICJsbHZtLnhjb3JlLndhaXRldmVudCIsCisgICJsbHZtLnhjb3JlLnpleHQiLAorI2VuZGlmCisKKy8vIEludHJpbnNpYyBJRCB0byBvdmVybG9hZCBiaXRzZXQKKyNpZmRlZiBHRVRfSU5UUklOU0lDX09WRVJMT0FEX1RBQkxFCitzdGF0aWMgY29uc3QgdWludDhfdCBPVGFibGVbXSA9IHsKKyAgMCB8ICgxPDwzKSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSwKKyAgMCwKKyAgMCB8ICgxPDwyKSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSwKKyAgMCB8ICgxPDwwKSwKKyAgMCB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDw2KSwKKyAgMCB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw1KSB8ICgxPDw2KSwKKyAgMCB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSwKKyAgMCB8ICgxPDwzKSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDw1KSwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCB8ICgxPDwzKSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCwKKyAgMCB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwzKSB8ICgxPDw0KSwKKyAgMCwKKyAgMCB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSwKKyAgMCB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwxKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSwKKyAgMCB8ICgxPDw2KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDw0KSwKKyAgMCB8ICgxPDwzKSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSwKKyAgMCwKKyAgMCB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw1KSwKKyAgMCB8ICgxPDw1KSwKKyAgMCB8ICgxPDwwKSwKKyAgMCwKKyAgMCB8ICgxPDwwKSB8ICgxPDw2KSwKKyAgMCwKKyAgMCwKKyAgMCB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCB8ICgxPDwwKSB8ICgxPDwyKSwKKyAgMCwKKyAgMCwKKyAgMCB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSwKKyAgMCwKKyAgMCB8ICgxPDwzKSB8ICgxPDw0KSwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSwKKyAgMCwKKyAgMCwKKyAgMCB8ICgxPDwyKSwKKyAgMCwKKyAgMCB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCB8ICgxPDw2KSwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCB8ICgxPDw0KSB8ICgxPDw1KSwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCB8ICgxPDw3KSwKKyAgMCwKKyAgMCwKKyAgMCB8ICgxPDwyKSwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSwKKyAgMCB8ICgxPDw0KSwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCB8ICgxPDw2KSwKKyAgMCB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCwKKyAgMCB8ICgxPDwyKSB8ICgxPDw0KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSB8ICgxPDw3KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDwzKSB8ICgxPDw0KSB8ICgxPDw1KSB8ICgxPDw2KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKSB8ICgxPDw0KSB8ICgxPDw1KSwKKyAgMCB8ICgxPDwwKSB8ICgxPDwxKSB8ICgxPDwyKQorfTsKKworcmV0dXJuIChPVGFibGVbaWQvOF0gJiAoMSA8PCAoaWQlOCkpKSAhPSAwOworI2VuZGlmCisKKy8vIEdsb2JhbCBpbnRyaW5zaWMgZnVuY3Rpb24gZGVjbGFyYXRpb24gdHlwZSB0YWJsZS4KKyNpZmRlZiBHRVRfSU5UUklOU0lDX0dFTkVSQVRPUl9HTE9CQUwKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBJSVRfVGFibGVbXSA9IHsKKyAgMHgyZSwgMHgyZTJlLCAoMVU8PDMxKSB8IDE3OTAsIDB4MTAsIDB4MWYxZiwgMHgxZjFmLCAweDJmMmYsIAorICAweDJmMmYsIDB4MmUyZTAsICgxVTw8MzEpIHwgNDE3MCwgMHgzMmYsIDB4MmYzLCAweDJmMmYyZiwgKDFVPDwzMSkgfCA0MTYzLCAoMVU8PDMxKSB8IDEwNzAsIAorICAweDJlMCwgMHgyZTEsIDB4MTJlMSwgMHgyZSwgKDFVPDwzMSkgfCAxMDcwLCAoMVU8PDMxKSB8IDk4MSwgMHgyZTJlMSwgMHgxNDJlMmUsIAorICAweDJlMCwgKDFVPDwzMSkgfCAxMDcyLCAweDFmLCAweDIyZTJlLCAoMVU8PDMxKSB8IDE5NSwgMHgyZjJmLCAweDExZjFmLCAweDFmMWYsIAorICAweDExZjFmLCAoMVU8PDMxKSB8IDQyMTcsICgxVTw8MzEpIHwgNDIxNywgKDFVPDwzMSkgfCA0MjE3LCAweDAsIDB4MCwgMHg0MmUsICgxVTw8MzEpIHwgNDE2NywgCisgICgxVTw8MzEpIHwgNDE2NiwgMHgyZTQwLCAweDJlNTAsIDB4NDAsIDB4MmUwLCAweDJlMCwgMHgyZSwgMHgyZTQsIAorICAweDAsIDB4MmU0LCAweDAsIDB4MmYyZiwgMHgyZjJmLCAweDFmMWYxZiwgKDFVPDwzMSkgfCA0MjAyLCAoMVU8PDMxKSB8IDQyMDIsIAorICAoMVU8PDMxKSB8IDQyMDIsICgxVTw8MzEpIHwgNDIwMCwgKDFVPDwzMSkgfCA0MjAwLCAoMVU8PDMxKSB8IDQxOTgsICgxVTw8MzEpIHwgNDIwMCwgKDFVPDwzMSkgfCA0MjAwLCAoMVU8PDMxKSB8IDQyMDAsICgxVTw8MzEpIHwgNDIwMiwgCisgICgxVTw8MzEpIHwgNDIwMiwgKDFVPDwzMSkgfCA0MjAyLCAoMVU8PDMxKSB8IDQyMDIsICgxVTw8MzEpIHwgNDIwMCwgKDFVPDwzMSkgfCA0MjA5LCAoMVU8PDMxKSB8IDQyMDIsICgxVTw8MzEpIHwgNDIwMiwgKDFVPDwzMSkgfCA0MjAyLCAKKyAgKDFVPDwzMSkgfCA0MjIyLCAoMVU8PDMxKSB8IDI0ODEsICgxVTw8MzEpIHwgNDE1OSwgKDFVPDwzMSkgfCA0MjQ2LCAoMVU8PDMxKSB8IDQyMjYsICgxVTw8MzEpIHwgNDIzOCwgKDFVPDwzMSkgfCA0MjMwLCAoMVU8PDMxKSB8IDQyNTUsIAorICAweGJmMWYsIDB4YmYxZiwgKDFVPDwzMSkgfCA0MTkxLCAweGJmMmYsIDB4YmYyZiwgKDFVPDwzMSkgfCA0MTkxLCAweGJmMWYsIDB4YmYxZiwgCisgIDB4YmYxZiwgMHhiZjFmLCAweGJmMWYsIDB4YmYxZiwgMHhiZjFmLCAweDJmMmYsIDB4MmYyZiwgMHg0LCAKKyAgMHgyZjJmMmYyZiwgMHgyZjJmMmYyZiwgMHg0MmUsIDB4MmVlMmUyZSwgMHgyZTJlZTAsIDB4MmVlMmUyZTAsIDB4MWYsICgxVTw8MzEpIHwgNDIyMywgCisgIDB4MmUyZTJlMCwgMHg0NDUyZTAsIDB4NTQ0NTJlMCwgMHg0NDU1MmUwLCAoMVU8PDMxKSB8IDMwNDcsIDB4NGY0ZiwgKDFVPDwzMSkgfCAzMDQ4LCAweDRmNTAsIAorICAweDRmNTAsIDB4MWYyZTJlLCAweDJlLCAoMVU8PDMxKSB8IDQyMjMsIDB4NDJlMmUyZSwgMHgyZjJmLCAweDJmMmYsIDB4MmYyZiwgCisgIDB4NDJlMCwgKDFVPDwzMSkgfCAxMDcsICgxVTw8MzEpIHwgMTI1MSwgKDFVPDwzMSkgfCAxMjYxLCAoMVU8PDMxKSB8IDEyNzMsICgxVTw8MzEpIHwgMTE2LCAoMVU8PDMxKSB8IDEyNywgMHgyZjJmMmYsIAorICAoMVU8PDMxKSB8IDE4NiwgKDFVPDwzMSkgfCAzMTM3LCAoMVU8PDMxKSB8IDE4NiwgKDFVPDwzMSkgfCAzMTM3LCAweDE5ZjI0ZjAsIDB4NDlmMjRmMCwgMHgyZjJmMmYsIDB4MmYyZiwgCisgIDB4MTFjZjFmLCAweDQwLCAweDJmMmYyZiwgMHg0MmYyZiwgMHg0NDQyZTAsICgxVTw8MzEpIHwgMTgwMCwgKDFVPDwzMSkgfCA0MTczLCAweDUsIAorICAweDQyZSwgMHgyZjJmLCAweDJmMmYsICgxVTw8MzEpIHwgMTcyLCAweDJlNCwgMHgwLCAweDQyZTAsIDB4NDJlNCwgCisgIDB4MmYyZiwgKDFVPDwzMSkgfCAxNzIsIDB4MmYyZiwgMHhmMGYsICgxVTw8MzEpIHwgMTcyLCAweDJlLCAweDJlZTJlMCwgMHgyZTAsIAorICAweDJlLCAweDJlLCAweDAsIDB4MmYyZiwgKDFVPDwzMSkgfCA0MTgyLCAoMVU8PDMxKSB8IDQxNzcsICgxVTw8MzEpIHwgMTcyLCAoMVU8PDMxKSB8IDE3MiwgCisgICgxVTw8MzEpIHwgMTcyLCAweDJlMmUwLCAweDJlMCwgMHgyZTAsIDB4NDJlMmUyZTAsICgxVTw8MzEpIHwgMTgxLCAweDQyZTAsIDB4MCwgCisgIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDU0NCwgMHg0NDQsIDB4NDQ0LCAweDU0NCwgCisgIDB4MmMyYzJjLCAweDJjMmMyYywgMHgyYzJjLCAweDJjMmMsIDB4NGE0NGE0YSwgMHg0NCwgMHg0YTQ0YTRhLCAweDRhNDRhNGEsIAorICAweDRhNGE0YTRhLCAweDRhNGE0YSwgMHg0YTRhNGE0YSwgMHg0YTRhNGE0YSwgMHg0YTRhNGEsIDB4NGE0YTRhNGEsIDB4NDAsIDB4NDAsIAorICAweDQwLCAweDQwLCAoMVU8PDMxKSB8IDEwNTgsIDB4NGY1LCAoMVU8PDMxKSB8IDEwNTgsIDB4NGY1LCAweGYwZiwgKDFVPDwzMSkgfCAxMzI4LCAKKyAgMHgzZjNmM2YsIDB4M2YzZiwgMHgzZjNmM2YsIDB4YWZhZjFmLCAweGFmYWYxZiwgMHhiZjJmLCAweGFmMWYsIDB4YWYxZiwgCisgIDB4YWYxZiwgMHhhZjFmLCAweGFmMWYsIDB4YWYxZiwgMHhhZjFmLCAweGFmMWYsIDB4YmYzZiwgMHhhZjFmLCAKKyAgMHhhZjFmLCAweDJmMmYyZiwgMHgyZjJmMmYsIDB4M2YzZjNmLCAweGJmMmYsIDB4M2YzZjNmLCAweGJmMmYsIDB4MmYyZjJmLCAKKyAgMHgyZjJmMmYsIDB4M2YzZjNmLCAweGJmMmYsIDB4M2YzZjNmLCAweGJmMmYsIDB4MmYyZjJmLCAweDJmMmYsIDB4MmYyZjJmLCAKKyAgMHgyZjJmLCAweDJmMmYsIDB4MmYyZiwgMHgyZjJmMmYsICgxVTw8MzEpIHwgNDA0NSwgKDFVPDwzMSkgfCA0MDM1LCAoMVU8PDMxKSB8IDQwMjMsICgxVTw8MzEpIHwgNDA0NSwgCisgICgxVTw8MzEpIHwgNDEyNCwgKDFVPDwzMSkgfCA0MDQ1LCAoMVU8PDMxKSB8IDQwMzUsICgxVTw8MzEpIHwgNDEwNywgKDFVPDwzMSkgfCA0MDM1LCAoMVU8PDMxKSB8IDQwMjMsICgxVTw8MzEpIHwgNDA4NiwgKDFVPDwzMSkgfCA0MDIzLCAKKyAgMHgzZjNmM2YsICgxVTw8MzEpIHwgMTM0MCwgMHg1NTJjLCAoMVU8PDMxKSB8IDEzMjgsIDB4M2YzZiwgKDFVPDwzMSkgfCAxMzQ3LCAoMVU8PDMxKSB8IDEzMjgsIDB4M2YzZjNmLCAKKyAgMHhiZjNmLCAweGJmMWYsIDB4YmYxZiwgMHg5ZjFmLCAweDlmMWYsIDB4OWYxZiwgMHgzZjNmM2YsICgxVTw8MzEpIHwgMTMzNSwgCisgIDB4M2YzZjNmLCAweDNmM2YzZiwgMHgzZjNmM2YsIDB4YmYxZiwgMHgzZjNmM2YsIDB4M2YzZjNmLCAweGJmMWYsICgxVTw8MzEpIHwgMTM0MCwgCisgIDB4MWYxZiwgMHgxZjFmMWYsIDB4MWYxZjFmLCAoMVU8PDMxKSB8IDEzNDAsIDB4NDQ1LCAweDFmMWYsIDB4MWYxZjFmLCAweDFmMWYxZiwgCisgICgxVTw8MzEpIHwgMTM0NywgKDFVPDwzMSkgfCAxMzQ3LCAweDFmMWYxZiwgMHgxZjFmMWYsICgxVTw8MzEpIHwgMTM0NywgKDFVPDwzMSkgfCAxMzQ3LCAweDFmMWYxZiwgKDFVPDwzMSkgfCAxOTksIAorICAoMVU8PDMxKSB8IDE5OSwgMHgzZjNmM2YsIDB4MWYxZjFmLCAweDFmMWYxZiwgKDFVPDwzMSkgfCAxOTYxLCAweGNmM2YzZjAsICgxVTw8MzEpIHwgNDAwMSwgKDFVPDwzMSkgfCA0MDExLCAKKyAgMHhjZjNmM2YwLCAoMVU8PDMxKSB8IDQwNTMsICgxVTw8MzEpIHwgNDAwMSwgKDFVPDwzMSkgfCA0MDYyLCAoMVU8PDMxKSB8IDQwMTEsICgxVTw8MzEpIHwgNDA3MywgKDFVPDwzMSkgfCAxMzI4LCAweDFmMWYxZiwgCisgIDB4M2YyYzNmLCAweDNmMmMyYzNmLCAoMVU8PDMxKSB8IDEzMDEsICgxVTw8MzEpIHwgMTI4NiwgMHgzZjJjM2YzZiwgKDFVPDwzMSkgfCAxMzEyLCAoMVU8PDMxKSB8IDEyOTksICgxVTw8MzEpIHwgMTI4NCwgCisgIDB4M2YzZjNmLCAweGJmM2YsIDB4YmYxZiwgMHhiZjFmLCAweDNmM2YzZiwgMHgzZjNmM2YsIDB4M2YzZjNmLCAweDNmM2YzZiwgCisgIDB4YmYxZiwgMHgzZjNmM2YsIDB4M2YzZjNmLCAweGJmMWYsICgxVTw8MzEpIHwgMTM0MCwgMHgxZjFmMWYsIDB4MWYxZjFmLCAoMVU8PDMxKSB8IDEzNDcsIAorICAweDFmMWYxZiwgKDFVPDwzMSkgfCAxMzQ3LCAweDFmMWYxZiwgKDFVPDwzMSkgfCAxOTksIDB4M2YzZiwgMHgzZjNmM2YsIDB4MWYxZjFmLCAweDNmM2YsIAorICAweDFmMWYxZiwgKDFVPDwzMSkgfCAxOTYxLCAweDFmMWYxZiwgMHg1M2Y1YmYzZiwgMHg0YWYxZiwgMHg0YWYxZiwgMHg3YTNhLCAweDQ5ZjJmLCAKKyAgMHg0OWYyZiwgMHgzYTdhLCAweDQzZjNmM2YsIDB4NDNmM2YzZiwgMHgxZjFmMWYsIDB4MmYyZjJmLCAweDg3LCAweDJlNTU0LCAKKyAgMHg0ZjU0LCAweDJlNTU0LCAweDRmNTQsIDB4MWYxZjFmLCAweDQ0NDQsIDB4NDQ0NCwgKDFVPDwzMSkgfCAxMzcsICgxVTw8MzEpIHwgMTM3LCAKKyAgMHg1NSwgMHgxNDQ0YTQ0LCAweDE0NDRhNDQsIDB4MTQ0NGE0NDQsIDB4MTQ0NGE0NCwgMHgxNDQ0YTQ0LCAweDE0NDRhNDQsIDB4MTQ0NGE0NCwgCisgIDB4MTQ0NGE0NCwgMHgxNDQ0YTQ0LCAweDE0NDRhNDQsIDB4MTQ0NGE0NCwgMHgxMTQ0NGEyZiwgMHgxMTQ0NGEyZiwgKDFVPDwzMSkgfCA3NywgKDFVPDwzMSkgfCA3NywgCisgIDB4MCwgMHgwLCAweDAsIDB4NDJmMSwgMHgyZjJmLCAweDc3NzcsIDB4Nzc3NywgMHg3Nzc3LCAKKyAgMHg3Nzc3LCAweDQ0MzksIDB4NDQzOSwgMHg0NDc0LCAweDc3MzksIDB4NzczOSwgMHg3NzY5LCAweDUsIAorICAoMVU8PDMxKSB8IDUzMSwgMHgyZjJmMmYyZiwgKDFVPDwzMSkgfCA5NywgKDFVPDwzMSkgfCA4NywgMHg0NDQsICgxVTw8MzEpIHwgMTU4LCAoMVU8PDMxKSB8IDE1OCwgKDFVPDwzMSkgfCAxNTgsIAorICAweDQ0NCwgMHg0NDQsICgxVTw8MzEpIHwgMzE5NiwgMHg1NTUsIDB4NTAsICgxVTw8MzEpIHwgMCwgKDFVPDwzMSkgfCA1MywgMHg0MmYyZjUsIAorICAweDc3NywgMHgyZjJmMmYyZiwgMHg3NzcsIDB4MmYyZiwgMHhhZjFmLCAweDJmMmYsIDB4NCwgMHg0MWYxZjUsIAorICAoMVU8PDMxKSB8IDE2NywgMHg1MTUsICgxVTw8MzEpIHwgNDMsICgxVTw8MzEpIHwgNDMsICgxVTw8MzEpIHwgNDIsICgxVTw8MzEpIHwgNDMsICgxVTw8MzEpIHwgNDMsICgxVTw8MzEpIHwgNDMsIAorICAoMVU8PDMxKSB8IDQzLCAoMVU8PDMxKSB8IDQzLCAoMVU8PDMxKSB8IDQzLCAoMVU8PDMxKSB8IDQzLCAoMVU8PDMxKSB8IDQzLCAoMVU8PDMxKSB8IDQzLCAoMVU8PDMxKSB8IDQzLCAoMVU8PDMxKSB8IDE0LCAKKyAgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgCisgICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsIAorICAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAKKyAgKDFVPDwzMSkgfCAzMCwgKDFVPDwzMSkgfCAzMCwgKDFVPDwzMSkgfCAzMCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgCisgICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsIAorICAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAKKyAgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgKDFVPDwzMSkgfCAxNCwgCisgICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsICgxVTw8MzEpIHwgMTQsIAorICAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDE0LCAoMVU8PDMxKSB8IDI5LCAoMVU8PDMxKSB8IDI5LCAoMVU8PDMxKSB8IDUzMSwgKDFVPDwzMSkgfCA1MzEsIDB4NTAsIAorICAweDQ0MCwgMHg0NDQ0NywgMHg0NDQ3NywgMHg0NDQ3NzcsICgxVTw8MzEpIHwgNTMxLCAweDEwLCAweDQyZjJmLCAweDQ0NDQsIAorICAweDJmMmYsIDB4NTEsIDB4NDQ0LCAweDQ0NCwgMHgxNDQ0MWYxZiwgMHg1NDU1LCAweDRhNDU0YSwgMHg0NDQ0LCAKKyAgMHgxLCAweDU0NTUsICgxVTw8MzEpIHwgNTMxLCAweDJmMmYsIDB4NzcsIDB4NDQsIDB4NDQ0LCAweDJmMmYsIAorICAweDJmMmYsIDB4NzcsIDB4MCwgMHgwLCAweDAsIDB4MCwgMHgwLCAweDQwLCAKKyAgMHg1LCAweDQ0LCAweDQwLCAweDUsIDB4NSwgMHg0NDAsIDB4NDQwLCAweDQwLCAKKyAgMHg0MCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDFmMWYsIDB4MWYxZjFmLCAweDFmMWYsIDB4MmYyZiwgCisgICgxVTw8MzEpIHwgNjQsICgxVTw8MzEpIHwgNjMsIDB4NDJmMmYsIDB4NDQxZjFmLCAweDAsICgxVTw8MzEpIHwgMTQ3LCAweDAsIDB4NCwgCisgIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAweGYwZiwgMHgxMSwgMHg0NDQ0LCAKKyAgMHhmMGYsIDB4NDQ0NDQ0MCwgMHg0NDQ0NDQwLCAweDAsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAKKyAgMHg0NDQsIDB4NDQ0LCAweDQwLCAweDQwLCAweDQwLCAweDQsIDB4NDAsIDB4NDAsIAorICAweDRmNCwgKDFVPDwzMSkgfCAxMDQyLCAweDJlNDQwLCAweDJlNDQwLCAweDJlNDQwLCAweDJlNDQwLCAweDRmNCwgKDFVPDwzMSkgfCAxMDQyLCAKKyAgMHg0NDQ0NDQwLCAweDQ0NDQ0NDAsIDB4NDQ0NDQwLCAweDQ0NDQ0MCwgMHg0NDQ0NDQsIDB4NDQ0NDQ0LCAoMVU8PDMxKSB8IDIwNjEsICgxVTw8MzEpIHwgMjA2MSwgCisgIDB4MmMyYzJjLCAweDJjMmMyYywgMHgyYzJjLCAweDJjMmMsIDB4NGE0NGE0YSwgMHg0NCwgMHg0YTQ0YTRhLCAweDRhNDRhNGEsIAorICAweDRhNGE0YTRhLCAweDRhNGE0YSwgMHg0YTRhNGE0YSwgMHg0YTRhNGE0YSwgMHg0YTRhNGEsIDB4NGE0YTRhNGEsIDB4M2YzZjNmLCAweDNmM2YzZiwgCisgIDB4M2YzZiwgMHhiZmJmM2YsIDB4YmZiZjNmLCAweDNmM2YzZjNmLCAweDNmM2YsIDB4YmYzZiwgMHhiZjNmLCAweDRhZjFmLCAKKyAgMHg0YWYxZiwgMHg3YTNhLCAweDQ5ZjJmLCAweDQ5ZjJmLCAweDNhN2EsIDB4YmYzZiwgMHhiZjNmLCAweGJmM2YsIAorICAweGJmM2YsIDB4YmYzZiwgMHhiZjNmLCAweDNmM2YzZiwgMHgzZjNmM2YsIDB4M2YzZjNmLCAweDNmM2YzZiwgMHg0Y2YzZiwgCisgICgxVTw8MzEpIHwgMjkzMiwgKDFVPDwzMSkgfCAyMDM3LCAoMVU8PDMxKSB8IDI5MjEsICgxVTw8MzEpIHwgMjAxOSwgKDFVPDwzMSkgfCAyOTA4LCAoMVU8PDMxKSB8IDE5OTcsIDB4M2YzZjNmLCAweDNmM2YzZiwgCisgIDB4M2YzZjNmLCAweDNmM2YzZiwgMHgzZjNmM2YsIDB4M2YzZjNmLCAoMVU8PDMxKSB8IDEzNDAsICgxVTw8MzEpIHwgMTM0MCwgKDFVPDwzMSkgfCAxMzQwLCAweDNmM2YzZiwgCisgIDB4YmYzZjNmLCAweGJmM2YzZiwgMHgzZjNmM2YsIDB4YmYzZiwgMHhiZjNmLCAweDNmM2YzZiwgMHgzZjNmM2YsIDB4M2YzZjNmLCAKKyAgMHgzZjNmM2YsIDB4M2YzZiwgMHgzZjNmM2YsIDB4M2YzZjNmLCAweDNmM2YzZiwgKDFVPDwzMSkgfCAxMzQwLCAoMVU8PDMxKSB8IDEzMjMsICgxVTw8MzEpIHwgMTMyMywgCisgICgxVTw8MzEpIHwgMTMyMywgMHgzZjNmLCAweDNmM2YzZiwgKDFVPDwzMSkgfCAxMzI4LCAoMVU8PDMxKSB8IDEzMjgsICgxVTw8MzEpIHwgMTMyOCwgMHgzZjNmM2YsIDB4M2YzZjNmLCAKKyAgKDFVPDwzMSkgfCAxMzI4LCAoMVU8PDMxKSB8IDEzMjgsICgxVTw8MzEpIHwgMTMyOCwgMHgzZjNmM2YsIDB4M2YzZjNmLCAweDNmM2YzZiwgMHgzZjNmM2YsIDB4M2YzZjNmLCAKKyAgKDFVPDwzMSkgfCAxMzI4LCAweDNmM2YsIDB4M2YzZjNmLCAweDNmM2YzZiwgMHgzZjNmM2YsIDB4M2YzZiwgMHgzZjNmLCAweDNmM2YsIAorICAweDNmM2YsIDB4M2YzZiwgMHgzZjNmLCAoMVU8PDMxKSB8IDEzMjgsIDB4M2YzZjNmLCAweDNmM2YzZiwgMHgzZjNmLCAweDNmM2YzZiwgCisgICgxVTw8MzEpIHwgMTMyOCwgMHgzZjNmM2YzZiwgMHgzZjNmM2YsIDB4M2YzZjNmLCAweDRiZjRmMCwgMHg0YmZiZjRmMCwgKDFVPDwzMSkgfCAyMzAzLCAoMVU8PDMxKSB8IDI4MTIsIAorICAoMVU8PDMxKSB8IDIzMTMsICgxVTw8MzEpIHwgMjgyMywgKDFVPDwzMSkgfCAyMzI1LCAweDJiMmIyYiwgMHgyYjJiMmIyYiwgKDFVPDwzMSkgfCA5NTQsICgxVTw8MzEpIHwgOTUyLCAweDJiMmIyYjJiLCAKKyAgKDFVPDwzMSkgfCA5NTQsICgxVTw8MzEpIHwgOTUyLCAoMVU8PDMxKSB8IDk1MCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAKKyAgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDAsIAorICAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgCisgIDB4NDQ0NCwgMHg0NDQ0LCAweDU0NDUsIDB4NTQ0NSwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAKKyAgMHg0NDQ0LCAweDQ0NDQsIDB4NTQ0NSwgMHg1NDQ1LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgCisgIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgCisgIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDJlNDQwLCAweDJlNDQwLCAweDJlNDQwLCAweDJlNDQwLCAKKyAgMHg0ZjQ0LCAweDJlNDQ0LCAweDRmNDQsIDB4MmU0NDQsIDB4NDQ0LCAweDQ0LCAweDQ0NCwgMHg0NDQsIAorICAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0MCwgCisgIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NDQsIAorICAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0LCAweDJmNywgCisgIDB4MmY3LCAweDUyZTUsIDB4NTJlNSwgMHg1MmU1LCAweDU1NSwgMHg0NCwgMHg1NSwgMHg0NCwgCisgIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgCisgIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NTU1LCAweDU1NSwgCisgIDB4NDQ0LCAweDU0NSwgMHg0NDQsIDB4NDQ0LCAweDU1NSwgMHg0NCwgMHg0NCwgMHg0NDQsIAorICAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NSwgMHg0NDUsIDB4NDQ0LCAweDU1NSwgMHg0NDQsIAorICAweDU1NSwgMHg0NDQsIDB4NTU1LCAweDQ0NCwgMHg1NTUsIDB4NDQsIDB4NTUsIDB4NDQsIAorICAweDQ0LCAweDU1LCAweDQ0NCwgMHg0NDQsIDB4NTU1LCAweDU0LCAweDU0LCAweDQ0LCAKKyAgMHg0NCwgMHg0NCwgMHg0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAKKyAgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAKKyAgMHg1NTUsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAKKyAgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQsIDB4NDQsIDB4NDQsIDB4NDUsIAorICAweDQ0LCAweDQ0NCwgMHg0NDQsIDB4NTUsIDB4NDUsIDB4NDQsIDB4NTUsIDB4NTUsIAorICAweDU1LCAweDU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAKKyAgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAKKyAgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTQsIDB4NTU0LCAKKyAgMHg1NTQsIDB4NTU0LCAweDU1NCwgMHg1NTQsIDB4NTU0LCAweDU1NCwgMHg1NSwgMHg1NTUsIAorICAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIAorICAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIAorICAweDU1NSwgMHg1NTUsIDB4NTU1NSwgMHg1NTUsIDB4NTU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgCisgIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg0NDQsIDB4NTU1LCAweDQ0LCAKKyAgMHg0NCwgMHg0NDQsIDB4NTU1LCAweDQ0NSwgMHg0NDUsIDB4NTQ0LCAweDQ0NCwgMHg0NDQsIAorICAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIAorICAweDQ0NCwgMHg0NDQsIDB4NDQ1LCAweDQ0NSwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIAorICAweDU1NSwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIAorICAweDQ0NCwgMHg0NTQsIDB4NTU0LCAweDQ1NCwgMHg1NTQsIDB4NDU0LCAweDQ1NCwgMHg0NTQsIAorICAweDQ1NCwgMHg0NTQsIDB4NDU0LCAweDQ1NCwgMHg0NTQsIDB4NDU1NSwgMHg0NTU1LCAweDQ1NTUsIAorICAweDQ1NTUsIDB4NDU1NSwgMHg0NTU1LCAweDQ1NTUsIDB4NDU1NSwgMHg1NTQsIDB4NTU0LCAweDU1NCwgCisgIDB4NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIAorICAweDQ0NCwgMHg1NTQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDU1NCwgMHg0NDQsIAorICAweDQ0NCwgMHg1NTQsIDB4NDQ0LCAweDQ0NCwgMHg0NSwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgCisgIDB4NDQ0NCwgMHg0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0LCAweDQ0LCAweDQ0LCAweDQ0NCwgCisgIDB4NTU0NSwgMHg0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQsIDB4NDQ0LCAKKyAgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAKKyAgMHg0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg1OCwgMHg1NywgMHg4NSwgCisgIDB4ODUsIDB4ODcsIDB4ODUsIDB4ODUsIDB4ODQsIDB4ODQsIDB4ODQsIDB4ODQsIAorICAweDc1LCAweDc1LCAweDc4LCAweDc1LCAweDc1LCAweDc0LCAweDc0LCAweDc0LCAKKyAgMHg3NCwgMHg1OCwgMHg1NywgMHg0OCwgMHg0NywgMHg0OCwgMHg0NywgMHg0ODQsIAorICAweDg4NCwgMHg4ODQsIDB4ODg0LCAweDg4NCwgMHg0OCwgMHg0OCwgMHg3NzcsIDB4NDc0LCAKKyAgMHg3NzQsIDB4Nzc0LCAweDc3NCwgMHg3NzQsIDB4Nzc3LCAweDc3NywgMHg3NywgMHg3Nzc3LCAKKyAgMHg3Nzc3LCAweDQ3Nzc3LCAweDc3NzcsIDB4Nzc3NywgMHg0NywgMHg0NywgMHg3NzcsIDB4Nzc3LCAKKyAgMHg3NzcsIDB4Nzc3LCAoMVU8PDMxKSB8IDE4MTAsICgxVTw8MzEpIHwgMTAxMCwgKDFVPDwzMSkgfCA5OTAsICgxVTw8MzEpIHwgMTgxOCwgKDFVPDwzMSkgfCAxMDIxLCAoMVU8PDMxKSB8IDEwMDAsIAorICAoMVU8PDMxKSB8IDE4MTAsICgxVTw8MzEpIHwgMTAxMCwgKDFVPDwzMSkgfCA5OTAsICgxVTw8MzEpIHwgMTgxMCwgKDFVPDwzMSkgfCAxMDEwLCAoMVU8PDMxKSB8IDk5MCwgKDFVPDwzMSkgfCAxODEwLCAoMVU8PDMxKSB8IDEwMTAsIAorICAoMVU8PDMxKSB8IDk5MCwgKDFVPDwzMSkgfCAxODEwLCAoMVU8PDMxKSB8IDEwMTAsICgxVTw8MzEpIHwgOTkwLCAweDRlNCwgMHg1ZTUsIDB4NDQ0NCwgMHg0NDQ0LCAKKyAgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1NSwgMHg0NDUsIDB4NDQ1LCAKKyAgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ1LCAweDQ0NSwgMHg0NDUsIDB4NDQ1LCAKKyAgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1NSwgMHg0NDQsIDB4NDQ1LCAKKyAgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQ0LCAKKyAgMHg0NDQ0LCAweDQ0NDQsIDB4NTU1NSwgMHg1NTU1LCAweDU1NTUsIDB4NTU1NSwgMHg1NTU1LCAweDU1NTUsIAorICAweDU1NTUsIDB4NTU1NSwgMHg1NTU1LCAweDU1NTUsIDB4NTU1NSwgMHg1NTU1LCAweDU1NTUsIDB4NTU1NSwgCisgIDB4NTU1NSwgMHg1NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAKKyAgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAKKyAgMHg1NTUsIDB4NTU1LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAKKyAgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIAorICAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgCisgIDB4NDQ0LCAweDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgCisgIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAKKyAgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIAorICAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIAorICAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIAorICAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTUsIAorICAweDQ0NTUsIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1NSwgMHg0NDUsIDB4NDQ1LCAweDQ0NSwgCisgIDB4NDQ1LCAweDQ0NSwgMHg0NDUsIDB4NDQ1LCAweDQ0NSwgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1NSwgCisgIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NSwgMHg0NDUsIDB4NDQ1LCAKKyAgMHg0NDUsIDB4NDQ1LCAweDQ0NSwgMHg0NDUsIDB4NDQ1LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAKKyAgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIAorICAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIAorICAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgCisgIDB4NDQ0LCAweDQ0NTUsIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTUsIAorICAweDQ0NTUsIDB4NDQ1LCAweDQ0NSwgMHg0NDUsIDB4NDQ1LCAweDQ0NSwgMHg0NDUsIDB4NDQ1LCAKKyAgMHg0NDUsIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1NSwgCisgIDB4NDQ1NSwgMHg0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NTU1LCAweDU1NSwgMHg1NTU1LCAKKyAgMHg1NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTU1LCAweDU1NTUsIDB4NTU0LCAKKyAgMHg1NTQsIDB4NTU1LCAweDU1NSwgMHg0NDU1LCAweDU1NTUsIDB4NTU1NSwgMHg1NTU1LCAweDQ0NTUsIAorICAweDQ0NTUsIDB4NDQ1NSwgMHg0NDU1LCAweDU1NSwgMHg1NTUsIDB4NDQ1LCAweDQ0NCwgMHg0NDUsIAorICAweDQ0NCwgMHg0NDUsIDB4NDQ1LCAweDU1NCwgMHg1NTQsIDB4NTU1NSwgMHg1NTU1LCAweDU1NTUsIAorICAweDU1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDQ1NTUsIDB4NDU1LCAweDQ1NCwgCisgIDB4NTU1NSwgMHg1NTUsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ1NCwgCisgIDB4NDU0LCAweDQ1NCwgMHg0NTQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAKKyAgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDUsIDB4NDQ1NSwgCisgIDB4NDQ1LCAweDQ0NTUsIDB4NTU1NSwgMHg1NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1NSwgMHg1NTU1LCAKKyAgMHg1NTUsIDB4NTU1LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDU1NTUsIDB4NTU1NSwgMHg1NTUsIAorICAweDQ0NTUsIDB4NDQ1NSwgMHg0NDUsIDB4NDQ1LCAweDU1NTUsIDB4NTU1NSwgMHg1NTUsIDB4NTU1LCAKKyAgMHg1NTUsIDB4NTU1LCAweDQ0NDQsIDB4NDU1LCAweDQ1NTUsIDB4NDU1NSwgMHg0NTU1LCAweDQ1NTUsIAorICAweDQ1NTUsIDB4NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0LCAweDQ0NDQsIAorICAweDQ1NSwgMHg0NTUsIDB4NDU1LCAweDQ1NTUsIDB4NDU1NSwgMHg0NTU1LCAweDQ1NTUsIDB4NDU1NSwgCisgIDB4NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0LCAweDQ1NSwgMHg0NTUsIAorICAweDQ1NSwgMHg0NTU1LCAweDQ1NTUsIDB4NDU1NSwgMHg0NTU1LCAweDQ1NSwgMHg0NTUsIDB4NDQ0LCAKKyAgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDU0LCAweDQ1NSwgCisgIDB4NDU1LCAweDQ1NSwgMHg0NTU1LCAweDQ1NTUsIDB4NDU1NSwgMHg0NTU1LCAweDQ1NTUsIDB4NDQ0LCAKKyAgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NCwgMHg0NTQsIDB4NDU1LCAweDQ1NSwgCisgIDB4NDQsIDB4NTUsIDB4NDU1NSwgMHg0NCwgMHg1NCwgMHg0NCwgMHg1NCwgMHg0NCwgCisgIDB4NDQsIDB4NTQsIDB4NDQ0LCAweDQ0NCwgMHg0NCwgMHg1NCwgMHg0NCwgMHg1NCwgCisgIDB4NTUsIDB4NDQ0NCwgMHg1NDQsIDB4NDQ1NSwgMHg1NTUsIDB4NDQ0NDQsIDB4NTQ0NCwgMHg0NDU1NSwgCisgIDB4NTU1NSwgMHg1NSwgMHg1NTUsIDB4NDU1LCAweDQ1NTUsIDB4NDU1NSwgMHg0NTU1LCAweDQ1NTUsIAorICAweDQ1NTUsIDB4NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDU1LCAweDQ1NSwgCisgIDB4NDU1LCAweDQ1NTUsIDB4NDU1NSwgMHg0NTU1LCAweDQ1NTUsIDB4NDU1NSwgMHg0NDQsIDB4NDQ0NCwgCisgIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NTUsIDB4NDU1LCAweDQ1NSwgMHg0NTU1LCAKKyAgMHg0NTU1LCAweDQ1NTUsIDB4NDU1NSwgMHg0NTU1LCAweDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgCisgIDB4NDQ0NCwgMHg0NTUsIDB4NDU1LCAweDQ0NSwgMHg1NTQsIDB4NDQ0LCAweDQ0NCwgMHg1NTUsIAorICAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDQ0MmUyZSwgKDFVPDwzMSkgfCAxMDMyLCAweDJlNDQyZTJlLCAweDQ1MmUyZSwgKDFVPDwzMSkgfCAxMDQ4LCAKKyAgMHgyZTU0MmUyZSwgMHg0NDJlMmUsICgxVTw8MzEpIHwgMTAzMiwgMHgyZTQ0MmUyZSwgMHg0NDJlMmUsICgxVTw8MzEpIHwgMTAzMiwgMHgyZTQ0MmUyZSwgMHg0NDJlMmUsIAorICAoMVU8PDMxKSB8IDEwMzIsIDB4MmU0NDJlMmUsIDB4NDRlNCwgMHg0NCwgMHg0NCwgMHg0NDQ0NCwgMHg0NDQ0NCwgMHg0NDQ0NCwgCisgIDB4NDQ0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQsIDB4NDQ0LCAweDQ1NTUsIDB4NDU1NSwgMHg0NTUsIAorICAweDQ1NSwgMHg0NTU1LCAweDU0LCAweDU0LCAweDU0LCAweDU1LCAweDU0LCAweDU1LCAKKyAgMHg1NCwgMHg1NSwgMHg1NCwgMHg1NSwgMHg0NCwgMHg0NSwgMHg0NTU1LCAweDQ1NTUsIAorICAweDQ1LCAweDQ1LCAweDU0LCAweDU1NSwgMHg1NCwgMHg1NTUsIDB4NDUsIDB4NDUsIAorICAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQsIDB4NDU0LCAweDU0LCAKKyAgMHg0NDQ0LCAweDU0NCwgMHg0NDU1LCAweDU1NSwgMHg0NDQsIDB4NDQ0LCAweDQ0NCwgMHg0NDQ0LCAKKyAgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NCwgMHg1NWU0LCAweDQ0NDQsIDB4NDQ0NCwgCisgIDB4NDQ0NCwgMHg0NDU1LCAweDQ0NTU1LCAweDU1NSwgMHg1NTUsIDB4NTU1LCAweDU1NSwgMHg1NTUsIAorICAweDU1NSwgMHg0NTQsIDB4NDU0LCAweDU0LCAweDQ1NSwgMHg0NTUsIDB4NDU1NSwgMHg0NTU1LCAKKyAgMHg0NTU1LCAweDQ1NTUsIDB4NDU1NSwgMHg0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgCisgIDB4NDQ0NCwgMHg0NSwgMHg1NTUsIDB4NTU1LCAweDQ0YzQsIDB4NDRkNCwgMHg0ZDRjLCAoMVU8PDMxKSB8IDMxMjEsIAorICAweDRkNGMsICgxVTw8MzEpIHwgMzEyMSwgMHg0NGMsIDB4NDRkLCAweDQ0YywgMHg0NGQsIDB4NDRjLCAweDQ0ZCwgCisgICgxVTw8MzEpIHwgMjA0LCAoMVU8PDMxKSB8IDIyMywgKDFVPDwzMSkgfCAyMDQsICgxVTw8MzEpIHwgMjIzLCAoMVU8PDMxKSB8IDIwNiwgKDFVPDwzMSkgfCAyMjUsICgxVTw8MzEpIHwgMjA0LCAoMVU8PDMxKSB8IDIyMywgCisgICgxVTw8MzEpIHwgMjA0LCAoMVU8PDMxKSB8IDIyMywgKDFVPDwzMSkgfCAxMzU3LCAoMVU8PDMxKSB8IDEzNjUsICgxVTw8MzEpIHwgMTM1NywgKDFVPDwzMSkgfCAxMzY1LCAoMVU8PDMxKSB8IDIwNCwgKDFVPDwzMSkgfCAyMjMsIAorICAoMVU8PDMxKSB8IDIwNCwgKDFVPDwzMSkgfCAyMjMsICgxVTw8MzEpIHwgMjA0LCAoMVU8PDMxKSB8IDIyMywgKDFVPDwzMSkgfCAyODQzLCAoMVU8PDMxKSB8IDI5NDgsICgxVTw8MzEpIHwgMjg0MywgKDFVPDwzMSkgfCAyOTQ4LCAKKyAgKDFVPDwzMSkgfCAyODQzLCAoMVU8PDMxKSB8IDI5NDgsICgxVTw8MzEpIHwgMjg0MywgKDFVPDwzMSkgfCAyOTQ4LCAweDRjNGMsIDB4NGQ0ZCwgMHg0YzRjLCAweDRkNGQsIAorICAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIAorICAweDRjNGMsIDB4NGQ0ZCwgMHg0YzRjLCAweDRkNGQsIDB4NGM0YywgMHg0ZDRkLCAweDRjNGMsIDB4NGQ0ZCwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0ZDRkNGQsICgxVTw8MzEpIHwgMzEyNiwgKDFVPDwzMSkgfCAyODcwLCAoMVU8PDMxKSB8IDI5ODUsICgxVTw8MzEpIHwgMjg3MCwgKDFVPDwzMSkgfCAyOTg1LCAKKyAgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRkNGQ0ZCwgKDFVPDwzMSkgfCAzMTI2LCAoMVU8PDMxKSB8IDIxMSwgKDFVPDwzMSkgfCAyMzAsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRkNGQ0ZCwgKDFVPDwzMSkgfCAzMTI2LCAoMVU8PDMxKSB8IDI4NzAsICgxVTw8MzEpIHwgMjk4NSwgCisgICgxVTw8MzEpIHwgMjg3MCwgKDFVPDwzMSkgfCAyOTg1LCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGQ0ZDRkLCAoMVU8PDMxKSB8IDMxMjYsIDB4NGM0YzRkLCAoMVU8PDMxKSB8IDMwMTUsIAorICAweDRjNGM0ZDRkLCAoMVU8PDMxKSB8IDMwMTMsIDB4NGM0YzRkLCAoMVU8PDMxKSB8IDMwMTUsIDB4NGM0YzRkNGQsICgxVTw8MzEpIHwgMzAxMywgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAKKyAgMHg0ZDRkNGQsICgxVTw8MzEpIHwgMzEyNiwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGQ0ZDRkLCAoMVU8PDMxKSB8IDMxMjYsIAorICAweDRjNGM0ZCwgKDFVPDwzMSkgfCAzMDE1LCAweDRjNGM0ZDRkLCAoMVU8PDMxKSB8IDMwMTMsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0ZDRkNGQsICgxVTw8MzEpIHwgMzEyNiwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0ZDRkNGQsICgxVTw8MzEpIHwgMzEyNiwgKDFVPDwzMSkgfCAyODcwLCAoMVU8PDMxKSB8IDI5ODUsICgxVTw8MzEpIHwgMjg3MCwgKDFVPDwzMSkgfCAyOTg1LCAKKyAgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRkNGQ0ZCwgKDFVPDwzMSkgfCAzMTI2LCAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIAorICAweDRjNGM0YywgMHg0ZDRkNGQsICgxVTw8MzEpIHwgMTM1NSwgKDFVPDwzMSkgfCAxMzYzLCAoMVU8PDMxKSB8IDEzNTMsICgxVTw8MzEpIHwgMTM2MSwgKDFVPDwzMSkgfCAxMzU1LCAoMVU8PDMxKSB8IDEzNjMsIAorICAoMVU8PDMxKSB8IDEzNTMsICgxVTw8MzEpIHwgMTM2MSwgKDFVPDwzMSkgfCAyODM2LCAoMVU8PDMxKSB8IDI5NDEsICgxVTw8MzEpIHwgMjgzNiwgKDFVPDwzMSkgfCAyOTQxLCAoMVU8PDMxKSB8IDIzNDEsICgxVTw8MzEpIHwgMjM3OSwgCisgICgxVTw8MzEpIHwgMjMzOSwgKDFVPDwzMSkgfCAyMzc3LCAweDQ0YzRjLCAweDQ0ZDRkLCAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAKKyAgMHg0NGM0YywgMHg0NGQ0ZCwgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0NGM0YywgMHg0NGQ0ZCwgCisgIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAKKyAgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAKKyAgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAweDQ0YzRjLCAweDQ0ZDRkLCAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgCisgIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAKKyAgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjLCAweDRkNGQsIDB4NGQ0ZCwgKDFVPDwzMSkgfCAzMTI4LCAKKyAgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAKKyAgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAKKyAgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAKKyAgMHg0YzRjLCAweDRkNGQsIDB4NGM0YywgMHg0ZDRkLCAweDRjNGM0ZCwgKDFVPDwzMSkgfCAzMDE1LCAweDRjLCAweDRkLCAKKyAgMHg0ZCwgKDFVPDwzMSkgfCAzMTEwLCAweDRjNGMsIDB4NGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGMsIDB4NGQ0ZCwgCisgIDB4NDRjNGM0ZCwgKDFVPDwzMSkgfCAyMzk3LCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NDRjNGMsIDB4NDRkNGQsIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAKKyAgMHg0NGQ0ZCwgKDFVPDwzMSkgfCAyNDcwLCAweDQ0ZDRkNGQsICgxVTw8MzEpIHwgMjQ2OCwgMHg0NGM0YywgMHg0NGQ0ZCwgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIAorICAweDQ0ZDRkLCAoMVU8PDMxKSB8IDI0NzAsIDB4NDRkNGQ0ZCwgKDFVPDwzMSkgfCAyNDY4LCAweDQ0ZDRjLCAoMVU8PDMxKSB8IDI0NjIsIDB4NDRkNGM0YywgKDFVPDwzMSkgfCAyNDYwLCAKKyAgMHg0NGM0YywgMHg0NGQ0ZCwgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIDB4NDRkNGMsICgxVTw8MzEpIHwgMjQ2MiwgMHg0NGQ0YzRjLCAoMVU8PDMxKSB8IDI0NjAsIAorICAweDQ0YzRjLCAweDQ0ZDRkLCAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YzRjLCAweDRkNGQ0ZDRkLCAKKyAgMHg0NGQ0ZCwgKDFVPDwzMSkgfCAyNDcwLCAweDQ0ZDRkNGQsICgxVTw8MzEpIHwgMjQ2OCwgKDFVPDwzMSkgfCAyODYzLCAoMVU8PDMxKSB8IDI5NzgsICgxVTw8MzEpIHwgMjg2MSwgKDFVPDwzMSkgfCAyOTc2LCAKKyAgKDFVPDwzMSkgfCAyODYxLCAoMVU8PDMxKSB8IDI5NzYsICgxVTw8MzEpIHwgMjg2MSwgKDFVPDwzMSkgfCAyOTc2LCAoMVU8PDMxKSB8IDI4NjMsICgxVTw8MzEpIHwgMjk3OCwgKDFVPDwzMSkgfCAyODYxLCAoMVU8PDMxKSB8IDI5NzYsIAorICAoMVU8PDMxKSB8IDI4NjEsICgxVTw8MzEpIHwgMjk3NiwgKDFVPDwzMSkgfCAyODYxLCAoMVU8PDMxKSB8IDI5NzYsICgxVTw8MzEpIHwgMjg2MywgKDFVPDwzMSkgfCAyOTc4LCAoMVU8PDMxKSB8IDI4NjEsICgxVTw8MzEpIHwgMjk3NiwgCisgICgxVTw8MzEpIHwgMjg2MSwgKDFVPDwzMSkgfCAyOTc2LCAoMVU8PDMxKSB8IDI4NjEsICgxVTw8MzEpIHwgMjk3NiwgMHg0YzQ0MmUwLCAweDRkNDQyZTAsICgxVTw8MzEpIHwgMjg1MSwgKDFVPDwzMSkgfCAyOTY2LCAKKyAgMHg0ZDQ0MmUwLCAoMVU8PDMxKSB8IDMxMTMsICgxVTw8MzEpIHwgMjk1NiwgKDFVPDwzMSkgfCAzMTAzLCAweDRjNDQyZTAsIDB4NGQ0NDJlMCwgKDFVPDwzMSkgfCAyODUxLCAoMVU8PDMxKSB8IDI5NjYsIAorICAoMVU8PDMxKSB8IDI4NjMsICgxVTw8MzEpIHwgMjk3OCwgKDFVPDwzMSkgfCAyODYxLCAoMVU8PDMxKSB8IDI5NzYsICgxVTw8MzEpIHwgMjg2MSwgKDFVPDwzMSkgfCAyOTc2LCAoMVU8PDMxKSB8IDI4NjEsICgxVTw8MzEpIHwgMjk3NiwgCisgICgxVTw8MzEpIHwgMjg2MywgKDFVPDwzMSkgfCAyOTc4LCAoMVU8PDMxKSB8IDI4NjEsICgxVTw8MzEpIHwgMjk3NiwgKDFVPDwzMSkgfCAyODYxLCAoMVU8PDMxKSB8IDI5NzYsICgxVTw8MzEpIHwgMjg2MSwgKDFVPDwzMSkgfCAyOTc2LCAKKyAgKDFVPDwzMSkgfCAyODYzLCAoMVU8PDMxKSB8IDI5NzgsICgxVTw8MzEpIHwgMjg2MSwgKDFVPDwzMSkgfCAyOTc2LCAoMVU8PDMxKSB8IDI4NjEsICgxVTw8MzEpIHwgMjk3NiwgKDFVPDwzMSkgfCAyODYxLCAoMVU8PDMxKSB8IDI5NzYsIAorICAoMVU8PDMxKSB8IDI4NjMsICgxVTw8MzEpIHwgMjk3OCwgKDFVPDwzMSkgfCAyODYxLCAoMVU8PDMxKSB8IDI5NzYsICgxVTw8MzEpIHwgMjg2MSwgKDFVPDwzMSkgfCAyOTc2LCAoMVU8PDMxKSB8IDI4NjEsICgxVTw8MzEpIHwgMjk3NiwgCisgICgxVTw8MzEpIHwgMjg2MywgKDFVPDwzMSkgfCAyOTc4LCAoMVU8PDMxKSB8IDI4NjEsICgxVTw8MzEpIHwgMjk3NiwgKDFVPDwzMSkgfCAyODYxLCAoMVU8PDMxKSB8IDI5NzYsICgxVTw8MzEpIHwgMjg2MSwgKDFVPDwzMSkgfCAyOTc2LCAKKyAgKDFVPDwzMSkgfCAyODYzLCAoMVU8PDMxKSB8IDI5NzgsICgxVTw8MzEpIHwgMjg2MSwgKDFVPDwzMSkgfCAyOTc2LCAoMVU8PDMxKSB8IDI4NjEsICgxVTw8MzEpIHwgMjk3NiwgKDFVPDwzMSkgfCAyODYxLCAoMVU8PDMxKSB8IDI5NzYsIAorICAweDQ0YzRjLCAweDQ0ZDRkLCAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIDB4NDRjNGMsIDB4NDRkNGQsIAorICAweDQ0YzRjLCAweDQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NDRjNGMsIDB4NDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgCisgIDB4NTRjNGMsIDB4NTRkNGQsIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgKDFVPDwzMSkgfCAyMzU3LCAoMVU8PDMxKSB8IDIzODUsIAorICAoMVU8PDMxKSB8IDIzNTcsICgxVTw8MzEpIHwgMjM4NSwgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIDB4NDRjNGM0ZCwgKDFVPDwzMSkgfCAyMzk3LCAweDQ0YzRjNGQsICgxVTw8MzEpIHwgMjM5NywgCisgICgxVTw8MzEpIHwgMjM2NywgKDFVPDwzMSkgfCAyMzk1LCAoMVU8PDMxKSB8IDIzNjcsICgxVTw8MzEpIHwgMjM5NSwgMHg0NGM0YzRkLCAoMVU8PDMxKSB8IDIzOTcsICgxVTw8MzEpIHwgMjg0MywgKDFVPDwzMSkgfCAyOTQ4LCAKKyAgKDFVPDwzMSkgfCAyODQzLCAoMVU8PDMxKSB8IDI5NDgsICgxVTw8MzEpIHwgMjg0MywgKDFVPDwzMSkgfCAyOTQ4LCAoMVU8PDMxKSB8IDI4NDMsICgxVTw8MzEpIHwgMjk0OCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAKKyAgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAKKyAgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAKKyAgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDQ0ZDRkLCAoMVU8PDMxKSB8IDI0NzAsIDB4NDRkNGQ0ZCwgKDFVPDwzMSkgfCAyNDY4LCAweDRkNGQ0ZCwgKDFVPDwzMSkgfCAzMTI2LCAKKyAgMHg0NGQ0ZCwgKDFVPDwzMSkgfCAyNDcwLCAweDQ0ZDRkNGQsICgxVTw8MzEpIHwgMjQ2OCwgMHg0ZDRkNGQsICgxVTw8MzEpIHwgMzEyNiwgMHg0NGQ0ZCwgKDFVPDwzMSkgfCAyNDcwLCAKKyAgMHg0NGQ0ZDRkLCAoMVU8PDMxKSB8IDI0NjgsIDB4NTRjNGM0YywgMHg1NGQ0ZDRkLCAweDQ0ZDRkLCAoMVU8PDMxKSB8IDI0NzAsIDB4NDRkNGQ0ZCwgKDFVPDwzMSkgfCAyNDY4LCAKKyAgMHg1NGM0YzRjLCAweDU0ZDRkNGQsIDB4NTRjNGM0YywgMHg1NGQ0ZDRkLCAweDQ0YzRkLCAoMVU8PDMxKSB8IDI0MDcsIDB4NDRjNGQ0ZCwgKDFVPDwzMSkgfCAyNDA1LCAKKyAgMHg0YzRjNGQsICgxVTw8MzEpIHwgMzAxNSwgMHg0YzRjNGQ0ZCwgKDFVPDwzMSkgfCAzMDEzLCAweDRjNGM0ZCwgKDFVPDwzMSkgfCAzMDE1LCAweDRjNGM0ZDRkLCAoMVU8PDMxKSB8IDMwMTMsIAorICAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRkLCAoMVU8PDMxKSB8IDMwMTUsIDB4NDRjNGQsICgxVTw8MzEpIHwgMjQwNywgMHg0NGM0ZDRkLCAoMVU8PDMxKSB8IDI0MDUsIAorICAweDQ0YzRkNGQsICgxVTw8MzEpIHwgMjQwNSwgMHg0NGM0YywgMHg0NGQ0ZCwgMHg0NGM0YywgMHg0NGQ0ZCwgMHg0YzRjNGQsICgxVTw8MzEpIHwgMzAxNSwgCisgIDB4NGM0YzRkNGQsICgxVTw8MzEpIHwgMzAxMywgMHg0YzRjNGQsICgxVTw8MzEpIHwgMzAxNSwgMHg0YzRjNGQ0ZCwgKDFVPDwzMSkgfCAzMDEzLCAweDRjNGM0YywgMHg0ZDRkNGQsIAorICAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjNGMsIDB4NGQ0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGM0YywgMHg0ZDRkNGQ0ZCwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGM0YywgMHg0ZDRkNGQ0ZCwgMHg0NGM0YywgMHg0NGQ0ZCwgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIAorICAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NDRjNGMsIDB4NDRkNGQsIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAweDQ0YzRjLCAweDQ0ZDRkLCAKKyAgMHg0NGM0YzRjLCAweDQ0ZDRkNGQsIDB4NDRjNGMsIDB4NDRkNGQsIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIAorICAweDRjNGM0ZDRkLCAoMVU8PDMxKSB8IDMwMTMsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGM0YywgMHg0ZDRkNGQ0ZCwgMHg0YzRjNGM0YywgMHg0ZDRkNGQ0ZCwgCisgIDB4NDRjNGQsICgxVTw8MzEpIHwgMjQwNywgMHg0NGM0ZDRkLCAoMVU8PDMxKSB8IDI0MDUsIDB4NGM0YzRkLCAoMVU8PDMxKSB8IDMwMTUsIDB4NGM0YzRkNGQsICgxVTw8MzEpIHwgMzAxMywgCisgIDB4NDRjNGQsICgxVTw8MzEpIHwgMjQwNywgMHg0NGM0ZDRkLCAoMVU8PDMxKSB8IDI0MDUsIDB4NDRjNGMsIDB4NDRkNGQsIDB4NDRjNGM0YywgMHg0NGQ0ZDRkLCAKKyAgMHg0YzRjNGQsICgxVTw8MzEpIHwgMzAxNSwgMHg0YzRjNGQ0ZCwgKDFVPDwzMSkgfCAzMDEzLCAoMVU8PDMxKSB8IDI4NzAsICgxVTw8MzEpIHwgMjk4NSwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAKKyAgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjLCAweDRkNGQsIAorICAweDRjNGMsIDB4NGQ0ZCwgMHg0YzRjLCAweDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAKKyAgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAKKyAgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjLCAweDRkNGQsIAorICAoMVU8PDMxKSB8IDIxOCwgKDFVPDwzMSkgfCAyMzcsICgxVTw8MzEpIHwgMjE4LCAoMVU8PDMxKSB8IDIzNywgKDFVPDwzMSkgfCAyMTgsICgxVTw8MzEpIHwgMjM3LCAweDRjNGM0YywgMHg0ZDRkNGQsIAorICAweDU0YzRkLCAoMVU8PDMxKSB8IDMxOTAsIDB4NTRjNGQ0ZCwgKDFVPDwzMSkgfCAzMTg4LCAweDQ0YzRjLCAweDQ0ZDRkLCAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgCisgIDB4NDQ0ZDRkLCAoMVU8PDMxKSB8IDIxNDYsIDB4NDQ0ZDRkNGQsICgxVTw8MzEpIHwgMjE0NCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YzRjLCAweDRkNGQ0ZDRkLCAKKyAgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YzRjLCAweDRkNGQ0ZDRkLCAweDQ0YzRjLCAweDQ0ZDRkLCAweDQ0YzRjNGMsIDB4NDRkNGQ0ZCwgCisgIDB4NTRjNGQsICgxVTw8MzEpIHwgMzE5MCwgMHg1NGM0ZDRkLCAoMVU8PDMxKSB8IDMxODgsIDB4NDQ0ZDRkLCAoMVU8PDMxKSB8IDIxNDYsIDB4NDQ0ZDRkNGQsICgxVTw8MzEpIHwgMjE0NCwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGM0YywgMHg0ZDRkNGQ0ZCwgMHg0NGM0YywgMHg0NGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAKKyAgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAKKyAgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDQ0NGQ0ZCwgKDFVPDwzMSkgfCAyMTQ2LCAweDQ0NGQ0ZDRkLCAoMVU8PDMxKSB8IDIxNDQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGQsICgxVTw8MzEpIHwgMzAyNSwgMHg0YzRjNDQwLCAweDRkNGQ0NDAsIAorICAweDRjNGM0NDAsIDB4NGQ0ZDQ0MCwgKDFVPDwzMSkgfCAyODg4LCAoMVU8PDMxKSB8IDMwMDMsIDB4NGM0ZDQ0MCwgKDFVPDwzMSkgfCAzMDIyLCAweDRjNGQ0NDAsICgxVTw8MzEpIHwgMzAyMiwgCisgICgxVTw8MzEpIHwgMjg5OCwgKDFVPDwzMSkgfCAzMDMwLCAweDRjNGM0NDAsIDB4NGQ0ZDQ0MCwgMHg0YzRjNDQwLCAweDRkNGQ0NDAsICgxVTw8MzEpIHwgMjg4OCwgKDFVPDwzMSkgfCAzMDAzLCAKKyAgMHg0YzRkLCAoMVU8PDMxKSB8IDMwMjUsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRjLCAweDRkNGQsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgCisgIDB4NGM0YywgMHg0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NDRjNGM0ZCwgKDFVPDwzMSkgfCAyMzk3LCAweDRjNGM0ZCwgKDFVPDwzMSkgfCAzMDE1LCAKKyAgMHg0YzRjNGQsICgxVTw8MzEpIHwgMzAxNSwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGQ0ZDRkLCAoMVU8PDMxKSB8IDMxMjYsIAorICAoMVU8PDMxKSB8IDI4NzAsICgxVTw8MzEpIHwgMjk4NSwgKDFVPDwzMSkgfCAyODcwLCAoMVU8PDMxKSB8IDI5ODUsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0ZDRkNGQsICgxVTw8MzEpIHwgMzEyNiwgCisgICgxVTw8MzEpIHwgMjExLCAoMVU8PDMxKSB8IDIzMCwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRkNGQ0ZCwgKDFVPDwzMSkgfCAzMTI2LCAoMVU8PDMxKSB8IDI4NzAsICgxVTw8MzEpIHwgMjk4NSwgCisgICgxVTw8MzEpIHwgMjg3MCwgKDFVPDwzMSkgfCAyOTg1LCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGQ0ZDRkLCAoMVU8PDMxKSB8IDMxMjYsIDB4NGM0YzRkLCAoMVU8PDMxKSB8IDMwMTUsIAorICAweDRjNGM0ZCwgKDFVPDwzMSkgfCAzMDE1LCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGQ0ZDRkLCAoMVU8PDMxKSB8IDMxMjYsIDB4NGM0YzRjLCAweDRkNGQ0ZCwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0ZDRkNGQsICgxVTw8MzEpIHwgMzEyNiwgMHg0YzRjNGQsICgxVTw8MzEpIHwgMzAxNSwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAKKyAgMHg0ZDRkNGQsICgxVTw8MzEpIHwgMzEyNiwgMHg0YzRjNGMsIDB4NGQ0ZDRkLCAweDRkNGQ0ZCwgKDFVPDwzMSkgfCAzMTI2LCAoMVU8PDMxKSB8IDI4NzAsICgxVTw8MzEpIHwgMjk4NSwgCisgICgxVTw8MzEpIHwgMjg3MCwgKDFVPDwzMSkgfCAyOTg1LCAweDRjNGM0YywgMHg0ZDRkNGQsIDB4NGQ0ZDRkLCAoMVU8PDMxKSB8IDMxMjYsICgxVTw8MzEpIHwgMjg3OSwgKDFVPDwzMSkgfCAyOTk0LCAKKyAgMHg0NGQ0ZCwgKDFVPDwzMSkgfCAyNDcwLCAweDQ0ZDRkNGQsICgxVTw8MzEpIHwgMjQ2OCwgMHg0NGQ0ZCwgKDFVPDwzMSkgfCAyNDcwLCAweDQ0ZDRkNGQsICgxVTw8MzEpIHwgMjQ2OCwgCisgIDB4NDRkNGQsICgxVTw8MzEpIHwgMjQ3MCwgMHg0NGQ0ZDRkLCAoMVU8PDMxKSB8IDI0NjgsIDB4NGM0ZCwgKDFVPDwzMSkgfCAzMDI1LCAweDRjNGQsICgxVTw8MzEpIHwgMzAyNSwgCisgIDB4NGM0ZDRkLCAoMVU8PDMxKSB8IDMwNDAsIDB4NGM0ZDRkLCAoMVU8PDMxKSB8IDMwNDAsIDB4NGM0ZCwgKDFVPDwzMSkgfCAzMDI1LCAweDRjNGQsICgxVTw8MzEpIHwgMzAyNSwgCisgIDB4NGM0YzRjLCAweDRkNGQ0ZCwgMHg0YzRkLCAoMVU8PDMxKSB8IDMwMjUsIDB4NGM0ZCwgKDFVPDwzMSkgfCAzMDI1LCAweDJlMCwgMHgyZTAsIAorICAweDJlMCwgMHgyZTAsIDB4NDJlMCwgMHg1MmUwLCAweDQ0MmUyZTJlLCAweDQ0MmUyZTJlLCAweDQ0MmUyZTJlLCAweDQ0MmUyZTJlLCAKKyAgMHg0NDJlMmUyZSwgMHg0NDJlMmUyZSwgMHg0NDQyZTJlLCAweDQ0NTJlMmUsIDB4NDQ0MmUyZSwgMHg0NDQyZTJlLCAweDQ0NDJlMmUsIDB4NGI0YjRiLCAKKyAgMHgyZTAsIDB4MzkzOSwgMHgyYTJhLCAweDQ0LCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgCisgIDB4MzkzOTM5LCAweDM5MzkzOSwgMHg0NDQsIDB4MzkzOTM5LCAweDM5MzkzOSwgMHg0NDQsIDB4NDQ0LCAweDJjMmMyYywgCisgIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDJjMmMyYywgCisgIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4NDQ0LCAweDM5MzkzOSwgMHgyYTJhMmEsIDB4MzkzOTM5LCAweDJhMmEyYSwgCisgIDB4MmEyYTJhLCAweDJhMmEyYSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4NDJjMmMsIDB4NDU5NTksIAorICAweDQzYjNiLCAweDQ0YTRhLCAweDQ0NCwgMHgyYzJjMmMsIDB4NDJjMmMsIDB4NDQ0NCwgMHgyYzJjMmMsIDB4NTk1OTU5LCAKKyAgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAKKyAgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAKKyAgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgMHg0NDQ0LCAweDJjMmMyYywgCisgIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4NDJjMmMsIDB4NDU5NTksIDB4NDNiM2IsIDB4NDRhNGEsIDB4MmMyYzJjMmMsIAorICAweDU5NTk1OTU5LCAweDNiM2IzYjNiLCAweDRhNGE0YTRhLCAweDQyYzJjMmMsIDB4NDU5NTk1OSwgMHg0M2IzYjNiLCAweDQ0YTRhNGEsIDB4MmMyYzJjMmMsIAorICAweDU5NTk1OTU5LCAweDNiM2IzYjNiLCAweDRhNGE0YTRhLCAweDQyYzJjMmMsIDB4NDU5NTk1OSwgMHg0M2IzYjNiLCAweDQ0YTRhNGEsIDB4NDQsIAorICAweDJjMmMyYzJjLCAweDQyYzJjMmMsIDB4MmMyYzJjMmMsIDB4NDJjMmMyYywgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIAorICAweDQyYzJjLCAweDQ1OTU5LCAweDQzYjNiLCAweDQ0YTRhLCAweDJjNCwgMHg1OTQsIDB4M2I0LCAweDJjNCwgCisgIDB4NGE0LCAweDQsIDB4MmMyYzJjMmMsIDB4NDJjMmMyYywgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIAorICAweDQyYzJjLCAweDQ1OTU5LCAweDQzYjNiLCAweDQ0YTRhLCAweDJjNCwgMHg1OTQsIDB4M2I0LCAweDJjNCwgCisgIDB4NGE0LCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgMHg0MmMyYywgMHg0NTk1OSwgMHg0M2IzYiwgCisgIDB4NDRhNGEsIDB4NDQsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDJjMmMyYywgMHg1OTU5NTksIAorICAweDNiM2IzYiwgMHg0YTRhNGEsIDB4NDJjMmMsIDB4NDU5NTksIDB4NDNiM2IsIDB4NDRhNGEsIDB4NDJjMmMsIDB4NDU5NTksIAorICAweDQzYjNiLCAweDQ0YTRhLCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAKKyAgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDQyYzJjLCAweDQ1OTU5LCAweDQzYjNiLCAweDQ0YTRhLCAweDQyYzJjLCAweDQ1OTU5LCAKKyAgMHg0M2IzYiwgMHg0NGE0YSwgMHgzOTM5MCwgMHgzOTM5MCwgMHgzOTM5MCwgMHgyYTJhNCwgMHgyYTJhNCwgMHgyYTJhNCwgCisgIDB4MmEyYTQsIDB4MmEyYTQsIDB4MmEyYTQsIDB4MmEyYTAsIDB4MmEyYTAsIDB4MmEyYTAsIDB4NDJjNCwgMHg0NTk1LCAKKyAgMHg0M2I0LCAweDQ0YTQsIDB4NDJjNCwgMHg0NTk1LCAweDQzYjQsIDB4NDRhNCwgMHg0NDAsIDB4MmMyYzJjLCAKKyAgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4NDU1NSwgCisgIDB4NGE0YTU5LCAweDJjMmMzYiwgMHgzYjNiNGEsIDB4NGE0YTU5LCAweDJjMmMzYiwgMHgzYjNiNGEsIDB4MzkzOTU1LCAweDRhNGE1OTU5LCAKKyAgMHgyYzJjM2IzYiwgMHgzYjNiNGE0YSwgMHg0YTRhNTk1OSwgMHgyYzJjM2IzYiwgMHgzYjNiNGE0YSwgMHgzOTM5NTUsIDB4NDQ1NSwgMHgzOTM5NTUsIAorICAweDM5Mzk1NSwgMHgyYTJhNTUsIDB4MmEyYTU1LCAweDM5Mzk1NSwgMHgzOTM5NTUsIDB4MzkzOTU1LCAweDQ0NTUsIDB4MzkzOTU1LCAKKyAgMHgzOTM5NTUsIDB4MmEyYTU1LCAweDJhMmE1NSwgMHg0YTRhNTk1OSwgMHgyYzJjM2IzYiwgMHgzYjNiNGE0YSwgMHg0YTRhNTk1OSwgMHgyYzJjM2IzYiwgCisgIDB4M2IzYjRhNGEsIDB4MzkzOTU1LCAweDQ1NCwgMHg0NTQsIDB4NDU0LCAweDQ1NCwgMHg0NTQsIDB4NDU0LCAKKyAgMHg4OTg5ODksIDB4N2E3YTdhLCAweDg5ODk1OSwgMHg3YTdhNGEsIDB4ODk4OTU5LCAweDdhN2E0YSwgMHg4OTU5LCAweDdhNGEsIAorICAweDg5ODk1OSwgMHg3YTdhNGEsIDB4ODk4OTU5LCAweDdhN2E0YSwgMHg4OTg5NTksIDB4N2E3YTRhLCAweDg5ODk1OSwgMHg3YTdhNGEsIAorICAweDg5ODk1OSwgMHg3YTdhNGEsIDB4ODk4OTU5LCAweDdhN2E0YSwgMHg4OTg5NTksIDB4N2E3YTRhLCAweDg5ODk1OSwgMHg3YTdhNGEsIAorICAweDg5ODk1OSwgMHg3YTdhNGEsIDB4ODk4OTg5LCAweDdhN2E3YSwgMHg3YTdhNmIsIDB4ODk4OTdhLCAweDU5ODk4OSwgMHg0YTdhN2EsIAorICAweDdhODksIDB4NmI3YSwgMHg3YTg5LCAweDZiN2EsIDB4NTk4OSwgMHg0YTdhLCAweDU5ODksIDB4NGE3YSwgCisgIDB4NGE4OSwgMHgzYjdhLCAweDRhODksIDB4M2I3YSwgMHg0MmMsIDB4NTU5LCAweDQzYiwgMHg0NGEsIAorICAweDg5ODksIDB4N2E3YSwgKDFVPDwzMSkgfCAzOTc5LCAweDdhN2E3YTdhLCAweDg5ODk4OSwgMHg3YTdhN2EsIDB4ODk4OTg5LCAweDdhN2E3YSwgCisgIDB4ODk4OTg5LCAweDdhN2E3YSwgMHg4OTg5ODksIDB4N2E3YTdhLCAoMVU8PDMxKSB8IDM5NzksIDB4N2E3YTdhN2EsIDB4ODk4OTg5LCAweDdhN2E3YSwgCisgIDB4ODk4OSwgMHg3YTdhLCAweDg5ODksIDB4N2E3YSwgMHg4OTg5LCAweDdhN2EsIDB4ODk4OTU5LCAweDdhN2E0YSwgCisgIDB4ODk4OTU5LCAweDdhN2E0YSwgMHg4OTg5NTksIDB4N2E3YTRhLCAweDg5ODk1OSwgMHg3YTdhNGEsIDB4ODk4OTU5LCAweDdhN2E0YSwgCisgIDB4ODk4OTU5LCAweDdhN2E0YSwgMHg4OTg5LCAweDdhN2EsIDB4ODk4OTg5LCAweDdhN2E3YSwgMHg4OTg5NTksIDB4N2E3YTRhLCAKKyAgMHg4OTg5NTksIDB4N2E3YTRhLCAweDg5ODk1OSwgMHg3YTdhNGEsIDB4ODk4OTU5LCAweDdhN2E0YSwgMHg4OTg5NTksIDB4N2E3YTRhLCAKKyAgMHg4OTU5LCAweDdhNGEsIDB4ODk1OSwgMHg3YTRhLCAweDdhN2EzYiwgMHg4OTg5NGEsIDB4ODk1OSwgMHg3YTRhLCAKKyAgMHg4OTU5LCAweDdhNGEsIDB4NGE0YTU5LCAweDJjMmMzYiwgMHgzYjNiNGEsIDB4NGE0YTU5LCAweDJjMmMzYiwgMHgzYjNiNGEsIAorICAweDRhNGE1OSwgMHgyYzJjM2IsIDB4M2IzYjRhLCAweDRhNGE1OSwgMHgyYzJjM2IsIDB4M2IzYjRhLCAweDJjMmMyYywgMHg1OTU5NTksIAorICAweDNiM2IzYiwgMHg0YTRhNGEsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDJjMmMyYywgMHg1OTU5NTksIAorICAweDNiM2IzYiwgMHg0YTRhNGEsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDQ0MmMyYywgMHg1NDU5NTksIAorICAweDQ0M2IzYiwgMHg0NDRhNGEsIDB4NDQ0LCAweDJjNDJjMmMsIDB4NTk0NTk1OSwgMHgzYjQzYjNiLCAweDRhNDRhNGEsIDB4NDJlNCwgCisgIDB4NDJlMmMsIDB4NDJlNTksIDB4NDJlM2IsIDB4NDJlNGEsIDB4NDJjLCAweDQ1OSwgMHg0M2IsIDB4NDRhLCAKKyAgMHg0MmU0LCAweDQ0NDQsIDB4NDJlNCwgMHg0NDU1LCAweDNiM2IzYjNiLCAweDRhNGE0YTRhLCAweDNiM2IzYjNiLCAweDRhNGE0YTRhLCAKKyAgMHg0NDU1LCAweDJjMmMyYzJjLCAweDU5NTk1OTU5LCAweDNiM2IzYjNiLCAweDRhNGE0YTRhLCAweDM5Mzk1NSwgMHgzOTM5NTUsIDB4MzkzOTU1LCAKKyAgMHgzOTM5NTUsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAKKyAgMHg0YTRhNGEsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDQyYzJjLCAweDQ1OTU5LCAweDQzYjNiLCAKKyAgMHg0NGE0YSwgMHg0MmMyYywgMHg0NTk1OSwgMHg0M2IzYiwgMHg0NGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgCisgIDB4NGE0YTRhLCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgCisgIDB4NGE0YTRhLCAweDQyYzJjLCAweDQ1OTU5LCAweDQzYjNiLCAweDQ0YTRhLCAweDQyYzJjLCAweDQ1OTU5LCAweDQzYjNiLCAKKyAgMHg0NGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIAorICAweDRhNGE0YSwgMHg0NDQsIDB4MmMyYywgMHg0NDU1LCAweDNiM2IzYjNiLCAweDRhNGE0YTRhLCAweDNiM2IzYjNiLCAweDRhNGE0YTRhLCAKKyAgMHg0NDU1LCAweDJjMmMyYzJjLCAweDU5NTk1OTU5LCAweDNiM2IzYjNiLCAweDRhNGE0YTRhLCAweDQ1NSwgMHgzOTM5MzksIDB4M2IzYjNiLCAKKyAgMHg0YTRhNGEsIDB4MzkzOTM5LCAweDM5Mzk0LCAweDM5Mzk0LCAweDM5MmEzOSwgMHgzOTJhMzksIDB4MzkzOTM5LCAweDQ0NCwgCisgIDB4MzkzOTM5LCAweDQ0NCwgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDM5Mzk1NSwgMHgzOTM5NTUsIDB4NDQ1LCAweDQ0NSwgCisgIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDJjMmMsIDB4NTk1OSwgMHgzYjNiLCAweDRhNGEsIAorICAweDJjMmMsIDB4NTk1OSwgMHgzYjNiLCAweDRhNGEsIDB4MmMyYzJjLCAweDQyYzJjLCAweDJjMmMyYywgMHg0MmMyYywgCisgIDB4MzkzOTM5LCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgCisgIDB4NGE0YTRhLCAweDJjMmMsIDB4NTk1OSwgMHgzYjNiLCAweDRhNGEsIDB4MzkzOTM5LCAweDJhMmEyYSwgMHgzOTQsIAorICAweDM5NCwgMHgyYTM5LCAweDJhMzksIDB4MmEzOSwgMHgyYTM5LCAweDJhMzksIDB4MmEzOSwgMHgyYTM5LCAKKyAgMHgyYTM5LCAweDM5MzkyYSwgMHg0NDQzOSwgMHg0NDQzOSwgMHg0NDM5LCAweDM5MzkyYSwgMHg0NDM5LCAweDM5MzkyYSwgCisgIDB4NDQ0NCwgMHgyYTQsIDB4NDQsIDB4NDM5LCAweDQyYSwgMHg0MmMyYywgMHg0NTk1OSwgMHg0M2IzYiwgCisgIDB4NDRhNGEsIDB4NDJjMmMsIDB4NDU5NTksIDB4NDNiM2IsIDB4NDRhNGEsIDB4NDJjMmMsIDB4NDNiM2IsIDB4NDRhNGEsIAorICAweDQ1NSwgMHg0MzkzOSwgMHg0MmEyYSwgMHg0MzkzOSwgMHg0NDQsIDB4NDM5MzksIDB4NDJhMmEsIDB4NDM5MzksIAorICAweDQyYTJhLCAweDQ0NCwgMHg0MzkzOSwgMHg0MmEyYSwgMHg0MmMyYzJjLCAweDQ1OTU5NTksIDB4NDNiM2IzYiwgMHg0NGE0YTRhLCAKKyAgMHg0MmMyYzJjLCAweDQ1OTU5NTksIDB4NDNiM2IzYiwgMHg0NGE0YTRhLCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgCisgIDB4NDJjMmMsIDB4NDU5NTksIDB4NDNiM2IsIDB4NDRhNGEsIDB4NDJjMmMsIDB4NDU5NTksIDB4NDNiM2IsIDB4NDRhNGEsIAorICAweDQyYzJjLCAweDQ1OTU5LCAweDQzYjNiLCAweDQ0YTRhLCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgCisgIDB4NDJjMmMsIDB4NDU5NTksIDB4NDNiM2IsIDB4NDRhNGEsIDB4MmMyYzJjLCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAKKyAgMHg0MmMyYywgMHg0NTk1OSwgMHg0M2IzYiwgMHg0NGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIAorICAweDQyYzJjLCAweDQ1OTU5LCAweDQzYjNiLCAweDQ0YTRhLCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgCisgIDB4NDJjMmMsIDB4NDU5NTksIDB4NDNiM2IsIDB4NDRhNGEsIDB4NDJlMmMwLCAweDQyZTU5MCwgMHg0MmUzYjAsIDB4NDJlNGEwLCAKKyAgMHgzOTM5MzksIDB4MzkzOTM5LCAweDQ0NCwgMHgzOTM5MzksIDB4MzkzOTM5LCAweDQ0NCwgMHg0NDQsIDB4MmMyYzJjLCAKKyAgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4MmMyYzJjLCAKKyAgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4MzkzOTM5LCAKKyAgMHgyYTJhMmEsIDB4MzkzOTM5LCAweDJhMmEyYSwgMHgyYTJhMmEsIDB4MmEyYTJhLCAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAKKyAgMHg0YTRhNGEsIDB4NDJjMmMsIDB4NDU5NTksIDB4NDNiM2IsIDB4NDRhNGEsIDB4MmMyYzJjMmMsIDB4NTk1OTU5NTksIDB4M2IzYjNiM2IsIAorICAweDRhNGE0YTRhLCAweDQ0MCwgMHgyYzJjMmMsIDB4NDJjMmMsIDB4ODg4LCAweDc3NywgMHg3NzcsIDB4ODg4LCAKKyAgMHg3NzcsIDB4Nzc3LCAweDg4OCwgMHg3NzcsIDB4Nzc3LCAweDg4OCwgMHg3NzcsIDB4Nzc3LCAKKyAgMHgyZmNmMmYsIDB4MmZjZjJmLCAweDFmY2YxZiwgMHgxZmNmMWYsIDB4MWZjZjFmLCAweDFmY2YxZiwgMHgxZjFmY2YxZiwgMHgxZjFmY2YxZiwgCisgIDB4MWZjZjFmLCAweDFmY2YxZiwgMHgxZmNmMWYsIDB4MWZjZjFmLCAweDFmY2YxZiwgMHgxZmNmMWYsIDB4NzRmNywgMHg4NGY4LCAKKyAgMHg0NGY0LCAweDQ0ZjQsIDB4MWZjZjFmLCAweDFmY2YxZiwgMHgxZmNmMWYsIDB4MWZjZjFmLCAweDFmY2YxZiwgMHgxZmNmMWYsIAorICAweDFmY2YxZiwgMHgxZmNmMWYsIDB4NDAsIDB4NDAsIDB4NDQwLCAweDQwLCAweDQwLCAweDQ0MCwgCisgIDB4MCwgMHg0NCwgMHg0NCwgMHg0NCwgMHg4NSwgMHg3NCwgMHg0NywgMHg1OCwgCisgIDB4ODgsIDB4NzcsIDB4NzcsIDB4NGYwLCAweDRmMCwgMHg3NywgMHg3NywgMHg4NywgCisgIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODcsIDB4ODQsIAorICAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg0LCAweDg1LCAweDg1LCAweDg1LCAKKyAgMHg4NSwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NCwgMHg4NSwgMHg4NSwgMHg4NSwgCisgIDB4ODUsIDB4Nzc3LCAweDc3NywgMHg4ODgsIDB4Nzc3LCAweDc3NywgMHg4ODgsIDB4Nzc3LCAKKyAgMHg3NzcsIDB4ODg4LCAweDc3NywgMHg3NzcsIDB4ODg4LCAweDc3NywgMHg3NzcsIDB4ODgsIAorICAweDc3LCAweDc3LCAweDczLCAweDczLCAweDc0LCAweDc0LCAweDc0LCAweDc0LCAKKyAgMHg3NCwgMHg3NCwgMHg3NCwgMHg3NCwgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgCisgIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzUsIDB4NzQsIDB4NzQsIDB4NzQsIDB4NzQsIAorICAweDc0LCAweDc0LCAweDc0LCAweDc0LCAweDc1LCAweDc1LCAweDc1LCAweDc1LCAKKyAgMHg3NSwgMHg3NSwgMHg3NSwgMHg3NSwgMHg4OCwgMHg3NywgMHg3NywgMHg4OCwgCisgIDB4NzcsIDB4NzcsIDB4ODg4OCwgMHg3Nzc3LCAweDc3NzcsIDB4ODg4OCwgMHg3Nzc3LCAweDc3NzcsIAorICAweDg4ODgsIDB4Nzc3NywgMHg3Nzc3LCAweDg4ODgsIDB4Nzc3NywgMHg3Nzc3LCAweDg4OCwgMHg3NzcsIAorICAweDc3NywgMHg4ODgsIDB4Nzc3LCAweDc3NywgMHg0NDQ0LCAweDQ4LCAweDQ4LCAweDQ4LCAKKyAgMHg0OCwgMHg0NywgMHg0NywgMHg0NywgMHg0NywgMHgyZTEsIDB4MmUxLCAweDJlMSwgCisgIDB4MmUxLCAweDUxLCAweDUxLCAweDUxLCAweDRjZjJmLCAweDRjZjFmLCAweDRjZjRmLCAweDRjZjJmLCAKKyAgMHg0Y2YxZiwgMHg0Y2Y0ZiwgMHg4OCwgMHg3NywgMHg3NywgMHg1OCwgMHg1OCwgMHg1OCwgCisgIDB4NTgsIDB4NTcsIDB4NTcsIDB4NTcsIDB4NTcsIDB4NDQ4LCAoMVU8PDMxKSB8IDE5NjcsICgxVTw8MzEpIHwgMzE4MiwgCisgIDB4NDQ0LCAweDU0NSwgMHgwLCAweDAsIDB4MCwgMHg4OCwgMHg3NywgMHgzMywgCisgIDB4NDQsIDB4NTUsIDB4Y2Y0ZiwgMHg4ODgsIDB4Nzc3LCAweDc3NywgMHg4ODgsIDB4Nzc3LCAKKyAgMHg3NzcsIDB4ODg4LCAweDc3NywgMHg3NzcsIDB4ODg4LCAweDc3NywgMHg3NzcsIDB4NDQ0LCAKKyAgMHg0NDQsIDB4NDQ0LCAweDU1NSwgMHg0NDQsIDB4NTU1LCAweDQ0NDQsIDB4Y2Y0ZiwgMHhjZjRmLCAKKyAgMHhjZjRmLCAweGNmNGYsIDB4Y2Y0ZiwgMHhjZjRmLCAweGNmNGYsIDB4Y2Y0ZiwgMHhjZjRmLCAweDg4LCAKKyAgMHg4OCwgMHg3NywgMHg3NywgMHg4OCwgMHg3NywgMHg3NywgMHg4OCwgMHg3NywgCisgIDB4NzcsIDB4ODgsIDB4NzcsIDB4NzcsIDB4NCwgMHg1LCAweDQsIDB4NCwgCisgIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAKKyAgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIAorICAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgCisgIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAKKyAgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIAorICAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgCisgIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAKKyAgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0ZjQsIDB4NDQ0LCAKKyAgMHg0NTUsIDB4NDU1LCAweDg4LCAweDc3LCAweDc3LCAweDg4LCAweDc3LCAweDc3LCAKKyAgMHg0NDQ0LCAweDQ0NDQsIDB4ODgsIDB4NzcsIDB4NzcsIDB4NDQ3NywgMHg0NDQ0LCAweDQ0NzcsIAorICAweDQ0NDQsIDB4NDQ3NywgMHg0NDQ0LCAweDQ0NzQ3LCAweDQ0NDQ0LCAweDQ0NzQ3LCAweDQ0NDQ0LCAweDQ0NzQ3LCAKKyAgMHg0NDQ0NCwgMHg0NDc0NywgMHg0NDQ0NCwgMHg0NDc3LCAweDQ0NDQsIDB4NzcsIDB4NzcsIDB4NzcsIAorICAweDc3LCAweDc3LCAweDg4LCAweDc3LCAweDc3LCAweDg4LCAweDc3LCAweDc3LCAKKyAgMHg4OCwgMHg3NywgMHg3NywgMHg4OCwgMHg3NywgMHg3NywgMHg0NDUzLCAweDQ0NTMsIAorICAweDQ0NTMsIDB4NDQ1NCwgMHg0NDU0LCAweDQ0NTQsIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTUsIDB4NDQ1MywgCisgIDB4NDQ1MywgMHg0NDUzLCAoMVU8PDMxKSB8IDIxNjIsICgxVTw8MzEpIHwgMjE2MiwgKDFVPDwzMSkgfCAyMTYyLCAoMVU8PDMxKSB8IDIxNzgsICgxVTw8MzEpIHwgMjE3OCwgKDFVPDwzMSkgfCAyMTc4LCAKKyAgKDFVPDwzMSkgfCAyMTk1LCAoMVU8PDMxKSB8IDIxOTUsICgxVTw8MzEpIHwgMjE5NSwgKDFVPDwzMSkgfCAyMTYyLCAoMVU8PDMxKSB8IDIxNjIsICgxVTw8MzEpIHwgMjE2MiwgKDFVPDwzMSkgfCAyMTUzLCAoMVU8PDMxKSB8IDIxNTMsIAorICAoMVU8PDMxKSB8IDIxNTMsICgxVTw8MzEpIHwgMjE2OSwgKDFVPDwzMSkgfCAyMTY5LCAoMVU8PDMxKSB8IDIxNjksICgxVTw8MzEpIHwgMjE1MywgKDFVPDwzMSkgfCAyMTUzLCAoMVU8PDMxKSB8IDIxNTMsIDB4NDUzLCAKKyAgMHg0NTMsIDB4NDUzLCAweDQ1NCwgMHg0NTQsIDB4NDU0LCAweDQ1NSwgMHg0NTUsIDB4NDU1LCAKKyAgMHg0NTMsIDB4NDUzLCAweDQ1MywgKDFVPDwzMSkgfCAyNDk5LCAoMVU8PDMxKSB8IDI0OTksICgxVTw8MzEpIHwgMjQ5OSwgKDFVPDwzMSkgfCAyNTEzLCAoMVU8PDMxKSB8IDI1MTMsIAorICAoMVU8PDMxKSB8IDI1MTMsICgxVTw8MzEpIHwgMjUyOCwgKDFVPDwzMSkgfCAyNTI4LCAoMVU8PDMxKSB8IDI1MjgsICgxVTw8MzEpIHwgMjQ5OSwgKDFVPDwzMSkgfCAyNDk5LCAoMVU8PDMxKSB8IDI0OTksICgxVTw8MzEpIHwgMjQ5MSwgCisgICgxVTw8MzEpIHwgMjQ5MSwgKDFVPDwzMSkgfCAyNDkxLCAoMVU8PDMxKSB8IDI1MDUsICgxVTw8MzEpIHwgMjUwNSwgKDFVPDwzMSkgfCAyNTA1LCAoMVU8PDMxKSB8IDI0OTEsICgxVTw8MzEpIHwgMjQ5MSwgKDFVPDwzMSkgfCAyNDkxLCAKKyAgMHg0NDQ1MywgMHg0NDQ1MywgMHg0NDQ1MywgMHg0NDQ1NCwgMHg0NDQ1NCwgMHg0NDQ1NCwgMHg0NDQ1NSwgMHg0NDQ1NSwgCisgIDB4NDQ0NTUsIDB4NDQ0NTMsIDB4NDQ0NTMsIDB4NDQ0NTMsICgxVTw8MzEpIHwgMjA3OCwgKDFVPDwzMSkgfCAyMDc4LCAoMVU8PDMxKSB8IDIwNzgsICgxVTw8MzEpIHwgMjA5NiwgCisgICgxVTw8MzEpIHwgMjA5NiwgKDFVPDwzMSkgfCAyMDk2LCAoMVU8PDMxKSB8IDIxMTUsICgxVTw8MzEpIHwgMjExNSwgKDFVPDwzMSkgfCAyMTE1LCAoMVU8PDMxKSB8IDIwNzgsICgxVTw8MzEpIHwgMjA3OCwgKDFVPDwzMSkgfCAyMDc4LCAKKyAgKDFVPDwzMSkgfCAyMDY4LCAoMVU8PDMxKSB8IDIwNjgsICgxVTw8MzEpIHwgMjA2OCwgKDFVPDwzMSkgfCAyMDg2LCAoMVU8PDMxKSB8IDIwODYsICgxVTw8MzEpIHwgMjA4NiwgKDFVPDwzMSkgfCAyMDY4LCAoMVU8PDMxKSB8IDIwNjgsIAorICAoMVU8PDMxKSB8IDIwNjgsIDB4NDQ1MywgMHg0NDUzLCAweDQ0NTMsIDB4NDQ1NCwgMHg0NDU0LCAweDQ0NTQsIDB4NDQ1NSwgCisgIDB4NDQ1NSwgMHg0NDU1LCAweDQ0NTMsIDB4NDQ1MywgMHg0NDUzLCAoMVU8PDMxKSB8IDIxNjIsICgxVTw8MzEpIHwgMjE2MiwgKDFVPDwzMSkgfCAyMTYyLCAKKyAgKDFVPDwzMSkgfCAyMTc4LCAoMVU8PDMxKSB8IDIxNzgsICgxVTw8MzEpIHwgMjE3OCwgKDFVPDwzMSkgfCAyMTk1LCAoMVU8PDMxKSB8IDIxOTUsICgxVTw8MzEpIHwgMjE5NSwgKDFVPDwzMSkgfCAyMTYyLCAoMVU8PDMxKSB8IDIxNjIsIAorICAoMVU8PDMxKSB8IDIxNjIsICgxVTw8MzEpIHwgMjE1MywgKDFVPDwzMSkgfCAyMTUzLCAoMVU8PDMxKSB8IDIxNTMsICgxVTw8MzEpIHwgMjE2OSwgKDFVPDwzMSkgfCAyMTY5LCAoMVU8PDMxKSB8IDIxNjksICgxVTw8MzEpIHwgMjE1MywgCisgICgxVTw8MzEpIHwgMjE1MywgKDFVPDwzMSkgfCAyMTUzLCAweDQ0NDUzLCAweDQ0NDUzLCAweDQ0NDUzLCAweDQ0NDU0LCAweDQ0NDU0LCAweDQ0NDU0LCAKKyAgMHg0NDQ1NSwgMHg0NDQ1NSwgMHg0NDQ1NSwgMHg0NDQ1MywgMHg0NDQ1MywgMHg0NDQ1MywgKDFVPDwzMSkgfCAyMDc4LCAoMVU8PDMxKSB8IDIwNzgsIAorICAoMVU8PDMxKSB8IDIwNzgsICgxVTw8MzEpIHwgMjA5NiwgKDFVPDwzMSkgfCAyMDk2LCAoMVU8PDMxKSB8IDIwOTYsICgxVTw8MzEpIHwgMjExNSwgKDFVPDwzMSkgfCAyMTE1LCAoMVU8PDMxKSB8IDIxMTUsICgxVTw8MzEpIHwgMjA3OCwgCisgICgxVTw8MzEpIHwgMjA3OCwgKDFVPDwzMSkgfCAyMDc4LCAoMVU8PDMxKSB8IDIwNjgsICgxVTw8MzEpIHwgMjA2OCwgKDFVPDwzMSkgfCAyMDY4LCAoMVU8PDMxKSB8IDIwODYsICgxVTw8MzEpIHwgMjA4NiwgKDFVPDwzMSkgfCAyMDg2LCAKKyAgKDFVPDwzMSkgfCAyMDY4LCAoMVU8PDMxKSB8IDIwNjgsICgxVTw8MzEpIHwgMjA2OCwgMHg1NCwgMHg1NCwgMHg1NCwgMHg1NCwgMHg1NCwgCisgIDB4NTQsIDB4MzQ0NTAsIDB4MzQ0NTAsIDB4MzQ0NTAsIDB4NDQ0NTAsIDB4NDQ0NTAsIDB4NDQ0NTAsIDB4NTQ0NTAsIAorICAweDU0NDUwLCAweDU0NDUwLCAweDM0NDUwLCAweDM0NDUwLCAweDM0NDUwLCAweDMzNDQ1MCwgMHgzMzQ0NTAsIDB4MzM0NDUwLCAKKyAgMHg0NDQ0NTAsIDB4NDQ0NDUwLCAweDQ0NDQ1MCwgMHg1NTQ0NTAsIDB4NTU0NDUwLCAweDU1NDQ1MCwgMHgzMzQ0NTAsIDB4MzM0NDUwLCAKKyAgMHgzMzQ0NTAsIDB4MzMzMzQ0NTAsIDB4MzMzMzQ0NTAsIDB4MzMzMzQ0NTAsIDB4NDQ0NDQ0NTAsIDB4NDQ0NDQ0NTAsIDB4NDQ0NDQ0NTAsIDB4MzMzMzQ0NTAsIAorICAweDMzMzM0NDUwLCAweDMzMzM0NDUwLCAweDM0NTAsIDB4MzQ1MCwgMHgzNDUwLCAweDQ0NTAsIDB4NDQ1MCwgMHg0NDUwLCAKKyAgMHg1NDUwLCAweDU0NTAsIDB4NTQ1MCwgMHgzNDUwLCAweDM0NTAsIDB4MzQ1MCwgMHgzMzQ1MCwgMHgzMzQ1MCwgCisgIDB4MzM0NTAsIDB4NDQ0NTAsIDB4NDQ0NTAsIDB4NDQ0NTAsIDB4NTU0NTAsIDB4NTU0NTAsIDB4NTU0NTAsIDB4MzM0NTAsIAorICAweDMzNDUwLCAweDMzNDUwLCAweDMzMzM0NTAsIDB4MzMzMzQ1MCwgMHgzMzMzNDUwLCAweDQ0NDQ0NTAsIDB4NDQ0NDQ1MCwgMHg0NDQ0NDUwLCAKKyAgMHgzMzMzNDUwLCAweDMzMzM0NTAsIDB4MzMzMzQ1MCwgMHgzNDQ0NTAsIDB4MzQ0NDUwLCAweDM0NDQ1MCwgMHg0NDQ0NTAsIDB4NDQ0NDUwLCAKKyAgMHg0NDQ0NTAsIDB4NTQ0NDUwLCAweDU0NDQ1MCwgMHg1NDQ0NTAsIDB4MzQ0NDUwLCAweDM0NDQ1MCwgMHgzNDQ0NTAsIDB4MzM0NDQ1MCwgCisgIDB4MzM0NDQ1MCwgMHgzMzQ0NDUwLCAweDQ0NDQ0NTAsIDB4NDQ0NDQ1MCwgMHg0NDQ0NDUwLCAweDU1NDQ0NTAsIDB4NTU0NDQ1MCwgMHg1NTQ0NDUwLCAKKyAgMHgzMzQ0NDUwLCAweDMzNDQ0NTAsIDB4MzM0NDQ1MCwgKDFVPDwzMSkgfCAxMTA1LCAoMVU8PDMxKSB8IDExMDUsICgxVTw8MzEpIHwgMTEwNSwgKDFVPDwzMSkgfCAyMDUxLCAoMVU8PDMxKSB8IDIwNTEsIAorICAoMVU8PDMxKSB8IDIwNTEsICgxVTw8MzEpIHwgMTEwNSwgKDFVPDwzMSkgfCAxMTA1LCAoMVU8PDMxKSB8IDExMDUsIDB4MzQ0NTAsIDB4MzQ0NTAsIDB4MzQ0NTAsIDB4NDQ0NTAsIAorICAweDQ0NDUwLCAweDQ0NDUwLCAweDU0NDUwLCAweDU0NDUwLCAweDU0NDUwLCAweDM0NDUwLCAweDM0NDUwLCAweDM0NDUwLCAKKyAgMHgzMzQ0NTAsIDB4MzM0NDUwLCAweDMzNDQ1MCwgMHg0NDQ0NTAsIDB4NDQ0NDUwLCAweDQ0NDQ1MCwgMHg1NTQ0NTAsIDB4NTU0NDUwLCAKKyAgMHg1NTQ0NTAsIDB4MzM0NDUwLCAweDMzNDQ1MCwgMHgzMzQ0NTAsIDB4MzMzMzQ0NTAsIDB4MzMzMzQ0NTAsIDB4MzMzMzQ0NTAsIDB4NDQ0NDQ0NTAsIAorICAweDQ0NDQ0NDUwLCAweDQ0NDQ0NDUwLCAweDMzMzM0NDUwLCAweDMzMzM0NDUwLCAweDMzMzM0NDUwLCAweDM0NDQ1MCwgMHgzNDQ0NTAsIDB4MzQ0NDUwLCAKKyAgMHg0NDQ0NTAsIDB4NDQ0NDUwLCAweDQ0NDQ1MCwgMHg1NDQ0NTAsIDB4NTQ0NDUwLCAweDU0NDQ1MCwgMHgzNDQ0NTAsIDB4MzQ0NDUwLCAKKyAgMHgzNDQ0NTAsIDB4MzM0NDQ1MCwgMHgzMzQ0NDUwLCAweDMzNDQ0NTAsIDB4NDQ0NDQ1MCwgMHg0NDQ0NDUwLCAweDQ0NDQ0NTAsIDB4NTU0NDQ1MCwgCisgIDB4NTU0NDQ1MCwgMHg1NTQ0NDUwLCAweDMzNDQ0NTAsIDB4MzM0NDQ1MCwgMHgzMzQ0NDUwLCAoMVU8PDMxKSB8IDExMDUsICgxVTw8MzEpIHwgMTEwNSwgKDFVPDwzMSkgfCAxMTA1LCAKKyAgKDFVPDwzMSkgfCAyMDUxLCAoMVU8PDMxKSB8IDIwNTEsICgxVTw8MzEpIHwgMjA1MSwgKDFVPDwzMSkgfCAxMTA1LCAoMVU8PDMxKSB8IDExMDUsICgxVTw8MzEpIHwgMTEwNSwgMHgzNDQ1MCwgMHg0NDQ1MCwgCisgIDB4MzQ0NTAsIDB4MzM0NDUwLCAweDQ0NDQ1MCwgMHgzMzQ0NTAsIDB4MzMzMzQ0NTAsIDB4NDQ0NDQ0NTAsIDB4MzMzMzQ0NTAsIDB4MzQ1MCwgCisgIDB4NDQ1MCwgMHgzNDUwLCAweDMzNDUwLCAweDQ0NDUwLCAweDMzNDUwLCAweDMzMzM0NTAsIDB4NDQ0NDQ1MCwgMHgzMzMzNDUwLCAKKyAgMHgzNDQ0NTAsIDB4NDQ0NDUwLCAweDM0NDQ1MCwgMHgzMzQ0NDUwLCAweDQ0NDQ0NTAsIDB4MzM0NDQ1MCwgKDFVPDwzMSkgfCAxMTA1LCAoMVU8PDMxKSB8IDIwNTEsIAorICAoMVU8PDMxKSB8IDExMDUsIDB4MzQ0NTAsIDB4NDQ0NTAsIDB4MzQ0NTAsIDB4MzM0NDUwLCAweDQ0NDQ1MCwgMHgzMzQ0NTAsIDB4MzMzMzQ0NTAsIAorICAweDQ0NDQ0NDUwLCAweDMzMzM0NDUwLCAweDM0NDQ1MCwgMHg0NDQ0NTAsIDB4MzQ0NDUwLCAweDMzNDQ0NTAsIDB4NDQ0NDQ1MCwgMHgzMzQ0NDUwLCAKKyAgKDFVPDwzMSkgfCAxMTA1LCAoMVU8PDMxKSB8IDIwNTEsICgxVTw8MzEpIHwgMTEwNSwgMHg1NSwgKDFVPDwzMSkgfCAzNTA2LCAoMVU8PDMxKSB8IDM0OTQsICgxVTw8MzEpIHwgMzQ5NCwgKDFVPDwzMSkgfCAzNDI0LCAKKyAgKDFVPDwzMSkgfCAzNDEzLCAoMVU8PDMxKSB8IDM0MTMsICgxVTw8MzEpIHwgMzM1MCwgKDFVPDwzMSkgfCAyMjAyLCAoMVU8PDMxKSB8IDMzNDAsICgxVTw8MzEpIHwgMjE4NSwgKDFVPDwzMSkgfCAzMzQwLCAoMVU8PDMxKSB8IDIxODUsIAorICAoMVU8PDMxKSB8IDM1NTAsICgxVTw8MzEpIHwgMzUzOSwgKDFVPDwzMSkgfCAzNTM5LCAoMVU8PDMxKSB8IDM0NjQsICgxVTw8MzEpIHwgMzQ1NCwgKDFVPDwzMSkgfCAzNDU0LCAoMVU8PDMxKSB8IDMzODYsICgxVTw8MzEpIHwgMjUzNCwgCisgICgxVTw8MzEpIHwgMzM3NywgKDFVPDwzMSkgfCAyNTE5LCAoMVU8PDMxKSB8IDMzNzcsICgxVTw8MzEpIHwgMjUxOSwgKDFVPDwzMSkgfCAzNjk2LCAoMVU8PDMxKSB8IDM2ODEsICgxVTw8MzEpIHwgMzY4MSwgKDFVPDwzMSkgfCAzNTA2LCAKKyAgKDFVPDwzMSkgfCAzNDk0LCAoMVU8PDMxKSB8IDM0OTQsICgxVTw8MzEpIHwgMzQyNCwgKDFVPDwzMSkgfCAyMTIzLCAoMVU8PDMxKSB8IDM0MTMsICgxVTw8MzEpIHwgMjEwNCwgKDFVPDwzMSkgfCAzNDEzLCAoMVU8PDMxKSB8IDIxMDQsIAorICAoMVU8PDMxKSB8IDM3NTIsICgxVTw8MzEpIHwgMzczOCwgKDFVPDwzMSkgfCAzNzM4LCAoMVU8PDMxKSB8IDM1NTAsICgxVTw8MzEpIHwgMzUzOSwgKDFVPDwzMSkgfCAzNTM5LCAoMVU8PDMxKSB8IDM0NjQsICgxVTw8MzEpIHwgMjIwMiwgCisgICgxVTw8MzEpIHwgMzQ1NCwgKDFVPDwzMSkgfCAyMTg1LCAoMVU8PDMxKSB8IDM0NTQsICgxVTw8MzEpIHwgMjE4NSwgKDFVPDwzMSkgfCAzOTI0LCAoMVU8PDMxKSB8IDM5MDcsICgxVTw8MzEpIHwgMzkwNywgKDFVPDwzMSkgfCAzNjQ0LCAKKyAgKDFVPDwzMSkgfCAzNjMyLCAoMVU8PDMxKSB8IDM2MzIsICgxVTw8MzEpIHwgMzU1MCwgKDFVPDwzMSkgfCAyMTIzLCAoMVU8PDMxKSB8IDM1MzksICgxVTw8MzEpIHwgMjEwNCwgKDFVPDwzMSkgfCAzNTM5LCAoMVU8PDMxKSB8IDIxMDQsIAorICAoMVU8PDMxKSB8IDM1OTYsICgxVTw8MzEpIHwgMzU4MywgKDFVPDwzMSkgfCAzNTgzLCAoMVU8PDMxKSB8IDM1MDYsICgxVTw8MzEpIHwgMzQ5NCwgKDFVPDwzMSkgfCAzNDk0LCAoMVU8PDMxKSB8IDM2NDQsICgxVTw8MzEpIHwgMzYzMiwgCisgICgxVTw8MzEpIHwgMzYzMiwgKDFVPDwzMSkgfCAzNTUwLCAoMVU8PDMxKSB8IDM1MzksICgxVTw8MzEpIHwgMzUzOSwgKDFVPDwzMSkgfCAzNTE4LCAoMVU8PDMxKSB8IDM0ODMsICgxVTw8MzEpIHwgMzQ4MywgKDFVPDwzMSkgfCAzNDM1LCAKKyAgKDFVPDwzMSkgfCAzNDAzLCAoMVU8PDMxKSB8IDM0MDMsICgxVTw8MzEpIHwgMzM2MCwgKDFVPDwzMSkgfCAyMjEyLCAoMVU8PDMxKSB8IDMzMzEsICgxVTw8MzEpIHwgMjE2OSwgKDFVPDwzMSkgfCAzMzMxLCAoMVU8PDMxKSB8IDIxNjksIAorICAoMVU8PDMxKSB8IDM1NjEsICgxVTw8MzEpIHwgMzUyOSwgKDFVPDwzMSkgfCAzNTI5LCAoMVU8PDMxKSB8IDM0NzQsICgxVTw8MzEpIHwgMzQ0NSwgKDFVPDwzMSkgfCAzNDQ1LCAoMVU8PDMxKSB8IDMzOTUsICgxVTw8MzEpIHwgMjU0MywgCisgICgxVTw8MzEpIHwgMzM2OSwgKDFVPDwzMSkgfCAyNTA1LCAoMVU8PDMxKSB8IDMzNjksICgxVTw8MzEpIHwgMjUwNSwgKDFVPDwzMSkgfCAzNzExLCAoMVU8PDMxKSB8IDM2NjcsICgxVTw8MzEpIHwgMzY2NywgKDFVPDwzMSkgfCAzNTE4LCAKKyAgKDFVPDwzMSkgfCAzNDgzLCAoMVU8PDMxKSB8IDM0ODMsICgxVTw8MzEpIHwgMzQzNSwgKDFVPDwzMSkgfCAyMTM0LCAoMVU8PDMxKSB8IDM0MDMsICgxVTw8MzEpIHwgMjA4NiwgKDFVPDwzMSkgfCAzNDAzLCAoMVU8PDMxKSB8IDIwODYsIAorICAoMVU8PDMxKSB8IDM3NjYsICgxVTw8MzEpIHwgMzcyNSwgKDFVPDwzMSkgfCAzNzI1LCAoMVU8PDMxKSB8IDM1NjEsICgxVTw8MzEpIHwgMzUyOSwgKDFVPDwzMSkgfCAzNTI5LCAoMVU8PDMxKSB8IDM0NzQsICgxVTw8MzEpIHwgMjIxMiwgCisgICgxVTw8MzEpIHwgMzQ0NSwgKDFVPDwzMSkgfCAyMTY5LCAoMVU8PDMxKSB8IDM0NDUsICgxVTw8MzEpIHwgMjE2OSwgKDFVPDwzMSkgfCAzOTQxLCAoMVU8PDMxKSB8IDM4OTEsICgxVTw8MzEpIHwgMzg5MSwgKDFVPDwzMSkgfCAzNjU2LCAKKyAgKDFVPDwzMSkgfCAzNjIxLCAoMVU8PDMxKSB8IDM2MjEsICgxVTw8MzEpIHwgMzU2MSwgKDFVPDwzMSkgfCAyMTM0LCAoMVU8PDMxKSB8IDM1MjksICgxVTw8MzEpIHwgMjA4NiwgKDFVPDwzMSkgfCAzNTI5LCAoMVU8PDMxKSB8IDIwODYsIAorICAoMVU8PDMxKSB8IDM2MDksICgxVTw8MzEpIHwgMzU3MSwgKDFVPDwzMSkgfCAzNTcxLCAoMVU8PDMxKSB8IDM1MTgsICgxVTw8MzEpIHwgMzQ4MywgKDFVPDwzMSkgfCAzNDgzLCAoMVU8PDMxKSB8IDM2NTYsICgxVTw8MzEpIHwgMzYyMSwgCisgICgxVTw8MzEpIHwgMzYyMSwgKDFVPDwzMSkgfCAzNTYxLCAoMVU8PDMxKSB8IDM1MjksICgxVTw8MzEpIHwgMzUyOSwgKDFVPDwzMSkgfCAzMDk4LCAweDRmNSwgKDFVPDwzMSkgfCAzNDY0LCAoMVU8PDMxKSB8IDM0NTQsIAorICAoMVU8PDMxKSB8IDM0NTQsICgxVTw8MzEpIHwgMzQ2NCwgKDFVPDwzMSkgfCAzNDU0LCAoMVU8PDMxKSB8IDM0NTQsICgxVTw8MzEpIHwgMzQ2NCwgKDFVPDwzMSkgfCAzNDU0LCAoMVU8PDMxKSB8IDM0NTQsICgxVTw8MzEpIHwgMzQ2NCwgCisgICgxVTw8MzEpIHwgMzQ1NCwgKDFVPDwzMSkgfCAzNDU0LCAoMVU8PDMxKSB8IDM0NzQsICgxVTw8MzEpIHwgMzQ0NSwgKDFVPDwzMSkgfCAzNDQ1LCAoMVU8PDMxKSB8IDM0NzQsICgxVTw8MzEpIHwgMzQ0NSwgKDFVPDwzMSkgfCAzNDQ1LCAKKyAgKDFVPDwzMSkgfCAzNDc0LCAoMVU8PDMxKSB8IDM0NDUsICgxVTw8MzEpIHwgMzQ0NSwgKDFVPDwzMSkgfCAzNDc0LCAoMVU8PDMxKSB8IDM0NDUsICgxVTw8MzEpIHwgMzQ0NSwgMHg4OCwgMHg3NywgCisgIDB4NzcsIDB4NTQsIDB4NTQsIDB4NTQsIDB4NTQsIDB4NTQsIDB4NTQsIDB4NTQsIAorICAweDU0LCAweDQ4LCAweDQ4LCAweDQ4LCAweDQ4LCAweDQ3LCAweDQ3LCAweDQ3LCAKKyAgMHg0NywgMHg1OCwgMHg1OCwgMHg1OCwgMHg1OCwgMHg1NywgMHg1NywgMHg1NywgCisgIDB4NTcsIDB4MTEsIDB4MTQxLCAweDExLCAweDE0MSwgMHgxNCwgMHgxNDQsIDB4MTEsIAorICAweDE0MSwgKDFVPDwzMSkgfCAzMDU0LCAoMVU8PDMxKSB8IDI0MTMsICgxVTw8MzEpIHwgMzA1NCwgKDFVPDwzMSkgfCAyNDEzLCAoMVU8PDMxKSB8IDMwNTQsICgxVTw8MzEpIHwgMjQxMywgKDFVPDwzMSkgfCAzMDU0LCAKKyAgKDFVPDwzMSkgfCAyNDEzLCAoMVU8PDMxKSB8IDMwNzQsICgxVTw8MzEpIHwgMzA4NiwgKDFVPDwzMSkgfCAyNDM0LCAoMVU8PDMxKSB8IDI0NDcsICgxVTw8MzEpIHwgMzA3NCwgKDFVPDwzMSkgfCAzMDg2LCAoMVU8PDMxKSB8IDI0MzQsIAorICAoMVU8PDMxKSB8IDI0NDcsICgxVTw8MzEpIHwgMzIzMSwgKDFVPDwzMSkgfCAzMjMxLCAoMVU8PDMxKSB8IDM3OTEsICgxVTw8MzEpIHwgMzc5MSwgKDFVPDwzMSkgfCAzMjgxLCAoMVU8PDMxKSB8IDMyODEsICgxVTw8MzEpIHwgMzg0MSwgCisgICgxVTw8MzEpIHwgMzg0MSwgKDFVPDwzMSkgfCAzMjMxLCAoMVU8PDMxKSB8IDMyMzEsICgxVTw8MzEpIHwgMzc5MSwgKDFVPDwzMSkgfCAzNzkxLCAoMVU8PDMxKSB8IDMyODEsICgxVTw8MzEpIHwgMzI4MSwgKDFVPDwzMSkgfCAzODQxLCAKKyAgKDFVPDwzMSkgfCAzODQxLCAoMVU8PDMxKSB8IDMyMzEsICgxVTw8MzEpIHwgMzIzMSwgKDFVPDwzMSkgfCAzNzkxLCAoMVU8PDMxKSB8IDM3OTEsICgxVTw8MzEpIHwgMzI4MSwgKDFVPDwzMSkgfCAzMjgxLCAoMVU8PDMxKSB8IDM4NDEsIAorICAoMVU8PDMxKSB8IDM4NDEsICgxVTw8MzEpIHwgMzIzMSwgKDFVPDwzMSkgfCAzMjMxLCAoMVU8PDMxKSB8IDM3OTEsICgxVTw8MzEpIHwgMzc5MSwgKDFVPDwzMSkgfCAzMjgxLCAoMVU8PDMxKSB8IDMyODEsICgxVTw8MzEpIHwgMzg0MSwgCisgICgxVTw8MzEpIHwgMzg0MSwgKDFVPDwzMSkgfCAzMjE5LCAoMVU8PDMxKSB8IDM3NzksICgxVTw8MzEpIHwgMjYyNSwgKDFVPDwzMSkgfCAyNjM4LCAoMVU8PDMxKSB8IDMyMTksICgxVTw8MzEpIHwgMzc3OSwgKDFVPDwzMSkgfCAyNjI1LCAKKyAgKDFVPDwzMSkgfCAyNjM4LCAweDU5NTk1OSwgMHg1OTU5NTksIDB4NTk1OTU5LCAweDU5NTk1OSwgMHgyYzJjMmMyYywgMHgyYzJjMmMsIDB4NTk1OTU5LCAKKyAgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDU5NTksIDB4NDQ1OTU5LCAweDQ0NGE0YSwgMHg0MCwgMHgwLCAweDQ0MmUwLCAKKyAgMHg0NDJlMCwgMHg0NDJlMCwgMHg0NDJlMCwgMHgyZTJjLCAweDJlM2IsIDB4MmU0YSwgMHgyZTJjLCAweDJlMmMsIAorICAweDJlNGEsIDB4MmU0YSwgMHgzYiwgMHg0YTAsIDB4MmUyYzAsIDB4MmUzYjAsIDB4MmU0YTAsIDB4MmU0YTAsIAorICAweDJlNGEwLCAweDJjMmMyYywgMHgzYjNiM2IsIDB4NGE0YTRhLCAoMVU8PDMxKSB8IDQyNjIsIDB4NGE0YTRhLCAoMVU8PDMxKSB8IDQyNjAsICgxVTw8MzEpIHwgNDI2MCwgCisgIDB4MmMyYzJjLCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4MmMyYzJjLCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4MmMyYzJjLCAweDNiM2IzYiwgCisgIDB4NGE0YTRhLCAweDJjMmMyYywgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDJjMmM1OSwgMHg0NGE3YSwgMHg0NGE3YSwgMHgyYzQsIAorICAweDdhN2E0YSwgMHg3YTdhNDQsIDB4N2E3YTRhLCAweDdhN2E0NCwgMHgyYzJjMmMsIDB4MmMyYzQ0LCAweDU5NTk1OSwgMHg1OTU5NDQsIAorICAweDNiM2IzYiwgMHgzYjNiNDQsIDB4NGE0YTRhLCAweDRhNGE0NCwgMHg3YTdhNGEsIDB4N2E3YTQ0LCAweDdhN2E0YSwgMHg3YTdhNDQsIAorICAweDJjMmMyYywgMHgyYzJjNDQsIDB4NTk1OTU5LCAweDU5NTk0NCwgMHgzYjNiM2IsIDB4M2IzYjQ0LCAweDRhNGE0YSwgMHg0YTRhNDQsIAorICAweDJjMmMyYywgMHgyYzJjNDQsIDB4NTk1OTU5LCAweDU5NTk0NCwgMHgzYjNiM2IsIDB4M2IzYjQ0LCAweDRhNGE0YSwgMHg0YTRhNDQsIAorICAweDJjMmMyYywgMHgyYzJjNDQsIDB4M2IzYjNiLCAweDNiM2I0NCwgMHg0YTRhNGEsIDB4NGE0YTQ0LCAweDJjMmMyYywgMHgyYzJjNDQsIAorICAweDNiM2IzYiwgMHgzYjNiNDQsIDB4NGE0YTRhLCAweDRhNGE0NCwgMHg0N2E0YSwgMHg0N2E0YSwgMHgyYzQsIDB4N2E3YSwgCisgIDB4MmMyYywgMHg3YTdhLCAweDdhN2E3YTdhLCAweDdhN2E3YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIAorICAweDJjMmMyYywgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgzYjNiM2IzYiwgMHgzYjNiM2IzYiwgMHg3YTdhN2EsIDB4MmMyYzJjLCAKKyAgMHg1OTU5NTksIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjMmMsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4M2IzYjNiM2IsIAorICAweDRhMmMyYzRhLCAweDRhM2IzYjRhLCAweDRhM2IzYjRhLCAweDRhMmMyYzRhLCAweDRhM2IzYjRhLCAweDRhM2IzYjRhLCAweDJjMmMzYiwgMHgzYjNiNGEsIAorICAweDRhNGE1OSwgMHgyYzJjM2IsIDB4M2IzYjRhLCAweDRhNGE1OSwgMHgyYzJjM2IsIDB4M2IzYjRhLCAweDRhNGE1OSwgMHgyYzJjM2IsIAorICAweDNiM2I0YSwgMHg0YTRhNTksIDB4N2E3YTdhN2EsIDB4MmM0YTRhNGEsIDB4NGE0YTNiLCAweDU5NTk0YSwgMHg1OTU5NGEsIDB4M2IzYjJjLCAKKyAgMHgzYjNiMmMsIDB4NGE0YTNiLCAweDRhNGEzYiwgMHg1OTU5NGEsIDB4M2IzYjJjLCAweDRhNGEzYiwgMHg1OTU5LCAoMVU8PDMxKSB8IDQyNjQsIAorICAweDRhNGEsIDB4N2E3YSwgMHg3YTdhLCAweDdhN2EsIDB4N2E3YSwgMHg3YTdhLCAweDJjMmMyYywgMHg1OTU5NTksIAorICAweDU5NTk1OTU5LCAweDU5NTk1OSwgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDRhNGE0YTRhLCAweDRhNGE0YSwgMHg3YTdhLCAweDRhNGE0YTRhLCAKKyAgMHg0YTRhNGEsIDB4MmMyYzJjLCAweDNiM2IzYiwgMHg0YTRhNGEsIDB4MmMyYzJjLCAweDRhNGE0YSwgMHg0YTRhNGEsIDB4MmMyYzJjLCAKKyAgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDJjMmMyYywgMHgzYjNiM2IsIDB4NGE0YTRhLCAweDJjMmMyYywgMHg0YTRhNGEsICgxVTw8MzEpIHwgNDI2MiwgCisgIDB4NGE0YTRhLCAoMVU8PDMxKSB8IDQyNjAsICgxVTw8MzEpIHwgNDI2MCwgMHgyYzJjMmMsIDB4M2IzYjNiLCAweDRhNGE0YSwgMHgyYzJjMmMsIDB4M2IzYjNiLCAKKyAgMHg0YTRhNGEsIDB4NGE0YTRhLCAweDRhMmM0YSwgMHg0YTNiNGEsIDB4NGEyYzRhLCAweDRhNGE0YSwgMHgzYjRhLCAweDJjM2IsIAorICAweDNiNGEsIDB4NGE1OSwgMHgzYjRhLCAweDJjM2IsIDB4M2I0YSwgMHg0YTU5LCAweDU1NSwgMHgxZjAsIAorICAweDJlMCwgMHgyZTAsIDB4MmUwLCAweDJlMCwgMHgyZTAsIDB4MmUwLCAweDJlMCwgMHgyZTAsIAorICAweDU1NSwgMHg1NTUsIDB4NDQ0LCAweDQ0NCwgMHg1LCAweDUsIDB4NSwgMHg1LCAKKyAgMHgxLCAweDAsIDB4MWYwLCAweDhhOGEsIDB4OGE4YThhLCAweDhhOGE4YSwgMHg4YThhLCAweDhhOGEsIAorICAweDhhOGEsIDB4OGE4YSwgMHg4YThhOGEsIDB4OGE4YThhLCAweDhhOGE4YSwgMHg4YThhOGEsIDB4OGE4YSwgMHg4YThhLCAKKyAgMHg4YThhLCAweDhhOGEsIDB4OGE4YSwgMHg4YThhLCAweDhhOGEsIDB4OGE4YSwgMHg0OGE4YThhLCAoMVU8PDMxKSB8IDM5OTIsIAorICAoMVU8PDMxKSB8IDM5OTIsICgxVTw8MzEpIHwgMzk5MiwgKDFVPDwzMSkgfCAzOTkyLCAweDhhOGE4YSwgMHg4YThhOGEsIDB4OGE4YSwgMHg4YThhLCAoMVU8PDMxKSB8IDM5OTIsIAorICAoMVU8PDMxKSB8IDM5OTIsICgxVTw8MzEpIHwgMzk5MiwgKDFVPDwzMSkgfCAzOTkyLCAoMVU8PDMxKSB8IDM5OTIsIDB4OGE4YSwgMHg4YThhLCAweDhhOGEsIDB4OGE4YSwgCisgIDB4OGE4YSwgMHg4YThhLCAweDhhOGEsIDB4OGE4YSwgMHg4YThhLCAoMVU8PDMxKSB8IDM5OTIsIDB4OGE4YThhLCAweDhhOGE4YSwgCisgIDB4OGE4YThhLCAoMVU8PDMxKSB8IDM5OTIsICgxVTw8MzEpIHwgMzk5MiwgMHg4YThhOGEsIDB4OGE4YThhLCAoMVU8PDMxKSB8IDM5OTIsICgxVTw8MzEpIHwgMzk5MiwgKDFVPDwzMSkgfCAzOTkyLCAKKyAgKDFVPDwzMSkgfCAzOTkyLCAoMVU8PDMxKSB8IDM5OTIsICgxVTw8MzEpIHwgMzk5MiwgMHg0OGEsIDB4MmU4YSwgMHgyZThhLCAweDJlOGEsIDB4MmU4YSwgCisgIDB4MmU4YSwgMHgyZThhLCAweDJlOGEsIDB4MmU4YSwgMHgyZThhLCAweDJlOGEsIDB4MmU4YSwgMHgyZThhLCAKKyAgMHgyZThhLCAweDJlOGEsIDB4MmU4YSwgMHgyZThhLCAweDJlOGEwLCAweDJlOGEwLCAweDJlOGEwLCAweDJlOGEwLCAKKyAgMHgyZThhMCwgMHgyZThhMCwgMHgyZThhMCwgMHgyZThhMCwgMHgyZThhMCwgMHgyZThhMCwgMHg1MCwgMHg1MCwgCisgIDB4NTAsIDB4NTAsIDB4MCwgMHg0NCwgMHg0NDQ0LCAweDQ0NDQsIDB4NDQ0NCwgMHg0NDQ0LCAKKyAgMHg0NCwgMHg0LCAweDQ0LCAweDQsIDB4NCwgMHg0NCwgMHg0LCAweDQ0LCAKKyAgMHg0LCAweDUsIDB4MmU4OSwgMHgyZTg5LCAweDUyZTRhLCAweDUyZTRhLCAweDJlNGEsIDB4MmU0YSwgCisgIDB4MmU4OTAsIDB4MmU4OTAsIDB4NTJlNGEwLCAweDUyZTRhMCwgMHgyZTRhMCwgMHgyZTRhMCwgMHg4ODgsIDB4ODg4LCAKKyAgMHg4OTg5NTksIDB4ODk4OTQ0LCAweDdhN2E0YSwgMHg3YTdhNDQsIDB4ODk4OTU5LCAweDg5ODk0NCwgMHg3YTdhNGEsIDB4N2E3YTQ0LCAKKyAgMHg4OTg5NTksIDB4ODk4OTQ0LCAweDdhN2E0YSwgMHg3YTdhNDQsIDB4ODk3YSwgMHg4OTRhLCAweDg5NGEsIDB4M2I3YSwgCisgIDB4N2E4OSwgMHg3YTdhLCAweDU5N2EsIDB4NGE4OSwgMHg1OTdhLCAweDRhODksIDB4ODk4OTg5LCAweDdhN2E3YSwgCisgIDB4NTk1OTg5LCAweDRhNGE3YSwgMHg4OTg5ODksIDB4N2E3YTdhLCAweDg5ODk4OSwgMHg3YTdhN2EsIDB4ODk4OSwgMHg4OTg5LCAKKyAgMHg3YTdhLCAweDdhN2EsIDB4ODk4OSwgMHg3YTdhLCAweDQ4OTU5LCAweDQ3YTRhLCAweDg5NTksIDB4N2E0YSwgCisgIDB4ODk1OSwgMHg3YTRhLCAweDQ1OTU5LCAweDQ1OTRhNGEsIDB4NGE0YTRhLCAweDdhN2EsIDB4MCwgKDFVPDwzMSkgfCA3OTYsIAorICAweDQ0YTRhMCwgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAKKyAgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIDB4NCwgMHg0LCAweDQsIAorICAweDJmMmYsIDB4MmYyZiwgMHg0LCAweDQsIDB4NDJlNCwgMHg1ZTUwLCAweDQwLCAweDQwLCAKKyAgMHg1MCwgMHg0MmU0LCAweDQyZTQsIDB4NDJlMCwgMHg1MmY0LCAweDQsIDB4MmMyYzJjLCAweDJjMmMyYzJjLCAKKyAgMHg0YTRhNGEsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHgyYzJjMmMsIDB4MmMyYzJjMmMsIDB4MmMyYzJjLCAweDJjMmMyYywgMHg0YTRhNGEsIAorICAweDU5NTk1OSwgMHgzYjNiM2IsIDB4MmMyYzJjLCAweDRhNGE0YSwgMHg1OTU5NTksIDB4M2IzYjNiLCAweDJjMmM1OSwgKDFVPDwzMSkgfCA5NjUsIAorICAoMVU8PDMxKSB8IDI4MDMsICgxVTw8MzEpIHwgMzIxMCwgKDFVPDwzMSkgfCAxMjI4LCAoMVU8PDMxKSB8IDk2NSwgKDFVPDwzMSkgfCAyODAzLCAoMVU8PDMxKSB8IDMyMTAsICgxVTw8MzEpIHwgMTIyOCwgKDFVPDwzMSkgfCA5NjUsIAorICAoMVU8PDMxKSB8IDI4MDMsICgxVTw8MzEpIHwgMzIxMCwgKDFVPDwzMSkgfCAxMjI4LCAweDRhNGE0YSwgKDFVPDwzMSkgfCAxNzM4LCAoMVU8PDMxKSB8IDIyNTMsICgxVTw8MzEpIHwgMjU3MSwgKDFVPDwzMSkgfCAxODgzLCAKKyAgMHg0MmMyYywgMHg0NGE0YSwgMHg0NTk1OSwgMHg0M2IzYiwgMHgyYzJjMmMsIDB4NGE0YTRhLCAweDU5NTk1OSwgMHgzYjNiM2IsIAorICAweDQyYzJjMmMsICgxVTw8MzEpIHwgMTc2MCwgMHg0NGE0YTRhLCAoMVU8PDMxKSB8IDIyMzEsIDB4NDNiM2IzYiwgKDFVPDwzMSkgfCAxOTA1LCAweDQyYzJjMmMsICgxVTw8MzEpIHwgMTc2MCwgCisgIDB4NDRhNGE0YSwgKDFVPDwzMSkgfCAyMjMxLCAweDQzYjNiM2IsICgxVTw8MzEpIHwgMTkwNSwgKDFVPDwzMSkgfCAzOTcwLCAoMVU8PDMxKSB8IDM5NTcsICgxVTw8MzEpIHwgMzk3MCwgKDFVPDwzMSkgfCAzOTcwLCAKKyAgKDFVPDwzMSkgfCAzOTU3LCAoMVU8PDMxKSB8IDM5NTcsIDB4MmMyYzJjLCAoMVU8PDMxKSB8IDk2NSwgMHg0YTRhNGEsICgxVTw8MzEpIHwgMjgwMywgMHgzYjNiM2IsICgxVTw8MzEpIHwgMTIyOCwgCisgIDB4MmMyYzJjLCAoMVU8PDMxKSB8IDk2NSwgMHg0YTRhNGEsICgxVTw8MzEpIHwgMjgwMywgMHgzYjNiM2IsICgxVTw8MzEpIHwgMTIyOCwgMHgyYzJjMmMsICgxVTw8MzEpIHwgOTY1LCAKKyAgMHg0YTRhNGEsICgxVTw8MzEpIHwgMjgwMywgMHgzYjNiM2IsICgxVTw8MzEpIHwgMTIyOCwgMHgyYzJjMmMsICgxVTw8MzEpIHwgOTY1LCAweDRhNGE0YSwgKDFVPDwzMSkgfCAyODAzLCAKKyAgMHgzYjNiM2IsICgxVTw8MzEpIHwgMTIyOCwgMHg0NDg5ODksIDB4NDQ3YTdhLCAweDQ4OTg5ODksIDB4NDdhN2E3YSwgMHg0ODk4OTg5LCAweDQ3YTdhN2EsIAorICAoMVU8PDMxKSB8IDI3MTksICgxVTw8MzEpIHwgMjY1MSwgMHgzYjJjMmMzYiwgMHg1OTRhNGE1OSwgMHgyYzU5NTkyYywgMHg0YTNiM2I0YSwgMHgyYzJjM2IsIDB4NGE0YTU5LCAKKyAgMHg1OTU5MmMsIDB4M2IzYjRhLCAweDJjMmMsICgxVTw8MzEpIHwgOTc0LCAweDRhNGEsICgxVTw8MzEpIHwgMjc4NywgMHgzYjNiLCAoMVU8PDMxKSB8IDEyMzcsIAorICAweDQyZTJjLCAweDJlNDJjLCAweDJlNDJjLCAweDNiMmMyYzNiLCAweDU5NGE0YTU5LCAweDRhM2IzYjRhLCAweDJjMmMyYzJjLCAweDRhNGE0YTRhLCAKKyAgMHgzYjNiM2IzYiwgMHgzYjJjMmMzYiwgMHg1OTRhNGE1OSwgMHg0YTNiM2I0YSwgMHgyYzJjMmMyYywgMHg0YTRhNGE0YSwgMHgzYjNiM2IzYiwgMHgzYjJjMmMzYiwgCisgIDB4NTk0YTRhNTksIDB4NGEzYjNiNGEsIDB4M2IyYzJjM2IsIDB4NTk0YTRhNTksIDB4NGEzYjNiNGEsIDB4MmMyYzNiLCAweDRhNGE1OSwgMHgzYjNiNGEsIAorICAweDJjMmMyYywgMHg0YTRhNGEsIDB4M2IzYjNiLCAweDJjMmMzYiwgMHg0YTRhNTksIDB4M2IzYjRhLCAweDJjMmMyYywgMHg0YTRhNGEsIAorICAweDNiM2IzYiwgMHgyYzJjM2IsIDB4NGE0YTU5LCAweDNiM2I0YSwgMHgyYzJjM2IsIDB4NGE0YTU5LCAweDNiM2I0YSwgKDFVPDwzMSkgfCAxNzcwLCAKKyAgMHg0NTk1OTU5LCAweDJjMmMyYzJjLCAweDRhNGEzYiwgKDFVPDwzMSkgfCAyNzk0LCAweDU5NTk0YSwgKDFVPDwzMSkgfCAzMjAxLCAweDNiM2IyYywgKDFVPDwzMSkgfCAxMjE5LCAKKyAgMHg0YTRhM2IsICgxVTw8MzEpIHwgMjc5NCwgMHg1OTU5NGEsICgxVTw8MzEpIHwgMzIwMSwgMHgzYjNiMmMsICgxVTw8MzEpIHwgMTIxOSwgMHgyYzJjMmMyYywgMHgyYzJjMmMyYywgCisgIDB4MmMyYzJjLCAweDRhNGE0YSwgMHg1OTU5NTksIDB4M2IzYjNiLCAweDJjMmMyYywgMHgyYzJjMmMsIDB4MmMyYzJjLCAweDQyYzJjMmMsIAorICAweDJjMmMyYywgMHgyYzJjMmMsIDB4MmMyYzJjLCAweDJjMmMyYywgMHgyYzJjMmMsIDB4MmU0MmMwLCAoMVU8PDMxKSB8IDE3MzgsICgxVTw8MzEpIHwgMTc0OCwgCisgICgxVTw8MzEpIHwgMjI1MywgKDFVPDwzMSkgfCAyMjQxLCAoMVU8PDMxKSB8IDE4ODMsICgxVTw8MzEpIHwgMTg5MywgKDFVPDwzMSkgfCAxNzM4LCAoMVU8PDMxKSB8IDE3NDgsICgxVTw8MzEpIHwgMjI1MywgKDFVPDwzMSkgfCAyMjQxLCAKKyAgKDFVPDwzMSkgfCAxODgzLCAoMVU8PDMxKSB8IDE4OTMsIDB4MmU0MmMwLCAweDJjMmM0YSwgMHg0YTRhNTksIDB4M2IzYjU5LCAweDNiM2I0YSwgMHg0YTRhMmMsIAorICAweDU5NTkyYywgMHgyYzJjNCwgMHgyYzNiLCAweDRhNTksIDB4M2I0YSwgMHgyYzNiLCAweDRhNTksIDB4MmMzYiwgCisgIDB4NGE1OSwgMHgzYjRhLCAweDNiNGEsIDB4MmMzYiwgMHg0YTU5LCAweDNiNGEsIDB4MWYsIDB4NCwgCisgIDB4MmUsIDB4MWYxZiwgMHgxZjQxZiwgMHg0MWYsIDB4MCwgMHgyZTQwLCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1MiwgCisgICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAKKyAgKDFVPDwzMSkgfCA0MTUyLCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTIsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTIsIAorICAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1MiwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1MiwgKDFVPDwzMSkgfCA0MTUyLCAweDJlNDQyMiwgMHgyZTU1MjIsIAorICAweDJlNDQyMiwgMHgyZTU1MjIsIDB4NTk1OTU5LCAweDVhNWE1YSwgMHg1YjViNWIsIDB4NTk1OTU5LCAweDVhNWE1YSwgMHg1YjViNWIsIAorICAweDU5NTk1OSwgMHg1YTVhNWEsIDB4NWI1YjViLCAweDU5NTk1OSwgMHg1YTVhNWEsIDB4NWI1YjViLCAweDU5NTksIDB4MjU5NTksIAorICAweDhhOGE4YSwgMHg3YjdiN2IsICgxVTw8MzEpIHwgMzk5MiwgMHg3YjdiN2I3YiwgMHgyOGE4YThhLCAweDI3YjdiN2IsIDB4OGE3YSwgMHg4YTRhLCAKKyAgMHg3YjRiLCAweDRiN2IsIDB4OGE0YSwgMHg3YjRiLCAweDI3YjdiN2IsIDB4OGE4YThhLCAweDdiN2I3YiwgMHg4YThhOGEsIAorICAweDdiN2I3YiwgMHgyZTJkLCAweDU5MmU4OSwgMHg1YTJlOGEsIDB4NGEyZTdhLCAweDRiMmU3YiwgMHg4OTU5MmUwLCAweDhhNWEyZTAsIAorICAweDdhNGEyZTAsIDB4N2I0YjJlMCwgMHg4YThhOGEsIDB4N2I3YjdiLCAweDhhOGE4YSwgMHg3YjdiN2IsIDB4OGE0LCAweDdiNCwgCisgIDB4NWE1YTQsIDB4NWE1YTQsIDB4NWE1YTQsIDB4N2I3YiwgMHg0OGE4YSwgMHg0N2I3YiwgMHg3YjdiLCAweDhhOGEsIAorICAweDdiN2IsIDB4NTk4OTg5LCAweDVhOGE4YSwgMHg0YTdhN2EsIDB4NGI3YjdiLCAweDg5ODk0LCAweDhhOGE0LCAweDdhN2E0LCAKKyAgMHg3YjdiNCwgMHg4OTg5NCwgMHg4YThhNCwgMHg3YTdhNCwgMHg3YjdiNCwgMHg4OTg5NCwgMHg4YThhNCwgMHg3YTdhNCwgCisgIDB4N2I3YjQsIDB4MCwgMHgwLCAoMVU8PDMxKSB8IDQyMiwgKDFVPDwzMSkgfCA0OTksICgxVTw8MzEpIHwgODExLCAoMVU8PDMxKSB8IDg3NiwgKDFVPDwzMSkgfCA2NzcsIAorICAoMVU8PDMxKSB8IDc1NCwgKDFVPDwzMSkgfCA1NDYsICgxVTw8MzEpIHwgNjAxLCAoMVU8PDMxKSB8IDQ0NCwgKDFVPDwzMSkgfCA0NTYsICgxVTw8MzEpIHwgODIzLCAoMVU8PDMxKSB8IDg4OCwgKDFVPDwzMSkgfCA2OTksIAorICAoMVU8PDMxKSB8IDcxMSwgKDFVPDwzMSkgfCA1NTgsICgxVTw8MzEpIHwgNjEzLCAweDRhMmU0YSwgMHg0YjJlNGIsIDB4NTkyZTU5LCAweDVhMmU1YSwgMHg0YTRhMmUwLCAKKyAgMHg0YjRiMmUwLCAweDU5NTkyZTAsIDB4NWE1YTJlMCwgMHgyMmQyZDNjLCAweDRiNGIzYywgMHgzYzNjMmQsIDB4NGI0YjNjLCAweDNjM2MyZCwgCisgIDB4MmQyZDJkLCAweDNjM2MzYywgMHgyZDJkMmQsIDB4M2MzYzNjLCAweDJkMmQyZDJkLCAweDRiNGI0YiwgMHg0YjdiN2IsIDB4NGI0YjRiLCAKKyAgMHgzYzNjM2MsIDB4M2MzYzNjLCAweDRiNGI0YiwgMHgzYzNjM2MsIDB4M2MzYzNjLCAweDJkMmQzYywgMHgzYzNjNGIsIDB4MmQ0LCAKKyAgMHg0YjRiNWEsIDB4M2MzYzNjLCAweDNjM2MzYywgMHgzYzNjM2MsIDB4NGI0YjVhLCAweDJkMmQ1YSwgMHgyZDJkMmQsIDB4MmQyZDJkLCAKKyAgMHg0YjRiNGIsIDB4M2MzYzNjLCAweDRhNGI0YiwgMHg1OTVhNWEsIDB4M2IzYzNjLCAweDQ0YjRiLCAweDQ1YTVhLCAweDQzYzNjLCAKKyAgMHg0YTRhNGEsIDB4NGI0YjRiLCAweDU5NTk1OSwgMHg1YTVhNWEsIDB4NGE0YjRiLCAweDNiM2MzYywgMHg0NGI0YiwgMHg0M2MzYywgCisgIDB4NGE0YTRhLCAweDRiNGI0YiwgMHg0YTRiNGIsIDB4NTk1YTVhLCAweDNiM2MzYywgMHg0NGI0YiwgMHg0NWE1YSwgMHg0M2MzYywgCisgIDB4NGE0YTRhLCAweDRiNGI0YiwgMHg1OTU5NTksIDB4NWE1YTVhLCAweDJkMmQyZCwgMHgzYzNjM2MsIDB4MmQyZDJkLCAweDNjM2MzYywgCisgIDB4MjU5LCAweDI1YSwgMHgyNWIsIDB4MzRhLCAweDM0YiwgMHgzNGMsIDB4NDU4OTg5LCAweDQ0N2E3YSwgCisgIDB4NDU3YTdhLCAweDQ4OTQsIDB4NDg5NSwgMHg0ODk0LCAweDQ4OTUsIDB4NDdhNCwgMHg0N2E1LCAweDQ3YTQsIAorICAweDQ3YTUsIDB4NDg5ODksIDB4NDQ3YTdhLCAweDQ1ODk4OSwgMHg0NTdhN2EsIDB4NDI4YjhiOGIsIDB4NDM3YzdjN2MsICgxVTw8MzEpIHwgMTUwNCwgCisgICgxVTw8MzEpIHwgMTgzOCwgKDFVPDwzMSkgfCAxNDgyLCAoMVU8PDMxKSB8IDE4NDksICgxVTw8MzEpIHwgMTYzNiwgKDFVPDwzMSkgfCAxNjAzLCAoMVU8PDMxKSB8IDE2MTQsICgxVTw8MzEpIHwgMTYyNSwgKDFVPDwzMSkgfCAxNTQ4LCAKKyAgKDFVPDwzMSkgfCAxNTI2LCAoMVU8PDMxKSB8IDE1OTIsICgxVTw8MzEpIHwgMTU3MCwgKDFVPDwzMSkgfCAxNTM3LCAoMVU8PDMxKSB8IDE1MTUsICgxVTw8MzEpIHwgMTU4MSwgKDFVPDwzMSkgfCAxNTU5LCAoMVU8PDMxKSB8IDE0NDksIAorICAoMVU8PDMxKSB8IDE0MTYsICgxVTw8MzEpIHwgMTQ2MCwgKDFVPDwzMSkgfCAxNDI3LCAoMVU8PDMxKSB8IDE0MzgsICgxVTw8MzEpIHwgMTQwNSwgKDFVPDwzMSkgfCAxNDkzLCAoMVU8PDMxKSB8IDE0NzEsIDB4NDQyZTRiMjAsIAorICAweDQ0MmU0YzMwLCAweDQ0MmU1YjIwLCAweDQ0MmU1YjIwLCAoMVU8PDMxKSB8IDE3MjcsICgxVTw8MzEpIHwgMTg3MiwgKDFVPDwzMSkgfCAxNzA0LCAoMVU8PDMxKSB8IDE2NTksIDB4NDg5ODkxOSwgCisgIDB4NDhhOGExYSwgMHg0NDhiOGIxYiwgMHg0N2E3YTFhLCAweDQ3YjdiMWIsIDB4NDQ3YzdjMWMsIDB4NDI0ODk4OTIsIDB4NDI0N2E3YTIsIDB4MzJjMmMyYywgCisgIDB4NDJkMmQyZCwgKDFVPDwzMSkgfCAzMTY3LCAweDI0YTRhNGEsIDB4MjRiNGI0YiwgMHgzNGM0YzRjLCAweDI4OTg5ODksIDB4MjhhOGE4YSwgMHgyOGI4YjhiLCAKKyAgMHgyN2E3YTdhLCAweDI3YjdiN2IsIDB4MzdjN2M3YywgMHgyNTk1OTU5LCAweDI1YTVhNWEsIDB4MjViNWI1YiwgMHgzMmMyZTAsIDB4NDJkMmUwLCAKKyAgKDFVPDwzMSkgfCAzMTUwLCAweDI0YTJlMCwgMHgyNGIyZTAsIDB4MzRjMmUwLCAweDI4OTJlMCwgMHgyOGEyZTAsIDB4MjhiMmUwLCAweDI3YTJlMCwgCisgIDB4MjdiMmUwLCAweDM3YzJlMCwgMHgyNTkyZTAsIDB4MjVhMmUwLCAweDI1YjJlMCwgMHgyM2IyZTAsIDB4MzNjMmUwLCAweDQzZDJlMCwgCisgIDB4MjNiM2IzYiwgMHgzM2MzYzNjLCAweDQzZDNkM2QsIDB4MjRhNGE0YSwgMHgyNGI0YjRiLCAweDM0YzRjNGMsIDB4MjU5NTk1OSwgMHgyNWE1YTVhLCAKKyAgMHgyNWI1YjViLCAweDI3YTRhN2EsIDB4MjdiNGI3YiwgMHg0MzdjNGM3YywgMHgyNGE4OTRhLCAweDI0YThhNGEsIDB4NDI0YjhiNGIsIDB4MjdhODk3YSwgCisgIDB4MjdhOGE3YSwgMHg0MjdiOGI3YiwgMHgyNTk4OTU5LCAweDI1YThhNWEsIDB4NDI1YjhiNWIsIDB4MjRhODk0YSwgMHgyNGE4YTRhLCAweDQyNGI4YjRiLCAKKyAgMHgyNTk4OTU5LCAweDI1YThhNWEsIDB4NDI1YjhiNWIsIDB4MjRhN2E0YSwgMHgyNGI3YjRiLCAweDQzNGM3YzRjLCAweDI4OTdhODksIDB4MjhhN2E4YSwgCisgIDB4NDI4YjdiOGIsIDB4MjU5N2E1OSwgMHgyNWE3YTVhLCAweDQyNWI3YjViLCAweDI0YTdhNGEsIDB4MjRiN2I0YiwgMHg0MzRjN2M0YywgMHgyNTk3YTU5LCAKKyAgMHgyNWE3YTVhLCAweDQyNWI3YjViLCAweDI4OTU5ODksIDB4MjhhNWE4YSwgMHg0MjhiNWI4YiwgMHgyN2E1OTdhLCAweDI3YTVhN2EsIDB4NDI3YjViN2IsIAorICAoMVU8PDMxKSB8IDE2NzAsICgxVTw8MzEpIHwgMTY5MywgMHgyNGE4OTRhLCAweDI0YThhNGEsIDB4NDI0YjhiNGIsIDB4MjU5ODk1OSwgMHgyNWE4YTVhLCAweDQyNWI4YjViLCAKKyAgMHgyNGE4OTRhLCAweDI0YThhNGEsIDB4NDI0YjhiNGIsIDB4MjU5ODk1OSwgMHgyNWE4YTVhLCAweDQyNWI4YjViLCAweDI0YTdhNGEsIDB4MjRiN2I0YiwgCisgIDB4NDM0YzdjNGMsIDB4MjU5N2E1OSwgMHgyNWE3YTVhLCAweDQyNWI3YjViLCAweDI0YTdhNGEsIDB4MjRiN2I0YiwgMHg0MzRjN2M0YywgMHgyNTk3YTU5LCAKKyAgMHgyNWE3YTVhLCAweDQyNWI3YjViLCAweDI3YTRhN2EsIDB4MjdiNGI3YiwgMHg0MzdjNGM3YywgMHgyODk1OTg5LCAweDI4YTVhOGEsIDB4NDI4YjViOGIsIAorICAweDI3YTU5N2EsIDB4MjdhNWE3YSwgMHg0MjdiNWI3YiwgKDFVPDwzMSkgfCAyNzAsICgxVTw8MzEpIHwgMTEzNSwgKDFVPDwzMSkgfCAxOTM1LCAoMVU8PDMxKSB8IDE3MjcsICgxVTw8MzEpIHwgMTg3MiwgCisgICgxVTw8MzEpIHwgMTcwNCwgKDFVPDwzMSkgfCAxNjU5LCAweDMyYzJjMmMsIDB4NDJkMmQyZCwgKDFVPDwzMSkgfCAzMTY3LCAweDI0YTRhNGEsIDB4MjRiNGI0YiwgMHgzNGM0YzRjLCAKKyAgMHgzMmMyZTJjLCAweDQyZDJlMmQsICgxVTw8MzEpIHwgMzE1NywgMHgyNGEyZTRhLCAweDI0YjJlNGIsIDB4MzRjMmU0YywgMHgyODkyZTg5LCAweDI4YTJlOGEsIAorICAweDI4YjJlOGIsIDB4MjdhMmU3YSwgMHgyN2IyZTdiLCAweDM3YzJlN2MsIDB4MjU5MmU1OSwgMHgyNWEyZTVhLCAweDI1YjJlNWIsIDB4MjNiMmUzYiwgCisgIDB4MzNjMmUzYywgMHg0M2QyZTNkLCAweDI4OTg5ODksIDB4MjhhOGE4YSwgMHgyOGI4YjhiLCAweDI3YTdhN2EsIDB4MjdiN2I3YiwgMHgzN2M3YzdjLCAKKyAgMHgyNTk1OTU5LCAweDI1YTVhNWEsIDB4MjViNWI1YiwgMHgyM2IzYjNiLCAweDMzYzNjM2MsIDB4NDNkM2QzZCwgKDFVPDwzMSkgfCAzNTcsICgxVTw8MzEpIHwgMzc5LCAKKyAgKDFVPDwzMSkgfCAxMzkzLCAoMVU8PDMxKSB8IDMxMywgKDFVPDwzMSkgfCAzMzUsICgxVTw8MzEpIHwgMTgyNiwgKDFVPDwzMSkgfCAxMzgxLCAoMVU8PDMxKSB8IDEzNjksIDB4MjQ4OTIsIDB4MjQ4YTIsIAorICAweDI0OGIyLCAweDI0N2EyLCAweDI0N2IyLCAweDM0N2MzLCAweDI0ODkyLCAweDI0N2EyLCAweDI4OTg5ODksIDB4MjhhOGE4YSwgCisgIDB4NDI4YjhiOGIsIDB4MjdhN2E3YSwgMHgyN2I3YjdiLCAweDQzN2M3YzdjLCAoMVU8PDMxKSB8IDE3MDQsICgxVTw8MzEpIHwgMTY1OSwgMHgyODk0ODk4OSwgMHgyOGE0OGE4YSwgCisgICgxVTw8MzEpIHwgMTcxNywgMHgyN2E0N2E3YSwgMHgyN2I0N2I3YiwgKDFVPDwzMSkgfCAxODYyLCAoMVU8PDMxKSB8IDE2ODEsICgxVTw8MzEpIHwgMTY0NywgKDFVPDwzMSkgfCAxNzI3LCAoMVU8PDMxKSB8IDE4NzIsIAorICAoMVU8PDMxKSB8IDE3MDQsICgxVTw8MzEpIHwgMTY1OSwgKDFVPDwzMSkgfCAxNzI3LCAoMVU8PDMxKSB8IDE4NzIsICgxVTw8MzEpIHwgMTcwNCwgKDFVPDwzMSkgfCAxNjU5LCAoMVU8PDMxKSB8IDE3MjcsICgxVTw8MzEpIHwgMTg3MiwgCisgICgxVTw8MzEpIHwgMTcwNCwgKDFVPDwzMSkgfCAxNjU5LCAoMVU8PDMxKSB8IDEwOTUsICgxVTw8MzEpIHwgMTc4MCwgKDFVPDwzMSkgfCAzMTY1LCAoMVU8PDMxKSB8IDI2MCwgKDFVPDwzMSkgfCAxMTI1LCAoMVU8PDMxKSB8IDE5MjUsIAorICAoMVU8PDMxKSB8IDEwOTUsICgxVTw8MzEpIHwgMTc4MCwgKDFVPDwzMSkgfCAzMTY1LCAoMVU8PDMxKSB8IDI2MCwgKDFVPDwzMSkgfCAxMTI1LCAoMVU8PDMxKSB8IDE5MjUsICgxVTw8MzEpIHwgOTAwLCAoMVU8PDMxKSB8IDkzMCwgCisgICgxVTw8MzEpIHwgNjI1LCAoMVU8PDMxKSB8IDY1NiwgKDFVPDwzMSkgfCAyNjAsICgxVTw8MzEpIHwgMTEyNSwgKDFVPDwzMSkgfCAxOTI1LCAoMVU8PDMxKSB8IDEwOTUsICgxVTw8MzEpIHwgMTc4MCwgKDFVPDwzMSkgfCAzMTY1LCAKKyAgKDFVPDwzMSkgfCA3NjYsICgxVTw8MzEpIHwgMTE5OSwgKDFVPDwzMSkgfCA1MTEsICgxVTw8MzEpIHwgMTE4OSwgKDFVPDwzMSkgfCAyNTAsICgxVTw8MzEpIHwgMTExNSwgKDFVPDwzMSkgfCAxOTE1LCAoMVU8PDMxKSB8IDQwMSwgCisgICgxVTw8MzEpIHwgNDc4LCAoMVU8PDMxKSB8IDExNjgsIDB4MjJjNGEyYywgMHgyMmM0YjJjLCAweDMyYzRjMmMsIDB4MjRhMmUwLCAweDI0YjJlMCwgMHgzNGMyZTAsIAorICAweDIzYjRhM2IsIDB4MjNiNGIzYiwgMHgzM2M0YzNjLCAweDI0YTJlMCwgMHgyNGIyZTAsIDB4MzRjMmUwLCAweDIyYzU5MmMsIDB4MjJjNWEyYywgCisgIDB4MjJjNWIyYywgMHgyNTkyZTAsIDB4MjVhMmUwLCAweDI1YjJlMCwgMHgyNGE1OTRhLCAweDI0YTVhNGEsIDB4MjRiNWI0YiwgMHgyNTkyZTAsIAorICAweDI1YTJlMCwgMHgyNWIyZTAsIDB4MjNiNTkzYiwgMHgyM2I1YTNiLCAweDIzYjViM2IsIDB4MjU5MmUwLCAweDI1YTJlMCwgMHgyNWIyZTAsIAorICAweDIyYzNiMmMsIDB4MzJjM2MyYywgMHg0MmQzZDJkLCAweDIzYjJlMCwgMHgzM2MyZTAsIDB4NDNkMmUwLCAweDIyYzRhMmMsIDB4MjJjNGIyYywgCisgIDB4MzJjNGMyYywgMHgyNGEyZTAsIDB4MjRiMmUwLCAweDM0YzJlMCwgMHgyM2I0YTNiLCAweDIzYjRiM2IsIDB4MzNjNGMzYywgMHgyNGEyZTAsIAorICAweDI0YjJlMCwgMHgzNGMyZTAsIDB4MjJjNTkyYywgMHgyMmM1YTJjLCAweDIyYzViMmMsIDB4MjU5MmUwLCAweDI1YTJlMCwgMHgyNWIyZTAsIAorICAweDI0YTU5NGEsIDB4MjRhNWE0YSwgMHgyNGI1YjRiLCAweDI1OTJlMCwgMHgyNWEyZTAsIDB4MjViMmUwLCAweDIzYjU5M2IsIDB4MjNiNWEzYiwgCisgIDB4MjNiNWIzYiwgMHgyNTkyZTAsIDB4MjVhMmUwLCAweDI1YjJlMCwgMHgyMmMzYjJjLCAweDMyYzNjMmMsIDB4NDJkM2QyZCwgMHgyM2IyZTAsIAorICAweDMzYzJlMCwgMHg0M2QyZTAsIDB4MjJjNGEyYywgMHgyMmM0YjJjLCAweDMyYzRjMmMsIDB4MjRhMmUwLCAweDI0YjJlMCwgMHgzNGMyZTAsIAorICAweDIzYjRhM2IsIDB4MjNiNGIzYiwgMHgzM2M0YzNjLCAweDI0YTJlMCwgMHgyNGIyZTAsIDB4MzRjMmUwLCAweDIyYzU5MmMsIDB4MjJjNWEyYywgCisgIDB4MjJjNWIyYywgMHgyNTkyZTAsIDB4MjVhMmUwLCAweDI1YjJlMCwgMHgyNGE1OTRhLCAweDI0YTVhNGEsIDB4MjRiNWI0YiwgMHgyNTkyZTAsIAorICAweDI1YTJlMCwgMHgyNWIyZTAsIDB4MjNiNTkzYiwgMHgyM2I1YTNiLCAweDIzYjViM2IsIDB4MjU5MmUwLCAweDI1YTJlMCwgMHgyNWIyZTAsIAorICAweDIyYzNiMmMsIDB4MzJjM2MyYywgMHg0MmQzZDJkLCAweDIzYjJlMCwgMHgzM2MyZTAsIDB4NDNkMmUwLCAoMVU8PDMxKSB8IDEwOTUsICgxVTw8MzEpIHwgMTc4MCwgCisgICgxVTw8MzEpIHwgMzE2NSwgMHgyNGE0NGE0YSwgMHgyNGI0NGI0YiwgMHgzNGM0NGM0YywgMHgyNTk0NTk1OSwgMHgyNWE0NWE1YSwgMHgyNWI0NWI1YiwgKDFVPDwzMSkgfCA0MzQsIAorICAoMVU8PDMxKSB8IDUxMSwgKDFVPDwzMSkgfCAxMTg5LCAoMVU8PDMxKSB8IDU3MCwgKDFVPDwzMSkgfCA2MjUsICgxVTw8MzEpIHwgNjU2LCAweDI0YTQ0YTRhLCAweDI0YjQ0YjRiLCAweDM0YzQ0YzRjLCAKKyAgMHgyNTk0NTk1OSwgMHgyNWE0NWE1YSwgMHgyNWI0NWI1YiwgKDFVPDwzMSkgfCA0MzQsICgxVTw8MzEpIHwgNTExLCAoMVU8PDMxKSB8IDExODksICgxVTw8MzEpIHwgNTcwLCAoMVU8PDMxKSB8IDYyNSwgCisgICgxVTw8MzEpIHwgNjU2LCAoMVU8PDMxKSB8IDEwOTUsICgxVTw8MzEpIHwgMTc4MCwgKDFVPDwzMSkgfCAzMTY1LCAoMVU8PDMxKSB8IDI2MCwgKDFVPDwzMSkgfCAxMTI1LCAoMVU8PDMxKSB8IDE5MjUsICgxVTw8MzEpIHwgMTA5NSwgCisgICgxVTw8MzEpIHwgMTc4MCwgKDFVPDwzMSkgfCAzMTY1LCAoMVU8PDMxKSB8IDI2MCwgKDFVPDwzMSkgfCAxMTI1LCAoMVU8PDMxKSB8IDE5MjUsICgxVTw8MzEpIHwgMzAyLCAoMVU8PDMxKSB8IDMyNCwgKDFVPDwzMSkgfCAxMTU3LCAKKyAgKDFVPDwzMSkgfCAzNDYsICgxVTw8MzEpIHwgMzY4LCAoMVU8PDMxKSB8IDM5MCwgKDFVPDwzMSkgfCA4MDAsICgxVTw8MzEpIHwgODY1LCAoMVU8PDMxKSB8IDE3MTUsICgxVTw8MzEpIHwgNjY2LCAoMVU8PDMxKSB8IDc0MywgCisgICgxVTw8MzEpIHwgMTg2MCwgKDFVPDwzMSkgfCAxOTg1LCAoMVU8PDMxKSB8IDE5NzMsIDB4Mjg5NDg5ODksIDB4MjhhNDhhOGEsICgxVTw8MzEpIHwgMTcxNywgMHgyN2E0N2E3YSwgMHgyN2I0N2I3YiwgCisgICgxVTw8MzEpIHwgMTg2MiwgKDFVPDwzMSkgfCAxOTg1LCAoMVU8PDMxKSB8IDE5NzMsIDB4Mjg5NDg5ODksIDB4MjhhNDhhOGEsICgxVTw8MzEpIHwgMTcxNywgMHgyN2E0N2E3YSwgMHgyN2I0N2I3YiwgCisgICgxVTw8MzEpIHwgMTg2MiwgKDFVPDwzMSkgfCAxOTg1LCAoMVU8PDMxKSB8IDE5NzMsICgxVTw8MzEpIHwgODU1LCAoMVU8PDMxKSB8IDkyMCwgKDFVPDwzMSkgfCAxNzI3LCAoMVU8PDMxKSB8IDczMywgKDFVPDwzMSkgfCA3ODYsIAorICAoMVU8PDMxKSB8IDE4NzIsICgxVTw8MzEpIHwgMTcwNCwgKDFVPDwzMSkgfCAxNjU5LCAweDI4OTg5ODksIDB4MjhhOGE4YSwgMHg0MjhiOGI4YiwgMHgyN2E3YTdhLCAweDI3YjdiN2IsIAorICAweDQzN2M3YzdjLCAoMVU8PDMxKSB8IDE3MDQsICgxVTw8MzEpIHwgMTY1OSwgMHgyN2EyZTAsICgxVTw8MzEpIHwgMTcyNywgKDFVPDwzMSkgfCAxODcyLCAoMVU8PDMxKSB8IDE3MDQsICgxVTw8MzEpIHwgMTY1OSwgCisgIDB4MjdhM2I3YSwgMHgyN2IzYjdiLCAweDQzN2MzYzdjLCAweDIzYjQ3YTNiLCAweDIzYjQ3YjNiLCAweDMzYzQ3YzNjLCAoMVU8PDMxKSB8IDg1NSwgKDFVPDwzMSkgfCA5MjAsIAorICAoMVU8PDMxKSB8IDE3MjcsICgxVTw8MzEpIHwgNzMzLCAoMVU8PDMxKSB8IDc4NiwgKDFVPDwzMSkgfCAxODcyLCAoMVU8PDMxKSB8IDE3MDQsICgxVTw8MzEpIHwgMTY1OSwgKDFVPDwzMSkgfCA4NTUsICgxVTw8MzEpIHwgOTIwLCAKKyAgKDFVPDwzMSkgfCAxNzI3LCAoMVU8PDMxKSB8IDczMywgKDFVPDwzMSkgfCA3ODYsICgxVTw8MzEpIHwgMTg3MiwgKDFVPDwzMSkgfCA4NTUsICgxVTw8MzEpIHwgOTIwLCAoMVU8PDMxKSB8IDE3MjcsICgxVTw8MzEpIHwgNzMzLCAKKyAgKDFVPDwzMSkgfCA3ODYsICgxVTw8MzEpIHwgMTg3MiwgKDFVPDwzMSkgfCA4NTUsICgxVTw8MzEpIHwgOTIwLCAoMVU8PDMxKSB8IDE3MjcsICgxVTw8MzEpIHwgNzMzLCAoMVU8PDMxKSB8IDc4NiwgKDFVPDwzMSkgfCAxODcyLCAKKyAgKDFVPDwzMSkgfCA0MzQsICgxVTw8MzEpIHwgNTExLCAoMVU8PDMxKSB8IDExODksICgxVTw8MzEpIHwgNDM0LCAoMVU8PDMxKSB8IDUxMSwgKDFVPDwzMSkgfCAxMTg5LCAoMVU8PDMxKSB8IDQzNCwgKDFVPDwzMSkgfCA1MTEsIAorICAoMVU8PDMxKSB8IDExODksICgxVTw8MzEpIHwgNDM0LCAoMVU8PDMxKSB8IDUxMSwgKDFVPDwzMSkgfCAxMTg5LCAoMVU8PDMxKSB8IDQzNCwgKDFVPDwzMSkgfCA1MTEsICgxVTw8MzEpIHwgMTE4OSwgKDFVPDwzMSkgfCAyNjAsIAorICAoMVU8PDMxKSB8IDExMjUsICgxVTw8MzEpIHwgMTkyNSwgKDFVPDwzMSkgfCA4MzUsICgxVTw8MzEpIHwgOTAwLCAoMVU8PDMxKSB8IDkzMCwgKDFVPDwzMSkgfCA2ODksICgxVTw8MzEpIHwgNzY2LCAoMVU8PDMxKSB8IDExOTksIAorICAoMVU8PDMxKSB8IDU3MCwgKDFVPDwzMSkgfCA2MjUsICgxVTw8MzEpIHwgNjU2LCAoMVU8PDMxKSB8IDEwOTUsICgxVTw8MzEpIHwgMTc4MCwgKDFVPDwzMSkgfCAzMTY1LCAoMVU8PDMxKSB8IDQzNCwgKDFVPDwzMSkgfCA1MTEsIAorICAoMVU8PDMxKSB8IDExODksICgxVTw8MzEpIHwgMjYwLCAoMVU8PDMxKSB8IDExMjUsICgxVTw8MzEpIHwgMTkyNSwgKDFVPDwzMSkgfCA4NDUsICgxVTw8MzEpIHwgOTEwLCAoMVU8PDMxKSB8IDk0MCwgKDFVPDwzMSkgfCA3MjMsIAorICAoMVU8PDMxKSB8IDc3NiwgKDFVPDwzMSkgfCAxMjA5LCAoMVU8PDMxKSB8IDU3MCwgKDFVPDwzMSkgfCA2MjUsICgxVTw8MzEpIHwgNjU2LCAoMVU8PDMxKSB8IDEwOTUsICgxVTw8MzEpIHwgMTc4MCwgKDFVPDwzMSkgfCAzMTY1LCAKKyAgKDFVPDwzMSkgfCA1NzAsICgxVTw8MzEpIHwgNjI1LCAoMVU8PDMxKSB8IDY1NiwgKDFVPDwzMSkgfCA1NzAsICgxVTw8MzEpIHwgNjI1LCAoMVU8PDMxKSB8IDY1NiwgKDFVPDwzMSkgfCA0MTEsICgxVTw8MzEpIHwgNDg4LCAKKyAgKDFVPDwzMSkgfCAxMTc4LCAoMVU8PDMxKSB8IDUzNSwgKDFVPDwzMSkgfCA1OTAsICgxVTw8MzEpIHwgNjQ1LCAoMVU8PDMxKSB8IDI4MSwgKDFVPDwzMSkgfCAxMTQ2LCAoMVU8PDMxKSB8IDE5NDYsICgxVTw8MzEpIHwgNDM0LCAKKyAgKDFVPDwzMSkgfCA1MTEsICgxVTw8MzEpIHwgMTE4OSwgKDFVPDwzMSkgfCA1NzAsICgxVTw8MzEpIHwgNjI1LCAoMVU8PDMxKSB8IDY1NiwgKDFVPDwzMSkgfCAyNjAsICgxVTw8MzEpIHwgMTEyNSwgKDFVPDwzMSkgfCAxOTI1LCAKKyAgKDFVPDwzMSkgfCA0MTEsICgxVTw8MzEpIHwgNDg4LCAoMVU8PDMxKSB8IDExNzgsICgxVTw8MzEpIHwgNTM1LCAoMVU8PDMxKSB8IDU5MCwgKDFVPDwzMSkgfCA2NDUsICgxVTw8MzEpIHwgMjgxLCAoMVU8PDMxKSB8IDExNDYsIAorICAoMVU8PDMxKSB8IDE5NDYsICgxVTw8MzEpIHwgNDM0LCAoMVU8PDMxKSB8IDUxMSwgKDFVPDwzMSkgfCAxMTg5LCAoMVU8PDMxKSB8IDU3MCwgKDFVPDwzMSkgfCA2MjUsICgxVTw8MzEpIHwgNjU2LCAoMVU8PDMxKSB8IDI2MCwgCisgICgxVTw8MzEpIHwgMTEyNSwgKDFVPDwzMSkgfCAxOTI1LCAweDMyYzJjMywgMHg0MmQyZDQsICgxVTw8MzEpIHwgMzE3NSwgKDFVPDwzMSkgfCA4NTUsICgxVTw8MzEpIHwgOTIwLCAoMVU8PDMxKSB8IDE3MjcsIAorICAoMVU8PDMxKSB8IDczMywgKDFVPDwzMSkgfCA3ODYsICgxVTw8MzEpIHwgMTg3MiwgKDFVPDwzMSkgfCAxNzA0LCAoMVU8PDMxKSB8IDE2NTksICgxVTw8MzEpIHwgODU1LCAoMVU8PDMxKSB8IDkyMCwgKDFVPDwzMSkgfCAxNzI3LCAKKyAgKDFVPDwzMSkgfCA3MzMsICgxVTw8MzEpIHwgNzg2LCAoMVU8PDMxKSB8IDE4NzIsICgxVTw8MzEpIHwgODU1LCAoMVU8PDMxKSB8IDkyMCwgKDFVPDwzMSkgfCAxNzI3LCAoMVU8PDMxKSB8IDczMywgKDFVPDwzMSkgfCA3ODYsIAorICAoMVU8PDMxKSB8IDE4NzIsICgxVTw8MzEpIHwgMTcwNCwgKDFVPDwzMSkgfCAxNjU5LCAoMVU8PDMxKSB8IDg1NSwgKDFVPDwzMSkgfCA5MjAsICgxVTw8MzEpIHwgMTcyNywgKDFVPDwzMSkgfCA3MzMsICgxVTw8MzEpIHwgNzg2LCAKKyAgKDFVPDwzMSkgfCAxODcyLCAoMVU8PDMxKSB8IDg1NSwgKDFVPDwzMSkgfCA5MjAsICgxVTw8MzEpIHwgMTcyNywgKDFVPDwzMSkgfCA3MzMsICgxVTw8MzEpIHwgNzg2LCAoMVU8PDMxKSB8IDE4NzIsICgxVTw8MzEpIHwgMTcwNCwgCisgICgxVTw8MzEpIHwgMTY1OSwgKDFVPDwzMSkgfCAzNTcsICgxVTw8MzEpIHwgMzc5LCAoMVU8PDMxKSB8IDEzOTMsICgxVTw8MzEpIHwgMzEzLCAoMVU8PDMxKSB8IDMzNSwgKDFVPDwzMSkgfCAxODI2LCAoMVU8PDMxKSB8IDEzODEsIAorICAoMVU8PDMxKSB8IDEzNjksICgxVTw8MzEpIHwgMzAyLCAoMVU8PDMxKSB8IDMyNCwgKDFVPDwzMSkgfCAxMTU3LCAoMVU8PDMxKSB8IDM0NiwgKDFVPDwzMSkgfCAzNjgsICgxVTw8MzEpIHwgMzkwLCAoMVU8PDMxKSB8IDg1NSwgCisgICgxVTw8MzEpIHwgOTIwLCAoMVU8PDMxKSB8IDE3MjcsICgxVTw8MzEpIHwgNzMzLCAoMVU8PDMxKSB8IDc4NiwgKDFVPDwzMSkgfCAxODcyLCAoMVU8PDMxKSB8IDE3MDQsICgxVTw8MzEpIHwgMTY1OSwgKDFVPDwzMSkgfCA4NTUsIAorICAoMVU8PDMxKSB8IDkyMCwgKDFVPDwzMSkgfCAxNzI3LCAoMVU8PDMxKSB8IDczMywgKDFVPDwzMSkgfCA3ODYsICgxVTw8MzEpIHwgMTg3MiwgKDFVPDwzMSkgfCA0MzQsICgxVTw8MzEpIHwgNTExLCAoMVU8PDMxKSB8IDExODksIAorICAoMVU8PDMxKSB8IDQzNCwgKDFVPDwzMSkgfCA1MTEsICgxVTw8MzEpIHwgMTE4OSwgKDFVPDwzMSkgfCA0MzQsICgxVTw8MzEpIHwgNTExLCAoMVU8PDMxKSB8IDExODksICgxVTw8MzEpIHwgNDM0LCAoMVU8PDMxKSB8IDUxMSwgCisgICgxVTw8MzEpIHwgMTE4OSwgKDFVPDwzMSkgfCA0MzQsICgxVTw8MzEpIHwgNTExLCAoMVU8PDMxKSB8IDExODksICgxVTw8MzEpIHwgMjYwLCAoMVU8PDMxKSB8IDExMjUsICgxVTw8MzEpIHwgMTkyNSwgKDFVPDwzMSkgfCA4NDUsIAorICAoMVU8PDMxKSB8IDkxMCwgKDFVPDwzMSkgfCA5NDAsICgxVTw8MzEpIHwgNzIzLCAoMVU8PDMxKSB8IDc3NiwgKDFVPDwzMSkgfCAxMjA5LCAoMVU8PDMxKSB8IDU3MCwgKDFVPDwzMSkgfCA2MjUsICgxVTw8MzEpIHwgNjU2LCAKKyAgKDFVPDwzMSkgfCAxMDk1LCAoMVU8PDMxKSB8IDE3ODAsICgxVTw8MzEpIHwgMzE2NSwgKDFVPDwzMSkgfCA1NzAsICgxVTw8MzEpIHwgNjI1LCAoMVU8PDMxKSB8IDY1NiwgKDFVPDwzMSkgfCA1NzAsICgxVTw8MzEpIHwgNjI1LCAKKyAgKDFVPDwzMSkgfCA2NTYsICgxVTw8MzEpIHwgNDM0LCAoMVU8PDMxKSB8IDUxMSwgKDFVPDwzMSkgfCAxMTg5LCAoMVU8PDMxKSB8IDU3MCwgKDFVPDwzMSkgfCA2MjUsICgxVTw8MzEpIHwgNjU2LCAoMVU8PDMxKSB8IDI2MCwgCisgICgxVTw8MzEpIHwgMTEyNSwgKDFVPDwzMSkgfCAxOTI1LCAoMVU8PDMxKSB8IDQzNCwgKDFVPDwzMSkgfCA1MTEsICgxVTw8MzEpIHwgMTE4OSwgKDFVPDwzMSkgfCA1NzAsICgxVTw8MzEpIHwgNjI1LCAoMVU8PDMxKSB8IDY1NiwgCisgICgxVTw8MzEpIHwgMjYwLCAoMVU8PDMxKSB8IDExMjUsICgxVTw8MzEpIHwgMTkyNSwgMHg0YzRjM2QsICgxVTw8MzEpIHwgMTI0NCwgMHg0YzRjM2QsICgxVTw8MzEpIHwgMTI0NCwgMHg0YzRjNWIsIAorICAweDNkM2QzZCwgMHgzZDNkM2QsIDB4M2QzZDNkLCAweDRjNGM1YiwgKDFVPDwzMSkgfCAxMDgzLCAoMVU8PDMxKSB8IDEwNzYsIDB4NGE0YzRjLCAweDU5NWI1YiwgCisgIDB4M2IzZDNkLCAweDQ0YzRjLCAweDQ1YjViLCAweDQzZDNkLCAweDRjNGM0YywgMHg1YjViNWIsIDB4M2IzYjNiLCAweDNjM2MzYywgCisgIDB4M2QzZDNkLCAweDRhNGM0YywgMHg1OTU5NTksIDB4NTk1YTVhLCAweDU5NWI1YiwgMHgzYjNkM2QsIDB4NDRjNGMsIDB4NDU5NTksIAorICAweDQ1YTVhLCAweDQ1YjViLCAweDQzZDNkLCAweDRjNGM0YywgMHg1OTU5NTksIDB4NWE1YTVhLCAweDViNWI1YiwgMHgzYjNiM2IsIAorICAweDNjM2MzYywgMHgzZDNkM2QsIDB4NGE0YzRjLCAweDU5NWI1YiwgMHgzYjNkM2QsIDB4NDRjNGMsIDB4NDViNWIsIDB4NDNkM2QsIAorICAweDRjNGM0YywgMHg1YjViNWIsIDB4M2IzYjNiLCAweDNjM2MzYywgMHgzZDNkM2QsIDB4Mjg5ODk4OSwgMHgyOGE4YThhLCAweDI4YjhiOGIsIAorICAweDI3YTdhN2EsIDB4MjdiN2I3YiwgMHgzN2M3YzdjLCAoMVU8PDMxKSB8IDg1NSwgKDFVPDwzMSkgfCA3MzMsIDB4NDI4YjhiOGIsIDB4NDM3YzdjN2MsICgxVTw8MzEpIHwgMTcwNCwgCisgICgxVTw8MzEpIHwgMTY1OSwgMHgyODk4OTg5LCAweDI4YThhOGEsIDB4MjhiOGI4YiwgMHgyN2E3YTdhLCAweDI3YjdiN2IsIDB4MzdjN2M3YywgKDFVPDwzMSkgfCA4NTUsIAorICAoMVU8PDMxKSB8IDczMywgMHg0MjhiOGI4YiwgMHg0MzdjN2M3YywgKDFVPDwzMSkgfCAxNzA0LCAoMVU8PDMxKSB8IDE2NTksICgxVTw8MzEpIHwgMjc2NywgKDFVPDwzMSkgfCAyMzQ3LCAoMVU8PDMxKSB8IDI2MDEsIAorICAoMVU8PDMxKSB8IDI3MDksICgxVTw8MzEpIHwgMjc3NywgKDFVPDwzMSkgfCAyMjkzLCAoMVU8PDMxKSB8IDI2MTEsICgxVTw8MzEpIHwgMjY5OSwgKDFVPDwzMSkgfCAyNzM3LCAoMVU8PDMxKSB8IDI1NjEsICgxVTw8MzEpIHwgMjc1NywgCisgICgxVTw8MzEpIHwgMjU5MSwgKDFVPDwzMSkgfCAyNjY5LCAoMVU8PDMxKSB8IDIyNjMsICgxVTw8MzEpIHwgMjY3OSwgKDFVPDwzMSkgfCAyMjczLCAweDQ0MmU0YjIwLCAweDQ0MmU0YzMwLCAweDQ0MmU1YjIwLCAKKyAgMHg0NDJlNWIyMCwgKDFVPDwzMSkgfCAyNzI3LCAoMVU8PDMxKSB8IDI1NTEsICgxVTw8MzEpIHwgMjc0NywgKDFVPDwzMSkgfCAyNTgxLCAoMVU8PDMxKSB8IDI2NTksICgxVTw8MzEpIHwgMjIyMSwgKDFVPDwzMSkgfCAyNjg5LCAKKyAgKDFVPDwzMSkgfCAyMjgzLCAweDJlOGIsIDB4MmU3YywgMHg0NDg5ODk0LCAweDQ0N2E3YTQsIDB4NDg5NCwgMHg0ODk1LCAweDQ4OTQsIAorICAweDQ4OTUsIDB4NDdhNCwgMHg0N2E1LCAweDQ3YTQsIDB4NDdhNSwgMHg1YjhiOGIsIDB4NGM3YzdjLCAweDQ0NCwgCisgIDB4NTU1LCAweDQ0NCwgMHg1NTUsIDB4NDQ0LCAweDU1NSwgMHg0NDQsIDB4NTU1LCAweDJlMCwgCisgIDB4MmUwLCAweDJlMCwgMHgyZTAsIDB4NCwgMHg1LCAweDQwLCAweDUwLCAoMVU8PDMxKSB8IDM5NzksIAorICAoMVU8PDMxKSB8IDM5OTIsIDB4N2E3YTdhN2EsIDB4N2I3YjdiN2IsICgxVTw8MzEpIHwgMzk3OSwgMHg3YTdhN2E3YSwgKDFVPDwzMSkgfCAzOTc5LCAoMVU8PDMxKSB8IDM5OTIsIDB4N2E3YTdhN2EsIAorICAweDdiN2I3YjdiLCAoMVU8PDMxKSB8IDM5NzksICgxVTw8MzEpIHwgMzk5MiwgMHg3YTdhN2E3YSwgMHg3YjdiN2I3YiwgKDFVPDwzMSkgfCAzOTc5LCAweDdhN2E3YTdhLCAoMVU8PDMxKSB8IDM5NzksIAorICAoMVU8PDMxKSB8IDM5OTIsIDB4N2E3YTdhN2EsIDB4N2I3YjdiN2IsICgxVTw8MzEpIHwgMzk3OSwgKDFVPDwzMSkgfCAzOTkyLCAweDdhN2E3YTdhLCAweDdiN2I3YjdiLCAoMVU8PDMxKSB8IDM5NzksIAorICAweDdhN2E3YTdhLCAoMVU8PDMxKSB8IDM5NzksICgxVTw8MzEpIHwgMzk5MiwgMHg3YTdhN2E3YSwgMHg3YjdiN2I3YiwgKDFVPDwzMSkgfCAzOTc5LCAweDdhN2E3YTdhLCAoMVU8PDMxKSB8IDM5NzksIAorICAweDdhN2E3YTdhLCAweDJlMCwgMHgyZTAsIDB4MmUwLCAweDJlMCwgMHg0MCwgMHg1MCwgMHgyMCwgCisgIDB4MmUwLCAweDQ0NDIsIDB4NDQ1MiwgMHg0NDQwLCAweDQ0NTAsIDB4MCwgMHgwLCAoMVU8PDMxKSB8IDEwNjQsIAorICAoMVU8PDMxKSB8IDQxNTAsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgCisgICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCAxMDkwLCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAKKyAgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDMxMzMsIAorICAoMVU8PDMxKSB8IDI0NzYsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxMzcsICgxVTw8MzEpIHwgNDE1NSwgCisgICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAKKyAgKDFVPDwzMSkgfCAzMTQ2LCAoMVU8PDMxKSB8IDMxNDYsICgxVTw8MzEpIHwgMzE0NiwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgMzE0NiwgKDFVPDwzMSkgfCAzMTQ2LCAoMVU8PDMxKSB8IDQxNTUsIAorICAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCAzMTQ2LCAoMVU8PDMxKSB8IDMxNDYsICgxVTw8MzEpIHwgMzE0NiwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgCisgICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAKKyAgKDFVPDwzMSkgfCA0MTU1LCAoMVU8PDMxKSB8IDQxNTUsICgxVTw8MzEpIHwgNDE1NSwgKDFVPDwzMSkgfCA0MTU1LCAweDQ0MmUwLCAweDQ0NDAsIDB4MjU5NTk1OSwgMHgyNWE1YTVhLCAKKyAgMHgyNWI1YjViLCAweDQsIDB4NSwgMHg0LCAweDUsIDB4NCwgMHg0LCAweDQ1LCAKKyAgKDFVPDwzMSkgfCAxOTU3LCAoMVU8PDMxKSB8IDI0ODcsICgxVTw8MzEpIHwgMjYyMSwgKDFVPDwzMSkgfCAxOTU3LCAoMVU8PDMxKSB8IDI0ODcsICgxVTw8MzEpIHwgMjYyMSwgMHg0NCwgMHg1NSwgCisgIDB4NSwgMHgyZTUsIDB4MmUwLCAweDAsIDB4MmUwLCAweDJlMCwgMHgyZTJlLCAweDJlMmUyZSwgCisgIDB4MCwgMHg0YTRhNGEsIDB4NGE0YTRhLCAweDRhNGE0YSwgMHgyNGE0YTRhLCAweDRhNGE0YSwgMHg0YTRhNGEsIDB4NGE0YTRhNGEsIAorICAweDJlLCAweDI3YTdhN2EsIDB4MjdhN2E3YSwgMHg3YTdhNCwgMHg3YTdhNCwgMHg3YTdhNCwgMHg3YTdhNCwgMHg3YTdhNCwgCisgIDB4N2E3YTQsICgxVTw8MzEpIHwgMzk4OCwgKDFVPDwzMSkgfCA0MTQ2LCAoMVU8PDMxKSB8IDQxNDAsICgxVTw8MzEpIHwgMzk2NiwgMHg0N2E3YSwgMHg1N2E3YSwgMHg3YTQsIAorICAweDdhNSwgKDFVPDwzMSkgfCAzOTg4LCAoMVU8PDMxKSB8IDM5NjYsIDB4N2E0LCAweDdhNSwgMHgyZTAsIDB4N2E3YTdhLCAweDdhN2E3YSwgCisgIDB4N2E3YTdhLCAweDdhN2E3YSwgMHg3YTQsICgxVTw8MzEpIHwgMTA5MSwgMHg3YTdhLCAweDdhN2EsIDB4N2E3YSwgMHg3YTdhLCAKKyAgMHgwLCAweDdhN2EsIDB4N2E3YSwgMHgyZTAsIDB4N2E3YTQsIDB4N2E3YTQsIDB4N2E3YTQsIDB4N2E3YTQsIAorICAweDdhN2E0LCAweDdhN2E0LCAweDJlMCwgMHgyODk4OTg5LCAweDI4OTg5ODksIDB4ODk4OTQsIDB4ODk4OTQsIDB4ODk4OTQsIAorICAweDg5ODk0LCAweDg5ODk0LCAweDg5ODk0LCAweDRhN2EsIDB4ODk0YSwgMHg4OTdhLCAweDdhNGEsIDB4ODk0LCAKKyAgMHg4OTUsIDB4ODk3YTdhLCAweDQ4OTg5LCAweDU4OTg5LCAweDdhODk4OSwgMHg4OTRhLCAweDdhNGEsIDB4ODk0LCAKKyAgMHg4OTUsIDB4MCwgMHgyZTJjMmMwLCAweDg5ODk4OSwgMHg4OTg5ODksIDB4MCwgMHg4OTg5ODksIDB4ODk4OTg5LCAKKyAgMHg4OTQsIDB4NGE0YTNiLCAweDNiM2IyYywgMHgzYjNiMmMsIDB4MmMyYzJjLCAweDNiM2IzYiwgMHgyYzJjMmMsIDB4M2IzYjNiLCAKKyAgMHgwLCAweDNiM2I0YSwgMHgyYzQsIDB4M2IzYjNiLCAweDNiM2IzYiwgMHg0YTRhNTksIDB4MmMyYzU5LCAweDRhNGE0YSwgCisgIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0NGE0YSwgMHg0NTk1OSwgMHg0M2IzYiwgMHg0YTRhNGEsIDB4M2IzYjNiLCAweDQ0YTRhLCAKKyAgMHg0M2IzYiwgMHg0YTRhNGEsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHg0NGE0YSwgMHg0NTk1OSwgMHg0M2IzYiwgMHgyYzJjMmMsIAorICAweDNiM2IzYiwgMHgyYzJjMmMsIDB4M2IzYjNiLCAweDg5ODksIDB4ODk4OSwgMHg4OTg5NCwgMHg4OTg5NCwgMHg4OTg5NCwgCisgIDB4ODk4OTQsIDB4ODk4OTQsIDB4ODk4OTQsIDB4ODk4OTg5LCAweDdhN2E3YSwgMHg4OTg5ODksIDB4N2E3YTdhLCAweDg5ODk4OSwgCisgIDB4N2E3YTdhLCAweDJlMmMsIDB4NDQyZTAsIDB4NDQwLCAoMVU8PDMxKSB8IDM5NzksIDB4N2E3YTdhN2EsIDB4Mjg5ODk4OSwgMHgyN2E3YTdhLCAKKyAgMHgyN2E3YTdhLCAweDIyYzJjM2IsIDB4NGE0YTNiLCAweDJjMmMyYzJjLCAweDNiM2IsIDB4NGE0YTU5LCAweDU5NTk0LCAweDU5NTk0LCAKKyAgMHg1OTU5NCwgMHg0ODk4OSwgMHg0N2E3YSwgMHg0ODk4OTg5LCAweDQ3YTdhN2EsIDB4MzQ0LCAweDQ0NCwgMHgyNDQsIAorICAweDU1NSwgMHgyNDJjNDJjNCwgMHgyNDJjNDJjNCwgMHgyNDJjNDJjNCwgMHgyNDJjNDJjNCwgMHgyNDJjNDJjNCwgMHgyNDJjNDJjNCwgKDFVPDwzMSkgfCAyOTIsIAorICAweDIyYzJjNCwgMHgyMmMyYzQsIDB4MjJjMmM0LCAweDIyYzJjNCwgMHgyMmMyYzQsIDB4MjJjMmM0LCAweDIyYzJjMmMsIDB4MmM1OTU5LCAKKyAgMHgyMjU5NTksIDB4NTk1OTU5LCAweDIyNTk1OTU5LCAoMVU8PDMxKSB8IDQxNTIsICgxVTw8MzEpIHwgNDE1MiwgKDFVPDwzMSkgfCA0MTUyLCAoMVU8PDMxKSB8IDQxNTUsIDB4NGE0YTRhLCAKKyAgKDFVPDwzMSkgfCA0MTU1LCAweDNiM2IzYiwgKDFVPDwzMSkgfCA0MTU1LCAweDNiM2IzYiwgKDFVPDwzMSkgfCA0MTU1LCAweDRhNGE0YSwgKDFVPDwzMSkgfCA0MTU1LCAweDNiM2IzYiwgCisgICgxVTw8MzEpIHwgNDE1NSwgMHgzYjNiM2IsICgxVTw8MzEpIHwgNDE1NSwgMHgyYzJjM2IsICgxVTw8MzEpIHwgNDE1NSwgMHgzYjNiM2IsICgxVTw8MzEpIHwgNDE1NSwgMHgyYzJjMmMsIAorICAoMVU8PDMxKSB8IDQxNTUsIDB4MmMyYzJjLCAoMVU8PDMxKSB8IDQxNTUsIDB4NGE0YTRhLCAoMVU8PDMxKSB8IDQxNTUsIDB4M2IzYjNiLCAweDJlNDQyMiwgMHgyZTU1MjIsIAorICAweDQ0NCwgMHg1NTUsIDB4M2I3YSwgMHgzYjdiLCAweDQ3YTNiLCAweDQ3YjNiLCAweDIyYzJjMmMsIDB4MjJkMmQyZCwgCisgICgxVTw8MzEpIHwgMjQyLCAweDIyYzJjMmMsIDB4MjJkMmQyZCwgKDFVPDwzMSkgfCAyNDIsIDB4MmMyYzJjLCAweDJkMmQyZCwgKDFVPDwzMSkgfCAxMDc2LCAweDQwLCAKKyAgMHg1MCwgMHg0MCwgMHg1MCwgMHg0MCwgMHgyZTQwLCAweDJlNTAsIDB4MmU0MCwgMHgyZTUwLCAKKyAgMHgyMCwgMHg0LCAweDAsIDB4NDUsIDB4ODk4OSwgMHg4YThhLCAweDdhN2EsIDB4N2I3YiwgCisgIDB4ODk4OSwgMHg3YTdhLCAweDIyYzJjMmMsIDB4MjRhNGE0YSwgMHgyNTk1OTU5LCAweDIyYzJjMmMsIDB4MjRhNGE0YSwgMHgyNTk1OTU5LCAKKyAgMHgyM2IzYjNiLCAweDIzYjNiM2IsICgxVTw8MzEpIHwgNTgwLCAoMVU8PDMxKSB8IDYzNSwgKDFVPDwzMSkgfCA0NjgsICgxVTw8MzEpIHwgNTIxLCAweDJjNGEsIDB4MmM1OSwgCisgIDB4MmMzYiwgMHg0YTU5LCAweDJjNGEsIDB4MmM1OSwgMHgyYzNiLCAweDRhNTksIDB4M2I0YSwgMHgzYjU5LCAKKyAgMHgzYjRhLCAweDNiNTksIDB4MmMzYiwgMHg0YTU5LCAweDNiNGEsIDB4NGE0YTRhNGEsIDB4NTk0YTRhNTksIDB4NTk0YTRhNTksIAorICAweDRhNGE0YTRhLCAweDU5NGE0YTU5LCAweDU5NGE0YTU5LCAweDRhM2IzYjRhLCAweDNiM2IzYjNiLCAweDRhM2IzYjRhLCAweDNiM2IzYjNiLCAweDRhM2IzYjRhLCAKKyAgMHg0YTNiM2I0YSwgMHgyYzJjMmMyYywgMHgyYzJjMmMsIDB4MjJjMmMsIDB4NGE0YTRhLCAweDI0YTRhLCAweDU5NTk1OSwgMHgyNTk1OSwgCisgIDB4M2IzYjNiLCAweDIzYjNiLCAweDJjMmMyYywgMHg0YTRhNGEsIDB4NTk1OTU5LCAweDNiM2IzYiwgMHgyYzJjMmMsIDB4NGE0YTRhLCAKKyAgMHg1OTU5NTksIDB4M2IzYjNiLCAweDQ0MmUwLCAweDQ0MmUwLCAweDQ0MmUwLCAweDQ0MmUwLCAweDQ0MmUwLCAweDQ0MmUwLCAKKyAgMHg0NDJlMCwgMHg0NDJlMCwgMHg0NDJlMCwgMHg0NDJlMCwgMHg0NDJlMCwgMHg0NDJlMCwgMHg0NDQwLCAweDQsIAorICAweDQ0LCAweDJlMmUsIDB4NDRmMCwgMHgwLCAweDRmMCwgMHg0MCwgMHg0NDQ0LCAoMVU8PDMxKSB8IDIwNjEsIAorICAweDRmMCwgMHg0ZjAsIDB4NGY0LCAweDRmMCwgMHg0LCAweDQsIDB4NCwgMHg0NCwgCisgIDB4NDRmLCAweGNmNGYsIDB4NGY0LCAweDRmNCwgMHg0ZjQsIDB4MmU0ZjAsIDB4MmU0ZjAsIDB4MmU0ZjAsIAorICAweDJlNGYwLCAweDJlNGYwLCAweDQ0ZjQsIDB4NGY0LCAweDRmMCwgMHg0ZjAsIDB4NDRmMCwgMHg0NGYwLCAKKyAgMHg0NGY0LCAweDQ0ZjAsIDB4NGY0LCAweDQ0ZjAsIDB4Y2Y0ZjAsIDB4NDRmMCwgMHgyZTRmMCwgMHg0NDAsIAorICAweDQ0ZjAsIDB4NDRmMCwgMHhjZjRmMCwgMHg0MCwgMHg0NGYwLCAweDJlNGYwLCAweDQ0NCwgMHgwLCAKKyAgMHg0ZjAsIDB4NGY0LCAweDRmNCwgMHgyZSwgMHg0NDQsIDAKK307CisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIElJVF9Mb25nRW5jb2RpbmdUYWJsZVtdID0geworICAvKiAwICovIDAsIDQsIDQsIDE1LCAwLCAxNSwgMCwgMTUsIDAsIDE1LCAwLCAxLCAxLCAwLAorICAvKiAxNCAqLyAxNSwgMiwgMTUsIDEwLCAxNSwgMTcsIDEwLCA0LCA0LCAxLCAxLCAxLCAxLCAxLCAwLAorICAvKiAyOSAqLyAwLCAxNSwgMiwgMTUsIDksIDE1LCAxNywgNCwgMSwgMSwgMSwgMSwgMCwKKyAgLyogNDIgKi8gNCwgNCwgNCwgMTUsIDEsIDExLCA0LCAxLCAxLCAxLCAwLAorICAvKiA1MyAqLyAwLCA0LCA0LCAxNSwgMywgMTUsIDMsIDEsIDEsIDAsCisgIC8qIDYzICovIDAsIDE1LCAwLCAxMCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgMSwgMSwgMCwKKyAgLyogNzcgKi8gMCwgMTUsIDIsIDEwLCA0LCA0LCA0LCAxLCAxLCAwLAorICAvKiA4NyAqLyAyMSwgMTUsIDIsIDEsIDE1LCAyLCAxNSwgMiwgMSwgMCwKKyAgLyogOTcgKi8gMTUsIDIsIDE1LCAyLCAxNSwgMiwgMTUsIDIsIDEsIDAsCisgIC8qIDEwNyAqLyAwLCAxNSwgMywgMzMsIDMsIDMxLCAzLCAxLCAwLAorICAvKiAxMTYgKi8gMCwgMTUsIDMsIDM0LCAxLCAwLCA0LCAzMSwgMywgMSwgMCwKKyAgLyogMTI3ICovIDAsIDE1LCAzLCAxNSwgMTIsIDQsIDMxLCAzLCAxLCAwLAorICAvKiAxMzcgKi8gMTUsIDEsIDE1LCAxMiwgMTUsIDEsIDQsIDQsIDEsIDAsCisgIC8qIDE0NyAqLyAxNSwgMSwgMTUsIDEsIDE1LCAxLCA0LCA0LCA0LCAxLCAwLAorICAvKiAxNTggKi8gNywgMjcsIDMsIDcsIDcsIDQsIDQsIDEsIDAsCisgIC8qIDE2NyAqLyAyMSwgMSwgNSwgMSwgMCwKKyAgLyogMTcyICovIDIxLCAxNSwgMSwgMSwgMTUsIDEsIDE1LCAxLCAwLAorICAvKiAxODEgKi8gMCwgMTksIDE1LCAxLCAwLAorICAvKiAxODYgKi8gMCwgMTUsIDQsIDE1LCAxMiwgMTUsIDE3LCAxLCAwLAorICAvKiAxOTUgKi8gMiwgMTgsIDEsIDAsCisgIC8qIDE5OSAqLyAxNSwgMSwgMjUsIDEsIDAsCisgIC8qIDIwNCAqLyAzNiwgMSwgMzYsIDEsIDM2LCAxLCAwLAorICAvKiAyMTEgKi8gMjEsIDEyLCA0LCAzNiwgMSwgMTIsIDQsIDEyLCA0LCAzNiwgMSwgMCwKKyAgLyogMjIzICovIDM3LCAxLCAzNywgMSwgMzcsIDEsIDAsCisgIC8qIDIzMCAqLyAyMSwgMTMsIDQsIDM3LCAxLCAxMywgNCwgMTMsIDQsIDM3LCAxLCAwLAorICAvKiAyNDIgKi8gMTYsIDIsIDE2LCAyLCAxNiwgMiwgMiwgMCwKKyAgLyogMjUwICovIDExLCAzLCAxMiwgMiwgMTIsIDIsIDExLCAzLCAyLCAwLAorICAvKiAyNjAgKi8gMTEsIDMsIDExLCAzLCAxMSwgMywgMTEsIDMsIDIsIDAsCisgIC8qIDI3MCAqLyAxMSwgMywgMTIsIDIsIDEyLCAyLCA0LCAxMSwgMywgMiwgMCwKKyAgLyogMjgxICovIDExLCAzLCAxMSwgMywgMTEsIDMsIDQsIDExLCAzLCAyLCAwLAorICAvKiAyOTIgKi8gMTIsIDIsIDEyLCAyLCA0LCAxMiwgMiwgNCwgMiwgMCwKKyAgLyogMzAyICovIDEwLCA0LCAxMCwgNCwgMTAsIDQsIDEwLCA0LCA0LCAyLCAwLAorICAvKiAzMTMgKi8gMTAsIDcsIDEwLCA3LCAxMCwgNywgMTAsIDQsIDQsIDIsIDAsCisgIC8qIDMyNCAqLyAxMSwgNCwgMTEsIDQsIDExLCA0LCAxMSwgNCwgNCwgMiwgMCwKKyAgLyogMzM1ICovIDExLCA3LCAxMSwgNywgMTEsIDcsIDExLCA0LCA0LCAyLCAwLAorICAvKiAzNDYgKi8gOSwgNSwgOSwgNSwgOSwgNSwgOSwgNSwgNCwgMiwgMCwKKyAgLyogMzU3ICovIDksIDgsIDksIDgsIDksIDgsIDksIDUsIDQsIDIsIDAsCisgIC8qIDM2OCAqLyAxMCwgNSwgMTAsIDUsIDEwLCA1LCAxMCwgNSwgNCwgMiwgMCwKKyAgLyogMzc5ICovIDEwLCA4LCAxMCwgOCwgMTAsIDgsIDEwLCA1LCA0LCAyLCAwLAorICAvKiAzOTAgKi8gMTEsIDUsIDExLCA1LCAxMSwgNSwgMTEsIDUsIDQsIDIsIDAsCisgIC8qIDQwMSAqLyAxMCwgNCwgMTEsIDMsIDExLCAzLCAxMCwgNCwgMiwgMCwKKyAgLyogNDExICovIDEwLCA0LCAxMCwgNCwgMTAsIDQsIDQsIDEwLCA0LCAyLCAwLAorICAvKiA0MjIgKi8gMTAsIDQsIDEwLCA0LCAxNCwgMiwgMTAsIDQsIDEwLCA0LCAyLCAwLAorICAvKiA0MzQgKi8gMTAsIDQsIDEwLCA0LCAxMCwgNCwgMTAsIDQsIDIsIDAsCisgIC8qIDQ0NCAqLyAxMCwgNCwgMTAsIDQsIDE0LCAyLCA5LCA1LCAxMCwgNCwgMiwgMCwKKyAgLyogNDU2ICovIDEwLCA0LCAxMCwgNCwgMTQsIDIsIDEwLCA1LCAxMCwgNCwgMiwgMCwKKyAgLyogNDY4ICovIDEwLCA3LCAxMCwgNywgMTAsIDcsIDEwLCA0LCAyLCAwLAorICAvKiA0NzggKi8gMTEsIDQsIDEyLCAzLCAxMiwgMywgMTEsIDQsIDIsIDAsCisgIC8qIDQ4OCAqLyAxMSwgNCwgMTEsIDQsIDExLCA0LCA0LCAxMSwgNCwgMiwgMCwKKyAgLyogNDk5ICovIDExLCA0LCAxMSwgNCwgMTQsIDIsIDExLCA0LCAxMSwgNCwgMiwgMCwKKyAgLyogNTExICovIDExLCA0LCAxMSwgNCwgMTEsIDQsIDExLCA0LCAyLCAwLAorICAvKiA1MjEgKi8gMTEsIDcsIDExLCA3LCAxMSwgNywgMTEsIDQsIDIsIDAsCisgIC8qIDUzMSAqLyAyNywgNCwgMiwgMCwKKyAgLyogNTM1ICovIDksIDUsIDksIDUsIDksIDUsIDQsIDksIDUsIDIsIDAsCisgIC8qIDU0NiAqLyA5LCA1LCA5LCA1LCAxNCwgMiwgMTAsIDQsIDksIDUsIDIsIDAsCisgIC8qIDU1OCAqLyA5LCA1LCA5LCA1LCAxNCwgMiwgOSwgNSwgOSwgNSwgMiwgMCwKKyAgLyogNTcwICovIDksIDUsIDksIDUsIDksIDUsIDksIDUsIDIsIDAsCisgIC8qIDU4MCAqLyA5LCA4LCA5LCA4LCA5LCA4LCA5LCA1LCAyLCAwLAorICAvKiA1OTAgKi8gMTAsIDUsIDEwLCA1LCAxMCwgNSwgNCwgMTAsIDUsIDIsIDAsCisgIC8qIDYwMSAqLyAxMCwgNSwgMTAsIDUsIDE0LCAyLCAxMCwgNCwgMTAsIDUsIDIsIDAsCisgIC8qIDYxMyAqLyAxMCwgNSwgMTAsIDUsIDE0LCAyLCAxMCwgNSwgMTAsIDUsIDIsIDAsCisgIC8qIDYyNSAqLyAxMCwgNSwgMTAsIDUsIDEwLCA1LCAxMCwgNSwgMiwgMCwKKyAgLyogNjM1ICovIDEwLCA4LCAxMCwgOCwgMTAsIDgsIDEwLCA1LCAyLCAwLAorICAvKiA2NDUgKi8gMTEsIDUsIDExLCA1LCAxMSwgNSwgNCwgMTEsIDUsIDIsIDAsCisgIC8qIDY1NiAqLyAxMSwgNSwgMTEsIDUsIDExLCA1LCAxMSwgNSwgMiwgMCwKKyAgLyogNjY2ICovIDEwLCA3LCAxMCwgNywgMTAsIDcsIDQsIDEwLCA3LCAyLCAwLAorICAvKiA2NzcgKi8gMTAsIDcsIDEwLCA3LCAxNCwgMiwgMTAsIDQsIDEwLCA3LCAyLCAwLAorICAvKiA2ODkgKi8gMTAsIDcsIDEwLCA3LCAxMCwgNCwgMTAsIDcsIDIsIDAsCisgIC8qIDY5OSAqLyAxMCwgNywgMTAsIDcsIDE0LCAyLCA5LCA1LCAxMCwgNywgMiwgMCwKKyAgLyogNzExICovIDEwLCA3LCAxMCwgNywgMTQsIDIsIDEwLCA1LCAxMCwgNywgMiwgMCwKKyAgLyogNzIzICovIDEwLCA3LCAxMCwgNCwgMTAsIDcsIDEwLCA3LCAyLCAwLAorICAvKiA3MzMgKi8gMTAsIDcsIDEwLCA3LCAxMCwgNywgMTAsIDcsIDIsIDAsCisgIC8qIDc0MyAqLyAxMSwgNywgMTEsIDcsIDExLCA3LCA0LCAxMSwgNywgMiwgMCwKKyAgLyogNzU0ICovIDExLCA3LCAxMSwgNywgMTQsIDIsIDExLCA0LCAxMSwgNywgMiwgMCwKKyAgLyogNzY2ICovIDExLCA3LCAxMSwgNywgMTEsIDQsIDExLCA3LCAyLCAwLAorICAvKiA3NzYgKi8gMTEsIDcsIDExLCA0LCAxMSwgNywgMTEsIDcsIDIsIDAsCisgIC8qIDc4NiAqLyAxMSwgNywgMTEsIDcsIDExLCA3LCAxMSwgNywgMiwgMCwKKyAgLyogNzk2ICovIDI3LCA3LCAyLCAwLAorICAvKiA4MDAgKi8gOSwgOCwgOSwgOCwgOSwgOCwgNCwgOSwgOCwgMiwgMCwKKyAgLyogODExICovIDksIDgsIDksIDgsIDE0LCAyLCAxMCwgNCwgOSwgOCwgMiwgMCwKKyAgLyogODIzICovIDksIDgsIDksIDgsIDE0LCAyLCA5LCA1LCA5LCA4LCAyLCAwLAorICAvKiA4MzUgKi8gOSwgOCwgOSwgOCwgOSwgNSwgOSwgOCwgMiwgMCwKKyAgLyogODQ1ICovIDksIDgsIDksIDUsIDksIDgsIDksIDgsIDIsIDAsCisgIC8qIDg1NSAqLyA5LCA4LCA5LCA4LCA5LCA4LCA5LCA4LCAyLCAwLAorICAvKiA4NjUgKi8gMTAsIDgsIDEwLCA4LCAxMCwgOCwgNCwgMTAsIDgsIDIsIDAsCisgIC8qIDg3NiAqLyAxMCwgOCwgMTAsIDgsIDE0LCAyLCAxMCwgNCwgMTAsIDgsIDIsIDAsCisgIC8qIDg4OCAqLyAxMCwgOCwgMTAsIDgsIDE0LCAyLCAxMCwgNSwgMTAsIDgsIDIsIDAsCisgIC8qIDkwMCAqLyAxMCwgOCwgMTAsIDgsIDEwLCA1LCAxMCwgOCwgMiwgMCwKKyAgLyogOTEwICovIDEwLCA4LCAxMCwgNSwgMTAsIDgsIDEwLCA4LCAyLCAwLAorICAvKiA5MjAgKi8gMTAsIDgsIDEwLCA4LCAxMCwgOCwgMTAsIDgsIDIsIDAsCisgIC8qIDkzMCAqLyAxMSwgOCwgMTEsIDgsIDExLCA1LCAxMSwgOCwgMiwgMCwKKyAgLyogOTQwICovIDExLCA4LCAxMSwgNSwgMTEsIDgsIDExLCA4LCAyLCAwLAorICAvKiA5NTAgKi8gMTEsIDIsIDExLCAyLCAxMSwgMiwgMTEsIDIsIDExLCAyLCAxMSwgMiwgMTEsIDIsIDAsCisgIC8qIDk2NSAqLyAyMSwgMTIsIDIsIDQsIDEyLCAyLCAxMiwgMiwgMCwKKyAgLyogOTc0ICovIDIxLCAxMiwgMiwgNCwgMTIsIDIsIDAsCisgIC8qIDk4MSAqLyAxOCwgNCwgMTQsIDIsIDE0LCAyLCAxNCwgMiwgMCwKKyAgLyogOTkwICovIDIxLCA0LCAxNCwgMiwgMTQsIDIsIDQsIDE0LCAyLCAwLAorICAvKiAxMDAwICovIDIxLCA1LCAxNCwgMiwgMTQsIDIsIDQsIDE0LCAyLCAwLAorICAvKiAxMDEwICovIDIxLCA0LCAxNCwgMiwgMTQsIDIsIDQsIDQsIDE0LCAyLCAwLAorICAvKiAxMDIxICovIDIxLCA1LCAxNCwgMiwgMTQsIDIsIDQsIDQsIDE0LCAyLCAwLAorICAvKiAxMDMyICovIDE0LCAyLCAxNCwgMiwgNCwgNCwgNCwgMTQsIDIsIDAsCisgIC8qIDEwNDIgKi8gMjEsIDQsIDQsIDE0LCAyLCAwLAorICAvKiAxMDQ4ICovIDE0LCAyLCAxNCwgMiwgNCwgNCwgNSwgMTQsIDIsIDAsCisgIC8qIDEwNTggKi8gMjEsIDUsIDUsIDE0LCAyLCAwLAorICAvKiAxMDY0ICovIDAsIDE3LCAxNywgMTQsIDIsIDAsCisgIC8qIDEwNzAgKi8gMTQsIDIsIDE4LCAxNCwgMiwgMCwKKyAgLyogMTA3NiAqLyAxNiwgMiwgMTYsIDIsIDE2LCAyLCAwLAorICAvKiAxMDgzICovIDExLCA1LCAxNiwgMiwgMTYsIDIsIDAsCisgIC8qIDEwOTAgKi8gMTcsIDE3LCAxNywgMiwgMCwKKyAgLyogMTA5NSAqLyAxMiwgMiwgMTIsIDIsIDEyLCAyLCAxMiwgMiwgMywgMCwKKyAgLyogMTEwNSAqLyAwLCA1LCA0LCA0LCA0LCAzLCAzLCAzLCAzLCAwLAorICAvKiAxMTE1ICovIDEyLCAzLCAxMywgMiwgMTMsIDIsIDEyLCAzLCAzLCAwLAorICAvKiAxMTI1ICovIDEyLCAzLCAxMiwgMywgMTIsIDMsIDEyLCAzLCAzLCAwLAorICAvKiAxMTM1ICovIDEyLCAzLCAxMywgMiwgMTMsIDIsIDQsIDEyLCAzLCAzLCAwLAorICAvKiAxMTQ2ICovIDEyLCAzLCAxMiwgMywgMTIsIDMsIDQsIDEyLCAzLCAzLCAwLAorICAvKiAxMTU3ICovIDEyLCA0LCAxMiwgNCwgMTIsIDQsIDEyLCA0LCA0LCAzLCAwLAorICAvKiAxMTY4ICovIDEyLCA0LCAxMywgMywgMTMsIDMsIDEyLCA0LCAzLCAwLAorICAvKiAxMTc4ICovIDEyLCA0LCAxMiwgNCwgMTIsIDQsIDQsIDEyLCA0LCAzLCAwLAorICAvKiAxMTg5ICovIDEyLCA0LCAxMiwgNCwgMTIsIDQsIDEyLCA0LCAzLCAwLAorICAvKiAxMTk5ICovIDEyLCA3LCAxMiwgNywgMTIsIDQsIDEyLCA3LCAzLCAwLAorICAvKiAxMjA5ICovIDEyLCA3LCAxMiwgNCwgMTIsIDcsIDEyLCA3LCAzLCAwLAorICAvKiAxMjE5ICovIDIxLCAxMiwgMiwgNCwgMTEsIDMsIDExLCAzLCAwLAorICAvKiAxMjI4ICovIDIxLCAxMSwgMywgNCwgMTEsIDMsIDExLCAzLCAwLAorICAvKiAxMjM3ICovIDIxLCAxMSwgMywgNCwgMTEsIDMsIDAsCisgIC8qIDEyNDQgKi8gMTYsIDIsIDEzLCAzLCAxMywgMywgMCwKKyAgLyogMTI1MSAqLyAxNSwgMywgMzMsIDMsIDMxLCAzLCAxLCAxNSwgMywgMCwKKyAgLyogMTI2MSAqLyAxNSwgMywgMzQsIDEsIDAsIDQsIDMxLCAzLCAxLCAxNSwgMywgMCwKKyAgLyogMTI3MyAqLyAxNSwgMywgMTUsIDEyLCA0LCAzMSwgMywgMSwgMTUsIDMsIDAsCisgIC8qIDEyODQgKi8gMTUsIDMsIDE1LCAzLCAxMiwgMiwgMTIsIDIsIDEyLCAyLCAxMiwgMiwgMTUsIDMsIDAsCisgIC8qIDEyOTkgKi8gMTUsIDMsIDE1LCAzLCAxMiwgMiwgMTIsIDIsIDEyLCAyLCAxNSwgMywgMCwKKyAgLyogMTMxMiAqLyAxNSwgMywgMTUsIDMsIDEyLCAyLCAxMiwgMiwgMTUsIDMsIDAsCisgIC8qIDEzMjMgKi8gMTUsIDMsIDI1LCAzLCAwLAorICAvKiAxMzI4ICovIDE1LCAzLCAyNSwgMywgMjUsIDMsIDAsCisgIC8qIDEzMzUgKi8gMTUsIDMsIDI2LCAzLCAwLAorICAvKiAxMzQwICovIDE1LCAzLCAyNiwgMywgMjYsIDMsIDAsCisgIC8qIDEzNDcgKi8gMTUsIDEsIDI1LCAxLCA0LCAwLAorICAvKiAxMzUzICovIDEyLCA0LCAxMiwgNCwgMzYsIDEsIDQsIDAsCisgIC8qIDEzNjEgKi8gMTMsIDQsIDEzLCA0LCAzNywgMSwgNCwgMCwKKyAgLyogMTM2OSAqLyAxMCwgNywgMTAsIDcsIDEwLCA3LCAxMCwgNCwgNCwgMiwgNCwgMCwKKyAgLyogMTM4MSAqLyA5LCA4LCA5LCA4LCA5LCA4LCA5LCA1LCA0LCAyLCA0LCAwLAorICAvKiAxMzkzICovIDExLCA4LCAxMSwgOCwgMTEsIDgsIDExLCA1LCA0LCAyLCA0LCAwLAorICAvKiAxNDA1ICovIDEwLCA0LCAxMCwgNCwgMTQsIDIsIDEwLCA0LCAyLCA0LCAwLAorICAvKiAxNDE2ICovIDksIDUsIDksIDUsIDE0LCAyLCAxMCwgNCwgMiwgNCwgMCwKKyAgLyogMTQyNyAqLyAxMCwgNSwgMTAsIDUsIDE0LCAyLCAxMCwgNCwgMiwgNCwgMCwKKyAgLyogMTQzOCAqLyAxMCwgNywgMTAsIDcsIDE0LCAyLCAxMCwgNCwgMiwgNCwgMCwKKyAgLyogMTQ0OSAqLyA5LCA4LCA5LCA4LCAxNCwgMiwgMTAsIDQsIDIsIDQsIDAsCisgIC8qIDE0NjAgKi8gMTAsIDgsIDEwLCA4LCAxNCwgMiwgMTAsIDQsIDIsIDQsIDAsCisgIC8qIDE0NzEgKi8gMTEsIDQsIDExLCA0LCAxNCwgMiwgMTEsIDQsIDIsIDQsIDAsCisgIC8qIDE0ODIgKi8gMTEsIDUsIDExLCA1LCAxNCwgMiwgMTEsIDQsIDIsIDQsIDAsCisgIC8qIDE0OTMgKi8gMTEsIDcsIDExLCA3LCAxNCwgMiwgMTEsIDQsIDIsIDQsIDAsCisgIC8qIDE1MDQgKi8gMTEsIDgsIDExLCA4LCAxNCwgMiwgMTEsIDQsIDIsIDQsIDAsCisgIC8qIDE1MTUgKi8gMTAsIDQsIDEwLCA0LCAxNCwgMiwgOSwgNSwgMiwgNCwgMCwKKyAgLyogMTUyNiAqLyA5LCA1LCA5LCA1LCAxNCwgMiwgOSwgNSwgMiwgNCwgMCwKKyAgLyogMTUzNyAqLyAxMCwgNywgMTAsIDcsIDE0LCAyLCA5LCA1LCAyLCA0LCAwLAorICAvKiAxNTQ4ICovIDksIDgsIDksIDgsIDE0LCAyLCA5LCA1LCAyLCA0LCAwLAorICAvKiAxNTU5ICovIDEwLCA0LCAxMCwgNCwgMTQsIDIsIDEwLCA1LCAyLCA0LCAwLAorICAvKiAxNTcwICovIDEwLCA1LCAxMCwgNSwgMTQsIDIsIDEwLCA1LCAyLCA0LCAwLAorICAvKiAxNTgxICovIDEwLCA3LCAxMCwgNywgMTQsIDIsIDEwLCA1LCAyLCA0LCAwLAorICAvKiAxNTkyICovIDEwLCA4LCAxMCwgOCwgMTQsIDIsIDEwLCA1LCAyLCA0LCAwLAorICAvKiAxNjAzICovIDExLCA0LCAxMSwgNCwgMTQsIDIsIDExLCA1LCAyLCA0LCAwLAorICAvKiAxNjE0ICovIDExLCA1LCAxMSwgNSwgMTQsIDIsIDExLCA1LCAyLCA0LCAwLAorICAvKiAxNjI1ICovIDExLCA3LCAxMSwgNywgMTQsIDIsIDExLCA1LCAyLCA0LCAwLAorICAvKiAxNjM2ICovIDExLCA4LCAxMSwgOCwgMTQsIDIsIDExLCA1LCAyLCA0LCAwLAorICAvKiAxNjQ3ICovIDEwLCA3LCAxMCwgNywgMTAsIDcsIDQsIDEwLCA3LCAyLCA0LCAwLAorICAvKiAxNjU5ICovIDEwLCA3LCAxMCwgNywgMTAsIDcsIDEwLCA3LCAyLCA0LCAwLAorICAvKiAxNjcwICovIDEwLCA3LCAxMCwgNywgOSwgOCwgMTAsIDcsIDIsIDQsIDAsCisgIC8qIDE2ODEgKi8gOSwgOCwgOSwgOCwgOSwgOCwgNCwgOSwgOCwgMiwgNCwgMCwKKyAgLyogMTY5MyAqLyA5LCA4LCA5LCA4LCAxMCwgNywgOSwgOCwgMiwgNCwgMCwKKyAgLyogMTcwNCAqLyA5LCA4LCA5LCA4LCA5LCA4LCA5LCA4LCAyLCA0LCAwLAorICAvKiAxNzE1ICovIDExLCA4LCAxMSwgOCwgMTEsIDgsIDQsIDExLCA4LCAyLCA0LCAwLAorICAvKiAxNzI3ICovIDExLCA4LCAxMSwgOCwgMTEsIDgsIDExLCA4LCAyLCA0LCAwLAorICAvKiAxNzM4ICovIDEyLCAyLCAxMiwgMiwgMTIsIDIsIDEyLCAyLCA0LCAwLAorICAvKiAxNzQ4ICovIDIxLCAxMiwgMiwgNCwgMTIsIDIsIDEyLCAyLCAxMiwgMiwgNCwgMCwKKyAgLyogMTc2MCAqLyAyMSwgMTIsIDIsIDQsIDEyLCAyLCAxMiwgMiwgNCwgMCwKKyAgLyogMTc3MCAqLyAxMiwgMiwgOSwgNSwgOSwgNSwgMTIsIDIsIDQsIDAsCisgIC8qIDE3ODAgKi8gMTMsIDIsIDEzLCAyLCAxMywgMiwgMTMsIDIsIDQsIDAsCisgIC8qIDE3OTAgKi8gMTUsIDEsIDE1LCAxLCAxNCwgMiwgMTQsIDIsIDQsIDAsCisgIC8qIDE4MDAgKi8gMTUsIDQsIDE1LCA0LCAxNCwgMiwgMTQsIDIsIDQsIDAsCisgIC8qIDE4MTAgKi8gMjEsIDQsIDE0LCAyLCAxNCwgMiwgNCwgMCwKKyAgLyogMTgxOCAqLyAyMSwgNSwgMTQsIDIsIDE0LCAyLCA0LCAwLAorICAvKiAxODI2ICovIDEyLCA3LCAxMiwgNywgMTIsIDcsIDEyLCA0LCA0LCAzLCA0LCAwLAorICAvKiAxODM4ICovIDEyLCA0LCAxMiwgNCwgMTQsIDIsIDEyLCA0LCAzLCA0LCAwLAorICAvKiAxODQ5ICovIDEyLCA3LCAxMiwgNywgMTQsIDIsIDEyLCA0LCAzLCA0LCAwLAorICAvKiAxODYwICovIDEyLCA3LCAxMiwgNywgMTIsIDcsIDQsIDEyLCA3LCAzLCA0LCAwLAorICAvKiAxODcyICovIDEyLCA3LCAxMiwgNywgMTIsIDcsIDEyLCA3LCAzLCA0LCAwLAorICAvKiAxODgzICovIDExLCAzLCAxMSwgMywgMTEsIDMsIDExLCAzLCA0LCAwLAorICAvKiAxODkzICovIDIxLCAxMSwgMywgNCwgMTEsIDMsIDExLCAzLCAxMSwgMywgNCwgMCwKKyAgLyogMTkwNSAqLyAyMSwgMTEsIDMsIDQsIDExLCAzLCAxMSwgMywgNCwgMCwKKyAgLyogMTkxNSAqLyAxMywgMywgMTYsIDIsIDE2LCAyLCAxMywgMywgNCwgMCwKKyAgLyogMTkyNSAqLyAxMywgMywgMTMsIDMsIDEzLCAzLCAxMywgMywgNCwgMCwKKyAgLyogMTkzNSAqLyAxMywgMywgMTYsIDIsIDE2LCAyLCA0LCAxMywgMywgNCwgMCwKKyAgLyogMTk0NiAqLyAxMywgMywgMTMsIDMsIDEzLCAzLCA0LCAxMywgMywgNCwgMCwKKyAgLyogMTk1NyAqLyAyMSwgMywgNCwgMCwKKyAgLyogMTk2MSAqLyAxNSwgMywgMjYsIDMsIDQsIDAsCisgIC8qIDE5NjcgKi8gMjEsIDQsIDEsIDQsIDQsIDAsCisgIC8qIDE5NzMgKi8gMTAsIDcsIDEwLCA3LCAxMCwgNywgMTAsIDcsIDIsIDQsIDQsIDAsCisgIC8qIDE5ODUgKi8gOSwgOCwgOSwgOCwgOSwgOCwgOSwgOCwgMiwgNCwgNCwgMCwKKyAgLyogMTk5NyAqLyAyMywgMTUsIDMsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDE1LCAxMiwgMTUsIDMsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDQsIDQsIDAsCisgIC8qIDIwMTkgKi8gMjIsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDE1LCAxMiwgMTUsIDMsIDE1LCAzLCAxNSwgMywgNCwgNCwgMCwKKyAgLyogMjAzNyAqLyAyMSwgMTUsIDMsIDE1LCAzLCAxNSwgMTIsIDE1LCAzLCAxNSwgMywgNCwgNCwgMCwKKyAgLyogMjA1MSAqLyAwLCA1LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCAwLAorICAvKiAyMDYxICovIDIxLCA0LCA0LCA0LCA0LCA0LCAwLAorICAvKiAyMDY4ICovIDIzLCAzLCAzLCAzLCAzLCA1LCA0LCA0LCA0LCAwLAorICAvKiAyMDc4ICovIDIxLCAzLCAzLCA1LCA0LCA0LCA0LCAwLAorICAvKiAyMDg2ICovIDIzLCA0LCA0LCA0LCA0LCA1LCA0LCA0LCA0LCAwLAorICAvKiAyMDk2ICovIDIxLCA0LCA0LCA1LCA0LCA0LCA0LCAwLAorICAvKiAyMTA0ICovIDIzLCA0LCA0LCA0LCA0LCA1LCA1LCA0LCA0LCA0LCAwLAorICAvKiAyMTE1ICovIDIxLCA1LCA1LCA1LCA0LCA0LCA0LCAwLAorICAvKiAyMTIzICovIDIzLCA3LCA3LCA3LCA3LCA1LCA1LCA0LCA0LCA0LCAwLAorICAvKiAyMTM0ICovIDIzLCA3LCA3LCA3LCA3LCA1LCA0LCA0LCA0LCAwLAorICAvKiAyMTQ0ICovIDE2LCA0LCAxNiwgNCwgMTYsIDQsIDQsIDQsIDAsCisgIC8qIDIxNTMgKi8gMjMsIDMsIDMsIDMsIDMsIDUsIDQsIDQsIDAsCisgIC8qIDIxNjIgKi8gMjEsIDMsIDMsIDUsIDQsIDQsIDAsCisgIC8qIDIxNjkgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDQsIDQsIDAsCisgIC8qIDIxNzggKi8gMjEsIDQsIDQsIDUsIDQsIDQsIDAsCisgIC8qIDIxODUgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDUsIDQsIDQsIDAsCisgIC8qIDIxOTUgKi8gMjEsIDUsIDUsIDUsIDQsIDQsIDAsCisgIC8qIDIyMDIgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDUsIDQsIDQsIDAsCisgIC8qIDIyMTIgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDQsIDQsIDAsCisgIC8qIDIyMjEgKi8gMCwgMTQsIDIsIDIsIDEwLCA0LCAxMCwgNCwgNCwgMCwKKyAgLyogMjIzMSAqLyAyMSwgMTAsIDQsIDQsIDEwLCA0LCAxMCwgNCwgNCwgMCwKKyAgLyogMjI0MSAqLyAyMSwgMTAsIDQsIDQsIDEwLCA0LCAxMCwgNCwgMTAsIDQsIDQsIDAsCisgIC8qIDIyNTMgKi8gMTAsIDQsIDEwLCA0LCAxMCwgNCwgMTAsIDQsIDQsIDAsCisgIC8qIDIyNjMgKi8gMCwgMTQsIDIsIDIsIDksIDUsIDEwLCA0LCA0LCAwLAorICAvKiAyMjczICovIDAsIDE0LCAyLCAyLCAxMCwgNSwgMTAsIDQsIDQsIDAsCisgIC8qIDIyODMgKi8gMCwgMTQsIDIsIDIsIDExLCA0LCAxMSwgNCwgNCwgMCwKKyAgLyogMjI5MyAqLyAwLCAxNCwgMiwgMiwgMTEsIDUsIDExLCA0LCA0LCAwLAorICAvKiAyMzAzICovIDAsIDE1LCA0LCAxNSwgMTEsIDE1LCAxMSwgNCwgNCwgMCwKKyAgLyogMjMxMyAqLyAwLCAxNSwgNCwgMTUsIDExLCAxNSwgMTEsIDE1LCAxMSwgNCwgNCwgMCwKKyAgLyogMjMyNSAqLyAwLCAxNSwgNCwgMTUsIDExLCAxNSwgMTEsIDE1LCAxMSwgMTUsIDExLCA0LCA0LCAwLAorICAvKiAyMzM5ICovIDM2LCAxLCAzNiwgMSwgMTIsIDQsIDQsIDAsCisgIC8qIDIzNDcgKi8gMCwgMTQsIDIsIDMsIDEyLCA0LCAxMiwgNCwgNCwgMCwKKyAgLyogMjM1NyAqLyAxMiwgNCwgMTIsIDQsIDEyLCA0LCAxMiwgNCwgNCwgMCwKKyAgLyogMjM2NyAqLyAxMywgNCwgMTMsIDQsIDEyLCA0LCAxMiwgNCwgNCwgMCwKKyAgLyogMjM3NyAqLyAzNywgMSwgMzcsIDEsIDEzLCA0LCA0LCAwLAorICAvKiAyMzg1ICovIDEzLCA0LCAxMywgNCwgMTMsIDQsIDEzLCA0LCA0LCAwLAorICAvKiAyMzk1ICovIDE2LCA0LCAxNiwgNCwgMTMsIDQsIDEzLCA0LCA0LCAwLAorICAvKiAyNDA1ICovIDE2LCA0LCAxNiwgNCwgMTMsIDQsIDQsIDAsCisgIC8qIDI0MTMgKi8gNDAsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDksIDYsIDE1LCA0LCA0LCAwLAorICAvKiAyNDM0ICovIDIzLCA5LCA2LCA5LCA2LCA5LCA2LCA5LCA2LCAxNSwgNCwgNCwgMCwKKyAgLyogMjQ0NyAqLyA0MCwgNywgNywgNywgNywgNywgNywgNywgNywgMTUsIDQsIDQsIDAsCisgIC8qIDI0NjAgKi8gMTMsIDQsIDEzLCA0LCAxNiwgNCwgNCwgMCwKKyAgLyogMjQ2OCAqLyAxNiwgNCwgMTYsIDQsIDE2LCA0LCA0LCAwLAorICAvKiAyNDc2ICovIDE3LCAxNywgNCwgNCwgMCwKKyAgLyogMjQ4MSAqLyAxNSwgMCwgMTgsIDQsIDQsIDAsCisgIC8qIDI0ODcgKi8gMjEsIDQsIDQsIDAsCisgIC8qIDI0OTEgKi8gMjMsIDMsIDMsIDMsIDMsIDUsIDQsIDAsCisgIC8qIDI0OTkgKi8gMjEsIDMsIDMsIDUsIDQsIDAsCisgIC8qIDI1MDUgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDQsIDAsCisgIC8qIDI1MTMgKi8gMjEsIDQsIDQsIDUsIDQsIDAsCisgIC8qIDI1MTkgKi8gMjMsIDQsIDQsIDQsIDQsIDUsIDUsIDQsIDAsCisgIC8qIDI1MjggKi8gMjEsIDUsIDUsIDUsIDQsIDAsCisgIC8qIDI1MzQgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDUsIDQsIDAsCisgIC8qIDI1NDMgKi8gMjMsIDcsIDcsIDcsIDcsIDUsIDQsIDAsCisgIC8qIDI1NTEgKi8gMCwgMTQsIDIsIDIsIDEwLCA0LCA5LCA1LCA0LCAwLAorICAvKiAyNTYxICovIDAsIDE0LCAyLCAyLCA5LCA1LCA5LCA1LCA0LCAwLAorICAvKiAyNTcxICovIDksIDUsIDksIDUsIDksIDUsIDksIDUsIDQsIDAsCisgIC8qIDI1ODEgKi8gMCwgMTQsIDIsIDIsIDEwLCA0LCAxMCwgNSwgNCwgMCwKKyAgLyogMjU5MSAqLyAwLCAxNCwgMiwgMiwgMTAsIDUsIDEwLCA1LCA0LCAwLAorICAvKiAyNjAxICovIDAsIDE0LCAyLCAyLCAxMSwgNCwgMTEsIDUsIDQsIDAsCisgIC8qIDI2MTEgKi8gMCwgMTQsIDIsIDIsIDExLCA1LCAxMSwgNSwgNCwgMCwKKyAgLyogMjYyMSAqLyAyMSwgNSwgNCwgMCwKKyAgLyogMjYyNSAqLyAwLCAxNSwgNCwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgNCwgMCwKKyAgLyogMjYzOCAqLyAwLCAxNSwgNCwgNywgNywgNywgNywgNywgNywgNywgNywgNCwgMCwKKyAgLyogMjY1MSAqLyAyMSwgMTAsIDQsIDQsIDEwLCA3LCA0LCAwLAorICAvKiAyNjU5ICovIDAsIDE0LCAyLCAyLCAxMCwgNCwgMTAsIDcsIDQsIDAsCisgIC8qIDI2NjkgKi8gMCwgMTQsIDIsIDIsIDksIDUsIDEwLCA3LCA0LCAwLAorICAvKiAyNjc5ICovIDAsIDE0LCAyLCAyLCAxMCwgNSwgMTAsIDcsIDQsIDAsCisgIC8qIDI2ODkgKi8gMCwgMTQsIDIsIDIsIDExLCA0LCAxMSwgNywgNCwgMCwKKyAgLyogMjY5OSAqLyAwLCAxNCwgMiwgMiwgMTEsIDUsIDExLCA3LCA0LCAwLAorICAvKiAyNzA5ICovIDAsIDE0LCAyLCAzLCAxMiwgNCwgMTIsIDcsIDQsIDAsCisgIC8qIDI3MTkgKi8gMjEsIDksIDUsIDQsIDksIDgsIDQsIDAsCisgIC8qIDI3MjcgKi8gMCwgMTQsIDIsIDIsIDEwLCA0LCA5LCA4LCA0LCAwLAorICAvKiAyNzM3ICovIDAsIDE0LCAyLCAyLCA5LCA1LCA5LCA4LCA0LCAwLAorICAvKiAyNzQ3ICovIDAsIDE0LCAyLCAyLCAxMCwgNCwgMTAsIDgsIDQsIDAsCisgIC8qIDI3NTcgKi8gMCwgMTQsIDIsIDIsIDEwLCA1LCAxMCwgOCwgNCwgMCwKKyAgLyogMjc2NyAqLyAwLCAxNCwgMiwgMiwgMTEsIDQsIDExLCA4LCA0LCAwLAorICAvKiAyNzc3ICovIDAsIDE0LCAyLCAyLCAxMSwgNSwgMTEsIDgsIDQsIDAsCisgIC8qIDI3ODcgKi8gMjEsIDEwLCA0LCA0LCAxMCwgNCwgMCwKKyAgLyogMjc5NCAqLyAyMSwgMTEsIDMsIDQsIDEwLCA0LCAxMCwgNCwgMCwKKyAgLyogMjgwMyAqLyAyMSwgMTAsIDQsIDQsIDEwLCA0LCAxMCwgNCwgMCwKKyAgLyogMjgxMiAqLyAwLCAxNSwgNCwgMTUsIDExLCAxNSwgMTEsIDE1LCAxMSwgNCwgMCwKKyAgLyogMjgyMyAqLyAwLCAxNSwgNCwgMTUsIDExLCAxNSwgMTEsIDE1LCAxMSwgMTUsIDExLCA0LCAwLAorICAvKiAyODM2ICovIDEyLCA0LCAzNiwgMSwgMTIsIDQsIDAsCisgIC8qIDI4NDMgKi8gMCwgMzYsIDEsIDE0LCAyLCAxMiwgNCwgMCwKKyAgLyogMjg1MSAqLyAwLCAxNCwgMiwgMzYsIDEsIDQsIDQsIDEyLCA0LCAwLAorICAvKiAyODYxICovIDM2LCAxLCAzNiwgMSwgMTIsIDQsIDEyLCA0LCAwLAorICAvKiAyODcwICovIDEyLCA0LCAzNiwgMSwgMTIsIDQsIDEyLCA0LCAwLAorICAvKiAyODc5ICovIDEzLCA0LCAzNiwgMSwgMTIsIDQsIDEyLCA0LCAwLAorICAvKiAyODg4ICovIDAsIDM2LCAxLCA0LCA0LCAxMiwgNCwgMTIsIDQsIDAsCisgIC8qIDI4OTggKi8gMCwgMzYsIDEsIDQsIDQsIDEzLCA0LCAxMiwgNCwgMCwKKyAgLyogMjkwOCAqLyAyMywgMTUsIDMsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDE1LCAxMiwgNCwgMCwKKyAgLyogMjkyMSAqLyAyMiwgMTUsIDMsIDE1LCAzLCAxNSwgMywgMTUsIDEyLCA0LCAwLAorICAvKiAyOTMyICovIDIxLCAxNSwgMywgMTUsIDMsIDE1LCAxMiwgNCwgMCwKKyAgLyogMjk0MSAqLyAxMywgNCwgMzcsIDEsIDEzLCA0LCAwLAorICAvKiAyOTQ4ICovIDAsIDM3LCAxLCAxNCwgMiwgMTMsIDQsIDAsCisgIC8qIDI5NTYgKi8gMCwgMTQsIDIsIDM2LCAxLCA0LCA0LCAxMywgNCwgMCwKKyAgLyogMjk2NiAqLyAwLCAxNCwgMiwgMzcsIDEsIDQsIDQsIDEzLCA0LCAwLAorICAvKiAyOTc2ICovIDM3LCAxLCAzNywgMSwgMTMsIDQsIDEzLCA0LCAwLAorICAvKiAyOTg1ICovIDEzLCA0LCAzNywgMSwgMTMsIDQsIDEzLCA0LCAwLAorICAvKiAyOTk0ICovIDE2LCA0LCAzNywgMSwgMTMsIDQsIDEzLCA0LCAwLAorICAvKiAzMDAzICovIDAsIDM3LCAxLCA0LCA0LCAxMywgNCwgMTMsIDQsIDAsCisgIC8qIDMwMTMgKi8gMTYsIDQsIDE2LCA0LCAxMywgNCwgMTMsIDQsIDAsCisgIC8qIDMwMjIgKi8gMCwgNCwgNCwgMTYsIDQsIDEzLCA0LCAwLAorICAvKiAzMDMwICovIDAsIDM3LCAxLCA0LCA0LCAxNiwgNCwgMTMsIDQsIDAsCisgIC8qIDMwNDAgKi8gMTYsIDQsIDE2LCA0LCAxMywgNCwgMCwKKyAgLyogMzA0NyAqLyAwLCAxNCwgMjAsIDUsIDE1LCA0LCAwLAorICAvKiAzMDU0ICovIDQwLCA5LCA2LCA5LCA2LCA5LCA2LCA5LCA2LCA5LCA2LCA5LCA2LCA5LCA2LCA5LCA2LCAxNSwgNCwgMCwKKyAgLyogMzA3NCAqLyAyMywgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgMTUsIDQsIDAsCisgIC8qIDMwODYgKi8gNDAsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDcsIDE1LCA0LCAwLAorICAvKiAzMDk4ICovIDUsIDE5LCAxNSwgNCwgMCwKKyAgLyogMzEwMyAqLyAwLCAxNCwgMiwgMzcsIDEsIDQsIDQsIDE2LCA0LCAwLAorICAvKiAzMTEzICovIDAsIDE0LCAyLCA0LCA0LCAxNiwgNCwgMCwKKyAgLyogMzEyMSAqLyAxMywgNCwgMTYsIDQsIDAsCisgIC8qIDMxMjYgKi8gMTYsIDQsIDE2LCA0LCAxNiwgNCwgMCwKKyAgLyogMzEzMyAqLyA0LCAxNywgNCwgMCwKKyAgLyogMzEzNyAqLyAwLCAxNSwgNCwgMTUsIDEyLCAxNSwgMTcsIDQsIDAsCisgIC8qIDMxNDYgKi8gMTcsIDE3LCA0LCAwLAorICAvKiAzMTUwICovIDAsIDE0LCAyLCAxNiwgMiwgNSwgMCwKKyAgLyogMzE1NyAqLyAxNiwgMiwgMTQsIDIsIDE2LCAyLCA1LCAwLAorICAvKiAzMTY1ICovIDE2LCAyLCAxNiwgMiwgMTYsIDIsIDE2LCAyLCA1LCAwLAorICAvKiAzMTc1ICovIDUsIDE2LCAyLCAxNiwgMiwgNSwgMCwKKyAgLyogMzE4MiAqLyAyMSwgNSwgMSwgNCwgNSwgMCwKKyAgLyogMzE4OCAqLyAxNiwgNCwgMTYsIDQsIDEzLCA0LCA1LCAwLAorICAvKiAzMTk2ICovIDIxLCAxLCA1LCA1LCAwLAorICAvKiAzMjAxICovIDIxLCAxMCwgNCwgNCwgOSwgNSwgOSwgNSwgMCwKKyAgLyogMzIxMCAqLyAyMSwgOSwgNSwgNCwgOSwgNSwgOSwgNSwgMCwKKyAgLyogMzIxOSAqLyAwLCAxNSwgNCwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgMCwKKyAgLyogMzIzMSAqLyAyMywgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgMCwKKyAgLyogMzI4MSAqLyA0MCwgNywgNywgNywgNywgNywgNywgNywgNywgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgMCwKKyAgLyogMzMzMSAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNCwgNywgMCwKKyAgLyogMzM0MCAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNSwgNCwgNywgMCwKKyAgLyogMzM1MCAqLyAyMywgNywgNywgNywgNywgNSwgNSwgNCwgNywgMCwKKyAgLyogMzM2MCAqLyAyMywgNywgNywgNywgNywgNSwgNCwgNywgMCwKKyAgLyogMzM2OSAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNywgMCwKKyAgLyogMzM3NyAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNSwgNywgMCwKKyAgLyogMzM4NiAqLyAyMywgNywgNywgNywgNywgNSwgNSwgNywgMCwKKyAgLyogMzM5NSAqLyAyMywgNywgNywgNywgNywgNSwgNywgMCwKKyAgLyogMzQwMyAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNCwgNywgNywgMCwKKyAgLyogMzQxMyAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNSwgNCwgNywgNywgMCwKKyAgLyogMzQyNCAqLyAyMywgNywgNywgNywgNywgNSwgNSwgNCwgNywgNywgMCwKKyAgLyogMzQzNSAqLyAyMywgNywgNywgNywgNywgNSwgNCwgNywgNywgMCwKKyAgLyogMzQ0NSAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNywgNywgMCwKKyAgLyogMzQ1NCAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNSwgNywgNywgMCwKKyAgLyogMzQ2NCAqLyAyMywgNywgNywgNywgNywgNSwgNSwgNywgNywgMCwKKyAgLyogMzQ3NCAqLyAyMywgNywgNywgNywgNywgNSwgNywgNywgMCwKKyAgLyogMzQ4MyAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNCwgNywgNywgNywgMCwKKyAgLyogMzQ5NCAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNSwgNCwgNywgNywgNywgMCwKKyAgLyogMzUwNiAqLyAyMywgNywgNywgNywgNywgNSwgNSwgNCwgNywgNywgNywgMCwKKyAgLyogMzUxOCAqLyAyMywgNywgNywgNywgNywgNSwgNCwgNywgNywgNywgMCwKKyAgLyogMzUyOSAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNywgNywgNywgMCwKKyAgLyogMzUzOSAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNSwgNywgNywgNywgMCwKKyAgLyogMzU1MCAqLyAyMywgNywgNywgNywgNywgNSwgNSwgNywgNywgNywgMCwKKyAgLyogMzU2MSAqLyAyMywgNywgNywgNywgNywgNSwgNywgNywgNywgMCwKKyAgLyogMzU3MSAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNCwgNywgNywgNywgNywgMCwKKyAgLyogMzU4MyAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNSwgNCwgNywgNywgNywgNywgMCwKKyAgLyogMzU5NiAqLyAyMywgNywgNywgNywgNywgNSwgNSwgNCwgNywgNywgNywgNywgMCwKKyAgLyogMzYwOSAqLyAyMywgNywgNywgNywgNywgNSwgNCwgNywgNywgNywgNywgMCwKKyAgLyogMzYyMSAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNywgNywgNywgNywgMCwKKyAgLyogMzYzMiAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNSwgNywgNywgNywgNywgMCwKKyAgLyogMzY0NCAqLyAyMywgNywgNywgNywgNywgNSwgNSwgNywgNywgNywgNywgMCwKKyAgLyogMzY1NiAqLyAyMywgNywgNywgNywgNywgNSwgNywgNywgNywgNywgMCwKKyAgLyogMzY2NyAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNCwgNywgNywgNywgNywgNywgNywgMCwKKyAgLyogMzY4MSAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNSwgNCwgNywgNywgNywgNywgNywgNywgMCwKKyAgLyogMzY5NiAqLyAyMywgNywgNywgNywgNywgNSwgNSwgNCwgNywgNywgNywgNywgNywgNywgMCwKKyAgLyogMzcxMSAqLyAyMywgNywgNywgNywgNywgNSwgNCwgNywgNywgNywgNywgNywgNywgMCwKKyAgLyogMzcyNSAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNywgNywgNywgNywgNywgNywgMCwKKyAgLyogMzczOCAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNSwgNywgNywgNywgNywgNywgNywgMCwKKyAgLyogMzc1MiAqLyAyMywgNywgNywgNywgNywgNSwgNSwgNywgNywgNywgNywgNywgNywgMCwKKyAgLyogMzc2NiAqLyAyMywgNywgNywgNywgNywgNSwgNywgNywgNywgNywgNywgNywgMCwKKyAgLyogMzc3OSAqLyAwLCAxNSwgNCwgNywgNywgNywgNywgNywgNywgNywgNywgMCwKKyAgLyogMzc5MSAqLyAyMywgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgNywgNywgNywgNywgNywgNywgNywgNywgMCwKKyAgLyogMzg0MSAqLyA0MCwgNywgNywgNywgNywgNywgNywgNywgNywgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgOSwgNiwgNywgNywgNywgNywgNywgNywgNywgNywgMCwKKyAgLyogMzg5MSAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNywgNywgNywgNywgNywgNywgNywgNywgNywgMCwKKyAgLyogMzkwNyAqLyAyMywgNCwgNCwgNCwgNCwgNSwgNSwgNywgNywgNywgNywgNywgNywgNywgNywgNywgMCwKKyAgLyogMzkyNCAqLyAyMywgNywgNywgNywgNywgNSwgNSwgNywgNywgNywgNywgNywgNywgNywgNywgNywgMCwKKyAgLyogMzk0MSAqLyAyMywgNywgNywgNywgNywgNSwgNywgNywgNywgNywgNywgNywgNywgNywgNywgMCwKKyAgLyogMzk1NyAqLyAyMSwgMTAsIDQsIDQsIDEwLCA3LCAxMCwgNywgMCwKKyAgLyogMzk2NiAqLyAxNywgMTAsIDcsIDAsCisgIC8qIDM5NzAgKi8gMjEsIDksIDUsIDQsIDksIDgsIDksIDgsIDAsCisgIC8qIDM5NzkgKi8gOSwgOCwgOSwgOCwgOSwgOCwgOSwgOCwgMCwKKyAgLyogMzk4OCAqLyAxNywgOSwgOCwgMCwKKyAgLyogMzk5MiAqLyAxMCwgOCwgMTAsIDgsIDEwLCA4LCAxMCwgOCwgMCwKKyAgLyogNDAwMSAqLyAwLCAxNSwgMywgMTUsIDMsIDE1LCAzLCAxNSwgMTIsIDAsCisgIC8qIDQwMTEgKi8gMCwgMTUsIDMsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDE1LCAxMiwgMCwKKyAgLyogNDAyMyAqLyAyMywgMTUsIDMsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDE1LCAxMiwgMCwKKyAgLyogNDAzNSAqLyAyMiwgMTUsIDMsIDE1LCAzLCAxNSwgMywgMTUsIDEyLCAwLAorICAvKiA0MDQ1ICovIDIxLCAxNSwgMywgMTUsIDMsIDE1LCAxMiwgMCwKKyAgLyogNDA1MyAqLyAwLCAxNSwgMywgMTUsIDMsIDUsIDE1LCAxMiwgMCwKKyAgLyogNDA2MiAqLyAwLCAxNSwgMywgMTUsIDMsIDE1LCAzLCA1LCAxNSwgMTIsIDAsCisgIC8qIDQwNzMgKi8gMCwgMTUsIDMsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDUsIDE1LCAxMiwgMCwKKyAgLyogNDA4NiAqLyAyMywgMTUsIDMsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDE1LCAzLCA1LCAxNSwgMTIsIDAsCisgIC8qIDQxMDcgKi8gMjIsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDUsIDE1LCAxMiwgMCwKKyAgLyogNDEyNCAqLyAyMSwgMTUsIDMsIDE1LCAzLCAxNSwgMywgMTUsIDMsIDUsIDE1LCAxMiwgMCwKKyAgLyogNDEzNyAqLyA0LCAxNywgMCwKKyAgLyogNDE0MCAqLyAxMCwgNywgMTAsIDcsIDE3LCAwLAorICAvKiA0MTQ2ICovIDksIDgsIDE3LCAwLAorICAvKiA0MTUwICovIDAsIDE0LCAxNywgMTcsIDAsCisgIC8qIDQxNTUgKi8gMTcsIDE3LCAxNywgMCwKKyAgLyogNDE1OSAqLyAxNSwgMCwgMTgsIDAsCisgIC8qIDQxNjMgKi8gMSwgMTgsIDAsCisgIC8qIDQxNjYgKi8gMTUsIDQsIDE4LCAwLAorICAvKiA0MTcwICovIDAsIDE5LCAwLAorICAvKiA0MTczICovIDE1LCAxLCAxOSwgMCwKKyAgLyogNDE3NyAqLyAxLCAxNCwgMiwgMTksIDAsCisgIC8qIDQxODIgKi8gMjEsIDE0LCAyLCAxLCAxNCwgMiwgNCwgMTksIDAsCisgIC8qIDQxOTEgKi8gMTUsIDIsIDE1LCAxMCwgMTUsIDE5LCAwLAorICAvKiA0MTk4ICovIDE1LCAyLCAxNSwgMiwgMTUsIDIsIDE1LCAyLCAxOSwgMTksIDAsCisgIC8qIDQyMDkgKi8gMTUsIDIsIDE1LCAyLCA0LCAxOSwgMTksIDAsCisgIC8qIDQyMTcgKi8gMCwgMTksIDE5LCAxOSwgMCwKKyAgLyogNDIyMiAqLyAxNSwgMCwgMjksIDAsCisgIC8qIDQyMjYgKi8gMCwgMSwgMjksIDAsCisgIC8qIDQyMzAgKi8gMCwgNSwgNCwgMTQsIDIsIDQsIDI5LCAwLAorICAvKiA0MjM4ICovIDUsIDUsIDQsIDE0LCAyLCA0LCAyOSwgMCwKKyAgLyogNDI0NiAqLyAxOCwgNSwgNCwgMTUsIDQsIDQsIDQsIDI5LCAwLAorICAvKiA0MjU1ICovIDAsIDUsIDQsIDI5LCAwLAorICAvKiA0MjYwICovIDI4LCAzNSwgMjgsIDM1LCAyOCwgMzUsIDI4LCAzNSwgMCwKKyAgMjU1Cit9OworCisjZW5kaWYKKworLy8gQWRkIHBhcmFtZXRlciBhdHRyaWJ1dGVzIHRoYXQgYXJlIG5vdCBjb21tb24gdG8gYWxsIGludHJpbnNpY3MuCisjaWZkZWYgR0VUX0lOVFJJTlNJQ19BVFRSSUJVVEVTCitBdHRyaWJ1dGVMaXN0IEludHJpbnNpYzo6Z2V0QXR0cmlidXRlcyhMTFZNQ29udGV4dCAmQywgSUQgaWQpIHsKKyAgc3RhdGljIGNvbnN0IHVpbnQ4X3QgSW50cmluc2ljc1RvQXR0cmlidXRlc01hcFtdID0geworICAgIDEsIC8vIGxsdm0uYWRkcmVzc29mcmV0dXJuYWRkcmVzcworICAgIDIsIC8vIGxsdm0uYWRqdXN0LnRyYW1wb2xpbmUKKyAgICAzLCAvLyBsbHZtLmFubm90YXRpb24KKyAgICAzLCAvLyBsbHZtLmFzc3VtZQorICAgIDQsIC8vIGxsdm0uYml0cmV2ZXJzZQorICAgIDQsIC8vIGxsdm0uYnN3YXAKKyAgICA0LCAvLyBsbHZtLmNhbm9uaWNhbGl6ZQorICAgIDQsIC8vIGxsdm0uY2VpbAorICAgIDMsIC8vIGxsdm0uY2xlYXJfY2FjaGUKKyAgICA1LCAvLyBsbHZtLmNvZGV2aWV3LmFubm90YXRpb24KKyAgICAxLCAvLyBsbHZtLmNvbnZlcnQuZnJvbS5mcDE2CisgICAgMSwgLy8gbGx2bS5jb252ZXJ0LnRvLmZwMTYKKyAgICA0LCAvLyBsbHZtLmNvcHlzaWduCisgICAgMywgLy8gbGx2bS5jb3JvLmFsbG9jCisgICAgNiwgLy8gbGx2bS5jb3JvLmJlZ2luCisgICAgNywgLy8gbGx2bS5jb3JvLmRlc3Ryb3kKKyAgICA4LCAvLyBsbHZtLmNvcm8uZG9uZQorICAgIDMsIC8vIGxsdm0uY29yby5lbmQKKyAgICAxLCAvLyBsbHZtLmNvcm8uZnJhbWUKKyAgICA5LCAvLyBsbHZtLmNvcm8uZnJlZQorICAgIDEwLCAvLyBsbHZtLmNvcm8uaWQKKyAgICAxMSwgLy8gbGx2bS5jb3JvLnBhcmFtCisgICAgMTIsIC8vIGxsdm0uY29yby5wcm9taXNlCisgICAgNywgLy8gbGx2bS5jb3JvLnJlc3VtZQorICAgIDMsIC8vIGxsdm0uY29yby5zYXZlCisgICAgMSwgLy8gbGx2bS5jb3JvLnNpemUKKyAgICAxMywgLy8gbGx2bS5jb3JvLnN1YmZuLmFkZHIKKyAgICAzLCAvLyBsbHZtLmNvcm8uc3VzcGVuZAorICAgIDQsIC8vIGxsdm0uY29zCisgICAgNCwgLy8gbGx2bS5jdGx6CisgICAgNCwgLy8gbGx2bS5jdHBvcAorICAgIDQsIC8vIGxsdm0uY3R0egorICAgIDQsIC8vIGxsdm0uZGJnLmFkZHIKKyAgICA0LCAvLyBsbHZtLmRiZy5kZWNsYXJlCisgICAgNCwgLy8gbGx2bS5kYmcudmFsdWUKKyAgICAzLCAvLyBsbHZtLmRlYnVndHJhcAorICAgIDEsIC8vIGxsdm0uZG9ub3RoaW5nCisgICAgMywgLy8gbGx2bS5laC5kd2FyZi5jZmEKKyAgICAxLCAvLyBsbHZtLmVoLmV4Y2VwdGlvbmNvZGUKKyAgICAxLCAvLyBsbHZtLmVoLmV4Y2VwdGlvbnBvaW50ZXIKKyAgICAzLCAvLyBsbHZtLmVoLnJldHVybi5pMzIKKyAgICAzLCAvLyBsbHZtLmVoLnJldHVybi5pNjQKKyAgICAxLCAvLyBsbHZtLmVoLnNqbGouY2FsbHNpdGUKKyAgICAzLCAvLyBsbHZtLmVoLnNqbGouZnVuY3Rpb25jb250ZXh0CisgICAgMTQsIC8vIGxsdm0uZWguc2psai5sb25nam1wCisgICAgMSwgLy8gbGx2bS5laC5zamxqLmxzZGEKKyAgICAzLCAvLyBsbHZtLmVoLnNqbGouc2V0am1wCisgICAgMywgLy8gbGx2bS5laC5zamxqLnNldHVwLmRpc3BhdGNoCisgICAgMSwgLy8gbGx2bS5laC50eXBlaWQuZm9yCisgICAgMywgLy8gbGx2bS5laC51bndpbmQuaW5pdAorICAgIDQsIC8vIGxsdm0uZXhwCisgICAgNCwgLy8gbGx2bS5leHAyCisgICAgMSwgLy8gbGx2bS5leHBlY3QKKyAgICAxNSwgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuY29zCisgICAgMTUsIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmV4cAorICAgIDE1LCAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5leHAyCisgICAgMTUsIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmZhZGQKKyAgICAxNSwgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuZmRpdgorICAgIDE1LCAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5mbWEKKyAgICAxNSwgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuZm11bAorICAgIDE1LCAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5mcmVtCisgICAgMTUsIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmZzdWIKKyAgICAxNSwgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQubG9nCisgICAgMTUsIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmxvZzEwCisgICAgMTUsIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLmxvZzIKKyAgICAxNSwgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQubmVhcmJ5aW50CisgICAgMTUsIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLnBvdworICAgIDE1LCAvLyBsbHZtLmV4cGVyaW1lbnRhbC5jb25zdHJhaW5lZC5wb3dpCisgICAgMTUsIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLnJpbnQKKyAgICAxNSwgLy8gbGx2bS5leHBlcmltZW50YWwuY29uc3RyYWluZWQuc2luCisgICAgMTUsIC8vIGxsdm0uZXhwZXJpbWVudGFsLmNvbnN0cmFpbmVkLnNxcnQKKyAgICA3LCAvLyBsbHZtLmV4cGVyaW1lbnRhbC5kZW9wdGltaXplCisgICAgMTYsIC8vIGxsdm0uZXhwZXJpbWVudGFsLmdjLnJlbG9jYXRlCisgICAgMTYsIC8vIGxsdm0uZXhwZXJpbWVudGFsLmdjLnJlc3VsdAorICAgIDcsIC8vIGxsdm0uZXhwZXJpbWVudGFsLmdjLnN0YXRlcG9pbnQKKyAgICA3LCAvLyBsbHZtLmV4cGVyaW1lbnRhbC5ndWFyZAorICAgIDcsIC8vIGxsdm0uZXhwZXJpbWVudGFsLnBhdGNocG9pbnQuaTY0CisgICAgNywgLy8gbGx2bS5leHBlcmltZW50YWwucGF0Y2hwb2ludC52b2lkCisgICAgNywgLy8gbGx2bS5leHBlcmltZW50YWwuc3RhY2ttYXAKKyAgICAxLCAvLyBsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLmFkZAorICAgIDEsIC8vIGxsdm0uZXhwZXJpbWVudGFsLnZlY3Rvci5yZWR1Y2UuYW5kCisgICAgMSwgLy8gbGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5mYWRkCisgICAgMSwgLy8gbGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5mbWF4CisgICAgMSwgLy8gbGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5mbWluCisgICAgMSwgLy8gbGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5mbXVsCisgICAgMSwgLy8gbGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5tdWwKKyAgICAxLCAvLyBsbHZtLmV4cGVyaW1lbnRhbC52ZWN0b3IucmVkdWNlLm9yCisgICAgMSwgLy8gbGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5zbWF4CisgICAgMSwgLy8gbGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS5zbWluCisgICAgMSwgLy8gbGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS51bWF4CisgICAgMSwgLy8gbGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS51bWluCisgICAgMSwgLy8gbGx2bS5leHBlcmltZW50YWwudmVjdG9yLnJlZHVjZS54b3IKKyAgICA0LCAvLyBsbHZtLmZhYnMKKyAgICA0LCAvLyBsbHZtLmZsb29yCisgICAgMywgLy8gbGx2bS5mbHQucm91bmRzCisgICAgNCwgLy8gbGx2bS5mbWEKKyAgICA0LCAvLyBsbHZtLmZtdWxhZGQKKyAgICAxLCAvLyBsbHZtLmZyYW1lYWRkcmVzcworICAgIDIsIC8vIGxsdm0uZ2NyZWFkCisgICAgMywgLy8gbGx2bS5nY3Jvb3QKKyAgICAxNywgLy8gbGx2bS5nY3dyaXRlCisgICAgMywgLy8gbGx2bS5nZXQuZHluYW1pYy5hcmVhLm9mZnNldAorICAgIDMsIC8vIGxsdm0uaWNhbGwuYnJhbmNoLmZ1bm5lbAorICAgIDE4LCAvLyBsbHZtLmluaXQudHJhbXBvbGluZQorICAgIDMsIC8vIGxsdm0uaW5zdHJwcm9mLmluY3JlbWVudAorICAgIDMsIC8vIGxsdm0uaW5zdHJwcm9mLmluY3JlbWVudC5zdGVwCisgICAgMywgLy8gbGx2bS5pbnN0cnByb2YudmFsdWUucHJvZmlsZQorICAgIDE5LCAvLyBsbHZtLmludmFyaWFudC5lbmQKKyAgICAyLCAvLyBsbHZtLmludmFyaWFudC5ncm91cC5iYXJyaWVyCisgICAgMjAsIC8vIGxsdm0uaW52YXJpYW50LnN0YXJ0CisgICAgMjAsIC8vIGxsdm0ubGlmZXRpbWUuZW5kCisgICAgMjAsIC8vIGxsdm0ubGlmZXRpbWUuc3RhcnQKKyAgICAyLCAvLyBsbHZtLmxvYWQucmVsYXRpdmUKKyAgICAxLCAvLyBsbHZtLmxvY2FsYWRkcmVzcworICAgIDMsIC8vIGxsdm0ubG9jYWxlc2NhcGUKKyAgICAxLCAvLyBsbHZtLmxvY2FscmVjb3ZlcgorICAgIDQsIC8vIGxsdm0ubG9nCisgICAgNCwgLy8gbGx2bS5sb2cxMAorICAgIDQsIC8vIGxsdm0ubG9nMgorICAgIDE0LCAvLyBsbHZtLmxvbmdqbXAKKyAgICAyMSwgLy8gbGx2bS5tYXNrZWQuY29tcHJlc3NzdG9yZQorICAgIDE2LCAvLyBsbHZtLm1hc2tlZC5leHBhbmRsb2FkCisgICAgMTYsIC8vIGxsdm0ubWFza2VkLmdhdGhlcgorICAgIDIsIC8vIGxsdm0ubWFza2VkLmxvYWQKKyAgICAzLCAvLyBsbHZtLm1hc2tlZC5zY2F0dGVyCisgICAgMjEsIC8vIGxsdm0ubWFza2VkLnN0b3JlCisgICAgNCwgLy8gbGx2bS5tYXhudW0KKyAgICAyMiwgLy8gbGx2bS5tZW1jcHkKKyAgICAyMiwgLy8gbGx2bS5tZW1jcHkuZWxlbWVudC51bm9yZGVyZWQuYXRvbWljCisgICAgMjMsIC8vIGxsdm0ubWVtbW92ZQorICAgIDIyLCAvLyBsbHZtLm1lbW1vdmUuZWxlbWVudC51bm9yZGVyZWQuYXRvbWljCisgICAgMjQsIC8vIGxsdm0ubWVtc2V0CisgICAgMjQsIC8vIGxsdm0ubWVtc2V0LmVsZW1lbnQudW5vcmRlcmVkLmF0b21pYworICAgIDQsIC8vIGxsdm0ubWlubnVtCisgICAgNCwgLy8gbGx2bS5uZWFyYnlpbnQKKyAgICA0LCAvLyBsbHZtLm9iamVjdHNpemUKKyAgICAzLCAvLyBsbHZtLnBjbWFya2VyCisgICAgNCwgLy8gbGx2bS5wb3cKKyAgICA0LCAvLyBsbHZtLnBvd2kKKyAgICAyNSwgLy8gbGx2bS5wcmVmZXRjaAorICAgIDMsIC8vIGxsdm0ucHRyLmFubm90YXRpb24KKyAgICAxNiwgLy8gbGx2bS5yZWFkX3JlZ2lzdGVyCisgICAgMywgLy8gbGx2bS5yZWFkY3ljbGVjb3VudGVyCisgICAgMSwgLy8gbGx2bS5yZXR1cm5hZGRyZXNzCisgICAgNCwgLy8gbGx2bS5yaW50CisgICAgNCwgLy8gbGx2bS5yb3VuZAorICAgIDQsIC8vIGxsdm0uc2FkZC53aXRoLm92ZXJmbG93CisgICAgMywgLy8gbGx2bS5zZXRqbXAKKyAgICAxNSwgLy8gbGx2bS5zaWRlZWZmZWN0CisgICAgMTQsIC8vIGxsdm0uc2lnbG9uZ2ptcAorICAgIDMsIC8vIGxsdm0uc2lnc2V0am1wCisgICAgNCwgLy8gbGx2bS5zaW4KKyAgICA0LCAvLyBsbHZtLnNtdWwud2l0aC5vdmVyZmxvdworICAgIDQsIC8vIGxsdm0uc3FydAorICAgIDI2LCAvLyBsbHZtLnNzYS5jb3B5CisgICAgNCwgLy8gbGx2bS5zc3ViLndpdGgub3ZlcmZsb3cKKyAgICAzLCAvLyBsbHZtLnN0YWNrZ3VhcmQKKyAgICAzLCAvLyBsbHZtLnN0YWNrcHJvdGVjdG9yCisgICAgMywgLy8gbGx2bS5zdGFja3Jlc3RvcmUKKyAgICAzLCAvLyBsbHZtLnN0YWNrc2F2ZQorICAgIDEsIC8vIGxsdm0udGhyZWFkLnBvaW50ZXIKKyAgICAxNCwgLy8gbGx2bS50cmFwCisgICAgNCwgLy8gbGx2bS50cnVuYworICAgIDEsIC8vIGxsdm0udHlwZS5jaGVja2VkLmxvYWQKKyAgICAxLCAvLyBsbHZtLnR5cGUudGVzdAorICAgIDQsIC8vIGxsdm0udWFkZC53aXRoLm92ZXJmbG93CisgICAgNCwgLy8gbGx2bS51bXVsLndpdGgub3ZlcmZsb3cKKyAgICA0LCAvLyBsbHZtLnVzdWIud2l0aC5vdmVyZmxvdworICAgIDMsIC8vIGxsdm0udmFfY29weQorICAgIDMsIC8vIGxsdm0udmFfZW5kCisgICAgMywgLy8gbGx2bS52YV9zdGFydAorICAgIDMsIC8vIGxsdm0udmFyLmFubm90YXRpb24KKyAgICAzLCAvLyBsbHZtLndyaXRlX3JlZ2lzdGVyCisgICAgMjcsIC8vIGxsdm0ueHJheS5jdXN0b21ldmVudAorICAgIDMsIC8vIGxsdm0uYWFyY2g2NC5jbHJleAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5jcmMzMmIKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQuY3JjMzJjYgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5jcmMzMmNoCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0LmNyYzMyY3cKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQuY3JjMzJjeAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5jcmMzMmgKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQuY3JjMzJ3CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0LmNyYzMyeAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5jcnlwdG8uYWVzZAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5jcnlwdG8uYWVzZQorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5jcnlwdG8uYWVzaW1jCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0LmNyeXB0by5hZXNtYworICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5jcnlwdG8uc2hhMWMKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTFoCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0LmNyeXB0by5zaGExbQorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5jcnlwdG8uc2hhMXAKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTFzdTAKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTFzdTEKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTI1NmgKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTI1NmgyCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0LmNyeXB0by5zaGEyNTZzdTAKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQuY3J5cHRvLnNoYTI1NnN1MQorICAgIDMsIC8vIGxsdm0uYWFyY2g2NC5kbWIKKyAgICAzLCAvLyBsbHZtLmFhcmNoNjQuZHNiCisgICAgMywgLy8gbGx2bS5hYXJjaDY0LmhpbnQKKyAgICAzLCAvLyBsbHZtLmFhcmNoNjQuaXNiCisgICAgMywgLy8gbGx2bS5hYXJjaDY0LmxkYXhwCisgICAgMywgLy8gbGx2bS5hYXJjaDY0LmxkYXhyCisgICAgMywgLy8gbGx2bS5hYXJjaDY0LmxkeHAKKyAgICAzLCAvLyBsbHZtLmFhcmNoNjQubGR4cgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmFicworICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmFkZGhuCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uYWRkcAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmNscworICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZhYmQKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mYWNnZQorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZhY2d0CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZmFkZHYKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mY3Z0YXMKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mY3Z0YXUKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mY3Z0bXMKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mY3Z0bXUKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mY3Z0bnMKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mY3Z0bnUKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mY3Z0cHMKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mY3Z0cHUKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mY3Z0eG4KKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mY3Z0enMKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mY3Z0enUKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mbWF4CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZm1heG5tCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZm1heG5tcAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZtYXhubXYKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mbWF4cAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZtYXh2CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZm1pbgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZtaW5ubQorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZtaW5ubXAKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mbWlubm12CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZm1pbnAKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5mbWludgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZtdWx4CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZnJlY3BlCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZnJlY3BzCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZnJlY3B4CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZnJpbnRuCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uZnJzcXJ0ZQorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmZyc3FydHMKKyAgICAyLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5sZDF4MgorICAgIDIsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmxkMXgzCisgICAgMiwgLy8gbGx2bS5hYXJjaDY0Lm5lb24ubGQxeDQKKyAgICAyLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5sZDIKKyAgICAyLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5sZDJsYW5lCisgICAgMiwgLy8gbGx2bS5hYXJjaDY0Lm5lb24ubGQycgorICAgIDIsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmxkMworICAgIDIsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmxkM2xhbmUKKyAgICAyLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5sZDNyCisgICAgMiwgLy8gbGx2bS5hYXJjaDY0Lm5lb24ubGQ0CisgICAgMiwgLy8gbGx2bS5hYXJjaDY0Lm5lb24ubGQ0bGFuZQorICAgIDIsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLmxkNHIKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5wbXVsCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24ucG11bGwKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5wbXVsbDY0CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24ucmFkZGhuCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24ucmJpdAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnJzaHJuCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24ucnN1YmhuCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc2FiZAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNhZGRscAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNhZGRsdgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNhZGR2CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc2NhbGFyLnNxeHRuCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc2NhbGFyLnNxeHR1bgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNjYWxhci51cXh0bgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNoYWRkCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc2hsbAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNoc3ViCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc21heAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNtYXhwCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc21heHYKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zbWluCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc21pbnAKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zbWludgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNtdWxsCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3FhYnMKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcWFkZAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxZG11bGgKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcWRtdWxsCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3FkbXVsbHMuc2NhbGFyCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3FuZWcKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcXJkbXVsaAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxcnNobAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxcnNocm4KKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcXJzaHJ1bgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxc2hsCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3FzaGx1CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3FzaHJuCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3FzaHJ1bgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNxc3ViCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3F4dG4KKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcXh0dW4KKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcmhhZGQKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zcnNobAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnNzaGwKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zc2hsbAorICAgIDE5LCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zdDF4MgorICAgIDI4LCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zdDF4MworICAgIDI5LCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zdDF4NAorICAgIDE5LCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zdDIKKyAgICAyOCwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3QybGFuZQorICAgIDI4LCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zdDMKKyAgICAyOSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3QzbGFuZQorICAgIDI5LCAvLyBsbHZtLmFhcmNoNjQubmVvbi5zdDQKKyAgICAzMCwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3Q0bGFuZQorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnN1YmhuCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24uc3VxYWRkCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udGJsMQorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnRibDIKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi50YmwzCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udGJsNAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnRieDEKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi50YngyCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udGJ4MworICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnRieDQKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi51YWJkCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udWFkZGxwCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udWFkZGx2CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udWFkZHYKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi51aGFkZAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVoc3ViCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udW1heAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVtYXhwCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udW1heHYKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi51bWluCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udW1pbnAKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi51bWludgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVtdWxsCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udXFhZGQKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi51cXJzaGwKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi51cXJzaHJuCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udXFzaGwKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi51cXNocm4KKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi51cXN1YgorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVxeHRuCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udXJlY3BlCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udXJoYWRkCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udXJzaGwKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi51cnNxcnRlCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udXNobAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnVzaGxsCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udXNxYWRkCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udmNvcHkubGFuZQorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnZjdnRmcDJmeHMKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi52Y3Z0ZnAyZnh1CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udmN2dGZwMmhmCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udmN2dGZ4czJmcAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5uZW9uLnZjdnRmeHUyZnAKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi52Y3Z0aGYyZnAKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQubmVvbi52c2xpCisgICAgMSwgLy8gbGx2bS5hYXJjaDY0Lm5lb24udnNyaQorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5zZGl2CisgICAgMSwgLy8gbGx2bS5hYXJjaDY0LnNpc2QuZmFiZAorICAgIDEsIC8vIGxsdm0uYWFyY2g2NC5zaXNkLmZjdnR4bgorICAgIDMsIC8vIGxsdm0uYWFyY2g2NC5zdGx4cAorICAgIDMsIC8vIGxsdm0uYWFyY2g2NC5zdGx4cgorICAgIDMsIC8vIGxsdm0uYWFyY2g2NC5zdHhwCisgICAgMywgLy8gbGx2bS5hYXJjaDY0LnN0eHIKKyAgICAxLCAvLyBsbHZtLmFhcmNoNjQudWRpdgorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLmFsaWduYml0CisgICAgNCwgLy8gbGx2bS5hbWRnY24uYWxpZ25ieXRlCisgICAgMTgsIC8vIGxsdm0uYW1kZ2NuLmF0b21pYy5kZWMKKyAgICAxOCwgLy8gbGx2bS5hbWRnY24uYXRvbWljLmluYworICAgIDMxLCAvLyBsbHZtLmFtZGdjbi5icmVhaworICAgIDMsIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci5hdG9taWMuYWRkCisgICAgMywgLy8gbGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy5hbmQKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLmNtcHN3YXAKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLm9yCisgICAgMywgLy8gbGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy5zbWF4CisgICAgMywgLy8gbGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy5zbWluCisgICAgMywgLy8gbGx2bS5hbWRnY24uYnVmZmVyLmF0b21pYy5zdWIKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLnN3YXAKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLnVtYXgKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLnVtaW4KKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5idWZmZXIuYXRvbWljLnhvcgorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5idWZmZXIubG9hZAorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5idWZmZXIubG9hZC5mb3JtYXQKKyAgICAzMiwgLy8gbGx2bS5hbWRnY24uYnVmZmVyLnN0b3JlCisgICAgMzIsIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci5zdG9yZS5mb3JtYXQKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5idWZmZXIud2JpbnZsMQorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLmJ1ZmZlci53YmludmwxLnNjCisgICAgMywgLy8gbGx2bS5hbWRnY24uYnVmZmVyLndiaW52bDEudm9sCisgICAgNCwgLy8gbGx2bS5hbWRnY24uY2xhc3MKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5jb3MKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5jdWJlaWQKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5jdWJlbWEKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5jdWJlc2MKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5jdWJldGMKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5jdnQucGsuaTE2CisgICAgNCwgLy8gbGx2bS5hbWRnY24uY3Z0LnBrLnUxNgorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLmN2dC5way51OC5mMzIKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5jdnQucGtub3JtLmkxNgorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLmN2dC5wa25vcm0udTE2CisgICAgNCwgLy8gbGx2bS5hbWRnY24uY3Z0LnBrcnR6CisgICAgNCwgLy8gbGx2bS5hbWRnY24uZGlzcGF0Y2guaWQKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5kaXNwYXRjaC5wdHIKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5kaXYuZml4dXAKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5kaXYuZm1hcworICAgIDQsIC8vIGxsdm0uYW1kZ2NuLmRpdi5zY2FsZQorICAgIDMxLCAvLyBsbHZtLmFtZGdjbi5kcy5icGVybXV0ZQorICAgIDE4LCAvLyBsbHZtLmFtZGdjbi5kcy5mYWRkCisgICAgMTgsIC8vIGxsdm0uYW1kZ2NuLmRzLmZtYXgKKyAgICAxOCwgLy8gbGx2bS5hbWRnY24uZHMuZm1pbgorICAgIDMxLCAvLyBsbHZtLmFtZGdjbi5kcy5wZXJtdXRlCisgICAgMzEsIC8vIGxsdm0uYW1kZ2NuLmRzLnN3aXp6bGUKKyAgICAzMywgLy8gbGx2bS5hbWRnY24uZWxzZQorICAgIDMxLCAvLyBsbHZtLmFtZGdjbi5lbHNlLmJyZWFrCisgICAgMzMsIC8vIGxsdm0uYW1kZ2NuLmVuZC5jZgorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLmV4cAorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLmV4cC5jb21wcgorICAgIDMxLCAvLyBsbHZtLmFtZGdjbi5mY21wCisgICAgNCwgLy8gbGx2bS5hbWRnY24uZmRpdi5mYXN0CisgICAgNCwgLy8gbGx2bS5hbWRnY24uZm1lZDMKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5mbXVsLmxlZ2FjeQorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLmZyYWN0CisgICAgNCwgLy8gbGx2bS5hbWRnY24uZnJleHAuZXhwCisgICAgNCwgLy8gbGx2bS5hbWRnY24uZnJleHAubWFudAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLmdyb3Vwc3RhdGljc2l6ZQorICAgIDMxLCAvLyBsbHZtLmFtZGdjbi5pY21wCisgICAgMzMsIC8vIGxsdm0uYW1kZ2NuLmlmCisgICAgMzEsIC8vIGxsdm0uYW1kZ2NuLmlmLmJyZWFrCisgICAgMywgLy8gbGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLmFkZAorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy5hbmQKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuY21wc3dhcAorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy5kZWMKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuaW5jCisgICAgMywgLy8gbGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLm9yCisgICAgMywgLy8gbGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLnNtYXgKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuc21pbgorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy5zdWIKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMuc3dhcAorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmF0b21pYy51bWF4CisgICAgMywgLy8gbGx2bS5hbWRnY24uaW1hZ2UuYXRvbWljLnVtaW4KKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5hdG9taWMueG9yCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5iCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYi5jbAorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmIuY2wubworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmIubworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLmIKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLmIuY2wKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5jLmIuY2wubworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMuYi5vCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5jbAorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMuY2wubworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMubAorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMubC5vCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuYy5segorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMubHoubworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmMubworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmNsCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmdhdGhlcjQuY2wubworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0LmwKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5sLm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5segorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5nYXRoZXI0Lmx6Lm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2F0aGVyNC5vCisgICAgMSwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2V0bG9kCisgICAgMSwgLy8gbGx2bS5hbWRnY24uaW1hZ2UuZ2V0cmVzaW5mbworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5sb2FkCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLmxvYWQubWlwCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZQorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYgorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYi5jbAorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYi5jbC5vCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5iLm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuYgorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5iLmNsCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmIuY2wubworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5iLm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuY2QKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuY2QuY2wKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuY2QuY2wubworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5jZC5vCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmNsCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmNsLm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMuZAorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5kLmNsCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jLmQuY2wubworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5kLm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMubAorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5sLm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMubHoKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmMubHoubworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuYy5vCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jZAorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUuY2QuY2wKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmNkLmNsLm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmNkLm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmNsCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5jbC5vCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5kCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5kLmNsCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5kLmNsLm8KKyAgICAxNiwgLy8gbGx2bS5hbWRnY24uaW1hZ2Uuc2FtcGxlLmQubworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUubAorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUubC5vCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLmltYWdlLnNhbXBsZS5segorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUubHoubworICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zYW1wbGUubworICAgIDMyLCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zdG9yZQorICAgIDMyLCAvLyBsbHZtLmFtZGdjbi5pbWFnZS5zdG9yZS5taXAKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5pbXBsaWNpdC5idWZmZXIucHRyCisgICAgNCwgLy8gbGx2bS5hbWRnY24uaW1wbGljaXRhcmcucHRyCisgICAgMzMsIC8vIGxsdm0uYW1kZ2NuLmluaXQuZXhlYworICAgIDMzLCAvLyBsbHZtLmFtZGdjbi5pbml0LmV4ZWMuZnJvbS5pbnB1dAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLmludGVycC5tb3YKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5pbnRlcnAucDEKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5pbnRlcnAucDIKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5rZXJuYXJnLnNlZ21lbnQucHRyCisgICAgMywgLy8gbGx2bS5hbWRnY24ua2lsbAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLmxkZXhwCisgICAgNCwgLy8gbGx2bS5hbWRnY24ubGVycAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLmxvZy5jbGFtcAorICAgIDMzLCAvLyBsbHZtLmFtZGdjbi5sb29wCisgICAgMSwgLy8gbGx2bS5hbWRnY24ubWJjbnQuaGkKKyAgICAxLCAvLyBsbHZtLmFtZGdjbi5tYmNudC5sbworICAgIDMxLCAvLyBsbHZtLmFtZGdjbi5tb3YuZHBwCisgICAgNCwgLy8gbGx2bS5hbWRnY24ubXFzYWQucGsudTE2LnU4CisgICAgNCwgLy8gbGx2bS5hbWRnY24ubXFzYWQudTMyLnU4CisgICAgNCwgLy8gbGx2bS5hbWRnY24ubXNhZC51OAorICAgIDEsIC8vIGxsdm0uYW1kZ2NuLnBzLmxpdmUKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5xc2FkLnBrLnUxNi51OAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLnF1ZXVlLnB0cgorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLnJjcAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLnJjcC5sZWdhY3kKKyAgICAzMSwgLy8gbGx2bS5hbWRnY24ucmVhZGZpcnN0bGFuZQorICAgIDMxLCAvLyBsbHZtLmFtZGdjbi5yZWFkbGFuZQorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLnJzcQorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLnJzcS5jbGFtcAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLnJzcS5sZWdhY3kKKyAgICAzMywgLy8gbGx2bS5hbWRnY24ucy5iYXJyaWVyCisgICAgMywgLy8gbGx2bS5hbWRnY24ucy5kY2FjaGUuaW52CisgICAgMywgLy8gbGx2bS5hbWRnY24ucy5kY2FjaGUuaW52LnZvbAorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLnMuZGNhY2hlLndiCisgICAgMywgLy8gbGx2bS5hbWRnY24ucy5kY2FjaGUud2Iudm9sCisgICAgMywgLy8gbGx2bS5hbWRnY24ucy5kZWNwZXJmbGV2ZWwKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5zLmdldHBjCisgICAgMzQsIC8vIGxsdm0uYW1kZ2NuLnMuZ2V0cmVnCisgICAgMywgLy8gbGx2bS5hbWRnY24ucy5pbmNwZXJmbGV2ZWwKKyAgICAxNiwgLy8gbGx2bS5hbWRnY24ucy5tZW1yZWFsdGltZQorICAgIDE2LCAvLyBsbHZtLmFtZGdjbi5zLm1lbXRpbWUKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5zLnNlbmRtc2cKKyAgICAzLCAvLyBsbHZtLmFtZGdjbi5zLnNlbmRtc2doYWx0CisgICAgMywgLy8gbGx2bS5hbWRnY24ucy5zbGVlcAorICAgIDMsIC8vIGxsdm0uYW1kZ2NuLnMud2FpdGNudAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLnNhZC5oaS51OAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLnNhZC51MTYKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5zYWQudTgKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi5zYmZlCisgICAgMzEsIC8vIGxsdm0uYW1kZ2NuLnNldC5pbmFjdGl2ZQorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLnNmZmJoCisgICAgNCwgLy8gbGx2bS5hbWRnY24uc2luCisgICAgMTYsIC8vIGxsdm0uYW1kZ2NuLnRidWZmZXIubG9hZAorICAgIDMyLCAvLyBsbHZtLmFtZGdjbi50YnVmZmVyLnN0b3JlCisgICAgNCwgLy8gbGx2bS5hbWRnY24udHJpZy5wcmVvcAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLnViZmUKKyAgICAzMywgLy8gbGx2bS5hbWRnY24udW5yZWFjaGFibGUKKyAgICAzMSwgLy8gbGx2bS5hbWRnY24udXBkYXRlLmRwcAorICAgIDMzLCAvLyBsbHZtLmFtZGdjbi53YXZlLmJhcnJpZXIKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi53b3JrZ3JvdXAuaWQueAorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLndvcmtncm91cC5pZC55CisgICAgNCwgLy8gbGx2bS5hbWRnY24ud29ya2dyb3VwLmlkLnoKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi53b3JraXRlbS5pZC54CisgICAgNCwgLy8gbGx2bS5hbWRnY24ud29ya2l0ZW0uaWQueQorICAgIDQsIC8vIGxsdm0uYW1kZ2NuLndvcmtpdGVtLmlkLnoKKyAgICA0LCAvLyBsbHZtLmFtZGdjbi53cW0KKyAgICAzMSwgLy8gbGx2bS5hbWRnY24ud3FtLnZvdGUKKyAgICAzMSwgLy8gbGx2bS5hbWRnY24ud3JpdGVsYW5lCisgICAgNCwgLy8gbGx2bS5hbWRnY24ud3dtCisgICAgMywgLy8gbGx2bS5hcm0uY2RwCisgICAgMywgLy8gbGx2bS5hcm0uY2RwMgorICAgIDMsIC8vIGxsdm0uYXJtLmNscmV4CisgICAgMSwgLy8gbGx2bS5hcm0uY3JjMzJiCisgICAgMSwgLy8gbGx2bS5hcm0uY3JjMzJjYgorICAgIDEsIC8vIGxsdm0uYXJtLmNyYzMyY2gKKyAgICAxLCAvLyBsbHZtLmFybS5jcmMzMmN3CisgICAgMSwgLy8gbGx2bS5hcm0uY3JjMzJoCisgICAgMSwgLy8gbGx2bS5hcm0uY3JjMzJ3CisgICAgMywgLy8gbGx2bS5hcm0uZGJnCisgICAgMywgLy8gbGx2bS5hcm0uZG1iCisgICAgMywgLy8gbGx2bS5hcm0uZHNiCisgICAgMywgLy8gbGx2bS5hcm0uZ2V0LmZwc2NyCisgICAgMywgLy8gbGx2bS5hcm0uaGludAorICAgIDMsIC8vIGxsdm0uYXJtLmlzYgorICAgIDMsIC8vIGxsdm0uYXJtLmxkYWV4CisgICAgMywgLy8gbGx2bS5hcm0ubGRhZXhkCisgICAgMywgLy8gbGx2bS5hcm0ubGRjCisgICAgMywgLy8gbGx2bS5hcm0ubGRjMgorICAgIDMsIC8vIGxsdm0uYXJtLmxkYzJsCisgICAgMywgLy8gbGx2bS5hcm0ubGRjbAorICAgIDMsIC8vIGxsdm0uYXJtLmxkcmV4CisgICAgMywgLy8gbGx2bS5hcm0ubGRyZXhkCisgICAgMywgLy8gbGx2bS5hcm0ubWNyCisgICAgMywgLy8gbGx2bS5hcm0ubWNyMgorICAgIDMsIC8vIGxsdm0uYXJtLm1jcnIKKyAgICAzLCAvLyBsbHZtLmFybS5tY3JyMgorICAgIDMsIC8vIGxsdm0uYXJtLm1yYworICAgIDMsIC8vIGxsdm0uYXJtLm1yYzIKKyAgICAzLCAvLyBsbHZtLmFybS5tcnJjCisgICAgMywgLy8gbGx2bS5hcm0ubXJyYzIKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLmFlc2QKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLmFlc2UKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLmFlc2ltYworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24uYWVzbWMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnNoYTFjCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi5zaGExaAorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24uc2hhMW0KKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnNoYTFwCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi5zaGExc3UwCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi5zaGExc3UxCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi5zaGEyNTZoCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi5zaGEyNTZoMgorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24uc2hhMjU2c3UwCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi5zaGEyNTZzdTEKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZhYmRzCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52YWJkdQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udmFicworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udmFjZ2UKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZhY2d0CisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52YnNsCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52Y2xzCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52Y3Z0YXMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZjdnRhdQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udmN2dGZwMmZ4cworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udmN2dGZwMmZ4dQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udmN2dGZwMmhmCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52Y3Z0ZnhzMmZwCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52Y3Z0Znh1MmZwCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52Y3Z0aGYyZnAKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZjdnRtcworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udmN2dG11CisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52Y3Z0bnMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZjdnRudQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udmN2dHBzCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52Y3Z0cHUKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZoYWRkcworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udmhhZGR1CisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52aHN1YnMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZoc3VidQorICAgIDIsIC8vIGxsdm0uYXJtLm5lb24udmxkMQorICAgIDIsIC8vIGxsdm0uYXJtLm5lb24udmxkMgorICAgIDIsIC8vIGxsdm0uYXJtLm5lb24udmxkMmxhbmUKKyAgICAyLCAvLyBsbHZtLmFybS5uZW9uLnZsZDMKKyAgICAyLCAvLyBsbHZtLmFybS5uZW9uLnZsZDNsYW5lCisgICAgMiwgLy8gbGx2bS5hcm0ubmVvbi52bGQ0CisgICAgMiwgLy8gbGx2bS5hcm0ubmVvbi52bGQ0bGFuZQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udm1heG5tCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52bWF4cworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udm1heHUKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZtaW5ubQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udm1pbnMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZtaW51CisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52bXVsbHAKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZtdWxscworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udm11bGx1CisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52bXVscAorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnBhZGFscworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnBhZGFsdQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnBhZGQKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZwYWRkbHMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZwYWRkbHUKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZwbWF4cworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnBtYXh1CisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cG1pbnMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZwbWludQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnFhYnMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZxYWRkcworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnFhZGR1CisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cWRtdWxoCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cWRtdWxsCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cW1vdm5zCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cW1vdm5zdQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnFtb3ZudQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnFuZWcKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZxcmRtdWxoCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cXJzaGlmdG5zCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cXJzaGlmdG5zdQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnFyc2hpZnRudQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnFyc2hpZnRzCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cXJzaGlmdHUKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZxc2hpZnRucworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnFzaGlmdG5zdQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnFzaGlmdG51CisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cXNoaWZ0cworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnFzaGlmdHN1CisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cXNoaWZ0dQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnFzdWJzCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cXN1YnUKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZyYWRkaG4KKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZyZWNwZQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnJlY3BzCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cmhhZGRzCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cmhhZGR1CisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cmludGEKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZyaW50bQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnJpbnRuCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cmludHAKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZyaW50eAorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnJpbnR6CisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cnNoaWZ0bgorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnJzaGlmdHMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZyc2hpZnR1CisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cnNxcnRlCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cnNxcnRzCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52cnN1YmhuCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52c2hpZnRpbnMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZzaGlmdHMKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZzaGlmdHUKKyAgICAyMSwgLy8gbGx2bS5hcm0ubmVvbi52c3QxCisgICAgMjEsIC8vIGxsdm0uYXJtLm5lb24udnN0MgorICAgIDIxLCAvLyBsbHZtLmFybS5uZW9uLnZzdDJsYW5lCisgICAgMjEsIC8vIGxsdm0uYXJtLm5lb24udnN0MworICAgIDIxLCAvLyBsbHZtLmFybS5uZW9uLnZzdDNsYW5lCisgICAgMjEsIC8vIGxsdm0uYXJtLm5lb24udnN0NAorICAgIDIxLCAvLyBsbHZtLmFybS5uZW9uLnZzdDRsYW5lCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52dGJsMQorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnRibDIKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZ0YmwzCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52dGJsNAorICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnRieDEKKyAgICAxLCAvLyBsbHZtLmFybS5uZW9uLnZ0YngyCisgICAgMSwgLy8gbGx2bS5hcm0ubmVvbi52dGJ4MworICAgIDEsIC8vIGxsdm0uYXJtLm5lb24udnRieDQKKyAgICAxLCAvLyBsbHZtLmFybS5xYWRkCisgICAgMSwgLy8gbGx2bS5hcm0ucWFkZDE2CisgICAgMSwgLy8gbGx2bS5hcm0ucWFkZDgKKyAgICAxLCAvLyBsbHZtLmFybS5xYXN4CisgICAgMSwgLy8gbGx2bS5hcm0ucXNheAorICAgIDEsIC8vIGxsdm0uYXJtLnFzdWIKKyAgICAxLCAvLyBsbHZtLmFybS5xc3ViMTYKKyAgICAxLCAvLyBsbHZtLmFybS5xc3ViOAorICAgIDMsIC8vIGxsdm0uYXJtLnNhZGQxNgorICAgIDMsIC8vIGxsdm0uYXJtLnNhZGQ4CisgICAgMywgLy8gbGx2bS5hcm0uc2FzeAorICAgIDE2LCAvLyBsbHZtLmFybS5zZWwKKyAgICAzLCAvLyBsbHZtLmFybS5zZXQuZnBzY3IKKyAgICAxLCAvLyBsbHZtLmFybS5zaGFkZDE2CisgICAgMSwgLy8gbGx2bS5hcm0uc2hhZGQ4CisgICAgMSwgLy8gbGx2bS5hcm0uc2hhc3gKKyAgICAxLCAvLyBsbHZtLmFybS5zaHNheAorICAgIDEsIC8vIGxsdm0uYXJtLnNoc3ViMTYKKyAgICAxLCAvLyBsbHZtLmFybS5zaHN1YjgKKyAgICAxLCAvLyBsbHZtLmFybS5zbWxhYmIKKyAgICAxLCAvLyBsbHZtLmFybS5zbWxhYnQKKyAgICAxLCAvLyBsbHZtLmFybS5zbWxhZAorICAgIDEsIC8vIGxsdm0uYXJtLnNtbGFkeAorICAgIDEsIC8vIGxsdm0uYXJtLnNtbGFsZAorICAgIDEsIC8vIGxsdm0uYXJtLnNtbGFsZHgKKyAgICAxLCAvLyBsbHZtLmFybS5zbWxhdGIKKyAgICAxLCAvLyBsbHZtLmFybS5zbWxhdHQKKyAgICAxLCAvLyBsbHZtLmFybS5zbWxhd2IKKyAgICAxLCAvLyBsbHZtLmFybS5zbWxhd3QKKyAgICAxLCAvLyBsbHZtLmFybS5zbWxzZAorICAgIDEsIC8vIGxsdm0uYXJtLnNtbHNkeAorICAgIDEsIC8vIGxsdm0uYXJtLnNtbHNsZAorICAgIDEsIC8vIGxsdm0uYXJtLnNtbHNsZHgKKyAgICAxLCAvLyBsbHZtLmFybS5zbXVhZAorICAgIDEsIC8vIGxsdm0uYXJtLnNtdWFkeAorICAgIDEsIC8vIGxsdm0uYXJtLnNtdWxiYgorICAgIDEsIC8vIGxsdm0uYXJtLnNtdWxidAorICAgIDEsIC8vIGxsdm0uYXJtLnNtdWx0YgorICAgIDEsIC8vIGxsdm0uYXJtLnNtdWx0dAorICAgIDEsIC8vIGxsdm0uYXJtLnNtdWx3YgorICAgIDEsIC8vIGxsdm0uYXJtLnNtdWx3dAorICAgIDEsIC8vIGxsdm0uYXJtLnNtdXNkCisgICAgMSwgLy8gbGx2bS5hcm0uc211c2R4CisgICAgMywgLy8gbGx2bS5hcm0uc3BhY2UKKyAgICAxLCAvLyBsbHZtLmFybS5zc2F0CisgICAgMSwgLy8gbGx2bS5hcm0uc3NhdDE2CisgICAgMywgLy8gbGx2bS5hcm0uc3NheAorICAgIDMsIC8vIGxsdm0uYXJtLnNzdWIxNgorICAgIDMsIC8vIGxsdm0uYXJtLnNzdWI4CisgICAgMywgLy8gbGx2bS5hcm0uc3RjCisgICAgMywgLy8gbGx2bS5hcm0uc3RjMgorICAgIDMsIC8vIGxsdm0uYXJtLnN0YzJsCisgICAgMywgLy8gbGx2bS5hcm0uc3RjbAorICAgIDMsIC8vIGxsdm0uYXJtLnN0bGV4CisgICAgMywgLy8gbGx2bS5hcm0uc3RsZXhkCisgICAgMywgLy8gbGx2bS5hcm0uc3RyZXgKKyAgICAzLCAvLyBsbHZtLmFybS5zdHJleGQKKyAgICAxLCAvLyBsbHZtLmFybS5zeHRhYjE2CisgICAgMSwgLy8gbGx2bS5hcm0uc3h0YjE2CisgICAgMywgLy8gbGx2bS5hcm0udWFkZDE2CisgICAgMywgLy8gbGx2bS5hcm0udWFkZDgKKyAgICAzLCAvLyBsbHZtLmFybS51YXN4CisgICAgMSwgLy8gbGx2bS5hcm0udWhhZGQxNgorICAgIDEsIC8vIGxsdm0uYXJtLnVoYWRkOAorICAgIDEsIC8vIGxsdm0uYXJtLnVoYXN4CisgICAgMSwgLy8gbGx2bS5hcm0udWhzYXgKKyAgICAxLCAvLyBsbHZtLmFybS51aHN1YjE2CisgICAgMSwgLy8gbGx2bS5hcm0udWhzdWI4CisgICAgMywgLy8gbGx2bS5hcm0udW5kZWZpbmVkCisgICAgMSwgLy8gbGx2bS5hcm0udXFhZGQxNgorICAgIDEsIC8vIGxsdm0uYXJtLnVxYWRkOAorICAgIDEsIC8vIGxsdm0uYXJtLnVxYXN4CisgICAgMSwgLy8gbGx2bS5hcm0udXFzYXgKKyAgICAxLCAvLyBsbHZtLmFybS51cXN1YjE2CisgICAgMSwgLy8gbGx2bS5hcm0udXFzdWI4CisgICAgMSwgLy8gbGx2bS5hcm0udXNhZDgKKyAgICAxLCAvLyBsbHZtLmFybS51c2FkYTgKKyAgICAxLCAvLyBsbHZtLmFybS51c2F0CisgICAgMSwgLy8gbGx2bS5hcm0udXNhdDE2CisgICAgMywgLy8gbGx2bS5hcm0udXNheAorICAgIDMsIC8vIGxsdm0uYXJtLnVzdWIxNgorICAgIDMsIC8vIGxsdm0uYXJtLnVzdWI4CisgICAgMSwgLy8gbGx2bS5hcm0udXh0YWIxNgorICAgIDEsIC8vIGxsdm0uYXJtLnV4dGIxNgorICAgIDEsIC8vIGxsdm0uYXJtLnZjdnRyCisgICAgMSwgLy8gbGx2bS5hcm0udmN2dHJ1CisgICAgMTYsIC8vIGxsdm0uYnBmLmxvYWQuYnl0ZQorICAgIDE2LCAvLyBsbHZtLmJwZi5sb2FkLmhhbGYKKyAgICAxNiwgLy8gbGx2bS5icGYubG9hZC53b3JkCisgICAgMywgLy8gbGx2bS5icGYucHNldWRvCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmFicworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5hYnNwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmFic3NhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5hZGQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuYWRkaC5oMTYuaGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuYWRkaC5oMTYuaGwKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuYWRkaC5oMTYubGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuYWRkaC5oMTYubGwKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuYWRkaC5oMTYuc2F0LmhoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGguaDE2LnNhdC5obAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5hZGRoLmgxNi5zYXQubGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuYWRkaC5oMTYuc2F0LmxsCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGgubDE2LmhsCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGgubDE2LmxsCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZGgubDE2LnNhdC5obAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5hZGRoLmwxNi5zYXQubGwKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuYWRkaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5hZGRwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZHBzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuYWRkc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmFkZHNwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5hbmRpcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5hbmRwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmFzbGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuYXNyaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5jb21iaW5lLmhoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmNvbWJpbmUuaGwKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuY29tYmluZS5saAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5jb21iaW5lLmxsCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLmNvbWJpbmVpaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5jb21iaW5ldworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5tYXgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIubWF4cAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5tYXh1CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLm1heHVwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLm1pbgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5taW5wCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLm1pbnUKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIubWludXAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIubmVnCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLm5lZ3AKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIubmVnc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLm5vdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5ub3RwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLm9yaXIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIub3JwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnJvdW5kc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zYXRiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnNhdGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuc2F0dWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuc2F0dWgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuc3ViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YmguaDE2LmhoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YmguaDE2LmhsCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YmguaDE2LmxoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YmguaDE2LmxsCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YmguaDE2LnNhdC5oaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJoLmgxNi5zYXQuaGwKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuc3ViaC5oMTYuc2F0LmxoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YmguaDE2LnNhdC5sbAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJoLmwxNi5obAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJoLmwxNi5sbAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zdWJoLmwxNi5zYXQuaGwKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuc3ViaC5sMTYuc2F0LmxsCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN1YnAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuc3VicmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuc3Vic2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN2YWRkaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zdmFkZGhzCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN2YWRkdWhzCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN2YXZnaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zdmF2Z2hzCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN2bmF2Z2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuc3ZzdWJoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN2c3ViaHMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuc3ZzdWJ1aHMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuc3dpegorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi5zeHRiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnN4dGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIuc3h0dworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi50ZnIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudGZyaWgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudGZyaWwKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudGZycAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi50ZnJwaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi50ZnJzaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52YWJzaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52YWJzaHNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52YWJzdworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52YWJzd3NhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52YWRkYi5tYXAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmFkZGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmFkZGhzCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZhZGR1YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52YWRkdWJzCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZhZGR1aHMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmFkZHcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmFkZHdzCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZhdmdoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZhdmdoY3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmF2Z2hyCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZhdmd1YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52YXZndWJyCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZhdmd1aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52YXZndWhyCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZhdmd1dworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52YXZndXdyCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZhdmd3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZhdmd3Y3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmF2Z3dyCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZjbXBiZXEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmNtcGJndHUKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmNtcGhlcQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52Y21waGd0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZjbXBoZ3R1CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZjbXB3ZXEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudmNtcHdndAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52Y21wd2d0dQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52Y29uagorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52bWF4YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52bWF4aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52bWF4dWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudm1heHVoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZtYXh1dworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52bWF4dworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52bWluYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52bWluaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52bWludWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudm1pbnVoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZtaW51dworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52bWludworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52bmF2Z2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudm5hdmdoY3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudm5hdmdocgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52bmF2Z3cKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudm5hdmd3Y3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudm5hdmd3cgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52cmFkZHViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZyYWRkdWIuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZyc2FkdWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudnJzYWR1Yi5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudnN1YmIubWFwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZzdWJoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZzdWJocworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52c3VidWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIudnN1YnVicworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi52c3VidWhzCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZzdWJ3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnZzdWJ3cworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi54b3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTIueG9ycAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BMi56eHRiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkEyLnp4dGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQuYW5kbgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5hbmRucAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5iaXRzcGxpdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5iaXRzcGxpdGkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQuYm91bmRzY2hlY2sKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQuY21wYmVxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LmNtcGJlcWkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQuY21wYmd0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LmNtcGJndGkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQuY21wYmd0dQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5jbXBiZ3R1aQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5jbXBoZXEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQuY21waGVxaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5jbXBoZ3QKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQuY21waGd0aQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5jbXBoZ3R1CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LmNtcGhndHVpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LmNvbWJpbmVpcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5jb21iaW5lcmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQuY3JvdW5kLnJpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LmNyb3VuZC5ycgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5tb2R3cmFwdQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5vcm4KKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQub3JucAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5yY21wZXEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQucmNtcGVxaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5yY21wbmVxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LnJjbXBuZXFpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LnJvdW5kLnJpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LnJvdW5kLnJpLnNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5yb3VuZC5ycgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC5yb3VuZC5yci5zYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQudGxibWF0Y2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQudmNtcGJlcS5hbnkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQudmNtcGJlcWkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQudmNtcGJndAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC52Y21wYmd0aQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC52Y21wYmd0dWkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQudmNtcGhlcWkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQudmNtcGhndGkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQudmNtcGhndHVpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LnZjbXB3ZXFpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LnZjbXB3Z3RpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LnZjbXB3Z3R1aQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC52cm1heGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQudnJtYXh1aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC52cm1heHV3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LnZybWF4dworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC52cm1pbmgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQTQudnJtaW51aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNC52cm1pbnV3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkE0LnZybWludworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNS52YWRkaHVicworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNi52Y21wYmVxLm5vdGFueQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5BNi52Y21wYmVxLm5vdGFueS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLmFsbDgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzIuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLmFuZG4KKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzIuYW55OAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi5iaXRzY2xyCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLmJpdHNjbHJpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLmJpdHNzZXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzIuY21wZXEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzIuY21wZXFpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLmNtcGVxcAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi5jbXBnZWkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzIuY21wZ2V1aQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi5jbXBndAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi5jbXBndGkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzIuY21wZ3RwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLmNtcGd0dQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi5jbXBndHVpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLmNtcGd0dXAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzIuY21wbHQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzIuY21wbHR1CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLm1hc2sKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzIubXV4CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLm11eGlpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLm11eGlyCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLm11eHJpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLm5vdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi5vcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi5vcm4KKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzIucHhmZXIubWFwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLnRmcnByCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLnRmcnJwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkMyLnZpdHBhY2sKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzIudm11eAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DMi54b3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzQuYW5kLmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DNC5hbmQuYW5kbgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DNC5hbmQub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzQuYW5kLm9ybgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DNC5jbXBsdGUKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzQuY21wbHRlaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DNC5jbXBsdGV1CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkM0LmNtcGx0ZXVpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkM0LmNtcG5lcQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DNC5jbXBuZXFpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkM0LmZhc3Rjb3JuZXI5CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkM0LmZhc3Rjb3JuZXI5Lm5vdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DNC5uYml0c2NscgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5DNC5uYml0c2NscmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzQubmJpdHNzZXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzQub3IuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkM0Lm9yLmFuZG4KKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzQub3Iub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uQzQub3Iub3JuCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuZDJkZgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LmQyc2YKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uRjIuY29udi5kZjJkCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuZGYyZC5jaG9wCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuZGYyc2YKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uRjIuY29udi5kZjJ1ZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LmRmMnVkLmNob3AKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uRjIuY29udi5kZjJ1dworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LmRmMnV3LmNob3AKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uRjIuY29udi5kZjJ3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuZGYydy5jaG9wCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuc2YyZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LnNmMmQuY2hvcAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LnNmMmRmCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuc2YydWQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uRjIuY29udi5zZjJ1ZC5jaG9wCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuc2YydXcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uRjIuY29udi5zZjJ1dy5jaG9wCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYuc2YydworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LnNmMncuY2hvcAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5GMi5jb252LnVkMmRmCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYudWQyc2YKKyAgICAzNSwgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYudXcyZGYKKyAgICAzNSwgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYudXcyc2YKKyAgICAzNSwgLy8gbGx2bS5oZXhhZ29uLkYyLmNvbnYudzJkZgorICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuY29udi53MnNmCisgICAgMzUsIC8vIGxsdm0uaGV4YWdvbi5GMi5kZmNsYXNzCisgICAgMzUsIC8vIGxsdm0uaGV4YWdvbi5GMi5kZmNtcGVxCisgICAgMzUsIC8vIGxsdm0uaGV4YWdvbi5GMi5kZmNtcGdlCisgICAgMzUsIC8vIGxsdm0uaGV4YWdvbi5GMi5kZmNtcGd0CisgICAgMzUsIC8vIGxsdm0uaGV4YWdvbi5GMi5kZmNtcHVvCisgICAgMzUsIC8vIGxsdm0uaGV4YWdvbi5GMi5kZmltbS5uCisgICAgMzUsIC8vIGxsdm0uaGV4YWdvbi5GMi5kZmltbS5wCisgICAgMzUsIC8vIGxsdm0uaGV4YWdvbi5GMi5zZmFkZAorICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuc2ZjbGFzcworICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuc2ZjbXBlcQorICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuc2ZjbXBnZQorICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuc2ZjbXBndAorICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuc2ZjbXB1bworICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuc2ZmaXh1cGQKKyAgICAzNSwgLy8gbGx2bS5oZXhhZ29uLkYyLnNmZml4dXBuCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLkYyLnNmZml4dXByCisgICAgMzUsIC8vIGxsdm0uaGV4YWdvbi5GMi5zZmZtYQorICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuc2ZmbWEubGliCisgICAgMzUsIC8vIGxsdm0uaGV4YWdvbi5GMi5zZmZtYS5zYworICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuc2ZmbXMKKyAgICAzNSwgLy8gbGx2bS5oZXhhZ29uLkYyLnNmZm1zLmxpYgorICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuc2ZpbW0ubgorICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuc2ZpbW0ucAorICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuc2ZtYXgKKyAgICAzNSwgLy8gbGx2bS5oZXhhZ29uLkYyLnNmbWluCisgICAgMzUsIC8vIGxsdm0uaGV4YWdvbi5GMi5zZm1weQorICAgIDM1LCAvLyBsbHZtLmhleGFnb24uRjIuc2ZzdWIKKyAgICAxNiwgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyYi5wYnIKKyAgICAyOCwgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyYi5wY2kKKyAgICAxOSwgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyYi5wY3IKKyAgICAxNiwgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyZC5wYnIKKyAgICAyOCwgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyZC5wY2kKKyAgICAxOSwgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyZC5wY3IKKyAgICAxNiwgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyaC5wYnIKKyAgICAyOCwgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyaC5wY2kKKyAgICAxOSwgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyaC5wY3IKKyAgICAxNiwgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyaS5wYnIKKyAgICAyOCwgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyaS5wY2kKKyAgICAxOSwgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRyaS5wY3IKKyAgICAxNiwgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRydWIucGJyCisgICAgMjgsIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcnViLnBjaQorICAgIDE5LCAvLyBsbHZtLmhleGFnb24uTDIubG9hZHJ1Yi5wY3IKKyAgICAxNiwgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWRydWgucGJyCisgICAgMjgsIC8vIGxsdm0uaGV4YWdvbi5MMi5sb2FkcnVoLnBjaQorICAgIDE5LCAvLyBsbHZtLmhleGFnb24uTDIubG9hZHJ1aC5wY3IKKyAgICAxOCwgLy8gbGx2bS5oZXhhZ29uLkwyLmxvYWR3LmxvY2tlZAorICAgIDE4LCAvLyBsbHZtLmhleGFnb24uTDQubG9hZGQubG9ja2VkCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmFjY2kKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuYWNjaWkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuY21hY2kuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuY21hY3IuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuY21hY3MuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuY21hY3MuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuY21hY3NjLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmNtYWNzYy5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5jbXB5aS5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5jbXB5ci5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5jbXB5cnMuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuY21weXJzLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmNtcHlyc2MuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuY21weXJzYy5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5jbXB5cy5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5jbXB5cy5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5jbXB5c2MuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuY21weXNjLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmNuYWNzLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmNuYWNzLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmNuYWNzYy5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5jbmFjc2MuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuZHBtcHlzcy5hY2MuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuZHBtcHlzcy5uYWMuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuZHBtcHlzcy5ybmQuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuZHBtcHlzcy5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5kcG1weXV1LmFjYy5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5kcG1weXV1Lm5hYy5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5kcG1weXV1LnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmhtbXB5aC5yczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuaG1tcHloLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLmhtbXB5bC5yczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuaG1tcHlsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1hY2kKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubWFjc2luCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1hY3NpcAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbWFjaHMucnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWNocy5yczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1hY2hzLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWNocy5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbWFjbHMucnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWNscy5yczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1hY2xzLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWNscy5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbWFjdWhzLnJzMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbWFjdWhzLnJzMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbWFjdWhzLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tYWN1aHMuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1hY3Vscy5yczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1hY3Vscy5yczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1hY3Vscy5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbWFjdWxzLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHloLnJzMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5aC5yczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1weWguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1weWguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1weWwucnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHlsLnJzMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5bC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5bC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5dWgucnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHl1aC5yczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1weXVoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHl1aC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tbXB5dWwucnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHl1bC5yczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubW1weXVsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1tcHl1bC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLmhoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5hY2MuaGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5obC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLmhsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5hY2MubGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5saC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuYWNjLmxsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5hY2MubGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5zYXQuaGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5zYXQuaGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5zYXQuaGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5zYXQuaGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5zYXQubGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5zYXQubGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5zYXQubGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LmFjYy5zYXQubGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LmhoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5oaC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuaGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LmhsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5saC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LmxsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5sbC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLmhoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5uYWMuaGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5obC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLmhsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5uYWMubGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5saC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkubmFjLmxsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5uYWMubGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5zYXQuaGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5zYXQuaGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5zYXQuaGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5zYXQuaGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5zYXQubGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5zYXQubGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5zYXQubGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5Lm5hYy5zYXQubGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnJuZC5oaC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmhoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5ybmQuaGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnJuZC5obC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmxoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5ybmQubGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnJuZC5sbC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkucm5kLmxsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5zYXQuaGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnNhdC5oaC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmhsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5zYXQuaGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnNhdC5saC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LmxoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS5zYXQubGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnNhdC5sbC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LnJuZC5oaC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LnJuZC5oaC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LnJuZC5obC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LnJuZC5obC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LnJuZC5saC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LnJuZC5saC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LnJuZC5sbC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkuc2F0LnJuZC5sbC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHkudXAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5LnVwLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weS51cC5zMS5zYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5hY2MuaGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5hY2MuaGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5hY2MuaGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5hY2MuaGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5hY2MubGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5hY2MubGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5hY2MubGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5hY2MubGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5oaC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLmhoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQuaGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5obC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLmxoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQubGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5ZC5sbC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHlkLmxsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQubmFjLmhoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQubmFjLmhoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQubmFjLmhsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQubmFjLmhsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQubmFjLmxoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQubmFjLmxoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQubmFjLmxsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQubmFjLmxsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQucm5kLmhoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQucm5kLmhoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQucm5kLmhsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQucm5kLmhsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQucm5kLmxoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQucm5kLmxoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQucm5kLmxsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWQucm5kLmxsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weWkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5c21pCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXN1LnVwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUuYWNjLmhoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUuYWNjLmhoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUuYWNjLmhsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUuYWNjLmhsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUuYWNjLmxoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUuYWNjLmxoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUuYWNjLmxsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUuYWNjLmxsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUuaGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5oaC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LmhsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUuaGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5saC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LmxoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXUubGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dS5sbC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1Lm5hYy5oaC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1Lm5hYy5oaC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1Lm5hYy5obC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1Lm5hYy5obC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1Lm5hYy5saC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1Lm5hYy5saC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1Lm5hYy5sbC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1Lm5hYy5sbC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1LnVwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmFjYy5oaC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5hY2MuaGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQuYWNjLmhsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmFjYy5obC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5hY2MubGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQuYWNjLmxoLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLmFjYy5sbC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5hY2MubGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQuaGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQuaGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQuaGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQuaGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQubGguczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQubGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQubGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQubGwuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQubmFjLmhoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLm5hYy5oaC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5uYWMuaGwuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQubmFjLmhsLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLm5hYy5saC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1ZC5uYWMubGguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIubXB5dWQubmFjLmxsLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLm1weXVkLm5hYy5sbC5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5tcHl1aQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5uYWNjaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi5uYWNjaWkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIuc3ViYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZhYnNkaWZmaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52YWJzZGlmZncKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudmNtYWMuczAuc2F0LmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudmNtYWMuczAuc2F0LnIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudmNtcHkuczAuc2F0LmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudmNtcHkuczAuc2F0LnIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudmNtcHkuczEuc2F0LmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudmNtcHkuczEuc2F0LnIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudmRtYWNzLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZkbWFjcy5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52ZG1weXJzLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZkbXB5cnMuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudmRtcHlzLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZkbXB5cy5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52bWFjMgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52bWFjMmVzCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZtYWMyZXMuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudm1hYzJlcy5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52bWFjMnMuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudm1hYzJzLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZtYWMyc3UuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudm1hYzJzdS5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52bXB5MmVzLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZtcHkyZXMuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudm1weTJzLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZtcHkycy5zMHBhY2sKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudm1weTJzLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZtcHkycy5zMXBhY2sKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudm1weTJzdS5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52bXB5MnN1LnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZyYWRkaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52cmFkZHVoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZyY21hY2kuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudnJjbWFjaS5zMGMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudnJjbWFjci5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52cmNtYWNyLnMwYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52cmNtcHlpLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZyY21weWkuczBjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk0yLnZyY21weXIuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudnJjbXB5ci5zMGMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudnJjbXB5cy5hY2MuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudnJjbXB5cy5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NMi52cmNtcHlzLnMxcnAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudnJtYWMuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIudnJtcHkuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTIueG9yLnhhY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQuYW5kLmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNC5hbmQuYW5kbgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNC5hbmQub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQuYW5kLnhvcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNC5jbXB5aS53aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNC5jbXB5aS53aGMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQuY21weXIud2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQuY21weXIud2hjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00Lm1hYy51cC5zMS5zYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQubXB5cmkuYWRkaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNC5tcHlyaS5hZGRyCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00Lm1weXJpLmFkZHIudTIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQubXB5cnIuYWRkaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNC5tcHlyci5hZGRyCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00Lm5hYy51cC5zMS5zYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQub3IuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00Lm9yLmFuZG4KKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQub3Iub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQub3IueG9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00LnBtcHl3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00LnBtcHl3LmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNC52cG1weWgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQudnBtcHloLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNC52cm1weWVoLmFjYy5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNC52cm1weWVoLmFjYy5zMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNC52cm1weWVoLnMwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00LnZybXB5ZWguczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQudnJtcHlvaC5hY2MuczAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQudnJtcHlvaC5hY2MuczEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQudnJtcHlvaC5zMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNC52cm1weW9oLnMxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00Lnhvci5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQueG9yLmFuZG4KKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTQueG9yLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk00Lnhvci54YWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk01LnZkbWFjYnN1CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk01LnZkbXB5YnN1CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk01LnZtYWNic3UKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTUudm1hY2J1dQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5NNS52bXB5YnN1CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk01LnZtcHlidXUKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTUudnJtYWNic3UKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTUudnJtYWNidXUKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTUudnJtcHlic3UKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTUudnJtcHlidXUKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uTTYudmFic2RpZmZiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLk02LnZhYnNkaWZmdWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYWRkYXNsLnJycmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkucAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuaS5wLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuaS5wLmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuaS5wLm5hYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuaS5wLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5pLnAueGFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuaS5yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5pLnIuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5pLnIuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5pLnIubmFjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5pLnIub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkuci5zYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNsLmkuci54YWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5pLnZoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5pLnZ3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNsLnIucC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNsLnIucC5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNsLnIucC5uYWMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNsLnIucC5vcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuci5wLnhvcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc2wuci5yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnIuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnIuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnIubmFjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzbC5yLnIub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNsLnIuci5zYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNsLnIudmgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNsLnIudncKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkucAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5wLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5wLmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5wLm5hYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5wLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5pLnAucm5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5pLnAucm5kLmdvb2RzeW50YXgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkucgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5yLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5yLmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5yLm5hYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3IuaS5yLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5pLnIucm5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5pLnIucm5kLmdvb2RzeW50YXgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkuc3Z3LnRydW4KKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkudmgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLmkudncKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIucAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci5wLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci5wLmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci5wLm5hYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci5wLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5yLnAueG9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmFzci5yLnIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIuci5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIuci5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIuci5uYWMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuYXNyLnIuci5vcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci5yLnNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci5zdncudHJ1bgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci52aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5hc3Iuci52dworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5icmV2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmJyZXZwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmNhYmFjZW5jYmluCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmNsMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5jbDBwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmNsMQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5jbDFwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmNsYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5jbGJub3JtCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmNsYnAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuY2xyYml0LmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuY2xyYml0LnIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuY3QwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmN0MHAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuY3QxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmN0MXAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuZGVpbnRlcmxlYXZlCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmV4dHJhY3R1CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmV4dHJhY3R1LnJwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmV4dHJhY3R1cAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5leHRyYWN0dXAucnAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuaW5zZXJ0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmluc2VydC5ycAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5pbnNlcnRwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmluc2VydHAucnAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuaW50ZXJsZWF2ZQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sZnNwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzbC5yLnAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNsLnIucC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNsLnIucC5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNsLnIucC5uYWMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNsLnIucC5vcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc2wuci5wLnhvcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc2wuci5yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzbC5yLnIuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzbC5yLnIuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzbC5yLnIubmFjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzbC5yLnIub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNsLnIudmgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNsLnIudncKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNyLmkucAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS5wLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS5wLmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS5wLm5hYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS5wLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5pLnAueGFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3IuaS5yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5pLnIuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5pLnIuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5pLnIubmFjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5pLnIub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNyLmkuci54YWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5pLnZoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5pLnZ3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5yLnAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNyLnIucC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNyLnIucC5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNyLnIucC5uYWMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNyLnIucC5vcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3Iuci5wLnhvcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5sc3Iuci5yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5yLnIuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5yLnIuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5yLnIubmFjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLmxzci5yLnIub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNyLnIudmgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIubHNyLnIudncKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIucGFja2hsCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnBhcml0eXAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuc2V0Yml0LmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuc2V0Yml0LnIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuc2h1ZmZlYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5zaHVmZmVoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnNodWZmb2IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIuc2h1ZmZvaAorICAgIDMyLCAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmVyYi5wYnIKKyAgICAyOSwgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3JlcmIucGNpCisgICAgMjgsIC8vIGxsdm0uaGV4YWdvbi5TMi5zdG9yZXJiLnBjcgorICAgIDMyLCAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmVyZC5wYnIKKyAgICAyOSwgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3JlcmQucGNpCisgICAgMjgsIC8vIGxsdm0uaGV4YWdvbi5TMi5zdG9yZXJkLnBjcgorICAgIDMyLCAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmVyZi5wYnIKKyAgICAyOSwgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3JlcmYucGNpCisgICAgMjgsIC8vIGxsdm0uaGV4YWdvbi5TMi5zdG9yZXJmLnBjcgorICAgIDMyLCAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmVyaC5wYnIKKyAgICAyOSwgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3JlcmgucGNpCisgICAgMjgsIC8vIGxsdm0uaGV4YWdvbi5TMi5zdG9yZXJoLnBjcgorICAgIDMyLCAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmVyaS5wYnIKKyAgICAyOSwgLy8gbGx2bS5oZXhhZ29uLlMyLnN0b3JlcmkucGNpCisgICAgMjgsIC8vIGxsdm0uaGV4YWdvbi5TMi5zdG9yZXJpLnBjcgorICAgIDE4LCAvLyBsbHZtLmhleGFnb24uUzIuc3RvcmV3LmxvY2tlZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi5zdnNhdGhiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnN2c2F0aHViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnRhYmxlaWR4Yi5nb29kc3ludGF4CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnRhYmxlaWR4ZC5nb29kc3ludGF4CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnRhYmxlaWR4aC5nb29kc3ludGF4CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnRhYmxlaWR4dy5nb29kc3ludGF4CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnRvZ2dsZWJpdC5pCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnRvZ2dsZWJpdC5yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnRzdGJpdC5pCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnRzdGJpdC5yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnZhbGlnbmliCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnZhbGlnbnJiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnZjbmVnaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52Y3JvdGF0ZQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52cmNuZWdoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnZybmRwYWNrd2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIudnJuZHBhY2t3aHMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIudnNhdGhiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnZzYXRoYi5ub3BhY2sKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIudnNhdGh1YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52c2F0aHViLm5vcGFjaworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52c2F0d2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIudnNhdHdoLm5vcGFjaworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52c2F0d3VoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnZzYXR3dWgubm9wYWNrCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnZzcGxhdHJiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnZzcGxhdHJoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnZzcGxpY2VpYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52c3BsaWNlcmIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIudnN4dGJoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlMyLnZzeHRodworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52dHJ1bmVoYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52dHJ1bmV3aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52dHJ1bm9oYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52dHJ1bm93aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TMi52enh0YmgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzIudnp4dGh3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0LmFkZGFkZGkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQuYWRkaS5hc2wucmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQuYWRkaS5sc3IucmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQuYW5kaS5hc2wucmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQuYW5kaS5sc3IucmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQuY2xiYWRkaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNC5jbGJwYWRkaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNC5jbGJwbm9ybQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNC5leHRyYWN0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0LmV4dHJhY3QucnAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQuZXh0cmFjdHAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQuZXh0cmFjdHAucnAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQubHNsaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNC5udHN0Yml0LmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQubnRzdGJpdC5yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0Lm9yLmFuZGkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQub3IuYW5kaXgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQub3Iub3JpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0Lm9yaS5hc2wucmkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQub3JpLmxzci5yaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNC5wYXJpdHkKKyAgICAxOCwgLy8gbGx2bS5oZXhhZ29uLlM0LnN0b3JlZC5sb2NrZWQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQuc3ViYWRkaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNC5zdWJpLmFzbC5yaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNC5zdWJpLmxzci5yaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNC52cmNyb3RhdGUKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQudnJjcm90YXRlLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNC52eGFkZHN1YmgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQudnhhZGRzdWJocgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNC52eGFkZHN1YncKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQudnhzdWJhZGRoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM0LnZ4c3ViYWRkaHIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzQudnhzdWJhZGR3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM1LmFzcmh1Yi5ybmQuc2F0Lmdvb2RzeW50YXgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzUuYXNyaHViLnNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNS5wb3Bjb3VudHAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzUudmFzcmhybmQuZ29vZHN5bnRheAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNi5yb2wuaS5wCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM2LnJvbC5pLnAuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM2LnJvbC5pLnAuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM2LnJvbC5pLnAubmFjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM2LnJvbC5pLnAub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzYucm9sLmkucC54YWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM2LnJvbC5pLnIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzYucm9sLmkuci5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzYucm9sLmkuci5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzYucm9sLmkuci5uYWMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzYucm9sLmkuci5vcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNi5yb2wuaS5yLnhhY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uUzYudnNwbGF0cmJwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlM2LnZ0cnVuZWhiLnBwcAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5TNi52dHJ1bm9oYi5wcHAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYuZXh0cmFjdHcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYuZXh0cmFjdHcuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi5oaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi5oaS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LmxvCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LmxvLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYubHZzcGxhdGIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYubHZzcGxhdGIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi5sdnNwbGF0aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi5sdnNwbGF0aC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2Lmx2c3BsYXR3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2Lmx2c3BsYXR3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5hbmQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi5wcmVkLmFuZC5uCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnByZWQuYW5kLm4uMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi5wcmVkLm5vdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi5wcmVkLm5vdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnByZWQub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5vci4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnByZWQub3IubgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi5wcmVkLm9yLm4uMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi5wcmVkLnNjYWxhcjIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5zY2FsYXIyLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5zY2FsYXIydjIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYucHJlZC5zY2FsYXIydjIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi5wcmVkLnhvcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi5wcmVkLnhvci4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnNodWZmZXFoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnNodWZmZXFoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYuc2h1ZmZlcXcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYuc2h1ZmZlcXcuMTI4QgorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uVjYudlMzMmIubnFwcmVkLmFpCisgICAgMjEsIC8vIGxsdm0uaGV4YWdvbi5WNi52UzMyYi5ucXByZWQuYWkuMTI4QgorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uVjYudlMzMmIubnQubnFwcmVkLmFpCisgICAgMjEsIC8vIGxsdm0uaGV4YWdvbi5WNi52UzMyYi5udC5ucXByZWQuYWkuMTI4QgorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uVjYudlMzMmIubnQucXByZWQuYWkKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZTMzJiLm50LnFwcmVkLmFpLjEyOEIKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZTMzJiLnFwcmVkLmFpCisgICAgMjEsIC8vIGxsdm0uaGV4YWdvbi5WNi52UzMyYi5xcHJlZC5haS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnNiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnNiLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFic2Iuc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnNiLnNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnNkaWZmaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzZGlmZmguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzZGlmZnViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnNkaWZmdWIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzZGlmZnVoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhYnNkaWZmdWguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzZGlmZncKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFic2RpZmZ3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFic2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFic2guMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzaC5zYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFic2guc2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFic3cKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFic3cuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWJzdy5zYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFic3cuc2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkYi5kdgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkYi5kdi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRibnEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGJucS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRicQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkYnEuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkYnNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkYnNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRic2F0LmR2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRic2F0LmR2LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGNhcnJ5CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRjYXJyeS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRjbGJoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRjbGJoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGNsYncKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGNsYncuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRoLmR2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRoLmR2LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGhucQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaG5xLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGhxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRocS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRoc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGRoc2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGhzYXQuZHYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGhzYXQuZHYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaHcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGh3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZGh3LmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkaHcuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHViaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdWJoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHViaC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHViaC5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdWJzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVic2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVic2F0LmR2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1YnNhdC5kdi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1YnViYi5zYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVidWJiLnNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1aHNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdWhzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdWhzYXQuZHYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVoc2F0LmR2LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVodworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdWh3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVody5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHVody5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkdXdzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHV3c2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHV3c2F0LmR2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR1d3NhdC5kdi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHcuZHYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHcuZHYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkd25xCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhZGR3bnEuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkd3EKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHdxLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHdzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFkZHdzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkd3NhdC5kdgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YWRkd3NhdC5kdi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbGlnbmIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFsaWduYi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbGlnbmJpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbGlnbmJpLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YW5kLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFuZG5xcnQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFuZG5xcnQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YW5kbnFydC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFuZG5xcnQuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFuZHFydAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YW5kcXJ0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFuZHFydC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFuZHFydC5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YW5kdm5xdgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YW5kdm5xdi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmR2cXYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFuZHZxdi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmR2cnQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFuZHZydC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmR2cnQuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhbmR2cnQuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzbGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzbGguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNsaC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzbGguYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzbGh2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc2xodi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc2x3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc2x3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzbHcuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc2x3LmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc2x3dgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNsd3YuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3JoLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyaC5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyaGJybmRzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcmhicm5kc2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcmhic2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3JoYnNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3JodWJybmRzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcmh1YnJuZHNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3JodWJzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcmh1YnNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3JodgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyaHYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNydWh1YnJuZHNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNydWh1YnJuZHNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J1aHVic2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J1aHVic2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcnV3dWhybmRzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcnV3dWhybmRzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNydXd1aHNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNydXd1aHNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcncuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3LmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyd2guMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyd2hybmRzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcndocm5kc2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcndoc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3aHNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3dWhybmRzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcnd1aHJuZHNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3dWhzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmFzcnd1aHNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3J3dgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNyd3YuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNzaWduCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhc3NpZ24uMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNzaWducAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXNzaWducC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmdiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmdiLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmF2Z2JybmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmF2Z2JybmQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZnaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZnaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmdocm5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmdocm5kLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3ViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmd1Yi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmd1YnJuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndWJybmQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndWgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3VoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3Vocm5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmd1aHJuZC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZhdmd1dworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndXcuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZndXdybmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3V3cm5kLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3cKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmF2Z3cuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZnd3JuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52YXZnd3JuZC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZjbDBoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZjbDBoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmNsMHcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmNsMHcuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Y29tYmluZQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Y29tYmluZS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkMAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZDAuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZGQwCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkZDAuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZGVhbGIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRlYWxiLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRlYWxiNHcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRlYWxiNHcuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZGVhbGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRlYWxoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRlYWx2ZGQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRlYWx2ZGQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZGVsdGEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRlbHRhLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlidXMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlidXMuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWJ1cy5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlidXMuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlidXMuZHYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlidXMuZHYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWJ1cy5kdi5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHlidXMuZHYuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhiLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloYi5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloYi5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhiLmR2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aGIuZHYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhiLmR2LmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhiLmR2LmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aGlzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloaXNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aGlzYXQuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aGlzYXQuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aHNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aHNhdC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRtcHloc2F0LmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aHN1aXNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhzdWlzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhzdWlzYXQuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aHN1aXNhdC5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhzdXNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhzdXNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aHN1c2F0LmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWhzdXNhdC5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWh2c2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkbXB5aHZzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWh2c2F0LmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZG1weWh2c2F0LmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkc2FkdWgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmRzYWR1aC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkc2FkdWguYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZkc2FkdWguYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmVxYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXFiLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmVxYi5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmVxYi5hbmQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXFiLm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWIub3IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXFiLnhvcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXFiLnhvci4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmVxaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWguYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcWguYW5kLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmVxaC5vcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXFoLm9yLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmVxaC54b3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmVxaC54b3IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXF3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcXcuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXF3LmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52ZXF3LmFuZC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcXcub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmVxdy5vci4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcXcueG9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZlcXcueG9yLjEyOEIKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtaAorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uVjYudmdhdGhlcm1oLjEyOEIKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtaHEKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZnYXRoZXJtaHEuMTI4QgorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uVjYudmdhdGhlcm1odworICAgIDIxLCAvLyBsbHZtLmhleGFnb24uVjYudmdhdGhlcm1ody4xMjhCCisgICAgMjEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z2F0aGVybWh3cQorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uVjYudmdhdGhlcm1od3EuMTI4QgorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uVjYudmdhdGhlcm13CisgICAgMjEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z2F0aGVybXcuMTI4QgorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uVjYudmdhdGhlcm13cQorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uVjYudmdhdGhlcm13cS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0Yi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGIuYW5kCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGIuYW5kLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0Yi5vcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RiLm9yLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0Yi54b3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0Yi54b3IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RoLmFuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3RoLmFuZC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGgub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0aC5vci4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGgueG9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndGgueG9yLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dWIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1Yi5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dWIuYW5kLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dWIub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dWIub3IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1Yi54b3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dWIueG9yLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dWgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dWguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1aC5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dWguYW5kLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dWgub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dWgub3IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1aC54b3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dWgueG9yLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dXcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dXcuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1dy5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dXcuYW5kLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dXcub3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dXcub3IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R1dy54b3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dXcueG9yLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dy5hbmQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmd0dy5hbmQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R3Lm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZndHcub3IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R3LnhvcgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52Z3R3Lnhvci4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZpbnNlcnR3cgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52aW5zZXJ0d3IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bGFsaWduYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bGFsaWduYi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsYWxpZ25iaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bGFsaWduYmkuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bHNyYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bHNyYi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsc3JoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsc3JoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmxzcmh2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsc3Jodi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsc3J3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsc3J3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmxzcnd2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsc3J3di4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXQ0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXQ0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ2YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dnZiLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ2Yi5ubQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dnZiLm5tLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ2Yi5vcmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dnZiLm9yYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ2Yi5vcmFjY2kKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ2Yi5vcmFjY2kuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dnZiaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bHV0dnZiaS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2d2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ3aC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2d2gubm0KKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ3aC5ubS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2d2gub3JhY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ3aC5vcmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2d2gub3JhY2NpCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZsdXR2d2gub3JhY2NpLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ3aGkKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudmx1dHZ3aGkuMTI4QgorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uVjYudm1hc2tlZHN0b3JlbnEKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXNrZWRzdG9yZW5xLjEyOEIKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXNrZWRzdG9yZW50bnEKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXNrZWRzdG9yZW50bnEuMTI4QgorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uVjYudm1hc2tlZHN0b3JlbnRxCisgICAgMjEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bWFza2Vkc3RvcmVudHEuMTI4QgorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uVjYudm1hc2tlZHN0b3JlcQorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uVjYudm1hc2tlZHN0b3JlcS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXhiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXhiLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1heGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1heGguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bWF4dWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1heHViLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1heHVoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXh1aC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXh3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtYXh3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1pbmIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1pbmIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bWluaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bWluaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtaW51YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bWludWIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bWludWgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1pbnVoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1pbncKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1pbncuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhYnVzCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFidXMuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhYnVzLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhYnVzLmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFidXN2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFidXN2LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1wYWJ1dQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhYnV1LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1wYWJ1dS5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1wYWJ1dS5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhYnV1dgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhYnV1di4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFoYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhaGIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhaGIuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcGFoYi5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhaGhzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1wYWhoc2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1wYXVoYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhdWhiLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1wYXVoYi5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1wYXVoYi5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhdWh1aHNhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXBhdWh1aHNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHN1aHVoc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHN1aHVoc2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWJ1cworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5YnVzLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWJ1cy5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWJ1cy5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5YnVzdgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5YnVzdi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlidXN2LmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5YnVzdi5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5YnYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWJ2LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWJ2LmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5YnYuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWV3dWgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWV3dWguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5ZXd1aC42NAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5ZXd1aC42NC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHloCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHloLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWguYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHloLmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHloc2F0LmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aHNhdC5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aHNycworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aHNycy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHloc3MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWhzcy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlodXMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWh1cy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlodXMuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlodXMuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWh2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlodi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlodi5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWh2LmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlodnNycworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aHZzcnMuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWVvaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWVvaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpZXdoLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWV3aC5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWV3dWgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWlld3VoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWlld3VoLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aWV3dWguYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWloCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpaC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWloLmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpaGIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWloYi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpaGIuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpaGIuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWlvd2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWlvd2guMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aXdiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpd2IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aXdiLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aXdiLmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpd2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWl3aC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpd2guYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlpd2guYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWl3dWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWl3dWIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5aXd1Yi5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weWl3dWIuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weW93aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5b3doLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weW93aC42NC5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weW93aC42NC5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5b3doLnJuZAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5b3doLnJuZC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlvd2gucm5kLnNhY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weW93aC5ybmQuc2FjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHlvd2guc2FjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5b3doLnNhY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weXViLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weXViLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWIuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weXVidgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWJ2LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weXVidi5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weXVidi5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weXVoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weXVoLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWguYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weXVoZQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWhlLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weXVoZS5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm1weXVoZS5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWh2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtcHl1aHYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWh2LmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bXB5dWh2LmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZtdXgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm11eC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZuYXZnYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bmF2Z2IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bmF2Z2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm5hdmdoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm5hdmd1YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bmF2Z3ViLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm5hdmd3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZuYXZndy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZub3JtYW10aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bm9ybWFtdGguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bm9ybWFtdHcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm5vcm1hbXR3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm5vdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52bm90LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZvci4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNrZWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnBhY2tlYi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNrZWgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnBhY2tlaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNraGIuc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNraGIuc2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnBhY2todWIuc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNraHViLnNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNrb2IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnBhY2tvYi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNrb2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnBhY2tvaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNrd2guc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNrd2guc2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnBhY2t3dWguc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwYWNrd3VoLnNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwb3Bjb3VudGgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnBvcGNvdW50aC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwcmVmaXhxYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cHJlZml4cWIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cHJlZml4cWgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnByZWZpeHFoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnByZWZpeHF3CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZwcmVmaXhxdy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZyZGVsdGEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJkZWx0YS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnViLnJ0dAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ1Yi5ydHQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ1Yi5ydHQuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnViLnJ0dC5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ1cworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ1cy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ1cy5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ1c2kKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidXNpLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidXNpLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weWJ1c2kuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidXN2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzdi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnVzdi5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidXN2LmFjYy4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHlidi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnYuYWNjCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5YnYuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXViLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1Yi5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnJtcHl1Yi5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXViLnJ0dAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXViLnJ0dC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5dWIucnR0LmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXViLnJ0dC5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXViaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXViaS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5dWJpLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXViaS5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXVidgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXVidi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZybXB5dWJ2LmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm1weXVidi5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm9yCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZyb3IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm91bmRoYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm91bmRoYi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZyb3VuZGh1YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm91bmRodWIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm91bmR1aHViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZyb3VuZHVodWIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm91bmR1d3VoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZyb3VuZHV3dWguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm91bmR3aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm91bmR3aC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZyb3VuZHd1aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cm91bmR3dWguMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cnNhZHViaQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cnNhZHViaS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZyc2FkdWJpLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52cnNhZHViaS5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2F0aHViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzYXRodWIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2F0dXd1aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2F0dXd1aC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzYXR3aAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2F0d2guMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnNiLjEyOEIKKyAgICAzMiwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWgKKyAgICAzMiwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWguMTI4QgorICAgIDMyLCAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaC5hZGQKKyAgICAzMiwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWguYWRkLjEyOEIKKyAgICAzMiwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybWhxCisgICAgMzIsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1ocS4xMjhCCisgICAgMzIsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1odworICAgIDMyLCAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaHcuMTI4QgorICAgIDMyLCAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaHcuYWRkCisgICAgMzIsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1ody5hZGQuMTI4QgorICAgIDMyLCAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtaHdxCisgICAgMzIsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm1od3EuMTI4QgorICAgIDMyLCAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtdworICAgIDMyLCAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtdy4xMjhCCisgICAgMzIsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2NhdHRlcm13LmFkZAorICAgIDMyLCAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtdy5hZGQuMTI4QgorICAgIDMyLCAvLyBsbHZtLmhleGFnb24uVjYudnNjYXR0ZXJtd3EKKyAgICAzMiwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzY2F0dGVybXdxLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnNoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmZWgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnNodWZlaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmZmIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnNodWZmYi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmZmViCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmZmViLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnNodWZmaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2h1ZmZoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnNodWZmb2IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnNodWZmb2IuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2h1ZmZ2ZGQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnNodWZmdmRkLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnNodWZvZWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnNodWZvZWIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2h1Zm9laAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c2h1Zm9laC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzaHVmb2gKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnNodWZvaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJiCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJiLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YmIuZHYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YmIuZHYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViYm5xCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJibnEuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViYnEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YmJxLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YmJzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YmJzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViYnNhdC5kdgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViYnNhdC5kdi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJjYXJyeQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViY2FycnkuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViaC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJoLmR2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJoLmR2LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YmhucQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViaG5xLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YmhxCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJocS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJoc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJoc2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YmhzYXQuZHYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YmhzYXQuZHYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3ViaHcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1Ymh3LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YnViaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidWJoLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YnVic2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1YnNhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1YnNhdC5kdgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidWJzYXQuZHYuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidWJ1YmIuc2F0CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1YnViYi5zYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidWhzYXQKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YnVoc2F0LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YnVoc2F0LmR2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1aHNhdC5kdi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1aHcKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YnVody4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ1d3NhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidXdzYXQuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3VidXdzYXQuZHYKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YnV3c2F0LmR2LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YncKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YncuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3Vidy5kdgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3Vidy5kdi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ3bnEKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN1YnducS4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ3cQorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3Vid3EuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3Vid3NhdAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52c3Vid3NhdC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ3c2F0LmR2CisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZzdWJ3c2F0LmR2LjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN3YXAKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnN3YXAuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52dG1weWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnRtcHliLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnRtcHliLmFjYworICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52dG1weWIuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnRtcHlidXMKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnRtcHlidXMuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52dG1weWJ1cy5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnRtcHlidXMuYWNjLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnRtcHloYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52dG1weWhiLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnRtcHloYi5hY2MKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnRtcHloYi5hY2MuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52dW5wYWNrYgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52dW5wYWNrYi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2toCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2toLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnVucGFja29iCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2tvYi4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2tvaAorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52dW5wYWNrb2guMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52dW5wYWNrdWIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnVucGFja3ViLjEyOEIKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnVucGFja3VoCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZ1bnBhY2t1aC4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZ4b3IKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnhvci4xMjhCCisgICAgMSwgLy8gbGx2bS5oZXhhZ29uLlY2LnZ6YgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52emIuMTI4QgorICAgIDEsIC8vIGxsdm0uaGV4YWdvbi5WNi52emgKKyAgICAxLCAvLyBsbHZtLmhleGFnb24uVjYudnpoLjEyOEIKKyAgICAzLCAvLyBsbHZtLmhleGFnb24uWTIuZGNjbGVhbmEKKyAgICAzLCAvLyBsbHZtLmhleGFnb24uWTIuZGNjbGVhbmludmEKKyAgICAzLCAvLyBsbHZtLmhleGFnb24uWTIuZGNpbnZhCisgICAgMzYsIC8vIGxsdm0uaGV4YWdvbi5ZMi5kY3plcm9hCisgICAgMywgLy8gbGx2bS5oZXhhZ29uLlk0LmwyZmV0Y2gKKyAgICAzLCAvLyBsbHZtLmhleGFnb24uWTUubDJmZXRjaAorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uY2lyYy5sZGIKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLmNpcmMubGRkCisgICAgMjEsIC8vIGxsdm0uaGV4YWdvbi5jaXJjLmxkaAorICAgIDIxLCAvLyBsbHZtLmhleGFnb24uY2lyYy5sZHViCisgICAgMjEsIC8vIGxsdm0uaGV4YWdvbi5jaXJjLmxkdWgKKyAgICAyMSwgLy8gbGx2bS5oZXhhZ29uLmNpcmMubGR3CisgICAgMzIsIC8vIGxsdm0uaGV4YWdvbi5jaXJjLnN0YgorICAgIDMyLCAvLyBsbHZtLmhleGFnb24uY2lyYy5zdGQKKyAgICAzMiwgLy8gbGx2bS5oZXhhZ29uLmNpcmMuc3RoCisgICAgMzIsIC8vIGxsdm0uaGV4YWdvbi5jaXJjLnN0aGhpCisgICAgMzIsIC8vIGxsdm0uaGV4YWdvbi5jaXJjLnN0dworICAgIDIxLCAvLyBsbHZtLmhleGFnb24ubW0yNTZpLnZhZGR3CisgICAgMywgLy8gbGx2bS5oZXhhZ29uLnByZWZldGNoCisgICAgMywgLy8gbGx2bS5taXBzLmFic3Eucy5waAorICAgIDMsIC8vIGxsdm0ubWlwcy5hYnNxLnMucWIKKyAgICAzLCAvLyBsbHZtLm1pcHMuYWJzcS5zLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuYWRkLmEuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5hZGQuYS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZC5hLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuYWRkLmEudworICAgIDEsIC8vIGxsdm0ubWlwcy5hZGRxLnBoCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHEucy5waAorICAgIDMsIC8vIGxsdm0ubWlwcy5hZGRxLnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5hZGRxaC5waAorICAgIDEsIC8vIGxsdm0ubWlwcy5hZGRxaC5yLnBoCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHFoLnIudworICAgIDEsIC8vIGxsdm0ubWlwcy5hZGRxaC53CisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHMuYS5iCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHMuYS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHMuYS5oCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHMuYS53CisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHMucy5iCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHMucy5kCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHMucy5oCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHMucy53CisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHMudS5iCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHMudS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHMudS5oCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHMudS53CisgICAgMywgLy8gbGx2bS5taXBzLmFkZHNjCisgICAgMywgLy8gbGx2bS5taXBzLmFkZHUucGgKKyAgICAxLCAvLyBsbHZtLm1pcHMuYWRkdS5xYgorICAgIDMsIC8vIGxsdm0ubWlwcy5hZGR1LnMucGgKKyAgICAxLCAvLyBsbHZtLm1pcHMuYWRkdS5zLnFiCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHVoLnFiCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHVoLnIucWIKKyAgICAxLCAvLyBsbHZtLm1pcHMuYWRkdi5iCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHYuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5hZGR2LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuYWRkdi53CisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHZpLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuYWRkdmkuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5hZGR2aS5oCisgICAgMSwgLy8gbGx2bS5taXBzLmFkZHZpLncKKyAgICAzLCAvLyBsbHZtLm1pcHMuYWRkd2MKKyAgICAxLCAvLyBsbHZtLm1pcHMuYW5kLnYKKyAgICAxLCAvLyBsbHZtLm1pcHMuYW5kaS5iCisgICAgMSwgLy8gbGx2bS5taXBzLmFwcGVuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5hc3ViLnMuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5hc3ViLnMuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5hc3ViLnMuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5hc3ViLnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5hc3ViLnUuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5hc3ViLnUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5hc3ViLnUuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5hc3ViLnUudworICAgIDEsIC8vIGxsdm0ubWlwcy5hdmUucy5iCisgICAgMSwgLy8gbGx2bS5taXBzLmF2ZS5zLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXZlLnMuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5hdmUucy53CisgICAgMSwgLy8gbGx2bS5taXBzLmF2ZS51LmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXZlLnUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5hdmUudS5oCisgICAgMSwgLy8gbGx2bS5taXBzLmF2ZS51LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXZlci5zLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXZlci5zLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXZlci5zLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXZlci5zLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXZlci51LmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXZlci51LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXZlci51LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuYXZlci51LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuYmFsaWduCisgICAgMSwgLy8gbGx2bS5taXBzLmJjbHIuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5iY2xyLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuYmNsci5oCisgICAgMSwgLy8gbGx2bS5taXBzLmJjbHIudworICAgIDEsIC8vIGxsdm0ubWlwcy5iY2xyaS5iCisgICAgMSwgLy8gbGx2bS5taXBzLmJjbHJpLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuYmNscmkuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5iY2xyaS53CisgICAgMSwgLy8gbGx2bS5taXBzLmJpbnNsLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuYmluc2wuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5iaW5zbC5oCisgICAgMSwgLy8gbGx2bS5taXBzLmJpbnNsLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuYmluc2xpLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuYmluc2xpLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuYmluc2xpLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuYmluc2xpLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuYmluc3IuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5iaW5zci5kCisgICAgMSwgLy8gbGx2bS5taXBzLmJpbnNyLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuYmluc3IudworICAgIDEsIC8vIGxsdm0ubWlwcy5iaW5zcmkuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5iaW5zcmkuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5iaW5zcmkuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5iaW5zcmkudworICAgIDEsIC8vIGxsdm0ubWlwcy5iaXRyZXYKKyAgICAxLCAvLyBsbHZtLm1pcHMuYm1uei52CisgICAgMSwgLy8gbGx2bS5taXBzLmJtbnppLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuYm16LnYKKyAgICAxLCAvLyBsbHZtLm1pcHMuYm16aS5iCisgICAgMSwgLy8gbGx2bS5taXBzLmJuZWcuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5ibmVnLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuYm5lZy5oCisgICAgMSwgLy8gbGx2bS5taXBzLmJuZWcudworICAgIDEsIC8vIGxsdm0ubWlwcy5ibmVnaS5iCisgICAgMSwgLy8gbGx2bS5taXBzLmJuZWdpLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuYm5lZ2kuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5ibmVnaS53CisgICAgMSwgLy8gbGx2bS5taXBzLmJuei5iCisgICAgMSwgLy8gbGx2bS5taXBzLmJuei5kCisgICAgMSwgLy8gbGx2bS5taXBzLmJuei5oCisgICAgMSwgLy8gbGx2bS5taXBzLmJuei52CisgICAgMSwgLy8gbGx2bS5taXBzLmJuei53CisgICAgMTYsIC8vIGxsdm0ubWlwcy5icG9zZ2UzMgorICAgIDEsIC8vIGxsdm0ubWlwcy5ic2VsLnYKKyAgICAxLCAvLyBsbHZtLm1pcHMuYnNlbGkuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5ic2V0LmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuYnNldC5kCisgICAgMSwgLy8gbGx2bS5taXBzLmJzZXQuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5ic2V0LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuYnNldGkuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5ic2V0aS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmJzZXRpLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuYnNldGkudworICAgIDEsIC8vIGxsdm0ubWlwcy5iei5iCisgICAgMSwgLy8gbGx2bS5taXBzLmJ6LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuYnouaAorICAgIDEsIC8vIGxsdm0ubWlwcy5iei52CisgICAgMSwgLy8gbGx2bS5taXBzLmJ6LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2VxLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2VxLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2VxLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2VxLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2VxaS5iCisgICAgMSwgLy8gbGx2bS5taXBzLmNlcWkuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5jZXFpLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2VxaS53CisgICAgMywgLy8gbGx2bS5taXBzLmNmY21zYQorICAgIDEsIC8vIGxsdm0ubWlwcy5jbGUucy5iCisgICAgMSwgLy8gbGx2bS5taXBzLmNsZS5zLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2xlLnMuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5jbGUucy53CisgICAgMSwgLy8gbGx2bS5taXBzLmNsZS51LmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2xlLnUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5jbGUudS5oCisgICAgMSwgLy8gbGx2bS5taXBzLmNsZS51LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2xlaS5zLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2xlaS5zLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2xlaS5zLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2xlaS5zLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2xlaS51LmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2xlaS51LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2xlaS51LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2xlaS51LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2x0LnMuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5jbHQucy5kCisgICAgMSwgLy8gbGx2bS5taXBzLmNsdC5zLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2x0LnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5jbHQudS5iCisgICAgMSwgLy8gbGx2bS5taXBzLmNsdC51LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuY2x0LnUuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5jbHQudS53CisgICAgMSwgLy8gbGx2bS5taXBzLmNsdGkucy5iCisgICAgMSwgLy8gbGx2bS5taXBzLmNsdGkucy5kCisgICAgMSwgLy8gbGx2bS5taXBzLmNsdGkucy5oCisgICAgMSwgLy8gbGx2bS5taXBzLmNsdGkucy53CisgICAgMSwgLy8gbGx2bS5taXBzLmNsdGkudS5iCisgICAgMSwgLy8gbGx2bS5taXBzLmNsdGkudS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmNsdGkudS5oCisgICAgMSwgLy8gbGx2bS5taXBzLmNsdGkudS53CisgICAgMywgLy8gbGx2bS5taXBzLmNtcC5lcS5waAorICAgIDMsIC8vIGxsdm0ubWlwcy5jbXAubGUucGgKKyAgICAzLCAvLyBsbHZtLm1pcHMuY21wLmx0LnBoCisgICAgMywgLy8gbGx2bS5taXBzLmNtcGdkdS5lcS5xYgorICAgIDMsIC8vIGxsdm0ubWlwcy5jbXBnZHUubGUucWIKKyAgICAzLCAvLyBsbHZtLm1pcHMuY21wZ2R1Lmx0LnFiCisgICAgMywgLy8gbGx2bS5taXBzLmNtcGd1LmVxLnFiCisgICAgMywgLy8gbGx2bS5taXBzLmNtcGd1LmxlLnFiCisgICAgMywgLy8gbGx2bS5taXBzLmNtcGd1Lmx0LnFiCisgICAgMywgLy8gbGx2bS5taXBzLmNtcHUuZXEucWIKKyAgICAzLCAvLyBsbHZtLm1pcHMuY21wdS5sZS5xYgorICAgIDMsIC8vIGxsdm0ubWlwcy5jbXB1Lmx0LnFiCisgICAgMSwgLy8gbGx2bS5taXBzLmNvcHkucy5iCisgICAgMSwgLy8gbGx2bS5taXBzLmNvcHkucy5kCisgICAgMSwgLy8gbGx2bS5taXBzLmNvcHkucy5oCisgICAgMSwgLy8gbGx2bS5taXBzLmNvcHkucy53CisgICAgMSwgLy8gbGx2bS5taXBzLmNvcHkudS5iCisgICAgMSwgLy8gbGx2bS5taXBzLmNvcHkudS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmNvcHkudS5oCisgICAgMSwgLy8gbGx2bS5taXBzLmNvcHkudS53CisgICAgMywgLy8gbGx2bS5taXBzLmN0Y21zYQorICAgIDEsIC8vIGxsdm0ubWlwcy5kaXYucy5iCisgICAgMSwgLy8gbGx2bS5taXBzLmRpdi5zLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZGl2LnMuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5kaXYucy53CisgICAgMSwgLy8gbGx2bS5taXBzLmRpdi51LmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuZGl2LnUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5kaXYudS5oCisgICAgMSwgLy8gbGx2bS5taXBzLmRpdi51LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZGxzYQorICAgIDEsIC8vIGxsdm0ubWlwcy5kb3RwLnMuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5kb3RwLnMuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5kb3RwLnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5kb3RwLnUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5kb3RwLnUuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5kb3RwLnUudworICAgIDEsIC8vIGxsdm0ubWlwcy5kcGEudy5waAorICAgIDEsIC8vIGxsdm0ubWlwcy5kcGFkZC5zLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZHBhZGQucy5oCisgICAgMSwgLy8gbGx2bS5taXBzLmRwYWRkLnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5kcGFkZC51LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZHBhZGQudS5oCisgICAgMSwgLy8gbGx2bS5taXBzLmRwYWRkLnUudworICAgIDMsIC8vIGxsdm0ubWlwcy5kcGFxLnMudy5waAorICAgIDMsIC8vIGxsdm0ubWlwcy5kcGFxLnNhLmwudworICAgIDMsIC8vIGxsdm0ubWlwcy5kcGFxeC5zLncucGgKKyAgICAzLCAvLyBsbHZtLm1pcHMuZHBhcXguc2Eudy5waAorICAgIDEsIC8vIGxsdm0ubWlwcy5kcGF1LmgucWJsCisgICAgMSwgLy8gbGx2bS5taXBzLmRwYXUuaC5xYnIKKyAgICAxLCAvLyBsbHZtLm1pcHMuZHBheC53LnBoCisgICAgMSwgLy8gbGx2bS5taXBzLmRwcy53LnBoCisgICAgMywgLy8gbGx2bS5taXBzLmRwc3Eucy53LnBoCisgICAgMywgLy8gbGx2bS5taXBzLmRwc3Euc2EubC53CisgICAgMywgLy8gbGx2bS5taXBzLmRwc3F4LnMudy5waAorICAgIDMsIC8vIGxsdm0ubWlwcy5kcHNxeC5zYS53LnBoCisgICAgMSwgLy8gbGx2bS5taXBzLmRwc3UuaC5xYmwKKyAgICAxLCAvLyBsbHZtLm1pcHMuZHBzdS5oLnFicgorICAgIDEsIC8vIGxsdm0ubWlwcy5kcHN1Yi5zLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZHBzdWIucy5oCisgICAgMSwgLy8gbGx2bS5taXBzLmRwc3ViLnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5kcHN1Yi51LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZHBzdWIudS5oCisgICAgMSwgLy8gbGx2bS5taXBzLmRwc3ViLnUudworICAgIDEsIC8vIGxsdm0ubWlwcy5kcHN4LncucGgKKyAgICAzLCAvLyBsbHZtLm1pcHMuZXh0cAorICAgIDMsIC8vIGxsdm0ubWlwcy5leHRwZHAKKyAgICAzLCAvLyBsbHZtLm1pcHMuZXh0ci5yLncKKyAgICAzLCAvLyBsbHZtLm1pcHMuZXh0ci5ycy53CisgICAgMywgLy8gbGx2bS5taXBzLmV4dHIucy5oCisgICAgMywgLy8gbGx2bS5taXBzLmV4dHIudworICAgIDEsIC8vIGxsdm0ubWlwcy5mYWRkLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmFkZC53CisgICAgMSwgLy8gbGx2bS5taXBzLmZjYWYuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mY2FmLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmNlcS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZjZXEudworICAgIDEsIC8vIGxsdm0ubWlwcy5mY2xhc3MuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mY2xhc3MudworICAgIDEsIC8vIGxsdm0ubWlwcy5mY2xlLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmNsZS53CisgICAgMSwgLy8gbGx2bS5taXBzLmZjbHQuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mY2x0LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmNuZS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZjbmUudworICAgIDEsIC8vIGxsdm0ubWlwcy5mY29yLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmNvci53CisgICAgMSwgLy8gbGx2bS5taXBzLmZjdWVxLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmN1ZXEudworICAgIDEsIC8vIGxsdm0ubWlwcy5mY3VsZS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZjdWxlLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmN1bHQuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mY3VsdC53CisgICAgMSwgLy8gbGx2bS5taXBzLmZjdW4uZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mY3VuLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmN1bmUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mY3VuZS53CisgICAgMSwgLy8gbGx2bS5taXBzLmZkaXYuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mZGl2LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmV4ZG8uaAorICAgIDEsIC8vIGxsdm0ubWlwcy5mZXhkby53CisgICAgMSwgLy8gbGx2bS5taXBzLmZleHAyLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmV4cDIudworICAgIDEsIC8vIGxsdm0ubWlwcy5mZXh1cGwuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mZXh1cGwudworICAgIDEsIC8vIGxsdm0ubWlwcy5mZXh1cHIuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mZXh1cHIudworICAgIDEsIC8vIGxsdm0ubWlwcy5mZmludC5zLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmZpbnQucy53CisgICAgMSwgLy8gbGx2bS5taXBzLmZmaW50LnUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mZmludC51LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmZxbC5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZmcWwudworICAgIDEsIC8vIGxsdm0ubWlwcy5mZnFyLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmZxci53CisgICAgMSwgLy8gbGx2bS5taXBzLmZpbGwuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5maWxsLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZmlsbC5oCisgICAgMSwgLy8gbGx2bS5taXBzLmZpbGwudworICAgIDEsIC8vIGxsdm0ubWlwcy5mbG9nMi5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZsb2cyLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZm1hZGQuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mbWFkZC53CisgICAgMSwgLy8gbGx2bS5taXBzLmZtYXguYS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZtYXguYS53CisgICAgMSwgLy8gbGx2bS5taXBzLmZtYXguZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mbWF4LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZm1pbi5hLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZm1pbi5hLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZm1pbi5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZtaW4udworICAgIDEsIC8vIGxsdm0ubWlwcy5mbXN1Yi5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZtc3ViLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZm11bC5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZtdWwudworICAgIDEsIC8vIGxsdm0ubWlwcy5mcmNwLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnJjcC53CisgICAgMSwgLy8gbGx2bS5taXBzLmZyaW50LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnJpbnQudworICAgIDEsIC8vIGxsdm0ubWlwcy5mcnNxcnQuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mcnNxcnQudworICAgIDEsIC8vIGxsdm0ubWlwcy5mc2FmLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnNhZi53CisgICAgMSwgLy8gbGx2bS5taXBzLmZzZXEuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mc2VxLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnNsZS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZzbGUudworICAgIDEsIC8vIGxsdm0ubWlwcy5mc2x0LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnNsdC53CisgICAgMSwgLy8gbGx2bS5taXBzLmZzbmUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mc25lLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnNvci5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZzb3IudworICAgIDEsIC8vIGxsdm0ubWlwcy5mc3FydC5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZzcXJ0LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnN1Yi5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZzdWIudworICAgIDEsIC8vIGxsdm0ubWlwcy5mc3VlcS5kCisgICAgMSwgLy8gbGx2bS5taXBzLmZzdWVxLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnN1bGUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mc3VsZS53CisgICAgMSwgLy8gbGx2bS5taXBzLmZzdWx0LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnN1bHQudworICAgIDEsIC8vIGxsdm0ubWlwcy5mc3VuLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnN1bi53CisgICAgMSwgLy8gbGx2bS5taXBzLmZzdW5lLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnN1bmUudworICAgIDEsIC8vIGxsdm0ubWlwcy5mdGludC5zLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnRpbnQucy53CisgICAgMSwgLy8gbGx2bS5taXBzLmZ0aW50LnUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mdGludC51LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnRxLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnRxLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnRydW5jLnMuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5mdHJ1bmMucy53CisgICAgMSwgLy8gbGx2bS5taXBzLmZ0cnVuYy51LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuZnRydW5jLnUudworICAgIDEsIC8vIGxsdm0ubWlwcy5oYWRkLnMuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5oYWRkLnMuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5oYWRkLnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5oYWRkLnUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5oYWRkLnUuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5oYWRkLnUudworICAgIDEsIC8vIGxsdm0ubWlwcy5oc3ViLnMuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5oc3ViLnMuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5oc3ViLnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5oc3ViLnUuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5oc3ViLnUuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5oc3ViLnUudworICAgIDEsIC8vIGxsdm0ubWlwcy5pbHZldi5iCisgICAgMSwgLy8gbGx2bS5taXBzLmlsdmV2LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuaWx2ZXYuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5pbHZldi53CisgICAgMSwgLy8gbGx2bS5taXBzLmlsdmwuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5pbHZsLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuaWx2bC5oCisgICAgMSwgLy8gbGx2bS5taXBzLmlsdmwudworICAgIDEsIC8vIGxsdm0ubWlwcy5pbHZvZC5iCisgICAgMSwgLy8gbGx2bS5taXBzLmlsdm9kLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuaWx2b2QuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5pbHZvZC53CisgICAgMSwgLy8gbGx2bS5taXBzLmlsdnIuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5pbHZyLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuaWx2ci5oCisgICAgMSwgLy8gbGx2bS5taXBzLmlsdnIudworICAgIDEsIC8vIGxsdm0ubWlwcy5pbnNlcnQuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5pbnNlcnQuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5pbnNlcnQuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5pbnNlcnQudworICAgIDE2LCAvLyBsbHZtLm1pcHMuaW5zdgorICAgIDEsIC8vIGxsdm0ubWlwcy5pbnN2ZS5iCisgICAgMSwgLy8gbGx2bS5taXBzLmluc3ZlLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuaW5zdmUuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5pbnN2ZS53CisgICAgMiwgLy8gbGx2bS5taXBzLmxidXgKKyAgICAyLCAvLyBsbHZtLm1pcHMubGQuYgorICAgIDIsIC8vIGxsdm0ubWlwcy5sZC5kCisgICAgMiwgLy8gbGx2bS5taXBzLmxkLmgKKyAgICAyLCAvLyBsbHZtLm1pcHMubGQudworICAgIDEsIC8vIGxsdm0ubWlwcy5sZGkuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5sZGkuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5sZGkuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5sZGkudworICAgIDIsIC8vIGxsdm0ubWlwcy5saHgKKyAgICAxLCAvLyBsbHZtLm1pcHMubHNhCisgICAgMiwgLy8gbGx2bS5taXBzLmx3eAorICAgIDEsIC8vIGxsdm0ubWlwcy5tYWRkCisgICAgMSwgLy8gbGx2bS5taXBzLm1hZGQucS5oCisgICAgMSwgLy8gbGx2bS5taXBzLm1hZGQucS53CisgICAgMSwgLy8gbGx2bS5taXBzLm1hZGRyLnEuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5tYWRkci5xLncKKyAgICAxLCAvLyBsbHZtLm1pcHMubWFkZHUKKyAgICAxLCAvLyBsbHZtLm1pcHMubWFkZHYuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5tYWRkdi5kCisgICAgMSwgLy8gbGx2bS5taXBzLm1hZGR2LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMubWFkZHYudworICAgIDMsIC8vIGxsdm0ubWlwcy5tYXEucy53LnBobAorICAgIDMsIC8vIGxsdm0ubWlwcy5tYXEucy53LnBocgorICAgIDMsIC8vIGxsdm0ubWlwcy5tYXEuc2Eudy5waGwKKyAgICAzLCAvLyBsbHZtLm1pcHMubWFxLnNhLncucGhyCisgICAgMSwgLy8gbGx2bS5taXBzLm1heC5hLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMubWF4LmEuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5tYXguYS5oCisgICAgMSwgLy8gbGx2bS5taXBzLm1heC5hLncKKyAgICAxLCAvLyBsbHZtLm1pcHMubWF4LnMuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5tYXgucy5kCisgICAgMSwgLy8gbGx2bS5taXBzLm1heC5zLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMubWF4LnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5tYXgudS5iCisgICAgMSwgLy8gbGx2bS5taXBzLm1heC51LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMubWF4LnUuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5tYXgudS53CisgICAgMSwgLy8gbGx2bS5taXBzLm1heGkucy5iCisgICAgMSwgLy8gbGx2bS5taXBzLm1heGkucy5kCisgICAgMSwgLy8gbGx2bS5taXBzLm1heGkucy5oCisgICAgMSwgLy8gbGx2bS5taXBzLm1heGkucy53CisgICAgMSwgLy8gbGx2bS5taXBzLm1heGkudS5iCisgICAgMSwgLy8gbGx2bS5taXBzLm1heGkudS5kCisgICAgMSwgLy8gbGx2bS5taXBzLm1heGkudS5oCisgICAgMSwgLy8gbGx2bS5taXBzLm1heGkudS53CisgICAgMSwgLy8gbGx2bS5taXBzLm1pbi5hLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMubWluLmEuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5taW4uYS5oCisgICAgMSwgLy8gbGx2bS5taXBzLm1pbi5hLncKKyAgICAxLCAvLyBsbHZtLm1pcHMubWluLnMuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5taW4ucy5kCisgICAgMSwgLy8gbGx2bS5taXBzLm1pbi5zLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMubWluLnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5taW4udS5iCisgICAgMSwgLy8gbGx2bS5taXBzLm1pbi51LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMubWluLnUuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5taW4udS53CisgICAgMSwgLy8gbGx2bS5taXBzLm1pbmkucy5iCisgICAgMSwgLy8gbGx2bS5taXBzLm1pbmkucy5kCisgICAgMSwgLy8gbGx2bS5taXBzLm1pbmkucy5oCisgICAgMSwgLy8gbGx2bS5taXBzLm1pbmkucy53CisgICAgMSwgLy8gbGx2bS5taXBzLm1pbmkudS5iCisgICAgMSwgLy8gbGx2bS5taXBzLm1pbmkudS5kCisgICAgMSwgLy8gbGx2bS5taXBzLm1pbmkudS5oCisgICAgMSwgLy8gbGx2bS5taXBzLm1pbmkudS53CisgICAgMSwgLy8gbGx2bS5taXBzLm1vZC5zLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMubW9kLnMuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5tb2Qucy5oCisgICAgMSwgLy8gbGx2bS5taXBzLm1vZC5zLncKKyAgICAxLCAvLyBsbHZtLm1pcHMubW9kLnUuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5tb2QudS5kCisgICAgMSwgLy8gbGx2bS5taXBzLm1vZC51LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMubW9kLnUudworICAgIDEsIC8vIGxsdm0ubWlwcy5tb2RzdWIKKyAgICAxLCAvLyBsbHZtLm1pcHMubW92ZS52CisgICAgMSwgLy8gbGx2bS5taXBzLm1zdWIKKyAgICAxLCAvLyBsbHZtLm1pcHMubXN1Yi5xLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMubXN1Yi5xLncKKyAgICAxLCAvLyBsbHZtLm1pcHMubXN1YnIucS5oCisgICAgMSwgLy8gbGx2bS5taXBzLm1zdWJyLnEudworICAgIDEsIC8vIGxsdm0ubWlwcy5tc3VidQorICAgIDEsIC8vIGxsdm0ubWlwcy5tc3Vidi5iCisgICAgMSwgLy8gbGx2bS5taXBzLm1zdWJ2LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMubXN1YnYuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5tc3Vidi53CisgICAgMywgLy8gbGx2bS5taXBzLm10aGxpcAorICAgIDMsIC8vIGxsdm0ubWlwcy5tdWwucGgKKyAgICAxLCAvLyBsbHZtLm1pcHMubXVsLnEuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5tdWwucS53CisgICAgMywgLy8gbGx2bS5taXBzLm11bC5zLnBoCisgICAgMywgLy8gbGx2bS5taXBzLm11bGVxLnMudy5waGwKKyAgICAzLCAvLyBsbHZtLm1pcHMubXVsZXEucy53LnBocgorICAgIDMsIC8vIGxsdm0ubWlwcy5tdWxldS5zLnBoLnFibAorICAgIDMsIC8vIGxsdm0ubWlwcy5tdWxldS5zLnBoLnFicgorICAgIDMsIC8vIGxsdm0ubWlwcy5tdWxxLnJzLnBoCisgICAgMywgLy8gbGx2bS5taXBzLm11bHEucnMudworICAgIDMsIC8vIGxsdm0ubWlwcy5tdWxxLnMucGgKKyAgICAzLCAvLyBsbHZtLm1pcHMubXVscS5zLncKKyAgICAxLCAvLyBsbHZtLm1pcHMubXVsci5xLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMubXVsci5xLncKKyAgICAxLCAvLyBsbHZtLm1pcHMubXVsc2Eudy5waAorICAgIDMsIC8vIGxsdm0ubWlwcy5tdWxzYXEucy53LnBoCisgICAgMSwgLy8gbGx2bS5taXBzLm11bHQKKyAgICAxLCAvLyBsbHZtLm1pcHMubXVsdHUKKyAgICAxLCAvLyBsbHZtLm1pcHMubXVsdi5iCisgICAgMSwgLy8gbGx2bS5taXBzLm11bHYuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5tdWx2LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMubXVsdi53CisgICAgMSwgLy8gbGx2bS5taXBzLm5sb2MuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5ubG9jLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMubmxvYy5oCisgICAgMSwgLy8gbGx2bS5taXBzLm5sb2MudworICAgIDEsIC8vIGxsdm0ubWlwcy5ubHpjLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMubmx6Yy5kCisgICAgMSwgLy8gbGx2bS5taXBzLm5semMuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5ubHpjLncKKyAgICAxLCAvLyBsbHZtLm1pcHMubm9yLnYKKyAgICAxLCAvLyBsbHZtLm1pcHMubm9yaS5iCisgICAgMSwgLy8gbGx2bS5taXBzLm9yLnYKKyAgICAxLCAvLyBsbHZtLm1pcHMub3JpLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMucGFja3JsLnBoCisgICAgMSwgLy8gbGx2bS5taXBzLnBja2V2LmIKKyAgICAxLCAvLyBsbHZtLm1pcHMucGNrZXYuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5wY2tldi5oCisgICAgMSwgLy8gbGx2bS5taXBzLnBja2V2LncKKyAgICAxLCAvLyBsbHZtLm1pcHMucGNrb2QuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5wY2tvZC5kCisgICAgMSwgLy8gbGx2bS5taXBzLnBja29kLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMucGNrb2QudworICAgIDEsIC8vIGxsdm0ubWlwcy5wY250LmIKKyAgICAxLCAvLyBsbHZtLm1pcHMucGNudC5kCisgICAgMSwgLy8gbGx2bS5taXBzLnBjbnQuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5wY250LncKKyAgICAxNiwgLy8gbGx2bS5taXBzLnBpY2sucGgKKyAgICAxNiwgLy8gbGx2bS5taXBzLnBpY2sucWIKKyAgICAxLCAvLyBsbHZtLm1pcHMucHJlY2VxLncucGhsCisgICAgMSwgLy8gbGx2bS5taXBzLnByZWNlcS53LnBocgorICAgIDEsIC8vIGxsdm0ubWlwcy5wcmVjZXF1LnBoLnFibAorICAgIDEsIC8vIGxsdm0ubWlwcy5wcmVjZXF1LnBoLnFibGEKKyAgICAxLCAvLyBsbHZtLm1pcHMucHJlY2VxdS5waC5xYnIKKyAgICAxLCAvLyBsbHZtLm1pcHMucHJlY2VxdS5waC5xYnJhCisgICAgMSwgLy8gbGx2bS5taXBzLnByZWNldS5waC5xYmwKKyAgICAxLCAvLyBsbHZtLm1pcHMucHJlY2V1LnBoLnFibGEKKyAgICAxLCAvLyBsbHZtLm1pcHMucHJlY2V1LnBoLnFicgorICAgIDEsIC8vIGxsdm0ubWlwcy5wcmVjZXUucGgucWJyYQorICAgIDMsIC8vIGxsdm0ubWlwcy5wcmVjci5xYi5waAorICAgIDEsIC8vIGxsdm0ubWlwcy5wcmVjci5zcmEucGgudworICAgIDEsIC8vIGxsdm0ubWlwcy5wcmVjci5zcmEuci5waC53CisgICAgMSwgLy8gbGx2bS5taXBzLnByZWNycS5waC53CisgICAgMSwgLy8gbGx2bS5taXBzLnByZWNycS5xYi5waAorICAgIDMsIC8vIGxsdm0ubWlwcy5wcmVjcnEucnMucGgudworICAgIDMsIC8vIGxsdm0ubWlwcy5wcmVjcnF1LnMucWIucGgKKyAgICAxLCAvLyBsbHZtLm1pcHMucHJlcGVuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5yYWRkdS53LnFiCisgICAgMTYsIC8vIGxsdm0ubWlwcy5yZGRzcAorICAgIDEsIC8vIGxsdm0ubWlwcy5yZXBsLnBoCisgICAgMSwgLy8gbGx2bS5taXBzLnJlcGwucWIKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2F0LnMuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5zYXQucy5kCisgICAgMSwgLy8gbGx2bS5taXBzLnNhdC5zLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2F0LnMudworICAgIDEsIC8vIGxsdm0ubWlwcy5zYXQudS5iCisgICAgMSwgLy8gbGx2bS5taXBzLnNhdC51LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2F0LnUuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5zYXQudS53CisgICAgMSwgLy8gbGx2bS5taXBzLnNoZi5iCisgICAgMSwgLy8gbGx2bS5taXBzLnNoZi5oCisgICAgMSwgLy8gbGx2bS5taXBzLnNoZi53CisgICAgMSwgLy8gbGx2bS5taXBzLnNoaWxvCisgICAgMywgLy8gbGx2bS5taXBzLnNobGwucGgKKyAgICAzLCAvLyBsbHZtLm1pcHMuc2hsbC5xYgorICAgIDMsIC8vIGxsdm0ubWlwcy5zaGxsLnMucGgKKyAgICAzLCAvLyBsbHZtLm1pcHMuc2hsbC5zLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2hyYS5waAorICAgIDEsIC8vIGxsdm0ubWlwcy5zaHJhLnFiCisgICAgMSwgLy8gbGx2bS5taXBzLnNocmEuci5waAorICAgIDEsIC8vIGxsdm0ubWlwcy5zaHJhLnIucWIKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2hyYS5yLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2hybC5waAorICAgIDEsIC8vIGxsdm0ubWlwcy5zaHJsLnFiCisgICAgMSwgLy8gbGx2bS5taXBzLnNsZC5iCisgICAgMSwgLy8gbGx2bS5taXBzLnNsZC5kCisgICAgMSwgLy8gbGx2bS5taXBzLnNsZC5oCisgICAgMSwgLy8gbGx2bS5taXBzLnNsZC53CisgICAgMSwgLy8gbGx2bS5taXBzLnNsZGkuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5zbGRpLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2xkaS5oCisgICAgMSwgLy8gbGx2bS5taXBzLnNsZGkudworICAgIDEsIC8vIGxsdm0ubWlwcy5zbGwuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5zbGwuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5zbGwuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5zbGwudworICAgIDEsIC8vIGxsdm0ubWlwcy5zbGxpLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuc2xsaS5kCisgICAgMSwgLy8gbGx2bS5taXBzLnNsbGkuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5zbGxpLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3BsYXQuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5zcGxhdC5kCisgICAgMSwgLy8gbGx2bS5taXBzLnNwbGF0LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3BsYXQudworICAgIDEsIC8vIGxsdm0ubWlwcy5zcGxhdGkuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5zcGxhdGkuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5zcGxhdGkuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5zcGxhdGkudworICAgIDEsIC8vIGxsdm0ubWlwcy5zcmEuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5zcmEuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5zcmEuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5zcmEudworICAgIDEsIC8vIGxsdm0ubWlwcy5zcmFpLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3JhaS5kCisgICAgMSwgLy8gbGx2bS5taXBzLnNyYWkuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5zcmFpLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Jhci5iCisgICAgMSwgLy8gbGx2bS5taXBzLnNyYXIuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5zcmFyLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Jhci53CisgICAgMSwgLy8gbGx2bS5taXBzLnNyYXJpLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3JhcmkuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5zcmFyaS5oCisgICAgMSwgLy8gbGx2bS5taXBzLnNyYXJpLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3JsLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3JsLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3JsLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3JsLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3JsaS5iCisgICAgMSwgLy8gbGx2bS5taXBzLnNybGkuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5zcmxpLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3JsaS53CisgICAgMSwgLy8gbGx2bS5taXBzLnNybHIuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5zcmxyLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Jsci5oCisgICAgMSwgLy8gbGx2bS5taXBzLnNybHIudworICAgIDEsIC8vIGxsdm0ubWlwcy5zcmxyaS5iCisgICAgMSwgLy8gbGx2bS5taXBzLnNybHJpLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3JscmkuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5zcmxyaS53CisgICAgMjEsIC8vIGxsdm0ubWlwcy5zdC5iCisgICAgMjEsIC8vIGxsdm0ubWlwcy5zdC5kCisgICAgMjEsIC8vIGxsdm0ubWlwcy5zdC5oCisgICAgMjEsIC8vIGxsdm0ubWlwcy5zdC53CisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnEucGgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3VicS5zLnBoCisgICAgMywgLy8gbGx2bS5taXBzLnN1YnEucy53CisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnFoLnBoCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnFoLnIucGgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3VicWguci53CisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnFoLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Vicy5zLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Vicy5zLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Vicy5zLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Vicy5zLncKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Vicy51LmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Vicy51LmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Vicy51LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Vicy51LncKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Vic3VzLnUuYgorICAgIDEsIC8vIGxsdm0ubWlwcy5zdWJzdXMudS5kCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnN1cy51LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Vic3VzLnUudworICAgIDEsIC8vIGxsdm0ubWlwcy5zdWJzdXUucy5iCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnN1dS5zLmQKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Vic3V1LnMuaAorICAgIDEsIC8vIGxsdm0ubWlwcy5zdWJzdXUucy53CisgICAgMywgLy8gbGx2bS5taXBzLnN1YnUucGgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3VidS5xYgorICAgIDMsIC8vIGxsdm0ubWlwcy5zdWJ1LnMucGgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3VidS5zLnFiCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnVoLnFiCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnVoLnIucWIKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Vidi5iCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnYuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5zdWJ2LmgKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3Vidi53CisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnZpLmIKKyAgICAxLCAvLyBsbHZtLm1pcHMuc3VidmkuZAorICAgIDEsIC8vIGxsdm0ubWlwcy5zdWJ2aS5oCisgICAgMSwgLy8gbGx2bS5taXBzLnN1YnZpLncKKyAgICAxLCAvLyBsbHZtLm1pcHMudnNoZi5iCisgICAgMSwgLy8gbGx2bS5taXBzLnZzaGYuZAorICAgIDEsIC8vIGxsdm0ubWlwcy52c2hmLmgKKyAgICAxLCAvLyBsbHZtLm1pcHMudnNoZi53CisgICAgMywgLy8gbGx2bS5taXBzLndyZHNwCisgICAgMSwgLy8gbGx2bS5taXBzLnhvci52CisgICAgMSwgLy8gbGx2bS5taXBzLnhvcmkuYgorICAgIDEsIC8vIGxsdm0ubnZ2bS5hZGQucm0uZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5hZGQucm0uZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5hZGQucm0uZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uYWRkLnJuLmQKKyAgICAxLCAvLyBsbHZtLm52dm0uYWRkLnJuLmYKKyAgICAxLCAvLyBsbHZtLm52dm0uYWRkLnJuLmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLmFkZC5ycC5kCisgICAgMSwgLy8gbGx2bS5udnZtLmFkZC5ycC5mCisgICAgMSwgLy8gbGx2bS5udnZtLmFkZC5ycC5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5hZGQucnouZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5hZGQucnouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5hZGQucnouZnR6LmYKKyAgICAxOCwgLy8gbGx2bS5udnZtLmF0b21pYy5hZGQuZ2VuLmYuY3RhCisgICAgMTgsIC8vIGxsdm0ubnZ2bS5hdG9taWMuYWRkLmdlbi5mLnN5cworICAgIDE4LCAvLyBsbHZtLm52dm0uYXRvbWljLmFkZC5nZW4uaS5jdGEKKyAgICAxOCwgLy8gbGx2bS5udnZtLmF0b21pYy5hZGQuZ2VuLmkuc3lzCisgICAgMTgsIC8vIGxsdm0ubnZ2bS5hdG9taWMuYW5kLmdlbi5pLmN0YQorICAgIDE4LCAvLyBsbHZtLm52dm0uYXRvbWljLmFuZC5nZW4uaS5zeXMKKyAgICAxOCwgLy8gbGx2bS5udnZtLmF0b21pYy5jYXMuZ2VuLmkuY3RhCisgICAgMTgsIC8vIGxsdm0ubnZ2bS5hdG9taWMuY2FzLmdlbi5pLnN5cworICAgIDE4LCAvLyBsbHZtLm52dm0uYXRvbWljLmRlYy5nZW4uaS5jdGEKKyAgICAxOCwgLy8gbGx2bS5udnZtLmF0b21pYy5kZWMuZ2VuLmkuc3lzCisgICAgMTgsIC8vIGxsdm0ubnZ2bS5hdG9taWMuZXhjaC5nZW4uaS5jdGEKKyAgICAxOCwgLy8gbGx2bS5udnZtLmF0b21pYy5leGNoLmdlbi5pLnN5cworICAgIDE4LCAvLyBsbHZtLm52dm0uYXRvbWljLmluYy5nZW4uaS5jdGEKKyAgICAxOCwgLy8gbGx2bS5udnZtLmF0b21pYy5pbmMuZ2VuLmkuc3lzCisgICAgMTgsIC8vIGxsdm0ubnZ2bS5hdG9taWMubG9hZC5hZGQuZjMyCisgICAgMTgsIC8vIGxsdm0ubnZ2bS5hdG9taWMubG9hZC5hZGQuZjY0CisgICAgMTgsIC8vIGxsdm0ubnZ2bS5hdG9taWMubG9hZC5kZWMuMzIKKyAgICAxOCwgLy8gbGx2bS5udnZtLmF0b21pYy5sb2FkLmluYy4zMgorICAgIDE4LCAvLyBsbHZtLm52dm0uYXRvbWljLm1heC5nZW4uaS5jdGEKKyAgICAxOCwgLy8gbGx2bS5udnZtLmF0b21pYy5tYXguZ2VuLmkuc3lzCisgICAgMTgsIC8vIGxsdm0ubnZ2bS5hdG9taWMubWluLmdlbi5pLmN0YQorICAgIDE4LCAvLyBsbHZtLm52dm0uYXRvbWljLm1pbi5nZW4uaS5zeXMKKyAgICAxOCwgLy8gbGx2bS5udnZtLmF0b21pYy5vci5nZW4uaS5jdGEKKyAgICAxOCwgLy8gbGx2bS5udnZtLmF0b21pYy5vci5nZW4uaS5zeXMKKyAgICAxOCwgLy8gbGx2bS5udnZtLmF0b21pYy54b3IuZ2VuLmkuY3RhCisgICAgMTgsIC8vIGxsdm0ubnZ2bS5hdG9taWMueG9yLmdlbi5pLnN5cworICAgIDMzLCAvLyBsbHZtLm52dm0uYmFyLnN5bmMKKyAgICAzMywgLy8gbGx2bS5udnZtLmJhci53YXJwLnN5bmMKKyAgICAzMywgLy8gbGx2bS5udnZtLmJhcnJpZXIKKyAgICAzMywgLy8gbGx2bS5udnZtLmJhcnJpZXIubgorICAgIDMzLCAvLyBsbHZtLm52dm0uYmFycmllci5zeW5jCisgICAgMzMsIC8vIGxsdm0ubnZ2bS5iYXJyaWVyLnN5bmMuY250CisgICAgMzMsIC8vIGxsdm0ubnZ2bS5iYXJyaWVyMAorICAgIDMzLCAvLyBsbHZtLm52dm0uYmFycmllcjAuYW5kCisgICAgMzMsIC8vIGxsdm0ubnZ2bS5iYXJyaWVyMC5vcgorICAgIDMzLCAvLyBsbHZtLm52dm0uYmFycmllcjAucG9wYworICAgIDEsIC8vIGxsdm0ubnZ2bS5iaXRjYXN0LmQybGwKKyAgICAxLCAvLyBsbHZtLm52dm0uYml0Y2FzdC5mMmkKKyAgICAxLCAvLyBsbHZtLm52dm0uYml0Y2FzdC5pMmYKKyAgICAxLCAvLyBsbHZtLm52dm0uYml0Y2FzdC5sbDJkCisgICAgMSwgLy8gbGx2bS5udnZtLmNlaWwuZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5jZWlsLmYKKyAgICAxLCAvLyBsbHZtLm52dm0uY2VpbC5mdHouZgorICAgIDMsIC8vIGxsdm0ubnZ2bS5jb21waWxlci5lcnJvcgorICAgIDMsIC8vIGxsdm0ubnZ2bS5jb21waWxlci53YXJuCisgICAgMSwgLy8gbGx2bS5udnZtLmNvcy5hcHByb3guZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5jb3MuYXBwcm94LmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLmQyZi5ybQorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMmYucm0uZnR6CisgICAgMSwgLy8gbGx2bS5udnZtLmQyZi5ybgorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMmYucm4uZnR6CisgICAgMSwgLy8gbGx2bS5udnZtLmQyZi5ycAorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMmYucnAuZnR6CisgICAgMSwgLy8gbGx2bS5udnZtLmQyZi5yegorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMmYucnouZnR6CisgICAgMSwgLy8gbGx2bS5udnZtLmQyaS5oaQorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMmkubG8KKyAgICAxLCAvLyBsbHZtLm52dm0uZDJpLnJtCisgICAgMSwgLy8gbGx2bS5udnZtLmQyaS5ybgorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMmkucnAKKyAgICAxLCAvLyBsbHZtLm52dm0uZDJpLnJ6CisgICAgMSwgLy8gbGx2bS5udnZtLmQybGwucm0KKyAgICAxLCAvLyBsbHZtLm52dm0uZDJsbC5ybgorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMmxsLnJwCisgICAgMSwgLy8gbGx2bS5udnZtLmQybGwucnoKKyAgICAxLCAvLyBsbHZtLm52dm0uZDJ1aS5ybQorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMnVpLnJuCisgICAgMSwgLy8gbGx2bS5udnZtLmQydWkucnAKKyAgICAxLCAvLyBsbHZtLm52dm0uZDJ1aS5yegorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMnVsbC5ybQorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMnVsbC5ybgorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMnVsbC5ycAorICAgIDEsIC8vIGxsdm0ubnZ2bS5kMnVsbC5yegorICAgIDEsIC8vIGxsdm0ubnZ2bS5kaXYuYXBwcm94LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZGl2LmFwcHJveC5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5kaXYucm0uZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5kaXYucm0uZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5kaXYucm0uZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZGl2LnJuLmQKKyAgICAxLCAvLyBsbHZtLm52dm0uZGl2LnJuLmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZGl2LnJuLmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLmRpdi5ycC5kCisgICAgMSwgLy8gbGx2bS5udnZtLmRpdi5ycC5mCisgICAgMSwgLy8gbGx2bS5udnZtLmRpdi5ycC5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5kaXYucnouZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5kaXYucnouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5kaXYucnouZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZXgyLmFwcHJveC5kCisgICAgMSwgLy8gbGx2bS5udnZtLmV4Mi5hcHByb3guZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5leDIuYXBwcm94LmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLmYyaC5ybgorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMmgucm4uZnR6CisgICAgMSwgLy8gbGx2bS5udnZtLmYyaS5ybQorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMmkucm0uZnR6CisgICAgMSwgLy8gbGx2bS5udnZtLmYyaS5ybgorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMmkucm4uZnR6CisgICAgMSwgLy8gbGx2bS5udnZtLmYyaS5ycAorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMmkucnAuZnR6CisgICAgMSwgLy8gbGx2bS5udnZtLmYyaS5yegorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMmkucnouZnR6CisgICAgMSwgLy8gbGx2bS5udnZtLmYybGwucm0KKyAgICAxLCAvLyBsbHZtLm52dm0uZjJsbC5ybS5mdHoKKyAgICAxLCAvLyBsbHZtLm52dm0uZjJsbC5ybgorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMmxsLnJuLmZ0egorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMmxsLnJwCisgICAgMSwgLy8gbGx2bS5udnZtLmYybGwucnAuZnR6CisgICAgMSwgLy8gbGx2bS5udnZtLmYybGwucnoKKyAgICAxLCAvLyBsbHZtLm52dm0uZjJsbC5yei5mdHoKKyAgICAxLCAvLyBsbHZtLm52dm0uZjJ1aS5ybQorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMnVpLnJtLmZ0egorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMnVpLnJuCisgICAgMSwgLy8gbGx2bS5udnZtLmYydWkucm4uZnR6CisgICAgMSwgLy8gbGx2bS5udnZtLmYydWkucnAKKyAgICAxLCAvLyBsbHZtLm52dm0uZjJ1aS5ycC5mdHoKKyAgICAxLCAvLyBsbHZtLm52dm0uZjJ1aS5yegorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMnVpLnJ6LmZ0egorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMnVsbC5ybQorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMnVsbC5ybS5mdHoKKyAgICAxLCAvLyBsbHZtLm52dm0uZjJ1bGwucm4KKyAgICAxLCAvLyBsbHZtLm52dm0uZjJ1bGwucm4uZnR6CisgICAgMSwgLy8gbGx2bS5udnZtLmYydWxsLnJwCisgICAgMSwgLy8gbGx2bS5udnZtLmYydWxsLnJwLmZ0egorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMnVsbC5yegorICAgIDEsIC8vIGxsdm0ubnZ2bS5mMnVsbC5yei5mdHoKKyAgICAxLCAvLyBsbHZtLm52dm0uZmFicy5kCisgICAgMSwgLy8gbGx2bS5udnZtLmZhYnMuZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5mYWJzLmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLmZsb29yLmQKKyAgICAxLCAvLyBsbHZtLm52dm0uZmxvb3IuZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5mbG9vci5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5mbWEucm0uZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5mbWEucm0uZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5mbWEucm0uZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZm1hLnJuLmQKKyAgICAxLCAvLyBsbHZtLm52dm0uZm1hLnJuLmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZm1hLnJuLmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLmZtYS5ycC5kCisgICAgMSwgLy8gbGx2bS5udnZtLmZtYS5ycC5mCisgICAgMSwgLy8gbGx2bS5udnZtLmZtYS5ycC5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5mbWEucnouZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5mbWEucnouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5mbWEucnouZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZm1heC5kCisgICAgMSwgLy8gbGx2bS5udnZtLmZtYXguZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5mbWF4LmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLmZtaW4uZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5mbWluLmYKKyAgICAxLCAvLyBsbHZtLm52dm0uZm1pbi5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5mbnMKKyAgICAxLCAvLyBsbHZtLm52dm0uaTJkLnJtCisgICAgMSwgLy8gbGx2bS5udnZtLmkyZC5ybgorICAgIDEsIC8vIGxsdm0ubnZ2bS5pMmQucnAKKyAgICAxLCAvLyBsbHZtLm52dm0uaTJkLnJ6CisgICAgMSwgLy8gbGx2bS5udnZtLmkyZi5ybQorICAgIDEsIC8vIGxsdm0ubnZ2bS5pMmYucm4KKyAgICAxLCAvLyBsbHZtLm52dm0uaTJmLnJwCisgICAgMSwgLy8gbGx2bS5udnZtLmkyZi5yegorICAgIDEsIC8vIGxsdm0ubnZ2bS5pc3NwYWNlcC5jb25zdAorICAgIDEsIC8vIGxsdm0ubnZ2bS5pc3NwYWNlcC5nbG9iYWwKKyAgICAxLCAvLyBsbHZtLm52dm0uaXNzcGFjZXAubG9jYWwKKyAgICAxLCAvLyBsbHZtLm52dm0uaXNzcGFjZXAuc2hhcmVkCisgICAgMSwgLy8gbGx2bS5udnZtLmlzdHlwZXAuc2FtcGxlcgorICAgIDEsIC8vIGxsdm0ubnZ2bS5pc3R5cGVwLnN1cmZhY2UKKyAgICAxLCAvLyBsbHZtLm52dm0uaXN0eXBlcC50ZXh0dXJlCisgICAgMzcsIC8vIGxsdm0ubnZ2bS5sZGcuZ2xvYmFsLmYKKyAgICAzNywgLy8gbGx2bS5udnZtLmxkZy5nbG9iYWwuaQorICAgIDM3LCAvLyBsbHZtLm52dm0ubGRnLmdsb2JhbC5wCisgICAgMzcsIC8vIGxsdm0ubnZ2bS5sZHUuZ2xvYmFsLmYKKyAgICAzNywgLy8gbGx2bS5udnZtLmxkdS5nbG9iYWwuaQorICAgIDM3LCAvLyBsbHZtLm52dm0ubGR1Lmdsb2JhbC5wCisgICAgMSwgLy8gbGx2bS5udnZtLmxnMi5hcHByb3guZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5sZzIuYXBwcm94LmYKKyAgICAxLCAvLyBsbHZtLm52dm0ubGcyLmFwcHJveC5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5sbDJkLnJtCisgICAgMSwgLy8gbGx2bS5udnZtLmxsMmQucm4KKyAgICAxLCAvLyBsbHZtLm52dm0ubGwyZC5ycAorICAgIDEsIC8vIGxsdm0ubnZ2bS5sbDJkLnJ6CisgICAgMSwgLy8gbGx2bS5udnZtLmxsMmYucm0KKyAgICAxLCAvLyBsbHZtLm52dm0ubGwyZi5ybgorICAgIDEsIC8vIGxsdm0ubnZ2bS5sbDJmLnJwCisgICAgMSwgLy8gbGx2bS5udnZtLmxsMmYucnoKKyAgICAxLCAvLyBsbHZtLm52dm0ubG9oaS5pMmQKKyAgICAzOCwgLy8gbGx2bS5udnZtLm1hdGNoLmFsbC5zeW5jLmkzMnAKKyAgICAzOCwgLy8gbGx2bS5udnZtLm1hdGNoLmFsbC5zeW5jLmk2NHAKKyAgICAzOCwgLy8gbGx2bS5udnZtLm1hdGNoLmFueS5zeW5jLmkzMgorICAgIDM4LCAvLyBsbHZtLm52dm0ubWF0Y2guYW55LnN5bmMuaTY0CisgICAgMywgLy8gbGx2bS5udnZtLm1lbWJhci5jdGEKKyAgICAzLCAvLyBsbHZtLm52dm0ubWVtYmFyLmdsCisgICAgMywgLy8gbGx2bS5udnZtLm1lbWJhci5zeXMKKyAgICAxLCAvLyBsbHZtLm52dm0ubW92ZS5kb3VibGUKKyAgICAxLCAvLyBsbHZtLm52dm0ubW92ZS5mbG9hdAorICAgIDEsIC8vIGxsdm0ubnZ2bS5tb3ZlLmkxNgorICAgIDEsIC8vIGxsdm0ubnZ2bS5tb3ZlLmkzMgorICAgIDEsIC8vIGxsdm0ubnZ2bS5tb3ZlLmk2NAorICAgIDEyLCAvLyBsbHZtLm52dm0ubW92ZS5wdHIKKyAgICAxLCAvLyBsbHZtLm52dm0ubXVsLnJtLmQKKyAgICAxLCAvLyBsbHZtLm52dm0ubXVsLnJtLmYKKyAgICAxLCAvLyBsbHZtLm52dm0ubXVsLnJtLmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLm11bC5ybi5kCisgICAgMSwgLy8gbGx2bS5udnZtLm11bC5ybi5mCisgICAgMSwgLy8gbGx2bS5udnZtLm11bC5ybi5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5tdWwucnAuZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5tdWwucnAuZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5tdWwucnAuZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0ubXVsLnJ6LmQKKyAgICAxLCAvLyBsbHZtLm52dm0ubXVsLnJ6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0ubXVsLnJ6LmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLm11bDI0LmkKKyAgICAxLCAvLyBsbHZtLm52dm0ubXVsMjQudWkKKyAgICAxLCAvLyBsbHZtLm52dm0ubXVsaGkuaQorICAgIDEsIC8vIGxsdm0ubnZ2bS5tdWxoaS5sbAorICAgIDEsIC8vIGxsdm0ubnZ2bS5tdWxoaS51aQorICAgIDEsIC8vIGxsdm0ubnZ2bS5tdWxoaS51bGwKKyAgICAxLCAvLyBsbHZtLm52dm0ucHJtdAorICAgIDEsIC8vIGxsdm0ubnZ2bS5wdHIuY29uc3RhbnQudG8uZ2VuCisgICAgMSwgLy8gbGx2bS5udnZtLnB0ci5nZW4udG8uY29uc3RhbnQKKyAgICAxLCAvLyBsbHZtLm52dm0ucHRyLmdlbi50by5nbG9iYWwKKyAgICAxLCAvLyBsbHZtLm52dm0ucHRyLmdlbi50by5sb2NhbAorICAgIDEsIC8vIGxsdm0ubnZ2bS5wdHIuZ2VuLnRvLnBhcmFtCisgICAgMSwgLy8gbGx2bS5udnZtLnB0ci5nZW4udG8uc2hhcmVkCisgICAgMSwgLy8gbGx2bS5udnZtLnB0ci5nbG9iYWwudG8uZ2VuCisgICAgMSwgLy8gbGx2bS5udnZtLnB0ci5sb2NhbC50by5nZW4KKyAgICAxLCAvLyBsbHZtLm52dm0ucHRyLnNoYXJlZC50by5nZW4KKyAgICAxLCAvLyBsbHZtLm52dm0ucmNwLmFwcHJveC5mdHouZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yY3Aucm0uZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yY3Aucm0uZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5yY3Aucm0uZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0ucmNwLnJuLmQKKyAgICAxLCAvLyBsbHZtLm52dm0ucmNwLnJuLmYKKyAgICAxLCAvLyBsbHZtLm52dm0ucmNwLnJuLmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLnJjcC5ycC5kCisgICAgMSwgLy8gbGx2bS5udnZtLnJjcC5ycC5mCisgICAgMSwgLy8gbGx2bS5udnZtLnJjcC5ycC5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5yY3AucnouZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yY3AucnouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5yY3AucnouZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5jbG9jaworICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmNsb2NrNjQKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5jdGFpZC53CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuY3RhaWQueAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmN0YWlkLnkKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5jdGFpZC56CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzEKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxMAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzExCisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTIKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxMworICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzE0CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTUKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxNgorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzE3CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMTgKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxOQorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzIKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyMAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzIxCisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjIKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyMworICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzI0CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjUKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyNgorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzI3CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnMjgKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyOQorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzMKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWczMAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzMxCisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnNAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzUKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWc2CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZW52cmVnNworICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzgKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWc5CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuZ3JpZGlkCisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubGFuZWlkCisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubGFuZW1hc2suZXEKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5sYW5lbWFzay5nZQorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmxhbmVtYXNrLmd0CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubGFuZW1hc2subGUKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5sYW5lbWFzay5sdAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLm5jdGFpZC53CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubmN0YWlkLngKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5uY3RhaWQueQorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLm5jdGFpZC56CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcubnNtaWQKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5udGlkLncKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5udGlkLngKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5udGlkLnkKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5udGlkLnoKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5ud2FycGlkCisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcucG0wCisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcucG0xCisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcucG0yCisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcucG0zCisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcuc21pZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLnRpZC53CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcudGlkLngKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVhZC5wdHguc3JlZy50aWQueQorICAgIDEsIC8vIGxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLnRpZC56CisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcud2FycGlkCisgICAgMSwgLy8gbGx2bS5udnZtLnJlYWQucHR4LnNyZWcud2FycHNpemUKKyAgICAxLCAvLyBsbHZtLm52dm0ucmVmbGVjdAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yb3RhdGUuYjMyCisgICAgMSwgLy8gbGx2bS5udnZtLnJvdGF0ZS5iNjQKKyAgICAxLCAvLyBsbHZtLm52dm0ucm90YXRlLnJpZ2h0LmI2NAorICAgIDEsIC8vIGxsdm0ubnZ2bS5yb3VuZC5kCisgICAgMSwgLy8gbGx2bS5udnZtLnJvdW5kLmYKKyAgICAxLCAvLyBsbHZtLm52dm0ucm91bmQuZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0ucnNxcnQuYXBwcm94LmQKKyAgICAxLCAvLyBsbHZtLm52dm0ucnNxcnQuYXBwcm94LmYKKyAgICAxLCAvLyBsbHZtLm52dm0ucnNxcnQuYXBwcm94LmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLnNhZC5pCisgICAgMSwgLy8gbGx2bS5udnZtLnNhZC51aQorICAgIDEsIC8vIGxsdm0ubnZ2bS5zYXR1cmF0ZS5kCisgICAgMSwgLy8gbGx2bS5udnZtLnNhdHVyYXRlLmYKKyAgICAxLCAvLyBsbHZtLm52dm0uc2F0dXJhdGUuZnR6LmYKKyAgICAzOCwgLy8gbGx2bS5udnZtLnNoZmwuYmZseS5mMzIKKyAgICAzOCwgLy8gbGx2bS5udnZtLnNoZmwuYmZseS5pMzIKKyAgICAzOCwgLy8gbGx2bS5udnZtLnNoZmwuZG93bi5mMzIKKyAgICAzOCwgLy8gbGx2bS5udnZtLnNoZmwuZG93bi5pMzIKKyAgICAzOCwgLy8gbGx2bS5udnZtLnNoZmwuaWR4LmYzMgorICAgIDM4LCAvLyBsbHZtLm52dm0uc2hmbC5pZHguaTMyCisgICAgMzgsIC8vIGxsdm0ubnZ2bS5zaGZsLnN5bmMuYmZseS5mMzIKKyAgICAzOCwgLy8gbGx2bS5udnZtLnNoZmwuc3luYy5iZmx5LmkzMgorICAgIDM4LCAvLyBsbHZtLm52dm0uc2hmbC5zeW5jLmRvd24uZjMyCisgICAgMzgsIC8vIGxsdm0ubnZ2bS5zaGZsLnN5bmMuZG93bi5pMzIKKyAgICAzOCwgLy8gbGx2bS5udnZtLnNoZmwuc3luYy5pZHguZjMyCisgICAgMzgsIC8vIGxsdm0ubnZ2bS5zaGZsLnN5bmMuaWR4LmkzMgorICAgIDM4LCAvLyBsbHZtLm52dm0uc2hmbC5zeW5jLnVwLmYzMgorICAgIDM4LCAvLyBsbHZtLm52dm0uc2hmbC5zeW5jLnVwLmkzMgorICAgIDM4LCAvLyBsbHZtLm52dm0uc2hmbC51cC5mMzIKKyAgICAzOCwgLy8gbGx2bS5udnZtLnNoZmwudXAuaTMyCisgICAgMSwgLy8gbGx2bS5udnZtLnNpbi5hcHByb3guZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5zaW4uYXBwcm94LmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLnNxcnQuYXBwcm94LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uc3FydC5hcHByb3guZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uc3FydC5mCisgICAgMSwgLy8gbGx2bS5udnZtLnNxcnQucm0uZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5zcXJ0LnJtLmYKKyAgICAxLCAvLyBsbHZtLm52dm0uc3FydC5ybS5mdHouZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5zcXJ0LnJuLmQKKyAgICAxLCAvLyBsbHZtLm52dm0uc3FydC5ybi5mCisgICAgMSwgLy8gbGx2bS5udnZtLnNxcnQucm4uZnR6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uc3FydC5ycC5kCisgICAgMSwgLy8gbGx2bS5udnZtLnNxcnQucnAuZgorICAgIDEsIC8vIGxsdm0ubnZ2bS5zcXJ0LnJwLmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLnNxcnQucnouZAorICAgIDEsIC8vIGxsdm0ubnZ2bS5zcXJ0LnJ6LmYKKyAgICAxLCAvLyBsbHZtLm52dm0uc3FydC5yei5mdHouZgorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LmkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LmkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTE2Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LmkzMi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTY0LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTY0LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pNjQuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5Lmk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5Lmk4Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52MmkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52MmkxNi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52MmkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpMzIuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTY0LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpNjQudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTY0Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52Mmk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpMTYuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpMTYuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTMyLmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTMyLnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuaTE2LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuaTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5pMTYuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmkzMi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuaTMyLnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5pNjQuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5pNjQudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLmk2NC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuaTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC5pOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQuaTguemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnYyaTE2LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQudjJpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnYyaTE2Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC52MmkzMi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnYyaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC52MmkzMi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQudjJpNjQuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC52Mmk2NC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQudjJpNjQuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnYyaTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC52Mmk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC52Mmk4Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC52NGkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnY0aTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC52NGkxNi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQudjRpMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC52NGkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMWQudjRpMzIuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjFkLnY0aTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC52NGk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4xZC52NGk4Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pMTYuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LmkxNi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTMyLmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pMzIuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5Lmk2NC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5Lmk2NC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTY0Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pOC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5Lmk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpMTYuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52MmkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpMTYuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTMyLmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTMyLnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52Mmk2NC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTY0LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52Mmk2NC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpOC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTguemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTE2LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjRpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTE2Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGkzMi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGkzMi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjRpOC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTguemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuaTE2Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5pMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5pMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmkzMi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuaTY0LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuaTY0LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC5pNjQuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQuaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLmk4Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC52MmkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnYyaTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC52MmkxNi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQudjJpMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC52MmkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQudjJpMzIuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnYyaTY0LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQudjJpNjQudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnYyaTY0Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC52Mmk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQudjJpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQudjJpOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQudjRpMTYuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC52NGkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQudjRpMTYuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnY0aTMyLmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQudjRpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjJkLnY0aTMyLnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4yZC52NGk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQudjRpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuMmQudjRpOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QuaTE2LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QuaTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC5pMTYuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLmkzMi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLmkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QuaTMyLnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC5pNjQuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC5pNjQudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLmk2NC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QuaTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC5pOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QuaTguemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnYyaTE2LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QudjJpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnYyaTE2Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC52MmkzMi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnYyaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC52MmkzMi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QudjJpNjQuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC52Mmk2NC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QudjJpNjQuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnYyaTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC52Mmk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC52Mmk4Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC52NGkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnY0aTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC52NGkxNi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QudjRpMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC52NGkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1bGQuM2QudjRpMzIuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdWxkLjNkLnY0aTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC52NGk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VsZC4zZC52NGk4Lnplcm8KKyAgICAxLCAvLyBsbHZtLm52dm0uc3VxLmFycmF5LnNpemUKKyAgICAxLCAvLyBsbHZtLm52dm0uc3VxLmNoYW5uZWwuZGF0YS50eXBlCisgICAgMSwgLy8gbGx2bS5udnZtLnN1cS5jaGFubmVsLm9yZGVyCisgICAgMSwgLy8gbGx2bS5udnZtLnN1cS5kZXB0aAorICAgIDEsIC8vIGxsdm0ubnZ2bS5zdXEuaGVpZ2h0CisgICAgMSwgLy8gbGx2bS5udnZtLnN1cS53aWR0aAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTE2LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTE2Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LmkzMi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LmkzMi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pNjQuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5Lmk2NC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pNjQuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5Lmk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5Lmk4Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTE2LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52MmkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52MmkxNi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52MmkzMi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpMzIuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpNjQuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTY0LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTY0Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52NGkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpMTYuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTMyLnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5pMTYuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5pMTYuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuaTMyLmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5pMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuaTMyLnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmk2NC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuaTY0LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLmk2NC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC5pOC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQuaTguemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpMTYuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTE2Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTMyLmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52MmkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52MmkzMi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52Mmk2NC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpNjQudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpNjQuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpOC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52Mmk4Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTE2LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52NGkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52NGkxNi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52NGkzMi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpMzIuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpOC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4xZC52NGk4Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LmkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LmkxNi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LmkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pMzIuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTY0LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pNjQudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTY0Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5Lmk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52MmkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpMTYuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTMyLnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTY0LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52Mmk2NC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52Mmk2NC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52Mmk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52Mmk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTguemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpMTYuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTE2Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTMyLmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGkzMi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGk4LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTguemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuaTE2LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5pMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuaTE2Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmkzMi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuaTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmkzMi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5pNjQuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmk2NC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC5pNjQuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQuaTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLmk4Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTE2LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52MmkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52MmkxNi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52MmkzMi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpMzIuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpNjQuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTY0LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTY0Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4yZC52NGkxNi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpMTYuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpMzIuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTMyLnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTMyLnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTguY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpOC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC5pMTYuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLmkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC5pMTYuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QuaTMyLmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC5pMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QuaTMyLnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLmk2NC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QuaTY0LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLmk2NC56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC5pOC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QuaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QuaTguemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpMTYuY2xhbXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTE2LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTE2Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTMyLmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52MmkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52MmkzMi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52Mmk2NC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpNjQudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpNjQuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpOC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52Mmk4Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTE2LmNsYW1wCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52NGkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52NGkxNi56ZXJvCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52NGkzMi5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpMzIuemVybworICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpOC5jbGFtcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QuYi4zZC52NGk4Lnplcm8KKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LmkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS5pMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkuaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkudjJpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkudjJpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkudjJpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS52NGkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS52NGkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS52NGk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjFkLmkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4xZC5pMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQuaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQudjJpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQudjJpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMWQudjJpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4xZC52NGkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4xZC52NGkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4xZC52NGk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5LmkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS5pMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkuaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkudjJpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkudjJpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkudjJpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS52NGkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS52NGkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS52NGk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjJkLmkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4yZC5pMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQuaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQudjJpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQudjJpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuMmQudjJpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4yZC52NGkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4yZC52NGkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4yZC52NGk4LnRyYXAKKyAgICAzLCAvLyBsbHZtLm52dm0uc3VzdC5wLjNkLmkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4zZC5pMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuM2QuaTgudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuM2QudjJpMTYudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuM2QudjJpMzIudHJhcAorICAgIDMsIC8vIGxsdm0ubnZ2bS5zdXN0LnAuM2QudjJpOC50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4zZC52NGkxNi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4zZC52NGkzMi50cmFwCisgICAgMywgLy8gbGx2bS5udnZtLnN1c3QucC4zZC52NGk4LnRyYXAKKyAgICAxLCAvLyBsbHZtLm52dm0uc3dhcC5sby5oaS5iNjQKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjFkLmFycmF5LmdyYWQudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4xZC5hcnJheS5ncmFkLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMWQuYXJyYXkuZ3JhZC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjFkLmFycmF5LmxldmVsLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMWQuYXJyYXkubGV2ZWwudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4xZC5hcnJheS5sZXZlbC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjFkLmFycmF5LnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMWQuYXJyYXkudjRmMzIuczMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4xZC5hcnJheS52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjFkLmFycmF5LnY0czMyLnMzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMWQuYXJyYXkudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4xZC5hcnJheS52NHUzMi5zMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjFkLmdyYWQudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4xZC5ncmFkLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMWQuZ3JhZC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjFkLmxldmVsLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMWQubGV2ZWwudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4xZC5sZXZlbC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjFkLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMWQudjRmMzIuczMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4xZC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjFkLnY0czMyLnMzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMWQudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4xZC52NHUzMi5zMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjJkLmFycmF5LmdyYWQudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4yZC5hcnJheS5ncmFkLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMmQuYXJyYXkuZ3JhZC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjJkLmFycmF5LmxldmVsLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMmQuYXJyYXkubGV2ZWwudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4yZC5hcnJheS5sZXZlbC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjJkLmFycmF5LnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMmQuYXJyYXkudjRmMzIuczMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4yZC5hcnJheS52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjJkLmFycmF5LnY0czMyLnMzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMmQuYXJyYXkudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4yZC5hcnJheS52NHUzMi5zMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjJkLmdyYWQudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4yZC5ncmFkLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMmQuZ3JhZC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjJkLmxldmVsLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMmQubGV2ZWwudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4yZC5sZXZlbC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjJkLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMmQudjRmMzIuczMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4yZC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjJkLnY0czMyLnMzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguMmQudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4yZC52NHUzMi5zMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjNkLmdyYWQudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4zZC5ncmFkLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguM2QuZ3JhZC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjNkLmxldmVsLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguM2QubGV2ZWwudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4zZC5sZXZlbC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjNkLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguM2QudjRmMzIuczMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4zZC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LjNkLnY0czMyLnMzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguM2QudjR1MzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC4zZC52NHUzMi5zMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LmN1YmUuYXJyYXkubGV2ZWwudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC5jdWJlLmFycmF5LmxldmVsLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguY3ViZS5hcnJheS5sZXZlbC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LmN1YmUuYXJyYXkudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC5jdWJlLmFycmF5LnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguY3ViZS5hcnJheS52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LmN1YmUubGV2ZWwudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC5jdWJlLmxldmVsLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguY3ViZS5sZXZlbC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LmN1YmUudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC5jdWJlLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXguY3ViZS52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkuZ3JhZC52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkuZ3JhZC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkuZ3JhZC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkubGV2ZWwudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LmxldmVsLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS5sZXZlbC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LnY0ZjMyLnMzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkudjRzMzIuczMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LnY0dTMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS52NHUzMi5zMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuZ3JhZC52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuZ3JhZC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuZ3JhZC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQubGV2ZWwudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmxldmVsLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5sZXZlbC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLnY0ZjMyLnMzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQudjRzMzIuczMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjFkLnY0dTMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC52NHUzMi5zMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkuZ3JhZC52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkuZ3JhZC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkuZ3JhZC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkubGV2ZWwudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LmxldmVsLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS5sZXZlbC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LnY0ZjMyLnMzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkudjRzMzIuczMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LnY0dTMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS52NHUzMi5zMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuZ3JhZC52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuZ3JhZC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuZ3JhZC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQubGV2ZWwudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmxldmVsLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5sZXZlbC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLnY0ZjMyLnMzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQudjRzMzIuczMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjJkLnY0dTMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC52NHUzMi5zMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QuZ3JhZC52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QuZ3JhZC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QuZ3JhZC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QubGV2ZWwudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjNkLmxldmVsLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC5sZXZlbC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjNkLnY0ZjMyLnMzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QudjRzMzIuczMyCisgICAgMywgLy8gbGx2bS5udnZtLnRleC51bmlmaWVkLjNkLnY0dTMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC52NHUzMi5zMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5hcnJheS5sZXZlbC52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5hcnJheS5sZXZlbC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5hcnJheS5sZXZlbC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5hcnJheS52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5hcnJheS52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5hcnJheS52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5sZXZlbC52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5sZXZlbC52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5sZXZlbC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS52NGYzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS52NHMzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS52NHUzMi5mMzIKKyAgICAxLCAvLyBsbHZtLm52dm0udGV4c3VyZi5oYW5kbGUKKyAgICAxLCAvLyBsbHZtLm52dm0udGV4c3VyZi5oYW5kbGUuaW50ZXJuYWwKKyAgICAzLCAvLyBsbHZtLm52dm0udGxkNC5hLjJkLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50bGQ0LmEuMmQudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRsZDQuYS4yZC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGxkNC5iLjJkLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50bGQ0LmIuMmQudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRsZDQuYi4yZC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGxkNC5nLjJkLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50bGQ0LmcuMmQudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRsZDQuZy4yZC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGxkNC5yLjJkLnY0ZjMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50bGQ0LnIuMmQudjRzMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRsZDQuci4yZC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGxkNC51bmlmaWVkLmEuMmQudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRsZDQudW5pZmllZC5hLjJkLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuYS4yZC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGxkNC51bmlmaWVkLmIuMmQudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRsZDQudW5pZmllZC5iLjJkLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuYi4yZC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGxkNC51bmlmaWVkLmcuMmQudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRsZDQudW5pZmllZC5nLjJkLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuZy4yZC52NHUzMi5mMzIKKyAgICAzLCAvLyBsbHZtLm52dm0udGxkNC51bmlmaWVkLnIuMmQudjRmMzIuZjMyCisgICAgMywgLy8gbGx2bS5udnZtLnRsZDQudW5pZmllZC5yLjJkLnY0czMyLmYzMgorICAgIDMsIC8vIGxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuci4yZC52NHUzMi5mMzIKKyAgICAxLCAvLyBsbHZtLm52dm0udHJ1bmMuZAorICAgIDEsIC8vIGxsdm0ubnZ2bS50cnVuYy5mCisgICAgMSwgLy8gbGx2bS5udnZtLnRydW5jLmZ0ei5mCisgICAgMSwgLy8gbGx2bS5udnZtLnR4cS5hcnJheS5zaXplCisgICAgMSwgLy8gbGx2bS5udnZtLnR4cS5jaGFubmVsLmRhdGEudHlwZQorICAgIDEsIC8vIGxsdm0ubnZ2bS50eHEuY2hhbm5lbC5vcmRlcgorICAgIDEsIC8vIGxsdm0ubnZ2bS50eHEuZGVwdGgKKyAgICAxLCAvLyBsbHZtLm52dm0udHhxLmhlaWdodAorICAgIDEsIC8vIGxsdm0ubnZ2bS50eHEubnVtLm1pcG1hcC5sZXZlbHMKKyAgICAxLCAvLyBsbHZtLm52dm0udHhxLm51bS5zYW1wbGVzCisgICAgMSwgLy8gbGx2bS5udnZtLnR4cS53aWR0aAorICAgIDEsIC8vIGxsdm0ubnZ2bS51aTJkLnJtCisgICAgMSwgLy8gbGx2bS5udnZtLnVpMmQucm4KKyAgICAxLCAvLyBsbHZtLm52dm0udWkyZC5ycAorICAgIDEsIC8vIGxsdm0ubnZ2bS51aTJkLnJ6CisgICAgMSwgLy8gbGx2bS5udnZtLnVpMmYucm0KKyAgICAxLCAvLyBsbHZtLm52dm0udWkyZi5ybgorICAgIDEsIC8vIGxsdm0ubnZ2bS51aTJmLnJwCisgICAgMSwgLy8gbGx2bS5udnZtLnVpMmYucnoKKyAgICAxLCAvLyBsbHZtLm52dm0udWxsMmQucm0KKyAgICAxLCAvLyBsbHZtLm52dm0udWxsMmQucm4KKyAgICAxLCAvLyBsbHZtLm52dm0udWxsMmQucnAKKyAgICAxLCAvLyBsbHZtLm52dm0udWxsMmQucnoKKyAgICAxLCAvLyBsbHZtLm52dm0udWxsMmYucm0KKyAgICAxLCAvLyBsbHZtLm52dm0udWxsMmYucm4KKyAgICAxLCAvLyBsbHZtLm52dm0udWxsMmYucnAKKyAgICAxLCAvLyBsbHZtLm52dm0udWxsMmYucnoKKyAgICAzOCwgLy8gbGx2bS5udnZtLnZvdGUuYWxsCisgICAgMzgsIC8vIGxsdm0ubnZ2bS52b3RlLmFsbC5zeW5jCisgICAgMzgsIC8vIGxsdm0ubnZ2bS52b3RlLmFueQorICAgIDM4LCAvLyBsbHZtLm52dm0udm90ZS5hbnkuc3luYworICAgIDM4LCAvLyBsbHZtLm52dm0udm90ZS5iYWxsb3QKKyAgICAzOCwgLy8gbGx2bS5udnZtLnZvdGUuYmFsbG90LnN5bmMKKyAgICAzOCwgLy8gbGx2bS5udnZtLnZvdGUudW5pCisgICAgMzgsIC8vIGxsdm0ubnZ2bS52b3RlLnVuaS5zeW5jCisgICAgMTMsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmEuY29sLmYxNgorICAgIDEzLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5hLmNvbC5zdHJpZGUuZjE2CisgICAgMTMsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmEucm93LmYxNgorICAgIDEzLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5hLnJvdy5zdHJpZGUuZjE2CisgICAgMTMsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmIuY29sLmYxNgorICAgIDEzLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5iLmNvbC5zdHJpZGUuZjE2CisgICAgMTMsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmIucm93LmYxNgorICAgIDEzLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5iLnJvdy5zdHJpZGUuZjE2CisgICAgMTMsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmMuY29sLmYxNgorICAgIDEzLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5jLmNvbC5mMzIKKyAgICAxMywgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYy5jb2wuc3RyaWRlLmYxNgorICAgIDEzLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5jLmNvbC5zdHJpZGUuZjMyCisgICAgMTMsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5sb2FkLmMucm93LmYxNgorICAgIDEzLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5jLnJvdy5mMzIKKyAgICAxMywgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LmxvYWQuYy5yb3cuc3RyaWRlLmYxNgorICAgIDEzLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubG9hZC5jLnJvdy5zdHJpZGUuZjMyCisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wuY29sLmYxNi5mMTYKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5jb2wuZjE2LmYxNi5zYXRmaW5pdGUKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5jb2wuZjE2LmYzMgorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLmNvbC5mMTYuZjMyLnNhdGZpbml0ZQorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLmNvbC5mMzIuZjE2CisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wuY29sLmYzMi5mMTYuc2F0ZmluaXRlCisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wuY29sLmYzMi5mMzIKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5jb2wuZjMyLmYzMi5zYXRmaW5pdGUKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5yb3cuZjE2LmYxNgorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLnJvdy5mMTYuZjE2LnNhdGZpbml0ZQorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLnJvdy5mMTYuZjMyCisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wucm93LmYxNi5mMzIuc2F0ZmluaXRlCisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5jb2wucm93LmYzMi5mMTYKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5yb3cuZjMyLmYxNi5zYXRmaW5pdGUKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLmNvbC5yb3cuZjMyLmYzMgorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEuY29sLnJvdy5mMzIuZjMyLnNhdGZpbml0ZQorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LmNvbC5mMTYuZjE2CisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cuY29sLmYxNi5mMTYuc2F0ZmluaXRlCisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cuY29sLmYxNi5mMzIKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5jb2wuZjE2LmYzMi5zYXRmaW5pdGUKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5jb2wuZjMyLmYxNgorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LmNvbC5mMzIuZjE2LnNhdGZpbml0ZQorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LmNvbC5mMzIuZjMyCisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cuY29sLmYzMi5mMzIuc2F0ZmluaXRlCisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cucm93LmYxNi5mMTYKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5yb3cuZjE2LmYxNi5zYXRmaW5pdGUKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5yb3cuZjE2LmYzMgorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LnJvdy5mMTYuZjMyLnNhdGZpbml0ZQorICAgIDEsIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5tbWEucm93LnJvdy5mMzIuZjE2CisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cucm93LmYzMi5mMTYuc2F0ZmluaXRlCisgICAgMSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2Lm1tYS5yb3cucm93LmYzMi5mMzIKKyAgICAxLCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYubW1hLnJvdy5yb3cuZjMyLmYzMi5zYXRmaW5pdGUKKyAgICAzOSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LnN0b3JlLmQuY29sLmYxNgorICAgIDM5LCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYuc3RvcmUuZC5jb2wuZjMyCisgICAgMzksIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5zdG9yZS5kLmNvbC5zdHJpZGUuZjE2CisgICAgMzksIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5zdG9yZS5kLmNvbC5zdHJpZGUuZjMyCisgICAgMzksIC8vIGxsdm0ubnZ2bS53bW1hLm0xNm4xNmsxNi5zdG9yZS5kLnJvdy5mMTYKKyAgICAzOSwgLy8gbGx2bS5udnZtLndtbWEubTE2bjE2azE2LnN0b3JlLmQucm93LmYzMgorICAgIDM5LCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYuc3RvcmUuZC5yb3cuc3RyaWRlLmYxNgorICAgIDM5LCAvLyBsbHZtLm52dm0ud21tYS5tMTZuMTZrMTYuc3RvcmUuZC5yb3cuc3RyaWRlLmYzMgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZjaXBoZXIKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLmNyeXB0by52Y2lwaGVybGFzdAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZuY2lwaGVyCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udm5jaXBoZXJsYXN0CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udnBlcm14b3IKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLmNyeXB0by52cG1zdW1iCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udnBtc3VtZAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMuY3J5cHRvLnZwbXN1bWgKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLmNyeXB0by52cG1zdW13CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udnNib3gKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLmNyeXB0by52c2hhc2lnbWFkCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy5jcnlwdG8udnNoYXNpZ21hdworICAgIDMsIC8vIGxsdm0ucHBjLmFsdGl2ZWMuZHNzCisgICAgMywgLy8gbGx2bS5wcGMuYWx0aXZlYy5kc3NhbGwKKyAgICAzLCAvLyBsbHZtLnBwYy5hbHRpdmVjLmRzdAorICAgIDMsIC8vIGxsdm0ucHBjLmFsdGl2ZWMuZHN0c3QKKyAgICAzLCAvLyBsbHZtLnBwYy5hbHRpdmVjLmRzdHN0dAorICAgIDMsIC8vIGxsdm0ucHBjLmFsdGl2ZWMuZHN0dAorICAgIDIsIC8vIGxsdm0ucHBjLmFsdGl2ZWMubHZlYngKKyAgICAyLCAvLyBsbHZtLnBwYy5hbHRpdmVjLmx2ZWh4CisgICAgMiwgLy8gbGx2bS5wcGMuYWx0aXZlYy5sdmV3eAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMubHZzbAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMubHZzcgorICAgIDIsIC8vIGxsdm0ucHBjLmFsdGl2ZWMubHZ4CisgICAgMiwgLy8gbGx2bS5wcGMuYWx0aXZlYy5sdnhsCisgICAgMTYsIC8vIGxsdm0ucHBjLmFsdGl2ZWMubWZ2c2NyCisgICAgMywgLy8gbGx2bS5wcGMuYWx0aXZlYy5tdHZzY3IKKyAgICA0MCwgLy8gbGx2bS5wcGMuYWx0aXZlYy5zdHZlYngKKyAgICA0MCwgLy8gbGx2bS5wcGMuYWx0aXZlYy5zdHZlaHgKKyAgICA0MCwgLy8gbGx2bS5wcGMuYWx0aXZlYy5zdHZld3gKKyAgICA0MCwgLy8gbGx2bS5wcGMuYWx0aXZlYy5zdHZ4CisgICAgNDAsIC8vIGxsdm0ucHBjLmFsdGl2ZWMuc3R2eGwKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhYnNkdWIKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhYnNkdWgKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhYnNkdXcKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhZGRjdXEKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhZGRjdXcKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhZGRlY3VxCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52YWRkZXVxbQorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmFkZHNicworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmFkZHNocworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmFkZHN3cworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmFkZHVicworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmFkZHVocworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmFkZHV3cworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmF2Z3NiCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52YXZnc2gKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhdmdzdworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmF2Z3ViCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52YXZndWgKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZhdmd1dworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmJwZXJtcQorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNmc3gKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjZnV4CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y2x6bHNiYgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGJmcAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGJmcC5wCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZXFmcAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGVxZnAucAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGVxdWIKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBlcXViLnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBlcXVkCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1ZC5wCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZXF1aAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGVxdWgucAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGVxdXcKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBlcXV3LnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBnZWZwCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ2VmcC5wCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RmcAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0ZnAucAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0c2IKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHNiLnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHNkCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RzZC5wCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3RzaAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0c2gucAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0c3cKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHN3LnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHViCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1Yi5wCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1ZAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0dWQucAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcGd0dWgKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHVoLnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBndHV3CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wZ3R1dy5wCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wbmViCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wbmViLnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZWgKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZWgucAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcG5ldworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcG5ldy5wCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wbmV6YgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcG5lemIucAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmNtcG5lemgKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZXpoLnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjbXBuZXp3CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y21wbmV6dy5wCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Y3RzeHMKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZjdHV4cworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmN0emxzYmIKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZleHB0ZWZwCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52Z2JiZAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudmxvZ2VmcAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1hZGRmcAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1heGZwCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWF4c2IKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtYXhzZAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1heHNoCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWF4c3cKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtYXh1YgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1heHVkCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWF4dWgKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtYXh1dworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1oYWRkc2hzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWhyYWRkc2hzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWluZnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtaW5zYgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1pbnNkCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWluc2gKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtaW5zdworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1pbnViCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWludWQKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtaW51aAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1pbnV3CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bWxhZGR1aG0KKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtc3VtbWJtCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXN1bXNobQorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1zdW1zaHMKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtc3VtdWJtCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52bXN1bXVobQorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudm1zdW11aHMKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtdWxlc2IKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtdWxlc2gKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtdWxlc3cKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtdWxldWIKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtdWxldWgKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtdWxldXcKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtdWxvc2IKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtdWxvc2gKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtdWxvc3cKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtdWxvdWIKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtdWxvdWgKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZtdWxvdXcKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZubXN1YmZwCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cGVybQorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnBrcHgKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwa3Nkc3MKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwa3NkdXMKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwa3Noc3MKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwa3NodXMKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwa3N3c3MKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwa3N3dXMKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwa3VkdXMKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwa3VodXMKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwa3V3dXMKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwcnR5YmQKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwcnR5YnEKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZwcnR5YncKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZyZWZwCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cmZpbQorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnJmaW4KKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZyZmlwCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cmZpegorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnJsYgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnJsZAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnJsZG1pCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cmxkbm0KKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZybGgKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZybHcKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZybHdtaQorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnJsd25tCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52cnNxcnRlZnAKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzZWwKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzbAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNsYgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNsaAorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNsbworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNsdgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNsdworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNyCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3JhYgorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnNyYWgKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzcmF3CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3JiCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3JoCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3JvCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3J2CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3J3CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3ViY3VxCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3ViY3V3CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3ViZWN1cQorICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnN1YmV1cW0KKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzdWJzYnMKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzdWJzaHMKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzdWJzd3MKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzdWJ1YnMKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzdWJ1aHMKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzdWJ1d3MKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzdW0yc3dzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3VtNHNicworICAgIDEsIC8vIGxsdm0ucHBjLmFsdGl2ZWMudnN1bTRzaHMKKyAgICAxLCAvLyBsbHZtLnBwYy5hbHRpdmVjLnZzdW00dWJzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52c3Vtc3dzCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52dXBraHB4CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52dXBraHNiCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52dXBraHNoCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52dXBraHN3CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52dXBrbHB4CisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52dXBrbHNiCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52dXBrbHNoCisgICAgMSwgLy8gbGx2bS5wcGMuYWx0aXZlYy52dXBrbHN3CisgICAgMSwgLy8gbGx2bS5wcGMuYnBlcm1kCisgICAgMywgLy8gbGx2bS5wcGMuY2ZlbmNlCisgICAgMywgLy8gbGx2bS5wcGMuZGNiYQorICAgIDMsIC8vIGxsdm0ucHBjLmRjYmYKKyAgICAzLCAvLyBsbHZtLnBwYy5kY2JpCisgICAgMywgLy8gbGx2bS5wcGMuZGNic3QKKyAgICAxOCwgLy8gbGx2bS5wcGMuZGNidAorICAgIDE4LCAvLyBsbHZtLnBwYy5kY2J0c3QKKyAgICAzLCAvLyBsbHZtLnBwYy5kY2J6CisgICAgMywgLy8gbGx2bS5wcGMuZGNiemwKKyAgICAxLCAvLyBsbHZtLnBwYy5kaXZkZQorICAgIDEsIC8vIGxsdm0ucHBjLmRpdmRldQorICAgIDEsIC8vIGxsdm0ucHBjLmRpdndlCisgICAgMSwgLy8gbGx2bS5wcGMuZGl2d2V1CisgICAgMywgLy8gbGx2bS5wcGMuZ2V0LnRleGFzcgorICAgIDMsIC8vIGxsdm0ucHBjLmdldC50ZXhhc3J1CisgICAgMywgLy8gbGx2bS5wcGMuZ2V0LnRmaGFyCisgICAgMywgLy8gbGx2bS5wcGMuZ2V0LnRmaWFyCisgICAgMywgLy8gbGx2bS5wcGMuaXMuZGVjcmVtZW50ZWQuY3RyLm5vbnplcm8KKyAgICAzLCAvLyBsbHZtLnBwYy5sd3N5bmMKKyAgICAzLCAvLyBsbHZtLnBwYy5tdGN0cgorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZhYnMKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmYWRkCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZmFkZHMKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmY2ZpZAorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZjZmlkcworICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZjZmlkdQorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZjZmlkdXMKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmY21wZXEKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmY21wZ3QKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmY21wbHQKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmY3BzZ24KKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmY3RpZAorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZjdGlkdQorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZjdGlkdXoKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmY3RpZHoKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmY3RpdworICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZjdGl3dQorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZjdGl3dXoKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmY3Rpd3oKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmbG9naWNhbAorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZtYWRkCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2Zm1hZGRzCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2Zm1zdWIKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmbXN1YnMKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmbXVsCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2Zm11bHMKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmbmFicworICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZuZWcKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmbm1hZGQKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmbm1hZGRzCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2Zm5tc3ViCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2Zm5tc3VicworICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZwZXJtCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZnJlCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZnJlcworICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZyaW0KKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmcmluCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZnJpcAorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZyaXoKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmcnNwCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZnJzcXJ0ZQorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZyc3FydGVzCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZnNlbAorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZzdWIKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmc3VicworICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmZ0c3RuYW4KKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmeG1hZGQKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmeG1hZGRzCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2ZnhtdWwKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmeG11bHMKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmeHhjcG5tYWRkCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2Znh4Y3BubWFkZHMKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmeHhtYWRkCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2Znh4bWFkZHMKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmeHhucG1hZGQKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZmeHhucG1hZGRzCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2Z3BjaQorICAgIDIsIC8vIGxsdm0ucHBjLnFweC5xdmxmY2QKKyAgICAyLCAvLyBsbHZtLnBwYy5xcHgucXZsZmNkYQorICAgIDIsIC8vIGxsdm0ucHBjLnFweC5xdmxmY3MKKyAgICAyLCAvLyBsbHZtLnBwYy5xcHgucXZsZmNzYQorICAgIDIsIC8vIGxsdm0ucHBjLnFweC5xdmxmZAorICAgIDIsIC8vIGxsdm0ucHBjLnFweC5xdmxmZGEKKyAgICAyLCAvLyBsbHZtLnBwYy5xcHgucXZsZml3YQorICAgIDIsIC8vIGxsdm0ucHBjLnFweC5xdmxmaXdhYQorICAgIDIsIC8vIGxsdm0ucHBjLnFweC5xdmxmaXd6CisgICAgMiwgLy8gbGx2bS5wcGMucXB4LnF2bGZpd3phCisgICAgMiwgLy8gbGx2bS5wcGMucXB4LnF2bGZzCisgICAgMiwgLy8gbGx2bS5wcGMucXB4LnF2bGZzYQorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmxwY2xkCisgICAgMSwgLy8gbGx2bS5wcGMucXB4LnF2bHBjbHMKKyAgICAxLCAvLyBsbHZtLnBwYy5xcHgucXZscGNyZAorICAgIDEsIC8vIGxsdm0ucHBjLnFweC5xdmxwY3JzCisgICAgNDAsIC8vIGxsdm0ucHBjLnFweC5xdnN0ZmNkCisgICAgNDAsIC8vIGxsdm0ucHBjLnFweC5xdnN0ZmNkYQorICAgIDQwLCAvLyBsbHZtLnBwYy5xcHgucXZzdGZjcworICAgIDQwLCAvLyBsbHZtLnBwYy5xcHgucXZzdGZjc2EKKyAgICA0MCwgLy8gbGx2bS5wcGMucXB4LnF2c3RmZAorICAgIDQwLCAvLyBsbHZtLnBwYy5xcHgucXZzdGZkYQorICAgIDQwLCAvLyBsbHZtLnBwYy5xcHgucXZzdGZpdworICAgIDQwLCAvLyBsbHZtLnBwYy5xcHgucXZzdGZpd2EKKyAgICA0MCwgLy8gbGx2bS5wcGMucXB4LnF2c3RmcworICAgIDQwLCAvLyBsbHZtLnBwYy5xcHgucXZzdGZzYQorICAgIDMsIC8vIGxsdm0ucHBjLnNldC50ZXhhc3IKKyAgICAzLCAvLyBsbHZtLnBwYy5zZXQudGV4YXNydQorICAgIDMsIC8vIGxsdm0ucHBjLnNldC50ZmhhcgorICAgIDMsIC8vIGxsdm0ucHBjLnNldC50ZmlhcgorICAgIDMsIC8vIGxsdm0ucHBjLnN5bmMKKyAgICAzLCAvLyBsbHZtLnBwYy50YWJvcnQKKyAgICAzLCAvLyBsbHZtLnBwYy50YWJvcnRkYworICAgIDMsIC8vIGxsdm0ucHBjLnRhYm9ydGRjaQorICAgIDMsIC8vIGxsdm0ucHBjLnRhYm9ydHdjCisgICAgMywgLy8gbGx2bS5wcGMudGFib3J0d2NpCisgICAgMywgLy8gbGx2bS5wcGMudGJlZ2luCisgICAgMywgLy8gbGx2bS5wcGMudGNoZWNrCisgICAgMywgLy8gbGx2bS5wcGMudGVuZAorICAgIDMsIC8vIGxsdm0ucHBjLnRlbmRhbGwKKyAgICAzLCAvLyBsbHZtLnBwYy50cmVjaGtwdAorICAgIDMsIC8vIGxsdm0ucHBjLnRyZWNsYWltCisgICAgMywgLy8gbGx2bS5wcGMudHJlc3VtZQorICAgIDMsIC8vIGxsdm0ucHBjLnRzcgorICAgIDMsIC8vIGxsdm0ucHBjLnRzdXNwZW5kCisgICAgMywgLy8gbGx2bS5wcGMudHRlc3QKKyAgICAyLCAvLyBsbHZtLnBwYy52c3gubHh2ZDJ4CisgICAgMiwgLy8gbGx2bS5wcGMudnN4Lmx4dmQyeC5iZQorICAgIDIsIC8vIGxsdm0ucHBjLnZzeC5seHZsCisgICAgMiwgLy8gbGx2bS5wcGMudnN4Lmx4dmxsCisgICAgMiwgLy8gbGx2bS5wcGMudnN4Lmx4dnc0eAorICAgIDIsIC8vIGxsdm0ucHBjLnZzeC5seHZ3NHguYmUKKyAgICA0MCwgLy8gbGx2bS5wcGMudnN4LnN0eHZkMngKKyAgICA0MCwgLy8gbGx2bS5wcGMudnN4LnN0eHZkMnguYmUKKyAgICA0MCwgLy8gbGx2bS5wcGMudnN4LnN0eHZsCisgICAgNDAsIC8vIGxsdm0ucHBjLnZzeC5zdHh2bGwKKyAgICA0MCwgLy8gbGx2bS5wcGMudnN4LnN0eHZ3NHgKKyAgICA0MCwgLy8gbGx2bS5wcGMudnN4LnN0eHZ3NHguYmUKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHNtYXhkcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54c21pbmRwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2Y21wZXFkcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dmNtcGVxZHAucAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dmNtcGVxc3AKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZjbXBlcXNwLnAKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZjbXBnZWRwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2Y21wZ2VkcC5wCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2Y21wZ2VzcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dmNtcGdlc3AucAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dmNtcGd0ZHAKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZjbXBndGRwLnAKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZjbXBndHNwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2Y21wZ3RzcC5wCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2Y3ZkcHNwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2Y3ZkcHN4d3MKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZjdmRwdXh3cworICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dmN2aHBzcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dmN2c3BkcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dmN2c3BocAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dmN2c3hkc3AKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZjdnN4d2RwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2Y3Z1eGRzcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dmN2dXh3ZHAKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZkaXZkcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dmRpdnNwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2aWV4cGRwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2aWV4cHNwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2bWF4ZHAKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZtYXhzcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dm1pbmRwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2bWluc3AKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZyZHBpcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dnJlZHAKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZyZXNwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2cnNwaXAKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZyc3FydGVkcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dnJzcXJ0ZXNwCisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh2dHN0ZGNkcAorICAgIDEsIC8vIGxsdm0ucHBjLnZzeC54dnRzdGRjc3AKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZ4ZXhwZHAKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZ4ZXhwc3AKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZ4c2lnZHAKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHZ4c2lnc3AKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHhleHRyYWN0dXcKKyAgICAxLCAvLyBsbHZtLnBwYy52c3gueHhpbnNlcnR3CisgICAgMSwgLy8gbGx2bS5wcGMudnN4Lnh4bGVxdgorICAgIDQsIC8vIGxsdm0ucjYwMC5jdWJlCisgICAgMzMsIC8vIGxsdm0ucjYwMC5ncm91cC5iYXJyaWVyCisgICAgNCwgLy8gbGx2bS5yNjAwLmltcGxpY2l0YXJnLnB0cgorICAgIDMsIC8vIGxsdm0ucjYwMC5yYXQuc3RvcmUudHlwZWQKKyAgICA0LCAvLyBsbHZtLnI2MDAucmVhZC5nbG9iYWwuc2l6ZS54CisgICAgNCwgLy8gbGx2bS5yNjAwLnJlYWQuZ2xvYmFsLnNpemUueQorICAgIDQsIC8vIGxsdm0ucjYwMC5yZWFkLmdsb2JhbC5zaXplLnoKKyAgICA0LCAvLyBsbHZtLnI2MDAucmVhZC5sb2NhbC5zaXplLngKKyAgICA0LCAvLyBsbHZtLnI2MDAucmVhZC5sb2NhbC5zaXplLnkKKyAgICA0LCAvLyBsbHZtLnI2MDAucmVhZC5sb2NhbC5zaXplLnoKKyAgICA0LCAvLyBsbHZtLnI2MDAucmVhZC5uZ3JvdXBzLngKKyAgICA0LCAvLyBsbHZtLnI2MDAucmVhZC5uZ3JvdXBzLnkKKyAgICA0LCAvLyBsbHZtLnI2MDAucmVhZC5uZ3JvdXBzLnoKKyAgICA0LCAvLyBsbHZtLnI2MDAucmVhZC50Z2lkLngKKyAgICA0LCAvLyBsbHZtLnI2MDAucmVhZC50Z2lkLnkKKyAgICA0LCAvLyBsbHZtLnI2MDAucmVhZC50Z2lkLnoKKyAgICA0LCAvLyBsbHZtLnI2MDAucmVhZC50aWRpZy54CisgICAgNCwgLy8gbGx2bS5yNjAwLnJlYWQudGlkaWcueQorICAgIDQsIC8vIGxsdm0ucjYwMC5yZWFkLnRpZGlnLnoKKyAgICA0LCAvLyBsbHZtLnI2MDAucmVjaXBzcXJ0LmNsYW1wZWQKKyAgICA0LCAvLyBsbHZtLnI2MDAucmVjaXBzcXJ0LmllZWUKKyAgICAzLCAvLyBsbHZtLnMzOTAuZWZwYworICAgIDEsIC8vIGxsdm0uczM5MC5ldG5kCisgICAgMSwgLy8gbGx2bS5zMzkwLmxjYmIKKyAgICA0MCwgLy8gbGx2bS5zMzkwLm50c3RnCisgICAgMywgLy8gbGx2bS5zMzkwLnBwYS50eGFzc2lzdAorICAgIDMsIC8vIGxsdm0uczM5MC5zZnBjCisgICAgNDEsIC8vIGxsdm0uczM5MC50YWJvcnQKKyAgICA0MiwgLy8gbGx2bS5zMzkwLnRiZWdpbgorICAgIDQyLCAvLyBsbHZtLnMzOTAudGJlZ2luLm5vZmxvYXQKKyAgICA0MiwgLy8gbGx2bS5zMzkwLnRiZWdpbmMKKyAgICAxLCAvLyBsbHZtLnMzOTAudGRjCisgICAgMywgLy8gbGx2bS5zMzkwLnRlbmQKKyAgICAxLCAvLyBsbHZtLnMzOTAudmFjY2IKKyAgICAxLCAvLyBsbHZtLnMzOTAudmFjY2NxCisgICAgMSwgLy8gbGx2bS5zMzkwLnZhY2NmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZhY2NnCisgICAgMSwgLy8gbGx2bS5zMzkwLnZhY2NoCisgICAgMSwgLy8gbGx2bS5zMzkwLnZhY2NxCisgICAgMSwgLy8gbGx2bS5zMzkwLnZhY3EKKyAgICAxLCAvLyBsbHZtLnMzOTAudmFxCisgICAgMSwgLy8gbGx2bS5zMzkwLnZhdmdiCisgICAgMSwgLy8gbGx2bS5zMzkwLnZhdmdmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZhdmdnCisgICAgMSwgLy8gbGx2bS5zMzkwLnZhdmdoCisgICAgMSwgLy8gbGx2bS5zMzkwLnZhdmdsYgorICAgIDEsIC8vIGxsdm0uczM5MC52YXZnbGYKKyAgICAxLCAvLyBsbHZtLnMzOTAudmF2Z2xnCisgICAgMSwgLy8gbGx2bS5zMzkwLnZhdmdsaAorICAgIDEsIC8vIGxsdm0uczM5MC52YnBlcm0KKyAgICAxLCAvLyBsbHZtLnMzOTAudmNlcWJzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZjZXFmcworICAgIDEsIC8vIGxsdm0uczM5MC52Y2VxZ3MKKyAgICAxLCAvLyBsbHZtLnMzOTAudmNlcWhzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZjaGJzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZjaGZzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZjaGdzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZjaGhzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZjaGxicworICAgIDEsIC8vIGxsdm0uczM5MC52Y2hsZnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmNobGdzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZjaGxocworICAgIDEsIC8vIGxsdm0uczM5MC52Y2tzbQorICAgIDEsIC8vIGxsdm0uczM5MC52ZXJpbWIKKyAgICAxLCAvLyBsbHZtLnMzOTAudmVyaW1mCisgICAgMSwgLy8gbGx2bS5zMzkwLnZlcmltZworICAgIDEsIC8vIGxsdm0uczM5MC52ZXJpbWgKKyAgICAxLCAvLyBsbHZtLnMzOTAudmVybGxiCisgICAgMSwgLy8gbGx2bS5zMzkwLnZlcmxsZgorICAgIDEsIC8vIGxsdm0uczM5MC52ZXJsbGcKKyAgICAxLCAvLyBsbHZtLnMzOTAudmVybGxoCisgICAgMSwgLy8gbGx2bS5zMzkwLnZlcmxsdmIKKyAgICAxLCAvLyBsbHZtLnMzOTAudmVybGx2ZgorICAgIDEsIC8vIGxsdm0uczM5MC52ZXJsbHZnCisgICAgMSwgLy8gbGx2bS5zMzkwLnZlcmxsdmgKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZhZWIKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZhZWJzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmYWVmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmYWVmcworICAgIDEsIC8vIGxsdm0uczM5MC52ZmFlaAorICAgIDEsIC8vIGxsdm0uczM5MC52ZmFlaHMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZhZXpiCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmYWV6YnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZhZXpmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmYWV6ZnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZhZXpoCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmYWV6aHMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZjZWRicworICAgIDEsIC8vIGxsdm0uczM5MC52ZmNlc2JzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmY2hkYnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZjaGVkYnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZjaGVzYnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZjaHNicworICAgIDEsIC8vIGxsdm0uczM5MC52ZmVlYgorICAgIDEsIC8vIGxsdm0uczM5MC52ZmVlYnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZlZWYKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZlZWZzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmZWVoCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmZWVocworICAgIDEsIC8vIGxsdm0uczM5MC52ZmVlemIKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZlZXpicworICAgIDEsIC8vIGxsdm0uczM5MC52ZmVlemYKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZlZXpmcworICAgIDEsIC8vIGxsdm0uczM5MC52ZmVlemgKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZlZXpocworICAgIDEsIC8vIGxsdm0uczM5MC52ZmVuZWIKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZlbmVicworICAgIDEsIC8vIGxsdm0uczM5MC52ZmVuZWYKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZlbmVmcworICAgIDEsIC8vIGxsdm0uczM5MC52ZmVuZWgKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZlbmVocworICAgIDEsIC8vIGxsdm0uczM5MC52ZmVuZXpiCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmZW5lemJzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmZW5lemYKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZlbmV6ZnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZlbmV6aAorICAgIDEsIC8vIGxsdm0uczM5MC52ZmVuZXpocworICAgIDEsIC8vIGxsdm0uczM5MC52ZmlkYgorICAgIDEsIC8vIGxsdm0uczM5MC52ZmlzYgorICAgIDEsIC8vIGxsdm0uczM5MC52Zm1heGRiCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmbWF4c2IKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZtaW5kYgorICAgIDEsIC8vIGxsdm0uczM5MC52Zm1pbnNiCisgICAgMSwgLy8gbGx2bS5zMzkwLnZmdGNpZGIKKyAgICAxLCAvLyBsbHZtLnMzOTAudmZ0Y2lzYgorICAgIDEsIC8vIGxsdm0uczM5MC52Z2ZtYWIKKyAgICAxLCAvLyBsbHZtLnMzOTAudmdmbWFmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZnZm1hZworICAgIDEsIC8vIGxsdm0uczM5MC52Z2ZtYWgKKyAgICAxLCAvLyBsbHZtLnMzOTAudmdmbWIKKyAgICAxLCAvLyBsbHZtLnMzOTAudmdmbWYKKyAgICAxLCAvLyBsbHZtLnMzOTAudmdmbWcKKyAgICAxLCAvLyBsbHZtLnMzOTAudmdmbWgKKyAgICAxLCAvLyBsbHZtLnMzOTAudmlzdHJiCisgICAgMSwgLy8gbGx2bS5zMzkwLnZpc3RyYnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmlzdHJmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZpc3RyZnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudmlzdHJoCisgICAgMSwgLy8gbGx2bS5zMzkwLnZpc3RyaHMKKyAgICAyLCAvLyBsbHZtLnMzOTAudmxiYgorICAgIDIsIC8vIGxsdm0uczM5MC52bGwKKyAgICAyLCAvLyBsbHZtLnMzOTAudmxybAorICAgIDEsIC8vIGxsdm0uczM5MC52bWFlYgorICAgIDEsIC8vIGxsdm0uczM5MC52bWFlZgorICAgIDEsIC8vIGxsdm0uczM5MC52bWFlaAorICAgIDEsIC8vIGxsdm0uczM5MC52bWFoYgorICAgIDEsIC8vIGxsdm0uczM5MC52bWFoZgorICAgIDEsIC8vIGxsdm0uczM5MC52bWFoaAorICAgIDEsIC8vIGxsdm0uczM5MC52bWFsZWIKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1hbGVmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZtYWxlaAorICAgIDEsIC8vIGxsdm0uczM5MC52bWFsaGIKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1hbGhmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZtYWxoaAorICAgIDEsIC8vIGxsdm0uczM5MC52bWFsb2IKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1hbG9mCisgICAgMSwgLy8gbGx2bS5zMzkwLnZtYWxvaAorICAgIDEsIC8vIGxsdm0uczM5MC52bWFvYgorICAgIDEsIC8vIGxsdm0uczM5MC52bWFvZgorICAgIDEsIC8vIGxsdm0uczM5MC52bWFvaAorICAgIDEsIC8vIGxsdm0uczM5MC52bWViCisgICAgMSwgLy8gbGx2bS5zMzkwLnZtZWYKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1laAorICAgIDEsIC8vIGxsdm0uczM5MC52bWhiCisgICAgMSwgLy8gbGx2bS5zMzkwLnZtaGYKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1oaAorICAgIDEsIC8vIGxsdm0uczM5MC52bWxlYgorICAgIDEsIC8vIGxsdm0uczM5MC52bWxlZgorICAgIDEsIC8vIGxsdm0uczM5MC52bWxlaAorICAgIDEsIC8vIGxsdm0uczM5MC52bWxoYgorICAgIDEsIC8vIGxsdm0uczM5MC52bWxoZgorICAgIDEsIC8vIGxsdm0uczM5MC52bWxoaAorICAgIDEsIC8vIGxsdm0uczM5MC52bWxvYgorICAgIDEsIC8vIGxsdm0uczM5MC52bWxvZgorICAgIDEsIC8vIGxsdm0uczM5MC52bWxvaAorICAgIDEsIC8vIGxsdm0uczM5MC52bW9iCisgICAgMSwgLy8gbGx2bS5zMzkwLnZtb2YKKyAgICAxLCAvLyBsbHZtLnMzOTAudm1vaAorICAgIDEsIC8vIGxsdm0uczM5MC52bXNsZworICAgIDEsIC8vIGxsdm0uczM5MC52cGRpCisgICAgMSwgLy8gbGx2bS5zMzkwLnZwZXJtCisgICAgMSwgLy8gbGx2bS5zMzkwLnZwa2xzZgorICAgIDEsIC8vIGxsdm0uczM5MC52cGtsc2ZzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZwa2xzZworICAgIDEsIC8vIGxsdm0uczM5MC52cGtsc2dzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZwa2xzaAorICAgIDEsIC8vIGxsdm0uczM5MC52cGtsc2hzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZwa3NmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZwa3NmcworICAgIDEsIC8vIGxsdm0uczM5MC52cGtzZworICAgIDEsIC8vIGxsdm0uczM5MC52cGtzZ3MKKyAgICAxLCAvLyBsbHZtLnMzOTAudnBrc2gKKyAgICAxLCAvLyBsbHZtLnMzOTAudnBrc2hzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZzYmNiaXEKKyAgICAxLCAvLyBsbHZtLnMzOTAudnNiaXEKKyAgICAxLCAvLyBsbHZtLnMzOTAudnNjYmliCisgICAgMSwgLy8gbGx2bS5zMzkwLnZzY2JpZgorICAgIDEsIC8vIGxsdm0uczM5MC52c2NiaWcKKyAgICAxLCAvLyBsbHZtLnMzOTAudnNjYmloCisgICAgMSwgLy8gbGx2bS5zMzkwLnZzY2JpcQorICAgIDEsIC8vIGxsdm0uczM5MC52c2wKKyAgICAxLCAvLyBsbHZtLnMzOTAudnNsYgorICAgIDEsIC8vIGxsdm0uczM5MC52c2xkYgorICAgIDEsIC8vIGxsdm0uczM5MC52c3EKKyAgICAxLCAvLyBsbHZtLnMzOTAudnNyYQorICAgIDEsIC8vIGxsdm0uczM5MC52c3JhYgorICAgIDEsIC8vIGxsdm0uczM5MC52c3JsCisgICAgMSwgLy8gbGx2bS5zMzkwLnZzcmxiCisgICAgNDAsIC8vIGxsdm0uczM5MC52c3RsCisgICAgMSwgLy8gbGx2bS5zMzkwLnZzdHJjYgorICAgIDEsIC8vIGxsdm0uczM5MC52c3RyY2JzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZzdHJjZgorICAgIDEsIC8vIGxsdm0uczM5MC52c3RyY2ZzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZzdHJjaAorICAgIDEsIC8vIGxsdm0uczM5MC52c3RyY2hzCisgICAgMSwgLy8gbGx2bS5zMzkwLnZzdHJjemIKKyAgICAxLCAvLyBsbHZtLnMzOTAudnN0cmN6YnMKKyAgICAxLCAvLyBsbHZtLnMzOTAudnN0cmN6ZgorICAgIDEsIC8vIGxsdm0uczM5MC52c3RyY3pmcworICAgIDEsIC8vIGxsdm0uczM5MC52c3RyY3poCisgICAgMSwgLy8gbGx2bS5zMzkwLnZzdHJjemhzCisgICAgNDAsIC8vIGxsdm0uczM5MC52c3RybAorICAgIDEsIC8vIGxsdm0uczM5MC52c3VtYgorICAgIDEsIC8vIGxsdm0uczM5MC52c3VtZ2YKKyAgICAxLCAvLyBsbHZtLnMzOTAudnN1bWdoCisgICAgMSwgLy8gbGx2bS5zMzkwLnZzdW1oCisgICAgMSwgLy8gbGx2bS5zMzkwLnZzdW1xZgorICAgIDEsIC8vIGxsdm0uczM5MC52c3VtcWcKKyAgICAxLCAvLyBsbHZtLnMzOTAudnRtCisgICAgMSwgLy8gbGx2bS5zMzkwLnZ1cGhiCisgICAgMSwgLy8gbGx2bS5zMzkwLnZ1cGhmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZ1cGhoCisgICAgMSwgLy8gbGx2bS5zMzkwLnZ1cGxiCisgICAgMSwgLy8gbGx2bS5zMzkwLnZ1cGxmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZ1cGxoYgorICAgIDEsIC8vIGxsdm0uczM5MC52dXBsaGYKKyAgICAxLCAvLyBsbHZtLnMzOTAudnVwbGhoCisgICAgMSwgLy8gbGx2bS5zMzkwLnZ1cGxodworICAgIDEsIC8vIGxsdm0uczM5MC52dXBsbGIKKyAgICAxLCAvLyBsbHZtLnMzOTAudnVwbGxmCisgICAgMSwgLy8gbGx2bS5zMzkwLnZ1cGxsaAorICAgIDE2LCAvLyBsbHZtLndhc20uY3VycmVudC5tZW1vcnkKKyAgICA0MywgLy8gbGx2bS53YXNtLmdldC5laHNlbGVjdG9yCisgICAgNDMsIC8vIGxsdm0ud2FzbS5nZXQuZXhjZXB0aW9uCisgICAgMywgLy8gbGx2bS53YXNtLmdyb3cubWVtb3J5CisgICAgMywgLy8gbGx2bS53YXNtLm1lbS5ncm93CisgICAgMTYsIC8vIGxsdm0ud2FzbS5tZW0uc2l6ZQorICAgIDQ0LCAvLyBsbHZtLndhc20ucmV0aHJvdworICAgIDQ0LCAvLyBsbHZtLndhc20udGhyb3cKKyAgICAxLCAvLyBsbHZtLng4Ni4zZG5vdy5wYXZndXNiCisgICAgMSwgLy8gbGx2bS54ODYuM2Rub3cucGYyaWQKKyAgICAxLCAvLyBsbHZtLng4Ni4zZG5vdy5wZmFjYworICAgIDEsIC8vIGxsdm0ueDg2LjNkbm93LnBmYWRkCisgICAgMSwgLy8gbGx2bS54ODYuM2Rub3cucGZjbXBlcQorICAgIDEsIC8vIGxsdm0ueDg2LjNkbm93LnBmY21wZ2UKKyAgICAxLCAvLyBsbHZtLng4Ni4zZG5vdy5wZmNtcGd0CisgICAgMSwgLy8gbGx2bS54ODYuM2Rub3cucGZtYXgKKyAgICAxLCAvLyBsbHZtLng4Ni4zZG5vdy5wZm1pbgorICAgIDEsIC8vIGxsdm0ueDg2LjNkbm93LnBmbXVsCisgICAgMSwgLy8gbGx2bS54ODYuM2Rub3cucGZyY3AKKyAgICAxLCAvLyBsbHZtLng4Ni4zZG5vdy5wZnJjcGl0MQorICAgIDEsIC8vIGxsdm0ueDg2LjNkbm93LnBmcmNwaXQyCisgICAgMSwgLy8gbGx2bS54ODYuM2Rub3cucGZyc3FpdDEKKyAgICAxLCAvLyBsbHZtLng4Ni4zZG5vdy5wZnJzcXJ0CisgICAgMSwgLy8gbGx2bS54ODYuM2Rub3cucGZzdWIKKyAgICAxLCAvLyBsbHZtLng4Ni4zZG5vdy5wZnN1YnIKKyAgICAxLCAvLyBsbHZtLng4Ni4zZG5vdy5waTJmZAorICAgIDEsIC8vIGxsdm0ueDg2LjNkbm93LnBtdWxocncKKyAgICAxLCAvLyBsbHZtLng4Ni4zZG5vd2EucGYyaXcKKyAgICAxLCAvLyBsbHZtLng4Ni4zZG5vd2EucGZuYWNjCisgICAgMSwgLy8gbGx2bS54ODYuM2Rub3dhLnBmcG5hY2MKKyAgICAxLCAvLyBsbHZtLng4Ni4zZG5vd2EucGkyZncKKyAgICAxLCAvLyBsbHZtLng4Ni4zZG5vd2EucHN3YXBkCisgICAgMjEsIC8vIGxsdm0ueDg2LmFkZGNhcnJ5LnUzMgorICAgIDIxLCAvLyBsbHZtLng4Ni5hZGRjYXJyeS51NjQKKyAgICAyMSwgLy8gbGx2bS54ODYuYWRkY2Fycnl4LnUzMgorICAgIDIxLCAvLyBsbHZtLng4Ni5hZGRjYXJyeXgudTY0CisgICAgMSwgLy8gbGx2bS54ODYuYWVzbmkuYWVzZGVjCisgICAgMSwgLy8gbGx2bS54ODYuYWVzbmkuYWVzZGVjLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmFlc25pLmFlc2RlYy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hZXNuaS5hZXNkZWNsYXN0CisgICAgMSwgLy8gbGx2bS54ODYuYWVzbmkuYWVzZGVjbGFzdC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hZXNuaS5hZXNkZWNsYXN0LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmFlc25pLmFlc2VuYworICAgIDEsIC8vIGxsdm0ueDg2LmFlc25pLmFlc2VuYy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hZXNuaS5hZXNlbmMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYWVzbmkuYWVzZW5jbGFzdAorICAgIDEsIC8vIGxsdm0ueDg2LmFlc25pLmFlc2VuY2xhc3QuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYWVzbmkuYWVzZW5jbGFzdC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hZXNuaS5hZXNpbWMKKyAgICAxLCAvLyBsbHZtLng4Ni5hZXNuaS5hZXNrZXlnZW5hc3Npc3QKKyAgICAxLCAvLyBsbHZtLng4Ni5hdnguYWRkc3ViLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC5hZGRzdWIucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LmJsZW5kdi5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdnguYmxlbmR2LnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC5jbXAucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LmNtcC5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdnguY3Z0LnBkMi5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdnguY3Z0LnBkMmRxLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC5jdnQucHMyZHEuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LmN2dGRxMi5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdnguY3Z0dC5wZDJkcS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdnguY3Z0dC5wczJkcS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdnguZHAucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LmhhZGQucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LmhhZGQucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LmhzdWIucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LmhzdWIucHMuMjU2CisgICAgMTYsIC8vIGxsdm0ueDg2LmF2eC5sZHUuZHEuMjU2CisgICAgMiwgLy8gbGx2bS54ODYuYXZ4Lm1hc2tsb2FkLnBkCisgICAgMiwgLy8gbGx2bS54ODYuYXZ4Lm1hc2tsb2FkLnBkLjI1NgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eC5tYXNrbG9hZC5wcworICAgIDIsIC8vIGxsdm0ueDg2LmF2eC5tYXNrbG9hZC5wcy4yNTYKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4Lm1hc2tzdG9yZS5wZAorICAgIDIxLCAvLyBsbHZtLng4Ni5hdngubWFza3N0b3JlLnBkLjI1NgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdngubWFza3N0b3JlLnBzCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eC5tYXNrc3RvcmUucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Lm1heC5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngubWF4LnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC5taW4ucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Lm1pbi5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngubW92bXNrLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC5tb3Ztc2sucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LnB0ZXN0Yy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngucHRlc3RuemMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LnB0ZXN0ei4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngucmNwLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC5yb3VuZC5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngucm91bmQucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LnJzcXJ0LnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC5zcXJ0LnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC5zcXJ0LnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC52cGVybWlsdmFyLnBkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LnZwZXJtaWx2YXIucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LnZwZXJtaWx2YXIucHMKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngudnBlcm1pbHZhci5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngudnRlc3RjLnBkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LnZ0ZXN0Yy5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngudnRlc3RjLnBzCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LnZ0ZXN0Yy5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngudnRlc3RuemMucGQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngudnRlc3RuemMucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LnZ0ZXN0bnpjLnBzCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4LnZ0ZXN0bnpjLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC52dGVzdHoucGQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngudnRlc3R6LnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eC52dGVzdHoucHMKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngudnRlc3R6LnBzLjI1NgorICAgIDMsIC8vIGxsdm0ueDg2LmF2eC52emVyb2FsbAorICAgIDMsIC8vIGxsdm0ueDg2LmF2eC52emVyb3VwcGVyCisgICAgMiwgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIuZC5kCisgICAgMiwgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIuZC5kLjI1NgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLmQucGQKKyAgICAyLCAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5kLnBkLjI1NgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLmQucHMKKyAgICAyLCAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5kLnBzLjI1NgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLmQucQorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLmQucS4yNTYKKyAgICAyLCAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5xLmQKKyAgICAyLCAvLyBsbHZtLng4Ni5hdngyLmdhdGhlci5xLmQuMjU2CisgICAgMiwgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIucS5wZAorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLnEucGQuMjU2CisgICAgMiwgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIucS5wcworICAgIDIsIC8vIGxsdm0ueDg2LmF2eDIuZ2F0aGVyLnEucHMuMjU2CisgICAgMiwgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIucS5xCisgICAgMiwgLy8gbGx2bS54ODYuYXZ4Mi5nYXRoZXIucS5xLjI1NgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDIubWFza2xvYWQuZAorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDIubWFza2xvYWQuZC4yNTYKKyAgICAyLCAvLyBsbHZtLng4Ni5hdngyLm1hc2tsb2FkLnEKKyAgICAyLCAvLyBsbHZtLng4Ni5hdngyLm1hc2tsb2FkLnEuMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDIubWFza3N0b3JlLmQKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4Mi5tYXNrc3RvcmUuZC4yNTYKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4Mi5tYXNrc3RvcmUucQorICAgIDIxLCAvLyBsbHZtLng4Ni5hdngyLm1hc2tzdG9yZS5xLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIubXBzYWRidworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucGFja3NzZHcKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBhY2tzc3diCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wYWNrdXNkdworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucGFja3Vzd2IKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBhZGRzLmIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBhZGRzLncKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBhZGR1cy5iCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wYWRkdXMudworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucGJsZW5kdmIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBlcm1kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wZXJtcHMKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBoYWRkLmQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBoYWRkLnN3CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5waGFkZC53CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5waHN1Yi5kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5waHN1Yi5zdworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucGhzdWIudworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucG1hZGQudWIuc3cKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBtYWRkLndkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wbW92bXNrYgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucG11bC5kcQorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucG11bC5oci5zdworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucG11bGgudworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucG11bGh1LncKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBtdWx1LmRxCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc2FkLmJ3CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc2h1Zi5iCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc2lnbi5iCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc2lnbi5kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc2lnbi53CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc2xsLmQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBzbGwucQorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNsbC53CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc2xsaS5kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc2xsaS5xCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc2xsaS53CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc2xsdi5kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc2xsdi5kLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNsbHYucQorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNsbHYucS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBzcmEuZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNyYS53CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc3JhaS5kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc3JhaS53CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc3Jhdi5kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc3Jhdi5kLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNybC5kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc3JsLnEKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBzcmwudworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNybGkuZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNybGkucQorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNybGkudworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNybHYuZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHNybHYuZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBzcmx2LnEKKyAgICAxLCAvLyBsbHZtLng4Ni5hdngyLnBzcmx2LnEuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc3Vicy5iCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc3Vicy53CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4Mi5wc3VidXMuYgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDIucHN1YnVzLncKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIuYnJvYWRjYXN0bWIuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmJyb2FkY2FzdG1iLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5icm9hZGNhc3RtYi41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIuYnJvYWRjYXN0bXcuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmJyb2FkY2FzdG13LjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5icm9hZGNhc3Rtdy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0c2kyc2Q2NAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5jdnRzaTJzczMyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHNpMnNzNjQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0dHNkMnNpCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHRzZDJzaTY0CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHRzZDJ1c2kKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0dHNkMnVzaTY0CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHRzczJzaQorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5jdnR0c3Myc2k2NAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5jdnR0c3MydXNpCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHRzczJ1c2k2NAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5jdnR1c2kyc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIuY3Z0dXNpMnNzCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHVzaTY0MnNkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmN2dHVzaTY0MnNzCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLmV4cDIucGQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIuZXhwMi5wcworICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIuZHBkLjUxMgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIuZHBpLjUxMgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIuZHBxLjUxMgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIuZHBzLjUxMgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIucXBkLjUxMgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIucXBpLjUxMgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIucXBxLjUxMgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIucXBzLjUxMgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzZGl2Mi5kZgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzZGl2Mi5kaQorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzZGl2NC5kZgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzZGl2NC5kaQorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzZGl2NC5zZgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzZGl2NC5zaQorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzZGl2OC5zZgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzZGl2OC5zaQorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzc2l2Mi5kZgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzc2l2Mi5kaQorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzc2l2NC5kZgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzc2l2NC5kaQorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzc2l2NC5zZgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzc2l2NC5zaQorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzc2l2OC5zZgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5nYXRoZXIzc2l2OC5zaQorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVycGYuZHBkLjUxMgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVycGYuZHBzLjUxMgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVycGYucXBkLjUxMgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuZ2F0aGVycGYucXBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmFkZC5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5hZGQucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suYWRkLnNkLnJvdW5kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suYWRkLnNzLnJvdW5kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY21wLnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNtcC5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jbXAucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY21wLnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNtcC5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jbXAucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY21wLnNkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY21wLnNzCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MuYi4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5iLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLmIuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MuZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5kLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3MucS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5xLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnEuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLmIuMTI4CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLmIuMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLmIuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLmQuMTI4CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLmQuMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLmQuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLnBkLjEyOAorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5wZC4yNTYKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUucGQuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLnBzLjEyOAorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy5zdG9yZS5wcy4yNTYKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Muc3RvcmUucHMuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLnEuMTI4CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLnEuMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLnEuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLncuMTI4CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLncuMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLnN0b3JlLncuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29tcHJlc3Mudy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb21wcmVzcy53LjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbXByZXNzLncuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29uZmxpY3QuZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb25mbGljdC5kLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbmZsaWN0LmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY29uZmxpY3QucS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jb25mbGljdC5xLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmNvbmZsaWN0LnEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0ZHEycHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0ZHEycHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0ZHEycHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQyZHEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQyZHEuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQyZHEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQycHMKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJwcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJwcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJxcS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJxcS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJxcS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJ1ZHEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQydWRxLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMnVkcS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwZDJ1cXEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cGQydXFxLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBkMnVxcS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJkcS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJkcS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJkcS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJwZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJwZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJwZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJxcS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJxcS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJxcS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJ1ZHEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMydWRxLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMnVkcS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRwczJ1cXEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0cHMydXFxLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHBzMnVxcS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRxcTJwZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRxcTJwZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRxcTJwZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRxcTJwcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRxcTJwcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRxcTJwcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnRzZDJzcy5yb3VuZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHNzMnNkLnJvdW5kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBkMmRxLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJkcS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQyZHEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBkMnFxLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJxcS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQycXEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBkMnVkcS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQydWRxLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJ1ZHEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBkMnVxcS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cGQydXFxLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwZDJ1cXEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBzMmRxLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJkcS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMyZHEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBzMnFxLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJxcS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMycXEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBzMnVkcS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMydWRxLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJ1ZHEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dHBzMnVxcS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR0cHMydXFxLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHRwczJ1cXEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dWRxMnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHVkcTJwcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR1ZHEycHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dXFxMnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHVxcTJwZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR1cXEycGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suY3Z0dXFxMnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmN2dHVxcTJwcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5jdnR1cXEycHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZGJwc2FkYncuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZGJwc2FkYncuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZGJwc2FkYncuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZGl2LnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmRpdi5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5kaXYuc2Qucm91bmQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5kaXYuc3Mucm91bmQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQuYi4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQuYi4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQuYi41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQuZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQuZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQuZC41MTIKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5iLjEyOAorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLmIuMjU2CisgICAgMiwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQuYi41MTIKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5kLjEyOAorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLmQuMjU2CisgICAgMiwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQuZC41MTIKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5wZC4xMjgKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5wZC4yNTYKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5wZC41MTIKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5wcy4xMjgKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5wcy4yNTYKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5wcy41MTIKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC5xLjEyOAorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLnEuMjU2CisgICAgMiwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQucS41MTIKKyAgICAyLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQubG9hZC53LjEyOAorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5sb2FkLncuMjU2CisgICAgMiwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLmxvYWQudy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQucGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQucHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZXhwYW5kLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmV4cGFuZC5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQucS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQucS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQucS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQudy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQudy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5leHBhbmQudy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5maXh1cGltbS5wZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5maXh1cGltbS5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5maXh1cGltbS5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5maXh1cGltbS5wcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5maXh1cGltbS5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5maXh1cGltbS5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5maXh1cGltbS5zZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZpeHVwaW1tLnNzCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZnBjbGFzcy5wZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5mcGNsYXNzLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3MucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZnBjbGFzcy5wcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5mcGNsYXNzLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3MucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZnBjbGFzcy5zZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmZwY2xhc3Muc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRleHAucGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0ZXhwLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldGV4cC5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRleHAucHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0ZXhwLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldGV4cC5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRleHAuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRleHAuc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRtYW50LnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0bWFudC5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRtYW50LnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLmdldG1hbnQucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0bWFudC5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5nZXRtYW50LnNkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suZ2V0bWFudC5zcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLm1heC5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5tYXgucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2subWF4LnNkLnJvdW5kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2subWF4LnNzLnJvdW5kCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2subWluLnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLm1pbi5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5taW4uc2Qucm91bmQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5taW4uc3Mucm91bmQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5tdWwucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2subXVsLnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLm11bC5zZC5yb3VuZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLm11bC5zcy5yb3VuZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBhZGRzLmIuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHMuYi4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkcy5iLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBhZGRzLncuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGFkZHMudy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wYWRkcy53LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBhZGR1cy5iLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBhZGR1cy5iLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBhZGR1cy5iLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBhZGR1cy53LjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBhZGR1cy53LjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBhZGR1cy53LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBlcm12YXIuZGYuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5kZi41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLmRpLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBlcm12YXIuZGkuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5oaS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLmhpLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBlcm12YXIuaGkuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5xaS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLnFpLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBlcm12YXIucWkuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5zZi4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wZXJtdmFyLnNmLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBlcm12YXIuc2kuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucGVybXZhci5zaS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbWFkZHVicy53LjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtYWRkdWJzLncuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1hZGR1YnMudy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbWFkZHcuZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbWFkZHcuZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbWFkZHcuZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmRiLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YuZGIuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kYi41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kYi5tZW0uMTI4CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YuZGIubWVtLjI1NgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmRiLm1lbS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmR3LjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YuZHcuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kdy41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5kdy5tZW0uMTI4CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YuZHcubWVtLjI1NgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LmR3Lm1lbS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFiLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucWIuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xYi41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xYi5tZW0uMTI4CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucWIubWVtLjI1NgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFiLm1lbS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucWQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xZC41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xZC5tZW0uMTI4CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucWQubWVtLjI1NgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnFkLm1lbS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnF3LjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucXcuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xdy41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi5xdy5tZW0uMTI4CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3YucXcubWVtLjI1NgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LnF3Lm1lbS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LndiLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Yud2IuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi53Yi41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdi53Yi5tZW0uMTI4CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Yud2IubWVtLjI1NgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92LndiLm1lbS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kYi4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kYi4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kYi41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZGIubWVtLjEyOAorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kYi5tZW0uMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLmRiLm1lbS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kdy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kdy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kdy41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMuZHcubWVtLjEyOAorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5kdy5tZW0uMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLmR3Lm1lbS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xYi4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xYi4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xYi41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWIubWVtLjEyOAorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xYi5tZW0uMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnFiLm1lbS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xZC41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucWQubWVtLjEyOAorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xZC5tZW0uMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnFkLm1lbS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xdy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xdy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xdy41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMucXcubWVtLjEyOAorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy5xdy5tZW0uMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLnF3Lm1lbS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy53Yi4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy53Yi4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy53Yi41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnMud2IubWVtLjEyOAorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92cy53Yi5tZW0uMjU2CisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3ZzLndiLm1lbS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZGIuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmRiLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5kYi41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmRiLm1lbS4xMjgKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmRiLm1lbS4yNTYKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmRiLm1lbS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMuZHcuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmR3LjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5kdy41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmR3Lm1lbS4xMjgKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmR3Lm1lbS4yNTYKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLmR3Lm1lbS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWIuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFiLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xYi41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFiLm1lbS4xMjgKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFiLm1lbS4yNTYKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFiLm1lbS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucWQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xZC41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFkLm1lbS4xMjgKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFkLm1lbS4yNTYKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnFkLm1lbS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMucXcuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnF3LjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy5xdy41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnF3Lm1lbS4xMjgKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnF3Lm1lbS4yNTYKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLnF3Lm1lbS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbW92dXMud2IuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLndiLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBtb3Z1cy53Yi41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLndiLm1lbS4xMjgKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLndiLm1lbS4yNTYKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucG1vdnVzLndiLm1lbS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbXVsdGlzaGlmdC5xYi4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbXVsdGlzaGlmdC5xYi4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wbXVsdGlzaGlmdC5xYi41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sLmQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbC5kLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb2wuZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sLnEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbC5xLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb2wucS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sdi5kLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb2x2LmQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbHYuZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9sdi5xLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb2x2LnEuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvbHYucS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9yLmQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvci5kLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb3IuZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9yLnEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvci5xLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb3IucS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9ydi5kLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb3J2LmQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvcnYuZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wcm9ydi5xLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnByb3J2LnEuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHJvcnYucS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wc3Vicy5iLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBzdWJzLmIuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnMuYi41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wc3Vicy53LjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnBzdWJzLncuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHN1YnMudy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wc3VidXMuYi4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wc3VidXMuYi4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wc3VidXMuYi41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wc3VidXMudy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wc3VidXMudy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wc3VidXMudy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wdGVybmxvZy5kLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnB0ZXJubG9nLmQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHRlcm5sb2cuZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5wdGVybmxvZy5xLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnB0ZXJubG9nLnEuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucHRlcm5sb2cucS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yYW5nZS5wZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yYW5nZS5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yYW5nZS5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yYW5nZS5wcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yYW5nZS5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yYW5nZS5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yYW5nZS5zZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJhbmdlLnNzCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmVkdWNlLnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJlZHVjZS5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yZWR1Y2UucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmVkdWNlLnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnJlZHVjZS5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5yZWR1Y2UucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmVkdWNlLnNkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucmVkdWNlLnNzCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucm5kc2NhbGUucGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucm5kc2NhbGUucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucm5kc2NhbGUucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucm5kc2NhbGUucHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucm5kc2NhbGUucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucm5kc2NhbGUucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sucm5kc2NhbGUuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5ybmRzY2FsZS5zcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNjYWxlZi5wZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zY2FsZWYucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc2NhbGVmLnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNjYWxlZi5wcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zY2FsZWYucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc2NhbGVmLnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNjYWxlZi5zZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNjYWxlZi5zcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNxcnQucGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zcXJ0LnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNxcnQucHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc3FydC5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zcXJ0LnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnNxcnQuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zcXJ0LnNzCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnN0b3JlLnNzCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2suc3ViLnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnN1Yi5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zdWIuc2Qucm91bmQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay5zdWIuc3Mucm91bmQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Y3Z0cGgycHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmN2dHBoMnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZjdnRwaDJwcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Y3Z0cHMycGguMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmN2dHBzMnBoLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZjdnRwczJwaC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGQucGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZC5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGQucHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZC5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGQuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGQuc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGRzdWIucGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkc3ViLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZHN1Yi5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm1hZGRzdWIucHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZtYWRkc3ViLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbWFkZHN1Yi5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm5tYWRkLnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1hZGQucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubWFkZC5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm5tYWRkLnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1hZGQucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubWFkZC5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm5tc3ViLnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1zdWIucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubXN1Yi5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52Zm5tc3ViLnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZmbm1zdWIucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudmZubXN1Yi5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGRwYnVzZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGRwYnVzZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGRwYnVzZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGRwYnVzZHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcGJ1c2RzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZHBidXNkcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGRwd3NzZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGRwd3NzZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGRwd3NzZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGRwd3NzZHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBkcHdzc2RzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZHB3c3Nkcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybWkydmFyLmQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5kLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIuZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybWkydmFyLmhpLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIuaGkuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5oaS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybWkydmFyLnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybWkydmFyLnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybWkydmFyLnEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5xLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybWkydmFyLnFpLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtaTJ2YXIucWkuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm1pMnZhci5xaS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybXQydmFyLmQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5kLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIuZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybXQydmFyLmhpLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIuaGkuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5oaS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybXQydmFyLnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybXQydmFyLnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybXQydmFyLnEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5xLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cGVybXQydmFyLnFpLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwZXJtdDJ2YXIucWkuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBlcm10MnZhci5xaS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cG1hZGQ1MmgudXEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBtYWRkNTJoLnVxLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwbWFkZDUyaC51cS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cG1hZGQ1MmwudXEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBtYWRkNTJsLnVxLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwbWFkZDUybC51cS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQuZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQuZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQuZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQucS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQucS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQucS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQudy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQudy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGQudy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGR2LmQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkdi5kLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZHYuZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGR2LnEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkdi5xLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZHYucS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNobGR2LncuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaGxkdi53LjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hsZHYudy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQuZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQuZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQuZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQucS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQucS4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQucS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQudy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQudy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmQudy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmR2LmQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkdi5kLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZHYuZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmR2LnEuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkdi5xLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZHYucS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNocmR2LncuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHJkdi53LjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2hyZHYudy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzay52cHNodWZiaXRxbWIuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2sudnBzaHVmYml0cW1iLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrLnZwc2h1ZmJpdHFtYi41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkLnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGQucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkLnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGQucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkLnNkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZC5zcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGRzdWIucGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZHN1Yi5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkc3ViLnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1hZGRzdWIucHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbWFkZHN1Yi5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtYWRkc3ViLnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIucGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1Yi5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViLnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIucHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1Yi5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViLnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWIuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViLnNzCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1YmFkZC5wZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViYWRkLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWJhZGQucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbXN1YmFkZC5wcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZtc3ViYWRkLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrMy52Zm1zdWJhZGQucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbm1zdWIucGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbm1zdWIucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbm1zdWIucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbm1zdWIucHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbm1zdWIucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbm1zdWIucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2szLnZmbm1zdWIuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFzazMudmZubXN1Yi5zcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5maXh1cGltbS5wZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3ouZml4dXBpbW0ucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LmZpeHVwaW1tLnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5maXh1cGltbS5wcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3ouZml4dXBpbW0ucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LmZpeHVwaW1tLnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5maXh1cGltbS5zZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5maXh1cGltbS5zcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5wdGVybmxvZy5kLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5wdGVybmxvZy5kLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5wdGVybmxvZy5kLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5wdGVybmxvZy5xLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5wdGVybmxvZy5xLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei5wdGVybmxvZy5xLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQucGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZC5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkLnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQucHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZC5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkLnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGQuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkLnNzCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZHN1Yi5wZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkc3ViLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGRzdWIucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZmbWFkZHN1Yi5wcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudmZtYWRkc3ViLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52Zm1hZGRzdWIucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHBidXNkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGRwYnVzZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcGJ1c2QuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHBidXNkcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcGJ1c2RzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGRwYnVzZHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHB3c3NkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGRwd3NzZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcHdzc2QuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZHB3c3Nkcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBkcHdzc2RzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGRwd3NzZHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIuZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5kLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIuaGkuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIuaGkuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIuaGkuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucGQuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucGQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucHMuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucHMuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBlcm10MnZhci5xLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cGVybXQydmFyLnEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucWkuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucWkuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwZXJtdDJ2YXIucWkuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwbWFkZDUyaC51cS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBtYWRkNTJoLnVxLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cG1hZGQ1MmgudXEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwbWFkZDUybC51cS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBtYWRkNTJsLnVxLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cG1hZGQ1MmwudXEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYuZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi5kLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cHNobGR2LmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYucS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi5xLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cHNobGR2LnEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hsZHYudy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaGxkdi53LjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cHNobGR2LncuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYuZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi5kLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cHNocmR2LmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYucS4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi5xLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cHNocmR2LnEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLm1hc2t6LnZwc2hyZHYudy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIubWFza3oudnBzaHJkdi53LjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5tYXNrei52cHNocmR2LncuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBhY2tzc2R3LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wYWNrc3N3Yi41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucGFja3VzZHcuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBhY2t1c3diLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wbXVsLmRxLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wbXVsLmhyLnN3LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wbXVsaC53LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wbXVsaHUudy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucG11bHUuZHEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBzYWQuYncuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBzaHVmLmIuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBzbGwuZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNsbC5xLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc2xsLncuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBzbGxpLmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBzbGxpLnEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBzbGxpLncuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBzbGx2LmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBzbGx2LnEuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBzbGx2LncuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBzbGx2LncuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBzbGx2LncuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmEuZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNyYS5xLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JhLnEuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmEucS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNyYS53LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JhaS5kLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JhaS5xLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JhaS5xLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JhaS5xLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JhaS53LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3Jhdi5kLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3Jhdi5xLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3Jhdi5xLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3Jhdi5xLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3Jhdi53LjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3Jhdi53LjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3Jhdi53LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JsLmQuNTEyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnBzcmwucS41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucHNybC53LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JsaS5kLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JsaS5xLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3JsaS53LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3Jsdi5kLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3Jsdi5xLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3Jsdi53LjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3Jsdi53LjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5wc3Jsdi53LjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5yY3AxNC5wZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucmNwMTQucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnJjcDE0LnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5yY3AxNC5wcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucmNwMTQucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnJjcDE0LnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5yY3AxNC5zZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5yY3AxNC5zcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5yY3AyOC5wZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5yY3AyOC5wcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5yY3AyOC5zZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5yY3AyOC5zcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5yc3FydDE0LnBkLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5yc3FydDE0LnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5yc3FydDE0LnBkLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5yc3FydDE0LnBzLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5yc3FydDE0LnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5yc3FydDE0LnBzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5yc3FydDE0LnNkCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnJzcXJ0MTQuc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucnNxcnQyOC5wZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi5yc3FydDI4LnBzCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnJzcXJ0Mjguc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIucnNxcnQyOC5zcworICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlci5kcGQuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyLmRwaS41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXIuZHBxLjUxMgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlci5kcHMuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyLnFwZC41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXIucXBpLjUxMgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlci5xcHEuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyLnFwcy41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJkaXYyLmRmCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyZGl2Mi5kaQorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcmRpdjQuZGYKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJkaXY0LmRpCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyZGl2NC5zZgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcmRpdjQuc2kKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJkaXY4LnNmCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyZGl2OC5zaQorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnBmLmRwZC41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJwZi5kcHMuNTEyCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVycGYucXBkLjUxMgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnBmLnFwcy41MTIKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJzaXYyLmRmCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyc2l2Mi5kaQorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnNpdjQuZGYKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJzaXY0LmRpCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyc2l2NC5zZgorICAgIDIxLCAvLyBsbHZtLng4Ni5hdng1MTIuc2NhdHRlcnNpdjQuc2kKKyAgICAyMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnNjYXR0ZXJzaXY4LnNmCisgICAgMjEsIC8vIGxsdm0ueDg2LmF2eDUxMi5zY2F0dGVyc2l2OC5zaQorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi52YnJvYWRjYXN0LnNkLjUxMgorICAgIDIsIC8vIGxsdm0ueDg2LmF2eDUxMi52YnJvYWRjYXN0LnNzLjUxMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi52Y29taS5zZAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi52Y29taS5zcworICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi52Y3Z0c2Qyc2kzMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi52Y3Z0c2Qyc2k2NAorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi52Y3Z0c2QydXNpMzIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIudmN2dHNkMnVzaTY0CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnZjdnRzczJzaTMyCisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnZjdnRzczJzaTY0CisgICAgMSwgLy8gbGx2bS54ODYuYXZ4NTEyLnZjdnRzczJ1c2kzMgorICAgIDEsIC8vIGxsdm0ueDg2LmF2eDUxMi52Y3Z0c3MydXNpNjQKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIudnBlcm1pbHZhci5wZC41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5hdng1MTIudnBlcm1pbHZhci5wcy41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni5ibWkuYmV4dHIuMzIKKyAgICAxLCAvLyBsbHZtLng4Ni5ibWkuYmV4dHIuNjQKKyAgICAxLCAvLyBsbHZtLng4Ni5ibWkuYnpoaS4zMgorICAgIDEsIC8vIGxsdm0ueDg2LmJtaS5iemhpLjY0CisgICAgMSwgLy8gbGx2bS54ODYuYm1pLnBkZXAuMzIKKyAgICAxLCAvLyBsbHZtLng4Ni5ibWkucGRlcC42NAorICAgIDEsIC8vIGxsdm0ueDg2LmJtaS5wZXh0LjMyCisgICAgMSwgLy8gbGx2bS54ODYuYm1pLnBleHQuNjQKKyAgICAzLCAvLyBsbHZtLng4Ni5jbGZsdXNob3B0CisgICAgMywgLy8gbGx2bS54ODYuY2xyc3Nic3kKKyAgICAzLCAvLyBsbHZtLng4Ni5jbHdiCisgICAgMywgLy8gbGx2bS54ODYuY2x6ZXJvCisgICAgMywgLy8gbGx2bS54ODYuZmxhZ3MucmVhZC51MzIKKyAgICAzLCAvLyBsbHZtLng4Ni5mbGFncy5yZWFkLnU2NAorICAgIDMsIC8vIGxsdm0ueDg2LmZsYWdzLndyaXRlLnUzMgorICAgIDMsIC8vIGxsdm0ueDg2LmZsYWdzLndyaXRlLnU2NAorICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm1hZGQucGQKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZtYWRkLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm1hZGQucHMKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZtYWRkLnBzLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm1hZGQuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZtYWRkLnNzCisgICAgMSwgLy8gbGx2bS54ODYuZm1hLnZmbWFkZHN1Yi5wZAorICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm1hZGRzdWIucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuZm1hLnZmbWFkZHN1Yi5wcworICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm1hZGRzdWIucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuZm1hLnZmbXN1Yi5wZAorICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm1zdWIucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuZm1hLnZmbXN1Yi5wcworICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm1zdWIucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuZm1hLnZmbXN1Yi5zZAorICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm1zdWIuc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZtc3ViYWRkLnBkCisgICAgMSwgLy8gbGx2bS54ODYuZm1hLnZmbXN1YmFkZC5wZC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZtc3ViYWRkLnBzCisgICAgMSwgLy8gbGx2bS54ODYuZm1hLnZmbXN1YmFkZC5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZubWFkZC5wZAorICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm5tYWRkLnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm5tYWRkLnBzCisgICAgMSwgLy8gbGx2bS54ODYuZm1hLnZmbm1hZGQucHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuZm1hLnZmbm1hZGQuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZubWFkZC5zcworICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm5tc3ViLnBkCisgICAgMSwgLy8gbGx2bS54ODYuZm1hLnZmbm1zdWIucGQuMjU2CisgICAgMSwgLy8gbGx2bS54ODYuZm1hLnZmbm1zdWIucHMKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZubXN1Yi5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWEudmZubXN1Yi5zZAorICAgIDEsIC8vIGxsdm0ueDg2LmZtYS52Zm5tc3ViLnNzCisgICAgMSwgLy8gbGx2bS54ODYuZm1hNC52Zm1hZGQuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5mbWE0LnZmbWFkZC5zcworICAgIDMsIC8vIGxsdm0ueDg2LmZ4cnN0b3IKKyAgICAzLCAvLyBsbHZtLng4Ni5meHJzdG9yNjQKKyAgICAzLCAvLyBsbHZtLng4Ni5meHNhdmUKKyAgICAzLCAvLyBsbHZtLng4Ni5meHNhdmU2NAorICAgIDMsIC8vIGxsdm0ueDg2LmluY3NzcGQKKyAgICAzLCAvLyBsbHZtLng4Ni5pbmNzc3BxCisgICAgMywgLy8gbGx2bS54ODYuaW50CisgICAgMywgLy8gbGx2bS54ODYubGx3cGNiCisgICAgMywgLy8gbGx2bS54ODYubHdwaW5zMzIKKyAgICAzLCAvLyBsbHZtLng4Ni5sd3BpbnM2NAorICAgIDMsIC8vIGxsdm0ueDg2Lmx3cHZhbDMyCisgICAgMywgLy8gbGx2bS54ODYubHdwdmFsNjQKKyAgICAzLCAvLyBsbHZtLng4Ni5tbXguZW1tcworICAgIDMsIC8vIGxsdm0ueDg2Lm1teC5mZW1tcworICAgIDMsIC8vIGxsdm0ueDg2Lm1teC5tYXNrbW92cQorICAgIDMsIC8vIGxsdm0ueDg2Lm1teC5tb3ZudC5kcQorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wYWNrc3NkdworICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wYWNrc3N3YgorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wYWNrdXN3YgorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wYWRkLmIKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucGFkZC5kCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBhZGQucQorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wYWRkLncKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucGFkZHMuYgorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wYWRkcy53CisgICAgMSwgLy8gbGx2bS54ODYubW14LnBhZGR1cy5iCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBhZGR1cy53CisgICAgMSwgLy8gbGx2bS54ODYubW14LnBhbGlnbnIuYgorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wYW5kCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBhbmRuCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBhdmcuYgorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wYXZnLncKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucGNtcGVxLmIKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucGNtcGVxLmQKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucGNtcGVxLncKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucGNtcGd0LmIKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucGNtcGd0LmQKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucGNtcGd0LncKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucGV4dHIudworICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5waW5zci53CisgICAgMSwgLy8gbGx2bS54ODYubW14LnBtYWRkLndkCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBtYXhzLncKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucG1heHUuYgorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wbWlucy53CisgICAgMSwgLy8gbGx2bS54ODYubW14LnBtaW51LmIKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucG1vdm1za2IKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucG11bGgudworICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wbXVsaHUudworICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wbXVsbC53CisgICAgMSwgLy8gbGx2bS54ODYubW14LnBtdWx1LmRxCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBvcgorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wc2FkLmJ3CisgICAgMSwgLy8gbGx2bS54ODYubW14LnBzbGwuZAorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wc2xsLnEKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHNsbC53CisgICAgMSwgLy8gbGx2bS54ODYubW14LnBzbGxpLmQKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHNsbGkucQorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wc2xsaS53CisgICAgMSwgLy8gbGx2bS54ODYubW14LnBzcmEuZAorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wc3JhLncKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHNyYWkuZAorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wc3JhaS53CisgICAgMSwgLy8gbGx2bS54ODYubW14LnBzcmwuZAorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wc3JsLnEKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHNybC53CisgICAgMSwgLy8gbGx2bS54ODYubW14LnBzcmxpLmQKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHNybGkucQorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wc3JsaS53CisgICAgMSwgLy8gbGx2bS54ODYubW14LnBzdWIuYgorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wc3ViLmQKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHN1Yi5xCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBzdWIudworICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wc3Vicy5iCisgICAgMSwgLy8gbGx2bS54ODYubW14LnBzdWJzLncKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHN1YnVzLmIKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHN1YnVzLncKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHVucGNraGJ3CisgICAgMSwgLy8gbGx2bS54ODYubW14LnB1bnBja2hkcQorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wdW5wY2tod2QKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHVucGNrbGJ3CisgICAgMSwgLy8gbGx2bS54ODYubW14LnB1bnBja2xkcQorICAgIDEsIC8vIGxsdm0ueDg2Lm1teC5wdW5wY2tsd2QKKyAgICAxLCAvLyBsbHZtLng4Ni5tbXgucHhvcgorICAgIDMsIC8vIGxsdm0ueDg2Lm1vbml0b3J4CisgICAgMywgLy8gbGx2bS54ODYubXdhaXR4CisgICAgMSwgLy8gbGx2bS54ODYucGNsbXVscWRxCisgICAgMSwgLy8gbGx2bS54ODYucGNsbXVscWRxLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LnBjbG11bHFkcS41MTIKKyAgICAzLCAvLyBsbHZtLng4Ni5yZGZzYmFzZS4zMgorICAgIDMsIC8vIGxsdm0ueDg2LnJkZnNiYXNlLjY0CisgICAgMywgLy8gbGx2bS54ODYucmRnc2Jhc2UuMzIKKyAgICAzLCAvLyBsbHZtLng4Ni5yZGdzYmFzZS42NAorICAgIDMsIC8vIGxsdm0ueDg2LnJkcGlkCisgICAgMywgLy8gbGx2bS54ODYucmRwa3J1CisgICAgMywgLy8gbGx2bS54ODYucmRwbWMKKyAgICAzLCAvLyBsbHZtLng4Ni5yZHJhbmQuMTYKKyAgICAzLCAvLyBsbHZtLng4Ni5yZHJhbmQuMzIKKyAgICAzLCAvLyBsbHZtLng4Ni5yZHJhbmQuNjQKKyAgICAzLCAvLyBsbHZtLng4Ni5yZHNlZWQuMTYKKyAgICAzLCAvLyBsbHZtLng4Ni5yZHNlZWQuMzIKKyAgICAzLCAvLyBsbHZtLng4Ni5yZHNlZWQuNjQKKyAgICAzLCAvLyBsbHZtLng4Ni5yZHNzcGQKKyAgICAzLCAvLyBsbHZtLng4Ni5yZHNzcHEKKyAgICAzLCAvLyBsbHZtLng4Ni5yZHRzYworICAgIDIxLCAvLyBsbHZtLng4Ni5yZHRzY3AKKyAgICAzLCAvLyBsbHZtLng4Ni5yc3RvcnNzcAorICAgIDMsIC8vIGxsdm0ueDg2LnNhdmVwcmV2c3NwCisgICAgMywgLy8gbGx2bS54ODYuc2VoLmVoZ3VhcmQKKyAgICAzLCAvLyBsbHZtLng4Ni5zZWguZWhyZWdub2RlCisgICAgMSwgLy8gbGx2bS54ODYuc2VoLmxzZGEKKyAgICAxLCAvLyBsbHZtLng4Ni5zZWgucmVjb3ZlcmZwCisgICAgMywgLy8gbGx2bS54ODYuc2V0c3Nic3kKKyAgICAxLCAvLyBsbHZtLng4Ni5zaGExbXNnMQorICAgIDEsIC8vIGxsdm0ueDg2LnNoYTFtc2cyCisgICAgMSwgLy8gbGx2bS54ODYuc2hhMW5leHRlCisgICAgMSwgLy8gbGx2bS54ODYuc2hhMXJuZHM0CisgICAgMSwgLy8gbGx2bS54ODYuc2hhMjU2bXNnMQorICAgIDEsIC8vIGxsdm0ueDg2LnNoYTI1Nm1zZzIKKyAgICAxLCAvLyBsbHZtLng4Ni5zaGEyNTZybmRzMgorICAgIDMsIC8vIGxsdm0ueDg2LnNsd3BjYgorICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5jbXAucHMKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UuY21wLnNzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlLmNvbWllcS5zcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5jb21pZ2Uuc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UuY29taWd0LnNzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlLmNvbWlsZS5zcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5jb21pbHQuc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UuY29taW5lcS5zcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5jdnRwZDJwaQorICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5jdnRwaTJwZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5jdnRwaTJwcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5jdnRwczJwaQorICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5jdnRzaTJzcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5jdnRzaTY0MnNzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlLmN2dHNzMnNpCisgICAgMSwgLy8gbGx2bS54ODYuc3NlLmN2dHNzMnNpNjQKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UuY3Z0dHBkMnBpCisgICAgMSwgLy8gbGx2bS54ODYuc3NlLmN2dHRwczJwaQorICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5jdnR0c3Myc2kKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UuY3Z0dHNzMnNpNjQKKyAgICAzLCAvLyBsbHZtLng4Ni5zc2UubGRteGNzcgorICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5tYXgucHMKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UubWF4LnNzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlLm1pbi5wcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5taW4uc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UubW92bXNrLnBzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlLnBzaHVmLncKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UucmNwLnBzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlLnJjcC5zcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5yc3FydC5wcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5yc3FydC5zcworICAgIDMsIC8vIGxsdm0ueDg2LnNzZS5zZmVuY2UKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2Uuc3FydC5wcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZS5zcXJ0LnNzCisgICAgMywgLy8gbGx2bS54ODYuc3NlLnN0bXhjc3IKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UudWNvbWllcS5zcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZS51Y29taWdlLnNzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlLnVjb21pZ3Quc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UudWNvbWlsZS5zcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZS51Y29taWx0LnNzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlLnVjb21pbmVxLnNzCisgICAgMywgLy8gbGx2bS54ODYuc3NlMi5jbGZsdXNoCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5jbXAucGQKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLmNtcC5zZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIuY29taWVxLnNkCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5jb21pZ2Uuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLmNvbWlndC5zZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIuY29taWxlLnNkCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5jb21pbHQuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLmNvbWluZXEuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLmN2dGRxMnBzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5jdnRwZDJkcQorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIuY3Z0cGQycHMKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLmN2dHBzMmRxCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5jdnRzZDJzaQorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIuY3Z0c2Qyc2k2NAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIuY3Z0c2Qyc3MKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLmN2dHNpMnNkCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5jdnRzaTY0MnNkCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5jdnRzczJzZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIuY3Z0dHBkMmRxCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5jdnR0cHMyZHEKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLmN2dHRzZDJzaQorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIuY3Z0dHNkMnNpNjQKKyAgICAzLCAvLyBsbHZtLng4Ni5zc2UyLmxmZW5jZQorICAgIDMsIC8vIGxsdm0ueDg2LnNzZTIubWFza21vdi5kcXUKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLm1heC5wZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIubWF4LnNkCisgICAgMywgLy8gbGx2bS54ODYuc3NlMi5tZmVuY2UKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLm1pbi5wZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIubWluLnNkCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5tb3Ztc2sucGQKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBhY2tzc2R3LjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIucGFja3Nzd2IuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wYWNrdXN3Yi4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBhZGRzLmIKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBhZGRzLncKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBhZGR1cy5iCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wYWRkdXMudworICAgIDMsIC8vIGxsdm0ueDg2LnNzZTIucGF1c2UKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBtYWRkLndkCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wbW92bXNrYi4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBtdWxoLncKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBtdWxodS53CisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wbXVsdS5kcQorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIucHNhZC5idworICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIucHNsbC5kCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wc2xsLnEKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBzbGwudworICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIucHNsbGkuZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIucHNsbGkucQorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIucHNsbGkudworICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIucHNyYS5kCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wc3JhLncKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBzcmFpLmQKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBzcmFpLncKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBzcmwuZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIucHNybC5xCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wc3JsLncKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBzcmxpLmQKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBzcmxpLnEKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBzcmxpLncKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBzdWJzLmIKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBzdWJzLncKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UyLnBzdWJ1cy5iCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMi5wc3VidXMudworICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIuc3FydC5wZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIuc3FydC5zZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIudWNvbWllcS5zZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIudWNvbWlnZS5zZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIudWNvbWlndC5zZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIudWNvbWlsZS5zZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIudWNvbWlsdC5zZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTIudWNvbWluZXEuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2UzLmFkZHN1Yi5wZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTMuYWRkc3ViLnBzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMy5oYWRkLnBkCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMy5oYWRkLnBzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMy5oc3ViLnBkCisgICAgMSwgLy8gbGx2bS54ODYuc3NlMy5oc3ViLnBzCisgICAgMTYsIC8vIGxsdm0ueDg2LnNzZTMubGR1LmRxCisgICAgMywgLy8gbGx2bS54ODYuc3NlMy5tb25pdG9yCisgICAgMywgLy8gbGx2bS54ODYuc3NlMy5td2FpdAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQxLmJsZW5kdnBkCisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDEuYmxlbmR2cHMKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0MS5kcHBkCisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDEuZHBwcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQxLmluc2VydHBzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDEubXBzYWRidworICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQxLnBhY2t1c2R3CisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDEucGJsZW5kdmIKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0MS5waG1pbnBvc3V3CisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDEucG11bGRxCisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDEucHRlc3RjCisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDEucHRlc3RuemMKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0MS5wdGVzdHoKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0MS5yb3VuZC5wZAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQxLnJvdW5kLnBzCisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDEucm91bmQuc2QKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0MS5yb3VuZC5zcworICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQyLmNyYzMyLjMyLjE2CisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDIuY3JjMzIuMzIuMzIKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0Mi5jcmMzMi4zMi44CisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDIuY3JjMzIuNjQuNjQKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0Mi5wY21wZXN0cmkxMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0Mi5wY21wZXN0cmlhMTI4CisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDIucGNtcGVzdHJpYzEyOAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQyLnBjbXBlc3RyaW8xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0Mi5wY21wZXN0cmlzMTI4CisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDIucGNtcGVzdHJpejEyOAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQyLnBjbXBlc3RybTEyOAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQyLnBjbXBpc3RyaTEyOAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQyLnBjbXBpc3RyaWExMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0Mi5wY21waXN0cmljMTI4CisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDIucGNtcGlzdHJpbzEyOAorICAgIDEsIC8vIGxsdm0ueDg2LnNzZTQyLnBjbXBpc3RyaXMxMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0Mi5wY21waXN0cml6MTI4CisgICAgMSwgLy8gbGx2bS54ODYuc3NlNDIucGNtcGlzdHJtMTI4CisgICAgMSwgLy8gbGx2bS54ODYuc3NlNGEuZXh0cnEKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0YS5leHRycWkKKyAgICAxLCAvLyBsbHZtLng4Ni5zc2U0YS5pbnNlcnRxCisgICAgMSwgLy8gbGx2bS54ODYuc3NlNGEuaW5zZXJ0cWkKKyAgICAxLCAvLyBsbHZtLng4Ni5zc3NlMy5wYWJzLmIKKyAgICAxLCAvLyBsbHZtLng4Ni5zc3NlMy5wYWJzLmQKKyAgICAxLCAvLyBsbHZtLng4Ni5zc3NlMy5wYWJzLncKKyAgICAxLCAvLyBsbHZtLng4Ni5zc3NlMy5waGFkZC5kCisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucGhhZGQuZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc3NlMy5waGFkZC5zdworICAgIDEsIC8vIGxsdm0ueDg2LnNzc2UzLnBoYWRkLnN3LjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LnNzc2UzLnBoYWRkLncKKyAgICAxLCAvLyBsbHZtLng4Ni5zc3NlMy5waGFkZC53LjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LnNzc2UzLnBoc3ViLmQKKyAgICAxLCAvLyBsbHZtLng4Ni5zc3NlMy5waHN1Yi5kLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LnNzc2UzLnBoc3ViLnN3CisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucGhzdWIuc3cuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucGhzdWIudworICAgIDEsIC8vIGxsdm0ueDg2LnNzc2UzLnBoc3ViLncuMTI4CisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucG1hZGQudWIuc3cKKyAgICAxLCAvLyBsbHZtLng4Ni5zc3NlMy5wbWFkZC51Yi5zdy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc3NlMy5wbXVsLmhyLnN3CisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucG11bC5oci5zdy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc3NlMy5wc2h1Zi5iCisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucHNodWYuYi4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc3NlMy5wc2lnbi5iCisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucHNpZ24uYi4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc3NlMy5wc2lnbi5kCisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucHNpZ24uZC4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni5zc3NlMy5wc2lnbi53CisgICAgMSwgLy8gbGx2bS54ODYuc3NzZTMucHNpZ24udy4xMjgKKyAgICAyMSwgLy8gbGx2bS54ODYuc3ViYm9ycm93LnUzMgorICAgIDIxLCAvLyBsbHZtLng4Ni5zdWJib3Jyb3cudTY0CisgICAgMSwgLy8gbGx2bS54ODYudGJtLmJleHRyaS51MzIKKyAgICAxLCAvLyBsbHZtLng4Ni50Ym0uYmV4dHJpLnU2NAorICAgIDEsIC8vIGxsdm0ueDg2LnZjdnRwaDJwcy4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni52Y3Z0cGgycHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYudmN2dHBzMnBoLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LnZjdnRwczJwaC4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni52Z2YycDhhZmZpbmVpbnZxYi4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni52Z2YycDhhZmZpbmVpbnZxYi4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni52Z2YycDhhZmZpbmVpbnZxYi41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni52Z2YycDhhZmZpbmVxYi4xMjgKKyAgICAxLCAvLyBsbHZtLng4Ni52Z2YycDhhZmZpbmVxYi4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni52Z2YycDhhZmZpbmVxYi41MTIKKyAgICAxLCAvLyBsbHZtLng4Ni52Z2YycDhtdWxiLjEyOAorICAgIDEsIC8vIGxsdm0ueDg2LnZnZjJwOG11bGIuMjU2CisgICAgMSwgLy8gbGx2bS54ODYudmdmMnA4bXVsYi41MTIKKyAgICAzLCAvLyBsbHZtLng4Ni53cmZzYmFzZS4zMgorICAgIDMsIC8vIGxsdm0ueDg2LndyZnNiYXNlLjY0CisgICAgMywgLy8gbGx2bS54ODYud3Jnc2Jhc2UuMzIKKyAgICAzLCAvLyBsbHZtLng4Ni53cmdzYmFzZS42NAorICAgIDMsIC8vIGxsdm0ueDg2LndycGtydQorICAgIDMsIC8vIGxsdm0ueDg2Lndyc3NkCisgICAgMywgLy8gbGx2bS54ODYud3Jzc3EKKyAgICAzLCAvLyBsbHZtLng4Ni53cnVzc2QKKyAgICAzLCAvLyBsbHZtLng4Ni53cnVzc3EKKyAgICAzLCAvLyBsbHZtLng4Ni54YWJvcnQKKyAgICAzLCAvLyBsbHZtLng4Ni54YmVnaW4KKyAgICAzLCAvLyBsbHZtLng4Ni54ZW5kCisgICAgMywgLy8gbGx2bS54ODYueGdldGJ2CisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZmcmN6LnBkCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZmcmN6LnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52ZnJjei5wcworICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52ZnJjei5wcy4yNTYKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudmZyY3ouc2QKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudmZyY3ouc3MKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBjb21iCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwY29tZAorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGNvbXEKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBjb211YgorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGNvbXVkCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwY29tdXEKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBjb211dworICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGNvbXcKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBlcm1pbDJwZAorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGVybWlsMnBkLjI1NgorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGVybWlsMnBzCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwZXJtaWwycHMuMjU2CisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwaGFkZGJkCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwaGFkZGJxCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwaGFkZGJ3CisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwaGFkZGRxCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwaGFkZHViZAorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGhhZGR1YnEKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBoYWRkdWJ3CisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwaGFkZHVkcQorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cGhhZGR1d2QKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBoYWRkdXdxCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwaGFkZHdkCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwaGFkZHdxCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwaHN1YmJ3CisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwaHN1YmRxCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwaHN1YndkCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwbWFjc2RkCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwbWFjc2RxaAorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cG1hY3NkcWwKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBtYWNzc2RkCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwbWFjc3NkcWgKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBtYWNzc2RxbAorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cG1hY3Nzd2QKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBtYWNzc3d3CisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwbWFjc3dkCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwbWFjc3d3CisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwbWFkY3Nzd2QKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBtYWRjc3dkCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwcGVybQorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cHJvdGIKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnByb3RiaQorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cHJvdGQKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnByb3RkaQorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cHJvdHEKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnByb3RxaQorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cHJvdHcKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnByb3R3aQorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cHNoYWIKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBzaGFkCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwc2hhcQorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cHNoYXcKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBzaGxiCisgICAgMSwgLy8gbGx2bS54ODYueG9wLnZwc2hsZAorICAgIDEsIC8vIGxsdm0ueDg2LnhvcC52cHNobHEKKyAgICAxLCAvLyBsbHZtLng4Ni54b3AudnBzaGx3CisgICAgMywgLy8gbGx2bS54ODYueHJzdG9yCisgICAgMywgLy8gbGx2bS54ODYueHJzdG9yNjQKKyAgICAzLCAvLyBsbHZtLng4Ni54cnN0b3JzCisgICAgMywgLy8gbGx2bS54ODYueHJzdG9yczY0CisgICAgMywgLy8gbGx2bS54ODYueHNhdmUKKyAgICAzLCAvLyBsbHZtLng4Ni54c2F2ZTY0CisgICAgMywgLy8gbGx2bS54ODYueHNhdmVjCisgICAgMywgLy8gbGx2bS54ODYueHNhdmVjNjQKKyAgICAzLCAvLyBsbHZtLng4Ni54c2F2ZW9wdAorICAgIDMsIC8vIGxsdm0ueDg2LnhzYXZlb3B0NjQKKyAgICAzLCAvLyBsbHZtLng4Ni54c2F2ZXMKKyAgICAzLCAvLyBsbHZtLng4Ni54c2F2ZXM2NAorICAgIDMsIC8vIGxsdm0ueDg2LnhzZXRidgorICAgIDMsIC8vIGxsdm0ueDg2Lnh0ZXN0CisgICAgMSwgLy8gbGx2bS54Y29yZS5iaXRyZXYKKyAgICAzLCAvLyBsbHZtLnhjb3JlLmNoZWNrZXZlbnQKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5jaGtjdAorICAgIDMsIC8vIGxsdm0ueGNvcmUuY2xyZQorICAgIDQ1LCAvLyBsbHZtLnhjb3JlLmNscnB0CisgICAgMywgLy8gbGx2bS54Y29yZS5jbHJzcgorICAgIDEsIC8vIGxsdm0ueGNvcmUuY3JjMzIKKyAgICAxLCAvLyBsbHZtLnhjb3JlLmNyYzgKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5lZHUKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5lZXUKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5lbmRpbgorICAgIDQ1LCAvLyBsbHZtLnhjb3JlLmZyZWVyCisgICAgMywgLy8gbGx2bS54Y29yZS5nZXRlZAorICAgIDMsIC8vIGxsdm0ueGNvcmUuZ2V0ZXQKKyAgICAxLCAvLyBsbHZtLnhjb3JlLmdldGlkCisgICAgMywgLy8gbGx2bS54Y29yZS5nZXRwcworICAgIDMsIC8vIGxsdm0ueGNvcmUuZ2V0cgorICAgIDQ1LCAvLyBsbHZtLnhjb3JlLmdldHN0CisgICAgNDUsIC8vIGxsdm0ueGNvcmUuZ2V0dHMKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5pbgorICAgIDQ1LCAvLyBsbHZtLnhjb3JlLmluY3QKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5pbml0Y3AKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5pbml0ZHAKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5pbml0bHIKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5pbml0cGMKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5pbml0c3AKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5pbnNocgorICAgIDQ1LCAvLyBsbHZtLnhjb3JlLmludAorICAgIDQ1LCAvLyBsbHZtLnhjb3JlLm1qb2luCisgICAgNDUsIC8vIGxsdm0ueGNvcmUubXN5bmMKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5vdXQKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5vdXRjdAorICAgIDQ1LCAvLyBsbHZtLnhjb3JlLm91dHNocgorICAgIDQ1LCAvLyBsbHZtLnhjb3JlLm91dHQKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5wZWVrCisgICAgNDUsIC8vIGxsdm0ueGNvcmUuc2V0YworICAgIDQ2LCAvLyBsbHZtLnhjb3JlLnNldGNsaworICAgIDQ1LCAvLyBsbHZtLnhjb3JlLnNldGQKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5zZXRldgorICAgIDMsIC8vIGxsdm0ueGNvcmUuc2V0cHMKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5zZXRwc2MKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5zZXRwdAorICAgIDQ2LCAvLyBsbHZtLnhjb3JlLnNldHJkeQorICAgIDMsIC8vIGxsdm0ueGNvcmUuc2V0c3IKKyAgICA0NSwgLy8gbGx2bS54Y29yZS5zZXR0dworICAgIDQ1LCAvLyBsbHZtLnhjb3JlLnNldHYKKyAgICAxLCAvLyBsbHZtLnhjb3JlLnNleHQKKyAgICAzLCAvLyBsbHZtLnhjb3JlLnNzeW5jCisgICAgNDUsIC8vIGxsdm0ueGNvcmUuc3luY3IKKyAgICA0NSwgLy8gbGx2bS54Y29yZS50ZXN0Y3QKKyAgICA0NSwgLy8gbGx2bS54Y29yZS50ZXN0d2N0CisgICAgMTYsIC8vIGxsdm0ueGNvcmUud2FpdGV2ZW50CisgICAgMSwgLy8gbGx2bS54Y29yZS56ZXh0CisgIH07CisKKyAgQXR0cmlidXRlTGlzdCBBU1s1XTsKKyAgdW5zaWduZWQgTnVtQXR0cnMgPSAwOworICBpZiAoaWQgIT0gMCkgeworICAgIHN3aXRjaChJbnRyaW5zaWNzVG9BdHRyaWJ1dGVzTWFwW2lkIC0gMV0pIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIGF0dHJpYnV0ZSBudW1iZXIiKTsKKyAgICBjYXNlIDM6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmR9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDE7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDQ1OiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTFbXT0ge0F0dHJpYnV0ZTo6Tm9DYXB0dXJlfTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIDEsIEF0dHJQYXJhbTEpOworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZH07CisgICAgICBBU1sxXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMjsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgNDY6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtMVtdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmV9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMSwgQXR0clBhcmFtMSk7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTJbXT0ge0F0dHJpYnV0ZTo6Tm9DYXB0dXJlfTsKKyAgICAgIEFTWzFdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIDIsIEF0dHJQYXJhbTIpOworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZH07CisgICAgICBBU1syXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMzsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgNjogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRyUGFyYW0yW109IHtBdHRyaWJ1dGU6OldyaXRlT25seX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCAyLCBBdHRyUGFyYW0yKTsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmR9OworICAgICAgQVNbMV0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDI7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDI1OiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTFbXT0ge0F0dHJpYnV0ZTo6Tm9DYXB0dXJlLEF0dHJpYnV0ZTo6UmVhZE9ubHl9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMSwgQXR0clBhcmFtMSk7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6SW5hY2Nlc3NpYmxlTWVtT3JBcmdNZW1Pbmx5fTsKKyAgICAgIEFTWzFdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAyOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAyMTogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OkFyZ01lbU9ubHl9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDE7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDE4OiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTFbXT0ge0F0dHJpYnV0ZTo6Tm9DYXB0dXJlfTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIDEsIEF0dHJQYXJhbTEpOworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OkFyZ01lbU9ubHl9OworICAgICAgQVNbMV0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDI7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDg6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtMVtdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmUsQXR0cmlidXRlOjpSZWFkT25seX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCAxLCBBdHRyUGFyYW0xKTsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpBcmdNZW1Pbmx5fTsKKyAgICAgIEFTWzFdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAyOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAyNDogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRyUGFyYW0xW109IHtBdHRyaWJ1dGU6Ok5vQ2FwdHVyZSxBdHRyaWJ1dGU6OldyaXRlT25seX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCAxLCBBdHRyUGFyYW0xKTsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpBcmdNZW1Pbmx5fTsKKyAgICAgIEFTWzFdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAyOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAyMjogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRyUGFyYW0xW109IHtBdHRyaWJ1dGU6Ok5vQ2FwdHVyZSxBdHRyaWJ1dGU6OldyaXRlT25seX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCAxLCBBdHRyUGFyYW0xKTsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtMltdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmUsQXR0cmlidXRlOjpSZWFkT25seX07CisgICAgICBBU1sxXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCAyLCBBdHRyUGFyYW0yKTsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpBcmdNZW1Pbmx5fTsKKyAgICAgIEFTWzJdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAzOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAyMzogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRyUGFyYW0xW109IHtBdHRyaWJ1dGU6Ok5vQ2FwdHVyZX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCAxLCBBdHRyUGFyYW0xKTsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtMltdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmUsQXR0cmlidXRlOjpSZWFkT25seX07CisgICAgICBBU1sxXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCAyLCBBdHRyUGFyYW0yKTsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpBcmdNZW1Pbmx5fTsKKyAgICAgIEFTWzJdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAzOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAyMDogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRyUGFyYW0yW109IHtBdHRyaWJ1dGU6Ok5vQ2FwdHVyZX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCAyLCBBdHRyUGFyYW0yKTsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpBcmdNZW1Pbmx5fTsKKyAgICAgIEFTWzFdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAyOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAxNzogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRyUGFyYW0yW109IHtBdHRyaWJ1dGU6Ok5vQ2FwdHVyZX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCAyLCBBdHRyUGFyYW0yKTsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtM1tdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmV9OworICAgICAgQVNbMV0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMywgQXR0clBhcmFtMyk7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6QXJnTWVtT25seX07CisgICAgICBBU1syXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMzsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMTk6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtM1tdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmV9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMywgQXR0clBhcmFtMyk7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6QXJnTWVtT25seX07CisgICAgICBBU1sxXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMjsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMjg6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtNFtdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmV9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgNCwgQXR0clBhcmFtNCk7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6QXJnTWVtT25seX07CisgICAgICBBU1sxXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMjsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMjk6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtNVtdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmV9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgNSwgQXR0clBhcmFtNSk7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6QXJnTWVtT25seX07CisgICAgICBBU1sxXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMjsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMzA6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtNltdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmV9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgNiwgQXR0clBhcmFtNik7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6QXJnTWVtT25seX07CisgICAgICBBU1sxXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMjsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMTU6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpJbmFjY2Vzc2libGVNZW1Pbmx5fTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAxOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAzMjogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OldyaXRlT25seX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMjc6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtMVtdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmUsQXR0cmlidXRlOjpSZWFkT25seX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCAxLCBBdHRyUGFyYW0xKTsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpXcml0ZU9ubHl9OworICAgICAgQVNbMV0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDI7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDQwOiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6V3JpdGVPbmx5LEF0dHJpYnV0ZTo6QXJnTWVtT25seX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMzk6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtMVtdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmUsQXR0cmlidXRlOjpXcml0ZU9ubHl9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMSwgQXR0clBhcmFtMSk7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6V3JpdGVPbmx5LEF0dHJpYnV0ZTo6QXJnTWVtT25seX07CisgICAgICBBU1sxXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMjsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMTY6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpSZWFkT25seX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMjogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OlJlYWRPbmx5LEF0dHJpYnV0ZTo6QXJnTWVtT25seX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMzc6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtMVtdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmV9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMSwgQXR0clBhcmFtMSk7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6UmVhZE9ubHksQXR0cmlidXRlOjpBcmdNZW1Pbmx5fTsKKyAgICAgIEFTWzFdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAyOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAxMzogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRyUGFyYW0xW109IHtBdHRyaWJ1dGU6Ok5vQ2FwdHVyZSxBdHRyaWJ1dGU6OlJlYWRPbmx5fTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIDEsIEF0dHJQYXJhbTEpOworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OlJlYWRPbmx5LEF0dHJpYnV0ZTo6QXJnTWVtT25seX07CisgICAgICBBU1sxXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMjsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgOTogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRyUGFyYW0yW109IHtBdHRyaWJ1dGU6Ok5vQ2FwdHVyZSxBdHRyaWJ1dGU6OlJlYWRPbmx5fTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIDIsIEF0dHJQYXJhbTIpOworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OlJlYWRPbmx5LEF0dHJpYnV0ZTo6QXJnTWVtT25seX07CisgICAgICBBU1sxXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMjsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMTA6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtMltdPSB7QXR0cmlidXRlOjpSZWFkTm9uZX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCAyLCBBdHRyUGFyYW0yKTsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtM1tdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmUsQXR0cmlidXRlOjpSZWFkT25seX07CisgICAgICBBU1sxXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCAzLCBBdHRyUGFyYW0zKTsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpSZWFkT25seSxBdHRyaWJ1dGU6OkFyZ01lbU9ubHl9OworICAgICAgQVNbMl0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDM7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDE6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpSZWFkTm9uZX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMTI6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0clBhcmFtMVtdPSB7QXR0cmlidXRlOjpOb0NhcHR1cmV9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMSwgQXR0clBhcmFtMSk7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6UmVhZE5vbmV9OworICAgICAgQVNbMV0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDI7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDI2OiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTFbXT0ge0F0dHJpYnV0ZTo6UmV0dXJuZWR9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMSwgQXR0clBhcmFtMSk7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6UmVhZE5vbmV9OworICAgICAgQVNbMV0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDI7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDExOiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTFbXT0ge0F0dHJpYnV0ZTo6UmVhZE5vbmV9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMSwgQXR0clBhcmFtMSk7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHJQYXJhbTJbXT0ge0F0dHJpYnV0ZTo6UmVhZE5vbmV9OworICAgICAgQVNbMV0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgMiwgQXR0clBhcmFtMik7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6UmVhZE5vbmV9OworICAgICAgQVNbMl0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDM7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDQzOiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kfTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAxOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAzNjogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OldyaXRlT25seSxBdHRyaWJ1dGU6OkFyZ01lbU9ubHl9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDE7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDM0OiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6Ok5vVW53aW5kLEF0dHJpYnV0ZTo6U3BlY3VsYXRhYmxlLEF0dHJpYnV0ZTo6UmVhZE9ubHl9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDE7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICBjYXNlIDQ6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpTcGVjdWxhdGFibGUsQXR0cmlidXRlOjpSZWFkTm9uZX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMzM6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpDb252ZXJnZW50fTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAxOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAzODogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OkNvbnZlcmdlbnQsQXR0cmlidXRlOjpJbmFjY2Vzc2libGVNZW1Pbmx5fTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAxOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSAzMTogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6OkNvbnZlcmdlbnQsQXR0cmlidXRlOjpSZWFkTm9uZX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgMTQ6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpOb1JldHVybn07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgNTogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1Vud2luZCxBdHRyaWJ1dGU6Ok5vRHVwbGljYXRlLEF0dHJpYnV0ZTo6SW5hY2Nlc3NpYmxlTWVtT25seX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgNDI6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9VbndpbmQsQXR0cmlidXRlOjpOb0R1cGxpY2F0ZSxBdHRyaWJ1dGU6OldyaXRlT25seX07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgNzogeworICAgICAgcmV0dXJuIEF0dHJpYnV0ZUxpc3QoKTsKKyAgICAgIH0KKyAgICBjYXNlIDM1OiB7CisgICAgICBjb25zdCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEF0dHNbXSA9IHtBdHRyaWJ1dGU6OlJlYWROb25lfTsKKyAgICAgIEFTWzBdID0gQXR0cmlidXRlTGlzdDo6Z2V0KEMsIEF0dHJpYnV0ZUxpc3Q6OkZ1bmN0aW9uSW5kZXgsIEF0dHMpOworICAgICAgTnVtQXR0cnMgPSAxOworICAgICAgYnJlYWs7CisgICAgICB9CisgICAgY2FzZSA0NDogeworICAgICAgY29uc3QgQXR0cmlidXRlOjpBdHRyS2luZCBBdHRzW10gPSB7QXR0cmlidXRlOjpOb1JldHVybn07CisgICAgICBBU1swXSA9IEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBBdHRyaWJ1dGVMaXN0OjpGdW5jdGlvbkluZGV4LCBBdHRzKTsKKyAgICAgIE51bUF0dHJzID0gMTsKKyAgICAgIGJyZWFrOworICAgICAgfQorICAgIGNhc2UgNDE6IHsKKyAgICAgIGNvbnN0IEF0dHJpYnV0ZTo6QXR0cktpbmQgQXR0c1tdID0ge0F0dHJpYnV0ZTo6Tm9SZXR1cm4sQXR0cmlidXRlOjpXcml0ZU9ubHl9OworICAgICAgQVNbMF0gPSBBdHRyaWJ1dGVMaXN0OjpnZXQoQywgQXR0cmlidXRlTGlzdDo6RnVuY3Rpb25JbmRleCwgQXR0cyk7CisgICAgICBOdW1BdHRycyA9IDE7CisgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgcmV0dXJuIEF0dHJpYnV0ZUxpc3Q6OmdldChDLCBtYWtlQXJyYXlSZWYoQVMsIE51bUF0dHJzKSk7Cit9CisjZW5kaWYgLy8gR0VUX0lOVFJJTlNJQ19BVFRSSUJVVEVTCisKKy8vIEdldCB0aGUgTExWTSBpbnRyaW5zaWMgdGhhdCBjb3JyZXNwb25kcyB0byBhIGJ1aWx0aW4uCisvLyBUaGlzIGlzIHVzZWQgYnkgdGhlIEMgZnJvbnQtZW5kLiAgVGhlIGJ1aWx0aW4gbmFtZSBpcyBwYXNzZWQKKy8vIGluIGFzIEJ1aWx0aW5OYW1lLCBhbmQgYSB0YXJnZXQgcHJlZml4IChlLmcuICdwcGMnKSBpcyBwYXNzZWQKKy8vIGluIGFzIFRhcmdldFByZWZpeC4gIFRoZSByZXN1bHQgaXMgYXNzaWduZWQgdG8gJ0ludHJpbnNpY0lEJy4KKyNpZmRlZiBHRVRfTExWTV9JTlRSSU5TSUNfRk9SX0dDQ19CVUlMVElOCitJbnRyaW5zaWM6OklEIEludHJpbnNpYzo6Z2V0SW50cmluc2ljRm9yR0NDQnVpbHRpbihjb25zdCBjaGFyICpUYXJnZXRQcmVmaXhTdHIsIFN0cmluZ1JlZiBCdWlsdGluTmFtZVN0cikgeworICBzdGF0aWMgY29uc3QgY2hhciBCdWlsdGluTmFtZXNbXSA9IHsKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdkJywgJ2onLCAndScsICdzJywKKyAgJ3QnLCAnXycsICd0JywgJ3InLCAnYScsICdtJywgJ3AnLCAnbycsICdsJywgJ2knLCAnbicsICdlJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdkJywgJ2UnLCAnYicsICd1JywgJ2cnLCAndCcsICdyJywKKyAgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndScsICduJywKKyAgJ3cnLCAnaScsICduJywgJ2QnLCAnXycsICdpJywgJ24nLCAnaScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdmJywgJ2wnLCAndCcsICdfJywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdzJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ24nLCAnaScsICd0JywKKyAgJ18nLCAndCcsICdyJywgJ2EnLCAnbScsICdwJywgJ28nLCAnbCcsICdpJywgJ24nLCAnZScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbycsICdiJywgJ2onLCAnZScsICdjJywgJ3QnLCAnXycsICdzJywKKyAgJ2knLCAneicsICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywKKyAgJ3QnLCAnYScsICdjJywgJ2snLCAnXycsICdyJywgJ2UnLCAncycsICd0JywgJ28nLCAncicsICdlJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJ3QnLCAnYScsICdjJywgJ2snLCAnXycsICdzJywKKyAgJ2EnLCAndicsICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd0JywKKyAgJ2gnLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAnbycsICdpJywgJ24nLCAndCcsICdlJywgJ3InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAnZCcsICdtJywKKyAgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywKKyAgJ18nLCAnZCcsICdzJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAncicsICdtJywgJ18nLCAnaScsICdzJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAnYicsICd1JywgJ2YnLCAnZicsICdlJywKKyAgJ3InLCAnXycsICd3JywgJ2InLCAnaScsICduJywgJ3YnLCAnbCcsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ2InLCAndScsICdmJywKKyAgJ2YnLCAnZScsICdyJywgJ18nLCAndycsICdiJywgJ2knLCAnbicsICd2JywgJ2wnLCAnMScsICdfJywgJ3MnLCAnYycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywKKyAgJ24nLCAnXycsICdiJywgJ3UnLCAnZicsICdmJywgJ2UnLCAncicsICdfJywgJ3cnLCAnYicsICdpJywgJ24nLCAndicsICdsJywKKyAgJzEnLCAnXycsICd2JywgJ28nLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdjJywgJ3UnLCAnYicsICdlJywgJ2knLCAnZCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywKKyAgJ24nLCAnXycsICdjJywgJ3UnLCAnYicsICdlJywgJ20nLCAnYScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdjJywgJ3UnLCAnYicsICdlJywKKyAgJ3MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywKKyAgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdjJywgJ3UnLCAnYicsICdlJywgJ3QnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdjJywKKyAgJ3YnLCAndCcsICdfJywgJ3AnLCAnaycsICdfJywgJ3UnLCAnOCcsICdfJywgJ2YnLCAnMycsICcyJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywKKyAgJ2QnLCAnaScsICdzJywgJ3AnLCAnYScsICd0JywgJ2MnLCAnaCcsICdfJywgJ2knLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdkJywKKyAgJ2knLCAncycsICdwJywgJ2EnLCAndCcsICdjJywgJ2gnLCAnXycsICdwJywgJ3QnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdkJywKKyAgJ3MnLCAnXycsICdiJywgJ3AnLCAnZScsICdyJywgJ20nLCAndScsICd0JywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAnZCcsICdzJywKKyAgJ18nLCAnZicsICdhJywgJ2QnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdkJywgJ3MnLCAnXycsICdmJywgJ20nLCAnYScsICd4JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywKKyAgJ2MnLCAnbicsICdfJywgJ2QnLCAncycsICdfJywgJ2YnLCAnbScsICdpJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAnZCcsICdzJywKKyAgJ18nLCAncCcsICdlJywgJ3InLCAnbScsICd1JywgJ3QnLCAnZScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdkJywgJ3MnLCAnXycsICdzJywKKyAgJ3cnLCAnaScsICd6JywgJ3onLCAnbCcsICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ2YnLCAnbScsICdlJywgJ2QnLCAnMycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywKKyAgJ24nLCAnXycsICdmJywgJ20nLCAndScsICdsJywgJ18nLCAnbCcsICdlJywgJ2cnLCAnYScsICdjJywgJ3knLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywKKyAgJ18nLCAnZycsICdyJywgJ28nLCAndScsICdwJywgJ3MnLCAndCcsICdhJywgJ3QnLCAnaScsICdjJywgJ3MnLCAnaScsICd6JywKKyAgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywKKyAgJ2cnLCAnYycsICduJywgJ18nLCAnaScsICdtJywgJ3AnLCAnbCcsICdpJywgJ2MnLCAnaScsICd0JywgJ18nLCAnYicsICd1JywKKyAgJ2YnLCAnZicsICdlJywgJ3InLCAnXycsICdwJywgJ3QnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdpJywgJ20nLCAncCcsICdsJywKKyAgJ2knLCAnYycsICdpJywgJ3QnLCAnYScsICdyJywgJ2cnLCAnXycsICdwJywgJ3QnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdpJywKKyAgJ24nLCAndCcsICdlJywgJ3InLCAncCcsICdfJywgJ20nLCAnbycsICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ2knLCAnbicsICd0JywKKyAgJ2UnLCAncicsICdwJywgJ18nLCAncCcsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ2knLCAnbicsICd0JywgJ2UnLCAncicsICdwJywKKyAgJ18nLCAncCcsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ2snLCAnZScsICdyJywgJ24nLCAnYScsICdyJywgJ2cnLCAnXycsICdzJywKKyAgJ2UnLCAnZycsICdtJywgJ2UnLCAnbicsICd0JywgJ18nLCAncCcsICd0JywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAnbCcsICdlJywKKyAgJ3InLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywKKyAgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdtJywgJ2InLCAnYycsICduJywgJ3QnLCAnXycsICdoJywgJ2knLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywKKyAgJ18nLCAnbScsICdiJywgJ2MnLCAnbicsICd0JywgJ18nLCAnbCcsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ20nLCAncScsICdzJywKKyAgJ2EnLCAnZCcsICdfJywgJ3AnLCAnaycsICdfJywgJ3UnLCAnMScsICc2JywgJ18nLCAndScsICc4JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywKKyAgJ20nLCAncScsICdzJywgJ2EnLCAnZCcsICdfJywgJ3UnLCAnMycsICcyJywgJ18nLCAndScsICc4JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ2QnLCAnXycsICd1JywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAncScsICdzJywgJ2EnLCAnZCcsICdfJywKKyAgJ3AnLCAnaycsICdfJywgJ3UnLCAnMScsICc2JywgJ18nLCAndScsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ3EnLCAndScsICdlJywKKyAgJ3UnLCAnZScsICdfJywgJ3AnLCAndCcsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ3InLCAnYycsICdwJywgJ18nLCAnbCcsICdlJywKKyAgJ2cnLCAnYScsICdjJywgJ3knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdmJywgJ2knLCAncicsICdzJywKKyAgJ3QnLCAnbCcsICdhJywgJ24nLCAnZScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ2wnLCAnYScsICduJywKKyAgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywKKyAgJ2cnLCAnYycsICduJywgJ18nLCAncicsICdzJywgJ3EnLCAnXycsICdsJywgJ2UnLCAnZycsICdhJywgJ2MnLCAneScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywKKyAgJ24nLCAnXycsICdzJywgJ18nLCAnYicsICdhJywgJ3InLCAncicsICdpJywgJ2UnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdzJywKKyAgJ18nLCAnZCcsICdjJywgJ2EnLCAnYycsICdoJywgJ2UnLCAnXycsICdpJywgJ24nLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdzJywKKyAgJ18nLCAnZCcsICdjJywgJ2EnLCAnYycsICdoJywgJ2UnLCAnXycsICdpJywgJ24nLCAndicsICdfJywgJ3YnLCAnbycsICdsJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywKKyAgJ2MnLCAnbicsICdfJywgJ3MnLCAnXycsICdkJywgJ2MnLCAnYScsICdjJywgJ2gnLCAnZScsICdfJywgJ3cnLCAnYicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywKKyAgJ24nLCAnXycsICdzJywgJ18nLCAnZCcsICdjJywgJ2EnLCAnYycsICdoJywgJ2UnLCAnXycsICd3JywgJ2InLCAnXycsICd2JywKKyAgJ28nLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywKKyAgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdzJywgJ18nLCAnZCcsICdlJywgJ2MnLCAncCcsICdlJywgJ3InLCAnZicsICdsJywKKyAgJ2UnLCAndicsICdlJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAncycsICdfJywgJ2cnLCAnZScsICd0JywgJ3AnLCAnYycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywKKyAgJ24nLCAnXycsICdzJywgJ18nLCAnZycsICdlJywgJ3QnLCAncicsICdlJywgJ2cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAncycsICdfJywKKyAgJ2knLCAnbicsICdjJywgJ3AnLCAnZScsICdyJywgJ2YnLCAnbCcsICdlJywgJ3YnLCAnZScsICdsJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywKKyAgJ3MnLCAnXycsICdtJywgJ2UnLCAnbScsICdyJywgJ2UnLCAnYScsICdsJywgJ3QnLCAnaScsICdtJywgJ2UnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywKKyAgJ18nLCAncycsICdfJywgJ20nLCAnZScsICdtJywgJ3QnLCAnaScsICdtJywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAncycsICdfJywKKyAgJ3MnLCAnZScsICduJywgJ2QnLCAnbScsICdzJywgJ2cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAncycsICdfJywgJ3MnLCAnZScsICduJywKKyAgJ2QnLCAnbScsICdzJywgJ2cnLCAnaCcsICdhJywgJ2wnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICdzJywgJ18nLCAncycsICdsJywKKyAgJ2UnLCAnZScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ3MnLCAnXycsICd3JywgJ2EnLCAnaScsICd0JywgJ2MnLCAnbicsICd0JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywKKyAgJ2MnLCAnbicsICdfJywgJ3MnLCAnYScsICdkJywgJ18nLCAnaCcsICdpJywgJ18nLCAndScsICc4JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywKKyAgJ3MnLCAnYScsICdkJywgJ18nLCAndScsICcxJywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAncycsICdhJywgJ2QnLCAnXycsICd1JywKKyAgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywKKyAgJ2cnLCAnYycsICduJywgJ18nLCAndycsICdhJywgJ3YnLCAnZScsICdfJywgJ2InLCAnYScsICdyJywgJ3InLCAnaScsICdlJywKKyAgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywKKyAgJ2cnLCAnYycsICduJywgJ18nLCAndycsICdvJywgJ3InLCAnaycsICdnJywgJ3InLCAnbycsICd1JywgJ3AnLCAnXycsICdpJywKKyAgJ2QnLCAnXycsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ20nLCAnZCcsICdnJywgJ2MnLCAnbicsICdfJywgJ3cnLCAnbycsICdyJywgJ2snLCAnZycsICdyJywgJ28nLCAndScsICdwJywKKyAgJ18nLCAnaScsICdkJywgJ18nLCAneScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdtJywgJ2QnLCAnZycsICdjJywgJ24nLCAnXycsICd3JywgJ28nLCAncicsICdrJywgJ2cnLCAncicsICdvJywKKyAgJ3UnLCAncCcsICdfJywgJ2knLCAnZCcsICdfJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAnbScsICdkJywgJ2cnLCAnYycsICduJywgJ18nLCAndycsICdyJywgJ2knLCAndCcsICdlJywKKyAgJ2wnLCAnYScsICduJywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAncicsICdtJywgJ18nLCAnYycsICdkJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAnYycsICdkJywgJ3AnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdnJywgJ2UnLCAndCcsICdfJywKKyAgJ2YnLCAncCcsICdzJywgJ2MnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdsJywgJ2QnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdsJywgJ2QnLCAnYycsICcyJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ2wnLCAnZCcsICdjJywKKyAgJzInLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywKKyAgJ20nLCAnXycsICdsJywgJ2QnLCAnYycsICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ20nLCAnYycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ20nLCAnYycsICdyJywgJzInLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAnbScsICdyJywKKyAgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywKKyAgJ18nLCAnbScsICdyJywgJ2MnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdxJywgJ2EnLCAnZCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3EnLCAnYScsICdkJywgJ2QnLCAnMScsICc2JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywKKyAgJ3EnLCAnYScsICdkJywgJ2QnLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdxJywgJ2EnLCAncycsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3EnLCAncycsICdhJywgJ3gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncScsICdzJywKKyAgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywKKyAgJ20nLCAnXycsICdxJywgJ3MnLCAndScsICdiJywgJzEnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdxJywgJ3MnLCAndScsICdiJywgJzgnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncycsICdhJywKKyAgJ2QnLCAnZCcsICcxJywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAncicsICdtJywgJ18nLCAncycsICdhJywgJ2QnLCAnZCcsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnYScsICdzJywgJ3gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncycsICdlJywKKyAgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywKKyAgJ18nLCAncycsICdlJywgJ3QnLCAnXycsICdmJywgJ3AnLCAncycsICdjJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncycsICdoJywgJ2EnLCAnZCcsICdkJywKKyAgJzEnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywKKyAgJ20nLCAnXycsICdzJywgJ2gnLCAnYScsICdkJywgJ2QnLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdzJywgJ2gnLCAnYScsICdzJywgJ3gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncycsICdoJywKKyAgJ3MnLCAnYScsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ3InLCAnbScsICdfJywgJ3MnLCAnaCcsICdzJywgJ3UnLCAnYicsICcxJywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncycsICdoJywgJ3MnLCAndScsICdiJywKKyAgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywKKyAgJ18nLCAncycsICdtJywgJ2wnLCAnYScsICdiJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncycsICdtJywgJ2wnLCAnYScsICdiJywgJ3QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncycsICdtJywKKyAgJ2wnLCAnYScsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ3InLCAnbScsICdfJywgJ3MnLCAnbScsICdsJywgJ2EnLCAnZCcsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnbScsICdsJywgJ2EnLCAnbCcsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywKKyAgJ3MnLCAnbScsICdsJywgJ2EnLCAnbCcsICdkJywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncycsICdtJywgJ2wnLCAnYScsICd0JywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncycsICdtJywKKyAgJ2wnLCAnYScsICd0JywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAncicsICdtJywgJ18nLCAncycsICdtJywgJ2wnLCAnYScsICd3JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncycsICdtJywgJ2wnLCAnYScsICd3JywKKyAgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywKKyAgJ18nLCAncycsICdtJywgJ2wnLCAncycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnbScsICdsJywgJ3MnLCAnZCcsICd4JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnbScsICdsJywKKyAgJ3MnLCAnbCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ3InLCAnbScsICdfJywgJ3MnLCAnbScsICdsJywgJ3MnLCAnbCcsICdkJywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncycsICdtJywgJ3UnLCAnYScsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywKKyAgJ3MnLCAnbScsICd1JywgJ2EnLCAnZCcsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnbScsICd1JywgJ2wnLCAnYicsICdiJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnbScsICd1JywKKyAgJ2wnLCAnYicsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ3InLCAnbScsICdfJywgJ3MnLCAnbScsICd1JywgJ2wnLCAndCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnbScsICd1JywgJ2wnLCAndCcsICd0JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywKKyAgJ3MnLCAnbScsICd1JywgJ2wnLCAndycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnbScsICd1JywgJ2wnLCAndycsICd0JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAnbScsICd1JywKKyAgJ3MnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywKKyAgJ20nLCAnXycsICdzJywgJ20nLCAndScsICdzJywgJ2QnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdzJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAncycsICdhJywKKyAgJ3QnLCAnMScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ3InLCAnbScsICdfJywgJ3MnLCAncycsICdhJywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncycsICdzJywgJ3UnLCAnYicsICcxJywgJzYnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncycsICdzJywKKyAgJ3UnLCAnYicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ3InLCAnbScsICdfJywgJ3MnLCAndCcsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3MnLCAndCcsICdjJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAncycsICd0JywgJ2MnLCAnMicsICdsJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywKKyAgJ3MnLCAndCcsICdjJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAncicsICdtJywgJ18nLCAncycsICd4JywgJ3QnLCAnYScsICdiJywgJzEnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICdzJywgJ3gnLCAndCcsICdiJywKKyAgJzEnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywKKyAgJ20nLCAnXycsICd1JywgJ2EnLCAnZCcsICdkJywgJzEnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICd1JywgJ2EnLCAnZCcsICdkJywgJzgnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAndScsICdhJywKKyAgJ3MnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywKKyAgJ20nLCAnXycsICd1JywgJ2gnLCAnYScsICdkJywgJ2QnLCAnMScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3UnLCAnaCcsICdhJywgJ2QnLCAnZCcsICc4JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywKKyAgJ3UnLCAnaCcsICdhJywgJ3MnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICd1JywgJ2gnLCAncycsICdhJywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAndScsICdoJywgJ3MnLCAndScsICdiJywKKyAgJzEnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywKKyAgJ20nLCAnXycsICd1JywgJ2gnLCAncycsICd1JywgJ2InLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICd1JywgJ3EnLCAnYScsICdkJywgJ2QnLCAnMScsICc2JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywKKyAgJ3UnLCAncScsICdhJywgJ2QnLCAnZCcsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3UnLCAncScsICdhJywgJ3MnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICd1JywgJ3EnLCAncycsICdhJywKKyAgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywKKyAgJ18nLCAndScsICdxJywgJ3MnLCAndScsICdiJywgJzEnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICd1JywgJ3EnLCAncycsICd1JywgJ2InLCAnOCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICd1JywKKyAgJ3MnLCAnYScsICdkJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAncicsICdtJywgJ18nLCAndScsICdzJywgJ2EnLCAnZCcsICdhJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAncicsICdtJywgJ18nLCAndScsICdzJywgJ2EnLCAndCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICd1JywKKyAgJ3MnLCAnYScsICd0JywgJzEnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICd1JywgJ3MnLCAnYScsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3UnLCAncycsICd1JywgJ2InLCAnMScsICc2JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywKKyAgJ3UnLCAncycsICd1JywgJ2InLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdyJywgJ20nLCAnXycsICd1JywgJ3gnLCAndCcsICdhJywgJ2InLCAnMScsICc2JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ3InLCAnbScsICdfJywgJ3UnLCAneCcsICd0JywKKyAgJ2InLCAnMScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdiJywKKyAgJ3AnLCAnZicsICdfJywgJ2wnLCAnbycsICdhJywgJ2QnLCAnXycsICdiJywgJ3knLCAndCcsICdlJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdiJywgJ3AnLCAnZicsICdfJywgJ2wnLCAnbycsICdhJywKKyAgJ2QnLCAnXycsICdoJywgJ2EnLCAnbCcsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdiJywgJ3AnLCAnZicsICdfJywgJ2wnLCAnbycsICdhJywgJ2QnLCAnXycsICd3JywgJ28nLCAncicsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdiJywgJ3AnLCAnZicsICdfJywKKyAgJ3AnLCAncycsICdlJywgJ3UnLCAnZCcsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAnYScsICdiJywKKyAgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdhJywgJ2InLCAncycsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnQScsICcyJywgJ18nLCAnYScsICdiJywgJ3MnLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywKKyAgJzInLCAnXycsICdhJywgJ2QnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ2EnLCAnZCcsICdkJywKKyAgJ2gnLCAnXycsICdoJywgJzEnLCAnNicsICdfJywgJ2gnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywKKyAgJ2EnLCAnZCcsICdkJywgJ2gnLCAnXycsICdoJywgJzEnLCAnNicsICdfJywgJ2gnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ0EnLCAnMicsICdfJywgJ2EnLCAnZCcsICdkJywgJ2gnLCAnXycsICdoJywgJzEnLCAnNicsICdfJywgJ2wnLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ2EnLCAnZCcsICdkJywgJ2gnLCAnXycsICdoJywgJzEnLCAnNicsICdfJywKKyAgJ2wnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ2EnLCAnZCcsICdkJywgJ2gnLCAnXycsICdoJywKKyAgJzEnLCAnNicsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnaCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywKKyAgJ18nLCAnYScsICdkJywgJ2QnLCAnaCcsICdfJywgJ2gnLCAnMScsICc2JywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICdoJywKKyAgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdhJywgJ2QnLCAnZCcsICdoJywgJ18nLCAnaCcsICcxJywKKyAgJzYnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ2wnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywKKyAgJ2EnLCAnZCcsICdkJywgJ2gnLCAnXycsICdoJywgJzEnLCAnNicsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnbCcsICdsJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAnYScsICdkJywgJ2QnLCAnaCcsICdfJywgJ2wnLCAnMScsICc2JywKKyAgJ18nLCAnaCcsICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAnYScsICdkJywgJ2QnLCAnaCcsICdfJywKKyAgJ2wnLCAnMScsICc2JywgJ18nLCAnbCcsICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAnYScsICdkJywKKyAgJ2QnLCAnaCcsICdfJywgJ2wnLCAnMScsICc2JywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICdoJywgJ2wnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdhJywgJ2QnLCAnZCcsICdoJywgJ18nLCAnbCcsICcxJywgJzYnLCAnXycsICdzJywKKyAgJ2EnLCAndCcsICdfJywgJ2wnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ2EnLCAnZCcsICdkJywKKyAgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdhJywgJ2QnLCAnZCcsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnQScsICcyJywgJ18nLCAnYScsICdkJywgJ2QnLCAncCcsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ0EnLCAnMicsICdfJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywKKyAgJ18nLCAnYScsICdkJywgJ2QnLCAncycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAnYScsICduJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdhJywgJ24nLCAnZCcsICdpJywgJ3InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdhJywgJ24nLCAnZCcsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywKKyAgJ18nLCAnYScsICdzJywgJ2wnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdjJywgJ28nLCAnbScsICdiJywgJ2knLCAnbicsICdlJywKKyAgJ18nLCAnaCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAnYicsICdpJywKKyAgJ24nLCAnZScsICdfJywgJ2gnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywKKyAgJ2InLCAnaScsICduJywgJ2UnLCAnXycsICdsJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdjJywKKyAgJ28nLCAnbScsICdiJywgJ2knLCAnbicsICdlJywgJ18nLCAnbCcsICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywKKyAgJ18nLCAnYycsICdvJywgJ20nLCAnYicsICdpJywgJ24nLCAnZScsICdpJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywKKyAgJzInLCAnXycsICdjJywgJ28nLCAnbScsICdiJywgJ2knLCAnbicsICdlJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ20nLCAnYScsICd4JywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdtJywgJ2EnLCAneCcsICd1JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnQScsICcyJywgJ18nLCAnbScsICdhJywgJ3gnLCAndScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywKKyAgJ18nLCAnbScsICdpJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdtJywgJ2knLCAnbicsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAnbScsICdpJywgJ24nLCAndScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ0EnLCAnMicsICdfJywgJ20nLCAnaScsICduJywgJ3UnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywKKyAgJ24nLCAnZScsICdnJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAnbicsICdlJywgJ2cnLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ24nLCAnZScsICdnJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnQScsICcyJywgJ18nLCAnbicsICdvJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICduJywKKyAgJ28nLCAndCcsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnQScsICcyJywgJ18nLCAnbycsICdyJywgJ2knLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywKKyAgJ28nLCAncicsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsICdkJywKKyAgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdzJywgJ2EnLCAndCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywKKyAgJ18nLCAncycsICdhJywgJ3QnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3MnLCAnYScsICd0JywKKyAgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3MnLCAnYScsICd0JywgJ3UnLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3MnLCAndScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywKKyAgJ18nLCAncycsICd1JywgJ2InLCAnaCcsICdfJywgJ2gnLCAnMScsICc2JywgJ18nLCAnaCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnQScsICcyJywgJ18nLCAncycsICd1JywgJ2InLCAnaCcsICdfJywgJ2gnLCAnMScsICc2JywgJ18nLCAnaCcsICdsJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAncycsICd1JywgJ2InLCAnaCcsICdfJywgJ2gnLCAnMScsICc2JywKKyAgJ18nLCAnbCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAncycsICd1JywgJ2InLCAnaCcsICdfJywKKyAgJ2gnLCAnMScsICc2JywgJ18nLCAnbCcsICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAncycsICd1JywKKyAgJ2InLCAnaCcsICdfJywgJ2gnLCAnMScsICc2JywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICdoJywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdzJywgJ3UnLCAnYicsICdoJywgJ18nLCAnaCcsICcxJywgJzYnLCAnXycsICdzJywKKyAgJ2EnLCAndCcsICdfJywgJ2gnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3MnLCAndScsICdiJywKKyAgJ2gnLCAnXycsICdoJywgJzEnLCAnNicsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnbCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnQScsICcyJywgJ18nLCAncycsICd1JywgJ2InLCAnaCcsICdfJywgJ2gnLCAnMScsICc2JywgJ18nLCAncycsICdhJywKKyAgJ3QnLCAnXycsICdsJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdzJywgJ3UnLCAnYicsICdoJywKKyAgJ18nLCAnbCcsICcxJywgJzYnLCAnXycsICdoJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdzJywKKyAgJ3UnLCAnYicsICdoJywgJ18nLCAnbCcsICcxJywgJzYnLCAnXycsICdsJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywKKyAgJzInLCAnXycsICdzJywgJ3UnLCAnYicsICdoJywgJ18nLCAnbCcsICcxJywgJzYnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywKKyAgJ2gnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3MnLCAndScsICdiJywgJ2gnLCAnXycsICdsJywKKyAgJzEnLCAnNicsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnbCcsICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywKKyAgJ18nLCAncycsICd1JywgJ2InLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3MnLCAndScsICdiJywKKyAgJ3InLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3MnLCAndScsICdiJywgJ3MnLCAnYScsICd0JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAncycsICd2JywgJ2EnLCAnZCcsICdkJywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdzJywgJ3YnLCAnYScsICdkJywgJ2QnLCAnaCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnQScsICcyJywgJ18nLCAncycsICd2JywgJ2EnLCAnZCcsICdkJywgJ3UnLCAnaCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnQScsICcyJywgJ18nLCAncycsICd2JywgJ2EnLCAndicsICdnJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywKKyAgJzInLCAnXycsICdzJywgJ3YnLCAnYScsICd2JywgJ2cnLCAnaCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywKKyAgJ18nLCAncycsICd2JywgJ24nLCAnYScsICd2JywgJ2cnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywKKyAgJ3MnLCAndicsICdzJywgJ3UnLCAnYicsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAncycsICd2JywKKyAgJ3MnLCAndScsICdiJywgJ2gnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3MnLCAndicsICdzJywKKyAgJ3UnLCAnYicsICd1JywgJ2gnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3MnLCAndycsICdpJywKKyAgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICdzJywgJ3gnLCAndCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnQScsICcyJywgJ18nLCAncycsICd4JywgJ3QnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywKKyAgJ3MnLCAneCcsICd0JywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd0JywgJ2YnLCAncicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3QnLCAnZicsICdyJywgJ2knLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ0EnLCAnMicsICdfJywgJ3QnLCAnZicsICdyJywgJ2knLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywKKyAgJ3QnLCAnZicsICdyJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd0JywgJ2YnLCAncicsICdwJywKKyAgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd0JywgJ2YnLCAncicsICdzJywgJ2knLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ2EnLCAnYicsICdzJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywKKyAgJzInLCAnXycsICd2JywgJ2EnLCAnYicsICdzJywgJ2gnLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywKKyAgJzInLCAnXycsICd2JywgJ2EnLCAnYicsICdzJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywKKyAgJ2EnLCAnYicsICdzJywgJ3cnLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywKKyAgJ2EnLCAnZCcsICdkJywgJ2InLCAnXycsICdtJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywKKyAgJ3YnLCAnYScsICdkJywgJ2QnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnYScsICdkJywKKyAgJ2QnLCAnaCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd1JywKKyAgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ3UnLCAnYicsICdzJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd1JywgJ2gnLCAncycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ0EnLCAnMicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndycsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywKKyAgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdhJywKKyAgJ3YnLCAnZycsICdoJywgJ2MnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnYScsICd2JywKKyAgJ2cnLCAnaCcsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICd1JywKKyAgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ3UnLCAnYicsICdyJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICd1JywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ3UnLCAnaCcsICdyJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICd1JywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywKKyAgJzInLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ3UnLCAndycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywKKyAgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdhJywKKyAgJ3YnLCAnZycsICd3JywgJ2MnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnYScsICd2JywKKyAgJ2cnLCAndycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICdiJywKKyAgJ2UnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnYicsICdnJywKKyAgJ3QnLCAndScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnaCcsICdlJywKKyAgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ2gnLCAnZycsICd0JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICdoJywgJ2cnLCAndCcsICd1JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICd3JywgJ2UnLCAncScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAndycsICdnJywgJ3QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ3cnLCAnZycsICd0JywgJ3UnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ2MnLCAnbycsICduJywgJ2onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywKKyAgJzInLCAnXycsICd2JywgJ20nLCAnYScsICd4JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywKKyAgJ20nLCAnYScsICd4JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ20nLCAnYScsICd4JywKKyAgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnbScsICdhJywgJ3gnLCAndScsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdtJywgJ2EnLCAneCcsICd1JywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ20nLCAnYScsICd4JywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywKKyAgJzInLCAnXycsICd2JywgJ20nLCAnaScsICduJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywKKyAgJ20nLCAnaScsICduJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ20nLCAnaScsICduJywKKyAgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnbScsICdpJywgJ24nLCAndScsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdtJywgJ2knLCAnbicsICd1JywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ20nLCAnaScsICduJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywKKyAgJzInLCAnXycsICd2JywgJ24nLCAnYScsICd2JywgJ2cnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywKKyAgJ3YnLCAnbicsICdhJywgJ3YnLCAnZycsICdoJywgJ2MnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywKKyAgJ3YnLCAnbicsICdhJywgJ3YnLCAnZycsICdoJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywKKyAgJ24nLCAnYScsICd2JywgJ2cnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnbicsICdhJywKKyAgJ3YnLCAnZycsICd3JywgJ2MnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAnbicsICdhJywKKyAgJ3YnLCAnZycsICd3JywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ3InLCAnYScsICdkJywKKyAgJ2QnLCAndScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdyJywgJ2EnLCAnZCcsICdkJywKKyAgJ3UnLCAnYicsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdyJywKKyAgJ3MnLCAnYScsICdkJywgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAncicsICdzJywKKyAgJ2EnLCAnZCcsICd1JywgJ2InLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywKKyAgJ3YnLCAncycsICd1JywgJ2InLCAnYicsICdfJywgJ20nLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywKKyAgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdzJywKKyAgJ3UnLCAnYicsICdoJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ3MnLCAndScsICdiJywKKyAgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAndScsICdiJywKKyAgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ3UnLCAnaCcsICdzJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnQScsICcyJywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICd3JywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywKKyAgJzInLCAnXycsICd4JywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnMicsICdfJywgJ3gnLCAnbycsICdyJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzInLCAnXycsICd6JywgJ3gnLCAndCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnQScsICcyJywgJ18nLCAneicsICd4JywgJ3QnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywKKyAgJ2EnLCAnbicsICdkJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICdhJywgJ24nLCAnZCcsICduJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICdiJywgJ2knLCAndCcsICdzJywgJ3AnLCAnbCcsICdpJywKKyAgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICdiJywgJ2knLCAndCcsICdzJywgJ3AnLCAnbCcsICdpJywKKyAgJ3QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywgJ2InLCAnbycsICd1JywgJ24nLCAnZCcsICdzJywKKyAgJ2MnLCAnaCcsICdlJywgJ2MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywgJ2MnLCAnbScsICdwJywKKyAgJ2InLCAnZScsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAnYycsICdtJywgJ3AnLCAnYicsICdlJywKKyAgJ3EnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywgJ2MnLCAnbScsICdwJywgJ2InLCAnZycsICd0JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAnYycsICdtJywgJ3AnLCAnYicsICdnJywgJ3QnLCAnaScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywgJ2MnLCAnbScsICdwJywgJ2InLCAnZycsICd0JywgJ3UnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICdjJywgJ20nLCAncCcsICdiJywgJ2cnLCAndCcsICd1JywgJ2knLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICdjJywgJ20nLCAncCcsICdoJywgJ2UnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ0EnLCAnNCcsICdfJywgJ2MnLCAnbScsICdwJywgJ2gnLCAnZScsICdxJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywKKyAgJzQnLCAnXycsICdjJywgJ20nLCAncCcsICdoJywgJ2cnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywKKyAgJ2MnLCAnbScsICdwJywgJ2gnLCAnZycsICd0JywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICdjJywKKyAgJ20nLCAncCcsICdoJywgJ2cnLCAndCcsICd1JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAnYycsICdtJywKKyAgJ3AnLCAnaCcsICdnJywgJ3QnLCAndScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAnYycsICdvJywKKyAgJ20nLCAnYicsICdpJywgJ24nLCAnZScsICdpJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICdjJywKKyAgJ28nLCAnbScsICdiJywgJ2knLCAnbicsICdlJywgJ3InLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywKKyAgJ2MnLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ18nLCAncicsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywKKyAgJ18nLCAnYycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdyJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywKKyAgJzQnLCAnXycsICdtJywgJ28nLCAnZCcsICd3JywgJ3InLCAnYScsICdwJywgJ3UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywKKyAgJzQnLCAnXycsICdvJywgJ3InLCAnbicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywgJ28nLCAncicsICduJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICdyJywgJ2MnLCAnbScsICdwJywgJ2UnLCAncScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywgJ3InLCAnYycsICdtJywgJ3AnLCAnZScsICdxJywgJ2knLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICdyJywgJ2MnLCAnbScsICdwJywgJ24nLCAnZScsICdxJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnQScsICc0JywgJ18nLCAncicsICdjJywgJ20nLCAncCcsICduJywgJ2UnLCAncScsICdpJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnQScsICc0JywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ18nLCAncicsICdpJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnQScsICc0JywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ18nLCAncicsICdpJywgJ18nLCAncycsICdhJywKKyAgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdyJywKKyAgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdyJywKKyAgJ3InLCAnXycsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywgJ3QnLCAnbCcsICdiJywKKyAgJ20nLCAnYScsICd0JywgJ2MnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywgJ3YnLCAnYycsICdtJywKKyAgJ3AnLCAnYicsICdlJywgJ3EnLCAnXycsICdhJywgJ24nLCAneScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywKKyAgJ3YnLCAnYycsICdtJywgJ3AnLCAnYicsICdlJywgJ3EnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywKKyAgJ3YnLCAnYycsICdtJywgJ3AnLCAnYicsICdnJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICd2JywKKyAgJ2MnLCAnbScsICdwJywgJ2InLCAnZycsICd0JywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICd2JywKKyAgJ2MnLCAnbScsICdwJywgJ2InLCAnZycsICd0JywgJ3UnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywKKyAgJ3YnLCAnYycsICdtJywgJ3AnLCAnaCcsICdlJywgJ3EnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywKKyAgJ3YnLCAnYycsICdtJywgJ3AnLCAnaCcsICdnJywgJ3QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywKKyAgJ3YnLCAnYycsICdtJywgJ3AnLCAnaCcsICdnJywgJ3QnLCAndScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywKKyAgJ18nLCAndicsICdjJywgJ20nLCAncCcsICd3JywgJ2UnLCAncScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywKKyAgJ18nLCAndicsICdjJywgJ20nLCAncCcsICd3JywgJ2cnLCAndCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywKKyAgJ18nLCAndicsICdjJywgJ20nLCAncCcsICd3JywgJ2cnLCAndCcsICd1JywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywKKyAgJzQnLCAnXycsICd2JywgJ3InLCAnbScsICdhJywgJ3gnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywKKyAgJ3YnLCAncicsICdtJywgJ2EnLCAneCcsICd1JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICd2JywKKyAgJ3InLCAnbScsICdhJywgJ3gnLCAndScsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAndicsICdyJywKKyAgJ20nLCAnYScsICd4JywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICd2JywgJ3InLCAnbScsICdpJywKKyAgJ24nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0EnLCAnNCcsICdfJywgJ3YnLCAncicsICdtJywgJ2knLCAnbicsICd1JywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzQnLCAnXycsICd2JywgJ3InLCAnbScsICdpJywgJ24nLCAndScsICd3JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnQScsICc0JywgJ18nLCAndicsICdyJywgJ20nLCAnaScsICduJywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdBJywgJzUnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ2gnLCAndScsICdiJywgJ3MnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdBJywgJzYnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ2InLCAnZScsICdxJywgJ18nLCAnbicsICdvJywKKyAgJ3QnLCAnYScsICduJywgJ3knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdBJywgJzYnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywKKyAgJ2InLCAnZScsICdxJywgJ18nLCAnbicsICdvJywgJ3QnLCAnYScsICduJywgJ3knLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICcyJywgJ18nLCAnYScsICdsJywgJ2wnLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ0MnLCAnMicsICdfJywgJ2EnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICcyJywgJ18nLCAnYScsICduJywKKyAgJ2QnLCAnbicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnMicsICdfJywgJ2EnLCAnbicsICd5JywgJzgnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdDJywgJzInLCAnXycsICdiJywgJ2knLCAndCcsICdzJywgJ2MnLCAnbCcsICdyJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnQycsICcyJywgJ18nLCAnYicsICdpJywgJ3QnLCAncycsICdjJywgJ2wnLCAncicsICdpJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnQycsICcyJywgJ18nLCAnYicsICdpJywgJ3QnLCAncycsICdzJywgJ2UnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ0MnLCAnMicsICdfJywgJ2MnLCAnbScsICdwJywgJ2UnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnMicsICdfJywKKyAgJ2MnLCAnbScsICdwJywgJ2UnLCAncScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICcyJywgJ18nLCAnYycsICdtJywKKyAgJ3AnLCAnZScsICdxJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywgJzInLCAnXycsICdjJywgJ20nLCAncCcsICdnJywKKyAgJ2UnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnMicsICdfJywgJ2MnLCAnbScsICdwJywgJ2cnLCAnZScsICd1JywKKyAgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywgJzInLCAnXycsICdjJywgJ20nLCAncCcsICdnJywgJ3QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdDJywgJzInLCAnXycsICdjJywgJ20nLCAncCcsICdnJywgJ3QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ0MnLCAnMicsICdfJywgJ2MnLCAnbScsICdwJywgJ2cnLCAndCcsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICcyJywKKyAgJ18nLCAnYycsICdtJywgJ3AnLCAnZycsICd0JywgJ3UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywgJzInLCAnXycsICdjJywKKyAgJ20nLCAncCcsICdnJywgJ3QnLCAndScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICcyJywgJ18nLCAnYycsICdtJywKKyAgJ3AnLCAnZycsICd0JywgJ3UnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnMicsICdfJywgJ2MnLCAnbScsICdwJywKKyAgJ2wnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnMicsICdfJywgJ2MnLCAnbScsICdwJywgJ2wnLCAndCcsICd1JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ0MnLCAnMicsICdfJywgJ20nLCAndScsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICcyJywgJ18nLCAnbScsICd1JywKKyAgJ3gnLCAnaScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICcyJywgJ18nLCAnbScsICd1JywgJ3gnLCAnaScsICdyJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICcyJywgJ18nLCAnbScsICd1JywgJ3gnLCAncicsICdpJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnQycsICcyJywgJ18nLCAnbicsICdvJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywgJzInLCAnXycsICdvJywKKyAgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywgJzInLCAnXycsICdvJywgJ3InLCAnbicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ0MnLCAnMicsICdfJywgJ3AnLCAneCcsICdmJywgJ2UnLCAncicsICdfJywgJ20nLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnQycsICcyJywgJ18nLCAndCcsICdmJywgJ3InLCAncCcsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICcyJywKKyAgJ18nLCAndCcsICdmJywgJ3InLCAncicsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICcyJywgJ18nLCAndicsICdpJywKKyAgJ3QnLCAncCcsICdhJywgJ2MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnMicsICdfJywgJ3YnLCAnbScsICd1JywKKyAgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywgJzInLCAnXycsICd4JywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ0MnLCAnNCcsICdfJywgJ2EnLCAnbicsICdkJywgJ18nLCAnYScsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywKKyAgJzQnLCAnXycsICdhJywgJ24nLCAnZCcsICdfJywgJ2EnLCAnbicsICdkJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywKKyAgJzQnLCAnXycsICdhJywgJ24nLCAnZCcsICdfJywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnNCcsICdfJywKKyAgJ2EnLCAnbicsICdkJywgJ18nLCAnbycsICdyJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywgJzQnLCAnXycsICdjJywKKyAgJ20nLCAncCcsICdsJywgJ3QnLCAnZScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnNCcsICdfJywgJ2MnLCAnbScsICdwJywKKyAgJ2wnLCAndCcsICdlJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywgJzQnLCAnXycsICdjJywgJ20nLCAncCcsICdsJywKKyAgJ3QnLCAnZScsICd1JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICc0JywgJ18nLCAnYycsICdtJywgJ3AnLCAnbCcsICd0JywKKyAgJ2UnLCAndScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICc0JywgJ18nLCAnYycsICdtJywgJ3AnLCAnbicsICdlJywKKyAgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywgJzQnLCAnXycsICdjJywgJ20nLCAncCcsICduJywgJ2UnLCAncScsICdpJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICc0JywgJ18nLCAnZicsICdhJywgJ3MnLCAndCcsICdjJywgJ28nLCAncicsICduJywKKyAgJ2UnLCAncicsICc5JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICc0JywgJ18nLCAnZicsICdhJywgJ3MnLCAndCcsICdjJywKKyAgJ28nLCAncicsICduJywgJ2UnLCAncicsICc5JywgJ18nLCAnbicsICdvJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywKKyAgJzQnLCAnXycsICduJywgJ2InLCAnaScsICd0JywgJ3MnLCAnYycsICdsJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdDJywKKyAgJzQnLCAnXycsICduJywgJ2InLCAnaScsICd0JywgJ3MnLCAnYycsICdsJywgJ3InLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ0MnLCAnNCcsICdfJywgJ24nLCAnYicsICdpJywgJ3QnLCAncycsICdzJywgJ2UnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ0MnLCAnNCcsICdfJywgJ28nLCAncicsICdfJywgJ2EnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnQycsICc0JywKKyAgJ18nLCAnbycsICdyJywgJ18nLCAnYScsICduJywgJ2QnLCAnbicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnNCcsICdfJywKKyAgJ28nLCAncicsICdfJywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0MnLCAnNCcsICdfJywgJ28nLCAncicsICdfJywKKyAgJ28nLCAncicsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAnYycsICdvJywgJ24nLCAndicsICdfJywKKyAgJ2QnLCAnMicsICdkJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdjJywgJ28nLCAnbicsICd2JywKKyAgJ18nLCAnZCcsICcyJywgJ3MnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ2MnLCAnbycsICduJywKKyAgJ3YnLCAnXycsICdkJywgJ2YnLCAnMicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAnYycsICdvJywKKyAgJ24nLCAndicsICdfJywgJ2QnLCAnZicsICcyJywgJ2QnLCAnXycsICdjJywgJ2gnLCAnbycsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnRicsICcyJywgJ18nLCAnYycsICdvJywgJ24nLCAndicsICdfJywgJ2QnLCAnZicsICcyJywgJ3MnLCAnZicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ2MnLCAnbycsICduJywgJ3YnLCAnXycsICdkJywgJ2YnLCAnMicsICd1JywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdjJywgJ28nLCAnbicsICd2JywgJ18nLCAnZCcsICdmJywKKyAgJzInLCAndScsICdkJywgJ18nLCAnYycsICdoJywgJ28nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywKKyAgJ2MnLCAnbycsICduJywgJ3YnLCAnXycsICdkJywgJ2YnLCAnMicsICd1JywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywKKyAgJzInLCAnXycsICdjJywgJ28nLCAnbicsICd2JywgJ18nLCAnZCcsICdmJywgJzInLCAndScsICd3JywgJ18nLCAnYycsICdoJywKKyAgJ28nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ2MnLCAnbycsICduJywgJ3YnLCAnXycsICdkJywKKyAgJ2YnLCAnMicsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAnYycsICdvJywgJ24nLCAndicsICdfJywKKyAgJ2QnLCAnZicsICcyJywgJ3cnLCAnXycsICdjJywgJ2gnLCAnbycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywKKyAgJ18nLCAnYycsICdvJywgJ24nLCAndicsICdfJywgJ3MnLCAnZicsICcyJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywKKyAgJzInLCAnXycsICdjJywgJ28nLCAnbicsICd2JywgJ18nLCAncycsICdmJywgJzInLCAnZCcsICdfJywgJ2MnLCAnaCcsICdvJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdjJywgJ28nLCAnbicsICd2JywgJ18nLCAncycsICdmJywKKyAgJzInLCAnZCcsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAnYycsICdvJywgJ24nLCAndicsICdfJywKKyAgJ3MnLCAnZicsICcyJywgJ3UnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ2MnLCAnbycsICduJywKKyAgJ3YnLCAnXycsICdzJywgJ2YnLCAnMicsICd1JywgJ2QnLCAnXycsICdjJywgJ2gnLCAnbycsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnRicsICcyJywgJ18nLCAnYycsICdvJywgJ24nLCAndicsICdfJywgJ3MnLCAnZicsICcyJywgJ3UnLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ2MnLCAnbycsICduJywgJ3YnLCAnXycsICdzJywgJ2YnLCAnMicsICd1JywKKyAgJ3cnLCAnXycsICdjJywgJ2gnLCAnbycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAnYycsICdvJywKKyAgJ24nLCAndicsICdfJywgJ3MnLCAnZicsICcyJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdjJywKKyAgJ28nLCAnbicsICd2JywgJ18nLCAncycsICdmJywgJzInLCAndycsICdfJywgJ2MnLCAnaCcsICdvJywgJ3AnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdjJywgJ28nLCAnbicsICd2JywgJ18nLCAndScsICdkJywgJzInLCAnZCcsICdmJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAnYycsICdvJywgJ24nLCAndicsICdfJywgJ3UnLCAnZCcsICcyJywKKyAgJ3MnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ2MnLCAnbycsICduJywgJ3YnLCAnXycsICd1JywKKyAgJ3cnLCAnMicsICdkJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdjJywgJ28nLCAnbicsICd2JywKKyAgJ18nLCAndScsICd3JywgJzInLCAncycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAnYycsICdvJywKKyAgJ24nLCAndicsICdfJywgJ3cnLCAnMicsICdkJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdjJywKKyAgJ28nLCAnbicsICd2JywgJ18nLCAndycsICcyJywgJ3MnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywKKyAgJ2QnLCAnZicsICdjJywgJ2wnLCAnYScsICdzJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdkJywKKyAgJ2YnLCAnYycsICdtJywgJ3AnLCAnZScsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAnZCcsICdmJywKKyAgJ2MnLCAnbScsICdwJywgJ2cnLCAnZScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ2QnLCAnZicsICdjJywKKyAgJ20nLCAncCcsICdnJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdkJywgJ2YnLCAnYycsICdtJywKKyAgJ3AnLCAndScsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAnZCcsICdmJywgJ2knLCAnbScsICdtJywKKyAgJ18nLCAnbicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ2QnLCAnZicsICdpJywgJ20nLCAnbScsICdfJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdzJywgJ2YnLCAnYScsICdkJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdzJywgJ2YnLCAnYycsICdsJywgJ2EnLCAncycsICdzJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnRicsICcyJywgJ18nLCAncycsICdmJywgJ2MnLCAnbScsICdwJywgJ2UnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ0YnLCAnMicsICdfJywgJ3MnLCAnZicsICdjJywgJ20nLCAncCcsICdnJywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywKKyAgJzInLCAnXycsICdzJywgJ2YnLCAnYycsICdtJywgJ3AnLCAnZycsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywKKyAgJ18nLCAncycsICdmJywgJ2MnLCAnbScsICdwJywgJ3UnLCAnbycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywKKyAgJ3MnLCAnZicsICdmJywgJ2knLCAneCcsICd1JywgJ3AnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywKKyAgJ3MnLCAnZicsICdmJywgJ2knLCAneCcsICd1JywgJ3AnLCAnbicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywKKyAgJ3MnLCAnZicsICdmJywgJ2knLCAneCcsICd1JywgJ3AnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywKKyAgJ3MnLCAnZicsICdmJywgJ20nLCAnYScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ3MnLCAnZicsICdmJywKKyAgJ20nLCAnYScsICdfJywgJ2wnLCAnaScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAncycsICdmJywKKyAgJ2YnLCAnbScsICdhJywgJ18nLCAncycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAncycsICdmJywKKyAgJ2YnLCAnbScsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAncycsICdmJywgJ2YnLCAnbScsICdzJywKKyAgJ18nLCAnbCcsICdpJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdGJywgJzInLCAnXycsICdzJywgJ2YnLCAnaScsICdtJywKKyAgJ20nLCAnXycsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnRicsICcyJywgJ18nLCAncycsICdmJywgJ2knLCAnbScsICdtJywKKyAgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ3MnLCAnZicsICdtJywgJ2EnLCAneCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywgJ3MnLCAnZicsICdtJywgJ2knLCAnbicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ0YnLCAnMicsICdfJywgJ3MnLCAnZicsICdtJywgJ3AnLCAneScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0YnLCAnMicsICdfJywKKyAgJ3MnLCAnZicsICdzJywgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ0wnLCAnMicsICdfJywgJ2wnLCAnbycsICdhJywKKyAgJ2QnLCAndycsICdfJywgJ2wnLCAnbycsICdjJywgJ2snLCAnZScsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTCcsICc0JywKKyAgJ18nLCAnbCcsICdvJywgJ2EnLCAnZCcsICdkJywgJ18nLCAnbCcsICdvJywgJ2MnLCAnaycsICdlJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdhJywgJ2MnLCAnYycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywKKyAgJ18nLCAnYScsICdjJywgJ2MnLCAnaScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnYycsICdtJywKKyAgJ2EnLCAnYycsICdpJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnYycsICdtJywKKyAgJ2EnLCAnYycsICdyJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnYycsICdtJywKKyAgJ2EnLCAnYycsICdzJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnYycsICdtJywKKyAgJ2EnLCAnYycsICdzJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnYycsICdtJywKKyAgJ2EnLCAnYycsICdzJywgJ2MnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdjJywKKyAgJ20nLCAnYScsICdjJywgJ3MnLCAnYycsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ2MnLCAnbScsICdwJywgJ3knLCAnaScsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ2MnLCAnbScsICdwJywgJ3knLCAncicsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ2MnLCAnbScsICdwJywgJ3knLCAncicsICdzJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywKKyAgJ18nLCAnYycsICdtJywgJ3AnLCAneScsICdyJywgJ3MnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICdjJywgJ20nLCAncCcsICd5JywgJ3InLCAncycsICdjJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnTScsICcyJywgJ18nLCAnYycsICdtJywgJ3AnLCAneScsICdyJywgJ3MnLCAnYycsICdfJywgJ3MnLCAnMScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ2MnLCAnbScsICdwJywgJ3knLCAncycsICdfJywgJ3MnLCAnMCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ2MnLCAnbScsICdwJywgJ3knLCAncycsICdfJywgJ3MnLCAnMScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ2MnLCAnbScsICdwJywgJ3knLCAncycsICdjJywgJ18nLCAncycsICcwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnYycsICdtJywgJ3AnLCAneScsICdzJywgJ2MnLCAnXycsICdzJywKKyAgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdjJywgJ24nLCAnYScsICdjJywgJ3MnLCAnXycsICdzJywKKyAgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdjJywgJ24nLCAnYScsICdjJywgJ3MnLCAnXycsICdzJywKKyAgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdjJywgJ24nLCAnYScsICdjJywgJ3MnLCAnYycsICdfJywKKyAgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ2MnLCAnbicsICdhJywgJ2MnLCAncycsICdjJywKKyAgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnZCcsICdwJywgJ20nLCAncCcsICd5JywKKyAgJ3MnLCAncycsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywKKyAgJ18nLCAnZCcsICdwJywgJ20nLCAncCcsICd5JywgJ3MnLCAncycsICdfJywgJ24nLCAnYScsICdjJywgJ18nLCAncycsICcwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnZCcsICdwJywgJ20nLCAncCcsICd5JywgJ3MnLCAncycsICdfJywKKyAgJ3InLCAnbicsICdkJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnZCcsICdwJywKKyAgJ20nLCAncCcsICd5JywgJ3MnLCAncycsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ2QnLCAncCcsICdtJywgJ3AnLCAneScsICd1JywgJ3UnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ3MnLCAnMCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ2QnLCAncCcsICdtJywgJ3AnLCAneScsICd1JywgJ3UnLCAnXycsICduJywKKyAgJ2EnLCAnYycsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ2QnLCAncCcsICdtJywKKyAgJ3AnLCAneScsICd1JywgJ3UnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdoJywKKyAgJ20nLCAnbScsICdwJywgJ3knLCAnaCcsICdfJywgJ3InLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywKKyAgJ18nLCAnaCcsICdtJywgJ20nLCAncCcsICd5JywgJ2gnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICdoJywgJ20nLCAnbScsICdwJywgJ3knLCAnbCcsICdfJywgJ3InLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnTScsICcyJywgJ18nLCAnaCcsICdtJywgJ20nLCAncCcsICd5JywgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ2EnLCAnYycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywKKyAgJ18nLCAnbScsICdhJywgJ2MnLCAncycsICdpJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywKKyAgJ2EnLCAnYycsICdzJywgJ2knLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAnbScsICdhJywKKyAgJ2MnLCAnaCcsICdzJywgJ18nLCAncicsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywKKyAgJ20nLCAnYScsICdjJywgJ2gnLCAncycsICdfJywgJ3InLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywKKyAgJ18nLCAnbScsICdtJywgJ2EnLCAnYycsICdoJywgJ3MnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICdtJywgJ20nLCAnYScsICdjJywgJ2gnLCAncycsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ00nLCAnMicsICdfJywgJ20nLCAnbScsICdhJywgJ2MnLCAnbCcsICdzJywgJ18nLCAncicsICdzJywgJzAnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ20nLCAnYScsICdjJywgJ2wnLCAncycsICdfJywgJ3InLCAncycsICcxJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdtJywgJ2EnLCAnYycsICdsJywgJ3MnLCAnXycsICdzJywKKyAgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ20nLCAnYScsICdjJywgJ2wnLCAncycsICdfJywKKyAgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAnbScsICdhJywgJ2MnLCAndScsICdoJywKKyAgJ3MnLCAnXycsICdyJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAnbScsICdhJywKKyAgJ2MnLCAndScsICdoJywgJ3MnLCAnXycsICdyJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ20nLCAnbScsICdhJywgJ2MnLCAndScsICdoJywgJ3MnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICdtJywgJ20nLCAnYScsICdjJywgJ3UnLCAnaCcsICdzJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdtJywgJ2EnLCAnYycsICd1JywgJ2wnLCAncycsICdfJywgJ3InLCAncycsICcwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdtJywgJ2EnLCAnYycsICd1JywgJ2wnLCAncycsICdfJywKKyAgJ3InLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdtJywgJ2EnLCAnYycsICd1JywKKyAgJ2wnLCAncycsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAnbScsICdhJywKKyAgJ2MnLCAndScsICdsJywgJ3MnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywKKyAgJ20nLCAncCcsICd5JywgJ2gnLCAnXycsICdyJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ20nLCAnbScsICdwJywgJ3knLCAnaCcsICdfJywgJ3InLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywKKyAgJ18nLCAnbScsICdtJywgJ3AnLCAneScsICdoJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywKKyAgJ18nLCAnbScsICdtJywgJ3AnLCAneScsICdoJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywKKyAgJ18nLCAnbScsICdtJywgJ3AnLCAneScsICdsJywgJ18nLCAncicsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICdtJywgJ20nLCAncCcsICd5JywgJ2wnLCAnXycsICdyJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ00nLCAnMicsICdfJywgJ20nLCAnbScsICdwJywgJ3knLCAnbCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ00nLCAnMicsICdfJywgJ20nLCAnbScsICdwJywgJ3knLCAnbCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ00nLCAnMicsICdfJywgJ20nLCAnbScsICdwJywgJ3knLCAndScsICdoJywgJ18nLCAncicsICdzJywgJzAnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ20nLCAncCcsICd5JywgJ3UnLCAnaCcsICdfJywgJ3InLCAncycsICcxJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdtJywgJ3AnLCAneScsICd1JywgJ2gnLCAnXycsICdzJywKKyAgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ20nLCAncCcsICd5JywgJ3UnLCAnaCcsICdfJywKKyAgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAnbScsICdwJywgJ3knLCAndScsICdsJywKKyAgJ18nLCAncicsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ20nLCAncCcsICd5JywKKyAgJ3UnLCAnbCcsICdfJywgJ3InLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdtJywKKyAgJ3AnLCAneScsICd1JywgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywKKyAgJ20nLCAncCcsICd5JywgJ3UnLCAnbCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ20nLCAncCcsICd5JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICdoJywgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnaCcsICdoJywKKyAgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdhJywKKyAgJ2MnLCAnYycsICdfJywgJ2gnLCAnbCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ20nLCAncCcsICd5JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICdoJywgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnbCcsICdoJywKKyAgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdhJywKKyAgJ2MnLCAnYycsICdfJywgJ2wnLCAnaCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ20nLCAncCcsICd5JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICdsJywgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnbCcsICdsJywKKyAgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdhJywKKyAgJ2MnLCAnYycsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnaCcsICdoJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ3MnLCAnYScsICd0JywKKyAgJ18nLCAnaCcsICdoJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywKKyAgJ3knLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnaCcsICdsJywgJ18nLCAncycsICcwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywKKyAgJ3MnLCAnYScsICd0JywgJ18nLCAnaCcsICdsJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywKKyAgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnbCcsICdoJywKKyAgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdhJywKKyAgJ2MnLCAnYycsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnbCcsICdoJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ3MnLCAnYScsICd0JywKKyAgJ18nLCAnbCcsICdsJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywKKyAgJ3knLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnbCcsICdsJywgJ18nLCAncycsICcxJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdoJywgJ2gnLCAnXycsICdzJywKKyAgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdfJywgJ2gnLCAnaCcsICdfJywKKyAgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAnaCcsICdsJywKKyAgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdoJywKKyAgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdfJywKKyAgJ2wnLCAnaCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywKKyAgJ18nLCAnbCcsICdoJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywKKyAgJ3knLCAnXycsICdsJywgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywKKyAgJ3AnLCAneScsICdfJywgJ2wnLCAnbCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ20nLCAncCcsICd5JywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdoJywgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdfJywgJ24nLCAnYScsICdjJywgJ18nLCAnaCcsICdoJywKKyAgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICduJywKKyAgJ2EnLCAnYycsICdfJywgJ2gnLCAnbCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ20nLCAncCcsICd5JywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdoJywgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdfJywgJ24nLCAnYScsICdjJywgJ18nLCAnbCcsICdoJywKKyAgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICduJywKKyAgJ2EnLCAnYycsICdfJywgJ2wnLCAnaCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ20nLCAncCcsICd5JywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdsJywgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdfJywgJ24nLCAnYScsICdjJywgJ18nLCAnbCcsICdsJywKKyAgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICduJywKKyAgJ2EnLCAnYycsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnaCcsICdoJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICduJywgJ2EnLCAnYycsICdfJywgJ3MnLCAnYScsICd0JywKKyAgJ18nLCAnaCcsICdoJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywKKyAgJ3knLCAnXycsICduJywgJ2EnLCAnYycsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnaCcsICdsJywgJ18nLCAncycsICcwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICduJywgJ2EnLCAnYycsICdfJywKKyAgJ3MnLCAnYScsICd0JywgJ18nLCAnaCcsICdsJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywKKyAgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICduJywgJ2EnLCAnYycsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnbCcsICdoJywKKyAgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICduJywKKyAgJ2EnLCAnYycsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnbCcsICdoJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICduJywgJ2EnLCAnYycsICdfJywgJ3MnLCAnYScsICd0JywKKyAgJ18nLCAnbCcsICdsJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywKKyAgJ3knLCAnXycsICduJywgJ2EnLCAnYycsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnbCcsICdsJywgJ18nLCAncycsICcxJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdyJywgJ24nLCAnZCcsICdfJywKKyAgJ2gnLCAnaCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywKKyAgJ18nLCAncicsICduJywgJ2QnLCAnXycsICdoJywgJ2gnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdfJywgJ3InLCAnbicsICdkJywgJ18nLCAnaCcsICdsJywgJ18nLCAncycsICcwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdyJywgJ24nLCAnZCcsICdfJywKKyAgJ2gnLCAnbCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywKKyAgJ18nLCAncicsICduJywgJ2QnLCAnXycsICdsJywgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdfJywgJ3InLCAnbicsICdkJywgJ18nLCAnbCcsICdoJywgJ18nLCAncycsICcxJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdyJywgJ24nLCAnZCcsICdfJywKKyAgJ2wnLCAnbCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywKKyAgJ18nLCAncicsICduJywgJ2QnLCAnXycsICdsJywgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnaCcsICdoJywgJ18nLCAncycsICcwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywKKyAgJ2gnLCAnaCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywKKyAgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICdoJywgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnaCcsICdsJywgJ18nLCAncycsICcxJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywKKyAgJ2wnLCAnaCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywKKyAgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICdsJywgJ2gnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnbCcsICdsJywgJ18nLCAncycsICcwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywKKyAgJ2wnLCAnbCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywKKyAgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICdyJywgJ24nLCAnZCcsICdfJywgJ2gnLCAnaCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICdyJywKKyAgJ24nLCAnZCcsICdfJywgJ2gnLCAnaCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ20nLCAncCcsICd5JywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICdyJywgJ24nLCAnZCcsICdfJywgJ2gnLCAnbCcsICdfJywKKyAgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAncycsICdhJywKKyAgJ3QnLCAnXycsICdyJywgJ24nLCAnZCcsICdfJywgJ2gnLCAnbCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICdyJywgJ24nLCAnZCcsICdfJywKKyAgJ2wnLCAnaCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywKKyAgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICdyJywgJ24nLCAnZCcsICdfJywgJ2wnLCAnaCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICdyJywKKyAgJ24nLCAnZCcsICdfJywgJ2wnLCAnbCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ20nLCAncCcsICd5JywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICdyJywgJ24nLCAnZCcsICdfJywgJ2wnLCAnbCcsICdfJywKKyAgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ18nLCAndScsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnXycsICd1JywgJ3AnLCAnXycsICdzJywKKyAgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdfJywgJ3UnLCAncCcsICdfJywKKyAgJ3MnLCAnMScsICdfJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywKKyAgJ3knLCAnZCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnaCcsICdoJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnaCcsICdoJywKKyAgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsICdfJywKKyAgJ2EnLCAnYycsICdjJywgJ18nLCAnaCcsICdsJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywKKyAgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnaCcsICdsJywgJ18nLCAncycsICcxJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsICdfJywgJ2EnLCAnYycsICdjJywKKyAgJ18nLCAnbCcsICdoJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywKKyAgJ3knLCAnZCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnbCcsICdoJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnbCcsICdsJywKKyAgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsICdfJywKKyAgJ2EnLCAnYycsICdjJywgJ18nLCAnbCcsICdsJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywKKyAgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsICdfJywgJ2gnLCAnaCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ2QnLCAnXycsICdoJywgJ2gnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdkJywgJ18nLCAnaCcsICdsJywgJ18nLCAncycsICcwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAnZCcsICdfJywgJ2gnLCAnbCcsICdfJywKKyAgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ2QnLCAnXycsICdsJywKKyAgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdkJywKKyAgJ18nLCAnbCcsICdoJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywKKyAgJ3knLCAnZCcsICdfJywgJ2wnLCAnbCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ20nLCAncCcsICd5JywgJ2QnLCAnXycsICdsJywgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdkJywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdoJywgJ2gnLCAnXycsICdzJywKKyAgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdkJywgJ18nLCAnbicsICdhJywKKyAgJ2MnLCAnXycsICdoJywgJ2gnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywKKyAgJ3AnLCAneScsICdkJywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdoJywgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdkJywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdoJywKKyAgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdkJywKKyAgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdsJywgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdkJywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdsJywgJ2gnLCAnXycsICdzJywKKyAgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdkJywgJ18nLCAnbicsICdhJywKKyAgJ2MnLCAnXycsICdsJywgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywKKyAgJ3AnLCAneScsICdkJywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdsJywgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdkJywgJ18nLCAncicsICduJywgJ2QnLCAnXycsICdoJywKKyAgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdkJywKKyAgJ18nLCAncicsICduJywgJ2QnLCAnXycsICdoJywgJ2gnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdkJywgJ18nLCAncicsICduJywgJ2QnLCAnXycsICdoJywgJ2wnLCAnXycsICdzJywKKyAgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdkJywgJ18nLCAncicsICduJywKKyAgJ2QnLCAnXycsICdoJywgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywKKyAgJ3AnLCAneScsICdkJywgJ18nLCAncicsICduJywgJ2QnLCAnXycsICdsJywgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdkJywgJ18nLCAncicsICduJywgJ2QnLCAnXycsICdsJywKKyAgJ2gnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdkJywKKyAgJ18nLCAncicsICduJywgJ2QnLCAnXycsICdsJywgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdkJywgJ18nLCAncicsICduJywgJ2QnLCAnXycsICdsJywgJ2wnLCAnXycsICdzJywKKyAgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdpJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAncycsICdtJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICdtJywgJ3AnLCAneScsICdzJywgJ3UnLCAnXycsICd1JywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICdoJywgJ2gnLCAnXycsICdzJywKKyAgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ18nLCAnYScsICdjJywKKyAgJ2MnLCAnXycsICdoJywgJ2gnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywKKyAgJ3AnLCAneScsICd1JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICdoJywgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICdoJywKKyAgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywKKyAgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICdsJywgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICdsJywgJ2gnLCAnXycsICdzJywKKyAgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ18nLCAnYScsICdjJywKKyAgJ2MnLCAnXycsICdsJywgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywKKyAgJ3AnLCAneScsICd1JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICdsJywgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ18nLCAnaCcsICdoJywgJ18nLCAncycsICcwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdfJywgJ2gnLCAnaCcsICdfJywKKyAgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnXycsICdoJywKKyAgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywKKyAgJ18nLCAnaCcsICdsJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywKKyAgJ3knLCAndScsICdfJywgJ2wnLCAnaCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ20nLCAncCcsICd5JywgJ3UnLCAnXycsICdsJywgJ2gnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ18nLCAnbCcsICdsJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdfJywgJ2wnLCAnbCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnXycsICduJywgJ2EnLCAnYycsICdfJywKKyAgJ2gnLCAnaCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywKKyAgJ3UnLCAnXycsICduJywgJ2EnLCAnYycsICdfJywgJ2gnLCAnaCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnXycsICduJywgJ2EnLCAnYycsICdfJywgJ2gnLCAnbCcsICdfJywKKyAgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnXycsICduJywKKyAgJ2EnLCAnYycsICdfJywgJ2gnLCAnbCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ20nLCAncCcsICd5JywgJ3UnLCAnXycsICduJywgJ2EnLCAnYycsICdfJywgJ2wnLCAnaCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnXycsICduJywgJ2EnLCAnYycsICdfJywKKyAgJ2wnLCAnaCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywKKyAgJ3UnLCAnXycsICduJywgJ2EnLCAnYycsICdfJywgJ2wnLCAnbCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnXycsICduJywgJ2EnLCAnYycsICdfJywgJ2wnLCAnbCcsICdfJywKKyAgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnXycsICd1JywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ2QnLCAnXycsICdhJywKKyAgJ2MnLCAnYycsICdfJywgJ2gnLCAnaCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ20nLCAncCcsICd5JywgJ3UnLCAnZCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnaCcsICdoJywgJ18nLCAncycsICcxJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdkJywgJ18nLCAnYScsICdjJywKKyAgJ2MnLCAnXycsICdoJywgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywKKyAgJ3AnLCAneScsICd1JywgJ2QnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ2gnLCAnbCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnZCcsICdfJywgJ2EnLCAnYycsICdjJywKKyAgJ18nLCAnbCcsICdoJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywKKyAgJ3knLCAndScsICdkJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICdsJywgJ2gnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ2QnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywKKyAgJ2wnLCAnbCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywKKyAgJ3UnLCAnZCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnbCcsICdsJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdkJywgJ18nLCAnaCcsICdoJywgJ18nLCAncycsICcwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdkJywgJ18nLCAnaCcsICdoJywKKyAgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdkJywKKyAgJ18nLCAnaCcsICdsJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywKKyAgJ3knLCAndScsICdkJywgJ18nLCAnaCcsICdsJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywKKyAgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdkJywgJ18nLCAnbCcsICdoJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdkJywgJ18nLCAnbCcsICdoJywgJ18nLCAncycsICcxJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdkJywgJ18nLCAnbCcsICdsJywKKyAgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdkJywKKyAgJ18nLCAnbCcsICdsJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywKKyAgJ3knLCAndScsICdkJywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdoJywgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ2QnLCAnXycsICduJywgJ2EnLCAnYycsICdfJywKKyAgJ2gnLCAnaCcsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywKKyAgJ3UnLCAnZCcsICdfJywgJ24nLCAnYScsICdjJywgJ18nLCAnaCcsICdsJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdkJywgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdoJywKKyAgJ2wnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywKKyAgJ2QnLCAnXycsICduJywgJ2EnLCAnYycsICdfJywgJ2wnLCAnaCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnZCcsICdfJywgJ24nLCAnYScsICdjJywgJ18nLCAnbCcsICdoJywKKyAgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAnbScsICdwJywgJ3knLCAndScsICdkJywKKyAgJ18nLCAnbicsICdhJywgJ2MnLCAnXycsICdsJywgJ2wnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICdtJywgJ3AnLCAneScsICd1JywgJ2QnLCAnXycsICduJywgJ2EnLCAnYycsICdfJywgJ2wnLCAnbCcsICdfJywKKyAgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ20nLCAncCcsICd5JywgJ3UnLCAnaScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ24nLCAnYScsICdjJywgJ2MnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ00nLCAnMicsICdfJywgJ24nLCAnYScsICdjJywgJ2MnLCAnaScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywKKyAgJ18nLCAncycsICd1JywgJ2InLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICd2JywKKyAgJ2EnLCAnYicsICdzJywgJ2QnLCAnaScsICdmJywgJ2YnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ3YnLCAnYScsICdiJywgJ3MnLCAnZCcsICdpJywgJ2YnLCAnZicsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywKKyAgJ18nLCAndicsICdjJywgJ20nLCAnYScsICdjJywgJ18nLCAncycsICcwJywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICdpJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdjJywgJ20nLCAnYScsICdjJywgJ18nLCAncycsICcwJywKKyAgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdjJywKKyAgJ20nLCAncCcsICd5JywgJ18nLCAncycsICcwJywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICdpJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICd5JywgJ18nLCAncycsICcwJywgJ18nLCAncycsICdhJywKKyAgJ3QnLCAnXycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICd5JywKKyAgJ18nLCAncycsICcxJywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywKKyAgJ18nLCAndicsICdjJywgJ20nLCAncCcsICd5JywgJ18nLCAncycsICcxJywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICdyJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdkJywgJ20nLCAnYScsICdjJywgJ3MnLCAnXycsICdzJywKKyAgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICd2JywgJ2QnLCAnbScsICdhJywgJ2MnLCAncycsICdfJywKKyAgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdyJywKKyAgJ3MnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICd2JywgJ2QnLCAnbScsICdwJywKKyAgJ3knLCAncicsICdzJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdkJywKKyAgJ20nLCAncCcsICd5JywgJ3MnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICd2JywKKyAgJ2QnLCAnbScsICdwJywgJ3knLCAncycsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ3YnLCAnbScsICdhJywgJ2MnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAnbScsICdhJywKKyAgJ2MnLCAnMicsICdlJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICd2JywgJ20nLCAnYScsICdjJywKKyAgJzInLCAnZScsICdzJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdtJywKKyAgJ2EnLCAnYycsICcyJywgJ2UnLCAncycsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ3YnLCAnbScsICdhJywgJ2MnLCAnMicsICdzJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywKKyAgJ18nLCAndicsICdtJywgJ2EnLCAnYycsICcyJywgJ3MnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICd2JywgJ20nLCAnYScsICdjJywgJzInLCAncycsICd1JywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdtJywgJ2EnLCAnYycsICcyJywgJ3MnLCAndScsICdfJywgJ3MnLCAnMScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnMicsICdlJywgJ3MnLCAnXycsICdzJywKKyAgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJzInLCAnZScsICdzJywKKyAgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICcyJywKKyAgJ3MnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICd2JywgJ20nLCAncCcsICd5JywKKyAgJzInLCAncycsICdfJywgJ3MnLCAnMCcsICdwJywgJ2EnLCAnYycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywKKyAgJ18nLCAndicsICdtJywgJ3AnLCAneScsICcyJywgJ3MnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzInLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJzInLCAncycsICdfJywgJ3MnLCAnMScsICdwJywgJ2EnLCAnYycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICcyJywgJ3MnLCAndScsICdfJywKKyAgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnMicsICdzJywKKyAgJ3UnLCAnXycsICdzJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICd2JywgJ3InLCAnYScsICdkJywKKyAgJ2QnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAncicsICdhJywgJ2QnLCAnZCcsICd1JywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICd2JywgJ3InLCAnYycsICdtJywgJ2EnLCAnYycsICdpJywKKyAgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdyJywgJ2MnLCAnbScsICdhJywKKyAgJ2MnLCAnaScsICdfJywgJ3MnLCAnMCcsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdyJywKKyAgJ2MnLCAnbScsICdhJywgJ2MnLCAncicsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywKKyAgJ3YnLCAncicsICdjJywgJ20nLCAnYScsICdjJywgJ3InLCAnXycsICdzJywgJzAnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ00nLCAnMicsICdfJywgJ3YnLCAncicsICdjJywgJ20nLCAncCcsICd5JywgJ2knLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzInLCAnXycsICd2JywgJ3InLCAnYycsICdtJywgJ3AnLCAneScsICdpJywgJ18nLCAncycsICcwJywKKyAgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzInLCAnXycsICd2JywgJ3InLCAnYycsICdtJywgJ3AnLCAneScsICdyJywKKyAgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdyJywgJ2MnLCAnbScsICdwJywKKyAgJ3knLCAncicsICdfJywgJ3MnLCAnMCcsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdyJywKKyAgJ2MnLCAnbScsICdwJywgJ3knLCAncycsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdyJywgJ2MnLCAnbScsICdwJywgJ3knLCAncycsICdfJywgJ3MnLCAnMScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ00nLCAnMicsICdfJywgJ3YnLCAncicsICdjJywgJ20nLCAncCcsICd5JywgJ3MnLCAnXycsICdzJywKKyAgJzEnLCAncicsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdyJywgJ20nLCAnYScsICdjJywKKyAgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywKKyAgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICcyJywgJ18nLCAneCcsICdvJywgJ3InLCAnXycsICd4JywKKyAgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc0JywgJ18nLCAnYScsICduJywgJ2QnLCAnXycsICdhJywKKyAgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ2EnLCAnbicsICdkJywgJ18nLCAnYScsICduJywKKyAgJ2QnLCAnbicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ2EnLCAnbicsICdkJywgJ18nLCAnbycsICdyJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc0JywgJ18nLCAnYScsICduJywgJ2QnLCAnXycsICd4JywgJ28nLCAncicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ2MnLCAnbScsICdwJywgJ3knLCAnaScsICdfJywgJ3cnLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ2MnLCAnbScsICdwJywgJ3knLCAnaScsICdfJywgJ3cnLCAnaCcsICdjJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc0JywgJ18nLCAnYycsICdtJywgJ3AnLCAneScsICdyJywgJ18nLCAndycsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc0JywgJ18nLCAnYycsICdtJywgJ3AnLCAneScsICdyJywgJ18nLCAndycsICdoJywKKyAgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzQnLCAnXycsICdtJywgJ2EnLCAnYycsICdfJywgJ3UnLCAncCcsICdfJywKKyAgJ3MnLCAnMScsICdfJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc0JywgJ18nLCAnbScsICdwJywKKyAgJ3knLCAncicsICdpJywgJ18nLCAnYScsICdkJywgJ2QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywKKyAgJ20nLCAncCcsICd5JywgJ3InLCAnaScsICdfJywgJ2EnLCAnZCcsICdkJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzQnLCAnXycsICdtJywgJ3AnLCAneScsICdyJywgJ2knLCAnXycsICdhJywgJ2QnLCAnZCcsICdyJywgJ18nLCAndScsICcyJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc0JywgJ18nLCAnbScsICdwJywgJ3knLCAncicsICdyJywgJ18nLCAnYScsICdkJywKKyAgJ2QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ20nLCAncCcsICd5JywgJ3InLCAncicsICdfJywKKyAgJ2EnLCAnZCcsICdkJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzQnLCAnXycsICduJywgJ2EnLCAnYycsICdfJywKKyAgJ3UnLCAncCcsICdfJywgJ3MnLCAnMScsICdfJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc0JywKKyAgJ18nLCAnbycsICdyJywgJ18nLCAnYScsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzQnLCAnXycsICdvJywKKyAgJ3InLCAnXycsICdhJywgJ24nLCAnZCcsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc0JywgJ18nLCAnbycsICdyJywKKyAgJ18nLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc0JywgJ18nLCAnbycsICdyJywgJ18nLCAneCcsICdvJywKKyAgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzQnLCAnXycsICdwJywgJ20nLCAncCcsICd5JywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzQnLCAnXycsICdwJywgJ20nLCAncCcsICd5JywgJ3cnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ3YnLCAncCcsICdtJywgJ3AnLCAneScsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnTScsICc0JywgJ18nLCAndicsICdwJywgJ20nLCAncCcsICd5JywgJ2gnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICdlJywgJ2gnLCAnXycsICdhJywKKyAgJ2MnLCAnYycsICdfJywgJ3MnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ3YnLCAncicsICdtJywKKyAgJ3AnLCAneScsICdlJywgJ2gnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJ3MnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ00nLCAnNCcsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICdlJywgJ2gnLCAnXycsICdzJywgJzAnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzQnLCAnXycsICd2JywgJ3InLCAnbScsICdwJywgJ3knLCAnZScsICdoJywgJ18nLCAncycsICcxJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc0JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ28nLCAnaCcsICdfJywKKyAgJ2EnLCAnYycsICdjJywgJ18nLCAncycsICcwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc0JywgJ18nLCAndicsICdyJywKKyAgJ20nLCAncCcsICd5JywgJ28nLCAnaCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAncycsICcxJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnTScsICc0JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ28nLCAnaCcsICdfJywgJ3MnLCAnMCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ00nLCAnNCcsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICdvJywgJ2gnLCAnXycsICdzJywKKyAgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywgJzQnLCAnXycsICd4JywgJ28nLCAncicsICdfJywgJ2EnLCAnbicsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc0JywgJ18nLCAneCcsICdvJywgJ3InLCAnXycsICdhJywgJ24nLCAnZCcsICduJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc0JywgJ18nLCAneCcsICdvJywgJ3InLCAnXycsICdvJywgJ3InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzQnLCAnXycsICd4JywgJ28nLCAncicsICdfJywgJ3gnLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzUnLCAnXycsICd2JywgJ2QnLCAnbScsICdhJywgJ2MnLCAnYicsICdzJywgJ3UnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzUnLCAnXycsICd2JywgJ2QnLCAnbScsICdwJywgJ3knLCAnYicsICdzJywgJ3UnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdNJywgJzUnLCAnXycsICd2JywgJ20nLCAnYScsICdjJywgJ2InLCAncycsICd1JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnTScsICc1JywgJ18nLCAndicsICdtJywgJ2EnLCAnYycsICdiJywgJ3UnLCAndScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ00nLCAnNScsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnYicsICdzJywgJ3UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzUnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2InLCAndScsICd1JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc1JywKKyAgJ18nLCAndicsICdyJywgJ20nLCAnYScsICdjJywgJ2InLCAncycsICd1JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc1JywKKyAgJ18nLCAndicsICdyJywgJ20nLCAnYScsICdjJywgJ2InLCAndScsICd1JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc1JywKKyAgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ2InLCAncycsICd1JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc1JywKKyAgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ2InLCAndScsICd1JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnTScsICc2JywKKyAgJ18nLCAndicsICdhJywgJ2InLCAncycsICdkJywgJ2knLCAnZicsICdmJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdNJywKKyAgJzYnLCAnXycsICd2JywgJ2EnLCAnYicsICdzJywgJ2QnLCAnaScsICdmJywgJ2YnLCAndScsICdiJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdkJywgJ2QnLCAnYScsICdzJywgJ2wnLCAnXycsICdyJywgJ3InLCAncicsICdpJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ2wnLCAnXycsICdpJywgJ18nLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdsJywgJ18nLCAnaScsICdfJywgJ3AnLCAnXycsICdhJywKKyAgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdsJywgJ18nLCAnaScsICdfJywKKyAgJ3AnLCAnXycsICdhJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdsJywKKyAgJ18nLCAnaScsICdfJywgJ3AnLCAnXycsICduJywgJ2EnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywKKyAgJ2EnLCAncycsICdsJywgJ18nLCAnaScsICdfJywgJ3AnLCAnXycsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywKKyAgJzInLCAnXycsICdhJywgJ3MnLCAnbCcsICdfJywgJ2knLCAnXycsICdwJywgJ18nLCAneCcsICdhJywgJ2MnLCAnYycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdsJywgJ18nLCAnaScsICdfJywgJ3InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAnbCcsICdfJywgJ2knLCAnXycsICdyJywgJ18nLCAnYScsICdjJywKKyAgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAnbCcsICdfJywgJ2knLCAnXycsICdyJywKKyAgJ18nLCAnYScsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAnbCcsICdfJywKKyAgJ2knLCAnXycsICdyJywgJ18nLCAnbicsICdhJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywKKyAgJ3MnLCAnbCcsICdfJywgJ2knLCAnXycsICdyJywgJ18nLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywKKyAgJ18nLCAnYScsICdzJywgJ2wnLCAnXycsICdpJywgJ18nLCAncicsICdfJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ2wnLCAnXycsICdpJywgJ18nLCAncicsICdfJywgJ3gnLCAnYScsICdjJywKKyAgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAnbCcsICdfJywgJ2knLCAnXycsICd2JywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAnbCcsICdfJywgJ2knLCAnXycsICd2JywKKyAgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAnbCcsICdfJywgJ3InLCAnXycsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ2wnLCAnXycsICdyJywgJ18nLCAncCcsICdfJywKKyAgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ2wnLCAnXycsICdyJywKKyAgJ18nLCAncCcsICdfJywgJ2EnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywKKyAgJ2wnLCAnXycsICdyJywgJ18nLCAncCcsICdfJywgJ24nLCAnYScsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywKKyAgJ18nLCAnYScsICdzJywgJ2wnLCAnXycsICdyJywgJ18nLCAncCcsICdfJywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdsJywgJ18nLCAncicsICdfJywgJ3AnLCAnXycsICd4JywgJ28nLCAncicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdsJywgJ18nLCAncicsICdfJywgJ3InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAnbCcsICdfJywgJ3InLCAnXycsICdyJywgJ18nLCAnYScsICdjJywKKyAgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAnbCcsICdfJywgJ3InLCAnXycsICdyJywKKyAgJ18nLCAnYScsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAnbCcsICdfJywKKyAgJ3InLCAnXycsICdyJywgJ18nLCAnbicsICdhJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywKKyAgJ3MnLCAnbCcsICdfJywgJ3InLCAnXycsICdyJywgJ18nLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywKKyAgJ18nLCAnYScsICdzJywgJ2wnLCAnXycsICdyJywgJ18nLCAncicsICdfJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ2wnLCAnXycsICdyJywgJ18nLCAndicsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ2wnLCAnXycsICdyJywgJ18nLCAndicsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ3InLCAnXycsICdpJywgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywgJ18nLCAnaScsICdfJywgJ3AnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywgJ18nLCAnaScsICdfJywgJ3AnLCAnXycsICdhJywKKyAgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywgJ18nLCAnaScsICdfJywKKyAgJ3AnLCAnXycsICduJywgJ2EnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywKKyAgJ18nLCAnaScsICdfJywgJ3AnLCAnXycsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywKKyAgJ3MnLCAncicsICdfJywgJ2knLCAnXycsICdwJywgJ18nLCAncicsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywKKyAgJzInLCAnXycsICdhJywgJ3MnLCAncicsICdfJywgJ2knLCAnXycsICdwJywgJ18nLCAncicsICduJywgJ2QnLCAnXycsICdnJywKKyAgJ28nLCAnbycsICdkJywgJ3MnLCAneScsICduJywgJ3QnLCAnYScsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywKKyAgJ18nLCAnYScsICdzJywgJ3InLCAnXycsICdpJywgJ18nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywKKyAgJ2EnLCAncycsICdyJywgJ18nLCAnaScsICdfJywgJ3InLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywgJ18nLCAnaScsICdfJywgJ3InLCAnXycsICdhJywgJ24nLCAnZCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywgJ18nLCAnaScsICdfJywgJ3InLCAnXycsICduJywKKyAgJ2EnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywgJ18nLCAnaScsICdfJywKKyAgJ3InLCAnXycsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywgJ3MnLCAncicsICdfJywKKyAgJ2knLCAnXycsICdyJywgJ18nLCAncicsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywKKyAgJ3MnLCAncicsICdfJywgJ2knLCAnXycsICdyJywgJ18nLCAncicsICduJywgJ2QnLCAnXycsICdnJywgJ28nLCAnbycsICdkJywKKyAgJ3MnLCAneScsICduJywgJ3QnLCAnYScsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywKKyAgJ3InLCAnXycsICdpJywgJ18nLCAncycsICd2JywgJ3cnLCAnXycsICd0JywgJ3InLCAndScsICduJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ3InLCAnXycsICdpJywgJ18nLCAndicsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ3InLCAnXycsICdpJywgJ18nLCAndicsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ3InLCAnXycsICdyJywgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywgJ18nLCAncicsICdfJywgJ3AnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywgJ18nLCAncicsICdfJywgJ3AnLCAnXycsICdhJywKKyAgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywgJ18nLCAncicsICdfJywKKyAgJ3AnLCAnXycsICduJywgJ2EnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywKKyAgJ18nLCAncicsICdfJywgJ3AnLCAnXycsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdhJywKKyAgJ3MnLCAncicsICdfJywgJ3InLCAnXycsICdwJywgJ18nLCAneCcsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywKKyAgJzInLCAnXycsICdhJywgJ3MnLCAncicsICdfJywgJ3InLCAnXycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywKKyAgJ18nLCAnYScsICdzJywgJ3InLCAnXycsICdyJywgJ18nLCAncicsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ3InLCAnXycsICdyJywgJ18nLCAncicsICdfJywgJ2EnLCAnbicsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ3InLCAnXycsICdyJywgJ18nLCAncicsICdfJywKKyAgJ24nLCAnYScsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYScsICdzJywgJ3InLCAnXycsICdyJywKKyAgJ18nLCAncicsICdfJywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywKKyAgJ18nLCAncicsICdfJywgJ3InLCAnXycsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywKKyAgJ2EnLCAncycsICdyJywgJ18nLCAncicsICdfJywgJ3MnLCAndicsICd3JywgJ18nLCAndCcsICdyJywgJ3UnLCAnbicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywgJ18nLCAncicsICdfJywgJ3YnLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2EnLCAncycsICdyJywgJ18nLCAncicsICdfJywgJ3YnLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2InLCAncicsICdlJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywKKyAgJzInLCAnXycsICdiJywgJ3InLCAnZScsICd2JywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdjJywKKyAgJ2EnLCAnYicsICdhJywgJ2MnLCAnZScsICduJywgJ2MnLCAnYicsICdpJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywKKyAgJzInLCAnXycsICdjJywgJ2wnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2MnLCAnbCcsICcwJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdjJywgJ2wnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1MnLCAnMicsICdfJywgJ2MnLCAnbCcsICcxJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdjJywKKyAgJ2wnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2MnLCAnbCcsICdiJywgJ24nLCAnbycsICdyJywKKyAgJ20nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdjJywgJ2wnLCAnYicsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICcyJywgJ18nLCAnYycsICdsJywgJ3InLCAnYicsICdpJywgJ3QnLCAnXycsICdpJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICcyJywgJ18nLCAnYycsICdsJywgJ3InLCAnYicsICdpJywgJ3QnLCAnXycsICdyJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICcyJywgJ18nLCAnYycsICd0JywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdjJywKKyAgJ3QnLCAnMCcsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnYycsICd0JywgJzEnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdjJywgJ3QnLCAnMScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywKKyAgJ18nLCAnZCcsICdlJywgJ2knLCAnbicsICd0JywgJ2UnLCAncicsICdsJywgJ2UnLCAnYScsICd2JywgJ2UnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdlJywgJ3gnLCAndCcsICdyJywgJ2EnLCAnYycsICd0JywgJ3UnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdlJywgJ3gnLCAndCcsICdyJywgJ2EnLCAnYycsICd0JywgJ3UnLCAnXycsICdyJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdlJywgJ3gnLCAndCcsICdyJywgJ2EnLCAnYycsICd0JywKKyAgJ3UnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2UnLCAneCcsICd0JywgJ3InLCAnYScsICdjJywKKyAgJ3QnLCAndScsICdwJywgJ18nLCAncicsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnaScsICduJywKKyAgJ3MnLCAnZScsICdyJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdpJywgJ24nLCAncycsICdlJywKKyAgJ3InLCAndCcsICdfJywgJ3InLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2knLCAnbicsICdzJywKKyAgJ2UnLCAncicsICd0JywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdpJywgJ24nLCAncycsICdlJywKKyAgJ3InLCAndCcsICdwJywgJ18nLCAncicsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnaScsICduJywKKyAgJ3QnLCAnZScsICdyJywgJ2wnLCAnZScsICdhJywgJ3YnLCAnZScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywKKyAgJ2wnLCAnZicsICdzJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdsJywgJ3MnLCAnbCcsICdfJywKKyAgJ3InLCAnXycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsICdzJywgJ2wnLCAnXycsICdyJywKKyAgJ18nLCAncCcsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsICdzJywKKyAgJ2wnLCAnXycsICdyJywgJ18nLCAncCcsICdfJywgJ2EnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywKKyAgJ18nLCAnbCcsICdzJywgJ2wnLCAnXycsICdyJywgJ18nLCAncCcsICdfJywgJ24nLCAnYScsICdjJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsICdzJywgJ2wnLCAnXycsICdyJywgJ18nLCAncCcsICdfJywgJ28nLCAncicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2wnLCAncycsICdsJywgJ18nLCAncicsICdfJywgJ3AnLCAnXycsICd4JywKKyAgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2wnLCAncycsICdsJywgJ18nLCAncicsICdfJywKKyAgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdsJywgJ3MnLCAnbCcsICdfJywgJ3InLCAnXycsICdyJywKKyAgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdsJywgJ3MnLCAnbCcsICdfJywKKyAgJ3InLCAnXycsICdyJywgJ18nLCAnYScsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdsJywKKyAgJ3MnLCAnbCcsICdfJywgJ3InLCAnXycsICdyJywgJ18nLCAnbicsICdhJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywKKyAgJzInLCAnXycsICdsJywgJ3MnLCAnbCcsICdfJywgJ3InLCAnXycsICdyJywgJ18nLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsICdzJywgJ2wnLCAnXycsICdyJywgJ18nLCAndicsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsICdzJywgJ2wnLCAnXycsICdyJywgJ18nLCAndicsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsICdzJywgJ3InLCAnXycsICdpJywgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1MnLCAnMicsICdfJywgJ2wnLCAncycsICdyJywgJ18nLCAnaScsICdfJywgJ3AnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2wnLCAncycsICdyJywgJ18nLCAnaScsICdfJywgJ3AnLCAnXycsICdhJywKKyAgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2wnLCAncycsICdyJywgJ18nLCAnaScsICdfJywKKyAgJ3AnLCAnXycsICduJywgJ2EnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2wnLCAncycsICdyJywKKyAgJ18nLCAnaScsICdfJywgJ3AnLCAnXycsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdsJywKKyAgJ3MnLCAncicsICdfJywgJ2knLCAnXycsICdwJywgJ18nLCAneCcsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1MnLCAnMicsICdfJywgJ2wnLCAncycsICdyJywgJ18nLCAnaScsICdfJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywKKyAgJzInLCAnXycsICdsJywgJ3MnLCAncicsICdfJywgJ2knLCAnXycsICdyJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdsJywgJ3MnLCAncicsICdfJywgJ2knLCAnXycsICdyJywgJ18nLCAnYScsICduJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdsJywgJ3MnLCAncicsICdfJywgJ2knLCAnXycsICdyJywKKyAgJ18nLCAnbicsICdhJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdsJywgJ3MnLCAncicsICdfJywKKyAgJ2knLCAnXycsICdyJywgJ18nLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsICdzJywKKyAgJ3InLCAnXycsICdpJywgJ18nLCAncicsICdfJywgJ3gnLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywKKyAgJzInLCAnXycsICdsJywgJ3MnLCAncicsICdfJywgJ2knLCAnXycsICd2JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywKKyAgJzInLCAnXycsICdsJywgJ3MnLCAncicsICdfJywgJ2knLCAnXycsICd2JywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywKKyAgJzInLCAnXycsICdsJywgJ3MnLCAncicsICdfJywgJ3InLCAnXycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywKKyAgJ18nLCAnbCcsICdzJywgJ3InLCAnXycsICdyJywgJ18nLCAncCcsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsICdzJywgJ3InLCAnXycsICdyJywgJ18nLCAncCcsICdfJywgJ2EnLCAnbicsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsICdzJywgJ3InLCAnXycsICdyJywgJ18nLCAncCcsICdfJywKKyAgJ24nLCAnYScsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsICdzJywgJ3InLCAnXycsICdyJywKKyAgJ18nLCAncCcsICdfJywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ2wnLCAncycsICdyJywKKyAgJ18nLCAncicsICdfJywgJ3AnLCAnXycsICd4JywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywKKyAgJ2wnLCAncycsICdyJywgJ18nLCAncicsICdfJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdsJywKKyAgJ3MnLCAncicsICdfJywgJ3InLCAnXycsICdyJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywKKyAgJzInLCAnXycsICdsJywgJ3MnLCAncicsICdfJywgJ3InLCAnXycsICdyJywgJ18nLCAnYScsICduJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdsJywgJ3MnLCAncicsICdfJywgJ3InLCAnXycsICdyJywgJ18nLCAnbicsICdhJywKKyAgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdsJywgJ3MnLCAncicsICdfJywgJ3InLCAnXycsICdyJywKKyAgJ18nLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsICdzJywgJ3InLCAnXycsICdyJywKKyAgJ18nLCAndicsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAnbCcsICdzJywgJ3InLCAnXycsICdyJywKKyAgJ18nLCAndicsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAncCcsICdhJywgJ2MnLCAnaycsICdoJywKKyAgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdwJywgJ2EnLCAncicsICdpJywgJ3QnLCAneScsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAncycsICdlJywgJ3QnLCAnYicsICdpJywgJ3QnLCAnXycsICdpJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAncycsICdlJywgJ3QnLCAnYicsICdpJywgJ3QnLCAnXycsICdyJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAncycsICdoJywgJ3UnLCAnZicsICdmJywgJ2UnLCAnYicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3MnLCAnaCcsICd1JywgJ2YnLCAnZicsICdlJywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdzJywgJ2gnLCAndScsICdmJywgJ2YnLCAnbycsICdiJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICcyJywgJ18nLCAncycsICdoJywgJ3UnLCAnZicsICdmJywgJ28nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYicsICdyJywgJ2UnLCAndicsICdfJywgJ3MnLCAndCcsICdiJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdiJywgJ3InLCAnZScsICd2JywKKyAgJ18nLCAncycsICd0JywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2InLCAncicsICdlJywgJ3YnLCAnXycsICdzJywgJ3QnLCAnaCcsICdoJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2InLCAncicsICdlJywgJ3YnLCAnXycsICdzJywgJ3QnLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYicsICdyJywgJ2UnLCAndicsICdfJywKKyAgJ3MnLCAndCcsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAncycsICd0JywgJ28nLCAncicsICdlJywKKyAgJ3cnLCAnXycsICdsJywgJ28nLCAnYycsICdrJywgJ2UnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywKKyAgJ3MnLCAndicsICdzJywgJ2EnLCAndCcsICdoJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICdzJywKKyAgJ3YnLCAncycsICdhJywgJ3QnLCAnaCcsICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd0JywKKyAgJ2EnLCAnYicsICdsJywgJ2UnLCAnaScsICdkJywgJ3gnLCAnYicsICdfJywgJ2cnLCAnbycsICdvJywgJ2QnLCAncycsICd5JywKKyAgJ24nLCAndCcsICdhJywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd0JywgJ2EnLCAnYicsICdsJywKKyAgJ2UnLCAnaScsICdkJywgJ3gnLCAnZCcsICdfJywgJ2cnLCAnbycsICdvJywgJ2QnLCAncycsICd5JywgJ24nLCAndCcsICdhJywKKyAgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd0JywgJ2EnLCAnYicsICdsJywgJ2UnLCAnaScsICdkJywKKyAgJ3gnLCAnaCcsICdfJywgJ2cnLCAnbycsICdvJywgJ2QnLCAncycsICd5JywgJ24nLCAndCcsICdhJywgJ3gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd0JywgJ2EnLCAnYicsICdsJywgJ2UnLCAnaScsICdkJywgJ3gnLCAndycsICdfJywKKyAgJ2cnLCAnbycsICdvJywgJ2QnLCAncycsICd5JywgJ24nLCAndCcsICdhJywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywKKyAgJzInLCAnXycsICd0JywgJ28nLCAnZycsICdnJywgJ2wnLCAnZScsICdiJywgJ2knLCAndCcsICdfJywgJ2knLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd0JywgJ28nLCAnZycsICdnJywgJ2wnLCAnZScsICdiJywgJ2knLCAndCcsICdfJywKKyAgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd0JywgJ3MnLCAndCcsICdiJywgJ2knLCAndCcsICdfJywKKyAgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd0JywgJ3MnLCAndCcsICdiJywgJ2knLCAndCcsICdfJywKKyAgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd2JywgJ2EnLCAnbCcsICdpJywgJ2cnLCAnbicsICdpJywKKyAgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd2JywgJ2EnLCAnbCcsICdpJywgJ2cnLCAnbicsICdyJywKKyAgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd2JywgJ2MnLCAnbicsICdlJywgJ2cnLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3YnLCAnYycsICdyJywgJ28nLCAndCcsICdhJywgJ3QnLCAnZScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3YnLCAncicsICdjJywgJ24nLCAnZScsICdnJywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd2JywgJ3InLCAnbicsICdkJywgJ3AnLCAnYScsICdjJywgJ2snLCAndycsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndicsICdyJywgJ24nLCAnZCcsICdwJywgJ2EnLCAnYycsICdrJywKKyAgJ3cnLCAnaCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndicsICdzJywgJ2EnLCAndCcsICdoJywKKyAgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd2JywgJ3MnLCAnYScsICd0JywgJ2gnLCAnYicsICdfJywKKyAgJ24nLCAnbycsICdwJywgJ2EnLCAnYycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndicsICdzJywKKyAgJ2EnLCAndCcsICdoJywgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3YnLCAncycsICdhJywKKyAgJ3QnLCAnaCcsICd1JywgJ2InLCAnXycsICduJywgJ28nLCAncCcsICdhJywgJ2MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1MnLCAnMicsICdfJywgJ3YnLCAncycsICdhJywgJ3QnLCAndycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywKKyAgJ18nLCAndicsICdzJywgJ2EnLCAndCcsICd3JywgJ2gnLCAnXycsICduJywgJ28nLCAncCcsICdhJywgJ2MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3YnLCAncycsICdhJywgJ3QnLCAndycsICd1JywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd2JywgJ3MnLCAnYScsICd0JywgJ3cnLCAndScsICdoJywgJ18nLCAnbicsICdvJywKKyAgJ3AnLCAnYScsICdjJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd2JywgJ3MnLCAncCcsICdsJywKKyAgJ2EnLCAndCcsICdyJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd2JywgJ3MnLCAncCcsICdsJywKKyAgJ2EnLCAndCcsICdyJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd2JywgJ3MnLCAncCcsICdsJywKKyAgJ2knLCAnYycsICdlJywgJ2knLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3YnLCAncycsICdwJywKKyAgJ2wnLCAnaScsICdjJywgJ2UnLCAncicsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndicsICdzJywKKyAgJ3gnLCAndCcsICdiJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzInLCAnXycsICd2JywgJ3MnLCAneCcsICd0JywKKyAgJ2gnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3YnLCAndCcsICdyJywgJ3UnLCAnbicsICdlJywKKyAgJ2gnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3YnLCAndCcsICdyJywgJ3UnLCAnbicsICdlJywKKyAgJ3cnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3YnLCAndCcsICdyJywgJ3UnLCAnbicsICdvJywKKyAgJ2gnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3YnLCAndCcsICdyJywgJ3UnLCAnbicsICdvJywKKyAgJ3cnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnMicsICdfJywgJ3YnLCAneicsICd4JywgJ3QnLCAnYicsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICcyJywgJ18nLCAndicsICd6JywgJ3gnLCAndCcsICdoJywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdTJywgJzQnLCAnXycsICdhJywgJ2QnLCAnZCcsICdhJywgJ2QnLCAnZCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICc0JywgJ18nLCAnYScsICdkJywgJ2QnLCAnaScsICdfJywgJ2EnLCAncycsICdsJywgJ18nLCAncicsICdpJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc0JywgJ18nLCAnYScsICdkJywgJ2QnLCAnaScsICdfJywgJ2wnLCAncycsICdyJywKKyAgJ18nLCAncicsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc0JywgJ18nLCAnYScsICduJywgJ2QnLCAnaScsICdfJywKKyAgJ2EnLCAncycsICdsJywgJ18nLCAncicsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc0JywgJ18nLCAnYScsICduJywKKyAgJ2QnLCAnaScsICdfJywgJ2wnLCAncycsICdyJywgJ18nLCAncicsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc0JywKKyAgJ18nLCAnYycsICdsJywgJ2InLCAnYScsICdkJywgJ2QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNCcsICdfJywKKyAgJ2MnLCAnbCcsICdiJywgJ3AnLCAnYScsICdkJywgJ2QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNCcsICdfJywKKyAgJ2MnLCAnbCcsICdiJywgJ3AnLCAnbicsICdvJywgJ3InLCAnbScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNCcsICdfJywKKyAgJ2UnLCAneCcsICd0JywgJ3InLCAnYScsICdjJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzQnLCAnXycsICdlJywKKyAgJ3gnLCAndCcsICdyJywgJ2EnLCAnYycsICd0JywgJ18nLCAncicsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc0JywKKyAgJ18nLCAnZScsICd4JywgJ3QnLCAncicsICdhJywgJ2MnLCAndCcsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc0JywKKyAgJ18nLCAnZScsICd4JywgJ3QnLCAncicsICdhJywgJ2MnLCAndCcsICdwJywgJ18nLCAncicsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICc0JywgJ18nLCAnbCcsICdzJywgJ2wnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNCcsICdfJywKKyAgJ24nLCAndCcsICdzJywgJ3QnLCAnYicsICdpJywgJ3QnLCAnXycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc0JywKKyAgJ18nLCAnbicsICd0JywgJ3MnLCAndCcsICdiJywgJ2knLCAndCcsICdfJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywKKyAgJzQnLCAnXycsICdvJywgJ3InLCAnXycsICdhJywgJ24nLCAnZCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc0JywKKyAgJ18nLCAnbycsICdyJywgJ18nLCAnYScsICduJywgJ2QnLCAnaScsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc0JywKKyAgJ18nLCAnbycsICdyJywgJ18nLCAnbycsICdyJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzQnLCAnXycsICdvJywKKyAgJ3InLCAnaScsICdfJywgJ2EnLCAncycsICdsJywgJ18nLCAncicsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc0JywKKyAgJ18nLCAnbycsICdyJywgJ2knLCAnXycsICdsJywgJ3MnLCAncicsICdfJywgJ3InLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1MnLCAnNCcsICdfJywgJ3AnLCAnYScsICdyJywgJ2knLCAndCcsICd5JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc0JywKKyAgJ18nLCAncycsICd0JywgJ28nLCAncicsICdlJywgJ2QnLCAnXycsICdsJywgJ28nLCAnYycsICdrJywgJ2UnLCAnZCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1MnLCAnNCcsICdfJywgJ3MnLCAndScsICdiJywgJ2EnLCAnZCcsICdkJywgJ2knLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdTJywgJzQnLCAnXycsICdzJywgJ3UnLCAnYicsICdpJywgJ18nLCAnYScsICdzJywgJ2wnLCAnXycsICdyJywKKyAgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzQnLCAnXycsICdzJywgJ3UnLCAnYicsICdpJywgJ18nLCAnbCcsICdzJywKKyAgJ3InLCAnXycsICdyJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzQnLCAnXycsICd2JywgJ3InLCAnYycsICdyJywKKyAgJ28nLCAndCcsICdhJywgJ3QnLCAnZScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNCcsICdfJywgJ3YnLCAncicsICdjJywKKyAgJ3InLCAnbycsICd0JywgJ2EnLCAndCcsICdlJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywKKyAgJzQnLCAnXycsICd2JywgJ3gnLCAnYScsICdkJywgJ2QnLCAncycsICd1JywgJ2InLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1MnLCAnNCcsICdfJywgJ3YnLCAneCcsICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsICdoJywgJ3InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdTJywgJzQnLCAnXycsICd2JywgJ3gnLCAnYScsICdkJywgJ2QnLCAncycsICd1JywgJ2InLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1MnLCAnNCcsICdfJywgJ3YnLCAneCcsICdzJywgJ3UnLCAnYicsICdhJywgJ2QnLCAnZCcsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc0JywgJ18nLCAndicsICd4JywgJ3MnLCAndScsICdiJywgJ2EnLCAnZCcsICdkJywKKyAgJ2gnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNCcsICdfJywgJ3YnLCAneCcsICdzJywgJ3UnLCAnYicsICdhJywKKyAgJ2QnLCAnZCcsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc1JywgJ18nLCAnYScsICdzJywgJ3InLCAnaCcsICd1JywKKyAgJ2InLCAnXycsICdyJywgJ24nLCAnZCcsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAnZycsICdvJywgJ28nLCAnZCcsICdzJywKKyAgJ3knLCAnbicsICd0JywgJ2EnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNScsICdfJywgJ2EnLCAncycsICdyJywKKyAgJ2gnLCAndScsICdiJywgJ18nLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzUnLCAnXycsICdwJywKKyAgJ28nLCAncCcsICdjJywgJ28nLCAndScsICduJywgJ3QnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNScsICdfJywKKyAgJ3YnLCAnYScsICdzJywgJ3InLCAnaCcsICdyJywgJ24nLCAnZCcsICdfJywgJ2cnLCAnbycsICdvJywgJ2QnLCAncycsICd5JywKKyAgJ24nLCAndCcsICdhJywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzYnLCAnXycsICdyJywgJ28nLCAnbCcsICdfJywKKyAgJ2knLCAnXycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc2JywgJ18nLCAncicsICdvJywgJ2wnLCAnXycsICdpJywKKyAgJ18nLCAncCcsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc2JywgJ18nLCAncicsICdvJywKKyAgJ2wnLCAnXycsICdpJywgJ18nLCAncCcsICdfJywgJ2EnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc2JywKKyAgJ18nLCAncicsICdvJywgJ2wnLCAnXycsICdpJywgJ18nLCAncCcsICdfJywgJ24nLCAnYScsICdjJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnUycsICc2JywgJ18nLCAncicsICdvJywgJ2wnLCAnXycsICdpJywgJ18nLCAncCcsICdfJywgJ28nLCAncicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1MnLCAnNicsICdfJywgJ3InLCAnbycsICdsJywgJ18nLCAnaScsICdfJywgJ3AnLCAnXycsICd4JywKKyAgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc2JywgJ18nLCAncicsICdvJywgJ2wnLCAnXycsICdpJywKKyAgJ18nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNicsICdfJywgJ3InLCAnbycsICdsJywgJ18nLCAnaScsICdfJywKKyAgJ3InLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNicsICdfJywgJ3InLCAnbycsICdsJywKKyAgJ18nLCAnaScsICdfJywgJ3InLCAnXycsICdhJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNicsICdfJywKKyAgJ3InLCAnbycsICdsJywgJ18nLCAnaScsICdfJywgJ3InLCAnXycsICduJywgJ2EnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1MnLCAnNicsICdfJywgJ3InLCAnbycsICdsJywgJ18nLCAnaScsICdfJywgJ3InLCAnXycsICdvJywgJ3InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdTJywgJzYnLCAnXycsICdyJywgJ28nLCAnbCcsICdfJywgJ2knLCAnXycsICdyJywgJ18nLCAneCcsICdhJywKKyAgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1MnLCAnNicsICdfJywgJ3YnLCAncycsICdwJywgJ2wnLCAnYScsICd0JywKKyAgJ3InLCAnYicsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnUycsICc2JywgJ18nLCAndicsICd0JywgJ3InLCAndScsICduJywKKyAgJ2UnLCAnaCcsICdiJywgJ18nLCAncCcsICdwJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdTJywgJzYnLCAnXycsICd2JywKKyAgJ3QnLCAncicsICd1JywgJ24nLCAnbycsICdoJywgJ2InLCAnXycsICdwJywgJ3AnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ2UnLCAneCcsICd0JywgJ3InLCAnYScsICdjJywgJ3QnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ2UnLCAneCcsICd0JywgJ3InLCAnYScsICdjJywgJ3QnLCAndycsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICdoJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICdoJywgJ2knLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAnbCcsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAnbCcsICdvJywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ2wnLCAndicsICdzJywgJ3AnLCAnbCcsICdhJywKKyAgJ3QnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ2wnLCAndicsICdzJywgJ3AnLCAnbCcsICdhJywKKyAgJ3QnLCAnYicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICdsJywKKyAgJ3YnLCAncycsICdwJywgJ2wnLCAnYScsICd0JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICdsJywKKyAgJ3YnLCAncycsICdwJywgJ2wnLCAnYScsICd0JywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAnbCcsICd2JywgJ3MnLCAncCcsICdsJywgJ2EnLCAndCcsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAnbCcsICd2JywgJ3MnLCAncCcsICdsJywgJ2EnLCAndCcsICd3JywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3AnLCAncicsICdlJywgJ2QnLCAnXycsICdhJywKKyAgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3AnLCAncicsICdlJywgJ2QnLCAnXycsICdhJywKKyAgJ24nLCAnZCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICdwJywKKyAgJ3InLCAnZScsICdkJywgJ18nLCAnYScsICduJywgJ2QnLCAnXycsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAncCcsICdyJywgJ2UnLCAnZCcsICdfJywgJ2EnLCAnbicsICdkJywgJ18nLCAnbicsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICdwJywgJ3InLCAnZScsICdkJywgJ18nLCAnbicsICdvJywKKyAgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICdwJywgJ3InLCAnZScsICdkJywgJ18nLCAnbicsICdvJywKKyAgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAncCcsICdyJywKKyAgJ2UnLCAnZCcsICdfJywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3AnLCAncicsICdlJywKKyAgJ2QnLCAnXycsICdvJywgJ3InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAncCcsICdyJywgJ2UnLCAnZCcsICdfJywgJ28nLCAncicsICdfJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICdwJywgJ3InLCAnZScsICdkJywgJ18nLCAnbycsICdyJywgJ18nLCAnbicsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICdwJywgJ3InLCAnZScsICdkJywgJ18nLCAncycsICdjJywKKyAgJ2EnLCAnbCcsICdhJywgJ3InLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3AnLCAncicsICdlJywKKyAgJ2QnLCAnXycsICdzJywgJ2MnLCAnYScsICdsJywgJ2EnLCAncicsICcyJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3AnLCAncicsICdlJywgJ2QnLCAnXycsICdzJywgJ2MnLCAnYScsICdsJywKKyAgJ2EnLCAncicsICcyJywgJ3YnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3AnLCAncicsICdlJywKKyAgJ2QnLCAnXycsICdzJywgJ2MnLCAnYScsICdsJywgJ2EnLCAncicsICcyJywgJ3YnLCAnMicsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICdwJywgJ3InLCAnZScsICdkJywgJ18nLCAneCcsICdvJywKKyAgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICdwJywgJ3InLCAnZScsICdkJywgJ18nLCAneCcsICdvJywKKyAgJ3InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAncycsICdoJywKKyAgJ3UnLCAnZicsICdmJywgJ2UnLCAncScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAncycsICdoJywKKyAgJ3UnLCAnZicsICdmJywgJ2UnLCAncScsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3MnLCAnaCcsICd1JywgJ2YnLCAnZicsICdlJywgJ3EnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3MnLCAnaCcsICd1JywgJ2YnLCAnZicsICdlJywgJ3EnLCAndycsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ1MnLCAnMycsICcyJywgJ2InLCAnXycsICduJywKKyAgJ3EnLCAncCcsICdyJywgJ2UnLCAnZCcsICdfJywgJ2EnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnUycsICczJywgJzInLCAnYicsICdfJywgJ24nLCAncScsICdwJywgJ3InLCAnZScsICdkJywgJ18nLCAnYScsICdpJywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnUycsICczJywKKyAgJzInLCAnYicsICdfJywgJ24nLCAndCcsICdfJywgJ24nLCAncScsICdwJywgJ3InLCAnZScsICdkJywgJ18nLCAnYScsICdpJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdTJywgJzMnLCAnMicsICdiJywgJ18nLCAnbicsICd0JywKKyAgJ18nLCAnbicsICdxJywgJ3AnLCAncicsICdlJywgJ2QnLCAnXycsICdhJywgJ2knLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdTJywgJzMnLCAnMicsICdiJywgJ18nLCAnbicsICd0JywKKyAgJ18nLCAncScsICdwJywgJ3InLCAnZScsICdkJywgJ18nLCAnYScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdTJywgJzMnLCAnMicsICdiJywgJ18nLCAnbicsICd0JywgJ18nLCAncScsICdwJywgJ3InLCAnZScsICdkJywKKyAgJ18nLCAnYScsICdpJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnUycsICczJywgJzInLCAnYicsICdfJywgJ3EnLCAncCcsICdyJywgJ2UnLCAnZCcsICdfJywgJ2EnLCAnaScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnUycsICczJywgJzInLCAnYicsICdfJywgJ3EnLCAncCcsICdyJywKKyAgJ2UnLCAnZCcsICdfJywgJ2EnLCAnaScsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2EnLCAnYicsICdzJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2EnLCAnYicsICdzJywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdhJywgJ2InLCAncycsICdiJywgJ18nLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2EnLCAnYicsICdzJywgJ2InLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnYicsICdzJywgJ2QnLCAnaScsICdmJywKKyAgJ2YnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdiJywgJ3MnLCAnZCcsICdpJywKKyAgJ2YnLCAnZicsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnYScsICdiJywgJ3MnLCAnZCcsICdpJywgJ2YnLCAnZicsICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2EnLCAnYicsICdzJywgJ2QnLCAnaScsICdmJywgJ2YnLCAndScsICdiJywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdiJywgJ3MnLCAnZCcsICdpJywKKyAgJ2YnLCAnZicsICd1JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnYicsICdzJywKKyAgJ2QnLCAnaScsICdmJywgJ2YnLCAndScsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdiJywgJ3MnLCAnZCcsICdpJywgJ2YnLCAnZicsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2InLCAncycsICdkJywgJ2knLCAnZicsICdmJywgJ3cnLCAnXycsICcxJywKKyAgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2InLCAncycsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2InLCAncycsICdoJywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdiJywgJ3MnLCAnaCcsICdfJywKKyAgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2InLCAncycsICdoJywKKyAgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdhJywgJ2InLCAncycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ2InLCAncycsICd3JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnYScsICdiJywgJ3MnLCAndycsICdfJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdhJywgJ2InLCAncycsICd3JywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAnYicsICdfJywgJ2QnLCAndicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAnYicsICdfJywgJ2QnLCAndicsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywKKyAgJ2InLCAnbicsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdiJywKKyAgJ24nLCAncScsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2EnLCAnZCcsICdkJywgJ2InLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywKKyAgJ2QnLCAnYicsICdxJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnYScsICdkJywgJ2QnLCAnYicsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnYScsICdkJywgJ2QnLCAnYicsICdzJywgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ2InLCAncycsICdhJywgJ3QnLCAnXycsICdkJywKKyAgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ2InLCAncycsICdhJywKKyAgJ3QnLCAnXycsICdkJywgJ3YnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAndicsICc2JywKKyAgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdjJywgJ2EnLCAncicsICdyJywgJ3knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICd2JywKKyAgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ2MnLCAnYScsICdyJywgJ3InLCAneScsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ2MnLCAnbCcsICdiJywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ2MnLCAnbCcsICdiJywKKyAgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ2QnLCAnZCcsICdjJywgJ2wnLCAnYicsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ2QnLCAnZCcsICdjJywgJ2wnLCAnYicsICd3JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnYScsICdkJywgJ2QnLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ2gnLCAnXycsICdkJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ2gnLCAnXycsICdkJywgJ3YnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdoJywgJ24nLCAncScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAnaCcsICduJywgJ3EnLCAnXycsICcxJywKKyAgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdoJywKKyAgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ2gnLCAncScsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywKKyAgJ2gnLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywKKyAgJ2gnLCAncycsICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdoJywgJ3MnLCAnYScsICd0JywgJ18nLCAnZCcsICd2JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdoJywgJ3MnLCAnYScsICd0JywgJ18nLCAnZCcsICd2JywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywKKyAgJ2QnLCAnaCcsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdoJywKKyAgJ3cnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ2QnLCAnZCcsICdoJywgJ3cnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnYScsICdkJywgJ2QnLCAnaCcsICd3JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd1JywgJ2InLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndScsICdiJywgJ2gnLCAnXycsICcxJywKKyAgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd1JywKKyAgJ2InLCAnaCcsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ2QnLCAnZCcsICd1JywgJ2InLCAnaCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndScsICdiJywgJ3MnLCAnYScsICd0JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd1JywgJ2InLCAncycsICdhJywKKyAgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ2QnLCAnZCcsICd1JywgJ2InLCAncycsICdhJywgJ3QnLCAnXycsICdkJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ3UnLCAnYicsICdzJywgJ2EnLCAndCcsICdfJywgJ2QnLCAndicsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywKKyAgJ3UnLCAnYicsICd1JywgJ2InLCAnYicsICdfJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd1JywgJ2InLCAndScsICdiJywgJ2InLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywKKyAgJ3UnLCAnaCcsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywKKyAgJ2QnLCAndScsICdoJywgJ3MnLCAnYScsICd0JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndScsICdoJywgJ3MnLCAnYScsICd0JywgJ18nLCAnZCcsICd2JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd1JywgJ2gnLCAncycsICdhJywKKyAgJ3QnLCAnXycsICdkJywgJ3YnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd1JywgJ2gnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnYScsICdkJywgJ2QnLCAndScsICdoJywgJ3cnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd1JywgJ2gnLCAndycsICdfJywgJ2EnLCAnYycsICdjJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd1JywgJ2gnLCAndycsICdfJywKKyAgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnYScsICdkJywgJ2QnLCAndScsICd3JywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd1JywgJ3cnLCAncycsICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd1JywgJ3cnLCAncycsICdhJywKKyAgJ3QnLCAnXycsICdkJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywKKyAgJ3UnLCAndycsICdzJywgJ2EnLCAndCcsICdfJywgJ2QnLCAndicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ3cnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd3JywgJ18nLCAnZCcsICd2JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd3JywgJ18nLCAnZCcsICd2JywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndycsICduJywKKyAgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ3cnLCAnbicsICdxJywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywKKyAgJ2QnLCAndycsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd3JywKKyAgJ3EnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ2QnLCAnZCcsICd3JywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ2QnLCAnZCcsICd3JywgJ3MnLCAnYScsICd0JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndycsICdzJywgJ2EnLCAndCcsICdfJywgJ2QnLCAndicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAndycsICdzJywgJ2EnLCAndCcsICdfJywKKyAgJ2QnLCAndicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2EnLCAnbCcsICdpJywgJ2cnLCAnbicsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ2wnLCAnaScsICdnJywgJ24nLCAnYicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2EnLCAnbCcsICdpJywgJ2cnLCAnbicsICdiJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2EnLCAnbCcsICdpJywgJ2cnLCAnbicsICdiJywgJ2knLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICduJywgJ2QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ24nLCAnZCcsICduJywgJ3EnLCAncicsICd0JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ24nLCAnZCcsICduJywgJ3EnLCAncicsICd0JywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICduJywgJ2QnLCAnbicsICdxJywKKyAgJ3InLCAndCcsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ24nLCAnZCcsICduJywgJ3EnLCAncicsICd0JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ24nLCAnZCcsICdxJywgJ3InLCAndCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICduJywgJ2QnLCAncScsICdyJywgJ3QnLCAnXycsICcxJywKKyAgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ24nLCAnZCcsICdxJywKKyAgJ3InLCAndCcsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ24nLCAnZCcsICdxJywgJ3InLCAndCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICduJywgJ2QnLCAndicsICduJywgJ3EnLCAndicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICduJywgJ2QnLCAndicsICduJywgJ3EnLCAndicsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnbicsICdkJywKKyAgJ3YnLCAncScsICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ24nLCAnZCcsICd2JywKKyAgJ3EnLCAndicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2EnLCAnbicsICdkJywgJ3YnLCAncicsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ24nLCAnZCcsICd2JywgJ3InLCAndCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2EnLCAnbicsICdkJywgJ3YnLCAncicsICd0JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAnbicsICdkJywgJ3YnLCAncicsICd0JywgJ18nLCAnYScsICdjJywKKyAgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ3MnLCAnbCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAnbCcsICdoJywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywKKyAgJ2wnLCAnaCcsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ3MnLCAnbCcsICdoJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAnbCcsICdoJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdsJywgJ2gnLCAndicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdsJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdsJywgJ3cnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAnbCcsICd3JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdsJywgJ3cnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdsJywKKyAgJ3cnLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ2wnLCAndycsICd2JywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywKKyAgJ3InLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ3InLCAnaCcsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywKKyAgJ2gnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywKKyAgJ3InLCAnaCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ3InLCAnaCcsICdiJywgJ3InLCAnbicsICdkJywgJ3MnLCAnYScsICd0JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAncicsICdoJywgJ2InLCAncicsICduJywKKyAgJ2QnLCAncycsICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdhJywgJ3MnLCAncicsICdoJywgJ2InLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywgJ2gnLCAnYicsICdzJywgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywgJ2gnLCAndScsICdiJywKKyAgJ3InLCAnbicsICdkJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ3MnLCAncicsICdoJywgJ3UnLCAnYicsICdyJywgJ24nLCAnZCcsICdzJywgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywgJ2gnLCAndScsICdiJywKKyAgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAncicsICdoJywKKyAgJ3UnLCAnYicsICdzJywgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywgJ2gnLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnYScsICdzJywgJ3InLCAnaCcsICd2JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ3InLCAndScsICdoJywgJ3UnLCAnYicsICdyJywgJ24nLCAnZCcsICdzJywKKyAgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ3InLCAndScsICdoJywKKyAgJ3UnLCAnYicsICdyJywgJ24nLCAnZCcsICdzJywgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywgJ3UnLCAnaCcsICd1JywgJ2InLCAncycsICdhJywKKyAgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywgJ3UnLCAnaCcsICd1JywKKyAgJ2InLCAncycsICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdhJywgJ3MnLCAncicsICd1JywgJ3cnLCAndScsICdoJywgJ3InLCAnbicsICdkJywgJ3MnLCAnYScsICd0JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAncicsICd1JywgJ3cnLCAndScsICdoJywKKyAgJ3InLCAnbicsICdkJywgJ3MnLCAnYScsICd0JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ3InLCAndScsICd3JywgJ3UnLCAnaCcsICdzJywgJ2EnLCAndCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ3InLCAndScsICd3JywgJ3UnLCAnaCcsICdzJywKKyAgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2EnLCAncycsICdyJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywKKyAgJ3cnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ3MnLCAncicsICd3JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2EnLCAncycsICdyJywgJ3cnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywgJ3cnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ3InLCAndycsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ3InLCAndycsICdoJywgJ3InLCAnbicsICdkJywKKyAgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAncicsICd3JywKKyAgJ2gnLCAncicsICduJywgJ2QnLCAncycsICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3MnLCAncicsICd3JywgJ2gnLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywgJ3cnLCAnaCcsICdzJywgJ2EnLCAndCcsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywKKyAgJ3cnLCAndScsICdoJywgJ3InLCAnbicsICdkJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdhJywgJ3MnLCAncicsICd3JywgJ3UnLCAnaCcsICdyJywgJ24nLCAnZCcsICdzJywgJ2EnLCAndCcsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywKKyAgJ3cnLCAndScsICdoJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ3MnLCAncicsICd3JywgJ3UnLCAnaCcsICdzJywgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdyJywgJ3cnLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ3InLCAndycsICd2JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ3MnLCAnaScsICdnJywgJ24nLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAncycsICdzJywgJ2knLCAnZycsICduJywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ3MnLCAnaScsICdnJywKKyAgJ24nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICdzJywgJ3MnLCAnaScsICdnJywKKyAgJ24nLCAncCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2EnLCAndicsICdnJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywKKyAgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ3YnLCAnZycsICdiJywgJ3InLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ3YnLCAnZycsICdiJywgJ3InLCAnbicsICdkJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICd2JywgJ2cnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnYScsICd2JywgJ2cnLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ2gnLCAncicsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ2gnLCAncicsICduJywgJ2QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICd1JywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ3UnLCAnYicsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ3UnLCAnYicsICdyJywKKyAgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICd2JywgJ2cnLCAndScsICdiJywKKyAgJ3InLCAnbicsICdkJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnYScsICd2JywgJ2cnLCAndScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ3YnLCAnZycsICd1JywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICd1JywgJ2gnLCAncicsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ3UnLCAnaCcsICdyJywgJ24nLCAnZCcsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ3UnLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICd2JywgJ2cnLCAndScsICd3JywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnYScsICd2JywgJ2cnLCAndScsICd3JywKKyAgJ3InLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICd1JywKKyAgJ3cnLCAncicsICduJywgJ2QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdhJywKKyAgJ3YnLCAnZycsICd3JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnYScsICd2JywgJ2cnLCAndycsICdyJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnYScsICd2JywgJ2cnLCAndycsICdyJywgJ24nLCAnZCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2MnLCAnbCcsICcwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2MnLCAnbCcsICcwJywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdjJywgJ2wnLCAnMCcsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdjJywgJ2wnLCAnMCcsICd3JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnYycsICdvJywgJ20nLCAnYicsICdpJywgJ24nLCAnZScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnYycsICdvJywgJ20nLCAnYicsICdpJywgJ24nLCAnZScsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICcwJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdkJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2QnLCAnZCcsICcwJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnZCcsICdlJywgJ2EnLCAnbCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywKKyAgJ2UnLCAnYScsICdsJywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdkJywgJ2UnLCAnYScsICdsJywgJ2InLCAnNCcsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdkJywgJ2UnLCAnYScsICdsJywgJ2InLCAnNCcsICd3JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdlJywgJ2EnLCAnbCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywgJ2UnLCAnYScsICdsJywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywgJ2UnLCAnYScsICdsJywgJ3YnLCAnZCcsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywgJ2UnLCAnYScsICdsJywgJ3YnLCAnZCcsICdkJywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdlJywKKyAgJ2wnLCAndCcsICdhJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywgJ2UnLCAnbCcsICd0JywKKyAgJ2EnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywKKyAgJ20nLCAncCcsICd5JywgJ2InLCAndScsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywKKyAgJ20nLCAncCcsICd5JywgJ2InLCAndScsICdzJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAncycsICdfJywgJ2EnLCAnYycsICdjJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywgJ20nLCAncCcsICd5JywgJ2InLCAndScsICdzJywKKyAgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdkJywgJ20nLCAncCcsICd5JywgJ2InLCAndScsICdzJywgJ18nLCAnZCcsICd2JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywgJ20nLCAncCcsICd5JywgJ2InLCAndScsICdzJywgJ18nLCAnZCcsICd2JywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdtJywKKyAgJ3AnLCAneScsICdiJywgJ3UnLCAncycsICdfJywgJ2QnLCAndicsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywgJ20nLCAncCcsICd5JywgJ2InLCAndScsICdzJywgJ18nLCAnZCcsICd2JywKKyAgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdkJywgJ20nLCAncCcsICd5JywgJ2gnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdoJywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywgJ20nLCAncCcsICd5JywgJ2gnLCAnYicsICdfJywgJ2EnLCAnYycsICdjJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywgJ20nLCAncCcsICd5JywgJ2gnLCAnYicsICdfJywKKyAgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdoJywgJ2InLCAnXycsICdkJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2QnLCAnbScsICdwJywgJ3knLCAnaCcsICdiJywgJ18nLCAnZCcsICd2JywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdoJywKKyAgJ2InLCAnXycsICdkJywgJ3YnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdoJywgJ2InLCAnXycsICdkJywgJ3YnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnbScsICdwJywKKyAgJ3knLCAnaCcsICdpJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywKKyAgJ20nLCAncCcsICd5JywgJ2gnLCAnaScsICdzJywgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnbScsICdwJywgJ3knLCAnaCcsICdpJywgJ3MnLCAnYScsICd0JywKKyAgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnbScsICdwJywKKyAgJ3knLCAnaCcsICdpJywgJ3MnLCAnYScsICd0JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywgJ20nLCAncCcsICd5JywgJ2gnLCAncycsICdhJywKKyAgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnbScsICdwJywgJ3knLCAnaCcsICdzJywKKyAgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2QnLCAnbScsICdwJywgJ3knLCAnaCcsICdzJywgJ2EnLCAndCcsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywgJ20nLCAncCcsICd5JywgJ2gnLCAncycsICdhJywgJ3QnLCAnXycsICdhJywKKyAgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2QnLCAnbScsICdwJywgJ3knLCAnaCcsICdzJywgJ3UnLCAnaScsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdoJywgJ3MnLCAndScsICdpJywgJ3MnLCAnYScsICd0JywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdtJywKKyAgJ3AnLCAneScsICdoJywgJ3MnLCAndScsICdpJywgJ3MnLCAnYScsICd0JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnbScsICdwJywgJ3knLCAnaCcsICdzJywgJ3UnLCAnaScsICdzJywKKyAgJ2EnLCAndCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdoJywgJ3MnLCAndScsICdzJywgJ2EnLCAndCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdoJywgJ3MnLCAndScsICdzJywKKyAgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2QnLCAnbScsICdwJywgJ3knLCAnaCcsICdzJywgJ3UnLCAncycsICdhJywgJ3QnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdoJywgJ3MnLCAndScsICdzJywKKyAgJ2EnLCAndCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdoJywgJ3YnLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAnbScsICdwJywgJ3knLCAnaCcsICd2JywgJ3MnLCAnYScsICd0JywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdtJywKKyAgJ3AnLCAneScsICdoJywgJ3YnLCAncycsICdhJywgJ3QnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnZCcsICdtJywgJ3AnLCAneScsICdoJywgJ3YnLCAncycsICdhJywgJ3QnLCAnXycsICdhJywKKyAgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2QnLCAncycsICdhJywgJ2QnLCAndScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdkJywKKyAgJ3MnLCAnYScsICdkJywgJ3UnLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2QnLCAncycsICdhJywgJ2QnLCAndScsICdoJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2QnLCAncycsICdhJywgJ2QnLCAndScsICdoJywgJ18nLCAnYScsICdjJywKKyAgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdlJywKKyAgJ3EnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZScsICdxJywgJ2InLCAnXycsICcxJywKKyAgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdlJywgJ3EnLCAnYicsICdfJywKKyAgJ2EnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdlJywgJ3EnLCAnYicsICdfJywKKyAgJ2EnLCAnbicsICdkJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnZScsICdxJywgJ2InLCAnXycsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2UnLCAncScsICdiJywgJ18nLCAnbycsICdyJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnZScsICdxJywgJ2InLCAnXycsICd4JywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnZScsICdxJywgJ2InLCAnXycsICd4JywgJ28nLCAncicsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2UnLCAncScsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdlJywgJ3EnLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2UnLCAncScsICdoJywgJ18nLCAnYScsICduJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2UnLCAncScsICdoJywgJ18nLCAnYScsICduJywgJ2QnLCAnXycsICcxJywKKyAgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdlJywgJ3EnLCAnaCcsICdfJywKKyAgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZScsICdxJywgJ2gnLCAnXycsICdvJywKKyAgJ3InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdlJywKKyAgJ3EnLCAnaCcsICdfJywgJ3gnLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdlJywKKyAgJ3EnLCAnaCcsICdfJywgJ3gnLCAnbycsICdyJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnZScsICdxJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2UnLCAncScsICd3JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnZScsICdxJywgJ3cnLCAnXycsICdhJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnZScsICdxJywgJ3cnLCAnXycsICdhJywgJ24nLCAnZCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2UnLCAncScsICd3JywgJ18nLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdlJywgJ3EnLCAndycsICdfJywgJ28nLCAncicsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2UnLCAncScsICd3JywgJ18nLCAneCcsICdvJywKKyAgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2UnLCAncScsICd3JywgJ18nLCAneCcsICdvJywKKyAgJ3InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywKKyAgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdtJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywgJ20nLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywgJ20nLCAnaCcsICdxJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdtJywKKyAgJ2gnLCAncScsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywgJ20nLCAnaCcsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdtJywgJ2gnLCAndycsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywKKyAgJ20nLCAnaCcsICd3JywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAnYScsICd0JywKKyAgJ2gnLCAnZScsICdyJywgJ20nLCAnaCcsICd3JywgJ3EnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdtJywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywgJ20nLCAndycsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAnYScsICd0JywKKyAgJ2gnLCAnZScsICdyJywgJ20nLCAndycsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywKKyAgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdtJywgJ3cnLCAncScsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAndCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdnJywgJ3QnLCAnYicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2cnLCAndCcsICdiJywgJ18nLCAnYScsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2cnLCAndCcsICdiJywgJ18nLCAnYScsICduJywgJ2QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAnYicsICdfJywgJ28nLCAncicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ2InLCAnXycsICdvJywgJ3InLCAnXycsICcxJywKKyAgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAnYicsICdfJywKKyAgJ3gnLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAnYicsICdfJywKKyAgJ3gnLCAnbycsICdyJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnZycsICd0JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAndCcsICdoJywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywKKyAgJ2gnLCAnXycsICdhJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywKKyAgJ2gnLCAnXycsICdhJywgJ24nLCAnZCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2cnLCAndCcsICdoJywgJ18nLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdnJywgJ3QnLCAnaCcsICdfJywgJ28nLCAncicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAndCcsICdoJywgJ18nLCAneCcsICdvJywgJ3InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAndCcsICdoJywgJ18nLCAneCcsICdvJywgJ3InLCAnXycsICcxJywKKyAgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAndScsICdiJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAndScsICdiJywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ3UnLCAnYicsICdfJywKKyAgJ2EnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAndScsICdiJywKKyAgJ18nLCAnYScsICduJywgJ2QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdnJywgJ3QnLCAndScsICdiJywgJ18nLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdnJywgJ3QnLCAndScsICdiJywgJ18nLCAnbycsICdyJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ3UnLCAnYicsICdfJywgJ3gnLCAnbycsICdyJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAndScsICdiJywgJ18nLCAneCcsICdvJywKKyAgJ3InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywKKyAgJ3QnLCAndScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAndScsICdoJywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywKKyAgJ3UnLCAnaCcsICdfJywgJ2EnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywKKyAgJ3QnLCAndScsICdoJywgJ18nLCAnYScsICduJywgJ2QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAndScsICdoJywgJ18nLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAndScsICdoJywgJ18nLCAnbycsICdyJywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ3UnLCAnaCcsICdfJywKKyAgJ3gnLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAndScsICdoJywKKyAgJ18nLCAneCcsICdvJywgJ3InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdnJywgJ3QnLCAndScsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywKKyAgJ3QnLCAndScsICd3JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnZycsICd0JywgJ3UnLCAndycsICdfJywgJ2EnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdnJywgJ3QnLCAndScsICd3JywgJ18nLCAnYScsICduJywgJ2QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAndScsICd3JywgJ18nLCAnbycsICdyJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAndScsICd3JywgJ18nLCAnbycsICdyJywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywKKyAgJ3UnLCAndycsICdfJywgJ3gnLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywKKyAgJ3QnLCAndScsICd3JywgJ18nLCAneCcsICdvJywgJ3InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdnJywgJ3QnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnZycsICd0JywgJ3cnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdnJywgJ3QnLCAndycsICdfJywgJ2EnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdnJywgJ3QnLCAndycsICdfJywgJ2EnLCAnbicsICdkJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ3cnLCAnXycsICdvJywgJ3InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2cnLCAndCcsICd3JywgJ18nLCAnbycsICdyJywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ3cnLCAnXycsICd4JywKKyAgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnZycsICd0JywgJ3cnLCAnXycsICd4JywKKyAgJ28nLCAncicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2knLCAnbicsICdzJywgJ2UnLCAncicsICd0JywgJ3cnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnaScsICduJywgJ3MnLCAnZScsICdyJywgJ3QnLCAndycsICdyJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbCcsICdhJywgJ2wnLCAnaScsICdnJywgJ24nLCAnYicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbCcsICdhJywgJ2wnLCAnaScsICdnJywgJ24nLCAnYicsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2wnLCAnYScsICdsJywKKyAgJ2knLCAnZycsICduJywgJ2InLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbCcsICdhJywKKyAgJ2wnLCAnaScsICdnJywgJ24nLCAnYicsICdpJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnbCcsICdzJywgJ3InLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnbCcsICdzJywgJ3InLCAnYicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2wnLCAncycsICdyJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2wnLCAncycsICdyJywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdsJywgJ3MnLCAncicsICdoJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2wnLCAncycsICdyJywgJ2gnLCAndicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2wnLCAncycsICdyJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2wnLCAncycsICdyJywgJ3cnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdsJywgJ3MnLCAncicsICd3JywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2wnLCAncycsICdyJywgJ3cnLCAndicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2wnLCAndScsICd0JywgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ2wnLCAndScsICd0JywgJzQnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdsJywgJ3UnLCAndCcsICd2JywgJ3YnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnbCcsICd1JywgJ3QnLCAndicsICd2JywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdsJywgJ3UnLCAndCcsICd2JywgJ3YnLCAnYicsICdfJywgJ24nLCAnbScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbCcsICd1JywgJ3QnLCAndicsICd2JywgJ2InLCAnXycsICduJywKKyAgJ20nLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdsJywKKyAgJ3UnLCAndCcsICd2JywgJ3YnLCAnYicsICdfJywgJ28nLCAncicsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnbCcsICd1JywgJ3QnLCAndicsICd2JywgJ2InLCAnXycsICdvJywgJ3InLCAnYScsICdjJywKKyAgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdsJywKKyAgJ3UnLCAndCcsICd2JywgJ3YnLCAnYicsICdfJywgJ28nLCAncicsICdhJywgJ2MnLCAnYycsICdpJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdsJywgJ3UnLCAndCcsICd2JywgJ3YnLCAnYicsICdfJywgJ28nLCAncicsICdhJywKKyAgJ2MnLCAnYycsICdpJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnbCcsICd1JywgJ3QnLCAndicsICd2JywgJ2InLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnbCcsICd1JywgJ3QnLCAndicsICd2JywgJ2InLCAnaScsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2wnLCAndScsICd0JywgJ3YnLCAndycsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdsJywgJ3UnLCAndCcsICd2JywgJ3cnLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2wnLCAndScsICd0JywgJ3YnLCAndycsICdoJywKKyAgJ18nLCAnbicsICdtJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdsJywgJ3UnLCAndCcsICd2JywKKyAgJ3cnLCAnaCcsICdfJywgJ24nLCAnbScsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2wnLCAndScsICd0JywgJ3YnLCAndycsICdoJywgJ18nLCAnbycsICdyJywgJ2EnLCAnYycsICdjJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdsJywgJ3UnLCAndCcsICd2JywgJ3cnLCAnaCcsICdfJywKKyAgJ28nLCAncicsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ2wnLCAndScsICd0JywgJ3YnLCAndycsICdoJywgJ18nLCAnbycsICdyJywgJ2EnLCAnYycsICdjJywKKyAgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ2wnLCAndScsICd0JywgJ3YnLCAndycsICdoJywKKyAgJ18nLCAnbycsICdyJywgJ2EnLCAnYycsICdjJywgJ2knLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdsJywgJ3UnLCAndCcsICd2JywgJ3cnLCAnaCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdsJywgJ3UnLCAndCcsICd2JywgJ3cnLCAnaCcsICdpJywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdhJywgJ3MnLCAnaycsICdlJywKKyAgJ2QnLCAncycsICd0JywgJ28nLCAncicsICdlJywgJ24nLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnbScsICdhJywgJ3MnLCAnaycsICdlJywgJ2QnLCAncycsICd0JywgJ28nLCAncicsICdlJywgJ24nLCAncScsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnZScsICdkJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICduJywgJ3QnLCAnbicsICdxJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ2EnLCAncycsICdrJywgJ2UnLCAnZCcsICdzJywgJ3QnLCAnbycsICdyJywKKyAgJ2UnLCAnbicsICd0JywgJ24nLCAncScsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ20nLCAnYScsICdzJywgJ2snLCAnZScsICdkJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICduJywKKyAgJ3QnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdhJywgJ3MnLCAnaycsICdlJywKKyAgJ2QnLCAncycsICd0JywgJ28nLCAncicsICdlJywgJ24nLCAndCcsICdxJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdhJywgJ3MnLCAnaycsICdlJywgJ2QnLCAncycsICd0JywKKyAgJ28nLCAncicsICdlJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnZScsICdkJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICdxJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdhJywgJ3gnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdhJywgJ3gnLCAnYicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAnYScsICd4JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ20nLCAnYScsICd4JywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ2EnLCAneCcsICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ20nLCAnYScsICd4JywgJ3UnLCAnYicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAnYScsICd4JywgJ3UnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdhJywgJ3gnLCAndScsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdhJywgJ3gnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdhJywgJ3gnLCAndycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAnaScsICduJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ20nLCAnaScsICduJywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ2knLCAnbicsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdtJywgJ2knLCAnbicsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdpJywgJ24nLCAndScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdtJywgJ2knLCAnbicsICd1JywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ2knLCAnbicsICd1JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ20nLCAnaScsICduJywgJ3UnLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAnaScsICduJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ20nLCAnaScsICduJywgJ3cnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAnYScsICdiJywgJ3UnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ2EnLCAnYicsICd1JywgJ3MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAnYScsICdiJywgJ3UnLCAncycsICdfJywKKyAgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAnYScsICdiJywKKyAgJ3UnLCAncycsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ2EnLCAnYicsICd1JywgJ3MnLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ2EnLCAnYicsICd1JywgJ3MnLCAndicsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICdhJywgJ2InLCAndScsICd1JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAnYScsICdiJywgJ3UnLCAndScsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICdhJywKKyAgJ2InLCAndScsICd1JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ20nLCAncCcsICdhJywgJ2InLCAndScsICd1JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAnYScsICdiJywgJ3UnLCAndScsICd2JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAnYScsICdiJywgJ3UnLCAndScsICd2JywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywKKyAgJ2EnLCAnaCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAnYScsICdoJywKKyAgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywKKyAgJ3AnLCAnYScsICdoJywgJ2InLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnbScsICdwJywgJ2EnLCAnaCcsICdiJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAnYScsICdoJywgJ2gnLCAncycsICdhJywKKyAgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICdhJywgJ2gnLCAnaCcsICdzJywKKyAgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ20nLCAncCcsICdhJywgJ3UnLCAnaCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywKKyAgJ3AnLCAnYScsICd1JywgJ2gnLCAnYicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICdhJywgJ3UnLCAnaCcsICdiJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICdhJywgJ3UnLCAnaCcsICdiJywgJ18nLCAnYScsICdjJywKKyAgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywKKyAgJ3AnLCAnYScsICd1JywgJ2gnLCAndScsICdoJywgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdtJywgJ3AnLCAnYScsICd1JywgJ2gnLCAndScsICdoJywgJ3MnLCAnYScsICd0JywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3MnLCAndScsICdoJywKKyAgJ3UnLCAnaCcsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywKKyAgJ3MnLCAndScsICdoJywgJ3UnLCAnaCcsICdzJywgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2InLCAndScsICdzJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAncycsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2InLCAndScsICdzJywKKyAgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywKKyAgJ2InLCAndScsICdzJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAncycsICd2JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAncycsICd2JywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnYicsICd1JywKKyAgJ3MnLCAndicsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywKKyAgJ3AnLCAneScsICdiJywgJ3UnLCAncycsICd2JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdiJywgJ3YnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2InLCAndicsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2InLCAndicsICdfJywKKyAgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdiJywKKyAgJ3YnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2UnLCAndycsICd1JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2UnLCAndycsICd1JywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdlJywgJ3cnLCAndScsICdoJywKKyAgJ18nLCAnNicsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdlJywKKyAgJ3cnLCAndScsICdoJywgJ18nLCAnNicsICc0JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnbScsICdwJywgJ3knLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2gnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaCcsICdzJywKKyAgJ2EnLCAndCcsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywKKyAgJ3AnLCAneScsICdoJywgJ3MnLCAnYScsICd0JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdoJywgJ3MnLCAncicsICdzJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdoJywgJ3MnLCAncicsICdzJywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywKKyAgJ3knLCAnaCcsICdzJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywKKyAgJ2gnLCAncycsICdzJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnbScsICdwJywgJ3knLCAnaCcsICd1JywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ20nLCAncCcsICd5JywgJ2gnLCAndScsICdzJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaCcsICd1JywgJ3MnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaCcsICd1JywgJ3MnLCAnXycsICdhJywKKyAgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ20nLCAncCcsICd5JywgJ2gnLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywKKyAgJ3knLCAnaCcsICd2JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnbScsICdwJywgJ3knLCAnaCcsICd2JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2gnLCAndicsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaCcsICd2JywKKyAgJ3MnLCAncicsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdoJywKKyAgJ3YnLCAncycsICdyJywgJ3MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdpJywgJ2UnLCAnbycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdpJywgJ2UnLCAnbycsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaScsICdlJywgJ3cnLCAnaCcsICdfJywKKyAgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdpJywKKyAgJ2UnLCAndycsICdoJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdpJywgJ2UnLCAndycsICd1JywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2knLCAnZScsICd3JywgJ3UnLCAnaCcsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywKKyAgJ2knLCAnZScsICd3JywgJ3UnLCAnaCcsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdpJywgJ2UnLCAndycsICd1JywgJ2gnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywKKyAgJ2knLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaScsICdoJywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywKKyAgJ3knLCAnaScsICdoJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ20nLCAncCcsICd5JywgJ2knLCAnaCcsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaScsICdoJywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2knLCAnaCcsICdiJywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaScsICdoJywKKyAgJ2InLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywKKyAgJ3knLCAnaScsICdoJywgJ2InLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2knLCAnbycsICd3JywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2knLCAnbycsICd3JywgJ2gnLCAnXycsICcxJywKKyAgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdpJywKKyAgJ3cnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaScsICd3JywKKyAgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywKKyAgJ3AnLCAneScsICdpJywgJ3cnLCAnYicsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdpJywgJ3cnLCAnYicsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnaScsICd3JywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2knLCAndycsICdoJywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywKKyAgJ3knLCAnaScsICd3JywgJ2gnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnbScsICdwJywgJ3knLCAnaScsICd3JywgJ2gnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2knLCAndycsICd1JywKKyAgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2knLCAndycsICd1JywKKyAgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywKKyAgJ3AnLCAneScsICdpJywgJ3cnLCAndScsICdiJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ2knLCAndycsICd1JywgJ2InLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywKKyAgJ28nLCAndycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdvJywKKyAgJ3cnLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ20nLCAncCcsICd5JywgJ28nLCAndycsICdoJywgJ18nLCAnNicsICc0JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ28nLCAndycsICdoJywgJ18nLCAnNicsICc0JywKKyAgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdvJywgJ3cnLCAnaCcsICdfJywgJ3InLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdvJywgJ3cnLCAnaCcsICdfJywgJ3InLCAnbicsICdkJywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywKKyAgJ3knLCAnbycsICd3JywgJ2gnLCAnXycsICdyJywgJ24nLCAnZCcsICdfJywgJ3MnLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ28nLCAndycsICdoJywgJ18nLCAncicsICduJywKKyAgJ2QnLCAnXycsICdzJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAnbycsICd3JywgJ2gnLCAnXycsICdzJywgJ2EnLCAnYycsICdjJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICdvJywgJ3cnLCAnaCcsICdfJywKKyAgJ3MnLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdtJywgJ3AnLCAneScsICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ20nLCAncCcsICd5JywgJ3UnLCAnYicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ3UnLCAnYicsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICd1JywgJ2InLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywKKyAgJ3UnLCAnYicsICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICd1JywKKyAgJ2InLCAndicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ20nLCAncCcsICd5JywgJ3UnLCAnYicsICd2JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ3UnLCAnYicsICd2JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywKKyAgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICd1JywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ3UnLCAnaCcsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywKKyAgJ3UnLCAnaCcsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywKKyAgJ3AnLCAneScsICd1JywgJ2gnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ3UnLCAnaCcsICdlJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICd1JywgJ2gnLCAnZScsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywgJ3UnLCAnaCcsICdlJywKKyAgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ20nLCAncCcsICd5JywKKyAgJ3UnLCAnaCcsICdlJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICd1JywgJ2gnLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICdwJywgJ3knLCAndScsICdoJywgJ3YnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICd1JywgJ2gnLCAndicsICdfJywKKyAgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdtJywgJ3AnLCAneScsICd1JywKKyAgJ2gnLCAndicsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnbScsICd1JywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ20nLCAndScsICd4JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAnbicsICdhJywgJ3YnLCAnZycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICduJywKKyAgJ2EnLCAndicsICdnJywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICduJywgJ2EnLCAndicsICdnJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ24nLCAnYScsICd2JywgJ2cnLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ24nLCAnYScsICd2JywgJ2cnLCAndScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICduJywgJ2EnLCAndicsICdnJywgJ3UnLCAnYicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ24nLCAnYScsICd2JywgJ2cnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAnbicsICdhJywgJ3YnLCAnZycsICd3JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbicsICdvJywgJ3InLCAnbScsICdhJywgJ20nLCAndCcsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICduJywgJ28nLCAncicsICdtJywgJ2EnLCAnbScsICd0JywKKyAgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICduJywKKyAgJ28nLCAncicsICdtJywgJ2EnLCAnbScsICd0JywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ24nLCAnbycsICdyJywgJ20nLCAnYScsICdtJywgJ3QnLCAndycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ24nLCAnbycsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICduJywgJ28nLCAndCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAnbycsICdyJywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncCcsICdhJywKKyAgJ2MnLCAnaycsICdlJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3AnLCAnYScsICdjJywKKyAgJ2snLCAnZScsICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAncCcsICdhJywgJ2MnLCAnaycsICdlJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ3AnLCAnYScsICdjJywgJ2snLCAnZScsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAncCcsICdhJywgJ2MnLCAnaycsICdoJywgJ2InLCAnXycsICdzJywgJ2EnLCAndCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncCcsICdhJywgJ2MnLCAnaycsICdoJywgJ2InLCAnXycsICdzJywKKyAgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ3AnLCAnYScsICdjJywgJ2snLCAnaCcsICd1JywgJ2InLCAnXycsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAncCcsICdhJywgJ2MnLCAnaycsICdoJywgJ3UnLCAnYicsICdfJywgJ3MnLCAnYScsICd0JywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncCcsICdhJywKKyAgJ2MnLCAnaycsICdvJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3AnLCAnYScsICdjJywKKyAgJ2snLCAnbycsICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAncCcsICdhJywgJ2MnLCAnaycsICdvJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ3AnLCAnYScsICdjJywgJ2snLCAnbycsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAncCcsICdhJywgJ2MnLCAnaycsICd3JywgJ2gnLCAnXycsICdzJywgJ2EnLCAndCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncCcsICdhJywgJ2MnLCAnaycsICd3JywgJ2gnLCAnXycsICdzJywKKyAgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ3AnLCAnYScsICdjJywgJ2snLCAndycsICd1JywgJ2gnLCAnXycsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAncCcsICdhJywgJ2MnLCAnaycsICd3JywgJ3UnLCAnaCcsICdfJywgJ3MnLCAnYScsICd0JywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncCcsICdvJywKKyAgJ3AnLCAnYycsICdvJywgJ3UnLCAnbicsICd0JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ3AnLCAnbycsICdwJywgJ2MnLCAnbycsICd1JywgJ24nLCAndCcsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncCcsICdyJywgJ2UnLCAnZicsICdpJywgJ3gnLCAncScsICdiJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdwJywgJ3InLCAnZScsICdmJywgJ2knLCAneCcsICdxJywKKyAgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdwJywKKyAgJ3InLCAnZScsICdmJywgJ2knLCAneCcsICdxJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ3AnLCAncicsICdlJywgJ2YnLCAnaScsICd4JywgJ3EnLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3AnLCAncicsICdlJywgJ2YnLCAnaScsICd4JywgJ3EnLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncCcsICdyJywgJ2UnLCAnZicsICdpJywgJ3gnLCAncScsICd3JywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdkJywKKyAgJ2UnLCAnbCcsICd0JywgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAnZCcsICdlJywKKyAgJ2wnLCAndCcsICdhJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAnYicsICdfJywgJ3InLCAndCcsICd0JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ2InLCAndScsICdiJywgJ18nLCAncicsICd0JywKKyAgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywKKyAgJ20nLCAncCcsICd5JywgJ2InLCAndScsICdiJywgJ18nLCAncicsICd0JywgJ3QnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAnYicsICdfJywKKyAgJ3InLCAndCcsICd0JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ2InLCAndScsICdzJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ2InLCAndScsICdzJywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICdiJywKKyAgJ3UnLCAncycsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywKKyAgJ20nLCAncCcsICd5JywgJ2InLCAndScsICdzJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ2InLCAndScsICdzJywKKyAgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAnbScsICdwJywgJ3knLCAnYicsICd1JywKKyAgJ3MnLCAnaScsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ3InLCAnbScsICdwJywgJ3knLCAnYicsICd1JywgJ3MnLCAnaScsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ2InLCAndScsICdzJywgJ2knLCAnXycsICdhJywKKyAgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ3InLCAnbScsICdwJywgJ3knLCAnYicsICd1JywgJ3MnLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAncycsICd2JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICdiJywgJ3UnLCAncycsICd2JywKKyAgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAnbScsICdwJywKKyAgJ3knLCAnYicsICd1JywgJ3MnLCAndicsICdfJywgJ2EnLCAnYycsICdjJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICdiJywgJ3YnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAnbScsICdwJywgJ3knLCAnYicsICd2JywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICdiJywKKyAgJ3YnLCAnXycsICdhJywgJ2MnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywKKyAgJ3AnLCAneScsICdiJywgJ3YnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAnbScsICdwJywgJ3knLCAndScsICdiJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ3UnLCAnYicsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAnbScsICdwJywgJ3knLCAndScsICdiJywKKyAgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3InLCAnbScsICdwJywKKyAgJ3knLCAndScsICdiJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ3UnLCAnYicsICdfJywgJ3InLCAndCcsICd0JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ3UnLCAnYicsICdfJywKKyAgJ3InLCAndCcsICd0JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICd1JywgJ2InLCAnXycsICdyJywgJ3QnLCAndCcsICdfJywgJ2EnLCAnYycsICdjJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ3UnLCAnYicsICdfJywKKyAgJ3InLCAndCcsICd0JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ3UnLCAnYicsICdpJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ3UnLCAnYicsICdpJywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywgJ3AnLCAneScsICd1JywKKyAgJ2InLCAnaScsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywKKyAgJ20nLCAncCcsICd5JywgJ3UnLCAnYicsICdpJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ3UnLCAnYicsICd2JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ3UnLCAnYicsICd2JywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdtJywKKyAgJ3AnLCAneScsICd1JywgJ2InLCAndicsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdyJywgJ20nLCAncCcsICd5JywgJ3UnLCAnYicsICd2JywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywKKyAgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ28nLCAncicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdvJywgJ3InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnaCcsICdiJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnaCcsICdiJywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdvJywKKyAgJ3UnLCAnbicsICdkJywgJ2gnLCAndScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywKKyAgJ28nLCAndScsICduJywgJ2QnLCAnaCcsICd1JywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAndScsICdoJywgJ3UnLCAnYicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ3UnLCAnaCcsICd1JywKKyAgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywKKyAgJ28nLCAndScsICduJywgJ2QnLCAndScsICd3JywgJ3UnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ3UnLCAndycsICd1JywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAndycsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAndycsICdoJywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdvJywKKyAgJ3UnLCAnbicsICdkJywgJ3cnLCAndScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywKKyAgJ28nLCAndScsICduJywgJ2QnLCAndycsICd1JywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ3MnLCAnYScsICdkJywgJ3UnLCAnYicsICdpJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywgJ3MnLCAnYScsICdkJywgJ3UnLCAnYicsICdpJywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncicsICdzJywgJ2EnLCAnZCcsICd1JywKKyAgJ2InLCAnaScsICdfJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdyJywKKyAgJ3MnLCAnYScsICdkJywgJ3UnLCAnYicsICdpJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ2EnLCAndCcsICdoJywgJ3UnLCAnYicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdhJywgJ3QnLCAnaCcsICd1JywgJ2InLCAnXycsICcxJywKKyAgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ2EnLCAndCcsICd1JywKKyAgJ3cnLCAndScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ2EnLCAndCcsICd1JywKKyAgJ3cnLCAndScsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAncycsICdhJywgJ3QnLCAndycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywKKyAgJ2EnLCAndCcsICd3JywgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdzJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnYicsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnYycsICdhJywKKyAgJ3QnLCAndCcsICdlJywgJ3InLCAnbScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywKKyAgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywgJ20nLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAnbScsICdoJywKKyAgJ18nLCAnYScsICdkJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnYycsICdhJywKKyAgJ3QnLCAndCcsICdlJywgJ3InLCAnbScsICdoJywgJ18nLCAnYScsICdkJywgJ2QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywKKyAgJ20nLCAnaCcsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ2MnLCAnYScsICd0JywKKyAgJ3QnLCAnZScsICdyJywgJ20nLCAnaCcsICdxJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdtJywgJ2gnLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdtJywKKyAgJ2gnLCAndycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAnbScsICdoJywgJ3cnLCAnXycsICdhJywgJ2QnLCAnZCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdtJywKKyAgJ2gnLCAndycsICdfJywgJ2EnLCAnZCcsICdkJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdtJywgJ2gnLCAndycsICdxJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywKKyAgJ20nLCAnaCcsICd3JywgJ3EnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywgJ20nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdtJywgJ3cnLCAnXycsICcxJywKKyAgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ2MnLCAnYScsICd0JywKKyAgJ3QnLCAnZScsICdyJywgJ20nLCAndycsICdfJywgJ2EnLCAnZCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywgJ20nLCAndycsICdfJywgJ2EnLCAnZCcsICdkJywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdjJywKKyAgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdtJywgJ3cnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdtJywgJ3cnLCAncScsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdoJywgJ3UnLCAnZicsICdlJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ3MnLCAnaCcsICd1JywgJ2YnLCAnZScsICdoJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdoJywgJ3UnLCAnZicsICdmJywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnaCcsICd1JywgJ2YnLCAnZicsICdiJywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdoJywgJ3UnLCAnZicsICdmJywKKyAgJ2UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdoJywgJ3UnLCAnZicsICdmJywKKyAgJ2UnLCAnYicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ3MnLCAnaCcsICd1JywgJ2YnLCAnZicsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywKKyAgJ2gnLCAndScsICdmJywgJ2YnLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ3MnLCAnaCcsICd1JywgJ2YnLCAnZicsICdvJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ3MnLCAnaCcsICd1JywgJ2YnLCAnZicsICdvJywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ2gnLCAndScsICdmJywgJ2YnLCAndicsICdkJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnaCcsICd1JywgJ2YnLCAnZicsICd2JywKKyAgJ2QnLCAnZCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ3MnLCAnaCcsICd1JywgJ2YnLCAnbycsICdlJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ3MnLCAnaCcsICd1JywgJ2YnLCAnbycsICdlJywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ2gnLCAndScsICdmJywgJ28nLCAnZScsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ2gnLCAndScsICdmJywgJ28nLCAnZScsICdoJywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICdoJywgJ3UnLCAnZicsICdvJywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAnaCcsICd1JywgJ2YnLCAnbycsICdoJywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywKKyAgJ2InLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAnYicsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywKKyAgJ2InLCAnXycsICdkJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywKKyAgJ2InLCAnXycsICdkJywgJ3YnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICdiJywgJ24nLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAncycsICd1JywgJ2InLCAnYicsICduJywgJ3EnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICdiJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ2InLCAncScsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ2InLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ2InLCAncycsICdhJywgJ3QnLCAnXycsICcxJywKKyAgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICdiJywKKyAgJ3MnLCAnYScsICd0JywgJ18nLCAnZCcsICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywKKyAgJ3UnLCAnYicsICdiJywgJ3MnLCAnYScsICd0JywgJ18nLCAnZCcsICd2JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ3YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAnYycsICdhJywgJ3InLCAncicsICd5JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAndicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICdjJywgJ2EnLCAncicsICdyJywKKyAgJ3knLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywKKyAgJ3UnLCAnYicsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICdoJywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywKKyAgJ2InLCAnaCcsICdfJywgJ2QnLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywKKyAgJ2InLCAnaCcsICdfJywgJ2QnLCAndicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ2gnLCAnbicsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICdoJywgJ24nLCAncScsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ2gnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAnaCcsICdxJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAnaCcsICdzJywgJ2EnLCAndCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAnaCcsICdzJywgJ2EnLCAndCcsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywKKyAgJ2gnLCAncycsICdhJywgJ3QnLCAnXycsICdkJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ3MnLCAndScsICdiJywgJ2gnLCAncycsICdhJywgJ3QnLCAnXycsICdkJywgJ3YnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICdoJywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ2gnLCAndycsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ3UnLCAnYicsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICd1JywgJ2InLCAnaCcsICdfJywKKyAgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywKKyAgJ3UnLCAnYicsICdzJywgJ2EnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywKKyAgJ2InLCAndScsICdiJywgJ3MnLCAnYScsICd0JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAndScsICdiJywgJ3MnLCAnYScsICd0JywgJ18nLCAnZCcsICd2JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICd1JywgJ2InLCAncycsICdhJywKKyAgJ3QnLCAnXycsICdkJywgJ3YnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICd1JywgJ2InLCAndScsICdiJywgJ2InLCAnXycsICdzJywgJ2EnLCAndCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAndScsICdiJywgJ3UnLCAnYicsICdiJywKKyAgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICd1JywgJ2gnLCAncycsICdhJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ3UnLCAnaCcsICdzJywgJ2EnLCAndCcsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ3UnLCAnaCcsICdzJywKKyAgJ2EnLCAndCcsICdfJywgJ2QnLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywKKyAgJ2InLCAndScsICdoJywgJ3MnLCAnYScsICd0JywgJ18nLCAnZCcsICd2JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAndScsICdoJywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ3UnLCAnaCcsICd3JywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAndScsICd3JywKKyAgJ3MnLCAnYScsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICd1JywKKyAgJ3cnLCAncycsICdhJywgJ3QnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywKKyAgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICd1JywgJ3cnLCAncycsICdhJywgJ3QnLCAnXycsICdkJywgJ3YnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ3UnLCAndycsICdzJywgJ2EnLCAndCcsICdfJywKKyAgJ2QnLCAndicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ3MnLCAndScsICdiJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywKKyAgJ3cnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywKKyAgJ3UnLCAnYicsICd3JywgJ18nLCAnZCcsICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywKKyAgJ3UnLCAnYicsICd3JywgJ18nLCAnZCcsICd2JywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywKKyAgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAndycsICduJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ3cnLCAnbicsICdxJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAndycsICdxJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICd3JywgJ3EnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICd3JywgJ3MnLCAnYScsICd0JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICd3JywgJ3MnLCAnYScsICd0JywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAncycsICd1JywKKyAgJ2InLCAndycsICdzJywgJ2EnLCAndCcsICdfJywgJ2QnLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAncycsICd1JywgJ2InLCAndycsICdzJywgJ2EnLCAndCcsICdfJywgJ2QnLCAndicsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndycsICdhJywgJ3AnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3MnLCAndycsICdhJywgJ3AnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICd0JywgJ20nLCAncCcsICd5JywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3QnLCAnbScsICdwJywgJ3knLCAnYicsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3QnLCAnbScsICdwJywgJ3knLCAnYicsICdfJywKKyAgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywKKyAgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICd0JywgJ20nLCAncCcsICd5JywKKyAgJ2InLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ3QnLCAnbScsICdwJywgJ3knLCAnYicsICd1JywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywKKyAgJzYnLCAnXycsICd2JywgJ3QnLCAnbScsICdwJywgJ3knLCAnYicsICd1JywgJ3MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICd0JywgJ20nLCAncCcsICd5JywgJ2InLCAndScsICdzJywKKyAgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3QnLCAnbScsICdwJywKKyAgJ3knLCAnYicsICd1JywgJ3MnLCAnXycsICdhJywgJ2MnLCAnYycsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3QnLCAnbScsICdwJywgJ3knLCAnaCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICd0JywgJ20nLCAncCcsICd5JywgJ2gnLCAnYicsICdfJywgJzEnLCAnMicsICc4JywKKyAgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3QnLCAnbScsICdwJywgJ3knLCAnaCcsICdiJywKKyAgJ18nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3QnLCAnbScsICdwJywKKyAgJ3knLCAnaCcsICdiJywgJ18nLCAnYScsICdjJywgJ2MnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICd1JywgJ24nLCAncCcsICdhJywgJ2MnLCAnaycsICdiJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICd1JywgJ24nLCAncCcsICdhJywgJ2MnLCAnaycsICdiJywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAndScsICduJywgJ3AnLCAnYScsICdjJywKKyAgJ2snLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAndScsICduJywgJ3AnLCAnYScsICdjJywKKyAgJ2snLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ3UnLCAnbicsICdwJywgJ2EnLCAnYycsICdrJywgJ28nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywKKyAgJ3YnLCAndScsICduJywgJ3AnLCAnYScsICdjJywgJ2snLCAnbycsICdiJywgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAndScsICduJywgJ3AnLCAnYScsICdjJywgJ2snLCAnbycsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywKKyAgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICd1JywgJ24nLCAncCcsICdhJywgJ2MnLCAnaycsICdvJywKKyAgJ2gnLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnVicsICc2JywgJ18nLCAndicsICd1JywKKyAgJ24nLCAncCcsICdhJywgJ2MnLCAnaycsICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ3UnLCAnbicsICdwJywgJ2EnLCAnYycsICdrJywgJ3UnLCAnYicsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywKKyAgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3UnLCAnbicsICdwJywgJ2EnLCAnYycsICdrJywgJ3UnLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywKKyAgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAndScsICduJywgJ3AnLCAnYScsICdjJywgJ2snLCAndScsICdoJywKKyAgJ18nLCAnMScsICcyJywgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAneCcsICdvJywKKyAgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywKKyAgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywgJ3gnLCAnbycsICdyJywgJ18nLCAnMScsICcyJywKKyAgJzgnLCAnQicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1YnLCAnNicsICdfJywgJ3YnLCAneicsICdiJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICd6JywgJ2InLCAnXycsICcxJywgJzInLCAnOCcsICdCJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywKKyAgJ18nLCAnVicsICc2JywgJ18nLCAndicsICd6JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdWJywgJzYnLCAnXycsICd2JywKKyAgJ3onLCAnaCcsICdfJywgJzEnLCAnMicsICc4JywgJ0InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdZJywgJzInLCAnXycsICdkJywKKyAgJ2MnLCAnYycsICdsJywgJ2UnLCAnYScsICduJywgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdZJywgJzInLCAnXycsICdkJywKKyAgJ2MnLCAnYycsICdsJywgJ2UnLCAnYScsICduJywgJ2knLCAnbicsICd2JywgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdZJywKKyAgJzInLCAnXycsICdkJywgJ2MnLCAnaScsICduJywgJ3YnLCAnYScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ1knLCAnMicsICdfJywKKyAgJ2QnLCAnYycsICd6JywgJ2UnLCAncicsICdvJywgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ0gnLCAnRScsICdYJywgJ0EnLCAnRycsICdPJywgJ04nLCAnXycsICdZJywgJzQnLCAnXycsICdsJywKKyAgJzInLCAnZicsICdlJywgJ3QnLCAnYycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdIJywgJ0UnLCAnWCcsICdBJywgJ0cnLCAnTycsICdOJywgJ18nLCAnWScsICc1JywgJ18nLCAnbCcsICcyJywKKyAgJ2YnLCAnZScsICd0JywgJ2MnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYycsICdpJywgJ3InLCAnYycsICdfJywgJ2wnLCAnZCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdjJywgJ2knLCAncicsICdjJywgJ18nLCAnbCcsICdkJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2MnLCAnaScsICdyJywgJ2MnLCAnXycsICdsJywKKyAgJ2QnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYycsICdpJywKKyAgJ3InLCAnYycsICdfJywgJ2wnLCAnZCcsICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2MnLCAnaScsICdyJywgJ2MnLCAnXycsICdsJywgJ2QnLCAndScsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdjJywgJ2knLCAncicsICdjJywgJ18nLCAnbCcsICdkJywKKyAgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2MnLCAnaScsICdyJywKKyAgJ2MnLCAnXycsICdzJywgJ3QnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYycsICdpJywgJ3InLCAnYycsICdfJywgJ3MnLCAndCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdjJywgJ2knLCAncicsICdjJywgJ18nLCAncycsICd0JywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2MnLCAnaScsICdyJywgJ2MnLCAnXycsICdzJywKKyAgJ3QnLCAnaCcsICdoJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2MnLCAnaScsICdyJywgJ2MnLCAnXycsICdzJywgJ3QnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnXycsICdtJywgJ20nLCAnMicsICc1JywgJzYnLCAnaScsICdfJywgJ3YnLCAnYScsICdkJywKKyAgJ2QnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnSCcsICdFJywKKyAgJ1gnLCAnQScsICdHJywgJ08nLCAnTicsICdfJywgJ3AnLCAncicsICdlJywgJ2YnLCAnZScsICd0JywgJ2MnLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywKKyAgJ2EnLCAnYicsICdzJywgJ3EnLCAnXycsICdzJywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnYScsICdiJywgJ3MnLCAncScsICdfJywKKyAgJ3MnLCAnXycsICdxJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdhJywgJ2InLCAncycsICdxJywgJ18nLCAncycsICdfJywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsICdkJywKKyAgJ2QnLCAnXycsICdhJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ2QnLCAnZCcsICdfJywgJ2EnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAnZCcsICdkJywKKyAgJ18nLCAnYScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnYScsICdkJywgJ2QnLCAnXycsICdhJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2EnLCAnZCcsICdkJywKKyAgJ3EnLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdhJywgJ2QnLCAnZCcsICdxJywgJ18nLCAncycsICdfJywgJ3AnLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywKKyAgJ2EnLCAnZCcsICdkJywgJ3EnLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2EnLCAnZCcsICdkJywgJ3EnLCAnaCcsICdfJywKKyAgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywKKyAgJ3AnLCAncycsICdfJywgJ2EnLCAnZCcsICdkJywgJ3EnLCAnaCcsICdfJywgJ3InLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdhJywKKyAgJ2QnLCAnZCcsICdxJywgJ2gnLCAnXycsICdyJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2EnLCAnZCcsICdkJywgJ3EnLCAnaCcsICdfJywKKyAgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnYScsICdkJywgJ2QnLCAncycsICdfJywgJ2EnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAnXycsICdhJywKKyAgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdhJywgJ2QnLCAnZCcsICdzJywgJ18nLCAnYScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsICdkJywgJ2QnLCAncycsICdfJywKKyAgJ2EnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAnXycsICdzJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ2QnLCAnZCcsICdzJywKKyAgJ18nLCAncycsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnYScsICdkJywgJ2QnLCAncycsICdfJywgJ3MnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAnZCcsICdkJywKKyAgJ3MnLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ2QnLCAnZCcsICdzJywgJ18nLCAndScsICdfJywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsICdkJywKKyAgJ2QnLCAncycsICdfJywgJ3UnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAnXycsICd1JywgJ18nLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywKKyAgJ2QnLCAnZCcsICdzJywgJ18nLCAndScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdhJywgJ2QnLCAnZCcsICdzJywgJ2MnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdhJywKKyAgJ2QnLCAnZCcsICd1JywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnYScsICdkJywgJ2QnLCAndScsICdfJywgJ3EnLCAnYicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywKKyAgJ2EnLCAnZCcsICdkJywgJ3UnLCAnXycsICdzJywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnYScsICdkJywgJ2QnLCAndScsICdfJywKKyAgJ3MnLCAnXycsICdxJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdhJywgJ2QnLCAnZCcsICd1JywgJ2gnLCAnXycsICdxJywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdhJywKKyAgJ2QnLCAnZCcsICd1JywgJ2gnLCAnXycsICdyJywgJ18nLCAncScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAnZCcsICdkJywgJ3YnLCAnXycsICdiJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2EnLCAnZCcsICdkJywgJ3YnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAnZCcsICdkJywgJ3YnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAnZCcsICdkJywKKyAgJ3YnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2EnLCAnZCcsICdkJywgJ3YnLCAnaScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsICdkJywgJ2QnLCAndicsICdpJywKKyAgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdhJywgJ2QnLCAnZCcsICd2JywgJ2knLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAnZCcsICdkJywgJ3YnLCAnaScsICdfJywKKyAgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywKKyAgJ3MnLCAnXycsICdhJywgJ2QnLCAnZCcsICd3JywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsICduJywgJ2QnLCAnXycsICd2JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAnbicsICdkJywKKyAgJ2knLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ2knLCAncCcsICdzJywgJ18nLCAnYScsICdwJywgJ3AnLCAnZScsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsICdzJywgJ3UnLCAnYicsICdfJywKKyAgJ3MnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2EnLCAncycsICd1JywgJ2InLCAnXycsICdzJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ3MnLCAndScsICdiJywKKyAgJ18nLCAncycsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnYScsICdzJywgJ3UnLCAnYicsICdfJywgJ3MnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAncycsICd1JywKKyAgJ2InLCAnXycsICd1JywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ3MnLCAndScsICdiJywgJ18nLCAndScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsICdzJywKKyAgJ3UnLCAnYicsICdfJywgJ3UnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAncycsICd1JywgJ2InLCAnXycsICd1JywgJ18nLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywKKyAgJ3YnLCAnZScsICdfJywgJ3MnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAndicsICdlJywgJ18nLCAncycsICdfJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsICd2JywKKyAgJ2UnLCAnXycsICdzJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ3YnLCAnZScsICdfJywgJ3MnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAndicsICdlJywKKyAgJ18nLCAndScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnYScsICd2JywgJ2UnLCAnXycsICd1JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ3YnLCAnZScsICdfJywKKyAgJ3UnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2EnLCAndicsICdlJywgJ18nLCAndScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsICd2JywgJ2UnLCAncicsICdfJywKKyAgJ3MnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2EnLCAndicsICdlJywgJ3InLCAnXycsICdzJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ3YnLCAnZScsICdyJywKKyAgJ18nLCAncycsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnYScsICd2JywgJ2UnLCAncicsICdfJywgJ3MnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAndicsICdlJywKKyAgJ3InLCAnXycsICd1JywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdhJywgJ3YnLCAnZScsICdyJywgJ18nLCAndScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYScsICd2JywKKyAgJ2UnLCAncicsICdfJywgJ3UnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2EnLCAndicsICdlJywgJ3InLCAnXycsICd1JywgJ18nLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywKKyAgJ2InLCAnYScsICdsJywgJ2knLCAnZycsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAnYycsICdsJywgJ3InLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAnYycsICdsJywKKyAgJ3InLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2InLCAnYycsICdsJywgJ3InLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAnYycsICdsJywgJ3InLCAnXycsICd3JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2InLCAnYycsICdsJywgJ3InLCAnaScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdjJywgJ2wnLCAncicsICdpJywgJ18nLCAnZCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywKKyAgJ2MnLCAnbCcsICdyJywgJ2knLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAnYycsICdsJywgJ3InLCAnaScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdpJywKKyAgJ24nLCAncycsICdsJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ2knLCAnbicsICdzJywgJ2wnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAnaScsICduJywKKyAgJ3MnLCAnbCcsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdpJywgJ24nLCAncycsICdsJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ2knLCAnbicsICdzJywKKyAgJ2wnLCAnaScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdpJywgJ24nLCAncycsICdsJywgJ2knLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAnaScsICduJywKKyAgJ3MnLCAnbCcsICdpJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ2knLCAnbicsICdzJywgJ2wnLCAnaScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdpJywKKyAgJ24nLCAncycsICdyJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ2knLCAnbicsICdzJywgJ3InLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAnaScsICduJywKKyAgJ3MnLCAncicsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdpJywgJ24nLCAncycsICdyJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ2knLCAnbicsICdzJywKKyAgJ3InLCAnaScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdpJywgJ24nLCAncycsICdyJywgJ2knLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAnaScsICduJywKKyAgJ3MnLCAncicsICdpJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ2knLCAnbicsICdzJywgJ3InLCAnaScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdiJywKKyAgJ2knLCAndCcsICdyJywgJ2UnLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ20nLCAnbicsICd6JywgJ18nLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ20nLCAnbicsICd6JywKKyAgJ2knLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2InLCAnbScsICd6JywgJ18nLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ20nLCAneicsICdpJywgJ18nLCAnYicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywKKyAgJ24nLCAnZScsICdnJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ24nLCAnZScsICdnJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ24nLCAnZScsICdnJywKKyAgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdiJywgJ24nLCAnZScsICdnJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ24nLCAnZScsICdnJywgJ2knLCAnXycsICdiJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2InLCAnbicsICdlJywgJ2cnLCAnaScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICduJywgJ2UnLCAnZycsICdpJywgJ18nLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywKKyAgJ24nLCAnZScsICdnJywgJ2knLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAnbicsICd6JywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ24nLCAneicsICdfJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnYicsICduJywgJ3onLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAnbicsICd6JywgJ18nLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ24nLCAneicsICdfJywKKyAgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywKKyAgJ3MnLCAnXycsICdiJywgJ3AnLCAnbycsICdzJywgJ2cnLCAnZScsICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYicsICdzJywgJ2UnLCAnbCcsICdfJywKKyAgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnYicsICdzJywgJ2UnLCAnbCcsICdpJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ3MnLCAnZScsICd0JywgJ18nLCAnYicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywKKyAgJ3MnLCAnZScsICd0JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ3MnLCAnZScsICd0JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ3MnLCAnZScsICd0JywKKyAgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdiJywgJ3MnLCAnZScsICd0JywgJ2knLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAncycsICdlJywgJ3QnLCAnaScsICdfJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnYicsICdzJywgJ2UnLCAndCcsICdpJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ3MnLCAnZScsICd0JywgJ2knLCAnXycsICd3JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2InLCAneicsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnYicsICd6JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdiJywgJ3onLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2InLCAneicsICdfJywKKyAgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnYicsICd6JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdjJywgJ2UnLCAncScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsICdlJywgJ3EnLCAnXycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2MnLCAnZScsICdxJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdjJywgJ2UnLCAncScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsICdlJywgJ3EnLCAnaScsICdfJywKKyAgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnYycsICdlJywgJ3EnLCAnaScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsICdlJywgJ3EnLCAnaScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsICdlJywKKyAgJ3EnLCAnaScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnYycsICdmJywgJ2MnLCAnbScsICdzJywgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsICdsJywgJ2UnLCAnXycsICdzJywKKyAgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdjJywgJ2wnLCAnZScsICdfJywgJ3MnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnbCcsICdlJywgJ18nLCAncycsICdfJywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnYycsICdsJywgJ2UnLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdjJywgJ2wnLCAnZScsICdfJywgJ3UnLCAnXycsICdiJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2MnLCAnbCcsICdlJywgJ18nLCAndScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsICdsJywgJ2UnLCAnXycsICd1JywgJ18nLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdjJywKKyAgJ2wnLCAnZScsICdfJywgJ3UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnbCcsICdlJywgJ2knLCAnXycsICdzJywgJ18nLCAnYicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdjJywKKyAgJ2wnLCAnZScsICdpJywgJ18nLCAncycsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsICdsJywgJ2UnLCAnaScsICdfJywgJ3MnLCAnXycsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2MnLCAnbCcsICdlJywgJ2knLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdjJywgJ2wnLCAnZScsICdpJywgJ18nLCAndScsICdfJywKKyAgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnYycsICdsJywgJ2UnLCAnaScsICdfJywgJ3UnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnbCcsICdlJywgJ2knLCAnXycsICd1JywKKyAgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdjJywgJ2wnLCAnZScsICdpJywgJ18nLCAndScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsICdsJywgJ3QnLCAnXycsICdzJywKKyAgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdjJywgJ2wnLCAndCcsICdfJywgJ3MnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnbCcsICd0JywgJ18nLCAncycsICdfJywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnYycsICdsJywgJ3QnLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdjJywgJ2wnLCAndCcsICdfJywgJ3UnLCAnXycsICdiJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2MnLCAnbCcsICd0JywgJ18nLCAndScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsICdsJywgJ3QnLCAnXycsICd1JywgJ18nLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdjJywKKyAgJ2wnLCAndCcsICdfJywgJ3UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnbCcsICd0JywgJ2knLCAnXycsICdzJywgJ18nLCAnYicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdjJywKKyAgJ2wnLCAndCcsICdpJywgJ18nLCAncycsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsICdsJywgJ3QnLCAnaScsICdfJywgJ3MnLCAnXycsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2MnLCAnbCcsICd0JywgJ2knLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdjJywgJ2wnLCAndCcsICdpJywgJ18nLCAndScsICdfJywKKyAgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnYycsICdsJywgJ3QnLCAnaScsICdfJywgJ3UnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnbCcsICd0JywgJ2knLCAnXycsICd1JywKKyAgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdjJywgJ2wnLCAndCcsICdpJywgJ18nLCAndScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdjJywgJ20nLCAncCcsICdfJywKKyAgJ2UnLCAncScsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2MnLCAnbScsICdwJywgJ18nLCAnbCcsICdlJywgJ18nLCAncCcsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywKKyAgJ18nLCAnYycsICdtJywgJ3AnLCAnXycsICdsJywgJ3QnLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdjJywgJ20nLCAncCcsICdnJywKKyAgJ2QnLCAndScsICdfJywgJ2UnLCAncScsICdfJywgJ3EnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2MnLCAnbScsICdwJywgJ2cnLCAnZCcsICd1JywKKyAgJ18nLCAnbCcsICdlJywgJ18nLCAncScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnYycsICdtJywgJ3AnLCAnZycsICdkJywgJ3UnLCAnXycsICdsJywKKyAgJ3QnLCAnXycsICdxJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdjJywgJ20nLCAncCcsICdnJywgJ3UnLCAnXycsICdlJywgJ3EnLCAnXycsICdxJywKKyAgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywKKyAgJ3MnLCAnXycsICdjJywgJ20nLCAncCcsICdnJywgJ3UnLCAnXycsICdsJywgJ2UnLCAnXycsICdxJywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdjJywKKyAgJ20nLCAncCcsICdnJywgJ3UnLCAnXycsICdsJywgJ3QnLCAnXycsICdxJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdjJywgJ20nLCAncCcsICd1JywKKyAgJ18nLCAnZScsICdxJywgJ18nLCAncScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnYycsICdtJywgJ3AnLCAndScsICdfJywgJ2wnLCAnZScsICdfJywKKyAgJ3EnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywKKyAgJ3AnLCAncycsICdfJywgJ2MnLCAnbScsICdwJywgJ3UnLCAnXycsICdsJywgJ3QnLCAnXycsICdxJywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsICdvJywKKyAgJ3AnLCAneScsICdfJywgJ3MnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnbycsICdwJywgJ3knLCAnXycsICdzJywgJ18nLCAnZCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdjJywKKyAgJ28nLCAncCcsICd5JywgJ18nLCAncycsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnYycsICdvJywgJ3AnLCAneScsICdfJywgJ3MnLCAnXycsICd3JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2MnLCAnbycsICdwJywgJ3knLCAnXycsICd1JywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdjJywgJ28nLCAncCcsICd5JywgJ18nLCAndScsICdfJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnYycsICdvJywgJ3AnLCAneScsICdfJywgJ3UnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2MnLCAnbycsICdwJywgJ3knLCAnXycsICd1JywKKyAgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdjJywgJ3QnLCAnYycsICdtJywgJ3MnLCAnYScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdkJywgJ2knLCAndicsICdfJywgJ3MnLCAnXycsICdiJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2QnLCAnaScsICd2JywgJ18nLCAncycsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZCcsICdpJywgJ3YnLCAnXycsICdzJywgJ18nLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdkJywKKyAgJ2knLCAndicsICdfJywgJ3MnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2QnLCAnaScsICd2JywgJ18nLCAndScsICdfJywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZCcsICdpJywKKyAgJ3YnLCAnXycsICd1JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdkJywgJ2knLCAndicsICdfJywgJ3UnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2QnLCAnaScsICd2JywKKyAgJ18nLCAndScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdkJywgJ2wnLCAncycsICdhJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2QnLCAnbycsICd0JywgJ3AnLCAnXycsICdzJywKKyAgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdkJywgJ28nLCAndCcsICdwJywgJ18nLCAncycsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZCcsICdvJywgJ3QnLCAncCcsICdfJywKKyAgJ3MnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2QnLCAnbycsICd0JywgJ3AnLCAnXycsICd1JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdkJywgJ28nLCAndCcsICdwJywKKyAgJ18nLCAndScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnZCcsICdvJywgJ3QnLCAncCcsICdfJywgJ3UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnZCcsICdwJywKKyAgJ2EnLCAnXycsICd3JywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2QnLCAncCcsICdhJywgJ2QnLCAnZCcsICdfJywgJ3MnLCAnXycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2QnLCAncCcsICdhJywgJ2QnLCAnZCcsICdfJywgJ3MnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2QnLCAncCcsICdhJywgJ2QnLCAnZCcsICdfJywKKyAgJ3MnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2QnLCAncCcsICdhJywgJ2QnLCAnZCcsICdfJywgJ3UnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2QnLCAncCcsICdhJywKKyAgJ2QnLCAnZCcsICdfJywgJ3UnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2QnLCAncCcsICdhJywgJ2QnLCAnZCcsICdfJywgJ3UnLCAnXycsICd3JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywKKyAgJ18nLCAnZCcsICdwJywgJ2EnLCAncScsICdfJywgJ3MnLCAnXycsICd3JywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnZCcsICdwJywKKyAgJ2EnLCAncScsICdfJywgJ3MnLCAnYScsICdfJywgJ2wnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnZCcsICdwJywgJ2EnLCAncScsICd4JywKKyAgJ18nLCAncycsICdfJywgJ3cnLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdkJywgJ3AnLCAnYScsICdxJywgJ3gnLCAnXycsICdzJywKKyAgJ2EnLCAnXycsICd3JywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnZCcsICdwJywgJ2EnLCAndScsICdfJywgJ2gnLCAnXycsICdxJywKKyAgJ2InLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywKKyAgJ3AnLCAncycsICdfJywgJ2QnLCAncCcsICdhJywgJ3UnLCAnXycsICdoJywgJ18nLCAncScsICdiJywgJ3InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdkJywKKyAgJ3AnLCAnYScsICd4JywgJ18nLCAndycsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2QnLCAncCcsICdzJywgJ18nLCAndycsICdfJywKKyAgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywKKyAgJ3AnLCAncycsICdfJywgJ2QnLCAncCcsICdzJywgJ3EnLCAnXycsICdzJywgJ18nLCAndycsICdfJywgJ3AnLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywKKyAgJ2QnLCAncCcsICdzJywgJ3EnLCAnXycsICdzJywgJ2EnLCAnXycsICdsJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2QnLCAncCcsICdzJywKKyAgJ3EnLCAneCcsICdfJywgJ3MnLCAnXycsICd3JywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnZCcsICdwJywgJ3MnLCAncScsICd4JywKKyAgJ18nLCAncycsICdhJywgJ18nLCAndycsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2QnLCAncCcsICdzJywgJ3UnLCAnXycsICdoJywKKyAgJ18nLCAncScsICdiJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdkJywgJ3AnLCAncycsICd1JywgJ18nLCAnaCcsICdfJywgJ3EnLCAnYicsICdyJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2QnLCAncCcsICdzJywgJ3UnLCAnYicsICdfJywgJ3MnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2QnLCAncCcsICdzJywgJ3UnLCAnYicsICdfJywKKyAgJ3MnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2QnLCAncCcsICdzJywgJ3UnLCAnYicsICdfJywgJ3MnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2QnLCAncCcsICdzJywKKyAgJ3UnLCAnYicsICdfJywgJ3UnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2QnLCAncCcsICdzJywgJ3UnLCAnYicsICdfJywgJ3UnLCAnXycsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2QnLCAncCcsICdzJywgJ3UnLCAnYicsICdfJywgJ3UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnZCcsICdwJywgJ3MnLCAneCcsICdfJywKKyAgJ3cnLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdlJywgJ3gnLCAndCcsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnZScsICd4JywgJ3QnLCAncCcsICdkJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywKKyAgJ3MnLCAnXycsICdlJywgJ3gnLCAndCcsICdyJywgJ18nLCAncicsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdlJywgJ3gnLCAndCcsICdyJywKKyAgJ18nLCAncicsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2UnLCAneCcsICd0JywgJ3InLCAnXycsICdzJywgJ18nLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywKKyAgJ2UnLCAneCcsICd0JywgJ3InLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnYScsICdkJywgJ2QnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnYScsICdkJywKKyAgJ2QnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2YnLCAnYycsICdhJywgJ2YnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnYycsICdhJywgJ2YnLCAnXycsICd3JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2YnLCAnYycsICdlJywgJ3EnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnYycsICdlJywgJ3EnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnYycsICdsJywKKyAgJ2EnLCAncycsICdzJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2MnLCAnbCcsICdhJywgJ3MnLCAncycsICdfJywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdjJywKKyAgJ2wnLCAnZScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdjJywgJ2wnLCAnZScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdjJywgJ2wnLCAndCcsICdfJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnZicsICdjJywgJ2wnLCAndCcsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdjJywgJ24nLCAnZScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdjJywKKyAgJ24nLCAnZScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdjJywgJ28nLCAncicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdjJywgJ28nLCAncicsICdfJywKKyAgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnZicsICdjJywgJ3UnLCAnZScsICdxJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2MnLCAndScsICdlJywgJ3EnLCAnXycsICd3JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2YnLCAnYycsICd1JywgJ2wnLCAnZScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdjJywgJ3UnLCAnbCcsICdlJywgJ18nLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywKKyAgJ2MnLCAndScsICdsJywgJ3QnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnYycsICd1JywgJ2wnLCAndCcsICdfJywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdjJywKKyAgJ3UnLCAnbicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdjJywgJ3UnLCAnbicsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdjJywgJ3UnLCAnbicsICdlJywKKyAgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdmJywgJ2MnLCAndScsICduJywgJ2UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnZCcsICdpJywgJ3YnLCAnXycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2YnLCAnZCcsICdpJywgJ3YnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnZScsICd4JywgJ2QnLCAnbycsICdfJywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdlJywKKyAgJ3gnLCAnZCcsICdvJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2UnLCAneCcsICdwJywgJzInLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnZScsICd4JywKKyAgJ3AnLCAnMicsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdlJywgJ3gnLCAndScsICdwJywgJ2wnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnZScsICd4JywKKyAgJ3UnLCAncCcsICdsJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ2UnLCAneCcsICd1JywgJ3AnLCAncicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdlJywKKyAgJ3gnLCAndScsICdwJywgJ3InLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnZicsICdpJywgJ24nLCAndCcsICdfJywgJ3MnLCAnXycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2YnLCAnZicsICdpJywgJ24nLCAndCcsICdfJywgJ3MnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnZicsICdpJywgJ24nLCAndCcsICdfJywKKyAgJ3UnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2YnLCAnZicsICdpJywgJ24nLCAndCcsICdfJywgJ3UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnZicsICdxJywKKyAgJ2wnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2YnLCAnZicsICdxJywgJ2wnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnZicsICdxJywgJ3InLCAnXycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2YnLCAnZicsICdxJywgJ3InLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnaScsICdsJywgJ2wnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnaScsICdsJywKKyAgJ2wnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2YnLCAnaScsICdsJywgJ2wnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnaScsICdsJywgJ2wnLCAnXycsICd3JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2YnLCAnbCcsICdvJywgJ2cnLCAnMicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdsJywgJ28nLCAnZycsICcyJywgJ18nLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywKKyAgJ20nLCAnYScsICdkJywgJ2QnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdfJywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdtJywKKyAgJ2EnLCAneCcsICdfJywgJ2EnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnbScsICdhJywgJ3gnLCAnXycsICdhJywgJ18nLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywKKyAgJ20nLCAnYScsICd4JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ20nLCAnYScsICd4JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ20nLCAnaScsICduJywKKyAgJ18nLCAnYScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdtJywgJ2knLCAnbicsICdfJywgJ2EnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnbScsICdpJywKKyAgJ24nLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2YnLCAnbScsICdpJywgJ24nLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAnbScsICdzJywgJ3UnLCAnYicsICdfJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnZicsICdtJywgJ3MnLCAndScsICdiJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ20nLCAndScsICdsJywgJ18nLCAnZCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywKKyAgJ20nLCAndScsICdsJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ3InLCAnYycsICdwJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ3InLCAnYycsICdwJywKKyAgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdmJywgJ3InLCAnaScsICduJywgJ3QnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAncicsICdpJywgJ24nLCAndCcsICdfJywKKyAgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnZicsICdyJywgJ3MnLCAncScsICdyJywgJ3QnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAncicsICdzJywgJ3EnLCAncicsICd0JywKKyAgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdmJywgJ3MnLCAnYScsICdmJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ3MnLCAnYScsICdmJywgJ18nLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywKKyAgJ3MnLCAnZScsICdxJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ3MnLCAnZScsICdxJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ3MnLCAnbCcsICdlJywKKyAgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdmJywgJ3MnLCAnbCcsICdlJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ3MnLCAnbCcsICd0JywgJ18nLCAnZCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywKKyAgJ3MnLCAnbCcsICd0JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ3MnLCAnbicsICdlJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ3MnLCAnbicsICdlJywKKyAgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdmJywgJ3MnLCAnbycsICdyJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ3MnLCAnbycsICdyJywgJ18nLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywKKyAgJ3MnLCAncScsICdyJywgJ3QnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAncycsICdxJywgJ3InLCAndCcsICdfJywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdzJywKKyAgJ3UnLCAnYicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdzJywgJ3UnLCAnYicsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdzJywgJ3UnLCAnZScsICdxJywKKyAgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdmJywgJ3MnLCAndScsICdlJywgJ3EnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAncycsICd1JywgJ2wnLCAnZScsICdfJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnZicsICdzJywgJ3UnLCAnbCcsICdlJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ3MnLCAndScsICdsJywgJ3QnLCAnXycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2YnLCAncycsICd1JywgJ2wnLCAndCcsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdzJywgJ3UnLCAnbicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdzJywKKyAgJ3UnLCAnbicsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnZicsICdzJywgJ3UnLCAnbicsICdlJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywgJ3MnLCAndScsICduJywKKyAgJ2UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2YnLCAndCcsICdpJywgJ24nLCAndCcsICdfJywgJ3MnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAndCcsICdpJywKKyAgJ24nLCAndCcsICdfJywgJ3MnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAndCcsICdpJywgJ24nLCAndCcsICdfJywgJ3UnLCAnXycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2YnLCAndCcsICdpJywgJ24nLCAndCcsICdfJywgJ3UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAndCcsICdxJywgJ18nLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywKKyAgJ3QnLCAncScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnZicsICd0JywgJ3InLCAndScsICduJywgJ2MnLCAnXycsICdzJywgJ18nLCAnZCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdmJywKKyAgJ3QnLCAncicsICd1JywgJ24nLCAnYycsICdfJywgJ3MnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2YnLCAndCcsICdyJywgJ3UnLCAnbicsICdjJywKKyAgJ18nLCAndScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnZicsICd0JywgJ3InLCAndScsICduJywgJ2MnLCAnXycsICd1JywgJ18nLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdoJywKKyAgJ2EnLCAnZCcsICdkJywgJ18nLCAncycsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnaCcsICdhJywgJ2QnLCAnZCcsICdfJywgJ3MnLCAnXycsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2gnLCAnYScsICdkJywgJ2QnLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdoJywgJ2EnLCAnZCcsICdkJywgJ18nLCAndScsICdfJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnaCcsICdhJywgJ2QnLCAnZCcsICdfJywgJ3UnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2gnLCAnYScsICdkJywgJ2QnLCAnXycsICd1JywKKyAgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdoJywgJ3MnLCAndScsICdiJywgJ18nLCAncycsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnaCcsICdzJywgJ3UnLCAnYicsICdfJywKKyAgJ3MnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2gnLCAncycsICd1JywgJ2InLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdoJywgJ3MnLCAndScsICdiJywKKyAgJ18nLCAndScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnaCcsICdzJywgJ3UnLCAnYicsICdfJywgJ3UnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2gnLCAncycsICd1JywKKyAgJ2InLCAnXycsICd1JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdpJywgJ2wnLCAndicsICdlJywgJ3YnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2knLCAnbCcsICd2JywKKyAgJ2UnLCAndicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnaScsICdsJywgJ3YnLCAnZScsICd2JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdpJywgJ2wnLCAndicsICdlJywKKyAgJ3YnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2knLCAnbCcsICd2JywgJ2wnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2knLCAnbCcsICd2JywgJ2wnLCAnXycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2knLCAnbCcsICd2JywgJ2wnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2knLCAnbCcsICd2JywgJ2wnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2knLCAnbCcsICd2JywKKyAgJ28nLCAnZCcsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnaScsICdsJywgJ3YnLCAnbycsICdkJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdpJywgJ2wnLCAndicsICdvJywKKyAgJ2QnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2knLCAnbCcsICd2JywgJ28nLCAnZCcsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnaScsICdsJywgJ3YnLCAncicsICdfJywKKyAgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnaScsICdsJywgJ3YnLCAncicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnaScsICdsJywgJ3YnLCAncicsICdfJywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnaScsICdsJywKKyAgJ3YnLCAncicsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnaScsICduJywgJ3MnLCAnZScsICdyJywgJ3QnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ2knLCAnbicsICdzJywKKyAgJ2UnLCAncicsICd0JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdpJywgJ24nLCAncycsICdlJywgJ3InLCAndCcsICdfJywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnaScsICduJywKKyAgJ3MnLCAnZScsICdyJywgJ3QnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnaScsICduJywgJ3MnLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdpJywgJ24nLCAncycsICd2JywKKyAgJ2UnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2knLCAnbicsICdzJywgJ3YnLCAnZScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnaScsICduJywgJ3MnLCAndicsICdlJywKKyAgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdpJywgJ24nLCAncycsICd2JywgJ2UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnbCcsICdiJywgJ3UnLCAneCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdsJywKKyAgJ2QnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ2wnLCAnZCcsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbCcsICdkJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdsJywgJ2QnLCAnXycsICd3JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2wnLCAnZCcsICdpJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdsJywgJ2QnLCAnaScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbCcsICdkJywgJ2knLCAnXycsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ2wnLCAnZCcsICdpJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ2wnLCAnaCcsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnbCcsICdzJywgJ2EnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdsJywKKyAgJ3cnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywKKyAgJ3AnLCAncycsICdfJywgJ20nLCAnYScsICdkJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdhJywgJ2QnLCAnZCcsICdfJywgJ3EnLCAnXycsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ20nLCAnYScsICdkJywgJ2QnLCAnXycsICdxJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ2EnLCAnZCcsICdkJywgJ3InLCAnXycsICdxJywKKyAgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdtJywgJ2EnLCAnZCcsICdkJywgJ3InLCAnXycsICdxJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ20nLCAnYScsICdkJywKKyAgJ2QnLCAndScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdtJywgJ2EnLCAnZCcsICdkJywgJ3YnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnYScsICdkJywgJ2QnLCAndicsICdfJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnbScsICdhJywgJ2QnLCAnZCcsICd2JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ2EnLCAnZCcsICdkJywgJ3YnLCAnXycsICd3JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywKKyAgJ18nLCAnbScsICdhJywgJ3EnLCAnXycsICdzJywgJ18nLCAndycsICdfJywgJ3AnLCAnaCcsICdsJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnbScsICdhJywKKyAgJ3EnLCAnXycsICdzJywgJ18nLCAndycsICdfJywgJ3AnLCAnaCcsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnbScsICdhJywgJ3EnLCAnXycsICdzJywKKyAgJ2EnLCAnXycsICd3JywgJ18nLCAncCcsICdoJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdtJywgJ2EnLCAncScsICdfJywgJ3MnLCAnYScsICdfJywKKyAgJ3cnLCAnXycsICdwJywgJ2gnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ2EnLCAneCcsICdfJywgJ2EnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnYScsICd4JywKKyAgJ18nLCAnYScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdhJywgJ3gnLCAnXycsICdhJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ2EnLCAneCcsICdfJywKKyAgJ2EnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ20nLCAnYScsICd4JywgJ18nLCAncycsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdhJywgJ3gnLCAnXycsICdzJywKKyAgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdtJywgJ2EnLCAneCcsICdfJywgJ3MnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnYScsICd4JywgJ18nLCAncycsICdfJywKKyAgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnbScsICdhJywgJ3gnLCAnXycsICd1JywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ2EnLCAneCcsICdfJywgJ3UnLCAnXycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ20nLCAnYScsICd4JywgJ18nLCAndScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdhJywgJ3gnLCAnXycsICd1JywgJ18nLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywKKyAgJ2EnLCAneCcsICdpJywgJ18nLCAncycsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdhJywgJ3gnLCAnaScsICdfJywgJ3MnLCAnXycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ20nLCAnYScsICd4JywgJ2knLCAnXycsICdzJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ2EnLCAneCcsICdpJywgJ18nLCAncycsICdfJywKKyAgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnbScsICdhJywgJ3gnLCAnaScsICdfJywgJ3UnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnYScsICd4JywgJ2knLCAnXycsICd1JywKKyAgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdtJywgJ2EnLCAneCcsICdpJywgJ18nLCAndScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdhJywgJ3gnLCAnaScsICdfJywKKyAgJ3UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ20nLCAnaScsICduJywgJ18nLCAnYScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdtJywgJ2knLCAnbicsICdfJywgJ2EnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnaScsICduJywgJ18nLCAnYScsICdfJywKKyAgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnbScsICdpJywgJ24nLCAnXycsICdzJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ2knLCAnbicsICdfJywgJ3MnLCAnXycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ20nLCAnaScsICduJywgJ18nLCAncycsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdpJywgJ24nLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywKKyAgJ2knLCAnbicsICdfJywgJ3UnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnaScsICduJywgJ18nLCAndScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdpJywKKyAgJ24nLCAnXycsICd1JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ2knLCAnbicsICdfJywgJ3UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnaScsICduJywKKyAgJ2knLCAnXycsICdzJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ2knLCAnbicsICdpJywgJ18nLCAncycsICdfJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdpJywKKyAgJ24nLCAnaScsICdfJywgJ3MnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnaScsICduJywgJ2knLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywKKyAgJ2knLCAnbicsICdpJywgJ18nLCAndScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdpJywgJ24nLCAnaScsICdfJywgJ3UnLCAnXycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ20nLCAnaScsICduJywgJ2knLCAnXycsICd1JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ2knLCAnbicsICdpJywgJ18nLCAndScsICdfJywKKyAgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnbScsICdvJywgJ2QnLCAnXycsICdzJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ28nLCAnZCcsICdfJywgJ3MnLCAnXycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ20nLCAnbycsICdkJywgJ18nLCAncycsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdvJywgJ2QnLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywKKyAgJ28nLCAnZCcsICdfJywgJ3UnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAnbycsICdkJywgJ18nLCAndScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdvJywKKyAgJ2QnLCAnXycsICd1JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ28nLCAnZCcsICdfJywgJ3UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnbScsICdvJywKKyAgJ2QnLCAncycsICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdvJywgJ3YnLCAnZScsICdfJywgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdtJywgJ3MnLCAndScsICdiJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ20nLCAncycsICd1JywgJ2InLCAnXycsICdxJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ3MnLCAndScsICdiJywgJ18nLCAncScsICdfJywKKyAgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnbScsICdzJywgJ3UnLCAnYicsICdyJywgJ18nLCAncScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdzJywgJ3UnLCAnYicsICdyJywKKyAgJ18nLCAncScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdtJywgJ3MnLCAndScsICdiJywgJ3UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICdzJywgJ3UnLCAnYicsICd2JywKKyAgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdtJywgJ3MnLCAndScsICdiJywgJ3YnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAncycsICd1JywgJ2InLCAndicsICdfJywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnbScsICdzJywgJ3UnLCAnYicsICd2JywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ20nLCAndCcsICdoJywgJ2wnLCAnaScsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywKKyAgJ18nLCAnbScsICd1JywgJ2wnLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAnbScsICd1JywgJ2wnLCAnXycsICdxJywgJ18nLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywKKyAgJ3UnLCAnbCcsICdfJywgJ3EnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnbScsICd1JywgJ2wnLCAnXycsICdzJywgJ18nLCAncCcsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywKKyAgJ18nLCAnbScsICd1JywgJ2wnLCAnZScsICdxJywgJ18nLCAncycsICdfJywgJ3cnLCAnXycsICdwJywgJ2gnLCAnbCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywKKyAgJ20nLCAndScsICdsJywgJ2UnLCAncScsICdfJywgJ3MnLCAnXycsICd3JywgJ18nLCAncCcsICdoJywgJ3InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdtJywKKyAgJ3UnLCAnbCcsICdlJywgJ3UnLCAnXycsICdzJywgJ18nLCAncCcsICdoJywgJ18nLCAncScsICdiJywgJ2wnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdtJywKKyAgJ3UnLCAnbCcsICdlJywgJ3UnLCAnXycsICdzJywgJ18nLCAncCcsICdoJywgJ18nLCAncScsICdiJywgJ3InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdtJywKKyAgJ3UnLCAnbCcsICdxJywgJ18nLCAncicsICdzJywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnbScsICd1JywgJ2wnLCAncScsICdfJywKKyAgJ3InLCAncycsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdtJywgJ3UnLCAnbCcsICdxJywgJ18nLCAncycsICdfJywgJ3AnLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywKKyAgJ20nLCAndScsICdsJywgJ3EnLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdtJywgJ3UnLCAnbCcsICdyJywgJ18nLCAncScsICdfJywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAnbScsICd1JywgJ2wnLCAncicsICdfJywgJ3EnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnbScsICd1JywgJ2wnLCAncycsICdhJywKKyAgJ18nLCAndycsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ20nLCAndScsICdsJywgJ3MnLCAnYScsICdxJywgJ18nLCAncycsICdfJywKKyAgJ3cnLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdtJywgJ3UnLCAnbCcsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAnbScsICd1JywgJ2wnLCAndCcsICd1JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ20nLCAndScsICdsJywgJ3YnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAndScsICdsJywgJ3YnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ20nLCAndScsICdsJywKKyAgJ3YnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ20nLCAndScsICdsJywgJ3YnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ24nLCAnbCcsICdvJywgJ2MnLCAnXycsICdiJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ24nLCAnbCcsICdvJywgJ2MnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ24nLCAnbCcsICdvJywgJ2MnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ24nLCAnbCcsICdvJywKKyAgJ2MnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ24nLCAnbCcsICd6JywgJ2MnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ24nLCAnbCcsICd6JywgJ2MnLCAnXycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ24nLCAnbCcsICd6JywgJ2MnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ24nLCAnbCcsICd6JywgJ2MnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ24nLCAnbycsICdyJywKKyAgJ18nLCAndicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICduJywgJ28nLCAncicsICdpJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdvJywgJ3InLCAnXycsICd2JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ28nLCAncicsICdpJywKKyAgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywKKyAgJ3AnLCAncycsICdfJywgJ3AnLCAnYScsICdjJywgJ2snLCAncicsICdsJywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3AnLCAnYycsICdrJywKKyAgJ2UnLCAndicsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAncCcsICdjJywgJ2snLCAnZScsICd2JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdwJywgJ2MnLCAnaycsICdlJywKKyAgJ3YnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ3AnLCAnYycsICdrJywgJ2UnLCAndicsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncCcsICdjJywgJ2snLCAnbycsICdkJywKKyAgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdwJywgJ2MnLCAnaycsICdvJywgJ2QnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3AnLCAnYycsICdrJywgJ28nLCAnZCcsICdfJywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAncCcsICdjJywgJ2snLCAnbycsICdkJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdwJywgJ2MnLCAnbicsICd0JywgJ18nLCAnYicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdwJywKKyAgJ2MnLCAnbicsICd0JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdwJywgJ2MnLCAnbicsICd0JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdwJywgJ2MnLCAnbicsICd0JywKKyAgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywKKyAgJ3AnLCAncycsICdfJywgJ3AnLCAnaScsICdjJywgJ2snLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdwJywgJ2knLCAnYycsICdrJywKKyAgJ18nLCAncScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ2knLCAncCcsICdzJywgJ18nLCAncCcsICdyJywgJ2UnLCAnYycsICdlJywgJ3EnLCAnXycsICd3JywgJ18nLCAncCcsICdoJywKKyAgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywKKyAgJ3MnLCAnXycsICdwJywgJ3InLCAnZScsICdjJywgJ2UnLCAncScsICdfJywgJ3cnLCAnXycsICdwJywgJ2gnLCAncicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywKKyAgJ3AnLCAncicsICdlJywgJ2MnLCAnZScsICdxJywgJ3UnLCAnXycsICdwJywgJ2gnLCAnXycsICdxJywgJ2InLCAnbCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywKKyAgJ3AnLCAncicsICdlJywgJ2MnLCAnZScsICdxJywgJ3UnLCAnXycsICdwJywgJ2gnLCAnXycsICdxJywgJ2InLCAnbCcsICdhJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywKKyAgJ18nLCAncCcsICdyJywgJ2UnLCAnYycsICdlJywgJ3EnLCAndScsICdfJywgJ3AnLCAnaCcsICdfJywgJ3EnLCAnYicsICdyJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywKKyAgJ18nLCAncCcsICdyJywgJ2UnLCAnYycsICdlJywgJ3EnLCAndScsICdfJywgJ3AnLCAnaCcsICdfJywgJ3EnLCAnYicsICdyJywKKyAgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywKKyAgJ3MnLCAnXycsICdwJywgJ3InLCAnZScsICdjJywgJ2UnLCAndScsICdfJywgJ3AnLCAnaCcsICdfJywgJ3EnLCAnYicsICdsJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywKKyAgJ18nLCAncCcsICdyJywgJ2UnLCAnYycsICdlJywgJ3UnLCAnXycsICdwJywgJ2gnLCAnXycsICdxJywgJ2InLCAnbCcsICdhJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywKKyAgJ18nLCAncCcsICdyJywgJ2UnLCAnYycsICdlJywgJ3UnLCAnXycsICdwJywgJ2gnLCAnXycsICdxJywgJ2InLCAncicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywKKyAgJ3AnLCAncicsICdlJywgJ2MnLCAnZScsICd1JywgJ18nLCAncCcsICdoJywgJ18nLCAncScsICdiJywgJ3InLCAnYScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywKKyAgJ3AnLCAncicsICdlJywgJ2MnLCAncicsICdfJywgJ3EnLCAnYicsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3AnLCAncicsICdlJywKKyAgJ2MnLCAncicsICdfJywgJ3MnLCAncicsICdhJywgJ18nLCAncCcsICdoJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3AnLCAncicsICdlJywKKyAgJ2MnLCAncicsICdfJywgJ3MnLCAncicsICdhJywgJ18nLCAncicsICdfJywgJ3AnLCAnaCcsICdfJywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdwJywKKyAgJ3InLCAnZScsICdjJywgJ3InLCAncScsICdfJywgJ3AnLCAnaCcsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdwJywgJ3InLCAnZScsICdjJywKKyAgJ3InLCAncScsICdfJywgJ3EnLCAnYicsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3AnLCAncicsICdlJywgJ2MnLCAncicsICdxJywKKyAgJ18nLCAncicsICdzJywgJ18nLCAncCcsICdoJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3AnLCAncicsICdlJywgJ2MnLCAncicsICdxJywKKyAgJ3UnLCAnXycsICdzJywgJ18nLCAncScsICdiJywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAncCcsICdyJywgJ2UnLCAncCcsICdlJywKKyAgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywKKyAgJ3AnLCAncycsICdfJywgJ3InLCAnYScsICdkJywgJ2QnLCAndScsICdfJywgJ3cnLCAnXycsICdxJywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdyJywKKyAgJ2QnLCAnZCcsICdzJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdyJywgJ2UnLCAncCcsICdsJywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAncicsICdlJywKKyAgJ3AnLCAnbCcsICdfJywgJ3EnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ3MnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAnYScsICd0JywKKyAgJ18nLCAncycsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICdzJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywKKyAgJ3MnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAndScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdhJywgJ3QnLCAnXycsICd1JywKKyAgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdzJywgJ2EnLCAndCcsICdfJywgJ3UnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAnYScsICd0JywgJ18nLCAndScsICdfJywKKyAgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAncycsICdoJywgJ2YnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAnaCcsICdmJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ2gnLCAnZicsICdfJywKKyAgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywKKyAgJ3MnLCAnXycsICdzJywgJ2gnLCAnaScsICdsJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdzJywgJ2gnLCAnbCcsICdsJywgJ18nLCAncCcsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywKKyAgJ18nLCAncycsICdoJywgJ2wnLCAnbCcsICdfJywgJ3EnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3MnLCAnaCcsICdsJywgJ2wnLCAnXycsICdzJywKKyAgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ2knLCAncCcsICdzJywgJ18nLCAncycsICdoJywgJ2wnLCAnbCcsICdfJywgJ3MnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAncycsICdoJywKKyAgJ3InLCAnYScsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3MnLCAnaCcsICdyJywgJ2EnLCAnXycsICdxJywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdzJywKKyAgJ2gnLCAncicsICdhJywgJ18nLCAncicsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3MnLCAnaCcsICdyJywgJ2EnLCAnXycsICdyJywKKyAgJ18nLCAncScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ2knLCAncCcsICdzJywgJ18nLCAncycsICdoJywgJ3InLCAnYScsICdfJywgJ3InLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAncycsICdoJywKKyAgJ3InLCAnbCcsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3MnLCAnaCcsICdyJywgJ2wnLCAnXycsICdxJywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdsJywKKyAgJ2QnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ3MnLCAnbCcsICdkJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ2wnLCAnZCcsICdfJywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdsJywKKyAgJ2QnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ3MnLCAnbCcsICdkJywgJ2knLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAnbCcsICdkJywgJ2knLCAnXycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ3MnLCAnbCcsICdkJywgJ2knLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAnbCcsICdkJywgJ2knLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAnbCcsICdsJywKKyAgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdzJywgJ2wnLCAnbCcsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdsJywgJ2wnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAnbCcsICdsJywKKyAgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdzJywgJ2wnLCAnbCcsICdpJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ2wnLCAnbCcsICdpJywgJ18nLCAnZCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywKKyAgJ2wnLCAnbCcsICdpJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ2wnLCAnbCcsICdpJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ3AnLCAnbCcsICdhJywKKyAgJ3QnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ3MnLCAncCcsICdsJywgJ2EnLCAndCcsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdwJywgJ2wnLCAnYScsICd0JywKKyAgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdzJywgJ3AnLCAnbCcsICdhJywgJ3QnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncCcsICdsJywgJ2EnLCAndCcsICdpJywKKyAgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdzJywgJ3AnLCAnbCcsICdhJywgJ3QnLCAnaScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdwJywgJ2wnLCAnYScsICd0JywKKyAgJ2knLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ3MnLCAncCcsICdsJywgJ2EnLCAndCcsICdpJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ3InLCAnYScsICdfJywKKyAgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAncycsICdyJywgJ2EnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsICdhJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ3InLCAnYScsICdfJywKKyAgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAncycsICdyJywgJ2EnLCAnaScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdyJywgJ2EnLCAnaScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdyJywKKyAgJ2EnLCAnaScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAncycsICdyJywgJ2EnLCAnaScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdyJywgJ2EnLCAncicsICdfJywKKyAgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAncycsICdyJywgJ2EnLCAncicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdyJywgJ2EnLCAncicsICdfJywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdyJywKKyAgJ2EnLCAncicsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAncycsICdyJywgJ2EnLCAncicsICdpJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ3InLCAnYScsICdyJywKKyAgJ2knLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsICdhJywgJ3InLCAnaScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdyJywgJ2EnLCAncicsICdpJywKKyAgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdzJywgJ3InLCAnbCcsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdyJywgJ2wnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsICdsJywKKyAgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdzJywgJ3InLCAnbCcsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdyJywgJ2wnLCAnaScsICdfJywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdyJywKKyAgJ2wnLCAnaScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAncycsICdyJywgJ2wnLCAnaScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdyJywgJ2wnLCAnaScsICdfJywKKyAgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAncycsICdyJywgJ2wnLCAncicsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdyJywgJ2wnLCAncicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdyJywKKyAgJ2wnLCAncicsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAncycsICdyJywgJ2wnLCAncicsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICdyJywgJ2wnLCAncicsICdpJywKKyAgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdzJywgJ3InLCAnbCcsICdyJywgJ2knLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAncicsICdsJywgJ3InLCAnaScsICdfJywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAncycsICdyJywgJ2wnLCAncicsICdpJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ3QnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAndCcsICdfJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAncycsICd0JywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ3QnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAncycsICd1JywgJ2InLCAncScsICdfJywKKyAgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywKKyAgJ3AnLCAncycsICdfJywgJ3MnLCAndScsICdiJywgJ3EnLCAnXycsICdzJywgJ18nLCAncCcsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAncycsICd1JywKKyAgJ2InLCAncScsICdfJywgJ3MnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAncycsICd1JywgJ2InLCAncScsICdoJywgJ18nLCAncCcsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywKKyAgJ18nLCAncycsICd1JywgJ2InLCAncScsICdoJywgJ18nLCAncicsICdfJywgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3MnLCAndScsICdiJywKKyAgJ3EnLCAnaCcsICdfJywgJ3InLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAncycsICd1JywgJ2InLCAncScsICdoJywgJ18nLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywKKyAgJ3UnLCAnYicsICdzJywgJ18nLCAncycsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICd1JywgJ2InLCAncycsICdfJywgJ3MnLCAnXycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywKKyAgJ3MnLCAndScsICdiJywgJ3MnLCAnXycsICdzJywgJ18nLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ3UnLCAnYicsICdzJywgJ18nLCAncycsICdfJywKKyAgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAncycsICd1JywgJ2InLCAncycsICdfJywgJ3UnLCAnXycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAndScsICdiJywgJ3MnLCAnXycsICd1JywKKyAgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICdzJywgJ3UnLCAnYicsICdzJywgJ18nLCAndScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICd1JywgJ2InLCAncycsICdfJywKKyAgJ3UnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ3MnLCAndScsICdiJywgJ3MnLCAndScsICdzJywgJ18nLCAndScsICdfJywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICd1JywKKyAgJ2InLCAncycsICd1JywgJ3MnLCAnXycsICd1JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ3UnLCAnYicsICdzJywgJ3UnLCAncycsICdfJywKKyAgJ3UnLCAnXycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ3MnLCAndScsICdiJywgJ3MnLCAndScsICdzJywgJ18nLCAndScsICdfJywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICd1JywKKyAgJ2InLCAncycsICd1JywgJ3UnLCAnXycsICdzJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ3UnLCAnYicsICdzJywgJ3UnLCAndScsICdfJywKKyAgJ3MnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywKKyAgJ3MnLCAnYScsICdfJywgJ3MnLCAndScsICdiJywgJ3MnLCAndScsICd1JywgJ18nLCAncycsICdfJywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICd1JywKKyAgJ2InLCAncycsICd1JywgJ3UnLCAnXycsICdzJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3MnLCAndScsICdiJywgJ3UnLCAnXycsICdwJywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAnaScsICdwJywKKyAgJ3MnLCAnXycsICdzJywgJ3UnLCAnYicsICd1JywgJ18nLCAncScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ2knLCAncCcsICdzJywgJ18nLCAncycsICd1JywgJ2InLCAndScsICdfJywKKyAgJ3MnLCAnXycsICdwJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAnaScsICdwJywgJ3MnLCAnXycsICdzJywgJ3UnLCAnYicsICd1JywgJ18nLCAncycsICdfJywgJ3EnLCAnYicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywKKyAgJ3MnLCAndScsICdiJywgJ3UnLCAnaCcsICdfJywgJ3EnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3MnLCAndScsICdiJywgJ3UnLCAnaCcsICdfJywKKyAgJ3InLCAnXycsICdxJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAncycsICd1JywgJ2InLCAndicsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICd1JywgJ2InLCAndicsICdfJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAncycsICd1JywgJ2InLCAndicsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICd1JywgJ2InLCAndicsICdfJywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywgJ18nLCAncycsICd1JywKKyAgJ2InLCAndicsICdpJywgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICdzJywgJ3UnLCAnYicsICd2JywgJ2knLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdtJywgJ3MnLCAnYScsICdfJywgJ3MnLCAndScsICdiJywKKyAgJ3YnLCAnaScsICdfJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ20nLCAncycsICdhJywgJ18nLCAncycsICd1JywgJ2InLCAndicsICdpJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICd2JywgJ3MnLCAnaCcsICdmJywKKyAgJ18nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywKKyAgJ2EnLCAnXycsICd2JywgJ3MnLCAnaCcsICdmJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICd2JywgJ3MnLCAnaCcsICdmJywgJ18nLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICd2JywKKyAgJ3MnLCAnaCcsICdmJywgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnbScsICdpJywgJ3AnLCAncycsICdfJywgJ3cnLCAncicsICdkJywgJ3MnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnbScsICdzJywgJ2EnLCAnXycsICd4JywgJ28nLCAncicsICdfJywKKyAgJ3YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ20nLCAncycsICdhJywKKyAgJ18nLCAneCcsICdvJywgJ3InLCAnaScsICdfJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ2EnLCAnZCcsICdkJywgJ18nLCAncicsICdtJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAnYScsICdkJywgJ2QnLCAnXycsICdyJywgJ20nLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdhJywgJ2QnLCAnZCcsICdfJywgJ3InLCAnbScsICdfJywgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnYScsICdkJywgJ2QnLCAnXycsICdyJywgJ24nLCAnXycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdhJywgJ2QnLCAnZCcsICdfJywgJ3InLCAnbicsICdfJywKKyAgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2EnLCAnZCcsICdkJywgJ18nLCAncicsICduJywKKyAgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdhJywKKyAgJ2QnLCAnZCcsICdfJywgJ3InLCAncCcsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ2EnLCAnZCcsICdkJywgJ18nLCAncicsICdwJywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAnYScsICdkJywgJ2QnLCAnXycsICdyJywgJ3AnLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2EnLCAnZCcsICdkJywgJ18nLCAncicsICd6JywgJ18nLCAnZCcsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnYScsICdkJywgJ2QnLCAnXycsICdyJywgJ3onLCAnXycsICdmJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdhJywgJ2QnLCAnZCcsICdfJywgJ3InLCAneicsICdfJywKKyAgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnYicsICdhJywKKyAgJ3InLCAnXycsICdzJywgJ3knLCAnbicsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdiJywKKyAgJ2EnLCAncicsICdfJywgJ3cnLCAnYScsICdyJywgJ3AnLCAnXycsICdzJywgJ3knLCAnbicsICdjJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdiJywgJ2EnLCAncicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAnYicsICdhJywgJ3InLCAnXycsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdiJywKKyAgJ2EnLCAncicsICdyJywgJ2knLCAnZScsICdyJywgJ18nLCAncycsICd5JywgJ24nLCAnYycsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAnYicsICdhJywgJ3InLCAncicsICdpJywgJ2UnLCAncicsICdfJywgJ3MnLCAneScsICduJywKKyAgJ2MnLCAnXycsICdjJywgJ24nLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdzJywgJ3knLCAnbicsICdjJywgJ3QnLCAnaCcsICdyJywKKyAgJ2UnLCAnYScsICdkJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2InLCAnYScsICdyJywKKyAgJzAnLCAnXycsICdhJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnYicsICdhJywKKyAgJ3InLCAnMCcsICdfJywgJ28nLCAncicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnYicsICdhJywKKyAgJ3InLCAnMCcsICdfJywgJ3AnLCAnbycsICdwJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ2InLCAnaScsICd0JywgJ2MnLCAnYScsICdzJywgJ3QnLCAnXycsICdkJywgJzInLCAnbCcsICdsJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdiJywgJ2knLCAndCcsICdjJywgJ2EnLCAncycsICd0JywgJ18nLCAnZicsICcyJywKKyAgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2InLCAnaScsICd0JywgJ2MnLCAnYScsICdzJywKKyAgJ3QnLCAnXycsICdpJywgJzInLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnYicsICdpJywKKyAgJ3QnLCAnYycsICdhJywgJ3MnLCAndCcsICdfJywgJ2wnLCAnbCcsICcyJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ2MnLCAnZScsICdpJywgJ2wnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdjJywgJ2UnLCAnaScsICdsJywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAnYycsICdlJywgJ2knLCAnbCcsICdfJywgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAnYycsICdvJywgJ3MnLCAnXycsICdhJywgJ3AnLCAncCcsICdyJywgJ28nLCAneCcsICdfJywKKyAgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2MnLCAnbycsICdzJywgJ18nLCAnYScsICdwJywKKyAgJ3AnLCAncicsICdvJywgJ3gnLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ2QnLCAnMicsICdmJywgJ18nLCAncicsICdtJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdkJywgJzInLCAnZicsICdfJywgJ3InLCAnbScsICdfJywgJ2YnLCAndCcsICd6JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJzInLCAnZicsICdfJywgJ3InLCAnbicsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICcyJywgJ2YnLCAnXycsICdyJywgJ24nLCAnXycsICdmJywgJ3QnLCAneicsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICcyJywgJ2YnLCAnXycsICdyJywgJ3AnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2QnLCAnMicsICdmJywgJ18nLCAncicsICdwJywgJ18nLCAnZicsICd0JywKKyAgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2QnLCAnMicsICdmJywgJ18nLCAncicsICd6JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJzInLCAnZicsICdfJywgJ3InLCAneicsICdfJywKKyAgJ2YnLCAndCcsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJzInLCAnaScsICdfJywKKyAgJ2gnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICcyJywgJ2knLCAnXycsICdsJywKKyAgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2QnLCAnMicsICdpJywgJ18nLCAncicsICdtJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJzInLCAnaScsICdfJywgJ3InLCAnbicsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICcyJywgJ2knLCAnXycsICdyJywgJ3AnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2QnLCAnMicsICdpJywgJ18nLCAncicsICd6JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJzInLCAnbCcsICdsJywgJ18nLCAncicsICdtJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJzInLCAnbCcsICdsJywgJ18nLCAncicsICduJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJzInLCAnbCcsICdsJywgJ18nLCAncicsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJzInLCAnbCcsICdsJywgJ18nLCAncicsICd6JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJzInLCAndScsICdpJywgJ18nLCAncicsICdtJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJzInLCAndScsICdpJywgJ18nLCAncicsICduJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJzInLCAndScsICdpJywgJ18nLCAncicsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJzInLCAndScsICdpJywgJ18nLCAncicsICd6JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJzInLCAndScsICdsJywgJ2wnLCAnXycsICdyJywgJ20nLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2QnLCAnMicsICd1JywgJ2wnLCAnbCcsICdfJywgJ3InLCAnbicsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICcyJywgJ3UnLCAnbCcsICdsJywgJ18nLCAncicsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJzInLCAndScsICdsJywgJ2wnLCAnXycsICdyJywKKyAgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2QnLCAnaScsICd2JywgJ18nLCAnYScsICdwJywKKyAgJ3AnLCAncicsICdvJywgJ3gnLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywKKyAgJ2knLCAndicsICdfJywgJ2EnLCAncCcsICdwJywgJ3InLCAnbycsICd4JywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJ2knLCAndicsICdfJywgJ3InLCAnbScsICdfJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2QnLCAnaScsICd2JywgJ18nLCAncicsICdtJywKKyAgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICdpJywgJ3YnLCAnXycsICdyJywKKyAgJ20nLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ2QnLCAnaScsICd2JywgJ18nLCAncicsICduJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAnZCcsICdpJywgJ3YnLCAnXycsICdyJywgJ24nLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdkJywgJ2knLCAndicsICdfJywgJ3InLCAnbicsICdfJywgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZCcsICdpJywgJ3YnLCAnXycsICdyJywgJ3AnLCAnXycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywgJ2knLCAndicsICdfJywgJ3InLCAncCcsICdfJywKKyAgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2QnLCAnaScsICd2JywgJ18nLCAncicsICdwJywKKyAgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdkJywKKyAgJ2knLCAndicsICdfJywgJ3InLCAneicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ2QnLCAnaScsICd2JywgJ18nLCAncicsICd6JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAnZCcsICdpJywgJ3YnLCAnXycsICdyJywgJ3onLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2UnLCAneCcsICcyJywgJ18nLCAnYScsICdwJywgJ3AnLCAncicsICdvJywKKyAgJ3gnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdlJywgJ3gnLCAnMicsICdfJywKKyAgJ2EnLCAncCcsICdwJywgJ3InLCAnbycsICd4JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAnZScsICd4JywgJzInLCAnXycsICdhJywgJ3AnLCAncCcsICdyJywgJ28nLCAneCcsICdfJywgJ2YnLCAndCcsICd6JywKKyAgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICcyJywgJ2gnLCAnXycsICdyJywKKyAgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnMicsICdoJywgJ18nLCAncicsICduJywKKyAgJ18nLCAnZicsICd0JywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnMicsICdpJywKKyAgJ18nLCAncicsICdtJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywgJzInLCAnaScsICdfJywKKyAgJ3InLCAnbScsICdfJywgJ2YnLCAndCcsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywKKyAgJzInLCAnaScsICdfJywgJ3InLCAnbicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICcyJywKKyAgJ2knLCAnXycsICdyJywgJ24nLCAnXycsICdmJywgJ3QnLCAneicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAnZicsICcyJywgJ2knLCAnXycsICdyJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ2YnLCAnMicsICdpJywgJ18nLCAncicsICdwJywgJ18nLCAnZicsICd0JywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ2YnLCAnMicsICdpJywgJ18nLCAncicsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdmJywgJzInLCAnaScsICdfJywgJ3InLCAneicsICdfJywgJ2YnLCAndCcsICd6JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywgJzInLCAnbCcsICdsJywgJ18nLCAncicsICdtJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywgJzInLCAnbCcsICdsJywgJ18nLCAncicsICdtJywgJ18nLCAnZicsICd0JywKKyAgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnMicsICdsJywgJ2wnLCAnXycsICdyJywKKyAgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnMicsICdsJywgJ2wnLCAnXycsICdyJywKKyAgJ24nLCAnXycsICdmJywgJ3QnLCAneicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICcyJywKKyAgJ2wnLCAnbCcsICdfJywgJ3InLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICcyJywKKyAgJ2wnLCAnbCcsICdfJywgJ3InLCAncCcsICdfJywgJ2YnLCAndCcsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdmJywgJzInLCAnbCcsICdsJywgJ18nLCAncicsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdmJywgJzInLCAnbCcsICdsJywgJ18nLCAncicsICd6JywgJ18nLCAnZicsICd0JywgJ3onLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnMicsICd1JywgJ2knLCAnXycsICdyJywgJ20nLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnMicsICd1JywgJ2knLCAnXycsICdyJywgJ20nLCAnXycsICdmJywKKyAgJ3QnLCAneicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICcyJywgJ3UnLCAnaScsICdfJywKKyAgJ3InLCAnbicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICcyJywgJ3UnLCAnaScsICdfJywKKyAgJ3InLCAnbicsICdfJywgJ2YnLCAndCcsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywKKyAgJzInLCAndScsICdpJywgJ18nLCAncicsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywKKyAgJzInLCAndScsICdpJywgJ18nLCAncicsICdwJywgJ18nLCAnZicsICd0JywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ2YnLCAnMicsICd1JywgJ2knLCAnXycsICdyJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ2YnLCAnMicsICd1JywgJ2knLCAnXycsICdyJywgJ3onLCAnXycsICdmJywgJ3QnLCAneicsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICcyJywgJ3UnLCAnbCcsICdsJywgJ18nLCAncicsICdtJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywgJzInLCAndScsICdsJywgJ2wnLCAnXycsICdyJywKKyAgJ20nLCAnXycsICdmJywgJ3QnLCAneicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICcyJywKKyAgJ3UnLCAnbCcsICdsJywgJ18nLCAncicsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywKKyAgJzInLCAndScsICdsJywgJ2wnLCAnXycsICdyJywgJ24nLCAnXycsICdmJywgJ3QnLCAneicsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICcyJywgJ3UnLCAnbCcsICdsJywgJ18nLCAncicsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywgJzInLCAndScsICdsJywgJ2wnLCAnXycsICdyJywgJ3AnLCAnXycsICdmJywKKyAgJ3QnLCAneicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICcyJywgJ3UnLCAnbCcsICdsJywKKyAgJ18nLCAncicsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywgJzInLCAndScsICdsJywKKyAgJ2wnLCAnXycsICdyJywgJ3onLCAnXycsICdmJywgJ3QnLCAneicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAnZicsICdhJywgJ2InLCAncycsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ2YnLCAnYScsICdiJywgJ3MnLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywKKyAgJ2EnLCAnYicsICdzJywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdmJywgJ2wnLCAnbycsICdvJywgJ3InLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdmJywgJ2wnLCAnbycsICdvJywgJ3InLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdmJywgJ2wnLCAnbycsICdvJywgJ3InLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnbScsICdhJywgJ18nLCAncicsICdtJywgJ18nLCAnZCcsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICdtJywgJ2EnLCAnXycsICdyJywgJ20nLCAnXycsICdmJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywgJ20nLCAnYScsICdfJywgJ3InLCAnbScsICdfJywKKyAgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICdtJywKKyAgJ2EnLCAnXycsICdyJywgJ24nLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywKKyAgJ20nLCAnYScsICdfJywgJ3InLCAnbicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ2YnLCAnbScsICdhJywgJ18nLCAncicsICduJywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywgJ20nLCAnYScsICdfJywgJ3InLCAncCcsICdfJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnbScsICdhJywgJ18nLCAncicsICdwJywgJ18nLCAnZicsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICdtJywgJ2EnLCAnXycsICdyJywgJ3AnLCAnXycsICdmJywKKyAgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnbScsICdhJywKKyAgJ18nLCAncicsICd6JywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICdtJywKKyAgJ2EnLCAnXycsICdyJywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywKKyAgJ20nLCAnYScsICdfJywgJ3InLCAneicsICdfJywgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICdtJywgJ2EnLCAneCcsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ2YnLCAnbScsICdhJywgJ3gnLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdmJywgJ20nLCAnYScsICd4JywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdmJywgJ20nLCAnaScsICduJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAnZicsICdtJywgJ2knLCAnbicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ2YnLCAnbScsICdpJywgJ24nLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2YnLCAnbicsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdpJywgJzInLCAnZCcsICdfJywgJ3InLCAnbScsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAnaScsICcyJywgJ2QnLCAnXycsICdyJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ2knLCAnMicsICdkJywgJ18nLCAncicsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdpJywKKyAgJzInLCAnZCcsICdfJywgJ3InLCAneicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnaScsICcyJywKKyAgJ2YnLCAnXycsICdyJywgJ20nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2knLCAnMicsICdmJywKKyAgJ18nLCAncicsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdpJywgJzInLCAnZicsICdfJywKKyAgJ3InLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnaScsICcyJywgJ2YnLCAnXycsICdyJywKKyAgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2knLCAncycsICdzJywgJ3AnLCAnYScsICdjJywKKyAgJ2UnLCAncCcsICdfJywgJ2MnLCAnbycsICduJywgJ3MnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAnaScsICdzJywgJ3MnLCAncCcsICdhJywgJ2MnLCAnZScsICdwJywgJ18nLCAnZycsICdsJywgJ28nLCAnYicsICdhJywKKyAgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2knLCAncycsICdzJywgJ3AnLCAnYScsICdjJywKKyAgJ2UnLCAncCcsICdfJywgJ2wnLCAnbycsICdjJywgJ2EnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAnaScsICdzJywgJ3MnLCAncCcsICdhJywgJ2MnLCAnZScsICdwJywgJ18nLCAncycsICdoJywgJ2EnLCAncicsICdlJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ2knLCAncycsICd0JywgJ3knLCAncCcsICdlJywKKyAgJ3AnLCAnXycsICdzJywgJ2EnLCAnbScsICdwJywgJ2wnLCAnZScsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdpJywgJ3MnLCAndCcsICd5JywgJ3AnLCAnZScsICdwJywgJ18nLCAncycsICd1JywgJ3InLCAnZicsICdhJywKKyAgJ2MnLCAnZScsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnaScsICdzJywgJ3QnLCAneScsICdwJywKKyAgJ2UnLCAncCcsICdfJywgJ3QnLCAnZScsICd4JywgJ3QnLCAndScsICdyJywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ2wnLCAnZycsICcyJywgJ18nLCAnYScsICdwJywgJ3AnLCAncicsICdvJywgJ3gnLCAnXycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdsJywgJ2cnLCAnMicsICdfJywgJ2EnLCAncCcsICdwJywKKyAgJ3InLCAnbycsICd4JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbCcsICdnJywKKyAgJzInLCAnXycsICdhJywgJ3AnLCAncCcsICdyJywgJ28nLCAneCcsICdfJywgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbCcsICdsJywgJzInLCAnZCcsICdfJywgJ3InLCAnbScsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbCcsICdsJywgJzInLCAnZCcsICdfJywgJ3InLCAnbicsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbCcsICdsJywgJzInLCAnZCcsICdfJywgJ3InLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbCcsICdsJywgJzInLCAnZCcsICdfJywgJ3InLCAneicsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbCcsICdsJywgJzInLCAnZicsICdfJywgJ3InLCAnbScsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbCcsICdsJywgJzInLCAnZicsICdfJywgJ3InLCAnbicsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbCcsICdsJywgJzInLCAnZicsICdfJywgJ3InLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbCcsICdsJywgJzInLCAnZicsICdfJywgJ3InLCAneicsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbCcsICdvJywgJ2gnLCAnaScsICdfJywgJ2knLCAnMicsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdtJywgJ2EnLCAndCcsICdjJywgJ2gnLCAnXycsICdhJywKKyAgJ24nLCAneScsICdfJywgJ3MnLCAneScsICduJywgJ2MnLCAnXycsICdpJywgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAnbScsICdhJywgJ3QnLCAnYycsICdoJywgJ18nLCAnYScsICduJywgJ3knLCAnXycsICdzJywKKyAgJ3knLCAnbicsICdjJywgJ18nLCAnaScsICc2JywgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ20nLCAnZScsICdtJywgJ2InLCAnYScsICdyJywgJ18nLCAnYycsICd0JywgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ20nLCAnZScsICdtJywgJ2InLCAnYScsICdyJywgJ18nLCAnZycsICdsJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdtJywgJ2UnLCAnbScsICdiJywgJ2EnLCAncicsICdfJywgJ3MnLCAneScsICdzJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdtJywgJ3UnLCAnbCcsICdfJywgJ3InLCAnbScsICdfJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ20nLCAndScsICdsJywgJ18nLCAncicsICdtJywKKyAgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbScsICd1JywgJ2wnLCAnXycsICdyJywKKyAgJ20nLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ20nLCAndScsICdsJywgJ18nLCAncicsICduJywgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAnbScsICd1JywgJ2wnLCAnXycsICdyJywgJ24nLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdtJywgJ3UnLCAnbCcsICdfJywgJ3InLCAnbicsICdfJywgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbScsICd1JywgJ2wnLCAnXycsICdyJywgJ3AnLCAnXycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdtJywgJ3UnLCAnbCcsICdfJywgJ3InLCAncCcsICdfJywKKyAgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ20nLCAndScsICdsJywgJ18nLCAncicsICdwJywKKyAgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdtJywKKyAgJ3UnLCAnbCcsICdfJywgJ3InLCAneicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ20nLCAndScsICdsJywgJ18nLCAncicsICd6JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAnbScsICd1JywgJ2wnLCAnXycsICdyJywgJ3onLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ20nLCAndScsICdsJywgJzInLCAnNCcsICdfJywgJ2knLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ20nLCAndScsICdsJywgJzInLCAnNCcsICdfJywgJ3UnLCAnaScsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbScsICd1JywgJ2wnLCAnaCcsICdpJywgJ18nLCAnaScsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAnbScsICd1JywgJ2wnLCAnaCcsICdpJywgJ18nLCAnbCcsICdsJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdtJywgJ3UnLCAnbCcsICdoJywgJ2knLCAnXycsICd1JywKKyAgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ20nLCAndScsICdsJywgJ2gnLCAnaScsICdfJywKKyAgJ3UnLCAnbCcsICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdwJywgJ3InLCAnbScsICd0JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2MnLCAncCcsICdfJywgJ2EnLCAncCcsICdwJywKKyAgJ3InLCAnbycsICd4JywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdyJywgJ2MnLCAncCcsICdfJywgJ3InLCAnbScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3InLCAnYycsICdwJywgJ18nLCAncicsICdtJywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdjJywgJ3AnLCAnXycsICdyJywgJ20nLCAnXycsICdmJywgJ3QnLCAneicsICdfJywKKyAgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnYycsICdwJywgJ18nLCAncicsICduJywKKyAgJ18nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdjJywgJ3AnLCAnXycsICdyJywKKyAgJ24nLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2MnLCAncCcsICdfJywKKyAgJ3InLCAnbicsICdfJywgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncicsICdjJywgJ3AnLCAnXycsICdyJywgJ3AnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdyJywgJ2MnLCAncCcsICdfJywgJ3InLCAncCcsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3InLCAnYycsICdwJywgJ18nLCAncicsICdwJywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2MnLCAncCcsICdfJywgJ3InLCAneicsICdfJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnYycsICdwJywgJ18nLCAncicsICd6JywKKyAgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdjJywgJ3AnLCAnXycsICdyJywKKyAgJ3onLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsICdlJywgJ2cnLCAnXycsICdjJywKKyAgJ2wnLCAnbycsICdjJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywKKyAgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsICdlJywgJ2cnLCAnXycsICdjJywgJ2wnLCAnbycsICdjJywKKyAgJ2snLCAnNicsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywKKyAgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAnYycsICd0JywgJ2EnLCAnaScsICdkJywKKyAgJ18nLCAndycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywKKyAgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ2MnLCAndCcsICdhJywgJ2knLCAnZCcsICdfJywKKyAgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywKKyAgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsICdlJywgJ2cnLCAnXycsICdjJywgJ3QnLCAnYScsICdpJywgJ2QnLCAnXycsICd5JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywKKyAgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAnYycsICd0JywgJ2EnLCAnaScsICdkJywgJ18nLCAneicsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywKKyAgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzAnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywKKyAgJ3MnLCAncicsICdlJywgJ2cnLCAnXycsICdlJywgJ24nLCAndicsICdyJywgJ2UnLCAnZycsICcxJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywKKyAgJ3InLCAnZScsICdnJywgJ18nLCAnZScsICduJywgJ3YnLCAncicsICdlJywgJ2cnLCAnMScsICcwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywKKyAgJ3InLCAnZScsICdnJywgJ18nLCAnZScsICduJywgJ3YnLCAncicsICdlJywgJ2cnLCAnMScsICcxJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywKKyAgJ3InLCAnZScsICdnJywgJ18nLCAnZScsICduJywgJ3YnLCAncicsICdlJywgJ2cnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywKKyAgJ3InLCAnZScsICdnJywgJ18nLCAnZScsICduJywgJ3YnLCAncicsICdlJywgJ2cnLCAnMScsICczJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywKKyAgJ3InLCAnZScsICdnJywgJ18nLCAnZScsICduJywgJ3YnLCAncicsICdlJywgJ2cnLCAnMScsICc0JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywKKyAgJ3InLCAnZScsICdnJywgJ18nLCAnZScsICduJywgJ3YnLCAncicsICdlJywgJ2cnLCAnMScsICc1JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywKKyAgJ3InLCAnZScsICdnJywgJ18nLCAnZScsICduJywgJ3YnLCAncicsICdlJywgJ2cnLCAnMScsICc2JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywKKyAgJ3InLCAnZScsICdnJywgJ18nLCAnZScsICduJywgJ3YnLCAncicsICdlJywgJ2cnLCAnMScsICc3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywKKyAgJ3InLCAnZScsICdnJywgJ18nLCAnZScsICduJywgJ3YnLCAncicsICdlJywgJ2cnLCAnMScsICc4JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywKKyAgJ3InLCAnZScsICdnJywgJ18nLCAnZScsICduJywgJ3YnLCAncicsICdlJywgJ2cnLCAnMScsICc5JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywKKyAgJ3InLCAnZScsICdnJywgJ18nLCAnZScsICduJywgJ3YnLCAncicsICdlJywgJ2cnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywKKyAgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzInLCAnMCcsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywKKyAgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzInLCAnMScsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywKKyAgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzInLCAnMicsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywKKyAgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzInLCAnMycsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywKKyAgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzInLCAnNCcsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywKKyAgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzInLCAnNScsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywKKyAgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzInLCAnNicsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywKKyAgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzInLCAnNycsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywKKyAgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywKKyAgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzInLCAnOScsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywKKyAgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsICdlJywKKyAgJ2cnLCAnXycsICdlJywgJ24nLCAndicsICdyJywgJ2UnLCAnZycsICczJywgJzAnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsICdlJywKKyAgJ2cnLCAnXycsICdlJywgJ24nLCAndicsICdyJywgJ2UnLCAnZycsICczJywgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsICdlJywKKyAgJ2cnLCAnXycsICdlJywgJ24nLCAndicsICdyJywgJ2UnLCAnZycsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywKKyAgJ18nLCAnZScsICduJywgJ3YnLCAncicsICdlJywgJ2cnLCAnNScsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywKKyAgJ2UnLCAnbicsICd2JywgJ3InLCAnZScsICdnJywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsICdlJywgJ2cnLCAnXycsICdlJywKKyAgJ24nLCAndicsICdyJywgJ2UnLCAnZycsICc3JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywKKyAgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAnZScsICduJywKKyAgJ3YnLCAncicsICdlJywgJ2cnLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywKKyAgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ2UnLCAnbicsICd2JywKKyAgJ3InLCAnZScsICdnJywgJzknLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywKKyAgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsICdlJywgJ2cnLCAnXycsICdnJywgJ3InLCAnaScsICdkJywKKyAgJ2knLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywKKyAgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywgJ2wnLCAnYScsICduJywgJ2UnLCAnaScsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywKKyAgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAnbCcsICdhJywgJ24nLCAnZScsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ18nLCAnZScsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywKKyAgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAnbCcsICdhJywgJ24nLCAnZScsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ18nLCAnZycsICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywKKyAgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAnbCcsICdhJywKKyAgJ24nLCAnZScsICdtJywgJ2EnLCAncycsICdrJywgJ18nLCAnZycsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywKKyAgJ18nLCAnbCcsICdhJywgJ24nLCAnZScsICdtJywgJ2EnLCAncycsICdrJywgJ18nLCAnbCcsICdlJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywKKyAgJ3InLCAnZScsICdnJywgJ18nLCAnbCcsICdhJywgJ24nLCAnZScsICdtJywgJ2EnLCAncycsICdrJywgJ18nLCAnbCcsICd0JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywKKyAgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAnbicsICdjJywgJ3QnLCAnYScsICdpJywgJ2QnLCAnXycsICd3JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywKKyAgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAnbicsICdjJywgJ3QnLCAnYScsICdpJywgJ2QnLCAnXycsICd4JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywKKyAgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAnbicsICdjJywgJ3QnLCAnYScsICdpJywgJ2QnLCAnXycsICd5JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywKKyAgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAnbicsICdjJywgJ3QnLCAnYScsICdpJywgJ2QnLCAnXycsICd6JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywKKyAgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAnbicsICdzJywgJ20nLCAnaScsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywKKyAgJ3InLCAnZScsICdnJywgJ18nLCAnbicsICd0JywgJ2knLCAnZCcsICdfJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsICdlJywKKyAgJ2cnLCAnXycsICduJywgJ3QnLCAnaScsICdkJywgJ18nLCAneCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywKKyAgJ24nLCAndCcsICdpJywgJ2QnLCAnXycsICd5JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywKKyAgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAnbicsICd0JywKKyAgJ2knLCAnZCcsICdfJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywKKyAgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsICdlJywgJ2cnLCAnXycsICduJywgJ3cnLCAnYScsICdyJywKKyAgJ3AnLCAnaScsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywKKyAgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAncCcsICdtJywgJzAnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywKKyAgJ3MnLCAncicsICdlJywgJ2cnLCAnXycsICdwJywgJ20nLCAnMScsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ3AnLCAndCcsICd4JywgJ18nLCAncycsICdyJywgJ2UnLCAnZycsICdfJywKKyAgJ3AnLCAnbScsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywKKyAgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAncCcsICdtJywgJzMnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywKKyAgJ3MnLCAncicsICdlJywgJ2cnLCAnXycsICdzJywgJ20nLCAnaScsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywKKyAgJ18nLCAndCcsICdpJywgJ2QnLCAnXycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywKKyAgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAndCcsICdpJywKKyAgJ2QnLCAnXycsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywKKyAgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAndCcsICdpJywgJ2QnLCAnXycsICd5JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywKKyAgJ3gnLCAnXycsICdzJywgJ3InLCAnZScsICdnJywgJ18nLCAndCcsICdpJywgJ2QnLCAnXycsICd6JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAncCcsICd0JywgJ3gnLCAnXycsICdzJywKKyAgJ3InLCAnZScsICdnJywgJ18nLCAndycsICdhJywgJ3InLCAncCcsICdpJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdwJywgJ3QnLCAneCcsICdfJywgJ3MnLCAncicsICdlJywKKyAgJ2cnLCAnXycsICd3JywgJ2EnLCAncicsICdwJywgJ3MnLCAnaScsICd6JywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3InLCAnbycsICd0JywgJ2EnLCAndCcsICdlJywgJ18nLCAnYicsICczJywgJzInLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnbycsICd0JywgJ2EnLCAndCcsICdlJywgJ18nLCAnYicsICc2JywKKyAgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAnbycsICd0JywgJ2EnLCAndCcsICdlJywKKyAgJ18nLCAncicsICdpJywgJ2cnLCAnaCcsICd0JywgJ18nLCAnYicsICc2JywgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdfJywgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncicsICdzJywgJ3EnLCAncicsICd0JywgJ18nLCAnYScsICdwJywKKyAgJ3AnLCAncicsICdvJywgJ3gnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdyJywKKyAgJ3MnLCAncScsICdyJywgJ3QnLCAnXycsICdhJywgJ3AnLCAncCcsICdyJywgJ28nLCAneCcsICdfJywgJ2YnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3InLCAncycsICdxJywgJ3InLCAndCcsICdfJywgJ2EnLCAncCcsICdwJywKKyAgJ3InLCAnbycsICd4JywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdzJywgJ2EnLCAnZCcsICdfJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ3MnLCAnYScsICdkJywgJ18nLCAndScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywKKyAgJ2EnLCAndCcsICd1JywgJ3InLCAnYScsICd0JywgJ2UnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdzJywgJ2EnLCAndCcsICd1JywgJ3InLCAnYScsICd0JywgJ2UnLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ2EnLCAndCcsICd1JywgJ3InLCAnYScsICd0JywgJ2UnLCAnXycsICdmJywKKyAgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAnaCcsICdmJywKKyAgJ2wnLCAnXycsICdiJywgJ2YnLCAnbCcsICd5JywgJ18nLCAnZicsICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3MnLCAnaCcsICdmJywgJ2wnLCAnXycsICdiJywgJ2YnLCAnbCcsICd5JywgJ18nLCAnaScsICczJywKKyAgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAnaCcsICdmJywgJ2wnLCAnXycsICdkJywKKyAgJ28nLCAndycsICduJywgJ18nLCAnZicsICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ3MnLCAnaCcsICdmJywgJ2wnLCAnXycsICdkJywgJ28nLCAndycsICduJywgJ18nLCAnaScsICczJywgJzInLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAnaCcsICdmJywgJ2wnLCAnXycsICdpJywgJ2QnLCAneCcsICdfJywKKyAgJ2YnLCAnMycsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ2gnLCAnZicsICdsJywKKyAgJ18nLCAnaScsICdkJywgJ3gnLCAnXycsICdpJywgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICdoJywgJ2YnLCAnbCcsICdfJywgJ3MnLCAneScsICduJywgJ2MnLCAnXycsICdiJywgJ2YnLCAnbCcsICd5JywKKyAgJ18nLCAnZicsICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAnaCcsICdmJywKKyAgJ2wnLCAnXycsICdzJywgJ3knLCAnbicsICdjJywgJ18nLCAnYicsICdmJywgJ2wnLCAneScsICdfJywgJ2knLCAnMycsICcyJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ2gnLCAnZicsICdsJywgJ18nLCAncycsICd5JywKKyAgJ24nLCAnYycsICdfJywgJ2QnLCAnbycsICd3JywgJ24nLCAnXycsICdmJywgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncycsICdoJywgJ2YnLCAnbCcsICdfJywgJ3MnLCAneScsICduJywgJ2MnLCAnXycsICdkJywKKyAgJ28nLCAndycsICduJywgJ18nLCAnaScsICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ3MnLCAnaCcsICdmJywgJ2wnLCAnXycsICdzJywgJ3knLCAnbicsICdjJywgJ18nLCAnaScsICdkJywgJ3gnLCAnXycsICdmJywKKyAgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICdoJywgJ2YnLCAnbCcsICdfJywKKyAgJ3MnLCAneScsICduJywgJ2MnLCAnXycsICdpJywgJ2QnLCAneCcsICdfJywgJ2knLCAnMycsICcyJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ2gnLCAnZicsICdsJywgJ18nLCAncycsICd5JywgJ24nLCAnYycsICdfJywKKyAgJ3UnLCAncCcsICdfJywgJ2YnLCAnMycsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywKKyAgJ2gnLCAnZicsICdsJywgJ18nLCAncycsICd5JywgJ24nLCAnYycsICdfJywgJ3UnLCAncCcsICdfJywgJ2knLCAnMycsICcyJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ2gnLCAnZicsICdsJywgJ18nLCAndScsICdwJywKKyAgJ18nLCAnZicsICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAnaCcsICdmJywKKyAgJ2wnLCAnXycsICd1JywgJ3AnLCAnXycsICdpJywgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICdpJywgJ24nLCAnXycsICdhJywgJ3AnLCAncCcsICdyJywgJ28nLCAneCcsICdfJywgJ2YnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAnaScsICduJywgJ18nLCAnYScsICdwJywgJ3AnLCAncicsICdvJywKKyAgJ3gnLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ3MnLCAncScsICdyJywgJ3QnLCAnXycsICdhJywgJ3AnLCAncCcsICdyJywgJ28nLCAneCcsICdfJywgJ2YnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAncScsICdyJywgJ3QnLCAnXycsICdhJywgJ3AnLCAncCcsICdyJywKKyAgJ28nLCAneCcsICdfJywgJ2YnLCAndCcsICd6JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICdxJywgJ3InLCAndCcsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ3MnLCAncScsICdyJywgJ3QnLCAnXycsICdyJywgJ20nLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdzJywgJ3EnLCAncicsICd0JywgJ18nLCAncicsICdtJywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncycsICdxJywgJ3InLCAndCcsICdfJywgJ3InLCAnbScsICdfJywgJ2YnLCAndCcsICd6JywKKyAgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICdxJywgJ3InLCAndCcsICdfJywKKyAgJ3InLCAnbicsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAncScsICdyJywKKyAgJ3QnLCAnXycsICdyJywgJ24nLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywKKyAgJ3EnLCAncicsICd0JywgJ18nLCAncicsICduJywgJ18nLCAnZicsICd0JywgJ3onLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3EnLCAncicsICd0JywgJ18nLCAncicsICdwJywgJ18nLCAnZCcsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICdxJywgJ3InLCAndCcsICdfJywgJ3InLCAncCcsICdfJywKKyAgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAncScsICdyJywgJ3QnLCAnXycsICdyJywKKyAgJ3AnLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ3MnLCAncScsICdyJywgJ3QnLCAnXycsICdyJywgJ3onLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdzJywgJ3EnLCAncicsICd0JywgJ18nLCAncicsICd6JywgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncycsICdxJywgJ3InLCAndCcsICdfJywgJ3InLCAneicsICdfJywgJ2YnLCAndCcsICd6JywKKyAgJ18nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3EnLCAnXycsICdhJywKKyAgJ3InLCAncicsICdhJywgJ3knLCAnXycsICdzJywgJ2knLCAneicsICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdzJywgJ3UnLCAncScsICdfJywgJ2MnLCAnaCcsICdhJywgJ24nLCAnbicsICdlJywgJ2wnLCAnXycsICdkJywKKyAgJ2EnLCAndCcsICdhJywgJ18nLCAndCcsICd5JywgJ3AnLCAnZScsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICd1JywgJ3EnLCAnXycsICdjJywgJ2gnLCAnYScsICduJywgJ24nLCAnZScsICdsJywgJ18nLCAnbycsICdyJywKKyAgJ2QnLCAnZScsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncScsICdfJywKKyAgJ2QnLCAnZScsICdwJywgJ3QnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywKKyAgJ3EnLCAnXycsICdoJywgJ2UnLCAnaScsICdnJywgJ2gnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICd1JywgJ3EnLCAnXycsICd3JywgJ2knLCAnZCcsICd0JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAnYScsICdyJywKKyAgJ3InLCAnYScsICd5JywgJ18nLCAnaScsICcxJywgJzYnLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywKKyAgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAnaScsICcxJywgJzYnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywKKyAgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ2knLCAnMScsICc2JywgJ18nLCAneicsICdlJywKKyAgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywKKyAgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICdpJywgJzMnLCAnMicsICdfJywKKyAgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywKKyAgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICdpJywKKyAgJzMnLCAnMicsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywKKyAgJ18nLCAnaScsICczJywgJzInLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywKKyAgJ2EnLCAneScsICdfJywgJ2knLCAnNicsICc0JywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywKKyAgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ2knLCAnNicsICc0JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywKKyAgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICdpJywgJzYnLCAnNCcsICdfJywgJ3onLCAnZScsICdyJywKKyAgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywKKyAgJ18nLCAnMScsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAnaScsICc4JywgJ18nLCAnYycsICdsJywKKyAgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywKKyAgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ2knLCAnOCcsICdfJywKKyAgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywKKyAgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAnaScsICc4JywKKyAgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywKKyAgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywKKyAgJzInLCAnaScsICcxJywgJzYnLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAnYScsICdyJywKKyAgJ3InLCAnYScsICd5JywgJ18nLCAndicsICcyJywgJ2knLCAnMScsICc2JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywKKyAgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywgJzInLCAnaScsICcxJywgJzYnLCAnXycsICd6JywKKyAgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywKKyAgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnMicsICdpJywKKyAgJzMnLCAnMicsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywKKyAgJ3knLCAnXycsICd2JywgJzInLCAnaScsICczJywgJzInLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywKKyAgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnMicsICdpJywgJzMnLCAnMicsICdfJywgJ3onLCAnZScsICdyJywKKyAgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywKKyAgJ18nLCAnMScsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsICcyJywgJ2knLCAnNicsICc0JywKKyAgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywKKyAgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywKKyAgJ3YnLCAnMicsICdpJywgJzYnLCAnNCcsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAnYScsICdyJywKKyAgJ3InLCAnYScsICd5JywgJ18nLCAndicsICcyJywgJ2knLCAnNicsICc0JywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywKKyAgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywgJzInLCAnaScsICc4JywgJ18nLCAnYycsICdsJywKKyAgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywKKyAgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnMicsICdpJywKKyAgJzgnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywKKyAgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywKKyAgJ3YnLCAnMicsICdpJywgJzgnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywKKyAgJ2EnLCAneScsICdfJywgJ3YnLCAnNCcsICdpJywgJzEnLCAnNicsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywKKyAgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywgJzQnLCAnaScsICcxJywgJzYnLCAnXycsICd0JywKKyAgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywKKyAgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnNCcsICdpJywKKyAgJzEnLCAnNicsICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywKKyAgJ18nLCAndicsICc0JywgJ2knLCAnMycsICcyJywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywKKyAgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnNCcsICdpJywgJzMnLCAnMicsICdfJywgJ3QnLCAncicsICdhJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywKKyAgJ18nLCAnMScsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsICc0JywgJ2knLCAnMycsICcyJywKKyAgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywKKyAgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywKKyAgJzQnLCAnaScsICc4JywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywKKyAgJ2EnLCAneScsICdfJywgJ3YnLCAnNCcsICdpJywgJzgnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywKKyAgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnNCcsICdpJywgJzgnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywKKyAgJzEnLCAnZCcsICdfJywgJ2knLCAnMScsICc2JywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywKKyAgJ2knLCAnMScsICc2JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICdpJywgJzEnLCAnNicsICdfJywKKyAgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywKKyAgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAnaScsICczJywgJzInLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywKKyAgJ18nLCAnMScsICdkJywgJ18nLCAnaScsICczJywgJzInLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywKKyAgJ2knLCAnMycsICcyJywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICdpJywgJzYnLCAnNCcsICdfJywKKyAgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywKKyAgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICdpJywgJzYnLCAnNCcsICdfJywgJ3QnLCAncicsICdhJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywKKyAgJ18nLCAnMScsICdkJywgJ18nLCAnaScsICc2JywgJzQnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywKKyAgJ2knLCAnOCcsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICdpJywgJzgnLCAnXycsICd0JywKKyAgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywKKyAgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ2knLCAnOCcsICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywKKyAgJ18nLCAndicsICcyJywgJ2knLCAnMScsICc2JywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywKKyAgJ3YnLCAnMicsICdpJywgJzEnLCAnNicsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAndicsICcyJywKKyAgJ2knLCAnMScsICc2JywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICczJywKKyAgJzInLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnMycsICcyJywKKyAgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywKKyAgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICczJywgJzInLCAnXycsICd6JywKKyAgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywKKyAgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywgJ3YnLCAnMicsICdpJywgJzYnLCAnNCcsICdfJywgJ2MnLCAnbCcsICdhJywKKyAgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywKKyAgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICc2JywgJzQnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywKKyAgJzEnLCAnZCcsICdfJywgJ3YnLCAnMicsICdpJywgJzYnLCAnNCcsICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywKKyAgJ18nLCAndicsICcyJywgJ2knLCAnOCcsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICd2JywKKyAgJzInLCAnaScsICc4JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICc4JywKKyAgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywKKyAgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsICcxJywgJzYnLCAnXycsICdjJywKKyAgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywKKyAgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAndicsICc0JywgJ2knLCAnMScsICc2JywgJ18nLCAndCcsICdyJywKKyAgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywKKyAgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsICcxJywgJzYnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywKKyAgJzEnLCAnZCcsICdfJywgJ3YnLCAnNCcsICdpJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywKKyAgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsICczJywgJzInLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzEnLCAnZCcsICdfJywKKyAgJ3YnLCAnNCcsICdpJywgJzMnLCAnMicsICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMScsICdkJywgJ18nLCAndicsICc0JywKKyAgJ2knLCAnOCcsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsICc4JywKKyAgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywKKyAgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcxJywgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsICc4JywgJ18nLCAneicsICdlJywKKyAgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywKKyAgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICdpJywgJzEnLCAnNicsICdfJywKKyAgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywKKyAgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICdpJywKKyAgJzEnLCAnNicsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywKKyAgJ18nLCAnaScsICcxJywgJzYnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywKKyAgJ2EnLCAneScsICdfJywgJ2knLCAnMycsICcyJywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywKKyAgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ2knLCAnMycsICcyJywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywKKyAgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICdpJywgJzMnLCAnMicsICdfJywgJ3onLCAnZScsICdyJywKKyAgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywKKyAgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAnaScsICc2JywgJzQnLCAnXycsICdjJywKKyAgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywKKyAgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAnaScsICc2JywKKyAgJzQnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywKKyAgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywKKyAgJ2knLCAnNicsICc0JywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywKKyAgJ3knLCAnXycsICdpJywgJzgnLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywKKyAgJ3InLCAnYScsICd5JywgJ18nLCAnaScsICc4JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICdhJywKKyAgJ3InLCAncicsICdhJywgJ3knLCAnXycsICdpJywgJzgnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywKKyAgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnMicsICdpJywgJzEnLCAnNicsICdfJywgJ2MnLCAnbCcsICdhJywKKyAgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywKKyAgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywgJzInLCAnaScsICcxJywKKyAgJzYnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywKKyAgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywKKyAgJ3YnLCAnMicsICdpJywgJzEnLCAnNicsICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywKKyAgJ3InLCAnYScsICd5JywgJ18nLCAndicsICcyJywgJ2knLCAnMycsICcyJywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywKKyAgJzInLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnMicsICdpJywgJzMnLCAnMicsICdfJywKKyAgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywKKyAgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsICcyJywKKyAgJ2knLCAnMycsICcyJywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywKKyAgJ3knLCAnXycsICd2JywgJzInLCAnaScsICc2JywgJzQnLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywKKyAgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsICcyJywgJ2knLCAnNicsICc0JywgJ18nLCAndCcsICdyJywKKyAgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywKKyAgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywgJzInLCAnaScsICc2JywKKyAgJzQnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywKKyAgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywKKyAgJ3YnLCAnMicsICdpJywgJzgnLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywKKyAgJ3InLCAnYScsICd5JywgJ18nLCAndicsICcyJywgJ2knLCAnOCcsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywKKyAgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsICcyJywgJ2knLCAnOCcsICdfJywgJ3onLCAnZScsICdyJywKKyAgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywKKyAgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsICc0JywgJ2knLCAnMScsICc2JywKKyAgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywKKyAgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywKKyAgJ3YnLCAnNCcsICdpJywgJzEnLCAnNicsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywKKyAgJ3InLCAnYScsICd5JywgJ18nLCAndicsICc0JywgJ2knLCAnMScsICc2JywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywKKyAgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywgJzQnLCAnaScsICczJywgJzInLCAnXycsICdjJywKKyAgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywKKyAgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsICc0JywKKyAgJ2knLCAnMycsICcyJywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywKKyAgJ3knLCAnXycsICd2JywgJzQnLCAnaScsICczJywgJzInLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywKKyAgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnNCcsICdpJywgJzgnLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywKKyAgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsICc0JywgJ2knLCAnOCcsICdfJywKKyAgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywKKyAgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsICc0JywKKyAgJ2knLCAnOCcsICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnaScsICcxJywgJzYnLCAnXycsICdjJywKKyAgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywKKyAgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnaScsICcxJywgJzYnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywKKyAgJzInLCAnZCcsICdfJywgJ2knLCAnMScsICc2JywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICdpJywKKyAgJzMnLCAnMicsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICdpJywgJzMnLCAnMicsICdfJywKKyAgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywKKyAgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnaScsICczJywgJzInLCAnXycsICd6JywgJ2UnLCAncicsICdvJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywKKyAgJzInLCAnZCcsICdfJywgJ2knLCAnNicsICc0JywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywKKyAgJ2knLCAnNicsICc0JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICdpJywgJzYnLCAnNCcsICdfJywKKyAgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywKKyAgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnaScsICc4JywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywKKyAgJzInLCAnZCcsICdfJywgJ2knLCAnOCcsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAnaScsICc4JywKKyAgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywKKyAgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICcxJywgJzYnLCAnXycsICdjJywKKyAgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywKKyAgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnMScsICc2JywgJ18nLCAndCcsICdyJywKKyAgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywKKyAgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICcxJywgJzYnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywKKyAgJzInLCAnZCcsICdfJywgJ3YnLCAnMicsICdpJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywKKyAgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICczJywgJzInLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywKKyAgJ3YnLCAnMicsICdpJywgJzMnLCAnMicsICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAndicsICcyJywKKyAgJ2knLCAnNicsICc0JywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ3YnLCAnMicsICdpJywKKyAgJzYnLCAnNCcsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnNicsICc0JywKKyAgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywKKyAgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICc4JywgJ18nLCAnYycsICdsJywKKyAgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywKKyAgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ3YnLCAnMicsICdpJywgJzgnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywKKyAgJzInLCAnZCcsICdfJywgJ3YnLCAnMicsICdpJywgJzgnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywKKyAgJ3YnLCAnNCcsICdpJywgJzEnLCAnNicsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICd2JywKKyAgJzQnLCAnaScsICcxJywgJzYnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ3YnLCAnNCcsICdpJywKKyAgJzEnLCAnNicsICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAndicsICc0JywgJ2knLCAnMycsICcyJywKKyAgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywKKyAgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywgJ3YnLCAnNCcsICdpJywgJzMnLCAnMicsICdfJywKKyAgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywKKyAgJ3QnLCAnXycsICdiJywgJ18nLCAnMicsICdkJywgJ18nLCAndicsICc0JywgJ2knLCAnMycsICcyJywgJ18nLCAneicsICdlJywKKyAgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywKKyAgJ2InLCAnXycsICcyJywgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsICc4JywgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywKKyAgJzInLCAnZCcsICdfJywgJ3YnLCAnNCcsICdpJywgJzgnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzInLCAnZCcsICdfJywKKyAgJ3YnLCAnNCcsICdpJywgJzgnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzMnLCAnZCcsICdfJywgJ2knLCAnMScsICc2JywKKyAgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywKKyAgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzMnLCAnZCcsICdfJywgJ2knLCAnMScsICc2JywgJ18nLCAndCcsICdyJywKKyAgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywKKyAgJ2InLCAnXycsICczJywgJ2QnLCAnXycsICdpJywgJzEnLCAnNicsICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMycsICdkJywKKyAgJ18nLCAnaScsICczJywgJzInLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMycsICdkJywgJ18nLCAnaScsICczJywKKyAgJzInLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywKKyAgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzMnLCAnZCcsICdfJywgJ2knLCAnMycsICcyJywgJ18nLCAneicsICdlJywKKyAgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywKKyAgJ2InLCAnXycsICczJywgJ2QnLCAnXycsICdpJywgJzYnLCAnNCcsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICczJywKKyAgJ2QnLCAnXycsICdpJywgJzYnLCAnNCcsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMycsICdkJywgJ18nLCAnaScsICc2JywKKyAgJzQnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywKKyAgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzMnLCAnZCcsICdfJywgJ2knLCAnOCcsICdfJywgJ2MnLCAnbCcsICdhJywKKyAgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywKKyAgJ2InLCAnXycsICczJywgJ2QnLCAnXycsICdpJywgJzgnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzMnLCAnZCcsICdfJywKKyAgJ2knLCAnOCcsICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMycsICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnMScsICc2JywKKyAgJ18nLCAnYycsICdsJywgJ2EnLCAnbScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywKKyAgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzMnLCAnZCcsICdfJywgJ3YnLCAnMicsICdpJywgJzEnLCAnNicsICdfJywKKyAgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywKKyAgJ3QnLCAnXycsICdiJywgJ18nLCAnMycsICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnMScsICc2JywgJ18nLCAneicsICdlJywKKyAgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywKKyAgJ2InLCAnXycsICczJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICczJywgJzInLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywKKyAgJ18nLCAnMycsICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnMycsICcyJywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICczJywKKyAgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICczJywgJzInLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzMnLCAnZCcsICdfJywKKyAgJ3YnLCAnMicsICdpJywgJzYnLCAnNCcsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICczJywgJ2QnLCAnXycsICd2JywKKyAgJzInLCAnaScsICc2JywgJzQnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzMnLCAnZCcsICdfJywgJ3YnLCAnMicsICdpJywKKyAgJzYnLCAnNCcsICdfJywgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMycsICdkJywgJ18nLCAndicsICcyJywgJ2knLCAnOCcsICdfJywKKyAgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywKKyAgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICczJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICc4JywgJ18nLCAndCcsICdyJywKKyAgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywKKyAgJ2InLCAnXycsICczJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICc4JywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICczJywKKyAgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsICcxJywgJzYnLCAnXycsICdjJywgJ2wnLCAnYScsICdtJywgJ3AnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdiJywgJ18nLCAnMycsICdkJywKKyAgJ18nLCAndicsICc0JywgJ2knLCAnMScsICc2JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICczJywgJ2QnLCAnXycsICd2JywKKyAgJzQnLCAnaScsICcxJywgJzYnLCAnXycsICd6JywgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzMnLCAnZCcsICdfJywgJ3YnLCAnNCcsICdpJywKKyAgJzMnLCAnMicsICdfJywgJ2MnLCAnbCcsICdhJywgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICczJywgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsICczJywKKyAgJzInLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywKKyAgJ3UnLCAncycsICd0JywgJ18nLCAnYicsICdfJywgJzMnLCAnZCcsICdfJywgJ3YnLCAnNCcsICdpJywgJzMnLCAnMicsICdfJywKKyAgJ3onLCAnZScsICdyJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywKKyAgJ3QnLCAnXycsICdiJywgJ18nLCAnMycsICdkJywgJ18nLCAndicsICc0JywgJ2knLCAnOCcsICdfJywgJ2MnLCAnbCcsICdhJywKKyAgJ20nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywKKyAgJ2InLCAnXycsICczJywgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsICc4JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ2InLCAnXycsICczJywKKyAgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsICc4JywgJ18nLCAneicsICdlJywgJ3InLCAnbycsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICcxJywgJ2QnLCAnXycsICdhJywKKyAgJ3InLCAncicsICdhJywgJ3knLCAnXycsICdpJywgJzEnLCAnNicsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywgJ18nLCAnMScsICdkJywKKyAgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAnaScsICczJywgJzInLCAnXycsICd0JywgJ3InLCAnYScsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsICdfJywKKyAgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ2knLCAnOCcsICdfJywgJ3QnLCAncicsICdhJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywKKyAgJ18nLCAnMScsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsICcyJywgJ2knLCAnMScsICc2JywKKyAgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywKKyAgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICcxJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywKKyAgJzInLCAnaScsICczJywgJzInLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsICdfJywgJzEnLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywKKyAgJ2EnLCAneScsICdfJywgJ3YnLCAnMicsICdpJywgJzgnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsICdfJywgJzEnLCAnZCcsICdfJywKKyAgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnNCcsICdpJywgJzEnLCAnNicsICdfJywgJ3QnLCAncicsICdhJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywKKyAgJ18nLCAnMScsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsICc0JywgJ2knLCAnMycsICcyJywKKyAgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywKKyAgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICcxJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywKKyAgJzQnLCAnaScsICc4JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICcxJywgJ2QnLCAnXycsICdpJywgJzEnLCAnNicsICdfJywKKyAgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywKKyAgJ3QnLCAnXycsICdwJywgJ18nLCAnMScsICdkJywgJ18nLCAnaScsICczJywgJzInLCAnXycsICd0JywgJ3InLCAnYScsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsICdfJywKKyAgJzEnLCAnZCcsICdfJywgJ2knLCAnOCcsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywgJ18nLCAnMScsICdkJywgJ18nLCAndicsICcyJywKKyAgJ2knLCAnMScsICc2JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICcxJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICczJywKKyAgJzInLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywKKyAgJ3UnLCAncycsICd0JywgJ18nLCAncCcsICdfJywgJzEnLCAnZCcsICdfJywgJ3YnLCAnMicsICdpJywgJzgnLCAnXycsICd0JywKKyAgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywKKyAgJ18nLCAncCcsICdfJywgJzEnLCAnZCcsICdfJywgJ3YnLCAnNCcsICdpJywgJzEnLCAnNicsICdfJywgJ3QnLCAncicsICdhJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywKKyAgJ18nLCAnMScsICdkJywgJ18nLCAndicsICc0JywgJ2knLCAnMycsICcyJywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICcxJywKKyAgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsICc4JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICcyJywgJ2QnLCAnXycsICdhJywKKyAgJ3InLCAncicsICdhJywgJ3knLCAnXycsICdpJywgJzEnLCAnNicsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywgJ18nLCAnMicsICdkJywKKyAgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAnaScsICczJywgJzInLCAnXycsICd0JywgJ3InLCAnYScsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsICdfJywKKyAgJzInLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ2knLCAnOCcsICdfJywgJ3QnLCAncicsICdhJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywKKyAgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsICcyJywgJ2knLCAnMScsICc2JywKKyAgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywKKyAgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICcyJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywKKyAgJzInLCAnaScsICczJywgJzInLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsICdfJywgJzInLCAnZCcsICdfJywgJ2EnLCAncicsICdyJywKKyAgJ2EnLCAneScsICdfJywgJ3YnLCAnMicsICdpJywgJzgnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsICdfJywgJzInLCAnZCcsICdfJywKKyAgJ2EnLCAncicsICdyJywgJ2EnLCAneScsICdfJywgJ3YnLCAnNCcsICdpJywgJzEnLCAnNicsICdfJywgJ3QnLCAncicsICdhJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywKKyAgJ18nLCAnMicsICdkJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAndicsICc0JywgJ2knLCAnMycsICcyJywKKyAgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywKKyAgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICcyJywgJ2QnLCAnXycsICdhJywgJ3InLCAncicsICdhJywgJ3knLCAnXycsICd2JywKKyAgJzQnLCAnaScsICc4JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICcyJywgJ2QnLCAnXycsICdpJywgJzEnLCAnNicsICdfJywKKyAgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywKKyAgJ3QnLCAnXycsICdwJywgJ18nLCAnMicsICdkJywgJ18nLCAnaScsICczJywgJzInLCAnXycsICd0JywgJ3InLCAnYScsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsICdfJywKKyAgJzInLCAnZCcsICdfJywgJ2knLCAnOCcsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywgJ18nLCAnMicsICdkJywgJ18nLCAndicsICcyJywKKyAgJ2knLCAnMScsICc2JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICcyJywgJ2QnLCAnXycsICd2JywgJzInLCAnaScsICczJywKKyAgJzInLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywKKyAgJ3UnLCAncycsICd0JywgJ18nLCAncCcsICdfJywgJzInLCAnZCcsICdfJywgJ3YnLCAnMicsICdpJywgJzgnLCAnXycsICd0JywKKyAgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywKKyAgJ18nLCAncCcsICdfJywgJzInLCAnZCcsICdfJywgJ3YnLCAnNCcsICdpJywgJzEnLCAnNicsICdfJywgJ3QnLCAncicsICdhJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywKKyAgJ18nLCAnMicsICdkJywgJ18nLCAndicsICc0JywgJ2knLCAnMycsICcyJywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICcyJywKKyAgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsICc4JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICczJywgJ2QnLCAnXycsICdpJywKKyAgJzEnLCAnNicsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywKKyAgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywgJ18nLCAnMycsICdkJywgJ18nLCAnaScsICczJywgJzInLCAnXycsICd0JywKKyAgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywKKyAgJ18nLCAncCcsICdfJywgJzMnLCAnZCcsICdfJywgJ2knLCAnOCcsICdfJywgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywgJ3QnLCAnXycsICdwJywgJ18nLCAnMycsICdkJywKKyAgJ18nLCAndicsICcyJywgJ2knLCAnMScsICc2JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywgJ3AnLCAnXycsICczJywgJ2QnLCAnXycsICd2JywKKyAgJzInLCAnaScsICczJywgJzInLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywKKyAgJ20nLCAnXycsICdzJywgJ3UnLCAncycsICd0JywgJ18nLCAncCcsICdfJywgJzMnLCAnZCcsICdfJywgJ3YnLCAnMicsICdpJywKKyAgJzgnLCAnXycsICd0JywgJ3InLCAnYScsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICdzJywKKyAgJ3UnLCAncycsICd0JywgJ18nLCAncCcsICdfJywgJzMnLCAnZCcsICdfJywgJ3YnLCAnNCcsICdpJywgJzEnLCAnNicsICdfJywKKyAgJ3QnLCAncicsICdhJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3MnLCAndScsICdzJywKKyAgJ3QnLCAnXycsICdwJywgJ18nLCAnMycsICdkJywgJ18nLCAndicsICc0JywgJ2knLCAnMycsICcyJywgJ18nLCAndCcsICdyJywKKyAgJ2EnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd1JywgJ3MnLCAndCcsICdfJywKKyAgJ3AnLCAnXycsICczJywgJ2QnLCAnXycsICd2JywgJzQnLCAnaScsICc4JywgJ18nLCAndCcsICdyJywgJ2EnLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAncycsICd3JywgJ2EnLCAncCcsICdfJywgJ2wnLCAnbycsICdfJywKKyAgJ2gnLCAnaScsICdfJywgJ2InLCAnNicsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICd0JywKKyAgJ3InLCAndScsICduJywgJ2MnLCAnXycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICd0JywKKyAgJ3InLCAndScsICduJywgJ2MnLCAnXycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICd0JywKKyAgJ3InLCAndScsICduJywgJ2MnLCAnXycsICdmJywgJ3QnLCAneicsICdfJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3QnLCAneCcsICdxJywgJ18nLCAnYScsICdyJywgJ3InLCAnYScsICd5JywgJ18nLCAncycsICdpJywKKyAgJ3onLCAnZScsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAndCcsICd4JywgJ3EnLCAnXycsICdjJywKKyAgJ2gnLCAnYScsICduJywgJ24nLCAnZScsICdsJywgJ18nLCAnZCcsICdhJywgJ3QnLCAnYScsICdfJywgJ3QnLCAneScsICdwJywKKyAgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3QnLCAneCcsICdxJywgJ18nLCAnYycsICdoJywKKyAgJ2EnLCAnbicsICduJywgJ2UnLCAnbCcsICdfJywgJ28nLCAncicsICdkJywgJ2UnLCAncicsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAndCcsICd4JywgJ3EnLCAnXycsICdkJywgJ2UnLCAncCcsICd0JywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3QnLCAneCcsICdxJywgJ18nLCAnaCcsICdlJywgJ2knLCAnZycsICdoJywKKyAgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3QnLCAneCcsICdxJywgJ18nLCAnbicsICd1JywKKyAgJ20nLCAnXycsICdtJywgJ2knLCAncCcsICdtJywgJ2EnLCAncCcsICdfJywgJ2wnLCAnZScsICd2JywgJ2UnLCAnbCcsICdzJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICd0JywgJ3gnLCAncScsICdfJywgJ24nLCAndScsICdtJywKKyAgJ18nLCAncycsICdhJywgJ20nLCAncCcsICdsJywgJ2UnLCAncycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywKKyAgJ18nLCAndCcsICd4JywgJ3EnLCAnXycsICd3JywgJ2knLCAnZCcsICd0JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3UnLCAnaScsICcyJywgJ2QnLCAnXycsICdyJywgJ20nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3UnLCAnaScsICcyJywgJ2QnLCAnXycsICdyJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3UnLCAnaScsICcyJywgJ2QnLCAnXycsICdyJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3UnLCAnaScsICcyJywgJ2QnLCAnXycsICdyJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3UnLCAnaScsICcyJywgJ2YnLCAnXycsICdyJywgJ20nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3UnLCAnaScsICcyJywgJ2YnLCAnXycsICdyJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3UnLCAnaScsICcyJywgJ2YnLCAnXycsICdyJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3UnLCAnaScsICcyJywgJ2YnLCAnXycsICdyJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3UnLCAnbCcsICdsJywgJzInLCAnZCcsICdfJywgJ3InLCAnbScsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAndScsICdsJywgJ2wnLCAnMicsICdkJywgJ18nLCAncicsICduJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ24nLCAndicsICd2JywgJ20nLCAnXycsICd1JywgJ2wnLCAnbCcsICcyJywgJ2QnLCAnXycsICdyJywgJ3AnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3UnLCAnbCcsICdsJywgJzInLCAnZCcsICdfJywgJ3InLCAneicsICdcMDAwJywKKyAgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAndScsICdsJywgJ2wnLCAnMicsICdmJywgJ18nLCAncicsICdtJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICd1JywgJ2wnLCAnbCcsICcyJywgJ2YnLCAnXycsICdyJywKKyAgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3UnLCAnbCcsICdsJywgJzInLCAnZicsICdfJywKKyAgJ3InLCAncCcsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAndScsICdsJywgJ2wnLCAnMicsICdmJywKKyAgJ18nLCAncicsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICd2JywgJ28nLCAndCcsICdlJywKKyAgJ18nLCAnYScsICdsJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3YnLCAnbycsICd0JywKKyAgJ2UnLCAnXycsICdhJywgJ2wnLCAnbCcsICdfJywgJ3MnLCAneScsICduJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywKKyAgJ3YnLCAnbScsICdfJywgJ3YnLCAnbycsICd0JywgJ2UnLCAnXycsICdhJywgJ24nLCAneScsICdcMDAwJywgJ18nLCAnXycsICduJywKKyAgJ3YnLCAndicsICdtJywgJ18nLCAndicsICdvJywgJ3QnLCAnZScsICdfJywgJ2EnLCAnbicsICd5JywgJ18nLCAncycsICd5JywKKyAgJ24nLCAnYycsICdcMDAwJywgJ18nLCAnXycsICduJywgJ3YnLCAndicsICdtJywgJ18nLCAndicsICdvJywgJ3QnLCAnZScsICdfJywKKyAgJ2InLCAnYScsICdsJywgJ2wnLCAnbycsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICd2JywKKyAgJ28nLCAndCcsICdlJywgJ18nLCAnYicsICdhJywgJ2wnLCAnbCcsICdvJywgJ3QnLCAnXycsICdzJywgJ3knLCAnbicsICdjJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ24nLCAndicsICd2JywgJ20nLCAnXycsICd2JywgJ28nLCAndCcsICdlJywgJ18nLCAndScsICduJywKKyAgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnbicsICd2JywgJ3YnLCAnbScsICdfJywgJ3YnLCAnbycsICd0JywgJ2UnLCAnXycsICd1JywKKyAgJ24nLCAnaScsICdfJywgJ3MnLCAneScsICduJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICdjJywgJ3InLCAneScsICdwJywKKyAgJ3QnLCAnbycsICdfJywgJ3YnLCAnYycsICdpJywgJ3AnLCAnaCcsICdlJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICdjJywKKyAgJ3InLCAneScsICdwJywgJ3QnLCAnbycsICdfJywgJ3YnLCAnYycsICdpJywgJ3AnLCAnaCcsICdlJywgJ3InLCAnbCcsICdhJywKKyAgJ3MnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywKKyAgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ2MnLCAncicsICd5JywgJ3AnLCAndCcsICdvJywgJ18nLCAndicsICduJywKKyAgJ2MnLCAnaScsICdwJywgJ2gnLCAnZScsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAnYycsICdyJywgJ3knLCAncCcsICd0JywKKyAgJ28nLCAnXycsICd2JywgJ24nLCAnYycsICdpJywgJ3AnLCAnaCcsICdlJywgJ3InLCAnbCcsICdhJywgJ3MnLCAndCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywKKyAgJ2UnLCAnYycsICdfJywgJ2MnLCAncicsICd5JywgJ3AnLCAndCcsICdvJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywKKyAgJ3gnLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAnYycsICdyJywgJ3knLCAncCcsICd0JywgJ28nLCAnXycsICd2JywKKyAgJ3AnLCAnbScsICdzJywgJ3UnLCAnbScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAnYycsICdyJywgJ3knLCAncCcsICd0JywKKyAgJ28nLCAnXycsICd2JywgJ3AnLCAnbScsICdzJywgJ3UnLCAnbScsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAnYycsICdyJywKKyAgJ3knLCAncCcsICd0JywgJ28nLCAnXycsICd2JywgJ3AnLCAnbScsICdzJywgJ3UnLCAnbScsICdoJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywKKyAgJ18nLCAnYycsICdyJywgJ3knLCAncCcsICd0JywgJ28nLCAnXycsICd2JywgJ3AnLCAnbScsICdzJywgJ3UnLCAnbScsICd3JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywKKyAgJ3YnLCAnZScsICdjJywgJ18nLCAnYycsICdyJywgJ3knLCAncCcsICd0JywgJ28nLCAnXycsICd2JywgJ3MnLCAnYicsICdvJywKKyAgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywKKyAgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICdjJywgJ3InLCAneScsICdwJywgJ3QnLCAnbycsICdfJywgJ3YnLCAncycsICdoJywKKyAgJ2EnLCAncycsICdpJywgJ2cnLCAnbScsICdhJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICdjJywgJ3InLCAneScsICdwJywKKyAgJ3QnLCAnbycsICdfJywgJ3YnLCAncycsICdoJywgJ2EnLCAncycsICdpJywgJ2cnLCAnbScsICdhJywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywKKyAgJ2MnLCAnXycsICdkJywgJ3MnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ2QnLCAncycsICdzJywgJ2EnLCAnbCcsICdsJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywKKyAgJ3YnLCAnZScsICdjJywgJ18nLCAnZCcsICdzJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICdkJywgJ3MnLCAndCcsICdzJywKKyAgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywKKyAgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICdkJywgJ3MnLCAndCcsICdzJywgJ3QnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywKKyAgJ2QnLCAncycsICd0JywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICdtJywgJ2YnLCAndicsICdzJywgJ2MnLCAncicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywKKyAgJ2UnLCAnYycsICdfJywgJ20nLCAndCcsICd2JywgJ3MnLCAnYycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdhJywKKyAgJ2InLCAncycsICdkJywgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYScsICdiJywgJ3MnLCAnZCcsICd1JywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywKKyAgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2EnLCAnYicsICdzJywgJ2QnLCAndScsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywKKyAgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICdjJywgJ3UnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYScsICdkJywKKyAgJ2QnLCAnYycsICd1JywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ2UnLCAnYycsICd1JywKKyAgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywKKyAgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ2UnLCAndScsICdxJywgJ20nLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywKKyAgJ2MnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ3MnLCAnYicsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdhJywKKyAgJ2QnLCAnZCcsICdzJywgJ2gnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYScsICdkJywgJ2QnLCAncycsICd3JywKKyAgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywKKyAgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2EnLCAnZCcsICdkJywgJ3UnLCAnYicsICdzJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywKKyAgJ18nLCAndicsICdhJywgJ2QnLCAnZCcsICd1JywgJ2gnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYScsICdkJywKKyAgJ2QnLCAndScsICd3JywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ3MnLCAnYicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywKKyAgJ2UnLCAnYycsICdfJywgJ3YnLCAnYScsICd2JywgJ2cnLCAncycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdhJywKKyAgJ3YnLCAnZycsICdzJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ3UnLCAnYicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywKKyAgJ2UnLCAnYycsICdfJywgJ3YnLCAnYScsICd2JywgJ2cnLCAndScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdhJywKKyAgJ3YnLCAnZycsICd1JywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2InLCAncCcsICdlJywgJ3InLCAnbScsICdxJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywKKyAgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywgJ2YnLCAncycsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywKKyAgJ2YnLCAndScsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywgJ2wnLCAneicsICdsJywgJ3MnLCAnYicsICdiJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywKKyAgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICdiJywgJ2YnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywKKyAgJ3YnLCAnYycsICdtJywgJ3AnLCAnYicsICdmJywgJ3AnLCAnXycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywKKyAgJ20nLCAncCcsICdlJywgJ3EnLCAnZicsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICdlJywKKyAgJ3EnLCAnZicsICdwJywgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnZScsICdxJywKKyAgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywKKyAgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnZScsICdxJywgJ3UnLCAnYicsICdfJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywKKyAgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ2UnLCAncScsICd1JywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywKKyAgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ2UnLCAncScsICd1JywgJ2QnLCAnXycsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywKKyAgJ18nLCAndicsICdjJywgJ20nLCAncCcsICdlJywgJ3EnLCAndScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywKKyAgJ20nLCAncCcsICdlJywgJ3EnLCAndScsICdoJywgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywKKyAgJ3AnLCAnZScsICdxJywgJ3UnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnZScsICdxJywKKyAgJ3UnLCAndycsICdfJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ2cnLCAnZScsICdmJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywKKyAgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ2cnLCAnZScsICdmJywgJ3AnLCAnXycsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywKKyAgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICdnJywgJ3QnLCAnZicsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywKKyAgJ18nLCAndicsICdjJywgJ20nLCAncCcsICdnJywgJ3QnLCAnZicsICdwJywgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywKKyAgJ3YnLCAnYycsICdtJywgJ3AnLCAnZycsICd0JywgJ3MnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywKKyAgJ3AnLCAnZycsICd0JywgJ3MnLCAnYicsICdfJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywKKyAgJ2cnLCAndCcsICdzJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ2cnLCAndCcsICdzJywKKyAgJ2QnLCAnXycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICdnJywgJ3QnLCAncycsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywKKyAgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICdnJywgJ3QnLCAncycsICdoJywgJ18nLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywKKyAgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnZycsICd0JywgJ3MnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywKKyAgJ3YnLCAnYycsICdtJywgJ3AnLCAnZycsICd0JywgJ3MnLCAndycsICdfJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywKKyAgJ2MnLCAnbScsICdwJywgJ2cnLCAndCcsICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywKKyAgJ2cnLCAndCcsICd1JywgJ2InLCAnXycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICdnJywKKyAgJ3QnLCAndScsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICdnJywgJ3QnLCAndScsICdkJywKKyAgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywKKyAgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnZycsICd0JywgJ3UnLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywKKyAgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnZycsICd0JywgJ3UnLCAnaCcsICdfJywgJ3AnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywKKyAgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ2cnLCAndCcsICd1JywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywKKyAgJ2MnLCAnbScsICdwJywgJ2cnLCAndCcsICd1JywgJ3cnLCAnXycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywKKyAgJ20nLCAncCcsICduJywgJ2UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnbicsICdlJywKKyAgJ2InLCAnXycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICduJywgJ2UnLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywKKyAgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnbicsICdlJywgJ2gnLCAnXycsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywKKyAgJ18nLCAndicsICdjJywgJ20nLCAncCcsICduJywgJ2UnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywKKyAgJ3AnLCAnbicsICdlJywgJ3cnLCAnXycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICduJywKKyAgJ2UnLCAneicsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywgJ20nLCAncCcsICduJywgJ2UnLCAneicsICdiJywKKyAgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywKKyAgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnbicsICdlJywgJ3onLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywKKyAgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICdtJywgJ3AnLCAnbicsICdlJywgJ3onLCAnaCcsICdfJywgJ3AnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywKKyAgJ2MnLCAnXycsICd2JywgJ2MnLCAnbScsICdwJywgJ24nLCAnZScsICd6JywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywKKyAgJ2MnLCAnbScsICdwJywgJ24nLCAnZScsICd6JywgJ3cnLCAnXycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdjJywKKyAgJ3QnLCAncycsICd4JywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ2MnLCAndCcsICd1JywgJ3gnLCAncycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywKKyAgJ2UnLCAnYycsICdfJywgJ3YnLCAnYycsICd0JywgJ3onLCAnbCcsICdzJywgJ2InLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywKKyAgJ3YnLCAnZScsICd4JywgJ3AnLCAndCcsICdlJywgJ2YnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnZycsICdiJywKKyAgJ2InLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywKKyAgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnbCcsICdvJywgJ2cnLCAnZScsICdmJywgJ3AnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywKKyAgJ2MnLCAnXycsICd2JywgJ20nLCAnYScsICdkJywgJ2QnLCAnZicsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywKKyAgJ2EnLCAneCcsICdmJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ20nLCAnYScsICd4JywgJ3MnLCAnYicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywKKyAgJ2UnLCAnYycsICdfJywgJ3YnLCAnbScsICdhJywgJ3gnLCAncycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywKKyAgJ2EnLCAneCcsICdzJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ20nLCAnYScsICd4JywgJ3MnLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywKKyAgJ2UnLCAnYycsICdfJywgJ3YnLCAnbScsICdhJywgJ3gnLCAndScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywKKyAgJ2EnLCAneCcsICd1JywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ20nLCAnYScsICd4JywgJ3UnLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywKKyAgJ2UnLCAnYycsICdfJywgJ3YnLCAnbScsICdhJywgJ3gnLCAndScsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywKKyAgJ2gnLCAnYScsICdkJywgJ2QnLCAncycsICdoJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ20nLCAnaCcsICdyJywKKyAgJ2EnLCAnZCcsICdkJywgJ3MnLCAnaCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ2knLCAnbicsICdmJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywKKyAgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ20nLCAnaScsICduJywgJ3MnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywKKyAgJ3YnLCAnbScsICdpJywgJ24nLCAncycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ2knLCAnbicsICdzJywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywKKyAgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ20nLCAnaScsICduJywgJ3MnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywKKyAgJ3YnLCAnbScsICdpJywgJ24nLCAndScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ2knLCAnbicsICd1JywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywKKyAgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ20nLCAnaScsICduJywgJ3UnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywKKyAgJ3YnLCAnbScsICdpJywgJ24nLCAndScsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ2wnLCAnYScsICdkJywKKyAgJ2QnLCAndScsICdoJywgJ20nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ20nLCAncycsICd1JywgJ20nLCAnbScsICdiJywKKyAgJ20nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywKKyAgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ20nLCAncycsICd1JywgJ20nLCAncycsICdoJywgJ20nLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywKKyAgJ2MnLCAnXycsICd2JywgJ20nLCAncycsICd1JywgJ20nLCAncycsICdoJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywKKyAgJ20nLCAncycsICd1JywgJ20nLCAndScsICdiJywgJ20nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ20nLCAncycsICd1JywKKyAgJ20nLCAndScsICdoJywgJ20nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ20nLCAncycsICd1JywgJ20nLCAndScsICdoJywKKyAgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywKKyAgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ20nLCAndScsICdsJywgJ2UnLCAncycsICdiJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywKKyAgJ18nLCAndicsICdtJywgJ3UnLCAnbCcsICdlJywgJ3MnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnbScsICd1JywKKyAgJ2wnLCAnZScsICdzJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ20nLCAndScsICdsJywgJ2UnLCAndScsICdiJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywKKyAgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ3UnLCAnbCcsICdlJywgJ3UnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywKKyAgJ3YnLCAnbScsICd1JywgJ2wnLCAnZScsICd1JywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ20nLCAndScsICdsJywKKyAgJ28nLCAncycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ3UnLCAnbCcsICdvJywgJ3MnLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywKKyAgJ2UnLCAnYycsICdfJywgJ3YnLCAnbScsICd1JywgJ2wnLCAnbycsICdzJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywKKyAgJ20nLCAndScsICdsJywgJ28nLCAndScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdtJywgJ3UnLCAnbCcsICdvJywKKyAgJ3UnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywKKyAgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAnbScsICd1JywgJ2wnLCAnbycsICd1JywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywKKyAgJ2MnLCAnXycsICd2JywgJ24nLCAnbScsICdzJywgJ3UnLCAnYicsICdmJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywKKyAgJ3AnLCAnZScsICdyJywgJ20nLCAnXycsICc0JywgJ3MnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncCcsICdrJywKKyAgJ3AnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywKKyAgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncCcsICdrJywgJ3MnLCAnZCcsICdzJywgJ3MnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywKKyAgJ2MnLCAnXycsICd2JywgJ3AnLCAnaycsICdzJywgJ2QnLCAndScsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdwJywKKyAgJ2snLCAncycsICdoJywgJ3MnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncCcsICdrJywgJ3MnLCAnaCcsICd1JywKKyAgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywKKyAgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3AnLCAnaycsICdzJywgJ3cnLCAncycsICdzJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywKKyAgJ18nLCAndicsICdwJywgJ2snLCAncycsICd3JywgJ3UnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncCcsICdrJywKKyAgJ3UnLCAnZCcsICd1JywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3AnLCAnaycsICd1JywgJ2gnLCAndScsICdzJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywKKyAgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdwJywgJ2snLCAndScsICd3JywgJ3UnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywKKyAgJ3YnLCAncCcsICdyJywgJ3QnLCAneScsICdiJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3AnLCAncicsICd0JywKKyAgJ3knLCAnYicsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdwJywgJ3InLCAndCcsICd5JywgJ2InLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywKKyAgJ2UnLCAnYycsICdfJywgJ3YnLCAncicsICdlJywgJ2YnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncicsICdmJywKKyAgJ2knLCAnbScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywKKyAgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncicsICdmJywgJ2knLCAnbicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywKKyAgJ3YnLCAncicsICdmJywgJ2knLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncicsICdmJywgJ2knLCAneicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywKKyAgJ2UnLCAnYycsICdfJywgJ3YnLCAncicsICdsJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3InLCAnbCcsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywKKyAgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdyJywgJ2wnLCAnZCcsICdtJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywKKyAgJ3InLCAnbCcsICdkJywgJ24nLCAnbScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncicsICdsJywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywKKyAgJ2MnLCAnXycsICd2JywgJ3InLCAnbCcsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdyJywgJ2wnLCAndycsICdtJywKKyAgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywKKyAgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3InLCAnbCcsICd3JywgJ24nLCAnbScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywKKyAgJ3YnLCAncicsICdzJywgJ3EnLCAncicsICd0JywgJ2UnLCAnZicsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdzJywKKyAgJ2UnLCAnbCcsICdfJywgJzQnLCAncycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdzJywgJ2wnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywKKyAgJ2MnLCAnXycsICd2JywgJ3MnLCAnbCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdzJywgJ2wnLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywKKyAgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsICdsJywgJ28nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3MnLCAnbCcsICd2JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywKKyAgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdzJywgJ2wnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsICdyJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywKKyAgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdzJywgJ3InLCAnYScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdzJywKKyAgJ3InLCAnYScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdzJywgJ3InLCAnYScsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywKKyAgJ18nLCAndicsICdzJywgJ3InLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsICdyJywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywKKyAgJ2MnLCAnXycsICd2JywgJ3MnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdzJywgJ3InLCAndicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywKKyAgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsICdyJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywKKyAgJ2MnLCAndScsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICdjJywgJ3UnLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywKKyAgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsICd1JywgJ2InLCAnZScsICdjJywgJ3UnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywKKyAgJ3YnLCAncycsICd1JywgJ2InLCAnZScsICd1JywgJ3EnLCAnbScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsICd1JywKKyAgJ2InLCAncycsICdiJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywgJ3MnLCAnaCcsICdzJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywKKyAgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICdzJywgJ3cnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywKKyAgJ3YnLCAncycsICd1JywgJ2InLCAndScsICdiJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3MnLCAndScsICdiJywKKyAgJ3UnLCAnaCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywKKyAgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICdzJywgJ3UnLCAnYicsICd1JywgJ3cnLCAncycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywKKyAgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsICd1JywgJ20nLCAnMicsICdzJywgJ3cnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywKKyAgJ3YnLCAncycsICd1JywgJ20nLCAnNCcsICdzJywgJ2InLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsICd1JywKKyAgJ20nLCAnNCcsICdzJywgJ2gnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsICd1JywgJ20nLCAnNCcsICd1JywKKyAgJ2InLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywKKyAgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAncycsICd1JywgJ20nLCAncycsICd3JywgJ3MnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywKKyAgJ2MnLCAnXycsICd2JywgJ3UnLCAncCcsICdrJywgJ2gnLCAncCcsICd4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICd1JywKKyAgJ3AnLCAnaycsICdoJywgJ3MnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAndScsICdwJywgJ2snLCAnaCcsICdzJywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2EnLCAnbCcsICd0JywKKyAgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3UnLCAncCcsICdrJywgJ2gnLCAncycsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywgJ3YnLCAnZScsICdjJywKKyAgJ18nLCAndicsICd1JywgJ3AnLCAnaycsICdsJywgJ3AnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnYScsICdsJywgJ3QnLCAnaScsICd2JywgJ2UnLCAnYycsICdfJywgJ3YnLCAndScsICdwJywKKyAgJ2snLCAnbCcsICdzJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2EnLCAnbCcsICd0JywgJ2knLCAndicsICdlJywgJ2MnLCAnXycsICd2JywgJ3UnLCAncCcsICdrJywgJ2wnLCAncycsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdhJywgJ2wnLCAndCcsICdpJywKKyAgJ3YnLCAnZScsICdjJywgJ18nLCAndicsICd1JywgJ3AnLCAnaycsICdsJywgJ3MnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYicsICdwJywgJ2UnLCAncicsICdtJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2QnLCAnaScsICd2JywgJ2QnLCAnZScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnZCcsICdpJywgJ3YnLCAnZCcsICdlJywKKyAgJ3UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2QnLCAnaScsICd2JywKKyAgJ3cnLCAnZScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnZCcsICdpJywKKyAgJ3YnLCAndycsICdlJywgJ3UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2cnLCAnZScsICd0JywgJ18nLCAndCcsICdlJywgJ3gnLCAnYScsICdzJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2cnLCAnZScsICd0JywgJ18nLCAndCcsICdlJywgJ3gnLCAnYScsICdzJywKKyAgJ3InLCAndScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnZycsICdlJywKKyAgJ3QnLCAnXycsICd0JywgJ2YnLCAnaCcsICdhJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2cnLCAnZScsICd0JywgJ18nLCAndCcsICdmJywgJ2knLCAnYScsICdyJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywKKyAgJ2EnLCAnYicsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywKKyAgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ2EnLCAnZCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ2EnLCAnZCcsICdkJywKKyAgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywKKyAgJ18nLCAncScsICd2JywgJ2YnLCAnYycsICdmJywgJ2knLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICdjJywgJ2YnLCAnaScsICdkJywKKyAgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywKKyAgJ18nLCAncScsICd2JywgJ2YnLCAnYycsICdmJywgJ2knLCAnZCcsICd1JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ2MnLCAnZicsICdpJywKKyAgJ2QnLCAndScsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywKKyAgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ2MnLCAnbScsICdwJywgJ2UnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICdjJywKKyAgJ20nLCAncCcsICdnJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAnYycsICdtJywgJ3AnLCAnbCcsICd0JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywKKyAgJ2MnLCAncCcsICdzJywgJ2cnLCAnbicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICdjJywgJ3QnLCAnaScsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywKKyAgJ2MnLCAndCcsICdpJywgJ2QnLCAndScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICdjJywgJ3QnLCAnaScsICdkJywgJ3UnLCAneicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywKKyAgJ3YnLCAnZicsICdjJywgJ3QnLCAnaScsICdkJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAnYycsICd0JywgJ2knLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywKKyAgJ3YnLCAnZicsICdjJywgJ3QnLCAnaScsICd3JywgJ3UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAnYycsICd0JywgJ2knLCAndycsICd1JywKKyAgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywKKyAgJ18nLCAncScsICd2JywgJ2YnLCAnYycsICd0JywgJ2knLCAndycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ2wnLCAnbycsICdnJywKKyAgJ2knLCAnYycsICdhJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICdtJywKKyAgJ2EnLCAnZCcsICdkJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAnbScsICdzJywgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICdtJywKKyAgJ3MnLCAndScsICdiJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAnbScsICd1JywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAnbScsICd1JywKKyAgJ2wnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywKKyAgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICduJywgJ2EnLCAnYicsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ24nLCAnZScsICdnJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywKKyAgJ3EnLCAndicsICdmJywgJ24nLCAnbScsICdhJywgJ2QnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICduJywgJ20nLCAnYScsICdkJywKKyAgJ2QnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywKKyAgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICduJywgJ20nLCAncycsICd1JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAnbicsICdtJywKKyAgJ3MnLCAndScsICdiJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAncCcsICdlJywgJ3InLCAnbScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICdyJywKKyAgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywKKyAgJ18nLCAncScsICd2JywgJ2YnLCAncicsICdlJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAncicsICdpJywgJ20nLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywKKyAgJ2YnLCAncicsICdpJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAncicsICdpJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAncicsICdpJywKKyAgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywKKyAgJ18nLCAncScsICd2JywgJ2YnLCAncicsICdzJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAncicsICdzJywgJ3EnLCAncicsICd0JywKKyAgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywKKyAgJ18nLCAncScsICd2JywgJ2YnLCAncicsICdzJywgJ3EnLCAncicsICd0JywgJ2UnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICdzJywKKyAgJ2UnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywKKyAgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICdzJywgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICdzJywgJ3UnLCAnYicsICdzJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywKKyAgJ3EnLCAndicsICdmJywgJ3QnLCAncycsICd0JywgJ24nLCAnYScsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ3gnLCAnbScsICdhJywKKyAgJ2QnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywKKyAgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICd4JywgJ20nLCAnYScsICdkJywgJ2QnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICd4JywKKyAgJ20nLCAndScsICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywKKyAgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ3gnLCAnbScsICd1JywgJ2wnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICd4JywKKyAgJ3gnLCAnYycsICdwJywgJ24nLCAnbScsICdhJywgJ2QnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnZicsICd4JywgJ3gnLCAnYycsICdwJywKKyAgJ24nLCAnbScsICdhJywgJ2QnLCAnZCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ3gnLCAneCcsICdtJywgJ2EnLCAnZCcsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywKKyAgJ3EnLCAndicsICdmJywgJ3gnLCAneCcsICdtJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2YnLCAneCcsICd4JywKKyAgJ24nLCAncCcsICdtJywgJ2EnLCAnZCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdmJywgJ3gnLCAneCcsICduJywgJ3AnLCAnbScsICdhJywKKyAgJ2QnLCAnZCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywKKyAgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdnJywgJ3AnLCAnYycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdsJywgJ2YnLCAnYycsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywKKyAgJ3EnLCAndicsICdsJywgJ2YnLCAnYycsICdkJywgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2wnLCAnZicsICdjJywgJ3MnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywKKyAgJ2wnLCAnZicsICdjJywgJ3MnLCAnYScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnbCcsICdmJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2wnLCAnZicsICdkJywKKyAgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywKKyAgJ18nLCAncScsICd2JywgJ2wnLCAnZicsICdpJywgJ3cnLCAnYScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnbCcsICdmJywgJ2knLCAndycsICdhJywKKyAgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywKKyAgJ18nLCAncScsICd2JywgJ2wnLCAnZicsICdpJywgJ3cnLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnbCcsICdmJywgJ2knLCAndycsICd6JywKKyAgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywKKyAgJ18nLCAncScsICd2JywgJ2wnLCAnZicsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdsJywgJ2YnLCAncycsICdhJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdsJywKKyAgJ3AnLCAnYycsICdsJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ2wnLCAncCcsICdjJywgJ2wnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAnbCcsICdwJywKKyAgJ2MnLCAncicsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywKKyAgJ3AnLCAneCcsICdfJywgJ3EnLCAndicsICdsJywgJ3AnLCAnYycsICdyJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ3MnLCAndCcsICdmJywKKyAgJ2MnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywKKyAgJ3gnLCAnXycsICdxJywgJ3YnLCAncycsICd0JywgJ2YnLCAnYycsICdkJywgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ3MnLCAndCcsICdmJywKKyAgJ2MnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywKKyAgJ3gnLCAnXycsICdxJywgJ3YnLCAncycsICd0JywgJ2YnLCAnYycsICdzJywgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywgJ18nLCAncScsICd2JywgJ3MnLCAndCcsICdmJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3EnLCAncCcsICd4JywKKyAgJ18nLCAncScsICd2JywgJ3MnLCAndCcsICdmJywgJ2QnLCAnYScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAncycsICd0JywgJ2YnLCAnaScsICd3JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdxJywgJ3AnLCAneCcsICdfJywKKyAgJ3EnLCAndicsICdzJywgJ3QnLCAnZicsICdpJywgJ3cnLCAnYScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywgJ3YnLCAncycsICd0JywgJ2YnLCAncycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncScsICdwJywgJ3gnLCAnXycsICdxJywKKyAgJ3YnLCAncycsICd0JywgJ2YnLCAncycsICdhJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdzJywgJ2UnLCAndCcsICdfJywgJ3QnLCAnZScsICd4JywgJ2EnLCAncycsICdyJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJ2UnLCAndCcsICdfJywgJ3QnLCAnZScsICd4JywKKyAgJ2EnLCAncycsICdyJywgJ3UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3MnLCAnZScsICd0JywgJ18nLCAndCcsICdmJywgJ2gnLCAnYScsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJ2UnLCAndCcsICdfJywgJ3QnLCAnZicsICdpJywgJ2EnLCAncicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndCcsICdhJywgJ2InLCAnbycsICdyJywKKyAgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3QnLCAnYScsICdiJywKKyAgJ28nLCAncicsICd0JywgJ2QnLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAndCcsICdhJywgJ2InLCAnbycsICdyJywgJ3QnLCAnZCcsICdjJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3QnLCAnYScsICdiJywgJ28nLCAncicsICd0JywgJ3cnLCAnYycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndCcsICdhJywgJ2InLCAnbycsICdyJywKKyAgJ3QnLCAndycsICdjJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3QnLCAnYicsICdlJywgJ2cnLCAnaScsICduJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICd0JywgJ2MnLCAnaCcsICdlJywgJ2MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAndCcsICdlJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAndCcsICdlJywgJ24nLCAnZCcsICdhJywgJ2wnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndCcsICdyJywgJ2UnLCAnYycsICdoJywgJ2snLCAncCcsICd0JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd0JywgJ3InLCAnZScsICdjJywKKyAgJ2wnLCAnYScsICdpJywgJ20nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3QnLCAncicsICdlJywgJ3MnLCAndScsICdtJywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3QnLCAncycsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICd0JywgJ3MnLCAndScsICdzJywgJ3AnLCAnZScsICduJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3QnLCAndCcsICdlJywgJ3MnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywgJ3MnLCAnbScsICdhJywKKyAgJ3gnLCAnZCcsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywKKyAgJ3MnLCAneCcsICdfJywgJ3gnLCAncycsICdtJywgJ2knLCAnbicsICdkJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd2JywgJ2MnLCAnbScsICdwJywKKyAgJ2UnLCAncScsICdkJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd2JywgJ2MnLCAnbScsICdwJywgJ2UnLCAncScsICdkJywgJ3AnLCAnXycsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsICdfJywKKyAgJ3gnLCAndicsICdjJywgJ20nLCAncCcsICdlJywgJ3EnLCAncycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsICdfJywgJ3gnLCAndicsICdjJywgJ20nLCAncCcsICdlJywKKyAgJ3EnLCAncycsICdwJywgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywgJ3YnLCAnYycsICdtJywgJ3AnLCAnZycsICdlJywgJ2QnLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywKKyAgJ3YnLCAnYycsICdtJywgJ3AnLCAnZycsICdlJywgJ2QnLCAncCcsICdfJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd2JywgJ2MnLCAnbScsICdwJywKKyAgJ2cnLCAnZScsICdzJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd2JywgJ2MnLCAnbScsICdwJywgJ2cnLCAnZScsICdzJywgJ3AnLCAnXycsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsICdfJywKKyAgJ3gnLCAndicsICdjJywgJ20nLCAncCcsICdnJywgJ3QnLCAnZCcsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsICdfJywgJ3gnLCAndicsICdjJywgJ20nLCAncCcsICdnJywKKyAgJ3QnLCAnZCcsICdwJywgJ18nLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywgJ3YnLCAnYycsICdtJywgJ3AnLCAnZycsICd0JywgJ3MnLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywKKyAgJ3YnLCAnYycsICdtJywgJ3AnLCAnZycsICd0JywgJ3MnLCAncCcsICdfJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd2JywgJ2MnLCAndicsICdkJywKKyAgJ3AnLCAncycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywKKyAgJ3MnLCAneCcsICdfJywgJ3gnLCAndicsICdjJywgJ3YnLCAnZCcsICdwJywgJ3MnLCAneCcsICd3JywgJ3MnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd2JywKKyAgJ2MnLCAndicsICdkJywgJ3AnLCAndScsICd4JywgJ3cnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywgJ3YnLCAnYycsICd2JywgJ2gnLCAncCcsICdzJywKKyAgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3YnLCAncycsICd4JywKKyAgJ18nLCAneCcsICd2JywgJ2MnLCAndicsICdzJywgJ3AnLCAnZCcsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsICdfJywgJ3gnLCAndicsICdjJywgJ3YnLCAncycsICdwJywKKyAgJ2gnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywKKyAgJ3gnLCAnXycsICd4JywgJ3YnLCAnYycsICd2JywgJ3MnLCAneCcsICdkJywgJ3MnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywgJ3YnLCAnYycsICd2JywKKyAgJ3MnLCAneCcsICd3JywgJ2QnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywgJ3YnLCAnYycsICd2JywgJ3UnLCAneCcsICdkJywgJ3MnLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywKKyAgJ3YnLCAnYycsICd2JywgJ3UnLCAneCcsICd3JywgJ2QnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywgJ3YnLCAnZCcsICdpJywgJ3YnLCAnZCcsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsICdfJywKKyAgJ3gnLCAndicsICdkJywgJ2knLCAndicsICdzJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd2JywgJ2knLCAnZScsICd4JywgJ3AnLCAnZCcsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsICdfJywKKyAgJ3gnLCAndicsICdpJywgJ2UnLCAneCcsICdwJywgJ3MnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywgJ3YnLCAnbScsICdhJywgJ3gnLCAnZCcsICdwJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsICdfJywKKyAgJ3gnLCAndicsICdtJywgJ2EnLCAneCcsICdzJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd2JywgJ20nLCAnaScsICduJywgJ2QnLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywKKyAgJ3YnLCAnbScsICdpJywgJ24nLCAncycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsICdfJywgJ3gnLCAndicsICdyJywgJ2UnLCAnZCcsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsICdfJywgJ3gnLCAndicsICdyJywKKyAgJ2UnLCAncycsICdwJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywKKyAgJ3MnLCAneCcsICdfJywgJ3gnLCAndicsICdyJywgJ3MnLCAncScsICdyJywgJ3QnLCAnZScsICdkJywgJ3AnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd2JywKKyAgJ3InLCAncycsICdxJywgJ3InLCAndCcsICdlJywgJ3MnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywgJ3YnLCAndCcsICdzJywgJ3QnLCAnZCcsICdjJywKKyAgJ2QnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywKKyAgJ3gnLCAnXycsICd4JywgJ3YnLCAndCcsICdzJywgJ3QnLCAnZCcsICdjJywgJ3MnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywgJ3YnLCAneCcsICdlJywKKyAgJ3gnLCAncCcsICdkJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd2JywgJ3gnLCAnZScsICd4JywgJ3AnLCAncycsICdwJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsICdfJywgJ3gnLCAndicsICd4JywKKyAgJ3MnLCAnaScsICdnJywgJ2QnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAndicsICdzJywgJ3gnLCAnXycsICd4JywgJ3YnLCAneCcsICdzJywgJ2knLCAnZycsICdzJywgJ3AnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3YnLCAncycsICd4JywgJ18nLCAneCcsICd4JywKKyAgJ2UnLCAneCcsICd0JywgJ3InLCAnYScsICdjJywgJ3QnLCAndScsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywgJ3MnLCAneCcsICdfJywgJ3gnLCAneCcsICdpJywgJ24nLCAncycsICdlJywKKyAgJ3InLCAndCcsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd2JywKKyAgJ3MnLCAneCcsICdfJywgJ3gnLCAneCcsICdsJywgJ2UnLCAncScsICd2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdyJywgJzYnLCAnMCcsICcwJywgJ18nLCAnZycsICdyJywgJ28nLCAndScsICdwJywKKyAgJ18nLCAnYicsICdhJywgJ3InLCAncicsICdpJywgJ2UnLCAncicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAncicsICc2JywgJzAnLCAnMCcsICdfJywgJ2knLCAnbScsICdwJywgJ2wnLCAnaScsICdjJywKKyAgJ2knLCAndCcsICdhJywgJ3InLCAnZycsICdfJywgJ3AnLCAndCcsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdyJywgJzYnLCAnMCcsICcwJywgJ18nLCAncicsICdhJywgJ3QnLCAnXycsICdzJywKKyAgJ3QnLCAnbycsICdyJywgJ2UnLCAnXycsICd0JywgJ3knLCAncCcsICdlJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3InLCAnNicsICcwJywgJzAnLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywKKyAgJ18nLCAnZycsICdsJywgJ28nLCAnYicsICdhJywgJ2wnLCAnXycsICdzJywgJ2knLCAneicsICdlJywgJ18nLCAneCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncicsICc2JywgJzAnLCAnMCcsICdfJywKKyAgJ3InLCAnZScsICdhJywgJ2QnLCAnXycsICdnJywgJ2wnLCAnbycsICdiJywgJ2EnLCAnbCcsICdfJywgJ3MnLCAnaScsICd6JywKKyAgJ2UnLCAnXycsICd5JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdyJywKKyAgJzYnLCAnMCcsICcwJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdfJywgJ2cnLCAnbCcsICdvJywgJ2InLCAnYScsICdsJywKKyAgJ18nLCAncycsICdpJywgJ3onLCAnZScsICdfJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3InLCAnNicsICcwJywgJzAnLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAnbicsICdnJywKKyAgJ3InLCAnbycsICd1JywgJ3AnLCAncycsICdfJywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3InLCAnNicsICcwJywgJzAnLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAnbicsICdnJywKKyAgJ3InLCAnbycsICd1JywgJ3AnLCAncycsICdfJywgJ3knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3InLCAnNicsICcwJywgJzAnLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAnbicsICdnJywKKyAgJ3InLCAnbycsICd1JywgJ3AnLCAncycsICdfJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3InLCAnNicsICcwJywgJzAnLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAndCcsICdnJywKKyAgJ2knLCAnZCcsICdfJywgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3InLCAnNicsICcwJywgJzAnLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAndCcsICdnJywgJ2knLCAnZCcsICdfJywKKyAgJ3knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3InLCAnNicsICcwJywKKyAgJzAnLCAnXycsICdyJywgJ2UnLCAnYScsICdkJywgJ18nLCAndCcsICdnJywgJ2knLCAnZCcsICdfJywgJ3onLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICdlJywKKyAgJ2YnLCAncCcsICdjJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICd0JywKKyAgJ3gnLCAnXycsICduJywgJ2UnLCAncycsICd0JywgJ2knLCAnbicsICdnJywgJ18nLCAnZCcsICdlJywgJ3AnLCAndCcsICdoJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywKKyAgJ18nLCAnbCcsICdjJywgJ2InLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAndCcsICd4JywgJ18nLCAnYScsICdzJywgJ3MnLCAnaScsICdzJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICdzJywgJ2YnLCAncCcsICdjJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywKKyAgJ18nLCAndicsICdhJywgJ2MnLCAnYycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdhJywgJ2MnLCAnYycsICdjJywgJ3EnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywKKyAgJ2EnLCAnYycsICdjJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2EnLCAnYycsICdjJywgJ2cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2EnLCAnYycsICdjJywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywKKyAgJzAnLCAnXycsICd2JywgJ2EnLCAnYycsICdjJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2EnLCAnYycsICdxJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdhJywKKyAgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywKKyAgJzAnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ2YnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywKKyAgJ2EnLCAndicsICdnJywgJ2cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywKKyAgJ2wnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywKKyAgJzknLCAnMCcsICdfJywgJ3YnLCAnYScsICd2JywgJ2cnLCAnbCcsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdhJywgJ3YnLCAnZycsICdsJywKKyAgJ2cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywKKyAgJzAnLCAnXycsICd2JywgJ2EnLCAndicsICdnJywgJ2wnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnYicsICdwJywgJ2UnLCAncicsICdtJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywKKyAgJ18nLCAndicsICdjJywgJ2snLCAncycsICdtJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdlJywgJ3InLCAnaScsICdtJywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywKKyAgJ2UnLCAncicsICdpJywgJ20nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnZScsICdyJywgJ2knLCAnbScsICdnJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdlJywKKyAgJ3InLCAnaScsICdtJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2UnLCAncicsICdsJywgJ2wnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnZScsICdyJywKKyAgJ2wnLCAnbCcsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywKKyAgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdlJywgJ3InLCAnbCcsICdsJywgJ2cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2UnLCAncicsICdsJywKKyAgJ2wnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywKKyAgJzknLCAnMCcsICdfJywgJ3YnLCAnZScsICdyJywgJ2wnLCAnbCcsICd2JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2UnLCAncicsICdsJywKKyAgJ2wnLCAndicsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywKKyAgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdlJywgJ3InLCAnbCcsICdsJywgJ3YnLCAnZycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnZScsICdyJywKKyAgJ2wnLCAnbCcsICd2JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2YnLCAnYScsICdlJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2YnLCAnYScsICdlJywKKyAgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywKKyAgJzAnLCAnXycsICd2JywgJ2YnLCAnYScsICdlJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2YnLCAnYScsICdlJywgJ3onLCAnYicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywKKyAgJ3YnLCAnZicsICdhJywgJ2UnLCAneicsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdmJywgJ2EnLCAnZScsICd6JywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywKKyAgJ2YnLCAnZScsICdlJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2YnLCAnZScsICdlJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2YnLCAnZScsICdlJywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywKKyAgJzAnLCAnXycsICd2JywgJ2YnLCAnZScsICdlJywgJ3onLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnZicsICdlJywgJ2UnLCAneicsICdmJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywKKyAgJ18nLCAndicsICdmJywgJ2UnLCAnZScsICd6JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2YnLCAnZScsICduJywgJ2UnLCAnYicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywKKyAgJ3YnLCAnZicsICdlJywgJ24nLCAnZScsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdmJywgJ2UnLCAnbicsICdlJywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywKKyAgJ2YnLCAnZScsICduJywgJ2UnLCAneicsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdmJywgJ2UnLCAnbicsICdlJywgJ3onLCAnZicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywKKyAgJ3YnLCAnZicsICdlJywgJ24nLCAnZScsICd6JywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2cnLCAnZicsICdtJywgJ2EnLCAnYicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywKKyAgJ3YnLCAnZycsICdmJywgJ20nLCAnYScsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdnJywgJ2YnLCAnbScsICdhJywgJ2cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywKKyAgJ2cnLCAnZicsICdtJywgJ2EnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnZycsICdmJywgJ20nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnZycsICdmJywKKyAgJ20nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywKKyAgJzknLCAnMCcsICdfJywgJ3YnLCAnZycsICdmJywgJ20nLCAnZycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnZycsICdmJywgJ20nLCAnaCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywKKyAgJ3YnLCAnaScsICdzJywgJ3QnLCAncicsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdpJywgJ3MnLCAndCcsICdyJywgJ2YnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywKKyAgJ2knLCAncycsICd0JywgJ3InLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnbCcsICdiJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ2wnLCAnbCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywKKyAgJ3YnLCAnbCcsICdyJywgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ20nLCAnYScsICdlJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ20nLCAnYScsICdlJywKKyAgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywKKyAgJzAnLCAnXycsICd2JywgJ20nLCAnYScsICdlJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ20nLCAnYScsICdoJywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywKKyAgJ20nLCAnYScsICdoJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ20nLCAnYScsICdoJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ20nLCAnYScsICdsJywKKyAgJ2UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywKKyAgJzknLCAnMCcsICdfJywgJ3YnLCAnbScsICdhJywgJ2wnLCAnZScsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdtJywgJ2EnLCAnbCcsICdlJywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywKKyAgJzAnLCAnXycsICd2JywgJ20nLCAnYScsICdsJywgJ2gnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnbScsICdhJywgJ2wnLCAnaCcsICdmJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywKKyAgJ18nLCAndicsICdtJywgJ2EnLCAnbCcsICdoJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ20nLCAnYScsICdsJywgJ28nLCAnYicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywKKyAgJ3YnLCAnbScsICdhJywgJ2wnLCAnbycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdtJywgJ2EnLCAnbCcsICdvJywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywKKyAgJ20nLCAnYScsICdvJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ20nLCAnYScsICdvJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ20nLCAnYScsICdvJywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywKKyAgJzAnLCAnXycsICd2JywgJ20nLCAnZScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdtJywgJ2UnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnbScsICdlJywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywKKyAgJzAnLCAnXycsICd2JywgJ20nLCAnaCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdtJywgJ2gnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnbScsICdoJywKKyAgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywKKyAgJzAnLCAnXycsICd2JywgJ20nLCAnbCcsICdlJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ20nLCAnbCcsICdlJywgJ2YnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywKKyAgJ20nLCAnbCcsICdlJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ20nLCAnbCcsICdoJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ20nLCAnbCcsICdoJywKKyAgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywKKyAgJzAnLCAnXycsICd2JywgJ20nLCAnbCcsICdoJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ20nLCAnbCcsICdvJywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywKKyAgJ20nLCAnbCcsICdvJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ20nLCAnbCcsICdvJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ20nLCAnbycsICdiJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywKKyAgJ18nLCAndicsICdtJywgJ28nLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAnbScsICdvJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ20nLCAncycsICdsJywKKyAgJ2cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywKKyAgJzAnLCAnXycsICd2JywgJ3AnLCAnZCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdwJywKKyAgJ2snLCAnbCcsICdzJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3AnLCAnaycsICdsJywgJ3MnLCAnZycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAncCcsICdrJywKKyAgJ2wnLCAncycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywKKyAgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdwJywgJ2snLCAncycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdwJywgJ2snLCAncycsICdnJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywKKyAgJ18nLCAndicsICdwJywgJ2snLCAncycsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdzJywgJ2InLCAnYycsICdiJywgJ2knLCAncScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywKKyAgJ3YnLCAncycsICdiJywgJ2knLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAncycsICdjJywgJ2InLCAnaScsICdiJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdzJywKKyAgJ2MnLCAnYicsICdpJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3MnLCAnYycsICdiJywgJ2knLCAnZycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAncycsICdjJywKKyAgJ2InLCAnaScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywKKyAgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdzJywgJ2MnLCAnYicsICdpJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3MnLCAnbCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywKKyAgJ3YnLCAncycsICdsJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3MnLCAnbCcsICdkJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3MnLCAncScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywKKyAgJ3YnLCAncycsICdyJywgJ2EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3MnLCAncicsICdhJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3MnLCAncicsICdsJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywKKyAgJ18nLCAndicsICdzJywgJ3InLCAnbCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdzJywgJ3QnLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAncycsICd0JywKKyAgJ3InLCAnYycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywKKyAgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdzJywgJ3QnLCAncicsICdjJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3MnLCAndCcsICdyJywKKyAgJ2MnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywKKyAgJzknLCAnMCcsICdfJywgJ3YnLCAncycsICd0JywgJ3InLCAnYycsICd6JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3MnLCAndCcsICdyJywKKyAgJ2MnLCAneicsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywKKyAgJzMnLCAnOScsICcwJywgJ18nLCAndicsICdzJywgJ3QnLCAncicsICdjJywgJ3onLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAncycsICd0JywKKyAgJ3InLCAnbCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywKKyAgJzknLCAnMCcsICdfJywgJ3YnLCAncycsICd1JywgJ20nLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAncycsICd1JywgJ20nLCAnZycsICdmJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywKKyAgJ18nLCAndicsICdzJywgJ3UnLCAnbScsICdnJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3MnLCAndScsICdtJywgJ2gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywKKyAgJ3MnLCAndScsICdtJywgJ3EnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAncycsICd1JywgJ20nLCAncScsICdnJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICd0JywKKyAgJ20nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywKKyAgJzAnLCAnXycsICd2JywgJ3UnLCAncCcsICdoJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3UnLCAncCcsICdoJywgJ2YnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywKKyAgJ3UnLCAncCcsICdoJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3UnLCAncCcsICdsJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3UnLCAncCcsICdsJywKKyAgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywKKyAgJzAnLCAnXycsICd2JywgJ3UnLCAncCcsICdsJywgJ2gnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywgJ3YnLCAndScsICdwJywgJ2wnLCAnaCcsICdmJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywKKyAgJ18nLCAndicsICd1JywgJ3AnLCAnbCcsICdoJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywgJ3UnLCAncCcsICdsJywgJ2gnLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAncycsICczJywgJzknLCAnMCcsICdfJywKKyAgJ3YnLCAndScsICdwJywgJ2wnLCAnbCcsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdzJywgJzMnLCAnOScsICcwJywgJ18nLCAndicsICd1JywgJ3AnLCAnbCcsICdsJywgJ2YnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ3MnLCAnMycsICc5JywgJzAnLCAnXycsICd2JywKKyAgJ3UnLCAncCcsICdsJywgJ2wnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsICd2JywgJ2cnLCAndScsICdzJywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ2YnLCAnMicsICdpJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2YnLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2YnLCAnYScsICdkJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ2YnLCAnYycsICdtJywgJ3AnLCAnZScsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdmJywgJ2MnLCAnbScsICdwJywKKyAgJ2cnLCAnZScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAnZicsICdjJywgJ20nLCAncCcsICdnJywgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2YnLCAnbScsICdhJywKKyAgJ3gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ2YnLCAnbScsICdpJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2YnLCAnbScsICd1JywgJ2wnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ2YnLCAncicsICdjJywgJ3AnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2YnLCAncicsICdjJywgJ3AnLCAnaScsICd0JywgJzEnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ2YnLCAncicsICdjJywgJ3AnLCAnaScsICd0JywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2YnLCAncicsICdzJywgJ3EnLCAnaScsICd0JywKKyAgJzEnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ2YnLCAncicsICdzJywgJ3EnLCAncicsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdmJywgJ3MnLCAndScsICdiJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICdmJywgJ3MnLCAndScsICdiJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2knLCAnMicsICdmJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ20nLCAndScsICdsJywgJ2gnLCAncicsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdmJywgJzInLCAnaScsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdmJywKKyAgJ24nLCAnYScsICdjJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2YnLCAncCcsICduJywgJ2EnLCAnYycsICdjJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdpJywKKyAgJzInLCAnZicsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnYScsICdkJywgJ2QnLCAnYycsICdhJywgJ3InLCAncicsICd5JywgJ18nLCAndScsICczJywKKyAgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdhJywgJ2QnLCAnZCcsICdjJywgJ2EnLCAncicsICdyJywgJ3knLCAnXycsICd1JywgJzYnLCAnNCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2EnLCAnZCcsICdkJywgJ2MnLCAnYScsICdyJywgJ3InLCAneScsICd4JywgJ18nLCAndScsICczJywgJzInLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdhJywKKyAgJ2QnLCAnZCcsICdjJywgJ2EnLCAncicsICdyJywgJ3knLCAneCcsICdfJywgJ3UnLCAnNicsICc0JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYScsICdlJywKKyAgJ3MnLCAnZCcsICdlJywgJ2MnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdhJywgJ2UnLCAncycsICdkJywgJ2UnLCAnYycsICcyJywKKyAgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ2EnLCAnZScsICdzJywgJ2QnLCAnZScsICdjJywgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYScsICdlJywKKyAgJ3MnLCAnZCcsICdlJywgJ2MnLCAnbCcsICdhJywgJ3MnLCAndCcsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2EnLCAnZScsICdzJywKKyAgJ2QnLCAnZScsICdjJywgJ2wnLCAnYScsICdzJywgJ3QnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdhJywgJ2UnLCAncycsICdkJywKKyAgJ2UnLCAnYycsICdsJywgJ2EnLCAncycsICd0JywgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYScsICdlJywgJ3MnLCAnZScsICduJywKKyAgJ2MnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdhJywgJ2UnLCAncycsICdlJywgJ24nLCAnYycsICcyJywgJzUnLCAnNicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2EnLCAnZScsICdzJywgJ2UnLCAnbicsICdjJywgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYScsICdlJywgJ3MnLCAnZScsICduJywKKyAgJ2MnLCAnbCcsICdhJywgJ3MnLCAndCcsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2EnLCAnZScsICdzJywgJ2UnLCAnbicsICdjJywKKyAgJ2wnLCAnYScsICdzJywgJ3QnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdhJywgJ2UnLCAncycsICdlJywgJ24nLCAnYycsICdsJywKKyAgJ2EnLCAncycsICd0JywgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYScsICdlJywgJ3MnLCAnaScsICdtJywgJ2MnLCAnMScsICcyJywKKyAgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdhJywgJ2UnLCAncycsICdrJywgJ2UnLCAneScsICdnJywgJ2UnLCAnbicsICdhJywgJ3MnLCAncycsICdpJywKKyAgJ3MnLCAndCcsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAndScsICdiJywgJ3AnLCAnZCcsICcyJywKKyAgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAndScsICdiJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2InLCAnbCcsICdlJywgJ24nLCAnZCcsICd2JywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2InLCAnbCcsICdlJywKKyAgJ24nLCAnZCcsICd2JywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3AnLCAnZCcsICcyJywKKyAgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3AnLCAnZCcsICcyJywgJ2QnLCAncScsICcyJywKKyAgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3AnLCAncycsICcyJywgJ2QnLCAncScsICcyJywgJzUnLCAnNicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2MnLCAndicsICd0JywgJ2QnLCAncScsICcyJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywKKyAgJ3QnLCAncCcsICdkJywgJzInLCAnZCcsICdxJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndCcsICdwJywKKyAgJ3MnLCAnMicsICdkJywgJ3EnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdkJywgJ3AnLCAncCcsICdzJywgJzInLCAnNScsICc2JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnaCcsICdhJywgJ2QnLCAnZCcsICdwJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdoJywgJ2EnLCAnZCcsICdkJywKKyAgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2gnLCAncycsICd1JywgJ2InLCAncCcsICdkJywgJzInLCAnNScsICc2JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnaCcsICdzJywgJ3UnLCAnYicsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdsJywgJ2QnLCAnZCcsICdxJywKKyAgJ3UnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ2wnLCAnbycsICdhJywgJ2QnLCAncCcsICdkJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdsJywgJ28nLCAnYScsICdkJywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnbCcsICdvJywgJ2EnLCAnZCcsICdwJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ2wnLCAnbycsICdhJywgJ2QnLCAncCcsICdzJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdzJywKKyAgJ3QnLCAnbycsICdyJywgJ2UnLCAncCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdzJywgJ3QnLCAnbycsICdyJywKKyAgJ2UnLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdzJywgJ3QnLCAnbycsICdyJywKKyAgJ2UnLCAncCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdzJywgJ3QnLCAnbycsICdyJywgJ2UnLCAncCcsICdzJywKKyAgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdhJywgJ3gnLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdhJywKKyAgJ3gnLCAncCcsICdzJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdpJywgJ24nLCAncCcsICdkJywgJzInLCAnNScsICc2JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnbScsICdpJywgJ24nLCAncCcsICdzJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdvJywgJ3YnLCAnbScsICdzJywKKyAgJ2snLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdvJywgJ3YnLCAnbScsICdzJywgJ2snLCAncCcsICdzJywKKyAgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICd0JywgJ2UnLCAncycsICd0JywgJ2MnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ3QnLCAnZScsICdzJywgJ3QnLCAnbicsICd6JywgJ2MnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3QnLCAnZScsICdzJywKKyAgJ3QnLCAneicsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnYycsICdwJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdwJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ28nLCAndScsICduJywKKyAgJ2QnLCAncCcsICdzJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdzJywgJ3EnLCAncicsICd0JywgJ3AnLCAncycsICcyJywKKyAgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3MnLCAncScsICdyJywgJ3QnLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdxJywKKyAgJ3InLCAndCcsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAnaScsICdsJywKKyAgJ3YnLCAnYScsICdyJywgJ3AnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICdpJywgJ2wnLCAndicsICdhJywKKyAgJ3InLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ2knLCAnbCcsICd2JywKKyAgJ2EnLCAncicsICdwJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAnaScsICdsJywgJ3YnLCAnYScsICdyJywKKyAgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAndCcsICdlJywgJ3MnLCAndCcsICdjJywgJ3AnLCAnZCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAndCcsICdlJywgJ3MnLCAndCcsICdjJywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAndCcsICdlJywKKyAgJ3MnLCAndCcsICdjJywgJ3AnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAndCcsICdlJywgJ3MnLCAndCcsICdjJywgJ3AnLCAncycsICcyJywKKyAgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAndCcsICdlJywgJ3MnLCAndCcsICduJywgJ3onLCAnYycsICdwJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywKKyAgJ3QnLCAnZScsICdzJywgJ3QnLCAnbicsICd6JywgJ2MnLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICd0JywKKyAgJ2UnLCAncycsICd0JywgJ24nLCAneicsICdjJywgJ3AnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAndCcsICdlJywgJ3MnLCAndCcsICduJywKKyAgJ3onLCAnYycsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3QnLCAnZScsICdzJywgJ3QnLCAneicsICdwJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd2JywgJ3QnLCAnZScsICdzJywgJ3QnLCAneicsICdwJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywKKyAgJ3QnLCAnZScsICdzJywgJ3QnLCAneicsICdwJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3QnLCAnZScsICdzJywgJ3QnLCAneicsICdwJywKKyAgJ3MnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3onLCAnZScsICdyJywgJ28nLCAnYScsICdsJywgJ2wnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywKKyAgJ3onLCAnZScsICdyJywgJ28nLCAndScsICdwJywgJ3AnLCAnZScsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywKKyAgJ3InLCAnZCcsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdkJywgJ18nLCAnZCcsICcyJywKKyAgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywgJ2QnLCAnXycsICdwJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywKKyAgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdkJywgJ18nLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywKKyAgJ3QnLCAnaCcsICdlJywgJ3InLCAnZCcsICdfJywgJ3AnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywKKyAgJ2QnLCAnXycsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdkJywKKyAgJ18nLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywgJ2QnLCAnXycsICdxJywgJzInLCAnNScsICc2JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAncScsICdfJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywKKyAgJ2UnLCAncicsICdxJywgJ18nLCAnZCcsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywKKyAgJ3EnLCAnXycsICdwJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdxJywgJ18nLCAncCcsICdkJywKKyAgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAncScsICdfJywgJ3AnLCAncycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywgJ3EnLCAnXycsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywKKyAgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdxJywgJ18nLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywKKyAgJ3EnLCAnXycsICdxJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdsJywgJ28nLCAnYScsICdkJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ2wnLCAnbycsICdhJywgJ2QnLCAnZCcsICcyJywgJzUnLCAnNicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnbCcsICdvJywgJ2EnLCAnZCcsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdsJywKKyAgJ28nLCAnYScsICdkJywgJ3EnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3MnLCAndCcsICdvJywKKyAgJ3InLCAnZScsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdzJywgJ3QnLCAnbycsICdyJywgJ2UnLCAnZCcsICcyJywKKyAgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAncycsICd0JywgJ28nLCAncicsICdlJywgJ3EnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICdxJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdwJywKKyAgJ3MnLCAnYScsICdkJywgJ2InLCAndycsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsICdjJywgJ2snLCAncycsICdzJywKKyAgJ2QnLCAndycsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsICdjJywgJ2snLCAncycsICdzJywgJ3cnLCAnYicsICcyJywKKyAgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsICdjJywgJ2snLCAndScsICdzJywgJ2QnLCAndycsICcyJywgJzUnLCAnNicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAnYScsICdjJywgJ2snLCAndScsICdzJywgJ3cnLCAnYicsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsICdkJywKKyAgJ2QnLCAncycsICdiJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywgJ2QnLCAnZCcsICdzJywgJ3cnLCAnMicsICc1JywKKyAgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ2EnLCAnZCcsICdkJywgJ3UnLCAncycsICdiJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywKKyAgJ2QnLCAnZCcsICd1JywgJ3MnLCAndycsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYicsICdsJywgJ2UnLCAnbicsICdkJywKKyAgJ3YnLCAnYicsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnZScsICdyJywgJ20nLCAndicsICdhJywgJ3InLCAncycsICdpJywKKyAgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdlJywgJ3InLCAnbScsICd2JywgJ2EnLCAncicsICdzJywgJ2YnLCAnMicsICc1JywKKyAgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ2gnLCAnYScsICdkJywgJ2QnLCAnZCcsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnaCcsICdhJywKKyAgJ2QnLCAnZCcsICdzJywgJ3cnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2gnLCAnYScsICdkJywgJ2QnLCAndycsICcyJywKKyAgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAnaCcsICdzJywgJ3UnLCAnYicsICdkJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdoJywKKyAgJ3MnLCAndScsICdiJywgJ3MnLCAndycsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnaCcsICdzJywgJ3UnLCAnYicsICd3JywKKyAgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ2EnLCAnZCcsICdkJywgJ3UnLCAnYicsICdzJywgJ3cnLCAnMicsICc1JywKKyAgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ20nLCAnYScsICdkJywgJ2QnLCAndycsICdkJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywKKyAgJ28nLCAndicsICdtJywgJ3MnLCAnaycsICdiJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ3UnLCAnbCcsICdkJywKKyAgJ3EnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAndScsICdsJywgJ2gnLCAncicsICdzJywgJ3cnLCAnMicsICc1JywKKyAgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ20nLCAndScsICdsJywgJ2gnLCAndycsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICd1JywKKyAgJ2wnLCAnaCcsICd1JywgJ3cnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAndScsICdsJywgJ3UnLCAnZCcsICdxJywKKyAgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ2EnLCAnZCcsICdiJywgJ3cnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ3MnLCAnaCcsICd1JywgJ2YnLCAnYicsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdpJywgJ2cnLCAnbicsICdiJywKKyAgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ2knLCAnZycsICduJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ3MnLCAnaScsICdnJywgJ24nLCAndycsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdsJywgJ2wnLCAnZCcsICcyJywKKyAgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdsJywgJ2wnLCAncScsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdsJywKKyAgJ2wnLCAndycsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdsJywgJ2wnLCAnZCcsICdpJywgJzInLCAnNScsICc2JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICdzJywgJ2wnLCAnbCcsICdxJywgJ2knLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnbCcsICdsJywKKyAgJ3cnLCAnaScsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdsJywgJ2wnLCAndicsICc0JywgJ3MnLCAnaScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAncycsICdsJywgJ2wnLCAndicsICc4JywgJ3MnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdsJywgJ2wnLCAndicsICcyJywKKyAgJ2QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdsJywgJ2wnLCAndicsICc0JywgJ2QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywKKyAgJ2EnLCAnZCcsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2EnLCAndycsICcyJywgJzUnLCAnNicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAncycsICdyJywgJ2EnLCAnZCcsICdpJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnYScsICd3JywKKyAgJ2knLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdhJywgJ3YnLCAnNCcsICdzJywgJ2knLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ3MnLCAncicsICdhJywgJ3YnLCAnOCcsICdzJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdsJywgJ2QnLCAnMicsICc1JywKKyAgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdsJywgJ3EnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdsJywKKyAgJ3cnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdsJywgJ2QnLCAnaScsICcyJywgJzUnLCAnNicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAncycsICdyJywgJ2wnLCAncScsICdpJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnbCcsICd3JywKKyAgJ2knLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdsJywgJ3YnLCAnNCcsICdzJywgJ2knLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ3MnLCAncicsICdsJywgJ3YnLCAnOCcsICdzJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdsJywgJ3YnLCAnMicsICdkJywKKyAgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdsJywgJ3YnLCAnNCcsICdkJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAndScsICdiJywKKyAgJ3MnLCAnYicsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICd1JywgJ2InLCAncycsICd3JywgJzInLCAnNScsICc2JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICdzJywgJ3UnLCAnYicsICd1JywgJ3MnLCAnYicsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICd1JywKKyAgJ2InLCAndScsICdzJywgJ3cnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdiJywgJ3InLCAnbycsICdhJywgJ2QnLCAnYycsICdhJywKKyAgJ3MnLCAndCcsICdtJywgJ2InLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdiJywgJ3InLCAnbycsICdhJywgJ2QnLCAnYycsICdhJywKKyAgJ3MnLCAndCcsICdtJywgJ2InLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdiJywgJ3InLCAnbycsICdhJywgJ2QnLCAnYycsICdhJywKKyAgJ3MnLCAndCcsICdtJywgJ2InLCAnNScsICcxJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdiJywgJ3InLCAnbycsICdhJywgJ2QnLCAnYycsICdhJywKKyAgJ3MnLCAndCcsICdtJywgJ3cnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdiJywgJ3InLCAnbycsICdhJywgJ2QnLCAnYycsICdhJywKKyAgJ3MnLCAndCcsICdtJywgJ3cnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdiJywgJ3InLCAnbycsICdhJywgJ2QnLCAnYycsICdhJywKKyAgJ3MnLCAndCcsICdtJywgJ3cnLCAnNScsICcxJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdzJywgJ2knLCAnMicsICdzJywKKyAgJ2QnLCAnNicsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncycsICdpJywgJzInLCAncycsICdzJywgJzMnLCAnMicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2MnLCAndicsICd0JywgJ3MnLCAnaScsICcyJywgJ3MnLCAncycsICc2JywgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2MnLCAndicsICd0JywKKyAgJ3QnLCAncycsICdkJywgJzInLCAncycsICdpJywgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnYycsICd2JywgJ3QnLCAndCcsICdzJywKKyAgJ2QnLCAnMicsICdzJywgJ2knLCAnNicsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdjJywgJ3YnLCAndCcsICd0JywgJ3MnLCAnZCcsICcyJywKKyAgJ3UnLCAncycsICdpJywgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnYycsICd2JywgJ3QnLCAndCcsICdzJywgJ2QnLCAnMicsICd1JywKKyAgJ3MnLCAnaScsICc2JywgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2MnLCAndicsICd0JywgJ3QnLCAncycsICdzJywgJzInLCAncycsICdpJywKKyAgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAnYycsICd2JywgJ3QnLCAndCcsICdzJywgJ3MnLCAnMicsICdzJywgJ2knLCAnNicsICc0JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdjJywgJ3YnLCAndCcsICd0JywgJ3MnLCAncycsICcyJywgJ3UnLCAncycsICdpJywgJzMnLCAnMicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAnYycsICd2JywgJ3QnLCAndCcsICdzJywgJ3MnLCAnMicsICd1JywgJ3MnLCAnaScsICc2JywgJzQnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywKKyAgJ3YnLCAndCcsICd1JywgJ3MnLCAnaScsICcyJywgJ3MnLCAnZCcsICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd1JywKKyAgJ3MnLCAnaScsICcyJywgJ3MnLCAncycsICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd1JywgJ3MnLCAnaScsICcyJywKKyAgJ3MnLCAnZCcsICc2JywgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd1JywgJ3MnLCAnaScsICcyJywgJ3MnLCAncycsICc2JywKKyAgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdlJywgJ3gnLCAncCcsICcyJywgJ3AnLCAnZCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdlJywKKyAgJ3gnLCAncCcsICcyJywgJ3AnLCAncycsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywKKyAgJ2UnLCAncicsICdzJywgJ2knLCAndicsICc4JywgJ2QnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywKKyAgJ3MnLCAnaScsICd2JywgJzEnLCAnNicsICdzJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdzJywKKyAgJ2knLCAndicsICc4JywgJ2QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywgJ3MnLCAnaScsICd2JywKKyAgJzEnLCAnNicsICdzJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdkJywgJ2knLCAndicsICc4JywKKyAgJ2QnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywgJ2QnLCAnaScsICd2JywgJzEnLCAnNicsICdzJywKKyAgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICdkJywgJ2knLCAndicsICc4JywgJ2QnLCAnaScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywgJ2QnLCAnaScsICd2JywgJzEnLCAnNicsICdzJywgJ2YnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywKKyAgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICczJywgJ2QnLCAnaScsICd2JywgJzInLCAnZCcsICdmJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywKKyAgJ3QnLCAnaCcsICdlJywgJ3InLCAnMycsICdkJywgJ2knLCAndicsICcyJywgJ2QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsICd0JywKKyAgJ2gnLCAnZScsICdyJywgJzMnLCAnZCcsICdpJywgJ3YnLCAnNCcsICdkJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywKKyAgJ2UnLCAncicsICczJywgJ2QnLCAnaScsICd2JywgJzQnLCAnZCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywKKyAgJ3InLCAnMycsICdkJywgJ2knLCAndicsICc0JywgJ3MnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywKKyAgJzMnLCAnZCcsICdpJywgJ3YnLCAnNCcsICdzJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICczJywKKyAgJ2QnLCAnaScsICd2JywgJzgnLCAncycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAnMycsICdkJywKKyAgJ2knLCAndicsICc4JywgJ3MnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywgJzMnLCAncycsICdpJywKKyAgJ3YnLCAnMicsICdkJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICczJywgJ3MnLCAnaScsICd2JywKKyAgJzInLCAnZCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAnMycsICdzJywgJ2knLCAndicsICc0JywKKyAgJ2QnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywgJzMnLCAncycsICdpJywgJ3YnLCAnNCcsICdkJywKKyAgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdnJywgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICczJywgJ3MnLCAnaScsICd2JywgJzQnLCAncycsICdmJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAnMycsICdzJywgJ2knLCAndicsICc0JywgJ3MnLCAnaScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2cnLCAnYScsICd0JywgJ2gnLCAnZScsICdyJywgJzMnLCAncycsICdpJywgJ3YnLCAnOCcsICdzJywgJ2YnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywKKyAgJ2EnLCAndCcsICdoJywgJ2UnLCAncicsICczJywgJ3MnLCAnaScsICd2JywgJzgnLCAncycsICdpJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywKKyAgJ3QnLCAnaCcsICdlJywgJ3InLCAncCcsICdmJywgJ2QnLCAncCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywKKyAgJ3InLCAncCcsICdmJywgJ2QnLCAncCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAncCcsICdmJywKKyAgJ3EnLCAncCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdhJywgJ3QnLCAnaCcsICdlJywgJ3InLCAncCcsICdmJywgJ3EnLCAncCcsICdzJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnYScsICdkJywgJ2QnLCAncCcsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2EnLCAnZCcsICdkJywgJ3AnLCAncycsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdhJywKKyAgJ2QnLCAnZCcsICdzJywgJ2QnLCAnXycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnYScsICdkJywgJ2QnLCAncycsICdzJywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ2MnLCAnbScsICdwJywgJ3MnLCAnZCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywKKyAgJ20nLCAncCcsICdzJywgJ3MnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywKKyAgJ2UnLCAncycsICdzJywgJ3EnLCAnaScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywKKyAgJ28nLCAnbScsICdwJywgJ3InLCAnZScsICdzJywgJ3MnLCAncScsICdpJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsICdxJywgJ2knLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywKKyAgJ3MnLCAnaScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ28nLCAnbScsICdwJywKKyAgJ3InLCAnZScsICdzJywgJ3MnLCAncycsICdpJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsICdzJywgJ2knLCAnNScsICcxJywgJzInLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywgJ2QnLCAnZicsICcxJywKKyAgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ28nLCAnbScsICdwJywgJ3InLCAnZScsICdzJywKKyAgJ3MnLCAnZCcsICdmJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywKKyAgJ3AnLCAncicsICdlJywgJ3MnLCAncycsICdkJywgJ2YnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywgJ3MnLCAnZicsICcxJywgJzInLCAnOCcsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ28nLCAnbScsICdwJywgJ3InLCAnZScsICdzJywgJ3MnLCAncycsICdmJywKKyAgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsICdlJywKKyAgJ3MnLCAncycsICdzJywgJ2YnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywKKyAgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywgJ2QnLCAnaScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdjJywgJ28nLCAnbScsICdwJywgJ3InLCAnZScsICdzJywgJ3MnLCAnZCcsICdpJywgJzInLCAnNScsICc2JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsICdkJywKKyAgJ2knLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywKKyAgJ2UnLCAncycsICdzJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICdxJywgJ2knLCAnMScsICcyJywgJzgnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywgJ3MnLCAndCcsICdvJywKKyAgJ3InLCAnZScsICdxJywgJ2knLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywKKyAgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICdxJywgJ2knLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywKKyAgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICdzJywgJ2knLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICdzJywKKyAgJ2knLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywKKyAgJ2UnLCAncycsICdzJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICdzJywgJ2knLCAnNScsICcxJywgJzInLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywgJ3MnLCAndCcsICdvJywKKyAgJ3InLCAnZScsICdkJywgJ2YnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywKKyAgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICdkJywgJ2YnLCAnMicsICc1JywKKyAgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywKKyAgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICdkJywgJ2YnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICdzJywKKyAgJ2YnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywKKyAgJ2UnLCAncycsICdzJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICdzJywgJ2YnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywgJ3MnLCAndCcsICdvJywKKyAgJ3InLCAnZScsICdzJywgJ2YnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywKKyAgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICdkJywgJ2knLCAnMScsICcyJywKKyAgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywKKyAgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICdkJywgJ2knLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICdkJywKKyAgJ2knLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywKKyAgJ2UnLCAncycsICdzJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICdoJywgJ2knLCAnMScsICcyJywgJzgnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywgJ3MnLCAndCcsICdvJywKKyAgJ3InLCAnZScsICdoJywgJ2knLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywKKyAgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywgJ3MnLCAndCcsICdvJywgJ3InLCAnZScsICdoJywgJ2knLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAncCcsICdyJywgJ2UnLCAncycsICdzJywKKyAgJ2gnLCAnaScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ28nLCAnbScsICdwJywKKyAgJ3InLCAnZScsICdzJywgJ3MnLCAnaCcsICdpJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2MnLCAnbycsICdtJywgJ3AnLCAncicsICdlJywgJ3MnLCAncycsICdoJywgJ2knLCAnNScsICcxJywgJzInLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2MnLCAnbycsICduJywgJ2YnLCAnbCcsICdpJywgJ2MnLCAndCcsICdzJywKKyAgJ2knLCAnXycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnYycsICdvJywKKyAgJ24nLCAnZicsICdsJywgJ2knLCAnYycsICd0JywgJ3MnLCAnaScsICdfJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdjJywgJ28nLCAnbicsICdmJywgJ2wnLCAnaScsICdjJywgJ3QnLCAncycsICdpJywKKyAgJ18nLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2MnLCAnbycsICduJywKKyAgJ2YnLCAnbCcsICdpJywgJ2MnLCAndCcsICdkJywgJ2knLCAnXycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd2JywgJ3AnLCAnYycsICdvJywgJ24nLCAnZicsICdsJywgJ2knLCAnYycsICd0JywgJ2QnLCAnaScsICdfJywKKyAgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdjJywgJ28nLCAnbicsICdmJywKKyAgJ2wnLCAnaScsICdjJywgJ3QnLCAnZCcsICdpJywgJ18nLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnYycsICd2JywgJ3QnLCAnZCcsICdxJywgJzInLCAncCcsICdzJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3AnLCAnZCcsICcyJywgJ2QnLCAncScsICcxJywgJzInLCAnOCcsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdwJywgJ2QnLCAnMicsICdkJywgJ3EnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdkJywgJzInLCAncCcsICdzJywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3AnLCAnZCcsICcyJywgJ3AnLCAncycsICc1JywKKyAgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdwJywgJ2QnLCAnMicsICdxJywKKyAgJ3EnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdkJywKKyAgJzInLCAncScsICdxJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywKKyAgJ3AnLCAnZCcsICcyJywgJ3EnLCAncScsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywKKyAgJ3YnLCAndCcsICdwJywgJ2QnLCAnMicsICd1JywgJ2QnLCAncScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdwJywgJ2QnLCAnMicsICd1JywgJ2QnLCAncScsICcyJywgJzUnLCAnNicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdwJywgJ2QnLCAnMicsICd1JywgJ2QnLCAncScsICc1JywKKyAgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdwJywgJ2QnLCAnMicsICd1JywKKyAgJ3EnLCAncScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdwJywKKyAgJ2QnLCAnMicsICd1JywgJ3EnLCAncScsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywKKyAgJ3YnLCAndCcsICdwJywgJ2QnLCAnMicsICd1JywgJ3EnLCAncScsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdwJywgJ3MnLCAnMicsICdkJywgJ3EnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdzJywgJzInLCAnZCcsICdxJywgJzInLCAnNScsICc2JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3AnLCAncycsICcyJywgJ2QnLCAncScsICc1JywKKyAgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdwJywgJ3MnLCAnMicsICdwJywKKyAgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdzJywKKyAgJzInLCAncScsICdxJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywKKyAgJ3AnLCAncycsICcyJywgJ3EnLCAncScsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywKKyAgJ3YnLCAndCcsICdwJywgJ3MnLCAnMicsICdxJywgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdzJywgJzInLCAndScsICdkJywgJ3EnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdzJywgJzInLCAndScsICdkJywgJ3EnLCAnMicsICc1JywKKyAgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdzJywgJzInLCAndScsICdkJywKKyAgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdzJywKKyAgJzInLCAndScsICdxJywgJ3EnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywKKyAgJ3QnLCAncCcsICdzJywgJzInLCAndScsICdxJywgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdzJywgJzInLCAndScsICdxJywgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncScsICdxJywgJzInLCAncCcsICdkJywgJzEnLCAnMicsICc4JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3EnLCAncScsICcyJywgJ3AnLCAnZCcsICcyJywKKyAgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdxJywgJ3EnLCAnMicsICdwJywKKyAgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncScsICdxJywKKyAgJzInLCAncCcsICdzJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywKKyAgJ3EnLCAncScsICcyJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywKKyAgJ3YnLCAndCcsICdxJywgJ3EnLCAnMicsICdwJywgJ3MnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnYycsICd2JywgJ3QnLCAncycsICdkJywgJzInLCAncycsICdzJywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsICdkJywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3MnLCAncycsICcyJywgJ3MnLCAnZCcsICdfJywKKyAgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd0JywKKyAgJ3AnLCAnZCcsICcyJywgJ2QnLCAncScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywKKyAgJ3YnLCAndCcsICd0JywgJ3AnLCAnZCcsICcyJywgJ2QnLCAncScsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd0JywgJ3AnLCAnZCcsICcyJywgJ3EnLCAncScsICcxJywgJzInLCAnOCcsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd0JywgJ3AnLCAnZCcsICcyJywgJ3EnLCAncScsICcyJywKKyAgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd0JywgJ3AnLCAnZCcsICcyJywKKyAgJ3EnLCAncScsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd0JywKKyAgJ3AnLCAnZCcsICcyJywgJ3UnLCAnZCcsICdxJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2MnLCAndicsICd0JywgJ3QnLCAncCcsICdkJywgJzInLCAndScsICdkJywgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndCcsICdwJywgJ2QnLCAnMicsICd1JywgJ2QnLCAncScsICc1JywKKyAgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd0JywgJ3AnLCAnZCcsICcyJywKKyAgJ3UnLCAncScsICdxJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywKKyAgJ3QnLCAncCcsICdkJywgJzInLCAndScsICdxJywgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnYycsICd2JywgJ3QnLCAndCcsICdwJywgJ2QnLCAnMicsICd1JywgJ3EnLCAncScsICc1JywgJzEnLCAnMicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd0JywgJ3AnLCAncycsICcyJywgJ2QnLCAncScsICc1JywKKyAgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd0JywgJ3AnLCAncycsICcyJywKKyAgJ3EnLCAncScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd0JywKKyAgJ3AnLCAncycsICcyJywgJ3EnLCAncScsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywKKyAgJ3YnLCAndCcsICd0JywgJ3AnLCAncycsICcyJywgJ3EnLCAncScsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd0JywgJ3AnLCAncycsICcyJywgJ3UnLCAnZCcsICdxJywgJzEnLCAnMicsICc4JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3QnLCAncCcsICdzJywgJzInLCAndScsICdkJywKKyAgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndCcsICdwJywKKyAgJ3MnLCAnMicsICd1JywgJ2QnLCAncScsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywKKyAgJ3YnLCAndCcsICd0JywgJ3AnLCAncycsICcyJywgJ3UnLCAncScsICdxJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3QnLCAncCcsICdzJywgJzInLCAndScsICdxJywgJ3EnLCAnMicsICc1JywKKyAgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndCcsICdwJywgJ3MnLCAnMicsICd1JywKKyAgJ3EnLCAncScsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd1JywKKyAgJ2QnLCAncScsICcyJywgJ3AnLCAncycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywKKyAgJ3YnLCAndCcsICd1JywgJ2QnLCAncScsICcyJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd1JywgJ2QnLCAncScsICcyJywgJ3AnLCAncycsICc1JywgJzEnLCAnMicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd1JywgJ3EnLCAncScsICcyJywgJ3AnLCAnZCcsICcxJywKKyAgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd1JywgJ3EnLCAncScsICcyJywKKyAgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd1JywKKyAgJ3EnLCAncScsICcyJywgJ3AnLCAnZCcsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywKKyAgJ3YnLCAndCcsICd1JywgJ3EnLCAncScsICcyJywgJ3AnLCAncycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd1JywgJ3EnLCAncScsICcyJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd1JywgJ3EnLCAncScsICcyJywgJ3AnLCAncycsICc1JywKKyAgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdkJywgJ2InLCAncCcsICdzJywgJ2EnLCAnZCcsICdiJywKKyAgJ3cnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZCcsICdiJywgJ3AnLCAncycsICdhJywKKyAgJ2QnLCAnYicsICd3JywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2QnLCAnYicsICdwJywKKyAgJ3MnLCAnYScsICdkJywgJ2InLCAndycsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdkJywKKyAgJ2knLCAndicsICdwJywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZCcsICdpJywKKyAgJ3YnLCAncCcsICdzJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2QnLCAnaScsICd2JywKKyAgJ3MnLCAnZCcsICdfJywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdkJywKKyAgJ2knLCAndicsICdzJywgJ3MnLCAnXycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywgJ2QnLCAncScsICdpJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywgJ3EnLCAnaScsICcyJywgJzUnLCAnNicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdlJywgJ3gnLCAncCcsICdhJywgJ24nLCAnZCcsICdxJywgJ2knLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywgJ2QnLCAncycsICdpJywKKyAgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywKKyAgJ3MnLCAnaScsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdlJywgJ3gnLCAncCcsICdhJywKKyAgJ24nLCAnZCcsICdzJywgJ2knLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywKKyAgJ3AnLCAnYScsICduJywgJ2QnLCAnbCcsICdvJywgJ2EnLCAnZCcsICdxJywgJ2knLCAnMScsICcyJywgJzgnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywgJ2QnLCAnbCcsICdvJywgJ2EnLCAnZCcsICdxJywKKyAgJ2knLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywKKyAgJ2QnLCAnbCcsICdvJywgJ2EnLCAnZCcsICdxJywgJ2knLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywgJ2QnLCAnbCcsICdvJywgJ2EnLCAnZCcsICdzJywgJ2knLCAnMScsICcyJywKKyAgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywgJ2QnLCAnbCcsICdvJywKKyAgJ2EnLCAnZCcsICdzJywgJ2knLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywKKyAgJ3AnLCAnYScsICduJywgJ2QnLCAnbCcsICdvJywgJ2EnLCAnZCcsICdzJywgJ2knLCAnNScsICcxJywgJzInLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywgJ2QnLCAnbCcsICdvJywgJ2EnLCAnZCcsICdkJywKKyAgJ2YnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywKKyAgJ2QnLCAnbCcsICdvJywgJ2EnLCAnZCcsICdkJywgJ2YnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywgJ2QnLCAnbCcsICdvJywgJ2EnLCAnZCcsICdkJywgJ2YnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywgJ2QnLCAnbCcsICdvJywKKyAgJ2EnLCAnZCcsICdzJywgJ2YnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywKKyAgJ3AnLCAnYScsICduJywgJ2QnLCAnbCcsICdvJywgJ2EnLCAnZCcsICdzJywgJ2YnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywgJ2QnLCAnbCcsICdvJywgJ2EnLCAnZCcsICdzJywKKyAgJ2YnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywKKyAgJ2QnLCAnbCcsICdvJywgJ2EnLCAnZCcsICdkJywgJ2knLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywgJ2QnLCAnbCcsICdvJywgJ2EnLCAnZCcsICdkJywgJ2knLCAnMicsICc1JywKKyAgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywgJ2QnLCAnbCcsICdvJywKKyAgJ2EnLCAnZCcsICdkJywgJ2knLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywKKyAgJ3AnLCAnYScsICduJywgJ2QnLCAnbCcsICdvJywgJ2EnLCAnZCcsICdoJywgJ2knLCAnMScsICcyJywgJzgnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywgJ2QnLCAnbCcsICdvJywgJ2EnLCAnZCcsICdoJywKKyAgJ2knLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywKKyAgJ2QnLCAnbCcsICdvJywgJ2EnLCAnZCcsICdoJywgJ2knLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywgJ2QnLCAnZCcsICdmJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywgJ2QnLCAnZicsICcyJywgJzUnLCAnNicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdlJywgJ3gnLCAncCcsICdhJywgJ24nLCAnZCcsICdkJywgJ2YnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywgJ2QnLCAncycsICdmJywKKyAgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywKKyAgJ3MnLCAnZicsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdlJywgJ3gnLCAncCcsICdhJywKKyAgJ24nLCAnZCcsICdzJywgJ2YnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywKKyAgJ3AnLCAnYScsICduJywgJ2QnLCAnZCcsICdpJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywgJ2QnLCAnaScsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdlJywgJ3gnLCAncCcsICdhJywgJ24nLCAnZCcsICdkJywgJ2knLCAnNScsICcxJywgJzInLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnZScsICd4JywgJ3AnLCAnYScsICduJywgJ2QnLCAnaCcsICdpJywgJzEnLCAnMicsICc4JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2UnLCAneCcsICdwJywgJ2EnLCAnbicsICdkJywgJ2gnLCAnaScsICcyJywKKyAgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdlJywgJ3gnLCAncCcsICdhJywgJ24nLCAnZCcsICdoJywKKyAgJ2knLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZicsICdpJywgJ3gnLCAndScsICdwJywKKyAgJ2knLCAnbScsICdtJywgJ3AnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdmJywKKyAgJ2knLCAneCcsICd1JywgJ3AnLCAnaScsICdtJywgJ20nLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ2YnLCAnaScsICd4JywgJ3UnLCAncCcsICdpJywgJ20nLCAnbScsICdwJywgJ2QnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZicsICdpJywgJ3gnLCAndScsICdwJywgJ2knLCAnbScsICdtJywKKyAgJ3AnLCAncycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdmJywgJ2knLCAneCcsICd1JywKKyAgJ3AnLCAnaScsICdtJywgJ20nLCAncCcsICdzJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2YnLCAnaScsICd4JywgJ3UnLCAncCcsICdpJywgJ20nLCAnbScsICdwJywgJ3MnLCAnNScsICcxJywgJzInLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnZicsICdpJywgJ3gnLCAndScsICdwJywgJ2knLCAnbScsICdtJywgJ3MnLCAnZCcsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdmJywgJ2knLCAneCcsICd1JywgJ3AnLCAnaScsICdtJywgJ20nLCAncycsICdzJywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2YnLCAncCcsICdjJywgJ2wnLCAnYScsICdzJywgJ3MnLCAncCcsICdkJywKKyAgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2YnLCAncCcsICdjJywgJ2wnLCAnYScsICdzJywKKyAgJ3MnLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2YnLCAncCcsICdjJywKKyAgJ2wnLCAnYScsICdzJywgJ3MnLCAncCcsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2YnLCAncCcsICdjJywgJ2wnLCAnYScsICdzJywgJ3MnLCAncCcsICdzJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ2YnLCAncCcsICdjJywgJ2wnLCAnYScsICdzJywgJ3MnLCAncCcsICdzJywgJzInLCAnNScsICc2JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2YnLCAncCcsICdjJywgJ2wnLCAnYScsICdzJywgJ3MnLCAncCcsICdzJywKKyAgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2YnLCAncCcsICdjJywgJ2wnLCAnYScsICdzJywKKyAgJ3MnLCAncycsICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2YnLCAncCcsICdjJywgJ2wnLCAnYScsICdzJywKKyAgJ3MnLCAncycsICdzJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnZScsICd0JywgJ2UnLCAneCcsICdwJywKKyAgJ3AnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywgJ2UnLCAndCcsICdlJywKKyAgJ3gnLCAncCcsICdwJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdlJywKKyAgJ3QnLCAnZScsICd4JywgJ3AnLCAncCcsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2cnLCAnZScsICd0JywgJ2UnLCAneCcsICdwJywgJ3AnLCAncycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdnJywgJ2UnLCAndCcsICdlJywgJ3gnLCAncCcsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdlJywgJ3QnLCAnZScsICd4JywgJ3AnLCAncCcsICdzJywgJzUnLCAnMScsICcyJywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2cnLCAnZScsICd0JywgJ2UnLCAneCcsICdwJywgJ3MnLCAnZCcsICcxJywKKyAgJzInLCAnOCcsICdfJywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdnJywKKyAgJ2UnLCAndCcsICdlJywgJ3gnLCAncCcsICdzJywgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsICdyJywgJ28nLCAndScsICduJywKKyAgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdlJywgJ3QnLCAnbScsICdhJywgJ24nLCAndCcsICdwJywKKyAgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdlJywgJ3QnLCAnbScsICdhJywKKyAgJ24nLCAndCcsICdwJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdlJywKKyAgJ3QnLCAnbScsICdhJywgJ24nLCAndCcsICdwJywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnZycsICdlJywgJ3QnLCAnbScsICdhJywgJ24nLCAndCcsICdwJywgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdlJywgJ3QnLCAnbScsICdhJywgJ24nLCAndCcsICdwJywgJ3MnLCAnMicsICc1JywKKyAgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdlJywgJ3QnLCAnbScsICdhJywgJ24nLCAndCcsICdwJywKKyAgJ3MnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZycsICdlJywgJ3QnLCAnbScsICdhJywKKyAgJ24nLCAndCcsICdzJywgJ2QnLCAnXycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnZycsICdlJywgJ3QnLCAnbScsICdhJywgJ24nLCAndCcsICdzJywgJ3MnLCAnXycsICdyJywgJ28nLCAndScsICduJywKKyAgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdhJywgJ3gnLCAncCcsICdkJywgJzUnLCAnMScsICcyJywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnYScsICd4JywgJ3AnLCAncycsICc1JywgJzEnLCAnMicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdtJywgJ2EnLCAneCcsICdzJywgJ2QnLCAnXycsICdyJywgJ28nLCAndScsICduJywKKyAgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdhJywgJ3gnLCAncycsICdzJywgJ18nLCAncicsICdvJywKKyAgJ3UnLCAnbicsICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnaScsICduJywgJ3AnLCAnZCcsICc1JywKKyAgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdtJywgJ2knLCAnbicsICdwJywgJ3MnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdpJywgJ24nLCAncycsICdkJywgJ18nLCAncicsICdvJywKKyAgJ3UnLCAnbicsICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnaScsICduJywgJ3MnLCAncycsICdfJywKKyAgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdtJywgJ3UnLCAnbCcsICdwJywKKyAgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICd1JywgJ2wnLCAncCcsICdzJywKKyAgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAndScsICdsJywgJ3MnLCAnZCcsICdfJywKKyAgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdtJywgJ3UnLCAnbCcsICdzJywKKyAgJ3MnLCAnXycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywKKyAgJ2QnLCAnZCcsICdzJywgJ2InLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywKKyAgJ2QnLCAnZCcsICdzJywgJ3cnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywKKyAgJ2QnLCAnZCcsICd1JywgJ3MnLCAnYicsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ2EnLCAnZCcsICdkJywgJ3UnLCAncycsICd3JywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAnZScsICdyJywgJ20nLCAndicsICdhJywgJ3InLCAnZCcsICdmJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAnZScsICdyJywgJ20nLCAndicsICdhJywgJ3InLCAnZCcsICdmJywgJzUnLCAnMScsICcyJywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnZScsICdyJywgJ20nLCAndicsICdhJywgJ3InLCAnZCcsICdpJywKKyAgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnZScsICdyJywgJ20nLCAndicsICdhJywKKyAgJ3InLCAnZCcsICdpJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnZScsICdyJywKKyAgJ20nLCAndicsICdhJywgJ3InLCAnaCcsICdpJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAnZScsICdyJywgJ20nLCAndicsICdhJywgJ3InLCAnaCcsICdpJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAnZScsICdyJywgJ20nLCAndicsICdhJywgJ3InLCAnaCcsICdpJywgJzUnLCAnMScsICcyJywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnZScsICdyJywgJ20nLCAndicsICdhJywgJ3InLCAncScsICdpJywKKyAgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnZScsICdyJywgJ20nLCAndicsICdhJywKKyAgJ3InLCAncScsICdpJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnZScsICdyJywKKyAgJ20nLCAndicsICdhJywgJ3InLCAncScsICdpJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAnZScsICdyJywgJ20nLCAndicsICdhJywgJ3InLCAncycsICdmJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAnZScsICdyJywgJ20nLCAndicsICdhJywgJ3InLCAncycsICdpJywgJzUnLCAnMScsICcyJywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdhJywgJ2QnLCAnZCcsICd1JywgJ2InLCAncycsICd3JywKKyAgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdhJywgJ2QnLCAnZCcsICd3JywKKyAgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdkJywKKyAgJ2InLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdkJywKKyAgJ2InLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdkJywKKyAgJ2InLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdkJywKKyAgJ2InLCAnMScsICcyJywgJzgnLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywKKyAgJ28nLCAndicsICdkJywgJ2InLCAnMicsICc1JywgJzYnLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdkJywgJ2InLCAnNScsICcxJywgJzInLCAnbScsICdlJywgJ20nLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdkJywgJ3cnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdkJywgJ3cnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdkJywgJ3cnLCAnNScsICcxJywgJzInLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdkJywgJ3cnLCAnMScsICcyJywgJzgnLCAnbScsICdlJywKKyAgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdkJywgJ3cnLCAnMicsICc1JywKKyAgJzYnLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdkJywKKyAgJ3cnLCAnNScsICcxJywgJzInLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywKKyAgJ28nLCAndicsICdxJywgJ2InLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywKKyAgJ28nLCAndicsICdxJywgJ2InLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywKKyAgJ28nLCAndicsICdxJywgJ2InLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywKKyAgJ28nLCAndicsICdxJywgJ2InLCAnMScsICcyJywgJzgnLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdxJywgJ2InLCAnMicsICc1JywgJzYnLCAnbScsICdlJywgJ20nLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdxJywgJ2InLCAnNScsICcxJywgJzInLCAnbScsICdlJywKKyAgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdxJywgJ2QnLCAnMScsICcyJywKKyAgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdxJywgJ2QnLCAnMicsICc1JywKKyAgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdxJywgJ2QnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdxJywgJ2QnLCAnMScsICcyJywKKyAgJzgnLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdxJywKKyAgJ2QnLCAnMicsICc1JywgJzYnLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywKKyAgJ28nLCAndicsICdxJywgJ2QnLCAnNScsICcxJywgJzInLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdxJywgJ3cnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdxJywgJ3cnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdxJywgJ3cnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdxJywgJ3cnLCAnMScsICcyJywgJzgnLCAnbScsICdlJywgJ20nLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdxJywgJ3cnLCAnMicsICc1JywgJzYnLCAnbScsICdlJywKKyAgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdxJywgJ3cnLCAnNScsICcxJywKKyAgJzInLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd3JywKKyAgJ2InLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd3JywKKyAgJ2InLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd3JywKKyAgJ2InLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd3JywKKyAgJ2InLCAnMScsICcyJywgJzgnLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywKKyAgJ28nLCAndicsICd3JywgJ2InLCAnMicsICc1JywgJzYnLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd3JywgJ2InLCAnNScsICcxJywgJzInLCAnbScsICdlJywgJ20nLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdzJywgJ2QnLCAnYicsICcxJywgJzInLCAnOCcsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3MnLCAnZCcsICdiJywgJzInLCAnNScsICc2JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICdkJywgJ2InLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdzJywgJ2QnLCAnYicsICcxJywKKyAgJzInLCAnOCcsICdtJywgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywKKyAgJ3MnLCAnZCcsICdiJywgJzInLCAnNScsICc2JywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICdkJywgJ2InLCAnNScsICcxJywgJzInLCAnbScsICdlJywgJ20nLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdzJywgJ2QnLCAndycsICcxJywgJzInLCAnOCcsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3MnLCAnZCcsICd3JywgJzInLCAnNScsICc2JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICdkJywgJ3cnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdzJywgJ2QnLCAndycsICcxJywKKyAgJzInLCAnOCcsICdtJywgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywKKyAgJ3MnLCAnZCcsICd3JywgJzInLCAnNScsICc2JywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICdkJywgJ3cnLCAnNScsICcxJywgJzInLCAnbScsICdlJywgJ20nLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdzJywgJ3EnLCAnYicsICcxJywgJzInLCAnOCcsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3MnLCAncScsICdiJywgJzInLCAnNScsICc2JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICdxJywgJ2InLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdzJywgJ3EnLCAnYicsICcxJywKKyAgJzInLCAnOCcsICdtJywgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywKKyAgJ3MnLCAncScsICdiJywgJzInLCAnNScsICc2JywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICdxJywgJ2InLCAnNScsICcxJywgJzInLCAnbScsICdlJywgJ20nLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdzJywgJ3EnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3MnLCAncScsICdkJywgJzInLCAnNScsICc2JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICdxJywgJ2QnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdzJywgJ3EnLCAnZCcsICcxJywKKyAgJzInLCAnOCcsICdtJywgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywKKyAgJ3MnLCAncScsICdkJywgJzInLCAnNScsICc2JywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICdxJywgJ2QnLCAnNScsICcxJywgJzInLCAnbScsICdlJywgJ20nLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdzJywgJ3EnLCAndycsICcxJywgJzInLCAnOCcsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3MnLCAncScsICd3JywgJzInLCAnNScsICc2JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICdxJywgJ3cnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdzJywgJ3EnLCAndycsICcxJywKKyAgJzInLCAnOCcsICdtJywgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywKKyAgJ3MnLCAncScsICd3JywgJzInLCAnNScsICc2JywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICdxJywgJ3cnLCAnNScsICcxJywgJzInLCAnbScsICdlJywgJ20nLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdzJywgJ3cnLCAnYicsICcxJywgJzInLCAnOCcsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3MnLCAndycsICdiJywgJzInLCAnNScsICc2JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICd3JywgJ2InLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICdzJywgJ3cnLCAnYicsICcxJywKKyAgJzInLCAnOCcsICdtJywgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywKKyAgJ3MnLCAndycsICdiJywgJzInLCAnNScsICc2JywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAnbScsICdvJywgJ3YnLCAncycsICd3JywgJ2InLCAnNScsICcxJywgJzInLCAnbScsICdlJywgJ20nLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd1JywgJ3MnLCAnZCcsICdiJywgJzEnLCAnMicsICc4JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndScsICdzJywgJ2QnLCAnYicsICcyJywKKyAgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3UnLCAncycsICdkJywKKyAgJ2InLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd1JywKKyAgJ3MnLCAnZCcsICdiJywgJzEnLCAnMicsICc4JywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAnbScsICdvJywgJ3YnLCAndScsICdzJywgJ2QnLCAnYicsICcyJywgJzUnLCAnNicsICdtJywgJ2UnLCAnbScsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3UnLCAncycsICdkJywgJ2InLCAnNScsICcxJywKKyAgJzInLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd1JywKKyAgJ3MnLCAnZCcsICd3JywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywKKyAgJ3YnLCAndScsICdzJywgJ2QnLCAndycsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ20nLCAnbycsICd2JywgJ3UnLCAncycsICdkJywgJ3cnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd1JywgJ3MnLCAnZCcsICd3JywgJzEnLCAnMicsICc4JywgJ20nLCAnZScsICdtJywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndScsICdzJywgJ2QnLCAndycsICcyJywKKyAgJzUnLCAnNicsICdtJywgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywKKyAgJ3UnLCAncycsICdkJywgJ3cnLCAnNScsICcxJywgJzInLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd1JywgJ3MnLCAncScsICdiJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndScsICdzJywgJ3EnLCAnYicsICcyJywgJzUnLCAnNicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3UnLCAncycsICdxJywgJ2InLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd1JywgJ3MnLCAncScsICdiJywKKyAgJzEnLCAnMicsICc4JywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywKKyAgJ3YnLCAndScsICdzJywgJ3EnLCAnYicsICcyJywgJzUnLCAnNicsICdtJywgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3UnLCAncycsICdxJywgJ2InLCAnNScsICcxJywgJzInLCAnbScsICdlJywKKyAgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd1JywgJ3MnLCAncScsICdkJywKKyAgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndScsICdzJywKKyAgJ3EnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywKKyAgJ3UnLCAncycsICdxJywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywKKyAgJ28nLCAndicsICd1JywgJ3MnLCAncScsICdkJywgJzEnLCAnMicsICc4JywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndScsICdzJywgJ3EnLCAnZCcsICcyJywgJzUnLCAnNicsICdtJywKKyAgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3UnLCAncycsICdxJywKKyAgJ2QnLCAnNScsICcxJywgJzInLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywKKyAgJ28nLCAndicsICd1JywgJ3MnLCAncScsICd3JywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAnbScsICdvJywgJ3YnLCAndScsICdzJywgJ3EnLCAndycsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3UnLCAncycsICdxJywgJ3cnLCAnNScsICcxJywgJzInLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd1JywgJ3MnLCAncScsICd3JywgJzEnLCAnMicsICc4JywKKyAgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndScsICdzJywKKyAgJ3EnLCAndycsICcyJywgJzUnLCAnNicsICdtJywgJ2UnLCAnbScsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ20nLCAnbycsICd2JywgJ3UnLCAncycsICdxJywgJ3cnLCAnNScsICcxJywgJzInLCAnbScsICdlJywgJ20nLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd1JywgJ3MnLCAndycsICdiJywgJzEnLCAnMicsICc4JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAndScsICdzJywgJ3cnLCAnYicsICcyJywKKyAgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3UnLCAncycsICd3JywKKyAgJ2InLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ28nLCAndicsICd1JywKKyAgJ3MnLCAndycsICdiJywgJzEnLCAnMicsICc4JywgJ20nLCAnZScsICdtJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAnbScsICdvJywgJ3YnLCAndScsICdzJywgJ3cnLCAnYicsICcyJywgJzUnLCAnNicsICdtJywgJ2UnLCAnbScsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ3UnLCAncycsICd3JywgJ2InLCAnNScsICcxJywKKyAgJzInLCAnbScsICdlJywgJ20nLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ20nLCAndScsICdsJywKKyAgJ3QnLCAnaScsICdzJywgJ2gnLCAnaScsICdmJywgJ3QnLCAncScsICdiJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdtJywgJ3UnLCAnbCcsICd0JywgJ2knLCAncycsICdoJywgJ2knLCAnZicsICd0JywKKyAgJ3EnLCAnYicsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnbScsICd1JywKKyAgJ2wnLCAndCcsICdpJywgJ3MnLCAnaCcsICdpJywgJ2YnLCAndCcsICdxJywgJ2InLCAnNScsICcxJywgJzInLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdyJywgJ28nLCAnbCcsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAncicsICdvJywgJ2wnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ3InLCAnbycsICdsJywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICdyJywgJ28nLCAnbCcsICdxJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAncicsICdvJywgJ2wnLCAncScsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ3InLCAnbycsICdsJywgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdyJywKKyAgJ28nLCAnbCcsICd2JywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdyJywKKyAgJ28nLCAnbCcsICd2JywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdyJywKKyAgJ28nLCAnbCcsICd2JywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdyJywKKyAgJ28nLCAnbCcsICd2JywgJ3EnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdyJywKKyAgJ28nLCAnbCcsICd2JywgJ3EnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdyJywKKyAgJ28nLCAnbCcsICd2JywgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdyJywKKyAgJ28nLCAncicsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncicsICdvJywKKyAgJ3InLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3InLCAnbycsICdyJywKKyAgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdyJywgJ28nLCAncicsICdxJywKKyAgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncicsICdvJywgJ3InLCAncScsICcyJywKKyAgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3InLCAnbycsICdyJywgJ3EnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdyJywgJ28nLCAncicsICd2JywgJ2QnLCAnMScsICcyJywKKyAgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdyJywgJ28nLCAncicsICd2JywgJ2QnLCAnMicsICc1JywKKyAgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdyJywgJ28nLCAncicsICd2JywgJ2QnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdyJywgJ28nLCAncicsICd2JywgJ3EnLCAnMScsICcyJywKKyAgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdyJywgJ28nLCAncicsICd2JywgJ3EnLCAnMicsICc1JywKKyAgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdyJywgJ28nLCAncicsICd2JywgJ3EnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3UnLCAnYicsICdzJywgJ2InLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3UnLCAnYicsICdzJywgJ3cnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3UnLCAnYicsICd1JywgJ3MnLCAnYicsICc1JywKKyAgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAndScsICdiJywgJ3UnLCAncycsICd3JywKKyAgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAndCcsICdlJywgJ3InLCAnbicsICdsJywKKyAgJ28nLCAnZycsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAndCcsICdlJywKKyAgJ3InLCAnbicsICdsJywgJ28nLCAnZycsICdkJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAndCcsICdlJywgJ3InLCAnbicsICdsJywgJ28nLCAnZycsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAndCcsICdlJywgJ3InLCAnbicsICdsJywgJ28nLCAnZycsICdxJywgJzEnLCAnMicsICc4JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAndCcsICdlJywgJ3InLCAnbicsICdsJywgJ28nLCAnZycsICdxJywKKyAgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAndCcsICdlJywgJ3InLCAnbicsICdsJywKKyAgJ28nLCAnZycsICdxJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnYScsICduJywKKyAgJ2cnLCAnZScsICdwJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdhJywKKyAgJ24nLCAnZycsICdlJywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywKKyAgJ2EnLCAnbicsICdnJywgJ2UnLCAncCcsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3InLCAnYScsICduJywgJ2cnLCAnZScsICdwJywgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncicsICdhJywgJ24nLCAnZycsICdlJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdyJywgJ2EnLCAnbicsICdnJywgJ2UnLCAncCcsICdzJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3InLCAnYScsICduJywgJ2cnLCAnZScsICdzJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsICdyJywKKyAgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdhJywgJ24nLCAnZycsICdlJywKKyAgJ3MnLCAncycsICcxJywgJzInLCAnOCcsICdfJywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdyJywgJ2UnLCAnZCcsICd1JywgJ2MnLCAnZScsICdwJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdlJywgJ2QnLCAndScsICdjJywgJ2UnLCAncCcsICdkJywgJzInLCAnNScsICc2JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnZScsICdkJywgJ3UnLCAnYycsICdlJywgJ3AnLCAnZCcsICc1JywKKyAgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ2UnLCAnZCcsICd1JywgJ2MnLCAnZScsICdwJywKKyAgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdlJywgJ2QnLCAndScsICdjJywKKyAgJ2UnLCAncCcsICdzJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnZScsICdkJywKKyAgJ3UnLCAnYycsICdlJywgJ3AnLCAncycsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywKKyAgJ2UnLCAnZCcsICd1JywgJ2MnLCAnZScsICdzJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdlJywKKyAgJ2QnLCAndScsICdjJywgJ2UnLCAncycsICdzJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnbicsICdkJywKKyAgJ3MnLCAnYycsICdhJywgJ2wnLCAnZScsICdwJywgJ2QnLCAnXycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdyJywgJ24nLCAnZCcsICdzJywgJ2MnLCAnYScsICdsJywgJ2UnLCAncCcsICdkJywgJ18nLCAnMicsICc1JywKKyAgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICduJywgJ2QnLCAncycsICdjJywgJ2EnLCAnbCcsICdlJywKKyAgJ3AnLCAnZCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ24nLCAnZCcsICdzJywgJ2MnLCAnYScsICdsJywKKyAgJ2UnLCAncCcsICdzJywgJ18nLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICduJywKKyAgJ2QnLCAncycsICdjJywgJ2EnLCAnbCcsICdlJywgJ3AnLCAncycsICdfJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3InLCAnbicsICdkJywgJ3MnLCAnYycsICdhJywgJ2wnLCAnZScsICdwJywgJ3MnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICduJywgJ2QnLCAncycsICdjJywgJ2EnLCAnbCcsICdlJywgJ3MnLCAnZCcsICdfJywKKyAgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ24nLCAnZCcsICdzJywKKyAgJ2MnLCAnYScsICdsJywgJ2UnLCAncycsICdzJywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3MnLCAnYycsICdhJywgJ2wnLCAnZScsICdmJywgJ3AnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2MnLCAnYScsICdsJywgJ2UnLCAnZicsICdwJywgJ2QnLCAnMicsICc1JywKKyAgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdjJywgJ2EnLCAnbCcsICdlJywgJ2YnLCAncCcsICdkJywKKyAgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnYycsICdhJywgJ2wnLCAnZScsICdmJywKKyAgJ3AnLCAncycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2MnLCAnYScsICdsJywKKyAgJ2UnLCAnZicsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdjJywKKyAgJ2EnLCAnbCcsICdlJywgJ2YnLCAncCcsICdzJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3MnLCAnYycsICdhJywgJ2wnLCAnZScsICdmJywgJ3MnLCAnZCcsICdfJywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2MnLCAnYScsICdsJywgJ2UnLCAnZicsICdzJywgJ3MnLCAnXycsICdyJywKKyAgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdxJywgJ3InLCAndCcsICdwJywKKyAgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdxJywgJ3InLCAndCcsICdwJywKKyAgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdxJywgJ3InLCAndCcsICdwJywKKyAgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdxJywgJ3InLCAndCcsICdwJywKKyAgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdxJywgJ3InLCAndCcsICdwJywKKyAgJ3MnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdxJywgJ3InLCAndCcsICdwJywKKyAgJ3MnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdxJywgJ3InLCAndCcsICdzJywKKyAgJ2QnLCAnXycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdxJywKKyAgJ3InLCAndCcsICdzJywgJ3MnLCAnXycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncycsICd0JywgJ28nLCAncicsICdlJywgJ3MnLCAncycsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywKKyAgJ3UnLCAnYicsICdwJywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICd1JywKKyAgJ2InLCAncCcsICdzJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAndScsICdiJywKKyAgJ3MnLCAnZCcsICdfJywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywKKyAgJ3UnLCAnYicsICdzJywgJ3MnLCAnXycsICdyJywgJ28nLCAndScsICduJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdjJywgJ3YnLCAndCcsICdwJywgJ2gnLCAnMicsICdwJywgJ3MnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdjJywgJ3YnLCAndCcsICdwJywgJ2gnLCAnMicsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdjJywgJ3YnLCAndCcsICdwJywgJ2gnLCAnMicsICdwJywgJ3MnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdjJywgJ3YnLCAndCcsICdwJywgJ3MnLCAnMicsICdwJywKKyAgJ2gnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdjJywgJ3YnLCAndCcsICdwJywgJ3MnLCAnMicsICdwJywKKyAgJ2gnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdjJywgJ3YnLCAndCcsICdwJywKKyAgJ3MnLCAnMicsICdwJywgJ2gnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywKKyAgJ20nLCAnYScsICdkJywgJ2QnLCAncCcsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdwJywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywgJ2QnLCAncCcsICdzJywgJzEnLCAnMicsICc4JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3AnLCAncycsICcyJywKKyAgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdwJywKKyAgJ3MnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywKKyAgJ2QnLCAncycsICdkJywgJzMnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywKKyAgJ2QnLCAncycsICdzJywgJzMnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywKKyAgJ2QnLCAncycsICd1JywgJ2InLCAncCcsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAndScsICdiJywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsICdwJywKKyAgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywKKyAgJ2QnLCAncycsICd1JywgJ2InLCAncCcsICdzJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAndScsICdiJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsICdwJywKKyAgJ3MnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ24nLCAnbScsICdhJywKKyAgJ2QnLCAnZCcsICdwJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywKKyAgJ24nLCAnbScsICdhJywgJ2QnLCAnZCcsICdwJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdmJywgJ24nLCAnbScsICdhJywgJ2QnLCAnZCcsICdwJywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ24nLCAnbScsICdhJywgJ2QnLCAnZCcsICdwJywgJ3MnLCAnMScsICcyJywKKyAgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ24nLCAnbScsICdhJywgJ2QnLCAnZCcsICdwJywKKyAgJ3MnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ24nLCAnbScsICdhJywKKyAgJ2QnLCAnZCcsICdwJywgJ3MnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywKKyAgJ24nLCAnbScsICdzJywgJ3UnLCAnYicsICdwJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdmJywgJ24nLCAnbScsICdzJywgJ3UnLCAnYicsICdwJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ24nLCAnbScsICdzJywgJ3UnLCAnYicsICdwJywgJ2QnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ24nLCAnbScsICdzJywgJ3UnLCAnYicsICdwJywKKyAgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ24nLCAnbScsICdzJywKKyAgJ3UnLCAnYicsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywKKyAgJ24nLCAnbScsICdzJywgJ3UnLCAnYicsICdwJywgJ3MnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdwJywgJ2QnLCAncCcsICdiJywgJ3UnLCAncycsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdkJywgJ3AnLCAnYicsICd1JywgJ3MnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZCcsICdwJywgJ2InLCAndScsICdzJywgJ2QnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2QnLCAncCcsICdiJywgJ3UnLCAncycsICdkJywKKyAgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2QnLCAncCcsICdiJywKKyAgJ3UnLCAncycsICdkJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywKKyAgJ2QnLCAncCcsICdiJywgJ3UnLCAncycsICdkJywgJ3MnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdwJywgJ2QnLCAncCcsICd3JywgJ3MnLCAncycsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdkJywgJ3AnLCAndycsICdzJywgJ3MnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZCcsICdwJywgJ3cnLCAncycsICdzJywgJ2QnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2QnLCAncCcsICd3JywgJ3MnLCAncycsICdkJywKKyAgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2QnLCAncCcsICd3JywKKyAgJ3MnLCAncycsICdkJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywKKyAgJ2QnLCAncCcsICd3JywgJ3MnLCAncycsICdkJywgJ3MnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ2knLCAnMicsICd2JywgJ2EnLCAncicsICdkJywgJzEnLCAnMicsICc4JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICdpJywgJzInLCAndicsICdhJywKKyAgJ3InLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywKKyAgJ20nLCAnaScsICcyJywgJ3YnLCAnYScsICdyJywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ2knLCAnMicsICd2JywgJ2EnLCAncicsICdoJywgJ2knLCAnMScsICcyJywKKyAgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ2knLCAnMicsICd2JywKKyAgJ2EnLCAncicsICdoJywgJ2knLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywKKyAgJ2UnLCAncicsICdtJywgJ2knLCAnMicsICd2JywgJ2EnLCAncicsICdoJywgJ2knLCAnNScsICcxJywgJzInLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ2knLCAnMicsICd2JywgJ2EnLCAncicsICdwJywKKyAgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywKKyAgJ2knLCAnMicsICd2JywgJ2EnLCAncicsICdwJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ2knLCAnMicsICd2JywgJ2EnLCAncicsICdwJywgJ2QnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ2knLCAnMicsICd2JywKKyAgJ2EnLCAncicsICdwJywgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywKKyAgJ2UnLCAncicsICdtJywgJ2knLCAnMicsICd2JywgJ2EnLCAncicsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ2knLCAnMicsICd2JywgJ2EnLCAncicsICdwJywKKyAgJ3MnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywKKyAgJ2knLCAnMicsICd2JywgJ2EnLCAncicsICdxJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICdpJywgJzInLCAndicsICdhJywgJ3InLCAncScsICcyJywgJzUnLCAnNicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAnaScsICcyJywgJ3YnLCAnYScsICdyJywKKyAgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywKKyAgJ2knLCAnMicsICd2JywgJ2EnLCAncicsICdxJywgJ2knLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ2knLCAnMicsICd2JywgJ2EnLCAncicsICdxJywgJ2knLCAnMicsICc1JywKKyAgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ2knLCAnMicsICd2JywKKyAgJ2EnLCAncicsICdxJywgJ2knLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywKKyAgJ2UnLCAncicsICdtJywgJ3QnLCAnMicsICd2JywgJ2EnLCAncicsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywgJ3InLCAnZCcsICcyJywKKyAgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAndCcsICcyJywKKyAgJ3YnLCAnYScsICdyJywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywKKyAgJ2UnLCAncicsICdtJywgJ3QnLCAnMicsICd2JywgJ2EnLCAncicsICdoJywgJ2knLCAnMScsICcyJywgJzgnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ3QnLCAnMicsICd2JywgJ2EnLCAncicsICdoJywKKyAgJ2knLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywKKyAgJ3QnLCAnMicsICd2JywgJ2EnLCAncicsICdoJywgJ2knLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ3QnLCAnMicsICd2JywgJ2EnLCAncicsICdwJywgJ2QnLCAnMScsICcyJywKKyAgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ3QnLCAnMicsICd2JywKKyAgJ2EnLCAncicsICdwJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywKKyAgJ2UnLCAncicsICdtJywgJ3QnLCAnMicsICd2JywgJ2EnLCAncicsICdwJywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ3QnLCAnMicsICd2JywgJ2EnLCAncicsICdwJywKKyAgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywKKyAgJ3QnLCAnMicsICd2JywgJ2EnLCAncicsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ3QnLCAnMicsICd2JywgJ2EnLCAncicsICdwJywgJ3MnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ3QnLCAnMicsICd2JywKKyAgJ2EnLCAncicsICdxJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywKKyAgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywgJ3InLCAncScsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAndCcsICcyJywgJ3YnLCAnYScsICdyJywgJ3EnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ3QnLCAnMicsICd2JywKKyAgJ2EnLCAncicsICdxJywgJ2knLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywKKyAgJ2UnLCAncicsICdtJywgJ3QnLCAnMicsICd2JywgJ2EnLCAncicsICdxJywgJ2knLCAnMicsICc1JywgJzYnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ3QnLCAnMicsICd2JywgJ2EnLCAncicsICdxJywKKyAgJ2knLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ20nLCAnYScsICdkJywKKyAgJ2QnLCAnNScsICcyJywgJ2gnLCAndScsICdxJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAncCcsICdtJywgJ2EnLCAnZCcsICdkJywgJzUnLCAnMicsICdoJywgJ3UnLCAncScsICcyJywgJzUnLCAnNicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnbScsICdhJywgJ2QnLCAnZCcsICc1JywgJzInLCAnaCcsICd1JywKKyAgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ20nLCAnYScsICdkJywKKyAgJ2QnLCAnNScsICcyJywgJ2wnLCAndScsICdxJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAncCcsICdtJywgJ2EnLCAnZCcsICdkJywgJzUnLCAnMicsICdsJywgJ3UnLCAncScsICcyJywgJzUnLCAnNicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnbScsICdhJywgJ2QnLCAnZCcsICc1JywgJzInLCAnbCcsICd1JywKKyAgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICdsJywKKyAgJ2QnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywKKyAgJ2wnLCAnZCcsICdkJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywKKyAgJ2gnLCAnbCcsICdkJywgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywKKyAgJ3MnLCAnaCcsICdsJywgJ2QnLCAncScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywKKyAgJ3AnLCAncycsICdoJywgJ2wnLCAnZCcsICdxJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAncCcsICdzJywgJ2gnLCAnbCcsICdkJywgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICdsJywgJ2QnLCAndycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ2wnLCAnZCcsICd3JywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAnbCcsICdkJywgJ3cnLCAnNScsICcxJywgJzInLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICdsJywgJ2QnLCAndicsICdkJywgJzEnLCAnMicsICc4JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAnbCcsICdkJywgJ3YnLCAnZCcsICcyJywKKyAgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ2wnLCAnZCcsICd2JywKKyAgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICdsJywKKyAgJ2QnLCAndicsICdxJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywKKyAgJ2gnLCAnbCcsICdkJywgJ3YnLCAncScsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywKKyAgJ3AnLCAncycsICdoJywgJ2wnLCAnZCcsICd2JywgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICdsJywgJ2QnLCAndicsICd3JywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAnbCcsICdkJywgJ3YnLCAndycsICcyJywgJzUnLCAnNicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ2wnLCAnZCcsICd2JywgJ3cnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICdyJywgJ2QnLCAnZCcsICcxJywKKyAgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ3InLCAnZCcsICdkJywKKyAgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAncicsICdkJywKKyAgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICdyJywKKyAgJ2QnLCAncScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywKKyAgJ3InLCAnZCcsICdxJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywKKyAgJ2gnLCAncicsICdkJywgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywKKyAgJ3MnLCAnaCcsICdyJywgJ2QnLCAndycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywKKyAgJ3AnLCAncycsICdoJywgJ3InLCAnZCcsICd3JywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAncCcsICdzJywgJ2gnLCAncicsICdkJywgJ3cnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICdyJywgJ2QnLCAndicsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAncicsICdkJywgJ3YnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ3InLCAnZCcsICd2JywgJ2QnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICdyJywgJ2QnLCAndicsICdxJywKKyAgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAncicsICdkJywKKyAgJ3YnLCAncScsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywKKyAgJ3InLCAnZCcsICd2JywgJ3EnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywKKyAgJ3MnLCAnaCcsICdyJywgJ2QnLCAndicsICd3JywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAncCcsICdzJywgJ2gnLCAncicsICdkJywgJ3YnLCAndycsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ3InLCAnZCcsICd2JywgJ3cnLCAnNScsICcxJywgJzInLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICd1JywgJ2YnLCAnYicsICdpJywgJ3QnLCAncScsICdtJywKKyAgJ2InLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICd1JywKKyAgJ2YnLCAnYicsICdpJywgJ3QnLCAncScsICdtJywgJ2InLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICd1JywgJ2YnLCAnYicsICdpJywgJ3QnLCAncScsICdtJywgJ2InLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywgJ2QnLCAncCcsICdkJywKKyAgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICczJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywKKyAgJ2QnLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICczJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywKKyAgJ20nLCAnYScsICdkJywgJ2QnLCAncCcsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICczJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywgJ2QnLCAncCcsICdzJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICczJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywgJ2QnLCAncCcsICdzJywgJzInLCAnNScsICc2JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICczJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywgJ2QnLCAncCcsICdzJywKKyAgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICczJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywKKyAgJ2QnLCAncycsICdkJywgJzMnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywKKyAgJ2QnLCAnZCcsICdzJywgJ3MnLCAnMycsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywKKyAgJ2EnLCAnZCcsICdkJywgJ3MnLCAndScsICdiJywgJ3AnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAndScsICdiJywgJ3AnLCAnZCcsICcyJywKKyAgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywKKyAgJ3MnLCAndScsICdiJywgJ3AnLCAnZCcsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnMycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAndScsICdiJywgJ3AnLCAncycsICcxJywgJzInLCAnOCcsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAndScsICdiJywKKyAgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywKKyAgJ2EnLCAnZCcsICdkJywgJ3MnLCAndScsICdiJywgJ3AnLCAncycsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ3MnLCAndScsICdiJywgJ3AnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ3MnLCAndScsICdiJywgJ3AnLCAnZCcsICcyJywKKyAgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ3MnLCAndScsICdiJywKKyAgJ3AnLCAnZCcsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywKKyAgJ3MnLCAndScsICdiJywgJ3AnLCAncycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnMycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAnZicsICdtJywgJ3MnLCAndScsICdiJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ3MnLCAndScsICdiJywgJ3AnLCAncycsICc1JywgJzEnLCAnMicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ3MnLCAndScsICdiJywgJ3MnLCAnZCcsICczJywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICczJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAncycsICd1JywgJ2InLCAncycsICdzJywKKyAgJzMnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdzJywgJ3UnLCAnYicsICdhJywKKyAgJ2QnLCAnZCcsICdwJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywKKyAgJ2YnLCAnbScsICdzJywgJ3UnLCAnYicsICdhJywgJ2QnLCAnZCcsICdwJywgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdzJywgJ3UnLCAnYicsICdhJywgJ2QnLCAnZCcsICdwJywKKyAgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdzJywKKyAgJ3UnLCAnYicsICdhJywgJ2QnLCAnZCcsICdwJywgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdzJywgJ3UnLCAnYicsICdhJywgJ2QnLCAnZCcsICdwJywgJ3MnLCAnMicsICc1JywKKyAgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdzJywgJ3UnLCAnYicsICdhJywKKyAgJ2QnLCAnZCcsICdwJywgJ3MnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywKKyAgJ2YnLCAnbicsICdtJywgJ3MnLCAndScsICdiJywgJ3AnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICduJywgJ20nLCAncycsICd1JywgJ2InLCAncCcsICdkJywgJzInLCAnNScsICc2JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICczJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ24nLCAnbScsICdzJywgJ3UnLCAnYicsICdwJywKKyAgJ2QnLCAnNScsICcxJywgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbicsICdtJywKKyAgJ3MnLCAndScsICdiJywgJ3AnLCAncycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnMycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAnZicsICduJywgJ20nLCAncycsICd1JywgJ2InLCAncCcsICdzJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICczJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ24nLCAnbScsICdzJywgJ3UnLCAnYicsICdwJywgJ3MnLCAnNScsICcxJywKKyAgJzInLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbicsICdtJywgJ3MnLCAndScsICdiJywKKyAgJ3MnLCAnZCcsICczJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICczJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ24nLCAnbScsICdzJywKKyAgJ3UnLCAnYicsICdzJywgJ3MnLCAnMycsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnMycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2YnLCAnaScsICd4JywKKyAgJ3UnLCAncCcsICdpJywgJ20nLCAnbScsICdwJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdmJywgJ2knLCAneCcsICd1JywgJ3AnLCAnaScsICdtJywgJ20nLCAncCcsICdkJywgJzInLCAnNScsICc2JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZicsICdpJywgJ3gnLCAndScsICdwJywgJ2knLCAnbScsICdtJywKKyAgJ3AnLCAnZCcsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2YnLCAnaScsICd4JywKKyAgJ3UnLCAncCcsICdpJywgJ20nLCAnbScsICdwJywgJ3MnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdmJywgJ2knLCAneCcsICd1JywgJ3AnLCAnaScsICdtJywgJ20nLCAncCcsICdzJywgJzInLCAnNScsICc2JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZicsICdpJywgJ3gnLCAndScsICdwJywgJ2knLCAnbScsICdtJywKKyAgJ3AnLCAncycsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2YnLCAnaScsICd4JywKKyAgJ3UnLCAncCcsICdpJywgJ20nLCAnbScsICdzJywgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdmJywKKyAgJ2knLCAneCcsICd1JywgJ3AnLCAnaScsICdtJywgJ20nLCAncycsICdzJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICd6JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICd0JywgJ2UnLCAncicsICduJywgJ2wnLCAnbycsICdnJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3QnLCAnZScsICdyJywgJ24nLCAnbCcsICdvJywgJ2cnLCAnZCcsICcyJywKKyAgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAndCcsICdlJywgJ3InLCAnbicsICdsJywKKyAgJ28nLCAnZycsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICd0JywKKyAgJ2UnLCAncicsICduJywgJ2wnLCAnbycsICdnJywgJ3EnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ3QnLCAnZScsICdyJywgJ24nLCAnbCcsICdvJywgJ2cnLCAncScsICcyJywgJzUnLCAnNicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAndCcsICdlJywgJ3InLCAnbicsICdsJywgJ28nLCAnZycsICdxJywKKyAgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywKKyAgJ2QnLCAncCcsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywKKyAgJ20nLCAnYScsICdkJywgJ2QnLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICd6JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywgJ2QnLCAncCcsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywgJ2QnLCAncCcsICdzJywgJzEnLCAnMicsICc4JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywgJ2QnLCAncCcsICdzJywKKyAgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ20nLCAnYScsICdkJywKKyAgJ2QnLCAncCcsICdzJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywKKyAgJ20nLCAnYScsICdkJywgJ2QnLCAncycsICdkJywgJzMnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywKKyAgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdzJywgJ3MnLCAnMycsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAndScsICdiJywgJ3AnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAndScsICdiJywKKyAgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywKKyAgJ2EnLCAnZCcsICdkJywgJ3MnLCAndScsICdiJywgJ3AnLCAnZCcsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAndScsICdiJywgJ3AnLCAncycsICcxJywKKyAgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywKKyAgJ3MnLCAndScsICdiJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAndScsICdiJywgJ3AnLCAncycsICc1JywgJzEnLCAnMicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdkJywgJ3AnLCAnYicsICd1JywgJ3MnLCAnZCcsICcxJywKKyAgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdkJywgJ3AnLCAnYicsICd1JywKKyAgJ3MnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdkJywKKyAgJ3AnLCAnYicsICd1JywgJ3MnLCAnZCcsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAncCcsICdkJywgJ3AnLCAnYicsICd1JywgJ3MnLCAnZCcsICdzJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2QnLCAncCcsICdiJywgJ3UnLCAncycsICdkJywgJ3MnLCAnMicsICc1JywKKyAgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZCcsICdwJywgJ2InLCAndScsICdzJywKKyAgJ2QnLCAncycsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdkJywKKyAgJ3AnLCAndycsICdzJywgJ3MnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAncCcsICdkJywgJ3AnLCAndycsICdzJywgJ3MnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdkJywgJ3AnLCAndycsICdzJywgJ3MnLCAnZCcsICc1JywgJzEnLCAnMicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdkJywgJ3AnLCAndycsICdzJywgJ3MnLCAnZCcsICdzJywKKyAgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2QnLCAncCcsICd3JywKKyAgJ3MnLCAncycsICdkJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywKKyAgJ3AnLCAnZCcsICdwJywgJ3cnLCAncycsICdzJywgJ2QnLCAncycsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywgJ3InLCAnZCcsICcxJywKKyAgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICd0JywKKyAgJzInLCAndicsICdhJywgJ3InLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywgJ3InLCAnZCcsICc1JywgJzEnLCAnMicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywKKyAgJ3InLCAnaCcsICdpJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywKKyAgJ2UnLCAncicsICdtJywgJ3QnLCAnMicsICd2JywgJ2EnLCAncicsICdoJywgJ2knLCAnMicsICc1JywgJzYnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAndCcsICcyJywgJ3YnLCAnYScsICdyJywKKyAgJ2gnLCAnaScsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywKKyAgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywgJ3InLCAncCcsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ3QnLCAnMicsICd2JywgJ2EnLCAncicsICdwJywKKyAgJ2QnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywKKyAgJ20nLCAndCcsICcyJywgJ3YnLCAnYScsICdyJywgJ3AnLCAnZCcsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywgJ3InLCAncCcsICdzJywKKyAgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywKKyAgJ3QnLCAnMicsICd2JywgJ2EnLCAncicsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAndCcsICcyJywgJ3YnLCAnYScsICdyJywgJ3AnLCAncycsICc1JywKKyAgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICd0JywKKyAgJzInLCAndicsICdhJywgJ3InLCAncScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywgJ3InLCAncScsICcyJywgJzUnLCAnNicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywKKyAgJ3InLCAncScsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywKKyAgJ3InLCAnbScsICd0JywgJzInLCAndicsICdhJywgJ3InLCAncScsICdpJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICd6JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ3QnLCAnMicsICd2JywgJ2EnLCAncicsICdxJywKKyAgJ2knLCAnMicsICc1JywgJzYnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ3onLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywKKyAgJ20nLCAndCcsICcyJywgJ3YnLCAnYScsICdyJywgJ3EnLCAnaScsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdtJywgJ2EnLCAnZCcsICdkJywgJzUnLCAnMicsICdoJywgJ3UnLCAncScsICcxJywKKyAgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdtJywgJ2EnLCAnZCcsICdkJywKKyAgJzUnLCAnMicsICdoJywgJ3UnLCAncScsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAncCcsICdtJywgJ2EnLCAnZCcsICdkJywgJzUnLCAnMicsICdoJywgJ3UnLCAncScsICc1JywgJzEnLCAnMicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdtJywgJ2EnLCAnZCcsICdkJywgJzUnLCAnMicsICdsJywKKyAgJ3UnLCAncScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdtJywKKyAgJ2EnLCAnZCcsICdkJywgJzUnLCAnMicsICdsJywgJ3UnLCAncScsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdtJywgJ2EnLCAnZCcsICdkJywgJzUnLCAnMicsICdsJywgJ3UnLCAncScsICc1JywKKyAgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAnbCcsICdkJywKKyAgJ3YnLCAnZCcsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywKKyAgJ2gnLCAnbCcsICdkJywgJ3YnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAncCcsICdzJywgJ2gnLCAnbCcsICdkJywgJ3YnLCAnZCcsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAnbCcsICdkJywgJ3YnLCAncScsICcxJywgJzInLCAnOCcsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAnbCcsICdkJywgJ3YnLCAncScsICcyJywKKyAgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAnbCcsICdkJywKKyAgJ3YnLCAncScsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywKKyAgJ2gnLCAnbCcsICdkJywgJ3YnLCAndycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAncCcsICdzJywgJ2gnLCAnbCcsICdkJywgJ3YnLCAndycsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAnbCcsICdkJywgJ3YnLCAndycsICc1JywgJzEnLCAnMicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAncicsICdkJywgJ3YnLCAnZCcsICcxJywKKyAgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAncicsICdkJywKKyAgJ3YnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywKKyAgJ2gnLCAncicsICdkJywgJ3YnLCAnZCcsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAncCcsICdzJywgJ2gnLCAncicsICdkJywgJ3YnLCAncScsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAncicsICdkJywgJ3YnLCAncScsICcyJywgJzUnLCAnNicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAncicsICdkJywgJ3YnLCAncScsICc1JywKKyAgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAncicsICdkJywKKyAgJ3YnLCAndycsICcxJywgJzInLCAnOCcsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywKKyAgJ2gnLCAncicsICdkJywgJ3YnLCAndycsICcyJywgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAneicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAncCcsICdzJywgJ2gnLCAncicsICdkJywgJ3YnLCAndycsICc1JywgJzEnLCAnMicsICdfJywgJ20nLCAnYScsICdzJywKKyAgJ2snLCAneicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsICdjJywgJ2snLCAncycsICdzJywgJ2QnLCAndycsICc1JywgJzEnLCAnMicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAnYScsICdjJywgJ2snLCAncycsICdzJywgJ3cnLCAnYicsICc1JywgJzEnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsICdjJywKKyAgJ2snLCAndScsICdzJywgJ2QnLCAndycsICc1JywgJzEnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsICdjJywgJ2snLCAndScsICdzJywKKyAgJ3cnLCAnYicsICc1JywgJzEnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICd1JywgJ2wnLCAnZCcsICdxJywgJzUnLCAnMScsICcyJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICdtJywgJ3UnLCAnbCcsICdoJywgJ3InLCAncycsICd3JywgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywKKyAgJ3UnLCAnbCcsICdoJywgJ3cnLCAnNScsICcxJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAndScsICdsJywgJ2gnLCAndScsICd3JywKKyAgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ3UnLCAnbCcsICd1JywgJ2QnLCAncScsICc1JywgJzEnLCAnMicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAncycsICdhJywgJ2QnLCAnYicsICd3JywgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ2gnLCAndScsICdmJywKKyAgJ2InLCAnNScsICcxJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnbCcsICdsJywgJ2QnLCAnNScsICcxJywgJzInLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ3MnLCAnbCcsICdsJywgJ3EnLCAnNScsICcxJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnbCcsICdsJywgJ3cnLCAnNScsICcxJywKKyAgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ3MnLCAnbCcsICdsJywgJ2QnLCAnaScsICc1JywgJzEnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdsJywKKyAgJ2wnLCAncScsICdpJywgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ2wnLCAnbCcsICd3JywgJ2knLCAnNScsICcxJywKKyAgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ3MnLCAnbCcsICdsJywgJ3YnLCAnMScsICc2JywgJ3MnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdsJywKKyAgJ2wnLCAndicsICc4JywgJ2QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdsJywgJ2wnLCAndicsICc4JywgJ2gnLCAnaScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAncycsICdsJywgJ2wnLCAndicsICcxJywgJzYnLCAnaCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ2wnLCAnbCcsICd2JywKKyAgJzMnLCAnMicsICdoJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdhJywgJ2QnLCAnNScsICcxJywgJzInLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ3MnLCAncicsICdhJywgJ3EnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdhJywgJ3EnLCAnMicsICc1JywKKyAgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdhJywgJ3EnLCAnNScsICcxJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdhJywKKyAgJ3cnLCAnNScsICcxJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdhJywgJ2QnLCAnaScsICc1JywgJzEnLCAnMicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAncycsICdyJywgJ2EnLCAncScsICdpJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnYScsICdxJywKKyAgJ2knLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdhJywgJ3EnLCAnaScsICc1JywgJzEnLCAnMicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAncycsICdyJywgJ2EnLCAndycsICdpJywgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnYScsICd2JywKKyAgJzEnLCAnNicsICdzJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdhJywgJ3YnLCAncScsICcxJywgJzInLCAnOCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAncycsICdyJywgJ2EnLCAndicsICdxJywgJzInLCAnNScsICc2JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnYScsICd2JywKKyAgJzgnLCAnZCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnYScsICd2JywgJzgnLCAnaCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywKKyAgJ3InLCAnYScsICd2JywgJzEnLCAnNicsICdoJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdhJywgJ3YnLCAnMycsICcyJywKKyAgJ2gnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2wnLCAnZCcsICc1JywgJzEnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywKKyAgJ2wnLCAncScsICc1JywgJzEnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2wnLCAndycsICc1JywgJzEnLCAnMicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAncycsICdyJywgJ2wnLCAnZCcsICdpJywgJzUnLCAnMScsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnbCcsICdxJywKKyAgJ2knLCAnNScsICcxJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdsJywgJ3cnLCAnaScsICc1JywgJzEnLCAnMicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAncycsICdyJywgJ2wnLCAndicsICcxJywgJzYnLCAncycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnbCcsICd2JywKKyAgJzgnLCAnZCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnbCcsICd2JywgJzgnLCAnaCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywKKyAgJ3InLCAnbCcsICd2JywgJzEnLCAnNicsICdoJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdsJywgJ3YnLCAnMycsICcyJywKKyAgJ2gnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3InLCAnYycsICdwJywgJzEnLCAnNCcsICdwJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXycsICdtJywKKyAgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdjJywgJ3AnLCAnMScsICc0JywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ2MnLCAncCcsICcxJywgJzQnLCAncCcsICdkJywgJzUnLCAnMScsICcyJywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnYycsICdwJywgJzEnLCAnNCcsICdwJywgJ3MnLCAnMScsICcyJywKKyAgJzgnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdjJywgJ3AnLCAnMScsICc0JywgJ3AnLCAncycsICcyJywKKyAgJzUnLCAnNicsICdfJywgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ2MnLCAncCcsICcxJywgJzQnLCAncCcsICdzJywKKyAgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnYycsICdwJywgJzEnLCAnNCcsICdzJywKKyAgJ2QnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdjJywgJ3AnLCAnMScsICc0JywgJ3MnLCAncycsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ2MnLCAncCcsICcyJywgJzgnLCAncCcsICdkJywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3InLCAnYycsICdwJywgJzInLCAnOCcsICdwJywgJ3MnLCAnXycsICdtJywgJ2EnLCAncycsICdrJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncicsICdjJywgJ3AnLCAnMicsICc4JywgJ3MnLCAnZCcsICdfJywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdfJywKKyAgJ20nLCAnYScsICdzJywgJ2snLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ2MnLCAncCcsICcyJywgJzgnLCAncycsICdzJywgJ18nLCAncicsICdvJywKKyAgJ3UnLCAnbicsICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAncycsICdxJywgJ3InLCAndCcsICcxJywKKyAgJzQnLCAncCcsICdkJywgJzEnLCAnMicsICc4JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAncycsICdxJywKKyAgJ3InLCAndCcsICcxJywgJzQnLCAncCcsICdkJywgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3InLCAncycsICdxJywgJ3InLCAndCcsICcxJywgJzQnLCAncCcsICdkJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3InLCAncycsICdxJywgJ3InLCAndCcsICcxJywgJzQnLCAncCcsICdzJywgJzEnLCAnMicsICc4JywKKyAgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAncycsICdxJywgJ3InLCAndCcsICcxJywgJzQnLCAncCcsICdzJywKKyAgJzInLCAnNScsICc2JywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAncycsICdxJywgJ3InLCAndCcsICcxJywKKyAgJzQnLCAncCcsICdzJywgJzUnLCAnMScsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAncycsICdxJywKKyAgJ3InLCAndCcsICcxJywgJzQnLCAncycsICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAncycsICdxJywKKyAgJ3InLCAndCcsICcxJywgJzQnLCAncycsICdzJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAncycsICdxJywKKyAgJ3InLCAndCcsICcyJywgJzgnLCAncCcsICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAncycsICdxJywKKyAgJ3InLCAndCcsICcyJywgJzgnLCAncCcsICdzJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAncycsICdxJywKKyAgJ3InLCAndCcsICcyJywgJzgnLCAncycsICdkJywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ18nLCAnbScsICdhJywKKyAgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3InLCAncycsICdxJywgJ3InLCAndCcsICcyJywgJzgnLCAncycsICdzJywgJ18nLCAncicsICdvJywKKyAgJ3UnLCAnbicsICdkJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywKKyAgJ3InLCAncycsICdpJywgJ3YnLCAnOCcsICdkJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywKKyAgJ3MnLCAnaScsICd2JywgJzEnLCAnNicsICdzJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywKKyAgJ3MnLCAnaScsICd2JywgJzgnLCAnZCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdzJywKKyAgJ2knLCAndicsICcxJywgJzYnLCAncycsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdkJywKKyAgJ2knLCAndicsICc4JywgJ2QnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAnZCcsICdpJywKKyAgJ3YnLCAnMScsICc2JywgJ3MnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAnZCcsICdpJywKKyAgJ3YnLCAnOCcsICdkJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywgJ2QnLCAnaScsICd2JywKKyAgJzEnLCAnNicsICdzJywgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywgJ2QnLCAnaScsICd2JywKKyAgJzInLCAnZCcsICdmJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdkJywgJ2knLCAndicsICcyJywKKyAgJ2QnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAnZCcsICdpJywgJ3YnLCAnNCcsICdkJywKKyAgJ2YnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywgJ2QnLCAnaScsICd2JywgJzQnLCAnZCcsICdpJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdkJywgJ2knLCAndicsICc0JywgJ3MnLCAnZicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAnZCcsICdpJywgJ3YnLCAnNCcsICdzJywgJ2knLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywKKyAgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywgJ2QnLCAnaScsICd2JywgJzgnLCAncycsICdmJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdjJywKKyAgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdkJywgJ2knLCAndicsICc4JywgJ3MnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnYycsICdhJywKKyAgJ3QnLCAndCcsICdlJywgJ3InLCAncCcsICdmJywgJ2QnLCAncCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdjJywgJ2EnLCAndCcsICd0JywKKyAgJ2UnLCAncicsICdwJywgJ2YnLCAnZCcsICdwJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywKKyAgJ3AnLCAnZicsICdxJywgJ3AnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAncCcsICdmJywKKyAgJ3EnLCAncCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdzJywgJ2knLCAndicsICcyJywKKyAgJ2QnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAncycsICdpJywgJ3YnLCAnMicsICdkJywKKyAgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdzJywgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywgJ3MnLCAnaScsICd2JywgJzQnLCAnZCcsICdmJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncycsICdjJywgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdzJywgJ2knLCAndicsICc0JywgJ2QnLCAnaScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3MnLCAnYycsICdhJywgJ3QnLCAndCcsICdlJywgJ3InLCAncycsICdpJywgJ3YnLCAnNCcsICdzJywgJ2YnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywKKyAgJ2MnLCAnYScsICd0JywgJ3QnLCAnZScsICdyJywgJ3MnLCAnaScsICd2JywgJzQnLCAncycsICdpJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdjJywKKyAgJ2EnLCAndCcsICd0JywgJ2UnLCAncicsICdzJywgJ2knLCAndicsICc4JywgJ3MnLCAnZicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnYycsICdhJywKKyAgJ3QnLCAndCcsICdlJywgJ3InLCAncycsICdpJywgJ3YnLCAnOCcsICdzJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2MnLCAnbycsICdtJywKKyAgJ2knLCAncycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdjJywgJ28nLCAnbScsICdpJywgJ3MnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnYycsICd2JywKKyAgJ3QnLCAncycsICdkJywgJzInLCAncycsICdpJywgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnYycsICd2JywgJ3QnLCAncycsICdkJywKKyAgJzInLCAncycsICdpJywgJzYnLCAnNCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnYycsICd2JywgJ3QnLCAncycsICdkJywgJzInLCAndScsICdzJywKKyAgJ2knLCAnMycsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdjJywgJ3YnLCAndCcsICdzJywgJ2QnLCAnMicsICd1JywgJ3MnLCAnaScsICc2JywKKyAgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd2JywgJ2MnLCAndicsICd0JywgJ3MnLCAncycsICcyJywgJ3MnLCAnaScsICczJywgJzInLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywKKyAgJ2MnLCAndicsICd0JywgJ3MnLCAncycsICcyJywgJ3MnLCAnaScsICc2JywgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2MnLCAndicsICd0JywKKyAgJ3MnLCAncycsICcyJywgJ3UnLCAncycsICdpJywgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnYycsICd2JywgJ3QnLCAncycsICdzJywKKyAgJzInLCAndScsICdzJywgJ2knLCAnNicsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ2knLCAnbCcsICd2JywKKyAgJ2EnLCAncicsICdwJywgJ2QnLCAnNScsICcxJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAnaScsICdsJywKKyAgJ3YnLCAnYScsICdyJywgJ3AnLCAncycsICc1JywgJzEnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2InLCAnZScsICd4JywgJ3QnLCAncicsICdfJywKKyAgJ3UnLCAnMycsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnYicsICdlJywgJ3gnLCAndCcsICdyJywgJ18nLCAndScsICc2JywgJzQnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdiJywKKyAgJ3onLCAnaCcsICdpJywgJ18nLCAncycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYicsICd6JywgJ2gnLCAnaScsICdfJywgJ2QnLCAnaScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAnZCcsICdlJywgJ3AnLCAnXycsICdzJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2QnLCAnZScsICdwJywgJ18nLCAnZCcsICdpJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICdlJywgJ3gnLCAndCcsICdfJywgJ3MnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnZScsICd4JywgJ3QnLCAnXycsICdkJywKKyAgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdjJywgJ2wnLCAnZicsICdsJywgJ3UnLCAncycsICdoJywgJ28nLCAncCcsICd0JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdsJywKKyAgJ3InLCAncycsICdzJywgJ2InLCAncycsICd5JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdsJywgJ3cnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbCcsICd6JywKKyAgJ2UnLCAncicsICdvJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdlJywgJ2YnLCAnbCcsICdhJywgJ2cnLCAncycsICdfJywKKyAgJ3UnLCAnMycsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdlJywgJ2EnLCAnZCcsICdlJywgJ2YnLCAnbCcsICdhJywgJ2cnLCAncycsICdfJywKKyAgJ3UnLCAnNicsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndycsICdyJywgJ2knLCAndCcsICdlJywgJ2UnLCAnZicsICdsJywgJ2EnLCAnZycsICdzJywKKyAgJ18nLCAndScsICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICd3JywgJ3InLCAnaScsICd0JywgJ2UnLCAnZScsICdmJywgJ2wnLCAnYScsICdnJywKKyAgJ3MnLCAnXycsICd1JywgJzYnLCAnNCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3AnLCAnZCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3AnLCAnZCcsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywKKyAgJ2EnLCAnZCcsICdkJywgJ3AnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3AnLCAncycsICcyJywKKyAgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdtJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAnZCcsICczJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywKKyAgJ20nLCAnYScsICdkJywgJ2QnLCAncycsICdzJywgJzMnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdzJywKKyAgJ3UnLCAnYicsICdwJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsICdwJywKKyAgJ2QnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsICdwJywKKyAgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsICdwJywgJ3MnLCAnMicsICc1JywKKyAgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywgJ2QnLCAnZCcsICdzJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2YnLCAnbScsICdhJywKKyAgJ2QnLCAnZCcsICdzJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdmJywgJ3gnLCAncicsICdzJywgJ3QnLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZicsICd4JywKKyAgJ3InLCAncycsICd0JywgJ28nLCAncicsICc2JywgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdmJywgJ3gnLCAncycsICdhJywgJ3YnLCAnZScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2YnLCAneCcsICdzJywgJ2EnLCAndicsICdlJywgJzYnLCAnNCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2knLCAnbicsICdjJywgJ3MnLCAncycsICdwJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdpJywgJ24nLCAnYycsICdzJywgJ3MnLCAncCcsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbCcsICdsJywgJ3cnLCAncCcsICdjJywKKyAgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdsJywgJ3cnLCAncCcsICdpJywgJ24nLCAncycsICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdsJywgJ3cnLCAncCcsICdpJywKKyAgJ24nLCAncycsICc2JywgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdsJywgJ3cnLCAncCcsICd2JywgJ2EnLCAnbCcsICczJywgJzInLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdsJywKKyAgJ3cnLCAncCcsICd2JywgJ2EnLCAnbCcsICc2JywgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdlJywgJ20nLCAnbScsICdzJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZicsICdlJywKKyAgJ20nLCAnbScsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdtJywgJ28nLCAndicsICdxJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdvJywKKyAgJ3YnLCAnbicsICd0JywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnYycsICdrJywgJ3MnLCAncycsICdkJywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ2EnLCAnYycsICdrJywgJ3MnLCAncycsICd3JywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnYycsICdrJywgJ3UnLCAncycsICd3JywKKyAgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ2EnLCAnZCcsICdkJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnZCcsICdkJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ2EnLCAnZCcsICdkJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnZCcsICdkJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnZCcsICdkJywKKyAgJ3MnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsICdkJywgJ2QnLCAncycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywgJ2QnLCAnZCcsICd1JywKKyAgJ3MnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsICdkJywgJ2QnLCAndScsICdzJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnbCcsICdpJywKKyAgJ2cnLCAnbicsICdyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywgJ24nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsICduJywgJ2QnLCAnbicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAnYScsICd2JywgJ2cnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsICd2JywgJ2cnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYycsICdtJywKKyAgJ3AnLCAnZScsICdxJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2MnLCAnbScsICdwJywgJ2UnLCAncScsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdjJywKKyAgJ20nLCAncCcsICdlJywgJ3EnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYycsICdtJywgJ3AnLCAnZycsICd0JywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ2MnLCAnbScsICdwJywgJ2cnLCAndCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdjJywgJ20nLCAncCcsICdnJywgJ3QnLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAnZScsICdjJywgJ18nLCAnZScsICd4JywgJ3QnLCAnXycsICd2JywgJzQnLCAnaCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdlJywKKyAgJ2MnLCAnXycsICdzJywgJ2UnLCAndCcsICdfJywgJ3YnLCAnNCcsICdoJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnYScsICdkJywKKyAgJ2QnLCAndycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ2EnLCAneCcsICdzJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAnYScsICd4JywKKyAgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdpJywgJ24nLCAncycsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ2knLCAnbicsICd1JywKKyAgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ20nLCAnbycsICd2JywgJ20nLCAncycsICdrJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAndScsICdsJywKKyAgJ2gnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICd1JywgJ2wnLCAnaCcsICd1JywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAndScsICdsJywKKyAgJ2wnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICd1JywgJ2wnLCAndScsICdkJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ28nLCAncicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAncycsICdhJywgJ2QnLCAnYicsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ2wnLCAnbCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywKKyAgJ2wnLCAnbCcsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ2wnLCAnbCcsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ2wnLCAnbCcsICdkJywKKyAgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ3MnLCAnbCcsICdsJywgJ3EnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdsJywgJ2wnLCAndycsICdpJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICdzJywgJ3InLCAnYScsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnYScsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywKKyAgJ3InLCAnYScsICdkJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdhJywgJ3cnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywKKyAgJ2wnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2wnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2wnLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAncycsICdyJywgJ2wnLCAnZCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnbCcsICdxJywgJ2knLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ3MnLCAncicsICdsJywgJ3cnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICd1JywgJ2InLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICd1JywKKyAgJ2InLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICd1JywgJ2InLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICd1JywgJ2InLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAncycsICd1JywgJ2InLCAncycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3UnLCAnYicsICdzJywgJ3cnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ3MnLCAndScsICdiJywgJ3UnLCAncycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3UnLCAnYicsICd1JywgJ3MnLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAndScsICduJywgJ3AnLCAnYycsICdrJywgJ2gnLCAnYicsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICd1JywgJ24nLCAncCcsICdjJywKKyAgJ2snLCAnaCcsICdkJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3UnLCAnbicsICdwJywgJ2MnLCAnaycsICdoJywgJ3cnLCAnZCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAndScsICduJywgJ3AnLCAnYycsICdrJywgJ2wnLCAnYicsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICd1JywgJ24nLCAncCcsICdjJywKKyAgJ2snLCAnbCcsICdkJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3UnLCAnbicsICdwJywgJ2MnLCAnaycsICdsJywgJ3cnLCAnZCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAneCcsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdtJywgJ28nLCAnbicsICdpJywgJ3QnLCAnbycsICdyJywgJ3gnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdtJywKKyAgJ3cnLCAnYScsICdpJywgJ3QnLCAneCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYycsICdsJywgJ20nLCAndScsICdsJywgJ3EnLCAnZCcsICdxJywKKyAgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdjJywgJ2wnLCAnbScsICd1JywgJ2wnLCAncScsICdkJywgJ3EnLCAnMicsICc1JywKKyAgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ2MnLCAnbCcsICdtJywgJ3UnLCAnbCcsICdxJywgJ2QnLCAncScsICc1JywgJzEnLCAnMicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3InLCAnZCcsICdmJywgJ3MnLCAnYicsICdhJywgJ3MnLCAnZScsICczJywgJzInLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ2QnLCAnZicsICdzJywKKyAgJ2InLCAnYScsICdzJywgJ2UnLCAnNicsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdkJywgJ2cnLCAncycsICdiJywgJ2EnLCAncycsICdlJywKKyAgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3InLCAnZCcsICdnJywgJ3MnLCAnYicsICdhJywgJ3MnLCAnZScsICc2JywgJzQnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywKKyAgJ2QnLCAncCcsICdpJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ2QnLCAncCcsICdrJywgJ3InLCAndScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnZCcsICdwJywKKyAgJ20nLCAnYycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3InLCAnZCcsICdzJywgJ3MnLCAncCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdkJywgJ3MnLCAncycsICdwJywKKyAgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdyJywgJ2QnLCAndCcsICdzJywgJ2MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ2QnLCAndCcsICdzJywgJ2MnLCAncCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3InLCAncycsICd0JywgJ28nLCAncicsICdzJywgJ3MnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnYScsICd2JywgJ2UnLCAncCcsICdyJywKKyAgJ2UnLCAndicsICdzJywgJ3MnLCAncCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnZScsICd0JywgJ3MnLCAncycsICdiJywgJ3MnLCAneScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3MnLCAnaCcsICdhJywgJzEnLCAnbScsICdzJywgJ2cnLCAnMScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnaCcsICdhJywgJzEnLCAnbScsICdzJywKKyAgJ2cnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3MnLCAnaCcsICdhJywgJzEnLCAnbicsICdlJywgJ3gnLCAndCcsICdlJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdoJywKKyAgJ2EnLCAnMScsICdyJywgJ24nLCAnZCcsICdzJywgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ2gnLCAnYScsICcyJywgJzUnLCAnNicsICdtJywKKyAgJ3MnLCAnZycsICcxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICdoJywgJ2EnLCAnMicsICc1JywgJzYnLCAnbScsICdzJywgJ2cnLCAnMicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3MnLCAnaCcsICdhJywgJzInLCAnNScsICc2JywgJ3InLCAnbicsICdkJywgJ3MnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnbCcsICd3JywKKyAgJ3AnLCAnYycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdtJywgJ3AnLCAncycsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdvJywgJ20nLCAnaScsICdlJywKKyAgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdjJywgJ28nLCAnbScsICdpJywgJ2cnLCAnZScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ2knLCAnZycsICd0JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnYycsICdvJywgJ20nLCAnaScsICdsJywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ28nLCAnbScsICdpJywgJ2wnLCAndCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2MnLCAnbycsICdtJywgJ2knLCAnbicsICdlJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdwJywgJ2QnLCAnMicsICdwJywKKyAgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdwJywgJ2knLCAnMicsICdwJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdwJywKKyAgJ2knLCAnMicsICdwJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdwJywgJ3MnLCAnMicsICdwJywgJ2knLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywKKyAgJ3YnLCAndCcsICdzJywgJ3MnLCAnMicsICdzJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICdzJywgJ3MnLCAnMicsICdzJywKKyAgJ2knLCAnNicsICc0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndCcsICdwJywgJ2QnLCAnMicsICdwJywgJ2knLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywKKyAgJ3YnLCAndCcsICd0JywgJ3AnLCAncycsICcyJywgJ3AnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3QnLCAncycsICdzJywKKyAgJzInLCAncycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAndCcsICdzJywgJ3MnLCAnMicsICdzJywgJ2knLCAnNicsICc0JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnbScsICdhJywgJ3gnLCAncCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdhJywgJ3gnLCAncycsICdzJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdpJywKKyAgJ24nLCAncCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdpJywgJ24nLCAncycsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdvJywgJ3YnLCAnbScsICdzJywKKyAgJ2snLCAncCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ2gnLCAndScsICdmJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ2MnLCAncCcsICdwJywKKyAgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdyJywgJ2MnLCAncCcsICdzJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywgJ3MnLCAncScsICdyJywgJ3QnLCAncCcsICdzJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncicsICdzJywgJ3EnLCAncicsICd0JywgJ3MnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAnZicsICdlJywgJ24nLCAnYycsICdlJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncycsICdxJywgJ3InLCAndCcsICdwJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ3EnLCAncicsICd0JywgJ3MnLCAncycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3UnLCAnYycsICdvJywgJ20nLCAnaScsICdlJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd1JywgJ2MnLCAnbycsICdtJywgJ2knLCAnZycsICdlJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndScsICdjJywgJ28nLCAnbScsICdpJywgJ2cnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3UnLCAnYycsICdvJywgJ20nLCAnaScsICdsJywKKyAgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd1JywgJ2MnLCAnbycsICdtJywgJ2knLCAnbCcsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndScsICdjJywgJ28nLCAnbScsICdpJywKKyAgJ24nLCAnZScsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICdsJywgJ2YnLCAnbCcsICd1JywgJ3MnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbScsICdwJywKKyAgJ3MnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ2knLCAncycsICdkJywgJ2UnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywKKyAgJ2knLCAncycsICdkJywgJ2cnLCAnZScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ2knLCAncycsICdkJywgJ2cnLCAndCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2MnLCAnbycsICdtJywgJ2knLCAncycsICdkJywgJ2wnLCAnZScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ2knLCAncycsICdkJywKKyAgJ2wnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ2MnLCAnbycsICdtJywgJ2knLCAncycsICdkJywgJ24nLCAnZScsICdxJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywKKyAgJ3QnLCAnZCcsICdxJywgJzInLCAncCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdkJywgJzInLCAnZCcsICdxJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdkJywgJzInLCAncCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncCcsICdzJywKKyAgJzInLCAnZCcsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywgJ3QnLCAncycsICdkJywgJzInLCAncycsICdpJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywKKyAgJ3QnLCAncycsICdkJywgJzInLCAncycsICdpJywgJzYnLCAnNCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3MnLCAnZCcsICcyJywKKyAgJ3MnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3QnLCAncCcsICdkJywgJzInLCAnZCcsICdxJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnYycsICd2JywKKyAgJ3QnLCAndCcsICdwJywgJ3MnLCAnMicsICdkJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3YnLCAndCcsICd0JywgJ3MnLCAnZCcsICcyJywKKyAgJ3MnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ2MnLCAndicsICd0JywgJ3QnLCAncycsICdkJywgJzInLCAncycsICdpJywgJzYnLCAnNCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2wnLCAnZicsICdlJywgJ24nLCAnYycsICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdhJywgJ3MnLCAnaycsICdtJywgJ28nLCAndicsICdkJywKKyAgJ3EnLCAndScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ20nLCAnYScsICd4JywgJ3AnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAnYScsICd4JywgJ3MnLCAnZCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ20nLCAnZicsICdlJywgJ24nLCAnYycsICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdpJywgJ24nLCAncCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdpJywKKyAgJ24nLCAncycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnbScsICdvJywgJ3YnLCAnbScsICdzJywgJ2snLCAncCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywKKyAgJ2MnLCAnaycsICdzJywgJ3MnLCAnZCcsICd3JywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywgJ2MnLCAnaycsICdzJywKKyAgJ3MnLCAndycsICdiJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywgJ2MnLCAnaycsICd1JywgJ3MnLCAndycsICdiJywKKyAgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdhJywgJ2QnLCAnZCcsICdzJywgJ2InLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ2EnLCAnZCcsICdkJywgJ3MnLCAndycsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYScsICdkJywgJ2QnLCAndScsICdzJywKKyAgJ2InLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnZCcsICdkJywgJ3UnLCAncycsICd3JywgJzEnLCAnMicsICc4JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICdhJywgJ3UnLCAncycsICdlJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ2EnLCAnZCcsICdkJywgJ3cnLCAnZCcsICcxJywKKyAgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdvJywgJ3YnLCAnbScsICdzJywgJ2snLCAnYicsICcxJywgJzInLCAnOCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAnbScsICd1JywgJ2wnLCAnaCcsICd3JywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywgJ3UnLCAnbCcsICdoJywKKyAgJ3UnLCAndycsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICd1JywgJ2wnLCAndScsICdkJywgJ3EnLCAnMScsICcyJywKKyAgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ3MnLCAnYScsICdkJywgJ2InLCAndycsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdsJywKKyAgJ2wnLCAnZCcsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdsJywgJ2wnLCAncScsICcxJywgJzInLCAnOCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAncycsICdsJywgJ2wnLCAndycsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdsJywgJ2wnLCAnZCcsICdpJywKKyAgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ2wnLCAnbCcsICdxJywgJ2knLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ3MnLCAnbCcsICdsJywgJ3cnLCAnaScsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2EnLCAnZCcsICcxJywKKyAgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2EnLCAndycsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywKKyAgJ2EnLCAnZCcsICdpJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnYScsICd3JywgJ2knLCAnMScsICcyJywKKyAgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdsJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdsJywKKyAgJ3EnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAncicsICdsJywgJ3cnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ3MnLCAncicsICdsJywgJ2QnLCAnaScsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdyJywgJ2wnLCAncScsICdpJywKKyAgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3InLCAnbCcsICd3JywgJ2knLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ3MnLCAndScsICdiJywgJ3MnLCAnYicsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICd1JywgJ2InLCAncycsICd3JywKKyAgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ3UnLCAnYicsICd1JywgJ3MnLCAnYicsICcxJywgJzInLCAnOCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAncycsICd1JywgJ2InLCAndScsICdzJywgJ3cnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdzJywgJ3EnLCAncicsICd0JywKKyAgJ3AnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3MnLCAncScsICdyJywgJ3QnLCAncycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndScsICdjJywgJ28nLCAnbScsICdpJywKKyAgJ3MnLCAnZCcsICdlJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICd1JywgJ2MnLCAnbycsICdtJywgJ2knLCAncycsICdkJywgJ2cnLCAnZScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3UnLCAnYycsICdvJywgJ20nLCAnaScsICdzJywgJ2QnLCAnZycsICd0JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndScsICdjJywgJ28nLCAnbScsICdpJywKKyAgJ3MnLCAnZCcsICdsJywgJ2UnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICd1JywgJ2MnLCAnbycsICdtJywgJ2knLCAncycsICdkJywgJ2wnLCAndCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3UnLCAnYycsICdvJywgJ20nLCAnaScsICdzJywgJ2QnLCAnbicsICdlJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdhJywgJ2QnLCAnZCcsICdzJywKKyAgJ3UnLCAnYicsICdwJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdhJywgJ2QnLCAnZCcsICdzJywgJ3UnLCAnYicsICdwJywgJ3MnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdoJywKKyAgJ2EnLCAnZCcsICdkJywgJ3AnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2gnLCAnYScsICdkJywgJ2QnLCAncCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnaCcsICdzJywKKyAgJ3UnLCAnYicsICdwJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdoJywgJ3MnLCAndScsICdiJywgJ3AnLCAncycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2wnLCAnZCcsICdkJywKKyAgJ3EnLCAndScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ20nLCAnbycsICduJywgJ2knLCAndCcsICdvJywgJ3InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdtJywgJ3cnLCAnYScsICdpJywKKyAgJ3QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdiJywgJ2wnLCAnZScsICduJywgJ2QnLCAndicsICdwJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdiJywgJ2wnLCAnZScsICduJywKKyAgJ2QnLCAndicsICdwJywgJ3MnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdkJywgJ3AnLCAncCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAnZCcsICdwJywgJ3AnLCAncycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2knLCAnbicsICdzJywgJ2UnLCAncicsICd0JywgJ3AnLCAncycsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ20nLCAncCcsICdzJywKKyAgJ2EnLCAnZCcsICdiJywgJ3cnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnYycsICdrJywgJ3UnLCAncycsICdkJywKKyAgJ3cnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2InLCAnbCcsICdlJywgJ24nLCAnZCcsICd2JywgJ2InLCAnMScsICcyJywKKyAgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ2gnLCAnbScsICdpJywgJ24nLCAncCcsICdvJywgJ3MnLCAndScsICd3JywgJzEnLCAnMicsICc4JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICdtJywgJ3UnLCAnbCcsICdkJywgJ3EnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3QnLCAnZScsICdzJywKKyAgJ3QnLCAnYycsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAndCcsICdlJywgJ3MnLCAndCcsICduJywgJ3onLCAnYycsICcxJywKKyAgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAndCcsICdlJywgJ3MnLCAndCcsICd6JywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdvJywKKyAgJ3UnLCAnbicsICdkJywgJ3AnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3InLCAnbycsICd1JywgJ24nLCAnZCcsICdwJywgJ3MnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdyJywKKyAgJ28nLCAndScsICduJywgJ2QnLCAncycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncicsICdvJywgJ3UnLCAnbicsICdkJywgJ3MnLCAncycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ2MnLCAncicsICdjJywgJzMnLCAnMicsICdoJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdjJywgJ3InLCAnYycsICczJywgJzInLCAncycsICdpJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAnYycsICdyJywgJ2MnLCAnMycsICcyJywgJ3EnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2MnLCAncicsICdjJywgJzMnLCAnMicsICdkJywKKyAgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ2MnLCAnbScsICdwJywgJ2UnLCAncycsICd0JywgJ3InLCAnaScsICcxJywgJzInLCAnOCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAnYycsICdtJywgJ3AnLCAnZScsICdzJywgJ3QnLCAncicsICdpJywgJ2EnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ2MnLCAnbScsICdwJywgJ2UnLCAncycsICd0JywgJ3InLCAnaScsICdjJywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdjJywKKyAgJ20nLCAncCcsICdlJywgJ3MnLCAndCcsICdyJywgJ2knLCAnbycsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYycsICdtJywKKyAgJ3AnLCAnZScsICdzJywgJ3QnLCAncicsICdpJywgJ3MnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2MnLCAnbScsICdwJywKKyAgJ2UnLCAncycsICd0JywgJ3InLCAnaScsICd6JywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdjJywgJ20nLCAncCcsICdlJywKKyAgJ3MnLCAndCcsICdyJywgJ20nLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2MnLCAnbScsICdwJywgJ2knLCAncycsICd0JywKKyAgJ3InLCAnaScsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnYycsICdtJywgJ3AnLCAnaScsICdzJywgJ3QnLCAncicsICdpJywKKyAgJ2EnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2MnLCAnbScsICdwJywgJ2knLCAncycsICd0JywgJ3InLCAnaScsICdjJywKKyAgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdjJywgJ20nLCAncCcsICdpJywgJ3MnLCAndCcsICdyJywgJ2knLCAnbycsICcxJywKKyAgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAnYycsICdtJywgJ3AnLCAnaScsICdzJywgJ3QnLCAncicsICdpJywgJ3MnLCAnMScsICcyJywKKyAgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ2MnLCAnbScsICdwJywgJ2knLCAncycsICd0JywgJ3InLCAnaScsICd6JywgJzEnLCAnMicsICc4JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICdjJywgJ20nLCAncCcsICdpJywgJ3MnLCAndCcsICdyJywgJ20nLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdlJywKKyAgJ3gnLCAndCcsICdyJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdlJywgJ3gnLCAndCcsICdyJywgJ3EnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ2knLCAnbicsICdzJywKKyAgJ2UnLCAncicsICd0JywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdpJywgJ24nLCAncycsICdlJywgJ3InLCAndCcsICdxJywgJ2knLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywKKyAgJ2EnLCAnYicsICdzJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnYicsICdzJywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2EnLCAnYicsICdzJywKKyAgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ2gnLCAnYScsICdkJywgJ2QnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnaCcsICdhJywgJ2QnLCAnZCcsICdkJywKKyAgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdoJywgJ2EnLCAnZCcsICdkJywgJ3MnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnaCcsICdhJywKKyAgJ2QnLCAnZCcsICdzJywgJ3cnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2gnLCAnYScsICdkJywgJ2QnLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAnaCcsICdhJywgJ2QnLCAnZCcsICd3JywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdoJywgJ3MnLCAndScsICdiJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ2gnLCAncycsICd1JywgJ2InLCAnZCcsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAnaCcsICdzJywKKyAgJ3UnLCAnYicsICdzJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2gnLCAncycsICd1JywgJ2InLCAncycsICd3JywgJzEnLCAnMicsICc4JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAncCcsICdoJywgJ3MnLCAndScsICdiJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ2gnLCAncycsICd1JywgJ2InLCAndycsICcxJywKKyAgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3AnLCAnbScsICdhJywgJ2QnLCAnZCcsICd1JywgJ2InLCAncycsICd3JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdtJywKKyAgJ2EnLCAnZCcsICdkJywgJ3UnLCAnYicsICdzJywgJ3cnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAndScsICdsJywKKyAgJ2gnLCAncicsICdzJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ20nLCAndScsICdsJywgJ2gnLCAncicsICdzJywgJ3cnLCAnMScsICcyJywKKyAgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICdwJywgJ3MnLCAnaCcsICd1JywgJ2YnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdoJywgJ3UnLCAnZicsICdiJywKKyAgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywgJ2knLCAnZycsICduJywgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywKKyAgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnaScsICdnJywKKyAgJ24nLCAnYicsICcxJywgJzInLCAnOCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3AnLCAncycsICdpJywgJ2cnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncCcsICdzJywKKyAgJ2knLCAnZycsICduJywgJ2QnLCAnMScsICcyJywgJzgnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdwJywgJ3MnLCAnaScsICdnJywgJ24nLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3AnLCAncycsICdpJywgJ2cnLCAnbicsICd3JywgJzEnLCAnMicsICc4JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAncycsICd1JywgJ2InLCAnYicsICdvJywKKyAgJ3InLCAncicsICdvJywgJ3cnLCAnXycsICd1JywgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3MnLCAndScsICdiJywgJ2InLCAnbycsICdyJywKKyAgJ3InLCAnbycsICd3JywgJ18nLCAndScsICc2JywgJzQnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICdiJywgJ2UnLCAneCcsICd0JywgJ3InLCAnaScsICdfJywKKyAgJ3UnLCAnMycsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAnYicsICdlJywgJ3gnLCAndCcsICdyJywgJ2knLCAnXycsICd1JywgJzYnLCAnNCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAnYycsICd2JywgJ3QnLCAncCcsICdoJywgJzInLCAncCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdjJywgJ3YnLCAndCcsICdwJywKKyAgJ2gnLCAnMicsICdwJywgJ3MnLCAnMicsICc1JywgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2MnLCAndicsICd0JywgJ3AnLCAncycsICcyJywKKyAgJ3AnLCAnaCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAnYycsICd2JywgJ3QnLCAncCcsICdzJywgJzInLCAncCcsICdoJywgJzInLCAnNScsICc2JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdnJywgJ2YnLCAnMicsICdwJywgJzgnLCAnYScsICdmJywgJ2YnLCAnaScsICduJywgJ2UnLCAnaScsICduJywKKyAgJ3YnLCAncScsICdiJywgJ18nLCAndicsICcxJywgJzYnLCAncScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdnJywgJ2YnLCAnMicsICdwJywKKyAgJzgnLCAnYScsICdmJywgJ2YnLCAnaScsICduJywgJ2UnLCAnaScsICduJywgJ3YnLCAncScsICdiJywgJ18nLCAndicsICczJywKKyAgJzInLCAncScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdnJywgJ2YnLCAnMicsICdwJywgJzgnLCAnYScsICdmJywgJ2YnLCAnaScsICduJywKKyAgJ2UnLCAnaScsICduJywgJ3YnLCAncScsICdiJywgJ18nLCAndicsICc2JywgJzQnLCAncScsICdpJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdnJywKKyAgJ2YnLCAnMicsICdwJywgJzgnLCAnYScsICdmJywgJ2YnLCAnaScsICduJywgJ2UnLCAncScsICdiJywgJ18nLCAndicsICcxJywKKyAgJzYnLCAncScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdnJywgJ2YnLCAnMicsICdwJywgJzgnLCAnYScsICdmJywgJ2YnLCAnaScsICduJywKKyAgJ2UnLCAncScsICdiJywgJ18nLCAndicsICczJywgJzInLCAncScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdnJywgJ2YnLCAnMicsICdwJywKKyAgJzgnLCAnYScsICdmJywgJ2YnLCAnaScsICduJywgJ2UnLCAncScsICdiJywgJ18nLCAndicsICc2JywgJzQnLCAncScsICdpJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdnJywgJ2YnLCAnMicsICdwJywgJzgnLCAnbScsICd1JywgJ2wnLCAnYicsICdfJywgJ3YnLCAnMScsICc2JywKKyAgJ3EnLCAnaScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAnZycsICdmJywgJzInLCAncCcsICc4JywgJ20nLCAndScsICdsJywgJ2InLCAnXycsICd2JywKKyAgJzMnLCAnMicsICdxJywgJ2knLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywKKyAgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ2cnLCAnZicsICcyJywgJ3AnLCAnOCcsICdtJywgJ3UnLCAnbCcsICdiJywKKyAgJ18nLCAndicsICc2JywgJzQnLCAncScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndycsICdyJywgJ2YnLCAncycsICdiJywgJ2EnLCAncycsICdlJywKKyAgJzMnLCAnMicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3cnLCAncicsICdmJywgJ3MnLCAnYicsICdhJywgJ3MnLCAnZScsICc2JywgJzQnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd3JywKKyAgJ3InLCAnZycsICdzJywgJ2InLCAnYScsICdzJywgJ2UnLCAnMycsICcyJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndycsICdyJywgJ2cnLCAncycsICdiJywKKyAgJ2EnLCAncycsICdlJywgJzYnLCAnNCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3cnLCAncicsICdwJywgJ2snLCAncicsICd1JywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndycsICdyJywKKyAgJ3MnLCAncycsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndycsICdyJywgJ3MnLCAncycsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndycsICdyJywgJ3UnLCAncycsICdzJywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd3JywgJ3InLCAndScsICdzJywgJ3MnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3gnLCAnYScsICdiJywgJ28nLCAncicsICd0JywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAneCcsICdiJywgJ2UnLCAnZycsICdpJywgJ24nLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd4JywgJ2UnLCAnbicsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywKKyAgJ3InLCAnYycsICd6JywgJ3AnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdyJywgJ2MnLCAneicsICdwJywgJ2QnLCAnMicsICc1JywKKyAgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd2JywgJ2YnLCAncicsICdjJywgJ3onLCAncCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdmJywgJ3InLCAnYycsICd6JywKKyAgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAnZicsICdyJywgJ2MnLCAneicsICdzJywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywKKyAgJ2YnLCAncicsICdjJywgJ3onLCAncycsICdzJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2MnLCAnbycsICdtJywgJ2InLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywKKyAgJ3AnLCAnYycsICdvJywgJ20nLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdjJywgJ28nLCAnbScsICdxJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywKKyAgJ2MnLCAnbycsICdtJywgJ3UnLCAnYicsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdjJywgJ28nLCAnbScsICd1JywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywKKyAgJ3AnLCAnYycsICdvJywgJ20nLCAndScsICdxJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2MnLCAnbycsICdtJywgJ3UnLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAncCcsICdjJywgJ28nLCAnbScsICd3JywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ2UnLCAncicsICdtJywgJ2knLCAnbCcsICcyJywKKyAgJ3AnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdlJywgJ3InLCAnbScsICdpJywgJ2wnLCAnMicsICdwJywgJ2QnLCAnMicsICc1JywKKyAgJzYnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd2JywgJ3AnLCAnZScsICdyJywgJ20nLCAnaScsICdsJywgJzInLCAncCcsICdzJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywKKyAgJ2UnLCAncicsICdtJywgJ2knLCAnbCcsICcyJywgJ3AnLCAncycsICcyJywgJzUnLCAnNicsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdoJywKKyAgJ2EnLCAnZCcsICdkJywgJ2InLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdoJywgJ2EnLCAnZCcsICdkJywgJ2InLCAncScsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAncCcsICdoJywgJ2EnLCAnZCcsICdkJywgJ2InLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdoJywgJ2EnLCAnZCcsICdkJywKKyAgJ2QnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdoJywgJ2EnLCAnZCcsICdkJywgJ3UnLCAnYicsICdkJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywKKyAgJ2gnLCAnYScsICdkJywgJ2QnLCAndScsICdiJywgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnaCcsICdhJywgJ2QnLCAnZCcsICd1JywKKyAgJ2InLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdoJywgJ2EnLCAnZCcsICdkJywgJ3UnLCAnZCcsICdxJywgJ1wwMDAnLCAnXycsICdfJywKKyAgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywKKyAgJ2gnLCAnYScsICdkJywgJ2QnLCAndScsICd3JywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnaCcsICdhJywgJ2QnLCAnZCcsICd1JywKKyAgJ3cnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdoJywgJ2EnLCAnZCcsICdkJywgJ3cnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdoJywKKyAgJ2EnLCAnZCcsICdkJywgJ3cnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdoJywgJ3MnLCAndScsICdiJywgJ2InLCAndycsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAncCcsICdoJywgJ3MnLCAndScsICdiJywgJ2QnLCAncScsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdoJywgJ3MnLCAndScsICdiJywKKyAgJ3cnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdtJywgJ2EnLCAnYycsICdzJywgJ2QnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdtJywKKyAgJ2EnLCAnYycsICdzJywgJ2QnLCAncScsICdoJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ20nLCAnYScsICdjJywgJ3MnLCAnZCcsICdxJywKKyAgJ2wnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd2JywgJ3AnLCAnbScsICdhJywgJ2MnLCAncycsICdzJywgJ2QnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdtJywKKyAgJ2EnLCAnYycsICdzJywgJ3MnLCAnZCcsICdxJywgJ2gnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnbScsICdhJywgJ2MnLCAncycsICdzJywKKyAgJ2QnLCAncScsICdsJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywKKyAgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ20nLCAnYScsICdjJywgJ3MnLCAncycsICd3JywgJ2QnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywKKyAgJ3AnLCAnbScsICdhJywgJ2MnLCAncycsICdzJywgJ3cnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdtJywgJ2EnLCAnYycsICdzJywKKyAgJ3cnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdtJywgJ2EnLCAnYycsICdzJywgJ3cnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdtJywKKyAgJ2EnLCAnZCcsICdjJywgJ3MnLCAncycsICd3JywgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAnbScsICdhJywgJ2QnLCAnYycsICdzJywKKyAgJ3cnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywKKyAgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdwJywgJ2UnLCAncicsICdtJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3InLCAnbycsICd0JywKKyAgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd2JywgJ3AnLCAncicsICdvJywgJ3QnLCAnYicsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3InLCAnbycsICd0JywKKyAgJ2QnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd2JywgJ3AnLCAncicsICdvJywgJ3QnLCAnZCcsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3InLCAnbycsICd0JywKKyAgJ3EnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd2JywgJ3AnLCAncicsICdvJywgJ3QnLCAncScsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3InLCAnbycsICd0JywKKyAgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd2JywgJ3AnLCAncicsICdvJywgJ3QnLCAndycsICdpJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywKKyAgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICdhJywKKyAgJ2InLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywKKyAgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ2EnLCAnZCcsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywKKyAgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3YnLCAncCcsICdzJywgJ2gnLCAnYScsICdxJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywKKyAgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICdhJywgJ3cnLCAnXDAwMCcsICdfJywgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywKKyAgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywgJ3AnLCAncycsICdoJywgJ2wnLCAnYicsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywKKyAgJ3YnLCAncCcsICdzJywgJ2gnLCAnbCcsICdkJywgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywKKyAgJ24nLCAnXycsICdpJywgJ2EnLCAnMycsICcyJywgJ18nLCAndicsICdwJywgJ3MnLCAnaCcsICdsJywgJ3EnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2knLCAnYScsICczJywgJzInLCAnXycsICd2JywKKyAgJ3AnLCAncycsICdoJywgJ2wnLCAndycsICdcMDAwJywgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywKKyAgJ18nLCAnaScsICdhJywgJzMnLCAnMicsICdfJywgJ3gnLCAndCcsICdlJywgJ3MnLCAndCcsICdcMDAwJywgJ18nLCAnXycsICdiJywKKyAgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnYicsICdpJywgJ3QnLCAncicsICdlJywgJ3YnLCAnXDAwMCcsICdfJywKKyAgJ18nLCAnYicsICd1JywgJ2knLCAnbCcsICd0JywgJ2knLCAnbicsICdfJywgJ2cnLCAnZScsICd0JywgJ2knLCAnZCcsICdcMDAwJywKKyAgJ18nLCAnXycsICdiJywgJ3UnLCAnaScsICdsJywgJ3QnLCAnaScsICduJywgJ18nLCAnZycsICdlJywgJ3QnLCAncCcsICdzJywKKyAgJ1wwMDAnLCAnXycsICdfJywgJ2InLCAndScsICdpJywgJ2wnLCAndCcsICdpJywgJ24nLCAnXycsICdzJywgJ2UnLCAndCcsICdwJywKKyAgJ3MnLCAnXDAwMCcsCisgIH07CisKKyAgc3RydWN0IEJ1aWx0aW5FbnRyeSB7CisgICAgSW50cmluc2ljOjpJRCBJbnRyaW5JRDsKKyAgICB1bnNpZ25lZCBTdHJUYWJPZmZzZXQ7CisgICAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAmQnVpbHRpbk5hbWVzW1N0clRhYk9mZnNldF07CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3I8KFN0cmluZ1JlZiBSSFMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdHJuY21wKGdldE5hbWUoKSwgUkhTLmRhdGEoKSwgUkhTLnNpemUoKSkgPCAwOworICAgIH0KKyAgfTsKKyAgU3RyaW5nUmVmIFRhcmdldFByZWZpeChUYXJnZXRQcmVmaXhTdHIpOworCisgIC8qIFRhcmdldCBJbmRlcGVuZGVudCBCdWlsdGlucyAqLyB7CisgICAgc3RhdGljIGNvbnN0IEJ1aWx0aW5FbnRyeSBOYW1lc1tdID0geworICAgICAge0ludHJpbnNpYzo6YWRqdXN0X3RyYW1wb2xpbmUsIDB9LCAvLyBfX2J1aWx0aW5fYWRqdXN0X3RyYW1wb2xpbmUKKyAgICAgIHtJbnRyaW5zaWM6OmRlYnVndHJhcCwgMjh9LCAvLyBfX2J1aWx0aW5fZGVidWd0cmFwCisgICAgICB7SW50cmluc2ljOjpmbHRfcm91bmRzLCA3MH0sIC8vIF9fYnVpbHRpbl9mbHRfcm91bmRzCisgICAgICB7SW50cmluc2ljOjppbml0X3RyYW1wb2xpbmUsIDkxfSwgLy8gX19idWlsdGluX2luaXRfdHJhbXBvbGluZQorICAgICAge0ludHJpbnNpYzo6b2JqZWN0c2l6ZSwgMTE3fSwgLy8gX19idWlsdGluX29iamVjdF9zaXplCisgICAgICB7SW50cmluc2ljOjpzdGFja3Jlc3RvcmUsIDEzOX0sIC8vIF9fYnVpbHRpbl9zdGFja19yZXN0b3JlCisgICAgICB7SW50cmluc2ljOjpzdGFja3NhdmUsIDE2M30sIC8vIF9fYnVpbHRpbl9zdGFja19zYXZlCisgICAgICB7SW50cmluc2ljOjp0aHJlYWRfcG9pbnRlciwgMTg0fSwgLy8gX19idWlsdGluX3RocmVhZF9wb2ludGVyCisgICAgICB7SW50cmluc2ljOjp0cmFwLCAyMDl9LCAvLyBfX2J1aWx0aW5fdHJhcAorICAgICAge0ludHJpbnNpYzo6ZWhfdW53aW5kX2luaXQsIDQ4fSwgLy8gX19idWlsdGluX3Vud2luZF9pbml0CisgICAgfTsKKyAgICBhdXRvIEkgPSBzdGQ6Omxvd2VyX2JvdW5kKHN0ZDo6YmVnaW4oTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjplbmQoTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbHRpbk5hbWVTdHIpOworICAgIGlmIChJICE9IHN0ZDo6ZW5kKE5hbWVzKSAmJgorICAgICAgICBJLT5nZXROYW1lKCkgPT0gQnVpbHRpbk5hbWVTdHIpCisgICAgICByZXR1cm4gSS0+SW50cmluSUQ7CisgIH0KKyAgaWYgKFRhcmdldFByZWZpeCA9PSAiYWFyY2g2NCIpIHsKKyAgICBzdGF0aWMgY29uc3QgQnVpbHRpbkVudHJ5IGFhcmNoNjROYW1lc1tdID0geworICAgICAge0ludHJpbnNpYzo6YWFyY2g2NF9kbWIsIDIyNH0sIC8vIF9fYnVpbHRpbl9hcm1fZG1iCisgICAgICB7SW50cmluc2ljOjphYXJjaDY0X2RzYiwgMjQyfSwgLy8gX19idWlsdGluX2FybV9kc2IKKyAgICAgIHtJbnRyaW5zaWM6OmFhcmNoNjRfaXNiLCAyNjB9LCAvLyBfX2J1aWx0aW5fYXJtX2lzYgorICAgIH07CisgICAgYXV0byBJID0gc3RkOjpsb3dlcl9ib3VuZChzdGQ6OmJlZ2luKGFhcmNoNjROYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZChhYXJjaDY0TmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbHRpbk5hbWVTdHIpOworICAgIGlmIChJICE9IHN0ZDo6ZW5kKGFhcmNoNjROYW1lcykgJiYKKyAgICAgICAgSS0+Z2V0TmFtZSgpID09IEJ1aWx0aW5OYW1lU3RyKQorICAgICAgcmV0dXJuIEktPkludHJpbklEOworICB9CisgIGlmIChUYXJnZXRQcmVmaXggPT0gImFtZGdjbiIpIHsKKyAgICBzdGF0aWMgY29uc3QgQnVpbHRpbkVudHJ5IGFtZGdjbk5hbWVzW10gPSB7CisgICAgICB7SW50cmluc2ljOjphbWRnY25fYnVmZmVyX3diaW52bDEsIDI3OH0sIC8vIF9fYnVpbHRpbl9hbWRnY25fYnVmZmVyX3diaW52bDEKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9idWZmZXJfd2JpbnZsMV9zYywgMzEwfSwgLy8gX19idWlsdGluX2FtZGdjbl9idWZmZXJfd2JpbnZsMV9zYworICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX2J1ZmZlcl93YmludmwxX3ZvbCwgMzQ1fSwgLy8gX19idWlsdGluX2FtZGdjbl9idWZmZXJfd2JpbnZsMV92b2wKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9jdWJlaWQsIDM4MX0sIC8vIF9fYnVpbHRpbl9hbWRnY25fY3ViZWlkCisgICAgICB7SW50cmluc2ljOjphbWRnY25fY3ViZW1hLCA0MDV9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX2N1YmVtYQorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX2N1YmVzYywgNDI5fSwgLy8gX19idWlsdGluX2FtZGdjbl9jdWJlc2MKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9jdWJldGMsIDQ1M30sIC8vIF9fYnVpbHRpbl9hbWRnY25fY3ViZXRjCisgICAgICB7SW50cmluc2ljOjphbWRnY25fY3Z0X3BrX3U4X2YzMiwgNDc3fSwgLy8gX19idWlsdGluX2FtZGdjbl9jdnRfcGtfdThfZjMyCisgICAgICB7SW50cmluc2ljOjphbWRnY25fZGlzcGF0Y2hfaWQsIDUwOH0sIC8vIF9fYnVpbHRpbl9hbWRnY25fZGlzcGF0Y2hfaWQKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9kaXNwYXRjaF9wdHIsIDUzN30sIC8vIF9fYnVpbHRpbl9hbWRnY25fZGlzcGF0Y2hfcHRyCisgICAgICB7SW50cmluc2ljOjphbWRnY25fZHNfYnBlcm11dGUsIDU2N30sIC8vIF9fYnVpbHRpbl9hbWRnY25fZHNfYnBlcm11dGUKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9kc19mYWRkLCA1OTZ9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX2RzX2ZhZGQKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9kc19mbWF4LCA2MjF9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX2RzX2ZtYXgKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9kc19mbWluLCA2NDZ9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX2RzX2ZtaW4KKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9kc19wZXJtdXRlLCA2NzF9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX2RzX3Blcm11dGUKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9kc19zd2l6emxlLCA2OTl9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX2RzX3N3aXp6bGUKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9mbWVkMywgNzI3fSwgLy8gX19idWlsdGluX2FtZGdjbl9mbWVkMworICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX2ZtdWxfbGVnYWN5LCA3NTB9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX2ZtdWxfbGVnYWN5CisgICAgICB7SW50cmluc2ljOjphbWRnY25fZ3JvdXBzdGF0aWNzaXplLCA3Nzl9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX2dyb3Vwc3RhdGljc2l6ZQorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX2ltcGxpY2l0X2J1ZmZlcl9wdHIsIDgxMn0sIC8vIF9fYnVpbHRpbl9hbWRnY25faW1wbGljaXRfYnVmZmVyX3B0cgorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX2ltcGxpY2l0YXJnX3B0ciwgODQ5fSwgLy8gX19idWlsdGluX2FtZGdjbl9pbXBsaWNpdGFyZ19wdHIKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9pbnRlcnBfbW92LCA4ODJ9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX2ludGVycF9tb3YKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9pbnRlcnBfcDEsIDkxMH0sIC8vIF9fYnVpbHRpbl9hbWRnY25faW50ZXJwX3AxCisgICAgICB7SW50cmluc2ljOjphbWRnY25faW50ZXJwX3AyLCA5Mzd9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX2ludGVycF9wMgorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX2tlcm5hcmdfc2VnbWVudF9wdHIsIDk2NH0sIC8vIF9fYnVpbHRpbl9hbWRnY25fa2VybmFyZ19zZWdtZW50X3B0cgorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX2xlcnAsIDEwMDF9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX2xlcnAKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9tYmNudF9oaSwgMTAyM30sIC8vIF9fYnVpbHRpbl9hbWRnY25fbWJjbnRfaGkKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9tYmNudF9sbywgMTA0OX0sIC8vIF9fYnVpbHRpbl9hbWRnY25fbWJjbnRfbG8KKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9tcXNhZF9wa191MTZfdTgsIDEwNzV9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX21xc2FkX3BrX3UxNl91OAorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX21xc2FkX3UzMl91OCwgMTEwOH0sIC8vIF9fYnVpbHRpbl9hbWRnY25fbXFzYWRfdTMyX3U4CisgICAgICB7SW50cmluc2ljOjphbWRnY25fbXNhZF91OCwgMTEzOH0sIC8vIF9fYnVpbHRpbl9hbWRnY25fbXNhZF91OAorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX3FzYWRfcGtfdTE2X3U4LCAxMTYzfSwgLy8gX19idWlsdGluX2FtZGdjbl9xc2FkX3BrX3UxNl91OAorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX3F1ZXVlX3B0ciwgMTE5NX0sIC8vIF9fYnVpbHRpbl9hbWRnY25fcXVldWVfcHRyCisgICAgICB7SW50cmluc2ljOjphbWRnY25fcmNwX2xlZ2FjeSwgMTIyMn0sIC8vIF9fYnVpbHRpbl9hbWRnY25fcmNwX2xlZ2FjeQorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX3JlYWRmaXJzdGxhbmUsIDEyNTB9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX3JlYWRmaXJzdGxhbmUKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9yZWFkbGFuZSwgMTI4MX0sIC8vIF9fYnVpbHRpbl9hbWRnY25fcmVhZGxhbmUKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9yc3FfbGVnYWN5LCAxMzA3fSwgLy8gX19idWlsdGluX2FtZGdjbl9yc3FfbGVnYWN5CisgICAgICB7SW50cmluc2ljOjphbWRnY25fc19iYXJyaWVyLCAxMzM1fSwgLy8gX19idWlsdGluX2FtZGdjbl9zX2JhcnJpZXIKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9zX2RjYWNoZV9pbnYsIDEzNjJ9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX3NfZGNhY2hlX2ludgorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX3NfZGNhY2hlX2ludl92b2wsIDEzOTJ9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX3NfZGNhY2hlX2ludl92b2wKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9zX2RjYWNoZV93YiwgMTQyNn0sIC8vIF9fYnVpbHRpbl9hbWRnY25fc19kY2FjaGVfd2IKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9zX2RjYWNoZV93Yl92b2wsIDE0NTV9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX3NfZGNhY2hlX3diX3ZvbAorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX3NfZGVjcGVyZmxldmVsLCAxNDg4fSwgLy8gX19idWlsdGluX2FtZGdjbl9zX2RlY3BlcmZsZXZlbAorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX3NfZ2V0cGMsIDE1MjB9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX3NfZ2V0cGMKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9zX2dldHJlZywgMTU0NX0sIC8vIF9fYnVpbHRpbl9hbWRnY25fc19nZXRyZWcKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9zX2luY3BlcmZsZXZlbCwgMTU3MX0sIC8vIF9fYnVpbHRpbl9hbWRnY25fc19pbmNwZXJmbGV2ZWwKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9zX21lbXJlYWx0aW1lLCAxNjAzfSwgLy8gX19idWlsdGluX2FtZGdjbl9zX21lbXJlYWx0aW1lCisgICAgICB7SW50cmluc2ljOjphbWRnY25fc19tZW10aW1lLCAxNjM0fSwgLy8gX19idWlsdGluX2FtZGdjbl9zX21lbXRpbWUKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9zX3NlbmRtc2csIDE2NjF9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX3Nfc2VuZG1zZworICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX3Nfc2VuZG1zZ2hhbHQsIDE2ODh9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX3Nfc2VuZG1zZ2hhbHQKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9zX3NsZWVwLCAxNzE5fSwgLy8gX19idWlsdGluX2FtZGdjbl9zX3NsZWVwCisgICAgICB7SW50cmluc2ljOjphbWRnY25fc193YWl0Y250LCAxNzQ0fSwgLy8gX19idWlsdGluX2FtZGdjbl9zX3dhaXRjbnQKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9zYWRfaGlfdTgsIDE3NzF9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX3NhZF9oaV91OAorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX3NhZF91MTYsIDE3OTh9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX3NhZF91MTYKKyAgICAgIHtJbnRyaW5zaWM6OmFtZGdjbl9zYWRfdTgsIDE4MjN9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX3NhZF91OAorICAgICAge0ludHJpbnNpYzo6YW1kZ2NuX3dhdmVfYmFycmllciwgMTg0N30sIC8vIF9fYnVpbHRpbl9hbWRnY25fd2F2ZV9iYXJyaWVyCisgICAgICB7SW50cmluc2ljOjphbWRnY25fd29ya2dyb3VwX2lkX3gsIDE4Nzd9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX3dvcmtncm91cF9pZF94CisgICAgICB7SW50cmluc2ljOjphbWRnY25fd29ya2dyb3VwX2lkX3ksIDE5MDl9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX3dvcmtncm91cF9pZF95CisgICAgICB7SW50cmluc2ljOjphbWRnY25fd29ya2dyb3VwX2lkX3osIDE5NDF9LCAvLyBfX2J1aWx0aW5fYW1kZ2NuX3dvcmtncm91cF9pZF96CisgICAgICB7SW50cmluc2ljOjphbWRnY25fd3JpdGVsYW5lLCAxOTczfSwgLy8gX19idWlsdGluX2FtZGdjbl93cml0ZWxhbmUKKyAgICB9OworICAgIGF1dG8gSSA9IHN0ZDo6bG93ZXJfYm91bmQoc3RkOjpiZWdpbihhbWRnY25OYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZChhbWRnY25OYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsdGluTmFtZVN0cik7CisgICAgaWYgKEkgIT0gc3RkOjplbmQoYW1kZ2NuTmFtZXMpICYmCisgICAgICAgIEktPmdldE5hbWUoKSA9PSBCdWlsdGluTmFtZVN0cikKKyAgICAgIHJldHVybiBJLT5JbnRyaW5JRDsKKyAgfQorICBpZiAoVGFyZ2V0UHJlZml4ID09ICJhcm0iKSB7CisgICAgc3RhdGljIGNvbnN0IEJ1aWx0aW5FbnRyeSBhcm1OYW1lc1tdID0geworICAgICAge0ludHJpbnNpYzo6YXJtX2NkcCwgMjAwMH0sIC8vIF9fYnVpbHRpbl9hcm1fY2RwCisgICAgICB7SW50cmluc2ljOjphcm1fY2RwMiwgMjAxOH0sIC8vIF9fYnVpbHRpbl9hcm1fY2RwMgorICAgICAge0ludHJpbnNpYzo6YXJtX2RtYiwgMjI0fSwgLy8gX19idWlsdGluX2FybV9kbWIKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9kc2IsIDI0Mn0sIC8vIF9fYnVpbHRpbl9hcm1fZHNiCisgICAgICB7SW50cmluc2ljOjphcm1fZ2V0X2Zwc2NyLCAyMDM3fSwgLy8gX19idWlsdGluX2FybV9nZXRfZnBzY3IKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9pc2IsIDI2MH0sIC8vIF9fYnVpbHRpbl9hcm1faXNiCisgICAgICB7SW50cmluc2ljOjphcm1fbGRjLCAyMDYxfSwgLy8gX19idWlsdGluX2FybV9sZGMKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9sZGMyLCAyMDc5fSwgLy8gX19idWlsdGluX2FybV9sZGMyCisgICAgICB7SW50cmluc2ljOjphcm1fbGRjMmwsIDIwOTh9LCAvLyBfX2J1aWx0aW5fYXJtX2xkYzJsCisgICAgICB7SW50cmluc2ljOjphcm1fbGRjbCwgMjExOH0sIC8vIF9fYnVpbHRpbl9hcm1fbGRjbAorICAgICAge0ludHJpbnNpYzo6YXJtX21jciwgMjEzN30sIC8vIF9fYnVpbHRpbl9hcm1fbWNyCisgICAgICB7SW50cmluc2ljOjphcm1fbWNyMiwgMjE1NX0sIC8vIF9fYnVpbHRpbl9hcm1fbWNyMgorICAgICAge0ludHJpbnNpYzo6YXJtX21yYywgMjE3NH0sIC8vIF9fYnVpbHRpbl9hcm1fbXJjCisgICAgICB7SW50cmluc2ljOjphcm1fbXJjMiwgMjE5Mn0sIC8vIF9fYnVpbHRpbl9hcm1fbXJjMgorICAgICAge0ludHJpbnNpYzo6YXJtX3FhZGQsIDIyMTF9LCAvLyBfX2J1aWx0aW5fYXJtX3FhZGQKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9xYWRkMTYsIDIyMzB9LCAvLyBfX2J1aWx0aW5fYXJtX3FhZGQxNgorICAgICAge0ludHJpbnNpYzo6YXJtX3FhZGQ4LCAyMjUxfSwgLy8gX19idWlsdGluX2FybV9xYWRkOAorICAgICAge0ludHJpbnNpYzo6YXJtX3Fhc3gsIDIyNzF9LCAvLyBfX2J1aWx0aW5fYXJtX3Fhc3gKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9xc2F4LCAyMjkwfSwgLy8gX19idWlsdGluX2FybV9xc2F4CisgICAgICB7SW50cmluc2ljOjphcm1fcXN1YiwgMjMwOX0sIC8vIF9fYnVpbHRpbl9hcm1fcXN1YgorICAgICAge0ludHJpbnNpYzo6YXJtX3FzdWIxNiwgMjMyOH0sIC8vIF9fYnVpbHRpbl9hcm1fcXN1YjE2CisgICAgICB7SW50cmluc2ljOjphcm1fcXN1YjgsIDIzNDl9LCAvLyBfX2J1aWx0aW5fYXJtX3FzdWI4CisgICAgICB7SW50cmluc2ljOjphcm1fc2FkZDE2LCAyMzY5fSwgLy8gX19idWlsdGluX2FybV9zYWRkMTYKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zYWRkOCwgMjM5MH0sIC8vIF9fYnVpbHRpbl9hcm1fc2FkZDgKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zYXN4LCAyNDEwfSwgLy8gX19idWlsdGluX2FybV9zYXN4CisgICAgICB7SW50cmluc2ljOjphcm1fc2VsLCAyNDI5fSwgLy8gX19idWlsdGluX2FybV9zZWwKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zZXRfZnBzY3IsIDI0NDd9LCAvLyBfX2J1aWx0aW5fYXJtX3NldF9mcHNjcgorICAgICAge0ludHJpbnNpYzo6YXJtX3NoYWRkMTYsIDI0NzF9LCAvLyBfX2J1aWx0aW5fYXJtX3NoYWRkMTYKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zaGFkZDgsIDI0OTN9LCAvLyBfX2J1aWx0aW5fYXJtX3NoYWRkOAorICAgICAge0ludHJpbnNpYzo6YXJtX3NoYXN4LCAyNTE0fSwgLy8gX19idWlsdGluX2FybV9zaGFzeAorICAgICAge0ludHJpbnNpYzo6YXJtX3Noc2F4LCAyNTM0fSwgLy8gX19idWlsdGluX2FybV9zaHNheAorICAgICAge0ludHJpbnNpYzo6YXJtX3Noc3ViMTYsIDI1NTR9LCAvLyBfX2J1aWx0aW5fYXJtX3Noc3ViMTYKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zaHN1YjgsIDI1NzZ9LCAvLyBfX2J1aWx0aW5fYXJtX3Noc3ViOAorICAgICAge0ludHJpbnNpYzo6YXJtX3NtbGFiYiwgMjU5N30sIC8vIF9fYnVpbHRpbl9hcm1fc21sYWJiCisgICAgICB7SW50cmluc2ljOjphcm1fc21sYWJ0LCAyNjE4fSwgLy8gX19idWlsdGluX2FybV9zbWxhYnQKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zbWxhZCwgMjYzOX0sIC8vIF9fYnVpbHRpbl9hcm1fc21sYWQKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zbWxhZHgsIDI2NTl9LCAvLyBfX2J1aWx0aW5fYXJtX3NtbGFkeAorICAgICAge0ludHJpbnNpYzo6YXJtX3NtbGFsZCwgMjY4MH0sIC8vIF9fYnVpbHRpbl9hcm1fc21sYWxkCisgICAgICB7SW50cmluc2ljOjphcm1fc21sYWxkeCwgMjcwMX0sIC8vIF9fYnVpbHRpbl9hcm1fc21sYWxkeAorICAgICAge0ludHJpbnNpYzo6YXJtX3NtbGF0YiwgMjcyM30sIC8vIF9fYnVpbHRpbl9hcm1fc21sYXRiCisgICAgICB7SW50cmluc2ljOjphcm1fc21sYXR0LCAyNzQ0fSwgLy8gX19idWlsdGluX2FybV9zbWxhdHQKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zbWxhd2IsIDI3NjV9LCAvLyBfX2J1aWx0aW5fYXJtX3NtbGF3YgorICAgICAge0ludHJpbnNpYzo6YXJtX3NtbGF3dCwgMjc4Nn0sIC8vIF9fYnVpbHRpbl9hcm1fc21sYXd0CisgICAgICB7SW50cmluc2ljOjphcm1fc21sc2QsIDI4MDd9LCAvLyBfX2J1aWx0aW5fYXJtX3NtbHNkCisgICAgICB7SW50cmluc2ljOjphcm1fc21sc2R4LCAyODI3fSwgLy8gX19idWlsdGluX2FybV9zbWxzZHgKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zbWxzbGQsIDI4NDh9LCAvLyBfX2J1aWx0aW5fYXJtX3NtbHNsZAorICAgICAge0ludHJpbnNpYzo6YXJtX3NtbHNsZHgsIDI4Njl9LCAvLyBfX2J1aWx0aW5fYXJtX3NtbHNsZHgKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zbXVhZCwgMjg5MX0sIC8vIF9fYnVpbHRpbl9hcm1fc211YWQKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zbXVhZHgsIDI5MTF9LCAvLyBfX2J1aWx0aW5fYXJtX3NtdWFkeAorICAgICAge0ludHJpbnNpYzo6YXJtX3NtdWxiYiwgMjkzMn0sIC8vIF9fYnVpbHRpbl9hcm1fc211bGJiCisgICAgICB7SW50cmluc2ljOjphcm1fc211bGJ0LCAyOTUzfSwgLy8gX19idWlsdGluX2FybV9zbXVsYnQKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zbXVsdGIsIDI5NzR9LCAvLyBfX2J1aWx0aW5fYXJtX3NtdWx0YgorICAgICAge0ludHJpbnNpYzo6YXJtX3NtdWx0dCwgMjk5NX0sIC8vIF9fYnVpbHRpbl9hcm1fc211bHR0CisgICAgICB7SW50cmluc2ljOjphcm1fc211bHdiLCAzMDE2fSwgLy8gX19idWlsdGluX2FybV9zbXVsd2IKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zbXVsd3QsIDMwMzd9LCAvLyBfX2J1aWx0aW5fYXJtX3NtdWx3dAorICAgICAge0ludHJpbnNpYzo6YXJtX3NtdXNkLCAzMDU4fSwgLy8gX19idWlsdGluX2FybV9zbXVzZAorICAgICAge0ludHJpbnNpYzo6YXJtX3NtdXNkeCwgMzA3OH0sIC8vIF9fYnVpbHRpbl9hcm1fc211c2R4CisgICAgICB7SW50cmluc2ljOjphcm1fc3NhdCwgMzA5OX0sIC8vIF9fYnVpbHRpbl9hcm1fc3NhdAorICAgICAge0ludHJpbnNpYzo6YXJtX3NzYXQxNiwgMzExOH0sIC8vIF9fYnVpbHRpbl9hcm1fc3NhdDE2CisgICAgICB7SW50cmluc2ljOjphcm1fc3NheCwgMzEzOX0sIC8vIF9fYnVpbHRpbl9hcm1fc3NheAorICAgICAge0ludHJpbnNpYzo6YXJtX3NzdWIxNiwgMzE1OH0sIC8vIF9fYnVpbHRpbl9hcm1fc3N1YjE2CisgICAgICB7SW50cmluc2ljOjphcm1fc3N1YjgsIDMxNzl9LCAvLyBfX2J1aWx0aW5fYXJtX3NzdWI4CisgICAgICB7SW50cmluc2ljOjphcm1fc3RjLCAzMTk5fSwgLy8gX19idWlsdGluX2FybV9zdGMKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zdGMyLCAzMjE3fSwgLy8gX19idWlsdGluX2FybV9zdGMyCisgICAgICB7SW50cmluc2ljOjphcm1fc3RjMmwsIDMyMzZ9LCAvLyBfX2J1aWx0aW5fYXJtX3N0YzJsCisgICAgICB7SW50cmluc2ljOjphcm1fc3RjbCwgMzI1Nn0sIC8vIF9fYnVpbHRpbl9hcm1fc3RjbAorICAgICAge0ludHJpbnNpYzo6YXJtX3N4dGFiMTYsIDMyNzV9LCAvLyBfX2J1aWx0aW5fYXJtX3N4dGFiMTYKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9zeHRiMTYsIDMyOTd9LCAvLyBfX2J1aWx0aW5fYXJtX3N4dGIxNgorICAgICAge0ludHJpbnNpYzo6YXJtX3VhZGQxNiwgMzMxOH0sIC8vIF9fYnVpbHRpbl9hcm1fdWFkZDE2CisgICAgICB7SW50cmluc2ljOjphcm1fdWFkZDgsIDMzMzl9LCAvLyBfX2J1aWx0aW5fYXJtX3VhZGQ4CisgICAgICB7SW50cmluc2ljOjphcm1fdWFzeCwgMzM1OX0sIC8vIF9fYnVpbHRpbl9hcm1fdWFzeAorICAgICAge0ludHJpbnNpYzo6YXJtX3VoYWRkMTYsIDMzNzh9LCAvLyBfX2J1aWx0aW5fYXJtX3VoYWRkMTYKKyAgICAgIHtJbnRyaW5zaWM6OmFybV91aGFkZDgsIDM0MDB9LCAvLyBfX2J1aWx0aW5fYXJtX3VoYWRkOAorICAgICAge0ludHJpbnNpYzo6YXJtX3VoYXN4LCAzNDIxfSwgLy8gX19idWlsdGluX2FybV91aGFzeAorICAgICAge0ludHJpbnNpYzo6YXJtX3Voc2F4LCAzNDQxfSwgLy8gX19idWlsdGluX2FybV91aHNheAorICAgICAge0ludHJpbnNpYzo6YXJtX3Voc3ViMTYsIDM0NjF9LCAvLyBfX2J1aWx0aW5fYXJtX3Voc3ViMTYKKyAgICAgIHtJbnRyaW5zaWM6OmFybV91aHN1YjgsIDM0ODN9LCAvLyBfX2J1aWx0aW5fYXJtX3Voc3ViOAorICAgICAge0ludHJpbnNpYzo6YXJtX3VxYWRkMTYsIDM1MDR9LCAvLyBfX2J1aWx0aW5fYXJtX3VxYWRkMTYKKyAgICAgIHtJbnRyaW5zaWM6OmFybV91cWFkZDgsIDM1MjZ9LCAvLyBfX2J1aWx0aW5fYXJtX3VxYWRkOAorICAgICAge0ludHJpbnNpYzo6YXJtX3VxYXN4LCAzNTQ3fSwgLy8gX19idWlsdGluX2FybV91cWFzeAorICAgICAge0ludHJpbnNpYzo6YXJtX3Vxc2F4LCAzNTY3fSwgLy8gX19idWlsdGluX2FybV91cXNheAorICAgICAge0ludHJpbnNpYzo6YXJtX3Vxc3ViMTYsIDM1ODd9LCAvLyBfX2J1aWx0aW5fYXJtX3Vxc3ViMTYKKyAgICAgIHtJbnRyaW5zaWM6OmFybV91cXN1YjgsIDM2MDl9LCAvLyBfX2J1aWx0aW5fYXJtX3Vxc3ViOAorICAgICAge0ludHJpbnNpYzo6YXJtX3VzYWQ4LCAzNjMwfSwgLy8gX19idWlsdGluX2FybV91c2FkOAorICAgICAge0ludHJpbnNpYzo6YXJtX3VzYWRhOCwgMzY1MH0sIC8vIF9fYnVpbHRpbl9hcm1fdXNhZGE4CisgICAgICB7SW50cmluc2ljOjphcm1fdXNhdCwgMzY3MX0sIC8vIF9fYnVpbHRpbl9hcm1fdXNhdAorICAgICAge0ludHJpbnNpYzo6YXJtX3VzYXQxNiwgMzY5MH0sIC8vIF9fYnVpbHRpbl9hcm1fdXNhdDE2CisgICAgICB7SW50cmluc2ljOjphcm1fdXNheCwgMzcxMX0sIC8vIF9fYnVpbHRpbl9hcm1fdXNheAorICAgICAge0ludHJpbnNpYzo6YXJtX3VzdWIxNiwgMzczMH0sIC8vIF9fYnVpbHRpbl9hcm1fdXN1YjE2CisgICAgICB7SW50cmluc2ljOjphcm1fdXN1YjgsIDM3NTF9LCAvLyBfX2J1aWx0aW5fYXJtX3VzdWI4CisgICAgICB7SW50cmluc2ljOjphcm1fdXh0YWIxNiwgMzc3MX0sIC8vIF9fYnVpbHRpbl9hcm1fdXh0YWIxNgorICAgICAge0ludHJpbnNpYzo6YXJtX3V4dGIxNiwgMzc5M30sIC8vIF9fYnVpbHRpbl9hcm1fdXh0YjE2CisgICAgfTsKKyAgICBhdXRvIEkgPSBzdGQ6Omxvd2VyX2JvdW5kKHN0ZDo6YmVnaW4oYXJtTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjplbmQoYXJtTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbHRpbk5hbWVTdHIpOworICAgIGlmIChJICE9IHN0ZDo6ZW5kKGFybU5hbWVzKSAmJgorICAgICAgICBJLT5nZXROYW1lKCkgPT0gQnVpbHRpbk5hbWVTdHIpCisgICAgICByZXR1cm4gSS0+SW50cmluSUQ7CisgIH0KKyAgaWYgKFRhcmdldFByZWZpeCA9PSAiYnBmIikgeworICAgIHN0YXRpYyBjb25zdCBCdWlsdGluRW50cnkgYnBmTmFtZXNbXSA9IHsKKyAgICAgIHtJbnRyaW5zaWM6OmJwZl9sb2FkX2J5dGUsIDM4MTR9LCAvLyBfX2J1aWx0aW5fYnBmX2xvYWRfYnl0ZQorICAgICAge0ludHJpbnNpYzo6YnBmX2xvYWRfaGFsZiwgMzgzOH0sIC8vIF9fYnVpbHRpbl9icGZfbG9hZF9oYWxmCisgICAgICB7SW50cmluc2ljOjpicGZfbG9hZF93b3JkLCAzODYyfSwgLy8gX19idWlsdGluX2JwZl9sb2FkX3dvcmQKKyAgICAgIHtJbnRyaW5zaWM6OmJwZl9wc2V1ZG8sIDM4ODZ9LCAvLyBfX2J1aWx0aW5fYnBmX3BzZXVkbworICAgIH07CisgICAgYXV0byBJID0gc3RkOjpsb3dlcl9ib3VuZChzdGQ6OmJlZ2luKGJwZk5hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZW5kKGJwZk5hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0aW5OYW1lU3RyKTsKKyAgICBpZiAoSSAhPSBzdGQ6OmVuZChicGZOYW1lcykgJiYKKyAgICAgICAgSS0+Z2V0TmFtZSgpID09IEJ1aWx0aW5OYW1lU3RyKQorICAgICAgcmV0dXJuIEktPkludHJpbklEOworICB9CisgIGlmIChUYXJnZXRQcmVmaXggPT0gImhleGFnb24iKSB7CisgICAgc3RhdGljIGNvbnN0IEJ1aWx0aW5FbnRyeSBoZXhhZ29uTmFtZXNbXSA9IHsKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfYWJzLCAzOTA3fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfYWJzCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2Fic3AsIDM5MzJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9hYnNwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2Fic3NhdCwgMzk1OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2Fic3NhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9hZGQsIDM5ODZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfYWRkaF9oMTZfaGgsIDQwMTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRoX2gxNl9oaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9hZGRoX2gxNl9obCwgNDA0NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2FkZGhfaDE2X2hsCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2FkZGhfaDE2X2xoLCA0MDc3fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfYWRkaF9oMTZfbGgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfYWRkaF9oMTZfbGwsIDQxMTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRoX2gxNl9sbAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9hZGRoX2gxNl9zYXRfaGgsIDQxNDN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRoX2gxNl9zYXRfaGgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfYWRkaF9oMTZfc2F0X2hsLCA0MTgwfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfYWRkaF9oMTZfc2F0X2hsCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2FkZGhfaDE2X3NhdF9saCwgNDIxN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2FkZGhfaDE2X3NhdF9saAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9hZGRoX2gxNl9zYXRfbGwsIDQyNTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRoX2gxNl9zYXRfbGwKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfYWRkaF9sMTZfaGwsIDQyOTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRoX2wxNl9obAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9hZGRoX2wxNl9sbCwgNDMyNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2FkZGhfbDE2X2xsCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2FkZGhfbDE2X3NhdF9obCwgNDM1N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2FkZGhfbDE2X3NhdF9obAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9hZGRoX2wxNl9zYXRfbGwsIDQzOTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9hZGRoX2wxNl9zYXRfbGwKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfYWRkaSwgNDQzMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2FkZGkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfYWRkcCwgNDQ1N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2FkZHAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfYWRkcHNhdCwgNDQ4M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2FkZHBzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfYWRkc2F0LCA0NTEyfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfYWRkc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2FkZHNwLCA0NTQwfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfYWRkc3AKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfYW5kLCA0NTY3fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfYW5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2FuZGlyLCA0NTkyfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfYW5kaXIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfYW5kcCwgNDYxOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2FuZHAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfYXNsaCwgNDY0NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2FzbGgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfYXNyaCwgNDY3MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2FzcmgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfY29tYmluZV9oaCwgNDY5N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2NvbWJpbmVfaGgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfY29tYmluZV9obCwgNDcyOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2NvbWJpbmVfaGwKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfY29tYmluZV9saCwgNDc2MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2NvbWJpbmVfbGgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfY29tYmluZV9sbCwgNDc5M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX2NvbWJpbmVfbGwKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfY29tYmluZWlpLCA0ODI1fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfY29tYmluZWlpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX2NvbWJpbmV3LCA0ODU2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfY29tYmluZXcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfbWF4LCA0ODg2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfbWF4CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX21heHAsIDQ5MTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9tYXhwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX21heHUsIDQ5Mzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9tYXh1CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX21heHVwLCA0OTYzfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfbWF4dXAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfbWluLCA0OTkwfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfbWluCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX21pbnAsIDUwMTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9taW5wCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX21pbnUsIDUwNDF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9taW51CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX21pbnVwLCA1MDY3fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfbWludXAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfbmVnLCA1MDk0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfbmVnCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX25lZ3AsIDUxMTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9uZWdwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX25lZ3NhdCwgNTE0NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX25lZ3NhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9ub3QsIDUxNzN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9ub3QKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfbm90cCwgNTE5OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX25vdHAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfb3IsIDUyMjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9vcmlyLCA1MjQ4fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfb3JpcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9vcnAsIDUyNzR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9vcnAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfcm91bmRzYXQsIDUyOTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9yb3VuZHNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9zYXQsIDUzMjl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc2F0YiwgNTM1NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3NhdGIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc2F0aCwgNTM4MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3NhdGgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc2F0dWIsIDU0MDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zYXR1YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9zYXR1aCwgNTQzM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3NhdHVoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N1YiwgNTQ2MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N1YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9zdWJoX2gxNl9oaCwgNTQ4NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N1YmhfaDE2X2hoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N1YmhfaDE2X2hsLCA1NTE4fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfc3ViaF9oMTZfaGwKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc3ViaF9oMTZfbGgsIDU1NTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdWJoX2gxNl9saAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9zdWJoX2gxNl9sbCwgNTU4NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N1YmhfaDE2X2xsCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N1YmhfaDE2X3NhdF9oaCwgNTYxN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N1YmhfaDE2X3NhdF9oaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9zdWJoX2gxNl9zYXRfaGwsIDU2NTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdWJoX2gxNl9zYXRfaGwKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc3ViaF9oMTZfc2F0X2xoLCA1NjkxfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfc3ViaF9oMTZfc2F0X2xoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N1YmhfaDE2X3NhdF9sbCwgNTcyOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N1YmhfaDE2X3NhdF9sbAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9zdWJoX2wxNl9obCwgNTc2NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N1YmhfbDE2X2hsCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N1YmhfbDE2X2xsLCA1Nzk4fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfc3ViaF9sMTZfbGwKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc3ViaF9sMTZfc2F0X2hsLCA1ODMxfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfc3ViaF9sMTZfc2F0X2hsCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N1YmhfbDE2X3NhdF9sbCwgNTg2OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N1YmhfbDE2X3NhdF9sbAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9zdWJwLCA1OTA1fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfc3VicAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9zdWJyaSwgNTkzMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N1YnJpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N1YnNhdCwgNTk1OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N1YnNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9zdmFkZGgsIDU5ODZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdmFkZGgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc3ZhZGRocywgNjAxNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N2YWRkaHMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc3ZhZGR1aHMsIDYwNDN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdmFkZHVocworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl9zdmF2Z2gsIDYwNzN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdmF2Z2gKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc3ZhdmdocywgNjEwMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N2YXZnaHMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc3ZuYXZnaCwgNjEzMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N2bmF2Z2gKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc3ZzdWJoLCA2MTU5fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfc3ZzdWJoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N2c3ViaHMsIDYxODd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl9zdnN1YmhzCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3N2c3VidWhzLCA2MjE2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfc3ZzdWJ1aHMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc3dpeiwgNjI0Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N3aXoKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc3h0YiwgNjI3Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N4dGIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc3h0aCwgNjI5OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N4dGgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfc3h0dywgNjMyNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3N4dHcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdGZyLCA2MzUwfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdGZyCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3RmcmloLCA2Mzc1fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdGZyaWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdGZyaWwsIDY0MDJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl90ZnJpbAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl90ZnJwLCA2NDI5fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdGZycAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl90ZnJwaSwgNjQ1NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3RmcnBpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3RmcnNpLCA2NDgyfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdGZyc2kKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmFic2gsIDY1MDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92YWJzaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92YWJzaHNhdCwgNjUzNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZhYnNoc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZhYnN3LCA2NTY2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmFic3cKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmFic3dzYXQsIDY1OTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92YWJzd3NhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92YWRkYl9tYXAsIDY2MjN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92YWRkYl9tYXAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmFkZGgsIDY2NTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92YWRkaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92YWRkaHMsIDY2ODF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92YWRkaHMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmFkZHViLCA2NzA5fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmFkZHViCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZhZGR1YnMsIDY3Mzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92YWRkdWJzCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZhZGR1aHMsIDY3NjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92YWRkdWhzCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZhZGR3LCA2Nzk1fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmFkZHcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmFkZHdzLCA2ODIyfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmFkZHdzCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZhdmdoLCA2ODUwfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmF2Z2gKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmF2Z2hjciwgNjg3N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZhdmdoY3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmF2Z2hyLCA2OTA2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmF2Z2hyCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3Zhdmd1YiwgNjkzNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3Zhdmd1YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92YXZndWJyLCA2OTYyfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmF2Z3VicgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92YXZndWgsIDY5OTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92YXZndWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmF2Z3VociwgNzAxOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3Zhdmd1aHIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmF2Z3V3LCA3MDQ4fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmF2Z3V3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3Zhdmd1d3IsIDcwNzZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92YXZndXdyCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3Zhdmd3LCA3MTA1fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmF2Z3cKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmF2Z3djciwgNzEzMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3Zhdmd3Y3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmF2Z3dyLCA3MTYxfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmF2Z3dyCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZjbXBiZXEsIDcxODl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92Y21wYmVxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZjbXBiZ3R1LCA3MjE4fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmNtcGJndHUKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmNtcGhlcSwgNzI0OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZjbXBoZXEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmNtcGhndCwgNzI3N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZjbXBoZ3QKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdmNtcGhndHUsIDczMDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92Y21waGd0dQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92Y21wd2VxLCA3MzM2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmNtcHdlcQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92Y21wd2d0LCA3MzY1fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmNtcHdndAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92Y21wd2d0dSwgNzM5NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZjbXB3Z3R1CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3Zjb25qLCA3NDI0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdmNvbmoKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdm1heGIsIDc0NTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92bWF4YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92bWF4aCwgNzQ3OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZtYXhoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZtYXh1YiwgNzUwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZtYXh1YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92bWF4dWgsIDc1MzN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92bWF4dWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdm1heHV3LCA3NTYxfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdm1heHV3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZtYXh3LCA3NTg5fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdm1heHcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdm1pbmIsIDc2MTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92bWluYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92bWluaCwgNzY0M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZtaW5oCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZtaW51YiwgNzY3MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZtaW51YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92bWludWgsIDc2OTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92bWludWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdm1pbnV3LCA3NzI2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdm1pbnV3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZtaW53LCA3NzU0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdm1pbncKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdm5hdmdoLCA3NzgxfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdm5hdmdoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZuYXZnaGNyLCA3ODA5fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdm5hdmdoY3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdm5hdmdociwgNzgzOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZuYXZnaHIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdm5hdmd3LCA3ODY4fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdm5hdmd3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZuYXZnd2NyLCA3ODk2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdm5hdmd3Y3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdm5hdmd3ciwgNzkyNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZuYXZnd3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdnJhZGR1YiwgNzk1NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZyYWRkdWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdnJhZGR1Yl9hY2MsIDc5ODR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92cmFkZHViX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92cnNhZHViLCA4MDE3fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfdnJzYWR1YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92cnNhZHViX2FjYywgODA0Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3Zyc2FkdWJfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZzdWJiX21hcCwgODA3OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZzdWJiX21hcAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92c3ViaCwgODExMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZzdWJoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3ZzdWJocywgODEzN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZzdWJocworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92c3VidWIsIDgxNjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92c3VidWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdnN1YnVicywgODE5M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZzdWJ1YnMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdnN1YnVocywgODIyMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0EyX3ZzdWJ1aHMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfdnN1YncsIDgyNTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92c3VidworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BMl92c3Vid3MsIDgyNzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl92c3Vid3MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTJfeG9yLCA4MzA2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTJfeG9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3hvcnAsIDgzMzF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl94b3JwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3p4dGIsIDgzNTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl96eHRiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0EyX3p4dGgsIDgzODN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BMl96eHRoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X2FuZG4sIDg0MDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9hbmRuCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X2FuZG5wLCA4NDM1fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfYW5kbnAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfYml0c3BsaXQsIDg0NjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9iaXRzcGxpdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9iaXRzcGxpdGksIDg0OTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9iaXRzcGxpdGkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfYm91bmRzY2hlY2ssIDg1MjN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9ib3VuZHNjaGVjaworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9jbXBiZXEsIDg1NTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9jbXBiZXEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfY21wYmVxaSwgODU4NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X2NtcGJlcWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfY21wYmd0LCA4NjEzfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfY21wYmd0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X2NtcGJndGksIDg2NDF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9jbXBiZ3RpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X2NtcGJndHUsIDg2NzB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9jbXBiZ3R1CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X2NtcGJndHVpLCA4Njk5fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfY21wYmd0dWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfY21waGVxLCA4NzI5fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfY21waGVxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X2NtcGhlcWksIDg3NTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9jbXBoZXFpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X2NtcGhndCwgODc4Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X2NtcGhndAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9jbXBoZ3RpLCA4ODE0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfY21waGd0aQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9jbXBoZ3R1LCA4ODQzfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfY21waGd0dQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9jbXBoZ3R1aSwgODg3Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X2NtcGhndHVpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X2NvbWJpbmVpciwgODkwMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X2NvbWJpbmVpcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9jb21iaW5lcmksIDg5MzN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9jb21iaW5lcmkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfY3JvdW5kX3JpLCA4OTY0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfY3JvdW5kX3JpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X2Nyb3VuZF9yciwgODk5NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X2Nyb3VuZF9ycgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9tb2R3cmFwdSwgOTAyNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X21vZHdyYXB1CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X29ybiwgOTA1Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X29ybgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9vcm5wLCA5MDgxfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfb3JucAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9yY21wZXEsIDkxMDd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9yY21wZXEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfcmNtcGVxaSwgOTEzNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X3JjbXBlcWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfcmNtcG5lcSwgOTE2NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X3JjbXBuZXEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfcmNtcG5lcWksIDkxOTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF9yY21wbmVxaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9yb3VuZF9yaSwgOTIyM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X3JvdW5kX3JpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X3JvdW5kX3JpX3NhdCwgOTI1M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X3JvdW5kX3JpX3NhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF9yb3VuZF9yciwgOTI4N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X3JvdW5kX3JyCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X3JvdW5kX3JyX3NhdCwgOTMxN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X3JvdW5kX3JyX3NhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF90bGJtYXRjaCwgOTM1MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X3RsYm1hdGNoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X3ZjbXBiZXFfYW55LCA5MzgxfSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfdmNtcGJlcV9hbnkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfdmNtcGJlcWksIDk0MTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF92Y21wYmVxaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF92Y21wYmd0LCA5NDQ0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfdmNtcGJndAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF92Y21wYmd0aSwgOTQ3M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X3ZjbXBiZ3RpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X3ZjbXBiZ3R1aSwgOTUwM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X3ZjbXBiZ3R1aQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF92Y21waGVxaSwgOTUzNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X3ZjbXBoZXFpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X3ZjbXBoZ3RpLCA5NTY0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfdmNtcGhndGkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfdmNtcGhndHVpLCA5NTk0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfdmNtcGhndHVpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X3ZjbXB3ZXFpLCA5NjI1fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfdmNtcHdlcWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfdmNtcHdndGksIDk2NTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF92Y21wd2d0aQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF92Y21wd2d0dWksIDk2ODV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF92Y21wd2d0dWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfdnJtYXhoLCA5NzE2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfdnJtYXhoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X3ZybWF4dWgsIDk3NDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF92cm1heHVoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X3ZybWF4dXcsIDk3NzN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF92cm1heHV3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E0X3ZybWF4dywgOTgwMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X3ZybWF4dworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNF92cm1pbmgsIDk4MzB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNF92cm1pbmgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfdnJtaW51aCwgOTg1OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X3ZybWludWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfdnJtaW51dywgOTg4N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E0X3ZybWludXcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTRfdnJtaW53LCA5OTE2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTRfdnJtaW53CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0E1X3ZhZGRodWJzLCA5OTQ0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQTVfdmFkZGh1YnMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQTZfdmNtcGJlcV9ub3RhbnksIDk5NzR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9BNl92Y21wYmVxX25vdGFueQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9BNl92Y21wYmVxX25vdGFueV8xMjhCLCAxMDAxMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0E2X3ZjbXBiZXFfbm90YW55XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfYWxsOCwgMTAwNTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl9hbGw4CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX2FuZCwgMTAwNzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl9hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfYW5kbiwgMTAxMDJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl9hbmRuCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX2FueTgsIDEwMTI4fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfYW55OAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DMl9iaXRzY2xyLCAxMDE1NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0MyX2JpdHNjbHIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfYml0c2NscmksIDEwMTgzfSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfYml0c2NscmkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfYml0c3NldCwgMTAyMTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl9iaXRzc2V0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX2NtcGVxLCAxMDI0Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0MyX2NtcGVxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX2NtcGVxaSwgMTAyNjl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl9jbXBlcWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfY21wZXFwLCAxMDI5N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0MyX2NtcGVxcAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DMl9jbXBnZWksIDEwMzI1fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfY21wZ2VpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX2NtcGdldWksIDEwMzUzfSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfY21wZ2V1aQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DMl9jbXBndCwgMTAzODJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl9jbXBndAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DMl9jbXBndGksIDEwNDA5fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfY21wZ3RpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX2NtcGd0cCwgMTA0Mzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl9jbXBndHAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfY21wZ3R1LCAxMDQ2NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0MyX2NtcGd0dQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DMl9jbXBndHVpLCAxMDQ5M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0MyX2NtcGd0dWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfY21wZ3R1cCwgMTA1MjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl9jbXBndHVwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX2NtcGx0LCAxMDU1MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0MyX2NtcGx0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX2NtcGx0dSwgMTA1Nzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl9jbXBsdHUKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfbWFzaywgMTA2MDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl9tYXNrCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX211eCwgMTA2MzJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl9tdXgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfbXV4aWksIDEwNjU3fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfbXV4aWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfbXV4aXIsIDEwNjg0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfbXV4aXIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfbXV4cmksIDEwNzExfSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfbXV4cmkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfbm90LCAxMDczOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0MyX25vdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DMl9vciwgMTA3NjN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl9vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DMl9vcm4sIDEwNzg3fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfb3JuCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX3B4ZmVyX21hcCwgMTA4MTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl9weGZlcl9tYXAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfdGZycHIsIDEwODQzfSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfdGZycHIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfdGZycnAsIDEwODcwfSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfdGZycnAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzJfdml0cGFjaywgMTA4OTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DMl92aXRwYWNrCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0MyX3ZtdXgsIDEwOTI2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfdm11eAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DMl94b3IsIDEwOTUyfSwgLy8gX19idWlsdGluX0hFWEFHT05fQzJfeG9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0M0X2FuZF9hbmQsIDEwOTc3fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzRfYW5kX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DNF9hbmRfYW5kbiwgMTEwMDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DNF9hbmRfYW5kbgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DNF9hbmRfb3IsIDExMDM2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzRfYW5kX29yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0M0X2FuZF9vcm4sIDExMDY0fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzRfYW5kX29ybgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DNF9jbXBsdGUsIDExMDkzfSwgLy8gX19idWlsdGluX0hFWEFHT05fQzRfY21wbHRlCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0M0X2NtcGx0ZWksIDExMTIxfSwgLy8gX19idWlsdGluX0hFWEFHT05fQzRfY21wbHRlaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DNF9jbXBsdGV1LCAxMTE1MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0M0X2NtcGx0ZXUKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzRfY21wbHRldWksIDExMTc5fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzRfY21wbHRldWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzRfY21wbmVxLCAxMTIwOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0M0X2NtcG5lcQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DNF9jbXBuZXFpLCAxMTIzN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0M0X2NtcG5lcWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzRfZmFzdGNvcm5lcjksIDExMjY2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzRfZmFzdGNvcm5lcjkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzRfZmFzdGNvcm5lcjlfbm90LCAxMTI5OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0M0X2Zhc3Rjb3JuZXI5X25vdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DNF9uYml0c2NsciwgMTEzMzZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DNF9uYml0c2NscgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9DNF9uYml0c2NscmksIDExMzY2fSwgLy8gX19idWlsdGluX0hFWEFHT05fQzRfbmJpdHNjbHJpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0M0X25iaXRzc2V0LCAxMTM5N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0M0X25iaXRzc2V0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0M0X29yX2FuZCwgMTE0Mjd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DNF9vcl9hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fQzRfb3JfYW5kbiwgMTE0NTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DNF9vcl9hbmRuCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0M0X29yX29yLCAxMTQ4NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0M0X29yX29yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0M0X29yX29ybiwgMTE1MTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9DNF9vcl9vcm4KKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfY29udl9kMmRmLCAxMTUzOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfZDJkZgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9jb252X2Qyc2YsIDExNTcwfSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfY29udl9kMnNmCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2NvbnZfZGYyZCwgMTE2MDF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X2RmMmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfY29udl9kZjJkX2Nob3AsIDExNjMyfSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfY29udl9kZjJkX2Nob3AKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfY29udl9kZjJzZiwgMTE2Njh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X2RmMnNmCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2NvbnZfZGYydWQsIDExNzAwfSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfY29udl9kZjJ1ZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9jb252X2RmMnVkX2Nob3AsIDExNzMyfSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfY29udl9kZjJ1ZF9jaG9wCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2NvbnZfZGYydXcsIDExNzY5fSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfY29udl9kZjJ1dworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9jb252X2RmMnV3X2Nob3AsIDExODAxfSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfY29udl9kZjJ1d19jaG9wCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2NvbnZfZGYydywgMTE4Mzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X2RmMncKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfY29udl9kZjJ3X2Nob3AsIDExODY5fSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfY29udl9kZjJ3X2Nob3AKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfY29udl9zZjJkLCAxMTkwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfc2YyZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9jb252X3NmMmRfY2hvcCwgMTE5MzZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X3NmMmRfY2hvcAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9jb252X3NmMmRmLCAxMTk3Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfc2YyZGYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfY29udl9zZjJ1ZCwgMTIwMDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X3NmMnVkCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2NvbnZfc2YydWRfY2hvcCwgMTIwMzZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X3NmMnVkX2Nob3AKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfY29udl9zZjJ1dywgMTIwNzN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X3NmMnV3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2NvbnZfc2YydXdfY2hvcCwgMTIxMDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X3NmMnV3X2Nob3AKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfY29udl9zZjJ3LCAxMjE0Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfc2YydworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9jb252X3NmMndfY2hvcCwgMTIxNzN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X3NmMndfY2hvcAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9jb252X3VkMmRmLCAxMjIwOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfdWQyZGYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfY29udl91ZDJzZiwgMTIyNDF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9jb252X3VkMnNmCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2NvbnZfdXcyZGYsIDEyMjczfSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfY29udl91dzJkZgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9jb252X3V3MnNmLCAxMjMwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfdXcyc2YKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfY29udl93MmRmLCAxMjMzN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2NvbnZfdzJkZgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9jb252X3cyc2YsIDEyMzY4fSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfY29udl93MnNmCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2RmY2xhc3MsIDEyMzk5fSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfZGZjbGFzcworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9kZmNtcGVxLCAxMjQyOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2RmY21wZXEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfZGZjbXBnZSwgMTI0NTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9kZmNtcGdlCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2RmY21wZ3QsIDEyNDg2fSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfZGZjbXBndAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9kZmNtcHVvLCAxMjUxNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX2RmY21wdW8KKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfZGZpbW1fbiwgMTI1NDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9kZmltbV9uCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX2RmaW1tX3AsIDEyNTczfSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfZGZpbW1fcAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9zZmFkZCwgMTI2MDJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZmFkZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9zZmNsYXNzLCAxMjYyOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX3NmY2xhc3MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfc2ZjbXBlcSwgMTI2NTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZmNtcGVxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX3NmY21wZ2UsIDEyNjg3fSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfc2ZjbXBnZQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9zZmNtcGd0LCAxMjcxNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX3NmY21wZ3QKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfc2ZjbXB1bywgMTI3NDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZmNtcHVvCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX3NmZml4dXBkLCAxMjc3NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX3NmZml4dXBkCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX3NmZml4dXBuLCAxMjgwNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX3NmZml4dXBuCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX3NmZml4dXByLCAxMjgzNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX3NmZml4dXByCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX3NmZm1hLCAxMjg2NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX3NmZm1hCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX3NmZm1hX2xpYiwgMTI4OTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZmZtYV9saWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfc2ZmbWFfc2MsIDEyOTIyfSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfc2ZmbWFfc2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfc2ZmbXMsIDEyOTUyfSwgLy8gX19idWlsdGluX0hFWEFHT05fRjJfc2ZmbXMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfc2ZmbXNfbGliLCAxMjk3OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX3NmZm1zX2xpYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9GMl9zZmltbV9uLCAxMzAxMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX3NmaW1tX24KKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fRjJfc2ZpbW1fcCwgMTMwMzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9GMl9zZmltbV9wCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX3NmbWF4LCAxMzA2OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX3NmbWF4CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX3NmbWluLCAxMzA5NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX3NmbWluCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX3NmbXB5LCAxMzEyMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX3NmbXB5CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0YyX3Nmc3ViLCAxMzE0OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0YyX3Nmc3ViCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX0wyX2xvYWR3X2xvY2tlZCwgMTMxNzZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9MMl9sb2Fkd19sb2NrZWQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTDRfbG9hZGRfbG9ja2VkLCAxMzIxMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX0w0X2xvYWRkX2xvY2tlZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9hY2NpLCAxMzI0NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2FjY2kKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfYWNjaWksIDEzMjcwfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfYWNjaWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfY21hY2lfczAsIDEzMjk3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfY21hY2lfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfY21hY3JfczAsIDEzMzI3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfY21hY3JfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfY21hY3NfczAsIDEzMzU3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfY21hY3NfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfY21hY3NfczEsIDEzMzg3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfY21hY3NfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfY21hY3NjX3MwLCAxMzQxN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2NtYWNzY19zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9jbWFjc2NfczEsIDEzNDQ4fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfY21hY3NjX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2NtcHlpX3MwLCAxMzQ3OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2NtcHlpX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2NtcHlyX3MwLCAxMzUwOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2NtcHlyX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2NtcHlyc19zMCwgMTM1Mzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbXB5cnNfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfY21weXJzX3MxLCAxMzU3MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2NtcHlyc19zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9jbXB5cnNjX3MwLCAxMzYwMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2NtcHlyc2NfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfY21weXJzY19zMSwgMTM2MzN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbXB5cnNjX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2NtcHlzX3MwLCAxMzY2NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2NtcHlzX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2NtcHlzX3MxLCAxMzY5NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2NtcHlzX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2NtcHlzY19zMCwgMTM3MjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbXB5c2NfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfY21weXNjX3MxLCAxMzc1Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2NtcHlzY19zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9jbmFjc19zMCwgMTM3ODd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbmFjc19zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9jbmFjc19zMSwgMTM4MTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbmFjc19zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9jbmFjc2NfczAsIDEzODQ3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfY25hY3NjX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2NuYWNzY19zMSwgMTM4Nzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9jbmFjc2NfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfZHBtcHlzc19hY2NfczAsIDEzOTA5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfZHBtcHlzc19hY2NfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfZHBtcHlzc19uYWNfczAsIDEzOTQ1fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfZHBtcHlzc19uYWNfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfZHBtcHlzc19ybmRfczAsIDEzOTgxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfZHBtcHlzc19ybmRfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfZHBtcHlzc19zMCwgMTQwMTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9kcG1weXNzX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2RwbXB5dXVfYWNjX3MwLCAxNDA0OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2RwbXB5dXVfYWNjX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2RwbXB5dXVfbmFjX3MwLCAxNDA4NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2RwbXB5dXVfbmFjX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX2RwbXB5dXVfczAsIDE0MTIxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfZHBtcHl1dV9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9obW1weWhfcnMxLCAxNDE1M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2htbXB5aF9yczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfaG1tcHloX3MxLCAxNDE4NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2htbXB5aF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9obW1weWxfcnMxLCAxNDIxNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2htbXB5bF9yczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfaG1tcHlsX3MxLCAxNDI0OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX2htbXB5bF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tYWNpLCAxNDI3OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21hY2kKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbWFjc2luLCAxNDMwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21hY3NpbgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tYWNzaXAsIDE0MzMzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbWFjc2lwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tYWNoc19yczAsIDE0MzYxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbW1hY2hzX3JzMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbWFjaHNfcnMxLCAxNDM5M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWNoc19yczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1hY2hzX3MwLCAxNDQyNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWNoc19zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbWFjaHNfczEsIDE0NDU2fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbW1hY2hzX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tYWNsc19yczAsIDE0NDg3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbW1hY2xzX3JzMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbWFjbHNfcnMxLCAxNDUxOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWNsc19yczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1hY2xzX3MwLCAxNDU1MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWNsc19zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbWFjbHNfczEsIDE0NTgyfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbW1hY2xzX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tYWN1aHNfcnMwLCAxNDYxM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWN1aHNfcnMwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tYWN1aHNfcnMxLCAxNDY0Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWN1aHNfcnMxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tYWN1aHNfczAsIDE0Njc5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbW1hY3Voc19zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbWFjdWhzX3MxLCAxNDcxMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tYWN1aHNfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1hY3Vsc19yczAsIDE0NzQzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbW1hY3Vsc19yczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1hY3Vsc19yczEsIDE0Nzc2fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbW1hY3Vsc19yczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1hY3Vsc19zMCwgMTQ4MDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbWFjdWxzX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tYWN1bHNfczEsIDE0ODQxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbW1hY3Vsc19zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbXB5aF9yczAsIDE0ODczfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbW1weWhfcnMwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tcHloX3JzMSwgMTQ5MDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tbXB5aF9yczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1weWhfczAsIDE0OTM1fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbW1weWhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1weWhfczEsIDE0OTY1fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbW1weWhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1weWxfcnMwLCAxNDk5NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHlsX3JzMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbXB5bF9yczEsIDE1MDI2fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbW1weWxfcnMxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tcHlsX3MwLCAxNTA1N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHlsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tcHlsX3MxLCAxNTA4N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHlsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tcHl1aF9yczAsIDE1MTE3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbW1weXVoX3JzMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbXB5dWhfcnMxLCAxNTE0OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHl1aF9yczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1weXVoX3MwLCAxNTE4MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHl1aF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbXB5dWhfczEsIDE1MjEyfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbW1weXVoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21tcHl1bF9yczAsIDE1MjQzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbW1weXVsX3JzMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbXB5dWxfcnMxLCAxNTI3NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHl1bF9yczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbW1weXVsX3MwLCAxNTMwN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21tcHl1bF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tbXB5dWxfczEsIDE1MzM4fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbW1weXVsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9hY2NfaGhfczAsIDE1MzY5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2FjY19oaF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfYWNjX2hoX3MxLCAxNTQwNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9hY2NfaGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X2FjY19obF9zMCwgMTU0Mzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfYWNjX2hsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9hY2NfaGxfczEsIDE1NDc0fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2FjY19obF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfYWNjX2xoX3MwLCAxNTUwOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9hY2NfbGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X2FjY19saF9zMSwgMTU1NDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfYWNjX2xoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9hY2NfbGxfczAsIDE1NTc5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2FjY19sbF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfYWNjX2xsX3MxLCAxNTYxNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9hY2NfbGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X2FjY19zYXRfaGhfczAsIDE1NjQ5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2FjY19zYXRfaGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X2FjY19zYXRfaGhfczEsIDE1Njg4fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2FjY19zYXRfaGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X2FjY19zYXRfaGxfczAsIDE1NzI3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2FjY19zYXRfaGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X2FjY19zYXRfaGxfczEsIDE1NzY2fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2FjY19zYXRfaGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X2FjY19zYXRfbGhfczAsIDE1ODA1fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2FjY19zYXRfbGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X2FjY19zYXRfbGhfczEsIDE1ODQ0fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2FjY19zYXRfbGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X2FjY19zYXRfbGxfczAsIDE1ODgzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2FjY19zYXRfbGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X2FjY19zYXRfbGxfczEsIDE1OTIyfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2FjY19zYXRfbGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X2hoX3MwLCAxNTk2MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9oaF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfaGhfczEsIDE1OTkyfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2hoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9obF9zMCwgMTYwMjN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfaGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X2hsX3MxLCAxNjA1NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9obF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfbGhfczAsIDE2MDg1fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2xoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9saF9zMSwgMTYxMTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfbGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X2xsX3MwLCAxNjE0N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9sbF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfbGxfczEsIDE2MTc4fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X2xsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9uYWNfaGhfczAsIDE2MjA5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X25hY19oaF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfbmFjX2hoX3MxLCAxNjI0NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9uYWNfaGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X25hY19obF9zMCwgMTYyNzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfbmFjX2hsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9uYWNfaGxfczEsIDE2MzE0fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X25hY19obF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfbmFjX2xoX3MwLCAxNjM0OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9uYWNfbGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X25hY19saF9zMSwgMTYzODR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfbmFjX2xoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9uYWNfbGxfczAsIDE2NDE5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X25hY19sbF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfbmFjX2xsX3MxLCAxNjQ1NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9uYWNfbGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X25hY19zYXRfaGhfczAsIDE2NDg5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X25hY19zYXRfaGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X25hY19zYXRfaGhfczEsIDE2NTI4fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X25hY19zYXRfaGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X25hY19zYXRfaGxfczAsIDE2NTY3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X25hY19zYXRfaGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X25hY19zYXRfaGxfczEsIDE2NjA2fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X25hY19zYXRfaGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X25hY19zYXRfbGhfczAsIDE2NjQ1fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X25hY19zYXRfbGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X25hY19zYXRfbGhfczEsIDE2Njg0fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X25hY19zYXRfbGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X25hY19zYXRfbGxfczAsIDE2NzIzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X25hY19zYXRfbGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X25hY19zYXRfbGxfczEsIDE2NzYyfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X25hY19zYXRfbGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X3JuZF9oaF9zMCwgMTY4MDF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfcm5kX2hoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9ybmRfaGhfczEsIDE2ODM2fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3JuZF9oaF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfcm5kX2hsX3MwLCAxNjg3MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9ybmRfaGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X3JuZF9obF9zMSwgMTY5MDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfcm5kX2hsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9ybmRfbGhfczAsIDE2OTQxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3JuZF9saF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfcm5kX2xoX3MxLCAxNjk3Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9ybmRfbGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X3JuZF9sbF9zMCwgMTcwMTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfcm5kX2xsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9ybmRfbGxfczEsIDE3MDQ2fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3JuZF9sbF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfc2F0X2hoX3MwLCAxNzA4MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9zYXRfaGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X3NhdF9oaF9zMSwgMTcxMTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfc2F0X2hoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9zYXRfaGxfczAsIDE3MTUxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3NhdF9obF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfc2F0X2hsX3MxLCAxNzE4Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9zYXRfaGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X3NhdF9saF9zMCwgMTcyMjF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfc2F0X2xoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9zYXRfbGhfczEsIDE3MjU2fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5X3NhdF9saF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfc2F0X2xsX3MwLCAxNzI5MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9zYXRfbGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X3NhdF9sbF9zMSwgMTczMjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfc2F0X2xsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9zYXRfcm5kX2hoX3MwLCAxNzM2MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9zYXRfcm5kX2hoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9zYXRfcm5kX2hoX3MxLCAxNzQwMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9zYXRfcm5kX2hoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9zYXRfcm5kX2hsX3MwLCAxNzQzOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9zYXRfcm5kX2hsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9zYXRfcm5kX2hsX3MxLCAxNzQ3OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9zYXRfcm5kX2hsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9zYXRfcm5kX2xoX3MwLCAxNzUxN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9zYXRfcm5kX2xoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9zYXRfcm5kX2xoX3MxLCAxNzU1Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9zYXRfcm5kX2xoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9zYXRfcm5kX2xsX3MwLCAxNzU5NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9zYXRfcm5kX2xsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV9zYXRfcm5kX2xsX3MxLCAxNzYzNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV9zYXRfcm5kX2xsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weV91cCwgMTc2NzN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlfdXAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5X3VwX3MxLCAxNzcwMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV91cF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlfdXBfczFfc2F0LCAxNzczMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weV91cF9zMV9zYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9hY2NfaGhfczAsIDE3NzY3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9hY2NfaGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9hY2NfaGhfczEsIDE3ODAzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9hY2NfaGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9hY2NfaGxfczAsIDE3ODM5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9hY2NfaGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9hY2NfaGxfczEsIDE3ODc1fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9hY2NfaGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9hY2NfbGhfczAsIDE3OTExfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9hY2NfbGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9hY2NfbGhfczEsIDE3OTQ3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9hY2NfbGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9hY2NfbGxfczAsIDE3OTgzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9hY2NfbGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9hY2NfbGxfczEsIDE4MDE5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9hY2NfbGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9oaF9zMCwgMTgwNTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX2hoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weWRfaGhfczEsIDE4MDg3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9oaF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX2hsX3MwLCAxODExOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weWRfaGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9obF9zMSwgMTgxNTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX2hsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weWRfbGhfczAsIDE4MTgzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9saF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX2xoX3MxLCAxODIxNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weWRfbGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5ZF9sbF9zMCwgMTgyNDd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX2xsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weWRfbGxfczEsIDE4Mjc5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5ZF9sbF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX25hY19oaF9zMCwgMTgzMTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX25hY19oaF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX25hY19oaF9zMSwgMTgzNDd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX25hY19oaF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX25hY19obF9zMCwgMTgzODN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX25hY19obF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX25hY19obF9zMSwgMTg0MTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX25hY19obF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX25hY19saF9zMCwgMTg0NTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX25hY19saF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX25hY19saF9zMSwgMTg0OTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX25hY19saF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX25hY19sbF9zMCwgMTg1Mjd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX25hY19sbF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX25hY19sbF9zMSwgMTg1NjN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX25hY19sbF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX3JuZF9oaF9zMCwgMTg1OTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX3JuZF9oaF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX3JuZF9oaF9zMSwgMTg2MzV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX3JuZF9oaF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX3JuZF9obF9zMCwgMTg2NzF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX3JuZF9obF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX3JuZF9obF9zMSwgMTg3MDd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX3JuZF9obF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX3JuZF9saF9zMCwgMTg3NDN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX3JuZF9saF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX3JuZF9saF9zMSwgMTg3Nzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX3JuZF9saF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX3JuZF9sbF9zMCwgMTg4MTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX3JuZF9sbF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlkX3JuZF9sbF9zMSwgMTg4NTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlkX3JuZF9sbF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlpLCAxODg4N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5c21pLCAxODkxM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXNtaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHlzdV91cCwgMTg5NDF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHlzdV91cAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X2FjY19oaF9zMCwgMTg5NzF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X2FjY19oaF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X2FjY19oaF9zMSwgMTkwMDd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X2FjY19oaF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X2FjY19obF9zMCwgMTkwNDN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X2FjY19obF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X2FjY19obF9zMSwgMTkwNzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X2FjY19obF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X2FjY19saF9zMCwgMTkxMTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X2FjY19saF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X2FjY19saF9zMSwgMTkxNTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X2FjY19saF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X2FjY19sbF9zMCwgMTkxODd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X2FjY19sbF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X2FjY19sbF9zMSwgMTkyMjN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X2FjY19sbF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X2hoX3MwLCAxOTI1OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfaGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dV9oaF9zMSwgMTkyOTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X2hoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVfaGxfczAsIDE5MzIzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9obF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X2hsX3MxLCAxOTM1NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfaGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dV9saF9zMCwgMTkzODd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X2xoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVfbGhfczEsIDE5NDE5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV9saF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1X2xsX3MwLCAxOTQ1MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfbGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dV9sbF9zMSwgMTk0ODN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1X2xsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVfbmFjX2hoX3MwLCAxOTUxNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfbmFjX2hoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVfbmFjX2hoX3MxLCAxOTU1MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfbmFjX2hoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVfbmFjX2hsX3MwLCAxOTU4N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfbmFjX2hsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVfbmFjX2hsX3MxLCAxOTYyM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfbmFjX2hsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVfbmFjX2xoX3MwLCAxOTY1OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfbmFjX2xoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVfbmFjX2xoX3MxLCAxOTY5NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfbmFjX2xoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVfbmFjX2xsX3MwLCAxOTczMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfbmFjX2xsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVfbmFjX2xsX3MxLCAxOTc2N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVfbmFjX2xsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVfdXAsIDE5ODAzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dV91cAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1ZF9hY2NfaGhfczAsIDE5ODMyfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfYWNjX2hoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVkX2FjY19oaF9zMSwgMTk4Njl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1ZF9hY2NfaGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dWRfYWNjX2hsX3MwLCAxOTkwNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX2FjY19obF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1ZF9hY2NfaGxfczEsIDE5OTQzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfYWNjX2hsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVkX2FjY19saF9zMCwgMTk5ODB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1ZF9hY2NfbGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dWRfYWNjX2xoX3MxLCAyMDAxN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX2FjY19saF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1ZF9hY2NfbGxfczAsIDIwMDU0fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfYWNjX2xsX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVkX2FjY19sbF9zMSwgMjAwOTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1ZF9hY2NfbGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dWRfaGhfczAsIDIwMTI4fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfaGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dWRfaGhfczEsIDIwMTYxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfaGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dWRfaGxfczAsIDIwMTk0fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfaGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dWRfaGxfczEsIDIwMjI3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfaGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dWRfbGhfczAsIDIwMjYwfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfbGhfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dWRfbGhfczEsIDIwMjkzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfbGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dWRfbGxfczAsIDIwMzI2fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfbGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dWRfbGxfczEsIDIwMzU5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfbGxfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dWRfbmFjX2hoX3MwLCAyMDM5Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX25hY19oaF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1ZF9uYWNfaGhfczEsIDIwNDI5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfbmFjX2hoX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVkX25hY19obF9zMCwgMjA0NjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1ZF9uYWNfaGxfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dWRfbmFjX2hsX3MxLCAyMDUwM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX25hY19obF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1ZF9uYWNfbGhfczAsIDIwNTQwfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfbmFjX2xoX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVkX25hY19saF9zMSwgMjA1Nzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9tcHl1ZF9uYWNfbGhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfbXB5dWRfbmFjX2xsX3MwLCAyMDYxNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVkX25hY19sbF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl9tcHl1ZF9uYWNfbGxfczEsIDIwNjUxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfbXB5dWRfbmFjX2xsX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX21weXVpLCAyMDY4OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX21weXVpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX25hY2NpLCAyMDcxNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX25hY2NpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX25hY2NpaSwgMjA3NDJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl9uYWNjaWkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfc3ViYWNjLCAyMDc3MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3N1YmFjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92YWJzZGlmZmgsIDIwNzk4fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdmFic2RpZmZoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZhYnNkaWZmdywgMjA4Mjl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92YWJzZGlmZncKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdmNtYWNfczBfc2F0X2ksIDIwODYwfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdmNtYWNfczBfc2F0X2kKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdmNtYWNfczBfc2F0X3IsIDIwODk2fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdmNtYWNfczBfc2F0X3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdmNtcHlfczBfc2F0X2ksIDIwOTMyfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdmNtcHlfczBfc2F0X2kKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdmNtcHlfczBfc2F0X3IsIDIwOTY4fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdmNtcHlfczBfc2F0X3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdmNtcHlfczFfc2F0X2ksIDIxMDA0fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdmNtcHlfczFfc2F0X2kKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdmNtcHlfczFfc2F0X3IsIDIxMDQwfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdmNtcHlfczFfc2F0X3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdmRtYWNzX3MwLCAyMTA3Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZkbWFjc19zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92ZG1hY3NfczEsIDIxMTA3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdmRtYWNzX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZkbXB5cnNfczAsIDIxMTM4fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdmRtcHlyc19zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92ZG1weXJzX3MxLCAyMTE3MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZkbXB5cnNfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdmRtcHlzX3MwLCAyMTIwMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZkbXB5c19zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92ZG1weXNfczEsIDIxMjMzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdmRtcHlzX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZtYWMyLCAyMTI2NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZtYWMyCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZtYWMyZXMsIDIxMjkxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdm1hYzJlcworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92bWFjMmVzX3MwLCAyMTMyMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZtYWMyZXNfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdm1hYzJlc19zMSwgMjEzNTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92bWFjMmVzX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZtYWMyc19zMCwgMjEzODR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92bWFjMnNfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdm1hYzJzX3MxLCAyMTQxNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZtYWMyc19zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92bWFjMnN1X3MwLCAyMTQ0Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZtYWMyc3VfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdm1hYzJzdV9zMSwgMjE0Nzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92bWFjMnN1X3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZtcHkyZXNfczAsIDIxNTEwfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdm1weTJlc19zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92bXB5MmVzX3MxLCAyMTU0Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZtcHkyZXNfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdm1weTJzX3MwLCAyMTU3NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZtcHkyc19zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92bXB5MnNfczBwYWNrLCAyMTYwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZtcHkyc19zMHBhY2sKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdm1weTJzX3MxLCAyMTY0MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZtcHkyc19zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92bXB5MnNfczFwYWNrLCAyMTY3MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZtcHkyc19zMXBhY2sKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdm1weTJzdV9zMCwgMjE3MDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92bXB5MnN1X3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZtcHkyc3VfczEsIDIxNzM4fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdm1weTJzdV9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92cmFkZGgsIDIxNzcwfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdnJhZGRoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZyYWRkdWgsIDIxNzk4fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdnJhZGR1aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92cmNtYWNpX3MwLCAyMTgyN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZyY21hY2lfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdnJjbWFjaV9zMGMsIDIxODU5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdnJjbWFjaV9zMGMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdnJjbWFjcl9zMCwgMjE4OTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92cmNtYWNyX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZyY21hY3JfczBjLCAyMTkyNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZyY21hY3JfczBjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZyY21weWlfczAsIDIxOTU3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdnJjbXB5aV9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92cmNtcHlpX3MwYywgMjE5ODl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92cmNtcHlpX3MwYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NMl92cmNtcHlyX3MwLCAyMjAyMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX00yX3ZyY21weXJfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdnJjbXB5cl9zMGMsIDIyMDU0fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdnJjbXB5cl9zMGMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdnJjbXB5c19hY2NfczEsIDIyMDg3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdnJjbXB5c19hY2NfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdnJjbXB5c19zMSwgMjIxMjN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92cmNtcHlzX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX00yX3ZyY21weXNfczFycCwgMjIxNTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NMl92cmNtcHlzX3MxcnAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdnJtYWNfczAsIDIyMTg5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdnJtYWNfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfdnJtcHlfczAsIDIyMjE5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfdnJtcHlfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTJfeG9yX3hhY2MsIDIyMjQ5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTJfeG9yX3hhY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfYW5kX2FuZCwgMjIyNzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF9hbmRfYW5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X2FuZF9hbmRuLCAyMjMwOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X2FuZF9hbmRuCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X2FuZF9vciwgMjIzMzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF9hbmRfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfYW5kX3hvciwgMjIzNjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF9hbmRfeG9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X2NtcHlpX3doLCAyMjM5NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X2NtcHlpX3doCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X2NtcHlpX3doYywgMjI0MjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF9jbXB5aV93aGMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfY21weXJfd2gsIDIyNDU2fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfY21weXJfd2gKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfY21weXJfd2hjLCAyMjQ4Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X2NtcHlyX3doYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNF9tYWNfdXBfczFfc2F0LCAyMjUxN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X21hY191cF9zMV9zYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfbXB5cmlfYWRkaSwgMjI1NTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF9tcHlyaV9hZGRpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X21weXJpX2FkZHIsIDIyNTg0fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfbXB5cmlfYWRkcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNF9tcHlyaV9hZGRyX3UyLCAyMjYxNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X21weXJpX2FkZHJfdTIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfbXB5cnJfYWRkaSwgMjI2NTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF9tcHlycl9hZGRpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X21weXJyX2FkZHIsIDIyNjgzfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfbXB5cnJfYWRkcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNF9uYWNfdXBfczFfc2F0LCAyMjcxNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X25hY191cF9zMV9zYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfb3JfYW5kLCAyMjc1MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X29yX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNF9vcl9hbmRuLCAyMjc3OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X29yX2FuZG4KKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfb3Jfb3IsIDIyODA3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfb3Jfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfb3JfeG9yLCAyMjgzNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X29yX3hvcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNF9wbXB5dywgMjI4NjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF9wbXB5dworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNF9wbXB5d19hY2MsIDIyODg5fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfcG1weXdfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X3ZwbXB5aCwgMjI5MjB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF92cG1weWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfdnBtcHloX2FjYywgMjI5NDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF92cG1weWhfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X3ZybXB5ZWhfYWNjX3MwLCAyMjk4MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X3ZybXB5ZWhfYWNjX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X3ZybXB5ZWhfYWNjX3MxLCAyMzAxNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X3ZybXB5ZWhfYWNjX3MxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X3ZybXB5ZWhfczAsIDIzMDUyfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfdnJtcHllaF9zMAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNF92cm1weWVoX3MxLCAyMzA4NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X3ZybXB5ZWhfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfdnJtcHlvaF9hY2NfczAsIDIzMTE2fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfdnJtcHlvaF9hY2NfczAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfdnJtcHlvaF9hY2NfczEsIDIzMTUyfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfdnJtcHlvaF9hY2NfczEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfdnJtcHlvaF9zMCwgMjMxODh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF92cm1weW9oX3MwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX000X3ZybXB5b2hfczEsIDIzMjIwfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfdnJtcHlvaF9zMQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNF94b3JfYW5kLCAyMzI1Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X3hvcl9hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfeG9yX2FuZG4sIDIzMjgxfSwgLy8gX19idWlsdGluX0hFWEFHT05fTTRfeG9yX2FuZG4KKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTRfeG9yX29yLCAyMzMxMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX000X3hvcl9vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNF94b3JfeGFjYywgMjMzMzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNF94b3JfeGFjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNV92ZG1hY2JzdSwgMjMzNjl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNV92ZG1hY2JzdQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNV92ZG1weWJzdSwgMjMzOTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNV92ZG1weWJzdQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNV92bWFjYnN1LCAyMzQyOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX001X3ZtYWNic3UKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTVfdm1hY2J1dSwgMjM0NTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9NNV92bWFjYnV1CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX001X3ZtcHlic3UsIDIzNDg3fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTVfdm1weWJzdQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNV92bXB5YnV1LCAyMzUxNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX001X3ZtcHlidXUKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTVfdnJtYWNic3UsIDIzNTQ1fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTVfdnJtYWNic3UKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTVfdnJtYWNidXUsIDIzNTc1fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTVfdnJtYWNidXUKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTVfdnJtcHlic3UsIDIzNjA1fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTVfdnJtcHlic3UKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTVfdnJtcHlidXUsIDIzNjM1fSwgLy8gX19idWlsdGluX0hFWEFHT05fTTVfdnJtcHlidXUKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fTTZfdmFic2RpZmZiLCAyMzY2NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX002X3ZhYnNkaWZmYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9NNl92YWJzZGlmZnViLCAyMzY5Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX002X3ZhYnNkaWZmdWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYWRkYXNsX3JycmksIDIzNzI4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYWRkYXNsX3JycmkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX2lfcCwgMjM3NjF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfaV9wCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2FzbF9pX3BfYWNjLCAyMzc5MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9pX3BfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2FzbF9pX3BfYW5kLCAyMzgyM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9pX3BfYW5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2FzbF9pX3BfbmFjLCAyMzg1Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9pX3BfbmFjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2FzbF9pX3Bfb3IsIDIzODg5fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX2lfcF9vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc2xfaV9wX3hhY2MsIDIzOTIxfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX2lfcF94YWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2FzbF9pX3IsIDIzOTU1fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX2lfcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc2xfaV9yX2FjYywgMjM5ODR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfaV9yX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc2xfaV9yX2FuZCwgMjQwMTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfaV9yX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc2xfaV9yX25hYywgMjQwNTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfaV9yX25hYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc2xfaV9yX29yLCAyNDA4M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9pX3Jfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX2lfcl9zYXQsIDI0MTE1fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX2lfcl9zYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX2lfcl94YWNjLCAyNDE0OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9pX3JfeGFjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc2xfaV92aCwgMjQxODJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfaV92aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc2xfaV92dywgMjQyMTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfaV92dworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc2xfcl9wLCAyNDI0Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9yX3AKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX3JfcF9hY2MsIDI0MjcxfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX3JfcF9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX3JfcF9hbmQsIDI0MzA0fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX3JfcF9hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX3JfcF9uYWMsIDI0MzM3fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX3JfcF9uYWMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX3JfcF9vciwgMjQzNzB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfcl9wX29yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2FzbF9yX3BfeG9yLCAyNDQwMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9yX3BfeG9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2FzbF9yX3IsIDI0NDM1fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX3JfcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc2xfcl9yX2FjYywgMjQ0NjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfcl9yX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc2xfcl9yX2FuZCwgMjQ0OTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfcl9yX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc2xfcl9yX25hYywgMjQ1MzB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc2xfcl9yX25hYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc2xfcl9yX29yLCAyNDU2M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2FzbF9yX3Jfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX3Jfcl9zYXQsIDI0NTk1fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX3Jfcl9zYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX3JfdmgsIDI0NjI4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX3JfdmgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNsX3JfdncsIDI0NjU4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNsX3JfdncKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNyX2lfcCwgMjQ2ODh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3JfaV9wCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9pX3BfYWNjLCAyNDcxN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9pX3BfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9pX3BfYW5kLCAyNDc1MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9pX3BfYW5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9pX3BfbmFjLCAyNDc4M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9pX3BfbmFjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9pX3Bfb3IsIDI0ODE2fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfcF9vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3JfaV9wX3JuZCwgMjQ4NDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3JfaV9wX3JuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3JfaV9wX3JuZF9nb29kc3ludGF4LCAyNDg4MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9pX3Bfcm5kX2dvb2RzeW50YXgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNyX2lfciwgMjQ5MjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3JfaV9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9pX3JfYWNjLCAyNDk1NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9pX3JfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9pX3JfYW5kLCAyNDk4N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9pX3JfYW5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9pX3JfbmFjLCAyNTAyMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9pX3JfbmFjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9pX3Jfb3IsIDI1MDUzfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfcl9vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3JfaV9yX3JuZCwgMjUwODV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3JfaV9yX3JuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3JfaV9yX3JuZF9nb29kc3ludGF4LCAyNTExOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9pX3Jfcm5kX2dvb2RzeW50YXgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNyX2lfc3Z3X3RydW4sIDI1MTYyfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfc3Z3X3RydW4KKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNyX2lfdmgsIDI1MTk4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfdmgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNyX2lfdncsIDI1MjI4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNyX2lfdncKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNyX3JfcCwgMjUyNTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3Jfcl9wCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9yX3BfYWNjLCAyNTI4N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9yX3BfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9yX3BfYW5kLCAyNTMyMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9yX3BfYW5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9yX3BfbmFjLCAyNTM1M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9yX3BfbmFjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9yX3Bfb3IsIDI1Mzg2fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNyX3JfcF9vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3Jfcl9wX3hvciwgMjU0MTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3Jfcl9wX3hvcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9hc3Jfcl9yLCAyNTQ1MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9yX3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNyX3Jfcl9hY2MsIDI1NDgwfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNyX3Jfcl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNyX3Jfcl9hbmQsIDI1NTEzfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNyX3Jfcl9hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNyX3Jfcl9uYWMsIDI1NTQ2fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYXNyX3Jfcl9uYWMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfYXNyX3Jfcl9vciwgMjU1Nzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9hc3Jfcl9yX29yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9yX3Jfc2F0LCAyNTYxMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9yX3Jfc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9yX3N2d190cnVuLCAyNTY0NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9yX3N2d190cnVuCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9yX3ZoLCAyNTY4MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9yX3ZoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2Fzcl9yX3Z3LCAyNTcxMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2Fzcl9yX3Z3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2JyZXYsIDI1NzQwfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfYnJldgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9icmV2cCwgMjU3NjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9icmV2cAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9jYWJhY2VuY2JpbiwgMjU3OTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9jYWJhY2VuY2JpbgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9jbDAsIDI1ODI2fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfY2wwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2NsMHAsIDI1ODUxfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfY2wwcAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9jbDEsIDI1ODc3fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfY2wxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2NsMXAsIDI1OTAyfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfY2wxcAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9jbGIsIDI1OTI4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfY2xiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2NsYm5vcm0sIDI1OTUzfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfY2xibm9ybQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9jbGJwLCAyNTk4Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2NsYnAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfY2xyYml0X2ksIDI2MDA4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfY2xyYml0X2kKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfY2xyYml0X3IsIDI2MDM4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfY2xyYml0X3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfY3QwLCAyNjA2OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2N0MAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9jdDBwLCAyNjA5M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2N0MHAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfY3QxLCAyNjExOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2N0MQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9jdDFwLCAyNjE0NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2N0MXAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfZGVpbnRlcmxlYXZlLCAyNjE3MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2RlaW50ZXJsZWF2ZQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9leHRyYWN0dSwgMjYyMDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9leHRyYWN0dQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9leHRyYWN0dV9ycCwgMjYyMzR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9leHRyYWN0dV9ycAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9leHRyYWN0dXAsIDI2MjY3fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfZXh0cmFjdHVwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2V4dHJhY3R1cF9ycCwgMjYyOTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9leHRyYWN0dXBfcnAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfaW5zZXJ0LCAyNjMzMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2luc2VydAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9pbnNlcnRfcnAsIDI2MzYwfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfaW5zZXJ0X3JwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2luc2VydHAsIDI2MzkxfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfaW5zZXJ0cAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9pbnNlcnRwX3JwLCAyNjQyMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2luc2VydHBfcnAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfaW50ZXJsZWF2ZSwgMjY0NTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9pbnRlcmxlYXZlCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xmc3AsIDI2NDg0fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbGZzcAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc2xfcl9wLCAyNjUxMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzbF9yX3AKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNsX3JfcF9hY2MsIDI2NTM5fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNsX3JfcF9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNsX3JfcF9hbmQsIDI2NTcyfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNsX3JfcF9hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNsX3JfcF9uYWMsIDI2NjA1fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNsX3JfcF9uYWMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNsX3JfcF9vciwgMjY2Mzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc2xfcl9wX29yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzbF9yX3BfeG9yLCAyNjY3MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzbF9yX3BfeG9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzbF9yX3IsIDI2NzAzfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNsX3JfcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc2xfcl9yX2FjYywgMjY3MzJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc2xfcl9yX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc2xfcl9yX2FuZCwgMjY3NjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc2xfcl9yX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc2xfcl9yX25hYywgMjY3OTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc2xfcl9yX25hYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc2xfcl9yX29yLCAyNjgzMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzbF9yX3Jfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNsX3JfdmgsIDI2ODYzfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNsX3JfdmgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNsX3JfdncsIDI2ODkzfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNsX3JfdncKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNyX2lfcCwgMjY5MjN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3JfaV9wCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzcl9pX3BfYWNjLCAyNjk1Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9pX3BfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzcl9pX3BfYW5kLCAyNjk4NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9pX3BfYW5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzcl9pX3BfbmFjLCAyNzAxOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9pX3BfbmFjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzcl9pX3Bfb3IsIDI3MDUxfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNyX2lfcF9vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc3JfaV9wX3hhY2MsIDI3MDgzfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNyX2lfcF94YWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzcl9pX3IsIDI3MTE3fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNyX2lfcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc3JfaV9yX2FjYywgMjcxNDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3JfaV9yX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc3JfaV9yX2FuZCwgMjcxNzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3JfaV9yX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc3JfaV9yX25hYywgMjcyMTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3JfaV9yX25hYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc3JfaV9yX29yLCAyNzI0NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9pX3Jfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNyX2lfcl94YWNjLCAyNzI3N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9pX3JfeGFjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc3JfaV92aCwgMjczMTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3JfaV92aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc3JfaV92dywgMjczNDF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3JfaV92dworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc3Jfcl9wLCAyNzM3MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9yX3AKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNyX3JfcF9hY2MsIDI3NDAwfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNyX3JfcF9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNyX3JfcF9hbmQsIDI3NDMzfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNyX3JfcF9hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNyX3JfcF9uYWMsIDI3NDY2fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNyX3JfcF9uYWMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNyX3JfcF9vciwgMjc0OTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3Jfcl9wX29yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzcl9yX3BfeG9yLCAyNzUzMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9yX3BfeG9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX2xzcl9yX3IsIDI3NTY0fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNyX3JfcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc3Jfcl9yX2FjYywgMjc1OTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3Jfcl9yX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc3Jfcl9yX2FuZCwgMjc2MjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3Jfcl9yX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc3Jfcl9yX25hYywgMjc2NTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9sc3Jfcl9yX25hYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9sc3Jfcl9yX29yLCAyNzY5Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX2xzcl9yX3Jfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNyX3JfdmgsIDI3NzI0fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNyX3JfdmgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfbHNyX3JfdncsIDI3NzU0fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfbHNyX3JfdncKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfcGFja2hsLCAyNzc4NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3BhY2tobAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9wYXJpdHlwLCAyNzgxMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3Bhcml0eXAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfc2V0Yml0X2ksIDI3ODQxfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfc2V0Yml0X2kKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfc2V0Yml0X3IsIDI3ODcxfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfc2V0Yml0X3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfc2h1ZmZlYiwgMjc5MDF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9zaHVmZmViCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3NodWZmZWgsIDI3OTMwfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfc2h1ZmZlaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9zaHVmZm9iLCAyNzk1OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3NodWZmb2IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfc2h1ZmZvaCwgMjc5ODh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl9zaHVmZm9oCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3N0b3Jld19sb2NrZWQsIDI4MTE0fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfc3RvcmV3X2xvY2tlZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9zdnNhdGhiLCAyODE0OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3N2c2F0aGIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfc3ZzYXRodWIsIDI4MTc4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfc3ZzYXRodWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdGFibGVpZHhiX2dvb2RzeW50YXgsIDI4MjA4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdGFibGVpZHhiX2dvb2RzeW50YXgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdGFibGVpZHhkX2dvb2RzeW50YXgsIDI4MjUwfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdGFibGVpZHhkX2dvb2RzeW50YXgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdGFibGVpZHhoX2dvb2RzeW50YXgsIDI4MjkyfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdGFibGVpZHhoX2dvb2RzeW50YXgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdGFibGVpZHh3X2dvb2RzeW50YXgsIDI4MzM0fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdGFibGVpZHh3X2dvb2RzeW50YXgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdG9nZ2xlYml0X2ksIDI4Mzc2fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdG9nZ2xlYml0X2kKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdG9nZ2xlYml0X3IsIDI4NDA5fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdG9nZ2xlYml0X3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdHN0Yml0X2ksIDI4NDQyfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdHN0Yml0X2kKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdHN0Yml0X3IsIDI4NDcyfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdHN0Yml0X3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdmFsaWduaWIsIDI4NTAyfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdmFsaWduaWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdmFsaWducmIsIDI4NTMyfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdmFsaWducmIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdmNuZWdoLCAyODU2Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3ZjbmVnaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl92Y3JvdGF0ZSwgMjg1OTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl92Y3JvdGF0ZQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl92cmNuZWdoLCAyODYyMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3ZyY25lZ2gKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdnJuZHBhY2t3aCwgMjg2NDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl92cm5kcGFja3doCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3ZybmRwYWNrd2hzLCAyODY4MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3ZybmRwYWNrd2hzCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3ZzYXRoYiwgMjg3MTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl92c2F0aGIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdnNhdGhiX25vcGFjaywgMjg3NDJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl92c2F0aGJfbm9wYWNrCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3ZzYXRodWIsIDI4Nzc3fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdnNhdGh1YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl92c2F0aHViX25vcGFjaywgMjg4MDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl92c2F0aHViX25vcGFjaworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl92c2F0d2gsIDI4ODQyfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdnNhdHdoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3ZzYXR3aF9ub3BhY2ssIDI4ODcwfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdnNhdHdoX25vcGFjaworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl92c2F0d3VoLCAyODkwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3ZzYXR3dWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdnNhdHd1aF9ub3BhY2ssIDI4OTM0fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdnNhdHd1aF9ub3BhY2sKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdnNwbGF0cmIsIDI4OTcwfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdnNwbGF0cmIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdnNwbGF0cmgsIDI5MDAwfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdnNwbGF0cmgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdnNwbGljZWliLCAyOTAzMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3ZzcGxpY2VpYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl92c3BsaWNlcmIsIDI5MDYxfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdnNwbGljZXJiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3ZzeHRiaCwgMjkwOTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl92c3h0YmgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfdnN4dGh3LCAyOTEyMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1MyX3ZzeHRodworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl92dHJ1bmVoYiwgMjkxNDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl92dHJ1bmVoYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl92dHJ1bmV3aCwgMjkxNzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl92dHJ1bmV3aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl92dHJ1bm9oYiwgMjkyMDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl92dHJ1bm9oYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl92dHJ1bm93aCwgMjkyMzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl92dHJ1bm93aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl92enh0YmgsIDI5MjY4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzJfdnp4dGJoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3Z6eHRodywgMjkyOTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TMl92enh0aHcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzRfYWRkYWRkaSwgMjkzMjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF9hZGRhZGRpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X2FkZGlfYXNsX3JpLCAyOTM1M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X2FkZGlfYXNsX3JpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X2FkZGlfbHNyX3JpLCAyOTM4Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X2FkZGlfbHNyX3JpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X2FuZGlfYXNsX3JpLCAyOTQxOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X2FuZGlfYXNsX3JpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X2FuZGlfbHNyX3JpLCAyOTQ1Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X2FuZGlfbHNyX3JpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X2NsYmFkZGksIDI5NDg1fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzRfY2xiYWRkaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF9jbGJwYWRkaSwgMjk1MTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF9jbGJwYWRkaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF9jbGJwbm9ybSwgMjk1NDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF9jbGJwbm9ybQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF9leHRyYWN0LCAyOTU3NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X2V4dHJhY3QKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzRfZXh0cmFjdF9ycCwgMjk2MDN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF9leHRyYWN0X3JwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X2V4dHJhY3RwLCAyOTYzNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X2V4dHJhY3RwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X2V4dHJhY3RwX3JwLCAyOTY2NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X2V4dHJhY3RwX3JwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X2xzbGksIDI5Njk4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzRfbHNsaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF9udHN0Yml0X2ksIDI5NzI0fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzRfbnRzdGJpdF9pCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X250c3RiaXRfciwgMjk3NTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF9udHN0Yml0X3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzRfb3JfYW5kaSwgMjk3ODZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF9vcl9hbmRpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X29yX2FuZGl4LCAyOTgxNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X29yX2FuZGl4CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X29yX29yaSwgMjk4NDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF9vcl9vcmkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzRfb3JpX2FzbF9yaSwgMjk4NzN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNF9vcmlfYXNsX3JpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X29yaV9sc3JfcmksIDI5OTA1fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzRfb3JpX2xzcl9yaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF9wYXJpdHksIDI5OTM3fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzRfcGFyaXR5CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X3N0b3JlZF9sb2NrZWQsIDI5OTY1fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzRfc3RvcmVkX2xvY2tlZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF9zdWJhZGRpLCAzMDAwMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X3N1YmFkZGkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzRfc3ViaV9hc2xfcmksIDMwMDI5fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzRfc3ViaV9hc2xfcmkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzRfc3ViaV9sc3JfcmksIDMwMDYyfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzRfc3ViaV9sc3JfcmkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzRfdnJjcm90YXRlLCAzMDA5NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X3ZyY3JvdGF0ZQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF92cmNyb3RhdGVfYWNjLCAzMDEyNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X3ZyY3JvdGF0ZV9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzRfdnhhZGRzdWJoLCAzMDE2MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X3Z4YWRkc3ViaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF92eGFkZHN1YmhyLCAzMDE5Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X3Z4YWRkc3ViaHIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzRfdnhhZGRzdWJ3LCAzMDIyNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M0X3Z4YWRkc3VidworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF92eHN1YmFkZGgsIDMwMjU1fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzRfdnhzdWJhZGRoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M0X3Z4c3ViYWRkaHIsIDMwMjg2fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzRfdnhzdWJhZGRocgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNF92eHN1YmFkZHcsIDMwMzE4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzRfdnhzdWJhZGR3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M1X2Fzcmh1Yl9ybmRfc2F0X2dvb2RzeW50YXgsIDMwMzQ5fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzVfYXNyaHViX3JuZF9zYXRfZ29vZHN5bnRheAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNV9hc3JodWJfc2F0LCAzMDM5Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M1X2Fzcmh1Yl9zYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzVfcG9wY291bnRwLCAzMDQyOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M1X3BvcGNvdW50cAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNV92YXNyaHJuZF9nb29kc3ludGF4LCAzMDQ1OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M1X3Zhc3Jocm5kX2dvb2RzeW50YXgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzZfcm9sX2lfcCwgMzA1MDB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNl9yb2xfaV9wCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M2X3JvbF9pX3BfYWNjLCAzMDUyOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M2X3JvbF9pX3BfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M2X3JvbF9pX3BfYW5kLCAzMDU2Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M2X3JvbF9pX3BfYW5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M2X3JvbF9pX3BfbmFjLCAzMDU5NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M2X3JvbF9pX3BfbmFjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M2X3JvbF9pX3Bfb3IsIDMwNjI4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzZfcm9sX2lfcF9vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNl9yb2xfaV9wX3hhY2MsIDMwNjYwfSwgLy8gX19idWlsdGluX0hFWEFHT05fUzZfcm9sX2lfcF94YWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M2X3JvbF9pX3IsIDMwNjk0fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzZfcm9sX2lfcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNl9yb2xfaV9yX2FjYywgMzA3MjN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNl9yb2xfaV9yX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNl9yb2xfaV9yX2FuZCwgMzA3NTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNl9yb2xfaV9yX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNl9yb2xfaV9yX25hYywgMzA3ODl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNl9yb2xfaV9yX25hYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNl9yb2xfaV9yX29yLCAzMDgyMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M2X3JvbF9pX3Jfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzZfcm9sX2lfcl94YWNjLCAzMDg1NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M2X3JvbF9pX3JfeGFjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TNl92c3BsYXRyYnAsIDMwODg4fSwgLy8gX19idWlsdGluX0hFWEFHT05fUzZfdnNwbGF0cmJwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1M2X3Z0cnVuZWhiX3BwcCwgMzA5MTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9TNl92dHJ1bmVoYl9wcHAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzZfdnRydW5vaGJfcHBwLCAzMDk1M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1M2X3Z0cnVub2hiX3BwcAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9leHRyYWN0dywgMzA5ODd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9leHRyYWN0dworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9leHRyYWN0d18xMjhCLCAzMTAxN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X2V4dHJhY3R3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfaGksIDMxMDUyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfaGkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfaGlfMTI4QiwgMzEwNzZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9oaV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X2xvLCAzMTEwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X2xvCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X2xvXzEyOEIsIDMxMTI5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfbG9fMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9sdnNwbGF0YiwgMzExNTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9sdnNwbGF0YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9sdnNwbGF0Yl8xMjhCLCAzMTE4OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X2x2c3BsYXRiXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfbHZzcGxhdGgsIDMxMjIzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfbHZzcGxhdGgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfbHZzcGxhdGhfMTI4QiwgMzEyNTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9sdnNwbGF0aF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X2x2c3BsYXR3LCAzMTI4OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X2x2c3BsYXR3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X2x2c3BsYXR3XzEyOEIsIDMxMzE4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfbHZzcGxhdHdfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9wcmVkX2FuZCwgMzEzNTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9wcmVkX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9wcmVkX2FuZF8xMjhCLCAzMTM4M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ByZWRfYW5kXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfcHJlZF9hbmRfbiwgMzE0MTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9wcmVkX2FuZF9uCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ByZWRfYW5kX25fMTI4QiwgMzE0NTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9wcmVkX2FuZF9uXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfcHJlZF9ub3QsIDMxNDg3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF9ub3QKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfcHJlZF9ub3RfMTI4QiwgMzE1MTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9wcmVkX25vdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ByZWRfb3IsIDMxNTUyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF9vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9wcmVkX29yXzEyOEIsIDMxNTgxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF9vcl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ByZWRfb3JfbiwgMzE2MTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9wcmVkX29yX24KKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfcHJlZF9vcl9uXzEyOEIsIDMxNjQ2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF9vcl9uXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfcHJlZF9zY2FsYXIyLCAzMTY4Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ByZWRfc2NhbGFyMgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9wcmVkX3NjYWxhcjJfMTI4QiwgMzE3MTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9wcmVkX3NjYWxhcjJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9wcmVkX3NjYWxhcjJ2MiwgMzE3NTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9wcmVkX3NjYWxhcjJ2MgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9wcmVkX3NjYWxhcjJ2Ml8xMjhCLCAzMTc5MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ByZWRfc2NhbGFyMnYyXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfcHJlZF94b3IsIDMxODMyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfcHJlZF94b3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfcHJlZF94b3JfMTI4QiwgMzE4NjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9wcmVkX3hvcl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3NodWZmZXFoLCAzMTg5N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3NodWZmZXFoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3NodWZmZXFoXzEyOEIsIDMxOTI3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfc2h1ZmZlcWhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9zaHVmZmVxdywgMzE5NjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl9zaHVmZmVxdworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl9zaHVmZmVxd18xMjhCLCAzMTk5Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3NodWZmZXF3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdlMzMmJfbnFwcmVkX2FpLCAzMjAyN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZTMzJiX25xcHJlZF9haQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92UzMyYl9ucXByZWRfYWlfMTI4QiwgMzIwNjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92UzMyYl9ucXByZWRfYWlfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92UzMyYl9udF9ucXByZWRfYWksIDMyMTA2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdlMzMmJfbnRfbnFwcmVkX2FpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZTMzJiX250X25xcHJlZF9haV8xMjhCLCAzMjE0Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZTMzJiX250X25xcHJlZF9haV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZTMzJiX250X3FwcmVkX2FpLCAzMjE5MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZTMzJiX250X3FwcmVkX2FpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZTMzJiX250X3FwcmVkX2FpXzEyOEIsIDMyMjMwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdlMzMmJfbnRfcXByZWRfYWlfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92UzMyYl9xcHJlZF9haSwgMzIyNzR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92UzMyYl9xcHJlZF9haQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92UzMyYl9xcHJlZF9haV8xMjhCLCAzMjMxMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZTMzJiX3FwcmVkX2FpXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFic2IsIDMyMzUxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFic2IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFic2JfMTI4QiwgMzIzNzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzYl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhYnNiX3NhdCwgMzI0MTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzYl9zYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFic2Jfc2F0XzEyOEIsIDMyNDQxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFic2Jfc2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFic2RpZmZoLCAzMjQ3N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnNkaWZmaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWJzZGlmZmhfMTI4QiwgMzI1MDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWJzZGlmZmhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWJzZGlmZnViLCAzMjU0NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnNkaWZmdWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFic2RpZmZ1Yl8xMjhCLCAzMjU3Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnNkaWZmdWJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWJzZGlmZnVoLCAzMjYxM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnNkaWZmdWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFic2RpZmZ1aF8xMjhCLCAzMjY0NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnNkaWZmdWhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWJzZGlmZncsIDMyNjgyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFic2RpZmZ3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhYnNkaWZmd18xMjhCLCAzMjcxM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnNkaWZmd18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhYnNoLCAzMjc0OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnNoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhYnNoXzEyOEIsIDMyNzc2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFic2hfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWJzaF9zYXQsIDMyODA4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFic2hfc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhYnNoX3NhdF8xMjhCLCAzMjgzOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnNoX3NhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhYnN3LCAzMjg3NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnN3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhYnN3XzEyOEIsIDMyOTAyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFic3dfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWJzd19zYXQsIDMyOTM0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFic3dfc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhYnN3X3NhdF8xMjhCLCAzMjk2NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhYnN3X3NhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRiLCAzMzAwMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRiXzEyOEIsIDMzMDI4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkYl9kdiwgMzMwNjB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkYl9kdgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkYl9kdl8xMjhCLCAzMzA5MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRiX2R2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGJucSwgMzMxMjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkYm5xCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRibnFfMTI4QiwgMzMxNTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkYm5xXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGJxLCAzMzE4OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRicQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkYnFfMTI4QiwgMzMyMTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkYnFfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkYnNhdCwgMzMyNDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkYnNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkYnNhdF8xMjhCLCAzMzI3OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRic2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGJzYXRfZHYsIDMzMzE0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGJzYXRfZHYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGJzYXRfZHZfMTI4QiwgMzMzNDd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkYnNhdF9kdl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRjbGJoLCAzMzQ1Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRjbGJoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRjbGJoXzEyOEIsIDMzNDgyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGNsYmhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkY2xidywgMzM1MTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkY2xidworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkY2xid18xMjhCLCAzMzU0N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRjbGJ3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGgsIDMzNTgyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGhfMTI4QiwgMzM2MDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkaF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRoX2R2LCAzMzY0MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRoX2R2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRoX2R2XzEyOEIsIDMzNjcxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGhfZHZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkaG5xLCAzMzcwNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRobnEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGhucV8xMjhCLCAzMzczNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRobnFfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkaHEsIDMzNzY5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGhxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRocV8xMjhCLCAzMzc5N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRocV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRoc2F0LCAzMzgzMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRoc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRoc2F0XzEyOEIsIDMzODYwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZGhzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkaHNhdF9kdiwgMzM4OTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkaHNhdF9kdgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkaHNhdF9kdl8xMjhCLCAzMzkyOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRoc2F0X2R2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGh3LCAzMzk2Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRodworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkaHdfMTI4QiwgMzM5OTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkaHdfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkaHdfYWNjLCAzNDAyN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRod19hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGh3X2FjY18xMjhCLCAzNDA1OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGRod19hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkdWJoLCAzNDA5Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1YmgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHViaF8xMjhCLCAzNDEyNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1YmhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkdWJoX2FjYywgMzQxNTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWJoX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkdWJoX2FjY18xMjhCLCAzNDE5Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1YmhfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHVic2F0LCAzNDIzMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1YnNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkdWJzYXRfMTI4QiwgMzQyNjF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWJzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkdWJzYXRfZHYsIDM0Mjk3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHVic2F0X2R2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGR1YnNhdF9kdl8xMjhCLCAzNDMzMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1YnNhdF9kdl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGR1YnViYl9zYXQsIDM0MzcwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHVidWJiX3NhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkdWJ1YmJfc2F0XzEyOEIsIDM0NDA1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHVidWJiX3NhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGR1aHNhdCwgMzQ0NDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWhzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHVoc2F0XzEyOEIsIDM0NDc2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHVoc2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHVoc2F0X2R2LCAzNDUxMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1aHNhdF9kdgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkdWhzYXRfZHZfMTI4QiwgMzQ1NDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWhzYXRfZHZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkdWh3LCAzNDU4NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1aHcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHVod18xMjhCLCAzNDYxNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1aHdfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkdWh3X2FjYywgMzQ2NDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdWh3X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkdWh3X2FjY18xMjhCLCAzNDY4MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1aHdfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHV3c2F0LCAzNDcxOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1d3NhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkdXdzYXRfMTI4QiwgMzQ3NTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkdXdzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkdXdzYXRfZHYsIDM0Nzg2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHV3c2F0X2R2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGR1d3NhdF9kdl8xMjhCLCAzNDgyMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR1d3NhdF9kdl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGR3LCAzNDg1OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGR3XzEyOEIsIDM0ODg2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHdfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkd19kdiwgMzQ5MTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkd19kdgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkd19kdl8xMjhCLCAzNDk0OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR3X2R2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHducSwgMzQ5ODN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkd25xCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGR3bnFfMTI4QiwgMzUwMTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkd25xXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHdxLCAzNTA0Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR3cQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkd3FfMTI4QiwgMzUwNzR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkd3FfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkd3NhdCwgMzUxMDd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkd3NhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWRkd3NhdF8xMjhCLCAzNTEzN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhZGR3c2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHdzYXRfZHYsIDM1MTcyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFkZHdzYXRfZHYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZHdzYXRfZHZfMTI4QiwgMzUyMDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YWRkd3NhdF9kdl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhbGlnbmIsIDM1MjQzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFsaWduYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YWxpZ25iXzEyOEIsIDM1MjcyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFsaWduYl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhbGlnbmJpLCAzNTMwNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbGlnbmJpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhbGlnbmJpXzEyOEIsIDM1MzM2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFsaWduYmlfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YW5kLCAzNTM3MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFuZF8xMjhCLCAzNTM5N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbmRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YW5kbnFydCwgMzU0Mjh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YW5kbnFydAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YW5kbnFydF8xMjhCLCAzNTQ1OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbmRucXJ0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFuZG5xcnRfYWNjLCAzNTQ5M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbmRucXJ0X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YW5kbnFydF9hY2NfMTI4QiwgMzU1Mjd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YW5kbnFydF9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YW5kcXJ0LCAzNTU2Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbmRxcnQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFuZHFydF8xMjhCLCAzNTU5NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbmRxcnRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YW5kcXJ0X2FjYywgMzU2Mjl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YW5kcXJ0X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YW5kcXJ0X2FjY18xMjhCLCAzNTY2Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbmRxcnRfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFuZHZucXYsIDM1NzAwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFuZHZucXYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFuZHZucXZfMTI4QiwgMzU3MzB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YW5kdm5xdl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhbmR2cXYsIDM1NzY1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFuZHZxdgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YW5kdnF2XzEyOEIsIDM1Nzk0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFuZHZxdl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhbmR2cnQsIDM1ODI4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFuZHZydAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YW5kdnJ0XzEyOEIsIDM1ODU3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFuZHZydF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhbmR2cnRfYWNjLCAzNTg5MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhbmR2cnRfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhbmR2cnRfYWNjXzEyOEIsIDM1OTI0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFuZHZydF9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNsaCwgMzU5NjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNsaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNsaF8xMjhCLCAzNTk4OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc2xoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzbGhfYWNjLCAzNjAyMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc2xoX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNsaF9hY2NfMTI4QiwgMzYwNTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNsaF9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNsaHYsIDM2MDg4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzbGh2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc2xodl8xMjhCLCAzNjExNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc2xodl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc2x3LCAzNjE0OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc2x3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc2x3XzEyOEIsIDM2MTc2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzbHdfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNsd19hY2MsIDM2MjA4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzbHdfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc2x3X2FjY18xMjhCLCAzNjIzOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc2x3X2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc2x3diwgMzYyNzV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNsd3YKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzbHd2XzEyOEIsIDM2MzAzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzbHd2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcmgsIDM2MzM2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcmgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcmhfMTI4QiwgMzYzNjN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyaF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3JoX2FjYywgMzYzOTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyaF9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcmhfYWNjXzEyOEIsIDM2NDI2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcmhfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcmhicm5kc2F0LCAzNjQ2Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3JoYnJuZHNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyaGJybmRzYXRfMTI4QiwgMzY0OTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyaGJybmRzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyaGJzYXQsIDM2NTM1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcmhic2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3JoYnNhdF8xMjhCLCAzNjU2Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3JoYnNhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3JodWJybmRzYXQsIDM2NjAyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcmh1YnJuZHNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyaHVicm5kc2F0XzEyOEIsIDM2NjM3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcmh1YnJuZHNhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3JodWJzYXQsIDM2Njc3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcmh1YnNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyaHVic2F0XzEyOEIsIDM2NzA5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcmh1YnNhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3JodiwgMzY3NDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyaHYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcmh2XzEyOEIsIDM2Nzc0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcmh2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcnVodWJybmRzYXQsIDM2ODA3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcnVodWJybmRzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcnVodWJybmRzYXRfMTI4QiwgMzY4NDN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNydWh1YnJuZHNhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3J1aHVic2F0LCAzNjg4NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J1aHVic2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3J1aHVic2F0XzEyOEIsIDM2OTE3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcnVodWJzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNydXd1aHJuZHNhdCwgMzY5NTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNydXd1aHJuZHNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNydXd1aHJuZHNhdF8xMjhCLCAzNjk5MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J1d3Vocm5kc2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcnV3dWhzYXQsIDM3MDMyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcnV3dWhzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcnV3dWhzYXRfMTI4QiwgMzcwNjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNydXd1aHNhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3J3LCAzNzEwM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3J3XzEyOEIsIDM3MTMwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcndfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyd19hY2MsIDM3MTYyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcndfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3J3X2FjY18xMjhCLCAzNzE5M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J3X2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3J3aCwgMzcyMjl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyd2gKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcndoXzEyOEIsIDM3MjU3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcndoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcndocm5kc2F0LCAzNzI5MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J3aHJuZHNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyd2hybmRzYXRfMTI4QiwgMzczMjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyd2hybmRzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyd2hzYXQsIDM3MzYzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcndoc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3J3aHNhdF8xMjhCLCAzNzM5NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhc3J3aHNhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3J3dWhybmRzYXQsIDM3NDMwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcnd1aHJuZHNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyd3Vocm5kc2F0XzEyOEIsIDM3NDY1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcnd1aHJuZHNhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3J3dWhzYXQsIDM3NTA1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcnd1aHNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXNyd3Voc2F0XzEyOEIsIDM3NTM3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcnd1aHNhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3J3diwgMzc1NzR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNyd3YKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzcnd2XzEyOEIsIDM3NjAyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzcnd2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzc2lnbiwgMzc2MzV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNzaWduCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhc3NpZ25fMTI4QiwgMzc2NjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNzaWduXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzc2lnbnAsIDM3Njk4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmFzc2lnbnAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFzc2lnbnBfMTI4QiwgMzc3Mjh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXNzaWducF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhdmdiLCAzNzc2M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZhdmdiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhdmdiXzEyOEIsIDM3NzkwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z2JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXZnYnJuZCwgMzc4MjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZnYnJuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXZnYnJuZF8xMjhCLCAzNzg1Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhdmdicm5kXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmF2Z2gsIDM3ODg3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z2gKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmF2Z2hfMTI4QiwgMzc5MTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZnaF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhdmdocm5kLCAzNzk0Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhdmdocm5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhdmdocm5kXzEyOEIsIDM3OTc2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z2hybmRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXZndWIsIDM4MDExfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z3ViCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhdmd1Yl8xMjhCLCAzODAzOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhdmd1Yl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhdmd1YnJuZCwgMzgwNzJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZndWJybmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmF2Z3Vicm5kXzEyOEIsIDM4MTAzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z3Vicm5kXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmF2Z3VoLCAzODEzOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhdmd1aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXZndWhfMTI4QiwgMzgxNjd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZndWhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXZndWhybmQsIDM4MjAwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z3Vocm5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhdmd1aHJuZF8xMjhCLCAzODIzMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhdmd1aHJuZF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zhdmd1dywgMzgyNjd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZndXcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmF2Z3V3XzEyOEIsIDM4Mjk1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z3V3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmF2Z3V3cm5kLCAzODMyOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhdmd1d3JuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXZndXdybmRfMTI4QiwgMzgzNTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZndXdybmRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXZndywgMzgzOTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZndworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92YXZnd18xMjhCLCAzODQyMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zhdmd3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmF2Z3dybmQsIDM4NDU0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmF2Z3dybmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmF2Z3dybmRfMTI4QiwgMzg0ODR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92YXZnd3JuZF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZjbDBoLCAzODUxOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZjbDBoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZjbDBoXzEyOEIsIDM4NTQ2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmNsMGhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Y2wwdywgMzg1Nzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Y2wwdworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Y2wwd18xMjhCLCAzODYwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZjbDB3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmNvbWJpbmUsIDM4NjM3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmNvbWJpbmUKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmNvbWJpbmVfMTI4QiwgMzg2Njd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Y29tYmluZV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkMCwgMzg3MDJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZDAKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmQwXzEyOEIsIDM4NzI3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmQwXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRkMCwgMzg3NTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZGQwCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkZDBfMTI4QiwgMzg3ODN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZGQwXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRlYWxiLCAzODgxNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkZWFsYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZGVhbGI0dywgMzg4NzV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZGVhbGI0dworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZGVhbGI0d18xMjhCLCAzODkwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkZWFsYjR3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRlYWxiXzEyOEIsIDM4ODQyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRlYWxiXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRlYWxoLCAzODk0MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkZWFsaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZGVhbGhfMTI4QiwgMzg5Njh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZGVhbGhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZGVhbHZkZCwgMzkwMDF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZGVhbHZkZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZGVhbHZkZF8xMjhCLCAzOTAzMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkZWFsdmRkXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRlbHRhLCAzOTA2Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkZWx0YQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZGVsdGFfMTI4QiwgMzkwOTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZGVsdGFfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWJ1cywgMzkxMjd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWJ1cworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWJ1c18xMjhCLCAzOTE1N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5YnVzXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHlidXNfYWNjLCAzOTE5Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5YnVzX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWJ1c19hY2NfMTI4QiwgMzkyMjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWJ1c19hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWJ1c19kdiwgMzkyNjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWJ1c19kdgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWJ1c19kdl8xMjhCLCAzOTI5OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5YnVzX2R2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHlidXNfZHZfYWNjLCAzOTMzNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5YnVzX2R2X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWJ1c19kdl9hY2NfMTI4QiwgMzkzNzN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWJ1c19kdl9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWhiLCAzOTQxNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aGIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHloYl8xMjhCLCAzOTQ0NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aGJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWhiX2FjYywgMzk0Nzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhiX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWhiX2FjY18xMjhCLCAzOTUxMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aGJfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHloYl9kdiwgMzk1NDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhiX2R2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aGJfZHZfMTI4QiwgMzk1ODF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhiX2R2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHloYl9kdl9hY2MsIDM5NjE4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloYl9kdl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHloYl9kdl9hY2NfMTI4QiwgMzk2NTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhiX2R2X2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aGlzYXQsIDM5Njk1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloaXNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWhpc2F0XzEyOEIsIDM5NzI3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloaXNhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aGlzYXRfYWNjLCAzOTc2NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aGlzYXRfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aGlzYXRfYWNjXzEyOEIsIDM5ODAwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloaXNhdF9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWhzYXQsIDM5ODQxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aHNhdF8xMjhCLCAzOTg3Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZkbXB5aHNhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aHNhdF9hY2MsIDM5OTA4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloc2F0X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZG1weWhzYXRfYWNjXzEyOEIsIDM5OTQzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloc2F0X2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aHN1aXNhdCwgMzk5ODN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhzdWlzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHloc3Vpc2F0XzEyOEIsIDQwMDE3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloc3Vpc2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHloc3Vpc2F0X2FjYywgNDAwNTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhzdWlzYXRfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aHN1aXNhdF9hY2NfMTI4QiwgNDAwOTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhzdWlzYXRfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHloc3VzYXQsIDQwMTM3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloc3VzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHloc3VzYXRfMTI4QiwgNDAxNzB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhzdXNhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aHN1c2F0X2FjYywgNDAyMDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWhzdXNhdF9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHloc3VzYXRfYWNjXzEyOEIsIDQwMjQ1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHloc3VzYXRfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHlodnNhdCwgNDAyODd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWh2c2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZkbXB5aHZzYXRfMTI4QiwgNDAzMTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWh2c2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHlodnNhdF9hY2MsIDQwMzU2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRtcHlodnNhdF9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmRtcHlodnNhdF9hY2NfMTI4QiwgNDAzOTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZG1weWh2c2F0X2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zkc2FkdWgsIDQwNDMzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRzYWR1aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZHNhZHVoXzEyOEIsIDQwNDYyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRzYWR1aF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zkc2FkdWhfYWNjLCA0MDQ5Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zkc2FkdWhfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zkc2FkdWhfYWNjXzEyOEIsIDQwNTI5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmRzYWR1aF9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZXFiLCA0MDU2N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmVxYl8xMjhCLCA0MDU5M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcWJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZXFiX2FuZCwgNDA2MjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXFiX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZXFiX2FuZF8xMjhCLCA0MDY1NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcWJfYW5kXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmVxYl9vciwgNDA2ODl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXFiX29yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZlcWJfb3JfMTI4QiwgNDA3MTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXFiX29yXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmVxYl94b3IsIDQwNzUyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmVxYl94b3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmVxYl94b3JfMTI4QiwgNDA3ODJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXFiX3hvcl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZlcWgsIDQwODE3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmVxaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZXFoXzEyOEIsIDQwODQzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmVxaF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZlcWhfYW5kLCA0MDg3NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcWhfYW5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZlcWhfYW5kXzEyOEIsIDQwOTA0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmVxaF9hbmRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZXFoX29yLCA0MDkzOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcWhfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmVxaF9vcl8xMjhCLCA0MDk2OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcWhfb3JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZXFoX3hvciwgNDEwMDJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXFoX3hvcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZXFoX3hvcl8xMjhCLCA0MTAzMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcWhfeG9yXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmVxdywgNDEwNjd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXF3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZlcXdfMTI4QiwgNDEwOTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXF3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmVxd19hbmQsIDQxMTI0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmVxd19hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmVxd19hbmRfMTI4QiwgNDExNTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92ZXF3X2FuZF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZlcXdfb3IsIDQxMTg5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmVxd19vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92ZXF3X29yXzEyOEIsIDQxMjE4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmVxd19vcl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZlcXdfeG9yLCA0MTI1Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZlcXdfeG9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZlcXdfeG9yXzEyOEIsIDQxMjgyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmVxd194b3JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z2F0aGVybWgsIDQxMzE3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmdhdGhlcm1oCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZnYXRoZXJtaF8xMjhCLCA0MTM0OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZnYXRoZXJtaF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZnYXRoZXJtaHEsIDQxMzg0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmdhdGhlcm1ocQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z2F0aGVybWhxXzEyOEIsIDQxNDE2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmdhdGhlcm1ocV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZnYXRoZXJtaHcsIDQxNDUzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmdhdGhlcm1odworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z2F0aGVybWh3XzEyOEIsIDQxNDg1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmdhdGhlcm1od18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZnYXRoZXJtaHdxLCA0MTUyMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZnYXRoZXJtaHdxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZnYXRoZXJtaHdxXzEyOEIsIDQxNTU1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmdhdGhlcm1od3FfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z2F0aGVybXcsIDQxNTkzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmdhdGhlcm13CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZnYXRoZXJtd18xMjhCLCA0MTYyNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZnYXRoZXJtd18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZnYXRoZXJtd3EsIDQxNjYwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmdhdGhlcm13cQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z2F0aGVybXdxXzEyOEIsIDQxNjkyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmdhdGhlcm13cV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndGIsIDQxNzI5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3RiXzEyOEIsIDQxNzU1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0Yl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndGJfYW5kLCA0MTc4Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndGJfYW5kCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndGJfYW5kXzEyOEIsIDQxODE2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0Yl9hbmRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3RiX29yLCA0MTg1MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndGJfb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0Yl9vcl8xMjhCLCA0MTg4MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndGJfb3JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3RiX3hvciwgNDE5MTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3RiX3hvcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3RiX3hvcl8xMjhCLCA0MTk0NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndGJfeG9yXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0aCwgNDE5Nzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3RoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndGhfMTI4QiwgNDIwMDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3RoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0aF9hbmQsIDQyMDM2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0aF9hbmQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0aF9hbmRfMTI4QiwgNDIwNjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3RoX2FuZF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndGhfb3IsIDQyMTAxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0aF9vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3RoX29yXzEyOEIsIDQyMTMwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0aF9vcl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndGhfeG9yLCA0MjE2NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndGhfeG9yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndGhfeG9yXzEyOEIsIDQyMTk0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0aF94b3JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R1YiwgNDIyMjl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R1Yl8xMjhCLCA0MjI1Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHViXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dWJfYW5kLCA0MjI4OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHViX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R1Yl9hbmRfMTI4QiwgNDIzMTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1Yl9hbmRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R1Yl9vciwgNDIzNTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1Yl9vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R1Yl9vcl8xMjhCLCA0MjM4NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHViX29yXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dWJfeG9yLCA0MjQyMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHViX3hvcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R1Yl94b3JfMTI4QiwgNDI0NTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1Yl94b3JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R1aCwgNDI0ODd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R1aF8xMjhCLCA0MjUxNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHVoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dWhfYW5kLCA0MjU0Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHVoX2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R1aF9hbmRfMTI4QiwgNDI1Nzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1aF9hbmRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R1aF9vciwgNDI2MTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1aF9vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R1aF9vcl8xMjhCLCA0MjY0M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHVoX29yXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dWhfeG9yLCA0MjY3OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHVoX3hvcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R1aF94b3JfMTI4QiwgNDI3MDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1aF94b3JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R1dywgNDI3NDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1dworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R1d18xMjhCLCA0Mjc3Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHV3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dXdfYW5kLCA0MjgwNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHV3X2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R1d19hbmRfMTI4QiwgNDI4MzV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1d19hbmRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R1d19vciwgNDI4NzF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1d19vcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R1d19vcl8xMjhCLCA0MjkwMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHV3X29yXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0dXdfeG9yLCA0MjkzNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHV3X3hvcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R1d194b3JfMTI4QiwgNDI5Njd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R1d194b3JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R3LCA0MzAwM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0d18xMjhCLCA0MzAyOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHdfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R3X2FuZCwgNDMwNjB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R3X2FuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92Z3R3X2FuZF8xMjhCLCA0MzA5MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZndHdfYW5kXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0d19vciwgNDMxMjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R3X29yCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZndHdfb3JfMTI4QiwgNDMxNTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R3X29yXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0d194b3IsIDQzMTg4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmd0d194b3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmd0d194b3JfMTI4QiwgNDMyMTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92Z3R3X3hvcl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZpbnNlcnR3ciwgNDMyNTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92aW5zZXJ0d3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmluc2VydHdyXzEyOEIsIDQzMjg0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmluc2VydHdyXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmxhbGlnbmIsIDQzMzIwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmxhbGlnbmIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmxhbGlnbmJfMTI4QiwgNDMzNTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bGFsaWduYl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZsYWxpZ25iaSwgNDMzODV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bGFsaWduYmkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmxhbGlnbmJpXzEyOEIsIDQzNDE2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmxhbGlnbmJpXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmxzcmIsIDQzNDUyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmxzcmIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmxzcmJfMTI4QiwgNDM0Nzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHNyYl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zsc3JoLCA0MzUxMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zsc3JoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zsc3JoXzEyOEIsIDQzNTM4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmxzcmhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHNyaHYsIDQzNTcwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmxzcmh2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zsc3Jodl8xMjhCLCA0MzU5OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zsc3Jodl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zsc3J3LCA0MzYzMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zsc3J3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zsc3J3XzEyOEIsIDQzNjU4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmxzcndfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHNyd3YsIDQzNjkwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmxzcnd2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zsc3J3dl8xMjhCLCA0MzcxOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zsc3J3dl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZsdXQ0LCA0Mzc1MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXQ0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZsdXQ0XzEyOEIsIDQzNzc4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmx1dDRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHV0dnZiLCA0MzgxMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2dmIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmx1dHZ2Yl8xMjhCLCA0MzgzOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2dmJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHV0dnZiX25tLCA0Mzg3M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2dmJfbm0KKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmx1dHZ2Yl9ubV8xMjhCLCA0MzkwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2dmJfbm1fMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHV0dnZiX29yYWNjLCA0Mzk0Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2dmJfb3JhY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmx1dHZ2Yl9vcmFjY18xMjhCLCA0Mzk3N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2dmJfb3JhY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHV0dnZiX29yYWNjaSwgNDQwMTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dnZiX29yYWNjaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHV0dnZiX29yYWNjaV8xMjhCLCA0NDA1M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2dmJfb3JhY2NpXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmx1dHZ2YmksIDQ0MDk0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmx1dHZ2YmkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmx1dHZ2YmlfMTI4QiwgNDQxMjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dnZiaV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZsdXR2d2gsIDQ0MTU5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmx1dHZ3aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHV0dndoXzEyOEIsIDQ0MTg4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmx1dHZ3aF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZsdXR2d2hfbm0sIDQ0MjIyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmx1dHZ3aF9ubQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHV0dndoX25tXzEyOEIsIDQ0MjU0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmx1dHZ3aF9ubV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZsdXR2d2hfb3JhY2MsIDQ0MjkxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmx1dHZ3aF9vcmFjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHV0dndoX29yYWNjXzEyOEIsIDQ0MzI2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmx1dHZ3aF9vcmFjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZsdXR2d2hfb3JhY2NpLCA0NDM2Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2d2hfb3JhY2NpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZsdXR2d2hfb3JhY2NpXzEyOEIsIDQ0NDAyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdmx1dHZ3aF9vcmFjY2lfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHV0dndoaSwgNDQ0NDN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bHV0dndoaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bHV0dndoaV8xMjhCLCA0NDQ3M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZsdXR2d2hpXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1hc2tlZHN0b3JlbnEsIDQ0NTA4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1hc2tlZHN0b3JlbnEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1hc2tlZHN0b3JlbnFfMTI4QiwgNDQ1NDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWFza2Vkc3RvcmVucV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtYXNrZWRzdG9yZW50bnEsIDQ0NTg1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1hc2tlZHN0b3JlbnRucQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bWFza2Vkc3RvcmVudG5xXzEyOEIsIDQ0NjIzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1hc2tlZHN0b3JlbnRucV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtYXNrZWRzdG9yZW50cSwgNDQ2NjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWFza2Vkc3RvcmVudHEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1hc2tlZHN0b3JlbnRxXzEyOEIsIDQ0NzAzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1hc2tlZHN0b3JlbnRxXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1hc2tlZHN0b3JlcSwgNDQ3NDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWFza2Vkc3RvcmVxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtYXNrZWRzdG9yZXFfMTI4QiwgNDQ3ODB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWFza2Vkc3RvcmVxXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1heGIsIDQ0ODIwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1heGIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1heGJfMTI4QiwgNDQ4NDd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWF4Yl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtYXhoLCA0NDg3OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtYXhoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtYXhoXzEyOEIsIDQ0OTA2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1heGhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bWF4dWIsIDQ0OTM4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1heHViCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtYXh1Yl8xMjhCLCA0NDk2Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtYXh1Yl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtYXh1aCwgNDQ5OTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWF4dWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1heHVoXzEyOEIsIDQ1MDI3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1heHVoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1heHcsIDQ1MDYwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1heHcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1heHdfMTI4QiwgNDUwODd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWF4d18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtaW5iLCA0NTExOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtaW5iCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtaW5iXzEyOEIsIDQ1MTQ2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1pbmJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bWluaCwgNDUxNzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWluaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bWluaF8xMjhCLCA0NTIwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtaW5oXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1pbnViLCA0NTIzN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtaW51YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bWludWJfMTI4QiwgNDUyNjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bWludWJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bWludWgsIDQ1Mjk4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1pbnVoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtaW51aF8xMjhCLCA0NTMyNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtaW51aF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtaW53LCA0NTM1OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtaW53CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtaW53XzEyOEIsIDQ1Mzg2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1pbndfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXBhYnVzLCA0NTQxOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGFidXMKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1wYWJ1c18xMjhCLCA0NTQ0N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGFidXNfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXBhYnVzX2FjYywgNDU0ODF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhYnVzX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXBhYnVzX2FjY18xMjhCLCA0NTUxNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGFidXNfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1wYWJ1c3YsIDQ1NTUyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1wYWJ1c3YKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1wYWJ1c3ZfMTI4QiwgNDU1ODJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhYnVzdl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcGFidXUsIDQ1NjE3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1wYWJ1dQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXBhYnV1XzEyOEIsIDQ1NjQ2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1wYWJ1dV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcGFidXVfYWNjLCA0NTY4MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGFidXVfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcGFidXVfYWNjXzEyOEIsIDQ1NzEzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1wYWJ1dV9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXBhYnV1diwgNDU3NTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhYnV1dgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXBhYnV1dl8xMjhCLCA0NTc4MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGFidXV2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1wYWhiLCA0NTgxNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGFoYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXBhaGJfMTI4QiwgNDU4NDR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhaGJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXBhaGJfYWNjLCA0NTg3N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGFoYl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1wYWhiX2FjY18xMjhCLCA0NTkwOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGFoYl9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXBhaGhzYXQsIDQ1OTQ2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1wYWhoc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcGFoaHNhdF8xMjhCLCA0NTk3N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGFoaHNhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcGF1aGIsIDQ2MDEzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1wYXVoYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXBhdWhiXzEyOEIsIDQ2MDQyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1wYXVoYl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcGF1aGJfYWNjLCA0NjA3Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGF1aGJfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcGF1aGJfYWNjXzEyOEIsIDQ2MTA5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1wYXVoYl9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXBhdWh1aHNhdCwgNDYxNDd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBhdWh1aHNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXBhdWh1aHNhdF8xMjhCLCA0NjE4MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcGF1aHVoc2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1wc3VodWhzYXQsIDQ2MjE4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1wc3VodWhzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1wc3VodWhzYXRfMTI4QiwgNDYyNTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXBzdWh1aHNhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlidXMsIDQ2Mjg5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWJ1cworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5YnVzXzEyOEIsIDQ2MzE4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWJ1c18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlidXNfYWNjLCA0NjM1Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlidXNfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlidXNfYWNjXzEyOEIsIDQ2Mzg1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWJ1c19hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5YnVzdiwgNDY0MjN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5YnVzdgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5YnVzdl8xMjhCLCA0NjQ1M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlidXN2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWJ1c3ZfYWNjLCA0NjQ4OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlidXN2X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5YnVzdl9hY2NfMTI4QiwgNDY1MjJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5YnVzdl9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5YnYsIDQ2NTYxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWJ2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlidl8xMjhCLCA0NjU4OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlidl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlidl9hY2MsIDQ2NjIyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWJ2X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5YnZfYWNjXzEyOEIsIDQ2NjU0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWJ2X2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlld3VoLCA0NjY5MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlld3VoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlld3VoXzEyOEIsIDQ2NzIxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWV3dWhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5ZXd1aF82NCwgNDY3NTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5ZXd1aF82NAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5ZXd1aF82NF8xMjhCLCA0Njc4OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlld3VoXzY0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWgsIDQ2ODI3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWhfMTI4QiwgNDY4NTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHloX2FjYywgNDY4ODZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aF9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWhfYWNjXzEyOEIsIDQ2OTE3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWhfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWhzYXRfYWNjLCA0Njk1M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHloc2F0X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aHNhdF9hY2NfMTI4QiwgNDY5ODd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aHNhdF9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aHNycywgNDcwMjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aHNycworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aHNyc18xMjhCLCA0NzA1Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHloc3JzXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWhzcywgNDcwOTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aHNzCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHloc3NfMTI4QiwgNDcxMjB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aHNzXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWh1cywgNDcxNTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aHVzCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlodXNfMTI4QiwgNDcxODN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aHVzXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWh1c19hY2MsIDQ3MjE3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWh1c19hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWh1c19hY2NfMTI4QiwgNDcyNTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aHVzX2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlodiwgNDcyODh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aHYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWh2XzEyOEIsIDQ3MzE2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWh2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWh2X2FjYywgNDczNDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aHZfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlodl9hY2NfMTI4QiwgNDczODF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aHZfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWh2c3JzLCA0NzQxOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlodnNycworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aHZzcnNfMTI4QiwgNDc0NDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aHZzcnNfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aWVvaCwgNDc0ODV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aWVvaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aWVvaF8xMjhCLCA0NzUxNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpZW9oXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWlld2hfYWNjLCA0NzU1MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpZXdoX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aWV3aF9hY2NfMTI4QiwgNDc1ODR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aWV3aF9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aWV3dWgsIDQ3NjIzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWlld3VoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpZXd1aF8xMjhCLCA0NzY1NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpZXd1aF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpZXd1aF9hY2MsIDQ3NjkwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWlld3VoX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aWV3dWhfYWNjXzEyOEIsIDQ3NzI1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWlld3VoX2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpaCwgNDc3NjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWloXzEyOEIsIDQ3NzkzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWloXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWloX2FjYywgNDc4MjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aWhfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpaF9hY2NfMTI4QiwgNDc4NTh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aWhfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWloYiwgNDc4OTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aWhiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpaGJfMTI4QiwgNDc5MjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aWhiXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWloYl9hY2MsIDQ3OTU4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWloYl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWloYl9hY2NfMTI4QiwgNDc5OTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aWhiX2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpb3doLCA0ODAyOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpb3doCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpb3doXzEyOEIsIDQ4MDU5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWlvd2hfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aXdiLCA0ODA5NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpd2IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWl3Yl8xMjhCLCA0ODEyM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpd2JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aXdiX2FjYywgNDgxNTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aXdiX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aXdiX2FjY18xMjhCLCA0ODE5MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpd2JfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWl3aCwgNDgyMjh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aXdoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpd2hfMTI4QiwgNDgyNTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aXdoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWl3aF9hY2MsIDQ4MjkxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWl3aF9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weWl3aF9hY2NfMTI4QiwgNDgzMjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5aXdoX2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpd3ViLCA0ODM2Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpd3ViCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpd3ViXzEyOEIsIDQ4MzkyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWl3dWJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5aXd1Yl9hY2MsIDQ4NDI3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weWl3dWJfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlpd3ViX2FjY18xMjhCLCA0ODQ2MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlpd3ViX2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlvd2gsIDQ4NTAwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weW93aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5b3doXzEyOEIsIDQ4NTI5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weW93aF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlvd2hfNjRfYWNjLCA0ODU2M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlvd2hfNjRfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlvd2hfNjRfYWNjXzEyOEIsIDQ4NTk5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weW93aF82NF9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5b3doX3JuZCwgNDg2NDB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5b3doX3JuZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5b3doX3JuZF8xMjhCLCA0ODY3M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlvd2hfcm5kXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weW93aF9ybmRfc2FjYywgNDg3MTF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5b3doX3JuZF9zYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHlvd2hfcm5kX3NhY2NfMTI4QiwgNDg3NDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5b3doX3JuZF9zYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weW93aF9zYWNjLCA0ODc5Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHlvd2hfc2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5b3doX3NhY2NfMTI4QiwgNDg4MjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5b3doX3NhY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5dWIsIDQ4ODY1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weXViCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHl1Yl8xMjhCLCA0ODg5M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1Yl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHl1Yl9hY2MsIDQ4OTI2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weXViX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5dWJfYWNjXzEyOEIsIDQ4OTU4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weXViX2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHl1YnYsIDQ4OTk1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weXVidgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5dWJ2XzEyOEIsIDQ5MDI0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weXVidl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHl1YnZfYWNjLCA0OTA1OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1YnZfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHl1YnZfYWNjXzEyOEIsIDQ5MDkxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weXVidl9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5dWgsIDQ5MTI5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weXVoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHl1aF8xMjhCLCA0OTE1N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1aF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHl1aF9hY2MsIDQ5MTkwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weXVoX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5dWhfYWNjXzEyOEIsIDQ5MjIyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weXVoX2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHl1aGUsIDQ5MjU5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weXVoZQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5dWhlXzEyOEIsIDQ5Mjg4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weXVoZV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHl1aGVfYWNjLCA0OTMyMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1aGVfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtcHl1aGVfYWNjXzEyOEIsIDQ5MzU1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm1weXVoZV9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5dWh2LCA0OTM5M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1aHYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm1weXVodl8xMjhCLCA0OTQyMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1aHZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5dWh2X2FjYywgNDk0NTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXB5dWh2X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bXB5dWh2X2FjY18xMjhCLCA0OTQ4OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZtcHl1aHZfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm11eCwgNDk1Mjd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXV4CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZtdXhfMTI4QiwgNDk1NTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bXV4XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm5hdmdiLCA0OTU4NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZuYXZnYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bmF2Z2JfMTI4QiwgNDk2MTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bmF2Z2JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bmF2Z2gsIDQ5NjQ1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm5hdmdoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZuYXZnaF8xMjhCLCA0OTY3M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZuYXZnaF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZuYXZndWIsIDQ5NzA2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm5hdmd1YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bmF2Z3ViXzEyOEIsIDQ5NzM1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm5hdmd1Yl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZuYXZndywgNDk3Njl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bmF2Z3cKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm5hdmd3XzEyOEIsIDQ5Nzk3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm5hdmd3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm5vcm1hbXRoLCA0OTgzMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zub3JtYW10aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bm9ybWFtdGhfMTI4QiwgNDk4NjF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92bm9ybWFtdGhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bm9ybWFtdHcsIDQ5ODk3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm5vcm1hbXR3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zub3JtYW10d18xMjhCLCA0OTkyOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zub3JtYW10d18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zub3QsIDQ5OTY0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm5vdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92bm90XzEyOEIsIDQ5OTkwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm5vdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZvciwgNTAwMjF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92b3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdm9yXzEyOEIsIDUwMDQ2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdm9yXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnBhY2tlYiwgNTAwNzZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cGFja2ViCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZwYWNrZWJfMTI4QiwgNTAxMDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cGFja2ViXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnBhY2tlaCwgNTAxMzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cGFja2VoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZwYWNrZWhfMTI4QiwgNTAxNjh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cGFja2VoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnBhY2toYl9zYXQsIDUwMjAyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnBhY2toYl9zYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnBhY2toYl9zYXRfMTI4QiwgNTAyMzV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cGFja2hiX3NhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZwYWNraHViX3NhdCwgNTAyNzN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cGFja2h1Yl9zYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnBhY2todWJfc2F0XzEyOEIsIDUwMzA3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnBhY2todWJfc2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnBhY2tvYiwgNTAzNDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cGFja29iCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZwYWNrb2JfMTI4QiwgNTAzNzV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cGFja29iXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnBhY2tvaCwgNTA0MDl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cGFja29oCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZwYWNrb2hfMTI4QiwgNTA0Mzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cGFja29oXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnBhY2t3aF9zYXQsIDUwNDcyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnBhY2t3aF9zYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnBhY2t3aF9zYXRfMTI4QiwgNTA1MDV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cGFja3doX3NhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZwYWNrd3VoX3NhdCwgNTA1NDN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cGFja3d1aF9zYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnBhY2t3dWhfc2F0XzEyOEIsIDUwNTc3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnBhY2t3dWhfc2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnBvcGNvdW50aCwgNTA2MTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cG9wY291bnRoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Zwb3Bjb3VudGhfMTI4QiwgNTA2NDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cG9wY291bnRoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnByZWZpeHFiLCA1MDY4NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZwcmVmaXhxYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cHJlZml4cWJfMTI4QiwgNTA3MTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cHJlZml4cWJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cHJlZml4cWgsIDUwNzUyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnByZWZpeHFoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZwcmVmaXhxaF8xMjhCLCA1MDc4M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZwcmVmaXhxaF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZwcmVmaXhxdywgNTA4MTl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cHJlZml4cXcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnByZWZpeHF3XzEyOEIsIDUwODUwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnByZWZpeHF3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJkZWx0YSwgNTA4ODZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cmRlbHRhCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZyZGVsdGFfMTI4QiwgNTA5MTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cmRlbHRhXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHlidWJfcnR0LCA1MDk0OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5YnViX3J0dAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weWJ1Yl9ydHRfMTI4QiwgNTA5ODN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ1Yl9ydHRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weWJ1Yl9ydHRfYWNjLCA1MTAyMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5YnViX3J0dF9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHlidWJfcnR0X2FjY18xMjhCLCA1MTA2MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5YnViX3J0dF9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weWJ1cywgNTExMDN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ1cworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weWJ1c18xMjhCLCA1MTEzM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5YnVzXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHlidXNfYWNjLCA1MTE2OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5YnVzX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weWJ1c19hY2NfMTI4QiwgNTEyMDJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ1c19hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weWJ1c2ksIDUxMjQxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidXNpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZybXB5YnVzaV8xMjhCLCA1MTI3Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5YnVzaV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZybXB5YnVzaV9hY2MsIDUxMzA4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidXNpX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weWJ1c2lfYWNjXzEyOEIsIDUxMzQzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidXNpX2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZybXB5YnVzdiwgNTEzODN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ1c3YKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHlidXN2XzEyOEIsIDUxNDE0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidXN2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHlidXN2X2FjYywgNTE0NTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ1c3ZfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZybXB5YnVzdl9hY2NfMTI4QiwgNTE0ODV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ1c3ZfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHlidiwgNTE1MjV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZybXB5YnZfMTI4QiwgNTE1NTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHlidl9hY2MsIDUxNTg4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHlidl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHlidl9hY2NfMTI4QiwgNTE2MjF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weWJ2X2FjY18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZybXB5dWIsIDUxNjU5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHl1YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weXViXzEyOEIsIDUxNjg4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHl1Yl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZybXB5dWJfYWNjLCA1MTcyMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5dWJfYWNjCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZybXB5dWJfYWNjXzEyOEIsIDUxNzU1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnJtcHl1Yl9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weXViX3J0dCwgNTE3OTN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weXViX3J0dAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weXViX3J0dF8xMjhCLCA1MTgyNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5dWJfcnR0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHl1Yl9ydHRfYWNjLCA1MTg2NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5dWJfcnR0X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weXViX3J0dF9hY2NfMTI4QiwgNTE5MDF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weXViX3J0dF9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weXViaSwgNTE5NDN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weXViaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weXViaV8xMjhCLCA1MTk3M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5dWJpXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHl1YmlfYWNjLCA1MjAwOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5dWJpX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weXViaV9hY2NfMTI4QiwgNTIwNDJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weXViaV9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weXVidiwgNTIwODF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weXVidgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weXVidl8xMjhCLCA1MjExMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5dWJ2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJtcHl1YnZfYWNjLCA1MjE0Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZybXB5dWJ2X2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm1weXVidl9hY2NfMTI4QiwgNTIxODB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm1weXVidl9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm9yLCA1MjIxOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zyb3IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJvcl8xMjhCLCA1MjI0NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zyb3JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm91bmRoYiwgNTIyNzZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm91bmRoYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm91bmRoYl8xMjhCLCA1MjMwNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zyb3VuZGhiXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJvdW5kaHViLCA1MjM0MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zyb3VuZGh1YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm91bmRodWJfMTI4QiwgNTIzNzJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm91bmRodWJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm91bmR1aHViLCA1MjQwOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zyb3VuZHVodWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJvdW5kdWh1Yl8xMjhCLCA1MjQ0MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zyb3VuZHVodWJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm91bmR1d3VoLCA1MjQ3N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zyb3VuZHV3dWgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJvdW5kdXd1aF8xMjhCLCA1MjUwOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zyb3VuZHV3dWhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm91bmR3aCwgNTI1NDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm91bmR3aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm91bmR3aF8xMjhCLCA1MjU3Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zyb3VuZHdoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJvdW5kd3VoLCA1MjYxMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zyb3VuZHd1aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cm91bmR3dWhfMTI4QiwgNTI2NDJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cm91bmR3dWhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cnNhZHViaSwgNTI2Nzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cnNhZHViaQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cnNhZHViaV8xMjhCLCA1MjcwOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zyc2FkdWJpXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnJzYWR1YmlfYWNjLCA1Mjc0M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zyc2FkdWJpX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92cnNhZHViaV9hY2NfMTI4QiwgNTI3Nzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92cnNhZHViaV9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2F0aHViLCA1MjgxNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzYXRodWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNhdGh1Yl8xMjhCLCA1Mjg0NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzYXRodWJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2F0dXd1aCwgNTI4Nzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2F0dXd1aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2F0dXd1aF8xMjhCLCA1MjkwOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzYXR1d3VoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNhdHdoLCA1Mjk0NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzYXR3aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2F0d2hfMTI4QiwgNTI5NzJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2F0d2hfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2IsIDUzMDA1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzYl8xMjhCLCA1MzAzMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzYl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzY2F0dGVybWgsIDUzMDYwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNjYXR0ZXJtaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2NhdHRlcm1oXzEyOEIsIDUzMDkyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNjYXR0ZXJtaF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzY2F0dGVybWhfYWRkLCA1MzEyOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybWhfYWRkCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzY2F0dGVybWhfYWRkXzEyOEIsIDUzMTY1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNjYXR0ZXJtaF9hZGRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2NhdHRlcm1ocSwgNTMyMDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2NhdHRlcm1ocQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2NhdHRlcm1ocV8xMjhCLCA1MzIzOX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybWhxXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNjYXR0ZXJtaHcsIDUzMjc3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNjYXR0ZXJtaHcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNjYXR0ZXJtaHdfMTI4QiwgNTMzMTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2NhdHRlcm1od18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzY2F0dGVybWh3X2FkZCwgNTMzNDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2NhdHRlcm1od19hZGQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNjYXR0ZXJtaHdfYWRkXzEyOEIsIDUzMzg1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNjYXR0ZXJtaHdfYWRkXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNjYXR0ZXJtaHdxLCA1MzQyN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybWh3cQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2NhdHRlcm1od3FfMTI4QiwgNTM0NjF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2NhdHRlcm1od3FfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2NhdHRlcm13LCA1MzUwMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybXcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNjYXR0ZXJtd18xMjhCLCA1MzUzMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybXdfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2NhdHRlcm13X2FkZCwgNTM1Njl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2NhdHRlcm13X2FkZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2NhdHRlcm13X2FkZF8xMjhCLCA1MzYwNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzY2F0dGVybXdfYWRkXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNjYXR0ZXJtd3EsIDUzNjQ2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNjYXR0ZXJtd3EKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNjYXR0ZXJtd3FfMTI4QiwgNTM2Nzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2NhdHRlcm13cV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzaCwgNTM3MTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2gKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNoXzEyOEIsIDUzNzQyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNodWZlaCwgNTM3NzJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2h1ZmVoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzaHVmZWhfMTI4QiwgNTM4MDF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2h1ZmVoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNodWZmYiwgNTM4MzV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2h1ZmZiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzaHVmZmJfMTI4QiwgNTM4NjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2h1ZmZiXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNodWZmZWIsIDUzODk4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNodWZmZWIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNodWZmZWJfMTI4QiwgNTM5Mjh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2h1ZmZlYl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzaHVmZmgsIDUzOTYzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNodWZmaAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2h1ZmZoXzEyOEIsIDUzOTkyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNodWZmaF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzaHVmZm9iLCA1NDAyNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzaHVmZm9iCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzaHVmZm9iXzEyOEIsIDU0MDU2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNodWZmb2JfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2h1ZmZ2ZGQsIDU0MDkxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNodWZmdmRkCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzaHVmZnZkZF8xMjhCLCA1NDEyMn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzaHVmZnZkZF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzaHVmb2ViLCA1NDE1OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzaHVmb2ViCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzaHVmb2ViXzEyOEIsIDU0MTg4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnNodWZvZWJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2h1Zm9laCwgNTQyMjN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2h1Zm9laAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c2h1Zm9laF8xMjhCLCA1NDI1M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzaHVmb2VoXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnNodWZvaCwgNTQyODh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2h1Zm9oCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzaHVmb2hfMTI4QiwgNTQzMTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c2h1Zm9oXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YmIsIDU0MzUxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YmJfMTI4QiwgNTQzNzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViYl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJiX2R2LCA1NDQxMH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJiX2R2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJiX2R2XzEyOEIsIDU0NDQwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmJfZHZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3ViYm5xLCA1NDQ3NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJibnEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YmJucV8xMjhCLCA1NDUwNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJibnFfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3ViYnEsIDU0NTM4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmJxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJicV8xMjhCLCA1NDU2Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJicV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJic2F0LCA1NDU5OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJic2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJic2F0XzEyOEIsIDU0NjI5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmJzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3ViYnNhdF9kdiwgNTQ2NjR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViYnNhdF9kdgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3ViYnNhdF9kdl8xMjhCLCA1NDY5N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJic2F0X2R2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YmgsIDU0ODAyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YmhfMTI4QiwgNTQ4Mjl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViaF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJoX2R2LCA1NDg2MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJoX2R2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJoX2R2XzEyOEIsIDU0ODkxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmhfZHZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3ViaG5xLCA1NDkyNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJobnEKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YmhucV8xMjhCLCA1NDk1NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJobnFfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3ViaHEsIDU0OTg5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmhxCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJocV8xMjhCLCA1NTAxN30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJocV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJoc2F0LCA1NTA1MH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJoc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJoc2F0XzEyOEIsIDU1MDgwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YmhzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3ViaHNhdF9kdiwgNTUxMTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViaHNhdF9kdgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3ViaHNhdF9kdl8xMjhCLCA1NTE0OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJoc2F0X2R2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1Ymh3LCA1NTE4Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJodworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3ViaHdfMTI4QiwgNTUyMTR9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3ViaHdfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3VidWJoLCA1NTI0N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ1YmgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YnViaF8xMjhCLCA1NTI3Nn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ1YmhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3VidWJzYXQsIDU1MzEwfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YnVic2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ1YnNhdF8xMjhCLCA1NTM0MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ1YnNhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ1YnNhdF9kdiwgNTUzNzd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3VidWJzYXRfZHYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YnVic2F0X2R2XzEyOEIsIDU1NDExfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YnVic2F0X2R2XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YnVidWJiX3NhdCwgNTU0NTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3VidWJ1YmJfc2F0CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ1YnViYl9zYXRfMTI4QiwgNTU0ODV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3VidWJ1YmJfc2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YnVoc2F0LCA1NTUyNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ1aHNhdAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3VidWhzYXRfMTI4QiwgNTU1NTZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3VidWhzYXRfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3VidWhzYXRfZHYsIDU1NTkyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YnVoc2F0X2R2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ1aHNhdF9kdl8xMjhCLCA1NTYyNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ1aHNhdF9kdl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ1aHcsIDU1NjY1fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YnVodworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3VidWh3XzEyOEIsIDU1Njk0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YnVod18xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ1d3NhdCwgNTU3Mjh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3VidXdzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YnV3c2F0XzEyOEIsIDU1NzU5fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YnV3c2F0XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YnV3c2F0X2R2LCA1NTc5NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ1d3NhdF9kdgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3VidXdzYXRfZHZfMTI4QiwgNTU4Mjl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3VidXdzYXRfZHZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3VidywgNTU4Njh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3VidworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3Vid18xMjhCLCA1NTg5NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ3XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YndfZHYsIDU1OTI3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YndfZHYKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YndfZHZfMTI4QiwgNTU5NTd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3Vid19kdl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ3bnEsIDU1OTkyfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YnducQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3Vid25xXzEyOEIsIDU2MDIxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YnducV8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ3cSwgNTYwNTV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3Vid3EKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YndxXzEyOEIsIDU2MDgzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YndxXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YndzYXQsIDU2MTE2fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YndzYXQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YndzYXRfMTI4QiwgNTYxNDZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3Vid3NhdF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ3c2F0X2R2LCA1NjE4MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3ZzdWJ3c2F0X2R2CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZzdWJ3c2F0X2R2XzEyOEIsIDU2MjE0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnN1YndzYXRfZHZfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3dhcCwgNTYyNTJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92c3dhcAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3dhcF8xMjhCLCA1NjI3OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Zzd2FwXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnRtcHliLCA1NjMxMX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z0bXB5YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92dG1weWJfMTI4QiwgNTYzMzl9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92dG1weWJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92dG1weWJfYWNjLCA1NjM3Mn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z0bXB5Yl9hY2MKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnRtcHliX2FjY18xMjhCLCA1NjQwNH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z0bXB5Yl9hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92dG1weWJ1cywgNTY0NDF9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92dG1weWJ1cworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92dG1weWJ1c18xMjhCLCA1NjQ3MX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z0bXB5YnVzXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnRtcHlidXNfYWNjLCA1NjUwNn0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z0bXB5YnVzX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92dG1weWJ1c19hY2NfMTI4QiwgNTY1NDB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92dG1weWJ1c19hY2NfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92dG1weWhiLCA1NjU3OX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z0bXB5aGIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnRtcHloYl8xMjhCLCA1NjYwOH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z0bXB5aGJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92dG1weWhiX2FjYywgNTY2NDJ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92dG1weWhiX2FjYworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92dG1weWhiX2FjY18xMjhCLCA1NjY3NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z0bXB5aGJfYWNjXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnVucGFja2IsIDU2NzEzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnVucGFja2IKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnVucGFja2JfMTI4QiwgNTY3NDN9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92dW5wYWNrYl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Z1bnBhY2toLCA1Njc3OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z1bnBhY2toCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Z1bnBhY2toXzEyOEIsIDU2ODA4fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnVucGFja2hfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92dW5wYWNrb2IsIDU2ODQzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnVucGFja29iCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Z1bnBhY2tvYl8xMjhCLCA1Njg3NH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z1bnBhY2tvYl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Z1bnBhY2tvaCwgNTY5MTB9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92dW5wYWNrb2gKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnVucGFja29oXzEyOEIsIDU2OTQxfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnVucGFja29oXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnVucGFja3ViLCA1Njk3N30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z1bnBhY2t1YgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92dW5wYWNrdWJfMTI4QiwgNTcwMDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92dW5wYWNrdWJfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92dW5wYWNrdWgsIDU3MDQ0fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnVucGFja3VoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Z1bnBhY2t1aF8xMjhCLCA1NzA3NX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z1bnBhY2t1aF8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Z4b3IsIDU3MTExfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnhvcgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92eG9yXzEyOEIsIDU3MTM3fSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnhvcl8xMjhCCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3Z6YiwgNTcxNjh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92emIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnpiXzEyOEIsIDU3MTkzfSwgLy8gX19idWlsdGluX0hFWEFHT05fVjZfdnpiXzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnpoLCA1NzIyM30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1Y2X3Z6aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92emhfMTI4QiwgNTcyNDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9WNl92emhfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9ZMl9kY2NsZWFuYSwgNTcyNzh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9ZMl9kY2NsZWFuYQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9ZMl9kY2NsZWFuaW52YSwgNTczMDh9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9ZMl9kY2NsZWFuaW52YQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9ZMl9kY2ludmEsIDU3MzQxfSwgLy8gX19idWlsdGluX0hFWEFHT05fWTJfZGNpbnZhCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1kyX2RjemVyb2EsIDU3MzY5fSwgLy8gX19idWlsdGluX0hFWEFHT05fWTJfZGN6ZXJvYQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9ZNF9sMmZldGNoLCA1NzM5OH0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX1k0X2wyZmV0Y2gKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fWTVfbDJmZXRjaCwgNTc0Mjd9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl9ZNV9sMmZldGNoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX3ByZWZldGNoLCA1NzY5M30sIC8vIF9fYnVpbHRpbl9IRVhBR09OX3ByZWZldGNoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1Y2X3ZhZGRjYXJyeSwgMzMzODV9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl92Nl92YWRkY2FycnkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdmFkZGNhcnJ5XzEyOEIsIDMzNDE2fSwgLy8gX19idWlsdGluX0hFWEFHT05fdjZfdmFkZGNhcnJ5XzEyOEIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fVjZfdnN1YmNhcnJ5LCA1NDczNX0sIC8vIF9fYnVpbHRpbl9IRVhBR09OX3Y2X3ZzdWJjYXJyeQorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9WNl92c3ViY2FycnlfMTI4QiwgNTQ3NjZ9LCAvLyBfX2J1aWx0aW5fSEVYQUdPTl92Nl92c3ViY2FycnlfMTI4QgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9tbTI1NmlfdmFkZHcsIDU3NjY5fSwgLy8gX19idWlsdGluX19tbTI1NmlfdmFkZHcKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfc3RvcmVyYl9wYnIsIDI4MDE3fSwgLy8gX19idWlsdGluX2JyZXZfc3RiCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX1MyX3N0b3JlcmRfcGJyLCAyODAzNn0sIC8vIF9fYnVpbHRpbl9icmV2X3N0ZAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9TMl9zdG9yZXJoX3BiciwgMjgwNzZ9LCAvLyBfX2J1aWx0aW5fYnJldl9zdGgKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfc3RvcmVyZl9wYnIsIDI4MDU1fSwgLy8gX19idWlsdGluX2JyZXZfc3RoaGkKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fUzJfc3RvcmVyaV9wYnIsIDI4MDk1fSwgLy8gX19idWlsdGluX2JyZXZfc3R3CisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX2NpcmNfbGRiLCA1NzQ1Nn0sIC8vIF9fYnVpbHRpbl9jaXJjX2xkYgorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9jaXJjX2xkZCwgNTc0NzV9LCAvLyBfX2J1aWx0aW5fY2lyY19sZGQKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fY2lyY19sZGgsIDU3NDk0fSwgLy8gX19idWlsdGluX2NpcmNfbGRoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX2NpcmNfbGR1YiwgNTc1MTN9LCAvLyBfX2J1aWx0aW5fY2lyY19sZHViCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX2NpcmNfbGR1aCwgNTc1MzN9LCAvLyBfX2J1aWx0aW5fY2lyY19sZHVoCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX2NpcmNfbGR3LCA1NzU1M30sIC8vIF9fYnVpbHRpbl9jaXJjX2xkdworICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9jaXJjX3N0YiwgNTc1NzJ9LCAvLyBfX2J1aWx0aW5fY2lyY19zdGIKKyAgICAgIHtJbnRyaW5zaWM6OmhleGFnb25fY2lyY19zdGQsIDU3NTkxfSwgLy8gX19idWlsdGluX2NpcmNfc3RkCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX2NpcmNfc3RoLCA1NzYxMH0sIC8vIF9fYnVpbHRpbl9jaXJjX3N0aAorICAgICAge0ludHJpbnNpYzo6aGV4YWdvbl9jaXJjX3N0aGhpLCA1NzYyOX0sIC8vIF9fYnVpbHRpbl9jaXJjX3N0aGhpCisgICAgICB7SW50cmluc2ljOjpoZXhhZ29uX2NpcmNfc3R3LCA1NzY1MH0sIC8vIF9fYnVpbHRpbl9jaXJjX3N0dworICAgIH07CisgICAgYXV0byBJID0gc3RkOjpsb3dlcl9ib3VuZChzdGQ6OmJlZ2luKGhleGFnb25OYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZChoZXhhZ29uTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbHRpbk5hbWVTdHIpOworICAgIGlmIChJICE9IHN0ZDo6ZW5kKGhleGFnb25OYW1lcykgJiYKKyAgICAgICAgSS0+Z2V0TmFtZSgpID09IEJ1aWx0aW5OYW1lU3RyKQorICAgICAgcmV0dXJuIEktPkludHJpbklEOworICB9CisgIGlmIChUYXJnZXRQcmVmaXggPT0gIm1pcHMiKSB7CisgICAgc3RhdGljIGNvbnN0IEJ1aWx0aW5FbnRyeSBtaXBzTmFtZXNbXSA9IHsKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWJzcV9zX3BoLCA1NzcyMH0sIC8vIF9fYnVpbHRpbl9taXBzX2Fic3Ffc19waAorICAgICAge0ludHJpbnNpYzo6bWlwc19hYnNxX3NfcWIsIDU3NzQ1fSwgLy8gX19idWlsdGluX21pcHNfYWJzcV9zX3FiCisgICAgICB7SW50cmluc2ljOjptaXBzX2Fic3Ffc193LCA1Nzc3MH0sIC8vIF9fYnVpbHRpbl9taXBzX2Fic3Ffc193CisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHFfcGgsIDU3ODgyfSwgLy8gX19idWlsdGluX21pcHNfYWRkcV9waAorICAgICAge0ludHJpbnNpYzo6bWlwc19hZGRxX3NfcGgsIDU3OTA1fSwgLy8gX19idWlsdGluX21pcHNfYWRkcV9zX3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHFfc193LCA1NzkzMH0sIC8vIF9fYnVpbHRpbl9taXBzX2FkZHFfc193CisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHFoX3BoLCA1Nzk1NH0sIC8vIF9fYnVpbHRpbl9taXBzX2FkZHFoX3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHFoX3JfcGgsIDU3OTc4fSwgLy8gX19idWlsdGluX21pcHNfYWRkcWhfcl9waAorICAgICAge0ludHJpbnNpYzo6bWlwc19hZGRxaF9yX3csIDU4MDA0fSwgLy8gX19idWlsdGluX21pcHNfYWRkcWhfcl93CisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHFoX3csIDU4MDI5fSwgLy8gX19idWlsdGluX21pcHNfYWRkcWhfdworICAgICAge0ludHJpbnNpYzo6bWlwc19hZGRzYywgNTgzMjh9LCAvLyBfX2J1aWx0aW5fbWlwc19hZGRzYworICAgICAge0ludHJpbnNpYzo6bWlwc19hZGR1X3BoLCA1ODM0OX0sIC8vIF9fYnVpbHRpbl9taXBzX2FkZHVfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkdV9xYiwgNTgzNzJ9LCAvLyBfX2J1aWx0aW5fbWlwc19hZGR1X3FiCisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHVfc19waCwgNTgzOTV9LCAvLyBfX2J1aWx0aW5fbWlwc19hZGR1X3NfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkdV9zX3FiLCA1ODQyMH0sIC8vIF9fYnVpbHRpbl9taXBzX2FkZHVfc19xYgorICAgICAge0ludHJpbnNpYzo6bWlwc19hZGR1aF9xYiwgNTg0NDV9LCAvLyBfX2J1aWx0aW5fbWlwc19hZGR1aF9xYgorICAgICAge0ludHJpbnNpYzo6bWlwc19hZGR1aF9yX3FiLCA1ODQ2OX0sIC8vIF9fYnVpbHRpbl9taXBzX2FkZHVoX3JfcWIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkd2MsIDU4NjY3fSwgLy8gX19idWlsdGluX21pcHNfYWRkd2MKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYXBwZW5kLCA1ODcyOX0sIC8vIF9fYnVpbHRpbl9taXBzX2FwcGVuZAorICAgICAge0ludHJpbnNpYzo6bWlwc19iYWxpZ24sIDU5Mjk1fSwgLy8gX19idWlsdGluX21pcHNfYmFsaWduCisgICAgICB7SW50cmluc2ljOjptaXBzX2JpdHJldiwgNTk4NDl9LCAvLyBfX2J1aWx0aW5fbWlwc19iaXRyZXYKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYnBvc2dlMzIsIDYwMjI3fSwgLy8gX19idWlsdGluX21pcHNfYnBvc2dlMzIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY21wX2VxX3BoLCA2MTQ2Nn0sIC8vIF9fYnVpbHRpbl9taXBzX2NtcF9lcV9waAorICAgICAge0ludHJpbnNpYzo6bWlwc19jbXBfbGVfcGgsIDYxNDkxfSwgLy8gX19idWlsdGluX21pcHNfY21wX2xlX3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX2NtcF9sdF9waCwgNjE1MTZ9LCAvLyBfX2J1aWx0aW5fbWlwc19jbXBfbHRfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY21wZ2R1X2VxX3FiLCA2MTU0MX0sIC8vIF9fYnVpbHRpbl9taXBzX2NtcGdkdV9lcV9xYgorICAgICAge0ludHJpbnNpYzo6bWlwc19jbXBnZHVfbGVfcWIsIDYxNTY5fSwgLy8gX19idWlsdGluX21pcHNfY21wZ2R1X2xlX3FiCisgICAgICB7SW50cmluc2ljOjptaXBzX2NtcGdkdV9sdF9xYiwgNjE1OTd9LCAvLyBfX2J1aWx0aW5fbWlwc19jbXBnZHVfbHRfcWIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY21wZ3VfZXFfcWIsIDYxNjI1fSwgLy8gX19idWlsdGluX21pcHNfY21wZ3VfZXFfcWIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY21wZ3VfbGVfcWIsIDYxNjUyfSwgLy8gX19idWlsdGluX21pcHNfY21wZ3VfbGVfcWIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY21wZ3VfbHRfcWIsIDYxNjc5fSwgLy8gX19idWlsdGluX21pcHNfY21wZ3VfbHRfcWIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY21wdV9lcV9xYiwgNjE3MDZ9LCAvLyBfX2J1aWx0aW5fbWlwc19jbXB1X2VxX3FiCisgICAgICB7SW50cmluc2ljOjptaXBzX2NtcHVfbGVfcWIsIDYxNzMyfSwgLy8gX19idWlsdGluX21pcHNfY21wdV9sZV9xYgorICAgICAge0ludHJpbnNpYzo6bWlwc19jbXB1X2x0X3FiLCA2MTc1OH0sIC8vIF9fYnVpbHRpbl9taXBzX2NtcHVfbHRfcWIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZGxzYSwgNjIxNjV9LCAvLyBfX2J1aWx0aW5fbWlwc19kbHNhCisgICAgICB7SW50cmluc2ljOjptaXBzX2RwYV93X3BoLCA2MjMyM30sIC8vIF9fYnVpbHRpbl9taXBzX2RwYV93X3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX2RwYXFfc193X3BoLCA2MjQ5MX0sIC8vIF9fYnVpbHRpbl9taXBzX2RwYXFfc193X3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX2RwYXFfc2FfbF93LCA2MjUxOH0sIC8vIF9fYnVpbHRpbl9taXBzX2RwYXFfc2FfbF93CisgICAgICB7SW50cmluc2ljOjptaXBzX2RwYXF4X3Nfd19waCwgNjI1NDV9LCAvLyBfX2J1aWx0aW5fbWlwc19kcGFxeF9zX3dfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZHBhcXhfc2Ffd19waCwgNjI1NzN9LCAvLyBfX2J1aWx0aW5fbWlwc19kcGFxeF9zYV93X3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX2RwYXVfaF9xYmwsIDYyNjAyfSwgLy8gX19idWlsdGluX21pcHNfZHBhdV9oX3FibAorICAgICAge0ludHJpbnNpYzo6bWlwc19kcGF1X2hfcWJyLCA2MjYyOH0sIC8vIF9fYnVpbHRpbl9taXBzX2RwYXVfaF9xYnIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZHBheF93X3BoLCA2MjY1NH0sIC8vIF9fYnVpbHRpbl9taXBzX2RwYXhfd19waAorICAgICAge0ludHJpbnNpYzo6bWlwc19kcHNfd19waCwgNjI2Nzl9LCAvLyBfX2J1aWx0aW5fbWlwc19kcHNfd19waAorICAgICAge0ludHJpbnNpYzo6bWlwc19kcHNxX3Nfd19waCwgNjI3MDN9LCAvLyBfX2J1aWx0aW5fbWlwc19kcHNxX3Nfd19waAorICAgICAge0ludHJpbnNpYzo6bWlwc19kcHNxX3NhX2xfdywgNjI3MzB9LCAvLyBfX2J1aWx0aW5fbWlwc19kcHNxX3NhX2xfdworICAgICAge0ludHJpbnNpYzo6bWlwc19kcHNxeF9zX3dfcGgsIDYyNzU3fSwgLy8gX19idWlsdGluX21pcHNfZHBzcXhfc193X3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX2Rwc3F4X3NhX3dfcGgsIDYyNzg1fSwgLy8gX19idWlsdGluX21pcHNfZHBzcXhfc2Ffd19waAorICAgICAge0ludHJpbnNpYzo6bWlwc19kcHN1X2hfcWJsLCA2MjgxNH0sIC8vIF9fYnVpbHRpbl9taXBzX2Rwc3VfaF9xYmwKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZHBzdV9oX3FiciwgNjI4NDB9LCAvLyBfX2J1aWx0aW5fbWlwc19kcHN1X2hfcWJyCisgICAgICB7SW50cmluc2ljOjptaXBzX2Rwc3hfd19waCwgNjMwMTB9LCAvLyBfX2J1aWx0aW5fbWlwc19kcHN4X3dfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZXh0cCwgNjMwMzV9LCAvLyBfX2J1aWx0aW5fbWlwc19leHRwCisgICAgICB7SW50cmluc2ljOjptaXBzX2V4dHBkcCwgNjMwNTV9LCAvLyBfX2J1aWx0aW5fbWlwc19leHRwZHAKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZXh0cl9yX3csIDYzMDc3fSwgLy8gX19idWlsdGluX21pcHNfZXh0cl9yX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZXh0cl9yc193LCA2MzEwMX0sIC8vIF9fYnVpbHRpbl9taXBzX2V4dHJfcnNfdworICAgICAge0ludHJpbnNpYzo6bWlwc19leHRyX3NfaCwgNjMxMjZ9LCAvLyBfX2J1aWx0aW5fbWlwc19leHRyX3NfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19leHRyX3csIDYzMTUwfSwgLy8gX19idWlsdGluX21pcHNfZXh0cl93CisgICAgICB7SW50cmluc2ljOjptaXBzX2luc3YsIDY2MjAyfSwgLy8gX19idWlsdGluX21pcHNfaW5zdgorICAgICAge0ludHJpbnNpYzo6bWlwc19sYnV4LCA2NjMxMH0sIC8vIF9fYnVpbHRpbl9taXBzX2xidXgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbGh4LCA2NjQ4Nn0sIC8vIF9fYnVpbHRpbl9taXBzX2xoeAorICAgICAge0ludHJpbnNpYzo6bWlwc19sc2EsIDY2NTA1fSwgLy8gX19idWlsdGluX21pcHNfbHNhCisgICAgICB7SW50cmluc2ljOjptaXBzX2x3eCwgNjY1MjR9LCAvLyBfX2J1aWx0aW5fbWlwc19sd3gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWFkZCwgNjY1NDN9LCAvLyBfX2J1aWx0aW5fbWlwc19tYWRkCisgICAgICB7SW50cmluc2ljOjptaXBzX21hZGR1LCA2NjY1N30sIC8vIF9fYnVpbHRpbl9taXBzX21hZGR1CisgICAgICB7SW50cmluc2ljOjptaXBzX21hcV9zX3dfcGhsLCA2Njc2Nn0sIC8vIF9fYnVpbHRpbl9taXBzX21hcV9zX3dfcGhsCisgICAgICB7SW50cmluc2ljOjptaXBzX21hcV9zX3dfcGhyLCA2Njc5M30sIC8vIF9fYnVpbHRpbl9taXBzX21hcV9zX3dfcGhyCisgICAgICB7SW50cmluc2ljOjptaXBzX21hcV9zYV93X3BobCwgNjY4MjB9LCAvLyBfX2J1aWx0aW5fbWlwc19tYXFfc2Ffd19waGwKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWFxX3NhX3dfcGhyLCA2Njg0OH0sIC8vIF9fYnVpbHRpbl9taXBzX21hcV9zYV93X3BocgorICAgICAge0ludHJpbnNpYzo6bWlwc19tb2RzdWIsIDY3OTQ4fSwgLy8gX19idWlsdGluX21pcHNfbW9kc3ViCisgICAgICB7SW50cmluc2ljOjptaXBzX21zdWIsIDY3OTkxfSwgLy8gX19idWlsdGluX21pcHNfbXN1YgorICAgICAge0ludHJpbnNpYzo6bWlwc19tc3VidSwgNjgxMDV9LCAvLyBfX2J1aWx0aW5fbWlwc19tc3VidQorICAgICAge0ludHJpbnNpYzo6bWlwc19tdGhsaXAsIDY4MjE0fSwgLy8gX19idWlsdGluX21pcHNfbXRobGlwCisgICAgICB7SW50cmluc2ljOjptaXBzX211bF9waCwgNjgyMzZ9LCAvLyBfX2J1aWx0aW5fbWlwc19tdWxfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbXVsX3NfcGgsIDY4MzAyfSwgLy8gX19idWlsdGluX21pcHNfbXVsX3NfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbXVsZXFfc193X3BobCwgNjgzMjZ9LCAvLyBfX2J1aWx0aW5fbWlwc19tdWxlcV9zX3dfcGhsCisgICAgICB7SW50cmluc2ljOjptaXBzX211bGVxX3Nfd19waHIsIDY4MzU1fSwgLy8gX19idWlsdGluX21pcHNfbXVsZXFfc193X3BocgorICAgICAge0ludHJpbnNpYzo6bWlwc19tdWxldV9zX3BoX3FibCwgNjgzODR9LCAvLyBfX2J1aWx0aW5fbWlwc19tdWxldV9zX3BoX3FibAorICAgICAge0ludHJpbnNpYzo6bWlwc19tdWxldV9zX3BoX3FiciwgNjg0MTR9LCAvLyBfX2J1aWx0aW5fbWlwc19tdWxldV9zX3BoX3FicgorICAgICAge0ludHJpbnNpYzo6bWlwc19tdWxxX3JzX3BoLCA2ODQ0NH0sIC8vIF9fYnVpbHRpbl9taXBzX211bHFfcnNfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbXVscV9yc193LCA2ODQ3MH0sIC8vIF9fYnVpbHRpbl9taXBzX211bHFfcnNfdworICAgICAge0ludHJpbnNpYzo6bWlwc19tdWxxX3NfcGgsIDY4NDk1fSwgLy8gX19idWlsdGluX21pcHNfbXVscV9zX3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX211bHFfc193LCA2ODUyMH0sIC8vIF9fYnVpbHRpbl9taXBzX211bHFfc193CisgICAgICB7SW50cmluc2ljOjptaXBzX211bHNhX3dfcGgsIDY4NTkwfSwgLy8gX19idWlsdGluX21pcHNfbXVsc2Ffd19waAorICAgICAge0ludHJpbnNpYzo6bWlwc19tdWxzYXFfc193X3BoLCA2ODYxNn0sIC8vIF9fYnVpbHRpbl9taXBzX211bHNhcV9zX3dfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbXVsdCwgNjg2NDV9LCAvLyBfX2J1aWx0aW5fbWlwc19tdWx0CisgICAgICB7SW50cmluc2ljOjptaXBzX211bHR1LCA2ODY2NX0sIC8vIF9fYnVpbHRpbl9taXBzX211bHR1CisgICAgICB7SW50cmluc2ljOjptaXBzX3BhY2tybF9waCwgNjkwMTh9LCAvLyBfX2J1aWx0aW5fbWlwc19wYWNrcmxfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfcGlja19waCwgNjkzMDN9LCAvLyBfX2J1aWx0aW5fbWlwc19waWNrX3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX3BpY2tfcWIsIDY5MzI2fSwgLy8gX19idWlsdGluX21pcHNfcGlja19xYgorICAgICAge0ludHJpbnNpYzo6bWlwc19wcmVjZXFfd19waGwsIDY5MzQ5fSwgLy8gX19idWlsdGluX21pcHNfcHJlY2VxX3dfcGhsCisgICAgICB7SW50cmluc2ljOjptaXBzX3ByZWNlcV93X3BociwgNjkzNzd9LCAvLyBfX2J1aWx0aW5fbWlwc19wcmVjZXFfd19waHIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfcHJlY2VxdV9waF9xYmwsIDY5NDA1fSwgLy8gX19idWlsdGluX21pcHNfcHJlY2VxdV9waF9xYmwKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfcHJlY2VxdV9waF9xYmxhLCA2OTQzNX0sIC8vIF9fYnVpbHRpbl9taXBzX3ByZWNlcXVfcGhfcWJsYQorICAgICAge0ludHJpbnNpYzo6bWlwc19wcmVjZXF1X3BoX3FiciwgNjk0NjZ9LCAvLyBfX2J1aWx0aW5fbWlwc19wcmVjZXF1X3BoX3FicgorICAgICAge0ludHJpbnNpYzo6bWlwc19wcmVjZXF1X3BoX3FicmEsIDY5NDk2fSwgLy8gX19idWlsdGluX21pcHNfcHJlY2VxdV9waF9xYnJhCisgICAgICB7SW50cmluc2ljOjptaXBzX3ByZWNldV9waF9xYmwsIDY5NTI3fSwgLy8gX19idWlsdGluX21pcHNfcHJlY2V1X3BoX3FibAorICAgICAge0ludHJpbnNpYzo6bWlwc19wcmVjZXVfcGhfcWJsYSwgNjk1NTZ9LCAvLyBfX2J1aWx0aW5fbWlwc19wcmVjZXVfcGhfcWJsYQorICAgICAge0ludHJpbnNpYzo6bWlwc19wcmVjZXVfcGhfcWJyLCA2OTU4Nn0sIC8vIF9fYnVpbHRpbl9taXBzX3ByZWNldV9waF9xYnIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfcHJlY2V1X3BoX3FicmEsIDY5NjE1fSwgLy8gX19idWlsdGluX21pcHNfcHJlY2V1X3BoX3FicmEKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfcHJlY3JfcWJfcGgsIDY5NjQ1fSwgLy8gX19idWlsdGluX21pcHNfcHJlY3JfcWJfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfcHJlY3Jfc3JhX3BoX3csIDY5NjcyfSwgLy8gX19idWlsdGluX21pcHNfcHJlY3Jfc3JhX3BoX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfcHJlY3Jfc3JhX3JfcGhfdywgNjk3MDJ9LCAvLyBfX2J1aWx0aW5fbWlwc19wcmVjcl9zcmFfcl9waF93CisgICAgICB7SW50cmluc2ljOjptaXBzX3ByZWNycV9waF93LCA2OTczNH0sIC8vIF9fYnVpbHRpbl9taXBzX3ByZWNycV9waF93CisgICAgICB7SW50cmluc2ljOjptaXBzX3ByZWNycV9xYl9waCwgNjk3NjF9LCAvLyBfX2J1aWx0aW5fbWlwc19wcmVjcnFfcWJfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfcHJlY3JxX3JzX3BoX3csIDY5Nzg5fSwgLy8gX19idWlsdGluX21pcHNfcHJlY3JxX3JzX3BoX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfcHJlY3JxdV9zX3FiX3BoLCA2OTgxOX0sIC8vIF9fYnVpbHRpbl9taXBzX3ByZWNycXVfc19xYl9waAorICAgICAge0ludHJpbnNpYzo6bWlwc19wcmVwZW5kLCA2OTg1MH0sIC8vIF9fYnVpbHRpbl9taXBzX3ByZXBlbmQKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfcmFkZHVfd19xYiwgNjk4NzN9LCAvLyBfX2J1aWx0aW5fbWlwc19yYWRkdV93X3FiCisgICAgICB7SW50cmluc2ljOjptaXBzX3JkZHNwLCA2OTg5OX0sIC8vIF9fYnVpbHRpbl9taXBzX3JkZHNwCisgICAgICB7SW50cmluc2ljOjptaXBzX3JlcGxfcGgsIDY5OTIwfSwgLy8gX19idWlsdGluX21pcHNfcmVwbF9waAorICAgICAge0ludHJpbnNpYzo6bWlwc19yZXBsX3FiLCA2OTk0M30sIC8vIF9fYnVpbHRpbl9taXBzX3JlcGxfcWIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2hpbG8sIDcwMjAyfSwgLy8gX19idWlsdGluX21pcHNfc2hpbG8KKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2hsbF9waCwgNzAyMjN9LCAvLyBfX2J1aWx0aW5fbWlwc19zaGxsX3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX3NobGxfcWIsIDcwMjQ2fSwgLy8gX19idWlsdGluX21pcHNfc2hsbF9xYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zaGxsX3NfcGgsIDcwMjY5fSwgLy8gX19idWlsdGluX21pcHNfc2hsbF9zX3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX3NobGxfc193LCA3MDI5NH0sIC8vIF9fYnVpbHRpbl9taXBzX3NobGxfc193CisgICAgICB7SW50cmluc2ljOjptaXBzX3NocmFfcGgsIDcwMzE4fSwgLy8gX19idWlsdGluX21pcHNfc2hyYV9waAorICAgICAge0ludHJpbnNpYzo6bWlwc19zaHJhX3FiLCA3MDM0MX0sIC8vIF9fYnVpbHRpbl9taXBzX3NocmFfcWIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2hyYV9yX3BoLCA3MDM2NH0sIC8vIF9fYnVpbHRpbl9taXBzX3NocmFfcl9waAorICAgICAge0ludHJpbnNpYzo6bWlwc19zaHJhX3JfcWIsIDcwMzg5fSwgLy8gX19idWlsdGluX21pcHNfc2hyYV9yX3FiCisgICAgICB7SW50cmluc2ljOjptaXBzX3NocmFfcl93LCA3MDQxNH0sIC8vIF9fYnVpbHRpbl9taXBzX3NocmFfcl93CisgICAgICB7SW50cmluc2ljOjptaXBzX3NocmxfcGgsIDcwNDM4fSwgLy8gX19idWlsdGluX21pcHNfc2hybF9waAorICAgICAge0ludHJpbnNpYzo6bWlwc19zaHJsX3FiLCA3MDQ2MX0sIC8vIF9fYnVpbHRpbl9taXBzX3NocmxfcWIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3VicV9waCwgNzE3NDB9LCAvLyBfX2J1aWx0aW5fbWlwc19zdWJxX3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnFfc19waCwgNzE3NjN9LCAvLyBfX2J1aWx0aW5fbWlwc19zdWJxX3NfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3VicV9zX3csIDcxNzg4fSwgLy8gX19idWlsdGluX21pcHNfc3VicV9zX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3VicWhfcGgsIDcxODEyfSwgLy8gX19idWlsdGluX21pcHNfc3VicWhfcGgKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3VicWhfcl9waCwgNzE4MzZ9LCAvLyBfX2J1aWx0aW5fbWlwc19zdWJxaF9yX3BoCisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnFoX3JfdywgNzE4NjJ9LCAvLyBfX2J1aWx0aW5fbWlwc19zdWJxaF9yX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3VicWhfdywgNzE4ODd9LCAvLyBfX2J1aWx0aW5fbWlwc19zdWJxaF93CisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnVfcGgsIDcyMjk0fSwgLy8gX19idWlsdGluX21pcHNfc3VidV9waAorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJ1X3FiLCA3MjMxN30sIC8vIF9fYnVpbHRpbl9taXBzX3N1YnVfcWIKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3VidV9zX3BoLCA3MjM0MH0sIC8vIF9fYnVpbHRpbl9taXBzX3N1YnVfc19waAorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJ1X3NfcWIsIDcyMzY1fSwgLy8gX19idWlsdGluX21pcHNfc3VidV9zX3FiCisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnVoX3FiLCA3MjM5MH0sIC8vIF9fYnVpbHRpbl9taXBzX3N1YnVoX3FiCisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnVoX3JfcWIsIDcyNDE0fSwgLy8gX19idWlsdGluX21pcHNfc3VidWhfcl9xYgorICAgICAge0ludHJpbnNpYzo6bWlwc193cmRzcCwgNzI2OTZ9LCAvLyBfX2J1aWx0aW5fbWlwc193cmRzcAorICAgICAge0ludHJpbnNpYzo6bWlwc19hZGRfYV9iLCA1Nzc5NH0sIC8vIF9fYnVpbHRpbl9tc2FfYWRkX2FfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19hZGRfYV9kLCA1NzgxNn0sIC8vIF9fYnVpbHRpbl9tc2FfYWRkX2FfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19hZGRfYV9oLCA1NzgzOH0sIC8vIF9fYnVpbHRpbl9tc2FfYWRkX2FfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19hZGRfYV93LCA1Nzg2MH0sIC8vIF9fYnVpbHRpbl9tc2FfYWRkX2FfdworICAgICAge0ludHJpbnNpYzo6bWlwc19hZGRzX2FfYiwgNTgwNTJ9LCAvLyBfX2J1aWx0aW5fbXNhX2FkZHNfYV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHNfYV9kLCA1ODA3NX0sIC8vIF9fYnVpbHRpbl9tc2FfYWRkc19hX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkc19hX2gsIDU4MDk4fSwgLy8gX19idWlsdGluX21zYV9hZGRzX2FfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19hZGRzX2FfdywgNTgxMjF9LCAvLyBfX2J1aWx0aW5fbXNhX2FkZHNfYV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHNfc19iLCA1ODE0NH0sIC8vIF9fYnVpbHRpbl9tc2FfYWRkc19zX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkc19zX2QsIDU4MTY3fSwgLy8gX19idWlsdGluX21zYV9hZGRzX3NfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19hZGRzX3NfaCwgNTgxOTB9LCAvLyBfX2J1aWx0aW5fbXNhX2FkZHNfc19oCisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHNfc193LCA1ODIxM30sIC8vIF9fYnVpbHRpbl9tc2FfYWRkc19zX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkc191X2IsIDU4MjM2fSwgLy8gX19idWlsdGluX21zYV9hZGRzX3VfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19hZGRzX3VfZCwgNTgyNTl9LCAvLyBfX2J1aWx0aW5fbXNhX2FkZHNfdV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHNfdV9oLCA1ODI4Mn0sIC8vIF9fYnVpbHRpbl9tc2FfYWRkc191X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkc191X3csIDU4MzA1fSwgLy8gX19idWlsdGluX21zYV9hZGRzX3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19hZGR2X2IsIDU4NDk1fSwgLy8gX19idWlsdGluX21zYV9hZGR2X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkdl9kLCA1ODUxNn0sIC8vIF9fYnVpbHRpbl9tc2FfYWRkdl9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2FkZHZfaCwgNTg1Mzd9LCAvLyBfX2J1aWx0aW5fbXNhX2FkZHZfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19hZGR2X3csIDU4NTU4fSwgLy8gX19idWlsdGluX21zYV9hZGR2X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkdmlfYiwgNTg1Nzl9LCAvLyBfX2J1aWx0aW5fbXNhX2FkZHZpX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkdmlfZCwgNTg2MDF9LCAvLyBfX2J1aWx0aW5fbXNhX2FkZHZpX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkdmlfaCwgNTg2MjN9LCAvLyBfX2J1aWx0aW5fbXNhX2FkZHZpX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYWRkdmlfdywgNTg2NDV9LCAvLyBfX2J1aWx0aW5fbXNhX2FkZHZpX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYW5kX3YsIDU4Njg4fSwgLy8gX19idWlsdGluX21zYV9hbmRfdgorICAgICAge0ludHJpbnNpYzo6bWlwc19hbmRpX2IsIDU4NzA4fSwgLy8gX19idWlsdGluX21zYV9hbmRpX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYXN1Yl9zX2IsIDU4NzUxfSwgLy8gX19idWlsdGluX21zYV9hc3ViX3NfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19hc3ViX3NfZCwgNTg3NzR9LCAvLyBfX2J1aWx0aW5fbXNhX2FzdWJfc19kCisgICAgICB7SW50cmluc2ljOjptaXBzX2FzdWJfc19oLCA1ODc5N30sIC8vIF9fYnVpbHRpbl9tc2FfYXN1Yl9zX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYXN1Yl9zX3csIDU4ODIwfSwgLy8gX19idWlsdGluX21zYV9hc3ViX3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19hc3ViX3VfYiwgNTg4NDN9LCAvLyBfX2J1aWx0aW5fbXNhX2FzdWJfdV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2FzdWJfdV9kLCA1ODg2Nn0sIC8vIF9fYnVpbHRpbl9tc2FfYXN1Yl91X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYXN1Yl91X2gsIDU4ODg5fSwgLy8gX19idWlsdGluX21zYV9hc3ViX3VfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19hc3ViX3VfdywgNTg5MTJ9LCAvLyBfX2J1aWx0aW5fbXNhX2FzdWJfdV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2F2ZV9zX2IsIDU4OTM1fSwgLy8gX19idWlsdGluX21zYV9hdmVfc19iCisgICAgICB7SW50cmluc2ljOjptaXBzX2F2ZV9zX2QsIDU4OTU3fSwgLy8gX19idWlsdGluX21zYV9hdmVfc19kCisgICAgICB7SW50cmluc2ljOjptaXBzX2F2ZV9zX2gsIDU4OTc5fSwgLy8gX19idWlsdGluX21zYV9hdmVfc19oCisgICAgICB7SW50cmluc2ljOjptaXBzX2F2ZV9zX3csIDU5MDAxfSwgLy8gX19idWlsdGluX21zYV9hdmVfc193CisgICAgICB7SW50cmluc2ljOjptaXBzX2F2ZV91X2IsIDU5MDIzfSwgLy8gX19idWlsdGluX21zYV9hdmVfdV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2F2ZV91X2QsIDU5MDQ1fSwgLy8gX19idWlsdGluX21zYV9hdmVfdV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2F2ZV91X2gsIDU5MDY3fSwgLy8gX19idWlsdGluX21zYV9hdmVfdV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2F2ZV91X3csIDU5MDg5fSwgLy8gX19idWlsdGluX21zYV9hdmVfdV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2F2ZXJfc19iLCA1OTExMX0sIC8vIF9fYnVpbHRpbl9tc2FfYXZlcl9zX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYXZlcl9zX2QsIDU5MTM0fSwgLy8gX19idWlsdGluX21zYV9hdmVyX3NfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19hdmVyX3NfaCwgNTkxNTd9LCAvLyBfX2J1aWx0aW5fbXNhX2F2ZXJfc19oCisgICAgICB7SW50cmluc2ljOjptaXBzX2F2ZXJfc193LCA1OTE4MH0sIC8vIF9fYnVpbHRpbl9tc2FfYXZlcl9zX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYXZlcl91X2IsIDU5MjAzfSwgLy8gX19idWlsdGluX21zYV9hdmVyX3VfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19hdmVyX3VfZCwgNTkyMjZ9LCAvLyBfX2J1aWx0aW5fbXNhX2F2ZXJfdV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2F2ZXJfdV9oLCA1OTI0OX0sIC8vIF9fYnVpbHRpbl9tc2FfYXZlcl91X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYXZlcl91X3csIDU5MjcyfSwgLy8gX19idWlsdGluX21zYV9hdmVyX3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19iY2xyX2IsIDU5MzE3fSwgLy8gX19idWlsdGluX21zYV9iY2xyX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmNscl9kLCA1OTMzOH0sIC8vIF9fYnVpbHRpbl9tc2FfYmNscl9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2JjbHJfaCwgNTkzNTl9LCAvLyBfX2J1aWx0aW5fbXNhX2JjbHJfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19iY2xyX3csIDU5MzgwfSwgLy8gX19idWlsdGluX21zYV9iY2xyX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmNscmlfYiwgNTk0MDF9LCAvLyBfX2J1aWx0aW5fbXNhX2JjbHJpX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmNscmlfZCwgNTk0MjN9LCAvLyBfX2J1aWx0aW5fbXNhX2JjbHJpX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmNscmlfaCwgNTk0NDV9LCAvLyBfX2J1aWx0aW5fbXNhX2JjbHJpX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmNscmlfdywgNTk0Njd9LCAvLyBfX2J1aWx0aW5fbXNhX2JjbHJpX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmluc2xfYiwgNTk0ODl9LCAvLyBfX2J1aWx0aW5fbXNhX2JpbnNsX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmluc2xfZCwgNTk1MTF9LCAvLyBfX2J1aWx0aW5fbXNhX2JpbnNsX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmluc2xfaCwgNTk1MzN9LCAvLyBfX2J1aWx0aW5fbXNhX2JpbnNsX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmluc2xfdywgNTk1NTV9LCAvLyBfX2J1aWx0aW5fbXNhX2JpbnNsX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmluc2xpX2IsIDU5NTc3fSwgLy8gX19idWlsdGluX21zYV9iaW5zbGlfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19iaW5zbGlfZCwgNTk2MDB9LCAvLyBfX2J1aWx0aW5fbXNhX2JpbnNsaV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2JpbnNsaV9oLCA1OTYyM30sIC8vIF9fYnVpbHRpbl9tc2FfYmluc2xpX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmluc2xpX3csIDU5NjQ2fSwgLy8gX19idWlsdGluX21zYV9iaW5zbGlfdworICAgICAge0ludHJpbnNpYzo6bWlwc19iaW5zcl9iLCA1OTY2OX0sIC8vIF9fYnVpbHRpbl9tc2FfYmluc3JfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19iaW5zcl9kLCA1OTY5MX0sIC8vIF9fYnVpbHRpbl9tc2FfYmluc3JfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19iaW5zcl9oLCA1OTcxM30sIC8vIF9fYnVpbHRpbl9tc2FfYmluc3JfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19iaW5zcl93LCA1OTczNX0sIC8vIF9fYnVpbHRpbl9tc2FfYmluc3JfdworICAgICAge0ludHJpbnNpYzo6bWlwc19iaW5zcmlfYiwgNTk3NTd9LCAvLyBfX2J1aWx0aW5fbXNhX2JpbnNyaV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2JpbnNyaV9kLCA1OTc4MH0sIC8vIF9fYnVpbHRpbl9tc2FfYmluc3JpX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYmluc3JpX2gsIDU5ODAzfSwgLy8gX19idWlsdGluX21zYV9iaW5zcmlfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19iaW5zcmlfdywgNTk4MjZ9LCAvLyBfX2J1aWx0aW5fbXNhX2JpbnNyaV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2JtbnpfdiwgNTk4NzF9LCAvLyBfX2J1aWx0aW5fbXNhX2JtbnpfdgorICAgICAge0ludHJpbnNpYzo6bWlwc19ibW56aV9iLCA1OTg5Mn0sIC8vIF9fYnVpbHRpbl9tc2FfYm1uemlfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19ibXpfdiwgNTk5MTR9LCAvLyBfX2J1aWx0aW5fbXNhX2Jtel92CisgICAgICB7SW50cmluc2ljOjptaXBzX2JtemlfYiwgNTk5MzR9LCAvLyBfX2J1aWx0aW5fbXNhX2JtemlfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19ibmVnX2IsIDU5OTU1fSwgLy8gX19idWlsdGluX21zYV9ibmVnX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYm5lZ19kLCA1OTk3Nn0sIC8vIF9fYnVpbHRpbl9tc2FfYm5lZ19kCisgICAgICB7SW50cmluc2ljOjptaXBzX2JuZWdfaCwgNTk5OTd9LCAvLyBfX2J1aWx0aW5fbXNhX2JuZWdfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19ibmVnX3csIDYwMDE4fSwgLy8gX19idWlsdGluX21zYV9ibmVnX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYm5lZ2lfYiwgNjAwMzl9LCAvLyBfX2J1aWx0aW5fbXNhX2JuZWdpX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYm5lZ2lfZCwgNjAwNjF9LCAvLyBfX2J1aWx0aW5fbXNhX2JuZWdpX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYm5lZ2lfaCwgNjAwODN9LCAvLyBfX2J1aWx0aW5fbXNhX2JuZWdpX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYm5lZ2lfdywgNjAxMDV9LCAvLyBfX2J1aWx0aW5fbXNhX2JuZWdpX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYm56X2IsIDYwMTI3fSwgLy8gX19idWlsdGluX21zYV9ibnpfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19ibnpfZCwgNjAxNDd9LCAvLyBfX2J1aWx0aW5fbXNhX2Juel9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2Juel9oLCA2MDE2N30sIC8vIF9fYnVpbHRpbl9tc2FfYm56X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYm56X3YsIDYwMTg3fSwgLy8gX19idWlsdGluX21zYV9ibnpfdgorICAgICAge0ludHJpbnNpYzo6bWlwc19ibnpfdywgNjAyMDd9LCAvLyBfX2J1aWx0aW5fbXNhX2Juel93CisgICAgICB7SW50cmluc2ljOjptaXBzX2JzZWxfdiwgNjAyNTF9LCAvLyBfX2J1aWx0aW5fbXNhX2JzZWxfdgorICAgICAge0ludHJpbnNpYzo6bWlwc19ic2VsaV9iLCA2MDI3Mn0sIC8vIF9fYnVpbHRpbl9tc2FfYnNlbGlfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19ic2V0X2IsIDYwMjk0fSwgLy8gX19idWlsdGluX21zYV9ic2V0X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYnNldF9kLCA2MDMxNX0sIC8vIF9fYnVpbHRpbl9tc2FfYnNldF9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2JzZXRfaCwgNjAzMzZ9LCAvLyBfX2J1aWx0aW5fbXNhX2JzZXRfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19ic2V0X3csIDYwMzU3fSwgLy8gX19idWlsdGluX21zYV9ic2V0X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYnNldGlfYiwgNjAzNzh9LCAvLyBfX2J1aWx0aW5fbXNhX2JzZXRpX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYnNldGlfZCwgNjA0MDB9LCAvLyBfX2J1aWx0aW5fbXNhX2JzZXRpX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYnNldGlfaCwgNjA0MjJ9LCAvLyBfX2J1aWx0aW5fbXNhX2JzZXRpX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYnNldGlfdywgNjA0NDR9LCAvLyBfX2J1aWx0aW5fbXNhX2JzZXRpX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYnpfYiwgNjA0NjZ9LCAvLyBfX2J1aWx0aW5fbXNhX2J6X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYnpfZCwgNjA0ODV9LCAvLyBfX2J1aWx0aW5fbXNhX2J6X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYnpfaCwgNjA1MDR9LCAvLyBfX2J1aWx0aW5fbXNhX2J6X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYnpfdiwgNjA1MjN9LCAvLyBfX2J1aWx0aW5fbXNhX2J6X3YKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfYnpfdywgNjA1NDJ9LCAvLyBfX2J1aWx0aW5fbXNhX2J6X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2VxX2IsIDYwNTYxfSwgLy8gX19idWlsdGluX21zYV9jZXFfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19jZXFfZCwgNjA1ODF9LCAvLyBfX2J1aWx0aW5fbXNhX2NlcV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2NlcV9oLCA2MDYwMX0sIC8vIF9fYnVpbHRpbl9tc2FfY2VxX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2VxX3csIDYwNjIxfSwgLy8gX19idWlsdGluX21zYV9jZXFfdworICAgICAge0ludHJpbnNpYzo6bWlwc19jZXFpX2IsIDYwNjQxfSwgLy8gX19idWlsdGluX21zYV9jZXFpX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2VxaV9kLCA2MDY2Mn0sIC8vIF9fYnVpbHRpbl9tc2FfY2VxaV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2NlcWlfaCwgNjA2ODN9LCAvLyBfX2J1aWx0aW5fbXNhX2NlcWlfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19jZXFpX3csIDYwNzA0fSwgLy8gX19idWlsdGluX21zYV9jZXFpX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2ZjbXNhLCA2MDcyNX0sIC8vIF9fYnVpbHRpbl9tc2FfY2ZjbXNhCisgICAgICB7SW50cmluc2ljOjptaXBzX2NsZV9zX2IsIDYwNzQ2fSwgLy8gX19idWlsdGluX21zYV9jbGVfc19iCisgICAgICB7SW50cmluc2ljOjptaXBzX2NsZV9zX2QsIDYwNzY4fSwgLy8gX19idWlsdGluX21zYV9jbGVfc19kCisgICAgICB7SW50cmluc2ljOjptaXBzX2NsZV9zX2gsIDYwNzkwfSwgLy8gX19idWlsdGluX21zYV9jbGVfc19oCisgICAgICB7SW50cmluc2ljOjptaXBzX2NsZV9zX3csIDYwODEyfSwgLy8gX19idWlsdGluX21zYV9jbGVfc193CisgICAgICB7SW50cmluc2ljOjptaXBzX2NsZV91X2IsIDYwODM0fSwgLy8gX19idWlsdGluX21zYV9jbGVfdV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2NsZV91X2QsIDYwODU2fSwgLy8gX19idWlsdGluX21zYV9jbGVfdV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2NsZV91X2gsIDYwODc4fSwgLy8gX19idWlsdGluX21zYV9jbGVfdV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2NsZV91X3csIDYwOTAwfSwgLy8gX19idWlsdGluX21zYV9jbGVfdV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2NsZWlfc19iLCA2MDkyMn0sIC8vIF9fYnVpbHRpbl9tc2FfY2xlaV9zX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2xlaV9zX2QsIDYwOTQ1fSwgLy8gX19idWlsdGluX21zYV9jbGVpX3NfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19jbGVpX3NfaCwgNjA5Njh9LCAvLyBfX2J1aWx0aW5fbXNhX2NsZWlfc19oCisgICAgICB7SW50cmluc2ljOjptaXBzX2NsZWlfc193LCA2MDk5MX0sIC8vIF9fYnVpbHRpbl9tc2FfY2xlaV9zX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2xlaV91X2IsIDYxMDE0fSwgLy8gX19idWlsdGluX21zYV9jbGVpX3VfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19jbGVpX3VfZCwgNjEwMzd9LCAvLyBfX2J1aWx0aW5fbXNhX2NsZWlfdV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2NsZWlfdV9oLCA2MTA2MH0sIC8vIF9fYnVpbHRpbl9tc2FfY2xlaV91X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2xlaV91X3csIDYxMDgzfSwgLy8gX19idWlsdGluX21zYV9jbGVpX3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19jbHRfc19iLCA2MTEwNn0sIC8vIF9fYnVpbHRpbl9tc2FfY2x0X3NfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19jbHRfc19kLCA2MTEyOH0sIC8vIF9fYnVpbHRpbl9tc2FfY2x0X3NfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19jbHRfc19oLCA2MTE1MH0sIC8vIF9fYnVpbHRpbl9tc2FfY2x0X3NfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19jbHRfc193LCA2MTE3Mn0sIC8vIF9fYnVpbHRpbl9tc2FfY2x0X3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19jbHRfdV9iLCA2MTE5NH0sIC8vIF9fYnVpbHRpbl9tc2FfY2x0X3VfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19jbHRfdV9kLCA2MTIxNn0sIC8vIF9fYnVpbHRpbl9tc2FfY2x0X3VfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19jbHRfdV9oLCA2MTIzOH0sIC8vIF9fYnVpbHRpbl9tc2FfY2x0X3VfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19jbHRfdV93LCA2MTI2MH0sIC8vIF9fYnVpbHRpbl9tc2FfY2x0X3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19jbHRpX3NfYiwgNjEyODJ9LCAvLyBfX2J1aWx0aW5fbXNhX2NsdGlfc19iCisgICAgICB7SW50cmluc2ljOjptaXBzX2NsdGlfc19kLCA2MTMwNX0sIC8vIF9fYnVpbHRpbl9tc2FfY2x0aV9zX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2x0aV9zX2gsIDYxMzI4fSwgLy8gX19idWlsdGluX21zYV9jbHRpX3NfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19jbHRpX3NfdywgNjEzNTF9LCAvLyBfX2J1aWx0aW5fbXNhX2NsdGlfc193CisgICAgICB7SW50cmluc2ljOjptaXBzX2NsdGlfdV9iLCA2MTM3NH0sIC8vIF9fYnVpbHRpbl9tc2FfY2x0aV91X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY2x0aV91X2QsIDYxMzk3fSwgLy8gX19idWlsdGluX21zYV9jbHRpX3VfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19jbHRpX3VfaCwgNjE0MjB9LCAvLyBfX2J1aWx0aW5fbXNhX2NsdGlfdV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2NsdGlfdV93LCA2MTQ0M30sIC8vIF9fYnVpbHRpbl9tc2FfY2x0aV91X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY29weV9zX2IsIDYxNzg0fSwgLy8gX19idWlsdGluX21zYV9jb3B5X3NfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19jb3B5X3NfZCwgNjE4MDd9LCAvLyBfX2J1aWx0aW5fbXNhX2NvcHlfc19kCisgICAgICB7SW50cmluc2ljOjptaXBzX2NvcHlfc19oLCA2MTgzMH0sIC8vIF9fYnVpbHRpbl9tc2FfY29weV9zX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY29weV9zX3csIDYxODUzfSwgLy8gX19idWlsdGluX21zYV9jb3B5X3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19jb3B5X3VfYiwgNjE4NzZ9LCAvLyBfX2J1aWx0aW5fbXNhX2NvcHlfdV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2NvcHlfdV9kLCA2MTg5OX0sIC8vIF9fYnVpbHRpbl9tc2FfY29weV91X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfY29weV91X2gsIDYxOTIyfSwgLy8gX19idWlsdGluX21zYV9jb3B5X3VfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19jb3B5X3VfdywgNjE5NDV9LCAvLyBfX2J1aWx0aW5fbXNhX2NvcHlfdV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2N0Y21zYSwgNjE5Njh9LCAvLyBfX2J1aWx0aW5fbXNhX2N0Y21zYQorICAgICAge0ludHJpbnNpYzo6bWlwc19kaXZfc19iLCA2MTk4OX0sIC8vIF9fYnVpbHRpbl9tc2FfZGl2X3NfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19kaXZfc19kLCA2MjAxMX0sIC8vIF9fYnVpbHRpbl9tc2FfZGl2X3NfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19kaXZfc19oLCA2MjAzM30sIC8vIF9fYnVpbHRpbl9tc2FfZGl2X3NfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19kaXZfc193LCA2MjA1NX0sIC8vIF9fYnVpbHRpbl9tc2FfZGl2X3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19kaXZfdV9iLCA2MjA3N30sIC8vIF9fYnVpbHRpbl9tc2FfZGl2X3VfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19kaXZfdV9kLCA2MjA5OX0sIC8vIF9fYnVpbHRpbl9tc2FfZGl2X3VfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19kaXZfdV9oLCA2MjEyMX0sIC8vIF9fYnVpbHRpbl9tc2FfZGl2X3VfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19kaXZfdV93LCA2MjE0M30sIC8vIF9fYnVpbHRpbl9tc2FfZGl2X3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19kb3RwX3NfZCwgNjIxODV9LCAvLyBfX2J1aWx0aW5fbXNhX2RvdHBfc19kCisgICAgICB7SW50cmluc2ljOjptaXBzX2RvdHBfc19oLCA2MjIwOH0sIC8vIF9fYnVpbHRpbl9tc2FfZG90cF9zX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZG90cF9zX3csIDYyMjMxfSwgLy8gX19idWlsdGluX21zYV9kb3RwX3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19kb3RwX3VfZCwgNjIyNTR9LCAvLyBfX2J1aWx0aW5fbXNhX2RvdHBfdV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2RvdHBfdV9oLCA2MjI3N30sIC8vIF9fYnVpbHRpbl9tc2FfZG90cF91X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZG90cF91X3csIDYyMzAwfSwgLy8gX19idWlsdGluX21zYV9kb3RwX3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19kcGFkZF9zX2QsIDYyMzQ3fSwgLy8gX19idWlsdGluX21zYV9kcGFkZF9zX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZHBhZGRfc19oLCA2MjM3MX0sIC8vIF9fYnVpbHRpbl9tc2FfZHBhZGRfc19oCisgICAgICB7SW50cmluc2ljOjptaXBzX2RwYWRkX3NfdywgNjIzOTV9LCAvLyBfX2J1aWx0aW5fbXNhX2RwYWRkX3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19kcGFkZF91X2QsIDYyNDE5fSwgLy8gX19idWlsdGluX21zYV9kcGFkZF91X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZHBhZGRfdV9oLCA2MjQ0M30sIC8vIF9fYnVpbHRpbl9tc2FfZHBhZGRfdV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2RwYWRkX3VfdywgNjI0Njd9LCAvLyBfX2J1aWx0aW5fbXNhX2RwYWRkX3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19kcHN1Yl9zX2QsIDYyODY2fSwgLy8gX19idWlsdGluX21zYV9kcHN1Yl9zX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZHBzdWJfc19oLCA2Mjg5MH0sIC8vIF9fYnVpbHRpbl9tc2FfZHBzdWJfc19oCisgICAgICB7SW50cmluc2ljOjptaXBzX2Rwc3ViX3NfdywgNjI5MTR9LCAvLyBfX2J1aWx0aW5fbXNhX2Rwc3ViX3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19kcHN1Yl91X2QsIDYyOTM4fSwgLy8gX19idWlsdGluX21zYV9kcHN1Yl91X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZHBzdWJfdV9oLCA2Mjk2Mn0sIC8vIF9fYnVpbHRpbl9tc2FfZHBzdWJfdV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2Rwc3ViX3VfdywgNjI5ODZ9LCAvLyBfX2J1aWx0aW5fbXNhX2Rwc3ViX3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mYWRkX2QsIDYzMTcyfSwgLy8gX19idWlsdGluX21zYV9mYWRkX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmFkZF93LCA2MzE5M30sIC8vIF9fYnVpbHRpbl9tc2FfZmFkZF93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZjYWZfZCwgNjMyMTR9LCAvLyBfX2J1aWx0aW5fbXNhX2ZjYWZfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mY2FmX3csIDYzMjM1fSwgLy8gX19idWlsdGluX21zYV9mY2FmX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmNlcV9kLCA2MzI1Nn0sIC8vIF9fYnVpbHRpbl9tc2FfZmNlcV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZjZXFfdywgNjMyNzd9LCAvLyBfX2J1aWx0aW5fbXNhX2ZjZXFfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mY2xhc3NfZCwgNjMyOTh9LCAvLyBfX2J1aWx0aW5fbXNhX2ZjbGFzc19kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZjbGFzc193LCA2MzMyMX0sIC8vIF9fYnVpbHRpbl9tc2FfZmNsYXNzX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmNsZV9kLCA2MzM0NH0sIC8vIF9fYnVpbHRpbl9tc2FfZmNsZV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZjbGVfdywgNjMzNjV9LCAvLyBfX2J1aWx0aW5fbXNhX2ZjbGVfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mY2x0X2QsIDYzMzg2fSwgLy8gX19idWlsdGluX21zYV9mY2x0X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmNsdF93LCA2MzQwN30sIC8vIF9fYnVpbHRpbl9tc2FfZmNsdF93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZjbmVfZCwgNjM0Mjh9LCAvLyBfX2J1aWx0aW5fbXNhX2ZjbmVfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mY25lX3csIDYzNDQ5fSwgLy8gX19idWlsdGluX21zYV9mY25lX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmNvcl9kLCA2MzQ3MH0sIC8vIF9fYnVpbHRpbl9tc2FfZmNvcl9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2Zjb3JfdywgNjM0OTF9LCAvLyBfX2J1aWx0aW5fbXNhX2Zjb3JfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mY3VlcV9kLCA2MzUxMn0sIC8vIF9fYnVpbHRpbl9tc2FfZmN1ZXFfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mY3VlcV93LCA2MzUzNH0sIC8vIF9fYnVpbHRpbl9tc2FfZmN1ZXFfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mY3VsZV9kLCA2MzU1Nn0sIC8vIF9fYnVpbHRpbl9tc2FfZmN1bGVfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mY3VsZV93LCA2MzU3OH0sIC8vIF9fYnVpbHRpbl9tc2FfZmN1bGVfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mY3VsdF9kLCA2MzYwMH0sIC8vIF9fYnVpbHRpbl9tc2FfZmN1bHRfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mY3VsdF93LCA2MzYyMn0sIC8vIF9fYnVpbHRpbl9tc2FfZmN1bHRfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mY3VuX2QsIDYzNjQ0fSwgLy8gX19idWlsdGluX21zYV9mY3VuX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmN1bl93LCA2MzY2NX0sIC8vIF9fYnVpbHRpbl9tc2FfZmN1bl93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZjdW5lX2QsIDYzNjg2fSwgLy8gX19idWlsdGluX21zYV9mY3VuZV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZjdW5lX3csIDYzNzA4fSwgLy8gX19idWlsdGluX21zYV9mY3VuZV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZkaXZfZCwgNjM3MzB9LCAvLyBfX2J1aWx0aW5fbXNhX2ZkaXZfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mZGl2X3csIDYzNzUxfSwgLy8gX19idWlsdGluX21zYV9mZGl2X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmV4ZG9faCwgNjM3NzJ9LCAvLyBfX2J1aWx0aW5fbXNhX2ZleGRvX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmV4ZG9fdywgNjM3OTR9LCAvLyBfX2J1aWx0aW5fbXNhX2ZleGRvX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmV4cDJfZCwgNjM4MTZ9LCAvLyBfX2J1aWx0aW5fbXNhX2ZleHAyX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmV4cDJfdywgNjM4Mzh9LCAvLyBfX2J1aWx0aW5fbXNhX2ZleHAyX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmV4dXBsX2QsIDYzODYwfSwgLy8gX19idWlsdGluX21zYV9mZXh1cGxfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mZXh1cGxfdywgNjM4ODN9LCAvLyBfX2J1aWx0aW5fbXNhX2ZleHVwbF93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZleHVwcl9kLCA2MzkwNn0sIC8vIF9fYnVpbHRpbl9tc2FfZmV4dXByX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmV4dXByX3csIDYzOTI5fSwgLy8gX19idWlsdGluX21zYV9mZXh1cHJfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mZmludF9zX2QsIDYzOTUyfSwgLy8gX19idWlsdGluX21zYV9mZmludF9zX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmZpbnRfc193LCA2Mzk3Nn0sIC8vIF9fYnVpbHRpbl9tc2FfZmZpbnRfc193CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZmaW50X3VfZCwgNjQwMDB9LCAvLyBfX2J1aWx0aW5fbXNhX2ZmaW50X3VfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mZmludF91X3csIDY0MDI0fSwgLy8gX19idWlsdGluX21zYV9mZmludF91X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmZxbF9kLCA2NDA0OH0sIC8vIF9fYnVpbHRpbl9tc2FfZmZxbF9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZmcWxfdywgNjQwNjl9LCAvLyBfX2J1aWx0aW5fbXNhX2ZmcWxfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mZnFyX2QsIDY0MDkwfSwgLy8gX19idWlsdGluX21zYV9mZnFyX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmZxcl93LCA2NDExMX0sIC8vIF9fYnVpbHRpbl9tc2FfZmZxcl93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZpbGxfYiwgNjQxMzJ9LCAvLyBfX2J1aWx0aW5fbXNhX2ZpbGxfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19maWxsX2QsIDY0MTUzfSwgLy8gX19idWlsdGluX21zYV9maWxsX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZmlsbF9oLCA2NDE3NH0sIC8vIF9fYnVpbHRpbl9tc2FfZmlsbF9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZpbGxfdywgNjQxOTV9LCAvLyBfX2J1aWx0aW5fbXNhX2ZpbGxfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mbG9nMl9kLCA2NDIxNn0sIC8vIF9fYnVpbHRpbl9tc2FfZmxvZzJfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mbG9nMl93LCA2NDIzOH0sIC8vIF9fYnVpbHRpbl9tc2FfZmxvZzJfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mbWFkZF9kLCA2NDI2MH0sIC8vIF9fYnVpbHRpbl9tc2FfZm1hZGRfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mbWFkZF93LCA2NDI4Mn0sIC8vIF9fYnVpbHRpbl9tc2FfZm1hZGRfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mbWF4X2FfZCwgNjQzMDR9LCAvLyBfX2J1aWx0aW5fbXNhX2ZtYXhfYV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZtYXhfYV93LCA2NDMyN30sIC8vIF9fYnVpbHRpbl9tc2FfZm1heF9hX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZm1heF9kLCA2NDM1MH0sIC8vIF9fYnVpbHRpbl9tc2FfZm1heF9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZtYXhfdywgNjQzNzF9LCAvLyBfX2J1aWx0aW5fbXNhX2ZtYXhfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mbWluX2FfZCwgNjQzOTJ9LCAvLyBfX2J1aWx0aW5fbXNhX2ZtaW5fYV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZtaW5fYV93LCA2NDQxNX0sIC8vIF9fYnVpbHRpbl9tc2FfZm1pbl9hX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZm1pbl9kLCA2NDQzOH0sIC8vIF9fYnVpbHRpbl9tc2FfZm1pbl9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZtaW5fdywgNjQ0NTl9LCAvLyBfX2J1aWx0aW5fbXNhX2ZtaW5fdworICAgICAge0ludHJpbnNpYzo6bWlwc19mbXN1Yl9kLCA2NDQ4MH0sIC8vIF9fYnVpbHRpbl9tc2FfZm1zdWJfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mbXN1Yl93LCA2NDUwMn0sIC8vIF9fYnVpbHRpbl9tc2FfZm1zdWJfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mbXVsX2QsIDY0NTI0fSwgLy8gX19idWlsdGluX21zYV9mbXVsX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZm11bF93LCA2NDU0NX0sIC8vIF9fYnVpbHRpbl9tc2FfZm11bF93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZyY3BfZCwgNjQ1NjZ9LCAvLyBfX2J1aWx0aW5fbXNhX2ZyY3BfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mcmNwX3csIDY0NTg3fSwgLy8gX19idWlsdGluX21zYV9mcmNwX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnJpbnRfZCwgNjQ2MDh9LCAvLyBfX2J1aWx0aW5fbXNhX2ZyaW50X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnJpbnRfdywgNjQ2MzB9LCAvLyBfX2J1aWx0aW5fbXNhX2ZyaW50X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnJzcXJ0X2QsIDY0NjUyfSwgLy8gX19idWlsdGluX21zYV9mcnNxcnRfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mcnNxcnRfdywgNjQ2NzV9LCAvLyBfX2J1aWx0aW5fbXNhX2Zyc3FydF93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZzYWZfZCwgNjQ2OTh9LCAvLyBfX2J1aWx0aW5fbXNhX2ZzYWZfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mc2FmX3csIDY0NzE5fSwgLy8gX19idWlsdGluX21zYV9mc2FmX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnNlcV9kLCA2NDc0MH0sIC8vIF9fYnVpbHRpbl9tc2FfZnNlcV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZzZXFfdywgNjQ3NjF9LCAvLyBfX2J1aWx0aW5fbXNhX2ZzZXFfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mc2xlX2QsIDY0NzgyfSwgLy8gX19idWlsdGluX21zYV9mc2xlX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnNsZV93LCA2NDgwM30sIC8vIF9fYnVpbHRpbl9tc2FfZnNsZV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZzbHRfZCwgNjQ4MjR9LCAvLyBfX2J1aWx0aW5fbXNhX2ZzbHRfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mc2x0X3csIDY0ODQ1fSwgLy8gX19idWlsdGluX21zYV9mc2x0X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnNuZV9kLCA2NDg2Nn0sIC8vIF9fYnVpbHRpbl9tc2FfZnNuZV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZzbmVfdywgNjQ4ODd9LCAvLyBfX2J1aWx0aW5fbXNhX2ZzbmVfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mc29yX2QsIDY0OTA4fSwgLy8gX19idWlsdGluX21zYV9mc29yX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnNvcl93LCA2NDkyOX0sIC8vIF9fYnVpbHRpbl9tc2FfZnNvcl93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZzcXJ0X2QsIDY0OTUwfSwgLy8gX19idWlsdGluX21zYV9mc3FydF9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZzcXJ0X3csIDY0OTcyfSwgLy8gX19idWlsdGluX21zYV9mc3FydF93CisgICAgICB7SW50cmluc2ljOjptaXBzX2ZzdWJfZCwgNjQ5OTR9LCAvLyBfX2J1aWx0aW5fbXNhX2ZzdWJfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mc3ViX3csIDY1MDE1fSwgLy8gX19idWlsdGluX21zYV9mc3ViX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnN1ZXFfZCwgNjUwMzZ9LCAvLyBfX2J1aWx0aW5fbXNhX2ZzdWVxX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnN1ZXFfdywgNjUwNTh9LCAvLyBfX2J1aWx0aW5fbXNhX2ZzdWVxX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnN1bGVfZCwgNjUwODB9LCAvLyBfX2J1aWx0aW5fbXNhX2ZzdWxlX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnN1bGVfdywgNjUxMDJ9LCAvLyBfX2J1aWx0aW5fbXNhX2ZzdWxlX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnN1bHRfZCwgNjUxMjR9LCAvLyBfX2J1aWx0aW5fbXNhX2ZzdWx0X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnN1bHRfdywgNjUxNDZ9LCAvLyBfX2J1aWx0aW5fbXNhX2ZzdWx0X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnN1bl9kLCA2NTE2OH0sIC8vIF9fYnVpbHRpbl9tc2FfZnN1bl9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2ZzdW5fdywgNjUxODl9LCAvLyBfX2J1aWx0aW5fbXNhX2ZzdW5fdworICAgICAge0ludHJpbnNpYzo6bWlwc19mc3VuZV9kLCA2NTIxMH0sIC8vIF9fYnVpbHRpbl9tc2FfZnN1bmVfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mc3VuZV93LCA2NTIzMn0sIC8vIF9fYnVpbHRpbl9tc2FfZnN1bmVfdworICAgICAge0ludHJpbnNpYzo6bWlwc19mdGludF9zX2QsIDY1MjU0fSwgLy8gX19idWlsdGluX21zYV9mdGludF9zX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnRpbnRfc193LCA2NTI3OH0sIC8vIF9fYnVpbHRpbl9tc2FfZnRpbnRfc193CisgICAgICB7SW50cmluc2ljOjptaXBzX2Z0aW50X3VfZCwgNjUzMDJ9LCAvLyBfX2J1aWx0aW5fbXNhX2Z0aW50X3VfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19mdGludF91X3csIDY1MzI2fSwgLy8gX19idWlsdGluX21zYV9mdGludF91X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfZnRxX2gsIDY1MzUwfSwgLy8gX19idWlsdGluX21zYV9mdHFfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19mdHFfdywgNjUzNzB9LCAvLyBfX2J1aWx0aW5fbXNhX2Z0cV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2Z0cnVuY19zX2QsIDY1MzkwfSwgLy8gX19idWlsdGluX21zYV9mdHJ1bmNfc19kCisgICAgICB7SW50cmluc2ljOjptaXBzX2Z0cnVuY19zX3csIDY1NDE1fSwgLy8gX19idWlsdGluX21zYV9mdHJ1bmNfc193CisgICAgICB7SW50cmluc2ljOjptaXBzX2Z0cnVuY191X2QsIDY1NDQwfSwgLy8gX19idWlsdGluX21zYV9mdHJ1bmNfdV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2Z0cnVuY191X3csIDY1NDY1fSwgLy8gX19idWlsdGluX21zYV9mdHJ1bmNfdV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2hhZGRfc19kLCA2NTQ5MH0sIC8vIF9fYnVpbHRpbl9tc2FfaGFkZF9zX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaGFkZF9zX2gsIDY1NTEzfSwgLy8gX19idWlsdGluX21zYV9oYWRkX3NfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19oYWRkX3NfdywgNjU1MzZ9LCAvLyBfX2J1aWx0aW5fbXNhX2hhZGRfc193CisgICAgICB7SW50cmluc2ljOjptaXBzX2hhZGRfdV9kLCA2NTU1OX0sIC8vIF9fYnVpbHRpbl9tc2FfaGFkZF91X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaGFkZF91X2gsIDY1NTgyfSwgLy8gX19idWlsdGluX21zYV9oYWRkX3VfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19oYWRkX3VfdywgNjU2MDV9LCAvLyBfX2J1aWx0aW5fbXNhX2hhZGRfdV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2hzdWJfc19kLCA2NTYyOH0sIC8vIF9fYnVpbHRpbl9tc2FfaHN1Yl9zX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaHN1Yl9zX2gsIDY1NjUxfSwgLy8gX19idWlsdGluX21zYV9oc3ViX3NfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19oc3ViX3NfdywgNjU2NzR9LCAvLyBfX2J1aWx0aW5fbXNhX2hzdWJfc193CisgICAgICB7SW50cmluc2ljOjptaXBzX2hzdWJfdV9kLCA2NTY5N30sIC8vIF9fYnVpbHRpbl9tc2FfaHN1Yl91X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaHN1Yl91X2gsIDY1NzIwfSwgLy8gX19idWlsdGluX21zYV9oc3ViX3VfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19oc3ViX3VfdywgNjU3NDN9LCAvLyBfX2J1aWx0aW5fbXNhX2hzdWJfdV93CisgICAgICB7SW50cmluc2ljOjptaXBzX2lsdmV2X2IsIDY1NzY2fSwgLy8gX19idWlsdGluX21zYV9pbHZldl9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2lsdmV2X2QsIDY1Nzg4fSwgLy8gX19idWlsdGluX21zYV9pbHZldl9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2lsdmV2X2gsIDY1ODEwfSwgLy8gX19idWlsdGluX21zYV9pbHZldl9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2lsdmV2X3csIDY1ODMyfSwgLy8gX19idWlsdGluX21zYV9pbHZldl93CisgICAgICB7SW50cmluc2ljOjptaXBzX2lsdmxfYiwgNjU4NTR9LCAvLyBfX2J1aWx0aW5fbXNhX2lsdmxfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19pbHZsX2QsIDY1ODc1fSwgLy8gX19idWlsdGluX21zYV9pbHZsX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaWx2bF9oLCA2NTg5Nn0sIC8vIF9fYnVpbHRpbl9tc2FfaWx2bF9oCisgICAgICB7SW50cmluc2ljOjptaXBzX2lsdmxfdywgNjU5MTd9LCAvLyBfX2J1aWx0aW5fbXNhX2lsdmxfdworICAgICAge0ludHJpbnNpYzo6bWlwc19pbHZvZF9iLCA2NTkzOH0sIC8vIF9fYnVpbHRpbl9tc2FfaWx2b2RfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19pbHZvZF9kLCA2NTk2MH0sIC8vIF9fYnVpbHRpbl9tc2FfaWx2b2RfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19pbHZvZF9oLCA2NTk4Mn0sIC8vIF9fYnVpbHRpbl9tc2FfaWx2b2RfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19pbHZvZF93LCA2NjAwNH0sIC8vIF9fYnVpbHRpbl9tc2FfaWx2b2RfdworICAgICAge0ludHJpbnNpYzo6bWlwc19pbHZyX2IsIDY2MDI2fSwgLy8gX19idWlsdGluX21zYV9pbHZyX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaWx2cl9kLCA2NjA0N30sIC8vIF9fYnVpbHRpbl9tc2FfaWx2cl9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2lsdnJfaCwgNjYwNjh9LCAvLyBfX2J1aWx0aW5fbXNhX2lsdnJfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19pbHZyX3csIDY2MDg5fSwgLy8gX19idWlsdGluX21zYV9pbHZyX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaW5zZXJ0X2IsIDY2MTEwfSwgLy8gX19idWlsdGluX21zYV9pbnNlcnRfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19pbnNlcnRfZCwgNjYxMzN9LCAvLyBfX2J1aWx0aW5fbXNhX2luc2VydF9kCisgICAgICB7SW50cmluc2ljOjptaXBzX2luc2VydF9oLCA2NjE1Nn0sIC8vIF9fYnVpbHRpbl9tc2FfaW5zZXJ0X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfaW5zZXJ0X3csIDY2MTc5fSwgLy8gX19idWlsdGluX21zYV9pbnNlcnRfdworICAgICAge0ludHJpbnNpYzo6bWlwc19pbnN2ZV9iLCA2NjIyMn0sIC8vIF9fYnVpbHRpbl9tc2FfaW5zdmVfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19pbnN2ZV9kLCA2NjI0NH0sIC8vIF9fYnVpbHRpbl9tc2FfaW5zdmVfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19pbnN2ZV9oLCA2NjI2Nn0sIC8vIF9fYnVpbHRpbl9tc2FfaW5zdmVfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19pbnN2ZV93LCA2NjI4OH0sIC8vIF9fYnVpbHRpbl9tc2FfaW5zdmVfdworICAgICAge0ludHJpbnNpYzo6bWlwc19sZF9iLCA2NjMzMH0sIC8vIF9fYnVpbHRpbl9tc2FfbGRfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19sZF9kLCA2NjM0OX0sIC8vIF9fYnVpbHRpbl9tc2FfbGRfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19sZF9oLCA2NjM2OH0sIC8vIF9fYnVpbHRpbl9tc2FfbGRfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19sZF93LCA2NjM4N30sIC8vIF9fYnVpbHRpbl9tc2FfbGRfdworICAgICAge0ludHJpbnNpYzo6bWlwc19sZGlfYiwgNjY0MDZ9LCAvLyBfX2J1aWx0aW5fbXNhX2xkaV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX2xkaV9kLCA2NjQyNn0sIC8vIF9fYnVpbHRpbl9tc2FfbGRpX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbGRpX2gsIDY2NDQ2fSwgLy8gX19idWlsdGluX21zYV9sZGlfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19sZGlfdywgNjY0NjZ9LCAvLyBfX2J1aWx0aW5fbXNhX2xkaV93CisgICAgICB7SW50cmluc2ljOjptaXBzX21hZGRfcV9oLCA2NjU2M30sIC8vIF9fYnVpbHRpbl9tc2FfbWFkZF9xX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWFkZF9xX3csIDY2NTg2fSwgLy8gX19idWlsdGluX21zYV9tYWRkX3FfdworICAgICAge0ludHJpbnNpYzo6bWlwc19tYWRkcl9xX2gsIDY2NjA5fSwgLy8gX19idWlsdGluX21zYV9tYWRkcl9xX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWFkZHJfcV93LCA2NjYzM30sIC8vIF9fYnVpbHRpbl9tc2FfbWFkZHJfcV93CisgICAgICB7SW50cmluc2ljOjptaXBzX21hZGR2X2IsIDY2Njc4fSwgLy8gX19idWlsdGluX21zYV9tYWRkdl9iCisgICAgICB7SW50cmluc2ljOjptaXBzX21hZGR2X2QsIDY2NzAwfSwgLy8gX19idWlsdGluX21zYV9tYWRkdl9kCisgICAgICB7SW50cmluc2ljOjptaXBzX21hZGR2X2gsIDY2NzIyfSwgLy8gX19idWlsdGluX21zYV9tYWRkdl9oCisgICAgICB7SW50cmluc2ljOjptaXBzX21hZGR2X3csIDY2NzQ0fSwgLy8gX19idWlsdGluX21zYV9tYWRkdl93CisgICAgICB7SW50cmluc2ljOjptaXBzX21heF9hX2IsIDY2ODc2fSwgLy8gX19idWlsdGluX21zYV9tYXhfYV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX21heF9hX2QsIDY2ODk4fSwgLy8gX19idWlsdGluX21zYV9tYXhfYV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX21heF9hX2gsIDY2OTIwfSwgLy8gX19idWlsdGluX21zYV9tYXhfYV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX21heF9hX3csIDY2OTQyfSwgLy8gX19idWlsdGluX21zYV9tYXhfYV93CisgICAgICB7SW50cmluc2ljOjptaXBzX21heF9zX2IsIDY2OTY0fSwgLy8gX19idWlsdGluX21zYV9tYXhfc19iCisgICAgICB7SW50cmluc2ljOjptaXBzX21heF9zX2QsIDY2OTg2fSwgLy8gX19idWlsdGluX21zYV9tYXhfc19kCisgICAgICB7SW50cmluc2ljOjptaXBzX21heF9zX2gsIDY3MDA4fSwgLy8gX19idWlsdGluX21zYV9tYXhfc19oCisgICAgICB7SW50cmluc2ljOjptaXBzX21heF9zX3csIDY3MDMwfSwgLy8gX19idWlsdGluX21zYV9tYXhfc193CisgICAgICB7SW50cmluc2ljOjptaXBzX21heF91X2IsIDY3MDUyfSwgLy8gX19idWlsdGluX21zYV9tYXhfdV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX21heF91X2QsIDY3MDc0fSwgLy8gX19idWlsdGluX21zYV9tYXhfdV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX21heF91X2gsIDY3MDk2fSwgLy8gX19idWlsdGluX21zYV9tYXhfdV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX21heF91X3csIDY3MTE4fSwgLy8gX19idWlsdGluX21zYV9tYXhfdV93CisgICAgICB7SW50cmluc2ljOjptaXBzX21heGlfc19iLCA2NzE0MH0sIC8vIF9fYnVpbHRpbl9tc2FfbWF4aV9zX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWF4aV9zX2QsIDY3MTYzfSwgLy8gX19idWlsdGluX21zYV9tYXhpX3NfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19tYXhpX3NfaCwgNjcxODZ9LCAvLyBfX2J1aWx0aW5fbXNhX21heGlfc19oCisgICAgICB7SW50cmluc2ljOjptaXBzX21heGlfc193LCA2NzIwOX0sIC8vIF9fYnVpbHRpbl9tc2FfbWF4aV9zX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWF4aV91X2IsIDY3MjMyfSwgLy8gX19idWlsdGluX21zYV9tYXhpX3VfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19tYXhpX3VfZCwgNjcyNTV9LCAvLyBfX2J1aWx0aW5fbXNhX21heGlfdV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX21heGlfdV9oLCA2NzI3OH0sIC8vIF9fYnVpbHRpbl9tc2FfbWF4aV91X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWF4aV91X3csIDY3MzAxfSwgLy8gX19idWlsdGluX21zYV9tYXhpX3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19taW5fYV9iLCA2NzMyNH0sIC8vIF9fYnVpbHRpbl9tc2FfbWluX2FfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19taW5fYV9kLCA2NzM0Nn0sIC8vIF9fYnVpbHRpbl9tc2FfbWluX2FfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19taW5fYV9oLCA2NzM2OH0sIC8vIF9fYnVpbHRpbl9tc2FfbWluX2FfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19taW5fYV93LCA2NzM5MH0sIC8vIF9fYnVpbHRpbl9tc2FfbWluX2FfdworICAgICAge0ludHJpbnNpYzo6bWlwc19taW5fc19iLCA2NzQxMn0sIC8vIF9fYnVpbHRpbl9tc2FfbWluX3NfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19taW5fc19kLCA2NzQzNH0sIC8vIF9fYnVpbHRpbl9tc2FfbWluX3NfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19taW5fc19oLCA2NzQ1Nn0sIC8vIF9fYnVpbHRpbl9tc2FfbWluX3NfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19taW5fc193LCA2NzQ3OH0sIC8vIF9fYnVpbHRpbl9tc2FfbWluX3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19taW5fdV9iLCA2NzUwMH0sIC8vIF9fYnVpbHRpbl9tc2FfbWluX3VfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19taW5fdV9kLCA2NzUyMn0sIC8vIF9fYnVpbHRpbl9tc2FfbWluX3VfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19taW5fdV9oLCA2NzU0NH0sIC8vIF9fYnVpbHRpbl9tc2FfbWluX3VfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19taW5fdV93LCA2NzU2Nn0sIC8vIF9fYnVpbHRpbl9tc2FfbWluX3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19taW5pX3NfYiwgNjc1ODh9LCAvLyBfX2J1aWx0aW5fbXNhX21pbmlfc19iCisgICAgICB7SW50cmluc2ljOjptaXBzX21pbmlfc19kLCA2NzYxMX0sIC8vIF9fYnVpbHRpbl9tc2FfbWluaV9zX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWluaV9zX2gsIDY3NjM0fSwgLy8gX19idWlsdGluX21zYV9taW5pX3NfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19taW5pX3NfdywgNjc2NTd9LCAvLyBfX2J1aWx0aW5fbXNhX21pbmlfc193CisgICAgICB7SW50cmluc2ljOjptaXBzX21pbmlfdV9iLCA2NzY4MH0sIC8vIF9fYnVpbHRpbl9tc2FfbWluaV91X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbWluaV91X2QsIDY3NzAzfSwgLy8gX19idWlsdGluX21zYV9taW5pX3VfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19taW5pX3VfaCwgNjc3MjZ9LCAvLyBfX2J1aWx0aW5fbXNhX21pbmlfdV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX21pbmlfdV93LCA2Nzc0OX0sIC8vIF9fYnVpbHRpbl9tc2FfbWluaV91X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbW9kX3NfYiwgNjc3NzJ9LCAvLyBfX2J1aWx0aW5fbXNhX21vZF9zX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbW9kX3NfZCwgNjc3OTR9LCAvLyBfX2J1aWx0aW5fbXNhX21vZF9zX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbW9kX3NfaCwgNjc4MTZ9LCAvLyBfX2J1aWx0aW5fbXNhX21vZF9zX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbW9kX3NfdywgNjc4Mzh9LCAvLyBfX2J1aWx0aW5fbXNhX21vZF9zX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbW9kX3VfYiwgNjc4NjB9LCAvLyBfX2J1aWx0aW5fbXNhX21vZF91X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbW9kX3VfZCwgNjc4ODJ9LCAvLyBfX2J1aWx0aW5fbXNhX21vZF91X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbW9kX3VfaCwgNjc5MDR9LCAvLyBfX2J1aWx0aW5fbXNhX21vZF91X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbW9kX3VfdywgNjc5MjZ9LCAvLyBfX2J1aWx0aW5fbXNhX21vZF91X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbW92ZV92LCA2Nzk3MH0sIC8vIF9fYnVpbHRpbl9tc2FfbW92ZV92CisgICAgICB7SW50cmluc2ljOjptaXBzX21zdWJfcV9oLCA2ODAxMX0sIC8vIF9fYnVpbHRpbl9tc2FfbXN1Yl9xX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbXN1Yl9xX3csIDY4MDM0fSwgLy8gX19idWlsdGluX21zYV9tc3ViX3FfdworICAgICAge0ludHJpbnNpYzo6bWlwc19tc3Vicl9xX2gsIDY4MDU3fSwgLy8gX19idWlsdGluX21zYV9tc3Vicl9xX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbXN1YnJfcV93LCA2ODA4MX0sIC8vIF9fYnVpbHRpbl9tc2FfbXN1YnJfcV93CisgICAgICB7SW50cmluc2ljOjptaXBzX21zdWJ2X2IsIDY4MTI2fSwgLy8gX19idWlsdGluX21zYV9tc3Vidl9iCisgICAgICB7SW50cmluc2ljOjptaXBzX21zdWJ2X2QsIDY4MTQ4fSwgLy8gX19idWlsdGluX21zYV9tc3Vidl9kCisgICAgICB7SW50cmluc2ljOjptaXBzX21zdWJ2X2gsIDY4MTcwfSwgLy8gX19idWlsdGluX21zYV9tc3Vidl9oCisgICAgICB7SW50cmluc2ljOjptaXBzX21zdWJ2X3csIDY4MTkyfSwgLy8gX19idWlsdGluX21zYV9tc3Vidl93CisgICAgICB7SW50cmluc2ljOjptaXBzX211bF9xX2gsIDY4MjU4fSwgLy8gX19idWlsdGluX21zYV9tdWxfcV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX211bF9xX3csIDY4MjgwfSwgLy8gX19idWlsdGluX21zYV9tdWxfcV93CisgICAgICB7SW50cmluc2ljOjptaXBzX211bHJfcV9oLCA2ODU0NH0sIC8vIF9fYnVpbHRpbl9tc2FfbXVscl9xX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbXVscl9xX3csIDY4NTY3fSwgLy8gX19idWlsdGluX21zYV9tdWxyX3FfdworICAgICAge0ludHJpbnNpYzo6bWlwc19tdWx2X2IsIDY4Njg2fSwgLy8gX19idWlsdGluX21zYV9tdWx2X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbXVsdl9kLCA2ODcwN30sIC8vIF9fYnVpbHRpbl9tc2FfbXVsdl9kCisgICAgICB7SW50cmluc2ljOjptaXBzX211bHZfaCwgNjg3Mjh9LCAvLyBfX2J1aWx0aW5fbXNhX211bHZfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19tdWx2X3csIDY4NzQ5fSwgLy8gX19idWlsdGluX21zYV9tdWx2X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbmxvY19iLCA2ODc3MH0sIC8vIF9fYnVpbHRpbl9tc2FfbmxvY19iCisgICAgICB7SW50cmluc2ljOjptaXBzX25sb2NfZCwgNjg3OTF9LCAvLyBfX2J1aWx0aW5fbXNhX25sb2NfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19ubG9jX2gsIDY4ODEyfSwgLy8gX19idWlsdGluX21zYV9ubG9jX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbmxvY193LCA2ODgzM30sIC8vIF9fYnVpbHRpbl9tc2FfbmxvY193CisgICAgICB7SW50cmluc2ljOjptaXBzX25semNfYiwgNjg4NTR9LCAvLyBfX2J1aWx0aW5fbXNhX25semNfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19ubHpjX2QsIDY4ODc1fSwgLy8gX19idWlsdGluX21zYV9ubHpjX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfbmx6Y19oLCA2ODg5Nn0sIC8vIF9fYnVpbHRpbl9tc2Ffbmx6Y19oCisgICAgICB7SW50cmluc2ljOjptaXBzX25semNfdywgNjg5MTd9LCAvLyBfX2J1aWx0aW5fbXNhX25semNfdworICAgICAge0ludHJpbnNpYzo6bWlwc19ub3JfdiwgNjg5Mzh9LCAvLyBfX2J1aWx0aW5fbXNhX25vcl92CisgICAgICB7SW50cmluc2ljOjptaXBzX25vcmlfYiwgNjg5NTh9LCAvLyBfX2J1aWx0aW5fbXNhX25vcmlfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19vcl92LCA2ODk3OX0sIC8vIF9fYnVpbHRpbl9tc2Ffb3JfdgorICAgICAge0ludHJpbnNpYzo6bWlwc19vcmlfYiwgNjg5OTh9LCAvLyBfX2J1aWx0aW5fbXNhX29yaV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX3Bja2V2X2IsIDY5MDQzfSwgLy8gX19idWlsdGluX21zYV9wY2tldl9iCisgICAgICB7SW50cmluc2ljOjptaXBzX3Bja2V2X2QsIDY5MDY1fSwgLy8gX19idWlsdGluX21zYV9wY2tldl9kCisgICAgICB7SW50cmluc2ljOjptaXBzX3Bja2V2X2gsIDY5MDg3fSwgLy8gX19idWlsdGluX21zYV9wY2tldl9oCisgICAgICB7SW50cmluc2ljOjptaXBzX3Bja2V2X3csIDY5MTA5fSwgLy8gX19idWlsdGluX21zYV9wY2tldl93CisgICAgICB7SW50cmluc2ljOjptaXBzX3Bja29kX2IsIDY5MTMxfSwgLy8gX19idWlsdGluX21zYV9wY2tvZF9iCisgICAgICB7SW50cmluc2ljOjptaXBzX3Bja29kX2QsIDY5MTUzfSwgLy8gX19idWlsdGluX21zYV9wY2tvZF9kCisgICAgICB7SW50cmluc2ljOjptaXBzX3Bja29kX2gsIDY5MTc1fSwgLy8gX19idWlsdGluX21zYV9wY2tvZF9oCisgICAgICB7SW50cmluc2ljOjptaXBzX3Bja29kX3csIDY5MTk3fSwgLy8gX19idWlsdGluX21zYV9wY2tvZF93CisgICAgICB7SW50cmluc2ljOjptaXBzX3BjbnRfYiwgNjkyMTl9LCAvLyBfX2J1aWx0aW5fbXNhX3BjbnRfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19wY250X2QsIDY5MjQwfSwgLy8gX19idWlsdGluX21zYV9wY250X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfcGNudF9oLCA2OTI2MX0sIC8vIF9fYnVpbHRpbl9tc2FfcGNudF9oCisgICAgICB7SW50cmluc2ljOjptaXBzX3BjbnRfdywgNjkyODJ9LCAvLyBfX2J1aWx0aW5fbXNhX3BjbnRfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zYXRfc19iLCA2OTk2Nn0sIC8vIF9fYnVpbHRpbl9tc2Ffc2F0X3NfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zYXRfc19kLCA2OTk4OH0sIC8vIF9fYnVpbHRpbl9tc2Ffc2F0X3NfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19zYXRfc19oLCA3MDAxMH0sIC8vIF9fYnVpbHRpbl9tc2Ffc2F0X3NfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19zYXRfc193LCA3MDAzMn0sIC8vIF9fYnVpbHRpbl9tc2Ffc2F0X3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zYXRfdV9iLCA3MDA1NH0sIC8vIF9fYnVpbHRpbl9tc2Ffc2F0X3VfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zYXRfdV9kLCA3MDA3Nn0sIC8vIF9fYnVpbHRpbl9tc2Ffc2F0X3VfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19zYXRfdV9oLCA3MDA5OH0sIC8vIF9fYnVpbHRpbl9tc2Ffc2F0X3VfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19zYXRfdV93LCA3MDEyMH0sIC8vIF9fYnVpbHRpbl9tc2Ffc2F0X3VfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zaGZfYiwgNzAxNDJ9LCAvLyBfX2J1aWx0aW5fbXNhX3NoZl9iCisgICAgICB7SW50cmluc2ljOjptaXBzX3NoZl9oLCA3MDE2Mn0sIC8vIF9fYnVpbHRpbl9tc2Ffc2hmX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2hmX3csIDcwMTgyfSwgLy8gX19idWlsdGluX21zYV9zaGZfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zbGRfYiwgNzA0ODR9LCAvLyBfX2J1aWx0aW5fbXNhX3NsZF9iCisgICAgICB7SW50cmluc2ljOjptaXBzX3NsZF9kLCA3MDUwNH0sIC8vIF9fYnVpbHRpbl9tc2Ffc2xkX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2xkX2gsIDcwNTI0fSwgLy8gX19idWlsdGluX21zYV9zbGRfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19zbGRfdywgNzA1NDR9LCAvLyBfX2J1aWx0aW5fbXNhX3NsZF93CisgICAgICB7SW50cmluc2ljOjptaXBzX3NsZGlfYiwgNzA1NjR9LCAvLyBfX2J1aWx0aW5fbXNhX3NsZGlfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zbGRpX2QsIDcwNTg1fSwgLy8gX19idWlsdGluX21zYV9zbGRpX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2xkaV9oLCA3MDYwNn0sIC8vIF9fYnVpbHRpbl9tc2Ffc2xkaV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX3NsZGlfdywgNzA2Mjd9LCAvLyBfX2J1aWx0aW5fbXNhX3NsZGlfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zbGxfYiwgNzA2NDh9LCAvLyBfX2J1aWx0aW5fbXNhX3NsbF9iCisgICAgICB7SW50cmluc2ljOjptaXBzX3NsbF9kLCA3MDY2OH0sIC8vIF9fYnVpbHRpbl9tc2Ffc2xsX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2xsX2gsIDcwNjg4fSwgLy8gX19idWlsdGluX21zYV9zbGxfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19zbGxfdywgNzA3MDh9LCAvLyBfX2J1aWx0aW5fbXNhX3NsbF93CisgICAgICB7SW50cmluc2ljOjptaXBzX3NsbGlfYiwgNzA3Mjh9LCAvLyBfX2J1aWx0aW5fbXNhX3NsbGlfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zbGxpX2QsIDcwNzQ5fSwgLy8gX19idWlsdGluX21zYV9zbGxpX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc2xsaV9oLCA3MDc3MH0sIC8vIF9fYnVpbHRpbl9tc2Ffc2xsaV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX3NsbGlfdywgNzA3OTF9LCAvLyBfX2J1aWx0aW5fbXNhX3NsbGlfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zcGxhdF9iLCA3MDgxMn0sIC8vIF9fYnVpbHRpbl9tc2Ffc3BsYXRfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zcGxhdF9kLCA3MDgzNH0sIC8vIF9fYnVpbHRpbl9tc2Ffc3BsYXRfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19zcGxhdF9oLCA3MDg1Nn0sIC8vIF9fYnVpbHRpbl9tc2Ffc3BsYXRfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19zcGxhdF93LCA3MDg3OH0sIC8vIF9fYnVpbHRpbl9tc2Ffc3BsYXRfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zcGxhdGlfYiwgNzA5MDB9LCAvLyBfX2J1aWx0aW5fbXNhX3NwbGF0aV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX3NwbGF0aV9kLCA3MDkyM30sIC8vIF9fYnVpbHRpbl9tc2Ffc3BsYXRpX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3BsYXRpX2gsIDcwOTQ2fSwgLy8gX19idWlsdGluX21zYV9zcGxhdGlfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19zcGxhdGlfdywgNzA5Njl9LCAvLyBfX2J1aWx0aW5fbXNhX3NwbGF0aV93CisgICAgICB7SW50cmluc2ljOjptaXBzX3NyYV9iLCA3MDk5Mn0sIC8vIF9fYnVpbHRpbl9tc2Ffc3JhX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3JhX2QsIDcxMDEyfSwgLy8gX19idWlsdGluX21zYV9zcmFfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19zcmFfaCwgNzEwMzJ9LCAvLyBfX2J1aWx0aW5fbXNhX3NyYV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX3NyYV93LCA3MTA1Mn0sIC8vIF9fYnVpbHRpbl9tc2Ffc3JhX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3JhaV9iLCA3MTA3Mn0sIC8vIF9fYnVpbHRpbl9tc2Ffc3JhaV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX3NyYWlfZCwgNzEwOTN9LCAvLyBfX2J1aWx0aW5fbXNhX3NyYWlfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19zcmFpX2gsIDcxMTE0fSwgLy8gX19idWlsdGluX21zYV9zcmFpX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3JhaV93LCA3MTEzNX0sIC8vIF9fYnVpbHRpbl9tc2Ffc3JhaV93CisgICAgICB7SW50cmluc2ljOjptaXBzX3NyYXJfYiwgNzExNTZ9LCAvLyBfX2J1aWx0aW5fbXNhX3NyYXJfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zcmFyX2QsIDcxMTc3fSwgLy8gX19idWlsdGluX21zYV9zcmFyX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3Jhcl9oLCA3MTE5OH0sIC8vIF9fYnVpbHRpbl9tc2Ffc3Jhcl9oCisgICAgICB7SW50cmluc2ljOjptaXBzX3NyYXJfdywgNzEyMTl9LCAvLyBfX2J1aWx0aW5fbXNhX3NyYXJfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zcmFyaV9iLCA3MTI0MH0sIC8vIF9fYnVpbHRpbl9tc2Ffc3JhcmlfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zcmFyaV9kLCA3MTI2Mn0sIC8vIF9fYnVpbHRpbl9tc2Ffc3JhcmlfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19zcmFyaV9oLCA3MTI4NH0sIC8vIF9fYnVpbHRpbl9tc2Ffc3JhcmlfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19zcmFyaV93LCA3MTMwNn0sIC8vIF9fYnVpbHRpbl9tc2Ffc3JhcmlfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zcmxfYiwgNzEzMjh9LCAvLyBfX2J1aWx0aW5fbXNhX3NybF9iCisgICAgICB7SW50cmluc2ljOjptaXBzX3NybF9kLCA3MTM0OH0sIC8vIF9fYnVpbHRpbl9tc2Ffc3JsX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3JsX2gsIDcxMzY4fSwgLy8gX19idWlsdGluX21zYV9zcmxfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19zcmxfdywgNzEzODh9LCAvLyBfX2J1aWx0aW5fbXNhX3NybF93CisgICAgICB7SW50cmluc2ljOjptaXBzX3NybGlfYiwgNzE0MDh9LCAvLyBfX2J1aWx0aW5fbXNhX3NybGlfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zcmxpX2QsIDcxNDI5fSwgLy8gX19idWlsdGluX21zYV9zcmxpX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3JsaV9oLCA3MTQ1MH0sIC8vIF9fYnVpbHRpbl9tc2Ffc3JsaV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX3NybGlfdywgNzE0NzF9LCAvLyBfX2J1aWx0aW5fbXNhX3NybGlfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zcmxyX2IsIDcxNDkyfSwgLy8gX19idWlsdGluX21zYV9zcmxyX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3Jscl9kLCA3MTUxM30sIC8vIF9fYnVpbHRpbl9tc2Ffc3Jscl9kCisgICAgICB7SW50cmluc2ljOjptaXBzX3NybHJfaCwgNzE1MzR9LCAvLyBfX2J1aWx0aW5fbXNhX3NybHJfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19zcmxyX3csIDcxNTU1fSwgLy8gX19idWlsdGluX21zYV9zcmxyX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3JscmlfYiwgNzE1NzZ9LCAvLyBfX2J1aWx0aW5fbXNhX3NybHJpX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3JscmlfZCwgNzE1OTh9LCAvLyBfX2J1aWx0aW5fbXNhX3NybHJpX2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3JscmlfaCwgNzE2MjB9LCAvLyBfX2J1aWx0aW5fbXNhX3NybHJpX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3JscmlfdywgNzE2NDJ9LCAvLyBfX2J1aWx0aW5fbXNhX3NybHJpX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3RfYiwgNzE2NjR9LCAvLyBfX2J1aWx0aW5fbXNhX3N0X2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3RfZCwgNzE2ODN9LCAvLyBfX2J1aWx0aW5fbXNhX3N0X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3RfaCwgNzE3MDJ9LCAvLyBfX2J1aWx0aW5fbXNhX3N0X2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3RfdywgNzE3MjF9LCAvLyBfX2J1aWx0aW5fbXNhX3N0X3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3Vic19zX2IsIDcxOTEwfSwgLy8gX19idWlsdGluX21zYV9zdWJzX3NfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJzX3NfZCwgNzE5MzN9LCAvLyBfX2J1aWx0aW5fbXNhX3N1YnNfc19kCisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnNfc19oLCA3MTk1Nn0sIC8vIF9fYnVpbHRpbl9tc2Ffc3Vic19zX2gKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3Vic19zX3csIDcxOTc5fSwgLy8gX19idWlsdGluX21zYV9zdWJzX3NfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJzX3VfYiwgNzIwMDJ9LCAvLyBfX2J1aWx0aW5fbXNhX3N1YnNfdV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnNfdV9kLCA3MjAyNX0sIC8vIF9fYnVpbHRpbl9tc2Ffc3Vic191X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3Vic191X2gsIDcyMDQ4fSwgLy8gX19idWlsdGluX21zYV9zdWJzX3VfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJzX3VfdywgNzIwNzF9LCAvLyBfX2J1aWx0aW5fbXNhX3N1YnNfdV93CisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnN1c191X2IsIDcyMDk0fSwgLy8gX19idWlsdGluX21zYV9zdWJzdXNfdV9iCisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnN1c191X2QsIDcyMTE5fSwgLy8gX19idWlsdGluX21zYV9zdWJzdXNfdV9kCisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnN1c191X2gsIDcyMTQ0fSwgLy8gX19idWlsdGluX21zYV9zdWJzdXNfdV9oCisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnN1c191X3csIDcyMTY5fSwgLy8gX19idWlsdGluX21zYV9zdWJzdXNfdV93CisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnN1dV9zX2IsIDcyMTk0fSwgLy8gX19idWlsdGluX21zYV9zdWJzdXVfc19iCisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnN1dV9zX2QsIDcyMjE5fSwgLy8gX19idWlsdGluX21zYV9zdWJzdXVfc19kCisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnN1dV9zX2gsIDcyMjQ0fSwgLy8gX19idWlsdGluX21zYV9zdWJzdXVfc19oCisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnN1dV9zX3csIDcyMjY5fSwgLy8gX19idWlsdGluX21zYV9zdWJzdXVfc193CisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnZfYiwgNzI0NDB9LCAvLyBfX2J1aWx0aW5fbXNhX3N1YnZfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJ2X2QsIDcyNDYxfSwgLy8gX19idWlsdGluX21zYV9zdWJ2X2QKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfc3Vidl9oLCA3MjQ4Mn0sIC8vIF9fYnVpbHRpbl9tc2Ffc3Vidl9oCisgICAgICB7SW50cmluc2ljOjptaXBzX3N1YnZfdywgNzI1MDN9LCAvLyBfX2J1aWx0aW5fbXNhX3N1YnZfdworICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJ2aV9iLCA3MjUyNH0sIC8vIF9fYnVpbHRpbl9tc2Ffc3VidmlfYgorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJ2aV9kLCA3MjU0Nn0sIC8vIF9fYnVpbHRpbl9tc2Ffc3VidmlfZAorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJ2aV9oLCA3MjU2OH0sIC8vIF9fYnVpbHRpbl9tc2Ffc3VidmlfaAorICAgICAge0ludHJpbnNpYzo6bWlwc19zdWJ2aV93LCA3MjU5MH0sIC8vIF9fYnVpbHRpbl9tc2Ffc3VidmlfdworICAgICAge0ludHJpbnNpYzo6bWlwc192c2hmX2IsIDcyNjEyfSwgLy8gX19idWlsdGluX21zYV92c2hmX2IKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfdnNoZl9kLCA3MjYzM30sIC8vIF9fYnVpbHRpbl9tc2FfdnNoZl9kCisgICAgICB7SW50cmluc2ljOjptaXBzX3ZzaGZfaCwgNzI2NTR9LCAvLyBfX2J1aWx0aW5fbXNhX3ZzaGZfaAorICAgICAge0ludHJpbnNpYzo6bWlwc192c2hmX3csIDcyNjc1fSwgLy8gX19idWlsdGluX21zYV92c2hmX3cKKyAgICAgIHtJbnRyaW5zaWM6Om1pcHNfeG9yX3YsIDcyNzE3fSwgLy8gX19idWlsdGluX21zYV94b3JfdgorICAgICAge0ludHJpbnNpYzo6bWlwc194b3JpX2IsIDcyNzM3fSwgLy8gX19idWlsdGluX21zYV94b3JpX2IKKyAgICB9OworICAgIGF1dG8gSSA9IHN0ZDo6bG93ZXJfYm91bmQoc3RkOjpiZWdpbihtaXBzTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjplbmQobWlwc05hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0aW5OYW1lU3RyKTsKKyAgICBpZiAoSSAhPSBzdGQ6OmVuZChtaXBzTmFtZXMpICYmCisgICAgICAgIEktPmdldE5hbWUoKSA9PSBCdWlsdGluTmFtZVN0cikKKyAgICAgIHJldHVybiBJLT5JbnRyaW5JRDsKKyAgfQorICBpZiAoVGFyZ2V0UHJlZml4ID09ICJudnZtIikgeworICAgIHN0YXRpYyBjb25zdCBCdWlsdGluRW50cnkgbnZ2bU5hbWVzW10gPSB7CisgICAgICB7SW50cmluc2ljOjpudnZtX2FkZF9ybV9kLCA3Mjc1OH0sIC8vIF9fbnZ2bV9hZGRfcm1fZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9hZGRfcm1fZiwgNzI3NzR9LCAvLyBfX252dm1fYWRkX3JtX2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fYWRkX3JtX2Z0el9mLCA3Mjc5MH0sIC8vIF9fbnZ2bV9hZGRfcm1fZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fYWRkX3JuX2QsIDcyODEwfSwgLy8gX19udnZtX2FkZF9ybl9kCisgICAgICB7SW50cmluc2ljOjpudnZtX2FkZF9ybl9mLCA3MjgyNn0sIC8vIF9fbnZ2bV9hZGRfcm5fZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9hZGRfcm5fZnR6X2YsIDcyODQyfSwgLy8gX19udnZtX2FkZF9ybl9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9hZGRfcnBfZCwgNzI4NjJ9LCAvLyBfX252dm1fYWRkX3JwX2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fYWRkX3JwX2YsIDcyODc4fSwgLy8gX19udnZtX2FkZF9ycF9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2FkZF9ycF9mdHpfZiwgNzI4OTR9LCAvLyBfX252dm1fYWRkX3JwX2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2FkZF9yel9kLCA3MjkxNH0sIC8vIF9fbnZ2bV9hZGRfcnpfZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9hZGRfcnpfZiwgNzI5MzB9LCAvLyBfX252dm1fYWRkX3J6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fYWRkX3J6X2Z0el9mLCA3Mjk0Nn0sIC8vIF9fbnZ2bV9hZGRfcnpfZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fYmFycmllciwgNzMwMDN9LCAvLyBfX252dm1fYmFyCisgICAgICB7SW50cmluc2ljOjpudnZtX2JhcnJpZXIwX2FuZCwgNzMwODV9LCAvLyBfX252dm1fYmFyMF9hbmQKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fYmFycmllcjBfb3IsIDczMTAxfSwgLy8gX19udnZtX2JhcjBfb3IKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fYmFycmllcjBfcG9wYywgNzMxMTZ9LCAvLyBfX252dm1fYmFyMF9wb3BjCisgICAgICB7SW50cmluc2ljOjpudnZtX2JhcnJpZXJfbiwgNzMwMTR9LCAvLyBfX252dm1fYmFyX24KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fYmFyX3N5bmMsIDcyOTY2fSwgLy8gX19udnZtX2Jhcl9zeW5jCisgICAgICB7SW50cmluc2ljOjpudnZtX2Jhcl93YXJwX3N5bmMsIDcyOTgyfSwgLy8gX19udnZtX2Jhcl93YXJwX3N5bmMKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fYmFycmllcl9zeW5jLCA3MzAyN30sIC8vIF9fbnZ2bV9iYXJyaWVyX3N5bmMKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fYmFycmllcl9zeW5jX2NudCwgNzMwNDd9LCAvLyBfX252dm1fYmFycmllcl9zeW5jX2NudAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9iaXRjYXN0X2QybGwsIDczMTMzfSwgLy8gX19udnZtX2JpdGNhc3RfZDJsbAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9iaXRjYXN0X2YyaSwgNzMxNTN9LCAvLyBfX252dm1fYml0Y2FzdF9mMmkKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fYml0Y2FzdF9pMmYsIDczMTcyfSwgLy8gX19udnZtX2JpdGNhc3RfaTJmCisgICAgICB7SW50cmluc2ljOjpudnZtX2JpdGNhc3RfbGwyZCwgNzMxOTF9LCAvLyBfX252dm1fYml0Y2FzdF9sbDJkCisgICAgICB7SW50cmluc2ljOjpudnZtX2NlaWxfZCwgNzMyMTF9LCAvLyBfX252dm1fY2VpbF9kCisgICAgICB7SW50cmluc2ljOjpudnZtX2NlaWxfZiwgNzMyMjV9LCAvLyBfX252dm1fY2VpbF9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2NlaWxfZnR6X2YsIDczMjM5fSwgLy8gX19udnZtX2NlaWxfZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fY29zX2FwcHJveF9mLCA3MzI1N30sIC8vIF9fbnZ2bV9jb3NfYXBwcm94X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fY29zX2FwcHJveF9mdHpfZiwgNzMyNzd9LCAvLyBfX252dm1fY29zX2FwcHJveF9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kMmZfcm0sIDczMzAxfSwgLy8gX19udnZtX2QyZl9ybQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kMmZfcm1fZnR6LCA3MzMxNX0sIC8vIF9fbnZ2bV9kMmZfcm1fZnR6CisgICAgICB7SW50cmluc2ljOjpudnZtX2QyZl9ybiwgNzMzMzN9LCAvLyBfX252dm1fZDJmX3JuCisgICAgICB7SW50cmluc2ljOjpudnZtX2QyZl9ybl9mdHosIDczMzQ3fSwgLy8gX19udnZtX2QyZl9ybl9mdHoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZDJmX3JwLCA3MzM2NX0sIC8vIF9fbnZ2bV9kMmZfcnAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZDJmX3JwX2Z0eiwgNzMzNzl9LCAvLyBfX252dm1fZDJmX3JwX2Z0egorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kMmZfcnosIDczMzk3fSwgLy8gX19udnZtX2QyZl9yegorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kMmZfcnpfZnR6LCA3MzQxMX0sIC8vIF9fbnZ2bV9kMmZfcnpfZnR6CisgICAgICB7SW50cmluc2ljOjpudnZtX2QyaV9oaSwgNzM0Mjl9LCAvLyBfX252dm1fZDJpX2hpCisgICAgICB7SW50cmluc2ljOjpudnZtX2QyaV9sbywgNzM0NDN9LCAvLyBfX252dm1fZDJpX2xvCisgICAgICB7SW50cmluc2ljOjpudnZtX2QyaV9ybSwgNzM0NTd9LCAvLyBfX252dm1fZDJpX3JtCisgICAgICB7SW50cmluc2ljOjpudnZtX2QyaV9ybiwgNzM0NzF9LCAvLyBfX252dm1fZDJpX3JuCisgICAgICB7SW50cmluc2ljOjpudnZtX2QyaV9ycCwgNzM0ODV9LCAvLyBfX252dm1fZDJpX3JwCisgICAgICB7SW50cmluc2ljOjpudnZtX2QyaV9yeiwgNzM0OTl9LCAvLyBfX252dm1fZDJpX3J6CisgICAgICB7SW50cmluc2ljOjpudnZtX2QybGxfcm0sIDczNTEzfSwgLy8gX19udnZtX2QybGxfcm0KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZDJsbF9ybiwgNzM1Mjh9LCAvLyBfX252dm1fZDJsbF9ybgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kMmxsX3JwLCA3MzU0M30sIC8vIF9fbnZ2bV9kMmxsX3JwCisgICAgICB7SW50cmluc2ljOjpudnZtX2QybGxfcnosIDczNTU4fSwgLy8gX19udnZtX2QybGxfcnoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZDJ1aV9ybSwgNzM1NzN9LCAvLyBfX252dm1fZDJ1aV9ybQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kMnVpX3JuLCA3MzU4OH0sIC8vIF9fbnZ2bV9kMnVpX3JuCisgICAgICB7SW50cmluc2ljOjpudnZtX2QydWlfcnAsIDczNjAzfSwgLy8gX19udnZtX2QydWlfcnAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZDJ1aV9yeiwgNzM2MTh9LCAvLyBfX252dm1fZDJ1aV9yegorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kMnVsbF9ybSwgNzM2MzN9LCAvLyBfX252dm1fZDJ1bGxfcm0KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZDJ1bGxfcm4sIDczNjQ5fSwgLy8gX19udnZtX2QydWxsX3JuCisgICAgICB7SW50cmluc2ljOjpudnZtX2QydWxsX3JwLCA3MzY2NX0sIC8vIF9fbnZ2bV9kMnVsbF9ycAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kMnVsbF9yeiwgNzM2ODF9LCAvLyBfX252dm1fZDJ1bGxfcnoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZGl2X2FwcHJveF9mLCA3MzY5N30sIC8vIF9fbnZ2bV9kaXZfYXBwcm94X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZGl2X2FwcHJveF9mdHpfZiwgNzM3MTd9LCAvLyBfX252dm1fZGl2X2FwcHJveF9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kaXZfcm1fZCwgNzM3NDF9LCAvLyBfX252dm1fZGl2X3JtX2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZGl2X3JtX2YsIDczNzU3fSwgLy8gX19udnZtX2Rpdl9ybV9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2Rpdl9ybV9mdHpfZiwgNzM3NzN9LCAvLyBfX252dm1fZGl2X3JtX2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2Rpdl9ybl9kLCA3Mzc5M30sIC8vIF9fbnZ2bV9kaXZfcm5fZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kaXZfcm5fZiwgNzM4MDl9LCAvLyBfX252dm1fZGl2X3JuX2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZGl2X3JuX2Z0el9mLCA3MzgyNX0sIC8vIF9fbnZ2bV9kaXZfcm5fZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZGl2X3JwX2QsIDczODQ1fSwgLy8gX19udnZtX2Rpdl9ycF9kCisgICAgICB7SW50cmluc2ljOjpudnZtX2Rpdl9ycF9mLCA3Mzg2MX0sIC8vIF9fbnZ2bV9kaXZfcnBfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kaXZfcnBfZnR6X2YsIDczODc3fSwgLy8gX19udnZtX2Rpdl9ycF9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9kaXZfcnpfZCwgNzM4OTd9LCAvLyBfX252dm1fZGl2X3J6X2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZGl2X3J6X2YsIDczOTEzfSwgLy8gX19udnZtX2Rpdl9yel9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2Rpdl9yel9mdHpfZiwgNzM5Mjl9LCAvLyBfX252dm1fZGl2X3J6X2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2V4Ml9hcHByb3hfZCwgNzM5NDl9LCAvLyBfX252dm1fZXgyX2FwcHJveF9kCisgICAgICB7SW50cmluc2ljOjpudnZtX2V4Ml9hcHByb3hfZiwgNzM5Njl9LCAvLyBfX252dm1fZXgyX2FwcHJveF9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2V4Ml9hcHByb3hfZnR6X2YsIDczOTg5fSwgLy8gX19udnZtX2V4Ml9hcHByb3hfZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJoX3JuLCA3NDAxM30sIC8vIF9fbnZ2bV9mMmhfcm4KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJoX3JuX2Z0eiwgNzQwMjd9LCAvLyBfX252dm1fZjJoX3JuX2Z0egorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mMmlfcm0sIDc0MDQ1fSwgLy8gX19udnZtX2YyaV9ybQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mMmlfcm1fZnR6LCA3NDA1OX0sIC8vIF9fbnZ2bV9mMmlfcm1fZnR6CisgICAgICB7SW50cmluc2ljOjpudnZtX2YyaV9ybiwgNzQwNzd9LCAvLyBfX252dm1fZjJpX3JuCisgICAgICB7SW50cmluc2ljOjpudnZtX2YyaV9ybl9mdHosIDc0MDkxfSwgLy8gX19udnZtX2YyaV9ybl9mdHoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJpX3JwLCA3NDEwOX0sIC8vIF9fbnZ2bV9mMmlfcnAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJpX3JwX2Z0eiwgNzQxMjN9LCAvLyBfX252dm1fZjJpX3JwX2Z0egorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mMmlfcnosIDc0MTQxfSwgLy8gX19udnZtX2YyaV9yegorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mMmlfcnpfZnR6LCA3NDE1NX0sIC8vIF9fbnZ2bV9mMmlfcnpfZnR6CisgICAgICB7SW50cmluc2ljOjpudnZtX2YybGxfcm0sIDc0MTczfSwgLy8gX19udnZtX2YybGxfcm0KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJsbF9ybV9mdHosIDc0MTg4fSwgLy8gX19udnZtX2YybGxfcm1fZnR6CisgICAgICB7SW50cmluc2ljOjpudnZtX2YybGxfcm4sIDc0MjA3fSwgLy8gX19udnZtX2YybGxfcm4KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJsbF9ybl9mdHosIDc0MjIyfSwgLy8gX19udnZtX2YybGxfcm5fZnR6CisgICAgICB7SW50cmluc2ljOjpudnZtX2YybGxfcnAsIDc0MjQxfSwgLy8gX19udnZtX2YybGxfcnAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJsbF9ycF9mdHosIDc0MjU2fSwgLy8gX19udnZtX2YybGxfcnBfZnR6CisgICAgICB7SW50cmluc2ljOjpudnZtX2YybGxfcnosIDc0Mjc1fSwgLy8gX19udnZtX2YybGxfcnoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJsbF9yel9mdHosIDc0MjkwfSwgLy8gX19udnZtX2YybGxfcnpfZnR6CisgICAgICB7SW50cmluc2ljOjpudnZtX2YydWlfcm0sIDc0MzA5fSwgLy8gX19udnZtX2YydWlfcm0KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJ1aV9ybV9mdHosIDc0MzI0fSwgLy8gX19udnZtX2YydWlfcm1fZnR6CisgICAgICB7SW50cmluc2ljOjpudnZtX2YydWlfcm4sIDc0MzQzfSwgLy8gX19udnZtX2YydWlfcm4KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJ1aV9ybl9mdHosIDc0MzU4fSwgLy8gX19udnZtX2YydWlfcm5fZnR6CisgICAgICB7SW50cmluc2ljOjpudnZtX2YydWlfcnAsIDc0Mzc3fSwgLy8gX19udnZtX2YydWlfcnAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJ1aV9ycF9mdHosIDc0MzkyfSwgLy8gX19udnZtX2YydWlfcnBfZnR6CisgICAgICB7SW50cmluc2ljOjpudnZtX2YydWlfcnosIDc0NDExfSwgLy8gX19udnZtX2YydWlfcnoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJ1aV9yel9mdHosIDc0NDI2fSwgLy8gX19udnZtX2YydWlfcnpfZnR6CisgICAgICB7SW50cmluc2ljOjpudnZtX2YydWxsX3JtLCA3NDQ0NX0sIC8vIF9fbnZ2bV9mMnVsbF9ybQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mMnVsbF9ybV9mdHosIDc0NDYxfSwgLy8gX19udnZtX2YydWxsX3JtX2Z0egorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mMnVsbF9ybiwgNzQ0ODF9LCAvLyBfX252dm1fZjJ1bGxfcm4KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJ1bGxfcm5fZnR6LCA3NDQ5N30sIC8vIF9fbnZ2bV9mMnVsbF9ybl9mdHoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZjJ1bGxfcnAsIDc0NTE3fSwgLy8gX19udnZtX2YydWxsX3JwCisgICAgICB7SW50cmluc2ljOjpudnZtX2YydWxsX3JwX2Z0eiwgNzQ1MzN9LCAvLyBfX252dm1fZjJ1bGxfcnBfZnR6CisgICAgICB7SW50cmluc2ljOjpudnZtX2YydWxsX3J6LCA3NDU1M30sIC8vIF9fbnZ2bV9mMnVsbF9yegorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mMnVsbF9yel9mdHosIDc0NTY5fSwgLy8gX19udnZtX2YydWxsX3J6X2Z0egorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mYWJzX2QsIDc0NTg5fSwgLy8gX19udnZtX2ZhYnNfZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mYWJzX2YsIDc0NjAzfSwgLy8gX19udnZtX2ZhYnNfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mYWJzX2Z0el9mLCA3NDYxN30sIC8vIF9fbnZ2bV9mYWJzX2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2Zsb29yX2QsIDc0NjM1fSwgLy8gX19udnZtX2Zsb29yX2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZmxvb3JfZiwgNzQ2NTB9LCAvLyBfX252dm1fZmxvb3JfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mbG9vcl9mdHpfZiwgNzQ2NjV9LCAvLyBfX252dm1fZmxvb3JfZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZm1hX3JtX2QsIDc0Njg0fSwgLy8gX19udnZtX2ZtYV9ybV9kCisgICAgICB7SW50cmluc2ljOjpudnZtX2ZtYV9ybV9mLCA3NDcwMH0sIC8vIF9fbnZ2bV9mbWFfcm1fZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mbWFfcm1fZnR6X2YsIDc0NzE2fSwgLy8gX19udnZtX2ZtYV9ybV9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mbWFfcm5fZCwgNzQ3MzZ9LCAvLyBfX252dm1fZm1hX3JuX2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZm1hX3JuX2YsIDc0NzUyfSwgLy8gX19udnZtX2ZtYV9ybl9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2ZtYV9ybl9mdHpfZiwgNzQ3Njh9LCAvLyBfX252dm1fZm1hX3JuX2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2ZtYV9ycF9kLCA3NDc4OH0sIC8vIF9fbnZ2bV9mbWFfcnBfZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mbWFfcnBfZiwgNzQ4MDR9LCAvLyBfX252dm1fZm1hX3JwX2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZm1hX3JwX2Z0el9mLCA3NDgyMH0sIC8vIF9fbnZ2bV9mbWFfcnBfZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZm1hX3J6X2QsIDc0ODQwfSwgLy8gX19udnZtX2ZtYV9yel9kCisgICAgICB7SW50cmluc2ljOjpudnZtX2ZtYV9yel9mLCA3NDg1Nn0sIC8vIF9fbnZ2bV9mbWFfcnpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mbWFfcnpfZnR6X2YsIDc0ODcyfSwgLy8gX19udnZtX2ZtYV9yel9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mbWF4X2QsIDc0ODkyfSwgLy8gX19udnZtX2ZtYXhfZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mbWF4X2YsIDc0OTA2fSwgLy8gX19udnZtX2ZtYXhfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9mbWF4X2Z0el9mLCA3NDkyMH0sIC8vIF9fbnZ2bV9mbWF4X2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2ZtaW5fZCwgNzQ5Mzh9LCAvLyBfX252dm1fZm1pbl9kCisgICAgICB7SW50cmluc2ljOjpudnZtX2ZtaW5fZiwgNzQ5NTJ9LCAvLyBfX252dm1fZm1pbl9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2ZtaW5fZnR6X2YsIDc0OTY2fSwgLy8gX19udnZtX2ZtaW5fZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fZm5zLCA3NDk4NH0sIC8vIF9fbnZ2bV9mbnMKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1faTJkX3JtLCA3NDk5NX0sIC8vIF9fbnZ2bV9pMmRfcm0KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1faTJkX3JuLCA3NTAwOX0sIC8vIF9fbnZ2bV9pMmRfcm4KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1faTJkX3JwLCA3NTAyM30sIC8vIF9fbnZ2bV9pMmRfcnAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1faTJkX3J6LCA3NTAzN30sIC8vIF9fbnZ2bV9pMmRfcnoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1faTJmX3JtLCA3NTA1MX0sIC8vIF9fbnZ2bV9pMmZfcm0KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1faTJmX3JuLCA3NTA2NX0sIC8vIF9fbnZ2bV9pMmZfcm4KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1faTJmX3JwLCA3NTA3OX0sIC8vIF9fbnZ2bV9pMmZfcnAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1faTJmX3J6LCA3NTA5M30sIC8vIF9fbnZ2bV9pMmZfcnoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1faXNzcGFjZXBfY29uc3QsIDc1MTA3fSwgLy8gX19udnZtX2lzc3BhY2VwX2NvbnN0CisgICAgICB7SW50cmluc2ljOjpudnZtX2lzc3BhY2VwX2dsb2JhbCwgNzUxMjl9LCAvLyBfX252dm1faXNzcGFjZXBfZ2xvYmFsCisgICAgICB7SW50cmluc2ljOjpudnZtX2lzc3BhY2VwX2xvY2FsLCA3NTE1Mn0sIC8vIF9fbnZ2bV9pc3NwYWNlcF9sb2NhbAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9pc3NwYWNlcF9zaGFyZWQsIDc1MTc0fSwgLy8gX19udnZtX2lzc3BhY2VwX3NoYXJlZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9pc3R5cGVwX3NhbXBsZXIsIDc1MTk3fSwgLy8gX19udnZtX2lzdHlwZXBfc2FtcGxlcgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9pc3R5cGVwX3N1cmZhY2UsIDc1MjIwfSwgLy8gX19udnZtX2lzdHlwZXBfc3VyZmFjZQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9pc3R5cGVwX3RleHR1cmUsIDc1MjQzfSwgLy8gX19udnZtX2lzdHlwZXBfdGV4dHVyZQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9sZzJfYXBwcm94X2QsIDc1MjY2fSwgLy8gX19udnZtX2xnMl9hcHByb3hfZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9sZzJfYXBwcm94X2YsIDc1Mjg2fSwgLy8gX19udnZtX2xnMl9hcHByb3hfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9sZzJfYXBwcm94X2Z0el9mLCA3NTMwNn0sIC8vIF9fbnZ2bV9sZzJfYXBwcm94X2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX2xsMmRfcm0sIDc1MzMwfSwgLy8gX19udnZtX2xsMmRfcm0KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbGwyZF9ybiwgNzUzNDV9LCAvLyBfX252dm1fbGwyZF9ybgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9sbDJkX3JwLCA3NTM2MH0sIC8vIF9fbnZ2bV9sbDJkX3JwCisgICAgICB7SW50cmluc2ljOjpudnZtX2xsMmRfcnosIDc1Mzc1fSwgLy8gX19udnZtX2xsMmRfcnoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbGwyZl9ybSwgNzUzOTB9LCAvLyBfX252dm1fbGwyZl9ybQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9sbDJmX3JuLCA3NTQwNX0sIC8vIF9fbnZ2bV9sbDJmX3JuCisgICAgICB7SW50cmluc2ljOjpudnZtX2xsMmZfcnAsIDc1NDIwfSwgLy8gX19udnZtX2xsMmZfcnAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbGwyZl9yeiwgNzU0MzV9LCAvLyBfX252dm1fbGwyZl9yegorICAgICAge0ludHJpbnNpYzo6bnZ2bV9sb2hpX2kyZCwgNzU0NTB9LCAvLyBfX252dm1fbG9oaV9pMmQKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbWF0Y2hfYW55X3N5bmNfaTMyLCA3NTQ2Nn0sIC8vIF9fbnZ2bV9tYXRjaF9hbnlfc3luY19pMzIKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbWF0Y2hfYW55X3N5bmNfaTY0LCA3NTQ5Mn0sIC8vIF9fbnZ2bV9tYXRjaF9hbnlfc3luY19pNjQKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbWVtYmFyX2N0YSwgNzU1MTh9LCAvLyBfX252dm1fbWVtYmFyX2N0YQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9tZW1iYXJfZ2wsIDc1NTM2fSwgLy8gX19udnZtX21lbWJhcl9nbAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9tZW1iYXJfc3lzLCA3NTU1M30sIC8vIF9fbnZ2bV9tZW1iYXJfc3lzCisgICAgICB7SW50cmluc2ljOjpudnZtX211bDI0X2ksIDc1Nzc5fSwgLy8gX19udnZtX211bDI0X2kKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbXVsMjRfdWksIDc1Nzk0fSwgLy8gX19udnZtX211bDI0X3VpCisgICAgICB7SW50cmluc2ljOjpudnZtX211bF9ybV9kLCA3NTU3MX0sIC8vIF9fbnZ2bV9tdWxfcm1fZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9tdWxfcm1fZiwgNzU1ODd9LCAvLyBfX252dm1fbXVsX3JtX2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbXVsX3JtX2Z0el9mLCA3NTYwM30sIC8vIF9fbnZ2bV9tdWxfcm1fZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbXVsX3JuX2QsIDc1NjIzfSwgLy8gX19udnZtX211bF9ybl9kCisgICAgICB7SW50cmluc2ljOjpudnZtX211bF9ybl9mLCA3NTYzOX0sIC8vIF9fbnZ2bV9tdWxfcm5fZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9tdWxfcm5fZnR6X2YsIDc1NjU1fSwgLy8gX19udnZtX211bF9ybl9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9tdWxfcnBfZCwgNzU2NzV9LCAvLyBfX252dm1fbXVsX3JwX2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbXVsX3JwX2YsIDc1NjkxfSwgLy8gX19udnZtX211bF9ycF9mCisgICAgICB7SW50cmluc2ljOjpudnZtX211bF9ycF9mdHpfZiwgNzU3MDd9LCAvLyBfX252dm1fbXVsX3JwX2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX211bF9yel9kLCA3NTcyN30sIC8vIF9fbnZ2bV9tdWxfcnpfZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9tdWxfcnpfZiwgNzU3NDN9LCAvLyBfX252dm1fbXVsX3J6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbXVsX3J6X2Z0el9mLCA3NTc1OX0sIC8vIF9fbnZ2bV9tdWxfcnpfZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbXVsaGlfaSwgNzU4MTB9LCAvLyBfX252dm1fbXVsaGlfaQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9tdWxoaV9sbCwgNzU4MjV9LCAvLyBfX252dm1fbXVsaGlfbGwKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fbXVsaGlfdWksIDc1ODQxfSwgLy8gX19udnZtX211bGhpX3VpCisgICAgICB7SW50cmluc2ljOjpudnZtX211bGhpX3VsbCwgNzU4NTd9LCAvLyBfX252dm1fbXVsaGlfdWxsCisgICAgICB7SW50cmluc2ljOjpudnZtX3BybXQsIDc1ODc0fSwgLy8gX19udnZtX3BybXQKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmNwX2FwcHJveF9mdHpfZCwgNzU4ODZ9LCAvLyBfX252dm1fcmNwX2FwcHJveF9mdHpfZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yY3Bfcm1fZCwgNzU5MTB9LCAvLyBfX252dm1fcmNwX3JtX2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmNwX3JtX2YsIDc1OTI2fSwgLy8gX19udnZtX3JjcF9ybV9mCisgICAgICB7SW50cmluc2ljOjpudnZtX3JjcF9ybV9mdHpfZiwgNzU5NDJ9LCAvLyBfX252dm1fcmNwX3JtX2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX3JjcF9ybl9kLCA3NTk2Mn0sIC8vIF9fbnZ2bV9yY3Bfcm5fZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yY3Bfcm5fZiwgNzU5Nzh9LCAvLyBfX252dm1fcmNwX3JuX2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmNwX3JuX2Z0el9mLCA3NTk5NH0sIC8vIF9fbnZ2bV9yY3Bfcm5fZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmNwX3JwX2QsIDc2MDE0fSwgLy8gX19udnZtX3JjcF9ycF9kCisgICAgICB7SW50cmluc2ljOjpudnZtX3JjcF9ycF9mLCA3NjAzMH0sIC8vIF9fbnZ2bV9yY3BfcnBfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yY3BfcnBfZnR6X2YsIDc2MDQ2fSwgLy8gX19udnZtX3JjcF9ycF9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yY3BfcnpfZCwgNzYwNjZ9LCAvLyBfX252dm1fcmNwX3J6X2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmNwX3J6X2YsIDc2MDgyfSwgLy8gX19udnZtX3JjcF9yel9mCisgICAgICB7SW50cmluc2ljOjpudnZtX3JjcF9yel9mdHpfZiwgNzYwOTh9LCAvLyBfX252dm1fcmNwX3J6X2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfY2xvY2ssIDc2MTE4fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfY2xvY2sKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19jbG9jazY0LCA3NjE0NX0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2Nsb2NrNjQKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19jdGFpZF93LCA3NjE3NH0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2N0YWlkX3cKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19jdGFpZF94LCA3NjIwM30sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2N0YWlkX3gKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19jdGFpZF95LCA3NjIzMn0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2N0YWlkX3kKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19jdGFpZF96LCA3NjI2MX0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2N0YWlkX3oKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcwLCA3NjI5MH0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxLCA3NjMxOX0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzEKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxMCwgNzYzNDh9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxMAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzExLCA3NjM3OH0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzExCisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTIsIDc2NDA4fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTIKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxMywgNzY0Mzh9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxMworICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzE0LCA3NjQ2OH0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzE0CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTUsIDc2NDk4fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTUKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxNiwgNzY1Mjh9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxNgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzE3LCA3NjU1OH0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzE3CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTgsIDc2NTg4fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMTgKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxOSwgNzY2MTh9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxOQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzIsIDc2NjQ4fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzIwLCA3NjY3N30sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzIwCisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjEsIDc2NzA3fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjEKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyMiwgNzY3Mzd9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyMgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzIzLCA3Njc2N30sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzIzCisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjQsIDc2Nzk3fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjQKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyNSwgNzY4Mjd9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyNQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzI2LCA3Njg1N30sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzI2CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjcsIDc2ODg3fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMjcKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyOCwgNzY5MTd9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyOAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzI5LCA3Njk0N30sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzI5CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMywgNzY5Nzd9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWczCisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMzAsIDc3MDA2fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnMzAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWczMSwgNzcwMzZ9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWczMQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzQsIDc3MDY2fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnNAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzUsIDc3MDk1fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnNQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzYsIDc3MTI0fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnNgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzcsIDc3MTUzfSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnNworICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzgsIDc3MTgyfSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnOAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzksIDc3MjExfSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfZW52cmVnOQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2dyaWRpZCwgNzcyNDB9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19ncmlkaWQKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19sYW5laWQsIDc3MjY4fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfbGFuZWlkCisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfbGFuZW1hc2tfZXEsIDc3Mjk2fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfbGFuZW1hc2tfZXEKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19sYW5lbWFza19nZSwgNzczMjl9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19sYW5lbWFza19nZQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX2xhbmVtYXNrX2d0LCA3NzM2Mn0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX2xhbmVtYXNrX2d0CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfbGFuZW1hc2tfbGUsIDc3Mzk1fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfbGFuZW1hc2tfbGUKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19sYW5lbWFza19sdCwgNzc0Mjh9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19sYW5lbWFza19sdAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX25jdGFpZF93LCA3NzQ2MX0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX25jdGFpZF93CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfbmN0YWlkX3gsIDc3NDkxfSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfbmN0YWlkX3gKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19uY3RhaWRfeSwgNzc1MjF9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19uY3RhaWRfeQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX25jdGFpZF96LCA3NzU1MX0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX25jdGFpZF96CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfbnNtaWQsIDc3NTgxfSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfbnNtaWQKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19udGlkX3csIDc3NjA4fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfbnRpZF93CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfbnRpZF94LCA3NzYzNn0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX250aWRfeAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX250aWRfeSwgNzc2NjR9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19udGlkX3kKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19udGlkX3osIDc3NjkyfSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfbnRpZF96CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfbndhcnBpZCwgNzc3MjB9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19ud2FycGlkCisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfcG0wLCA3Nzc0OX0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX3BtMAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX3BtMSwgNzc3NzR9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ19wbTEKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ19wbTIsIDc3Nzk5fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfcG0yCisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfcG0zLCA3NzgyNH0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX3BtMworICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX3NtaWQsIDc3ODQ5fSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfc21pZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX3RpZF93LCA3Nzg3NX0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX3RpZF93CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfdGlkX3gsIDc3OTAyfSwgLy8gX19udnZtX3JlYWRfcHR4X3NyZWdfdGlkX3gKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcmVhZF9wdHhfc3JlZ190aWRfeSwgNzc5Mjl9LCAvLyBfX252dm1fcmVhZF9wdHhfc3JlZ190aWRfeQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX3RpZF96LCA3Nzk1Nn0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX3RpZF96CisgICAgICB7SW50cmluc2ljOjpudnZtX3JlYWRfcHR4X3NyZWdfd2FycGlkLCA3Nzk4M30sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX3dhcnBpZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yZWFkX3B0eF9zcmVnX3dhcnBzaXplLCA3ODAxMX0sIC8vIF9fbnZ2bV9yZWFkX3B0eF9zcmVnX3dhcnBzaXplCisgICAgICB7SW50cmluc2ljOjpudnZtX3JvdGF0ZV9iMzIsIDc4MDQxfSwgLy8gX19udnZtX3JvdGF0ZV9iMzIKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcm90YXRlX2I2NCwgNzgwNTl9LCAvLyBfX252dm1fcm90YXRlX2I2NAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yb3RhdGVfcmlnaHRfYjY0LCA3ODA3N30sIC8vIF9fbnZ2bV9yb3RhdGVfcmlnaHRfYjY0CisgICAgICB7SW50cmluc2ljOjpudnZtX3JvdW5kX2QsIDc4MTAxfSwgLy8gX19udnZtX3JvdW5kX2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcm91bmRfZiwgNzgxMTZ9LCAvLyBfX252dm1fcm91bmRfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yb3VuZF9mdHpfZiwgNzgxMzF9LCAvLyBfX252dm1fcm91bmRfZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fcnNxcnRfYXBwcm94X2QsIDc4MTUwfSwgLy8gX19udnZtX3JzcXJ0X2FwcHJveF9kCisgICAgICB7SW50cmluc2ljOjpudnZtX3JzcXJ0X2FwcHJveF9mLCA3ODE3Mn0sIC8vIF9fbnZ2bV9yc3FydF9hcHByb3hfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9yc3FydF9hcHByb3hfZnR6X2YsIDc4MTk0fSwgLy8gX19udnZtX3JzcXJ0X2FwcHJveF9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zYWRfaSwgNzgyMjB9LCAvLyBfX252dm1fc2FkX2kKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc2FkX3VpLCA3ODIzM30sIC8vIF9fbnZ2bV9zYWRfdWkKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc2F0dXJhdGVfZCwgNzgyNDd9LCAvLyBfX252dm1fc2F0dXJhdGVfZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zYXR1cmF0ZV9mLCA3ODI2NX0sIC8vIF9fbnZ2bV9zYXR1cmF0ZV9mCisgICAgICB7SW50cmluc2ljOjpudnZtX3NhdHVyYXRlX2Z0el9mLCA3ODI4M30sIC8vIF9fbnZ2bV9zYXR1cmF0ZV9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zaGZsX2JmbHlfZjMyLCA3ODMwNX0sIC8vIF9fbnZ2bV9zaGZsX2JmbHlfZjMyCisgICAgICB7SW50cmluc2ljOjpudnZtX3NoZmxfYmZseV9pMzIsIDc4MzI2fSwgLy8gX19udnZtX3NoZmxfYmZseV9pMzIKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc2hmbF9kb3duX2YzMiwgNzgzNDd9LCAvLyBfX252dm1fc2hmbF9kb3duX2YzMgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zaGZsX2Rvd25faTMyLCA3ODM2OH0sIC8vIF9fbnZ2bV9zaGZsX2Rvd25faTMyCisgICAgICB7SW50cmluc2ljOjpudnZtX3NoZmxfaWR4X2YzMiwgNzgzODl9LCAvLyBfX252dm1fc2hmbF9pZHhfZjMyCisgICAgICB7SW50cmluc2ljOjpudnZtX3NoZmxfaWR4X2kzMiwgNzg0MDl9LCAvLyBfX252dm1fc2hmbF9pZHhfaTMyCisgICAgICB7SW50cmluc2ljOjpudnZtX3NoZmxfc3luY19iZmx5X2YzMiwgNzg0Mjl9LCAvLyBfX252dm1fc2hmbF9zeW5jX2JmbHlfZjMyCisgICAgICB7SW50cmluc2ljOjpudnZtX3NoZmxfc3luY19iZmx5X2kzMiwgNzg0NTV9LCAvLyBfX252dm1fc2hmbF9zeW5jX2JmbHlfaTMyCisgICAgICB7SW50cmluc2ljOjpudnZtX3NoZmxfc3luY19kb3duX2YzMiwgNzg0ODF9LCAvLyBfX252dm1fc2hmbF9zeW5jX2Rvd25fZjMyCisgICAgICB7SW50cmluc2ljOjpudnZtX3NoZmxfc3luY19kb3duX2kzMiwgNzg1MDd9LCAvLyBfX252dm1fc2hmbF9zeW5jX2Rvd25faTMyCisgICAgICB7SW50cmluc2ljOjpudnZtX3NoZmxfc3luY19pZHhfZjMyLCA3ODUzM30sIC8vIF9fbnZ2bV9zaGZsX3N5bmNfaWR4X2YzMgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zaGZsX3N5bmNfaWR4X2kzMiwgNzg1NTh9LCAvLyBfX252dm1fc2hmbF9zeW5jX2lkeF9pMzIKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc2hmbF9zeW5jX3VwX2YzMiwgNzg1ODN9LCAvLyBfX252dm1fc2hmbF9zeW5jX3VwX2YzMgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zaGZsX3N5bmNfdXBfaTMyLCA3ODYwN30sIC8vIF9fbnZ2bV9zaGZsX3N5bmNfdXBfaTMyCisgICAgICB7SW50cmluc2ljOjpudnZtX3NoZmxfdXBfZjMyLCA3ODYzMX0sIC8vIF9fbnZ2bV9zaGZsX3VwX2YzMgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zaGZsX3VwX2kzMiwgNzg2NTB9LCAvLyBfX252dm1fc2hmbF91cF9pMzIKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc2luX2FwcHJveF9mLCA3ODY2OX0sIC8vIF9fbnZ2bV9zaW5fYXBwcm94X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc2luX2FwcHJveF9mdHpfZiwgNzg2ODl9LCAvLyBfX252dm1fc2luX2FwcHJveF9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zcXJ0X2FwcHJveF9mLCA3ODcxM30sIC8vIF9fbnZ2bV9zcXJ0X2FwcHJveF9mCisgICAgICB7SW50cmluc2ljOjpudnZtX3NxcnRfYXBwcm94X2Z0el9mLCA3ODczNH0sIC8vIF9fbnZ2bV9zcXJ0X2FwcHJveF9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zcXJ0X2YsIDc4NzU5fSwgLy8gX19udnZtX3NxcnRfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zcXJ0X3JtX2QsIDc4NzczfSwgLy8gX19udnZtX3NxcnRfcm1fZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zcXJ0X3JtX2YsIDc4NzkwfSwgLy8gX19udnZtX3NxcnRfcm1fZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zcXJ0X3JtX2Z0el9mLCA3ODgwN30sIC8vIF9fbnZ2bV9zcXJ0X3JtX2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX3NxcnRfcm5fZCwgNzg4Mjh9LCAvLyBfX252dm1fc3FydF9ybl9kCisgICAgICB7SW50cmluc2ljOjpudnZtX3NxcnRfcm5fZiwgNzg4NDV9LCAvLyBfX252dm1fc3FydF9ybl9mCisgICAgICB7SW50cmluc2ljOjpudnZtX3NxcnRfcm5fZnR6X2YsIDc4ODYyfSwgLy8gX19udnZtX3NxcnRfcm5fZnR6X2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3FydF9ycF9kLCA3ODg4M30sIC8vIF9fbnZ2bV9zcXJ0X3JwX2QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3FydF9ycF9mLCA3ODkwMH0sIC8vIF9fbnZ2bV9zcXJ0X3JwX2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3FydF9ycF9mdHpfZiwgNzg5MTd9LCAvLyBfX252dm1fc3FydF9ycF9mdHpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zcXJ0X3J6X2QsIDc4OTM4fSwgLy8gX19udnZtX3NxcnRfcnpfZAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zcXJ0X3J6X2YsIDc4OTU1fSwgLy8gX19udnZtX3NxcnRfcnpfZgorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zcXJ0X3J6X2Z0el9mLCA3ODk3Mn0sIC8vIF9fbnZ2bV9zcXJ0X3J6X2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1cV9hcnJheV9zaXplLCA3ODk5M30sIC8vIF9fbnZ2bV9zdXFfYXJyYXlfc2l6ZQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXFfY2hhbm5lbF9kYXRhX3R5cGUsIDc5MDE1fSwgLy8gX19udnZtX3N1cV9jaGFubmVsX2RhdGFfdHlwZQorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXFfY2hhbm5lbF9vcmRlciwgNzkwNDR9LCAvLyBfX252dm1fc3VxX2NoYW5uZWxfb3JkZXIKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VxX2RlcHRoLCA3OTA2OX0sIC8vIF9fbnZ2bV9zdXFfZGVwdGgKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VxX2hlaWdodCwgNzkwODZ9LCAvLyBfX252dm1fc3VxX2hlaWdodAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXFfd2lkdGgsIDc5MTA0fSwgLy8gX19udnZtX3N1cV93aWR0aAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTE2X2NsYW1wLCA3OTEyMX0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTE2X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV9pMTZfdHJhcCwgNzkxNTR9LCAvLyBfX252dm1fc3VzdF9iXzFkX2FycmF5X2kxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV9pMTZfemVybywgNzkxODZ9LCAvLyBfX252dm1fc3VzdF9iXzFkX2FycmF5X2kxNl96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV9pMzJfY2xhbXAsIDc5MjE4fSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV9pMzJfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X2kzMl90cmFwLCA3OTI1MX0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTMyX3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X2kzMl96ZXJvLCA3OTI4M30sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTMyX3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X2k2NF9jbGFtcCwgNzkzMTV9LCAvLyBfX252dm1fc3VzdF9iXzFkX2FycmF5X2k2NF9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTY0X3RyYXAsIDc5MzQ4fSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV9pNjRfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTY0X3plcm8sIDc5MzgwfSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV9pNjRfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfaThfY2xhbXAsIDc5NDEyfSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV9pOF9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfaThfdHJhcCwgNzk0NDR9LCAvLyBfX252dm1fc3VzdF9iXzFkX2FycmF5X2k4X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X2k4X3plcm8sIDc5NDc1fSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV9pOF96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV92MmkxNl9jbGFtcCwgNzk1MDZ9LCAvLyBfX252dm1fc3VzdF9iXzFkX2FycmF5X3YyaTE2X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV92MmkxNl90cmFwLCA3OTU0MX0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpMTZfemVybywgNzk1NzV9LCAvLyBfX252dm1fc3VzdF9iXzFkX2FycmF5X3YyaTE2X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X3YyaTMyX2NsYW1wLCA3OTYwOX0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpMzJfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X3YyaTMyX3RyYXAsIDc5NjQ0fSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV92MmkzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV92MmkzMl96ZXJvLCA3OTY3OH0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpMzJfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpNjRfY2xhbXAsIDc5NzEyfSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV92Mmk2NF9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpNjRfdHJhcCwgNzk3NDd9LCAvLyBfX252dm1fc3VzdF9iXzFkX2FycmF5X3YyaTY0X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X3YyaTY0X3plcm8sIDc5NzgxfSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV92Mmk2NF96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV92Mmk4X2NsYW1wLCA3OTgxNX0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpOF9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpOF90cmFwLCA3OTg0OX0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpOF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV92Mmk4X3plcm8sIDc5ODgyfSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV92Mmk4X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X3Y0aTE2X2NsYW1wLCA3OTkxNX0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMTZfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X3Y0aTE2X3RyYXAsIDc5OTUwfSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV92NGkxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV92NGkxNl96ZXJvLCA3OTk4NH0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMTZfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMzJfY2xhbXAsIDgwMDE4fSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV92NGkzMl9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMzJfdHJhcCwgODAwNTN9LCAvLyBfX252dm1fc3VzdF9iXzFkX2FycmF5X3Y0aTMyX3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2FycmF5X3Y0aTMyX3plcm8sIDgwMDg3fSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV92NGkzMl96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV92NGk4X2NsYW1wLCA4MDEyMX0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpOF9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpOF90cmFwLCA4MDE1NX0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpOF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9hcnJheV92NGk4X3plcm8sIDgwMTg4fSwgLy8gX19udnZtX3N1c3RfYl8xZF9hcnJheV92NGk4X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2kxNl9jbGFtcCwgODAyMjF9LCAvLyBfX252dm1fc3VzdF9iXzFkX2kxNl9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfaTE2X3RyYXAsIDgwMjQ4fSwgLy8gX19udnZtX3N1c3RfYl8xZF9pMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfaTE2X3plcm8sIDgwMjc0fSwgLy8gX19udnZtX3N1c3RfYl8xZF9pMTZfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfaTMyX2NsYW1wLCA4MDMwMH0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfaTMyX2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9pMzJfdHJhcCwgODAzMjd9LCAvLyBfX252dm1fc3VzdF9iXzFkX2kzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9pMzJfemVybywgODAzNTN9LCAvLyBfX252dm1fc3VzdF9iXzFkX2kzMl96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9pNjRfY2xhbXAsIDgwMzc5fSwgLy8gX19udnZtX3N1c3RfYl8xZF9pNjRfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2k2NF90cmFwLCA4MDQwNn0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfaTY0X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2k2NF96ZXJvLCA4MDQzMn0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfaTY0X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2k4X2NsYW1wLCA4MDQ1OH0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfaThfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX2k4X3RyYXAsIDgwNDg0fSwgLy8gX19udnZtX3N1c3RfYl8xZF9pOF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF9pOF96ZXJvLCA4MDUwOX0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfaThfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfdjJpMTZfY2xhbXAsIDgwNTM0fSwgLy8gX19udnZtX3N1c3RfYl8xZF92MmkxNl9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfdjJpMTZfdHJhcCwgODA1NjN9LCAvLyBfX252dm1fc3VzdF9iXzFkX3YyaTE2X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX3YyaTE2X3plcm8sIDgwNTkxfSwgLy8gX19udnZtX3N1c3RfYl8xZF92MmkxNl96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF92MmkzMl9jbGFtcCwgODA2MTl9LCAvLyBfX252dm1fc3VzdF9iXzFkX3YyaTMyX2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF92MmkzMl90cmFwLCA4MDY0OH0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfdjJpMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfdjJpMzJfemVybywgODA2NzZ9LCAvLyBfX252dm1fc3VzdF9iXzFkX3YyaTMyX3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX3YyaTY0X2NsYW1wLCA4MDcwNH0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfdjJpNjRfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX3YyaTY0X3RyYXAsIDgwNzMzfSwgLy8gX19udnZtX3N1c3RfYl8xZF92Mmk2NF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF92Mmk2NF96ZXJvLCA4MDc2MX0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfdjJpNjRfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfdjJpOF9jbGFtcCwgODA3ODl9LCAvLyBfX252dm1fc3VzdF9iXzFkX3YyaThfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX3YyaThfdHJhcCwgODA4MTd9LCAvLyBfX252dm1fc3VzdF9iXzFkX3YyaThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfdjJpOF96ZXJvLCA4MDg0NH0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfdjJpOF96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF92NGkxNl9jbGFtcCwgODA4NzF9LCAvLyBfX252dm1fc3VzdF9iXzFkX3Y0aTE2X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF92NGkxNl90cmFwLCA4MDkwMH0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfdjRpMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfdjRpMTZfemVybywgODA5Mjh9LCAvLyBfX252dm1fc3VzdF9iXzFkX3Y0aTE2X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX3Y0aTMyX2NsYW1wLCA4MDk1Nn0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfdjRpMzJfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX3Y0aTMyX3RyYXAsIDgwOTg1fSwgLy8gX19udnZtX3N1c3RfYl8xZF92NGkzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8xZF92NGkzMl96ZXJvLCA4MTAxM30sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfdjRpMzJfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfdjRpOF9jbGFtcCwgODEwNDF9LCAvLyBfX252dm1fc3VzdF9iXzFkX3Y0aThfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzFkX3Y0aThfdHJhcCwgODEwNjl9LCAvLyBfX252dm1fc3VzdF9iXzFkX3Y0aThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMWRfdjRpOF96ZXJvLCA4MTA5Nn0sIC8vIF9fbnZ2bV9zdXN0X2JfMWRfdjRpOF96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV9pMTZfY2xhbXAsIDgxMTIzfSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV9pMTZfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X2kxNl90cmFwLCA4MTE1Nn0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTE2X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X2kxNl96ZXJvLCA4MTE4OH0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTE2X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X2kzMl9jbGFtcCwgODEyMjB9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X2kzMl9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTMyX3RyYXAsIDgxMjUzfSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV9pMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTMyX3plcm8sIDgxMjg1fSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV9pMzJfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTY0X2NsYW1wLCA4MTMxN30sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTY0X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV9pNjRfdHJhcCwgODEzNTB9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X2k2NF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV9pNjRfemVybywgODEzODJ9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X2k2NF96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV9pOF9jbGFtcCwgODE0MTR9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X2k4X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV9pOF90cmFwLCA4MTQ0Nn0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfaThfemVybywgODE0Nzd9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X2k4X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X3YyaTE2X2NsYW1wLCA4MTUwOH0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpMTZfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X3YyaTE2X3RyYXAsIDgxNTQzfSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV92MmkxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV92MmkxNl96ZXJvLCA4MTU3N30sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpMTZfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpMzJfY2xhbXAsIDgxNjExfSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV92MmkzMl9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpMzJfdHJhcCwgODE2NDZ9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X3YyaTMyX3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X3YyaTMyX3plcm8sIDgxNjgwfSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV92MmkzMl96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV92Mmk2NF9jbGFtcCwgODE3MTR9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X3YyaTY0X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV92Mmk2NF90cmFwLCA4MTc0OX0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpNjRfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpNjRfemVybywgODE3ODN9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X3YyaTY0X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X3YyaThfY2xhbXAsIDgxODE3fSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV92Mmk4X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV92Mmk4X3RyYXAsIDgxODUxfSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV92Mmk4X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X3YyaThfemVybywgODE4ODR9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X3YyaThfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpMTZfY2xhbXAsIDgxOTE3fSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV92NGkxNl9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpMTZfdHJhcCwgODE5NTJ9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTE2X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTE2X3plcm8sIDgxOTg2fSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV92NGkxNl96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV92NGkzMl9jbGFtcCwgODIwMjB9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTMyX2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV92NGkzMl90cmFwLCA4MjA1NX0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpMzJfemVybywgODIwODl9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTMyX3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X3Y0aThfY2xhbXAsIDgyMTIzfSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV92NGk4X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9hcnJheV92NGk4X3RyYXAsIDgyMTU3fSwgLy8gX19udnZtX3N1c3RfYl8yZF9hcnJheV92NGk4X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2FycmF5X3Y0aThfemVybywgODIxOTB9LCAvLyBfX252dm1fc3VzdF9iXzJkX2FycmF5X3Y0aThfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfaTE2X2NsYW1wLCA4MjIyM30sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfaTE2X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9pMTZfdHJhcCwgODIyNTB9LCAvLyBfX252dm1fc3VzdF9iXzJkX2kxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9pMTZfemVybywgODIyNzZ9LCAvLyBfX252dm1fc3VzdF9iXzJkX2kxNl96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF9pMzJfY2xhbXAsIDgyMzAyfSwgLy8gX19udnZtX3N1c3RfYl8yZF9pMzJfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2kzMl90cmFwLCA4MjMyOX0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfaTMyX3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2kzMl96ZXJvLCA4MjM1NX0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfaTMyX3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2k2NF9jbGFtcCwgODIzODF9LCAvLyBfX252dm1fc3VzdF9iXzJkX2k2NF9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfaTY0X3RyYXAsIDgyNDA4fSwgLy8gX19udnZtX3N1c3RfYl8yZF9pNjRfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfaTY0X3plcm8sIDgyNDM0fSwgLy8gX19udnZtX3N1c3RfYl8yZF9pNjRfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfaThfY2xhbXAsIDgyNDYwfSwgLy8gX19udnZtX3N1c3RfYl8yZF9pOF9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfaThfdHJhcCwgODI0ODZ9LCAvLyBfX252dm1fc3VzdF9iXzJkX2k4X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX2k4X3plcm8sIDgyNTExfSwgLy8gX19udnZtX3N1c3RfYl8yZF9pOF96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF92MmkxNl9jbGFtcCwgODI1MzZ9LCAvLyBfX252dm1fc3VzdF9iXzJkX3YyaTE2X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF92MmkxNl90cmFwLCA4MjU2NX0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfdjJpMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfdjJpMTZfemVybywgODI1OTN9LCAvLyBfX252dm1fc3VzdF9iXzJkX3YyaTE2X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX3YyaTMyX2NsYW1wLCA4MjYyMX0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfdjJpMzJfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX3YyaTMyX3RyYXAsIDgyNjUwfSwgLy8gX19udnZtX3N1c3RfYl8yZF92MmkzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF92MmkzMl96ZXJvLCA4MjY3OH0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfdjJpMzJfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfdjJpNjRfY2xhbXAsIDgyNzA2fSwgLy8gX19udnZtX3N1c3RfYl8yZF92Mmk2NF9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfdjJpNjRfdHJhcCwgODI3MzV9LCAvLyBfX252dm1fc3VzdF9iXzJkX3YyaTY0X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX3YyaTY0X3plcm8sIDgyNzYzfSwgLy8gX19udnZtX3N1c3RfYl8yZF92Mmk2NF96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF92Mmk4X2NsYW1wLCA4Mjc5MX0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfdjJpOF9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfdjJpOF90cmFwLCA4MjgxOX0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfdjJpOF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF92Mmk4X3plcm8sIDgyODQ2fSwgLy8gX19udnZtX3N1c3RfYl8yZF92Mmk4X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX3Y0aTE2X2NsYW1wLCA4Mjg3M30sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfdjRpMTZfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX3Y0aTE2X3RyYXAsIDgyOTAyfSwgLy8gX19udnZtX3N1c3RfYl8yZF92NGkxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF92NGkxNl96ZXJvLCA4MjkzMH0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfdjRpMTZfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfdjRpMzJfY2xhbXAsIDgyOTU4fSwgLy8gX19udnZtX3N1c3RfYl8yZF92NGkzMl9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfdjRpMzJfdHJhcCwgODI5ODd9LCAvLyBfX252dm1fc3VzdF9iXzJkX3Y0aTMyX3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzJkX3Y0aTMyX3plcm8sIDgzMDE1fSwgLy8gX19udnZtX3N1c3RfYl8yZF92NGkzMl96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF92NGk4X2NsYW1wLCA4MzA0M30sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfdjRpOF9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfMmRfdjRpOF90cmFwLCA4MzA3MX0sIC8vIF9fbnZ2bV9zdXN0X2JfMmRfdjRpOF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8yZF92NGk4X3plcm8sIDgzMDk4fSwgLy8gX19udnZtX3N1c3RfYl8yZF92NGk4X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX2kxNl9jbGFtcCwgODMxMjV9LCAvLyBfX252dm1fc3VzdF9iXzNkX2kxNl9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfaTE2X3RyYXAsIDgzMTUyfSwgLy8gX19udnZtX3N1c3RfYl8zZF9pMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfaTE2X3plcm8sIDgzMTc4fSwgLy8gX19udnZtX3N1c3RfYl8zZF9pMTZfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfaTMyX2NsYW1wLCA4MzIwNH0sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfaTMyX2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF9pMzJfdHJhcCwgODMyMzF9LCAvLyBfX252dm1fc3VzdF9iXzNkX2kzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF9pMzJfemVybywgODMyNTd9LCAvLyBfX252dm1fc3VzdF9iXzNkX2kzMl96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF9pNjRfY2xhbXAsIDgzMjgzfSwgLy8gX19udnZtX3N1c3RfYl8zZF9pNjRfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX2k2NF90cmFwLCA4MzMxMH0sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfaTY0X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX2k2NF96ZXJvLCA4MzMzNn0sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfaTY0X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX2k4X2NsYW1wLCA4MzM2Mn0sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfaThfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX2k4X3RyYXAsIDgzMzg4fSwgLy8gX19udnZtX3N1c3RfYl8zZF9pOF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF9pOF96ZXJvLCA4MzQxM30sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfaThfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfdjJpMTZfY2xhbXAsIDgzNDM4fSwgLy8gX19udnZtX3N1c3RfYl8zZF92MmkxNl9jbGFtcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfdjJpMTZfdHJhcCwgODM0Njd9LCAvLyBfX252dm1fc3VzdF9iXzNkX3YyaTE2X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX3YyaTE2X3plcm8sIDgzNDk1fSwgLy8gX19udnZtX3N1c3RfYl8zZF92MmkxNl96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF92MmkzMl9jbGFtcCwgODM1MjN9LCAvLyBfX252dm1fc3VzdF9iXzNkX3YyaTMyX2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF92MmkzMl90cmFwLCA4MzU1Mn0sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfdjJpMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfdjJpMzJfemVybywgODM1ODB9LCAvLyBfX252dm1fc3VzdF9iXzNkX3YyaTMyX3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX3YyaTY0X2NsYW1wLCA4MzYwOH0sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfdjJpNjRfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX3YyaTY0X3RyYXAsIDgzNjM3fSwgLy8gX19udnZtX3N1c3RfYl8zZF92Mmk2NF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF92Mmk2NF96ZXJvLCA4MzY2NX0sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfdjJpNjRfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfdjJpOF9jbGFtcCwgODM2OTN9LCAvLyBfX252dm1fc3VzdF9iXzNkX3YyaThfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX3YyaThfdHJhcCwgODM3MjF9LCAvLyBfX252dm1fc3VzdF9iXzNkX3YyaThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfdjJpOF96ZXJvLCA4Mzc0OH0sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfdjJpOF96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF92NGkxNl9jbGFtcCwgODM3NzV9LCAvLyBfX252dm1fc3VzdF9iXzNkX3Y0aTE2X2NsYW1wCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF92NGkxNl90cmFwLCA4MzgwNH0sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfdjRpMTZfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfdjRpMTZfemVybywgODM4MzJ9LCAvLyBfX252dm1fc3VzdF9iXzNkX3Y0aTE2X3plcm8KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX3Y0aTMyX2NsYW1wLCA4Mzg2MH0sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfdjRpMzJfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX3Y0aTMyX3RyYXAsIDgzODg5fSwgLy8gX19udnZtX3N1c3RfYl8zZF92NGkzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfYl8zZF92NGkzMl96ZXJvLCA4MzkxN30sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfdjRpMzJfemVybworICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfdjRpOF9jbGFtcCwgODM5NDV9LCAvLyBfX252dm1fc3VzdF9iXzNkX3Y0aThfY2xhbXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9iXzNkX3Y0aThfdHJhcCwgODM5NzN9LCAvLyBfX252dm1fc3VzdF9iXzNkX3Y0aThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X2JfM2RfdjRpOF96ZXJvLCA4NDAwMH0sIC8vIF9fbnZ2bV9zdXN0X2JfM2RfdjRpOF96ZXJvCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8xZF9hcnJheV9pMTZfdHJhcCwgODQwMjd9LCAvLyBfX252dm1fc3VzdF9wXzFkX2FycmF5X2kxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8xZF9hcnJheV9pMzJfdHJhcCwgODQwNTl9LCAvLyBfX252dm1fc3VzdF9wXzFkX2FycmF5X2kzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8xZF9hcnJheV9pOF90cmFwLCA4NDA5MX0sIC8vIF9fbnZ2bV9zdXN0X3BfMWRfYXJyYXlfaThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjJpMTZfdHJhcCwgODQxMjJ9LCAvLyBfX252dm1fc3VzdF9wXzFkX2FycmF5X3YyaTE2X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9wXzFkX2FycmF5X3YyaTMyX3RyYXAsIDg0MTU2fSwgLy8gX19udnZtX3N1c3RfcF8xZF9hcnJheV92MmkzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8xZF9hcnJheV92Mmk4X3RyYXAsIDg0MTkwfSwgLy8gX19udnZtX3N1c3RfcF8xZF9hcnJheV92Mmk4X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9wXzFkX2FycmF5X3Y0aTE2X3RyYXAsIDg0MjIzfSwgLy8gX19udnZtX3N1c3RfcF8xZF9hcnJheV92NGkxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8xZF9hcnJheV92NGkzMl90cmFwLCA4NDI1N30sIC8vIF9fbnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjRpMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjRpOF90cmFwLCA4NDI5MX0sIC8vIF9fbnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjRpOF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8xZF9pMTZfdHJhcCwgODQzMjR9LCAvLyBfX252dm1fc3VzdF9wXzFkX2kxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8xZF9pMzJfdHJhcCwgODQzNTB9LCAvLyBfX252dm1fc3VzdF9wXzFkX2kzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8xZF9pOF90cmFwLCA4NDM3Nn0sIC8vIF9fbnZ2bV9zdXN0X3BfMWRfaThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMWRfdjJpMTZfdHJhcCwgODQ0MDF9LCAvLyBfX252dm1fc3VzdF9wXzFkX3YyaTE2X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9wXzFkX3YyaTMyX3RyYXAsIDg0NDI5fSwgLy8gX19udnZtX3N1c3RfcF8xZF92MmkzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8xZF92Mmk4X3RyYXAsIDg0NDU3fSwgLy8gX19udnZtX3N1c3RfcF8xZF92Mmk4X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9wXzFkX3Y0aTE2X3RyYXAsIDg0NDg0fSwgLy8gX19udnZtX3N1c3RfcF8xZF92NGkxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8xZF92NGkzMl90cmFwLCA4NDUxMn0sIC8vIF9fbnZ2bV9zdXN0X3BfMWRfdjRpMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMWRfdjRpOF90cmFwLCA4NDU0MH0sIC8vIF9fbnZ2bV9zdXN0X3BfMWRfdjRpOF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8yZF9hcnJheV9pMTZfdHJhcCwgODQ1Njd9LCAvLyBfX252dm1fc3VzdF9wXzJkX2FycmF5X2kxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8yZF9hcnJheV9pMzJfdHJhcCwgODQ1OTl9LCAvLyBfX252dm1fc3VzdF9wXzJkX2FycmF5X2kzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8yZF9hcnJheV9pOF90cmFwLCA4NDYzMX0sIC8vIF9fbnZ2bV9zdXN0X3BfMmRfYXJyYXlfaThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMmRfYXJyYXlfdjJpMTZfdHJhcCwgODQ2NjJ9LCAvLyBfX252dm1fc3VzdF9wXzJkX2FycmF5X3YyaTE2X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9wXzJkX2FycmF5X3YyaTMyX3RyYXAsIDg0Njk2fSwgLy8gX19udnZtX3N1c3RfcF8yZF9hcnJheV92MmkzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8yZF9hcnJheV92Mmk4X3RyYXAsIDg0NzMwfSwgLy8gX19udnZtX3N1c3RfcF8yZF9hcnJheV92Mmk4X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9wXzJkX2FycmF5X3Y0aTE2X3RyYXAsIDg0NzYzfSwgLy8gX19udnZtX3N1c3RfcF8yZF9hcnJheV92NGkxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8yZF9hcnJheV92NGkzMl90cmFwLCA4NDc5N30sIC8vIF9fbnZ2bV9zdXN0X3BfMmRfYXJyYXlfdjRpMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMmRfYXJyYXlfdjRpOF90cmFwLCA4NDgzMX0sIC8vIF9fbnZ2bV9zdXN0X3BfMmRfYXJyYXlfdjRpOF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8yZF9pMTZfdHJhcCwgODQ4NjR9LCAvLyBfX252dm1fc3VzdF9wXzJkX2kxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8yZF9pMzJfdHJhcCwgODQ4OTB9LCAvLyBfX252dm1fc3VzdF9wXzJkX2kzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8yZF9pOF90cmFwLCA4NDkxNn0sIC8vIF9fbnZ2bV9zdXN0X3BfMmRfaThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMmRfdjJpMTZfdHJhcCwgODQ5NDF9LCAvLyBfX252dm1fc3VzdF9wXzJkX3YyaTE2X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9wXzJkX3YyaTMyX3RyYXAsIDg0OTY5fSwgLy8gX19udnZtX3N1c3RfcF8yZF92MmkzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8yZF92Mmk4X3RyYXAsIDg0OTk3fSwgLy8gX19udnZtX3N1c3RfcF8yZF92Mmk4X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9wXzJkX3Y0aTE2X3RyYXAsIDg1MDI0fSwgLy8gX19udnZtX3N1c3RfcF8yZF92NGkxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8yZF92NGkzMl90cmFwLCA4NTA1Mn0sIC8vIF9fbnZ2bV9zdXN0X3BfMmRfdjRpMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfMmRfdjRpOF90cmFwLCA4NTA4MH0sIC8vIF9fbnZ2bV9zdXN0X3BfMmRfdjRpOF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8zZF9pMTZfdHJhcCwgODUxMDd9LCAvLyBfX252dm1fc3VzdF9wXzNkX2kxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8zZF9pMzJfdHJhcCwgODUxMzN9LCAvLyBfX252dm1fc3VzdF9wXzNkX2kzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8zZF9pOF90cmFwLCA4NTE1OX0sIC8vIF9fbnZ2bV9zdXN0X3BfM2RfaThfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfM2RfdjJpMTZfdHJhcCwgODUxODR9LCAvLyBfX252dm1fc3VzdF9wXzNkX3YyaTE2X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9wXzNkX3YyaTMyX3RyYXAsIDg1MjEyfSwgLy8gX19udnZtX3N1c3RfcF8zZF92MmkzMl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8zZF92Mmk4X3RyYXAsIDg1MjQwfSwgLy8gX19udnZtX3N1c3RfcF8zZF92Mmk4X3RyYXAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fc3VzdF9wXzNkX3Y0aTE2X3RyYXAsIDg1MjY3fSwgLy8gX19udnZtX3N1c3RfcF8zZF92NGkxNl90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N1c3RfcF8zZF92NGkzMl90cmFwLCA4NTI5NX0sIC8vIF9fbnZ2bV9zdXN0X3BfM2RfdjRpMzJfdHJhcAorICAgICAge0ludHJpbnNpYzo6bnZ2bV9zdXN0X3BfM2RfdjRpOF90cmFwLCA4NTMyM30sIC8vIF9fbnZ2bV9zdXN0X3BfM2RfdjRpOF90cmFwCisgICAgICB7SW50cmluc2ljOjpudnZtX3N3YXBfbG9faGlfYjY0LCA4NTM1MH0sIC8vIF9fbnZ2bV9zd2FwX2xvX2hpX2I2NAorICAgICAge0ludHJpbnNpYzo6bnZ2bV90cnVuY19kLCA4NTM3Mn0sIC8vIF9fbnZ2bV90cnVuY19kCisgICAgICB7SW50cmluc2ljOjpudnZtX3RydW5jX2YsIDg1Mzg3fSwgLy8gX19udnZtX3RydW5jX2YKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdHJ1bmNfZnR6X2YsIDg1NDAyfSwgLy8gX19udnZtX3RydW5jX2Z0el9mCisgICAgICB7SW50cmluc2ljOjpudnZtX3R4cV9hcnJheV9zaXplLCA4NTQyMX0sIC8vIF9fbnZ2bV90eHFfYXJyYXlfc2l6ZQorICAgICAge0ludHJpbnNpYzo6bnZ2bV90eHFfY2hhbm5lbF9kYXRhX3R5cGUsIDg1NDQzfSwgLy8gX19udnZtX3R4cV9jaGFubmVsX2RhdGFfdHlwZQorICAgICAge0ludHJpbnNpYzo6bnZ2bV90eHFfY2hhbm5lbF9vcmRlciwgODU0NzJ9LCAvLyBfX252dm1fdHhxX2NoYW5uZWxfb3JkZXIKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdHhxX2RlcHRoLCA4NTQ5N30sIC8vIF9fbnZ2bV90eHFfZGVwdGgKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdHhxX2hlaWdodCwgODU1MTR9LCAvLyBfX252dm1fdHhxX2hlaWdodAorICAgICAge0ludHJpbnNpYzo6bnZ2bV90eHFfbnVtX21pcG1hcF9sZXZlbHMsIDg1NTMyfSwgLy8gX19udnZtX3R4cV9udW1fbWlwbWFwX2xldmVscworICAgICAge0ludHJpbnNpYzo6bnZ2bV90eHFfbnVtX3NhbXBsZXMsIDg1NTYxfSwgLy8gX19udnZtX3R4cV9udW1fc2FtcGxlcworICAgICAge0ludHJpbnNpYzo6bnZ2bV90eHFfd2lkdGgsIDg1NTg0fSwgLy8gX19udnZtX3R4cV93aWR0aAorICAgICAge0ludHJpbnNpYzo6bnZ2bV91aTJkX3JtLCA4NTYwMX0sIC8vIF9fbnZ2bV91aTJkX3JtCisgICAgICB7SW50cmluc2ljOjpudnZtX3VpMmRfcm4sIDg1NjE2fSwgLy8gX19udnZtX3VpMmRfcm4KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdWkyZF9ycCwgODU2MzF9LCAvLyBfX252dm1fdWkyZF9ycAorICAgICAge0ludHJpbnNpYzo6bnZ2bV91aTJkX3J6LCA4NTY0Nn0sIC8vIF9fbnZ2bV91aTJkX3J6CisgICAgICB7SW50cmluc2ljOjpudnZtX3VpMmZfcm0sIDg1NjYxfSwgLy8gX19udnZtX3VpMmZfcm0KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdWkyZl9ybiwgODU2NzZ9LCAvLyBfX252dm1fdWkyZl9ybgorICAgICAge0ludHJpbnNpYzo6bnZ2bV91aTJmX3JwLCA4NTY5MX0sIC8vIF9fbnZ2bV91aTJmX3JwCisgICAgICB7SW50cmluc2ljOjpudnZtX3VpMmZfcnosIDg1NzA2fSwgLy8gX19udnZtX3VpMmZfcnoKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdWxsMmRfcm0sIDg1NzIxfSwgLy8gX19udnZtX3VsbDJkX3JtCisgICAgICB7SW50cmluc2ljOjpudnZtX3VsbDJkX3JuLCA4NTczN30sIC8vIF9fbnZ2bV91bGwyZF9ybgorICAgICAge0ludHJpbnNpYzo6bnZ2bV91bGwyZF9ycCwgODU3NTN9LCAvLyBfX252dm1fdWxsMmRfcnAKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdWxsMmRfcnosIDg1NzY5fSwgLy8gX19udnZtX3VsbDJkX3J6CisgICAgICB7SW50cmluc2ljOjpudnZtX3VsbDJmX3JtLCA4NTc4NX0sIC8vIF9fbnZ2bV91bGwyZl9ybQorICAgICAge0ludHJpbnNpYzo6bnZ2bV91bGwyZl9ybiwgODU4MDF9LCAvLyBfX252dm1fdWxsMmZfcm4KKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdWxsMmZfcnAsIDg1ODE3fSwgLy8gX19udnZtX3VsbDJmX3JwCisgICAgICB7SW50cmluc2ljOjpudnZtX3VsbDJmX3J6LCA4NTgzM30sIC8vIF9fbnZ2bV91bGwyZl9yegorICAgICAge0ludHJpbnNpYzo6bnZ2bV92b3RlX2FsbCwgODU4NDl9LCAvLyBfX252dm1fdm90ZV9hbGwKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdm90ZV9hbGxfc3luYywgODU4NjV9LCAvLyBfX252dm1fdm90ZV9hbGxfc3luYworICAgICAge0ludHJpbnNpYzo6bnZ2bV92b3RlX2FueSwgODU4ODZ9LCAvLyBfX252dm1fdm90ZV9hbnkKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdm90ZV9hbnlfc3luYywgODU5MDJ9LCAvLyBfX252dm1fdm90ZV9hbnlfc3luYworICAgICAge0ludHJpbnNpYzo6bnZ2bV92b3RlX2JhbGxvdCwgODU5MjN9LCAvLyBfX252dm1fdm90ZV9iYWxsb3QKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdm90ZV9iYWxsb3Rfc3luYywgODU5NDJ9LCAvLyBfX252dm1fdm90ZV9iYWxsb3Rfc3luYworICAgICAge0ludHJpbnNpYzo6bnZ2bV92b3RlX3VuaSwgODU5NjZ9LCAvLyBfX252dm1fdm90ZV91bmkKKyAgICAgIHtJbnRyaW5zaWM6Om52dm1fdm90ZV91bmlfc3luYywgODU5ODJ9LCAvLyBfX252dm1fdm90ZV91bmlfc3luYworICAgICAge0ludHJpbnNpYzo6bnZ2bV9iYXJyaWVyMCwgNzMwNzF9LCAvLyBfX3N5bmN0aHJlYWRzCisgICAgfTsKKyAgICBhdXRvIEkgPSBzdGQ6Omxvd2VyX2JvdW5kKHN0ZDo6YmVnaW4obnZ2bU5hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZW5kKG52dm1OYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsdGluTmFtZVN0cik7CisgICAgaWYgKEkgIT0gc3RkOjplbmQobnZ2bU5hbWVzKSAmJgorICAgICAgICBJLT5nZXROYW1lKCkgPT0gQnVpbHRpbk5hbWVTdHIpCisgICAgICByZXR1cm4gSS0+SW50cmluSUQ7CisgIH0KKyAgaWYgKFRhcmdldFByZWZpeCA9PSAicHBjIikgeworICAgIHN0YXRpYyBjb25zdCBCdWlsdGluRW50cnkgcHBjTmFtZXNbXSA9IHsKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX2NyeXB0b192Y2lwaGVyLCA4NjAwM30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX2NyeXB0b192Y2lwaGVyCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY19jcnlwdG9fdmNpcGhlcmxhc3QsIDg2MDM2fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZjaXBoZXJsYXN0CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY19jcnlwdG9fdm5jaXBoZXIsIDg2MDczfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZuY2lwaGVyCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY19jcnlwdG9fdm5jaXBoZXJsYXN0LCA4NjEwN30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX2NyeXB0b192bmNpcGhlcmxhc3QKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX2NyeXB0b192cGVybXhvciwgODYxNDV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdnBlcm14b3IKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX2NyeXB0b192cG1zdW1iLCA4NjE3OX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX2NyeXB0b192cG1zdW1iCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY19jcnlwdG9fdnBtc3VtZCwgODYyMTJ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdnBtc3VtZAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfY3J5cHRvX3ZwbXN1bWgsIDg2MjQ1fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZwbXN1bWgKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX2NyeXB0b192cG1zdW13LCA4NjI3OH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX2NyeXB0b192cG1zdW13CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY19jcnlwdG9fdnNib3gsIDg2MzExfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZzYm94CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY19jcnlwdG9fdnNoYXNpZ21hZCwgODYzNDJ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdnNoYXNpZ21hZAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfY3J5cHRvX3ZzaGFzaWdtYXcsIDg2Mzc4fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZzaGFzaWdtYXcKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX2RzcywgODY0MTR9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY19kc3MKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX2Rzc2FsbCwgODY0MzZ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY19kc3NhbGwKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX2RzdCwgODY0NjF9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY19kc3QKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX2RzdHN0LCA4NjQ4M30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX2RzdHN0CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY19kc3RzdHQsIDg2NTA3fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfZHN0c3R0CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY19kc3R0LCA4NjUzMn0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX2RzdHQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX21mdnNjciwgODY1NTV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY19tZnZzY3IKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX210dnNjciwgODY1ODB9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY19tdHZzY3IKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZhYnNkdWIsIDg2NjA1fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmFic2R1YgorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmFic2R1aCwgODY2MzF9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192YWJzZHVoCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192YWJzZHV3LCA4NjY1N30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZhYnNkdXcKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZhZGRjdXEsIDg2NjgzfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmFkZGN1cQorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmFkZGN1dywgODY3MDl9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192YWRkY3V3CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192YWRkZWN1cSwgODY3MzV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192YWRkZWN1cQorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmFkZGV1cW0sIDg2NzYyfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmFkZGV1cW0KKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZhZGRzYnMsIDg2Nzg5fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmFkZHNicworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmFkZHNocywgODY4MTV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192YWRkc2hzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192YWRkc3dzLCA4Njg0MX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZhZGRzd3MKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZhZGR1YnMsIDg2ODY3fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmFkZHVicworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmFkZHVocywgODY4OTN9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192YWRkdWhzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192YWRkdXdzLCA4NjkxOX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZhZGR1d3MKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZhdmdzYiwgODY5NDV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192YXZnc2IKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZhdmdzaCwgODY5NzB9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192YXZnc2gKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZhdmdzdywgODY5OTV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192YXZnc3cKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3Zhdmd1YiwgODcwMjB9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192YXZndWIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3Zhdmd1aCwgODcwNDV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192YXZndWgKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3Zhdmd1dywgODcwNzB9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192YXZndXcKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZicGVybXEsIDg3MDk1fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmJwZXJtcQorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNmc3gsIDg3MTIxfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNmc3gKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjZnV4LCA4NzE0NX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZjZnV4CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y2x6bHNiYiwgODcxNjl9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y2x6bHNiYgorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGJmcCwgODcxOTZ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wYmZwCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wYmZwX3AsIDg3MjIyfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcGJmcF9wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZXFmcCwgODcyNTB9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXFmcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGVxZnBfcCwgODcyNzd9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXFmcF9wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZXF1YiwgODczMDZ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1YgorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGVxdWJfcCwgODczMzN9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1Yl9wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZXF1ZCwgODczNjJ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1ZAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGVxdWRfcCwgODczODl9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1ZF9wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZXF1aCwgODc0MTh9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1aAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGVxdWhfcCwgODc0NDV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1aF9wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZXF1dywgODc0NzR9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1dworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGVxdXdfcCwgODc1MDF9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1d19wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZ2VmcCwgODc1MzB9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ2VmcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGdlZnBfcCwgODc1NTd9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ2VmcF9wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZ3RmcCwgODc1ODZ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RmcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0ZnBfcCwgODc2MTN9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RmcF9wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZ3RzYiwgODc2NDJ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzYgorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0c2JfcCwgODc2Njl9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzYl9wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZ3RzZCwgODc2OTh9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzZAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0c2RfcCwgODc3MjV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzZF9wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZ3RzaCwgODc3NTR9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzaAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0c2hfcCwgODc3ODF9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzaF9wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZ3RzdywgODc4MTB9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzdworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0c3dfcCwgODc4Mzd9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3Rzd19wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZ3R1YiwgODc4NjZ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1YgorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0dWJfcCwgODc4OTN9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1Yl9wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZ3R1ZCwgODc5MjJ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1ZAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0dWRfcCwgODc5NDl9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1ZF9wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZ3R1aCwgODc5Nzh9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1aAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0dWhfcCwgODgwMDV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1aF9wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wZ3R1dywgODgwMzR9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1dworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcGd0dXdfcCwgODgwNjF9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1d19wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wbmViLCA4ODA5MH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBuZWIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBuZWJfcCwgODgxMTZ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wbmViX3AKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZjbXBuZWgsIDg4MTQ0fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcG5laAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcG5laF9wLCA4ODE3MH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBuZWhfcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcG5ldywgODgxOTh9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wbmV3CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wbmV3X3AsIDg4MjI0fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmNtcG5ld19wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wbmV6YiwgODgyNTJ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wbmV6YgorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcG5lemJfcCwgODgyNzl9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wbmV6Yl9wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wbmV6aCwgODgzMDh9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wbmV6aAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcG5lemhfcCwgODgzMzV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wbmV6aF9wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y21wbmV6dywgODgzNjR9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wbmV6dworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmNtcG5lendfcCwgODgzOTF9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y21wbmV6d19wCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y3RzeHMsIDg4NDIwfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmN0c3hzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y3R1eHMsIDg4NDQ1fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmN0dXhzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192Y3R6bHNiYiwgODg0NzB9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192Y3R6bHNiYgorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdmV4cHRlZnAsIDg4NDk3fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdmV4cHRlZnAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZnYmJkLCA4ODUyNH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZnYmJkCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bG9nZWZwLCA4ODU0OH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3Zsb2dlZnAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtYWRkZnAsIDg4NTc0fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm1hZGRmcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1heGZwLCA4ODYwMH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXhmcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1heHNiLCA4ODYyNX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXhzYgorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1heHNkLCA4ODY1MH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXhzZAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1heHNoLCA4ODY3NX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXhzaAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1heHN3LCA4ODcwMH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXhzdworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1heHViLCA4ODcyNX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXh1YgorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1heHVkLCA4ODc1MH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXh1ZAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1heHVoLCA4ODc3NX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXh1aAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1heHV3LCA4ODgwMH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtYXh1dworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1oYWRkc2hzLCA4ODgyNX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtaGFkZHNocworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1ocmFkZHNocywgODg4NTN9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bWhyYWRkc2hzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bWluZnAsIDg4ODgyfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm1pbmZwCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bWluc2IsIDg4OTA3fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm1pbnNiCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bWluc2QsIDg4OTMyfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm1pbnNkCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bWluc2gsIDg4OTU3fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm1pbnNoCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bWluc3csIDg4OTgyfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm1pbnN3CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bWludWIsIDg5MDA3fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm1pbnViCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bWludWQsIDg5MDMyfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm1pbnVkCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bWludWgsIDg5MDU3fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm1pbnVoCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bWludXcsIDg5MDgyfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm1pbnV3CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bWxhZGR1aG0sIDg5MTA3fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm1sYWRkdWhtCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bXN1bW1ibSwgODkxMzV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bXN1bW1ibQorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1zdW1zaG0sIDg5MTYyfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm1zdW1zaG0KKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3Ztc3Vtc2hzLCA4OTE4OX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3Ztc3Vtc2hzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bXN1bXVibSwgODkyMTZ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bXN1bXVibQorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm1zdW11aG0sIDg5MjQzfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm1zdW11aG0KKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3Ztc3VtdWhzLCA4OTI3MH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3Ztc3VtdWhzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bXVsZXNiLCA4OTI5N30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxlc2IKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtdWxlc2gsIDg5MzIzfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm11bGVzaAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm11bGVzdywgODkzNDl9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bXVsZXN3CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bXVsZXViLCA4OTM3NX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxldWIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtdWxldWgsIDg5NDAxfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm11bGV1aAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm11bGV1dywgODk0Mjd9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bXVsZXV3CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bXVsb3NiLCA4OTQ1M30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxvc2IKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtdWxvc2gsIDg5NDc5fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm11bG9zaAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm11bG9zdywgODk1MDV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bXVsb3N3CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bXVsb3ViLCA4OTUzMX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxvdWIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZtdWxvdWgsIDg5NTU3fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdm11bG91aAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdm11bG91dywgODk1ODN9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bXVsb3V3CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192bm1zdWJmcCwgODk2MDl9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192bm1zdWJmcAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnBlcm0sIDg5NjM2fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnBlcm1fNHNpCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192cGtweCwgODk2NjR9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192cGtweAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnBrc2RzcywgODk2ODh9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192cGtzZHNzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192cGtzZHVzLCA4OTcxNH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3Zwa3NkdXMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3Zwa3Noc3MsIDg5NzQwfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnBrc2hzcworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnBrc2h1cywgODk3NjZ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192cGtzaHVzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192cGtzd3NzLCA4OTc5Mn0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3Zwa3N3c3MKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3Zwa3N3dXMsIDg5ODE4fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnBrc3d1cworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnBrdWR1cywgODk4NDR9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192cGt1ZHVzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192cGt1aHVzLCA4OTg3MH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3Zwa3VodXMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3Zwa3V3dXMsIDg5ODk2fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnBrdXd1cworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnBydHliZCwgODk5MjJ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192cHJ0eWJkCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192cHJ0eWJxLCA4OTk0OH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZwcnR5YnEKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZwcnR5YncsIDg5OTc0fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnBydHlidworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnJlZnAsIDkwMDAwfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnJlZnAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZyZmltLCA5MDAyNH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZyZmltCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192cmZpbiwgOTAwNDh9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192cmZpbgorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnJmaXAsIDkwMDcyfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnJmaXAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZyZml6LCA5MDA5Nn0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZyZml6CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192cmxiLCA5MDEyMH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZybGIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZybGQsIDkwMTQzfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnJsZAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnJsZG1pLCA5MDE2Nn0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZybGRtaQorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnJsZG5tLCA5MDE5MX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZybGRubQorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnJsaCwgOTAyMTZ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192cmxoCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192cmx3LCA5MDIzOX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZybHcKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZybHdtaSwgOTAyNjJ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192cmx3bWkKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZybHdubSwgOTAyODd9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192cmx3bm0KKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3Zyc3FydGVmcCwgOTAzMTJ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192cnNxcnRlZnAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzZWwsIDkwMzQwfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnNlbF80c2kKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzbCwgOTAzNjd9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192c2wKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzbGIsIDkwMzg5fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnNsYgorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnNsaCwgOTA0MTJ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192c2xoCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c2xvLCA5MDQzNX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzbG8KKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzbHYsIDkwNDU4fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnNsdgorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnNsdywgOTA0ODF9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192c2x3CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c3IsIDkwNTA0fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnNyCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c3JhYiwgOTA1MjZ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192c3JhYgorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnNyYWgsIDkwNTUwfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnNyYWgKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzcmF3LCA5MDU3NH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzcmF3CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c3JiLCA5MDU5OH0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzcmIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzcmgsIDkwNjIxfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnNyaAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnNybywgOTA2NDR9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192c3JvCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c3J2LCA5MDY2N30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzcnYKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzcncsIDkwNjkwfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnNydworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnN1YmN1cSwgOTA3MTN9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192c3ViY3VxCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c3ViY3V3LCA5MDczOX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJjdXcKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzdWJlY3VxLCA5MDc2NX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJlY3VxCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c3ViZXVxbSwgOTA3OTJ9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192c3ViZXVxbQorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnN1YnNicywgOTA4MTl9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192c3Vic2JzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c3Vic2hzLCA5MDg0NX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJzaHMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzdWJzd3MsIDkwODcxfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnN1YnN3cworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnN1YnVicywgOTA4OTd9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192c3VidWJzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c3VidWhzLCA5MDkyM30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdWJ1aHMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzdWJ1d3MsIDkwOTQ5fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnN1YnV3cworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnN1bTJzd3MsIDkwOTc1fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnN1bTJzd3MKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzdW00c2JzLCA5MTAwMn0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3ZzdW00c2JzCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192c3VtNHNocywgOTEwMjl9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192c3VtNHNocworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnN1bTR1YnMsIDkxMDU2fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnN1bTR1YnMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3ZzdW1zd3MsIDkxMDgzfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnN1bXN3cworICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnVwa2hweCwgOTExMDl9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192dXBraHB4CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192dXBraHNiLCA5MTEzNX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtoc2IKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3Z1cGtoc2gsIDkxMTYxfSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnVwa2hzaAorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnVwa2hzdywgOTExODd9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192dXBraHN3CisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192dXBrbHB4LCA5MTIxM30sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtscHgKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19hbHRpdmVjX3Z1cGtsc2IsIDkxMjM5fSwgLy8gX19idWlsdGluX2FsdGl2ZWNfdnVwa2xzYgorICAgICAge0ludHJpbnNpYzo6cHBjX2FsdGl2ZWNfdnVwa2xzaCwgOTEyNjV9LCAvLyBfX2J1aWx0aW5fYWx0aXZlY192dXBrbHNoCisgICAgICB7SW50cmluc2ljOjpwcGNfYWx0aXZlY192dXBrbHN3LCA5MTI5MX0sIC8vIF9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtsc3cKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19icGVybWQsIDkxMzE3fSwgLy8gX19idWlsdGluX2JwZXJtZAorICAgICAge0ludHJpbnNpYzo6cHBjX2RpdmRlLCA5MTMzNH0sIC8vIF9fYnVpbHRpbl9kaXZkZQorICAgICAge0ludHJpbnNpYzo6cHBjX2RpdmRldSwgOTEzNTB9LCAvLyBfX2J1aWx0aW5fZGl2ZGV1CisgICAgICB7SW50cmluc2ljOjpwcGNfZGl2d2UsIDkxMzY3fSwgLy8gX19idWlsdGluX2RpdndlCisgICAgICB7SW50cmluc2ljOjpwcGNfZGl2d2V1LCA5MTM4M30sIC8vIF9fYnVpbHRpbl9kaXZ3ZXUKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19nZXRfdGV4YXNyLCA5MTQwMH0sIC8vIF9fYnVpbHRpbl9nZXRfdGV4YXNyCisgICAgICB7SW50cmluc2ljOjpwcGNfZ2V0X3RleGFzcnUsIDkxNDIxfSwgLy8gX19idWlsdGluX2dldF90ZXhhc3J1CisgICAgICB7SW50cmluc2ljOjpwcGNfZ2V0X3RmaGFyLCA5MTQ0M30sIC8vIF9fYnVpbHRpbl9nZXRfdGZoYXIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19nZXRfdGZpYXIsIDkxNDYzfSwgLy8gX19idWlsdGluX2dldF90ZmlhcgorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZhYnMsIDkxNDgzfSwgLy8gX19idWlsdGluX3FweF9xdmZhYnMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmYWRkLCA5MTUwNH0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmYWRkCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZmFkZHMsIDkxNTI1fSwgLy8gX19idWlsdGluX3FweF9xdmZhZGRzCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZmNmaWQsIDkxNTQ3fSwgLy8gX19idWlsdGluX3FweF9xdmZjZmlkCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZmNmaWRzLCA5MTU2OX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmY2ZpZHMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmY2ZpZHUsIDkxNTkyfSwgLy8gX19idWlsdGluX3FweF9xdmZjZmlkdQorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZjZmlkdXMsIDkxNjE1fSwgLy8gX19idWlsdGluX3FweF9xdmZjZmlkdXMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmY21wZXEsIDkxNjM5fSwgLy8gX19idWlsdGluX3FweF9xdmZjbXBlcQorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZjbXBndCwgOTE2NjJ9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZmNtcGd0CisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZmNtcGx0LCA5MTY4NX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmY21wbHQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmY3BzZ24sIDkxNzA4fSwgLy8gX19idWlsdGluX3FweF9xdmZjcHNnbgorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZjdGlkLCA5MTczMX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmY3RpZAorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZjdGlkdSwgOTE3NTN9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZmN0aWR1CisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZmN0aWR1eiwgOTE3NzZ9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZmN0aWR1egorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZjdGlkeiwgOTE4MDB9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZmN0aWR6CisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZmN0aXcsIDkxODIzfSwgLy8gX19idWlsdGluX3FweF9xdmZjdGl3CisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZmN0aXd1LCA5MTg0NX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmY3Rpd3UKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmY3Rpd3V6LCA5MTg2OH0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmY3Rpd3V6CisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZmN0aXd6LCA5MTg5Mn0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmY3Rpd3oKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmbG9naWNhbCwgOTE5MTV9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZmxvZ2ljYWwKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmbWFkZCwgOTE5NDB9LCAvLyBfX2J1aWx0aW5fcXB4X3F2Zm1hZGQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmbWFkZHMsIDkxOTYyfSwgLy8gX19idWlsdGluX3FweF9xdmZtYWRkcworICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZtc3ViLCA5MTk4NX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmbXN1YgorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZtc3VicywgOTIwMDd9LCAvLyBfX2J1aWx0aW5fcXB4X3F2Zm1zdWJzCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2Zm11bCwgOTIwMzB9LCAvLyBfX2J1aWx0aW5fcXB4X3F2Zm11bAorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZtdWxzLCA5MjA1MX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmbXVscworICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZuYWJzLCA5MjA3M30sIC8vIF9fYnVpbHRpbl9xcHhfcXZmbmFicworICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZuZWcsIDkyMDk1fSwgLy8gX19idWlsdGluX3FweF9xdmZuZWcKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmbm1hZGQsIDkyMTE2fSwgLy8gX19idWlsdGluX3FweF9xdmZubWFkZAorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZubWFkZHMsIDkyMTM5fSwgLy8gX19idWlsdGluX3FweF9xdmZubWFkZHMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmbm1zdWIsIDkyMTYzfSwgLy8gX19idWlsdGluX3FweF9xdmZubXN1YgorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZubXN1YnMsIDkyMTg2fSwgLy8gX19idWlsdGluX3FweF9xdmZubXN1YnMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmcGVybSwgOTIyMTB9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZnBlcm0KKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmcmUsIDkyMjMyfSwgLy8gX19idWlsdGluX3FweF9xdmZyZQorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZyZXMsIDkyMjUyfSwgLy8gX19idWlsdGluX3FweF9xdmZyZXMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmcmltLCA5MjI3M30sIC8vIF9fYnVpbHRpbl9xcHhfcXZmcmltCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZnJpbiwgOTIyOTR9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZnJpbgorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZyaXAsIDkyMzE1fSwgLy8gX19idWlsdGluX3FweF9xdmZyaXAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmcml6LCA5MjMzNn0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmcml6CisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZnJzcCwgOTIzNTd9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZnJzcAorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZyc3FydGUsIDkyMzc4fSwgLy8gX19idWlsdGluX3FweF9xdmZyc3FydGUKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmcnNxcnRlcywgOTI0MDJ9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZnJzcXJ0ZXMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmc2VsLCA5MjQyN30sIC8vIF9fYnVpbHRpbl9xcHhfcXZmc2VsCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2ZnN1YiwgOTI0NDh9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZnN1YgorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZzdWJzLCA5MjQ2OX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmc3VicworICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZ0c3RuYW4sIDkyNDkxfSwgLy8gX19idWlsdGluX3FweF9xdmZ0c3RuYW4KKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmeG1hZGQsIDkyNTE1fSwgLy8gX19idWlsdGluX3FweF9xdmZ4bWFkZAorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZ4bWFkZHMsIDkyNTM4fSwgLy8gX19idWlsdGluX3FweF9xdmZ4bWFkZHMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmeG11bCwgOTI1NjJ9LCAvLyBfX2J1aWx0aW5fcXB4X3F2ZnhtdWwKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmeG11bHMsIDkyNTg0fSwgLy8gX19idWlsdGluX3FweF9xdmZ4bXVscworICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmZ4eGNwbm1hZGQsIDkyNjA3fSwgLy8gX19idWlsdGluX3FweF9xdmZ4eGNwbm1hZGQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmeHhjcG5tYWRkcywgOTI2MzR9LCAvLyBfX2J1aWx0aW5fcXB4X3F2Znh4Y3BubWFkZHMKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmeHhtYWRkLCA5MjY2Mn0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmeHhtYWRkCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2Znh4bWFkZHMsIDkyNjg2fSwgLy8gX19idWlsdGluX3FweF9xdmZ4eG1hZGRzCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2Znh4bnBtYWRkLCA5MjcxMX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZmeHhucG1hZGQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZmeHhucG1hZGRzLCA5MjczN30sIC8vIF9fYnVpbHRpbl9xcHhfcXZmeHhucG1hZGRzCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2Z3BjaSwgOTI3NjR9LCAvLyBfX2J1aWx0aW5fcXB4X3F2Z3BjaQorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmxmY2QsIDkyNzg1fSwgLy8gX19idWlsdGluX3FweF9xdmxmY2QKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZsZmNkYSwgOTI4MDZ9LCAvLyBfX2J1aWx0aW5fcXB4X3F2bGZjZGEKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZsZmNzLCA5MjgyOH0sIC8vIF9fYnVpbHRpbl9xcHhfcXZsZmNzCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2bGZjc2EsIDkyODQ5fSwgLy8gX19idWlsdGluX3FweF9xdmxmY3NhCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2bGZkLCA5Mjg3MX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZsZmQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZsZmRhLCA5Mjg5MX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZsZmRhCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2bGZpd2EsIDkyOTEyfSwgLy8gX19idWlsdGluX3FweF9xdmxmaXdhCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2bGZpd2FhLCA5MjkzNH0sIC8vIF9fYnVpbHRpbl9xcHhfcXZsZml3YWEKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZsZml3eiwgOTI5NTd9LCAvLyBfX2J1aWx0aW5fcXB4X3F2bGZpd3oKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZsZml3emEsIDkyOTc5fSwgLy8gX19idWlsdGluX3FweF9xdmxmaXd6YQorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmxmcywgOTMwMDJ9LCAvLyBfX2J1aWx0aW5fcXB4X3F2bGZzCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2bGZzYSwgOTMwMjJ9LCAvLyBfX2J1aWx0aW5fcXB4X3F2bGZzYQorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmxwY2xkLCA5MzA0M30sIC8vIF9fYnVpbHRpbl9xcHhfcXZscGNsZAorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmxwY2xzLCA5MzA2NX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZscGNscworICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmxwY3JkLCA5MzA4N30sIC8vIF9fYnVpbHRpbl9xcHhfcXZscGNyZAorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdmxwY3JzLCA5MzEwOX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZscGNycworICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdnN0ZmNkLCA5MzEzMX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZzdGZjZAorICAgICAge0ludHJpbnNpYzo6cHBjX3FweF9xdnN0ZmNkYSwgOTMxNTN9LCAvLyBfX2J1aWx0aW5fcXB4X3F2c3RmY2RhCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2c3RmY3MsIDkzMTc2fSwgLy8gX19idWlsdGluX3FweF9xdnN0ZmNzCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2c3RmY3NhLCA5MzE5OH0sIC8vIF9fYnVpbHRpbl9xcHhfcXZzdGZjc2EKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZzdGZkLCA5MzIyMX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZzdGZkCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2c3RmZGEsIDkzMjQyfSwgLy8gX19idWlsdGluX3FweF9xdnN0ZmRhCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2c3RmaXcsIDkzMjY0fSwgLy8gX19idWlsdGluX3FweF9xdnN0Zml3CisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2c3RmaXdhLCA5MzI4Nn0sIC8vIF9fYnVpbHRpbl9xcHhfcXZzdGZpd2EKKyAgICAgIHtJbnRyaW5zaWM6OnBwY19xcHhfcXZzdGZzLCA5MzMwOX0sIC8vIF9fYnVpbHRpbl9xcHhfcXZzdGZzCisgICAgICB7SW50cmluc2ljOjpwcGNfcXB4X3F2c3Rmc2EsIDkzMzMwfSwgLy8gX19idWlsdGluX3FweF9xdnN0ZnNhCisgICAgICB7SW50cmluc2ljOjpwcGNfc2V0X3RleGFzciwgOTMzNTJ9LCAvLyBfX2J1aWx0aW5fc2V0X3RleGFzcgorICAgICAge0ludHJpbnNpYzo6cHBjX3NldF90ZXhhc3J1LCA5MzM3M30sIC8vIF9fYnVpbHRpbl9zZXRfdGV4YXNydQorICAgICAge0ludHJpbnNpYzo6cHBjX3NldF90ZmhhciwgOTMzOTV9LCAvLyBfX2J1aWx0aW5fc2V0X3RmaGFyCisgICAgICB7SW50cmluc2ljOjpwcGNfc2V0X3RmaWFyLCA5MzQxNX0sIC8vIF9fYnVpbHRpbl9zZXRfdGZpYXIKKyAgICAgIHtJbnRyaW5zaWM6OnBwY190YWJvcnQsIDkzNDM1fSwgLy8gX19idWlsdGluX3RhYm9ydAorICAgICAge0ludHJpbnNpYzo6cHBjX3RhYm9ydGRjLCA5MzQ1Mn0sIC8vIF9fYnVpbHRpbl90YWJvcnRkYworICAgICAge0ludHJpbnNpYzo6cHBjX3RhYm9ydGRjaSwgOTM0NzF9LCAvLyBfX2J1aWx0aW5fdGFib3J0ZGNpCisgICAgICB7SW50cmluc2ljOjpwcGNfdGFib3J0d2MsIDkzNDkxfSwgLy8gX19idWlsdGluX3RhYm9ydHdjCisgICAgICB7SW50cmluc2ljOjpwcGNfdGFib3J0d2NpLCA5MzUxMH0sIC8vIF9fYnVpbHRpbl90YWJvcnR3Y2kKKyAgICAgIHtJbnRyaW5zaWM6OnBwY190YmVnaW4sIDkzNTMwfSwgLy8gX19idWlsdGluX3RiZWdpbgorICAgICAge0ludHJpbnNpYzo6cHBjX3RjaGVjaywgOTM1NDd9LCAvLyBfX2J1aWx0aW5fdGNoZWNrCisgICAgICB7SW50cmluc2ljOjpwcGNfdGVuZCwgOTM1NjR9LCAvLyBfX2J1aWx0aW5fdGVuZAorICAgICAge0ludHJpbnNpYzo6cHBjX3RlbmRhbGwsIDkzNTc5fSwgLy8gX19idWlsdGluX3RlbmRhbGwKKyAgICAgIHtJbnRyaW5zaWM6OnBwY190cmVjaGtwdCwgOTM1OTd9LCAvLyBfX2J1aWx0aW5fdHJlY2hrcHQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY190cmVjbGFpbSwgOTM2MTZ9LCAvLyBfX2J1aWx0aW5fdHJlY2xhaW0KKyAgICAgIHtJbnRyaW5zaWM6OnBwY190cmVzdW1lLCA5MzYzNX0sIC8vIF9fYnVpbHRpbl90cmVzdW1lCisgICAgICB7SW50cmluc2ljOjpwcGNfdHNyLCA5MzY1M30sIC8vIF9fYnVpbHRpbl90c3IKKyAgICAgIHtJbnRyaW5zaWM6OnBwY190c3VzcGVuZCwgOTM2Njd9LCAvLyBfX2J1aWx0aW5fdHN1c3BlbmQKKyAgICAgIHtJbnRyaW5zaWM6OnBwY190dGVzdCwgOTM2ODZ9LCAvLyBfX2J1aWx0aW5fdHRlc3QKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHNtYXhkcCwgOTM3MDJ9LCAvLyBfX2J1aWx0aW5fdnN4X3hzbWF4ZHAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHNtaW5kcCwgOTM3MjR9LCAvLyBfX2J1aWx0aW5fdnN4X3hzbWluZHAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZjbXBlcWRwLCA5Mzc0Nn0sIC8vIF9fYnVpbHRpbl92c3hfeHZjbXBlcWRwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2Y21wZXFkcF9wLCA5Mzc3MH0sIC8vIF9fYnVpbHRpbl92c3hfeHZjbXBlcWRwX3AKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZjbXBlcXNwLCA5Mzc5Nn0sIC8vIF9fYnVpbHRpbl92c3hfeHZjbXBlcXNwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2Y21wZXFzcF9wLCA5MzgyMH0sIC8vIF9fYnVpbHRpbl92c3hfeHZjbXBlcXNwX3AKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZjbXBnZWRwLCA5Mzg0Nn0sIC8vIF9fYnVpbHRpbl92c3hfeHZjbXBnZWRwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2Y21wZ2VkcF9wLCA5Mzg3MH0sIC8vIF9fYnVpbHRpbl92c3hfeHZjbXBnZWRwX3AKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZjbXBnZXNwLCA5Mzg5Nn0sIC8vIF9fYnVpbHRpbl92c3hfeHZjbXBnZXNwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2Y21wZ2VzcF9wLCA5MzkyMH0sIC8vIF9fYnVpbHRpbl92c3hfeHZjbXBnZXNwX3AKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZjbXBndGRwLCA5Mzk0Nn0sIC8vIF9fYnVpbHRpbl92c3hfeHZjbXBndGRwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2Y21wZ3RkcF9wLCA5Mzk3MH0sIC8vIF9fYnVpbHRpbl92c3hfeHZjbXBndGRwX3AKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZjbXBndHNwLCA5Mzk5Nn0sIC8vIF9fYnVpbHRpbl92c3hfeHZjbXBndHNwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2Y21wZ3RzcF9wLCA5NDAyMH0sIC8vIF9fYnVpbHRpbl92c3hfeHZjbXBndHNwX3AKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZjdmRwc3AsIDk0MDQ2fSwgLy8gX19idWlsdGluX3ZzeF94dmN2ZHBzcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dmN2ZHBzeHdzLCA5NDA2OX0sIC8vIF9fYnVpbHRpbl92c3hfeHZjdmRwc3h3cworICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dmN2ZHB1eHdzLCA5NDA5NH0sIC8vIF9fYnVpbHRpbl92c3hfeHZjdmRwdXh3cworICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dmN2aHBzcCwgOTQxMTl9LCAvLyBfX2J1aWx0aW5fdnN4X3h2Y3ZocHNwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2Y3ZzcGRwLCA5NDE0Mn0sIC8vIF9fYnVpbHRpbl92c3hfeHZjdnNwZHAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZjdnNwaHAsIDk0MTY1fSwgLy8gX19idWlsdGluX3ZzeF94dmN2c3BocAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dmN2c3hkc3AsIDk0MTg4fSwgLy8gX19idWlsdGluX3ZzeF94dmN2c3hkc3AKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZjdnN4d2RwLCA5NDIxMn0sIC8vIF9fYnVpbHRpbl92c3hfeHZjdnN4d2RwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2Y3Z1eGRzcCwgOTQyMzZ9LCAvLyBfX2J1aWx0aW5fdnN4X3h2Y3Z1eGRzcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dmN2dXh3ZHAsIDk0MjYwfSwgLy8gX19idWlsdGluX3ZzeF94dmN2dXh3ZHAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZkaXZkcCwgOTQyODR9LCAvLyBfX2J1aWx0aW5fdnN4X3h2ZGl2ZHAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZkaXZzcCwgOTQzMDZ9LCAvLyBfX2J1aWx0aW5fdnN4X3h2ZGl2c3AKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZpZXhwZHAsIDk0MzI4fSwgLy8gX19idWlsdGluX3ZzeF94dmlleHBkcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dmlleHBzcCwgOTQzNTF9LCAvLyBfX2J1aWx0aW5fdnN4X3h2aWV4cHNwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2bWF4ZHAsIDk0Mzc0fSwgLy8gX19idWlsdGluX3ZzeF94dm1heGRwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2bWF4c3AsIDk0Mzk2fSwgLy8gX19idWlsdGluX3ZzeF94dm1heHNwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2bWluZHAsIDk0NDE4fSwgLy8gX19idWlsdGluX3ZzeF94dm1pbmRwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2bWluc3AsIDk0NDQwfSwgLy8gX19idWlsdGluX3ZzeF94dm1pbnNwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2cmVkcCwgOTQ0NjJ9LCAvLyBfX2J1aWx0aW5fdnN4X3h2cmVkcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dnJlc3AsIDk0NDgzfSwgLy8gX19idWlsdGluX3ZzeF94dnJlc3AKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZyc3FydGVkcCwgOTQ1MDR9LCAvLyBfX2J1aWx0aW5fdnN4X3h2cnNxcnRlZHAKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZyc3FydGVzcCwgOTQ1Mjl9LCAvLyBfX2J1aWx0aW5fdnN4X3h2cnNxcnRlc3AKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZ0c3RkY2RwLCA5NDU1NH0sIC8vIF9fYnVpbHRpbl92c3hfeHZ0c3RkY2RwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2dHN0ZGNzcCwgOTQ1Nzh9LCAvLyBfX2J1aWx0aW5fdnN4X3h2dHN0ZGNzcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dnhleHBkcCwgOTQ2MDJ9LCAvLyBfX2J1aWx0aW5fdnN4X3h2eGV4cGRwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h2eGV4cHNwLCA5NDYyNX0sIC8vIF9fYnVpbHRpbl92c3hfeHZ4ZXhwc3AKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHZ4c2lnZHAsIDk0NjQ4fSwgLy8gX19idWlsdGluX3ZzeF94dnhzaWdkcAorICAgICAge0ludHJpbnNpYzo6cHBjX3ZzeF94dnhzaWdzcCwgOTQ2NzF9LCAvLyBfX2J1aWx0aW5fdnN4X3h2eHNpZ3NwCisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h4ZXh0cmFjdHV3LCA5NDY5NH0sIC8vIF9fYnVpbHRpbl92c3hfeHhleHRyYWN0dXcKKyAgICAgIHtJbnRyaW5zaWM6OnBwY192c3hfeHhpbnNlcnR3LCA5NDcyMH0sIC8vIF9fYnVpbHRpbl92c3hfeHhpbnNlcnR3CisgICAgICB7SW50cmluc2ljOjpwcGNfdnN4X3h4bGVxdiwgOTQ3NDR9LCAvLyBfX2J1aWx0aW5fdnN4X3h4bGVxdgorICAgIH07CisgICAgYXV0byBJID0gc3RkOjpsb3dlcl9ib3VuZChzdGQ6OmJlZ2luKHBwY05hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZW5kKHBwY05hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0aW5OYW1lU3RyKTsKKyAgICBpZiAoSSAhPSBzdGQ6OmVuZChwcGNOYW1lcykgJiYKKyAgICAgICAgSS0+Z2V0TmFtZSgpID09IEJ1aWx0aW5OYW1lU3RyKQorICAgICAgcmV0dXJuIEktPkludHJpbklEOworICB9CisgIGlmIChUYXJnZXRQcmVmaXggPT0gInI2MDAiKSB7CisgICAgc3RhdGljIGNvbnN0IEJ1aWx0aW5FbnRyeSByNjAwTmFtZXNbXSA9IHsKKyAgICAgIHtJbnRyaW5zaWM6OnI2MDBfZ3JvdXBfYmFycmllciwgOTQ3NjV9LCAvLyBfX2J1aWx0aW5fcjYwMF9ncm91cF9iYXJyaWVyCisgICAgICB7SW50cmluc2ljOjpyNjAwX2ltcGxpY2l0YXJnX3B0ciwgOTQ3OTR9LCAvLyBfX2J1aWx0aW5fcjYwMF9pbXBsaWNpdGFyZ19wdHIKKyAgICAgIHtJbnRyaW5zaWM6OnI2MDBfcmF0X3N0b3JlX3R5cGVkLCA5NDgyNX0sIC8vIF9fYnVpbHRpbl9yNjAwX3JhdF9zdG9yZV90eXBlZAorICAgICAge0ludHJpbnNpYzo6cjYwMF9yZWFkX2dsb2JhbF9zaXplX3gsIDk0ODU2fSwgLy8gX19idWlsdGluX3I2MDBfcmVhZF9nbG9iYWxfc2l6ZV94CisgICAgICB7SW50cmluc2ljOjpyNjAwX3JlYWRfZ2xvYmFsX3NpemVfeSwgOTQ4OTB9LCAvLyBfX2J1aWx0aW5fcjYwMF9yZWFkX2dsb2JhbF9zaXplX3kKKyAgICAgIHtJbnRyaW5zaWM6OnI2MDBfcmVhZF9nbG9iYWxfc2l6ZV96LCA5NDkyNH0sIC8vIF9fYnVpbHRpbl9yNjAwX3JlYWRfZ2xvYmFsX3NpemVfegorICAgICAge0ludHJpbnNpYzo6cjYwMF9yZWFkX25ncm91cHNfeCwgOTQ5NTh9LCAvLyBfX2J1aWx0aW5fcjYwMF9yZWFkX25ncm91cHNfeAorICAgICAge0ludHJpbnNpYzo6cjYwMF9yZWFkX25ncm91cHNfeSwgOTQ5ODh9LCAvLyBfX2J1aWx0aW5fcjYwMF9yZWFkX25ncm91cHNfeQorICAgICAge0ludHJpbnNpYzo6cjYwMF9yZWFkX25ncm91cHNfeiwgOTUwMTh9LCAvLyBfX2J1aWx0aW5fcjYwMF9yZWFkX25ncm91cHNfegorICAgICAge0ludHJpbnNpYzo6cjYwMF9yZWFkX3RnaWRfeCwgOTUwNDh9LCAvLyBfX2J1aWx0aW5fcjYwMF9yZWFkX3RnaWRfeAorICAgICAge0ludHJpbnNpYzo6cjYwMF9yZWFkX3RnaWRfeSwgOTUwNzV9LCAvLyBfX2J1aWx0aW5fcjYwMF9yZWFkX3RnaWRfeQorICAgICAge0ludHJpbnNpYzo6cjYwMF9yZWFkX3RnaWRfeiwgOTUxMDJ9LCAvLyBfX2J1aWx0aW5fcjYwMF9yZWFkX3RnaWRfegorICAgIH07CisgICAgYXV0byBJID0gc3RkOjpsb3dlcl9ib3VuZChzdGQ6OmJlZ2luKHI2MDBOYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZChyNjAwTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbHRpbk5hbWVTdHIpOworICAgIGlmIChJICE9IHN0ZDo6ZW5kKHI2MDBOYW1lcykgJiYKKyAgICAgICAgSS0+Z2V0TmFtZSgpID09IEJ1aWx0aW5OYW1lU3RyKQorICAgICAgcmV0dXJuIEktPkludHJpbklEOworICB9CisgIGlmIChUYXJnZXRQcmVmaXggPT0gInMzOTAiKSB7CisgICAgc3RhdGljIGNvbnN0IEJ1aWx0aW5FbnRyeSBzMzkwTmFtZXNbXSA9IHsKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfZWZwYywgOTUxMjl9LCAvLyBfX2J1aWx0aW5fczM5MF9lZnBjCisgICAgICB7SW50cmluc2ljOjpzMzkwX2xjYmIsIDk1MTc2fSwgLy8gX19idWlsdGluX3MzOTBfbGNiYgorICAgICAge0ludHJpbnNpYzo6czM5MF9zZnBjLCA5NTIxNn0sIC8vIF9fYnVpbHRpbl9zMzkwX3NmcGMKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmFjY2IsIDk1MjM2fSwgLy8gX19idWlsdGluX3MzOTBfdmFjY2IKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmFjY2NxLCA5NTI1N30sIC8vIF9fYnVpbHRpbl9zMzkwX3ZhY2NjcQorICAgICAge0ludHJpbnNpYzo6czM5MF92YWNjZiwgOTUyNzl9LCAvLyBfX2J1aWx0aW5fczM5MF92YWNjZgorICAgICAge0ludHJpbnNpYzo6czM5MF92YWNjZywgOTUzMDB9LCAvLyBfX2J1aWx0aW5fczM5MF92YWNjZworICAgICAge0ludHJpbnNpYzo6czM5MF92YWNjaCwgOTUzMjF9LCAvLyBfX2J1aWx0aW5fczM5MF92YWNjaAorICAgICAge0ludHJpbnNpYzo6czM5MF92YWNjcSwgOTUzNDJ9LCAvLyBfX2J1aWx0aW5fczM5MF92YWNjcQorICAgICAge0ludHJpbnNpYzo6czM5MF92YWNxLCA5NTM2M30sIC8vIF9fYnVpbHRpbl9zMzkwX3ZhY3EKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmFxLCA5NTM4M30sIC8vIF9fYnVpbHRpbl9zMzkwX3ZhcQorICAgICAge0ludHJpbnNpYzo6czM5MF92YXZnYiwgOTU0MDJ9LCAvLyBfX2J1aWx0aW5fczM5MF92YXZnYgorICAgICAge0ludHJpbnNpYzo6czM5MF92YXZnZiwgOTU0MjN9LCAvLyBfX2J1aWx0aW5fczM5MF92YXZnZgorICAgICAge0ludHJpbnNpYzo6czM5MF92YXZnZywgOTU0NDR9LCAvLyBfX2J1aWx0aW5fczM5MF92YXZnZworICAgICAge0ludHJpbnNpYzo6czM5MF92YXZnaCwgOTU0NjV9LCAvLyBfX2J1aWx0aW5fczM5MF92YXZnaAorICAgICAge0ludHJpbnNpYzo6czM5MF92YXZnbGIsIDk1NDg2fSwgLy8gX19idWlsdGluX3MzOTBfdmF2Z2xiCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZhdmdsZiwgOTU1MDh9LCAvLyBfX2J1aWx0aW5fczM5MF92YXZnbGYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmF2Z2xnLCA5NTUzMH0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZhdmdsZworICAgICAge0ludHJpbnNpYzo6czM5MF92YXZnbGgsIDk1NTUyfSwgLy8gX19idWlsdGluX3MzOTBfdmF2Z2xoCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZicGVybSwgOTU1NzR9LCAvLyBfX2J1aWx0aW5fczM5MF92YnBlcm0KKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmNrc20sIDk1NTk2fSwgLy8gX19idWlsdGluX3MzOTBfdmNrc20KKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmVyaW1iLCA5NTYxN30sIC8vIF9fYnVpbHRpbl9zMzkwX3ZlcmltYgorICAgICAge0ludHJpbnNpYzo6czM5MF92ZXJpbWYsIDk1NjM5fSwgLy8gX19idWlsdGluX3MzOTBfdmVyaW1mCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZlcmltZywgOTU2NjF9LCAvLyBfX2J1aWx0aW5fczM5MF92ZXJpbWcKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmVyaW1oLCA5NTY4M30sIC8vIF9fYnVpbHRpbl9zMzkwX3ZlcmltaAorICAgICAge0ludHJpbnNpYzo6czM5MF92ZXJsbGIsIDk1NzA1fSwgLy8gX19idWlsdGluX3MzOTBfdmVybGxiCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZlcmxsZiwgOTU3Mjd9LCAvLyBfX2J1aWx0aW5fczM5MF92ZXJsbGYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmVybGxnLCA5NTc0OX0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZlcmxsZworICAgICAge0ludHJpbnNpYzo6czM5MF92ZXJsbGgsIDk1NzcxfSwgLy8gX19idWlsdGluX3MzOTBfdmVybGxoCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZlcmxsdmIsIDk1NzkzfSwgLy8gX19idWlsdGluX3MzOTBfdmVybGx2YgorICAgICAge0ludHJpbnNpYzo6czM5MF92ZXJsbHZmLCA5NTgxNn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZlcmxsdmYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmVybGx2ZywgOTU4Mzl9LCAvLyBfX2J1aWx0aW5fczM5MF92ZXJsbHZnCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZlcmxsdmgsIDk1ODYyfSwgLy8gX19idWlsdGluX3MzOTBfdmVybGx2aAorICAgICAge0ludHJpbnNpYzo6czM5MF92ZmFlYiwgOTU4ODV9LCAvLyBfX2J1aWx0aW5fczM5MF92ZmFlYgorICAgICAge0ludHJpbnNpYzo6czM5MF92ZmFlZiwgOTU5MDZ9LCAvLyBfX2J1aWx0aW5fczM5MF92ZmFlZgorICAgICAge0ludHJpbnNpYzo6czM5MF92ZmFlaCwgOTU5Mjd9LCAvLyBfX2J1aWx0aW5fczM5MF92ZmFlaAorICAgICAge0ludHJpbnNpYzo6czM5MF92ZmFlemIsIDk1OTQ4fSwgLy8gX19idWlsdGluX3MzOTBfdmZhZXpiCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZmYWV6ZiwgOTU5NzB9LCAvLyBfX2J1aWx0aW5fczM5MF92ZmFlemYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmZhZXpoLCA5NTk5Mn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZmYWV6aAorICAgICAge0ludHJpbnNpYzo6czM5MF92ZmVlYiwgOTYwMTR9LCAvLyBfX2J1aWx0aW5fczM5MF92ZmVlYgorICAgICAge0ludHJpbnNpYzo6czM5MF92ZmVlZiwgOTYwMzV9LCAvLyBfX2J1aWx0aW5fczM5MF92ZmVlZgorICAgICAge0ludHJpbnNpYzo6czM5MF92ZmVlaCwgOTYwNTZ9LCAvLyBfX2J1aWx0aW5fczM5MF92ZmVlaAorICAgICAge0ludHJpbnNpYzo6czM5MF92ZmVlemIsIDk2MDc3fSwgLy8gX19idWlsdGluX3MzOTBfdmZlZXpiCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZmZWV6ZiwgOTYwOTl9LCAvLyBfX2J1aWx0aW5fczM5MF92ZmVlemYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmZlZXpoLCA5NjEyMX0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZmZWV6aAorICAgICAge0ludHJpbnNpYzo6czM5MF92ZmVuZWIsIDk2MTQzfSwgLy8gX19idWlsdGluX3MzOTBfdmZlbmViCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZmZW5lZiwgOTYxNjV9LCAvLyBfX2J1aWx0aW5fczM5MF92ZmVuZWYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmZlbmVoLCA5NjE4N30sIC8vIF9fYnVpbHRpbl9zMzkwX3ZmZW5laAorICAgICAge0ludHJpbnNpYzo6czM5MF92ZmVuZXpiLCA5NjIwOX0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZmZW5lemIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmZlbmV6ZiwgOTYyMzJ9LCAvLyBfX2J1aWx0aW5fczM5MF92ZmVuZXpmCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZmZW5lemgsIDk2MjU1fSwgLy8gX19idWlsdGluX3MzOTBfdmZlbmV6aAorICAgICAge0ludHJpbnNpYzo6czM5MF92Z2ZtYWIsIDk2Mjc4fSwgLy8gX19idWlsdGluX3MzOTBfdmdmbWFiCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZnZm1hZiwgOTYzMDB9LCAvLyBfX2J1aWx0aW5fczM5MF92Z2ZtYWYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmdmbWFnLCA5NjMyMn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZnZm1hZworICAgICAge0ludHJpbnNpYzo6czM5MF92Z2ZtYWgsIDk2MzQ0fSwgLy8gX19idWlsdGluX3MzOTBfdmdmbWFoCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZnZm1iLCA5NjM2Nn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZnZm1iCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZnZm1mLCA5NjM4N30sIC8vIF9fYnVpbHRpbl9zMzkwX3ZnZm1mCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZnZm1nLCA5NjQwOH0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZnZm1nCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZnZm1oLCA5NjQyOX0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZnZm1oCisgICAgICB7SW50cmluc2ljOjpzMzkwX3Zpc3RyYiwgOTY0NTB9LCAvLyBfX2J1aWx0aW5fczM5MF92aXN0cmIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdmlzdHJmLCA5NjQ3Mn0sIC8vIF9fYnVpbHRpbl9zMzkwX3Zpc3RyZgorICAgICAge0ludHJpbnNpYzo6czM5MF92aXN0cmgsIDk2NDk0fSwgLy8gX19idWlsdGluX3MzOTBfdmlzdHJoCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZsYmIsIDk2NTE2fSwgLy8gX19idWlsdGluX3MzOTBfdmxiYgorICAgICAge0ludHJpbnNpYzo6czM5MF92bGwsIDk2NTM2fSwgLy8gX19idWlsdGluX3MzOTBfdmxsCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZscmwsIDk2NTU1fSwgLy8gX19idWlsdGluX3MzOTBfdmxybAorICAgICAge0ludHJpbnNpYzo6czM5MF92bWFlYiwgOTY1NzV9LCAvLyBfX2J1aWx0aW5fczM5MF92bWFlYgorICAgICAge0ludHJpbnNpYzo6czM5MF92bWFlZiwgOTY1OTZ9LCAvLyBfX2J1aWx0aW5fczM5MF92bWFlZgorICAgICAge0ludHJpbnNpYzo6czM5MF92bWFlaCwgOTY2MTd9LCAvLyBfX2J1aWx0aW5fczM5MF92bWFlaAorICAgICAge0ludHJpbnNpYzo6czM5MF92bWFoYiwgOTY2Mzh9LCAvLyBfX2J1aWx0aW5fczM5MF92bWFoYgorICAgICAge0ludHJpbnNpYzo6czM5MF92bWFoZiwgOTY2NTl9LCAvLyBfX2J1aWx0aW5fczM5MF92bWFoZgorICAgICAge0ludHJpbnNpYzo6czM5MF92bWFoaCwgOTY2ODB9LCAvLyBfX2J1aWx0aW5fczM5MF92bWFoaAorICAgICAge0ludHJpbnNpYzo6czM5MF92bWFsZWIsIDk2NzAxfSwgLy8gX19idWlsdGluX3MzOTBfdm1hbGViCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZtYWxlZiwgOTY3MjN9LCAvLyBfX2J1aWx0aW5fczM5MF92bWFsZWYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1hbGVoLCA5Njc0NX0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZtYWxlaAorICAgICAge0ludHJpbnNpYzo6czM5MF92bWFsaGIsIDk2NzY3fSwgLy8gX19idWlsdGluX3MzOTBfdm1hbGhiCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZtYWxoZiwgOTY3ODl9LCAvLyBfX2J1aWx0aW5fczM5MF92bWFsaGYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1hbGhoLCA5NjgxMX0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZtYWxoaAorICAgICAge0ludHJpbnNpYzo6czM5MF92bWFsb2IsIDk2ODMzfSwgLy8gX19idWlsdGluX3MzOTBfdm1hbG9iCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZtYWxvZiwgOTY4NTV9LCAvLyBfX2J1aWx0aW5fczM5MF92bWFsb2YKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1hbG9oLCA5Njg3N30sIC8vIF9fYnVpbHRpbl9zMzkwX3ZtYWxvaAorICAgICAge0ludHJpbnNpYzo6czM5MF92bWFvYiwgOTY4OTl9LCAvLyBfX2J1aWx0aW5fczM5MF92bWFvYgorICAgICAge0ludHJpbnNpYzo6czM5MF92bWFvZiwgOTY5MjB9LCAvLyBfX2J1aWx0aW5fczM5MF92bWFvZgorICAgICAge0ludHJpbnNpYzo6czM5MF92bWFvaCwgOTY5NDF9LCAvLyBfX2J1aWx0aW5fczM5MF92bWFvaAorICAgICAge0ludHJpbnNpYzo6czM5MF92bWViLCA5Njk2Mn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZtZWIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1lZiwgOTY5ODJ9LCAvLyBfX2J1aWx0aW5fczM5MF92bWVmCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZtZWgsIDk3MDAyfSwgLy8gX19idWlsdGluX3MzOTBfdm1laAorICAgICAge0ludHJpbnNpYzo6czM5MF92bWhiLCA5NzAyMn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZtaGIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1oZiwgOTcwNDJ9LCAvLyBfX2J1aWx0aW5fczM5MF92bWhmCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZtaGgsIDk3MDYyfSwgLy8gX19idWlsdGluX3MzOTBfdm1oaAorICAgICAge0ludHJpbnNpYzo6czM5MF92bWxlYiwgOTcwODJ9LCAvLyBfX2J1aWx0aW5fczM5MF92bWxlYgorICAgICAge0ludHJpbnNpYzo6czM5MF92bWxlZiwgOTcxMDN9LCAvLyBfX2J1aWx0aW5fczM5MF92bWxlZgorICAgICAge0ludHJpbnNpYzo6czM5MF92bWxlaCwgOTcxMjR9LCAvLyBfX2J1aWx0aW5fczM5MF92bWxlaAorICAgICAge0ludHJpbnNpYzo6czM5MF92bWxoYiwgOTcxNDV9LCAvLyBfX2J1aWx0aW5fczM5MF92bWxoYgorICAgICAge0ludHJpbnNpYzo6czM5MF92bWxoZiwgOTcxNjZ9LCAvLyBfX2J1aWx0aW5fczM5MF92bWxoZgorICAgICAge0ludHJpbnNpYzo6czM5MF92bWxoaCwgOTcxODd9LCAvLyBfX2J1aWx0aW5fczM5MF92bWxoaAorICAgICAge0ludHJpbnNpYzo6czM5MF92bWxvYiwgOTcyMDh9LCAvLyBfX2J1aWx0aW5fczM5MF92bWxvYgorICAgICAge0ludHJpbnNpYzo6czM5MF92bWxvZiwgOTcyMjl9LCAvLyBfX2J1aWx0aW5fczM5MF92bWxvZgorICAgICAge0ludHJpbnNpYzo6czM5MF92bWxvaCwgOTcyNTB9LCAvLyBfX2J1aWx0aW5fczM5MF92bWxvaAorICAgICAge0ludHJpbnNpYzo6czM5MF92bW9iLCA5NzI3MX0sIC8vIF9fYnVpbHRpbl9zMzkwX3Ztb2IKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdm1vZiwgOTcyOTF9LCAvLyBfX2J1aWx0aW5fczM5MF92bW9mCisgICAgICB7SW50cmluc2ljOjpzMzkwX3Ztb2gsIDk3MzExfSwgLy8gX19idWlsdGluX3MzOTBfdm1vaAorICAgICAge0ludHJpbnNpYzo6czM5MF92bXNsZywgOTczMzF9LCAvLyBfX2J1aWx0aW5fczM5MF92bXNsZworICAgICAge0ludHJpbnNpYzo6czM5MF92cGRpLCA5NzM1Mn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZwZGkKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnBlcm0sIDk3MzcyfSwgLy8gX19idWlsdGluX3MzOTBfdnBlcm0KKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnBrbHNmLCA5NzM5M30sIC8vIF9fYnVpbHRpbl9zMzkwX3Zwa2xzZgorICAgICAge0ludHJpbnNpYzo6czM5MF92cGtsc2csIDk3NDE1fSwgLy8gX19idWlsdGluX3MzOTBfdnBrbHNnCisgICAgICB7SW50cmluc2ljOjpzMzkwX3Zwa2xzaCwgOTc0Mzd9LCAvLyBfX2J1aWx0aW5fczM5MF92cGtsc2gKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnBrc2YsIDk3NDU5fSwgLy8gX19idWlsdGluX3MzOTBfdnBrc2YKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnBrc2csIDk3NDgwfSwgLy8gX19idWlsdGluX3MzOTBfdnBrc2cKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnBrc2gsIDk3NTAxfSwgLy8gX19idWlsdGluX3MzOTBfdnBrc2gKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnNiY2JpcSwgOTc1MjJ9LCAvLyBfX2J1aWx0aW5fczM5MF92c2JjYmlxCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZzYmlxLCA5NzU0NX0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZzYmlxCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZzY2JpYiwgOTc1NjZ9LCAvLyBfX2J1aWx0aW5fczM5MF92c2NiaWIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnNjYmlmLCA5NzU4OH0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZzY2JpZgorICAgICAge0ludHJpbnNpYzo6czM5MF92c2NiaWcsIDk3NjEwfSwgLy8gX19idWlsdGluX3MzOTBfdnNjYmlnCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZzY2JpaCwgOTc2MzJ9LCAvLyBfX2J1aWx0aW5fczM5MF92c2NiaWgKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnNjYmlxLCA5NzY1NH0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZzY2JpcQorICAgICAge0ludHJpbnNpYzo6czM5MF92c2wsIDk3Njc2fSwgLy8gX19idWlsdGluX3MzOTBfdnNsCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZzbGIsIDk3Njk1fSwgLy8gX19idWlsdGluX3MzOTBfdnNsYgorICAgICAge0ludHJpbnNpYzo6czM5MF92c2xkYiwgOTc3MTV9LCAvLyBfX2J1aWx0aW5fczM5MF92c2xkYgorICAgICAge0ludHJpbnNpYzo6czM5MF92c3EsIDk3NzM2fSwgLy8gX19idWlsdGluX3MzOTBfdnNxCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZzcmEsIDk3NzU1fSwgLy8gX19idWlsdGluX3MzOTBfdnNyYQorICAgICAge0ludHJpbnNpYzo6czM5MF92c3JhYiwgOTc3NzV9LCAvLyBfX2J1aWx0aW5fczM5MF92c3JhYgorICAgICAge0ludHJpbnNpYzo6czM5MF92c3JsLCA5Nzc5Nn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZzcmwKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnNybGIsIDk3ODE2fSwgLy8gX19idWlsdGluX3MzOTBfdnNybGIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnN0bCwgOTc4Mzd9LCAvLyBfX2J1aWx0aW5fczM5MF92c3RsCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZzdHJjYiwgOTc4NTd9LCAvLyBfX2J1aWx0aW5fczM5MF92c3RyY2IKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnN0cmNmLCA5Nzg3OX0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZzdHJjZgorICAgICAge0ludHJpbnNpYzo6czM5MF92c3RyY2gsIDk3OTAxfSwgLy8gX19idWlsdGluX3MzOTBfdnN0cmNoCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZzdHJjemIsIDk3OTIzfSwgLy8gX19idWlsdGluX3MzOTBfdnN0cmN6YgorICAgICAge0ludHJpbnNpYzo6czM5MF92c3RyY3pmLCA5Nzk0Nn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZzdHJjemYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnN0cmN6aCwgOTc5Njl9LCAvLyBfX2J1aWx0aW5fczM5MF92c3RyY3poCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZzdHJsLCA5Nzk5Mn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZzdHJsCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZzdW1iLCA5ODAxM30sIC8vIF9fYnVpbHRpbl9zMzkwX3ZzdW1iCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZzdW1nZiwgOTgwMzR9LCAvLyBfX2J1aWx0aW5fczM5MF92c3VtZ2YKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnN1bWdoLCA5ODA1Nn0sIC8vIF9fYnVpbHRpbl9zMzkwX3ZzdW1naAorICAgICAge0ludHJpbnNpYzo6czM5MF92c3VtaCwgOTgwNzh9LCAvLyBfX2J1aWx0aW5fczM5MF92c3VtaAorICAgICAge0ludHJpbnNpYzo6czM5MF92c3VtcWYsIDk4MDk5fSwgLy8gX19idWlsdGluX3MzOTBfdnN1bXFmCisgICAgICB7SW50cmluc2ljOjpzMzkwX3ZzdW1xZywgOTgxMjF9LCAvLyBfX2J1aWx0aW5fczM5MF92c3VtcWcKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnRtLCA5ODE0M30sIC8vIF9fYnVpbHRpbl9zMzkwX3Z0bQorICAgICAge0ludHJpbnNpYzo6czM5MF92dXBoYiwgOTgxNjJ9LCAvLyBfX2J1aWx0aW5fczM5MF92dXBoYgorICAgICAge0ludHJpbnNpYzo6czM5MF92dXBoZiwgOTgxODN9LCAvLyBfX2J1aWx0aW5fczM5MF92dXBoZgorICAgICAge0ludHJpbnNpYzo6czM5MF92dXBoaCwgOTgyMDR9LCAvLyBfX2J1aWx0aW5fczM5MF92dXBoaAorICAgICAge0ludHJpbnNpYzo6czM5MF92dXBsYiwgOTgyMjV9LCAvLyBfX2J1aWx0aW5fczM5MF92dXBsYgorICAgICAge0ludHJpbnNpYzo6czM5MF92dXBsZiwgOTgyNDZ9LCAvLyBfX2J1aWx0aW5fczM5MF92dXBsZgorICAgICAge0ludHJpbnNpYzo6czM5MF92dXBsaGIsIDk4MjY3fSwgLy8gX19idWlsdGluX3MzOTBfdnVwbGhiCisgICAgICB7SW50cmluc2ljOjpzMzkwX3Z1cGxoZiwgOTgyODl9LCAvLyBfX2J1aWx0aW5fczM5MF92dXBsaGYKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnVwbGhoLCA5ODMxMX0sIC8vIF9fYnVpbHRpbl9zMzkwX3Z1cGxoaAorICAgICAge0ludHJpbnNpYzo6czM5MF92dXBsaHcsIDk4MzMzfSwgLy8gX19idWlsdGluX3MzOTBfdnVwbGh3CisgICAgICB7SW50cmluc2ljOjpzMzkwX3Z1cGxsYiwgOTgzNTV9LCAvLyBfX2J1aWx0aW5fczM5MF92dXBsbGIKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfdnVwbGxmLCA5ODM3N30sIC8vIF9fYnVpbHRpbl9zMzkwX3Z1cGxsZgorICAgICAge0ludHJpbnNpYzo6czM5MF92dXBsbGgsIDk4Mzk5fSwgLy8gX19idWlsdGluX3MzOTBfdnVwbGxoCisgICAgICB7SW50cmluc2ljOjpzMzkwX3RlbmQsIDkzNTY0fSwgLy8gX19idWlsdGluX3RlbmQKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfcHBhX3R4YXNzaXN0LCA5NTE5Nn0sIC8vIF9fYnVpbHRpbl90eF9hc3Npc3QKKyAgICAgIHtJbnRyaW5zaWM6OnMzOTBfZXRuZCwgOTUxNDl9LCAvLyBfX2J1aWx0aW5fdHhfbmVzdGluZ19kZXB0aAorICAgIH07CisgICAgYXV0byBJID0gc3RkOjpsb3dlcl9ib3VuZChzdGQ6OmJlZ2luKHMzOTBOYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZChzMzkwTmFtZXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbHRpbk5hbWVTdHIpOworICAgIGlmIChJICE9IHN0ZDo6ZW5kKHMzOTBOYW1lcykgJiYKKyAgICAgICAgSS0+Z2V0TmFtZSgpID09IEJ1aWx0aW5OYW1lU3RyKQorICAgICAgcmV0dXJuIEktPkludHJpbklEOworICB9CisgIGlmIChUYXJnZXRQcmVmaXggPT0gIng4NiIpIHsKKyAgICBzdGF0aWMgY29uc3QgQnVpbHRpbkVudHJ5IHg4Nk5hbWVzW10gPSB7CisgICAgICB7SW50cmluc2ljOjp4ODZfYWRkY2FycnlfdTMyLCA5ODkyOX0sIC8vIF9fYnVpbHRpbl9pYTMyX2FkZGNhcnJ5X3UzMgorICAgICAge0ludHJpbnNpYzo6eDg2X2FkZGNhcnJ5X3U2NCwgOTg5NTd9LCAvLyBfX2J1aWx0aW5faWEzMl9hZGRjYXJyeV91NjQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hZGRjYXJyeXhfdTMyLCA5ODk4NX0sIC8vIF9fYnVpbHRpbl9pYTMyX2FkZGNhcnJ5eF91MzIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hZGRjYXJyeXhfdTY0LCA5OTAxNH0sIC8vIF9fYnVpbHRpbl9pYTMyX2FkZGNhcnJ5eF91NjQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19hZGRfcGRfNTEyLCAxMDQ1NjZ9LCAvLyBfX2J1aWx0aW5faWEzMl9hZGRwZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfYWRkX3BzXzUxMiwgMTA0NTk1fSwgLy8gX19idWlsdGluX2lhMzJfYWRkcHM1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2FkZF9zZF9yb3VuZCwgMTA0NjI0fSwgLy8gX19idWlsdGluX2lhMzJfYWRkc2Rfcm91bmRfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2FkZF9zc19yb3VuZCwgMTA0NjU2fSwgLy8gX19idWlsdGluX2lhMzJfYWRkc3Nfcm91bmRfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTNfYWRkc3ViX3BkLCAxMzUwNTZ9LCAvLyBfX2J1aWx0aW5faWEzMl9hZGRzdWJwZAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9hZGRzdWJfcGRfMjU2LCA5OTQyNn0sIC8vIF9fYnVpbHRpbl9pYTMyX2FkZHN1YnBkMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlM19hZGRzdWJfcHMsIDEzNTA4MH0sIC8vIF9fYnVpbHRpbl9pYTMyX2FkZHN1YnBzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X2FkZHN1Yl9wc18yNTYsIDk5NDUzfSwgLy8gX19idWlsdGluX2lhMzJfYWRkc3VicHMyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hZXNuaV9hZXNkZWMsIDk5MDQzfSwgLy8gX19idWlsdGluX2lhMzJfYWVzZGVjMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYWVzbmlfYWVzZGVjXzI1NiwgOTkwNjh9LCAvLyBfX2J1aWx0aW5faWEzMl9hZXNkZWMyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hZXNuaV9hZXNkZWNfNTEyLCA5OTA5M30sIC8vIF9fYnVpbHRpbl9pYTMyX2Flc2RlYzUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X2Flc25pX2Flc2RlY2xhc3QsIDk5MTE4fSwgLy8gX19idWlsdGluX2lhMzJfYWVzZGVjbGFzdDEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2Flc25pX2Flc2RlY2xhc3RfMjU2LCA5OTE0N30sIC8vIF9fYnVpbHRpbl9pYTMyX2Flc2RlY2xhc3QyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hZXNuaV9hZXNkZWNsYXN0XzUxMiwgOTkxNzZ9LCAvLyBfX2J1aWx0aW5faWEzMl9hZXNkZWNsYXN0NTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfYWVzbmlfYWVzZW5jLCA5OTIwNX0sIC8vIF9fYnVpbHRpbl9pYTMyX2Flc2VuYzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2Flc25pX2Flc2VuY18yNTYsIDk5MjMwfSwgLy8gX19idWlsdGluX2lhMzJfYWVzZW5jMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYWVzbmlfYWVzZW5jXzUxMiwgOTkyNTV9LCAvLyBfX2J1aWx0aW5faWEzMl9hZXNlbmM1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hZXNuaV9hZXNlbmNsYXN0LCA5OTI4MH0sIC8vIF9fYnVpbHRpbl9pYTMyX2Flc2VuY2xhc3QxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hZXNuaV9hZXNlbmNsYXN0XzI1NiwgOTkzMDl9LCAvLyBfX2J1aWx0aW5faWEzMl9hZXNlbmNsYXN0MjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYWVzbmlfYWVzZW5jbGFzdF81MTIsIDk5MzM4fSwgLy8gX19idWlsdGluX2lhMzJfYWVzZW5jbGFzdDUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X2Flc25pX2Flc2ltYywgOTkzNjd9LCAvLyBfX2J1aWx0aW5faWEzMl9hZXNpbWMxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hZXNuaV9hZXNrZXlnZW5hc3Npc3QsIDk5MzkyfSwgLy8gX19idWlsdGluX2lhMzJfYWVza2V5Z2VuYXNzaXN0MTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYm1pX2JleHRyXzMyLCAxMjkzMjR9LCAvLyBfX2J1aWx0aW5faWEzMl9iZXh0cl91MzIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9ibWlfYmV4dHJfNjQsIDEyOTM0OX0sIC8vIF9fYnVpbHRpbl9pYTMyX2JleHRyX3U2NAorICAgICAge0ludHJpbnNpYzo6eDg2X3RibV9iZXh0cmlfdTMyLCAxMzY5NTh9LCAvLyBfX2J1aWx0aW5faWEzMl9iZXh0cmlfdTMyCisgICAgICB7SW50cmluc2ljOjp4ODZfdGJtX2JleHRyaV91NjQsIDEzNjk4NH0sIC8vIF9fYnVpbHRpbl9pYTMyX2JleHRyaV91NjQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0MV9ibGVuZHZwZCwgMTM1MjU3fSwgLy8gX19idWlsdGluX2lhMzJfYmxlbmR2cGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfYmxlbmR2X3BkXzI1NiwgOTk0ODB9LCAvLyBfX2J1aWx0aW5faWEzMl9ibGVuZHZwZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQxX2JsZW5kdnBzLCAxMzUyODF9LCAvLyBfX2J1aWx0aW5faWEzMl9ibGVuZHZwcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9ibGVuZHZfcHNfMjU2LCA5OTUwN30sIC8vIF9fYnVpbHRpbl9pYTMyX2JsZW5kdnBzMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2Jyb2FkY2FzdG1iXzEyOCwgMTAzMTE4fSwgLy8gX19idWlsdGluX2lhMzJfYnJvYWRjYXN0bWIxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfYnJvYWRjYXN0bWJfMjU2LCAxMDMxNDh9LCAvLyBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RtYjI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9icm9hZGNhc3RtYl81MTIsIDEwMzE3OH0sIC8vIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdG1iNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2Jyb2FkY2FzdG13XzEyOCwgMTAzMjA4fSwgLy8gX19idWlsdGluX2lhMzJfYnJvYWRjYXN0bXcxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfYnJvYWRjYXN0bXdfMjU2LCAxMDMyMzh9LCAvLyBfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RtdzI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9icm9hZGNhc3Rtd181MTIsIDEwMzI2OH0sIC8vIF9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdG13NTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfYm1pX2J6aGlfNjQsIDEyOTM5N30sIC8vIF9fYnVpbHRpbl9pYTMyX2J6aGlfZGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9ibWlfYnpoaV8zMiwgMTI5Mzc0fSwgLy8gX19idWlsdGluX2lhMzJfYnpoaV9zaQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfY2xmbHVzaCwgMTMzMzY5fSwgLy8gX19idWlsdGluX2lhMzJfY2xmbHVzaAorICAgICAge0ludHJpbnNpYzo6eDg2X2NsZmx1c2hvcHQsIDEyOTUxMn0sIC8vIF9fYnVpbHRpbl9pYTMyX2NsZmx1c2hvcHQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9jbHJzc2JzeSwgMTI5NTM4fSwgLy8gX19idWlsdGluX2lhMzJfY2xyc3Nic3kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9jbHdiLCAxMjk1NjJ9LCAvLyBfX2J1aWx0aW5faWEzMl9jbHdiCisgICAgICB7SW50cmluc2ljOjp4ODZfY2x6ZXJvLCAxMjk1ODJ9LCAvLyBfX2J1aWx0aW5faWEzMl9jbHplcm8KKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX2NtcF9zZCwgMTMzMzkyfSwgLy8gX19idWlsdGluX2lhMzJfY21wc2QKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jbXBfc2QsIDEwNDY4OH0sIC8vIF9fYnVpbHRpbl9pYTMyX2NtcHNkX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfY21wX3NzLCAxMzI1NDR9LCAvLyBfX2J1aWx0aW5faWEzMl9jbXBzcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NtcF9zcywgMTA0NzE0fSwgLy8gX19idWlsdGluX2lhMzJfY21wc3NfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV9jb21pZXFfc3MsIDEzMjU2NX0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbWllcQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV9jb21pZ2Vfc3MsIDEzMjU4N30sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbWlnZQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV9jb21pZ3Rfc3MsIDEzMjYwOX0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbWlndAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV9jb21pbGVfc3MsIDEzMjYzMX0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbWlsZQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV9jb21pbHRfc3MsIDEzMjY1M30sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbWlsdAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV9jb21pbmVxX3NzLCAxMzI2NzV9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21pbmVxCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9jb21pZXFfc2QsIDEzMzQxM30sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbWlzZGVxCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9jb21pZ2Vfc2QsIDEzMzQzN30sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbWlzZGdlCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9jb21pZ3Rfc2QsIDEzMzQ2MX0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbWlzZGd0CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9jb21pbGVfc2QsIDEzMzQ4NX0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbWlzZGxlCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9jb21pbHRfc2QsIDEzMzUwOX0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbWlzZGx0CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9jb21pbmVxX3NkLCAxMzM1MzN9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21pc2RuZXEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19wZF8xMjgsIDEwNDk0NH0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzZGYxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3BkXzI1NiwgMTA0OTc4fSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NkZjI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfcGRfNTEyLCAxMDUwMTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21wcmVzc2RmNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19xXzEyOCwgMTA1MTQ4fSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NkaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfcV8yNTYsIDEwNTE4Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzZGkyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3FfNTEyLCAxMDUyMTZ9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21wcmVzc2RpNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc193XzEyOCwgMTA1OTUyfSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NoaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfd18yNTYsIDEwNTk4Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzaGkyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3dfNTEyLCAxMDYwMjB9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21wcmVzc2hpNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19iXzEyOCwgMTA0NzQwfSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NxaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfYl8yNTYsIDEwNDc3NH0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzcWkyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX2JfNTEyLCAxMDQ4MDh9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21wcmVzc3FpNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19wc18xMjgsIDEwNTA0Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc2YxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3BzXzI1NiwgMTA1MDgwfSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NzZjI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfcHNfNTEyLCAxMDUxMTR9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21wcmVzc3NmNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19kXzEyOCwgMTA0ODQyfSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NzaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfZF8yNTYsIDEwNDg3Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc2kyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX2RfNTEyLCAxMDQ5MTB9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21wcmVzc3NpNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9wZF8xMjgsIDEwNTQ4NH0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVkZjEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcGRfMjU2LCAxMDU1MjN9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3JlZGYyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3N0b3JlX3BkXzUxMiwgMTA1NTYyfSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZWRmNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9xXzEyOCwgMTA1NzE4fSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZWRpMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9xXzI1NiwgMTA1NzU3fSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZWRpMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9xXzUxMiwgMTA1Nzk2fSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZWRpNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV93XzEyOCwgMTA1ODM1fSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZWhpMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV93XzI1NiwgMTA1ODc0fSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZWhpMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV93XzUxMiwgMTA1OTEzfSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZWhpNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9iXzEyOCwgMTA1MjUwfSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZXFpMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9iXzI1NiwgMTA1Mjg5fSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZXFpMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9iXzUxMiwgMTA1MzI4fSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZXFpNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9wc18xMjgsIDEwNTYwMX0sIC8vIF9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVzZjEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcHNfMjU2LCAxMDU2NDB9LCAvLyBfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3Jlc2YyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3N0b3JlX3BzXzUxMiwgMTA1Njc5fSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZXNmNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9kXzEyOCwgMTA1MzY3fSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZXNpMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9kXzI1NiwgMTA1NDA2fSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZXNpMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9kXzUxMiwgMTA1NDQ1fSwgLy8gX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZXNpNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0Ml9jcmMzMl82NF82NCwgMTM1NzQ0fSwgLy8gX19idWlsdGluX2lhMzJfY3JjMzJkaQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQyX2NyYzMyXzMyXzE2LCAxMzU2NzV9LCAvLyBfX2J1aWx0aW5faWEzMl9jcmMzMmhpCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDJfY3JjMzJfMzJfOCwgMTM1NzIxfSwgLy8gX19idWlsdGluX2lhMzJfY3JjMzJxaQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQyX2NyYzMyXzMyXzMyLCAxMzU2OTh9LCAvLyBfX2J1aWx0aW5faWEzMl9jcmMzMnNpCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9jdnRkcTJwcywgMTMzNTU4fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0ZHEycHMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfY3Z0ZHEyX3BzXzI1NiwgOTk2MTV9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRkcTJwczI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dGRxMnBzXzUxMiwgMTA2Mjc2fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0ZHEycHM1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfY3Z0cGQyZHEsIDEzMzU4Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBkMmRxCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cGQyZHFfMTI4LCAxMDYzMDh9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRwZDJkcTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X2N2dF9wZDJkcV8yNTYsIDk5NTYxfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cGQyZHEyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwZDJkcV81MTIsIDEwNjM0MH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBkMmRxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfY3Z0cGQycGksIDEzMjY5OH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnBpCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9jdnRwZDJwcywgMTMzNjA2fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cGQycHMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfY3Z0X3BkMl9wc18yNTYsIDk5NTM0fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cGQycHMyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwZDJwc181MTIsIDEwNjQwMX0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnBzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwZDJwcywgMTA2MzcyfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cGQycHNfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHBkMnFxXzEyOCwgMTA2NDMzfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cGQycXExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHBkMnFxXzI1NiwgMTA2NDY1fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cGQycXEyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHBkMnFxXzUxMiwgMTA2NDk3fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cGQycXE1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHBkMnVkcV8xMjgsIDEwNjUyOX0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnVkcTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cGQydWRxXzI1NiwgMTA2NTYyfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cGQydWRxMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwZDJ1ZHFfNTEyLCAxMDY1OTV9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRwZDJ1ZHE1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHBkMnVxcV8xMjgsIDEwNjYyOH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBkMnVxcTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cGQydXFxXzI1NiwgMTA2NjYxfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cGQydXFxMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwZDJ1cXFfNTEyLCAxMDY2OTR9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRwZDJ1cXE1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV9jdnRwaTJwZCwgMTMyNzIyfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cGkycGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfY3Z0cGkycHMsIDEzMjc0Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBpMnBzCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9jdnRwczJkcSwgMTMzNjMwfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cHMyZHEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwczJkcV8xMjgsIDEwNjcyN30sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBzMmRxMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfY3Z0X3BzMmRxXzI1NiwgOTk1ODh9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRwczJkcTI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHBzMmRxXzI1NiwgMTA2NzU5fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cHMyZHEyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHBzMmRxXzUxMiwgMTA2NzkxfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cHMyZHE1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHBzMnBkXzUxMiwgMTA2ODIzfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cHMycGQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV9jdnRwczJwaSwgMTMyNzcwfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cHMycGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwczJxcV8xMjgsIDEwNjg1NX0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBzMnFxMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwczJxcV8yNTYsIDEwNjg4N30sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBzMnFxMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwczJxcV81MTIsIDEwNjkxOX0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBzMnFxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwczJ1ZHFfMTI4LCAxMDY5NTF9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRwczJ1ZHExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHBzMnVkcV8yNTYsIDEwNjk4NH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBzMnVkcTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cHMydWRxXzUxMiwgMTA3MDE3fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cHMydWRxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRwczJ1cXFfMTI4LCAxMDcwNTB9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRwczJ1cXExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHBzMnVxcV8yNTYsIDEwNzA4M30sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHBzMnVxcTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0cHMydXFxXzUxMiwgMTA3MTE2fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0cHMydXFxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRxcTJwZF8xMjgsIDEwNzE0OX0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHFxMnBkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRxcTJwZF8yNTYsIDEwNzE4MX0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHFxMnBkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRxcTJwZF81MTIsIDEwNzIxM30sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHFxMnBkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRxcTJwc18xMjgsIDEwNzI0NX0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHFxMnBzMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRxcTJwc18yNTYsIDEwNzI3N30sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHFxMnBzMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRxcTJwc181MTIsIDEwNzMwOX0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHFxMnBzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX2N2dHNkMnNpLCAxMzM2NTR9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRzZDJzaQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfY3Z0c2Qyc2k2NCwgMTMzNjc4fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0c2Qyc2k2NAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfY3Z0c2Qyc3MsIDEzMzcwNH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHNkMnNzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0c2Qyc3Nfcm91bmQsIDEwNzM0MX0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHNkMnNzX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfY3Z0c2kyc2Q2NCwgMTAzMjk4fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0c2kyc2Q2NAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9jdnRzaTJzczMyLCAxMDMzMjR9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnRzaTJzczMyCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2N2dHNpMnNzNjQsIDEwMzM1MH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHNpMnNzNjQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnRzczJzZF9yb3VuZCwgMTA3Mzc2fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0c3Myc2Rfcm91bmRfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV9jdnRzczJzaSwgMTMyNzk0fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0c3Myc2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfY3Z0c3Myc2k2NCwgMTMyODE4fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0c3Myc2k2NAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfY3Z0dHBkMmRxLCAxMzM3Mjh9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0cGQyZHEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnR0cGQyZHFfMTI4LCAxMDc0MTF9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0cGQyZHExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9jdnR0X3BkMmRxXzI1NiwgOTk2NDJ9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0cGQyZHEyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnR0cGQyZHFfNTEyLCAxMDc0NDR9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0cGQyZHE1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV9jdnR0cGQycGksIDEzMjg0NH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJwaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJxcV8xMjgsIDEwNzQ3N30sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJxcTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMnFxXzI1NiwgMTA3NTEwfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHBkMnFxMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnR0cGQycXFfNTEyLCAxMDc1NDN9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0cGQycXE1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJ1ZHFfMTI4LCAxMDc1NzZ9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0cGQydWRxMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnR0cGQydWRxXzI1NiwgMTA3NjEwfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHBkMnVkcTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMnVkcV81MTIsIDEwNzY0NH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJ1ZHE1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJ1cXFfMTI4LCAxMDc2Nzh9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0cGQydXFxMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnR0cGQydXFxXzI1NiwgMTA3NzEyfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHBkMnVxcTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMnVxcV81MTIsIDEwNzc0Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHRwZDJ1cXE1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfY3Z0dHBzMmRxLCAxMzM3NTN9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0cHMyZHEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfY3Z0dF9wczJkcV8yNTYsIDk5NjcwfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHBzMmRxMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dHBzMmRxXzUxMiwgMTA3NzgwfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHBzMmRxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfY3Z0dHBzMnBpLCAxMzI4Njl9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0cHMycGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnR0cHMycXFfMTI4LCAxMDc4MTN9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0cHMycXExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHRwczJxcV8yNTYsIDEwNzg0Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHRwczJxcTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dHBzMnFxXzUxMiwgMTA3ODc5fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHBzMnFxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnR0cHMydWRxXzEyOCwgMTA3OTEyfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHBzMnVkcTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dHBzMnVkcV8yNTYsIDEwNzk0Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHRwczJ1ZHEyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHRwczJ1ZHFfNTEyLCAxMDc5ODB9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0cHMydWRxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnR0cHMydXFxXzEyOCwgMTA4MDE0fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHBzMnVxcTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dHBzMnVxcV8yNTYsIDEwODA0OH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHRwczJ1cXEyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHRwczJ1cXFfNTEyLCAxMDgwODJ9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0cHMydXFxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX2N2dHRzZDJzaSwgMTMzNzc4fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHNkMnNpCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9jdnR0c2Qyc2k2NCwgMTMzODAzfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dHNkMnNpNjQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfY3Z0dHNzMnNpLCAxMzI4OTR9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR0c3Myc2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfY3Z0dHNzMnNpNjQsIDEzMjkxOX0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHRzczJzaTY0CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dWRxMnBzXzEyOCwgMTA4MTE2fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dWRxMnBzMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnR1ZHEycHNfMjU2LCAxMDgxNDl9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR1ZHEycHMyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHVkcTJwc181MTIsIDEwODE4Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHVkcTJwczUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dXFxMnBkXzEyOCwgMTA4MjE1fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dXFxMnBkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnR1cXEycGRfMjU2LCAxMDgyNDh9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR1cXEycGQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHVxcTJwZF81MTIsIDEwODI4MX0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHVxcTJwZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY3Z0dXFxMnBzXzEyOCwgMTA4MzE0fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dXFxMnBzMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jdnR1cXEycHNfMjU2LCAxMDgzNDd9LCAvLyBfX2J1aWx0aW5faWEzMl9jdnR1cXEycHMyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2N2dHVxcTJwc181MTIsIDEwODM4MH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHVxcTJwczUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2N2dHVzaTJzZCwgMTAzNjA0fSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dXNpMnNkMzIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfY3Z0dXNpNjQyc2QsIDEwMzY1OH0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHVzaTJzZDY0CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2N2dHVzaTJzcywgMTAzNjMxfSwgLy8gX19idWlsdGluX2lhMzJfY3Z0dXNpMnNzMzIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfY3Z0dXNpNjQyc3MsIDEwMzY4NX0sIC8vIF9fYnVpbHRpbl9pYTMyX2N2dHVzaTJzczY0CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZGJwc2FkYndfMTI4LCAxMDg0MTN9LCAvLyBfX2J1aWx0aW5faWEzMl9kYnBzYWRidzEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZGJwc2FkYndfMjU2LCAxMDg0NDV9LCAvLyBfX2J1aWx0aW5faWEzMl9kYnBzYWRidzI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZGJwc2FkYndfNTEyLCAxMDg0Nzd9LCAvLyBfX2J1aWx0aW5faWEzMl9kYnBzYWRidzUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZGl2X3BkXzUxMiwgMTA4NTA5fSwgLy8gX19idWlsdGluX2lhMzJfZGl2cGQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2Rpdl9wc181MTIsIDEwODUzOH0sIC8vIF9fYnVpbHRpbl9pYTMyX2RpdnBzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19kaXZfc2Rfcm91bmQsIDEwODU2N30sIC8vIF9fYnVpbHRpbl9pYTMyX2RpdnNkX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19kaXZfc3Nfcm91bmQsIDEwODU5OX0sIC8vIF9fYnVpbHRpbl9pYTMyX2RpdnNzX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0MV9kcHBkLCAxMzUzMDV9LCAvLyBfX2J1aWx0aW5faWEzMl9kcHBkCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDFfZHBwcywgMTM1MzI1fSwgLy8gX19idWlsdGluX2lhMzJfZHBwcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9kcF9wc18yNTYsIDk5Njk4fSwgLy8gX19idWlsdGluX2lhMzJfZHBwczI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9lbW1zLCAxMzAyOTh9LCAvLyBfX2J1aWx0aW5faWEzMl9lbW1zCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2V4cDJfcGQsIDEwMzcxMn0sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cDJwZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2V4cDJfcHMsIDEwMzczOX0sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cDJwc19tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3BkXzEyOCwgMTA5NDcxfSwgLy8gX19idWlsdGluX2lhMzJfZXhwYW5kZGYxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9wZF8yNTYsIDEwOTUwM30sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGRmMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19leHBhbmRfcGRfNTEyLCAxMDk1MzV9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRkZjUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3FfMTI4LCAxMDk2NjN9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRkaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3FfMjU2LCAxMDk2OTV9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRkaTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3FfNTEyLCAxMDk3Mjd9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRkaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3dfMTI4LCAxMDk3NTl9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRoaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3dfMjU2LCAxMDk3OTF9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRoaTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3dfNTEyLCAxMDk4MjN9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRoaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfcGRfMTI4LCAxMDkwMzl9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkZGYxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3BkXzI1NiwgMTA5MDc1fSwgLy8gX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZGRmMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9wZF81MTIsIDEwOTExMX0sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRkZjUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfcV8xMjgsIDEwOTI1NX0sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRkaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfcV8yNTYsIDEwOTI5MX0sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRkaTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfcV81MTIsIDEwOTMyN30sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRkaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfd18xMjgsIDEwOTM2M30sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRoaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfd18yNTYsIDEwOTM5OX0sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRoaTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfd181MTIsIDEwOTQzNX0sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRoaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfYl8xMjgsIDEwODgyM30sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRxaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfYl8yNTYsIDEwODg1OX0sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRxaTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfYl81MTIsIDEwODg5NX0sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRxaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfcHNfMTI4LCAxMDkxNDd9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRsb2Fkc2YxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3BzXzI1NiwgMTA5MTgzfSwgLy8gX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZHNmMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9wc181MTIsIDEwOTIxOX0sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRzZjUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfZF8xMjgsIDEwODkzMX0sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRzaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfZF8yNTYsIDEwODk2N30sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRzaTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfZF81MTIsIDEwOTAwM30sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRzaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2JfMTI4LCAxMDg2MzF9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRxaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2JfMjU2LCAxMDg2NjN9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRxaTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2JfNTEyLCAxMDg2OTV9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRxaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3BzXzEyOCwgMTA5NTY3fSwgLy8gX19idWlsdGluX2lhMzJfZXhwYW5kc2YxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9wc18yNTYsIDEwOTU5OX0sIC8vIF9fYnVpbHRpbl9pYTMyX2V4cGFuZHNmMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19leHBhbmRfcHNfNTEyLCAxMDk2MzF9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRzZjUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2RfMTI4LCAxMDg3Mjd9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRzaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2RfMjU2LCAxMDg3NTl9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRzaTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2RfNTEyLCAxMDg3OTF9LCAvLyBfX2J1aWx0aW5faWEzMl9leHBhbmRzaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNGFfZXh0cnEsIDEzNjE2OX0sIC8vIF9fYnVpbHRpbl9pYTMyX2V4dHJxCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNGFfZXh0cnFpLCAxMzYxOTB9LCAvLyBfX2J1aWx0aW5faWEzMl9leHRycWkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfZmVtbXMsIDEzMDMxOH0sIC8vIF9fYnVpbHRpbl9pYTMyX2ZlbW1zCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZml4dXBpbW1fcGRfMTI4LCAxMDk4NTV9LCAvLyBfX2J1aWx0aW5faWEzMl9maXh1cGltbXBkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfZml4dXBpbW1fcGRfMTI4LCAxMjMzNTd9LCAvLyBfX2J1aWx0aW5faWEzMl9maXh1cGltbXBkMTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZml4dXBpbW1fcGRfMjU2LCAxMDk4ODl9LCAvLyBfX2J1aWx0aW5faWEzMl9maXh1cGltbXBkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfZml4dXBpbW1fcGRfMjU2LCAxMjMzOTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9maXh1cGltbXBkMjU2X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZml4dXBpbW1fcGRfNTEyLCAxMDk5MjN9LCAvLyBfX2J1aWx0aW5faWEzMl9maXh1cGltbXBkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfZml4dXBpbW1fcGRfNTEyLCAxMjM0Mjd9LCAvLyBfX2J1aWx0aW5faWEzMl9maXh1cGltbXBkNTEyX21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZml4dXBpbW1fcHNfMTI4LCAxMDk5NTd9LCAvLyBfX2J1aWx0aW5faWEzMl9maXh1cGltbXBzMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfZml4dXBpbW1fcHNfMTI4LCAxMjM0NjJ9LCAvLyBfX2J1aWx0aW5faWEzMl9maXh1cGltbXBzMTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZml4dXBpbW1fcHNfMjU2LCAxMDk5OTF9LCAvLyBfX2J1aWx0aW5faWEzMl9maXh1cGltbXBzMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfZml4dXBpbW1fcHNfMjU2LCAxMjM0OTd9LCAvLyBfX2J1aWx0aW5faWEzMl9maXh1cGltbXBzMjU2X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZml4dXBpbW1fcHNfNTEyLCAxMTAwMjV9LCAvLyBfX2J1aWx0aW5faWEzMl9maXh1cGltbXBzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfZml4dXBpbW1fcHNfNTEyLCAxMjM1MzJ9LCAvLyBfX2J1aWx0aW5faWEzMl9maXh1cGltbXBzNTEyX21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZml4dXBpbW1fc2QsIDExMDA1OX0sIC8vIF9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tc2RfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel9maXh1cGltbV9zZCwgMTIzNTY3fSwgLy8gX19idWlsdGluX2lhMzJfZml4dXBpbW1zZF9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2ZpeHVwaW1tX3NzLCAxMTAwOTB9LCAvLyBfX2J1aWx0aW5faWEzMl9maXh1cGltbXNzX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfZml4dXBpbW1fc3MsIDEyMzU5OX0sIC8vIF9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tc3NfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19mcGNsYXNzX3BkXzEyOCwgMTEwMTIxfSwgLy8gX19idWlsdGluX2lhMzJfZnBjbGFzc3BkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19mcGNsYXNzX3BkXzI1NiwgMTEwMTU0fSwgLy8gX19idWlsdGluX2lhMzJfZnBjbGFzc3BkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19mcGNsYXNzX3BkXzUxMiwgMTEwMTg3fSwgLy8gX19idWlsdGluX2lhMzJfZnBjbGFzc3BkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19mcGNsYXNzX3BzXzEyOCwgMTEwMjIwfSwgLy8gX19idWlsdGluX2lhMzJfZnBjbGFzc3BzMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19mcGNsYXNzX3BzXzI1NiwgMTEwMjUzfSwgLy8gX19idWlsdGluX2lhMzJfZnBjbGFzc3BzMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19mcGNsYXNzX3BzXzUxMiwgMTEwMjg2fSwgLy8gX19idWlsdGluX2lhMzJfZnBjbGFzc3BzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19mcGNsYXNzX3NkLCAxMTAzMTl9LCAvLyBfX2J1aWx0aW5faWEzMl9mcGNsYXNzc2RfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2ZwY2xhc3Nfc3MsIDExMDM0OX0sIC8vIF9fYnVpbHRpbl9pYTMyX2ZwY2xhc3Nzc19tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfZnhyc3RvciwgMTMwMDQwfSwgLy8gX19idWlsdGluX2lhMzJfZnhyc3RvcgorICAgICAge0ludHJpbnNpYzo6eDg2X2Z4cnN0b3I2NCwgMTMwMDYzfSwgLy8gX19idWlsdGluX2lhMzJfZnhyc3RvcjY0CisgICAgICB7SW50cmluc2ljOjp4ODZfZnhzYXZlLCAxMzAwODh9LCAvLyBfX2J1aWx0aW5faWEzMl9meHNhdmUKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9meHNhdmU2NCwgMTMwMTEwfSwgLy8gX19idWlsdGluX2lhMzJfZnhzYXZlNjQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyM2RpdjJfZGYsIDEwMzk5NH0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNkaXYyZGYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyM2RpdjJfZGksIDEwNDAyM30sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNkaXYyZGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyM2RpdjRfZGYsIDEwNDA1Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNkaXY0ZGYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyM2RpdjRfZGksIDEwNDA4MX0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNkaXY0ZGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyM2RpdjRfc2YsIDEwNDExMH0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNkaXY0c2YKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyM2RpdjRfc2ksIDEwNDEzOX0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNkaXY0c2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyM2Rpdjhfc2YsIDEwNDE2OH0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNkaXY4c2YKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyM2Rpdjhfc2ksIDEwNDE5N30sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNkaXY4c2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyM3NpdjJfZGYsIDEwNDIyNn0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNzaXYyZGYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyM3NpdjJfZGksIDEwNDI1NX0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNzaXYyZGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyM3NpdjRfZGYsIDEwNDI4NH0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNzaXY0ZGYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyM3NpdjRfZGksIDEwNDMxM30sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNzaXY0ZGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyM3NpdjRfc2YsIDEwNDM0Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNzaXY0c2YKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyM3NpdjRfc2ksIDEwNDM3MX0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNzaXY0c2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyM3Npdjhfc2YsIDEwNDQwMH0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNzaXY4c2YKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyM3Npdjhfc2ksIDEwNDQyOX0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcjNzaXY4c2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX2dhdGhlcl9kX2QsIDEwMDkzMH0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfZAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfZ2F0aGVyX2RfZF8yNTYsIDEwMDk1NX0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfZ2F0aGVyX2RfcGQsIDEwMDk4M30sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfcGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX2dhdGhlcl9kX3BkXzI1NiwgMTAxMDA5fSwgLy8gX19idWlsdGluX2lhMzJfZ2F0aGVyZF9wZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfZ2F0aGVyX2RfcHMsIDEwMTAzOH0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfcHMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX2dhdGhlcl9kX3BzXzI1NiwgMTAxMDY0fSwgLy8gX19idWlsdGluX2lhMzJfZ2F0aGVyZF9wczI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfZ2F0aGVyX2RfcSwgMTAxMDkzfSwgLy8gX19idWlsdGluX2lhMzJfZ2F0aGVyZF9xCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9nYXRoZXJfZF9xXzI1NiwgMTAxMTE4fSwgLy8gX19idWlsdGluX2lhMzJfZ2F0aGVyZF9xMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcl9xcHNfNTEyLCAxMDM5NjV9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXYxNnNmCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcl9xcGlfNTEyLCAxMDM5MDh9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXYxNnNpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2dhdGhlcl9xcGRfNTEyLCAxMDM4ODB9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXJkaXY4ZGYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyX3FwcV81MTIsIDEwMzkzN30sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjhkaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9nYXRoZXJwZl9kcGRfNTEyLCAxMDQ0NTh9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXJwZmRwZAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9nYXRoZXJwZl9kcHNfNTEyLCAxMDQ0ODV9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXJwZmRwcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9nYXRoZXJwZl9xcGRfNTEyLCAxMDQ1MTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXJwZnFwZAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9nYXRoZXJwZl9xcHNfNTEyLCAxMDQ1Mzl9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXJwZnFwcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfZ2F0aGVyX3FfZCwgMTAxMTQ2fSwgLy8gX19idWlsdGluX2lhMzJfZ2F0aGVycV9kCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9nYXRoZXJfcV9kXzI1NiwgMTAxMTcxfSwgLy8gX19idWlsdGluX2lhMzJfZ2F0aGVycV9kMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9nYXRoZXJfcV9wZCwgMTAxMTk5fSwgLy8gX19idWlsdGluX2lhMzJfZ2F0aGVycV9wZAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfZ2F0aGVyX3FfcGRfMjU2LCAxMDEyMjV9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXJxX3BkMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9nYXRoZXJfcV9wcywgMTAxMjU0fSwgLy8gX19idWlsdGluX2lhMzJfZ2F0aGVycV9wcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfZ2F0aGVyX3FfcHNfMjU2LCAxMDEyODB9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXJxX3BzMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9nYXRoZXJfcV9xLCAxMDEzMDl9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXJxX3EKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX2dhdGhlcl9xX3FfMjU2LCAxMDEzMzR9LCAvLyBfX2J1aWx0aW5faWEzMl9nYXRoZXJxX3EyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyX2Rwc181MTIsIDEwMzg1MX0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjE2c2YKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyX2RwaV81MTIsIDEwMzc5NH0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjE2c2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfZ2F0aGVyX2RwZF81MTIsIDEwMzc2Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjhkZgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9nYXRoZXJfZHBxXzUxMiwgMTAzODIzfSwgLy8gX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2OGRpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZ2V0ZXhwX3BkXzEyOCwgMTEwMzc5fSwgLy8gX19idWlsdGluX2lhMzJfZ2V0ZXhwcGQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2dldGV4cF9wZF8yNTYsIDExMDQxMX0sIC8vIF9fYnVpbHRpbl9pYTMyX2dldGV4cHBkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19nZXRleHBfcGRfNTEyLCAxMTA0NDN9LCAvLyBfX2J1aWx0aW5faWEzMl9nZXRleHBwZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZ2V0ZXhwX3BzXzEyOCwgMTEwNDc1fSwgLy8gX19idWlsdGluX2lhMzJfZ2V0ZXhwcHMxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2dldGV4cF9wc18yNTYsIDExMDUwN30sIC8vIF9fYnVpbHRpbl9pYTMyX2dldGV4cHBzMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19nZXRleHBfcHNfNTEyLCAxMTA1Mzl9LCAvLyBfX2J1aWx0aW5faWEzMl9nZXRleHBwczUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZ2V0ZXhwX3NkLCAxMTA1NzF9LCAvLyBfX2J1aWx0aW5faWEzMl9nZXRleHBzZDEyOF9yb3VuZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZ2V0ZXhwX3NzLCAxMTA2MDl9LCAvLyBfX2J1aWx0aW5faWEzMl9nZXRleHBzczEyOF9yb3VuZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZ2V0bWFudF9wZF8xMjgsIDExMDY0N30sIC8vIF9fYnVpbHRpbl9pYTMyX2dldG1hbnRwZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZ2V0bWFudF9wZF8yNTYsIDExMDY4MH0sIC8vIF9fYnVpbHRpbl9pYTMyX2dldG1hbnRwZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZ2V0bWFudF9wZF81MTIsIDExMDcxM30sIC8vIF9fYnVpbHRpbl9pYTMyX2dldG1hbnRwZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZ2V0bWFudF9wc18xMjgsIDExMDc0Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX2dldG1hbnRwczEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZ2V0bWFudF9wc18yNTYsIDExMDc3OX0sIC8vIF9fYnVpbHRpbl9pYTMyX2dldG1hbnRwczI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZ2V0bWFudF9wc181MTIsIDExMDgxMn0sIC8vIF9fYnVpbHRpbl9pYTMyX2dldG1hbnRwczUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfZ2V0bWFudF9zZCwgMTEwODQ1fSwgLy8gX19idWlsdGluX2lhMzJfZ2V0bWFudHNkX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19nZXRtYW50X3NzLCAxMTA4ODF9LCAvLyBfX2J1aWx0aW5faWEzMl9nZXRtYW50c3Nfcm91bmRfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTNfaGFkZF9wZCwgMTM1MTA0fSwgLy8gX19idWlsdGluX2lhMzJfaGFkZHBkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X2hhZGRfcGRfMjU2LCA5OTcyMX0sIC8vIF9fYnVpbHRpbl9pYTMyX2hhZGRwZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTNfaGFkZF9wcywgMTM1MTI2fSwgLy8gX19idWlsdGluX2lhMzJfaGFkZHBzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X2hhZGRfcHNfMjU2LCA5OTc0Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX2hhZGRwczI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTNfaHN1Yl9wZCwgMTM1MTQ4fSwgLy8gX19idWlsdGluX2lhMzJfaHN1YnBkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X2hzdWJfcGRfMjU2LCA5OTc3MX0sIC8vIF9fYnVpbHRpbl9pYTMyX2hzdWJwZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTNfaHN1Yl9wcywgMTM1MTcwfSwgLy8gX19idWlsdGluX2lhMzJfaHN1YnBzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X2hzdWJfcHNfMjU2LCA5OTc5Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX2hzdWJwczI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2luY3NzcGQsIDEzMDEzNH0sIC8vIF9fYnVpbHRpbl9pYTMyX2luY3NzcGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9pbmNzc3BxLCAxMzAxNTd9LCAvLyBfX2J1aWx0aW5faWEzMl9pbmNzc3BxCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDFfaW5zZXJ0cHMsIDEzNTM0NX0sIC8vIF9fYnVpbHRpbl9pYTMyX2luc2VydHBzMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNGFfaW5zZXJ0cSwgMTM2MjEyfSwgLy8gX19idWlsdGluX2lhMzJfaW5zZXJ0cQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTRhX2luc2VydHFpLCAxMzYyMzV9LCAvLyBfX2J1aWx0aW5faWEzMl9pbnNlcnRxaQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTNfbGR1X2RxLCAxMzUxOTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9sZGRxdQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9sZHVfZHFfMjU2LCA5OTgyMX0sIC8vIF9fYnVpbHRpbl9pYTMyX2xkZHF1MjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9sZmVuY2UsIDEzMzgzMH0sIC8vIF9fYnVpbHRpbl9pYTMyX2xmZW5jZQorICAgICAge0ludHJpbnNpYzo6eDg2X2xsd3BjYiwgMTMwMTgwfSwgLy8gX19idWlsdGluX2lhMzJfbGx3cGNiCisgICAgICB7SW50cmluc2ljOjp4ODZfbHdwaW5zMzIsIDEzMDIwMn0sIC8vIF9fYnVpbHRpbl9pYTMyX2x3cGluczMyCisgICAgICB7SW50cmluc2ljOjp4ODZfbHdwaW5zNjQsIDEzMDIyNn0sIC8vIF9fYnVpbHRpbl9pYTMyX2x3cGluczY0CisgICAgICB7SW50cmluc2ljOjp4ODZfbHdwdmFsMzIsIDEzMDI1MH0sIC8vIF9fYnVpbHRpbl9pYTMyX2x3cHZhbDMyCisgICAgICB7SW50cmluc2ljOjp4ODZfbHdwdmFsNjQsIDEzMDI3NH0sIC8vIF9fYnVpbHRpbl9pYTMyX2x3cHZhbDY0CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9tYXNrbG9hZF9kLCAxMDEzNjJ9LCAvLyBfX2J1aWx0aW5faWEzMl9tYXNrbG9hZGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX21hc2tsb2FkX2RfMjU2LCAxMDEzODd9LCAvLyBfX2J1aWx0aW5faWEzMl9tYXNrbG9hZGQyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfbWFza2xvYWRfcGQsIDk5ODQ1fSwgLy8gX19idWlsdGluX2lhMzJfbWFza2xvYWRwZAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9tYXNrbG9hZF9wZF8yNTYsIDk5ODcxfSwgLy8gX19idWlsdGluX2lhMzJfbWFza2xvYWRwZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9tYXNrbG9hZF9wcywgOTk5MDB9LCAvLyBfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHBzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X21hc2tsb2FkX3BzXzI1NiwgOTk5MjZ9LCAvLyBfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHBzMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9tYXNrbG9hZF9xLCAxMDE0MTV9LCAvLyBfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX21hc2tsb2FkX3FfMjU2LCAxMDE0NDB9LCAvLyBfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHEyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX21hc2ttb3ZfZHF1LCAxMzM4NTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9tYXNrbW92ZHF1CisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X21hc2ttb3ZxLCAxMzAzMzl9LCAvLyBfX2J1aWx0aW5faWEzMl9tYXNrbW92cQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfbWFza3N0b3JlX2QsIDEwMTQ2OH0sIC8vIF9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZWQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX21hc2tzdG9yZV9kXzI1NiwgMTAxNDk0fSwgLy8gX19idWlsdGluX2lhMzJfbWFza3N0b3JlZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9tYXNrc3RvcmVfcGQsIDk5OTU1fSwgLy8gX19idWlsdGluX2lhMzJfbWFza3N0b3JlcGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfbWFza3N0b3JlX3BkXzI1NiwgOTk5ODJ9LCAvLyBfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVwZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9tYXNrc3RvcmVfcHMsIDEwMDAxMn0sIC8vIF9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZXBzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X21hc2tzdG9yZV9wc18yNTYsIDEwMDAzOX0sIC8vIF9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZXBzMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9tYXNrc3RvcmVfcSwgMTAxNTIzfSwgLy8gX19idWlsdGluX2lhMzJfbWFza3N0b3JlcQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfbWFza3N0b3JlX3FfMjU2LCAxMDE1NDl9LCAvLyBfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVxMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9tYXhfcGQsIDEzMzg3OH0sIC8vIF9fYnVpbHRpbl9pYTMyX21heHBkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X21heF9wZF8yNTYsIDEwMDA2OX0sIC8vIF9fYnVpbHRpbl9pYTMyX21heHBkMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfbWF4X3BkXzUxMiwgMTEwOTE3fSwgLy8gX19idWlsdGluX2lhMzJfbWF4cGQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV9tYXhfcHMsIDEzMjk0Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX21heHBzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X21heF9wc18yNTYsIDEwMDA5M30sIC8vIF9fYnVpbHRpbl9pYTMyX21heHBzMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfbWF4X3BzXzUxMiwgMTEwOTQ2fSwgLy8gX19idWlsdGluX2lhMzJfbWF4cHM1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfbWF4X3NkLCAxMzM4OTl9LCAvLyBfX2J1aWx0aW5faWEzMl9tYXhzZAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX21heF9zZF9yb3VuZCwgMTEwOTc1fSwgLy8gX19idWlsdGluX2lhMzJfbWF4c2Rfcm91bmRfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV9tYXhfc3MsIDEzMjk2N30sIC8vIF9fYnVpbHRpbl9pYTMyX21heHNzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfbWF4X3NzX3JvdW5kLCAxMTEwMDd9LCAvLyBfX2J1aWx0aW5faWEzMl9tYXhzc19yb3VuZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9tZmVuY2UsIDEzMzkyMH0sIC8vIF9fYnVpbHRpbl9pYTMyX21mZW5jZQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfbWluX3BkLCAxMzM5NDJ9LCAvLyBfX2J1aWx0aW5faWEzMl9taW5wZAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9taW5fcGRfMjU2LCAxMDAxMTd9LCAvLyBfX2J1aWx0aW5faWEzMl9taW5wZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX21pbl9wZF81MTIsIDExMTAzOX0sIC8vIF9fYnVpbHRpbl9pYTMyX21pbnBkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfbWluX3BzLCAxMzI5ODh9LCAvLyBfX2J1aWx0aW5faWEzMl9taW5wcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9taW5fcHNfMjU2LCAxMDAxNDF9LCAvLyBfX2J1aWx0aW5faWEzMl9taW5wczI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX21pbl9wc181MTIsIDExMTA2OH0sIC8vIF9fYnVpbHRpbl9pYTMyX21pbnBzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX21pbl9zZCwgMTMzOTYzfSwgLy8gX19idWlsdGluX2lhMzJfbWluc2QKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19taW5fc2Rfcm91bmQsIDExMTA5N30sIC8vIF9fYnVpbHRpbl9pYTMyX21pbnNkX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfbWluX3NzLCAxMzMwMDl9LCAvLyBfX2J1aWx0aW5faWEzMl9taW5zcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX21pbl9zc19yb3VuZCwgMTExMTI5fSwgLy8gX19idWlsdGluX2lhMzJfbWluc3Nfcm91bmRfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTNfbW9uaXRvciwgMTM1MjEzfSwgLy8gX19idWlsdGluX2lhMzJfbW9uaXRvcgorICAgICAge0ludHJpbnNpYzo6eDg2X21vbml0b3J4LCAxMzE4ODV9LCAvLyBfX2J1aWx0aW5faWEzMl9tb25pdG9yeAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfbW92bXNrX3BkLCAxMzM5ODR9LCAvLyBfX2J1aWx0aW5faWEzMl9tb3Ztc2twZAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9tb3Ztc2tfcGRfMjU2LCAxMDAxNjV9LCAvLyBfX2J1aWx0aW5faWEzMl9tb3Ztc2twZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV9tb3Ztc2tfcHMsIDEzMzAzMH0sIC8vIF9fYnVpbHRpbl9pYTMyX21vdm1za3BzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X21vdm1za19wc18yNTYsIDEwMDE5Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX21vdm1za3BzMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X21vdm50X2RxLCAxMzAzNjN9LCAvLyBfX2J1aWx0aW5faWEzMl9tb3ZudHEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0MV9tcHNhZGJ3LCAxMzUzNzJ9LCAvLyBfX2J1aWx0aW5faWEzMl9tcHNhZGJ3MTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9tcHNhZGJ3LCAxMDE1Nzh9LCAvLyBfX2J1aWx0aW5faWEzMl9tcHNhZGJ3MjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfbXVsX3BkXzUxMiwgMTExMTYxfSwgLy8gX19idWlsdGluX2lhMzJfbXVscGQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX211bF9wc181MTIsIDExMTE5MH0sIC8vIF9fYnVpbHRpbl9pYTMyX211bHBzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19tdWxfc2Rfcm91bmQsIDExMTIxOX0sIC8vIF9fYnVpbHRpbl9pYTMyX211bHNkX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19tdWxfc3Nfcm91bmQsIDExMTI1MX0sIC8vIF9fYnVpbHRpbl9pYTMyX211bHNzX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UzX213YWl0LCAxMzUyMzZ9LCAvLyBfX2J1aWx0aW5faWEzMl9td2FpdAorICAgICAge0ludHJpbnNpYzo6eDg2X213YWl0eCwgMTMxOTA5fSwgLy8gX19idWlsdGluX2lhMzJfbXdhaXR4CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NzZTNfcGFic19iLCAxMzYyNTl9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWJzYgorICAgICAge0ludHJpbnNpYzo6eDg2X3Nzc2UzX3BhYnNfZCwgMTM2MjgwfSwgLy8gX19idWlsdGluX2lhMzJfcGFic2QKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19wYWJzX3csIDEzNjMwMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhYnN3CisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BhY2tzc2R3LCAxMzAzODV9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWNrc3NkdworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcGFja3NzZHdfMTI4LCAxMzQwMDh9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWNrc3NkdzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcGFja3NzZHcsIDEwMTYwNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhY2tzc2R3MjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BhY2tzc2R3XzUxMiwgMTI2MTgzfSwgLy8gX19idWlsdGluX2lhMzJfcGFja3NzZHc1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcGFja3Nzd2IsIDEzMDQwOX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhY2tzc3diCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wYWNrc3N3Yl8xMjgsIDEzNDAzNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhY2tzc3diMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wYWNrc3N3YiwgMTAxNjMxfSwgLy8gX19idWlsdGluX2lhMzJfcGFja3Nzd2IyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcGFja3Nzd2JfNTEyLCAxMjYyMTB9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWNrc3N3YjUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQxX3BhY2t1c2R3LCAxMzUzOTh9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWNrdXNkdzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcGFja3VzZHcsIDEwMTY1OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhY2t1c2R3MjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BhY2t1c2R3XzUxMiwgMTI2MjM3fSwgLy8gX19idWlsdGluX2lhMzJfcGFja3VzZHc1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcGFja3Vzd2IsIDEzMDQzM30sIC8vIF9fYnVpbHRpbl9pYTMyX3BhY2t1c3diCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wYWNrdXN3Yl8xMjgsIDEzNDA2Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhY2t1c3diMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wYWNrdXN3YiwgMTAxNjg1fSwgLy8gX19idWlsdGluX2lhMzJfcGFja3Vzd2IyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcGFja3Vzd2JfNTEyLCAxMjYyNjR9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWNrdXN3YjUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wYWRkX2IsIDEzMDQ1N30sIC8vIF9fYnVpbHRpbl9pYTMyX3BhZGRiCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BhZGRfZCwgMTMwNDc4fSwgLy8gX19idWlsdGluX2lhMzJfcGFkZGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcGFkZF9xLCAxMzA0OTl9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWRkcQorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wYWRkc19iLCAxMzA1NDF9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWRkc2IKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3BhZGRzX2IsIDEzNDA4OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhZGRzYjEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcGFkZHNfYiwgMTAxNzEyfSwgLy8gX19idWlsdGluX2lhMzJfcGFkZHNiMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcGFkZHNfYl81MTIsIDExMTI4M30sIC8vIF9fYnVpbHRpbl9pYTMyX3BhZGRzYjUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BhZGRzX3csIDEzMDU2M30sIC8vIF9fYnVpbHRpbl9pYTMyX3BhZGRzdworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcGFkZHNfdywgMTM0MTE0fSwgLy8gX19idWlsdGluX2lhMzJfcGFkZHN3MTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wYWRkc193LCAxMDE3Mzd9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWRkc3cyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wYWRkc193XzUxMiwgMTExMzEzfSwgLy8gX19idWlsdGluX2lhMzJfcGFkZHN3NTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcGFkZHVzX2IsIDEzMDU4NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhZGR1c2IKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3BhZGR1c19iLCAxMzQxMzl9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWRkdXNiMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wYWRkdXNfYiwgMTAxNzYyfSwgLy8gX19idWlsdGluX2lhMzJfcGFkZHVzYjI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3BhZGR1c19iXzUxMiwgMTExMzQzfSwgLy8gX19idWlsdGluX2lhMzJfcGFkZHVzYjUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BhZGR1c193LCAxMzA2MDh9LCAvLyBfX2J1aWx0aW5faWEzMl9wYWRkdXN3CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wYWRkdXNfdywgMTM0MTY1fSwgLy8gX19idWlsdGluX2lhMzJfcGFkZHVzdzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcGFkZHVzX3csIDEwMTc4OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhZGR1c3cyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wYWRkdXNfd181MTIsIDExMTM3NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhZGR1c3c1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wYWRkX3csIDEzMDUyMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhZGR3CisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BhbGlnbnJfYiwgMTMwNjMxfSwgLy8gX19idWlsdGluX2lhMzJfcGFsaWducgorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wYW5kLCAxMzA2NTR9LCAvLyBfX2J1aWx0aW5faWEzMl9wYW5kCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BhbmRuLCAxMzA2NzR9LCAvLyBfX2J1aWx0aW5faWEzMl9wYW5kbgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcGF1c2UsIDEzNDE5MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BhdXNlCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BhdmdfYiwgMTMwNjk1fSwgLy8gX19idWlsdGluX2lhMzJfcGF2Z2IKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl8zZG5vd19wYXZndXNiLCA5ODQyMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Bhdmd1c2IKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcGF2Z193LCAxMzA3MTZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wYXZndworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQxX3BibGVuZHZiLCAxMzU0MjV9LCAvLyBfX2J1aWx0aW5faWEzMl9wYmxlbmR2YjEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcGJsZW5kdmIsIDEwMTgxNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BibGVuZHZiMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfcGNsbXVscWRxLCAxMzE5MzF9LCAvLyBfX2J1aWx0aW5faWEzMl9wY2xtdWxxZHExMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9wY2xtdWxxZHFfMjU2LCAxMzE5NTl9LCAvLyBfX2J1aWx0aW5faWEzMl9wY2xtdWxxZHEyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9wY2xtdWxxZHFfNTEyLCAxMzE5ODd9LCAvLyBfX2J1aWx0aW5faWEzMl9wY2xtdWxxZHE1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcGNtcGVxX2IsIDEzMDczN30sIC8vIF9fYnVpbHRpbl9pYTMyX3BjbXBlcWIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcGNtcGVxX2QsIDEzMDc2MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BjbXBlcWQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcGNtcGVxX3csIDEzMDc4M30sIC8vIF9fYnVpbHRpbl9pYTMyX3BjbXBlcXcKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0Ml9wY21wZXN0cmkxMjgsIDEzNTc2N30sIC8vIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaTEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQyX3BjbXBlc3RyaWExMjgsIDEzNTc5NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaWExMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0Ml9wY21wZXN0cmljMTI4LCAxMzU4MjR9LCAvLyBfX2J1aWx0aW5faWEzMl9wY21wZXN0cmljMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDJfcGNtcGVzdHJpbzEyOCwgMTM1ODUzfSwgLy8gX19idWlsdGluX2lhMzJfcGNtcGVzdHJpbzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQyX3BjbXBlc3RyaXMxMjgsIDEzNTg4Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaXMxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0Ml9wY21wZXN0cml6MTI4LCAxMzU5MTF9LCAvLyBfX2J1aWx0aW5faWEzMl9wY21wZXN0cml6MTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDJfcGNtcGVzdHJtMTI4LCAxMzU5NDB9LCAvLyBfX2J1aWx0aW5faWEzMl9wY21wZXN0cm0xMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcGNtcGd0X2IsIDEzMDgwNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BjbXBndGIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcGNtcGd0X2QsIDEzMDgyOX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BjbXBndGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcGNtcGd0X3csIDEzMDg1Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BjbXBndHcKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0Ml9wY21waXN0cmkxMjgsIDEzNTk2OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaTEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQyX3BjbXBpc3RyaWExMjgsIDEzNTk5Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaWExMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0Ml9wY21waXN0cmljMTI4LCAxMzYwMjV9LCAvLyBfX2J1aWx0aW5faWEzMl9wY21waXN0cmljMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDJfcGNtcGlzdHJpbzEyOCwgMTM2MDU0fSwgLy8gX19idWlsdGluX2lhMzJfcGNtcGlzdHJpbzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQyX3BjbXBpc3RyaXMxMjgsIDEzNjA4M30sIC8vIF9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaXMxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0Ml9wY21waXN0cml6MTI4LCAxMzYxMTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wY21waXN0cml6MTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDJfcGNtcGlzdHJtMTI4LCAxMzYxNDF9LCAvLyBfX2J1aWx0aW5faWEzMl9wY21waXN0cm0xMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9ibWlfcGRlcF82NCwgMTI5NDQzfSwgLy8gX19idWlsdGluX2lhMzJfcGRlcF9kaQorICAgICAge0ludHJpbnNpYzo6eDg2X2JtaV9wZGVwXzMyLCAxMjk0MjB9LCAvLyBfX2J1aWx0aW5faWEzMl9wZGVwX3NpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9kZl8yNTYsIDExMTQwNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJkZjI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9kZl81MTIsIDExMTQzOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJkZjUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9kaV8yNTYsIDExMTQ3MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJkaTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9kaV81MTIsIDExMTUwNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJkaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9oaV8xMjgsIDExMTUzN30sIC8vIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJoaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9oaV8yNTYsIDExMTU3MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJoaTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9oaV81MTIsIDExMTYwM30sIC8vIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJoaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9xaV8xMjgsIDExMTYzNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJxaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9xaV8yNTYsIDExMTY2OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJxaTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9xaV81MTIsIDExMTcwMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJxaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wZXJtcHMsIDEwMTg2OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJzZjI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfc2ZfNTEyLCAxMTE3MzV9LCAvLyBfX2J1aWx0aW5faWEzMl9wZXJtdmFyc2Y1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcGVybWQsIDEwMTg0MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Blcm12YXJzaTI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfc2lfNTEyLCAxMTE3Njh9LCAvLyBfX2J1aWx0aW5faWEzMl9wZXJtdmFyc2k1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2JtaV9wZXh0XzY0LCAxMjk0ODl9LCAvLyBfX2J1aWx0aW5faWEzMl9wZXh0X2RpCisgICAgICB7SW50cmluc2ljOjp4ODZfYm1pX3BleHRfMzIsIDEyOTQ2Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BleHRfc2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl8zZG5vd19wZjJpZCwgOTg0NDR9LCAvLyBfX2J1aWx0aW5faWEzMl9wZjJpZAorICAgICAge0ludHJpbnNpYzo6eDg2XzNkbm93YV9wZjJpdywgOTg4NDJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wZjJpdworICAgICAge0ludHJpbnNpYzo6eDg2XzNkbm93X3BmYWNjLCA5ODQ2NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BmYWNjCisgICAgICB7SW50cmluc2ljOjp4ODZfM2Rub3dfcGZhZGQsIDk4NDg2fSwgLy8gX19idWlsdGluX2lhMzJfcGZhZGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl8zZG5vd19wZmNtcGVxLCA5ODUwN30sIC8vIF9fYnVpbHRpbl9pYTMyX3BmY21wZXEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl8zZG5vd19wZmNtcGdlLCA5ODUzMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BmY21wZ2UKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl8zZG5vd19wZmNtcGd0LCA5ODU1M30sIC8vIF9fYnVpbHRpbl9pYTMyX3BmY21wZ3QKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl8zZG5vd19wZm1heCwgOTg1NzZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wZm1heAorICAgICAge0ludHJpbnNpYzo6eDg2XzNkbm93X3BmbWluLCA5ODU5N30sIC8vIF9fYnVpbHRpbl9pYTMyX3BmbWluCisgICAgICB7SW50cmluc2ljOjp4ODZfM2Rub3dfcGZtdWwsIDk4NjE4fSwgLy8gX19idWlsdGluX2lhMzJfcGZtdWwKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl8zZG5vd2FfcGZuYWNjLCA5ODg2M30sIC8vIF9fYnVpbHRpbl9pYTMyX3BmbmFjYworICAgICAge0ludHJpbnNpYzo6eDg2XzNkbm93YV9wZnBuYWNjLCA5ODg4NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BmcG5hY2MKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl8zZG5vd19wZnJjcCwgOTg2Mzl9LCAvLyBfX2J1aWx0aW5faWEzMl9wZnJjcAorICAgICAge0ludHJpbnNpYzo6eDg2XzNkbm93X3BmcmNwaXQxLCA5ODY2MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BmcmNwaXQxCisgICAgICB7SW50cmluc2ljOjp4ODZfM2Rub3dfcGZyY3BpdDIsIDk4Njg0fSwgLy8gX19idWlsdGluX2lhMzJfcGZyY3BpdDIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl8zZG5vd19wZnJzcWl0MSwgOTg3MDh9LCAvLyBfX2J1aWx0aW5faWEzMl9wZnJzcWl0MQorICAgICAge0ludHJpbnNpYzo6eDg2XzNkbm93X3BmcnNxcnQsIDk4NzMyfSwgLy8gX19idWlsdGluX2lhMzJfcGZyc3FydAorICAgICAge0ludHJpbnNpYzo6eDg2XzNkbm93X3Bmc3ViLCA5ODc1NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Bmc3ViCisgICAgICB7SW50cmluc2ljOjp4ODZfM2Rub3dfcGZzdWJyLCA5ODc3Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Bmc3VicgorICAgICAge0ludHJpbnNpYzo6eDg2X3Nzc2UzX3BoYWRkX2QsIDEzNjMyMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BoYWRkZAorICAgICAge0ludHJpbnNpYzo6eDg2X3Nzc2UzX3BoYWRkX2RfMTI4LCAxMzYzNDR9LCAvLyBfX2J1aWx0aW5faWEzMl9waGFkZGQxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BoYWRkX2QsIDEwMTg5N30sIC8vIF9fYnVpbHRpbl9pYTMyX3BoYWRkZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3Nzc2UzX3BoYWRkX3N3LCAxMzYzNjl9LCAvLyBfX2J1aWx0aW5faWEzMl9waGFkZHN3CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NzZTNfcGhhZGRfc3dfMTI4LCAxMzYzOTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9waGFkZHN3MTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9waGFkZF9zdywgMTAxOTIyfSwgLy8gX19idWlsdGluX2lhMzJfcGhhZGRzdzI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3Nzc2UzX3BoYWRkX3csIDEzNjQxOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BoYWRkdworICAgICAge0ludHJpbnNpYzo6eDg2X3Nzc2UzX3BoYWRkX3dfMTI4LCAxMzY0NDB9LCAvLyBfX2J1aWx0aW5faWEzMl9waGFkZHcxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BoYWRkX3csIDEwMTk0OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BoYWRkdzI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQxX3BobWlucG9zdXcsIDEzNTQ1Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BobWlucG9zdXcxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19waHN1Yl9kLCAxMzY0NjV9LCAvLyBfX2J1aWx0aW5faWEzMl9waHN1YmQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19waHN1Yl9kXzEyOCwgMTM2NDg3fSwgLy8gX19idWlsdGluX2lhMzJfcGhzdWJkMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9waHN1Yl9kLCAxMDE5NzN9LCAvLyBfX2J1aWx0aW5faWEzMl9waHN1YmQyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19waHN1Yl9zdywgMTM2NTEyfSwgLy8gX19idWlsdGluX2lhMzJfcGhzdWJzdworICAgICAge0ludHJpbnNpYzo6eDg2X3Nzc2UzX3Boc3ViX3N3XzEyOCwgMTM2NTM1fSwgLy8gX19idWlsdGluX2lhMzJfcGhzdWJzdzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcGhzdWJfc3csIDEwMTk5OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Boc3Vic3cyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19waHN1Yl93LCAxMzY1NjF9LCAvLyBfX2J1aWx0aW5faWEzMl9waHN1YncKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19waHN1Yl93XzEyOCwgMTM2NTgzfSwgLy8gX19idWlsdGluX2lhMzJfcGhzdWJ3MTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9waHN1Yl93LCAxMDIwMjR9LCAvLyBfX2J1aWx0aW5faWEzMl9waHN1YncyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl8zZG5vd19waTJmZCwgOTg3OTh9LCAvLyBfX2J1aWx0aW5faWEzMl9waTJmZAorICAgICAge0ludHJpbnNpYzo6eDg2XzNkbm93YV9waTJmdywgOTg5MDh9LCAvLyBfX2J1aWx0aW5faWEzMl9waTJmdworICAgICAge0ludHJpbnNpYzo6eDg2X3Nzc2UzX3BtYWRkX3ViX3N3LCAxMzY2MDh9LCAvLyBfX2J1aWx0aW5faWEzMl9wbWFkZHVic3cKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19wbWFkZF91Yl9zd18xMjgsIDEzNjYzM30sIC8vIF9fYnVpbHRpbl9pYTMyX3BtYWRkdWJzdzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcG1hZGRfdWJfc3csIDEwMjA0OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BtYWRkdWJzdzI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3BtYWRkdWJzX3dfNTEyLCAxMTE4MDF9LCAvLyBfX2J1aWx0aW5faWEzMl9wbWFkZHVic3c1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wbWFkZF93ZCwgMTMwOTMxfSwgLy8gX19idWlsdGluX2lhMzJfcG1hZGR3ZAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcG1hZGRfd2QsIDEzNDIxMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BtYWRkd2QxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BtYWRkX3dkLCAxMDIwNzd9LCAvLyBfX2J1aWx0aW5faWEzMl9wbWFkZHdkMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1hZGR3X2RfNTEyLCAxMTE4MzR9LCAvLyBfX2J1aWx0aW5faWEzMl9wbWFkZHdkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcG1heHNfdywgMTMwOTU0fSwgLy8gX19idWlsdGluX2lhMzJfcG1heHN3CisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BtYXh1X2IsIDEzMDk3Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BtYXh1YgorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wbWluc193LCAxMzA5OTh9LCAvLyBfX2J1aWx0aW5faWEzMl9wbWluc3cKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcG1pbnVfYiwgMTMxMDIwfSwgLy8gX19idWlsdGluX2lhMzJfcG1pbnViCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl9kYl8xMjgsIDExMTg2NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZkYjEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl9kYl9tZW1fMTI4LCAxMTE5NTV9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92ZGIxMjhtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZfZGJfMjU2LCAxMTE4OTV9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92ZGIyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZfZGJfbWVtXzI1NiwgMTExOTg4fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdmRiMjU2bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X2RiXzUxMiwgMTExOTI1fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdmRiNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X2RiX21lbV81MTIsIDExMjAyMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZkYjUxMm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl9kd18xMjgsIDExMjA1NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZkdzEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl9kd19tZW1fMTI4LCAxMTIxNDR9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92ZHcxMjhtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZfZHdfMjU2LCAxMTIwODR9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92ZHcyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZfZHdfbWVtXzI1NiwgMTEyMTc3fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdmR3MjU2bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X2R3XzUxMiwgMTEyMTE0fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdmR3NTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X2R3X21lbV81MTIsIDExMjIxMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZkdzUxMm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3Btb3Ztc2tiLCAxMzEwNDJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92bXNrYgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcG1vdm1za2JfMTI4LCAxMzQyMzh9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92bXNrYjEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcG1vdm1za2IsIDEwMjEwM30sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Ztc2tiMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl9xYl8xMjgsIDExMjI0M30sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZxYjEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl9xYl9tZW1fMTI4LCAxMTIzMzN9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92cWIxMjhtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZfcWJfMjU2LCAxMTIyNzN9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92cWIyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZfcWJfbWVtXzI1NiwgMTEyMzY2fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnFiMjU2bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X3FiXzUxMiwgMTEyMzAzfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnFiNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X3FiX21lbV81MTIsIDExMjM5OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZxYjUxMm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl9xZF8xMjgsIDExMjQzMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZxZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl9xZF9tZW1fMTI4LCAxMTI1MjJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92cWQxMjhtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZfcWRfMjU2LCAxMTI0NjJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92cWQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZfcWRfbWVtXzI1NiwgMTEyNTU1fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnFkMjU2bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X3FkXzUxMiwgMTEyNDkyfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnFkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X3FkX21lbV81MTIsIDExMjU4OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZxZDUxMm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl9xd18xMjgsIDExMjYyMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZxdzEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl9xd19tZW1fMTI4LCAxMTI3MTF9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92cXcxMjhtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZfcXdfMjU2LCAxMTI2NTF9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92cXcyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZfcXdfbWVtXzI1NiwgMTEyNzQ0fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnF3MjU2bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X3F3XzUxMiwgMTEyNjgxfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnF3NTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X3F3X21lbV81MTIsIDExMjc3N30sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZxdzUxMm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfZGJfMTI4LCAxMTI5OTl9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c2RiMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c19kYl9tZW1fMTI4LCAxMTMwOTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c2RiMTI4bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c19kYl8yNTYsIDExMzAzMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZzZGIyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2RiX21lbV8yNTYsIDExMzEyNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZzZGIyNTZtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2RiXzUxMiwgMTEzMDYxfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnNkYjUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfZGJfbWVtXzUxMiwgMTEzMTYwfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnNkYjUxMm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfZHdfMTI4LCAxMTMxOTR9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c2R3MTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c19kd19tZW1fMTI4LCAxMTMyODd9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c2R3MTI4bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c19kd18yNTYsIDExMzIyNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZzZHcyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2R3X21lbV8yNTYsIDExMzMyMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZzZHcyNTZtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2R3XzUxMiwgMTEzMjU2fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnNkdzUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfZHdfbWVtXzUxMiwgMTEzMzU1fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnNkdzUxMm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWJfMTI4LCAxMTMzODl9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c3FiMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c19xYl9tZW1fMTI4LCAxMTM0ODJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c3FiMTI4bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c19xYl8yNTYsIDExMzQyMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWIyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FiX21lbV8yNTYsIDExMzUxNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWIyNTZtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FiXzUxMiwgMTEzNDUxfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnNxYjUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWJfbWVtXzUxMiwgMTEzNTUwfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnNxYjUxMm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWRfMTI4LCAxMTM1ODR9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c3FkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c19xZF9tZW1fMTI4LCAxMTM2Nzd9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c3FkMTI4bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c19xZF8yNTYsIDExMzYxNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FkX21lbV8yNTYsIDExMzcxMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcWQyNTZtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3FkXzUxMiwgMTEzNjQ2fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnNxZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWRfbWVtXzUxMiwgMTEzNzQ1fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnNxZDUxMm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcXdfMTI4LCAxMTM3Nzl9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c3F3MTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c19xd19tZW1fMTI4LCAxMTM4NzJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c3F3MTI4bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c19xd18yNTYsIDExMzgxMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcXcyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3F3X21lbV8yNTYsIDExMzkwNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3ZzcXcyNTZtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3F3XzUxMiwgMTEzODQxfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnNxdzUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfcXdfbWVtXzUxMiwgMTEzOTQwfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnNxdzUxMm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfd2JfMTI4LCAxMTM5NzR9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c3diMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c193Yl9tZW1fMTI4LCAxMTQwNjd9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92c3diMTI4bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92c193Yl8yNTYsIDExNDAwNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Zzd2IyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3diX21lbV8yNTYsIDExNDEwMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Zzd2IyNTZtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3diXzUxMiwgMTE0MDM2fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnN3YjUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnNfd2JfbWVtXzUxMiwgMTE0MTM1fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnN3YjUxMm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2RiXzEyOCwgMTE0MTY5fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzZGIxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kYl9tZW1fMTI4LCAxMTQyNjV9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92dXNkYjEyOG1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2RiXzI1NiwgMTE0MjAxfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzZGIyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kYl9tZW1fMjU2LCAxMTQzMDB9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92dXNkYjI1Nm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2RiXzUxMiwgMTE0MjMzfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzZGI1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kYl9tZW1fNTEyLCAxMTQzMzV9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92dXNkYjUxMm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2R3XzEyOCwgMTE0MzcwfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzZHcxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kd19tZW1fMTI4LCAxMTQ0NjZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92dXNkdzEyOG1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2R3XzI1NiwgMTE0NDAyfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzZHcyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kd19tZW1fMjU2LCAxMTQ1MDF9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92dXNkdzI1Nm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2R3XzUxMiwgMTE0NDM0fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzZHc1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19kd19tZW1fNTEyLCAxMTQ1MzZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92dXNkdzUxMm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FiXzEyOCwgMTE0NTcxfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzcWIxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xYl9tZW1fMTI4LCAxMTQ2Njd9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92dXNxYjEyOG1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FiXzI1NiwgMTE0NjAzfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzcWIyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xYl9tZW1fMjU2LCAxMTQ3MDJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92dXNxYjI1Nm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FiXzUxMiwgMTE0NjM1fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzcWI1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xYl9tZW1fNTEyLCAxMTQ3Mzd9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92dXNxYjUxMm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FkXzEyOCwgMTE0NzcyfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzcWQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xZF9tZW1fMTI4LCAxMTQ4Njh9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92dXNxZDEyOG1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FkXzI1NiwgMTE0ODA0fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzcWQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xZF9tZW1fMjU2LCAxMTQ5MDN9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92dXNxZDI1Nm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FkXzUxMiwgMTE0ODM2fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzcWQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xZF9tZW1fNTEyLCAxMTQ5Mzh9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92dXNxZDUxMm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3F3XzEyOCwgMTE0OTczfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzcXcxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xd19tZW1fMTI4LCAxMTUwNjl9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92dXNxdzEyOG1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3F3XzI1NiwgMTE1MDA1fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzcXcyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xd19tZW1fMjU2LCAxMTUxMDR9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92dXNxdzI1Nm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3F3XzUxMiwgMTE1MDM3fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzcXc1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c19xd19tZW1fNTEyLCAxMTUxMzl9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92dXNxdzUxMm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3diXzEyOCwgMTE1MTc0fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzd2IxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c193Yl9tZW1fMTI4LCAxMTUyNzB9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92dXN3YjEyOG1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3diXzI1NiwgMTE1MjA2fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzd2IyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c193Yl9tZW1fMjU2LCAxMTUzMDV9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92dXN3YjI1Nm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3diXzUxMiwgMTE1MjM4fSwgLy8gX19idWlsdGluX2lhMzJfcG1vdnVzd2I1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Z1c193Yl9tZW1fNTEyLCAxMTUzNDB9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92dXN3YjUxMm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl93Yl8xMjgsIDExMjgxMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z3YjEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcG1vdl93Yl9tZW1fMTI4LCAxMTI5MDB9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92d2IxMjhtZW1fbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Zfd2JfMjU2LCAxMTI4NDB9LCAvLyBfX2J1aWx0aW5faWEzMl9wbW92d2IyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Btb3Zfd2JfbWVtXzI1NiwgMTEyOTMzfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdndiMjU2bWVtX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X3diXzUxMiwgMTEyODcwfSwgLy8gX19idWlsdGluX2lhMzJfcG1vdndiNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbW92X3diX21lbV81MTIsIDExMjk2Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Btb3Z3YjUxMm1lbV9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDFfcG11bGRxLCAxMzU0ODF9LCAvLyBfX2J1aWx0aW5faWEzMl9wbXVsZHExMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BtdWxfZHEsIDEwMjEzMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BtdWxkcTI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wbXVsX2RxXzUxMiwgMTI2MjkxfSwgLy8gX19idWlsdGluX2lhMzJfcG11bGRxNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NzZTNfcG11bF9ocl9zdywgMTM2NjYxfSwgLy8gX19idWlsdGluX2lhMzJfcG11bGhyc3cKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc3NlM19wbXVsX2hyX3N3XzEyOCwgMTM2Njg1fSwgLy8gX19idWlsdGluX2lhMzJfcG11bGhyc3cxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BtdWxfaHJfc3csIDEwMjE1NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BtdWxocnN3MjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BtdWxfaHJfc3dfNTEyLCAxMjYzMTZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wbXVsaHJzdzUxMgorICAgICAge0ludHJpbnNpYzo6eDg2XzNkbm93X3BtdWxocncsIDk4ODE5fSwgLy8gX19idWlsdGluX2lhMzJfcG11bGhydworICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wbXVsaHVfdywgMTMxMDg4fSwgLy8gX19idWlsdGluX2lhMzJfcG11bGh1dworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcG11bGh1X3csIDEzNDI5MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BtdWxodXcxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BtdWxodV93LCAxMDIyMDd9LCAvLyBfX2J1aWx0aW5faWEzMl9wbXVsaHV3MjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BtdWxodV93XzUxMiwgMTI2MzY4fSwgLy8gX19idWlsdGluX2lhMzJfcG11bGh1dzUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wbXVsaF93LCAxMzEwNjZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wbXVsaHcKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3BtdWxoX3csIDEzNDI2NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BtdWxodzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcG11bGhfdywgMTAyMTgyfSwgLy8gX19idWlsdGluX2lhMzJfcG11bGh3MjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BtdWxoX3dfNTEyLCAxMjYzNDN9LCAvLyBfX2J1aWx0aW5faWEzMl9wbXVsaHc1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcG11bGxfdywgMTMxMTExfSwgLy8gX19idWlsdGluX2lhMzJfcG11bGx3CisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BtdWx1X2RxLCAxMzExMzN9LCAvLyBfX2J1aWx0aW5faWEzMl9wbXVsdWRxCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wbXVsdV9kcSwgMTM0MzE2fSwgLy8gX19idWlsdGluX2lhMzJfcG11bHVkcTEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcG11bHVfZHEsIDEwMjIzM30sIC8vIF9fYnVpbHRpbl9pYTMyX3BtdWx1ZHEyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcG11bHVfZHFfNTEyLCAxMjYzOTR9LCAvLyBfX2J1aWx0aW5faWEzMl9wbXVsdWRxNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BvciwgMTMxMTU2fSwgLy8gX19idWlsdGluX2lhMzJfcG9yCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHJvbF9kXzEyOCwgMTE1NDg5fSwgLy8gX19idWlsdGluX2lhMzJfcHJvbGQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Byb2xfZF8yNTYsIDExNTUxOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Byb2xkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wcm9sX2RfNTEyLCAxMTU1NDd9LCAvLyBfX2J1aWx0aW5faWEzMl9wcm9sZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHJvbF9xXzEyOCwgMTE1NTc2fSwgLy8gX19idWlsdGluX2lhMzJfcHJvbHExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Byb2xfcV8yNTYsIDExNTYwNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Byb2xxMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wcm9sX3FfNTEyLCAxMTU2MzR9LCAvLyBfX2J1aWx0aW5faWEzMl9wcm9scTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHJvbHZfZF8xMjgsIDExNTY2M30sIC8vIF9fYnVpbHRpbl9pYTMyX3Byb2x2ZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHJvbHZfZF8yNTYsIDExNTY5M30sIC8vIF9fYnVpbHRpbl9pYTMyX3Byb2x2ZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHJvbHZfZF81MTIsIDExNTcyM30sIC8vIF9fYnVpbHRpbl9pYTMyX3Byb2x2ZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHJvbHZfcV8xMjgsIDExNTc1M30sIC8vIF9fYnVpbHRpbl9pYTMyX3Byb2x2cTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHJvbHZfcV8yNTYsIDExNTc4M30sIC8vIF9fYnVpbHRpbl9pYTMyX3Byb2x2cTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHJvbHZfcV81MTIsIDExNTgxM30sIC8vIF9fYnVpbHRpbl9pYTMyX3Byb2x2cTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHJvcl9kXzEyOCwgMTE1ODQzfSwgLy8gX19idWlsdGluX2lhMzJfcHJvcmQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Byb3JfZF8yNTYsIDExNTg3Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Byb3JkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wcm9yX2RfNTEyLCAxMTU5MDF9LCAvLyBfX2J1aWx0aW5faWEzMl9wcm9yZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHJvcl9xXzEyOCwgMTE1OTMwfSwgLy8gX19idWlsdGluX2lhMzJfcHJvcnExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Byb3JfcV8yNTYsIDExNTk1OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Byb3JxMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wcm9yX3FfNTEyLCAxMTU5ODh9LCAvLyBfX2J1aWx0aW5faWEzMl9wcm9ycTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHJvcnZfZF8xMjgsIDExNjAxN30sIC8vIF9fYnVpbHRpbl9pYTMyX3Byb3J2ZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHJvcnZfZF8yNTYsIDExNjA0N30sIC8vIF9fYnVpbHRpbl9pYTMyX3Byb3J2ZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHJvcnZfZF81MTIsIDExNjA3N30sIC8vIF9fYnVpbHRpbl9pYTMyX3Byb3J2ZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHJvcnZfcV8xMjgsIDExNjEwN30sIC8vIF9fYnVpbHRpbl9pYTMyX3Byb3J2cTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHJvcnZfcV8yNTYsIDExNjEzN30sIC8vIF9fYnVpbHRpbl9pYTMyX3Byb3J2cTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHJvcnZfcV81MTIsIDExNjE2N30sIC8vIF9fYnVpbHRpbl9pYTMyX3Byb3J2cTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BzYWRfYncsIDEzMTE3NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzYWRidworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcHNhZF9idywgMTM0MzQyfSwgLy8gX19idWlsdGluX2lhMzJfcHNhZGJ3MTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc2FkX2J3LCAxMDIyNTl9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2FkYncyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNhZF9id181MTIsIDEyNjQyMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzYWRidzUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X3Nzc2UzX3BzaHVmX2IsIDEzNjcxMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzaHVmYgorICAgICAge0ludHJpbnNpYzo6eDg2X3Nzc2UzX3BzaHVmX2JfMTI4LCAxMzY3MzR9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2h1ZmIxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzaHVmX2IsIDEwMjI4NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzaHVmYjI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc2h1Zl9iXzUxMiwgMTI2NDQ1fSwgLy8gX19idWlsdGluX2lhMzJfcHNodWZiNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlX3BzaHVmX3csIDEzMzA1NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzaHVmdworICAgICAge0ludHJpbnNpYzo6eDg2X3Nzc2UzX3BzaWduX2IsIDEzNjc1OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzaWduYgorICAgICAge0ludHJpbnNpYzo6eDg2X3Nzc2UzX3BzaWduX2JfMTI4LCAxMzY3ODF9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2lnbmIxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzaWduX2IsIDEwMjMwOX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzaWduYjI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3Nzc2UzX3BzaWduX2QsIDEzNjgwNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzaWduZAorICAgICAge0ludHJpbnNpYzo6eDg2X3Nzc2UzX3BzaWduX2RfMTI4LCAxMzY4Mjh9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2lnbmQxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzaWduX2QsIDEwMjMzNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzaWduZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3Nzc2UzX3BzaWduX3csIDEzNjg1M30sIC8vIF9fYnVpbHRpbl9pYTMyX3BzaWdudworICAgICAge0ludHJpbnNpYzo6eDg2X3Nzc2UzX3BzaWduX3dfMTI4LCAxMzY4NzV9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2lnbncxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzaWduX3csIDEwMjM1OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzaWdudzI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wc2xsX2QsIDEzMTE5N30sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGxkCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wc2xsX2QsIDEzNDM2N30sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGxkMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc2xsX2QsIDEwMjM4NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGxkMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzbGxfZF81MTIsIDEyNjQ3MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGxkNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BzbGxpX2QsIDEzMTI2MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGxkaQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcHNsbGlfZCwgMTM0NDM5fSwgLy8gX19idWlsdGluX2lhMzJfcHNsbGRpMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc2xsaV9kLCAxMDI0NTZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xsZGkyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNsbGlfZF81MTIsIDEyNjU0Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGxkaTUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wc2xsX3EsIDEzMTIxOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGxxCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wc2xsX3EsIDEzNDM5MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGxxMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc2xsX3EsIDEwMjQwOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGxxMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzbGxfcV81MTIsIDEyNjQ5NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGxxNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BzbGxpX3EsIDEzMTI4Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGxxaQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcHNsbGlfcSwgMTM0NDY0fSwgLy8gX19idWlsdGluX2lhMzJfcHNsbHFpMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc2xsaV9xLCAxMDI0ODF9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xscWkyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNsbGlfcV81MTIsIDEyNjU2N30sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGxxaTUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc2xsdl93XzI1NiwgMTI2NjkwfSwgLy8gX19idWlsdGluX2lhMzJfcHNsbHYxNmhpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzbGx2X2RfNTEyLCAxMjY2MTd9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xsdjE2c2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzbGx2X3EsIDEwMjU3OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGx2MmRpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzbGx2X3dfNTEyLCAxMjY3MTV9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xsdjMyaGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzbGx2X3FfMjU2LCAxMDI2MDN9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xsdjRkaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcHNsbHZfZCwgMTAyNTMxfSwgLy8gX19idWlsdGluX2lhMzJfcHNsbHY0c2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNsbHZfcV81MTIsIDEyNjY0Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGx2OGRpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzbGx2X3dfMTI4LCAxMjY2NjZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xsdjhoaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcHNsbHZfZF8yNTYsIDEwMjU1NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGx2OHNpCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BzbGxfdywgMTMxMjM5fSwgLy8gX19idWlsdGluX2lhMzJfcHNsbHcKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzbGxfdywgMTM0NDE1fSwgLy8gX19idWlsdGluX2lhMzJfcHNsbHcxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzbGxfdywgMTAyNDMyfSwgLy8gX19idWlsdGluX2lhMzJfcHNsbHcyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNsbF93XzUxMiwgMTI2NTE4fSwgLy8gX19idWlsdGluX2lhMzJfcHNsbHc1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcHNsbGlfdywgMTMxMzA0fSwgLy8gX19idWlsdGluX2lhMzJfcHNsbHdpCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wc2xsaV93LCAxMzQ0ODl9LCAvLyBfX2J1aWx0aW5faWEzMl9wc2xsd2kxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzbGxpX3csIDEwMjUwNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzbGx3aTI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc2xsaV93XzUxMiwgMTI2NTkyfSwgLy8gX19idWlsdGluX2lhMzJfcHNsbHdpNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BzcmFfZCwgMTMxMzI2fSwgLy8gX19idWlsdGluX2lhMzJfcHNyYWQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzcmFfZCwgMTM0NTE0fSwgLy8gX19idWlsdGluX2lhMzJfcHNyYWQxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzcmFfZCwgMTAyNjI3fSwgLy8gX19idWlsdGluX2lhMzJfcHNyYWQyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNyYV9kXzUxMiwgMTI2NzQwfSwgLy8gX19idWlsdGluX2lhMzJfcHNyYWQ1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcHNyYWlfZCwgMTMxMzY4fSwgLy8gX19idWlsdGluX2lhMzJfcHNyYWRpCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wc3JhaV9kLCAxMzQ1NjJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JhZGkxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzcmFpX2QsIDEwMjY3NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmFkaTI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc3JhaV9kXzUxMiwgMTI2ODYwfSwgLy8gX19idWlsdGluX2lhMzJfcHNyYWRpNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzcmFfcV8xMjgsIDEyNjc2NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmFxMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzcmFfcV8yNTYsIDEyNjc4OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmFxMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzcmFfcV81MTIsIDEyNjgxMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmFxNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzcmFpX3FfMTI4LCAxMjY4ODV9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JhcWkxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNyYWlfcV8yNTYsIDEyNjkxMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmFxaTI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc3JhaV9xXzUxMiwgMTI2OTM1fSwgLy8gX19idWlsdGluX2lhMzJfcHNyYXFpNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzcmF2X3dfMjU2LCAxMjcxMDh9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JhdjE2aGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNyYXZfZF81MTIsIDEyNjk4NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmF2MTZzaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc3Jhdl93XzUxMiwgMTI3MTMzfSwgLy8gX19idWlsdGluX2lhMzJfcHNyYXYzMmhpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc3Jhdl9kLCAxMDI3MjV9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JhdjRzaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc3Jhdl9xXzUxMiwgMTI3MDYwfSwgLy8gX19idWlsdGluX2lhMzJfcHNyYXY4ZGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNyYXZfd18xMjgsIDEyNzA4NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmF2OGhpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc3Jhdl9kXzI1NiwgMTAyNzQ5fSwgLy8gX19idWlsdGluX2lhMzJfcHNyYXY4c2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNyYXZfcV8xMjgsIDEyNzAxMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmF2cTEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc3Jhdl9xXzI1NiwgMTI3MDM1fSwgLy8gX19idWlsdGluX2lhMzJfcHNyYXZxMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BzcmFfdywgMTMxMzQ3fSwgLy8gX19idWlsdGluX2lhMzJfcHNyYXcKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzcmFfdywgMTM0NTM4fSwgLy8gX19idWlsdGluX2lhMzJfcHNyYXcxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzcmFfdywgMTAyNjUxfSwgLy8gX19idWlsdGluX2lhMzJfcHNyYXcyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNyYV93XzUxMiwgMTI2ODM2fSwgLy8gX19idWlsdGluX2lhMzJfcHNyYXc1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcHNyYWlfdywgMTMxMzkwfSwgLy8gX19idWlsdGluX2lhMzJfcHNyYXdpCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wc3JhaV93LCAxMzQ1ODd9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3Jhd2kxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzcmFpX3csIDEwMjcwMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmF3aTI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc3JhaV93XzUxMiwgMTI2OTYwfSwgLy8gX19idWlsdGluX2lhMzJfcHNyYXdpNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BzcmxfZCwgMTMxNDEyfSwgLy8gX19idWlsdGluX2lhMzJfcHNybGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzcmxfZCwgMTM0NjEyfSwgLy8gX19idWlsdGluX2lhMzJfcHNybGQxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzcmxfZCwgMTAyNzczfSwgLy8gX19idWlsdGluX2lhMzJfcHNybGQyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNybF9kXzUxMiwgMTI3MTU4fSwgLy8gX19idWlsdGluX2lhMzJfcHNybGQ1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcHNybGlfZCwgMTMxNDc1fSwgLy8gX19idWlsdGluX2lhMzJfcHNybGRpCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wc3JsaV9kLCAxMzQ2ODR9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JsZGkxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzcmxpX2QsIDEwMjg0NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmxkaTI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc3JsaV9kXzUxMiwgMTI3MjMwfSwgLy8gX19idWlsdGluX2lhMzJfcHNybGRpNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BzcmxfcSwgMTMxNDMzfSwgLy8gX19idWlsdGluX2lhMzJfcHNybHEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzcmxfcSwgMTM0NjM2fSwgLy8gX19idWlsdGluX2lhMzJfcHNybHExMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzcmxfcSwgMTAyNzk3fSwgLy8gX19idWlsdGluX2lhMzJfcHNybHEyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNybF9xXzUxMiwgMTI3MTgyfSwgLy8gX19idWlsdGluX2lhMzJfcHNybHE1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcHNybGlfcSwgMTMxNDk3fSwgLy8gX19idWlsdGluX2lhMzJfcHNybHFpCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wc3JsaV9xLCAxMzQ3MDl9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JscWkxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzcmxpX3EsIDEwMjg3MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzcmxxaTI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc3JsaV9xXzUxMiwgMTI3MjU1fSwgLy8gX19idWlsdGluX2lhMzJfcHNybHFpNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3Bzcmx2X3dfMjU2LCAxMjczNzh9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JsdjE2aGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNybHZfZF81MTIsIDEyNzMwNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Bzcmx2MTZzaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcHNybHZfcSwgMTAyOTY4fSwgLy8gX19idWlsdGluX2lhMzJfcHNybHYyZGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNybHZfd181MTIsIDEyNzQwM30sIC8vIF9fYnVpbHRpbl9pYTMyX3Bzcmx2MzJoaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcHNybHZfcV8yNTYsIDEwMjk5Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Bzcmx2NGRpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc3Jsdl9kLCAxMDI5MjB9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JsdjRzaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc3Jsdl9xXzUxMiwgMTI3MzMwfSwgLy8gX19idWlsdGluX2lhMzJfcHNybHY4ZGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcHNybHZfd18xMjgsIDEyNzM1NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Bzcmx2OGhpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4Ml9wc3Jsdl9kXzI1NiwgMTAyOTQ0fSwgLy8gX19idWlsdGluX2lhMzJfcHNybHY4c2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcHNybF93LCAxMzE0NTR9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JsdworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcHNybF93LCAxMzQ2NjB9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JsdzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcHNybF93LCAxMDI4MjF9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JsdzI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9wc3JsX3dfNTEyLCAxMjcyMDZ9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3JsdzUxMgorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wc3JsaV93LCAxMzE1MTl9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3Jsd2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzcmxpX3csIDEzNDczNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Bzcmx3aTEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcHNybGlfdywgMTAyODk1fSwgLy8gX19idWlsdGluX2lhMzJfcHNybHdpMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3BzcmxpX3dfNTEyLCAxMjcyODB9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3Jsd2k1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcHN1Yl9iLCAxMzE1NDF9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3ViYgorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wc3ViX2QsIDEzMTU2Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzdWJkCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BzdWJfcSwgMTMxNTgzfSwgLy8gX19idWlsdGluX2lhMzJfcHN1YnEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcHN1YnNfYiwgMTMxNjI1fSwgLy8gX19idWlsdGluX2lhMzJfcHN1YnNiCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wc3Vic19iLCAxMzQ3NTl9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3Vic2IxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzdWJzX2IsIDEwMzAxNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzdWJzYjI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3BzdWJzX2JfNTEyLCAxMTYxOTd9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3Vic2I1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wc3Vic193LCAxMzE2NDd9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3Vic3cKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3BzdWJzX3csIDEzNDc4NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzdWJzdzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcHN1YnNfdywgMTAzMDQxfSwgLy8gX19idWlsdGluX2lhMzJfcHN1YnN3MjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHN1YnNfd181MTIsIDExNjIyN30sIC8vIF9fYnVpbHRpbl9pYTMyX3BzdWJzdzUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3BzdWJ1c19iLCAxMzE2Njl9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3VidXNiCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9wc3VidXNfYiwgMTM0ODA5fSwgLy8gX19idWlsdGluX2lhMzJfcHN1YnVzYjEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDJfcHN1YnVzX2IsIDEwMzA2Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzdWJ1c2IyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wc3VidXNfYl81MTIsIDExNjI1N30sIC8vIF9fYnVpbHRpbl9pYTMyX3BzdWJ1c2I1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wc3VidXNfdywgMTMxNjkyfSwgLy8gX19idWlsdGluX2lhMzJfcHN1YnVzdworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfcHN1YnVzX3csIDEzNDgzNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3BzdWJ1c3cxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdngyX3BzdWJ1c193LCAxMDMwOTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3VidXN3MjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHN1YnVzX3dfNTEyLCAxMTYyODh9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3VidXN3NTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcHN1Yl93LCAxMzE2MDR9LCAvLyBfX2J1aWx0aW5faWEzMl9wc3VidworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3B0ZXJubG9nX2RfMTI4LCAxMTYzMTl9LCAvLyBfX2J1aWx0aW5faWEzMl9wdGVybmxvZ2QxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel9wdGVybmxvZ19kXzEyOCwgMTIzNjMxfSwgLy8gX19idWlsdGluX2lhMzJfcHRlcm5sb2dkMTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHRlcm5sb2dfZF8yNTYsIDExNjM1Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3B0ZXJubG9nZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3B0ZXJubG9nX2RfMjU2LCAxMjM2NjV9LCAvLyBfX2J1aWx0aW5faWEzMl9wdGVybmxvZ2QyNTZfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wdGVybmxvZ19kXzUxMiwgMTE2Mzg1fSwgLy8gX19idWlsdGluX2lhMzJfcHRlcm5sb2dkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfcHRlcm5sb2dfZF81MTIsIDEyMzY5OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3B0ZXJubG9nZDUxMl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3B0ZXJubG9nX3FfMTI4LCAxMTY0MTh9LCAvLyBfX2J1aWx0aW5faWEzMl9wdGVybmxvZ3ExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel9wdGVybmxvZ19xXzEyOCwgMTIzNzMzfSwgLy8gX19idWlsdGluX2lhMzJfcHRlcm5sb2dxMTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcHRlcm5sb2dfcV8yNTYsIDExNjQ1MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3B0ZXJubG9ncTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3B0ZXJubG9nX3FfMjU2LCAxMjM3Njd9LCAvLyBfX2J1aWx0aW5faWEzMl9wdGVybmxvZ3EyNTZfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wdGVybmxvZ19xXzUxMiwgMTE2NDg0fSwgLy8gX19idWlsdGluX2lhMzJfcHRlcm5sb2dxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfcHRlcm5sb2dfcV81MTIsIDEyMzgwMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3B0ZXJubG9ncTUxMl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQxX3B0ZXN0YywgMTM1NTA2fSwgLy8gX19idWlsdGluX2lhMzJfcHRlc3RjMTI4CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3B0ZXN0Y18yNTYsIDEwMDIxOX0sIC8vIF9fYnVpbHRpbl9pYTMyX3B0ZXN0YzI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTQxX3B0ZXN0bnpjLCAxMzU1MzF9LCAvLyBfX2J1aWx0aW5faWEzMl9wdGVzdG56YzEyOAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9wdGVzdG56Y18yNTYsIDEwMDI0NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3B0ZXN0bnpjMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDFfcHRlc3R6LCAxMzU1NTh9LCAvLyBfX2J1aWx0aW5faWEzMl9wdGVzdHoxMjgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfcHRlc3R6XzI1NiwgMTAwMjcxfSwgLy8gX19idWlsdGluX2lhMzJfcHRlc3R6MjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3B1bnBja2hidywgMTMxNzE1fSwgLy8gX19idWlsdGluX2lhMzJfcHVucGNraGJ3CisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3B1bnBja2hkcSwgMTMxNzQwfSwgLy8gX19idWlsdGluX2lhMzJfcHVucGNraGRxCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3B1bnBja2h3ZCwgMTMxNzY1fSwgLy8gX19idWlsdGluX2lhMzJfcHVucGNraHdkCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3B1bnBja2xidywgMTMxNzkwfSwgLy8gX19idWlsdGluX2lhMzJfcHVucGNrbGJ3CisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3B1bnBja2xkcSwgMTMxODE1fSwgLy8gX19idWlsdGluX2lhMzJfcHVucGNrbGRxCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3B1bnBja2x3ZCwgMTMxODQwfSwgLy8gX19idWlsdGluX2lhMzJfcHVucGNrbHdkCisgICAgICB7SW50cmluc2ljOjp4ODZfbW14X3B4b3IsIDEzMTg2NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3B4b3IKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19yYW5nZV9wZF8xMjgsIDExNjUxN30sIC8vIF9fYnVpbHRpbl9pYTMyX3JhbmdlcGQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3JhbmdlX3BkXzI1NiwgMTE2NTQ4fSwgLy8gX19idWlsdGluX2lhMzJfcmFuZ2VwZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcmFuZ2VfcGRfNTEyLCAxMTY1Nzl9LCAvLyBfX2J1aWx0aW5faWEzMl9yYW5nZXBkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19yYW5nZV9wc18xMjgsIDExNjYxMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3JhbmdlcHMxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3JhbmdlX3BzXzI1NiwgMTE2NjQxfSwgLy8gX19idWlsdGluX2lhMzJfcmFuZ2VwczI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcmFuZ2VfcHNfNTEyLCAxMTY2NzJ9LCAvLyBfX2J1aWx0aW5faWEzMl9yYW5nZXBzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19yYW5nZV9zZCwgMTE2NzAzfSwgLy8gX19idWlsdGluX2lhMzJfcmFuZ2VzZDEyOF9yb3VuZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcmFuZ2Vfc3MsIDExNjc0MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Jhbmdlc3MxMjhfcm91bmRfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9yY3AxNF9wZF8xMjgsIDEyNzQyOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3JjcDE0cGQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9yY3AxNF9wZF8yNTYsIDEyNzQ1OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3JjcDE0cGQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9yY3AxNF9wZF81MTIsIDEyNzQ5MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3JjcDE0cGQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9yY3AxNF9wc18xMjgsIDEyNzUyMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3JjcDE0cHMxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9yY3AxNF9wc18yNTYsIDEyNzU1Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3JjcDE0cHMyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9yY3AxNF9wc181MTIsIDEyNzU4M30sIC8vIF9fYnVpbHRpbl9pYTMyX3JjcDE0cHM1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9yY3AxNF9zZCwgMTI3NjE0fSwgLy8gX19idWlsdGluX2lhMzJfcmNwMTRzZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3JjcDE0X3NzLCAxMjc2NDJ9LCAvLyBfX2J1aWx0aW5faWEzMl9yY3AxNHNzX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcmNwMjhfcGQsIDEyNzY3MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3JjcDI4cGRfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9yY3AyOF9wcywgMTI3Njk4fSwgLy8gX19idWlsdGluX2lhMzJfcmNwMjhwc19tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3JjcDI4X3NkLCAxMjc3MjZ9LCAvLyBfX2J1aWx0aW5faWEzMl9yY3AyOHNkX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcmNwMjhfc3MsIDEyNzc2MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3JjcDI4c3Nfcm91bmRfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV9yY3BfcHMsIDEzMzA3Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3JjcHBzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3JjcF9wc18yNTYsIDEwMDI5Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3JjcHBzMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlX3JjcF9zcywgMTMzMDk3fSwgLy8gX19idWlsdGluX2lhMzJfcmNwc3MKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9yZGZzYmFzZV8zMiwgMTMyMDE1fSwgLy8gX19idWlsdGluX2lhMzJfcmRmc2Jhc2UzMgorICAgICAge0ludHJpbnNpYzo6eDg2X3JkZnNiYXNlXzY0LCAxMzIwNDF9LCAvLyBfX2J1aWx0aW5faWEzMl9yZGZzYmFzZTY0CisgICAgICB7SW50cmluc2ljOjp4ODZfcmRnc2Jhc2VfMzIsIDEzMjA2N30sIC8vIF9fYnVpbHRpbl9pYTMyX3JkZ3NiYXNlMzIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9yZGdzYmFzZV82NCwgMTMyMDkzfSwgLy8gX19idWlsdGluX2lhMzJfcmRnc2Jhc2U2NAorICAgICAge0ludHJpbnNpYzo6eDg2X3JkcGlkLCAxMzIxMTl9LCAvLyBfX2J1aWx0aW5faWEzMl9yZHBpZAorICAgICAge0ludHJpbnNpYzo6eDg2X3JkcGtydSwgMTMyMTQwfSwgLy8gX19idWlsdGluX2lhMzJfcmRwa3J1CisgICAgICB7SW50cmluc2ljOjp4ODZfcmRwbWMsIDEzMjE2Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3JkcG1jCisgICAgICB7SW50cmluc2ljOjp4ODZfcmRzc3BkLCAxMzIxODN9LCAvLyBfX2J1aWx0aW5faWEzMl9yZHNzcGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9yZHNzcHEsIDEzMjIwNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Jkc3NwcQorICAgICAge0ludHJpbnNpYzo6eDg2X3JkdHNjLCAxMzIyMjd9LCAvLyBfX2J1aWx0aW5faWEzMl9yZHRzYworICAgICAge0ludHJpbnNpYzo6eDg2X3JkdHNjcCwgMTMyMjQ4fSwgLy8gX19idWlsdGluX2lhMzJfcmR0c2NwCisgICAgICB7SW50cmluc2ljOjp4ODZfZmxhZ3NfcmVhZF91MzIsIDEyOTYwNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3JlYWRlZmxhZ3NfdTMyCisgICAgICB7SW50cmluc2ljOjp4ODZfZmxhZ3NfcmVhZF91NjQsIDEyOTYzNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3JlYWRlZmxhZ3NfdTY0CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcmVkdWNlX3BkXzEyOCwgMTE2Nzc3fSwgLy8gX19idWlsdGluX2lhMzJfcmVkdWNlcGQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3JlZHVjZV9wZF8yNTYsIDExNjgwOX0sIC8vIF9fYnVpbHRpbl9pYTMyX3JlZHVjZXBkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19yZWR1Y2VfcGRfNTEyLCAxMTY4NDF9LCAvLyBfX2J1aWx0aW5faWEzMl9yZWR1Y2VwZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcmVkdWNlX3BzXzEyOCwgMTE2ODczfSwgLy8gX19idWlsdGluX2lhMzJfcmVkdWNlcHMxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3JlZHVjZV9wc18yNTYsIDExNjkwNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3JlZHVjZXBzMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19yZWR1Y2VfcHNfNTEyLCAxMTY5Mzd9LCAvLyBfX2J1aWx0aW5faWEzMl9yZWR1Y2VwczUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcmVkdWNlX3NkLCAxMTY5Njl9LCAvLyBfX2J1aWx0aW5faWEzMl9yZWR1Y2VzZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcmVkdWNlX3NzLCAxMTY5OTh9LCAvLyBfX2J1aWx0aW5faWEzMl9yZWR1Y2Vzc19tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcm5kc2NhbGVfcGRfMTI4LCAxMTcwMjd9LCAvLyBfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXBkXzEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcm5kc2NhbGVfcGRfMjU2LCAxMTcwNjJ9LCAvLyBfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXBkXzI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfcm5kc2NhbGVfcGRfNTEyLCAxMTcwOTd9LCAvLyBfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXBkX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19ybmRzY2FsZV9wc18xMjgsIDExNzEyOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcHNfMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19ybmRzY2FsZV9wc18yNTYsIDExNzE2M30sIC8vIF9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcHNfMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19ybmRzY2FsZV9wc181MTIsIDExNzE5OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcHNfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3JuZHNjYWxlX3NkLCAxMTcyMjl9LCAvLyBfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXNkX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19ybmRzY2FsZV9zcywgMTE3MjY2fSwgLy8gX19idWlsdGluX2lhMzJfcm5kc2NhbGVzc19yb3VuZF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDFfcm91bmRfcGQsIDEzNTU4M30sIC8vIF9fYnVpbHRpbl9pYTMyX3JvdW5kcGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfcm91bmRfcGRfMjU2LCAxMDAzMjB9LCAvLyBfX2J1aWx0aW5faWEzMl9yb3VuZHBkMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDFfcm91bmRfcHMsIDEzNTYwNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3JvdW5kcHMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfcm91bmRfcHNfMjU2LCAxMDAzNDZ9LCAvLyBfX2J1aWx0aW5faWEzMl9yb3VuZHBzMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlNDFfcm91bmRfc2QsIDEzNTYyOX0sIC8vIF9fYnVpbHRpbl9pYTMyX3JvdW5kc2QKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2U0MV9yb3VuZF9zcywgMTM1NjUyfSwgLy8gX19idWlsdGluX2lhMzJfcm91bmRzcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9yc3FydDE0X3BkXzEyOCwgMTI3Nzk0fSwgLy8gX19idWlsdGluX2lhMzJfcnNxcnQxNHBkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcnNxcnQxNF9wZF8yNTYsIDEyNzgyN30sIC8vIF9fYnVpbHRpbl9pYTMyX3JzcXJ0MTRwZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3JzcXJ0MTRfcGRfNTEyLCAxMjc4NjB9LCAvLyBfX2J1aWx0aW5faWEzMl9yc3FydDE0cGQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9yc3FydDE0X3BzXzEyOCwgMTI3ODkzfSwgLy8gX19idWlsdGluX2lhMzJfcnNxcnQxNHBzMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfcnNxcnQxNF9wc18yNTYsIDEyNzkyNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3JzcXJ0MTRwczI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3JzcXJ0MTRfcHNfNTEyLCAxMjc5NTl9LCAvLyBfX2J1aWx0aW5faWEzMl9yc3FydDE0cHM1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9yc3FydDE0X3NkLCAxMjc5OTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9yc3FydDE0c2RfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9yc3FydDE0X3NzLCAxMjgwMjJ9LCAvLyBfX2J1aWx0aW5faWEzMl9yc3FydDE0c3NfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9yc3FydDI4X3BkLCAxMjgwNTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9yc3FydDI4cGRfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9yc3FydDI4X3BzLCAxMjgwODJ9LCAvLyBfX2J1aWx0aW5faWEzMl9yc3FydDI4cHNfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9yc3FydDI4X3NkLCAxMjgxMTJ9LCAvLyBfX2J1aWx0aW5faWEzMl9yc3FydDI4c2Rfcm91bmRfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9yc3FydDI4X3NzLCAxMjgxNDh9LCAvLyBfX2J1aWx0aW5faWEzMl9yc3FydDI4c3Nfcm91bmRfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV9yc3FydF9wcywgMTMzMTE4fSwgLy8gX19idWlsdGluX2lhMzJfcnNxcnRwcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF9yc3FydF9wc18yNTYsIDEwMDM3Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3JzcXJ0cHMyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfcnNxcnRfc3MsIDEzMzE0MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3JzcXJ0c3MKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9yc3RvcnNzcCwgMTMyMjcwfSwgLy8gX19idWlsdGluX2lhMzJfcnN0b3Jzc3AKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zYXZlcHJldnNzcCwgMTMyMjk0fSwgLy8gX19idWlsdGluX2lhMzJfc2F2ZXByZXZzc3AKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19zY2FsZWZfcGRfMTI4LCAxMTczMDN9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2FsZWZwZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfc2NhbGVmX3BkXzI1NiwgMTE3MzM1fSwgLy8gX19idWlsdGluX2lhMzJfc2NhbGVmcGQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3NjYWxlZl9wZF81MTIsIDExNzM2N30sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYWxlZnBkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19zY2FsZWZfcHNfMTI4LCAxMTczOTl9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2FsZWZwczEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfc2NhbGVmX3BzXzI1NiwgMTE3NDMxfSwgLy8gX19idWlsdGluX2lhMzJfc2NhbGVmcHMyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3NjYWxlZl9wc181MTIsIDExNzQ2M30sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYWxlZnBzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19zY2FsZWZfc2QsIDExNzQ5NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYWxlZnNkX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19zY2FsZWZfc3MsIDExNzUzMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYWxlZnNzX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfc2NhdHRlcl9xcHNfNTEyLCAxMjgzOTB9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2MTZzZgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9zY2F0dGVyX3FwaV81MTIsIDEyODMzMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXYxNnNpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJkaXYyX2RmLCAxMjg0MjB9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2MmRmCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJkaXYyX2RpLCAxMjg0NDl9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2MmRpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJkaXY0X2RmLCAxMjg0Nzh9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2NGRmCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJkaXY0X2RpLCAxMjg1MDd9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2NGRpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJkaXY0X3NmLCAxMjg1MzZ9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2NHNmCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJkaXY0X3NpLCAxMjg1NjV9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2NHNpCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJfcXBkXzUxMiwgMTI4MzAyfSwgLy8gX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjhkZgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9zY2F0dGVyX3FwcV81MTIsIDEyODM2MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY4ZGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfc2NhdHRlcmRpdjhfc2YsIDEyODU5NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY4c2YKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfc2NhdHRlcmRpdjhfc2ksIDEyODYyM30sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY4c2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfc2NhdHRlcnBmX2RwZF81MTIsIDEyODY1Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJwZmRwZAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9zY2F0dGVycGZfZHBzXzUxMiwgMTI4NjgwfSwgLy8gX19idWlsdGluX2lhMzJfc2NhdHRlcnBmZHBzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJwZl9xcGRfNTEyLCAxMjg3MDh9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVycGZxcGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfc2NhdHRlcnBmX3Fwc181MTIsIDEyODczNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJwZnFwcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9zY2F0dGVyX2Rwc181MTIsIDEyODI3Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXYxNnNmCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJfZHBpXzUxMiwgMTI4MjEzfSwgLy8gX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjE2c2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfc2NhdHRlcnNpdjJfZGYsIDEyODc2NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXYyZGYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfc2NhdHRlcnNpdjJfZGksIDEyODc5M30sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXYyZGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfc2NhdHRlcnNpdjRfZGYsIDEyODgyMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY0ZGYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfc2NhdHRlcnNpdjRfZGksIDEyODg1MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY0ZGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfc2NhdHRlcnNpdjRfc2YsIDEyODg4MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY0c2YKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfc2NhdHRlcnNpdjRfc2ksIDEyODkwOX0sIC8vIF9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY0c2kKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfc2NhdHRlcl9kcGRfNTEyLCAxMjgxODR9LCAvLyBfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2OGRmCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3NjYXR0ZXJfZHBxXzUxMiwgMTI4MjQzfSwgLy8gX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjhkaQorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9zY2F0dGVyc2l2OF9zZiwgMTI4OTM4fSwgLy8gX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjhzZgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9zY2F0dGVyc2l2OF9zaSwgMTI4OTY3fSwgLy8gX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjhzaQorICAgICAge0ludHJpbnNpYzo6eDg2X3NldHNzYnN5LCAxMzIzMjF9LCAvLyBfX2J1aWx0aW5faWEzMl9zZXRzc2JzeQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV9zZmVuY2UsIDEzMzE2NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3NmZW5jZQorICAgICAge0ludHJpbnNpYzo6eDg2X3NoYTFtc2cxLCAxMzIzNDV9LCAvLyBfX2J1aWx0aW5faWEzMl9zaGExbXNnMQorICAgICAge0ludHJpbnNpYzo6eDg2X3NoYTFtc2cyLCAxMzIzNjl9LCAvLyBfX2J1aWx0aW5faWEzMl9zaGExbXNnMgorICAgICAge0ludHJpbnNpYzo6eDg2X3NoYTFuZXh0ZSwgMTMyMzkzfSwgLy8gX19idWlsdGluX2lhMzJfc2hhMW5leHRlCisgICAgICB7SW50cmluc2ljOjp4ODZfc2hhMXJuZHM0LCAxMzI0MTh9LCAvLyBfX2J1aWx0aW5faWEzMl9zaGExcm5kczQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zaGEyNTZtc2cxLCAxMzI0NDN9LCAvLyBfX2J1aWx0aW5faWEzMl9zaGEyNTZtc2cxCisgICAgICB7SW50cmluc2ljOjp4ODZfc2hhMjU2bXNnMiwgMTMyNDY5fSwgLy8gX19idWlsdGluX2lhMzJfc2hhMjU2bXNnMgorICAgICAge0ludHJpbnNpYzo6eDg2X3NoYTI1NnJuZHMyLCAxMzI0OTV9LCAvLyBfX2J1aWx0aW5faWEzMl9zaGEyNTZybmRzMgorICAgICAge0ludHJpbnNpYzo6eDg2X3Nsd3BjYiwgMTMyNTIyfSwgLy8gX19idWlsdGluX2lhMzJfc2x3cGNiCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl9zcXJ0X3BkLCAxMzQ4NjF9LCAvLyBfX2J1aWx0aW5faWEzMl9zcXJ0cGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19zcXJ0X3BkXzEyOCwgMTE3NTY1fSwgLy8gX19idWlsdGluX2lhMzJfc3FydHBkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfc3FydF9wZF8yNTYsIDEwMDM5OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3NxcnRwZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3NxcnRfcGRfMjU2LCAxMTc1OTV9LCAvLyBfX2J1aWx0aW5faWEzMl9zcXJ0cGQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3NxcnRfcGRfNTEyLCAxMTc2MjV9LCAvLyBfX2J1aWx0aW5faWEzMl9zcXJ0cGQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV9zcXJ0X3BzLCAxMzMxODZ9LCAvLyBfX2J1aWx0aW5faWEzMl9zcXJ0cHMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19zcXJ0X3BzXzEyOCwgMTE3NjU1fSwgLy8gX19idWlsdGluX2lhMzJfc3FydHBzMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfc3FydF9wc18yNTYsIDEwMDQyM30sIC8vIF9fYnVpbHRpbl9pYTMyX3NxcnRwczI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3NxcnRfcHNfMjU2LCAxMTc2ODV9LCAvLyBfX2J1aWx0aW5faWEzMl9zcXJ0cHMyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3NxcnRfcHNfNTEyLCAxMTc3MTV9LCAvLyBfX2J1aWx0aW5faWEzMl9zcXJ0cHM1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfc3FydF9zZCwgMTM0ODgzfSwgLy8gX19idWlsdGluX2lhMzJfc3FydHNkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfc3FydF9zZCwgMTE3NzQ1fSwgLy8gX19idWlsdGluX2lhMzJfc3FydHNkX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2Vfc3FydF9zcywgMTMzMjA4fSwgLy8gX19idWlsdGluX2lhMzJfc3FydHNzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfc3FydF9zcywgMTE3Nzc4fSwgLy8gX19idWlsdGluX2lhMzJfc3FydHNzX3JvdW5kX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19zdG9yZV9zcywgMTE3ODExfSwgLy8gX19idWlsdGluX2lhMzJfc3RvcmVzc19tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfc3ViYm9ycm93X3UzMiwgMTM2OTAwfSwgLy8gX19idWlsdGluX2lhMzJfc3ViYm9ycm93X3UzMgorICAgICAge0ludHJpbnNpYzo6eDg2X3N1YmJvcnJvd191NjQsIDEzNjkyOX0sIC8vIF9fYnVpbHRpbl9pYTMyX3N1YmJvcnJvd191NjQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19zdWJfcGRfNTEyLCAxMTc4Mzl9LCAvLyBfX2J1aWx0aW5faWEzMl9zdWJwZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfc3ViX3BzXzUxMiwgMTE3ODY4fSwgLy8gX19idWlsdGluX2lhMzJfc3VicHM1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3N1Yl9zZF9yb3VuZCwgMTE3ODk3fSwgLy8gX19idWlsdGluX2lhMzJfc3Vic2Rfcm91bmRfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3N1Yl9zc19yb3VuZCwgMTE3OTI5fSwgLy8gX19idWlsdGluX2lhMzJfc3Vic3Nfcm91bmRfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV91Y29taWVxX3NzLCAxMzMyMzB9LCAvLyBfX2J1aWx0aW5faWEzMl91Y29taWVxCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlX3Vjb21pZ2Vfc3MsIDEzMzI1M30sIC8vIF9fYnVpbHRpbl9pYTMyX3Vjb21pZ2UKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfdWNvbWlndF9zcywgMTMzMjc2fSwgLy8gX19idWlsdGluX2lhMzJfdWNvbWlndAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZV91Y29taWxlX3NzLCAxMzMyOTl9LCAvLyBfX2J1aWx0aW5faWEzMl91Y29taWxlCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlX3Vjb21pbHRfc3MsIDEzMzMyMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Vjb21pbHQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2VfdWNvbWluZXFfc3MsIDEzMzM0NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Vjb21pbmVxCisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl91Y29taWVxX3NkLCAxMzQ5MDV9LCAvLyBfX2J1aWx0aW5faWEzMl91Y29taXNkZXEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3Vjb21pZ2Vfc2QsIDEzNDkzMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Vjb21pc2RnZQorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfdWNvbWlndF9zZCwgMTM0OTU1fSwgLy8gX19idWlsdGluX2lhMzJfdWNvbWlzZGd0CisgICAgICB7SW50cmluc2ljOjp4ODZfc3NlMl91Y29taWxlX3NkLCAxMzQ5ODB9LCAvLyBfX2J1aWx0aW5faWEzMl91Y29taXNkbGUKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9zc2UyX3Vjb21pbHRfc2QsIDEzNTAwNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Vjb21pc2RsdAorICAgICAge0ludHJpbnNpYzo6eDg2X3NzZTJfdWNvbWluZXFfc2QsIDEzNTAzMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Vjb21pc2RuZXEKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfdmNvbWlfc2QsIDEyODk5Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zjb21pc2QKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfdmNvbWlfc3MsIDEyOTAxOX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zjb21pc3MKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl92Y3Z0cGgycHNfMTI4LCAxMzcwMTB9LCAvLyBfX2J1aWx0aW5faWEzMl92Y3Z0cGgycHMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl92Y3Z0cGgycHNfMjU2LCAxMzcwMzV9LCAvLyBfX2J1aWx0aW5faWEzMl92Y3Z0cGgycHMyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Y3Z0cGgycHNfMjU2LCAxMTc5OTF9LCAvLyBfX2J1aWx0aW5faWEzMl92Y3Z0cGgycHMyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZjdnRwaDJwc181MTIsIDExODAyNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZjdnRwaDJwczUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdmN2dHBoMnBzXzEyOCwgMTE3OTYxfSwgLy8gX19idWlsdGluX2lhMzJfdmN2dHBoMnBzX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl92Y3Z0cHMycGhfMTI4LCAxMzcwNjN9LCAvLyBfX2J1aWx0aW5faWEzMl92Y3Z0cHMycGgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl92Y3Z0cHMycGhfMjU2LCAxMzcwODh9LCAvLyBfX2J1aWx0aW5faWEzMl92Y3Z0cHMycGgyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Y3Z0cHMycGhfMjU2LCAxMTgwODd9LCAvLyBfX2J1aWx0aW5faWEzMl92Y3Z0cHMycGgyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZjdnRwczJwaF81MTIsIDExODEyMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZjdnRwczJwaDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdmN2dHBzMnBoXzEyOCwgMTE4MDU3fSwgLy8gX19idWlsdGluX2lhMzJfdmN2dHBzMnBoX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfdmN2dHNkMnNpMzIsIDEyOTA0Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZjdnRzZDJzaTMyCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3ZjdnRzZDJzaTY0LCAxMjkwNjl9LCAvLyBfX2J1aWx0aW5faWEzMl92Y3Z0c2Qyc2k2NAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl92Y3Z0c2QydXNpMzIsIDEyOTA5Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZjdnRzZDJ1c2kzMgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl92Y3Z0c2QydXNpNjQsIDEyOTEyNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZjdnRzZDJ1c2k2NAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl92Y3Z0c3Myc2kzMiwgMTI5MTUyfSwgLy8gX19idWlsdGluX2lhMzJfdmN2dHNzMnNpMzIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfdmN2dHNzMnNpNjQsIDEyOTE3OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZjdnRzczJzaTY0CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3ZjdnRzczJ1c2kzMiwgMTI5MjA2fSwgLy8gX19idWlsdGluX2lhMzJfdmN2dHNzMnVzaTMyCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3ZjdnRzczJ1c2k2NCwgMTI5MjM0fSwgLy8gX19idWlsdGluX2lhMzJfdmN2dHNzMnVzaTY0CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2N2dHRzZDJzaSwgMTAzMzc2fSwgLy8gX19idWlsdGluX2lhMzJfdmN2dHRzZDJzaTMyCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2N2dHRzZDJzaTY0LCAxMDM0MDR9LCAvLyBfX2J1aWx0aW5faWEzMl92Y3Z0dHNkMnNpNjQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfY3Z0dHNkMnVzaSwgMTAzNDMyfSwgLy8gX19idWlsdGluX2lhMzJfdmN2dHRzZDJ1c2kzMgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9jdnR0c2QydXNpNjQsIDEwMzQ2MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZjdnR0c2QydXNpNjQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfY3Z0dHNzMnNpLCAxMDM0OTB9LCAvLyBfX2J1aWx0aW5faWEzMl92Y3Z0dHNzMnNpMzIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfY3Z0dHNzMnNpNjQsIDEwMzUxOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZjdnR0c3Myc2k2NAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9jdnR0c3MydXNpLCAxMDM1NDZ9LCAvLyBfX2J1aWx0aW5faWEzMl92Y3Z0dHNzMnVzaTMyCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX2N2dHRzczJ1c2k2NCwgMTAzNTc1fSwgLy8gX19idWlsdGluX2lhMzJfdmN2dHRzczJ1c2k2NAorICAgICAge0ludHJpbnNpYzo6eDg2X21teF9wZXh0cl93LCAxMzA4NzV9LCAvLyBfX2J1aWx0aW5faWEzMl92ZWNfZXh0X3Y0aGkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9tbXhfcGluc3JfdywgMTMwOTAzfSwgLy8gX19idWlsdGluX2lhMzJfdmVjX3NldF92NGhpCisgICAgICB7SW50cmluc2ljOjp4ODZfZm1hX3ZmbWFkZF9wZCwgMTI5NzI2fSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkcGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Zm1hZGRfcGRfMTI4LCAxMTgxNTN9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9wZF8xMjgsIDEyMjEzN30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMTI4X21hc2szCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZF9wZF8xMjgsIDEyMzgzNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfZm1hX3ZmbWFkZF9wZF8yNTYsIDEyOTc1MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdmZtYWRkX3BkXzI1NiwgMTE4MTg1fSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkcGQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1hZGRfcGRfMjU2LCAxMjIxNzB9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDI1Nl9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92Zm1hZGRfcGRfMjU2LCAxMjM4Njh9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZmbWFkZF9wZF81MTIsIDExODIxN30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtYWRkX3BkXzUxMiwgMTIyMjAzfSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkcGQ1MTJfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdmZtYWRkX3BkXzUxMiwgMTIzOTAxfSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkcGQ1MTJfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9mbWFfdmZtYWRkX3BzLCAxMjk3Nzd9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRwcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZmbWFkZF9wc18xMjgsIDExODI0OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtYWRkX3BzXzEyOCwgMTIyMjM2fSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkcHMxMjhfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdmZtYWRkX3BzXzEyOCwgMTIzOTM0fSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkcHMxMjhfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9mbWFfdmZtYWRkX3BzXzI1NiwgMTI5ODAxfSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkcHMyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Zm1hZGRfcHNfMjU2LCAxMTgyODF9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRwczI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9wc18yNTYsIDEyMjI2OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMjU2X21hc2szCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZF9wc18yNTYsIDEyMzk2N30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMjU2X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdmZtYWRkX3BzXzUxMiwgMTE4MzEzfSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkcHM1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1hZGRfcHNfNTEyLCAxMjIzMDJ9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRwczUxMl9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92Zm1hZGRfcHNfNTEyLCAxMjQwMDB9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRwczUxMl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2ZtYTRfdmZtYWRkX3NkLCAxMjk5OTJ9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRzZAorICAgICAge0ludHJpbnNpYzo6eDg2X2ZtYV92Zm1hZGRfc2QsIDEyOTgyOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZmbWFkZF9zZCwgMTE4MzQ1fSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc2QzX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtYWRkX3NkLCAxMjIzMzV9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRzZDNfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdmZtYWRkX3NkLCAxMjQwMzN9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRzZDNfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9mbWE0X3ZmbWFkZF9zcywgMTMwMDE2fSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc3MKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9mbWFfdmZtYWRkX3NzLCAxMjk4NTN9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRzczMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Zm1hZGRfc3MsIDExODM3NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzM19tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9zcywgMTIyMzY2fSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc3MzX21hc2szCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZF9zcywgMTI0MDY0fSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc3MzX21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfZm1hX3ZmbWFkZHN1Yl9wZCwgMTI5ODc4fSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Zm1hZGRzdWJfcGRfMTI4LCAxMTg0MDV9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2szX3ZmbWFkZHN1Yl9wZF8xMjgsIDEyMjM5N30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkMTI4X21hc2szCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZHN1Yl9wZF8xMjgsIDEyNDA5NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkMTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfZm1hX3ZmbWFkZHN1Yl9wZF8yNTYsIDEyOTkwNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdmZtYWRkc3ViX3BkXzI1NiwgMTE4NDQwfSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1hZGRzdWJfcGRfMjU2LCAxMjI0MzN9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDI1Nl9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92Zm1hZGRzdWJfcGRfMjU2LCAxMjQxMzF9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZmbWFkZHN1Yl9wZF81MTIsIDExODQ3NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtYWRkc3ViX3BkXzUxMiwgMTIyNDY5fSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQ1MTJfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdmZtYWRkc3ViX3BkXzUxMiwgMTI0MTY3fSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQ1MTJfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9mbWFfdmZtYWRkc3ViX3BzLCAxMjk5MzV9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZmbWFkZHN1Yl9wc18xMjgsIDExODUxMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZtYWRkc3ViX3BzXzEyOCwgMTIyNTA1fSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMxMjhfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdmZtYWRkc3ViX3BzXzEyOCwgMTI0MjAzfSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMxMjhfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9mbWFfdmZtYWRkc3ViX3BzXzI1NiwgMTI5OTYyfSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Zm1hZGRzdWJfcHNfMjU2LCAxMTg1NDV9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2szX3ZmbWFkZHN1Yl9wc18yNTYsIDEyMjU0MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzMjU2X21hc2szCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZHN1Yl9wc18yNTYsIDEyNDIzOX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzMjU2X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdmZtYWRkc3ViX3BzXzUxMiwgMTE4NTgwfSwgLy8gX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHM1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1hZGRzdWJfcHNfNTEyLCAxMjI1Nzd9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczUxMl9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92Zm1hZGRzdWJfcHNfNTEyLCAxMjQyNzV9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczUxMl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1zdWJhZGRfcGRfMTI4LCAxMjI4NzN9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1zdWJhZGRwZDEyOF9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1zdWJhZGRfcGRfMjU2LCAxMjI5MDl9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1zdWJhZGRwZDI1Nl9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1zdWJhZGRfcGRfNTEyLCAxMjI5NDV9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1zdWJhZGRwZDUxMl9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1zdWJhZGRfcHNfMTI4LCAxMjI5ODF9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1zdWJhZGRwczEyOF9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1zdWJhZGRfcHNfMjU2LCAxMjMwMTd9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1zdWJhZGRwczI1Nl9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1zdWJhZGRfcHNfNTEyLCAxMjMwNTN9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1zdWJhZGRwczUxMl9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfcGRfMTI4LCAxMjI2MTN9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1zdWJwZDEyOF9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfcGRfMjU2LCAxMjI2NDZ9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1zdWJwZDI1Nl9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfcGRfNTEyLCAxMjI2Nzl9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1zdWJwZDUxMl9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfcHNfMTI4LCAxMjI3MTJ9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1zdWJwczEyOF9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfcHNfMjU2LCAxMjI3NDV9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1zdWJwczI1Nl9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfcHNfNTEyLCAxMjI3Nzh9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm1zdWJwczUxMl9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfc2QsIDEyMjgxMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbXN1YnNkM19tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfc3MsIDEyMjg0Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmbXN1YnNzM19tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zmbm1hZGRfcGRfMTI4LCAxMTg2MTV9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm5tYWRkcGQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zmbm1hZGRfcGRfMjU2LCAxMTg2NDh9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm5tYWRkcGQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zmbm1hZGRfcGRfNTEyLCAxMTg2ODF9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm5tYWRkcGQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zmbm1hZGRfcHNfMTI4LCAxMTg3MTR9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm5tYWRkcHMxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zmbm1hZGRfcHNfMjU2LCAxMTg3NDd9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm5tYWRkcHMyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zmbm1hZGRfcHNfNTEyLCAxMTg3ODB9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm5tYWRkcHM1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zmbm1zdWJfcGRfMTI4LCAxMTg4MTN9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm5tc3VicGQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm5tc3ViX3BkXzEyOCwgMTIzMDg5fSwgLy8gX19idWlsdGluX2lhMzJfdmZubXN1YnBkMTI4X21hc2szCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdmZubXN1Yl9wZF8yNTYsIDExODg0Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2szX3Zmbm1zdWJfcGRfMjU2LCAxMjMxMjN9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm5tc3VicGQyNTZfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Zm5tc3ViX3BkXzUxMiwgMTE4ODc5fSwgLy8gX19idWlsdGluX2lhMzJfdmZubXN1YnBkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZubXN1Yl9wZF81MTIsIDEyMzE1N30sIC8vIF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwZDUxMl9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zmbm1zdWJfcHNfMTI4LCAxMTg5MTJ9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm5tc3VicHMxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm5tc3ViX3BzXzEyOCwgMTIzMTkxfSwgLy8gX19idWlsdGluX2lhMzJfdmZubXN1YnBzMTI4X21hc2szCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdmZubXN1Yl9wc18yNTYsIDExODk0NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwczI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2szX3Zmbm1zdWJfcHNfMjU2LCAxMjMyMjV9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm5tc3VicHMyNTZfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192Zm5tc3ViX3BzXzUxMiwgMTE4OTc4fSwgLy8gX19idWlsdGluX2lhMzJfdmZubXN1YnBzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFzazNfdmZubXN1Yl9wc181MTIsIDEyMzI1OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwczUxMl9tYXNrMworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrM192Zm5tc3ViX3NkLCAxMjMyOTN9LCAvLyBfX2J1aWx0aW5faWEzMl92Zm5tc3Vic2QzX21hc2szCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2szX3Zmbm1zdWJfc3MsIDEyMzMyNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJzczNfbWFzazMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdmZyY3pfcGQsIDEzNzcxM30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZmcmN6cGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdmZyY3pfcGRfMjU2LCAxMzc3MzZ9LCAvLyBfX2J1aWx0aW5faWEzMl92ZnJjenBkMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZmcmN6X3BzLCAxMzc3NjJ9LCAvLyBfX2J1aWx0aW5faWEzMl92ZnJjenBzCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZmcmN6X3BzXzI1NiwgMTM3Nzg1fSwgLy8gX19idWlsdGluX2lhMzJfdmZyY3pwczI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92ZnJjel9zZCwgMTM3ODExfSwgLy8gX19idWlsdGluX2lhMzJfdmZyY3pzZAorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92ZnJjel9zcywgMTM3ODM0fSwgLy8gX19idWlsdGluX2lhMzJfdmZyY3pzcworICAgICAge0ludHJpbnNpYzo6eDg2X3ZnZjJwOGFmZmluZWludnFiXzEyOCwgMTM3MTE2fSwgLy8gX19idWlsdGluX2lhMzJfdmdmMnA4YWZmaW5laW52cWJfdjE2cWkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl92Z2YycDhhZmZpbmVpbnZxYl8yNTYsIDEzNzE1NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZnZjJwOGFmZmluZWludnFiX3YzMnFpCisgICAgICB7SW50cmluc2ljOjp4ODZfdmdmMnA4YWZmaW5laW52cWJfNTEyLCAxMzcxOTR9LCAvLyBfX2J1aWx0aW5faWEzMl92Z2YycDhhZmZpbmVpbnZxYl92NjRxaQorICAgICAge0ludHJpbnNpYzo6eDg2X3ZnZjJwOGFmZmluZXFiXzEyOCwgMTM3MjMzfSwgLy8gX19idWlsdGluX2lhMzJfdmdmMnA4YWZmaW5lcWJfdjE2cWkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl92Z2YycDhhZmZpbmVxYl8yNTYsIDEzNzI2OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZnZjJwOGFmZmluZXFiX3YzMnFpCisgICAgICB7SW50cmluc2ljOjp4ODZfdmdmMnA4YWZmaW5lcWJfNTEyLCAxMzczMDV9LCAvLyBfX2J1aWx0aW5faWEzMl92Z2YycDhhZmZpbmVxYl92NjRxaQorICAgICAge0ludHJpbnNpYzo6eDg2X3ZnZjJwOG11bGJfMTI4LCAxMzczNDF9LCAvLyBfX2J1aWx0aW5faWEzMl92Z2YycDhtdWxiX3YxNnFpCisgICAgICB7SW50cmluc2ljOjp4ODZfdmdmMnA4bXVsYl8yNTYsIDEzNzM3M30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZnZjJwOG11bGJfdjMycWkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl92Z2YycDhtdWxiXzUxMiwgMTM3NDA1fSwgLy8gX19idWlsdGluX2lhMzJfdmdmMnA4bXVsYl92NjRxaQorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGNvbWIsIDEzNzg1N30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwY29tYgorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGNvbWQsIDEzNzg3OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwY29tZAorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGNvbXEsIDEzNzkwMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwY29tcQorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGNvbXViLCAxMzc5MjN9LCAvLyBfX2J1aWx0aW5faWEzMl92cGNvbXViCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwY29tdWQsIDEzNzk0Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwY29tdWQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBjb211cSwgMTM3OTY5fSwgLy8gX19idWlsdGluX2lhMzJfdnBjb211cQorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGNvbXV3LCAxMzc5OTJ9LCAvLyBfX2J1aWx0aW5faWEzMl92cGNvbXV3CisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwY29tdywgMTM4MDE1fSwgLy8gX19idWlsdGluX2lhMzJfdnBjb213CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29uZmxpY3RfcV8xMjgsIDEwNjE2NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwY29uZmxpY3RkaV8xMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NvbmZsaWN0X3FfMjU2LCAxMDYyMDJ9LCAvLyBfX2J1aWx0aW5faWEzMl92cGNvbmZsaWN0ZGlfMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb25mbGljdF9xXzUxMiwgMTA2MjM5fSwgLy8gX19idWlsdGluX2lhMzJfdnBjb25mbGljdGRpXzUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfY29uZmxpY3RfZF8xMjgsIDEwNjA1NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwY29uZmxpY3RzaV8xMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX2NvbmZsaWN0X2RfMjU2LCAxMDYwOTF9LCAvLyBfX2J1aWx0aW5faWEzMl92cGNvbmZsaWN0c2lfMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19jb25mbGljdF9kXzUxMiwgMTA2MTI4fSwgLy8gX19idWlsdGluX2lhMzJfdnBjb25mbGljdHNpXzUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBkcGJ1c2RfMTI4LCAxMTkwMTF9LCAvLyBfX2J1aWx0aW5faWEzMl92cGRwYnVzZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZHBidXNkXzEyOCwgMTI0MzExfSwgLy8gX19idWlsdGluX2lhMzJfdnBkcGJ1c2QxMjhfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cGRwYnVzZF8yNTYsIDExOTA0M30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBkcGJ1c2RfMjU2LCAxMjQzNDR9LCAvLyBfX2J1aWx0aW5faWEzMl92cGRwYnVzZDI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZHBidXNkXzUxMiwgMTE5MDc1fSwgLy8gX19idWlsdGluX2lhMzJfdnBkcGJ1c2Q1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cGRwYnVzZF81MTIsIDEyNDM3N30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkNTEyX21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBkcGJ1c2RzXzEyOCwgMTE5MTA3fSwgLy8gX19idWlsdGluX2lhMzJfdnBkcGJ1c2RzMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBkcGJ1c2RzXzEyOCwgMTI0NDEwfSwgLy8gX19idWlsdGluX2lhMzJfdnBkcGJ1c2RzMTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBkcGJ1c2RzXzI1NiwgMTE5MTQwfSwgLy8gX19idWlsdGluX2lhMzJfdnBkcGJ1c2RzMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBkcGJ1c2RzXzI1NiwgMTI0NDQ0fSwgLy8gX19idWlsdGluX2lhMzJfdnBkcGJ1c2RzMjU2X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBkcGJ1c2RzXzUxMiwgMTE5MTczfSwgLy8gX19idWlsdGluX2lhMzJfdnBkcGJ1c2RzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBkcGJ1c2RzXzUxMiwgMTI0NDc4fSwgLy8gX19idWlsdGluX2lhMzJfdnBkcGJ1c2RzNTEyX21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBkcHdzc2RfMTI4LCAxMTkyMDZ9LCAvLyBfX2J1aWx0aW5faWEzMl92cGRwd3NzZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZHB3c3NkXzEyOCwgMTI0NTEyfSwgLy8gX19idWlsdGluX2lhMzJfdnBkcHdzc2QxMjhfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cGRwd3NzZF8yNTYsIDExOTIzOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBkcHdzc2RfMjU2LCAxMjQ1NDV9LCAvLyBfX2J1aWx0aW5faWEzMl92cGRwd3NzZDI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZHB3c3NkXzUxMiwgMTE5MjcwfSwgLy8gX19idWlsdGluX2lhMzJfdnBkcHdzc2Q1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cGRwd3NzZF81MTIsIDEyNDU3OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkNTEyX21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBkcHdzc2RzXzEyOCwgMTE5MzAyfSwgLy8gX19idWlsdGluX2lhMzJfdnBkcHdzc2RzMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBkcHdzc2RzXzEyOCwgMTI0NjExfSwgLy8gX19idWlsdGluX2lhMzJfdnBkcHdzc2RzMTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBkcHdzc2RzXzI1NiwgMTE5MzM1fSwgLy8gX19idWlsdGluX2lhMzJfdnBkcHdzc2RzMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBkcHdzc2RzXzI1NiwgMTI0NjQ1fSwgLy8gX19idWlsdGluX2lhMzJfdnBkcHdzc2RzMjU2X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBkcHdzc2RzXzUxMiwgMTE5MzY4fSwgLy8gX19idWlsdGluX2lhMzJfdnBkcHdzc2RzNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBkcHdzc2RzXzUxMiwgMTI0Njc5fSwgLy8gX19idWlsdGluX2lhMzJfdnBkcHdzc2RzNTEyX21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9kXzEyOCwgMTE5NDAxfSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcmQxMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfZF8yNTYsIDExOTQzNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cGVybWkydmFyX2RfNTEyLCAxMTk0NzF9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWkydmFyZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9oaV8xMjgsIDExOTUwNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJoaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9oaV8yNTYsIDExOTU0Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJoaTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9oaV81MTIsIDExOTU3OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJoaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9wZF8xMjgsIDExOTYxNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJwZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9wZF8yNTYsIDExOTY1MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJwZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9wZF81MTIsIDExOTY4Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJwZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9wc18xMjgsIDExOTcyMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJwczEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9wc18yNTYsIDExOTc1OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJwczI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9wc181MTIsIDExOTc5NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJwczUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9xXzEyOCwgMTE5ODMwfSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcnExMjhfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcV8yNTYsIDExOTg2NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJxMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cGVybWkydmFyX3FfNTEyLCAxMTk5MDB9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWkydmFycTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9xaV8xMjgsIDExOTkzNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJxaTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9xaV8yNTYsIDExOTk3MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJxaTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9xaV81MTIsIDEyMDAwN30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJxaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwZXJtaWwycGQsIDEzODAzN30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWwycGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBlcm1pbDJwZF8yNTYsIDEzODA2M30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWwycGQyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBlcm1pbDJwcywgMTM4MDkyfSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm1pbDJwcworICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGVybWlsMnBzXzI1NiwgMTM4MTE4fSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm1pbDJwczI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF92cGVybWlsdmFyX3BkLCAxMDA0NDh9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfdnBlcm1pbHZhcl9wZF8yNTYsIDEwMDQ3Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwZDI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl92cGVybWlsdmFyX3BkXzUxMiwgMTI5MjYyfSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm1pbHZhcnBkNTEyCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3ZwZXJtaWx2YXJfcHMsIDEwMDUwN30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwcworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF92cGVybWlsdmFyX3BzXzI1NiwgMTAwNTM1fSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm1pbHZhcnBzMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX3ZwZXJtaWx2YXJfcHNfNTEyLCAxMjkyOTN9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycHM1MTIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cGVybXQydmFyX2RfMTI4LCAxMjAwNDN9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFyZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfZF8xMjgsIDEyNDcxM30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJkMTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9kXzI1NiwgMTIwMDc4fSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX2RfMjU2LCAxMjQ3NDl9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFyZDI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfZF81MTIsIDEyMDExM30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJkNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9kXzUxMiwgMTI0Nzg1fSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmQ1MTJfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cGVybXQydmFyX2hpXzEyOCwgMTIwMTQ4fSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmhpMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9oaV8xMjgsIDEyNDgyMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJoaTEyOF9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfaGlfMjU2LCAxMjAxODR9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFyaGkyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX2hpXzI1NiwgMTI0ODU4fSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmhpMjU2X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9oaV81MTIsIDEyMDIyMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJoaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfaGlfNTEyLCAxMjQ4OTV9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFyaGk1MTJfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cGVybXQydmFyX3BkXzEyOCwgMTIwMjU2fSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnBkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9wZF8xMjgsIDEyNDkzMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwZDEyOF9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcGRfMjU2LCAxMjAyOTJ9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycGQyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3BkXzI1NiwgMTI0OTY5fSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnBkMjU2X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9wZF81MTIsIDEyMDMyOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwZDUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcGRfNTEyLCAxMjUwMDZ9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycGQ1MTJfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cGVybXQydmFyX3BzXzEyOCwgMTIwMzY0fSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnBzMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9wc18xMjgsIDEyNTA0M30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwczEyOF9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcHNfMjU2LCAxMjA0MDB9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycHMyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3BzXzI1NiwgMTI1MDgwfSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnBzMjU2X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9wc181MTIsIDEyMDQzNn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwczUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcHNfNTEyLCAxMjUxMTd9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycHM1MTJfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cGVybXQydmFyX3FfMTI4LCAxMjA0NzJ9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcV8xMjgsIDEyNTE1NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxMTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9xXzI1NiwgMTIwNTA3fSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnEyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3FfMjU2LCAxMjUxOTB9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycTI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcV81MTIsIDEyMDU0Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9xXzUxMiwgMTI1MjI2fSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnE1MTJfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cGVybXQydmFyX3FpXzEyOCwgMTIwNTc3fSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnFpMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9xaV8xMjgsIDEyNTI2Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxaTEyOF9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcWlfMjU2LCAxMjA2MTN9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycWkyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3FpXzI1NiwgMTI1Mjk5fSwgLy8gX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnFpMjU2X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9xaV81MTIsIDEyMDY0OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxaTUxMl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcWlfNTEyLCAxMjUzMzZ9LCAvLyBfX2J1aWx0aW5faWEzMl92cGVybXQydmFycWk1MTJfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBoYWRkYmQsIDEzODE0N30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZGJkCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwaGFkZGJxLCAxMzgxNzF9LCAvLyBfX2J1aWx0aW5faWEzMl92cGhhZGRicQorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGhhZGRidywgMTM4MTk1fSwgLy8gX19idWlsdGluX2lhMzJfdnBoYWRkYncKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBoYWRkZHEsIDEzODIxOX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwaGFkZGRxCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwaGFkZHViZCwgMTM4MjQzfSwgLy8gX19idWlsdGluX2lhMzJfdnBoYWRkdWJkCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwaGFkZHVicSwgMTM4MjY4fSwgLy8gX19idWlsdGluX2lhMzJfdnBoYWRkdWJxCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwaGFkZHVidywgMTM4MjkzfSwgLy8gX19idWlsdGluX2lhMzJfdnBoYWRkdWJ3CisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwaGFkZHVkcSwgMTM4MzE4fSwgLy8gX19idWlsdGluX2lhMzJfdnBoYWRkdWRxCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwaGFkZHV3ZCwgMTM4MzQzfSwgLy8gX19idWlsdGluX2lhMzJfdnBoYWRkdXdkCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwaGFkZHV3cSwgMTM4MzY4fSwgLy8gX19idWlsdGluX2lhMzJfdnBoYWRkdXdxCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwaGFkZHdkLCAxMzgzOTN9LCAvLyBfX2J1aWx0aW5faWEzMl92cGhhZGR3ZAorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGhhZGR3cSwgMTM4NDE3fSwgLy8gX19idWlsdGluX2lhMzJfdnBoYWRkd3EKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBoc3ViYncsIDEzODQ0MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwaHN1YmJ3CisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwaHN1YmRxLCAxMzg0NjV9LCAvLyBfX2J1aWx0aW5faWEzMl92cGhzdWJkcQorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cGhzdWJ3ZCwgMTM4NDg5fSwgLy8gX19idWlsdGluX2lhMzJfdnBoc3Vid2QKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBtYWNzZGQsIDEzODUxM30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbWFjc2RkCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwbWFjc2RxaCwgMTM4NTM3fSwgLy8gX19idWlsdGluX2lhMzJfdnBtYWNzZHFoCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwbWFjc2RxbCwgMTM4NTYyfSwgLy8gX19idWlsdGluX2lhMzJfdnBtYWNzZHFsCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwbWFjc3NkZCwgMTM4NTg3fSwgLy8gX19idWlsdGluX2lhMzJfdnBtYWNzc2RkCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwbWFjc3NkcWgsIDEzODYxMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbWFjc3NkcWgKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBtYWNzc2RxbCwgMTM4NjM4fSwgLy8gX19idWlsdGluX2lhMzJfdnBtYWNzc2RxbAorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cG1hY3Nzd2QsIDEzODY2NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbWFjc3N3ZAorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cG1hY3Nzd3csIDEzODY4OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbWFjc3N3dworICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cG1hY3N3ZCwgMTM4NzE0fSwgLy8gX19idWlsdGluX2lhMzJfdnBtYWNzd2QKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBtYWNzd3csIDEzODczOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbWFjc3d3CisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3ZwbWFkY3Nzd2QsIDEzODc2Mn0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbWFkY3Nzd2QKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBtYWRjc3dkLCAxMzg3ODh9LCAvLyBfX2J1aWx0aW5faWEzMl92cG1hZGNzd2QKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cG1hZGQ1MmhfdXFfMTI4LCAxMjA2ODV9LCAvLyBfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmh1cTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwbWFkZDUyaF91cV8xMjgsIDEyNTM3M30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUyaHVxMTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBtYWRkNTJoX3VxXzI1NiwgMTIwNzIwfSwgLy8gX19idWlsdGluX2lhMzJfdnBtYWRkNTJodXEyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cG1hZGQ1MmhfdXFfMjU2LCAxMjU0MDl9LCAvLyBfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmh1cTI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwbWFkZDUyaF91cV81MTIsIDEyMDc1NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUyaHVxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBtYWRkNTJoX3VxXzUxMiwgMTI1NDQ1fSwgLy8gX19idWlsdGluX2lhMzJfdnBtYWRkNTJodXE1MTJfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cG1hZGQ1MmxfdXFfMTI4LCAxMjA3OTB9LCAvLyBfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmx1cTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3ZwbWFkZDUybF91cV8xMjgsIDEyNTQ4MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUybHVxMTI4X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBtYWRkNTJsX3VxXzI1NiwgMTIwODI1fSwgLy8gX19idWlsdGluX2lhMzJfdnBtYWRkNTJsdXEyNTZfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cG1hZGQ1MmxfdXFfMjU2LCAxMjU1MTd9LCAvLyBfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmx1cTI1Nl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3ZwbWFkZDUybF91cV81MTIsIDEyMDg2MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUybHVxNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBtYWRkNTJsX3VxXzUxMiwgMTI1NTUzfSwgLy8gX19idWlsdGluX2lhMzJfdnBtYWRkNTJsdXE1MTJfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbXVsdGlzaGlmdF9xYl8xMjgsIDExNTM3NX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbXVsdGlzaGlmdHFiMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbXVsdGlzaGlmdF9xYl8yNTYsIDExNTQxM30sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbXVsdGlzaGlmdHFiMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza19wbXVsdGlzaGlmdF9xYl81MTIsIDExNTQ1MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3ZwbXVsdGlzaGlmdHFiNTEyX21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnBwZXJtLCAxMzg4MTN9LCAvLyBfX2J1aWx0aW5faWEzMl92cHBlcm0KKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnByb3RiLCAxMzg4MzV9LCAvLyBfX2J1aWx0aW5faWEzMl92cHJvdGIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnByb3RiaSwgMTM4ODU3fSwgLy8gX19idWlsdGluX2lhMzJfdnByb3RiaQorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cHJvdGQsIDEzODg4MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwcm90ZAorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cHJvdGRpLCAxMzg5MDJ9LCAvLyBfX2J1aWx0aW5faWEzMl92cHJvdGRpCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3Zwcm90cSwgMTM4OTI1fSwgLy8gX19idWlsdGluX2lhMzJfdnByb3RxCisgICAgICB7SW50cmluc2ljOjp4ODZfeG9wX3Zwcm90cWksIDEzODk0N30sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwcm90cWkKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnByb3R3LCAxMzg5NzB9LCAvLyBfX2J1aWx0aW5faWEzMl92cHJvdHcKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94b3BfdnByb3R3aSwgMTM4OTkyfSwgLy8gX19idWlsdGluX2lhMzJfdnByb3R3aQorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cHNoYWIsIDEzOTAxNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hhYgorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cHNoYWQsIDEzOTAzN30sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hhZAorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cHNoYXEsIDEzOTA1OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hhcQorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cHNoYXcsIDEzOTA4MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hhdworICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cHNobGIsIDEzOTEwM30sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsYgorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cHNobGQsIDEzOTEyNX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsZAorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hsZF9kXzEyOCwgMTIwODk1fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaGxkZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaGxkX2RfMjU2LCAxMjA5MjZ9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobGRkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNobGRfZF81MTIsIDEyMDk1N30sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsZGQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hsZF9xXzEyOCwgMTIwOTg4fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaGxkcTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaGxkX3FfMjU2LCAxMjEwMTl9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobGRxMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNobGRfcV81MTIsIDEyMTA1MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHE1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hsZHZfZF8xMjgsIDEyMTE3NH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl9kXzEyOCwgMTI1NTg5fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaGxkdmQxMjhfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNobGR2X2RfMjU2LCAxMjEyMDZ9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobGR2ZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfZF8yNTYsIDEyNTYyMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZkMjU2X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaGxkdl9kXzUxMiwgMTIxMjM4fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaGxkdmQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cHNobGR2X2RfNTEyLCAxMjU2NTV9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobGR2ZDUxMl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hsZHZfcV8xMjgsIDEyMTI3MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZxMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl9xXzEyOCwgMTI1Njg4fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaGxkdnExMjhfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNobGR2X3FfMjU2LCAxMjEzMDJ9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobGR2cTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfcV8yNTYsIDEyNTcyMX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZxMjU2X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaGxkdl9xXzUxMiwgMTIxMzM0fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaGxkdnE1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cHNobGR2X3FfNTEyLCAxMjU3NTR9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobGR2cTUxMl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hsZHZfd18xMjgsIDEyMTM2Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZ3MTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl93XzEyOCwgMTI1Nzg3fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaGxkdncxMjhfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNobGR2X3dfMjU2LCAxMjEzOTh9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobGR2dzI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfd18yNTYsIDEyNTgyMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZ3MjU2X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaGxkdl93XzUxMiwgMTIxNDMwfSwgLy8gX19idWlsdGluX2lhMzJfdnBzaGxkdnc1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cHNobGR2X3dfNTEyLCAxMjU4NTN9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobGR2dzUxMl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hsZF93XzEyOCwgMTIxMDgxfSwgLy8gX19idWlsdGluX2lhMzJfdnBzaGxkdzEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaGxkX3dfMjU2LCAxMjExMTJ9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNobGR3MjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNobGRfd181MTIsIDEyMTE0M30sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsZHc1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cHNobHEsIDEzOTE0N30sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hscQorICAgICAge0ludHJpbnNpYzo6eDg2X3hvcF92cHNobHcsIDEzOTE2OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hsdworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hyZF9kXzEyOCwgMTIxNDYyfSwgLy8gX19idWlsdGluX2lhMzJfdnBzaHJkZDEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaHJkX2RfMjU2LCAxMjE0OTN9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNocmRkMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNocmRfZF81MTIsIDEyMTUyNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hyZGQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hyZF9xXzEyOCwgMTIxNTU1fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaHJkcTEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaHJkX3FfMjU2LCAxMjE1ODZ9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNocmRxMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNocmRfcV81MTIsIDEyMTYxN30sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHE1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hyZHZfZF8xMjgsIDEyMTc0MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZkMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl9kXzEyOCwgMTI1ODg2fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaHJkdmQxMjhfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNocmR2X2RfMjU2LCAxMjE3NzN9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNocmR2ZDI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfZF8yNTYsIDEyNTkxOX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZkMjU2X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaHJkdl9kXzUxMiwgMTIxODA1fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaHJkdmQ1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cHNocmR2X2RfNTEyLCAxMjU5NTJ9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNocmR2ZDUxMl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hyZHZfcV8xMjgsIDEyMTgzN30sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZxMTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl9xXzEyOCwgMTI1OTg1fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaHJkdnExMjhfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNocmR2X3FfMjU2LCAxMjE4Njl9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNocmR2cTI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfcV8yNTYsIDEyNjAxOH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZxMjU2X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaHJkdl9xXzUxMiwgMTIxOTAxfSwgLy8gX19idWlsdGluX2lhMzJfdnBzaHJkdnE1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cHNocmR2X3FfNTEyLCAxMjYwNTF9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNocmR2cTUxMl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hyZHZfd18xMjgsIDEyMTkzM30sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZ3MTI4X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl93XzEyOCwgMTI2MDg0fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaHJkdncxMjhfbWFza3oKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNocmR2X3dfMjU2LCAxMjE5NjV9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNocmR2dzI1Nl9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfd18yNTYsIDEyNjExN30sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZ3MjU2X21hc2t6CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaHJkdl93XzUxMiwgMTIxOTk3fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaHJkdnc1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrel92cHNocmR2X3dfNTEyLCAxMjYxNTB9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNocmR2dzUxMl9tYXNregorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2hyZF93XzEyOCwgMTIxNjQ4fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaHJkdzEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaHJkX3dfMjU2LCAxMjE2Nzl9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNocmR3MjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNocmRfd181MTIsIDEyMTcxMH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2hyZHc1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eDUxMl9tYXNrX3Zwc2h1ZmJpdHFtYl8xMjgsIDEyMjAyOX0sIC8vIF9fYnVpbHRpbl9pYTMyX3Zwc2h1ZmJpdHFtYjEyOF9tYXNrCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4NTEyX21hc2tfdnBzaHVmYml0cW1iXzI1NiwgMTIyMDY1fSwgLy8gX19idWlsdGluX2lhMzJfdnBzaHVmYml0cW1iMjU2X21hc2sKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdng1MTJfbWFza192cHNodWZiaXRxbWJfNTEyLCAxMjIxMDF9LCAvLyBfX2J1aWx0aW5faWEzMl92cHNodWZiaXRxbWI1MTJfbWFzaworICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF92dGVzdGNfcGQsIDEwMDU2Nn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0Y3BkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0Y19wZF8yNTYsIDEwMDU5MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0Y3BkMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0Y19wcywgMTAwNjE3fSwgLy8gX19idWlsdGluX2lhMzJfdnRlc3RjcHMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfdnRlc3RjX3BzXzI1NiwgMTAwNjQxfSwgLy8gX19idWlsdGluX2lhMzJfdnRlc3RjcHMyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfdnRlc3RuemNfcGQsIDEwMDY2OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0bnpjcGQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfdnRlc3RuemNfcGRfMjU2LCAxMDA2OTR9LCAvLyBfX2J1aWx0aW5faWEzMl92dGVzdG56Y3BkMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0bnpjX3BzLCAxMDA3MjN9LCAvLyBfX2J1aWx0aW5faWEzMl92dGVzdG56Y3BzCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0bnpjX3BzXzI1NiwgMTAwNzQ5fSwgLy8gX19idWlsdGluX2lhMzJfdnRlc3RuemNwczI1NgorICAgICAge0ludHJpbnNpYzo6eDg2X2F2eF92dGVzdHpfcGQsIDEwMDc3OH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0enBkCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0el9wZF8yNTYsIDEwMDgwMn0sIC8vIF9fYnVpbHRpbl9pYTMyX3Z0ZXN0enBkMjU2CisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3Z0ZXN0el9wcywgMTAwODI5fSwgLy8gX19idWlsdGluX2lhMzJfdnRlc3R6cHMKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfdnRlc3R6X3BzXzI1NiwgMTAwODUzfSwgLy8gX19idWlsdGluX2lhMzJfdnRlc3R6cHMyNTYKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl9hdnhfdnplcm9hbGwsIDEwMDg4MH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Z6ZXJvYWxsCisgICAgICB7SW50cmluc2ljOjp4ODZfYXZ4X3Z6ZXJvdXBwZXIsIDEwMDkwNH0sIC8vIF9fYnVpbHRpbl9pYTMyX3Z6ZXJvdXBwZXIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl93cmZzYmFzZV8zMiwgMTM3NDM3fSwgLy8gX19idWlsdGluX2lhMzJfd3Jmc2Jhc2UzMgorICAgICAge0ludHJpbnNpYzo6eDg2X3dyZnNiYXNlXzY0LCAxMzc0NjN9LCAvLyBfX2J1aWx0aW5faWEzMl93cmZzYmFzZTY0CisgICAgICB7SW50cmluc2ljOjp4ODZfd3Jnc2Jhc2VfMzIsIDEzNzQ4OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3dyZ3NiYXNlMzIKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl93cmdzYmFzZV82NCwgMTM3NTE1fSwgLy8gX19idWlsdGluX2lhMzJfd3Jnc2Jhc2U2NAorICAgICAge0ludHJpbnNpYzo6eDg2X2ZsYWdzX3dyaXRlX3UzMiwgMTI5NjY0fSwgLy8gX19idWlsdGluX2lhMzJfd3JpdGVlZmxhZ3NfdTMyCisgICAgICB7SW50cmluc2ljOjp4ODZfZmxhZ3Nfd3JpdGVfdTY0LCAxMjk2OTV9LCAvLyBfX2J1aWx0aW5faWEzMl93cml0ZWVmbGFnc191NjQKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl93cnBrcnUsIDEzNzU0MX0sIC8vIF9fYnVpbHRpbl9pYTMyX3dycGtydQorICAgICAge0ludHJpbnNpYzo6eDg2X3dyc3NkLCAxMzc1NjN9LCAvLyBfX2J1aWx0aW5faWEzMl93cnNzZAorICAgICAge0ludHJpbnNpYzo6eDg2X3dyc3NxLCAxMzc1ODR9LCAvLyBfX2J1aWx0aW5faWEzMl93cnNzcQorICAgICAge0ludHJpbnNpYzo6eDg2X3dydXNzZCwgMTM3NjA1fSwgLy8gX19idWlsdGluX2lhMzJfd3J1c3NkCisgICAgICB7SW50cmluc2ljOjp4ODZfd3J1c3NxLCAxMzc2Mjd9LCAvLyBfX2J1aWx0aW5faWEzMl93cnVzc3EKKyAgICAgIHtJbnRyaW5zaWM6Ong4Nl94YWJvcnQsIDEzNzY0OX0sIC8vIF9fYnVpbHRpbl9pYTMyX3hhYm9ydAorICAgICAge0ludHJpbnNpYzo6eDg2X3hiZWdpbiwgMTM3NjcxfSwgLy8gX19idWlsdGluX2lhMzJfeGJlZ2luCisgICAgICB7SW50cmluc2ljOjp4ODZfeGVuZCwgMTM3NjkzfSwgLy8gX19idWlsdGluX2lhMzJfeGVuZAorICAgICAge0ludHJpbnNpYzo6eDg2X3h0ZXN0LCAxMzkxOTF9LCAvLyBfX2J1aWx0aW5faWEzMl94dGVzdAorICAgIH07CisgICAgYXV0byBJID0gc3RkOjpsb3dlcl9ib3VuZChzdGQ6OmJlZ2luKHg4Nk5hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZW5kKHg4Nk5hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0aW5OYW1lU3RyKTsKKyAgICBpZiAoSSAhPSBzdGQ6OmVuZCh4ODZOYW1lcykgJiYKKyAgICAgICAgSS0+Z2V0TmFtZSgpID09IEJ1aWx0aW5OYW1lU3RyKQorICAgICAgcmV0dXJuIEktPkludHJpbklEOworICB9CisgIGlmIChUYXJnZXRQcmVmaXggPT0gInhjb3JlIikgeworICAgIHN0YXRpYyBjb25zdCBCdWlsdGluRW50cnkgeGNvcmVOYW1lc1tdID0geworICAgICAge0ludHJpbnNpYzo6eGNvcmVfYml0cmV2LCAxMzkyMTJ9LCAvLyBfX2J1aWx0aW5fYml0cmV2CisgICAgICB7SW50cmluc2ljOjp4Y29yZV9nZXRpZCwgMTM5MjI5fSwgLy8gX19idWlsdGluX2dldGlkCisgICAgICB7SW50cmluc2ljOjp4Y29yZV9nZXRwcywgMTM5MjQ1fSwgLy8gX19idWlsdGluX2dldHBzCisgICAgICB7SW50cmluc2ljOjp4Y29yZV9zZXRwcywgMTM5MjYxfSwgLy8gX19idWlsdGluX3NldHBzCisgICAgfTsKKyAgICBhdXRvIEkgPSBzdGQ6Omxvd2VyX2JvdW5kKHN0ZDo6YmVnaW4oeGNvcmVOYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZCh4Y29yZU5hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1aWx0aW5OYW1lU3RyKTsKKyAgICBpZiAoSSAhPSBzdGQ6OmVuZCh4Y29yZU5hbWVzKSAmJgorICAgICAgICBJLT5nZXROYW1lKCkgPT0gQnVpbHRpbk5hbWVTdHIpCisgICAgICByZXR1cm4gSS0+SW50cmluSUQ7CisgIH0KKyAgcmV0dXJuIEludHJpbnNpYzo6bm90X2ludHJpbnNpYzsKK30KKyNlbmRpZgorCisvLyBHZXQgdGhlIExMVk0gaW50cmluc2ljIHRoYXQgY29ycmVzcG9uZHMgdG8gYSBidWlsdGluLgorLy8gVGhpcyBpcyB1c2VkIGJ5IHRoZSBDIGZyb250LWVuZC4gIFRoZSBidWlsdGluIG5hbWUgaXMgcGFzc2VkCisvLyBpbiBhcyBCdWlsdGluTmFtZSwgYW5kIGEgdGFyZ2V0IHByZWZpeCAoZS5nLiAncHBjJykgaXMgcGFzc2VkCisvLyBpbiBhcyBUYXJnZXRQcmVmaXguICBUaGUgcmVzdWx0IGlzIGFzc2lnbmVkIHRvICdJbnRyaW5zaWNJRCcuCisjaWZkZWYgR0VUX0xMVk1fSU5UUklOU0lDX0ZPUl9NU19CVUlMVElOCitJbnRyaW5zaWM6OklEIEludHJpbnNpYzo6Z2V0SW50cmluc2ljRm9yTVNCdWlsdGluKGNvbnN0IGNoYXIgKlRhcmdldFByZWZpeFN0ciwgU3RyaW5nUmVmIEJ1aWx0aW5OYW1lU3RyKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyIEJ1aWx0aW5OYW1lc1tdID0geworICAnXycsICdfJywgJ2QnLCAnbScsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2QnLCAncycsICdiJywgJ1wwMDAnLCAnXycsICdfJywgJ2knLAorICAncycsICdiJywgJ1wwMDAnLCAnXycsICdNJywgJ28nLCAndicsICdlJywgJ0YnLCAncicsICdvJywgJ20nLCAnQycsICdvJywgJ3AnLAorICAncicsICdvJywgJ2MnLCAnZScsICdzJywgJ3MnLCAnbycsICdyJywgJ1wwMDAnLCAnXycsICdNJywgJ28nLCAndicsICdlJywgJ0YnLAorICAncicsICdvJywgJ20nLCAnQycsICdvJywgJ3AnLCAncicsICdvJywgJ2MnLCAnZScsICdzJywgJ3MnLCAnbycsICdyJywgJzInLAorICAnXDAwMCcsCisgIH07CisKKyAgc3RydWN0IEJ1aWx0aW5FbnRyeSB7CisgICAgSW50cmluc2ljOjpJRCBJbnRyaW5JRDsKKyAgICB1bnNpZ25lZCBTdHJUYWJPZmZzZXQ7CisgICAgY29uc3QgY2hhciAqZ2V0TmFtZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAmQnVpbHRpbk5hbWVzW1N0clRhYk9mZnNldF07CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3I8KFN0cmluZ1JlZiBSSFMpIGNvbnN0IHsKKyAgICAgIHJldHVybiBzdHJuY21wKGdldE5hbWUoKSwgUkhTLmRhdGEoKSwgUkhTLnNpemUoKSkgPCAwOworICAgIH0KKyAgfTsKKyAgU3RyaW5nUmVmIFRhcmdldFByZWZpeChUYXJnZXRQcmVmaXhTdHIpOworCisgIGlmIChUYXJnZXRQcmVmaXggPT0gImFhcmNoNjQiKSB7CisgICAgc3RhdGljIGNvbnN0IEJ1aWx0aW5FbnRyeSBhYXJjaDY0TmFtZXNbXSA9IHsKKyAgICAgIHtJbnRyaW5zaWM6OmFhcmNoNjRfZG1iLCAwfSwgLy8gX19kbWIKKyAgICAgIHtJbnRyaW5zaWM6OmFhcmNoNjRfZHNiLCA2fSwgLy8gX19kc2IKKyAgICAgIHtJbnRyaW5zaWM6OmFhcmNoNjRfaXNiLCAxMn0sIC8vIF9faXNiCisgICAgfTsKKyAgICBhdXRvIEkgPSBzdGQ6Omxvd2VyX2JvdW5kKHN0ZDo6YmVnaW4oYWFyY2g2NE5hbWVzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZW5kKGFhcmNoNjROYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsdGluTmFtZVN0cik7CisgICAgaWYgKEkgIT0gc3RkOjplbmQoYWFyY2g2NE5hbWVzKSAmJgorICAgICAgICBJLT5nZXROYW1lKCkgPT0gQnVpbHRpbk5hbWVTdHIpCisgICAgICByZXR1cm4gSS0+SW50cmluSUQ7CisgIH0KKyAgaWYgKFRhcmdldFByZWZpeCA9PSAiYXJtIikgeworICAgIHN0YXRpYyBjb25zdCBCdWlsdGluRW50cnkgYXJtTmFtZXNbXSA9IHsKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9tcmMsIDE4fSwgLy8gX01vdmVGcm9tQ29wcm9jZXNzb3IKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9tcmMyLCAzOX0sIC8vIF9Nb3ZlRnJvbUNvcHJvY2Vzc29yMgorICAgICAge0ludHJpbnNpYzo6YXJtX2RtYiwgMH0sIC8vIF9fZG1iCisgICAgICB7SW50cmluc2ljOjphcm1fZHNiLCA2fSwgLy8gX19kc2IKKyAgICAgIHtJbnRyaW5zaWM6OmFybV9pc2IsIDEyfSwgLy8gX19pc2IKKyAgICB9OworICAgIGF1dG8gSSA9IHN0ZDo6bG93ZXJfYm91bmQoc3RkOjpiZWdpbihhcm1OYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmVuZChhcm1OYW1lcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWlsdGluTmFtZVN0cik7CisgICAgaWYgKEkgIT0gc3RkOjplbmQoYXJtTmFtZXMpICYmCisgICAgICAgIEktPmdldE5hbWUoKSA9PSBCdWlsdGluTmFtZVN0cikKKyAgICAgIHJldHVybiBJLT5JbnRyaW5JRDsKKyAgfQorICByZXR1cm4gSW50cmluc2ljOjpub3RfaW50cmluc2ljOworfQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKHNldGptcF91bmRlZmluZWRfZm9yX21zdmMpCisvLyBsZXQncyByZXR1cm4gaXQgdG8gX3NldGptcCBzdGF0ZQorIyAgcHJhZ21hIHBvcF9tYWNybygic2V0am1wIikKKyMgIHVuZGVmIHNldGptcF91bmRlZmluZWRfZm9yX21zdmMKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3MuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjNzlkYTcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3MuaApAQCAtMCwwICsxLDE4OCBAQAorLy89PT0tLSBsbHZtL0luc3RyaW5zaWNzLmggLSBMTFZNIEludHJpbnNpYyBGdW5jdGlvbiBIYW5kbGluZyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIHNldCBvZiBlbnVtcyB3aGljaCBhbGxvdyBwcm9jZXNzaW5nIG9mIGludHJpbnNpYworLy8gZnVuY3Rpb25zLiAgVmFsdWVzIG9mIHRoZXNlIGVudW0gdHlwZXMgYXJlIHJldHVybmVkIGJ5CisvLyBGdW5jdGlvbjo6Z2V0SW50cmluc2ljSUQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0lOVFJJTlNJQ1NfSAorI2RlZmluZSBMTFZNX0lSX0lOVFJJTlNJQ1NfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ob25lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVHlwZTsKK2NsYXNzIEZ1bmN0aW9uVHlwZTsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgTExWTUNvbnRleHQ7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBBdHRyaWJ1dGVMaXN0OworCisvLy8gVGhpcyBuYW1lc3BhY2UgY29udGFpbnMgYW4gZW51bSB3aXRoIGEgdmFsdWUgZm9yIGV2ZXJ5IGludHJpbnNpYy9idWlsdGluCisvLy8gZnVuY3Rpb24ga25vd24gYnkgTExWTS4gVGhlIGVudW0gdmFsdWVzIGFyZSByZXR1cm5lZCBieQorLy8vIEZ1bmN0aW9uOjpnZXRJbnRyaW5zaWNJRCgpLgorbmFtZXNwYWNlIEludHJpbnNpYyB7CisgIGVudW0gSUQgOiB1bnNpZ25lZCB7CisgICAgbm90X2ludHJpbnNpYyA9IDAsICAgLy8gTXVzdCBiZSB6ZXJvCisKKyAgICAvLyBHZXQgdGhlIGludHJpbnNpYyBlbnVtcyBnZW5lcmF0ZWQgZnJvbSBJbnRyaW5zaWNzLnRkCisjZGVmaW5lIEdFVF9JTlRSSU5TSUNfRU5VTV9WQUxVRVMKKyNpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3MuZ2VuIgorI3VuZGVmIEdFVF9JTlRSSU5TSUNfRU5VTV9WQUxVRVMKKyAgICAsIG51bV9pbnRyaW5zaWNzCisgIH07CisKKyAgLy8vIFJldHVybiB0aGUgTExWTSBuYW1lIGZvciBhbiBpbnRyaW5zaWMsIHN1Y2ggYXMgImxsdm0ucHBjLmFsdGl2ZWMubHZ4Ii4KKyAgLy8vIE5vdGUsIHRoaXMgdmVyc2lvbiBpcyBmb3IgaW50cmluc2ljcyB3aXRoIG5vIG92ZXJsb2Fkcy4gIFVzZSB0aGUgb3RoZXIKKyAgLy8vIHZlcnNpb24gb2YgZ2V0TmFtZSBpZiBvdmVybG9hZHMgYXJlIHJlcXVpcmVkLgorICBTdHJpbmdSZWYgZ2V0TmFtZShJRCBpZCk7CisKKyAgLy8vIFJldHVybiB0aGUgTExWTSBuYW1lIGZvciBhbiBpbnRyaW5zaWMsIHN1Y2ggYXMgImxsdm0ucHBjLmFsdGl2ZWMubHZ4Ii4KKyAgLy8vIE5vdGUsIHRoaXMgdmVyc2lvbiBvZiBnZXROYW1lIHN1cHBvcnRzIG92ZXJsb2FkcywgYnV0IGlzIGxlc3MgZWZmaWNpZW50CisgIC8vLyB0aGFuIHRoZSBTdHJpbmdSZWYgdmVyc2lvbiBvZiB0aGlzIGZ1bmN0aW9uLiAgSWYgbm8gb3ZlcmxvYWRzIGFyZQorICAvLy8gcmVxdXJpZWQsIGl0IGlzIHNhZmUgdG8gdXNlIHRoaXMgdmVyc2lvbiwgYnV0IGJldHRlciB0byB1c2UgdGhlIFN0cmluZ1JlZgorICAvLy8gdmVyc2lvbi4KKyAgc3RkOjpzdHJpbmcgZ2V0TmFtZShJRCBpZCwgQXJyYXlSZWY8VHlwZSo+IFR5cyk7CisKKyAgLy8vIFJldHVybiB0aGUgZnVuY3Rpb24gdHlwZSBmb3IgYW4gaW50cmluc2ljLgorICBGdW5jdGlvblR5cGUgKmdldFR5cGUoTExWTUNvbnRleHQgJkNvbnRleHQsIElEIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VHlwZSo+IFR5cyA9IE5vbmUpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGludHJpbnNpYyBjYW4gYmUgb3ZlcmxvYWRlZC4KKyAgYm9vbCBpc092ZXJsb2FkZWQoSUQgaWQpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGludHJpbnNpYyBpcyBhIGxlYWYsIGkuZS4gaXQgZG9lcyBub3QgbWFrZSBhbnkgY2FsbHMKKyAgLy8vIGl0c2VsZi4gIE1vc3QgaW50cmluc2ljcyBhcmUgbGVhZnMsIHRoZSBleGNlcHRpb25zIGJlaW5nIHRoZSBwYXRjaHBvaW50CisgIC8vLyBhbmQgc3RhdGVwb2ludCBpbnRyaW5zaWNzLiBUaGVzZSBjYWxsIChvciBpbnZva2UpIHRoZWlyICJ0YXJnZXQiIGFyZ3VtZW50LgorICBib29sIGlzTGVhZihJRCBpZCk7CisKKyAgLy8vIFJldHVybiB0aGUgYXR0cmlidXRlcyBmb3IgYW4gaW50cmluc2ljLgorICBBdHRyaWJ1dGVMaXN0IGdldEF0dHJpYnV0ZXMoTExWTUNvbnRleHQgJkMsIElEIGlkKTsKKworICAvLy8gQ3JlYXRlIG9yIGluc2VydCBhbiBMTFZNIEZ1bmN0aW9uIGRlY2xhcmF0aW9uIGZvciBhbiBpbnRyaW5zaWMsIGFuZCByZXR1cm4KKyAgLy8vIGl0LgorICAvLy8KKyAgLy8vIFRoZSBUeXMgcGFyYW1ldGVyIGlzIGZvciBpbnRyaW5zaWNzIHdpdGggb3ZlcmxvYWRlZCB0eXBlcyAoZS5nLiwgdGhvc2UKKyAgLy8vIHVzaW5nIGlBbnksIGZBbnksIHZBbnksIG9yIGlQVFJBbnkpLiAgRm9yIGEgZGVjbGFyYXRpb24gb2YgYW4gb3ZlcmxvYWRlZAorICAvLy8gaW50cmluc2ljLCBUeXMgbXVzdCBwcm92aWRlIGV4YWN0bHkgb25lIHR5cGUgZm9yIGVhY2ggb3ZlcmxvYWRlZCB0eXBlIGluCisgIC8vLyB0aGUgaW50cmluc2ljLgorICBGdW5jdGlvbiAqZ2V0RGVjbGFyYXRpb24oTW9kdWxlICpNLCBJRCBpZCwgQXJyYXlSZWY8VHlwZSo+IFR5cyA9IE5vbmUpOworCisgIC8vLyBMb29rcyB1cCBOYW1lIGluIE5hbWVUYWJsZSB2aWEgYmluYXJ5IHNlYXJjaC4gTmFtZVRhYmxlIG11c3QgYmUgc29ydGVkCisgIC8vLyBhbmQgYWxsIGVudHJpZXMgbXVzdCBzdGFydCB3aXRoICJsbHZtLiIuICBJZiBOYW1lVGFibGUgY29udGFpbnMgYW4gZXhhY3QKKyAgLy8vIG1hdGNoIGZvciBOYW1lIG9yIGEgcHJlZml4IG9mIE5hbWUgZm9sbG93ZWQgYnkgYSBkb3QsIGl0cyBpbmRleCBpbgorICAvLy8gTmFtZVRhYmxlIGlzIHJldHVybmVkLiBPdGhlcndpc2UsIC0xIGlzIHJldHVybmVkLgorICBpbnQgbG9va3VwTExWTUludHJpbnNpY0J5TmFtZShBcnJheVJlZjxjb25zdCBjaGFyICo+IE5hbWVUYWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIE5hbWUpOworCisgIC8vLyBNYXAgYSBHQ0MgYnVpbHRpbiBuYW1lIHRvIGFuIGludHJpbnNpYyBJRC4KKyAgSUQgZ2V0SW50cmluc2ljRm9yR0NDQnVpbHRpbihjb25zdCBjaGFyICpQcmVmaXgsIFN0cmluZ1JlZiBCdWlsdGluTmFtZSk7CisKKyAgLy8vIE1hcCBhIE1TIGJ1aWx0aW4gbmFtZSB0byBhbiBpbnRyaW5zaWMgSUQuCisgIElEIGdldEludHJpbnNpY0Zvck1TQnVpbHRpbihjb25zdCBjaGFyICpQcmVmaXgsIFN0cmluZ1JlZiBCdWlsdGluTmFtZSk7CisKKyAgLy8vIFRoaXMgaXMgYSB0eXBlIGRlc2NyaXB0b3Igd2hpY2ggZXhwbGFpbnMgdGhlIHR5cGUgcmVxdWlyZW1lbnRzIG9mIGFuCisgIC8vLyBpbnRyaW5zaWMuIFRoaXMgaXMgcmV0dXJuZWQgYnkgZ2V0SW50cmluc2ljSW5mb1RhYmxlRW50cmllcy4KKyAgc3RydWN0IElJVERlc2NyaXB0b3IgeworICAgIGVudW0gSUlURGVzY3JpcHRvcktpbmQgeworICAgICAgVm9pZCwgVmFyQXJnLCBNTVgsIFRva2VuLCBNZXRhZGF0YSwgSGFsZiwgRmxvYXQsIERvdWJsZSwKKyAgICAgIEludGVnZXIsIFZlY3RvciwgUG9pbnRlciwgU3RydWN0LAorICAgICAgQXJndW1lbnQsIEV4dGVuZEFyZ3VtZW50LCBUcnVuY0FyZ3VtZW50LCBIYWxmVmVjQXJndW1lbnQsCisgICAgICBTYW1lVmVjV2lkdGhBcmd1bWVudCwgUHRyVG9Bcmd1bWVudCwgUHRyVG9FbHQsIFZlY09mQW55UHRyc1RvRWx0CisgICAgfSBLaW5kOworCisgICAgdW5pb24geworICAgICAgdW5zaWduZWQgSW50ZWdlcl9XaWR0aDsKKyAgICAgIHVuc2lnbmVkIEZsb2F0X1dpZHRoOworICAgICAgdW5zaWduZWQgVmVjdG9yX1dpZHRoOworICAgICAgdW5zaWduZWQgUG9pbnRlcl9BZGRyZXNzU3BhY2U7CisgICAgICB1bnNpZ25lZCBTdHJ1Y3RfTnVtRWxlbWVudHM7CisgICAgICB1bnNpZ25lZCBBcmd1bWVudF9JbmZvOworICAgIH07CisKKyAgICBlbnVtIEFyZ0tpbmQgeworICAgICAgQUtfQW55LAorICAgICAgQUtfQW55SW50ZWdlciwKKyAgICAgIEFLX0FueUZsb2F0LAorICAgICAgQUtfQW55VmVjdG9yLAorICAgICAgQUtfQW55UG9pbnRlcgorICAgIH07CisKKyAgICB1bnNpZ25lZCBnZXRBcmd1bWVudE51bWJlcigpIGNvbnN0IHsKKyAgICAgIGFzc2VydChLaW5kID09IEFyZ3VtZW50IHx8IEtpbmQgPT0gRXh0ZW5kQXJndW1lbnQgfHwKKyAgICAgICAgICAgICBLaW5kID09IFRydW5jQXJndW1lbnQgfHwgS2luZCA9PSBIYWxmVmVjQXJndW1lbnQgfHwKKyAgICAgICAgICAgICBLaW5kID09IFNhbWVWZWNXaWR0aEFyZ3VtZW50IHx8IEtpbmQgPT0gUHRyVG9Bcmd1bWVudCB8fAorICAgICAgICAgICAgIEtpbmQgPT0gUHRyVG9FbHQpOworICAgICAgcmV0dXJuIEFyZ3VtZW50X0luZm8gPj4gMzsKKyAgICB9CisgICAgQXJnS2luZCBnZXRBcmd1bWVudEtpbmQoKSBjb25zdCB7CisgICAgICBhc3NlcnQoS2luZCA9PSBBcmd1bWVudCB8fCBLaW5kID09IEV4dGVuZEFyZ3VtZW50IHx8CisgICAgICAgICAgICAgS2luZCA9PSBUcnVuY0FyZ3VtZW50IHx8IEtpbmQgPT0gSGFsZlZlY0FyZ3VtZW50IHx8CisgICAgICAgICAgICAgS2luZCA9PSBTYW1lVmVjV2lkdGhBcmd1bWVudCB8fCBLaW5kID09IFB0clRvQXJndW1lbnQpOworICAgICAgcmV0dXJuIChBcmdLaW5kKShBcmd1bWVudF9JbmZvICYgNyk7CisgICAgfQorCisgICAgLy8gVmVjT2ZBbnlQdHJzVG9FbHQgdXNlcyBib3RoIGFuIG92ZXJsb2FkZWQgYXJndW1lbnQgKGZvciBhZGRyZXNzIHNwYWNlKQorICAgIC8vIGFuZCBhIHJlZmVyZW5jZSBhcmd1bWVudCAoZm9yIG1hdGNoaW5nIHZlY3RvciB3aWR0aCBhbmQgZWxlbWVudCB0eXBlcykKKyAgICB1bnNpZ25lZCBnZXRPdmVybG9hZEFyZ051bWJlcigpIGNvbnN0IHsKKyAgICAgIGFzc2VydChLaW5kID09IFZlY09mQW55UHRyc1RvRWx0KTsKKyAgICAgIHJldHVybiBBcmd1bWVudF9JbmZvID4+IDE2OworICAgIH0KKyAgICB1bnNpZ25lZCBnZXRSZWZBcmdOdW1iZXIoKSBjb25zdCB7CisgICAgICBhc3NlcnQoS2luZCA9PSBWZWNPZkFueVB0cnNUb0VsdCk7CisgICAgICByZXR1cm4gQXJndW1lbnRfSW5mbyAmIDB4RkZGRjsKKyAgICB9CisKKyAgICBzdGF0aWMgSUlURGVzY3JpcHRvciBnZXQoSUlURGVzY3JpcHRvcktpbmQgSywgdW5zaWduZWQgRmllbGQpIHsKKyAgICAgIElJVERlc2NyaXB0b3IgUmVzdWx0ID0geyBLLCB7IEZpZWxkIH0gfTsKKyAgICAgIHJldHVybiBSZXN1bHQ7CisgICAgfQorCisgICAgc3RhdGljIElJVERlc2NyaXB0b3IgZ2V0KElJVERlc2NyaXB0b3JLaW5kIEssIHVuc2lnbmVkIHNob3J0IEhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBMbykgeworICAgICAgdW5zaWduZWQgRmllbGQgPSBIaSA8PCAxNiB8IExvOworICAgICAgSUlURGVzY3JpcHRvciBSZXN1bHQgPSB7Sywge0ZpZWxkfX07CisgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKyAgfTsKKworICAvLy8gUmV0dXJuIHRoZSBJSVQgdGFibGUgZGVzY3JpcHRvciBmb3IgdGhlIHNwZWNpZmllZCBpbnRyaW5zaWMgaW50byBhbiBhcnJheQorICAvLy8gb2YgSUlURGVzY3JpcHRvcnMuCisgIHZvaWQgZ2V0SW50cmluc2ljSW5mb1RhYmxlRW50cmllcyhJRCBpZCwgU21hbGxWZWN0b3JJbXBsPElJVERlc2NyaXB0b3I+ICZUKTsKKworICAvLy8gTWF0Y2ggdGhlIHNwZWNpZmllZCB0eXBlICh3aGljaCBjb21lcyBmcm9tIGFuIGludHJpbnNpYyBhcmd1bWVudCBvciByZXR1cm4KKyAgLy8vIHZhbHVlKSB3aXRoIHRoZSB0eXBlIGNvbnN0cmFpbnRzIHNwZWNpZmllZCBieSB0aGUgLnRkIGZpbGUuIElmIHRoZSBnaXZlbgorICAvLy8gdHlwZSBpcyBhbiBvdmVybG9hZGVkIHR5cGUgaXQgaXMgcHVzaGVkIHRvIHRoZSBBcmdUeXMgdmVjdG9yLgorICAvLy8KKyAgLy8vIFJldHVybnMgZmFsc2UgaWYgdGhlIGdpdmVuIHR5cGUgbWF0Y2hlcyB3aXRoIHRoZSBjb25zdHJhaW50cywgdHJ1ZQorICAvLy8gb3RoZXJ3aXNlLgorICBib29sIG1hdGNoSW50cmluc2ljVHlwZShUeXBlICpUeSwgQXJyYXlSZWY8SUlURGVzY3JpcHRvcj4gJkluZm9zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VHlwZSo+ICZBcmdUeXMpOworCisgIC8vLyBWZXJpZnkgaWYgdGhlIGludHJpbnNpYyBoYXMgdmFyaWFibGUgYXJndW1lbnRzLiBUaGlzIG1ldGhvZCBpcyBpbnRlbmRlZCB0bworICAvLy8gYmUgY2FsbGVkIGFmdGVyIGFsbCB0aGUgZml4ZWQgYXJndW1lbnRzIGhhdmUgYmVlbiBtYXRjaGVkIGZpcnN0LgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBvbiBlcnJvci4KKyAgYm9vbCBtYXRjaEludHJpbnNpY1ZhckFyZyhib29sIGlzVmFyQXJnLCBBcnJheVJlZjxJSVREZXNjcmlwdG9yPiAmSW5mb3MpOworCisgIC8vIENoZWNrcyBpZiB0aGUgaW50cmluc2ljIG5hbWUgbWF0Y2hlcyB3aXRoIGl0cyBzaWduYXR1cmUgYW5kIGlmIG5vdAorICAvLyByZXR1cm5zIHRoZSBkZWNsYXJhdGlvbiB3aXRoIHRoZSBzYW1lIHNpZ25hdHVyZSBhbmQgcmVtYW5nbGVkIG5hbWUuCisgIGxsdm06Ok9wdGlvbmFsPEZ1bmN0aW9uKj4gcmVtYW5nbGVJbnRyaW5zaWNGdW5jdGlvbihGdW5jdGlvbiAqRik7CisKK30gLy8gRW5kIEludHJpbnNpYyBuYW1lc3BhY2UKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3MudGQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3MudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmJiMWM1YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljcy50ZApAQCAtMCwwICsxLDk4NSBAQAorLy89PT0tIEludHJpbnNpY3MudGQgLSBEZWZpbmVzIGFsbCBMTFZNIGludHJpbnNpY3MgLS0tLS0tLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBwcm9wZXJ0aWVzIG9mIGFsbCBMTFZNIGludHJpbnNpY3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworaW5jbHVkZSAibGx2bS9Db2RlR2VuL1ZhbHVlVHlwZXMudGQiCitpbmNsdWRlICJsbHZtL0NvZGVHZW4vU0ROb2RlUHJvcGVydGllcy50ZCIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBQcm9wZXJ0aWVzIHdlIGtlZXAgdHJhY2sgb2YgZm9yIGludHJpbnNpY3MuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBJbnRyaW5zaWNQcm9wZXJ0eTsKKworLy8gSW50cipNZW0gLSBNZW1vcnkgcHJvcGVydGllcy4gIElmIG5vIHByb3BlcnR5IGlzIHNldCwgdGhlIHdvcnN0IGNhc2UKKy8vIGlzIGFzc3VtZWQgKGl0IG1heSByZWFkIGFuZCB3cml0ZSBhbnkgbWVtb3J5IGl0IGNhbiBnZXQgYWNjZXNzIHRvIGFuZCBpdCBtYXkKKy8vIGhhdmUgb3RoZXIgc2lkZSBlZmZlY3RzKS4KKworLy8gSW50ck5vTWVtIC0gVGhlIGludHJpbnNpYyBkb2VzIG5vdCBhY2Nlc3MgbWVtb3J5IG9yIGhhdmUgYW55IG90aGVyIHNpZGUKKy8vIGVmZmVjdHMuICBJdCBtYXkgYmUgQ1NFJ2QgZGVsZXRlZCBpZiBkZWFkLCBldGMuCitkZWYgSW50ck5vTWVtIDogSW50cmluc2ljUHJvcGVydHk7CisKKy8vIEludHJSZWFkTWVtIC0gVGhpcyBpbnRyaW5zaWMgb25seSByZWFkcyBmcm9tIG1lbW9yeS4gSXQgZG9lcyBub3Qgd3JpdGUgdG8KKy8vIG1lbW9yeSBhbmQgaGFzIG5vIG90aGVyIHNpZGUgZWZmZWN0cy4gVGhlcmVmb3JlLCBpdCBjYW5ub3QgYmUgbW92ZWQgYWNyb3NzCisvLyBwb3RlbnRpYWxseSBhbGlhc2luZyBzdG9yZXMuIEhvd2V2ZXIsIGl0IGNhbiBiZSByZW9yZGVyZWQgb3RoZXJ3aXNlIGFuZCBjYW4KKy8vIGJlIGRlbGV0ZWQgaWYgZGVhZC4KK2RlZiBJbnRyUmVhZE1lbSA6IEludHJpbnNpY1Byb3BlcnR5OworCisvLyBJbnRyV3JpdGVNZW0gLSBUaGlzIGludHJpbnNpYyBvbmx5IHdyaXRlcyB0byBtZW1vcnksIGJ1dCBkb2VzIG5vdCByZWFkIGZyb20KKy8vIG1lbW9yeSwgYW5kIGhhcyBubyBvdGhlciBzaWRlIGVmZmVjdHMuIFRoaXMgbWVhbnMgZGVhZCBzdG9yZXMgYmVmb3JlIGNhbGxzCisvLyB0byB0aGlzIGludHJpbnNpY3MgbWF5IGJlIHJlbW92ZWQuCitkZWYgSW50cldyaXRlTWVtIDogSW50cmluc2ljUHJvcGVydHk7CisKKy8vIEludHJBcmdNZW1Pbmx5IC0gVGhpcyBpbnRyaW5zaWMgb25seSBhY2Nlc3NlcyBtZW1vcnkgdGhhdCBpdHMgcG9pbnRlci10eXBlZAorLy8gYXJndW1lbnQocykgcG9pbnRzIHRvLCBidXQgbWF5IGFjY2VzcyBhbiB1bnNwZWNpZmllZCBhbW91bnQuIE90aGVyIHRoYW4KKy8vIHJlYWRzIGZyb20gYW5kIChwb3NzaWJseSB2b2xhdGlsZSkgd3JpdGVzIHRvIG1lbW9yeSwgaXQgaGFzIG5vIHNpZGUgZWZmZWN0cy4KK2RlZiBJbnRyQXJnTWVtT25seSA6IEludHJpbnNpY1Byb3BlcnR5OworCisvLyBJbnRySW5hY2Nlc3NpYmxlTWVtT25seSAtLSBUaGlzIGludHJpbnNpYyBvbmx5IGFjY2Vzc2VzIG1lbW9yeSB0aGF0IGlzIG5vdAorLy8gYWNjZXNzaWJsZSBieSB0aGUgbW9kdWxlIGJlaW5nIGNvbXBpbGVkLiBUaGlzIGlzIGEgd2Vha2VyIGZvcm0gb2YgSW50ck5vTWVtLgorZGVmIEludHJJbmFjY2Vzc2libGVNZW1Pbmx5IDogSW50cmluc2ljUHJvcGVydHk7CisKKy8vIEludHJJbmFjY2Vzc2libGVNZW1PckFyZ01lbU9ubHkgLS0gVGhpcyBpbnRyaW5zaWMgb25seSBhY2Nlc3NlcyBtZW1vcnkgdGhhdAorLy8gaXRzIHBvaW50ZXItdHlwZWQgYXJndW1lbnRzIHBvaW50IHRvIG9yIG1lbW9yeSB0aGF0IGlzIG5vdCBhY2Nlc3NpYmxlCisvLyBieSB0aGUgbW9kdWxlIGJlaW5nIGNvbXBpbGVkLiBUaGlzIGlzIGEgd2Vha2VyIGZvcm0gb2YgSW50ckFyZ01lbU9ubHkuCitkZWYgSW50ckluYWNjZXNzaWJsZU1lbU9yQXJnTWVtT25seSA6IEludHJpbnNpY1Byb3BlcnR5OworCisvLyBDb21tdXRhdGl2ZSAtIFRoaXMgaW50cmluc2ljIGlzIGNvbW11dGF0aXZlOiBYIG9wIFkgPT0gWSBvcCBYLgorZGVmIENvbW11dGF0aXZlIDogSW50cmluc2ljUHJvcGVydHk7CisKKy8vIFRocm93cyAtIFRoaXMgaW50cmluc2ljIGNhbiB0aHJvdy4KK2RlZiBUaHJvd3MgOiBJbnRyaW5zaWNQcm9wZXJ0eTsKKworLy8gTm9DYXB0dXJlIC0gVGhlIHNwZWNpZmllZCBhcmd1bWVudCBwb2ludGVyIGlzIG5vdCBjYXB0dXJlZCBieSB0aGUgaW50cmluc2ljLgorY2xhc3MgTm9DYXB0dXJlPGludCBhcmdObz4gOiBJbnRyaW5zaWNQcm9wZXJ0eSB7CisgIGludCBBcmdObyA9IGFyZ05vOworfQorCisvLyBSZXR1cm5lZCAtIFRoZSBzcGVjaWZpZWQgYXJndW1lbnQgaXMgYWx3YXlzIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhlCisvLyBpbnRyaW5zaWMuCitjbGFzcyBSZXR1cm5lZDxpbnQgYXJnTm8+IDogSW50cmluc2ljUHJvcGVydHkgeworICBpbnQgQXJnTm8gPSBhcmdObzsKK30KKworLy8gUmVhZE9ubHkgLSBUaGUgc3BlY2lmaWVkIGFyZ3VtZW50IHBvaW50ZXIgaXMgbm90IHdyaXR0ZW4gdG8gdGhyb3VnaCB0aGUKKy8vIHBvaW50ZXIgYnkgdGhlIGludHJpbnNpYy4KK2NsYXNzIFJlYWRPbmx5PGludCBhcmdObz4gOiBJbnRyaW5zaWNQcm9wZXJ0eSB7CisgIGludCBBcmdObyA9IGFyZ05vOworfQorCisvLyBXcml0ZU9ubHkgLSBUaGUgaW50cmluc2ljIGRvZXMgbm90IHJlYWQgbWVtb3J5IHRocm91Z2ggdGhlIHNwZWNpZmllZAorLy8gYXJndW1lbnQgcG9pbnRlci4KK2NsYXNzIFdyaXRlT25seTxpbnQgYXJnTm8+IDogSW50cmluc2ljUHJvcGVydHkgeworICBpbnQgQXJnTm8gPSBhcmdObzsKK30KKworLy8gUmVhZE5vbmUgLSBUaGUgc3BlY2lmaWVkIGFyZ3VtZW50IHBvaW50ZXIgaXMgbm90IGRlcmVmZXJlbmNlZCBieSB0aGUKKy8vIGludHJpbnNpYy4KK2NsYXNzIFJlYWROb25lPGludCBhcmdObz4gOiBJbnRyaW5zaWNQcm9wZXJ0eSB7CisgIGludCBBcmdObyA9IGFyZ05vOworfQorCitkZWYgSW50ck5vUmV0dXJuIDogSW50cmluc2ljUHJvcGVydHk7CisKKy8vIEludHJOb2R1cGxpY2F0ZSAtIENhbGxzIHRvIHRoaXMgaW50cmluc2ljIGNhbm5vdCBiZSBkdXBsaWNhdGVkLgorLy8gUGFyYWxsZWxzIHRoZSBub2R1cGxpY2F0ZSBhdHRyaWJ1dGUgb24gTExWTSBJUiBmdW5jdGlvbnMuCitkZWYgSW50ck5vRHVwbGljYXRlIDogSW50cmluc2ljUHJvcGVydHk7CisKKy8vIEludHJDb252ZXJnZW50IC0gQ2FsbHMgdG8gdGhpcyBpbnRyaW5zaWMgYXJlIGNvbnZlcmdlbnQgYW5kIG1heSBub3QgYmUgbWFkZQorLy8gY29udHJvbC1kZXBlbmRlbnQgb24gYW55IGFkZGl0aW9uYWwgdmFsdWVzLgorLy8gUGFyYWxsZWxzIHRoZSBjb252ZXJnZW50IGF0dHJpYnV0ZSBvbiBMTFZNIElSIGZ1bmN0aW9ucy4KK2RlZiBJbnRyQ29udmVyZ2VudCA6IEludHJpbnNpY1Byb3BlcnR5OworCisvLyBUaGlzIHByb3BlcnR5IGluZGljYXRlcyB0aGF0IHRoZSBpbnRyaW5zaWMgaXMgc2FmZSB0byBzcGVjdWxhdGUuCitkZWYgSW50clNwZWN1bGF0YWJsZSA6IEludHJpbnNpY1Byb3BlcnR5OworCisvLyBUaGlzIHByb3BlcnR5IGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoZSAnaGFzIG5vIG90aGVyIHNpZGUgZWZmZWN0cycKKy8vIGxhbmd1YWdlIG9mIHRoZSBJbnRyTm9NZW0sIEludHJSZWFkTWVtLCBJbnRyV3JpdGVNZW0sIGFuZCBJbnRyQXJnTWVtT25seQorLy8gaW50cmluc2ljIHByb3BlcnRpZXMuICBCeSBkZWZhdWx0LCBpbnRyaW5zaWNzIGFyZSBhc3N1bWVkIHRvIGhhdmUgc2lkZQorLy8gZWZmZWN0cywgc28gdGhpcyBwcm9wZXJ0eSBpcyBvbmx5IG5lY2Vzc2FyeSBpZiB5b3UgaGF2ZSBkZWZpbmVkIG9uZSBvZgorLy8gdGhlIG1lbW9yeSBwcm9wZXJ0aWVzIGxpc3RlZCBhYm92ZS4KKy8vIEZvciB0aGlzIHByb3BlcnR5LCAnc2lkZSBlZmZlY3RzJyBoYXMgdGhlIHNhbWUgbWVhbmluZyBhcyAnc2lkZSBlZmZlY3RzJworLy8gZGVmaW5lZCBieSB0aGUgaGFzU2lkZUVmZmVjdHMgcHJvcGVydHkgb2YgdGhlIFRhYmxlR2VuIEluc3RydWN0aW9uIGNsYXNzLgorZGVmIEludHJIYXNTaWRlRWZmZWN0cyA6IEludHJpbnNpY1Byb3BlcnR5OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVHlwZXMgdXNlZCBieSBpbnRyaW5zaWNzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgTExWTVR5cGU8VmFsdWVUeXBlIHZ0PiB7CisgIFZhbHVlVHlwZSBWVCA9IHZ0OworfQorCitjbGFzcyBMTFZNUXVhbFBvaW50ZXJUeXBlPExMVk1UeXBlIGVsdHksIGludCBhZGRyc3BhY2U+CisgIDogTExWTVR5cGU8aVBUUj57CisgIExMVk1UeXBlIEVsVHkgPSBlbHR5OworICBpbnQgQWRkclNwYWNlID0gYWRkcnNwYWNlOworfQorCitjbGFzcyBMTFZNUG9pbnRlclR5cGU8TExWTVR5cGUgZWx0eT4KKyAgOiBMTFZNUXVhbFBvaW50ZXJUeXBlPGVsdHksIDA+OworCitjbGFzcyBMTFZNQW55UG9pbnRlclR5cGU8TExWTVR5cGUgZWx0eT4KKyAgOiBMTFZNVHlwZTxpUFRSQW55PnsKKyAgTExWTVR5cGUgRWxUeSA9IGVsdHk7Cit9CisKKy8vIE1hdGNoIHRoZSB0eXBlIG9mIGFub3RoZXIgaW50cmluc2ljIHBhcmFtZXRlci4gIE51bWJlciBpcyBhbiBpbmRleCBpbnRvIHRoZQorLy8gbGlzdCBvZiBvdmVybG9hZGVkIHR5cGVzIGZvciB0aGUgaW50cmluc2ljLCBleGNsdWRpbmcgYWxsIHRoZSBmaXhlZCB0eXBlcy4KKy8vIFRoZSBOdW1iZXIgdmFsdWUgbXVzdCByZWZlciB0byBhIHByZXZpb3VzbHkgbGlzdGVkIHR5cGUuICBGb3IgZXhhbXBsZToKKy8vICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9hbnlmbG9hdF90eSwgTExWTU1hdGNoVHlwZTwwPl0+CisvLyBoYXMgdHdvIG92ZXJsb2FkZWQgdHlwZXMsIHRoZSAybmQgYW5kIDNyZCBhcmd1bWVudHMuICBMTFZNTWF0Y2hUeXBlPDA+CisvLyByZWZlcnMgdG8gdGhlIGZpcnN0IG92ZXJsb2FkZWQgdHlwZSwgd2hpY2ggaXMgdGhlIDJuZCBhcmd1bWVudC4KK2NsYXNzIExMVk1NYXRjaFR5cGU8aW50IG51bT4KKyAgOiBMTFZNVHlwZTxPdGhlclZUPnsKKyAgaW50IE51bWJlciA9IG51bTsKK30KKworLy8gTWF0Y2ggdGhlIHR5cGUgb2YgYW5vdGhlciBpbnRyaW5zaWMgcGFyYW1ldGVyIHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgYmFzZWQgb24KKy8vIGFuIGludGVncmFsIHR5cGUgKGkuZS4gZWl0aGVyIGlOIG9yIDxOIHggaU0+KSwgYnV0IGNoYW5nZSB0aGUgc2NhbGFyIHNpemUgdG8KKy8vIGJlIHR3aWNlIGFzIHdpZGUgb3IgaGFsZiBhcyB3aWRlIGFzIHRoZSBvdGhlciB0eXBlLiAgVGhpcyBpcyBvbmx5IHVzZWZ1bCB3aGVuCisvLyB0aGUgaW50cmluc2ljIGlzIG92ZXJsb2FkZWQsIHNvIHRoZSBtYXRjaGVkIHR5cGUgc2hvdWxkIGJlIGRlY2xhcmVkIGFzIGlBbnkuCitjbGFzcyBMTFZNRXh0ZW5kZWRUeXBlPGludCBudW0+IDogTExWTU1hdGNoVHlwZTxudW0+OworY2xhc3MgTExWTVRydW5jYXRlZFR5cGU8aW50IG51bT4gOiBMTFZNTWF0Y2hUeXBlPG51bT47CitjbGFzcyBMTFZNVmVjdG9yU2FtZVdpZHRoPGludCBudW0sIExMVk1UeXBlIGVsdHk+CisgIDogTExWTU1hdGNoVHlwZTxudW0+IHsKKyAgVmFsdWVUeXBlIEVsVHkgPSBlbHR5LlZUOworfQorY2xhc3MgTExWTVBvaW50ZXJUbzxpbnQgbnVtPiA6IExMVk1NYXRjaFR5cGU8bnVtPjsKK2NsYXNzIExMVk1Qb2ludGVyVG9FbHQ8aW50IG51bT4gOiBMTFZNTWF0Y2hUeXBlPG51bT47CitjbGFzcyBMTFZNVmVjdG9yT2ZBbnlQb2ludGVyc1RvRWx0PGludCBudW0+IDogTExWTU1hdGNoVHlwZTxudW0+OworCisvLyBNYXRjaCB0aGUgdHlwZSBvZiBhbm90aGVyIGludHJpbnNpYyBwYXJhbWV0ZXIgdGhhdCBpcyBleHBlY3RlZCB0byBiZSBhCisvLyB2ZWN0b3IgdHlwZSwgYnV0IGNoYW5nZSB0aGUgZWxlbWVudCBjb3VudCB0byBiZSBoYWxmIGFzIG1hbnkKK2NsYXNzIExMVk1IYWxmRWxlbWVudHNWZWN0b3JUeXBlPGludCBudW0+IDogTExWTU1hdGNoVHlwZTxudW0+OworCitkZWYgbGx2bV92b2lkX3R5ICAgICAgIDogTExWTVR5cGU8aXNWb2lkPjsKK2RlZiBsbHZtX2FueV90eSAgICAgICAgOiBMTFZNVHlwZTxBbnk+OworZGVmIGxsdm1fYW55aW50X3R5ICAgICA6IExMVk1UeXBlPGlBbnk+OworZGVmIGxsdm1fYW55ZmxvYXRfdHkgICA6IExMVk1UeXBlPGZBbnk+OworZGVmIGxsdm1fYW55dmVjdG9yX3R5ICA6IExMVk1UeXBlPHZBbnk+OworZGVmIGxsdm1faTFfdHkgICAgICAgICA6IExMVk1UeXBlPGkxPjsKK2RlZiBsbHZtX2k4X3R5ICAgICAgICAgOiBMTFZNVHlwZTxpOD47CitkZWYgbGx2bV9pMTZfdHkgICAgICAgIDogTExWTVR5cGU8aTE2PjsKK2RlZiBsbHZtX2kzMl90eSAgICAgICAgOiBMTFZNVHlwZTxpMzI+OworZGVmIGxsdm1faTY0X3R5ICAgICAgICA6IExMVk1UeXBlPGk2ND47CitkZWYgbGx2bV9oYWxmX3R5ICAgICAgIDogTExWTVR5cGU8ZjE2PjsKK2RlZiBsbHZtX2Zsb2F0X3R5ICAgICAgOiBMTFZNVHlwZTxmMzI+OworZGVmIGxsdm1fZG91YmxlX3R5ICAgICA6IExMVk1UeXBlPGY2ND47CitkZWYgbGx2bV9mODBfdHkgICAgICAgIDogTExWTVR5cGU8ZjgwPjsKK2RlZiBsbHZtX2YxMjhfdHkgICAgICAgOiBMTFZNVHlwZTxmMTI4PjsKK2RlZiBsbHZtX3BwY2YxMjhfdHkgICAgOiBMTFZNVHlwZTxwcGNmMTI4PjsKK2RlZiBsbHZtX3B0cl90eSAgICAgICAgOiBMTFZNUG9pbnRlclR5cGU8bGx2bV9pOF90eT47ICAgICAgICAgICAgIC8vIGk4KgorZGVmIGxsdm1fcHRycHRyX3R5ICAgICA6IExMVk1Qb2ludGVyVHlwZTxsbHZtX3B0cl90eT47ICAgICAgICAgICAgLy8gaTgqKgorZGVmIGxsdm1fYW55cHRyX3R5ICAgICA6IExMVk1BbnlQb2ludGVyVHlwZTxsbHZtX2k4X3R5PjsgICAgICAgICAgLy8gKHNwYWNlKWk4KgorZGVmIGxsdm1fZW1wdHlfdHkgICAgICA6IExMVk1UeXBlPE90aGVyVlQ+OyAgICAgICAgICAgICAgICAgICAgICAgLy8geyB9CitkZWYgbGx2bV9kZXNjcmlwdG9yX3R5IDogTExWTVBvaW50ZXJUeXBlPGxsdm1fZW1wdHlfdHk+OyAgICAgICAgICAvLyB7IH0qCitkZWYgbGx2bV9tZXRhZGF0YV90eSAgIDogTExWTVR5cGU8TWV0YWRhdGFWVD47ICAgICAgICAgICAgICAgICAgICAvLyAhey4uLn0KK2RlZiBsbHZtX3Rva2VuX3R5ICAgICAgOiBMTFZNVHlwZTx0b2tlbj47ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRva2VuCisKK2RlZiBsbHZtX3g4Nm1teF90eSAgICAgOiBMTFZNVHlwZTx4ODZtbXg+OworZGVmIGxsdm1fcHRyeDg2bW14X3R5ICA6IExMVk1Qb2ludGVyVHlwZTxsbHZtX3g4Nm1teF90eT47ICAgICAgICAgLy8gPDEgeCBpNjQ+KgorCitkZWYgbGx2bV92MmkxX3R5ICAgICAgIDogTExWTVR5cGU8djJpMT47ICAgICAvLyAgIDIgeCBpMQorZGVmIGxsdm1fdjRpMV90eSAgICAgICA6IExMVk1UeXBlPHY0aTE+OyAgICAgLy8gICA0IHggaTEKK2RlZiBsbHZtX3Y4aTFfdHkgICAgICAgOiBMTFZNVHlwZTx2OGkxPjsgICAgIC8vICAgOCB4IGkxCitkZWYgbGx2bV92MTZpMV90eSAgICAgIDogTExWTVR5cGU8djE2aTE+OyAgICAvLyAgMTYgeCBpMQorZGVmIGxsdm1fdjMyaTFfdHkgICAgICA6IExMVk1UeXBlPHYzMmkxPjsgICAgLy8gIDMyIHggaTEKK2RlZiBsbHZtX3Y2NGkxX3R5ICAgICAgOiBMTFZNVHlwZTx2NjRpMT47ICAgIC8vICA2NCB4IGkxCitkZWYgbGx2bV92NTEyaTFfdHkgICAgIDogTExWTVR5cGU8djUxMmkxPjsgICAvLyA1MTIgeCBpMQorZGVmIGxsdm1fdjEwMjRpMV90eSAgICA6IExMVk1UeXBlPHYxMDI0aTE+OyAgLy8xMDI0IHggaTEKKworZGVmIGxsdm1fdjFpOF90eSAgICAgICA6IExMVk1UeXBlPHYxaTg+OyAgICAgLy8gIDEgeCBpOAorZGVmIGxsdm1fdjJpOF90eSAgICAgICA6IExMVk1UeXBlPHYyaTg+OyAgICAgLy8gIDIgeCBpOAorZGVmIGxsdm1fdjRpOF90eSAgICAgICA6IExMVk1UeXBlPHY0aTg+OyAgICAgLy8gIDQgeCBpOAorZGVmIGxsdm1fdjhpOF90eSAgICAgICA6IExMVk1UeXBlPHY4aTg+OyAgICAgLy8gIDggeCBpOAorZGVmIGxsdm1fdjE2aThfdHkgICAgICA6IExMVk1UeXBlPHYxNmk4PjsgICAgLy8gMTYgeCBpOAorZGVmIGxsdm1fdjMyaThfdHkgICAgICA6IExMVk1UeXBlPHYzMmk4PjsgICAgLy8gMzIgeCBpOAorZGVmIGxsdm1fdjY0aThfdHkgICAgICA6IExMVk1UeXBlPHY2NGk4PjsgICAgLy8gNjQgeCBpOAorZGVmIGxsdm1fdjEyOGk4X3R5ICAgICA6IExMVk1UeXBlPHYxMjhpOD47ICAgLy8xMjggeCBpOAorZGVmIGxsdm1fdjI1Nmk4X3R5ICAgICA6IExMVk1UeXBlPHYyNTZpOD47ICAgLy8yNTYgeCBpOAorCitkZWYgbGx2bV92MWkxNl90eSAgICAgIDogTExWTVR5cGU8djFpMTY+OyAgICAvLyAgMSB4IGkxNgorZGVmIGxsdm1fdjJpMTZfdHkgICAgICA6IExMVk1UeXBlPHYyaTE2PjsgICAgLy8gIDIgeCBpMTYKK2RlZiBsbHZtX3Y0aTE2X3R5ICAgICAgOiBMTFZNVHlwZTx2NGkxNj47ICAgIC8vICA0IHggaTE2CitkZWYgbGx2bV92OGkxNl90eSAgICAgIDogTExWTVR5cGU8djhpMTY+OyAgICAvLyAgOCB4IGkxNgorZGVmIGxsdm1fdjE2aTE2X3R5ICAgICA6IExMVk1UeXBlPHYxNmkxNj47ICAgLy8gMTYgeCBpMTYKK2RlZiBsbHZtX3YzMmkxNl90eSAgICAgOiBMTFZNVHlwZTx2MzJpMTY+OyAgIC8vIDMyIHggaTE2CitkZWYgbGx2bV92NjRpMTZfdHkgICAgIDogTExWTVR5cGU8djY0aTE2PjsgICAvLyA2NCB4IGkxNgorZGVmIGxsdm1fdjEyOGkxNl90eSAgICA6IExMVk1UeXBlPHYxMjhpMTY+OyAgLy8xMjggeCBpMTYKKworZGVmIGxsdm1fdjFpMzJfdHkgICAgICA6IExMVk1UeXBlPHYxaTMyPjsgICAgLy8gIDEgeCBpMzIKK2RlZiBsbHZtX3YyaTMyX3R5ICAgICAgOiBMTFZNVHlwZTx2MmkzMj47ICAgIC8vICAyIHggaTMyCitkZWYgbGx2bV92NGkzMl90eSAgICAgIDogTExWTVR5cGU8djRpMzI+OyAgICAvLyAgNCB4IGkzMgorZGVmIGxsdm1fdjhpMzJfdHkgICAgICA6IExMVk1UeXBlPHY4aTMyPjsgICAgLy8gIDggeCBpMzIKK2RlZiBsbHZtX3YxNmkzMl90eSAgICAgOiBMTFZNVHlwZTx2MTZpMzI+OyAgIC8vIDE2IHggaTMyCitkZWYgbGx2bV92MzJpMzJfdHkgICAgIDogTExWTVR5cGU8djMyaTMyPjsgICAvLyAzMiB4IGkzMgorZGVmIGxsdm1fdjY0aTMyX3R5ICAgICA6IExMVk1UeXBlPHY2NGkzMj47ICAgLy8gNjQgeCBpMzIKKworZGVmIGxsdm1fdjFpNjRfdHkgICAgICA6IExMVk1UeXBlPHYxaTY0PjsgICAgLy8gIDEgeCBpNjQKK2RlZiBsbHZtX3YyaTY0X3R5ICAgICAgOiBMTFZNVHlwZTx2Mmk2ND47ICAgIC8vICAyIHggaTY0CitkZWYgbGx2bV92NGk2NF90eSAgICAgIDogTExWTVR5cGU8djRpNjQ+OyAgICAvLyAgNCB4IGk2NAorZGVmIGxsdm1fdjhpNjRfdHkgICAgICA6IExMVk1UeXBlPHY4aTY0PjsgICAgLy8gIDggeCBpNjQKK2RlZiBsbHZtX3YxNmk2NF90eSAgICAgOiBMTFZNVHlwZTx2MTZpNjQ+OyAgIC8vIDE2IHggaTY0CitkZWYgbGx2bV92MzJpNjRfdHkgICAgIDogTExWTVR5cGU8djMyaTY0PjsgICAvLyAzMiB4IGk2NAorCitkZWYgbGx2bV92MWkxMjhfdHkgICAgIDogTExWTVR5cGU8djFpMTI4PjsgICAvLyAgMSB4IGkxMjgKKworZGVmIGxsdm1fdjJmMTZfdHkgICAgICA6IExMVk1UeXBlPHYyZjE2PjsgICAgLy8gIDIgeCBoYWxmIChfX2ZwMTYpCitkZWYgbGx2bV92NGYxNl90eSAgICAgIDogTExWTVR5cGU8djRmMTY+OyAgICAvLyAgNCB4IGhhbGYgKF9fZnAxNikKK2RlZiBsbHZtX3Y4ZjE2X3R5ICAgICAgOiBMTFZNVHlwZTx2OGYxNj47ICAgIC8vICA4IHggaGFsZiAoX19mcDE2KQorZGVmIGxsdm1fdjFmMzJfdHkgICAgICA6IExMVk1UeXBlPHYxZjMyPjsgICAgLy8gIDEgeCBmbG9hdAorZGVmIGxsdm1fdjJmMzJfdHkgICAgICA6IExMVk1UeXBlPHYyZjMyPjsgICAgLy8gIDIgeCBmbG9hdAorZGVmIGxsdm1fdjRmMzJfdHkgICAgICA6IExMVk1UeXBlPHY0ZjMyPjsgICAgLy8gIDQgeCBmbG9hdAorZGVmIGxsdm1fdjhmMzJfdHkgICAgICA6IExMVk1UeXBlPHY4ZjMyPjsgICAgLy8gIDggeCBmbG9hdAorZGVmIGxsdm1fdjE2ZjMyX3R5ICAgICA6IExMVk1UeXBlPHYxNmYzMj47ICAgLy8gMTYgeCBmbG9hdAorZGVmIGxsdm1fdjFmNjRfdHkgICAgICA6IExMVk1UeXBlPHYxZjY0PjsgICAgLy8gIDEgeCBkb3VibGUKK2RlZiBsbHZtX3YyZjY0X3R5ICAgICAgOiBMTFZNVHlwZTx2MmY2ND47ICAgIC8vICAyIHggZG91YmxlCitkZWYgbGx2bV92NGY2NF90eSAgICAgIDogTExWTVR5cGU8djRmNjQ+OyAgICAvLyAgNCB4IGRvdWJsZQorZGVmIGxsdm1fdjhmNjRfdHkgICAgICA6IExMVk1UeXBlPHY4ZjY0PjsgICAgLy8gIDggeCBkb3VibGUKKworZGVmIGxsdm1fdmFyYXJnX3R5ICAgICA6IExMVk1UeXBlPGlzVm9pZD47ICAgLy8gdGhpcyBtZWFucyB2YXJhcmcgaGVyZQorCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbnRyaW5zaWMgRGVmaW5pdGlvbnMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBJbnRyaW5zaWMgY2xhc3MgLSBUaGlzIGlzIHVzZWQgdG8gZGVmaW5lIG9uZSBMTFZNIGludHJpbnNpYy4gIFRoZSBuYW1lIG9mIHRoZQorLy8gaW50cmluc2ljIGRlZmluaXRpb24gc2hvdWxkIHN0YXJ0IHdpdGggImludF8iLCB0aGVuIG1hdGNoIHRoZSBMTFZNIGludHJpbnNpYworLy8gbmFtZSB3aXRoIHRoZSAibGx2bS4iIHByZWZpeCByZW1vdmVkLCBhbmQgYWxsICIuInMgdHVybmVkIGludG8gIl8icy4gIEZvcgorLy8gZXhhbXBsZSwgbGx2bS5ic3dhcC5pMTYgLT4gaW50X2Jzd2FwX2kxNi4KKy8vCisvLyAgKiBSZXRUeXBlcyBpcyBhIGxpc3QgY29udGFpbmluZyB0aGUgcmV0dXJuIHR5cGVzIGV4cGVjdGVkIGZvciB0aGUKKy8vICAgIGludHJpbnNpYy4KKy8vICAqIFBhcmFtVHlwZXMgaXMgYSBsaXN0IGNvbnRhaW5pbmcgdGhlIHBhcmFtZXRlciB0eXBlcyBleHBlY3RlZCBmb3IgdGhlCisvLyAgICBpbnRyaW5zaWMuCisvLyAgKiBQcm9wZXJ0aWVzIGNhbiBiZSBzZXQgdG8gZGVzY3JpYmUgdGhlIGJlaGF2aW9yIG9mIHRoZSBpbnRyaW5zaWMuCisvLworY2xhc3MgSW50cmluc2ljPGxpc3Q8TExWTVR5cGU+IHJldF90eXBlcywKKyAgICAgICAgICAgICAgICBsaXN0PExMVk1UeXBlPiBwYXJhbV90eXBlcyA9IFtdLAorICAgICAgICAgICAgICAgIGxpc3Q8SW50cmluc2ljUHJvcGVydHk+IGludHJfcHJvcGVydGllcyA9IFtdLAorICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lID0gIiIsCisgICAgICAgICAgICAgICAgbGlzdDxTRE5vZGVQcm9wZXJ0eT4gc2RfcHJvcGVydGllcyA9IFtdPiA6IFNEUGF0dGVybk9wZXJhdG9yIHsKKyAgc3RyaW5nIExMVk1OYW1lID0gbmFtZTsKKyAgc3RyaW5nIFRhcmdldFByZWZpeCA9ICIiOyAgIC8vIFNldCB0byBhIHByZWZpeCBmb3IgdGFyZ2V0LXNwZWNpZmljIGludHJpbnNpY3MuCisgIGxpc3Q8TExWTVR5cGU+IFJldFR5cGVzID0gcmV0X3R5cGVzOworICBsaXN0PExMVk1UeXBlPiBQYXJhbVR5cGVzID0gcGFyYW1fdHlwZXM7CisgIGxpc3Q8SW50cmluc2ljUHJvcGVydHk+IEludHJQcm9wZXJ0aWVzID0gaW50cl9wcm9wZXJ0aWVzOworICBsZXQgUHJvcGVydGllcyA9IHNkX3Byb3BlcnRpZXM7CisKKyAgYml0IGlzVGFyZ2V0ID0gMDsKK30KKworLy8vIEdDQ0J1aWx0aW4gLSBJZiB0aGlzIGludHJpbnNpYyBleGFjdGx5IGNvcnJlc3BvbmRzIHRvIGEgR0NDIGJ1aWx0aW4sIHRoaXMKKy8vLyBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgdGhlIGJ1aWx0aW4uICBUaGlzIHByb3ZpZGVzIGF1dG9tYXRpYyBDQkUgYW5kIENGRQorLy8vIHN1cHBvcnQuCitjbGFzcyBHQ0NCdWlsdGluPHN0cmluZyBuYW1lPiB7CisgIHN0cmluZyBHQ0NCdWlsdGluTmFtZSA9IG5hbWU7Cit9CisKK2NsYXNzIE1TQnVpbHRpbjxzdHJpbmcgbmFtZT4geworICBzdHJpbmcgTVNCdWlsdGluTmFtZSA9IG5hbWU7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0gVmFyaWFibGUgQXJndW1lbnQgSGFuZGxpbmcgSW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisKK2RlZiBpbnRfdmFzdGFydCA6IEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW10sICJsbHZtLnZhX3N0YXJ0Ij47CitkZWYgaW50X3ZhY29weSAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9wdHJfdHldLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGx2bS52YV9jb3B5Ij47CitkZWYgaW50X3ZhZW5kICAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtdLCAibGx2bS52YV9lbmQiPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tIEdhcmJhZ2UgQ29sbGVjdGlvbiBJbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCitkZWYgaW50X2djcm9vdCAgOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRycHRyX3R5LCBsbHZtX3B0cl90eV0+OworZGVmIGludF9nY3JlYWQgIDogSW50cmluc2ljPFtsbHZtX3B0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3B0cnB0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworZGVmIGludF9nY3dyaXRlIDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9wdHJfdHksIGxsdm1fcHRycHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwxPiwgTm9DYXB0dXJlPDI+XT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvZGUgR2VuZXJhdG9yIEludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworZGVmIGludF9yZXR1cm5hZGRyZXNzIDogSW50cmluc2ljPFtsbHZtX3B0cl90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYWRkcmVzc29mcmV0dXJuYWRkcmVzcyA6IEludHJpbnNpYzxbbGx2bV9wdHJfdHldLCBbXSwgW0ludHJOb01lbV0+OworZGVmIGludF9mcmFtZWFkZHJlc3MgIDogSW50cmluc2ljPFtsbHZtX3B0cl90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcmVhZF9yZWdpc3RlciAgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwgW2xsdm1fbWV0YWRhdGFfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRNZW1dLCAibGx2bS5yZWFkX3JlZ2lzdGVyIj47CitkZWYgaW50X3dyaXRlX3JlZ2lzdGVyIDogSW50cmluc2ljPFtdLCBbbGx2bV9tZXRhZGF0YV90eSwgbGx2bV9hbnlpbnRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgImxsdm0ud3JpdGVfcmVnaXN0ZXIiPjsKKworLy8gR2V0cyB0aGUgYWRkcmVzcyBvZiB0aGUgbG9jYWwgdmFyaWFibGUgYXJlYS4gVGhpcyBpcyB0eXBpY2FsbHkgYSBjb3B5IG9mIHRoZQorLy8gc3RhY2ssIGZyYW1lLCBvciBiYXNlIHBvaW50ZXIgZGVwZW5kaW5nIG9uIHRoZSB0eXBlIG9mIHByb2xvZ3VlLgorZGVmIGludF9sb2NhbGFkZHJlc3MgOiBJbnRyaW5zaWM8W2xsdm1fcHRyX3R5XSwgW10sIFtJbnRyTm9NZW1dPjsKKworLy8gRXNjYXBlcyBsb2NhbCB2YXJpYWJsZXMgdG8gYWxsb3cgYWNjZXNzIGZyb20gb3RoZXIgZnVuY3Rpb25zLgorZGVmIGludF9sb2NhbGVzY2FwZSA6IEludHJpbnNpYzxbXSwgW2xsdm1fdmFyYXJnX3R5XT47CisKKy8vIEdpdmVuIGEgZnVuY3Rpb24gYW5kIHRoZSBsb2NhbGFkZHJlc3Mgb2YgYSBwYXJlbnQgZnJhbWUsIHJldHVybnMgYSBwb2ludGVyCisvLyB0byBhbiBlc2NhcGVkIGFsbG9jYXRpb24gaW5kaWNhdGVkIGJ5IHRoZSBpbmRleC4KK2RlZiBpbnRfbG9jYWxyZWNvdmVyIDogSW50cmluc2ljPFtsbHZtX3B0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fcHRyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLyBOb3RlOiB3ZSB0cmVhdCBzdGFja3NhdmUvc3RhY2tyZXN0b3JlIGFzIHdyaXRlbWVtIGJlY2F1c2Ugd2UgZG9uJ3Qgb3RoZXJ3aXNlCisvLyBtb2RlbCB0aGVpciBkZXBlbmRlbmNpZXMgb24gYWxsb2Nhcy4KK2RlZiBpbnRfc3RhY2tzYXZlICAgICA6IEludHJpbnNpYzxbbGx2bV9wdHJfdHldPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zdGFja19zYXZlIj47CitkZWYgaW50X3N0YWNrcmVzdG9yZSAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX3N0YWNrX3Jlc3RvcmUiPjsKKworZGVmIGludF9nZXRfZHluYW1pY19hcmVhX29mZnNldCA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldPjsKKworZGVmIGludF90aHJlYWRfcG9pbnRlciA6IEludHJpbnNpYzxbbGx2bV9wdHJfdHldLCBbXSwgW0ludHJOb01lbV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl90aHJlYWRfcG9pbnRlciI+OworCisvLyBJbnRySW5hY2Nlc3NpYmxlTWVtT3JBcmdNZW1Pbmx5IGlzIGEgbGl0dGxlIG1vcmUgcGVzc2ltaXN0aWMgdGhhbiBzdHJpY3RseQorLy8gbmVjZXNzYXJ5IGZvciBwcmVmZXRjaCwgaG93ZXZlciBpdCBkb2VzIGNvbnZlbmllbnRseSBwcmV2ZW50IHRoZSBwcmVmZXRjaAorLy8gZnJvbSBiZWluZyByZW9yZGVyZWQgb3Zlcmx5IG11Y2ggd2l0aCByZXNwZWN0IHRvIG5lYXJieSBhY2Nlc3MgdG8gdGhlIHNhbWUKKy8vIG1lbW9yeSB3aGlsZSBub3QgaW1wZWRpbmcgb3B0aW1pemF0aW9uLgorZGVmIGludF9wcmVmZXRjaAorICAgIDogSW50cmluc2ljPFtdLCBbIGxsdm1fcHRyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5IF0sCisgICAgICAgICAgICAgICAgWyBJbnRySW5hY2Nlc3NpYmxlTWVtT3JBcmdNZW1Pbmx5LCBSZWFkT25seTwwPiwgTm9DYXB0dXJlPDA+IF0+OworZGVmIGludF9wY21hcmtlciAgICAgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHldPjsKKworZGVmIGludF9yZWFkY3ljbGVjb3VudGVyIDogSW50cmluc2ljPFtsbHZtX2k2NF90eV0+OworCisvLyBUaGUgYXNzdW1lIGludHJpbnNpYyBpcyBtYXJrZWQgYXMgYXJiaXRyYXJpbHkgd3JpdGluZyBzbyB0aGF0IHByb3BlcgorLy8gY29udHJvbCBkZXBlbmRlbmNpZXMgd2lsbCBiZSBtYWludGFpbmVkLgorZGVmIGludF9hc3N1bWUgICAgICAgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pMV90eV0sIFtdPjsKKworLy8gU3RhY2sgUHJvdGVjdG9yIEludHJpbnNpYyAtIFRoZSBzdGFja3Byb3RlY3RvciBpbnRyaW5zaWMgd3JpdGVzIHRoZSBzdGFjaworLy8gZ3VhcmQgdG8gdGhlIGNvcnJlY3QgcGxhY2Ugb24gdGhlIHN0YWNrIGZyYW1lLgorZGVmIGludF9zdGFja3Byb3RlY3RvciA6IEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3B0cnB0cl90eV0sIFtdPjsKK2RlZiBpbnRfc3RhY2tndWFyZCA6IEludHJpbnNpYzxbbGx2bV9wdHJfdHldLCBbXSwgW10+OworCisvLyBBIGNvdW50ZXIgaW5jcmVtZW50IGZvciBpbnN0cnVtZW50YXRpb24gYmFzZWQgcHJvZmlsaW5nLgorZGVmIGludF9pbnN0cnByb2ZfaW5jcmVtZW50IDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10+OworCisvLyBBIGNvdW50ZXIgaW5jcmVtZW50IHdpdGggc3RlcCBmb3IgaW5zdHJ1bWVudGF0aW9uIGJhc2VkIHByb2ZpbGluZy4KK2RlZiBpbnRfaW5zdHJwcm9mX2luY3JlbWVudF9zdGVwIDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdPjsKKworLy8gQSBjYWxsIHRvIHByb2ZpbGUgcnVudGltZSBmb3IgdmFsdWUgcHJvZmlsaW5nIG9mIHRhcmdldCBleHByZXNzaW9ucworLy8gdGhyb3VnaCBpbnN0cnVtZW50YXRpb24gYmFzZWQgcHJvZmlsaW5nLgorZGVmIGludF9pbnN0cnByb2ZfdmFsdWVfcHJvZmlsZSA6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2k2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0gU3RhbmRhcmQgQyBMaWJyYXJ5IEludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKworZGVmIGludF9tZW1jcHkgIDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHksIGxsdm1fYW55cHRyX3R5LCBsbHZtX2FueWludF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTFfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+LCBOb0NhcHR1cmU8MT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRlT25seTwwPiwgUmVhZE9ubHk8MT5dPjsKK2RlZiBpbnRfbWVtbW92ZSA6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHksIGxsdm1fYW55cHRyX3R5LCBsbHZtX2FueWludF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8MD4sIE5vQ2FwdHVyZTwxPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVhZE9ubHk8MT5dPjsKK2RlZiBpbnRfbWVtc2V0ICA6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHksIGxsdm1faThfdHksIGxsdm1fYW55aW50X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kxX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwwPiwgV3JpdGVPbmx5PDA+XT47CisKKy8vIEZJWE1FOiBBZGQgdmVyc2lvbiBvZiB0aGVzZSBmbG9hdGluZyBwb2ludCBpbnRyaW5zaWNzIHdoaWNoIGFsbG93IG5vbi1kZWZhdWx0CisvLyByb3VuZGluZyBtb2RlcyBhbmQgRlAgZXhjZXB0aW9uIGhhbmRsaW5nLgorCitsZXQgSW50clByb3BlcnRpZXMgPSBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXSBpbiB7CisgIGRlZiBpbnRfZm1hICA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+XT47CisgIGRlZiBpbnRfZm11bGFkZCA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+XT47CisKKyAgLy8gVGhlc2UgZnVuY3Rpb25zIGRvIG5vdCByZWFkIG1lbW9yeSwgYnV0IGFyZSBzZW5zaXRpdmUgdG8gdGhlCisgIC8vIHJvdW5kaW5nIG1vZGUuIExMVk0gcHVycG9zZWx5IGRvZXMgbm90IG1vZGVsIGNoYW5nZXMgdG8gdGhlIEZQCisgIC8vIGVudmlyb25tZW50IHNvIHRoZXkgY2FuIGJlIHRyZWF0ZWQgYXMgcmVhZG5vbmUuCisgIGRlZiBpbnRfc3FydCA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XT47CisgIGRlZiBpbnRfcG93aSA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX2kzMl90eV0+OworICBkZWYgaW50X3NpbiAgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0+OworICBkZWYgaW50X2NvcyAgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0+OworICBkZWYgaW50X3BvdyAgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dPjsKKyAgZGVmIGludF9sb2cgIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dPjsKKyAgZGVmIGludF9sb2cxMDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dPjsKKyAgZGVmIGludF9sb2cyIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dPjsKKyAgZGVmIGludF9leHAgIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dPjsKKyAgZGVmIGludF9leHAyIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dPjsKKyAgZGVmIGludF9mYWJzIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dPjsKKyAgZGVmIGludF9jb3B5c2lnbiA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dPjsKKyAgZGVmIGludF9mbG9vciA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XT47CisgIGRlZiBpbnRfY2VpbCAgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0+OworICBkZWYgaW50X3RydW5jIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dPjsKKyAgZGVmIGludF9yaW50ICA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XT47CisgIGRlZiBpbnRfbmVhcmJ5aW50IDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dPjsKKyAgZGVmIGludF9yb3VuZCA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XT47CisgIGRlZiBpbnRfY2Fub25pY2FsaXplIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKK2RlZiBpbnRfbWlubnVtIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwKKyAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlLCBDb21tdXRhdGl2ZV0KKz47CitkZWYgaW50X21heG51bSA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sCisgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZSwgQ29tbXV0YXRpdmVdCis+OworCisvLyBOT1RFOiB0aGVzZSBhcmUgaW50ZXJuYWwgaW50ZXJmYWNlcy4KK2RlZiBpbnRfc2V0am1wICAgICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCAgW2xsdm1fcHRyX3R5XT47CitkZWYgaW50X2xvbmdqbXAgICAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vUmV0dXJuXT47CitkZWYgaW50X3NpZ3NldGptcCAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSAsIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHldPjsKK2RlZiBpbnRfc2lnbG9uZ2ptcCA6IEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9SZXR1cm5dPjsKKworLy8gSW50ZXJuYWwgaW50ZXJmYWNlIGZvciBvYmplY3Qgc2l6ZSBjaGVja2luZworZGVmIGludF9vYmplY3RzaXplIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55cHRyX3R5LCBsbHZtX2kxX3R5LCBsbHZtX2kxX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX29iamVjdF9zaXplIj47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tIENvbnN0cmFpbmVkIEZsb2F0aW5nIFBvaW50IEludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworCitsZXQgSW50clByb3BlcnRpZXMgPSBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHldIGluIHsKKyAgZGVmIGludF9leHBlcmltZW50YWxfY29uc3RyYWluZWRfZmFkZCA6IEludHJpbnNpYzxbIGxsdm1fYW55ZmxvYXRfdHkgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHkgXT47CisgIGRlZiBpbnRfZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2ZzdWIgOiBJbnRyaW5zaWM8WyBsbHZtX2FueWZsb2F0X3R5IF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5IF0+OworICBkZWYgaW50X2V4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9mbXVsIDogSW50cmluc2ljPFsgbGx2bV9hbnlmbG9hdF90eSBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSBdPjsKKyAgZGVmIGludF9leHBlcmltZW50YWxfY29uc3RyYWluZWRfZmRpdiA6IEludHJpbnNpYzxbIGxsdm1fYW55ZmxvYXRfdHkgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHkgXT47CisgIGRlZiBpbnRfZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2ZyZW0gOiBJbnRyaW5zaWM8WyBsbHZtX2FueWZsb2F0X3R5IF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5IF0+OworCisgIGRlZiBpbnRfZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2ZtYSA6IEludHJpbnNpYzxbIGxsdm1fYW55ZmxvYXRfdHkgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5IF0+OworCisgIC8vIFRoZXNlIGludHJpbnNpY3MgYXJlIHNlbnNpdGl2ZSB0byB0aGUgcm91bmRpbmcgbW9kZSBzbyB3ZSBuZWVkIGNvbnN0cmFpbmVkCisgIC8vIHZlcnNpb25zIG9mIGVhY2ggb2YgdGhlbS4gIFdoZW4gc3RyaWN0IHJvdW5kaW5nIGFuZCBleGNlcHRpb24gY29udHJvbCBhcmUKKyAgLy8gbm90IHJlcXVpcmVkIHRoZSBub24tY29uc3RyYWluZWQgdmVyc2lvbnMgb2YgdGhlc2UgaW50cmluc2ljcyBzaG91bGQgYmUKKyAgLy8gdXNlZC4KKyAgZGVmIGludF9leHBlcmltZW50YWxfY29uc3RyYWluZWRfc3FydCA6IEludHJpbnNpYzxbIGxsdm1fYW55ZmxvYXRfdHkgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSBdPjsKKyAgZGVmIGludF9leHBlcmltZW50YWxfY29uc3RyYWluZWRfcG93aSA6IEludHJpbnNpYzxbIGxsdm1fYW55ZmxvYXRfdHkgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5IF0+OworICBkZWYgaW50X2V4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9zaW4gIDogSW50cmluc2ljPFsgbGx2bV9hbnlmbG9hdF90eSBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5IF0+OworICBkZWYgaW50X2V4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9jb3MgIDogSW50cmluc2ljPFsgbGx2bV9hbnlmbG9hdF90eSBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5IF0+OworICBkZWYgaW50X2V4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9wb3cgIDogSW50cmluc2ljPFsgbGx2bV9hbnlmbG9hdF90eSBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSBdPjsKKyAgZGVmIGludF9leHBlcmltZW50YWxfY29uc3RyYWluZWRfbG9nICA6IEludHJpbnNpYzxbIGxsdm1fYW55ZmxvYXRfdHkgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSBdPjsKKyAgZGVmIGludF9leHBlcmltZW50YWxfY29uc3RyYWluZWRfbG9nMTA6IEludHJpbnNpYzxbIGxsdm1fYW55ZmxvYXRfdHkgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSBdPjsKKyAgZGVmIGludF9leHBlcmltZW50YWxfY29uc3RyYWluZWRfbG9nMiA6IEludHJpbnNpYzxbIGxsdm1fYW55ZmxvYXRfdHkgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSBdPjsKKyAgZGVmIGludF9leHBlcmltZW50YWxfY29uc3RyYWluZWRfZXhwICA6IEludHJpbnNpYzxbIGxsdm1fYW55ZmxvYXRfdHkgXSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHkgXT47CisgIGRlZiBpbnRfZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX2V4cDIgOiBJbnRyaW5zaWM8WyBsbHZtX2FueWZsb2F0X3R5IF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHkgXT47CisgIGRlZiBpbnRfZXhwZXJpbWVudGFsX2NvbnN0cmFpbmVkX3JpbnQgIDogSW50cmluc2ljPFsgbGx2bV9hbnlmbG9hdF90eSBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5IF0+OworICBkZWYgaW50X2V4cGVyaW1lbnRhbF9jb25zdHJhaW5lZF9uZWFyYnlpbnQgOiBJbnRyaW5zaWM8WyBsbHZtX2FueWZsb2F0X3R5IF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHkgXT47Cit9CisvLyBGSVhNRTogQWRkIGludHJpbnNpY3MgZm9yIGZjbXAsIGZwdHJ1bmMsIGZwZXh0LCBmcHRvdWkgYW5kIGZwdG9zaS4KKy8vIEZJWE1FOiBBZGQgaW50cmluc2ljcyBmb3IgZmFicywgY29weXNpZ24sIGZsb29yLCBjZWlsLCB0cnVuYyBhbmQgcm91bmQ/CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEV4cGVjdCBJbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCitkZWYgaW50X2V4cGVjdCA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLCBbTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+XSwgW0ludHJOb01lbV0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJpdCBNYW5pcHVsYXRpb24gSW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKworLy8gTm9uZSBvZiB0aGVzZSBpbnRyaW5zaWNzIGFjY2Vzc2VzIG1lbW9yeSBhdCBhbGwuCitsZXQgSW50clByb3BlcnRpZXMgPSBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXSBpbiB7CisgIGRlZiBpbnRfYnN3YXA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0+OworICBkZWYgaW50X2N0cG9wOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dPjsKKyAgZGVmIGludF9jdGx6IDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX2kxX3R5XT47CisgIGRlZiBpbnRfY3R0eiA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLCBbTExWTU1hdGNoVHlwZTwwPiwgbGx2bV9pMV90eV0+OworICBkZWYgaW50X2JpdHJldmVyc2UgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRGVidWdnZXIgSW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisKKy8vIE5vbmUgb2YgdGhlc2UgaW50cmluc2ljcyBhY2Nlc3NlcyBtZW1vcnkgYXQgYWxsLi4uYnV0IHRoYXQgZG9lc24ndAorLy8gbWVhbiB0aGUgb3B0aW1pemVycyBjYW4gY2hhbmdlIHRoZW0gYWdncmVzc2l2ZWx5LiAgU3BlY2lhbCBoYW5kbGluZworLy8gbmVlZGVkIGluIGEgZmV3IHBsYWNlcy4gVGhlc2Ugc3ludGhldGljIGludHJpbnNpY3MgaGF2ZSBubworLy8gc2lkZS1lZmZlY3RzIGFuZCBqdXN0IG1hcmsgaW5mb3JtYXRpb24gYWJvdXQgdGhlaXIgb3BlcmFuZHMuCitsZXQgSW50clByb3BlcnRpZXMgPSBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXSBpbiB7CisgIGRlZiBpbnRfZGJnX2RlY2xhcmUgICAgICA6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX21ldGFkYXRhX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eV0+OworICBkZWYgaW50X2RiZ192YWx1ZSAgICAgICAgOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9tZXRhZGF0YV90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fbWV0YWRhdGFfdHldPjsKKyAgZGVmIGludF9kYmdfYWRkciAgICAgICAgIDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fbWV0YWRhdGFfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9tZXRhZGF0YV90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX21ldGFkYXRhX3R5XT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tIEV4Y2VwdGlvbiBIYW5kbGluZyBJbnRyaW5zaWNzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworCisvLyBUaGUgcmVzdWx0IG9mIGVoLnR5cGVpZC5mb3IgZGVwZW5kcyBvbiB0aGUgZW5jbG9zaW5nIGZ1bmN0aW9uLCBidXQgaW5zaWRlIGEKKy8vIGdpdmVuIGZ1bmN0aW9uIGl0IGlzICdjb25zdCcgYW5kIG1heSBiZSBDU0UnZCBldGMuCitkZWYgaW50X2VoX3R5cGVpZF9mb3IgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X2VoX3JldHVybl9pMzIgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eSwgbGx2bV9wdHJfdHldPjsKK2RlZiBpbnRfZWhfcmV0dXJuX2k2NCA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX3B0cl90eV0+OworCisvLyBlaC5leGNlcHRpb25wb2ludGVyIHJldHVybnMgdGhlIHBvaW50ZXIgdG8gdGhlIGV4Y2VwdGlvbiBjYXVnaHQgYnkKKy8vIHRoZSBnaXZlbiBgY2F0Y2hwYWRgLgorZGVmIGludF9laF9leGNlcHRpb25wb2ludGVyIDogSW50cmluc2ljPFtsbHZtX2FueXB0cl90eV0sIFtsbHZtX3Rva2VuX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vIEdldHMgdGhlIGV4Y2VwdGlvbiBjb2RlIGZyb20gYSBjYXRjaHBhZCB0b2tlbi4gT25seSB1c2VkIG9uIHNvbWUgcGxhdGZvcm1zLgorZGVmIGludF9laF9leGNlcHRpb25jb2RlIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Rva2VuX3R5XSwgW0ludHJOb01lbV0+OworCisvLyBfX2J1aWx0aW5fdW53aW5kX2luaXQgaXMgYW4gdW5kb2N1bWVudGVkIEdDQyBpbnRyaW5zaWMgdGhhdCBjYXVzZXMgYWxsCisvLyBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzIHRvIGJlIHNhdmVkIGFuZCByZXN0b3JlZCAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkKKy8vIGFyZSB1c2VkKSBpbiB0aGUgY2FsbGluZyBmdW5jdGlvbi4gSXQgaXMgdXNlZCBieSBsaWJnY2NfZWguCitkZWYgaW50X2VoX3Vud2luZF9pbml0OiBJbnRyaW5zaWM8W10+LAorICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX3Vud2luZF9pbml0Ij47CisKK2RlZiBpbnRfZWhfZHdhcmZfY2ZhICA6IEludHJpbnNpYzxbbGx2bV9wdHJfdHldLCBbbGx2bV9pMzJfdHldPjsKKworbGV0IEludHJQcm9wZXJ0aWVzID0gW0ludHJOb01lbV0gaW4geworICBkZWYgaW50X2VoX3NqbGpfbHNkYSAgICAgICAgICAgICA6IEludHJpbnNpYzxbbGx2bV9wdHJfdHldPjsKKyAgZGVmIGludF9laF9zamxqX2NhbGxzaXRlICAgICAgICAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0+OworfQorZGVmIGludF9laF9zamxqX2Z1bmN0aW9uY29udGV4dCA6IEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XT47CitkZWYgaW50X2VoX3NqbGpfc2V0am1wICAgICAgICAgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3B0cl90eV0+OworZGVmIGludF9laF9zamxqX2xvbmdqbXAgICAgICAgICA6IEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW0ludHJOb1JldHVybl0+OworZGVmIGludF9laF9zamxqX3NldHVwX2Rpc3BhdGNoICA6IEludHJpbnNpYzxbXSwgW10+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0gR2VuZXJpYyBWYXJpYWJsZSBBdHRyaWJ1dGUgSW50cmluc2ljcy0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KK2RlZiBpbnRfdmFyX2Fubm90YXRpb24gOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9wdHJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgImxsdm0udmFyLmFubm90YXRpb24iPjsKK2RlZiBpbnRfcHRyX2Fubm90YXRpb24gOiBJbnRyaW5zaWM8W0xMVk1BbnlQb2ludGVyVHlwZTxsbHZtX2FueWludF90eT5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgbGx2bV9wdHJfdHksIGxsdm1fcHRyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgImxsdm0ucHRyLmFubm90YXRpb24iPjsKK2RlZiBpbnRfYW5ub3RhdGlvbiA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX3B0cl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgImxsdm0uYW5ub3RhdGlvbiI+OworCisvLyBBbm5vdGF0ZXMgdGhlIGN1cnJlbnQgcHJvZ3JhbSBwb2ludCB3aXRoIG1ldGFkYXRhIHN0cmluZ3Mgd2hpY2ggYXJlIGVtaXR0ZWQKKy8vIGFzIENvZGVWaWV3IGRlYnVnIGluZm8gcmVjb3Jkcy4gVGhpcyBpcyBleHBlbnNpdmUsIGFzIGl0IGRpc2FibGVzIGlubGluaW5nCisvLyBhbmQgaXMgbW9kZWxsZWQgYXMgaGF2aW5nIHNpZGUgZWZmZWN0cy4KK2RlZiBpbnRfY29kZXZpZXdfYW5ub3RhdGlvbiA6IEludHJpbnNpYzxbXSwgW2xsdm1fbWV0YWRhdGFfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRySW5hY2Nlc3NpYmxlTWVtT25seSwgSW50ck5vRHVwbGljYXRlXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGx2bS5jb2Rldmlldy5hbm5vdGF0aW9uIj47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFRyYW1wb2xpbmUgSW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworZGVmIGludF9pbml0X3RyYW1wb2xpbmUgOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3B0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwwPl0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faW5pdF90cmFtcG9saW5lIj47CisKK2RlZiBpbnRfYWRqdXN0X3RyYW1wb2xpbmUgOiBJbnRyaW5zaWM8W2xsdm1fcHRyX3R5XSwgW2xsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hZGp1c3RfdHJhbXBvbGluZSI+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBPdmVyZmxvdyBJbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKworLy8gRXhwb3NlIHRoZSBjYXJyeSBmbGFnIGZyb20gYWRkIG9wZXJhdGlvbnMgb24gdHdvIGludGVncmFscy4KK2RlZiBpbnRfc2FkZF93aXRoX292ZXJmbG93IDogSW50cmluc2ljPFtsbHZtX2FueWludF90eSwgbGx2bV9pMV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXT47CitkZWYgaW50X3VhZGRfd2l0aF9vdmVyZmxvdyA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHksIGxsdm1faTFfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0+OworCitkZWYgaW50X3NzdWJfd2l0aF9vdmVyZmxvdyA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHksIGxsdm1faTFfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0+OworZGVmIGludF91c3ViX3dpdGhfb3ZlcmZsb3cgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5LCBsbHZtX2kxX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdPjsKKworZGVmIGludF9zbXVsX3dpdGhfb3ZlcmZsb3cgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5LCBsbHZtX2kxX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdPjsKK2RlZiBpbnRfdW11bF93aXRoX292ZXJmbG93IDogSW50cmluc2ljPFtsbHZtX2FueWludF90eSwgbGx2bV9pMV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBNZW1vcnkgVXNlIE1hcmtlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworZGVmIGludF9saWZldGltZV9zdGFydCAgOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDE+XT47CitkZWYgaW50X2xpZmV0aW1lX2VuZCAgICA6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8MT5dPjsKK2RlZiBpbnRfaW52YXJpYW50X3N0YXJ0IDogSW50cmluc2ljPFtsbHZtX2Rlc2NyaXB0b3JfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwxPl0+OworZGVmIGludF9pbnZhcmlhbnRfZW5kICAgOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9kZXNjcmlwdG9yX3R5LCBsbHZtX2k2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwyPl0+OworCisvLyBpbnZhcmlhbnQuZ3JvdXAuYmFycmllciBjYW4ndCBiZSBtYXJrZWQgd2l0aCAncmVhZG5vbmUnIChJbnRyTm9NZW0pLAorLy8gYmVjYXVzZSBpdCB3b3VsZCBjYXVzZSBDU0Ugb2YgdHdvIGJhcnJpZXJzIHdpdGggdGhlIHNhbWUgYXJndW1lbnQuCisvLyBSZWFkb25seSBhbmQgYXJnbWVtb25seSBzYXlzIHRoYXQgYmFycmllciBvbmx5IHJlYWRzIGl0cyBhcmd1bWVudCBhbmQKKy8vIGl0IGNhbiBiZSBDU0Ugb25seSBpZiBtZW1vcnkgZGlkbid0IGNoYW5nZSBiZXR3ZWVuIDIgYmFycmllcnMgY2FsbCwKKy8vIHdoaWNoIGlzIHZhbGlkLgorLy8gVGhlIGFyZ3VtZW50IGFsc28gY2FuJ3QgYmUgbWFya2VkIHdpdGggJ3JldHVybmVkJyBhdHRyaWJ1dGUsIGJlY2F1c2UKKy8vIGl0IHdvdWxkIHJlbW92ZSBiYXJyaWVyLgorZGVmIGludF9pbnZhcmlhbnRfZ3JvdXBfYmFycmllciA6IEludHJpbnNpYzxbbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gU3RhY2ttYXAgSW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCitkZWYgaW50X2V4cGVyaW1lbnRhbF9zdGFja21hcCA6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX3ZhcmFyZ190eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1Rocm93c10+OworZGVmIGludF9leHBlcmltZW50YWxfcGF0Y2hwb2ludF92b2lkIDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fcHRyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92YXJhcmdfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbVGhyb3dzXT47CitkZWYgaW50X2V4cGVyaW1lbnRhbF9wYXRjaHBvaW50X2k2NCA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92YXJhcmdfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtUaHJvd3NdPjsKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBHYXJiYWdlIENvbGxlY3Rpb24gSW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGhlc2UgYXJlIGRvY3VtZW50ZWQgaW4gZG9jcy9TdGF0ZXBvaW50LnJzdAorCitkZWYgaW50X2V4cGVyaW1lbnRhbF9nY19zdGF0ZXBvaW50IDogSW50cmluc2ljPFtsbHZtX3Rva2VuX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2FueXB0cl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX3ZhcmFyZ190eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtUaHJvd3NdPjsKKworZGVmIGludF9leHBlcmltZW50YWxfZ2NfcmVzdWx0ICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55X3R5XSwgW2xsdm1fdG9rZW5fdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtXT47CitkZWYgaW50X2V4cGVyaW1lbnRhbF9nY19yZWxvY2F0ZSA6IEludHJpbnNpYzxbbGx2bV9hbnlfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV90b2tlbl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENvcm91dGluZSBJbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUaGVzZSBhcmUgZG9jdW1lbnRlZCBpbiBkb2NzL0Nvcm91dGluZXMucnN0CisKKy8vIENvcm91dGluZSBTdHJ1Y3R1cmUgSW50cmluc2ljcy4KKworZGVmIGludF9jb3JvX2lkIDogSW50cmluc2ljPFtsbHZtX3Rva2VuX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX3B0cl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9wdHJfdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHksIEludHJSZWFkTWVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWFkTm9uZTwxPiwgUmVhZE9ubHk8Mj4sIE5vQ2FwdHVyZTwyPl0+OworZGVmIGludF9jb3JvX2FsbG9jIDogSW50cmluc2ljPFtsbHZtX2kxX3R5XSwgW2xsdm1fdG9rZW5fdHldLCBbXT47CitkZWYgaW50X2Nvcm9fYmVnaW4gOiBJbnRyaW5zaWM8W2xsdm1fcHRyX3R5XSwgW2xsdm1fdG9rZW5fdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbV3JpdGVPbmx5PDE+XT47CisKK2RlZiBpbnRfY29yb19mcmVlIDogSW50cmluc2ljPFtsbHZtX3B0cl90eV0sIFtsbHZtX3Rva2VuX3R5LCBsbHZtX3B0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5LCBSZWFkT25seTwxPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb0NhcHR1cmU8MT5dPjsKK2RlZiBpbnRfY29yb19lbmQgOiBJbnRyaW5zaWM8W2xsdm1faTFfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1faTFfdHldLCBbXT47CisKK2RlZiBpbnRfY29yb19mcmFtZSA6IEludHJpbnNpYzxbbGx2bV9wdHJfdHldLCBbXSwgW0ludHJOb01lbV0+OworZGVmIGludF9jb3JvX3NpemUgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwgW10sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9jb3JvX3NhdmUgOiBJbnRyaW5zaWM8W2xsdm1fdG9rZW5fdHldLCBbbGx2bV9wdHJfdHldLCBbXT47CitkZWYgaW50X2Nvcm9fc3VzcGVuZCA6IEludHJpbnNpYzxbbGx2bV9pOF90eV0sIFtsbHZtX3Rva2VuX3R5LCBsbHZtX2kxX3R5XSwgW10+OworCitkZWYgaW50X2Nvcm9fcGFyYW0gOiBJbnRyaW5zaWM8W2xsdm1faTFfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBSZWFkTm9uZTwwPiwgUmVhZE5vbmU8MT5dPjsKKworLy8gQ29yb3V0aW5lIE1hbmlwdWxhdGlvbiBJbnRyaW5zaWNzLgorCitkZWYgaW50X2Nvcm9fcmVzdW1lIDogSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLCBbVGhyb3dzXT47CitkZWYgaW50X2Nvcm9fZGVzdHJveSA6IEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW1Rocm93c10+OworZGVmIGludF9jb3JvX2RvbmUgOiBJbnRyaW5zaWM8W2xsdm1faTFfdHldLCBbbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5LCBSZWFkT25seTwwPiwgTm9DYXB0dXJlPDA+XT47CitkZWYgaW50X2Nvcm9fcHJvbWlzZSA6IEludHJpbnNpYzxbbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBOb0NhcHR1cmU8MD5dPjsKKworLy8gQ29yb3V0aW5lIExvd2VyaW5nIEludHJpbnNpY3MuIFVzZWQgaW50ZXJuYWxseSBieSBjb3JvdXRpbmUgcGFzc2VzLgorCitkZWYgaW50X2Nvcm9fc3ViZm5fYWRkciA6IEludHJpbnNpYzxbbGx2bV9wdHJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seSwgUmVhZE9ubHk8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9DYXB0dXJlPDA+XT47CisKKy8vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE90aGVyIEludHJpbnNpY3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KK2RlZiBpbnRfZmx0X3JvdW5kcyA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldPiwKKyAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9mbHRfcm91bmRzIj47CitkZWYgaW50X3RyYXAgOiBJbnRyaW5zaWM8W10sIFtdLCBbSW50ck5vUmV0dXJuXT4sCisgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fdHJhcCI+OworZGVmIGludF9kZWJ1Z3RyYXAgOiBJbnRyaW5zaWM8W10+LAorICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fZGVidWd0cmFwIj47CisKKy8vIFN1cHBvcnQgZm9yIGR5bmFtaWMgZGVvcHRpbWl6YXRpb24gKG9yIGRlLXNwZWNpYWxpemF0aW9uKQorZGVmIGludF9leHBlcmltZW50YWxfZGVvcHRpbWl6ZSA6IEludHJpbnNpYzxbbGx2bV9hbnlfdHldLCBbbGx2bV92YXJhcmdfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbVGhyb3dzXT47CisKKy8vIFN1cHBvcnQgZm9yIHNwZWN1bGF0aXZlIHJ1bnRpbWUgZ3VhcmRzCitkZWYgaW50X2V4cGVyaW1lbnRhbF9ndWFyZCA6IEludHJpbnNpYzxbXSwgW2xsdm1faTFfdHksIGxsdm1fdmFyYXJnX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtUaHJvd3NdPjsKKworLy8gTk9QOiBjYWxscy9pbnZva2VzIHRvIHRoaXMgaW50cmluc2ljIGFyZSByZW1vdmVkIGJ5IGNvZGVnZW4KK2RlZiBpbnRfZG9ub3RoaW5nIDogSW50cmluc2ljPFtdLCBbXSwgW0ludHJOb01lbV0+OworCisvLyBUaGlzIGluc3RydWN0aW9uIGhhcyBubyBhY3R1YWwgZWZmZWN0LCB0aG91Z2ggaXQgaXMgdHJlYXRlZCBieSB0aGUgb3B0aW1pemVyCisvLyBoYXMgaGF2aW5nIG9wYXF1ZSBzaWRlIGVmZmVjdHMuIFRoaXMgbWF5IGJlIGluc2VydGVkIGludG8gbG9vcHMgdG8gZW5zdXJlCisvLyB0aGF0IHRoZXkgYXJlIG5vdCByZW1vdmVkIGV2ZW4gaWYgdGhleSB0dXJuIG91dCB0byBiZSBlbXB0eSwgZm9yIGxhbmd1YWdlcworLy8gd2hpY2ggc3BlY2lmeSB0aGF0IGluZmluaXRlIGxvb3BzIG11c3QgYmUgcHJlc2VydmVkLgorZGVmIGludF9zaWRlZWZmZWN0IDogSW50cmluc2ljPFtdLCBbXSwgW0ludHJJbmFjY2Vzc2libGVNZW1Pbmx5XT47CisKKy8vIEludHJpc2ljcyB0byBzdXBwb3J0IGhhbGYgcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGZvcm1hdAorbGV0IEludHJQcm9wZXJ0aWVzID0gW0ludHJOb01lbV0gaW4geworZGVmIGludF9jb252ZXJ0X3RvX2ZwMTYgICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLCBbbGx2bV9hbnlmbG9hdF90eV0+OworZGVmIGludF9jb252ZXJ0X2Zyb21fZnAxNiA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtsbHZtX2kxNl90eV0+OworfQorCisvLyBDbGVhciBjYWNoZSBpbnRyaW5zaWMsIGRlZmF1bHQgdG8gaWdub3JlIChpZS4gZW1pdCBub3RoaW5nKQorLy8gbWFwcyB0byB2b2lkIF9fY2xlYXJfY2FjaGUoKSBvbiBzdXBwb3J0aW5nIHBsYXRmb3JtcworZGVmIGludF9jbGVhcl9jYWNoZSA6IEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3B0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdLCAibGx2bS5jbGVhcl9jYWNoZSI+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIE1hc2tlZCBJbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KK2RlZiBpbnRfbWFza2VkX3N0b3JlIDogSW50cmluc2ljPFtdLCBbbGx2bV9hbnl2ZWN0b3JfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1BbnlQb2ludGVyVHlwZTxMTFZNTWF0Y2hUeXBlPDA+PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WZWN0b3JTYW1lV2lkdGg8MCwgbGx2bV9pMV90eT5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKK2RlZiBpbnRfbWFza2VkX2xvYWQgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTExWTUFueVBvaW50ZXJUeXBlPExMVk1NYXRjaFR5cGU8MD4+LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmVjdG9yU2FtZVdpZHRoPDAsIGxsdm1faTFfdHk+LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworZGVmIGludF9tYXNrZWRfZ2F0aGVyOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNVmVjdG9yT2ZBbnlQb2ludGVyc1RvRWx0PDA+LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmVjdG9yU2FtZVdpZHRoPDAsIGxsdm1faTFfdHk+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtXT47CisKK2RlZiBpbnRfbWFza2VkX3NjYXR0ZXI6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnl2ZWN0b3JfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1WZWN0b3JPZkFueVBvaW50ZXJzVG9FbHQ8MD4sIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmVjdG9yU2FtZVdpZHRoPDAsIGxsdm1faTFfdHk+XT47CisKK2RlZiBpbnRfbWFza2VkX2V4cGFuZGxvYWQ6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNUG9pbnRlclRvRWx0PDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNVmVjdG9yU2FtZVdpZHRoPDAsIGxsdm1faTFfdHk+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRNZW1dPjsKKworZGVmIGludF9tYXNrZWRfY29tcHJlc3NzdG9yZTogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueXZlY3Rvcl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVBvaW50ZXJUb0VsdDwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVZlY3RvclNhbWVXaWR0aDwwLCBsbHZtX2kxX3R5Pl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKKy8vIFRlc3Qgd2hldGhlciBhIHBvaW50ZXIgaXMgYXNzb2NpYXRlZCB3aXRoIGEgdHlwZSBtZXRhZGF0YSBpZGVudGlmaWVyLgorZGVmIGludF90eXBlX3Rlc3QgOiBJbnRyaW5zaWM8W2xsdm1faTFfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1fbWV0YWRhdGFfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLyBTYWZlbHkgbG9hZHMgYSBmdW5jdGlvbiBwb2ludGVyIGZyb20gYSB2aXJ0dWFsIHRhYmxlIHBvaW50ZXIgdXNpbmcgdHlwZSBtZXRhZGF0YS4KK2RlZiBpbnRfdHlwZV9jaGVja2VkX2xvYWQgOiBJbnRyaW5zaWM8W2xsdm1fcHRyX3R5LCBsbHZtX2kxX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9tZXRhZGF0YV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8gQ3JlYXRlIGEgYnJhbmNoIGZ1bm5lbCB0aGF0IGltcGxlbWVudHMgYW4gaW5kaXJlY3QgY2FsbCB0byBhIGxpbWl0ZWQgc2V0IG9mCisvLyBjYWxsZWVzLiBUaGlzIG5lZWRzIHRvIGJlIGEgbXVzdHRhaWwgY2FsbC4KK2RlZiBpbnRfaWNhbGxfYnJhbmNoX2Z1bm5lbCA6IEludHJpbnNpYzxbXSwgW2xsdm1fdmFyYXJnX3R5XSwgW10+OworCitkZWYgaW50X2xvYWRfcmVsYXRpdmU6IEludHJpbnNpYzxbbGx2bV9wdHJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1fYW55aW50X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworLy8gWHJheSBpbnRyaW5zaWNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ3VzdG9tIGV2ZW50IGxvZ2dpbmcgZm9yIHgtcmF5LgorLy8gVGFrZXMgYSBwb2ludGVyIHRvIGEgc3RyaW5nIGFuZCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuCitkZWYgaW50X3hyYXlfY3VzdG9tZXZlbnQgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD4sIFJlYWRPbmx5PDA+LCBJbnRyV3JpdGVNZW1dPjsKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tIE1lbW9yeSBpbnRyaW5zaWNzIHdpdGggZWxlbWVudC13aXNlIGF0b21pY2l0eSBndWFyYW50ZWVzIC0tLS0tLT09PS8vCisvLworCisvLyBAbGx2bS5tZW1jcHkuZWxlbWVudC51bm9yZGVyZWQuYXRvbWljLiooZGVzdCwgc3JjLCBsZW5ndGgsIGVsZW1lbnRzaXplKQorZGVmIGludF9tZW1jcHlfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljCisgICAgOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgbGx2bV9hbnlwdHJfdHksIGxsdm1fYW55cHRyX3R5LCBsbHZtX2FueWludF90eSwgbGx2bV9pMzJfdHkKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgIEludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8MD4sIE5vQ2FwdHVyZTwxPiwgV3JpdGVPbmx5PDA+LAorICAgICAgICAgICAgICAgICAgUmVhZE9ubHk8MT4KKyAgICAgICAgICAgICAgICBdPjsKKworLy8gQGxsdm0ubWVtbW92ZS5lbGVtZW50LnVub3JkZXJlZC5hdG9taWMuKihkZXN0LCBzcmMsIGxlbmd0aCwgZWxlbWVudHNpemUpCitkZWYgaW50X21lbW1vdmVfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljCisgICAgOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgWworICAgICAgICAgICAgICAgICAgbGx2bV9hbnlwdHJfdHksIGxsdm1fYW55cHRyX3R5LCBsbHZtX2FueWludF90eSwgbGx2bV9pMzJfdHkKKyAgICAgICAgICAgICAgICBdLAorICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgIEludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8MD4sIE5vQ2FwdHVyZTwxPiwgV3JpdGVPbmx5PDA+LAorICAgICAgICAgICAgICAgICAgUmVhZE9ubHk8MT4KKyAgICAgICAgICAgICAgICBdPjsKKworLy8gQGxsdm0ubWVtc2V0LmVsZW1lbnQudW5vcmRlcmVkLmF0b21pYy4qKGRlc3QsIHZhbHVlLCBsZW5ndGgsIGVsZW1lbnRzaXplKQorZGVmIGludF9tZW1zZXRfZWxlbWVudF91bm9yZGVyZWRfYXRvbWljCisgICAgOiBJbnRyaW5zaWM8W10sIFsgbGx2bV9hbnlwdHJfdHksIGxsdm1faThfdHksIGxsdm1fYW55aW50X3R5LCBsbHZtX2kzMl90eSBdLAorICAgICAgICAgICAgICAgIFsgSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwwPiwgV3JpdGVPbmx5PDA+IF0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBSZWR1Y3Rpb24gSW50cmluc2ljcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KK2RlZiBpbnRfZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfZmFkZCA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55ZmxvYXRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2V4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX2ZtdWwgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueWZsb2F0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9leHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9hZGQgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2V4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX211bCA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfYW5kIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9leHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9vciA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2V4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX3hvciA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2Vfc21heCA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9leHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9zbWluIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2V4cGVyaW1lbnRhbF92ZWN0b3JfcmVkdWNlX3VtYXggOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfdW1pbiA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9leHBlcmltZW50YWxfdmVjdG9yX3JlZHVjZV9mbWF4IDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfZXhwZXJpbWVudGFsX3ZlY3Rvcl9yZWR1Y2VfZm1pbiA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vPT09LS0tLS0gSW50cmluc2ljcyB0aGF0IGFyZSB1c2VkIHRvIHByb3ZpZGUgcHJlZGljYXRlIGluZm9ybWF0aW9uIC0tLS0tPT09Ly8KKworZGVmIGludF9zc2FfY29weSA6IEludHJpbnNpYzxbbGx2bV9hbnlfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIFJldHVybmVkPDA+XT47CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGFyZ2V0LXNwZWNpZmljIGludHJpbnNpY3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljc1Bvd2VyUEMudGQiCitpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3NYODYudGQiCitpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3NBUk0udGQiCitpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3NBQXJjaDY0LnRkIgoraW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzWENvcmUudGQiCitpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3NIZXhhZ29uLnRkIgoraW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzTlZWTS50ZCIKK2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljc01pcHMudGQiCitpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3NBTURHUFUudGQiCitpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3NCUEYudGQiCitpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3NTeXN0ZW1aLnRkIgoraW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNzV2ViQXNzZW1ibHkudGQiCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NBQXJjaDY0LnRkIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzQUFyY2g2NC50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MDM0MTMzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzQUFyY2g2NC50ZApAQCAtMCwwICsxLDY1MiBAQAorLy89PT0tIEludHJpbnNpY3NBQVJDSDY0LnRkIC0gRGVmaW5lcyBBQVJDSDY0IGludHJpbnNpY3MgLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhbGwgb2YgdGhlIEFBUkNINjQtc3BlY2lmaWMgaW50cmluc2ljcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitsZXQgVGFyZ2V0UHJlZml4ID0gImFhcmNoNjQiIGluIHsKKworZGVmIGludF9hYXJjaDY0X2xkeHIgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fYW55cHRyX3R5XT47CitkZWYgaW50X2FhcmNoNjRfbGRheHIgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fYW55cHRyX3R5XT47CitkZWYgaW50X2FhcmNoNjRfc3R4ciA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1fYW55cHRyX3R5XT47CitkZWYgaW50X2FhcmNoNjRfc3RseHIgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2FueXB0cl90eV0+OworCitkZWYgaW50X2FhcmNoNjRfbGR4cCA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwgW2xsdm1fcHRyX3R5XT47CitkZWYgaW50X2FhcmNoNjRfbGRheHAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sIFtsbHZtX3B0cl90eV0+OworZGVmIGludF9hYXJjaDY0X3N0eHAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX3B0cl90eV0+OworZGVmIGludF9hYXJjaDY0X3N0bHhwIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fcHRyX3R5XT47CisKK2RlZiBpbnRfYWFyY2g2NF9jbHJleCA6IEludHJpbnNpYzxbXT47CisKK2RlZiBpbnRfYWFyY2g2NF9zZGl2IDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hYXJjaDY0X3VkaXYgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD5dLCBbSW50ck5vTWVtXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBISU5UCisKK2RlZiBpbnRfYWFyY2g2NF9oaW50IDogSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHldPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIERhdGEgQmFycmllciBJbnN0cnVjdGlvbnMKKworZGVmIGludF9hYXJjaDY0X2RtYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fZG1iIj4sIE1TQnVpbHRpbjwiX19kbWIiPiwgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHldPjsKK2RlZiBpbnRfYWFyY2g2NF9kc2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX2RzYiI+LCBNU0J1aWx0aW48Il9fZHNiIj4sIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XT47CitkZWYgaW50X2FhcmNoNjRfaXNiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9pc2IiPiwgTVNCdWlsdGluPCJfX2lzYiI+LCBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0+OworCit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBZHZhbmNlZCBTSU1EIChORU9OKQorCitsZXQgVGFyZ2V0UHJlZml4ID0gImFhcmNoNjQiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0uYWFyY2g2NC4iLgorICBjbGFzcyBBZHZTSU1EXzJTY2FsYXJfRmxvYXRfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGNsYXNzIEFkdlNJTURfRlBUb0ludFJvdW5kaW5nX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sIFtsbHZtX2FueWZsb2F0X3R5XSwgW0ludHJOb01lbV0+OworCisgIGNsYXNzIEFkdlNJTURfMUludEFyZ19JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0sIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF8xRmxvYXRBcmdfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0sIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF8xVmVjdG9yQXJnX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XSwgW0ludHJOb01lbV0+OworICBjbGFzcyBBZHZTSU1EXzFWZWN0b3JBcmdfRXhwYW5kX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sIFtsbHZtX2FueXZlY3Rvcl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF8xVmVjdG9yQXJnX0xvbmdfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwgW0xMVk1UcnVuY2F0ZWRUeXBlPDA+XSwgW0ludHJOb01lbV0+OworICBjbGFzcyBBZHZTSU1EXzFJbnRBcmdfTmFycm93X0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sIFtsbHZtX2FueWludF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF8xVmVjdG9yQXJnX05hcnJvd19JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLCBbTExWTUV4dGVuZGVkVHlwZTwwPl0sIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF8xVmVjdG9yQXJnX0ludF9BY3Jvc3NfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwgW2xsdm1fYW55dmVjdG9yX3R5XSwgW0ludHJOb01lbV0+OworICBjbGFzcyBBZHZTSU1EXzFWZWN0b3JBcmdfRmxvYXRfQWNyb3NzX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwgW2xsdm1fYW55dmVjdG9yX3R5XSwgW0ludHJOb01lbV0+OworCisgIGNsYXNzIEFkdlNJTURfMkludEFyZ19JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLCBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBjbGFzcyBBZHZTSU1EXzJGbG9hdEFyZ19JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfMlZlY3RvckFyZ19JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLCBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBjbGFzcyBBZHZTSU1EXzJWZWN0b3JBcmdfQ29tcGFyZV9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLCBbbGx2bV9hbnl2ZWN0b3JfdHksIExMVk1NYXRjaFR5cGU8MT5dLAorICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF8yQXJnX0Zsb2F0Q29tcGFyZV9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLCBbbGx2bV9hbnlmbG9hdF90eSwgTExWTU1hdGNoVHlwZTwxPl0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBjbGFzcyBBZHZTSU1EXzJWZWN0b3JBcmdfTG9uZ19JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgIFtMTFZNVHJ1bmNhdGVkVHlwZTwwPiwgTExWTVRydW5jYXRlZFR5cGU8MD5dLAorICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF8yVmVjdG9yQXJnX1dpZGVfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgTExWTVRydW5jYXRlZFR5cGU8MD5dLAorICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF8yVmVjdG9yQXJnX05hcnJvd19JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgIFtMTFZNRXh0ZW5kZWRUeXBlPDA+LCBMTFZNRXh0ZW5kZWRUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfMkFyZ19TY2FsYXJfTmFycm93X0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sCisgICAgICAgICAgICAgICAgW0xMVk1FeHRlbmRlZFR5cGU8MD4sIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfMlZlY3RvckFyZ19TY2FsYXJfRXhwYW5kX0J5U2l6ZV9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgIFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBjbGFzcyBBZHZTSU1EXzJWZWN0b3JBcmdfU2NhbGFyX1dpZGVfQnlTaXplX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgW0xMVk1UcnVuY2F0ZWRUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfMlZlY3RvckFyZ19TY2FsYXJfV2lkZV9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgIFtMTFZNVHJ1bmNhdGVkVHlwZTwwPiwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF8yVmVjdG9yQXJnX1RpZWRfTmFycm93X0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgW0xMVk1IYWxmRWxlbWVudHNWZWN0b3JUeXBlPDA+LCBsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGNsYXNzIEFkdlNJTURfM1ZlY3RvckFyZ19JbnRyaW5zaWMKKyAgICAgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfM1ZlY3RvckFyZ19TY2FsYXJfSW50cmluc2ljCisgICAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD4sIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF8zVmVjdG9yQXJnX1RpZWRfTmFycm93X0ludHJpbnNpYworICAgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgIFtMTFZNSGFsZkVsZW1lbnRzVmVjdG9yVHlwZTwwPiwgbGx2bV9hbnl2ZWN0b3JfdHksCisgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwxPl0sIFtJbnRyTm9NZW1dPjsKKyAgY2xhc3MgQWR2U0lNRF8zVmVjdG9yQXJnX1NjYWxhcl9UaWVkX05hcnJvd19JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgIFtMTFZNSGFsZkVsZW1lbnRzVmVjdG9yVHlwZTwwPiwgbGx2bV9hbnl2ZWN0b3JfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfQ3Z0RnhUb0ZQX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueWZsb2F0X3R5XSwgW2xsdm1fYW55aW50X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBjbGFzcyBBZHZTSU1EX0N2dEZQVG9GeF9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLCBbbGx2bV9hbnlmbG9hdF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBjbGFzcyBBZHZTSU1EXzFBcmdfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIEFyaXRobWV0aWMgb3BzCisKK2xldCBUYXJnZXRQcmVmaXggPSAiYWFyY2g2NCIsIEludHJQcm9wZXJ0aWVzID0gW0ludHJOb01lbV0gaW4geworICAvLyBWZWN0b3IgQWRkIEFjcm9zcyBMYW5lcworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zYWRkdiA6IEFkdlNJTURfMVZlY3RvckFyZ19JbnRfQWNyb3NzX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdWFkZHYgOiBBZHZTSU1EXzFWZWN0b3JBcmdfSW50X0Fjcm9zc19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZhZGR2IDogQWR2U0lNRF8xVmVjdG9yQXJnX0Zsb2F0X0Fjcm9zc19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIExvbmcgQWRkIEFjcm9zcyBMYW5lcworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zYWRkbHYgOiBBZHZTSU1EXzFWZWN0b3JBcmdfSW50X0Fjcm9zc19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3VhZGRsdiA6IEFkdlNJTURfMVZlY3RvckFyZ19JbnRfQWNyb3NzX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgSGFsdmluZyBBZGQKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc2hhZGQgOiBBZHZTSU1EXzJWZWN0b3JBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl91aGFkZCA6IEFkdlNJTURfMlZlY3RvckFyZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFJvdW5kaW5nIEhhbHZpbmcgQWRkCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3NyaGFkZCA6IEFkdlNJTURfMlZlY3RvckFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3VyaGFkZCA6IEFkdlNJTURfMlZlY3RvckFyZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFNhdHVyYXRpbmcgQWRkCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3NxYWRkIDogQWR2U0lNRF8ySW50QXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc3VxYWRkIDogQWR2U0lNRF8ySW50QXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdXNxYWRkIDogQWR2U0lNRF8ySW50QXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdXFhZGQgOiBBZHZTSU1EXzJJbnRBcmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBBZGQgSGlnaC1IYWxmCisgIC8vIEZJWE1FOiB0aGlzIGlzIGEgbGVnYWN5IGludHJpbnNpYyBmb3IgYWFyY2g2NF9zaW1kLmguIFJlbW92ZSBpdCB3aGVuIHRoYXQKKyAgLy8gaGVhZGVyIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2FkZGhuIDogQWR2U0lNRF8yVmVjdG9yQXJnX05hcnJvd19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFJvdW5kaW5nIEFkZCBIaWdoLUhhbGYKKyAgZGVmIGludF9hYXJjaDY0X25lb25fcmFkZGhuIDogQWR2U0lNRF8yVmVjdG9yQXJnX05hcnJvd19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFNhdHVyYXRpbmcgRG91YmxpbmcgTXVsdGlwbHkgSGlnaAorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zcWRtdWxoIDogQWR2U0lNRF8ySW50QXJnX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgU2F0dXJhdGluZyBSb3VuZGluZyBEb3VibGluZyBNdWx0aXBseSBIaWdoCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3NxcmRtdWxoIDogQWR2U0lNRF8ySW50QXJnX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgUG9seW5vbWluYWwgTXVsdGlwbHkKKyAgZGVmIGludF9hYXJjaDY0X25lb25fcG11bCA6IEFkdlNJTURfMlZlY3RvckFyZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIExvbmcgTXVsdGlwbHkKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc211bGwgOiBBZHZTSU1EXzJWZWN0b3JBcmdfTG9uZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3VtdWxsIDogQWR2U0lNRF8yVmVjdG9yQXJnX0xvbmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9wbXVsbCA6IEFkdlNJTURfMlZlY3RvckFyZ19Mb25nX0ludHJpbnNpYzsKKworICAvLyA2NC1iaXQgcG9seW5vbWlhbCBtdWx0aXBseSByZWFsbHkgcmV0dXJucyBhbiBpMTI4LCB3aGljaCBpcyBub3QgbGVnYWwuIEZha2UKKyAgLy8gaXQgd2l0aCBhIHYxNmk4LgorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9wbXVsbDY0IDoKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworICAvLyBWZWN0b3IgRXh0ZW5kaW5nIE11bHRpcGx5CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZtdWx4IDogQWR2U0lNRF8yRmxvYXRBcmdfSW50cmluc2ljIHsKKyAgICBsZXQgSW50clByb3BlcnRpZXMgPSBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV07CisgIH0KKworICAvLyBWZWN0b3IgU2F0dXJhdGluZyBEb3VibGluZyBMb25nIE11bHRpcGx5CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3NxZG11bGwgOiBBZHZTSU1EXzJWZWN0b3JBcmdfTG9uZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3NxZG11bGxzX3NjYWxhcgorICAgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgLy8gVmVjdG9yIEhhbHZpbmcgU3VidHJhY3QKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc2hzdWIgOiBBZHZTSU1EXzJWZWN0b3JBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl91aHN1YiA6IEFkdlNJTURfMlZlY3RvckFyZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFNhdHVyYXRpbmcgU3VidHJhY3QKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc3FzdWIgOiBBZHZTSU1EXzJJbnRBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl91cXN1YiA6IEFkdlNJTURfMkludEFyZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFN1YnRyYWN0IEhpZ2gtSGFsZgorICAvLyBGSVhNRTogdGhpcyBpcyBhIGxlZ2FjeSBpbnRyaW5zaWMgZm9yIGFhcmNoNjRfc2ltZC5oLiBSZW1vdmUgaXQgd2hlbiB0aGF0CisgIC8vIGhlYWRlciBpcyBubyBsb25nZXIgc3VwcG9ydGVkLgorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zdWJobiA6IEFkdlNJTURfMlZlY3RvckFyZ19OYXJyb3dfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBSb3VuZGluZyBTdWJ0cmFjdCBIaWdoLUhhbGYKKyAgZGVmIGludF9hYXJjaDY0X25lb25fcnN1YmhuIDogQWR2U0lNRF8yVmVjdG9yQXJnX05hcnJvd19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIENvbXBhcmUgQWJzb2x1dGUgR3JlYXRlci10aGFuLW9yLWVxdWFsCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZhY2dlIDogQWR2U0lNRF8yQXJnX0Zsb2F0Q29tcGFyZV9JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIENvbXBhcmUgQWJzb2x1dGUgR3JlYXRlci10aGFuCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZhY2d0IDogQWR2U0lNRF8yQXJnX0Zsb2F0Q29tcGFyZV9JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIEFic29sdXRlIERpZmZlcmVuY2UKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc2FiZCA6IEFkdlNJTURfMlZlY3RvckFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3VhYmQgOiBBZHZTSU1EXzJWZWN0b3JBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mYWJkIDogQWR2U0lNRF8yVmVjdG9yQXJnX0ludHJpbnNpYzsKKworICAvLyBTY2FsYXIgQWJzb2x1dGUgRGlmZmVyZW5jZQorICBkZWYgaW50X2FhcmNoNjRfc2lzZF9mYWJkIDogQWR2U0lNRF8yU2NhbGFyX0Zsb2F0X0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgTWF4CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3NtYXggOiBBZHZTSU1EXzJWZWN0b3JBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl91bWF4IDogQWR2U0lNRF8yVmVjdG9yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fZm1heCA6IEFkdlNJTURfMkZsb2F0QXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fZm1heG5tcCA6IEFkdlNJTURfMlZlY3RvckFyZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIE1heCBBY3Jvc3MgTGFuZXMKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc21heHYgOiBBZHZTSU1EXzFWZWN0b3JBcmdfSW50X0Fjcm9zc19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3VtYXh2IDogQWR2U0lNRF8xVmVjdG9yQXJnX0ludF9BY3Jvc3NfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mbWF4diA6IEFkdlNJTURfMVZlY3RvckFyZ19GbG9hdF9BY3Jvc3NfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mbWF4bm12IDogQWR2U0lNRF8xVmVjdG9yQXJnX0Zsb2F0X0Fjcm9zc19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIE1pbgorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zbWluIDogQWR2U0lNRF8yVmVjdG9yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdW1pbiA6IEFkdlNJTURfMlZlY3RvckFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZtaW4gOiBBZHZTSU1EXzJGbG9hdEFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZtaW5ubXAgOiBBZHZTSU1EXzJWZWN0b3JBcmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBNaW4vTWF4IE51bWJlcgorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mbWlubm0gOiBBZHZTSU1EXzJGbG9hdEFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZtYXhubSA6IEFkdlNJTURfMkZsb2F0QXJnX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgTWluIEFjcm9zcyBMYW5lcworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zbWludiA6IEFkdlNJTURfMVZlY3RvckFyZ19JbnRfQWNyb3NzX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdW1pbnYgOiBBZHZTSU1EXzFWZWN0b3JBcmdfSW50X0Fjcm9zc19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZtaW52IDogQWR2U0lNRF8xVmVjdG9yQXJnX0Zsb2F0X0Fjcm9zc19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZtaW5ubXYgOiBBZHZTSU1EXzFWZWN0b3JBcmdfRmxvYXRfQWNyb3NzX0ludHJpbnNpYzsKKworICAvLyBQYWlyd2lzZSBBZGQKKyAgZGVmIGludF9hYXJjaDY0X25lb25fYWRkcCA6IEFkdlNJTURfMlZlY3RvckFyZ19JbnRyaW5zaWM7CisKKyAgLy8gTG9uZyBQYWlyd2lzZSBBZGQKKyAgLy8gRklYTUU6IEluIHRoZW9yeSwgd2Ugc2hvdWxkbid0IG5lZWQgaW50cmluc2ljcyBmb3Igc2FkZGxwIG9yCisgIC8vIHVhZGRscCwgYnV0IHRibGdlbidzIHR5cGUgaW5mZXJlbmNlIGN1cnJlbnRseSBjYW4ndCBoYW5kbGUgdGhlCisgIC8vIHBhdHRlcm4gZnJhZ21lbnRzIHRoaXMgZW5kcyB1cCBnZW5lcmF0aW5nLgorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zYWRkbHAgOiBBZHZTSU1EXzFWZWN0b3JBcmdfRXhwYW5kX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdWFkZGxwIDogQWR2U0lNRF8xVmVjdG9yQXJnX0V4cGFuZF9JbnRyaW5zaWM7CisKKyAgLy8gRm9sZGluZyBNYXhpbXVtCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3NtYXhwIDogQWR2U0lNRF8yVmVjdG9yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdW1heHAgOiBBZHZTSU1EXzJWZWN0b3JBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mbWF4cCA6IEFkdlNJTURfMlZlY3RvckFyZ19JbnRyaW5zaWM7CisKKyAgLy8gRm9sZGluZyBNaW5pbXVtCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3NtaW5wIDogQWR2U0lNRF8yVmVjdG9yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdW1pbnAgOiBBZHZTSU1EXzJWZWN0b3JBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mbWlucCA6IEFkdlNJTURfMlZlY3RvckFyZ19JbnRyaW5zaWM7CisKKyAgLy8gUmVjaXByb2NhbCBFc3RpbWF0ZS9TdGVwCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZyZWNwcyA6IEFkdlNJTURfMkZsb2F0QXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fZnJzcXJ0cyA6IEFkdlNJTURfMkZsb2F0QXJnX0ludHJpbnNpYzsKKworICAvLyBSZWNpcHJvY2FsIEV4cG9uZW50CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZyZWNweCA6IEFkdlNJTURfMUZsb2F0QXJnX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgU2F0dXJhdGluZyBTaGlmdCBMZWZ0CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3Nxc2hsIDogQWR2U0lNRF8ySW50QXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdXFzaGwgOiBBZHZTSU1EXzJJbnRBcmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBSb3VuZGluZyBTaGlmdCBMZWZ0CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3Nyc2hsIDogQWR2U0lNRF8ySW50QXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdXJzaGwgOiBBZHZTSU1EXzJJbnRBcmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBTYXR1cmF0aW5nIFJvdW5kaW5nIFNoaWZ0IExlZnQKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc3Fyc2hsIDogQWR2U0lNRF8ySW50QXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdXFyc2hsIDogQWR2U0lNRF8ySW50QXJnX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgU2lnbmVkLT5VbnNpZ25lZCBTaGlmdCBMZWZ0IGJ5IENvbnN0YW50CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3Nxc2hsdSA6IEFkdlNJTURfMkludEFyZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFNpZ25lZC0+VW5zaWduZWQgTmFycm93aW5nIFNhdHVyYXRpbmcgU2hpZnQgUmlnaHQgYnkgQ29uc3RhbnQKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc3FzaHJ1biA6IEFkdlNJTURfMkFyZ19TY2FsYXJfTmFycm93X0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgU2lnbmVkLT5VbnNpZ25lZCBSb3VuZGluZyBOYXJyb3dpbmcgU2F0dXJhdGluZyBTaGlmdCBSaWdodCBieSBDb25zdAorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zcXJzaHJ1biA6IEFkdlNJTURfMkFyZ19TY2FsYXJfTmFycm93X0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgTmFycm93aW5nIFNoaWZ0IFJpZ2h0IGJ5IENvbnN0YW50CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3Nxc2hybiA6IEFkdlNJTURfMkFyZ19TY2FsYXJfTmFycm93X0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdXFzaHJuIDogQWR2U0lNRF8yQXJnX1NjYWxhcl9OYXJyb3dfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBSb3VuZGluZyBOYXJyb3dpbmcgU2hpZnQgUmlnaHQgYnkgQ29uc3RhbnQKKyAgZGVmIGludF9hYXJjaDY0X25lb25fcnNocm4gOiBBZHZTSU1EXzJBcmdfU2NhbGFyX05hcnJvd19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFJvdW5kaW5nIE5hcnJvd2luZyBTYXR1cmF0aW5nIFNoaWZ0IFJpZ2h0IGJ5IENvbnN0YW50CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3NxcnNocm4gOiBBZHZTSU1EXzJBcmdfU2NhbGFyX05hcnJvd19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3VxcnNocm4gOiBBZHZTSU1EXzJBcmdfU2NhbGFyX05hcnJvd19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFNoaWZ0IExlZnQKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc3NobCA6IEFkdlNJTURfMkludEFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3VzaGwgOiBBZHZTSU1EXzJJbnRBcmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBXaWRlbmluZyBTaGlmdCBMZWZ0IGJ5IENvbnN0YW50CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3NobGwgOiBBZHZTSU1EXzJWZWN0b3JBcmdfU2NhbGFyX1dpZGVfQnlTaXplX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc3NobGwgOiBBZHZTSU1EXzJWZWN0b3JBcmdfU2NhbGFyX1dpZGVfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl91c2hsbCA6IEFkdlNJTURfMlZlY3RvckFyZ19TY2FsYXJfV2lkZV9JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFNoaWZ0IFJpZ2h0IGJ5IENvbnN0YW50IGFuZCBJbnNlcnQKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdnNyaSA6IEFkdlNJTURfM1ZlY3RvckFyZ19TY2FsYXJfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBTaGlmdCBMZWZ0IGJ5IENvbnN0YW50IGFuZCBJbnNlcnQKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdnNsaSA6IEFkdlNJTURfM1ZlY3RvckFyZ19TY2FsYXJfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBTYXR1cmF0aW5nIE5hcnJvdworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zY2FsYXJfc3F4dG46IEFkdlNJTURfMUludEFyZ19OYXJyb3dfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zY2FsYXJfdXF4dG4gOiBBZHZTSU1EXzFJbnRBcmdfTmFycm93X0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc3F4dG4gOiBBZHZTSU1EXzFWZWN0b3JBcmdfTmFycm93X0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdXF4dG4gOiBBZHZTSU1EXzFWZWN0b3JBcmdfTmFycm93X0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgU2F0dXJhdGluZyBFeHRyYWN0IGFuZCBVbnNpZ25lZCBOYXJyb3cKKyAgZGVmIGludF9hYXJjaDY0X25lb25fc2NhbGFyX3NxeHR1biA6IEFkdlNJTURfMUludEFyZ19OYXJyb3dfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zcXh0dW4gOiBBZHZTSU1EXzFWZWN0b3JBcmdfTmFycm93X0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgQWJzb2x1dGUgVmFsdWUKKyAgZGVmIGludF9hYXJjaDY0X25lb25fYWJzIDogQWR2U0lNRF8xQXJnX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgU2F0dXJhdGluZyBBYnNvbHV0ZSBWYWx1ZQorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9zcWFicyA6IEFkdlNJTURfMUludEFyZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFNhdHVyYXRpbmcgTmVnYXRpb24KKyAgZGVmIGludF9hYXJjaDY0X25lb25fc3FuZWcgOiBBZHZTSU1EXzFJbnRBcmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBDb3VudCBMZWFkaW5nIFNpZ24gQml0cworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9jbHMgOiBBZHZTSU1EXzFWZWN0b3JBcmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBSZWNpcHJvY2FsIEVzdGltYXRlCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3VyZWNwZSA6IEFkdlNJTURfMVZlY3RvckFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZyZWNwZSA6IEFkdlNJTURfMUZsb2F0QXJnX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgU3F1YXJlIFJvb3QgRXN0aW1hdGUKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdXJzcXJ0ZSA6IEFkdlNJTURfMVZlY3RvckFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2Zyc3FydGUgOiBBZHZTSU1EXzFGbG9hdEFyZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIEJpdHdpc2UgUmV2ZXJzZQorICBkZWYgaW50X2FhcmNoNjRfbmVvbl9yYml0IDogQWR2U0lNRF8xVmVjdG9yQXJnX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgQ29udmVyc2lvbnMgQmV0d2VlbiBIYWxmLVByZWNpc2lvbiBhbmQgU2luZ2xlLVByZWNpc2lvbi4KKyAgZGVmIGludF9hYXJjaDY0X25lb25fdmN2dGZwMmhmCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fdjRpMTZfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fdmN2dGhmMmZwCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKworICAvLyBWZWN0b3IgQ29udmVyc2lvbnMgQmV0d2VlbiBGbG9hdGluZy1wb2ludCBhbmQgRml4ZWQtcG9pbnQuCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3ZjdnRmcDJmeHMgOiBBZHZTSU1EX0N2dEZQVG9GeF9JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3ZjdnRmcDJmeHUgOiBBZHZTSU1EX0N2dEZQVG9GeF9JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3ZjdnRmeHMyZnAgOiBBZHZTSU1EX0N2dEZ4VG9GUF9JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX3ZjdnRmeHUyZnAgOiBBZHZTSU1EX0N2dEZ4VG9GUF9JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIEZQLT5JbnQgQ29udmVyc2lvbnMKKyAgZGVmIGludF9hYXJjaDY0X25lb25fZmN2dGFzIDogQWR2U0lNRF9GUFRvSW50Um91bmRpbmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mY3Z0YXUgOiBBZHZTSU1EX0ZQVG9JbnRSb3VuZGluZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZjdnRtcyA6IEFkdlNJTURfRlBUb0ludFJvdW5kaW5nX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fZmN2dG11IDogQWR2U0lNRF9GUFRvSW50Um91bmRpbmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mY3Z0bnMgOiBBZHZTSU1EX0ZQVG9JbnRSb3VuZGluZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZjdnRudSA6IEFkdlNJTURfRlBUb0ludFJvdW5kaW5nX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fZmN2dHBzIDogQWR2U0lNRF9GUFRvSW50Um91bmRpbmdfSW50cmluc2ljOworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mY3Z0cHUgOiBBZHZTSU1EX0ZQVG9JbnRSb3VuZGluZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZjdnR6cyA6IEFkdlNJTURfRlBUb0ludFJvdW5kaW5nX0ludHJpbnNpYzsKKyAgZGVmIGludF9hYXJjaDY0X25lb25fZmN2dHp1IDogQWR2U0lNRF9GUFRvSW50Um91bmRpbmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBGUCBSb3VuZGluZzogb25seSB0aWVzIHRvIGV2ZW4gaXMgdW5yZXByZXNlbnRlZCBieSBhIG5vcm1hbAorICAvLyBpbnRyaW5zaWMuCisgIGRlZiBpbnRfYWFyY2g2NF9uZW9uX2ZyaW50biA6IEFkdlNJTURfMUZsb2F0QXJnX0ludHJpbnNpYzsKKworICAvLyBTY2FsYXIgRlAtPkludCBjb252ZXJzaW9ucworCisgIC8vIFZlY3RvciBGUCBJbmV4YWN0IE5hcnJvd2luZworICBkZWYgaW50X2FhcmNoNjRfbmVvbl9mY3Z0eG4gOiBBZHZTSU1EXzFWZWN0b3JBcmdfRXhwYW5kX0ludHJpbnNpYzsKKworICAvLyBTY2FsYXIgRlAgSW5leGFjdCBOYXJyb3dpbmcKKyAgZGVmIGludF9hYXJjaDY0X3Npc2RfZmN2dHhuIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKK2xldCBUYXJnZXRQcmVmaXggPSAiYWFyY2g2NCIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS5hYXJjaDY0LiIuCisgIGNsYXNzIEFkdlNJTURfMlZlY3RvcjJJbmRleF9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgIFtsbHZtX2FueXZlY3Rvcl90eSwgbGx2bV9pNjRfdHksIExMVk1NYXRjaFR5cGU8MD4sIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKKy8vIFZlY3RvciBlbGVtZW50IHRvIGVsZW1lbnQgbW92ZXMKK2RlZiBpbnRfYWFyY2g2NF9uZW9uX3Zjb3B5X2xhbmU6IEFkdlNJTURfMlZlY3RvcjJJbmRleF9JbnRyaW5zaWM7CisKK2xldCBUYXJnZXRQcmVmaXggPSAiYWFyY2g2NCIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS5hYXJjaDY0LiIuCisgIGNsYXNzIEFkdlNJTURfMVZlY19Mb2FkX0ludHJpbnNpYworICAgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwgW0xMVk1BbnlQb2ludGVyVHlwZTxMTFZNTWF0Y2hUeXBlPDA+Pl0sCisgICAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGNsYXNzIEFkdlNJTURfMVZlY19TdG9yZV9MYW5lX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtdLCBbbGx2bV9hbnl2ZWN0b3JfdHksIGxsdm1faTY0X3R5LCBsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8Mj5dPjsKKworICBjbGFzcyBBZHZTSU1EXzJWZWNfTG9hZF9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHksIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgIFtMTFZNQW55UG9pbnRlclR5cGU8TExWTU1hdGNoVHlwZTwwPj5dLAorICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgY2xhc3MgQWR2U0lNRF8yVmVjX0xvYWRfTGFuZV9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHksIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eSwgbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgY2xhc3MgQWR2U0lNRF8yVmVjX1N0b3JlX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtdLCBbbGx2bV9hbnl2ZWN0b3JfdHksIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICBMTFZNQW55UG9pbnRlclR5cGU8TExWTU1hdGNoVHlwZTwwPj5dLAorICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDI+XT47CisgIGNsYXNzIEFkdlNJTURfMlZlY19TdG9yZV9MYW5lX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtdLCBbbGx2bV9hbnl2ZWN0b3JfdHksIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5LCBsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8Mz5dPjsKKworICBjbGFzcyBBZHZTSU1EXzNWZWNfTG9hZF9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHksIExMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgIFtMTFZNQW55UG9pbnRlclR5cGU8TExWTU1hdGNoVHlwZTwwPj5dLAorICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgY2xhc3MgQWR2U0lNRF8zVmVjX0xvYWRfTGFuZV9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHksIExMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eSwgbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgY2xhc3MgQWR2U0lNRF8zVmVjX1N0b3JlX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtdLCBbbGx2bV9hbnl2ZWN0b3JfdHksIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNQW55UG9pbnRlclR5cGU8TExWTU1hdGNoVHlwZTwwPj5dLAorICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDM+XT47CisgIGNsYXNzIEFkdlNJTURfM1ZlY19TdG9yZV9MYW5lX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtdLCBbbGx2bV9hbnl2ZWN0b3JfdHksCisgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5LCBsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8ND5dPjsKKworICBjbGFzcyBBZHZTSU1EXzRWZWNfTG9hZF9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHksIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgIFtMTFZNQW55UG9pbnRlclR5cGU8TExWTU1hdGNoVHlwZTwwPj5dLAorICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgY2xhc3MgQWR2U0lNRF80VmVjX0xvYWRfTGFuZV9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHksIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eSwgbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgY2xhc3MgQWR2U0lNRF80VmVjX1N0b3JlX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtdLCBbbGx2bV9hbnl2ZWN0b3JfdHksIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgIExMVk1BbnlQb2ludGVyVHlwZTxMTFZNTWF0Y2hUeXBlPDA+Pl0sCisgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8ND5dPjsKKyAgY2xhc3MgQWR2U0lNRF80VmVjX1N0b3JlX0xhbmVfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2FueXZlY3Rvcl90eSwgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHksIGxsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTw1Pl0+OworfQorCisvLyBNZW1vcnkgb3BzCisKK2RlZiBpbnRfYWFyY2g2NF9uZW9uX2xkMXgyIDogQWR2U0lNRF8yVmVjX0xvYWRfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X25lb25fbGQxeDMgOiBBZHZTSU1EXzNWZWNfTG9hZF9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfbmVvbl9sZDF4NCA6IEFkdlNJTURfNFZlY19Mb2FkX0ludHJpbnNpYzsKKworZGVmIGludF9hYXJjaDY0X25lb25fc3QxeDIgOiBBZHZTSU1EXzJWZWNfU3RvcmVfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X25lb25fc3QxeDMgOiBBZHZTSU1EXzNWZWNfU3RvcmVfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X25lb25fc3QxeDQgOiBBZHZTSU1EXzRWZWNfU3RvcmVfSW50cmluc2ljOworCitkZWYgaW50X2FhcmNoNjRfbmVvbl9sZDIgOiBBZHZTSU1EXzJWZWNfTG9hZF9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfbmVvbl9sZDMgOiBBZHZTSU1EXzNWZWNfTG9hZF9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfbmVvbl9sZDQgOiBBZHZTSU1EXzRWZWNfTG9hZF9JbnRyaW5zaWM7CisKK2RlZiBpbnRfYWFyY2g2NF9uZW9uX2xkMmxhbmUgOiBBZHZTSU1EXzJWZWNfTG9hZF9MYW5lX0ludHJpbnNpYzsKK2RlZiBpbnRfYWFyY2g2NF9uZW9uX2xkM2xhbmUgOiBBZHZTSU1EXzNWZWNfTG9hZF9MYW5lX0ludHJpbnNpYzsKK2RlZiBpbnRfYWFyY2g2NF9uZW9uX2xkNGxhbmUgOiBBZHZTSU1EXzRWZWNfTG9hZF9MYW5lX0ludHJpbnNpYzsKKworZGVmIGludF9hYXJjaDY0X25lb25fbGQyciA6IEFkdlNJTURfMlZlY19Mb2FkX0ludHJpbnNpYzsKK2RlZiBpbnRfYWFyY2g2NF9uZW9uX2xkM3IgOiBBZHZTSU1EXzNWZWNfTG9hZF9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfbmVvbl9sZDRyIDogQWR2U0lNRF80VmVjX0xvYWRfSW50cmluc2ljOworCitkZWYgaW50X2FhcmNoNjRfbmVvbl9zdDIgIDogQWR2U0lNRF8yVmVjX1N0b3JlX0ludHJpbnNpYzsKK2RlZiBpbnRfYWFyY2g2NF9uZW9uX3N0MyAgOiBBZHZTSU1EXzNWZWNfU3RvcmVfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X25lb25fc3Q0ICA6IEFkdlNJTURfNFZlY19TdG9yZV9JbnRyaW5zaWM7CisKK2RlZiBpbnRfYWFyY2g2NF9uZW9uX3N0MmxhbmUgIDogQWR2U0lNRF8yVmVjX1N0b3JlX0xhbmVfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X25lb25fc3QzbGFuZSAgOiBBZHZTSU1EXzNWZWNfU3RvcmVfTGFuZV9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfbmVvbl9zdDRsYW5lICA6IEFkdlNJTURfNFZlY19TdG9yZV9MYW5lX0ludHJpbnNpYzsKKworbGV0IFRhcmdldFByZWZpeCA9ICJhYXJjaDY0IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLmFhcmNoNjQuIi4KKyAgY2xhc3MgQWR2U0lNRF9UYmwxX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sIFtsbHZtX3YxNmk4X3R5LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfVGJsMl9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBMTFZNTWF0Y2hUeXBlPDA+XSwgW0ludHJOb01lbV0+OworICBjbGFzcyBBZHZTSU1EX1RibDNfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBjbGFzcyBBZHZTSU1EX1RibDRfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGNsYXNzIEFkdlNJTURfVGJ4MV9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX3YxNmk4X3R5LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfVGJ4Ml9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LAorICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfVGJ4M19JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LAorICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGNsYXNzIEFkdlNJTURfVGJ4NF9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LAorICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CitkZWYgaW50X2FhcmNoNjRfbmVvbl90YmwxIDogQWR2U0lNRF9UYmwxX0ludHJpbnNpYzsKK2RlZiBpbnRfYWFyY2g2NF9uZW9uX3RibDIgOiBBZHZTSU1EX1RibDJfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X25lb25fdGJsMyA6IEFkdlNJTURfVGJsM19JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfbmVvbl90Ymw0IDogQWR2U0lNRF9UYmw0X0ludHJpbnNpYzsKKworZGVmIGludF9hYXJjaDY0X25lb25fdGJ4MSA6IEFkdlNJTURfVGJ4MV9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfbmVvbl90YngyIDogQWR2U0lNRF9UYngyX0ludHJpbnNpYzsKK2RlZiBpbnRfYWFyY2g2NF9uZW9uX3RieDMgOiBBZHZTSU1EX1RieDNfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X25lb25fdGJ4NCA6IEFkdlNJTURfVGJ4NF9JbnRyaW5zaWM7CisKK2xldCBUYXJnZXRQcmVmaXggPSAiYWFyY2g2NCIgaW4geworICBjbGFzcyBDcnlwdG9fQUVTX0RhdGFLZXlfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBjbGFzcyBDcnlwdG9fQUVTX0RhdGFfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICAvLyBTSEEgaW50cmluc2ljIHRha2luZyA1IHdvcmRzIG9mIHRoZSBoYXNoICh2NGkzMiwgaTMyKSBhbmQgNCBvZiB0aGUgc2NoZWR1bGUKKyAgLy8gKHY0aTMyKS4KKyAgY2xhc3MgQ3J5cHRvX1NIQV81SGFzaDRTY2hlZHVsZV9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIC8vIFNIQSBpbnRyaW5zaWMgdGFraW5nIDUgd29yZHMgb2YgdGhlIGhhc2ggKHY0aTMyLCBpMzIpIGFuZCA0IG9mIHRoZSBzY2hlZHVsZQorICAvLyAodjRpMzIpLgorICBjbGFzcyBDcnlwdG9fU0hBXzFIYXNoX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICAvLyBTSEEgaW50cmluc2ljIHRha2luZyA4IHdvcmRzIG9mIHRoZSBzY2hlZHVsZQorICBjbGFzcyBDcnlwdG9fU0hBXzhTY2hlZHVsZV9JbnRyaW5zaWMKKyAgICA6IEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIC8vIFNIQSBpbnRyaW5zaWMgdGFraW5nIDEyIHdvcmRzIG9mIHRoZSBzY2hlZHVsZQorICBjbGFzcyBDcnlwdG9fU0hBXzEyU2NoZWR1bGVfSW50cmluc2ljCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIC8vIFNIQSBpbnRyaW5zaWMgdGFraW5nIDggd29yZHMgb2YgdGhlIGhhc2ggYW5kIDQgb2YgdGhlIHNjaGVkdWxlLgorICBjbGFzcyBDcnlwdG9fU0hBXzhIYXNoNFNjaGVkdWxlX0ludHJpbnNpYworICAgIDogSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KKworLy8gQUVTCitkZWYgaW50X2FhcmNoNjRfY3J5cHRvX2Flc2UgICA6IENyeXB0b19BRVNfRGF0YUtleV9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfY3J5cHRvX2Flc2QgICA6IENyeXB0b19BRVNfRGF0YUtleV9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfY3J5cHRvX2Flc21jICA6IENyeXB0b19BRVNfRGF0YV9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfY3J5cHRvX2Flc2ltYyA6IENyeXB0b19BRVNfRGF0YV9JbnRyaW5zaWM7CisKKy8vIFNIQTEKK2RlZiBpbnRfYWFyY2g2NF9jcnlwdG9fc2hhMWMgIDogQ3J5cHRvX1NIQV81SGFzaDRTY2hlZHVsZV9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfY3J5cHRvX3NoYTFwICA6IENyeXB0b19TSEFfNUhhc2g0U2NoZWR1bGVfSW50cmluc2ljOworZGVmIGludF9hYXJjaDY0X2NyeXB0b19zaGExbSAgOiBDcnlwdG9fU0hBXzVIYXNoNFNjaGVkdWxlX0ludHJpbnNpYzsKK2RlZiBpbnRfYWFyY2g2NF9jcnlwdG9fc2hhMWggIDogQ3J5cHRvX1NIQV8xSGFzaF9JbnRyaW5zaWM7CisKK2RlZiBpbnRfYWFyY2g2NF9jcnlwdG9fc2hhMXN1MCA6IENyeXB0b19TSEFfMTJTY2hlZHVsZV9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfY3J5cHRvX3NoYTFzdTEgOiBDcnlwdG9fU0hBXzhTY2hlZHVsZV9JbnRyaW5zaWM7CisKKy8vIFNIQTI1NgorZGVmIGludF9hYXJjaDY0X2NyeXB0b19zaGEyNTZoICAgOiBDcnlwdG9fU0hBXzhIYXNoNFNjaGVkdWxlX0ludHJpbnNpYzsKK2RlZiBpbnRfYWFyY2g2NF9jcnlwdG9fc2hhMjU2aDIgIDogQ3J5cHRvX1NIQV84SGFzaDRTY2hlZHVsZV9JbnRyaW5zaWM7CitkZWYgaW50X2FhcmNoNjRfY3J5cHRvX3NoYTI1NnN1MCA6IENyeXB0b19TSEFfOFNjaGVkdWxlX0ludHJpbnNpYzsKK2RlZiBpbnRfYWFyY2g2NF9jcnlwdG9fc2hhMjU2c3UxIDogQ3J5cHRvX1NIQV8xMlNjaGVkdWxlX0ludHJpbnNpYzsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENSQzMyCisKK2xldCBUYXJnZXRQcmVmaXggPSAiYWFyY2g2NCIgaW4geworCitkZWYgaW50X2FhcmNoNjRfY3JjMzJiICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FhcmNoNjRfY3JjMzJjYiA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FhcmNoNjRfY3JjMzJoICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FhcmNoNjRfY3JjMzJjaCA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FhcmNoNjRfY3JjMzJ3ICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FhcmNoNjRfY3JjMzJjdyA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FhcmNoNjRfY3JjMzJ4ICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5XSwKKyAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FhcmNoNjRfY3JjMzJjeCA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5XSwKKyAgICBbSW50ck5vTWVtXT47Cit9CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NBTURHUFUudGQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NBTURHUFUudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA4YWIwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc0FNREdQVS50ZApAQCAtMCwwICsxLDkyMiBAQAorLy89PT0tIEludHJpbnNpY3NBTURHUFUudGQgLSBEZWZpbmVzIEFNREdQVSBpbnRyaW5zaWNzIC0tLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhbGwgb2YgdGhlIFI2MDAtc3BlY2lmaWMgaW50cmluc2ljcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBBTURHUFVSZWFkUHJlbG9hZFJlZ2lzdGVySW50cmluc2ljCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdLCBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXT47CisKK2NsYXNzIEFNREdQVVJlYWRQcmVsb2FkUmVnaXN0ZXJJbnRyaW5zaWNOYW1lZDxzdHJpbmcgbmFtZT4KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdPiwgR0NDQnVpbHRpbjxuYW1lPjsKKworbGV0IFRhcmdldFByZWZpeCA9ICJyNjAwIiBpbiB7CisKK211bHRpY2xhc3MgQU1ER1BVUmVhZFByZWxvYWRSZWdpc3RlckludHJpbnNpY194eXogeworICBkZWYgX3ggOiBBTURHUFVSZWFkUHJlbG9hZFJlZ2lzdGVySW50cmluc2ljOworICBkZWYgX3kgOiBBTURHUFVSZWFkUHJlbG9hZFJlZ2lzdGVySW50cmluc2ljOworICBkZWYgX3ogOiBBTURHUFVSZWFkUHJlbG9hZFJlZ2lzdGVySW50cmluc2ljOworfQorCittdWx0aWNsYXNzIEFNREdQVVJlYWRQcmVsb2FkUmVnaXN0ZXJJbnRyaW5zaWNfeHl6X25hbWVkPHN0cmluZyBwcmVmaXg+IHsKKyAgZGVmIF94IDogQU1ER1BVUmVhZFByZWxvYWRSZWdpc3RlckludHJpbnNpY05hbWVkPCFzdHJjb25jYXQocHJlZml4LCAiX3giKT47CisgIGRlZiBfeSA6IEFNREdQVVJlYWRQcmVsb2FkUmVnaXN0ZXJJbnRyaW5zaWNOYW1lZDwhc3RyY29uY2F0KHByZWZpeCwgIl95Iik+OworICBkZWYgX3ogOiBBTURHUFVSZWFkUHJlbG9hZFJlZ2lzdGVySW50cmluc2ljTmFtZWQ8IXN0cmNvbmNhdChwcmVmaXgsICJfeiIpPjsKK30KKworZGVmbSBpbnRfcjYwMF9yZWFkX2dsb2JhbF9zaXplIDogQU1ER1BVUmVhZFByZWxvYWRSZWdpc3RlckludHJpbnNpY194eXpfbmFtZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwiX19idWlsdGluX3I2MDBfcmVhZF9nbG9iYWxfc2l6ZSI+OworZGVmbSBpbnRfcjYwMF9yZWFkX25ncm91cHMgOiBBTURHUFVSZWFkUHJlbG9hZFJlZ2lzdGVySW50cmluc2ljX3h5el9uYW1lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Il9fYnVpbHRpbl9yNjAwX3JlYWRfbmdyb3VwcyI+OworZGVmbSBpbnRfcjYwMF9yZWFkX3RnaWQgOiBBTURHUFVSZWFkUHJlbG9hZFJlZ2lzdGVySW50cmluc2ljX3h5el9uYW1lZAorICAgICAgICAgICAgICAgICAgICAgICAgICA8Il9fYnVpbHRpbl9yNjAwX3JlYWRfdGdpZCI+OworCitkZWZtIGludF9yNjAwX3JlYWRfbG9jYWxfc2l6ZSA6IEFNREdQVVJlYWRQcmVsb2FkUmVnaXN0ZXJJbnRyaW5zaWNfeHl6OworZGVmbSBpbnRfcjYwMF9yZWFkX3RpZGlnIDogQU1ER1BVUmVhZFByZWxvYWRSZWdpc3RlckludHJpbnNpY194eXo7CisKK2RlZiBpbnRfcjYwMF9ncm91cF9iYXJyaWVyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3I2MDBfZ3JvdXBfYmFycmllciI+LAorICBJbnRyaW5zaWM8W10sIFtdLCBbSW50ckNvbnZlcmdlbnRdPjsKKworLy8gQVMgNyBpcyBQQVJBTV9JX0FERFJFU1MsIHVzZWQgZm9yIGtlcm5lbCBhcmd1bWVudHMKK2RlZiBpbnRfcjYwMF9pbXBsaWNpdGFyZ19wdHIgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fcjYwMF9pbXBsaWNpdGFyZ19wdHIiPiwKKyAgSW50cmluc2ljPFtMTFZNUXVhbFBvaW50ZXJUeXBlPGxsdm1faThfdHksIDc+XSwgW10sCisgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdPjsKKworZGVmIGludF9yNjAwX3JhdF9zdG9yZV90eXBlZCA6CisgIC8vIDFzdCBwYXJhbWV0ZXI6IERhdGEKKyAgLy8gMm5kIHBhcmFtZXRlcjogSW5kZXgKKyAgLy8gM3JkIHBhcmFtZXRlcjogQ29uc3RhbnQgUkFUIElECisgIEludHJpbnNpYzxbXSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwgW10+LAorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fcjYwMF9yYXRfc3RvcmVfdHlwZWQiPjsKKworZGVmIGludF9yNjAwX3JlY2lwc3FydF9pZWVlIDogIEludHJpbnNpYzwKKyAgW2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0sIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X3I2MDBfcmVjaXBzcXJ0X2NsYW1wZWQgOiBJbnRyaW5zaWM8CisgIFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dLCBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9yNjAwX2N1YmUgOiBJbnRyaW5zaWM8CisgIFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworfSAvLyBFbmQgVGFyZ2V0UHJlZml4ID0gInI2MDAiCisKK2xldCBUYXJnZXRQcmVmaXggPSAiYW1kZ2NuIiBpbiB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBQkkgU3BlY2lhbCBJbnRyaW5zaWNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWZtIGludF9hbWRnY25fd29ya2l0ZW1faWQgOiBBTURHUFVSZWFkUHJlbG9hZFJlZ2lzdGVySW50cmluc2ljX3h5ejsKK2RlZm0gaW50X2FtZGdjbl93b3JrZ3JvdXBfaWQgOiBBTURHUFVSZWFkUHJlbG9hZFJlZ2lzdGVySW50cmluc2ljX3h5el9uYW1lZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwiX19idWlsdGluX2FtZGdjbl93b3JrZ3JvdXBfaWQiPjsKKworZGVmIGludF9hbWRnY25fZGlzcGF0Y2hfcHRyIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9kaXNwYXRjaF9wdHIiPiwKKyAgSW50cmluc2ljPFtMTFZNUXVhbFBvaW50ZXJUeXBlPGxsdm1faThfdHksIDQ+XSwgW10sCisgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdPjsKKworZGVmIGludF9hbWRnY25fcXVldWVfcHRyIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9xdWV1ZV9wdHIiPiwKKyAgSW50cmluc2ljPFtMTFZNUXVhbFBvaW50ZXJUeXBlPGxsdm1faThfdHksIDQ+XSwgW10sCisgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdPjsKKworZGVmIGludF9hbWRnY25fa2VybmFyZ19zZWdtZW50X3B0ciA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fa2VybmFyZ19zZWdtZW50X3B0ciI+LAorICBJbnRyaW5zaWM8W0xMVk1RdWFsUG9pbnRlclR5cGU8bGx2bV9pOF90eSwgND5dLCBbXSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0+OworCitkZWYgaW50X2FtZGdjbl9pbXBsaWNpdGFyZ19wdHIgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX2ltcGxpY2l0YXJnX3B0ciI+LAorICBJbnRyaW5zaWM8W0xMVk1RdWFsUG9pbnRlclR5cGU8bGx2bV9pOF90eSwgND5dLCBbXSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0+OworCitkZWYgaW50X2FtZGdjbl9ncm91cHN0YXRpY3NpemUgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX2dyb3Vwc3RhdGljc2l6ZSI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdPjsKKworZGVmIGludF9hbWRnY25fZGlzcGF0Y2hfaWQgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX2Rpc3BhdGNoX2lkIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbXSwgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0+OworCitkZWYgaW50X2FtZGdjbl9pbXBsaWNpdF9idWZmZXJfcHRyIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9pbXBsaWNpdF9idWZmZXJfcHRyIj4sCisgIEludHJpbnNpYzxbTExWTVF1YWxQb2ludGVyVHlwZTxsbHZtX2k4X3R5LCA0Pl0sIFtdLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXT47CisKKy8vIFNldCBFWEVDIHRvIHRoZSA2NC1iaXQgdmFsdWUgZ2l2ZW4uCisvLyBUaGlzIGlzIGFsd2F5cyBtb3ZlZCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBiYXNpYyBibG9jay4KK2RlZiBpbnRfYW1kZ2NuX2luaXRfZXhlYyA6IEludHJpbnNpYzxbXSwKKyAgW2xsdm1faTY0X3R5XSwgICAgICAvLyA2NC1iaXQgbGl0ZXJhbCBjb25zdGFudAorICBbSW50ckNvbnZlcmdlbnRdPjsKKworLy8gU2V0IEVYRUMgYWNjb3JkaW5nIHRvIGEgdGhyZWFkIGNvdW50IHBhY2tlZCBpbiBhbiBTR1BSIGlucHV0OgorLy8gICAgdGhyZWFkX2NvdW50ID0gKGlucHV0ID4+IGJpdG9mZnNldCkgJiAweDdmOworLy8gVGhpcyBpcyBhbHdheXMgbW92ZWQgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYmFzaWMgYmxvY2suCitkZWYgaW50X2FtZGdjbl9pbml0X2V4ZWNfZnJvbV9pbnB1dCA6IEludHJpbnNpYzxbXSwKKyAgW2xsdm1faTMyX3R5LCAgICAgICAvLyAzMi1iaXQgU0dQUiBpbnB1dAorICAgbGx2bV9pMzJfdHldLCAgICAgIC8vIGJpdCBvZmZzZXQgb2YgdGhlIHRocmVhZCBjb3VudAorICBbSW50ckNvbnZlcmdlbnRdPjsKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb24gSW50cmluc2ljcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gVGhlIGZpcnN0IHBhcmFtZXRlciBpcyBzX3NlbmRtc2cgaW1tZWRpYXRlIChpMTYpLAorLy8gdGhlIHNlY29uZCBvbmUgaXMgY29waWVkIHRvIG0wCitkZWYgaW50X2FtZGdjbl9zX3NlbmRtc2cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX3Nfc2VuZG1zZyI+LAorICBJbnRyaW5zaWMgPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworZGVmIGludF9hbWRnY25fc19zZW5kbXNnaGFsdCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fc19zZW5kbXNnaGFsdCI+LAorICBJbnRyaW5zaWMgPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworCitkZWYgaW50X2FtZGdjbl9zX2JhcnJpZXIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX3NfYmFycmllciI+LAorICBJbnRyaW5zaWM8W10sIFtdLCBbSW50ckNvbnZlcmdlbnRdPjsKKworZGVmIGludF9hbWRnY25fd2F2ZV9iYXJyaWVyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl93YXZlX2JhcnJpZXIiPiwKKyAgSW50cmluc2ljPFtdLCBbXSwgW0ludHJDb252ZXJnZW50XT47CisKK2RlZiBpbnRfYW1kZ2NuX3Nfd2FpdGNudCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fc193YWl0Y250Ij4sCisgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XSwgW10+OworCitkZWYgaW50X2FtZGdjbl9kaXZfc2NhbGUgOiBJbnRyaW5zaWM8CisgIC8vIDFzdCBwYXJhbWV0ZXI6IE51bWVyYXRvcgorICAvLyAybmQgcGFyYW1ldGVyOiBEZW5vbWluYXRvcgorICAvLyAzcmQgcGFyYW1ldGVyOiBDb25zdGFudCB0byBzZWxlY3Qgc2VsZWN0IGJldHdlZW4gZmlyc3QgYW5kCisgIC8vICAgICAgICAgICAgICAgIHNlY29uZC4gKDAgPSBmaXJzdCwgMSA9IHNlY29uZCkuCisgIFtsbHZtX2FueWZsb2F0X3R5LCBsbHZtX2kxX3R5XSwKKyAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD4sIGxsdm1faTFfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fZGl2X2ZtYXMgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLAorICBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPiwgbGx2bV9pMV90eV0sCisgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl9kaXZfZml4dXAgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLAorICBbTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPl0sCisgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl90cmlnX3ByZW9wIDogSW50cmluc2ljPAorICBbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl9zaW4gOiBJbnRyaW5zaWM8CisgIFtsbHZtX2FueWZsb2F0X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fY29zIDogSW50cmluc2ljPAorICBbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XSwgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2xvZ19jbGFtcCA6IEludHJpbnNpYzwKKyAgW2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0sIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl9mbXVsX2xlZ2FjeSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fZm11bF9sZWdhY3kiPiwKKyAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fcmNwIDogSW50cmluc2ljPAorICBbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XSwgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX3JjcF9sZWdhY3kgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX3JjcF9sZWdhY3kiPiwKKyAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fcnNxIDogIEludHJpbnNpYzwKKyAgW2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0sIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl9yc3FfbGVnYWN5IDogIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fcnNxX2xlZ2FjeSI+LAorICBJbnRyaW5zaWM8CisgIFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fcnNxX2NsYW1wIDogSW50cmluc2ljPAorICBbbGx2bV9hbnlmbG9hdF90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XSwgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0+OworCitkZWYgaW50X2FtZGdjbl9sZGV4cCA6IEludHJpbnNpYzwKKyAgW2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPiwgbGx2bV9pMzJfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fZnJleHBfbWFudCA6IEludHJpbnNpYzwKKyAgW2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0sIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl9mcmV4cF9leHAgOiBJbnRyaW5zaWM8CisgIFtsbHZtX2FueWludF90eV0sIFtsbHZtX2FueWZsb2F0X3R5XSwgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKKy8vIHZfZnJhY3QgaXMgYnVnZ3kgb24gU0kvQ0kuIEl0IG1pc2hhbmRsZXMgaW5maW5pdGllcywgbWF5IHJldHVybiAxLjAKKy8vIGFuZCBhbHdheXMgdXNlcyBydHosIHNvIGlzIG5vdCBzdWl0YWJsZSBmb3IgaW1wbGVtZW50aW5nIHRoZSBPcGVuQ0wKKy8vIGZyYWN0IGZ1bmN0aW9uLiBJdCBzaG91bGQgYmUgb2sgb24gVkkuCitkZWYgaW50X2FtZGdjbl9mcmFjdCA6IEludHJpbnNpYzwKKyAgW2xsdm1fYW55ZmxvYXRfdHldLCBbTExWTU1hdGNoVHlwZTwwPl0sIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl9jdnRfcGtydHogOiBJbnRyaW5zaWM8CisgIFtsbHZtX3YyZjE2X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fY3Z0X3Brbm9ybV9pMTYgOiBJbnRyaW5zaWM8CisgIFtsbHZtX3YyaTE2X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fY3Z0X3Brbm9ybV91MTYgOiBJbnRyaW5zaWM8CisgIFtsbHZtX3YyaTE2X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fY3Z0X3BrX2kxNiA6IEludHJpbnNpYzwKKyAgW2xsdm1fdjJpMTZfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2N2dF9wa191MTYgOiBJbnRyaW5zaWM8CisgIFtsbHZtX3YyaTE2X3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl9jbGFzcyA6IEludHJpbnNpYzwKKyAgW2xsdm1faTFfdHldLCBbbGx2bV9hbnlmbG9hdF90eSwgbGx2bV9pMzJfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fZm1lZDMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX2ZtZWQzIj4sCisgIEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sCisgICAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICAgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl9jdWJlaWQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX2N1YmVpZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLAorICAgIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fY3ViZW1hIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9jdWJlbWEiPiwKKyAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwKKyAgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fY3ViZXNjIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9jdWJlc2MiPiwKKyAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwKKyAgICBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2N1YmV0YyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fY3ViZXRjIj4sCisgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sCisgICAgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCisvLyB2X2ZmYmhfaTMyLCBhcyBvcHBvc2VkIHRvIHZfZmZiaF91MzIuIEZvciB2X2ZmYmhfdTMyLCBsbHZtLmN0bHoKKy8vIHNob3VsZCBiZSB1c2VkLgorZGVmIGludF9hbWRnY25fc2ZmYmggOgorICBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworCisvLyBGaWVsZHMgc2hvdWxkIG1pcnJvciBhdG9taWNybXcKK2NsYXNzIEFNREdQVUF0b21pY0luY0ludHJpbiA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLAorICBbbGx2bV9hbnlwdHJfdHksCisgIExMVk1NYXRjaFR5cGU8MD4sCisgIGxsdm1faTMyX3R5LCAvLyBvcmRlcmluZworICBsbHZtX2kzMl90eSwgLy8gc2NvcGUKKyAgbGx2bV9pMV90eV0sIC8vIGlzVm9sYXRpbGUKKyAgW0ludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8MD5dLCAiIiwKKyAgW1NETlBNZW1PcGVyYW5kXQorPjsKKworZGVmIGludF9hbWRnY25fYXRvbWljX2luYyA6IEFNREdQVUF0b21pY0luY0ludHJpbjsKK2RlZiBpbnRfYW1kZ2NuX2F0b21pY19kZWMgOiBBTURHUFVBdG9taWNJbmNJbnRyaW47CisKK2NsYXNzIEFNREdQVUxEU0YzMkludHJpbjxzdHJpbmcgY2xhbmdfYnVpbHRpbj4gOgorICBHQ0NCdWlsdGluPGNsYW5nX2J1aWx0aW4+LAorICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLAorICAgIFtMTFZNUXVhbFBvaW50ZXJUeXBlPGxsdm1fZmxvYXRfdHksIDM+LAorICAgIGxsdm1fZmxvYXRfdHksCisgICAgbGx2bV9pMzJfdHksIC8vIG9yZGVyaW5nCisgICAgbGx2bV9pMzJfdHksIC8vIHNjb3BlCisgICAgbGx2bV9pMV90eV0sIC8vIGlzVm9sYXRpbGUKKyAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwwPl0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2RzX2ZhZGQgOiBBTURHUFVMRFNGMzJJbnRyaW48Il9fYnVpbHRpbl9hbWRnY25fZHNfZmFkZCI+OworZGVmIGludF9hbWRnY25fZHNfZm1pbiA6IEFNREdQVUxEU0YzMkludHJpbjwiX19idWlsdGluX2FtZGdjbl9kc19mbWluIj47CitkZWYgaW50X2FtZGdjbl9kc19mbWF4IDogQU1ER1BVTERTRjMySW50cmluPCJfX2J1aWx0aW5fYW1kZ2NuX2RzX2ZtYXgiPjsKKworY2xhc3MgQU1ER1BVSW1hZ2VMb2FkPGJpdCBOb01lbSA9IDA+IDogSW50cmluc2ljIDwKKyAgW2xsdm1fYW55ZmxvYXRfdHldLCAvLyB2ZGF0YShWR1BSKQorICBbbGx2bV9hbnlpbnRfdHksICAgIC8vIHZhZGRyKFZHUFIpCisgICBsbHZtX2FueWludF90eSwgICAgLy8gcnNyYyhTR1BSKQorICAgbGx2bV9pMzJfdHksICAgICAgIC8vIGRtYXNrKGltbSkKKyAgIGxsdm1faTFfdHksICAgICAgICAvLyBnbGMoaW1tKQorICAgbGx2bV9pMV90eSwgICAgICAgIC8vIHNsYyhpbW0pCisgICBsbHZtX2kxX3R5LCAgICAgICAgLy8gbHdlKGltbSkKKyAgIGxsdm1faTFfdHldLCAgICAgICAvLyBkYShpbW0pCisgICFpZihOb01lbSwgW0ludHJOb01lbV0sIFtJbnRyUmVhZE1lbV0pLCAiIiwKKyAgIWlmKE5vTWVtLCBbXSwgW1NETlBNZW1PcGVyYW5kXSk+OworCitkZWYgaW50X2FtZGdjbl9pbWFnZV9sb2FkIDogQU1ER1BVSW1hZ2VMb2FkOworZGVmIGludF9hbWRnY25faW1hZ2VfbG9hZF9taXAgOiBBTURHUFVJbWFnZUxvYWQ7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9nZXRyZXNpbmZvIDogQU1ER1BVSW1hZ2VMb2FkPDE+OworCitjbGFzcyBBTURHUFVJbWFnZVN0b3JlIDogSW50cmluc2ljIDwKKyAgW10sCisgIFtsbHZtX2FueWZsb2F0X3R5LCAgLy8gdmRhdGEoVkdQUikKKyAgIGxsdm1fYW55aW50X3R5LCAgICAvLyB2YWRkcihWR1BSKQorICAgbGx2bV9hbnlpbnRfdHksICAgIC8vIHJzcmMoU0dQUikKKyAgIGxsdm1faTMyX3R5LCAgICAgICAvLyBkbWFzayhpbW0pCisgICBsbHZtX2kxX3R5LCAgICAgICAgLy8gZ2xjKGltbSkKKyAgIGxsdm1faTFfdHksICAgICAgICAvLyBzbGMoaW1tKQorICAgbGx2bV9pMV90eSwgICAgICAgIC8vIGx3ZShpbW0pCisgICBsbHZtX2kxX3R5XSwgICAgICAgLy8gZGEoaW1tKQorICBbSW50cldyaXRlTWVtXSwgIiIsIFtTRE5QTWVtT3BlcmFuZF0+OworCitkZWYgaW50X2FtZGdjbl9pbWFnZV9zdG9yZSA6IEFNREdQVUltYWdlU3RvcmU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zdG9yZV9taXAgOiBBTURHUFVJbWFnZVN0b3JlOworCitjbGFzcyBBTURHUFVJbWFnZVNhbXBsZTxiaXQgTm9NZW0gPSAwPiA6IEludHJpbnNpYyA8CisgICAgW2xsdm1fYW55ZmxvYXRfdHldLCAvLyB2ZGF0YShWR1BSKQorICAgIFtsbHZtX2FueWZsb2F0X3R5LCAgLy8gdmFkZHIoVkdQUikKKyAgICAgbGx2bV9hbnlpbnRfdHksICAgIC8vIHJzcmMoU0dQUikKKyAgICAgbGx2bV92NGkzMl90eSwgICAgIC8vIHNhbXBsZXIoU0dQUikKKyAgICAgbGx2bV9pMzJfdHksICAgICAgIC8vIGRtYXNrKGltbSkKKyAgICAgbGx2bV9pMV90eSwgICAgICAgIC8vIHVub3JtKGltbSkKKyAgICAgbGx2bV9pMV90eSwgICAgICAgIC8vIGdsYyhpbW0pCisgICAgIGxsdm1faTFfdHksICAgICAgICAvLyBzbGMoaW1tKQorICAgICBsbHZtX2kxX3R5LCAgICAgICAgLy8gbHdlKGltbSkKKyAgICAgbGx2bV9pMV90eV0sICAgICAgIC8vIGRhKGltbSkKKyAgICAgIWlmKE5vTWVtLCBbSW50ck5vTWVtXSwgW0ludHJSZWFkTWVtXSksICIiLAorICAgICAhaWYoTm9NZW0sIFtdLCBbU0ROUE1lbU9wZXJhbmRdKT47CisKKy8vIEJhc2ljIHNhbXBsZQorZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfY2wgOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9kIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfZF9jbCA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2wgOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9iIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfYl9jbCA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2x6IDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfY2QgOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9jZF9jbCA6IEFNREdQVUltYWdlU2FtcGxlOworCisvLyBTYW1wbGUgd2l0aCBjb21wYXJpc29uCitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfYyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2NfY2wgOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2QgOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2RfY2wgOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2wgOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2IgOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2JfY2wgOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2x6IDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfY19jZCA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2NfY2RfY2wgOiBBTURHUFVJbWFnZVNhbXBsZTsKKworLy8gU2FtcGxlIHdpdGggb2Zmc2V0cworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX28gOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9jbF9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfZF9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfZF9jbF9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfbF9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfYl9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfYl9jbF9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfbHpfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2NkX28gOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9jZF9jbF9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CisKKy8vIFNhbXBsZSB3aXRoIGNvbXBhcmlzb24gYW5kIG9mZnNldHMKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX28gOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2NsX28gOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2RfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2NfZF9jbF9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfY19sX28gOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX3NhbXBsZV9jX2JfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2Vfc2FtcGxlX2NfYl9jbF9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfY19sel9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfY19jZF9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9zYW1wbGVfY19jZF9jbF9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CisKKy8vIEJhc2ljIGdhdGhlcjQKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2dhdGhlcjQgOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2dhdGhlcjRfY2wgOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2dhdGhlcjRfbCA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2VfZ2F0aGVyNF9iIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9nYXRoZXI0X2JfY2wgOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2dhdGhlcjRfbHogOiBBTURHUFVJbWFnZVNhbXBsZTsKKworLy8gR2F0aGVyNCB3aXRoIGNvbXBhcmlzb24KK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2dhdGhlcjRfYyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2VfZ2F0aGVyNF9jX2NsIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9nYXRoZXI0X2NfbCA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2VfZ2F0aGVyNF9jX2IgOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2dhdGhlcjRfY19iX2NsIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9nYXRoZXI0X2NfbHogOiBBTURHUFVJbWFnZVNhbXBsZTsKKworLy8gR2F0aGVyNCB3aXRoIG9mZnNldHMKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2dhdGhlcjRfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2VfZ2F0aGVyNF9jbF9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9nYXRoZXI0X2xfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2VfZ2F0aGVyNF9iX28gOiBBTURHUFVJbWFnZVNhbXBsZTsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2dhdGhlcjRfYl9jbF9vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9nYXRoZXI0X2x6X28gOiBBTURHUFVJbWFnZVNhbXBsZTsKKworLy8gR2F0aGVyNCB3aXRoIGNvbXBhcmlzb24gYW5kIG9mZnNldHMKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2dhdGhlcjRfY19vIDogQU1ER1BVSW1hZ2VTYW1wbGU7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9nYXRoZXI0X2NfY2xfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2VfZ2F0aGVyNF9jX2xfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2VfZ2F0aGVyNF9jX2JfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2VfZ2F0aGVyNF9jX2JfY2xfbyA6IEFNREdQVUltYWdlU2FtcGxlOworZGVmIGludF9hbWRnY25faW1hZ2VfZ2F0aGVyNF9jX2x6X28gOiBBTURHUFVJbWFnZVNhbXBsZTsKKworZGVmIGludF9hbWRnY25faW1hZ2VfZ2V0bG9kIDogQU1ER1BVSW1hZ2VTYW1wbGU8MT47CisKK2NsYXNzIEFNREdQVUltYWdlQXRvbWljIDogSW50cmluc2ljIDwKKyAgW2xsdm1faTMyX3R5XSwKKyAgW2xsdm1faTMyX3R5LCAgICAgICAvLyB2ZGF0YShWR1BSKQorICAgbGx2bV9hbnlpbnRfdHksICAgIC8vIHZhZGRyKFZHUFIpCisgICBsbHZtX3Y4aTMyX3R5LCAgICAgLy8gcnNyYyhTR1BSKQorICAgbGx2bV9pMV90eSwgICAgICAgIC8vIHIxMjgoaW1tKQorICAgbGx2bV9pMV90eSwgICAgICAgIC8vIGRhKGltbSkKKyAgIGxsdm1faTFfdHldLCAgICAgICAvLyBzbGMoaW1tKQorICBbXSwgIiIsIFtTRE5QTWVtT3BlcmFuZF0+OworCitkZWYgaW50X2FtZGdjbl9pbWFnZV9hdG9taWNfc3dhcCA6IEFNREdQVUltYWdlQXRvbWljOworZGVmIGludF9hbWRnY25faW1hZ2VfYXRvbWljX2FkZCA6IEFNREdQVUltYWdlQXRvbWljOworZGVmIGludF9hbWRnY25faW1hZ2VfYXRvbWljX3N1YiA6IEFNREdQVUltYWdlQXRvbWljOworZGVmIGludF9hbWRnY25faW1hZ2VfYXRvbWljX3NtaW4gOiBBTURHUFVJbWFnZUF0b21pYzsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2F0b21pY191bWluIDogQU1ER1BVSW1hZ2VBdG9taWM7CitkZWYgaW50X2FtZGdjbl9pbWFnZV9hdG9taWNfc21heCA6IEFNREdQVUltYWdlQXRvbWljOworZGVmIGludF9hbWRnY25faW1hZ2VfYXRvbWljX3VtYXggOiBBTURHUFVJbWFnZUF0b21pYzsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2F0b21pY19hbmQgOiBBTURHUFVJbWFnZUF0b21pYzsKK2RlZiBpbnRfYW1kZ2NuX2ltYWdlX2F0b21pY19vciA6IEFNREdQVUltYWdlQXRvbWljOworZGVmIGludF9hbWRnY25faW1hZ2VfYXRvbWljX3hvciA6IEFNREdQVUltYWdlQXRvbWljOworZGVmIGludF9hbWRnY25faW1hZ2VfYXRvbWljX2luYyA6IEFNREdQVUltYWdlQXRvbWljOworZGVmIGludF9hbWRnY25faW1hZ2VfYXRvbWljX2RlYyA6IEFNREdQVUltYWdlQXRvbWljOworZGVmIGludF9hbWRnY25faW1hZ2VfYXRvbWljX2NtcHN3YXAgOiBJbnRyaW5zaWMgPAorICBbbGx2bV9pMzJfdHldLAorICBbbGx2bV9pMzJfdHksICAgICAgIC8vIHNyYyhWR1BSKQorICAgbGx2bV9pMzJfdHksICAgICAgIC8vIGNtcChWR1BSKQorICAgbGx2bV9hbnlpbnRfdHksICAgIC8vIHZhZGRyKFZHUFIpCisgICBsbHZtX3Y4aTMyX3R5LCAgICAgLy8gcnNyYyhTR1BSKQorICAgbGx2bV9pMV90eSwgICAgICAgIC8vIHIxMjgoaW1tKQorICAgbGx2bV9pMV90eSwgICAgICAgIC8vIGRhKGltbSkKKyAgIGxsdm1faTFfdHldLCAgICAgICAvLyBzbGMoaW1tKQorICBbXSwgIiIsIFtTRE5QTWVtT3BlcmFuZF0+OworCitjbGFzcyBBTURHUFVCdWZmZXJMb2FkIDogSW50cmluc2ljIDwKKyAgW2xsdm1fYW55ZmxvYXRfdHldLAorICBbbGx2bV92NGkzMl90eSwgICAgIC8vIHJzcmMoU0dQUikKKyAgIGxsdm1faTMyX3R5LCAgICAgICAvLyB2aW5kZXgoVkdQUikKKyAgIGxsdm1faTMyX3R5LCAgICAgICAvLyBvZmZzZXQoU0dQUi9WR1BSL2ltbSkKKyAgIGxsdm1faTFfdHksICAgICAgICAvLyBnbGMoaW1tKQorICAgbGx2bV9pMV90eV0sICAgICAgIC8vIHNsYyhpbW0pCisgIFtJbnRyUmVhZE1lbV0sICIiLCBbU0ROUE1lbU9wZXJhbmRdPjsKK2RlZiBpbnRfYW1kZ2NuX2J1ZmZlcl9sb2FkX2Zvcm1hdCA6IEFNREdQVUJ1ZmZlckxvYWQ7CitkZWYgaW50X2FtZGdjbl9idWZmZXJfbG9hZCA6IEFNREdQVUJ1ZmZlckxvYWQ7CisKK2NsYXNzIEFNREdQVUJ1ZmZlclN0b3JlIDogSW50cmluc2ljIDwKKyAgW10sCisgIFtsbHZtX2FueWZsb2F0X3R5LCAgLy8gdmRhdGEoVkdQUikgLS0gY2FuIGN1cnJlbnRseSBvbmx5IHNlbGVjdCBmMzIsIHYyZjMyLCB2NGYzMgorICAgbGx2bV92NGkzMl90eSwgICAgIC8vIHJzcmMoU0dQUikKKyAgIGxsdm1faTMyX3R5LCAgICAgICAvLyB2aW5kZXgoVkdQUikKKyAgIGxsdm1faTMyX3R5LCAgICAgICAvLyBvZmZzZXQoU0dQUi9WR1BSL2ltbSkKKyAgIGxsdm1faTFfdHksICAgICAgICAvLyBnbGMoaW1tKQorICAgbGx2bV9pMV90eV0sICAgICAgIC8vIHNsYyhpbW0pCisgIFtJbnRyV3JpdGVNZW1dLCAiIiwgW1NETlBNZW1PcGVyYW5kXT47CitkZWYgaW50X2FtZGdjbl9idWZmZXJfc3RvcmVfZm9ybWF0IDogQU1ER1BVQnVmZmVyU3RvcmU7CitkZWYgaW50X2FtZGdjbl9idWZmZXJfc3RvcmUgOiBBTURHUFVCdWZmZXJTdG9yZTsKKworZGVmIGludF9hbWRnY25fdGJ1ZmZlcl9sb2FkIDogSW50cmluc2ljIDwKKyAgICBbbGx2bV9hbnlfdHldLCAgICAvLyBvdmVybG9hZGVkIGZvciB0eXBlcyBmMzIvaTMyLCB2MmYzMi92MmkzMiwgdjRmMzIvdjRpMzIKKyAgICBbbGx2bV92NGkzMl90eSwgICAvLyByc3JjKFNHUFIpCisgICAgIGxsdm1faTMyX3R5LCAgICAgLy8gdmluZGV4KFZHUFIpCisgICAgIGxsdm1faTMyX3R5LCAgICAgLy8gdm9mZnNldChWR1BSKQorICAgICBsbHZtX2kzMl90eSwgICAgIC8vIHNvZmZzZXQoU0dQUikKKyAgICAgbGx2bV9pMzJfdHksICAgICAvLyBvZmZzZXQoaW1tKQorICAgICBsbHZtX2kzMl90eSwgICAgIC8vIGRmbXQoaW1tKQorICAgICBsbHZtX2kzMl90eSwgICAgIC8vIG5mbXQoaW1tKQorICAgICBsbHZtX2kxX3R5LCAgICAgLy8gZ2xjKGltbSkKKyAgICAgbGx2bV9pMV90eV0sICAgIC8vIHNsYyhpbW0pCisgICAgW0ludHJSZWFkTWVtXSwgIiIsIFtTRE5QTWVtT3BlcmFuZF0+OworCitkZWYgaW50X2FtZGdjbl90YnVmZmVyX3N0b3JlIDogSW50cmluc2ljIDwKKyAgICBbXSwKKyAgICBbbGx2bV9hbnlfdHksICAgIC8vIHZkYXRhKFZHUFIpLCBvdmVybG9hZGVkIGZvciB0eXBlcyBmMzIvaTMyLCB2MmYzMi92MmkzMiwgdjRmMzIvdjRpMzIKKyAgICAgbGx2bV92NGkzMl90eSwgIC8vIHJzcmMoU0dQUikKKyAgICAgbGx2bV9pMzJfdHksICAgIC8vIHZpbmRleChWR1BSKQorICAgICBsbHZtX2kzMl90eSwgICAgLy8gdm9mZnNldChWR1BSKQorICAgICBsbHZtX2kzMl90eSwgICAgLy8gc29mZnNldChTR1BSKQorICAgICBsbHZtX2kzMl90eSwgICAgLy8gb2Zmc2V0KGltbSkKKyAgICAgbGx2bV9pMzJfdHksICAgIC8vIGRmbXQoaW1tKQorICAgICBsbHZtX2kzMl90eSwgICAgLy8gbmZtdChpbW0pCisgICAgIGxsdm1faTFfdHksICAgICAvLyBnbGMoaW1tKQorICAgICBsbHZtX2kxX3R5XSwgICAgLy8gc2xjKGltbSkKKyAgICBbSW50cldyaXRlTWVtXSwgIiIsIFtTRE5QTWVtT3BlcmFuZF0+OworCitjbGFzcyBBTURHUFVCdWZmZXJBdG9taWMgOiBJbnRyaW5zaWMgPAorICBbbGx2bV9pMzJfdHldLAorICBbbGx2bV9pMzJfdHksICAgICAgIC8vIHZkYXRhKFZHUFIpCisgICBsbHZtX3Y0aTMyX3R5LCAgICAgLy8gcnNyYyhTR1BSKQorICAgbGx2bV9pMzJfdHksICAgICAgIC8vIHZpbmRleChWR1BSKQorICAgbGx2bV9pMzJfdHksICAgICAgIC8vIG9mZnNldChTR1BSL1ZHUFIvaW1tKQorICAgbGx2bV9pMV90eV0sICAgICAgIC8vIHNsYyhpbW0pCisgIFtdLCAiIiwgW1NETlBNZW1PcGVyYW5kXT47CitkZWYgaW50X2FtZGdjbl9idWZmZXJfYXRvbWljX3N3YXAgOiBBTURHUFVCdWZmZXJBdG9taWM7CitkZWYgaW50X2FtZGdjbl9idWZmZXJfYXRvbWljX2FkZCA6IEFNREdQVUJ1ZmZlckF0b21pYzsKK2RlZiBpbnRfYW1kZ2NuX2J1ZmZlcl9hdG9taWNfc3ViIDogQU1ER1BVQnVmZmVyQXRvbWljOworZGVmIGludF9hbWRnY25fYnVmZmVyX2F0b21pY19zbWluIDogQU1ER1BVQnVmZmVyQXRvbWljOworZGVmIGludF9hbWRnY25fYnVmZmVyX2F0b21pY191bWluIDogQU1ER1BVQnVmZmVyQXRvbWljOworZGVmIGludF9hbWRnY25fYnVmZmVyX2F0b21pY19zbWF4IDogQU1ER1BVQnVmZmVyQXRvbWljOworZGVmIGludF9hbWRnY25fYnVmZmVyX2F0b21pY191bWF4IDogQU1ER1BVQnVmZmVyQXRvbWljOworZGVmIGludF9hbWRnY25fYnVmZmVyX2F0b21pY19hbmQgOiBBTURHUFVCdWZmZXJBdG9taWM7CitkZWYgaW50X2FtZGdjbl9idWZmZXJfYXRvbWljX29yIDogQU1ER1BVQnVmZmVyQXRvbWljOworZGVmIGludF9hbWRnY25fYnVmZmVyX2F0b21pY194b3IgOiBBTURHUFVCdWZmZXJBdG9taWM7CitkZWYgaW50X2FtZGdjbl9idWZmZXJfYXRvbWljX2NtcHN3YXAgOiBJbnRyaW5zaWM8CisgIFtsbHZtX2kzMl90eV0sCisgIFtsbHZtX2kzMl90eSwgICAgICAgLy8gc3JjKFZHUFIpCisgICBsbHZtX2kzMl90eSwgICAgICAgLy8gY21wKFZHUFIpCisgICBsbHZtX3Y0aTMyX3R5LCAgICAgLy8gcnNyYyhTR1BSKQorICAgbGx2bV9pMzJfdHksICAgICAgIC8vIHZpbmRleChWR1BSKQorICAgbGx2bV9pMzJfdHksICAgICAgIC8vIG9mZnNldChTR1BSL1ZHUFIvaW1tKQorICAgbGx2bV9pMV90eV0sICAgICAgIC8vIHNsYyhpbW0pCisgIFtdLCAiIiwgW1NETlBNZW1PcGVyYW5kXT47CisKKy8vIFVzZXMgdGhhdCBkbyBub3Qgc2V0IHRoZSBkb25lIGJpdCBzaG91bGQgc2V0IEludHJXcml0ZU1lbSBvbiB0aGUKKy8vIGNhbGwgc2l0ZS4KK2RlZiBpbnRfYW1kZ2NuX2V4cCA6IEludHJpbnNpYyA8W10sIFsKKyAgbGx2bV9pMzJfdHksICAgICAgIC8vIHRndCwKKyAgbGx2bV9pMzJfdHksICAgICAgIC8vIGVuCisgIGxsdm1fYW55X3R5LCAgICAgICAvLyBzcmMwIChmMzIgb3IgaTMyKQorICBMTFZNTWF0Y2hUeXBlPDA+LCAgLy8gc3JjMQorICBMTFZNTWF0Y2hUeXBlPDA+LCAgLy8gc3JjMgorICBMTFZNTWF0Y2hUeXBlPDA+LCAgLy8gc3JjMworICBsbHZtX2kxX3R5LCAgICAgICAgLy8gZG9uZQorICBsbHZtX2kxX3R5ICAgICAgICAgLy8gdm0KKyAgXSwKKyAgW10KKz47CisKKy8vIGV4cCB3aXRoIGNvbXByIGJpdCBzZXQuCitkZWYgaW50X2FtZGdjbl9leHBfY29tcHIgOiBJbnRyaW5zaWMgPFtdLCBbCisgIGxsdm1faTMyX3R5LCAgICAgICAvLyB0Z3QsCisgIGxsdm1faTMyX3R5LCAgICAgICAvLyBlbgorICBsbHZtX2FueXZlY3Rvcl90eSwgLy8gc3JjMCAodjJmMTYgb3IgdjJpMTYpCisgIExMVk1NYXRjaFR5cGU8MD4sICAvLyBzcmMxCisgIGxsdm1faTFfdHksICAgICAgICAvLyBkb25lCisgIGxsdm1faTFfdHldLCAgICAgICAvLyB2bQorICBbXQorPjsKKworZGVmIGludF9hbWRnY25fYnVmZmVyX3diaW52bDFfc2MgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX2J1ZmZlcl93YmludmwxX3NjIj4sCisgIEludHJpbnNpYzxbXSwgW10sIFtdPjsKKworZGVmIGludF9hbWRnY25fYnVmZmVyX3diaW52bDEgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX2J1ZmZlcl93YmludmwxIj4sCisgIEludHJpbnNpYzxbXSwgW10sIFtdPjsKKworZGVmIGludF9hbWRnY25fc19kY2FjaGVfaW52IDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9zX2RjYWNoZV9pbnYiPiwKKyAgSW50cmluc2ljPFtdLCBbXSwgW10+OworCitkZWYgaW50X2FtZGdjbl9zX21lbXRpbWUgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX3NfbWVtdGltZSI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW10sIFtJbnRyUmVhZE1lbV0+OworCitkZWYgaW50X2FtZGdjbl9zX3NsZWVwIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9zX3NsZWVwIj4sCisgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XSwgW10+IHsKK30KKworZGVmIGludF9hbWRnY25fc19pbmNwZXJmbGV2ZWwgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX3NfaW5jcGVyZmxldmVsIj4sCisgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XSwgW10+IHsKK30KKworZGVmIGludF9hbWRnY25fc19kZWNwZXJmbGV2ZWwgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX3NfZGVjcGVyZmxldmVsIj4sCisgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XSwgW10+IHsKK30KKworZGVmIGludF9hbWRnY25fc19nZXRyZWcgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX3NfZ2V0cmVnIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHldLAorICBbSW50clJlYWRNZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCisvLyBpbnRfYW1kZ2NuX3NfZ2V0cGMgaXMgcHJvdmlkZWQgdG8gYWxsb3cgYSBzcGVjaWZpYyBzdHlsZSBvZiBwb3NpdGlvbgorLy8gaW5kZXBlbmRlbnQgY29kZSB0byBkZXRlcm1pbmUgdGhlIGhpZ2ggcGFydCBvZiBpdHMgYWRkcmVzcyB3aGVuIGl0IGlzCisvLyBrbm93biAodGhyb3VnaCBjb252ZW50aW9uKSB0aGF0IHRoZSBjb2RlIGFuZCBhbnkgZGF0YSBvZiBpbnRlcmVzdCBkb2VzCisvLyBub3QgY3Jvc3MgYSA0R2IgYWRkcmVzcyBib3VuZGFyeS4gVXNlIGZvciBhbnkgb3RoZXIgcHVycG9zZSBtYXkgbm90CisvLyBwcm9kdWNlIHRoZSBkZXNpcmVkIHJlc3VsdHMgYXMgb3B0aW1pemF0aW9ucyBtYXkgY2F1c2UgY29kZSBtb3ZlbWVudCwKKy8vIGVzcGVjaWFsbHkgYXMgd2UgZXhwbGljaXRseSB1c2UgSW50ck5vTWVtIHRvIGFsbG93IG9wdGltaXphdGlvbnMuCitkZWYgaW50X2FtZGdjbl9zX2dldHBjIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9zX2dldHBjIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbXSwgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0+OworCisvLyBfX2J1aWx0aW5fYW1kZ2NuX2ludGVycF9tb3YgPHBhcmFtPiwgPGF0dHJfY2hhbj4sIDxhdHRyPiwgPG0wPgorLy8gcGFyYW0gdmFsdWVzOiAwID0gUDEwLCAxID0gUDIwLCAyID0gUDAKK2RlZiBpbnRfYW1kZ2NuX2ludGVycF9tb3YgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX2ludGVycF9tb3YiPiwKKyAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXT47CisKKy8vIF9fYnVpbHRpbl9hbWRnY25faW50ZXJwX3AxIDxpPiwgPGF0dHJfY2hhbj4sIDxhdHRyPiwgPG0wPgorLy8gVGhpcyBpbnRyaW5zaWMgcmVhZHMgZnJvbSBsZHMsIGJ1dCB0aGUgbWVtb3J5IHZhbHVlcyBhcmUgY29uc3RhbnQsCisvLyBzbyBpdCBiZWhhdmVzIGxpa2UgSW50ck5vTWVtLgorZGVmIGludF9hbWRnY25faW50ZXJwX3AxIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9pbnRlcnBfcDEiPiwKKyAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdPjsKKworLy8gX19idWlsdGluX2FtZGdjbl9pbnRlcnBfcDIgPHAxPiwgPGo+LCA8YXR0cl9jaGFuPiwgPGF0dHI+LCA8bTA+CitkZWYgaW50X2FtZGdjbl9pbnRlcnBfcDIgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX2ludGVycF9wMiI+LAorICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0+OworICAgICAgICAgIC8vIFNlZSBpbnRfYW1kZ2NuX3ZfaW50ZXJwX3AxIGZvciB3aHkgdGhpcyBpcyBJbnRyTm9NZW0uCisKKy8vIFBpeGVsIHNoYWRlcnMgb25seTogd2hldGhlciB0aGUgY3VycmVudCBwaXhlbCBpcyBsaXZlIChpLmUuIG5vdCBhIGhlbHBlcgorLy8gaW52b2NhdGlvbiBmb3IgZGVyaXZhdGl2ZSBjb21wdXRhdGlvbikuCitkZWYgaW50X2FtZGdjbl9wc19saXZlIDogSW50cmluc2ljIDwKKyAgW2xsdm1faTFfdHldLAorICBbXSwKKyAgW0ludHJOb01lbV0+OworCitkZWYgaW50X2FtZGdjbl9tYmNudF9sbyA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fbWJjbnRfbG8iPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfYW1kZ2NuX21iY250X2hpIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9tYmNudF9oaSI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8gbGx2bS5hbWRnY24uZHMuc3dpenpsZSBzcmMgb2Zmc2V0CitkZWYgaW50X2FtZGdjbl9kc19zd2l6emxlIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9kc19zd2l6emxlIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbSwgSW50ckNvbnZlcmdlbnRdPjsKKworZGVmIGludF9hbWRnY25fdWJmZSA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLAorICBbTExWTU1hdGNoVHlwZTwwPiwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX3NiZmUgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwKKyAgW0xMVk1NYXRjaFR5cGU8MD4sIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl9sZXJwIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9sZXJwIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl9zYWRfdTggOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX3NhZF91OCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fbXNhZF91OCA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fbXNhZF91OCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fc2FkX2hpX3U4IDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9zYWRfaGlfdTgiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX3NhZF91MTYgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX3NhZF91MTYiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX3FzYWRfcGtfdTE2X3U4IDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9xc2FkX3BrX3UxNl91OCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fbXFzYWRfcGtfdTE2X3U4IDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9tcXNhZF9wa191MTZfdTgiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX21xc2FkX3UzMl91OCA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fbXFzYWRfdTMyX3U4Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKKworZGVmIGludF9hbWRnY25fY3Z0X3BrX3U4X2YzMiA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fY3Z0X3BrX3U4X2YzMiI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCitkZWYgaW50X2FtZGdjbl9pY21wIDoKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2FueWludF90eSwgTExWTU1hdGNoVHlwZTwwPiwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbSwgSW50ckNvbnZlcmdlbnRdPjsKKworZGVmIGludF9hbWRnY25fZmNtcCA6CisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9hbnlmbG9hdF90eSwgTExWTU1hdGNoVHlwZTwwPiwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbSwgSW50ckNvbnZlcmdlbnRdPjsKKworZGVmIGludF9hbWRnY25fcmVhZGZpcnN0bGFuZSA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fcmVhZGZpcnN0bGFuZSI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbSwgSW50ckNvbnZlcmdlbnRdPjsKKworLy8gVGhlIGxhbmUgYXJndW1lbnQgbXVzdCBiZSB1bmlmb3JtIGFjcm9zcyB0aGUgY3VycmVudGx5IGFjdGl2ZSB0aHJlYWRzIG9mIHRoZQorLy8gY3VycmVudCB3YXZlLiBPdGhlcndpc2UsIHRoZSByZXN1bHQgaXMgdW5kZWZpbmVkLgorZGVmIGludF9hbWRnY25fcmVhZGxhbmUgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX3JlYWRsYW5lIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbSwgSW50ckNvbnZlcmdlbnRdPjsKKworLy8gVGhlIHZhbHVlIHRvIHdyaXRlIGFuZCBsYW5lIHNlbGVjdCBhcmd1bWVudHMgbXVzdCBiZSB1bmlmb3JtIGFjcm9zcyB0aGUKKy8vIGN1cnJlbnRseSBhY3RpdmUgdGhyZWFkcyBvZiB0aGUgY3VycmVudCB3YXZlLiBPdGhlcndpc2UsIHRoZSByZXN1bHQgaXMKKy8vIHVuZGVmaW5lZC4KK2RlZiBpbnRfYW1kZ2NuX3dyaXRlbGFuZSA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fd3JpdGVsYW5lIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbCisgICAgbGx2bV9pMzJfdHksICAgIC8vIHVuaWZvcm0gdmFsdWUgdG8gd3JpdGU6IHJldHVybmVkIGJ5IHRoZSBzZWxlY3RlZCBsYW5lCisgICAgbGx2bV9pMzJfdHksICAgIC8vIHVuaWZvcm0gbGFuZSBzZWxlY3QKKyAgICBsbHZtX2kzMl90eSAgICAgLy8gcmV0dXJuZWQgYnkgYWxsIGxhbmVzIG90aGVyIHRoYW4gdGhlIHNlbGVjdGVkIG9uZQorICBdLAorICBbSW50ck5vTWVtLCBJbnRyQ29udmVyZ2VudF0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2FsaWduYml0IDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2FsaWduYnl0ZSA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCisKKy8vIENvcGllcyB0aGUgc291cmNlIHZhbHVlIHRvIHRoZSBkZXN0aW5hdGlvbiB2YWx1ZSwgd2l0aCB0aGUgZ3VhcmFudGVlIHRoYXQKKy8vIHRoZSBzb3VyY2UgdmFsdWUgaXMgY29tcHV0ZWQgYXMgaWYgdGhlIGVudGlyZSBwcm9ncmFtIHdlcmUgZXhlY3V0ZWQgaW4gV1FNLgorZGVmIGludF9hbWRnY25fd3FtIDogSW50cmluc2ljPFtsbHZtX2FueV90eV0sCisgIFtMTFZNTWF0Y2hUeXBlPDA+XSwgW0ludHJOb01lbSwgSW50clNwZWN1bGF0YWJsZV0KKz47CisKKy8vIFJldHVybiB0cnVlIGlmIGF0IGxlYXN0IG9uZSB0aHJlYWQgd2l0aGluIHRoZSBwaXhlbCBxdWFkIHBhc3NlcyB0cnVlIGludG8KKy8vIHRoZSBmdW5jdGlvbi4KK2RlZiBpbnRfYW1kZ2NuX3dxbV92b3RlIDogSW50cmluc2ljPFtsbHZtX2kxX3R5XSwKKyAgW2xsdm1faTFfdHldLCBbSW50ck5vTWVtLCBJbnRyQ29udmVyZ2VudF0KKz47CisKKy8vIElmIGZhbHNlLCBzZXQgRVhFQz0wIGZvciB0aGUgY3VycmVudCB0aHJlYWQgdW50aWwgdGhlIGVuZCBvZiBwcm9ncmFtLgorZGVmIGludF9hbWRnY25fa2lsbCA6IEludHJpbnNpYzxbXSwgW2xsdm1faTFfdHldLCBbXT47CisKKy8vIENvcGllcyB0aGUgYWN0aXZlIGNoYW5uZWxzIG9mIHRoZSBzb3VyY2UgdmFsdWUgdG8gdGhlIGRlc3RpbmF0aW9uIHZhbHVlLAorLy8gd2l0aCB0aGUgZ3VhcmFudGVlIHRoYXQgdGhlIHNvdXJjZSB2YWx1ZSBpcyBjb21wdXRlZCBhcyBpZiB0aGUgZW50aXJlCisvLyBwcm9ncmFtIHdlcmUgZXhlY3V0ZWQgaW4gV2hvbGUgV2F2ZWZyb250IE1vZGUsIGkuZS4gd2l0aCBhbGwgY2hhbm5lbHMKKy8vIGVuYWJsZWQsIHdpdGggYSBmZXcgZXhjZXB0aW9uczogLSBQaGkgbm9kZXMgd2l0aCByZXF1aXJlIFdXTSByZXR1cm4gYW4KKy8vIHVuZGVmaW5lZCB2YWx1ZS4KK2RlZiBpbnRfYW1kZ2NuX3d3bSA6IEludHJpbnNpYzxbbGx2bV9hbnlfdHldLAorICBbTExWTU1hdGNoVHlwZTwwPl0sIFtJbnRyTm9NZW0sIEludHJTcGVjdWxhdGFibGVdCis+OworCisvLyBHaXZlbiBhIHZhbHVlLCBjb3BpZXMgaXQgd2hpbGUgc2V0dGluZyBhbGwgdGhlIGluYWN0aXZlIGxhbmVzIHRvIGEgZ2l2ZW4KKy8vIHZhbHVlLiBOb3RlIHRoYXQgT3BlbkdMIGhlbHBlciBsYW5lcyBhcmUgY29uc2lkZXJlZCBhY3RpdmUsIHNvIGlmIHRoZQorLy8gcHJvZ3JhbSBldmVyIHVzZXMgV1FNLCB0aGVuIHRoZSBpbnN0cnVjdGlvbiBhbmQgdGhlIGZpcnN0IHNvdXJjZSB3aWxsIGJlCisvLyBjb21wdXRlZCBpbiBXUU0uCitkZWYgaW50X2FtZGdjbl9zZXRfaW5hY3RpdmUgOgorICBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwKKyAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCAvLyB2YWx1ZSB0byBiZSBjb3BpZWQKKyAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+XSwgLy8gdmFsdWUgZm9yIHRoZSBpbmFjdGl2ZSBsYW5lcyB0byB0YWtlCisgICAgICAgICAgICBbSW50ck5vTWVtLCBJbnRyQ29udmVyZ2VudF0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ0krIEludHJpbnNpY3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2RlZiBpbnRfYW1kZ2NuX3NfZGNhY2hlX2ludl92b2wgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX3NfZGNhY2hlX2ludl92b2wiPiwKKyAgSW50cmluc2ljPFtdLCBbXSwgW10+OworCitkZWYgaW50X2FtZGdjbl9idWZmZXJfd2JpbnZsMV92b2wgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX2J1ZmZlcl93YmludmwxX3ZvbCI+LAorICBJbnRyaW5zaWM8W10sIFtdLCBbXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBWSSBJbnRyaW5zaWNzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBsbHZtLmFtZGdjbi5tb3YuZHBwLmkzMiA8c3JjPiA8ZHBwX2N0cmw+IDxyb3dfbWFzaz4gPGJhbmtfbWFzaz4gPGJvdW5kX2N0cmw+CitkZWYgaW50X2FtZGdjbl9tb3ZfZHBwIDoKKyAgSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sCisgICAgICAgICAgICBbTExWTU1hdGNoVHlwZTwwPiwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICBsbHZtX2kxX3R5XSwgW0ludHJOb01lbSwgSW50ckNvbnZlcmdlbnRdPjsKKworLy8gbGx2bS5hbWRnY24udXBkYXRlLmRwcC5pMzIgPG9sZD4gPHNyYz4gPGRwcF9jdHJsPiA8cm93X21hc2s+IDxiYW5rX21hc2s+IDxib3VuZF9jdHJsPgorLy8gU2hvdWxkIGJlIGVxdWl2YWxlbnQgdG86CisvLyB2X21vdl9iMzIgPGRlc3Q+IDxvbGQ+CisvLyB2X21vdl9iMzIgPGRlc3Q+IDxzcmM+IDxkcHBfY3RybD4gPHJvd19tYXNrPiA8YmFua19tYXNrPiA8Ym91bmRfY3RybD4KK2RlZiBpbnRfYW1kZ2NuX3VwZGF0ZV9kcHAgOgorICBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwKKyAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTFfdHldLCBbSW50ck5vTWVtLCBJbnRyQ29udmVyZ2VudF0+OworCitkZWYgaW50X2FtZGdjbl9zX2RjYWNoZV93YiA6CisgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbWRnY25fc19kY2FjaGVfd2IiPiwKKyAgSW50cmluc2ljPFtdLCBbXSwgW10+OworCitkZWYgaW50X2FtZGdjbl9zX2RjYWNoZV93Yl92b2wgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX3NfZGNhY2hlX3diX3ZvbCI+LAorICBJbnRyaW5zaWM8W10sIFtdLCBbXT47CisKK2RlZiBpbnRfYW1kZ2NuX3NfbWVtcmVhbHRpbWUgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX3NfbWVtcmVhbHRpbWUiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtdLCBbSW50clJlYWRNZW1dPjsKKworLy8gbGx2bS5hbWRnY24uZHMucGVybXV0ZSA8aW5kZXg+IDxzcmM+CitkZWYgaW50X2FtZGdjbl9kc19wZXJtdXRlIDoKKyAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FtZGdjbl9kc19wZXJtdXRlIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbSwgSW50ckNvbnZlcmdlbnRdPjsKKworLy8gbGx2bS5hbWRnY24uZHMuYnBlcm11dGUgPGluZGV4PiA8c3JjPgorZGVmIGludF9hbWRnY25fZHNfYnBlcm11dGUgOgorICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYW1kZ2NuX2RzX2JwZXJtdXRlIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbSwgSW50ckNvbnZlcmdlbnRdPjsKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU3BlY2lhbCBJbnRyaW5zaWNzIGZvciBiYWNrZW5kIGludGVybmFsIHVzZSBvbmx5LiBObyBmcm9udGVuZAorLy8gc2hvdWxkIGVtaXQgY2FsbHMgdG8gdGhlc2UuCisvLyA9PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK2RlZiBpbnRfYW1kZ2NuX2lmIDogSW50cmluc2ljPFtsbHZtX2kxX3R5LCBsbHZtX2k2NF90eV0sCisgIFtsbHZtX2kxX3R5XSwgW0ludHJDb252ZXJnZW50XQorPjsKKworZGVmIGludF9hbWRnY25fZWxzZSA6IEludHJpbnNpYzxbbGx2bV9pMV90eSwgbGx2bV9pNjRfdHldLAorICBbbGx2bV9pNjRfdHldLCBbSW50ckNvbnZlcmdlbnRdCis+OworCitkZWYgaW50X2FtZGdjbl9icmVhayA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldLAorICBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtLCBJbnRyQ29udmVyZ2VudF0KKz47CisKK2RlZiBpbnRfYW1kZ2NuX2lmX2JyZWFrIDogSW50cmluc2ljPFtsbHZtX2k2NF90eV0sCisgIFtsbHZtX2kxX3R5LCBsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW0sIEludHJDb252ZXJnZW50XQorPjsKKworZGVmIGludF9hbWRnY25fZWxzZV9icmVhayA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldLAorICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwgW0ludHJOb01lbSwgSW50ckNvbnZlcmdlbnRdCis+OworCitkZWYgaW50X2FtZGdjbl9sb29wIDogSW50cmluc2ljPFtsbHZtX2kxX3R5XSwKKyAgW2xsdm1faTY0X3R5XSwgW0ludHJDb252ZXJnZW50XQorPjsKKworZGVmIGludF9hbWRnY25fZW5kX2NmIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHldLCBbSW50ckNvbnZlcmdlbnRdPjsKKworLy8gUmVwcmVzZW50IHVucmVhY2hhYmxlIGluIGEgZGl2ZXJnZW50IHJlZ2lvbi4KK2RlZiBpbnRfYW1kZ2NuX3VucmVhY2hhYmxlIDogSW50cmluc2ljPFtdLCBbXSwgW0ludHJDb252ZXJnZW50XT47CisKKy8vIEVtaXQgMi41IHVscCwgbm8gZGVub3JtYWwgZGl2aXNpb24uIFNob3VsZCBvbmx5IGJlIGluc2VydGVkIGJ5CisvLyBwYXNzIGJhc2VkIG9uICFmcG1hdGggbWV0YWRhdGEuCitkZWYgaW50X2FtZGdjbl9mZGl2X2Zhc3QgOiBJbnRyaW5zaWM8CisgIFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICBbSW50ck5vTWVtLCBJbnRyU3BlY3VsYXRhYmxlXQorPjsKK30KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc0FSTS50ZCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc0FSTS50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTM4NjEzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzQVJNLnRkCkBAIC0wLDAgKzEsNzE2IEBACisvLz09PS0gSW50cmluc2ljc0FSTS50ZCAtIERlZmluZXMgQVJNIGludHJpbnNpY3MgLS0tLS0tLS0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFsbCBvZiB0aGUgQVJNLXNwZWNpZmljIGludHJpbnNpY3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVExTCisKK2xldCBUYXJnZXRQcmVmaXggPSAiYXJtIiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLmFybS4iLgorCisvLyBBIHNwYWNlLWNvbnN1bWluZyBpbnRyaW5zaWMgcHJpbWFyaWx5IGZvciB0ZXN0aW5nIEFSTUNvbnN0YW50SXNsYW5kcy4gVGhlCisvLyBmaXJzdCBhcmd1bWVudCBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoaXMgImluc3RydWN0aW9uIiB0YWtlcyB1cCwgdGhlIHNlY29uZAorLy8gYW5kIHJldHVybiB2YWx1ZSBhcmUgZXNzZW50aWFsbHkgY2hhaW5zLCB1c2VkIHRvIGZvcmNlIG9yZGVyaW5nIGR1cmluZyBJU2VsLgorZGVmIGludF9hcm1fc3BhY2UgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKworLy8gMTYtYml0IG11bHRpcGxpY2F0aW9ucworZGVmIGludF9hcm1fc211bGJiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zbXVsYmIiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3NtdWxidCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc211bGJ0Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9zbXVsdGIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NtdWx0YiI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fc211bHR0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zbXVsdHQiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3NtdWx3YiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc211bHdiIj4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9zbXVsd3QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NtdWx3dCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU2F0dXJhdGluZyBBcml0aG1ldGljCisKK2RlZiBpbnRfYXJtX3FhZGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3FhZGQiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3FzdWIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3FzdWIiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3NzYXQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NzYXQiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3VzYXQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3VzYXQiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8gQWNjdW11bGF0aW5nIG11bHRpcGxpY2F0aW9ucworZGVmIGludF9hcm1fc21sYWJiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zbWxhYmIiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3NtbGFidCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc21sYWJ0Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9zbWxhdGIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NtbGF0YiI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fc21sYXR0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zbWxhdHQiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3NtbGF3YiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc21sYXdiIj4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9zbWxhd3QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NtbGF3dCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgW0ludHJOb01lbV0+OworCisvLyBQYXJhbGxlbCAxNi1iaXQgc2F0dXJhdGlvbgorZGVmIGludF9hcm1fc3NhdDE2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zc2F0MTYiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3VzYXQxNiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fdXNhdDE2Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKy8vIFBhY2tpbmcgYW5kIHVucGFja2luZworZGVmIGludF9hcm1fc3h0YWIxNiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc3h0YWIxNiI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fc3h0YjE2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zeHRiMTYiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fdXh0YWIxNiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fdXh0YWIxNiI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fdXh0YjE2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV91eHRiMTYiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisvLyBQYXJhbGxlbCBzZWxlY3Rpb24sIHJlYWRzIHRoZSBHRSBmbGFncy4KK2RlZiBpbnRfYXJtX3NlbCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc2VsIj4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50clJlYWRNZW1dPjsKKworLy8gUGFyYWxsZWwgOC1iaXQgYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uCitkZWYgaW50X2FybV9xYWRkOCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3FhZGQ4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9xc3ViOCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3FzdWI4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisvLyBXcml0ZXMgdG8gdGhlIEdFIGJpdHMuCitkZWYgaW50X2FybV9zYWRkOCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NhZGQ4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X2FybV9zaGFkZDggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zaGFkZDgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3Noc3ViOCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3Noc3ViOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworLy8gV3JpdGVzIHRvIHRoZSBHRSBiaXRzLgorZGVmIGludF9hcm1fc3N1YjggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zc3ViOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworLy8gV3JpdGVzIHRvIHRoZSBHRSBiaXRzLgorZGVmIGludF9hcm1fdWFkZDggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV91YWRkOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworZGVmIGludF9hcm1fdWhhZGQ4ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fdWhhZGQ4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV91aHN1YjggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV91aHN1YjgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3VxYWRkOCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3VxYWRkOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fdXFzdWI4ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fdXFzdWI4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisvLyBXcml0ZXMgdG8gdGhlIEdFIGJpdHMuCitkZWYgaW50X2FybV91c3ViOCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3VzdWI4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisKKy8vIFN1bSBvZiA4LWJpdCBhYnNvbHV0ZSBkaWZmZXJlbmNlcworZGVmIGludF9hcm1fdXNhZDggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV91c2FkOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fdXNhZGE4ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fdXNhZGE4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLyBQYXJhbGxlbCAxNi1iaXQgYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uCitkZWYgaW50X2FybV9xYWRkMTYgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9xYWRkMTYiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3Fhc3ggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9xYXN4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9xc2F4ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fcXNheCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fcXN1YjE2ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fcXN1YjE2Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisvLyBXcml0ZXMgdG8gdGhlIEdFIGJpdHMuCitkZWYgaW50X2FybV9zYWRkMTYgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zYWRkMTYiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKy8vIFdyaXRlcyB0byB0aGUgR0UgYml0cy4KK2RlZiBpbnRfYXJtX3Nhc3ggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zYXN4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X2FybV9zaGFkZDE2ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc2hhZGQxNiI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fc2hhc3ggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zaGFzeCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fc2hzYXggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zaHNheCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fc2hzdWIxNiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3Noc3ViMTYiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKy8vIFdyaXRlcyB0byB0aGUgR0UgYml0cy4KK2RlZiBpbnRfYXJtX3NzYXggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zc2F4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisvLyBXcml0ZXMgdG8gdGhlIEdFIGJpdHMuCitkZWYgaW50X2FybV9zc3ViMTYgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zc3ViMTYiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKy8vIFdyaXRlcyB0byB0aGUgR0UgYml0cy4KK2RlZiBpbnRfYXJtX3VhZGQxNiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3VhZGQxNiI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworLy8gV3JpdGVzIHRvIHRoZSBHRSBiaXRzLgorZGVmIGludF9hcm1fdWFzeCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3Vhc3giPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKK2RlZiBpbnRfYXJtX3VoYWRkMTYgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV91aGFkZDE2Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV91aGFzeCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3VoYXN4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV91aHNheCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3Voc2F4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV91aHN1YjE2ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fdWhzdWIxNiI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fdXFhZGQxNiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3VxYWRkMTYiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3VxYXN4ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fdXFhc3giPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3Vxc2F4ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fdXFzYXgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3Vxc3ViMTYgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV91cXN1YjE2Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisvLyBXcml0ZXMgdG8gdGhlIEdFIGJpdHMuCitkZWYgaW50X2FybV91c2F4ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fdXNheCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworLy8gV3JpdGVzIHRvIHRoZSBHRSBiaXRzLgorZGVmIGludF9hcm1fdXN1YjE2ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fdXN1YjE2Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisKKy8vIFBhcmFsbGVsIDE2LWJpdCBtdWx0aXBsaWNhdGlvbgorZGVmIGludF9hcm1fc21sYWQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NtbGFkIj4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fc21sYWR4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zbWxhZHgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9zbWxhbGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NtbGFsZCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3NtbGFsZHggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NtbGFsZHgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9zbWxzZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc21sc2QiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9zbWxzZHggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3NtbHNkeCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3NtbHNsZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc21sc2xkIj4sCisgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fc21sc2xkeCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc21sc2xkeCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3NtdWFkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zbXVhZCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fc211YWR4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zbXVhZHgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX3NtdXNkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zbXVzZCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fc211c2R4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zbXVzZHgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTG9hZCwgU3RvcmUgYW5kIENsZWFyIGV4Y2x1c2l2ZQorCitkZWYgaW50X2FybV9sZHJleCA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9hbnlwdHJfdHldPjsKK2RlZiBpbnRfYXJtX3N0cmV4IDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9hbnlwdHJfdHldPjsKKworZGVmIGludF9hcm1fbGRhZXggOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fYW55cHRyX3R5XT47CitkZWYgaW50X2FybV9zdGxleCA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1fYW55cHRyX3R5XT47CisKK2RlZiBpbnRfYXJtX2NscmV4IDogSW50cmluc2ljPFtdPjsKKworZGVmIGludF9hcm1fc3RyZXhkIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgbGx2bV9wdHJfdHldPjsKK2RlZiBpbnRfYXJtX2xkcmV4ZCA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW2xsdm1fcHRyX3R5XT47CisKK2RlZiBpbnRfYXJtX3N0bGV4ZCA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1fcHRyX3R5XT47CitkZWYgaW50X2FybV9sZGFleGQgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtsbHZtX3B0cl90eV0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRGF0YSBiYXJyaWVyIGluc3RydWN0aW9ucworZGVmIGludF9hcm1fZG1iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9kbWIiPiwgTVNCdWlsdGluPCJfX2RtYiI+LAorICAgICAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHldPjsKK2RlZiBpbnRfYXJtX2RzYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fZHNiIj4sIE1TQnVpbHRpbjwiX19kc2IiPiwKKyAgICAgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XT47CitkZWYgaW50X2FybV9pc2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX2lzYiI+LCBNU0J1aWx0aW48Il9faXNiIj4sCisgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVkZQCisKK2RlZiBpbnRfYXJtX2dldF9mcHNjciA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fZ2V0X2Zwc2NyIj4sCisgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW10+OworZGVmIGludF9hcm1fc2V0X2Zwc2NyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9zZXRfZnBzY3IiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X2FybV92Y3Z0ciAgICAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9hbnlmbG9hdF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fdmN2dHJ1ICAgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fYW55ZmxvYXRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENvcHJvY2Vzc29yCisKK2RlZiBpbnRfYXJtX2xkYyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fbGRjIj4sCisgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1fcHRyX3R5XSwgW10+OworZGVmIGludF9hcm1fbGRjbCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fbGRjbCI+LAorICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3B0cl90eV0sIFtdPjsKK2RlZiBpbnRfYXJtX2xkYzIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX2xkYzIiPiwKKyAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9wdHJfdHldLCBbXT47CitkZWYgaW50X2FybV9sZGMybCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fbGRjMmwiPiwKKyAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9wdHJfdHldLCBbXT47CisKK2RlZiBpbnRfYXJtX3N0YyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc3RjIj4sCisgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1fcHRyX3R5XSwgW10+OworZGVmIGludF9hcm1fc3RjbCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fc3RjbCI+LAorICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3B0cl90eV0sIFtdPjsKK2RlZiBpbnRfYXJtX3N0YzIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3N0YzIiPiwgCisgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1fcHRyX3R5XSwgW10+OworZGVmIGludF9hcm1fc3RjMmwgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX3N0YzJsIj4sCisgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1fcHRyX3R5XSwgW10+OworCisvLyBNb3ZlIHRvIGNvcHJvY2Vzc29yCitkZWYgaW50X2FybV9tY3IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX21jciI+LAorICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X2FybV9tY3IyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9tY3IyIj4sCisgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKworLy8gTW92ZSBmcm9tIGNvcHJvY2Vzc29yCitkZWYgaW50X2FybV9tcmMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX21yYyI+LAorICAgICAgICAgICAgICAgICAgTVNCdWlsdGluPCJfTW92ZUZyb21Db3Byb2Nlc3NvciI+LAorICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X2FybV9tcmMyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FybV9tcmMyIj4sCisgICAgICAgICAgICAgICAgICAgTVNCdWlsdGluPCJfTW92ZUZyb21Db3Byb2Nlc3NvcjIiPiwKKyAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworCisvLyBDb3Byb2Nlc3NvciBkYXRhIHByb2Nlc3NpbmcKK2RlZiBpbnRfYXJtX2NkcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hcm1fY2RwIj4sCisgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKK2RlZiBpbnRfYXJtX2NkcDIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYXJtX2NkcDIiPiwKKyAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworCisvLyBNb3ZlIGZyb20gdHdvIHJlZ2lzdGVycyB0byBjb3Byb2Nlc3NvcgorZGVmIGludF9hcm1fbWNyciA6IEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworZGVmIGludF9hcm1fbWNycjIgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisKK2RlZiBpbnRfYXJtX21ycmMgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKK2RlZiBpbnRfYXJtX21ycmMyIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ1JDMzIKKworZGVmIGludF9hcm1fY3JjMzJiICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9jcmMzMmNiIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX2NyYzMyaCAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fY3JjMzJjaCA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X2FybV9jcmMzMncgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX2NyYzMyY3cgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgW0ludHJOb01lbV0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSElOVAorCitkZWYgaW50X2FybV9oaW50IDogSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHldPjsKK2RlZiBpbnRfYXJtX2RiZyA6IEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBVTkQgKHJlc2VydmVkIHVuZGVmaW5lZCBzZXF1ZW5jZSkKKworZGVmIGludF9hcm1fdW5kZWZpbmVkIDogSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHldPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFkdmFuY2VkIFNJTUQgKE5FT04pCisKKy8vIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyBkbyBub3QgY29ycmVzcG9uZCBkaXJlY3RseSB0byBHQ0MgYnVpbHRpbnMuCitjbGFzcyBOZW9uXzFBcmdfSW50cmluc2ljCisgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+XSwgW0ludHJOb01lbV0+OworY2xhc3MgTmVvbl8xQXJnX05hcnJvd19JbnRyaW5zaWMKKyAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwgW0xMVk1FeHRlbmRlZFR5cGU8MD5dLCBbSW50ck5vTWVtXT47CitjbGFzcyBOZW9uXzJBcmdfSW50cmluc2ljCisgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sIFtMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworY2xhc3MgTmVvbl8yQXJnX05hcnJvd19JbnRyaW5zaWMKKyAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwgW0xMVk1FeHRlbmRlZFR5cGU8MD4sIExMVk1FeHRlbmRlZFR5cGU8MD5dLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitjbGFzcyBOZW9uXzJBcmdfTG9uZ19JbnRyaW5zaWMKKyAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwgW0xMVk1UcnVuY2F0ZWRUeXBlPDA+LCBMTFZNVHJ1bmNhdGVkVHlwZTwwPl0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2NsYXNzIE5lb25fM0FyZ19JbnRyaW5zaWMKKyAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitjbGFzcyBOZW9uXzNBcmdfTG9uZ19JbnRyaW5zaWMKKyAgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1UcnVuY2F0ZWRUeXBlPDA+LCBMTFZNVHJ1bmNhdGVkVHlwZTwwPl0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2NsYXNzIE5lb25fQ3Z0RnhUb0ZQX0ludHJpbnNpYworICA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sIFtsbHZtX2FueWludF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitjbGFzcyBOZW9uX0N2dEZQVG9GeF9JbnRyaW5zaWMKKyAgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwgW2xsdm1fYW55ZmxvYXRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworY2xhc3MgTmVvbl9DdnRGUHRvSW50XzFBcmdfSW50cmluc2ljCisgIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sIFtsbHZtX2FueXZlY3Rvcl90eV0sIFtJbnRyTm9NZW1dPjsKKworY2xhc3MgTmVvbl9Db21wYXJlX0ludHJpbnNpYworICA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLCBbbGx2bV9hbnl2ZWN0b3JfdHksIExMVk1NYXRjaFR5cGU8MT5dLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vIFRoZSB0YWJsZSBvcGVyYW5kcyBmb3IgVlRCTCBhbmQgVlRCWCBjb25zaXN0IG9mIDEgdG8gNCB2OGk4IHZlY3RvcnMuCisvLyBCZXNpZGVzIHRoZSB0YWJsZSwgVlRCTCBoYXMgb25lIG90aGVyIHY4aTggYXJndW1lbnQgYW5kIFZUQlggaGFzIHR3by4KKy8vIE92ZXJhbGwsIHRoZSBjbGFzc2VzIHJhbmdlIGZyb20gMiB0byA2IHY4aTggYXJndW1lbnRzLgorY2xhc3MgTmVvbl9UYmwyQXJnX0ludHJpbnNpYworICA6IEludHJpbnNpYzxbbGx2bV92OGk4X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1fdjhpOF90eSwgbGx2bV92OGk4X3R5XSwgW0ludHJOb01lbV0+OworY2xhc3MgTmVvbl9UYmwzQXJnX0ludHJpbnNpYworICA6IEludHJpbnNpYzxbbGx2bV92OGk4X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1fdjhpOF90eSwgbGx2bV92OGk4X3R5LCBsbHZtX3Y4aThfdHldLCBbSW50ck5vTWVtXT47CitjbGFzcyBOZW9uX1RibDRBcmdfSW50cmluc2ljCisgIDogSW50cmluc2ljPFtsbHZtX3Y4aThfdHldLAorICAgICAgICAgICAgICBbbGx2bV92OGk4X3R5LCBsbHZtX3Y4aThfdHksIGxsdm1fdjhpOF90eSwgbGx2bV92OGk4X3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworY2xhc3MgTmVvbl9UYmw1QXJnX0ludHJpbnNpYworICA6IEludHJpbnNpYzxbbGx2bV92OGk4X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1fdjhpOF90eSwgbGx2bV92OGk4X3R5LCBsbHZtX3Y4aThfdHksIGxsdm1fdjhpOF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fdjhpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2NsYXNzIE5lb25fVGJsNkFyZ19JbnRyaW5zaWMKKyAgOiBJbnRyaW5zaWM8W2xsdm1fdjhpOF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX3Y4aThfdHksIGxsdm1fdjhpOF90eSwgbGx2bV92OGk4X3R5LCBsbHZtX3Y4aThfdHksCisgICAgICAgICAgICAgICBsbHZtX3Y4aThfdHksIGxsdm1fdjhpOF90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8gQXJpdGhtZXRpYyBvcHMKKworbGV0IEludHJQcm9wZXJ0aWVzID0gW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdIGluIHsKKworICAvLyBWZWN0b3IgQWRkLgorICBkZWYgaW50X2FybV9uZW9uX3ZoYWRkcyA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdmhhZGR1IDogTmVvbl8yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hcm1fbmVvbl92cmhhZGRzIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hcm1fbmVvbl92cmhhZGR1IDogTmVvbl8yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hcm1fbmVvbl92cWFkZHMgOiBOZW9uXzJBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FybV9uZW9uX3ZxYWRkdSA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdnJhZGRobiA6IE5lb25fMkFyZ19OYXJyb3dfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBNdWx0aXBseS4KKyAgZGVmIGludF9hcm1fbmVvbl92bXVscCA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdnFkbXVsaCA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdnFyZG11bGggOiBOZW9uXzJBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FybV9uZW9uX3ZtdWxscyA6IE5lb25fMkFyZ19Mb25nX0ludHJpbnNpYzsKKyAgZGVmIGludF9hcm1fbmVvbl92bXVsbHUgOiBOZW9uXzJBcmdfTG9uZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdm11bGxwIDogTmVvbl8yQXJnX0xvbmdfSW50cmluc2ljOworICBkZWYgaW50X2FybV9uZW9uX3ZxZG11bGwgOiBOZW9uXzJBcmdfTG9uZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIE1heGltdW0uCisgIGRlZiBpbnRfYXJtX25lb25fdm1heHMgOiBOZW9uXzJBcmdfSW50cmluc2ljOworICBkZWYgaW50X2FybV9uZW9uX3ZtYXh1IDogTmVvbl8yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hcm1fbmVvbl92bWF4bm0gOiBOZW9uXzJBcmdfSW50cmluc2ljOworCisgIC8vIFZlY3RvciBNaW5pbXVtLgorICBkZWYgaW50X2FybV9uZW9uX3ZtaW5zIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKKyAgZGVmIGludF9hcm1fbmVvbl92bWludSA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisgIGRlZiBpbnRfYXJtX25lb25fdm1pbm5tIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKKworICAvLyBWZWN0b3IgUmVjaXByb2NhbCBTdGVwLgorICBkZWYgaW50X2FybV9uZW9uX3ZyZWNwcyA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CisKKyAgLy8gVmVjdG9yIFJlY2lwcm9jYWwgU3F1YXJlIFJvb3QgU3RlcC4KKyAgZGVmIGludF9hcm1fbmVvbl92cnNxcnRzIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKK30KKworLy8gVmVjdG9yIFN1YnRyYWN0LgorZGVmIGludF9hcm1fbmVvbl92aHN1YnMgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92aHN1YnUgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cXN1YnMgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cXN1YnUgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cnN1YmhuIDogTmVvbl8yQXJnX05hcnJvd19JbnRyaW5zaWM7CisKKy8vIFZlY3RvciBBYnNvbHV0ZSBDb21wYXJlLgorZGVmIGludF9hcm1fbmVvbl92YWNnZSA6IE5lb25fQ29tcGFyZV9JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZhY2d0IDogTmVvbl9Db21wYXJlX0ludHJpbnNpYzsKKworLy8gVmVjdG9yIEFic29sdXRlIERpZmZlcmVuY2VzLgorZGVmIGludF9hcm1fbmVvbl92YWJkcyA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZhYmR1IDogTmVvbl8yQXJnX0ludHJpbnNpYzsKKworLy8gVmVjdG9yIFBhaXJ3aXNlIEFkZC4KK2RlZiBpbnRfYXJtX25lb25fdnBhZGQgOiBOZW9uXzJBcmdfSW50cmluc2ljOworCisvLyBWZWN0b3IgUGFpcndpc2UgQWRkIExvbmcuCisvLyBOb3RlOiBUaGlzIGlzIGRpZmZlcmVudCB0aGFuIHRoZSBvdGhlciAibG9uZyIgTkVPTiBpbnRyaW5zaWNzIGJlY2F1c2UKKy8vIHRoZSByZXN1bHQgdmVjdG9yIGhhcyBoYWxmIGFzIG1hbnkgZWxlbWVudHMgYXMgdGhlIHNvdXJjZSB2ZWN0b3IuCisvLyBUaGUgc291cmNlIGFuZCBkZXN0aW5hdGlvbiB2ZWN0b3IgdHlwZXMgbXVzdCBiZSBzcGVjaWZpZWQgc2VwYXJhdGVseS4KK2RlZiBpbnRfYXJtX25lb25fdnBhZGRscyA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLCBbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX25lb25fdnBhZGRsdSA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLCBbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8gVmVjdG9yIFBhaXJ3aXNlIEFkZCBhbmQgQWNjdW11bGF0ZSBMb25nLgorLy8gTm90ZTogVGhpcyBpcyBzaW1pbGFyIHRvIHZwYWRkbCBidXQgdGhlIGRlc3RpbmF0aW9uIHZlY3RvciBhbHNvIGFwcGVhcnMKKy8vIGFzIHRoZSBmaXJzdCBhcmd1bWVudC4KK2RlZiBpbnRfYXJtX25lb25fdnBhZGFscyA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtMTFZNTWF0Y2hUeXBlPDA+LCBsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9hcm1fbmVvbl92cGFkYWx1IDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD4sIGxsdm1fYW55dmVjdG9yX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vIFZlY3RvciBQYWlyd2lzZSBNYXhpbXVtIGFuZCBNaW5pbXVtLgorZGVmIGludF9hcm1fbmVvbl92cG1heHMgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cG1heHUgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cG1pbnMgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cG1pbnUgOiBOZW9uXzJBcmdfSW50cmluc2ljOworCisvLyBWZWN0b3IgU2hpZnRzOgorLy8KKy8vIFRoZSB2YXJpb3VzIHNhdHVyYXRpbmcgYW5kIHJvdW5kaW5nIHZlY3RvciBzaGlmdCBvcGVyYXRpb25zIG5lZWQgdG8gYmUKKy8vIHJlcHJlc2VudGVkIGJ5IGludHJpbnNpY3MgaW4gTExWTSwgYW5kIGV2ZW4gdGhlIGJhc2ljIFZTSEwgdmFyaWFibGUgc2hpZnQKKy8vIG9wZXJhdGlvbiBjYW5ub3QgYmUgc2FmZWx5IHRyYW5zbGF0ZWQgdG8gTExWTSdzIHNoaWZ0IG9wZXJhdG9ycy4gIFZTSEwgY2FuCisvLyBiZSB1c2VkIGZvciBib3RoIGxlZnQgYW5kIHJpZ2h0IHNoaWZ0cywgb3IgZXZlbiBjb21iaW5hdGlvbnMgb2YgdGhlIHR3bywKKy8vIGRlcGVuZGluZyBvbiB0aGUgc2lnbnMgb2YgdGhlIHNoaWZ0IGFtb3VudHMuICBJdCBhbHNvIGhhcyB3ZWxsLWRlZmluZWQKKy8vIGJlaGF2aW9yIGZvciBzaGlmdCBhbW91bnRzIHRoYXQgTExWTSBsZWF2ZXMgdW5kZWZpbmVkLiAgT25seSBiYXNpYyBzaGlmdHMKKy8vIGJ5IGNvbnN0YW50cyBjYW4gYmUgcmVwcmVzZW50ZWQgd2l0aCBMTFZNJ3Mgc2hpZnQgb3BlcmF0b3JzLgorLy8KKy8vIFRoZSBzaGlmdCBjb3VudHMgZm9yIHRoZXNlIGludHJpbnNpY3MgYXJlIGFsd2F5cyB2ZWN0b3JzLCBldmVuIGZvciBjb25zdGFudAorLy8gc2hpZnRzLCB3aGVyZSB0aGUgY29uc3RhbnQgaXMgcmVwbGljYXRlZC4gIEZvciBjb25zaXN0ZW5jeSB3aXRoIFZTSEwgKGFuZAorLy8gb3RoZXIgdmFyaWFibGUgc2hpZnQgaW5zdHJ1Y3Rpb25zKSwgbGVmdCBzaGlmdHMgaGF2ZSBwb3NpdGl2ZSBzaGlmdCBjb3VudHMKKy8vIGFuZCByaWdodCBzaGlmdHMgaGF2ZSBuZWdhdGl2ZSBzaGlmdCBjb3VudHMuICBUaGlzIGNvbnZlbnRpb24gaXMgYWxzbyB1c2VkCisvLyBmb3IgY29uc3RhbnQgcmlnaHQgc2hpZnQgaW50cmluc2ljcywgYW5kIHRvIGhlbHAgcHJlc2VydmUgc2FuaXR5LCB0aGUKKy8vIGludHJpbnNpYyBuYW1lcyB1c2UgInNoaWZ0IiBpbnN0ZWFkIG9mIGVpdGhlciAic2hsIiBvciAic2hyIi4gIFdoZXJlCisvLyBhcHBsaWNhYmxlLCBzaWduZWQgYW5kIHVuc2lnbmVkIHZlcnNpb25zIG9mIHRoZSBpbnRyaW5zaWNzIGFyZQorLy8gZGlzdGluZ3Vpc2hlZCB3aXRoICJzIiBhbmQgInUiIHN1ZmZpeGVzLiAgQSBmZXcgTkVPTiBzaGlmdCBpbnN0cnVjdGlvbnMsCisvLyBzdWNoIGFzIFZRU0hMVSwgdGFrZSBzaWduZWQgb3BlcmFuZHMgYnV0IHByb2R1Y2UgdW5zaWduZWQgcmVzdWx0czsgdGhlc2UKKy8vIHVzZSBhICJzdSIgc3VmZml4LgorCisvLyBWZWN0b3IgU2hpZnQuCitkZWYgaW50X2FybV9uZW9uX3ZzaGlmdHMgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92c2hpZnR1IDogTmVvbl8yQXJnX0ludHJpbnNpYzsKKworLy8gVmVjdG9yIFJvdW5kaW5nIFNoaWZ0LgorZGVmIGludF9hcm1fbmVvbl92cnNoaWZ0cyA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3Zyc2hpZnR1IDogTmVvbl8yQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnJzaGlmdG4gOiBOZW9uXzJBcmdfTmFycm93X0ludHJpbnNpYzsKKworLy8gVmVjdG9yIFNhdHVyYXRpbmcgU2hpZnQuCitkZWYgaW50X2FybV9uZW9uX3Zxc2hpZnRzIDogTmVvbl8yQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnFzaGlmdHUgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cXNoaWZ0c3UgOiBOZW9uXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cXNoaWZ0bnMgOiBOZW9uXzJBcmdfTmFycm93X0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnFzaGlmdG51IDogTmVvbl8yQXJnX05hcnJvd19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3Zxc2hpZnRuc3UgOiBOZW9uXzJBcmdfTmFycm93X0ludHJpbnNpYzsKKworLy8gVmVjdG9yIFNhdHVyYXRpbmcgUm91bmRpbmcgU2hpZnQuCitkZWYgaW50X2FybV9uZW9uX3ZxcnNoaWZ0cyA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZxcnNoaWZ0dSA6IE5lb25fMkFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZxcnNoaWZ0bnMgOiBOZW9uXzJBcmdfTmFycm93X0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnFyc2hpZnRudSA6IE5lb25fMkFyZ19OYXJyb3dfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92cXJzaGlmdG5zdSA6IE5lb25fMkFyZ19OYXJyb3dfSW50cmluc2ljOworCisvLyBWZWN0b3IgU2hpZnQgYW5kIEluc2VydC4KK2RlZiBpbnRfYXJtX25lb25fdnNoaWZ0aW5zIDogTmVvbl8zQXJnX0ludHJpbnNpYzsKKworLy8gVmVjdG9yIEFic29sdXRlIFZhbHVlIGFuZCBTYXR1cmF0aW5nIEFic29sdXRlIFZhbHVlLgorZGVmIGludF9hcm1fbmVvbl92YWJzIDogTmVvbl8xQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnFhYnMgOiBOZW9uXzFBcmdfSW50cmluc2ljOworCisvLyBWZWN0b3IgU2F0dXJhdGluZyBOZWdhdGUuCitkZWYgaW50X2FybV9uZW9uX3ZxbmVnIDogTmVvbl8xQXJnX0ludHJpbnNpYzsKKworLy8gVmVjdG9yIENvdW50IExlYWRpbmcgU2lnbi9aZXJvIEJpdHMuCitkZWYgaW50X2FybV9uZW9uX3ZjbHMgOiBOZW9uXzFBcmdfSW50cmluc2ljOworCisvLyBWZWN0b3IgUmVjaXByb2NhbCBFc3RpbWF0ZS4KK2RlZiBpbnRfYXJtX25lb25fdnJlY3BlIDogTmVvbl8xQXJnX0ludHJpbnNpYzsKKworLy8gVmVjdG9yIFJlY2lwcm9jYWwgU3F1YXJlIFJvb3QgRXN0aW1hdGUuCitkZWYgaW50X2FybV9uZW9uX3Zyc3FydGUgOiBOZW9uXzFBcmdfSW50cmluc2ljOworCisvLyBWZWN0b3IgQ29udmVyc2lvbnMgQmV0d2VlbiBGbG9hdGluZy1wb2ludCBhbmQgSW50ZWdlcgorZGVmIGludF9hcm1fbmVvbl92Y3Z0YXUgOiBOZW9uX0N2dEZQdG9JbnRfMUFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZjdnRhcyA6IE5lb25fQ3Z0RlB0b0ludF8xQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdmN2dG51IDogTmVvbl9DdnRGUHRvSW50XzFBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92Y3Z0bnMgOiBOZW9uX0N2dEZQdG9JbnRfMUFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZjdnRwdSA6IE5lb25fQ3Z0RlB0b0ludF8xQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdmN2dHBzIDogTmVvbl9DdnRGUHRvSW50XzFBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92Y3Z0bXUgOiBOZW9uX0N2dEZQdG9JbnRfMUFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZjdnRtcyA6IE5lb25fQ3Z0RlB0b0ludF8xQXJnX0ludHJpbnNpYzsKKworLy8gVmVjdG9yIENvbnZlcnNpb25zIEJldHdlZW4gRmxvYXRpbmctcG9pbnQgYW5kIEZpeGVkLXBvaW50LgorZGVmIGludF9hcm1fbmVvbl92Y3Z0ZnAyZnhzIDogTmVvbl9DdnRGUFRvRnhfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92Y3Z0ZnAyZnh1IDogTmVvbl9DdnRGUFRvRnhfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92Y3Z0ZnhzMmZwIDogTmVvbl9DdnRGeFRvRlBfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92Y3Z0Znh1MmZwIDogTmVvbl9DdnRGeFRvRlBfSW50cmluc2ljOworCisvLyBWZWN0b3IgQ29udmVyc2lvbnMgQmV0d2VlbiBIYWxmLVByZWNpc2lvbiBhbmQgU2luZ2xlLVByZWNpc2lvbi4KK2RlZiBpbnRfYXJtX25lb25fdmN2dGZwMmhmCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fdjRpMTZfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfYXJtX25lb25fdmN2dGhmMmZwCisgICAgOiBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8gTmFycm93aW5nIFNhdHVyYXRpbmcgVmVjdG9yIE1vdmVzLgorZGVmIGludF9hcm1fbmVvbl92cW1vdm5zIDogTmVvbl8xQXJnX05hcnJvd19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3ZxbW92bnUgOiBOZW9uXzFBcmdfTmFycm93X0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnFtb3Zuc3UgOiBOZW9uXzFBcmdfTmFycm93X0ludHJpbnNpYzsKKworLy8gVmVjdG9yIFRhYmxlIExvb2t1cC4KKy8vIFRoZSBmaXJzdCAxLTQgYXJndW1lbnRzIGFyZSB0aGUgdGFibGUuCitkZWYgaW50X2FybV9uZW9uX3Z0YmwxIDogTmVvbl9UYmwyQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnRibDIgOiBOZW9uX1RibDNBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92dGJsMyA6IE5lb25fVGJsNEFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3Z0Ymw0IDogTmVvbl9UYmw1QXJnX0ludHJpbnNpYzsKKworLy8gVmVjdG9yIFRhYmxlIEV4dGVuc2lvbi4KKy8vIFNvbWUgZWxlbWVudHMgb2YgdGhlIGRlc3RpbmF0aW9uIHZlY3RvciBtYXkgbm90IGJlIHVwZGF0ZWQsIHNvIHRoZSBvcmlnaW5hbAorLy8gdmFsdWUgb2YgdGhhdCB2ZWN0b3IgaXMgcGFzc2VkIGFzIHRoZSBmaXJzdCBhcmd1bWVudC4gIFRoZSBuZXh0IDEtNAorLy8gYXJndW1lbnRzIGFmdGVyIHRoYXQgYXJlIHRoZSB0YWJsZS4KK2RlZiBpbnRfYXJtX25lb25fdnRieDEgOiBOZW9uX1RibDNBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl92dGJ4MiA6IE5lb25fVGJsNEFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3Z0YngzIDogTmVvbl9UYmw1QXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnRieDQgOiBOZW9uX1RibDZBcmdfSW50cmluc2ljOworCisvLyBWZWN0b3IgUm91bmRpbmcKK2RlZiBpbnRfYXJtX25lb25fdnJpbnRuIDogTmVvbl8xQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnJpbnR4IDogTmVvbl8xQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnJpbnRhIDogTmVvbl8xQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnJpbnR6IDogTmVvbl8xQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnJpbnRtIDogTmVvbl8xQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fdnJpbnRwIDogTmVvbl8xQXJnX0ludHJpbnNpYzsKKworLy8gRGUtaW50ZXJsZWF2aW5nIHZlY3RvciBsb2FkcyBmcm9tIE4tZWxlbWVudCBzdHJ1Y3R1cmVzLgorLy8gU291cmNlIG9wZXJhbmRzIGFyZSB0aGUgYWRkcmVzcyBhbmQgYWxpZ25tZW50LgorZGVmIGludF9hcm1fbmVvbl92bGQxIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55cHRyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworZGVmIGludF9hcm1fbmVvbl92bGQyIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eSwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55cHRyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworZGVmIGludF9hcm1fbmVvbl92bGQzIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eSwgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55cHRyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworZGVmIGludF9hcm1fbmVvbl92bGQ0IDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eSwgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPiwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55cHRyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisvLyBWZWN0b3IgbG9hZCBOLWVsZW1lbnQgc3RydWN0dXJlIHRvIG9uZSBsYW5lLgorLy8gU291cmNlIG9wZXJhbmRzIGFyZTogdGhlIGFkZHJlc3MsIHRoZSBOIGlucHV0IHZlY3RvcnMgKHNpbmNlIG9ubHkgb25lCisvLyBsYW5lIGlzIGFzc2lnbmVkKSwgdGhlIGxhbmUgbnVtYmVyLCBhbmQgdGhlIGFsaWdubWVudC4KK2RlZiBpbnRfYXJtX25lb25fdmxkMmxhbmUgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5LCBMTFZNTWF0Y2hUeXBlPDA+XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55cHRyX3R5LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPiwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfYXJtX25lb25fdmxkM2xhbmUgOiBJbnRyaW5zaWM8W2xsdm1fYW55dmVjdG9yX3R5LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueXB0cl90eSwgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CitkZWYgaW50X2FybV9uZW9uX3ZsZDRsYW5lIDogSW50cmluc2ljPFtsbHZtX2FueXZlY3Rvcl90eSwgTExWTU1hdGNoVHlwZTwwPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHksIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDA+LCBMTFZNTWF0Y2hUeXBlPDA+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwwPiwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworLy8gSW50ZXJsZWF2aW5nIHZlY3RvciBzdG9yZXMgZnJvbSBOLWVsZW1lbnQgc3RydWN0dXJlcy4KKy8vIFNvdXJjZSBvcGVyYW5kcyBhcmU6IHRoZSBhZGRyZXNzLCB0aGUgTiB2ZWN0b3JzLCBhbmQgdGhlIGFsaWdubWVudC4KK2RlZiBpbnRfYXJtX25lb25fdnN0MSA6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHksIGxsdm1fYW55dmVjdG9yX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyQXJnTWVtT25seV0+OworZGVmIGludF9hcm1fbmVvbl92c3QyIDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueXB0cl90eSwgbGx2bV9hbnl2ZWN0b3JfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MT4sIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfYXJtX25lb25fdnN0MyA6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHksIGxsdm1fYW55dmVjdG9yX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDE+LCBMTFZNTWF0Y2hUeXBlPDE+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyQXJnTWVtT25seV0+OworZGVmIGludF9hcm1fbmVvbl92c3Q0IDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueXB0cl90eSwgbGx2bV9hbnl2ZWN0b3JfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MT4sIExMVk1NYXRjaFR5cGU8MT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MT4sIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKworLy8gVmVjdG9yIHN0b3JlIE4tZWxlbWVudCBzdHJ1Y3R1cmUgZnJvbSBvbmUgbGFuZS4KKy8vIFNvdXJjZSBvcGVyYW5kcyBhcmU6IHRoZSBhZGRyZXNzLCB0aGUgTiB2ZWN0b3JzLCB0aGUgbGFuZSBudW1iZXIsIGFuZAorLy8gdGhlIGFsaWdubWVudC4KK2RlZiBpbnRfYXJtX25lb25fdnN0MmxhbmUgOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueXB0cl90eSwgbGx2bV9hbnl2ZWN0b3JfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDE+LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CitkZWYgaW50X2FybV9uZW9uX3ZzdDNsYW5lIDogSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHksIGxsdm1fYW55dmVjdG9yX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTU1hdGNoVHlwZTwxPiwgTExWTU1hdGNoVHlwZTwxPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworZGVmIGludF9hcm1fbmVvbl92c3Q0bGFuZSA6IEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fYW55cHRyX3R5LCBsbHZtX2FueXZlY3Rvcl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MT4sIExMVk1NYXRjaFR5cGU8MT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMTFZNTWF0Y2hUeXBlPDE+LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisKKy8vIFZlY3RvciBiaXR3aXNlIHNlbGVjdC4KK2RlZiBpbnRfYXJtX25lb25fdmJzbCA6IEludHJpbnNpYzxbbGx2bV9hbnl2ZWN0b3JfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0xMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD4sIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisKKy8vIENyeXB0byBpbnN0cnVjdGlvbnMKK2NsYXNzIEFFU18xQXJnX0ludHJpbnNpYyA6IEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitjbGFzcyBBRVNfMkFyZ19JbnRyaW5zaWMgOiBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK2NsYXNzIFNIQV8xQXJnX0ludHJpbnNpYyA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2NsYXNzIFNIQV8yQXJnX0ludHJpbnNpYyA6IEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2NsYXNzIFNIQV8zQXJnX2kzMl9JbnRyaW5zaWMgOiBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitjbGFzcyBTSEFfM0FyZ192NGkzMl9JbnRyaW5zaWMgOiBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSxsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitkZWYgaW50X2FybV9uZW9uX2Flc2QgOiBBRVNfMkFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX2Flc2UgOiBBRVNfMkFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX2Flc2ltYyA6IEFFU18xQXJnX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fYWVzbWMgOiBBRVNfMUFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3NoYTFoIDogU0hBXzFBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl9zaGExc3UxIDogU0hBXzJBcmdfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl9zaGEyNTZzdTAgOiBTSEFfMkFyZ19JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3NoYTFjIDogU0hBXzNBcmdfaTMyX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fc2hhMW0gOiBTSEFfM0FyZ19pMzJfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl9zaGExcCA6IFNIQV8zQXJnX2kzMl9JbnRyaW5zaWM7CitkZWYgaW50X2FybV9uZW9uX3NoYTFzdTA6IFNIQV8zQXJnX3Y0aTMyX0ludHJpbnNpYzsKK2RlZiBpbnRfYXJtX25lb25fc2hhMjU2aDogU0hBXzNBcmdfdjRpMzJfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl9zaGEyNTZoMjogU0hBXzNBcmdfdjRpMzJfSW50cmluc2ljOworZGVmIGludF9hcm1fbmVvbl9zaGEyNTZzdTE6IFNIQV8zQXJnX3Y0aTMyX0ludHJpbnNpYzsKKworfSAvLyBlbmQgVGFyZ2V0UHJlZml4CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NCUEYudGQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NCUEYudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTRlY2E4ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc0JQRi50ZApAQCAtMCwwICsxLDI0IEBACisvLz09PS0gSW50cmluc2ljc0JQRi50ZCAtIERlZmluZXMgQlBGIGludHJpbnNpY3MgLS0tLS0tLS0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFsbCBvZiB0aGUgQlBGLXNwZWNpZmljIGludHJpbnNpY3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gU3BlY2lhbGl6ZWQgbG9hZHMgZnJvbSBwYWNrZXQKK2xldCBUYXJnZXRQcmVmaXggPSAiYnBmIiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLmJwZi4iCisgIGRlZiBpbnRfYnBmX2xvYWRfYnl0ZSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9icGZfbG9hZF9ieXRlIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1faTY0X3R5XSwgW0ludHJSZWFkTWVtXT47CisgIGRlZiBpbnRfYnBmX2xvYWRfaGFsZiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9icGZfbG9hZF9oYWxmIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1faTY0X3R5XSwgW0ludHJSZWFkTWVtXT47CisgIGRlZiBpbnRfYnBmX2xvYWRfd29yZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9icGZfbG9hZF93b3JkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1faTY0X3R5XSwgW0ludHJSZWFkTWVtXT47CisgIGRlZiBpbnRfYnBmX3BzZXVkbyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9icGZfcHNldWRvIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XT47Cit9CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NIZXhhZ29uLnRkIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzSGV4YWdvbi50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNWY0MjE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzSGV4YWdvbi50ZApAQCAtMCwwICsxLDEwOTc1IEBACisvLz09PS0gSW50cmluc2ljc0hleGFnb24udGQgLSBEZWZpbmVzIEhleGFnb24gaW50cmluc2ljcyAtLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYWxsIG9mIHRoZSBIZXhhZ29uLXNwZWNpZmljIGludHJpbnNpY3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIERlZmluaXRpb25zIGZvciBhbGwgSGV4YWdvbiBpbnRyaW5zaWNzLgorLy8KKy8vIEFsbCBIZXhhZ29uIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS5oZXhhZ29uLiIuCitsZXQgVGFyZ2V0UHJlZml4ID0gImhleGFnb24iIGluIHsKKyAgLy8vIEhleGFnb25fSW50cmluc2ljIC0gQmFzZSBjbGFzcyBmb3IgYWxsIEhleGFnb24gaW50cmluc2ljcy4KKyAgY2xhc3MgSGV4YWdvbl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeCwgbGlzdDxMTFZNVHlwZT4gcmV0X3R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdDxMTFZNVHlwZT4gcGFyYW1fdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0PEludHJpbnNpY1Byb3BlcnR5PiBwcm9wZXJ0aWVzPgorICAgIDogR0NDQnVpbHRpbjwhc3RyY29uY2F0KCJfX2J1aWx0aW5fIiwgR0NDSW50U3VmZml4KT4sCisgICAgICBJbnRyaW5zaWM8cmV0X3R5cGVzLCBwYXJhbV90eXBlcywgcHJvcGVydGllcz47CisKKyAgLy8vIEhleGFnb25fTm9uR0NDX0ludHJpbnNpYyAtIEJhc2UgY2xhc3MgZm9yIGJpdGNvZGUgY29udmVydGlibGUgSGV4YWdvbgorICAvLy8gaW50cmluc2ljcy4KKyAgY2xhc3MgSGV4YWdvbl9Ob25HQ0NfSW50cmluc2ljPGxpc3Q8TExWTVR5cGU+IHJldF90eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Q8TExWTVR5cGU+IHBhcmFtX3R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdDxJbnRyaW5zaWNQcm9wZXJ0eT4gcHJvcGVydGllcz4KKyAgICA6IEludHJpbnNpYzxyZXRfdHlwZXMsIHBhcmFtX3R5cGVzLCBwcm9wZXJ0aWVzPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8xKFFJX2Z0eXBlX01FTSxCVF9CT09MLEJUX1BUUikgLT4KKy8vIEhleGFnb25fcWlfbWVtX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fcWlfbWVtX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTFfdHldLCBbbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMShISV9mdHlwZV9TSSxCVF9JMTYsQlRfSU5UKSAtPgorLy8gSGV4YWdvbl9oaV9zaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX2hpX3NpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTE2X3R5XSwgW2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzEoU0lfZnR5cGVfU0ksQlRfSU5ULEJUX0lOVCkgLT4KKy8vIEhleGFnb25fc2lfc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8xKERJX2Z0eXBlX1NJLEJUX0xPTkdMT05HLEJUX0lOVCkgLT4KKy8vIEhleGFnb25fZGlfc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9kaV9zaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eV0sIFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8xKFNJX2Z0eXBlX0RJLEJUX0lOVCxCVF9MT05HTE9ORykgLT4KKy8vIEhleGFnb25fc2lfZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9zaV9kaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8xKERJX2Z0eXBlX0RJLEJUX0xPTkdMT05HLEJUX0xPTkdMT05HKSAtPgorLy8gSGV4YWdvbl9kaV9kaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX2RpX2RpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzEoUUlfZnR5cGVfUUksQlRfQk9PTCxCVF9CT09MKSAtPgorLy8gSGV4YWdvbl9xaV9xaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3FpX3FpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTFfdHldLCBbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMShRSV9mdHlwZV9TSSxCVF9CT09MLEJUX0lOVCkgLT4KKy8vIEhleGFnb25fcWlfc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9xaV9zaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kxX3R5XSwgW2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzEoRElfZnR5cGVfUUksQlRfTE9OR0xPTkcsQlRfQk9PTCkgLT4KKy8vIEhleGFnb25fZGlfcWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9kaV9xaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eV0sIFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8xKFNJX2Z0eXBlX1FJLEJUX0lOVCxCVF9CT09MKSAtPgorLy8gSGV4YWdvbl9zaV9xaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3NpX3FpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzIoUUlfZnR5cGVfU0lTSSxCVF9CT09MLEJUX0lOVCxCVF9JTlQpIC0+CisvLyBIZXhhZ29uX3FpX3Npc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9xaV9zaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTFfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzIodm9pZF9mdHlwZV9TSVNJLEJUX1ZPSUQsQlRfSU5ULEJUX0lOVCkgLT4KKy8vIEhleGFnb25fdm9pZF9zaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fdm9pZF9zaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdm9pZF90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMihTSV9mdHlwZV9TSVNJLEJUX0lOVCxCVF9JTlQsQlRfSU5UKSAtPgorLy8gSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMihVU0lfZnR5cGVfU0lTSSxCVF9VSU5ULEJUX0lOVCxCVF9JTlQpIC0+CisvLyBIZXhhZ29uX3VzaV9zaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fdXNpX3Npc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzIoRElfZnR5cGVfU0lTSSxCVF9MT05HTE9ORyxCVF9JTlQsQlRfSU5UKSAtPgorLy8gSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMihVRElfZnR5cGVfU0lTSSxCVF9VTE9OR0xPTkcsQlRfSU5ULEJUX0lOVCkgLT4KKy8vIEhleGFnb25fdWRpX3Npc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl91ZGlfc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMihESV9mdHlwZV9TSURJLEJUX0xPTkdMT05HLEJUX0lOVCxCVF9MT05HTE9ORykgLT4KKy8vIEhleGFnb25fZGlfc2lkaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX2RpX3NpZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzIoRElfZnR5cGVfRElTSSxCVF9MT05HTE9ORyxCVF9MT05HTE9ORyxCVF9JTlQpIC0+CisvLyBIZXhhZ29uX2RpX2Rpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8yKFNJX2Z0eXBlX1NJREksQlRfSU5ULEJUX0lOVCxCVF9MT05HTE9ORykgLT4KKy8vIEhleGFnb25fc2lfc2lkaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3NpX3NpZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzIoU0lfZnR5cGVfRElESSxCVF9JTlQsQlRfTE9OR0xPTkcsQlRfTE9OR0xPTkcpIC0+CisvLyBIZXhhZ29uX3NpX2RpZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9zaV9kaWRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8yKERJX2Z0eXBlX0RJREksQlRfTE9OR0xPTkcsQlRfTE9OR0xPTkcsQlRfTE9OR0xPTkcpIC0+CisvLyBIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8yKFVESV9mdHlwZV9ESURJLEJUX1VMT05HTE9ORyxCVF9MT05HTE9ORyxCVF9MT05HTE9ORykgLT4KKy8vIEhleGFnb25fdWRpX2RpZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl91ZGlfZGlkaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMihTSV9mdHlwZV9ESVNJLEJUX0lOVCxCVF9MT05HTE9ORyxCVF9JTlQpIC0+CisvLyBIZXhhZ29uX3NpX2Rpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9zaV9kaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8yKFFJX2Z0eXBlX0RJREksQlRfQk9PTCxCVF9MT05HTE9ORyxCVF9MT05HTE9ORykgLT4KKy8vIEhleGFnb25fcWlfZGlkaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3FpX2RpZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMV90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMihRSV9mdHlwZV9TSURJLEJUX0JPT0wsQlRfSU5ULEJUX0xPTkdMT05HKSAtPgorLy8gSGV4YWdvbl9xaV9kaWRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fcWlfc2lkaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kxX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8yKFFJX2Z0eXBlX0RJU0ksQlRfQk9PTCxCVF9MT05HTE9ORyxCVF9JTlQpIC0+CisvLyBIZXhhZ29uX3FpX2Rpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9xaV9kaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTFfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzIoUUlfZnR5cGVfUUlRSSxCVF9CT09MLEJUX0JPT0wsQlRfQk9PTCkgLT4KKy8vIEhleGFnb25fcWlfcWlxaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3FpX3FpcWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMV90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMihRSV9mdHlwZV9RSVFJUUksQlRfQk9PTCxCVF9CT09MLEJUX0JPT0wpIC0+CisvLyBIZXhhZ29uX3FpX3FpcWlxaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3FpX3FpcWlxaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kxX3R5XSwgW2xsdm1faTFfdHksIGxsdm1faTFfdHksIGxsdm1faTFfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMihTSV9mdHlwZV9RSVFJLEJUX0lOVCxCVF9CT09MLEJUX0JPT0wpIC0+CisvLyBIZXhhZ29uX3NpX3FpcWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9zaV9xaXFpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8yKFNJX2Z0eXBlX1FJU0ksQlRfSU5ULEJUX0JPT0wsQlRfSU5UKSAtPgorLy8gSGV4YWdvbl9zaV9xaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2lfcWlzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX2kxX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8zKHZvaWRfZnR5cGVfU0lTSVNJLEJUX1ZPSUQsQlRfSU5ULEJUX0lOVCxCVF9JTlQpIC0+CisvLyBIZXhhZ29uX3ZvaWRfc2lzaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fdm9pZF9zaXNpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92b2lkX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzMoU0lfZnR5cGVfU0lTSVNJLEJUX0lOVCxCVF9JTlQsQlRfSU5ULEJUX0lOVCkgLT4KKy8vIEhleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzMoRElfZnR5cGVfU0lTSVNJLEJUX0xPTkdMT05HLEJUX0lOVCxCVF9JTlQsQlRfSU5UKSAtPgorLy8gSGV4YWdvbl9kaV9zaXNpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9kaV9zaXNpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMyhTSV9mdHlwZV9ESVNJU0ksQlRfSU5ULEJUX0xPTkdMT05HLEJUX0lOVCxCVF9JTlQpIC0+CisvLyBIZXhhZ29uX3NpX2Rpc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3NpX2Rpc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8zKERJX2Z0eXBlX0RJU0lTSSxCVF9MT05HTE9ORyxCVF9MT05HTE9ORyxCVF9JTlQsQlRfSU5UKSAtPgorLy8gSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMyhTSV9mdHlwZV9TSURJU0ksQlRfSU5ULEJUX0lOVCxCVF9MT05HTE9ORyxCVF9JTlQpIC0+CisvLyBIZXhhZ29uX3NpX3NpZGlzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3NpX3NpZGlzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8zKERJX2Z0eXBlX0RJRElTSSxCVF9MT05HTE9ORyxCVF9MT05HTE9ORywKKy8vICAgICAgICAgICAgICAgICAgICAgQlRfTE9OR0xPTkcsQlRfSU5UKSAtPgorLy8gSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMyhTSV9mdHlwZV9TSURJREksQlRfSU5ULEJUX0lOVCxCVF9MT05HTE9ORyxCVF9MT05HTE9ORykgLT4KKy8vIEhleGFnb25fc2lfc2lkaWRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2lfc2lkaWRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2k2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzMoRElfZnR5cGVfRElESURJLEJUX0xPTkdMT05HLEJUX0xPTkdMT05HLEJUX0xPTkdMT05HLAorLy8gICAgICAgICAgICAgICAgICAgICBCVF9MT05HTE9ORykgLT4KKy8vIEhleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzMoU0lfZnR5cGVfU0lTSURJLEJUX0lOVCxCVF9JTlQsQlRfSU5ULEJUX0xPTkdMT05HKSAtPgorLy8gSGV4YWdvbl9zaV9zaXNpZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9zaV9zaXNpZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMyhTSV9mdHlwZV9RSVNJU0ksQlRfSU5ULEJUX0JPT0wsQlRfSU5ULEJUX0lOVCkgLT4KKy8vIEhleGFnb25fc2lfcWlzaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2lfcWlzaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzMoRElfZnR5cGVfUUlTSVNJLEJUX0xPTkdMT05HLEJUX0JPT0wsQlRfSU5ULEJUX0lOVCkgLT4KKy8vIEhleGFnb25fZGlfcWlzaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fZGlfcWlzaXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5XSwgW2xsdm1faTFfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfMyhESV9mdHlwZV9RSURJREksQlRfTE9OR0xPTkcsQlRfQk9PTCxCVF9MT05HTE9ORywKKy8vICAgICAgICAgICAgICAgICAgICAgQlRfTE9OR0xPTkcpIC0+CisvLyBIZXhhZ29uX2RpX3FpZGlkaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX2RpX3FpZGlkaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBERUZfRlVOQ1RJT05fVFlQRV8zKERJX2Z0eXBlX0RJRElRSSxCVF9MT05HTE9ORyxCVF9MT05HTE9ORyxCVF9MT05HTE9ORywKKy8vICAgICAgICAgICAgICAgICAgICAgQlRfQk9PTCkgLT4KKy8vIEhleGFnb25fZGlfZGlkaXFpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fZGlfZGlkaXFpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIERFRl9GVU5DVElPTl9UWVBFXzQoU0lfZnR5cGVfU0lTSVNJU0ksQlRfSU5ULEJUX0lOVCxCVF9JTlQsQlRfSU5ULEJUX0lOVCkgLT4KKy8vIEhleGFnb25fc2lfc2lzaXNpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9zaV9zaXNpc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gREVGX0ZVTkNUSU9OX1RZUEVfNChESV9mdHlwZV9ESURJU0lTSSxCVF9MT05HTE9ORyxCVF9MT05HTE9ORywKKy8vICAgICAgICAgICAgICAgICAgICAgQlRfTE9OR0xPTkcsQlRfSU5ULEJUX0lOVCkgLT4KKy8vIEhleGFnb25fZGlfZGlkaXNpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9kaV9kaWRpc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK2NsYXNzIEhleGFnb25fbWVtX21lbW1lbXNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3B0cl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKK2NsYXNzIEhleGFnb25fbWVtX21lbXNpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50cldyaXRlTWVtXT47CisKK2NsYXNzIEhleGFnb25fbWVtX21lbWRpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50cldyaXRlTWVtXT47CisKK2NsYXNzIEhleGFnb25fbWVtX21lbW1lbXNpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1fcHRyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKK2NsYXNzIEhleGFnb25fbWVtX21lbXNpc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50cldyaXRlTWVtXT47CisKK2NsYXNzIEhleGFnb25fbWVtX21lbWRpc2lzaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV9pNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50cldyaXRlTWVtXT47CisKK2NsYXNzIEhleGFnb25fdjI1Nl92MjU2djI1Nl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKworLy8KKy8vIEhleGFnb25fc2ZfZGZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9zZl9zaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgVGhyb3dzXT47CisvLworLy8gSGV4YWdvbl9zZl9kZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3NmX2RmX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fZmxvYXRfdHldLCBbbGx2bV9kb3VibGVfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gSGV4YWdvbl9zZl9kaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3NmX2RpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fZmxvYXRfdHldLCBbbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gSGV4YWdvbl9kZl9zZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX2RmX3NmX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gSGV4YWdvbl9kaV9zZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX2RpX3NmX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5XSwgW2xsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gSGV4YWdvbl9zZl9zZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX3NmX3NmX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBIZXhhZ29uX3NpX3NmX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2lfc2ZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMzJfdHldLCBbbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBIZXhhZ29uX3NpX2RmX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2lfZGZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMzJfdHldLCBbbGx2bV9kb3VibGVfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gSGV4YWdvbl9zZl9zZnNmX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2Zfc2ZzZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBUaHJvd3NdPjsKKy8vCisvLyBIZXhhZ29uX3NpX3Nmc2ZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9zaV9zZnNmX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBUaHJvd3NdPjsKKy8vCisvLyBIZXhhZ29uX3NpX3Nmc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9zaV9zZnNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgVGhyb3dzXT47CisvLworLy8gSGV4YWdvbl9xaV9zZnFpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fcWlfc2ZxaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kxX3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIEhleGFnb25fc2Zfc2ZzZnNmX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2Zfc2ZzZnNmX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIFRocm93c10+OworLy8KKy8vIEhleGFnb25fc2Zfc2ZzZnNmcWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9zZl9zZnNmc2ZxaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIFRocm93c10+OworLy8KKy8vIEhleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fZGlfZGlkaWRpc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIEhleGFnb25fZGZfc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9kZl9zaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIFRocm93c10+OworLy8KKy8vIEhleGFnb25fZGZfZGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9kZl9kaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKy8vCisvLyBIZXhhZ29uX2RpX2RmX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fZGlfZGZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHldLCBbbGx2bV9kb3VibGVfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisvLworLy8gSGV4YWdvbl9kZl9kZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX2RmX2RmX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworLy8KKy8vIEhleGFnb25fZGZfZGZkZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX2RmX2RmZGZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHksIGxsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgVGhyb3dzXT47CisvLworLy8gSGV4YWdvbl9zaV9kZmRmX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fc2lfZGZkZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX2RvdWJsZV90eSwgbGx2bV9kb3VibGVfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBUaHJvd3NdPjsKKy8vCisvLyBIZXhhZ29uX3NpX2Rmc2lfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLworY2xhc3MgSGV4YWdvbl9zaV9kZnNpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5XSwgW2xsdm1fZG91YmxlX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIFRocm93c10+OworLy8KKy8vCisvLyBIZXhhZ29uX2RmX2RmZGZkZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vCitjbGFzcyBIZXhhZ29uX2RmX2RmZGZkZl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eSwgbGx2bV9kb3VibGVfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2RvdWJsZV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIFRocm93c10+OworLy8KKy8vIEhleGFnb25fZGZfZGZkZmRmX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8KK2NsYXNzIEhleGFnb25fZGZfZGZkZmRmcWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHksIGxsdm1fZG91YmxlX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9kb3VibGVfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgVGhyb3dzXT47CisKKworLy8gVGhpcyBvbmUgYmVsb3cgd2lsbCBub3QgYmUgYXV0by1nZW5lcmF0ZWQsCisvLyBzbyBtYWtlIHN1cmUsIHlvdSBkb24ndCBvdmVyd3JpdGUgdGhpcyBvbmUuCisvLworLy8gQlVJTFRJTl9JTkZPX05PTkNPTlNUKGNpcmNfbGRkLFBUUl9mdHlwZV9QVFJQVFJTSVNJLDQpCisvLworZGVmIGludF9oZXhhZ29uX2NpcmNfbGRkIDoKK0hleGFnb25fbWVtX21lbW1lbXNpc2lfSW50cmluc2ljPCJjaXJjX2xkZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GT19OT05DT05TVChjaXJjX2xkdyxQVFJfZnR5cGVfUFRSUFRSU0lTSSw0KQorLy8KK2RlZiBpbnRfaGV4YWdvbl9jaXJjX2xkdyA6CitIZXhhZ29uX21lbV9tZW1tZW1zaXNpX0ludHJpbnNpYzwiY2lyY19sZHciPjsKKy8vCisvLyBCVUlMVElOX0lORk9fTk9OQ09OU1QoY2lyY19sZGgsUFRSX2Z0eXBlX1BUUlBUUlNJU0ksNCkKKy8vCitkZWYgaW50X2hleGFnb25fY2lyY19sZGggOgorSGV4YWdvbl9tZW1fbWVtbWVtc2lzaV9JbnRyaW5zaWM8ImNpcmNfbGRoIj47CisvLworLy8gQlVJTFRJTl9JTkZPX05PTkNPTlNUKGNpcmNfbGR1aCxQVFJfZnR5cGVfUFRSUFRSU0lTSSw0KQorLy8KK2RlZiBpbnRfaGV4YWdvbl9jaXJjX2xkdWggOgorSGV4YWdvbl9tZW1fbWVtbWVtc2lzaV9JbnRyaW5zaWM8ImNpcmNfbGR1aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GT19OT05DT05TVChjaXJjX2xkYixQVFJfZnR5cGVfUFRSUFRSU0lTSSw0KQorLy8KK2RlZiBpbnRfaGV4YWdvbl9jaXJjX2xkYiA6CitIZXhhZ29uX21lbV9tZW1tZW1zaXNpX0ludHJpbnNpYzwiY2lyY19sZGIiPjsKKy8vCisvLyBCVUlMVElOX0lORk9fTk9OQ09OU1QoY2lyY19sZHViLFBUUl9mdHlwZV9QVFJQVFJTSVNJLDQpCisvLworZGVmIGludF9oZXhhZ29uX2NpcmNfbGR1YiA6CitIZXhhZ29uX21lbV9tZW1tZW1zaXNpX0ludHJpbnNpYzwiY2lyY19sZHViIj47CisKKy8vCisvLyBCVUlMVElOX0lORk9fTk9OQ09OU1QoY2lyY19zdGQsUFRSX2Z0eXBlX1BUUkRJU0lTSSw0KQorLy8KK2RlZiBpbnRfaGV4YWdvbl9jaXJjX3N0ZCA6CitIZXhhZ29uX21lbV9tZW1kaXNpc2lfSW50cmluc2ljPCJjaXJjX3N0ZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GT19OT05DT05TVChjaXJjX3N0dyxQVFJfZnR5cGVfUFRSU0lTSVNJLDQpCisvLworZGVmIGludF9oZXhhZ29uX2NpcmNfc3R3IDoKK0hleGFnb25fbWVtX21lbXNpc2lzaV9JbnRyaW5zaWM8ImNpcmNfc3R3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPX05PTkNPTlNUKGNpcmNfc3RoLFBUUl9mdHlwZV9QVFJTSVNJU0ksNCkKKy8vCitkZWYgaW50X2hleGFnb25fY2lyY19zdGggOgorSGV4YWdvbl9tZW1fbWVtc2lzaXNpX0ludHJpbnNpYzwiY2lyY19zdGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk9fTk9OQ09OU1QoY2lyY19zdGhoaSxQVFJfZnR5cGVfUFRSU0lTSVNJLDQpCisvLworZGVmIGludF9oZXhhZ29uX2NpcmNfc3RoaGkgOgorSGV4YWdvbl9tZW1fbWVtc2lzaXNpX0ludHJpbnNpYzwiY2lyY19zdGhoaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GT19OT05DT05TVChjaXJjX3N0YixQVFJfZnR5cGVfUFRSU0lTSVNJLDQpCisvLworZGVmIGludF9oZXhhZ29uX2NpcmNfc3RiIDoKK0hleGFnb25fbWVtX21lbXNpc2lzaV9JbnRyaW5zaWM8ImNpcmNfc3RiIj47CisKKworZGVmIGludF9oZXhhZ29uX21tMjU2aV92YWRkdyA6CitIZXhhZ29uX3YyNTZfdjI1NnYyNTZfSW50cmluc2ljPCJfbW0yNTZpX3ZhZGR3Ij47CisKKworLy8gVGhpcyBvbmUgYWJvdmUgd2lsbCBub3QgYmUgYXV0by1nZW5lcmF0ZWQsCisvLyBzbyBtYWtlIHN1cmUsIHlvdSBkb24ndCBvdmVyd3JpdGUgdGhpcyBvbmUuCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfY21wZXEsUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl9jbXBlcSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0MyX2NtcGVxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfY21wZ3QsUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl9jbXBndCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0MyX2NtcGd0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfY21wZ3R1LFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzJfY21wZ3R1IDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfY21wZ3R1Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfY21wZXFwLFFJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzJfY21wZXFwIDoKK0hleGFnb25fc2lfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfY21wZXFwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfY21wZ3RwLFFJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzJfY21wZ3RwIDoKK0hleGFnb25fc2lfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfY21wZ3RwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfY21wZ3R1cCxRSV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0MyX2NtcGd0dXAgOgorSGV4YWdvbl9zaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl9jbXBndHVwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfcmNtcGVxaSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X3JjbXBlcWkgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9yY21wZXFpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfcmNtcG5lcWksU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9yY21wbmVxaSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X3JjbXBuZXFpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfcmNtcGVxLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfcmNtcGVxIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfcmNtcGVxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfcmNtcG5lcSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X3JjbXBuZXEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9yY21wbmVxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfYml0c3NldCxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0MyX2JpdHNzZXQgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl9iaXRzc2V0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfYml0c2NscixRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0MyX2JpdHNjbHIgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl9iaXRzY2xyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzRfbmJpdHNzZXQsUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DNF9uYml0c3NldCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0M0X25iaXRzc2V0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzRfbmJpdHNjbHIsUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DNF9uYml0c2NsciA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0M0X25iaXRzY2xyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfY21wZXFpLFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzJfY21wZXFpIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfY21wZXFpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfY21wZ3RpLFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzJfY21wZ3RpIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfY21wZ3RpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfY21wZ3R1aSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0MyX2NtcGd0dWkgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl9jbXBndHVpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfY21wZ2VpLFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzJfY21wZ2VpIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfY21wZ2VpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfY21wZ2V1aSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0MyX2NtcGdldWkgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl9jbXBnZXVpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfY21wbHQsUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl9jbXBsdCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0MyX2NtcGx0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfY21wbHR1LFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzJfY21wbHR1IDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfY21wbHR1Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfYml0c2NscmksUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl9iaXRzY2xyaSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0MyX2JpdHNjbHJpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzRfbmJpdHNjbHJpLFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzRfbmJpdHNjbHJpIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzRfbmJpdHNjbHJpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzRfY21wbmVxaSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0M0X2NtcG5lcWkgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DNF9jbXBuZXFpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzRfY21wbHRlaSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0M0X2NtcGx0ZWkgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DNF9jbXBsdGVpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzRfY21wbHRldWksUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DNF9jbXBsdGV1aSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0M0X2NtcGx0ZXVpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzRfY21wbmVxLFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzRfY21wbmVxIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzRfY21wbmVxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzRfY21wbHRlLFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzRfY21wbHRlIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzRfY21wbHRlIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzRfY21wbHRldSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0M0X2NtcGx0ZXUgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DNF9jbXBsdGV1Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfYW5kLFFJX2Z0eXBlX1FJUUksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzJfYW5kIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfYW5kIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfb3IsUUlfZnR5cGVfUUlRSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl9vciA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0MyX29yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfeG9yLFFJX2Z0eXBlX1FJUUksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzJfeG9yIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfeG9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfYW5kbixRSV9mdHlwZV9RSVFJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0MyX2FuZG4gOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl9hbmRuIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfbm90LFFJX2Z0eXBlX1FJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0MyX25vdCA6CitIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl9ub3QiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5DMl9vcm4sUUlfZnR5cGVfUUlRSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl9vcm4gOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl9vcm4iPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5DNF9hbmRfYW5kLFFJX2Z0eXBlX1FJUUlRSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DNF9hbmRfYW5kIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DNF9hbmRfYW5kIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzRfYW5kX29yLFFJX2Z0eXBlX1FJUUlRSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DNF9hbmRfb3IgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX0M0X2FuZF9vciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkM0X29yX2FuZCxRSV9mdHlwZV9RSVFJUUksMykKKy8vCitkZWYgaW50X2hleGFnb25fQzRfb3JfYW5kIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DNF9vcl9hbmQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5DNF9vcl9vcixRSV9mdHlwZV9RSVFJUUksMykKKy8vCitkZWYgaW50X2hleGFnb25fQzRfb3Jfb3IgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX0M0X29yX29yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzRfYW5kX2FuZG4sUUlfZnR5cGVfUUlRSVFJLDMpCisvLworZGVmIGludF9oZXhhZ29uX0M0X2FuZF9hbmRuIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DNF9hbmRfYW5kbiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkM0X2FuZF9vcm4sUUlfZnR5cGVfUUlRSVFJLDMpCisvLworZGVmIGludF9oZXhhZ29uX0M0X2FuZF9vcm4gOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX0M0X2FuZF9vcm4iPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5DNF9vcl9hbmRuLFFJX2Z0eXBlX1FJUUlRSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DNF9vcl9hbmRuIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DNF9vcl9hbmRuIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzRfb3Jfb3JuLFFJX2Z0eXBlX1FJUUlRSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DNF9vcl9vcm4gOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX0M0X29yX29ybiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX3B4ZmVyX21hcCxRSV9mdHlwZV9RSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl9weGZlcl9tYXAgOgorSGV4YWdvbl9zaV9xaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfcHhmZXJfbWFwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfYW55OCxRSV9mdHlwZV9RSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl9hbnk4IDoKK0hleGFnb25fc2lfcWlfSW50cmluc2ljPCJIRVhBR09OX0MyX2FueTgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5DMl9hbGw4LFFJX2Z0eXBlX1FJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0MyX2FsbDggOgorSGV4YWdvbl9zaV9xaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfYWxsOCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX3ZpdHBhY2ssU0lfZnR5cGVfUUlRSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl92aXRwYWNrIDoKK0hleGFnb25fc2lfcWlxaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfdml0cGFjayI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX211eCxTSV9mdHlwZV9RSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fQzJfbXV4IDoKK0hleGFnb25fc2lfcWlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl9tdXgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5DMl9tdXhpaSxTSV9mdHlwZV9RSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fQzJfbXV4aWkgOgorSGV4YWdvbl9zaV9xaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX0MyX211eGlpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfbXV4aXIsU0lfZnR5cGVfUUlTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX0MyX211eGlyIDoKK0hleGFnb25fc2lfcWlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl9tdXhpciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX211eHJpLFNJX2Z0eXBlX1FJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl9tdXhyaSA6CitIZXhhZ29uX3NpX3Fpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQzJfbXV4cmkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5DMl92bXV4LERJX2Z0eXBlX1FJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl92bXV4IDoKK0hleGFnb25fZGlfcWlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl92bXV4Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzJfbWFzayxESV9mdHlwZV9RSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl9tYXNrIDoKK0hleGFnb25fZGlfcWlfSW50cmluc2ljPCJIRVhBR09OX0MyX21hc2siPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92Y21wYmVxLFFJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmNtcGJlcSA6CitIZXhhZ29uX3NpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZjbXBiZXEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF92Y21wYmVxaSxRSV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X3ZjbXBiZXFpIDoKK0hleGFnb25fc2lfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfdmNtcGJlcWkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF92Y21wYmVxX2FueSxRSV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X3ZjbXBiZXFfYW55IDoKK0hleGFnb25fc2lfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfdmNtcGJlcV9hbnkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92Y21wYmd0dSxRSV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZjbXBiZ3R1IDoKK0hleGFnb25fc2lfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdmNtcGJndHUiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF92Y21wYmd0dWksUUlfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF92Y21wYmd0dWkgOgorSGV4YWdvbl9zaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF92Y21wYmd0dWkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF92Y21wYmd0LFFJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfdmNtcGJndCA6CitIZXhhZ29uX3NpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0E0X3ZjbXBiZ3QiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF92Y21wYmd0aSxRSV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X3ZjbXBiZ3RpIDoKK0hleGFnb25fc2lfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfdmNtcGJndGkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9jbXBiZXEsUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9jbXBiZXEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9jbXBiZXEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9jbXBiZXFpLFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfY21wYmVxaSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X2NtcGJlcWkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9jbXBiZ3R1LFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfY21wYmd0dSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X2NtcGJndHUiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9jbXBiZ3R1aSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X2NtcGJndHVpIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfY21wYmd0dWkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9jbXBiZ3QsUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9jbXBiZ3QgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9jbXBiZ3QiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9jbXBiZ3RpLFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfY21wYmd0aSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X2NtcGJndGkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92Y21waGVxLFFJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmNtcGhlcSA6CitIZXhhZ29uX3NpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZjbXBoZXEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92Y21waGd0LFFJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmNtcGhndCA6CitIZXhhZ29uX3NpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZjbXBoZ3QiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92Y21waGd0dSxRSV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZjbXBoZ3R1IDoKK0hleGFnb25fc2lfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdmNtcGhndHUiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF92Y21waGVxaSxRSV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X3ZjbXBoZXFpIDoKK0hleGFnb25fc2lfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfdmNtcGhlcWkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF92Y21waGd0aSxRSV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X3ZjbXBoZ3RpIDoKK0hleGFnb25fc2lfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfdmNtcGhndGkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF92Y21waGd0dWksUUlfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF92Y21waGd0dWkgOgorSGV4YWdvbl9zaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF92Y21waGd0dWkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9jbXBoZXEsUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9jbXBoZXEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9jbXBoZXEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9jbXBoZ3QsUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9jbXBoZ3QgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9jbXBoZ3QiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9jbXBoZ3R1LFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfY21waGd0dSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X2NtcGhndHUiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9jbXBoZXFpLFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfY21waGVxaSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X2NtcGhlcWkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9jbXBoZ3RpLFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfY21waGd0aSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X2NtcGhndGkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9jbXBoZ3R1aSxRSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X2NtcGhndHVpIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfY21waGd0dWkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92Y21wd2VxLFFJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmNtcHdlcSA6CitIZXhhZ29uX3NpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZjbXB3ZXEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92Y21wd2d0LFFJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmNtcHdndCA6CitIZXhhZ29uX3NpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZjbXB3Z3QiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92Y21wd2d0dSxRSV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZjbXB3Z3R1IDoKK0hleGFnb25fc2lfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdmNtcHdndHUiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF92Y21wd2VxaSxRSV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X3ZjbXB3ZXFpIDoKK0hleGFnb25fc2lfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfdmNtcHdlcWkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF92Y21wd2d0aSxRSV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X3ZjbXB3Z3RpIDoKK0hleGFnb25fc2lfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfdmNtcHdndGkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF92Y21wd2d0dWksUUlfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF92Y21wd2d0dWkgOgorSGV4YWdvbl9zaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF92Y21wd2d0dWkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9ib3VuZHNjaGVjayxRSV9mdHlwZV9TSURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X2JvdW5kc2NoZWNrIDoKK0hleGFnb25fc2lfc2lkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfYm91bmRzY2hlY2siPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF90bGJtYXRjaCxRSV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X3RsYm1hdGNoIDoKK0hleGFnb25fc2lfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfdGxibWF0Y2giPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5DMl90ZnJwcixTSV9mdHlwZV9RSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DMl90ZnJwciA6CitIZXhhZ29uX3NpX3FpX0ludHJpbnNpYzwiSEVYQUdPTl9DMl90ZnJwciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkMyX3RmcnJwLFFJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0MyX3RmcnJwIDoKK0hleGFnb25fc2lfc2lfSW50cmluc2ljPCJIRVhBR09OX0MyX3RmcnJwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzRfZmFzdGNvcm5lcjksUUlfZnR5cGVfUUlRSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9DNF9mYXN0Y29ybmVyOSA6CitIZXhhZ29uX3NpX3FpcWlfSW50cmluc2ljPCJIRVhBR09OX0M0X2Zhc3Rjb3JuZXI5Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQzRfZmFzdGNvcm5lcjlfbm90LFFJX2Z0eXBlX1FJUUksMikKKy8vCitkZWYgaW50X2hleGFnb25fQzRfZmFzdGNvcm5lcjlfbm90IDoKK0hleGFnb25fc2lfcWlxaV9JbnRyaW5zaWM8IkhFWEFHT05fQzRfZmFzdGNvcm5lcjlfbm90Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X2FjY19oaF9zMCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X2FjY19oaF9zMCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X2FjY19oaF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9hY2NfaGhfczEsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9hY2NfaGhfczEgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9hY2NfaGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfYWNjX2hsX3MwLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfYWNjX2hsX3MwIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfYWNjX2hsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X2FjY19obF9zMSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X2FjY19obF9zMSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X2FjY19obF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9hY2NfbGhfczAsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9hY2NfbGhfczAgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9hY2NfbGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfYWNjX2xoX3MxLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfYWNjX2xoX3MxIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfYWNjX2xoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X2FjY19sbF9zMCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X2FjY19sbF9zMCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X2FjY19sbF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9hY2NfbGxfczEsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9hY2NfbGxfczEgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9hY2NfbGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfbmFjX2hoX3MwLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfbmFjX2hoX3MwIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfbmFjX2hoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X25hY19oaF9zMSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X25hY19oaF9zMSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X25hY19oaF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9uYWNfaGxfczAsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9uYWNfaGxfczAgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9uYWNfaGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfbmFjX2hsX3MxLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfbmFjX2hsX3MxIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfbmFjX2hsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X25hY19saF9zMCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X25hY19saF9zMCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X25hY19saF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9uYWNfbGhfczEsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9uYWNfbGhfczEgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9uYWNfbGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfbmFjX2xsX3MwLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfbmFjX2xsX3MwIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfbmFjX2xsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X25hY19sbF9zMSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X25hY19sbF9zMSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X25hY19sbF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9hY2Nfc2F0X2hoX3MwLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfYWNjX3NhdF9oaF9zMCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X2FjY19zYXRfaGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfYWNjX3NhdF9oaF9zMSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X2FjY19zYXRfaGhfczEgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9hY2Nfc2F0X2hoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X2FjY19zYXRfaGxfczAsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9hY2Nfc2F0X2hsX3MwIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfYWNjX3NhdF9obF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9hY2Nfc2F0X2hsX3MxLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfYWNjX3NhdF9obF9zMSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X2FjY19zYXRfaGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfYWNjX3NhdF9saF9zMCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X2FjY19zYXRfbGhfczAgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9hY2Nfc2F0X2xoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X2FjY19zYXRfbGhfczEsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9hY2Nfc2F0X2xoX3MxIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfYWNjX3NhdF9saF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9hY2Nfc2F0X2xsX3MwLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfYWNjX3NhdF9sbF9zMCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X2FjY19zYXRfbGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfYWNjX3NhdF9sbF9zMSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X2FjY19zYXRfbGxfczEgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9hY2Nfc2F0X2xsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X25hY19zYXRfaGhfczAsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9uYWNfc2F0X2hoX3MwIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfbmFjX3NhdF9oaF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9uYWNfc2F0X2hoX3MxLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfbmFjX3NhdF9oaF9zMSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X25hY19zYXRfaGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfbmFjX3NhdF9obF9zMCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X25hY19zYXRfaGxfczAgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9uYWNfc2F0X2hsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X25hY19zYXRfaGxfczEsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9uYWNfc2F0X2hsX3MxIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfbmFjX3NhdF9obF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9uYWNfc2F0X2xoX3MwLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfbmFjX3NhdF9saF9zMCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X25hY19zYXRfbGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfbmFjX3NhdF9saF9zMSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X25hY19zYXRfbGhfczEgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9uYWNfc2F0X2xoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5X25hY19zYXRfbGxfczAsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9uYWNfc2F0X2xsX3MwIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfbmFjX3NhdF9sbF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV9uYWNfc2F0X2xsX3MxLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfbmFjX3NhdF9sbF9zMSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X25hY19zYXRfbGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfaGhfczAsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfaGhfczAgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfaGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfaGhfczEsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfaGhfczEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfaGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfaGxfczAsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfaGxfczAgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfaGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfaGxfczEsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfaGxfczEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfaGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfbGhfczAsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfbGhfczAgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfbGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfbGhfczEsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfbGhfczEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfbGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfbGxfczAsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfbGxfczAgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfbGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfbGxfczEsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfbGxfczEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlfbGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfc2F0X2hoX3MwLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X3NhdF9oaF9zMCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9zYXRfaGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfc2F0X2hoX3MxLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X3NhdF9oaF9zMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9zYXRfaGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfc2F0X2hsX3MwLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X3NhdF9obF9zMCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9zYXRfaGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfc2F0X2hsX3MxLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X3NhdF9obF9zMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9zYXRfaGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfc2F0X2xoX3MwLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X3NhdF9saF9zMCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9zYXRfbGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfc2F0X2xoX3MxLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X3NhdF9saF9zMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9zYXRfbGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfc2F0X2xsX3MwLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X3NhdF9sbF9zMCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9zYXRfbGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfc2F0X2xsX3MxLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X3NhdF9sbF9zMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9zYXRfbGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfcm5kX2hoX3MwLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X3JuZF9oaF9zMCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9ybmRfaGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfcm5kX2hoX3MxLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X3JuZF9oaF9zMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9ybmRfaGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfcm5kX2hsX3MwLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X3JuZF9obF9zMCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9ybmRfaGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfcm5kX2hsX3MxLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X3JuZF9obF9zMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9ybmRfaGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfcm5kX2xoX3MwLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X3JuZF9saF9zMCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9ybmRfbGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfcm5kX2xoX3MxLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X3JuZF9saF9zMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9ybmRfbGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfcm5kX2xsX3MwLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X3JuZF9sbF9zMCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9ybmRfbGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfcm5kX2xsX3MxLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5X3JuZF9sbF9zMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV9ybmRfbGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfc2F0X3JuZF9oaF9zMCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9zYXRfcm5kX2hoX3MwIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X3NhdF9ybmRfaGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfc2F0X3JuZF9oaF9zMSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9zYXRfcm5kX2hoX3MxIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X3NhdF9ybmRfaGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfc2F0X3JuZF9obF9zMCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9zYXRfcm5kX2hsX3MwIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X3NhdF9ybmRfaGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfc2F0X3JuZF9obF9zMSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9zYXRfcm5kX2hsX3MxIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X3NhdF9ybmRfaGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfc2F0X3JuZF9saF9zMCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9zYXRfcm5kX2xoX3MwIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X3NhdF9ybmRfbGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfc2F0X3JuZF9saF9zMSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9zYXRfcm5kX2xoX3MxIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X3NhdF9ybmRfbGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfc2F0X3JuZF9sbF9zMCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9zYXRfcm5kX2xsX3MwIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X3NhdF9ybmRfbGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlfc2F0X3JuZF9sbF9zMSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV9zYXRfcm5kX2xsX3MxIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X3NhdF9ybmRfbGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlkX2FjY19oaF9zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5ZF9hY2NfaGhfczAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weWRfYWNjX2hoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9hY2NfaGhfczEsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weWRfYWNjX2hoX3MxIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX2FjY19oaF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfYWNjX2hsX3MwLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX2FjY19obF9zMCA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5ZF9hY2NfaGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlkX2FjY19obF9zMSxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5ZF9hY2NfaGxfczEgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weWRfYWNjX2hsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9hY2NfbGhfczAsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weWRfYWNjX2xoX3MwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX2FjY19saF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfYWNjX2xoX3MxLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX2FjY19saF9zMSA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5ZF9hY2NfbGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlkX2FjY19sbF9zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5ZF9hY2NfbGxfczAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weWRfYWNjX2xsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9hY2NfbGxfczEsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weWRfYWNjX2xsX3MxIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX2FjY19sbF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfbmFjX2hoX3MwLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX25hY19oaF9zMCA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5ZF9uYWNfaGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlkX25hY19oaF9zMSxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5ZF9uYWNfaGhfczEgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weWRfbmFjX2hoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9uYWNfaGxfczAsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weWRfbmFjX2hsX3MwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX25hY19obF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfbmFjX2hsX3MxLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX25hY19obF9zMSA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5ZF9uYWNfaGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlkX25hY19saF9zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5ZF9uYWNfbGhfczAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weWRfbmFjX2xoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9uYWNfbGhfczEsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weWRfbmFjX2xoX3MxIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX25hY19saF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWRfbmFjX2xsX3MwLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX25hY19sbF9zMCA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5ZF9uYWNfbGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlkX25hY19sbF9zMSxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5ZF9uYWNfbGxfczEgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weWRfbmFjX2xsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9oaF9zMCxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weWRfaGhfczAgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX2hoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9oaF9zMSxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weWRfaGhfczEgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX2hoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9obF9zMCxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weWRfaGxfczAgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX2hsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9obF9zMSxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weWRfaGxfczEgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX2hsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9saF9zMCxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weWRfbGhfczAgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX2xoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9saF9zMSxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weWRfbGhfczEgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX2xoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9sbF9zMCxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weWRfbGxfczAgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX2xsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9sbF9zMSxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weWRfbGxfczEgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHlkX2xsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9ybmRfaGhfczAsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX3JuZF9oaF9zMCA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weWRfcm5kX2hoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9ybmRfaGhfczEsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX3JuZF9oaF9zMSA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weWRfcm5kX2hoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9ybmRfaGxfczAsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX3JuZF9obF9zMCA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weWRfcm5kX2hsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9ybmRfaGxfczEsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX3JuZF9obF9zMSA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weWRfcm5kX2hsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9ybmRfbGhfczAsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX3JuZF9saF9zMCA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weWRfcm5kX2xoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9ybmRfbGhfczEsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX3JuZF9saF9zMSA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weWRfcm5kX2xoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9ybmRfbGxfczAsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX3JuZF9sbF9zMCA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weWRfcm5kX2xsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5ZF9ybmRfbGxfczEsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlkX3JuZF9sbF9zMSA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weWRfcm5kX2xsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dV9hY2NfaGhfczAsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVfYWNjX2hoX3MwIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1X2FjY19oaF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVfYWNjX2hoX3MxLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1X2FjY19oaF9zMSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dV9hY2NfaGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1X2FjY19obF9zMCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dV9hY2NfaGxfczAgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVfYWNjX2hsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dV9hY2NfaGxfczEsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVfYWNjX2hsX3MxIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1X2FjY19obF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVfYWNjX2xoX3MwLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1X2FjY19saF9zMCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dV9hY2NfbGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1X2FjY19saF9zMSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dV9hY2NfbGhfczEgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVfYWNjX2xoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dV9hY2NfbGxfczAsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVfYWNjX2xsX3MwIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1X2FjY19sbF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVfYWNjX2xsX3MxLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1X2FjY19sbF9zMSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dV9hY2NfbGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1X25hY19oaF9zMCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dV9uYWNfaGhfczAgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVfbmFjX2hoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dV9uYWNfaGhfczEsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVfbmFjX2hoX3MxIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1X25hY19oaF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVfbmFjX2hsX3MwLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1X25hY19obF9zMCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dV9uYWNfaGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1X25hY19obF9zMSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dV9uYWNfaGxfczEgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVfbmFjX2hsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dV9uYWNfbGhfczAsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVfbmFjX2xoX3MwIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1X25hY19saF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVfbmFjX2xoX3MxLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1X25hY19saF9zMSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dV9uYWNfbGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1X25hY19sbF9zMCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dV9uYWNfbGxfczAgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVfbmFjX2xsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dV9uYWNfbGxfczEsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVfbmFjX2xsX3MxIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1X25hY19sbF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVfaGhfczAsVVNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dV9oaF9zMCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVfaGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1X2hoX3MxLFVTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVfaGhfczEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1X2hoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dV9obF9zMCxVU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1X2hsX3MwIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dV9obF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVfaGxfczEsVVNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dV9obF9zMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVfaGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1X2xoX3MwLFVTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVfbGhfczAgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1X2xoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dV9saF9zMSxVU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1X2xoX3MxIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dV9saF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVfbGxfczAsVVNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dV9sbF9zMCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVfbGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1X2xsX3MxLFVTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVfbGxfczEgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1X2xsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dWRfYWNjX2hoX3MwLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1ZF9hY2NfaGhfczAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVkX2FjY19oaF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVkX2FjY19oaF9zMSxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dWRfYWNjX2hoX3MxIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1ZF9hY2NfaGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1ZF9hY2NfaGxfczAsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVkX2FjY19obF9zMCA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dWRfYWNjX2hsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dWRfYWNjX2hsX3MxLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1ZF9hY2NfaGxfczEgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVkX2FjY19obF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVkX2FjY19saF9zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dWRfYWNjX2xoX3MwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1ZF9hY2NfbGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1ZF9hY2NfbGhfczEsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVkX2FjY19saF9zMSA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dWRfYWNjX2xoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dWRfYWNjX2xsX3MwLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1ZF9hY2NfbGxfczAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVkX2FjY19sbF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVkX2FjY19sbF9zMSxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dWRfYWNjX2xsX3MxIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1ZF9hY2NfbGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1ZF9uYWNfaGhfczAsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVkX25hY19oaF9zMCA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dWRfbmFjX2hoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dWRfbmFjX2hoX3MxLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1ZF9uYWNfaGhfczEgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVkX25hY19oaF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVkX25hY19obF9zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dWRfbmFjX2hsX3MwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1ZF9uYWNfaGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1ZF9uYWNfaGxfczEsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVkX25hY19obF9zMSA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dWRfbmFjX2hsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dWRfbmFjX2xoX3MwLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1ZF9uYWNfbGhfczAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVkX25hY19saF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVkX25hY19saF9zMSxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dWRfbmFjX2xoX3MxIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1ZF9uYWNfbGhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1ZF9uYWNfbGxfczAsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVkX25hY19sbF9zMCA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dWRfbmFjX2xsX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dWRfbmFjX2xsX3MxLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1ZF9uYWNfbGxfczEgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVkX25hY19sbF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVkX2hoX3MwLFVESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVkX2hoX3MwIDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dWRfaGhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1ZF9oaF9zMSxVRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1ZF9oaF9zMSA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVkX2hoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dWRfaGxfczAsVURJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dWRfaGxfczAgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1ZF9obF9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVkX2hsX3MxLFVESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVkX2hsX3MxIDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dWRfaGxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1ZF9saF9zMCxVRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1ZF9saF9zMCA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVkX2xoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5dWRfbGhfczEsVURJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dWRfbGhfczEgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1ZF9saF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVkX2xsX3MwLFVESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXVkX2xsX3MwIDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5dWRfbGxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHl1ZF9sbF9zMSxVRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHl1ZF9sbF9zMSA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVkX2xsX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbXB5c21pLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5c21pIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5c21pIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbWFjc2lwLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tYWNzaXAgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21hY3NpcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21hY3NpbixTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbWFjc2luIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tYWNzaW4iPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9kcG1weXNzX3MwLERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfZHBtcHlzc19zMCA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2RwbXB5c3NfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9kcG1weXNzX2FjY19zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfZHBtcHlzc19hY2NfczAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2RwbXB5c3NfYWNjX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfZHBtcHlzc19uYWNfczAsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX2RwbXB5c3NfbmFjX3MwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9kcG1weXNzX25hY19zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX2RwbXB5dXVfczAsVURJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfZHBtcHl1dV9zMCA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2RwbXB5dXVfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9kcG1weXV1X2FjY19zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfZHBtcHl1dV9hY2NfczAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2RwbXB5dXVfYWNjX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfZHBtcHl1dV9uYWNfczAsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX2RwbXB5dXVfbmFjX3MwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9kcG1weXV1X25hY19zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV91cCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV91cCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV91cCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV91cF9zMSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weV91cF9zMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weV91cF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weV91cF9zMV9zYXQsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlfdXBfczFfc2F0IDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5X3VwX3MxX3NhdCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVfdXAsVVNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dV91cCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21weXVfdXAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tcHlzdV91cCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21weXN1X3VwIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5c3VfdXAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9kcG1weXNzX3JuZF9zMCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX2RwbXB5c3Nfcm5kX3MwIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfZHBtcHlzc19ybmRfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNF9tYWNfdXBfczFfc2F0LFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF9tYWNfdXBfczFfc2F0IDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF9tYWNfdXBfczFfc2F0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfbmFjX3VwX3MxX3NhdCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTRfbmFjX3VwX3MxX3NhdCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTRfbmFjX3VwX3MxX3NhdCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weWksU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tcHlpIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbXB5aSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21weXVpLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbXB5dWkgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tcHl1aSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21hY2ksU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21hY2kgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX21hY2kiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9hY2NpLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9hY2NpIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9hY2NpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfYWNjaWksU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX2FjY2lpIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9hY2NpaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX25hY2NpLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9uYWNjaSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbmFjY2kiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9uYWNjaWksU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX25hY2NpaSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbmFjY2lpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfc3ViYWNjLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9zdWJhY2MgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX3N1YmFjYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X21weXJyX2FkZHIsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX000X21weXJyX2FkZHIgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX000X21weXJyX2FkZHIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNF9tcHlyaV9hZGRyX3UyLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF9tcHlyaV9hZGRyX3UyIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF9tcHlyaV9hZGRyX3UyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfbXB5cmlfYWRkcixTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTRfbXB5cmlfYWRkciA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTRfbXB5cmlfYWRkciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X21weXJpX2FkZGksU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX000X21weXJpX2FkZGkgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX000X21weXJpX2FkZGkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNF9tcHlycl9hZGRpLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF9tcHlycl9hZGRpIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF9tcHlycl9hZGRpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdm1weTJzX3MwLERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdm1weTJzX3MwIDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdm1weTJzX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdm1weTJzX3MxLERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdm1weTJzX3MxIDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdm1weTJzX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdm1hYzJzX3MwLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92bWFjMnNfczAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX3ZtYWMyc19zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZtYWMyc19zMSxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdm1hYzJzX3MxIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92bWFjMnNfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92bXB5MnN1X3MwLERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdm1weTJzdV9zMCA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX3ZtcHkyc3VfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92bXB5MnN1X3MxLERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdm1weTJzdV9zMSA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX3ZtcHkyc3VfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92bWFjMnN1X3MwLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92bWFjMnN1X3MwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92bWFjMnN1X3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdm1hYzJzdV9zMSxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdm1hYzJzdV9zMSA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdm1hYzJzdV9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZtcHkyc19zMHBhY2ssU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92bXB5MnNfczBwYWNrIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdm1weTJzX3MwcGFjayI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZtcHkyc19zMXBhY2ssU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92bXB5MnNfczFwYWNrIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdm1weTJzX3MxcGFjayI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZtYWMyLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92bWFjMiA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdm1hYzIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92bXB5MmVzX3MwLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdm1weTJlc19zMCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZtcHkyZXNfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92bXB5MmVzX3MxLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdm1weTJlc19zMSA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZtcHkyZXNfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92bWFjMmVzX3MwLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92bWFjMmVzX3MwIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92bWFjMmVzX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdm1hYzJlc19zMSxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdm1hYzJlc19zMSA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdm1hYzJlc19zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZtYWMyZXMsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZtYWMyZXMgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZtYWMyZXMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92cm1hY19zMCxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdnJtYWNfczAgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZybWFjX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdnJtcHlfczAsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92cm1weV9zMCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZybXB5X3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdmRtcHlyc19zMCxTSV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZkbXB5cnNfczAgOgorSGV4YWdvbl9zaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92ZG1weXJzX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdmRtcHlyc19zMSxTSV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZkbXB5cnNfczEgOgorSGV4YWdvbl9zaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92ZG1weXJzX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTVfdnJtcHlidXUsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNV92cm1weWJ1dSA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX001X3ZybXB5YnV1Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTVfdnJtYWNidXUsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX001X3ZybWFjYnV1IDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NNV92cm1hY2J1dSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk01X3ZybXB5YnN1LERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTVfdnJtcHlic3UgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NNV92cm1weWJzdSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk01X3ZybWFjYnN1LERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNV92cm1hY2JzdSA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTVfdnJtYWNic3UiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNV92bXB5YnV1LERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTVfdm1weWJ1dSA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX001X3ZtcHlidXUiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNV92bXB5YnN1LERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTVfdm1weWJzdSA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX001X3ZtcHlic3UiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNV92bWFjYnV1LERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNV92bWFjYnV1IDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NNV92bWFjYnV1Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTVfdm1hY2JzdSxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTVfdm1hY2JzdSA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTVfdm1hY2JzdSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk01X3ZkbXB5YnN1LERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTVfdmRtcHlic3UgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NNV92ZG1weWJzdSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk01X3ZkbWFjYnN1LERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNV92ZG1hY2JzdSA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTVfdmRtYWNic3UiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92ZG1hY3NfczAsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZkbWFjc19zMCA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdmRtYWNzX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdmRtYWNzX3MxLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92ZG1hY3NfczEgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZkbWFjc19zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZkbXB5c19zMCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZkbXB5c19zMCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZkbXB5c19zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZkbXB5c19zMSxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZkbXB5c19zMSA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZkbXB5c19zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX2NtcHlyc19zMCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX2NtcHlyc19zMCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2NtcHlyc19zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX2NtcHlyc19zMSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX2NtcHlyc19zMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2NtcHlyc19zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX2NtcHlyc2NfczAsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9jbXB5cnNjX3MwIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfY21weXJzY19zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX2NtcHlyc2NfczEsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9jbXB5cnNjX3MxIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfY21weXJzY19zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX2NtYWNzX3MwLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9jbWFjc19zMCA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfY21hY3NfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9jbWFjc19zMSxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfY21hY3NfczEgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2NtYWNzX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfY21hY3NjX3MwLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9jbWFjc2NfczAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2NtYWNzY19zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX2NtYWNzY19zMSxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfY21hY3NjX3MxIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9jbWFjc2NfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9jbXB5c19zMCxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX2NtcHlzX3MwIDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfY21weXNfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9jbXB5c19zMSxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX2NtcHlzX3MxIDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfY21weXNfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9jbXB5c2NfczAsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9jbXB5c2NfczAgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9jbXB5c2NfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9jbXB5c2NfczEsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9jbXB5c2NfczEgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9jbXB5c2NfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9jbmFjc19zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfY25hY3NfczAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2NuYWNzX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfY25hY3NfczEsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX2NuYWNzX3MxIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9jbmFjc19zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX2NuYWNzY19zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfY25hY3NjX3MwIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9jbmFjc2NfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9jbmFjc2NfczEsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX2NuYWNzY19zMSA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfY25hY3NjX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdnJjbXB5c19zMSxESV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZyY21weXNfczEgOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92cmNtcHlzX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdnJjbXB5c19hY2NfczEsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZyY21weXNfYWNjX3MxIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92cmNtcHlzX2FjY19zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZyY21weXNfczFycCxTSV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZyY21weXNfczFycCA6CitIZXhhZ29uX3NpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX3ZyY21weXNfczFycCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21tYWNsc19zMCxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbW1hY2xzX3MwIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tbWFjbHNfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tbWFjbHNfczEsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tYWNsc19zMSA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1hY2xzX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1hY2hzX3MwLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbWFjaHNfczAgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX21tYWNoc19zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21tYWNoc19zMSxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbW1hY2hzX3MxIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tbWFjaHNfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tbXB5bF9zMCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tcHlsX3MwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1weWxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tbXB5bF9zMSxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tcHlsX3MxIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1weWxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tbXB5aF9zMCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tcHloX3MwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1weWhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tbXB5aF9zMSxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tcHloX3MxIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1weWhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tbWFjbHNfcnMwLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbWFjbHNfcnMwIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tbWFjbHNfcnMwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1hY2xzX3JzMSxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbW1hY2xzX3JzMSA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1hY2xzX3JzMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21tYWNoc19yczAsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tYWNoc19yczAgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX21tYWNoc19yczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tbWFjaHNfcnMxLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbWFjaHNfcnMxIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tbWFjaHNfcnMxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1weWxfcnMwLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbW1weWxfcnMwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1weWxfcnMwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1weWxfcnMxLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbW1weWxfcnMxIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1weWxfcnMxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1weWhfcnMwLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbW1weWhfcnMwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1weWhfcnMwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1weWhfcnMxLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbW1weWhfcnMxIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1weWhfcnMxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfdnJtcHllaF9zMCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX000X3ZybXB5ZWhfczAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF92cm1weWVoX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfdnJtcHllaF9zMSxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX000X3ZybXB5ZWhfczEgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF92cm1weWVoX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfdnJtcHllaF9hY2NfczAsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX000X3ZybXB5ZWhfYWNjX3MwIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF92cm1weWVoX2FjY19zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X3ZybXB5ZWhfYWNjX3MxLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF92cm1weWVoX2FjY19zMSA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTRfdnJtcHllaF9hY2NfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNF92cm1weW9oX3MwLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTRfdnJtcHlvaF9zMCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX000X3ZybXB5b2hfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNF92cm1weW9oX3MxLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTRfdnJtcHlvaF9zMSA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX000X3ZybXB5b2hfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNF92cm1weW9oX2FjY19zMCxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTRfdnJtcHlvaF9hY2NfczAgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX000X3ZybXB5b2hfYWNjX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfdnJtcHlvaF9hY2NfczEsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX000X3ZybXB5b2hfYWNjX3MxIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF92cm1weW9oX2FjY19zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX2htbXB5bF9yczEsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9obW1weWxfcnMxIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfaG1tcHlsX3JzMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX2htbXB5aF9yczEsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9obW1weWhfcnMxIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfaG1tcHloX3JzMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX2htbXB5bF9zMSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX2htbXB5bF9zMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2htbXB5bF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX2htbXB5aF9zMSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX2htbXB5aF9zMSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2htbXB5aF9zMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21tYWN1bHNfczAsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tYWN1bHNfczAgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX21tYWN1bHNfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tbWFjdWxzX3MxLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbWFjdWxzX3MxIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tbWFjdWxzX3MxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1hY3Voc19zMCxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbW1hY3Voc19zMCA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1hY3Voc19zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21tYWN1aHNfczEsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tYWN1aHNfczEgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX21tYWN1aHNfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tbXB5dWxfczAsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbXB5dWxfczAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tbXB5dWxfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tbXB5dWxfczEsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbXB5dWxfczEgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tbXB5dWxfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tbXB5dWhfczAsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbXB5dWhfczAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tbXB5dWhfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tbXB5dWhfczEsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbXB5dWhfczEgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tbXB5dWhfczEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tbWFjdWxzX3JzMCxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbW1hY3Vsc19yczAgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX21tYWN1bHNfcnMwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1hY3Vsc19yczEsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tYWN1bHNfcnMxIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tbWFjdWxzX3JzMSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX21tYWN1aHNfcnMwLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9tbWFjdWhzX3JzMCA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfbW1hY3Voc19yczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9tbWFjdWhzX3JzMSxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfbW1hY3Voc19yczEgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX21tYWN1aHNfcnMxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1weXVsX3JzMCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tcHl1bF9yczAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tbXB5dWxfcnMwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1weXVsX3JzMSxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tcHl1bF9yczEgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tbXB5dWxfcnMxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1weXVoX3JzMCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tcHl1aF9yczAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tbXB5dWhfcnMwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfbW1weXVoX3JzMSxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX21tcHl1aF9yczEgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl9tbXB5dWhfcnMxIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdnJjbWFjaV9zMCxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdnJjbWFjaV9zMCA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdnJjbWFjaV9zMCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZyY21hY3JfczAsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZyY21hY3JfczAgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZyY21hY3JfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92cmNtYWNpX3MwYyxESV9mdHlwZV9ESURJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdnJjbWFjaV9zMGMgOgorSGV4YWdvbl9kaV9kaWRpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZyY21hY2lfczBjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdnJjbWFjcl9zMGMsRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZyY21hY3JfczBjIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92cmNtYWNyX3MwYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX2NtYWNpX3MwLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9jbWFjaV9zMCA6CitIZXhhZ29uX2RpX2Rpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfY21hY2lfczAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl9jbWFjcl9zMCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTJfY21hY3JfczAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2NtYWNyX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdnJjbXB5aV9zMCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZyY21weWlfczAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92cmNtcHlpX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdnJjbXB5cl9zMCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZyY21weXJfczAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92cmNtcHlyX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdnJjbXB5aV9zMGMsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92cmNtcHlpX3MwYyA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZyY21weWlfczBjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdnJjbXB5cl9zMGMsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92cmNtcHlyX3MwYyA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZyY21weXJfczBjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfY21weWlfczAsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9jbXB5aV9zMCA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2NtcHlpX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfY21weXJfczAsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl9jbXB5cl9zMCA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX00yX2NtcHlyX3MwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfY21weWlfd2gsU0lfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF9jbXB5aV93aCA6CitIZXhhZ29uX3NpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX000X2NtcHlpX3doIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfY21weXJfd2gsU0lfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF9jbXB5cl93aCA6CitIZXhhZ29uX3NpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX000X2NtcHlyX3doIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfY21weWlfd2hjLFNJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTRfY21weWlfd2hjIDoKK0hleGFnb25fc2lfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTRfY21weWlfd2hjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfY21weXJfd2hjLFNJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTRfY21weXJfd2hjIDoKK0hleGFnb25fc2lfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTRfY21weXJfd2hjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdmNtcHlfczBfc2F0X2ksRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92Y21weV9zMF9zYXRfaSA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZjbXB5X3MwX3NhdF9pIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdmNtcHlfczBfc2F0X3IsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92Y21weV9zMF9zYXRfciA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZjbXB5X3MwX3NhdF9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdmNtcHlfczFfc2F0X2ksRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92Y21weV9zMV9zYXRfaSA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZjbXB5X3MxX3NhdF9pIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdmNtcHlfczFfc2F0X3IsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92Y21weV9zMV9zYXRfciA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZjbXB5X3MxX3NhdF9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfdmNtYWNfczBfc2F0X2ksRElfZnR5cGVfRElESURJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZjbWFjX3MwX3NhdF9pIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92Y21hY19zMF9zYXRfaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZjbWFjX3MwX3NhdF9yLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92Y21hY19zMF9zYXRfciA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTJfdmNtYWNfczBfc2F0X3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl92Y3JvdGF0ZSxESV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3Zjcm90YXRlIDoKK0hleGFnb25fZGlfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdmNyb3RhdGUiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF92cmNyb3RhdGVfYWNjLERJX2Z0eXBlX0RJRElTSVNJLDQpCisvLworZGVmIGludF9oZXhhZ29uX1M0X3ZyY3JvdGF0ZV9hY2MgOgorSGV4YWdvbl9kaV9kaWRpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzRfdnJjcm90YXRlX2FjYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X3ZyY3JvdGF0ZSxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzRfdnJjcm90YXRlIDoKK0hleGFnb25fZGlfZGlzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TNF92cmNyb3RhdGUiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl92Y25lZ2gsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl92Y25lZ2ggOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl92Y25lZ2giPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl92cmNuZWdoLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl92cmNuZWdoIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl92cmNuZWdoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfcG1weXcsRElfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF9wbXB5dyA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX000X3BtcHl3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfdnBtcHloLERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTRfdnBtcHloIDoKK0hleGFnb25fZGlfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTRfdnBtcHloIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfcG1weXdfYWNjLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF9wbXB5d19hY2MgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX000X3BtcHl3X2FjYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X3ZwbXB5aF9hY2MsRElfZnR5cGVfRElTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX000X3ZwbXB5aF9hY2MgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX000X3ZwbXB5aF9hY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9hZGQsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hZGQgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9hZGQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdWIsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdWIgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9zdWIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9hZGRzYXQsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hZGRzYXQgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9hZGRzYXQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdWJzYXQsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdWJzYXQgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9zdWJzYXQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9hZGRpLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfYWRkaSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX2FkZGkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9hZGRoX2wxNl9sbCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX2FkZGhfbDE2X2xsIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYWRkaF9sMTZfbGwiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9hZGRoX2wxNl9obCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX2FkZGhfbDE2X2hsIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYWRkaF9sMTZfaGwiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9hZGRoX2wxNl9zYXRfbGwsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hZGRoX2wxNl9zYXRfbGwgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9hZGRoX2wxNl9zYXRfbGwiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9hZGRoX2wxNl9zYXRfaGwsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hZGRoX2wxNl9zYXRfaGwgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9hZGRoX2wxNl9zYXRfaGwiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdWJoX2wxNl9sbCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3N1YmhfbDE2X2xsIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3ViaF9sMTZfbGwiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdWJoX2wxNl9obCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3N1YmhfbDE2X2hsIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3ViaF9sMTZfaGwiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdWJoX2wxNl9zYXRfbGwsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdWJoX2wxNl9zYXRfbGwgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9zdWJoX2wxNl9zYXRfbGwiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdWJoX2wxNl9zYXRfaGwsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdWJoX2wxNl9zYXRfaGwgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9zdWJoX2wxNl9zYXRfaGwiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9hZGRoX2gxNl9sbCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX2FkZGhfaDE2X2xsIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYWRkaF9oMTZfbGwiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9hZGRoX2gxNl9saCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX2FkZGhfaDE2X2xoIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYWRkaF9oMTZfbGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9hZGRoX2gxNl9obCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX2FkZGhfaDE2X2hsIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYWRkaF9oMTZfaGwiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9hZGRoX2gxNl9oaCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX2FkZGhfaDE2X2hoIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYWRkaF9oMTZfaGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9hZGRoX2gxNl9zYXRfbGwsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hZGRoX2gxNl9zYXRfbGwgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9hZGRoX2gxNl9zYXRfbGwiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9hZGRoX2gxNl9zYXRfbGgsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hZGRoX2gxNl9zYXRfbGggOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9hZGRoX2gxNl9zYXRfbGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9hZGRoX2gxNl9zYXRfaGwsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hZGRoX2gxNl9zYXRfaGwgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9hZGRoX2gxNl9zYXRfaGwiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9hZGRoX2gxNl9zYXRfaGgsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hZGRoX2gxNl9zYXRfaGggOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9hZGRoX2gxNl9zYXRfaGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdWJoX2gxNl9sbCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3N1YmhfaDE2X2xsIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3ViaF9oMTZfbGwiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdWJoX2gxNl9saCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3N1YmhfaDE2X2xoIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3ViaF9oMTZfbGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdWJoX2gxNl9obCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3N1YmhfaDE2X2hsIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3ViaF9oMTZfaGwiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdWJoX2gxNl9oaCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3N1YmhfaDE2X2hoIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3ViaF9oMTZfaGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdWJoX2gxNl9zYXRfbGwsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdWJoX2gxNl9zYXRfbGwgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9zdWJoX2gxNl9zYXRfbGwiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdWJoX2gxNl9zYXRfbGgsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdWJoX2gxNl9zYXRfbGggOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9zdWJoX2gxNl9zYXRfbGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdWJoX2gxNl9zYXRfaGwsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdWJoX2gxNl9zYXRfaGwgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9zdWJoX2gxNl9zYXRfaGwiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zdWJoX2gxNl9zYXRfaGgsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdWJoX2gxNl9zYXRfaGggOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9zdWJoX2gxNl9zYXRfaGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9hc2xoLFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX2FzbGggOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYXNsaCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX2FzcmgsU0lfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQTJfYXNyaCA6CitIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9hc3JoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYWRkcCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX2FkZHAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9hZGRwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYWRkcHNhdCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX2FkZHBzYXQgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9hZGRwc2F0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYWRkc3AsRElfZnR5cGVfU0lESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hZGRzcCA6CitIZXhhZ29uX2RpX3NpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX2FkZHNwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc3VicCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3N1YnAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9zdWJwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfbmVnLFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX25lZyA6CitIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9uZWciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9uZWdzYXQsU0lfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQTJfbmVnc2F0IDoKK0hleGFnb25fc2lfc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX25lZ3NhdCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX2FicyxTSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hYnMgOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfYWJzIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYWJzc2F0LFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX2Fic3NhdCA6CitIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9hYnNzYXQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92Y29uaixESV9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92Y29uaiA6CitIZXhhZ29uX2RpX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92Y29uaiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX25lZ3AsRElfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQTJfbmVncCA6CitIZXhhZ29uX2RpX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9uZWdwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYWJzcCxESV9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hYnNwIDoKK0hleGFnb25fZGlfZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX2Fic3AiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9tYXgsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9tYXggOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9tYXgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9tYXh1LFVTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX21heHUgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9tYXh1Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfbWluLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfbWluIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfbWluIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfbWludSxVU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9taW51IDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfbWludSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX21heHAsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9tYXhwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfbWF4cCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX21heHVwLFVESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX21heHVwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfbWF4dXAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9taW5wLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfbWlucCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX21pbnAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9taW51cCxVRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9taW51cCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX21pbnVwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdGZyLFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3RmciA6CitIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl90ZnIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl90ZnJzaSxTSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl90ZnJzaSA6CitIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl90ZnJzaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3RmcnAsRElfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdGZycCA6CitIZXhhZ29uX2RpX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl90ZnJwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdGZycGksRElfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdGZycGkgOgorSGV4YWdvbl9kaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdGZycGkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl96eHRiLFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3p4dGIgOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfenh0YiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3N4dGIsU0lfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQTJfc3h0YiA6CitIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9zeHRiIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfenh0aCxTSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl96eHRoIDoKK0hleGFnb25fc2lfc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3p4dGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zeHRoLFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3N4dGggOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3h0aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX2NvbWJpbmV3LERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfY29tYmluZXcgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9jb21iaW5ldyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkE0X2NvbWJpbmVyaSxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X2NvbWJpbmVyaSA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X2NvbWJpbmVyaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkE0X2NvbWJpbmVpcixESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X2NvbWJpbmVpciA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X2NvbWJpbmVpciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX2NvbWJpbmVpaSxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX2NvbWJpbmVpaSA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX2NvbWJpbmVpaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX2NvbWJpbmVfaGgsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9jb21iaW5lX2hoIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfY29tYmluZV9oaCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX2NvbWJpbmVfaGwsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9jb21iaW5lX2hsIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfY29tYmluZV9obCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX2NvbWJpbmVfbGgsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9jb21iaW5lX2xoIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfY29tYmluZV9saCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX2NvbWJpbmVfbGwsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9jb21iaW5lX2xsIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfY29tYmluZV9sbCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3RmcmlsLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdGZyaWwgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl90ZnJpbCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3RmcmloLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdGZyaWggOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl90ZnJpaCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX2FuZCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX2FuZCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX2FuZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX29yLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfb3IgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9vciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3hvcixTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3hvciA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3hvciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX25vdCxTSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9ub3QgOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfbm90Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTJfeG9yX3hhY2MsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX00yX3hvcl94YWNjIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl94b3JfeGFjYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X3hvcl94YWNjLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF94b3JfeGFjYyA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fTTRfeG9yX3hhY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9hbmRuLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfYW5kbiA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X2FuZG4iPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9vcm4sU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9vcm4gOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9vcm4iPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9hbmRucCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X2FuZG5wIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfYW5kbnAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9vcm5wLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfb3JucCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0E0X29ybnAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF9hZGRhZGRpLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF9hZGRhZGRpIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TNF9hZGRhZGRpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzRfc3ViYWRkaSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzRfc3ViYWRkaSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzRfc3ViYWRkaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X2FuZF9hbmQsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX000X2FuZF9hbmQgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX000X2FuZF9hbmQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNF9hbmRfYW5kbixTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTRfYW5kX2FuZG4gOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX000X2FuZF9hbmRuIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfYW5kX29yLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF9hbmRfb3IgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX000X2FuZF9vciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X2FuZF94b3IsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX000X2FuZF94b3IgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX000X2FuZF94b3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNF9vcl9hbmQsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX000X29yX2FuZCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTRfb3JfYW5kIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfb3JfYW5kbixTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTRfb3JfYW5kbiA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTRfb3JfYW5kbiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X29yX29yLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NNF9vcl9vciA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTRfb3Jfb3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNF9vcl94b3IsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX000X29yX3hvciA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTRfb3JfeG9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzRfb3JfYW5kaXgsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1M0X29yX2FuZGl4IDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TNF9vcl9hbmRpeCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X29yX2FuZGksU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1M0X29yX2FuZGkgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1M0X29yX2FuZGkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF9vcl9vcmksU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1M0X29yX29yaSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzRfb3Jfb3JpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTRfeG9yX2FuZCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTRfeG9yX2FuZCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fTTRfeG9yX2FuZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk00X3hvcl9vcixTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTRfeG9yX29yIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9NNF94b3Jfb3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNF94b3JfYW5kbixTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fTTRfeG9yX2FuZG4gOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX000X3hvcl9hbmRuIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc3VicmksU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdWJyaSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3N1YnJpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYW5kaXIsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9hbmRpciA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX2FuZGlyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfb3JpcixTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX29yaXIgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9vcmlyIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfYW5kcCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX2FuZHAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9hbmRwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfb3JwLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfb3JwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfb3JwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfeG9ycCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3hvcnAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl94b3JwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfbm90cCxESV9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9ub3RwIDoKK0hleGFnb25fZGlfZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX25vdHAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zeHR3LERJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3N4dHcgOgorSGV4YWdvbl9kaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3h0dyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3NhdCxTSV9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zYXQgOgorSGV4YWdvbl9zaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc2F0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfcm91bmRzYXQsU0lfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQTJfcm91bmRzYXQgOgorSGV4YWdvbl9zaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfcm91bmRzYXQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zYXRoLFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3NhdGggOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc2F0aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3NhdHVoLFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3NhdHVoIDoKK0hleGFnb25fc2lfc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3NhdHVoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfc2F0dWIsU0lfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQTJfc2F0dWIgOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc2F0dWIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl9zYXRiLFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3NhdGIgOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc2F0YiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZhZGR1YixESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZhZGR1YiA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZhZGR1YiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZhZGRiX21hcCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZhZGRiX21hcCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZhZGRiX21hcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZhZGR1YnMsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92YWRkdWJzIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdmFkZHVicyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZhZGRoLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmFkZGggOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92YWRkaCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZhZGRocyxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZhZGRocyA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZhZGRocyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZhZGR1aHMsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92YWRkdWhzIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdmFkZHVocyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkE1X3ZhZGRodWJzLFNJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTVfdmFkZGh1YnMgOgorSGV4YWdvbl9zaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BNV92YWRkaHVicyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZhZGR3LERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmFkZHcgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92YWRkdyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZhZGR3cyxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZhZGR3cyA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZhZGR3cyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X3Z4YWRkc3VidyxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1M0X3Z4YWRkc3VidyA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX1M0X3Z4YWRkc3VidyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X3Z4c3ViYWRkdyxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1M0X3Z4c3ViYWRkdyA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX1M0X3Z4c3ViYWRkdyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X3Z4YWRkc3ViaCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1M0X3Z4YWRkc3ViaCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX1M0X3Z4YWRkc3ViaCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X3Z4c3ViYWRkaCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1M0X3Z4c3ViYWRkaCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX1M0X3Z4c3ViYWRkaCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X3Z4YWRkc3ViaHIsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF92eGFkZHN1YmhyIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fUzRfdnhhZGRzdWJociI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X3Z4c3ViYWRkaHIsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF92eHN1YmFkZGhyIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fUzRfdnhzdWJhZGRociI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3N2YXZnaCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3N2YXZnaCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3N2YXZnaCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3N2YXZnaHMsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdmF2Z2hzIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3ZhdmdocyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3N2bmF2Z2gsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdm5hdmdoIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3ZuYXZnaCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3N2YWRkaCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3N2YWRkaCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3N2YWRkaCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3N2YWRkaHMsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdmFkZGhzIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3ZhZGRocyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3N2YWRkdWhzLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfc3ZhZGR1aHMgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9zdmFkZHVocyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3N2c3ViaCxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3N2c3ViaCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0EyX3N2c3ViaCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3N2c3ViaHMsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl9zdnN1YmhzIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfc3ZzdWJocyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3N2c3VidWhzLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfc3ZzdWJ1aHMgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9zdnN1YnVocyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZyYWRkdWIsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92cmFkZHViIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdnJhZGR1YiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZyYWRkdWJfYWNjLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92cmFkZHViX2FjYyA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdnJhZGR1Yl9hY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92cmFkZGgsU0lfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9NMl92cmFkZGggOgorSGV4YWdvbl9zaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9NMl92cmFkZGgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NMl92cmFkZHVoLFNJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fTTJfdnJhZGR1aCA6CitIZXhhZ29uX3NpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZyYWRkdWgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92c3VidWIsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92c3VidWIgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92c3VidWIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92c3ViYl9tYXAsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92c3ViYl9tYXAgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92c3ViYl9tYXAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92c3VidWJzLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdnN1YnVicyA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZzdWJ1YnMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92c3ViaCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZzdWJoIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdnN1YmgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92c3ViaHMsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92c3ViaHMgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92c3ViaHMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92c3VidWhzLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdnN1YnVocyA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZzdWJ1aHMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92c3VidyxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZzdWJ3IDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdnN1YnciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92c3Vid3MsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92c3Vid3MgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92c3Vid3MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YWJzaCxESV9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92YWJzaCA6CitIZXhhZ29uX2RpX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92YWJzaCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZhYnNoc2F0LERJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZhYnNoc2F0IDoKK0hleGFnb25fZGlfZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZhYnNoc2F0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTJfdmFic3csRElfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmFic3cgOgorSGV4YWdvbl9kaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdmFic3ciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YWJzd3NhdCxESV9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92YWJzd3NhdCA6CitIZXhhZ29uX2RpX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92YWJzd3NhdCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZhYnNkaWZmdyxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZhYnNkaWZmdyA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZhYnNkaWZmdyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLk0yX3ZhYnNkaWZmaCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX00yX3ZhYnNkaWZmaCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX00yX3ZhYnNkaWZmaCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3Zyc2FkdWIsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92cnNhZHViIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdnJzYWR1YiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3Zyc2FkdWJfYWNjLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92cnNhZHViX2FjYyA6CitIZXhhZ29uX2RpX2RpZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdnJzYWR1Yl9hY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YXZndWIsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92YXZndWIgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92YXZndWIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YXZndWgsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92YXZndWggOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92YXZndWgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YXZnaCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZhdmdoIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdmF2Z2giPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92bmF2Z2gsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92bmF2Z2ggOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92bmF2Z2giPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YXZndyxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3Zhdmd3IDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdmF2Z3ciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92bmF2Z3csRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92bmF2Z3cgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92bmF2Z3ciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YXZnd3IsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92YXZnd3IgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92YXZnd3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92bmF2Z3dyLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdm5hdmd3ciA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZuYXZnd3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YXZnd2NyLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmF2Z3djciA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3Zhdmd3Y3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92bmF2Z3djcixESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZuYXZnd2NyIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdm5hdmd3Y3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YXZnaGNyLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmF2Z2hjciA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZhdmdoY3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92bmF2Z2hjcixESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZuYXZnaGNyIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fQTJfdm5hdmdoY3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YXZndXcsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92YXZndXcgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92YXZndXciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YXZndXdyLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmF2Z3V3ciA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3Zhdmd1d3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YXZndWJyLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmF2Z3ViciA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3Zhdmd1YnIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YXZndWhyLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdmF2Z3VociA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3Zhdmd1aHIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92YXZnaHIsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BMl92YXZnaHIgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92YXZnaHIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BMl92bmF2Z2hyLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdm5hdmdociA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZuYXZnaHIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9yb3VuZF9yaSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X3JvdW5kX3JpIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfcm91bmRfcmkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9yb3VuZF9ycixTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X3JvdW5kX3JyIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfcm91bmRfcnIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9yb3VuZF9yaV9zYXQsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9yb3VuZF9yaV9zYXQgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9yb3VuZF9yaV9zYXQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9yb3VuZF9ycl9zYXQsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9yb3VuZF9ycl9zYXQgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9yb3VuZF9ycl9zYXQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9jcm91bmRfcmksU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9jcm91bmRfcmkgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9jcm91bmRfcmkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF9jcm91bmRfcnIsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF9jcm91bmRfcnIgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9jcm91bmRfcnIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF92cm1pbmgsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX0E0X3ZybWluaCA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfdnJtaW5oIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfdnJtYXhoLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF92cm1heGggOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X3ZybWF4aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkE0X3ZybWludWgsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX0E0X3ZybWludWggOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X3ZybWludWgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF92cm1heHVoLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF92cm1heHVoIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF92cm1heHVoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfdnJtaW53LERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF92cm1pbncgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X3ZybWludyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkE0X3ZybWF4dyxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fQTRfdnJtYXh3IDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF92cm1heHciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5BNF92cm1pbnV3LERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9BNF92cm1pbnV3IDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF92cm1pbnV3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTRfdnJtYXh1dyxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fQTRfdnJtYXh1dyA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fQTRfdnJtYXh1dyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZtaW5iLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdm1pbmIgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92bWluYiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZtYXhiLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdm1heGIgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92bWF4YiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZtaW51YixESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZtaW51YiA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZtaW51YiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZtYXh1YixESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZtYXh1YiA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZtYXh1YiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZtaW5oLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdm1pbmggOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92bWluaCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZtYXhoLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdm1heGggOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92bWF4aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZtaW51aCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZtaW51aCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZtaW51aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZtYXh1aCxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZtYXh1aCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZtYXh1aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZtaW53LERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdm1pbncgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92bWludyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZtYXh3LERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTJfdm1heHcgOgorSGV4YWdvbl9kaV9kaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl92bWF4dyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZtaW51dyxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZtaW51dyA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZtaW51dyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3ZtYXh1dyxESV9mdHlwZV9ESURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0EyX3ZtYXh1dyA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX0EyX3ZtYXh1dyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkE0X21vZHdyYXB1LFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfbW9kd3JhcHUgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9tb2R3cmFwdSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX3NmYWRkLFNGX2Z0eXBlX1NGU0YsMikKKy8vCitkZWYgaW50X2hleGFnb25fRjJfc2ZhZGQgOgorSGV4YWdvbl9zZl9zZnNmX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9zZmFkZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX3Nmc3ViLFNGX2Z0eXBlX1NGU0YsMikKKy8vCitkZWYgaW50X2hleGFnb25fRjJfc2ZzdWIgOgorSGV4YWdvbl9zZl9zZnNmX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9zZnN1YiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX3NmbXB5LFNGX2Z0eXBlX1NGU0YsMikKKy8vCitkZWYgaW50X2hleGFnb25fRjJfc2ZtcHkgOgorSGV4YWdvbl9zZl9zZnNmX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9zZm1weSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX3NmZm1hLFNGX2Z0eXBlX1NGU0ZTRiwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9zZmZtYSA6CitIZXhhZ29uX3NmX3Nmc2ZzZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfc2ZmbWEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9zZmZtYV9zYyxTRl9mdHlwZV9TRlNGU0ZRSSw0KQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9zZmZtYV9zYyA6CitIZXhhZ29uX3NmX3Nmc2ZzZnFpX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9zZmZtYV9zYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX3NmZm1zLFNGX2Z0eXBlX1NGU0ZTRiwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9zZmZtcyA6CitIZXhhZ29uX3NmX3Nmc2ZzZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfc2ZmbXMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9zZmZtYV9saWIsU0ZfZnR5cGVfU0ZTRlNGLDMpCisvLworZGVmIGludF9oZXhhZ29uX0YyX3NmZm1hX2xpYiA6CitIZXhhZ29uX3NmX3Nmc2ZzZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfc2ZmbWFfbGliIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfc2ZmbXNfbGliLFNGX2Z0eXBlX1NGU0ZTRiwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9zZmZtc19saWIgOgorSGV4YWdvbl9zZl9zZnNmc2ZfSW50cmluc2ljPCJIRVhBR09OX0YyX3NmZm1zX2xpYiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX3NmY21wZXEsUUlfZnR5cGVfU0ZTRiwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9zZmNtcGVxIDoKK0hleGFnb25fc2lfc2ZzZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfc2ZjbXBlcSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX3NmY21wZ3QsUUlfZnR5cGVfU0ZTRiwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9zZmNtcGd0IDoKK0hleGFnb25fc2lfc2ZzZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfc2ZjbXBndCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX3NmY21wZ2UsUUlfZnR5cGVfU0ZTRiwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9zZmNtcGdlIDoKK0hleGFnb25fc2lfc2ZzZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfc2ZjbXBnZSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX3NmY21wdW8sUUlfZnR5cGVfU0ZTRiwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9zZmNtcHVvIDoKK0hleGFnb25fc2lfc2ZzZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfc2ZjbXB1byI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX3NmbWF4LFNGX2Z0eXBlX1NGU0YsMikKKy8vCitkZWYgaW50X2hleGFnb25fRjJfc2ZtYXggOgorSGV4YWdvbl9zZl9zZnNmX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9zZm1heCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX3NmbWluLFNGX2Z0eXBlX1NGU0YsMikKKy8vCitkZWYgaW50X2hleGFnb25fRjJfc2ZtaW4gOgorSGV4YWdvbl9zZl9zZnNmX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9zZm1pbiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX3NmY2xhc3MsUUlfZnR5cGVfU0ZTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9zZmNsYXNzIDoKK0hleGFnb25fc2lfc2ZzaV9JbnRyaW5zaWM8IkhFWEFHT05fRjJfc2ZjbGFzcyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX3NmaW1tX3AsU0ZfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfc2ZpbW1fcCA6CitIZXhhZ29uX3NmX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9zZmltbV9wIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfc2ZpbW1fbixTRl9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9zZmltbV9uIDoKK0hleGFnb25fc2Zfc2lfSW50cmluc2ljPCJIRVhBR09OX0YyX3NmaW1tX24iPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9zZmZpeHVwbixTRl9mdHlwZV9TRlNGLDIpCisvLworZGVmIGludF9oZXhhZ29uX0YyX3NmZml4dXBuIDoKK0hleGFnb25fc2Zfc2ZzZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfc2ZmaXh1cG4iPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9zZmZpeHVwZCxTRl9mdHlwZV9TRlNGLDIpCisvLworZGVmIGludF9oZXhhZ29uX0YyX3NmZml4dXBkIDoKK0hleGFnb25fc2Zfc2ZzZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfc2ZmaXh1cGQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9zZmZpeHVwcixTRl9mdHlwZV9TRiwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9zZmZpeHVwciA6CitIZXhhZ29uX3NmX3NmX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9zZmZpeHVwciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2RmY21wZXEsUUlfZnR5cGVfREZERiwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9kZmNtcGVxIDoKK0hleGFnb25fc2lfZGZkZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfZGZjbXBlcSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2RmY21wZ3QsUUlfZnR5cGVfREZERiwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9kZmNtcGd0IDoKK0hleGFnb25fc2lfZGZkZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfZGZjbXBndCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2RmY21wZ2UsUUlfZnR5cGVfREZERiwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9kZmNtcGdlIDoKK0hleGFnb25fc2lfZGZkZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfZGZjbXBnZSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2RmY21wdW8sUUlfZnR5cGVfREZERiwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9kZmNtcHVvIDoKK0hleGFnb25fc2lfZGZkZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfZGZjbXB1byI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2RmY2xhc3MsUUlfZnR5cGVfREZTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9kZmNsYXNzIDoKK0hleGFnb25fc2lfZGZzaV9JbnRyaW5zaWM8IkhFWEFHT05fRjJfZGZjbGFzcyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2RmaW1tX3AsREZfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfZGZpbW1fcCA6CitIZXhhZ29uX2RmX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9kZmltbV9wIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfZGZpbW1fbixERl9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9kZmltbV9uIDoKK0hleGFnb25fZGZfc2lfSW50cmluc2ljPCJIRVhBR09OX0YyX2RmaW1tX24iPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9jb252X3NmMmRmLERGX2Z0eXBlX1NGLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2NvbnZfc2YyZGYgOgorSGV4YWdvbl9kZl9zZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfY29udl9zZjJkZiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2NvbnZfZGYyc2YsU0ZfZnR5cGVfREYsMSkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfY29udl9kZjJzZiA6CitIZXhhZ29uX3NmX2RmX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9jb252X2RmMnNmIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfY29udl91dzJzZixTRl9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9jb252X3V3MnNmIDoKK0hleGFnb25fc2Zfc2lfSW50cmluc2ljPCJIRVhBR09OX0YyX2NvbnZfdXcyc2YiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9jb252X3V3MmRmLERGX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2NvbnZfdXcyZGYgOgorSGV4YWdvbl9kZl9zaV9JbnRyaW5zaWM8IkhFWEFHT05fRjJfY29udl91dzJkZiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2NvbnZfdzJzZixTRl9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9jb252X3cyc2YgOgorSGV4YWdvbl9zZl9zaV9JbnRyaW5zaWM8IkhFWEFHT05fRjJfY29udl93MnNmIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfY29udl93MmRmLERGX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2NvbnZfdzJkZiA6CitIZXhhZ29uX2RmX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9jb252X3cyZGYiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9jb252X3VkMnNmLFNGX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2NvbnZfdWQyc2YgOgorSGV4YWdvbl9zZl9kaV9JbnRyaW5zaWM8IkhFWEFHT05fRjJfY29udl91ZDJzZiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2NvbnZfdWQyZGYsREZfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfY29udl91ZDJkZiA6CitIZXhhZ29uX2RmX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9jb252X3VkMmRmIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfY29udl9kMnNmLFNGX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2NvbnZfZDJzZiA6CitIZXhhZ29uX3NmX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9jb252X2Qyc2YiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9jb252X2QyZGYsREZfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfY29udl9kMmRmIDoKK0hleGFnb25fZGZfZGlfSW50cmluc2ljPCJIRVhBR09OX0YyX2NvbnZfZDJkZiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2NvbnZfc2YydXcsU0lfZnR5cGVfU0YsMSkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfY29udl9zZjJ1dyA6CitIZXhhZ29uX3NpX3NmX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9jb252X3NmMnV3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfY29udl9zZjJ3LFNJX2Z0eXBlX1NGLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2NvbnZfc2YydyA6CitIZXhhZ29uX3NpX3NmX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9jb252X3NmMnciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9jb252X3NmMnVkLERJX2Z0eXBlX1NGLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2NvbnZfc2YydWQgOgorSGV4YWdvbl9kaV9zZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfY29udl9zZjJ1ZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2NvbnZfc2YyZCxESV9mdHlwZV9TRiwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9jb252X3NmMmQgOgorSGV4YWdvbl9kaV9zZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfY29udl9zZjJkIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfY29udl9kZjJ1dyxTSV9mdHlwZV9ERiwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9jb252X2RmMnV3IDoKK0hleGFnb25fc2lfZGZfSW50cmluc2ljPCJIRVhBR09OX0YyX2NvbnZfZGYydXciPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9jb252X2RmMncsU0lfZnR5cGVfREYsMSkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfY29udl9kZjJ3IDoKK0hleGFnb25fc2lfZGZfSW50cmluc2ljPCJIRVhBR09OX0YyX2NvbnZfZGYydyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2NvbnZfZGYydWQsRElfZnR5cGVfREYsMSkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfY29udl9kZjJ1ZCA6CitIZXhhZ29uX2RpX2RmX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9jb252X2RmMnVkIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfY29udl9kZjJkLERJX2Z0eXBlX0RGLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2NvbnZfZGYyZCA6CitIZXhhZ29uX2RpX2RmX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9jb252X2RmMmQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9jb252X3NmMnV3X2Nob3AsU0lfZnR5cGVfU0YsMSkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfY29udl9zZjJ1d19jaG9wIDoKK0hleGFnb25fc2lfc2ZfSW50cmluc2ljPCJIRVhBR09OX0YyX2NvbnZfc2YydXdfY2hvcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2NvbnZfc2Yyd19jaG9wLFNJX2Z0eXBlX1NGLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2NvbnZfc2Yyd19jaG9wIDoKK0hleGFnb25fc2lfc2ZfSW50cmluc2ljPCJIRVhBR09OX0YyX2NvbnZfc2Yyd19jaG9wIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfY29udl9zZjJ1ZF9jaG9wLERJX2Z0eXBlX1NGLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2NvbnZfc2YydWRfY2hvcCA6CitIZXhhZ29uX2RpX3NmX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9jb252X3NmMnVkX2Nob3AiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9jb252X3NmMmRfY2hvcCxESV9mdHlwZV9TRiwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9jb252X3NmMmRfY2hvcCA6CitIZXhhZ29uX2RpX3NmX0ludHJpbnNpYzwiSEVYQUdPTl9GMl9jb252X3NmMmRfY2hvcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2NvbnZfZGYydXdfY2hvcCxTSV9mdHlwZV9ERiwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9GMl9jb252X2RmMnV3X2Nob3AgOgorSGV4YWdvbl9zaV9kZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfY29udl9kZjJ1d19jaG9wIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uRjJfY29udl9kZjJ3X2Nob3AsU0lfZnR5cGVfREYsMSkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfY29udl9kZjJ3X2Nob3AgOgorSGV4YWdvbl9zaV9kZl9JbnRyaW5zaWM8IkhFWEFHT05fRjJfY29udl9kZjJ3X2Nob3AiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5GMl9jb252X2RmMnVkX2Nob3AsRElfZnR5cGVfREYsMSkKKy8vCitkZWYgaW50X2hleGFnb25fRjJfY29udl9kZjJ1ZF9jaG9wIDoKK0hleGFnb25fZGlfZGZfSW50cmluc2ljPCJIRVhBR09OX0YyX2NvbnZfZGYydWRfY2hvcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkYyX2NvbnZfZGYyZF9jaG9wLERJX2Z0eXBlX0RGLDEpCisvLworZGVmIGludF9oZXhhZ29uX0YyX2NvbnZfZGYyZF9jaG9wIDoKK0hleGFnb25fZGlfZGZfSW50cmluc2ljPCJIRVhBR09OX0YyX2NvbnZfZGYyZF9jaG9wIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX3JfcixTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2Fzcl9yX3IgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3Jfcl9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX3JfcixTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2FzbF9yX3IgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfcl9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNyX3JfcixTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzcl9yX3IgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc3Jfcl9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNsX3JfcixTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzbF9yX3IgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc2xfcl9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX3JfcCxESV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2Fzcl9yX3AgOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3Jfcl9wIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX3JfcCxESV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2FzbF9yX3AgOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfcl9wIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNyX3JfcCxESV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzcl9yX3AgOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc3Jfcl9wIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNsX3JfcCxESV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzbF9yX3AgOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc2xfcl9wIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX3Jfcl9hY2MsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2Fzcl9yX3JfYWNjIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3Jfcl9yX2FjYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9yX3JfYWNjLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc2xfcl9yX2FjYyA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNsX3Jfcl9hY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc3Jfcl9yX2FjYyxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNyX3Jfcl9hY2MgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzcl9yX3JfYWNjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNsX3Jfcl9hY2MsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzbF9yX3JfYWNjIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc2xfcl9yX2FjYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9yX3BfYWNjLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3Jfcl9wX2FjYyA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNyX3JfcF9hY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc2xfcl9wX2FjYyxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX3JfcF9hY2MgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2FzbF9yX3BfYWNjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNyX3JfcF9hY2MsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzcl9yX3BfYWNjIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc3Jfcl9wX2FjYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzbF9yX3BfYWNjLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc2xfcl9wX2FjYyA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNsX3JfcF9hY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc3Jfcl9yX25hYyxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNyX3Jfcl9uYWMgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2Fzcl9yX3JfbmFjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX3Jfcl9uYWMsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2FzbF9yX3JfbmFjIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfcl9yX25hYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzcl9yX3JfbmFjLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3Jfcl9yX25hYyA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNyX3Jfcl9uYWMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc2xfcl9yX25hYyxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNsX3Jfcl9uYWMgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzbF9yX3JfbmFjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX3JfcF9uYWMsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2Fzcl9yX3BfbmFjIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3Jfcl9wX25hYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9yX3BfbmFjLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc2xfcl9wX25hYyA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNsX3JfcF9uYWMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc3Jfcl9wX25hYyxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNyX3JfcF9uYWMgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzcl9yX3BfbmFjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNsX3JfcF9uYWMsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzbF9yX3BfbmFjIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc2xfcl9wX25hYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9yX3JfYW5kLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3Jfcl9yX2FuZCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNyX3Jfcl9hbmQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc2xfcl9yX2FuZCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX3Jfcl9hbmQgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2FzbF9yX3JfYW5kIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNyX3Jfcl9hbmQsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzcl9yX3JfYW5kIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc3Jfcl9yX2FuZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzbF9yX3JfYW5kLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc2xfcl9yX2FuZCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNsX3Jfcl9hbmQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc3Jfcl9yX29yLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3Jfcl9yX29yIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3Jfcl9yX29yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX3Jfcl9vcixTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX3Jfcl9vciA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNsX3Jfcl9vciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzcl9yX3Jfb3IsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzcl9yX3Jfb3IgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzcl9yX3Jfb3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc2xfcl9yX29yLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc2xfcl9yX29yIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc2xfcl9yX29yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX3JfcF9hbmQsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2Fzcl9yX3BfYW5kIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3Jfcl9wX2FuZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9yX3BfYW5kLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc2xfcl9wX2FuZCA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNsX3JfcF9hbmQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc3Jfcl9wX2FuZCxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNyX3JfcF9hbmQgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzcl9yX3BfYW5kIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNsX3JfcF9hbmQsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzbF9yX3BfYW5kIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc2xfcl9wX2FuZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9yX3Bfb3IsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2Fzcl9yX3Bfb3IgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2Fzcl9yX3Bfb3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc2xfcl9wX29yLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc2xfcl9wX29yIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfcl9wX29yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNyX3JfcF9vcixESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNyX3JfcF9vciA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNyX3JfcF9vciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzbF9yX3Bfb3IsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzbF9yX3Bfb3IgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzbF9yX3Bfb3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc3Jfcl9wX3hvcixESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNyX3JfcF94b3IgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2Fzcl9yX3BfeG9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX3JfcF94b3IsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2FzbF9yX3BfeG9yIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfcl9wX3hvciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzcl9yX3BfeG9yLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3Jfcl9wX3hvciA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNyX3JfcF94b3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc2xfcl9wX3hvcixESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNsX3JfcF94b3IgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzbF9yX3BfeG9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX3Jfcl9zYXQsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3Jfcl9yX3NhdCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2Fzcl9yX3Jfc2F0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX3Jfcl9zYXQsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc2xfcl9yX3NhdCA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2FzbF9yX3Jfc2F0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX2lfcixTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2Fzcl9pX3IgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3JfaV9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNyX2lfcixTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzcl9pX3IgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc3JfaV9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX2lfcixTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2FzbF9pX3IgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfaV9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX2lfcCxESV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2Fzcl9pX3AgOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3JfaV9wIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNyX2lfcCxESV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzcl9pX3AgOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc3JfaV9wIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX2lfcCxESV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2FzbF9pX3AgOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfaV9wIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX2lfcl9hY2MsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2Fzcl9pX3JfYWNjIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3JfaV9yX2FjYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzcl9pX3JfYWNjLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3JfaV9yX2FjYyA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNyX2lfcl9hY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc2xfaV9yX2FjYyxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX2lfcl9hY2MgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2FzbF9pX3JfYWNjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX2lfcF9hY2MsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2Fzcl9pX3BfYWNjIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3JfaV9wX2FjYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzcl9pX3BfYWNjLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3JfaV9wX2FjYyA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNyX2lfcF9hY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc2xfaV9wX2FjYyxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX2lfcF9hY2MgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2FzbF9pX3BfYWNjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX2lfcl9uYWMsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2Fzcl9pX3JfbmFjIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3JfaV9yX25hYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzcl9pX3JfbmFjLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3JfaV9yX25hYyA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNyX2lfcl9uYWMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc2xfaV9yX25hYyxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX2lfcl9uYWMgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2FzbF9pX3JfbmFjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX2lfcF9uYWMsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2Fzcl9pX3BfbmFjIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3JfaV9wX25hYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xzcl9pX3BfbmFjLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3JfaV9wX25hYyA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNyX2lfcF9uYWMiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9hc2xfaV9wX25hYyxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX2lfcF9uYWMgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2FzbF9pX3BfbmFjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNyX2lfcl94YWNjLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3JfaV9yX3hhY2MgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzcl9pX3JfeGFjYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9pX3JfeGFjYyxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX2lfcl94YWNjIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfaV9yX3hhY2MiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc3JfaV9wX3hhY2MsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2xzcl9pX3BfeGFjYyA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbHNyX2lfcF94YWNjIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX2lfcF94YWNjLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc2xfaV9wX3hhY2MgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2FzbF9pX3BfeGFjYyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9pX3JfYW5kLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3JfaV9yX2FuZCA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNyX2lfcl9hbmQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc3JfaV9yX2FuZCxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNyX2lfcl9hbmQgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzcl9pX3JfYW5kIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX2lfcl9hbmQsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2FzbF9pX3JfYW5kIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfaV9yX2FuZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9pX3Jfb3IsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2Fzcl9pX3Jfb3IgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2Fzcl9pX3Jfb3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc3JfaV9yX29yLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3JfaV9yX29yIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc3JfaV9yX29yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX2lfcl9vcixTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX2lfcl9vciA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNsX2lfcl9vciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9pX3BfYW5kLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3JfaV9wX2FuZCA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNyX2lfcF9hbmQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc3JfaV9wX2FuZCxESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfbHNyX2lfcF9hbmQgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzcl9pX3BfYW5kIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX2lfcF9hbmQsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2FzbF9pX3BfYW5kIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfaV9wX2FuZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9pX3Bfb3IsRElfZnR5cGVfRElESVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2Fzcl9pX3Bfb3IgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2Fzcl9pX3Bfb3IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9sc3JfaV9wX29yLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3JfaV9wX29yIDoKK0hleGFnb25fZGlfZGlkaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9sc3JfaV9wX29yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX2lfcF9vcixESV9mdHlwZV9ESURJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX2lfcF9vciA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNsX2lfcF9vciI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FzbF9pX3Jfc2F0LFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNsX2lfcl9zYXQgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc2xfaV9yX3NhdCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9pX3Jfcm5kLFNJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNyX2lfcl9ybmQgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3JfaV9yX3JuZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9pX3Jfcm5kX2dvb2RzeW50YXgsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3JfaV9yX3JuZF9nb29kc3ludGF4IDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNyX2lfcl9ybmRfZ29vZHN5bnRheCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9pX3Bfcm5kLERJX2Z0eXBlX0RJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfYXNyX2lfcF9ybmQgOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9hc3JfaV9wX3JuZCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2Fzcl9pX3Bfcm5kX2dvb2RzeW50YXgsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3JfaV9wX3JuZF9nb29kc3ludGF4IDoKK0hleGFnb25fZGlfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYXNyX2lfcF9ybmRfZ29vZHN5bnRheCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X2xzbGksU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF9sc2xpIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzRfbHNsaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2FkZGFzbF9ycnJpLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hZGRhc2xfcnJyaSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYWRkYXNsX3JycmkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF9hbmRpX2FzbF9yaSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzRfYW5kaV9hc2xfcmkgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1M0X2FuZGlfYXNsX3JpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzRfb3JpX2FzbF9yaSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzRfb3JpX2FzbF9yaSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzRfb3JpX2FzbF9yaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X2FkZGlfYXNsX3JpLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF9hZGRpX2FzbF9yaSA6CitIZXhhZ29uX3NpX3Npc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzRfYWRkaV9hc2xfcmkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF9zdWJpX2FzbF9yaSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzRfc3ViaV9hc2xfcmkgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1M0X3N1YmlfYXNsX3JpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzRfYW5kaV9sc3JfcmksU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1M0X2FuZGlfbHNyX3JpIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TNF9hbmRpX2xzcl9yaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X29yaV9sc3JfcmksU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1M0X29yaV9sc3JfcmkgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1M0X29yaV9sc3JfcmkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF9hZGRpX2xzcl9yaSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzRfYWRkaV9sc3JfcmkgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1M0X2FkZGlfbHNyX3JpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzRfc3ViaV9sc3JfcmksU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1M0X3N1YmlfbHNyX3JpIDoKK0hleGFnb25fc2lfc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TNF9zdWJpX2xzcl9yaSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3ZhbGlnbmliLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl92YWxpZ25pYiA6CitIZXhhZ29uX2RpX2RpZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdmFsaWduaWIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl92YWxpZ25yYixESV9mdHlwZV9ESURJUUksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdmFsaWducmIgOgorSGV4YWdvbl9kaV9kaWRpcWlfSW50cmluc2ljPCJIRVhBR09OX1MyX3ZhbGlnbnJiIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdnNwbGljZWliLERJX2Z0eXBlX0RJRElTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl92c3BsaWNlaWIgOgorSGV4YWdvbl9kaV9kaWRpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX3ZzcGxpY2VpYiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3ZzcGxpY2VyYixESV9mdHlwZV9ESURJUUksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdnNwbGljZXJiIDoKK0hleGFnb25fZGlfZGlkaXFpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl92c3BsaWNlcmIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl92c3BsYXRyaCxESV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl92c3BsYXRyaCA6CitIZXhhZ29uX2RpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl92c3BsYXRyaCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3ZzcGxhdHJiLFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3ZzcGxhdHJiIDoKK0hleGFnb25fc2lfc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX3ZzcGxhdHJiIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfaW5zZXJ0LFNJX2Z0eXBlX1NJU0lTSVNJLDQpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2luc2VydCA6CitIZXhhZ29uX3NpX3Npc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9pbnNlcnQiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl90YWJsZWlkeGJfZ29vZHN5bnRheCxTSV9mdHlwZV9TSVNJU0lTSSw0KQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl90YWJsZWlkeGJfZ29vZHN5bnRheCA6CitIZXhhZ29uX3NpX3Npc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl90YWJsZWlkeGJfZ29vZHN5bnRheCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3RhYmxlaWR4aF9nb29kc3ludGF4LFNJX2Z0eXBlX1NJU0lTSVNJLDQpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3RhYmxlaWR4aF9nb29kc3ludGF4IDoKK0hleGFnb25fc2lfc2lzaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX3RhYmxlaWR4aF9nb29kc3ludGF4Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdGFibGVpZHh3X2dvb2RzeW50YXgsU0lfZnR5cGVfU0lTSVNJU0ksNCkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdGFibGVpZHh3X2dvb2RzeW50YXggOgorSGV4YWdvbl9zaV9zaXNpc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdGFibGVpZHh3X2dvb2RzeW50YXgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl90YWJsZWlkeGRfZ29vZHN5bnRheCxTSV9mdHlwZV9TSVNJU0lTSSw0KQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl90YWJsZWlkeGRfZ29vZHN5bnRheCA6CitIZXhhZ29uX3NpX3Npc2lzaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl90YWJsZWlkeGRfZ29vZHN5bnRheCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkE0X2JpdHNwbGl0aSxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX0E0X2JpdHNwbGl0aSA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX0E0X2JpdHNwbGl0aSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkE0X2JpdHNwbGl0LERJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fQTRfYml0c3BsaXQgOgorSGV4YWdvbl9kaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9BNF9iaXRzcGxpdCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X2V4dHJhY3QsU0lfZnR5cGVfU0lTSVNJLDMpCisvLworZGVmIGludF9oZXhhZ29uX1M0X2V4dHJhY3QgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1M0X2V4dHJhY3QiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9leHRyYWN0dSxTSV9mdHlwZV9TSVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfZXh0cmFjdHUgOgorSGV4YWdvbl9zaV9zaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2V4dHJhY3R1Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfaW5zZXJ0cCxESV9mdHlwZV9ESURJU0lTSSw0KQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9pbnNlcnRwIDoKK0hleGFnb25fZGlfZGlkaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2luc2VydHAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF9leHRyYWN0cCxESV9mdHlwZV9ESVNJU0ksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzRfZXh0cmFjdHAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1M0X2V4dHJhY3RwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfZXh0cmFjdHVwLERJX2Z0eXBlX0RJU0lTSSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9leHRyYWN0dXAgOgorSGV4YWdvbl9kaV9kaXNpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2V4dHJhY3R1cCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2luc2VydF9ycCxTSV9mdHlwZV9TSVNJREksMykKKy8vCitkZWYgaW50X2hleGFnb25fUzJfaW5zZXJ0X3JwIDoKK0hleGFnb25fc2lfc2lzaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9pbnNlcnRfcnAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF9leHRyYWN0X3JwLFNJX2Z0eXBlX1NJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzRfZXh0cmFjdF9ycCA6CitIZXhhZ29uX3NpX3NpZGlfSW50cmluc2ljPCJIRVhBR09OX1M0X2V4dHJhY3RfcnAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9leHRyYWN0dV9ycCxTSV9mdHlwZV9TSURJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2V4dHJhY3R1X3JwIDoKK0hleGFnb25fc2lfc2lkaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfZXh0cmFjdHVfcnAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9pbnNlcnRwX3JwLERJX2Z0eXBlX0RJRElESSwzKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9pbnNlcnRwX3JwIDoKK0hleGFnb25fZGlfZGlkaWRpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9pbnNlcnRwX3JwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzRfZXh0cmFjdHBfcnAsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TNF9leHRyYWN0cF9ycCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX1M0X2V4dHJhY3RwX3JwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfZXh0cmFjdHVwX3JwLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfZXh0cmFjdHVwX3JwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfZXh0cmFjdHVwX3JwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdHN0Yml0X2ksUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl90c3RiaXRfaSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX3RzdGJpdF9pIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzRfbnRzdGJpdF9pLFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzRfbnRzdGJpdF9pIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzRfbnRzdGJpdF9pIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfc2V0Yml0X2ksU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9zZXRiaXRfaSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX3NldGJpdF9pIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdG9nZ2xlYml0X2ksU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl90b2dnbGViaXRfaSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX3RvZ2dsZWJpdF9pIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfY2xyYml0X2ksU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9jbHJiaXRfaSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2NscmJpdF9pIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdHN0Yml0X3IsUUlfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl90c3RiaXRfciA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX3RzdGJpdF9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzRfbnRzdGJpdF9yLFFJX2Z0eXBlX1NJU0ksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzRfbnRzdGJpdF9yIDoKK0hleGFnb25fc2lfc2lzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzRfbnRzdGJpdF9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfc2V0Yml0X3IsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9zZXRiaXRfciA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX3NldGJpdF9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdG9nZ2xlYml0X3IsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl90b2dnbGViaXRfciA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX3RvZ2dsZWJpdF9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfY2xyYml0X3IsU0lfZnR5cGVfU0lTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9jbHJiaXRfciA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2NscmJpdF9yIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX2lfdmgsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3JfaV92aCA6CitIZXhhZ29uX2RpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2Fzcl9pX3ZoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNyX2lfdmgsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3JfaV92aCA6CitIZXhhZ29uX2RpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzcl9pX3ZoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX2lfdmgsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc2xfaV92aCA6CitIZXhhZ29uX2RpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2FzbF9pX3ZoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX3JfdmgsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3Jfcl92aCA6CitIZXhhZ29uX2RpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2Fzcl9yX3ZoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzVfYXNyaHViX3JuZF9zYXRfZ29vZHN5bnRheCxTSV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1M1X2Fzcmh1Yl9ybmRfc2F0X2dvb2RzeW50YXggOgorSGV4YWdvbl9zaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TNV9hc3JodWJfcm5kX3NhdF9nb29kc3ludGF4Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzVfYXNyaHViX3NhdCxTSV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1M1X2Fzcmh1Yl9zYXQgOgorSGV4YWdvbl9zaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TNV9hc3JodWJfc2F0Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzVfdmFzcmhybmRfZ29vZHN5bnRheCxESV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1M1X3Zhc3Jocm5kX2dvb2RzeW50YXggOgorSGV4YWdvbl9kaV9kaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TNV92YXNyaHJuZF9nb29kc3ludGF4Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX3JfdmgsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc2xfcl92aCA6CitIZXhhZ29uX2RpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2FzbF9yX3ZoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNyX3JfdmgsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3Jfcl92aCA6CitIZXhhZ29uX2RpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzcl9yX3ZoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNsX3JfdmgsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc2xfcl92aCA6CitIZXhhZ29uX2RpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzbF9yX3ZoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX2lfdncsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3JfaV92dyA6CitIZXhhZ29uX2RpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2Fzcl9pX3Z3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX2lfc3Z3X3RydW4sU0lfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3JfaV9zdndfdHJ1biA6CitIZXhhZ29uX3NpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2Fzcl9pX3N2d190cnVuIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX3Jfc3Z3X3RydW4sU0lfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3Jfcl9zdndfdHJ1biA6CitIZXhhZ29uX3NpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2Fzcl9yX3N2d190cnVuIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNyX2lfdncsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3JfaV92dyA6CitIZXhhZ29uX2RpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzcl9pX3Z3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX2lfdncsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc2xfaV92dyA6CitIZXhhZ29uX2RpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2FzbF9pX3Z3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNyX3JfdncsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc3Jfcl92dyA6CitIZXhhZ29uX2RpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2Fzcl9yX3Z3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfYXNsX3JfdncsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9hc2xfcl92dyA6CitIZXhhZ29uX2RpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2FzbF9yX3Z3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNyX3JfdncsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc3Jfcl92dyA6CitIZXhhZ29uX2RpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzcl9yX3Z3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfbHNsX3JfdncsRElfZnR5cGVfRElTSSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sc2xfcl92dyA6CitIZXhhZ29uX2RpX2Rpc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2xzbF9yX3Z3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdnJuZHBhY2t3aCxTSV9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl92cm5kcGFja3doIDoKK0hleGFnb25fc2lfZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX3ZybmRwYWNrd2giPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl92cm5kcGFja3docyxTSV9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl92cm5kcGFja3docyA6CitIZXhhZ29uX3NpX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl92cm5kcGFja3docyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3ZzeHRiaCxESV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl92c3h0YmggOgorSGV4YWdvbl9kaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdnN4dGJoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdnp4dGJoLERJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3Z6eHRiaCA6CitIZXhhZ29uX2RpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl92enh0YmgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl92c2F0aHViLFNJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3ZzYXRodWIgOgorSGV4YWdvbl9zaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdnNhdGh1YiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3N2c2F0aHViLFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3N2c2F0aHViIDoKK0hleGFnb25fc2lfc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX3N2c2F0aHViIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfc3ZzYXRoYixTSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9zdnNhdGhiIDoKK0hleGFnb25fc2lfc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX3N2c2F0aGIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl92c2F0aGIsU0lfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdnNhdGhiIDoKK0hleGFnb25fc2lfZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX3ZzYXRoYiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3Z0cnVub2hiLFNJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3Z0cnVub2hiIDoKK0hleGFnb25fc2lfZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX3Z0cnVub2hiIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdnRydW5ld2gsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl92dHJ1bmV3aCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX3Z0cnVuZXdoIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdnRydW5vd2gsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl92dHJ1bm93aCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX3Z0cnVub3doIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdnRydW5laGIsU0lfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdnRydW5laGIgOgorSGV4YWdvbl9zaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdnRydW5laGIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl92c3h0aHcsRElfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdnN4dGh3IDoKK0hleGFnb25fZGlfc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX3ZzeHRodyI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3Z6eHRodyxESV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl92enh0aHcgOgorSGV4YWdvbl9kaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdnp4dGh3Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdnNhdHdoLFNJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3ZzYXR3aCA6CitIZXhhZ29uX3NpX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl92c2F0d2giPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl92c2F0d3VoLFNJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3ZzYXR3dWggOgorSGV4YWdvbl9zaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdnNhdHd1aCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3BhY2tobCxESV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3BhY2tobCA6CitIZXhhZ29uX2RpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX3BhY2tobCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLkEyX3N3aXosU0lfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fQTJfc3dpeiA6CitIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9BMl9zd2l6Ij47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdnNhdGh1Yl9ub3BhY2ssRElfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdnNhdGh1Yl9ub3BhY2sgOgorSGV4YWdvbl9kaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdnNhdGh1Yl9ub3BhY2siPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl92c2F0aGJfbm9wYWNrLERJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX3ZzYXRoYl9ub3BhY2sgOgorSGV4YWdvbl9kaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdnNhdGhiX25vcGFjayI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3ZzYXR3aF9ub3BhY2ssRElfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdnNhdHdoX25vcGFjayA6CitIZXhhZ29uX2RpX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl92c2F0d2hfbm9wYWNrIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfdnNhdHd1aF9ub3BhY2ssRElfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfdnNhdHd1aF9ub3BhY2sgOgorSGV4YWdvbl9kaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfdnNhdHd1aF9ub3BhY2siPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9zaHVmZm9iLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfc2h1ZmZvYiA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX3NodWZmb2IiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9zaHVmZmViLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfc2h1ZmZlYiA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX3NodWZmZWIiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9zaHVmZm9oLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfc2h1ZmZvaCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX3NodWZmb2giPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9zaHVmZmVoLERJX2Z0eXBlX0RJREksMikKKy8vCitkZWYgaW50X2hleGFnb25fUzJfc2h1ZmZlaCA6CitIZXhhZ29uX2RpX2RpZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX3NodWZmZWgiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNV9wb3Bjb3VudHAsU0lfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzVfcG9wY291bnRwIDoKK0hleGFnb25fc2lfZGlfSW50cmluc2ljPCJIRVhBR09OX1M1X3BvcGNvdW50cCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM0X3Bhcml0eSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1M0X3Bhcml0eSA6CitIZXhhZ29uX3NpX3Npc2lfSW50cmluc2ljPCJIRVhBR09OX1M0X3Bhcml0eSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX3Bhcml0eXAsU0lfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9wYXJpdHlwIDoKK0hleGFnb25fc2lfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfcGFyaXR5cCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2xmc3AsRElfZnR5cGVfRElESSwyKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9sZnNwIDoKK0hleGFnb25fZGlfZGlkaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfbGZzcCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2NsYm5vcm0sU0lfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfY2xibm9ybSA6CitIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9jbGJub3JtIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzRfY2xiYWRkaSxTSV9mdHlwZV9TSVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1M0X2NsYmFkZGkgOgorSGV4YWdvbl9zaV9zaXNpX0ludHJpbnNpYzwiSEVYQUdPTl9TNF9jbGJhZGRpIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzRfY2xicG5vcm0sU0lfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzRfY2xicG5vcm0gOgorSGV4YWdvbl9zaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fUzRfY2xicG5vcm0iPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNF9jbGJwYWRkaSxTSV9mdHlwZV9ESVNJLDIpCisvLworZGVmIGludF9oZXhhZ29uX1M0X2NsYnBhZGRpIDoKK0hleGFnb25fc2lfZGlzaV9JbnRyaW5zaWM8IkhFWEFHT05fUzRfY2xicGFkZGkiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9jbGIsU0lfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfY2xiIDoKK0hleGFnb25fc2lfc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2NsYiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2NsMCxTSV9mdHlwZV9TSSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9jbDAgOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfY2wwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfY2wxLFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2NsMSA6CitIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9jbDEiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9jbGJwLFNJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2NsYnAgOgorSGV4YWdvbl9zaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfY2xicCI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2NsMHAsU0lfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfY2wwcCA6CitIZXhhZ29uX3NpX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9jbDBwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfY2wxcCxTSV9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9jbDFwIDoKK0hleGFnb25fc2lfZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX2NsMXAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9icmV2LFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2JyZXYgOgorSGV4YWdvbl9zaV9zaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfYnJldiI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2JyZXZwLERJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2JyZXZwIDoKK0hleGFnb25fZGlfZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX2JyZXZwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfY3QwLFNJX2Z0eXBlX1NJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2N0MCA6CitIZXhhZ29uX3NpX3NpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9jdDAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9jdDEsU0lfZnR5cGVfU0ksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfY3QxIDoKK0hleGFnb25fc2lfc2lfSW50cmluc2ljPCJIRVhBR09OX1MyX2N0MSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2N0MHAsU0lfZnR5cGVfREksMSkKKy8vCitkZWYgaW50X2hleGFnb25fUzJfY3QwcCA6CitIZXhhZ29uX3NpX2RpX0ludHJpbnNpYzwiSEVYQUdPTl9TMl9jdDBwIj47CisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfY3QxcCxTSV9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9jdDFwIDoKK0hleGFnb25fc2lfZGlfSW50cmluc2ljPCJIRVhBR09OX1MyX2N0MXAiPjsKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TMl9pbnRlcmxlYXZlLERJX2Z0eXBlX0RJLDEpCisvLworZGVmIGludF9oZXhhZ29uX1MyX2ludGVybGVhdmUgOgorSGV4YWdvbl9kaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfaW50ZXJsZWF2ZSI+OworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlMyX2RlaW50ZXJsZWF2ZSxESV9mdHlwZV9ESSwxKQorLy8KK2RlZiBpbnRfaGV4YWdvbl9TMl9kZWludGVybGVhdmUgOgorSGV4YWdvbl9kaV9kaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfZGVpbnRlcmxlYXZlIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5kY2ZldGNoX0Esdl9mdHlwZV9ESSosMSkKKy8vCitkZWYgaW50X2hleGFnb25fcHJlZmV0Y2ggOgorSGV4YWdvbl9JbnRyaW5zaWM8IkhFWEFHT05fcHJlZmV0Y2giLCBbXSwgW2xsdm1fcHRyX3R5XSwgW10+OworZGVmIGludF9oZXhhZ29uX1kyX2RjY2xlYW5hIDoKK0hleGFnb25fSW50cmluc2ljPCJIRVhBR09OX1kyX2RjY2xlYW5hIiwgW10sIFtsbHZtX3B0cl90eV0sIFtdPjsKK2RlZiBpbnRfaGV4YWdvbl9ZMl9kY2NsZWFuaW52YSA6CitIZXhhZ29uX0ludHJpbnNpYzwiSEVYQUdPTl9ZMl9kY2NsZWFuaW52YSIsIFtdLCBbbGx2bV9wdHJfdHldLCBbXT47CitkZWYgaW50X2hleGFnb25fWTJfZGNpbnZhIDoKK0hleGFnb25fSW50cmluc2ljPCJIRVhBR09OX1kyX2RjaW52YSIsIFtdLCBbbGx2bV9wdHJfdHldLCBbXT47CitkZWYgaW50X2hleGFnb25fWTJfZGN6ZXJvYSA6CitIZXhhZ29uX0ludHJpbnNpYzwiSEVYQUdPTl9ZMl9kY3plcm9hIiwgW10sIFtsbHZtX3B0cl90eV0sCisgICAgICBbSW50cldyaXRlTWVtLCBJbnRyQXJnTWVtT25seSwgSW50ckhhc1NpZGVFZmZlY3RzXT47CitkZWYgaW50X2hleGFnb25fWTRfbDJmZXRjaCA6CitIZXhhZ29uX0ludHJpbnNpYzwiSEVYQUdPTl9ZNF9sMmZldGNoIiwgW10sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X2hleGFnb25fWTVfbDJmZXRjaCA6CitIZXhhZ29uX0ludHJpbnNpYzwiSEVYQUdPTl9ZNV9sMmZldGNoIiwgW10sIFtsbHZtX3B0cl90eSwgbGx2bV9pNjRfdHldLCBbXT47CisKK2RlZiBsbHZtX3B0cjMyX3R5IDogTExWTVBvaW50ZXJUeXBlPGxsdm1faTMyX3R5PjsKK2RlZiBsbHZtX3B0cjY0X3R5IDogTExWTVBvaW50ZXJUeXBlPGxsdm1faTY0X3R5PjsKKworLy8gTWFyayBsb2NrZWQgbG9hZHMgYXMgcmVhZC93cml0ZSB0byBwcmV2ZW50IGFueSBhY2NpZGVudGFsIHJlb3JkZXJpbmcuCitkZWYgaW50X2hleGFnb25fTDJfbG9hZHdfbG9ja2VkIDoKK0hleGFnb25fSW50cmluc2ljPCJIRVhBR09OX0wyX2xvYWR3X2xvY2tlZCIsIFtsbHZtX2kzMl90eV0sIFtsbHZtX3B0cjMyX3R5XSwKKyAgICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+XT47CitkZWYgaW50X2hleGFnb25fTDRfbG9hZGRfbG9ja2VkIDoKK0hleGFnb25fSW50cmluc2ljPCJIRVhBR09OX0w0X2xvYWRkX2xvY2tlZCIsIFtsbHZtX2k2NF90eV0sIFtsbHZtX3B0cjY0X3R5XSwKKyAgICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+XT47CisKK2RlZiBpbnRfaGV4YWdvbl9TMl9zdG9yZXdfbG9ja2VkIDoKK0hleGFnb25fSW50cmluc2ljPCJIRVhBR09OX1MyX3N0b3Jld19sb2NrZWQiLCBbbGx2bV9pMzJfdHldLAorICAgICAgW2xsdm1fcHRyMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8MD5dPjsKK2RlZiBpbnRfaGV4YWdvbl9TNF9zdG9yZWRfbG9ja2VkIDoKK0hleGFnb25fSW50cmluc2ljPCJIRVhBR09OX1M0X3N0b3JlZF9sb2NrZWQiLCBbbGx2bV9pMzJfdHldLAorICAgICAgW2xsdm1fcHRyNjRfdHksIGxsdm1faTY0X3R5XSwgW0ludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8MD5dPjsKKworLy8gVjYwCisKK2NsYXNzIEhleGFnb25fdjIwNDh2MjA0OF9JbnRyaW5zaWNfVDxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NjRpMzJfdHldLCBbbGx2bV92NjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vIHRhZyA6IFY2X2hpX1cKKy8vIHRhZyA6IFY2X2xvX1cKK2NsYXNzIEhleGFnb25fdjUxMnYxMDI0X0ludHJpbnNpY19UPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8gdGFnIDogVjZfaGlfV18xMjhCCisvLyB0YWcgOiBWNl9sb19XXzEyOEIKK2NsYXNzIEhleGFnb25fdjEwMjR2MjA0OF9JbnRyaW5zaWNfVDxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92NjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK2NsYXNzIEhleGFnb25fdjEwMjR2MTAyNF9JbnRyaW5zaWNfVDxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MzJpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X2hpX1csVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X2hpCitkZWYgaW50X2hleGFnb25fVjZfaGkgOgorSGV4YWdvbl92NTEydjEwMjRfSW50cmluc2ljX1Q8IkhFWEFHT05fVjZfaGkiPjsKKworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfbG9fVyxWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfbG8KK2RlZiBpbnRfaGV4YWdvbl9WNl9sbyA6CitIZXhhZ29uX3Y1MTJ2MTAyNF9JbnRyaW5zaWNfVDwiSEVYQUdPTl9WNl9sbyI+OworCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9oaV9XLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl9oaV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfaGlfMTI4QiA6CitIZXhhZ29uX3YxMDI0djIwNDhfSW50cmluc2ljX1Q8IkhFWEFHT05fVjZfaGlfMTI4QiI+OworCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9sb19XLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl9sb18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfbG9fMTI4QiA6CitIZXhhZ29uX3YxMDI0djIwNDhfSW50cmluc2ljX1Q8IkhFWEFHT05fVjZfbG9fMTI4QiI+OworCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNzaWducCxWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdmFzc2lnbnAKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNzaWducCA6CitIZXhhZ29uX3YxMDI0djEwMjRfSW50cmluc2ljX1Q8IkhFWEFHT05fVjZfdmFzc2lnbnAiPjsKKworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzc2lnbnAsVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3Zhc3NpZ25wXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNzaWducF8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OF9JbnRyaW5zaWNfVDwiSEVYQUdPTl9WNl92YXNzaWducF8xMjhCIj47CisKKworLy8KKy8vIEhleGFnb25faWlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogUzZfcm9sX2lfcgorY2xhc3MgSGV4YWdvbl9paWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fTExpTExpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFM2X3JvbF9pX3AKK2NsYXNzIEhleGFnb25fTExpTExpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9paWlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogUzZfcm9sX2lfcl9hY2MKK2NsYXNzIEhleGFnb25faWlpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LGxsdm1faTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9MTGlMTGlMTGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogUzZfcm9sX2lfcF9hY2MKK2NsYXNzIEhleGFnb25fTExpTExpTExpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LGxsdm1faTY0X3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92NTEydjUxMnY1MTJpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFsaWduYgorY2xhc3MgSGV4YWdvbl92NTEydjUxMnY1MTJpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksbGx2bV92MTZpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YWxpZ25iXzEyOEIKK2NsYXNzIEhleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1fdjMyaTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92NTEydjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92cm9yCitjbGFzcyBIZXhhZ29uX3Y1MTJ2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTAyNHYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3Zyb3JfMTI4QgorY2xhc3MgSGV4YWdvbl92MTAyNHYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTAyNHY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92dW5wYWNrdWIKK2NsYXNzIEhleGFnb25fdjEwMjR2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YyMDQ4djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92dW5wYWNrdWJfMTI4QgorY2xhc3MgSGV4YWdvbl92MjA0OHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NjRpMzJfdHldLCBbbGx2bV92MzJpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YxMDI0djEwMjR2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdnVucGFja29iCitjbGFzcyBIZXhhZ29uX3YxMDI0djEwMjR2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MzJpMzJfdHksbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YyMDQ4djIwNDh2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3Z1bnBhY2tvYl8xMjhCCitjbGFzcyBIZXhhZ29uX3YyMDQ4djIwNDh2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjY0aTMyX3R5LGxsdm1fdjMyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92cGFja2ViCitjbGFzcyBIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92cGFja2ViXzEyOEIKK2NsYXNzIEhleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MzJpMzJfdHksbGx2bV92MzJpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YyMDQ4djIwNDhpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmRtcHlidXNfZHZfMTI4QgorY2xhc3MgSGV4YWdvbl92MjA0OHYyMDQ4aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjY0aTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmRtcHlidXNfZHZfYWNjXzEyOEIKK2NsYXNzIEhleGFnb25fdjIwNDh2MjA0OHYyMDQ4aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjY0aTMyX3R5LGxsdm1fdjY0aTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92NTEydjUxMnY1MTJ2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmRtcHlodnNhdF9hY2MKK2NsYXNzIEhleGFnb25fdjUxMnY1MTJ2NTEydjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTAyNHYxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZkbXB5aHZzYXRfYWNjXzEyOEIKK2NsYXNzIEhleGFnb25fdjEwMjR2MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3YzMmkzMl90eSxsbHZtX3YzMmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjUxMnYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZkbXB5aGlzYXQKK2NsYXNzIEhleGFnb25fdjUxMnYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTAyNHYyMDQ4aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZkbXB5aGlzYXRfMTI4QgorY2xhc3MgSGV4YWdvbl92MTAyNHYyMDQ4aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjY0aTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92NTEydjUxMnYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZkbXB5aGlzYXRfYWNjCitjbGFzcyBIZXhhZ29uX3Y1MTJ2NTEydjEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksbGx2bV92MzJpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YxMDI0djEwMjR2MjA0OGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92ZG1weWhpc2F0X2FjY18xMjhCCitjbGFzcyBIZXhhZ29uX3YxMDI0djEwMjR2MjA0OGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3Y2NGkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEwMjR2MTAyNGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdnJtcHl1YmkKK2NsYXNzIEhleGFnb25fdjEwMjR2MTAyNGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MzJpMzJfdHksbGx2bV9pMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YyMDQ4djIwNDhpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZybXB5dWJpXzEyOEIKK2NsYXNzIEhleGFnb25fdjIwNDh2MjA0OGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NjRpMzJfdHldLCBbbGx2bV92NjRpMzJfdHksbGx2bV9pMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdnJtcHl1YmlfYWNjCitjbGFzcyBIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MzJpMzJfdHksbGx2bV92MzJpMzJfdHksbGx2bV9pMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YyMDQ4djIwNDh2MjA0OGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdnJtcHl1YmlfYWNjXzEyOEIKK2NsYXNzIEhleGFnb25fdjIwNDh2MjA0OHYyMDQ4aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y2NGkzMl90eV0sIFtsbHZtX3Y2NGkzMl90eSxsbHZtX3Y2NGkzMl90eSxsbHZtX2kzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjIwNDh2MjA0OHYyMDQ4X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFkZGJfZHZfMTI4QgorY2xhc3MgSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y2NGkzMl90eV0sIFtsbHZtX3Y2NGkzMl90eSxsbHZtX3Y2NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEwMjR2NTEydjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZhZGR1YmgKK2NsYXNzIEhleGFnb25fdjEwMjR2NTEydjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MjA0OHYxMDI0djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YWRkdWJoXzEyOEIKK2NsYXNzIEhleGFnb25fdjIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NjRpMzJfdHldLCBbbGx2bV92MzJpMzJfdHksbGx2bV92MzJpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3Y1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92ZDAKK2NsYXNzIEhleGFnb25fdjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92ZDBfMTI4QgorY2xhc3MgSGV4YWdvbl92MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjUxMnY2NGl2NTEydjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZhZGRicQorY2xhc3MgSGV4YWdvbl92NTEydjY0aXY1MTJ2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92NTEyaTFfdHksbGx2bV92MTZpMzJfdHksbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YxMDI0djEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFkZGJxXzEyOEIKK2NsYXNzIEhleGFnb25fdjEwMjR2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YxMDI0aTFfdHksbGx2bV92MzJpMzJfdHksbGx2bV92MzJpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3Y1MTJ2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFic2gKK2NsYXNzIEhleGFnb25fdjUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEwMjR2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZhYnNoXzEyOEIKK2NsYXNzIEhleGFnb25fdjEwMjR2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTAyNHYxMDI0djUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bXB5YnZfYWNjCitjbGFzcyBIZXhhZ29uX3YxMDI0djEwMjR2NTEydjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MjA0OHYyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZtcHlidl9hY2NfMTI4QgorY2xhc3MgSGV4YWdvbl92MjA0OHYyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjY0aTMyX3R5LGxsdm1fdjMyaTMyX3R5LGxsdm1fdjMyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTAyNHY1MTJpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdm1weXViCitjbGFzcyBIZXhhZ29uX3YxMDI0djUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjIwNDh2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bXB5dWJfMTI4QgorY2xhc3MgSGV4YWdvbl92MjA0OHYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTAyNHYxMDI0djUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bXB5dWJfYWNjCitjbGFzcyBIZXhhZ29uX3YxMDI0djEwMjR2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MjA0OHYyMDQ4djEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdm1weXViX2FjY18xMjhCCitjbGFzcyBIZXhhZ29uX3YyMDQ4djIwNDh2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y2NGkzMl90eV0sIFtsbHZtX3Y2NGkzMl90eSxsbHZtX3YzMmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjUxMnY2NGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFuZHFydAorY2xhc3MgSGV4YWdvbl92NTEydjY0aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3Y1MTJpMV90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEwMjR2MTI4aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YW5kcXJ0XzEyOEIKK2NsYXNzIEhleGFnb25fdjEwMjR2MTI4aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YxMDI0aTFfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3Y1MTJ2NTEydjY0aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YW5kcXJ0X2FjYworY2xhc3MgSGV4YWdvbl92NTEydjUxMnY2NGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksbGx2bV92NTEyaTFfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YxMDI0djEwMjR2MTI4aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YW5kcXJ0X2FjY18xMjhCCitjbGFzcyBIZXhhZ29uX3YxMDI0djEwMjR2MTI4aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3YxMDI0aTFfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3Y2NGl2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZhbmR2cnQKK2NsYXNzIEhleGFnb25fdjY0aXY1MTJpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NTEyaTFfdHldLCBbbGx2bV92MTZpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YxMjhpdjEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFuZHZydF8xMjhCCitjbGFzcyBIZXhhZ29uX3YxMjhpdjEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTAyNGkxX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92NjRpdjY0aXY1MTJpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFuZHZydF9hY2MKK2NsYXNzIEhleGFnb25fdjY0aXY2NGl2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjUxMmkxX3R5XSwgW2xsdm1fdjUxMmkxX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTI4aXYxMjhpdjEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFuZHZydF9hY2NfMTI4QgorY2xhc3MgSGV4YWdvbl92MTI4aXYxMjhpdjEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTAyNGkxX3R5XSwgW2xsdm1fdjEwMjRpMV90eSxsbHZtX3YzMmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmd0dworY2xhc3MgSGV4YWdvbl92NjRpdjUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y1MTJpMV90eV0sIFtsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmd0d18xMjhCCitjbGFzcyBIZXhhZ29uX3YxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjEwMjRpMV90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3YzMmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjY0aXY2NGl2NTEydjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZndHdfYW5kCitjbGFzcyBIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y1MTJpMV90eV0sIFtsbHZtX3Y1MTJpMV90eSxsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEyOGl2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92Z3R3X2FuZF8xMjhCCitjbGFzcyBIZXhhZ29uX3YxMjhpdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTAyNGkxX3R5XSwgW2xsdm1fdjEwMjRpMV90eSxsbHZtX3YzMmkzMl90eSxsbHZtX3YzMmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjY0aXY2NGl2NjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfcHJlZF9vcgorY2xhc3MgSGV4YWdvbl92NjRpdjY0aXY2NGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y1MTJpMV90eV0sIFtsbHZtX3Y1MTJpMV90eSxsbHZtX3Y1MTJpMV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEyOGl2MTI4aXYxMjhpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfcHJlZF9vcl8xMjhCCitjbGFzcyBIZXhhZ29uX3YxMjhpdjEyOGl2MTI4aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjEwMjRpMV90eV0sIFtsbHZtX3YxMDI0aTFfdHksbGx2bV92MTAyNGkxX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92NjRpdjY0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ByZWRfbm90CitjbGFzcyBIZXhhZ29uX3Y2NGl2NjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NTEyaTFfdHldLCBbbGx2bV92NTEyaTFfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YxMjhpdjEyOGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl9wcmVkX25vdF8xMjhCCitjbGFzcyBIZXhhZ29uX3YxMjhpdjEyOGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxMDI0aTFfdHldLCBbbGx2bV92MTAyNGkxX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92NjRpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ByZWRfc2NhbGFyMgorY2xhc3MgSGV4YWdvbl92NjRpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjUxMmkxX3R5XSwgW2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTI4aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl9wcmVkX3NjYWxhcjJfMTI4QgorY2xhc3MgSGV4YWdvbl92MTI4aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxMDI0aTFfdHldLCBbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YxMDI0djY0aXY1MTJ2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdnN3YXAKK2NsYXNzIEhleGFnb25fdjEwMjR2NjRpdjUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3Y1MTJpMV90eSxsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjIwNDh2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92c3dhcF8xMjhCCitjbGFzcyBIZXhhZ29uX3YyMDQ4djEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NjRpMzJfdHldLCBbbGx2bV92MTAyNGkxX3R5LGxsdm1fdjMyaTMyX3R5LGxsdm1fdjMyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MTAyNHY1MTJ2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZzaHVmZnZkZAorY2xhc3MgSGV4YWdvbl92MTAyNHY1MTJ2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MjA0OHYxMDI0djEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdnNodWZmdmRkXzEyOEIKK2NsYXNzIEhleGFnb25fdjIwNDh2MTAyNHYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1fdjMyaTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisKKy8vCisvLyBIZXhhZ29uX2l2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X2V4dHJhY3R3CitjbGFzcyBIZXhhZ29uX2l2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9pdjEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfZXh0cmFjdHdfMTI4QgorY2xhc3MgSGV4YWdvbl9pdjEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMzJfdHldLCBbbGx2bV92MzJpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3Y1MTJpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfbHZzcGxhdHcKK2NsYXNzIEhleGFnb25fdjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfbHZzcGxhdHdfMTI4QgorY2xhc3MgSGV4YWdvbl92MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjUxMnY1MTJ2NTEydjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bHV0dnZiX29yYWNjCitjbGFzcyBIZXhhZ29uX3Y1MTJ2NTEydjUxMnY1MTJpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksbGx2bV92MTZpMzJfdHksbGx2bV92MTZpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3YxMDI0djEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZsdXR2dmJfb3JhY2NfMTI4QgorY2xhc3MgSGV4YWdvbl92MTAyNHYxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3YzMmkzMl90eSxsbHZtX3YzMmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fdjEwMjR2MTAyNHY1MTJ2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZsdXR2d2hfb3JhY2MKK2NsYXNzIEhleGFnb25fdjEwMjR2MTAyNHY1MTJ2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl92MjA0OHYyMDQ4djEwMjR2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bHV0dndoX29yYWNjXzEyOEIKK2NsYXNzIEhleGFnb25fdjIwNDh2MjA0OHYxMDI0djEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NjRpMzJfdHldLCBbbGx2bV92NjRpMzJfdHksbGx2bV92MzJpMzJfdHksbGx2bV92MzJpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX3Z2NjRpdm1lbXY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWc6IFY2X3ZTMzJiX3FwcmVkX2FpCitjbGFzcyBIZXhhZ29uX3Z2NjRpdm1lbXY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtdLCBbbGx2bV92NTEyaTFfdHksbGx2bV9wdHJfdHksbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKworLy8KKy8vIEhleGFnb25fdnYxMjhpdm1lbXYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnOiBWNl92UzMyYl9xcHJlZF9haV8xMjhCCitjbGFzcyBIZXhhZ29uX3Z2MTI4aXZtZW12MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW10sIFtsbHZtX3YxMDI0aTFfdHksbGx2bV9wdHJfdHksbGx2bV92MzJpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM2X3JvbF9pX3IsU0lfZnR5cGVfU0lTSSwyKQorLy8gdGFnIDogUzZfcm9sX2lfcgorZGVmIGludF9oZXhhZ29uX1M2X3JvbF9pX3IgOgorSGV4YWdvbl9paWlfSW50cmluc2ljPCJIRVhBR09OX1M2X3JvbF9pX3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM2X3JvbF9pX3AsRElfZnR5cGVfRElTSSwyKQorLy8gdGFnIDogUzZfcm9sX2lfcAorZGVmIGludF9oZXhhZ29uX1M2X3JvbF9pX3AgOgorSGV4YWdvbl9MTGlMTGlpX0ludHJpbnNpYzwiSEVYQUdPTl9TNl9yb2xfaV9wIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNl9yb2xfaV9yX2FjYyxTSV9mdHlwZV9TSVNJU0ksMykKKy8vIHRhZyA6IFM2X3JvbF9pX3JfYWNjCitkZWYgaW50X2hleGFnb25fUzZfcm9sX2lfcl9hY2MgOgorSGV4YWdvbl9paWlpX0ludHJpbnNpYzwiSEVYQUdPTl9TNl9yb2xfaV9yX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzZfcm9sX2lfcF9hY2MsRElfZnR5cGVfRElESVNJLDMpCisvLyB0YWcgOiBTNl9yb2xfaV9wX2FjYworZGVmIGludF9oZXhhZ29uX1M2X3JvbF9pX3BfYWNjIDoKK0hleGFnb25fTExpTExpTExpaV9JbnRyaW5zaWM8IkhFWEFHT05fUzZfcm9sX2lfcF9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM2X3JvbF9pX3JfbmFjLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8gdGFnIDogUzZfcm9sX2lfcl9uYWMKK2RlZiBpbnRfaGV4YWdvbl9TNl9yb2xfaV9yX25hYyA6CitIZXhhZ29uX2lpaWlfSW50cmluc2ljPCJIRVhBR09OX1M2X3JvbF9pX3JfbmFjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNl9yb2xfaV9wX25hYyxESV9mdHlwZV9ESURJU0ksMykKKy8vIHRhZyA6IFM2X3JvbF9pX3BfbmFjCitkZWYgaW50X2hleGFnb25fUzZfcm9sX2lfcF9uYWMgOgorSGV4YWdvbl9MTGlMTGlMTGlpX0ludHJpbnNpYzwiSEVYQUdPTl9TNl9yb2xfaV9wX25hYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzZfcm9sX2lfcl94YWNjLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8gdGFnIDogUzZfcm9sX2lfcl94YWNjCitkZWYgaW50X2hleGFnb25fUzZfcm9sX2lfcl94YWNjIDoKK0hleGFnb25faWlpaV9JbnRyaW5zaWM8IkhFWEFHT05fUzZfcm9sX2lfcl94YWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNl9yb2xfaV9wX3hhY2MsRElfZnR5cGVfRElESVNJLDMpCisvLyB0YWcgOiBTNl9yb2xfaV9wX3hhY2MKK2RlZiBpbnRfaGV4YWdvbl9TNl9yb2xfaV9wX3hhY2MgOgorSGV4YWdvbl9MTGlMTGlMTGlpX0ludHJpbnNpYzwiSEVYQUdPTl9TNl9yb2xfaV9wX3hhY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM2X3JvbF9pX3JfYW5kLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8gdGFnIDogUzZfcm9sX2lfcl9hbmQKK2RlZiBpbnRfaGV4YWdvbl9TNl9yb2xfaV9yX2FuZCA6CitIZXhhZ29uX2lpaWlfSW50cmluc2ljPCJIRVhBR09OX1M2X3JvbF9pX3JfYW5kIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNl9yb2xfaV9yX29yLFNJX2Z0eXBlX1NJU0lTSSwzKQorLy8gdGFnIDogUzZfcm9sX2lfcl9vcgorZGVmIGludF9oZXhhZ29uX1M2X3JvbF9pX3Jfb3IgOgorSGV4YWdvbl9paWlpX0ludHJpbnNpYzwiSEVYQUdPTl9TNl9yb2xfaV9yX29yIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNl9yb2xfaV9wX2FuZCxESV9mdHlwZV9ESURJU0ksMykKKy8vIHRhZyA6IFM2X3JvbF9pX3BfYW5kCitkZWYgaW50X2hleGFnb25fUzZfcm9sX2lfcF9hbmQgOgorSGV4YWdvbl9MTGlMTGlMTGlpX0ludHJpbnNpYzwiSEVYQUdPTl9TNl9yb2xfaV9wX2FuZCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzZfcm9sX2lfcF9vcixESV9mdHlwZV9ESURJU0ksMykKKy8vIHRhZyA6IFM2X3JvbF9pX3Bfb3IKK2RlZiBpbnRfaGV4YWdvbl9TNl9yb2xfaV9wX29yIDoKK0hleGFnb25fTExpTExpTExpaV9JbnRyaW5zaWM8IkhFWEFHT05fUzZfcm9sX2lfcF9vciI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzJfY2FiYWNlbmNiaW4sRElfZnR5cGVfRElESVFJLDMpCisvLyB0YWcgOiBTMl9jYWJhY2VuY2JpbgorZGVmIGludF9oZXhhZ29uX1MyX2NhYmFjZW5jYmluIDoKK0hleGFnb25fTExpTExpTExpaV9JbnRyaW5zaWM8IkhFWEFHT05fUzJfY2FiYWNlbmNiaW4iPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhbGlnbmIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YWxpZ25iCitkZWYgaW50X2hleGFnb25fVjZfdmFsaWduYiA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhbGlnbmIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhbGlnbmJfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZhbGlnbmJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhbGlnbmJfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhbGlnbmJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmxhbGlnbmIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92bGFsaWduYgorZGVmIGludF9oZXhhZ29uX1Y2X3ZsYWxpZ25iIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmxhbGlnbmIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZsYWxpZ25iXzEyOEIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92bGFsaWduYl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmxhbGlnbmJfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZsYWxpZ25iXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhbGlnbmJpLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFsaWduYmkKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWxpZ25iaSA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhbGlnbmJpIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWxpZ25iaV8xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFsaWduYmlfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhbGlnbmJpXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWxpZ25iaV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bGFsaWduYmksVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92bGFsaWduYmkKK2RlZiBpbnRfaGV4YWdvbl9WNl92bGFsaWduYmkgOgorSGV4YWdvbl92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bGFsaWduYmkiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZsYWxpZ25iaV8xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmxhbGlnbmJpXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bGFsaWduYmlfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZsYWxpZ25iaV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm9yLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3Zyb3IKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm9yIDoKK0hleGFnb25fdjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm9yIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm9yXzEyOEIsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdnJvcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnJvcl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zyb3JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnVucGFja3ViLFZEX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92dW5wYWNrdWIKK2RlZiBpbnRfaGV4YWdvbl9WNl92dW5wYWNrdWIgOgorSGV4YWdvbl92MTAyNHY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Z1bnBhY2t1YiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnVucGFja3ViXzEyOEIsVkRfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3Z1bnBhY2t1Yl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnVucGFja3ViXzEyOEIgOgorSGV4YWdvbl92MjA0OHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92dW5wYWNrdWJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnVucGFja2IsVkRfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3Z1bnBhY2tiCitkZWYgaW50X2hleGFnb25fVjZfdnVucGFja2IgOgorSGV4YWdvbl92MTAyNHY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Z1bnBhY2tiIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92dW5wYWNrYl8xMjhCLFZEX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92dW5wYWNrYl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnVucGFja2JfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Z1bnBhY2tiXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z1bnBhY2t1aCxWRF9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdnVucGFja3VoCitkZWYgaW50X2hleGFnb25fVjZfdnVucGFja3VoIDoKK0hleGFnb25fdjEwMjR2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92dW5wYWNrdWgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z1bnBhY2t1aF8xMjhCLFZEX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92dW5wYWNrdWhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Z1bnBhY2t1aF8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnVucGFja3VoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z1bnBhY2toLFZEX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92dW5wYWNraAorZGVmIGludF9oZXhhZ29uX1Y2X3Z1bnBhY2toIDoKK0hleGFnb25fdjEwMjR2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92dW5wYWNraCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnVucGFja2hfMTI4QixWRF9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdnVucGFja2hfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Z1bnBhY2toXzEyOEIgOgorSGV4YWdvbl92MjA0OHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92dW5wYWNraF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92dW5wYWNrb2IsVkRfZnR5cGVfVkRWSSwyKQorLy8gdGFnIDogVjZfdnVucGFja29iCitkZWYgaW50X2hleGFnb25fVjZfdnVucGFja29iIDoKK0hleGFnb25fdjEwMjR2MTAyNHY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Z1bnBhY2tvYiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnVucGFja29iXzEyOEIsVkRfZnR5cGVfVkRWSSwyKQorLy8gdGFnIDogVjZfdnVucGFja29iXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92dW5wYWNrb2JfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnVucGFja29iXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z1bnBhY2tvaCxWRF9mdHlwZV9WRFZJLDIpCisvLyB0YWcgOiBWNl92dW5wYWNrb2gKK2RlZiBpbnRfaGV4YWdvbl9WNl92dW5wYWNrb2ggOgorSGV4YWdvbl92MTAyNHYxMDI0djUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnVucGFja29oIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92dW5wYWNrb2hfMTI4QixWRF9mdHlwZV9WRFZJLDIpCisvLyB0YWcgOiBWNl92dW5wYWNrb2hfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Z1bnBhY2tvaF8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92dW5wYWNrb2hfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnBhY2tlYixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cGFja2ViCitkZWYgaW50X2hleGFnb25fVjZfdnBhY2tlYiA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnBhY2tlYiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnBhY2tlYl8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZwYWNrZWJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZwYWNrZWJfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnBhY2tlYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cGFja2VoLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZwYWNrZWgKK2RlZiBpbnRfaGV4YWdvbl9WNl92cGFja2VoIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cGFja2VoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cGFja2VoXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnBhY2tlaF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnBhY2tlaF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cGFja2VoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZwYWNrb2IsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnBhY2tvYgorZGVmIGludF9oZXhhZ29uX1Y2X3ZwYWNrb2IgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZwYWNrb2IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZwYWNrb2JfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cGFja29iXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cGFja29iXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZwYWNrb2JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnBhY2tvaCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cGFja29oCitkZWYgaW50X2hleGFnb25fVjZfdnBhY2tvaCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnBhY2tvaCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnBhY2tvaF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZwYWNrb2hfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZwYWNrb2hfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnBhY2tvaF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cGFja2h1Yl9zYXQsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnBhY2todWJfc2F0CitkZWYgaW50X2hleGFnb25fVjZfdnBhY2todWJfc2F0IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cGFja2h1Yl9zYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZwYWNraHViX3NhdF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZwYWNraHViX3NhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnBhY2todWJfc2F0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZwYWNraHViX3NhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cGFja2hiX3NhdCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cGFja2hiX3NhdAorZGVmIGludF9oZXhhZ29uX1Y2X3ZwYWNraGJfc2F0IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cGFja2hiX3NhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnBhY2toYl9zYXRfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cGFja2hiX3NhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnBhY2toYl9zYXRfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnBhY2toYl9zYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnBhY2t3dWhfc2F0LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZwYWNrd3VoX3NhdAorZGVmIGludF9oZXhhZ29uX1Y2X3ZwYWNrd3VoX3NhdCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnBhY2t3dWhfc2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cGFja3d1aF9zYXRfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cGFja3d1aF9zYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZwYWNrd3VoX3NhdF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cGFja3d1aF9zYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnBhY2t3aF9zYXQsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnBhY2t3aF9zYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92cGFja3doX3NhdCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnBhY2t3aF9zYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZwYWNrd2hfc2F0XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnBhY2t3aF9zYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZwYWNrd2hfc2F0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZwYWNrd2hfc2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z6YixWRF9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdnpiCitkZWYgaW50X2hleGFnb25fVjZfdnpiIDoKK0hleGFnb25fdjEwMjR2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92emIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z6Yl8xMjhCLFZEX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92emJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Z6Yl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnpiXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzYixWRF9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdnNiCitkZWYgaW50X2hleGFnb25fVjZfdnNiIDoKK0hleGFnb25fdjEwMjR2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzYl8xMjhCLFZEX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92c2JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzYl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNiXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z6aCxWRF9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdnpoCitkZWYgaW50X2hleGFnb25fVjZfdnpoIDoKK0hleGFnb25fdjEwMjR2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92emgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z6aF8xMjhCLFZEX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92emhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Z6aF8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnpoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzaCxWRF9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdnNoCitkZWYgaW50X2hleGFnb25fVjZfdnNoIDoKK0hleGFnb25fdjEwMjR2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2giPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzaF8xMjhCLFZEX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92c2hfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzaF8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5YnVzLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZkbXB5YnVzCitkZWYgaW50X2hleGFnb25fVjZfdmRtcHlidXMgOgorSGV4YWdvbl92NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5YnVzIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZG1weWJ1c18xMjhCLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZkbXB5YnVzXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWJ1c18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5YnVzXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5YnVzX2FjYyxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZkbXB5YnVzX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5YnVzX2FjYyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5YnVzX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHlidXNfYWNjXzEyOEIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92ZG1weWJ1c19hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5YnVzX2FjY18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHlidXNfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5YnVzX2R2LFZEX2Z0eXBlX1ZEU0ksMikKKy8vIHRhZyA6IFY2X3ZkbXB5YnVzX2R2CitkZWYgaW50X2hleGFnb25fVjZfdmRtcHlidXNfZHYgOgorSGV4YWdvbl92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHlidXNfZHYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5YnVzX2R2XzEyOEIsVkRfZnR5cGVfVkRTSSwyKQorLy8gdGFnIDogVjZfdmRtcHlidXNfZHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5YnVzX2R2XzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHlidXNfZHZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHlidXNfZHZfYWNjLFZEX2Z0eXBlX1ZEVkRTSSwzKQorLy8gdGFnIDogVjZfdmRtcHlidXNfZHZfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdmRtcHlidXNfZHZfYWNjIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHlidXNfZHZfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZG1weWJ1c19kdl9hY2NfMTI4QixWRF9mdHlwZV9WRFZEU0ksMykKKy8vIHRhZyA6IFY2X3ZkbXB5YnVzX2R2X2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmRtcHlidXNfZHZfYWNjXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZG1weWJ1c19kdl9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHloYixWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92ZG1weWhiCitkZWYgaW50X2hleGFnb25fVjZfdmRtcHloYiA6CitIZXhhZ29uX3Y1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHloYiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHloYl8xMjhCLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZkbXB5aGJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5aGJfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZG1weWhiXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aGJfYWNjLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmRtcHloYl9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWhiX2FjYyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5aGJfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZG1weWhiX2FjY18xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmRtcHloYl9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5aGJfYWNjXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZG1weWhiX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZG1weWhiX2R2LFZEX2Z0eXBlX1ZEU0ksMikKKy8vIHRhZyA6IFY2X3ZkbXB5aGJfZHYKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWhiX2R2IDoKK0hleGFnb25fdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5aGJfZHYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aGJfZHZfMTI4QixWRF9mdHlwZV9WRFNJLDIpCisvLyB0YWcgOiBWNl92ZG1weWhiX2R2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWhiX2R2XzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHloYl9kdl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZG1weWhiX2R2X2FjYyxWRF9mdHlwZV9WRFZEU0ksMykKKy8vIHRhZyA6IFY2X3ZkbXB5aGJfZHZfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdmRtcHloYl9kdl9hY2MgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZG1weWhiX2R2X2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHloYl9kdl9hY2NfMTI4QixWRF9mdHlwZV9WRFZEU0ksMykKKy8vIHRhZyA6IFY2X3ZkbXB5aGJfZHZfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWhiX2R2X2FjY18xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYyMDQ4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHloYl9kdl9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHlodnNhdCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92ZG1weWh2c2F0CitkZWYgaW50X2hleGFnb25fVjZfdmRtcHlodnNhdCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHlodnNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHlodnNhdF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZkbXB5aHZzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5aHZzYXRfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHlodnNhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZG1weWh2c2F0X2FjYyxWSV9mdHlwZV9WSVZJVkksMykKKy8vIHRhZyA6IFY2X3ZkbXB5aHZzYXRfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdmRtcHlodnNhdF9hY2MgOgorSGV4YWdvbl92NTEydjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZG1weWh2c2F0X2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHlodnNhdF9hY2NfMTI4QixWSV9mdHlwZV9WSVZJVkksMykKKy8vIHRhZyA6IFY2X3ZkbXB5aHZzYXRfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWh2c2F0X2FjY18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5aHZzYXRfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aHNhdCxWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92ZG1weWhzYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWhzYXQgOgorSGV4YWdvbl92NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5aHNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHloc2F0XzEyOEIsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdmRtcHloc2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWhzYXRfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZG1weWhzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHloc2F0X2FjYyxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZkbXB5aHNhdF9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWhzYXRfYWNjIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHloc2F0X2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHloc2F0X2FjY18xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmRtcHloc2F0X2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmRtcHloc2F0X2FjY18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHloc2F0X2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZG1weWhpc2F0LFZJX2Z0eXBlX1ZEU0ksMikKKy8vIHRhZyA6IFY2X3ZkbXB5aGlzYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWhpc2F0IDoKK0hleGFnb25fdjUxMnYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHloaXNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHloaXNhdF8xMjhCLFZJX2Z0eXBlX1ZEU0ksMikKKy8vIHRhZyA6IFY2X3ZkbXB5aGlzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5aGlzYXRfMTI4QiA6CitIZXhhZ29uX3YxMDI0djIwNDhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZG1weWhpc2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aGlzYXRfYWNjLFZJX2Z0eXBlX1ZJVkRTSSwzKQorLy8gdGFnIDogVjZfdmRtcHloaXNhdF9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWhpc2F0X2FjYyA6CitIZXhhZ29uX3Y1MTJ2NTEydjEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZG1weWhpc2F0X2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHloaXNhdF9hY2NfMTI4QixWSV9mdHlwZV9WSVZEU0ksMykKKy8vIHRhZyA6IFY2X3ZkbXB5aGlzYXRfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWhpc2F0X2FjY18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYyMDQ4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHloaXNhdF9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHloc3VzYXQsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdmRtcHloc3VzYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWhzdXNhdCA6CitIZXhhZ29uX3Y1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHloc3VzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aHN1c2F0XzEyOEIsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdmRtcHloc3VzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5aHN1c2F0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHloc3VzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHloc3VzYXRfYWNjLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmRtcHloc3VzYXRfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdmRtcHloc3VzYXRfYWNjIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRtcHloc3VzYXRfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZG1weWhzdXNhdF9hY2NfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZkbXB5aHN1c2F0X2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmRtcHloc3VzYXRfYWNjXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZG1weWhzdXNhdF9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHloc3Vpc2F0LFZJX2Z0eXBlX1ZEU0ksMikKKy8vIHRhZyA6IFY2X3ZkbXB5aHN1aXNhdAorZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5aHN1aXNhdCA6CitIZXhhZ29uX3Y1MTJ2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5aHN1aXNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHloc3Vpc2F0XzEyOEIsVklfZnR5cGVfVkRTSSwyKQorLy8gdGFnIDogVjZfdmRtcHloc3Vpc2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWhzdWlzYXRfMTI4QiA6CitIZXhhZ29uX3YxMDI0djIwNDhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZG1weWhzdWlzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRtcHloc3Vpc2F0X2FjYyxWSV9mdHlwZV9WSVZEU0ksMykKKy8vIHRhZyA6IFY2X3ZkbXB5aHN1aXNhdF9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZG1weWhzdWlzYXRfYWNjIDoKK0hleGFnb25fdjUxMnY1MTJ2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5aHN1aXNhdF9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkbXB5aHN1aXNhdF9hY2NfMTI4QixWSV9mdHlwZV9WSVZEU0ksMykKKy8vIHRhZyA6IFY2X3ZkbXB5aHN1aXNhdF9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZkbXB5aHN1aXNhdF9hY2NfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MjA0OGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkbXB5aHN1aXNhdF9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnRtcHliLFZEX2Z0eXBlX1ZEU0ksMikKKy8vIHRhZyA6IFY2X3Z0bXB5YgorZGVmIGludF9oZXhhZ29uX1Y2X3Z0bXB5YiA6CitIZXhhZ29uX3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92dG1weWIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z0bXB5Yl8xMjhCLFZEX2Z0eXBlX1ZEU0ksMikKKy8vIHRhZyA6IFY2X3Z0bXB5Yl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnRtcHliXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnRtcHliXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z0bXB5Yl9hY2MsVkRfZnR5cGVfVkRWRFNJLDMpCisvLyB0YWcgOiBWNl92dG1weWJfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdnRtcHliX2FjYyA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Z0bXB5Yl9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z0bXB5Yl9hY2NfMTI4QixWRF9mdHlwZV9WRFZEU0ksMykKKy8vIHRhZyA6IFY2X3Z0bXB5Yl9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Z0bXB5Yl9hY2NfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MjA0OGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Z0bXB5Yl9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnRtcHlidXMsVkRfZnR5cGVfVkRTSSwyKQorLy8gdGFnIDogVjZfdnRtcHlidXMKK2RlZiBpbnRfaGV4YWdvbl9WNl92dG1weWJ1cyA6CitIZXhhZ29uX3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92dG1weWJ1cyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnRtcHlidXNfMTI4QixWRF9mdHlwZV9WRFNJLDIpCisvLyB0YWcgOiBWNl92dG1weWJ1c18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnRtcHlidXNfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92dG1weWJ1c18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92dG1weWJ1c19hY2MsVkRfZnR5cGVfVkRWRFNJLDMpCisvLyB0YWcgOiBWNl92dG1weWJ1c19hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92dG1weWJ1c19hY2MgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92dG1weWJ1c19hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z0bXB5YnVzX2FjY18xMjhCLFZEX2Z0eXBlX1ZEVkRTSSwzKQorLy8gdGFnIDogVjZfdnRtcHlidXNfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92dG1weWJ1c19hY2NfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MjA0OGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Z0bXB5YnVzX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92dG1weWhiLFZEX2Z0eXBlX1ZEU0ksMikKKy8vIHRhZyA6IFY2X3Z0bXB5aGIKK2RlZiBpbnRfaGV4YWdvbl9WNl92dG1weWhiIDoKK0hleGFnb25fdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Z0bXB5aGIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z0bXB5aGJfMTI4QixWRF9mdHlwZV9WRFNJLDIpCisvLyB0YWcgOiBWNl92dG1weWhiXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92dG1weWhiXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnRtcHloYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92dG1weWhiX2FjYyxWRF9mdHlwZV9WRFZEU0ksMykKKy8vIHRhZyA6IFY2X3Z0bXB5aGJfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdnRtcHloYl9hY2MgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92dG1weWhiX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnRtcHloYl9hY2NfMTI4QixWRF9mdHlwZV9WRFZEU0ksMykKKy8vIHRhZyA6IFY2X3Z0bXB5aGJfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92dG1weWhiX2FjY18xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYyMDQ4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnRtcHloYl9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHl1YixWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92cm1weXViCitkZWYgaW50X2hleGFnb25fVjZfdnJtcHl1YiA6CitIZXhhZ29uX3Y1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJtcHl1YiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHl1Yl8xMjhCLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZybXB5dWJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5dWJfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weXViXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5dWJfYWNjLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdnJtcHl1Yl9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weXViX2FjYyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5dWJfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weXViX2FjY18xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdnJtcHl1Yl9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5dWJfYWNjXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weXViX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weXVidixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cm1weXVidgorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5dWJ2IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weXVidiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHl1YnZfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cm1weXVidl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnJtcHl1YnZfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJtcHl1YnZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHl1YnZfYWNjLFZJX2Z0eXBlX1ZJVklWSSwzKQorLy8gdGFnIDogVjZfdnJtcHl1YnZfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdnJtcHl1YnZfYWNjIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJtcHl1YnZfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weXVidl9hY2NfMTI4QixWSV9mdHlwZV9WSVZJVkksMykKKy8vIHRhZyA6IFY2X3ZybXB5dWJ2X2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnJtcHl1YnZfYWNjXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJtcHl1YnZfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5YnYsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnJtcHlidgorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5YnYgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5YnYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5YnZfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cm1weWJ2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weWJ2XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5YnZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHlidl9hY2MsVklfZnR5cGVfVklWSVZJLDMpCisvLyB0YWcgOiBWNl92cm1weWJ2X2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5YnZfYWNjIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJtcHlidl9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5YnZfYWNjXzEyOEIsVklfZnR5cGVfVklWSVZJLDMpCisvLyB0YWcgOiBWNl92cm1weWJ2X2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnJtcHlidl9hY2NfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weWJ2X2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weXViaSxWRF9mdHlwZV9WRFNJU0ksMykKKy8vIHRhZyA6IFY2X3ZybXB5dWJpCitkZWYgaW50X2hleGFnb25fVjZfdnJtcHl1YmkgOgorSGV4YWdvbl92MTAyNHYxMDI0aWlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5dWJpIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weXViaV8xMjhCLFZEX2Z0eXBlX1ZEU0lTSSwzKQorLy8gdGFnIDogVjZfdnJtcHl1YmlfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5dWJpXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4aWlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5dWJpXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5dWJpX2FjYyxWRF9mdHlwZV9WRFZEU0lTSSw0KQorLy8gdGFnIDogVjZfdnJtcHl1YmlfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdnJtcHl1YmlfYWNjIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aWlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5dWJpX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHl1YmlfYWNjXzEyOEIsVkRfZnR5cGVfVkRWRFNJU0ksNCkKKy8vIHRhZyA6IFY2X3ZybXB5dWJpX2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnJtcHl1YmlfYWNjXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhpaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJtcHl1YmlfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5YnVzLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZybXB5YnVzCitkZWYgaW50X2hleGFnb25fVjZfdnJtcHlidXMgOgorSGV4YWdvbl92NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5YnVzIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weWJ1c18xMjhCLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZybXB5YnVzXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weWJ1c18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5YnVzXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5YnVzX2FjYyxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZybXB5YnVzX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5YnVzX2FjYyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5YnVzX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHlidXNfYWNjXzEyOEIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92cm1weWJ1c19hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5YnVzX2FjY18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJtcHlidXNfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5YnVzaSxWRF9mdHlwZV9WRFNJU0ksMykKKy8vIHRhZyA6IFY2X3ZybXB5YnVzaQorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5YnVzaSA6CitIZXhhZ29uX3YxMDI0djEwMjRpaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJtcHlidXNpIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weWJ1c2lfMTI4QixWRF9mdHlwZV9WRFNJU0ksMykKKy8vIHRhZyA6IFY2X3ZybXB5YnVzaV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnJtcHlidXNpXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4aWlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5YnVzaV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weWJ1c2lfYWNjLFZEX2Z0eXBlX1ZEVkRTSVNJLDQpCisvLyB0YWcgOiBWNl92cm1weWJ1c2lfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdnJtcHlidXNpX2FjYyA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weWJ1c2lfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weWJ1c2lfYWNjXzEyOEIsVkRfZnR5cGVfVkRWRFNJU0ksNCkKKy8vIHRhZyA6IFY2X3ZybXB5YnVzaV9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5YnVzaV9hY2NfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MjA0OGlpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weWJ1c2lfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5YnVzdixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cm1weWJ1c3YKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weWJ1c3YgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5YnVzdiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHlidXN2XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnJtcHlidXN2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weWJ1c3ZfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJtcHlidXN2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5YnVzdl9hY2MsVklfZnR5cGVfVklWSVZJLDMpCisvLyB0YWcgOiBWNl92cm1weWJ1c3ZfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdnJtcHlidXN2X2FjYyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5YnVzdl9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5YnVzdl9hY2NfMTI4QixWSV9mdHlwZV9WSVZJVkksMykKKy8vIHRhZyA6IFY2X3ZybXB5YnVzdl9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5YnVzdl9hY2NfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weWJ1c3ZfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zkc2FkdWgsVkRfZnR5cGVfVkRTSSwyKQorLy8gdGFnIDogVjZfdmRzYWR1aAorZGVmIGludF9oZXhhZ29uX1Y2X3Zkc2FkdWggOgorSGV4YWdvbl92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRzYWR1aCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRzYWR1aF8xMjhCLFZEX2Z0eXBlX1ZEU0ksMikKKy8vIHRhZyA6IFY2X3Zkc2FkdWhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zkc2FkdWhfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZHNhZHVoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zkc2FkdWhfYWNjLFZEX2Z0eXBlX1ZEVkRTSSwzKQorLy8gdGFnIDogVjZfdmRzYWR1aF9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZHNhZHVoX2FjYyA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zkc2FkdWhfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZHNhZHVoX2FjY18xMjhCLFZEX2Z0eXBlX1ZEVkRTSSwzKQorLy8gdGFnIDogVjZfdmRzYWR1aF9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zkc2FkdWhfYWNjXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZHNhZHVoX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cnNhZHViaSxWRF9mdHlwZV9WRFNJU0ksMykKKy8vIHRhZyA6IFY2X3Zyc2FkdWJpCitkZWYgaW50X2hleGFnb25fVjZfdnJzYWR1YmkgOgorSGV4YWdvbl92MTAyNHYxMDI0aWlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zyc2FkdWJpIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cnNhZHViaV8xMjhCLFZEX2Z0eXBlX1ZEU0lTSSwzKQorLy8gdGFnIDogVjZfdnJzYWR1YmlfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zyc2FkdWJpXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4aWlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zyc2FkdWJpXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zyc2FkdWJpX2FjYyxWRF9mdHlwZV9WRFZEU0lTSSw0KQorLy8gdGFnIDogVjZfdnJzYWR1YmlfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdnJzYWR1YmlfYWNjIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aWlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zyc2FkdWJpX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJzYWR1YmlfYWNjXzEyOEIsVkRfZnR5cGVfVkRWRFNJU0ksNCkKKy8vIHRhZyA6IFY2X3Zyc2FkdWJpX2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnJzYWR1YmlfYWNjXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhpaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJzYWR1YmlfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3J3LFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3Zhc3J3CitkZWYgaW50X2hleGFnb25fVjZfdmFzcncgOgorSGV4YWdvbl92NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3J3Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNyd18xMjhCLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3Zhc3J3XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNyd18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3J3XzEyOEIiPjsKKworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzbHcsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdmFzbHcKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNsdyA6CitIZXhhZ29uX3Y1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzbHciPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc2x3XzEyOEIsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdmFzbHdfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc2x3XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzbHdfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmxzcncsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdmxzcncKK2RlZiBpbnRfaGV4YWdvbl9WNl92bHNydyA6CitIZXhhZ29uX3Y1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmxzcnciPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zsc3J3XzEyOEIsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdmxzcndfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zsc3J3XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmxzcndfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcnd2LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zhc3J3dgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3J3diA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcnd2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNyd3ZfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXNyd3ZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3J3dl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNyd3ZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzbHd2LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zhc2x3dgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc2x3diA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzbHd2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNsd3ZfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXNsd3ZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc2x3dl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNsd3ZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmxzcnd2LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zsc3J3dgorZGVmIGludF9oZXhhZ29uX1Y2X3Zsc3J3diA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmxzcnd2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bHNyd3ZfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bHNyd3ZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zsc3J3dl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bHNyd3ZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcmgsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdmFzcmgKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNyaCA6CitIZXhhZ29uX3Y1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcmgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3JoXzEyOEIsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdmFzcmhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3JoXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcmhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzbGgsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdmFzbGgKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNsaCA6CitIZXhhZ29uX3Y1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzbGgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc2xoXzEyOEIsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdmFzbGhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc2xoXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzbGhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmxzcmgsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdmxzcmgKK2RlZiBpbnRfaGV4YWdvbl9WNl92bHNyaCA6CitIZXhhZ29uX3Y1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmxzcmgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zsc3JoXzEyOEIsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdmxzcmhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zsc3JoXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmxzcmhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcmh2LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zhc3JodgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3JodiA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcmh2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNyaHZfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXNyaHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3Jodl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNyaHZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzbGh2LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zhc2xodgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc2xodiA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzbGh2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNsaHZfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXNsaHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc2xodl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNsaHZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmxzcmh2LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zsc3JodgorZGVmIGludF9oZXhhZ29uX1Y2X3Zsc3JodiA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmxzcmh2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bHNyaHZfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bHNyaHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zsc3Jodl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bHNyaHZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcndoLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzcndoCitkZWYgaW50X2hleGFnb25fVjZfdmFzcndoIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcndoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNyd2hfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3J3aF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFzcndoXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNyd2hfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcndoc2F0LFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzcndoc2F0CitkZWYgaW50X2hleGFnb25fVjZfdmFzcndoc2F0IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcndoc2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNyd2hzYXRfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3J3aHNhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFzcndoc2F0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNyd2hzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcndocm5kc2F0LFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzcndocm5kc2F0CitkZWYgaW50X2hleGFnb25fVjZfdmFzcndocm5kc2F0IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcndocm5kc2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNyd2hybmRzYXRfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3J3aHJuZHNhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFzcndocm5kc2F0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNyd2hybmRzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcnd1aHNhdCxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3J3dWhzYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNyd3Voc2F0IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcnd1aHNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcnd1aHNhdF8xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzcnd1aHNhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFzcnd1aHNhdF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcnd1aHNhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm91bmR3aCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cm91bmR3aAorZGVmIGludF9oZXhhZ29uX1Y2X3Zyb3VuZHdoIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm91bmR3aCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJvdW5kd2hfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cm91bmR3aF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnJvdW5kd2hfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJvdW5kd2hfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJvdW5kd3VoLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zyb3VuZHd1aAorZGVmIGludF9oZXhhZ29uX1Y2X3Zyb3VuZHd1aCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJvdW5kd3VoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm91bmR3dWhfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cm91bmR3dWhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zyb3VuZHd1aF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm91bmR3dWhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcmh1YnNhdCxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3JodWJzYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNyaHVic2F0IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcmh1YnNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcmh1YnNhdF8xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzcmh1YnNhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFzcmh1YnNhdF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcmh1YnNhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNyaHVicm5kc2F0LFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzcmh1YnJuZHNhdAorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3JodWJybmRzYXQgOgorSGV4YWdvbl92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNyaHVicm5kc2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNyaHVicm5kc2F0XzEyOEIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YXNyaHVicm5kc2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNyaHVicm5kc2F0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNyaHVicm5kc2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3JoYnJuZHNhdCxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3JoYnJuZHNhdAorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3JoYnJuZHNhdCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3JoYnJuZHNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcmhicm5kc2F0XzEyOEIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YXNyaGJybmRzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3JoYnJuZHNhdF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcmhicm5kc2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zyb3VuZGhiLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zyb3VuZGhiCitkZWYgaW50X2hleGFnb25fVjZfdnJvdW5kaGIgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zyb3VuZGhiIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm91bmRoYl8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zyb3VuZGhiXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm91bmRoYl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm91bmRoYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm91bmRodWIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnJvdW5kaHViCitkZWYgaW50X2hleGFnb25fVjZfdnJvdW5kaHViIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm91bmRodWIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zyb3VuZGh1Yl8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zyb3VuZGh1Yl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnJvdW5kaHViXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zyb3VuZGh1Yl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNsd19hY2MsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YXNsd19hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNsd19hY2MgOgorSGV4YWdvbl92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNsd19hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc2x3X2FjY18xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzbHdfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNsd19hY2NfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc2x3X2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNyd19hY2MsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YXNyd19hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNyd19hY2MgOgorSGV4YWdvbl92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNyd19hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3J3X2FjY18xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzcndfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNyd19hY2NfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3J3X2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkYixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWRkYgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRiIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkYiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGJfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWRkYl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZGJfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YmIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnN1YmIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3ViYiA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YmIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJiXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnN1YmJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJiXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJiXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRiX2R2LFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZhZGRiX2R2CitkZWYgaW50X2hleGFnb25fVjZfdmFkZGJfZHYgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGRiX2R2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkYl9kdl8xMjhCLFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZhZGRiX2R2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkYl9kdl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYyMDQ4X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkYl9kdl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3ViYl9kdixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92c3ViYl9kdgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJiX2R2IDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3ViYl9kdiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YmJfZHZfMTI4QixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92c3ViYl9kdl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnN1YmJfZHZfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MjA0OF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YmJfZHZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGgsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZGgKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkaCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRoXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZGhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRoXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGRoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJoLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJoCitkZWYgaW50X2hleGFnb25fVjZfdnN1YmggOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3ViaF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3ViaF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3ViaF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkaF9kdixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92YWRkaF9kdgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRoX2R2IDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkaF9kdiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGhfZHZfMTI4QixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92YWRkaF9kdl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZGhfZHZfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MjA0OF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGhfZHZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YmhfZHYsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdnN1YmhfZHYKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3ViaF9kdiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YmhfZHYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJoX2R2XzEyOEIsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdnN1YmhfZHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJoX2R2XzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJoX2R2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGR3LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGR3CitkZWYgaW50X2hleGFnb25fVjZfdmFkZHcgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGR3Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkd18xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGR3XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkd18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkd18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3VidyxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c3VidworZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ3IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3VidyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YndfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c3Vid18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnN1YndfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YndfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZHdfZHYsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdmFkZHdfZHYKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkd19kdiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHdfZHYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGR3X2R2XzEyOEIsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdmFkZHdfZHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR3X2R2XzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGR3X2R2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJ3X2R2LFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZzdWJ3X2R2CitkZWYgaW50X2hleGFnb25fVjZfdnN1YndfZHYgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJ3X2R2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3Vid19kdl8xMjhCLFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZzdWJ3X2R2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3Vid19kdl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYyMDQ4X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3Vid19kdl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdWJzYXQsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZHVic2F0CitkZWYgaW50X2hleGFnb25fVjZfdmFkZHVic2F0IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkdWJzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGR1YnNhdF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGR1YnNhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZHVic2F0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGR1YnNhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdWJzYXRfZHYsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdmFkZHVic2F0X2R2CitkZWYgaW50X2hleGFnb25fVjZfdmFkZHVic2F0X2R2IDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkdWJzYXRfZHYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGR1YnNhdF9kdl8xMjhCLFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZhZGR1YnNhdF9kdl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZHVic2F0X2R2XzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGR1YnNhdF9kdl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3VidWJzYXQsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnN1YnVic2F0CitkZWYgaW50X2hleGFnb25fVjZfdnN1YnVic2F0IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3VidWJzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJ1YnNhdF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJ1YnNhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnN1YnVic2F0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJ1YnNhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3VidWJzYXRfZHYsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdnN1YnVic2F0X2R2CitkZWYgaW50X2hleGFnb25fVjZfdnN1YnVic2F0X2R2IDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3VidWJzYXRfZHYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJ1YnNhdF9kdl8xMjhCLFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZzdWJ1YnNhdF9kdl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnN1YnVic2F0X2R2XzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJ1YnNhdF9kdl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdWhzYXQsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZHVoc2F0CitkZWYgaW50X2hleGFnb25fVjZfdmFkZHVoc2F0IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkdWhzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGR1aHNhdF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGR1aHNhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZHVoc2F0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGR1aHNhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdWhzYXRfZHYsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdmFkZHVoc2F0X2R2CitkZWYgaW50X2hleGFnb25fVjZfdmFkZHVoc2F0X2R2IDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkdWhzYXRfZHYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGR1aHNhdF9kdl8xMjhCLFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZhZGR1aHNhdF9kdl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZHVoc2F0X2R2XzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGR1aHNhdF9kdl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3VidWhzYXQsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnN1YnVoc2F0CitkZWYgaW50X2hleGFnb25fVjZfdnN1YnVoc2F0IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3VidWhzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJ1aHNhdF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJ1aHNhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnN1YnVoc2F0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJ1aHNhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3VidWhzYXRfZHYsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdnN1YnVoc2F0X2R2CitkZWYgaW50X2hleGFnb25fVjZfdnN1YnVoc2F0X2R2IDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3VidWhzYXRfZHYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJ1aHNhdF9kdl8xMjhCLFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZzdWJ1aHNhdF9kdl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnN1YnVoc2F0X2R2XzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJ1aHNhdF9kdl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkaHNhdCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWRkaHNhdAorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRoc2F0IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkaHNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGhzYXRfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWRkaHNhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZGhzYXRfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGhzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGhzYXRfZHYsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdmFkZGhzYXRfZHYKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkaHNhdF9kdiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGhzYXRfZHYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRoc2F0X2R2XzEyOEIsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdmFkZGhzYXRfZHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRoc2F0X2R2XzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGRoc2F0X2R2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJoc2F0LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJoc2F0CitkZWYgaW50X2hleGFnb25fVjZfdnN1YmhzYXQgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJoc2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3ViaHNhdF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJoc2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3ViaHNhdF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3ViaHNhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3ViaHNhdF9kdixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92c3ViaHNhdF9kdgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJoc2F0X2R2IDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3ViaHNhdF9kdiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YmhzYXRfZHZfMTI4QixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92c3ViaHNhdF9kdl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnN1YmhzYXRfZHZfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MjA0OF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YmhzYXRfZHZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZHdzYXQsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZHdzYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkd3NhdCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHdzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGR3c2F0XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZHdzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR3c2F0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGR3c2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGR3c2F0X2R2LFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZhZGR3c2F0X2R2CitkZWYgaW50X2hleGFnb25fVjZfdmFkZHdzYXRfZHYgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGR3c2F0X2R2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkd3NhdF9kdl8xMjhCLFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZhZGR3c2F0X2R2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkd3NhdF9kdl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYyMDQ4X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkd3NhdF9kdl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3Vid3NhdCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c3Vid3NhdAorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ3c2F0IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3Vid3NhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YndzYXRfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c3Vid3NhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnN1YndzYXRfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YndzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YndzYXRfZHYsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdnN1YndzYXRfZHYKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3Vid3NhdF9kdiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YndzYXRfZHYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJ3c2F0X2R2XzEyOEIsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdnN1YndzYXRfZHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ3c2F0X2R2XzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJ3c2F0X2R2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhdmd1YixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXZndWIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXZndWIgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhdmd1YiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmF2Z3ViXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmF2Z3ViXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXZndWJfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmF2Z3ViXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhdmd1YnJuZCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXZndWJybmQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXZndWJybmQgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhdmd1YnJuZCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmF2Z3Vicm5kXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmF2Z3Vicm5kXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXZndWJybmRfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmF2Z3Vicm5kXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhdmd1aCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXZndWgKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXZndWggOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhdmd1aCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmF2Z3VoXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmF2Z3VoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXZndWhfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmF2Z3VoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhdmd1aHJuZCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXZndWhybmQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXZndWhybmQgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhdmd1aHJuZCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmF2Z3Vocm5kXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmF2Z3Vocm5kXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXZndWhybmRfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmF2Z3Vocm5kXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhdmdoLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhdmdoCitkZWYgaW50X2hleGFnb25fVjZfdmF2Z2ggOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhdmdoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXZnaF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhdmdoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXZnaF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXZnaF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXZnaHJuZCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXZnaHJuZAorZGVmIGludF9oZXhhZ29uX1Y2X3Zhdmdocm5kIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXZnaHJuZCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmF2Z2hybmRfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXZnaHJuZF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmF2Z2hybmRfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmF2Z2hybmRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm5hdmdoLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZuYXZnaAorZGVmIGludF9oZXhhZ29uX1Y2X3ZuYXZnaCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm5hdmdoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bmF2Z2hfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bmF2Z2hfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZuYXZnaF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bmF2Z2hfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmF2Z3csVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmF2Z3cKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXZndyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmF2Z3ciPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhdmd3XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmF2Z3dfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhdmd3XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhdmd3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhdmd3cm5kLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zhdmd3cm5kCitkZWYgaW50X2hleGFnb25fVjZfdmF2Z3dybmQgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhdmd3cm5kIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXZnd3JuZF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zhdmd3cm5kXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXZnd3JuZF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXZnd3JuZF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bmF2Z3csVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm5hdmd3CitkZWYgaW50X2hleGFnb25fVjZfdm5hdmd3IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bmF2Z3ciPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZuYXZnd18xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZuYXZnd18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm5hdmd3XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZuYXZnd18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWJzZGlmZnViLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhYnNkaWZmdWIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWJzZGlmZnViIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWJzZGlmZnViIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWJzZGlmZnViXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFic2RpZmZ1Yl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFic2RpZmZ1Yl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWJzZGlmZnViXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhYnNkaWZmdWgsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFic2RpZmZ1aAorZGVmIGludF9oZXhhZ29uX1Y2X3ZhYnNkaWZmdWggOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhYnNkaWZmdWgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhYnNkaWZmdWhfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWJzZGlmZnVoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWJzZGlmZnVoXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhYnNkaWZmdWhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFic2RpZmZoLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhYnNkaWZmaAorZGVmIGludF9oZXhhZ29uX1Y2X3ZhYnNkaWZmaCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFic2RpZmZoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWJzZGlmZmhfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWJzZGlmZmhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhYnNkaWZmaF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWJzZGlmZmhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFic2RpZmZ3LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhYnNkaWZmdworZGVmIGludF9oZXhhZ29uX1Y2X3ZhYnNkaWZmdyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFic2RpZmZ3Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWJzZGlmZndfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWJzZGlmZndfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhYnNkaWZmd18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWJzZGlmZndfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm5hdmd1YixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bmF2Z3ViCitkZWYgaW50X2hleGFnb25fVjZfdm5hdmd1YiA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm5hdmd1YiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm5hdmd1Yl8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZuYXZndWJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZuYXZndWJfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm5hdmd1Yl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdWJoLFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGR1YmgKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkdWJoIDoKK0hleGFnb25fdjEwMjR2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHViaCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZHViaF8xMjhCLFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGR1YmhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR1YmhfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHViaF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3VidWJoLFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJ1YmgKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3VidWJoIDoKK0hleGFnb25fdjEwMjR2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YnViaCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YnViaF8xMjhCLFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJ1YmhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ1YmhfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YnViaF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkaHcsVkRfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZGh3CitkZWYgaW50X2hleGFnb25fVjZfdmFkZGh3IDoKK0hleGFnb25fdjEwMjR2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGh3Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkaHdfMTI4QixWRF9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWRkaHdfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRod18xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkaHdfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1Ymh3LFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJodworZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJodyA6CitIZXhhZ29uX3YxMDI0djUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJodyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1Ymh3XzEyOEIsVkRfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnN1Ymh3XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3ViaHdfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1Ymh3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGR1aHcsVkRfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZHVodworZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR1aHcgOgorSGV4YWdvbl92MTAyNHY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkdWh3Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdWh3XzEyOEIsVkRfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZHVod18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZHVod18xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkdWh3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJ1aHcsVkRfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnN1YnVodworZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ1aHcgOgorSGV4YWdvbl92MTAyNHY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3VidWh3Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3VidWh3XzEyOEIsVkRfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnN1YnVod18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnN1YnVod18xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3VidWh3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkMCxWSV9mdHlwZV8sMCkKKy8vIHRhZyA6IFY2X3ZkMAorZGVmIGludF9oZXhhZ29uX1Y2X3ZkMCA6CitIZXhhZ29uX3Y1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkMCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmQwXzEyOEIsVklfZnR5cGVfLDApCisvLyB0YWcgOiBWNl92ZDBfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZkMF8xMjhCIDoKK0hleGFnb25fdjEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkMF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkYnEsVklfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92YWRkYnEKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkYnEgOgorSGV4YWdvbl92NTEydjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkYnEiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRicV8xMjhCLFZJX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmFkZGJxXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkYnFfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkYnFfMTI4QiI+OworCisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3ViYnEsVklfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92c3ViYnEKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3ViYnEgOgorSGV4YWdvbl92NTEydjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3ViYnEiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJicV8xMjhCLFZJX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdnN1YmJxXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3ViYnFfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3ViYnFfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGJucSxWSV9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZhZGRibnEKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkYm5xIDoKK0hleGFnb25fdjUxMnY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGJucSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGJucV8xMjhCLFZJX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmFkZGJucV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZGJucV8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGRibnFfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YmJucSxWSV9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZzdWJibnEKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3ViYm5xIDoKK0hleGFnb25fdjUxMnY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YmJucSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YmJucV8xMjhCLFZJX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdnN1YmJucV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnN1YmJucV8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJibnFfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGhxLFZJX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmFkZGhxCitkZWYgaW50X2hleGFnb25fVjZfdmFkZGhxIDoKK0hleGFnb25fdjUxMnY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGhxIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkaHFfMTI4QixWSV9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZhZGRocV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZGhxXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGhxXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJocSxWSV9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZzdWJocQorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJocSA6CitIZXhhZ29uX3Y1MTJ2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJocSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YmhxXzEyOEIsVklfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92c3ViaHFfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJocV8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJocV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkaG5xLFZJX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmFkZGhucQorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGRobnEgOgorSGV4YWdvbl92NTEydjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkaG5xIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkaG5xXzEyOEIsVklfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92YWRkaG5xXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkaG5xXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGhucV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3ViaG5xLFZJX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdnN1YmhucQorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJobnEgOgorSGV4YWdvbl92NTEydjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3ViaG5xIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3ViaG5xXzEyOEIsVklfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92c3ViaG5xXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3ViaG5xXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YmhucV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkd3EsVklfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92YWRkd3EKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkd3EgOgorSGV4YWdvbl92NTEydjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkd3EiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGR3cV8xMjhCLFZJX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmFkZHdxXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkd3FfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkd3FfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YndxLFZJX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdnN1YndxCitkZWYgaW50X2hleGFnb25fVjZfdnN1YndxIDoKK0hleGFnb25fdjUxMnY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YndxIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3Vid3FfMTI4QixWSV9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZzdWJ3cV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnN1YndxXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YndxXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGR3bnEsVklfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92YWRkd25xCitkZWYgaW50X2hleGFnb25fVjZfdmFkZHducSA6CitIZXhhZ29uX3Y1MTJ2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGR3bnEiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGR3bnFfMTI4QixWSV9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZhZGR3bnFfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR3bnFfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkd25xXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJ3bnEsVklfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92c3Vid25xCitkZWYgaW50X2hleGFnb25fVjZfdnN1YnducSA6CitIZXhhZ29uX3Y1MTJ2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJ3bnEiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJ3bnFfMTI4QixWSV9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZzdWJ3bnFfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ3bnFfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3Vid25xXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhYnNoLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92YWJzaAorZGVmIGludF9oZXhhZ29uX1Y2X3ZhYnNoIDoKK0hleGFnb25fdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhYnNoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWJzaF8xMjhCLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92YWJzaF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFic2hfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhYnNoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhYnNoX3NhdCxWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdmFic2hfc2F0CitkZWYgaW50X2hleGFnb25fVjZfdmFic2hfc2F0IDoKK0hleGFnb25fdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhYnNoX3NhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFic2hfc2F0XzEyOEIsVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3ZhYnNoX3NhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFic2hfc2F0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWJzaF9zYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFic3csVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3ZhYnN3CitkZWYgaW50X2hleGFnb25fVjZfdmFic3cgOgorSGV4YWdvbl92NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFic3ciPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhYnN3XzEyOEIsVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3ZhYnN3XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWJzd18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFic3dfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFic3dfc2F0LFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92YWJzd19zYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWJzd19zYXQgOgorSGV4YWdvbl92NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFic3dfc2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWJzd19zYXRfMTI4QixWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdmFic3dfc2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWJzd19zYXRfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhYnN3X3NhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5YnYsVkRfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1weWJ2CitkZWYgaW50X2hleGFnb25fVjZfdm1weWJ2IDoKK0hleGFnb25fdjEwMjR2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWJ2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5YnZfMTI4QixWRF9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bXB5YnZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlidl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5YnZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWJ2X2FjYyxWRF9mdHlwZV9WRFZJVkksMykKKy8vIHRhZyA6IFY2X3ZtcHlidl9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5YnZfYWNjIDoKK0hleGFnb25fdjEwMjR2MTAyNHY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5YnZfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5YnZfYWNjXzEyOEIsVkRfZnR5cGVfVkRWSVZJLDMpCisvLyB0YWcgOiBWNl92bXB5YnZfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5YnZfYWNjXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWJ2X2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5dWJ2LFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHl1YnYKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5dWJ2IDoKK0hleGFnb25fdjEwMjR2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weXVidiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weXVidl8xMjhCLFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHl1YnZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHl1YnZfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weXVidl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5dWJ2X2FjYyxWRF9mdHlwZV9WRFZJVkksMykKKy8vIHRhZyA6IFY2X3ZtcHl1YnZfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdm1weXVidl9hY2MgOgorSGV4YWdvbl92MTAyNHYxMDI0djUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHl1YnZfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5dWJ2X2FjY18xMjhCLFZEX2Z0eXBlX1ZEVklWSSwzKQorLy8gdGFnIDogVjZfdm1weXVidl9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHl1YnZfYWNjXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weXVidl9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWJ1c3YsVkRfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1weWJ1c3YKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5YnVzdiA6CitIZXhhZ29uX3YxMDI0djUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlidXN2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5YnVzdl8xMjhCLFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHlidXN2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5YnVzdl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5YnVzdl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5YnVzdl9hY2MsVkRfZnR5cGVfVkRWSVZJLDMpCisvLyB0YWcgOiBWNl92bXB5YnVzdl9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5YnVzdl9hY2MgOgorSGV4YWdvbl92MTAyNHYxMDI0djUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlidXN2X2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWJ1c3ZfYWNjXzEyOEIsVkRfZnR5cGVfVkRWSVZJLDMpCisvLyB0YWcgOiBWNl92bXB5YnVzdl9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlidXN2X2FjY18xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlidXN2X2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXBhYnVzdixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92bXBhYnVzdgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcGFidXN2IDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXBhYnVzdiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1wYWJ1c3ZfMTI4QixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92bXBhYnVzdl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1wYWJ1c3ZfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MjA0OF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1wYWJ1c3ZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1wYWJ1dXYsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdm1wYWJ1dXYKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXBhYnV1diA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1wYWJ1dXYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcGFidXV2XzEyOEIsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdm1wYWJ1dXZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcGFidXV2XzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djIwNDhfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcGFidXV2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlodixWRF9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bXB5aHYKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aHYgOgorSGV4YWdvbl92MTAyNHY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aHYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlodl8xMjhCLFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHlodl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weWh2XzEyOEIgOgorSGV4YWdvbl92MjA0OHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlodl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aHZfYWNjLFZEX2Z0eXBlX1ZEVklWSSwzKQorLy8gdGFnIDogVjZfdm1weWh2X2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlodl9hY2MgOgorSGV4YWdvbl92MTAyNHYxMDI0djUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlodl9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlodl9hY2NfMTI4QixWRF9mdHlwZV9WRFZJVkksMykKKy8vIHRhZyA6IFY2X3ZtcHlodl9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlodl9hY2NfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aHZfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHl1aHYsVkRfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1weXVodgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHl1aHYgOgorSGV4YWdvbl92MTAyNHY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5dWh2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5dWh2XzEyOEIsVkRfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1weXVodl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weXVodl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5dWh2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHl1aHZfYWNjLFZEX2Z0eXBlX1ZEVklWSSwzKQorLy8gdGFnIDogVjZfdm1weXVodl9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5dWh2X2FjYyA6CitIZXhhZ29uX3YxMDI0djEwMjR2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weXVodl9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHl1aHZfYWNjXzEyOEIsVkRfZnR5cGVfVkRWSVZJLDMpCisvLyB0YWcgOiBWNl92bXB5dWh2X2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weXVodl9hY2NfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5dWh2X2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aHZzcnMsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1weWh2c3JzCitkZWYgaW50X2hleGFnb25fVjZfdm1weWh2c3JzIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aHZzcnMiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlodnNyc18xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHlodnNyc18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weWh2c3JzXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlodnNyc18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aHVzLFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHlodXMKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aHVzIDoKK0hleGFnb25fdjEwMjR2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWh1cyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWh1c18xMjhCLFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHlodXNfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlodXNfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWh1c18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aHVzX2FjYyxWRF9mdHlwZV9WRFZJVkksMykKKy8vIHRhZyA6IFY2X3ZtcHlodXNfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdm1weWh1c19hY2MgOgorSGV4YWdvbl92MTAyNHYxMDI0djUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlodXNfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aHVzX2FjY18xMjhCLFZEX2Z0eXBlX1ZEVklWSSwzKQorLy8gdGFnIDogVjZfdm1weWh1c19hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlodXNfYWNjXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWh1c19hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWloLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHlpaAorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpaCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWloIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aWhfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bXB5aWhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpaF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aWhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWloX2FjYyxWSV9mdHlwZV9WSVZJVkksMykKKy8vIHRhZyA6IFY2X3ZtcHlpaF9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aWhfYWNjIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWloX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWloX2FjY18xMjhCLFZJX2Z0eXBlX1ZJVklWSSwzKQorLy8gdGFnIDogVjZfdm1weWloX2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weWloX2FjY18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpaF9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWV3dWgsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1weWV3dWgKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5ZXd1aCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWV3dWgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlld3VoXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1weWV3dWhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlld3VoXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlld3VoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlvd2gsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1weW93aAorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlvd2ggOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlvd2giPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlvd2hfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bXB5b3doXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5b3doXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlvd2hfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weW93aF9ybmQsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1weW93aF9ybmQKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5b3doX3JuZCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weW93aF9ybmQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlvd2hfcm5kXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1weW93aF9ybmRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlvd2hfcm5kXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlvd2hfcm5kXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlvd2hfc2FjYyxWSV9mdHlwZV9WSVZJVkksMykKKy8vIHRhZyA6IFY2X3ZtcHlvd2hfc2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlvd2hfc2FjYyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlvd2hfc2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weW93aF9zYWNjXzEyOEIsVklfZnR5cGVfVklWSVZJLDMpCisvLyB0YWcgOiBWNl92bXB5b3doX3NhY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlvd2hfc2FjY18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlvd2hfc2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5b3doX3JuZF9zYWNjLFZJX2Z0eXBlX1ZJVklWSSwzKQorLy8gdGFnIDogVjZfdm1weW93aF9ybmRfc2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlvd2hfcm5kX3NhY2MgOgorSGV4YWdvbl92NTEydjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5b3doX3JuZF9zYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5b3doX3JuZF9zYWNjXzEyOEIsVklfZnR5cGVfVklWSVZJLDMpCisvLyB0YWcgOiBWNl92bXB5b3doX3JuZF9zYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5b3doX3JuZF9zYWNjXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weW93aF9ybmRfc2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aWVvaCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bXB5aWVvaAorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpZW9oIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aWVvaCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWllb2hfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bXB5aWVvaF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weWllb2hfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWllb2hfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWlld3VoLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHlpZXd1aAorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpZXd1aCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWlld3VoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aWV3dWhfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bXB5aWV3dWhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpZXd1aF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aWV3dWhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWlvd2gsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1weWlvd2gKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aW93aCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWlvd2giPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpb3doXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1weWlvd2hfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpb3doXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpb3doXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpZXdoX2FjYyxWSV9mdHlwZV9WSVZJVkksMykKKy8vIHRhZyA6IFY2X3ZtcHlpZXdoX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpZXdoX2FjYyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpZXdoX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWlld2hfYWNjXzEyOEIsVklfZnR5cGVfVklWSVZJLDMpCisvLyB0YWcgOiBWNl92bXB5aWV3aF9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpZXdoX2FjY18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpZXdoX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aWV3dWhfYWNjLFZJX2Z0eXBlX1ZJVklWSSwzKQorLy8gdGFnIDogVjZfdm1weWlld3VoX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpZXd1aF9hY2MgOgorSGV4YWdvbl92NTEydjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aWV3dWhfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aWV3dWhfYWNjXzEyOEIsVklfZnR5cGVfVklWSVZJLDMpCisvLyB0YWcgOiBWNl92bXB5aWV3dWhfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aWV3dWhfYWNjXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWlld3VoX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5dWIsVkRfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdm1weXViCitkZWYgaW50X2hleGFnb25fVjZfdm1weXViIDoKK0hleGFnb25fdjEwMjR2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weXViIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5dWJfMTI4QixWRF9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92bXB5dWJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHl1Yl8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHl1Yl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5dWJfYWNjLFZEX2Z0eXBlX1ZEVklTSSwzKQorLy8gdGFnIDogVjZfdm1weXViX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHl1Yl9hY2MgOgorSGV4YWdvbl92MTAyNHYxMDI0djUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHl1Yl9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHl1Yl9hY2NfMTI4QixWRF9mdHlwZV9WRFZJU0ksMykKKy8vIHRhZyA6IFY2X3ZtcHl1Yl9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHl1Yl9hY2NfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHl1Yl9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWJ1cyxWRF9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92bXB5YnVzCitkZWYgaW50X2hleGFnb25fVjZfdm1weWJ1cyA6CitIZXhhZ29uX3YxMDI0djUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlidXMiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlidXNfMTI4QixWRF9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92bXB5YnVzXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5YnVzXzEyOEIgOgorSGV4YWdvbl92MjA0OHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWJ1c18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5YnVzX2FjYyxWRF9mdHlwZV9WRFZJU0ksMykKKy8vIHRhZyA6IFY2X3ZtcHlidXNfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdm1weWJ1c19hY2MgOgorSGV4YWdvbl92MTAyNHYxMDI0djUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlidXNfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5YnVzX2FjY18xMjhCLFZEX2Z0eXBlX1ZEVklTSSwzKQorLy8gdGFnIDogVjZfdm1weWJ1c19hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlidXNfYWNjXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5YnVzX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXBhYnVzLFZEX2Z0eXBlX1ZEU0ksMikKKy8vIHRhZyA6IFY2X3ZtcGFidXMKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXBhYnVzIDoKK0hleGFnb25fdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcGFidXMiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcGFidXNfMTI4QixWRF9mdHlwZV9WRFNJLDIpCisvLyB0YWcgOiBWNl92bXBhYnVzXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXBhYnVzXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1wYWJ1c18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXBhYnVzX2FjYyxWRF9mdHlwZV9WRFZEU0ksMykKKy8vIHRhZyA6IFY2X3ZtcGFidXNfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdm1wYWJ1c19hY2MgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXBhYnVzX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1wYWJ1c19hY2NfMTI4QixWRF9mdHlwZV9WRFZEU0ksMykKKy8vIHRhZyA6IFY2X3ZtcGFidXNfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXBhYnVzX2FjY18xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYyMDQ4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1wYWJ1c19hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1wYWhiLFZEX2Z0eXBlX1ZEU0ksMikKKy8vIHRhZyA6IFY2X3ZtcGFoYgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcGFoYiA6CitIZXhhZ29uX3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXBhaGIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcGFoYl8xMjhCLFZEX2Z0eXBlX1ZEU0ksMikKKy8vIHRhZyA6IFY2X3ZtcGFoYl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1wYWhiXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1wYWhiXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcGFoYl9hY2MsVkRfZnR5cGVfVkRWRFNJLDMpCisvLyB0YWcgOiBWNl92bXBhaGJfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdm1wYWhiX2FjYyA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcGFoYl9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcGFoYl9hY2NfMTI4QixWRF9mdHlwZV9WRFZEU0ksMykKKy8vIHRhZyA6IFY2X3ZtcGFoYl9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcGFoYl9hY2NfMTI4QiA6CitIZXhhZ29uX3YyMDQ4djIwNDh2MjA0OGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcGFoYl9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWgsVkRfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdm1weWgKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aCA6CitIZXhhZ29uX3YxMDI0djUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHloIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aF8xMjhCLFZEX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZtcHloXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aF8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHloXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHloc2F0X2FjYyxWRF9mdHlwZV9WRFZJU0ksMykKKy8vIHRhZyA6IFY2X3ZtcHloc2F0X2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHloc2F0X2FjYyA6CitIZXhhZ29uX3YxMDI0djEwMjR2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWhzYXRfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aHNhdF9hY2NfMTI4QixWRF9mdHlwZV9WRFZJU0ksMykKKy8vIHRhZyA6IFY2X3ZtcHloc2F0X2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weWhzYXRfYWNjXzEyOEIgOgorSGV4YWdvbl92MjA0OHYyMDQ4djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aHNhdF9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWhzcyxWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92bXB5aHNzCitkZWYgaW50X2hleGFnb25fVjZfdm1weWhzcyA6CitIZXhhZ29uX3Y1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWhzcyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWhzc18xMjhCLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZtcHloc3NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHloc3NfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aHNzXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHloc3JzLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZtcHloc3JzCitkZWYgaW50X2hleGFnb25fVjZfdm1weWhzcnMgOgorSGV4YWdvbl92NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHloc3JzIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aHNyc18xMjhCLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZtcHloc3JzXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aHNyc18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHloc3JzXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHl1aCxWRF9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92bXB5dWgKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5dWggOgorSGV4YWdvbl92MTAyNHY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5dWgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHl1aF8xMjhCLFZEX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZtcHl1aF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weXVoXzEyOEIgOgorSGV4YWdvbl92MjA0OHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weXVoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHl1aF9hY2MsVkRfZnR5cGVfVkRWSVNJLDMpCisvLyB0YWcgOiBWNl92bXB5dWhfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdm1weXVoX2FjYyA6CitIZXhhZ29uX3YxMDI0djEwMjR2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weXVoX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weXVoX2FjY18xMjhCLFZEX2Z0eXBlX1ZEVklTSSwzKQorLy8gdGFnIDogVjZfdm1weXVoX2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weXVoX2FjY18xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weXVoX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aWhiLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZtcHlpaGIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aWhiIDoKK0hleGFnb25fdjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aWhiIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aWhiXzEyOEIsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdm1weWloYl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weWloYl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpaGJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWloYl9hY2MsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92bXB5aWhiX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpaGJfYWNjIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWloYl9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpaGJfYWNjXzEyOEIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92bXB5aWhiX2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weWloYl9hY2NfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpaGJfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpd2IsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdm1weWl3YgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpd2IgOgorSGV4YWdvbl92NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpd2IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpd2JfMTI4QixWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92bXB5aXdiXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aXdiXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWl3Yl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aXdiX2FjYyxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZtcHlpd2JfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdm1weWl3Yl9hY2MgOgorSGV4YWdvbl92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aXdiX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWl3Yl9hY2NfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZtcHlpd2JfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aXdiX2FjY18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWl3Yl9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWl3aCxWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92bXB5aXdoCitkZWYgaW50X2hleGFnb25fVjZfdm1weWl3aCA6CitIZXhhZ29uX3Y1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWl3aCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWl3aF8xMjhCLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZtcHlpd2hfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpd2hfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aXdoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpd2hfYWNjLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdm1weWl3aF9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5aXdoX2FjYyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpd2hfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aXdoX2FjY18xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdm1weWl3aF9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpd2hfYWNjXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aXdoX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YW5kLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhbmQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YW5kIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YW5kIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YW5kXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFuZF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFuZF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YW5kXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZvcixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92b3IKK2RlZiBpbnRfaGV4YWdvbl9WNl92b3IgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZvciI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm9yXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm9yXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92b3JfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm9yXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z4b3IsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnhvcgorZGVmIGludF9oZXhhZ29uX1Y2X3Z4b3IgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Z4b3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Z4b3JfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92eG9yXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92eG9yXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Z4b3JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm5vdCxWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdm5vdAorZGVmIGludF9oZXhhZ29uX1Y2X3Zub3QgOgorSGV4YWdvbl92NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm5vdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm5vdF8xMjhCLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92bm90XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bm90XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bm90XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhbmRxcnQsVklfZnR5cGVfUVZTSSwyKQorLy8gdGFnIDogVjZfdmFuZHFydAorZGVmIGludF9oZXhhZ29uX1Y2X3ZhbmRxcnQgOgorSGV4YWdvbl92NTEydjY0aWlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhbmRxcnQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhbmRxcnRfMTI4QixWSV9mdHlwZV9RVlNJLDIpCisvLyB0YWcgOiBWNl92YW5kcXJ0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YW5kcXJ0XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMjhpaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFuZHFydF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YW5kcXJ0X2FjYyxWSV9mdHlwZV9WSVFWU0ksMykKKy8vIHRhZyA6IFY2X3ZhbmRxcnRfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdmFuZHFydF9hY2MgOgorSGV4YWdvbl92NTEydjUxMnY2NGlpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YW5kcXJ0X2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFuZHFydF9hY2NfMTI4QixWSV9mdHlwZV9WSVFWU0ksMykKKy8vIHRhZyA6IFY2X3ZhbmRxcnRfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YW5kcXJ0X2FjY18xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMjhpaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFuZHFydF9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFuZHZydCxRVl9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92YW5kdnJ0CitkZWYgaW50X2hleGFnb25fVjZfdmFuZHZydCA6CitIZXhhZ29uX3Y2NGl2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFuZHZydCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFuZHZydF8xMjhCLFFWX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZhbmR2cnRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhbmR2cnRfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YW5kdnJ0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhbmR2cnRfYWNjLFFWX2Z0eXBlX1FWVklTSSwzKQorLy8gdGFnIDogVjZfdmFuZHZydF9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92YW5kdnJ0X2FjYyA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhbmR2cnRfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YW5kdnJ0X2FjY18xMjhCLFFWX2Z0eXBlX1FWVklTSSwzKQorLy8gdGFnIDogVjZfdmFuZHZydF9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhbmR2cnRfYWNjXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YW5kdnJ0X2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R3LFFWX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZndHcKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R3IDoKK0hleGFnb25fdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R3Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R3XzEyOEIsUVZfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmd0d18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmd0d18xMjhCIDoKK0hleGFnb25fdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHdfYW5kLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0d19hbmQKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R3X2FuZCA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHdfYW5kIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R3X2FuZF8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0d19hbmRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndHdfYW5kXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0d19hbmRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0d19vcixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndHdfb3IKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R3X29yIDoKK0hleGFnb25fdjY0aXY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0d19vciI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0d19vcl8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0d19vcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmd0d19vcl8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHdfb3JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0d194b3IsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3R3X3hvcgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndHdfeG9yIDoKK0hleGFnb25fdjY0aXY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0d194b3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHdfeG9yXzEyOEIsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3R3X3hvcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmd0d194b3JfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R3X3hvcl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZXF3LFFWX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZlcXcKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZXF3IDoKK0hleGFnb25fdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZXF3Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZXF3XzEyOEIsUVZfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmVxd18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmVxd18xMjhCIDoKK0hleGFnb25fdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZXF3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZlcXdfYW5kLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmVxd19hbmQKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZXF3X2FuZCA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZlcXdfYW5kIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZXF3X2FuZF8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmVxd19hbmRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZlcXdfYW5kXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmVxd19hbmRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmVxd19vcixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZlcXdfb3IKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZXF3X29yIDoKK0hleGFnb25fdjY0aXY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmVxd19vciI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmVxd19vcl8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmVxd19vcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmVxd19vcl8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZlcXdfb3JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmVxd194b3IsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92ZXF3X3hvcgorZGVmIGludF9oZXhhZ29uX1Y2X3ZlcXdfeG9yIDoKK0hleGFnb25fdjY0aXY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmVxd194b3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZlcXdfeG9yXzEyOEIsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92ZXF3X3hvcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmVxd194b3JfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZXF3X3hvcl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3RoLFFWX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZndGgKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3RoIDoKK0hleGFnb25fdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3RoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3RoXzEyOEIsUVZfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmd0aF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmd0aF8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3RoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndGhfYW5kLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0aF9hbmQKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3RoX2FuZCA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndGhfYW5kIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3RoX2FuZF8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0aF9hbmRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndGhfYW5kXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0aF9hbmRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0aF9vcixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndGhfb3IKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3RoX29yIDoKK0hleGFnb25fdjY0aXY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0aF9vciI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0aF9vcl8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0aF9vcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmd0aF9vcl8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndGhfb3JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0aF94b3IsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3RoX3hvcgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndGhfeG9yIDoKK0hleGFnb25fdjY0aXY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0aF94b3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndGhfeG9yXzEyOEIsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3RoX3hvcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmd0aF94b3JfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3RoX3hvcl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZXFoLFFWX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZlcWgKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZXFoIDoKK0hleGFnb25fdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZXFoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZXFoXzEyOEIsUVZfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmVxaF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmVxaF8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZXFoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZlcWhfYW5kLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmVxaF9hbmQKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZXFoX2FuZCA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZlcWhfYW5kIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZXFoX2FuZF8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmVxaF9hbmRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZlcWhfYW5kXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmVxaF9hbmRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmVxaF9vcixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZlcWhfb3IKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZXFoX29yIDoKK0hleGFnb25fdjY0aXY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmVxaF9vciI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmVxaF9vcl8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmVxaF9vcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmVxaF9vcl8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZlcWhfb3JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmVxaF94b3IsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92ZXFoX3hvcgorZGVmIGludF9oZXhhZ29uX1Y2X3ZlcWhfeG9yIDoKK0hleGFnb25fdjY0aXY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmVxaF94b3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZlcWhfeG9yXzEyOEIsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92ZXFoX3hvcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmVxaF94b3JfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZXFoX3hvcl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3RiLFFWX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZndGIKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3RiIDoKK0hleGFnb25fdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3RiIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3RiXzEyOEIsUVZfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmd0Yl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmd0Yl8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3RiXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndGJfYW5kLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0Yl9hbmQKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3RiX2FuZCA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndGJfYW5kIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3RiX2FuZF8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0Yl9hbmRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndGJfYW5kXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0Yl9hbmRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0Yl9vcixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndGJfb3IKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3RiX29yIDoKK0hleGFnb25fdjY0aXY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0Yl9vciI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0Yl9vcl8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0Yl9vcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmd0Yl9vcl8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndGJfb3JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0Yl94b3IsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3RiX3hvcgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndGJfeG9yIDoKK0hleGFnb25fdjY0aXY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0Yl94b3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndGJfeG9yXzEyOEIsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3RiX3hvcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmd0Yl94b3JfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3RiX3hvcl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZXFiLFFWX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZlcWIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZXFiIDoKK0hleGFnb25fdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZXFiIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZXFiXzEyOEIsUVZfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmVxYl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmVxYl8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZXFiXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZlcWJfYW5kLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmVxYl9hbmQKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZXFiX2FuZCA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZlcWJfYW5kIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZXFiX2FuZF8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmVxYl9hbmRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZlcWJfYW5kXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmVxYl9hbmRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmVxYl9vcixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZlcWJfb3IKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZXFiX29yIDoKK0hleGFnb25fdjY0aXY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmVxYl9vciI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmVxYl9vcl8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmVxYl9vcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmVxYl9vcl8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZlcWJfb3JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmVxYl94b3IsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92ZXFiX3hvcgorZGVmIGludF9oZXhhZ29uX1Y2X3ZlcWJfeG9yIDoKK0hleGFnb25fdjY0aXY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmVxYl94b3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZlcWJfeG9yXzEyOEIsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92ZXFiX3hvcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmVxYl94b3JfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZXFiX3hvcl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R1dyxRVl9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92Z3R1dworZGVmIGludF9oZXhhZ29uX1Y2X3ZndHV3IDoKK0hleGFnb25fdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R1dyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0dXdfMTI4QixRVl9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92Z3R1d18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmd0dXdfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0dXdfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0dXdfYW5kLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0dXdfYW5kCitkZWYgaW50X2hleGFnb25fVjZfdmd0dXdfYW5kIDoKK0hleGFnb25fdjY0aXY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0dXdfYW5kIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R1d19hbmRfMTI4QixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndHV3X2FuZF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmd0dXdfYW5kXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0dXdfYW5kXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHV3X29yLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0dXdfb3IKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R1d19vciA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHV3X29yIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R1d19vcl8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0dXdfb3JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndHV3X29yXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0dXdfb3JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0dXdfeG9yLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0dXdfeG9yCitkZWYgaW50X2hleGFnb25fVjZfdmd0dXdfeG9yIDoKK0hleGFnb25fdjY0aXY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0dXdfeG9yIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R1d194b3JfMTI4QixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndHV3X3hvcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmd0dXdfeG9yXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0dXdfeG9yXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHVoLFFWX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZndHVoCitkZWYgaW50X2hleGFnb25fVjZfdmd0dWggOgorSGV4YWdvbl92NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHVoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R1aF8xMjhCLFFWX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZndHVoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R1aF8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R1aF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R1aF9hbmQsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3R1aF9hbmQKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R1aF9hbmQgOgorSGV4YWdvbl92NjRpdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R1aF9hbmQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHVoX2FuZF8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0dWhfYW5kXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R1aF9hbmRfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R1aF9hbmRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0dWhfb3IsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3R1aF9vcgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndHVoX29yIDoKK0hleGFnb25fdjY0aXY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0dWhfb3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHVoX29yXzEyOEIsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3R1aF9vcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmd0dWhfb3JfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R1aF9vcl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R1aF94b3IsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3R1aF94b3IKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R1aF94b3IgOgorSGV4YWdvbl92NjRpdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R1aF94b3IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHVoX3hvcl8xMjhCLFFWX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdmd0dWhfeG9yXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R1aF94b3JfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R1aF94b3JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0dWIsUVZfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmd0dWIKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R1YiA6CitIZXhhZ29uX3Y2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmd0dWIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHViXzEyOEIsUVZfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmd0dWJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndHViXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHViXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHViX2FuZCxRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndHViX2FuZAorZGVmIGludF9oZXhhZ29uX1Y2X3ZndHViX2FuZCA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHViX2FuZCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0dWJfYW5kXzEyOEIsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3R1Yl9hbmRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndHViX2FuZF8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHViX2FuZF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Z3R1Yl9vcixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndHViX29yCitkZWYgaW50X2hleGFnb25fVjZfdmd0dWJfb3IgOgorSGV4YWdvbl92NjRpdjY0aXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z3R1Yl9vciI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0dWJfb3JfMTI4QixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndHViX29yXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z3R1Yl9vcl8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHViX29yXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZndHViX3hvcixRVl9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZndHViX3hvcgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndHViX3hvciA6CitIZXhhZ29uX3Y2NGl2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHViX3hvciI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmd0dWJfeG9yXzEyOEIsUVZfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92Z3R1Yl94b3JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZndHViX3hvcl8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZndHViX3hvcl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9wcmVkX29yLFFWX2Z0eXBlX1FWUVYsMikKKy8vIHRhZyA6IFY2X3ByZWRfb3IKK2RlZiBpbnRfaGV4YWdvbl9WNl9wcmVkX29yIDoKK0hleGFnb25fdjY0aXY2NGl2NjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl9wcmVkX29yIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9wcmVkX29yXzEyOEIsUVZfZnR5cGVfUVZRViwyKQorLy8gdGFnIDogVjZfcHJlZF9vcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfcHJlZF9vcl8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMjhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl9wcmVkX29yXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ByZWRfYW5kLFFWX2Z0eXBlX1FWUVYsMikKKy8vIHRhZyA6IFY2X3ByZWRfYW5kCitkZWYgaW50X2hleGFnb25fVjZfcHJlZF9hbmQgOgorSGV4YWdvbl92NjRpdjY0aXY2NGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ByZWRfYW5kIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9wcmVkX2FuZF8xMjhCLFFWX2Z0eXBlX1FWUVYsMikKKy8vIHRhZyA6IFY2X3ByZWRfYW5kXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl9wcmVkX2FuZF8xMjhCIDoKK0hleGFnb25fdjEyOGl2MTI4aXYxMjhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl9wcmVkX2FuZF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9wcmVkX25vdCxRVl9mdHlwZV9RViwxKQorLy8gdGFnIDogVjZfcHJlZF9ub3QKK2RlZiBpbnRfaGV4YWdvbl9WNl9wcmVkX25vdCA6CitIZXhhZ29uX3Y2NGl2NjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl9wcmVkX25vdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfcHJlZF9ub3RfMTI4QixRVl9mdHlwZV9RViwxKQorLy8gdGFnIDogVjZfcHJlZF9ub3RfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ByZWRfbm90XzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl9wcmVkX25vdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9wcmVkX3hvcixRVl9mdHlwZV9RVlFWLDIpCisvLyB0YWcgOiBWNl9wcmVkX3hvcgorZGVmIGludF9oZXhhZ29uX1Y2X3ByZWRfeG9yIDoKK0hleGFnb25fdjY0aXY2NGl2NjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl9wcmVkX3hvciI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfcHJlZF94b3JfMTI4QixRVl9mdHlwZV9RVlFWLDIpCisvLyB0YWcgOiBWNl9wcmVkX3hvcl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfcHJlZF94b3JfMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTI4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfcHJlZF94b3JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfcHJlZF9hbmRfbixRVl9mdHlwZV9RVlFWLDIpCisvLyB0YWcgOiBWNl9wcmVkX2FuZF9uCitkZWYgaW50X2hleGFnb25fVjZfcHJlZF9hbmRfbiA6CitIZXhhZ29uX3Y2NGl2NjRpdjY0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfcHJlZF9hbmRfbiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfcHJlZF9hbmRfbl8xMjhCLFFWX2Z0eXBlX1FWUVYsMikKKy8vIHRhZyA6IFY2X3ByZWRfYW5kX25fMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ByZWRfYW5kX25fMTI4QiA6CitIZXhhZ29uX3YxMjhpdjEyOGl2MTI4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfcHJlZF9hbmRfbl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9wcmVkX29yX24sUVZfZnR5cGVfUVZRViwyKQorLy8gdGFnIDogVjZfcHJlZF9vcl9uCitkZWYgaW50X2hleGFnb25fVjZfcHJlZF9vcl9uIDoKK0hleGFnb25fdjY0aXY2NGl2NjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl9wcmVkX29yX24iPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ByZWRfb3Jfbl8xMjhCLFFWX2Z0eXBlX1FWUVYsMikKKy8vIHRhZyA6IFY2X3ByZWRfb3Jfbl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfcHJlZF9vcl9uXzEyOEIgOgorSGV4YWdvbl92MTI4aXYxMjhpdjEyOGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ByZWRfb3Jfbl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9wcmVkX3NjYWxhcjIsUVZfZnR5cGVfU0ksMSkKKy8vIHRhZyA6IFY2X3ByZWRfc2NhbGFyMgorZGVmIGludF9oZXhhZ29uX1Y2X3ByZWRfc2NhbGFyMiA6CitIZXhhZ29uX3Y2NGlpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl9wcmVkX3NjYWxhcjIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ByZWRfc2NhbGFyMl8xMjhCLFFWX2Z0eXBlX1NJLDEpCisvLyB0YWcgOiBWNl9wcmVkX3NjYWxhcjJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ByZWRfc2NhbGFyMl8xMjhCIDoKK0hleGFnb25fdjEyOGlpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl9wcmVkX3NjYWxhcjJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm11eCxWSV9mdHlwZV9RVlZJVkksMykKKy8vIHRhZyA6IFY2X3ZtdXgKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXV4IDoKK0hleGFnb25fdjUxMnY2NGl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm11eCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm11eF8xMjhCLFZJX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdm11eF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm11eF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTI4aXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtdXhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN3YXAsVkRfZnR5cGVfUVZWSVZJLDMpCisvLyB0YWcgOiBWNl92c3dhcAorZGVmIGludF9oZXhhZ29uX1Y2X3Zzd2FwIDoKK0hleGFnb25fdjEwMjR2NjRpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zzd2FwIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3dhcF8xMjhCLFZEX2Z0eXBlX1FWVklWSSwzKQorLy8gdGFnIDogVjZfdnN3YXBfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zzd2FwXzEyOEIgOgorSGV4YWdvbl92MjA0OHYxMjhpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN3YXBfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1heHViLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtYXh1YgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtYXh1YiA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1heHViIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bWF4dWJfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bWF4dWJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtYXh1Yl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bWF4dWJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1pbnViLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtaW51YgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtaW51YiA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1pbnViIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bWludWJfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bWludWJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtaW51Yl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bWludWJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1heHVoLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtYXh1aAorZGVmIGludF9oZXhhZ29uX1Y2X3ZtYXh1aCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1heHVoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bWF4dWhfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bWF4dWhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtYXh1aF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bWF4dWhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1pbnVoLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtaW51aAorZGVmIGludF9oZXhhZ29uX1Y2X3ZtaW51aCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1pbnVoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bWludWhfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bWludWhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtaW51aF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bWludWhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1heGgsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1heGgKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWF4aCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1heGgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtYXhoXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1heGhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtYXhoXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtYXhoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtaW5oLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtaW5oCitkZWYgaW50X2hleGFnb25fVjZfdm1pbmggOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtaW5oIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bWluaF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtaW5oXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWluaF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bWluaF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bWF4dyxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bWF4dworZGVmIGludF9oZXhhZ29uX1Y2X3ZtYXh3IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bWF4dyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1heHdfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bWF4d18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1heHdfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1heHdfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1pbncsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1pbncKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWludyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1pbnciPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtaW53XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1pbndfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtaW53XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtaW53XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzYXRodWIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnNhdGh1YgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzYXRodWIgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzYXRodWIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzYXRodWJfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c2F0aHViXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2F0aHViXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzYXRodWJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNhdHdoLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzYXR3aAorZGVmIGludF9oZXhhZ29uX1Y2X3ZzYXR3aCA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNhdHdoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2F0d2hfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c2F0d2hfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzYXR3aF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2F0d2hfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNodWZmZWIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnNodWZmZWIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2h1ZmZlYiA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNodWZmZWIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzaHVmZmViXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnNodWZmZWJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzaHVmZmViXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzaHVmZmViXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzaHVmZm9iLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzaHVmZm9iCitkZWYgaW50X2hleGFnb25fVjZfdnNodWZmb2IgOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzaHVmZm9iIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2h1ZmZvYl8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzaHVmZm9iXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2h1ZmZvYl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2h1ZmZvYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2h1ZmVoLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzaHVmZWgKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2h1ZmVoIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2h1ZmVoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2h1ZmVoXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnNodWZlaF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnNodWZlaF8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2h1ZmVoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzaHVmb2gsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnNodWZvaAorZGVmIGludF9oZXhhZ29uX1Y2X3ZzaHVmb2ggOgorSGV4YWdvbl92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzaHVmb2giPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzaHVmb2hfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c2h1Zm9oXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2h1Zm9oXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzaHVmb2hfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNodWZmdmRkLFZEX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdnNodWZmdmRkCitkZWYgaW50X2hleGFnb25fVjZfdnNodWZmdmRkIDoKK0hleGFnb25fdjEwMjR2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzaHVmZnZkZCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNodWZmdmRkXzEyOEIsVkRfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92c2h1ZmZ2ZGRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzaHVmZnZkZF8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNodWZmdmRkXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkZWFsdmRkLFZEX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmRlYWx2ZGQKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZGVhbHZkZCA6CitIZXhhZ29uX3YxMDI0djUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZGVhbHZkZCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRlYWx2ZGRfMTI4QixWRF9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZkZWFsdmRkXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZGVhbHZkZF8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRlYWx2ZGRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNodWZvZWgsVkRfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnNodWZvZWgKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2h1Zm9laCA6CitIZXhhZ29uX3YxMDI0djUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzaHVmb2VoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2h1Zm9laF8xMjhCLFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzaHVmb2VoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2h1Zm9laF8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2h1Zm9laF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2h1Zm9lYixWRF9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c2h1Zm9lYgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzaHVmb2ViIDoKK0hleGFnb25fdjEwMjR2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNodWZvZWIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzaHVmb2ViXzEyOEIsVkRfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnNodWZvZWJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzaHVmb2ViXzEyOEIgOgorSGV4YWdvbl92MjA0OHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzaHVmb2ViXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkZWFsaCxWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdmRlYWxoCitkZWYgaW50X2hleGFnb25fVjZfdmRlYWxoIDoKK0hleGFnb25fdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkZWFsaCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRlYWxoXzEyOEIsVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3ZkZWFsaF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmRlYWxoXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZGVhbGhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRlYWxiLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92ZGVhbGIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZGVhbGIgOgorSGV4YWdvbl92NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRlYWxiIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZGVhbGJfMTI4QixWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdmRlYWxiXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZGVhbGJfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkZWFsYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZGVhbGI0dyxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92ZGVhbGI0dworZGVmIGludF9oZXhhZ29uX1Y2X3ZkZWFsYjR3IDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZGVhbGI0dyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmRlYWxiNHdfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92ZGVhbGI0d18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmRlYWxiNHdfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmRlYWxiNHdfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNodWZmaCxWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdnNodWZmaAorZGVmIGludF9oZXhhZ29uX1Y2X3ZzaHVmZmggOgorSGV4YWdvbl92NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNodWZmaCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNodWZmaF8xMjhCLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92c2h1ZmZoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2h1ZmZoXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2h1ZmZoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzaHVmZmIsVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3ZzaHVmZmIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2h1ZmZiIDoKK0hleGFnb25fdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzaHVmZmIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzaHVmZmJfMTI4QixWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdnNodWZmYl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnNodWZmYl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNodWZmYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9leHRyYWN0dyxTSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl9leHRyYWN0dworZGVmIGludF9oZXhhZ29uX1Y2X2V4dHJhY3R3IDoKK0hleGFnb25faXY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl9leHRyYWN0dyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfZXh0cmFjdHdfMTI4QixTSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl9leHRyYWN0d18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfZXh0cmFjdHdfMTI4QiA6CitIZXhhZ29uX2l2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X2V4dHJhY3R3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZpbnNlcnR3cixWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92aW5zZXJ0d3IKK2RlZiBpbnRfaGV4YWdvbl9WNl92aW5zZXJ0d3IgOgorSGV4YWdvbl92NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZpbnNlcnR3ciI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmluc2VydHdyXzEyOEIsVklfZnR5cGVfVklTSSwyKQorLy8gdGFnIDogVjZfdmluc2VydHdyXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92aW5zZXJ0d3JfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92aW5zZXJ0d3JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfbHZzcGxhdHcsVklfZnR5cGVfU0ksMSkKKy8vIHRhZyA6IFY2X2x2c3BsYXR3CitkZWYgaW50X2hleGFnb25fVjZfbHZzcGxhdHcgOgorSGV4YWdvbl92NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfbHZzcGxhdHciPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X2x2c3BsYXR3XzEyOEIsVklfZnR5cGVfU0ksMSkKKy8vIHRhZyA6IFY2X2x2c3BsYXR3XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl9sdnNwbGF0d18xMjhCIDoKK0hleGFnb25fdjEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl9sdnNwbGF0d18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNzaWduLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92YXNzaWduCitkZWYgaW50X2hleGFnb25fVjZfdmFzc2lnbiA6CitIZXhhZ29uX3Y1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNzaWduIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNzaWduXzEyOEIsVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3Zhc3NpZ25fMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3NpZ25fMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3NpZ25fMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmNvbWJpbmUsVkRfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmNvbWJpbmUKK2RlZiBpbnRfaGV4YWdvbl9WNl92Y29tYmluZSA6CitIZXhhZ29uX3YxMDI0djUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zjb21iaW5lIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Y29tYmluZV8xMjhCLFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zjb21iaW5lXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92Y29tYmluZV8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Y29tYmluZV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZGVsdGEsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmRlbHRhCitkZWYgaW50X2hleGFnb25fVjZfdmRlbHRhIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZGVsdGEiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkZWx0YV8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZkZWx0YV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmRlbHRhXzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkZWx0YV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cmRlbHRhLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZyZGVsdGEKK2RlZiBpbnRfaGV4YWdvbl9WNl92cmRlbHRhIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cmRlbHRhIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cmRlbHRhXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnJkZWx0YV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnJkZWx0YV8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cmRlbHRhXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZjbDB3LFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92Y2wwdworZGVmIGludF9oZXhhZ29uX1Y2X3ZjbDB3IDoKK0hleGFnb25fdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZjbDB3Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Y2wwd18xMjhCLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92Y2wwd18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmNsMHdfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZjbDB3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZjbDBoLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92Y2wwaAorZGVmIGludF9oZXhhZ29uX1Y2X3ZjbDBoIDoKK0hleGFnb25fdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZjbDBoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92Y2wwaF8xMjhCLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92Y2wwaF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmNsMGhfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZjbDBoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zub3JtYW10dyxWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdm5vcm1hbXR3CitkZWYgaW50X2hleGFnb25fVjZfdm5vcm1hbXR3IDoKK0hleGFnb25fdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zub3JtYW10dyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm5vcm1hbXR3XzEyOEIsVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3Zub3JtYW10d18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm5vcm1hbXR3XzEyOEIgOgorSGV4YWdvbl92MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bm9ybWFtdHdfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm5vcm1hbXRoLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92bm9ybWFtdGgKK2RlZiBpbnRfaGV4YWdvbl9WNl92bm9ybWFtdGggOgorSGV4YWdvbl92NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm5vcm1hbXRoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bm9ybWFtdGhfMTI4QixWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdm5vcm1hbXRoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bm9ybWFtdGhfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zub3JtYW10aF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cG9wY291bnRoLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92cG9wY291bnRoCitkZWYgaW50X2hleGFnb25fVjZfdnBvcGNvdW50aCA6CitIZXhhZ29uX3Y1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cG9wY291bnRoIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cG9wY291bnRoXzEyOEIsVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3Zwb3Bjb3VudGhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zwb3Bjb3VudGhfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zwb3Bjb3VudGhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmx1dHZ2YixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZsdXR2dmIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bHV0dnZiIDoKK0hleGFnb25fdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmx1dHZ2YiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmx1dHZ2Yl8xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmx1dHZ2Yl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmx1dHZ2Yl8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmx1dHZ2Yl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bHV0dnZiX29yYWNjLFZJX2Z0eXBlX1ZJVklWSVNJLDQpCisvLyB0YWcgOiBWNl92bHV0dnZiX29yYWNjCitkZWYgaW50X2hleGFnb25fVjZfdmx1dHZ2Yl9vcmFjYyA6CitIZXhhZ29uX3Y1MTJ2NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bHV0dnZiX29yYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bHV0dnZiX29yYWNjXzEyOEIsVklfZnR5cGVfVklWSVZJU0ksNCkKKy8vIHRhZyA6IFY2X3ZsdXR2dmJfb3JhY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZsdXR2dmJfb3JhY2NfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmx1dHZ2Yl9vcmFjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bHV0dndoLFZEX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmx1dHZ3aAorZGVmIGludF9oZXhhZ29uX1Y2X3ZsdXR2d2ggOgorSGV4YWdvbl92MTAyNHY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmx1dHZ3aCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmx1dHZ3aF8xMjhCLFZEX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmx1dHZ3aF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmx1dHZ3aF8xMjhCIDoKK0hleGFnb25fdjIwNDh2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmx1dHZ3aF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bHV0dndoX29yYWNjLFZEX2Z0eXBlX1ZEVklWSVNJLDQpCisvLyB0YWcgOiBWNl92bHV0dndoX29yYWNjCitkZWYgaW50X2hleGFnb25fVjZfdmx1dHZ3aF9vcmFjYyA6CitIZXhhZ29uX3YxMDI0djEwMjR2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZsdXR2d2hfb3JhY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZsdXR2d2hfb3JhY2NfMTI4QixWRF9mdHlwZV9WRFZJVklTSSw0KQorLy8gdGFnIDogVjZfdmx1dHZ3aF9vcmFjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmx1dHZ3aF9vcmFjY18xMjhCIDoKK0hleGFnb25fdjIwNDh2MjA0OHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bHV0dndoX29yYWNjXzEyOEIiPjsKKworLy8KKy8vIE1hc2tlZCB2ZWN0b3Igc3RvcmVzCisvLworZGVmIGludF9oZXhhZ29uX1Y2X3ZTMzJiX3FwcmVkX2FpIDoKK0hleGFnb25fdnY2NGl2bWVtdjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdlMzMmJfcXByZWRfYWkiPjsKKworZGVmIGludF9oZXhhZ29uX1Y2X3ZTMzJiX25xcHJlZF9haSA6CitIZXhhZ29uX3Z2NjRpdm1lbXY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZTMzJiX25xcHJlZF9haSI+OworCitkZWYgaW50X2hleGFnb25fVjZfdlMzMmJfbnRfcXByZWRfYWkgOgorSGV4YWdvbl92djY0aXZtZW12NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92UzMyYl9udF9xcHJlZF9haSI+OworCitkZWYgaW50X2hleGFnb25fVjZfdlMzMmJfbnRfbnFwcmVkX2FpIDoKK0hleGFnb25fdnY2NGl2bWVtdjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdlMzMmJfbnRfbnFwcmVkX2FpIj47CisKK2RlZiBpbnRfaGV4YWdvbl9WNl92UzMyYl9xcHJlZF9haV8xMjhCIDoKK0hleGFnb25fdnYxMjhpdm1lbXYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92UzMyYl9xcHJlZF9haV8xMjhCIj47CisKK2RlZiBpbnRfaGV4YWdvbl9WNl92UzMyYl9ucXByZWRfYWlfMTI4QiA6CitIZXhhZ29uX3Z2MTI4aXZtZW12MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdlMzMmJfbnFwcmVkX2FpXzEyOEIiPjsKKworZGVmIGludF9oZXhhZ29uX1Y2X3ZTMzJiX250X3FwcmVkX2FpXzEyOEIgOgorSGV4YWdvbl92djEyOGl2bWVtdjEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZTMzJiX250X3FwcmVkX2FpXzEyOEIiPjsKKworZGVmIGludF9oZXhhZ29uX1Y2X3ZTMzJiX250X25xcHJlZF9haV8xMjhCIDoKK0hleGFnb25fdnYxMjhpdm1lbXYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92UzMyYl9udF9ucXByZWRfYWlfMTI4QiI+OworCitkZWYgaW50X2hleGFnb25fVjZfdm1hc2tlZHN0b3JlcSA6CitIZXhhZ29uX3Z2NjRpdm1lbXY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtYXNrZWRzdG9yZXEiPjsKKworZGVmIGludF9oZXhhZ29uX1Y2X3ZtYXNrZWRzdG9yZW5xIDoKK0hleGFnb25fdnY2NGl2bWVtdjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1hc2tlZHN0b3JlbnEiPjsKKworZGVmIGludF9oZXhhZ29uX1Y2X3ZtYXNrZWRzdG9yZW50cSA6CitIZXhhZ29uX3Z2NjRpdm1lbXY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtYXNrZWRzdG9yZW50cSI+OworCitkZWYgaW50X2hleGFnb25fVjZfdm1hc2tlZHN0b3JlbnRucSA6CitIZXhhZ29uX3Z2NjRpdm1lbXY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtYXNrZWRzdG9yZW50bnEiPjsKKworZGVmIGludF9oZXhhZ29uX1Y2X3ZtYXNrZWRzdG9yZXFfMTI4QiA6CitIZXhhZ29uX3Z2MTI4aXZtZW12MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1hc2tlZHN0b3JlcV8xMjhCIj47CisKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWFza2Vkc3RvcmVucV8xMjhCIDoKK0hleGFnb25fdnYxMjhpdm1lbXYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bWFza2Vkc3RvcmVucV8xMjhCIj47CisKK2RlZiBpbnRfaGV4YWdvbl9WNl92bWFza2Vkc3RvcmVudHFfMTI4QiA6CitIZXhhZ29uX3Z2MTI4aXZtZW12MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1hc2tlZHN0b3JlbnRxXzEyOEIiPjsKKworZGVmIGludF9oZXhhZ29uX1Y2X3ZtYXNrZWRzdG9yZW50bnFfMTI4QiA6CitIZXhhZ29uX3Z2MTI4aXZtZW12MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1hc2tlZHN0b3JlbnRucV8xMjhCIj47CisKK211bHRpY2xhc3MgSGV4YWdvbl9jdXN0b21fY2lyY19sZF9JbnRyaW5zaWM8TExWTVR5cGUgRWxUeT4geworICBkZWYgTkFNRSNfcGNpIDogSGV4YWdvbl9Ob25HQ0NfSW50cmluc2ljPAorICAgIFtFbFR5LCBsbHZtX3B0cl90eV0sCisgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1fcHRyX3R5XSwKKyAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwzPl0+OworICBkZWYgTkFNRSNfcGNyIDogSGV4YWdvbl9Ob25HQ0NfSW50cmluc2ljPAorICAgIFtFbFR5LCBsbHZtX3B0cl90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIGxsdm1fcHRyX3R5XSwKKyAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwyPl0+OworfQorCitkZWZtIGludF9oZXhhZ29uX0wyX2xvYWRydWIgOiBIZXhhZ29uX2N1c3RvbV9jaXJjX2xkX0ludHJpbnNpYzxsbHZtX2kzMl90eT47CitkZWZtIGludF9oZXhhZ29uX0wyX2xvYWRyYiA6IEhleGFnb25fY3VzdG9tX2NpcmNfbGRfSW50cmluc2ljPGxsdm1faTMyX3R5PjsKK2RlZm0gaW50X2hleGFnb25fTDJfbG9hZHJ1aCA6IEhleGFnb25fY3VzdG9tX2NpcmNfbGRfSW50cmluc2ljPGxsdm1faTMyX3R5PjsKK2RlZm0gaW50X2hleGFnb25fTDJfbG9hZHJoIDogSGV4YWdvbl9jdXN0b21fY2lyY19sZF9JbnRyaW5zaWM8bGx2bV9pMzJfdHk+OworZGVmbSBpbnRfaGV4YWdvbl9MMl9sb2FkcmkgOiBIZXhhZ29uX2N1c3RvbV9jaXJjX2xkX0ludHJpbnNpYzxsbHZtX2kzMl90eT47CitkZWZtIGludF9oZXhhZ29uX0wyX2xvYWRyZCA6IEhleGFnb25fY3VzdG9tX2NpcmNfbGRfSW50cmluc2ljPGxsdm1faTY0X3R5PjsKKworbXVsdGljbGFzcyBIZXhhZ29uX2N1c3RvbV9jaXJjX3N0X0ludHJpbnNpYzxMTFZNVHlwZSBFbFR5PiB7CisgIGRlZiBOQU1FI19wY2kgOiBIZXhhZ29uX05vbkdDQ19JbnRyaW5zaWM8CisgICAgW2xsdm1fcHRyX3R5XSwKKyAgICBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgRWxUeSwgbGx2bV9wdHJfdHldLAorICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDQ+XT47CisgIGRlZiBOQU1FI19wY3IgOiBIZXhhZ29uX05vbkdDQ19JbnRyaW5zaWM8CisgICAgW2xsdm1fcHRyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eSwgRWxUeSwgbGx2bV9wdHJfdHldLAorICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDM+XT47Cit9CisKK2RlZm0gaW50X2hleGFnb25fUzJfc3RvcmVyYiA6IEhleGFnb25fY3VzdG9tX2NpcmNfc3RfSW50cmluc2ljPGxsdm1faTMyX3R5PjsKK2RlZm0gaW50X2hleGFnb25fUzJfc3RvcmVyaCA6IEhleGFnb25fY3VzdG9tX2NpcmNfc3RfSW50cmluc2ljPGxsdm1faTMyX3R5PjsKK2RlZm0gaW50X2hleGFnb25fUzJfc3RvcmVyZiA6IEhleGFnb25fY3VzdG9tX2NpcmNfc3RfSW50cmluc2ljPGxsdm1faTMyX3R5PjsKK2RlZm0gaW50X2hleGFnb25fUzJfc3RvcmVyaSA6IEhleGFnb25fY3VzdG9tX2NpcmNfc3RfSW50cmluc2ljPGxsdm1faTMyX3R5PjsKK2RlZm0gaW50X2hleGFnb25fUzJfc3RvcmVyZCA6IEhleGFnb25fY3VzdG9tX2NpcmNfc3RfSW50cmluc2ljPGxsdm1faTY0X3R5PjsKKworLy8gVGhlIGZyb250LWVuZCBlbWl0cyB0aGUgaW50cmluc2ljIGNhbGwgd2l0aCBvbmx5IHR3byBhcmd1bWVudHMuIFRoZSB0aGlyZAorLy8gYXJndW1lbnQgZnJvbSB0aGUgYnVpbHRpbiBpcyBhbHJlYWR5IHVzZWQgYnkgZnJvbnQtZW5kIHRvIHdyaXRlIHRvIG1lbW9yeQorLy8gYnkgZ2VuZXJhdGluZyBhIHN0b3JlLgorY2xhc3MgSGV4YWdvbl9jdXN0b21fYnJldl9sZF9JbnRyaW5zaWM8TExWTVR5cGUgRWxUeT4KKyA6IEhleGFnb25fTm9uR0NDX0ludHJpbnNpYzwKKyAgICBbRWxUeSwgbGx2bV9wdHJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5XSwKKyAgICBbSW50clJlYWRNZW1dPjsKKworZGVmIGludF9oZXhhZ29uX0wyX2xvYWRydWJfcGJyIDogSGV4YWdvbl9jdXN0b21fYnJldl9sZF9JbnRyaW5zaWM8bGx2bV9pMzJfdHk+OworZGVmIGludF9oZXhhZ29uX0wyX2xvYWRyYl9wYnIgOiBIZXhhZ29uX2N1c3RvbV9icmV2X2xkX0ludHJpbnNpYzxsbHZtX2kzMl90eT47CitkZWYgaW50X2hleGFnb25fTDJfbG9hZHJ1aF9wYnIgOiBIZXhhZ29uX2N1c3RvbV9icmV2X2xkX0ludHJpbnNpYzxsbHZtX2kzMl90eT47CitkZWYgaW50X2hleGFnb25fTDJfbG9hZHJoX3BiciA6IEhleGFnb25fY3VzdG9tX2JyZXZfbGRfSW50cmluc2ljPGxsdm1faTMyX3R5PjsKK2RlZiBpbnRfaGV4YWdvbl9MMl9sb2FkcmlfcGJyIDogSGV4YWdvbl9jdXN0b21fYnJldl9sZF9JbnRyaW5zaWM8bGx2bV9pMzJfdHk+OworZGVmIGludF9oZXhhZ29uX0wyX2xvYWRyZF9wYnIgOiBIZXhhZ29uX2N1c3RvbV9icmV2X2xkX0ludHJpbnNpYzxsbHZtX2k2NF90eT47CisKK2RlZiBpbnRfaGV4YWdvbl9TMl9zdG9yZXJiX3BiciA6IEhleGFnb25fbWVtX21lbXNpc2lfSW50cmluc2ljPCJicmV2X3N0YiI+OworZGVmIGludF9oZXhhZ29uX1MyX3N0b3JlcmhfcGJyIDogSGV4YWdvbl9tZW1fbWVtc2lzaV9JbnRyaW5zaWM8ImJyZXZfc3RoIj47CitkZWYgaW50X2hleGFnb25fUzJfc3RvcmVyZl9wYnIgOiBIZXhhZ29uX21lbV9tZW1zaXNpX0ludHJpbnNpYzwiYnJldl9zdGhoaSI+OworZGVmIGludF9oZXhhZ29uX1MyX3N0b3JlcmlfcGJyIDogSGV4YWdvbl9tZW1fbWVtc2lzaV9JbnRyaW5zaWM8ImJyZXZfc3R3Ij47CitkZWYgaW50X2hleGFnb25fUzJfc3RvcmVyZF9wYnIgOiBIZXhhZ29uX21lbV9tZW1kaXNpX0ludHJpbnNpYzwiYnJldl9zdGQiPjsKKworCisvLy8KKy8vLyBIZXhhZ29uVjYyIGludHJpbnNpY3MKKy8vLworCisvLworLy8gSGV4YWdvbl9MTGlMTGlMTGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBNNl92YWJzZGlmZmIKK2NsYXNzIEhleGFnb25fTExpTExpTExpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX0xMaWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBTNl92c3BsYXRyYnAKK2NsYXNzIEhleGFnb25fTExpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTY0X3R5XSwgW2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjUxMnY1MTJpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmxzcmIKK2NsYXNzIEhleGFnb25fVjYyX3Y1MTJ2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjEwMjR2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bHNyYl8xMjhCCitjbGFzcyBIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3Zhc3J3dWhybmRzYXQKK2NsYXNzIEhleGFnb25fVjYyX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YXNyd3Vocm5kc2F0XzEyOEIKK2NsYXNzIEhleGFnb25fVjYyX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3YzMmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3Zyb3VuZHV3dWgKK2NsYXNzIEhleGFnb25fVjYyX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdnJvdW5kdXd1aF8xMjhCCitjbGFzcyBIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3YzMmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3YyMDQ4djIwNDh2MjA0OF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZhZGR1d3NhdF9kdl8xMjhCCitjbGFzcyBIZXhhZ29uX1Y2Ml92MjA0OHYyMDQ4djIwNDhfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y2NGkzMl90eV0sIFtsbHZtX3Y2NGkzMl90eSxsbHZtX3Y2NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3YxMDI0djEwMjR2NTEydjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZhZGRod19hY2MKK2NsYXNzIEhleGFnb25fVjYyX3YxMDI0djEwMjR2NTEydjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjIwNDh2MjA0OHYxMDI0djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YWRkaHdfYWNjXzEyOEIKK2NsYXNzIEhleGFnb25fVjYyX3YyMDQ4djIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NjRpMzJfdHldLCBbbGx2bV92NjRpMzJfdHksbGx2bV92MzJpMzJfdHksbGx2bV92MzJpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2Ml92MTAyNHY1MTJ2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdm1weWV3dWhfNjQKK2NsYXNzIEhleGFnb25fVjYyX3YxMDI0djUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3YyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZtcHlld3VoXzY0XzEyOEIKK2NsYXNzIEhleGFnb25fVjYyX3YyMDQ4djEwMjR2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1fdjMyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjIwNDh2MjA0OGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bXBhdWhiXzEyOEIKK2NsYXNzIEhleGFnb25fVjYyX3YyMDQ4djIwNDhpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NjRpMzJfdHldLCBbbGx2bV92NjRpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2Ml92MjA0OHYyMDQ4djIwNDhpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdm1wYXVoYl9hY2NfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjJfdjIwNDh2MjA0OHYyMDQ4aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjY0aTMyX3R5LGxsdm1fdjY0aTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjUxMnY2NGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFuZG5xcnQKK2NsYXNzIEhleGFnb25fVjYyX3Y1MTJ2NjRpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjUxMmkxX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjEwMjR2MTI4aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YW5kbnFydF8xMjhCCitjbGFzcyBIZXhhZ29uX1Y2Ml92MTAyNHYxMjhpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjEwMjRpMV90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3Y1MTJ2NTEydjY0aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YW5kbnFydF9hY2MKK2NsYXNzIEhleGFnb25fVjYyX3Y1MTJ2NTEydjY0aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSxsbHZtX3Y1MTJpMV90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3YxMDI0djEwMjR2MTI4aWlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YW5kbnFydF9hY2NfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMjhpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1fdjEwMjRpMV90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3Y1MTJ2NjRpdjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZhbmR2cXYKK2NsYXNzIEhleGFnb25fVjYyX3Y1MTJ2NjRpdjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjUxMmkxX3R5LGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjEwMjR2MTI4aXYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFuZHZxdl8xMjhCCitjbGFzcyBIZXhhZ29uX1Y2Ml92MTAyNHYxMjhpdjEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eV0sIFtsbHZtX3YxMDI0aTFfdHksbGx2bV92MzJpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2Ml92NjRpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ByZWRfc2NhbGFyMnYyCitjbGFzcyBIZXhhZ29uX1Y2Ml92NjRpaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjUxMmkxX3R5XSwgW2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjEyOGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfcHJlZF9zY2FsYXIydjJfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjJfdjEyOGlpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTAyNGkxX3R5XSwgW2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjY0aXY2NGl2NjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfc2h1ZmZlcXcKK2NsYXNzIEhleGFnb25fVjYyX3Y2NGl2NjRpdjY0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjUxMmkxX3R5XSwgW2xsdm1fdjUxMmkxX3R5LGxsdm1fdjUxMmkxX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjEyOGl2MTI4aXYxMjhpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfc2h1ZmZlcXdfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjJfdjEyOGl2MTI4aXYxMjhpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTAyNGkxX3R5XSwgW2xsdm1fdjEwMjRpMV90eSxsbHZtX3YxMDI0aTFfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2Ml92NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X2x2c3BsYXRoCitjbGFzcyBIZXhhZ29uX1Y2Ml92NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfbHZzcGxhdGhfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjJfdjEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2Ml92NTEydjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZsdXR2dmJfb3JhY2NpCitjbGFzcyBIZXhhZ29uX1Y2Ml92NTEydjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmx1dHZ2Yl9vcmFjY2lfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MzJpMzJfdHksbGx2bV92MzJpMzJfdHksbGx2bV92MzJpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2Ml92MTAyNHY1MTJ2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZsdXR2d2hpCitjbGFzcyBIZXhhZ29uX1Y2Ml92MTAyNHY1MTJ2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjIwNDh2MTAyNHYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZsdXR2d2hpXzEyOEIKK2NsYXNzIEhleGFnb25fVjYyX3YyMDQ4djEwMjR2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y2NGkzMl90eV0sIFtsbHZtX3YzMmkzMl90eSxsbHZtX3YzMmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjYyX3YxMDI0djEwMjR2NTEydjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bHV0dndoX29yYWNjaQorY2xhc3MgSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHY1MTJ2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjJfdjIwNDh2MjA0OHYxMDI0djEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmx1dHZ3aF9vcmFjY2lfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjJfdjIwNDh2MjA0OHYxMDI0djEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NjRpMzJfdHldLCBbbGx2bV92NjRpMzJfdHksbGx2bV92MzJpMzJfdHksbGx2bV92MzJpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vIEhleGFnb25fdjUxMnY2NGl2NTEydjUxMnY2NGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWc6IFY2X3ZhZGRjYXJyeQorY2xhc3MgSGV4YWdvbl92NTEydjY0aXY1MTJ2NTEydjY0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92NTEyaTFfdHldLCBbbGx2bV92MTZpMzJfdHksbGx2bV92MTZpMzJfdHksbGx2bV92NTEyaTFfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vIEhleGFnb25fdjEwMjR2MTI4aXYxMDI0djEwMjR2MTI4aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZzogVjZfdmFkZGNhcnJ5XzEyOEIKK2NsYXNzIEhleGFnb25fdjEwMjR2MTI4aXYxMDI0djEwMjR2MTI4aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkzMl90eSwgbGx2bV92MTAyNGkxX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1fdjMyaTMyX3R5LGxsdm1fdjEwMjRpMV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uTTZfdmFic2RpZmZiLERJX2Z0eXBlX0RJREksMikKKy8vIHRhZyA6IE02X3ZhYnNkaWZmYgorZGVmIGludF9oZXhhZ29uX002X3ZhYnNkaWZmYiA6CitIZXhhZ29uX0xMaUxMaUxMaV9JbnRyaW5zaWM8IkhFWEFHT05fTTZfdmFic2RpZmZiIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5NNl92YWJzZGlmZnViLERJX2Z0eXBlX0RJREksMikKKy8vIHRhZyA6IE02X3ZhYnNkaWZmdWIKK2RlZiBpbnRfaGV4YWdvbl9NNl92YWJzZGlmZnViIDoKK0hleGFnb25fTExpTExpTExpX0ludHJpbnNpYzwiSEVYQUdPTl9NNl92YWJzZGlmZnViIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5TNl92dHJ1bmVoYl9wcHAsRElfZnR5cGVfRElESSwyKQorLy8gdGFnIDogUzZfdnRydW5laGJfcHBwCitkZWYgaW50X2hleGFnb25fUzZfdnRydW5laGJfcHBwIDoKK0hleGFnb25fTExpTExpTExpX0ludHJpbnNpYzwiSEVYQUdPTl9TNl92dHJ1bmVoYl9wcHAiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlM2X3Z0cnVub2hiX3BwcCxESV9mdHlwZV9ESURJLDIpCisvLyB0YWcgOiBTNl92dHJ1bm9oYl9wcHAKK2RlZiBpbnRfaGV4YWdvbl9TNl92dHJ1bm9oYl9wcHAgOgorSGV4YWdvbl9MTGlMTGlMTGlfSW50cmluc2ljPCJIRVhBR09OX1M2X3Z0cnVub2hiX3BwcCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uUzZfdnNwbGF0cmJwLERJX2Z0eXBlX1NJLDEpCisvLyB0YWcgOiBTNl92c3BsYXRyYnAKK2RlZiBpbnRfaGV4YWdvbl9TNl92c3BsYXRyYnAgOgorSGV4YWdvbl9MTGlpX0ludHJpbnNpYzwiSEVYQUdPTl9TNl92c3BsYXRyYnAiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zsc3JiLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3Zsc3JiCitkZWYgaW50X2hleGFnb25fVjZfdmxzcmIgOgorSGV4YWdvbl9WNjJfdjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bHNyYiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmxzcmJfMTI4QixWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92bHNyYl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmxzcmJfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmxzcmJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcnd1aHJuZHNhdCxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3J3dWhybmRzYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNyd3Vocm5kc2F0IDoKK0hleGFnb25fVjYyX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3J3dWhybmRzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3J3dWhybmRzYXRfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3J3dWhybmRzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3J3dWhybmRzYXRfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNyd3Vocm5kc2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3J1d3Vocm5kc2F0LFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzcnV3dWhybmRzYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNydXd1aHJuZHNhdCA6CitIZXhhZ29uX1Y2Ml92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNydXd1aHJuZHNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcnV3dWhybmRzYXRfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3J1d3Vocm5kc2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNydXd1aHJuZHNhdF8xMjhCIDoKK0hleGFnb25fVjYyX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3J1d3Vocm5kc2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3JoYnNhdCxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3JoYnNhdAorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3JoYnNhdCA6CitIZXhhZ29uX1Y2Ml92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNyaGJzYXQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhc3JoYnNhdF8xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzcmhic2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNyaGJzYXRfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXNyaGJzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJvdW5kdXd1aCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cm91bmR1d3VoCitkZWYgaW50X2hleGFnb25fVjZfdnJvdW5kdXd1aCA6CitIZXhhZ29uX1Y2Ml92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zyb3VuZHV3dWgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zyb3VuZHV3dWhfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92cm91bmR1d3VoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm91bmR1d3VoXzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm91bmR1d3VoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zyb3VuZHVodWIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnJvdW5kdWh1YgorZGVmIGludF9oZXhhZ29uX1Y2X3Zyb3VuZHVodWIgOgorSGV4YWdvbl9WNjJfdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm91bmR1aHViIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm91bmR1aHViXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnJvdW5kdWh1Yl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnJvdW5kdWh1Yl8xMjhCIDoKK0hleGFnb25fVjYyX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJvdW5kdWh1Yl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdXdzYXQsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZHV3c2F0CitkZWYgaW50X2hleGFnb25fVjZfdmFkZHV3c2F0IDoKK0hleGFnb25fVjYyX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHV3c2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdXdzYXRfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWRkdXdzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR1d3NhdF8xMjhCIDoKK0hleGFnb25fVjYyX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHV3c2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGR1d3NhdF9kdixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92YWRkdXdzYXRfZHYKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkdXdzYXRfZHYgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkdXdzYXRfZHYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGR1d3NhdF9kdl8xMjhCLFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZhZGR1d3NhdF9kdl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZHV3c2F0X2R2XzEyOEIgOgorSGV4YWdvbl9WNjJfdjIwNDh2MjA0OHYyMDQ4X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkdXdzYXRfZHZfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YnV3c2F0LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJ1d3NhdAorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ1d3NhdCA6CitIZXhhZ29uX1Y2Ml92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJ1d3NhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YnV3c2F0XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnN1YnV3c2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3VidXdzYXRfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJ1d3NhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3VidXdzYXRfZHYsVkRfZnR5cGVfVkRWRCwyKQorLy8gdGFnIDogVjZfdnN1YnV3c2F0X2R2CitkZWYgaW50X2hleGFnb25fVjZfdnN1YnV3c2F0X2R2IDoKK0hleGFnb25fVjYyX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YnV3c2F0X2R2Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3VidXdzYXRfZHZfMTI4QixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92c3VidXdzYXRfZHZfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ1d3NhdF9kdl8xMjhCIDoKK0hleGFnb25fVjYyX3YyMDQ4djIwNDh2MjA0OF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YnV3c2F0X2R2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRic2F0LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGRic2F0CitkZWYgaW50X2hleGFnb25fVjZfdmFkZGJzYXQgOgorSGV4YWdvbl9WNjJfdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkYnNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGJzYXRfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWRkYnNhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZGJzYXRfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGRic2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRic2F0X2R2LFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZhZGRic2F0X2R2CitkZWYgaW50X2hleGFnb25fVjZfdmFkZGJzYXRfZHYgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkYnNhdF9kdiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGJzYXRfZHZfMTI4QixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92YWRkYnNhdF9kdl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZGJzYXRfZHZfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MjA0OHYyMDQ4djIwNDhfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGRic2F0X2R2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJic2F0LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJic2F0CitkZWYgaW50X2hleGFnb25fVjZfdnN1YmJzYXQgOgorSGV4YWdvbl9WNjJfdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3ViYnNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YmJzYXRfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c3ViYnNhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnN1YmJzYXRfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJic2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJic2F0X2R2LFZEX2Z0eXBlX1ZEVkQsMikKKy8vIHRhZyA6IFY2X3ZzdWJic2F0X2R2CitkZWYgaW50X2hleGFnb25fVjZfdnN1YmJzYXRfZHYgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c3ViYnNhdF9kdiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YmJzYXRfZHZfMTI4QixWRF9mdHlwZV9WRFZELDIpCisvLyB0YWcgOiBWNl92c3ViYnNhdF9kdl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnN1YmJzYXRfZHZfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MjA0OHYyMDQ4djIwNDhfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJic2F0X2R2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGR1YnViYl9zYXQsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZHVidWJiX3NhdAorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR1YnViYl9zYXQgOgorSGV4YWdvbl9WNjJfdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkdWJ1YmJfc2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdWJ1YmJfc2F0XzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmFkZHVidWJiX3NhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZHVidWJiX3NhdF8xMjhCIDoKK0hleGFnb25fVjYyX3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZHVidWJiX3NhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3VidWJ1YmJfc2F0LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJ1YnViYl9zYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92c3VidWJ1YmJfc2F0IDoKK0hleGFnb25fVjYyX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnN1YnVidWJiX3NhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnN1YnVidWJiX3NhdF8xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZzdWJ1YnViYl9zYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJ1YnViYl9zYXRfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzdWJ1YnViYl9zYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGh3X2FjYyxWRF9mdHlwZV9WRFZJVkksMykKKy8vIHRhZyA6IFY2X3ZhZGRod19hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkaHdfYWNjIDoKK0hleGFnb25fVjYyX3YxMDI0djEwMjR2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFkZGh3X2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGh3X2FjY18xMjhCLFZEX2Z0eXBlX1ZEVklWSSwzKQorLy8gdGFnIDogVjZfdmFkZGh3X2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZGh3X2FjY18xMjhCIDoKK0hleGFnb25fVjYyX3YyMDQ4djIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkaHdfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGR1aHdfYWNjLFZEX2Z0eXBlX1ZEVklWSSwzKQorLy8gdGFnIDogVjZfdmFkZHVod19hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkdWh3X2FjYyA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGR1aHdfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdWh3X2FjY18xMjhCLFZEX2Z0eXBlX1ZEVklWSSwzKQorLy8gdGFnIDogVjZfdmFkZHVod19hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR1aHdfYWNjXzEyOEIgOgorSGV4YWdvbl9WNjJfdjIwNDh2MjA0OHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGR1aHdfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGR1YmhfYWNjLFZEX2Z0eXBlX1ZEVklWSSwzKQorLy8gdGFnIDogVjZfdmFkZHViaF9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkdWJoX2FjYyA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGR1YmhfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkdWJoX2FjY18xMjhCLFZEX2Z0eXBlX1ZEVklWSSwzKQorLy8gdGFnIDogVjZfdmFkZHViaF9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhZGR1YmhfYWNjXzEyOEIgOgorSGV4YWdvbl9WNjJfdjIwNDh2MjA0OHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGR1YmhfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlld3VoXzY0LFZEX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZtcHlld3VoXzY0CitkZWYgaW50X2hleGFnb25fVjZfdm1weWV3dWhfNjQgOgorSGV4YWdvbl9WNjJfdjEwMjR2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWV3dWhfNjQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlld3VoXzY0XzEyOEIsVkRfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1weWV3dWhfNjRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlld3VoXzY0XzEyOEIgOgorSGV4YWdvbl9WNjJfdjIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5ZXd1aF82NF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5b3doXzY0X2FjYyxWRF9mdHlwZV9WRFZJVkksMykKKy8vIHRhZyA6IFY2X3ZtcHlvd2hfNjRfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdm1weW93aF82NF9hY2MgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5b3doXzY0X2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weW93aF82NF9hY2NfMTI4QixWRF9mdHlwZV9WRFZJVkksMykKKy8vIHRhZyA6IFY2X3ZtcHlvd2hfNjRfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5b3doXzY0X2FjY18xMjhCIDoKK0hleGFnb25fVjYyX3YyMDQ4djIwNDh2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5b3doXzY0X2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXBhdWhiLFZEX2Z0eXBlX1ZEU0ksMikKKy8vIHRhZyA6IFY2X3ZtcGF1aGIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXBhdWhiIDoKK0hleGFnb25fVjYyX3YxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXBhdWhiIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXBhdWhiXzEyOEIsVkRfZnR5cGVfVkRTSSwyKQorLy8gdGFnIDogVjZfdm1wYXVoYl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1wYXVoYl8xMjhCIDoKK0hleGFnb25fVjYyX3YyMDQ4djIwNDhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXBhdWhiXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcGF1aGJfYWNjLFZEX2Z0eXBlX1ZEVkRTSSwzKQorLy8gdGFnIDogVjZfdm1wYXVoYl9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXBhdWhiX2FjYyA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXBhdWhiX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1wYXVoYl9hY2NfMTI4QixWRF9mdHlwZV9WRFZEU0ksMykKKy8vIHRhZyA6IFY2X3ZtcGF1aGJfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXBhdWhiX2FjY18xMjhCIDoKK0hleGFnb25fVjYyX3YyMDQ4djIwNDh2MjA0OGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcGF1aGJfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHlpd3ViLFZJX2Z0eXBlX1ZJU0ksMikKKy8vIHRhZyA6IFY2X3ZtcHlpd3ViCitkZWYgaW50X2hleGFnb25fVjZfdm1weWl3dWIgOgorSGV4YWdvbl9WNjJfdjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXB5aXd1YiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWl3dWJfMTI4QixWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92bXB5aXd1Yl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weWl3dWJfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWl3dWJfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWl3dWJfYWNjLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdm1weWl3dWJfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdm1weWl3dWJfYWNjIDoKK0hleGFnb25fVjYyX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpd3ViX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWl3dWJfYWNjXzEyOEIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92bXB5aXd1Yl9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHlpd3ViX2FjY18xMjhCIDoKK0hleGFnb25fVjYyX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHlpd3ViX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YW5kbnFydCxWSV9mdHlwZV9RVlNJLDIpCisvLyB0YWcgOiBWNl92YW5kbnFydAorZGVmIGludF9oZXhhZ29uX1Y2X3ZhbmRucXJ0IDoKK0hleGFnb25fVjYyX3Y1MTJ2NjRpaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFuZG5xcnQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhbmRucXJ0XzEyOEIsVklfZnR5cGVfUVZTSSwyKQorLy8gdGFnIDogVjZfdmFuZG5xcnRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhbmRucXJ0XzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTI4aWlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhbmRucXJ0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhbmRucXJ0X2FjYyxWSV9mdHlwZV9WSVFWU0ksMykKKy8vIHRhZyA6IFY2X3ZhbmRucXJ0X2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZhbmRucXJ0X2FjYyA6CitIZXhhZ29uX1Y2Ml92NTEydjUxMnY2NGlpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YW5kbnFydF9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhbmRucXJ0X2FjY18xMjhCLFZJX2Z0eXBlX1ZJUVZTSSwzKQorLy8gdGFnIDogVjZfdmFuZG5xcnRfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YW5kbnFydF9hY2NfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEyOGlpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YW5kbnFydF9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFuZHZxdixWSV9mdHlwZV9RVlZJLDIpCisvLyB0YWcgOiBWNl92YW5kdnF2CitkZWYgaW50X2hleGFnb25fVjZfdmFuZHZxdiA6CitIZXhhZ29uX1Y2Ml92NTEydjY0aXY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhbmR2cXYiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhbmR2cXZfMTI4QixWSV9mdHlwZV9RVlZJLDIpCisvLyB0YWcgOiBWNl92YW5kdnF2XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YW5kdnF2XzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTI4aXYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YW5kdnF2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhbmR2bnF2LFZJX2Z0eXBlX1FWVkksMikKKy8vIHRhZyA6IFY2X3ZhbmR2bnF2CitkZWYgaW50X2hleGFnb25fVjZfdmFuZHZucXYgOgorSGV4YWdvbl9WNjJfdjUxMnY2NGl2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YW5kdm5xdiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFuZHZucXZfMTI4QixWSV9mdHlwZV9RVlZJLDIpCisvLyB0YWcgOiBWNl92YW5kdm5xdl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFuZHZucXZfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMjhpdjEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhbmR2bnF2XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ByZWRfc2NhbGFyMnYyLFFWX2Z0eXBlX1NJLDEpCisvLyB0YWcgOiBWNl9wcmVkX3NjYWxhcjJ2MgorZGVmIGludF9oZXhhZ29uX1Y2X3ByZWRfc2NhbGFyMnYyIDoKK0hleGFnb25fVjYyX3Y2NGlpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl9wcmVkX3NjYWxhcjJ2MiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfcHJlZF9zY2FsYXIydjJfMTI4QixRVl9mdHlwZV9TSSwxKQorLy8gdGFnIDogVjZfcHJlZF9zY2FsYXIydjJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ByZWRfc2NhbGFyMnYyXzEyOEIgOgorSGV4YWdvbl9WNjJfdjEyOGlpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl9wcmVkX3NjYWxhcjJ2Ml8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9zaHVmZmVxdyxRVl9mdHlwZV9RVlFWLDIpCisvLyB0YWcgOiBWNl9zaHVmZmVxdworZGVmIGludF9oZXhhZ29uX1Y2X3NodWZmZXF3IDoKK0hleGFnb25fVjYyX3Y2NGl2NjRpdjY0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfc2h1ZmZlcXciPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3NodWZmZXF3XzEyOEIsUVZfZnR5cGVfUVZRViwyKQorLy8gdGFnIDogVjZfc2h1ZmZlcXdfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3NodWZmZXF3XzEyOEIgOgorSGV4YWdvbl9WNjJfdjEyOGl2MTI4aXYxMjhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl9zaHVmZmVxd18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9zaHVmZmVxaCxRVl9mdHlwZV9RVlFWLDIpCisvLyB0YWcgOiBWNl9zaHVmZmVxaAorZGVmIGludF9oZXhhZ29uX1Y2X3NodWZmZXFoIDoKK0hleGFnb25fVjYyX3Y2NGl2NjRpdjY0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfc2h1ZmZlcWgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3NodWZmZXFoXzEyOEIsUVZfZnR5cGVfUVZRViwyKQorLy8gdGFnIDogVjZfc2h1ZmZlcWhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3NodWZmZXFoXzEyOEIgOgorSGV4YWdvbl9WNjJfdjEyOGl2MTI4aXYxMjhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl9zaHVmZmVxaF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bWF4YixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bWF4YgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtYXhiIDoKK0hleGFnb25fVjYyX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1heGIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtYXhiXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1heGJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtYXhiXzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bWF4Yl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bWluYixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bWluYgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtaW5iIDoKK0hleGFnb25fVjYyX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1pbmIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtaW5iXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm1pbmJfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtaW5iXzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bWluYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2F0dXd1aCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92c2F0dXd1aAorZGVmIGludF9oZXhhZ29uX1Y2X3ZzYXR1d3VoIDoKK0hleGFnb25fVjYyX3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNhdHV3dWgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzYXR1d3VoXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdnNhdHV3dWhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzYXR1d3VoXzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2F0dXd1aF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9sdnNwbGF0aCxWSV9mdHlwZV9TSSwxKQorLy8gdGFnIDogVjZfbHZzcGxhdGgKK2RlZiBpbnRfaGV4YWdvbl9WNl9sdnNwbGF0aCA6CitIZXhhZ29uX1Y2Ml92NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfbHZzcGxhdGgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X2x2c3BsYXRoXzEyOEIsVklfZnR5cGVfU0ksMSkKKy8vIHRhZyA6IFY2X2x2c3BsYXRoXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl9sdnNwbGF0aF8xMjhCIDoKK0hleGFnb25fVjYyX3YxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfbHZzcGxhdGhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfbHZzcGxhdGIsVklfZnR5cGVfU0ksMSkKKy8vIHRhZyA6IFY2X2x2c3BsYXRiCitkZWYgaW50X2hleGFnb25fVjZfbHZzcGxhdGIgOgorSGV4YWdvbl9WNjJfdjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X2x2c3BsYXRiIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl9sdnNwbGF0Yl8xMjhCLFZJX2Z0eXBlX1NJLDEpCisvLyB0YWcgOiBWNl9sdnNwbGF0Yl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfbHZzcGxhdGJfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X2x2c3BsYXRiXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRjbGJ3LFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGRjbGJ3CitkZWYgaW50X2hleGFnb25fVjZfdmFkZGNsYncgOgorSGV4YWdvbl9WNjJfdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkY2xidyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGNsYndfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWRkY2xid18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZGNsYndfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGRjbGJ3XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhZGRjbGJoLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3ZhZGRjbGJoCitkZWYgaW50X2hleGFnb25fVjZfdmFkZGNsYmggOgorSGV4YWdvbl9WNjJfdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWRkY2xiaCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGNsYmhfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YWRkY2xiaF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFkZGNsYmhfMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhZGRjbGJoXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZsdXR2dmJpLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmx1dHZ2YmkKK2RlZiBpbnRfaGV4YWdvbl9WNl92bHV0dnZiaSA6CitIZXhhZ29uX1Y2Ml92NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bHV0dnZiaSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmx1dHZ2YmlfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZsdXR2dmJpXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bHV0dnZiaV8xMjhCIDoKK0hleGFnb25fVjYyX3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZsdXR2dmJpXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZsdXR2dmJfb3JhY2NpLFZJX2Z0eXBlX1ZJVklWSVNJLDQpCisvLyB0YWcgOiBWNl92bHV0dnZiX29yYWNjaQorZGVmIGludF9oZXhhZ29uX1Y2X3ZsdXR2dmJfb3JhY2NpIDoKK0hleGFnb25fVjYyX3Y1MTJ2NTEydjUxMnY1MTJpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bHV0dnZiX29yYWNjaSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmx1dHZ2Yl9vcmFjY2lfMTI4QixWSV9mdHlwZV9WSVZJVklTSSw0KQorLy8gdGFnIDogVjZfdmx1dHZ2Yl9vcmFjY2lfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZsdXR2dmJfb3JhY2NpXzEyOEIgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bHV0dnZiX29yYWNjaV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bHV0dndoaSxWRF9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZsdXR2d2hpCitkZWYgaW50X2hleGFnb25fVjZfdmx1dHZ3aGkgOgorSGV4YWdvbl9WNjJfdjEwMjR2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZsdXR2d2hpIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bHV0dndoaV8xMjhCLFZEX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmx1dHZ3aGlfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZsdXR2d2hpXzEyOEIgOgorSGV4YWdvbl9WNjJfdjIwNDh2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmx1dHZ3aGlfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmx1dHZ3aF9vcmFjY2ksVkRfZnR5cGVfVkRWSVZJU0ksNCkKKy8vIHRhZyA6IFY2X3ZsdXR2d2hfb3JhY2NpCitkZWYgaW50X2hleGFnb25fVjZfdmx1dHZ3aF9vcmFjY2kgOgorSGV4YWdvbl9WNjJfdjEwMjR2MTAyNHY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmx1dHZ3aF9vcmFjY2kiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZsdXR2d2hfb3JhY2NpXzEyOEIsVkRfZnR5cGVfVkRWSVZJU0ksNCkKKy8vIHRhZyA6IFY2X3ZsdXR2d2hfb3JhY2NpXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bHV0dndoX29yYWNjaV8xMjhCIDoKK0hleGFnb25fVjYyX3YyMDQ4djIwNDh2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmx1dHZ3aF9vcmFjY2lfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmx1dHZ2Yl9ubSxWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZsdXR2dmJfbm0KK2RlZiBpbnRfaGV4YWdvbl9WNl92bHV0dnZiX25tIDoKK0hleGFnb25fVjYyX3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZsdXR2dmJfbm0iPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZsdXR2dmJfbm1fMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3ZsdXR2dmJfbm1fMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZsdXR2dmJfbm1fMTI4QiA6CitIZXhhZ29uX1Y2Ml92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bHV0dnZiX25tXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZsdXR2d2hfbm0sVkRfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92bHV0dndoX25tCitkZWYgaW50X2hleGFnb25fVjZfdmx1dHZ3aF9ubSA6CitIZXhhZ29uX1Y2Ml92MTAyNHY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmx1dHZ3aF9ubSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmx1dHZ3aF9ubV8xMjhCLFZEX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmx1dHZ3aF9ubV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmx1dHZ3aF9ubV8xMjhCIDoKK0hleGFnb25fVjYyX3YyMDQ4djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZsdXR2d2hfbm1fMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFkZGNhcnJ5LFZJX2Z0eXBlX1ZJVklRViwzKQorLy8gdGFnOiBWNl92YWRkY2FycnkKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkY2FycnkgOgorSGV4YWdvbl92NTEydjY0aXY1MTJ2NTEydjY0aV9JbnRyaW5zaWM8IkhFWEFHT05fdjZfdmFkZGNhcnJ5Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YWRkY2FycnlfMTI4QixWSV9mdHlwZV9WSVZJUVYsMykKKy8vIHRhZzogVjZfdmFkZGNhcnJ5XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWRkY2FycnlfMTI4QiA6CitIZXhhZ29uX3YxMDI0djEyOGl2MTAyNHYxMDI0djEyOGlfSW50cmluc2ljPCJIRVhBR09OX3Y2X3ZhZGRjYXJyeV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c3ViY2FycnksVklfZnR5cGVfVklWSVFWLDMpCisvLyB0YWc6IFY2X3ZzdWJjYXJyeQorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJjYXJyeSA6CitIZXhhZ29uX3Y1MTJ2NjRpdjUxMnY1MTJ2NjRpX0ludHJpbnNpYzwiSEVYQUdPTl92Nl92c3ViY2FycnkiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzdWJjYXJyeV8xMjhCLFZJX2Z0eXBlX1ZJVklRViwzKQorLy8gdGFnOiBWNl92c3ViY2FycnlfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzdWJjYXJyeV8xMjhCIDoKK0hleGFnb25fdjEwMjR2MTI4aXYxMDI0djEwMjR2MTI4aV9JbnRyaW5zaWM8IkhFWEFHT05fdjZfdnN1YmNhcnJ5XzEyOEIiPjsKKworCisvLy8KKy8vLyBIZXhhZ29uVjY1IGludHJpbnNpY3MKKy8vLworCisvLworLy8gSGV4YWdvbl9WNjVfaUxMaUxMaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IEE2X3ZjbXBiZXFfbm90YW55CitjbGFzcyBIZXhhZ29uX1Y2NV9pTExpTExpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMzJfdHldLCBbbGx2bV9pNjRfdHksbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2NV92MTAyNHY1MTJMTGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92cm1weXViX3J0dAorY2xhc3MgSGV4YWdvbl9WNjVfdjEwMjR2NTEyTExpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2NV92MjA0OHYxMDI0TExpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdnJtcHl1Yl9ydHRfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjVfdjIwNDh2MTAyNExMaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjVfdjEwMjR2MTAyNHY1MTJMTGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92cm1weXViX3J0dF9hY2MKK2NsYXNzIEhleGFnb25fVjY1X3YxMDI0djEwMjR2NTEyTExpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MzJpMzJfdHksbGx2bV92MTZpMzJfdHksbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2NV92MjA0OHYyMDQ4djEwMjRMTGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92cm1weXViX3J0dF9hY2NfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjVfdjIwNDh2MjA0OHYxMDI0TExpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NjRpMzJfdHldLCBbbGx2bV92NjRpMzJfdHksbGx2bV92MzJpMzJfdHksbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2NV92NTEydjUxMnY1MTJpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmFzcnV3dWhzYXQKK2NsYXNzIEhleGFnb25fVjY1X3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSxsbHZtX3YxNmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjY1X3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YXNydXd1aHNhdF8xMjhCCitjbGFzcyBIZXhhZ29uX1Y2NV92MTAyNHYxMDI0djEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MzJpMzJfdHksbGx2bV92MzJpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2NV92NTEydjUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YXZndXcKK2NsYXNzIEhleGFnb25fVjY1X3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjVfdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdmF2Z3V3XzEyOEIKK2NsYXNzIEhleGFnb25fVjY1X3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1fdjMyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjVfdjUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YWJzYgorY2xhc3MgSGV4YWdvbl9WNjVfdjUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjY1X3YxMDI0djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92YWJzYl8xMjhCCitjbGFzcyBIZXhhZ29uX1Y2NV92MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MzJpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2NV92MTAyNHYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZtcGFidXUKK2NsYXNzIEhleGFnb25fVjY1X3YxMDI0djEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MzJpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2NV92MjA0OHYyMDQ4aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZtcGFidXVfMTI4QgorY2xhc3MgSGV4YWdvbl9WNjVfdjIwNDh2MjA0OGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y2NGkzMl90eV0sIFtsbHZtX3Y2NGkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjY1X3YyMDQ4djIwNDh2MjA0OGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bXBhYnV1X2FjY18xMjhCCitjbGFzcyBIZXhhZ29uX1Y2NV92MjA0OHYyMDQ4djIwNDhpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NjRpMzJfdHldLCBbbGx2bV92NjRpMzJfdHksbGx2bV92NjRpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2NV92MTAyNHYxMDI0djUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bXB5aF9hY2MKK2NsYXNzIEhleGFnb25fVjY1X3YxMDI0djEwMjR2NTEyaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjVfdjIwNDh2MjA0OHYxMDI0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZtcHloX2FjY18xMjhCCitjbGFzcyBIZXhhZ29uX1Y2NV92MjA0OHYyMDQ4djEwMjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NjRpMzJfdHldLCBbbGx2bV92NjRpMzJfdHksbGx2bV92MzJpMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2NV92NTEydjUxMnY1MTJMTGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bXBhaGhzYXQKK2NsYXNzIEhleGFnb25fVjY1X3Y1MTJ2NTEydjUxMkxMaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LGxsdm1fdjE2aTMyX3R5LGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjVfdjEwMjR2MTAyNHYxMDI0TExpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdm1wYWhoc2F0XzEyOEIKK2NsYXNzIEhleGFnb25fVjY1X3YxMDI0djEwMjR2MTAyNExMaV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTMyX3R5XSwgW2xsdm1fdjMyaTMyX3R5LGxsdm1fdjMyaTMyX3R5LGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjVfdjUxMnY1MTJMTGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bHV0NAorY2xhc3MgSGV4YWdvbl9WNjVfdjUxMnY1MTJMTGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSxsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjY1X3YxMDI0djEwMjRMTGlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bHV0NF8xMjhCCitjbGFzcyBIZXhhZ29uX1Y2NV92MTAyNHYxMDI0TExpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MzJpMzJfdHksbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vCisvLyBIZXhhZ29uX1Y2NV92NTEydjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisvLyB0YWcgOiBWNl92bXB5dWhlCitjbGFzcyBIZXhhZ29uX1Y2NV92NTEydjUxMmlfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSxsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEhleGFnb25fVjY1X3Y1MTJ2NjRpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorLy8gdGFnIDogVjZfdnByZWZpeHFiCitjbGFzcyBIZXhhZ29uX1Y2NV92NTEydjY0aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjUxMmkxX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gSGV4YWdvbl9WNjVfdjEwMjR2MTI4aV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKy8vIHRhZyA6IFY2X3ZwcmVmaXhxYl8xMjhCCitjbGFzcyBIZXhhZ29uX1Y2NV92MTAyNHYxMjhpX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMzJfdHldLCBbbGx2bV92MTAyNGkxX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTZfdmNtcGJlcV9ub3RhbnksUUlfZnR5cGVfRElESSwyKQorLy8gdGFnIDogQTZfdmNtcGJlcV9ub3RhbnkKK2RlZiBpbnRfaGV4YWdvbl9BNl92Y21wYmVxX25vdGFueSA6CitIZXhhZ29uX1Y2NV9pTExpTExpX0ludHJpbnNpYzwiSEVYQUdPTl9BNl92Y21wYmVxX25vdGFueSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uQTZfdmNtcGJlcV9ub3RhbnlfMTI4QixRSV9mdHlwZV9ESURJLDIpCisvLyB0YWcgOiBBNl92Y21wYmVxX25vdGFueV8xMjhCCitkZWYgaW50X2hleGFnb25fQTZfdmNtcGJlcV9ub3RhbnlfMTI4QiA6CitIZXhhZ29uX1Y2NV9pTExpTExpX0ludHJpbnNpYzwiSEVYQUdPTl9BNl92Y21wYmVxX25vdGFueV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weXViX3J0dCxWRF9mdHlwZV9WSURJLDIpCisvLyB0YWcgOiBWNl92cm1weXViX3J0dAorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5dWJfcnR0IDoKK0hleGFnb25fVjY1X3YxMDI0djUxMkxMaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJtcHl1Yl9ydHQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5dWJfcnR0XzEyOEIsVkRfZnR5cGVfVklESSwyKQorLy8gdGFnIDogVjZfdnJtcHl1Yl9ydHRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5dWJfcnR0XzEyOEIgOgorSGV4YWdvbl9WNjVfdjIwNDh2MTAyNExMaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJtcHl1Yl9ydHRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnJtcHl1Yl9ydHRfYWNjLFZEX2Z0eXBlX1ZEVklESSwzKQorLy8gdGFnIDogVjZfdnJtcHl1Yl9ydHRfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdnJtcHl1Yl9ydHRfYWNjIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjR2NTEyTExpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cm1weXViX3J0dF9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5dWJfcnR0X2FjY18xMjhCLFZEX2Z0eXBlX1ZEVklESSwzKQorLy8gdGFnIDogVjZfdnJtcHl1Yl9ydHRfYWNjXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cm1weXViX3J0dF9hY2NfMTI4QiA6CitIZXhhZ29uX1Y2NV92MjA0OHYyMDQ4djEwMjRMTGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5dWJfcnR0X2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weWJ1Yl9ydHQsVkRfZnR5cGVfVklESSwyKQorLy8gdGFnIDogVjZfdnJtcHlidWJfcnR0CitkZWYgaW50X2hleGFnb25fVjZfdnJtcHlidWJfcnR0IDoKK0hleGFnb25fVjY1X3YxMDI0djUxMkxMaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnJtcHlidWJfcnR0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weWJ1Yl9ydHRfMTI4QixWRF9mdHlwZV9WSURJLDIpCisvLyB0YWcgOiBWNl92cm1weWJ1Yl9ydHRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5YnViX3J0dF8xMjhCIDoKK0hleGFnb25fVjY1X3YyMDQ4djEwMjRMTGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5YnViX3J0dF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cm1weWJ1Yl9ydHRfYWNjLFZEX2Z0eXBlX1ZEVklESSwzKQorLy8gdGFnIDogVjZfdnJtcHlidWJfcnR0X2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5YnViX3J0dF9hY2MgOgorSGV4YWdvbl9WNjVfdjEwMjR2MTAyNHY1MTJMTGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5YnViX3J0dF9hY2MiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZybXB5YnViX3J0dF9hY2NfMTI4QixWRF9mdHlwZV9WRFZJREksMykKKy8vIHRhZyA6IFY2X3ZybXB5YnViX3J0dF9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZybXB5YnViX3J0dF9hY2NfMTI4QiA6CitIZXhhZ29uX1Y2NV92MjA0OHYyMDQ4djEwMjRMTGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZybXB5YnViX3J0dF9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcnV3dWhzYXQsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YXNydXd1aHNhdAorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3J1d3Voc2F0IDoKK0hleGFnb25fVjY1X3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3J1d3Voc2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNydXd1aHNhdF8xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzcnV3dWhzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3J1d3Voc2F0XzEyOEIgOgorSGV4YWdvbl9WNjVfdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcnV3dWhzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcnVodWJzYXQsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YXNydWh1YnNhdAorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3J1aHVic2F0IDoKK0hleGFnb25fVjY1X3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3J1aHVic2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNydWh1YnNhdF8xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzcnVodWJzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3J1aHVic2F0XzEyOEIgOgorSGV4YWdvbl9WNjVfdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcnVodWJzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzcnVodWJybmRzYXQsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YXNydWh1YnJuZHNhdAorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3J1aHVicm5kc2F0IDoKK0hleGFnb25fVjY1X3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc3J1aHVicm5kc2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNydWh1YnJuZHNhdF8xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzcnVodWJybmRzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc3J1aHVicm5kc2F0XzEyOEIgOgorSGV4YWdvbl9WNjVfdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcnVodWJybmRzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzbGhfYWNjLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdmFzbGhfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdmFzbGhfYWNjIDoKK0hleGFnb25fVjY1X3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc2xoX2FjYyI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFzbGhfYWNjXzEyOEIsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YXNsaF9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhc2xoX2FjY18xMjhCIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhc2xoX2FjY18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNyaF9hY2MsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92YXNyaF9hY2MKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXNyaF9hY2MgOgorSGV4YWdvbl9WNjVfdjUxMnY1MTJ2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcmhfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXNyaF9hY2NfMTI4QixWSV9mdHlwZV9WSVZJU0ksMykKKy8vIHRhZyA6IFY2X3Zhc3JoX2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFzcmhfYWNjXzEyOEIgOgorSGV4YWdvbl9WNjVfdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFzcmhfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhdmd1dyxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXZndXcKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXZndXcgOgorSGV4YWdvbl9WNjVfdjUxMnY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXZndXciPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhdmd1d18xMjhCLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zhdmd1d18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmF2Z3V3XzEyOEIgOgorSGV4YWdvbl9WNjVfdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXZndXdfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmF2Z3V3cm5kLFZJX2Z0eXBlX1ZJVkksMikKKy8vIHRhZyA6IFY2X3Zhdmd1d3JuZAorZGVmIGludF9oZXhhZ29uX1Y2X3Zhdmd1d3JuZCA6CitIZXhhZ29uX1Y2NV92NTEydjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhdmd1d3JuZCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmF2Z3V3cm5kXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmF2Z3V3cm5kXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92YXZndXdybmRfMTI4QiA6CitIZXhhZ29uX1Y2NV92MTAyNHYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3Zhdmd1d3JuZF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXZnYixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXZnYgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhdmdiIDoKK0hleGFnb25fVjY1X3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmF2Z2IiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhdmdiXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmF2Z2JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhdmdiXzEyOEIgOgorSGV4YWdvbl9WNjVfdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXZnYl8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92YXZnYnJuZCxWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92YXZnYnJuZAorZGVmIGludF9oZXhhZ29uX1Y2X3Zhdmdicm5kIDoKK0hleGFnb25fVjY1X3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmF2Z2JybmQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3Zhdmdicm5kXzEyOEIsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdmF2Z2JybmRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3Zhdmdicm5kXzEyOEIgOgorSGV4YWdvbl9WNjVfdjEwMjR2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YXZnYnJuZF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bmF2Z2IsVklfZnR5cGVfVklWSSwyKQorLy8gdGFnIDogVjZfdm5hdmdiCitkZWYgaW50X2hleGFnb25fVjZfdm5hdmdiIDoKK0hleGFnb25fVjY1X3Y1MTJ2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm5hdmdiIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bmF2Z2JfMTI4QixWSV9mdHlwZV9WSVZJLDIpCisvLyB0YWcgOiBWNl92bmF2Z2JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZuYXZnYl8xMjhCIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm5hdmdiXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZhYnNiLFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92YWJzYgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhYnNiIDoKK0hleGFnb25fVjY1X3Y1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92YWJzYiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFic2JfMTI4QixWSV9mdHlwZV9WSSwxKQorLy8gdGFnIDogVjZfdmFic2JfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZhYnNiXzEyOEIgOgorSGV4YWdvbl9WNjVfdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFic2JfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFic2Jfc2F0LFZJX2Z0eXBlX1ZJLDEpCisvLyB0YWcgOiBWNl92YWJzYl9zYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92YWJzYl9zYXQgOgorSGV4YWdvbl9WNjVfdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZhYnNiX3NhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmFic2Jfc2F0XzEyOEIsVklfZnR5cGVfVkksMSkKKy8vIHRhZyA6IFY2X3ZhYnNiX3NhdF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdmFic2Jfc2F0XzEyOEIgOgorSGV4YWdvbl9WNjVfdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmFic2Jfc2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcGFidXUsVkRfZnR5cGVfVkRTSSwyKQorLy8gdGFnIDogVjZfdm1wYWJ1dQorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcGFidXUgOgorSGV4YWdvbl9WNjVfdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcGFidXUiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcGFidXVfMTI4QixWRF9mdHlwZV9WRFNJLDIpCisvLyB0YWcgOiBWNl92bXBhYnV1XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXBhYnV1XzEyOEIgOgorSGV4YWdvbl9WNjVfdjIwNDh2MjA0OGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcGFidXVfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1wYWJ1dV9hY2MsVkRfZnR5cGVfVkRWRFNJLDMpCisvLyB0YWcgOiBWNl92bXBhYnV1X2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcGFidXVfYWNjIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcGFidXVfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXBhYnV1X2FjY18xMjhCLFZEX2Z0eXBlX1ZEVkRTSSwzKQorLy8gdGFnIDogVjZfdm1wYWJ1dV9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcGFidXVfYWNjXzEyOEIgOgorSGV4YWdvbl9WNjVfdjIwNDh2MjA0OHYyMDQ4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1wYWJ1dV9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weWhfYWNjLFZEX2Z0eXBlX1ZEVklTSSwzKQorLy8gdGFnIDogVjZfdm1weWhfYWNjCitkZWYgaW50X2hleGFnb25fVjZfdm1weWhfYWNjIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjR2NTEyaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWhfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5aF9hY2NfMTI4QixWRF9mdHlwZV9WRFZJU0ksMykKKy8vIHRhZyA6IFY2X3ZtcHloX2FjY18xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdm1weWhfYWNjXzEyOEIgOgorSGV4YWdvbl9WNjVfdjIwNDh2MjA0OHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weWhfYWNjXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcGFoaHNhdCxWSV9mdHlwZV9WSVZJREksMykKKy8vIHRhZyA6IFY2X3ZtcGFoaHNhdAorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcGFoaHNhdCA6CitIZXhhZ29uX1Y2NV92NTEydjUxMnY1MTJMTGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcGFoaHNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1wYWhoc2F0XzEyOEIsVklfZnR5cGVfVklWSURJLDMpCisvLyB0YWcgOiBWNl92bXBhaGhzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcGFoaHNhdF8xMjhCIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjR2MTAyNExMaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1wYWhoc2F0XzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcGF1aHVoc2F0LFZJX2Z0eXBlX1ZJVklESSwzKQorLy8gdGFnIDogVjZfdm1wYXVodWhzYXQKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXBhdWh1aHNhdCA6CitIZXhhZ29uX1Y2NV92NTEydjUxMnY1MTJMTGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcGF1aHVoc2F0Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXBhdWh1aHNhdF8xMjhCLFZJX2Z0eXBlX1ZJVklESSwzKQorLy8gdGFnIDogVjZfdm1wYXVodWhzYXRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcGF1aHVoc2F0XzEyOEIgOgorSGV4YWdvbl9WNjVfdjEwMjR2MTAyNHYxMDI0TExpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXBhdWh1aHNhdF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXBzdWh1aHNhdCxWSV9mdHlwZV9WSVZJREksMykKKy8vIHRhZyA6IFY2X3ZtcHN1aHVoc2F0CitkZWYgaW50X2hleGFnb25fVjZfdm1wc3VodWhzYXQgOgorSGV4YWdvbl9WNjVfdjUxMnY1MTJ2NTEyTExpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92bXBzdWh1aHNhdCI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1wc3VodWhzYXRfMTI4QixWSV9mdHlwZV9WSVZJREksMykKKy8vIHRhZyA6IFY2X3ZtcHN1aHVoc2F0XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXBzdWh1aHNhdF8xMjhCIDoKK0hleGFnb25fVjY1X3YxMDI0djEwMjR2MTAyNExMaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1wc3VodWhzYXRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdmx1dDQsVklfZnR5cGVfVklESSwyKQorLy8gdGFnIDogVjZfdmx1dDQKK2RlZiBpbnRfaGV4YWdvbl9WNl92bHV0NCA6CitIZXhhZ29uX1Y2NV92NTEydjUxMkxMaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmx1dDQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZsdXQ0XzEyOEIsVklfZnR5cGVfVklESSwyKQorLy8gdGFnIDogVjZfdmx1dDRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZsdXQ0XzEyOEIgOgorSGV4YWdvbl9WNjVfdjEwMjR2MTAyNExMaV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmx1dDRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weXVoZSxWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92bXB5dWhlCitkZWYgaW50X2hleGFnb25fVjZfdm1weXVoZSA6CitIZXhhZ29uX1Y2NV92NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHl1aGUiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZtcHl1aGVfMTI4QixWSV9mdHlwZV9WSVNJLDIpCisvLyB0YWcgOiBWNl92bXB5dWhlXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92bXB5dWhlXzEyOEIgOgorSGV4YWdvbl9WNjVfdjEwMjR2MTAyNGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHl1aGVfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdm1weXVoZV9hY2MsVklfZnR5cGVfVklWSVNJLDMpCisvLyB0YWcgOiBWNl92bXB5dWhlX2FjYworZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHl1aGVfYWNjIDoKK0hleGFnb25fVjY1X3Y1MTJ2NTEydjUxMmlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZtcHl1aGVfYWNjIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92bXB5dWhlX2FjY18xMjhCLFZJX2Z0eXBlX1ZJVklTSSwzKQorLy8gdGFnIDogVjZfdm1weXVoZV9hY2NfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZtcHl1aGVfYWNjXzEyOEIgOgorSGV4YWdvbl9WNjVfdjEwMjR2MTAyNHYxMDI0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdm1weXVoZV9hY2NfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnByZWZpeHFiLFZJX2Z0eXBlX1FWLDEpCisvLyB0YWcgOiBWNl92cHJlZml4cWIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cHJlZml4cWIgOgorSGV4YWdvbl9WNjVfdjUxMnY2NGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZwcmVmaXhxYiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnByZWZpeHFiXzEyOEIsVklfZnR5cGVfUVYsMSkKKy8vIHRhZyA6IFY2X3ZwcmVmaXhxYl8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnByZWZpeHFiXzEyOEIgOgorSGV4YWdvbl9WNjVfdjEwMjR2MTI4aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnByZWZpeHFiXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZwcmVmaXhxaCxWSV9mdHlwZV9RViwxKQorLy8gdGFnIDogVjZfdnByZWZpeHFoCitkZWYgaW50X2hleGFnb25fVjZfdnByZWZpeHFoIDoKK0hleGFnb25fVjY1X3Y1MTJ2NjRpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cHJlZml4cWgiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZwcmVmaXhxaF8xMjhCLFZJX2Z0eXBlX1FWLDEpCisvLyB0YWcgOiBWNl92cHJlZml4cWhfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZwcmVmaXhxaF8xMjhCIDoKK0hleGFnb25fVjY1X3YxMDI0djEyOGlfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZwcmVmaXhxaF8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cHJlZml4cXcsVklfZnR5cGVfUVYsMSkKKy8vIHRhZyA6IFY2X3ZwcmVmaXhxdworZGVmIGludF9oZXhhZ29uX1Y2X3ZwcmVmaXhxdyA6CitIZXhhZ29uX1Y2NV92NTEydjY0aV9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnByZWZpeHF3Ij47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92cHJlZml4cXdfMTI4QixWSV9mdHlwZV9RViwxKQorLy8gdGFnIDogVjZfdnByZWZpeHF3XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92cHJlZml4cXdfMTI4QiA6CitIZXhhZ29uX1Y2NV92MTAyNHYxMjhpX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92cHJlZml4cXdfMTI4QiI+OworCisKKy8vIFRoZSBzY2F0dGVyL2dhdGhlciBvbmVzIGJlbG93IHdpbGwgbm90IGJlIGdlbmVyYXRlZCBmcm9tIGlzZXQucHkuIE1ha2Ugc3VyZQorLy8geW91IGRvbid0IG92ZXJ3cml0ZSB0aGVzZS4KK2NsYXNzIEhleGFnb25fVjY1X3Z2bWVtaWl2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgW2xsdm1fcHRyX3R5LGxsdm1faTMyX3R5LGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKK2NsYXNzIEhleGFnb25fVjY1X3Z2bWVtaWl2MTAyNF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW10sIFtsbHZtX3B0cl90eSxsbHZtX2kzMl90eSxsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCitjbGFzcyBIZXhhZ29uX1Y2NV92dm1lbWlpdjIwNDhfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtdLCBbbGx2bV9wdHJfdHksbGx2bV9pMzJfdHksbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKworY2xhc3MgSGV4YWdvbl9WNjVfdnZtZW12NjRpaWl2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgW2xsdm1fcHRyX3R5LGxsdm1fdjUxMmkxX3R5LGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKK2NsYXNzIEhleGFnb25fVjY1X3Z2bWVtdjEyOGlpaXYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgW2xsdm1fcHRyX3R5LGxsdm1fdjEwMjRpMV90eSxsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSxsbHZtX3YzMmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCitjbGFzcyBIZXhhZ29uX1Y2NV92dm1lbXY2NGlpaXYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgW2xsdm1fcHRyX3R5LGxsdm1fdjUxMmkxX3R5LGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LGxsdm1fdjMyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKK2NsYXNzIEhleGFnb25fVjY1X3Z2bWVtdjEyOGlpaXYyMDQ4X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgW2xsdm1fcHRyX3R5LGxsdm1fdjEwMjRpMV90eSxsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSxsbHZtX3Y2NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCitkZWYgaW50X2hleGFnb25fVjZfdmdhdGhlcm13IDoKK0hleGFnb25fVjY1X3Z2bWVtaWl2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z2F0aGVybXciPjsKKworZGVmIGludF9oZXhhZ29uX1Y2X3ZnYXRoZXJtd18xMjhCIDoKK0hleGFnb25fVjY1X3Z2bWVtaWl2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmdhdGhlcm13XzEyOEIiPjsKKworZGVmIGludF9oZXhhZ29uX1Y2X3ZnYXRoZXJtaCA6CitIZXhhZ29uX1Y2NV92dm1lbWlpdjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmdhdGhlcm1oIj47CisKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z2F0aGVybWhfMTI4QiA6CitIZXhhZ29uX1Y2NV92dm1lbWlpdjEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZnYXRoZXJtaF8xMjhCIj47CisKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z2F0aGVybWh3IDoKK0hleGFnb25fVjY1X3Z2bWVtaWl2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmdhdGhlcm1odyI+OworCitkZWYgaW50X2hleGFnb25fVjZfdmdhdGhlcm1od18xMjhCIDoKK0hleGFnb25fVjY1X3Z2bWVtaWl2MjA0OF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmdhdGhlcm1od18xMjhCIj47CisKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z2F0aGVybXdxIDoKK0hleGFnb25fVjY1X3Z2bWVtdjY0aWlpdjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmdhdGhlcm13cSI+OworCitkZWYgaW50X2hleGFnb25fVjZfdmdhdGhlcm13cV8xMjhCIDoKK0hleGFnb25fVjY1X3Z2bWVtdjEyOGlpaXYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z2F0aGVybXdxXzEyOEIiPjsKKworZGVmIGludF9oZXhhZ29uX1Y2X3ZnYXRoZXJtaHEgOgorSGV4YWdvbl9WNjVfdnZtZW12NjRpaWl2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92Z2F0aGVybWhxIj47CisKK2RlZiBpbnRfaGV4YWdvbl9WNl92Z2F0aGVybWhxXzEyOEIgOgorSGV4YWdvbl9WNjVfdnZtZW12MTI4aWlpdjEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZnYXRoZXJtaHFfMTI4QiI+OworCitkZWYgaW50X2hleGFnb25fVjZfdmdhdGhlcm1od3EgOgorSGV4YWdvbl9WNjVfdnZtZW12NjRpaWl2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdmdhdGhlcm1od3EiPjsKKworZGVmIGludF9oZXhhZ29uX1Y2X3ZnYXRoZXJtaHdxXzEyOEIgOgorSGV4YWdvbl9WNjVfdnZtZW12MTI4aWlpdjIwNDhfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZnYXRoZXJtaHdxXzEyOEIiPjsKKworY2xhc3MgSGV4YWdvbl9WNjVfdmlpdjUxMnY1MTJfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtdLCBbbGx2bV9pMzJfdHksbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMzJfdHksbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50cldyaXRlTWVtXT47CisKK2NsYXNzIEhleGFnb25fVjY1X3ZpaXYxMDI0djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtdLCBbbGx2bV9pMzJfdHksbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MzJpMzJfdHksbGx2bV92MzJpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50cldyaXRlTWVtXT47CisKK2NsYXNzIEhleGFnb25fVjY1X3Z2NjRpaWl2NTEydjUxMl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW10sIFtsbHZtX3Y1MTJpMV90eSxsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSxsbHZtX3YxNmkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyV3JpdGVNZW1dPjsKKworY2xhc3MgSGV4YWdvbl9WNjVfdnYxMjhpaWl2MTAyNHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgW2xsdm1fdjEwMjRpMV90eSxsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSxsbHZtX3YzMmkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyV3JpdGVNZW1dPjsKKworY2xhc3MgSGV4YWdvbl9WNjVfdmlpdjEwMjR2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgW2xsdm1faTMyX3R5LGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjMyaTMyX3R5LGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJXcml0ZU1lbV0+OworCitjbGFzcyBIZXhhZ29uX1Y2NV92aWl2MjA0OHYxMDI0X0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgW2xsdm1faTMyX3R5LGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjY0aTMyX3R5LGxsdm1fdjMyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJXcml0ZU1lbV0+OworCitjbGFzcyBIZXhhZ29uX1Y2NV92djY0aWlpdjEwMjR2NTEyX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorIDogSGV4YWdvbl9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgW2xsdm1fdjUxMmkxX3R5LGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LGxsdm1fdjMyaTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJXcml0ZU1lbV0+OworCitjbGFzcyBIZXhhZ29uX1Y2NV92djEyOGlpaXYyMDQ4djEwMjRfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgOiBIZXhhZ29uX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtdLCBbbGx2bV92MTAyNGkxX3R5LGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LGxsdm1fdjY0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjMyaTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJXcml0ZU1lbV0+OworCitjbGFzcyBIZXhhZ29uX1Y2NV92MjA0OF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyA6IEhleGFnb25fSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjY0aTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzY2F0dGVybXcsdl9mdHlwZV9TSVNJVklWSSw0KQorLy8gdGFnIDogVjZfdnNjYXR0ZXJtdworZGVmIGludF9oZXhhZ29uX1Y2X3ZzY2F0dGVybXcgOgorSGV4YWdvbl9WNjVfdmlpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzY2F0dGVybXciPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzY2F0dGVybXdfMTI4Qix2X2Z0eXBlX1NJU0lWSVZJLDQpCisvLyB0YWcgOiBWNl92c2NhdHRlcm13XzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2NhdHRlcm13XzEyOEIgOgorSGV4YWdvbl9WNjVfdmlpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNjYXR0ZXJtd18xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2NhdHRlcm1oLHZfZnR5cGVfU0lTSVZJVkksNCkKKy8vIHRhZyA6IFY2X3ZzY2F0dGVybWgKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2NhdHRlcm1oIDoKK0hleGFnb25fVjY1X3ZpaXY1MTJ2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2NhdHRlcm1oIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2NhdHRlcm1oXzEyOEIsdl9mdHlwZV9TSVNJVklWSSw0KQorLy8gdGFnIDogVjZfdnNjYXR0ZXJtaF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnNjYXR0ZXJtaF8xMjhCIDoKK0hleGFnb25fVjY1X3ZpaXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzY2F0dGVybWhfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNjYXR0ZXJtd19hZGQsdl9mdHlwZV9TSVNJVklWSSw0KQorLy8gdGFnIDogVjZfdnNjYXR0ZXJtd19hZGQKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2NhdHRlcm13X2FkZCA6CitIZXhhZ29uX1Y2NV92aWl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNjYXR0ZXJtd19hZGQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzY2F0dGVybXdfYWRkXzEyOEIsdl9mdHlwZV9TSVNJVklWSSw0KQorLy8gdGFnIDogVjZfdnNjYXR0ZXJtd19hZGRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzY2F0dGVybXdfYWRkXzEyOEIgOgorSGV4YWdvbl9WNjVfdmlpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNjYXR0ZXJtd19hZGRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNjYXR0ZXJtaF9hZGQsdl9mdHlwZV9TSVNJVklWSSw0KQorLy8gdGFnIDogVjZfdnNjYXR0ZXJtaF9hZGQKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2NhdHRlcm1oX2FkZCA6CitIZXhhZ29uX1Y2NV92aWl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNjYXR0ZXJtaF9hZGQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzY2F0dGVybWhfYWRkXzEyOEIsdl9mdHlwZV9TSVNJVklWSSw0KQorLy8gdGFnIDogVjZfdnNjYXR0ZXJtaF9hZGRfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzY2F0dGVybWhfYWRkXzEyOEIgOgorSGV4YWdvbl9WNjVfdmlpdjEwMjR2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNjYXR0ZXJtaF9hZGRfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNjYXR0ZXJtd3Esdl9mdHlwZV9RVlNJU0lWSVZJLDUpCisvLyB0YWcgOiBWNl92c2NhdHRlcm13cQorZGVmIGludF9oZXhhZ29uX1Y2X3ZzY2F0dGVybXdxIDoKK0hleGFnb25fVjY1X3Z2NjRpaWl2NTEydjUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNjYXR0ZXJtd3EiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzY2F0dGVybXdxXzEyOEIsdl9mdHlwZV9RVlNJU0lWSVZJLDUpCisvLyB0YWcgOiBWNl92c2NhdHRlcm13cV8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnNjYXR0ZXJtd3FfMTI4QiA6CitIZXhhZ29uX1Y2NV92djEyOGlpaXYxMDI0djEwMjRfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzY2F0dGVybXdxXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzY2F0dGVybWhxLHZfZnR5cGVfUVZTSVNJVklWSSw1KQorLy8gdGFnIDogVjZfdnNjYXR0ZXJtaHEKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2NhdHRlcm1ocSA6CitIZXhhZ29uX1Y2NV92djY0aWlpdjUxMnY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzY2F0dGVybWhxIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2NhdHRlcm1ocV8xMjhCLHZfZnR5cGVfUVZTSVNJVklWSSw1KQorLy8gdGFnIDogVjZfdnNjYXR0ZXJtaHFfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzY2F0dGVybWhxXzEyOEIgOgorSGV4YWdvbl9WNjVfdnYxMjhpaWl2MTAyNHYxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2NhdHRlcm1ocV8xMjhCIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92c2NhdHRlcm1odyx2X2Z0eXBlX1NJU0lWRFZJLDQpCisvLyB0YWcgOiBWNl92c2NhdHRlcm1odworZGVmIGludF9oZXhhZ29uX1Y2X3ZzY2F0dGVybWh3IDoKK0hleGFnb25fVjY1X3ZpaXYxMDI0djUxMl9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNjYXR0ZXJtaHciPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzY2F0dGVybWh3XzEyOEIsdl9mdHlwZV9TSVNJVkRWSSw0KQorLy8gdGFnIDogVjZfdnNjYXR0ZXJtaHdfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzY2F0dGVybWh3XzEyOEIgOgorSGV4YWdvbl9WNjVfdmlpdjIwNDh2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNjYXR0ZXJtaHdfMTI4QiI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNjYXR0ZXJtaHdxLHZfZnR5cGVfUVZTSVNJVkRWSSw1KQorLy8gdGFnIDogVjZfdnNjYXR0ZXJtaHdxCitkZWYgaW50X2hleGFnb25fVjZfdnNjYXR0ZXJtaHdxIDoKK0hleGFnb25fVjY1X3Z2NjRpaWl2MTAyNHY1MTJfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZzY2F0dGVybWh3cSI+OworCisvLworLy8gQlVJTFRJTl9JTkZPKEhFWEFHT04uVjZfdnNjYXR0ZXJtaHdxXzEyOEIsdl9mdHlwZV9RVlNJU0lWRFZJLDUpCisvLyB0YWcgOiBWNl92c2NhdHRlcm1od3FfMTI4QgorZGVmIGludF9oZXhhZ29uX1Y2X3ZzY2F0dGVybWh3cV8xMjhCIDoKK0hleGFnb25fVjY1X3Z2MTI4aWlpdjIwNDh2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNjYXR0ZXJtaHdxXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzY2F0dGVybWh3X2FkZCx2X2Z0eXBlX1NJU0lWRFZJLDQpCisvLyB0YWcgOiBWNl92c2NhdHRlcm1od19hZGQKK2RlZiBpbnRfaGV4YWdvbl9WNl92c2NhdHRlcm1od19hZGQgOgorSGV4YWdvbl9WNjVfdmlpdjEwMjR2NTEyX0ludHJpbnNpYzwiSEVYQUdPTl9WNl92c2NhdHRlcm1od19hZGQiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZzY2F0dGVybWh3X2FkZF8xMjhCLHZfZnR5cGVfU0lTSVZEVkksNCkKKy8vIHRhZyA6IFY2X3ZzY2F0dGVybWh3X2FkZF8xMjhCCitkZWYgaW50X2hleGFnb25fVjZfdnNjYXR0ZXJtaHdfYWRkXzEyOEIgOgorSGV4YWdvbl9WNjVfdmlpdjIwNDh2MTAyNF9JbnRyaW5zaWM8IkhFWEFHT05fVjZfdnNjYXR0ZXJtaHdfYWRkXzEyOEIiPjsKKworLy8KKy8vIEJVSUxUSU5fSU5GTyhIRVhBR09OLlY2X3ZkZDAsVkRfZnR5cGVfLDApCisvLyB0YWcgOiBWNl92ZGQwCitkZWYgaW50X2hleGFnb25fVjZfdmRkMCA6CitIZXhhZ29uX3YxMDI0X0ludHJpbnNpYzwiSEVYQUdPTl9WNl92ZGQwIj47CisKKy8vCisvLyBCVUlMVElOX0lORk8oSEVYQUdPTi5WNl92ZGQwXzEyOEIsVkRfZnR5cGVfLDApCisvLyB0YWcgOiBWNl92ZGQwXzEyOEIKK2RlZiBpbnRfaGV4YWdvbl9WNl92ZGQwXzEyOEIgOgorSGV4YWdvbl9WNjVfdjIwNDhfSW50cmluc2ljPCJIRVhBR09OX1Y2X3ZkZDBfMTI4QiI+OwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzTWlwcy50ZCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc01pcHMudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIxYTc5YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc01pcHMudGQKQEAgLTAsMCArMSwxNzcxIEBACisvLz09PS0gSW50cmluc2ljc01pcHMudGQgLSBEZWZpbmVzIE1pcHMgaW50cmluc2ljcyAtLS0tLS0tLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFsbCBvZiB0aGUgTUlQUy1zcGVjaWZpYyBpbnRyaW5zaWNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNSVBTIERTUCBkYXRhIHR5cGVzCitkZWYgbWlwc192MnExNV90eTogTExWTVR5cGU8djJpMTY+OworZGVmIG1pcHNfdjRxN190eTogTExWTVR5cGU8djRpOD47CitkZWYgbWlwc19xMzFfdHk6IExMVk1UeXBlPGkzMj47CisKK2xldCBUYXJnZXRQcmVmaXggPSAibWlwcyIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS5taXBzLiIuCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNSVBTIERTUCBSZXYgMQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQWRkaXRpb24vc3VidHJhY3Rpb24KKworZGVmIGludF9taXBzX2FkZHVfcWIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19hZGR1X3FiIj4sCisgIEludHJpbnNpYzxbbGx2bV92NGk4X3R5XSwgW2xsdm1fdjRpOF90eSwgbGx2bV92NGk4X3R5XSwKKyAgICAgICAgICAgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYWRkdV9zX3FiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfYWRkdV9zX3FiIj4sCisgIEludHJpbnNpYzxbbGx2bV92NGk4X3R5XSwgW2xsdm1fdjRpOF90eSwgbGx2bV92NGk4X3R5XSwKKyAgICAgICAgICAgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3VidV9xYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3N1YnVfcWIiPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aThfdHldLCBbbGx2bV92NGk4X3R5LCBsbHZtX3Y0aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3VidV9zX3FiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfc3VidV9zX3FiIj4sCisgIEludHJpbnNpYzxbbGx2bV92NGk4X3R5XSwgW2xsdm1fdjRpOF90eSwgbGx2bV92NGk4X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYWRkcV9waCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2FkZHFfcGgiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW21pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLAorICAgICAgICAgICAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hZGRxX3NfcGggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19hZGRxX3NfcGgiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW21pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLAorICAgICAgICAgICAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zdWJxX3BoIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfc3VicV9waCI+LAorICBJbnRyaW5zaWM8W21pcHNfdjJxMTVfdHldLCBbbWlwc192MnExNV90eSwgbWlwc192MnExNV90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zdWJxX3NfcGggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19zdWJxX3NfcGgiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW21pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19tYWRkOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19tYWRkIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworZGVmIGludF9taXBzX21hZGR1OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19tYWRkdSI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworZGVmIGludF9taXBzX21zdWI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX21zdWIiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tc3VidTogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbXN1YnUiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2FkZHFfc193OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19hZGRxX3NfdyI+LAorICBJbnRyaW5zaWM8W21pcHNfcTMxX3R5XSwgW21pcHNfcTMxX3R5LCBtaXBzX3EzMV90eV0sIFtDb21tdXRhdGl2ZV0+OworZGVmIGludF9taXBzX3N1YnFfc193OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19zdWJxX3NfdyI+LAorICBJbnRyaW5zaWM8W21pcHNfcTMxX3R5XSwgW21pcHNfcTMxX3R5LCBtaXBzX3EzMV90eV0sIFtdPjsKKworZGVmIGludF9taXBzX2FkZHNjOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19hZGRzYyI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtDb21tdXRhdGl2ZV0+OworZGVmIGludF9taXBzX2FkZHdjOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19hZGR3YyI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtDb21tdXRhdGl2ZV0+OworCitkZWYgaW50X21pcHNfbW9kc3ViOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19tb2RzdWIiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19yYWRkdV93X3FiOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19yYWRkdV93X3FiIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGk4X3R5XSwgW0ludHJOb01lbV0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQWJzb2x1dGUgdmFsdWUKKworZGVmIGludF9taXBzX2Fic3Ffc19waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfYWJzcV9zX3BoIj4sCisgIEludHJpbnNpYzxbbWlwc192MnExNV90eV0sIFttaXBzX3YycTE1X3R5XSwgW10+OworZGVmIGludF9taXBzX2Fic3Ffc193OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19hYnNxX3NfdyI+LAorICBJbnRyaW5zaWM8W21pcHNfcTMxX3R5XSwgW21pcHNfcTMxX3R5XSwgW10+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUHJlY2lzaW9uIHJlZHVjZS9leHBhbmQKKworZGVmIGludF9taXBzX3ByZWNycV9xYl9waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfcHJlY3JxX3FiX3BoIj4sCisgIEludHJpbnNpYzxbbGx2bV92NGk4X3R5XSwgW21pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfcHJlY3JxdV9zX3FiX3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19wcmVjcnF1X3NfcWJfcGgiPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aThfdHldLCBbbWlwc192MnExNV90eSwgbWlwc192MnExNV90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19wcmVjcnFfcGhfdzogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfcHJlY3JxX3BoX3ciPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW21pcHNfcTMxX3R5LCBtaXBzX3EzMV90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19wcmVjcnFfcnNfcGhfdzogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfcHJlY3JxX3JzX3BoX3ciPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW21pcHNfcTMxX3R5LCBtaXBzX3EzMV90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19wcmVjZXFfd19waGw6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3ByZWNlcV93X3BobCI+LAorICBJbnRyaW5zaWM8W21pcHNfcTMxX3R5XSwgW21pcHNfdjJxMTVfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfcHJlY2VxX3dfcGhyOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19wcmVjZXFfd19waHIiPiwKKyAgSW50cmluc2ljPFttaXBzX3EzMV90eV0sIFttaXBzX3YycTE1X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3ByZWNlcXVfcGhfcWJsOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19wcmVjZXF1X3BoX3FibCI+LAorICBJbnRyaW5zaWM8W21pcHNfdjJxMTVfdHldLCBbbGx2bV92NGk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3ByZWNlcXVfcGhfcWJyOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19wcmVjZXF1X3BoX3FiciI+LAorICBJbnRyaW5zaWM8W21pcHNfdjJxMTVfdHldLCBbbGx2bV92NGk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3ByZWNlcXVfcGhfcWJsYTogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfcHJlY2VxdV9waF9xYmxhIj4sCisgIEludHJpbnNpYzxbbWlwc192MnExNV90eV0sIFtsbHZtX3Y0aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfcHJlY2VxdV9waF9xYnJhOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19wcmVjZXF1X3BoX3FicmEiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW2xsdm1fdjRpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19wcmVjZXVfcGhfcWJsOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19wcmVjZXVfcGhfcWJsIj4sCisgIEludHJpbnNpYzxbbWlwc192MnExNV90eV0sIFtsbHZtX3Y0aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfcHJlY2V1X3BoX3FicjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfcHJlY2V1X3BoX3FiciI+LAorICBJbnRyaW5zaWM8W21pcHNfdjJxMTVfdHldLCBbbGx2bV92NGk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3ByZWNldV9waF9xYmxhOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19wcmVjZXVfcGhfcWJsYSI+LAorICBJbnRyaW5zaWM8W21pcHNfdjJxMTVfdHldLCBbbGx2bV92NGk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3ByZWNldV9waF9xYnJhOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19wcmVjZXVfcGhfcWJyYSI+LAorICBJbnRyaW5zaWM8W21pcHNfdjJxMTVfdHldLCBbbGx2bV92NGk4X3R5XSwgW0ludHJOb01lbV0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU2hpZnQKKworZGVmIGludF9taXBzX3NobGxfcWI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3NobGxfcWIiPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aThfdHldLCBbbGx2bV92NGk4X3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19zaHJsX3FiOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19zaHJsX3FiIj4sCisgIEludHJpbnNpYzxbbGx2bV92NGk4X3R5XSwgW2xsdm1fdjRpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc2hsbF9waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfc2hsbF9waCI+LAorICBJbnRyaW5zaWM8W21pcHNfdjJxMTVfdHldLCBbbWlwc192MnExNV90eSwgbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X21pcHNfc2hsbF9zX3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19zaGxsX3NfcGgiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW21pcHNfdjJxMTVfdHksIGxsdm1faTMyX3R5XSwgW10+OworZGVmIGludF9taXBzX3NocmFfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3NocmFfcGgiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW21pcHNfdjJxMTVfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NocmFfcl9waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfc2hyYV9yX3BoIj4sCisgIEludHJpbnNpYzxbbWlwc192MnExNV90eV0sIFttaXBzX3YycTE1X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zaGxsX3NfdzogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfc2hsbF9zX3ciPiwKKyAgSW50cmluc2ljPFttaXBzX3EzMV90eV0sIFttaXBzX3EzMV90eSwgbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X21pcHNfc2hyYV9yX3c6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3NocmFfcl93Ij4sCisgIEludHJpbnNpYzxbbWlwc19xMzFfdHldLCBbbWlwc19xMzFfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NoaWxvOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19zaGlsbyI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE11bHRpcGxpY2F0aW9uCisKK2RlZiBpbnRfbWlwc19tdWxldV9zX3BoX3FibDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbXVsZXVfc19waF9xYmwiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW2xsdm1fdjRpOF90eSwgbWlwc192MnExNV90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19tdWxldV9zX3BoX3FicjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbXVsZXVfc19waF9xYnIiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW2xsdm1fdjRpOF90eSwgbWlwc192MnExNV90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19tdWxxX3JzX3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19tdWxxX3JzX3BoIj4sCisgIEludHJpbnNpYzxbbWlwc192MnExNV90eV0sIFttaXBzX3YycTE1X3R5LCBtaXBzX3YycTE1X3R5XSwgW0NvbW11dGF0aXZlXT47CitkZWYgaW50X21pcHNfbXVsZXFfc193X3BobDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbXVsZXFfc193X3BobCI+LAorICBJbnRyaW5zaWM8W21pcHNfcTMxX3R5XSwgW21pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbQ29tbXV0YXRpdmVdPjsKK2RlZiBpbnRfbWlwc19tdWxlcV9zX3dfcGhyOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19tdWxlcV9zX3dfcGhyIj4sCisgIEludHJpbnNpYzxbbWlwc19xMzFfdHldLCBbbWlwc192MnExNV90eSwgbWlwc192MnExNV90eV0sIFtDb21tdXRhdGl2ZV0+OworZGVmIGludF9taXBzX211bHNhcV9zX3dfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX211bHNhcV9zX3dfcGgiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbWlwc192MnExNV90eSwgbWlwc192MnExNV90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19tYXFfc193X3BobDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbWFxX3Nfd19waGwiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbWlwc192MnExNV90eSwgbWlwc192MnExNV90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19tYXFfc193X3BocjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbWFxX3Nfd19waHIiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbWlwc192MnExNV90eSwgbWlwc192MnExNV90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19tYXFfc2Ffd19waGw6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX21hcV9zYV93X3BobCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBtaXBzX3YycTE1X3R5LCBtaXBzX3YycTE1X3R5XSwgW10+OworZGVmIGludF9taXBzX21hcV9zYV93X3BocjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbWFxX3NhX3dfcGhyIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIG1pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbXT47CitkZWYgaW50X21pcHNfbXVsdDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbXVsdCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworZGVmIGludF9taXBzX211bHR1OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19tdWx0dSI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRG90IHByb2R1Y3Qgd2l0aCBhY2N1bXVsYXRlL3N1YnRyYWN0CisKK2RlZiBpbnRfbWlwc19kcGF1X2hfcWJsOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19kcGF1X2hfcWJsIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1fdjRpOF90eSwgbGx2bV92NGk4X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19kcGF1X2hfcWJyOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19kcGF1X2hfcWJyIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1fdjRpOF90eSwgbGx2bV92NGk4X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19kcHN1X2hfcWJsOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19kcHN1X2hfcWJsIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1fdjRpOF90eSwgbGx2bV92NGk4X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19kcHN1X2hfcWJyOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19kcHN1X2hfcWJyIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1fdjRpOF90eSwgbGx2bV92NGk4X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19kcGFxX3Nfd19waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfZHBhcV9zX3dfcGgiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbWlwc192MnExNV90eSwgbWlwc192MnExNV90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19kcHNxX3Nfd19waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfZHBzcV9zX3dfcGgiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbWlwc192MnExNV90eSwgbWlwc192MnExNV90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19kcGFxX3NhX2xfdzogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfZHBhcV9zYV9sX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbWlwc19xMzFfdHksIG1pcHNfcTMxX3R5XSwgW10+OworZGVmIGludF9taXBzX2Rwc3Ffc2FfbF93OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19kcHNxX3NhX2xfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBtaXBzX3EzMV90eSwgbWlwc19xMzFfdHldLCBbXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDb21wYXJpc29uCisKK2RlZiBpbnRfbWlwc19jbXB1X2VxX3FiOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19jbXB1X2VxX3FiIj4sCisgIEludHJpbnNpYzxbXSwgW2xsdm1fdjRpOF90eSwgbGx2bV92NGk4X3R5XSwgW0NvbW11dGF0aXZlXT47CitkZWYgaW50X21pcHNfY21wdV9sdF9xYjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfY21wdV9sdF9xYiI+LAorICBJbnRyaW5zaWM8W10sIFtsbHZtX3Y0aThfdHksIGxsdm1fdjRpOF90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19jbXB1X2xlX3FiOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19jbXB1X2xlX3FiIj4sCisgIEludHJpbnNpYzxbXSwgW2xsdm1fdjRpOF90eSwgbGx2bV92NGk4X3R5XSwgW10+OworZGVmIGludF9taXBzX2NtcGd1X2VxX3FiOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19jbXBndV9lcV9xYiI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRpOF90eSwgbGx2bV92NGk4X3R5XSwgW0NvbW11dGF0aXZlXT47CitkZWYgaW50X21pcHNfY21wZ3VfbHRfcWI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2NtcGd1X2x0X3FiIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGk4X3R5LCBsbHZtX3Y0aThfdHldLCBbXT47CitkZWYgaW50X21pcHNfY21wZ3VfbGVfcWI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2NtcGd1X2xlX3FiIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGk4X3R5LCBsbHZtX3Y0aThfdHldLCBbXT47CitkZWYgaW50X21pcHNfY21wX2VxX3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19jbXBfZXFfcGgiPiwKKyAgSW50cmluc2ljPFtdLCBbbWlwc192MnExNV90eSwgbWlwc192MnExNV90eV0sIFtDb21tdXRhdGl2ZV0+OworZGVmIGludF9taXBzX2NtcF9sdF9waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfY21wX2x0X3BoIj4sCisgIEludHJpbnNpYzxbXSwgW21pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbXT47CitkZWYgaW50X21pcHNfY21wX2xlX3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19jbXBfbGVfcGgiPiwKKyAgSW50cmluc2ljPFtdLCBbbWlwc192MnExNV90eSwgbWlwc192MnExNV90eV0sIFtdPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEV4dHJhY3RpbmcKKworZGVmIGludF9taXBzX2V4dHJfc19oOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19leHRyX3NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19leHRyX3c6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2V4dHJfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19leHRyX3JzX3c6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2V4dHJfcnNfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19leHRyX3JfdzogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfZXh0cl9yX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X21pcHNfZXh0cDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfZXh0cCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19leHRwZHA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2V4dHBkcCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1pc2MKKworZGVmIGludF9taXBzX3dyZHNwOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc193cmRzcCI+LAorICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X21pcHNfcmRkc3A6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3JkZHNwIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50clJlYWRNZW1dPjsKKworZGVmIGludF9taXBzX2luc3Y6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2luc3YiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50clJlYWRNZW1dPjsKK2RlZiBpbnRfbWlwc19iaXRyZXY6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2JpdHJldiI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfcGFja3JsX3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19wYWNrcmxfcGgiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW21pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19yZXBsX3FiOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19yZXBsX3FiIj4sCisgIEludHJpbnNpYzxbbGx2bV92NGk4X3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3JlcGxfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3JlcGxfcGgiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfcGlja19xYjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfcGlja19xYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpOF90eV0sIFtsbHZtX3Y0aThfdHksIGxsdm1fdjRpOF90eV0sIFtJbnRyUmVhZE1lbV0+OworZGVmIGludF9taXBzX3BpY2tfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3BpY2tfcGgiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW21pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbSW50clJlYWRNZW1dPjsKKworZGVmIGludF9taXBzX210aGxpcDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbXRobGlwIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10+OworCitkZWYgaW50X21pcHNfYnBvc2dlMzI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2Jwb3NnZTMyIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJSZWFkTWVtXT47CisKK2RlZiBpbnRfbWlwc19sYnV4OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19sYnV4Ij4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworZGVmIGludF9taXBzX2xoeDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbGh4Ij4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworZGVmIGludF9taXBzX2x3eDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfbHd4Ij4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTUlQUyBEU1AgUmV2IDIKKworZGVmIGludF9taXBzX2Fic3Ffc19xYjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfYWJzcV9zX3FiIj4sCisgIEludHJpbnNpYzxbbWlwc192NHE3X3R5XSwgW21pcHNfdjRxN190eV0sIFtdPjsKKworZGVmIGludF9taXBzX2FkZHFoX3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19hZGRxaF9waCI+LAorICBJbnRyaW5zaWM8W21pcHNfdjJxMTVfdHldLCBbbWlwc192MnExNV90eSwgbWlwc192MnExNV90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworZGVmIGludF9taXBzX2FkZHFoX3JfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2FkZHFoX3JfcGgiPiwKKyAgSW50cmluc2ljPFttaXBzX3YycTE1X3R5XSwgW21pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKK2RlZiBpbnRfbWlwc19hZGRxaF93OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19hZGRxaF93Ij4sCisgIEludHJpbnNpYzxbbWlwc19xMzFfdHldLCBbbWlwc19xMzFfdHksIG1pcHNfcTMxX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CitkZWYgaW50X21pcHNfYWRkcWhfcl93OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19hZGRxaF9yX3ciPiwKKyAgSW50cmluc2ljPFttaXBzX3EzMV90eV0sIFttaXBzX3EzMV90eSwgbWlwc19xMzFfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworZGVmIGludF9taXBzX2FkZHVfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2FkZHVfcGgiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTE2X3R5XSwgW2xsdm1fdjJpMTZfdHksIGxsdm1fdjJpMTZfdHldLCBbQ29tbXV0YXRpdmVdPjsKK2RlZiBpbnRfbWlwc19hZGR1X3NfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2FkZHVfc19waCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpMTZfdHldLCBbbGx2bV92MmkxNl90eSwgbGx2bV92MmkxNl90eV0sIFtDb21tdXRhdGl2ZV0+OworCitkZWYgaW50X21pcHNfYWRkdWhfcWI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2FkZHVoX3FiIj4sCisgIEludHJpbnNpYzxbbGx2bV92NGk4X3R5XSwgW2xsdm1fdjRpOF90eSwgbGx2bV92NGk4X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CitkZWYgaW50X21pcHNfYWRkdWhfcl9xYjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfYWRkdWhfcl9xYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpOF90eV0sIFtsbHZtX3Y0aThfdHksIGxsdm1fdjRpOF90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCitkZWYgaW50X21pcHNfYXBwZW5kOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19hcHBlbmQiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2JhbGlnbjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfYmFsaWduIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2NtcGdkdV9lcV9xYjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfY21wZ2R1X2VxX3FiIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGk4X3R5LCBsbHZtX3Y0aThfdHldLCBbQ29tbXV0YXRpdmVdPjsKK2RlZiBpbnRfbWlwc19jbXBnZHVfbHRfcWI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2NtcGdkdV9sdF9xYiI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRpOF90eSwgbGx2bV92NGk4X3R5XSwgW10+OworZGVmIGludF9taXBzX2NtcGdkdV9sZV9xYjogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfY21wZ2R1X2xlX3FiIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGk4X3R5LCBsbHZtX3Y0aThfdHldLCBbXT47CisKK2RlZiBpbnRfbWlwc19kcGFfd19waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfZHBhX3dfcGgiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV92MmkxNl90eSwgbGx2bV92MmkxNl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZHBzX3dfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX2Rwc193X3BoIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1fdjJpMTZfdHksIGxsdm1fdjJpMTZfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZHBhcXhfc193X3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19kcGFxeF9zX3dfcGgiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbWlwc192MnExNV90eSwgbWlwc192MnExNV90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19kcGFxeF9zYV93X3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19kcGFxeF9zYV93X3BoIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIG1pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbXT47CitkZWYgaW50X21pcHNfZHBheF93X3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19kcGF4X3dfcGgiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV92MmkxNl90eSwgbGx2bV92MmkxNl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZHBzeF93X3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19kcHN4X3dfcGgiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV92MmkxNl90eSwgbGx2bV92MmkxNl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZHBzcXhfc193X3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19kcHNxeF9zX3dfcGgiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbWlwc192MnExNV90eSwgbWlwc192MnExNV90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19kcHNxeF9zYV93X3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19kcHNxeF9zYV93X3BoIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIG1pcHNfdjJxMTVfdHksIG1pcHNfdjJxMTVfdHldLCBbXT47CisKK2RlZiBpbnRfbWlwc19tdWxfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX211bF9waCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpMTZfdHldLCBbbGx2bV92MmkxNl90eSwgbGx2bV92MmkxNl90eV0sIFtDb21tdXRhdGl2ZV0+OworZGVmIGludF9taXBzX211bF9zX3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19tdWxfc19waCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpMTZfdHldLCBbbGx2bV92MmkxNl90eSwgbGx2bV92MmkxNl90eV0sIFtDb21tdXRhdGl2ZV0+OworCitkZWYgaW50X21pcHNfbXVscV9yc193OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19tdWxxX3JzX3ciPiwKKyAgSW50cmluc2ljPFttaXBzX3EzMV90eV0sIFttaXBzX3EzMV90eSwgbWlwc19xMzFfdHldLCBbQ29tbXV0YXRpdmVdPjsKK2RlZiBpbnRfbWlwc19tdWxxX3NfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX211bHFfc19waCI+LAorICBJbnRyaW5zaWM8W21pcHNfdjJxMTVfdHldLCBbbWlwc192MnExNV90eSwgbWlwc192MnExNV90eV0sIFtDb21tdXRhdGl2ZV0+OworZGVmIGludF9taXBzX211bHFfc193OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19tdWxxX3NfdyI+LAorICBJbnRyaW5zaWM8W21pcHNfcTMxX3R5XSwgW21pcHNfcTMxX3R5LCBtaXBzX3EzMV90eV0sIFtDb21tdXRhdGl2ZV0+OworZGVmIGludF9taXBzX211bHNhX3dfcGg6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX211bHNhX3dfcGgiPiwKKyAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV92MmkxNl90eSwgbGx2bV92MmkxNl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19wcmVjcl9xYl9waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfcHJlY3JfcWJfcGgiPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aThfdHldLCBbbGx2bV92MmkxNl90eSwgbGx2bV92MmkxNl90eV0sIFtdPjsKK2RlZiBpbnRfbWlwc19wcmVjcl9zcmFfcGhfdzogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfcHJlY3Jfc3JhX3BoX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTE2X3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3ByZWNyX3NyYV9yX3BoX3c6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3ByZWNyX3NyYV9yX3BoX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTE2X3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfcHJlcGVuZDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfcHJlcGVuZCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19zaHJhX3FiOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19zaHJhX3FiIj4sCisgIEludHJpbnNpYzxbbGx2bV92NGk4X3R5XSwgW2xsdm1fdjRpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc2hyYV9yX3FiOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19zaHJhX3JfcWIiPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aThfdHldLCBbbGx2bV92NGk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zaHJsX3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19zaHJsX3BoIj4sCisgIEludHJpbnNpYzxbbGx2bV92MmkxNl90eV0sIFtsbHZtX3YyaTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX3N1YnFoX3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19zdWJxaF9waCI+LAorICBJbnRyaW5zaWM8W21pcHNfdjJxMTVfdHldLCBbbWlwc192MnExNV90eSwgbWlwc192MnExNV90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zdWJxaF9yX3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19zdWJxaF9yX3BoIj4sCisgIEludHJpbnNpYzxbbWlwc192MnExNV90eV0sIFttaXBzX3YycTE1X3R5LCBtaXBzX3YycTE1X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3N1YnFoX3c6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3N1YnFoX3ciPiwKKyAgSW50cmluc2ljPFttaXBzX3EzMV90eV0sIFttaXBzX3EzMV90eSwgbWlwc19xMzFfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3VicWhfcl93OiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19zdWJxaF9yX3ciPiwKKyAgSW50cmluc2ljPFttaXBzX3EzMV90eV0sIFttaXBzX3EzMV90eSwgbWlwc19xMzFfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19zdWJ1X3BoOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19zdWJ1X3BoIj4sCisgIEludHJpbnNpYzxbbGx2bV92MmkxNl90eV0sIFtsbHZtX3YyaTE2X3R5LCBsbHZtX3YyaTE2X3R5XSwgW10+OworZGVmIGludF9taXBzX3N1YnVfc19waDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfc3VidV9zX3BoIj4sCisgIEludHJpbnNpYzxbbGx2bV92MmkxNl90eV0sIFtsbHZtX3YyaTE2X3R5LCBsbHZtX3YyaTE2X3R5XSwgW10+OworCitkZWYgaW50X21pcHNfc3VidWhfcWI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3N1YnVoX3FiIj4sCisgIEludHJpbnNpYzxbbGx2bV92NGk4X3R5XSwgW2xsdm1fdjRpOF90eSwgbGx2bV92NGk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3N1YnVoX3JfcWI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9taXBzX3N1YnVoX3JfcWIiPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aThfdHldLCBbbGx2bV92NGk4X3R5LCBsbHZtX3Y0aThfdHldLCBbSW50ck5vTWVtXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNSVBTIE1TQQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQWRkaXRpb24vc3VidHJhY3Rpb24KKworZGVmIGludF9taXBzX2FkZF9hX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FkZF9hX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2FkZF9hX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FkZF9hX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2FkZF9hX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FkZF9hX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2FkZF9hX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FkZF9hX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYWRkc19hX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FkZHNfYV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hZGRzX2FfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYWRkc19hX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2FkZHNfYV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hZGRzX2FfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYWRkc19hX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FkZHNfYV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2FkZHNfc19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hZGRzX3NfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYWRkc19zX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FkZHNfc19oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hZGRzX3NfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYWRkc19zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2FkZHNfc19kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hZGRzX3NfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19hZGRzX3VfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYWRkc191X2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2FkZHNfdV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hZGRzX3VfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYWRkc191X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FkZHNfdV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hZGRzX3VfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYWRkc191X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYWRkdl9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hZGR2X2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2FkZHZfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYWRkdl9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hZGR2X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FkZHZfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYWRkdl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hZGR2X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYWRkdmlfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYWRkdmlfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2FkZHZpX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FkZHZpX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hZGR2aV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hZGR2aV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYWRkdmlfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYWRkdmlfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYW5kX3YgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FuZF92Ij4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYW5kaV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hbmRpX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYXN1Yl9zX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FzdWJfc19iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2FzdWJfc19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hc3ViX3NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hc3ViX3NfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYXN1Yl9zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYXN1Yl9zX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FzdWJfc19kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYXN1Yl91X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FzdWJfdV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2FzdWJfdV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hc3ViX3VfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hc3ViX3VfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYXN1Yl91X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYXN1Yl91X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2FzdWJfdV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYXZlX3NfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYXZlX3NfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYXZlX3NfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYXZlX3NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYXZlX3NfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYXZlX3NfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYXZlX3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYXZlX3NfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19hdmVfdV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hdmVfdV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hdmVfdV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hdmVfdV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hdmVfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hdmVfdV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hdmVfdV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hdmVfdV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2F2ZXJfc19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hdmVyX3NfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYXZlcl9zX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2F2ZXJfc19oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hdmVyX3NfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYXZlcl9zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2F2ZXJfc19kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hdmVyX3NfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19hdmVyX3VfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYXZlcl91X2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworZGVmIGludF9taXBzX2F2ZXJfdV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9hdmVyX3VfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgIFtDb21tdXRhdGl2ZSwgSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYXZlcl91X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2F2ZXJfdV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgW0NvbW11dGF0aXZlLCBJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19hdmVyX3VfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYXZlcl91X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICBbQ29tbXV0YXRpdmUsIEludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYmNscl9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iY2xyX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYmNscl9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iY2xyX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYmNscl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iY2xyX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYmNscl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iY2xyX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19iY2xyaV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iY2xyaV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19iY2xyaV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iY2xyaV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19iY2xyaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iY2xyaV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19iY2xyaV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iY2xyaV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2JpbnNsX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JpbnNsX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2JpbnNsX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JpbnNsX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2JpbnNsX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JpbnNsX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2JpbnNsX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JpbnNsX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYmluc2xpX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JpbnNsaV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYmluc2xpX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JpbnNsaV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYmluc2xpX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JpbnNsaV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYmluc2xpX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JpbnNsaV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19iaW5zcl9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iaW5zcl9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19iaW5zcl9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iaW5zcl9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19iaW5zcl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iaW5zcl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19iaW5zcl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iaW5zcl9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2JpbnNyaV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iaW5zcmlfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2JpbnNyaV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iaW5zcmlfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2JpbnNyaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iaW5zcmlfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2JpbnNyaV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iaW5zcmlfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYm1uel92IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ibW56X3YiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYm1uemlfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYm1uemlfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYm16X3YgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Jtel92Ij4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2JtemlfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYm16aV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19ibmVnX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JuZWdfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19ibmVnX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JuZWdfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19ibmVnX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JuZWdfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19ibmVnX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JuZWdfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2JuZWdpX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JuZWdpX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2JuZWdpX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JuZWdpX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2JuZWdpX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JuZWdpX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2JuZWdpX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JuZWdpX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYm56X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Juel9iIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19ibnpfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYm56X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2Juel93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ibnpfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYm56X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Juel9kIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2Juel92IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ibnpfdiI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19ic2VsX3YgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JzZWxfdiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19ic2VsaV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ic2VsaV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19ic2V0X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JzZXRfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19ic2V0X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JzZXRfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19ic2V0X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JzZXRfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19ic2V0X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JzZXRfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2JzZXRpX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JzZXRpX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2JzZXRpX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JzZXRpX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2JzZXRpX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JzZXRpX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2JzZXRpX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2JzZXRpX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfYnpfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYnpfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYnpfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYnpfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYnpfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYnpfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfYnpfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfYnpfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19iel92IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9iel92Ij4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2NlcV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jZXFfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jZXFfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2VxX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY2VxX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NlcV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NlcV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jZXFfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2NlcWlfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2VxaV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jZXFpX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NlcWlfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY2VxaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jZXFpX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NlcWlfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2VxaV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2NmY21zYSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2ZjbXNhIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHldLCBbXT47CisKK2RlZiBpbnRfbWlwc19jbGVfc19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jbGVfc19iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NsZV9zX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsZV9zX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY2xlX3NfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2xlX3NfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jbGVfc19kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jbGVfc19kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfY2xlX3VfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2xlX3VfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jbGVfdV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jbGVfdV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NsZV91X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsZV91X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY2xlX3VfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2xlX3VfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2NsZWlfc19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jbGVpX3NfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY2xlaV9zX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsZWlfc19oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jbGVpX3NfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2xlaV9zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NsZWlfc19kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jbGVpX3NfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19jbGVpX3VfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2xlaV91X2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NsZWlfdV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jbGVpX3VfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY2xlaV91X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsZWlfdV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jbGVpX3VfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2xlaV91X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfY2x0X3NfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2x0X3NfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jbHRfc19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jbHRfc19oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NsdF9zX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsdF9zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY2x0X3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2x0X3NfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2NsdF91X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsdF91X2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY2x0X3VfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2x0X3VfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jbHRfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jbHRfdV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NsdF91X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsdF91X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19jbHRpX3NfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2x0aV9zX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NsdGlfc19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jbHRpX3NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY2x0aV9zX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsdGlfc193Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jbHRpX3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2x0aV9zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfY2x0aV91X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsdGlfdV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19jbHRpX3VfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfY2x0aV91X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NsdGlfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jbHRpX3VfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY2x0aV91X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NsdGlfdV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2NvcHlfc19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jb3B5X3NfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NvcHlfc19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jb3B5X3NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NvcHlfc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jb3B5X3NfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2NvcHlfc19kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9jb3B5X3NfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfY29weV91X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NvcHlfdV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY29weV91X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NvcHlfdV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY29weV91X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NvcHlfdV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfY29weV91X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2NvcHlfdV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19jdGNtc2EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2N0Y21zYSI+LAorICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisKK2RlZiBpbnRfbWlwc19kaXZfc19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9kaXZfc19iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2Rpdl9zX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Rpdl9zX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZGl2X3NfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZGl2X3NfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19kaXZfc19kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9kaXZfc19kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZGl2X3VfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZGl2X3VfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19kaXZfdV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9kaXZfdV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2Rpdl91X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Rpdl91X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZGl2X3VfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZGl2X3VfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8gVGhpcyBpbnN0cnVjdGlvbiBpcyBwYXJ0IG9mIHRoZSBNU0Egc3BlYyBidXQgaXQgZG9lcyBub3Qgc2hhcmUgdGhlCisvLyBfX2J1aWx0aW5fbXNhIHByZWZpeCBiZWNhdXNlIGl0IG9wZXJhdGVzIG9uIEdQIHJlZ2lzdGVycy4KK2RlZiBpbnRfbWlwc19kbHNhIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21pcHNfZGxzYSI+LAorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZG90cF9zX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2RvdHBfc19oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2RvdHBfc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9kb3RwX3NfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19kb3RwX3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZG90cF9zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19kb3RwX3VfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZG90cF91X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZG90cF91X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2RvdHBfdV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2RvdHBfdV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9kb3RwX3VfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2RwYWRkX3NfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZHBhZGRfc19oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2RwYWRkX3NfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZHBhZGRfc193Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2RwYWRkX3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZHBhZGRfc19kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZHBhZGRfdV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9kcGFkZF91X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZHBhZGRfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9kcGFkZF91X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZHBhZGRfdV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9kcGFkZF91X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19kcHN1Yl9zX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Rwc3ViX3NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19kcHN1Yl9zX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Rwc3ViX3NfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19kcHN1Yl9zX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Rwc3ViX3NfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2Rwc3ViX3VfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZHBzdWJfdV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2Rwc3ViX3VfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZHBzdWJfdV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2Rwc3ViX3VfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZHBzdWJfdV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZmFkZF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mYWRkX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZmFkZF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mYWRkX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mY2FmX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZjYWZfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mY2FmX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZjYWZfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZjZXFfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmNlcV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZjZXFfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmNlcV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZmNsZV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mY2xlX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZmNsZV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mY2xlX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mY2x0X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZjbHRfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mY2x0X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZjbHRfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZjbGFzc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mY2xhc3NfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mY2xhc3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmNsYXNzX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mY25lX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZjbmVfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mY25lX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZjbmVfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2Zjb3JfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmNvcl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2Zjb3JfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmNvcl9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZmN1ZXFfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmN1ZXFfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mY3VlcV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mY3VlcV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZmN1bGVfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmN1bGVfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mY3VsZV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mY3VsZV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZmN1bHRfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmN1bHRfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mY3VsdF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mY3VsdF9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZmN1bl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mY3VuX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZmN1bl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mY3VuX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mY3VuZV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mY3VuZV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZjdW5lX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZjdW5lX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mZGl2X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZkaXZfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mZGl2X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZkaXZfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZleGRvX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZleGRvX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4ZjE2X3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZmV4ZG9fdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmV4ZG9fdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZleHAyX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZleHAyX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZmV4cDJfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmV4cDJfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZleHVwbF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mZXh1cGxfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92OGYxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mZXh1cGxfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmV4dXBsX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mZXh1cHJfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmV4dXByX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjhmMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZmV4dXByX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZleHVwcl9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZmZpbnRfc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mZmludF9zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZmZpbnRfc19kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mZmludF9zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mZmludF91X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZmaW50X3VfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mZmludF91X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZmaW50X3VfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZmcWxfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmZxbF93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZmcWxfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmZxbF9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZmZxcl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mZnFyX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZmZxcl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mZnFyX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19maWxsX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZpbGxfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZmlsbF9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9maWxsX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZpbGxfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZmlsbF93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19maWxsX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZpbGxfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mbG9nMl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mbG9nMl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2Zsb2cyX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Zsb2cyX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mbWFkZF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mbWFkZF93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mbWFkZF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mbWFkZF9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZtYXhfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZm1heF93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZtYXhfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZm1heF9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZm1heF9hX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZtYXhfYV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZtYXhfYV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mbWF4X2FfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZtaW5fdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZm1pbl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZtaW5fZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZm1pbl9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZm1pbl9hX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZtaW5fYV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZtaW5fYV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mbWluX2FfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2Ztc3ViX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Ztc3ViX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2Ztc3ViX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Ztc3ViX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZm11bF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mbXVsX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZm11bF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mbXVsX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mcmludF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mcmludF93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZyaW50X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZyaW50X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mcmNwX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZyY3BfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mcmNwX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZyY3BfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2Zyc3FydF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mcnNxcnRfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mcnNxcnRfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnJzcXJ0X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mc2FmX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZzYWZfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mc2FmX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZzYWZfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZzZXFfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnNlcV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZzZXFfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnNlcV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZnNsZV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mc2xlX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZnNsZV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mc2xlX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mc2x0X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZzbHRfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mc2x0X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZzbHRfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZzbmVfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnNuZV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZzbmVfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnNuZV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZnNvcl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mc29yX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZnNvcl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mc29yX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mc3FydF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mc3FydF93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZzcXJ0X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZzcXJ0X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mc3ViX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZzdWJfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mc3ViX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZzdWJfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZzdWVxX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZzdWVxX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZnN1ZXFfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnN1ZXFfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZzdWxlX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZzdWxlX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZnN1bGVfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnN1bGVfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZzdWx0X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2ZzdWx0X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZnN1bHRfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnN1bHRfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2ZzdW5fdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnN1bl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2ZzdW5fZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnN1bl9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZnN1bmVfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnN1bmVfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mc3VuZV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mc3VuZV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfZnRpbnRfc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mdGludF9zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfZnRpbnRfc19kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mdGludF9zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mdGludF91X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Z0aW50X3VfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mdGludF91X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Z0aW50X3VfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2Z0cV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mdHFfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19mdHFfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfZnRxX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mdHJ1bmNfc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mdHJ1bmNfc193Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2Z0cnVuY19zX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Z0cnVuY19zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19mdHJ1bmNfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9mdHJ1bmNfdV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2Z0cnVuY191X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2Z0cnVuY191X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19oYWRkX3NfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfaGFkZF9zX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfaGFkZF9zX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2hhZGRfc193Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2hhZGRfc19kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9oYWRkX3NfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2hhZGRfdV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9oYWRkX3VfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19oYWRkX3VfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfaGFkZF91X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfaGFkZF91X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2hhZGRfdV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfaHN1Yl9zX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2hzdWJfc19oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2hzdWJfc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9oc3ViX3NfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19oc3ViX3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfaHN1Yl9zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19oc3ViX3VfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfaHN1Yl91X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfaHN1Yl91X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2hzdWJfdV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2hzdWJfdV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9oc3ViX3VfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2lsdmV2X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2lsdmV2X2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfaWx2ZXZfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfaWx2ZXZfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19pbHZldl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9pbHZldl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2lsdmV2X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2lsdmV2X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19pbHZsX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2lsdmxfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19pbHZsX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2lsdmxfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19pbHZsX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2lsdmxfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19pbHZsX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2lsdmxfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2lsdm9kX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2lsdm9kX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfaWx2b2RfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfaWx2b2RfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19pbHZvZF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9pbHZvZF93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2lsdm9kX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2lsdm9kX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19pbHZyX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2lsdnJfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19pbHZyX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2lsdnJfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19pbHZyX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2lsdnJfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19pbHZyX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2lsdnJfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2luc2VydF9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9pbnNlcnRfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2luc2VydF9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9pbnNlcnRfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2luc2VydF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9pbnNlcnRfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2luc2VydF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9pbnNlcnRfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5XSwKKyAgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfaW5zdmVfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfaW5zdmVfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19pbnN2ZV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9pbnN2ZV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICBbbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2luc3ZlX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2luc3ZlX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfaW5zdmVfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfaW5zdmVfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgW2xsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX2xkX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2xkX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfbWlwc19sZF9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9sZF9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHldLAorICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CitkZWYgaW50X21pcHNfbGRfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbGRfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5XSwKKyAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworZGVmIGludF9taXBzX2xkX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2xkX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworZGVmIGludF9taXBzX2xkaV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9sZGlfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbGRpX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX2xkaV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19sZGlfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbGRpX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX2xkaV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9sZGlfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKy8vIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgcGFydCBvZiB0aGUgTVNBIHNwZWMgYnV0IGl0IGRvZXMgbm90IHNoYXJlIHRoZQorLy8gX19idWlsdGluX21zYSBwcmVmaXggYmVjYXVzZSBpdCBvcGVyYXRlcyBvbiB0aGUgR1BSIHJlZ2lzdGVycy4KK2RlZiBpbnRfbWlwc19sc2EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbWlwc19sc2EiPiwKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX21hZGRfcV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tYWRkX3FfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tYWRkX3FfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWFkZF9xX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19tYWRkcl9xX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21hZGRyX3FfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tYWRkcl9xX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21hZGRyX3FfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX21hZGR2X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21hZGR2X2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWFkZHZfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWFkZHZfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tYWRkdl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tYWRkdl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21hZGR2X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21hZGR2X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19tYXhfYV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tYXhfYV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21heF9hX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21heF9hX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWF4X2FfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWF4X2FfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tYXhfYV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tYXhfYV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfbWF4X3NfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWF4X3NfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tYXhfc19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tYXhfc19oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21heF9zX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21heF9zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWF4X3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWF4X3NfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX21heF91X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21heF91X2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWF4X3VfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWF4X3VfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tYXhfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tYXhfdV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21heF91X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21heF91X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19tYXhpX3NfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWF4aV9zX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21heGlfc19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tYXhpX3NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWF4aV9zX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21heGlfc193Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tYXhpX3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWF4aV9zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfbWF4aV91X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21heGlfdV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tYXhpX3VfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWF4aV91X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21heGlfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tYXhpX3VfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWF4aV91X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21heGlfdV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX21pbl9hX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21pbl9hX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWluX2FfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWluX2FfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19taW5fYV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9taW5fYV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21pbl9hX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21pbl9hX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19taW5fc19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9taW5fc19iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21pbl9zX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21pbl9zX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWluX3NfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWluX3NfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19taW5fc19kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9taW5fc19kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfbWluX3VfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWluX3VfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19taW5fdV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9taW5fdV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21pbl91X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21pbl91X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWluX3VfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWluX3VfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX21pbmlfc19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9taW5pX3NfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWluaV9zX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21pbmlfc19oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19taW5pX3NfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWluaV9zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21pbmlfc19kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9taW5pX3NfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19taW5pX3VfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWluaV91X2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21pbmlfdV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9taW5pX3VfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbWluaV91X3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21pbmlfdV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19taW5pX3VfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbWluaV91X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfbW9kX3NfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbW9kX3NfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tb2Rfc19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tb2Rfc19oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21vZF9zX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21vZF9zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbW9kX3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbW9kX3NfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX21vZF91X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21vZF91X2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbW9kX3VfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbW9kX3VfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tb2RfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tb2RfdV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21vZF91X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21vZF91X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19tb3ZlX3YgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21vdmVfdiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX21zdWJfcV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tc3ViX3FfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tc3ViX3FfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbXN1Yl9xX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19tc3Vicl9xX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21zdWJyX3FfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tc3Vicl9xX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21zdWJyX3FfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX21zdWJ2X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21zdWJ2X2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbXN1YnZfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbXN1YnZfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19tc3Vidl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tc3Vidl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX21zdWJ2X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX21zdWJ2X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19tdWxfcV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tdWxfcV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX211bF9xX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX211bF9xX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19tdWxyX3FfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfbXVscl9xX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbXVscl9xX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX211bHJfcV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfbXVsdl9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tdWx2X2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbXVsdl9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tdWx2X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbXVsdl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tdWx2X3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfbXVsdl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9tdWx2X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19ubG9jX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX25sb2NfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19ubG9jX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX25sb2NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19ubG9jX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX25sb2NfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19ubG9jX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX25sb2NfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX25semNfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffbmx6Y19iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX25semNfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffbmx6Y19oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX25semNfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffbmx6Y193Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX25semNfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffbmx6Y19kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfbm9yX3YgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX25vcl92Ij4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfbm9yaV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9ub3JpX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfb3JfdiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffb3JfdiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX29yaV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9vcmlfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19wY2tldl9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9wY2tldl9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3Bja2V2X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3Bja2V2X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfcGNrZXZfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfcGNrZXZfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19wY2tldl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9wY2tldl9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfcGNrb2RfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfcGNrb2RfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19wY2tvZF9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9wY2tvZF9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3Bja29kX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3Bja29kX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfcGNrb2RfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfcGNrb2RfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX3BjbnRfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfcGNudF9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3BjbnRfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfcGNudF9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3BjbnRfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfcGNudF93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3BjbnRfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfcGNudF9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfc2F0X3NfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc2F0X3NfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc2F0X3NfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc2F0X3NfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc2F0X3NfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc2F0X3NfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc2F0X3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc2F0X3NfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19zYXRfdV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zYXRfdV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zYXRfdV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zYXRfdV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zYXRfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zYXRfdV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zYXRfdV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zYXRfdV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX3NoZl9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zaGZfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc2hmX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NoZl9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zaGZfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc2hmX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfc2xkX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NsZF9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zbGRfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc2xkX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NsZF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zbGRfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc2xkX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NsZF9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX3NsZGlfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc2xkaV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc2xkaV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zbGRpX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zbGRpX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NsZGlfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NsZGlfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc2xkaV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19zbGxfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc2xsX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc2xsX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NsbF9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NsbF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zbGxfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zbGxfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc2xsX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19zbGxpX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NsbGlfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc2xsaV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zbGxpX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NsbGlfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc2xsaV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zbGxpX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NsbGlfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19zcGxhdF9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcGxhdF9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcGxhdF9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcGxhdF9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcGxhdF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcGxhdF93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcGxhdF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcGxhdF9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX3NwbGF0aV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcGxhdGlfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3BsYXRpX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NwbGF0aV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcGxhdGlfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3BsYXRpX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NwbGF0aV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcGxhdGlfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19zcmFfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3JhX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3JhX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NyYV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NyYV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmFfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcmFfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3JhX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19zcmFpX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NyYWlfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3JhaV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmFpX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NyYWlfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3JhaV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcmFpX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NyYWlfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19zcmFyX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NyYXJfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcmFyX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NyYXJfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcmFyX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NyYXJfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcmFyX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NyYXJfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX3NyYXJpX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NyYXJpX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NyYXJpX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NyYXJpX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NyYXJpX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NyYXJpX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NyYXJpX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NyYXJpX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfc3JsX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NybF9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NybF9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmxfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcmxfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3JsX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3JsX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NybF9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfc3JsaV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmxpX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3NybGlfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3JsaV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcmxpX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3NybGlfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3JsaV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmxpX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfc3Jscl9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmxyX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3Jscl9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmxyX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3Jscl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmxyX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3Jscl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmxyX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19zcmxyaV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmxyaV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcmxyaV9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmxyaV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcmxyaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmxyaV93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zcmxyaV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zcmxyaV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX3N0X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N0X2IiPiwKKyAgSW50cmluc2ljPFtdLCBbbGx2bV92MTZpOF90eSwgbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5XSwKKyAgW0ludHJBcmdNZW1Pbmx5XT47CitkZWYgaW50X21pcHNfc3RfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3RfaCI+LAorICBJbnRyaW5zaWM8W10sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHldLAorICBbSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfbWlwc19zdF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zdF93Ij4sCisgIEludHJpbnNpYzxbXSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fcHRyX3R5LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyQXJnTWVtT25seV0+OworZGVmIGludF9taXBzX3N0X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N0X2QiPiwKKyAgSW50cmluc2ljPFtdLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5XSwKKyAgW0ludHJBcmdNZW1Pbmx5XT47CisKK2RlZiBpbnRfbWlwc19zdWJzX3NfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3Vic19zX2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3Vic19zX2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N1YnNfc19oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3N1YnNfc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zdWJzX3NfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zdWJzX3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3Vic19zX2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19zdWJzX3VfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3Vic191X2IiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3Vic191X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N1YnNfdV9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3N1YnNfdV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zdWJzX3VfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zdWJzX3VfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3Vic191X2QiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc19zdWJzdXNfdV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zdWJzdXNfdV9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3N1YnN1c191X2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N1YnN1c191X2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3Vic3VzX3VfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3Vic3VzX3VfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zdWJzdXNfdV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zdWJzdXNfdV9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfc3Vic3V1X3NfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3Vic3V1X3NfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc19zdWJzdXVfc19oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV9zdWJzdXVfc19oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3N1YnN1dV9zX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3N1YnN1dV9zX3ciPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3Vic3V1X3NfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3Vic3V1X3NfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworZGVmIGludF9taXBzX3N1YnZfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3Vidl9iIj4sCisgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3N1YnZfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3Vidl9oIj4sCisgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3N1YnZfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3Vidl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3N1YnZfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3Vidl9kIj4sCisgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X21pcHNfc3VidmlfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3VidmlfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3VidmlfaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3VidmlfaCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3VidmlfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3VidmlfdyI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfc3VidmlfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2Ffc3VidmlfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc192c2hmX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3ZzaGZfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X21pcHNfdnNoZl9oIDogR0NDQnVpbHRpbjwiX19idWlsdGluX21zYV92c2hmX2giPiwKKyAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9taXBzX3ZzaGZfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfdnNoZl93Ij4sCisgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfbWlwc192c2hmX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3ZzaGZfZCI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc194b3JfdiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9tc2FfeG9yX3YiPiwKKyAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisKK2RlZiBpbnRfbWlwc194b3JpX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fbXNhX3hvcmlfYiI+LAorICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47Cit9CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NOVlZNLnRkIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzTlZWTS50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDlhZWJkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzTlZWTS50ZApAQCAtMCwwICsxLDQwNDEgQEAKKy8vPT09LSBJbnRyaW5zaWNzTlZWTS50ZCAtIERlZmluZXMgTlZWTSBpbnRyaW5zaWNzIC0tLS0tLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYWxsIG9mIHRoZSBOVlZNLXNwZWNpZmljIGludHJpbnNpY3MgZm9yIHVzZSB3aXRoIE5WUFRYLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIFRoZSBmb2xsb3dpbmcgaW50cmluc2ljcyB3ZXJlIG9uY2UgZGVmaW5lZCBoZXJlLCBidXQgYXJlIG5vdyBhdXRvLXVwZ3JhZGVkCisvLyB0byB0YXJnZXQtZ2VuZXJpYyBMTFZNIGludHJpbnNpY3MuCisvLworLy8gICAqIGxsdm0ubnZ2bS5icmV2MzIgIC0tPiBsbHZtLmJpdHJldmVyc2UuaTMyCisvLyAgICogbGx2bS5udnZtLmJyZXY2NCAgLS0+IGxsdm0uYml0cmV2ZXJzZS5pNjQKKy8vICAgKiBsbHZtLm52dm0uY2x6LmkgICAtLT4gbGx2bS5jdGx6LmkzMgorLy8gICAqIGxsdm0ubnZ2bS5jbHoubGwgIC0tPiB0cnVuYyBpNjQgbGx2bS5jdGx6Lmk2NCh4KSB0byBpMzIKKy8vICAgKiBsbHZtLm52dm0ucG9wYy5pICAtLT4gbGx2bS5jdHBvcC5pMzIKKy8vICAgKiBsbHZtLm52dm0ucG9wYy5sbCAtLT4gdHJ1bmMgaTY0IGxsdm0uY3Rwb3AuaTY0IHRvIGkzMgorLy8gICAqIGxsdm0ubnZ2bS5hYnMuaSAgIC0tPiBzZWxlY3QoeCA+PSAteCwgeCwgLXgpCisvLyAgICogbGx2bS5udnZtLmFicy5sbCAgLS0+IGliaWQuCisvLyAgICogbGx2bS5udnZtLm1heC5pICAgLS0+IHNlbGVjdCh4IHNnZSB5LCB4LCB5KQorLy8gICAqIGxsdm0ubnZ2bS5tYXgubGwgIC0tPiBpYmlkLgorLy8gICAqIGxsdm0ubnZ2bS5tYXgudWkgIC0tPiBzZWxlY3QoeCB1Z2UgeSwgeCwgeSkKKy8vICAgKiBsbHZtLm52dm0ubWF4LnVsbCAtLT4gaWJpZC4KKy8vICAgKiBsbHZtLm52dm0ubWF4LmkgICAtLT4gc2VsZWN0KHggc2xlIHksIHgsIHkpCisvLyAgICogbGx2bS5udnZtLm1heC5sbCAgLS0+IGliaWQuCisvLyAgICogbGx2bS5udnZtLm1heC51aSAgLS0+IHNlbGVjdCh4IHVsZSB5LCB4LCB5KQorLy8gICAqIGxsdm0ubnZ2bS5tYXgudWxsIC0tPiBpYmlkLgorLy8gICAqIGxsdm0ubnZ2bS5oMmYgICAgIC0tPiBsbHZtLmNvbnZlcnQudG8uZnAxNi5mMzIKKworZGVmIGxsdm1fYW55aTY0cHRyX3R5ICAgICA6IExMVk1BbnlQb2ludGVyVHlwZTxsbHZtX2k2NF90eT47ICAgICAvLyAoc3BhY2UpaTY0KgorCisvLworLy8gTUlTQworLy8KKworbGV0IFRhcmdldFByZWZpeCA9ICJudnZtIiBpbiB7CisgIGRlZiBpbnRfbnZ2bV9wcm10IDogR0NDQnVpbHRpbjwiX19udnZtX3BybXQiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisKKy8vCisvLyBNaW4gTWF4CisvLworCisgIGRlZiBpbnRfbnZ2bV9mbWluX2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZm1pbl9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9mbWluX2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX2ZtaW5fZnR6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworICBkZWYgaW50X252dm1fZm1heF9mIDogR0NDQnVpbHRpbjwiX19udnZtX2ZtYXhfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldCisgICAgICAgICwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX2ZtYXhfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZm1heF9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisgIGRlZiBpbnRfbnZ2bV9mbWluX2QgOiBHQ0NCdWlsdGluPCJfX252dm1fZm1pbl9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5LCBsbHZtX2RvdWJsZV90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9mbWF4X2QgOiBHQ0NCdWlsdGluPCJfX252dm1fZm1heF9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5LCBsbHZtX2RvdWJsZV90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisKKy8vCisvLyBNdWx0aXBsaWNhdGlvbgorLy8KKworICBkZWYgaW50X252dm1fbXVsaGlfaSA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9tdWxoaV9pIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9tdWxoaV91aSA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9tdWxoaV91aSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisgIGRlZiBpbnRfbnZ2bV9tdWxoaV9sbCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9tdWxoaV9sbCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fbXVsaGlfdWxsIDogR0NDQnVpbHRpbjwiX19udnZtX211bGhpX3VsbCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisgIGRlZiBpbnRfbnZ2bV9tdWxfcm5fZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fbXVsX3JuX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9tdWxfcm5fZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9tdWxfcm5fZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fbXVsX3J6X2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX211bF9yel9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fbXVsX3J6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fbXVsX3J6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX211bF9ybV9mdHpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9tdWxfcm1fZnR6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX211bF9ybV9mIDogR0NDQnVpbHRpbjwiX19udnZtX211bF9ybV9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9tdWxfcnBfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fbXVsX3JwX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9tdWxfcnBfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9tdWxfcnBfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisgIGRlZiBpbnRfbnZ2bV9tdWxfcm5fZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9tdWxfcm5fZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eSwgbGx2bV9kb3VibGVfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fbXVsX3J6X2QgOiBHQ0NCdWlsdGluPCJfX252dm1fbXVsX3J6X2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHksIGxsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX211bF9ybV9kIDogR0NDQnVpbHRpbjwiX19udnZtX211bF9ybV9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5LCBsbHZtX2RvdWJsZV90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9tdWxfcnBfZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9tdWxfcnBfZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eSwgbGx2bV9kb3VibGVfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisgIGRlZiBpbnRfbnZ2bV9tdWwyNF9pIDogR0NDQnVpbHRpbjwiX19udnZtX211bDI0X2kiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX211bDI0X3VpIDogR0NDQnVpbHRpbjwiX19udnZtX211bDI0X3VpIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisKKy8vCisvLyBEaXYKKy8vCisKKyAgZGVmIGludF9udnZtX2Rpdl9hcHByb3hfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZGl2X2FwcHJveF9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fZGl2X2FwcHJveF9mIDogR0NDQnVpbHRpbjwiX19udnZtX2Rpdl9hcHByb3hfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisgIGRlZiBpbnRfbnZ2bV9kaXZfcm5fZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZGl2X3JuX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9kaXZfcm5fZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kaXZfcm5fZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisgIGRlZiBpbnRfbnZ2bV9kaXZfcnpfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZGl2X3J6X2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9kaXZfcnpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kaXZfcnpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisgIGRlZiBpbnRfbnZ2bV9kaXZfcm1fZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZGl2X3JtX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9kaXZfcm1fZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kaXZfcm1fZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisgIGRlZiBpbnRfbnZ2bV9kaXZfcnBfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZGl2X3JwX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9kaXZfcnBfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kaXZfcnBfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisgIGRlZiBpbnRfbnZ2bV9kaXZfcm5fZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kaXZfcm5fZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eSwgbGx2bV9kb3VibGVfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fZGl2X3J6X2QgOiBHQ0NCdWlsdGluPCJfX252dm1fZGl2X3J6X2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHksIGxsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX2Rpdl9ybV9kIDogR0NDQnVpbHRpbjwiX19udnZtX2Rpdl9ybV9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5LCBsbHZtX2RvdWJsZV90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9kaXZfcnBfZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kaXZfcnBfZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eSwgbGx2bV9kb3VibGVfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisvLworLy8gU2FkCisvLworCisgIGRlZiBpbnRfbnZ2bV9zYWRfaSA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9zYWRfaSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX3NhZF91aSA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9zYWRfdWkiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisKKy8vCisvLyBGbG9vciAgQ2VpbAorLy8KKworICBkZWYgaW50X252dm1fZmxvb3JfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZmxvb3JfZnR6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZmxvb3JfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mbG9vcl9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2Zsb29yX2QgOiBHQ0NCdWlsdGluPCJfX252dm1fZmxvb3JfZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X252dm1fY2VpbF9mdHpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9jZWlsX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2NlaWxfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9jZWlsX2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fY2VpbF9kIDogR0NDQnVpbHRpbjwiX19udnZtX2NlaWxfZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEFicworLy8KKworICBkZWYgaW50X252dm1fZmFic19mdHpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mYWJzX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2ZhYnNfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mYWJzX2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZmFic19kIDogR0NDQnVpbHRpbjwiX19udnZtX2ZhYnNfZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIFJvdW5kCisvLworCisgIGRlZiBpbnRfbnZ2bV9yb3VuZF9mdHpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9yb3VuZF9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9yb3VuZF9mIDogR0NDQnVpbHRpbjwiX19udnZtX3JvdW5kX2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfbnZ2bV9yb3VuZF9kIDogR0NDQnVpbHRpbjwiX19udnZtX3JvdW5kX2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisKKy8vCisvLyBUcnVuYworLy8KKworICBkZWYgaW50X252dm1fdHJ1bmNfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fdHJ1bmNfZnR6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fdHJ1bmNfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV90cnVuY19mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X252dm1fdHJ1bmNfZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV90cnVuY19kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworCisvLworLy8gU2F0dXJhdGUKKy8vCisKKyAgZGVmIGludF9udnZtX3NhdHVyYXRlX2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX3NhdHVyYXRlX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3NhdHVyYXRlX2YgOiBHQ0NCdWlsdGluPCJfX252dm1fc2F0dXJhdGVfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9udnZtX3NhdHVyYXRlX2QgOiBHQ0NCdWlsdGluPCJfX252dm1fc2F0dXJhdGVfZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEV4cDIgIExvZzIKKy8vCisKKyAgZGVmIGludF9udnZtX2V4Ml9hcHByb3hfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZXgyX2FwcHJveF9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9leDJfYXBwcm94X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZXgyX2FwcHJveF9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2V4Ml9hcHByb3hfZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9leDJfYXBwcm94X2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9udnZtX2xnMl9hcHByb3hfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fbGcyX2FwcHJveF9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9sZzJfYXBwcm94X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fbGcyX2FwcHJveF9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2xnMl9hcHByb3hfZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9sZzJfYXBwcm94X2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisKKy8vCisvLyBTaW4gIENvcworLy8KKworICBkZWYgaW50X252dm1fc2luX2FwcHJveF9mdHpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9zaW5fYXBwcm94X2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3Npbl9hcHByb3hfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9zaW5fYXBwcm94X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfbnZ2bV9jb3NfYXBwcm94X2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX2Nvc19hcHByb3hfZnR6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fY29zX2FwcHJveF9mIDogR0NDQnVpbHRpbjwiX19udnZtX2Nvc19hcHByb3hfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisKKy8vCisvLyBGbWEKKy8vCisKKyAgZGVmIGludF9udnZtX2ZtYV9ybl9mdHpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mbWFfcm5fZnR6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX2ZtYV9ybl9mIDogR0NDQnVpbHRpbjwiX19udnZtX2ZtYV9ybl9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9mbWFfcnpfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZm1hX3J6X2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9mbWFfcnpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mbWFfcnpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fZm1hX3JtX2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX2ZtYV9ybV9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fZm1hX3JtX2YgOiBHQ0NCdWlsdGluPCJfX252dm1fZm1hX3JtX2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX2ZtYV9ycF9mdHpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mbWFfcnBfZnR6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX2ZtYV9ycF9mIDogR0NDQnVpbHRpbjwiX19udnZtX2ZtYV9ycF9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisKKyAgZGVmIGludF9udnZtX2ZtYV9ybl9kIDogR0NDQnVpbHRpbjwiX19udnZtX2ZtYV9ybl9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgW2xsdm1fZG91YmxlX3R5LCBsbHZtX2RvdWJsZV90eSwgbGx2bV9kb3VibGVfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fZm1hX3J6X2QgOiBHQ0NCdWlsdGluPCJfX252dm1fZm1hX3J6X2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLAorICAgICAgICBbbGx2bV9kb3VibGVfdHksIGxsdm1fZG91YmxlX3R5LCBsbHZtX2RvdWJsZV90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9mbWFfcm1fZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mbWFfcm1fZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sCisgICAgICAgIFtsbHZtX2RvdWJsZV90eSwgbGx2bV9kb3VibGVfdHksIGxsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX2ZtYV9ycF9kIDogR0NDQnVpbHRpbjwiX19udnZtX2ZtYV9ycF9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgW2xsdm1fZG91YmxlX3R5LCBsbHZtX2RvdWJsZV90eSwgbGx2bV9kb3VibGVfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisvLworLy8gUmNwCisvLworCisgIGRlZiBpbnRfbnZ2bV9yY3Bfcm5fZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fcmNwX3JuX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3JjcF9ybl9mIDogR0NDQnVpbHRpbjwiX19udnZtX3JjcF9ybl9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3JjcF9yel9mdHpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9yY3BfcnpfZnR6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fcmNwX3J6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fcmNwX3J6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fcmNwX3JtX2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX3JjcF9ybV9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9yY3Bfcm1fZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9yY3Bfcm1fZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9yY3BfcnBfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fcmNwX3JwX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3JjcF9ycF9mIDogR0NDQnVpbHRpbjwiX19udnZtX3JjcF9ycF9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X252dm1fcmNwX3JuX2QgOiBHQ0NCdWlsdGluPCJfX252dm1fcmNwX3JuX2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9yY3BfcnpfZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9yY3BfcnpfZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3JjcF9ybV9kIDogR0NDQnVpbHRpbjwiX19udnZtX3JjcF9ybV9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fcmNwX3JwX2QgOiBHQ0NCdWlsdGluPCJfX252dm1fcmNwX3JwX2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9udnZtX3JjcF9hcHByb3hfZnR6X2QgOiBHQ0NCdWlsdGluPCJfX252dm1fcmNwX2FwcHJveF9mdHpfZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIFNxcnQKKy8vCisKKyAgZGVmIGludF9udnZtX3NxcnRfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9zcXJ0X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fc3FydF9ybl9mdHpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9zcXJ0X3JuX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3NxcnRfcm5fZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9zcXJ0X3JuX2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fc3FydF9yel9mdHpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9zcXJ0X3J6X2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3NxcnRfcnpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9zcXJ0X3J6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fc3FydF9ybV9mdHpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9zcXJ0X3JtX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3NxcnRfcm1fZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9zcXJ0X3JtX2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fc3FydF9ycF9mdHpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9zcXJ0X3JwX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3NxcnRfcnBfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9zcXJ0X3JwX2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fc3FydF9hcHByb3hfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fc3FydF9hcHByb3hfZnR6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fc3FydF9hcHByb3hfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9zcXJ0X2FwcHJveF9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X252dm1fc3FydF9ybl9kIDogR0NDQnVpbHRpbjwiX19udnZtX3NxcnRfcm5fZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3NxcnRfcnpfZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9zcXJ0X3J6X2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9zcXJ0X3JtX2QgOiBHQ0NCdWlsdGluPCJfX252dm1fc3FydF9ybV9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fc3FydF9ycF9kIDogR0NDQnVpbHRpbjwiX19udnZtX3NxcnRfcnBfZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIFJzcXJ0CisvLworCisgIGRlZiBpbnRfbnZ2bV9yc3FydF9hcHByb3hfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fcnNxcnRfYXBwcm94X2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3JzcXJ0X2FwcHJveF9mIDogR0NDQnVpbHRpbjwiX19udnZtX3JzcXJ0X2FwcHJveF9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3JzcXJ0X2FwcHJveF9kIDogR0NDQnVpbHRpbjwiX19udnZtX3JzcXJ0X2FwcHJveF9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworCisvLworLy8gQWRkCisvLworCisgIGRlZiBpbnRfbnZ2bV9hZGRfcm5fZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fYWRkX3JuX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9hZGRfcm5fZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9hZGRfcm5fZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fYWRkX3J6X2Z0el9mIDogR0NDQnVpbHRpbjwiX19udnZtX2FkZF9yel9mdHpfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fYWRkX3J6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fYWRkX3J6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX2FkZF9ybV9mdHpfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9hZGRfcm1fZnR6X2YiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX2FkZF9ybV9mIDogR0NDQnVpbHRpbjwiX19udnZtX2FkZF9ybV9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9hZGRfcnBfZnR6X2YgOiBHQ0NCdWlsdGluPCJfX252dm1fYWRkX3JwX2Z0el9mIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9hZGRfcnBfZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9hZGRfcnBfZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisgIGRlZiBpbnRfbnZ2bV9hZGRfcm5fZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9hZGRfcm5fZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eSwgbGx2bV9kb3VibGVfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X252dm1fYWRkX3J6X2QgOiBHQ0NCdWlsdGluPCJfX252dm1fYWRkX3J6X2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHksIGxsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF9udnZtX2FkZF9ybV9kIDogR0NDQnVpbHRpbjwiX19udnZtX2FkZF9ybV9kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1fZG91YmxlX3R5LCBsbHZtX2RvdWJsZV90eV0sCisgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfbnZ2bV9hZGRfcnBfZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9hZGRfcnBfZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eSwgbGx2bV9kb3VibGVfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisvLworLy8gQ29udmVydAorLy8KKworICBkZWYgaW50X252dm1fZDJmX3JuX2Z0eiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kMmZfcm5fZnR6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9kMmZfcm4gOiBHQ0NCdWlsdGluPCJfX252dm1fZDJmX3JuIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9kMmZfcnpfZnR6IDogR0NDQnVpbHRpbjwiX19udnZtX2QyZl9yel9mdHoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2QyZl9yeiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kMmZfcnoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2QyZl9ybV9mdHogOiBHQ0NCdWlsdGluPCJfX252dm1fZDJmX3JtX2Z0eiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZDJmX3JtIDogR0NDQnVpbHRpbjwiX19udnZtX2QyZl9ybSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZDJmX3JwX2Z0eiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kMmZfcnBfZnR6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9kMmZfcnAgOiBHQ0NCdWlsdGluPCJfX252dm1fZDJmX3JwIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9udnZtX2QyaV9ybiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kMmlfcm4iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9kMmlfcnogOiBHQ0NCdWlsdGluPCJfX252dm1fZDJpX3J6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZDJpX3JtIDogR0NDQnVpbHRpbjwiX19udnZtX2QyaV9ybSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2QyaV9ycCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kMmlfcnAiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9udnZtX2QydWlfcm4gOiBHQ0NCdWlsdGluPCJfX252dm1fZDJ1aV9ybiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2QydWlfcnogOiBHQ0NCdWlsdGluPCJfX252dm1fZDJ1aV9yeiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2QydWlfcm0gOiBHQ0NCdWlsdGluPCJfX252dm1fZDJ1aV9ybSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2QydWlfcnAgOiBHQ0NCdWlsdGluPCJfX252dm1fZDJ1aV9ycCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X252dm1faTJkX3JuIDogR0NDQnVpbHRpbjwiX19udnZtX2kyZF9ybiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2kyZF9yeiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9pMmRfcnoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9pMmRfcm0gOiBHQ0NCdWlsdGluPCJfX252dm1faTJkX3JtIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1faTJkX3JwIDogR0NDQnVpbHRpbjwiX19udnZtX2kyZF9ycCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X252dm1fdWkyZF9ybiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV91aTJkX3JuIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fdWkyZF9yeiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV91aTJkX3J6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fdWkyZF9ybSA6IEdDQ0J1aWx0aW48Il9fbnZ2bV91aTJkX3JtIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fdWkyZF9ycCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV91aTJkX3JwIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfbnZ2bV9mMmlfcm5fZnR6IDogR0NDQnVpbHRpbjwiX19udnZtX2YyaV9ybl9mdHoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YyaV9ybiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mMmlfcm4iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YyaV9yel9mdHogOiBHQ0NCdWlsdGluPCJfX252dm1fZjJpX3J6X2Z0eiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZjJpX3J6IDogR0NDQnVpbHRpbjwiX19udnZtX2YyaV9yeiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZjJpX3JtX2Z0eiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mMmlfcm1fZnR6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mMmlfcm0gOiBHQ0NCdWlsdGluPCJfX252dm1fZjJpX3JtIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mMmlfcnBfZnR6IDogR0NDQnVpbHRpbjwiX19udnZtX2YyaV9ycF9mdHoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YyaV9ycCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mMmlfcnAiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X252dm1fZjJ1aV9ybl9mdHogOiBHQ0NCdWlsdGluPCJfX252dm1fZjJ1aV9ybl9mdHoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YydWlfcm4gOiBHQ0NCdWlsdGluPCJfX252dm1fZjJ1aV9ybiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZjJ1aV9yel9mdHogOiBHQ0NCdWlsdGluPCJfX252dm1fZjJ1aV9yel9mdHoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YydWlfcnogOiBHQ0NCdWlsdGluPCJfX252dm1fZjJ1aV9yeiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZjJ1aV9ybV9mdHogOiBHQ0NCdWlsdGluPCJfX252dm1fZjJ1aV9ybV9mdHoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YydWlfcm0gOiBHQ0NCdWlsdGluPCJfX252dm1fZjJ1aV9ybSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZjJ1aV9ycF9mdHogOiBHQ0NCdWlsdGluPCJfX252dm1fZjJ1aV9ycF9mdHoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YydWlfcnAgOiBHQ0NCdWlsdGluPCJfX252dm1fZjJ1aV9ycCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfbnZ2bV9pMmZfcm4gOiBHQ0NCdWlsdGluPCJfX252dm1faTJmX3JuIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9pMmZfcnogOiBHQ0NCdWlsdGluPCJfX252dm1faTJmX3J6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9pMmZfcm0gOiBHQ0NCdWlsdGluPCJfX252dm1faTJmX3JtIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9pMmZfcnAgOiBHQ0NCdWlsdGluPCJfX252dm1faTJmX3JwIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9udnZtX3VpMmZfcm4gOiBHQ0NCdWlsdGluPCJfX252dm1fdWkyZl9ybiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fdWkyZl9yeiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV91aTJmX3J6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV91aTJmX3JtIDogR0NDQnVpbHRpbjwiX19udnZtX3VpMmZfcm0iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3VpMmZfcnAgOiBHQ0NCdWlsdGluPCJfX252dm1fdWkyZl9ycCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfbnZ2bV9sb2hpX2kyZCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9sb2hpX2kyZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisgIGRlZiBpbnRfbnZ2bV9kMmlfbG8gOiBHQ0NCdWlsdGluPCJfX252dm1fZDJpX2xvIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZDJpX2hpIDogR0NDQnVpbHRpbjwiX19udnZtX2QyaV9oaSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X252dm1fZjJsbF9ybl9mdHogOiBHQ0NCdWlsdGluPCJfX252dm1fZjJsbF9ybl9mdHoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YybGxfcm4gOiBHQ0NCdWlsdGluPCJfX252dm1fZjJsbF9ybiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZjJsbF9yel9mdHogOiBHQ0NCdWlsdGluPCJfX252dm1fZjJsbF9yel9mdHoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YybGxfcnogOiBHQ0NCdWlsdGluPCJfX252dm1fZjJsbF9yeiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZjJsbF9ybV9mdHogOiBHQ0NCdWlsdGluPCJfX252dm1fZjJsbF9ybV9mdHoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YybGxfcm0gOiBHQ0NCdWlsdGluPCJfX252dm1fZjJsbF9ybSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZjJsbF9ycF9mdHogOiBHQ0NCdWlsdGluPCJfX252dm1fZjJsbF9ycF9mdHoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YybGxfcnAgOiBHQ0NCdWlsdGluPCJfX252dm1fZjJsbF9ycCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfbnZ2bV9mMnVsbF9ybl9mdHogOiBHQ0NCdWlsdGluPCJfX252dm1fZjJ1bGxfcm5fZnR6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mMnVsbF9ybiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mMnVsbF9ybiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZjJ1bGxfcnpfZnR6IDogR0NDQnVpbHRpbjwiX19udnZtX2YydWxsX3J6X2Z0eiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZjJ1bGxfcnogOiBHQ0NCdWlsdGluPCJfX252dm1fZjJ1bGxfcnoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YydWxsX3JtX2Z0eiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mMnVsbF9ybV9mdHoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YydWxsX3JtIDogR0NDQnVpbHRpbjwiX19udnZtX2YydWxsX3JtIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mMnVsbF9ycF9mdHogOiBHQ0NCdWlsdGluPCJfX252dm1fZjJ1bGxfcnBfZnR6Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9mMnVsbF9ycCA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mMnVsbF9ycCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfbnZ2bV9kMmxsX3JuIDogR0NDQnVpbHRpbjwiX19udnZtX2QybGxfcm4iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9kMmxsX3J6IDogR0NDQnVpbHRpbjwiX19udnZtX2QybGxfcnoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9kMmxsX3JtIDogR0NDQnVpbHRpbjwiX19udnZtX2QybGxfcm0iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9kMmxsX3JwIDogR0NDQnVpbHRpbjwiX19udnZtX2QybGxfcnAiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9udnZtX2QydWxsX3JuIDogR0NDQnVpbHRpbjwiX19udnZtX2QydWxsX3JuIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fZDJ1bGxfcnogOiBHQ0NCdWlsdGluPCJfX252dm1fZDJ1bGxfcnoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9kb3VibGVfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9kMnVsbF9ybSA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9kMnVsbF9ybSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2QydWxsX3JwIDogR0NDQnVpbHRpbjwiX19udnZtX2QydWxsX3JwIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fZG91YmxlX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfbnZ2bV9sbDJmX3JuIDogR0NDQnVpbHRpbjwiX19udnZtX2xsMmZfcm4iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2xsMmZfcnogOiBHQ0NCdWlsdGluPCJfX252dm1fbGwyZl9yeiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fbGwyZl9ybSA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9sbDJmX3JtIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9sbDJmX3JwIDogR0NDQnVpbHRpbjwiX19udnZtX2xsMmZfcnAiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3VsbDJmX3JuIDogR0NDQnVpbHRpbjwiX19udnZtX3VsbDJmX3JuIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV91bGwyZl9yeiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV91bGwyZl9yeiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fdWxsMmZfcm0gOiBHQ0NCdWlsdGluPCJfX252dm1fdWxsMmZfcm0iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3VsbDJmX3JwIDogR0NDQnVpbHRpbjwiX19udnZtX3VsbDJmX3JwIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9udnZtX2xsMmRfcm4gOiBHQ0NCdWlsdGluPCJfX252dm1fbGwyZF9ybiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2xsMmRfcnogOiBHQ0NCdWlsdGluPCJfX252dm1fbGwyZF9yeiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2xsMmRfcm0gOiBHQ0NCdWlsdGluPCJfX252dm1fbGwyZF9ybSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2xsMmRfcnAgOiBHQ0NCdWlsdGluPCJfX252dm1fbGwyZF9ycCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3VsbDJkX3JuIDogR0NDQnVpbHRpbjwiX19udnZtX3VsbDJkX3JuIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fdWxsMmRfcnogOiBHQ0NCdWlsdGluPCJfX252dm1fdWxsMmRfcnoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV91bGwyZF9ybSA6IEdDQ0J1aWx0aW48Il9fbnZ2bV91bGwyZF9ybSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX3VsbDJkX3JwIDogR0NDQnVpbHRpbjwiX19udnZtX3VsbDJkX3JwIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfbnZ2bV9mMmhfcm5fZnR6IDogR0NDQnVpbHRpbjwiX19udnZtX2YyaF9ybl9mdHoiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMTZfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9udnZtX2YyaF9ybiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mMmhfcm4iPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMTZfdHldLCBbbGx2bV9mbG9hdF90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8KKy8vIEJpdGNhc3QKKy8vCisKKyAgZGVmIGludF9udnZtX2JpdGNhc3RfZjJpIDogR0NDQnVpbHRpbjwiX19udnZtX2JpdGNhc3RfZjJpIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fZmxvYXRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfbnZ2bV9iaXRjYXN0X2kyZiA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9iaXRjYXN0X2kyZiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfbnZ2bV9iaXRjYXN0X2xsMmQgOiBHQ0NCdWlsdGluPCJfX252dm1fYml0Y2FzdF9sbDJkIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fZG91YmxlX3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X252dm1fYml0Y2FzdF9kMmxsIDogR0NDQnVpbHRpbjwiX19udnZtX2JpdGNhc3RfZDJsbCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2RvdWJsZV90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8gRk5TCisKKyAgZGVmIGludF9udnZtX2ZucyA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9mbnMiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLyBBdG9taWNzIG5vdCBhdmFpbGFibGUgYXMgbGx2bSBpbnRyaW5zaWNzLgorICBkZWYgaW50X252dm1fYXRvbWljX2xvYWRfYWRkX2YzMiA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgW0xMVk1BbnlQb2ludGVyVHlwZTxsbHZtX2Zsb2F0X3R5PiwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+XT47CisgIC8vIEF0b21pYyBhZGQgb2YgZjY0IHJlcXVpcmVzIHNtXzYwLgorICBkZWYgaW50X252dm1fYXRvbWljX2xvYWRfYWRkX2Y2NCA6IEludHJpbnNpYzxbbGx2bV9kb3VibGVfdHldLAorICAgICAgICAgIFtMTFZNQW55UG9pbnRlclR5cGU8bGx2bV9kb3VibGVfdHk+LCBsbHZtX2RvdWJsZV90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+XT47CisKKyAgZGVmIGludF9udnZtX2F0b21pY19sb2FkX2luY18zMiA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtMTFZNQW55UG9pbnRlclR5cGU8bGx2bV9pMzJfdHk+LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+XT47CisgIGRlZiBpbnRfbnZ2bV9hdG9taWNfbG9hZF9kZWNfMzIgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgICBbTExWTUFueVBvaW50ZXJUeXBlPGxsdm1faTMyX3R5PiwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwwPl0+OworCisgIGNsYXNzIFNDT1BFRF9BVE9NSUMyX2ltcGw8TExWTVR5cGUgZWx0eT4KKyAgICAgICAgOiBJbnRyaW5zaWM8W2VsdHldLAorICAgICAgICAgIFtMTFZNQW55UG9pbnRlclR5cGU8TExWTU1hdGNoVHlwZTwwPj4sIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+XT47CisgIGNsYXNzIFNDT1BFRF9BVE9NSUMzX2ltcGw8TExWTVR5cGUgZWx0eT4KKyAgICAgICAgOiBJbnRyaW5zaWM8W2VsdHldLAorICAgICAgICAgIFtMTFZNQW55UG9pbnRlclR5cGU8TExWTU1hdGNoVHlwZTwwPj4sIExMVk1NYXRjaFR5cGU8MD4sCisgICAgICAgICAgIExMVk1NYXRjaFR5cGU8MD5dLAorICAgICAgICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+XT47CisKKyAgbXVsdGljbGFzcyBQVFhBdG9taWNXaXRoU2NvcGUyPExMVk1UeXBlIGVsdHk+IHsKKyAgICBkZWYgX2N0YSA6IFNDT1BFRF9BVE9NSUMyX2ltcGw8ZWx0eT47CisgICAgZGVmIF9zeXMgOiBTQ09QRURfQVRPTUlDMl9pbXBsPGVsdHk+OworICB9CisgIG11bHRpY2xhc3MgUFRYQXRvbWljV2l0aFNjb3BlMzxMTFZNVHlwZSBlbHR5PiB7CisgICAgZGVmIF9jdGEgOiBTQ09QRURfQVRPTUlDM19pbXBsPGVsdHk+OworICAgIGRlZiBfc3lzIDogU0NPUEVEX0FUT01JQzNfaW1wbDxlbHR5PjsKKyAgfQorICBtdWx0aWNsYXNzIFBUWEF0b21pY1dpdGhTY29wZTJfZmkgeworICAgIGRlZm0gX2Y6IFBUWEF0b21pY1dpdGhTY29wZTI8bGx2bV9hbnlmbG9hdF90eT47CisgICAgZGVmbSBfaTogUFRYQXRvbWljV2l0aFNjb3BlMjxsbHZtX2FueWludF90eT47CisgIH0KKyAgZGVmbSBpbnRfbnZ2bV9hdG9taWNfYWRkX2dlbiAgIDogUFRYQXRvbWljV2l0aFNjb3BlMl9maTsKKyAgZGVmbSBpbnRfbnZ2bV9hdG9taWNfaW5jX2dlbl9pIDogUFRYQXRvbWljV2l0aFNjb3BlMjxsbHZtX2FueWludF90eT47CisgIGRlZm0gaW50X252dm1fYXRvbWljX2RlY19nZW5faSA6IFBUWEF0b21pY1dpdGhTY29wZTI8bGx2bV9hbnlpbnRfdHk+OworICBkZWZtIGludF9udnZtX2F0b21pY19leGNoX2dlbl9pOiBQVFhBdG9taWNXaXRoU2NvcGUyPGxsdm1fYW55aW50X3R5PjsKKyAgZGVmbSBpbnRfbnZ2bV9hdG9taWNfeG9yX2dlbl9pIDogUFRYQXRvbWljV2l0aFNjb3BlMjxsbHZtX2FueWludF90eT47CisgIGRlZm0gaW50X252dm1fYXRvbWljX21heF9nZW5faSA6IFBUWEF0b21pY1dpdGhTY29wZTI8bGx2bV9hbnlpbnRfdHk+OworICBkZWZtIGludF9udnZtX2F0b21pY19taW5fZ2VuX2kgOiBQVFhBdG9taWNXaXRoU2NvcGUyPGxsdm1fYW55aW50X3R5PjsKKyAgZGVmbSBpbnRfbnZ2bV9hdG9taWNfb3JfZ2VuX2kgIDogUFRYQXRvbWljV2l0aFNjb3BlMjxsbHZtX2FueWludF90eT47CisgIGRlZm0gaW50X252dm1fYXRvbWljX2FuZF9nZW5faSA6IFBUWEF0b21pY1dpdGhTY29wZTI8bGx2bV9hbnlpbnRfdHk+OworICBkZWZtIGludF9udnZtX2F0b21pY19jYXNfZ2VuX2kgOiBQVFhBdG9taWNXaXRoU2NvcGUzPGxsdm1fYW55aW50X3R5PjsKKworLy8gQmFyLlN5bmMKKworICAvLyBUaGUgYnVpbHRpbiBmb3IgImJhci5zeW5jIDAiIGlzIGNhbGxlZCBfX3N5bmN0aHJlYWRzLiAgVW5saWtlIG1vc3Qgb2YgdGhlCisgIC8vIGludHJpbnNpY3MgaW4gdGhpcyBmaWxlLCB0aGlzIG9uZSBpcyBhIHVzZXItZmFjaW5nIEFQSS4KKyAgZGVmIGludF9udnZtX2JhcnJpZXIwIDogR0NDQnVpbHRpbjwiX19zeW5jdGhyZWFkcyI+LAorICAgICAgSW50cmluc2ljPFtdLCBbXSwgW0ludHJDb252ZXJnZW50XT47CisgIC8vIFN5bmNocm9uaXplIGFsbCB0aHJlYWRzIGluIHRoZSBDVEEgYXQgYmFycmllciAnbicuCisgIGRlZiBpbnRfbnZ2bV9iYXJyaWVyX24gOiBHQ0NCdWlsdGluPCJfX252dm1fYmFyX24iPiwKKyAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XSwgW0ludHJDb252ZXJnZW50XT47CisgIC8vIFN5bmNocm9uaXplICdtJywgYSBtdWx0aXBsZSBvZiB3YXJwIHNpemUsIChhcmcgMikgdGhyZWFkcyBpbgorICAvLyB0aGUgQ1RBIGF0IGJhcnJpZXIgJ24nIChhcmcgMSkuCisgIGRlZiBpbnRfbnZ2bV9iYXJyaWVyIDogR0NDQnVpbHRpbjwiX19udnZtX2JhciI+LAorICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJDb252ZXJnZW50XT47CisgIGRlZiBpbnRfbnZ2bV9iYXJyaWVyMF9wb3BjIDogR0NDQnVpbHRpbjwiX19udnZtX2JhcjBfcG9wYyI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eV0sIFtJbnRyQ29udmVyZ2VudF0+OworICBkZWYgaW50X252dm1fYmFycmllcjBfYW5kIDogR0NDQnVpbHRpbjwiX19udnZtX2JhcjBfYW5kIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJDb252ZXJnZW50XT47CisgIGRlZiBpbnRfbnZ2bV9iYXJyaWVyMF9vciA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9iYXIwX29yIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJDb252ZXJnZW50XT47CisKKyAgZGVmIGludF9udnZtX2Jhcl9zeW5jIDoKKyAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XSwgW0ludHJDb252ZXJnZW50XT4sCisgICAgICBHQ0NCdWlsdGluPCJfX252dm1fYmFyX3N5bmMiPjsKKyAgZGVmIGludF9udnZtX2Jhcl93YXJwX3N5bmMgOgorICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHldLCBbSW50ckNvbnZlcmdlbnRdPiwKKyAgICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9iYXJfd2FycF9zeW5jIj47CisKKyAgLy8gYmFycmllci5zeW5jIGlkWywgY250XQorICBkZWYgaW50X252dm1fYmFycmllcl9zeW5jIDoKKyAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XSwgW0ludHJDb252ZXJnZW50XT4sCisgICAgICBHQ0NCdWlsdGluPCJfX252dm1fYmFycmllcl9zeW5jIj47CisgIGRlZiBpbnRfbnZ2bV9iYXJyaWVyX3N5bmNfY250IDoKKyAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyQ29udmVyZ2VudF0+LAorICAgICAgR0NDQnVpbHRpbjwiX19udnZtX2JhcnJpZXJfc3luY19jbnQiPjsKKworICAvLyBNZW1iYXIKKyAgZGVmIGludF9udnZtX21lbWJhcl9jdGEgOiBHQ0NCdWlsdGluPCJfX252dm1fbWVtYmFyX2N0YSI+LAorICAgICAgSW50cmluc2ljPFtdLCBbXSwgW10+OworICBkZWYgaW50X252dm1fbWVtYmFyX2dsIDogR0NDQnVpbHRpbjwiX19udnZtX21lbWJhcl9nbCI+LAorICAgICAgSW50cmluc2ljPFtdLCBbXSwgW10+OworICBkZWYgaW50X252dm1fbWVtYmFyX3N5cyA6IEdDQ0J1aWx0aW48Il9fbnZ2bV9tZW1iYXJfc3lzIj4sCisgICAgICBJbnRyaW5zaWM8W10sIFtdLCBbXT47CisKKy8vIEdlbmVyYXRlZCB3aXRoaW4gbnZ2bS4gVXNlIGZvciBsZHUgb24gc21fMjAgb3IgbGF0ZXIuICBTZWNvbmQgYXJnIGlzIHRoZQorLy8gcG9pbnRlcidzIGFsaWdubWVudC4KK2RlZiBpbnRfbnZ2bV9sZHVfZ2xvYmFsX2kgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwKKyAgW0xMVk1BbnlQb2ludGVyVHlwZTxMTFZNTWF0Y2hUeXBlPDA+PiwgbGx2bV9pMzJfdHldLAorICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8MD5dLAorICAibGx2bS5udnZtLmxkdS5nbG9iYWwuaSI+OworZGVmIGludF9udnZtX2xkdV9nbG9iYWxfZiA6IEludHJpbnNpYzxbbGx2bV9hbnlmbG9hdF90eV0sCisgIFtMTFZNQW55UG9pbnRlclR5cGU8TExWTU1hdGNoVHlwZTwwPj4sIGxsdm1faTMyX3R5XSwKKyAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+XSwKKyAgImxsdm0ubnZ2bS5sZHUuZ2xvYmFsLmYiPjsKK2RlZiBpbnRfbnZ2bV9sZHVfZ2xvYmFsX3AgOiBJbnRyaW5zaWM8W2xsdm1fYW55cHRyX3R5XSwKKyAgW0xMVk1BbnlQb2ludGVyVHlwZTxMTFZNTWF0Y2hUeXBlPDA+PiwgbGx2bV9pMzJfdHldLAorICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5LCBOb0NhcHR1cmU8MD5dLAorICAibGx2bS5udnZtLmxkdS5nbG9iYWwucCI+OworCisvLyBHZW5lcmF0ZWQgd2l0aGluIG52dm0uIFVzZSBmb3IgbGRnIG9uIHNtXzM1IG9yIGxhdGVyLiAgU2Vjb25kIGFyZyBpcyB0aGUKKy8vIHBvaW50ZXIncyBhbGlnbm1lbnQuCitkZWYgaW50X252dm1fbGRnX2dsb2JhbF9pIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sCisgIFtMTFZNQW55UG9pbnRlclR5cGU8TExWTU1hdGNoVHlwZTwwPj4sIGxsdm1faTMyX3R5XSwKKyAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+XSwKKyAgImxsdm0ubnZ2bS5sZGcuZ2xvYmFsLmkiPjsKK2RlZiBpbnRfbnZ2bV9sZGdfZ2xvYmFsX2YgOiBJbnRyaW5zaWM8W2xsdm1fYW55ZmxvYXRfdHldLAorICBbTExWTUFueVBvaW50ZXJUeXBlPExMVk1NYXRjaFR5cGU8MD4+LCBsbHZtX2kzMl90eV0sCisgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHksIE5vQ2FwdHVyZTwwPl0sCisgICJsbHZtLm52dm0ubGRnLmdsb2JhbC5mIj47CitkZWYgaW50X252dm1fbGRnX2dsb2JhbF9wIDogSW50cmluc2ljPFtsbHZtX2FueXB0cl90eV0sCisgIFtMTFZNQW55UG9pbnRlclR5cGU8TExWTU1hdGNoVHlwZTwwPj4sIGxsdm1faTMyX3R5XSwKKyAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+XSwKKyAgImxsdm0ubnZ2bS5sZGcuZ2xvYmFsLnAiPjsKKworLy8gVXNlIGZvciBnZW5lcmljIHBvaW50ZXJzCisvLyAtIFRoZXNlIGludHJpbnNpY3MgYXJlIHVzZWQgdG8gY29udmVydCBhZGRyZXNzIHNwYWNlcy4KKy8vIC0gVGhlIGlucHV0IHBvaW50ZXIgYW5kIG91dHB1dCBwb2ludGVyIG11c3QgaGF2ZSB0aGUgc2FtZSB0eXBlLCBleGNlcHQgZm9yCisvLyAgIHRoZSBhZGRyZXNzLXNwYWNlLiAoVGhpcyByZXN0cmljdGlvbiBpcyBub3QgZW5mb3JjZWQgaGVyZSBhcyB0aGVyZSBpcworLy8gICBjdXJyZW50bHkgbm8gd2F5IHRvIGRlc2NyaWJlIGl0KS4KKy8vIC0gVGhpcyBjb21wbGVtZW50cyB0aGUgbGx2bSBiaXRjYXN0LCB3aGljaCBjYW4gYmUgdXNlZCB0byBjYXN0IG9uZSB0eXBlCisvLyAgIG9mIHBvaW50ZXIgdG8gYW5vdGhlciB0eXBlIG9mIHBvaW50ZXIsIHdoaWxlIHRoZSBhZGRyZXNzIHNwYWNlIHJlbWFpbnMKKy8vICAgdGhlIHNhbWUuCitkZWYgaW50X252dm1fcHRyX2xvY2FsX3RvX2dlbjogSW50cmluc2ljPFtsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgIFtsbHZtX2FueXB0cl90eV0sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAgICAibGx2bS5udnZtLnB0ci5sb2NhbC50by5nZW4iPjsKK2RlZiBpbnRfbnZ2bV9wdHJfc2hhcmVkX3RvX2dlbjogSW50cmluc2ljPFtsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgIFtsbHZtX2FueXB0cl90eV0sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAgICAibGx2bS5udnZtLnB0ci5zaGFyZWQudG8uZ2VuIj47CitkZWYgaW50X252dm1fcHRyX2dsb2JhbF90b19nZW46IEludHJpbnNpYzxbbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHldLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgICAgImxsdm0ubnZ2bS5wdHIuZ2xvYmFsLnRvLmdlbiI+OworZGVmIGludF9udnZtX3B0cl9jb25zdGFudF90b19nZW46IEludHJpbnNpYzxbbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHldLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgICAgImxsdm0ubnZ2bS5wdHIuY29uc3RhbnQudG8uZ2VuIj47CisKK2RlZiBpbnRfbnZ2bV9wdHJfZ2VuX3RvX2dsb2JhbDogSW50cmluc2ljPFtsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgIFtsbHZtX2FueXB0cl90eV0sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAgICAibGx2bS5udnZtLnB0ci5nZW4udG8uZ2xvYmFsIj47CitkZWYgaW50X252dm1fcHRyX2dlbl90b19zaGFyZWQ6IEludHJpbnNpYzxbbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHldLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgICAgImxsdm0ubnZ2bS5wdHIuZ2VuLnRvLnNoYXJlZCI+OworZGVmIGludF9udnZtX3B0cl9nZW5fdG9fbG9jYWw6IEludHJpbnNpYzxbbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICBbbGx2bV9hbnlwdHJfdHldLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgICAgImxsdm0ubnZ2bS5wdHIuZ2VuLnRvLmxvY2FsIj47CitkZWYgaW50X252dm1fcHRyX2dlbl90b19jb25zdGFudDogSW50cmluc2ljPFtsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgIFtsbHZtX2FueXB0cl90eV0sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAgICAibGx2bS5udnZtLnB0ci5nZW4udG8uY29uc3RhbnQiPjsKKworLy8gVXNlZCBpbiBudnZtIGludGVybmFsbHkgdG8gaGVscCBhZGRyZXNzIHNwYWNlIG9wdCBhbmQgcHR4IGNvZGUgZ2VuZXJhdGlvbgorLy8gVGhpcyBpcyBmb3IgcGFyYW1zIHRoYXQgYXJlIHBhc3NlZCB0byBrZXJuZWwgZnVuY3Rpb25zIGJ5IHBvaW50ZXIgYnktdmFsLgorZGVmIGludF9udnZtX3B0cl9nZW5fdG9fcGFyYW06IEludHJpbnNpYzxbbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGx2bS5udnZtLnB0ci5nZW4udG8ucGFyYW0iPjsKKworLy8gTW92ZSBpbnRyaW5zaWNzLCB1c2VkIGluIG52dm0gaW50ZXJuYWxseQorCitkZWYgaW50X252dm1fbW92ZV9pMTYgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwgW2xsdm1faTE2X3R5XSwgW0ludHJOb01lbV0sCisgICJsbHZtLm52dm0ubW92ZS5pMTYiPjsKK2RlZiBpbnRfbnZ2bV9tb3ZlX2kzMiA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXSwKKyAgImxsdm0ubnZ2bS5tb3ZlLmkzMiI+OworZGVmIGludF9udnZtX21vdmVfaTY0IDogSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dLAorICAibGx2bS5udnZtLm1vdmUuaTY0Ij47CitkZWYgaW50X252dm1fbW92ZV9mbG9hdCA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2Zsb2F0X3R5XSwKKyAgW0ludHJOb01lbV0sICJsbHZtLm52dm0ubW92ZS5mbG9hdCI+OworZGVmIGludF9udnZtX21vdmVfZG91YmxlIDogSW50cmluc2ljPFtsbHZtX2RvdWJsZV90eV0sIFtsbHZtX2RvdWJsZV90eV0sCisgIFtJbnRyTm9NZW1dLCAibGx2bS5udnZtLm1vdmUuZG91YmxlIj47CitkZWYgaW50X252dm1fbW92ZV9wdHIgOiBJbnRyaW5zaWM8W2xsdm1fYW55cHRyX3R5XSwgW2xsdm1fYW55cHRyX3R5XSwKKyAgW0ludHJOb01lbSwgTm9DYXB0dXJlPDA+XSwgImxsdm0ubnZ2bS5tb3ZlLnB0ciI+OworCisKKy8vIEZvciBnZXR0aW5nIHRoZSBoYW5kbGUgZnJvbSBhIHRleHR1cmUgb3Igc3VyZmFjZSB2YXJpYWJsZQorZGVmIGludF9udnZtX3RleHN1cmZfaGFuZGxlCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX21ldGFkYXRhX3R5LCBsbHZtX2FueWk2NHB0cl90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dLCAibGx2bS5udnZtLnRleHN1cmYuaGFuZGxlIj47CitkZWYgaW50X252dm1fdGV4c3VyZl9oYW5kbGVfaW50ZXJuYWwKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0sICJsbHZtLm52dm0udGV4c3VyZi5oYW5kbGUuaW50ZXJuYWwiPjsKKworLy8vIEVycm9yIC8gV2FybgorZGVmIGludF9udnZtX2NvbXBpbGVyX2Vycm9yIDoKKyAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2FueXB0cl90eV0sIFtdLCAibGx2bS5udnZtLmNvbXBpbGVyLmVycm9yIj47CitkZWYgaW50X252dm1fY29tcGlsZXJfd2FybiA6CisgICAgSW50cmluc2ljPFtdLCBbbGx2bV9hbnlwdHJfdHldLCBbXSwgImxsdm0ubnZ2bS5jb21waWxlci53YXJuIj47CisKK2RlZiBpbnRfbnZ2bV9yZWZsZWN0IDoKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2FueXB0cl90eV0sIFtJbnRyTm9NZW1dLCAibGx2bS5udnZtLnJlZmxlY3QiPjsKKworLy8gaXNzcGFjZXAue2NvbnN0LCBnbG9iYWwsIGxvY2FsLCBzaGFyZWR9CitkZWYgaW50X252dm1faXNzcGFjZXBfY29uc3QKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTFfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5pc3NwYWNlcC5jb25zdCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9pc3NwYWNlcF9jb25zdCI+OworZGVmIGludF9udnZtX2lzc3BhY2VwX2dsb2JhbAorICA6IEludHJpbnNpYzxbbGx2bV9pMV90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLmlzc3BhY2VwLmdsb2JhbCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9pc3NwYWNlcF9nbG9iYWwiPjsKK2RlZiBpbnRfbnZ2bV9pc3NwYWNlcF9sb2NhbAorICA6IEludHJpbnNpYzxbbGx2bV9pMV90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLmlzc3BhY2VwLmxvY2FsIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX2lzc3BhY2VwX2xvY2FsIj47CitkZWYgaW50X252dm1faXNzcGFjZXBfc2hhcmVkCisgIDogSW50cmluc2ljPFtsbHZtX2kxX3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uaXNzcGFjZXAuc2hhcmVkIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX2lzc3BhY2VwX3NoYXJlZCI+OworCisvLyBFbnZpcm9ubWVudCByZWdpc3RlciByZWFkCitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcwCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcwIj47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzEiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxIj47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzIiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyIj47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWczCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzMiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWczIj47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc0CisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzQiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc0Ij47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc1CisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzUiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc1Ij47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc2CisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzYiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc2Ij47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc3CisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzciPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc3Ij47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc4CisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzgiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc4Ij47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc5CisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5yZWFkLnB0eC5zcmVnLmVudnJlZzkiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWc5Ij47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxMAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxMCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzEwIj47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxMQorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxMSI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzExIj47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxMiI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzEyIj47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxMworICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxMyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzEzIj47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxNAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxNCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzE0Ij47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxNQorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxNSI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzE1Ij47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxNgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxNiI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzE2Ij47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxNworICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxNyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzE3Ij47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxOAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxOCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzE4Ij47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcxOQorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcxOSI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzE5Ij47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyMAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyMCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzIwIj47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyMQorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyMSI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzIxIj47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyMiI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzIyIj47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyMworICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyMyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzIzIj47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyNAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyNCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzI0Ij47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyNQorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyNSI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzI1Ij47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyNgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyNiI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzI2Ij47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyNworICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyNyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzI3Ij47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyOAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyOCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzI4Ij47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWcyOQorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWcyOSI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzI5Ij47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWczMAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWczMCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzMwIj47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19lbnZyZWczMQorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ucmVhZC5wdHguc3JlZy5lbnZyZWczMSI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnX2VudnJlZzMxIj47CisKKworLy8gVGV4dHVyZSBGZXRjaAorLy8gdGV4bW9kZV9pbmRlcGVuZGVudAorZGVmIGludF9udnZtX3RleF8xZF92NGYzMl9zMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4xZC52NGYzMi5zMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMWRfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4xZC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMWRfbGV2ZWxfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4xZC5sZXZlbC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMWRfZ3JhZF92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4xZC5ncmFkLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8xZF92NHMzMl9zMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMWQudjRzMzIuczMyIj47CitkZWYgaW50X252dm1fdGV4XzFkX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjFkLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8xZF9sZXZlbF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4xZC5sZXZlbC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMWRfZ3JhZF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMWQuZ3JhZC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMWRfdjR1MzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjFkLnY0dTMyLnMzMiI+OworZGVmIGludF9udnZtX3RleF8xZF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4xZC52NHUzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMWRfbGV2ZWxfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMWQubGV2ZWwudjR1MzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzFkX2dyYWRfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjFkLmdyYWQudjR1MzIuZjMyIj47CisKK2RlZiBpbnRfbnZ2bV90ZXhfMWRfYXJyYXlfdjRmMzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjFkLmFycmF5LnY0ZjMyLnMzMiI+OworZGVmIGludF9udnZtX3RleF8xZF9hcnJheV92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4xZC5hcnJheS52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMWRfYXJyYXlfbGV2ZWxfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjFkLmFycmF5LmxldmVsLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8xZF9hcnJheV9ncmFkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4xZC5hcnJheS5ncmFkLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8xZF9hcnJheV92NHMzMl9zMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjFkLmFycmF5LnY0czMyLnMzMiI+OworZGVmIGludF9udnZtX3RleF8xZF9hcnJheV92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMWQuYXJyYXkudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzFkX2FycmF5X2xldmVsX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMWQuYXJyYXkubGV2ZWwudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzFkX2FycmF5X2dyYWRfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4xZC5hcnJheS5ncmFkLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8xZF9hcnJheV92NHUzMl9zMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjFkLmFycmF5LnY0dTMyLnMzMiI+OworZGVmIGludF9udnZtX3RleF8xZF9hcnJheV92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMWQuYXJyYXkudjR1MzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzFkX2FycmF5X2xldmVsX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMWQuYXJyYXkubGV2ZWwudjR1MzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzFkX2FycmF5X2dyYWRfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4xZC5hcnJheS5ncmFkLnY0dTMyLmYzMiI+OworCitkZWYgaW50X252dm1fdGV4XzJkX3Y0ZjMyX3MzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4yZC52NGYzMi5zMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMmRfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4yZC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMmRfbGV2ZWxfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMmQubGV2ZWwudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzJkX2dyYWRfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMmQuZ3JhZC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMmRfdjRzMzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4yZC52NHMzMi5zMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMmRfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMmQudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzJkX2xldmVsX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4yZC5sZXZlbC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMmRfZ3JhZF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMmQuZ3JhZC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMmRfdjR1MzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4yZC52NHUzMi5zMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMmRfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMmQudjR1MzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzJkX2xldmVsX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4yZC5sZXZlbC52NHUzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMmRfZ3JhZF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMmQuZ3JhZC52NHUzMi5mMzIiPjsKKworZGVmIGludF9udnZtX3RleF8yZF9hcnJheV92NGYzMl9zMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4yZC5hcnJheS52NGYzMi5zMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMmRfYXJyYXlfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8yZF9hcnJheV9sZXZlbF92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMmQuYXJyYXkubGV2ZWwudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzJkX2FycmF5X2dyYWRfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4yZC5hcnJheS5ncmFkLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8yZF9hcnJheV92NHMzMl9zMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMmQuYXJyYXkudjRzMzIuczMyIj47CitkZWYgaW50X252dm1fdGV4XzJkX2FycmF5X3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMmQuYXJyYXkudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzJkX2FycmF5X2xldmVsX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMmQuYXJyYXkubGV2ZWwudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzJkX2FycmF5X2dyYWRfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguMmQuYXJyYXkuZ3JhZC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfMmRfYXJyYXlfdjR1MzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LnY0dTMyLnMzMiI+OworZGVmIGludF9udnZtX3RleF8yZF9hcnJheV92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8yZF9hcnJheV9sZXZlbF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LmxldmVsLnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8yZF9hcnJheV9ncmFkX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjJkLmFycmF5LmdyYWQudjR1MzIuZjMyIj47CisKK2RlZiBpbnRfbnZ2bV90ZXhfM2RfdjRmMzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtdLCAibGx2bS5udnZtLnRleC4zZC52NGYzMi5zMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfM2RfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguM2QudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzNkX2xldmVsX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjNkLmxldmVsLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8zZF9ncmFkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4zZC5ncmFkLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8zZF92NHMzMl9zMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtdLCAibGx2bS5udnZtLnRleC4zZC52NHMzMi5zMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfM2RfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjNkLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8zZF9sZXZlbF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguM2QubGV2ZWwudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzNkX2dyYWRfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4zZC5ncmFkLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8zZF92NHUzMl9zMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtdLCAibGx2bS5udnZtLnRleC4zZC52NHUzMi5zMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfM2RfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LjNkLnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF8zZF9sZXZlbF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguM2QubGV2ZWwudjR1MzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4XzNkX2dyYWRfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC4zZC5ncmFkLnY0dTMyLmYzMiI+OworCitkZWYgaW50X252dm1fdGV4X2N1YmVfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguY3ViZS52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfY3ViZV9sZXZlbF92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC5jdWJlLmxldmVsLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF9jdWJlX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC5jdWJlLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF9jdWJlX2xldmVsX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC5jdWJlLmxldmVsLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF9jdWJlX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC5jdWJlLnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF9jdWJlX2xldmVsX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC5jdWJlLmxldmVsLnY0dTMyLmYzMiI+OworCitkZWYgaW50X252dm1fdGV4X2N1YmVfYXJyYXlfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LmN1YmUuYXJyYXkudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X2N1YmVfYXJyYXlfbGV2ZWxfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LmN1YmUuYXJyYXkubGV2ZWwudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X2N1YmVfYXJyYXlfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC5jdWJlLmFycmF5LnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF9jdWJlX2FycmF5X2xldmVsX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXguY3ViZS5hcnJheS5sZXZlbC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfY3ViZV9hcnJheV92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LmN1YmUuYXJyYXkudjR1MzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X2N1YmVfYXJyYXlfbGV2ZWxfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC5jdWJlLmFycmF5LmxldmVsLnY0dTMyLmYzMiI+OworCitkZWYgaW50X252dm1fdGxkNF9yXzJkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50bGQ0LnIuMmQudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGxkNF9nXzJkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50bGQ0LmcuMmQudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGxkNF9iXzJkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50bGQ0LmIuMmQudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGxkNF9hXzJkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50bGQ0LmEuMmQudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGxkNF9yXzJkX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGxkNC5yLjJkLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RsZDRfZ18yZF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRsZDQuZy4yZC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90bGQ0X2JfMmRfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50bGQ0LmIuMmQudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGxkNF9hXzJkX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGxkNC5hLjJkLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RsZDRfcl8yZF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRsZDQuci4yZC52NHUzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90bGQ0X2dfMmRfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50bGQ0LmcuMmQudjR1MzIuZjMyIj47CitkZWYgaW50X252dm1fdGxkNF9iXzJkX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGxkNC5iLjJkLnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RsZDRfYV8yZF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRsZDQuYS4yZC52NHUzMi5mMzIiPjsKKworCisvLyB0ZXhtb2RlX3VuaWZpZWQKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8xZF92NGYzMl9zMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQudjRmMzIuczMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMWRfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMWRfbGV2ZWxfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQubGV2ZWwudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMWRfZ3JhZF92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuZ3JhZC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8xZF92NHMzMl9zMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLnY0czMyLnMzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzFkX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8xZF9sZXZlbF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQubGV2ZWwudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMWRfZ3JhZF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmdyYWQudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMWRfdjR1MzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC52NHUzMi5zMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8xZF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQudjR1MzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMWRfbGV2ZWxfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmxldmVsLnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzFkX2dyYWRfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5ncmFkLnY0dTMyLmYzMiI+OworCitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMWRfYXJyYXlfdjRmMzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS52NGYzMi5zMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8xZF9hcnJheV92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMWRfYXJyYXlfbGV2ZWxfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS5sZXZlbC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8xZF9hcnJheV9ncmFkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkuZ3JhZC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8xZF9hcnJheV92NHMzMl9zMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS52NHMzMi5zMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8xZF9hcnJheV92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzFkX2FycmF5X2xldmVsX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LmxldmVsLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzFkX2FycmF5X2dyYWRfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkuZ3JhZC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8xZF9hcnJheV92NHUzMl9zMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4xZC5hcnJheS52NHUzMi5zMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8xZF9hcnJheV92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzFkX2FycmF5X2xldmVsX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjFkLmFycmF5LmxldmVsLnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzFkX2FycmF5X2dyYWRfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMWQuYXJyYXkuZ3JhZC52NHUzMi5mMzIiPjsKKworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzJkX3Y0ZjMyX3MzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQudjRmMzIuczMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMmRfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMmRfbGV2ZWxfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmxldmVsLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzJkX2dyYWRfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmdyYWQudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMmRfdjRzMzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQudjRzMzIuczMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMmRfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzJkX2xldmVsX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQubGV2ZWwudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMmRfZ3JhZF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmdyYWQudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMmRfdjR1MzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQudjR1MzIuczMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMmRfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzJkX2xldmVsX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQubGV2ZWwudjR1MzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMmRfZ3JhZF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmdyYWQudjR1MzIuZjMyIj47CisKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8yZF9hcnJheV92NGYzMl9zMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkudjRmMzIuczMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMmRfYXJyYXlfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8yZF9hcnJheV9sZXZlbF92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LmxldmVsLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzJkX2FycmF5X2dyYWRfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuMmQuYXJyYXkuZ3JhZC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8yZF9hcnJheV92NHMzMl9zMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LnY0czMyLnMzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzJkX2FycmF5X3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzJkX2FycmF5X2xldmVsX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LmxldmVsLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzJkX2FycmF5X2dyYWRfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjJkLmFycmF5LmdyYWQudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfMmRfYXJyYXlfdjR1MzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS52NHUzMi5zMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8yZF9hcnJheV92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS52NHUzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8yZF9hcnJheV9sZXZlbF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS5sZXZlbC52NHUzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8yZF9hcnJheV9ncmFkX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4yZC5hcnJheS5ncmFkLnY0dTMyLmYzMiI+OworCitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfM2RfdjRmMzJfczMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW10sICJsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QudjRmMzIuczMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfM2RfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjNkLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzNkX2xldmVsX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC5sZXZlbC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8zZF9ncmFkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QuZ3JhZC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8zZF92NHMzMl9zMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW10sICJsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QudjRzMzIuczMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfM2RfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8zZF9sZXZlbF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjNkLmxldmVsLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzNkX2dyYWRfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QuZ3JhZC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8zZF92NHUzMl9zMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW10sICJsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QudjR1MzIuczMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfM2RfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC4zZC52NHUzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF8zZF9sZXZlbF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLjNkLmxldmVsLnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkXzNkX2dyYWRfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuM2QuZ3JhZC52NHUzMi5mMzIiPjsKKworZGVmIGludF9udnZtX3RleF91bmlmaWVkX2N1YmVfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUudjRmMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfY3ViZV9sZXZlbF92NGYzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5sZXZlbC52NGYzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF9jdWJlX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF9jdWJlX2xldmVsX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5sZXZlbC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF9jdWJlX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS52NHUzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF9jdWJlX2xldmVsX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5sZXZlbC52NHUzMi5mMzIiPjsKKworZGVmIGludF9udnZtX3RleF91bmlmaWVkX2N1YmVfYXJyYXlfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLmFycmF5LnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkX2N1YmVfYXJyYXlfbGV2ZWxfdjRmMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLmFycmF5LmxldmVsLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkX2N1YmVfYXJyYXlfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5hcnJheS52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90ZXhfdW5pZmllZF9jdWJlX2FycmF5X2xldmVsX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRleC51bmlmaWVkLmN1YmUuYXJyYXkubGV2ZWwudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGV4X3VuaWZpZWRfY3ViZV9hcnJheV92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50ZXgudW5pZmllZC5jdWJlLmFycmF5LnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RleF91bmlmaWVkX2N1YmVfYXJyYXlfbGV2ZWxfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGV4LnVuaWZpZWQuY3ViZS5hcnJheS5sZXZlbC52NHUzMi5mMzIiPjsKKworZGVmIGludF9udnZtX3RsZDRfdW5pZmllZF9yXzJkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRsZDQudW5pZmllZC5yLjJkLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RsZDRfdW5pZmllZF9nXzJkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRsZDQudW5pZmllZC5nLjJkLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RsZDRfdW5pZmllZF9iXzJkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRsZDQudW5pZmllZC5iLjJkLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RsZDRfdW5pZmllZF9hXzJkX3Y0ZjMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRsZDQudW5pZmllZC5hLjJkLnY0ZjMyLmYzMiI+OworZGVmIGludF9udnZtX3RsZDRfdW5pZmllZF9yXzJkX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuci4yZC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90bGQ0X3VuaWZpZWRfZ18yZF92NHMzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGxkNC51bmlmaWVkLmcuMmQudjRzMzIuZjMyIj47CitkZWYgaW50X252dm1fdGxkNF91bmlmaWVkX2JfMmRfdjRzMzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRsZDQudW5pZmllZC5iLjJkLnY0czMyLmYzMiI+OworZGVmIGludF9udnZtX3RsZDRfdW5pZmllZF9hXzJkX3Y0czMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuYS4yZC52NHMzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90bGQ0X3VuaWZpZWRfcl8yZF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGxkNC51bmlmaWVkLnIuMmQudjR1MzIuZjMyIj47CitkZWYgaW50X252dm1fdGxkNF91bmlmaWVkX2dfMmRfdjR1MzJfZjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9mbG9hdF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnRsZDQudW5pZmllZC5nLjJkLnY0dTMyLmYzMiI+OworZGVmIGludF9udnZtX3RsZDRfdW5pZmllZF9iXzJkX3Y0dTMyX2YzMgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1fZmxvYXRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50bGQ0LnVuaWZpZWQuYi4yZC52NHUzMi5mMzIiPjsKK2RlZiBpbnRfbnZ2bV90bGQ0X3VuaWZpZWRfYV8yZF92NHUzMl9mMzIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2Zsb2F0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udGxkNC51bmlmaWVkLmEuMmQudjR1MzIuZjMyIj47CisKKworLy89PT0gU3VyZmFjZSBMb2FkCisvLyAuY2xhbXAgdmFyaWFudHMKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2k4X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmk4LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9pMTZfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuaTE2LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9pMzJfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuaTMyLmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9pNjRfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuaTY0LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8xZF92Mmk4X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC52Mmk4LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8xZF92MmkxNl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQudjJpMTYuY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX3YyaTMyX2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC52MmkzMi5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfdjJpNjRfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLnYyaTY0LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8xZF92NGk4X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLnY0aTguY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX3Y0aTE2X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLnY0aTE2LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8xZF92NGkzMl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC52NGkzMi5jbGFtcCI+OworCitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV9pOF9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTguY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2FycmF5X2kxNl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTE2LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV9pMzJfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LmkzMi5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfaTY0X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pNjQuY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2FycmF5X3YyaThfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52Mmk4LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV92MmkxNl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTE2LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV92MmkzMl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTMyLmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV92Mmk2NF9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTY0LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV92NGk4X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGk4LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV92NGkxNl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpMTYuY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2FycmF5X3Y0aTMyX2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGkzMi5jbGFtcCI+OworCitkZWYgaW50X252dm1fc3VsZF8yZF9pOF9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuaTguY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2kxNl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuaTE2LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9pMzJfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmkzMi5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfaTY0X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5pNjQuY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX3YyaThfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC52Mmk4LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8yZF92MmkxNl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLnYyaTE2LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8yZF92MmkzMl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLnYyaTMyLmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8yZF92Mmk2NF9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLnYyaTY0LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8yZF92NGk4X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC52NGk4LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8yZF92NGkxNl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQudjRpMTYuY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX3Y0aTMyX2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC52NGkzMi5jbGFtcCI+OworCitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV9pOF9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5Lmk4LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV9pMTZfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pMTYuY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X2kzMl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LmkzMi5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfaTY0X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTY0LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV92Mmk4X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTguY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X3YyaTE2X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTE2LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV92MmkzMl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52MmkzMi5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfdjJpNjRfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpNjQuY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X3Y0aThfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGk4LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV92NGkxNl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTE2LmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV92NGkzMl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTMyLmNsYW1wIj47CisKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX2k4X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QuaTguY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX2kxNl9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLmkxNi5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfM2RfaTMyX2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QuaTMyLmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8zZF9pNjRfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4zZC5pNjQuY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX3YyaThfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QudjJpOC5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfM2RfdjJpMTZfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QudjJpMTYuY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX3YyaTMyX2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLnYyaTMyLmNsYW1wIj47CitkZWYgaW50X252dm1fc3VsZF8zZF92Mmk2NF9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4zZC52Mmk2NC5jbGFtcCI+OworZGVmIGludF9udnZtX3N1bGRfM2RfdjRpOF9jbGFtcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLnY0aTguY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX3Y0aTE2X2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QudjRpMTYuY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX3Y0aTMyX2NsYW1wCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QudjRpMzIuY2xhbXAiPjsKKworLy8gLnRyYXAgdmFyaWFudHMKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2k4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuaTgudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuaTE2LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2kzMl90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmkzMi50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9pNjRfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5pNjQudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfdjJpOF90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC52Mmk4LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX3YyaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLnYyaTE2LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX3YyaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLnYyaTMyLnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX3YyaTY0X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLnYyaTY0LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX3Y0aThfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC52NGk4LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX3Y0aTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQudjRpMTYudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfdjRpMzJfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC52NGkzMi50cmFwIj47CisKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2FycmF5X2k4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5Lmk4LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2FycmF5X2kxNl90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pMTYudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LmkzMi50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV9pNjRfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTY0LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2FycmF5X3YyaThfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTgudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfdjJpMTZfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTE2LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2FycmF5X3YyaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52MmkzMi50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV92Mmk2NF90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpNjQudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfdjRpOF90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGk4LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2FycmF5X3Y0aTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTE2LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2FycmF5X3Y0aTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnY0aTMyLnRyYXAiPjsKKworZGVmIGludF9udnZtX3N1bGRfMmRfaThfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuaTgudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmkxNi50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9pMzJfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuaTMyLnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2k2NF90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5pNjQudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfdjJpOF90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQudjJpOC50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8yZF92MmkxNl90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQudjJpMTYudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfdjJpMzJfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLnYyaTMyLnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX3YyaTY0X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC52Mmk2NC50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8yZF92NGk4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLnY0aTgudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfdjRpMTZfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQudjRpMTYudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfdjRpMzJfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQudjRpMzIudHJhcCI+OworCitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV9pOF90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTgudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pMTYudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pMzIudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfaTY0X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS5pNjQudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfdjJpOF90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTgudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfdjJpMTZfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52MmkxNi50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV92MmkzMl90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTMyLnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X3YyaTY0X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpNjQudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfdjRpOF90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjRpOC50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV92NGkxNl90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjRpMTYudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfdjRpMzJfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTMyLnRyYXAiPjsKKworZGVmIGludF9udnZtX3N1bGRfM2RfaThfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLmk4LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX2kxNl90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QuaTE2LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX2kzMl90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QuaTMyLnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX2k2NF90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QuaTY0LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX3YyaThfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4zZC52Mmk4LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX3YyaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QudjJpMTYudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfM2RfdjJpMzJfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4zZC52MmkzMi50cmFwIj47CitkZWYgaW50X252dm1fc3VsZF8zZF92Mmk2NF90cmFwCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLnYyaTY0LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX3Y0aThfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLnY0aTgudHJhcCI+OworZGVmIGludF9udnZtX3N1bGRfM2RfdjRpMTZfdHJhcAorICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLnY0aTE2LnRyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX3Y0aTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4zZC52NGkzMi50cmFwIj47CisKKy8vIC56ZXJvIHZhcmlhbnRzCitkZWYgaW50X252dm1fc3VsZF8xZF9pOF96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmk4Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2kxNl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmkxNi56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9pMzJfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5pMzIuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMWRfaTY0X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuaTY0Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX3YyaThfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQudjJpOC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8xZF92MmkxNl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC52MmkxNi56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8xZF92MmkzMl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC52MmkzMi56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8xZF92Mmk2NF96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC52Mmk2NC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8xZF92NGk4X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQudjRpOC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8xZF92NGkxNl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLnY0aTE2Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX3Y0aTMyX3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQudjRpMzIuemVybyI+OworCitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV9pOF96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pOC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV9pMTZfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkuaTE2Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2FycmF5X2kzMl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS5pMzIuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfaTY0X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5Lmk2NC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV92Mmk4X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52Mmk4Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2FycmF5X3YyaTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52MmkxNi56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV92MmkzMl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjJpMzIuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMWRfYXJyYXlfdjJpNjRfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjFkLmFycmF5LnYyaTY0Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzFkX2FycmF5X3Y0aThfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMWQuYXJyYXkudjRpOC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV92NGkxNl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGkxNi56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8xZF9hcnJheV92NGkzMl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4xZC5hcnJheS52NGkzMi56ZXJvIj47CisKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2k4X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmk4Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2kxNl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5pMTYuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMmRfaTMyX3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmkzMi56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9pNjRfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuaTY0Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX3YyaThfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLnYyaTguemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMmRfdjJpMTZfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLnYyaTE2Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX3YyaTMyX3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC52MmkzMi56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8yZF92Mmk2NF96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQudjJpNjQuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMmRfdjRpOF96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC52NGk4Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX3Y0aTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLnY0aTE2Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX3Y0aTMyX3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLnY0aTMyLnplcm8iPjsKKworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfaThfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5Lmk4Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X2kxNl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTE2Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X2kzMl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTMyLnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X2k2NF96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkuaTY0Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X3YyaThfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52Mmk4Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X3YyaTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuMmQuYXJyYXkudjJpMTYuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfdjJpMzJfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52MmkzMi56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8yZF9hcnJheV92Mmk2NF96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnYyaTY0Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X3Y0aThfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTguemVybyI+OworZGVmIGludF9udnZtX3N1bGRfMmRfYXJyYXlfdjRpMTZfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjJkLmFycmF5LnY0aTE2Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzJkX2FycmF5X3Y0aTMyX3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4yZC5hcnJheS52NGkzMi56ZXJvIj47CisKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX2k4X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4zZC5pOC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8zZF9pMTZfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLmkxNi56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8zZF9pMzJfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLmkzMi56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8zZF9pNjRfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLmk2NC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8zZF92Mmk4X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QudjJpOC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8zZF92MmkxNl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdWxkLjNkLnYyaTE2Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX3YyaTMyX3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QudjJpMzIuemVybyI+OworZGVmIGludF9udnZtX3N1bGRfM2RfdjJpNjRfemVybworICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4zZC52Mmk2NC56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8zZF92NGk4X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4zZC52NGk4Lnplcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdWxkXzNkX3Y0aTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W2xsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VsZC4zZC52NGkxNi56ZXJvIj47CitkZWYgaW50X252dm1fc3VsZF8zZF92NGkzMl96ZXJvCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1bGQuM2QudjRpMzIuemVybyI+OworCisvLz09PS0gVGV4dHVyZSBRdWVyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWYgaW50X252dm1fdHhxX2NoYW5uZWxfb3JkZXIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udHhxLmNoYW5uZWwub3JkZXIiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fdHhxX2NoYW5uZWxfb3JkZXIiPjsKK2RlZiBpbnRfbnZ2bV90eHFfY2hhbm5lbF9kYXRhX3R5cGUKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udHhxLmNoYW5uZWwuZGF0YS50eXBlIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3R4cV9jaGFubmVsX2RhdGFfdHlwZSI+OworZGVmIGludF9udnZtX3R4cV93aWR0aAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50eHEud2lkdGgiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fdHhxX3dpZHRoIj47CitkZWYgaW50X252dm1fdHhxX2hlaWdodAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS50eHEuaGVpZ2h0Ij4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3R4cV9oZWlnaHQiPjsKK2RlZiBpbnRfbnZ2bV90eHFfZGVwdGgKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udHhxLmRlcHRoIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3R4cV9kZXB0aCI+OworZGVmIGludF9udnZtX3R4cV9hcnJheV9zaXplCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnR4cS5hcnJheS5zaXplIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3R4cV9hcnJheV9zaXplIj47CitkZWYgaW50X252dm1fdHhxX251bV9zYW1wbGVzCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnR4cS5udW0uc2FtcGxlcyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV90eHFfbnVtX3NhbXBsZXMiPjsKK2RlZiBpbnRfbnZ2bV90eHFfbnVtX21pcG1hcF9sZXZlbHMKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0udHhxLm51bS5taXBtYXAubGV2ZWxzIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3R4cV9udW1fbWlwbWFwX2xldmVscyI+OworCisvLz09PS0gU3VyZmFjZSBRdWVyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitkZWYgaW50X252dm1fc3VxX2NoYW5uZWxfb3JkZXIKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VxLmNoYW5uZWwub3JkZXIiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VxX2NoYW5uZWxfb3JkZXIiPjsKK2RlZiBpbnRfbnZ2bV9zdXFfY2hhbm5lbF9kYXRhX3R5cGUKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VxLmNoYW5uZWwuZGF0YS50eXBlIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1cV9jaGFubmVsX2RhdGFfdHlwZSI+OworZGVmIGludF9udnZtX3N1cV93aWR0aAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXEud2lkdGgiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VxX3dpZHRoIj47CitkZWYgaW50X252dm1fc3VxX2hlaWdodAorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXEuaGVpZ2h0Ij4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1cV9oZWlnaHQiPjsKK2RlZiBpbnRfbnZ2bV9zdXFfZGVwdGgKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VxLmRlcHRoIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1cV9kZXB0aCI+OworZGVmIGludF9udnZtX3N1cV9hcnJheV9zaXplCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1cS5hcnJheS5zaXplIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1cV9hcnJheV9zaXplIj47CisKKworLy89PT0tIEhhbmRsZSBRdWVyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworZGVmIGludF9udnZtX2lzdHlwZXBfc2FtcGxlcgorICA6IEludHJpbnNpYzxbbGx2bV9pMV90eV0sIFtsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dLAorICAgICAgICAgICAgICAibGx2bS5udnZtLmlzdHlwZXAuc2FtcGxlciI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9pc3R5cGVwX3NhbXBsZXIiPjsKK2RlZiBpbnRfbnZ2bV9pc3R5cGVwX3N1cmZhY2UKKyAgOiBJbnRyaW5zaWM8W2xsdm1faTFfdHldLCBbbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5pc3R5cGVwLnN1cmZhY2UiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1faXN0eXBlcF9zdXJmYWNlIj47CitkZWYgaW50X252dm1faXN0eXBlcF90ZXh0dXJlCisgIDogSW50cmluc2ljPFtsbHZtX2kxX3R5XSwgW2xsdm1faTY0X3R5XSwgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uaXN0eXBlcC50ZXh0dXJlIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX2lzdHlwZXBfdGV4dHVyZSI+OworCisKKworLy89PT0tIFN1cmZhY2UgU3RvcmVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gVW5mb3JtYXR0ZWQKKy8vIC5jbGFtcCB2YXJpYW50CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2k4X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5pOC5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfaThfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfaTE2X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5pMTYuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2kxNl9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9pMzJfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmkzMi5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfaTMyX2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2k2NF9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuaTY0LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9pNjRfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfdjJpOF9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTguY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX3YyaThfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfdjJpMTZfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC52MmkxNi5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfdjJpMTZfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfdjJpMzJfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC52MmkzMi5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfdjJpMzJfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfdjJpNjRfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC52Mmk2NC5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfdjJpNjRfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfdjRpOF9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC52NGk4LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF92NGk4X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX3Y0aTE2X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTE2LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF92NGkxNl9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF92NGkzMl9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC52NGkzMi5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfdjRpMzJfY2xhbXAiPjsKKworCitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X2k4X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTguY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2FycmF5X2k4X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X2kxNl9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LmkxNi5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTE2X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X2kzMl9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LmkzMi5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTMyX2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X2k2NF9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5Lmk2NC5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfaTY0X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X3YyaThfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52Mmk4LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV92Mmk4X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X3YyaTE2X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpMTYuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2FycmF5X3YyaTE2X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X3YyaTMyX2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpMzIuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2FycmF5X3YyaTMyX2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X3YyaTY0X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjJpNjQuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2FycmF5X3YyaTY0X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X3Y0aThfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTguY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2FycmF5X3Y0aThfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMTZfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnY0aTE2LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV92NGkxNl9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV92NGkzMl9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpMzIuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2FycmF5X3Y0aTMyX2NsYW1wIj47CisKKworZGVmIGludF9udnZtX3N1c3RfYl8yZF9pOF9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmk4LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9pOF9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9pMTZfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5pMTYuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2kxNl9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9pMzJfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5pMzIuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2kzMl9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9pNjRfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5pNjQuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2k2NF9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF92Mmk4X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpOC5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfdjJpOF9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF92MmkxNl9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTE2LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF92MmkxNl9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF92MmkzMl9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTMyLmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF92MmkzMl9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF92Mmk2NF9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLnYyaTY0LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF92Mmk2NF9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF92NGk4X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC52NGk4LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF92NGk4X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX3Y0aTE2X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC52NGkxNi5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfdjRpMTZfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfdjRpMzJfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTMyLmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF92NGkzMl9jbGFtcCI+OworCisKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaThfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pOC5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaThfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTE2X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTE2LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9hcnJheV9pMTZfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTMyX2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTMyLmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9hcnJheV9pMzJfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTY0X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkuaTY0LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9hcnJheV9pNjRfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpOF9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52Mmk4LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9hcnJheV92Mmk4X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X3YyaTE2X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTE2LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9hcnJheV92MmkxNl9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9hcnJheV92MmkzMl9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52MmkzMi5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpMzJfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpNjRfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpNjQuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X3YyaTY0X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X3Y0aThfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGk4LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9hcnJheV92NGk4X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTE2X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpMTYuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTE2X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTMyX2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjRpMzIuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTMyX2NsYW1wIj47CisKKworZGVmIGludF9udnZtX3N1c3RfYl8zZF9pOF9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLmk4LmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF9pOF9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8zZF9pMTZfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC5pMTYuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzNkX2kxNl9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8zZF9pMzJfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC5pMzIuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzNkX2kzMl9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8zZF9pNjRfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC5pNjQuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzNkX2k2NF9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8zZF92Mmk4X2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTguY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzNkX3YyaThfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfdjJpMTZfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpMTYuY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzNkX3YyaTE2X2NsYW1wIj47CitkZWYgaW50X252dm1fc3VzdF9iXzNkX3YyaTMyX2NsYW1wCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTMyLmNsYW1wIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF92MmkzMl9jbGFtcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8zZF92Mmk2NF9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC52Mmk2NC5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfdjJpNjRfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfdjRpOF9jbGFtcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTguY2xhbXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzNkX3Y0aThfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfdjRpMTZfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC52NGkxNi5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfdjRpMTZfY2xhbXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfdjRpMzJfY2xhbXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC52NGkzMi5jbGFtcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfdjRpMzJfY2xhbXAiPjsKKworCisvLyAudHJhcCB2YXJpYW50CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2k4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2k4X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9pMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9pMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuaTMyLnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2kzMl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2k2NF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5pNjQudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfaTY0X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfdjJpOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpOC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF92Mmk4X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfdjJpMTZfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTE2LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX3YyaTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfdjJpMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTMyLnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX3YyaTMyX3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfdjJpNjRfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTY0LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX3YyaTY0X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfdjRpOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTgudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfdjRpOF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX3Y0aTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfdjRpMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF92NGkzMl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTMyLnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX3Y0aTMyX3RyYXAiPjsKKworCitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X2k4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pOC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV9pOF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X2kxNl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTE2LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2FycmF5X2kxNl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X2kzMl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTMyLnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2FycmF5X2kzMl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X2k2NF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTY0LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2FycmF5X2k2NF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X3YyaThfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTgudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpOF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X3YyaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52MmkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV92MmkxNl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X3YyaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52MmkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV92MmkzMl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X3YyaTY0X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52Mmk2NC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV92Mmk2NF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X3Y0aThfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpOC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV92NGk4X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMTZfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV92NGkzMl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52NGkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV92NGkzMl90cmFwIj47CisKKworZGVmIGludF9udnZtX3N1c3RfYl8yZF9pOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuaTgudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfaThfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9pMTZfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9pMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9pMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9pMzJfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9pNjRfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmk2NC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9pNjRfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF92Mmk4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC52Mmk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX3YyaThfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF92MmkxNl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfdjJpMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF92MmkzMl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpMzIudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfdjJpMzJfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF92Mmk2NF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpNjQudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfdjJpNjRfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF92NGk4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTgudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfdjRpOF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX3Y0aTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTE2LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX3Y0aTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfdjRpMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpMzIudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfdjRpMzJfdHJhcCI+OworCisKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaThfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5Lmk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X2k4X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pMzIudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTMyX3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTY0X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pNjQudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTY0X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTgudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpOF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X3YyaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9hcnJheV92MmkzMl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTMyLnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X3YyaTMyX3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpNjRfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52Mmk2NC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9hcnJheV92Mmk2NF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X3Y0aThfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTgudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpOF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9hcnJheV92NGkxNl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9hcnJheV92NGkzMl90cmFwIj47CisKKworZGVmIGludF9udnZtX3N1c3RfYl8zZF9pOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuM2QuaTgudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfaThfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8zZF9pMTZfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLmkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF9pMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8zZF9pMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLmkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF9pMzJfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8zZF9pNjRfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLmk2NC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF9pNjRfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8zZF92Mmk4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpOC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF92Mmk4X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfdjJpMTZfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC52MmkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF92MmkxNl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9iXzNkX3YyaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpMzIudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfdjJpMzJfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfYl8zZF92Mmk2NF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTY0LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzNkX3YyaTY0X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfdjRpOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpOC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF92NGk4X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfdjRpMTZfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTE2LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzNkX3Y0aTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfdjRpMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTMyLnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzNkX3Y0aTMyX3RyYXAiPjsKKworCisvLyAuemVybyB2YXJpYW50CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2k4X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmk4Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2k4X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfaTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmkxNi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9pMTZfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9pMzJfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuaTMyLnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2kzMl96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2k2NF96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5pNjQuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfaTY0X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfdjJpOF96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjJpOC56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF92Mmk4X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfdjJpMTZfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTE2Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX3YyaTE2X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfdjJpMzJfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTMyLnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX3YyaTMyX3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfdjJpNjRfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLnYyaTY0Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX3YyaTY0X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfdjRpOF96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTguemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfdjRpOF96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX3Y0aTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQudjRpMTYuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfdjRpMTZfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF92NGkzMl96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLnY0aTMyLnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX3Y0aTMyX3plcm8iPjsKKworCitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X2k4X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS5pOC56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV9pOF96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X2kxNl96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTE2Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2FycmF5X2kxNl96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X2kzMl96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTMyLnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2FycmF5X2kzMl96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X2k2NF96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pNjRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkuaTY0Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzFkX2FycmF5X2k2NF96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X3YyaThfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjFkLmFycmF5LnYyaTguemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjJpOF96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X3YyaTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52MmkxNi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV92MmkxNl96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X3YyaTMyX3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52MmkzMi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV92MmkzMl96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X3YyaTY0X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52Mmk2NC56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV92Mmk2NF96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzFkX2FycmF5X3Y0aThfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpOC56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV92NGk4X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMTZfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMWQuYXJyYXkudjRpMTYuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMWRfYXJyYXlfdjRpMTZfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8xZF9hcnJheV92NGkzMl96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4xZC5hcnJheS52NGkzMi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8xZF9hcnJheV92NGkzMl96ZXJvIj47CisKKworZGVmIGludF9udnZtX3N1c3RfYl8yZF9pOF96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuaTguemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfaThfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9pMTZfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmkxNi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9pMTZfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9pMzJfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmkzMi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9pMzJfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9pNjRfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmk2NC56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9pNjRfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF92Mmk4X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC52Mmk4Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX3YyaThfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF92MmkxNl96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpMTYuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfdjJpMTZfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF92MmkzMl96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpMzIuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfdjJpMzJfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF92Mmk2NF96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjJpNjQuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfdjJpNjRfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF92NGk4X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTguemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfdjRpOF96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX3Y0aTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLnY0aTE2Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX3Y0aTE2X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfdjRpMzJfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQudjRpMzIuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfdjRpMzJfemVybyI+OworCisKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaThfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5Lmk4Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X2k4X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pMTYuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTE2X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTMyX3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pMzIuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTMyX3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTY0X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS5pNjQuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfaTY0X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpOF96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTguemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpOF96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X3YyaTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuMmQuYXJyYXkudjJpMTYuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpMTZfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8yZF9hcnJheV92MmkzMl96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnYyaTMyLnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzJkX2FycmF5X3YyaTMyX3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjJpNjRfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52Mmk2NC56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9hcnJheV92Mmk2NF96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X3Y0aThfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjJkLmFycmF5LnY0aTguemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfMmRfYXJyYXlfdjRpOF96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTE2X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGkxNi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9hcnJheV92NGkxNl96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzJkX2FycmF5X3Y0aTMyX3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4yZC5hcnJheS52NGkzMi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8yZF9hcnJheV92NGkzMl96ZXJvIj47CisKKworZGVmIGludF9udnZtX3N1c3RfYl8zZF9pOF96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuM2QuaTguemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfaThfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8zZF9pMTZfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLmkxNi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF9pMTZfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8zZF9pMzJfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLmkzMi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF9pMzJfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8zZF9pNjRfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLmk2NC56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF9pNjRfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8zZF92Mmk4X3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpOC56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF92Mmk4X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfdjJpMTZfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QuYi4zZC52MmkxNi56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF92MmkxNl96ZXJvIj47CitkZWYgaW50X252dm1fc3VzdF9iXzNkX3YyaTMyX3plcm8KKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjJpMzIuemVybyI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X2JfM2RfdjJpMzJfemVybyI+OworZGVmIGludF9udnZtX3N1c3RfYl8zZF92Mmk2NF96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLnYyaTY0Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzNkX3YyaTY0X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfdjRpOF96ZXJvCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LmIuM2QudjRpOC56ZXJvIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfYl8zZF92NGk4X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfdjRpMTZfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTE2Lnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzNkX3Y0aTE2X3plcm8iPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X2JfM2RfdjRpMzJfemVybworICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5iLjNkLnY0aTMyLnplcm8iPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9iXzNkX3Y0aTMyX3plcm8iPjsKKworCisKKy8vIEZvcm1hdHRlZAorCitkZWYgaW50X252dm1fc3VzdF9wXzFkX2k4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjFkLmk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzFkX2k4X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMWRfaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjFkLmkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8xZF9pMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8xZF9pMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMWQuaTMyLnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzFkX2kzMl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzFkX3YyaThfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjFkLnYyaTgudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMWRfdjJpOF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzFkX3YyaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4xZC52MmkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8xZF92MmkxNl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzFkX3YyaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4xZC52MmkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8xZF92MmkzMl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzFkX3Y0aThfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4xZC52NGk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzFkX3Y0aThfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8xZF92NGkxNl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjFkLnY0aTE2LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzFkX3Y0aTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMWRfdjRpMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4xZC52NGkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8xZF92NGkzMl90cmFwIj47CisKKworZGVmIGludF9udnZtX3N1c3RfcF8xZF9hcnJheV9pOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkuaTgudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMWRfYXJyYXlfaThfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8xZF9hcnJheV9pMTZfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LmkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8xZF9hcnJheV9pMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8xZF9hcnJheV9pMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LmkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8xZF9hcnJheV9pMzJfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8xZF9hcnJheV92Mmk4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4xZC5hcnJheS52Mmk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzFkX2FycmF5X3YyaThfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8xZF9hcnJheV92MmkxNl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkudjJpMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjJpMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8xZF9hcnJheV92MmkzMl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkudjJpMzIudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjJpMzJfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8xZF9hcnJheV92NGk4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LnY0aTgudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjRpOF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzFkX2FycmF5X3Y0aTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjFkLmFycmF5LnY0aTE2LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzFkX2FycmF5X3Y0aTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjRpMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMWQuYXJyYXkudjRpMzIudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMWRfYXJyYXlfdjRpMzJfdHJhcCI+OworCisKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMmRfaThfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjJkLmk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzJkX2k4X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMmRfaTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4yZC5pMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMmRfaTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMmRfaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4yZC5pMzIudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMmRfaTMyX3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMmRfdjJpOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMmQudjJpOC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8yZF92Mmk4X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMmRfdjJpMTZfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjJkLnYyaTE2LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzJkX3YyaTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMmRfdjJpMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjJkLnYyaTMyLnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzJkX3YyaTMyX3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMmRfdjRpOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4yZC52NGk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzJkX3Y0aThfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8yZF92NGkxNl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4yZC52NGkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8yZF92NGkxNl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzJkX3Y0aTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjJkLnY0aTMyLnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzJkX3Y0aTMyX3RyYXAiPjsKKworCitkZWYgaW50X252dm1fc3VzdF9wXzJkX2FycmF5X2k4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS5pOC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8yZF9hcnJheV9pOF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzJkX2FycmF5X2kxNl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkuaTE2LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzJkX2FycmF5X2kxNl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzJkX2FycmF5X2kzMl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuMmQuYXJyYXkuaTMyLnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzJkX2FycmF5X2kzMl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzJkX2FycmF5X3YyaThfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS52Mmk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzJkX2FycmF5X3YyaThfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8yZF9hcnJheV92MmkxNl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5LnYyaTE2LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzJkX2FycmF5X3YyaTE2X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfMmRfYXJyYXlfdjJpMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS52MmkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8yZF9hcnJheV92MmkzMl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzJkX2FycmF5X3Y0aThfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjJkLmFycmF5LnY0aTgudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfMmRfYXJyYXlfdjRpOF90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzJkX2FycmF5X3Y0aTE2X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS52NGkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8yZF9hcnJheV92NGkxNl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzJkX2FycmF5X3Y0aTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4yZC5hcnJheS52NGkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8yZF9hcnJheV92NGkzMl90cmFwIj47CisKKworZGVmIGludF9udnZtX3N1c3RfcF8zZF9pOF90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuM2QuaTgudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfM2RfaThfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8zZF9pMTZfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjNkLmkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8zZF9pMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8zZF9pMzJfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10sCisgICAgICAgICAgICAgICJsbHZtLm52dm0uc3VzdC5wLjNkLmkzMi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8zZF9pMzJfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8zZF92Mmk4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuM2QudjJpOC50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8zZF92Mmk4X3RyYXAiPjsKK2RlZiBpbnRfbnZ2bV9zdXN0X3BfM2RfdjJpMTZfdHJhcAorICA6IEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4zZC52MmkxNi50cmFwIj4sCisgICAgR0NDQnVpbHRpbjwiX19udnZtX3N1c3RfcF8zZF92MmkxNl90cmFwIj47CitkZWYgaW50X252dm1fc3VzdF9wXzNkX3YyaTMyX3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuM2QudjJpMzIudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfM2RfdjJpMzJfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8zZF92NGk4X3RyYXAKKyAgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eV0sIFtdLAorICAgICAgICAgICAgICAibGx2bS5udnZtLnN1c3QucC4zZC52NGk4LnRyYXAiPiwKKyAgICBHQ0NCdWlsdGluPCJfX252dm1fc3VzdF9wXzNkX3Y0aThfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8zZF92NGkxNl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMTZfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuM2QudjRpMTYudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfM2RfdjRpMTZfdHJhcCI+OworZGVmIGludF9udnZtX3N1c3RfcF8zZF92NGkzMl90cmFwCisgIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS5zdXN0LnAuM2QudjRpMzIudHJhcCI+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zdXN0X3BfM2RfdjRpMzJfdHJhcCI+OworCisKK2RlZiBpbnRfbnZ2bV9yb3RhdGVfYjMyCisgIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXSwgImxsdm0ubnZ2bS5yb3RhdGUuYjMyIj4sCisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yb3RhdGVfYjMyIj47CisKK2RlZiBpbnRfbnZ2bV9yb3RhdGVfYjY0CisgIDpJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgW0ludHJOb01lbV0sICJsbHZtLm52dm0ucm90YXRlLmI2NCI+LAorICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yb3RhdGVfYjY0Ij47CisKK2RlZiBpbnRfbnZ2bV9yb3RhdGVfcmlnaHRfYjY0CisgIDogSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXSwgImxsdm0ubnZ2bS5yb3RhdGUucmlnaHQuYjY0Ij4sCisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yb3RhdGVfcmlnaHRfYjY0Ij47CisKK2RlZiBpbnRfbnZ2bV9zd2FwX2xvX2hpX2I2NAorICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXSwgImxsdm0ubnZ2bS5zd2FwLmxvLmhpLmI2NCI+LAorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX252dm1fc3dhcF9sb19oaV9iNjQiPjsKKworCisvLyBBY2Nlc3Npbmcgc3BlY2lhbCByZWdpc3RlcnMuCittdWx0aWNsYXNzIFBUWFJlYWRTUmVnSW50cmluc2ljX3Y0aTMyPHN0cmluZyByZWduYW1lPiB7CisvLyBGSVhNRTogRG8gd2UgbmVlZCB0aGUgMTI4LWJpdCBpbnRlZ2VyIHR5cGUgdmVyc2lvbj8KKy8vICAgIGRlZiBfcjY0ICAgOiBJbnRyaW5zaWM8W2xsdm1faTEyOF90eV0sICAgW10sIFtJbnRyTm9NZW1dPjsKKworLy8gRklYTUU6IEVuYWJsZSB0aGlzIG9uY2UgdjRpMzIgc3VwcG9ydCBpcyBlbmFibGVkIGluIGJhY2stZW5kLgorLy8gICAgZGVmIF92NGkxNiA6IEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtdLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIF94ICAgICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0+LAorICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19udnZtX3JlYWRfcHR4X3NyZWdfIiAjIHJlZ25hbWUgIyAiX3giPjsKKyAgZGVmIF95ICAgICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0+LAorICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19udnZtX3JlYWRfcHR4X3NyZWdfIiAjIHJlZ25hbWUgIyAiX3kiPjsKKyAgZGVmIF96ICAgICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0+LAorICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19udnZtX3JlYWRfcHR4X3NyZWdfIiAjIHJlZ25hbWUgIyAiX3oiPjsKKyAgZGVmIF93ICAgICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0+LAorICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19udnZtX3JlYWRfcHR4X3NyZWdfIiAjIHJlZ25hbWUgIyAiX3ciPjsKK30KKworY2xhc3MgUFRYUmVhZFNSZWdJbnRyaW5zaWNfcjMyPHN0cmluZyBuYW1lPgorICA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW0ludHJOb01lbV0+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnXyIgIyBuYW1lPjsKKworY2xhc3MgUFRYUmVhZFNSZWdJbnRyaW5zaWNfcjY0PHN0cmluZyBuYW1lPgorICA6IEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbXSwgW0ludHJOb01lbV0+LAorICAgIEdDQ0J1aWx0aW48Il9fbnZ2bV9yZWFkX3B0eF9zcmVnXyIgIyBuYW1lPjsKKworZGVmbSBpbnRfbnZ2bV9yZWFkX3B0eF9zcmVnX3RpZCA6IFBUWFJlYWRTUmVnSW50cmluc2ljX3Y0aTMyPCJ0aWQiPjsKK2RlZm0gaW50X252dm1fcmVhZF9wdHhfc3JlZ19udGlkIDogUFRYUmVhZFNSZWdJbnRyaW5zaWNfdjRpMzI8Im50aWQiPjsKKworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfbGFuZWlkIDogUFRYUmVhZFNSZWdJbnRyaW5zaWNfcjMyPCJsYW5laWQiPjsKK2RlZiBpbnRfbnZ2bV9yZWFkX3B0eF9zcmVnX3dhcnBpZCA6IFBUWFJlYWRTUmVnSW50cmluc2ljX3IzMjwid2FycGlkIj47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19ud2FycGlkIDogUFRYUmVhZFNSZWdJbnRyaW5zaWNfcjMyPCJud2FycGlkIj47CisKK2RlZm0gaW50X252dm1fcmVhZF9wdHhfc3JlZ19jdGFpZCA6IFBUWFJlYWRTUmVnSW50cmluc2ljX3Y0aTMyPCJjdGFpZCI+OworZGVmbSBpbnRfbnZ2bV9yZWFkX3B0eF9zcmVnX25jdGFpZCA6IFBUWFJlYWRTUmVnSW50cmluc2ljX3Y0aTMyPCJuY3RhaWQiPjsKKworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfc21pZCA6IFBUWFJlYWRTUmVnSW50cmluc2ljX3IzMjwic21pZCI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfbnNtaWQgOiBQVFhSZWFkU1JlZ0ludHJpbnNpY19yMzI8Im5zbWlkIj47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19ncmlkaWQgOiBQVFhSZWFkU1JlZ0ludHJpbnNpY19yMzI8ImdyaWRpZCI+OworCitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19sYW5lbWFza19lcSA6CisgICAgUFRYUmVhZFNSZWdJbnRyaW5zaWNfcjMyPCJsYW5lbWFza19lcSI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfbGFuZW1hc2tfbGUgOgorICAgIFBUWFJlYWRTUmVnSW50cmluc2ljX3IzMjwibGFuZW1hc2tfbGUiPjsKK2RlZiBpbnRfbnZ2bV9yZWFkX3B0eF9zcmVnX2xhbmVtYXNrX2x0IDoKKyAgICBQVFhSZWFkU1JlZ0ludHJpbnNpY19yMzI8ImxhbmVtYXNrX2x0Ij47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19sYW5lbWFza19nZSA6CisgICAgUFRYUmVhZFNSZWdJbnRyaW5zaWNfcjMyPCJsYW5lbWFza19nZSI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfbGFuZW1hc2tfZ3QgOgorICAgIFBUWFJlYWRTUmVnSW50cmluc2ljX3IzMjwibGFuZW1hc2tfZ3QiPjsKKworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfY2xvY2sgOiBQVFhSZWFkU1JlZ0ludHJpbnNpY19yMzI8ImNsb2NrIj47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19jbG9jazY0IDogUFRYUmVhZFNSZWdJbnRyaW5zaWNfcjY0PCJjbG9jazY0Ij47CisKK2RlZiBpbnRfbnZ2bV9yZWFkX3B0eF9zcmVnX3BtMCA6IFBUWFJlYWRTUmVnSW50cmluc2ljX3IzMjwicG0wIj47CitkZWYgaW50X252dm1fcmVhZF9wdHhfc3JlZ19wbTEgOiBQVFhSZWFkU1JlZ0ludHJpbnNpY19yMzI8InBtMSI+OworZGVmIGludF9udnZtX3JlYWRfcHR4X3NyZWdfcG0yIDogUFRYUmVhZFNSZWdJbnRyaW5zaWNfcjMyPCJwbTIiPjsKK2RlZiBpbnRfbnZ2bV9yZWFkX3B0eF9zcmVnX3BtMyA6IFBUWFJlYWRTUmVnSW50cmluc2ljX3IzMjwicG0zIj47CisKK2RlZiBpbnRfbnZ2bV9yZWFkX3B0eF9zcmVnX3dhcnBzaXplIDogUFRYUmVhZFNSZWdJbnRyaW5zaWNfcjMyPCJ3YXJwc2l6ZSI+OworCisvLworLy8gU0hVRkZMRQorLy8KKworLy8gc2hmbC5kb3duLmIzMiBkZXN0LCB2YWwsIG9mZnNldCwgbWFza19hbmRfY2xhbXAKK2RlZiBpbnRfbnZ2bV9zaGZsX2Rvd25faTMyIDoKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRySW5hY2Nlc3NpYmxlTWVtT25seSwgSW50ckNvbnZlcmdlbnRdLCAibGx2bS5udnZtLnNoZmwuZG93bi5pMzIiPiwKKyAgR0NDQnVpbHRpbjwiX19udnZtX3NoZmxfZG93bl9pMzIiPjsKK2RlZiBpbnRfbnZ2bV9zaGZsX2Rvd25fZjMyIDoKKyAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS5zaGZsLmRvd24uZjMyIj4sCisgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zaGZsX2Rvd25fZjMyIj47CisKKy8vIHNoZmwudXAuYjMyIGRlc3QsIHZhbCwgb2Zmc2V0LCBtYXNrX2FuZF9jbGFtcAorZGVmIGludF9udnZtX3NoZmxfdXBfaTMyIDoKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRySW5hY2Nlc3NpYmxlTWVtT25seSwgSW50ckNvbnZlcmdlbnRdLCAibGx2bS5udnZtLnNoZmwudXAuaTMyIj4sCisgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zaGZsX3VwX2kzMiI+OworZGVmIGludF9udnZtX3NoZmxfdXBfZjMyIDoKKyAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS5zaGZsLnVwLmYzMiI+LAorICBHQ0NCdWlsdGluPCJfX252dm1fc2hmbF91cF9mMzIiPjsKKworLy8gc2hmbC5iZmx5LmIzMiBkZXN0LCB2YWwsIG9mZnNldCwgbWFza19hbmRfY2xhbXAKK2RlZiBpbnRfbnZ2bV9zaGZsX2JmbHlfaTMyIDoKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRySW5hY2Nlc3NpYmxlTWVtT25seSwgSW50ckNvbnZlcmdlbnRdLCAibGx2bS5udnZtLnNoZmwuYmZseS5pMzIiPiwKKyAgR0NDQnVpbHRpbjwiX19udnZtX3NoZmxfYmZseV9pMzIiPjsKK2RlZiBpbnRfbnZ2bV9zaGZsX2JmbHlfZjMyIDoKKyAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS5zaGZsLmJmbHkuZjMyIj4sCisgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zaGZsX2JmbHlfZjMyIj47CisKKy8vIHNoZmwuaWR4LmIzMiBkZXN0LCB2YWwsIGxhbmUsIG1hc2tfYW5kX2NsYW1wCitkZWYgaW50X252dm1fc2hmbF9pZHhfaTMyIDoKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRySW5hY2Nlc3NpYmxlTWVtT25seSwgSW50ckNvbnZlcmdlbnRdLCAibGx2bS5udnZtLnNoZmwuaWR4LmkzMiI+LAorICBHQ0NCdWlsdGluPCJfX252dm1fc2hmbF9pZHhfaTMyIj47CitkZWYgaW50X252dm1fc2hmbF9pZHhfZjMyIDoKKyAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1fZmxvYXRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS5zaGZsLmlkeC5mMzIiPiwKKyAgR0NDQnVpbHRpbjwiX19udnZtX3NoZmxfaWR4X2YzMiI+OworCisvLyBTeW5jaHJvbml6aW5nIHNoZmwgdmFyaWFudHMgYXZhaWxhYmxlIGluIENVREEtOS4KKy8vIE9uIHNtXzcwIHRoZXNlIGRvbid0IGhhdmUgdG8gYmUgY29udmVyZ2VudCwgc28gd2UgbWF5IGV2ZW50dWFsbHkgd2FudCB0bworLy8gaW1wbGVtZW50IG5vbi1jb252ZXJnZW50IHZhcmlhbnQgb2YgdGhpcyBpbnRyaW5zaWMuCisKKy8vIHNoZmwuc3luYy5kb3duLmIzMiBkZXN0LCB0aHJlYWRtYXNrLCB2YWwsIG9mZnNldCAsIG1hc2tfYW5kX2NsYW1wCitkZWYgaW50X252dm1fc2hmbF9zeW5jX2Rvd25faTMyIDoKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS5zaGZsLnN5bmMuZG93bi5pMzIiPiwKKyAgR0NDQnVpbHRpbjwiX19udnZtX3NoZmxfc3luY19kb3duX2kzMiI+OworZGVmIGludF9udnZtX3NoZmxfc3luY19kb3duX2YzMiA6CisgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRySW5hY2Nlc3NpYmxlTWVtT25seSwgSW50ckNvbnZlcmdlbnRdLCAibGx2bS5udnZtLnNoZmwuc3luYy5kb3duLmYzMiI+LAorICBHQ0NCdWlsdGluPCJfX252dm1fc2hmbF9zeW5jX2Rvd25fZjMyIj47CisKKy8vIHNoZmwuc3luYy51cC5iMzIgZGVzdCwgdGhyZWFkbWFzaywgdmFsLCBvZmZzZXQsIG1hc2tfYW5kX2NsYW1wCitkZWYgaW50X252dm1fc2hmbF9zeW5jX3VwX2kzMiA6CisgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJJbmFjY2Vzc2libGVNZW1Pbmx5LCBJbnRyQ29udmVyZ2VudF0sICJsbHZtLm52dm0uc2hmbC5zeW5jLnVwLmkzMiI+LAorICBHQ0NCdWlsdGluPCJfX252dm1fc2hmbF9zeW5jX3VwX2kzMiI+OworZGVmIGludF9udnZtX3NoZmxfc3luY191cF9mMzIgOgorICBJbnRyaW5zaWM8W2xsdm1fZmxvYXRfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1fZmxvYXRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS5zaGZsLnN5bmMudXAuZjMyIj4sCisgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zaGZsX3N5bmNfdXBfZjMyIj47CisKKy8vIHNoZmwuc3luYy5iZmx5LmIzMiBkZXN0LCB0aHJlYWRtYXNrLCB2YWwsIG9mZnNldCwgbWFza19hbmRfY2xhbXAKK2RlZiBpbnRfbnZ2bV9zaGZsX3N5bmNfYmZseV9pMzIgOgorICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRySW5hY2Nlc3NpYmxlTWVtT25seSwgSW50ckNvbnZlcmdlbnRdLCAibGx2bS5udnZtLnNoZmwuc3luYy5iZmx5LmkzMiI+LAorICBHQ0NCdWlsdGluPCJfX252dm1fc2hmbF9zeW5jX2JmbHlfaTMyIj47CitkZWYgaW50X252dm1fc2hmbF9zeW5jX2JmbHlfZjMyIDoKKyAgSW50cmluc2ljPFtsbHZtX2Zsb2F0X3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2Zsb2F0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJJbmFjY2Vzc2libGVNZW1Pbmx5LCBJbnRyQ29udmVyZ2VudF0sICJsbHZtLm52dm0uc2hmbC5zeW5jLmJmbHkuZjMyIj4sCisgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zaGZsX3N5bmNfYmZseV9mMzIiPjsKKworLy8gc2hmbC5zeW5jLmlkeC5iMzIgZGVzdCwgdGhyZWFkbWFzaywgdmFsLCBsYW5lLCBtYXNrX2FuZF9jbGFtcAorZGVmIGludF9udnZtX3NoZmxfc3luY19pZHhfaTMyIDoKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS5zaGZsLnN5bmMuaWR4LmkzMiI+LAorICBHQ0NCdWlsdGluPCJfX252dm1fc2hmbF9zeW5jX2lkeF9pMzIiPjsKK2RlZiBpbnRfbnZ2bV9zaGZsX3N5bmNfaWR4X2YzMiA6CisgIEludHJpbnNpYzxbbGx2bV9mbG9hdF90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9mbG9hdF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgIFtJbnRySW5hY2Nlc3NpYmxlTWVtT25seSwgSW50ckNvbnZlcmdlbnRdLCAibGx2bS5udnZtLnNoZmwuc3luYy5pZHguZjMyIj4sCisgIEdDQ0J1aWx0aW48Il9fbnZ2bV9zaGZsX3N5bmNfaWR4X2YzMiI+OworCisvLworLy8gVk9URQorLy8KKworLy8gdm90ZS5hbGwgcHJlZAorZGVmIGludF9udnZtX3ZvdGVfYWxsIDoKKyAgSW50cmluc2ljPFtsbHZtX2kxX3R5XSwgW2xsdm1faTFfdHldLAorICAgICAgICAgICAgW0ludHJJbmFjY2Vzc2libGVNZW1Pbmx5LCBJbnRyQ29udmVyZ2VudF0sICJsbHZtLm52dm0udm90ZS5hbGwiPiwKKyAgR0NDQnVpbHRpbjwiX19udnZtX3ZvdGVfYWxsIj47CisvLyB2b3RlLmFueSBwcmVkCitkZWYgaW50X252dm1fdm90ZV9hbnkgOgorICBJbnRyaW5zaWM8W2xsdm1faTFfdHldLCBbbGx2bV9pMV90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS52b3RlLmFueSI+LAorICBHQ0NCdWlsdGluPCJfX252dm1fdm90ZV9hbnkiPjsKKy8vIHZvdGUudW5pIHByZWQKK2RlZiBpbnRfbnZ2bV92b3RlX3VuaSA6CisgIEludHJpbnNpYzxbbGx2bV9pMV90eV0sIFtsbHZtX2kxX3R5XSwKKyAgICAgICAgICAgIFtJbnRySW5hY2Nlc3NpYmxlTWVtT25seSwgSW50ckNvbnZlcmdlbnRdLCAibGx2bS5udnZtLnZvdGUudW5pIj4sCisgIEdDQ0J1aWx0aW48Il9fbnZ2bV92b3RlX3VuaSI+OworLy8gdm90ZS5iYWxsb3QgcHJlZAorZGVmIGludF9udnZtX3ZvdGVfYmFsbG90IDoKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kxX3R5XSwKKyAgICAgICAgICAgIFtJbnRySW5hY2Nlc3NpYmxlTWVtT25seSwgSW50ckNvbnZlcmdlbnRdLCAibGx2bS5udnZtLnZvdGUuYmFsbG90Ij4sCisgIEdDQ0J1aWx0aW48Il9fbnZ2bV92b3RlX2JhbGxvdCI+OworCisvLworLy8gVk9URS5TWU5DCisvLworCisvLyB2b3RlLnN5bmMuYWxsIG1hc2ssIHByZWQKK2RlZiBpbnRfbnZ2bV92b3RlX2FsbF9zeW5jIDoKKyAgSW50cmluc2ljPFtsbHZtX2kxX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kxX3R5XSwKKyAgICAgICAgICAgIFtJbnRySW5hY2Nlc3NpYmxlTWVtT25seSwgSW50ckNvbnZlcmdlbnRdLCAibGx2bS5udnZtLnZvdGUuYWxsLnN5bmMiPiwKKyAgR0NDQnVpbHRpbjwiX19udnZtX3ZvdGVfYWxsX3N5bmMiPjsKKy8vIHZvdGUuc3luYy5hbnkgbWFzaywgcHJlZAorZGVmIGludF9udnZtX3ZvdGVfYW55X3N5bmMgOgorICBJbnRyaW5zaWM8W2xsdm1faTFfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTFfdHldLAorICAgICAgICAgICAgW0ludHJJbmFjY2Vzc2libGVNZW1Pbmx5LCBJbnRyQ29udmVyZ2VudF0sICJsbHZtLm52dm0udm90ZS5hbnkuc3luYyI+LAorICBHQ0NCdWlsdGluPCJfX252dm1fdm90ZV9hbnlfc3luYyI+OworLy8gdm90ZS5zeW5jLnVuaSBtYXNrLCBwcmVkCitkZWYgaW50X252dm1fdm90ZV91bmlfc3luYyA6CisgIEludHJpbnNpYzxbbGx2bV9pMV90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMV90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS52b3RlLnVuaS5zeW5jIj4sCisgIEdDQ0J1aWx0aW48Il9fbnZ2bV92b3RlX3VuaV9zeW5jIj47CisvLyB2b3RlLnN5bmMuYmFsbG90IG1hc2ssIHByZWQKK2RlZiBpbnRfbnZ2bV92b3RlX2JhbGxvdF9zeW5jIDoKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMV90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS52b3RlLmJhbGxvdC5zeW5jIj4sCisgIEdDQ0J1aWx0aW48Il9fbnZ2bV92b3RlX2JhbGxvdF9zeW5jIj47CisKKy8vCisvLyBNQVRDSC5TWU5DCisvLworLy8gbWF0Y2guYW55LnN5bmMuYjMyIG1hc2ssIHZhbHVlCitkZWYgaW50X252dm1fbWF0Y2hfYW55X3N5bmNfaTMyIDoKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJJbmFjY2Vzc2libGVNZW1Pbmx5LCBJbnRyQ29udmVyZ2VudF0sICJsbHZtLm52dm0ubWF0Y2guYW55LnN5bmMuaTMyIj4sCisgIEdDQ0J1aWx0aW48Il9fbnZ2bV9tYXRjaF9hbnlfc3luY19pMzIiPjsKKy8vIG1hdGNoLmFueS5zeW5jLmI2NCBtYXNrLCB2YWx1ZQorZGVmIGludF9udnZtX21hdGNoX2FueV9zeW5jX2k2NCA6CisgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgIFtJbnRySW5hY2Nlc3NpYmxlTWVtT25seSwgSW50ckNvbnZlcmdlbnRdLCAibGx2bS5udnZtLm1hdGNoLmFueS5zeW5jLmk2NCI+LAorICBHQ0NCdWlsdGluPCJfX252dm1fbWF0Y2hfYW55X3N5bmNfaTY0Ij47CisKKy8vIG1hdGNoLmFsbCBpbnN0cnVjdGlvbiBoYXZlIHR3byB2YXJpYW50cyAtLSBvbmUgcmV0dXJucyBhIHNpbmdsZSB2YWx1ZSwgYW5vdGhlcgorLy8gcmV0dXJucyBhIHBhaXIge3ZhbHVlLCBwcmVkaWNhdGV9LiBXZSBjdXJyZW50bHkgb25seSBpbXBsZW1lbnQgdGhlIGxhdHRlciBhcworLy8gdGhhdCdzIHRoZSB2YXJpYW50IGV4cG9zZWQgYnkgQ1VEQSBBUEkuCisKKy8vIG1hdGNoLmFsbC5zeW5jLmIzMnAgbWFzaywgdmFsdWUKK2RlZiBpbnRfbnZ2bV9tYXRjaF9hbGxfc3luY19pMzJwIDoKKyAgSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMV90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgW0ludHJJbmFjY2Vzc2libGVNZW1Pbmx5LCBJbnRyQ29udmVyZ2VudF0sICJsbHZtLm52dm0ubWF0Y2guYWxsLnN5bmMuaTMycCI+OworLy8gbWF0Y2guYWxsLnN5bmMuYjY0cCBtYXNrLCB2YWx1ZQorZGVmIGludF9udnZtX21hdGNoX2FsbF9zeW5jX2k2NHAgOgorICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5LCBsbHZtX2kxX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICBbSW50ckluYWNjZXNzaWJsZU1lbU9ubHksIEludHJDb252ZXJnZW50XSwgImxsdm0ubnZ2bS5tYXRjaC5hbGwuc3luYy5pNjRwIj47CisKKy8vCisvLyBXTU1BIGluc3RydWN0aW9ucworLy8KKworLy8gV01NQS5MT0FECitjbGFzcyBOVlZNX1dNTUFfTERfR0FMU1RTPHN0cmluZyBHZW9tZXRyeSwgc3RyaW5nIEFiYywgc3RyaW5nIExheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIFR5cGUsIExMVk1UeXBlIHJlZ3R5LCBpbnQgV2l0aFN0cmlkZT4KKyAgOiBJbnRyaW5zaWM8IWlmKCFlcShBYmMjVHlwZSwiY2YxNiIpLAorICAgICAgICAgICAgICAgICAgW3JlZ3R5LCByZWd0eSwgcmVndHksIHJlZ3R5XSwKKyAgICAgICAgICAgICAgICAgIFtyZWd0eSwgcmVndHksIHJlZ3R5LCByZWd0eSwKKyAgICAgICAgICAgICAgICAgICByZWd0eSwgcmVndHksIHJlZ3R5LCByZWd0eV0pLAorICAgICAgICAgICAgICAhaWYoV2l0aFN0cmlkZSwgW2xsdm1fYW55cHRyX3R5LCBsbHZtX2kzMl90eV0sIFtsbHZtX2FueXB0cl90eV0pLAorICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5LCBSZWFkT25seTwwPiwgTm9DYXB0dXJlPDA+XSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS53bW1hLiIKKyAgICAgICAgICAgICAgICAjIEdlb21ldHJ5CisgICAgICAgICAgICAgICAgIyAiLmxvYWQiCisgICAgICAgICAgICAgICAgIyAiLiIgIyBBYmMKKyAgICAgICAgICAgICAgICAjICIuIiAjIExheW91dAorICAgICAgICAgICAgICAgICMgIWlmKFdpdGhTdHJpZGUsICIuc3RyaWRlIiwgIiIpCisgICAgICAgICAgICAgICAgIyAiLiIgIyBUeXBlPjsKKworbXVsdGljbGFzcyBOVlZNX1dNTUFfTERfR0FMVDxzdHJpbmcgR2VvbWV0cnksIHN0cmluZyBBYmMsIHN0cmluZyBMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBUeXBlLCBMTFZNVHlwZSByZWd0eT4geworICBkZWYgX3N0cmlkZTogTlZWTV9XTU1BX0xEX0dBTFNUUzxHZW9tZXRyeSwgQWJjLCBMYXlvdXQsIFR5cGUsIHJlZ3R5LCAxPjsKKyAgZGVmIE5BTUUgICA6IE5WVk1fV01NQV9MRF9HQUxTVFM8R2VvbWV0cnksIEFiYywgTGF5b3V0LCBUeXBlLCByZWd0eSwgMD47Cit9CisKK211bHRpY2xhc3MgTlZWTV9XTU1BX0xEX0dBVDxzdHJpbmcgR2VvbWV0cnksIHN0cmluZyBBYmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgVHlwZSwgTExWTVR5cGUgcmVndHk+IHsKKyAgZGVmbSBfcm93OiBOVlZNX1dNTUFfTERfR0FMVDxHZW9tZXRyeSwgQWJjLCAicm93IiwgVHlwZSwgcmVndHk+OworICBkZWZtIF9jb2w6IE5WVk1fV01NQV9MRF9HQUxUPEdlb21ldHJ5LCBBYmMsICJjb2wiLCBUeXBlLCByZWd0eT47Cit9CisKK211bHRpY2xhc3MgTlZWTV9XTU1BX0xEX0c8c3RyaW5nIEdlb21ldHJ5PiB7CisgIGRlZm0gX2FfZjE2OiBOVlZNX1dNTUFfTERfR0FUPEdlb21ldHJ5LCAiYSIsICJmMTYiLCBsbHZtX3YyZjE2X3R5PjsKKyAgZGVmbSBfYl9mMTY6IE5WVk1fV01NQV9MRF9HQVQ8R2VvbWV0cnksICJiIiwgImYxNiIsIGxsdm1fdjJmMTZfdHk+OworICBkZWZtIF9jX2YxNjogTlZWTV9XTU1BX0xEX0dBVDxHZW9tZXRyeSwgImMiLCAiZjE2IiwgbGx2bV92MmYxNl90eT47CisgIGRlZm0gX2NfZjMyOiBOVlZNX1dNTUFfTERfR0FUPEdlb21ldHJ5LCAiYyIsICJmMzIiLCBsbHZtX2Zsb2F0X3R5PjsKK30KKworbXVsdGljbGFzcyBOVlZNX1dNTUFfTEQgeworICBkZWZtIF9tMTZuMTZrMTZfbG9hZDogTlZWTV9XTU1BX0xEX0c8Im0xNm4xNmsxNiI+OworfQorCitkZWZtIGludF9udnZtX3dtbWE6IE5WVk1fV01NQV9MRDsKKworLy8gV01NQS5TVE9SRS5ECitjbGFzcyBOVlZNX1dNTUFfU1REX0dMU1RTPHN0cmluZyBHZW9tZXRyeSwgc3RyaW5nIExheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIFR5cGUsIExMVk1UeXBlIHJlZ3R5LCBpbnQgV2l0aFN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBvbmx5IHVzZWQgdG8gY3JlYXRlIGEgdHlwZWQgZW1wdHkgYXJyYXkgd2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBwYXNzIHRvICFpZiBiZWxvdy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdDxMTFZNVHlwZT5FbXB0eT1bXT4KKyAgOiBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICFsaXN0Y29uY2F0KAorICAgICAgICAgICAgICAgIFtsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgIWlmKCFlcShUeXBlLCJmMTYiKSwKKyAgICAgICAgICAgICAgICAgICAgW3JlZ3R5LCByZWd0eSwgcmVndHksIHJlZ3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW3JlZ3R5LCByZWd0eSwgcmVndHksIHJlZ3R5LAorICAgICAgICAgICAgICAgICAgICAgcmVndHksIHJlZ3R5LCByZWd0eSwgcmVndHldKSwKKyAgICAgICAgICAgICAgICAhaWYoV2l0aFN0cmlkZSwgW2xsdm1faTMyX3R5XSwgRW1wdHkpKSwKKyAgICAgICAgICAgICAgW0ludHJXcml0ZU1lbSwgSW50ckFyZ01lbU9ubHksIFdyaXRlT25seTwwPiwgTm9DYXB0dXJlPDA+XSwKKyAgICAgICAgICAgICAgImxsdm0ubnZ2bS53bW1hLiIKKyAgICAgICAgICAgICAgICAgICAjIEdlb21ldHJ5CisgICAgICAgICAgICAgICAgICAgIyAiLnN0b3JlLmQiCisgICAgICAgICAgICAgICAgICAgIyAiLiIgIyBMYXlvdXQKKyAgICAgICAgICAgICAgICAgICAjICFpZihXaXRoU3RyaWRlLCAiLnN0cmlkZSIsICIiKQorICAgICAgICAgICAgICAgICAgICMgIi4iICMgVHlwZT47CisKK211bHRpY2xhc3MgTlZWTV9XTU1BX1NURF9HTFQ8c3RyaW5nIEdlb21ldHJ5LCBzdHJpbmcgTGF5b3V0LCAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIFR5cGUsIExMVk1UeXBlIHJlZ3R5PiB7CisgIGRlZiBfc3RyaWRlOiBOVlZNX1dNTUFfU1REX0dMU1RTPEdlb21ldHJ5LCBMYXlvdXQsIFR5cGUsIHJlZ3R5LCAxPjsKKyAgZGVmIE5BTUU6ICAgIE5WVk1fV01NQV9TVERfR0xTVFM8R2VvbWV0cnksIExheW91dCwgVHlwZSwgcmVndHksIDA+OworfQorCittdWx0aWNsYXNzIE5WVk1fV01NQV9TVERfR1Q8c3RyaW5nIEdlb21ldHJ5LCBzdHJpbmcgVHlwZSwgTExWTVR5cGUgcmVndHk+IHsKKyAgZGVmbSBfcm93OiBOVlZNX1dNTUFfU1REX0dMVDxHZW9tZXRyeSwgInJvdyIsIFR5cGUsIHJlZ3R5PjsKKyAgZGVmbSBfY29sOiBOVlZNX1dNTUFfU1REX0dMVDxHZW9tZXRyeSwgImNvbCIsIFR5cGUsIHJlZ3R5PjsKK30KK211bHRpY2xhc3MgTlZWTV9XTU1BX1NURF9HPHN0cmluZyBHZW9tZXRyeT4geworICBkZWZtIF9kX2YxNjogTlZWTV9XTU1BX1NURF9HVDxHZW9tZXRyeSwgImYxNiIsIGxsdm1fdjJmMTZfdHk+OworICBkZWZtIF9kX2YzMjogTlZWTV9XTU1BX1NURF9HVDxHZW9tZXRyeSwgImYzMiIsIGxsdm1fZmxvYXRfdHk+OworfQorCittdWx0aWNsYXNzIE5WVk1fV01NQV9TVEQgeworICBkZWZtIF9tMTZuMTZrMTZfc3RvcmU6IE5WVk1fV01NQV9TVERfRzwibTE2bjE2azE2Ij47Cit9CisKK2RlZm0gaW50X252dm1fd21tYTogTlZWTV9XTU1BX1NURDsKKworLy8gV01NQS5NTUEKK2NsYXNzIE5WVk1fV01NQV9NTUFfR0FCRENTPHN0cmluZyBHZW9tZXRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBBTGF5b3V0LCBzdHJpbmcgQkxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBEVHlwZSwgTExWTVR5cGUgZF9yZWd0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBDVHlwZSwgTExWTVR5cGUgY19yZWd0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBTYXRmaW5pdGUgPSAiIj4KKyAgOiBJbnRyaW5zaWM8IWlmKCFlcShEVHlwZSwiZjE2IiksCisgICAgICAgICAgICAgICAgICAgICAgW2RfcmVndHksIGRfcmVndHksIGRfcmVndHksIGRfcmVndHldLAorICAgICAgICAgICAgICAgICAgICAgIFtkX3JlZ3R5LCBkX3JlZ3R5LCBkX3JlZ3R5LCBkX3JlZ3R5LAorICAgICAgICAgICAgICAgICAgICAgICBkX3JlZ3R5LCBkX3JlZ3R5LCBkX3JlZ3R5LCBkX3JlZ3R5XSksCisgICAgICAgICAgICAgICFsaXN0Y29uY2F0KAorICAgICAgICAgICAgICAgIFsvLyBBCisgICAgICAgICAgICAgICAgbGx2bV92MmYxNl90eSwgbGx2bV92MmYxNl90eSwgbGx2bV92MmYxNl90eSwgbGx2bV92MmYxNl90eSwKKyAgICAgICAgICAgICAgICBsbHZtX3YyZjE2X3R5LCBsbHZtX3YyZjE2X3R5LCBsbHZtX3YyZjE2X3R5LCBsbHZtX3YyZjE2X3R5LAorICAgICAgICAgICAgICAgIC8vIEIKKyAgICAgICAgICAgICAgICBsbHZtX3YyZjE2X3R5LCBsbHZtX3YyZjE2X3R5LCBsbHZtX3YyZjE2X3R5LCBsbHZtX3YyZjE2X3R5LAorICAgICAgICAgICAgICAgIGxsdm1fdjJmMTZfdHksIGxsdm1fdjJmMTZfdHksIGxsdm1fdjJmMTZfdHksIGxsdm1fdjJmMTZfdHldLAorICAgICAgICAgICAgICAgICFpZighZXEoQ1R5cGUsImYxNiIpLAorICAgICAgICAgICAgICAgICAgICAgIFtjX3JlZ3R5LCBjX3JlZ3R5LCBjX3JlZ3R5LCBjX3JlZ3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICBbY19yZWd0eSwgY19yZWd0eSwgY19yZWd0eSwgY19yZWd0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgY19yZWd0eSwgY19yZWd0eSwgY19yZWd0eSwgY19yZWd0eV0pKSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0sCisgICAgICAgICAgICAgICJsbHZtLm52dm0ud21tYS4iCisgICAgICAgICAgICAgICAgIyBHZW9tZXRyeQorICAgICAgICAgICAgICAgICMgIi5tbWEiCisgICAgICAgICAgICAgICAgIyAiLiIgIyBBTGF5b3V0CisgICAgICAgICAgICAgICAgIyAiLiIgIyBCTGF5b3V0CisgICAgICAgICAgICAgICAgIyAiLiIgIyBEVHlwZQorICAgICAgICAgICAgICAgICMgIi4iICMgQ1R5cGUKKyAgICAgICAgICAgICAgICAjIFNhdGZpbml0ZT4geworfQorCittdWx0aWNsYXNzIE5WVk1fV01NQV9NTUFfR0FCREM8c3RyaW5nIEdlb21ldHJ5LCBzdHJpbmcgQUxheW91dCwgc3RyaW5nIEJMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIERUeXBlLCBMTFZNVHlwZSBkX3JlZ3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBDVHlwZSwgTExWTVR5cGUgY19yZWd0eT4geworICBkZWYgTkFNRSA6IE5WVk1fV01NQV9NTUFfR0FCRENTPEdlb21ldHJ5LCBBTGF5b3V0LCBCTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERUeXBlLCBkX3JlZ3R5LCBDVHlwZSwgY19yZWd0eT47CisgIGRlZiBfc2F0ZmluaXRlOiBOVlZNX1dNTUFfTU1BX0dBQkRDUzxHZW9tZXRyeSwgQUxheW91dCwgQkxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERUeXBlLCBkX3JlZ3R5LCBDVHlwZSwgY19yZWd0eSwiLnNhdGZpbml0ZSI+OworfQorCittdWx0aWNsYXNzIE5WVk1fV01NQV9NTUFfR0FCRDxzdHJpbmcgR2VvbWV0cnksIHN0cmluZyBBTGF5b3V0LCBzdHJpbmcgQkxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyBEVHlwZSwgTExWTVR5cGUgZF9yZWd0eT4geworICBkZWZtIF9mMTY6IE5WVk1fV01NQV9NTUFfR0FCREM8R2VvbWV0cnksIEFMYXlvdXQsIEJMYXlvdXQsIERUeXBlLCBkX3JlZ3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZjE2IiwgbGx2bV92MmYxNl90eT47CisgIGRlZm0gX2YzMjogTlZWTV9XTU1BX01NQV9HQUJEQzxHZW9tZXRyeSwgQUxheW91dCwgQkxheW91dCwgRFR5cGUsIGRfcmVndHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJmMzIiLCBsbHZtX2Zsb2F0X3R5PjsKK30KKworbXVsdGljbGFzcyBOVlZNX1dNTUFfTU1BX0dBQjxzdHJpbmcgR2VvbWV0cnksIHN0cmluZyBBTGF5b3V0LCBzdHJpbmcgQkxheW91dD4geworICBkZWZtIF9mMTY6IE5WVk1fV01NQV9NTUFfR0FCRDxHZW9tZXRyeSwgQUxheW91dCwgQkxheW91dCwgImYxNiIsIGxsdm1fdjJmMTZfdHk+OworICBkZWZtIF9mMzI6IE5WVk1fV01NQV9NTUFfR0FCRDxHZW9tZXRyeSwgQUxheW91dCwgQkxheW91dCwgImYzMiIsIGxsdm1fZmxvYXRfdHk+OworfQorCittdWx0aWNsYXNzIE5WVk1fV01NQV9NTUFfR0E8c3RyaW5nIEdlb21ldHJ5LCBzdHJpbmcgQUxheW91dD4geworICBkZWZtIF9jb2w6IE5WVk1fV01NQV9NTUFfR0FCPEdlb21ldHJ5LCBBTGF5b3V0LCAiY29sIj47CisgIGRlZm0gX3JvdzogTlZWTV9XTU1BX01NQV9HQUI8R2VvbWV0cnksIEFMYXlvdXQsICJyb3ciPjsKK30KKworbXVsdGljbGFzcyBOVlZNX1dNTUFfTU1BX0c8c3RyaW5nIEdlb21ldHJ5PiB7CisgIGRlZm0gX2NvbDogTlZWTV9XTU1BX01NQV9HQTxHZW9tZXRyeSwgImNvbCI+OworICBkZWZtIF9yb3c6IE5WVk1fV01NQV9NTUFfR0E8R2VvbWV0cnksICJyb3ciPjsKK30KKworbXVsdGljbGFzcyBOVlZNX1dNTUFfTU1BIHsKKyAgZGVmbSBfbTE2bjE2azE2X21tYSA6IE5WVk1fV01NQV9NTUFfRzwibTE2bjE2azE2Ij47Cit9CisKK2RlZm0gaW50X252dm1fd21tYSA6IE5WVk1fV01NQV9NTUE7CisKK30gLy8gbGV0IFRhcmdldFByZWZpeCA9ICJudnZtIgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzUG93ZXJQQy50ZCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc1Bvd2VyUEMudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMyMWJiOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc1Bvd2VyUEMudGQKQEAgLTAsMCArMSwxMTM3IEBACisvLz09PS0gSW50cmluc2ljc1Bvd2VyUEMudGQgLSBEZWZpbmVzIFBvd2VyUEMgaW50cmluc2ljcyAtLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8gCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLyAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYWxsIG9mIHRoZSBQb3dlclBDLXNwZWNpZmljIGludHJpbnNpY3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIERlZmluaXRpb25zIGZvciBhbGwgUG93ZXJQQyBpbnRyaW5zaWNzLgorLy8KKworLy8gTm9uLWFsdGl2ZWMgaW50cmluc2ljcy4KK2xldCBUYXJnZXRQcmVmaXggPSAicHBjIiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLnBwYy4iLgorICAvLyBkY2JhL2RjYmYvZGNiaS9kY2JzdC9kY2J0L2RjYnovZGNiemwoUFBDOTcwKSBpbnN0cnVjdGlvbnMuCisgIGRlZiBpbnRfcHBjX2RjYmEgIDogSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLCBbXT47CisgIGRlZiBpbnRfcHBjX2RjYmYgIDogSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLCBbXT47CisgIGRlZiBpbnRfcHBjX2RjYmkgIDogSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLCBbXT47CisgIGRlZiBpbnRfcHBjX2RjYnN0IDogSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLCBbXT47CisgIGRlZiBpbnRfcHBjX2RjYnQgIDogSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLAorICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+XT47CisgIGRlZiBpbnRfcHBjX2RjYnRzdDogSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLAorICAgIFtJbnRyQXJnTWVtT25seSwgTm9DYXB0dXJlPDA+XT47CisgIGRlZiBpbnRfcHBjX2RjYnogIDogSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLCBbXT47CisgIGRlZiBpbnRfcHBjX2RjYnpsIDogSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLCBbXT47CisKKyAgLy8gc3luYyBpbnN0cnVjdGlvbiAoaS5lLiBzeW5jIDAsIGEuay5hIGh3c3luYykKKyAgZGVmIGludF9wcGNfc3luYyA6IEludHJpbnNpYzxbXSwgW10sIFtdPjsKKyAgLy8gbHdzeW5jIGlzIHN5bmMgMQorICBkZWYgaW50X3BwY19sd3N5bmMgOiBJbnRyaW5zaWM8W10sIFtdLCBbXT47CisKKyAgLy8gSW50cmluc2ljcyB1c2VkIHRvIGdlbmVyYXRlIGN0ci1iYXNlZCBsb29wcy4gVGhlc2Ugc2hvdWxkIG9ubHkgYmUKKyAgLy8gZ2VuZXJhdGVkIGJ5IHRoZSBQb3dlclBDIGJhY2tlbmQhCisgIGRlZiBpbnRfcHBjX210Y3RyIDogSW50cmluc2ljPFtdLCBbbGx2bV9hbnlpbnRfdHldLCBbXT47CisgIGRlZiBpbnRfcHBjX2lzX2RlY3JlbWVudGVkX2N0cl9ub256ZXJvIDogSW50cmluc2ljPFtsbHZtX2kxX3R5XSwgW10sIFtdPjsKKworICAvLyBJbnRyaW5zaWNzIGZvciBbZG91YmxlXXdvcmQgZXh0ZW5kZWQgZm9ybXMgb2YgZGl2aWRlIGluc3RydWN0aW9ucworICBkZWYgaW50X3BwY19kaXZ3ZSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9kaXZ3ZSI+LAorICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19kaXZ3ZXUgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fZGl2d2V1Ij4sCisgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfZGl2ZGUgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fZGl2ZGUiPiwKKyAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfZGl2ZGV1IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2RpdmRldSI+LAorICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgLy8gQml0IHBlcm11dGUgZG91Ymxld29yZAorICBkZWYgaW50X3BwY19icGVybWQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYnBlcm1kIj4sCisgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KKworCitsZXQgVGFyZ2V0UHJlZml4ID0gInBwYyIgaW4geyAgLy8gQWxsIFBQQyBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ucHBjLiIuCisgIC8vLyBQb3dlclBDX1ZlY19JbnRyaW5zaWMgLSBCYXNlIGNsYXNzIGZvciBhbGwgYWx0aXZlYyBpbnRyaW5zaWNzLgorICBjbGFzcyBQb3dlclBDX1ZlY19JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeCwgbGlzdDxMTFZNVHlwZT4gcmV0X3R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdDxMTFZNVHlwZT4gcGFyYW1fdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0PEludHJpbnNpY1Byb3BlcnR5PiBwcm9wZXJ0aWVzPgorICAgIDogR0NDQnVpbHRpbjwhc3RyY29uY2F0KCJfX2J1aWx0aW5fYWx0aXZlY18iLCBHQ0NJbnRTdWZmaXgpPiwKKyAgICAgIEludHJpbnNpYzxyZXRfdHlwZXMsIHBhcmFtX3R5cGVzLCBwcm9wZXJ0aWVzPjsKKworICAvLy8gUG93ZXJQQ19WU1hfSW50cmluc2ljIC0gQmFzZSBjbGFzcyBmb3IgYWxsIFZTWCBpbnRyaW5zaWNzLgorICBjbGFzcyBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeCwgbGlzdDxMTFZNVHlwZT4gcmV0X3R5cGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdDxMTFZNVHlwZT4gcGFyYW1fdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0PEludHJpbnNpY1Byb3BlcnR5PiBwcm9wZXJ0aWVzPgorICAgIDogR0NDQnVpbHRpbjwhc3RyY29uY2F0KCJfX2J1aWx0aW5fdnN4XyIsIEdDQ0ludFN1ZmZpeCk+LAorICAgICAgSW50cmluc2ljPHJldF90eXBlcywgcGFyYW1fdHlwZXMsIHByb3BlcnRpZXM+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUG93ZXJQQyBBbHRpdmVjIEludHJpbnNpYyBDbGFzcyBEZWZpbml0aW9ucy4KKy8vCisKKy8vLyBQb3dlclBDX1ZlY19GRl9JbnRyaW5zaWMgLSBBIFBvd2VyUEMgaW50cmluc2ljIHRoYXQgdGFrZXMgb25lIHY0ZjMyCisvLy8gdmVjdG9yIGFuZCByZXR1cm5zIG9uZS4gIFRoZXNlIGludHJpbnNpY3MgaGF2ZSBubyBzaWRlIGVmZmVjdHMuCitjbGFzcyBQb3dlclBDX1ZlY19GRl9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBQb3dlclBDX1ZlY19JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworCisvLy8gUG93ZXJQQ19WZWNfRkZGX0ludHJpbnNpYyAtIEEgUG93ZXJQQyBpbnRyaW5zaWMgdGhhdCB0YWtlcyB0d28gdjRmMzIKKy8vLyB2ZWN0b3JzIGFuZCByZXR1cm5zIG9uZS4gIFRoZXNlIGludHJpbnNpY3MgaGF2ZSBubyBzaWRlIGVmZmVjdHMuCitjbGFzcyBQb3dlclBDX1ZlY19GRkZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogUG93ZXJQQ19WZWNfSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8vIFBvd2VyUENfVmVjX0JCQl9JbnRyaW5zaWMgLSBBIFBvd2VyUEMgaW50cmluc2ljIHRoYXQgdGFrZXMgdHdvIHYxNmk4CisvLy8gdmVjdG9ycyBhbmQgcmV0dXJucyBvbmUuICBUaGVzZSBpbnRyaW5zaWNzIGhhdmUgbm8gc2lkZSBlZmZlY3RzLgorY2xhc3MgUG93ZXJQQ19WZWNfQkJCX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PiAKKyAgOiBQb3dlclBDX1ZlY19JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLy8gUG93ZXJQQ19WZWNfSEhIX0ludHJpbnNpYyAtIEEgUG93ZXJQQyBpbnRyaW5zaWMgdGhhdCB0YWtlcyB0d28gdjhpMTYKKy8vLyB2ZWN0b3JzIGFuZCByZXR1cm5zIG9uZS4gIFRoZXNlIGludHJpbnNpY3MgaGF2ZSBubyBzaWRlIGVmZmVjdHMuCitjbGFzcyBQb3dlclBDX1ZlY19ISEhfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+IAorICA6IFBvd2VyUENfVmVjX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vLyBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljIC0gQSBQb3dlclBDIGludHJpbnNpYyB0aGF0IHRha2VzIHR3byB2NGkzMgorLy8vIHZlY3RvcnMgYW5kIHJldHVybnMgb25lLiAgVGhlc2UgaW50cmluc2ljcyBoYXZlIG5vIHNpZGUgZWZmZWN0cy4KK2NsYXNzIFBvd2VyUENfVmVjX1dXV19JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4gCisgIDogUG93ZXJQQ19WZWNfSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8vIFBvd2VyUENfVmVjX0RERF9JbnRyaW5zaWMgLSBBIFBvd2VyUEMgaW50cmluc2ljIHRoYXQgdGFrZXMgdHdvIHYyaTY0CisvLy8gdmVjdG9ycyBhbmQgcmV0dXJucyBvbmUuICBUaGVzZSBpbnRyaW5zaWNzIGhhdmUgbm8gc2lkZSBlZmZlY3RzLgorY2xhc3MgUG93ZXJQQ19WZWNfREREX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IFBvd2VyUENfVmVjX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vLyBQb3dlclBDX1ZlY19RUVFfSW50cmluc2ljIC0gQSBQb3dlclBDIGludHJpbnNpYyB0aGF0IHRha2VzIHR3byB2MWkxMjgKKy8vLyB2ZWN0b3JzIGFuZCByZXR1cm5zIG9uZS4gVGhlc2UgaW50cmluc2ljcyBoYXZlIG5vIHNpZGUgZWZmZWN0cy4KK2NsYXNzIFBvd2VyUENfVmVjX1FRUV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBQb3dlclBDX1ZlY19JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxaTEyOF90eV0sIFtsbHZtX3YxaTEyOF90eSwgbGx2bV92MWkxMjhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBvd2VyUEMgVlNYIEludHJpbnNpYyBDbGFzcyBEZWZpbml0aW9ucy4KKy8vCisKKy8vLyBQb3dlclBDX1ZTWF9WZWNfREREX0ludHJpbnNpYyAtIEEgUG93ZXJQQyBpbnRyaW5zaWMgdGhhdCB0YWtlcyB0d28gdjJmNjQKKy8vLyB2ZWN0b3JzIGFuZCByZXR1cm5zIG9uZS4gIFRoZXNlIGludHJpbnNpY3MgaGF2ZSBubyBzaWRlIGVmZmVjdHMuCitjbGFzcyBQb3dlclBDX1ZTWF9WZWNfREREX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IFBvd2VyUENfVlNYX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vLyBQb3dlclBDX1ZTWF9WZWNfRkZGX0ludHJpbnNpYyAtIEEgUG93ZXJQQyBpbnRyaW5zaWMgdGhhdCB0YWtlcyB0d28gdjRmMzIKKy8vLyB2ZWN0b3JzIGFuZCByZXR1cm5zIG9uZS4gIFRoZXNlIGludHJpbnNpY3MgaGF2ZSBubyBzaWRlIGVmZmVjdHMuCitjbGFzcyBQb3dlclBDX1ZTWF9WZWNfRkZGX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IFBvd2VyUENfVlNYX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vLyBQb3dlclBDX1ZTWF9TY2FfREREX0ludHJpbnNpYyAtIEEgUG93ZXJQQyBpbnRyaW5zaWMgdGhhdCB0YWtlcyB0d28gZjY0CisvLy8gc2NhbGFycyBhbmQgcmV0dXJucyBvbmUuICBUaGVzZSBpbnRyaW5zaWNzIGhhdmUgbm8gc2lkZSBlZmZlY3RzLgorY2xhc3MgUG93ZXJQQ19WU1hfU2NhX0RERF9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9kb3VibGVfdHldLCBbbGx2bV9kb3VibGVfdHksIGxsdm1fZG91YmxlX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUG93ZXJQQyBBbHRpdmVjIEludHJpbnNpYyBEZWZpbml0aW9ucy4KKworbGV0IFRhcmdldFByZWZpeCA9ICJwcGMiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ucHBjLiIuCisgIC8vIERhdGEgU3RyZWFtIENvbnRyb2wuCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfZHNzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfZHNzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XSwgW10+OworICBkZWYgaW50X3BwY19hbHRpdmVjX2Rzc2FsbCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX2Rzc2FsbCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtdLCBbXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfZHN0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfZHN0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtdPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY19kc3R0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfZHN0dCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfZHN0c3QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY19kc3RzdCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfZHN0c3R0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfZHN0c3R0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtdPjsKKworICAvLyBWU0NSIGFjY2Vzcy4KKyAgZGVmIGludF9wcGNfYWx0aXZlY19tZnZzY3IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY19tZnZzY3IiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW10sIFtJbnRyUmVhZE1lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX210dnNjciA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX210dnNjciI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3Y0aTMyX3R5XSwgW10+OworCisKKyAgLy8gTG9hZHMuICBUaGVzZSBkb24ndCBtYXAgZGlyZWN0bHkgdG8gR0NDIGJ1aWx0aW5zIGJlY2F1c2UgdGhleSByZXByZXNlbnQgdGhlCisgIC8vIHNvdXJjZSBhZGRyZXNzIHdpdGggYSBzaW5nbGUgcG9pbnRlci4KKyAgZGVmIGludF9wcGNfYWx0aXZlY19sdnggOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfbHZ4bCA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY19sdmVieCA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY19sdmVoeCA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY19sdmV3eCA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworICAvLyBTdG9yZXMuICBUaGVzZSBkb24ndCBtYXAgZGlyZWN0bHkgdG8gR0NDIGJ1aWx0aW5zIGJlY2F1c2UgdGhleSByZXByZXNlbnQgdGhlCisgIC8vIHNvdXJjZSBhZGRyZXNzIHdpdGggYSBzaW5nbGUgcG9pbnRlci4KKyAgZGVmIGludF9wcGNfYWx0aXZlY19zdHZ4IDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV92NGkzMl90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJXcml0ZU1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY19zdHZ4bCA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyV3JpdGVNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfc3R2ZWJ4IDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV92MTZpOF90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJXcml0ZU1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY19zdHZlaHggOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3B0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50cldyaXRlTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3N0dmV3eCA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyV3JpdGVNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKyAgLy8gQ29tcGFyaXNvbnMgc2V0dGluZyBhIHZlY3Rvci4KKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wYmZwIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGJmcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGVxZnAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wZXFmcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGdlZnAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wZ2VmcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGd0ZnAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RmcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wZXF1ZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXVkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wZ3RzZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wZ3R1ZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBlcXV3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdXciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndHN3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c3ciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndHV3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dXciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBuZXcgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wbmV3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wbmV6dyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBuZXp3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgICAgICAgICAgICAgICAgICAgICAgIAorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBlcXVoIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndHNoIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2giPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndHVoIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBuZWggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wbmVoIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wbmV6aCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBuZXpoIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBlcXViIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxdWIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndHNiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0c2IiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndHViIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0dWIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBuZWIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wbmViIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wbmV6YiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBuZXpiIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICAvLyBQcmVkaWNhdGUgQ29tcGFyaXNvbnMuICBUaGUgZmlyc3Qgb3BlcmFuZCBzcGVjaWZpZXMgaW50ZXJwcmV0YXRpb24gb2YgQ1I2LgorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBiZnBfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBiZnBfcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9pMzJfdHksbGx2bV92NGYzMl90eSxsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wZXFmcF9wIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGVxZnBfcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9pMzJfdHksbGx2bV92NGYzMl90eSxsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wZ2VmcF9wIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGdlZnBfcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9pMzJfdHksbGx2bV92NGYzMl90eSxsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y21wZ3RmcF9wIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcGd0ZnBfcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9pMzJfdHksbGx2bV92NGYzMl90eSxsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBlcXVkX3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wZXF1ZF9wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3YyaTY0X3R5LGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndHNkX3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3RzZF9wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3YyaTY0X3R5LGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBndHVkX3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wZ3R1ZF9wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3YyaTY0X3R5LGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGVxdXdfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXV3X3AiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1faTMyX3R5LGxsdm1fdjRpMzJfdHksbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGd0c3dfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHN3X3AiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1faTMyX3R5LGxsdm1fdjRpMzJfdHksbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGd0dXdfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHV3X3AiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1faTMyX3R5LGxsdm1fdjRpMzJfdHksbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcG5ld19wIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcG5ld19wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y0aTMyX3R5LGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBuZXp3X3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wbmV6d19wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y0aTMyX3R5LGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICAgICAgICAgICAgICAgICAgICAgICAgCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGVxdWhfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXVoX3AiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1faTMyX3R5LGxsdm1fdjhpMTZfdHksbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGd0c2hfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNoX3AiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1faTMyX3R5LGxsdm1fdjhpMTZfdHksbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGd0dWhfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHVoX3AiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1faTMyX3R5LGxsdm1fdjhpMTZfdHksbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcG5laF9wIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcG5laF9wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y4aTE2X3R5LGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBuZXpoX3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wbmV6aF9wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y4aTE2X3R5LGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGVxdWJfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBlcXViX3AiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1faTMyX3R5LGxsdm1fdjE2aThfdHksbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGd0c2JfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHNiX3AiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1faTMyX3R5LGxsdm1fdjE2aThfdHksbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcGd0dWJfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjbXBndHViX3AiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1faTMyX3R5LGxsdm1fdjE2aThfdHksbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNtcG5lYl9wIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNtcG5lYl9wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3YxNmk4X3R5LGxsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbXBuZXpiX3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y21wbmV6Yl9wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3YxNmk4X3R5LGxsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjbHpsc2JiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNsemxzYmIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1fdjE2aThfdHldLFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y3R6bHNiYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZjdHpsc2JiIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX3YxNmk4X3R5XSxbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnBydHlidyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZwcnR5YnciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSxbbGx2bV92NGkzMl90eV0sW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZwcnR5YmQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192cHJ0eWJkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sW2xsdm1fdjJpNjRfdHldLFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192cHJ0eWJxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnBydHlicSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjFpMTI4X3R5XSxbbGx2bV92MWkxMjhfdHldLFtJbnRyTm9NZW1dPjsKKworfQorCisvLyBWZWN0b3IgYXZlcmFnZS4KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdmF2Z3NiIDogUG93ZXJQQ19WZWNfQkJCX0ludHJpbnNpYzwidmF2Z3NiIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZhdmdzaCA6IFBvd2VyUENfVmVjX0hISF9JbnRyaW5zaWM8InZhdmdzaCI+OworZGVmIGludF9wcGNfYWx0aXZlY192YXZnc3cgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2YXZnc3ciPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdmF2Z3ViIDogUG93ZXJQQ19WZWNfQkJCX0ludHJpbnNpYzwidmF2Z3ViIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3Zhdmd1aCA6IFBvd2VyUENfVmVjX0hISF9JbnRyaW5zaWM8InZhdmd1aCI+OworZGVmIGludF9wcGNfYWx0aXZlY192YXZndXcgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2YXZndXciPjsKKworLy8gVmVjdG9yIG1heGltdW0uCitkZWYgaW50X3BwY19hbHRpdmVjX3ZtYXhmcCA6IFBvd2VyUENfVmVjX0ZGRl9JbnRyaW5zaWM8InZtYXhmcCI+OworZGVmIGludF9wcGNfYWx0aXZlY192bWF4c2IgOiBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPCJ2bWF4c2IiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdm1heHNoIDogUG93ZXJQQ19WZWNfSEhIX0ludHJpbnNpYzwidm1heHNoIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZtYXhzdyA6IFBvd2VyUENfVmVjX1dXV19JbnRyaW5zaWM8InZtYXhzdyI+OworZGVmIGludF9wcGNfYWx0aXZlY192bWF4c2QgOiBQb3dlclBDX1ZlY19ERERfSW50cmluc2ljPCJ2bWF4c2QiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdm1heHViIDogUG93ZXJQQ19WZWNfQkJCX0ludHJpbnNpYzwidm1heHViIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZtYXh1aCA6IFBvd2VyUENfVmVjX0hISF9JbnRyaW5zaWM8InZtYXh1aCI+OworZGVmIGludF9wcGNfYWx0aXZlY192bWF4dXcgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2bWF4dXciPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdm1heHVkIDogUG93ZXJQQ19WZWNfREREX0ludHJpbnNpYzwidm1heHVkIj47CisKKy8vIFZlY3RvciBtaW5pbXVtLgorZGVmIGludF9wcGNfYWx0aXZlY192bWluZnAgOiBQb3dlclBDX1ZlY19GRkZfSW50cmluc2ljPCJ2bWluZnAiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdm1pbnNiIDogUG93ZXJQQ19WZWNfQkJCX0ludHJpbnNpYzwidm1pbnNiIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZtaW5zaCA6IFBvd2VyUENfVmVjX0hISF9JbnRyaW5zaWM8InZtaW5zaCI+OworZGVmIGludF9wcGNfYWx0aXZlY192bWluc3cgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2bWluc3ciPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdm1pbnNkIDogUG93ZXJQQ19WZWNfREREX0ludHJpbnNpYzwidm1pbnNkIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZtaW51YiA6IFBvd2VyUENfVmVjX0JCQl9JbnRyaW5zaWM8InZtaW51YiI+OworZGVmIGludF9wcGNfYWx0aXZlY192bWludWggOiBQb3dlclBDX1ZlY19ISEhfSW50cmluc2ljPCJ2bWludWgiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdm1pbnV3IDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidm1pbnV3Ij47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZtaW51ZCA6IFBvd2VyUENfVmVjX0RERF9JbnRyaW5zaWM8InZtaW51ZCI+OworCisvLyBTYXR1cmF0aW5nIGFkZHMuCitkZWYgaW50X3BwY19hbHRpdmVjX3ZhZGR1YnMgOiBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPCJ2YWRkdWJzIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZhZGRzYnMgOiBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPCJ2YWRkc2JzIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZhZGR1aHMgOiBQb3dlclBDX1ZlY19ISEhfSW50cmluc2ljPCJ2YWRkdWhzIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZhZGRzaHMgOiBQb3dlclBDX1ZlY19ISEhfSW50cmluc2ljPCJ2YWRkc2hzIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZhZGR1d3MgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2YWRkdXdzIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZhZGRzd3MgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2YWRkc3dzIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZhZGRjdXcgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2YWRkY3V3Ij47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZhZGRjdXEgOiBQb3dlclBDX1ZlY19RUVFfSW50cmluc2ljPCJ2YWRkY3VxIj47CisKKy8vIFNhdHVyYXRpbmcgc3Vicy4KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnN1YnVicyA6IFBvd2VyUENfVmVjX0JCQl9JbnRyaW5zaWM8InZzdWJ1YnMiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnN1YnNicyA6IFBvd2VyUENfVmVjX0JCQl9JbnRyaW5zaWM8InZzdWJzYnMiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnN1YnVocyA6IFBvd2VyUENfVmVjX0hISF9JbnRyaW5zaWM8InZzdWJ1aHMiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnN1YnNocyA6IFBvd2VyUENfVmVjX0hISF9JbnRyaW5zaWM8InZzdWJzaHMiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnN1YnV3cyA6IFBvd2VyUENfVmVjX1dXV19JbnRyaW5zaWM8InZzdWJ1d3MiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnN1YnN3cyA6IFBvd2VyUENfVmVjX1dXV19JbnRyaW5zaWM8InZzdWJzd3MiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnN1YmN1dyA6IFBvd2VyUENfVmVjX1dXV19JbnRyaW5zaWM8InZzdWJjdXciPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnN1YmN1cSA6IFBvd2VyUENfVmVjX1FRUV9JbnRyaW5zaWM8InZzdWJjdXEiPjsKKworbGV0IFRhcmdldFByZWZpeCA9ICJwcGMiIGluIHsgIC8vIEFsbCBQUEMgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLnBwYy4iLgorICAvLyBTYXR1cmF0aW5nIG11bHRpcGx5LWFkZHMuCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm1oYWRkc2hzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm1oYWRkc2hzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm1ocmFkZHNocyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZtaHJhZGRzaHMiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZtYWRkZnAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bWFkZGZwIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm5tc3ViZnAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bm1zdWJmcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIC8vIFZlY3RvciBNdWx0aXBseSBTdW0gSW50cnVjdGlvbnMuCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm1zdW1tYm0gOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bXN1bW1ibSI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksCisgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm1zdW1zaG0gOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bXN1bXNobSI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm1zdW1zaHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bXN1bXNocyI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIAorICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3Ztc3VtdWJtIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm1zdW11Ym0iPiwKKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192bXN1bXVobSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3Ztc3VtdWhtIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192bXN1bXVocyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3Ztc3VtdWhzIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICAvLyBWZWN0b3IgTXVsdGlwbHkgSW50cnVjdGlvbnMuCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm11bGVzYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxlc2IiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192bXVsZXNoIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm11bGVzaCI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZtdWxlc3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bXVsZXN3Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm11bGV1YiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxldWIiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192bXVsZXVoIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm11bGV1aCI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZtdWxldXcgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bXVsZXV3Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9wcGNfYWx0aXZlY192bXVsb3NiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm11bG9zYiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZtdWxvc2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bXVsb3NoIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm11bG9zdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxvc3ciPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192bXVsb3ViIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdm11bG91YiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZtdWxvdWggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bXVsb3VoIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdm11bG91dyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZtdWxvdXciPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICAvLyBWZWN0b3IgU3VtIEludHJ1Y3Rpb25zLgorICBkZWYgaW50X3BwY19hbHRpdmVjX3ZzdW1zd3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192c3Vtc3dzIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZzdW0yc3dzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnN1bTJzd3MiPiwKKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnN1bTRzYnMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192c3VtNHNicyI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192c3VtNHNocyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZzdW00c2hzIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZzdW00dWJzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnN1bTR1YnMiPiwKKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgLy8gT3RoZXIgbXVsdGlwbGllcy4KKyAgZGVmIGludF9wcGNfYWx0aXZlY192bWxhZGR1aG0gOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192bWxhZGR1aG0iPiwKKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LCAKKyAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKworICAvLyBQYWNrcy4KKyAgZGVmIGludF9wcGNfYWx0aXZlY192cGtweCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3Zwa3B4Ij4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3Zwa3Noc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192cGtzaHNzIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3Zwa3NodXMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192cGtzaHVzIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3Zwa3N3c3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192cGtzd3NzIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3Zwa3N3dXMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192cGtzd3VzIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3Zwa3Nkc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192cGtzZHNzIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3Zwa3NkdXMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192cGtzZHVzIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICAvLyB2cGt1aHVtIGlzIGxvd2VyZWQgdG8gYSBzaHVmZmxlLgorICBkZWYgaW50X3BwY19hbHRpdmVjX3Zwa3VodXMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192cGt1aHVzIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICAvLyB2cGt1d3VtIGlzIGxvd2VyZWQgdG8gYSBzaHVmZmxlLgorICBkZWYgaW50X3BwY19hbHRpdmVjX3Zwa3V3dXMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192cGt1d3VzIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICAvLyB2cGt1ZHVtIGlzIGxvd2VyZWQgdG8gYSBzaHVmZmxlLgorICBkZWYgaW50X3BwY19hbHRpdmVjX3Zwa3VkdXMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192cGt1ZHVzIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIC8vIFVucGFja3MuCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnVwa2hweCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtocHgiPiwKKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3Z1cGtoc2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192dXBraHNiIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192dXBraHNoIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnVwa2hzaCI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnVwa2hzdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtoc3ciPiwKKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3Z1cGtscHggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192dXBrbHB4Ij4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192dXBrbHNiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnVwa2xzYiI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnVwa2xzaCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3Z1cGtsc2giPiwKKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3Z1cGtsc3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192dXBrbHN3Ij4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworCisgIC8vIEZQIDwtPiBpbnRlZ2VyIGNvbnZlcnNpb24uCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmNmc3ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y2ZzeCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZjZnV4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmNmdXgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y3RzeHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y3RzeHMiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192Y3R1eHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Y3R1eHMiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZyZmltIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnJmaW0iPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnJmaW4gOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192cmZpbiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192cmZpcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZyZmlwIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX3ZyZml6IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnJmaXoiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgLy8gQWRkIEV4dGVuZGVkIFF1YWR3b3JkCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmFkZGV1cW0gOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192YWRkZXVxbSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjFpMTI4X3R5XSwgCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MWkxMjhfdHksIGxsdm1fdjFpMTI4X3R5LCBsbHZtX3YxaTEyOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmFkZGVjdXEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192YWRkZWN1cSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjFpMTI4X3R5XSwgCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MWkxMjhfdHksIGxsdm1fdjFpMTI4X3R5LCBsbHZtX3YxaTEyOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgLy8gU3ViIEV4dGVuZGVkIFF1YWR3b3JkCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnN1YmV1cW0gOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192c3ViZXVxbSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjFpMTI4X3R5XSwgCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MWkxMjhfdHksIGxsdm1fdjFpMTI4X3R5LCBsbHZtX3YxaTEyOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdnN1YmVjdXEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192c3ViZWN1cSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjFpMTI4X3R5XSwgCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MWkxMjhfdHksIGxsdm1fdjFpMTI4X3R5LCBsbHZtX3YxaTEyOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnNsICAgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2c2wiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnNsbyAgOiBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJ2c2xvIj47CisKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnNsYiAgOiBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPCJ2c2xiIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZzbHYgIDogUG93ZXJQQ19WZWNfQkJCX0ludHJpbnNpYzwidnNsdiI+OworZGVmIGludF9wcGNfYWx0aXZlY192c3J2ICA6IFBvd2VyUENfVmVjX0JCQl9JbnRyaW5zaWM8InZzcnYiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnNsaCAgOiBQb3dlclBDX1ZlY19ISEhfSW50cmluc2ljPCJ2c2xoIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZzbHcgIDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidnNsdyI+OworCisvLyBSaWdodCBTaGlmdHMuCitkZWYgaW50X3BwY19hbHRpdmVjX3ZzciAgIDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidnNyIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3Zzcm8gIDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidnNybyI+OworICAKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnNyYiAgOiBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPCJ2c3JiIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZzcmggIDogUG93ZXJQQ19WZWNfSEhIX0ludHJpbnNpYzwidnNyaCI+OworZGVmIGludF9wcGNfYWx0aXZlY192c3J3ICA6IFBvd2VyUENfVmVjX1dXV19JbnRyaW5zaWM8InZzcnciPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnNyYWIgOiBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPCJ2c3JhYiI+OworZGVmIGludF9wcGNfYWx0aXZlY192c3JhaCA6IFBvd2VyUENfVmVjX0hISF9JbnRyaW5zaWM8InZzcmFoIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZzcmF3IDogUG93ZXJQQ19WZWNfV1dXX0ludHJpbnNpYzwidnNyYXciPjsKKworLy8gUm90YXRlcy4KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnJsYiAgOiBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPCJ2cmxiIj47CitkZWYgaW50X3BwY19hbHRpdmVjX3ZybGggIDogUG93ZXJQQ19WZWNfSEhIX0ludHJpbnNpYzwidnJsaCI+OworZGVmIGludF9wcGNfYWx0aXZlY192cmx3ICA6IFBvd2VyUENfVmVjX1dXV19JbnRyaW5zaWM8InZybHciPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnJsZCAgOiBQb3dlclBDX1ZlY19ERERfSW50cmluc2ljPCJ2cmxkIj47CisKK2xldCBUYXJnZXRQcmVmaXggPSAicHBjIiBpbiB7ICAvLyBBbGwgUFBDIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS5wcGMuIi4KKyAgLy8gTWlzY2VsbGFuZW91cy4KKyAgZGVmIGludF9wcGNfYWx0aXZlY19sdnNsIDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX2x2c3IgOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9wcGNfYWx0aXZlY192cGVybSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX3ZwZXJtXzRzaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192c2VsIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdnNlbF80c2kiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfdmdiYmQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY192Z2JiZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9wcGNfYWx0aXZlY192YnBlcm1xIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfdmJwZXJtcSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdmV4cHRlZnAgIDogUG93ZXJQQ19WZWNfRkZfSW50cmluc2ljPCJ2ZXhwdGVmcCI+OworZGVmIGludF9wcGNfYWx0aXZlY192bG9nZWZwICAgOiBQb3dlclBDX1ZlY19GRl9JbnRyaW5zaWM8InZsb2dlZnAiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnJlZnAgICAgIDogUG93ZXJQQ19WZWNfRkZfSW50cmluc2ljPCJ2cmVmcCI+OworZGVmIGludF9wcGNfYWx0aXZlY192cnNxcnRlZnAgOiBQb3dlclBDX1ZlY19GRl9JbnRyaW5zaWM8InZyc3FydGVmcCI+OworCisvLyBQb3dlcjggSW50cmluc2ljcworLy8gQ3J5cHRvCitsZXQgVGFyZ2V0UHJlZml4ID0gInBwYyIgaW4geyAgLy8gQWxsIFBQQyBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ucHBjLiIuCisgIGRlZiBpbnRfcHBjX2FsdGl2ZWNfY3J5cHRvX3ZzYm94IDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2FsdGl2ZWNfY3J5cHRvX3ZzYm94Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3BwY19hbHRpdmVjX2NyeXB0b192cGVybXhvciA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX2NyeXB0b192cGVybXhvciI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworCitkZWYgaW50X3BwY19hbHRpdmVjX2NyeXB0b192c2hhc2lnbWFkIDoKKyAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9hbHRpdmVjX2NyeXB0b192c2hhc2lnbWFkIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfYWx0aXZlY19jcnlwdG9fdnNoYXNpZ21hdyA6CisgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fYWx0aXZlY19jcnlwdG9fdnNoYXNpZ21hdyI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK30KK2RlZiBpbnRfcHBjX2FsdGl2ZWNfY3J5cHRvX3ZjaXBoZXIgOgorICAgICAgICAgICAgUG93ZXJQQ19WZWNfREREX0ludHJpbnNpYzwiY3J5cHRvX3ZjaXBoZXIiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfY3J5cHRvX3ZjaXBoZXJsYXN0IDoKKyAgICAgICAgICAgIFBvd2VyUENfVmVjX0RERF9JbnRyaW5zaWM8ImNyeXB0b192Y2lwaGVybGFzdCI+OworZGVmIGludF9wcGNfYWx0aXZlY19jcnlwdG9fdm5jaXBoZXIgOgorICAgICAgICAgICAgUG93ZXJQQ19WZWNfREREX0ludHJpbnNpYzwiY3J5cHRvX3ZuY2lwaGVyIj47CitkZWYgaW50X3BwY19hbHRpdmVjX2NyeXB0b192bmNpcGhlcmxhc3QgOgorICAgICAgICAgICAgUG93ZXJQQ19WZWNfREREX0ludHJpbnNpYzwiY3J5cHRvX3ZuY2lwaGVybGFzdCI+OworZGVmIGludF9wcGNfYWx0aXZlY19jcnlwdG9fdnBtc3VtYiA6CisgICAgICAgICAgICBQb3dlclBDX1ZlY19CQkJfSW50cmluc2ljPCJjcnlwdG9fdnBtc3VtYiI+OworZGVmIGludF9wcGNfYWx0aXZlY19jcnlwdG9fdnBtc3VtaCA6CisgICAgICAgICAgICBQb3dlclBDX1ZlY19ISEhfSW50cmluc2ljPCJjcnlwdG9fdnBtc3VtaCI+OworZGVmIGludF9wcGNfYWx0aXZlY19jcnlwdG9fdnBtc3VtdyA6CisgICAgICAgICAgICBQb3dlclBDX1ZlY19XV1dfSW50cmluc2ljPCJjcnlwdG9fdnBtc3VtdyI+OworZGVmIGludF9wcGNfYWx0aXZlY19jcnlwdG9fdnBtc3VtZCA6CisgICAgICAgICAgICBQb3dlclBDX1ZlY19ERERfSW50cmluc2ljPCJjcnlwdG9fdnBtc3VtZCI+OworCisvLyBBYnNvbHV0ZSBEaWZmZXJlbmNlIGludHJpbnNpY3MKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdmFic2R1YiA6IFBvd2VyUENfVmVjX0JCQl9JbnRyaW5zaWM8InZhYnNkdWIiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdmFic2R1aCA6IFBvd2VyUENfVmVjX0hISF9JbnRyaW5zaWM8InZhYnNkdWgiPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdmFic2R1dyA6IFBvd2VyUENfVmVjX1dXV19JbnRyaW5zaWM8InZhYnNkdXciPjsKKworLy8gVmVjdG9yIHJvdGF0ZXMKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnJsd25tIDoKKyAgICAgIFBvd2VyUENfVmVjX0ludHJpbnNpYzwidnJsd25tIiwgW2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfYWx0aXZlY192cmx3bWkgOgorICAgICAgUG93ZXJQQ19WZWNfSW50cmluc2ljPCJ2cmx3bWkiLCBbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX2FsdGl2ZWNfdnJsZG5tIDoKKyAgICAgIFBvd2VyUENfVmVjX0ludHJpbnNpYzwidnJsZG5tIiwgW2xsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfYWx0aXZlY192cmxkbWkgOgorICAgICAgUG93ZXJQQ19WZWNfSW50cmluc2ljPCJ2cmxkbWkiLCBbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBvd2VyUEMgVlNYIEludHJpbnNpYyBEZWZpbml0aW9ucy4KKworbGV0IFRhcmdldFByZWZpeCA9ICJwcGMiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ucHBjLiIuCisKKy8vIFZlY3RvciBsb2FkLgorZGVmIGludF9wcGNfdnN4X2x4dnc0eCA6CisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CitkZWYgaW50X3BwY192c3hfbHh2ZDJ4IDoKKyAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfcHBjX3ZzeF9seHZ3NHhfYmUgOgorICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworZGVmIGludF9wcGNfdnN4X2x4dmQyeF9iZSA6CisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CitkZWYgaW50X3BwY192c3hfbHh2bCA6CisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1faTY0X3R5XSwgW0ludHJSZWFkTWVtLAorICAgICAgSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfcHBjX3ZzeF9seHZsbCA6CisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1faTY0X3R5XSwgW0ludHJSZWFkTWVtLAorICAgICAgSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfcHBjX3ZzeF9zdHh2bCA6CisgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3B0cl90eSwgbGx2bV9pNjRfdHldLAorICAgICAgW0ludHJXcml0ZU1lbSwgSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfcHBjX3ZzeF9zdHh2bGwgOgorICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV92NGkzMl90eSwgbGx2bV9wdHJfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgIFtJbnRyV3JpdGVNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKy8vIFZlY3RvciBzdG9yZS4KK2RlZiBpbnRfcHBjX3ZzeF9zdHh2dzR4IDogSW50cmluc2ljPFtdLCBbbGx2bV92NGkzMl90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJXcml0ZU1lbSwgSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfcHBjX3ZzeF9zdHh2ZDJ4IDogSW50cmluc2ljPFtdLCBbbGx2bV92MmY2NF90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJXcml0ZU1lbSwgSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfcHBjX3ZzeF9zdHh2dzR4X2JlIDogSW50cmluc2ljPFtdLCBbbGx2bV92NGkzMl90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJXcml0ZU1lbSwgSW50ckFyZ01lbU9ubHldPjsKK2RlZiBpbnRfcHBjX3ZzeF9zdHh2ZDJ4X2JlIDogSW50cmluc2ljPFtdLCBbbGx2bV92MmY2NF90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJXcml0ZU1lbSwgSW50ckFyZ01lbU9ubHldPjsKKy8vIFZlY3RvciBhbmQgc2NhbGFyIG1heGltdW0uCitkZWYgaW50X3BwY192c3hfeHZtYXhkcCA6IFBvd2VyUENfVlNYX1ZlY19ERERfSW50cmluc2ljPCJ4dm1heGRwIj47CitkZWYgaW50X3BwY192c3hfeHZtYXhzcCA6IFBvd2VyUENfVlNYX1ZlY19GRkZfSW50cmluc2ljPCJ4dm1heHNwIj47CitkZWYgaW50X3BwY192c3hfeHNtYXhkcCA6IFBvd2VyUENfVlNYX1NjYV9ERERfSW50cmluc2ljPCJ4c21heGRwIj47CisKKy8vIFZlY3RvciBhbmQgc2NhbGFyIG1pbmltdW0uCitkZWYgaW50X3BwY192c3hfeHZtaW5kcCA6IFBvd2VyUENfVlNYX1ZlY19ERERfSW50cmluc2ljPCJ4dm1pbmRwIj47CitkZWYgaW50X3BwY192c3hfeHZtaW5zcCA6IFBvd2VyUENfVlNYX1ZlY19GRkZfSW50cmluc2ljPCJ4dm1pbnNwIj47CitkZWYgaW50X3BwY192c3hfeHNtaW5kcCA6IFBvd2VyUENfVlNYX1NjYV9ERERfSW50cmluc2ljPCJ4c21pbmRwIj47CisKKy8vIFZlY3RvciBkaXZpZGUuCitkZWYgaW50X3BwY192c3hfeHZkaXZkcCA6IFBvd2VyUENfVlNYX1ZlY19ERERfSW50cmluc2ljPCJ4dmRpdmRwIj47CitkZWYgaW50X3BwY192c3hfeHZkaXZzcCA6IFBvd2VyUENfVlNYX1ZlY19GRkZfSW50cmluc2ljPCJ4dmRpdnNwIj47CisKKy8vIFZlY3RvciByb3VuZC10by1pbmZpbml0eSAoY2VpbCkKK2RlZiBpbnRfcHBjX3ZzeF94dnJzcGlwIDoKKyAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h2cmRwaXAgOgorICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisKKy8vIFZlY3RvciByZWNpcHJvY2FsIGVzdGltYXRlCitkZWYgaW50X3BwY192c3hfeHZyZXNwIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3ZzeF94dnJlc3AiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h2cmVkcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl92c3hfeHZyZWRwIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8gVmVjdG9yIHJzcXJ0ZQorZGVmIGludF9wcGNfdnN4X3h2cnNxcnRlc3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fdnN4X3h2cnNxcnRlc3AiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h2cnNxcnRlZHAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fdnN4X3h2cnNxcnRlZHAiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworCisvLyBWZWN0b3IgY29tcGFyZQorZGVmIGludF9wcGNfdnN4X3h2Y21wZXFkcCA6CisgICAgICBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8Inh2Y21wZXFkcCIsIFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dmNtcGVxZHBfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl92c3hfeHZjbXBlcWRwX3AiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1faTMyX3R5LGxsdm1fdjJmNjRfdHksbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZjbXBlcXNwIDoKKyAgICAgIFBvd2VyUENfVlNYX0ludHJpbnNpYzwieHZjbXBlcXNwIiwgW2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h2Y21wZXFzcF9wIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3ZzeF94dmNtcGVxc3BfcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9pMzJfdHksbGx2bV92NGYzMl90eSxsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dmNtcGdlZHAgOgorICAgICAgUG93ZXJQQ19WU1hfSW50cmluc2ljPCJ4dmNtcGdlZHAiLCBbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZjbXBnZWRwX3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fdnN4X3h2Y21wZ2VkcF9wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3YyZjY0X3R5LGxsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h2Y21wZ2VzcCA6CisgICAgICBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8Inh2Y21wZ2VzcCIsIFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dmNtcGdlc3BfcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl92c3hfeHZjbXBnZXNwX3AiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1faTMyX3R5LGxsdm1fdjRmMzJfdHksbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZjbXBndGRwIDoKKyAgICAgIFBvd2VyUENfVlNYX0ludHJpbnNpYzwieHZjbXBndGRwIiwgW2xsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h2Y21wZ3RkcF9wIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3ZzeF94dmNtcGd0ZHBfcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9pMzJfdHksbGx2bV92MmY2NF90eSxsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dmNtcGd0c3AgOgorICAgICAgUG93ZXJQQ19WU1hfSW50cmluc2ljPCJ4dmNtcGd0c3AiLCBbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZjbXBndHNwX3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fdnN4X3h2Y21wZ3RzcF9wIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2kzMl90eSxsbHZtX3Y0ZjMyX3R5LGxsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h4bGVxdiA6CisgICAgICBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8Inh4bGVxdiIsIFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dmlleHBkcCA6CisgICAgICBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8Inh2aWV4cGRwIixbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dmlleHBzcCA6CisgICAgICBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8Inh2aWV4cHNwIixbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dmN2ZHBzeHdzIDoKKyAgICAgIFBvd2VyUENfVlNYX0ludHJpbnNpYzwieHZjdmRwc3h3cyIsIFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dmN2ZHB1eHdzIDoKKyAgICAgIFBvd2VyUENfVlNYX0ludHJpbnNpYzwieHZjdmRwdXh3cyIsIFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dmN2c3h3ZHAgOgorICAgICAgUG93ZXJQQ19WU1hfSW50cmluc2ljPCJ4dmN2c3h3ZHAiLCBbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZjdnV4d2RwIDoKKyAgICAgIFBvd2VyUENfVlNYX0ludHJpbnNpYzwieHZjdnV4d2RwIiwgW2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h2Y3ZzcGRwIDoKKyAgICAgIFBvd2VyUENfVlNYX0ludHJpbnNpYzwieHZjdnNwZHAiLCBbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZjdnN4ZHNwIDoKKyAgICAgIFBvd2VyUENfVlNYX0ludHJpbnNpYzwieHZjdnN4ZHNwIiwgW2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h2Y3Z1eGRzcCA6CisgICAgICBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8Inh2Y3Z1eGRzcCIsIFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dmN2ZHBzcCA6CisgICAgICBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8Inh2Y3ZkcHNwIiwgW2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h2Y3ZzcGhwIDoKKyAgICAgIFBvd2VyUENfVlNYX0ludHJpbnNpYzwieHZjdnNwaHAiLCBbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZ4ZXhwZHAgOgorICAgICAgUG93ZXJQQ19WU1hfSW50cmluc2ljPCJ4dnhleHBkcCIsIFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dnhleHBzcCA6CisgICAgICBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8Inh2eGV4cHNwIiwgW2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h2eHNpZ2RwIDoKKyAgICAgIFBvd2VyUENfVlNYX0ludHJpbnNpYzwieHZ4c2lnZHAiLCBbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHZ4c2lnc3AgOgorICAgICAgUG93ZXJQQ19WU1hfSW50cmluc2ljPCJ4dnhzaWdzcCIsIFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dnRzdGRjZHAgOgorICAgICAgUG93ZXJQQ19WU1hfSW50cmluc2ljPCJ4dnRzdGRjZHAiLCBbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h2dHN0ZGNzcCA6CisgICAgICBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8Inh2dHN0ZGNzcCIsIFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGYzMl90eSxsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfcHBjX3ZzeF94dmN2aHBzcCA6CisgICAgICBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8Inh2Y3ZocHNwIiwgW2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTE2X3R5XSxbSW50ck5vTWVtXT47CitkZWYgaW50X3BwY192c3hfeHhleHRyYWN0dXcgOgorICAgICAgUG93ZXJQQ19WU1hfSW50cmluc2ljPCJ4eGV4dHJhY3R1dyIsW2xsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyaTY0X3R5LGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworZGVmIGludF9wcGNfdnN4X3h4aW5zZXJ0dyA6CisgICAgICBQb3dlclBDX1ZTWF9JbnRyaW5zaWM8Inh4aW5zZXJ0dyIsW2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LGxsdm1fdjJpNjRfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBvd2VyUEMgUVBYIEludHJpbnNpY3MuCisvLworCitsZXQgVGFyZ2V0UHJlZml4ID0gInBwYyIgaW4geyAgLy8gQWxsIFBQQyBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ucHBjLiIuCisgIC8vLyBQb3dlclBDX1FQWF9JbnRyaW5zaWMgLSBCYXNlIGNsYXNzIGZvciBhbGwgUVBYIGludHJpbnNpY3MuCisgIGNsYXNzIFBvd2VyUENfUVBYX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4LCBsaXN0PExMVk1UeXBlPiByZXRfdHlwZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0PExMVk1UeXBlPiBwYXJhbV90eXBlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3Q8SW50cmluc2ljUHJvcGVydHk+IHByb3BlcnRpZXM+CisgICAgOiBHQ0NCdWlsdGluPCFzdHJjb25jYXQoIl9fYnVpbHRpbl9xcHhfIiwgR0NDSW50U3VmZml4KT4sCisgICAgICBJbnRyaW5zaWM8cmV0X3R5cGVzLCBwYXJhbV90eXBlcywgcHJvcGVydGllcz47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQb3dlclBDIFFQWCBJbnRyaW5zaWMgQ2xhc3MgRGVmaW5pdGlvbnMuCisvLworCisvLy8gUG93ZXJQQ19RUFhfRkZfSW50cmluc2ljIC0gQSBQb3dlclBDIGludHJpbnNpYyB0aGF0IHRha2VzIG9uZSB2NGY2NAorLy8vIHZlY3RvciBhbmQgcmV0dXJucyBvbmUuICBUaGVzZSBpbnRyaW5zaWNzIGhhdmUgbm8gc2lkZSBlZmZlY3RzLgorY2xhc3MgUG93ZXJQQ19RUFhfRkZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogUG93ZXJQQ19RUFhfSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8vIFBvd2VyUENfUVBYX0ZGRl9JbnRyaW5zaWMgLSBBIFBvd2VyUEMgaW50cmluc2ljIHRoYXQgdGFrZXMgdHdvIHY0ZjY0CisvLy8gdmVjdG9ycyBhbmQgcmV0dXJucyBvbmUuICBUaGVzZSBpbnRyaW5zaWNzIGhhdmUgbm8gc2lkZSBlZmZlY3RzLgorY2xhc3MgUG93ZXJQQ19RUFhfRkZGX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IFBvd2VyUENfUVBYX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKy8vLyBQb3dlclBDX1FQWF9GRkZGX0ludHJpbnNpYyAtIEEgUG93ZXJQQyBpbnRyaW5zaWMgdGhhdCB0YWtlcyB0aHJlZSB2NGY2NAorLy8vIHZlY3RvcnMgYW5kIHJldHVybnMgb25lLiAgVGhlc2UgaW50cmluc2ljcyBoYXZlIG5vIHNpZGUgZWZmZWN0cy4KK2NsYXNzIFBvd2VyUENfUVBYX0ZGRkZfSW50cmluc2ljPHN0cmluZyBHQ0NJbnRTdWZmaXg+CisgIDogUG93ZXJQQ19RUFhfSW50cmluc2ljPEdDQ0ludFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworLy8vIFBvd2VyUENfUVBYX0xvYWRfSW50cmluc2ljIC0gQSBQb3dlclBDIGludHJpbnNpYyB0aGF0IHRha2VzIGEgcG9pbnRlcgorLy8vIGFuZCByZXR1cm5zIGEgdjRmNjQuCitjbGFzcyBQb3dlclBDX1FQWF9Mb2FkX0ludHJpbnNpYzxzdHJpbmcgR0NDSW50U3VmZml4PgorICA6IFBvd2VyUENfUVBYX0ludHJpbnNpYzxHQ0NJbnRTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisvLy8gUG93ZXJQQ19RUFhfTG9hZFBlcm1fSW50cmluc2ljIC0gQSBQb3dlclBDIGludHJpbnNpYyB0aGF0IHRha2VzIGEgcG9pbnRlcgorLy8vIGFuZCByZXR1cm5zIGEgdjRmNjQgcGVybXV0YXRpb24uCitjbGFzcyBQb3dlclBDX1FQWF9Mb2FkUGVybV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBQb3dlclBDX1FQWF9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGY2NF90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyTm9NZW1dPjsKKworLy8vIFBvd2VyUENfUVBYX1N0b3JlX0ludHJpbnNpYyAtIEEgUG93ZXJQQyBpbnRyaW5zaWMgdGhhdCB0YWtlcyBhIHBvaW50ZXIKKy8vLyBhbmQgc3RvcmVzIGEgdjRmNjQuCitjbGFzcyBQb3dlclBDX1FQWF9TdG9yZV9JbnRyaW5zaWM8c3RyaW5nIEdDQ0ludFN1ZmZpeD4KKyAgOiBQb3dlclBDX1FQWF9JbnRyaW5zaWM8R0NDSW50U3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICBbXSwgW2xsdm1fdjRmNjRfdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJXcml0ZU1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBvd2VyUEMgUVBYIEludHJpbnNpYyBEZWZpbml0aW9ucy4KKworbGV0IFRhcmdldFByZWZpeCA9ICJwcGMiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ucHBjLiIuCisgIC8vIEFkZCBJbnN0cnVjdGlvbnMKKyAgZGVmIGludF9wcGNfcXB4X3F2ZmFkZCA6IFBvd2VyUENfUVBYX0ZGRl9JbnRyaW5zaWM8InF2ZmFkZCI+OworICBkZWYgaW50X3BwY19xcHhfcXZmYWRkcyA6IFBvd2VyUENfUVBYX0ZGRl9JbnRyaW5zaWM8InF2ZmFkZHMiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZnN1YiA6IFBvd2VyUENfUVBYX0ZGRl9JbnRyaW5zaWM8InF2ZnN1YiI+OworICBkZWYgaW50X3BwY19xcHhfcXZmc3VicyA6IFBvd2VyUENfUVBYX0ZGRl9JbnRyaW5zaWM8InF2ZnN1YnMiPjsKKworICAvLyBFc3RpbWF0ZSBJbnN0cnVjdGlvbnMKKyAgZGVmIGludF9wcGNfcXB4X3F2ZnJlIDogUG93ZXJQQ19RUFhfRkZfSW50cmluc2ljPCJxdmZyZSI+OworICBkZWYgaW50X3BwY19xcHhfcXZmcmVzIDogUG93ZXJQQ19RUFhfRkZfSW50cmluc2ljPCJxdmZyZXMiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZnJzcXJ0ZSA6IFBvd2VyUENfUVBYX0ZGX0ludHJpbnNpYzwicXZmcnNxcnRlIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZyc3FydGVzIDogUG93ZXJQQ19RUFhfRkZfSW50cmluc2ljPCJxdmZyc3FydGVzIj47CisKKyAgLy8gTXVsdGlwbHkgSW5zdHJ1Y3Rpb25zCisgIGRlZiBpbnRfcHBjX3FweF9xdmZtdWwgOiBQb3dlclBDX1FQWF9GRkZfSW50cmluc2ljPCJxdmZtdWwiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2Zm11bHMgOiBQb3dlclBDX1FQWF9GRkZfSW50cmluc2ljPCJxdmZtdWxzIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZ4bXVsIDogUG93ZXJQQ19RUFhfRkZGX0ludHJpbnNpYzwicXZmeG11bCI+OworICBkZWYgaW50X3BwY19xcHhfcXZmeG11bHMgOiBQb3dlclBDX1FQWF9GRkZfSW50cmluc2ljPCJxdmZ4bXVscyI+OworCisgIC8vIE11bHRpcGx5LWFkZCBpbnN0cnVjdGlvbnMKKyAgZGVmIGludF9wcGNfcXB4X3F2Zm1hZGQgOiBQb3dlclBDX1FQWF9GRkZGX0ludHJpbnNpYzwicXZmbWFkZCI+OworICBkZWYgaW50X3BwY19xcHhfcXZmbWFkZHMgOiBQb3dlclBDX1FQWF9GRkZGX0ludHJpbnNpYzwicXZmbWFkZHMiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2Zm5tYWRkIDogUG93ZXJQQ19RUFhfRkZGRl9JbnRyaW5zaWM8InF2Zm5tYWRkIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZubWFkZHMgOiBQb3dlclBDX1FQWF9GRkZGX0ludHJpbnNpYzwicXZmbm1hZGRzIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZtc3ViIDogUG93ZXJQQ19RUFhfRkZGRl9JbnRyaW5zaWM8InF2Zm1zdWIiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2Zm1zdWJzIDogUG93ZXJQQ19RUFhfRkZGRl9JbnRyaW5zaWM8InF2Zm1zdWJzIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZubXN1YiA6IFBvd2VyUENfUVBYX0ZGRkZfSW50cmluc2ljPCJxdmZubXN1YiI+OworICBkZWYgaW50X3BwY19xcHhfcXZmbm1zdWJzIDogUG93ZXJQQ19RUFhfRkZGRl9JbnRyaW5zaWM8InF2Zm5tc3VicyI+OworICBkZWYgaW50X3BwY19xcHhfcXZmeG1hZGQgOiBQb3dlclBDX1FQWF9GRkZGX0ludHJpbnNpYzwicXZmeG1hZGQiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZnhtYWRkcyA6IFBvd2VyUENfUVBYX0ZGRkZfSW50cmluc2ljPCJxdmZ4bWFkZHMiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2Znh4bnBtYWRkIDogUG93ZXJQQ19RUFhfRkZGRl9JbnRyaW5zaWM8InF2Znh4bnBtYWRkIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZ4eG5wbWFkZHMgOiBQb3dlclBDX1FQWF9GRkZGX0ludHJpbnNpYzwicXZmeHhucG1hZGRzIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZ4eGNwbm1hZGQgOiBQb3dlclBDX1FQWF9GRkZGX0ludHJpbnNpYzwicXZmeHhjcG5tYWRkIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZ4eGNwbm1hZGRzIDogUG93ZXJQQ19RUFhfRkZGRl9JbnRyaW5zaWM8InF2Znh4Y3BubWFkZHMiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2Znh4bWFkZCA6IFBvd2VyUENfUVBYX0ZGRkZfSW50cmluc2ljPCJxdmZ4eG1hZGQiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2Znh4bWFkZHMgOiBQb3dlclBDX1FQWF9GRkZGX0ludHJpbnNpYzwicXZmeHhtYWRkcyI+OworCisgIC8vIFNlbGVjdCBJbnN0cnVjdGlvbgorICBkZWYgaW50X3BwY19xcHhfcXZmc2VsIDogUG93ZXJQQ19RUFhfRkZGRl9JbnRyaW5zaWM8InF2ZnNlbCI+OworCisgIC8vIFBlcm11dGUgSW5zdHJ1Y3Rpb24KKyAgZGVmIGludF9wcGNfcXB4X3F2ZnBlcm0gOiBQb3dlclBDX1FQWF9GRkZGX0ludHJpbnNpYzwicXZmcGVybSI+OworCisgIC8vIENvbnZlcnQgYW5kIFJvdW5kIEluc3RydWN0aW9ucworICBkZWYgaW50X3BwY19xcHhfcXZmY3RpZCA6IFBvd2VyUENfUVBYX0ZGX0ludHJpbnNpYzwicXZmY3RpZCI+OworICBkZWYgaW50X3BwY19xcHhfcXZmY3RpZHUgOiBQb3dlclBDX1FQWF9GRl9JbnRyaW5zaWM8InF2ZmN0aWR1Ij47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZjdGlkeiA6IFBvd2VyUENfUVBYX0ZGX0ludHJpbnNpYzwicXZmY3RpZHoiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZmN0aWR1eiA6IFBvd2VyUENfUVBYX0ZGX0ludHJpbnNpYzwicXZmY3RpZHV6Ij47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZjdGl3IDogUG93ZXJQQ19RUFhfRkZfSW50cmluc2ljPCJxdmZjdGl3Ij47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZjdGl3dSA6IFBvd2VyUENfUVBYX0ZGX0ludHJpbnNpYzwicXZmY3Rpd3UiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZmN0aXd6IDogUG93ZXJQQ19RUFhfRkZfSW50cmluc2ljPCJxdmZjdGl3eiI+OworICBkZWYgaW50X3BwY19xcHhfcXZmY3Rpd3V6IDogUG93ZXJQQ19RUFhfRkZfSW50cmluc2ljPCJxdmZjdGl3dXoiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZmNmaWQgOiBQb3dlclBDX1FQWF9GRl9JbnRyaW5zaWM8InF2ZmNmaWQiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZmNmaWR1IDogUG93ZXJQQ19RUFhfRkZfSW50cmluc2ljPCJxdmZjZmlkdSI+OworICBkZWYgaW50X3BwY19xcHhfcXZmY2ZpZHMgOiBQb3dlclBDX1FQWF9GRl9JbnRyaW5zaWM8InF2ZmNmaWRzIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZjZmlkdXMgOiBQb3dlclBDX1FQWF9GRl9JbnRyaW5zaWM8InF2ZmNmaWR1cyI+OworICBkZWYgaW50X3BwY19xcHhfcXZmcnNwIDogUG93ZXJQQ19RUFhfRkZfSW50cmluc2ljPCJxdmZyc3AiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZnJpeiA6IFBvd2VyUENfUVBYX0ZGX0ludHJpbnNpYzwicXZmcml6Ij47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZyaW4gOiBQb3dlclBDX1FQWF9GRl9JbnRyaW5zaWM8InF2ZnJpbiI+OworICBkZWYgaW50X3BwY19xcHhfcXZmcmlwIDogUG93ZXJQQ19RUFhfRkZfSW50cmluc2ljPCJxdmZyaXAiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZnJpbSA6IFBvd2VyUENfUVBYX0ZGX0ludHJpbnNpYzwicXZmcmltIj47CisKKyAgLy8gTW92ZSBJbnN0cnVjdGlvbnMKKyAgZGVmIGludF9wcGNfcXB4X3F2Zm5lZyA6IFBvd2VyUENfUVBYX0ZGX0ludHJpbnNpYzwicXZmbmVnIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmZhYnMgOiBQb3dlclBDX1FQWF9GRl9JbnRyaW5zaWM8InF2ZmFicyI+OworICBkZWYgaW50X3BwY19xcHhfcXZmbmFicyA6IFBvd2VyUENfUVBYX0ZGX0ludHJpbnNpYzwicXZmbmFicyI+OworICBkZWYgaW50X3BwY19xcHhfcXZmY3BzZ24gOiBQb3dlclBDX1FQWF9GRkZfSW50cmluc2ljPCJxdmZjcHNnbiI+OworCisgIC8vIENvbXBhcmUgSW5zdHJ1Y3Rpb25zCisgIGRlZiBpbnRfcHBjX3FweF9xdmZ0c3RuYW4gOiBQb3dlclBDX1FQWF9GRkZfSW50cmluc2ljPCJxdmZ0c3RuYW4iPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZmNtcGx0IDogUG93ZXJQQ19RUFhfRkZGX0ludHJpbnNpYzwicXZmY21wbHQiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZmNtcGd0IDogUG93ZXJQQ19RUFhfRkZGX0ludHJpbnNpYzwicXZmY21wZ3QiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2ZmNtcGVxIDogUG93ZXJQQ19RUFhfRkZGX0ludHJpbnNpYzwicXZmY21wZXEiPjsKKworICAvLyBMb2FkIGluc3RydWN0aW9ucworICBkZWYgaW50X3BwY19xcHhfcXZsZmQgOiBQb3dlclBDX1FQWF9Mb2FkX0ludHJpbnNpYzwicXZsZmQiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2bGZkYSA6IFBvd2VyUENfUVBYX0xvYWRfSW50cmluc2ljPCJxdmxmZGEiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2bGZzIDogUG93ZXJQQ19RUFhfTG9hZF9JbnRyaW5zaWM8InF2bGZzIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmxmc2EgOiBQb3dlclBDX1FQWF9Mb2FkX0ludHJpbnNpYzwicXZsZnNhIj47CisKKyAgZGVmIGludF9wcGNfcXB4X3F2bGZjZGEgOiBQb3dlclBDX1FQWF9Mb2FkX0ludHJpbnNpYzwicXZsZmNkYSI+OworICBkZWYgaW50X3BwY19xcHhfcXZsZmNkIDogUG93ZXJQQ19RUFhfTG9hZF9JbnRyaW5zaWM8InF2bGZjZCI+OworICBkZWYgaW50X3BwY19xcHhfcXZsZmNzYSA6IFBvd2VyUENfUVBYX0xvYWRfSW50cmluc2ljPCJxdmxmY3NhIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmxmY3MgOiBQb3dlclBDX1FQWF9Mb2FkX0ludHJpbnNpYzwicXZsZmNzIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmxmaXdhYSA6IFBvd2VyUENfUVBYX0xvYWRfSW50cmluc2ljPCJxdmxmaXdhYSI+OworICBkZWYgaW50X3BwY19xcHhfcXZsZml3YSA6IFBvd2VyUENfUVBYX0xvYWRfSW50cmluc2ljPCJxdmxmaXdhIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdmxmaXd6YSA6IFBvd2VyUENfUVBYX0xvYWRfSW50cmluc2ljPCJxdmxmaXd6YSI+OworICBkZWYgaW50X3BwY19xcHhfcXZsZml3eiA6IFBvd2VyUENfUVBYX0xvYWRfSW50cmluc2ljPCJxdmxmaXd6Ij47CisKKyAgZGVmIGludF9wcGNfcXB4X3F2bHBjbGQgOiBQb3dlclBDX1FQWF9Mb2FkUGVybV9JbnRyaW5zaWM8InF2bHBjbGQiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2bHBjbHMgOiBQb3dlclBDX1FQWF9Mb2FkUGVybV9JbnRyaW5zaWM8InF2bHBjbHMiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2bHBjcmQgOiBQb3dlclBDX1FQWF9Mb2FkUGVybV9JbnRyaW5zaWM8InF2bHBjcmQiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2bHBjcnMgOiBQb3dlclBDX1FQWF9Mb2FkUGVybV9JbnRyaW5zaWM8InF2bHBjcnMiPjsKKworICAvLyBTdG9yZSBpbnN0cnVjdGlvbnMKKyAgZGVmIGludF9wcGNfcXB4X3F2c3RmZCA6IFBvd2VyUENfUVBYX1N0b3JlX0ludHJpbnNpYzwicXZzdGZkIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdnN0ZmRhIDogUG93ZXJQQ19RUFhfU3RvcmVfSW50cmluc2ljPCJxdnN0ZmRhIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdnN0ZnMgOiBQb3dlclBDX1FQWF9TdG9yZV9JbnRyaW5zaWM8InF2c3RmcyI+OworICBkZWYgaW50X3BwY19xcHhfcXZzdGZzYSA6IFBvd2VyUENfUVBYX1N0b3JlX0ludHJpbnNpYzwicXZzdGZzYSI+OworCisgIGRlZiBpbnRfcHBjX3FweF9xdnN0ZmNkYSA6IFBvd2VyUENfUVBYX1N0b3JlX0ludHJpbnNpYzwicXZzdGZjZGEiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2c3RmY2QgOiBQb3dlclBDX1FQWF9TdG9yZV9JbnRyaW5zaWM8InF2c3RmY2QiPjsKKyAgZGVmIGludF9wcGNfcXB4X3F2c3RmY3NhIDogUG93ZXJQQ19RUFhfU3RvcmVfSW50cmluc2ljPCJxdnN0ZmNzYSI+OworICBkZWYgaW50X3BwY19xcHhfcXZzdGZjcyA6IFBvd2VyUENfUVBYX1N0b3JlX0ludHJpbnNpYzwicXZzdGZjcyI+OworICBkZWYgaW50X3BwY19xcHhfcXZzdGZpd2EgOiBQb3dlclBDX1FQWF9TdG9yZV9JbnRyaW5zaWM8InF2c3RmaXdhIj47CisgIGRlZiBpbnRfcHBjX3FweF9xdnN0Zml3IDogUG93ZXJQQ19RUFhfU3RvcmVfSW50cmluc2ljPCJxdnN0Zml3Ij47CisKKyAgLy8gTG9naWNhbCBhbmQgcGVybXV0YXRpb24gZm9ybWF0aW9uCisgIGRlZiBpbnRfcHBjX3FweF9xdmZsb2dpY2FsIDogUG93ZXJQQ19RUFhfSW50cmluc2ljPCJxdmZsb2dpY2FsIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfcHBjX3FweF9xdmdwY2kgOiBQb3dlclBDX1FQWF9JbnRyaW5zaWM8InF2Z3BjaSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUG93ZXJQQyBIVE0gSW50cmluc2ljIERlZmluaXRpb25zLgorCitsZXQgVGFyZ2V0UHJlZml4ID0gInBwYyIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS5wcGMuIi4KKworZGVmIGludF9wcGNfdGJlZ2luIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3RiZWdpbiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eV0sIFtdPjsKK2RlZiBpbnRfcHBjX3RlbmQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fdGVuZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eV0sIFtdPjsKKworZGVmIGludF9wcGNfdGFib3J0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX3RhYm9ydCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eV0sIFtdPjsKK2RlZiBpbnRfcHBjX3RhYm9ydHdjIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3RhYm9ydHdjIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X3BwY190YWJvcnR3Y2kgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fdGFib3J0d2NpIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CitkZWYgaW50X3BwY190YWJvcnRkYyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl90YWJvcnRkYyI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworZGVmIGludF9wcGNfdGFib3J0ZGNpIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3RhYm9ydGRjaSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworCitkZWYgaW50X3BwY190Y2hlY2sgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fdGNoZWNrIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtdPjsKK2RlZiBpbnRfcHBjX3RyZWNsYWltIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3RyZWNsYWltIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5XSwgW10+OworZGVmIGludF9wcGNfdHJlY2hrcHQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fdHJlY2hrcHQiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW10+OworZGVmIGludF9wcGNfdHNyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3RzciI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eV0sIFtdPjsKKworZGVmIGludF9wcGNfZ2V0X3RleGFzciA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9nZXRfdGV4YXNyIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW10sIFtdPjsKK2RlZiBpbnRfcHBjX2dldF90ZXhhc3J1IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2dldF90ZXhhc3J1Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW10sIFtdPjsKK2RlZiBpbnRfcHBjX2dldF90ZmhhciA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9nZXRfdGZoYXIiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbXSwgW10+OworZGVmIGludF9wcGNfZ2V0X3RmaWFyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2dldF90ZmlhciI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtdLCBbXT47CisKK2RlZiBpbnRfcHBjX3NldF90ZXhhc3IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fc2V0X3RleGFzciI+LAorICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHldLCBbXT47CitkZWYgaW50X3BwY19zZXRfdGV4YXNydSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zZXRfdGV4YXNydSI+LAorICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHldLCBbXT47CitkZWYgaW50X3BwY19zZXRfdGZoYXIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fc2V0X3RmaGFyIj4sCisgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eV0sIFtdPjsKK2RlZiBpbnRfcHBjX3NldF90ZmlhciA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zZXRfdGZpYXIiPiwKKyAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5XSwgW10+OworCisvLyBFeHRlbmRlZCBtbmVtb25pY3MKK2RlZiBpbnRfcHBjX3RlbmRhbGwgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fdGVuZGFsbCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdLCBbXT47CitkZWYgaW50X3BwY190cmVzdW1lIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3RyZXN1bWUiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW10+OworZGVmIGludF9wcGNfdHN1c3BlbmQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fdHN1c3BlbmQiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW10+OworCitkZWYgaW50X3BwY190dGVzdCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl90dGVzdCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtdLCBbXT47CisKK2RlZiBpbnRfcHBjX2NmZW5jZSA6IEludHJpbnNpYzxbXSwgW2xsdm1fYW55aW50X3R5XSwgW10+OworfQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzU3lzdGVtWi50ZCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc1N5c3RlbVoudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FhMmVjMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc1N5c3RlbVoudGQKQEAgLTAsMCArMSw0MzEgQEAKKy8vPT09LSBJbnRyaW5zaWNzU3lzdGVtWi50ZCAtIERlZmluZXMgU3lzdGVtWiBpbnRyaW5zaWNzIC0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYWxsIG9mIHRoZSBTeXN0ZW1aLXNwZWNpZmljIGludHJpbnNpY3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworY2xhc3MgU3lzdGVtWlVuYXJ5Q29udjxzdHJpbmcgbmFtZSwgTExWTVR5cGUgcmVzdWx0LCBMTFZNVHlwZSBhcmc+CisgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3MzOTBfIiAjIyBuYW1lPiwKKyAgICBJbnRyaW5zaWM8W3Jlc3VsdF0sIFthcmddLCBbSW50ck5vTWVtXT47CisKK2NsYXNzIFN5c3RlbVpVbmFyeTxzdHJpbmcgbmFtZSwgTExWTVR5cGUgdHlwZT4KKyAgOiBTeXN0ZW1aVW5hcnlDb252PG5hbWUsIHR5cGUsIHR5cGU+OworCitjbGFzcyBTeXN0ZW1aVW5hcnlDb252Q0M8TExWTVR5cGUgcmVzdWx0LCBMTFZNVHlwZSBhcmc+CisgIDogSW50cmluc2ljPFtyZXN1bHQsIGxsdm1faTMyX3R5XSwgW2FyZ10sIFtJbnRyTm9NZW1dPjsKKworY2xhc3MgU3lzdGVtWlVuYXJ5Q0M8TExWTVR5cGUgdHlwZT4KKyAgOiBTeXN0ZW1aVW5hcnlDb252Q0M8dHlwZSwgdHlwZT47CisKK2NsYXNzIFN5c3RlbVpCaW5hcnlDb252PHN0cmluZyBuYW1lLCBMTFZNVHlwZSByZXN1bHQsIExMVk1UeXBlIGFyZz4KKyAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fczM5MF8iICMjIG5hbWU+LAorICAgIEludHJpbnNpYzxbcmVzdWx0XSwgW2FyZywgYXJnXSwgW0ludHJOb01lbV0+OworCitjbGFzcyBTeXN0ZW1aQmluYXJ5PHN0cmluZyBuYW1lLCBMTFZNVHlwZSB0eXBlPgorICA6IFN5c3RlbVpCaW5hcnlDb252PG5hbWUsIHR5cGUsIHR5cGU+OworCitjbGFzcyBTeXN0ZW1aQmluYXJ5SW50PHN0cmluZyBuYW1lLCBMTFZNVHlwZSB0eXBlPgorICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zMzkwXyIgIyMgbmFtZT4sCisgICAgSW50cmluc2ljPFt0eXBlXSwgW3R5cGUsIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitjbGFzcyBTeXN0ZW1aQmluYXJ5Q29udkNDPExMVk1UeXBlIHJlc3VsdCwgTExWTVR5cGUgYXJnPgorICA6IEludHJpbnNpYzxbcmVzdWx0LCBsbHZtX2kzMl90eV0sIFthcmcsIGFyZ10sIFtJbnRyTm9NZW1dPjsKKworY2xhc3MgU3lzdGVtWkJpbmFyeUNvbnZJbnRDQzxMTFZNVHlwZSByZXN1bHQsIExMVk1UeXBlIGFyZz4KKyAgOiBJbnRyaW5zaWM8W3Jlc3VsdCwgbGx2bV9pMzJfdHldLCBbYXJnLCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworY2xhc3MgU3lzdGVtWkJpbmFyeUNDPExMVk1UeXBlIHR5cGU+CisgIDogU3lzdGVtWkJpbmFyeUNvbnZDQzx0eXBlLCB0eXBlPjsKKworY2xhc3MgU3lzdGVtWlRlcm5hcnlDb252PHN0cmluZyBuYW1lLCBMTFZNVHlwZSByZXN1bHQsIExMVk1UeXBlIGFyZz4KKyAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fczM5MF8iICMjIG5hbWU+LAorICAgIEludHJpbnNpYzxbcmVzdWx0XSwgW2FyZywgYXJnLCByZXN1bHRdLCBbSW50ck5vTWVtXT47CisKK2NsYXNzIFN5c3RlbVpUZXJuYXJ5PHN0cmluZyBuYW1lLCBMTFZNVHlwZSB0eXBlPgorICA6IFN5c3RlbVpUZXJuYXJ5Q29udjxuYW1lLCB0eXBlLCB0eXBlPjsKKworY2xhc3MgU3lzdGVtWlRlcm5hcnlJbnQ8c3RyaW5nIG5hbWUsIExMVk1UeXBlIHR5cGU+CisgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3MzOTBfIiAjIyBuYW1lPiwKKyAgICBJbnRyaW5zaWM8W3R5cGVdLCBbdHlwZSwgdHlwZSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKK2NsYXNzIFN5c3RlbVpUZXJuYXJ5SW50Q0M8TExWTVR5cGUgdHlwZT4KKyAgOiBJbnRyaW5zaWM8W3R5cGUsIGxsdm1faTMyX3R5XSwgW3R5cGUsIHR5cGUsIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCitjbGFzcyBTeXN0ZW1aUXVhdGVybmFyeUludDxzdHJpbmcgbmFtZSwgTExWTVR5cGUgdHlwZT4KKyAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fczM5MF8iICMjIG5hbWU+LAorICAgIEludHJpbnNpYzxbdHlwZV0sIFt0eXBlLCB0eXBlLCB0eXBlLCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworY2xhc3MgU3lzdGVtWlF1YXRlcm5hcnlJbnRDQzxMTFZNVHlwZSB0eXBlPgorICA6IEludHJpbnNpYzxbdHlwZSwgbGx2bV9pMzJfdHldLCBbdHlwZSwgdHlwZSwgdHlwZSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKK211bHRpY2xhc3MgU3lzdGVtWlVuYXJ5RXh0QkhGPHN0cmluZyBuYW1lPiB7CisgIGRlZiBiIDogU3lzdGVtWlVuYXJ5Q29udjxuYW1lIyMiYiIsIGxsdm1fdjhpMTZfdHksIGxsdm1fdjE2aThfdHk+OworICBkZWYgaCA6IFN5c3RlbVpVbmFyeUNvbnY8bmFtZSMjImgiLCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y4aTE2X3R5PjsKKyAgZGVmIGYgOiBTeXN0ZW1aVW5hcnlDb252PG5hbWUjIyJmIiwgbGx2bV92Mmk2NF90eSwgbGx2bV92NGkzMl90eT47Cit9CisKK211bHRpY2xhc3MgU3lzdGVtWlVuYXJ5RXh0QkhXRjxzdHJpbmcgbmFtZT4geworICBkZWYgYiAgOiBTeXN0ZW1aVW5hcnlDb252PG5hbWUjIyJiIiwgIGxsdm1fdjhpMTZfdHksIGxsdm1fdjE2aThfdHk+OworICBkZWYgaHcgOiBTeXN0ZW1aVW5hcnlDb252PG5hbWUjIyJodyIsIGxsdm1fdjRpMzJfdHksIGxsdm1fdjhpMTZfdHk+OworICBkZWYgZiAgOiBTeXN0ZW1aVW5hcnlDb252PG5hbWUjIyJmIiwgIGxsdm1fdjJpNjRfdHksIGxsdm1fdjRpMzJfdHk+OworfQorCittdWx0aWNsYXNzIFN5c3RlbVpVbmFyeUJIRjxzdHJpbmcgbmFtZT4geworICBkZWYgYiA6IFN5c3RlbVpVbmFyeTxuYW1lIyMiYiIsIGxsdm1fdjE2aThfdHk+OworICBkZWYgaCA6IFN5c3RlbVpVbmFyeTxuYW1lIyMiaCIsIGxsdm1fdjhpMTZfdHk+OworICBkZWYgZiA6IFN5c3RlbVpVbmFyeTxuYW1lIyMiZiIsIGxsdm1fdjRpMzJfdHk+OworfQorCittdWx0aWNsYXNzIFN5c3RlbVpVbmFyeUJIRkc8c3RyaW5nIG5hbWU+IDogU3lzdGVtWlVuYXJ5QkhGPG5hbWU+IHsKKyAgZGVmIGcgOiBTeXN0ZW1aVW5hcnk8bmFtZSMjImciLCBsbHZtX3YyaTY0X3R5PjsKK30KKworbXVsdGljbGFzcyBTeXN0ZW1aVW5hcnlDQ0JIRiB7CisgIGRlZiBicyA6IFN5c3RlbVpVbmFyeUNDPGxsdm1fdjE2aThfdHk+OworICBkZWYgaHMgOiBTeXN0ZW1aVW5hcnlDQzxsbHZtX3Y4aTE2X3R5PjsKKyAgZGVmIGZzIDogU3lzdGVtWlVuYXJ5Q0M8bGx2bV92NGkzMl90eT47Cit9CisKK211bHRpY2xhc3MgU3lzdGVtWkJpbmFyeVRydW5jSEZHPHN0cmluZyBuYW1lPiB7CisgIGRlZiBoIDogU3lzdGVtWkJpbmFyeUNvbnY8bmFtZSMjImgiLCBsbHZtX3YxNmk4X3R5LCBsbHZtX3Y4aTE2X3R5PjsKKyAgZGVmIGYgOiBTeXN0ZW1aQmluYXJ5Q29udjxuYW1lIyMiZiIsIGxsdm1fdjhpMTZfdHksIGxsdm1fdjRpMzJfdHk+OworICBkZWYgZyA6IFN5c3RlbVpCaW5hcnlDb252PG5hbWUjIyJnIiwgbGx2bV92NGkzMl90eSwgbGx2bV92Mmk2NF90eT47Cit9CisKK211bHRpY2xhc3MgU3lzdGVtWkJpbmFyeVRydW5jQ0NIRkcgeworICBkZWYgaHMgOiBTeXN0ZW1aQmluYXJ5Q29udkNDPGxsdm1fdjE2aThfdHksIGxsdm1fdjhpMTZfdHk+OworICBkZWYgZnMgOiBTeXN0ZW1aQmluYXJ5Q29udkNDPGxsdm1fdjhpMTZfdHksIGxsdm1fdjRpMzJfdHk+OworICBkZWYgZ3MgOiBTeXN0ZW1aQmluYXJ5Q29udkNDPGxsdm1fdjRpMzJfdHksIGxsdm1fdjJpNjRfdHk+OworfQorCittdWx0aWNsYXNzIFN5c3RlbVpCaW5hcnlFeHRCSEY8c3RyaW5nIG5hbWU+IHsKKyAgZGVmIGIgOiBTeXN0ZW1aQmluYXJ5Q29udjxuYW1lIyMiYiIsIGxsdm1fdjhpMTZfdHksIGxsdm1fdjE2aThfdHk+OworICBkZWYgaCA6IFN5c3RlbVpCaW5hcnlDb252PG5hbWUjIyJoIiwgbGx2bV92NGkzMl90eSwgbGx2bV92OGkxNl90eT47CisgIGRlZiBmIDogU3lzdGVtWkJpbmFyeUNvbnY8bmFtZSMjImYiLCBsbHZtX3YyaTY0X3R5LCBsbHZtX3Y0aTMyX3R5PjsKK30KKworbXVsdGljbGFzcyBTeXN0ZW1aQmluYXJ5RXh0QkhGRzxzdHJpbmcgbmFtZT4gOiBTeXN0ZW1aQmluYXJ5RXh0QkhGPG5hbWU+IHsKKyAgZGVmIGcgOiBTeXN0ZW1aQmluYXJ5Q29udjxuYW1lIyMiZyIsIGxsdm1fdjE2aThfdHksIGxsdm1fdjJpNjRfdHk+OworfQorCittdWx0aWNsYXNzIFN5c3RlbVpCaW5hcnlCSEY8c3RyaW5nIG5hbWU+IHsKKyAgZGVmIGIgOiBTeXN0ZW1aQmluYXJ5PG5hbWUjIyJiIiwgbGx2bV92MTZpOF90eT47CisgIGRlZiBoIDogU3lzdGVtWkJpbmFyeTxuYW1lIyMiaCIsIGxsdm1fdjhpMTZfdHk+OworICBkZWYgZiA6IFN5c3RlbVpCaW5hcnk8bmFtZSMjImYiLCBsbHZtX3Y0aTMyX3R5PjsKK30KKworbXVsdGljbGFzcyBTeXN0ZW1aQmluYXJ5QkhGRzxzdHJpbmcgbmFtZT4gOiBTeXN0ZW1aQmluYXJ5QkhGPG5hbWU+IHsKKyAgZGVmIGcgOiBTeXN0ZW1aQmluYXJ5PG5hbWUjIyJnIiwgbGx2bV92Mmk2NF90eT47Cit9CisKK211bHRpY2xhc3MgU3lzdGVtWkJpbmFyeUludEJIRkc8c3RyaW5nIG5hbWU+IHsKKyAgZGVmIGIgOiBTeXN0ZW1aQmluYXJ5SW50PG5hbWUjIyJiIiwgbGx2bV92MTZpOF90eT47CisgIGRlZiBoIDogU3lzdGVtWkJpbmFyeUludDxuYW1lIyMiaCIsIGxsdm1fdjhpMTZfdHk+OworICBkZWYgZiA6IFN5c3RlbVpCaW5hcnlJbnQ8bmFtZSMjImYiLCBsbHZtX3Y0aTMyX3R5PjsKKyAgZGVmIGcgOiBTeXN0ZW1aQmluYXJ5SW50PG5hbWUjIyJnIiwgbGx2bV92Mmk2NF90eT47Cit9CisKK211bHRpY2xhc3MgU3lzdGVtWkJpbmFyeUNDQkhGIHsKKyAgZGVmIGJzIDogU3lzdGVtWkJpbmFyeUNDPGxsdm1fdjE2aThfdHk+OworICBkZWYgaHMgOiBTeXN0ZW1aQmluYXJ5Q0M8bGx2bV92OGkxNl90eT47CisgIGRlZiBmcyA6IFN5c3RlbVpCaW5hcnlDQzxsbHZtX3Y0aTMyX3R5PjsKK30KKworbXVsdGljbGFzcyBTeXN0ZW1aQ29tcGFyZUJIRkc8c3RyaW5nIG5hbWU+IHsKKyAgZGVmIGJzIDogU3lzdGVtWkJpbmFyeUNDPGxsdm1fdjE2aThfdHk+OworICBkZWYgaHMgOiBTeXN0ZW1aQmluYXJ5Q0M8bGx2bV92OGkxNl90eT47CisgIGRlZiBmcyA6IFN5c3RlbVpCaW5hcnlDQzxsbHZtX3Y0aTMyX3R5PjsKKyAgZGVmIGdzIDogU3lzdGVtWkJpbmFyeUNDPGxsdm1fdjJpNjRfdHk+OworfQorCittdWx0aWNsYXNzIFN5c3RlbVpUZXJuYXJ5RXh0QkhGPHN0cmluZyBuYW1lPiB7CisgIGRlZiBiIDogU3lzdGVtWlRlcm5hcnlDb252PG5hbWUjIyJiIiwgbGx2bV92OGkxNl90eSwgbGx2bV92MTZpOF90eT47CisgIGRlZiBoIDogU3lzdGVtWlRlcm5hcnlDb252PG5hbWUjIyJoIiwgbGx2bV92NGkzMl90eSwgbGx2bV92OGkxNl90eT47CisgIGRlZiBmIDogU3lzdGVtWlRlcm5hcnlDb252PG5hbWUjIyJmIiwgbGx2bV92Mmk2NF90eSwgbGx2bV92NGkzMl90eT47Cit9CisKK211bHRpY2xhc3MgU3lzdGVtWlRlcm5hcnlFeHRCSEZHPHN0cmluZyBuYW1lPiA6IFN5c3RlbVpUZXJuYXJ5RXh0QkhGPG5hbWU+IHsKKyAgZGVmIGcgOiBTeXN0ZW1aVGVybmFyeUNvbnY8bmFtZSMjImciLCBsbHZtX3YxNmk4X3R5LCBsbHZtX3YyaTY0X3R5PjsKK30KKworbXVsdGljbGFzcyBTeXN0ZW1aVGVybmFyeUJIRjxzdHJpbmcgbmFtZT4geworICBkZWYgYiA6IFN5c3RlbVpUZXJuYXJ5PG5hbWUjIyJiIiwgbGx2bV92MTZpOF90eT47CisgIGRlZiBoIDogU3lzdGVtWlRlcm5hcnk8bmFtZSMjImgiLCBsbHZtX3Y4aTE2X3R5PjsKKyAgZGVmIGYgOiBTeXN0ZW1aVGVybmFyeTxuYW1lIyMiZiIsIGxsdm1fdjRpMzJfdHk+OworfQorCittdWx0aWNsYXNzIFN5c3RlbVpUZXJuYXJ5SW50QkhGPHN0cmluZyBuYW1lPiB7CisgIGRlZiBiIDogU3lzdGVtWlRlcm5hcnlJbnQ8bmFtZSMjImIiLCBsbHZtX3YxNmk4X3R5PjsKKyAgZGVmIGggOiBTeXN0ZW1aVGVybmFyeUludDxuYW1lIyMiaCIsIGxsdm1fdjhpMTZfdHk+OworICBkZWYgZiA6IFN5c3RlbVpUZXJuYXJ5SW50PG5hbWUjIyJmIiwgbGx2bV92NGkzMl90eT47Cit9CisKK211bHRpY2xhc3MgU3lzdGVtWlRlcm5hcnlJbnRDQ0JIRiB7CisgIGRlZiBicyA6IFN5c3RlbVpUZXJuYXJ5SW50Q0M8bGx2bV92MTZpOF90eT47CisgIGRlZiBocyA6IFN5c3RlbVpUZXJuYXJ5SW50Q0M8bGx2bV92OGkxNl90eT47CisgIGRlZiBmcyA6IFN5c3RlbVpUZXJuYXJ5SW50Q0M8bGx2bV92NGkzMl90eT47Cit9CisKK211bHRpY2xhc3MgU3lzdGVtWlF1YXRlcm5hcnlJbnRCSEY8c3RyaW5nIG5hbWU+IHsKKyAgZGVmIGIgOiBTeXN0ZW1aUXVhdGVybmFyeUludDxuYW1lIyMiYiIsIGxsdm1fdjE2aThfdHk+OworICBkZWYgaCA6IFN5c3RlbVpRdWF0ZXJuYXJ5SW50PG5hbWUjIyJoIiwgbGx2bV92OGkxNl90eT47CisgIGRlZiBmIDogU3lzdGVtWlF1YXRlcm5hcnlJbnQ8bmFtZSMjImYiLCBsbHZtX3Y0aTMyX3R5PjsKK30KKworbXVsdGljbGFzcyBTeXN0ZW1aUXVhdGVybmFyeUludEJIRkc8c3RyaW5nIG5hbWU+IDogU3lzdGVtWlF1YXRlcm5hcnlJbnRCSEY8bmFtZT4geworICBkZWYgZyA6IFN5c3RlbVpRdWF0ZXJuYXJ5SW50PG5hbWUjIyJnIiwgbGx2bV92Mmk2NF90eT47Cit9CisKK211bHRpY2xhc3MgU3lzdGVtWlF1YXRlcm5hcnlJbnRDQ0JIRiB7CisgIGRlZiBicyA6IFN5c3RlbVpRdWF0ZXJuYXJ5SW50Q0M8bGx2bV92MTZpOF90eT47CisgIGRlZiBocyA6IFN5c3RlbVpRdWF0ZXJuYXJ5SW50Q0M8bGx2bV92OGkxNl90eT47CisgIGRlZiBmcyA6IFN5c3RlbVpRdWF0ZXJuYXJ5SW50Q0M8bGx2bV92NGkzMl90eT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVHJhbnNhY3Rpb25hbC1leGVjdXRpb24gaW50cmluc2ljcworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2xldCBUYXJnZXRQcmVmaXggPSAiczM5MCIgaW4geworICBkZWYgaW50X3MzOTBfdGJlZ2luIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9EdXBsaWNhdGUsIEludHJXcml0ZU1lbV0+OworCisgIGRlZiBpbnRfczM5MF90YmVnaW5fbm9mbG9hdCA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vRHVwbGljYXRlLCBJbnRyV3JpdGVNZW1dPjsKKworICBkZWYgaW50X3MzOTBfdGJlZ2luYyA6IEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9EdXBsaWNhdGUsIEludHJXcml0ZU1lbV0+OworCisgIGRlZiBpbnRfczM5MF90YWJvcnQgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb1JldHVybiwgVGhyb3dzLCBJbnRyV3JpdGVNZW1dPjsKKworICBkZWYgaW50X3MzOTBfdGVuZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl90ZW5kIj4sCisgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdPjsKKworICBkZWYgaW50X3MzOTBfZXRuZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl90eF9uZXN0aW5nX2RlcHRoIj4sCisgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9zMzkwX250c3RnIDogSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1fcHRyNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5LCBJbnRyV3JpdGVNZW1dPjsKKworICBkZWYgaW50X3MzOTBfcHBhX3R4YXNzaXN0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX3R4X2Fzc2lzdCI+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHldPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBWZWN0b3IgaW50cmluc2ljcworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2xldCBUYXJnZXRQcmVmaXggPSAiczM5MCIgaW4geworICBkZWYgaW50X3MzOTBfbGNiYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zMzkwX2xjYmIiPiwKKyAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3MzOTBfdmxiYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zMzkwX3ZsYmIiPiwKKyAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfczM5MF92bGwgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fczM5MF92bGwiPiwKKyAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3MzOTBfdnBkaSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zMzkwX3ZwZGkiPiwKKyAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF9zMzkwX3ZwZXJtIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3MzOTBfdnBlcm0iPiwKKyAgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWZtIGludF9zMzkwX3Zwa3MgOiBTeXN0ZW1aQmluYXJ5VHJ1bmNIRkc8InZwa3MiPjsKKyAgZGVmbSBpbnRfczM5MF92cGtzIDogU3lzdGVtWkJpbmFyeVRydW5jQ0NIRkc7CisKKyAgZGVmbSBpbnRfczM5MF92cGtscyA6IFN5c3RlbVpCaW5hcnlUcnVuY0hGRzwidnBrbHMiPjsKKyAgZGVmbSBpbnRfczM5MF92cGtscyA6IFN5c3RlbVpCaW5hcnlUcnVuY0NDSEZHOworCisgIGRlZiBpbnRfczM5MF92c3RsIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3MzOTBfdnN0bCI+LAorICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5LCBsbHZtX3B0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seSwgSW50cldyaXRlTWVtXT47CisKKyAgZGVmbSBpbnRfczM5MF92dXBsICA6IFN5c3RlbVpVbmFyeUV4dEJIV0Y8InZ1cGwiPjsKKyAgZGVmbSBpbnRfczM5MF92dXBsbCA6IFN5c3RlbVpVbmFyeUV4dEJIRjwidnVwbGwiPjsKKworICBkZWZtIGludF9zMzkwX3Z1cGggIDogU3lzdGVtWlVuYXJ5RXh0QkhGPCJ2dXBoIj47CisgIGRlZm0gaW50X3MzOTBfdnVwbGggOiBTeXN0ZW1aVW5hcnlFeHRCSEY8InZ1cGxoIj47CisKKyAgZGVmbSBpbnRfczM5MF92YWNjIDogU3lzdGVtWkJpbmFyeUJIRkc8InZhY2MiPjsKKworICBkZWYgaW50X3MzOTBfdmFxICAgIDogU3lzdGVtWkJpbmFyeTwidmFxIiwgICAgIGxsdm1fdjE2aThfdHk+OworICBkZWYgaW50X3MzOTBfdmFjcSAgIDogU3lzdGVtWlRlcm5hcnk8InZhY3EiLCAgIGxsdm1fdjE2aThfdHk+OworICBkZWYgaW50X3MzOTBfdmFjY3EgIDogU3lzdGVtWkJpbmFyeTwidmFjY3EiLCAgIGxsdm1fdjE2aThfdHk+OworICBkZWYgaW50X3MzOTBfdmFjY2NxIDogU3lzdGVtWlRlcm5hcnk8InZhY2NjcSIsIGxsdm1fdjE2aThfdHk+OworCisgIGRlZm0gaW50X3MzOTBfdmF2ZyAgOiBTeXN0ZW1aQmluYXJ5QkhGRzwidmF2ZyI+OworICBkZWZtIGludF9zMzkwX3ZhdmdsIDogU3lzdGVtWkJpbmFyeUJIRkc8InZhdmdsIj47CisKKyAgZGVmIGludF9zMzkwX3Zja3NtIDogU3lzdGVtWkJpbmFyeTwidmNrc20iLCBsbHZtX3Y0aTMyX3R5PjsKKworICBkZWZtIGludF9zMzkwX3ZnZm0gIDogU3lzdGVtWkJpbmFyeUV4dEJIRkc8InZnZm0iPjsKKyAgZGVmbSBpbnRfczM5MF92Z2ZtYSA6IFN5c3RlbVpUZXJuYXJ5RXh0QkhGRzwidmdmbWEiPjsKKworICBkZWZtIGludF9zMzkwX3ZtYWggIDogU3lzdGVtWlRlcm5hcnlCSEY8InZtYWgiPjsKKyAgZGVmbSBpbnRfczM5MF92bWFsaCA6IFN5c3RlbVpUZXJuYXJ5QkhGPCJ2bWFsaCI+OworICBkZWZtIGludF9zMzkwX3ZtYWUgIDogU3lzdGVtWlRlcm5hcnlFeHRCSEY8InZtYWUiPjsKKyAgZGVmbSBpbnRfczM5MF92bWFsZSA6IFN5c3RlbVpUZXJuYXJ5RXh0QkhGPCJ2bWFsZSI+OworICBkZWZtIGludF9zMzkwX3ZtYW8gIDogU3lzdGVtWlRlcm5hcnlFeHRCSEY8InZtYW8iPjsKKyAgZGVmbSBpbnRfczM5MF92bWFsbyA6IFN5c3RlbVpUZXJuYXJ5RXh0QkhGPCJ2bWFsbyI+OworCisgIGRlZm0gaW50X3MzOTBfdm1oICA6IFN5c3RlbVpCaW5hcnlCSEY8InZtaCI+OworICBkZWZtIGludF9zMzkwX3ZtbGggOiBTeXN0ZW1aQmluYXJ5QkhGPCJ2bWxoIj47CisgIGRlZm0gaW50X3MzOTBfdm1lICA6IFN5c3RlbVpCaW5hcnlFeHRCSEY8InZtZSI+OworICBkZWZtIGludF9zMzkwX3ZtbGUgOiBTeXN0ZW1aQmluYXJ5RXh0QkhGPCJ2bWxlIj47CisgIGRlZm0gaW50X3MzOTBfdm1vICA6IFN5c3RlbVpCaW5hcnlFeHRCSEY8InZtbyI+OworICBkZWZtIGludF9zMzkwX3ZtbG8gOiBTeXN0ZW1aQmluYXJ5RXh0QkhGPCJ2bWxvIj47CisKKyAgZGVmbSBpbnRfczM5MF92ZXJsbHYgOiBTeXN0ZW1aQmluYXJ5QkhGRzwidmVybGx2Ij47CisgIGRlZm0gaW50X3MzOTBfdmVybGwgIDogU3lzdGVtWkJpbmFyeUludEJIRkc8InZlcmxsIj47CisgIGRlZm0gaW50X3MzOTBfdmVyaW0gIDogU3lzdGVtWlF1YXRlcm5hcnlJbnRCSEZHPCJ2ZXJpbSI+OworCisgIGRlZiBpbnRfczM5MF92c2wgICA6IFN5c3RlbVpCaW5hcnk8InZzbCIsICAgbGx2bV92MTZpOF90eT47CisgIGRlZiBpbnRfczM5MF92c2xiICA6IFN5c3RlbVpCaW5hcnk8InZzbGIiLCAgbGx2bV92MTZpOF90eT47CisgIGRlZiBpbnRfczM5MF92c3JhICA6IFN5c3RlbVpCaW5hcnk8InZzcmEiLCAgbGx2bV92MTZpOF90eT47CisgIGRlZiBpbnRfczM5MF92c3JhYiA6IFN5c3RlbVpCaW5hcnk8InZzcmFiIiwgbGx2bV92MTZpOF90eT47CisgIGRlZiBpbnRfczM5MF92c3JsICA6IFN5c3RlbVpCaW5hcnk8InZzcmwiLCAgbGx2bV92MTZpOF90eT47CisgIGRlZiBpbnRfczM5MF92c3JsYiA6IFN5c3RlbVpCaW5hcnk8InZzcmxiIiwgbGx2bV92MTZpOF90eT47CisKKyAgZGVmIGludF9zMzkwX3ZzbGRiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX3MzOTBfdnNsZGIiPiwKKyAgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmbSBpbnRfczM5MF92c2NiaSA6IFN5c3RlbVpCaW5hcnlCSEZHPCJ2c2NiaSI+OworCisgIGRlZiBpbnRfczM5MF92c3EgICAgIDogU3lzdGVtWkJpbmFyeTwidnNxIiwgICAgICBsbHZtX3YxNmk4X3R5PjsKKyAgZGVmIGludF9zMzkwX3ZzYmlxICAgOiBTeXN0ZW1aVGVybmFyeTwidnNiaXEiLCAgIGxsdm1fdjE2aThfdHk+OworICBkZWYgaW50X3MzOTBfdnNjYmlxICA6IFN5c3RlbVpCaW5hcnk8InZzY2JpcSIsICAgbGx2bV92MTZpOF90eT47CisgIGRlZiBpbnRfczM5MF92c2JjYmlxIDogU3lzdGVtWlRlcm5hcnk8InZzYmNiaXEiLCBsbHZtX3YxNmk4X3R5PjsKKworICBkZWYgaW50X3MzOTBfdnN1bWIgOiBTeXN0ZW1aQmluYXJ5Q29udjwidnN1bWIiLCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3YxNmk4X3R5PjsKKyAgZGVmIGludF9zMzkwX3ZzdW1oIDogU3lzdGVtWkJpbmFyeUNvbnY8InZzdW1oIiwgbGx2bV92NGkzMl90eSwgbGx2bV92OGkxNl90eT47CisKKyAgZGVmIGludF9zMzkwX3ZzdW1naCA6IFN5c3RlbVpCaW5hcnlDb252PCJ2c3VtZ2giLCBsbHZtX3YyaTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eT47CisgIGRlZiBpbnRfczM5MF92c3VtZ2YgOiBTeXN0ZW1aQmluYXJ5Q29udjwidnN1bWdmIiwgbGx2bV92Mmk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHk+OworCisgIGRlZiBpbnRfczM5MF92c3VtcWYgOiBTeXN0ZW1aQmluYXJ5Q29udjwidnN1bXFmIiwgbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHk+OworICBkZWYgaW50X3MzOTBfdnN1bXFnIDogU3lzdGVtWkJpbmFyeUNvbnY8InZzdW1xZyIsIGxsdm1fdjE2aThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyaTY0X3R5PjsKKworICBkZWYgaW50X3MzOTBfdnRtIDogU3lzdGVtWkJpbmFyeUNvbnY8InZ0bSIsIGxsdm1faTMyX3R5LCBsbHZtX3YxNmk4X3R5PjsKKworICBkZWZtIGludF9zMzkwX3ZjZXEgOiBTeXN0ZW1aQ29tcGFyZUJIRkc8InZjZXEiPjsKKyAgZGVmbSBpbnRfczM5MF92Y2ggIDogU3lzdGVtWkNvbXBhcmVCSEZHPCJ2Y2giPjsKKyAgZGVmbSBpbnRfczM5MF92Y2hsIDogU3lzdGVtWkNvbXBhcmVCSEZHPCJ2Y2hsIj47CisKKyAgZGVmbSBpbnRfczM5MF92ZmFlICA6IFN5c3RlbVpUZXJuYXJ5SW50QkhGPCJ2ZmFlIj47CisgIGRlZm0gaW50X3MzOTBfdmZhZSAgOiBTeXN0ZW1aVGVybmFyeUludENDQkhGOworICBkZWZtIGludF9zMzkwX3ZmYWV6IDogU3lzdGVtWlRlcm5hcnlJbnRCSEY8InZmYWV6Ij47CisgIGRlZm0gaW50X3MzOTBfdmZhZXogOiBTeXN0ZW1aVGVybmFyeUludENDQkhGOworCisgIGRlZm0gaW50X3MzOTBfdmZlZSAgOiBTeXN0ZW1aQmluYXJ5QkhGPCJ2ZmVlIj47CisgIGRlZm0gaW50X3MzOTBfdmZlZSAgOiBTeXN0ZW1aQmluYXJ5Q0NCSEY7CisgIGRlZm0gaW50X3MzOTBfdmZlZXogOiBTeXN0ZW1aQmluYXJ5QkhGPCJ2ZmVleiI+OworICBkZWZtIGludF9zMzkwX3ZmZWV6IDogU3lzdGVtWkJpbmFyeUNDQkhGOworCisgIGRlZm0gaW50X3MzOTBfdmZlbmUgIDogU3lzdGVtWkJpbmFyeUJIRjwidmZlbmUiPjsKKyAgZGVmbSBpbnRfczM5MF92ZmVuZSAgOiBTeXN0ZW1aQmluYXJ5Q0NCSEY7CisgIGRlZm0gaW50X3MzOTBfdmZlbmV6IDogU3lzdGVtWkJpbmFyeUJIRjwidmZlbmV6Ij47CisgIGRlZm0gaW50X3MzOTBfdmZlbmV6IDogU3lzdGVtWkJpbmFyeUNDQkhGOworCisgIGRlZm0gaW50X3MzOTBfdmlzdHIgOiBTeXN0ZW1aVW5hcnlCSEY8InZpc3RyIj47CisgIGRlZm0gaW50X3MzOTBfdmlzdHIgOiBTeXN0ZW1aVW5hcnlDQ0JIRjsKKworICBkZWZtIGludF9zMzkwX3ZzdHJjICA6IFN5c3RlbVpRdWF0ZXJuYXJ5SW50QkhGPCJ2c3RyYyI+OworICBkZWZtIGludF9zMzkwX3ZzdHJjICA6IFN5c3RlbVpRdWF0ZXJuYXJ5SW50Q0NCSEY7CisgIGRlZm0gaW50X3MzOTBfdnN0cmN6IDogU3lzdGVtWlF1YXRlcm5hcnlJbnRCSEY8InZzdHJjeiI+OworICBkZWZtIGludF9zMzkwX3ZzdHJjeiA6IFN5c3RlbVpRdWF0ZXJuYXJ5SW50Q0NCSEY7CisKKyAgZGVmIGludF9zMzkwX3ZmY2VkYnMgIDogU3lzdGVtWkJpbmFyeUNvbnZDQzxsbHZtX3YyaTY0X3R5LCBsbHZtX3YyZjY0X3R5PjsKKyAgZGVmIGludF9zMzkwX3ZmY2hkYnMgIDogU3lzdGVtWkJpbmFyeUNvbnZDQzxsbHZtX3YyaTY0X3R5LCBsbHZtX3YyZjY0X3R5PjsKKyAgZGVmIGludF9zMzkwX3ZmY2hlZGJzIDogU3lzdGVtWkJpbmFyeUNvbnZDQzxsbHZtX3YyaTY0X3R5LCBsbHZtX3YyZjY0X3R5PjsKKworICBkZWYgaW50X3MzOTBfdmZ0Y2lkYiA6IFN5c3RlbVpCaW5hcnlDb252SW50Q0M8bGx2bV92Mmk2NF90eSwgbGx2bV92MmY2NF90eT47CisKKyAgZGVmIGludF9zMzkwX3ZmaWRiIDogSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIC8vIEluc3RydWN0aW9ucyBmcm9tIHRoZSBWZWN0b3IgRW5oYW5jZW1lbnRzIEZhY2lsaXR5IDEKKyAgZGVmIGludF9zMzkwX3ZicGVybSA6IFN5c3RlbVpCaW5hcnlDb252PCJ2YnBlcm0iLCBsbHZtX3YyaTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpOF90eT47CisKKyAgZGVmIGludF9zMzkwX3Ztc2xnICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zMzkwX3Ztc2xnIj4sCisgICAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX3YxNmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3MzOTBfdmZtYXhkYiA6IEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF9zMzkwX3ZmbWluZGIgOiBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfczM5MF92Zm1heHNiIDogSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3MzOTBfdmZtaW5zYiA6IEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3MzOTBfdmZjZXNicyAgOiBTeXN0ZW1aQmluYXJ5Q29udkNDPGxsdm1fdjRpMzJfdHksIGxsdm1fdjRmMzJfdHk+OworICBkZWYgaW50X3MzOTBfdmZjaHNicyAgOiBTeXN0ZW1aQmluYXJ5Q29udkNDPGxsdm1fdjRpMzJfdHksIGxsdm1fdjRmMzJfdHk+OworICBkZWYgaW50X3MzOTBfdmZjaGVzYnMgOiBTeXN0ZW1aQmluYXJ5Q29udkNDPGxsdm1fdjRpMzJfdHksIGxsdm1fdjRmMzJfdHk+OworCisgIGRlZiBpbnRfczM5MF92ZnRjaXNiIDogU3lzdGVtWkJpbmFyeUNvbnZJbnRDQzxsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0ZjMyX3R5PjsKKworICBkZWYgaW50X3MzOTBfdmZpc2IgOiBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgLy8gSW5zdHJ1Y3Rpb25zIGZyb20gdGhlIFZlY3RvciBQYWNrZWQgRGVjaW1hbCBGYWNpbGl0eQorICBkZWYgaW50X3MzOTBfdmxybCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zMzkwX3ZscmwiPiwKKyAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfczM5MF92c3RybCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zMzkwX3ZzdHJsIj4sCisgICAgICAgICAgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5LCBsbHZtX3B0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHksIEludHJXcml0ZU1lbV0+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIE1pc2MgaW50cmluc2ljcworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2xldCBUYXJnZXRQcmVmaXggPSAiczM5MCIgaW4geworICBkZWYgaW50X3MzOTBfc2ZwYyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zMzkwX3NmcGMiPiwKKyAgICAgICAgICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0sIFtdPjsKKyAgZGVmIGludF9zMzkwX2VmcGMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5fczM5MF9lZnBjIj4sCisgICAgICAgICAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdLCBbXT47CisKKyAgZGVmIGludF9zMzkwX3RkYyA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9hbnlmbG9hdF90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc1dlYkFzc2VtYmx5LnRkIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzV2ViQXNzZW1ibHkudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTllNWU1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc1dlYkFzc2VtYmx5LnRkCkBAIC0wLDAgKzEsNDggQEAKKy8vPT09LSBJbnRyaW5zaWNzV2ViQXNzZW1ibHkudGQgLSBEZWZpbmVzIHdhc20gaW50cmluc2ljcyAtLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBUaGlzIGZpbGUgZGVmaW5lcyBhbGwgb2YgdGhlIFdlYkFzc2VtYmx5LXNwZWNpZmljIGludHJpbnNpY3MuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2xldCBUYXJnZXRQcmVmaXggPSAid2FzbSIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS53YXNtLiIuCisKKy8vIFF1ZXJ5IHRoZSBjdXJyZW50IG1lbW9yeSBzaXplLCBhbmQgaW5jcmVhc2UgdGhlIGN1cnJlbnQgbWVtb3J5IHNpemUuCisvLyBOb3RlIHRoYXQgbWVtLnNpemUgaXMgbm90IEludHJOb01lbSBiZWNhdXNlIGl0IG11c3QgYmUgc2VxdWVuY2VkIHdpdGgKKy8vIHJlc3BlY3QgdG8gbWVtLmdyb3cgY2FsbHMuCisvLyBUaGVzZSBhcmUgdGhlIG5ldyBwcm9wb3NlZCBuYW1lcywgd2hpY2ggYXJlbid0IHlldCBvZmZpY2lhbC4gVXNlIGF0IHlvdXIgb3duCisvLyByaXNrLgorZGVmIGludF93YXNtX21lbV9zaXplIDogSW50cmluc2ljPFtsbHZtX2FueWludF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50clJlYWRNZW1dPjsKK2RlZiBpbnRfd2FzbV9tZW1fZ3JvdyA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX2kzMl90eSwgTExWTU1hdGNoVHlwZTwwPl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW10+OworCisvLyBUaGVzZSBhcmUgdGhlIGV4aXN0aW5nIG5hbWVzLCB3aGljaCBhcmUgY3VycmVudGx5IG9mZmljaWFsLCBidXQgZXhwZWN0ZWQKKy8vIHRvIGJlIGRlcHJlY2F0ZWQgaW4gdGhlIGZ1dHVyZS4gVGhleSBhbHNvIGxhY2sgdGhlIGltbWVkaWF0ZSBmaWVsZC4KK2RlZiBpbnRfd2FzbV9jdXJyZW50X21lbW9yeSA6IEludHJpbnNpYzxbbGx2bV9hbnlpbnRfdHldLCBbXSwgW0ludHJSZWFkTWVtXT47CitkZWYgaW50X3dhc21fZ3Jvd19tZW1vcnkgOiBJbnRyaW5zaWM8W2xsdm1fYW55aW50X3R5XSwgW0xMVk1NYXRjaFR5cGU8MD5dLCBbXT47CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBFeGNlcHRpb24gaGFuZGxpbmcgaW50cmluc2ljcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gdGhyb3cgLyByZXRocm93CitkZWYgaW50X3dhc21fdGhyb3cgOiBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtUaHJvd3MsIEludHJOb1JldHVybl0+OworZGVmIGludF93YXNtX3JldGhyb3cgOiBJbnRyaW5zaWM8W10sIFtdLCBbVGhyb3dzLCBJbnRyTm9SZXR1cm5dPjsKKworLy8gU2luY2Ugd2FzbSBkb2VzIG5vdCB1c2UgbGFuZGluZ3BhZCBpbnN0cnVjdGlvbnMsIHRoZXNlIGluc3RydWN0aW9ucyByZXR1cm4KKy8vIGV4Y2VwdGlvbiBwb2ludGVyIGFuZCBzZWxlY3RvciB2YWx1ZXMgdW50aWwgd2UgbG93ZXIgdGhlbSBpbiBXYXNtRUhQcmVwYXJlLgorZGVmIGludF93YXNtX2dldF9leGNlcHRpb24gOiBJbnRyaW5zaWM8W2xsdm1fcHRyX3R5XSwgW10sIFtJbnRySGFzU2lkZUVmZmVjdHNdPjsKK2RlZiBpbnRfd2FzbV9nZXRfZWhzZWxlY3RvciA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ckhhc1NpZGVFZmZlY3RzXT47Cit9CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NYODYudGQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NYODYudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjBhOWRjMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvSW50cmluc2ljc1g4Ni50ZApAQCAtMCwwICsxLDY0MjMgQEAKKy8vPT09LSBJbnRyaW5zaWNzWDg2LnRkIC0gRGVmaW5lcyBYODYgaW50cmluc2ljcyAtLS0tLS0tLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYWxsIG9mIHRoZSBYODYtc3BlY2lmaWMgaW50cmluc2ljcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW50ZXJydXB0IHRyYXBzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfaW50IDogSW50cmluc2ljPFtdLCBbbGx2bV9pOF90eV0+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU0VIIGludHJpbnNpY3MgZm9yIFdpbmRvd3MKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7CisgIGRlZiBpbnRfeDg2X3NlaF9sc2RhIDogSW50cmluc2ljPFtsbHZtX3B0cl90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyTm9NZW1dPjsKKworICAvLyBNYXJrcyB0aGUgRUggcmVnaXN0cmF0aW9uIG5vZGUgY3JlYXRlZCBpbiBMTFZNIElSIHByaW9yIHRvIGNvZGUgZ2VuZXJhdGlvbi4KKyAgZGVmIGludF94ODZfc2VoX2VocmVnbm9kZSA6IEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW10+OworCisgIC8vIE1hcmtzIHRoZSBFSCBndWFyZCBzbG90IG5vZGUgY3JlYXRlZCBpbiBMTFZNIElSIHByaW9yIHRvIGNvZGUgZ2VuZXJhdGlvbi4KKyAgZGVmIGludF94ODZfc2VoX2VoZ3VhcmQgOiBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtdPjsKKworICAvLyBHaXZlbiBhIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiBhbiBFSCByZWdpc3RyYXRpb24gb2JqZWN0LCByZXR1cm5zIHRoZSB0cnVlCisgIC8vIHBhcmVudCBmcmFtZSBhZGRyZXNzIHRoYXQgY2FuIGJlIHVzZWQgd2l0aCBsbHZtLmxvY2FscmVjb3Zlci4KKyAgZGVmIGludF94ODZfc2VoX3JlY292ZXJmcCA6IEludHJpbnNpYzxbbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEZMQUdTLgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsKKyAgZGVmIGludF94ODZfZmxhZ3NfcmVhZF91MzIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yZWFkZWZsYWdzX3UzMiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW10sIFtdPjsKKyAgZGVmIGludF94ODZfZmxhZ3NfcmVhZF91NjQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yZWFkZWZsYWdzX3U2NCI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW10sIFtdPjsKKyAgZGVmIGludF94ODZfZmxhZ3Nfd3JpdGVfdTMyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfd3JpdGVlZmxhZ3NfdTMyIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl9mbGFnc193cml0ZV91NjQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl93cml0ZWVmbGFnc191NjQiPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHldLCBbXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBSZWFkIFRpbWUgU3RhbXAgQ291bnRlci4KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7CisgIGRlZiBpbnRfeDg2X3JkdHNjIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmR0c2MiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtdLCBbXT47CisgIGRlZiBpbnRfeDg2X3JkdHNjcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JkdHNjcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fcHRyX3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47Cit9CisKKy8vIFJlYWQgUGVyZm9ybWFuY2UtTW9uaXRvcmluZyBDb3VudGVyLgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsKKyAgZGVmIGludF94ODZfcmRwbWMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yZHBtYyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTMyX3R5XSwgW10+OworfQorCisvLyBSZWFkIHByb2Nlc3NvciBJRC4KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7CisgIGRlZiBpbnRfeDg2X3JkcGlkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmRwaWQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdLCBbXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBDRVQgU1MKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7CisgIGRlZiBpbnRfeDg2X2luY3NzcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9pbmNzc3BkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl9pbmNzc3BxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfaW5jc3NwcSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfcmRzc3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmRzc3BkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X3Jkc3NwcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Jkc3NwcSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5XSwgW10+OworICBkZWYgaW50X3g4Nl9zYXZlcHJldnNzcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NhdmVwcmV2c3NwIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW10sIFtdPjsKKyAgZGVmIGludF94ODZfcnN0b3Jzc3AgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yc3RvcnNzcCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfd3Jzc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl93cnNzZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eSwgbGx2bV9wdHJfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X3dyc3NxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfd3Jzc3EiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1fcHRyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl93cnVzc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl93cnVzc2QiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1fcHRyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl93cnVzc3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl93cnVzc3EiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHksIGxsdm1fcHRyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl9zZXRzc2JzeSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NldHNzYnN5Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW10sIFtdPjsKKyAgZGVmIGludF94ODZfY2xyc3Nic3kgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jbHJzc2JzeSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtdPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIDNETm93IQorCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geworICBkZWYgaW50X3g4Nl8zZG5vd19wYXZndXNiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGF2Z3VzYiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2XzNkbm93X3BmMmlkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGYyaWQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfM2Rub3dfcGZhY2MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZmFjYyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2XzNkbm93X3BmYWRkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGZhZGQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl8zZG5vd19wZmNtcGVxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGZjbXBlcSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2XzNkbm93X3BmY21wZ2UgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZmNtcGdlIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfM2Rub3dfcGZjbXBndCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BmY21wZ3QiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl8zZG5vd19wZm1heCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BmbWF4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfM2Rub3dfcGZtaW4gOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZm1pbiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2XzNkbm93X3BmbXVsIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGZtdWwiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl8zZG5vd19wZnJjcCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BmcmNwIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2XzNkbm93X3BmcmNwaXQxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGZyY3BpdDEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl8zZG5vd19wZnJjcGl0MiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BmcmNwaXQyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfM2Rub3dfcGZyc3FydCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BmcnNxcnQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfM2Rub3dfcGZyc3FpdDEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZnJzcWl0MSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2XzNkbm93X3Bmc3ViIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGZzdWIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl8zZG5vd19wZnN1YnIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZnN1YnIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl8zZG5vd19waTJmZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BpMmZkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2XzNkbm93X3BtdWxocncgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsaHJ3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIDNETm93ISBleHRlbnNpb25zCisKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7CisgIGRlZiBpbnRfeDg2XzNkbm93YV9wZjJpdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BmMml3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2XzNkbm93YV9wZm5hY2MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZm5hY2MiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl8zZG5vd2FfcGZwbmFjYyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BmcG5hY2MiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl8zZG5vd2FfcGkyZncgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waTJmdyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl8zZG5vd2FfcHN3YXBkIDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNTRTEKKworLy8gQXJpdGhtZXRpYyBvcHMKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9zc2Vfc3FydF9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NxcnRzcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV9zcXJ0X3BzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc3FydHBzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX3JjcF9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JjcHNzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX3JjcF9wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JjcHBzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX3JzcXJ0X3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcnNxcnRzcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV9yc3FydF9wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JzcXJ0cHMiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfbWluX3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWluc3MiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX21pbl9wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21pbnBzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV9tYXhfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXhzcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfbWF4X3BzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWF4cHMiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy8gQ29tcGFyaXNvbiBvcHMKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9zc2VfY21wX3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY21wc3MiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX2NtcF9wcyA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV9jb21pZXFfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21pZXEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV9jb21pbHRfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21pbHQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV9jb21pbGVfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21pbGUiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV9jb21pZ3Rfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21pZ3QiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV9jb21pZ2Vfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21pZ2UiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV9jb21pbmVxX3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29taW5lcSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX3Vjb21pZXFfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl91Y29taWVxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfdWNvbWlsdF9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Vjb21pbHQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV91Y29taWxlX3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdWNvbWlsZSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX3Vjb21pZ3Rfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl91Y29taWd0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfdWNvbWlnZV9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Vjb21pZ2UiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZV91Y29taW5lcV9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Vjb21pbmVxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworfQorCisKKy8vIENvbnZlcnNpb24gb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlX2N2dHNzMnNpIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0c3Myc2kiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfY3Z0c3Myc2k2NCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHNzMnNpNjQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfY3Z0dHNzMnNpIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHNzMnNpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX2N2dHRzczJzaTY0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHNzMnNpNjQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfY3Z0c2kyc3MgOiAvLyBUT0RPOiBSZW1vdmUgdGhpcyBpbnRyaW5zaWMuCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfY3Z0c2k2NDJzcyA6IC8vIFRPRE86IFJlbW92ZSB0aGlzIGludHJpbnNpYy4KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfc3NlX2N2dHBzMnBpIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cHMycGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfY3Z0dHBzMnBpOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cHMycGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfY3Z0cGkycHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwaTJwcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy8gQ2FjaGVhYmlsaXR5IHN1cHBvcnQgb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlX3NmZW5jZSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NmZW5jZSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtdLCBbXT47Cit9CisKKy8vIENvbnRyb2wgcmVnaXN0ZXIuCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlX3N0bXhjc3IgOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfc3NlX2xkbXhjc3IgOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtdPjsKK30KKworLy8gTWlzYy4KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9zc2VfbW92bXNrX3BzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbW92bXNrcHMiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU1NFMgorCisvLyBGUCBhcml0aG1ldGljIG9wcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3NzZTJfc3FydF9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NxcnRzZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfc3FydF9wZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NxcnRwZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfbWluX3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWluc2QiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9taW5fcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9taW5wZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX21heF9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21heHNkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfbWF4X3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWF4cGQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy8gRlAgY29tcGFyaXNvbiBvcHMKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9zc2UyX2NtcF9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NtcHNkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfY21wX3BkIDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9jb21pZXFfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21pc2RlcSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9jb21pbHRfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21pc2RsdCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9jb21pbGVfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21pc2RsZSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9jb21pZ3Rfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21pc2RndCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9jb21pZ2Vfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21pc2RnZSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9jb21pbmVxX3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29taXNkbmVxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3Vjb21pZXFfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl91Y29taXNkZXEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfdWNvbWlsdF9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Vjb21pc2RsdCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl91Y29taWxlX3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdWNvbWlzZGxlIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3Vjb21pZ3Rfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl91Y29taXNkZ3QiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfdWNvbWlnZV9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Vjb21pc2RnZSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl91Y29taW5lcV9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Vjb21pc2RuZXEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIEludGVnZXIgYXJpdGhtZXRpYyBvcHMuCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlMl9wYWRkc19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFkZHNiMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BhZGRzX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWRkc3cxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfcGFkZHVzX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWRkdXNiMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BhZGR1c193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFkZHVzdzEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfc3NlMl9wc3Vic19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHN1YnNiMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfcHN1YnNfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzdWJzdzEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BzdWJ1c19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHN1YnVzYjEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BzdWJ1c193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHN1YnVzdzEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BtdWxodV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG11bGh1dzEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfc3NlMl9wbXVsaF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG11bGh3MTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BtdWx1X2RxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG11bHVkcTEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfc3NlMl9wbWFkZF93ZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtYWRkd2QxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfcHNhZF9idyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzYWRidzEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKK30KKworLy8gSW50ZWdlciBzaGlmdCBvcHMuCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlMl9wc2xsX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xsdzEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BzbGxfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGxkMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfcHNsbF9xIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHExMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9wc3JsX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JsdzEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BzcmxfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmxkMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfcHNybF9xIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNybHExMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9wc3JhX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JhdzEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BzcmFfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmFkMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfc3NlMl9wc2xsaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHdpMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BzbGxpX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xsZGkxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfcHNsbGlfcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGxxaTEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9wc3JsaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNybHdpMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BzcmxpX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JsZGkxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfcHNybGlfcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmxxaTEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9wc3JhaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXdpMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BzcmFpX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JhZGkxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIENvbnZlcnNpb24gb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlMl9jdnRkcTJwcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dGRxMnBzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX2N2dHBkMmRxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cGQyZHEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfY3Z0dHBkMmRxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHBkMmRxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX2N2dHBkMnBzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cGQycHMiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfY3Z0cHMyZHEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwczJkcSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9jdnR0cHMyZHEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cHMyZHEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfY3Z0c2Qyc2kgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRzZDJzaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfY3Z0c2Qyc2k2NCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHNkMnNpNjQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX2N2dHRzZDJzaSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRzZDJzaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfY3Z0dHNkMnNpNjQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0c2Qyc2k2NCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfY3Z0c2kyc2QgOiAvLyBUT0RPOiBSZW1vdmUgdGhpcyBpbnRyaW5zaWMuCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX2N2dHNpNjQyc2QgOiAvLyBUT0RPOiBSZW1vdmUgdGhpcyBpbnRyaW5zaWMuCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX2N2dHNkMnNzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0c2Qyc3MiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9jdnRzczJzZCA6IC8vIFRPRE86IFJlbW92ZSB0aGlzIGludHJpbnNpYy4KKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX2N2dHBkMnBpIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cGQycGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfY3Z0dHBkMnBpOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cGQycGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2VfY3Z0cGkycGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwaTJwZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIE1pc2MuCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlMl9wYWNrc3N3Yl8xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWNrc3N3YjEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX3BhY2tzc2R3XzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhY2tzc2R3MTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfcGFja3Vzd2JfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFja3Vzd2IxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlMl9tb3Ztc2tfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tb3Ztc2twZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfcG1vdm1za2JfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdm1za2IxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UyX21hc2ttb3ZfZHF1IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWFza21vdmRxdSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3YxNmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aThfdHksIGxsdm1fcHRyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl9zc2UyX2NsZmx1c2ggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jbGZsdXNoIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl9zc2UyX2xmZW5jZSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2xmZW5jZSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtdLCBbXT47CisgIGRlZiBpbnRfeDg2X3NzZTJfbWZlbmNlIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWZlbmNlIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW10sIFtdPjsKKyAgZGVmIGludF94ODZfc3NlMl9wYXVzZSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhdXNlIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW10sIFtdPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNTRTMKKworLy8gQWRkaXRpb24gLyBzdWJ0cmFjdGlvbiBvcHMuCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlM19hZGRzdWJfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZGRzdWJwcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UzX2FkZHN1Yl9wZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2FkZHN1YnBkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIEhvcml6b250YWwgb3BzLgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3NzZTNfaGFkZF9wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2hhZGRwcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2UzX2hhZGRfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9oYWRkcGQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlM19oc3ViX3BzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfaHN1YnBzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTNfaHN1Yl9wZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2hzdWJwZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLyBTcGVjaWFsaXplZCB1bmFsaWduZWQgbG9hZC4KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9zc2UzX2xkdV9kcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2xkZHF1Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyUmVhZE1lbV0+OworfQorCisvLyBUaHJlYWQgc3luY2hyb25pemF0aW9uIG9wcy4KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9zc2UzX21vbml0b3IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tb25pdG9yIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfc3NlM19td2FpdCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX213YWl0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW10+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU1NTRTMKKworLy8gSG9yaXpvbnRhbCBhcml0aG1ldGljIG9wcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BoYWRkX3cgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BoYWRkdyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc3NlM19waGFkZF93XzEyOCAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waGFkZHcxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9zc3NlM19waGFkZF9kICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waGFkZGQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NzZTNfcGhhZGRfZF8xMjggICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGhhZGRkMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfc3NzZTNfcGhhZGRfc3cgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGhhZGRzdyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc3NlM19waGFkZF9zd18xMjggICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waGFkZHN3MTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfc3NzZTNfcGhzdWJfdyAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGhzdWJ3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3Nzc2UzX3Boc3ViX3dfMTI4ICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Boc3VidzEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3Boc3ViX2QgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Boc3ViZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc3NlM19waHN1Yl9kXzEyOCAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waHN1YmQxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9zc3NlM19waHN1Yl9zdyAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waHN1YnN3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3Nzc2UzX3Boc3ViX3N3XzEyOCAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Boc3Vic3cxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9zc3NlM19wbWFkZF91Yl9zdyAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbWFkZHVic3ciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NzZTNfcG1hZGRfdWJfc3dfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1hZGR1YnN3MTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3YxNmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIFBhY2tlZCBtdWx0aXBseSBoaWdoIHdpdGggcm91bmQgYW5kIHNjYWxlCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NzZTNfcG11bF9ocl9zdyAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG11bGhyc3ciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BtdWxfaHJfc3dfMTI4ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtdWxocnN3MTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworfQorCisvLyBTaHVmZmxlIG9wcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BzaHVmX2IgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzaHVmYiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc3NlM19wc2h1Zl9iXzEyOCAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2h1ZmIxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlX3BzaHVmX3cgICAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNodWZ3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KKworLy8gU2lnbiBvcHMKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9zc3NlM19wc2lnbl9iICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2lnbmIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NzZTNfcHNpZ25fYl8xMjggICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNpZ25iMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfc3NzZTNfcHNpZ25fdyAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNpZ253Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BzaWduX3dfMTI4ICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzaWdudzEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X3Nzc2UzX3BzaWduX2QgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzaWduZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc3NlM19wc2lnbl9kXzEyOCAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2lnbmQxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy8gQWJzb2x1dGUgdmFsdWUgb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NzZTNfcGFic19iICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhYnNiIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfc3NzZTNfcGFic193ICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhYnN3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfc3NzZTNfcGFic19kICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhYnNkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTU0U0LjEKKworLy8gRlAgcm91bmRpbmcgb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlNDFfcm91bmRfc3MgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcm91bmRzcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlNDFfcm91bmRfcHMgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcm91bmRwcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlNDFfcm91bmRfc2QgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcm91bmRzZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlNDFfcm91bmRfcGQgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcm91bmRwZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy8gVmVjdG9yIG1pbiBlbGVtZW50CitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlNDFfcGhtaW5wb3N1dyAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waG1pbnBvc3V3MTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KKworLy8gQWR2YW5jZWQgRW5jcnlwdGlvbiBTdGFuZGFyZCAoQUVTKSBJbnN0cnVjdGlvbnMKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hZXNuaV9hZXNpbWMgICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZXNpbWMxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2Flc25pX2Flc2VuYyAgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Flc2VuYzEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2Flc25pX2Flc2VuY18yNTYgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Flc2VuYzI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2Flc25pX2Flc2VuY181MTIgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Flc2VuYzUxMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYWVzbmlfYWVzZW5jbGFzdCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Flc2VuY2xhc3QxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hZXNuaV9hZXNlbmNsYXN0XzI1NiA6CisgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYWVzZW5jbGFzdDI1NiI+LAorICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hZXNuaV9hZXNlbmNsYXN0XzUxMiA6CisgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYWVzZW5jbGFzdDUxMiI+LAorICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2Flc25pX2Flc2RlYyAgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Flc2RlYzEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2Flc25pX2Flc2RlY18yNTYgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Flc2RlYzI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2Flc25pX2Flc2RlY181MTIgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Flc2RlYzUxMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYWVzbmlfYWVzZGVjbGFzdCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Flc2RlY2xhc3QxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hZXNuaV9hZXNkZWNsYXN0XzI1NiA6CisgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYWVzZGVjbGFzdDI1NiI+LAorICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hZXNuaV9hZXNkZWNsYXN0XzUxMiA6CisgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYWVzZGVjbGFzdDUxMiI+LAorICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2Flc25pX2Flc2tleWdlbmFzc2lzdCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Flc2tleWdlbmFzc2lzdDEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKKy8vIFBDTE1VTCBpbnN0cnVjdGlvbnMKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7IC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3BjbG11bHFkcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BjbG11bHFkcTEyOCI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9wY2xtdWxxZHFfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNsbXVscWRxMjU2Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjRpNjRfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3BjbG11bHFkcV81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY2xtdWxxZHE1MTIiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KKworLy8gVmVjdG9yIHBhY2sKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9zc2U0MV9wYWNrdXNkdyAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWNrdXNkdzEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKKy8vIFZlY3RvciBtdWx0aXBseQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3NzZTQxX3BtdWxkcSAgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtdWxkcTEyOCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworfQorCisvLyBWZWN0b3IgaW5zZXJ0CitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlNDFfaW5zZXJ0cHMgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9pbnNlcnRwczEyOCI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworfQorCisvLyBWZWN0b3IgYmxlbmQKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9zc2U0MV9wYmxlbmR2YiAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGJsZW5kdmIxMjgiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTQxX2JsZW5kdnBkICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9ibGVuZHZwZCI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSxsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlNDFfYmxlbmR2cHMgICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2JsZW5kdnBzIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LGxsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworfQorCisvLyBWZWN0b3IgZG90IHByb2R1Y3QKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9zc2U0MV9kcHBkICAgICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9kcHBkIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9zc2U0MV9kcHBzICAgICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9kcHBzIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworfQorCisvLyBWZWN0b3Igc3VtIG9mIGFic29sdXRlIGRpZmZlcmVuY2VzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlNDFfbXBzYWRidyAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbXBzYWRidzEyOCI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworfQorCisvLyBUZXN0IGluc3RydWN0aW9uIHdpdGggYml0d2lzZSBjb21wYXJpc29uLgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlNDFfcHRlc3R6ICAgICAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHRlc3R6MTI4Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2U0MV9wdGVzdGMgICAgICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wdGVzdGMxMjgiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTQxX3B0ZXN0bnpjICAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3B0ZXN0bnpjMTI4Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU1NFNC4yCisKKy8vIE1pc2NlbGxhbmVvdXMKKy8vIENSQyBJbnN0cnVjdGlvbgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfc3NlNDJfY3JjMzJfMzJfOCAgICAgICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NyYzMycWkiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2U0Ml9jcmMzMl8zMl8xNiAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3JjMzJoaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2U0Ml9jcmMzMl8zMl8zMiAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3JjMzJzaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2U0Ml9jcmMzMl82NF82NCAgICAgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3JjMzJkaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworfQorCisvLyBTdHJpbmcvdGV4dCBwcm9jZXNzaW5nIG9wcy4KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7IC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3NzZTQyX3BjbXBpc3RybTEyOCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21waXN0cm0xMjgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlNDJfcGNtcGlzdHJpMTI4ICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaTEyOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlNDJfcGNtcGlzdHJpYTEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaWExMjgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faThfdHldLAorICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTQyX3BjbXBpc3RyaWMxMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21waXN0cmljMTI4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2U0Ml9wY21waXN0cmlvMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGlzdHJpbzEyOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlNDJfcGNtcGlzdHJpczEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BjbXBpc3RyaXMxMjgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faThfdHldLAorICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTQyX3BjbXBpc3RyaXoxMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21waXN0cml6MTI4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2U0Ml9wY21wZXN0cm0xMjggIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGVzdHJtMTI4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgIGxsdm1faThfdHldLAorICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTQyX3BjbXBlc3RyaTEyOCAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21wZXN0cmkxMjgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgIGxsdm1faThfdHldLAorICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTQyX3BjbXBlc3RyaWExMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21wZXN0cmlhMTI4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICBsbHZtX2k4X3R5XSwKKyAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2U0Ml9wY21wZXN0cmljMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGVzdHJpYzEyOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlNDJfcGNtcGVzdHJpbzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BjbXBlc3RyaW8xMjgiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwKKyAgICAgICAgW2xsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgIGxsdm1faThfdHldLAorICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTQyX3BjbXBlc3RyaXMxMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21wZXN0cmlzMTI4Ij4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgIFtsbHZtX3YxNmk4X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICBsbHZtX2k4X3R5XSwKKyAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zc2U0Ml9wY21wZXN0cml6MTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGVzdHJpejEyOCI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLAorICAgICAgICBbbGx2bV92MTZpOF90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNTRTRBCisKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9zc2U0YV9leHRycWkgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9leHRycWkiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc3NlNGFfZXh0cnEgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXh0cnEiPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9zc2U0YV9pbnNlcnRxaSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2luc2VydHFpIj4sCisgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NzZTRhX2luc2VydHEgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfaW5zZXJ0cSI+LAorICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQVZYCisKKy8vIEFyaXRobWV0aWMgb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4X2FkZHN1Yl9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9hZGRzdWJwZDI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjRmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF9hZGRzdWJfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYWRkc3VicHMyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y4ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfbWF4X3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21heHBkMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92NGY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4X21heF9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXhwczI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjhmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF9taW5fcGRfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWlucGQyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fdjRmNjRfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfbWluX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21pbnBzMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92OGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdnhfc3FydF9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zcXJ0cGQyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fdjRmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF9zcXJ0X3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NxcnRwczI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdnhfcnNxcnRfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcnNxcnRwczI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdnhfcmNwX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JjcHBzMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eF9yb3VuZF9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yb3VuZHBkMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF9yb3VuZF9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yb3VuZHBzMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIEhvcml6b250YWwgb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4X2hhZGRfcGRfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfaGFkZHBkMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92NGY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4X2hzdWJfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfaHN1YnBzMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92OGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4X2hzdWJfcGRfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfaHN1YnBkMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92NGY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4X2hhZGRfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfaGFkZHBzMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92OGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy8gVmVjdG9yIHBlcm11dGF0aW9uCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4X3ZwZXJtaWx2YXJfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycGQiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfdnBlcm1pbHZhcl9wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwcyI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4X3ZwZXJtaWx2YXJfcGRfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pbHZhcnBkMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0aTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfdnBlcm1pbHZhcl9wc18yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycHMyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhpMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9kXzEyOCA6CisgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcmQxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybWkydmFyX2RfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcmQyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybWkydmFyX2RfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcmQ1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfaGlfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcmhpMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9oaV8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWkydmFyaGkyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmkxNl90eSwgbGx2bV92MTZpMTZfdHksIGxsdm1fdjE2aTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfaGlfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcmhpNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwKKyAgICAgICAgICBbbGx2bV92MzJpMTZfdHksIGxsdm1fdjMyaTE2X3R5LCBsbHZtX3YzMmkxNl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybWkydmFyX3BkXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJwZDEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcGRfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcnBkMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9wZF81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWkydmFycGQ1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1fdjhmNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybWkydmFyX3BzXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJwczEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcHNfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcnBzMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9wc181MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWkydmFycHM1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWkydmFycTEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcV8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWkydmFycTI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWkydmFycTUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfZF81MTI6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJkNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkzMl90eSwgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9xXzUxMjoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnE1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9wc181MTI6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwczUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcGRfNTEyOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFycGQ1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGk2NF90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9kXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJkMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfZF8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFyZDEyOF9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybXQydmFyX2RfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmQyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9kXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJkMjU2X21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX2RfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmQ1MTJfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkzMl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybXQydmFyX2hpXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJoaTEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX2hpXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJoaTEyOF9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybXQydmFyX2hpXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJoaTI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sCisgICAgICAgICAgW2xsdm1fdjE2aTE2X3R5LCBsbHZtX3YxNmkxNl90eSwgbGx2bV92MTZpMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfaGlfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm10MnZhcmhpMjU2X21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sCisgICAgICAgICAgW2xsdm1fdjE2aTE2X3R5LCBsbHZtX3YxNmkxNl90eSwgbGx2bV92MTZpMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9oaV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFyaGk1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpMTZfdHldLAorICAgICAgICAgIFtsbHZtX3YzMmkxNl90eSwgbGx2bV92MzJpMTZfdHksIGxsdm1fdjMyaTE2X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX2hpXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJoaTUxMl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpMTZfdHldLAorICAgICAgICAgIFtsbHZtX3YzMmkxNl90eSwgbGx2bV92MzJpMTZfdHksIGxsdm1fdjMyaTE2X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcGRfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnBkMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcGRfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnBkMTI4X21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcGRfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnBkMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcGRfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnBkMjU2X21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3BkXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwZDUxMl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybXQydmFyX3BzXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwczEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3BzXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwczEyOF9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybXQydmFyX3BzXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwczI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGkzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3BzXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJwczI1Nl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9wc181MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFycHM1MTJfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybXQydmFyX3FfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnExMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9xXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxMTI4X21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcV8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFycTI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3FfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnEyNTZfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFycTUxMl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybWkydmFyX3FpXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtaTJ2YXJxaTEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksCisgICAgICAgICAgbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGVybXQydmFyX3FpXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxaTEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksCisgICAgICAgICAgbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBlcm10MnZhcl9xaV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFycWkxMjhfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwKKyAgICAgICAgICBsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtaTJ2YXJfcWlfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm1pMnZhcnFpMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaThfdHldLCBbbGx2bV92MzJpOF90eSwKKyAgICAgICAgICBsbHZtX3YzMmk4X3R5LCBsbHZtX3YzMmk4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZXJtdDJ2YXJfcWlfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnFpMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaThfdHldLCBbbGx2bV92MzJpOF90eSwKKyAgICAgICAgICBsbHZtX3YzMmk4X3R5LCBsbHZtX3YzMmk4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cGVybXQydmFyX3FpXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtdDJ2YXJxaTI1Nl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpOF90eV0sIFtsbHZtX3YzMmk4X3R5LAorICAgICAgICAgIGxsdm1fdjMyaThfdHksIGxsdm1fdjMyaThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm1pMnZhcl9xaV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWkydmFycWk1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NjRpOF90eV0sIFtsbHZtX3Y2NGk4X3R5LAorICAgICAgICAgIGxsdm1fdjY0aThfdHksIGxsdm1fdjY0aThfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBlcm10MnZhcl9xaV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybXQydmFycWk1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NjRpOF90eV0sIFtsbHZtX3Y2NGk4X3R5LAorICAgICAgICAgIGxsdm1fdjY0aThfdHksIGxsdm1fdjY0aThfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZXJtdDJ2YXJfcWlfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBlcm10MnZhcnFpNTEyX21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y2NGk4X3R5XSwgW2xsdm1fdjY0aThfdHksCisgICAgICAgICAgbGx2bV92NjRpOF90eSwgbGx2bV92NjRpOF90eSwgbGx2bV9pNjRfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfdnBlcm1pbHZhcl9wZF81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWlsdmFycGQ1MTIiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGY2NF90eSwgbGx2bV92OGk2NF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl92cGVybWlsdmFyX3BzXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtaWx2YXJwczUxMiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzaHVmX2JfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNodWZiNTEyIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y2NGk4X3R5XSwgW2xsdm1fdjY0aThfdHksIGxsdm1fdjY0aThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworfQorCisvLyBHRk5JIEluc3RydWN0aW9ucworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X3ZnZjJwOGFmZmluZWludnFiXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Z2YycDhhZmZpbmVpbnZxYl92MTZxaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfdmdmMnA4YWZmaW5laW52cWJfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZnZjJwOGFmZmluZWludnFiX3YzMnFpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwKKyAgICAgICAgICBbbGx2bV92MzJpOF90eSwgbGx2bV92MzJpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl92Z2YycDhhZmZpbmVpbnZxYl81MTIgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmdmMnA4YWZmaW5laW52cWJfdjY0cWkiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjY0aThfdHldLAorICAgICAgICAgIFtsbHZtX3Y2NGk4X3R5LCBsbHZtX3Y2NGk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfdmdmMnA4YWZmaW5lcWJfMTI4IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZnZjJwOGFmZmluZXFiX3YxNnFpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl92Z2YycDhhZmZpbmVxYl8yNTYgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmdmMnA4YWZmaW5lcWJfdjMycWkiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaThfdHldLAorICAgICAgICAgIFtsbHZtX3YzMmk4X3R5LCBsbHZtX3YzMmk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3ZnZjJwOGFmZmluZXFiXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Z2YycDhhZmZpbmVxYl92NjRxaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NjRpOF90eV0sCisgICAgICAgICAgW2xsdm1fdjY0aThfdHksIGxsdm1fdjY0aThfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl92Z2YycDhtdWxiXzEyOCAgICAgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmdmMnA4bXVsYl92MTZxaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfdmdmMnA4bXVsYl8yNTYgICAgIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZnZjJwOG11bGJfdjMycWkiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaThfdHldLAorICAgICAgICAgIFtsbHZtX3YzMmk4X3R5LCBsbHZtX3YzMmk4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3ZnZjJwOG11bGJfNTEyICAgICA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Z2YycDhtdWxiX3Y2NHFpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y2NGk4X3R5XSwKKyAgICAgICAgICBbbGx2bV92NjRpOF90eSwgbGx2bV92NjRpOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworfQorCisvLyBWZWN0b3IgYmxlbmQKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hdnhfYmxlbmR2X3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2JsZW5kdnBkMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4X2JsZW5kdl9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9ibGVuZHZwczI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIFZlY3RvciBkb3QgcHJvZHVjdAorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eF9kcF9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9kcHBzMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92OGYzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47Cit9CisKKy8vIFZlY3RvciBjb21wYXJlCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4X2NtcF9wZF8yNTYgOgorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjRmNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF9jbXBfcHNfMjU2IDoKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y4ZjMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLyBWZWN0b3IgY29udmVydAorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eF9jdnRkcTJfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0ZHEycHMyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF9jdnRfcGQyX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBkMnBzMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfY3Z0X3BzMmRxXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBzMmRxMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfY3Z0dF9wZDJkcV8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cGQyZHEyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF9jdnRfcGQyZHFfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cGQyZHEyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF9jdnR0X3BzMmRxXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRwczJkcTI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy8gVmVjdG9yIGJpdCB0ZXN0CitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4X3Z0ZXN0el9wZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Z0ZXN0enBkIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF92dGVzdGNfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92dGVzdGNwZCI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfdnRlc3RuemNfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92dGVzdG56Y3BkIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF92dGVzdHpfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92dGVzdHpwcyI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfdnRlc3RjX3BzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnRlc3RjcHMiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4X3Z0ZXN0bnpjX3BzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnRlc3RuemNwcyI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfdnRlc3R6X3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Z0ZXN0enBkMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGY2NF90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjRmNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF92dGVzdGNfcGRfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnRlc3RjcGQyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92NGY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4X3Z0ZXN0bnpjX3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Z0ZXN0bnpjcGQyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92NGY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4X3Z0ZXN0el9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92dGVzdHpwczI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjhmMzJfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y4ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdnhfdnRlc3RjX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Z0ZXN0Y3BzMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92OGYzMl90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjhmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF92dGVzdG56Y19wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92dGVzdG56Y3BzMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92OGYzMl90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjhmMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF9wdGVzdHpfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHRlc3R6MjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGk2NF90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjRpNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF9wdGVzdGNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHRlc3RjMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGk2NF90eSwKKyAgICAgICAgICAgICAgICAgIGxsdm1fdjRpNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eF9wdGVzdG56Y18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wdGVzdG56YzI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTY0X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2ZwY2xhc3NfcGRfMTI4IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2ZwY2xhc3NwZDEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k4X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2ZwY2xhc3NfcGRfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2ZwY2xhc3NwZDI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k4X3R5XSwgW2xsdm1fdjRmNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2ZwY2xhc3NfcGRfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2ZwY2xhc3NwZDUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k4X3R5XSwgW2xsdm1fdjhmNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2ZwY2xhc3NfcHNfMTI4IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2ZwY2xhc3NwczEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k4X3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2ZwY2xhc3NfcHNfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2ZwY2xhc3NwczI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k4X3R5XSwgW2xsdm1fdjhmMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2ZwY2xhc3NfcHNfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2ZwY2xhc3NwczUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kxNl90eV0sIFtsbHZtX3YxNmYzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2ZwY2xhc3Nfc2QgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZnBjbGFzc3NkX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faThfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZnBjbGFzc19zcyA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9mcGNsYXNzc3NfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pOF90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworfQorCisvLyBWZWN0b3IgZXh0cmFjdCBzaWduIG1hc2sKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hdnhfbW92bXNrX3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21vdm1za3BkMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4X21vdm1za19wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tb3Ztc2twczI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjhmMzJfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIFZlY3RvciB6ZXJvCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4X3Z6ZXJvYWxsIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnplcm9hbGwiPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbXSwgW10+OworICBkZWYgaW50X3g4Nl9hdnhfdnplcm91cHBlciA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Z6ZXJvdXBwZXIiPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbXSwgW10+OworfQorCisvLyBTSU1EIGxvYWQgb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4X2xkdV9kcV8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9sZGRxdTI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaThfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50clJlYWRNZW1dPjsKK30KKworLy8gQ29uZGl0aW9uYWwgbG9hZCBvcHMKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hdnhfbWFza2xvYWRfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXNrbG9hZHBkIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eF9tYXNrbG9hZF9wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21hc2tsb2FkcHMiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4X21hc2tsb2FkX3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21hc2tsb2FkcGQyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4X21hc2tsb2FkX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21hc2tsb2FkcHMyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKK30KKworLy8gQ29uZGl0aW9uYWwgc3RvcmUgb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4X21hc2tzdG9yZV9wZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZXBkIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LAorICAgICAgICAgICAgICAgICAgbGx2bV92Mmk2NF90eSwgbGx2bV92MmY2NF90eV0sIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdnhfbWFza3N0b3JlX3BzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWFza3N0b3JlcHMiPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eF9tYXNrc3RvcmVfcGRfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWFza3N0b3JlcGQyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0ZjY0X3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eF9tYXNrc3RvcmVfcHNfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWFza3N0b3JlcHMyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksCisgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4ZjMyX3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfc3RvcmVfc3MgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zdG9yZXNzX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47Cit9CisKKy8vIEJJVEFMRyBiaXRzIHNodWZmbGUKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNodWZiaXRxbWJfMTI4IDoKKyAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNodWZiaXRxbWIxMjhfbWFzayI+LAorICAgIEludHJpbnNpYzxbbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2h1ZmJpdHFtYl8yNTYgOgorICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2h1ZmJpdHFtYjI1Nl9tYXNrIj4sCisgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtsbHZtX3YzMmk4X3R5LCBsbHZtX3YzMmk4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaHVmYml0cW1iXzUxMiA6CisgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHVmYml0cW1iNTEyX21hc2siPiwKKyAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW2xsdm1fdjY0aThfdHksIGxsdm1fdjY0aThfdHksIGxsdm1faTY0X3R5XSwKKyAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQVZYMgorCisvLyBJbnRlZ2VyIGFyaXRobWV0aWMgb3BzLgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eDJfcGFkZHNfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhZGRzYjI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaThfdHldLCBbbGx2bV92MzJpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmk4X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wYWRkc193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFkZHN3MjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMTZfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BhZGR1c19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFkZHVzYjI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaThfdHldLCBbbGx2bV92MzJpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmk4X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wYWRkdXNfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhZGR1c3cyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkxNl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHN1YnNfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzdWJzYjI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaThfdHldLCBbbGx2bV92MzJpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmk4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BzdWJzX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3Vic3cyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wc3VidXNfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzdWJ1c2IyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwgW2xsdm1fdjMyaThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MzJpOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wc3VidXNfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzdWJ1c3cyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wbXVsaHVfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtdWxodXcyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkxNl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcG11bGhfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtdWxodzI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTE2X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wbXVsdV9kcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtdWx1ZHEyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcG11bF9kcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtdWxkcTI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV92OGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTMyX3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wbWFkZF93ZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtYWRkd2QyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTE2X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wc2FkX2J3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNhZGJ3MjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3YzMmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjMyaThfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworfQorCisvLyBJbnRlZ2VyIHNoaWZ0IG9wcy4KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hdngyX3BzbGxfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGx3MjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wc2xsX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xsZDI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BzbGxfcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGxxMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3Y0aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHNybF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNybHcyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BzcmxfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmxkMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHNybF9xIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNybHEyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wc3JhX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JhdzI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHNyYV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYWQyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdngyX3BzbGxpX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xsd2kyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wc2xsaV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbGRpMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BzbGxpX3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xscWkyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHNybGlfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Bzcmx3aTI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BzcmxpX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JsZGkyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHNybGlfcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmxxaTI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV92NGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wc3JhaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXdpMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHNyYWlfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmFkaTI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNyYV9xXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmFxMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc3JhX3FfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXEyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNyYWlfcV8xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JhcWkxMjgiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc3JhaV9xXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmFxaTI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV92NGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNsbF93XzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGx3NTEyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpMTZfdHldLCBbbGx2bV92MzJpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzbGxfZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xsZDUxMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc2xsX3FfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHE1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fdjhpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92Mmk2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3Bzcmxfd181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JsdzUxMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwgW2xsdm1fdjMyaTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc3JsX2RfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNybGQ1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNybF9xXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmxxNTEyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJpNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc3JhX3dfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXc1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sIFtsbHZtX3YzMmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNyYV9kXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmFkNTEyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzcmFfcV81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JhcTUxMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyaTY0X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc2xsaV93XzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGx3aTUxMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwgW2xsdm1fdjMyaTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNsbGlfZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xsZGk1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzbGxpX3FfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHFpNTEyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNybGlfd181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3Jsd2k1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sIFtsbHZtX3YzMmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzcmxpX2RfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNybGRpNTEyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc3JsaV9xXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmxxaTUxMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzcmFpX3dfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXdpNTEyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpMTZfdHldLCBbbGx2bV92MzJpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc3JhaV9kXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmFkaTUxMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNyYWlfcV81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JhcWk1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fdjhpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG11bHRpc2hpZnRfcWJfMTI4OgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG11bHRpc2hpZnRxYjEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbXVsdGlzaGlmdF9xYl8yNTY6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwbXVsdGlzaGlmdHFiMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwgW2xsdm1fdjMyaThfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92MzJpOF90eSwgbGx2bV92MzJpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BtdWx0aXNoaWZ0X3FiXzUxMjoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBtdWx0aXNoaWZ0cWI1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjY0aThfdHldLCBbbGx2bV92NjRpOF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3Y2NGk4X3R5LCBsbHZtX3Y2NGk4X3R5LCBsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy8gUGFjayBvcHMuCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4Ml9wYWNrc3N3YiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhY2tzc3diMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpOF90eV0sIFtsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wYWNrc3NkdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhY2tzc2R3MjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92OGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BhY2t1c3diIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFja3Vzd2IyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwgW2xsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BhY2t1c2R3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFja3VzZHcyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIEhvcml6b250YWwgYXJpdGhtZXRpYyBvcHMKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hdngyX3BoYWRkX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waGFkZHcyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9waGFkZF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGhhZGRkMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcGhhZGRfc3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waGFkZHN3MjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcGhzdWJfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Boc3VidzI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3Boc3ViX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9waHN1YmQyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9waHN1Yl9zdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Boc3Vic3cyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wbWFkZF91Yl9zdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtYWRkdWJzdzI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjMyaThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MzJpOF90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy8gU2lnbiBvcHMKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hdngyX3BzaWduX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2lnbmIyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwgW2xsdm1fdjMyaThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MzJpOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wc2lnbl93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNpZ253MjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHNpZ25fZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzaWduZDI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTMyX3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLyBQYWNrZWQgbXVsdGlwbHkgaGlnaCB3aXRoIHJvdW5kIGFuZCBzY2FsZQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eDJfcG11bF9ocl9zdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtdWxocnN3MjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMTZfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcG11bF9ocl9zd181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsaHJzdzUxMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwgW2xsdm1fdjMyaTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjMyaTE2X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKK30KKworLy8gVmVjdG9yIGJsZW5kCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4Ml9wYmxlbmR2YiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BibGVuZHZiMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpOF90eV0sIFtsbHZtX3YzMmk4X3R5LCBsbHZtX3YzMmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjMyaThfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKworLy8gVmVjdG9yIHBlcm11dGF0aW9uCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4Ml9wZXJtZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Blcm12YXJzaTI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcGVybXBzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGVybXZhcnNmMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KKworLy8gQ29uZGl0aW9uYWwgbG9hZCBvcHMKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hdngyX21hc2tsb2FkX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXNrbG9hZGQiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9tYXNrbG9hZF9xIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWFza2xvYWRxIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDJfbWFza2xvYWRfZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXNrbG9hZGQyNTYiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9tYXNrbG9hZF9xXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21hc2tsb2FkcTI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1fdjRpNjRfdHldLAorICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworfQorCisvLyBDb25kaXRpb25hbCBzdG9yZSBvcHMKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hdngyX21hc2tzdG9yZV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWFza3N0b3JlZCI+LAorICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9tYXNrc3RvcmVfcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21hc2tzdG9yZXEiPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDJfbWFza3N0b3JlX2RfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWFza3N0b3JlZDI1NiI+LAorICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9tYXNrc3RvcmVfcV8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXNrc3RvcmVxMjU2Ij4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworfQorCisvLyBWYXJpYWJsZSBiaXQgc2hpZnQgb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4Ml9wc2xsdl9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHY0c2kiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BzbGx2X2RfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHY4c2kiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3BzbGx2X3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xsdjJkaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHNsbHZfcV8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xsdjRkaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzbGx2X2RfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHYxNnNpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzbGx2X3FfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHY4ZGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDJfcHNybHZfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Bzcmx2NHNpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wc3Jsdl9kXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Bzcmx2OHNpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9wc3Jsdl9xIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNybHYyZGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX3Bzcmx2X3FfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNybHY0ZGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjRpNjRfdHksIGxsdm1fdjRpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc3Jsdl9kXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Bzcmx2MTZzaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc3Jsdl9xXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Bzcmx2OGRpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdngyX3BzcmF2X2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JhdjRzaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHNyYXZfZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JhdjhzaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzcmF2X2RfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXYxNnNpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzcmF2X3FfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXZxMTI4Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzcmF2X3FfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXZxMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzcmF2X3FfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXY4ZGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc2xsdl93XzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGx2OGhpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzbGx2X3dfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHYxNmhpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksIGxsdm1fdjE2aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzbGx2X3dfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbHYzMmhpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpMTZfdHldLCBbbGx2bV92MzJpMTZfdHksIGxsdm1fdjMyaTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNybHZfd18xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JsdjhoaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc3Jsdl93XzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Bzcmx2MTZoaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjE2aTE2X3R5LCBsbHZtX3YxNmkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wc3Jsdl93XzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Bzcmx2MzJoaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwgW2xsdm1fdjMyaTE2X3R5LCBsbHZtX3YzMmkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BzcmF2X3dfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXY4aGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNyYXZfd18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JhdjE2aGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmkxNl90eSwgbGx2bV92MTZpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNyYXZfd181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JhdjMyaGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sIFtsbHZtX3YzMmkxNl90eSwgbGx2bV92MzJpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Byb3J2X2RfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHJvcnZkMTI4X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHJvcnZfZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wcm9ydmQyNTZfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wcm9ydl9kXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Byb3J2ZDUxMl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHJvcnZfcV8xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wcm9ydnExMjhfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wcm9ydl9xXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Byb3J2cTI1Nl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3Y0aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpNjRfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Byb3J2X3FfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHJvcnZxNTEyX21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fdjhpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHJvbF9kXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Byb2xkMTI4X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSAsIFtsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wcm9sX2RfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHJvbGQyNTZfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldICwgW2xsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Byb2xfZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wcm9sZDUxMl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldICwgW2xsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX3YxNmkzMl90eSwgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Byb2xfcV8xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wcm9scTEyOF9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0gLCBbbGx2bV92Mmk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHJvbF9xXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Byb2xxMjU2X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSAsIFtsbHZtX3Y0aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wcm9sX3FfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHJvbHE1MTJfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldICwgW2xsdm1fdjhpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wcm9sdl9kXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Byb2x2ZDEyOF9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Byb2x2X2RfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHJvbHZkMjU2X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHJvbHZfZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wcm9sdmQ1MTJfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkzMl90eSwgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Byb2x2X3FfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHJvbHZxMTI4X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHJvbHZfcV8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wcm9sdnEyNTZfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV92NGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wcm9sdl9xXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Byb2x2cTUxMl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Byb3JfZF8xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wcm9yZDEyOF9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wcm9yX2RfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHJvcmQyNTZfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV92OGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHJvcl9kXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Byb3JkNTEyX21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wcm9yX3FfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHJvcnExMjhfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHJvcl9xXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Byb3JxMjU2X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Byb3JfcV81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wcm9ycTUxMl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworCit9CisKKy8vIEdhdGhlciBvcHMKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hdngyX2dhdGhlcl9kX3BkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVyZF9wZCI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdngyX2dhdGhlcl9kX3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfcGQyNTYiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3B0cl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGY2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9nYXRoZXJfcV9wZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcnFfcGQiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3B0cl90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9nYXRoZXJfcV9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXJxX3BkMjU2Ij4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLAorICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV9wdHJfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDJfZ2F0aGVyX2RfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXJkX3BzIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV9wdHJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDJfZ2F0aGVyX2RfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVyZF9wczI1NiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwKKyAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdngyX2dhdGhlcl9xX3BzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVycV9wcyI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdngyX2dhdGhlcl9xX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcnFfcHMyNTYiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3B0cl90eSwgbGx2bV92NGk2NF90eSwgbGx2bV92NGYzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdngyX2dhdGhlcl9kX3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXJkX3EiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sCisgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3B0cl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9nYXRoZXJfZF9xXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfcTI1NiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgW2xsdm1fdjRpNjRfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdngyX2dhdGhlcl9xX3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXJxX3EiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sCisgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3B0cl90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9nYXRoZXJfcV9xXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcnFfcTI1NiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgW2xsdm1fdjRpNjRfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdngyX2dhdGhlcl9kX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXJkX2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3B0cl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9nYXRoZXJfZF9kXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcmRfZDI1NiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwKKyAgICAgICAgW2xsdm1fdjhpMzJfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdngyX2dhdGhlcl9xX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXJxX2QiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3B0cl90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4Ml9nYXRoZXJfcV9kXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcnFfZDI1NiI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworfQorCisvLyBNaXNjLgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eDJfcG1vdm1za2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92bXNrYjI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjMyaThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDJfcHNodWZfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzaHVmYjI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaThfdHldLCBbbGx2bV92MzJpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmk4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdngyX21wc2FkYncgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tcHNhZGJ3MjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MzJpOF90eSwgbGx2bV92MzJpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEZNQTMgYW5kIEZNQTQKKworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2ZtYV92Zm1hZGRfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRzczMiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfZm1hX3ZmbWFkZF9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkMyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWE0X3ZmbWFkZF9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYTRfdmZtYWRkX3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkc2QiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfZm1hX3ZmbWFkZF9wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm1hZGRfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRwZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWFfdmZtYWRkX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm1hZGRfcGRfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkcGQyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9mbWFfdmZtc3ViX3NzIDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm1zdWJfc2QgOiAvLyBUT0RPOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfZm1hX3ZmbXN1Yl9wcyA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWFfdmZtc3ViX3BkIDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm1zdWJfcHNfMjU2IDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm1zdWJfcGRfMjU2IDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm5tYWRkX3NzIDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm5tYWRkX3NkIDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm5tYWRkX3BzIDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm5tYWRkX3BkIDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm5tYWRkX3BzXzI1NiA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWFfdmZubWFkZF9wZF8yNTYgOiAvLyBUT0RPOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfZm1hX3Zmbm1zdWJfc3MgOiAvLyBUT0RPOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfZm1hX3Zmbm1zdWJfc2QgOiAvLyBUT0RPOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfZm1hX3Zmbm1zdWJfcHMgOiAvLyBUT0RPOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfZm1hX3Zmbm1zdWJfcGQgOiAvLyBUT0RPOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfZm1hX3Zmbm1zdWJfcHNfMjU2IDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm5tc3ViX3BkXzI1NiA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWFfdmZtYWRkc3ViX3BzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfZm1hX3ZmbWFkZHN1Yl9wZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm1hZGRzdWJfcHNfMjU2IDoKKyAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm1hZGRzdWJfcGRfMjU2IDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfZm1hX3ZmbXN1YmFkZF9wcyA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9mbWFfdmZtc3ViYWRkX3BkIDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm1zdWJhZGRfcHNfMjU2IDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2ZtYV92Zm1zdWJhZGRfcGRfMjU2IDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmZtYWRkX3BkXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZtYWRkX3BkXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDEyOF9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZF9wZF8xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkcGQxMjhfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZmbWFkZF9wZF8yNTYgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkcGQyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9wZF8yNTYgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkcGQyNTZfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92Zm1hZGRfcGRfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkMjU2X21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Zm1hZGRfcGRfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCAgbGx2bV9pOF90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZtYWRkX3BkXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRwZDUxMl9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksICBsbHZtX2k4X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92Zm1hZGRfcGRfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBkNTEyX21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwgIGxsdm1faThfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmZtYWRkX3BzXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRwczEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZtYWRkX3BzXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRwczEyOF9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZF9wc18xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkcHMxMjhfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZmbWFkZF9wc18yNTYgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkcHMyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9wc18yNTYgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkcHMyNTZfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92Zm1hZGRfcHNfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzMjU2X21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Zm1hZGRfcHNfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwgIGxsdm1faTE2X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm1hZGRfcHNfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHBzNTEyX21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksICBsbHZtX2kxNl90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdmZtYWRkX3BzXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRwczUxMl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCAgbGx2bV9pMTZfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmZtYWRkc3ViX3BkXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZtYWRkc3ViX3BkXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDEyOF9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZHN1Yl9wZF8xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQxMjhfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZmbWFkZHN1Yl9wZF8yNTYgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbWFkZHN1Yl9wZF8yNTYgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkc3VicGQyNTZfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92Zm1hZGRzdWJfcGRfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkMjU2X21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Zm1hZGRzdWJfcGRfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCAgbGx2bV9pOF90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZtYWRkc3ViX3BkXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwZDUxMl9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksICBsbHZtX2k4X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92Zm1hZGRzdWJfcGRfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBkNTEyX21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwgIGxsdm1faThfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmZtYWRkc3ViX3BzXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZtYWRkc3ViX3BzXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczEyOF9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZmbWFkZHN1Yl9wc18xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMxMjhfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZmbWFkZHN1Yl9wc18yNTYgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbWFkZHN1Yl9wc18yNTYgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkc3VicHMyNTZfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92Zm1hZGRzdWJfcHNfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzMjU2X21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Zm1hZGRzdWJfcHNfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwgIGxsdm1faTE2X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm1hZGRzdWJfcHNfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHN1YnBzNTEyX21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksICBsbHZtX2kxNl90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdmZtYWRkc3ViX3BzXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRzdWJwczUxMl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCAgbGx2bV9pMTZfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Zm1hZGRfc2QgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkc2QzX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCAgbGx2bV9pOF90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Zm1hZGRfc3MgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkc3MzX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdmZtYWRkX3NkIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNkM19tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksICBsbHZtX2k4X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92Zm1hZGRfc3MgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtYWRkc3MzX21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgIGxsdm1faThfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbWFkZF9zZCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1hZGRzZDNfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCAgbGx2bV9pOF90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZtYWRkX3NzIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbWFkZHNzM19tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksICBsbHZtX2k4X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfc2QgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtc3Vic2QzX21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgIGxsdm1faThfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbXN1Yl9zcyA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1zdWJzczNfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZtc3ViX3BkXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1zdWJwZDEyOF9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbXN1Yl9wZF8yNTYgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtc3VicGQyNTZfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfcGRfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbXN1YnBkNTEyX21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwgIGxsdm1faThfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbXN1Yl9wc18xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtc3VicHMxMjhfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm1zdWJfcHNfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbXN1YnBzMjU2X21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZtc3ViX3BzXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1zdWJwczUxMl9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCAgbGx2bV9pMTZfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbXN1YmFkZF9wZF8xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtc3ViYWRkcGQxMjhfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm1zdWJhZGRfcGRfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbXN1YmFkZHBkMjU2X21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZtc3ViYWRkX3BkXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1zdWJhZGRwZDUxMl9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksICBsbHZtX2k4X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm1zdWJhZGRfcHNfMTI4IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmbXN1YmFkZHBzMTI4X21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZtc3ViYWRkX3BzXzI1NiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm1zdWJhZGRwczI1Nl9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3ZmbXN1YmFkZF9wc181MTIgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZtc3ViYWRkcHM1MTJfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwgIGxsdm1faTE2X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zmbm1hZGRfcGRfMTI4IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zmbm1hZGRwZDEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Zm5tYWRkX3BkXzI1NiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm5tYWRkcGQyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmZubWFkZF9wZF81MTIgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZubWFkZHBkNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCAgbGx2bV9pOF90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Zm5tYWRkX3BzXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm5tYWRkcHMxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmZubWFkZF9wc18yNTYgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZubWFkZHBzMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zmbm1hZGRfcHNfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zmbm1hZGRwczUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksICBsbHZtX2kxNl90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZubXN1Yl9zZCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm5tc3Vic2QzX21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgIGxsdm1faThfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3Zmbm1zdWJfc3MgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZubXN1YnNzM19tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksICBsbHZtX2k4X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zmbm1zdWJfcGRfMTI4IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwZDEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZubXN1Yl9wZF8xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZubXN1YnBkMTI4X21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Zm5tc3ViX3BkXzI1NiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm5tc3VicGQyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3Zmbm1zdWJfcGRfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwZDI1Nl9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmZubXN1Yl9wZF81MTIgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZubXN1YnBkNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCAgbGx2bV9pOF90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZubXN1Yl9wZF81MTIgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZubXN1YnBkNTEyX21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwgIGxsdm1faThfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmZubXN1Yl9wc18xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZubXN1YnBzMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrM192Zm5tc3ViX3BzXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm5tc3VicHMxMjhfbWFzazMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zmbm1zdWJfcHNfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwczI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFzazNfdmZubXN1Yl9wc18yNTYgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZubXN1YnBzMjU2X21hc2szIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Zm5tc3ViX3BzXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Zm5tc3VicHM1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCAgbGx2bV9pMTZfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2szX3Zmbm1zdWJfcHNfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zmbm1zdWJwczUxMl9tYXNrMyI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCAgbGx2bV9pMTZfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBtYWRkNTJoX3VxXzEyOCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUyaHVxMTI4X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwbWFkZDUyaF91cV8xMjggOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmh1cTEyOF9tYXNreiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cG1hZGQ1MmxfdXFfMTI4IDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBtYWRkNTJsdXExMjhfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBtYWRkNTJsX3VxXzEyOCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUybHVxMTI4X21hc2t6Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwbWFkZDUyaF91cV8yNTYgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmh1cTI1Nl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cG1hZGQ1MmhfdXFfMjU2IDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBtYWRkNTJodXEyNTZfbWFza3oiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjRpNjRfdHksIGxsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBtYWRkNTJsX3VxXzI1NiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUybHVxMjU2X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjRpNjRfdHksIGxsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwbWFkZDUybF91cV8yNTYgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmx1cTI1Nl9tYXNreiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cG1hZGQ1MmhfdXFfNTEyIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBtYWRkNTJodXE1MTJfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBtYWRkNTJoX3VxXzUxMiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwbWFkZDUyaHVxNTEyX21hc2t6Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwbWFkZDUybF91cV81MTIgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG1hZGQ1Mmx1cTUxMl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cG1hZGQ1MmxfdXFfNTEyIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBtYWRkNTJsdXE1MTJfbWFza3oiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy8gVk5OSQorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZHBidXNkXzEyOCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkMTI4X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZHBidXNkXzEyOCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkMTI4X21hc2t6Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZHBidXNkXzI1NiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkMjU2X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZHBidXNkXzI1NiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkMjU2X21hc2t6Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZHBidXNkXzUxMiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkNTEyX21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBkcGJ1c2RfNTEyIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBkcGJ1c2Q1MTJfbWFza3oiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZHBidXNkc18xMjggOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGRwYnVzZHMxMjhfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBkcGJ1c2RzXzEyOCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkczEyOF9tYXNreiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGRwYnVzZHNfMjU2IDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBkcGJ1c2RzMjU2X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZHBidXNkc18yNTYgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGRwYnVzZHMyNTZfbWFza3oiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBkcGJ1c2RzXzUxMiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZHBidXNkczUxMl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZHBidXNkc181MTIgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGRwYnVzZHM1MTJfbWFza3oiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZHB3c3NkXzEyOCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkMTI4X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZHB3c3NkXzEyOCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkMTI4X21hc2t6Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZHB3c3NkXzI1NiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkMjU2X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZHB3c3NkXzI1NiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkMjU2X21hc2t6Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZHB3c3NkXzUxMiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkNTEyX21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBkcHdzc2RfNTEyIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBkcHdzc2Q1MTJfbWFza3oiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZwZHB3c3Nkc18xMjggOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGRwd3NzZHMxMjhfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBkcHdzc2RzXzEyOCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkczEyOF9tYXNreiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cGRwd3NzZHNfMjU2IDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBkcHdzc2RzMjU2X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZHB3c3Nkc18yNTYgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGRwd3NzZHMyNTZfbWFza3oiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBkcHdzc2RzXzUxMiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZHB3c3NkczUxMl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3ZwZHB3c3Nkc181MTIgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGRwd3NzZHM1MTJfbWFza3oiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gWE9QCisKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl94b3BfdnBlcm1pbDJwZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtaWwycGQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl94b3BfdnBlcm1pbDJwZF8yNTYgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWlsMnBkMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfeG9wX3ZwZXJtaWwycHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGVybWlsMnBzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cGVybWlsMnBzXzI1NiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwZXJtaWwycHMyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl94b3BfdmZyY3pfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92ZnJjenBkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdmZyY3pfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92ZnJjenBzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdmZyY3pfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92ZnJjenNkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdmZyY3pfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92ZnJjenNzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdmZyY3pfcGRfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmZyY3pwZDI1NiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZmcmN6X3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZmcmN6cHMyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfeG9wX3ZwY29tYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwY29tYiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBjb213IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBjb213Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cGNvbWQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGNvbWQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwY29tcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwY29tcSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBjb211YiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwY29tdWIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwY29tdXcgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGNvbXV3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cGNvbXVkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBjb211ZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBjb211cSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwY29tdXEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl94b3BfdnBoYWRkYmQgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGhhZGRiZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwaGFkZGJxIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBoYWRkYnEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjE2aThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cGhhZGRidyA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwaGFkZGJ3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3YxNmk4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBoYWRkZHEgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGhhZGRkcSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwaGFkZHViZCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwaGFkZHViZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwaGFkZHVicSA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwaGFkZHVicSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwaGFkZHVidyA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwaGFkZHVidyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwaGFkZHVkcSA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwaGFkZHVkcSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwaGFkZHV3ZCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwaGFkZHV3ZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwaGFkZHV3cSA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwaGFkZHV3cSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92OGkxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwaGFkZHdkIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBoYWRkd2QiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjhpMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cGhhZGR3cSA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwaGFkZHdxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBoc3ViYncgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGhzdWJidyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92MTZpOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwaHN1YmRxIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBoc3ViZHEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cGhzdWJ3ZCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwaHN1YndkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBtYWNzZGQgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG1hY3NkZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwbWFjc2RxaCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwbWFjc2RxaCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwbWFjc2RxbCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwbWFjc2RxbCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwbWFjc3NkZCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwbWFjc3NkZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwbWFjc3NkcWggOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG1hY3NzZHFoIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBtYWNzc2RxbCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwbWFjc3NkcWwiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cG1hY3Nzd2QgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG1hY3Nzd2QiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cG1hY3Nzd3cgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG1hY3Nzd3ciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cG1hY3N3ZCA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwbWFjc3dkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBtYWNzd3cgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG1hY3N3dyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfeG9wX3ZwbWFkY3Nzd2QgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cG1hZGNzc3dkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBtYWRjc3dkIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBtYWRjc3dkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBwZXJtIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBwZXJtIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfeG9wX3Zwcm90YiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwcm90YiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cHJvdGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHJvdGQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnByb3RxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnByb3RxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3Zwcm90dyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwcm90dyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cHJvdGJpIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnByb3RiaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cHJvdGRpIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnByb3RkaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cHJvdHFpIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnByb3RxaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cHJvdHdpIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnByb3R3aSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfeG9wX3Zwc2hhYiA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hhYiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cHNoYWQgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNoYWQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBzaGFxIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGFxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3Zwc2hhdyA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hhdyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cHNobGIgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobGIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl94b3BfdnBzaGxkIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfeG9wX3Zwc2hscSA6CisgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hscSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3hvcF92cHNobHcgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobHciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTFdQCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfbGx3cGNiIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbGx3cGNiIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl9zbHdwY2IgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zbHdwY2IiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3B0cl90eV0sIFtdLCBbXT47CisgIGRlZiBpbnRfeDg2X2x3cGluczMyIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbHdwaW5zMzIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k4X3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X2x3cGluczY0IDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbHdwaW5zNjQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k4X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X2x3cHZhbDMyIDoKKyAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbHdwdmFsMzIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfbHdwdmFsNjQgOgorICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9sd3B2YWw2NCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTU1YCisKKy8vIEVtcHR5IE1NWCBzdGF0ZSBvcC4KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9tbXhfZW1tcyAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9lbW1zIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW10sIFtdPjsKKyAgZGVmIGludF94ODZfbW14X2ZlbW1zIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZmVtbXMiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbXSwgW10+OworfQorCisvLyBJbnRlZ2VyIGFyaXRobWV0aWMgb3BzLgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIC8vIEFkZGl0aW9uCisgIGRlZiBpbnRfeDg2X21teF9wYWRkX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWRkYiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9tbXhfcGFkZF93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFkZHciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfbW14X3BhZGRfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhZGRkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X21teF9wYWRkX3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWRkcSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisgIGRlZiBpbnRfeDg2X21teF9wYWRkc19iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFkZHNiIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9tbXhfcGFkZHNfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhZGRzdyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworICBkZWYgaW50X3g4Nl9tbXhfcGFkZHVzX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWRkdXNiIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9tbXhfcGFkZHVzX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWRkdXN3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworCisgIC8vIFN1YnRyYWN0aW9uCisgIGRlZiBpbnRfeDg2X21teF9wc3ViX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3ViYiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X21teF9wc3ViX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3VidyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X21teF9wc3ViX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3ViZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X21teF9wc3ViX3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3VicSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfbW14X3BzdWJzX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3Vic2IiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfbW14X3BzdWJzX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3Vic3ciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9tbXhfcHN1YnVzX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3VidXNiIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X21teF9wc3VidXNfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzdWJ1c3ciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKworICAvLyBNdWx0aXBsaWNhdGlvbgorICBkZWYgaW50X3g4Nl9tbXhfcG11bGhfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtdWxodyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfbW14X3BtdWxsX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsbHciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X21teF9wbXVsaHVfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtdWxodXciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X21teF9wbXVsdV9kcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtdWx1ZHEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X21teF9wbWFkZF93ZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtYWRkd2QiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisKKyAgLy8gQml0d2lzZSBvcGVyYXRpb25zCisgIGRlZiBpbnRfeDg2X21teF9wYW5kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFuZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9tbXhfcGFuZG4gOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYW5kbiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X21teF9wb3IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wb3IiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfbW14X3B4b3IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9weG9yIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisKKyAgLy8gQXZlcmFnZXMKKyAgZGVmIGludF94ODZfbW14X3BhdmdfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhdmdiIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtLCBDb21tdXRhdGl2ZV0+OworICBkZWYgaW50X3g4Nl9tbXhfcGF2Z193IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGF2Z3ciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisKKyAgLy8gTWF4aW11bQorICBkZWYgaW50X3g4Nl9tbXhfcG1heHVfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtYXh1YiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfbW14X3BtYXhzX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbWF4c3ciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisKKyAgLy8gTWluaW11bQorICBkZWYgaW50X3g4Nl9tbXhfcG1pbnVfYiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtaW51YiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfbW14X3BtaW5zX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbWluc3ciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisKKyAgLy8gUGFja2VkIHN1bSBvZiBhYnNvbHV0ZSBkaWZmZXJlbmNlcworICBkZWYgaW50X3g4Nl9tbXhfcHNhZF9idyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzYWRidyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKK30KKworLy8gSW50ZWdlciBzaGlmdCBvcHMuCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgLy8gU2hpZnQgbGVmdCBsb2dpY2FsCisgIGRlZiBpbnRfeDg2X21teF9wc2xsX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xsdyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9tbXhfcHNsbF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNsbGQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfbW14X3BzbGxfcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzbGxxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfbW14X3BzcmxfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Bzcmx3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X21teF9wc3JsX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3JsZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9tbXhfcHNybF9xIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNybHEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9tbXhfcHNyYV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfbW14X3BzcmFfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmFkIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfbW14X3BzbGxpX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xsd2kiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfbW14X3BzbGxpX2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xsZGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfbW14X3BzbGxpX3EgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2xscWkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9tbXhfcHNybGlfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Bzcmx3aSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9tbXhfcHNybGlfZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmxkaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9tbXhfcHNybGlfcSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzcmxxaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X21teF9wc3JhaV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYXdpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X21teF9wc3JhaV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHNyYWRpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47Cit9CisvLyBQZXJtdXRlCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9kZl8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZXJtdmFyZGYyNTZfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1faThfdHldLCAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wZXJtdmFyX2RmXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Blcm12YXJkZjUxMl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sIFtsbHZtX3Y4ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGk2NF90eSwgbGx2bV92OGY2NF90eSwgbGx2bV9pOF90eV0sICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfZGlfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGVybXZhcmRpMjU2X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9kaV81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZXJtdmFyZGk1MTJfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLCAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wZXJtdmFyX2hpXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Blcm12YXJoaTEyOF9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfaGlfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGVybXZhcmhpMjU2X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTE2X3R5LCBsbHZtX3YxNmkxNl90eSwgbGx2bV9pMTZfdHldLCAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wZXJtdmFyX2hpXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Blcm12YXJoaTUxMl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpMTZfdHldLCBbbGx2bV92MzJpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmkxNl90eSwgbGx2bV92MzJpMTZfdHksIGxsdm1faTMyX3R5XSwgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9xaV8xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZXJtdmFycWkxMjhfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faTE2X3R5XSwgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9xaV8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZXJtdmFycWkyNTZfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaThfdHldLCBbbGx2bV92MzJpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjMyaThfdHksIGxsdm1fdjMyaThfdHksIGxsdm1faTMyX3R5XSwgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9xaV81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZXJtdmFycWk1MTJfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjY0aThfdHldLCBbbGx2bV92NjRpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjY0aThfdHksIGxsdm1fdjY0aThfdHksIGxsdm1faTY0X3R5XSwgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9zZl8yNTYgOiAvLyBUT0RPOiBSZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCBsbHZtX2k4X3R5XSwgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcGVybXZhcl9zZl81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZXJtdmFyc2Y1MTJfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwgW2xsdm1fdjE2ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2ZjMyX3R5LCBsbHZtX2kxNl90eV0sICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfc2lfMjU2IDogLy8gVE9ETzogUmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Blcm12YXJfc2lfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGVybXZhcnNpNTEyX21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkzMl90eSwgbGx2bV9pMTZfdHldLCAgW0ludHJOb01lbV0+OworfQorLy8gUGFjayBvcHMuCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfbW14X3BhY2tzc3diIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFja3Nzd2IiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfbW14X3BhY2tzc2R3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFja3NzZHciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfbW14X3BhY2t1c3diIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFja3Vzd2IiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy8gVW5wYWNraW5nIG9wcy4KK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9tbXhfcHVucGNraGJ3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHVucGNraGJ3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfbW14X3B1bnBja2h3ZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3B1bnBja2h3ZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X21teF9wdW5wY2toZHEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wdW5wY2toZHEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9tbXhfcHVucGNrbGJ3IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHVucGNrbGJ3Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfbW14X3B1bnBja2x3ZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3B1bnBja2x3ZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X21teF9wdW5wY2tsZHEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wdW5wY2tsZHEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwgbGx2bV94ODZtbXhfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworfQorCisvLyBJbnRlZ2VyIGNvbXBhcmlzb24gb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfbW14X3BjbXBlcV9iIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGVxYiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfbW14X3BjbXBlcV93IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGVxdyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfbW14X3BjbXBlcV9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGVxZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKworICBkZWYgaW50X3g4Nl9tbXhfcGNtcGd0X2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wY21wZ3RiIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV94ODZtbXhfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X21teF9wY21wZ3RfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BjbXBndHciPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfbW14X3BjbXBndF9kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGNtcGd0ZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1feDg2bW14X3R5XSwgW2xsdm1feDg2bW14X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1feDg2bW14X3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLyBNaXNjLgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X21teF9tYXNrbW92cSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21hc2ttb3ZxIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX3g4Nm1teF90eSwgbGx2bV9wdHJfdHldLCBbXT47CisKKyAgZGVmIGludF94ODZfbW14X3Btb3Ztc2tiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdm1za2IiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3g4Nm1teF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9tbXhfbW92bnRfZHEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tb3ZudHEiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJ4ODZtbXhfdHksIGxsdm1feDg2bW14X3R5XSwgW10+OworCisgIGRlZiBpbnRfeDg2X21teF9wYWxpZ25yX2IgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWxpZ25yIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV94ODZtbXhfdHldLCBbbGx2bV94ODZtbXhfdHksCisgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3g4Nm1teF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9tbXhfcGV4dHJfdyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZlY19leHRfdjRoaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1feDg2bW14X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfbW14X3BpbnNyX3cgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92ZWNfc2V0X3Y0aGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3g4Nm1teF90eV0sIFtsbHZtX3g4Nm1teF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEJNSQorCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYm1pX2JleHRyXzMyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYmV4dHJfdTMyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9ibWlfYmV4dHJfNjQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9iZXh0cl91NjQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2JtaV9iemhpXzMyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYnpoaV9zaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYm1pX2J6aGlfNjQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9iemhpX2RpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9ibWlfcGRlcF8zMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BkZXBfc2kiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2JtaV9wZGVwXzY0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGRlcF9kaSI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW2xsdm1faTY0X3R5LCBsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYm1pX3BleHRfMzIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wZXh0X3NpIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9ibWlfcGV4dF82NCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BleHRfZGkiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGUy9HUyBCYXNlCisKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9yZGZzYmFzZV8zMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JkZnNiYXNlMzIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfcmRnc2Jhc2VfMzIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yZGdzYmFzZTMyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X3JkZnNiYXNlXzY0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmRmc2Jhc2U2NCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTY0X3R5XSwgW10+OworICBkZWYgaW50X3g4Nl9yZGdzYmFzZV82NCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JkZ3NiYXNlNjQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfd3Jmc2Jhc2VfMzIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl93cmZzYmFzZTMyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTMyX3R5XT47CisgIGRlZiBpbnRfeDg2X3dyZ3NiYXNlXzMyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfd3Jnc2Jhc2UzMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kzMl90eV0+OworICBkZWYgaW50X3g4Nl93cmZzYmFzZV82NCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3dyZnNiYXNlNjQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pNjRfdHldPjsKKyAgZGVmIGludF94ODZfd3Jnc2Jhc2VfNjQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl93cmdzYmFzZTY0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faTY0X3R5XT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGWFNSCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfZnhyc3RvciA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Z4cnN0b3IiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X2Z4cnN0b3I2NCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Z4cnN0b3I2NCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfZnhzYXZlIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZnhzYXZlIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl9meHNhdmU2NCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Z4c2F2ZTY0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW10+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gWFNBVkUKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl94c2F2ZSA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X3hzYXZlNjQgOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl94cnN0b3IgOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl94cnN0b3I2NCA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X3hzYXZlb3B0IDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfeHNhdmVvcHQ2NCA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X3hyc3RvcnMgOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl94cnN0b3JzNjQgOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl94c2F2ZWMgOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW10+OworICBkZWYgaW50X3g4Nl94c2F2ZWM2NCA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X3hzYXZlcyA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXT47CisgIGRlZiBpbnRfeDg2X3hzYXZlczY0IDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfeGdldGJ2IDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2kzMl90eV0sIFtdPjsKKyAgZGVmIGludF94ODZfeHNldGJ2IDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtdPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENMRkxVU0hPUFQgYW5kIENMV0IKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9jbGZsdXNob3B0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY2xmbHVzaG9wdCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtdPjsKKworICBkZWYgaW50X3g4Nl9jbHdiIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY2x3YiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eV0sIFtdPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFN1cHBvcnQgcHJvdGVjdGlvbiBrZXkKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9yZHBrcnUgOiBHQ0NCdWlsdGluIDwiX19idWlsdGluX2lhMzJfcmRwa3J1Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW10+OworICBkZWYgaW50X3g4Nl93cnBrcnUgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl93cnBrcnUiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pMzJfdHldLCBbXT47Cit9CisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSGFsZiBmbG9hdCBjb252ZXJzaW9uCisKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl92Y3Z0cGgycHNfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmN2dHBoMnBzIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl92Y3Z0cGgycHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmN2dHBoMnBzMjU2Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4aTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl92Y3Z0cHMycGhfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmN2dHBzMnBoIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3ZjdnRwczJwaF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Y3Z0cHMycGgyNTYiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhmMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmN2dHBoMnBzXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZjdnRwaDJwczUxMl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV92MTZpMTZfdHksIGxsdm1fdjE2ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdmN2dHBoMnBzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZjdnRwaDJwczI1Nl9tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZjdnRwaDJwc18xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Y3Z0cGgycHNfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Y3Z0cHMycGhfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmN2dHBzMnBoNTEyX21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmYzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMTZfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192Y3Z0cHMycGhfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmN2dHBzMnBoMjU2X21hc2siPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhmMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3ZjdnRwczJwaF8xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Y3Z0cHMycGhfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRCTQorCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfdGJtX2JleHRyaV91MzIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9iZXh0cmlfdTMyIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl90Ym1fYmV4dHJpX3U2NCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2JleHRyaV91NjQiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX2k2NF90eSwgbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBSRFJBTkQgaW50cmluc2ljcyAtIFJldHVybiBhIHJhbmRvbSB2YWx1ZSBhbmQgd2hldGhlciBpdCBpcyB2YWxpZC4KKy8vIFJEU0VFRCBpbnRyaW5zaWNzIC0gUmV0dXJuIGEgTklTVCBTUDgwMC05MEIgJiBDIGNvbXBsaWFudCByYW5kb20gdmFsdWUgYW5kCisvLyB3aGV0aGVyIGl0IGlzIHZhbGlkLgorCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgLy8gVGhlc2UgYXJlIGRlY2xhcmVkIHNpZGUtZWZmZWN0aW5nIHNvIHRoZXkgZG9uJ3QgZ2V0IGVsaW1pbmF0ZWQgYnkgQ1NFIG9yCisgIC8vIExJQ00uCisgIGRlZiBpbnRfeDg2X3JkcmFuZF8xNiA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTMyX3R5XSwgW10sIFtdPjsKKyAgZGVmIGludF94ODZfcmRyYW5kXzMyIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwgW10+OworICBkZWYgaW50X3g4Nl9yZHJhbmRfNjQgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLCBbXT47CisgIGRlZiBpbnRfeDg2X3Jkc2VlZF8xNiA6IEludHJpbnNpYzxbbGx2bV9pMTZfdHksIGxsdm1faTMyX3R5XSwgW10sIFtdPjsKKyAgZGVmIGludF94ODZfcmRzZWVkXzMyIDogSW50cmluc2ljPFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbXSwgW10+OworICBkZWYgaW50X3g4Nl9yZHNlZWRfNjQgOiBJbnRyaW5zaWM8W2xsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtdLCBbXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBRFgKKworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2FkZGNhcnJ5eF91MzI6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2FkZGNhcnJ5eF91MzIiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2k4X3R5XSwgW2xsdm1faThfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fcHRyX3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2FkZGNhcnJ5eF91NjQ6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2FkZGNhcnJ5eF91NjQiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX2k4X3R5XSwgW2xsdm1faThfdHksIGxsdm1faTY0X3R5LCBsbHZtX2k2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fcHRyX3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2FkZGNhcnJ5X3UzMjogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYWRkY2FycnlfdTMyIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV9pOF90eV0sIFtsbHZtX2k4X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3B0cl90eV0sIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hZGRjYXJyeV91NjQ6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2FkZGNhcnJ5X3U2NCI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faThfdHldLCBbbGx2bV9pOF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9wdHJfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfc3ViYm9ycm93X3UzMjogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc3ViYm9ycm93X3UzMiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faThfdHldLCBbbGx2bV9pOF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9wdHJfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfc3ViYm9ycm93X3U2NDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc3ViYm9ycm93X3U2NCI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1faThfdHldLCBbbGx2bV9pOF90eSwgbGx2bV9pNjRfdHksIGxsdm1faTY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9wdHJfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFJUTSBpbnRyaW5zaWNzLiBUcmFuc2FjdGlvbmFsIE1lbW9yeSBzdXBwb3J0LgorCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfeGJlZ2luIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfeGJlZ2luIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW10+OworICBkZWYgaW50X3g4Nl94ZW5kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfeGVuZCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtdLCBbXT47CisgIGRlZiBpbnRfeDg2X3hhYm9ydCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3hhYm9ydCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2k4X3R5XSwgW10+OworICBkZWYgaW50X3g4Nl94dGVzdCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3h0ZXN0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbXSwgW10+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQVZYNTEyCisKKy8vIENvbnZlcnNpb24gb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKyAgZGVmIGludF94ODZfYXZ4NTEyX2N2dHRzczJzaSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZjdnR0c3Myc2kzMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfY3Z0dHNzMnNpNjQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Y3Z0dHNzMnNpNjQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX2N2dHRzczJ1c2kgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Y3Z0dHNzMnVzaTMyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9jdnR0c3MydXNpNjQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Y3Z0dHNzMnVzaTY0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9jdnR1c2kyc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR1c2kyc3MzMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9jdnR1c2k2NDJzcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHVzaTJzczY0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX2N2dHRzZDJzaSA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZjdnR0c2Qyc2kzMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfY3Z0dHNkMnNpNjQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Y3Z0dHNkMnNpNjQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX2N2dHRzZDJ1c2kgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Y3Z0dHNkMnVzaTMyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9jdnR0c2QydXNpNjQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Y3Z0dHNkMnVzaTY0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9jdnR1c2kyc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR1c2kyc2QzMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX2N2dHVzaTY0MnNkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dXNpMnNkNjQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfdmN2dHNzMnVzaTMyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmN2dHNzMnVzaTMyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl92Y3Z0c3MydXNpNjQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92Y3Z0c3MydXNpNjQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3ZjdnRzczJzaTMyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmN2dHNzMnNpMzIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3ZjdnRzczJzaTY0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmN2dHNzMnNpNjQiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2k2NF90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3ZjdnRzZDJ1c2kzMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZjdnRzZDJ1c2kzMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfdmN2dHNkMnVzaTY0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmN2dHNkMnVzaTY0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl92Y3Z0c2Qyc2kzMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZjdnRzZDJzaTMyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl92Y3Z0c2Qyc2k2NCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZjdnRzZDJzaTY0Ij4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9jdnRzaTJzczMyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0c2kyc3MzMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9jdnRzaTJzczY0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0c2kyc3M2NCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9jdnRzaTJzZDY0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0c2kyc2Q2NCI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIFBhY2sgb3BzLgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wYWNrc3N3Yl81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWNrc3N3YjUxMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjY0aThfdHldLCBbbGx2bV92MzJpMTZfdHksbGx2bV92MzJpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcGFja3NzZHdfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFja3NzZHc1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BhY2t1c3diXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhY2t1c3diNTEyIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NjRpOF90eV0sIFtsbHZtX3YzMmkxNl90eSxsbHZtX3YzMmkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcGFja3VzZHdfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFja3VzZHc1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKK30KKworLy8gVmVjdG9yIGNvbnZlcnQKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRkcTJwc18xMjggOiAvLyBUT0RPOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dGRxMnBzXzI1NiA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhmMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0ZHEycHNfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0ZHEycHM1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZmMzJfdHksICBsbHZtX2kxNl90eSwgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cGQyZHFfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cGQyZHExMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjRpMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cGQyZHFfMjU2IDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGkzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwZDJkcV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwZDJkcTUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGY2NF90eSwgbGx2bV92OGkzMl90eSwgIGxsdm1faThfdHksICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHBkMnBzXzI1NiA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cGQycHNfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cGQycHM1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmMzJfdHksICBsbHZtX2k4X3R5LCAgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRzZDJzc19yb3VuZCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHNkMnNzX3JvdW5kX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHNzMnNkX3JvdW5kIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0c3Myc2Rfcm91bmRfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cGQycHMgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwZDJwc19tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92NGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwZDJxcV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwZDJxcTEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92Mmk2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwZDJxcV8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwZDJxcTI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGk2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwZDJxcV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwZDJxcTUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92OGY2NF90eSwgbGx2bV92OGk2NF90eSwgIGxsdm1faThfdHksICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHBkMnVkcV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwZDJ1ZHExMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjRpMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cGQydWRxXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBkMnVkcTI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGkzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwZDJ1ZHFfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cGQydWRxNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4aTMyX3R5LCAgbGx2bV9pOF90eSwgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cGQydXFxXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBkMnVxcTEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92Mmk2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwZDJ1cXFfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cGQydXFxMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0aTY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHBkMnVxcV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwZDJ1cXE1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhpNjRfdHksICBsbHZtX2k4X3R5LCAgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwczJkcV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwczJkcTEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGkzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwczJkcV8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwczJkcTI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGkzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwczJkcV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwczJkcTUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmkzMl90eSwgIGxsdm1faTE2X3R5LCAgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwczJwZF8xMjggOiAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92MmY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwczJwZF8yNTYgOiAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwczJwZF81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwczJwZDUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGY2NF90eSwgIGxsdm1faThfdHksICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHBzMnFxXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBzMnFxMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3YyaTY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHBzMnFxXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBzMnFxMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0aTY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHBzMnFxXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBzMnFxNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4aTY0X3R5LCAgbGx2bV9pOF90eSwgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cHMydWRxXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBzMnVkcTEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGkzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwczJ1ZHFfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cHMydWRxMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4aTMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHBzMnVkcV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwczJ1ZHE1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZpMzJfdHksICBsbHZtX2kxNl90eSwgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0cHMydXFxXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHBzMnVxcTEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92Mmk2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRwczJ1cXFfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0cHMydXFxMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0aTY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHBzMnVxcV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRwczJ1cXE1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhpNjRfdHksICBsbHZtX2k4X3R5LCAgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRxcTJwZF8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRxcTJwZDEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92MmY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRxcTJwZF8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRxcTJwZDI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92NGY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnRxcTJwZF81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnRxcTJwZDUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92OGk2NF90eSwgbGx2bV92OGY2NF90eSwgIGxsdm1faThfdHksICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHFxMnBzXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHFxMnBzMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHFxMnBzXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHFxMnBzMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHFxMnBzXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHFxMnBzNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4ZjMyX3R5LCAgbGx2bV9pOF90eSwgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMmRxXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRwZDJkcTEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92NGkzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnR0cGQyZHFfMjU2IDogLy8gVE9ETzogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGkzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnR0cGQyZHFfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHBkMmRxNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4aTMyX3R5LCAgbGx2bV9pOF90eSwgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMnFxXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRwZDJxcTEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92Mmk2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnR0cGQycXFfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHBkMnFxMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0aTY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJxcV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cGQycXE1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhpNjRfdHksICBsbHZtX2k4X3R5LCAgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnR0cGQydWRxXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRwZDJ1ZHExMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjRpMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMnVkcV8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cGQydWRxMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0aTMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJ1ZHFfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHBkMnVkcTUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGY2NF90eSwgbGx2bV92OGkzMl90eSwgIGxsdm1faThfdHksICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHRwZDJ1cXFfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHBkMnVxcTEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92Mmk2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnR0cGQydXFxXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRwZDJ1cXEyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRpNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dHBkMnVxcV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cGQydXFxNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4aTY0X3R5LCAgbGx2bV9pOF90eSwgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dHBzMmRxXzEyOCA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRpMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dHBzMmRxXzI1NiA6IC8vIFRPRE86IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhpMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dHBzMmRxXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRwczJkcTUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmkzMl90eSwgIGxsdm1faTE2X3R5LCAgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnR0cHMycXFfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHBzMnFxMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3YyaTY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHRwczJxcV8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cHMycXEyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRpNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dHBzMnFxXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRwczJxcTUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV92OGk2NF90eSwgIGxsdm1faThfdHksICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHRwczJ1ZHFfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHBzMnVkcTEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92NGkzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnR0cHMydWRxXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRwczJ1ZHEyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhpMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dHBzMnVkcV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cHMydWRxNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2aTMyX3R5LCAgbGx2bV9pMTZfdHksICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHRwczJ1cXFfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dHBzMnVxcTEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV92Mmk2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnR0cHMydXFxXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHRwczJ1cXEyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRpNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dHBzMnVxcV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR0cHMydXFxNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4aTY0X3R5LCAgbGx2bV9pOF90eSwgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dWRxMnBzXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHVkcTJwczEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV92NGYzMl90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnR1ZHEycHNfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dWRxMnBzMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHVkcTJwc181MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR1ZHEycHM1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZmMzJfdHksICBsbHZtX2kxNl90eSwgIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dXFxMnBkXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHVxcTJwZDEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92MmY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnR1cXEycGRfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dXFxMnBkMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0ZjY0X3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHVxcTJwZF81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR1cXEycGQ1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjhmNjRfdHksICBsbHZtX2k4X3R5LCAgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jdnR1cXEycHNfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY3Z0dXFxMnBzMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2N2dHVxcTJwc18yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jdnR1cXEycHMyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRpNjRfdHksIGxsdm1fdjRmMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY3Z0dXFxMnBzXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2N2dHVxcTJwczUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGk2NF90eSwgbGx2bV92OGYzMl90eSwgIGxsdm1faThfdHksICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3JuZHNjYWxlX3BkXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcGRfMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHksICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19ybmRzY2FsZV9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXBkXzI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjY0X3R5LCAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcm5kc2NhbGVfcGRfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcm5kc2NhbGVwZF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92OGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcm5kc2NhbGVfcHNfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcm5kc2NhbGVwc18xMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eSwgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3JuZHNjYWxlX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JuZHNjYWxlcHNfMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhmMzJfdHksICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19ybmRzY2FsZV9wc181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXBzX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sIFtsbHZtX3YxNmYzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjE2ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcmVkdWNlX3BkXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JlZHVjZXBkMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHksICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19yZWR1Y2VfcGRfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmVkdWNlcGQyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGY2NF90eSwgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3JlZHVjZV9wZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yZWR1Y2VwZDUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92OGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcmVkdWNlX3BzXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JlZHVjZXBzMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHksICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19yZWR1Y2VfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmVkdWNlcHMyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGYzMl90eSwgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3JlZHVjZV9wc181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yZWR1Y2VwczUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV92MTZmMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3YxNmYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3g4Nl9hdng1MTJfbWFza19yYW5nZV9wZF8xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yYW5nZXBkMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eSwgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3g4Nl9hdng1MTJfbWFza19yYW5nZV9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yYW5nZXBkMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGY2NF90eSwgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CitkZWYgaW50X3g4Nl9hdng1MTJfbWFza19yYW5nZV9wZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yYW5nZXBkNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGY2NF90eSwgIGxsdm1faThfdHksICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3JhbmdlX3BzXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JhbmdlcHMxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3JhbmdlX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JhbmdlcHMyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4ZjMyX3R5LCAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKK2RlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3JhbmdlX3BzXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JhbmdlcHM1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZmMzJfdHksICBsbHZtX2kxNl90eSwgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLyBWZWN0b3IgbG9hZCB3aXRoIGJyb2FkY2FzdAorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueDg2LiIuCisgIC8vIFRPRE86IFJlbW92ZSB0aGUgYnJvYWRjYXN0IGludHJpbnNpY3Mgd2l0aCBubyBnY2MgYnVpbHRpbiBhbmQgYXV0b3VwZ3JhZGUKKyAgZGVmIGludF94ODZfYXZ4NTEyX3Zicm9hZGNhc3Rfc3NfNTEyIDoKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sIFtsbHZtX3B0cl90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfdmJyb2FkY2FzdF9zZF81MTIgOgorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV9wdHJfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKyAgIGRlZiBpbnRfeDg2X2F2eDUxMl9icm9hZGNhc3Rtd181MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdG13NTEyIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgIGRlZiBpbnRfeDg2X2F2eDUxMl9icm9hZGNhc3Rtd18yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdG13MjU2Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICAgZGVmIGludF94ODZfYXZ4NTEyX2Jyb2FkY2FzdG13XzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYnJvYWRjYXN0bXcxMjgiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgICBkZWYgaW50X3g4Nl9hdng1MTJfYnJvYWRjYXN0bWJfNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9icm9hZGNhc3RtYjUxMiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICAgZGVmIGludF94ODZfYXZ4NTEyX2Jyb2FkY2FzdG1iXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYnJvYWRjYXN0bWIyNTYiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgIGRlZiBpbnRfeDg2X2F2eDUxMl9icm9hZGNhc3RtYl8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2Jyb2FkY2FzdG1iMTI4Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1faThfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vIEFyaXRobWV0aWMgb3BzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geyAgLy8gQWxsIGludHJpbnNpY3Mgc3RhcnQgd2l0aCAibGx2bS54ODYuIi4KKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19hZGRfcHNfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfYWRkcHM1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZmMzJfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfYWRkX3BkXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2FkZHBkNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhmNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19zdWJfcHNfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc3VicHM1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZmMzJfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfc3ViX3BkXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3N1YnBkNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhmNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19tdWxfcHNfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbXVscHM1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZmMzJfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfbXVsX3BkXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX211bHBkNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhmNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19kaXZfcHNfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZGl2cHM1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZmMzJfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZGl2X3BkXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2RpdnBkNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhmNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19tYXhfcHNfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWF4cHM1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZmMzJfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfbWF4X3BkXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21heHBkNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhmNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19taW5fcHNfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWlucHM1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZmMzJfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfbWluX3BkXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX21pbnBkNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhmNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2FkZF9zc19yb3VuZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2FkZHNzX3JvdW5kX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19kaXZfc3Nfcm91bmQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9kaXZzc19yb3VuZF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfbXVsX3NzX3JvdW5kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbXVsc3Nfcm91bmRfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3N1Yl9zc19yb3VuZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3N1YnNzX3JvdW5kX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19tYXhfc3Nfcm91bmQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXhzc19yb3VuZF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfbWluX3NzX3JvdW5kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWluc3Nfcm91bmRfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2FkZF9zZF9yb3VuZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2FkZHNkX3JvdW5kX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19kaXZfc2Rfcm91bmQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9kaXZzZF9yb3VuZF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfbXVsX3NkX3JvdW5kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbXVsc2Rfcm91bmRfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3N1Yl9zZF9yb3VuZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3N1YnNkX3JvdW5kX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19tYXhfc2Rfcm91bmQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tYXhzZF9yb3VuZF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfbWluX3NkX3JvdW5kIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfbWluc2Rfcm91bmRfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcm5kc2NhbGVfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXNzX3JvdW5kX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcm5kc2NhbGVfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9ybmRzY2FsZXNkX3JvdW5kX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3JhbmdlX3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmFuZ2VzczEyOF9yb3VuZF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3JhbmdlX3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmFuZ2VzZDEyOF9yb3VuZF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19yZWR1Y2Vfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yZWR1Y2Vzc19tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3JlZHVjZV9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JlZHVjZXNkX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3NjYWxlZl9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NjYWxlZnNkX3JvdW5kX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3NjYWxlZl9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NjYWxlZnNzX3JvdW5kX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3NjYWxlZl9wZF8xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2FsZWZwZDEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3NjYWxlZl9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2FsZWZwZDI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fdjRmNjRfdHksIGxsdm1fdjRmNjRfdHksCisgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmNjRfdHksIGxsdm1faThfdHldLFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfc2NhbGVmX3BkXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NjYWxlZnBkNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgbGx2bV92OGY2NF90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3NjYWxlZl9wc18xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2FsZWZwczEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3NjYWxlZl9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2FsZWZwczI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksCisgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhmMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3NjYWxlZl9wc181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2FsZWZwczUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksCisgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2ZjMyX3R5LCBsbHZtX2kxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfc3FydF9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NxcnRzc19yb3VuZF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3NxcnRfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zcXJ0c2Rfcm91bmRfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3NxcnRfcGRfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc3FydHBkMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19zcXJ0X3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NxcnRwZDI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfc3FydF9wZF81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zcXJ0cGQ1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19zcXJ0X3BzXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NxcnRwczEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3NxcnRfcHNfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc3FydHBzMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfc3FydF9wc181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zcXJ0cHM1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2ZpeHVwaW1tX3BkXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9maXh1cGltbXBkMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfZml4dXBpbW1fcGRfMTI4IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tcGQxMjhfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19maXh1cGltbV9wZF8yNTYgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZml4dXBpbW1wZDI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X2ZpeHVwaW1tX3BkXzI1NiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9maXh1cGltbXBkMjU2X21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZml4dXBpbW1fcGRfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tcGQ1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k4X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfZml4dXBpbW1fcGRfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tcGQ1MTJfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pOF90eSwKKyAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZml4dXBpbW1fcHNfMTI4IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tcHMxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel9maXh1cGltbV9wc18xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZml4dXBpbW1wczEyOF9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2ZpeHVwaW1tX3BzXzI1NiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9maXh1cGltbXBzMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfZml4dXBpbW1fcHNfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tcHMyNTZfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19maXh1cGltbV9wc181MTIgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZml4dXBpbW1wczUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X2ZpeHVwaW1tX3BzXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9maXh1cGltbXBzNTEyX21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZml4dXBpbW1fc2QgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZml4dXBpbW1zZF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faThfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel9maXh1cGltbV9zZCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9maXh1cGltbXNkX21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1faThfdHksCisgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2ZpeHVwaW1tX3NzIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2ZpeHVwaW1tc3NfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k4X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfZml4dXBpbW1fc3MgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZml4dXBpbW1zc19tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2k4X3R5LAorICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19nZXRleHBfcGRfMTI4IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2V0ZXhwcGQxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2dldGV4cF9wZF8yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nZXRleHBwZDI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZ2V0ZXhwX3BkXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dldGV4cHBkNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZ2V0ZXhwX3BzXzEyOCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dldGV4cHBzMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZ2V0ZXhwX3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dldGV4cHBzMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZ2V0ZXhwX3BzXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dldGV4cHBzNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2dldGV4cF9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dldGV4cHNzMTI4X3JvdW5kX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZ2V0ZXhwX3NkIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2V0ZXhwc2QxMjhfcm91bmRfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2dldG1hbnRfcGRfMTI4IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dldG1hbnRwZDEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSxsbHZtX2kzMl90eSwgbGx2bV92MmY2NF90eSwgIGxsdm1faThfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19nZXRtYW50X3BkXzI1NiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nZXRtYW50cGQyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmNjRfdHksbGx2bV9pMzJfdHksIGxsdm1fdjRmNjRfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZ2V0bWFudF9wZF81MTIgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2V0bWFudHBkNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y4ZjY0X3R5LGxsdm1faTMyX3R5LCBsbHZtX3Y4ZjY0X3R5LCAgbGx2bV9pOF90eSxsbHZtX2kzMl90eSBdLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19nZXRtYW50X3BzXzEyOCA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nZXRtYW50cHMxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCAgbGx2bV9pOF90eV0sCisgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2dldG1hbnRfcHNfMjU2IDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dldG1hbnRwczI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92OGYzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjhmMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZ2V0bWFudF9wc181MTIgOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2V0bWFudHBzNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MTZmMzJfdHksbGx2bV9pMzJfdHksIGxsdm1fdjE2ZjMyX3R5LGxsdm1faTE2X3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZ2V0bWFudF9zcyA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nZXRtYW50c3Nfcm91bmRfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19nZXRtYW50X3NkIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dldG1hbnRzZF9yb3VuZF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9yc3FydDE0X3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcnNxcnQxNHNzX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcnNxcnQxNF9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JzcXJ0MTRzZF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfcnNxcnQxNF9wZF8xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yc3FydDE0cGQxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9yc3FydDE0X3BkXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JzcXJ0MTRwZDI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3JzcXJ0MTRfcGRfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcnNxcnQxNHBkNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwgW2xsdm1fdjhmNjRfdHksIGxsdm1fdjhmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcnNxcnQxNF9wc18xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yc3FydDE0cHMxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcnNxcnQxNF9wc18yNTYgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yc3FydDE0cHMyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9yc3FydDE0X3BzXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JzcXJ0MTRwczUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcmNwMTRfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yY3AxNHNzX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcmNwMTRfc2QgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yY3AxNHNkX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9yY3AxNF9wZF8xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yY3AxNHBkMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcmNwMTRfcGRfMjU2IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmNwMTRwZDI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3JjcDE0X3BkXzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JjcDE0cGQ1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9yY3AxNF9wc18xMjggOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yY3AxNHBzMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fdjRmMzJfdHksIGxsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3JjcDE0X3BzXzI1NiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JjcDE0cHMyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9yY3AxNF9wc181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yY3AxNHBzNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3JjcDI4X3BzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcmNwMjhwc19tYXNrIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcmNwMjhfcGQgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yY3AyOHBkX21hc2siPiwKKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3Y4ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfZXhwMl9wcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cDJwc19tYXNrIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2ZjMyX3R5XSwgW2xsdm1fdjE2ZjMyX3R5LCBsbHZtX3YxNmYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfZXhwMl9wZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cDJwZF9tYXNrIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfcmNwMjhfc3MgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yY3AyOHNzX3JvdW5kX21hc2siPiwKKyAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGYzMl90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjRmMzJfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9yY3AyOF9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JjcDI4c2Rfcm91bmRfbWFzayI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92MmY2NF90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3JzcXJ0MjhfcHMgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9yc3FydDI4cHNfbWFzayI+LAorICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcnNxcnQyOF9wZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JzcXJ0MjhwZF9tYXNrIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcnNxcnQyOF9zcyA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JzcXJ0Mjhzc19yb3VuZF9tYXNrIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcnNxcnQyOF9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3JzcXJ0MjhzZF9yb3VuZF9tYXNrIj4sCisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YyZjY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcHNhZF9id181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc2FkYnc1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fdjY0aThfdHksIGxsdm1fdjY0aThfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKK30KKy8vIEludGVnZXIgYXJpdGhtZXRpYyBvcHMKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BhZGRzX2JfMTI4IDogLy8gRklYTUU6IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpOF90eSwgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BhZGRzX2JfMjU2IDogLy8gRklYTUU6IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpOF90eV0sIFtsbHZtX3YzMmk4X3R5LCBsbHZtX3YzMmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MzJpOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BhZGRzX2JfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFkZHNiNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjY0aThfdHldLCBbbGx2bV92NjRpOF90eSwgbGx2bV92NjRpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjY0aThfdHksIGxsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wYWRkc193XzEyOCA6IC8vIEZJWE1FOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BhZGRzX3dfMjU2IDogLy8gRklYTUU6IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksIGxsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMTZfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wYWRkc193XzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BhZGRzdzUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sIFtsbHZtX3YzMmkxNl90eSwgbGx2bV92MzJpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BhZGR1c19iXzEyOCA6IC8vIEZJWE1FOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aThfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wYWRkdXNfYl8yNTYgOiAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwgW2xsdm1fdjMyaThfdHksIGxsdm1fdjMyaThfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcGFkZHVzX2JfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcGFkZHVzYjUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y2NGk4X3R5XSwgW2xsdm1fdjY0aThfdHksIGxsdm1fdjY0aThfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y2NGk4X3R5LCBsbHZtX2k2NF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcGFkZHVzX3dfMTI4IDogLy8gRklYTUU6IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcGFkZHVzX3dfMjU2IDogLy8gRklYTUU6IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksIGxsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMTZfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wYWRkdXNfd181MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wYWRkdXN3NTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwgW2xsdm1fdjMyaTE2X3R5LCBsbHZtX3YzMmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjMyaTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHN1YnNfYl8xMjggOiAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmk4X3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHN1YnNfYl8yNTYgOiAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwgW2xsdm1fdjMyaThfdHksIGxsdm1fdjMyaThfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmk4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHN1YnNfYl81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3Vic2I1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NjRpOF90eV0sIFtsbHZtX3Y2NGk4X3R5LCBsbHZtX3Y2NGk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92NjRpOF90eSwgbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BzdWJzX3dfMTI4IDogLy8gRklYTUU6IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHN1YnNfd18yNTYgOiAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmkxNl90eSwgbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkxNl90eSwgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BzdWJzX3dfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHN1YnN3NTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwgW2xsdm1fdjMyaTE2X3R5LCBsbHZtX3YzMmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjMyaTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHN1YnVzX2JfMTI4IDogLy8gRklYTUU6IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sIFtsbHZtX3YxNmk4X3R5LCBsbHZtX3YxNmk4X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpOF90eSwgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BzdWJ1c19iXzI1NiA6IC8vIEZJWE1FOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaThfdHldLCBbbGx2bV92MzJpOF90eSwgbGx2bV92MzJpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjMyaThfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wc3VidXNfYl81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wc3VidXNiNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjY0aThfdHldLCBbbGx2bV92NjRpOF90eSwgbGx2bV92NjRpOF90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjY0aThfdHksIGxsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wc3VidXNfd18xMjggOiAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wc3VidXNfd18yNTYgOiAvLyBGSVhNRTogcmVtb3ZlIHRoaXMgaW50cmluc2ljCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmkxNl90eSwgbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkxNl90eSwgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BzdWJ1c193XzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BzdWJ1c3c1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpMTZfdHldLCBbbGx2bV92MzJpMTZfdHksIGxsdm1fdjMyaTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MzJpMTZfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcG11bHVfZHFfNTEyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG11bHVkcTUxMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfcG11bF9kcV81MTIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbXVsZHE1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3BtdWxodV93XzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtdWxodXc1MTIiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sIFtsbHZtX3YzMmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmkxNl90eV0sIFtJbnRyTm9NZW0sIENvbW11dGF0aXZlXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9wbXVsaF93XzUxMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtdWxodzUxMiI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwgW2xsdm1fdjMyaTE2X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjMyaTE2X3R5XSwgW0ludHJOb01lbSwgQ29tbXV0YXRpdmVdPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1hZGR3X2RfMTI4IDogLy8gRklYTUU6IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1fdjRpMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BtYWRkd19kXzI1NiA6IC8vIEZJWE1FOiByZW1vdmUgdGhpcyBpbnRyaW5zaWMKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3YxNmkxNl90eSwgbGx2bV92MTZpMTZfdHksIGxsdm1fdjhpMzJfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BtYWRkd19kXzUxMiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbWFkZHdkNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92MzJpMTZfdHksIGxsdm1fdjMyaTE2X3R5LCBsbHZtX3YxNmkzMl90eSwgIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BtYWRkdWJzX3dfMTI4IDogLy8gRklYTUU6IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1fdjhpMTZfdHksICBsbHZtX2k4X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BtYWRkdWJzX3dfMjU2IDogLy8gRklYTUU6IHJlbW92ZSB0aGlzIGludHJpbnNpYworICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLAorICAgICAgICAgIFtsbHZtX3YzMmk4X3R5LCBsbHZtX3YzMmk4X3R5LCBsbHZtX3YxNmkxNl90eSwgIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3BtYWRkdWJzX3dfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3BtYWRkdWJzdzUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sCisgICAgICAgICAgW2xsdm1fdjY0aThfdHksIGxsdm1fdjY0aThfdHksIGxsdm1fdjMyaTE2X3R5LCAgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19kYnBzYWRid18xMjggOgorICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZGJwc2FkYncxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgW2xsdm1fdjE2aThfdHksIGxsdm1fdjE2aThfdHksIGxsdm1faTMyX3R5LCBsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2RicHNhZGJ3XzI1NiA6CisgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9kYnBzYWRidzI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sCisgICAgICAgICAgW2xsdm1fdjMyaThfdHksIGxsdm1fdjMyaThfdHksIGxsdm1faTMyX3R5LCBsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZGJwc2FkYndfNTEyIDoKKyAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2RicHNhZGJ3NTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwKKyAgICAgICAgICBbbGx2bV92NjRpOF90eSwgbGx2bV92NjRpOF90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjMyaTE2X3R5LAorICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy8gR2F0aGVyIGFuZCBTY2F0dGVyIG9wcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsKKyAgZGVmIGludF94ODZfYXZ4NTEyX2dhdGhlcl9kcGRfNTEyICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjhkZiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3B0cl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfZ2F0aGVyX2Rwc181MTIgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2MTZzZiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV92MTZmMzJfdHksIGxsdm1fcHRyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX2dhdGhlcl9xcGRfNTEyICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjhkZiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGY2NF90eV0sIFtsbHZtX3Y4ZjY0X3R5LCBsbHZtX3B0cl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfZ2F0aGVyX3Fwc181MTIgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2MTZzZiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3B0cl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisKKyAgZGVmIGludF94ODZfYXZ4NTEyX2dhdGhlcl9kcHFfNTEyICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcnNpdjhkaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3B0cl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfZ2F0aGVyX2RwaV81MTIgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVyc2l2MTZzaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksIGxsdm1fcHRyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX2dhdGhlcl9xcHFfNTEyICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcmRpdjhkaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3B0cl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfZ2F0aGVyX3FwaV81MTIgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVyZGl2MTZzaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3B0cl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9nYXRoZXIzZGl2Ml9kZiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcjNkaXYyZGYiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLAorICAgICAgICAgIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3B0cl90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfZ2F0aGVyM2RpdjJfZGkgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXIzZGl2MmRpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV9wdHJfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX2dhdGhlcjNkaXY0X2RmIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVyM2RpdjRkZiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRmNjRfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9nYXRoZXIzZGl2NF9kaSA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcjNkaXY0ZGkiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3B0cl90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfZ2F0aGVyM2RpdjRfc2YgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXIzZGl2NHNmIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGYzMl90eSwgbGx2bV9wdHJfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX2dhdGhlcjNkaXY0X3NpIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVyM2RpdjRzaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9nYXRoZXIzZGl2OF9zZiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcjNkaXY4c2YiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3B0cl90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfZ2F0aGVyM2Rpdjhfc2kgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXIzZGl2OHNpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV9wdHJfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX2dhdGhlcjNzaXYyX2RmIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVyM3NpdjJkZiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MmY2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjJmNjRfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9nYXRoZXIzc2l2Ml9kaSA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcjNzaXYyZGkiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLAorICAgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3B0cl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfZ2F0aGVyM3NpdjRfZGYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXIzc2l2NGRmIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwKKyAgICAgICAgICBbbGx2bV92NGY2NF90eSwgbGx2bV9wdHJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX2dhdGhlcjNzaXY0X2RpIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVyM3NpdjRkaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sCisgICAgICAgICAgW2xsdm1fdjRpNjRfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9nYXRoZXIzc2l2NF9zZiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcjNzaXY0c2YiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3B0cl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfZ2F0aGVyM3NpdjRfc2kgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9nYXRoZXIzc2l2NHNpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV9wdHJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX2dhdGhlcjNzaXY4X3NmIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVyM3NpdjhzZiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGYzMl90eV0sCisgICAgICAgICAgW2xsdm1fdjhmMzJfdHksIGxsdm1fcHRyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9nYXRoZXIzc2l2OF9zaSA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcjNzaXY4c2kiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLAorICAgICAgICAgIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3B0cl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworLy8gc2NhdHRlcgorICBkZWYgaW50X3g4Nl9hdng1MTJfc2NhdHRlcl9kcGRfNTEyICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY4ZGYiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9pOF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHksIGxsdm1fdjhmNjRfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9zY2F0dGVyX2Rwc181MTIgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjE2c2YiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV9pMTZfdHksCisgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmYzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3NjYXR0ZXJfcXBkXzUxMiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2OGRmIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1faThfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4ZjY0X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfc2NhdHRlcl9xcHNfNTEyICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXYxNnNmIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1faThfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4ZjMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3NjYXR0ZXJfZHBxXzUxMiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2OGRpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1faThfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eSwgbGx2bV92OGk2NF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3NjYXR0ZXJfZHBpXzUxMiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2MTZzaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX2kxNl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3NjYXR0ZXJfcXBxXzUxMiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2OGRpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1faThfdHksbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfc2NhdHRlcl9xcGlfNTEyICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXYxNnNpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1faThfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfc2NhdHRlcmRpdjJfZGYgOgorICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXYyZGYiPiwKKyAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1faThfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1fdjJmNjRfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3NjYXR0ZXJkaXYyX2RpIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjJkaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1faThfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfc2NhdHRlcmRpdjRfZGYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2NGRmIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pOF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV92NGY2NF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9zY2F0dGVyZGl2NF9kaSA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY0ZGkiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3NjYXR0ZXJkaXY0X3NmIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjRzZiI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1faThfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1fdjRmMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfc2NhdHRlcmRpdjRfc2kgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVyZGl2NHNpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pOF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9zY2F0dGVyZGl2OF9zZiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJkaXY4c2YiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3NjYXR0ZXJkaXY4X3NpIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhdHRlcmRpdjhzaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1faThfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfc2NhdHRlcnNpdjJfZGYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2MmRmIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pOF90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92MmY2NF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9zY2F0dGVyc2l2Ml9kaSA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXYyZGkiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3NjYXR0ZXJzaXY0X2RmIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjRkZiI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1faThfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRmNjRfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfc2NhdHRlcnNpdjRfZGkgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2NGRpIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pOF90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9zY2F0dGVyc2l2NF9zZiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY0c2YiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0ZjMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX3NjYXR0ZXJzaXY0X3NpIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhdHRlcnNpdjRzaSI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1faThfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfc2NhdHRlcnNpdjhfc2YgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVyc2l2OHNmIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV9pOF90eSwgbGx2bV92OGkzMl90eSwgbGx2bV92OGYzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9zY2F0dGVyc2l2OF9zaSA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJzaXY4c2kiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisKKyAgLy8gZ2F0aGVyIHByZWZldGNoCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9nYXRoZXJwZl9kcGRfNTEyICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcnBmZHBkIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pOF90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9wdHJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX2dhdGhlcnBmX2Rwc181MTIgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVycGZkcHMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kxNl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1fcHRyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9nYXRoZXJwZl9xcGRfNTEyICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2dhdGhlcnBmcXBkIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pOF90eSwgbGx2bV92OGk2NF90eSwgbGx2bV9wdHJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX2dhdGhlcnBmX3Fwc181MTIgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZ2F0aGVycGZxcHMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2k4X3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX3B0cl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyQXJnTWVtT25seV0+OworCisgIC8vIHNjYXR0ZXIgcHJlZmV0Y2gKKyAgZGVmIGludF94ODZfYXZ4NTEyX3NjYXR0ZXJwZl9kcGRfNTEyICA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NjYXR0ZXJwZmRwZCI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1faThfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1fcHRyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9zY2F0dGVycGZfZHBzXzUxMiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVycGZkcHMiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2kxNl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1fcHRyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9zY2F0dGVycGZfcXBkXzUxMiAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zY2F0dGVycGZxcGQiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX2k4X3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX3B0cl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfc2NhdHRlcnBmX3Fwc181MTIgIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2NhdHRlcnBmcXBzIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9pOF90eSwgbGx2bV92OGk2NF90eSwgbGx2bV9wdHJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKK30KKworLy8gQVZYLTUxMiBjb25mbGljdCBkZXRlY3Rpb24gaW5zdHJ1Y3Rpb24KKy8vIEluc3RydWN0aW9ucyB0aGF0IGNvdW50IHRoZSBudW1iZXIgb2YgbGVhZGluZyB6ZXJvIGJpdHMKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbmZsaWN0X2RfMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGNvbmZsaWN0c2lfMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29uZmxpY3RfZF8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwY29uZmxpY3RzaV8yNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb25mbGljdF9kXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBjb25mbGljdHNpXzUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbmZsaWN0X3FfMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cGNvbmZsaWN0ZGlfMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29uZmxpY3RfcV8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3ZwY29uZmxpY3RkaV8yNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb25mbGljdF9xXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBjb25mbGljdGRpXzUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47Cit9CisKKy8vIENvbXBhcmVzCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geworICAvLyA1MTItYml0CisgIGRlZiBpbnRfeDg2X2F2eDUxMl92Y29taV9zZCA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zjb21pc2QiPiwKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1fdjJmNjRfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX3Zjb21pX3NzIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdmNvbWlzcyI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSwgW2xsdm1fdjRmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV92NGYzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLyBDb21wcmVzcywgRXhwYW5kCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19wc181MTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21wcmVzc3NmNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3BkXzUxMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzZGY1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19wc18yNTYgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21wcmVzc3NmMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fdjhmMzJfdHksIGxsdm1fdjhmMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfcGRfMjU2IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NkZjI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGY2NF90eV0sIFtsbHZtX3Y0ZjY0X3R5LCBsbHZtX3Y0ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3BzXzEyOCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc2YxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19wZF8xMjggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21wcmVzc2RmMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fdjJmNjRfdHksIGxsdm1fdjJmNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9wc181MTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVzZjUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3YxNmYzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eV0sIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9wZF81MTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVkZjUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcHNfMjU2IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3Jlc2YyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV92OGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3N0b3JlX3BkXzI1NiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZWRmMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1fdjRmNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9wc18xMjggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVzZjEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfcGRfMTI4IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21wcmVzc3N0b3JlZGYxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W10sIFtsbHZtX3B0cl90eSwgbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfZF81MTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21wcmVzc3NpNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3FfNTEyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NkaTUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX2RfMjU2IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NzaTI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3FfMjU2IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NkaTI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX2RfMTI4IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NzaTEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3FfMTI4IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NkaTEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfZF81MTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVzaTUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3YxNmkzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eV0sIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9xXzUxMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZWRpNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1fdjhpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9kXzI1NiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZXNpMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9xXzI1NiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZWRpMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9kXzEyOCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZXNpMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9xXzEyOCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZWRpMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyQXJnTWVtT25seV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX2JfNTEyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NxaTUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NjRpOF90eV0sIFtsbHZtX3Y2NGk4X3R5LCBsbHZtX3Y2NGk4X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTY0X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc193XzUxMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzaGk1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwgW2xsdm1fdjMyaTE2X3R5LCBsbHZtX3YzMmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3NfYl8yNTYgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21wcmVzc3FpMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwgW2xsdm1fdjMyaThfdHksIGxsdm1fdjMyaThfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NvbXByZXNzX3dfMjU2IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NoaTI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksIGxsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19iXzEyOCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzcWkxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfd18xMjggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jb21wcmVzc2hpMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTE2X3R5XSwgW2xsdm1fdjhpMTZfdHksIGxsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9iXzUxMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZXFpNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1fdjY0aThfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfd181MTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVoaTUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3YzMmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9iXzI1NiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZXFpMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1fdjMyaThfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfd18yNTYgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVoaTI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eV0sIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jb21wcmVzc19zdG9yZV9iXzEyOCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY29tcHJlc3NzdG9yZXFpMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbbGx2bV9wdHJfdHksIGxsdm1fdjE2aThfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY29tcHJlc3Nfc3RvcmVfd18xMjggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2NvbXByZXNzc3RvcmVoaTEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ckFyZ01lbU9ubHldPjsKKworLy8gZXhwYW5kCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9wc181MTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9leHBhbmRzZjUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZmMzJfdHldLCBbbGx2bV92MTZmMzJfdHksIGxsdm1fdjE2ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfcGRfNTEyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kZGY1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmNjRfdHldLCBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfcHNfMjU2IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kc2YyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhmMzJfdHldLCBbbGx2bV92OGYzMl90eSwgbGx2bV92OGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfcGRfMjU2IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kZGYyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmNjRfdHldLCBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfcHNfMTI4IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kc2YxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRmMzJfdHldLCBbbGx2bV92NGYzMl90eSwgbGx2bV92NGYzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfcGRfMTI4IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kZGYxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJmNjRfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3BzXzUxMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZHNmNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmYzMl90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV92MTZmMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3BkXzUxMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZGRmNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjY0X3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3BzXzI1NiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZHNmMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4ZjMyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3BkXzI1NiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZGRmMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjY0X3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0ZjY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3BzXzEyOCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZHNmMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0ZjMyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3BkXzEyOCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZGRmMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyZjY0X3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2RfNTEyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kc2k1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwgW2xsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3FfNTEyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kZGk1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLCBbbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfZF8yNTYgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9leHBhbmRzaTI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9xXzI1NiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGRpMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwgW2xsdm1fdjRpNjRfdHksIGxsdm1fdjRpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2RfMTI4IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kc2kxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfcV8xMjggOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9leHBhbmRkaTEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfZF81MTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRzaTUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9xXzUxMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZGRpNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX2RfMjU2IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9leHBhbmRsb2Fkc2kyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfcV8yNTYgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRkaTI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV92NGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9kXzEyOCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZHNpMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3FfMTI4IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkZGkxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfYl81MTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZHFpNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y2NGk4X3R5XSwgW2xsdm1fdjY0aThfdHksIGxsdm1fdjY0aThfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pNjRfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF93XzUxMiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kaGk1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwgW2xsdm1fdjMyaTE2X3R5LCBsbHZtX3YzMmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2JfMjU2IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9leHBhbmRxaTI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpOF90eV0sIFtsbHZtX3YzMmk4X3R5LCBsbHZtX3YzMmk4X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfd18yNTYgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGhpMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3YxNmkxNl90eSwgbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9iXzEyOCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kcWkxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV92MTZpOF90eSwgbGx2bV92MTZpOF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX3dfMTI4IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9leHBhbmRoaTEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfYl81MTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRxaTUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NjRpOF90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV92NjRpOF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k2NF90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfZXhwYW5kX2xvYWRfd181MTIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX2V4cGFuZGxvYWRoaTUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpMTZfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1fdjMyaTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF9iXzI1NiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZHFpMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwgW2xsdm1fcHRyX3R5LCBsbHZtX3YzMmk4X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJSZWFkTWVtLCBJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19leHBhbmRfbG9hZF93XzI1NiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfZXhwYW5kbG9hZGhpMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkxNl90eV0sIFtsbHZtX3B0cl90eSwgbGx2bV92MTZpMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX2JfMTI4IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkcWkxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1fdjE2aThfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMTZfdHldLCBbSW50clJlYWRNZW0sIEludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2V4cGFuZF9sb2FkX3dfMTI4IDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9leHBhbmRsb2FkaGkxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV9wdHJfdHksIGxsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyUmVhZE1lbSwgSW50ckFyZ01lbU9ubHldPjsKK30KKworLy8gVkJNSTIgQ29uY2F0ICYgU2hpZnQKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7ICAvLyBBbGwgaW50cmluc2ljcyBzdGFydCB3aXRoICJsbHZtLng4Ni4iLgorICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNobGRfcV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobGRxNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92OGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNobGRfcV8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobGRxMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92NGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNobGRfcV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobGRxMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92Mmk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZF9kXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hsZGQ1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3YxNmkzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaGxkX2RfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxkZDI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgICAgICAgICBbbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaGxkX2RfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxkZDEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNobGRfd181MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobGR3NTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sCisgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMTZfdHksIGxsdm1fdjMyaTE2X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92MzJpMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZF93XzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hsZHcyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkxNl90eSwgbGx2bV92MTZpMTZfdHksIGxsdm1faTMyX3R5LCBsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaGxkX3dfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxkdzEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNocmRfcV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNocmRxNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92OGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNocmRfcV8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNocmRxMjU2X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92NGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNocmRfcV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNocmRxMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwKKyAgICAgICAgICAgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92Mmk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZF9kXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hyZGQ1MTJfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1faTMyX3R5LCBsbHZtX3YxNmkzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaHJkX2RfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHJkZDI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgICAgICAgICBbbGx2bV92OGkzMl90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaHJkX2RfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHJkZDEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjRpMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNocmRfd181MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNocmR3NTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmkxNl90eV0sCisgICAgICAgICAgICAgICAgICBbbGx2bV92MzJpMTZfdHksIGxsdm1fdjMyaTE2X3R5LCBsbHZtX2kzMl90eSwgbGx2bV92MzJpMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZF93XzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hyZHcyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkxNl90eSwgbGx2bV92MTZpMTZfdHksIGxsdm1faTMyX3R5LCBsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaHJkX3dfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHJkdzEyOF9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pMzJfdHksIGxsdm1fdjhpMTZfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNobGR2X3dfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxkdncxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl93XzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZ3MTI4X21hc2t6Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZHZfd18yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobGR2dzI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksIGxsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTE2X3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfd18yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobGR2dzI1Nl9tYXNreiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjE2aTE2X3R5LCBsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkxNl90eSwgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZHZfd181MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobGR2dzUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpMTZfdHldLCBbbGx2bV92MzJpMTZfdHksIGxsdm1fdjMyaTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjMyaTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfd181MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobGR2dzUxMl9tYXNreiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwgW2xsdm1fdjMyaTE2X3R5LCBsbHZtX3YzMmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaGxkdl9xXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZxMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3Zwc2hsZHZfcV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobGR2cTEyOF9tYXNreiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNobGR2X3FfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxkdnEyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl9xXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZxMjU2X21hc2t6Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZHZfcV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobGR2cTUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cHNobGR2X3FfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxkdnE1MTJfbWFza3oiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92OGk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNobGR2X2RfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxkdmQxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl9kXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZkMTI4X21hc2t6Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hsZHZfZF8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNobGR2ZDI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cHNobGR2X2RfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaGxkdmQyNTZfbWFza3oiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaGxkdl9kXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZkNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBzaGxkdl9kXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hsZHZkNTEyX21hc2t6Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNocmR2X3dfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHJkdncxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLCBbbGx2bV92OGkxNl90eSwgbGx2bV92OGkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl93XzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZ3MTI4X21hc2t6Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3Y4aTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMTZfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZHZfd18yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNocmR2dzI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLCBbbGx2bV92MTZpMTZfdHksIGxsdm1fdjE2aTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTE2X3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfd18yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNocmR2dzI1Nl9tYXNreiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwgW2xsdm1fdjE2aTE2X3R5LCBsbHZtX3YxNmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3YxNmkxNl90eSwgbGx2bV9pMTZfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZHZfd181MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNocmR2dzUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpMTZfdHldLCBbbGx2bV92MzJpMTZfdHksIGxsdm1fdjMyaTE2X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjMyaTE2X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfd181MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNocmR2dzUxMl9tYXNreiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjMyaTE2X3R5XSwgW2xsdm1fdjMyaTE2X3R5LCBsbHZtX3YzMmkxNl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3YzMmkxNl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaHJkdl9xXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZxMTI4X21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YyaTY0X3R5XSwgW2xsdm1fdjJpNjRfdHksIGxsdm1fdjJpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92Mmk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3Zwc2hyZHZfcV8xMjggOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNocmR2cTEyOF9tYXNreiI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLCBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNocmR2X3FfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHJkdnEyNTZfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLCBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl9xXzI1NiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZxMjU2X21hc2t6Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZHZfcV81MTIgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNocmR2cTUxMl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cHNocmR2X3FfNTEyIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHJkdnE1MTJfbWFza3oiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTY0X3R5XSwgW2xsdm1fdjhpNjRfdHksIGxsdm1fdjhpNjRfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92OGk2NF90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza192cHNocmR2X2RfMTI4IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHJkdmQxMjhfbWFzayI+LAorICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwKKyAgICAgICAgICAgICAgICAgICBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl9kXzEyOCA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZkMTI4X21hc2t6Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Zwc2hyZHZfZF8yNTYgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl92cHNocmR2ZDI1Nl9tYXNrIj4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel92cHNocmR2X2RfMjU2IDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfdnBzaHJkdmQyNTZfbWFza3oiPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfdnBzaHJkdl9kXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZkNTEyX21hc2siPiwKKyAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksCisgICAgICAgICAgICAgICAgICAgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfdnBzaHJkdl9kXzUxMiA6CisgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Zwc2hyZHZkNTEyX21hc2t6Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMzJfdHldLCBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LAorICAgICAgICAgICAgICAgICAgIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy8gdHJ1bmNhdGUKK2xldCBUYXJnZXRQcmVmaXggPSAieDg2IiBpbiB7CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZfcWJfMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92cWIxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3FiX21lbV8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZxYjEyOG1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWJfMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92c3FiMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWJfbWVtXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNxYjEyOG1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FiXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzcWIxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92dXNfcWJfbWVtXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzcWIxMjhtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZfcWJfMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92cWIyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3FiX21lbV8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZxYjI1Nm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWJfMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92c3FiMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWJfbWVtXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNxYjI1Nm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FiXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzcWIyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92dXNfcWJfbWVtXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzcWIyNTZtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZfcWJfNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92cWI1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3FiX21lbV81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZxYjUxMm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWJfNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92c3FiNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGk2NF90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWJfbWVtXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNxYjUxMm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FiXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzcWI1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92dXNfcWJfbWVtXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzcWI1MTJtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZfcXdfMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92cXcxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3F3X21lbV8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZxdzEyOG1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfcXdfMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92c3F3MTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfcXdfbWVtXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNxdzEyOG1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3F3XzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzcXcxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92dXNfcXdfbWVtXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzcXcxMjhtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZfcXdfMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92cXcyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3F3X21lbV8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZxdzI1Nm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfcXdfMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92c3F3MjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfcXdfbWVtXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNxdzI1Nm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3F3XzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzcXcyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92dXNfcXdfbWVtXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzcXcyNTZtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZfcXdfNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92cXc1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3F3X21lbV81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZxdzUxMm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfcXdfNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92c3F3NTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGk2NF90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfcXdfbWVtXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNxdzUxMm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3F3XzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzcXc1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92dXNfcXdfbWVtXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzcXc1MTJtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZfcWRfMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92cWQxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3FkX21lbV8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZxZDEyOG1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWRfMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92c3FkMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWRfbWVtXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNxZDEyOG1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjJpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FkXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzcWQxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92dXNfcWRfbWVtXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzcWQxMjhtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZfcWRfMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92cWQyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3FkX21lbV8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZxZDI1Nm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWRfMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92c3FkMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92NGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWRfbWVtXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNxZDI1Nm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjRpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FkXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzcWQyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92dXNfcWRfbWVtXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzcWQyNTZtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZfcWRfNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92cWQ1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3FkX21lbV81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZxZDUxMm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWRfNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92c3FkNTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGk2NF90eSwgbGx2bV92OGkzMl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfcWRfbWVtXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNxZDUxMm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjhpNjRfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3FkXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzcWQ1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92dXNfcWRfbWVtXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzcWQ1MTJtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZfZGJfMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92ZGIxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X2RiX21lbV8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZkYjEyOG1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfZGJfMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92c2RiMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfZGJfbWVtXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNkYjEyOG1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2RiXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzZGIxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92dXNfZGJfbWVtXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzZGIxMjhtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZfZGJfMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92ZGIyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X2RiX21lbV8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZkYjI1Nm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfZGJfMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92c2RiMjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGkzMl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfZGJfbWVtXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNkYjI1Nm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2RiXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzZGIyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92dXNfZGJfbWVtXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzZGIyNTZtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZfZGJfNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92ZGI1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZfZGJfbWVtXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdmRiNTEybWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2RiXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNkYjUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfZGJfbWVtXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNkYjUxMm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92dXNfZGJfNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92dXNkYjUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2RiX21lbV81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c2RiNTEybWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZfZHdfMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92ZHcxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X2R3X21lbV8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZkdzEyOG1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfZHdfMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92c2R3MTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGkzMl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfZHdfbWVtXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNkdzEyOG1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2R3XzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzZHcxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92dXNfZHdfbWVtXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzZHcxMjhtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZfZHdfMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92ZHcyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X2R3X21lbV8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZkdzI1Nm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfZHdfMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92c2R3MjU2X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGkzMl90eSwgbGx2bV92OGkxNl90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfZHdfbWVtXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnNkdzI1Nm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2R3XzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzZHcyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92dXNfZHdfbWVtXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzZHcyNTZtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZfZHdfNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92ZHc1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdl9kd19tZW1fNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92ZHc1MTJtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3YxNmkzMl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfZHdfNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92c2R3NTEyX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTMyX3R5LCBsbHZtX3YxNmkxNl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX2R3X21lbV81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3ZzZHc1MTJtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3YxNmkzMl90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2R3XzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzZHc1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX2R3X21lbV81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c2R3NTEybWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Zfd2JfMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92d2IxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92X3diX21lbV8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z3YjEyOG1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfd2JfMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92c3diMTI4X21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjE2aThfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGkxNl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfd2JfbWVtXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnN3YjEyOG1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjhpMTZfdHksIGxsdm1faThfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ckFyZ01lbU9ubHldPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3diXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzd2IxMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTE2X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92dXNfd2JfbWVtXzEyOCA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnVzd2IxMjhtZW1fbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbXSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fcHRyX3R5LCBsbHZtX3Y4aTE2X3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Zfd2JfMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92d2IyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkxNl90eSwgbGx2bV92MTZpOF90eSwgbGx2bV9pMTZfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Zfd2JfbWVtXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdndiMjU2bWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92MTZpMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3diXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnN3YjI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTE2X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfd2JfbWVtXzI1NiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnN3YjI1Nm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjE2aTE2X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92dXNfd2JfMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92dXN3YjI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjE2aTE2X3R5LCBsbHZtX3YxNmk4X3R5LCBsbHZtX2kxNl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3diX21lbV8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3diMjU2bWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92MTZpMTZfdHksIGxsdm1faTE2X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Zfd2JfNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92d2I1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MzJpOF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YzMmkxNl90eSwgbGx2bV92MzJpOF90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3Zfd2JfbWVtXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdndiNTEybWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92MzJpMTZfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3Btb3ZzX3diXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnN3YjUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTE2X3R5LCBsbHZtX3YzMmk4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnNfd2JfbWVtXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcG1vdnN3YjUxMm1lbV9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtdLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV9wdHJfdHksIGxsdm1fdjMyaTE2X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyQXJnTWVtT25seV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19wbW92dXNfd2JfNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wbW92dXN3YjUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YzMmk4X3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjMyaTE2X3R5LCBsbHZtX3YzMmk4X3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcG1vdnVzX3diX21lbV81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3Btb3Z1c3diNTEybWVtX21hc2siPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W10sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3B0cl90eSwgbGx2bV92MzJpMTZfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW0ludHJBcmdNZW1Pbmx5XT47Cit9CisKKy8vIEJpdHdpc2UgdGVybmFyeSBsb2dpYworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHRlcm5sb2dfZF8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3B0ZXJubG9nZDEyOF9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfcHRlcm5sb2dfZF8xMjggOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3B0ZXJubG9nZDEyOF9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHRlcm5sb2dfZF8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3B0ZXJubG9nZDI1Nl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgW2xsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1fdjhpMzJfdHksIGxsdm1faTMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgbGx2bV9pOF90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza3pfcHRlcm5sb2dfZF8yNTYgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3B0ZXJubG9nZDI1Nl9tYXNreiI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX3Y4aTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfcHRlcm5sb2dfZF81MTIgOgorICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3B0ZXJubG9nZDUxMl9tYXNrIj4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrel9wdGVybmxvZ19kXzUxMiA6CisgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfcHRlcm5sb2dkNTEyX21hc2t6Ij4sCisgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3YxNmkzMl90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YxNmkzMl90eSwgbGx2bV92MTZpMzJfdHksIGxsdm1fdjE2aTMyX3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1faTE2X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3B0ZXJubG9nX3FfMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wdGVybmxvZ3ExMjhfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92Mmk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX3YyaTY0X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3B0ZXJubG9nX3FfMTI4IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wdGVybmxvZ3ExMjhfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV92Mmk2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3B0ZXJubG9nX3FfMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wdGVybmxvZ3EyNTZfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX3Y0aTY0X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3B0ZXJubG9nX3FfMjU2IDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wdGVybmxvZ3EyNTZfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV92NGk2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworCisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX3B0ZXJubG9nX3FfNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wdGVybmxvZ3E1MTJfbWFzayI+LAorICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92OGk2NF90eV0sCisgICAgICAgICAgICAgICAgICAgIFtsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX3Y4aTY0X3R5LCBsbHZtX2kzMl90eSwKKyAgICAgICAgICAgICAgICAgICAgIGxsdm1faThfdHldLCBbSW50ck5vTWVtXT47CisKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2t6X3B0ZXJubG9nX3FfNTEyIDoKKyAgICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9wdGVybmxvZ3E1MTJfbWFza3oiPiwKKyAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpNjRfdHldLAorICAgICAgICAgICAgICAgICAgICBbbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eSwgbGx2bV92OGk2NF90eSwgbGx2bV9pMzJfdHksCisgICAgICAgICAgICAgICAgICAgICBsbHZtX2k4X3R5XSwgW0ludHJOb01lbV0+OworfQorCisvLyBNaXNjLgorbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY21wX3BzXzUxMiA6CisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV92MTZpMV90eV0sIFtsbHZtX3YxNmYzMl90eSwgbGx2bV92MTZmMzJfdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jbXBfcGRfNTEyIDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y4aTFfdHldLCBbbGx2bV92OGY2NF90eSwgbGx2bV92OGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X2F2eDUxMl9tYXNrX2NtcF9wc18yNTYgOgorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjhpMV90eV0sIFtsbHZtX3Y4ZjMyX3R5LCBsbHZtX3Y4ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jbXBfcGRfMjU2IDoKKyAgICAgICAgICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTFfdHldLCBbbGx2bV92NGY2NF90eSwgbGx2bV92NGY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY21wX3BzXzEyOCA6CisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMV90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY21wX3BkXzEyOCA6CisgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1fdjJpMV90eV0sIFtsbHZtX3YyZjY0X3R5LCBsbHZtX3YyZjY0X3R5LAorICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKworICBkZWYgaW50X3g4Nl9hdng1MTJfbWFza19jbXBfc3MgOgorICAgICAgICBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jbXBzc19tYXNrIj4sCisgICAgICAgICAgICAgIEludHJpbnNpYzxbbGx2bV9pOF90eV0sIFtsbHZtX3Y0ZjMyX3R5LCBsbHZtX3Y0ZjMyX3R5LAorICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm1faTMyX3R5LCBsbHZtX2k4X3R5LCBsbHZtX2kzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfYXZ4NTEyX21hc2tfY21wX3NkIDoKKyAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfY21wc2RfbWFzayI+LAorICAgICAgICAgICAgICBJbnRyaW5zaWM8W2xsdm1faThfdHldLCBbbGx2bV92MmY2NF90eSwgbGx2bV92MmY2NF90eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtX2kzMl90eSwgbGx2bV9pOF90eSwgbGx2bV9pMzJfdHldLCBbSW50ck5vTWVtXT47Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTSEEgaW50cmluc2ljcworbGV0IFRhcmdldFByZWZpeCA9ICJ4ODYiIGluIHsKKyAgZGVmIGludF94ODZfc2hhMXJuZHM0IDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2hhMXJuZHM0Ij4sCisgICAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5LCBsbHZtX2k4X3R5XSwKKyAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc2hhMW5leHRlIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2hhMW5leHRlIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94ODZfc2hhMW1zZzEgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zaGExbXNnMSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NoYTFtc2cyIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2hhMW1zZzIiPiwKKyAgICAgIEludHJpbnNpYzxbbGx2bV92NGkzMl90eV0sIFtsbHZtX3Y0aTMyX3R5LCBsbHZtX3Y0aTMyX3R5XSwgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zaGEyNTZybmRzMiA6IEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9pYTMyX3NoYTI1NnJuZHMyIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sCisgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3g4Nl9zaGEyNTZtc2cxIDogR0NDQnVpbHRpbjwiX19idWlsdGluX2lhMzJfc2hhMjU2bXNnMSI+LAorICAgICAgSW50cmluc2ljPFtsbHZtX3Y0aTMyX3R5XSwgW2xsdm1fdjRpMzJfdHksIGxsdm1fdjRpMzJfdHldLCBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeDg2X3NoYTI1Nm1zZzIgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9zaGEyNTZtc2cyIj4sCisgICAgICBJbnRyaW5zaWM8W2xsdm1fdjRpMzJfdHldLCBbbGx2bV92NGkzMl90eSwgbGx2bV92NGkzMl90eV0sIFtJbnRyTm9NZW1dPjsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFRocmVhZCBzeW5jaHJvbml6YXRpb24gb3BzIHdpdGggdGltZXIuCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geworICBkZWYgaW50X3g4Nl9tb25pdG9yeAorICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9tb25pdG9yeCI+LAorICAgICAgICBJbnRyaW5zaWM8W10sIFsgbGx2bV9wdHJfdHksIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSBdLCBbXT47CisgIGRlZiBpbnRfeDg2X213YWl0eAorICAgICAgOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9td2FpdHgiPiwKKyAgICAgICAgSW50cmluc2ljPFtdLCBbIGxsdm1faTMyX3R5LCBsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHkgXSwgW10+OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ2FjaGUtbGluZSB6ZXJvCitsZXQgVGFyZ2V0UHJlZml4ID0gIng4NiIgaW4geworICBkZWYgaW50X3g4Nl9jbHplcm8gOiBHQ0NCdWlsdGluPCJfX2J1aWx0aW5faWEzMl9jbHplcm8iPiwKKyAgICAgIEludHJpbnNpYzxbXSwgW2xsdm1fcHRyX3R5XSwgW10+OworfQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzWENvcmUudGQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0ludHJpbnNpY3NYQ29yZS50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjE0ZTFlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9JbnRyaW5zaWNzWENvcmUudGQKQEAgLTAsMCArMSwxMjEgQEAKKy8vPT0tIEludHJpbnNpY3NYQ29yZS50ZCAtIFhDb3JlIGludHJpbnNpY3MgICAgICAgICAgICAgICAgIC0qLSB0YWJsZWdlbiAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYWxsIG9mIHRoZSBYQ29yZS1zcGVjaWZpYyBpbnRyaW5zaWNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2xldCBUYXJnZXRQcmVmaXggPSAieGNvcmUiIGluIHsgIC8vIEFsbCBpbnRyaW5zaWNzIHN0YXJ0IHdpdGggImxsdm0ueGNvcmUuIi4KKyAgLy8gTWlzY2VsbGFuZW91cyBpbnN0cnVjdGlvbnMuCisgIGRlZiBpbnRfeGNvcmVfYml0cmV2IDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1faTMyX3R5XSxbSW50ck5vTWVtXT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2JpdHJldiI+OworICBkZWYgaW50X3hjb3JlX2NyYzggOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbGx2bV9pMzJfdHksbGx2bV9pMzJfdHksbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3hjb3JlX2NyYzMyIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW2xsdm1faTMyX3R5LGxsdm1faTMyX3R5LGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbSW50ck5vTWVtXT47CisgIGRlZiBpbnRfeGNvcmVfc2V4dCA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLCBbbGx2bV9pMzJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtJbnRyTm9NZW1dPjsKKyAgZGVmIGludF94Y29yZV96ZXh0IDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sIFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW0ludHJOb01lbV0+OworICBkZWYgaW50X3hjb3JlX2dldGlkIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW10sW0ludHJOb01lbV0+LAorICAgICAgICAgICAgICAgICAgICAgICAgR0NDQnVpbHRpbjwiX19idWlsdGluX2dldGlkIj47CisgIGRlZiBpbnRfeGNvcmVfZ2V0cHMgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9pMzJfdHldPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9nZXRwcyI+OworICBkZWYgaW50X3hjb3JlX3NldHBzIDogSW50cmluc2ljPFtdLFtsbHZtX2kzMl90eSwgbGx2bV9pMzJfdHldPiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEdDQ0J1aWx0aW48Il9fYnVpbHRpbl9zZXRwcyI+OworICBkZWYgaW50X3hjb3JlX2dldGVkIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW10+OworICBkZWYgaW50X3hjb3JlX2dldGV0IDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW10+OworICBkZWYgaW50X3hjb3JlX3NldHNyIDogSW50cmluc2ljPFtdLFtsbHZtX2kzMl90eV0+OworICBkZWYgaW50X3hjb3JlX2NscnNyIDogSW50cmluc2ljPFtdLFtsbHZtX2kzMl90eV0+OworCisgIC8vIFJlc291cmNlIGluc3RydWN0aW9ucy4KKyAgZGVmIGludF94Y29yZV9nZXRyIDogSW50cmluc2ljPFtsbHZtX2FueXB0cl90eV0sW2xsdm1faTMyX3R5XT47CisgIGRlZiBpbnRfeGNvcmVfZnJlZXIgOiBJbnRyaW5zaWM8W10sW2xsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX2luIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1fYW55cHRyX3R5XSxbTm9DYXB0dXJlPDA+XT47CisgIGRlZiBpbnRfeGNvcmVfaW50IDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX2luY3QgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX291dCA6IEludHJpbnNpYzxbXSxbbGx2bV9hbnlwdHJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX291dHQgOiBJbnRyaW5zaWM8W10sW2xsdm1fYW55cHRyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9DYXB0dXJlPDA+XT47CisgIGRlZiBpbnRfeGNvcmVfb3V0Y3QgOiBJbnRyaW5zaWM8W10sW2xsdm1fYW55cHRyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX2Noa2N0IDogSW50cmluc2ljPFtdLFtsbHZtX2FueXB0cl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV90ZXN0Y3QgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9DYXB0dXJlPDA+XT47CisgIGRlZiBpbnRfeGNvcmVfdGVzdHdjdCA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9DYXB0dXJlPDA+XT47CisgIGRlZiBpbnRfeGNvcmVfc2V0ZCA6IEludHJpbnNpYzxbXSxbbGx2bV9hbnlwdHJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9DYXB0dXJlPDA+XT47CisgIGRlZiBpbnRfeGNvcmVfc2V0YyA6IEludHJpbnNpYzxbXSxbbGx2bV9hbnlwdHJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9DYXB0dXJlPDA+XT47CisgIGRlZiBpbnRfeGNvcmVfaW5zaHIgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9hbnlwdHJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9DYXB0dXJlPDA+XT47CisgIGRlZiBpbnRfeGNvcmVfb3V0c2hyIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1fYW55cHRyX3R5LCBsbHZtX2kzMl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX3NldHB0IDogSW50cmluc2ljPFtdLFtsbHZtX2FueXB0cl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9jbHJwdCA6IEludHJpbnNpYzxbXSxbbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9nZXR0cyA6IEludHJpbnNpYzxbbGx2bV9pMzJfdHldLFtsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX3N5bmNyIDogSW50cmluc2ljPFtdLFtsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX3NldHR3IDogSW50cmluc2ljPFtdLFtsbHZtX2FueXB0cl90eSwgbGx2bV9pMzJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9zZXR2IDogSW50cmluc2ljPFtdLFtsbHZtX2FueXB0cl90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX3NldGV2IDogSW50cmluc2ljPFtdLFtsbHZtX2FueXB0cl90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9lZXUgOiBJbnRyaW5zaWM8W10sW2xsdm1fYW55cHRyX3R5XSwgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX2VkdSA6IEludHJpbnNpYzxbXSxbbGx2bV9hbnlwdHJfdHldLCBbTm9DYXB0dXJlPDA+XT47CisgIGRlZiBpbnRfeGNvcmVfc2V0Y2xrIDogSW50cmluc2ljPFtdLFtsbHZtX2FueXB0cl90eSwgbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9DYXB0dXJlPDA+LCBOb0NhcHR1cmU8MT5dPjsKKyAgZGVmIGludF94Y29yZV9zZXRyZHkgOiBJbnRyaW5zaWM8W10sW2xsdm1fYW55cHRyX3R5LCBsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD4sIE5vQ2FwdHVyZTwxPl0+OworICBkZWYgaW50X3hjb3JlX3NldHBzYyA6IEludHJpbnNpYzxbXSxbbGx2bV9hbnlwdHJfdHksIGxsdm1faTMyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX3BlZWsgOiBJbnRyaW5zaWM8W2xsdm1faTMyX3R5XSxbbGx2bV9hbnlwdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX2VuZGluIDogSW50cmluc2ljPFtsbHZtX2kzMl90eV0sW2xsdm1fYW55cHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKworICAvLyBJbnRyaW5zaWNzIGZvciBldmVudHMuCisgIGRlZiBpbnRfeGNvcmVfd2FpdGV2ZW50IDogSW50cmluc2ljPFtsbHZtX3B0cl90eV0sW10sIFtJbnRyUmVhZE1lbV0+OworCisgIC8vIElmIGFueSBvZiB0aGUgcmVzb3VyY2VzIG93bmVkIGJ5IHRoZSB0aHJlYWQgYXJlIHJlYWR5IHRoaXMgcmV0dXJucyB0aGUKKyAgLy8gdmVjdG9yIG9mIG9uZSBvZiB0aGUgcmVhZHkgcmVzb3VyY2VzLiBJZiBubyByZXNvdXJjZXMgb3duZWQgYnkgdGhlIHRocmVhZAorICAvLyBhcmUgcmVhZHkgdGhlbiB0aGUgb3BlcmFuZCBwYXNzZWQgdG8gdGhlIGludHJpbnNpYyBpcyByZXR1cm5lZC4KKyAgZGVmIGludF94Y29yZV9jaGVja2V2ZW50IDogSW50cmluc2ljPFtsbHZtX3B0cl90eV0sW2xsdm1fcHRyX3R5XT47CisKKyAgZGVmIGludF94Y29yZV9jbHJlIDogSW50cmluc2ljPFtdLFtdLFtdPjsKKworICAvLyBJbnRyaW5zaWNzIGZvciB0aHJlYWRzLgorICBkZWYgaW50X3hjb3JlX2dldHN0IDogSW50cmluc2ljIDxbbGx2bV9hbnlwdHJfdHldLFtsbHZtX2FueXB0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9tc3luYyA6IEludHJpbnNpYyA8W10sW2xsdm1fYW55cHRyX3R5XSwgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX3NzeW5jIDogSW50cmluc2ljIDxbXSxbXT47CisgIGRlZiBpbnRfeGNvcmVfbWpvaW4gOiBJbnRyaW5zaWMgPFtdLFtsbHZtX2FueXB0cl90eV0sIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9pbml0c3AgOiBJbnRyaW5zaWMgPFtdLFtsbHZtX2FueXB0cl90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX2luaXRwYyA6IEludHJpbnNpYyA8W10sW2xsdm1fYW55cHRyX3R5LCBsbHZtX3B0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9DYXB0dXJlPDA+XT47CisgIGRlZiBpbnRfeGNvcmVfaW5pdGxyIDogSW50cmluc2ljIDxbXSxbbGx2bV9hbnlwdHJfdHksIGxsdm1fcHRyX3R5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtOb0NhcHR1cmU8MD5dPjsKKyAgZGVmIGludF94Y29yZV9pbml0Y3AgOiBJbnRyaW5zaWMgPFtdLFtsbHZtX2FueXB0cl90eSwgbGx2bV9wdHJfdHldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW05vQ2FwdHVyZTwwPl0+OworICBkZWYgaW50X3hjb3JlX2luaXRkcCA6IEludHJpbnNpYyA8W10sW2xsdm1fYW55cHRyX3R5LCBsbHZtX3B0cl90eV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbTm9DYXB0dXJlPDA+XT47Cit9CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0xMVk1Db250ZXh0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0xMVk1Db250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTc3OGI0MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTExWTUNvbnRleHQuaApAQCAtMCwwICsxLDM0OSBAQAorLy89PT0tIGxsdm0vTExWTUNvbnRleHQuaCAtIENsYXNzIGZvciBtYW5hZ2luZyAiZ2xvYmFsIiBzdGF0ZSAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgTExWTUNvbnRleHQsIGEgY29udGFpbmVyIG9mICJnbG9iYWwiIHN0YXRlIGluIExMVk0sIHN1Y2gKKy8vIGFzIHRoZSBnbG9iYWwgdHlwZSBhbmQgY29uc3RhbnQgdW5pcXVpbmcgdGFibGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9MTFZNQ09OVEVYVF9ICisjZGVmaW5lIExMVk1fSVJfTExWTUNPTlRFWFRfSAorCisjaW5jbHVkZSAibGx2bS1jL1R5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EaWFnbm9zdGljSGFuZGxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DQmluZGluZ1dyYXBwaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L09wdGlvbnMuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRGlhZ25vc3RpY0luZm87CitlbnVtIERpYWdub3N0aWNTZXZlcml0eSA6IGNoYXI7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgTExWTUNvbnRleHRJbXBsOworY2xhc3MgTW9kdWxlOworY2xhc3MgT3B0UGFzc0dhdGU7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgU21hbGxWZWN0b3JJbXBsOworY2xhc3MgU01EaWFnbm9zdGljOworY2xhc3MgU3RyaW5nUmVmOworY2xhc3MgVHdpbmU7CisKK25hbWVzcGFjZSB5YW1sIHsKKworY2xhc3MgT3V0cHV0OworCit9IC8vIGVuZCBuYW1lc3BhY2UgeWFtbAorCituYW1lc3BhY2UgU3luY1Njb3BlIHsKKwordHlwZWRlZiB1aW50OF90IElEOworCisvLy8gS25vd24gc3luY2hyb25pemF0aW9uIHNjb3BlIElEcywgd2hpY2ggYWx3YXlzIGhhdmUgdGhlIHNhbWUgdmFsdWUuICBBbGwKKy8vLyBzeW5jaHJvbml6YXRpb24gc2NvcGUgSURzIHRoYXQgTExWTSBoYXMgc3BlY2lhbCBrbm93bGVkZ2Ugb2YgYXJlIGxpc3RlZAorLy8vIGhlcmUuICBBZGRpdGlvbmFsbHksIHRoaXMgc2NoZW1lIGFsbG93cyBMTFZNIHRvIGVmZmljaWVudGx5IGNoZWNrIGZvcgorLy8vIHNwZWNpZmljIHN5bmNocm9uaXphdGlvbiBzY29wZSBJRCB3aXRob3V0IGNvbXBhcmluZyBzdHJpbmdzLgorZW51bSB7CisgIC8vLyBTeW5jaHJvbml6ZWQgd2l0aCByZXNwZWN0IHRvIHNpZ25hbCBoYW5kbGVycyBleGVjdXRpbmcgaW4gdGhlIHNhbWUgdGhyZWFkLgorICBTaW5nbGVUaHJlYWQgPSAwLAorCisgIC8vLyBTeW5jaHJvbml6ZWQgd2l0aCByZXNwZWN0IHRvIGFsbCBjb25jdXJyZW50bHkgZXhlY3V0aW5nIHRocmVhZHMuCisgIFN5c3RlbSA9IDEKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBTeW5jU2NvcGUKKworLy8vIFRoaXMgaXMgYW4gaW1wb3J0YW50IGNsYXNzIGZvciB1c2luZyBMTFZNIGluIGEgdGhyZWFkZWQgY29udGV4dC4gIEl0CisvLy8gKG9wYXF1ZWx5KSBvd25zIGFuZCBtYW5hZ2VzIHRoZSBjb3JlICJnbG9iYWwiIGRhdGEgb2YgTExWTSdzIGNvcmUKKy8vLyBpbmZyYXN0cnVjdHVyZSwgaW5jbHVkaW5nIHRoZSB0eXBlIGFuZCBjb25zdGFudCB1bmlxdWluZyB0YWJsZXMuCisvLy8gTExWTUNvbnRleHQgaXRzZWxmIHByb3ZpZGVzIG5vIGxvY2tpbmcgZ3VhcmFudGVlcywgc28geW91IHNob3VsZCBiZSBjYXJlZnVsCisvLy8gdG8gaGF2ZSBvbmUgY29udGV4dCBwZXIgdGhyZWFkLgorY2xhc3MgTExWTUNvbnRleHQgeworcHVibGljOgorICBMTFZNQ29udGV4dEltcGwgKmNvbnN0IHBJbXBsOworICBMTFZNQ29udGV4dCgpOworICBMTFZNQ29udGV4dChMTFZNQ29udGV4dCAmKSA9IGRlbGV0ZTsKKyAgTExWTUNvbnRleHQgJm9wZXJhdG9yPShjb25zdCBMTFZNQ29udGV4dCAmKSA9IGRlbGV0ZTsKKyAgfkxMVk1Db250ZXh0KCk7CisKKyAgLy8gUGlubmVkIG1ldGFkYXRhIG5hbWVzLCB3aGljaCBhbHdheXMgaGF2ZSB0aGUgc2FtZSB2YWx1ZS4gIFRoaXMgaXMgYQorICAvLyBjb21waWxlLXRpbWUgcGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uLCBub3QgYSBjb3JyZWN0bmVzcyBvcHRpbWl6YXRpb24uCisgIGVudW0gOiB1bnNpZ25lZCB7CisgICAgTURfZGJnID0gMCwgICAgICAgICAgICAgICAgICAgICAgIC8vICJkYmciCisgICAgTURfdGJhYSA9IDEsICAgICAgICAgICAgICAgICAgICAgIC8vICJ0YmFhIgorICAgIE1EX3Byb2YgPSAyLCAgICAgICAgICAgICAgICAgICAgICAvLyAicHJvZiIKKyAgICBNRF9mcG1hdGggPSAzLCAgICAgICAgICAgICAgICAgICAgLy8gImZwbWF0aCIKKyAgICBNRF9yYW5nZSA9IDQsICAgICAgICAgICAgICAgICAgICAgLy8gInJhbmdlIgorICAgIE1EX3RiYWFfc3RydWN0ID0gNSwgICAgICAgICAgICAgICAvLyAidGJhYS5zdHJ1Y3QiCisgICAgTURfaW52YXJpYW50X2xvYWQgPSA2LCAgICAgICAgICAgIC8vICJpbnZhcmlhbnQubG9hZCIKKyAgICBNRF9hbGlhc19zY29wZSA9IDcsICAgICAgICAgICAgICAgLy8gImFsaWFzLnNjb3BlIgorICAgIE1EX25vYWxpYXMgPSA4LCAgICAgICAgICAgICAgICAgICAvLyAibm9hbGlhcyIsCisgICAgTURfbm9udGVtcG9yYWwgPSA5LCAgICAgICAgICAgICAgIC8vICJub250ZW1wb3JhbCIKKyAgICBNRF9tZW1fcGFyYWxsZWxfbG9vcF9hY2Nlc3MgPSAxMCwgLy8gImxsdm0ubWVtLnBhcmFsbGVsX2xvb3BfYWNjZXNzIgorICAgIE1EX25vbm51bGwgPSAxMSwgICAgICAgICAgICAgICAgICAvLyAibm9ubnVsbCIKKyAgICBNRF9kZXJlZmVyZW5jZWFibGUgPSAxMiwgICAgICAgICAgLy8gImRlcmVmZXJlbmNlYWJsZSIKKyAgICBNRF9kZXJlZmVyZW5jZWFibGVfb3JfbnVsbCA9IDEzLCAgLy8gImRlcmVmZXJlbmNlYWJsZV9vcl9udWxsIgorICAgIE1EX21ha2VfaW1wbGljaXQgPSAxNCwgICAgICAgICAgICAvLyAibWFrZS5pbXBsaWNpdCIKKyAgICBNRF91bnByZWRpY3RhYmxlID0gMTUsICAgICAgICAgICAgLy8gInVucHJlZGljdGFibGUiCisgICAgTURfaW52YXJpYW50X2dyb3VwID0gMTYsICAgICAgICAgIC8vICJpbnZhcmlhbnQuZ3JvdXAiCisgICAgTURfYWxpZ24gPSAxNywgICAgICAgICAgICAgICAgICAgIC8vICJhbGlnbiIKKyAgICBNRF9sb29wID0gMTgsICAgICAgICAgICAgICAgICAgICAgLy8gImxsdm0ubG9vcCIKKyAgICBNRF90eXBlID0gMTksICAgICAgICAgICAgICAgICAgICAgLy8gInR5cGUiCisgICAgTURfc2VjdGlvbl9wcmVmaXggPSAyMCwgICAgICAgICAgIC8vICJzZWN0aW9uX3ByZWZpeCIKKyAgICBNRF9hYnNvbHV0ZV9zeW1ib2wgPSAyMSwgICAgICAgICAgLy8gImFic29sdXRlX3N5bWJvbCIKKyAgICBNRF9hc3NvY2lhdGVkID0gMjIsICAgICAgICAgICAgICAgLy8gImFzc29jaWF0ZWQiCisgICAgTURfY2FsbGVlcyA9IDIzLCAgICAgICAgICAgICAgICAgIC8vICJjYWxsZWVzIgorICAgIE1EX2lycl9sb29wID0gMjQsICAgICAgICAgICAgICAgICAvLyAiaXJyX2xvb3AiCisgIH07CisKKyAgLy8vIEtub3duIG9wZXJhbmQgYnVuZGxlIHRhZyBJRHMsIHdoaWNoIGFsd2F5cyBoYXZlIHRoZSBzYW1lIHZhbHVlLiAgQWxsCisgIC8vLyBvcGVyYW5kIGJ1bmRsZSB0YWdzIHRoYXQgTExWTSBoYXMgc3BlY2lhbCBrbm93bGVkZ2Ugb2YgYXJlIGxpc3RlZCBoZXJlLgorICAvLy8gQWRkaXRpb25hbGx5LCB0aGlzIHNjaGVtZSBhbGxvd3MgTExWTSB0byBlZmZpY2llbnRseSBjaGVjayBmb3Igc3BlY2lmaWMKKyAgLy8vIG9wZXJhbmQgYnVuZGxlIHRhZ3Mgd2l0aG91dCBjb21wYXJpbmcgc3RyaW5ncy4KKyAgZW51bSA6IHVuc2lnbmVkIHsKKyAgICBPQl9kZW9wdCA9IDAsICAgICAgICAgLy8gImRlb3B0IgorICAgIE9CX2Z1bmNsZXQgPSAxLCAgICAgICAvLyAiZnVuY2xldCIKKyAgICBPQl9nY190cmFuc2l0aW9uID0gMiwgLy8gImdjLXRyYW5zaXRpb24iCisgIH07CisKKyAgLy8vIGdldE1ES2luZElEIC0gUmV0dXJuIGEgdW5pcXVlIG5vbi16ZXJvIElEIGZvciB0aGUgc3BlY2lmaWVkIG1ldGFkYXRhIGtpbmQuCisgIC8vLyBUaGlzIElEIGlzIHVuaXF1ZWQgYWNyb3NzIG1vZHVsZXMgaW4gdGhlIGN1cnJlbnQgTExWTUNvbnRleHQuCisgIHVuc2lnbmVkIGdldE1ES2luZElEKFN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKworICAvLy8gZ2V0TURLaW5kTmFtZXMgLSBQb3B1bGF0ZSBjbGllbnQgc3VwcGxpZWQgU21hbGxWZWN0b3Igd2l0aCB0aGUgbmFtZSBmb3IKKyAgLy8vIGN1c3RvbSBtZXRhZGF0YSBJRHMgcmVnaXN0ZXJlZCBpbiB0aGlzIExMVk1Db250ZXh0LgorICB2b2lkIGdldE1ES2luZE5hbWVzKFNtYWxsVmVjdG9ySW1wbDxTdHJpbmdSZWY+ICZSZXN1bHQpIGNvbnN0OworCisgIC8vLyBnZXRPcGVyYW5kQnVuZGxlVGFncyAtIFBvcHVsYXRlIGNsaWVudCBzdXBwbGllZCBTbWFsbFZlY3RvciB3aXRoIHRoZQorICAvLy8gYnVuZGxlIHRhZ3MgcmVnaXN0ZXJlZCBpbiB0aGlzIExMVk1Db250ZXh0LiAgVGhlIGJ1bmRsZSB0YWdzIGFyZSBvcmRlcmVkCisgIC8vLyBieSBpbmNyZWFzaW5nIGJ1bmRsZSBJRHMuCisgIC8vLyBcc2VlIExMVk1Db250ZXh0OjpnZXRPcGVyYW5kQnVuZGxlVGFnSUQKKyAgdm9pZCBnZXRPcGVyYW5kQnVuZGxlVGFncyhTbWFsbFZlY3RvckltcGw8U3RyaW5nUmVmPiAmUmVzdWx0KSBjb25zdDsKKworICAvLy8gZ2V0T3BlcmFuZEJ1bmRsZVRhZ0lEIC0gTWFwcyBhIGJ1bmRsZSB0YWcgdG8gYW4gaW50ZWdlciBJRC4gIEV2ZXJ5IGJ1bmRsZQorICAvLy8gdGFnIHJlZ2lzdGVyZWQgd2l0aCBhbiBMTFZNQ29udGV4dCBoYXMgYW4gdW5pcXVlIElELgorICB1aW50MzJfdCBnZXRPcGVyYW5kQnVuZGxlVGFnSUQoU3RyaW5nUmVmIFRhZykgY29uc3Q7CisKKyAgLy8vIGdldE9ySW5zZXJ0U3luY1Njb3BlSUQgLSBNYXBzIHN5bmNocm9uaXphdGlvbiBzY29wZSBuYW1lIHRvCisgIC8vLyBzeW5jaHJvbml6YXRpb24gc2NvcGUgSUQuICBFdmVyeSBzeW5jaHJvbml6YXRpb24gc2NvcGUgcmVnaXN0ZXJlZCB3aXRoCisgIC8vLyBMTFZNQ29udGV4dCBoYXMgdW5pcXVlIElEIGV4Y2VwdCBwcmUtZGVmaW5lZCBvbmVzLgorICBTeW5jU2NvcGU6OklEIGdldE9ySW5zZXJ0U3luY1Njb3BlSUQoU3RyaW5nUmVmIFNTTik7CisKKyAgLy8vIGdldFN5bmNTY29wZU5hbWVzIC0gUG9wdWxhdGVzIGNsaWVudCBzdXBwbGllZCBTbWFsbFZlY3RvciB3aXRoCisgIC8vLyBzeW5jaHJvbml6YXRpb24gc2NvcGUgbmFtZXMgcmVnaXN0ZXJlZCB3aXRoIExMVk1Db250ZXh0LiAgU3luY2hyb25pemF0aW9uCisgIC8vLyBzY29wZSBuYW1lcyBhcmUgb3JkZXJlZCBieSBpbmNyZWFzaW5nIHN5bmNocm9uaXphdGlvbiBzY29wZSBJRHMuCisgIHZvaWQgZ2V0U3luY1Njb3BlTmFtZXMoU21hbGxWZWN0b3JJbXBsPFN0cmluZ1JlZj4gJlNTTnMpIGNvbnN0OworCisgIC8vLyBEZWZpbmUgdGhlIEdDIGZvciBhIGZ1bmN0aW9uCisgIHZvaWQgc2V0R0MoY29uc3QgRnVuY3Rpb24gJkZuLCBzdGQ6OnN0cmluZyBHQ05hbWUpOworCisgIC8vLyBSZXR1cm4gdGhlIEdDIGZvciBhIGZ1bmN0aW9uCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRHQyhjb25zdCBGdW5jdGlvbiAmRm4pOworCisgIC8vLyBSZW1vdmUgdGhlIEdDIGZvciBhIGZ1bmN0aW9uCisgIHZvaWQgZGVsZXRlR0MoY29uc3QgRnVuY3Rpb24gJkZuKTsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIENvbnRleHQgcnVudGltZSBjb25maWd1cmF0aW9uIGlzIHNldCB0byBkaXNjYXJkIGFsbAorICAvLy8gdmFsdWUgbmFtZXMuIFdoZW4gdHJ1ZSwgb25seSBHbG9iYWxWYWx1ZSBuYW1lcyB3aWxsIGJlIGF2YWlsYWJsZSBpbiB0aGUKKyAgLy8vIElSLgorICBib29sIHNob3VsZERpc2NhcmRWYWx1ZU5hbWVzKCkgY29uc3Q7CisKKyAgLy8vIFNldCB0aGUgQ29udGV4dCBydW50aW1lIGNvbmZpZ3VyYXRpb24gdG8gZGlzY2FyZCBhbGwgdmFsdWUgbmFtZSAoYnV0CisgIC8vLyBHbG9iYWxWYWx1ZSkuIENsaWVudHMgY2FuIHVzZSB0aGlzIGZsYWcgdG8gc2F2ZSBtZW1vcnkgYW5kIHJ1bnRpbWUsCisgIC8vLyBlc3BlY2lhbGx5IGluIHJlbGVhc2UgbW9kZS4KKyAgdm9pZCBzZXREaXNjYXJkVmFsdWVOYW1lcyhib29sIERpc2NhcmQpOworCisgIC8vLyBXaGV0aGVyIHRoZXJlIGlzIGEgc3RyaW5nIG1hcCBmb3IgdW5pcXVpbmcgZGVidWcgaW5mbworICAvLy8gaWRlbnRpZmllcnMgYWNyb3NzIHRoZSBjb250ZXh0LiAgT2ZmIGJ5IGRlZmF1bHQuCisgIGJvb2wgaXNPRFJVbmlxdWluZ0RlYnVnVHlwZXMoKSBjb25zdDsKKyAgdm9pZCBlbmFibGVEZWJ1Z1R5cGVPRFJVbmlxdWluZygpOworICB2b2lkIGRpc2FibGVEZWJ1Z1R5cGVPRFJVbmlxdWluZygpOworCisgIHVzaW5nIElubGluZUFzbURpYWdIYW5kbGVyVHkgPSB2b2lkICgqKShjb25zdCBTTURpYWdub3N0aWMmLCB2b2lkICpDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTG9jQ29va2llKTsKKworICAvLy8gRGVmaW5lcyB0aGUgdHlwZSBvZiBhIHlpZWxkIGNhbGxiYWNrLgorICAvLy8gXHNlZSBMTFZNQ29udGV4dDo6c2V0WWllbGRDYWxsYmFjay4KKyAgdXNpbmcgWWllbGRDYWxsYmFja1R5ID0gdm9pZCAoKikoTExWTUNvbnRleHQgKkNvbnRleHQsIHZvaWQgKk9wYXF1ZUhhbmRsZSk7CisKKyAgLy8vIHNldElubGluZUFzbURpYWdub3N0aWNIYW5kbGVyIC0gVGhpcyBtZXRob2Qgc2V0cyBhIGhhbmRsZXIgdGhhdCBpcyBpbnZva2VkCisgIC8vLyB3aGVuIHByb2JsZW1zIHdpdGggaW5saW5lIGFzbSBhcmUgZGV0ZWN0ZWQgYnkgdGhlIGJhY2tlbmQuICBUaGUgZmlyc3QKKyAgLy8vIGFyZ3VtZW50IGlzIGEgZnVuY3Rpb24gcG9pbnRlciBhbmQgdGhlIHNlY29uZCBpcyBhIGNvbnRleHQgcG9pbnRlciB0aGF0CisgIC8vLyBnZXRzIHBhc3NlZCBpbnRvIHRoZSBEaWFnSGFuZGxlci4KKyAgLy8vCisgIC8vLyBMTFZNQ29udGV4dCBkb2Vzbid0IHRha2Ugb3duZXJzaGlwIG9yIGludGVycHJldCBlaXRoZXIgb2YgdGhlc2UKKyAgLy8vIHBvaW50ZXJzLgorICB2b2lkIHNldElubGluZUFzbURpYWdub3N0aWNIYW5kbGVyKElubGluZUFzbURpYWdIYW5kbGVyVHkgRGlhZ0hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqRGlhZ0NvbnRleHQgPSBudWxscHRyKTsKKworICAvLy8gZ2V0SW5saW5lQXNtRGlhZ25vc3RpY0hhbmRsZXIgLSBSZXR1cm4gdGhlIGRpYWdub3N0aWMgaGFuZGxlciBzZXQgYnkKKyAgLy8vIHNldElubGluZUFzbURpYWdub3N0aWNIYW5kbGVyLgorICBJbmxpbmVBc21EaWFnSGFuZGxlclR5IGdldElubGluZUFzbURpYWdub3N0aWNIYW5kbGVyKCkgY29uc3Q7CisKKyAgLy8vIGdldElubGluZUFzbURpYWdub3N0aWNDb250ZXh0IC0gUmV0dXJuIHRoZSBkaWFnbm9zdGljIGNvbnRleHQgc2V0IGJ5CisgIC8vLyBzZXRJbmxpbmVBc21EaWFnbm9zdGljSGFuZGxlci4KKyAgdm9pZCAqZ2V0SW5saW5lQXNtRGlhZ25vc3RpY0NvbnRleHQoKSBjb25zdDsKKworICAvLy8gc2V0RGlhZ25vc3RpY0hhbmRsZXJDYWxsQmFjayAtIFRoaXMgbWV0aG9kIHNldHMgYSBoYW5kbGVyIGNhbGwgYmFjaworICAvLy8gdGhhdCBpcyBpbnZva2VkIHdoZW4gdGhlIGJhY2tlbmQgbmVlZHMgdG8gcmVwb3J0IGFueXRoaW5nIHRvIHRoZSB1c2VyLgorICAvLy8gVGhlIGZpcnN0IGFyZ3VtZW50IGlzIGEgZnVuY3Rpb24gcG9pbnRlciBhbmQgdGhlIHNlY29uZCBpcyBhIGNvbnRleHQgcG9pbnRlcgorICAvLy8gdGhhdCBnZXRzIHBhc3NlZCBpbnRvIHRoZSBEaWFnSGFuZGxlci4gIFRoZSB0aGlyZCBhcmd1bWVudCBzaG91bGQgYmUgc2V0IHRvCisgIC8vLyB0cnVlIGlmIHRoZSBoYW5kbGVyIG9ubHkgZXhwZWN0cyBlbmFibGVkIGRpYWdub3N0aWNzLgorICAvLy8KKyAgLy8vIExMVk1Db250ZXh0IGRvZXNuJ3QgdGFrZSBvd25lcnNoaXAgb3IgaW50ZXJwcmV0IGVpdGhlciBvZiB0aGVzZQorICAvLy8gcG9pbnRlcnMuCisgIHZvaWQgc2V0RGlhZ25vc3RpY0hhbmRsZXJDYWxsQmFjaygKKyAgICAgIERpYWdub3N0aWNIYW5kbGVyOjpEaWFnbm9zdGljSGFuZGxlclR5IERpYWdIYW5kbGVyLAorICAgICAgdm9pZCAqRGlhZ0NvbnRleHQgPSBudWxscHRyLCBib29sIFJlc3BlY3RGaWx0ZXJzID0gZmFsc2UpOworCisgIC8vLyBzZXREaWFnbm9zdGljSGFuZGxlciAtIFRoaXMgbWV0aG9kIHNldHMgdW5pcXVlX3B0ciB0byBvYmplY3Qgb2YgRGlhZ25vc3RpY0hhbmRsZXIKKyAgLy8vIHRvIHByb3ZpZGUgY3VzdG9tIGRpYWdub3N0aWMgaGFuZGxpbmcuIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB1bmlxdWVfcHRyIG9mIG9iamVjdAorICAvLy8gb2YgdHlwZSBEaWFnbm9zdGljSGFuZGxlciBvciBhIGRlcml2ZWQgb2YgdGhhdC4gICBUaGUgdGhpcmQgYXJndW1lbnQgc2hvdWxkIGJlCisgIC8vLyBzZXQgdG8gdHJ1ZSBpZiB0aGUgaGFuZGxlciBvbmx5IGV4cGVjdHMgZW5hYmxlZCBkaWFnbm9zdGljcy4KKyAgLy8vCisgIC8vLyBPd25lcnNoaXAgb2YgdGhpcyBwb2ludGVyIGlzIG1vdmVkIHRvIExMVk1Db250ZXh0SW1wbC4KKyAgdm9pZCBzZXREaWFnbm9zdGljSGFuZGxlcihzdGQ6OnVuaXF1ZV9wdHI8RGlhZ25vc3RpY0hhbmRsZXI+ICYmREgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZXNwZWN0RmlsdGVycyA9IGZhbHNlKTsKKworICAvLy8gZ2V0RGlhZ25vc3RpY0hhbmRsZXJDYWxsQmFjayAtIFJldHVybiB0aGUgZGlhZ25vc3RpYyBoYW5kbGVyIGNhbGwgYmFjayBzZXQgYnkKKyAgLy8vIHNldERpYWdub3N0aWNIYW5kbGVyQ2FsbEJhY2suCisgIERpYWdub3N0aWNIYW5kbGVyOjpEaWFnbm9zdGljSGFuZGxlclR5IGdldERpYWdub3N0aWNIYW5kbGVyQ2FsbEJhY2soKSBjb25zdDsKKworICAvLy8gZ2V0RGlhZ25vc3RpY0NvbnRleHQgLSBSZXR1cm4gdGhlIGRpYWdub3N0aWMgY29udGV4dCBzZXQgYnkKKyAgLy8vIHNldERpYWdub3N0aWNDb250ZXh0LgorICB2b2lkICpnZXREaWFnbm9zdGljQ29udGV4dCgpIGNvbnN0OworCisgIC8vLyBnZXREaWFnSGFuZGxlclB0ciAtIFJldHVybnMgY29uc3QgcmF3IHBvaW50ZXIgb2YgRGlhZ25vc3RpY0hhbmRsZXIgc2V0IGJ5CisgIC8vLyBzZXREaWFnbm9zdGljSGFuZGxlci4KKyAgY29uc3QgRGlhZ25vc3RpY0hhbmRsZXIgKmdldERpYWdIYW5kbGVyUHRyKCkgY29uc3Q7CisKKyAgLy8vIGdldERpYWdub3N0aWNIYW5kbGVyIC0gdHJhbnNmZXJzIG93ZW5lcnNoaXAgb2YgRGlhZ25vc3RpY0hhbmRsZXIgdW5pcXVlX3B0cgorICAvLy8gdG8gY2FsbGVyLgorICBzdGQ6OnVuaXF1ZV9wdHI8RGlhZ25vc3RpY0hhbmRsZXI+IGdldERpYWdub3N0aWNIYW5kbGVyKCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gaWYgYSBjb2RlIGhvdG5lc3MgbWV0cmljIHNob3VsZCBiZSBpbmNsdWRlZCBpbiBvcHRpbWl6YXRpb24KKyAgLy8vIGRpYWdub3N0aWNzLgorICBib29sIGdldERpYWdub3N0aWNzSG90bmVzc1JlcXVlc3RlZCgpIGNvbnN0OworICAvLy8gXGJyaWVmIFNldCBpZiBhIGNvZGUgaG90bmVzcyBtZXRyaWMgc2hvdWxkIGJlIGluY2x1ZGVkIGluIG9wdGltaXphdGlvbgorICAvLy8gZGlhZ25vc3RpY3MuCisgIHZvaWQgc2V0RGlhZ25vc3RpY3NIb3RuZXNzUmVxdWVzdGVkKGJvb2wgUmVxdWVzdGVkKTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbWluaW11bSBob3RuZXNzIHZhbHVlIGEgZGlhZ25vc3RpYyB3b3VsZCBuZWVkIGluIG9yZGVyCisgIC8vLyB0byBiZSBpbmNsdWRlZCBpbiBvcHRpbWl6YXRpb24gZGlhZ25vc3RpY3MuIElmIHRoZXJlIGlzIG5vIG1pbmltdW0sIHRoaXMKKyAgLy8vIHJldHVybnMgTm9uZS4KKyAgdWludDY0X3QgZ2V0RGlhZ25vc3RpY3NIb3RuZXNzVGhyZXNob2xkKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIG1pbmltdW0gaG90bmVzcyB2YWx1ZSBhIGRpYWdub3N0aWMgbmVlZHMgaW4gb3JkZXIgdG8gYmUKKyAgLy8vIGluY2x1ZGVkIGluIG9wdGltaXphdGlvbiBkaWFnbm9zdGljcy4KKyAgdm9pZCBzZXREaWFnbm9zdGljc0hvdG5lc3NUaHJlc2hvbGQodWludDY0X3QgVGhyZXNob2xkKTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgWUFNTCBmaWxlIHVzZWQgYnkgdGhlIGJhY2tlbmQgdG8gc2F2ZSBvcHRpbWl6YXRpb24KKyAgLy8vIGRpYWdub3N0aWNzLiAgSWYgbnVsbCwgZGlhZ25vc3RpY3MgYXJlIG5vdCBzYXZlZCBpbiBhIGZpbGUgYnV0IG9ubHkKKyAgLy8vIGVtaXR0ZWQgdmlhIHRoZSBkaWFnbm9zdGljIGhhbmRsZXIuCisgIHlhbWw6Ok91dHB1dCAqZ2V0RGlhZ25vc3RpY3NPdXRwdXRGaWxlKCk7CisgIC8vLyBTZXQgdGhlIGRpYWdub3N0aWNzIG91dHB1dCBmaWxlIHVzZWQgZm9yIG9wdGltaXphdGlvbiBkaWFnbm9zdGljcy4KKyAgLy8vCisgIC8vLyBCeSBkZWZhdWx0IG9yIGlmIGludm9rZWQgd2l0aCBudWxsLCBkaWFnbm9zdGljcyBhcmUgbm90IHNhdmVkIGluIGEgZmlsZQorICAvLy8gYnV0IG9ubHkgZW1pdHRlZCB2aWEgdGhlIGRpYWdub3N0aWMgaGFuZGxlci4gIEV2ZW4gaWYgYW4gb3V0cHV0IGZpbGUgaXMKKyAgLy8vIHNldCwgdGhlIGhhbmRsZXIgaXMgaW52b2tlZCBmb3IgZWFjaCBkaWFnbm9zdGljIG1lc3NhZ2UuCisgIHZvaWQgc2V0RGlhZ25vc3RpY3NPdXRwdXRGaWxlKHN0ZDo6dW5pcXVlX3B0cjx5YW1sOjpPdXRwdXQ+IEYpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBwcmVmaXggdGhhdCBzaG91bGQgYmUgcHJpbnRlZCBpbiBmcm9udCBvZiBhIGRpYWdub3N0aWMgb2YKKyAgLy8vICAgICAgICB0aGUgZ2l2ZW4gXHAgU2V2ZXJpdHkKKyAgc3RhdGljIGNvbnN0IGNoYXIgKmdldERpYWdub3N0aWNNZXNzYWdlUHJlZml4KERpYWdub3N0aWNTZXZlcml0eSBTZXZlcml0eSk7CisKKyAgLy8vIFxicmllZiBSZXBvcnQgYSBtZXNzYWdlIHRvIHRoZSBjdXJyZW50bHkgaW5zdGFsbGVkIGRpYWdub3N0aWMgaGFuZGxlci4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMsIGluIHBhcnRpY3VsYXIgaW4gdGhlIGNhc2Ugb2YgZXJyb3IgcmVwb3J0aW5nCisgIC8vLyAoREkuU2V2ZXJpdHkgPT0gXGEgRFNfRXJyb3IpLCBzbyB0aGUgY2FsbGVyIHNob3VsZCBsZWF2ZSB0aGUgY29tcGlsYXRpb24KKyAgLy8vIHByb2Nlc3MgaW4gYSBzZWxmLWNvbnNpc3RlbnQgc3RhdGUsIGV2ZW4gdGhvdWdoIHRoZSBnZW5lcmF0ZWQgY29kZQorICAvLy8gbmVlZCBub3QgYmUgY29ycmVjdC4KKyAgLy8vCisgIC8vLyBUaGUgZGlhZ25vc3RpYyBtZXNzYWdlIHdpbGwgYmUgaW1wbGljaXRseSBwcmVmaXhlZCB3aXRoIGEgc2V2ZXJpdHkga2V5d29yZAorICAvLy8gYWNjb3JkaW5nIHRvIFxwIERJLmdldFNldmVyaXR5KCksIGkuZS4sICJlcnJvcjogIiBmb3IgXGEgRFNfRXJyb3IsCisgIC8vLyAid2FybmluZzogIiBmb3IgXGEgRFNfV2FybmluZywgYW5kICJub3RlOiAiIGZvciBcYSBEU19Ob3RlLgorICB2b2lkIGRpYWdub3NlKGNvbnN0IERpYWdub3N0aWNJbmZvICZESSk7CisKKyAgLy8vIFxicmllZiBSZWdpc3RlcnMgYSB5aWVsZCBjYWxsYmFjayB3aXRoIHRoZSBnaXZlbiBjb250ZXh0LgorICAvLy8KKyAgLy8vIFRoZSB5aWVsZCBjYWxsYmFjayBmdW5jdGlvbiBtYXkgYmUgY2FsbGVkIGJ5IExMVk0gdG8gdHJhbnNmZXIgY29udHJvbCBiYWNrCisgIC8vLyB0byB0aGUgY2xpZW50IHRoYXQgaW52b2tlZCB0aGUgTExWTSBjb21waWxhdGlvbi4gVGhpcyBjYW4gYmUgdXNlZCB0byB5aWVsZAorICAvLy8gY29udHJvbCBvZiB0aGUgdGhyZWFkLCBvciBwZXJmb3JtIHBlcmlvZGljIHdvcmsgbmVlZGVkIGJ5IHRoZSBjbGllbnQuCisgIC8vLyBUaGVyZSBpcyBubyBndWFyYW50ZWVkIGZyZXF1ZW5jeSBhdCB3aGljaCBjYWxsYmFja3MgbXVzdCBvY2N1cjsgaW4gZmFjdCwKKyAgLy8vIHRoZSBjbGllbnQgaXMgbm90IGd1YXJhbnRlZWQgdG8gZXZlciByZWNlaXZlIHRoaXMgY2FsbGJhY2suIEl0IGlzIGF0IHRoZQorICAvLy8gc29sZSBkaXNjcmV0aW9uIG9mIExMVk0gdG8gZG8gc28gYW5kIG9ubHkgaWYgaXQgY2FuIGd1YXJhbnRlZSB0aGF0CisgIC8vLyBzdXNwZW5kaW5nIHRoZSB0aHJlYWQgd29uJ3QgYmxvY2sgYW55IGZvcndhcmQgcHJvZ3Jlc3MgaW4gb3RoZXIgTExWTQorICAvLy8gY29udGV4dHMgaW4gdGhlIHNhbWUgcHJvY2Vzcy4KKyAgLy8vCisgIC8vLyBBdCBhIHN1c3BlbmQgcG9pbnQsIHRoZSBzdGF0ZSBvZiB0aGUgY3VycmVudCBMTFZNIGNvbnRleHQgaXMgaW50ZW50aW9uYWxseQorICAvLy8gdW5kZWZpbmVkLiBObyBhc3N1bXB0aW9ucyBhYm91dCBpdCBjYW4gb3Igc2hvdWxkIGJlIG1hZGUuIE9ubHkgTExWTQorICAvLy8gY29udGV4dCBBUEkgY2FsbHMgdGhhdCBleHBsaWNpdGx5IHN0YXRlIHRoYXQgdGhleSBjYW4gYmUgdXNlZCBkdXJpbmcgYQorICAvLy8geWllbGQgY2FsbGJhY2sgYXJlIGFsbG93ZWQgdG8gYmUgdXNlZC4gQW55IG90aGVyIEFQSSBjYWxscyBpbnRvIHRoZQorICAvLy8gY29udGV4dCBhcmUgbm90IHN1cHBvcnRlZCB1bnRpbCB0aGUgeWllbGQgY2FsbGJhY2sgZnVuY3Rpb24gcmV0dXJucworICAvLy8gY29udHJvbCB0byBMTFZNLiBPdGhlciBMTFZNIGNvbnRleHRzIGFyZSB1bmFmZmVjdGVkIGJ5IHRoaXMgcmVzdHJpY3Rpb24uCisgIHZvaWQgc2V0WWllbGRDYWxsYmFjayhZaWVsZENhbGxiYWNrVHkgQ2FsbGJhY2ssIHZvaWQgKk9wYXF1ZUhhbmRsZSk7CisKKyAgLy8vIFxicmllZiBDYWxscyB0aGUgeWllbGQgY2FsbGJhY2sgKGlmIGFwcGxpY2FibGUpLgorICAvLy8KKyAgLy8vIFRoaXMgdHJhbnNmZXJzIGNvbnRyb2wgb2YgdGhlIGN1cnJlbnQgdGhyZWFkIGJhY2sgdG8gdGhlIGNsaWVudCwgd2hpY2ggbWF5CisgIC8vLyBzdXNwZW5kIHRoZSBjdXJyZW50IHRocmVhZC4gT25seSBjYWxsIHRoaXMgbWV0aG9kIHdoZW4gTExWTSBkb2Vzbid0IGhvbGQKKyAgLy8vIGFueSBnbG9iYWwgbXV0ZXggb3IgY2Fubm90IGJsb2NrIHRoZSBleGVjdXRpb24gaW4gYW5vdGhlciBMTFZNIGNvbnRleHQuCisgIHZvaWQgeWllbGQoKTsKKworICAvLy8gZW1pdEVycm9yIC0gRW1pdCBhbiBlcnJvciBtZXNzYWdlIHRvIHRoZSBjdXJyZW50bHkgaW5zdGFsbGVkIGVycm9yIGhhbmRsZXIKKyAgLy8vIHdpdGggb3B0aW9uYWwgbG9jYXRpb24gaW5mb3JtYXRpb24uICBUaGlzIGZ1bmN0aW9uIHJldHVybnMsIHNvIGNvZGUgc2hvdWxkCisgIC8vLyBiZSBwcmVwYXJlZCB0byBkcm9wIHRoZSBlcnJvbmVvdXMgY29uc3RydWN0IG9uIHRoZSBmbG9vciBhbmQgIm5vdCBjcmFzaCIuCisgIC8vLyBUaGUgZ2VuZXJhdGVkIGNvZGUgbmVlZCBub3QgYmUgY29ycmVjdC4gIFRoZSBlcnJvciBtZXNzYWdlIHdpbGwgYmUKKyAgLy8vIGltcGxpY2l0bHkgcHJlZml4ZWQgd2l0aCAiZXJyb3I6ICIgYW5kIHNob3VsZCBub3QgZW5kIHdpdGggYSAiLiIuCisgIHZvaWQgZW1pdEVycm9yKHVuc2lnbmVkIExvY0Nvb2tpZSwgY29uc3QgVHdpbmUgJkVycm9yU3RyKTsKKyAgdm9pZCBlbWl0RXJyb3IoY29uc3QgSW5zdHJ1Y3Rpb24gKkksIGNvbnN0IFR3aW5lICZFcnJvclN0cik7CisgIHZvaWQgZW1pdEVycm9yKGNvbnN0IFR3aW5lICZFcnJvclN0cik7CisKKyAgLy8vIFxicmllZiBRdWVyeSBmb3IgYSBkZWJ1ZyBvcHRpb24ncyB2YWx1ZS4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdHlwZWQgZGF0YSBwb3B1bGF0ZWQgZnJvbSBjb21tYW5kIGxpbmUgcGFyc2luZy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFZhbFQsIHR5cGVuYW1lIEJhc2UsIFZhbFQoQmFzZTo6Kk1lbSk+CisgIFZhbFQgZ2V0T3B0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBPcHRpb25SZWdpc3RyeTo6aW5zdGFuY2UoKS50ZW1wbGF0ZSBnZXQ8VmFsVCwgQmFzZSwgTWVtPigpOworICB9CisKKyAgLy8vIFxicmllZiBBY2Nlc3MgdGhlIG9iamVjdCB3aGljaCBtYW5hZ2VzIG9wdGltaXphdGlvbiBiaXNlY3Rpb24gZm9yIGZhaWx1cmUKKyAgLy8vIGFuYWx5c2lzLgorICBPcHRQYXNzR2F0ZSAmZ2V0T3B0UGFzc0dhdGUoKTsKKworcHJpdmF0ZToKKyAgLy8gTW9kdWxlIG5lZWRzIGFjY2VzcyB0byB0aGUgYWRkL3JlbW92ZU1vZHVsZSBtZXRob2RzLgorICBmcmllbmQgY2xhc3MgTW9kdWxlOworCisgIC8vLyBhZGRNb2R1bGUgLSBSZWdpc3RlciBhIG1vZHVsZSBhcyBiZWluZyBpbnN0YW50aWF0ZWQgaW4gdGhpcyBjb250ZXh0LiAgSWYKKyAgLy8vIHRoZSBjb250ZXh0IGlzIGRlbGV0ZWQsIHRoZSBtb2R1bGUgd2lsbCBiZSBkZWxldGVkIGFzIHdlbGwuCisgIHZvaWQgYWRkTW9kdWxlKE1vZHVsZSopOworCisgIC8vLyByZW1vdmVNb2R1bGUgLSBVbnJlZ2lzdGVyIGEgbW9kdWxlIGZyb20gdGhpcyBjb250ZXh0LgorICB2b2lkIHJlbW92ZU1vZHVsZShNb2R1bGUqKTsKK307CisKKy8vIENyZWF0ZSB3cmFwcGVycyBmb3IgQyBCaW5kaW5nIHR5cGVzIChzZWUgQ0JpbmRpbmdXcmFwcGluZy5oKS4KK0RFRklORV9TSU1QTEVfQ09OVkVSU0lPTl9GVU5DVElPTlMoTExWTUNvbnRleHQsIExMVk1Db250ZXh0UmVmKQorCisvKiBTcGVjaWFsaXplZCBvcGFxdWUgY29udGV4dCBjb252ZXJzaW9ucy4KKyAqLworaW5saW5lIExMVk1Db250ZXh0ICoqdW53cmFwKExMVk1Db250ZXh0UmVmKiBUeXMpIHsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8TExWTUNvbnRleHQqKj4oVHlzKTsKK30KKworaW5saW5lIExMVk1Db250ZXh0UmVmICp3cmFwKGNvbnN0IExMVk1Db250ZXh0ICoqVHlzKSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PExMVk1Db250ZXh0UmVmKj4oY29uc3RfY2FzdDxMTFZNQ29udGV4dCoqPihUeXMpKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfTExWTUNPTlRFWFRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9MZWdhY3lQYXNzTWFuYWdlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9MZWdhY3lQYXNzTWFuYWdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMzc2YTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0xlZ2FjeVBhc3NNYW5hZ2VyLmgKQEAgLTAsMCArMSwxMDYgQEAKKy8vPT09LSBMZWdhY3lQYXNzTWFuYWdlci5oIC0gTGVnYWN5IENvbnRhaW5lciBmb3IgUGFzc2VzIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGxlZ2FjeSBQYXNzTWFuYWdlciBjbGFzcy4gIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBob2xkLAorLy8gbWFpbnRhaW4sIGFuZCBvcHRpbWl6ZSBleGVjdXRpb24gb2YgUGFzc2VzLiAgVGhlIFBhc3NNYW5hZ2VyIGNsYXNzIGVuc3VyZXMKKy8vIHRoYXQgYW5hbHlzaXMgcmVzdWx0cyBhcmUgYXZhaWxhYmxlIGJlZm9yZSBhIHBhc3MgcnVucywgYW5kIHRoYXQgUGFzcydzIGFyZQorLy8gZGVzdHJveWVkIHdoZW4gdGhlIFBhc3NNYW5hZ2VyIGlzIGRlc3Ryb3llZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfTEVHQUNZUEFTU01BTkFHRVJfSAorI2RlZmluZSBMTFZNX0lSX0xFR0FDWVBBU1NNQU5BR0VSX0gKKworI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DQmluZGluZ1dyYXBwaW5nLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgUGFzczsKK2NsYXNzIE1vZHVsZTsKKworbmFtZXNwYWNlIGxlZ2FjeSB7CisKK2NsYXNzIFBhc3NNYW5hZ2VySW1wbDsKK2NsYXNzIEZ1bmN0aW9uUGFzc01hbmFnZXJJbXBsOworCisvLy8gUGFzc01hbmFnZXJCYXNlIC0gQW4gYWJzdHJhY3QgaW50ZXJmYWNlIHRvIGFsbG93IGNvZGUgdG8gYWRkIHBhc3NlcyB0bworLy8vIGEgcGFzcyBtYW5hZ2VyIHdpdGhvdXQgaGF2aW5nIHRvIGhhcmQtY29kZSB3aGF0IGtpbmQgb2YgcGFzcyBtYW5hZ2VyCisvLy8gaXQgaXMuCitjbGFzcyBQYXNzTWFuYWdlckJhc2UgeworcHVibGljOgorICB2aXJ0dWFsIH5QYXNzTWFuYWdlckJhc2UoKTsKKworICAvLy8gQWRkIGEgcGFzcyB0byB0aGUgcXVldWUgb2YgcGFzc2VzIHRvIHJ1bi4gIFRoaXMgcGFzc2VzIG93bmVyc2hpcCBvZgorICAvLy8gdGhlIFBhc3MgdG8gdGhlIFBhc3NNYW5hZ2VyLiAgV2hlbiB0aGUgUGFzc01hbmFnZXIgaXMgZGVzdHJveWVkLCB0aGUgcGFzcworICAvLy8gd2lsbCBiZSBkZXN0cm95ZWQgYXMgd2VsbCwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBkZWxldGUgdGhlIHBhc3MuICBUaGlzCisgIC8vLyBtYXkgZXZlbiBkZXN0cm95IHRoZSBwYXNzIHJpZ2h0IGF3YXkgaWYgaXQgaXMgZm91bmQgdG8gYmUgcmVkdW5kYW50LiBUaGlzCisgIC8vLyBpbXBsaWVzIHRoYXQgYWxsIHBhc3NlcyBNVVNUIGJlIGFsbG9jYXRlZCB3aXRoICduZXcnLgorICB2aXJ0dWFsIHZvaWQgYWRkKFBhc3MgKlApID0gMDsKK307CisKKy8vLyBQYXNzTWFuYWdlciBtYW5hZ2VzIE1vZHVsZVBhc3NNYW5hZ2VycworY2xhc3MgUGFzc01hbmFnZXIgOiBwdWJsaWMgUGFzc01hbmFnZXJCYXNlIHsKK3B1YmxpYzoKKworICBQYXNzTWFuYWdlcigpOworICB+UGFzc01hbmFnZXIoKSBvdmVycmlkZTsKKworICB2b2lkIGFkZChQYXNzICpQKSBvdmVycmlkZTsKKworICAvLy8gcnVuIC0gRXhlY3V0ZSBhbGwgb2YgdGhlIHBhc3NlcyBzY2hlZHVsZWQgZm9yIGV4ZWN1dGlvbi4gIEtlZXAgdHJhY2sgb2YKKyAgLy8vIHdoZXRoZXIgYW55IG9mIHRoZSBwYXNzZXMgbW9kaWZpZXMgdGhlIG1vZHVsZSwgYW5kIGlmIHNvLCByZXR1cm4gdHJ1ZS4KKyAgYm9vbCBydW4oTW9kdWxlICZNKTsKKworcHJpdmF0ZToKKyAgLy8vIFBhc3NNYW5hZ2VySW1wbF9OZXcgaXMgdGhlIGFjdHVhbCBjbGFzcy4gUGFzc01hbmFnZXIgaXMganVzdCB0aGUKKyAgLy8vIHdyYXBlciB0byBwdWJsaXNoIHNpbXBsZSBwYXNzIG1hbmFnZXIgaW50ZXJmYWNlCisgIFBhc3NNYW5hZ2VySW1wbCAqUE07Cit9OworCisvLy8gRnVuY3Rpb25QYXNzTWFuYWdlciBtYW5hZ2VzIEZ1bmN0aW9uUGFzc2VzIGFuZCBCYXNpY0Jsb2NrUGFzc01hbmFnZXJzLgorY2xhc3MgRnVuY3Rpb25QYXNzTWFuYWdlciA6IHB1YmxpYyBQYXNzTWFuYWdlckJhc2UgeworcHVibGljOgorICAvLy8gRnVuY3Rpb25QYXNzTWFuYWdlciBjdG9yIC0gVGhpcyBpbml0aWFsaXplcyB0aGUgcGFzcyBtYW5hZ2VyLiAgSXQgbmVlZHMsCisgIC8vLyBidXQgZG9lcyBub3QgdGFrZSBvd25lcnNoaXAgb2YsIHRoZSBzcGVjaWZpZWQgTW9kdWxlLgorICBleHBsaWNpdCBGdW5jdGlvblBhc3NNYW5hZ2VyKE1vZHVsZSAqTSk7CisgIH5GdW5jdGlvblBhc3NNYW5hZ2VyKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBhZGQoUGFzcyAqUCkgb3ZlcnJpZGU7CisKKyAgLy8vIHJ1biAtIEV4ZWN1dGUgYWxsIG9mIHRoZSBwYXNzZXMgc2NoZWR1bGVkIGZvciBleGVjdXRpb24uICBLZWVwCisgIC8vLyB0cmFjayBvZiB3aGV0aGVyIGFueSBvZiB0aGUgcGFzc2VzIG1vZGlmaWVzIHRoZSBmdW5jdGlvbiwgYW5kIGlmCisgIC8vLyBzbywgcmV0dXJuIHRydWUuCisgIC8vLworICBib29sIHJ1bihGdW5jdGlvbiAmRik7CisKKyAgLy8vIGRvSW5pdGlhbGl6YXRpb24gLSBSdW4gYWxsIG9mIHRoZSBpbml0aWFsaXplcnMgZm9yIHRoZSBmdW5jdGlvbiBwYXNzZXMuCisgIC8vLworICBib29sIGRvSW5pdGlhbGl6YXRpb24oKTsKKworICAvLy8gZG9GaW5hbGl6YXRpb24gLSBSdW4gYWxsIG9mIHRoZSBmaW5hbGl6ZXJzIGZvciB0aGUgZnVuY3Rpb24gcGFzc2VzLgorICAvLy8KKyAgYm9vbCBkb0ZpbmFsaXphdGlvbigpOworCitwcml2YXRlOgorICBGdW5jdGlvblBhc3NNYW5hZ2VySW1wbCAqRlBNOworICBNb2R1bGUgKk07Cit9OworCit9IC8vIEVuZCBsZWdhY3kgbmFtZXNwYWNlCisKKy8vIENyZWF0ZSB3cmFwcGVycyBmb3IgQyBCaW5kaW5nIHR5cGVzIChzZWUgQ0JpbmRpbmdXcmFwcGluZy5oKS4KK0RFRklORV9TVERDWFhfQ09OVkVSU0lPTl9GVU5DVElPTlMobGVnYWN5OjpQYXNzTWFuYWdlckJhc2UsIExMVk1QYXNzTWFuYWdlclJlZikKKworLy8vIElmIC10aW1lLXBhc3NlcyBoYXMgYmVlbiBzcGVjaWZpZWQsIHJlcG9ydCB0aGUgdGltaW5ncyBpbW1lZGlhdGVseSBhbmQgdGhlbgorLy8vIHJlc2V0IHRoZSB0aW1lcnMgdG8gemVyby4KK3ZvaWQgcmVwb3J0QW5kUmVzZXRUaW1pbmdzKCk7Cit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTGVnYWN5UGFzc01hbmFnZXJzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0xlZ2FjeVBhc3NNYW5hZ2Vycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkYzRhNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0xlZ2FjeVBhc3NNYW5hZ2Vycy5oCkBAIC0wLDAgKzEsNTA1IEBACisvLz09PS0gTGVnYWN5UGFzc01hbmFnZXJzLmggLSBMZWdhY3kgUGFzcyBJbmZyYXN0cnVjdHVyZSAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgTExWTSBQYXNzIE1hbmFnZXIgaW5mcmFzdHJ1Y3R1cmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX0xFR0FDWVBBU1NNQU5BR0VSU19ICisjZGVmaW5lIExMVk1fSVJfTEVHQUNZUEFTU01BTkFHRVJTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRm9sZGluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1Bhc3MuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBPdmVydmlldzoKKy8vIFRoZSBQYXNzIE1hbmFnZXIgSW5mcmFzdHJ1Y3R1cmUgbWFuYWdlcyBwYXNzZXMuIEl0J3MgcmVzcG9uc2liaWxpdGllcyBhcmU6CisvLworLy8gICBvIE1hbmFnZSBvcHRpbWl6YXRpb24gcGFzcyBleGVjdXRpb24gb3JkZXIKKy8vICAgbyBNYWtlIHJlcXVpcmVkIEFuYWx5c2lzIGluZm9ybWF0aW9uIGF2YWlsYWJsZSBiZWZvcmUgcGFzcyBQIGlzIHJ1bgorLy8gICBvIFJlbGVhc2UgbWVtb3J5IG9jY3VwaWVkIGJ5IGRlYWQgcGFzc2VzCisvLyAgIG8gSWYgQW5hbHlzaXMgaW5mb3JtYXRpb24gaXMgZGlydGllZCBieSBhIHBhc3MgdGhlbiByZWdlbmVyYXRlIEFuYWx5c2lzCisvLyAgICAgaW5mb3JtYXRpb24gYmVmb3JlIGl0IGlzIGNvbnN1bWVkIGJ5IGFub3RoZXIgcGFzcy4KKy8vCisvLyBQYXNzIE1hbmFnZXIgSW5mcmFzdHJ1Y3R1cmUgdXNlcyBtdWx0aXBsZSBwYXNzIG1hbmFnZXJzLiAgVGhleSBhcmUKKy8vIFBhc3NNYW5hZ2VyLCBGdW5jdGlvblBhc3NNYW5hZ2VyLCBNUFBhc3NNYW5hZ2VyLCBGUFBhc3NNYW5hZ2VyLCBCQlBhc3NNYW5hZ2VyLgorLy8gVGhpcyBjbGFzcyBoaWVyYXJjaHkgdXNlcyBtdWx0aXBsZSBpbmhlcml0YW5jZSBidXQgcGFzcyBtYW5hZ2VycyBkbyBub3QKKy8vIGRlcml2ZSBmcm9tIGFub3RoZXIgcGFzcyBtYW5hZ2VyLgorLy8KKy8vIFBhc3NNYW5hZ2VyIGFuZCBGdW5jdGlvblBhc3NNYW5hZ2VyIGFyZSB0d28gdG9wLWxldmVsIHBhc3MgbWFuYWdlciB0aGF0CisvLyByZXByZXNlbnRzIHRoZSBleHRlcm5hbCBpbnRlcmZhY2Ugb2YgdGhpcyBlbnRpcmUgcGFzcyBtYW5hZ2VyIGluZnJhc3R1Y3R1cmUuCisvLworLy8gSW1wb3J0YW50IGNsYXNzZXMgOgorLy8KKy8vIFtvXSBjbGFzcyBQTVRvcExldmVsTWFuYWdlcjsKKy8vCisvLyBUd28gdG9wIGxldmVsIG1hbmFnZXJzLCBQYXNzTWFuYWdlciBhbmQgRnVuY3Rpb25QYXNzTWFuYWdlciwgZGVyaXZlIGZyb20KKy8vIFBNVG9wTGV2ZWxNYW5hZ2VyLiBQTVRvcExldmVsTWFuYWdlciBtYW5hZ2VzIGluZm9ybWF0aW9uIHVzZWQgYnkgdG9wIGxldmVsCisvLyBtYW5hZ2VycyBzdWNoIGFzIGxhc3QgdXNlciBpbmZvLgorLy8KKy8vIFtvXSBjbGFzcyBQTURhdGFNYW5hZ2VyOworLy8KKy8vIFBNRGF0YU1hbmFnZXIgbWFuYWdlcyBpbmZvcm1hdGlvbiwgZS5nLiBsaXN0IG9mIGF2YWlsYWJsZSBhbmFseXNpcyBpbmZvLAorLy8gdXNlZCBieSBhIHBhc3MgbWFuYWdlciB0byBtYW5hZ2UgZXhlY3V0aW9uIG9yZGVyIG9mIHBhc3Nlcy4gSXQgYWxzbyBwcm92aWRlcworLy8gYSBwbGFjZSB0byBpbXBsZW1lbnQgY29tbW9uIHBhc3MgbWFuYWdlciBBUElzLiBBbGwgcGFzcyBtYW5hZ2VycyBkZXJpdmUgZnJvbQorLy8gUE1EYXRhTWFuYWdlci4KKy8vCisvLyBbb10gY2xhc3MgQkJQYXNzTWFuYWdlciA6IHB1YmxpYyBGdW5jdGlvblBhc3MsIHB1YmxpYyBQTURhdGFNYW5hZ2VyOworLy8KKy8vIEJCUGFzc01hbmFnZXIgbWFuYWdlcyBCYXNpY0Jsb2NrUGFzc2VzLgorLy8KKy8vIFtvXSBjbGFzcyBGdW5jdGlvblBhc3NNYW5hZ2VyOworLy8KKy8vIFRoaXMgaXMgYSBleHRlcm5hbCBpbnRlcmZhY2UgdXNlZCB0byBtYW5hZ2UgRnVuY3Rpb25QYXNzZXMuIFRoaXMKKy8vIGludGVyZmFjZSByZWxpZXMgb24gRnVuY3Rpb25QYXNzTWFuYWdlckltcGwgdG8gZG8gYWxsIHRoZSB0YXNrcy4KKy8vCisvLyBbb10gY2xhc3MgRnVuY3Rpb25QYXNzTWFuYWdlckltcGwgOiBwdWJsaWMgTW9kdWxlUGFzcywgUE1EYXRhTWFuYWdlciwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBQTVRvcExldmVsTWFuYWdlcjsKKy8vCisvLyBGdW5jdGlvblBhc3NNYW5hZ2VySW1wbCBpcyBhIHRvcCBsZXZlbCBtYW5hZ2VyLiBJdCBtYW5hZ2VzIEZQUGFzc01hbmFnZXJzCisvLworLy8gW29dIGNsYXNzIEZQUGFzc01hbmFnZXIgOiBwdWJsaWMgTW9kdWxlUGFzcywgcHVibGljIFBNRGF0YU1hbmFnZXI7CisvLworLy8gRlBQYXNzTWFuYWdlciBtYW5hZ2VzIEZ1bmN0aW9uUGFzc2VzIGFuZCBCQlBhc3NNYW5hZ2VycworLy8KKy8vIFtvXSBjbGFzcyBNUFBhc3NNYW5hZ2VyIDogcHVibGljIFBhc3MsIHB1YmxpYyBQTURhdGFNYW5hZ2VyOworLy8KKy8vIE1QUGFzc01hbmFnZXIgbWFuYWdlcyBNb2R1bGVQYXNzZXMgYW5kIEZQUGFzc01hbmFnZXJzCisvLworLy8gW29dIGNsYXNzIFBhc3NNYW5hZ2VyOworLy8KKy8vIFRoaXMgaXMgYSBleHRlcm5hbCBpbnRlcmZhY2UgdXNlZCBieSB2YXJpb3VzIHRvb2xzIHRvIG1hbmFnZXMgcGFzc2VzLiBJdAorLy8gcmVsaWVzIG9uIFBhc3NNYW5hZ2VySW1wbCB0byBkbyBhbGwgdGhlIHRhc2tzLgorLy8KKy8vIFtvXSBjbGFzcyBQYXNzTWFuYWdlckltcGwgOiBwdWJsaWMgUGFzcywgcHVibGljIFBNRGF0YU1hbmFnZXIsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFBNVG9wTGV2ZWxNYW5hZ2VyCisvLworLy8gUGFzc01hbmFnZXJJbXBsIGlzIGEgdG9wIGxldmVsIHBhc3MgbWFuYWdlciByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcKKy8vIE1QUGFzc01hbmFnZXJzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9QcmV0dHlTdGFja1RyYWNlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheVJlZjsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIFBhc3M7CitjbGFzcyBTdHJpbmdSZWY7CitjbGFzcyBWYWx1ZTsKK2NsYXNzIFRpbWVyOworY2xhc3MgUE1EYXRhTWFuYWdlcjsKKworLy8gZW51bXMgZm9yIGRlYnVnZ2luZyBzdHJpbmdzCitlbnVtIFBhc3NEZWJ1Z2dpbmdTdHJpbmcgeworICBFWEVDVVRJT05fTVNHLCAvLyAiRXhlY3V0aW5nIFBhc3MgJyIgKyBQYXNzTmFtZQorICBNT0RJRklDQVRJT05fTVNHLCAvLyAiTWFkZSBNb2RpZmljYXRpb24gJyIgKyBQYXNzTmFtZQorICBGUkVFSU5HX01TRywgLy8gIiBGcmVlaW5nIFBhc3MgJyIgKyBQYXNzTmFtZQorICBPTl9CQVNJQ0JMT0NLX01TRywgLy8gIicgb24gQmFzaWNCbG9jayAnIiArIEluc3RydWN0aW9uTmFtZSArICInLi4uXG4iCisgIE9OX0ZVTkNUSU9OX01TRywgLy8gIicgb24gRnVuY3Rpb24gJyIgKyBGdW5jdGlvbk5hbWUgKyAiJy4uLlxuIgorICBPTl9NT0RVTEVfTVNHLCAvLyAiJyBvbiBNb2R1bGUgJyIgKyBNb2R1bGVOYW1lICsgIicuLi5cbiIKKyAgT05fUkVHSU9OX01TRywgLy8gIicgb24gUmVnaW9uICciICsgTXNnICsgIicuLi5cbiciCisgIE9OX0xPT1BfTVNHLCAvLyAiJyBvbiBMb29wICciICsgTXNnICsgIicuLi5cbiciCisgIE9OX0NHX01TRyAvLyAiJyBvbiBDYWxsIEdyYXBoIE5vZGVzICciICsgTXNnICsgIicuLi5cbiciCit9OworCisvLy8gUGFzc01hbmFnZXJQcmV0dHlTdGFja0VudHJ5IC0gVGhpcyBpcyB1c2VkIHRvIHByaW50IGluZm9ybWF0aXZlIGluZm9ybWF0aW9uCisvLy8gYWJvdXQgd2hhdCBwYXNzIGlzIHJ1bm5pbmcgd2hlbi9pZiBhIHN0YWNrIHRyYWNlIGlzIGdlbmVyYXRlZC4KK2NsYXNzIFBhc3NNYW5hZ2VyUHJldHR5U3RhY2tFbnRyeSA6IHB1YmxpYyBQcmV0dHlTdGFja1RyYWNlRW50cnkgeworICBQYXNzICpQOworICBWYWx1ZSAqVjsKKyAgTW9kdWxlICpNOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFBhc3NNYW5hZ2VyUHJldHR5U3RhY2tFbnRyeShQYXNzICpwKQorICAgIDogUChwKSwgVihudWxscHRyKSwgTShudWxscHRyKSB7fSAgLy8gV2hlbiBQIGlzIHJlbGVhc2VNZW1vcnknZC4KKyAgUGFzc01hbmFnZXJQcmV0dHlTdGFja0VudHJ5KFBhc3MgKnAsIFZhbHVlICZ2KQorICAgIDogUChwKSwgVigmdiksIE0obnVsbHB0cikge30gLy8gV2hlbiBQIGlzIHJ1biBvbiBWCisgIFBhc3NNYW5hZ2VyUHJldHR5U3RhY2tFbnRyeShQYXNzICpwLCBNb2R1bGUgJm0pCisgICAgOiBQKHApLCBWKG51bGxwdHIpLCBNKCZtKSB7fSAvLyBXaGVuIFAgaXMgcnVuIG9uIE0KKworICAvLy8gcHJpbnQgLSBFbWl0IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgc3RhY2sgZnJhbWUgdG8gT1MuCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQTVN0YWNrCisvLworLy8vIFBNU3RhY2sgLSBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBzdGFjayBkYXRhIHN0cnVjdHVyZSBvZiBQTURhdGFNYW5hZ2VyCisvLy8gcG9pbnRlcnMuCisvLy8KKy8vLyBUb3AgbGV2ZWwgcGFzcyBtYW5hZ2VycyAoc2VlIFBhc3NNYW5hZ2VyLmNwcCkgbWFpbnRhaW4gYWN0aXZlIFBhc3MgTWFuYWdlcnMKKy8vLyB1c2luZyBQTVN0YWNrLiBFYWNoIFBhc3MgaW1wbGVtZW50cyBhc3NpZ25QYXNzTWFuYWdlcigpIHRvIGNvbm5lY3QgaXRzZWxmCisvLy8gd2l0aCBhcHByb3ByaWF0ZSBtYW5hZ2VyLiBhc3NpZ25QYXNzTWFuYWdlcigpIHdhbGtzIFBNU3RhY2sgdG8gZmluZAorLy8vIHN1aXRhYmxlIG1hbmFnZXIuCitjbGFzcyBQTVN0YWNrIHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxQTURhdGFNYW5hZ2VyICo+Ojpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ZXJhdG9yOworICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFMucmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gUy5yZW5kKCk7IH0KKworICB2b2lkIHBvcCgpOworICBQTURhdGFNYW5hZ2VyICp0b3AoKSBjb25zdCB7IHJldHVybiBTLmJhY2soKTsgfQorICB2b2lkIHB1c2goUE1EYXRhTWFuYWdlciAqUE0pOworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gUy5lbXB0eSgpOyB9CisKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIHN0ZDo6dmVjdG9yPFBNRGF0YU1hbmFnZXIgKj4gUzsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQTVRvcExldmVsTWFuYWdlcgorLy8KKy8vLyBQTVRvcExldmVsTWFuYWdlciBtYW5hZ2VzIExhc3RVc2VyIGluZm8gYW5kIGNvbGxlY3RzIGNvbW1vbiBBUElzIHVzZWQgYnkKKy8vLyB0b3AgbGV2ZWwgcGFzcyBtYW5hZ2Vycy4KK2NsYXNzIFBNVG9wTGV2ZWxNYW5hZ2VyIHsKK3Byb3RlY3RlZDoKKyAgZXhwbGljaXQgUE1Ub3BMZXZlbE1hbmFnZXIoUE1EYXRhTWFuYWdlciAqUE1ETSk7CisKKyAgdW5zaWduZWQgZ2V0TnVtQ29udGFpbmVkTWFuYWdlcnMoKSBjb25zdCB7CisgICAgcmV0dXJuICh1bnNpZ25lZClQYXNzTWFuYWdlcnMuc2l6ZSgpOworICB9CisKKyAgdm9pZCBpbml0aWFsaXplQWxsQW5hbHlzaXNJbmZvKCk7CisKK3ByaXZhdGU6CisgIHZpcnR1YWwgUE1EYXRhTWFuYWdlciAqZ2V0QXNQTURhdGFNYW5hZ2VyKCkgPSAwOworICB2aXJ0dWFsIFBhc3NNYW5hZ2VyVHlwZSBnZXRUb3BMZXZlbFBhc3NNYW5hZ2VyVHlwZSgpID0gMDsKKworcHVibGljOgorICAvLy8gU2NoZWR1bGUgcGFzcyBQIGZvciBleGVjdXRpb24uIE1ha2Ugc3VyZSB0aGF0IHBhc3NlcyByZXF1aXJlZCBieQorICAvLy8gUCBhcmUgcnVuIGJlZm9yZSBQIGlzIHJ1bi4gVXBkYXRlIGFuYWx5c2lzIGluZm8gbWFpbnRhaW5lZCBieQorICAvLy8gdGhlIG1hbmFnZXIuIFJlbW92ZSBkZWFkIHBhc3Nlcy4gVGhpcyBpcyBhIHJlY3Vyc2l2ZSBmdW5jdGlvbi4KKyAgdm9pZCBzY2hlZHVsZVBhc3MoUGFzcyAqUCk7CisKKyAgLy8vIFNldCBwYXNzIFAgYXMgdGhlIGxhc3QgdXNlciBvZiB0aGUgZ2l2ZW4gYW5hbHlzaXMgcGFzc2VzLgorICB2b2lkIHNldExhc3RVc2VyKEFycmF5UmVmPFBhc3MqPiBBbmFseXNpc1Bhc3NlcywgUGFzcyAqUCk7CisKKyAgLy8vIENvbGxlY3QgcGFzc2VzIHdob3NlIGxhc3QgdXNlciBpcyBQCisgIHZvaWQgY29sbGVjdExhc3RVc2VzKFNtYWxsVmVjdG9ySW1wbDxQYXNzICo+ICZMYXN0VXNlcywgUGFzcyAqUCk7CisKKyAgLy8vIEZpbmQgdGhlIHBhc3MgdGhhdCBpbXBsZW1lbnRzIEFuYWx5c2lzIEFJRC4gU2VhcmNoIGltbXV0YWJsZQorICAvLy8gcGFzc2VzIGFuZCBhbGwgcGFzcyBtYW5hZ2Vycy4gSWYgZGVzaXJlZCBwYXNzIGlzIG5vdCBmb3VuZAorICAvLy8gdGhlbiByZXR1cm4gTlVMTC4KKyAgUGFzcyAqZmluZEFuYWx5c2lzUGFzcyhBbmFseXNpc0lEIEFJRCk7CisKKyAgLy8vIFJldHJpZXZlIHRoZSBQYXNzSW5mbyBmb3IgYW4gYW5hbHlzaXMuCisgIGNvbnN0IFBhc3NJbmZvICpmaW5kQW5hbHlzaXNQYXNzSW5mbyhBbmFseXNpc0lEIEFJRCkgY29uc3Q7CisKKyAgLy8vIEZpbmQgYW5hbHlzaXMgdXNhZ2UgaW5mb3JtYXRpb24gZm9yIHRoZSBwYXNzIFAuCisgIEFuYWx5c2lzVXNhZ2UgKmZpbmRBbmFseXNpc1VzYWdlKFBhc3MgKlApOworCisgIHZpcnR1YWwgflBNVG9wTGV2ZWxNYW5hZ2VyKCk7CisKKyAgLy8vIEFkZCBpbW11dGFibGUgcGFzcyBhbmQgaW5pdGlhbGl6ZSBpdC4KKyAgdm9pZCBhZGRJbW11dGFibGVQYXNzKEltbXV0YWJsZVBhc3MgKlApOworCisgIGlubGluZSBTbWFsbFZlY3RvckltcGw8SW1tdXRhYmxlUGFzcyAqPiYgZ2V0SW1tdXRhYmxlUGFzc2VzKCkgeworICAgIHJldHVybiBJbW11dGFibGVQYXNzZXM7CisgIH0KKworICB2b2lkIGFkZFBhc3NNYW5hZ2VyKFBNRGF0YU1hbmFnZXIgKk1hbmFnZXIpIHsKKyAgICBQYXNzTWFuYWdlcnMucHVzaF9iYWNrKE1hbmFnZXIpOworICB9CisKKyAgLy8gQWRkIE1hbmFnZXIgaW50byB0aGUgbGlzdCBvZiBtYW5hZ2VycyB0aGF0IGFyZSBub3QgZGlyZWN0bHkKKyAgLy8gbWFpbnRhaW5lZCBieSB0aGlzIHRvcCBsZXZlbCBwYXNzIG1hbmFnZXIKKyAgaW5saW5lIHZvaWQgYWRkSW5kaXJlY3RQYXNzTWFuYWdlcihQTURhdGFNYW5hZ2VyICpNYW5hZ2VyKSB7CisgICAgSW5kaXJlY3RQYXNzTWFuYWdlcnMucHVzaF9iYWNrKE1hbmFnZXIpOworICB9CisKKyAgLy8gUHJpbnQgcGFzc2VzIG1hbmFnZWQgYnkgdGhpcyB0b3AgbGV2ZWwgbWFuYWdlci4KKyAgdm9pZCBkdW1wUGFzc2VzKCkgY29uc3Q7CisgIHZvaWQgZHVtcEFyZ3VtZW50cygpIGNvbnN0OworCisgIC8vIEFjdGl2ZSBQYXNzIE1hbmFnZXJzCisgIFBNU3RhY2sgYWN0aXZlU3RhY2s7CisKK3Byb3RlY3RlZDoKKyAgLy8vIENvbGxlY3Rpb24gb2YgcGFzcyBtYW5hZ2VycworICBTbWFsbFZlY3RvcjxQTURhdGFNYW5hZ2VyICosIDg+IFBhc3NNYW5hZ2VyczsKKworcHJpdmF0ZToKKyAgLy8vIENvbGxlY3Rpb24gb2YgcGFzcyBtYW5hZ2VycyB0aGF0IGFyZSBub3QgZGlyZWN0bHkgbWFpbnRhaW5lZAorICAvLy8gYnkgdGhpcyBwYXNzIG1hbmFnZXIKKyAgU21hbGxWZWN0b3I8UE1EYXRhTWFuYWdlciAqLCA4PiBJbmRpcmVjdFBhc3NNYW5hZ2VyczsKKworICAvLyBNYXAgdG8ga2VlcCB0cmFjayBvZiBsYXN0IHVzZXIgb2YgdGhlIGFuYWx5c2lzIHBhc3MuCisgIC8vIExhc3RVc2VyLT5zZWNvbmQgaXMgdGhlIGxhc3QgdXNlciBvZiBMYXN0dXNlci0+Zmlyc3QuCisgIERlbnNlTWFwPFBhc3MgKiwgUGFzcyAqPiBMYXN0VXNlcjsKKworICAvLyBNYXAgdG8ga2VlcCB0cmFjayBvZiBwYXNzZXMgdGhhdCBhcmUgbGFzdCB1c2VkIGJ5IGEgcGFzcy4KKyAgLy8gVGhpcyBpbnZlcnNlIG1hcCBpcyBpbml0aWFsaXplZCBhdCBQTS0+cnVuKCkgYmFzZWQgb24KKyAgLy8gTGFzdFVzZXIgbWFwLgorICBEZW5zZU1hcDxQYXNzICosIFNtYWxsUHRyU2V0PFBhc3MgKiwgOD4gPiBJbnZlcnNlZExhc3RVc2VyOworCisgIC8vLyBJbW11dGFibGUgcGFzc2VzIGFyZSBtYW5hZ2VkIGJ5IHRvcCBsZXZlbCBtYW5hZ2VyLgorICBTbWFsbFZlY3RvcjxJbW11dGFibGVQYXNzICosIDE2PiBJbW11dGFibGVQYXNzZXM7CisKKyAgLy8vIE1hcCBmcm9tIElEIHRvIGltbXV0YWJsZSBwYXNzZXMuCisgIFNtYWxsRGVuc2VNYXA8QW5hbHlzaXNJRCwgSW1tdXRhYmxlUGFzcyAqLCA4PiBJbW11dGFibGVQYXNzTWFwOworCisKKyAgLy8vIEEgd3JhcHBlciBhcm91bmQgQW5hbHlzaXNVc2FnZSBmb3IgdGhlIHB1cnBvc2Ugb2YgdW5pcXVlaW5nLiAgVGhlIHdyYXBwZXIKKyAgLy8vIGlzIHVzZWQgdG8gYXZvaWQgbmVlZGluZyB0byBtYWtlIEFuYWx5c2lzVXNhZ2UgaXRzZWxmIGEgZm9sZGluZyBzZXQgbm9kZS4KKyAgc3RydWN0IEFVRm9sZGluZ1NldE5vZGUgOiBwdWJsaWMgRm9sZGluZ1NldE5vZGUgeworICAgIEFuYWx5c2lzVXNhZ2UgQVU7CisgICAgQVVGb2xkaW5nU2V0Tm9kZShjb25zdCBBbmFseXNpc1VzYWdlICZBVSkgOiBBVShBVSkge30KKyAgICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0IHsKKyAgICAgIFByb2ZpbGUoSUQsIEFVKTsKKyAgICB9CisgICAgc3RhdGljIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCwgY29uc3QgQW5hbHlzaXNVc2FnZSAmQVUpIHsKKyAgICAgIC8vIFRPRE86IFdlIGNvdWxkIGNvbnNpZGVyIHNvcnRpbmcgdGhlIGRlcGVuZGVuY3kgYXJyYXlzIHdpdGhpbiB0aGUKKyAgICAgIC8vIEFuYWx5c2lzVXNhZ2UgKHNpbmNlIHRoZXkgYXJlIGNvbmNlcHR1YWxseSB1bm9yZGVyZWQpLgorICAgICAgSUQuQWRkQm9vbGVhbihBVS5nZXRQcmVzZXJ2ZXNBbGwoKSk7CisgICAgICBhdXRvIFByb2ZpbGVWZWMgPSBbJl0oY29uc3QgU21hbGxWZWN0b3JJbXBsPEFuYWx5c2lzSUQ+JiBWZWMpIHsKKyAgICAgICAgSUQuQWRkSW50ZWdlcihWZWMuc2l6ZSgpKTsKKyAgICAgICAgZm9yKEFuYWx5c2lzSUQgQUlEIDogVmVjKQorICAgICAgICAgIElELkFkZFBvaW50ZXIoQUlEKTsKKyAgICAgIH07CisgICAgICBQcm9maWxlVmVjKEFVLmdldFJlcXVpcmVkU2V0KCkpOworICAgICAgUHJvZmlsZVZlYyhBVS5nZXRSZXF1aXJlZFRyYW5zaXRpdmVTZXQoKSk7CisgICAgICBQcm9maWxlVmVjKEFVLmdldFByZXNlcnZlZFNldCgpKTsKKyAgICAgIFByb2ZpbGVWZWMoQVUuZ2V0VXNlZFNldCgpKTsKKyAgICB9CisgIH07CisKKyAgLy8gQ29udGFpbnMgYWxsIG9mIHRoZSB1bmlxdWUgY29tYmluYXRpb25zIG9mIEFuYWx5c2lzVXNhZ2UuICBUaGlzIGlzIGhlbHBmdWwKKyAgLy8gd2hlbiB3ZSBoYXZlIG11bHRpcGxlIGluc3RhbmNlcyBvZiB0aGUgc2FtZSBwYXNzIHNpbmNlIHRoZXknbGwgdXN1YWxseQorICAvLyBoYXZlIHRoZSBzYW1lIGFuYWx5c2lzIHVzYWdlIGFuZCBjYW4gc2hhcmUgc3RvcmFnZS4KKyAgRm9sZGluZ1NldDxBVUZvbGRpbmdTZXROb2RlPiBVbmlxdWVBbmFseXNpc1VzYWdlczsKKworICAvLyBBbGxvY2F0b3IgdXNlZCBmb3IgYWxsb2NhdGluZyBVQUZvbGRpbmdTZXROb2Rlcy4gIFRoaXMgaGFuZGxlcyBkZWxldGlvbiBvZgorICAvLyBhbGwgYWxsb2NhdGVkIG5vZGVzIGluIG9uZSBmZWxsIHN3b29wLgorICBTcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3I8QVVGb2xkaW5nU2V0Tm9kZT4gQVVGb2xkaW5nU2V0Tm9kZUFsbG9jYXRvcjsKKworICAvLyBNYXBzIGZyb20gYSBwYXNzIHRvIGl0J3MgYXNzb2NpYXRlZCBlbnRyeSBpbiBVbmlxdWVBbmFseXNpc1VzYWdlcy4gIERvZXMKKyAgLy8gbm90IG93biB0aGUgc3RvcmFnZSBhc3NvY2lhdGVkIHdpdGggZWl0aGVyIGtleSBvciB2YWx1ZS4uIAorICBEZW5zZU1hcDxQYXNzICosIEFuYWx5c2lzVXNhZ2UqPiBBblVzYWdlTWFwOworCisgIC8vLyBDb2xsZWN0aW9uIG9mIFBhc3NJbmZvIG9iamVjdHMgZm91bmQgdmlhIGFuYWx5c2lzIElEcyBhbmQgaW4gdGhpcyB0b3AKKyAgLy8vIGxldmVsIG1hbmFnZXIuIFRoaXMgaXMgdXNlZCB0byBtZW1vaXplIHF1ZXJpZXMgdG8gdGhlIHBhc3MgcmVnaXN0cnkuCisgIC8vLyBGSVhNRTogVGhpcyBpcyBhbiBlZ3JlZ2lvdXMgaGFjayBiZWNhdXNlIHF1ZXJ5aW5nIHRoZSBwYXNzIHJlZ2lzdHJ5IGlzCisgIC8vLyBlaXRoZXIgc2xvdyBvciByYWN5LgorICBtdXRhYmxlIERlbnNlTWFwPEFuYWx5c2lzSUQsIGNvbnN0IFBhc3NJbmZvICo+IEFuYWx5c2lzUGFzc0luZm9zOworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBNRGF0YU1hbmFnZXIKKworLy8vIFBNRGF0YU1hbmFnZXIgcHJvdmlkZXMgdGhlIGNvbW1vbiBwbGFjZSB0byBtYW5hZ2UgdGhlIGFuYWx5c2lzIGRhdGEKKy8vLyB1c2VkIGJ5IHBhc3MgbWFuYWdlcnMuCitjbGFzcyBQTURhdGFNYW5hZ2VyIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgUE1EYXRhTWFuYWdlcigpIDogVFBNKG51bGxwdHIpLCBEZXB0aCgwKSB7CisgICAgaW5pdGlhbGl6ZUFuYWx5c2lzSW5mbygpOworICB9CisKKyAgdmlydHVhbCB+UE1EYXRhTWFuYWdlcigpOworCisgIHZpcnR1YWwgUGFzcyAqZ2V0QXNQYXNzKCkgPSAwOworCisgIC8vLyBBdWdtZW50IEF2YWlsYWJsZUFuYWx5c2lzIGJ5IGFkZGluZyBhbmFseXNpcyBtYWRlIGF2YWlsYWJsZSBieSBwYXNzIFAuCisgIHZvaWQgcmVjb3JkQXZhaWxhYmxlQW5hbHlzaXMoUGFzcyAqUCk7CisKKyAgLy8vIHZlcmlmeVByZXNlcnZlZEFuYWx5c2lzIC0tIFZlcmlmeSBhbmFseXNpcyBwcmVzcmV2ZWQgYnkgcGFzcyBQLgorICB2b2lkIHZlcmlmeVByZXNlcnZlZEFuYWx5c2lzKFBhc3MgKlApOworCisgIC8vLyBSZW1vdmUgQW5hbHlzaXMgdGhhdCBpcyBub3QgcHJlc2VydmVkIGJ5IHRoZSBwYXNzCisgIHZvaWQgcmVtb3ZlTm90UHJlc2VydmVkQW5hbHlzaXMoUGFzcyAqUCk7CisKKyAgLy8vIFJlbW92ZSBkZWFkIHBhc3NlcyB1c2VkIGJ5IFAuCisgIHZvaWQgcmVtb3ZlRGVhZFBhc3NlcyhQYXNzICpQLCBTdHJpbmdSZWYgTXNnLAorICAgICAgICAgICAgICAgICAgICAgICAgZW51bSBQYXNzRGVidWdnaW5nU3RyaW5nKTsKKworICAvLy8gUmVtb3ZlIFAuCisgIHZvaWQgZnJlZVBhc3MoUGFzcyAqUCwgU3RyaW5nUmVmIE1zZywKKyAgICAgICAgICAgICAgICBlbnVtIFBhc3NEZWJ1Z2dpbmdTdHJpbmcpOworCisgIC8vLyBBZGQgcGFzcyBQIGludG8gdGhlIFBhc3NWZWN0b3IuIFVwZGF0ZQorICAvLy8gQXZhaWxhYmxlQW5hbHlzaXMgYXBwcm9wcmlhdGVseSBpZiBQcm9jZXNzQW5hbHlzaXMgaXMgdHJ1ZS4KKyAgdm9pZCBhZGQoUGFzcyAqUCwgYm9vbCBQcm9jZXNzQW5hbHlzaXMgPSB0cnVlKTsKKworICAvLy8gQWRkIFJlcXVpcmVkUGFzcyBpbnRvIGxpc3Qgb2YgbG93ZXIgbGV2ZWwgcGFzc2VzIHJlcXVpcmVkIGJ5IHBhc3MgUC4KKyAgLy8vIFJlcXVpcmVkUGFzcyBpcyBydW4gb24gdGhlIGZseSBieSBQYXNzIE1hbmFnZXIgd2hlbiBQIHJlcXVlc3RzIGl0CisgIC8vLyB0aHJvdWdoIGdldEFuYWx5c2lzIGludGVyZmFjZS4KKyAgdmlydHVhbCB2b2lkIGFkZExvd2VyTGV2ZWxSZXF1aXJlZFBhc3MoUGFzcyAqUCwgUGFzcyAqUmVxdWlyZWRQYXNzKTsKKworICB2aXJ0dWFsIFBhc3MgKmdldE9uVGhlRmx5UGFzcyhQYXNzICpQLCBBbmFseXNpc0lEIFBJLCBGdW5jdGlvbiAmRik7CisKKyAgLy8vIEluaXRpYWxpemUgYXZhaWxhYmxlIGFuYWx5c2lzIGluZm9ybWF0aW9uLgorICB2b2lkIGluaXRpYWxpemVBbmFseXNpc0luZm8oKSB7CisgICAgQXZhaWxhYmxlQW5hbHlzaXMuY2xlYXIoKTsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgUE1UX0xhc3Q7ICsraSkKKyAgICAgIEluaGVyaXRlZEFuYWx5c2lzW2ldID0gbnVsbHB0cjsKKyAgfQorCisgIC8vIFJldHVybiB0cnVlIGlmIFAgcHJlc2VydmVzIGhpZ2ggbGV2ZWwgYW5hbHlzaXMgdXNlZCBieSBvdGhlcgorICAvLyBwYXNzZXMgdGhhdCBhcmUgbWFuYWdlZCBieSB0aGlzIG1hbmFnZXIuCisgIGJvb2wgcHJlc2VydmVIaWdoZXJMZXZlbEFuYWx5c2lzKFBhc3MgKlApOworCisgIC8vLyBQb3B1bGF0ZSBVc2VkUGFzc2VzIHdpdGggYW5hbHlzaXMgcGFzcyB0aGF0IGFyZSB1c2VkIG9yIHJlcXVpcmVkIGJ5IHBhc3MKKyAgLy8vIFAgYW5kIGFyZSBhdmFpbGFibGUuIFBvcHVsYXRlIFJlcVBhc3NOb3RBdmFpbGFibGUgd2l0aCBhbmFseXNpcyBwYXNzIHRoYXQKKyAgLy8vIGFyZSByZXF1aXJlZCBieSBwYXNzIFAgYnV0IGFyZSBub3QgYXZhaWxhYmxlLgorICB2b2lkIGNvbGxlY3RSZXF1aXJlZEFuZFVzZWRBbmFseXNlcygKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxQYXNzICo+ICZVc2VkUGFzc2VzLAorICAgICAgU21hbGxWZWN0b3JJbXBsPEFuYWx5c2lzSUQ+ICZSZXFQYXNzTm90QXZhaWxhYmxlLCBQYXNzICpQKTsKKworICAvLy8gQWxsIFJlcXVpcmVkIGFuYWx5c2VzIHNob3VsZCBiZSBhdmFpbGFibGUgdG8gdGhlIHBhc3MgYXMgaXQgcnVucyEgIEhlcmUKKyAgLy8vIHdlIGZpbGwgaW4gdGhlIEFuYWx5c2lzSW1wbHMgbWVtYmVyIG9mIHRoZSBwYXNzIHNvIHRoYXQgaXQgY2FuCisgIC8vLyBzdWNjZXNzZnVsbHkgdXNlIHRoZSBnZXRBbmFseXNpcygpIG1ldGhvZCB0byByZXRyaWV2ZSB0aGUKKyAgLy8vIGltcGxlbWVudGF0aW9ucyBpdCBuZWVkcy4KKyAgdm9pZCBpbml0aWFsaXplQW5hbHlzaXNJbXBsKFBhc3MgKlApOworCisgIC8vLyBGaW5kIHRoZSBwYXNzIHRoYXQgaW1wbGVtZW50cyBBbmFseXNpcyBBSUQuIElmIGRlc2lyZWQgcGFzcyBpcyBub3QgZm91bmQKKyAgLy8vIHRoZW4gcmV0dXJuIE5VTEwuCisgIFBhc3MgKmZpbmRBbmFseXNpc1Bhc3MoQW5hbHlzaXNJRCBBSUQsIGJvb2wgRGlyZWN0aW9uKTsKKworICAvLyBBY2Nlc3MgdG9wbGV2ZWwgbWFuYWdlcgorICBQTVRvcExldmVsTWFuYWdlciAqZ2V0VG9wTGV2ZWxNYW5hZ2VyKCkgeyByZXR1cm4gVFBNOyB9CisgIHZvaWQgc2V0VG9wTGV2ZWxNYW5hZ2VyKFBNVG9wTGV2ZWxNYW5hZ2VyICpUKSB7IFRQTSA9IFQ7IH0KKworICB1bnNpZ25lZCBnZXREZXB0aCgpIGNvbnN0IHsgcmV0dXJuIERlcHRoOyB9CisgIHZvaWQgc2V0RGVwdGgodW5zaWduZWQgbmV3RGVwdGgpIHsgRGVwdGggPSBuZXdEZXB0aDsgfQorCisgIC8vIFByaW50IHJvdXRpbmVzIHVzZWQgYnkgZGVidWctcGFzcworICB2b2lkIGR1bXBMYXN0VXNlcyhQYXNzICpQLCB1bnNpZ25lZCBPZmZzZXQpIGNvbnN0OworICB2b2lkIGR1bXBQYXNzQXJndW1lbnRzKCkgY29uc3Q7CisgIHZvaWQgZHVtcFBhc3NJbmZvKFBhc3MgKlAsIGVudW0gUGFzc0RlYnVnZ2luZ1N0cmluZyBTMSwKKyAgICAgICAgICAgICAgICAgICAgZW51bSBQYXNzRGVidWdnaW5nU3RyaW5nIFMyLCBTdHJpbmdSZWYgTXNnKTsKKyAgdm9pZCBkdW1wUmVxdWlyZWRTZXQoY29uc3QgUGFzcyAqUCkgY29uc3Q7CisgIHZvaWQgZHVtcFByZXNlcnZlZFNldChjb25zdCBQYXNzICpQKSBjb25zdDsKKyAgdm9pZCBkdW1wVXNlZFNldChjb25zdCBQYXNzICpQKSBjb25zdDsKKworICB1bnNpZ25lZCBnZXROdW1Db250YWluZWRQYXNzZXMoKSBjb25zdCB7CisgICAgcmV0dXJuICh1bnNpZ25lZClQYXNzVmVjdG9yLnNpemUoKTsKKyAgfQorCisgIHZpcnR1YWwgUGFzc01hbmFnZXJUeXBlIGdldFBhc3NNYW5hZ2VyVHlwZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQgKCAwICYmICJJbnZhbGlkIHVzZSBvZiBnZXRQYXNzTWFuYWdlclR5cGUiKTsKKyAgICByZXR1cm4gUE1UX1Vua25vd247CisgIH0KKworICBEZW5zZU1hcDxBbmFseXNpc0lELCBQYXNzKj4gKmdldEF2YWlsYWJsZUFuYWx5c2lzKCkgeworICAgIHJldHVybiAmQXZhaWxhYmxlQW5hbHlzaXM7CisgIH0KKworICAvLyBDb2xsZWN0IEF2YWlsYWJsZUFuYWx5c2lzIGZyb20gYWxsIHRoZSBhY3RpdmUgUGFzcyBNYW5hZ2Vycy4KKyAgdm9pZCBwb3B1bGF0ZUluaGVyaXRlZEFuYWx5c2lzKFBNU3RhY2sgJlBNUykgeworICAgIHVuc2lnbmVkIEluZGV4ID0gMDsKKyAgICBmb3IgKFBNU3RhY2s6Oml0ZXJhdG9yIEkgPSBQTVMuYmVnaW4oKSwgRSA9IFBNUy5lbmQoKTsKKyAgICAgICAgIEkgIT0gRTsgKytJKQorICAgICAgSW5oZXJpdGVkQW5hbHlzaXNbSW5kZXgrK10gPSAoKkkpLT5nZXRBdmFpbGFibGVBbmFseXNpcygpOworICB9CisKK3Byb3RlY3RlZDoKKyAgLy8gVG9wIGxldmVsIG1hbmFnZXIuCisgIFBNVG9wTGV2ZWxNYW5hZ2VyICpUUE07CisKKyAgLy8gQ29sbGVjdGlvbiBvZiBwYXNzIHRoYXQgYXJlIG1hbmFnZWQgYnkgdGhpcyBtYW5hZ2VyCisgIFNtYWxsVmVjdG9yPFBhc3MgKiwgMTY+IFBhc3NWZWN0b3I7CisKKyAgLy8gQ29sbGVjdGlvbiBvZiBBbmFseXNpcyBwcm92aWRlZCBieSBQYXJlbnQgcGFzcyBtYW5hZ2VyIGFuZAorICAvLyB1c2VkIGJ5IGN1cnJlbnQgcGFzcyBtYW5hZ2VyLiBBdCBhdCB0aW1lIHRoZXJlIGNhbiBub3QgYmUgbW9yZQorICAvLyB0aGVuIFBNVF9MYXN0IGFjdGl2ZSBwYXNzIG1hbmdlcnMuCisgIERlbnNlTWFwPEFuYWx5c2lzSUQsIFBhc3MgKj4gKkluaGVyaXRlZEFuYWx5c2lzW1BNVF9MYXN0XTsKKworICAvLy8gaXNQYXNzRGVidWdnaW5nRXhlY3V0aW9uc09yTW9yZSAtIFJldHVybiB0cnVlIGlmIC1kZWJ1Zy1wYXNzPUV4ZWN1dGlvbnMKKyAgLy8vIG9yIGhpZ2hlciBpcyBzcGVjaWZpZWQuCisgIGJvb2wgaXNQYXNzRGVidWdnaW5nRXhlY3V0aW9uc09yTW9yZSgpIGNvbnN0OworCitwcml2YXRlOgorICB2b2lkIGR1bXBBbmFseXNpc1VzYWdlKFN0cmluZ1JlZiBNc2csIGNvbnN0IFBhc3MgKlAsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQW5hbHlzaXNVc2FnZTo6VmVjdG9yVHlwZSAmU2V0KSBjb25zdDsKKworICAvLyBTZXQgb2YgYXZhaWxhYmxlIEFuYWx5c2lzLiBUaGlzIGluZm9ybWF0aW9uIGlzIHVzZWQgd2hpbGUgc2NoZWR1bGluZworICAvLyBwYXNzLiBJZiBhIHBhc3MgcmVxdWlyZXMgYW4gYW5hbHlzaXMgd2hpY2ggaXMgbm90IGF2YWlsYWJsZSB0aGVuCisgIC8vIHRoZSByZXF1aXJlZCBhbmFseXNpcyBwYXNzIGlzIHNjaGVkdWxlZCB0byBydW4gYmVmb3JlIHRoZSBwYXNzIGl0c2VsZiBpcworICAvLyBzY2hlZHVsZWQgdG8gcnVuLgorICBEZW5zZU1hcDxBbmFseXNpc0lELCBQYXNzKj4gQXZhaWxhYmxlQW5hbHlzaXM7CisKKyAgLy8gQ29sbGVjdGlvbiBvZiBoaWdoZXIgbGV2ZWwgYW5hbHlzaXMgdXNlZCBieSB0aGUgcGFzcyBtYW5hZ2VkIGJ5CisgIC8vIHRoaXMgbWFuYWdlci4KKyAgU21hbGxWZWN0b3I8UGFzcyAqLCAxNj4gSGlnaGVyTGV2ZWxBbmFseXNpczsKKworICB1bnNpZ25lZCBEZXB0aDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGUFBhc3NNYW5hZ2VyCisvLworLy8vIEZQUGFzc01hbmFnZXIgbWFuYWdlcyBCQlBhc3NNYW5hZ2VycyBhbmQgRnVuY3Rpb25QYXNzZXMuCisvLy8gSXQgYmF0Y2hlcyBhbGwgZnVuY3Rpb24gcGFzc2VzIGFuZCBiYXNpYyBibG9jayBwYXNzIG1hbmFnZXJzIHRvZ2V0aGVyIGFuZAorLy8vIHNlcXVlbmNlIHRoZW0gdG8gcHJvY2VzcyBvbmUgZnVuY3Rpb24gYXQgYSB0aW1lIGJlZm9yZSBwcm9jZXNzaW5nIG5leHQKKy8vLyBmdW5jdGlvbi4KK2NsYXNzIEZQUGFzc01hbmFnZXIgOiBwdWJsaWMgTW9kdWxlUGFzcywgcHVibGljIFBNRGF0YU1hbmFnZXIgeworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKyAgZXhwbGljaXQgRlBQYXNzTWFuYWdlcigpCisgIDogTW9kdWxlUGFzcyhJRCksIFBNRGF0YU1hbmFnZXIoKSB7IH0KKworICAvLy8gcnVuIC0gRXhlY3V0ZSBhbGwgb2YgdGhlIHBhc3NlcyBzY2hlZHVsZWQgZm9yIGV4ZWN1dGlvbi4gIEtlZXAgdHJhY2sgb2YKKyAgLy8vIHdoZXRoZXIgYW55IG9mIHRoZSBwYXNzZXMgbW9kaWZpZXMgdGhlIG1vZHVsZSwgYW5kIGlmIHNvLCByZXR1cm4gdHJ1ZS4KKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKTsKKyAgYm9vbCBydW5Pbk1vZHVsZShNb2R1bGUgJk0pIG92ZXJyaWRlOworCisgIC8vLyBjbGVhbnVwIC0gQWZ0ZXIgcnVubmluZyBhbGwgcGFzc2VzLCBjbGVhbiB1cCBwYXNzIG1hbmFnZXIgY2FjaGUuCisgIHZvaWQgY2xlYW51cCgpOworCisgIC8vLyBkb0luaXRpYWxpemF0aW9uIC0gT3ZlcnJpZGVzIE1vZHVsZVBhc3MgZG9Jbml0aWFsaXphdGlvbiBmb3IgZ2xvYmFsCisgIC8vLyBpbml0aWFsaXphdGlvbiB0YXNrcworICAvLy8KKyAgdXNpbmcgTW9kdWxlUGFzczo6ZG9Jbml0aWFsaXphdGlvbjsKKworICAvLy8gZG9Jbml0aWFsaXphdGlvbiAtIFJ1biBhbGwgb2YgdGhlIGluaXRpYWxpemVycyBmb3IgdGhlIGZ1bmN0aW9uIHBhc3Nlcy4KKyAgLy8vCisgIGJvb2wgZG9Jbml0aWFsaXphdGlvbihNb2R1bGUgJk0pIG92ZXJyaWRlOworCisgIC8vLyBkb0ZpbmFsaXphdGlvbiAtIE92ZXJyaWRlcyBNb2R1bGVQYXNzIGRvRmluYWxpemF0aW9uIGZvciBnbG9iYWwKKyAgLy8vIGZpbmFsaXphdGlvbiB0YXNrcworICAvLy8KKyAgdXNpbmcgTW9kdWxlUGFzczo6ZG9GaW5hbGl6YXRpb247CisKKyAgLy8vIGRvRmluYWxpemF0aW9uIC0gUnVuIGFsbCBvZiB0aGUgZmluYWxpemVycyBmb3IgdGhlIGZ1bmN0aW9uIHBhc3Nlcy4KKyAgLy8vCisgIGJvb2wgZG9GaW5hbGl6YXRpb24oTW9kdWxlICZNKSBvdmVycmlkZTsKKworICBQTURhdGFNYW5hZ2VyICpnZXRBc1BNRGF0YU1hbmFnZXIoKSBvdmVycmlkZSB7IHJldHVybiB0aGlzOyB9CisgIFBhc3MgKmdldEFzUGFzcygpIG92ZXJyaWRlIHsgcmV0dXJuIHRoaXM7IH0KKworICAvLy8gUGFzcyBNYW5hZ2VyIGl0c2VsZiBkb2VzIG5vdCBpbnZhbGlkYXRlIGFueSBhbmFseXNpcyBpbmZvLgorICB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmSW5mbykgY29uc3Qgb3ZlcnJpZGUgeworICAgIEluZm8uc2V0UHJlc2VydmVzQWxsKCk7CisgIH0KKworICAvLyBQcmludCBwYXNzZXMgbWFuYWdlZCBieSB0aGlzIG1hbmFnZXIKKyAgdm9pZCBkdW1wUGFzc1N0cnVjdHVyZSh1bnNpZ25lZCBPZmZzZXQpIG92ZXJyaWRlOworCisgIFN0cmluZ1JlZiBnZXRQYXNzTmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJGdW5jdGlvbiBQYXNzIE1hbmFnZXIiOyB9CisKKyAgRnVuY3Rpb25QYXNzICpnZXRDb250YWluZWRQYXNzKHVuc2lnbmVkIE4pIHsKKyAgICBhc3NlcnQgKCBOIDwgUGFzc1ZlY3Rvci5zaXplKCkgJiYgIlBhc3MgbnVtYmVyIG91dCBvZiByYW5nZSEiKTsKKyAgICBGdW5jdGlvblBhc3MgKkZQID0gc3RhdGljX2Nhc3Q8RnVuY3Rpb25QYXNzICo+KFBhc3NWZWN0b3JbTl0pOworICAgIHJldHVybiBGUDsKKyAgfQorCisgIFBhc3NNYW5hZ2VyVHlwZSBnZXRQYXNzTWFuYWdlclR5cGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIFBNVF9GdW5jdGlvblBhc3NNYW5hZ2VyOworICB9Cit9OworCitUaW1lciAqZ2V0UGFzc1RpbWVyKFBhc3MgKik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9MZWdhY3lQYXNzTmFtZVBhcnNlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9MZWdhY3lQYXNzTmFtZVBhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjZWMwODEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL0xlZ2FjeVBhc3NOYW1lUGFyc2VyLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8vPT09LSBMZWdhY3lQYXNzTmFtZVBhcnNlci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBQYXNzTmFtZVBhcnNlciBhbmQgRmlsdGVyZWRQYXNzTmFtZVBhcnNlcjw+IGNsYXNzZXMsCisvLyB3aGljaCBhcmUgdXNlZCB0byBhZGQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyB0byBhIHV0aWxpdHkgZm9yIGFsbCBvZiB0aGUKKy8vIHBhc3NlcyB0aGF0IGhhdmUgYmVlbiByZWdpc3RlcmVkIGludG8gdGhlIHN5c3RlbS4KKy8vCisvLyBUaGUgUGFzc05hbWVQYXJzZXIgY2xhc3MgYWRkcyBBTEwgcGFzc2VzIGxpbmtlZCBpbnRvIHRoZSBzeXN0ZW0gKHRoYXQgYXJlCisvLyBjcmVhdGFibGUpIGFzIGNvbW1hbmQgbGluZSBhcmd1bWVudHMgdG8gdGhlIHRvb2wgKHdoZW4gaW5zdGFudGlhdGVkIHdpdGggdGhlCisvLyBhcHByb3ByaWF0ZSBjb21tYW5kIGxpbmUgb3B0aW9uIHRlbXBsYXRlKS4gIFRoZSBGaWx0ZXJlZFBhc3NOYW1lUGFyc2VyPD4KKy8vIHRlbXBsYXRlIGlzIHVzZWQgZm9yIHRoZSBzYW1lIHB1cnBvc2VzIGFzIFBhc3NOYW1lUGFyc2VyLCBleGNlcHQgdGhhdCBpdCBvbmx5CisvLyBpbmNsdWRlcyBwYXNzZXMgdGhhdCBoYXZlIGEgUGFzc1R5cGUgdGhhdCBhcmUgY29tcGF0aWJsZSB3aXRoIHRoZSBmaWx0ZXIKKy8vICh3aGljaCBpcyB0aGUgdGVtcGxhdGUgYXJndW1lbnQpLgorLy8KKy8vIE5vdGUgdGhhdCB0aGlzIGlzIHBhcnQgb2YgdGhlIGxlZ2FjeSBwYXNzIG1hbmFnZXIgaW5mcmFzdHJ1Y3R1cmUgYW5kIHdpbGwgYmUKKy8vIChldmVudHVhbGx5KSBnb2luZyBhd2F5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9MRUdBQ1lQQVNTTkFNRVBBUlNFUl9ICisjZGVmaW5lIExMVk1fSVJfTEVHQUNZUEFTU05BTUVQQVJTRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxjc3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQYXNzTmFtZVBhcnNlciBjbGFzcyAtIE1ha2UgdXNlIG9mIHRoZSBwYXNzIHJlZ2lzdHJhdGlvbiBtZWNoYW5pc20gdG8KKy8vIGF1dG9tYXRpY2FsbHkgYWRkIGEgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHRvIG9wdCBmb3IgZWFjaCBwYXNzLgorLy8KK2NsYXNzIFBhc3NOYW1lUGFyc2VyIDogcHVibGljIFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGNsOjpwYXJzZXI8Y29uc3QgUGFzc0luZm8qPiB7CitwdWJsaWM6CisgIFBhc3NOYW1lUGFyc2VyKGNsOjpPcHRpb24gJk8pOworICB+UGFzc05hbWVQYXJzZXIoKSBvdmVycmlkZTsKKworICB2b2lkIGluaXRpYWxpemUoKSB7CisgICAgY2w6OnBhcnNlcjxjb25zdCBQYXNzSW5mbyo+Ojppbml0aWFsaXplKCk7CisKKyAgICAvLyBBZGQgYWxsIG9mIHRoZSBwYXNzZXMgdG8gdGhlIG1hcCB0aGF0IGdvdCBpbml0aWFsaXplZCBiZWZvcmUgJ3RoaXMnIGRpZC4KKyAgICBlbnVtZXJhdGVQYXNzZXMoKTsKKyAgfQorCisgIC8vIGlnbm9yYWJsZVBhc3NJbXBsIC0gQ2FuIGJlIG92ZXJyaWRlbiBpbiBzdWJjbGFzc2VzIHRvIHJlZmluZSB0aGUgbGlzdCBvZgorICAvLyB3aGljaCBwYXNzZXMgd2Ugd2FudCB0byBpbmNsdWRlLgorICAvLworICB2aXJ0dWFsIGJvb2wgaWdub3JhYmxlUGFzc0ltcGwoY29uc3QgUGFzc0luZm8gKlApIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgaW5saW5lIGJvb2wgaWdub3JhYmxlUGFzcyhjb25zdCBQYXNzSW5mbyAqUCkgY29uc3QgeworICAgIC8vIElnbm9yZSBub24tc2VsZWN0YWJsZSBhbmQgbm9uLWNvbnN0cnVjdGlibGUgcGFzc2VzISAgSWdub3JlCisgICAgLy8gbm9uLW9wdGltaXphdGlvbnMuCisgICAgcmV0dXJuIFAtPmdldFBhc3NBcmd1bWVudCgpLmVtcHR5KCkgfHwgUC0+Z2V0Tm9ybWFsQ3RvcigpID09IG51bGxwdHIgfHwKKyAgICAgICAgICAgaWdub3JhYmxlUGFzc0ltcGwoUCk7CisgIH0KKworICAvLyBJbXBsZW1lbnQgdGhlIFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lciBjYWxsYmFja3MgdXNlZCB0byBwb3B1bGF0ZSBvdXIgbWFwCisgIC8vCisgIHZvaWQgcGFzc1JlZ2lzdGVyZWQoY29uc3QgUGFzc0luZm8gKlApIG92ZXJyaWRlIHsKKyAgICBpZiAoaWdub3JhYmxlUGFzcyhQKSkgcmV0dXJuOworICAgIGlmIChmaW5kT3B0aW9uKFAtPmdldFBhc3NBcmd1bWVudCgpLmRhdGEoKSkgIT0gZ2V0TnVtT3B0aW9ucygpKSB7CisgICAgICBlcnJzKCkgPDwgIlR3byBwYXNzZXMgd2l0aCB0aGUgc2FtZSBhcmd1bWVudCAoLSIKKyAgICAgICAgICAgPDwgUC0+Z2V0UGFzc0FyZ3VtZW50KCkgPDwgIikgYXR0ZW1wdGVkIHRvIGJlIHJlZ2lzdGVyZWQhXG4iOworICAgICAgbGx2bV91bnJlYWNoYWJsZShudWxscHRyKTsKKyAgICB9CisgICAgYWRkTGl0ZXJhbE9wdGlvbihQLT5nZXRQYXNzQXJndW1lbnQoKS5kYXRhKCksIFAsIFAtPmdldFBhc3NOYW1lKCkuZGF0YSgpKTsKKyAgfQorICB2b2lkIHBhc3NFbnVtZXJhdGUoY29uc3QgUGFzc0luZm8gKlApIG92ZXJyaWRlIHsgcGFzc1JlZ2lzdGVyZWQoUCk7IH0KKworICAvLyBwcmludE9wdGlvbkluZm8gLSBQcmludCBvdXQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvcHRpb24uICBPdmVycmlkZSB0aGUKKyAgLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiB0byBzb3J0IHRoZSB0YWJsZSBiZWZvcmUgd2UgcHJpbnQuLi4KKyAgdm9pZCBwcmludE9wdGlvbkluZm8oY29uc3QgY2w6Ok9wdGlvbiAmTywgc2l6ZV90IEdsb2JhbFdpZHRoKSBjb25zdCBvdmVycmlkZSB7CisgICAgUGFzc05hbWVQYXJzZXIgKlBOUCA9IGNvbnN0X2Nhc3Q8UGFzc05hbWVQYXJzZXIqPih0aGlzKTsKKyAgICBhcnJheV9wb2Rfc29ydChQTlAtPlZhbHVlcy5iZWdpbigpLCBQTlAtPlZhbHVlcy5lbmQoKSwgVmFsQ29tcGFyZSk7CisgICAgY2w6OnBhcnNlcjxjb25zdCBQYXNzSW5mbyo+OjpwcmludE9wdGlvbkluZm8oTywgR2xvYmFsV2lkdGgpOworICB9CisKK3ByaXZhdGU6CisgIC8vIFZhbENvbXBhcmUgLSBQcm92aWRlIGEgc29ydGluZyBjb21wYXJhdG9yIGZvciBWYWx1ZXMgZWxlbWVudHMuLi4KKyAgc3RhdGljIGludCBWYWxDb21wYXJlKGNvbnN0IFBhc3NOYW1lUGFyc2VyOjpPcHRpb25JbmZvICpWVDEsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQYXNzTmFtZVBhcnNlcjo6T3B0aW9uSW5mbyAqVlQyKSB7CisgICAgcmV0dXJuIFZUMS0+TmFtZS5jb21wYXJlKFZUMi0+TmFtZSk7CisgIH0KK307CisKKy8vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEZpbHRlcmVkUGFzc05hbWVQYXJzZXIgY2xhc3MgLSBNYWtlIHVzZSBvZiB0aGUgcGFzcyByZWdpc3RyYXRpb24KKy8vLyBtZWNoYW5pc20gdG8gYXV0b21hdGljYWxseSBhZGQgYSBjb21tYW5kIGxpbmUgYXJndW1lbnQgdG8gb3B0IGZvcgorLy8vIGVhY2ggcGFzcyB0aGF0IHNhdGlzZmllcyBhIGZpbHRlciBjcml0ZXJpYS4gIEZpbHRlciBzaG91bGQgcmV0dXJuCisvLy8gdHJ1ZSBmb3IgcGFzc2VzIHRvIGJlIHJlZ2lzdGVyZWQgYXMgY29tbWFuZC1saW5lIG9wdGlvbnMuCisvLy8KK3RlbXBsYXRlPHR5cGVuYW1lIEZpbHRlcj4KK2NsYXNzIEZpbHRlcmVkUGFzc05hbWVQYXJzZXIgOiBwdWJsaWMgUGFzc05hbWVQYXJzZXIgeworcHJpdmF0ZToKKyAgRmlsdGVyIGZpbHRlcjsKKworcHVibGljOgorICBib29sIGlnbm9yYWJsZVBhc3NJbXBsKGNvbnN0IFBhc3NJbmZvICpQKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuICFmaWx0ZXIoKlApOworICB9Cit9OworCisvLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBQYXNzQXJnRmlsdGVyIC0gQSBmaWx0ZXIgZm9yIHVzZSB3aXRoIFBhc3NOYW1lRmlsdGVyUGFyc2VyIHRoYXQgb25seQorLy8vIGFjY2VwdHMgYSBQYXNzIHdob3NlIEFyZyBtYXRjaGVzIGNlcnRhaW4gc3RyaW5ncy4KKy8vLworLy8vIFVzZSBsaWtlIHRoaXM6CisvLy8KKy8vLyBleHRlcm4gY29uc3QgY2hhciBBbGxvd2VkUGFzc0FyZ3NbXSA9ICItYW5kZXJzX2FhIC1kc2UiOworLy8vCisvLy8gc3RhdGljIGNsOjpsaXN0PAorLy8vICAgY29uc3QgUGFzc0luZm8qLAorLy8vICAgYm9vbCwKKy8vLyAgIEZpbHRlcmVkUGFzc05hbWVQYXJzZXI8UGFzc0FyZ0ZpbHRlcjxBbGxvd2VkUGFzc0FyZ3M+ID4gPgorLy8vIFBhc3NMaXN0KGNsOjpkZXNjKCJQYXNzZXMgYXZhaWxhYmxlOiIpKTsKKy8vLworLy8vIE9ubHkgdGhlIC1hbmRlcnNfYWEgYW5kIC1kc2Ugb3B0aW9ucyB3aWxsIGJlIGF2YWlsYWJsZSB0byB0aGUgdXNlci4KKy8vLwordGVtcGxhdGU8Y29uc3QgY2hhciAqQXJncz4KK2NsYXNzIFBhc3NBcmdGaWx0ZXIgeworcHVibGljOgorICBib29sIG9wZXJhdG9yKCkoY29uc3QgUGFzc0luZm8gJlApIGNvbnN0IHsKKyAgICByZXR1cm4gU3RyaW5nUmVmKEFyZ3MpLmNvbnRhaW5zKFAuZ2V0UGFzc0FyZ3VtZW50KCkpOworICB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTURCdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL01EQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1MjE4ZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL01EQnVpbGRlci5oCkBAIC0wLDAgKzEsMjAzIEBACisvLz09PS0tLS0gbGx2bS9NREJ1aWxkZXIuaCAtIEJ1aWxkZXIgZm9yIExMVk0gbWV0YWRhdGEgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBNREJ1aWxkZXIgY2xhc3MsIHdoaWNoIGlzIHVzZWQgYXMgYSBjb252ZW5pZW50IHdheSB0bworLy8gY3JlYXRlIExMVk0gbWV0YWRhdGEgd2l0aCBhIGNvbnNpc3RlbnQgYW5kIHNpbXBsaWZpZWQgaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9NREJVSUxERVJfSAorI2RlZmluZSBMTFZNX0lSX01EQlVJTERFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBUEludDsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheVJlZjsKK2NsYXNzIExMVk1Db250ZXh0OworY2xhc3MgQ29uc3RhbnQ7CitjbGFzcyBDb25zdGFudEFzTWV0YWRhdGE7CitjbGFzcyBNRE5vZGU7CitjbGFzcyBNRFN0cmluZzsKK2NsYXNzIE1ldGFkYXRhOworCitjbGFzcyBNREJ1aWxkZXIgeworICBMTFZNQ29udGV4dCAmQ29udGV4dDsKKworcHVibGljOgorICBNREJ1aWxkZXIoTExWTUNvbnRleHQgJmNvbnRleHQpIDogQ29udGV4dChjb250ZXh0KSB7fQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBnaXZlbiBzdHJpbmcgYXMgbWV0YWRhdGEuCisgIE1EU3RyaW5nICpjcmVhdGVTdHJpbmcoU3RyaW5nUmVmIFN0cik7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGdpdmVuIGNvbnN0YW50IGFzIG1ldGFkYXRhLgorICBDb25zdGFudEFzTWV0YWRhdGEgKmNyZWF0ZUNvbnN0YW50KENvbnN0YW50ICpDKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEZQTWF0aCBtZXRhZGF0YS4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBcYnJpZWYgUmV0dXJuIG1ldGFkYXRhIHdpdGggdGhlIGdpdmVuIHNldHRpbmdzLiAgVGhlIHNwZWNpYWwgdmFsdWUgMC4wCisgIC8vLyBmb3IgdGhlIEFjY3VyYWN5IHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIGRlZmF1bHQgKG1heGltYWwgcHJlY2lzaW9uKQorICAvLy8gc2V0dGluZy4KKyAgTUROb2RlICpjcmVhdGVGUE1hdGgoZmxvYXQgQWNjdXJhY3kpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gUHJvZiBtZXRhZGF0YS4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBcYnJpZWYgUmV0dXJuIG1ldGFkYXRhIGNvbnRhaW5pbmcgdHdvIGJyYW5jaCB3ZWlnaHRzLgorICBNRE5vZGUgKmNyZWF0ZUJyYW5jaFdlaWdodHModWludDMyX3QgVHJ1ZVdlaWdodCwgdWludDMyX3QgRmFsc2VXZWlnaHQpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIG1ldGFkYXRhIGNvbnRhaW5pbmcgYSBudW1iZXIgb2YgYnJhbmNoIHdlaWdodHMuCisgIE1ETm9kZSAqY3JlYXRlQnJhbmNoV2VpZ2h0cyhBcnJheVJlZjx1aW50MzJfdD4gV2VpZ2h0cyk7CisKKyAgLy8vIFJldHVybiBtZXRhZGF0YSBzcGVjaWZ5aW5nIHRoYXQgYSBicmFuY2ggb3Igc3dpdGNoIGlzIHVucHJlZGljdGFibGUuCisgIE1ETm9kZSAqY3JlYXRlVW5wcmVkaWN0YWJsZSgpOworCisgIC8vLyBSZXR1cm4gbWV0YWRhdGEgY29udGFpbmluZyB0aGUgZW50cnkgXHAgQ291bnQgZm9yIGEgZnVuY3Rpb24sIGEgYm9vbGVhbgorICAvLy8gXFN5bnRoZXRpYyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGNvdW50cyB3ZXJlIHN5bnRoZXRpemVkLCBhbmQgdGhlCisgIC8vLyBHVUlEcyBzdG9yZWQgaW4gXHAgSW1wb3J0cyB0aGF0IG5lZWQgdG8gYmUgaW1wb3J0ZWQgZm9yIHNhbXBsZSBQR08sIHRvCisgIC8vLyBlbmFibGUgdGhlIHNhbWUgaW5saW5lcyBhcyB0aGUgcHJvZmlsZWQgb3B0aW1pemVkIGJpbmFyeQorICBNRE5vZGUgKmNyZWF0ZUZ1bmN0aW9uRW50cnlDb3VudCh1aW50NjRfdCBDb3VudCwgYm9vbCBTeW50aGV0aWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlbnNlU2V0PEdsb2JhbFZhbHVlOjpHVUlEPiAqSW1wb3J0cyk7CisKKyAgLy8vIFJldHVybiBtZXRhZGF0YSBjb250YWluaW5nIHRoZSBzZWN0aW9uIHByZWZpeCBmb3IgYSBmdW5jdGlvbi4KKyAgTUROb2RlICpjcmVhdGVGdW5jdGlvblNlY3Rpb25QcmVmaXgoU3RyaW5nUmVmIFByZWZpeCk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBSYW5nZSBtZXRhZGF0YS4KKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBcYnJpZWYgUmV0dXJuIG1ldGFkYXRhIGRlc2NyaWJpbmcgdGhlIHJhbmdlIFtMbywgSGkpLgorICBNRE5vZGUgKmNyZWF0ZVJhbmdlKGNvbnN0IEFQSW50ICZMbywgY29uc3QgQVBJbnQgJkhpKTsKKworICAvLy8gXGJyaWVmIFJldHVybiBtZXRhZGF0YSBkZXNjcmliaW5nIHRoZSByYW5nZSBbTG8sIEhpKS4KKyAgTUROb2RlICpjcmVhdGVSYW5nZShDb25zdGFudCAqTG8sIENvbnN0YW50ICpIaSk7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDYWxsZWVzIG1ldGFkYXRhLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFxicmllZiBSZXR1cm4gbWV0YWRhdGEgaW5kaWNhdGluZyB0aGUgcG9zc2libGUgY2FsbGVlcyBvZiBpbmRpcmVjdAorICAvLy8gY2FsbHMuCisgIE1ETm9kZSAqY3JlYXRlQ2FsbGVlcyhBcnJheVJlZjxGdW5jdGlvbiAqPiBDYWxsZWVzKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEFBIG1ldGFkYXRhLgorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK3Byb3RlY3RlZDoKKyAgLy8vIFxicmllZiBSZXR1cm4gbWV0YWRhdGEgYXBwcm9wcmlhdGUgZm9yIGEgQUEgcm9vdCBub2RlIChzY29wZSBvciBUQkFBKS4KKyAgLy8vIEVhY2ggcmV0dXJuZWQgbm9kZSBpcyBkaXN0aW5jdCBmcm9tIGFsbCBvdGhlciBtZXRhZGF0YSBhbmQgd2lsbCBuZXZlcgorICAvLy8gYmUgaWRlbnRpZmllZCAodW5pcXVlZCkgd2l0aCBhbnl0aGluZyBlbHNlLgorICBNRE5vZGUgKmNyZWF0ZUFub255bW91c0FBUm9vdChTdHJpbmdSZWYgTmFtZSA9IFN0cmluZ1JlZigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKkV4dHJhID0gbnVsbHB0cik7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBSZXR1cm4gbWV0YWRhdGEgYXBwcm9wcmlhdGUgZm9yIGEgVEJBQSByb290IG5vZGUuIEVhY2ggcmV0dXJuZWQKKyAgLy8vIG5vZGUgaXMgZGlzdGluY3QgZnJvbSBhbGwgb3RoZXIgbWV0YWRhdGEgYW5kIHdpbGwgbmV2ZXIgYmUgaWRlbnRpZmllZAorICAvLy8gKHVuaXF1ZWQpIHdpdGggYW55dGhpbmcgZWxzZS4KKyAgTUROb2RlICpjcmVhdGVBbm9ueW1vdXNUQkFBUm9vdCgpIHsKKyAgICByZXR1cm4gY3JlYXRlQW5vbnltb3VzQUFSb290KCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBtZXRhZGF0YSBhcHByb3ByaWF0ZSBmb3IgYW4gYWxpYXMgc2NvcGUgZG9tYWluIG5vZGUuCisgIC8vLyBFYWNoIHJldHVybmVkIG5vZGUgaXMgZGlzdGluY3QgZnJvbSBhbGwgb3RoZXIgbWV0YWRhdGEgYW5kIHdpbGwgbmV2ZXIKKyAgLy8vIGJlIGlkZW50aWZpZWQgKHVuaXF1ZWQpIHdpdGggYW55dGhpbmcgZWxzZS4KKyAgTUROb2RlICpjcmVhdGVBbm9ueW1vdXNBbGlhc1Njb3BlRG9tYWluKFN0cmluZ1JlZiBOYW1lID0gU3RyaW5nUmVmKCkpIHsKKyAgICByZXR1cm4gY3JlYXRlQW5vbnltb3VzQUFSb290KE5hbWUpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gbWV0YWRhdGEgYXBwcm9wcmlhdGUgZm9yIGFuIGFsaWFzIHNjb3BlIHJvb3Qgbm9kZS4KKyAgLy8vIEVhY2ggcmV0dXJuZWQgbm9kZSBpcyBkaXN0aW5jdCBmcm9tIGFsbCBvdGhlciBtZXRhZGF0YSBhbmQgd2lsbCBuZXZlcgorICAvLy8gYmUgaWRlbnRpZmllZCAodW5pcXVlZCkgd2l0aCBhbnl0aGluZyBlbHNlLgorICBNRE5vZGUgKmNyZWF0ZUFub255bW91c0FsaWFzU2NvcGUoTUROb2RlICpEb21haW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTmFtZSA9IFN0cmluZ1JlZigpKSB7CisgICAgcmV0dXJuIGNyZWF0ZUFub255bW91c0FBUm9vdChOYW1lLCBEb21haW4pOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gbWV0YWRhdGEgYXBwcm9wcmlhdGUgZm9yIGEgVEJBQSByb290IG5vZGUgd2l0aCB0aGUgZ2l2ZW4KKyAgLy8vIG5hbWUuICBUaGlzIG1heSBiZSBpZGVudGlmaWVkICh1bmlxdWVkKSB3aXRoIG90aGVyIHJvb3RzIHdpdGggdGhlIHNhbWUKKyAgLy8vIG5hbWUuCisgIE1ETm9kZSAqY3JlYXRlVEJBQVJvb3QoU3RyaW5nUmVmIE5hbWUpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIG1ldGFkYXRhIGFwcHJvcHJpYXRlIGZvciBhbiBhbGlhcyBzY29wZSBkb21haW4gbm9kZSB3aXRoCisgIC8vLyB0aGUgZ2l2ZW4gbmFtZS4gVGhpcyBtYXkgYmUgaWRlbnRpZmllZCAodW5pcXVlZCkgd2l0aCBvdGhlciByb290cyB3aXRoCisgIC8vLyB0aGUgc2FtZSBuYW1lLgorICBNRE5vZGUgKmNyZWF0ZUFsaWFzU2NvcGVEb21haW4oU3RyaW5nUmVmIE5hbWUpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIG1ldGFkYXRhIGFwcHJvcHJpYXRlIGZvciBhbiBhbGlhcyBzY29wZSBub2RlIHdpdGgKKyAgLy8vIHRoZSBnaXZlbiBuYW1lLiBUaGlzIG1heSBiZSBpZGVudGlmaWVkICh1bmlxdWVkKSB3aXRoIG90aGVyIHNjb3BlcyB3aXRoCisgIC8vLyB0aGUgc2FtZSBuYW1lIGFuZCBkb21haW4uCisgIE1ETm9kZSAqY3JlYXRlQWxpYXNTY29wZShTdHJpbmdSZWYgTmFtZSwgTUROb2RlICpEb21haW4pOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIG1ldGFkYXRhIGZvciBhIG5vbi1yb290IFRCQUEgbm9kZSB3aXRoIHRoZSBnaXZlbiBuYW1lLAorICAvLy8gcGFyZW50IGluIHRoZSBUQkFBIHRyZWUsIGFuZCB2YWx1ZSBmb3IgJ3BvaW50c1RvQ29uc3RhbnRNZW1vcnknLgorICBNRE5vZGUgKmNyZWF0ZVRCQUFOb2RlKFN0cmluZ1JlZiBOYW1lLCBNRE5vZGUgKlBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzQ29uc3RhbnQgPSBmYWxzZSk7CisKKyAgc3RydWN0IFRCQUFTdHJ1Y3RGaWVsZCB7CisgICAgdWludDY0X3QgT2Zmc2V0OworICAgIHVpbnQ2NF90IFNpemU7CisgICAgTUROb2RlICpUeXBlOworICAgIFRCQUFTdHJ1Y3RGaWVsZCh1aW50NjRfdCBPZmZzZXQsIHVpbnQ2NF90IFNpemUsIE1ETm9kZSAqVHlwZSkgOgorICAgICAgT2Zmc2V0KE9mZnNldCksIFNpemUoU2l6ZSksIFR5cGUoVHlwZSkge30KKyAgfTsKKworICAvLy8gXGJyaWVmIFJldHVybiBtZXRhZGF0YSBmb3IgYSB0YmFhLnN0cnVjdCBub2RlIHdpdGggdGhlIGdpdmVuCisgIC8vLyBzdHJ1Y3QgZmllbGQgZGVzY3JpcHRpb25zLgorICBNRE5vZGUgKmNyZWF0ZVRCQUFTdHJ1Y3ROb2RlKEFycmF5UmVmPFRCQUFTdHJ1Y3RGaWVsZD4gRmllbGRzKTsKKworICAvLy8gXGJyaWVmIFJldHVybiBtZXRhZGF0YSBmb3IgYSBUQkFBIHN0cnVjdCBub2RlIGluIHRoZSB0eXBlIERBRworICAvLy8gd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgYSBsaXN0IG9mIHBhaXJzIChvZmZzZXQsIGZpZWxkIHR5cGUgaW4gdGhlIHR5cGUgREFHKS4KKyAgTUROb2RlICoKKyAgY3JlYXRlVEJBQVN0cnVjdFR5cGVOb2RlKFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8c3RkOjpwYWlyPE1ETm9kZSAqLCB1aW50NjRfdD4+IEZpZWxkcyk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gbWV0YWRhdGEgZm9yIGEgVEJBQSBzY2FsYXIgdHlwZSBub2RlIHdpdGggdGhlCisgIC8vLyBnaXZlbiBuYW1lLCBhbiBvZmZzZXQgYW5kIGEgcGFyZW50IGluIHRoZSBUQkFBIHR5cGUgREFHLgorICBNRE5vZGUgKmNyZWF0ZVRCQUFTY2FsYXJUeXBlTm9kZShTdHJpbmdSZWYgTmFtZSwgTUROb2RlICpQYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldCA9IDApOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIG1ldGFkYXRhIGZvciBhIFRCQUEgdGFnIG5vZGUgd2l0aCB0aGUgZ2l2ZW4KKyAgLy8vIGJhc2UgdHlwZSwgYWNjZXNzIHR5cGUgYW5kIG9mZnNldCByZWxhdGl2ZSB0byB0aGUgYmFzZSB0eXBlLgorICBNRE5vZGUgKmNyZWF0ZVRCQUFTdHJ1Y3RUYWdOb2RlKE1ETm9kZSAqQmFzZVR5cGUsIE1ETm9kZSAqQWNjZXNzVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXQsIGJvb2wgSXNDb25zdGFudCA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIFJldHVybiBtZXRhZGF0YSBmb3IgYSBUQkFBIHR5cGUgbm9kZSBpbiB0aGUgVEJBQSB0eXBlIERBRyB3aXRoIHRoZQorICAvLy8gZ2l2ZW4gcGFyZW50IHR5cGUsIHNpemUgaW4gYnl0ZXMsIHR5cGUgaWRlbnRpZmllciBhbmQgYSBsaXN0IG9mIGZpZWxkcy4KKyAgTUROb2RlICpjcmVhdGVUQkFBVHlwZU5vZGUoTUROb2RlICpQYXJlbnQsIHVpbnQ2NF90IFNpemUsIE1ldGFkYXRhICpJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VEJBQVN0cnVjdEZpZWxkPiBGaWVsZHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VEJBQVN0cnVjdEZpZWxkPigpKTsKKworICAvLy8gXGJyaWVmIFJldHVybiBtZXRhZGF0YSBmb3IgYSBUQkFBIGFjY2VzcyB0YWcgd2l0aCB0aGUgZ2l2ZW4gYmFzZSB0eXBlLAorICAvLy8gZmluYWwgYWNjZXNzIHR5cGUsIG9mZnNldCBvZiB0aGUgYWNjZXNzIHJlbGF0aXZlIHRvIHRoZSBiYXNlIHR5cGUsIHNpemUgb2YKKyAgLy8vIHRoZSBhY2Nlc3MgYW5kIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBhY2Nlc3NlZCBvYmplY3QgY2FuIGJlCisgIC8vLyBjb25zaWRlcmVkIGltbXV0YWJsZSBmb3IgdGhlIHB1cnBvc2VzIG9mIHRoZSBUQkFBIGFuYWx5c2lzLgorICBNRE5vZGUgKmNyZWF0ZVRCQUFBY2Nlc3NUYWcoTUROb2RlICpCYXNlVHlwZSwgTUROb2RlICpBY2Nlc3NUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0LCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0ltbXV0YWJsZSA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIFJldHVybiBtdXRhYmxlIHZlcnNpb24gb2YgdGhlIGdpdmVuIG11dGFibGUgb3IgaW1tdXRhYmxlIFRCQUEKKyAgLy8vIGFjY2VzcyB0YWcuCisgIE1ETm9kZSAqY3JlYXRlTXV0YWJsZVRCQUFBY2Nlc3NUYWcoTUROb2RlICpUYWcpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIG1ldGFkYXRhIGNvbnRhaW5pbmcgYW4gaXJyZWR1Y2libGUgbG9vcCBoZWFkZXIgd2VpZ2h0LgorICBNRE5vZGUgKmNyZWF0ZUlyckxvb3BIZWFkZXJXZWlnaHQodWludDY0X3QgV2VpZ2h0KTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9NYW5nbGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL01hbmdsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjYxYzAwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9NYW5nbGVyLmgKQEAgLTAsMCArMSw1OCBAQAorLy89PT0tLSBsbHZtL0lSL01hbmdsZXIuaCAtIFNlbGYtY29udGFpbmVkIG5hbWUgbWFuZ2xlciAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBVbmlmaWVkIG5hbWUgbWFuZ2xlciBmb3IgdmFyaW91cyBiYWNrZW5kcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfTUFOR0xFUl9ICisjZGVmaW5lIExMVk1fSVJfTUFOR0xFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsVmFsdWUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBEYXRhTGF5b3V0OwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKK2NsYXNzIFRyaXBsZTsKK2NsYXNzIFR3aW5lOworY2xhc3MgcmF3X29zdHJlYW07CisKK2NsYXNzIE1hbmdsZXIgeworICAvLy8gV2UgbmVlZCB0byBnaXZlIGdsb2JhbCB2YWx1ZXMgdGhlIHNhbWUgbmFtZSBldmVyeSB0aW1lIHRoZXkgYXJlIG1hbmdsZWQuCisgIC8vLyBUaGlzIGtlZXBzIHRyYWNrIG9mIHRoZSBudW1iZXIgd2UgZ2l2ZSB0byBhbm9ueW1vdXMgb25lcy4KKyAgbXV0YWJsZSBEZW5zZU1hcDxjb25zdCBHbG9iYWxWYWx1ZSosIHVuc2lnbmVkPiBBbm9uR2xvYmFsSURzOworCitwdWJsaWM6CisgIC8vLyBQcmludCB0aGUgYXBwcm9wcmlhdGUgcHJlZml4IGFuZCB0aGUgc3BlY2lmaWVkIGdsb2JhbCB2YXJpYWJsZSdzIG5hbWUuCisgIC8vLyBJZiB0aGUgZ2xvYmFsIHZhcmlhYmxlIGRvZXNuJ3QgaGF2ZSBhIG5hbWUsIHRoaXMgZmlsbHMgaW4gYSB1bmlxdWUgbmFtZQorICAvLy8gZm9yIHRoZSBnbG9iYWwuCisgIHZvaWQgZ2V0TmFtZVdpdGhQcmVmaXgocmF3X29zdHJlYW0gJk9TLCBjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDYW5ub3RVc2VQcml2YXRlTGFiZWwpIGNvbnN0OworICB2b2lkIGdldE5hbWVXaXRoUHJlZml4KFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmT3V0TmFtZSwgY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ2Fubm90VXNlUHJpdmF0ZUxhYmVsKSBjb25zdDsKKworICAvLy8gUHJpbnQgdGhlIGFwcHJvcHJpYXRlIHByZWZpeCBhbmQgdGhlIHNwZWNpZmllZCBuYW1lIGFzIHRoZSBnbG9iYWwgdmFyaWFibGUKKyAgLy8vIG5hbWUuIEdWTmFtZSBtdXN0IG5vdCBiZSBlbXB0eS4KKyAgc3RhdGljIHZvaWQgZ2V0TmFtZVdpdGhQcmVmaXgocmF3X29zdHJlYW0gJk9TLCBjb25zdCBUd2luZSAmR1ZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCk7CisgIHN0YXRpYyB2b2lkIGdldE5hbWVXaXRoUHJlZml4KFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmT3V0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJkdWTmFtZSwgY29uc3QgRGF0YUxheW91dCAmREwpOworfTsKKwordm9pZCBlbWl0TGlua2VyRmxhZ3NGb3JHbG9iYWxDT0ZGKHJhd19vc3RyZWFtICZPUywgY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyaXBsZSAmVFQsIE1hbmdsZXIgJk1hbmdsZXIpOworCit2b2lkIGVtaXRMaW5rZXJGbGFnc0ZvclVzZWRDT0ZGKHJhd19vc3RyZWFtICZPUywgY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmlwbGUgJlQsIE1hbmdsZXIgJk0pOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTWV0YWRhdGEuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9NZXRhZGF0YS5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNjZGNhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTWV0YWRhdGEuZGVmCkBAIC0wLDAgKzEsMTI1IEBACisvLz09PS0gbGx2bS9JUi9NZXRhZGF0YS5kZWYgLSBNZXRhZGF0YSBkZWZpbml0aW9ucyAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIE1hY3JvcyBmb3IgcnVubmluZyB0aHJvdWdoIGFsbCB0eXBlcyBvZiBtZXRhZGF0YS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWYgIShkZWZpbmVkIEhBTkRMRV9NRVRBREFUQSB8fCBkZWZpbmVkIEhBTkRMRV9NRVRBREFUQV9MRUFGIHx8ICAgICAgICAgICAgICAgXAorICAgICAgZGVmaW5lZCBIQU5ETEVfTUVUQURBVEFfQlJBTkNIIHx8IGRlZmluZWQgSEFORExFX01ETk9ERV9MRUFGIHx8ICAgICAgICAgIFwKKyAgICAgIGRlZmluZWQgSEFORExFX01ETk9ERV9MRUFGX1VOSVFVQUJMRSB8fCBkZWZpbmVkIEhBTkRMRV9NRE5PREVfQlJBTkNIIHx8ICBcCisgICAgICBkZWZpbmVkIEhBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfTEVBRl9VTklRVUFCTEUgfHwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZGVmaW5lZCBIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUYgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGRlZmluZWQgSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9CUkFOQ0gpCisjZXJyb3IgIk1pc3NpbmcgbWFjcm8gZGVmaW5pdGlvbiBvZiBIQU5ETEVfTUVUQURBVEEqIgorI2VuZGlmCisKKy8vIEhhbmRsZXIgZm9yIGFsbCB0eXBlcyBvZiBtZXRhZGF0YS4KKyNpZm5kZWYgSEFORExFX01FVEFEQVRBCisjZGVmaW5lIEhBTkRMRV9NRVRBREFUQShDTEFTUykKKyNlbmRpZgorCisvLyBIYW5kbGVyIGZvciBsZWFmIG5vZGVzIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkuCisjaWZuZGVmIEhBTkRMRV9NRVRBREFUQV9MRUFGCisjZGVmaW5lIEhBTkRMRV9NRVRBREFUQV9MRUFGKENMQVNTKSBIQU5ETEVfTUVUQURBVEEoQ0xBU1MpCisjZW5kaWYKKworLy8gSGFuZGxlciBmb3Igbm9uLWxlYWYgbm9kZXMgaW4gdGhlIGNsYXNzIGhpZXJhcmNoeS4KKyNpZm5kZWYgSEFORExFX01FVEFEQVRBX0JSQU5DSAorI2RlZmluZSBIQU5ETEVfTUVUQURBVEFfQlJBTkNIKENMQVNTKSBIQU5ETEVfTUVUQURBVEEoQ0xBU1MpCisjZW5kaWYKKworLy8gSGFuZGxlciBmb3Igc3BlY2lhbGl6ZWQgYW5kIHVuaXF1YWJsZSBsZWFmIG5vZGVzIHVuZGVyIE1ETm9kZS4gIERlZmVycyB0bworLy8gSEFORExFX01ETk9ERV9MRUFGX1VOSVFVQUJMRSBpZiBpdCdzIGRlZmluZWQsIG90aGVyd2lzZSB0bworLy8gSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9MRUFGLgorI2lmbmRlZiBIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFCisjaWZkZWYgSEFORExFX01ETk9ERV9MRUFGX1VOSVFVQUJMRQorI2RlZmluZSBIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKENMQVNTKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSEFORExFX01ETk9ERV9MRUFGX1VOSVFVQUJMRShDTEFTUykKKyNlbHNlCisjZGVmaW5lIEhBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfTEVBRl9VTklRVUFCTEUoQ0xBU1MpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUYoQ0xBU1MpCisjZW5kaWYKKyNlbmRpZgorCisvLyBIYW5kbGVyIGZvciBsZWFmIG5vZGVzIHVuZGVyIE1ETm9kZS4KKyNpZm5kZWYgSEFORExFX01ETk9ERV9MRUFGX1VOSVFVQUJMRQorI2RlZmluZSBIQU5ETEVfTUROT0RFX0xFQUZfVU5JUVVBQkxFKENMQVNTKSBIQU5ETEVfTUROT0RFX0xFQUYoQ0xBU1MpCisjZW5kaWYKKworLy8gSGFuZGxlciBmb3IgbGVhZiBub2RlcyB1bmRlciBNRE5vZGUuCisjaWZuZGVmIEhBTkRMRV9NRE5PREVfTEVBRgorI2RlZmluZSBIQU5ETEVfTUROT0RFX0xFQUYoQ0xBU1MpIEhBTkRMRV9NRVRBREFUQV9MRUFGKENMQVNTKQorI2VuZGlmCisKKy8vIEhhbmRsZXIgZm9yIG5vbi1sZWFmIG5vZGVzIHVuZGVyIE1ETm9kZS4KKyNpZm5kZWYgSEFORExFX01ETk9ERV9CUkFOQ0gKKyNkZWZpbmUgSEFORExFX01ETk9ERV9CUkFOQ0goQ0xBU1MpIEhBTkRMRV9NRVRBREFUQV9CUkFOQ0goQ0xBU1MpCisjZW5kaWYKKworLy8gSGFuZGxlciBmb3Igc3BlY2lhbGl6ZWQgbGVhZiBub2RlcyB1bmRlciBNRE5vZGUuCisjaWZuZGVmIEhBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfTEVBRgorI2RlZmluZSBIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUYoQ0xBU1MpIEhBTkRMRV9NRE5PREVfTEVBRihDTEFTUykKKyNlbmRpZgorCisvLyBIYW5kbGVyIGZvciBzcGVjaWFsaXplZCBub24tbGVhZiBub2RlcyB1bmRlciBNRE5vZGUuCisjaWZuZGVmIEhBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfQlJBTkNICisjZGVmaW5lIEhBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfQlJBTkNIKENMQVNTKSBIQU5ETEVfTUROT0RFX0JSQU5DSChDTEFTUykKKyNlbmRpZgorCitIQU5ETEVfTUVUQURBVEFfTEVBRihNRFN0cmluZykKK0hBTkRMRV9NRVRBREFUQV9CUkFOQ0goVmFsdWVBc01ldGFkYXRhKQorSEFORExFX01FVEFEQVRBX0xFQUYoQ29uc3RhbnRBc01ldGFkYXRhKQorSEFORExFX01FVEFEQVRBX0xFQUYoTG9jYWxBc01ldGFkYXRhKQorSEFORExFX01FVEFEQVRBX0xFQUYoRGlzdGluY3RNRE9wZXJhbmRQbGFjZWhvbGRlcikKK0hBTkRMRV9NRE5PREVfQlJBTkNIKE1ETm9kZSkKK0hBTkRMRV9NRE5PREVfTEVBRl9VTklRVUFCTEUoTURUdXBsZSkKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfTEVBRl9VTklRVUFCTEUoRElMb2NhdGlvbikKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfTEVBRl9VTklRVUFCTEUoRElFeHByZXNzaW9uKQorSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9MRUFGX1VOSVFVQUJMRShESUdsb2JhbFZhcmlhYmxlRXhwcmVzc2lvbikKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfQlJBTkNIKERJTm9kZSkKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfTEVBRl9VTklRVUFCTEUoR2VuZXJpY0RJTm9kZSkKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfTEVBRl9VTklRVUFCTEUoRElTdWJyYW5nZSkKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfTEVBRl9VTklRVUFCTEUoRElFbnVtZXJhdG9yKQorSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9CUkFOQ0goRElTY29wZSkKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfQlJBTkNIKERJVHlwZSkKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfTEVBRl9VTklRVUFCTEUoRElCYXNpY1R5cGUpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJRGVyaXZlZFR5cGUpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJQ29tcG9zaXRlVHlwZSkKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfTEVBRl9VTklRVUFCTEUoRElTdWJyb3V0aW5lVHlwZSkKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfTEVBRl9VTklRVUFCTEUoRElGaWxlKQorSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9MRUFGKERJQ29tcGlsZVVuaXQpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0JSQU5DSChESUxvY2FsU2NvcGUpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJU3VicHJvZ3JhbSkKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfQlJBTkNIKERJTGV4aWNhbEJsb2NrQmFzZSkKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfTEVBRl9VTklRVUFCTEUoRElMZXhpY2FsQmxvY2spCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJTGV4aWNhbEJsb2NrRmlsZSkKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfTEVBRl9VTklRVUFCTEUoRElOYW1lc3BhY2UpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJTW9kdWxlKQorSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9CUkFOQ0goRElUZW1wbGF0ZVBhcmFtZXRlcikKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfTEVBRl9VTklRVUFCTEUoRElUZW1wbGF0ZVR5cGVQYXJhbWV0ZXIpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJVGVtcGxhdGVWYWx1ZVBhcmFtZXRlcikKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfQlJBTkNIKERJVmFyaWFibGUpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJR2xvYmFsVmFyaWFibGUpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJTG9jYWxWYXJpYWJsZSkKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfTEVBRl9VTklRVUFCTEUoRElPYmpDUHJvcGVydHkpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFKERJSW1wb3J0ZWRFbnRpdHkpCitIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0JSQU5DSChESU1hY3JvTm9kZSkKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfTEVBRl9VTklRVUFCTEUoRElNYWNybykKK0hBTkRMRV9TUEVDSUFMSVpFRF9NRE5PREVfTEVBRl9VTklRVUFCTEUoRElNYWNyb0ZpbGUpCisKKyN1bmRlZiBIQU5ETEVfTUVUQURBVEEKKyN1bmRlZiBIQU5ETEVfTUVUQURBVEFfTEVBRgorI3VuZGVmIEhBTkRMRV9NRVRBREFUQV9CUkFOQ0gKKyN1bmRlZiBIQU5ETEVfTUROT0RFX0xFQUYKKyN1bmRlZiBIQU5ETEVfTUROT0RFX0xFQUZfVU5JUVVBQkxFCisjdW5kZWYgSEFORExFX01ETk9ERV9CUkFOQ0gKKyN1bmRlZiBIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUYKKyN1bmRlZiBIQU5ETEVfU1BFQ0lBTElaRURfTUROT0RFX0xFQUZfVU5JUVVBQkxFCisjdW5kZWYgSEFORExFX1NQRUNJQUxJWkVEX01ETk9ERV9CUkFOQ0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTWV0YWRhdGEuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTWV0YWRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzBiODdhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9NZXRhZGF0YS5oCkBAIC0wLDAgKzEsMTQyNSBAQAorLy89PT0tIGxsdm0vSVIvTWV0YWRhdGEuaCAtIE1ldGFkYXRhIGRlZmluaXRpb25zIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gQGZpbGUKKy8vLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyBmb3IgbWV0YWRhdGEgc3ViY2xhc3Nlcy4KKy8vLyBUaGV5IHJlcHJlc2VudCB0aGUgZGlmZmVyZW50IGZsYXZvcnMgb2YgbWV0YWRhdGEgdGhhdCBsaXZlIGluIExMVk0uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX01FVEFEQVRBX0gKKyNkZWZpbmUgTExWTV9JUl9NRVRBREFUQV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXBJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJVbmlvbi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3Rfbm9kZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudC5oIgorI2luY2x1ZGUgImxsdm0vSVIvTExWTUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NCaW5kaW5nV3JhcHBpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIE1vZHVsZVNsb3RUcmFja2VyOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBUeXBlOworCitlbnVtIExMVk1Db25zdGFudHMgOiB1aW50MzJfdCB7CisgIERFQlVHX01FVEFEQVRBX1ZFUlNJT04gPSAzIC8vIEN1cnJlbnQgZGVidWcgaW5mbyB2ZXJzaW9uIG51bWJlci4KK307CisKKy8vLyBcYnJpZWYgUm9vdCBvZiB0aGUgbWV0YWRhdGEgaGllcmFyY2h5LgorLy8vCisvLy8gVGhpcyBpcyBhIHJvb3QgY2xhc3MgZm9yIHR5cGVsZXNzIGRhdGEgaW4gdGhlIElSLgorY2xhc3MgTWV0YWRhdGEgeworICBmcmllbmQgY2xhc3MgUmVwbGFjZWFibGVNZXRhZGF0YUltcGw7CisKKyAgLy8vIFxicmllZiBSVFRJLgorICBjb25zdCB1bnNpZ25lZCBjaGFyIFN1YmNsYXNzSUQ7CisKK3Byb3RlY3RlZDoKKyAgLy8vIFxicmllZiBBY3RpdmUgdHlwZSBvZiBzdG9yYWdlLgorICBlbnVtIFN0b3JhZ2VUeXBlIHsgVW5pcXVlZCwgRGlzdGluY3QsIFRlbXBvcmFyeSB9OworCisgIC8vLyBcYnJpZWYgU3RvcmFnZSBmbGFnIGZvciBub24tdW5pcXVlZCwgb3RoZXJ3aXNlIHVub3duZWQsIG1ldGFkYXRhLgorICB1bnNpZ25lZCBjaGFyIFN0b3JhZ2U7CisgIC8vIFRPRE86IGV4cG9zZSByZW1haW5pbmcgYml0cyB0byBzdWJjbGFzc2VzLgorCisgIHVuc2lnbmVkIHNob3J0IFN1YmNsYXNzRGF0YTE2ID0gMDsKKyAgdW5zaWduZWQgU3ViY2xhc3NEYXRhMzIgPSAwOworCitwdWJsaWM6CisgIGVudW0gTWV0YWRhdGFLaW5kIHsKKyNkZWZpbmUgSEFORExFX01FVEFEQVRBX0xFQUYoQ0xBU1MpIENMQVNTIyNLaW5kLAorI2luY2x1ZGUgImxsdm0vSVIvTWV0YWRhdGEuZGVmIgorICB9OworCitwcm90ZWN0ZWQ6CisgIE1ldGFkYXRhKHVuc2lnbmVkIElELCBTdG9yYWdlVHlwZSBTdG9yYWdlKQorICAgICAgOiBTdWJjbGFzc0lEKElEKSwgU3RvcmFnZShTdG9yYWdlKSB7CisgICAgc3RhdGljX2Fzc2VydChzaXplb2YoKnRoaXMpID09IDgsICJNZXRhZGF0YSBmaWVsZHMgcG9vcmx5IHBhY2tlZCIpOworICB9CisKKyAgfk1ldGFkYXRhKCkgPSBkZWZhdWx0OworCisgIC8vLyBcYnJpZWYgRGVmYXVsdCBoYW5kbGluZyBvZiBhIGNoYW5nZWQgb3BlcmFuZCwgd2hpY2ggYXNzZXJ0cy4KKyAgLy8vCisgIC8vLyBJZiBzdWJjbGFzc2VzIHBhc3MgdGhlbXNlbHZlcyBpbiBhcyBvd25lcnMgdG8gYSB0cmFja2luZyBub2RlIHJlZmVyZW5jZSwKKyAgLy8vIHRoZXkgbXVzdCBwcm92aWRlIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kLgorICB2b2lkIGhhbmRsZUNoYW5nZWRPcGVyYW5kKHZvaWQgKiwgTWV0YWRhdGEgKikgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIlVuaW1wbGVtZW50ZWQgaW4gTWV0YWRhdGEgc3ViY2xhc3MiKTsKKyAgfQorCitwdWJsaWM6CisgIHVuc2lnbmVkIGdldE1ldGFkYXRhSUQoKSBjb25zdCB7IHJldHVybiBTdWJjbGFzc0lEOyB9CisKKyAgLy8vIFxicmllZiBVc2VyLWZyaWVuZGx5IGR1bXAuCisgIC8vLworICAvLy8gSWYgXGMgTSBpcyBwcm92aWRlZCwgbWV0YWRhdGEgbm9kZXMgd2lsbCBiZSBudW1iZXJlZCBjYW5vbmljYWxseTsKKyAgLy8vIG90aGVyd2lzZSwgcG9pbnRlciBhZGRyZXNzZXMgYXJlIHN1YnN0aXR1dGVkLgorICAvLy8KKyAgLy8vIE5vdGU6IHRoaXMgdXNlcyBhbiBleHBsaWNpdCBvdmVybG9hZCBpbnN0ZWFkIG9mIGRlZmF1bHQgYXJndW1lbnRzIHNvIHRoYXQKKyAgLy8vIHRoZSBudWxscHRyIHZlcnNpb24gaXMgZWFzeSB0byBjYWxsIGZyb20gYSBkZWJ1Z2dlci4KKyAgLy8vCisgIC8vLyBAeworICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgdm9pZCBkdW1wKGNvbnN0IE1vZHVsZSAqTSkgY29uc3Q7CisgIC8vLyBAfQorCisgIC8vLyBcYnJpZWYgUHJpbnQuCisgIC8vLworICAvLy8gUHJpbnRzIGRlZmluaXRpb24gb2YgXGMgdGhpcy4KKyAgLy8vCisgIC8vLyBJZiBcYyBNIGlzIHByb3ZpZGVkLCBtZXRhZGF0YSBub2RlcyB3aWxsIGJlIG51bWJlcmVkIGNhbm9uaWNhbGx5OworICAvLy8gb3RoZXJ3aXNlLCBwb2ludGVyIGFkZHJlc3NlcyBhcmUgc3Vic3RpdHV0ZWQuCisgIC8vLyBAeworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlICpNID0gbnVsbHB0ciwKKyAgICAgICAgICAgICBib29sIElzRm9yRGVidWcgPSBmYWxzZSkgY29uc3Q7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBNb2R1bGVTbG90VHJhY2tlciAmTVNULCBjb25zdCBNb2R1bGUgKk0gPSBudWxscHRyLAorICAgICAgICAgICAgIGJvb2wgSXNGb3JEZWJ1ZyA9IGZhbHNlKSBjb25zdDsKKyAgLy8vIEB9CisKKyAgLy8vIFxicmllZiBQcmludCBhcyBvcGVyYW5kLgorICAvLy8KKyAgLy8vIFByaW50cyByZWZlcmVuY2Ugb2YgXGMgdGhpcy4KKyAgLy8vCisgIC8vLyBJZiBcYyBNIGlzIHByb3ZpZGVkLCBtZXRhZGF0YSBub2RlcyB3aWxsIGJlIG51bWJlcmVkIGNhbm9uaWNhbGx5OworICAvLy8gb3RoZXJ3aXNlLCBwb2ludGVyIGFkZHJlc3NlcyBhcmUgc3Vic3RpdHV0ZWQuCisgIC8vLyBAeworICB2b2lkIHByaW50QXNPcGVyYW5kKHJhd19vc3RyZWFtICZPUywgY29uc3QgTW9kdWxlICpNID0gbnVsbHB0cikgY29uc3Q7CisgIHZvaWQgcHJpbnRBc09wZXJhbmQocmF3X29zdHJlYW0gJk9TLCBNb2R1bGVTbG90VHJhY2tlciAmTVNULAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZSAqTSA9IG51bGxwdHIpIGNvbnN0OworICAvLy8gQH0KK307CisKKy8vIENyZWF0ZSB3cmFwcGVycyBmb3IgQyBCaW5kaW5nIHR5cGVzIChzZWUgQ0JpbmRpbmdXcmFwcGluZy5oKS4KK0RFRklORV9JU0FfQ09OVkVSU0lPTl9GVU5DVElPTlMoTWV0YWRhdGEsIExMVk1NZXRhZGF0YVJlZikKKworLy8gU3BlY2lhbGl6ZWQgb3BhcXVlIG1ldGFkYXRhIGNvbnZlcnNpb25zLgoraW5saW5lIE1ldGFkYXRhICoqdW53cmFwKExMVk1NZXRhZGF0YVJlZiAqTURzKSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PE1ldGFkYXRhKio+KE1Ecyk7Cit9CisKKyNkZWZpbmUgSEFORExFX01FVEFEQVRBKENMQVNTKSBjbGFzcyBDTEFTUzsKKyNpbmNsdWRlICJsbHZtL0lSL01ldGFkYXRhLmRlZiIKKworLy8gUHJvdmlkZSBzcGVjaWFsaXphdGlvbnMgb2YgaXNhIHNvIHRoYXQgd2UgZG9uJ3QgbmVlZCBkZWZpbml0aW9ucyBvZgorLy8gc3ViY2xhc3NlcyB0byBzZWUgaWYgdGhlIG1ldGFkYXRhIGlzIGEgc3ViY2xhc3MuCisjZGVmaW5lIEhBTkRMRV9NRVRBREFUQV9MRUFGKENMQVNTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNhX2ltcGw8Q0xBU1MsIE1ldGFkYXRhPiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBNZXRhZGF0YSAmTUQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICByZXR1cm4gTUQuZ2V0TWV0YWRhdGFJRCgpID09IE1ldGFkYXRhOjpDTEFTUyMjS2luZDsgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsKKyNpbmNsdWRlICJsbHZtL0lSL01ldGFkYXRhLmRlZiIKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTWV0YWRhdGEgJk1EKSB7CisgIE1ELnByaW50KE9TKTsKKyAgcmV0dXJuIE9TOworfQorCisvLy8gXGJyaWVmIE1ldGFkYXRhIHdyYXBwZXIgaW4gdGhlIFZhbHVlIGhpZXJhcmNoeS4KKy8vLworLy8vIEEgbWVtYmVyIG9mIHRoZSBcYSBWYWx1ZSBoaWVyYXJjaHkgdG8gcmVwcmVzZW50IGEgcmVmZXJlbmNlIHRvIG1ldGFkYXRhLgorLy8vIFRoaXMgYWxsb3dzLCBlLmcuLCBpbnN0cmluc2ljcyB0byBoYXZlIG1ldGFkYXRhIGFzIG9wZXJhbmRzLgorLy8vCisvLy8gTm90YWJseSwgdGhpcyBpcyB0aGUgb25seSB0aGluZyBpbiBlaXRoZXIgaGllcmFyY2h5IHRoYXQgaXMgYWxsb3dlZCB0bworLy8vIHJlZmVyZW5jZSBcYSBMb2NhbEFzTWV0YWRhdGEuCitjbGFzcyBNZXRhZGF0YUFzVmFsdWUgOiBwdWJsaWMgVmFsdWUgeworICBmcmllbmQgY2xhc3MgUmVwbGFjZWFibGVNZXRhZGF0YUltcGw7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisKKyAgTWV0YWRhdGEgKk1EOworCisgIE1ldGFkYXRhQXNWYWx1ZShUeXBlICpUeSwgTWV0YWRhdGEgKk1EKTsKKworICAvLy8gXGJyaWVmIERyb3AgdXNlIG9mIG1ldGFkYXRhIChkdXJpbmcgdGVhcmRvd24pLgorICB2b2lkIGRyb3BVc2UoKSB7IE1EID0gbnVsbHB0cjsgfQorCitwdWJsaWM6CisgIH5NZXRhZGF0YUFzVmFsdWUoKTsKKworICBzdGF0aWMgTWV0YWRhdGFBc1ZhbHVlICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIE1ldGFkYXRhICpNRCk7CisgIHN0YXRpYyBNZXRhZGF0YUFzVmFsdWUgKmdldElmRXhpc3RzKExMVk1Db250ZXh0ICZDb250ZXh0LCBNZXRhZGF0YSAqTUQpOworCisgIE1ldGFkYXRhICpnZXRNZXRhZGF0YSgpIGNvbnN0IHsgcmV0dXJuIE1EOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBWLT5nZXRWYWx1ZUlEKCkgPT0gTWV0YWRhdGFBc1ZhbHVlVmFsOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgaGFuZGxlQ2hhbmdlZE1ldGFkYXRhKE1ldGFkYXRhICpNRCk7CisgIHZvaWQgdHJhY2soKTsKKyAgdm9pZCB1bnRyYWNrKCk7Cit9OworCisvLy8gXGJyaWVmIEFQSSBmb3IgdHJhY2tpbmcgbWV0YWRhdGEgcmVmZXJlbmNlcyB0aHJvdWdoIFJBVVcgYW5kIGRlbGV0aW9uLgorLy8vCisvLy8gU2hhcmVkIEFQSSBmb3IgdXBkYXRpbmcgXGEgTWV0YWRhdGEgcG9pbnRlcnMgaW4gc3ViY2xhc3NlcyB0aGF0IHN1cHBvcnQKKy8vLyBSQVVXLgorLy8vCisvLy8gVGhpcyBBUEkgaXMgbm90IG1lYW50IHRvIGJlIHVzZWQgZGlyZWN0bHkuICBTZWUgXGEgVHJhY2tpbmdNRFJlZiBmb3IgYQorLy8vIHVzZXItZnJpZW5kbHkgdHJhY2tpbmcgcmVmZXJlbmNlLgorY2xhc3MgTWV0YWRhdGFUcmFja2luZyB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgVHJhY2sgdGhlIHJlZmVyZW5jZSB0byBtZXRhZGF0YS4KKyAgLy8vCisgIC8vLyBSZWdpc3RlciBcYyBNRCB3aXRoIFxjICpNRCwgaWYgdGhlIHN1YmNsYXNzIHN1cHBvcnRzIHRyYWNraW5nLiAgSWYgXGMgKk1ECisgIC8vLyBnZXRzIFJBVVcnZWQsIFxjIE1EIHdpbGwgYmUgdXBkYXRlZCB0byB0aGUgbmV3IGFkZHJlc3MuICBJZiBcYyAqTUQgZ2V0cworICAvLy8gZGVsZXRlZCwgXGMgTUQgd2lsbCBiZSBzZXQgdG8gXGMgbnVsbHB0ci4KKyAgLy8vCisgIC8vLyBJZiB0cmFja2luZyBpc24ndCBzdXBwb3J0ZWQsIFxjICpNRCB3aWxsIG5vdCBjaGFuZ2UuCisgIC8vLworICAvLy8gXHJldHVybiB0cnVlIGlmZiB0cmFja2luZyBpcyBzdXBwb3J0ZWQgYnkgXGMgTUQuCisgIHN0YXRpYyBib29sIHRyYWNrKE1ldGFkYXRhIComTUQpIHsKKyAgICByZXR1cm4gdHJhY2soJk1ELCAqTUQsIHN0YXRpY19jYXN0PE1ldGFkYXRhICo+KG51bGxwdHIpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVHJhY2sgdGhlIHJlZmVyZW5jZSB0byBtZXRhZGF0YSBmb3IgXGEgTWV0YWRhdGEuCisgIC8vLworICAvLy8gQXMgXGEgdHJhY2soTWV0YWRhdGEqJiksIGJ1dCB3aXRoIHN1cHBvcnQgZm9yIGNhbGxpbmcgYmFjayB0byBcYyBPd25lciB0bworICAvLy8gdGVsbCBpdCB0aGF0IGl0cyBvcGVyYW5kIGNoYW5nZWQuICBUaGlzIGNvdWxkIHRyaWdnZXIgXGMgT3duZXIgYmVpbmcKKyAgLy8vIHJlLXVuaXF1ZWQuCisgIHN0YXRpYyBib29sIHRyYWNrKHZvaWQgKlJlZiwgTWV0YWRhdGEgJk1ELCBNZXRhZGF0YSAmT3duZXIpIHsKKyAgICByZXR1cm4gdHJhY2soUmVmLCBNRCwgJk93bmVyKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVHJhY2sgdGhlIHJlZmVyZW5jZSB0byBtZXRhZGF0YSBmb3IgXGEgTWV0YWRhdGFBc1ZhbHVlLgorICAvLy8KKyAgLy8vIEFzIFxhIHRyYWNrKE1ldGFkYXRhKiYpLCBidXQgd2l0aCBzdXBwb3J0IGZvciBjYWxsaW5nIGJhY2sgdG8gXGMgT3duZXIgdG8KKyAgLy8vIHRlbGwgaXQgdGhhdCBpdHMgb3BlcmFuZCBjaGFuZ2VkLiAgVGhpcyBjb3VsZCB0cmlnZ2VyIFxjIE93bmVyIGJlaW5nCisgIC8vLyByZS11bmlxdWVkLgorICBzdGF0aWMgYm9vbCB0cmFjayh2b2lkICpSZWYsIE1ldGFkYXRhICZNRCwgTWV0YWRhdGFBc1ZhbHVlICZPd25lcikgeworICAgIHJldHVybiB0cmFjayhSZWYsIE1ELCAmT3duZXIpOworICB9CisKKyAgLy8vIFxicmllZiBTdG9wIHRyYWNraW5nIGEgcmVmZXJlbmNlIHRvIG1ldGFkYXRhLgorICAvLy8KKyAgLy8vIFN0b3BzIFxjICpNRCBmcm9tIHRyYWNraW5nIFxjIE1ELgorICBzdGF0aWMgdm9pZCB1bnRyYWNrKE1ldGFkYXRhIComTUQpIHsgdW50cmFjaygmTUQsICpNRCk7IH0KKyAgc3RhdGljIHZvaWQgdW50cmFjayh2b2lkICpSZWYsIE1ldGFkYXRhICZNRCk7CisKKyAgLy8vIFxicmllZiBNb3ZlIHRyYWNraW5nIGZyb20gb25lIHJlZmVyZW5jZSB0byBhbm90aGVyLgorICAvLy8KKyAgLy8vIFNlbWFudGljYWxseSBlcXVpdmFsZW50IHRvIFxjIHVudHJhY2soTUQpIGZvbGxvd2VkIGJ5IFxjIHRyYWNrKE5ldyksCisgIC8vLyBleGNlcHQgdGhhdCBvd25lcnNoaXAgY2FsbGJhY2tzIGFyZSBtYWludGFpbmVkLgorICAvLy8KKyAgLy8vIE5vdGU6IGl0IGlzIGFuIGVycm9yIGlmIFxjICpNRCBkb2VzIG5vdCBlcXVhbCBcYyBOZXcuCisgIC8vLworICAvLy8gXHJldHVybiB0cnVlIGlmZiB0cmFja2luZyBpcyBzdXBwb3J0ZWQgYnkgXGMgTUQuCisgIHN0YXRpYyBib29sIHJldHJhY2soTWV0YWRhdGEgKiZNRCwgTWV0YWRhdGEgKiZOZXcpIHsKKyAgICByZXR1cm4gcmV0cmFjaygmTUQsICpNRCwgJk5ldyk7CisgIH0KKyAgc3RhdGljIGJvb2wgcmV0cmFjayh2b2lkICpSZWYsIE1ldGFkYXRhICZNRCwgdm9pZCAqTmV3KTsKKworICAvLy8gXGJyaWVmIENoZWNrIHdoZXRoZXIgbWV0YWRhdGEgaXMgcmVwbGFjZWFibGUuCisgIHN0YXRpYyBib29sIGlzUmVwbGFjZWFibGUoY29uc3QgTWV0YWRhdGEgJk1EKTsKKworICB1c2luZyBPd25lclR5ID0gUG9pbnRlclVuaW9uPE1ldGFkYXRhQXNWYWx1ZSAqLCBNZXRhZGF0YSAqPjsKKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBUcmFjayBhIHJlZmVyZW5jZSB0byBtZXRhZGF0YSBmb3IgYW4gb3duZXIuCisgIC8vLworICAvLy8gR2VuZXJhbGl6ZWQgdmVyc2lvbiBvZiB0cmFja2luZy4KKyAgc3RhdGljIGJvb2wgdHJhY2sodm9pZCAqUmVmLCBNZXRhZGF0YSAmTUQsIE93bmVyVHkgT3duZXIpOworfTsKKworLy8vIFxicmllZiBTaGFyZWQgaW1wbGVtZW50YXRpb24gb2YgdXNlLWxpc3RzIGZvciByZXBsYWNlYWJsZSBtZXRhZGF0YS4KKy8vLworLy8vIE1vc3QgbWV0YWRhdGEgY2Fubm90IGJlIFJBVVcnZWQuICBUaGlzIGlzIGEgc2hhcmVkIGltcGxlbWVudGF0aW9uIG9mCisvLy8gdXNlLWxpc3RzIGFuZCBhc3NvY2lhdGVkIEFQSSBmb3IgdGhlIHR3byB0aGF0IHN1cHBvcnQgaXQgKFxhIFZhbHVlQXNNZXRhZGF0YQorLy8vIGFuZCBcYSBUZW1wTUROb2RlKS4KK2NsYXNzIFJlcGxhY2VhYmxlTWV0YWRhdGFJbXBsIHsKKyAgZnJpZW5kIGNsYXNzIE1ldGFkYXRhVHJhY2tpbmc7CisKK3B1YmxpYzoKKyAgdXNpbmcgT3duZXJUeSA9IE1ldGFkYXRhVHJhY2tpbmc6Ok93bmVyVHk7CisKK3ByaXZhdGU6CisgIExMVk1Db250ZXh0ICZDb250ZXh0OworICB1aW50NjRfdCBOZXh0SW5kZXggPSAwOworICBTbWFsbERlbnNlTWFwPHZvaWQgKiwgc3RkOjpwYWlyPE93bmVyVHksIHVpbnQ2NF90PiwgND4gVXNlTWFwOworCitwdWJsaWM6CisgIFJlcGxhY2VhYmxlTWV0YWRhdGFJbXBsKExMVk1Db250ZXh0ICZDb250ZXh0KSA6IENvbnRleHQoQ29udGV4dCkge30KKworICB+UmVwbGFjZWFibGVNZXRhZGF0YUltcGwoKSB7CisgICAgYXNzZXJ0KFVzZU1hcC5lbXB0eSgpICYmICJDYW5ub3QgZGVzdHJveSBpbi11c2UgcmVwbGFjZWFibGUgbWV0YWRhdGEiKTsKKyAgfQorCisgIExMVk1Db250ZXh0ICZnZXRDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gQ29udGV4dDsgfQorCisgIC8vLyBcYnJpZWYgUmVwbGFjZSBhbGwgdXNlcyBvZiB0aGlzIHdpdGggTUQuCisgIC8vLworICAvLy8gUmVwbGFjZSBhbGwgdXNlcyBvZiB0aGlzIHdpdGggXGMgTUQsIHdoaWNoIGlzIGFsbG93ZWQgdG8gYmUgbnVsbC4KKyAgdm9pZCByZXBsYWNlQWxsVXNlc1dpdGgoTWV0YWRhdGEgKk1EKTsKKworICAvLy8gXGJyaWVmIFJlc29sdmUgYWxsIHVzZXMgb2YgdGhpcy4KKyAgLy8vCisgIC8vLyBSZXNvbHZlIGFsbCB1c2VzIG9mIHRoaXMsIHR1cm5pbmcgb2ZmIFJBVVcgcGVybWFuZW50bHkuICBJZiBcYworICAvLy8gUmVzb2x2ZVVzZXJzLCBjYWxsIFxhIE1ETm9kZTo6cmVzb2x2ZSgpIG9uIGFueSB1c2VycyB3aG9zZSBsYXN0IG9wZXJhbmQKKyAgLy8vIGlzIHJlc29sdmVkLgorICB2b2lkIHJlc29sdmVBbGxVc2VzKGJvb2wgUmVzb2x2ZVVzZXJzID0gdHJ1ZSk7CisKK3ByaXZhdGU6CisgIHZvaWQgYWRkUmVmKHZvaWQgKlJlZiwgT3duZXJUeSBPd25lcik7CisgIHZvaWQgZHJvcFJlZih2b2lkICpSZWYpOworICB2b2lkIG1vdmVSZWYodm9pZCAqUmVmLCB2b2lkICpOZXcsIGNvbnN0IE1ldGFkYXRhICZNRCk7CisKKyAgLy8vIExhemlseSBjb25zdHJ1Y3QgUkFVVyBzdXBwb3J0IG9uIE1ELgorICAvLy8KKyAgLy8vIElmIHRoaXMgaXMgYW4gdW5yZXNvbHZlZCBNRE5vZGUsIFJBVVcgc3VwcG9ydCB3aWxsIGJlIGNyZWF0ZWQgb24tZGVtYW5kLgorICAvLy8gVmFsdWVBc01ldGFkYXRhIGFsd2F5cyBoYXMgUkFVVyBzdXBwb3J0LgorICBzdGF0aWMgUmVwbGFjZWFibGVNZXRhZGF0YUltcGwgKmdldE9yQ3JlYXRlKE1ldGFkYXRhICZNRCk7CisKKyAgLy8vIEdldCBSQVVXIHN1cHBvcnQgb24gTUQsIGlmIGl0IGV4aXN0cy4KKyAgc3RhdGljIFJlcGxhY2VhYmxlTWV0YWRhdGFJbXBsICpnZXRJZkV4aXN0cyhNZXRhZGF0YSAmTUQpOworCisgIC8vLyBDaGVjayB3aGV0aGVyIHRoaXMgbm9kZSB3aWxsIHN1cHBvcnQgUkFVVy4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIFxjIHRydWUgdW5sZXNzIGdldE9yQ3JlYXRlKCkgd291bGQgcmV0dXJuIG51bGwuCisgIHN0YXRpYyBib29sIGlzUmVwbGFjZWFibGUoY29uc3QgTWV0YWRhdGEgJk1EKTsKK307CisKKy8vLyBcYnJpZWYgVmFsdWUgd3JhcHBlciBpbiB0aGUgTWV0YWRhdGEgaGllcmFyY2h5LgorLy8vCisvLy8gVGhpcyBpcyBhIGN1c3RvbSB2YWx1ZSBoYW5kbGUgdGhhdCBhbGxvd3Mgb3RoZXIgbWV0YWRhdGEgdG8gcmVmZXIgdG8KKy8vLyBjbGFzc2VzIGluIHRoZSBWYWx1ZSBoaWVyYXJjaHkuCisvLy8KKy8vLyBCZWNhdXNlIG9mIGZ1bGwgdW5pcXVpbmcgc3VwcG9ydCwgZWFjaCB2YWx1ZSBpcyBvbmx5IHdyYXBwZWQgYnkgYSBzaW5nbGUgXGEKKy8vLyBWYWx1ZUFzTWV0YWRhdGEgb2JqZWN0LCBzbyB0aGUgbG9va3VwIG1hcHMgYXJlIGZhciBtb3JlIGVmZmljaWVudCB0aGFuCisvLy8gdGhvc2UgdXNpbmcgVmFsdWVIYW5kbGVCYXNlLgorY2xhc3MgVmFsdWVBc01ldGFkYXRhIDogcHVibGljIE1ldGFkYXRhLCBSZXBsYWNlYWJsZU1ldGFkYXRhSW1wbCB7CisgIGZyaWVuZCBjbGFzcyBSZXBsYWNlYWJsZU1ldGFkYXRhSW1wbDsKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKworICBWYWx1ZSAqVjsKKworICAvLy8gXGJyaWVmIERyb3AgdXNlcnMgd2l0aG91dCBSQVVXIChkdXJpbmcgdGVhcmRvd24pLgorICB2b2lkIGRyb3BVc2VycygpIHsKKyAgICBSZXBsYWNlYWJsZU1ldGFkYXRhSW1wbDo6cmVzb2x2ZUFsbFVzZXMoLyogUmVzb2x2ZVVzZXJzICovIGZhbHNlKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIFZhbHVlQXNNZXRhZGF0YSh1bnNpZ25lZCBJRCwgVmFsdWUgKlYpCisgICAgICA6IE1ldGFkYXRhKElELCBVbmlxdWVkKSwgUmVwbGFjZWFibGVNZXRhZGF0YUltcGwoVi0+Z2V0Q29udGV4dCgpKSwgVihWKSB7CisgICAgYXNzZXJ0KFYgJiYgIkV4cGVjdGVkIHZhbGlkIHZhbHVlIik7CisgIH0KKworICB+VmFsdWVBc01ldGFkYXRhKCkgPSBkZWZhdWx0OworCitwdWJsaWM6CisgIHN0YXRpYyBWYWx1ZUFzTWV0YWRhdGEgKmdldChWYWx1ZSAqVik7CisKKyAgc3RhdGljIENvbnN0YW50QXNNZXRhZGF0YSAqZ2V0Q29uc3RhbnQoVmFsdWUgKkMpIHsKKyAgICByZXR1cm4gY2FzdDxDb25zdGFudEFzTWV0YWRhdGE+KGdldChDKSk7CisgIH0KKworICBzdGF0aWMgTG9jYWxBc01ldGFkYXRhICpnZXRMb2NhbChWYWx1ZSAqTG9jYWwpIHsKKyAgICByZXR1cm4gY2FzdDxMb2NhbEFzTWV0YWRhdGE+KGdldChMb2NhbCkpOworICB9CisKKyAgc3RhdGljIFZhbHVlQXNNZXRhZGF0YSAqZ2V0SWZFeGlzdHMoVmFsdWUgKlYpOworCisgIHN0YXRpYyBDb25zdGFudEFzTWV0YWRhdGEgKmdldENvbnN0YW50SWZFeGlzdHMoVmFsdWUgKkMpIHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPENvbnN0YW50QXNNZXRhZGF0YT4oZ2V0SWZFeGlzdHMoQykpOworICB9CisKKyAgc3RhdGljIExvY2FsQXNNZXRhZGF0YSAqZ2V0TG9jYWxJZkV4aXN0cyhWYWx1ZSAqTG9jYWwpIHsKKyAgICByZXR1cm4gY2FzdF9vcl9udWxsPExvY2FsQXNNZXRhZGF0YT4oZ2V0SWZFeGlzdHMoTG9jYWwpKTsKKyAgfQorCisgIFZhbHVlICpnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFY7IH0KKyAgVHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFYtPmdldFR5cGUoKTsgfQorICBMTFZNQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIFYtPmdldENvbnRleHQoKTsgfQorCisgIHN0YXRpYyB2b2lkIGhhbmRsZURlbGV0aW9uKFZhbHVlICpWKTsKKyAgc3RhdGljIHZvaWQgaGFuZGxlUkFVVyhWYWx1ZSAqRnJvbSwgVmFsdWUgKlRvKTsKKworcHJvdGVjdGVkOgorICAvLy8gXGJyaWVmIEhhbmRsZSBjb2xsaXNpb25zIGFmdGVyIFxhIFZhbHVlOjpyZXBsYWNlQWxsVXNlc1dpdGgoKS4KKyAgLy8vCisgIC8vLyBSQVVXIGlzbid0IHN1cHBvcnRlZCBkaXJlY3RseSBmb3IgXGEgVmFsdWVBc01ldGFkYXRhLCBidXQgaWYgdGhlIHdyYXBwZWQKKyAgLy8vIFxhIFZhbHVlIGdldHMgUkFVVydlZCBhbmQgdGhlIHRhcmdldCBhbHJlYWR5IGV4aXN0cywgdGhpcyBpcyB1c2VkIHRvCisgIC8vLyBtZXJnZSB0aGUgdHdvIG1ldGFkYXRhIG5vZGVzLgorICB2b2lkIHJlcGxhY2VBbGxVc2VzV2l0aChNZXRhZGF0YSAqTUQpIHsKKyAgICBSZXBsYWNlYWJsZU1ldGFkYXRhSW1wbDo6cmVwbGFjZUFsbFVzZXNXaXRoKE1EKTsKKyAgfQorCitwdWJsaWM6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTWV0YWRhdGEgKk1EKSB7CisgICAgcmV0dXJuIE1ELT5nZXRNZXRhZGF0YUlEKCkgPT0gTG9jYWxBc01ldGFkYXRhS2luZCB8fAorICAgICAgICAgICBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IENvbnN0YW50QXNNZXRhZGF0YUtpbmQ7CisgIH0KK307CisKK2NsYXNzIENvbnN0YW50QXNNZXRhZGF0YSA6IHB1YmxpYyBWYWx1ZUFzTWV0YWRhdGEgeworICBmcmllbmQgY2xhc3MgVmFsdWVBc01ldGFkYXRhOworCisgIENvbnN0YW50QXNNZXRhZGF0YShDb25zdGFudCAqQykKKyAgICAgIDogVmFsdWVBc01ldGFkYXRhKENvbnN0YW50QXNNZXRhZGF0YUtpbmQsIEMpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIENvbnN0YW50QXNNZXRhZGF0YSAqZ2V0KENvbnN0YW50ICpDKSB7CisgICAgcmV0dXJuIFZhbHVlQXNNZXRhZGF0YTo6Z2V0Q29uc3RhbnQoQyk7CisgIH0KKworICBzdGF0aWMgQ29uc3RhbnRBc01ldGFkYXRhICpnZXRJZkV4aXN0cyhDb25zdGFudCAqQykgeworICAgIHJldHVybiBWYWx1ZUFzTWV0YWRhdGE6OmdldENvbnN0YW50SWZFeGlzdHMoQyk7CisgIH0KKworICBDb25zdGFudCAqZ2V0VmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8Q29uc3RhbnQ+KFZhbHVlQXNNZXRhZGF0YTo6Z2V0VmFsdWUoKSk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IENvbnN0YW50QXNNZXRhZGF0YUtpbmQ7CisgIH0KK307CisKK2NsYXNzIExvY2FsQXNNZXRhZGF0YSA6IHB1YmxpYyBWYWx1ZUFzTWV0YWRhdGEgeworICBmcmllbmQgY2xhc3MgVmFsdWVBc01ldGFkYXRhOworCisgIExvY2FsQXNNZXRhZGF0YShWYWx1ZSAqTG9jYWwpCisgICAgICA6IFZhbHVlQXNNZXRhZGF0YShMb2NhbEFzTWV0YWRhdGFLaW5kLCBMb2NhbCkgeworICAgIGFzc2VydCghaXNhPENvbnN0YW50PihMb2NhbCkgJiYgIkV4cGVjdGVkIGxvY2FsIHZhbHVlIik7CisgIH0KKworcHVibGljOgorICBzdGF0aWMgTG9jYWxBc01ldGFkYXRhICpnZXQoVmFsdWUgKkxvY2FsKSB7CisgICAgcmV0dXJuIFZhbHVlQXNNZXRhZGF0YTo6Z2V0TG9jYWwoTG9jYWwpOworICB9CisKKyAgc3RhdGljIExvY2FsQXNNZXRhZGF0YSAqZ2V0SWZFeGlzdHMoVmFsdWUgKkxvY2FsKSB7CisgICAgcmV0dXJuIFZhbHVlQXNNZXRhZGF0YTo6Z2V0TG9jYWxJZkV4aXN0cyhMb2NhbCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IExvY2FsQXNNZXRhZGF0YUtpbmQ7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVHJhbnNpdGlvbmFsIEFQSSBmb3IgZXh0cmFjdGluZyBjb25zdGFudHMgZnJvbSBNZXRhZGF0YS4KKy8vLworLy8vIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIHRyYW5zaXRpb25hbCBmdW5jdGlvbnMgZm9yIG1ldGFkYXRhIHRoYXQgcG9pbnRzIHRvCisvLy8gXGEgQ29uc3RhbnRzLgorLy8vCisvLy8gSW4gcHJlaGlzdG9yeSAtLSB3aGVuIG1ldGFkYXRhIHdhcyBhIHN1YmNsYXNzIG9mIFxhIFZhbHVlIC0tIFxhIE1ETm9kZQorLy8vIG9wZXJhbmRzIGNvdWxkIHJlZmVyIHRvIGFueSBcYSBWYWx1ZS4gIFRoZXJlJ3Mgd2FzIGEgbG90IG9mIGNvZGUgbGlrZSB0aGlzOgorLy8vCisvLy8gXGNvZGUKKy8vLyAgICAgTUROb2RlICpOID0gLi4uOworLy8vICAgICBhdXRvICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihOLT5nZXRPcGVyYW5kKDIpKTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gTm93IHRoYXQgXGEgVmFsdWUgYW5kIFxhIE1ldGFkYXRhIGFyZSBpbiBzZXBhcmF0ZSBoaWVyYXJjaGllcywgbWFpbnRhaW5pbmcKKy8vLyB0aGUgc2VtYW50aWNzIGZvciBcYSBpc2EoKSwgXGEgY2FzdCgpLCBcYSBkeW5fY2FzdCgpIChldGMuKSByZXF1aXJlcyB0aHJlZQorLy8vIHN0ZXBzOiBjYXN0IGluIHRoZSBcYSBNZXRhZGF0YSBoaWVyYXJjaHksIGV4dHJhY3Rpb24gb2YgdGhlIFxhIFZhbHVlLCBhbmQKKy8vLyBjYXN0IGluIHRoZSBcYSBWYWx1ZSBoaWVyYXJjaHkuICBCZXNpZGVzIGNyZWF0aW5nIGJvaWxlci1wbGF0ZSwgdGhpcworLy8vIHJlcXVpcmVzIHN1YnRsZSBjb250cm9sIGZsb3cgY2hhbmdlcy4KKy8vLworLy8vIFRoZSBlbmQtZ29hbCBpcyB0byBjcmVhdGUgYSBuZXcgdHlwZSBvZiBtZXRhZGF0YSwgY2FsbGVkIChlLmcuKSBcYSBNREludCwKKy8vLyBzbyB0aGF0IG1ldGFkYXRhIGNhbiByZWZlciB0byBudW1iZXJzIHdpdGhvdXQgdHJhdmVyc2luZyBhIGJyaWRnZSB0byB0aGUgXGEKKy8vLyBWYWx1ZSBoaWVyYXJjaHkuICBJbiB0aGlzIGZpbmFsIHN0YXRlLCB0aGUgY29kZSBhYm92ZSB3b3VsZCBsb29rIGxpa2UgdGhpczoKKy8vLworLy8vIFxjb2RlCisvLy8gICAgIE1ETm9kZSAqTiA9IC4uLjsKKy8vLyAgICAgYXV0byAqTUkgPSBkeW5fY2FzdDxNREludD4oTi0+Z2V0T3BlcmFuZCgyKSk7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoZSBBUEkgaW4gdGhpcyBuYW1lc3BhY2Ugc3VwcG9ydHMgdGhlIHRyYW5zaXRpb24uICBcYSBNREludCBkb2Vzbid0IGV4aXN0CisvLy8geWV0LCBhbmQgZXZlbiBvbmNlIGl0IGRvZXMsIGNoYW5naW5nIGVhY2ggbWV0YWRhdGEgc2NoZW1hIHRvIHVzZSBpdCBpcyBpdHMKKy8vLyBvd24gbWluaS1wcm9qZWN0LiAgSW4gdGhlIG1lYW50aW1lIHRoaXMgQVBJIHByZXZlbnRzIHVzIGZyb20gaW50cm9kdWNpbmcKKy8vLyBjb21wbGV4IGFuZCBidWctcHJvbmUgY29udHJvbCBmbG93IHRoYXQgd2lsbCBkaXNhcHBlYXIgaW4gdGhlIGVuZC4gIEluCisvLy8gcGFydGljdWxhciwgdGhlIGFib3ZlIGNvZGUgbG9va3MgbGlrZSB0aGlzOgorLy8vCisvLy8gXGNvZGUKKy8vLyAgICAgTUROb2RlICpOID0gLi4uOworLy8vICAgICBhdXRvICpDSSA9IG1kY29uc3Q6OmR5bl9leHRyYWN0PENvbnN0YW50SW50PihOLT5nZXRPcGVyYW5kKDIpKTsKKy8vLyBcZW5kY29kZQorLy8vCisvLy8gVGhlIGZ1bGwgc2V0IG9mIHByb3ZpZGVkIGZ1bmN0aW9ucyBpbmNsdWRlczoKKy8vLworLy8vICAgbWRjb25zdDo6aGFzYSAgICAgICAgICAgICAgICA8PT4gaXNhCisvLy8gICBtZGNvbnN0OjpleHRyYWN0ICAgICAgICAgICAgIDw9PiBjYXN0CisvLy8gICBtZGNvbnN0OjpleHRyYWN0X29yX251bGwgICAgIDw9PiBjYXN0X29yX251bGwKKy8vLyAgIG1kY29uc3Q6OmR5bl9leHRyYWN0ICAgICAgICAgPD0+IGR5bl9jYXN0CisvLy8gICBtZGNvbnN0OjpkeW5fZXh0cmFjdF9vcl9udWxsIDw9PiBkeW5fY2FzdF9vcl9udWxsCisvLy8KKy8vLyBUaGUgdGFyZ2V0IG9mIHRoZSBjYXN0IG11c3QgYmUgYSBzdWJjbGFzcyBvZiBcYSBDb25zdGFudC4KK25hbWVzcGFjZSBtZGNvbnN0IHsKKworbmFtZXNwYWNlIGRldGFpbCB7CisKK3RlbXBsYXRlIDxjbGFzcyBUPiBUICZtYWtlKCk7Cit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgUmVzdWx0PiBzdHJ1Y3QgSGFzRGVyZWZlcmVuY2UgeworICB1c2luZyBZZXMgPSBjaGFyWzFdOworICB1c2luZyBObyA9IGNoYXJbMl07CisgIHRlbXBsYXRlIDxzaXplX3QgTj4gc3RydWN0IFNGSU5BRSB7fTsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVSwgY2xhc3MgVj4KKyAgc3RhdGljIFllcyAmaGFzRGVyZWZlcmVuY2UoU0ZJTkFFPHNpemVvZihzdGF0aWNfY2FzdDxWPigqbWFrZTxVPigpKSk+ICogPSAwKTsKKyAgdGVtcGxhdGUgPGNsYXNzIFUsIGNsYXNzIFY+IHN0YXRpYyBObyAmaGFzRGVyZWZlcmVuY2UoLi4uKTsKKworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9CisgICAgICBzaXplb2YoaGFzRGVyZWZlcmVuY2U8VCwgUmVzdWx0PihudWxscHRyKSkgPT0gc2l6ZW9mKFllcyk7Cit9OwordGVtcGxhdGUgPGNsYXNzIFYsIGNsYXNzIE0+IHN0cnVjdCBJc1ZhbGlkUG9pbnRlciB7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gc3RkOjppc19iYXNlX29mPENvbnN0YW50LCBWPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYXNEZXJlZmVyZW5jZTxNLCBjb25zdCBNZXRhZGF0YSAmPjo6dmFsdWU7Cit9OwordGVtcGxhdGUgPGNsYXNzIFYsIGNsYXNzIE0+IHN0cnVjdCBJc1ZhbGlkUmVmZXJlbmNlIHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBzdGQ6OmlzX2Jhc2Vfb2Y8Q29uc3RhbnQsIFY+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfY29udmVydGlibGU8TSwgY29uc3QgTWV0YWRhdGEgJj46OnZhbHVlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAorCisvLy8gXGJyaWVmIENoZWNrIHdoZXRoZXIgTWV0YWRhdGEgaGFzIGEgVmFsdWUuCisvLy8KKy8vLyBBcyBhbiBhbmFsb2d1ZSB0byBcYSBpc2EoKSwgY2hlY2sgd2hldGhlciBcYyBNRCBoYXMgYW4gXGEgVmFsdWUgaW5zaWRlIG9mCisvLy8gdHlwZSBcYyBYLgordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitpbmxpbmUgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8ZGV0YWlsOjpJc1ZhbGlkUG9pbnRlcjxYLCBZPjo6dmFsdWUsIGJvb2w+Ojp0eXBlCitoYXNhKFkgJiZNRCkgeworICBhc3NlcnQoTUQgJiYgIk51bGwgcG9pbnRlciBzZW50IGludG8gaGFzYSIpOworICBpZiAoYXV0byAqViA9IGR5bl9jYXN0PENvbnN0YW50QXNNZXRhZGF0YT4oTUQpKQorICAgIHJldHVybiBpc2E8WD4oVi0+Z2V0VmFsdWUoKSk7CisgIHJldHVybiBmYWxzZTsKK30KK3RlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgoraW5saW5lCisgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8ZGV0YWlsOjpJc1ZhbGlkUmVmZXJlbmNlPFgsIFkgJj46OnZhbHVlLCBib29sPjo6dHlwZQorICAgIGhhc2EoWSAmTUQpIHsKKyAgcmV0dXJuIGhhc2EoJk1EKTsKK30KKworLy8vIFxicmllZiBFeHRyYWN0IGEgVmFsdWUgZnJvbSBNZXRhZGF0YS4KKy8vLworLy8vIEFzIGFuIGFuYWxvZ3VlIHRvIFxhIGNhc3QoKSwgZXh0cmFjdCB0aGUgXGEgVmFsdWUgc3ViY2xhc3MgXGMgWCBmcm9tIFxjIE1ELgordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitpbmxpbmUgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8ZGV0YWlsOjpJc1ZhbGlkUG9pbnRlcjxYLCBZPjo6dmFsdWUsIFggKj46OnR5cGUKK2V4dHJhY3QoWSAmJk1EKSB7CisgIHJldHVybiBjYXN0PFg+KGNhc3Q8Q29uc3RhbnRBc01ldGFkYXRhPihNRCktPmdldFZhbHVlKCkpOworfQordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitpbmxpbmUKKyAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxkZXRhaWw6OklzVmFsaWRSZWZlcmVuY2U8WCwgWSAmPjo6dmFsdWUsIFggKj46OnR5cGUKKyAgICBleHRyYWN0KFkgJk1EKSB7CisgIHJldHVybiBleHRyYWN0KCZNRCk7Cit9CisKKy8vLyBcYnJpZWYgRXh0cmFjdCBhIFZhbHVlIGZyb20gTWV0YWRhdGEsIGFsbG93aW5nIG51bGwuCisvLy8KKy8vLyBBcyBhbiBhbmFsb2d1ZSB0byBcYSBjYXN0X29yX251bGwoKSwgZXh0cmFjdCB0aGUgXGEgVmFsdWUgc3ViY2xhc3MgXGMgWAorLy8vIGZyb20gXGMgTUQsIGFsbG93aW5nIFxjIE1EIHRvIGJlIG51bGwuCit0ZW1wbGF0ZSA8Y2xhc3MgWCwgY2xhc3MgWT4KK2lubGluZSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxkZXRhaWw6OklzVmFsaWRQb2ludGVyPFgsIFk+Ojp2YWx1ZSwgWCAqPjo6dHlwZQorZXh0cmFjdF9vcl9udWxsKFkgJiZNRCkgeworICBpZiAoYXV0byAqViA9IGNhc3Rfb3JfbnVsbDxDb25zdGFudEFzTWV0YWRhdGE+KE1EKSkKKyAgICByZXR1cm4gY2FzdDxYPihWLT5nZXRWYWx1ZSgpKTsKKyAgcmV0dXJuIG51bGxwdHI7Cit9CisKKy8vLyBcYnJpZWYgRXh0cmFjdCBhIFZhbHVlIGZyb20gTWV0YWRhdGEsIGlmIGFueS4KKy8vLworLy8vIEFzIGFuIGFuYWxvZ3VlIHRvIFxhIGR5bl9jYXN0X29yX251bGwoKSwgZXh0cmFjdCB0aGUgXGEgVmFsdWUgc3ViY2xhc3MgXGMgWAorLy8vIGZyb20gXGMgTUQsIHJldHVybiBudWxsIGlmIFxjIE1EIGRvZXNuJ3QgY29udGFpbiBhIFxhIFZhbHVlIG9yIGlmIHRoZSBcYQorLy8vIFZhbHVlIGl0IGRvZXMgY29udGFpbiBpcyBvZiB0aGUgd3Jvbmcgc3ViY2xhc3MuCit0ZW1wbGF0ZSA8Y2xhc3MgWCwgY2xhc3MgWT4KK2lubGluZSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxkZXRhaWw6OklzVmFsaWRQb2ludGVyPFgsIFk+Ojp2YWx1ZSwgWCAqPjo6dHlwZQorZHluX2V4dHJhY3QoWSAmJk1EKSB7CisgIGlmIChhdXRvICpWID0gZHluX2Nhc3Q8Q29uc3RhbnRBc01ldGFkYXRhPihNRCkpCisgICAgcmV0dXJuIGR5bl9jYXN0PFg+KFYtPmdldFZhbHVlKCkpOworICByZXR1cm4gbnVsbHB0cjsKK30KKworLy8vIFxicmllZiBFeHRyYWN0IGEgVmFsdWUgZnJvbSBNZXRhZGF0YSwgaWYgYW55LCBhbGxvd2luZyBudWxsLgorLy8vCisvLy8gQXMgYW4gYW5hbG9ndWUgdG8gXGEgZHluX2Nhc3Rfb3JfbnVsbCgpLCBleHRyYWN0IHRoZSBcYSBWYWx1ZSBzdWJjbGFzcyBcYyBYCisvLy8gZnJvbSBcYyBNRCwgcmV0dXJuIG51bGwgaWYgXGMgTUQgZG9lc24ndCBjb250YWluIGEgXGEgVmFsdWUgb3IgaWYgdGhlIFxhCisvLy8gVmFsdWUgaXQgZG9lcyBjb250YWluIGlzIG9mIHRoZSB3cm9uZyBzdWJjbGFzcywgYWxsb3dpbmcgXGMgTUQgdG8gYmUgbnVsbC4KK3RlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgoraW5saW5lIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGRldGFpbDo6SXNWYWxpZFBvaW50ZXI8WCwgWT46OnZhbHVlLCBYICo+Ojp0eXBlCitkeW5fZXh0cmFjdF9vcl9udWxsKFkgJiZNRCkgeworICBpZiAoYXV0byAqViA9IGR5bl9jYXN0X29yX251bGw8Q29uc3RhbnRBc01ldGFkYXRhPihNRCkpCisgICAgcmV0dXJuIGR5bl9jYXN0PFg+KFYtPmdldFZhbHVlKCkpOworICByZXR1cm4gbnVsbHB0cjsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIG1kY29uc3QKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcYnJpZWYgQSBzaW5nbGUgdW5pcXVlZCBzdHJpbmcuCisvLy8KKy8vLyBUaGVzZSBhcmUgdXNlZCB0byBlZmZpY2llbnRseSBjb250YWluIGEgYnl0ZSBzZXF1ZW5jZSBmb3IgbWV0YWRhdGEuCisvLy8gTURTdHJpbmcgaXMgYWx3YXlzIHVubmFtZWQuCitjbGFzcyBNRFN0cmluZyA6IHB1YmxpYyBNZXRhZGF0YSB7CisgIGZyaWVuZCBjbGFzcyBTdHJpbmdNYXBFbnRyeTxNRFN0cmluZz47CisKKyAgU3RyaW5nTWFwRW50cnk8TURTdHJpbmc+ICpFbnRyeSA9IG51bGxwdHI7CisKKyAgTURTdHJpbmcoKSA6IE1ldGFkYXRhKE1EU3RyaW5nS2luZCwgVW5pcXVlZCkge30KKworcHVibGljOgorICBNRFN0cmluZyhjb25zdCBNRFN0cmluZyAmKSA9IGRlbGV0ZTsKKyAgTURTdHJpbmcgJm9wZXJhdG9yPShNRFN0cmluZyAmJikgPSBkZWxldGU7CisgIE1EU3RyaW5nICZvcGVyYXRvcj0oY29uc3QgTURTdHJpbmcgJikgPSBkZWxldGU7CisKKyAgc3RhdGljIE1EU3RyaW5nICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIFN0cmluZ1JlZiBTdHIpOworICBzdGF0aWMgTURTdHJpbmcgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCwgY29uc3QgY2hhciAqU3RyKSB7CisgICAgcmV0dXJuIGdldChDb250ZXh0LCBTdHIgPyBTdHJpbmdSZWYoU3RyKSA6IFN0cmluZ1JlZigpKTsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRTdHJpbmcoKSBjb25zdDsKKworICB1bnNpZ25lZCBnZXRMZW5ndGgoKSBjb25zdCB7IHJldHVybiAodW5zaWduZWQpZ2V0U3RyaW5nKCkuc2l6ZSgpOyB9CisKKyAgdXNpbmcgaXRlcmF0b3IgPSBTdHJpbmdSZWY6Oml0ZXJhdG9yOworCisgIC8vLyBcYnJpZWYgUG9pbnRlciB0byB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgc3RyaW5nLgorICBpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZygpLmJlZ2luKCk7IH0KKworICAvLy8gXGJyaWVmIFBvaW50ZXIgdG8gb25lIGJ5dGUgcGFzdCB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZygpLmVuZCgpOyB9CisKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqYnl0ZXNfYmVnaW4oKSBjb25zdCB7IHJldHVybiBnZXRTdHJpbmcoKS5ieXRlc19iZWdpbigpOyB9CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ5dGVzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGdldFN0cmluZygpLmJ5dGVzX2VuZCgpOyB9CisKKyAgLy8vIFxicmllZiBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0LgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHJldHVybiBNRC0+Z2V0TWV0YWRhdGFJRCgpID09IE1EU3RyaW5nS2luZDsKKyAgfQorfTsKKworLy8vIFxicmllZiBBIGNvbGxlY3Rpb24gb2YgbWV0YWRhdGEgbm9kZXMgdGhhdCBtaWdodCBiZSBhc3NvY2lhdGVkIHdpdGggYQorLy8vIG1lbW9yeSBhY2Nlc3MgdXNlZCBieSB0aGUgYWxpYXMtYW5hbHlzaXMgaW5mcmFzdHJ1Y3R1cmUuCitzdHJ1Y3QgQUFNRE5vZGVzIHsKKyAgZXhwbGljaXQgQUFNRE5vZGVzKE1ETm9kZSAqVCA9IG51bGxwdHIsIE1ETm9kZSAqUyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICBNRE5vZGUgKk4gPSBudWxscHRyKQorICAgICAgOiBUQkFBKFQpLCBTY29wZShTKSwgTm9BbGlhcyhOKSB7fQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBQU1ETm9kZXMgJkEpIGNvbnN0IHsKKyAgICByZXR1cm4gVEJBQSA9PSBBLlRCQUEgJiYgU2NvcGUgPT0gQS5TY29wZSAmJiBOb0FsaWFzID09IEEuTm9BbGlhczsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBBQU1ETm9kZXMgJkEpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gQSk7IH0KKworICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gVEJBQSB8fCBTY29wZSB8fCBOb0FsaWFzOyB9CisKKyAgLy8vIFxicmllZiBUaGUgdGFnIGZvciB0eXBlLWJhc2VkIGFsaWFzIGFuYWx5c2lzLgorICBNRE5vZGUgKlRCQUE7CisKKyAgLy8vIFxicmllZiBUaGUgdGFnIGZvciBhbGlhcyBzY29wZSBzcGVjaWZpY2F0aW9uICh1c2VkIHdpdGggbm9hbGlhcykuCisgIE1ETm9kZSAqU2NvcGU7CisKKyAgLy8vIFxicmllZiBUaGUgdGFnIHNwZWNpZnlpbmcgdGhlIG5vYWxpYXMgc2NvcGUuCisgIE1ETm9kZSAqTm9BbGlhczsKKworICAvLy8gXGJyaWVmIEdpdmVuIHR3byBzZXRzIG9mIEFBTUROb2RlcyB0aGF0IGFwcGx5IHRvIHRoZSBzYW1lIHBvaW50ZXIsCisgIC8vLyBnaXZlIHRoZSBiZXN0IEFBTUROb2RlcyB0aGF0IGFyZSBjb21wYXRpYmxlIHdpdGggYm90aCAoaS5lLiBhIHNldCBvZgorICAvLy8gbm9kZXMgd2hvc2UgYWxsb3dhYmxlIGFsaWFzaW5nIGNvbmNsdXNpb25zIGFyZSBhIHN1YnNldCBvZiB0aG9zZQorICAvLy8gYWxsb3dhYmxlIGJ5IGJvdGggb2YgdGhlIGlucHV0cykuIEhvd2V2ZXIsIGZvciBlZmZpY2llbmN5CisgIC8vLyByZWFzb25zLCBkbyBub3QgY3JlYXRlIGFueSBuZXcgTUROb2Rlcy4KKyAgQUFNRE5vZGVzIGludGVyc2VjdChjb25zdCBBQU1ETm9kZXMgJk90aGVyKSB7CisgICAgQUFNRE5vZGVzIFJlc3VsdDsKKyAgICBSZXN1bHQuVEJBQSA9IE90aGVyLlRCQUEgPT0gVEJBQSA/IFRCQUEgOiBudWxscHRyOworICAgIFJlc3VsdC5TY29wZSA9IE90aGVyLlNjb3BlID09IFNjb3BlID8gU2NvcGUgOiBudWxscHRyOworICAgIFJlc3VsdC5Ob0FsaWFzID0gT3RoZXIuTm9BbGlhcyA9PSBOb0FsaWFzID8gTm9BbGlhcyA6IG51bGxwdHI7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorfTsKKworLy8gU3BlY2lhbGl6ZSBEZW5zZU1hcEluZm8gZm9yIEFBTUROb2Rlcy4KK3RlbXBsYXRlPD4KK3N0cnVjdCBEZW5zZU1hcEluZm88QUFNRE5vZGVzPiB7CisgIHN0YXRpYyBpbmxpbmUgQUFNRE5vZGVzIGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiBBQU1ETm9kZXMoRGVuc2VNYXBJbmZvPE1ETm9kZSAqPjo6Z2V0RW1wdHlLZXkoKSwKKyAgICAgICAgICAgICAgICAgICAgIG51bGxwdHIsIG51bGxwdHIpOworICB9CisKKyAgc3RhdGljIGlubGluZSBBQU1ETm9kZXMgZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiBBQU1ETm9kZXMoRGVuc2VNYXBJbmZvPE1ETm9kZSAqPjo6Z2V0VG9tYnN0b25lS2V5KCksCisgICAgICAgICAgICAgICAgICAgICBudWxscHRyLCBudWxscHRyKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgQUFNRE5vZGVzICZWYWwpIHsKKyAgICByZXR1cm4gRGVuc2VNYXBJbmZvPE1ETm9kZSAqPjo6Z2V0SGFzaFZhbHVlKFZhbC5UQkFBKSBeCisgICAgICAgICAgIERlbnNlTWFwSW5mbzxNRE5vZGUgKj46OmdldEhhc2hWYWx1ZShWYWwuU2NvcGUpIF4KKyAgICAgICAgICAgRGVuc2VNYXBJbmZvPE1ETm9kZSAqPjo6Z2V0SGFzaFZhbHVlKFZhbC5Ob0FsaWFzKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgQUFNRE5vZGVzICZMSFMsIGNvbnN0IEFBTUROb2RlcyAmUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFM7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVHJhY2tpbmcgbWV0YWRhdGEgcmVmZXJlbmNlIG93bmVkIGJ5IE1ldGFkYXRhLgorLy8vCisvLy8gU2ltaWxhciB0byBcYSBUcmFja2luZ01EUmVmLCBidXQgaXQncyBleHBlY3RlZCB0byBiZSBvd25lZCBieSBhbiBpbnN0YW5jZQorLy8vIG9mIFxhIE1ldGFkYXRhLCB3aGljaCBoYXMgdGhlIG9wdGlvbiBvZiByZWdpc3RlcmluZyBpdHNlbGYgZm9yIGNhbGxiYWNrcyB0bworLy8vIHJlLXVuaXF1ZSBpdHNlbGYuCisvLy8KKy8vLyBJbiBwYXJ0aWN1bGFyLCB0aGlzIGlzIHVzZWQgYnkgXGEgTUROb2RlLgorY2xhc3MgTURPcGVyYW5kIHsKKyAgTWV0YWRhdGEgKk1EID0gbnVsbHB0cjsKKworcHVibGljOgorICBNRE9wZXJhbmQoKSA9IGRlZmF1bHQ7CisgIE1ET3BlcmFuZChNRE9wZXJhbmQgJiYpID0gZGVsZXRlOworICBNRE9wZXJhbmQoY29uc3QgTURPcGVyYW5kICYpID0gZGVsZXRlOworICBNRE9wZXJhbmQgJm9wZXJhdG9yPShNRE9wZXJhbmQgJiYpID0gZGVsZXRlOworICBNRE9wZXJhbmQgJm9wZXJhdG9yPShjb25zdCBNRE9wZXJhbmQgJikgPSBkZWxldGU7CisgIH5NRE9wZXJhbmQoKSB7IHVudHJhY2soKTsgfQorCisgIE1ldGFkYXRhICpnZXQoKSBjb25zdCB7IHJldHVybiBNRDsgfQorICBvcGVyYXRvciBNZXRhZGF0YSAqKCkgY29uc3QgeyByZXR1cm4gZ2V0KCk7IH0KKyAgTWV0YWRhdGEgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBnZXQoKTsgfQorICBNZXRhZGF0YSAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKmdldCgpOyB9CisKKyAgdm9pZCByZXNldCgpIHsKKyAgICB1bnRyYWNrKCk7CisgICAgTUQgPSBudWxscHRyOworICB9CisgIHZvaWQgcmVzZXQoTWV0YWRhdGEgKk1ELCBNZXRhZGF0YSAqT3duZXIpIHsKKyAgICB1bnRyYWNrKCk7CisgICAgdGhpcy0+TUQgPSBNRDsKKyAgICB0cmFjayhPd25lcik7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCB0cmFjayhNZXRhZGF0YSAqT3duZXIpIHsKKyAgICBpZiAoTUQpIHsKKyAgICAgIGlmIChPd25lcikKKyAgICAgICAgTWV0YWRhdGFUcmFja2luZzo6dHJhY2sodGhpcywgKk1ELCAqT3duZXIpOworICAgICAgZWxzZQorICAgICAgICBNZXRhZGF0YVRyYWNraW5nOjp0cmFjayhNRCk7CisgICAgfQorICB9CisKKyAgdm9pZCB1bnRyYWNrKCkgeworICAgIGFzc2VydChzdGF0aWNfY2FzdDx2b2lkICo+KHRoaXMpID09ICZNRCAmJiAiRXhwZWN0ZWQgc2FtZSBhZGRyZXNzIik7CisgICAgaWYgKE1EKQorICAgICAgTWV0YWRhdGFUcmFja2luZzo6dW50cmFjayhNRCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBzaW1wbGlmeV90eXBlPE1ET3BlcmFuZD4geworICB1c2luZyBTaW1wbGVUeXBlID0gTWV0YWRhdGEgKjsKKworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoTURPcGVyYW5kICZNRCkgeyByZXR1cm4gTUQuZ2V0KCk7IH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBzaW1wbGlmeV90eXBlPGNvbnN0IE1ET3BlcmFuZD4geworICB1c2luZyBTaW1wbGVUeXBlID0gTWV0YWRhdGEgKjsKKworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoY29uc3QgTURPcGVyYW5kICZNRCkgeyByZXR1cm4gTUQuZ2V0KCk7IH0KK307CisKKy8vLyBcYnJpZWYgUG9pbnRlciB0byB0aGUgY29udGV4dCwgd2l0aCBvcHRpb25hbCBSQVVXIHN1cHBvcnQuCisvLy8KKy8vLyBFaXRoZXIgYSByYXcgKG5vbi1udWxsKSBwb2ludGVyIHRvIHRoZSBcYSBMTFZNQ29udGV4dCwgb3IgYW4gb3duZWQgcG9pbnRlcgorLy8vIHRvIFxhIFJlcGxhY2VhYmxlTWV0YWRhdGFJbXBsICh3aGljaCBoYXMgYSByZWZlcmVuY2UgdG8gXGEgTExWTUNvbnRleHQpLgorY2xhc3MgQ29udGV4dEFuZFJlcGxhY2VhYmxlVXNlcyB7CisgIFBvaW50ZXJVbmlvbjxMTFZNQ29udGV4dCAqLCBSZXBsYWNlYWJsZU1ldGFkYXRhSW1wbCAqPiBQdHI7CisKK3B1YmxpYzoKKyAgQ29udGV4dEFuZFJlcGxhY2VhYmxlVXNlcyhMTFZNQ29udGV4dCAmQ29udGV4dCkgOiBQdHIoJkNvbnRleHQpIHt9CisgIENvbnRleHRBbmRSZXBsYWNlYWJsZVVzZXMoCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVwbGFjZWFibGVNZXRhZGF0YUltcGw+IFJlcGxhY2VhYmxlVXNlcykKKyAgICAgIDogUHRyKFJlcGxhY2VhYmxlVXNlcy5yZWxlYXNlKCkpIHsKKyAgICBhc3NlcnQoZ2V0UmVwbGFjZWFibGVVc2VzKCkgJiYgIkV4cGVjdGVkIG5vbi1udWxsIHJlcGxhY2VhYmxlIHVzZXMiKTsKKyAgfQorICBDb250ZXh0QW5kUmVwbGFjZWFibGVVc2VzKCkgPSBkZWxldGU7CisgIENvbnRleHRBbmRSZXBsYWNlYWJsZVVzZXMoQ29udGV4dEFuZFJlcGxhY2VhYmxlVXNlcyAmJikgPSBkZWxldGU7CisgIENvbnRleHRBbmRSZXBsYWNlYWJsZVVzZXMoY29uc3QgQ29udGV4dEFuZFJlcGxhY2VhYmxlVXNlcyAmKSA9IGRlbGV0ZTsKKyAgQ29udGV4dEFuZFJlcGxhY2VhYmxlVXNlcyAmb3BlcmF0b3I9KENvbnRleHRBbmRSZXBsYWNlYWJsZVVzZXMgJiYpID0gZGVsZXRlOworICBDb250ZXh0QW5kUmVwbGFjZWFibGVVc2VzICYKKyAgb3BlcmF0b3I9KGNvbnN0IENvbnRleHRBbmRSZXBsYWNlYWJsZVVzZXMgJikgPSBkZWxldGU7CisgIH5Db250ZXh0QW5kUmVwbGFjZWFibGVVc2VzKCkgeyBkZWxldGUgZ2V0UmVwbGFjZWFibGVVc2VzKCk7IH0KKworICBvcGVyYXRvciBMTFZNQ29udGV4dCAmKCkgeyByZXR1cm4gZ2V0Q29udGV4dCgpOyB9CisKKyAgLy8vIFxicmllZiBXaGV0aGVyIHRoaXMgY29udGFpbnMgUkFVVyBzdXBwb3J0LgorICBib29sIGhhc1JlcGxhY2VhYmxlVXNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gUHRyLmlzPFJlcGxhY2VhYmxlTWV0YWRhdGFJbXBsICo+KCk7CisgIH0KKworICBMTFZNQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsKKyAgICBpZiAoaGFzUmVwbGFjZWFibGVVc2VzKCkpCisgICAgICByZXR1cm4gZ2V0UmVwbGFjZWFibGVVc2VzKCktPmdldENvbnRleHQoKTsKKyAgICByZXR1cm4gKlB0ci5nZXQ8TExWTUNvbnRleHQgKj4oKTsKKyAgfQorCisgIFJlcGxhY2VhYmxlTWV0YWRhdGFJbXBsICpnZXRSZXBsYWNlYWJsZVVzZXMoKSBjb25zdCB7CisgICAgaWYgKGhhc1JlcGxhY2VhYmxlVXNlcygpKQorICAgICAgcmV0dXJuIFB0ci5nZXQ8UmVwbGFjZWFibGVNZXRhZGF0YUltcGwgKj4oKTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBFbnN1cmUgdGhhdCB0aGlzIGhhcyBSQVVXIHN1cHBvcnQsIGFuZCB0aGVuIHJldHVybiBpdC4KKyAgUmVwbGFjZWFibGVNZXRhZGF0YUltcGwgKmdldE9yQ3JlYXRlUmVwbGFjZWFibGVVc2VzKCkgeworICAgIGlmICghaGFzUmVwbGFjZWFibGVVc2VzKCkpCisgICAgICBtYWtlUmVwbGFjZWFibGUobGx2bTo6bWFrZV91bmlxdWU8UmVwbGFjZWFibGVNZXRhZGF0YUltcGw+KGdldENvbnRleHQoKSkpOworICAgIHJldHVybiBnZXRSZXBsYWNlYWJsZVVzZXMoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQXNzaWduIFJBVVcgc3VwcG9ydCB0byB0aGlzLgorICAvLy8KKyAgLy8vIE1ha2UgdGhpcyByZXBsYWNlYWJsZSwgdGFraW5nIG93bmVyc2hpcCBvZiBcYyBSZXBsYWNlYWJsZVVzZXMgKHdoaWNoIG11c3QKKyAgLy8vIG5vdCBiZSBudWxsKS4KKyAgdm9pZAorICBtYWtlUmVwbGFjZWFibGUoc3RkOjp1bmlxdWVfcHRyPFJlcGxhY2VhYmxlTWV0YWRhdGFJbXBsPiBSZXBsYWNlYWJsZVVzZXMpIHsKKyAgICBhc3NlcnQoUmVwbGFjZWFibGVVc2VzICYmICJFeHBlY3RlZCBub24tbnVsbCByZXBsYWNlYWJsZSB1c2VzIik7CisgICAgYXNzZXJ0KCZSZXBsYWNlYWJsZVVzZXMtPmdldENvbnRleHQoKSA9PSAmZ2V0Q29udGV4dCgpICYmCisgICAgICAgICAgICJFeHBlY3RlZCBzYW1lIGNvbnRleHQiKTsKKyAgICBkZWxldGUgZ2V0UmVwbGFjZWFibGVVc2VzKCk7CisgICAgUHRyID0gUmVwbGFjZWFibGVVc2VzLnJlbGVhc2UoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRHJvcCBSQVVXIHN1cHBvcnQuCisgIC8vLworICAvLy8gQ2VkZSBvd25lcnNoaXAgb2YgUkFVVyBzdXBwb3J0LCByZXR1cm5pbmcgaXQuCisgIHN0ZDo6dW5pcXVlX3B0cjxSZXBsYWNlYWJsZU1ldGFkYXRhSW1wbD4gdGFrZVJlcGxhY2VhYmxlVXNlcygpIHsKKyAgICBhc3NlcnQoaGFzUmVwbGFjZWFibGVVc2VzKCkgJiYgIkV4cGVjdGVkIHRvIG93biByZXBsYWNlYWJsZSB1c2VzIik7CisgICAgc3RkOjp1bmlxdWVfcHRyPFJlcGxhY2VhYmxlTWV0YWRhdGFJbXBsPiBSZXBsYWNlYWJsZVVzZXMoCisgICAgICAgIGdldFJlcGxhY2VhYmxlVXNlcygpKTsKKyAgICBQdHIgPSAmUmVwbGFjZWFibGVVc2VzLT5nZXRDb250ZXh0KCk7CisgICAgcmV0dXJuIFJlcGxhY2VhYmxlVXNlczsKKyAgfQorfTsKKworc3RydWN0IFRlbXBNRE5vZGVEZWxldGVyIHsKKyAgaW5saW5lIHZvaWQgb3BlcmF0b3IoKShNRE5vZGUgKk5vZGUpIGNvbnN0OworfTsKKworI2RlZmluZSBIQU5ETEVfTUROT0RFX0xFQUYoQ0xBU1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdXNpbmcgVGVtcCMjQ0xBU1MgPSBzdGQ6OnVuaXF1ZV9wdHI8Q0xBU1MsIFRlbXBNRE5vZGVEZWxldGVyPjsKKyNkZWZpbmUgSEFORExFX01ETk9ERV9CUkFOQ0goQ0xBU1MpIEhBTkRMRV9NRE5PREVfTEVBRihDTEFTUykKKyNpbmNsdWRlICJsbHZtL0lSL01ldGFkYXRhLmRlZiIKKworLy8vIFxicmllZiBNZXRhZGF0YSBub2RlLgorLy8vCisvLy8gTWV0YWRhdGEgbm9kZXMgY2FuIGJlIHVuaXF1ZWQsIGxpa2UgY29uc3RhbnRzLCBvciBkaXN0aW5jdC4gIFRlbXBvcmFyeQorLy8vIG1ldGFkYXRhIG5vZGVzICh3aXRoIGZ1bGwgc3VwcG9ydCBmb3IgUkFVVykgY2FuIGJlIHVzZWQgdG8gZGVsYXkgdW5pcXVpbmcKKy8vLyB1bnRpbCBmb3J3YXJkIHJlZmVyZW5jZXMgYXJlIGtub3duLiAgVGhlIGJhc2ljIG1ldGFkYXRhIG5vZGUgaXMgYW4gXGEKKy8vLyBNRFR1cGxlLgorLy8vCisvLy8gVGhlcmUgaXMgbGltaXRlZCBzdXBwb3J0IGZvciBSQVVXIGF0IGNvbnN0cnVjdGlvbiB0aW1lLiAgQXQgY29uc3RydWN0aW9uCisvLy8gdGltZSwgaWYgYW55IG9wZXJhbmQgaXMgYSB0ZW1wb3Jhcnkgbm9kZSAob3IgYW4gdW5yZXNvbHZlZCB1bmlxdWVkIG5vZGUsCisvLy8gd2hpY2ggaW5kaWNhdGVzIGEgdHJhbnNpdGl2ZSB0ZW1wb3Jhcnkgb3BlcmFuZCksIHRoZSBub2RlIGl0c2VsZiB3aWxsIGJlCisvLy8gdW5yZXNvbHZlZC4gIEFzIHNvb24gYXMgYWxsIG9wZXJhbmRzIGJlY29tZSByZXNvbHZlZCwgaXQgd2lsbCBkcm9wIFJBVVcKKy8vLyBzdXBwb3J0IHBlcm1hbmVudGx5LgorLy8vCisvLy8gSWYgYW4gdW5yZXNvbHZlZCBub2RlIGlzIHBhcnQgb2YgYSBjeWNsZSwgXGEgcmVzb2x2ZUN5Y2xlcygpIG5lZWRzCisvLy8gdG8gYmUgY2FsbGVkIG9uIHNvbWUgbWVtYmVyIG9mIHRoZSBjeWNsZSBvbmNlIGFsbCB0ZW1wb3Jhcnkgbm9kZXMgaGF2ZSBiZWVuCisvLy8gcmVwbGFjZWQuCitjbGFzcyBNRE5vZGUgOiBwdWJsaWMgTWV0YWRhdGEgeworICBmcmllbmQgY2xhc3MgUmVwbGFjZWFibGVNZXRhZGF0YUltcGw7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisKKyAgdW5zaWduZWQgTnVtT3BlcmFuZHM7CisgIHVuc2lnbmVkIE51bVVucmVzb2x2ZWQ7CisKKyAgQ29udGV4dEFuZFJlcGxhY2VhYmxlVXNlcyBDb250ZXh0OworCitwcm90ZWN0ZWQ6CisgIE1ETm9kZShMTFZNQ29udGV4dCAmQ29udGV4dCwgdW5zaWduZWQgSUQsIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsCisgICAgICAgICBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMxLCBBcnJheVJlZjxNZXRhZGF0YSAqPiBPcHMyID0gTm9uZSk7CisgIH5NRE5vZGUoKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBTaXplLCB1bnNpZ25lZCBOdW1PcHMpOworICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpNZW0pOworCisgIC8vLyBcYnJpZWYgUmVxdWlyZWQgYnkgc3RkLCBidXQgbmV2ZXIgY2FsbGVkLgorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICosIHVuc2lnbmVkKSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiQ29uc3RydWN0b3IgdGhyb3dzPyIpOworICB9CisKKyAgLy8vIFxicmllZiBSZXF1aXJlZCBieSBzdGQsIGJ1dCBuZXZlciBjYWxsZWQuCisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKiwgdW5zaWduZWQsIGJvb2wpIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJDb25zdHJ1Y3RvciB0aHJvd3M/Iik7CisgIH0KKworICB2b2lkIGRyb3BBbGxSZWZlcmVuY2VzKCk7CisKKyAgTURPcGVyYW5kICptdXRhYmxlX2JlZ2luKCkgeyByZXR1cm4gbXV0YWJsZV9lbmQoKSAtIE51bU9wZXJhbmRzOyB9CisgIE1ET3BlcmFuZCAqbXV0YWJsZV9lbmQoKSB7IHJldHVybiByZWludGVycHJldF9jYXN0PE1ET3BlcmFuZCAqPih0aGlzKTsgfQorCisgIHVzaW5nIG11dGFibGVfb3BfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxNRE9wZXJhbmQgKj47CisKKyAgbXV0YWJsZV9vcF9yYW5nZSBtdXRhYmxlX29wZXJhbmRzKCkgeworICAgIHJldHVybiBtdXRhYmxlX29wX3JhbmdlKG11dGFibGVfYmVnaW4oKSwgbXV0YWJsZV9lbmQoKSk7CisgIH0KKworcHVibGljOgorICBNRE5vZGUoY29uc3QgTUROb2RlICYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBNRE5vZGUgJikgPSBkZWxldGU7CisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QpID0gZGVsZXRlOworCisgIHN0YXRpYyBpbmxpbmUgTURUdXBsZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCBBcnJheVJlZjxNZXRhZGF0YSAqPiBNRHMpOworICBzdGF0aWMgaW5saW5lIE1EVHVwbGUgKmdldElmRXhpc3RzKExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE1ldGFkYXRhICo+IE1Ecyk7CisgIHN0YXRpYyBpbmxpbmUgTURUdXBsZSAqZ2V0RGlzdGluY3QoTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8TWV0YWRhdGEgKj4gTURzKTsKKyAgc3RhdGljIGlubGluZSBUZW1wTURUdXBsZSBnZXRUZW1wb3JhcnkoTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE1ldGFkYXRhICo+IE1Ecyk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSAodGVtcG9yYXJ5KSBjbG9uZSBvZiB0aGlzLgorICBUZW1wTUROb2RlIGNsb25lKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBEZWFsbG9jYXRlIGEgbm9kZSBjcmVhdGVkIGJ5IGdldFRlbXBvcmFyeS4KKyAgLy8vCisgIC8vLyBDYWxscyBcYyByZXBsYWNlQWxsVXNlc1dpdGgobnVsbHB0cikgYmVmb3JlIGRlbGV0aW5nLCBzbyBhbnkgcmVtYWluaW5nCisgIC8vLyByZWZlcmVuY2VzIHdpbGwgYmUgcmVzZXQuCisgIHN0YXRpYyB2b2lkIGRlbGV0ZVRlbXBvcmFyeShNRE5vZGUgKk4pOworCisgIExMVk1Db250ZXh0ICZnZXRDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gQ29udGV4dC5nZXRDb250ZXh0KCk7IH0KKworICAvLy8gXGJyaWVmIFJlcGxhY2UgYSBzcGVjaWZpYyBvcGVyYW5kLgorICB2b2lkIHJlcGxhY2VPcGVyYW5kV2l0aCh1bnNpZ25lZCBJLCBNZXRhZGF0YSAqTmV3KTsKKworICAvLy8gXGJyaWVmIENoZWNrIGlmIG5vZGUgaXMgZnVsbHkgcmVzb2x2ZWQuCisgIC8vLworICAvLy8gSWYgXGEgaXNUZW1wb3JhcnkoKSwgdGhpcyBhbHdheXMgcmV0dXJucyBcYyBmYWxzZTsgaWYgXGEgaXNEaXN0aW5jdCgpLAorICAvLy8gdGhpcyBhbHdheXMgcmV0dXJucyBcYyB0cnVlLgorICAvLy8KKyAgLy8vIElmIFxhIGlzVW5pcXVlZCgpLCByZXR1cm5zIFxjIHRydWUgaWYgdGhpcyBoYXMgYWxyZWFkeSBkcm9wcGVkIFJBVVcKKyAgLy8vIHN1cHBvcnQgKGJlY2F1c2UgYWxsIG9wZXJhbmRzIGFyZSByZXNvbHZlZCkuCisgIC8vLworICAvLy8gQXMgZm9yd2FyZCBkZWNsYXJhdGlvbnMgYXJlIHJlc29sdmVkLCB0aGVpciBjb250YWluZXJzIHNob3VsZCBnZXQKKyAgLy8vIHJlc29sdmVkIGF1dG9tYXRpY2FsbHkuICBIb3dldmVyLCBpZiB0aGlzIChvciBvbmUgb2YgaXRzIG9wZXJhbmRzKSBpcworICAvLy8gaW52b2x2ZWQgaW4gYSBjeWNsZSwgXGEgcmVzb2x2ZUN5Y2xlcygpIG5lZWRzIHRvIGJlIGNhbGxlZCBleHBsaWNpdGx5LgorICBib29sIGlzUmVzb2x2ZWQoKSBjb25zdCB7IHJldHVybiAhaXNUZW1wb3JhcnkoKSAmJiAhTnVtVW5yZXNvbHZlZDsgfQorCisgIGJvb2wgaXNVbmlxdWVkKCkgY29uc3QgeyByZXR1cm4gU3RvcmFnZSA9PSBVbmlxdWVkOyB9CisgIGJvb2wgaXNEaXN0aW5jdCgpIGNvbnN0IHsgcmV0dXJuIFN0b3JhZ2UgPT0gRGlzdGluY3Q7IH0KKyAgYm9vbCBpc1RlbXBvcmFyeSgpIGNvbnN0IHsgcmV0dXJuIFN0b3JhZ2UgPT0gVGVtcG9yYXJ5OyB9CisKKyAgLy8vIFxicmllZiBSQVVXIGEgdGVtcG9yYXJ5LgorICAvLy8KKyAgLy8vIFxwcmUgXGEgaXNUZW1wb3JhcnkoKSBtdXN0IGJlIFxjIHRydWUuCisgIHZvaWQgcmVwbGFjZUFsbFVzZXNXaXRoKE1ldGFkYXRhICpNRCkgeworICAgIGFzc2VydChpc1RlbXBvcmFyeSgpICYmICJFeHBlY3RlZCB0ZW1wb3Jhcnkgbm9kZSIpOworICAgIGlmIChDb250ZXh0Lmhhc1JlcGxhY2VhYmxlVXNlcygpKQorICAgICAgQ29udGV4dC5nZXRSZXBsYWNlYWJsZVVzZXMoKS0+cmVwbGFjZUFsbFVzZXNXaXRoKE1EKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVzb2x2ZSBjeWNsZXMuCisgIC8vLworICAvLy8gT25jZSBhbGwgZm9yd2FyZCBkZWNsYXJhdGlvbnMgaGF2ZSBiZWVuIHJlc29sdmVkLCBmb3JjZSBjeWNsZXMgdG8gYmUKKyAgLy8vIHJlc29sdmVkLgorICAvLy8KKyAgLy8vIFxwcmUgTm8gb3BlcmFuZHMgKG9yIG9wZXJhbmRzJyBvcGVyYW5kcywgZXRjLikgaGF2ZSBcYSBpc1RlbXBvcmFyeSgpLgorICB2b2lkIHJlc29sdmVDeWNsZXMoKTsKKworICAvLy8gUmVzb2x2ZSBhIHVuaXF1ZSwgdW5yZXNvbHZlZCBub2RlLgorICB2b2lkIHJlc29sdmUoKTsKKworICAvLy8gXGJyaWVmIFJlcGxhY2UgYSB0ZW1wb3Jhcnkgbm9kZSB3aXRoIGEgcGVybWFuZW50IG9uZS4KKyAgLy8vCisgIC8vLyBUcnkgdG8gY3JlYXRlIGEgdW5pcXVlZCB2ZXJzaW9uIG9mIFxjIE4gLS0gaW4gcGxhY2UsIGlmIHBvc3NpYmxlIC0tIGFuZAorICAvLy8gcmV0dXJuIGl0LiAgSWYgXGMgTiBjYW5ub3QgYmUgdW5pcXVlZCwgcmV0dXJuIGEgZGlzdGluY3Qgbm9kZSBpbnN0ZWFkLgorICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgc3RhdGljIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfYmFzZV9vZjxNRE5vZGUsIFQ+Ojp2YWx1ZSwgVCAqPjo6dHlwZQorICByZXBsYWNlV2l0aFBlcm1hbmVudChzdGQ6OnVuaXF1ZV9wdHI8VCwgVGVtcE1ETm9kZURlbGV0ZXI+IE4pIHsKKyAgICByZXR1cm4gY2FzdDxUPihOLnJlbGVhc2UoKS0+cmVwbGFjZVdpdGhQZXJtYW5lbnRJbXBsKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXBsYWNlIGEgdGVtcG9yYXJ5IG5vZGUgd2l0aCBhIHVuaXF1ZWQgb25lLgorICAvLy8KKyAgLy8vIENyZWF0ZSBhIHVuaXF1ZWQgdmVyc2lvbiBvZiBcYyBOIC0tIGluIHBsYWNlLCBpZiBwb3NzaWJsZSAtLSBhbmQgcmV0dXJuCisgIC8vLyBpdC4gIFRha2VzIG93bmVyc2hpcCBvZiB0aGUgdGVtcG9yYXJ5IG5vZGUuCisgIC8vLworICAvLy8gXHByZSBOIGRvZXMgbm90IHNlbGYtcmVmZXJlbmNlLgorICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgc3RhdGljIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfYmFzZV9vZjxNRE5vZGUsIFQ+Ojp2YWx1ZSwgVCAqPjo6dHlwZQorICByZXBsYWNlV2l0aFVuaXF1ZWQoc3RkOjp1bmlxdWVfcHRyPFQsIFRlbXBNRE5vZGVEZWxldGVyPiBOKSB7CisgICAgcmV0dXJuIGNhc3Q8VD4oTi5yZWxlYXNlKCktPnJlcGxhY2VXaXRoVW5pcXVlZEltcGwoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlcGxhY2UgYSB0ZW1wb3Jhcnkgbm9kZSB3aXRoIGEgZGlzdGluY3Qgb25lLgorICAvLy8KKyAgLy8vIENyZWF0ZSBhIGRpc3RpbmN0IHZlcnNpb24gb2YgXGMgTiAtLSBpbiBwbGFjZSwgaWYgcG9zc2libGUgLS0gYW5kIHJldHVybgorICAvLy8gaXQuICBUYWtlcyBvd25lcnNoaXAgb2YgdGhlIHRlbXBvcmFyeSBub2RlLgorICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgc3RhdGljIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfYmFzZV9vZjxNRE5vZGUsIFQ+Ojp2YWx1ZSwgVCAqPjo6dHlwZQorICByZXBsYWNlV2l0aERpc3RpbmN0KHN0ZDo6dW5pcXVlX3B0cjxULCBUZW1wTUROb2RlRGVsZXRlcj4gTikgeworICAgIHJldHVybiBjYXN0PFQ+KE4ucmVsZWFzZSgpLT5yZXBsYWNlV2l0aERpc3RpbmN0SW1wbCgpKTsKKyAgfQorCitwcml2YXRlOgorICBNRE5vZGUgKnJlcGxhY2VXaXRoUGVybWFuZW50SW1wbCgpOworICBNRE5vZGUgKnJlcGxhY2VXaXRoVW5pcXVlZEltcGwoKTsKKyAgTUROb2RlICpyZXBsYWNlV2l0aERpc3RpbmN0SW1wbCgpOworCitwcm90ZWN0ZWQ6CisgIC8vLyBcYnJpZWYgU2V0IGFuIG9wZXJhbmQuCisgIC8vLworICAvLy8gU2V0cyB0aGUgb3BlcmFuZCBkaXJlY3RseSwgd2l0aG91dCB3b3JyeWluZyBhYm91dCB1bmlxdWluZy4KKyAgdm9pZCBzZXRPcGVyYW5kKHVuc2lnbmVkIEksIE1ldGFkYXRhICpOZXcpOworCisgIHZvaWQgc3RvcmVEaXN0aW5jdEluQ29udGV4dCgpOworICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgU3RvcmVUPgorICBzdGF0aWMgVCAqc3RvcmVJbXBsKFQgKk4sIFN0b3JhZ2VUeXBlIFN0b3JhZ2UsIFN0b3JlVCAmU3RvcmUpOworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RhdGljIFQgKnN0b3JlSW1wbChUICpOLCBTdG9yYWdlVHlwZSBTdG9yYWdlKTsKKworcHJpdmF0ZToKKyAgdm9pZCBoYW5kbGVDaGFuZ2VkT3BlcmFuZCh2b2lkICpSZWYsIE1ldGFkYXRhICpOZXcpOworCisgIC8vLyBEcm9wIFJBVVcgc3VwcG9ydCwgaWYgYW55LgorICB2b2lkIGRyb3BSZXBsYWNlYWJsZVVzZXMoKTsKKworICB2b2lkIHJlc29sdmVBZnRlck9wZXJhbmRDaGFuZ2UoTWV0YWRhdGEgKk9sZCwgTWV0YWRhdGEgKk5ldyk7CisgIHZvaWQgZGVjcmVtZW50VW5yZXNvbHZlZE9wZXJhbmRDb3VudCgpOworICB2b2lkIGNvdW50VW5yZXNvbHZlZE9wZXJhbmRzKCk7CisKKyAgLy8vIFxicmllZiBNdXRhdGUgdGhpcyB0byBiZSAidW5pcXVlZCIuCisgIC8vLworICAvLy8gTXV0YXRlIHRoaXMgc28gdGhhdCBcYSBpc1VuaXF1ZWQoKS4KKyAgLy8vIFxwcmUgXGEgaXNUZW1wb3JhcnkoKS4KKyAgLy8vIFxwcmUgYWxyZWFkeSBhZGRlZCB0byB1bmlxdWluZyBzZXQuCisgIHZvaWQgbWFrZVVuaXF1ZWQoKTsKKworICAvLy8gXGJyaWVmIE11dGF0ZSB0aGlzIHRvIGJlICJkaXN0aW5jdCIuCisgIC8vLworICAvLy8gTXV0YXRlIHRoaXMgc28gdGhhdCBcYSBpc0Rpc3RpbmN0KCkuCisgIC8vLyBccHJlIFxhIGlzVGVtcG9yYXJ5KCkuCisgIHZvaWQgbWFrZURpc3RpbmN0KCk7CisKKyAgdm9pZCBkZWxldGVBc1N1YmNsYXNzKCk7CisgIE1ETm9kZSAqdW5pcXVpZnkoKTsKKyAgdm9pZCBlcmFzZUZyb21TdG9yZSgpOworCisgIHRlbXBsYXRlIDxjbGFzcyBOb2RlVHk+IHN0cnVjdCBIYXNDYWNoZWRIYXNoOworICB0ZW1wbGF0ZSA8Y2xhc3MgTm9kZVR5PgorICBzdGF0aWMgdm9pZCBkaXNwYXRjaFJlY2FsY3VsYXRlSGFzaChOb2RlVHkgKk4sIHN0ZDo6dHJ1ZV90eXBlKSB7CisgICAgTi0+cmVjYWxjdWxhdGVIYXNoKCk7CisgIH0KKyAgdGVtcGxhdGUgPGNsYXNzIE5vZGVUeT4KKyAgc3RhdGljIHZvaWQgZGlzcGF0Y2hSZWNhbGN1bGF0ZUhhc2goTm9kZVR5ICosIHN0ZDo6ZmFsc2VfdHlwZSkge30KKyAgdGVtcGxhdGUgPGNsYXNzIE5vZGVUeT4KKyAgc3RhdGljIHZvaWQgZGlzcGF0Y2hSZXNldEhhc2goTm9kZVR5ICpOLCBzdGQ6OnRydWVfdHlwZSkgeworICAgIE4tPnNldEhhc2goMCk7CisgIH0KKyAgdGVtcGxhdGUgPGNsYXNzIE5vZGVUeT4KKyAgc3RhdGljIHZvaWQgZGlzcGF0Y2hSZXNldEhhc2goTm9kZVR5ICosIHN0ZDo6ZmFsc2VfdHlwZSkge30KKworcHVibGljOgorICB1c2luZyBvcF9pdGVyYXRvciA9IGNvbnN0IE1ET3BlcmFuZCAqOworICB1c2luZyBvcF9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPG9wX2l0ZXJhdG9yPjsKKworICBvcF9pdGVyYXRvciBvcF9iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxNRE5vZGUgKj4odGhpcyktPm11dGFibGVfYmVnaW4oKTsKKyAgfQorCisgIG9wX2l0ZXJhdG9yIG9wX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxNRE5vZGUgKj4odGhpcyktPm11dGFibGVfZW5kKCk7CisgIH0KKworICBvcF9yYW5nZSBvcGVyYW5kcygpIGNvbnN0IHsgcmV0dXJuIG9wX3JhbmdlKG9wX2JlZ2luKCksIG9wX2VuZCgpKTsgfQorCisgIGNvbnN0IE1ET3BlcmFuZCAmZ2V0T3BlcmFuZCh1bnNpZ25lZCBJKSBjb25zdCB7CisgICAgYXNzZXJ0KEkgPCBOdW1PcGVyYW5kcyAmJiAiT3V0IG9mIHJhbmdlIik7CisgICAgcmV0dXJuIG9wX2JlZ2luKClbSV07CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBudW1iZXIgb2YgTUROb2RlIG9wZXJhbmRzLgorICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kcygpIGNvbnN0IHsgcmV0dXJuIE51bU9wZXJhbmRzOyB9CisKKyAgLy8vIFxicmllZiBNZXRob2RzIGZvciBzdXBwb3J0IHR5cGUgaW5xdWlyeSB0aHJvdWdoIGlzYSwgY2FzdCwgYW5kIGR5bl9jYXN0OgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1ldGFkYXRhICpNRCkgeworICAgIHN3aXRjaCAoTUQtPmdldE1ldGFkYXRhSUQoKSkgeworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisjZGVmaW5lIEhBTkRMRV9NRE5PREVfTEVBRihDTEFTUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBjYXNlIENMQVNTIyNLaW5kOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gdHJ1ZTsKKyNpbmNsdWRlICJsbHZtL0lSL01ldGFkYXRhLmRlZiIKKyAgICB9CisgIH0KKworICAvLy8gXGJyaWVmIENoZWNrIHdoZXRoZXIgTUROb2RlIGlzIGEgdnRhYmxlIGFjY2Vzcy4KKyAgYm9vbCBpc1RCQUFWdGFibGVBY2Nlc3MoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIE1ldGhvZHMgZm9yIG1ldGFkYXRhIG1lcmdpbmcuCisgIHN0YXRpYyBNRE5vZGUgKmNvbmNhdGVuYXRlKE1ETm9kZSAqQSwgTUROb2RlICpCKTsKKyAgc3RhdGljIE1ETm9kZSAqaW50ZXJzZWN0KE1ETm9kZSAqQSwgTUROb2RlICpCKTsKKyAgc3RhdGljIE1ETm9kZSAqZ2V0TW9zdEdlbmVyaWNUQkFBKE1ETm9kZSAqQSwgTUROb2RlICpCKTsKKyAgc3RhdGljIE1ETm9kZSAqZ2V0TW9zdEdlbmVyaWNGUE1hdGgoTUROb2RlICpBLCBNRE5vZGUgKkIpOworICBzdGF0aWMgTUROb2RlICpnZXRNb3N0R2VuZXJpY1JhbmdlKE1ETm9kZSAqQSwgTUROb2RlICpCKTsKKyAgc3RhdGljIE1ETm9kZSAqZ2V0TW9zdEdlbmVyaWNBbGlhc1Njb3BlKE1ETm9kZSAqQSwgTUROb2RlICpCKTsKKyAgc3RhdGljIE1ETm9kZSAqZ2V0TW9zdEdlbmVyaWNBbGlnbm1lbnRPckRlcmVmZXJlbmNlYWJsZShNRE5vZGUgKkEsIE1ETm9kZSAqQik7Cit9OworCisvLy8gXGJyaWVmIFR1cGxlIG9mIG1ldGFkYXRhLgorLy8vCisvLy8gVGhpcyBpcyB0aGUgc2ltcGxlIFxhIE1ETm9kZSBhcmJpdHJhcnkgdHVwbGUuICBOb2RlcyBhcmUgdW5pcXVlZCBieQorLy8vIGRlZmF1bHQgYmFzZWQgb24gdGhlaXIgb3BlcmFuZHMuCitjbGFzcyBNRFR1cGxlIDogcHVibGljIE1ETm9kZSB7CisgIGZyaWVuZCBjbGFzcyBMTFZNQ29udGV4dEltcGw7CisgIGZyaWVuZCBjbGFzcyBNRE5vZGU7CisKKyAgTURUdXBsZShMTFZNQ29udGV4dCAmQywgU3RvcmFnZVR5cGUgU3RvcmFnZSwgdW5zaWduZWQgSGFzaCwKKyAgICAgICAgICBBcnJheVJlZjxNZXRhZGF0YSAqPiBWYWxzKQorICAgICAgOiBNRE5vZGUoQywgTURUdXBsZUtpbmQsIFN0b3JhZ2UsIFZhbHMpIHsKKyAgICBzZXRIYXNoKEhhc2gpOworICB9CisKKyAgfk1EVHVwbGUoKSB7IGRyb3BBbGxSZWZlcmVuY2VzKCk7IH0KKworICB2b2lkIHNldEhhc2godW5zaWduZWQgSGFzaCkgeyBTdWJjbGFzc0RhdGEzMiA9IEhhc2g7IH0KKyAgdm9pZCByZWNhbGN1bGF0ZUhhc2goKTsKKworICBzdGF0aWMgTURUdXBsZSAqZ2V0SW1wbChMTFZNQ29udGV4dCAmQ29udGV4dCwgQXJyYXlSZWY8TWV0YWRhdGEgKj4gTURzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdG9yYWdlVHlwZSBTdG9yYWdlLCBib29sIFNob3VsZENyZWF0ZSA9IHRydWUpOworCisgIFRlbXBNRFR1cGxlIGNsb25lSW1wbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VGVtcG9yYXJ5KGdldENvbnRleHQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9yPE1ldGFkYXRhICosIDQ+KG9wX2JlZ2luKCksIG9wX2VuZCgpKSk7CisgIH0KKworcHVibGljOgorICAvLy8gXGJyaWVmIEdldCB0aGUgaGFzaCwgaWYgYW55LgorICB1bnNpZ25lZCBnZXRIYXNoKCkgY29uc3QgeyByZXR1cm4gU3ViY2xhc3NEYXRhMzI7IH0KKworICBzdGF0aWMgTURUdXBsZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0LCBBcnJheVJlZjxNZXRhZGF0YSAqPiBNRHMpIHsKKyAgICByZXR1cm4gZ2V0SW1wbChDb250ZXh0LCBNRHMsIFVuaXF1ZWQpOworICB9CisKKyAgc3RhdGljIE1EVHVwbGUgKmdldElmRXhpc3RzKExMVk1Db250ZXh0ICZDb250ZXh0LCBBcnJheVJlZjxNZXRhZGF0YSAqPiBNRHMpIHsKKyAgICByZXR1cm4gZ2V0SW1wbChDb250ZXh0LCBNRHMsIFVuaXF1ZWQsIC8qIFNob3VsZENyZWF0ZSAqLyBmYWxzZSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBhIGRpc3RpbmN0IG5vZGUuCisgIC8vLworICAvLy8gUmV0dXJuIGEgZGlzdGluY3Qgbm9kZSAtLSBpLmUuLCBhIG5vZGUgdGhhdCBpcyBub3QgdW5pcXVlZC4KKyAgc3RhdGljIE1EVHVwbGUgKmdldERpc3RpbmN0KExMVk1Db250ZXh0ICZDb250ZXh0LCBBcnJheVJlZjxNZXRhZGF0YSAqPiBNRHMpIHsKKyAgICByZXR1cm4gZ2V0SW1wbChDb250ZXh0LCBNRHMsIERpc3RpbmN0KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgdGVtcG9yYXJ5IG5vZGUuCisgIC8vLworICAvLy8gRm9yIHVzZSBpbiBjb25zdHJ1Y3RpbmcgY3ljbGljIE1ETm9kZSBzdHJ1Y3R1cmVzLiBBIHRlbXBvcmFyeSBNRE5vZGUgaXMKKyAgLy8vIG5vdCB1bmlxdWVkLCBtYXkgYmUgUkFVVydkLCBhbmQgbXVzdCBiZSBtYW51YWxseSBkZWxldGVkIHdpdGgKKyAgLy8vIGRlbGV0ZVRlbXBvcmFyeS4KKyAgc3RhdGljIFRlbXBNRFR1cGxlIGdldFRlbXBvcmFyeShMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxNZXRhZGF0YSAqPiBNRHMpIHsKKyAgICByZXR1cm4gVGVtcE1EVHVwbGUoZ2V0SW1wbChDb250ZXh0LCBNRHMsIFRlbXBvcmFyeSkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSAodGVtcG9yYXJ5KSBjbG9uZSBvZiB0aGlzLgorICBUZW1wTURUdXBsZSBjbG9uZSgpIGNvbnN0IHsgcmV0dXJuIGNsb25lSW1wbCgpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNZXRhZGF0YSAqTUQpIHsKKyAgICByZXR1cm4gTUQtPmdldE1ldGFkYXRhSUQoKSA9PSBNRFR1cGxlS2luZDsKKyAgfQorfTsKKworTURUdXBsZSAqTUROb2RlOjpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQsIEFycmF5UmVmPE1ldGFkYXRhICo+IE1EcykgeworICByZXR1cm4gTURUdXBsZTo6Z2V0KENvbnRleHQsIE1Ecyk7Cit9CisKK01EVHVwbGUgKk1ETm9kZTo6Z2V0SWZFeGlzdHMoTExWTUNvbnRleHQgJkNvbnRleHQsIEFycmF5UmVmPE1ldGFkYXRhICo+IE1EcykgeworICByZXR1cm4gTURUdXBsZTo6Z2V0SWZFeGlzdHMoQ29udGV4dCwgTURzKTsKK30KKworTURUdXBsZSAqTUROb2RlOjpnZXREaXN0aW5jdChMTFZNQ29udGV4dCAmQ29udGV4dCwgQXJyYXlSZWY8TWV0YWRhdGEgKj4gTURzKSB7CisgIHJldHVybiBNRFR1cGxlOjpnZXREaXN0aW5jdChDb250ZXh0LCBNRHMpOworfQorCitUZW1wTURUdXBsZSBNRE5vZGU6OmdldFRlbXBvcmFyeShMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE1ldGFkYXRhICo+IE1EcykgeworICByZXR1cm4gTURUdXBsZTo6Z2V0VGVtcG9yYXJ5KENvbnRleHQsIE1Ecyk7Cit9CisKK3ZvaWQgVGVtcE1ETm9kZURlbGV0ZXI6Om9wZXJhdG9yKCkoTUROb2RlICpOb2RlKSBjb25zdCB7CisgIE1ETm9kZTo6ZGVsZXRlVGVtcG9yYXJ5KE5vZGUpOworfQorCisvLy8gXGJyaWVmIFR5cGVkIGl0ZXJhdG9yIHRocm91Z2ggTUROb2RlIG9wZXJhbmRzLgorLy8vCisvLy8gQW4gaXRlcmF0b3IgdGhhdCB0cmFuc2Zvcm1zIGFuIFxhIE1ETm9kZTo6aXRlcmF0b3IgaW50byBhbiBpdGVyYXRvciBvdmVyIGEKKy8vLyBwYXJ0aWN1bGFyIE1ldGFkYXRhIHN1YmNsYXNzLgordGVtcGxhdGUgPGNsYXNzIFQ+CitjbGFzcyBUeXBlZE1ET3BlcmFuZEl0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZywgVCAqLCBzdGQ6OnB0cmRpZmZfdCwgdm9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgKj4geworICBNRE5vZGU6Om9wX2l0ZXJhdG9yIEkgPSBudWxscHRyOworCitwdWJsaWM6CisgIFR5cGVkTURPcGVyYW5kSXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IFR5cGVkTURPcGVyYW5kSXRlcmF0b3IoTUROb2RlOjpvcF9pdGVyYXRvciBJKSA6IEkoSSkge30KKworICBUICpvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBjYXN0X29yX251bGw8VD4oKkkpOyB9CisKKyAgVHlwZWRNRE9wZXJhbmRJdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICArK0k7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgVHlwZWRNRE9wZXJhbmRJdGVyYXRvciBvcGVyYXRvcisrKGludCkgeworICAgIFR5cGVkTURPcGVyYW5kSXRlcmF0b3IgVGVtcCgqdGhpcyk7CisgICAgKytJOworICAgIHJldHVybiBUZW1wOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFR5cGVkTURPcGVyYW5kSXRlcmF0b3IgJlgpIGNvbnN0IHsgcmV0dXJuIEkgPT0gWC5JOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUeXBlZE1ET3BlcmFuZEl0ZXJhdG9yICZYKSBjb25zdCB7IHJldHVybiBJICE9IFguSTsgfQorfTsKKworLy8vIFxicmllZiBUeXBlZCwgYXJyYXktbGlrZSB0dXBsZSBvZiBtZXRhZGF0YS4KKy8vLworLy8vIFRoaXMgaXMgYSB3cmFwcGVyIGZvciBcYSBNRFR1cGxlIHRoYXQgbWFrZXMgaXQgYWN0IGxpa2UgYW4gYXJyYXkgaG9sZGluZyBhCisvLy8gcGFydGljdWxhciB0eXBlIG9mIG1ldGFkYXRhLgordGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIE1EVHVwbGVUeXBlZEFycmF5V3JhcHBlciB7CisgIGNvbnN0IE1EVHVwbGUgKk4gPSBudWxscHRyOworCitwdWJsaWM6CisgIE1EVHVwbGVUeXBlZEFycmF5V3JhcHBlcigpID0gZGVmYXVsdDsKKyAgTURUdXBsZVR5cGVkQXJyYXlXcmFwcGVyKGNvbnN0IE1EVHVwbGUgKk4pIDogTihOKSB7fQorCisgIHRlbXBsYXRlIDxjbGFzcyBVPgorICBNRFR1cGxlVHlwZWRBcnJheVdyYXBwZXIoCisgICAgICBjb25zdCBNRFR1cGxlVHlwZWRBcnJheVdyYXBwZXI8VT4gJk90aGVyLAorICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxVICosIFQgKj46OnZhbHVlPjo6dHlwZSAqID0KKyAgICAgICAgICBudWxscHRyKQorICAgICAgOiBOKE90aGVyLmdldCgpKSB7fQorCisgIHRlbXBsYXRlIDxjbGFzcyBVPgorICBleHBsaWNpdCBNRFR1cGxlVHlwZWRBcnJheVdyYXBwZXIoCisgICAgICBjb25zdCBNRFR1cGxlVHlwZWRBcnJheVdyYXBwZXI8VT4gJk90aGVyLAorICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfY29udmVydGlibGU8VSAqLCBUICo+Ojp2YWx1ZT46OnR5cGUgKiA9CisgICAgICAgICAgbnVsbHB0cikKKyAgICAgIDogTihPdGhlci5nZXQoKSkge30KKworICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgY29uc3QgeyByZXR1cm4gZ2V0KCk7IH0KKyAgZXhwbGljaXQgb3BlcmF0b3IgTURUdXBsZSAqKCkgY29uc3QgeyByZXR1cm4gZ2V0KCk7IH0KKworICBNRFR1cGxlICpnZXQoKSBjb25zdCB7IHJldHVybiBjb25zdF9jYXN0PE1EVHVwbGUgKj4oTik7IH0KKyAgTURUdXBsZSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIGdldCgpOyB9CisgIE1EVHVwbGUgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpnZXQoKTsgfQorCisgIC8vIEZJWE1FOiBGaXggY2FsbGVycyBhbmQgcmVtb3ZlIGNvbmRpdGlvbiBvbiBOLgorICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gTiA/IE4tPmdldE51bU9wZXJhbmRzKCkgOiAwdTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gTiA/IE4tPmdldE51bU9wZXJhbmRzKCkgPT0gMCA6IHRydWU7IH0KKyAgVCAqb3BlcmF0b3JbXSh1bnNpZ25lZCBJKSBjb25zdCB7IHJldHVybiBjYXN0X29yX251bGw8VD4oTi0+Z2V0T3BlcmFuZChJKSk7IH0KKworICAvLyBGSVhNRTogRml4IGNhbGxlcnMgYW5kIHJlbW92ZSBjb25kaXRpb24gb24gTi4KKyAgdXNpbmcgaXRlcmF0b3IgPSBUeXBlZE1ET3BlcmFuZEl0ZXJhdG9yPFQ+OworCisgIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gTiA/IGl0ZXJhdG9yKE4tPm9wX2JlZ2luKCkpIDogaXRlcmF0b3IoKTsgfQorICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBOID8gaXRlcmF0b3IoTi0+b3BfZW5kKCkpIDogaXRlcmF0b3IoKTsgfQorfTsKKworI2RlZmluZSBIQU5ETEVfTUVUQURBVEEoQ0xBU1MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdXNpbmcgQ0xBU1MjI0FycmF5ID0gTURUdXBsZVR5cGVkQXJyYXlXcmFwcGVyPENMQVNTPjsKKyNpbmNsdWRlICJsbHZtL0lSL01ldGFkYXRhLmRlZiIKKworLy8vIFBsYWNlaG9sZGVyIG1ldGFkYXRhIGZvciBvcGVyYW5kcyBvZiBkaXN0aW5jdCBNRE5vZGVzLgorLy8vCisvLy8gVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IHBsYWNlaG9sZGVyIGZvciBhbiBvcGVyYW5kIG9mIGEgZGlzdGluY3Qgbm9kZS4gIEl0J3MKKy8vLyBwdXJwb3NlIGlzIHRvIGhlbHAgdHJhY2sgZm9yd2FyZCByZWZlcmVuY2VzIHdoZW4gY3JlYXRpbmcgYSBkaXN0aW5jdCBub2RlLgorLy8vIFRoaXMgYWxsb3dzIGRpc3RpbmN0IG5vZGVzIGludm9sdmVkIGluIGEgY3ljbGUgdG8gYmUgY29uc3RydWN0ZWQgYmVmb3JlCisvLy8gdGhlaXIgb3BlcmFuZHMgd2l0aG91dCByZXF1aXJpbmcgYSBoZWF2eXdlaWdodCB0ZW1wb3Jhcnkgbm9kZSB3aXRoCisvLy8gZnVsbC1ibG93biBSQVVXIHN1cHBvcnQuCisvLy8KKy8vLyBFYWNoIHBsYWNlaG9sZGVyIHN1cHBvcnRzIG9ubHkgYSBzaW5nbGUgTUROb2RlIHVzZXIuICBDbGllbnRzIHNob3VsZCBwYXNzCisvLy8gYW4gSUQsIHJldHJpZXZlZCB2aWEgXGEgZ2V0SUQoKSwgdG8gaW5kaWNhdGUgdGhlICJyZWFsIiBvcGVyYW5kIHRoYXQgdGhpcworLy8vIHNob3VsZCBiZSByZXBsYWNlZCB3aXRoLgorLy8vCisvLy8gV2hpbGUgaXQgd291bGQgYmUgcG9zc2libGUgdG8gaW1wbGVtZW50IG1vdmUgb3BlcmF0b3JzLCB0aGV5IHdvdWxkIGJlCisvLy8gZmFpcmx5IGV4cGVuc2l2ZS4gIExlYXZlIHRoZW0gdW5pbXBsZW1lbnRlZCB0byBkaXNjb3VyYWdlIHRoZWlyIHVzZQorLy8vIChjbGllbnRzIGNhbiB1c2Ugc3RkOjpkZXF1ZSwgc3RkOjpsaXN0LCBCdW1wUHRyQWxsb2NhdG9yLCBldGMuKS4KK2NsYXNzIERpc3RpbmN0TURPcGVyYW5kUGxhY2Vob2xkZXIgOiBwdWJsaWMgTWV0YWRhdGEgeworICBmcmllbmQgY2xhc3MgTWV0YWRhdGFUcmFja2luZzsKKworICBNZXRhZGF0YSAqKlVzZSA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgRGlzdGluY3RNRE9wZXJhbmRQbGFjZWhvbGRlcih1bnNpZ25lZCBJRCkKKyAgICAgIDogTWV0YWRhdGEoRGlzdGluY3RNRE9wZXJhbmRQbGFjZWhvbGRlcktpbmQsIERpc3RpbmN0KSB7CisgICAgU3ViY2xhc3NEYXRhMzIgPSBJRDsKKyAgfQorCisgIERpc3RpbmN0TURPcGVyYW5kUGxhY2Vob2xkZXIoKSA9IGRlbGV0ZTsKKyAgRGlzdGluY3RNRE9wZXJhbmRQbGFjZWhvbGRlcihEaXN0aW5jdE1ET3BlcmFuZFBsYWNlaG9sZGVyICYmKSA9IGRlbGV0ZTsKKyAgRGlzdGluY3RNRE9wZXJhbmRQbGFjZWhvbGRlcihjb25zdCBEaXN0aW5jdE1ET3BlcmFuZFBsYWNlaG9sZGVyICYpID0gZGVsZXRlOworCisgIH5EaXN0aW5jdE1ET3BlcmFuZFBsYWNlaG9sZGVyKCkgeworICAgIGlmIChVc2UpCisgICAgICAqVXNlID0gbnVsbHB0cjsKKyAgfQorCisgIHVuc2lnbmVkIGdldElEKCkgY29uc3QgeyByZXR1cm4gU3ViY2xhc3NEYXRhMzI7IH0KKworICAvLy8gUmVwbGFjZSB0aGUgdXNlIG9mIHRoaXMgd2l0aCBNRC4KKyAgdm9pZCByZXBsYWNlVXNlV2l0aChNZXRhZGF0YSAqTUQpIHsKKyAgICBpZiAoIVVzZSkKKyAgICAgIHJldHVybjsKKyAgICAqVXNlID0gTUQ7CisKKyAgICBpZiAoKlVzZSkKKyAgICAgIE1ldGFkYXRhVHJhY2tpbmc6OnRyYWNrKCpVc2UpOworCisgICAgTWV0YWRhdGEgKlQgPSBjYXN0PE1ldGFkYXRhPih0aGlzKTsKKyAgICBNZXRhZGF0YVRyYWNraW5nOjp1bnRyYWNrKFQpOworICAgIGFzc2VydCghVXNlICYmICJVc2UgaXMgc3RpbGwgYmVpbmcgdHJhY2tlZCBkZXNwaXRlIGJlaW5nIHVudHJhY2tlZCEiKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcYnJpZWYgQSB0dXBsZSBvZiBNRE5vZGVzLgorLy8vCisvLy8gRGVzcGl0ZSBpdHMgbmFtZSwgYSBOYW1lZE1ETm9kZSBpc24ndCBpdHNlbGYgYW4gTUROb2RlLiBOYW1lZE1ETm9kZXMgYmVsb25nCisvLy8gdG8gbW9kdWxlcywgaGF2ZSBuYW1lcywgYW5kIGNvbnRhaW4gbGlzdHMgb2YgTUROb2Rlcy4KKy8vLworLy8vIFRPRE86IEluaGVyaXQgZnJvbSBNZXRhZGF0YS4KK2NsYXNzIE5hbWVkTUROb2RlIDogcHVibGljIGlsaXN0X25vZGU8TmFtZWRNRE5vZGU+IHsKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKyAgZnJpZW5kIGNsYXNzIE1vZHVsZTsKKworICBzdGQ6OnN0cmluZyBOYW1lOworICBNb2R1bGUgKlBhcmVudCA9IG51bGxwdHI7CisgIHZvaWQgKk9wZXJhbmRzOyAvLyBTbWFsbFZlY3RvcjxUcmFja2luZ01EUmVmLCA0PgorCisgIHZvaWQgc2V0UGFyZW50KE1vZHVsZSAqTSkgeyBQYXJlbnQgPSBNOyB9CisKKyAgZXhwbGljaXQgTmFtZWRNRE5vZGUoY29uc3QgVHdpbmUgJk4pOworCisgIHRlbXBsYXRlPGNsYXNzIFQxLCBjbGFzcyBUMj4KKyAgY2xhc3Mgb3BfaXRlcmF0b3JfaW1wbCA6CisgICAgICBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmJpZGlyZWN0aW9uYWxfaXRlcmF0b3JfdGFnLCBUMj4geworICAgIGZyaWVuZCBjbGFzcyBOYW1lZE1ETm9kZTsKKworICAgIGNvbnN0IE5hbWVkTUROb2RlICpOb2RlID0gbnVsbHB0cjsKKyAgICB1bnNpZ25lZCBJZHggPSAwOworCisgICAgb3BfaXRlcmF0b3JfaW1wbChjb25zdCBOYW1lZE1ETm9kZSAqTiwgdW5zaWduZWQgaSkgOiBOb2RlKE4pLCBJZHgoaSkge30KKworICBwdWJsaWM6CisgICAgb3BfaXRlcmF0b3JfaW1wbCgpID0gZGVmYXVsdDsKKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBvcF9pdGVyYXRvcl9pbXBsICZvKSBjb25zdCB7IHJldHVybiBJZHggPT0gby5JZHg7IH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3Qgb3BfaXRlcmF0b3JfaW1wbCAmbykgY29uc3QgeyByZXR1cm4gSWR4ICE9IG8uSWR4OyB9CisKKyAgICBvcF9pdGVyYXRvcl9pbXBsICZvcGVyYXRvcisrKCkgeworICAgICAgKytJZHg7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BfaXRlcmF0b3JfaW1wbCBvcGVyYXRvcisrKGludCkgeworICAgICAgb3BfaXRlcmF0b3JfaW1wbCB0bXAoKnRoaXMpOworICAgICAgb3BlcmF0b3IrKygpOworICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisKKyAgICBvcF9pdGVyYXRvcl9pbXBsICZvcGVyYXRvci0tKCkgeworICAgICAgLS1JZHg7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgb3BfaXRlcmF0b3JfaW1wbCBvcGVyYXRvci0tKGludCkgeworICAgICAgb3BfaXRlcmF0b3JfaW1wbCB0bXAoKnRoaXMpOworICAgICAgb3BlcmF0b3ItLSgpOworICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisKKyAgICBUMSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBOb2RlLT5nZXRPcGVyYW5kKElkeCk7IH0KKyAgfTsKKworcHVibGljOgorICBOYW1lZE1ETm9kZShjb25zdCBOYW1lZE1ETm9kZSAmKSA9IGRlbGV0ZTsKKyAgfk5hbWVkTUROb2RlKCk7CisKKyAgLy8vIFxicmllZiBEcm9wIGFsbCByZWZlcmVuY2VzIGFuZCByZW1vdmUgdGhlIG5vZGUgZnJvbSBwYXJlbnQgbW9kdWxlLgorICB2b2lkIGVyYXNlRnJvbVBhcmVudCgpOworCisgIC8vLyBSZW1vdmUgYWxsIHVzZXMgYW5kIGNsZWFyIG5vZGUgdmVjdG9yLgorICB2b2lkIGRyb3BBbGxSZWZlcmVuY2VzKCkgeyBjbGVhck9wZXJhbmRzKCk7IH0KKyAgLy8vIERyb3AgYWxsIHJlZmVyZW5jZXMgdG8gdGhpcyBub2RlJ3Mgb3BlcmFuZHMuCisgIHZvaWQgY2xlYXJPcGVyYW5kcygpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBtb2R1bGUgdGhhdCBob2xkcyB0aGlzIG5hbWVkIG1ldGFkYXRhIGNvbGxlY3Rpb24uCisgIGlubGluZSBNb2R1bGUgKmdldFBhcmVudCgpIHsgcmV0dXJuIFBhcmVudDsgfQorICBpbmxpbmUgY29uc3QgTW9kdWxlICpnZXRQYXJlbnQoKSBjb25zdCB7IHJldHVybiBQYXJlbnQ7IH0KKworICBNRE5vZGUgKmdldE9wZXJhbmQodW5zaWduZWQgaSkgY29uc3Q7CisgIHVuc2lnbmVkIGdldE51bU9wZXJhbmRzKCkgY29uc3Q7CisgIHZvaWQgYWRkT3BlcmFuZChNRE5vZGUgKk0pOworICB2b2lkIHNldE9wZXJhbmQodW5zaWduZWQgSSwgTUROb2RlICpOZXcpOworICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0OworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZST1MsIGJvb2wgSXNGb3JEZWJ1ZyA9IGZhbHNlKSBjb25zdDsKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmUk9TLCBNb2R1bGVTbG90VHJhY2tlciAmTVNULAorICAgICAgICAgICAgIGJvb2wgSXNGb3JEZWJ1ZyA9IGZhbHNlKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIE9wZXJhbmQgSXRlcmF0b3IgaW50ZXJmYWNlLi4uCisgIC8vCisgIHVzaW5nIG9wX2l0ZXJhdG9yID0gb3BfaXRlcmF0b3JfaW1wbDxNRE5vZGUgKiwgTUROb2RlPjsKKworICBvcF9pdGVyYXRvciBvcF9iZWdpbigpIHsgcmV0dXJuIG9wX2l0ZXJhdG9yKHRoaXMsIDApOyB9CisgIG9wX2l0ZXJhdG9yIG9wX2VuZCgpICAgeyByZXR1cm4gb3BfaXRlcmF0b3IodGhpcywgZ2V0TnVtT3BlcmFuZHMoKSk7IH0KKworICB1c2luZyBjb25zdF9vcF9pdGVyYXRvciA9IG9wX2l0ZXJhdG9yX2ltcGw8Y29uc3QgTUROb2RlICosIE1ETm9kZT47CisKKyAgY29uc3Rfb3BfaXRlcmF0b3Igb3BfYmVnaW4oKSBjb25zdCB7IHJldHVybiBjb25zdF9vcF9pdGVyYXRvcih0aGlzLCAwKTsgfQorICBjb25zdF9vcF9pdGVyYXRvciBvcF9lbmQoKSAgIGNvbnN0IHsgcmV0dXJuIGNvbnN0X29wX2l0ZXJhdG9yKHRoaXMsIGdldE51bU9wZXJhbmRzKCkpOyB9CisKKyAgaW5saW5lIGl0ZXJhdG9yX3JhbmdlPG9wX2l0ZXJhdG9yPiAgb3BlcmFuZHMoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2Uob3BfYmVnaW4oKSwgb3BfZW5kKCkpOworICB9CisgIGlubGluZSBpdGVyYXRvcl9yYW5nZTxjb25zdF9vcF9pdGVyYXRvcj4gb3BlcmFuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2Uob3BfYmVnaW4oKSwgb3BfZW5kKCkpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9NRVRBREFUQV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL01vZHVsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Nb2R1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41OGU0YmM0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Nb2R1bGUuaApAQCAtMCwwICsxLDg3NiBAQAorLy89PT0tIGxsdm0vTW9kdWxlLmggLSBDKysgY2xhc3MgdG8gcmVwcmVzZW50IGEgVk0gbW9kdWxlIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gQGZpbGUKKy8vLyBNb2R1bGUuaCBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9ucyBmb3IgdGhlIE1vZHVsZSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfTU9EVUxFX0gKKyNkZWZpbmUgTExWTV9JUl9NT0RVTEVfSAorCisjaW5jbHVkZSAibGx2bS1jL1R5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbWRhdC5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGF0YUxheW91dC5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbEFsaWFzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9HbG9iYWxJRnVuYy5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsVmFyaWFibGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01ldGFkYXRhLmgiCisjaW5jbHVkZSAibGx2bS9JUi9TeW1ib2xUYWJsZUxpc3RUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0JpbmRpbmdXcmFwcGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db2RlR2VuLmgiCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEVycm9yOworY2xhc3MgRnVuY3Rpb25UeXBlOworY2xhc3MgR1ZNYXRlcmlhbGl6ZXI7CitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIE1lbW9yeUJ1ZmZlcjsKK2NsYXNzIFJhbmRvbU51bWJlckdlbmVyYXRvcjsKK3RlbXBsYXRlIDxjbGFzcyBQdHJUeXBlPiBjbGFzcyBTbWFsbFB0clNldEltcGw7CitjbGFzcyBTdHJ1Y3RUeXBlOworCisvLy8gQSBNb2R1bGUgaW5zdGFuY2UgaXMgdXNlZCB0byBzdG9yZSBhbGwgdGhlIGluZm9ybWF0aW9uIHJlbGF0ZWQgdG8gYW4KKy8vLyBMTFZNIG1vZHVsZS4gTW9kdWxlcyBhcmUgdGhlIHRvcCBsZXZlbCBjb250YWluZXIgb2YgYWxsIG90aGVyIExMVk0KKy8vLyBJbnRlcm1lZGlhdGUgUmVwcmVzZW50YXRpb24gKElSKSBvYmplY3RzLiBFYWNoIG1vZHVsZSBkaXJlY3RseSBjb250YWlucyBhCisvLy8gbGlzdCBvZiBnbG9iYWxzIHZhcmlhYmxlcywgYSBsaXN0IG9mIGZ1bmN0aW9ucywgYSBsaXN0IG9mIGxpYnJhcmllcyAob3IKKy8vLyBvdGhlciBtb2R1bGVzKSB0aGlzIG1vZHVsZSBkZXBlbmRzIG9uLCBhIHN5bWJvbCB0YWJsZSwgYW5kIHZhcmlvdXMgZGF0YQorLy8vIGFib3V0IHRoZSB0YXJnZXQncyBjaGFyYWN0ZXJpc3RpY3MuCisvLy8KKy8vLyBBIG1vZHVsZSBtYWludGFpbnMgYSBHbG9iYWxWYWxSZWZNYXAgb2JqZWN0IHRoYXQgaXMgdXNlZCB0byBob2xkIGFsbAorLy8vIGNvbnN0YW50IHJlZmVyZW5jZXMgdG8gZ2xvYmFsIHZhcmlhYmxlcyBpbiB0aGUgbW9kdWxlLiAgV2hlbiBhIGdsb2JhbAorLy8vIHZhcmlhYmxlIGlzIGRlc3Ryb3llZCwgaXQgc2hvdWxkIGhhdmUgbm8gZW50cmllcyBpbiB0aGUgR2xvYmFsVmFsdWVSZWZNYXAuCisvLy8gQGJyaWVmIFRoZSBtYWluIGNvbnRhaW5lciBjbGFzcyBmb3IgdGhlIExMVk0gSW50ZXJtZWRpYXRlIFJlcHJlc2VudGF0aW9uLgorY2xhc3MgTW9kdWxlIHsKKy8vLyBAbmFtZSBUeXBlcyBBbmQgRW51bWVyYXRpb25zCisvLy8gQHsKK3B1YmxpYzoKKyAgLy8vIFRoZSB0eXBlIGZvciB0aGUgbGlzdCBvZiBnbG9iYWwgdmFyaWFibGVzLgorICB1c2luZyBHbG9iYWxMaXN0VHlwZSA9IFN5bWJvbFRhYmxlTGlzdDxHbG9iYWxWYXJpYWJsZT47CisgIC8vLyBUaGUgdHlwZSBmb3IgdGhlIGxpc3Qgb2YgZnVuY3Rpb25zLgorICB1c2luZyBGdW5jdGlvbkxpc3RUeXBlID0gU3ltYm9sVGFibGVMaXN0PEZ1bmN0aW9uPjsKKyAgLy8vIFRoZSB0eXBlIGZvciB0aGUgbGlzdCBvZiBhbGlhc2VzLgorICB1c2luZyBBbGlhc0xpc3RUeXBlID0gU3ltYm9sVGFibGVMaXN0PEdsb2JhbEFsaWFzPjsKKyAgLy8vIFRoZSB0eXBlIGZvciB0aGUgbGlzdCBvZiBpZnVuY3MuCisgIHVzaW5nIElGdW5jTGlzdFR5cGUgPSBTeW1ib2xUYWJsZUxpc3Q8R2xvYmFsSUZ1bmM+OworICAvLy8gVGhlIHR5cGUgZm9yIHRoZSBsaXN0IG9mIG5hbWVkIG1ldGFkYXRhLgorICB1c2luZyBOYW1lZE1ETGlzdFR5cGUgPSBpbGlzdDxOYW1lZE1ETm9kZT47CisgIC8vLyBUaGUgdHlwZSBvZiB0aGUgY29tZGF0ICJzeW1ib2wiIHRhYmxlLgorICB1c2luZyBDb21kYXRTeW1UYWJUeXBlID0gU3RyaW5nTWFwPENvbWRhdD47CisKKyAgLy8vIFRoZSBHbG9iYWwgVmFyaWFibGUgaXRlcmF0b3IuCisgIHVzaW5nIGdsb2JhbF9pdGVyYXRvciA9IEdsb2JhbExpc3RUeXBlOjppdGVyYXRvcjsKKyAgLy8vIFRoZSBHbG9iYWwgVmFyaWFibGUgY29uc3RhbnQgaXRlcmF0b3IuCisgIHVzaW5nIGNvbnN0X2dsb2JhbF9pdGVyYXRvciA9IEdsb2JhbExpc3RUeXBlOjpjb25zdF9pdGVyYXRvcjsKKworICAvLy8gVGhlIEZ1bmN0aW9uIGl0ZXJhdG9ycy4KKyAgdXNpbmcgaXRlcmF0b3IgPSBGdW5jdGlvbkxpc3RUeXBlOjppdGVyYXRvcjsKKyAgLy8vIFRoZSBGdW5jdGlvbiBjb25zdGFudCBpdGVyYXRvcgorICB1c2luZyBjb25zdF9pdGVyYXRvciA9IEZ1bmN0aW9uTGlzdFR5cGU6OmNvbnN0X2l0ZXJhdG9yOworCisgIC8vLyBUaGUgRnVuY3Rpb24gcmV2ZXJzZSBpdGVyYXRvci4KKyAgdXNpbmcgcmV2ZXJzZV9pdGVyYXRvciA9IEZ1bmN0aW9uTGlzdFR5cGU6OnJldmVyc2VfaXRlcmF0b3I7CisgIC8vLyBUaGUgRnVuY3Rpb24gY29uc3RhbnQgcmV2ZXJzZSBpdGVyYXRvci4KKyAgdXNpbmcgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciA9IEZ1bmN0aW9uTGlzdFR5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisKKyAgLy8vIFRoZSBHbG9iYWwgQWxpYXMgaXRlcmF0b3JzLgorICB1c2luZyBhbGlhc19pdGVyYXRvciA9IEFsaWFzTGlzdFR5cGU6Oml0ZXJhdG9yOworICAvLy8gVGhlIEdsb2JhbCBBbGlhcyBjb25zdGFudCBpdGVyYXRvcgorICB1c2luZyBjb25zdF9hbGlhc19pdGVyYXRvciA9IEFsaWFzTGlzdFR5cGU6OmNvbnN0X2l0ZXJhdG9yOworCisgIC8vLyBUaGUgR2xvYmFsIElGdW5jIGl0ZXJhdG9ycy4KKyAgdXNpbmcgaWZ1bmNfaXRlcmF0b3IgPSBJRnVuY0xpc3RUeXBlOjppdGVyYXRvcjsKKyAgLy8vIFRoZSBHbG9iYWwgSUZ1bmMgY29uc3RhbnQgaXRlcmF0b3IKKyAgdXNpbmcgY29uc3RfaWZ1bmNfaXRlcmF0b3IgPSBJRnVuY0xpc3RUeXBlOjpjb25zdF9pdGVyYXRvcjsKKworICAvLy8gVGhlIG5hbWVkIG1ldGFkYXRhIGl0ZXJhdG9ycy4KKyAgdXNpbmcgbmFtZWRfbWV0YWRhdGFfaXRlcmF0b3IgPSBOYW1lZE1ETGlzdFR5cGU6Oml0ZXJhdG9yOworICAvLy8gVGhlIG5hbWVkIG1ldGFkYXRhIGNvbnN0YW50IGl0ZXJhdG9ycy4KKyAgdXNpbmcgY29uc3RfbmFtZWRfbWV0YWRhdGFfaXRlcmF0b3IgPSBOYW1lZE1ETGlzdFR5cGU6OmNvbnN0X2l0ZXJhdG9yOworCisgIC8vLyBUaGlzIGVudW1lcmF0aW9uIGRlZmluZXMgdGhlIHN1cHBvcnRlZCBiZWhhdmlvcnMgb2YgbW9kdWxlIGZsYWdzLgorICBlbnVtIE1vZEZsYWdCZWhhdmlvciB7CisgICAgLy8vIEVtaXRzIGFuIGVycm9yIGlmIHR3byB2YWx1ZXMgZGlzYWdyZWUsIG90aGVyd2lzZSB0aGUgcmVzdWx0aW5nIHZhbHVlIGlzCisgICAgLy8vIHRoYXQgb2YgdGhlIG9wZXJhbmRzLgorICAgIEVycm9yID0gMSwKKworICAgIC8vLyBFbWl0cyBhIHdhcm5pbmcgaWYgdHdvIHZhbHVlcyBkaXNhZ3JlZS4gVGhlIHJlc3VsdCB2YWx1ZSB3aWxsIGJlIHRoZQorICAgIC8vLyBvcGVyYW5kIGZvciB0aGUgZmxhZyBmcm9tIHRoZSBmaXJzdCBtb2R1bGUgYmVpbmcgbGlua2VkLgorICAgIFdhcm5pbmcgPSAyLAorCisgICAgLy8vIEFkZHMgYSByZXF1aXJlbWVudCB0aGF0IGFub3RoZXIgbW9kdWxlIGZsYWcgYmUgcHJlc2VudCBhbmQgaGF2ZSBhCisgICAgLy8vIHNwZWNpZmllZCB2YWx1ZSBhZnRlciBsaW5raW5nIGlzIHBlcmZvcm1lZC4gVGhlIHZhbHVlIG11c3QgYmUgYSBtZXRhZGF0YQorICAgIC8vLyBwYWlyLCB3aGVyZSB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgcGFpciBpcyB0aGUgSUQgb2YgdGhlIG1vZHVsZSBmbGFnCisgICAgLy8vIHRvIGJlIHJlc3RyaWN0ZWQsIGFuZCB0aGUgc2Vjb25kIGVsZW1lbnQgb2YgdGhlIHBhaXIgaXMgdGhlIHZhbHVlIHRoZQorICAgIC8vLyBtb2R1bGUgZmxhZyBzaG91bGQgYmUgcmVzdHJpY3RlZCB0by4gVGhpcyBiZWhhdmlvciBjYW4gYmUgdXNlZCB0bworICAgIC8vLyByZXN0cmljdCB0aGUgYWxsb3dhYmxlIHJlc3VsdHMgKHZpYSB0cmlnZ2VyaW5nIG9mIGFuIGVycm9yKSBvZiBsaW5raW5nCisgICAgLy8vIElEcyB3aXRoIHRoZSAqKk92ZXJyaWRlKiogYmVoYXZpb3IuCisgICAgUmVxdWlyZSA9IDMsCisKKyAgICAvLy8gVXNlcyB0aGUgc3BlY2lmaWVkIHZhbHVlLCByZWdhcmRsZXNzIG9mIHRoZSBiZWhhdmlvciBvciB2YWx1ZSBvZiB0aGUKKyAgICAvLy8gb3RoZXIgbW9kdWxlLiBJZiBib3RoIG1vZHVsZXMgc3BlY2lmeSAqKk92ZXJyaWRlKiosIGJ1dCB0aGUgdmFsdWVzCisgICAgLy8vIGRpZmZlciwgYW4gZXJyb3Igd2lsbCBiZSBlbWl0dGVkLgorICAgIE92ZXJyaWRlID0gNCwKKworICAgIC8vLyBBcHBlbmRzIHRoZSB0d28gdmFsdWVzLCB3aGljaCBhcmUgcmVxdWlyZWQgdG8gYmUgbWV0YWRhdGEgbm9kZXMuCisgICAgQXBwZW5kID0gNSwKKworICAgIC8vLyBBcHBlbmRzIHRoZSB0d28gdmFsdWVzLCB3aGljaCBhcmUgcmVxdWlyZWQgdG8gYmUgbWV0YWRhdGEKKyAgICAvLy8gbm9kZXMuIEhvd2V2ZXIsIGR1cGxpY2F0ZSBlbnRyaWVzIGluIHRoZSBzZWNvbmQgbGlzdCBhcmUgZHJvcHBlZAorICAgIC8vLyBkdXJpbmcgdGhlIGFwcGVuZCBvcGVyYXRpb24uCisgICAgQXBwZW5kVW5pcXVlID0gNiwKKworICAgIC8vLyBUYWtlcyB0aGUgbWF4IG9mIHRoZSB0d28gdmFsdWVzLCB3aGljaCBhcmUgcmVxdWlyZWQgdG8gYmUgaW50ZWdlcnMuCisgICAgTWF4ID0gNywKKworICAgIC8vIE1hcmtlcnM6CisgICAgTW9kRmxhZ0JlaGF2aW9yRmlyc3RWYWwgPSBFcnJvciwKKyAgICBNb2RGbGFnQmVoYXZpb3JMYXN0VmFsID0gTWF4CisgIH07CisKKyAgLy8vIENoZWNrcyBpZiBNZXRhZGF0YSByZXByZXNlbnRzIGEgdmFsaWQgTW9kRmxhZ0JlaGF2aW9yLCBhbmQgc3RvcmVzIHRoZQorICAvLy8gY29udmVydGVkIHJlc3VsdCBpbiBNRkIuCisgIHN0YXRpYyBib29sIGlzVmFsaWRNb2RGbGFnQmVoYXZpb3IoTWV0YWRhdGEgKk1ELCBNb2RGbGFnQmVoYXZpb3IgJk1GQik7CisKKyAgc3RydWN0IE1vZHVsZUZsYWdFbnRyeSB7CisgICAgTW9kRmxhZ0JlaGF2aW9yIEJlaGF2aW9yOworICAgIE1EU3RyaW5nICpLZXk7CisgICAgTWV0YWRhdGEgKlZhbDsKKworICAgIE1vZHVsZUZsYWdFbnRyeShNb2RGbGFnQmVoYXZpb3IgQiwgTURTdHJpbmcgKkssIE1ldGFkYXRhICpWKQorICAgICAgICA6IEJlaGF2aW9yKEIpLCBLZXkoSyksIFZhbChWKSB7fQorICB9OworCisvLy8gQH0KKy8vLyBAbmFtZSBNZW1iZXIgVmFyaWFibGVzCisvLy8gQHsKK3ByaXZhdGU6CisgIExMVk1Db250ZXh0ICZDb250ZXh0OyAgICAgICAgICAgLy8vPCBUaGUgTExWTUNvbnRleHQgZnJvbSB3aGljaCB0eXBlcyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IGNvbnN0YW50cyBhcmUgYWxsb2NhdGVkLgorICBHbG9iYWxMaXN0VHlwZSBHbG9iYWxMaXN0OyAgICAgIC8vLzwgVGhlIEdsb2JhbCBWYXJpYWJsZXMgaW4gdGhlIG1vZHVsZQorICBGdW5jdGlvbkxpc3RUeXBlIEZ1bmN0aW9uTGlzdDsgIC8vLzwgVGhlIEZ1bmN0aW9ucyBpbiB0aGUgbW9kdWxlCisgIEFsaWFzTGlzdFR5cGUgQWxpYXNMaXN0OyAgICAgICAgLy8vPCBUaGUgQWxpYXNlcyBpbiB0aGUgbW9kdWxlCisgIElGdW5jTGlzdFR5cGUgSUZ1bmNMaXN0OyAgICAgICAgLy8vPCBUaGUgSUZ1bmNzIGluIHRoZSBtb2R1bGUKKyAgTmFtZWRNRExpc3RUeXBlIE5hbWVkTURMaXN0OyAgICAvLy88IFRoZSBuYW1lZCBtZXRhZGF0YSBpbiB0aGUgbW9kdWxlCisgIHN0ZDo6c3RyaW5nIEdsb2JhbFNjb3BlQXNtOyAgICAgLy8vPCBJbmxpbmUgQXNtIGF0IGdsb2JhbCBzY29wZS4KKyAgVmFsdWVTeW1ib2xUYWJsZSAqVmFsU3ltVGFiOyAgICAvLy88IFN5bWJvbCB0YWJsZSBmb3IgdmFsdWVzCisgIENvbWRhdFN5bVRhYlR5cGUgQ29tZGF0U3ltVGFiOyAgLy8vPCBTeW1ib2wgdGFibGUgZm9yIENPTURBVHMKKyAgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4KKyAgT3duZWRNZW1vcnlCdWZmZXI7ICAgICAgICAgICAgICAvLy88IE1lbW9yeSBidWZmZXIgZGlyZWN0bHkgb3duZWQgYnkgdGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgbW9kdWxlLCBmb3IgbGVnYWN5IGNsaWVudHMgb25seS4KKyAgc3RkOjp1bmlxdWVfcHRyPEdWTWF0ZXJpYWxpemVyPgorICBNYXRlcmlhbGl6ZXI7ICAgICAgICAgICAgICAgICAgIC8vLzwgVXNlZCB0byBtYXRlcmlhbGl6ZSBHbG9iYWxWYWx1ZXMKKyAgc3RkOjpzdHJpbmcgTW9kdWxlSUQ7ICAgICAgICAgICAvLy88IEh1bWFuIHJlYWRhYmxlIGlkZW50aWZpZXIgZm9yIHRoZSBtb2R1bGUKKyAgc3RkOjpzdHJpbmcgU291cmNlRmlsZU5hbWU7ICAgICAvLy88IE9yaWdpbmFsIHNvdXJjZSBmaWxlIG5hbWUgZm9yIG1vZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLy88IHJlY29yZGVkIGluIGJpdGNvZGUuCisgIHN0ZDo6c3RyaW5nIFRhcmdldFRyaXBsZTsgICAgICAgLy8vPCBQbGF0Zm9ybSB0YXJnZXQgdHJpcGxlIE1vZHVsZSBjb21waWxlZCBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vLzwgRm9ybWF0OiAoYXJjaCkoc3ViKS0odmVuZG9yKS0oc3lzMC0oYWJpKQorICB2b2lkICpOYW1lZE1EU3ltVGFiOyAgICAgICAgICAgIC8vLzwgTmFtZWRNRE5vZGUgbmFtZXMuCisgIERhdGFMYXlvdXQgREw7ICAgICAgICAgICAgICAgICAgLy8vPCBEYXRhTGF5b3V0IGFzc29jaWF0ZWQgd2l0aCB0aGUgbW9kdWxlCisKKyAgZnJpZW5kIGNsYXNzIENvbnN0YW50OworCisvLy8gQH0KKy8vLyBAbmFtZSBDb25zdHJ1Y3RvcnMKKy8vLyBAeworcHVibGljOgorICAvLy8gVGhlIE1vZHVsZSBjb25zdHJ1Y3Rvci4gTm90ZSB0aGF0IHRoZXJlIGlzIG5vIGRlZmF1bHQgY29uc3RydWN0b3IuIFlvdQorICAvLy8gbXVzdCBwcm92aWRlIGEgbmFtZSBmb3IgdGhlIG1vZHVsZSB1cG9uIGNvbnN0cnVjdGlvbi4KKyAgZXhwbGljaXQgTW9kdWxlKFN0cmluZ1JlZiBNb2R1bGVJRCwgTExWTUNvbnRleHQmIEMpOworICAvLy8gVGhlIG1vZHVsZSBkZXN0cnVjdG9yLiBUaGlzIHdpbGwgZHJvcEFsbFJlZmVyZW5jZXMuCisgIH5Nb2R1bGUoKTsKKworLy8vIEB9CisvLy8gQG5hbWUgTW9kdWxlIExldmVsIEFjY2Vzc29ycworLy8vIEB7CisKKyAgLy8vIEdldCB0aGUgbW9kdWxlIGlkZW50aWZpZXIgd2hpY2ggaXMsIGVzc2VudGlhbGx5LCB0aGUgbmFtZSBvZiB0aGUgbW9kdWxlLgorICAvLy8gQHJldHVybnMgdGhlIG1vZHVsZSBpZGVudGlmaWVyIGFzIGEgc3RyaW5nCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRNb2R1bGVJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gTW9kdWxlSUQ7IH0KKworICAvLy8gR2V0IHRoZSBtb2R1bGUncyBvcmlnaW5hbCBzb3VyY2UgZmlsZSBuYW1lLiBXaGVuIGNvbXBpbGluZyBmcm9tCisgIC8vLyBiaXRjb2RlLCB0aGlzIGlzIHRha2VuIGZyb20gYSBiaXRjb2RlIHJlY29yZCB3aGVyZSBpdCB3YXMgcmVjb3JkZWQuCisgIC8vLyBGb3Igb3RoZXIgY29tcGlsZXMgaXQgaXMgdGhlIHNhbWUgYXMgdGhlIE1vZHVsZUlELCB3aGljaCB3b3VsZAorICAvLy8gY29udGFpbiB0aGUgc291cmNlIGZpbGUgbmFtZS4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldFNvdXJjZUZpbGVOYW1lKCkgY29uc3QgeyByZXR1cm4gU291cmNlRmlsZU5hbWU7IH0KKworICAvLy8gXGJyaWVmIEdldCBhIHNob3J0ICJuYW1lIiBmb3IgdGhlIG1vZHVsZS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIG9yIGxvZ2dpbmcuIEl0IGlzIGVzc2VudGlhbGx5IGEgY29udmVuaWVuY2UKKyAgLy8vIHdyYXBwZXIgYXJvdW5kIGdldE1vZHVsZUlkZW50aWZpZXIoKS4KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBNb2R1bGVJRDsgfQorCisgIC8vLyBHZXQgdGhlIGRhdGEgbGF5b3V0IHN0cmluZyBmb3IgdGhlIG1vZHVsZSdzIHRhcmdldCBwbGF0Zm9ybS4gVGhpcyBpcworICAvLy8gZXF1aXZhbGVudCB0byBnZXREYXRhTGF5b3V0KCktPmdldFN0cmluZ1JlcHJlc2VudGF0aW9uKCkuCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXREYXRhTGF5b3V0U3RyKCkgY29uc3QgeworICAgIHJldHVybiBETC5nZXRTdHJpbmdSZXByZXNlbnRhdGlvbigpOworICB9CisKKyAgLy8vIEdldCB0aGUgZGF0YSBsYXlvdXQgZm9yIHRoZSBtb2R1bGUncyB0YXJnZXQgcGxhdGZvcm0uCisgIGNvbnN0IERhdGFMYXlvdXQgJmdldERhdGFMYXlvdXQoKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSB0YXJnZXQgdHJpcGxlIHdoaWNoIGlzIGEgc3RyaW5nIGRlc2NyaWJpbmcgdGhlIHRhcmdldCBob3N0LgorICAvLy8gQHJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgdGFyZ2V0IHRyaXBsZS4KKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldFRhcmdldFRyaXBsZSgpIGNvbnN0IHsgcmV0dXJuIFRhcmdldFRyaXBsZTsgfQorCisgIC8vLyBHZXQgdGhlIGdsb2JhbCBkYXRhIGNvbnRleHQuCisgIC8vLyBAcmV0dXJucyBMTFZNQ29udGV4dCAtIGEgY29udGFpbmVyIGZvciBMTFZNJ3MgZ2xvYmFsIGluZm9ybWF0aW9uCisgIExMVk1Db250ZXh0ICZnZXRDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gQ29udGV4dDsgfQorCisgIC8vLyBHZXQgYW55IG1vZHVsZS1zY29wZSBpbmxpbmUgYXNzZW1ibHkgYmxvY2tzLgorICAvLy8gQHJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUgbW9kdWxlLXNjb3BlIGlubGluZSBhc3NlbWJseSBibG9ja3MuCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRNb2R1bGVJbmxpbmVBc20oKSBjb25zdCB7IHJldHVybiBHbG9iYWxTY29wZUFzbTsgfQorCisgIC8vLyBHZXQgYSBSYW5kb21OdW1iZXJHZW5lcmF0b3Igc2FsdGVkIGZvciB1c2Ugd2l0aCB0aGlzIG1vZHVsZS4gVGhlCisgIC8vLyBSTkcgY2FuIGJlIHNlZWRlZCB2aWEgLXJuZy1zZWVkPTx1aW50NjQ+IGFuZCBpcyBzYWx0ZWQgd2l0aCB0aGUKKyAgLy8vIE1vZHVsZUlEIGFuZCB0aGUgcHJvdmlkZWQgcGFzcyBzYWx0LiBUaGUgcmV0dXJuZWQgUk5HIHNob3VsZCBub3QKKyAgLy8vIGJlIHNoYXJlZCBhY3Jvc3MgdGhyZWFkcyBvciBwYXNzZXMuCisgIC8vLworICAvLy8gQSB1bmlxdWUgUk5HIHBlciBwYXNzIGVuc3VyZXMgYSByZXByb2R1Y2libGUgcmFuZG9tIHN0cmVhbSBldmVuCisgIC8vLyB3aGVuIG90aGVyIHJhbmRvbW5lc3MgY29uc3VtaW5nIHBhc3NlcyBhcmUgYWRkZWQgb3IgcmVtb3ZlZC4gSW4KKyAgLy8vIGFkZGl0aW9uLCB0aGUgcmFuZG9tIHN0cmVhbSB3aWxsIGJlIHJlcHJvZHVjaWJsZSBhY3Jvc3MgTExWTQorICAvLy8gdmVyc2lvbnMgd2hlbiB0aGUgcGFzcyBkb2VzIG5vdCBjaGFuZ2UuCisgIHN0ZDo6dW5pcXVlX3B0cjxSYW5kb21OdW1iZXJHZW5lcmF0b3I+IGNyZWF0ZVJORyhjb25zdCBQYXNzKiBQKSBjb25zdDsKKworLy8vIEB9CisvLy8gQG5hbWUgTW9kdWxlIExldmVsIE11dGF0b3JzCisvLy8gQHsKKworICAvLy8gU2V0IHRoZSBtb2R1bGUgaWRlbnRpZmllci4KKyAgdm9pZCBzZXRNb2R1bGVJZGVudGlmaWVyKFN0cmluZ1JlZiBJRCkgeyBNb2R1bGVJRCA9IElEOyB9CisKKyAgLy8vIFNldCB0aGUgbW9kdWxlJ3Mgb3JpZ2luYWwgc291cmNlIGZpbGUgbmFtZS4KKyAgdm9pZCBzZXRTb3VyY2VGaWxlTmFtZShTdHJpbmdSZWYgTmFtZSkgeyBTb3VyY2VGaWxlTmFtZSA9IE5hbWU7IH0KKworICAvLy8gU2V0IHRoZSBkYXRhIGxheW91dAorICB2b2lkIHNldERhdGFMYXlvdXQoU3RyaW5nUmVmIERlc2MpOworICB2b2lkIHNldERhdGFMYXlvdXQoY29uc3QgRGF0YUxheW91dCAmT3RoZXIpOworCisgIC8vLyBTZXQgdGhlIHRhcmdldCB0cmlwbGUuCisgIHZvaWQgc2V0VGFyZ2V0VHJpcGxlKFN0cmluZ1JlZiBUKSB7IFRhcmdldFRyaXBsZSA9IFQ7IH0KKworICAvLy8gU2V0IHRoZSBtb2R1bGUtc2NvcGUgaW5saW5lIGFzc2VtYmx5IGJsb2Nrcy4KKyAgLy8vIEEgdHJhaWxpbmcgbmV3bGluZSBpcyBhZGRlZCBpZiB0aGUgaW5wdXQgZG9lc24ndCBoYXZlIG9uZS4KKyAgdm9pZCBzZXRNb2R1bGVJbmxpbmVBc20oU3RyaW5nUmVmIEFzbSkgeworICAgIEdsb2JhbFNjb3BlQXNtID0gQXNtOworICAgIGlmICghR2xvYmFsU2NvcGVBc20uZW1wdHkoKSAmJiBHbG9iYWxTY29wZUFzbS5iYWNrKCkgIT0gJ1xuJykKKyAgICAgIEdsb2JhbFNjb3BlQXNtICs9ICdcbic7CisgIH0KKworICAvLy8gQXBwZW5kIHRvIHRoZSBtb2R1bGUtc2NvcGUgaW5saW5lIGFzc2VtYmx5IGJsb2Nrcy4KKyAgLy8vIEEgdHJhaWxpbmcgbmV3bGluZSBpcyBhZGRlZCBpZiB0aGUgaW5wdXQgZG9lc24ndCBoYXZlIG9uZS4KKyAgdm9pZCBhcHBlbmRNb2R1bGVJbmxpbmVBc20oU3RyaW5nUmVmIEFzbSkgeworICAgIEdsb2JhbFNjb3BlQXNtICs9IEFzbTsKKyAgICBpZiAoIUdsb2JhbFNjb3BlQXNtLmVtcHR5KCkgJiYgR2xvYmFsU2NvcGVBc20uYmFjaygpICE9ICdcbicpCisgICAgICBHbG9iYWxTY29wZUFzbSArPSAnXG4nOworICB9CisKKy8vLyBAfQorLy8vIEBuYW1lIEdlbmVyaWMgVmFsdWUgQWNjZXNzb3JzCisvLy8gQHsKKworICAvLy8gUmV0dXJuIHRoZSBnbG9iYWwgdmFsdWUgaW4gdGhlIG1vZHVsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwgb2YKKyAgLy8vIGFyYml0cmFyeSB0eXBlLiBUaGlzIG1ldGhvZCByZXR1cm5zIG51bGwgaWYgYSBnbG9iYWwgd2l0aCB0aGUgc3BlY2lmaWVkCisgIC8vLyBuYW1lIGlzIG5vdCBmb3VuZC4KKyAgR2xvYmFsVmFsdWUgKmdldE5hbWVkVmFsdWUoU3RyaW5nUmVmIE5hbWUpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSB1bmlxdWUgbm9uLXplcm8gSUQgZm9yIHRoZSBzcGVjaWZpZWQgbWV0YWRhdGEga2luZC4gVGhpcyBJRCBpcworICAvLy8gdW5pcXVlZCBhY3Jvc3MgbW9kdWxlcyBpbiB0aGUgY3VycmVudCBMTFZNQ29udGV4dC4KKyAgdW5zaWduZWQgZ2V0TURLaW5kSUQoU3RyaW5nUmVmIE5hbWUpIGNvbnN0OworCisgIC8vLyBQb3B1bGF0ZSBjbGllbnQgc3VwcGxpZWQgU21hbGxWZWN0b3Igd2l0aCB0aGUgbmFtZSBmb3IgY3VzdG9tIG1ldGFkYXRhIElEcworICAvLy8gcmVnaXN0ZXJlZCBpbiB0aGlzIExMVk1Db250ZXh0LgorICB2b2lkIGdldE1ES2luZE5hbWVzKFNtYWxsVmVjdG9ySW1wbDxTdHJpbmdSZWY+ICZSZXN1bHQpIGNvbnN0OworCisgIC8vLyBQb3B1bGF0ZSBjbGllbnQgc3VwcGxpZWQgU21hbGxWZWN0b3Igd2l0aCB0aGUgYnVuZGxlIHRhZ3MgcmVnaXN0ZXJlZCBpbgorICAvLy8gdGhpcyBMTFZNQ29udGV4dC4gIFRoZSBidW5kbGUgdGFncyBhcmUgb3JkZXJlZCBieSBpbmNyZWFzaW5nIGJ1bmRsZSBJRHMuCisgIC8vLyBcc2VlIExMVk1Db250ZXh0OjpnZXRPcGVyYW5kQnVuZGxlVGFnSUQKKyAgdm9pZCBnZXRPcGVyYW5kQnVuZGxlVGFncyhTbWFsbFZlY3RvckltcGw8U3RyaW5nUmVmPiAmUmVzdWx0KSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLCBvciBudWxsIGlmIHRoZXJlIGlzIG5vbmUgYnkgdGhhdAorICAvLy8gbmFtZS4KKyAgU3RydWN0VHlwZSAqZ2V0VHlwZUJ5TmFtZShTdHJpbmdSZWYgTmFtZSkgY29uc3Q7CisKKyAgc3RkOjp2ZWN0b3I8U3RydWN0VHlwZSAqPiBnZXRJZGVudGlmaWVkU3RydWN0VHlwZXMoKSBjb25zdDsKKworLy8vIEB9CisvLy8gQG5hbWUgRnVuY3Rpb24gQWNjZXNzb3JzCisvLy8gQHsKKworICAvLy8gTG9vayB1cCB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGluIHRoZSBtb2R1bGUgc3ltYm9sIHRhYmxlLiBGb3VyCisgIC8vLyBwb3NzaWJpbGl0aWVzOgorICAvLy8gICAxLiBJZiBpdCBkb2VzIG5vdCBleGlzdCwgYWRkIGEgcHJvdG90eXBlIGZvciB0aGUgZnVuY3Rpb24gYW5kIHJldHVybiBpdC4KKyAgLy8vICAgMi4gSWYgaXQgZXhpc3RzLCBhbmQgaGFzIGEgbG9jYWwgbGlua2FnZSwgdGhlIGV4aXN0aW5nIGZ1bmN0aW9uIGlzCisgIC8vLyAgICAgIHJlbmFtZWQgYW5kIGEgbmV3IG9uZSBpcyBpbnNlcnRlZC4KKyAgLy8vICAgMy4gT3RoZXJ3aXNlLCBpZiB0aGUgZXhpc3RpbmcgZnVuY3Rpb24gaGFzIHRoZSBjb3JyZWN0IHByb3RvdHlwZSwgcmV0dXJuCisgIC8vLyAgICAgIHRoZSBleGlzdGluZyBmdW5jdGlvbi4KKyAgLy8vICAgNC4gRmluYWxseSwgdGhlIGZ1bmN0aW9uIGV4aXN0cyBidXQgaGFzIHRoZSB3cm9uZyBwcm90b3R5cGU6IHJldHVybiB0aGUKKyAgLy8vICAgICAgZnVuY3Rpb24gd2l0aCBhIGNvbnN0YW50ZXhwciBjYXN0IHRvIHRoZSByaWdodCBwcm90b3R5cGUuCisgIENvbnN0YW50ICpnZXRPckluc2VydEZ1bmN0aW9uKFN0cmluZ1JlZiBOYW1lLCBGdW5jdGlvblR5cGUgKlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUxpc3QgQXR0cmlidXRlTGlzdCk7CisKKyAgQ29uc3RhbnQgKmdldE9ySW5zZXJ0RnVuY3Rpb24oU3RyaW5nUmVmIE5hbWUsIEZ1bmN0aW9uVHlwZSAqVCk7CisKKyAgLy8vIExvb2sgdXAgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBpbiB0aGUgbW9kdWxlIHN5bWJvbCB0YWJsZS4gSWYgaXQgZG9lcyBub3QKKyAgLy8vIGV4aXN0LCBhZGQgYSBwcm90b3R5cGUgZm9yIHRoZSBmdW5jdGlvbiBhbmQgcmV0dXJuIGl0LiBUaGlzIGZ1bmN0aW9uCisgIC8vLyBndWFyYW50ZWVzIHRvIHJldHVybiBhIGNvbnN0YW50IG9mIHBvaW50ZXIgdG8gdGhlIHNwZWNpZmllZCBmdW5jdGlvbiB0eXBlCisgIC8vLyBvciBhIENvbnN0YW50RXhwciBCaXRDYXN0IG9mIHRoYXQgdHlwZSBpZiB0aGUgbmFtZWQgZnVuY3Rpb24gaGFzIGEKKyAgLy8vIGRpZmZlcmVudCB0eXBlLiBUaGlzIHZlcnNpb24gb2YgdGhlIG1ldGhvZCB0YWtlcyBhIGxpc3Qgb2YKKyAgLy8vIGZ1bmN0aW9uIGFyZ3VtZW50cywgd2hpY2ggbWFrZXMgaXQgZWFzaWVyIGZvciBjbGllbnRzIHRvIHVzZS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJnc1R5PgorICBDb25zdGFudCAqZ2V0T3JJbnNlcnRGdW5jdGlvbihTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXR0cmlidXRlTGlzdCBBdHRyaWJ1dGVMaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpSZXRUeSwgQXJnc1R5Li4uIEFyZ3MpCisgIHsKKyAgICBTbWFsbFZlY3RvcjxUeXBlKiwgc2l6ZW9mLi4uKEFyZ3NUeSk+IEFyZ1R5c3tBcmdzLi4ufTsKKyAgICByZXR1cm4gZ2V0T3JJbnNlcnRGdW5jdGlvbihOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uVHlwZTo6Z2V0KFJldFR5LCBBcmdUeXMsIGZhbHNlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVMaXN0KTsKKyAgfQorCisgIC8vLyBTYW1lIGFzIGFib3ZlLCBidXQgd2l0aG91dCB0aGUgYXR0cmlidXRlcy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUuLi4gQXJnc1R5PgorICBDb25zdGFudCAqZ2V0T3JJbnNlcnRGdW5jdGlvbihTdHJpbmdSZWYgTmFtZSwgVHlwZSAqUmV0VHksIEFyZ3NUeS4uLiBBcmdzKSB7CisgICAgcmV0dXJuIGdldE9ySW5zZXJ0RnVuY3Rpb24oTmFtZSwgQXR0cmlidXRlTGlzdHt9LCBSZXRUeSwgQXJncy4uLik7CisgIH0KKworICAvLy8gTG9vayB1cCB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIGluIHRoZSBtb2R1bGUgc3ltYm9sIHRhYmxlLiBJZiBpdCBkb2VzIG5vdAorICAvLy8gZXhpc3QsIHJldHVybiBudWxsLgorICBGdW5jdGlvbiAqZ2V0RnVuY3Rpb24oU3RyaW5nUmVmIE5hbWUpIGNvbnN0OworCisvLy8gQH0KKy8vLyBAbmFtZSBHbG9iYWwgVmFyaWFibGUgQWNjZXNzb3JzCisvLy8gQHsKKworICAvLy8gTG9vayB1cCB0aGUgc3BlY2lmaWVkIGdsb2JhbCB2YXJpYWJsZSBpbiB0aGUgbW9kdWxlIHN5bWJvbCB0YWJsZS4gSWYgaXQKKyAgLy8vIGRvZXMgbm90IGV4aXN0LCByZXR1cm4gbnVsbC4gSWYgQWxsb3dJbnRlcm5hbCBpcyBzZXQgdG8gdHJ1ZSwgdGhpcworICAvLy8gZnVuY3Rpb24gd2lsbCByZXR1cm4gdHlwZXMgdGhhdCBoYXZlIEludGVybmFsTGlua2FnZS4gQnkgZGVmYXVsdCwgdGhlc2UKKyAgLy8vIHR5cGVzIGFyZSBub3QgcmV0dXJuZWQuCisgIEdsb2JhbFZhcmlhYmxlICpnZXRHbG9iYWxWYXJpYWJsZShTdHJpbmdSZWYgTmFtZSkgY29uc3QgeworICAgIHJldHVybiBnZXRHbG9iYWxWYXJpYWJsZShOYW1lLCBmYWxzZSk7CisgIH0KKworICBHbG9iYWxWYXJpYWJsZSAqZ2V0R2xvYmFsVmFyaWFibGUoU3RyaW5nUmVmIE5hbWUsIGJvb2wgQWxsb3dJbnRlcm5hbCkgY29uc3Q7CisKKyAgR2xvYmFsVmFyaWFibGUgKmdldEdsb2JhbFZhcmlhYmxlKFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0ludGVybmFsID0gZmFsc2UpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgTW9kdWxlICo+KHRoaXMpLT5nZXRHbG9iYWxWYXJpYWJsZShOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93SW50ZXJuYWwpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgZ2xvYmFsIHZhcmlhYmxlIGluIHRoZSBtb2R1bGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIG9mCisgIC8vLyBhcmJpdHJhcnkgdHlwZS4gVGhpcyBtZXRob2QgcmV0dXJucyBudWxsIGlmIGEgZ2xvYmFsIHdpdGggdGhlIHNwZWNpZmllZAorICAvLy8gbmFtZSBpcyBub3QgZm91bmQuCisgIGNvbnN0IEdsb2JhbFZhcmlhYmxlICpnZXROYW1lZEdsb2JhbChTdHJpbmdSZWYgTmFtZSkgY29uc3QgeworICAgIHJldHVybiBnZXRHbG9iYWxWYXJpYWJsZShOYW1lLCB0cnVlKTsKKyAgfQorICBHbG9iYWxWYXJpYWJsZSAqZ2V0TmFtZWRHbG9iYWwoU3RyaW5nUmVmIE5hbWUpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxHbG9iYWxWYXJpYWJsZSAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgTW9kdWxlICo+KHRoaXMpLT5nZXROYW1lZEdsb2JhbChOYW1lKSk7CisgIH0KKworICAvLy8gTG9vayB1cCB0aGUgc3BlY2lmaWVkIGdsb2JhbCBpbiB0aGUgbW9kdWxlIHN5bWJvbCB0YWJsZS4KKyAgLy8vICAgMS4gSWYgaXQgZG9lcyBub3QgZXhpc3QsIGFkZCBhIGRlY2xhcmF0aW9uIG9mIHRoZSBnbG9iYWwgYW5kIHJldHVybiBpdC4KKyAgLy8vICAgMi4gRWxzZSwgdGhlIGdsb2JhbCBleGlzdHMgYnV0IGhhcyB0aGUgd3JvbmcgdHlwZTogcmV0dXJuIHRoZSBmdW5jdGlvbgorICAvLy8gICAgICB3aXRoIGEgY29uc3RhbnRleHByIGNhc3QgdG8gdGhlIHJpZ2h0IHR5cGUuCisgIC8vLyAgIDMuIEZpbmFsbHksIGlmIHRoZSBleGlzdGluZyBnbG9iYWwgaXMgdGhlIGNvcnJlY3QgZGVjbGFyYXRpb24sIHJldHVybgorICAvLy8gICAgICB0aGUgZXhpc3RpbmcgZ2xvYmFsLgorICBDb25zdGFudCAqZ2V0T3JJbnNlcnRHbG9iYWwoU3RyaW5nUmVmIE5hbWUsIFR5cGUgKlR5KTsKKworLy8vIEB9CisvLy8gQG5hbWUgR2xvYmFsIEFsaWFzIEFjY2Vzc29ycworLy8vIEB7CisKKyAgLy8vIFJldHVybiB0aGUgZ2xvYmFsIGFsaWFzIGluIHRoZSBtb2R1bGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIG9mCisgIC8vLyBhcmJpdHJhcnkgdHlwZS4gVGhpcyBtZXRob2QgcmV0dXJucyBudWxsIGlmIGEgZ2xvYmFsIHdpdGggdGhlIHNwZWNpZmllZAorICAvLy8gbmFtZSBpcyBub3QgZm91bmQuCisgIEdsb2JhbEFsaWFzICpnZXROYW1lZEFsaWFzKFN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKworLy8vIEB9CisvLy8gQG5hbWUgR2xvYmFsIElGdW5jIEFjY2Vzc29ycworLy8vIEB7CisKKyAgLy8vIFJldHVybiB0aGUgZ2xvYmFsIGlmdW5jIGluIHRoZSBtb2R1bGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUsIG9mCisgIC8vLyBhcmJpdHJhcnkgdHlwZS4gVGhpcyBtZXRob2QgcmV0dXJucyBudWxsIGlmIGEgZ2xvYmFsIHdpdGggdGhlIHNwZWNpZmllZAorICAvLy8gbmFtZSBpcyBub3QgZm91bmQuCisgIEdsb2JhbElGdW5jICpnZXROYW1lZElGdW5jKFN0cmluZ1JlZiBOYW1lKSBjb25zdDsKKworLy8vIEB9CisvLy8gQG5hbWUgTmFtZWQgTWV0YWRhdGEgQWNjZXNzb3JzCisvLy8gQHsKKworICAvLy8gUmV0dXJuIHRoZSBmaXJzdCBOYW1lZE1ETm9kZSBpbiB0aGUgbW9kdWxlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLiBUaGlzCisgIC8vLyBtZXRob2QgcmV0dXJucyBudWxsIGlmIGEgTmFtZWRNRE5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgbm90IGZvdW5kLgorICBOYW1lZE1ETm9kZSAqZ2V0TmFtZWRNZXRhZGF0YShjb25zdCBUd2luZSAmTmFtZSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgbmFtZWQgTUROb2RlIGluIHRoZSBtb2R1bGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIFRoaXMgbWV0aG9kCisgIC8vLyByZXR1cm5zIGEgbmV3IE5hbWVkTUROb2RlIGlmIGEgTmFtZWRNRE5vZGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUgaXMgbm90CisgIC8vLyBmb3VuZC4KKyAgTmFtZWRNRE5vZGUgKmdldE9ySW5zZXJ0TmFtZWRNZXRhZGF0YShTdHJpbmdSZWYgTmFtZSk7CisKKyAgLy8vIFJlbW92ZSB0aGUgZ2l2ZW4gTmFtZWRNRE5vZGUgZnJvbSB0aGlzIG1vZHVsZSBhbmQgZGVsZXRlIGl0LgorICB2b2lkIGVyYXNlTmFtZWRNZXRhZGF0YShOYW1lZE1ETm9kZSAqTk1EKTsKKworLy8vIEB9CisvLy8gQG5hbWUgQ29tZGF0IEFjY2Vzc29ycworLy8vIEB7CisKKyAgLy8vIFJldHVybiB0aGUgQ29tZGF0IGluIHRoZSBtb2R1bGUgd2l0aCB0aGUgc3BlY2lmaWVkIG5hbWUuIEl0IGlzIGNyZWF0ZWQKKyAgLy8vIGlmIGl0IGRpZG4ndCBhbHJlYWR5IGV4aXN0LgorICBDb21kYXQgKmdldE9ySW5zZXJ0Q29tZGF0KFN0cmluZ1JlZiBOYW1lKTsKKworLy8vIEB9CisvLy8gQG5hbWUgTW9kdWxlIEZsYWdzIEFjY2Vzc29ycworLy8vIEB7CisKKyAgLy8vIFJldHVybnMgdGhlIG1vZHVsZSBmbGFncyBpbiB0aGUgcHJvdmlkZWQgdmVjdG9yLgorICB2b2lkIGdldE1vZHVsZUZsYWdzTWV0YWRhdGEoU21hbGxWZWN0b3JJbXBsPE1vZHVsZUZsYWdFbnRyeT4gJkZsYWdzKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlIGlmIEtleSBhcHBlYXJzIGluIG1vZHVsZSBmbGFncywgb3RoZXJ3aXNlCisgIC8vLyByZXR1cm4gbnVsbC4KKyAgTWV0YWRhdGEgKmdldE1vZHVsZUZsYWcoU3RyaW5nUmVmIEtleSkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIE5hbWVkTUROb2RlIGluIHRoZSBtb2R1bGUgdGhhdCByZXByZXNlbnRzIG1vZHVsZS1sZXZlbCBmbGFncy4KKyAgLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCBpZiB0aGVyZSBhcmUgbm8gbW9kdWxlLWxldmVsIGZsYWdzLgorICBOYW1lZE1ETm9kZSAqZ2V0TW9kdWxlRmxhZ3NNZXRhZGF0YSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSBOYW1lZE1ETm9kZSBpbiB0aGUgbW9kdWxlIHRoYXQgcmVwcmVzZW50cyBtb2R1bGUtbGV2ZWwgZmxhZ3MuCisgIC8vLyBJZiBtb2R1bGUtbGV2ZWwgZmxhZ3MgYXJlbid0IGZvdW5kLCBpdCBjcmVhdGVzIHRoZSBuYW1lZCBtZXRhZGF0YSB0aGF0CisgIC8vLyBjb250YWlucyB0aGVtLgorICBOYW1lZE1ETm9kZSAqZ2V0T3JJbnNlcnRNb2R1bGVGbGFnc01ldGFkYXRhKCk7CisKKyAgLy8vIEFkZCBhIG1vZHVsZS1sZXZlbCBmbGFnIHRvIHRoZSBtb2R1bGUtbGV2ZWwgZmxhZ3MgbWV0YWRhdGEuIEl0IHdpbGwgY3JlYXRlCisgIC8vLyB0aGUgbW9kdWxlLWxldmVsIGZsYWdzIG5hbWVkIG1ldGFkYXRhIGlmIGl0IGRvZXNuJ3QgYWxyZWFkeSBleGlzdC4KKyAgdm9pZCBhZGRNb2R1bGVGbGFnKE1vZEZsYWdCZWhhdmlvciBCZWhhdmlvciwgU3RyaW5nUmVmIEtleSwgTWV0YWRhdGEgKlZhbCk7CisgIHZvaWQgYWRkTW9kdWxlRmxhZyhNb2RGbGFnQmVoYXZpb3IgQmVoYXZpb3IsIFN0cmluZ1JlZiBLZXksIENvbnN0YW50ICpWYWwpOworICB2b2lkIGFkZE1vZHVsZUZsYWcoTW9kRmxhZ0JlaGF2aW9yIEJlaGF2aW9yLCBTdHJpbmdSZWYgS2V5LCB1aW50MzJfdCBWYWwpOworICB2b2lkIGFkZE1vZHVsZUZsYWcoTUROb2RlICpOb2RlKTsKKworLy8vIEB9CisvLy8gQG5hbWUgTWF0ZXJpYWxpemF0aW9uCisvLy8gQHsKKworICAvLy8gU2V0cyB0aGUgR1ZNYXRlcmlhbGl6ZXIgdG8gR1ZNLiBUaGlzIG1vZHVsZSBtdXN0IG5vdCB5ZXQgaGF2ZSBhCisgIC8vLyBNYXRlcmlhbGl6ZXIuIFRvIHJlc2V0IHRoZSBtYXRlcmlhbGl6ZXIgZm9yIGEgbW9kdWxlIHRoYXQgYWxyZWFkeSBoYXMgb25lLAorICAvLy8gY2FsbCBtYXRlcmlhbGl6ZUFsbCBmaXJzdC4gRGVzdHJveWluZyB0aGlzIG1vZHVsZSB3aWxsIGRlc3Ryb3kKKyAgLy8vIGl0cyBtYXRlcmlhbGl6ZXIgd2l0aG91dCBtYXRlcmlhbGl6aW5nIGFueSBtb3JlIEdsb2JhbFZhbHVlcy4gV2l0aG91dAorICAvLy8gZGVzdHJveWluZyB0aGUgTW9kdWxlLCB0aGVyZSBpcyBubyB3YXkgdG8gZGV0YWNoIG9yIGRlc3Ryb3kgYSBtYXRlcmlhbGl6ZXIKKyAgLy8vIHdpdGhvdXQgbWF0ZXJpYWxpemluZyBhbGwgdGhlIEdWcyBpdCBjb250cm9scywgdG8gYXZvaWQgbGVhdmluZyBvcnBoYW4KKyAgLy8vIHVubWF0ZXJpYWxpemVkIEdWcy4KKyAgdm9pZCBzZXRNYXRlcmlhbGl6ZXIoR1ZNYXRlcmlhbGl6ZXIgKkdWTSk7CisgIC8vLyBSZXRyaWV2ZXMgdGhlIEdWTWF0ZXJpYWxpemVyLCBpZiBhbnksIGZvciB0aGlzIE1vZHVsZS4KKyAgR1ZNYXRlcmlhbGl6ZXIgKmdldE1hdGVyaWFsaXplcigpIGNvbnN0IHsgcmV0dXJuIE1hdGVyaWFsaXplci5nZXQoKTsgfQorICBib29sIGlzTWF0ZXJpYWxpemVkKCkgY29uc3QgeyByZXR1cm4gIWdldE1hdGVyaWFsaXplcigpOyB9CisKKyAgLy8vIE1ha2Ugc3VyZSB0aGUgR2xvYmFsVmFsdWUgaXMgZnVsbHkgcmVhZC4KKyAgbGx2bTo6RXJyb3IgbWF0ZXJpYWxpemUoR2xvYmFsVmFsdWUgKkdWKTsKKworICAvLy8gTWFrZSBzdXJlIGFsbCBHbG9iYWxWYWx1ZXMgaW4gdGhpcyBNb2R1bGUgYXJlIGZ1bGx5IHJlYWQgYW5kIGNsZWFyIHRoZQorICAvLy8gTWF0ZXJpYWxpemVyLgorICBsbHZtOjpFcnJvciBtYXRlcmlhbGl6ZUFsbCgpOworCisgIGxsdm06OkVycm9yIG1hdGVyaWFsaXplTWV0YWRhdGEoKTsKKworLy8vIEB9CisvLy8gQG5hbWUgRGlyZWN0IGFjY2VzcyB0byB0aGUgZ2xvYmFscyBsaXN0LCBmdW5jdGlvbnMgbGlzdCwgYW5kIHN5bWJvbCB0YWJsZQorLy8vIEB7CisKKyAgLy8vIEdldCB0aGUgTW9kdWxlJ3MgbGlzdCBvZiBnbG9iYWwgdmFyaWFibGVzIChjb25zdGFudCkuCisgIGNvbnN0IEdsb2JhbExpc3RUeXBlICAgJmdldEdsb2JhbExpc3QoKSBjb25zdCAgICAgICB7IHJldHVybiBHbG9iYWxMaXN0OyB9CisgIC8vLyBHZXQgdGhlIE1vZHVsZSdzIGxpc3Qgb2YgZ2xvYmFsIHZhcmlhYmxlcy4KKyAgR2xvYmFsTGlzdFR5cGUgICAgICAgICAmZ2V0R2xvYmFsTGlzdCgpICAgICAgICAgICAgIHsgcmV0dXJuIEdsb2JhbExpc3Q7IH0KKworICBzdGF0aWMgR2xvYmFsTGlzdFR5cGUgTW9kdWxlOjoqZ2V0U3VibGlzdEFjY2VzcyhHbG9iYWxWYXJpYWJsZSopIHsKKyAgICByZXR1cm4gJk1vZHVsZTo6R2xvYmFsTGlzdDsKKyAgfQorCisgIC8vLyBHZXQgdGhlIE1vZHVsZSdzIGxpc3Qgb2YgZnVuY3Rpb25zIChjb25zdGFudCkuCisgIGNvbnN0IEZ1bmN0aW9uTGlzdFR5cGUgJmdldEZ1bmN0aW9uTGlzdCgpIGNvbnN0ICAgICB7IHJldHVybiBGdW5jdGlvbkxpc3Q7IH0KKyAgLy8vIEdldCB0aGUgTW9kdWxlJ3MgbGlzdCBvZiBmdW5jdGlvbnMuCisgIEZ1bmN0aW9uTGlzdFR5cGUgICAgICAgJmdldEZ1bmN0aW9uTGlzdCgpICAgICAgICAgICB7IHJldHVybiBGdW5jdGlvbkxpc3Q7IH0KKyAgc3RhdGljIEZ1bmN0aW9uTGlzdFR5cGUgTW9kdWxlOjoqZ2V0U3VibGlzdEFjY2VzcyhGdW5jdGlvbiopIHsKKyAgICByZXR1cm4gJk1vZHVsZTo6RnVuY3Rpb25MaXN0OworICB9CisKKyAgLy8vIEdldCB0aGUgTW9kdWxlJ3MgbGlzdCBvZiBhbGlhc2VzIChjb25zdGFudCkuCisgIGNvbnN0IEFsaWFzTGlzdFR5cGUgICAgJmdldEFsaWFzTGlzdCgpIGNvbnN0ICAgICAgICB7IHJldHVybiBBbGlhc0xpc3Q7IH0KKyAgLy8vIEdldCB0aGUgTW9kdWxlJ3MgbGlzdCBvZiBhbGlhc2VzLgorICBBbGlhc0xpc3RUeXBlICAgICAgICAgICZnZXRBbGlhc0xpc3QoKSAgICAgICAgICAgICAgeyByZXR1cm4gQWxpYXNMaXN0OyB9CisKKyAgc3RhdGljIEFsaWFzTGlzdFR5cGUgTW9kdWxlOjoqZ2V0U3VibGlzdEFjY2VzcyhHbG9iYWxBbGlhcyopIHsKKyAgICByZXR1cm4gJk1vZHVsZTo6QWxpYXNMaXN0OworICB9CisKKyAgLy8vIEdldCB0aGUgTW9kdWxlJ3MgbGlzdCBvZiBpZnVuY3MgKGNvbnN0YW50KS4KKyAgY29uc3QgSUZ1bmNMaXN0VHlwZSAgICAmZ2V0SUZ1bmNMaXN0KCkgY29uc3QgICAgICAgIHsgcmV0dXJuIElGdW5jTGlzdDsgfQorICAvLy8gR2V0IHRoZSBNb2R1bGUncyBsaXN0IG9mIGlmdW5jcy4KKyAgSUZ1bmNMaXN0VHlwZSAgICAgICAgICAmZ2V0SUZ1bmNMaXN0KCkgICAgICAgICAgICAgIHsgcmV0dXJuIElGdW5jTGlzdDsgfQorCisgIHN0YXRpYyBJRnVuY0xpc3RUeXBlIE1vZHVsZTo6KmdldFN1Ymxpc3RBY2Nlc3MoR2xvYmFsSUZ1bmMqKSB7CisgICAgcmV0dXJuICZNb2R1bGU6OklGdW5jTGlzdDsKKyAgfQorCisgIC8vLyBHZXQgdGhlIE1vZHVsZSdzIGxpc3Qgb2YgbmFtZWQgbWV0YWRhdGEgKGNvbnN0YW50KS4KKyAgY29uc3QgTmFtZWRNRExpc3RUeXBlICAmZ2V0TmFtZWRNRExpc3QoKSBjb25zdCAgICAgIHsgcmV0dXJuIE5hbWVkTURMaXN0OyB9CisgIC8vLyBHZXQgdGhlIE1vZHVsZSdzIGxpc3Qgb2YgbmFtZWQgbWV0YWRhdGEuCisgIE5hbWVkTURMaXN0VHlwZSAgICAgICAgJmdldE5hbWVkTURMaXN0KCkgICAgICAgICAgICB7IHJldHVybiBOYW1lZE1ETGlzdDsgfQorCisgIHN0YXRpYyBOYW1lZE1ETGlzdFR5cGUgTW9kdWxlOjoqZ2V0U3VibGlzdEFjY2VzcyhOYW1lZE1ETm9kZSopIHsKKyAgICByZXR1cm4gJk1vZHVsZTo6TmFtZWRNRExpc3Q7CisgIH0KKworICAvLy8gR2V0IHRoZSBzeW1ib2wgdGFibGUgb2YgZ2xvYmFsIHZhcmlhYmxlIGFuZCBmdW5jdGlvbiBpZGVudGlmaWVycworICBjb25zdCBWYWx1ZVN5bWJvbFRhYmxlICZnZXRWYWx1ZVN5bWJvbFRhYmxlKCkgY29uc3QgeyByZXR1cm4gKlZhbFN5bVRhYjsgfQorICAvLy8gR2V0IHRoZSBNb2R1bGUncyBzeW1ib2wgdGFibGUgb2YgZ2xvYmFsIHZhcmlhYmxlIGFuZCBmdW5jdGlvbiBpZGVudGlmaWVycy4KKyAgVmFsdWVTeW1ib2xUYWJsZSAgICAgICAmZ2V0VmFsdWVTeW1ib2xUYWJsZSgpICAgICAgIHsgcmV0dXJuICpWYWxTeW1UYWI7IH0KKworICAvLy8gR2V0IHRoZSBNb2R1bGUncyBzeW1ib2wgdGFibGUgZm9yIENPTURBVHMgKGNvbnN0YW50KS4KKyAgY29uc3QgQ29tZGF0U3ltVGFiVHlwZSAmZ2V0Q29tZGF0U3ltYm9sVGFibGUoKSBjb25zdCB7IHJldHVybiBDb21kYXRTeW1UYWI7IH0KKyAgLy8vIEdldCB0aGUgTW9kdWxlJ3Mgc3ltYm9sIHRhYmxlIGZvciBDT01EQVRzLgorICBDb21kYXRTeW1UYWJUeXBlICZnZXRDb21kYXRTeW1ib2xUYWJsZSgpIHsgcmV0dXJuIENvbWRhdFN5bVRhYjsgfQorCisvLy8gQH0KKy8vLyBAbmFtZSBHbG9iYWwgVmFyaWFibGUgSXRlcmF0aW9uCisvLy8gQHsKKworICBnbG9iYWxfaXRlcmF0b3IgICAgICAgZ2xvYmFsX2JlZ2luKCkgICAgICAgeyByZXR1cm4gR2xvYmFsTGlzdC5iZWdpbigpOyB9CisgIGNvbnN0X2dsb2JhbF9pdGVyYXRvciBnbG9iYWxfYmVnaW4oKSBjb25zdCB7IHJldHVybiBHbG9iYWxMaXN0LmJlZ2luKCk7IH0KKyAgZ2xvYmFsX2l0ZXJhdG9yICAgICAgIGdsb2JhbF9lbmQgICgpICAgICAgIHsgcmV0dXJuIEdsb2JhbExpc3QuZW5kKCk7IH0KKyAgY29uc3RfZ2xvYmFsX2l0ZXJhdG9yIGdsb2JhbF9lbmQgICgpIGNvbnN0IHsgcmV0dXJuIEdsb2JhbExpc3QuZW5kKCk7IH0KKyAgYm9vbCAgICAgICAgICAgICAgICAgIGdsb2JhbF9lbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEdsb2JhbExpc3QuZW1wdHkoKTsgfQorCisgIGl0ZXJhdG9yX3JhbmdlPGdsb2JhbF9pdGVyYXRvcj4gZ2xvYmFscygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShnbG9iYWxfYmVnaW4oKSwgZ2xvYmFsX2VuZCgpKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTxjb25zdF9nbG9iYWxfaXRlcmF0b3I+IGdsb2JhbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoZ2xvYmFsX2JlZ2luKCksIGdsb2JhbF9lbmQoKSk7CisgIH0KKworLy8vIEB9CisvLy8gQG5hbWUgRnVuY3Rpb24gSXRlcmF0aW9uCisvLy8gQHsKKworICBpdGVyYXRvciAgICAgICAgICAgICAgICBiZWdpbigpICAgICAgIHsgcmV0dXJuIEZ1bmN0aW9uTGlzdC5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yICAgICAgICAgIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gRnVuY3Rpb25MaXN0LmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgICAgICAgICAgICAgICAgZW5kICAoKSAgICAgICB7IHJldHVybiBGdW5jdGlvbkxpc3QuZW5kKCk7ICAgfQorICBjb25zdF9pdGVyYXRvciAgICAgICAgICBlbmQgICgpIGNvbnN0IHsgcmV0dXJuIEZ1bmN0aW9uTGlzdC5lbmQoKTsgICB9CisgIHJldmVyc2VfaXRlcmF0b3IgICAgICAgIHJiZWdpbigpICAgICAgeyByZXR1cm4gRnVuY3Rpb25MaXN0LnJiZWdpbigpOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgIHJiZWdpbigpIGNvbnN0eyByZXR1cm4gRnVuY3Rpb25MaXN0LnJiZWdpbigpOyB9CisgIHJldmVyc2VfaXRlcmF0b3IgICAgICAgIHJlbmQoKSAgICAgICAgeyByZXR1cm4gRnVuY3Rpb25MaXN0LnJlbmQoKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yICByZW5kKCkgY29uc3QgIHsgcmV0dXJuIEZ1bmN0aW9uTGlzdC5yZW5kKCk7IH0KKyAgc2l6ZV90ICAgICAgICAgICAgICAgICAgc2l6ZSgpIGNvbnN0ICB7IHJldHVybiBGdW5jdGlvbkxpc3Quc2l6ZSgpOyB9CisgIGJvb2wgICAgICAgICAgICAgICAgICAgIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gRnVuY3Rpb25MaXN0LmVtcHR5KCk7IH0KKworICBpdGVyYXRvcl9yYW5nZTxpdGVyYXRvcj4gZnVuY3Rpb25zKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGJlZ2luKCksIGVuZCgpKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTxjb25zdF9pdGVyYXRvcj4gZnVuY3Rpb25zKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGJlZ2luKCksIGVuZCgpKTsKKyAgfQorCisvLy8gQH0KKy8vLyBAbmFtZSBBbGlhcyBJdGVyYXRpb24KKy8vLyBAeworCisgIGFsaWFzX2l0ZXJhdG9yICAgICAgIGFsaWFzX2JlZ2luKCkgICAgICAgICAgICB7IHJldHVybiBBbGlhc0xpc3QuYmVnaW4oKTsgfQorICBjb25zdF9hbGlhc19pdGVyYXRvciBhbGlhc19iZWdpbigpIGNvbnN0ICAgICAgeyByZXR1cm4gQWxpYXNMaXN0LmJlZ2luKCk7IH0KKyAgYWxpYXNfaXRlcmF0b3IgICAgICAgYWxpYXNfZW5kICAoKSAgICAgICAgICAgIHsgcmV0dXJuIEFsaWFzTGlzdC5lbmQoKTsgICB9CisgIGNvbnN0X2FsaWFzX2l0ZXJhdG9yIGFsaWFzX2VuZCAgKCkgY29uc3QgICAgICB7IHJldHVybiBBbGlhc0xpc3QuZW5kKCk7ICAgfQorICBzaXplX3QgICAgICAgICAgICAgICBhbGlhc19zaXplICgpIGNvbnN0ICAgICAgeyByZXR1cm4gQWxpYXNMaXN0LnNpemUoKTsgIH0KKyAgYm9vbCAgICAgICAgICAgICAgICAgYWxpYXNfZW1wdHkoKSBjb25zdCAgICAgIHsgcmV0dXJuIEFsaWFzTGlzdC5lbXB0eSgpOyB9CisKKyAgaXRlcmF0b3JfcmFuZ2U8YWxpYXNfaXRlcmF0b3I+IGFsaWFzZXMoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoYWxpYXNfYmVnaW4oKSwgYWxpYXNfZW5kKCkpOworICB9CisgIGl0ZXJhdG9yX3JhbmdlPGNvbnN0X2FsaWFzX2l0ZXJhdG9yPiBhbGlhc2VzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGFsaWFzX2JlZ2luKCksIGFsaWFzX2VuZCgpKTsKKyAgfQorCisvLy8gQH0KKy8vLyBAbmFtZSBJRnVuYyBJdGVyYXRpb24KKy8vLyBAeworCisgIGlmdW5jX2l0ZXJhdG9yICAgICAgIGlmdW5jX2JlZ2luKCkgICAgICAgICAgICB7IHJldHVybiBJRnVuY0xpc3QuYmVnaW4oKTsgfQorICBjb25zdF9pZnVuY19pdGVyYXRvciBpZnVuY19iZWdpbigpIGNvbnN0ICAgICAgeyByZXR1cm4gSUZ1bmNMaXN0LmJlZ2luKCk7IH0KKyAgaWZ1bmNfaXRlcmF0b3IgICAgICAgaWZ1bmNfZW5kICAoKSAgICAgICAgICAgIHsgcmV0dXJuIElGdW5jTGlzdC5lbmQoKTsgICB9CisgIGNvbnN0X2lmdW5jX2l0ZXJhdG9yIGlmdW5jX2VuZCAgKCkgY29uc3QgICAgICB7IHJldHVybiBJRnVuY0xpc3QuZW5kKCk7ICAgfQorICBzaXplX3QgICAgICAgICAgICAgICBpZnVuY19zaXplICgpIGNvbnN0ICAgICAgeyByZXR1cm4gSUZ1bmNMaXN0LnNpemUoKTsgIH0KKyAgYm9vbCAgICAgICAgICAgICAgICAgaWZ1bmNfZW1wdHkoKSBjb25zdCAgICAgIHsgcmV0dXJuIElGdW5jTGlzdC5lbXB0eSgpOyB9CisKKyAgaXRlcmF0b3JfcmFuZ2U8aWZ1bmNfaXRlcmF0b3I+IGlmdW5jcygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShpZnVuY19iZWdpbigpLCBpZnVuY19lbmQoKSk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3RfaWZ1bmNfaXRlcmF0b3I+IGlmdW5jcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShpZnVuY19iZWdpbigpLCBpZnVuY19lbmQoKSk7CisgIH0KKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIENvbnZlbmllbmNlIGl0ZXJhdG9ycworICAvLy8gQHsKKworICB1c2luZyBnbG9iYWxfb2JqZWN0X2l0ZXJhdG9yID0KKyAgICAgIGNvbmNhdF9pdGVyYXRvcjxHbG9iYWxPYmplY3QsIGl0ZXJhdG9yLCBnbG9iYWxfaXRlcmF0b3I+OworICB1c2luZyBjb25zdF9nbG9iYWxfb2JqZWN0X2l0ZXJhdG9yID0KKyAgICAgIGNvbmNhdF9pdGVyYXRvcjxjb25zdCBHbG9iYWxPYmplY3QsIGNvbnN0X2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2dsb2JhbF9pdGVyYXRvcj47CisKKyAgaXRlcmF0b3JfcmFuZ2U8Z2xvYmFsX29iamVjdF9pdGVyYXRvcj4gZ2xvYmFsX29iamVjdHMoKSB7CisgICAgcmV0dXJuIGNvbmNhdDxHbG9iYWxPYmplY3Q+KGZ1bmN0aW9ucygpLCBnbG9iYWxzKCkpOworICB9CisgIGl0ZXJhdG9yX3JhbmdlPGNvbnN0X2dsb2JhbF9vYmplY3RfaXRlcmF0b3I+IGdsb2JhbF9vYmplY3RzKCkgY29uc3QgeworICAgIHJldHVybiBjb25jYXQ8Y29uc3QgR2xvYmFsT2JqZWN0PihmdW5jdGlvbnMoKSwgZ2xvYmFscygpKTsKKyAgfQorCisgIGdsb2JhbF9vYmplY3RfaXRlcmF0b3IgZ2xvYmFsX29iamVjdF9iZWdpbigpIHsKKyAgICByZXR1cm4gZ2xvYmFsX29iamVjdHMoKS5iZWdpbigpOworICB9CisgIGdsb2JhbF9vYmplY3RfaXRlcmF0b3IgZ2xvYmFsX29iamVjdF9lbmQoKSB7IHJldHVybiBnbG9iYWxfb2JqZWN0cygpLmVuZCgpOyB9CisKKyAgY29uc3RfZ2xvYmFsX29iamVjdF9pdGVyYXRvciBnbG9iYWxfb2JqZWN0X2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBnbG9iYWxfb2JqZWN0cygpLmJlZ2luKCk7CisgIH0KKyAgY29uc3RfZ2xvYmFsX29iamVjdF9pdGVyYXRvciBnbG9iYWxfb2JqZWN0X2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2xvYmFsX29iamVjdHMoKS5lbmQoKTsKKyAgfQorCisgIHVzaW5nIGdsb2JhbF92YWx1ZV9pdGVyYXRvciA9CisgICAgICBjb25jYXRfaXRlcmF0b3I8R2xvYmFsVmFsdWUsIGl0ZXJhdG9yLCBnbG9iYWxfaXRlcmF0b3IsIGFsaWFzX2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgIGlmdW5jX2l0ZXJhdG9yPjsKKyAgdXNpbmcgY29uc3RfZ2xvYmFsX3ZhbHVlX2l0ZXJhdG9yID0KKyAgICAgIGNvbmNhdF9pdGVyYXRvcjxjb25zdCBHbG9iYWxWYWx1ZSwgY29uc3RfaXRlcmF0b3IsIGNvbnN0X2dsb2JhbF9pdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdF9hbGlhc19pdGVyYXRvciwgY29uc3RfaWZ1bmNfaXRlcmF0b3I+OworCisgIGl0ZXJhdG9yX3JhbmdlPGdsb2JhbF92YWx1ZV9pdGVyYXRvcj4gZ2xvYmFsX3ZhbHVlcygpIHsKKyAgICByZXR1cm4gY29uY2F0PEdsb2JhbFZhbHVlPihmdW5jdGlvbnMoKSwgZ2xvYmFscygpLCBhbGlhc2VzKCksIGlmdW5jcygpKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTxjb25zdF9nbG9iYWxfdmFsdWVfaXRlcmF0b3I+IGdsb2JhbF92YWx1ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbmNhdDxjb25zdCBHbG9iYWxWYWx1ZT4oZnVuY3Rpb25zKCksIGdsb2JhbHMoKSwgYWxpYXNlcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmdW5jcygpKTsKKyAgfQorCisgIGdsb2JhbF92YWx1ZV9pdGVyYXRvciBnbG9iYWxfdmFsdWVfYmVnaW4oKSB7IHJldHVybiBnbG9iYWxfdmFsdWVzKCkuYmVnaW4oKTsgfQorICBnbG9iYWxfdmFsdWVfaXRlcmF0b3IgZ2xvYmFsX3ZhbHVlX2VuZCgpIHsgcmV0dXJuIGdsb2JhbF92YWx1ZXMoKS5lbmQoKTsgfQorCisgIGNvbnN0X2dsb2JhbF92YWx1ZV9pdGVyYXRvciBnbG9iYWxfdmFsdWVfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGdsb2JhbF92YWx1ZXMoKS5iZWdpbigpOworICB9CisgIGNvbnN0X2dsb2JhbF92YWx1ZV9pdGVyYXRvciBnbG9iYWxfdmFsdWVfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBnbG9iYWxfdmFsdWVzKCkuZW5kKCk7CisgIH0KKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIE5hbWVkIE1ldGFkYXRhIEl0ZXJhdGlvbgorICAvLy8gQHsKKworICBuYW1lZF9tZXRhZGF0YV9pdGVyYXRvciBuYW1lZF9tZXRhZGF0YV9iZWdpbigpIHsgcmV0dXJuIE5hbWVkTURMaXN0LmJlZ2luKCk7IH0KKyAgY29uc3RfbmFtZWRfbWV0YWRhdGFfaXRlcmF0b3IgbmFtZWRfbWV0YWRhdGFfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIE5hbWVkTURMaXN0LmJlZ2luKCk7CisgIH0KKworICBuYW1lZF9tZXRhZGF0YV9pdGVyYXRvciBuYW1lZF9tZXRhZGF0YV9lbmQoKSB7IHJldHVybiBOYW1lZE1ETGlzdC5lbmQoKTsgfQorICBjb25zdF9uYW1lZF9tZXRhZGF0YV9pdGVyYXRvciBuYW1lZF9tZXRhZGF0YV9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIE5hbWVkTURMaXN0LmVuZCgpOworICB9CisKKyAgc2l6ZV90IG5hbWVkX21ldGFkYXRhX3NpemUoKSBjb25zdCB7IHJldHVybiBOYW1lZE1ETGlzdC5zaXplKCk7ICB9CisgIGJvb2wgbmFtZWRfbWV0YWRhdGFfZW1wdHkoKSBjb25zdCB7IHJldHVybiBOYW1lZE1ETGlzdC5lbXB0eSgpOyB9CisKKyAgaXRlcmF0b3JfcmFuZ2U8bmFtZWRfbWV0YWRhdGFfaXRlcmF0b3I+IG5hbWVkX21ldGFkYXRhKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKG5hbWVkX21ldGFkYXRhX2JlZ2luKCksIG5hbWVkX21ldGFkYXRhX2VuZCgpKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTxjb25zdF9uYW1lZF9tZXRhZGF0YV9pdGVyYXRvcj4gbmFtZWRfbWV0YWRhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UobmFtZWRfbWV0YWRhdGFfYmVnaW4oKSwgbmFtZWRfbWV0YWRhdGFfZW5kKCkpOworICB9CisKKyAgLy8vIEFuIGl0ZXJhdG9yIGZvciBESUNvbXBpbGVVbml0cyB0aGF0IHNraXBzIHRob3NlIG1hcmtlZCBOb0RlYnVnLgorICBjbGFzcyBkZWJ1Z19jb21waWxlX3VuaXRzX2l0ZXJhdG9yCisgICAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnLCBESUNvbXBpbGVVbml0ICo+IHsKKyAgICBOYW1lZE1ETm9kZSAqQ1VzOworICAgIHVuc2lnbmVkIElkeDsKKworICAgIHZvaWQgU2tpcE5vRGVidWdDVXMoKTsKKworICBwdWJsaWM6CisgICAgZXhwbGljaXQgZGVidWdfY29tcGlsZV91bml0c19pdGVyYXRvcihOYW1lZE1ETm9kZSAqQ1VzLCB1bnNpZ25lZCBJZHgpCisgICAgICAgIDogQ1VzKENVcyksIElkeChJZHgpIHsKKyAgICAgIFNraXBOb0RlYnVnQ1VzKCk7CisgICAgfQorCisgICAgZGVidWdfY29tcGlsZV91bml0c19pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsKKyAgICAgICsrSWR4OworICAgICAgU2tpcE5vRGVidWdDVXMoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICBkZWJ1Z19jb21waWxlX3VuaXRzX2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7CisgICAgICBkZWJ1Z19jb21waWxlX3VuaXRzX2l0ZXJhdG9yIFQoKnRoaXMpOworICAgICAgKytJZHg7CisgICAgICByZXR1cm4gVDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgZGVidWdfY29tcGlsZV91bml0c19pdGVyYXRvciAmSSkgY29uc3QgeworICAgICAgcmV0dXJuIElkeCA9PSBJLklkeDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgZGVidWdfY29tcGlsZV91bml0c19pdGVyYXRvciAmSSkgY29uc3QgeworICAgICAgcmV0dXJuIElkeCAhPSBJLklkeDsKKyAgICB9CisKKyAgICBESUNvbXBpbGVVbml0ICpvcGVyYXRvciooKSBjb25zdDsKKyAgICBESUNvbXBpbGVVbml0ICpvcGVyYXRvci0+KCkgY29uc3Q7CisgIH07CisKKyAgZGVidWdfY29tcGlsZV91bml0c19pdGVyYXRvciBkZWJ1Z19jb21waWxlX3VuaXRzX2JlZ2luKCkgY29uc3QgeworICAgIGF1dG8gKkNVcyA9IGdldE5hbWVkTWV0YWRhdGEoImxsdm0uZGJnLmN1Iik7CisgICAgcmV0dXJuIGRlYnVnX2NvbXBpbGVfdW5pdHNfaXRlcmF0b3IoQ1VzLCAwKTsKKyAgfQorCisgIGRlYnVnX2NvbXBpbGVfdW5pdHNfaXRlcmF0b3IgZGVidWdfY29tcGlsZV91bml0c19lbmQoKSBjb25zdCB7CisgICAgYXV0byAqQ1VzID0gZ2V0TmFtZWRNZXRhZGF0YSgibGx2bS5kYmcuY3UiKTsKKyAgICByZXR1cm4gZGVidWdfY29tcGlsZV91bml0c19pdGVyYXRvcihDVXMsIENVcyA/IENVcy0+Z2V0TnVtT3BlcmFuZHMoKSA6IDApOworICB9CisKKyAgLy8vIFJldHVybiBhbiBpdGVyYXRvciBmb3IgYWxsIERJQ29tcGlsZVVuaXRzIGxpc3RlZCBpbiB0aGlzIE1vZHVsZSdzCisgIC8vLyBsbHZtLmRiZy5jdSBuYW1lZCBtZXRhZGF0YSBub2RlIGFuZCBhcmVuJ3QgZXhwbGljaXRseSBtYXJrZWQgYXMKKyAgLy8vIE5vRGVidWcuCisgIGl0ZXJhdG9yX3JhbmdlPGRlYnVnX2NvbXBpbGVfdW5pdHNfaXRlcmF0b3I+IGRlYnVnX2NvbXBpbGVfdW5pdHMoKSBjb25zdCB7CisgICAgYXV0byAqQ1VzID0gZ2V0TmFtZWRNZXRhZGF0YSgibGx2bS5kYmcuY3UiKTsKKyAgICByZXR1cm4gbWFrZV9yYW5nZSgKKyAgICAgICAgZGVidWdfY29tcGlsZV91bml0c19pdGVyYXRvcihDVXMsIDApLAorICAgICAgICBkZWJ1Z19jb21waWxlX3VuaXRzX2l0ZXJhdG9yKENVcywgQ1VzID8gQ1VzLT5nZXROdW1PcGVyYW5kcygpIDogMCkpOworICB9CisvLy8gQH0KKworICAvLy8gRGVzdHJveSBDb25zdGFudEFycmF5cyBpbiBMTFZNQ29udGV4dCBpZiB0aGV5IGFyZSBub3QgdXNlZC4KKyAgLy8vIENvbnN0YW50QXJyYXlzIGNvbnN0cnVjdGVkIGR1cmluZyBsaW5raW5nIGNhbiBjYXVzZSBxdWFkcmF0aWMgbWVtb3J5CisgIC8vLyBleHBsb3Npb24uIFJlbGVhc2luZyBhbGwgdW51c2VkIGNvbnN0YW50cyBjYW4gY2F1c2UgYSAyMCUgTFRPIGNvbXBpbGUtdGltZQorICAvLy8gc2xvd2Rvd24gZm9yIGEgbGFyZ2UgYXBwbGljYXRpb24uCisgIC8vLworICAvLy8gTk9URTogQ29uc3RhbnRzIGFyZSBjdXJyZW50bHkgb3duZWQgYnkgTExWTUNvbnRleHQuIFRoaXMgY2FuIHRoZW4gb25seQorICAvLy8gYmUgY2FsbGVkIHdoZXJlIGFsbCB1c2VzIG9mIHRoZSBMTFZNQ29udGV4dCBhcmUgdW5kZXJzdG9vZC4KKyAgdm9pZCBkcm9wVHJpdmlhbGx5RGVhZENvbnN0YW50QXJyYXlzKCk7CisKKy8vLyBAbmFtZSBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgcHJpbnRpbmcgYW5kIGR1bXBpbmcgTW9kdWxlIG9iamVjdHMKKy8vLyBAeworCisgIC8vLyBQcmludCB0aGUgbW9kdWxlIHRvIGFuIG91dHB1dCBzdHJlYW0gd2l0aCBhbiBvcHRpb25hbAorICAvLy8gQXNzZW1ibHlBbm5vdGF0aW9uV3JpdGVyLiAgSWYgXGMgU2hvdWxkUHJlc2VydmVVc2VMaXN0T3JkZXIsIHRoZW4gaW5jbHVkZQorICAvLy8gdXNlbGlzdG9yZGVyIGRpcmVjdGl2ZXMgc28gdGhhdCB1c2UtbGlzdHMgY2FuIGJlIHJlY3JlYXRlZCB3aGVuIHJlYWRpbmcKKyAgLy8vIHRoZSBhc3NlbWJseS4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MsIEFzc2VtYmx5QW5ub3RhdGlvbldyaXRlciAqQUFXLAorICAgICAgICAgICAgIGJvb2wgU2hvdWxkUHJlc2VydmVVc2VMaXN0T3JkZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICBib29sIElzRm9yRGVidWcgPSBmYWxzZSkgY29uc3Q7CisKKyAgLy8vIER1bXAgdGhlIG1vZHVsZSB0byBzdGRlcnIgKGZvciBkZWJ1Z2dpbmcpLgorICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLy8gVGhpcyBmdW5jdGlvbiBjYXVzZXMgYWxsIHRoZSBzdWJpbnN0cnVjdGlvbnMgdG8gImxldCBnbyIgb2YgYWxsIHJlZmVyZW5jZXMKKyAgLy8vIHRoYXQgdGhleSBhcmUgbWFpbnRhaW5pbmcuICBUaGlzIGFsbG93cyBvbmUgdG8gJ2RlbGV0ZScgYSB3aG9sZSBjbGFzcyBhdAorICAvLy8gYSB0aW1lLCBldmVuIHRob3VnaCB0aGVyZSBtYXkgYmUgY2lyY3VsYXIgcmVmZXJlbmNlcy4uLiBmaXJzdCBhbGwKKyAgLy8vIHJlZmVyZW5jZXMgYXJlIGRyb3BwZWQsIGFuZCBhbGwgdXNlIGNvdW50cyBnbyB0byB6ZXJvLiAgVGhlbiBldmVyeXRoaW5nCisgIC8vLyBpcyBkZWxldGUnZCBmb3IgcmVhbC4gIE5vdGUgdGhhdCBubyBvcGVyYXRpb25zIGFyZSB2YWxpZCBvbiBhbiBvYmplY3QKKyAgLy8vIHRoYXQgaGFzICJkcm9wcGVkIGFsbCByZWZlcmVuY2VzIiwgZXhjZXB0IG9wZXJhdG9yIGRlbGV0ZS4KKyAgdm9pZCBkcm9wQWxsUmVmZXJlbmNlcygpOworCisvLy8gQH0KKy8vLyBAbmFtZSBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgcXVlcnlpbmcgRGVidWcgaW5mb3JtYXRpb24uCisvLy8gQHsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIE51bWJlciBvZiBSZWdpc3RlciBQYXJhbWV0ZXJzRHdhcmYgVmVyc2lvbiBieSBjaGVja2luZworICAvLy8gbW9kdWxlIGZsYWdzLgorICB1bnNpZ25lZCBnZXROdW1iZXJSZWdpc3RlclBhcmFtZXRlcnMoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIER3YXJmIFZlcnNpb24gYnkgY2hlY2tpbmcgbW9kdWxlIGZsYWdzLgorICB1bnNpZ25lZCBnZXREd2FyZlZlcnNpb24oKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIENvZGVWaWV3IFZlcnNpb24gYnkgY2hlY2tpbmcgbW9kdWxlIGZsYWdzLgorICAvLy8gUmV0dXJucyB6ZXJvIGlmIG5vdCBwcmVzZW50IGluIG1vZHVsZS4KKyAgdW5zaWduZWQgZ2V0Q29kZVZpZXdGbGFnKCkgY29uc3Q7CisKKy8vLyBAfQorLy8vIEBuYW1lIFV0aWxpdHkgZnVuY3Rpb25zIGZvciBxdWVyeWluZyBhbmQgc2V0dGluZyBQSUMgbGV2ZWwKKy8vLyBAeworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgUElDIGxldmVsIChzbWFsbCBvciBsYXJnZSBtb2RlbCkKKyAgUElDTGV2ZWw6OkxldmVsIGdldFBJQ0xldmVsKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIFBJQyBsZXZlbCAoc21hbGwgb3IgbGFyZ2UgbW9kZWwpCisgIHZvaWQgc2V0UElDTGV2ZWwoUElDTGV2ZWw6OkxldmVsIFBMKTsKKy8vLyBAfQorCisvLy8gQH0KKy8vLyBAbmFtZSBVdGlsaXR5IGZ1bmN0aW9ucyBmb3IgcXVlcnlpbmcgYW5kIHNldHRpbmcgUElFIGxldmVsCisvLy8gQHsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIFBJRSBsZXZlbCAoc21hbGwgb3IgbGFyZ2UgbW9kZWwpCisgIFBJRUxldmVsOjpMZXZlbCBnZXRQSUVMZXZlbCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBQSUUgbGV2ZWwgKHNtYWxsIG9yIGxhcmdlIG1vZGVsKQorICB2b2lkIHNldFBJRUxldmVsKFBJRUxldmVsOjpMZXZlbCBQTCk7CisvLy8gQH0KKworICAvLy8gQG5hbWUgVXRpbGl0eSBmdW5jdGlvbnMgZm9yIHF1ZXJ5aW5nIGFuZCBzZXR0aW5nIFBHTyBzdW1tYXJ5CisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgQXR0YWNoIHByb2ZpbGUgc3VtbWFyeSBtZXRhZGF0YSB0byB0aGlzIG1vZHVsZS4KKyAgdm9pZCBzZXRQcm9maWxlU3VtbWFyeShNZXRhZGF0YSAqTSk7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHByb2ZpbGUgc3VtbWFyeSBtZXRhZGF0YQorICBNZXRhZGF0YSAqZ2V0UHJvZmlsZVN1bW1hcnkoKTsKKyAgLy8vIEB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBQTFQgc2hvdWxkIGJlIGF2b2lkZWQgZm9yIFJUTGliIGNhbGxzLgorICBib29sIGdldFJ0TGliVXNlR09UKCkgY29uc3Q7CisKKyAgLy8vIFNldCB0aGF0IFBMVCBzaG91bGQgYmUgYXZvaWQgZm9yIFJUTGliIGNhbGxzLgorICB2b2lkIHNldFJ0TGliVXNlR09UKCk7CisKKworICAvLy8gVGFrZSBvd25lcnNoaXAgb2YgdGhlIGdpdmVuIG1lbW9yeSBidWZmZXIuCisgIHZvaWQgc2V0T3duZWRNZW1vcnlCdWZmZXIoc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gTUIpOworfTsKKworLy8vIFxicmllZiBHaXZlbiAibGx2bS51c2VkIiBvciAibGx2bS5jb21waWxlci51c2VkIiBhcyBhIGdsb2JhbCBuYW1lLCBjb2xsZWN0CisvLy8gdGhlIGluaXRpYWxpemVyIGVsZW1lbnRzIG9mIHRoYXQgZ2xvYmFsIGluIFNldCBhbmQgcmV0dXJuIHRoZSBnbG9iYWwgaXRzZWxmLgorR2xvYmFsVmFyaWFibGUgKmNvbGxlY3RVc2VkR2xvYmFsVmFyaWFibGVzKGNvbnN0IE1vZHVsZSAmTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFB0clNldEltcGw8R2xvYmFsVmFsdWUgKj4gJlNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIENvbXBpbGVyVXNlZCk7CisKKy8vLyBBbiByYXdfb3N0cmVhbSBpbnNlcnRlciBmb3IgbW9kdWxlcy4KK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmTywgY29uc3QgTW9kdWxlICZNKSB7CisgIE0ucHJpbnQoTywgbnVsbHB0cik7CisgIHJldHVybiBPOworfQorCisvLyBDcmVhdGUgd3JhcHBlcnMgZm9yIEMgQmluZGluZyB0eXBlcyAoc2VlIENCaW5kaW5nV3JhcHBpbmcuaCkuCitERUZJTkVfU0lNUExFX0NPTlZFUlNJT05fRlVOQ1RJT05TKE1vZHVsZSwgTExWTU1vZHVsZVJlZikKKworLyogTExWTU1vZHVsZVByb3ZpZGVyUmVmIGV4aXN0cyBmb3IgaGlzdG9yaWNhbCByZWFzb25zLCBidXQgbm93IGp1c3QgaG9sZHMgYQorICogTW9kdWxlLgorICovCitpbmxpbmUgTW9kdWxlICp1bndyYXAoTExWTU1vZHVsZVByb3ZpZGVyUmVmIE1QKSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PE1vZHVsZSo+KE1QKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfTU9EVUxFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTW9kdWxlU2xvdFRyYWNrZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTW9kdWxlU2xvdFRyYWNrZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjI2ZmJhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Nb2R1bGVTbG90VHJhY2tlci5oCkBAIC0wLDAgKzEsODAgQEAKKy8vPT09LS0gbGx2bS9JUi9Nb2R1bGVTbG90VHJhY2tlci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9NT0RVTEVTTE9UVFJBQ0tFUl9ICisjZGVmaW5lIExMVk1fSVJfTU9EVUxFU0xPVFRSQUNLRVJfSAorCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgU2xvdFRyYWNrZXI7CitjbGFzcyBWYWx1ZTsKKworLy8vIE1hbmFnZSBsaWZldGltZSBvZiBhIHNsb3QgdHJhY2tlciBmb3IgcHJpbnRpbmcgSVIuCisvLy8KKy8vLyBXcmFwcGVyIGFyb3VuZCB0aGUgXGEgU2xvdFRyYWNrZXIgdXNlZCBpbnRlcm5hbGx5IGJ5IFxhIEFzbVdyaXRlci4gIFRoaXMKKy8vLyBjbGFzcyBhbGxvd3MgY2FsbGVycyB0byBzaGFyZSB0aGUgY29zdCBvZiBpbmNvcnBvcmF0aW5nIHRoZSBtZXRhZGF0YSBpbiBhCisvLy8gbW9kdWxlIG9yIGEgZnVuY3Rpb24uCisvLy8KKy8vLyBJZiB0aGUgSVIgY2hhbmdlcyBmcm9tIHVuZGVybmVhdGggXGEgTW9kdWxlU2xvdFRyYWNrZXIsIHN0cmluZ3MgbGlrZQorLy8vICI8YmFkcmVmPiIgd2lsbCBiZSBwcmludGVkLCBvciwgd29yc2UsIHRoZSB3cm9uZyBzbG90cyBlbnRpcmVseS4KK2NsYXNzIE1vZHVsZVNsb3RUcmFja2VyIHsKKyAgLy8vIFN0b3JhZ2UgZm9yIGEgc2xvdCB0cmFja2VyLgorICBzdGQ6OnVuaXF1ZV9wdHI8U2xvdFRyYWNrZXI+IE1hY2hpbmVTdG9yYWdlOworICBib29sIFNob3VsZENyZWF0ZVN0b3JhZ2UgPSBmYWxzZTsKKyAgYm9vbCBTaG91bGRJbml0aWFsaXplQWxsTWV0YWRhdGEgPSBmYWxzZTsKKworICBjb25zdCBNb2R1bGUgKk0gPSBudWxscHRyOworICBjb25zdCBGdW5jdGlvbiAqRiA9IG51bGxwdHI7CisgIFNsb3RUcmFja2VyICpNYWNoaW5lID0gbnVsbHB0cjsKKworcHVibGljOgorICAvLy8gV3JhcCBhIHByZWluaXRpYWxpemVkIFNsb3RUcmFja2VyLgorICBNb2R1bGVTbG90VHJhY2tlcihTbG90VHJhY2tlciAmTWFjaGluZSwgY29uc3QgTW9kdWxlICpNLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbiAqRiA9IG51bGxwdHIpOworCisgIC8vLyBDb25zdHJ1Y3QgYSBzbG90IHRyYWNrZXIgZnJvbSBhIG1vZHVsZS4KKyAgLy8vCisgIC8vLyBJZiBcYSBNIGlzIFxjIG51bGxwdHIsIHVzZXMgYSBudWxsIHNsb3QgdHJhY2tlci4gIE90aGVyd2lzZSwgaW5pdGlhbGl6ZXMKKyAgLy8vIGEgc2xvdCB0cmFja2VyLCBhbmQgaW5pdGlhbGl6ZXMgYWxsIG1ldGFkYXRhIHNsb3RzLiAgXGMKKyAgLy8vIFNob3VsZEluaXRpYWxpemVBbGxNZXRhZGF0YSBkZWZhdWx0cyB0byB0cnVlIGJlY2F1c2UgdGhpcyBpcyBleHBlY3RlZCB0bworICAvLy8gYmUgc2hhcmVkIGJldHdlZW4gbXVsdGlwbGUgY2FsbGVycywgYW5kIG90aGVyd2lzZSBNRE5vZGUgcmVmZXJlbmNlcyB3aWxsCisgIC8vLyBub3QgbWF0Y2ggdXAuCisgIGV4cGxpY2l0IE1vZHVsZVNsb3RUcmFja2VyKGNvbnN0IE1vZHVsZSAqTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRJbml0aWFsaXplQWxsTWV0YWRhdGEgPSB0cnVlKTsKKworICAvLy8gRGVzdHJ1Y3RvciB0byBjbGVhbiB1cCBzdG9yYWdlLgorICB+TW9kdWxlU2xvdFRyYWNrZXIoKTsKKworICAvLy8gTGF6aWx5IGNyZWF0ZXMgYSBzbG90IHRyYWNrZXIuCisgIFNsb3RUcmFja2VyICpnZXRNYWNoaW5lKCk7CisKKyAgY29uc3QgTW9kdWxlICpnZXRNb2R1bGUoKSBjb25zdCB7IHJldHVybiBNOyB9CisgIGNvbnN0IEZ1bmN0aW9uICpnZXRDdXJyZW50RnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBGOyB9CisKKyAgLy8vIEluY29ycG9yYXRlIHRoZSBnaXZlbiBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBQdXJnZSB0aGUgY3VycmVudGx5IGluY29ycG9yYXRlZCBmdW5jdGlvbiBhbmQgaW5jb3Jwb3JhdGUgXGMgRi4gIElmIFxjIEYKKyAgLy8vIGlzIGN1cnJlbnRseSBpbmNvcnBvcmF0ZWQsIHRoaXMgaXMgYSBuby1vcC4KKyAgdm9pZCBpbmNvcnBvcmF0ZUZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uICZGKTsKKworICAvLy8gUmV0dXJuIHRoZSBzbG90IG51bWJlciBvZiB0aGUgc3BlY2lmaWVkIGxvY2FsIHZhbHVlLgorICAvLy8KKyAgLy8vIEEgZnVuY3Rpb24gdGhhdCBkZWZpbmVzIHRoaXMgdmFsdWUgc2hvdWxkIGJlIGluY29ycG9yYXRlZCBwcmlvciB0byBjYWxsaW5nCisgIC8vLyB0aGlzIG1ldGhvZC4KKyAgLy8vIFJldHVybiAtMSBpZiB0aGUgdmFsdWUgaXMgbm90IGluIHRoZSBmdW5jdGlvbidzIFNsb3RUcmFja2VyLgorICBpbnQgZ2V0TG9jYWxTbG90KGNvbnN0IFZhbHVlICpWKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Nb2R1bGVTdW1tYXJ5SW5kZXguaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTW9kdWxlU3VtbWFyeUluZGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVmOGNkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTW9kdWxlU3VtbWFyeUluZGV4LmgKQEAgLTAsMCArMSwxMTAwIEBACisvLz09PS0gbGx2bS9Nb2R1bGVTdW1tYXJ5SW5kZXguaCAtIE1vZHVsZSBTdW1tYXJ5IEluZGV4IC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBAZmlsZQorLy8vIE1vZHVsZVN1bW1hcnlJbmRleC5oIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIHRoZSBjbGFzc2VzIHRoYXQKKy8vLyAgaG9sZCB0aGUgbW9kdWxlIGluZGV4IGFuZCBzdW1tYXJ5IGZvciBmdW5jdGlvbiBpbXBvcnRpbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX01PRFVMRVNVTU1BUllJTkRFWF9ICisjZGVmaW5lIExMVk1fSVJfTU9EVUxFU1VNTUFSWUlOREVYX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NjYWxlZE51bWJlci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIHlhbWwgeworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IE1hcHBpbmdUcmFpdHM7CisKK30gLy8gZW5kIG5hbWVzcGFjZSB5YW1sCisKKy8vLyBcYnJpZWYgQ2xhc3MgdG8gYWNjdW11bGF0ZSBhbmQgaG9sZCBpbmZvcm1hdGlvbiBhYm91dCBhIGNhbGxlZS4KK3N0cnVjdCBDYWxsZWVJbmZvIHsKKyAgZW51bSBjbGFzcyBIb3RuZXNzVHlwZSA6IHVpbnQ4X3QgeworICAgIFVua25vd24gPSAwLAorICAgIENvbGQgPSAxLAorICAgIE5vbmUgPSAyLAorICAgIEhvdCA9IDMsCisgICAgQ3JpdGljYWwgPSA0CisgIH07CisKKyAgLy8gVGhlIHNpemUgb2YgdGhlIGJpdC1maWVsZCBtaWdodCBuZWVkIHRvIGJlIGFkanVzdGVkIGlmIG1vcmUgdmFsdWVzIGFyZQorICAvLyBhZGRlZCB0byBIb3RuZXNzVHlwZSBlbnVtLgorICB1aW50MzJfdCBIb3RuZXNzIDogMzsKKworICAvLy8gVGhlIHZhbHVlIHN0b3JlZCBpbiBSZWxCbG9ja0ZyZXEgaGFzIHRvIGJlIGludGVycHJldGVkIGFzIHRoZSBkaWdpdHMgb2YKKyAgLy8vIGEgc2NhbGVkIG51bWJlciB3aXRoIGEgc2NhbGUgb2YgXHAgLVNjYWxlU2hpZnQuCisgIHVpbnQzMl90IFJlbEJsb2NrRnJlcSA6IDI5OworICBzdGF0aWMgY29uc3RleHByIGludDMyX3QgU2NhbGVTaGlmdCA9IDg7CisgIHN0YXRpYyBjb25zdGV4cHIgdWludDY0X3QgTWF4UmVsQmxvY2tGcmVxID0gKDEgPDwgMjkpIC0gMTsKKworICBDYWxsZWVJbmZvKCkKKyAgICAgIDogSG90bmVzcyhzdGF0aWNfY2FzdDx1aW50MzJfdD4oSG90bmVzc1R5cGU6OlVua25vd24pKSwgUmVsQmxvY2tGcmVxKDApIHt9CisgIGV4cGxpY2l0IENhbGxlZUluZm8oSG90bmVzc1R5cGUgSG90bmVzcywgdWludDY0X3QgUmVsQkYpCisgICAgICA6IEhvdG5lc3Moc3RhdGljX2Nhc3Q8dWludDMyX3Q+KEhvdG5lc3MpKSwgUmVsQmxvY2tGcmVxKFJlbEJGKSB7fQorCisgIHZvaWQgdXBkYXRlSG90bmVzcyhjb25zdCBIb3RuZXNzVHlwZSBPdGhlckhvdG5lc3MpIHsKKyAgICBIb3RuZXNzID0gc3RkOjptYXgoSG90bmVzcywgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KE90aGVySG90bmVzcykpOworICB9CisKKyAgSG90bmVzc1R5cGUgZ2V0SG90bmVzcygpIGNvbnN0IHsgcmV0dXJuIEhvdG5lc3NUeXBlKEhvdG5lc3MpOyB9CisKKyAgLy8vIFVwZGF0ZSBccCBSZWxCbG9ja0ZyZXEgZnJvbSBccCBCbG9ja0ZyZXEgYW5kIFxwIEVudHJ5RnJlcQorICAvLy8KKyAgLy8vIEJsb2NrRnJlcSBpcyBkaXZpZGVkIGJ5IEVudHJ5RnJlcSBhbmQgYWRkZWQgdG8gUmVsQmxvY2tGcmVxLiBUbyByZXByZXNlbnQKKyAgLy8vIGZyYWN0aW9uYWwgdmFsdWVzLCB0aGUgcmVzdWx0IGlzIHJlcHJlc2VudGVkIGFzIGEgZml4ZWQgcG9pbnQgbnVtYmVyIHdpdGgKKyAgLy8vIHNjYWxlIG9mIC1TY2FsZVNoaWZ0LgorICB2b2lkIHVwZGF0ZVJlbEJsb2NrRnJlcSh1aW50NjRfdCBCbG9ja0ZyZXEsIHVpbnQ2NF90IEVudHJ5RnJlcSkgeworICAgIGlmIChFbnRyeUZyZXEgPT0gMCkKKyAgICAgIHJldHVybjsKKyAgICB1c2luZyBTY2FsZWQ2NCA9IFNjYWxlZE51bWJlcjx1aW50NjRfdD47CisgICAgU2NhbGVkNjQgVGVtcChCbG9ja0ZyZXEsIFNjYWxlU2hpZnQpOworICAgIFRlbXAgLz0gU2NhbGVkNjQ6OmdldChFbnRyeUZyZXEpOworCisgICAgdWludDY0X3QgU3VtID0KKyAgICAgICAgU2F0dXJhdGluZ0FkZDx1aW50NjRfdD4oVGVtcC50b0ludDx1aW50NjRfdD4oKSwgUmVsQmxvY2tGcmVxKTsKKyAgICBTdW0gPSBzdGQ6Om1pbihTdW0sIHVpbnQ2NF90KE1heFJlbEJsb2NrRnJlcSkpOworICAgIFJlbEJsb2NrRnJlcSA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihTdW0pOworICB9Cit9OworCitjbGFzcyBHbG9iYWxWYWx1ZVN1bW1hcnk7CisKK3VzaW5nIEdsb2JhbFZhbHVlU3VtbWFyeUxpc3QgPSBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8R2xvYmFsVmFsdWVTdW1tYXJ5Pj47CisKK3N0cnVjdCBHbG9iYWxWYWx1ZVN1bW1hcnlJbmZvIHsKKyAgdW5pb24gTmFtZU9yR1YgeworICAgIE5hbWVPckdWKGJvb2wgSXNBbmFseXNpcykgeworICAgICAgaWYgKElzQW5hbHlzaXMpCisgICAgICAgIEdWID0gbnVsbHB0cjsKKyAgICAgIGVsc2UKKyAgICAgICAgTmFtZSA9ICIiOworICAgIH0KKworICAgIC8vLyBUaGUgR2xvYmFsVmFsdWUgY29ycmVzcG9uZGluZyB0byB0aGlzIHN1bW1hcnkuIFRoaXMgaXMgb25seSB1c2VkIGluCisgICAgLy8vIHBlci1tb2R1bGUgc3VtbWFyaWVzLCB3aGVuIG1vZHVsZSBhbmFseXNpcyBpcyBiZWluZyBydW4uCisgICAgY29uc3QgR2xvYmFsVmFsdWUgKkdWOworCisgICAgLy8vIFN1bW1hcnkgc3RyaW5nIHJlcHJlc2VudGF0aW9uLiBUaGlzIFN0cmluZ1JlZiBwb2ludHMgdG8gQkMgbW9kdWxlCisgICAgLy8vIHN0cmluZyB0YWJsZSBhbmQgaXMgdmFsaWQgdW50aWwgbW9kdWxlIGRhdGEgaXMgc3RvcmVkIGluIG1lbW9yeS4KKyAgICAvLy8gVGhpcyBpcyBndWFyYW50ZWVkIHRvIGhhcHBlbiB1bnRpbCBydW5UaGluTFRPQmFja2VuZCBmdW5jdGlvbiBpcworICAgIC8vLyBjYWxsZWQsIHNvIGl0IGlzIHNhZmUgdG8gdXNlIHRoaXMgZmllbGQgZHVyaW5nIHRoaW4gbGluay4gVGhpcyBmaWVsZAorICAgIC8vLyBpcyBvbmx5IHZhbGlkIGlmIHN1bW1hcnkgaW5kZXggd2FzIGxvYWRlZCBmcm9tIEJDIGZpbGUuCisgICAgU3RyaW5nUmVmIE5hbWU7CisgIH0gVTsKKworICBHbG9iYWxWYWx1ZVN1bW1hcnlJbmZvKGJvb2wgSXNBbmFseXNpcykgOiBVKElzQW5hbHlzaXMpIHt9CisKKyAgLy8vIExpc3Qgb2YgZ2xvYmFsIHZhbHVlIHN1bW1hcnkgc3RydWN0dXJlcyBmb3IgYSBwYXJ0aWN1bGFyIHZhbHVlIGhlbGQKKyAgLy8vIGluIHRoZSBHbG9iYWxWYWx1ZU1hcC4gUmVxdWlyZXMgYSB2ZWN0b3IgaW4gdGhlIGNhc2Ugb2YgbXVsdGlwbGUKKyAgLy8vIENPTURBVCB2YWx1ZXMgb2YgdGhlIHNhbWUgbmFtZS4KKyAgR2xvYmFsVmFsdWVTdW1tYXJ5TGlzdCBTdW1tYXJ5TGlzdDsKK307CisKKy8vLyBNYXAgZnJvbSBnbG9iYWwgdmFsdWUgR1VJRCB0byBjb3JyZXNwb25kaW5nIHN1bW1hcnkgc3RydWN0dXJlcy4gVXNlIGEKKy8vLyBzdGQ6Om1hcCByYXRoZXIgdGhhbiBhIERlbnNlTWFwIHNvIHRoYXQgcG9pbnRlcnMgdG8gdGhlIG1hcCdzIHZhbHVlX3R5cGUKKy8vLyAod2hpY2ggYXJlIHVzZWQgYnkgVmFsdWVJbmZvKSBhcmUgbm90IGludmFsaWRhdGVkIGJ5IGluc2VydGlvbi4gQWxzbyBpdCB3aWxsCisvLy8gbGlrZWx5IGluY3VyIGxlc3Mgb3ZlcmhlYWQsIGFzIHRoZSB2YWx1ZSB0eXBlIGlzIG5vdCB2ZXJ5IHNtYWxsIGFuZCB0aGUgc2l6ZQorLy8vIG9mIHRoZSBtYXAgaXMgdW5rbm93biwgcmVzdWx0aW5nIGluIGluZWZmaWNpZW5jaWVzIGR1ZSB0byByZXBlYXRlZAorLy8vIGluc2VydGlvbnMgYW5kIHJlc2l6aW5nLgordXNpbmcgR2xvYmFsVmFsdWVTdW1tYXJ5TWFwVHkgPQorICAgIHN0ZDo6bWFwPEdsb2JhbFZhbHVlOjpHVUlELCBHbG9iYWxWYWx1ZVN1bW1hcnlJbmZvPjsKKworLy8vIFN0cnVjdCB0aGF0IGhvbGRzIGEgcmVmZXJlbmNlIHRvIGEgcGFydGljdWxhciBHVUlEIGluIGEgZ2xvYmFsIHZhbHVlCisvLy8gc3VtbWFyeS4KK3N0cnVjdCBWYWx1ZUluZm8geworICBQb2ludGVySW50UGFpcjxjb25zdCBHbG9iYWxWYWx1ZVN1bW1hcnlNYXBUeTo6dmFsdWVfdHlwZSAqLCAxLCBib29sPgorICAgICAgUmVmQW5kRmxhZzsKKworICBWYWx1ZUluZm8oKSA9IGRlZmF1bHQ7CisgIFZhbHVlSW5mbyhib29sIElzQW5hbHlzaXMsIGNvbnN0IEdsb2JhbFZhbHVlU3VtbWFyeU1hcFR5Ojp2YWx1ZV90eXBlICpSKSB7CisgICAgUmVmQW5kRmxhZy5zZXRQb2ludGVyKFIpOworICAgIFJlZkFuZEZsYWcuc2V0SW50KElzQW5hbHlzaXMpOworICB9CisKKyAgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIGdldFJlZigpOyB9CisKKyAgR2xvYmFsVmFsdWU6OkdVSUQgZ2V0R1VJRCgpIGNvbnN0IHsgcmV0dXJuIGdldFJlZigpLT5maXJzdDsgfQorICBjb25zdCBHbG9iYWxWYWx1ZSAqZ2V0VmFsdWUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzRnJvbUFuYWx5c2lzKCkpOworICAgIHJldHVybiBnZXRSZWYoKS0+c2Vjb25kLlUuR1Y7CisgIH0KKworICBBcnJheVJlZjxzdGQ6OnVuaXF1ZV9wdHI8R2xvYmFsVmFsdWVTdW1tYXJ5Pj4gZ2V0U3VtbWFyeUxpc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFJlZigpLT5zZWNvbmQuU3VtbWFyeUxpc3Q7CisgIH0KKworICBTdHJpbmdSZWYgbmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNGcm9tQW5hbHlzaXMoKSA/IGdldFJlZigpLT5zZWNvbmQuVS5HVi0+Z2V0TmFtZSgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBnZXRSZWYoKS0+c2Vjb25kLlUuTmFtZTsKKyAgfQorCisgIGJvb2wgaXNGcm9tQW5hbHlzaXMoKSBjb25zdCB7IHJldHVybiBSZWZBbmRGbGFnLmdldEludCgpOyB9CisKKyAgY29uc3QgR2xvYmFsVmFsdWVTdW1tYXJ5TWFwVHk6OnZhbHVlX3R5cGUgKmdldFJlZigpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVmQW5kRmxhZy5nZXRQb2ludGVyKCk7CisgIH0KKworICBib29sIGlzRFNPTG9jYWwoKSBjb25zdDsKK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgVmFsdWVJbmZvICZBLCBjb25zdCBWYWx1ZUluZm8gJkIpIHsKKyAgYXNzZXJ0KEEuZ2V0UmVmKCkgJiYgQi5nZXRSZWYoKSAmJgorICAgICAgICAgIk5lZWQgVmFsdWVJbmZvIHdpdGggbm9uLW51bGwgUmVmIHRvIGNvbXBhcmUgR1VJRHMiKTsKKyAgcmV0dXJuIEEuZ2V0UmVmKCkgPT0gQi5nZXRSZWYoKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBWYWx1ZUluZm8gJkEsIGNvbnN0IFZhbHVlSW5mbyAmQikgeworICBhc3NlcnQoQS5nZXRSZWYoKSAmJiBCLmdldFJlZigpICYmCisgICAgICAgICAiTmVlZCBWYWx1ZUluZm8gd2l0aCBub24tbnVsbCBSZWYgdG8gY29tcGFyZSBHVUlEcyIpOworICByZXR1cm4gQS5nZXRHVUlEKCkgIT0gQi5nZXRHVUlEKCk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBWYWx1ZUluZm8gJkEsIGNvbnN0IFZhbHVlSW5mbyAmQikgeworICBhc3NlcnQoQS5nZXRSZWYoKSAmJiBCLmdldFJlZigpICYmCisgICAgICAgICAiTmVlZCBWYWx1ZUluZm8gd2l0aCBub24tbnVsbCBSZWYgdG8gY29tcGFyZSBHVUlEcyIpOworICByZXR1cm4gQS5nZXRHVUlEKCkgPCBCLmdldEdVSUQoKTsKK30KKwordGVtcGxhdGUgPD4gc3RydWN0IERlbnNlTWFwSW5mbzxWYWx1ZUluZm8+IHsKKyAgc3RhdGljIGlubGluZSBWYWx1ZUluZm8gZ2V0RW1wdHlLZXkoKSB7CisgICAgcmV0dXJuIFZhbHVlSW5mbyhmYWxzZSwgKEdsb2JhbFZhbHVlU3VtbWFyeU1hcFR5Ojp2YWx1ZV90eXBlICopLTgpOworICB9CisKKyAgc3RhdGljIGlubGluZSBWYWx1ZUluZm8gZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiBWYWx1ZUluZm8oZmFsc2UsIChHbG9iYWxWYWx1ZVN1bW1hcnlNYXBUeTo6dmFsdWVfdHlwZSAqKS0xNik7CisgIH0KKworICBzdGF0aWMgaW5saW5lIGJvb2wgaXNTcGVjaWFsS2V5KFZhbHVlSW5mbyBWKSB7CisgICAgcmV0dXJuIFYgPT0gZ2V0VG9tYnN0b25lS2V5KCkgfHwgViA9PSBnZXRFbXB0eUtleSgpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChWYWx1ZUluZm8gTCwgVmFsdWVJbmZvIFIpIHsKKyAgICAvLyBXZSBhcmUgbm90IHN1cHBvc2VkIHRvIG1peCBWYWx1ZUluZm8ocykgd2l0aCBkaWZmZXJlbnQgYW5hbHlzaXMgZmxhZworICAgIC8vIGluIGEgc2FtZSBjb250YWluZXIuCisgICAgYXNzZXJ0KGlzU3BlY2lhbEtleShMKSB8fCBpc1NwZWNpYWxLZXkoUikgfHwKKyAgICAgICAgICAgKEwuaXNGcm9tQW5hbHlzaXMoKSA9PSBSLmlzRnJvbUFuYWx5c2lzKCkpKTsKKyAgICByZXR1cm4gTC5nZXRSZWYoKSA9PSBSLmdldFJlZigpOworICB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoVmFsdWVJbmZvIEkpIHsgcmV0dXJuICh1aW50cHRyX3QpSS5nZXRSZWYoKTsgfQorfTsKKworLy8vIFxicmllZiBGdW5jdGlvbiBhbmQgdmFyaWFibGUgc3VtbWFyeSBpbmZvcm1hdGlvbiB0byBhaWQgZGVjaXNpb25zIGFuZAorLy8vIGltcGxlbWVudGF0aW9uIG9mIGltcG9ydGluZy4KK2NsYXNzIEdsb2JhbFZhbHVlU3VtbWFyeSB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgU3VidWJjbGFzcyBkaXNjcmltaW5hdG9yIChmb3IgZHluX2Nhc3Q8PiBldCBhbC4pCisgIGVudW0gU3VtbWFyeUtpbmQgOiB1bnNpZ25lZCB7IEFsaWFzS2luZCwgRnVuY3Rpb25LaW5kLCBHbG9iYWxWYXJLaW5kIH07CisKKyAgLy8vIEdyb3VwIGZsYWdzIChMaW5rYWdlLCBOb3RFbGlnaWJsZVRvSW1wb3J0LCBldGMuKSBhcyBhIGJpdGZpZWxkLgorICBzdHJ1Y3QgR1ZGbGFncyB7CisgICAgLy8vIFxicmllZiBUaGUgbGlua2FnZSB0eXBlIG9mIHRoZSBhc3NvY2lhdGVkIGdsb2JhbCB2YWx1ZS4KKyAgICAvLy8KKyAgICAvLy8gT25lIHVzZSBpcyB0byBmbGFnIHZhbHVlcyB0aGF0IGhhdmUgbG9jYWwgbGlua2FnZSB0eXBlcyBhbmQgbmVlZCB0bworICAgIC8vLyBoYXZlIG1vZHVsZSBpZGVudGlmaWVyIGFwcGVuZGVkIGJlZm9yZSBwbGFjaW5nIGludG8gdGhlIGNvbWJpbmVkCisgICAgLy8vIGluZGV4LCB0byBkaXNhbWJpZ3VhdGUgZnJvbSBvdGhlciB2YWx1ZXMgd2l0aCB0aGUgc2FtZSBuYW1lLgorICAgIC8vLyBJbiB0aGUgZnV0dXJlIHRoaXMgd2lsbCBiZSB1c2VkIHRvIHVwZGF0ZSBhbmQgb3B0aW1pemUgbGlua2FnZQorICAgIC8vLyB0eXBlcyBiYXNlZCBvbiBnbG9iYWwgc3VtbWFyeS1iYXNlZCBhbmFseXNpcy4KKyAgICB1bnNpZ25lZCBMaW5rYWdlIDogNDsKKworICAgIC8vLyBJbmRpY2F0ZSBpZiB0aGUgZ2xvYmFsIHZhbHVlIGNhbm5vdCBiZSBpbXBvcnRlZCAoZS5nLiBpdCBjYW5ub3QKKyAgICAvLy8gYmUgcmVuYW1lZCBvciByZWZlcmVuY2VzIHNvbWV0aGluZyB0aGF0IGNhbid0IGJlIHJlbmFtZWQpLgorICAgIHVuc2lnbmVkIE5vdEVsaWdpYmxlVG9JbXBvcnQgOiAxOworCisgICAgLy8vIEluIHBlci1tb2R1bGUgc3VtbWFyeSwgaW5kaWNhdGUgdGhhdCB0aGUgZ2xvYmFsIHZhbHVlIG11c3QgYmUgY29uc2lkZXJlZAorICAgIC8vLyBhIGxpdmUgcm9vdCBmb3IgaW5kZXgtYmFzZWQgbGl2ZW5lc3MgYW5hbHlzaXMuIFVzZWQgZm9yIHNwZWNpYWwgTExWTQorICAgIC8vLyB2YWx1ZXMgc3VjaCBhcyBsbHZtLmdsb2JhbF9jdG9ycyB0aGF0IHRoZSBsaW5rZXIgZG9lcyBub3Qga25vdyBhYm91dC4KKyAgICAvLy8KKyAgICAvLy8gSW4gY29tYmluZWQgc3VtbWFyeSwgaW5kaWNhdGUgdGhhdCB0aGUgZ2xvYmFsIHZhbHVlIGlzIGxpdmUuCisgICAgdW5zaWduZWQgTGl2ZSA6IDE7CisKKyAgICAvLy8gSW5kaWNhdGVzIHRoYXQgdGhlIGxpbmtlciByZXNvbHZlZCB0aGUgc3ltYm9sIHRvIGEgZGVmaW5pdGlvbiBmcm9tCisgICAgLy8vIHdpdGhpbiB0aGUgc2FtZSBsaW5rYWdlIHVuaXQuCisgICAgdW5zaWduZWQgRFNPTG9jYWwgOiAxOworCisgICAgLy8vIENvbnZlbmllbmNlIENvbnN0cnVjdG9ycworICAgIGV4cGxpY2l0IEdWRmxhZ3MoR2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcyBMaW5rYWdlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBOb3RFbGlnaWJsZVRvSW1wb3J0LCBib29sIExpdmUsIGJvb2wgSXNMb2NhbCkKKyAgICAgICAgOiBMaW5rYWdlKExpbmthZ2UpLCBOb3RFbGlnaWJsZVRvSW1wb3J0KE5vdEVsaWdpYmxlVG9JbXBvcnQpLAorICAgICAgICAgIExpdmUoTGl2ZSksIERTT0xvY2FsKElzTG9jYWwpIHt9CisgIH07CisKK3ByaXZhdGU6CisgIC8vLyBLaW5kIG9mIHN1bW1hcnkgZm9yIHVzZSBpbiBkeW5fY2FzdDw+IGV0IGFsLgorICBTdW1tYXJ5S2luZCBLaW5kOworCisgIEdWRmxhZ3MgRmxhZ3M7CisKKyAgLy8vIFRoaXMgaXMgdGhlIGhhc2ggb2YgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCBpbiB0aGUgb3JpZ2luYWwgZmlsZS4gSXQgaXMKKyAgLy8vIGlkZW50aWNhbCB0byB0aGUgR1VJRCBmb3IgZ2xvYmFsIHN5bWJvbHMsIGJ1dCBkaWZmZXJzIGZvciBsb2NhbCBzaW5jZSB0aGUKKyAgLy8vIEdVSUQgaW5jbHVkZXMgdGhlIG1vZHVsZSBsZXZlbCBpZCBpbiB0aGUgaGFzaC4KKyAgR2xvYmFsVmFsdWU6OkdVSUQgT3JpZ2luYWxOYW1lID0gMDsKKworICAvLy8gXGJyaWVmIFBhdGggb2YgbW9kdWxlIElSIGNvbnRhaW5pbmcgdmFsdWUncyBkZWZpbml0aW9uLCB1c2VkIHRvIGxvY2F0ZQorICAvLy8gbW9kdWxlIGR1cmluZyBpbXBvcnRpbmcuCisgIC8vLworICAvLy8gVGhpcyBpcyBvbmx5IHVzZWQgZHVyaW5nIHBhcnNpbmcgb2YgdGhlIGNvbWJpbmVkIGluZGV4LCBvciB3aGVuCisgIC8vLyBwYXJzaW5nIHRoZSBwZXItbW9kdWxlIGluZGV4IGZvciBjcmVhdGlvbiBvZiB0aGUgY29tYmluZWQgc3VtbWFyeSBpbmRleCwKKyAgLy8vIG5vdCBkdXJpbmcgd3JpdGluZyBvZiB0aGUgcGVyLW1vZHVsZSBpbmRleCB3aGljaCBkb2Vzbid0IGNvbnRhaW4gYQorICAvLy8gbW9kdWxlIHBhdGggc3RyaW5nIHRhYmxlLgorICBTdHJpbmdSZWYgTW9kdWxlUGF0aDsKKworICAvLy8gTGlzdCBvZiB2YWx1ZXMgcmVmZXJlbmNlZCBieSB0aGlzIGdsb2JhbCB2YWx1ZSdzIGRlZmluaXRpb24KKyAgLy8vIChlaXRoZXIgYnkgdGhlIGluaXRpYWxpemVyIG9mIGEgZ2xvYmFsIHZhcmlhYmxlLCBvciByZWZlcmVuY2VkCisgIC8vLyBmcm9tIHdpdGhpbiBhIGZ1bmN0aW9uKS4gVGhpcyBkb2VzIG5vdCBpbmNsdWRlIGZ1bmN0aW9ucyBjYWxsZWQsIHdoaWNoCisgIC8vLyBhcmUgbGlzdGVkIGluIHRoZSBkZXJpdmVkIEZ1bmN0aW9uU3VtbWFyeSBvYmplY3QuCisgIHN0ZDo6dmVjdG9yPFZhbHVlSW5mbz4gUmVmRWRnZUxpc3Q7CisKK3Byb3RlY3RlZDoKKyAgR2xvYmFsVmFsdWVTdW1tYXJ5KFN1bW1hcnlLaW5kIEssIEdWRmxhZ3MgRmxhZ3MsIHN0ZDo6dmVjdG9yPFZhbHVlSW5mbz4gUmVmcykKKyAgICAgIDogS2luZChLKSwgRmxhZ3MoRmxhZ3MpLCBSZWZFZGdlTGlzdChzdGQ6Om1vdmUoUmVmcykpIHsKKyAgICBhc3NlcnQoKEsgIT0gQWxpYXNLaW5kIHx8IFJlZnMuZW1wdHkoKSkgJiYKKyAgICAgICAgICAgIkV4cGVjdCBubyByZWZlcmVuY2VzIGZvciBBbGlhc1N1bW1hcnkiKTsKKyAgfQorCitwdWJsaWM6CisgIHZpcnR1YWwgfkdsb2JhbFZhbHVlU3VtbWFyeSgpID0gZGVmYXVsdDsKKworICAvLy8gUmV0dXJucyB0aGUgaGFzaCBvZiB0aGUgb3JpZ2luYWwgbmFtZSwgaXQgaXMgaWRlbnRpY2FsIHRvIHRoZSBHVUlEIGZvcgorICAvLy8gZXh0ZXJuYWxseSB2aXNpYmxlIHN5bWJvbHMsIGJ1dCBub3QgZm9yIGxvY2FsIG9uZXMuCisgIEdsb2JhbFZhbHVlOjpHVUlEIGdldE9yaWdpbmFsTmFtZSgpIHsgcmV0dXJuIE9yaWdpbmFsTmFtZTsgfQorCisgIC8vLyBJbml0aWFsaXplIHRoZSBvcmlnaW5hbCBuYW1lIGhhc2ggaW4gdGhpcyBzdW1tYXJ5LgorICB2b2lkIHNldE9yaWdpbmFsTmFtZShHbG9iYWxWYWx1ZTo6R1VJRCBOYW1lKSB7IE9yaWdpbmFsTmFtZSA9IE5hbWU7IH0KKworICAvLy8gV2hpY2gga2luZCBvZiBzdW1tYXJ5IHN1YmNsYXNzIHRoaXMgaXMuCisgIFN1bW1hcnlLaW5kIGdldFN1bW1hcnlLaW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQorCisgIC8vLyBTZXQgdGhlIHBhdGggdG8gdGhlIG1vZHVsZSBjb250YWluaW5nIHRoaXMgZnVuY3Rpb24sIGZvciB1c2UgaW4KKyAgLy8vIHRoZSBjb21iaW5lZCBpbmRleC4KKyAgdm9pZCBzZXRNb2R1bGVQYXRoKFN0cmluZ1JlZiBNb2RQYXRoKSB7IE1vZHVsZVBhdGggPSBNb2RQYXRoOyB9CisKKyAgLy8vIEdldCB0aGUgcGF0aCB0byB0aGUgbW9kdWxlIGNvbnRhaW5pbmcgdGhpcyBmdW5jdGlvbi4KKyAgU3RyaW5nUmVmIG1vZHVsZVBhdGgoKSBjb25zdCB7IHJldHVybiBNb2R1bGVQYXRoOyB9CisKKyAgLy8vIEdldCB0aGUgZmxhZ3MgZm9yIHRoaXMgR2xvYmFsVmFsdWUgKHNlZSBccCBzdHJ1Y3QgR1ZGbGFncykuCisgIEdWRmxhZ3MgZmxhZ3MoKSB7IHJldHVybiBGbGFnczsgfQorCisgIC8vLyBSZXR1cm4gbGlua2FnZSB0eXBlIHJlY29yZGVkIGZvciB0aGlzIGdsb2JhbCB2YWx1ZS4KKyAgR2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcyBsaW5rYWdlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxHbG9iYWxWYWx1ZTo6TGlua2FnZVR5cGVzPihGbGFncy5MaW5rYWdlKTsKKyAgfQorCisgIC8vLyBTZXRzIHRoZSBsaW5rYWdlIHRvIHRoZSB2YWx1ZSBkZXRlcm1pbmVkIGJ5IGdsb2JhbCBzdW1tYXJ5LWJhc2VkCisgIC8vLyBvcHRpbWl6YXRpb24uIFdpbGwgYmUgYXBwbGllZCBpbiB0aGUgVGhpbkxUTyBiYWNrZW5kcy4KKyAgdm9pZCBzZXRMaW5rYWdlKEdsb2JhbFZhbHVlOjpMaW5rYWdlVHlwZXMgTGlua2FnZSkgeworICAgIEZsYWdzLkxpbmthZ2UgPSBMaW5rYWdlOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgZ2xvYmFsIHZhbHVlIGNhbid0IGJlIGltcG9ydGVkLgorICBib29sIG5vdEVsaWdpYmxlVG9JbXBvcnQoKSBjb25zdCB7IHJldHVybiBGbGFncy5Ob3RFbGlnaWJsZVRvSW1wb3J0OyB9CisKKyAgYm9vbCBpc0xpdmUoKSBjb25zdCB7IHJldHVybiBGbGFncy5MaXZlOyB9CisKKyAgdm9pZCBzZXRMaXZlKGJvb2wgTGl2ZSkgeyBGbGFncy5MaXZlID0gTGl2ZTsgfQorCisgIHZvaWQgc2V0RFNPTG9jYWwoYm9vbCBMb2NhbCkgeyBGbGFncy5EU09Mb2NhbCA9IExvY2FsOyB9CisKKyAgYm9vbCBpc0RTT0xvY2FsKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MuRFNPTG9jYWw7IH0KKworICAvLy8gRmxhZyB0aGF0IHRoaXMgZ2xvYmFsIHZhbHVlIGNhbm5vdCBiZSBpbXBvcnRlZC4KKyAgdm9pZCBzZXROb3RFbGlnaWJsZVRvSW1wb3J0KCkgeyBGbGFncy5Ob3RFbGlnaWJsZVRvSW1wb3J0ID0gdHJ1ZTsgfQorCisgIC8vLyBSZXR1cm4gdGhlIGxpc3Qgb2YgdmFsdWVzIHJlZmVyZW5jZWQgYnkgdGhpcyBnbG9iYWwgdmFsdWUgZGVmaW5pdGlvbi4KKyAgQXJyYXlSZWY8VmFsdWVJbmZvPiByZWZzKCkgY29uc3QgeyByZXR1cm4gUmVmRWRnZUxpc3Q7IH0KKworICAvLy8gSWYgdGhpcyBpcyBhbiBhbGlhcyBzdW1tYXJ5LCByZXR1cm5zIHRoZSBzdW1tYXJ5IG9mIHRoZSBhbGlhc2VkIG9iamVjdCAoYQorICAvLy8gZ2xvYmFsIHZhcmlhYmxlIG9yIGZ1bmN0aW9uKSwgb3RoZXJ3aXNlIHJldHVybnMgaXRzZWxmLgorICBHbG9iYWxWYWx1ZVN1bW1hcnkgKmdldEJhc2VPYmplY3QoKTsKKyAgY29uc3QgR2xvYmFsVmFsdWVTdW1tYXJ5ICpnZXRCYXNlT2JqZWN0KCkgY29uc3Q7CisKKyAgZnJpZW5kIGNsYXNzIE1vZHVsZVN1bW1hcnlJbmRleDsKK307CisKKy8vLyBcYnJpZWYgQWxpYXMgc3VtbWFyeSBpbmZvcm1hdGlvbi4KK2NsYXNzIEFsaWFzU3VtbWFyeSA6IHB1YmxpYyBHbG9iYWxWYWx1ZVN1bW1hcnkgeworICBHbG9iYWxWYWx1ZVN1bW1hcnkgKkFsaWFzZWVTdW1tYXJ5OworICAvLyBBbGlhc2VlR1VJRCBpcyBvbmx5IHNldCBhbmQgYWNjZXNzZWQgd2hlbiB3ZSBhcmUgYnVpbGRpbmcgYSBjb21iaW5lZCBpbmRleAorICAvLyB2aWEgdGhlIEJpdGNvZGVSZWFkZXIuCisgIEdsb2JhbFZhbHVlOjpHVUlEIEFsaWFzZWVHVUlEOworCitwdWJsaWM6CisgIEFsaWFzU3VtbWFyeShHVkZsYWdzIEZsYWdzKQorICAgICAgOiBHbG9iYWxWYWx1ZVN1bW1hcnkoQWxpYXNLaW5kLCBGbGFncywgQXJyYXlSZWY8VmFsdWVJbmZvPnt9KSwKKyAgICAgICAgQWxpYXNlZVN1bW1hcnkobnVsbHB0ciksIEFsaWFzZWVHVUlEKDApIHt9CisKKyAgLy8vIENoZWNrIGlmIHRoaXMgaXMgYW4gYWxpYXMgc3VtbWFyeS4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBHbG9iYWxWYWx1ZVN1bW1hcnkgKkdWUykgeworICAgIHJldHVybiBHVlMtPmdldFN1bW1hcnlLaW5kKCkgPT0gQWxpYXNLaW5kOworICB9CisKKyAgdm9pZCBzZXRBbGlhc2VlKEdsb2JhbFZhbHVlU3VtbWFyeSAqQWxpYXNlZSkgeyBBbGlhc2VlU3VtbWFyeSA9IEFsaWFzZWU7IH0KKyAgdm9pZCBzZXRBbGlhc2VlR1VJRChHbG9iYWxWYWx1ZTo6R1VJRCBHVUlEKSB7IEFsaWFzZWVHVUlEID0gR1VJRDsgfQorCisgIGNvbnN0IEdsb2JhbFZhbHVlU3VtbWFyeSAmZ2V0QWxpYXNlZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoQWxpYXNlZVN1bW1hcnkgJiYgIlVuZXhwZWN0ZWQgbWlzc2luZyBhbGlhc2VlIHN1bW1hcnkiKTsKKyAgICByZXR1cm4gKkFsaWFzZWVTdW1tYXJ5OworICB9CisKKyAgR2xvYmFsVmFsdWVTdW1tYXJ5ICZnZXRBbGlhc2VlKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PEdsb2JhbFZhbHVlU3VtbWFyeSAmPigKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBBbGlhc1N1bW1hcnkgKj4odGhpcyktPmdldEFsaWFzZWUoKSk7CisgIH0KKyAgY29uc3QgR2xvYmFsVmFsdWU6OkdVSUQgJmdldEFsaWFzZWVHVUlEKCkgY29uc3QgeworICAgIGFzc2VydChBbGlhc2VlR1VJRCAmJiAiVW5leHBlY3RlZCBtaXNzaW5nIGFsaWFzZWUgR1VJRCIpOworICAgIHJldHVybiBBbGlhc2VlR1VJRDsKKyAgfQorfTsKKworY29uc3QgaW5saW5lIEdsb2JhbFZhbHVlU3VtbWFyeSAqR2xvYmFsVmFsdWVTdW1tYXJ5OjpnZXRCYXNlT2JqZWN0KCkgY29uc3QgeworICBpZiAoYXV0byAqQVMgPSBkeW5fY2FzdDxBbGlhc1N1bW1hcnk+KHRoaXMpKQorICAgIHJldHVybiAmQVMtPmdldEFsaWFzZWUoKTsKKyAgcmV0dXJuIHRoaXM7Cit9CisKK2lubGluZSBHbG9iYWxWYWx1ZVN1bW1hcnkgKkdsb2JhbFZhbHVlU3VtbWFyeTo6Z2V0QmFzZU9iamVjdCgpIHsKKyAgaWYgKGF1dG8gKkFTID0gZHluX2Nhc3Q8QWxpYXNTdW1tYXJ5Pih0aGlzKSkKKyAgICByZXR1cm4gJkFTLT5nZXRBbGlhc2VlKCk7CisgIHJldHVybiB0aGlzOworfQorCisvLy8gXGJyaWVmIEZ1bmN0aW9uIHN1bW1hcnkgaW5mb3JtYXRpb24gdG8gYWlkIGRlY2lzaW9ucyBhbmQgaW1wbGVtZW50YXRpb24gb2YKKy8vLyBpbXBvcnRpbmcuCitjbGFzcyBGdW5jdGlvblN1bW1hcnkgOiBwdWJsaWMgR2xvYmFsVmFsdWVTdW1tYXJ5IHsKK3B1YmxpYzoKKyAgLy8vIDxDYWxsZWVWYWx1ZUluZm8sIENhbGxlZUluZm8+IGNhbGwgZWRnZSBwYWlyLgorICB1c2luZyBFZGdlVHkgPSBzdGQ6OnBhaXI8VmFsdWVJbmZvLCBDYWxsZWVJbmZvPjsKKworICAvLy8gQW4gImlkZW50aWZpZXIiIGZvciBhIHZpcnR1YWwgZnVuY3Rpb24uIFRoaXMgY29udGFpbnMgdGhlIHR5cGUgaWRlbnRpZmllcgorICAvLy8gcmVwcmVzZW50ZWQgYXMgYSBHVUlEIGFuZCB0aGUgb2Zmc2V0IGZyb20gdGhlIGFkZHJlc3MgcG9pbnQgdG8gdGhlIHZpcnR1YWwKKyAgLy8vIGZ1bmN0aW9uIHBvaW50ZXIsIHdoZXJlICJhZGRyZXNzIHBvaW50IiBpcyBhcyBkZWZpbmVkIGluIHRoZSBJdGFuaXVtIEFCSToKKyAgLy8vIGh0dHBzOi8vaXRhbml1bS1jeHgtYWJpLmdpdGh1Yi5pby9jeHgtYWJpL2FiaS5odG1sI3Z0YWJsZS1nZW5lcmFsCisgIHN0cnVjdCBWRnVuY0lkIHsKKyAgICBHbG9iYWxWYWx1ZTo6R1VJRCBHVUlEOworICAgIHVpbnQ2NF90IE9mZnNldDsKKyAgfTsKKworICAvLy8gQSBzcGVjaWZpY2F0aW9uIGZvciBhIHZpcnR1YWwgZnVuY3Rpb24gY2FsbCB3aXRoIGFsbCBjb25zdGFudCBpbnRlZ2VyCisgIC8vLyBhcmd1bWVudHMuIFRoaXMgaXMgdXNlZCB0byBwZXJmb3JtIHZpcnR1YWwgY29uc3RhbnQgcHJvcGFnYXRpb24gb24gdGhlCisgIC8vLyBzdW1tYXJ5LgorICBzdHJ1Y3QgQ29uc3RWQ2FsbCB7CisgICAgVkZ1bmNJZCBWRnVuYzsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gQXJnczsKKyAgfTsKKworICAvLy8gRnVuY3Rpb24gYXR0cmlidXRlIGZsYWdzLiBVc2VkIHRvIHRyYWNrIGlmIGEgZnVuY3Rpb24gYWNjZXNzZXMgbWVtb3J5LAorICAvLy8gcmVjdXJzZXMgb3IgYWxpYXNlcy4KKyAgc3RydWN0IEZGbGFncyB7CisgICAgdW5zaWduZWQgUmVhZE5vbmUgOiAxOworICAgIHVuc2lnbmVkIFJlYWRPbmx5IDogMTsKKyAgICB1bnNpZ25lZCBOb1JlY3Vyc2UgOiAxOworICAgIHVuc2lnbmVkIFJldHVybkRvZXNOb3RBbGlhcyA6IDE7CisgIH07CisKKyAgLy8vIENyZWF0ZSBhbiBlbXB0eSBGdW5jdGlvblN1bW1hcnkgKHdpdGggc3BlY2lmaWVkIGNhbGwgZWRnZXMpLgorICAvLy8gVXNlZCB0byByZXByZXNlbnQgZXh0ZXJuYWwgbm9kZXMgYW5kIHRoZSBkdW1teSByb290IG5vZGUuCisgIHN0YXRpYyBGdW5jdGlvblN1bW1hcnkKKyAgbWFrZUR1bW15RnVuY3Rpb25TdW1tYXJ5KHN0ZDo6dmVjdG9yPEZ1bmN0aW9uU3VtbWFyeTo6RWRnZVR5PiBFZGdlcykgeworICAgIHJldHVybiBGdW5jdGlvblN1bW1hcnkoCisgICAgICAgIEZ1bmN0aW9uU3VtbWFyeTo6R1ZGbGFncygKKyAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpMaW5rYWdlVHlwZXM6OkF2YWlsYWJsZUV4dGVybmFsbHlMaW5rYWdlLAorICAgICAgICAgICAgLypOb3RFbGlnaWJsZVRvSW1wb3J0PSovdHJ1ZSwgLypMaXZlPSovdHJ1ZSwgLypJc0xvY2FsPSovZmFsc2UpLAorICAgICAgICAwLCBGdW5jdGlvblN1bW1hcnk6OkZGbGFnc3t9LCBzdGQ6OnZlY3RvcjxWYWx1ZUluZm8+KCksCisgICAgICAgIHN0ZDo6bW92ZShFZGdlcyksIHN0ZDo6dmVjdG9yPEdsb2JhbFZhbHVlOjpHVUlEPigpLAorICAgICAgICBzdGQ6OnZlY3RvcjxGdW5jdGlvblN1bW1hcnk6OlZGdW5jSWQ+KCksCisgICAgICAgIHN0ZDo6dmVjdG9yPEZ1bmN0aW9uU3VtbWFyeTo6VkZ1bmNJZD4oKSwKKyAgICAgICAgc3RkOjp2ZWN0b3I8RnVuY3Rpb25TdW1tYXJ5OjpDb25zdFZDYWxsPigpLAorICAgICAgICBzdGQ6OnZlY3RvcjxGdW5jdGlvblN1bW1hcnk6OkNvbnN0VkNhbGw+KCkpOworICB9CisKKyAgLy8vIEEgZHVtbXkgbm9kZSB0byByZWZlcmVuY2UgZXh0ZXJuYWwgZnVuY3Rpb25zIHRoYXQgYXJlbid0IGluIHRoZSBpbmRleAorICBzdGF0aWMgRnVuY3Rpb25TdW1tYXJ5IEV4dGVybmFsTm9kZTsKKworcHJpdmF0ZToKKyAgLy8vIE51bWJlciBvZiBpbnN0cnVjdGlvbnMgKGlnbm9yaW5nIGRlYnVnIGluc3RydWN0aW9ucywgZS5nLikgY29tcHV0ZWQKKyAgLy8vIGR1cmluZyB0aGUgaW5pdGlhbCBjb21waWxlIHN0ZXAgd2hlbiB0aGUgc3VtbWFyeSBpbmRleCBpcyBmaXJzdCBidWlsdC4KKyAgdW5zaWduZWQgSW5zdENvdW50OworCisgIC8vLyBGdW5jdGlvbiBhdHRyaWJ1dGUgZmxhZ3MuIFVzZWQgdG8gdHJhY2sgaWYgYSBmdW5jdGlvbiBhY2Nlc3NlcyBtZW1vcnksCisgIC8vLyByZWN1cnNlcyBvciBhbGlhc2VzLgorICBGRmxhZ3MgRnVuRmxhZ3M7CisKKyAgLy8vIExpc3Qgb2YgPENhbGxlZVZhbHVlSW5mbywgQ2FsbGVlSW5mbz4gY2FsbCBlZGdlIHBhaXJzIGZyb20gdGhpcyBmdW5jdGlvbi4KKyAgc3RkOjp2ZWN0b3I8RWRnZVR5PiBDYWxsR3JhcGhFZGdlTGlzdDsKKworICAvLy8gQWxsIHR5cGUgaWRlbnRpZmllciByZWxhdGVkIGluZm9ybWF0aW9uLiBCZWNhdXNlIHRoZXNlIGZpZWxkcyBhcmUKKyAgLy8vIHJlbGF0aXZlbHkgdW5jb21tb24gd2Ugb25seSBhbGxvY2F0ZSBzcGFjZSBmb3IgdGhlbSBpZiBuZWNlc3NhcnkuCisgIHN0cnVjdCBUeXBlSWRJbmZvIHsKKyAgICAvLy8gTGlzdCBvZiB0eXBlIGlkZW50aWZpZXJzIHVzZWQgYnkgdGhpcyBmdW5jdGlvbiBpbiBsbHZtLnR5cGUudGVzdAorICAgIC8vLyBpbnRyaW5zaWNzIG90aGVyIHRoYW4gYnkgYW4gbGx2bS5hc3N1bWUgaW50cmluc2ljLCByZXByZXNlbnRlZCBhcyBHVUlEcy4KKyAgICBzdGQ6OnZlY3RvcjxHbG9iYWxWYWx1ZTo6R1VJRD4gVHlwZVRlc3RzOworCisgICAgLy8vIExpc3Qgb2YgdmlydHVhbCBjYWxscyBtYWRlIGJ5IHRoaXMgZnVuY3Rpb24gdXNpbmcgKHJlc3BlY3RpdmVseSkKKyAgICAvLy8gbGx2bS5hc3N1bWUobGx2bS50eXBlLnRlc3QpIG9yIGxsdm0udHlwZS5jaGVja2VkLmxvYWQgaW50cmluc2ljcyB0aGF0IGRvCisgICAgLy8vIG5vdCBoYXZlIGFsbCBjb25zdGFudCBpbnRlZ2VyIGFyZ3VtZW50cy4KKyAgICBzdGQ6OnZlY3RvcjxWRnVuY0lkPiBUeXBlVGVzdEFzc3VtZVZDYWxscywgVHlwZUNoZWNrZWRMb2FkVkNhbGxzOworCisgICAgLy8vIExpc3Qgb2YgdmlydHVhbCBjYWxscyBtYWRlIGJ5IHRoaXMgZnVuY3Rpb24gdXNpbmcgKHJlc3BlY3RpdmVseSkKKyAgICAvLy8gbGx2bS5hc3N1bWUobGx2bS50eXBlLnRlc3QpIG9yIGxsdm0udHlwZS5jaGVja2VkLmxvYWQgaW50cmluc2ljcyB3aXRoCisgICAgLy8vIGFsbCBjb25zdGFudCBpbnRlZ2VyIGFyZ3VtZW50cy4KKyAgICBzdGQ6OnZlY3RvcjxDb25zdFZDYWxsPiBUeXBlVGVzdEFzc3VtZUNvbnN0VkNhbGxzLAorICAgICAgICBUeXBlQ2hlY2tlZExvYWRDb25zdFZDYWxsczsKKyAgfTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8VHlwZUlkSW5mbz4gVElkSW5mbzsKKworcHVibGljOgorICBGdW5jdGlvblN1bW1hcnkoR1ZGbGFncyBGbGFncywgdW5zaWduZWQgTnVtSW5zdHMsIEZGbGFncyBGdW5GbGFncywKKyAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZhbHVlSW5mbz4gUmVmcywgc3RkOjp2ZWN0b3I8RWRnZVR5PiBDR0VkZ2VzLAorICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8R2xvYmFsVmFsdWU6OkdVSUQ+IFR5cGVUZXN0cywKKyAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFZGdW5jSWQ+IFR5cGVUZXN0QXNzdW1lVkNhbGxzLAorICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8VkZ1bmNJZD4gVHlwZUNoZWNrZWRMb2FkVkNhbGxzLAorICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q29uc3RWQ2FsbD4gVHlwZVRlc3RBc3N1bWVDb25zdFZDYWxscywKKyAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPENvbnN0VkNhbGw+IFR5cGVDaGVja2VkTG9hZENvbnN0VkNhbGxzKQorICAgICAgOiBHbG9iYWxWYWx1ZVN1bW1hcnkoRnVuY3Rpb25LaW5kLCBGbGFncywgc3RkOjptb3ZlKFJlZnMpKSwKKyAgICAgICAgSW5zdENvdW50KE51bUluc3RzKSwgRnVuRmxhZ3MoRnVuRmxhZ3MpLAorICAgICAgICBDYWxsR3JhcGhFZGdlTGlzdChzdGQ6Om1vdmUoQ0dFZGdlcykpIHsKKyAgICBpZiAoIVR5cGVUZXN0cy5lbXB0eSgpIHx8ICFUeXBlVGVzdEFzc3VtZVZDYWxscy5lbXB0eSgpIHx8CisgICAgICAgICFUeXBlQ2hlY2tlZExvYWRWQ2FsbHMuZW1wdHkoKSB8fCAhVHlwZVRlc3RBc3N1bWVDb25zdFZDYWxscy5lbXB0eSgpIHx8CisgICAgICAgICFUeXBlQ2hlY2tlZExvYWRDb25zdFZDYWxscy5lbXB0eSgpKQorICAgICAgVElkSW5mbyA9IGxsdm06Om1ha2VfdW5pcXVlPFR5cGVJZEluZm8+KFR5cGVJZEluZm97CisgICAgICAgICAgc3RkOjptb3ZlKFR5cGVUZXN0cyksIHN0ZDo6bW92ZShUeXBlVGVzdEFzc3VtZVZDYWxscyksCisgICAgICAgICAgc3RkOjptb3ZlKFR5cGVDaGVja2VkTG9hZFZDYWxscyksCisgICAgICAgICAgc3RkOjptb3ZlKFR5cGVUZXN0QXNzdW1lQ29uc3RWQ2FsbHMpLAorICAgICAgICAgIHN0ZDo6bW92ZShUeXBlQ2hlY2tlZExvYWRDb25zdFZDYWxscyl9KTsKKyAgfQorCisgIC8vLyBDaGVjayBpZiB0aGlzIGlzIGEgZnVuY3Rpb24gc3VtbWFyeS4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBHbG9iYWxWYWx1ZVN1bW1hcnkgKkdWUykgeworICAgIHJldHVybiBHVlMtPmdldFN1bW1hcnlLaW5kKCkgPT0gRnVuY3Rpb25LaW5kOworICB9CisKKyAgLy8vIEdldCBmdW5jdGlvbiBhdHRyaWJ1dGUgZmxhZ3MuCisgIEZGbGFncyAmZmZsYWdzKCkgeyByZXR1cm4gRnVuRmxhZ3M7IH0KKworICAvLy8gR2V0IHRoZSBpbnN0cnVjdGlvbiBjb3VudCByZWNvcmRlZCBmb3IgdGhpcyBmdW5jdGlvbi4KKyAgdW5zaWduZWQgaW5zdENvdW50KCkgY29uc3QgeyByZXR1cm4gSW5zdENvdW50OyB9CisKKyAgLy8vIFJldHVybiB0aGUgbGlzdCBvZiA8Q2FsbGVlVmFsdWVJbmZvLCBDYWxsZWVJbmZvPiBwYWlycy4KKyAgQXJyYXlSZWY8RWRnZVR5PiBjYWxscygpIGNvbnN0IHsgcmV0dXJuIENhbGxHcmFwaEVkZ2VMaXN0OyB9CisKKyAgLy8vIFJldHVybnMgdGhlIGxpc3Qgb2YgdHlwZSBpZGVudGlmaWVycyB1c2VkIGJ5IHRoaXMgZnVuY3Rpb24gaW4KKyAgLy8vIGxsdm0udHlwZS50ZXN0IGludHJpbnNpY3Mgb3RoZXIgdGhhbiBieSBhbiBsbHZtLmFzc3VtZSBpbnRyaW5zaWMsCisgIC8vLyByZXByZXNlbnRlZCBhcyBHVUlEcy4KKyAgQXJyYXlSZWY8R2xvYmFsVmFsdWU6OkdVSUQ+IHR5cGVfdGVzdHMoKSBjb25zdCB7CisgICAgaWYgKFRJZEluZm8pCisgICAgICByZXR1cm4gVElkSW5mby0+VHlwZVRlc3RzOworICAgIHJldHVybiB7fTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBsaXN0IG9mIHZpcnR1YWwgY2FsbHMgbWFkZSBieSB0aGlzIGZ1bmN0aW9uIHVzaW5nCisgIC8vLyBsbHZtLmFzc3VtZShsbHZtLnR5cGUudGVzdCkgaW50cmluc2ljcyB0aGF0IGRvIG5vdCBoYXZlIGFsbCBjb25zdGFudAorICAvLy8gaW50ZWdlciBhcmd1bWVudHMuCisgIEFycmF5UmVmPFZGdW5jSWQ+IHR5cGVfdGVzdF9hc3N1bWVfdmNhbGxzKCkgY29uc3QgeworICAgIGlmIChUSWRJbmZvKQorICAgICAgcmV0dXJuIFRJZEluZm8tPlR5cGVUZXN0QXNzdW1lVkNhbGxzOworICAgIHJldHVybiB7fTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBsaXN0IG9mIHZpcnR1YWwgY2FsbHMgbWFkZSBieSB0aGlzIGZ1bmN0aW9uIHVzaW5nCisgIC8vLyBsbHZtLnR5cGUuY2hlY2tlZC5sb2FkIGludHJpbnNpY3MgdGhhdCBkbyBub3QgaGF2ZSBhbGwgY29uc3RhbnQgaW50ZWdlcgorICAvLy8gYXJndW1lbnRzLgorICBBcnJheVJlZjxWRnVuY0lkPiB0eXBlX2NoZWNrZWRfbG9hZF92Y2FsbHMoKSBjb25zdCB7CisgICAgaWYgKFRJZEluZm8pCisgICAgICByZXR1cm4gVElkSW5mby0+VHlwZUNoZWNrZWRMb2FkVkNhbGxzOworICAgIHJldHVybiB7fTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBsaXN0IG9mIHZpcnR1YWwgY2FsbHMgbWFkZSBieSB0aGlzIGZ1bmN0aW9uIHVzaW5nCisgIC8vLyBsbHZtLmFzc3VtZShsbHZtLnR5cGUudGVzdCkgaW50cmluc2ljcyB3aXRoIGFsbCBjb25zdGFudCBpbnRlZ2VyCisgIC8vLyBhcmd1bWVudHMuCisgIEFycmF5UmVmPENvbnN0VkNhbGw+IHR5cGVfdGVzdF9hc3N1bWVfY29uc3RfdmNhbGxzKCkgY29uc3QgeworICAgIGlmIChUSWRJbmZvKQorICAgICAgcmV0dXJuIFRJZEluZm8tPlR5cGVUZXN0QXNzdW1lQ29uc3RWQ2FsbHM7CisgICAgcmV0dXJuIHt9OworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIGxpc3Qgb2YgdmlydHVhbCBjYWxscyBtYWRlIGJ5IHRoaXMgZnVuY3Rpb24gdXNpbmcKKyAgLy8vIGxsdm0udHlwZS5jaGVja2VkLmxvYWQgaW50cmluc2ljcyB3aXRoIGFsbCBjb25zdGFudCBpbnRlZ2VyIGFyZ3VtZW50cy4KKyAgQXJyYXlSZWY8Q29uc3RWQ2FsbD4gdHlwZV9jaGVja2VkX2xvYWRfY29uc3RfdmNhbGxzKCkgY29uc3QgeworICAgIGlmIChUSWRJbmZvKQorICAgICAgcmV0dXJuIFRJZEluZm8tPlR5cGVDaGVja2VkTG9hZENvbnN0VkNhbGxzOworICAgIHJldHVybiB7fTsKKyAgfQorCisgIC8vLyBBZGQgYSB0eXBlIHRlc3QgdG8gdGhlIHN1bW1hcnkuIFRoaXMgaXMgdXNlZCBieSBXaG9sZVByb2dyYW1EZXZpcnQgaWYgd2UKKyAgLy8vIHdlcmUgdW5hYmxlIHRvIGRldmlydHVhbGl6ZSBhIGNoZWNrZWQgY2FsbC4KKyAgdm9pZCBhZGRUeXBlVGVzdChHbG9iYWxWYWx1ZTo6R1VJRCBHdWlkKSB7CisgICAgaWYgKCFUSWRJbmZvKQorICAgICAgVElkSW5mbyA9IGxsdm06Om1ha2VfdW5pcXVlPFR5cGVJZEluZm8+KCk7CisgICAgVElkSW5mby0+VHlwZVRlc3RzLnB1c2hfYmFjayhHdWlkKTsKKyAgfQorCisgIGZyaWVuZCBzdHJ1Y3QgR3JhcGhUcmFpdHM8VmFsdWVJbmZvPjsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBEZW5zZU1hcEluZm88RnVuY3Rpb25TdW1tYXJ5OjpWRnVuY0lkPiB7CisgIHN0YXRpYyBGdW5jdGlvblN1bW1hcnk6OlZGdW5jSWQgZ2V0RW1wdHlLZXkoKSB7IHJldHVybiB7MCwgdWludDY0X3QoLTEpfTsgfQorCisgIHN0YXRpYyBGdW5jdGlvblN1bW1hcnk6OlZGdW5jSWQgZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiB7MCwgdWludDY0X3QoLTIpfTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoRnVuY3Rpb25TdW1tYXJ5OjpWRnVuY0lkIEwsIEZ1bmN0aW9uU3VtbWFyeTo6VkZ1bmNJZCBSKSB7CisgICAgcmV0dXJuIEwuR1VJRCA9PSBSLkdVSUQgJiYgTC5PZmZzZXQgPT0gUi5PZmZzZXQ7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKEZ1bmN0aW9uU3VtbWFyeTo6VkZ1bmNJZCBJKSB7IHJldHVybiBJLkdVSUQ7IH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBEZW5zZU1hcEluZm88RnVuY3Rpb25TdW1tYXJ5OjpDb25zdFZDYWxsPiB7CisgIHN0YXRpYyBGdW5jdGlvblN1bW1hcnk6OkNvbnN0VkNhbGwgZ2V0RW1wdHlLZXkoKSB7CisgICAgcmV0dXJuIHt7MCwgdWludDY0X3QoLTEpfSwge319OworICB9CisKKyAgc3RhdGljIEZ1bmN0aW9uU3VtbWFyeTo6Q29uc3RWQ2FsbCBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgcmV0dXJuIHt7MCwgdWludDY0X3QoLTIpfSwge319OworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChGdW5jdGlvblN1bW1hcnk6OkNvbnN0VkNhbGwgTCwKKyAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvblN1bW1hcnk6OkNvbnN0VkNhbGwgUikgeworICAgIHJldHVybiBEZW5zZU1hcEluZm88RnVuY3Rpb25TdW1tYXJ5OjpWRnVuY0lkPjo6aXNFcXVhbChMLlZGdW5jLCBSLlZGdW5jKSAmJgorICAgICAgICAgICBMLkFyZ3MgPT0gUi5BcmdzOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShGdW5jdGlvblN1bW1hcnk6OkNvbnN0VkNhbGwgSSkgeworICAgIHJldHVybiBJLlZGdW5jLkdVSUQ7CisgIH0KK307CisKKy8vLyBcYnJpZWYgR2xvYmFsIHZhcmlhYmxlIHN1bW1hcnkgaW5mb3JtYXRpb24gdG8gYWlkIGRlY2lzaW9ucyBhbmQKKy8vLyBpbXBsZW1lbnRhdGlvbiBvZiBpbXBvcnRpbmcuCisvLy8KKy8vLyBDdXJyZW50bHkgdGhpcyBkb2Vzbid0IGFkZCBhbnl0aGluZyB0byB0aGUgYmFzZSBccCBHbG9iYWxWYWx1ZVN1bW1hcnksCisvLy8gYnV0IGlzIGEgcGxhY2Vob2xkZXIgYXMgYWRkaXRpb25hbCBpbmZvIG1heSBiZSBhZGRlZCB0byB0aGUgc3VtbWFyeQorLy8vIGZvciB2YXJpYWJsZXMuCitjbGFzcyBHbG9iYWxWYXJTdW1tYXJ5IDogcHVibGljIEdsb2JhbFZhbHVlU3VtbWFyeSB7CisKK3B1YmxpYzoKKyAgR2xvYmFsVmFyU3VtbWFyeShHVkZsYWdzIEZsYWdzLCBzdGQ6OnZlY3RvcjxWYWx1ZUluZm8+IFJlZnMpCisgICAgICA6IEdsb2JhbFZhbHVlU3VtbWFyeShHbG9iYWxWYXJLaW5kLCBGbGFncywgc3RkOjptb3ZlKFJlZnMpKSB7fQorCisgIC8vLyBDaGVjayBpZiB0aGlzIGlzIGEgZ2xvYmFsIHZhcmlhYmxlIHN1bW1hcnkuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgR2xvYmFsVmFsdWVTdW1tYXJ5ICpHVlMpIHsKKyAgICByZXR1cm4gR1ZTLT5nZXRTdW1tYXJ5S2luZCgpID09IEdsb2JhbFZhcktpbmQ7CisgIH0KK307CisKK3N0cnVjdCBUeXBlVGVzdFJlc29sdXRpb24geworICAvLy8gU3BlY2lmaWVzIHdoaWNoIGtpbmQgb2YgdHlwZSBjaGVjayB3ZSBzaG91bGQgZW1pdCBmb3IgdGhpcyBieXRlIGFycmF5LgorICAvLy8gU2VlIGh0dHA6Ly9jbGFuZy5sbHZtLm9yZy9kb2NzL0NvbnRyb2xGbG93SW50ZWdyaXR5RGVzaWduLmh0bWwgZm9yIGZ1bGwKKyAgLy8vIGRldGFpbHMgb24gZWFjaCBraW5kIG9mIGNoZWNrOyB0aGUgZW51bWVyYXRvcnMgYXJlIGRlc2NyaWJlZCB3aXRoCisgIC8vLyByZWZlcmVuY2UgdG8gdGhhdCBkb2N1bWVudC4KKyAgZW51bSBLaW5kIHsKKyAgICBVbnNhdCwgICAgIC8vLzwgVW5zYXRpc2ZpYWJsZSB0eXBlIChpLmUuIG5vIGdsb2JhbCBoYXMgdGhpcyB0eXBlIG1ldGFkYXRhKQorICAgIEJ5dGVBcnJheSwgLy8vPCBUZXN0IGEgYnl0ZSBhcnJheSAoZmlyc3QgZXhhbXBsZSkKKyAgICBJbmxpbmUsICAgIC8vLzwgSW5saW5lZCBiaXQgdmVjdG9yICgiU2hvcnQgSW5saW5lIEJpdCBWZWN0b3JzIikKKyAgICBTaW5nbGUsICAgIC8vLzwgU2luZ2xlIGVsZW1lbnQgKGxhc3QgZXhhbXBsZSBpbiAiU2hvcnQgSW5saW5lIEJpdCBWZWN0b3JzIikKKyAgICBBbGxPbmVzLCAgIC8vLzwgQWxsLW9uZXMgYml0IHZlY3RvciAoIkVsaW1pbmF0aW5nIEJpdCBWZWN0b3IgQ2hlY2tzIGZvcgorICAgICAgICAgICAgICAgLy8vICBBbGwtT25lcyBCaXQgVmVjdG9ycyIpCisgIH0gVGhlS2luZCA9IFVuc2F0OworCisgIC8vLyBSYW5nZSBvZiBzaXplLTEgZXhwcmVzc2VkIGFzIGEgYml0IHdpZHRoLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHNpemUgaXMgaW4KKyAgLy8vIHJhbmdlIFsxLDI1Nl0sIHRoaXMgbnVtYmVyIHdpbGwgYmUgOC4gVGhpcyBoZWxwcyBnZW5lcmF0ZSB0aGUgbW9zdCBjb21wYWN0CisgIC8vLyBpbnN0cnVjdGlvbiBzZXF1ZW5jZXMuCisgIHVuc2lnbmVkIFNpemVNMUJpdFdpZHRoID0gMDsKKworICAvLyBUaGUgZm9sbG93aW5nIGZpZWxkcyBhcmUgb25seSB1c2VkIGlmIHRoZSB0YXJnZXQgZG9lcyBub3Qgc3VwcG9ydCB0aGUgdXNlCisgIC8vIG9mIGFic29sdXRlIHN5bWJvbHMgdG8gc3RvcmUgY29uc3RhbnRzLiBUaGVpciBtZWFuaW5ncyBhcmUgdGhlIHNhbWUgYXMgdGhlCisgIC8vIGNvcnJlc3BvbmRpbmcgZmllbGRzIGluIExvd2VyVHlwZVRlc3RzTW9kdWxlOjpUeXBlSWRMb3dlcmluZyBpbgorICAvLyBMb3dlclR5cGVUZXN0cy5jcHAuCisKKyAgdWludDY0X3QgQWxpZ25Mb2cyID0gMDsKKyAgdWludDY0X3QgU2l6ZU0xID0gMDsKKyAgdWludDhfdCBCaXRNYXNrID0gMDsKKyAgdWludDY0X3QgSW5saW5lQml0cyA9IDA7Cit9OworCitzdHJ1Y3QgV2hvbGVQcm9ncmFtRGV2aXJ0UmVzb2x1dGlvbiB7CisgIGVudW0gS2luZCB7CisgICAgSW5kaXIsICAgICAgICAvLy88IEp1c3QgZG8gYSByZWd1bGFyIHZpcnR1YWwgY2FsbAorICAgIFNpbmdsZUltcGwsICAgLy8vPCBTaW5nbGUgaW1wbGVtZW50YXRpb24gZGV2aXJ0dWFsaXphdGlvbgorICAgIEJyYW5jaEZ1bm5lbCwgLy8vPCBXaGVuIHJldHBvbGluZSBtaXRpZ2F0aW9uIGlzIGVuYWJsZWQsIHVzZSBhIGJyYW5jaCBmdW5uZWwKKyAgICAgICAgICAgICAgICAgIC8vLzwgdGhhdCBpcyBkZWZpbmVkIGluIHRoZSBtZXJnZWQgbW9kdWxlLiBPdGhlcndpc2Ugc2FtZSBhcworICAgICAgICAgICAgICAgICAgLy8vPCBJbmRpci4KKyAgfSBUaGVLaW5kID0gSW5kaXI7CisKKyAgc3RkOjpzdHJpbmcgU2luZ2xlSW1wbE5hbWU7CisKKyAgc3RydWN0IEJ5QXJnIHsKKyAgICBlbnVtIEtpbmQgeworICAgICAgSW5kaXIsICAgICAgICAgICAgLy8vPCBKdXN0IGRvIGEgcmVndWxhciB2aXJ0dWFsIGNhbGwKKyAgICAgIFVuaWZvcm1SZXRWYWwsICAgIC8vLzwgVW5pZm9ybSByZXR1cm4gdmFsdWUgb3B0aW1pemF0aW9uCisgICAgICBVbmlxdWVSZXRWYWwsICAgICAvLy88IFVuaXF1ZSByZXR1cm4gdmFsdWUgb3B0aW1pemF0aW9uCisgICAgICBWaXJ0dWFsQ29uc3RQcm9wLCAvLy88IFZpcnR1YWwgY29uc3RhbnQgcHJvcGFnYXRpb24KKyAgICB9IFRoZUtpbmQgPSBJbmRpcjsKKworICAgIC8vLyBBZGRpdGlvbmFsIGluZm9ybWF0aW9uIGZvciB0aGUgcmVzb2x1dGlvbjoKKyAgICAvLy8gLSBVbmlmb3JtUmV0VmFsOiB0aGUgdW5pZm9ybSByZXR1cm4gdmFsdWUuCisgICAgLy8vIC0gVW5pcXVlUmV0VmFsOiB0aGUgcmV0dXJuIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgdW5pcXVlIHZ0YWJsZSAoMCBvcgorICAgIC8vLyAgIDEpLgorICAgIHVpbnQ2NF90IEluZm8gPSAwOworCisgICAgLy8gVGhlIGZvbGxvd2luZyBmaWVsZHMgYXJlIG9ubHkgdXNlZCBpZiB0aGUgdGFyZ2V0IGRvZXMgbm90IHN1cHBvcnQgdGhlIHVzZQorICAgIC8vIG9mIGFic29sdXRlIHN5bWJvbHMgdG8gc3RvcmUgY29uc3RhbnRzLgorCisgICAgdWludDMyX3QgQnl0ZSA9IDA7CisgICAgdWludDMyX3QgQml0ID0gMDsKKyAgfTsKKworICAvLy8gUmVzb2x1dGlvbnMgZm9yIGNhbGxzIHdpdGggYWxsIGNvbnN0YW50IGludGVnZXIgYXJndW1lbnRzIChleGNsdWRpbmcgdGhlCisgIC8vLyBmaXJzdCBhcmd1bWVudCwgInRoaXMiKSwgd2hlcmUgdGhlIGtleSBpcyB0aGUgYXJndW1lbnQgdmVjdG9yLgorICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50NjRfdD4sIEJ5QXJnPiBSZXNCeUFyZzsKK307CisKK3N0cnVjdCBUeXBlSWRTdW1tYXJ5IHsKKyAgVHlwZVRlc3RSZXNvbHV0aW9uIFRUUmVzOworCisgIC8vLyBNYXBwaW5nIGZyb20gYnl0ZSBvZmZzZXQgdG8gd2hvbGUtcHJvZ3JhbSBkZXZpcnQgcmVzb2x1dGlvbiBmb3IgdGhhdAorICAvLy8gKHR5cGVpZCwgYnl0ZSBvZmZzZXQpIHBhaXIuCisgIHN0ZDo6bWFwPHVpbnQ2NF90LCBXaG9sZVByb2dyYW1EZXZpcnRSZXNvbHV0aW9uPiBXUERSZXM7Cit9OworCisvLy8gMTYwIGJpdHMgU0hBMQordXNpbmcgTW9kdWxlSGFzaCA9IHN0ZDo6YXJyYXk8dWludDMyX3QsIDU+OworCisvLy8gVHlwZSB1c2VkIGZvciBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgZ2xvYmFsIHZhbHVlIHN1bW1hcnkgbWFwLgordXNpbmcgY29uc3RfZ3ZzdW1tYXJ5X2l0ZXJhdG9yID0gR2xvYmFsVmFsdWVTdW1tYXJ5TWFwVHk6OmNvbnN0X2l0ZXJhdG9yOwordXNpbmcgZ3ZzdW1tYXJ5X2l0ZXJhdG9yID0gR2xvYmFsVmFsdWVTdW1tYXJ5TWFwVHk6Oml0ZXJhdG9yOworCisvLy8gU3RyaW5nIHRhYmxlIHRvIGhvbGQvb3duIG1vZHVsZSBwYXRoIHN0cmluZ3MsIHdoaWNoIGFkZGl0aW9uYWxseSBob2xkcyB0aGUKKy8vLyBtb2R1bGUgSUQgYXNzaWduZWQgdG8gZWFjaCBtb2R1bGUgZHVyaW5nIHRoZSBwbHVnaW4gc3RlcCwgYXMgd2VsbCBhcyBhIGhhc2gKKy8vLyBvZiB0aGUgbW9kdWxlLiBUaGUgU3RyaW5nTWFwIG1ha2VzIGEgY29weSBvZiBhbmQgb3ducyBpbnNlcnRlZCBzdHJpbmdzLgordXNpbmcgTW9kdWxlUGF0aFN0cmluZ1RhYmxlVHkgPSBTdHJpbmdNYXA8c3RkOjpwYWlyPHVpbnQ2NF90LCBNb2R1bGVIYXNoPj47CisKKy8vLyBNYXAgb2YgZ2xvYmFsIHZhbHVlIEdVSUQgdG8gaXRzIHN1bW1hcnksIHVzZWQgdG8gaWRlbnRpZnkgdmFsdWVzIGRlZmluZWQgaW4KKy8vLyBhIHBhcnRpY3VsYXIgbW9kdWxlLCBhbmQgcHJvdmlkZSBlZmZpY2llbnQgYWNjZXNzIHRvIHRoZWlyIHN1bW1hcnkuCit1c2luZyBHVlN1bW1hcnlNYXBUeSA9IERlbnNlTWFwPEdsb2JhbFZhbHVlOjpHVUlELCBHbG9iYWxWYWx1ZVN1bW1hcnkgKj47CisKKy8vLyBDbGFzcyB0byBob2xkIG1vZHVsZSBwYXRoIHN0cmluZyB0YWJsZSBhbmQgZ2xvYmFsIHZhbHVlIG1hcCwKKy8vLyBhbmQgZW5jYXBzdWxhdGUgbWV0aG9kcyBmb3Igb3BlcmF0aW5nIG9uIHRoZW0uCitjbGFzcyBNb2R1bGVTdW1tYXJ5SW5kZXggeworcHJpdmF0ZToKKyAgLy8vIE1hcCBmcm9tIHZhbHVlIG5hbWUgdG8gbGlzdCBvZiBzdW1tYXJ5IGluc3RhbmNlcyBmb3IgdmFsdWVzIG9mIHRoYXQKKyAgLy8vIG5hbWUgKG1heSBiZSBkdXBsaWNhdGVzIGluIHRoZSBDT01EQVQgY2FzZSwgZS5nLikuCisgIEdsb2JhbFZhbHVlU3VtbWFyeU1hcFR5IEdsb2JhbFZhbHVlTWFwOworCisgIC8vLyBIb2xkcyBzdHJpbmdzIGZvciBjb21iaW5lZCBpbmRleCwgbWFwcGluZyB0byB0aGUgY29ycmVzcG9uZGluZyBtb2R1bGUgSUQuCisgIE1vZHVsZVBhdGhTdHJpbmdUYWJsZVR5IE1vZHVsZVBhdGhTdHJpbmdUYWJsZTsKKworICAvLy8gTWFwcGluZyBmcm9tIHR5cGUgaWRlbnRpZmllcnMgdG8gc3VtbWFyeSBpbmZvcm1hdGlvbiBmb3IgdGhhdCB0eXBlCisgIC8vLyBpZGVudGlmaWVyLgorICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVHlwZUlkU3VtbWFyeT4gVHlwZUlkTWFwOworCisgIC8vLyBNYXBwaW5nIGZyb20gb3JpZ2luYWwgSUQgdG8gR1VJRC4gSWYgb3JpZ2luYWwgSUQgY2FuIG1hcCB0byBtdWx0aXBsZQorICAvLy8gR1VJRHMsIGl0IHdpbGwgYmUgbWFwcGVkIHRvIDAuCisgIHN0ZDo6bWFwPEdsb2JhbFZhbHVlOjpHVUlELCBHbG9iYWxWYWx1ZTo6R1VJRD4gT2lkR3VpZE1hcDsKKworICAvLy8gSW5kaWNhdGVzIHRoYXQgc3VtbWFyeS1iYXNlZCBHbG9iYWxWYWx1ZSBHQyBoYXMgcnVuLCBhbmQgdmFsdWVzIHdpdGgKKyAgLy8vIEdWRmxhZ3M6OkxpdmU9PWZhbHNlIGFyZSByZWFsbHkgZGVhZC4gT3RoZXJ3aXNlLCBhbGwgdmFsdWVzIG11c3QgYmUKKyAgLy8vIGNvbnNpZGVyZWQgbGl2ZS4KKyAgYm9vbCBXaXRoR2xvYmFsVmFsdWVEZWFkU3RyaXBwaW5nID0gZmFsc2U7CisKKyAgLy8vIEluZGljYXRlcyB0aGF0IGRpc3RyaWJ1dGVkIGJhY2tlbmQgc2hvdWxkIHNraXAgY29tcGlsYXRpb24gb2YgdGhlCisgIC8vLyBtb2R1bGUuIEZsYWcgaXMgc3VwcG9zZSB0byBiZSBzZXQgYnkgZGlzdHJpYnV0ZWQgVGhpbkxUTyBpbmRleGluZworICAvLy8gd2hlbiBpdCBkZXRlY3RlZCB0aGF0IHRoZSBtb2R1bGUgaXMgbm90IG5lZWRlZCBkdXJpbmcgdGhlIGZpbmFsCisgIC8vLyBsaW5raW5nLiBBcyByZXN1bHQgZGlzdHJpYnV0ZWQgYmFja2VuZCBzaG91bGQganVzdCBvdXRwdXQgYSBtaW5pbWFsCisgIC8vLyB2YWxpZCBvYmplY3QgZmlsZS4KKyAgYm9vbCBTa2lwTW9kdWxlQnlEaXN0cmlidXRlZEJhY2tlbmQgPSBmYWxzZTsKKworICAvLy8gSWYgdHJ1ZSB0aGVuIHdlJ3JlIHBlcmZvcm1pbmcgYW5hbHlzaXMgb2YgSVIgbW9kdWxlLCBmaWxsaW5nIHN1bW1hcnkKKyAgLy8vIGFjY29yZGluZ2x5LiBUaGUgdmFsdWUgb2YgJ2ZhbHNlJyBtZWFucyB3ZSdyZSByZWFkaW5nIHN1bW1hcnkgZnJvbQorICAvLy8gQkMgb3IgWUFNTCBzb3VyY2UuIEFmZmVjdHMgdGhlIHR5cGUgb2YgdmFsdWUgc3RvcmVkIGluIE5hbWVPckdWIHVuaW9uCisgIGJvb2wgSXNBbmFseXNpczsKKworICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gQ2ZpRnVuY3Rpb25EZWZzOworICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gQ2ZpRnVuY3Rpb25EZWNsczsKKworICAvLyBZQU1MIEkvTyBzdXBwb3J0LgorICBmcmllbmQgeWFtbDo6TWFwcGluZ1RyYWl0czxNb2R1bGVTdW1tYXJ5SW5kZXg+OworCisgIEdsb2JhbFZhbHVlU3VtbWFyeU1hcFR5Ojp2YWx1ZV90eXBlICoKKyAgZ2V0T3JJbnNlcnRWYWx1ZVB0cihHbG9iYWxWYWx1ZTo6R1VJRCBHVUlEKSB7CisgICAgcmV0dXJuICYqR2xvYmFsVmFsdWVNYXAuZW1wbGFjZShHVUlELCBHbG9iYWxWYWx1ZVN1bW1hcnlJbmZvKElzQW5hbHlzaXMpKS5maXJzdDsKKyAgfQorCitwdWJsaWM6CisgIC8vIFNlZSBJc0FuYWx5c2lzIHZhcmlhYmxlIGNvbW1lbnQuCisgIE1vZHVsZVN1bW1hcnlJbmRleChib29sIElzUGVyZm9ybWluZ0FuYWx5c2lzKQorICAgICAgOiBJc0FuYWx5c2lzKElzUGVyZm9ybWluZ0FuYWx5c2lzKSB7fQorCisgIGJvb2wgaXNQZXJmb3JtaW5nQW5hbHlzaXMoKSBjb25zdCB7IHJldHVybiBJc0FuYWx5c2lzOyB9CisKKyAgZ3ZzdW1tYXJ5X2l0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gR2xvYmFsVmFsdWVNYXAuYmVnaW4oKTsgfQorICBjb25zdF9ndnN1bW1hcnlfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBHbG9iYWxWYWx1ZU1hcC5iZWdpbigpOyB9CisgIGd2c3VtbWFyeV9pdGVyYXRvciBlbmQoKSB7IHJldHVybiBHbG9iYWxWYWx1ZU1hcC5lbmQoKTsgfQorICBjb25zdF9ndnN1bW1hcnlfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gR2xvYmFsVmFsdWVNYXAuZW5kKCk7IH0KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBHbG9iYWxWYWx1ZU1hcC5zaXplKCk7IH0KKworICAvLy8gQ29udmVuaWVuY2UgZnVuY3Rpb24gZm9yIGRvaW5nIGEgREZTIG9uIGEgVmFsdWVJbmZvLiBNYXJrcyB0aGUgZnVuY3Rpb24gaW4KKyAgLy8vIHRoZSBGdW5jdGlvbkhhc1BhcmVudCBtYXAuCisgIHN0YXRpYyB2b2lkIGRpc2NvdmVyTm9kZXMoVmFsdWVJbmZvIFYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8VmFsdWVJbmZvLCBib29sPiAmRnVuY3Rpb25IYXNQYXJlbnQpIHsKKyAgICBpZiAoIVYuZ2V0U3VtbWFyeUxpc3QoKS5zaXplKCkpCisgICAgICByZXR1cm47IC8vIHNraXAgZXh0ZXJuYWwgZnVuY3Rpb25zIHRoYXQgZG9uJ3QgaGF2ZSBzdW1tYXJpZXMKKworICAgIC8vIE1hcmsgZGlzY292ZXJlZCBpZiB3ZSBoYXZlbid0IHlldAorICAgIGF1dG8gUyA9IEZ1bmN0aW9uSGFzUGFyZW50LmVtcGxhY2UoViwgZmFsc2UpOworCisgICAgLy8gU3RvcCBpZiB3ZSd2ZSBhbHJlYWR5IGRpc2NvdmVyZWQgdGhpcyBub2RlCisgICAgaWYgKCFTLnNlY29uZCkKKyAgICAgIHJldHVybjsKKworICAgIEZ1bmN0aW9uU3VtbWFyeSAqRiA9CisgICAgICAgIGR5bl9jYXN0PEZ1bmN0aW9uU3VtbWFyeT4oVi5nZXRTdW1tYXJ5TGlzdCgpLmZyb250KCkuZ2V0KCkpOworICAgIGFzc2VydChGICE9IG51bGxwdHIgJiYgIkV4cGVjdGVkIEZ1bmN0aW9uU3VtbWFyeSBub2RlIik7CisKKyAgICBmb3IgKGF1dG8gJkMgOiBGLT5jYWxscygpKSB7CisgICAgICAvLyBJbnNlcnQgbm9kZSBpZiBuZWNlc3NhcnkKKyAgICAgIGF1dG8gUyA9IEZ1bmN0aW9uSGFzUGFyZW50LmVtcGxhY2UoQy5maXJzdCwgdHJ1ZSk7CisKKyAgICAgIC8vIFNraXAgbm9kZXMgdGhhdCB3ZSdyZSBzdXJlIGhhdmUgcGFyZW50cworICAgICAgaWYgKCFTLnNlY29uZCAmJiBTLmZpcnN0LT5zZWNvbmQpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICBpZiAoUy5zZWNvbmQpCisgICAgICAgIGRpc2NvdmVyTm9kZXMoQy5maXJzdCwgRnVuY3Rpb25IYXNQYXJlbnQpOworICAgICAgZWxzZQorICAgICAgICBTLmZpcnN0LT5zZWNvbmQgPSB0cnVlOworICAgIH0KKyAgfQorCisgIC8vIENhbGN1bGF0ZSB0aGUgY2FsbGdyYXBoIHJvb3QKKyAgRnVuY3Rpb25TdW1tYXJ5IGNhbGN1bGF0ZUNhbGxHcmFwaFJvb3QoKSB7CisgICAgLy8gRnVuY3Rpb25zIHRoYXQgaGF2ZSBhIHBhcmVudCB3aWxsIGJlIG1hcmtlZCBpbiBGdW5jdGlvbkhhc1BhcmVudCBwYWlyLgorICAgIC8vIE9uY2Ugd2UndmUgbWFya2VkIGFsbCBmdW5jdGlvbnMsIHRoZSBmdW5jdGlvbnMgaW4gdGhlIG1hcCB0aGF0IGFyZSBmYWxzZQorICAgIC8vIGhhdmUgbm8gcGFyZW50IChzbyB0aGV5J3JlIHRoZSByb290cykKKyAgICBzdGQ6Om1hcDxWYWx1ZUluZm8sIGJvb2w+IEZ1bmN0aW9uSGFzUGFyZW50OworCisgICAgZm9yIChhdXRvICZTIDogKnRoaXMpIHsKKyAgICAgIC8vIFNraXAgZXh0ZXJuYWwgZnVuY3Rpb25zCisgICAgICBpZiAoIVMuc2Vjb25kLlN1bW1hcnlMaXN0LnNpemUoKSB8fAorICAgICAgICAgICFpc2E8RnVuY3Rpb25TdW1tYXJ5PihTLnNlY29uZC5TdW1tYXJ5TGlzdC5mcm9udCgpLmdldCgpKSkKKyAgICAgICAgY29udGludWU7CisgICAgICBkaXNjb3Zlck5vZGVzKFZhbHVlSW5mbyhJc0FuYWx5c2lzLCAmUyksIEZ1bmN0aW9uSGFzUGFyZW50KTsKKyAgICB9CisKKyAgICBzdGQ6OnZlY3RvcjxGdW5jdGlvblN1bW1hcnk6OkVkZ2VUeT4gRWRnZXM7CisgICAgLy8gY3JlYXRlIGVkZ2VzIHRvIGFsbCByb290cyBpbiB0aGUgSW5kZXgKKyAgICBmb3IgKGF1dG8gJlAgOiBGdW5jdGlvbkhhc1BhcmVudCkgeworICAgICAgaWYgKFAuc2Vjb25kKQorICAgICAgICBjb250aW51ZTsgLy8gc2tpcCBvdmVyIG5vbi1yb290IG5vZGVzCisgICAgICBFZGdlcy5wdXNoX2JhY2soc3RkOjptYWtlX3BhaXIoUC5maXJzdCwgQ2FsbGVlSW5mb3t9KSk7CisgICAgfQorICAgIGlmIChFZGdlcy5lbXB0eSgpKSB7CisgICAgICAvLyBGYWlsZWQgdG8gZmluZCByb290IC0gcmV0dXJuIGFuIGVtcHR5IG5vZGUKKyAgICAgIHJldHVybiBGdW5jdGlvblN1bW1hcnk6Om1ha2VEdW1teUZ1bmN0aW9uU3VtbWFyeSh7fSk7CisgICAgfQorICAgIGF1dG8gQ2FsbEdyYXBoUm9vdCA9IEZ1bmN0aW9uU3VtbWFyeTo6bWFrZUR1bW15RnVuY3Rpb25TdW1tYXJ5KEVkZ2VzKTsKKyAgICByZXR1cm4gQ2FsbEdyYXBoUm9vdDsKKyAgfQorCisgIGJvb2wgd2l0aEdsb2JhbFZhbHVlRGVhZFN0cmlwcGluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gV2l0aEdsb2JhbFZhbHVlRGVhZFN0cmlwcGluZzsKKyAgfQorICB2b2lkIHNldFdpdGhHbG9iYWxWYWx1ZURlYWRTdHJpcHBpbmcoKSB7CisgICAgV2l0aEdsb2JhbFZhbHVlRGVhZFN0cmlwcGluZyA9IHRydWU7CisgIH0KKworICBib29sIHNraXBNb2R1bGVCeURpc3RyaWJ1dGVkQmFja2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU2tpcE1vZHVsZUJ5RGlzdHJpYnV0ZWRCYWNrZW5kOworICB9CisgIHZvaWQgc2V0U2tpcE1vZHVsZUJ5RGlzdHJpYnV0ZWRCYWNrZW5kKCkgeworICAgIFNraXBNb2R1bGVCeURpc3RyaWJ1dGVkQmFja2VuZCA9IHRydWU7CisgIH0KKworICBib29sIGlzR2xvYmFsVmFsdWVMaXZlKGNvbnN0IEdsb2JhbFZhbHVlU3VtbWFyeSAqR1ZTKSBjb25zdCB7CisgICAgcmV0dXJuICFXaXRoR2xvYmFsVmFsdWVEZWFkU3RyaXBwaW5nIHx8IEdWUy0+aXNMaXZlKCk7CisgIH0KKyAgYm9vbCBpc0dVSURMaXZlKEdsb2JhbFZhbHVlOjpHVUlEIEdVSUQpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYSBWYWx1ZUluZm8gZm9yIEdVSUQgaWYgaXQgZXhpc3RzLCBvdGhlcndpc2UgcmV0dXJuIFZhbHVlSW5mbygpLgorICBWYWx1ZUluZm8gZ2V0VmFsdWVJbmZvKEdsb2JhbFZhbHVlOjpHVUlEIEdVSUQpIGNvbnN0IHsKKyAgICBhdXRvIEkgPSBHbG9iYWxWYWx1ZU1hcC5maW5kKEdVSUQpOworICAgIHJldHVybiBWYWx1ZUluZm8oSXNBbmFseXNpcywgSSA9PSBHbG9iYWxWYWx1ZU1hcC5lbmQoKSA/IG51bGxwdHIgOiAmKkkpOworICB9CisKKyAgLy8vIFJldHVybiBhIFZhbHVlSW5mbyBmb3IgXHAgR1VJRC4KKyAgVmFsdWVJbmZvIGdldE9ySW5zZXJ0VmFsdWVJbmZvKEdsb2JhbFZhbHVlOjpHVUlEIEdVSUQpIHsKKyAgICByZXR1cm4gVmFsdWVJbmZvKElzQW5hbHlzaXMsIGdldE9ySW5zZXJ0VmFsdWVQdHIoR1VJRCkpOworICB9CisKKyAgLy8vIFJldHVybiBhIFZhbHVlSW5mbyBmb3IgXHAgR1VJRCBzZXR0aW5nIHZhbHVlIFxwIE5hbWUuCisgIFZhbHVlSW5mbyBnZXRPckluc2VydFZhbHVlSW5mbyhHbG9iYWxWYWx1ZTo6R1VJRCBHVUlELCBTdHJpbmdSZWYgTmFtZSkgeworICAgIGFzc2VydCghSXNBbmFseXNpcyk7CisgICAgYXV0byBWUCA9IGdldE9ySW5zZXJ0VmFsdWVQdHIoR1VJRCk7CisgICAgVlAtPnNlY29uZC5VLk5hbWUgPSBOYW1lOworICAgIHJldHVybiBWYWx1ZUluZm8oSXNBbmFseXNpcywgVlApOworICB9CisKKyAgLy8vIFJldHVybiBhIFZhbHVlSW5mbyBmb3IgXHAgR1YgYW5kIG1hcmsgaXQgYXMgYmVsb25naW5nIHRvIEdWLgorICBWYWx1ZUluZm8gZ2V0T3JJbnNlcnRWYWx1ZUluZm8oY29uc3QgR2xvYmFsVmFsdWUgKkdWKSB7CisgICAgYXNzZXJ0KElzQW5hbHlzaXMpOworICAgIGF1dG8gVlAgPSBnZXRPckluc2VydFZhbHVlUHRyKEdWLT5nZXRHVUlEKCkpOworICAgIFZQLT5zZWNvbmQuVS5HViA9IEdWOworICAgIHJldHVybiBWYWx1ZUluZm8oSXNBbmFseXNpcywgVlApOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgR1VJRCBmb3IgXHAgT3JpZ2luYWxJZCBpbiB0aGUgT2lkR3VpZE1hcC4KKyAgR2xvYmFsVmFsdWU6OkdVSUQgZ2V0R1VJREZyb21PcmlnaW5hbElEKEdsb2JhbFZhbHVlOjpHVUlEIE9yaWdpbmFsSUQpIGNvbnN0IHsKKyAgICBjb25zdCBhdXRvIEkgPSBPaWRHdWlkTWFwLmZpbmQoT3JpZ2luYWxJRCk7CisgICAgcmV0dXJuIEkgPT0gT2lkR3VpZE1hcC5lbmQoKSA/IDAgOiBJLT5zZWNvbmQ7CisgIH0KKworICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gJmNmaUZ1bmN0aW9uRGVmcygpIHsgcmV0dXJuIENmaUZ1bmN0aW9uRGVmczsgfQorICBjb25zdCBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gJmNmaUZ1bmN0aW9uRGVmcygpIGNvbnN0IHsgcmV0dXJuIENmaUZ1bmN0aW9uRGVmczsgfQorCisgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPiAmY2ZpRnVuY3Rpb25EZWNscygpIHsgcmV0dXJuIENmaUZ1bmN0aW9uRGVjbHM7IH0KKyAgY29uc3Qgc3RkOjpzZXQ8c3RkOjpzdHJpbmc+ICZjZmlGdW5jdGlvbkRlY2xzKCkgY29uc3QgeyByZXR1cm4gQ2ZpRnVuY3Rpb25EZWNsczsgfQorCisgIC8vLyBBZGQgYSBnbG9iYWwgdmFsdWUgc3VtbWFyeSBmb3IgYSB2YWx1ZSBvZiB0aGUgZ2l2ZW4gbmFtZS4KKyAgdm9pZCBhZGRHbG9iYWxWYWx1ZVN1bW1hcnkoU3RyaW5nUmVmIFZhbHVlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEdsb2JhbFZhbHVlU3VtbWFyeT4gU3VtbWFyeSkgeworICAgIGFkZEdsb2JhbFZhbHVlU3VtbWFyeShnZXRPckluc2VydFZhbHVlSW5mbyhHbG9iYWxWYWx1ZTo6Z2V0R1VJRChWYWx1ZU5hbWUpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKFN1bW1hcnkpKTsKKyAgfQorCisgIC8vLyBBZGQgYSBnbG9iYWwgdmFsdWUgc3VtbWFyeSBmb3IgdGhlIGdpdmVuIFZhbHVlSW5mby4KKyAgdm9pZCBhZGRHbG9iYWxWYWx1ZVN1bW1hcnkoVmFsdWVJbmZvIFZJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8R2xvYmFsVmFsdWVTdW1tYXJ5PiBTdW1tYXJ5KSB7CisgICAgYWRkT3JpZ2luYWxOYW1lKFZJLmdldEdVSUQoKSwgU3VtbWFyeS0+Z2V0T3JpZ2luYWxOYW1lKCkpOworICAgIC8vIEhlcmUgd2UgaGF2ZSBhIG5vdGlvbmFsbHkgY29uc3QgVkksIGJ1dCB0aGUgdmFsdWUgaXQgcG9pbnRzIHRvIGlzIG93bmVkCisgICAgLy8gYnkgdGhlIG5vbi1jb25zdCAqdGhpcy4KKyAgICBjb25zdF9jYXN0PEdsb2JhbFZhbHVlU3VtbWFyeU1hcFR5Ojp2YWx1ZV90eXBlICo+KFZJLmdldFJlZigpKQorICAgICAgICAtPnNlY29uZC5TdW1tYXJ5TGlzdC5wdXNoX2JhY2soc3RkOjptb3ZlKFN1bW1hcnkpKTsKKyAgfQorCisgIC8vLyBBZGQgYW4gb3JpZ2luYWwgbmFtZSBmb3IgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBHVUlELgorICB2b2lkIGFkZE9yaWdpbmFsTmFtZShHbG9iYWxWYWx1ZTo6R1VJRCBWYWx1ZUdVSUQsCisgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpHVUlEIE9yaWdHVUlEKSB7CisgICAgaWYgKE9yaWdHVUlEID09IDAgfHwgVmFsdWVHVUlEID09IE9yaWdHVUlEKQorICAgICAgcmV0dXJuOworICAgIGlmIChPaWRHdWlkTWFwLmNvdW50KE9yaWdHVUlEKSAmJiBPaWRHdWlkTWFwW09yaWdHVUlEXSAhPSBWYWx1ZUdVSUQpCisgICAgICBPaWRHdWlkTWFwW09yaWdHVUlEXSA9IDA7CisgICAgZWxzZQorICAgICAgT2lkR3VpZE1hcFtPcmlnR1VJRF0gPSBWYWx1ZUdVSUQ7CisgIH0KKworICAvLy8gRmluZCB0aGUgc3VtbWFyeSBmb3IgZ2xvYmFsIFxwIEdVSUQgaW4gbW9kdWxlIFxwIE1vZHVsZUlkLCBvciBudWxscHRyIGlmCisgIC8vLyBub3QgZm91bmQuCisgIEdsb2JhbFZhbHVlU3VtbWFyeSAqZmluZFN1bW1hcnlJbk1vZHVsZShHbG9iYWxWYWx1ZTo6R1VJRCBWYWx1ZUdVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgTW9kdWxlSWQpIGNvbnN0IHsKKyAgICBhdXRvIENhbGxlZUluZm8gPSBnZXRWYWx1ZUluZm8oVmFsdWVHVUlEKTsKKyAgICBpZiAoIUNhbGxlZUluZm8pIHsKKyAgICAgIHJldHVybiBudWxscHRyOyAvLyBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGhhdmUgYSBzdW1tYXJ5CisgICAgfQorICAgIGF1dG8gU3VtbWFyeSA9CisgICAgICAgIGxsdm06OmZpbmRfaWYoQ2FsbGVlSW5mby5nZXRTdW1tYXJ5TGlzdCgpLAorICAgICAgICAgICAgICAgICAgICAgIFsmXShjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8R2xvYmFsVmFsdWVTdW1tYXJ5PiAmU3VtbWFyeSkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFN1bW1hcnktPm1vZHVsZVBhdGgoKSA9PSBNb2R1bGVJZDsKKyAgICAgICAgICAgICAgICAgICAgICB9KTsKKyAgICBpZiAoU3VtbWFyeSA9PSBDYWxsZWVJbmZvLmdldFN1bW1hcnlMaXN0KCkuZW5kKCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gU3VtbWFyeS0+Z2V0KCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgZmlyc3QgR2xvYmFsVmFsdWVTdW1tYXJ5IGZvciBccCBHViwgYXNzZXJ0aW5nIHRoYXQgdGhlcmUKKyAgLy8vIGlzIG9ubHkgb25lIGlmIFxwIFBlck1vZHVsZUluZGV4LgorICBHbG9iYWxWYWx1ZVN1bW1hcnkgKmdldEdsb2JhbFZhbHVlU3VtbWFyeShjb25zdCBHbG9iYWxWYWx1ZSAmR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUGVyTW9kdWxlSW5kZXggPSB0cnVlKSBjb25zdCB7CisgICAgYXNzZXJ0KEdWLmhhc05hbWUoKSAmJiAiQ2FuJ3QgZ2V0IEdsb2JhbFZhbHVlU3VtbWFyeSBmb3IgR1Ygd2l0aCBubyBuYW1lIik7CisgICAgcmV0dXJuIGdldEdsb2JhbFZhbHVlU3VtbWFyeShHbG9iYWxWYWx1ZTo6Z2V0R1VJRChHVi5nZXROYW1lKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGVyTW9kdWxlSW5kZXgpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIGZpcnN0IEdsb2JhbFZhbHVlU3VtbWFyeSBmb3IgXHAgVmFsdWVHVUlELCBhc3NlcnRpbmcgdGhhdAorICAvLy8gdGhlcmUKKyAgLy8vIGlzIG9ubHkgb25lIGlmIFxwIFBlck1vZHVsZUluZGV4LgorICBHbG9iYWxWYWx1ZVN1bW1hcnkgKmdldEdsb2JhbFZhbHVlU3VtbWFyeShHbG9iYWxWYWx1ZTo6R1VJRCBWYWx1ZUdVSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUGVyTW9kdWxlSW5kZXggPSB0cnVlKSBjb25zdDsKKworICAvLy8gVGFibGUgb2YgbW9kdWxlcywgY29udGFpbmluZyBtb2R1bGUgaGFzaCBhbmQgaWQuCisgIGNvbnN0IFN0cmluZ01hcDxzdGQ6OnBhaXI8dWludDY0X3QsIE1vZHVsZUhhc2g+PiAmbW9kdWxlUGF0aHMoKSBjb25zdCB7CisgICAgcmV0dXJuIE1vZHVsZVBhdGhTdHJpbmdUYWJsZTsKKyAgfQorCisgIC8vLyBUYWJsZSBvZiBtb2R1bGVzLCBjb250YWluaW5nIGhhc2ggYW5kIGlkLgorICBTdHJpbmdNYXA8c3RkOjpwYWlyPHVpbnQ2NF90LCBNb2R1bGVIYXNoPj4gJm1vZHVsZVBhdGhzKCkgeworICAgIHJldHVybiBNb2R1bGVQYXRoU3RyaW5nVGFibGU7CisgIH0KKworICAvLy8gR2V0IHRoZSBtb2R1bGUgSUQgcmVjb3JkZWQgZm9yIHRoZSBnaXZlbiBtb2R1bGUgcGF0aC4KKyAgdWludDY0X3QgZ2V0TW9kdWxlSWQoY29uc3QgU3RyaW5nUmVmIE1vZFBhdGgpIGNvbnN0IHsKKyAgICByZXR1cm4gTW9kdWxlUGF0aFN0cmluZ1RhYmxlLmxvb2t1cChNb2RQYXRoKS5maXJzdDsKKyAgfQorCisgIC8vLyBHZXQgdGhlIG1vZHVsZSBTSEExIGhhc2ggcmVjb3JkZWQgZm9yIHRoZSBnaXZlbiBtb2R1bGUgcGF0aC4KKyAgY29uc3QgTW9kdWxlSGFzaCAmZ2V0TW9kdWxlSGFzaChjb25zdCBTdHJpbmdSZWYgTW9kUGF0aCkgY29uc3QgeworICAgIGF1dG8gSXQgPSBNb2R1bGVQYXRoU3RyaW5nVGFibGUuZmluZChNb2RQYXRoKTsKKyAgICBhc3NlcnQoSXQgIT0gTW9kdWxlUGF0aFN0cmluZ1RhYmxlLmVuZCgpICYmICJNb2R1bGUgbm90IHJlZ2lzdGVyZWQiKTsKKyAgICByZXR1cm4gSXQtPnNlY29uZC5zZWNvbmQ7CisgIH0KKworICAvLy8gQ29udmVuaWVuY2UgbWV0aG9kIGZvciBjcmVhdGluZyBhIHByb21vdGVkIGdsb2JhbCBuYW1lCisgIC8vLyBmb3IgdGhlIGdpdmVuIHZhbHVlIG5hbWUgb2YgYSBsb2NhbCwgYW5kIGl0cyBvcmlnaW5hbCBtb2R1bGUncyBJRC4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldEdsb2JhbE5hbWVGb3JMb2NhbChTdHJpbmdSZWYgTmFtZSwgTW9kdWxlSGFzaCBNb2RIYXNoKSB7CisgICAgU21hbGxTdHJpbmc8MjU2PiBOZXdOYW1lKE5hbWUpOworICAgIE5ld05hbWUgKz0gIi5sbHZtLiI7CisgICAgTmV3TmFtZSArPSB1dG9zdHIoKHVpbnQ2NF90KE1vZEhhc2hbMF0pIDw8IDMyKSB8CisgICAgICAgICAgICAgICAgICAgICAgTW9kSGFzaFsxXSk7IC8vIFRha2UgdGhlIGZpcnN0IDY0IGJpdHMKKyAgICByZXR1cm4gTmV3TmFtZS5zdHIoKTsKKyAgfQorCisgIC8vLyBIZWxwZXIgdG8gb2J0YWluIHRoZSB1bnByb21vdGVkIG5hbWUgZm9yIGEgZ2xvYmFsIHZhbHVlIChvciB0aGUgb3JpZ2luYWwKKyAgLy8vIG5hbWUgaWYgbm90IHByb21vdGVkKS4KKyAgc3RhdGljIFN0cmluZ1JlZiBnZXRPcmlnaW5hbE5hbWVCZWZvcmVQcm9tb3RlKFN0cmluZ1JlZiBOYW1lKSB7CisgICAgc3RkOjpwYWlyPFN0cmluZ1JlZiwgU3RyaW5nUmVmPiBQYWlyID0gTmFtZS5zcGxpdCgiLmxsdm0uIik7CisgICAgcmV0dXJuIFBhaXIuZmlyc3Q7CisgIH0KKworICB0eXBlZGVmIE1vZHVsZVBhdGhTdHJpbmdUYWJsZVR5Ojp2YWx1ZV90eXBlIE1vZHVsZUluZm87CisKKyAgLy8vIEFkZCBhIG5ldyBtb2R1bGUgd2l0aCB0aGUgZ2l2ZW4gXHAgSGFzaCwgbWFwcGVkIHRvIHRoZSBnaXZlbiBccAorICAvLy8gTW9kSUQsIGFuZCByZXR1cm4gYSByZWZlcmVuY2UgdG8gdGhlIG1vZHVsZS4KKyAgTW9kdWxlSW5mbyAqYWRkTW9kdWxlKFN0cmluZ1JlZiBNb2RQYXRoLCB1aW50NjRfdCBNb2RJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZUhhc2ggSGFzaCA9IE1vZHVsZUhhc2h7ezB9fSkgeworICAgIHJldHVybiAmKk1vZHVsZVBhdGhTdHJpbmdUYWJsZS5pbnNlcnQoe01vZFBhdGgsIHtNb2RJZCwgSGFzaH19KS5maXJzdDsKKyAgfQorCisgIC8vLyBDaGVjayBpZiB0aGUgZ2l2ZW4gTW9kdWxlIGhhcyBhbnkgZnVuY3Rpb25zIGF2YWlsYWJsZSBmb3IgZXhwb3J0aW5nCisgIC8vLyBpbiB0aGUgaW5kZXguIFdlIGNvbnNpZGVyIGFueSBtb2R1bGUgcHJlc2VudCBpbiB0aGUgTW9kdWxlUGF0aFN0cmluZ1RhYmxlCisgIC8vLyB0byBoYXZlIGV4cG9ydGVkIGZ1bmN0aW9ucy4KKyAgYm9vbCBoYXNFeHBvcnRlZEZ1bmN0aW9ucyhjb25zdCBNb2R1bGUgJk0pIGNvbnN0IHsKKyAgICByZXR1cm4gTW9kdWxlUGF0aFN0cmluZ1RhYmxlLmNvdW50KE0uZ2V0TW9kdWxlSWRlbnRpZmllcigpKTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBUeXBlSWRTdW1tYXJ5PiAmdHlwZUlkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gVHlwZUlkTWFwOworICB9CisKKyAgLy8vIFRoaXMgYWNjZXNzb3Igc2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIGV4cG9ydGluZyBiZWNhdXNlIGl0IGNhbiBtdXRhdGUgdGhlCisgIC8vLyBtYXAuCisgIFR5cGVJZFN1bW1hcnkgJmdldE9ySW5zZXJ0VHlwZUlkU3VtbWFyeShTdHJpbmdSZWYgVHlwZUlkKSB7CisgICAgcmV0dXJuIFR5cGVJZE1hcFtUeXBlSWRdOworICB9CisKKyAgLy8vIFRoaXMgcmV0dXJucyBlaXRoZXIgYSBwb2ludGVyIHRvIHRoZSB0eXBlIGlkIHN1bW1hcnkgKGlmIHByZXNlbnQgaW4gdGhlCisgIC8vLyBzdW1tYXJ5IG1hcCkgb3IgbnVsbCAoaWYgbm90IHByZXNlbnQpLiBUaGlzIG1heSBiZSB1c2VkIHdoZW4gaW1wb3J0aW5nLgorICBjb25zdCBUeXBlSWRTdW1tYXJ5ICpnZXRUeXBlSWRTdW1tYXJ5KFN0cmluZ1JlZiBUeXBlSWQpIGNvbnN0IHsKKyAgICBhdXRvIEkgPSBUeXBlSWRNYXAuZmluZChUeXBlSWQpOworICAgIGlmIChJID09IFR5cGVJZE1hcC5lbmQoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiAmSS0+c2Vjb25kOworICB9CisKKyAgLy8vIENvbGxlY3QgZm9yIHRoZSBnaXZlbiBtb2R1bGUgdGhlIGxpc3Qgb2YgZnVuY3Rpb24gaXQgZGVmaW5lcworICAvLy8gKEdVSUQgLT4gU3VtbWFyeSkuCisgIHZvaWQgY29sbGVjdERlZmluZWRGdW5jdGlvbnNGb3JNb2R1bGUoU3RyaW5nUmVmIE1vZHVsZVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1ZTdW1tYXJ5TWFwVHkgJkdWU3VtbWFyeU1hcCkgY29uc3Q7CisKKyAgLy8vIENvbGxlY3QgZm9yIGVhY2ggbW9kdWxlIHRoZSBsaXN0IG9mIFN1bW1hcmllcyBpdCBkZWZpbmVzIChHVUlEIC0+CisgIC8vLyBTdW1tYXJ5KS4KKyAgdm9pZCBjb2xsZWN0RGVmaW5lZEdWU3VtbWFyaWVzUGVyTW9kdWxlKAorICAgICAgU3RyaW5nTWFwPEdWU3VtbWFyeU1hcFR5PiAmTW9kdWxlVG9EZWZpbmVkR1ZTdW1tYXJpZXMpIGNvbnN0OworCisgIC8vLyBFeHBvcnQgc3VtbWFyeSB0byBkb3QgZmlsZSBmb3IgR3JhcGhWaXouCisgIHZvaWQgZXhwb3J0VG9Eb3QocmF3X29zdHJlYW0mIE9TKSBjb25zdDsKKworICAvLy8gUHJpbnQgb3V0IHN0cm9uZ2x5IGNvbm5lY3RlZCBjb21wb25lbnRzIGZvciBkZWJ1Z2dpbmcuCisgIHZvaWQgZHVtcFNDQ3MocmF3X29zdHJlYW0gJk9TKTsKK307CisKKy8vLyBHcmFwaFRyYWl0cyBkZWZpbml0aW9uIHRvIGJ1aWxkIFNDQyBmb3IgdGhlIGluZGV4Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8VmFsdWVJbmZvPiB7CisgIHR5cGVkZWYgVmFsdWVJbmZvIE5vZGVSZWY7CisKKyAgc3RhdGljIE5vZGVSZWYgdmFsdWVJbmZvRnJvbUVkZ2UoRnVuY3Rpb25TdW1tYXJ5OjpFZGdlVHkgJlApIHsKKyAgICByZXR1cm4gUC5maXJzdDsKKyAgfQorICB1c2luZyBDaGlsZEl0ZXJhdG9yVHlwZSA9CisgICAgICBtYXBwZWRfaXRlcmF0b3I8c3RkOjp2ZWN0b3I8RnVuY3Rpb25TdW1tYXJ5OjpFZGdlVHk+OjppdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICBkZWNsdHlwZSgmdmFsdWVJbmZvRnJvbUVkZ2UpPjsKKworICBzdGF0aWMgTm9kZVJlZiBnZXRFbnRyeU5vZGUoVmFsdWVJbmZvIFYpIHsgcmV0dXJuIFY7IH0KKworICBzdGF0aWMgQ2hpbGRJdGVyYXRvclR5cGUgY2hpbGRfYmVnaW4oTm9kZVJlZiBOKSB7CisgICAgaWYgKCFOLmdldFN1bW1hcnlMaXN0KCkuc2l6ZSgpKSAvLyBoYW5kbGUgZXh0ZXJuYWwgZnVuY3Rpb24KKyAgICAgIHJldHVybiBDaGlsZEl0ZXJhdG9yVHlwZSgKKyAgICAgICAgICBGdW5jdGlvblN1bW1hcnk6OkV4dGVybmFsTm9kZS5DYWxsR3JhcGhFZGdlTGlzdC5iZWdpbigpLAorICAgICAgICAgICZ2YWx1ZUluZm9Gcm9tRWRnZSk7CisgICAgRnVuY3Rpb25TdW1tYXJ5ICpGID0KKyAgICAgICAgY2FzdDxGdW5jdGlvblN1bW1hcnk+KE4uZ2V0U3VtbWFyeUxpc3QoKS5mcm9udCgpLT5nZXRCYXNlT2JqZWN0KCkpOworICAgIHJldHVybiBDaGlsZEl0ZXJhdG9yVHlwZShGLT5DYWxsR3JhcGhFZGdlTGlzdC5iZWdpbigpLCAmdmFsdWVJbmZvRnJvbUVkZ2UpOworICB9CisKKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2VuZChOb2RlUmVmIE4pIHsKKyAgICBpZiAoIU4uZ2V0U3VtbWFyeUxpc3QoKS5zaXplKCkpIC8vIGhhbmRsZSBleHRlcm5hbCBmdW5jdGlvbgorICAgICAgcmV0dXJuIENoaWxkSXRlcmF0b3JUeXBlKAorICAgICAgICAgIEZ1bmN0aW9uU3VtbWFyeTo6RXh0ZXJuYWxOb2RlLkNhbGxHcmFwaEVkZ2VMaXN0LmVuZCgpLAorICAgICAgICAgICZ2YWx1ZUluZm9Gcm9tRWRnZSk7CisgICAgRnVuY3Rpb25TdW1tYXJ5ICpGID0KKyAgICAgICAgY2FzdDxGdW5jdGlvblN1bW1hcnk+KE4uZ2V0U3VtbWFyeUxpc3QoKS5mcm9udCgpLT5nZXRCYXNlT2JqZWN0KCkpOworICAgIHJldHVybiBDaGlsZEl0ZXJhdG9yVHlwZShGLT5DYWxsR3JhcGhFZGdlTGlzdC5lbmQoKSwgJnZhbHVlSW5mb0Zyb21FZGdlKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBHcmFwaFRyYWl0czxNb2R1bGVTdW1tYXJ5SW5kZXggKj4gOiBwdWJsaWMgR3JhcGhUcmFpdHM8VmFsdWVJbmZvPiB7CisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShNb2R1bGVTdW1tYXJ5SW5kZXggKkkpIHsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8R2xvYmFsVmFsdWVTdW1tYXJ5PiBSb290ID0KKyAgICAgICAgbWFrZV91bmlxdWU8RnVuY3Rpb25TdW1tYXJ5PihJLT5jYWxjdWxhdGVDYWxsR3JhcGhSb290KCkpOworICAgIEdsb2JhbFZhbHVlU3VtbWFyeUluZm8gRyhJLT5pc1BlcmZvcm1pbmdBbmFseXNpcygpKTsKKyAgICBHLlN1bW1hcnlMaXN0LnB1c2hfYmFjayhzdGQ6Om1vdmUoUm9vdCkpOworICAgIHN0YXRpYyBhdXRvIFAgPQorICAgICAgICBHbG9iYWxWYWx1ZVN1bW1hcnlNYXBUeTo6dmFsdWVfdHlwZShHbG9iYWxWYWx1ZTo6R1VJRCgwKSwgc3RkOjptb3ZlKEcpKTsKKyAgICByZXR1cm4gVmFsdWVJbmZvKEktPmlzUGVyZm9ybWluZ0FuYWx5c2lzKCksICZQKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfTU9EVUxFU1VNTUFSWUlOREVYX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTW9kdWxlU3VtbWFyeUluZGV4WUFNTC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Nb2R1bGVTdW1tYXJ5SW5kZXhZQU1MLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzMGRlNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTW9kdWxlU3VtbWFyeUluZGV4WUFNTC5oCkBAIC0wLDAgKzEsMjc2IEBACisvLz09PS0tIGxsdm0vTW9kdWxlU3VtbWFyeUluZGV4WUFNTC5oIC0gWUFNTCBJL08gZm9yIHN1bW1hcnkgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfTU9EVUxFU1VNTUFSWUlOREVYWUFNTF9ICisjZGVmaW5lIExMVk1fSVJfTU9EVUxFU1VNTUFSWUlOREVYWUFNTF9ICisKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZVN1bW1hcnlJbmRleC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9ZQU1MVHJhaXRzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSB5YW1sIHsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPFR5cGVUZXN0UmVzb2x1dGlvbjo6S2luZD4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmaW8sIFR5cGVUZXN0UmVzb2x1dGlvbjo6S2luZCAmdmFsdWUpIHsKKyAgICBpby5lbnVtQ2FzZSh2YWx1ZSwgIlVuc2F0IiwgVHlwZVRlc3RSZXNvbHV0aW9uOjpVbnNhdCk7CisgICAgaW8uZW51bUNhc2UodmFsdWUsICJCeXRlQXJyYXkiLCBUeXBlVGVzdFJlc29sdXRpb246OkJ5dGVBcnJheSk7CisgICAgaW8uZW51bUNhc2UodmFsdWUsICJJbmxpbmUiLCBUeXBlVGVzdFJlc29sdXRpb246OklubGluZSk7CisgICAgaW8uZW51bUNhc2UodmFsdWUsICJTaW5nbGUiLCBUeXBlVGVzdFJlc29sdXRpb246OlNpbmdsZSk7CisgICAgaW8uZW51bUNhc2UodmFsdWUsICJBbGxPbmVzIiwgVHlwZVRlc3RSZXNvbHV0aW9uOjpBbGxPbmVzKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8VHlwZVRlc3RSZXNvbHV0aW9uPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJmlvLCBUeXBlVGVzdFJlc29sdXRpb24gJnJlcykgeworICAgIGlvLm1hcE9wdGlvbmFsKCJLaW5kIiwgcmVzLlRoZUtpbmQpOworICAgIGlvLm1hcE9wdGlvbmFsKCJTaXplTTFCaXRXaWR0aCIsIHJlcy5TaXplTTFCaXRXaWR0aCk7CisgICAgaW8ubWFwT3B0aW9uYWwoIkFsaWduTG9nMiIsIHJlcy5BbGlnbkxvZzIpOworICAgIGlvLm1hcE9wdGlvbmFsKCJTaXplTTEiLCByZXMuU2l6ZU0xKTsKKyAgICBpby5tYXBPcHRpb25hbCgiQml0TWFzayIsIHJlcy5CaXRNYXNrKTsKKyAgICBpby5tYXBPcHRpb25hbCgiSW5saW5lQml0cyIsIHJlcy5JbmxpbmVCaXRzKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxXaG9sZVByb2dyYW1EZXZpcnRSZXNvbHV0aW9uOjpCeUFyZzo6S2luZD4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmaW8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIFdob2xlUHJvZ3JhbURldmlydFJlc29sdXRpb246OkJ5QXJnOjpLaW5kICZ2YWx1ZSkgeworICAgIGlvLmVudW1DYXNlKHZhbHVlLCAiSW5kaXIiLCBXaG9sZVByb2dyYW1EZXZpcnRSZXNvbHV0aW9uOjpCeUFyZzo6SW5kaXIpOworICAgIGlvLmVudW1DYXNlKHZhbHVlLCAiVW5pZm9ybVJldFZhbCIsCisgICAgICAgICAgICAgICAgV2hvbGVQcm9ncmFtRGV2aXJ0UmVzb2x1dGlvbjo6QnlBcmc6OlVuaWZvcm1SZXRWYWwpOworICAgIGlvLmVudW1DYXNlKHZhbHVlLCAiVW5pcXVlUmV0VmFsIiwKKyAgICAgICAgICAgICAgICBXaG9sZVByb2dyYW1EZXZpcnRSZXNvbHV0aW9uOjpCeUFyZzo6VW5pcXVlUmV0VmFsKTsKKyAgICBpby5lbnVtQ2FzZSh2YWx1ZSwgIlZpcnR1YWxDb25zdFByb3AiLAorICAgICAgICAgICAgICAgIFdob2xlUHJvZ3JhbURldmlydFJlc29sdXRpb246OkJ5QXJnOjpWaXJ0dWFsQ29uc3RQcm9wKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8V2hvbGVQcm9ncmFtRGV2aXJ0UmVzb2x1dGlvbjo6QnlBcmc+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmaW8sIFdob2xlUHJvZ3JhbURldmlydFJlc29sdXRpb246OkJ5QXJnICZyZXMpIHsKKyAgICBpby5tYXBPcHRpb25hbCgiS2luZCIsIHJlcy5UaGVLaW5kKTsKKyAgICBpby5tYXBPcHRpb25hbCgiSW5mbyIsIHJlcy5JbmZvKTsKKyAgICBpby5tYXBPcHRpb25hbCgiQnl0ZSIsIHJlcy5CeXRlKTsKKyAgICBpby5tYXBPcHRpb25hbCgiQml0IiwgcmVzLkJpdCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgQ3VzdG9tTWFwcGluZ1RyYWl0czwKKyAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50NjRfdD4sIFdob2xlUHJvZ3JhbURldmlydFJlc29sdXRpb246OkJ5QXJnPj4geworICBzdGF0aWMgdm9pZCBpbnB1dE9uZSgKKyAgICAgIElPICZpbywgU3RyaW5nUmVmIEtleSwKKyAgICAgIHN0ZDo6bWFwPHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiwgV2hvbGVQcm9ncmFtRGV2aXJ0UmVzb2x1dGlvbjo6QnlBcmc+ICZWKSB7CisgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IEFyZ3M7CisgICAgc3RkOjpwYWlyPFN0cmluZ1JlZiwgU3RyaW5nUmVmPiBQID0geyIiLCBLZXl9OworICAgIHdoaWxlICghUC5zZWNvbmQuZW1wdHkoKSkgeworICAgICAgUCA9IFAuc2Vjb25kLnNwbGl0KCcsJyk7CisgICAgICB1aW50NjRfdCBBcmc7CisgICAgICBpZiAoUC5maXJzdC5nZXRBc0ludGVnZXIoMCwgQXJnKSkgeworICAgICAgICBpby5zZXRFcnJvcigia2V5IG5vdCBhbiBpbnRlZ2VyIik7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIEFyZ3MucHVzaF9iYWNrKEFyZyk7CisgICAgfQorICAgIGlvLm1hcFJlcXVpcmVkKEtleS5zdHIoKS5jX3N0cigpLCBWW0FyZ3NdKTsKKyAgfQorICBzdGF0aWMgdm9pZCBvdXRwdXQoCisgICAgICBJTyAmaW8sCisgICAgICBzdGQ6Om1hcDxzdGQ6OnZlY3Rvcjx1aW50NjRfdD4sIFdob2xlUHJvZ3JhbURldmlydFJlc29sdXRpb246OkJ5QXJnPiAmVikgeworICAgIGZvciAoYXV0byAmUCA6IFYpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIEtleTsKKyAgICAgIGZvciAodWludDY0X3QgQXJnIDogUC5maXJzdCkgeworICAgICAgICBpZiAoIUtleS5lbXB0eSgpKQorICAgICAgICAgIEtleSArPSAnLCc7CisgICAgICAgIEtleSArPSBsbHZtOjp1dG9zdHIoQXJnKTsKKyAgICAgIH0KKyAgICAgIGlvLm1hcFJlcXVpcmVkKEtleS5jX3N0cigpLCBQLnNlY29uZCk7CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8V2hvbGVQcm9ncmFtRGV2aXJ0UmVzb2x1dGlvbjo6S2luZD4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmaW8sIFdob2xlUHJvZ3JhbURldmlydFJlc29sdXRpb246OktpbmQgJnZhbHVlKSB7CisgICAgaW8uZW51bUNhc2UodmFsdWUsICJJbmRpciIsIFdob2xlUHJvZ3JhbURldmlydFJlc29sdXRpb246OkluZGlyKTsKKyAgICBpby5lbnVtQ2FzZSh2YWx1ZSwgIlNpbmdsZUltcGwiLCBXaG9sZVByb2dyYW1EZXZpcnRSZXNvbHV0aW9uOjpTaW5nbGVJbXBsKTsKKyAgICBpby5lbnVtQ2FzZSh2YWx1ZSwgIkJyYW5jaEZ1bm5lbCIsCisgICAgICAgICAgICAgICAgV2hvbGVQcm9ncmFtRGV2aXJ0UmVzb2x1dGlvbjo6QnJhbmNoRnVubmVsKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8V2hvbGVQcm9ncmFtRGV2aXJ0UmVzb2x1dGlvbj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZpbywgV2hvbGVQcm9ncmFtRGV2aXJ0UmVzb2x1dGlvbiAmcmVzKSB7CisgICAgaW8ubWFwT3B0aW9uYWwoIktpbmQiLCByZXMuVGhlS2luZCk7CisgICAgaW8ubWFwT3B0aW9uYWwoIlNpbmdsZUltcGxOYW1lIiwgcmVzLlNpbmdsZUltcGxOYW1lKTsKKyAgICBpby5tYXBPcHRpb25hbCgiUmVzQnlBcmciLCByZXMuUmVzQnlBcmcpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IEN1c3RvbU1hcHBpbmdUcmFpdHM8c3RkOjptYXA8dWludDY0X3QsIFdob2xlUHJvZ3JhbURldmlydFJlc29sdXRpb24+PiB7CisgIHN0YXRpYyB2b2lkIGlucHV0T25lKElPICZpbywgU3RyaW5nUmVmIEtleSwKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXA8dWludDY0X3QsIFdob2xlUHJvZ3JhbURldmlydFJlc29sdXRpb24+ICZWKSB7CisgICAgdWludDY0X3QgS2V5SW50OworICAgIGlmIChLZXkuZ2V0QXNJbnRlZ2VyKDAsIEtleUludCkpIHsKKyAgICAgIGlvLnNldEVycm9yKCJrZXkgbm90IGFuIGludGVnZXIiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgaW8ubWFwUmVxdWlyZWQoS2V5LnN0cigpLmNfc3RyKCksIFZbS2V5SW50XSk7CisgIH0KKyAgc3RhdGljIHZvaWQgb3V0cHV0KElPICZpbywgc3RkOjptYXA8dWludDY0X3QsIFdob2xlUHJvZ3JhbURldmlydFJlc29sdXRpb24+ICZWKSB7CisgICAgZm9yIChhdXRvICZQIDogVikKKyAgICAgIGlvLm1hcFJlcXVpcmVkKGxsdm06OnV0b3N0cihQLmZpcnN0KS5jX3N0cigpLCBQLnNlY29uZCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPFR5cGVJZFN1bW1hcnk+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmaW8sIFR5cGVJZFN1bW1hcnkmIHN1bW1hcnkpIHsKKyAgICBpby5tYXBPcHRpb25hbCgiVFRSZXMiLCBzdW1tYXJ5LlRUUmVzKTsKKyAgICBpby5tYXBPcHRpb25hbCgiV1BEUmVzIiwgc3VtbWFyeS5XUERSZXMpOworICB9Cit9OworCitzdHJ1Y3QgRnVuY3Rpb25TdW1tYXJ5WWFtbCB7CisgIHVuc2lnbmVkIExpbmthZ2U7CisgIGJvb2wgTm90RWxpZ2libGVUb0ltcG9ydCwgTGl2ZSwgSXNMb2NhbDsKKyAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IFR5cGVUZXN0czsKKyAgc3RkOjp2ZWN0b3I8RnVuY3Rpb25TdW1tYXJ5OjpWRnVuY0lkPiBUeXBlVGVzdEFzc3VtZVZDYWxscywKKyAgICAgIFR5cGVDaGVja2VkTG9hZFZDYWxsczsKKyAgc3RkOjp2ZWN0b3I8RnVuY3Rpb25TdW1tYXJ5OjpDb25zdFZDYWxsPiBUeXBlVGVzdEFzc3VtZUNvbnN0VkNhbGxzLAorICAgICAgVHlwZUNoZWNrZWRMb2FkQ29uc3RWQ2FsbHM7Cit9OworCit9IC8vIEVuZCB5YW1sIG5hbWVzcGFjZQorfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHlhbWwgeworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxGdW5jdGlvblN1bW1hcnk6OlZGdW5jSWQ+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmaW8sIEZ1bmN0aW9uU3VtbWFyeTo6VkZ1bmNJZCYgaWQpIHsKKyAgICBpby5tYXBPcHRpb25hbCgiR1VJRCIsIGlkLkdVSUQpOworICAgIGlvLm1hcE9wdGlvbmFsKCJPZmZzZXQiLCBpZC5PZmZzZXQpOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxGdW5jdGlvblN1bW1hcnk6OkNvbnN0VkNhbGw+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmaW8sIEZ1bmN0aW9uU3VtbWFyeTo6Q29uc3RWQ2FsbCYgaWQpIHsKKyAgICBpby5tYXBPcHRpb25hbCgiVkZ1bmMiLCBpZC5WRnVuYyk7CisgICAgaW8ubWFwT3B0aW9uYWwoIkFyZ3MiLCBpZC5BcmdzKTsKKyAgfQorfTsKKworfSAvLyBFbmQgeWFtbCBuYW1lc3BhY2UKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IoRnVuY3Rpb25TdW1tYXJ5OjpWRnVuY0lkKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihGdW5jdGlvblN1bW1hcnk6OkNvbnN0VkNhbGwpCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSB5YW1sIHsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8RnVuY3Rpb25TdW1tYXJ5WWFtbD4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZpbywgRnVuY3Rpb25TdW1tYXJ5WWFtbCYgc3VtbWFyeSkgeworICAgIGlvLm1hcE9wdGlvbmFsKCJMaW5rYWdlIiwgc3VtbWFyeS5MaW5rYWdlKTsKKyAgICBpby5tYXBPcHRpb25hbCgiTm90RWxpZ2libGVUb0ltcG9ydCIsIHN1bW1hcnkuTm90RWxpZ2libGVUb0ltcG9ydCk7CisgICAgaW8ubWFwT3B0aW9uYWwoIkxpdmUiLCBzdW1tYXJ5LkxpdmUpOworICAgIGlvLm1hcE9wdGlvbmFsKCJMb2NhbCIsIHN1bW1hcnkuSXNMb2NhbCk7CisgICAgaW8ubWFwT3B0aW9uYWwoIlR5cGVUZXN0cyIsIHN1bW1hcnkuVHlwZVRlc3RzKTsKKyAgICBpby5tYXBPcHRpb25hbCgiVHlwZVRlc3RBc3N1bWVWQ2FsbHMiLCBzdW1tYXJ5LlR5cGVUZXN0QXNzdW1lVkNhbGxzKTsKKyAgICBpby5tYXBPcHRpb25hbCgiVHlwZUNoZWNrZWRMb2FkVkNhbGxzIiwgc3VtbWFyeS5UeXBlQ2hlY2tlZExvYWRWQ2FsbHMpOworICAgIGlvLm1hcE9wdGlvbmFsKCJUeXBlVGVzdEFzc3VtZUNvbnN0VkNhbGxzIiwKKyAgICAgICAgICAgICAgICAgICBzdW1tYXJ5LlR5cGVUZXN0QXNzdW1lQ29uc3RWQ2FsbHMpOworICAgIGlvLm1hcE9wdGlvbmFsKCJUeXBlQ2hlY2tlZExvYWRDb25zdFZDYWxscyIsCisgICAgICAgICAgICAgICAgICAgc3VtbWFyeS5UeXBlQ2hlY2tlZExvYWRDb25zdFZDYWxscyk7CisgIH0KK307CisKK30gLy8gRW5kIHlhbWwgbmFtZXNwYWNlCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCitMTFZNX1lBTUxfSVNfU1RSSU5HX01BUChUeXBlSWRTdW1tYXJ5KQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihGdW5jdGlvblN1bW1hcnlZYW1sKQorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgeWFtbCB7CisKKy8vIEZJWE1FOiBBZGQgWUFNTCBtYXBwaW5ncyBmb3IgdGhlIHJlc3Qgb2YgdGhlIG1vZHVsZSBzdW1tYXJ5LgordGVtcGxhdGUgPD4gc3RydWN0IEN1c3RvbU1hcHBpbmdUcmFpdHM8R2xvYmFsVmFsdWVTdW1tYXJ5TWFwVHk+IHsKKyAgc3RhdGljIHZvaWQgaW5wdXRPbmUoSU8gJmlvLCBTdHJpbmdSZWYgS2V5LCBHbG9iYWxWYWx1ZVN1bW1hcnlNYXBUeSAmVikgeworICAgIHN0ZDo6dmVjdG9yPEZ1bmN0aW9uU3VtbWFyeVlhbWw+IEZTdW1zOworICAgIGlvLm1hcFJlcXVpcmVkKEtleS5zdHIoKS5jX3N0cigpLCBGU3Vtcyk7CisgICAgdWludDY0X3QgS2V5SW50OworICAgIGlmIChLZXkuZ2V0QXNJbnRlZ2VyKDAsIEtleUludCkpIHsKKyAgICAgIGlvLnNldEVycm9yKCJrZXkgbm90IGFuIGludGVnZXIiKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgYXV0byBQID0gVi5lbXBsYWNlKEtleUludCwgLypJc0FuYWx5c2lzPSovZmFsc2UpOworICAgIGF1dG8gJkVsZW0gPSAoKlAuZmlyc3QpLnNlY29uZDsKKyAgICBmb3IgKGF1dG8gJkZTdW0gOiBGU3VtcykgeworICAgICAgRWxlbS5TdW1tYXJ5TGlzdC5wdXNoX2JhY2sobGx2bTo6bWFrZV91bmlxdWU8RnVuY3Rpb25TdW1tYXJ5PigKKyAgICAgICAgICBHbG9iYWxWYWx1ZVN1bW1hcnk6OkdWRmxhZ3MoCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEdsb2JhbFZhbHVlOjpMaW5rYWdlVHlwZXM+KEZTdW0uTGlua2FnZSksCisgICAgICAgICAgICAgIEZTdW0uTm90RWxpZ2libGVUb0ltcG9ydCwgRlN1bS5MaXZlLCBGU3VtLklzTG9jYWwpLAorICAgICAgICAgIDAsIEZ1bmN0aW9uU3VtbWFyeTo6RkZsYWdze30sIEFycmF5UmVmPFZhbHVlSW5mbz57fSwKKyAgICAgICAgICBBcnJheVJlZjxGdW5jdGlvblN1bW1hcnk6OkVkZ2VUeT57fSwgc3RkOjptb3ZlKEZTdW0uVHlwZVRlc3RzKSwKKyAgICAgICAgICBzdGQ6Om1vdmUoRlN1bS5UeXBlVGVzdEFzc3VtZVZDYWxscyksCisgICAgICAgICAgc3RkOjptb3ZlKEZTdW0uVHlwZUNoZWNrZWRMb2FkVkNhbGxzKSwKKyAgICAgICAgICBzdGQ6Om1vdmUoRlN1bS5UeXBlVGVzdEFzc3VtZUNvbnN0VkNhbGxzKSwKKyAgICAgICAgICBzdGQ6Om1vdmUoRlN1bS5UeXBlQ2hlY2tlZExvYWRDb25zdFZDYWxscykpKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHZvaWQgb3V0cHV0KElPICZpbywgR2xvYmFsVmFsdWVTdW1tYXJ5TWFwVHkgJlYpIHsKKyAgICBmb3IgKGF1dG8gJlAgOiBWKSB7CisgICAgICBzdGQ6OnZlY3RvcjxGdW5jdGlvblN1bW1hcnlZYW1sPiBGU3VtczsKKyAgICAgIGZvciAoYXV0byAmU3VtIDogUC5zZWNvbmQuU3VtbWFyeUxpc3QpIHsKKyAgICAgICAgaWYgKGF1dG8gKkZTdW0gPSBkeW5fY2FzdDxGdW5jdGlvblN1bW1hcnk+KFN1bS5nZXQoKSkpCisgICAgICAgICAgRlN1bXMucHVzaF9iYWNrKEZ1bmN0aW9uU3VtbWFyeVlhbWx7CisgICAgICAgICAgICAgIEZTdW0tPmZsYWdzKCkuTGlua2FnZSwKKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Ym9vbD4oRlN1bS0+ZmxhZ3MoKS5Ob3RFbGlnaWJsZVRvSW1wb3J0KSwKKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Ym9vbD4oRlN1bS0+ZmxhZ3MoKS5MaXZlKSwKKyAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Ym9vbD4oRlN1bS0+ZmxhZ3MoKS5EU09Mb2NhbCksIEZTdW0tPnR5cGVfdGVzdHMoKSwKKyAgICAgICAgICAgICAgRlN1bS0+dHlwZV90ZXN0X2Fzc3VtZV92Y2FsbHMoKSwgRlN1bS0+dHlwZV9jaGVja2VkX2xvYWRfdmNhbGxzKCksCisgICAgICAgICAgICAgIEZTdW0tPnR5cGVfdGVzdF9hc3N1bWVfY29uc3RfdmNhbGxzKCksCisgICAgICAgICAgICAgIEZTdW0tPnR5cGVfY2hlY2tlZF9sb2FkX2NvbnN0X3ZjYWxscygpfSk7CisgICAgICB9CisgICAgICBpZiAoIUZTdW1zLmVtcHR5KCkpCisgICAgICAgIGlvLm1hcFJlcXVpcmVkKGxsdm06OnV0b3N0cihQLmZpcnN0KS5jX3N0cigpLCBGU3Vtcyk7CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNb2R1bGVTdW1tYXJ5SW5kZXg+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmaW8sIE1vZHVsZVN1bW1hcnlJbmRleCYgaW5kZXgpIHsKKyAgICBpby5tYXBPcHRpb25hbCgiR2xvYmFsVmFsdWVNYXAiLCBpbmRleC5HbG9iYWxWYWx1ZU1hcCk7CisgICAgaW8ubWFwT3B0aW9uYWwoIlR5cGVJZE1hcCIsIGluZGV4LlR5cGVJZE1hcCk7CisgICAgaW8ubWFwT3B0aW9uYWwoIldpdGhHbG9iYWxWYWx1ZURlYWRTdHJpcHBpbmciLAorICAgICAgICAgICAgICAgICAgIGluZGV4LldpdGhHbG9iYWxWYWx1ZURlYWRTdHJpcHBpbmcpOworCisgICAgaWYgKGlvLm91dHB1dHRpbmcoKSkgeworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IENmaUZ1bmN0aW9uRGVmcyhpbmRleC5DZmlGdW5jdGlvbkRlZnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXguQ2ZpRnVuY3Rpb25EZWZzLmVuZCgpKTsKKyAgICAgIGlvLm1hcE9wdGlvbmFsKCJDZmlGdW5jdGlvbkRlZnMiLCBDZmlGdW5jdGlvbkRlZnMpOworICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IENmaUZ1bmN0aW9uRGVjbHMoaW5kZXguQ2ZpRnVuY3Rpb25EZWNscy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXguQ2ZpRnVuY3Rpb25EZWNscy5lbmQoKSk7CisgICAgICBpby5tYXBPcHRpb25hbCgiQ2ZpRnVuY3Rpb25EZWNscyIsIENmaUZ1bmN0aW9uRGVjbHMpOworICAgIH0gZWxzZSB7CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQ2ZpRnVuY3Rpb25EZWZzOworICAgICAgaW8ubWFwT3B0aW9uYWwoIkNmaUZ1bmN0aW9uRGVmcyIsIENmaUZ1bmN0aW9uRGVmcyk7CisgICAgICBpbmRleC5DZmlGdW5jdGlvbkRlZnMgPSB7Q2ZpRnVuY3Rpb25EZWZzLmJlZ2luKCksIENmaUZ1bmN0aW9uRGVmcy5lbmQoKX07CisgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQ2ZpRnVuY3Rpb25EZWNsczsKKyAgICAgIGlvLm1hcE9wdGlvbmFsKCJDZmlGdW5jdGlvbkRlY2xzIiwgQ2ZpRnVuY3Rpb25EZWNscyk7CisgICAgICBpbmRleC5DZmlGdW5jdGlvbkRlY2xzID0ge0NmaUZ1bmN0aW9uRGVjbHMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2ZpRnVuY3Rpb25EZWNscy5lbmQoKX07CisgICAgfQorICB9Cit9OworCit9IC8vIEVuZCB5YW1sIG5hbWVzcGFjZQorfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL05vRm9sZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL05vRm9sZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGVmMDdmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvTm9Gb2xkZXIuaApAQCAtMCwwICsxLDM0MiBAQAorLy89PT0tIE5vRm9sZGVyLmggLSBDb25zdGFudCBmb2xkaW5nIGhlbHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgTm9Gb2xkZXIgY2xhc3MsIGEgaGVscGVyIGZvciBJUkJ1aWxkZXIuICBJdCBwcm92aWRlcworLy8gSVJCdWlsZGVyIHdpdGggYSBzZXQgb2YgbWV0aG9kcyBmb3IgY3JlYXRpbmcgdW5mb2xkZWQgY29uc3RhbnRzLiAgVGhpcyBpcworLy8gdXNlZnVsIGZvciBsZWFybmVycyB0cnlpbmcgdG8gdW5kZXJzdGFuZCBob3cgTExWTSBJUiB3b3JrcywgYW5kIHdobyBkb24ndAorLy8gd2FudCBkZXRhaWxzIHRvIGJlIGhpZGRlbiBieSB0aGUgY29uc3RhbnQgZm9sZGVyLiAgRm9yIGdlbmVyYWwgY29uc3RhbnQKKy8vIGNyZWF0aW9uIGFuZCBmb2xkaW5nLCB1c2UgQ29uc3RhbnRFeHByIGFuZCB0aGUgcm91dGluZXMgaW4KKy8vIGxsdm0vQW5hbHlzaXMvQ29uc3RhbnRGb2xkaW5nLmguCisvLworLy8gTm90ZTogc2luY2UgaXQgaXMgbm90IGFjdHVhbGx5IHBvc3NpYmxlIHRvIGNyZWF0ZSB1bmZvbGRlZCBjb25zdGFudHMsIHRoaXMKKy8vIGNsYXNzIHJldHVybnMgaW5zdHJ1Y3Rpb25zIHJhdGhlciB0aGFuIGNvbnN0YW50cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfTk9GT0xERVJfSAorI2RlZmluZSBMTFZNX0lSX05PRk9MREVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RyVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gTm9Gb2xkZXIgLSBDcmVhdGUgImNvbnN0YW50cyIgKGFjdHVhbGx5LCBpbnN0cnVjdGlvbnMpIHdpdGggbm8gZm9sZGluZy4KK2NsYXNzIE5vRm9sZGVyIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgTm9Gb2xkZXIoKSA9IGRlZmF1bHQ7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEJpbmFyeSBPcGVyYXRvcnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUFkZChDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzTlVXID0gZmFsc2UsIGJvb2wgSGFzTlNXID0gZmFsc2UpIGNvbnN0IHsKKyAgICBCaW5hcnlPcGVyYXRvciAqQk8gPSBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQWRkKExIUywgUkhTKTsKKyAgICBpZiAoSGFzTlVXKSBCTy0+c2V0SGFzTm9VbnNpZ25lZFdyYXAoKTsKKyAgICBpZiAoSGFzTlNXKSBCTy0+c2V0SGFzTm9TaWduZWRXcmFwKCk7CisgICAgcmV0dXJuIEJPOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZU5TV0FkZChDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOU1dBZGQoTEhTLCBSSFMpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZU5VV0FkZChDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOVVdBZGQoTEhTLCBSSFMpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUZBZGQoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRkFkZChMSFMsIFJIUyk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlU3ViKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNOVVcgPSBmYWxzZSwgYm9vbCBIYXNOU1cgPSBmYWxzZSkgY29uc3QgeworICAgIEJpbmFyeU9wZXJhdG9yICpCTyA9IEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTdWIoTEhTLCBSSFMpOworICAgIGlmIChIYXNOVVcpIEJPLT5zZXRIYXNOb1Vuc2lnbmVkV3JhcCgpOworICAgIGlmIChIYXNOU1cpIEJPLT5zZXRIYXNOb1NpZ25lZFdyYXAoKTsKKyAgICByZXR1cm4gQk87CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlTlNXU3ViKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5TV1N1YihMSFMsIFJIUyk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlTlVXU3ViKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5VV1N1YihMSFMsIFJIUyk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlRlN1YihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGU3ViKExIUywgUkhTKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVNdWwoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVyA9IGZhbHNlLCBib29sIEhhc05TVyA9IGZhbHNlKSBjb25zdCB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU11bChMSFMsIFJIUyk7CisgICAgaWYgKEhhc05VVykgQk8tPnNldEhhc05vVW5zaWduZWRXcmFwKCk7CisgICAgaWYgKEhhc05TVykgQk8tPnNldEhhc05vU2lnbmVkV3JhcCgpOworICAgIHJldHVybiBCTzsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVOU1dNdWwoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTlNXTXVsKExIUywgUkhTKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVOVVdNdWwoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTlVXTXVsKExIUywgUkhTKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVGTXVsKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUZNdWwoTEhTLCBSSFMpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZVVEaXYoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0V4YWN0ID0gZmFsc2UpIGNvbnN0IHsKKyAgICBpZiAoIWlzRXhhY3QpCisgICAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVVEaXYoTEhTLCBSSFMpOworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRXhhY3RVRGl2KExIUywgUkhTKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVFeGFjdFVEaXYoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlRXhhY3RVRGl2KExIUywgUkhTKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVTRGl2KENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNFeGFjdCA9IGZhbHNlKSBjb25zdCB7CisgICAgaWYgKCFpc0V4YWN0KQorICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVTRGl2KExIUywgUkhTKTsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUV4YWN0U0RpdihMSFMsIFJIUyk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlRXhhY3RTRGl2KENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUV4YWN0U0RpdihMSFMsIFJIUyk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlRkRpdihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGRGl2KExIUywgUkhTKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVVUmVtKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVVSZW0oTEhTLCBSSFMpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZVNSZW0oQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlU1JlbShMSFMsIFJIUyk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlRlJlbShDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVGUmVtKExIUywgUkhTKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVTaGwoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUywgYm9vbCBIYXNOVVcgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc05TVyA9IGZhbHNlKSBjb25zdCB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZVNobChMSFMsIFJIUyk7CisgICAgaWYgKEhhc05VVykgQk8tPnNldEhhc05vVW5zaWduZWRXcmFwKCk7CisgICAgaWYgKEhhc05TVykgQk8tPnNldEhhc05vU2lnbmVkV3JhcCgpOworICAgIHJldHVybiBCTzsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVMU2hyKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNFeGFjdCA9IGZhbHNlKSBjb25zdCB7CisgICAgaWYgKCFpc0V4YWN0KQorICAgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVMU2hyKExIUywgUkhTKTsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUV4YWN0TFNocihMSFMsIFJIUyk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlQVNocihDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRXhhY3QgPSBmYWxzZSkgY29uc3QgeworICAgIGlmICghaXNFeGFjdCkKKyAgICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlQVNocihMSFMsIFJIUyk7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVFeGFjdEFTaHIoTEhTLCBSSFMpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUFuZChDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVBbmQoTEhTLCBSSFMpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZU9yKENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU9yKExIUywgUkhTKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVYb3IoQ29uc3RhbnQgKkxIUywgQ29uc3RhbnQgKlJIUykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlWG9yKExIUywgUkhTKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVCaW5PcChJbnN0cnVjdGlvbjo6QmluYXJ5T3BzIE9wYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZShPcGMsIExIUywgUkhTKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBVbmFyeSBPcGVyYXRvcnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZU5lZyhDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc05VVyA9IGZhbHNlLCBib29sIEhhc05TVyA9IGZhbHNlKSBjb25zdCB7CisgICAgQmluYXJ5T3BlcmF0b3IgKkJPID0gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZU5lZyhDKTsKKyAgICBpZiAoSGFzTlVXKSBCTy0+c2V0SGFzTm9VbnNpZ25lZFdyYXAoKTsKKyAgICBpZiAoSGFzTlNXKSBCTy0+c2V0SGFzTm9TaWduZWRXcmFwKCk7CisgICAgcmV0dXJuIEJPOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZU5TV05lZyhDb25zdGFudCAqQykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTlNXTmVnKEMpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZU5VV05lZyhDb25zdGFudCAqQykgY29uc3QgeworICAgIHJldHVybiBCaW5hcnlPcGVyYXRvcjo6Q3JlYXRlTlVXTmVnKEMpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUZOZWcoQ29uc3RhbnQgKkMpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluYXJ5T3BlcmF0b3I6OkNyZWF0ZUZOZWcoQyk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlTm90KENvbnN0YW50ICpDKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmFyeU9wZXJhdG9yOjpDcmVhdGVOb3QoQyk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gTWVtb3J5IEluc3RydWN0aW9ucworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBDb25zdGFudCAqQ3JlYXRlR2V0RWxlbWVudFB0cihUeXBlICpUeSwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENvbnN0YW50ICo+IElkeExpc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRHZXRFbGVtZW50UHRyKFR5LCBDLCBJZHhMaXN0KTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVHZXRFbGVtZW50UHRyKFR5cGUgKlR5LCBDb25zdGFudCAqQywgQ29uc3RhbnQgKklkeCkgY29uc3QgeworICAgIC8vIFRoaXMgZm9ybSBvZiB0aGUgZnVuY3Rpb24gb25seSBleGlzdHMgdG8gYXZvaWQgYW1iaWd1b3VzIG92ZXJsb2FkCisgICAgLy8gd2FybmluZ3MgYWJvdXQgd2hldGhlciB0byBjb252ZXJ0IElkeCB0byBBcnJheVJlZjxDb25zdGFudCAqPiBvcgorICAgIC8vIEFycmF5UmVmPFZhbHVlICo+LgorICAgIHJldHVybiBDb25zdGFudEV4cHI6OmdldEdldEVsZW1lbnRQdHIoVHksIEMsIElkeCk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlR2V0RWxlbWVudFB0cihUeXBlICpUeSwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IElkeExpc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gR2V0RWxlbWVudFB0ckluc3Q6OkNyZWF0ZShUeSwgQywgSWR4TGlzdCk7CisgIH0KKworICBDb25zdGFudCAqQ3JlYXRlSW5Cb3VuZHNHZXRFbGVtZW50UHRyKFR5cGUgKlR5LCBDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDb25zdGFudCAqPiBJZHhMaXN0KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50RXhwcjo6Z2V0SW5Cb3VuZHNHZXRFbGVtZW50UHRyKFR5LCBDLCBJZHhMaXN0KTsKKyAgfQorCisgIENvbnN0YW50ICpDcmVhdGVJbkJvdW5kc0dldEVsZW1lbnRQdHIoVHlwZSAqVHksIENvbnN0YW50ICpDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpJZHgpIGNvbnN0IHsKKyAgICAvLyBUaGlzIGZvcm0gb2YgdGhlIGZ1bmN0aW9uIG9ubHkgZXhpc3RzIHRvIGF2b2lkIGFtYmlndW91cyBvdmVybG9hZAorICAgIC8vIHdhcm5pbmdzIGFib3V0IHdoZXRoZXIgdG8gY29udmVydCBJZHggdG8gQXJyYXlSZWY8Q29uc3RhbnQgKj4gb3IKKyAgICAvLyBBcnJheVJlZjxWYWx1ZSAqPi4KKyAgICByZXR1cm4gQ29uc3RhbnRFeHByOjpnZXRJbkJvdW5kc0dldEVsZW1lbnRQdHIoVHksIEMsIElkeCk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlSW5Cb3VuZHNHZXRFbGVtZW50UHRyKFR5cGUgKlR5LCBDb25zdGFudCAqQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxWYWx1ZSAqPiBJZHhMaXN0KSBjb25zdCB7CisgICAgcmV0dXJuIEdldEVsZW1lbnRQdHJJbnN0OjpDcmVhdGVJbkJvdW5kcyhUeSwgQywgSWR4TGlzdCk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQ2FzdC9Db252ZXJzaW9uIE9wZXJhdG9ycworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlQ2FzdChJbnN0cnVjdGlvbjo6Q2FzdE9wcyBPcCwgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgIFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIHJldHVybiBDYXN0SW5zdDo6Q3JlYXRlKE9wLCBDLCBEZXN0VHkpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZVBvaW50ZXJDYXN0KENvbnN0YW50ICpDLCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2FzdEluc3Q6OkNyZWF0ZVBvaW50ZXJDYXN0KEMsIERlc3RUeSk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlSW50Q2FzdChDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5LAorICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzU2lnbmVkKSBjb25zdCB7CisgICAgcmV0dXJuIENhc3RJbnN0OjpDcmVhdGVJbnRlZ2VyQ2FzdChDLCBEZXN0VHksIGlzU2lnbmVkKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVGUENhc3QoQ29uc3RhbnQgKkMsIFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIHJldHVybiBDYXN0SW5zdDo6Q3JlYXRlRlBDYXN0KEMsIERlc3RUeSk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlQml0Q2FzdChDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgcmV0dXJuIENyZWF0ZUNhc3QoSW5zdHJ1Y3Rpb246OkJpdENhc3QsIEMsIERlc3RUeSk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqQ3JlYXRlSW50VG9QdHIoQ29uc3RhbnQgKkMsIFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIHJldHVybiBDcmVhdGVDYXN0KEluc3RydWN0aW9uOjpJbnRUb1B0ciwgQywgRGVzdFR5KTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVQdHJUb0ludChDb25zdGFudCAqQywgVHlwZSAqRGVzdFR5KSBjb25zdCB7CisgICAgcmV0dXJuIENyZWF0ZUNhc3QoSW5zdHJ1Y3Rpb246OlB0clRvSW50LCBDLCBEZXN0VHkpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZVpFeHRPckJpdENhc3QoQ29uc3RhbnQgKkMsIFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIHJldHVybiBDYXN0SW5zdDo6Q3JlYXRlWkV4dE9yQml0Q2FzdChDLCBEZXN0VHkpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZVNFeHRPckJpdENhc3QoQ29uc3RhbnQgKkMsIFR5cGUgKkRlc3RUeSkgY29uc3QgeworICAgIHJldHVybiBDYXN0SW5zdDo6Q3JlYXRlU0V4dE9yQml0Q2FzdChDLCBEZXN0VHkpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZVRydW5jT3JCaXRDYXN0KENvbnN0YW50ICpDLCBUeXBlICpEZXN0VHkpIGNvbnN0IHsKKyAgICByZXR1cm4gQ2FzdEluc3Q6OkNyZWF0ZVRydW5jT3JCaXRDYXN0KEMsIERlc3RUeSk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gQ29tcGFyZSBJbnN0cnVjdGlvbnMKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUlDbXAoQ21wSW5zdDo6UHJlZGljYXRlIFAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpMSFMsIENvbnN0YW50ICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gbmV3IElDbXBJbnN0KFAsIExIUywgUkhTKTsKKyAgfQorCisgIEluc3RydWN0aW9uICpDcmVhdGVGQ21wKENtcEluc3Q6OlByZWRpY2F0ZSBQLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudCAqTEhTLCBDb25zdGFudCAqUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBGQ21wSW5zdChQLCBMSFMsIFJIUyk7CisgIH0KKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gT3RoZXIgSW5zdHJ1Y3Rpb25zCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIEluc3RydWN0aW9uICpDcmVhdGVTZWxlY3QoQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKlRydWUsIENvbnN0YW50ICpGYWxzZSkgY29uc3QgeworICAgIHJldHVybiBTZWxlY3RJbnN0OjpDcmVhdGUoQywgVHJ1ZSwgRmFsc2UpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUV4dHJhY3RFbGVtZW50KENvbnN0YW50ICpWZWMsIENvbnN0YW50ICpJZHgpIGNvbnN0IHsKKyAgICByZXR1cm4gRXh0cmFjdEVsZW1lbnRJbnN0OjpDcmVhdGUoVmVjLCBJZHgpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUluc2VydEVsZW1lbnQoQ29uc3RhbnQgKlZlYywgQ29uc3RhbnQgKk5ld0VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnQgKklkeCkgY29uc3QgeworICAgIHJldHVybiBJbnNlcnRFbGVtZW50SW5zdDo6Q3JlYXRlKFZlYywgTmV3RWx0LCBJZHgpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZVNodWZmbGVWZWN0b3IoQ29uc3RhbnQgKlYxLCBDb25zdGFudCAqVjIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpNYXNrKSBjb25zdCB7CisgICAgcmV0dXJuIG5ldyBTaHVmZmxlVmVjdG9ySW5zdChWMSwgVjIsIE1hc2spOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUV4dHJhY3RWYWx1ZShDb25zdGFudCAqQWdnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVuc2lnbmVkPiBJZHhMaXN0KSBjb25zdCB7CisgICAgcmV0dXJuIEV4dHJhY3RWYWx1ZUluc3Q6OkNyZWF0ZShBZ2csIElkeExpc3QpOworICB9CisKKyAgSW5zdHJ1Y3Rpb24gKkNyZWF0ZUluc2VydFZhbHVlKENvbnN0YW50ICpBZ2csIENvbnN0YW50ICpWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1bnNpZ25lZD4gSWR4TGlzdCkgY29uc3QgeworICAgIHJldHVybiBJbnNlcnRWYWx1ZUluc3Q6OkNyZWF0ZShBZ2csIFZhbCwgSWR4TGlzdCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX05PRk9MREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvT3BlcmFuZFRyYWl0cy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9PcGVyYW5kVHJhaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzYxOGFmZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvT3BlcmFuZFRyYWl0cy5oCkBAIC0wLDAgKzEsMTYzIEBACisvLz09PS0tIGxsdm0vT3BlcmFuZFRyYWl0cy5oIC0gT3BlcmFuZFRyYWl0cyBjbGFzcyBkZWZpbml0aW9uIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB0cmFpdHMgY2xhc3NlcyB0aGF0IGFyZSBoYW5keSBmb3IgZW5mb3JjaW5nIHRoZSBjb3JyZWN0CisvLyBsYXlvdXQgb2YgdmFyaW91cyBVc2VyIHN1YmNsYXNzZXMuIEl0IGFsc28gcHJvdmlkZXMgdGhlIG1lYW5zIGZvciBhY2Nlc3NpbmcKKy8vIHRoZSBvcGVyYW5kcyBpbiB0aGUgbW9zdCBlZmZpY2llbnQgbWFubmVyLgorLy8KKworI2lmbmRlZiBMTFZNX0lSX09QRVJBTkRUUkFJVFNfSAorI2RlZmluZSBMTFZNX0lSX09QRVJBTkRUUkFJVFNfSAorCisjaW5jbHVkZSAibGx2bS9JUi9Vc2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBGaXhlZE51bU9wZXJhbmQgVHJhaXQgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBGaXhlZE51bU9wZXJhbmRUcmFpdHMgLSBkZXRlcm1pbmUgdGhlIGFsbG9jYXRpb24gcmVnaW1lIG9mIHRoZSBVc2UgYXJyYXkKKy8vLyB3aGVuIGl0IGlzIGEgcHJlZml4IHRvIHRoZSBVc2VyIG9iamVjdCwgYW5kIHRoZSBudW1iZXIgb2YgVXNlIG9iamVjdHMgaXMKKy8vLyBrbm93biBhdCBjb21waWxlIHRpbWUuCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTdWJDbGFzcywgdW5zaWduZWQgQVJJVFk+CitzdHJ1Y3QgRml4ZWROdW1PcGVyYW5kVHJhaXRzIHsKKyAgc3RhdGljIFVzZSAqb3BfYmVnaW4oU3ViQ2xhc3MqIFUpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICAhc3RkOjppc19wb2x5bW9ycGhpYzxTdWJDbGFzcz46OnZhbHVlLAorICAgICAgICAiYWRkaW5nIHZpcnR1YWwgbWV0aG9kcyB0byBzdWJjbGFzc2VzIG9mIFVzZXIgYnJlYWtzIHVzZSBsaXN0cyIpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFVzZSo+KFUpIC0gQVJJVFk7CisgIH0KKyAgc3RhdGljIFVzZSAqb3BfZW5kKFN1YkNsYXNzKiBVKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VXNlKj4oVSk7CisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIG9wZXJhbmRzKGNvbnN0IFVzZXIqKSB7CisgICAgcmV0dXJuIEFSSVRZOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsT3BlcmFuZCBUcmFpdCBDbGFzcworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIE9wdGlvbmFsT3BlcmFuZFRyYWl0cyAtIHdoZW4gdGhlIG51bWJlciBvZiBvcGVyYW5kcyBtYXkgY2hhbmdlIGF0IHJ1bnRpbWUuCisvLy8gTmF0dXJhbGx5IGl0IG1heSBvbmx5IGRlY3JlYXNlLCBiZWNhdXNlIHRoZSBhbGxvY2F0aW9ucyBtYXkgbm90IGNoYW5nZS4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFN1YkNsYXNzLCB1bnNpZ25lZCBBUklUWSA9IDE+CitzdHJ1Y3QgT3B0aW9uYWxPcGVyYW5kVHJhaXRzIDogcHVibGljIEZpeGVkTnVtT3BlcmFuZFRyYWl0czxTdWJDbGFzcywgQVJJVFk+IHsKKyAgc3RhdGljIHVuc2lnbmVkIG9wZXJhbmRzKGNvbnN0IFVzZXIgKlUpIHsKKyAgICByZXR1cm4gVS0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBWYXJpYWRpY09wZXJhbmQgVHJhaXQgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBWYXJpYWRpY09wZXJhbmRUcmFpdHMgLSBkZXRlcm1pbmUgdGhlIGFsbG9jYXRpb24gcmVnaW1lIG9mIHRoZSBVc2UgYXJyYXkKKy8vLyB3aGVuIGl0IGlzIGEgcHJlZml4IHRvIHRoZSBVc2VyIG9iamVjdCwgYW5kIHRoZSBudW1iZXIgb2YgVXNlIG9iamVjdHMgaXMKKy8vLyBvbmx5IGtub3duIGF0IGFsbG9jYXRpb24gdGltZS4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFN1YkNsYXNzLCB1bnNpZ25lZCBNSU5BUklUWSA9IDA+CitzdHJ1Y3QgVmFyaWFkaWNPcGVyYW5kVHJhaXRzIHsKKyAgc3RhdGljIFVzZSAqb3BfYmVnaW4oU3ViQ2xhc3MqIFUpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KAorICAgICAgICAhc3RkOjppc19wb2x5bW9ycGhpYzxTdWJDbGFzcz46OnZhbHVlLAorICAgICAgICAiYWRkaW5nIHZpcnR1YWwgbWV0aG9kcyB0byBzdWJjbGFzc2VzIG9mIFVzZXIgYnJlYWtzIHVzZSBsaXN0cyIpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFVzZSo+KFUpIC0gc3RhdGljX2Nhc3Q8VXNlcio+KFUpLT5nZXROdW1PcGVyYW5kcygpOworICB9CisgIHN0YXRpYyBVc2UgKm9wX2VuZChTdWJDbGFzcyogVSkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFVzZSo+KFUpOworICB9CisgIHN0YXRpYyB1bnNpZ25lZCBvcGVyYW5kcyhjb25zdCBVc2VyICpVKSB7CisgICAgcmV0dXJuIFUtPmdldE51bU9wZXJhbmRzKCk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgSHVuZ29mZk9wZXJhbmQgVHJhaXQgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBIdW5nb2ZmT3BlcmFuZFRyYWl0cyAtIGRldGVybWluZSB0aGUgYWxsb2NhdGlvbiByZWdpbWUgb2YgdGhlIFVzZSBhcnJheQorLy8vIHdoZW4gaXQgaXMgbm90IGEgcHJlZml4IHRvIHRoZSBVc2VyIG9iamVjdCwgYnV0IGFsbG9jYXRlZCBhdCBhbiB1bnJlbGF0ZWQKKy8vLyBoZWFwIGFkZHJlc3MuCisvLy8KKy8vLyBUaGlzIGlzIHRoZSB0cmFpdHMgY2xhc3MgdGhhdCBpcyBuZWVkZWQgd2hlbiB0aGUgVXNlIGFycmF5IG11c3QgYmUKKy8vLyByZXNpemFibGUuCisKK3RlbXBsYXRlIDx1bnNpZ25lZCBNSU5BUklUWSA9IDE+CitzdHJ1Y3QgSHVuZ29mZk9wZXJhbmRUcmFpdHMgeworICBzdGF0aWMgVXNlICpvcF9iZWdpbihVc2VyKiBVKSB7CisgICAgcmV0dXJuIFUtPmdldE9wZXJhbmRMaXN0KCk7CisgIH0KKyAgc3RhdGljIFVzZSAqb3BfZW5kKFVzZXIqIFUpIHsKKyAgICByZXR1cm4gVS0+Z2V0T3BlcmFuZExpc3QoKSArIFUtPmdldE51bU9wZXJhbmRzKCk7CisgIH0KKyAgc3RhdGljIHVuc2lnbmVkIG9wZXJhbmRzKGNvbnN0IFVzZXIgKlUpIHsKKyAgICByZXR1cm4gVS0+Z2V0TnVtT3BlcmFuZHMoKTsKKyAgfQorfTsKKworLy8vIE1hY3JvIGZvciBnZW5lcmF0aW5nIGluLWNsYXNzIG9wZXJhbmQgYWNjZXNzb3IgZGVjbGFyYXRpb25zLgorLy8vIEl0IHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpbiB0aGUgcHVibGljIHNlY3Rpb24gb2YgdGhlIGludGVyZmFjZS4KKy8vLworI2RlZmluZSBERUNMQVJFX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKFZBTFVFQ0xBU1MpIFwKKyAgcHVibGljOiBcCisgIGlubGluZSBWQUxVRUNMQVNTICpnZXRPcGVyYW5kKHVuc2lnbmVkKSBjb25zdDsgXAorICBpbmxpbmUgdm9pZCBzZXRPcGVyYW5kKHVuc2lnbmVkLCBWQUxVRUNMQVNTKik7IFwKKyAgaW5saW5lIG9wX2l0ZXJhdG9yIG9wX2JlZ2luKCk7IFwKKyAgaW5saW5lIGNvbnN0X29wX2l0ZXJhdG9yIG9wX2JlZ2luKCkgY29uc3Q7IFwKKyAgaW5saW5lIG9wX2l0ZXJhdG9yIG9wX2VuZCgpOyBcCisgIGlubGluZSBjb25zdF9vcF9pdGVyYXRvciBvcF9lbmQoKSBjb25zdDsgXAorICBwcm90ZWN0ZWQ6IFwKKyAgdGVtcGxhdGUgPGludD4gaW5saW5lIFVzZSAmT3AoKTsgXAorICB0ZW1wbGF0ZSA8aW50PiBpbmxpbmUgY29uc3QgVXNlICZPcCgpIGNvbnN0OyBcCisgIHB1YmxpYzogXAorICBpbmxpbmUgdW5zaWduZWQgZ2V0TnVtT3BlcmFuZHMoKSBjb25zdAorCisvLy8gTWFjcm8gZm9yIGdlbmVyYXRpbmcgb3V0LW9mLWNsYXNzIG9wZXJhbmQgYWNjZXNzb3IgZGVmaW5pdGlvbnMKKyNkZWZpbmUgREVGSU5FX1RSQU5TUEFSRU5UX09QRVJBTkRfQUNDRVNTT1JTKENMQVNTLCBWQUxVRUNMQVNTKSBcCitDTEFTUzo6b3BfaXRlcmF0b3IgQ0xBU1M6Om9wX2JlZ2luKCkgeyBcCisgIHJldHVybiBPcGVyYW5kVHJhaXRzPENMQVNTPjo6b3BfYmVnaW4odGhpcyk7IFwKK30gXAorQ0xBU1M6OmNvbnN0X29wX2l0ZXJhdG9yIENMQVNTOjpvcF9iZWdpbigpIGNvbnN0IHsgXAorICByZXR1cm4gT3BlcmFuZFRyYWl0czxDTEFTUz46Om9wX2JlZ2luKGNvbnN0X2Nhc3Q8Q0xBU1MqPih0aGlzKSk7IFwKK30gXAorQ0xBU1M6Om9wX2l0ZXJhdG9yIENMQVNTOjpvcF9lbmQoKSB7IFwKKyAgcmV0dXJuIE9wZXJhbmRUcmFpdHM8Q0xBU1M+OjpvcF9lbmQodGhpcyk7IFwKK30gXAorQ0xBU1M6OmNvbnN0X29wX2l0ZXJhdG9yIENMQVNTOjpvcF9lbmQoKSBjb25zdCB7IFwKKyAgcmV0dXJuIE9wZXJhbmRUcmFpdHM8Q0xBU1M+OjpvcF9lbmQoY29uc3RfY2FzdDxDTEFTUyo+KHRoaXMpKTsgXAorfSBcCitWQUxVRUNMQVNTICpDTEFTUzo6Z2V0T3BlcmFuZCh1bnNpZ25lZCBpX25vY2FwdHVyZSkgY29uc3QgeyBcCisgIGFzc2VydChpX25vY2FwdHVyZSA8IE9wZXJhbmRUcmFpdHM8Q0xBU1M+OjpvcGVyYW5kcyh0aGlzKSBcCisgICAgICAgICAmJiAiZ2V0T3BlcmFuZCgpIG91dCBvZiByYW5nZSEiKTsgXAorICByZXR1cm4gY2FzdF9vcl9udWxsPFZBTFVFQ0xBU1M+KCBcCisgICAgT3BlcmFuZFRyYWl0czxDTEFTUz46Om9wX2JlZ2luKGNvbnN0X2Nhc3Q8Q0xBU1MqPih0aGlzKSlbaV9ub2NhcHR1cmVdLmdldCgpKTsgXAorfSBcCit2b2lkIENMQVNTOjpzZXRPcGVyYW5kKHVuc2lnbmVkIGlfbm9jYXB0dXJlLCBWQUxVRUNMQVNTICpWYWxfbm9jYXB0dXJlKSB7IFwKKyAgYXNzZXJ0KGlfbm9jYXB0dXJlIDwgT3BlcmFuZFRyYWl0czxDTEFTUz46Om9wZXJhbmRzKHRoaXMpIFwKKyAgICAgICAgICYmICJzZXRPcGVyYW5kKCkgb3V0IG9mIHJhbmdlISIpOyBcCisgIE9wZXJhbmRUcmFpdHM8Q0xBU1M+OjpvcF9iZWdpbih0aGlzKVtpX25vY2FwdHVyZV0gPSBWYWxfbm9jYXB0dXJlOyBcCit9IFwKK3Vuc2lnbmVkIENMQVNTOjpnZXROdW1PcGVyYW5kcygpIGNvbnN0IHsgXAorICByZXR1cm4gT3BlcmFuZFRyYWl0czxDTEFTUz46Om9wZXJhbmRzKHRoaXMpOyBcCit9IFwKK3RlbXBsYXRlIDxpbnQgSWR4X25vY2FwdHVyZT4gVXNlICZDTEFTUzo6T3AoKSB7IFwKKyAgcmV0dXJuIHRoaXMtPk9wRnJvbTxJZHhfbm9jYXB0dXJlPih0aGlzKTsgXAorfSBcCit0ZW1wbGF0ZSA8aW50IElkeF9ub2NhcHR1cmU+IGNvbnN0IFVzZSAmQ0xBU1M6Ok9wKCkgY29uc3QgeyBcCisgIHJldHVybiB0aGlzLT5PcEZyb208SWR4X25vY2FwdHVyZT4odGhpcyk7IFwKK30KKworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvT3BlcmF0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvT3BlcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTc0NmU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9PcGVyYXRvci5oCkBAIC0wLDAgKzEsNTY2IEBACisvLz09PS0tIGxsdm0vT3BlcmF0b3IuaCAtIE9wZXJhdG9yIHV0aWxpdHkgc3ViY2xhc3MgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHZhcmlvdXMgY2xhc3NlcyBmb3Igd29ya2luZyB3aXRoIEluc3RydWN0aW9ucyBhbmQKKy8vIENvbnN0YW50RXhwcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX09QRVJBVE9SX0gKKyNkZWZpbmUgTExWTV9JUl9PUEVSQVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9Ob25lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50cy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1R5cGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBUaGlzIGlzIGEgdXRpbGl0eSBjbGFzcyB0aGF0IHByb3ZpZGVzIGFuIGFic3RyYWN0aW9uIGZvciB0aGUgY29tbW9uCisvLy8gZnVuY3Rpb25hbGl0eSBiZXR3ZWVuIEluc3RydWN0aW9ucyBhbmQgQ29uc3RhbnRFeHBycy4KK2NsYXNzIE9wZXJhdG9yIDogcHVibGljIFVzZXIgeworcHVibGljOgorICAvLyBUaGUgT3BlcmF0b3IgY2xhc3MgaXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBhcyBhIHV0aWxpdHksIGFuZCBpcyBuZXZlciBpdHNlbGYKKyAgLy8gaW5zdGFudGlhdGVkLgorICBPcGVyYXRvcigpID0gZGVsZXRlOworICB+T3BlcmF0b3IoKSA9IGRlbGV0ZTsKKworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpID0gZGVsZXRlOworCisgIC8vLyBSZXR1cm4gdGhlIG9wY29kZSBmb3IgdGhpcyBJbnN0cnVjdGlvbiBvciBDb25zdGFudEV4cHIuCisgIHVuc2lnbmVkIGdldE9wY29kZSgpIGNvbnN0IHsKKyAgICBpZiAoY29uc3QgSW5zdHJ1Y3Rpb24gKkkgPSBkeW5fY2FzdDxJbnN0cnVjdGlvbj4odGhpcykpCisgICAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCk7CisgICAgcmV0dXJuIGNhc3Q8Q29uc3RhbnRFeHByPih0aGlzKS0+Z2V0T3Bjb2RlKCk7CisgIH0KKworICAvLy8gSWYgViBpcyBhbiBJbnN0cnVjdGlvbiBvciBDb25zdGFudEV4cHIsIHJldHVybiBpdHMgb3Bjb2RlLgorICAvLy8gT3RoZXJ3aXNlIHJldHVybiBVc2VyT3AxLgorICBzdGF0aWMgdW5zaWduZWQgZ2V0T3Bjb2RlKGNvbnN0IFZhbHVlICpWKSB7CisgICAgaWYgKGNvbnN0IEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFYpKQorICAgICAgcmV0dXJuIEktPmdldE9wY29kZSgpOworICAgIGlmIChjb25zdCBDb25zdGFudEV4cHIgKkNFID0gZHluX2Nhc3Q8Q29uc3RhbnRFeHByPihWKSkKKyAgICAgIHJldHVybiBDRS0+Z2V0T3Bjb2RlKCk7CisgICAgcmV0dXJuIEluc3RydWN0aW9uOjpVc2VyT3AxOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqKSB7IHJldHVybiB0cnVlOyB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ29uc3RhbnRFeHByICopIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpIHx8IGlzYTxDb25zdGFudEV4cHI+KFYpOworICB9Cit9OworCisvLy8gVXRpbGl0eSBjbGFzcyBmb3IgaW50ZWdlciBvcGVyYXRvcnMgd2hpY2ggbWF5IGV4aGliaXQgb3ZlcmZsb3cgLSBBZGQsIFN1YiwKKy8vLyBNdWwsIGFuZCBTaGwuIEl0IGRvZXMgbm90IGluY2x1ZGUgU0RpdiwgZGVzcGl0ZSB0aGF0IG9wZXJhdG9yIGhhdmluZyB0aGUKKy8vLyBwb3RlbnRpYWwgZm9yIG92ZXJmbG93LgorY2xhc3MgT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvciA6IHB1YmxpYyBPcGVyYXRvciB7CitwdWJsaWM6CisgIGVudW0geworICAgIE5vVW5zaWduZWRXcmFwID0gKDEgPDwgMCksCisgICAgTm9TaWduZWRXcmFwICAgPSAoMSA8PCAxKQorICB9OworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudEV4cHI7CisKKyAgdm9pZCBzZXRIYXNOb1Vuc2lnbmVkV3JhcChib29sIEIpIHsKKyAgICBTdWJjbGFzc09wdGlvbmFsRGF0YSA9CisgICAgICAoU3ViY2xhc3NPcHRpb25hbERhdGEgJiB+Tm9VbnNpZ25lZFdyYXApIHwgKEIgKiBOb1Vuc2lnbmVkV3JhcCk7CisgIH0KKyAgdm9pZCBzZXRIYXNOb1NpZ25lZFdyYXAoYm9vbCBCKSB7CisgICAgU3ViY2xhc3NPcHRpb25hbERhdGEgPQorICAgICAgKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgfk5vU2lnbmVkV3JhcCkgfCAoQiAqIE5vU2lnbmVkV3JhcCk7CisgIH0KKworcHVibGljOgorICAvLy8gVGVzdCB3aGV0aGVyIHRoaXMgb3BlcmF0aW9uIGlzIGtub3duIHRvIG5ldmVyCisgIC8vLyB1bmRlcmdvIHVuc2lnbmVkIG92ZXJmbG93LCBha2EgdGhlIG51dyBwcm9wZXJ0eS4KKyAgYm9vbCBoYXNOb1Vuc2lnbmVkV3JhcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3ViY2xhc3NPcHRpb25hbERhdGEgJiBOb1Vuc2lnbmVkV3JhcDsKKyAgfQorCisgIC8vLyBUZXN0IHdoZXRoZXIgdGhpcyBvcGVyYXRpb24gaXMga25vd24gdG8gbmV2ZXIKKyAgLy8vIHVuZGVyZ28gc2lnbmVkIG92ZXJmbG93LCBha2EgdGhlIG5zdyBwcm9wZXJ0eS4KKyAgYm9vbCBoYXNOb1NpZ25lZFdyYXAoKSBjb25zdCB7CisgICAgcmV0dXJuIChTdWJjbGFzc09wdGlvbmFsRGF0YSAmIE5vU2lnbmVkV3JhcCkgIT0gMDsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OkFkZCB8fAorICAgICAgICAgICBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6U3ViIHx8CisgICAgICAgICAgIEktPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpNdWwgfHwKKyAgICAgICAgICAgSS0+Z2V0T3Bjb2RlKCkgPT0gSW5zdHJ1Y3Rpb246OlNobDsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENvbnN0YW50RXhwciAqQ0UpIHsKKyAgICByZXR1cm4gQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpBZGQgfHwKKyAgICAgICAgICAgQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTdWIgfHwKKyAgICAgICAgICAgQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpNdWwgfHwKKyAgICAgICAgICAgQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTaGw7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiAoaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKSkgfHwKKyAgICAgICAgICAgKGlzYTxDb25zdGFudEV4cHI+KFYpICYmIGNsYXNzb2YoY2FzdDxDb25zdGFudEV4cHI+KFYpKSk7CisgIH0KK307CisKKy8vLyBBIHVkaXYgb3Igc2RpdiBpbnN0cnVjdGlvbiwgd2hpY2ggY2FuIGJlIG1hcmtlZCBhcyAiZXhhY3QiLAorLy8vIGluZGljYXRpbmcgdGhhdCBubyBiaXRzIGFyZSBkZXN0cm95ZWQuCitjbGFzcyBQb3NzaWJseUV4YWN0T3BlcmF0b3IgOiBwdWJsaWMgT3BlcmF0b3IgeworcHVibGljOgorICBlbnVtIHsKKyAgICBJc0V4YWN0ID0gKDEgPDwgMCkKKyAgfTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIEluc3RydWN0aW9uOworICBmcmllbmQgY2xhc3MgQ29uc3RhbnRFeHByOworCisgIHZvaWQgc2V0SXNFeGFjdChib29sIEIpIHsKKyAgICBTdWJjbGFzc09wdGlvbmFsRGF0YSA9IChTdWJjbGFzc09wdGlvbmFsRGF0YSAmIH5Jc0V4YWN0KSB8IChCICogSXNFeGFjdCk7CisgIH0KKworcHVibGljOgorICAvLy8gVGVzdCB3aGV0aGVyIHRoaXMgZGl2aXNpb24gaXMga25vd24gdG8gYmUgZXhhY3QsIHdpdGggemVybyByZW1haW5kZXIuCisgIGJvb2wgaXNFeGFjdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3ViY2xhc3NPcHRpb25hbERhdGEgJiBJc0V4YWN0OworICB9CisKKyAgc3RhdGljIGJvb2wgaXNQb3NzaWJseUV4YWN0T3Bjb2RlKHVuc2lnbmVkIE9wQykgeworICAgIHJldHVybiBPcEMgPT0gSW5zdHJ1Y3Rpb246OlNEaXYgfHwKKyAgICAgICAgICAgT3BDID09IEluc3RydWN0aW9uOjpVRGl2IHx8CisgICAgICAgICAgIE9wQyA9PSBJbnN0cnVjdGlvbjo6QVNociB8fAorICAgICAgICAgICBPcEMgPT0gSW5zdHJ1Y3Rpb246OkxTaHI7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENvbnN0YW50RXhwciAqQ0UpIHsKKyAgICByZXR1cm4gaXNQb3NzaWJseUV4YWN0T3Bjb2RlKENFLT5nZXRPcGNvZGUoKSk7CisgIH0KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnN0cnVjdGlvbiAqSSkgeworICAgIHJldHVybiBpc1Bvc3NpYmx5RXhhY3RPcGNvZGUoSS0+Z2V0T3Bjb2RlKCkpOworICB9CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gKGlzYTxJbnN0cnVjdGlvbj4oVikgJiYgY2xhc3NvZihjYXN0PEluc3RydWN0aW9uPihWKSkpIHx8CisgICAgICAgICAgIChpc2E8Q29uc3RhbnRFeHByPihWKSAmJiBjbGFzc29mKGNhc3Q8Q29uc3RhbnRFeHByPihWKSkpOworICB9Cit9OworCisvLy8gQ29udmVuaWVuY2Ugc3RydWN0IGZvciBzcGVjaWZ5aW5nIGFuZCByZWFzb25pbmcgYWJvdXQgZmFzdC1tYXRoIGZsYWdzLgorY2xhc3MgRmFzdE1hdGhGbGFncyB7Citwcml2YXRlOgorICBmcmllbmQgY2xhc3MgRlBNYXRoT3BlcmF0b3I7CisKKyAgdW5zaWduZWQgRmxhZ3MgPSAwOworCisgIEZhc3RNYXRoRmxhZ3ModW5zaWduZWQgRikgeworICAgIC8vIElmIGFsbCA3IGJpdHMgYXJlIHNldCwgdHVybiB0aGlzIGludG8gLTEuIElmIHRoZSBudW1iZXIgb2YgYml0cyBncm93cywKKyAgICAvLyB0aGlzIG11c3QgYmUgdXBkYXRlZC4gVGhpcyBpcyBpbnRlbmRlZCB0byBwcm92aWRlIHNvbWUgZm9yd2FyZCBiaW5hcnkKKyAgICAvLyBjb21wYXRpYmlsaXR5IGluc3VyYW5jZSBmb3IgdGhlIG1lYW5pbmcgb2YgJ2Zhc3QnIGluIGNhc2UgYml0cyBhcmUgYWRkZWQuCisgICAgaWYgKEYgPT0gMHg3RikgRmxhZ3MgPSB+MFU7CisgICAgZWxzZSBGbGFncyA9IEY7CisgIH0KKworcHVibGljOgorICAvLyBUaGlzIGlzIGhvdyB0aGUgYml0cyBhcmUgdXNlZCBpbiBWYWx1ZTo6U3ViY2xhc3NPcHRpb25hbERhdGEgc28gdGhleQorICAvLyBzaG91bGQgZml0IHRoZXJlIHRvby4KKyAgLy8gV0FSTklORzogV2UncmUgb3V0IG9mIHNwYWNlLiBTdWJjbGFzc09wdGlvbmFsRGF0YSBvbmx5IGhhcyA3IGJpdHMuIE5ldworICAvLyBmdW5jdGlvbmFsaXR5IHdpbGwgcmVxdWlyZSBhIGNoYW5nZSBpbiBob3cgdGhpcyBpbmZvcm1hdGlvbiBpcyBzdG9yZWQuCisgIGVudW0geworICAgIEFsbG93UmVhc3NvYyAgICA9ICgxIDw8IDApLAorICAgIE5vTmFOcyAgICAgICAgICA9ICgxIDw8IDEpLAorICAgIE5vSW5mcyAgICAgICAgICA9ICgxIDw8IDIpLAorICAgIE5vU2lnbmVkWmVyb3MgICA9ICgxIDw8IDMpLAorICAgIEFsbG93UmVjaXByb2NhbCA9ICgxIDw8IDQpLAorICAgIEFsbG93Q29udHJhY3QgICA9ICgxIDw8IDUpLAorICAgIEFwcHJveEZ1bmMgICAgICA9ICgxIDw8IDYpCisgIH07CisKKyAgRmFzdE1hdGhGbGFncygpID0gZGVmYXVsdDsKKworICBib29sIGFueSgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICE9IDA7IH0KKyAgYm9vbCBub25lKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgPT0gMDsgfQorICBib29sIGFsbCgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzID09IH4wVTsgfQorCisgIHZvaWQgY2xlYXIoKSB7IEZsYWdzID0gMDsgfQorICB2b2lkIHNldCgpICAgeyBGbGFncyA9IH4wVTsgfQorCisgIC8vLyBGbGFnIHF1ZXJpZXMKKyAgYm9vbCBhbGxvd1JlYXNzb2MoKSBjb25zdCAgICB7IHJldHVybiAwICE9IChGbGFncyAmIEFsbG93UmVhc3NvYyk7IH0KKyAgYm9vbCBub05hTnMoKSBjb25zdCAgICAgICAgICB7IHJldHVybiAwICE9IChGbGFncyAmIE5vTmFOcyk7IH0KKyAgYm9vbCBub0luZnMoKSBjb25zdCAgICAgICAgICB7IHJldHVybiAwICE9IChGbGFncyAmIE5vSW5mcyk7IH0KKyAgYm9vbCBub1NpZ25lZFplcm9zKCkgY29uc3QgICB7IHJldHVybiAwICE9IChGbGFncyAmIE5vU2lnbmVkWmVyb3MpOyB9CisgIGJvb2wgYWxsb3dSZWNpcHJvY2FsKCkgY29uc3QgeyByZXR1cm4gMCAhPSAoRmxhZ3MgJiBBbGxvd1JlY2lwcm9jYWwpOyB9CisgIGJvb2wgYWxsb3dDb250cmFjdCgpIGNvbnN0ICAgeyByZXR1cm4gMCAhPSAoRmxhZ3MgJiBBbGxvd0NvbnRyYWN0KTsgfQorICBib29sIGFwcHJveEZ1bmMoKSBjb25zdCAgICAgIHsgcmV0dXJuIDAgIT0gKEZsYWdzICYgQXBwcm94RnVuYyk7IH0KKyAgLy8vICdGYXN0JyBtZWFucyBhbGwgYml0cyBhcmUgc2V0LgorICBib29sIGlzRmFzdCgpIGNvbnN0ICAgICAgICAgIHsgcmV0dXJuIGFsbCgpOyB9CisKKyAgLy8vIEZsYWcgc2V0dGVycworICB2b2lkIHNldEFsbG93UmVhc3NvYygpICAgIHsgRmxhZ3MgfD0gQWxsb3dSZWFzc29jOyB9CisgIHZvaWQgc2V0Tm9OYU5zKCkgICAgICAgICAgeyBGbGFncyB8PSBOb05hTnM7IH0KKyAgdm9pZCBzZXROb0luZnMoKSAgICAgICAgICB7IEZsYWdzIHw9IE5vSW5mczsgfQorICB2b2lkIHNldE5vU2lnbmVkWmVyb3MoKSAgIHsgRmxhZ3MgfD0gTm9TaWduZWRaZXJvczsgfQorICB2b2lkIHNldEFsbG93UmVjaXByb2NhbCgpIHsgRmxhZ3MgfD0gQWxsb3dSZWNpcHJvY2FsOyB9CisgIC8vIFRPRE86IENoYW5nZSB0aGUgb3RoZXIgc2V0KiBmdW5jdGlvbnMgdG8gdGFrZSBhIHBhcmFtZXRlcj8KKyAgdm9pZCBzZXRBbGxvd0NvbnRyYWN0KGJvb2wgQikgeworICAgIEZsYWdzID0gKEZsYWdzICYgfkFsbG93Q29udHJhY3QpIHwgQiAqIEFsbG93Q29udHJhY3Q7CisgIH0KKyAgdm9pZCBzZXRBcHByb3hGdW5jKCkgICAgICB7IEZsYWdzIHw9IEFwcHJveEZ1bmM7IH0KKyAgdm9pZCBzZXRGYXN0KCkgICAgICAgICAgICB7IHNldCgpOyB9CisKKyAgdm9pZCBvcGVyYXRvciY9KGNvbnN0IEZhc3RNYXRoRmxhZ3MgJk90aGVyRmxhZ3MpIHsKKyAgICBGbGFncyAmPSBPdGhlckZsYWdzLkZsYWdzOworICB9Cit9OworCisvLy8gVXRpbGl0eSBjbGFzcyBmb3IgZmxvYXRpbmcgcG9pbnQgb3BlcmF0aW9ucyB3aGljaCBjYW4gaGF2ZQorLy8vIGluZm9ybWF0aW9uIGFib3V0IHJlbGF4ZWQgYWNjdXJhY3kgcmVxdWlyZW1lbnRzIGF0dGFjaGVkIHRvIHRoZW0uCitjbGFzcyBGUE1hdGhPcGVyYXRvciA6IHB1YmxpYyBPcGVyYXRvciB7Citwcml2YXRlOgorICBmcmllbmQgY2xhc3MgSW5zdHJ1Y3Rpb247CisKKyAgLy8vICdGYXN0JyBtZWFucyBhbGwgYml0cyBhcmUgc2V0LgorICB2b2lkIHNldEZhc3QoYm9vbCBCKSB7CisgICAgc2V0SGFzQWxsb3dSZWFzc29jKEIpOworICAgIHNldEhhc05vTmFOcyhCKTsKKyAgICBzZXRIYXNOb0luZnMoQik7CisgICAgc2V0SGFzTm9TaWduZWRaZXJvcyhCKTsKKyAgICBzZXRIYXNBbGxvd1JlY2lwcm9jYWwoQik7CisgICAgc2V0SGFzQWxsb3dDb250cmFjdChCKTsKKyAgICBzZXRIYXNBcHByb3hGdW5jKEIpOworICB9CisKKyAgdm9pZCBzZXRIYXNBbGxvd1JlYXNzb2MoYm9vbCBCKSB7CisgICAgU3ViY2xhc3NPcHRpb25hbERhdGEgPQorICAgIChTdWJjbGFzc09wdGlvbmFsRGF0YSAmIH5GYXN0TWF0aEZsYWdzOjpBbGxvd1JlYXNzb2MpIHwKKyAgICAoQiAqIEZhc3RNYXRoRmxhZ3M6OkFsbG93UmVhc3NvYyk7CisgIH0KKworICB2b2lkIHNldEhhc05vTmFOcyhib29sIEIpIHsKKyAgICBTdWJjbGFzc09wdGlvbmFsRGF0YSA9CisgICAgICAoU3ViY2xhc3NPcHRpb25hbERhdGEgJiB+RmFzdE1hdGhGbGFnczo6Tm9OYU5zKSB8CisgICAgICAoQiAqIEZhc3RNYXRoRmxhZ3M6Ok5vTmFOcyk7CisgIH0KKworICB2b2lkIHNldEhhc05vSW5mcyhib29sIEIpIHsKKyAgICBTdWJjbGFzc09wdGlvbmFsRGF0YSA9CisgICAgICAoU3ViY2xhc3NPcHRpb25hbERhdGEgJiB+RmFzdE1hdGhGbGFnczo6Tm9JbmZzKSB8CisgICAgICAoQiAqIEZhc3RNYXRoRmxhZ3M6Ok5vSW5mcyk7CisgIH0KKworICB2b2lkIHNldEhhc05vU2lnbmVkWmVyb3MoYm9vbCBCKSB7CisgICAgU3ViY2xhc3NPcHRpb25hbERhdGEgPQorICAgICAgKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgfkZhc3RNYXRoRmxhZ3M6Ok5vU2lnbmVkWmVyb3MpIHwKKyAgICAgIChCICogRmFzdE1hdGhGbGFnczo6Tm9TaWduZWRaZXJvcyk7CisgIH0KKworICB2b2lkIHNldEhhc0FsbG93UmVjaXByb2NhbChib29sIEIpIHsKKyAgICBTdWJjbGFzc09wdGlvbmFsRGF0YSA9CisgICAgICAoU3ViY2xhc3NPcHRpb25hbERhdGEgJiB+RmFzdE1hdGhGbGFnczo6QWxsb3dSZWNpcHJvY2FsKSB8CisgICAgICAoQiAqIEZhc3RNYXRoRmxhZ3M6OkFsbG93UmVjaXByb2NhbCk7CisgIH0KKworICB2b2lkIHNldEhhc0FsbG93Q29udHJhY3QoYm9vbCBCKSB7CisgICAgU3ViY2xhc3NPcHRpb25hbERhdGEgPQorICAgICAgICAoU3ViY2xhc3NPcHRpb25hbERhdGEgJiB+RmFzdE1hdGhGbGFnczo6QWxsb3dDb250cmFjdCkgfAorICAgICAgICAoQiAqIEZhc3RNYXRoRmxhZ3M6OkFsbG93Q29udHJhY3QpOworICB9CisKKyAgdm9pZCBzZXRIYXNBcHByb3hGdW5jKGJvb2wgQikgeworICAgIFN1YmNsYXNzT3B0aW9uYWxEYXRhID0KKyAgICAgICAgKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgfkZhc3RNYXRoRmxhZ3M6OkFwcHJveEZ1bmMpIHwKKyAgICAgICAgKEIgKiBGYXN0TWF0aEZsYWdzOjpBcHByb3hGdW5jKTsKKyAgfQorCisgIC8vLyBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3Igc2V0dGluZyBtdWx0aXBsZSBmYXN0LW1hdGggZmxhZ3MuCisgIC8vLyBGTUYgaXMgYSBtYXNrIG9mIHRoZSBiaXRzIHRvIHNldC4KKyAgdm9pZCBzZXRGYXN0TWF0aEZsYWdzKEZhc3RNYXRoRmxhZ3MgRk1GKSB7CisgICAgU3ViY2xhc3NPcHRpb25hbERhdGEgfD0gRk1GLkZsYWdzOworICB9CisKKyAgLy8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBjb3B5aW5nIGFsbCBmYXN0LW1hdGggZmxhZ3MuCisgIC8vLyBBbGwgdmFsdWVzIGluIEZNRiBhcmUgdHJhbnNmZXJyZWQgdG8gdGhpcyBvcGVyYXRvci4KKyAgdm9pZCBjb3B5RmFzdE1hdGhGbGFncyhGYXN0TWF0aEZsYWdzIEZNRikgeworICAgIFN1YmNsYXNzT3B0aW9uYWxEYXRhID0gRk1GLkZsYWdzOworICB9CisKK3B1YmxpYzoKKyAgLy8vIFRlc3QgaWYgdGhpcyBvcGVyYXRpb24gYWxsb3dzIGFsbCBub24tc3RyaWN0IGZsb2F0aW5nLXBvaW50IHRyYW5zZm9ybXMuCisgIGJvb2wgaXNGYXN0KCkgY29uc3QgeworICAgIHJldHVybiAoKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgRmFzdE1hdGhGbGFnczo6QWxsb3dSZWFzc29jKSAhPSAwICYmCisgICAgICAgICAgICAoU3ViY2xhc3NPcHRpb25hbERhdGEgJiBGYXN0TWF0aEZsYWdzOjpOb05hTnMpICE9IDAgJiYKKyAgICAgICAgICAgIChTdWJjbGFzc09wdGlvbmFsRGF0YSAmIEZhc3RNYXRoRmxhZ3M6Ok5vSW5mcykgIT0gMCAmJgorICAgICAgICAgICAgKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgRmFzdE1hdGhGbGFnczo6Tm9TaWduZWRaZXJvcykgIT0gMCAmJgorICAgICAgICAgICAgKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgRmFzdE1hdGhGbGFnczo6QWxsb3dSZWNpcHJvY2FsKSAhPSAwICYmCisgICAgICAgICAgICAoU3ViY2xhc3NPcHRpb25hbERhdGEgJiBGYXN0TWF0aEZsYWdzOjpBbGxvd0NvbnRyYWN0KSAhPSAwICYmCisgICAgICAgICAgICAoU3ViY2xhc3NPcHRpb25hbERhdGEgJiBGYXN0TWF0aEZsYWdzOjpBcHByb3hGdW5jKSAhPSAwKTsKKyAgfQorCisgIC8vLyBUZXN0IGlmIHRoaXMgb3BlcmF0aW9uIG1heSBiZSBzaW1wbGlmaWVkIHdpdGggcmVhc3NvY2lhdGl2ZSB0cmFuc2Zvcm1zLgorICBib29sIGhhc0FsbG93UmVhc3NvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgRmFzdE1hdGhGbGFnczo6QWxsb3dSZWFzc29jKSAhPSAwOworICB9CisKKyAgLy8vIFRlc3QgaWYgdGhpcyBvcGVyYXRpb24ncyBhcmd1bWVudHMgYW5kIHJlc3VsdHMgYXJlIGFzc3VtZWQgbm90LU5hTi4KKyAgYm9vbCBoYXNOb05hTnMoKSBjb25zdCB7CisgICAgcmV0dXJuIChTdWJjbGFzc09wdGlvbmFsRGF0YSAmIEZhc3RNYXRoRmxhZ3M6Ok5vTmFOcykgIT0gMDsKKyAgfQorCisgIC8vLyBUZXN0IGlmIHRoaXMgb3BlcmF0aW9uJ3MgYXJndW1lbnRzIGFuZCByZXN1bHRzIGFyZSBhc3N1bWVkIG5vdC1pbmZpbml0ZS4KKyAgYm9vbCBoYXNOb0luZnMoKSBjb25zdCB7CisgICAgcmV0dXJuIChTdWJjbGFzc09wdGlvbmFsRGF0YSAmIEZhc3RNYXRoRmxhZ3M6Ok5vSW5mcykgIT0gMDsKKyAgfQorCisgIC8vLyBUZXN0IGlmIHRoaXMgb3BlcmF0aW9uIGNhbiBpZ25vcmUgdGhlIHNpZ24gb2YgemVyby4KKyAgYm9vbCBoYXNOb1NpZ25lZFplcm9zKCkgY29uc3QgeworICAgIHJldHVybiAoU3ViY2xhc3NPcHRpb25hbERhdGEgJiBGYXN0TWF0aEZsYWdzOjpOb1NpZ25lZFplcm9zKSAhPSAwOworICB9CisKKyAgLy8vIFRlc3QgaWYgdGhpcyBvcGVyYXRpb24gY2FuIHVzZSByZWNpcHJvY2FsIG11bHRpcGx5IGluc3RlYWQgb2YgZGl2aXNpb24uCisgIGJvb2wgaGFzQWxsb3dSZWNpcHJvY2FsKCkgY29uc3QgeworICAgIHJldHVybiAoU3ViY2xhc3NPcHRpb25hbERhdGEgJiBGYXN0TWF0aEZsYWdzOjpBbGxvd1JlY2lwcm9jYWwpICE9IDA7CisgIH0KKworICAvLy8gVGVzdCBpZiB0aGlzIG9wZXJhdGlvbiBjYW4gYmUgZmxvYXRpbmctcG9pbnQgY29udHJhY3RlZCAoRk1BKS4KKyAgYm9vbCBoYXNBbGxvd0NvbnRyYWN0KCkgY29uc3QgeworICAgIHJldHVybiAoU3ViY2xhc3NPcHRpb25hbERhdGEgJiBGYXN0TWF0aEZsYWdzOjpBbGxvd0NvbnRyYWN0KSAhPSAwOworICB9CisKKyAgLy8vIFRlc3QgaWYgdGhpcyBvcGVyYXRpb24gYWxsb3dzIGFwcHJveGltYXRpb25zIG9mIG1hdGggbGlicmFyeSBmdW5jdGlvbnMgb3IKKyAgLy8vIGludHJpbnNpY3MuCisgIGJvb2wgaGFzQXBwcm94RnVuYygpIGNvbnN0IHsKKyAgICByZXR1cm4gKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgRmFzdE1hdGhGbGFnczo6QXBwcm94RnVuYykgIT0gMDsKKyAgfQorCisgIC8vLyBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgZ2V0dGluZyBhbGwgdGhlIGZhc3QtbWF0aCBmbGFncworICBGYXN0TWF0aEZsYWdzIGdldEZhc3RNYXRoRmxhZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIEZhc3RNYXRoRmxhZ3MoU3ViY2xhc3NPcHRpb25hbERhdGEpOworICB9CisKKyAgLy8vIEdldCB0aGUgbWF4aW11bSBlcnJvciBwZXJtaXR0ZWQgYnkgdGhpcyBvcGVyYXRpb24gaW4gVUxQcy4gQW4gYWNjdXJhY3kgb2YKKyAgLy8vIDAuMCBtZWFucyB0aGF0IHRoZSBvcGVyYXRpb24gc2hvdWxkIGJlIHBlcmZvcm1lZCB3aXRoIHRoZSBkZWZhdWx0CisgIC8vLyBwcmVjaXNpb24uCisgIGZsb2F0IGdldEZQQWNjdXJhY3koKSBjb25zdDsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldFR5cGUoKS0+aXNGUE9yRlBWZWN0b3JUeSgpIHx8CisgICAgICBJLT5nZXRPcGNvZGUoKSA9PSBJbnN0cnVjdGlvbjo6RkNtcDsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQ29uc3RhbnRFeHByICpDRSkgeworICAgIHJldHVybiBDRS0+Z2V0VHlwZSgpLT5pc0ZQT3JGUFZlY3RvclR5KCkgfHwKKyAgICAgICAgICAgQ0UtPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpGQ21wOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiAoaXNhPEluc3RydWN0aW9uPihWKSAmJiBjbGFzc29mKGNhc3Q8SW5zdHJ1Y3Rpb24+KFYpKSkgfHwKKyAgICAgICAgICAgKGlzYTxDb25zdGFudEV4cHI+KFYpICYmIGNsYXNzb2YoY2FzdDxDb25zdGFudEV4cHI+KFYpKSk7CisgIH0KK307CisKKy8vLyBBIGhlbHBlciB0ZW1wbGF0ZSBmb3IgZGVmaW5pbmcgb3BlcmF0b3JzIGZvciBpbmRpdmlkdWFsIG9wY29kZXMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBTdXBlckNsYXNzLCB1bnNpZ25lZCBPcGM+CitjbGFzcyBDb25jcmV0ZU9wZXJhdG9yIDogcHVibGljIFN1cGVyQ2xhc3MgeworcHVibGljOgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluc3RydWN0aW9uICpJKSB7CisgICAgcmV0dXJuIEktPmdldE9wY29kZSgpID09IE9wYzsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IENvbnN0YW50RXhwciAqQ0UpIHsKKyAgICByZXR1cm4gQ0UtPmdldE9wY29kZSgpID09IE9wYzsKKyAgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFZhbHVlICpWKSB7CisgICAgcmV0dXJuIChpc2E8SW5zdHJ1Y3Rpb24+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnN0cnVjdGlvbj4oVikpKSB8fAorICAgICAgICAgICAoaXNhPENvbnN0YW50RXhwcj4oVikgJiYgY2xhc3NvZihjYXN0PENvbnN0YW50RXhwcj4oVikpKTsKKyAgfQorfTsKKworY2xhc3MgQWRkT3BlcmF0b3IKKyAgOiBwdWJsaWMgQ29uY3JldGVPcGVyYXRvcjxPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yLCBJbnN0cnVjdGlvbjo6QWRkPiB7Cit9OworY2xhc3MgU3ViT3BlcmF0b3IKKyAgOiBwdWJsaWMgQ29uY3JldGVPcGVyYXRvcjxPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yLCBJbnN0cnVjdGlvbjo6U3ViPiB7Cit9OworY2xhc3MgTXVsT3BlcmF0b3IKKyAgOiBwdWJsaWMgQ29uY3JldGVPcGVyYXRvcjxPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yLCBJbnN0cnVjdGlvbjo6TXVsPiB7Cit9OworY2xhc3MgU2hsT3BlcmF0b3IKKyAgOiBwdWJsaWMgQ29uY3JldGVPcGVyYXRvcjxPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yLCBJbnN0cnVjdGlvbjo6U2hsPiB7Cit9OworCitjbGFzcyBTRGl2T3BlcmF0b3IKKyAgOiBwdWJsaWMgQ29uY3JldGVPcGVyYXRvcjxQb3NzaWJseUV4YWN0T3BlcmF0b3IsIEluc3RydWN0aW9uOjpTRGl2PiB7Cit9OworY2xhc3MgVURpdk9wZXJhdG9yCisgIDogcHVibGljIENvbmNyZXRlT3BlcmF0b3I8UG9zc2libHlFeGFjdE9wZXJhdG9yLCBJbnN0cnVjdGlvbjo6VURpdj4geworfTsKK2NsYXNzIEFTaHJPcGVyYXRvcgorICA6IHB1YmxpYyBDb25jcmV0ZU9wZXJhdG9yPFBvc3NpYmx5RXhhY3RPcGVyYXRvciwgSW5zdHJ1Y3Rpb246OkFTaHI+IHsKK307CitjbGFzcyBMU2hyT3BlcmF0b3IKKyAgOiBwdWJsaWMgQ29uY3JldGVPcGVyYXRvcjxQb3NzaWJseUV4YWN0T3BlcmF0b3IsIEluc3RydWN0aW9uOjpMU2hyPiB7Cit9OworCitjbGFzcyBaRXh0T3BlcmF0b3IgOiBwdWJsaWMgQ29uY3JldGVPcGVyYXRvcjxPcGVyYXRvciwgSW5zdHJ1Y3Rpb246OlpFeHQ+IHt9OworCitjbGFzcyBHRVBPcGVyYXRvcgorICA6IHB1YmxpYyBDb25jcmV0ZU9wZXJhdG9yPE9wZXJhdG9yLCBJbnN0cnVjdGlvbjo6R2V0RWxlbWVudFB0cj4geworICBmcmllbmQgY2xhc3MgR2V0RWxlbWVudFB0ckluc3Q7CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudEV4cHI7CisKKyAgZW51bSB7CisgICAgSXNJbkJvdW5kcyA9ICgxIDw8IDApLAorICAgIC8vIEluUmFuZ2VJbmRleDogYml0cyAxLTYKKyAgfTsKKworICB2b2lkIHNldElzSW5Cb3VuZHMoYm9vbCBCKSB7CisgICAgU3ViY2xhc3NPcHRpb25hbERhdGEgPQorICAgICAgKFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgfklzSW5Cb3VuZHMpIHwgKEIgKiBJc0luQm91bmRzKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBUZXN0IHdoZXRoZXIgdGhpcyBpcyBhbiBpbmJvdW5kcyBHRVAsIGFzIGRlZmluZWQgYnkgTGFuZ1JlZi5odG1sLgorICBib29sIGlzSW5Cb3VuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIFN1YmNsYXNzT3B0aW9uYWxEYXRhICYgSXNJbkJvdW5kczsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIGluZGV4IHdpdGggYW4gaW5yYW5nZSBhdHRhY2htZW50LCBvciBOb25lIGlmCisgIC8vLyBub25lLgorICBPcHRpb25hbDx1bnNpZ25lZD4gZ2V0SW5SYW5nZUluZGV4KCkgY29uc3QgeworICAgIGlmIChTdWJjbGFzc09wdGlvbmFsRGF0YSA+PiAxID09IDApIHJldHVybiBOb25lOworICAgIHJldHVybiAoU3ViY2xhc3NPcHRpb25hbERhdGEgPj4gMSkgLSAxOworICB9CisKKyAgaW5saW5lIG9wX2l0ZXJhdG9yICAgICAgIGlkeF9iZWdpbigpICAgICAgIHsgcmV0dXJuIG9wX2JlZ2luKCkrMTsgfQorICBpbmxpbmUgY29uc3Rfb3BfaXRlcmF0b3IgaWR4X2JlZ2luKCkgY29uc3QgeyByZXR1cm4gb3BfYmVnaW4oKSsxOyB9CisgIGlubGluZSBvcF9pdGVyYXRvciAgICAgICBpZHhfZW5kKCkgICAgICAgICB7IHJldHVybiBvcF9lbmQoKTsgfQorICBpbmxpbmUgY29uc3Rfb3BfaXRlcmF0b3IgaWR4X2VuZCgpICAgY29uc3QgeyByZXR1cm4gb3BfZW5kKCk7IH0KKworICBWYWx1ZSAqZ2V0UG9pbnRlck9wZXJhbmQoKSB7CisgICAgcmV0dXJuIGdldE9wZXJhbmQoMCk7CisgIH0KKyAgY29uc3QgVmFsdWUgKmdldFBvaW50ZXJPcGVyYW5kKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGVyYW5kKDApOworICB9CisgIHN0YXRpYyB1bnNpZ25lZCBnZXRQb2ludGVyT3BlcmFuZEluZGV4KCkgeworICAgIHJldHVybiAwVTsgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGluZGV4IGZvciBtb2RpZnlpbmcgY29ycmVjdCBvcGVyYW5kCisgIH0KKworICAvLy8gTWV0aG9kIHRvIHJldHVybiB0aGUgcG9pbnRlciBvcGVyYW5kIGFzIGEgUG9pbnRlclR5cGUuCisgIFR5cGUgKmdldFBvaW50ZXJPcGVyYW5kVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UG9pbnRlck9wZXJhbmQoKS0+Z2V0VHlwZSgpOworICB9CisKKyAgVHlwZSAqZ2V0U291cmNlRWxlbWVudFR5cGUoKSBjb25zdDsKKyAgVHlwZSAqZ2V0UmVzdWx0RWxlbWVudFR5cGUoKSBjb25zdDsKKworICAvLy8gTWV0aG9kIHRvIHJldHVybiB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgcG9pbnRlciBvcGVyYW5kLgorICB1bnNpZ25lZCBnZXRQb2ludGVyQWRkcmVzc1NwYWNlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQb2ludGVyT3BlcmFuZFR5cGUoKS0+Z2V0UG9pbnRlckFkZHJlc3NTcGFjZSgpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtSW5kaWNlcygpIGNvbnN0IHsgIC8vIE5vdGU6IGFsd2F5cyBub24tbmVnYXRpdmUKKyAgICByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKSAtIDE7CisgIH0KKworICBib29sIGhhc0luZGljZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE51bU9wZXJhbmRzKCkgPiAxOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGFsbCBvZiB0aGUgaW5kaWNlcyBvZiB0aGlzIEdFUCBhcmUgemVyb3MuCisgIC8vLyBJZiBzbywgdGhlIHJlc3VsdCBwb2ludGVyIGFuZCB0aGUgZmlyc3Qgb3BlcmFuZCBoYXZlIHRoZSBzYW1lCisgIC8vLyB2YWx1ZSwganVzdCBwb3RlbnRpYWxseSBkaWZmZXJlbnQgdHlwZXMuCisgIGJvb2wgaGFzQWxsWmVyb0luZGljZXMoKSBjb25zdCB7CisgICAgZm9yIChjb25zdF9vcF9pdGVyYXRvciBJID0gaWR4X2JlZ2luKCksIEUgPSBpZHhfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoQ29uc3RhbnRJbnQgKkMgPSBkeW5fY2FzdDxDb25zdGFudEludD4oSSkpCisgICAgICAgIGlmIChDLT5pc1plcm8oKSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgYWxsIG9mIHRoZSBpbmRpY2VzIG9mIHRoaXMgR0VQIGFyZSBjb25zdGFudCBpbnRlZ2Vycy4KKyAgLy8vIElmIHNvLCB0aGUgcmVzdWx0IHBvaW50ZXIgYW5kIHRoZSBmaXJzdCBvcGVyYW5kIGhhdmUKKyAgLy8vIGEgY29uc3RhbnQgb2Zmc2V0IGJldHdlZW4gdGhlbS4KKyAgYm9vbCBoYXNBbGxDb25zdGFudEluZGljZXMoKSBjb25zdCB7CisgICAgZm9yIChjb25zdF9vcF9pdGVyYXRvciBJID0gaWR4X2JlZ2luKCksIEUgPSBpZHhfZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBpZiAoIWlzYTxDb25zdGFudEludD4oSSkpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB1bnNpZ25lZCBjb3VudE5vbkNvbnN0YW50SW5kaWNlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gY291bnRfaWYobWFrZV9yYW5nZShpZHhfYmVnaW4oKSwgaWR4X2VuZCgpKSwgW10oY29uc3QgVXNlJiB1c2UpIHsKKyAgICAgICAgcmV0dXJuICFpc2E8Q29uc3RhbnRJbnQ+KCp1c2UpOworICAgICAgfSk7CisgIH0KKworICAvLy8gXGJyaWVmIEFjY3VtdWxhdGUgdGhlIGNvbnN0YW50IGFkZHJlc3Mgb2Zmc2V0IG9mIHRoaXMgR0VQIGlmIHBvc3NpYmxlLgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSBhY2NlcHRzIGFuIEFQSW50IGludG8gd2hpY2ggaXQgd2lsbCBhY2N1bXVsYXRlIHRoZSBjb25zdGFudAorICAvLy8gb2Zmc2V0IG9mIHRoaXMgR0VQIGlmIHRoZSBHRVAgaXMgaW4gZmFjdCBjb25zdGFudC4gSWYgdGhlIEdFUCBpcyBub3QKKyAgLy8vIGFsbC1jb25zdGFudCwgaXQgcmV0dXJucyBmYWxzZSBhbmQgdGhlIHZhbHVlIG9mIHRoZSBvZmZzZXQgQVBJbnQgaXMKKyAgLy8vIHVuZGVmaW5lZCAoaXQgaXMgKm5vdCogcHJlc2VydmVkISkuIFRoZSBBUEludCBwYXNzZWQgaW50byB0aGlzIHJvdXRpbmUKKyAgLy8vIG11c3QgYmUgYXQgZXhhY3RseSBhcyB3aWRlIGFzIHRoZSBJbnRQdHIgdHlwZSBmb3IgdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhlCisgIC8vLyBiYXNlIEdFUCBwb2ludGVyLgorICBib29sIGFjY3VtdWxhdGVDb25zdGFudE9mZnNldChjb25zdCBEYXRhTGF5b3V0ICZETCwgQVBJbnQgJk9mZnNldCkgY29uc3Q7Cit9OworCitjbGFzcyBQdHJUb0ludE9wZXJhdG9yCisgICAgOiBwdWJsaWMgQ29uY3JldGVPcGVyYXRvcjxPcGVyYXRvciwgSW5zdHJ1Y3Rpb246OlB0clRvSW50PiB7CisgIGZyaWVuZCBjbGFzcyBQdHJUb0ludDsKKyAgZnJpZW5kIGNsYXNzIENvbnN0YW50RXhwcjsKKworcHVibGljOgorICBWYWx1ZSAqZ2V0UG9pbnRlck9wZXJhbmQoKSB7CisgICAgcmV0dXJuIGdldE9wZXJhbmQoMCk7CisgIH0KKyAgY29uc3QgVmFsdWUgKmdldFBvaW50ZXJPcGVyYW5kKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPcGVyYW5kKDApOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldFBvaW50ZXJPcGVyYW5kSW5kZXgoKSB7CisgICAgcmV0dXJuIDBVOyAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgaW5kZXggZm9yIG1vZGlmeWluZyBjb3JyZWN0IG9wZXJhbmQKKyAgfQorCisgIC8vLyBNZXRob2QgdG8gcmV0dXJuIHRoZSBwb2ludGVyIG9wZXJhbmQgYXMgYSBQb2ludGVyVHlwZS4KKyAgVHlwZSAqZ2V0UG9pbnRlck9wZXJhbmRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRQb2ludGVyT3BlcmFuZCgpLT5nZXRUeXBlKCk7CisgIH0KKworICAvLy8gTWV0aG9kIHRvIHJldHVybiB0aGUgYWRkcmVzcyBzcGFjZSBvZiB0aGUgcG9pbnRlciBvcGVyYW5kLgorICB1bnNpZ25lZCBnZXRQb2ludGVyQWRkcmVzc1NwYWNlKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PFBvaW50ZXJUeXBlPihnZXRQb2ludGVyT3BlcmFuZFR5cGUoKSktPmdldEFkZHJlc3NTcGFjZSgpOworICB9Cit9OworCitjbGFzcyBCaXRDYXN0T3BlcmF0b3IKKyAgICA6IHB1YmxpYyBDb25jcmV0ZU9wZXJhdG9yPE9wZXJhdG9yLCBJbnN0cnVjdGlvbjo6Qml0Q2FzdD4geworICBmcmllbmQgY2xhc3MgQml0Q2FzdEluc3Q7CisgIGZyaWVuZCBjbGFzcyBDb25zdGFudEV4cHI7CisKK3B1YmxpYzoKKyAgVHlwZSAqZ2V0U3JjVHkoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9wZXJhbmQoMCktPmdldFR5cGUoKTsKKyAgfQorCisgIFR5cGUgKmdldERlc3RUeSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VHlwZSgpOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9PUEVSQVRPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL09wdEJpc2VjdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9PcHRCaXNlY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmM3MjRjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9PcHRCaXNlY3QuaApAQCAtMCwwICsxLDg5IEBACisvLz09PS0gbGx2bS9JUi9PcHRCaXNlY3QuaCAtIExMVk0gQmlzZWN0IHN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGludGVyZmFjZSBmb3IgYmlzZWN0aW5nIG9wdGltaXphdGlvbnMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9PUFRCSVNFQ1RfSAorI2RlZmluZSBMTFZNX0lSX09QVEJJU0VDVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBQYXNzOworY2xhc3MgTW9kdWxlOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgUmVnaW9uOworY2xhc3MgTG9vcDsKK2NsYXNzIENhbGxHcmFwaFNDQzsKKworLy8vIEV4dGVuc2lvbnMgdG8gdGhpcyBjbGFzcyBpbXBsZW1lbnQgbWVjaGFuaXNtcyB0byBkaXNhYmxlIHBhc3NlcyBhbmQKKy8vLyBpbmRpdmlkdWFsIG9wdGltaXphdGlvbnMgYXQgY29tcGlsZSB0aW1lLgorY2xhc3MgT3B0UGFzc0dhdGUgeworcHVibGljOgorICB2aXJ0dWFsIH5PcHRQYXNzR2F0ZSgpID0gZGVmYXVsdDsKKworICB2aXJ0dWFsIGJvb2wgc2hvdWxkUnVuUGFzcyhjb25zdCBQYXNzICpQLCBjb25zdCBNb2R1bGUgJlUpIHsgcmV0dXJuIHRydWU7IH0KKyAgdmlydHVhbCBib29sIHNob3VsZFJ1blBhc3MoY29uc3QgUGFzcyAqUCwgY29uc3QgRnVuY3Rpb24gJlUpICB7cmV0dXJuIHRydWU7IH0KKyAgdmlydHVhbCBib29sIHNob3VsZFJ1blBhc3MoY29uc3QgUGFzcyAqUCwgY29uc3QgQmFzaWNCbG9jayAmVSkgIHsgcmV0dXJuIHRydWU7IH0KKyAgdmlydHVhbCBib29sIHNob3VsZFJ1blBhc3MoY29uc3QgUGFzcyAqUCwgY29uc3QgUmVnaW9uICZVKSAgeyByZXR1cm4gdHJ1ZTsgfQorICB2aXJ0dWFsIGJvb2wgc2hvdWxkUnVuUGFzcyhjb25zdCBQYXNzICpQLCBjb25zdCBMb29wICZVKSAgeyByZXR1cm4gdHJ1ZTsgfQorICB2aXJ0dWFsIGJvb2wgc2hvdWxkUnVuUGFzcyhjb25zdCBQYXNzICpQLCBjb25zdCBDYWxsR3JhcGhTQ0MgJlUpICB7IHJldHVybiB0cnVlOyB9Cit9OworCisvLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgbWVjaGFuaXNtIHRvIGRpc2FibGUgcGFzc2VzIGFuZCBpbmRpdmlkdWFsCisvLy8gb3B0aW1pemF0aW9ucyBhdCBjb21waWxlIHRpbWUgYmFzZWQgb24gYSBjb21tYW5kIGxpbmUgb3B0aW9uCisvLy8gKC1vcHQtYmlzZWN0LWxpbWl0KSBpbiBvcmRlciB0byBwZXJmb3JtIGEgYmlzZWN0aW5nIHNlYXJjaCBmb3IKKy8vLyBvcHRpbWl6YXRpb24tcmVsYXRlZCBwcm9ibGVtcy4KK2NsYXNzIE9wdEJpc2VjdCA6IHB1YmxpYyBPcHRQYXNzR2F0ZSB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3RvciwgaW5pdGlhbGl6ZXMgdGhlIE9wdEJpc2VjdCBzdGF0ZSBiYXNlZCBvbiB0aGUKKyAgLy8vIC1vcHQtYmlzZWN0LWxpbWl0IGNvbW1hbmQgbGluZSBhcmd1bWVudC4KKyAgLy8vCisgIC8vLyBCeSBkZWZhdWx0LCBiaXNlY3Rpb24gaXMgZGlzYWJsZWQuCisgIC8vLworICAvLy8gQ2xpZW50cyBzaG91bGQgbm90IGluc3RhbnRpYXRlIHRoaXMgY2xhc3MgZGlyZWN0bHkuICBBbGwgYWNjZXNzIHNob3VsZCBnbworICAvLy8gdGhyb3VnaCBMTFZNQ29udGV4dC4KKyAgT3B0QmlzZWN0KCk7CisKKyAgdmlydHVhbCB+T3B0QmlzZWN0KCkgPSBkZWZhdWx0OworCisgIC8vLyBDaGVja3MgdGhlIGJpc2VjdCBsaW1pdCB0byBkZXRlcm1pbmUgaWYgdGhlIHNwZWNpZmllZCBwYXNzIHNob3VsZCBydW4uCisgIC8vLworICAvLy8gVGhlc2UgZnVuY3Rpb25zIGltbWVkaWF0ZWx5IHJldHVybiB0cnVlIGlmIGJpc2VjdGlvbiBpcyBkaXNhYmxlZC4gSWYgdGhlCisgIC8vLyBiaXNlY3QgbGltaXQgaXMgc2V0IHRvIC0xLCB0aGUgZnVuY3Rpb25zIHByaW50IGEgbWVzc2FnZSBkZXNjcmliaW5nCisgIC8vLyB0aGUgcGFzcyBhbmQgdGhlIGJpc2VjdCBudW1iZXIgYXNzaWduZWQgdG8gaXQgYW5kIHJldHVybiB0cnVlLiAgT3RoZXJ3aXNlLAorICAvLy8gdGhlIGZ1bmN0aW9ucyBwcmludCBhIG1lc3NhZ2Ugd2l0aCB0aGUgYmlzZWN0IG51bWJlciBhc3NpZ25lZCB0byB0aGUKKyAgLy8vIHBhc3MgYW5kIGluZGljYXRpbmcgd2hldGhlciBvciBub3QgdGhlIHBhc3Mgd2lsbCBiZSBydW4gYW5kIHJldHVybiB0cnVlIGlmCisgIC8vLyB0aGUgYmlzZWN0IGxpbWl0IGhhcyBub3QgeWV0IGJlZW4gZXhjZWVkZWQgb3IgZmFsc2UgaWYgaXQgaGFzLgorICAvLy8KKyAgLy8vIE1vc3QgcGFzc2VzIHNob3VsZCBub3QgY2FsbCB0aGVzZSByb3V0aW5lcyBkaXJlY3RseS4gSW5zdGVhZCwgdGhleSBhcmUKKyAgLy8vIGNhbGxlZCB0aHJvdWdoIGhlbHBlciByb3V0aW5lcyBwcm92aWRlZCBieSB0aGUgcGFzcyBiYXNlIGNsYXNzZXMuICBGb3IKKyAgLy8vIGluc3RhbmNlLCBmdW5jdGlvbiBwYXNzZXMgc2hvdWxkIGNhbGwgRnVuY3Rpb25QYXNzOjpza2lwRnVuY3Rpb24oKS4KKyAgYm9vbCBzaG91bGRSdW5QYXNzKGNvbnN0IFBhc3MgKlAsIGNvbnN0IE1vZHVsZSAmVSkgb3ZlcnJpZGU7CisgIGJvb2wgc2hvdWxkUnVuUGFzcyhjb25zdCBQYXNzICpQLCBjb25zdCBGdW5jdGlvbiAmVSkgb3ZlcnJpZGU7CisgIGJvb2wgc2hvdWxkUnVuUGFzcyhjb25zdCBQYXNzICpQLCBjb25zdCBCYXNpY0Jsb2NrICZVKSBvdmVycmlkZTsKKyAgYm9vbCBzaG91bGRSdW5QYXNzKGNvbnN0IFBhc3MgKlAsIGNvbnN0IFJlZ2lvbiAmVSkgb3ZlcnJpZGU7CisgIGJvb2wgc2hvdWxkUnVuUGFzcyhjb25zdCBQYXNzICpQLCBjb25zdCBMb29wICZVKSBvdmVycmlkZTsKKyAgYm9vbCBzaG91bGRSdW5QYXNzKGNvbnN0IFBhc3MgKlAsIGNvbnN0IENhbGxHcmFwaFNDQyAmVSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIGJvb2wgY2hlY2tQYXNzKGNvbnN0IFN0cmluZ1JlZiBQYXNzTmFtZSwgY29uc3QgU3RyaW5nUmVmIFRhcmdldERlc2MpOworCisgIGJvb2wgQmlzZWN0RW5hYmxlZCA9IGZhbHNlOworICB1bnNpZ25lZCBMYXN0QmlzZWN0TnVtID0gMDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX09QVEJJU0VDVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1Bhc3NNYW5hZ2VyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1Bhc3NNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGY4MzhhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvUGFzc01hbmFnZXIuaApAQCAtMCwwICsxLDEzMjQgQEAKKy8vPT09LSBQYXNzTWFuYWdlci5oIC0gUGFzcyBtYW5hZ2VtZW50IGluZnJhc3RydWN0dXJlIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLworLy8vIFRoaXMgaGVhZGVyIGRlZmluZXMgdmFyaW91cyBpbnRlcmZhY2VzIGZvciBwYXNzIG1hbmFnZW1lbnQgaW4gTExWTS4gVGhlcmUKKy8vLyBpcyBubyAicGFzcyIgaW50ZXJmYWNlIGluIExMVk0gcGVyIHNlLiBJbnN0ZWFkLCBhbiBpbnN0YW5jZSBvZiBhbnkgY2xhc3MKKy8vLyB3aGljaCBzdXBwb3J0cyBhIG1ldGhvZCB0byAncnVuJyBpdCBvdmVyIGEgdW5pdCBvZiBJUiBjYW4gYmUgdXNlZCBhcworLy8vIGEgcGFzcy4gQSBwYXNzIG1hbmFnZXIgaXMgZ2VuZXJhbGx5IGEgdG9vbCB0byBjb2xsZWN0IGEgc2VxdWVuY2Ugb2YgcGFzc2VzCisvLy8gd2hpY2ggcnVuIG92ZXIgYSBwYXJ0aWN1bGFyIElSIGNvbnN0cnVjdCwgYW5kIHJ1biBlYWNoIG9mIHRoZW0gaW4gc2VxdWVuY2UKKy8vLyBvdmVyIGVhY2ggc3VjaCBjb25zdHJ1Y3QgaW4gdGhlIGNvbnRhaW5pbmcgSVIgY29uc3RydWN0LiBBcyB0aGVyZSBpcyBubworLy8vIGNvbnRhaW5pbmcgSVIgY29uc3RydWN0IGZvciBhIE1vZHVsZSwgYSBtYW5hZ2VyIGZvciBwYXNzZXMgb3ZlciBtb2R1bGVzCisvLy8gZm9ybXMgdGhlIGJhc2UgY2FzZSB3aGljaCBydW5zIGl0cyBtYW5hZ2VkIHBhc3NlcyBpbiBzZXF1ZW5jZSBvdmVyIHRoZQorLy8vIHNpbmdsZSBtb2R1bGUgcHJvdmlkZWQuCisvLy8KKy8vLyBUaGUgY29yZSBJUiBsaWJyYXJ5IHByb3ZpZGVzIG1hbmFnZXJzIGZvciBydW5uaW5nIHBhc3NlcyBvdmVyCisvLy8gbW9kdWxlcyBhbmQgZnVuY3Rpb25zLgorLy8vCisvLy8gKiBGdW5jdGlvblBhc3NNYW5hZ2VyIGNhbiBydW4gb3ZlciBhIE1vZHVsZSwgcnVucyBlYWNoIHBhc3Mgb3ZlcgorLy8vICAgYSBGdW5jdGlvbi4KKy8vLyAqIE1vZHVsZVBhc3NNYW5hZ2VyIG11c3QgYmUgZGlyZWN0bHkgcnVuLCBydW5zIGVhY2ggcGFzcyBvdmVyIHRoZSBNb2R1bGUuCisvLy8KKy8vLyBOb3RlIHRoYXQgdGhlIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgcGFzcyBtYW5hZ2VycyB1c2UgY29uY2VwdC1iYXNlZAorLy8vIHBvbHltb3JwaGlzbSBhcyBvdXRsaW5lZCBpbiB0aGUgIlZhbHVlIFNlbWFudGljcyBhbmQgQ29uY2VwdC1iYXNlZAorLy8vIFBvbHltb3JwaGlzbSIgdGFsayAob3IgaXRzIGFiYnJldmlhdGVkIHNpYmxpbmcgIkluaGVyaXRhbmNlIElzIFRoZSBCYXNlCisvLy8gQ2xhc3Mgb2YgRXZpbCIpIGJ5IFNlYW4gUGFyZW50OgorLy8vICogaHR0cDovL2dpdGh1Yi5jb20vc2Vhbi1wYXJlbnQvc2Vhbi1wYXJlbnQuZ2l0aHViLmNvbS93aWtpL1BhcGVycy1hbmQtUHJlc2VudGF0aW9ucworLy8vICogaHR0cDovL3d3dy55b3V0dWJlLmNvbS93YXRjaD92PV9CcE1ZZVVGWHY4CisvLy8gKiBodHRwOi8vY2hhbm5lbDkubXNkbi5jb20vRXZlbnRzL0dvaW5nTmF0aXZlLzIwMTMvSW5oZXJpdGFuY2UtSXMtVGhlLUJhc2UtQ2xhc3Mtb2YtRXZpbAorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfUEFTU01BTkFHRVJfSAorI2RlZmluZSBMTFZNX0lSX1BBU1NNQU5BR0VSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9UaW55UHRyVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlckludGVybmFsLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1R5cGVOYW1lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQSBzcGVjaWFsIHR5cGUgdXNlZCBieSBhbmFseXNpcyBwYXNzZXMgdG8gcHJvdmlkZSBhbiBhZGRyZXNzIHRoYXQKKy8vLyBpZGVudGlmaWVzIHRoYXQgcGFydGljdWxhciBhbmFseXNpcyBwYXNzIHR5cGUuCisvLy8KKy8vLyBBbmFseXNpcyBwYXNzZXMgc2hvdWxkIGhhdmUgYSBzdGF0aWMgZGF0YSBtZW1iZXIgb2YgdGhpcyB0eXBlIGFuZCBkZXJpdmUKKy8vLyBmcm9tIHRoZSBcYyBBbmFseXNpc0luZm9NaXhpbiB0byBnZXQgYSBzdGF0aWMgSUQgbWV0aG9kIHVzZWQgdG8gaWRlbnRpZnkKKy8vLyB0aGUgYW5hbHlzaXMgaW4gdGhlIHBhc3MgbWFuYWdlbWVudCBpbmZyYXN0cnVjdHVyZS4KK3N0cnVjdCBhbGlnbmFzKDgpIEFuYWx5c2lzS2V5IHt9OworCisvLy8gQSBzcGVjaWFsIHR5cGUgdXNlZCB0byBwcm92aWRlIGFuIGFkZHJlc3MgdGhhdCBpZGVudGlmaWVzIGEgc2V0IG9mIHJlbGF0ZWQKKy8vLyBhbmFseXNlcy4gIFRoZXNlIHNldHMgYXJlIHByaW1hcmlseSB1c2VkIGJlbG93IHRvIG1hcmsgc2V0cyBvZiBhbmFseXNlcyBhcworLy8vIHByZXNlcnZlZC4KKy8vLworLy8vIEZvciBleGFtcGxlLCBhIHRyYW5zZm9ybWF0aW9uIGNhbiBpbmRpY2F0ZSB0aGF0IGl0IHByZXNlcnZlcyB0aGUgQ0ZHIG9mIGEKKy8vLyBmdW5jdGlvbiBieSBwcmVzZXJ2aW5nIHRoZSBhcHByb3ByaWF0ZSBBbmFseXNpc1NldEtleS4gIEFuIGFuYWx5c2lzIHRoYXQKKy8vLyBkZXBlbmRzIG9ubHkgb24gdGhlIENGRyBjYW4gdGhlbiBjaGVjayBpZiB0aGF0IEFuYWx5c2lzU2V0S2V5IGlzIHByZXNlcnZlZDsKKy8vLyBpZiBpdCBpcywgdGhlIGFuYWx5c2lzIGtub3dzIHRoYXQgaXQgaXRzZWxmIGlzIHByZXNlcnZlZC4KK3N0cnVjdCBhbGlnbmFzKDgpIEFuYWx5c2lzU2V0S2V5IHt9OworCisvLy8gVGhpcyB0ZW1wbGF0ZWQgY2xhc3MgcmVwcmVzZW50cyAiYWxsIGFuYWx5c2VzIHRoYXQgb3BlcmF0ZSBvdmVyIFw8YQorLy8vIHBhcnRpY3VsYXIgSVIgdW5pdFw+IiAoZS5nLiBhIEZ1bmN0aW9uIG9yIGEgTW9kdWxlKSBpbiBpbnN0YW5jZXMgb2YKKy8vLyBQcmVzZXJ2ZWRBbmFseXNpcy4KKy8vLworLy8vIFRoaXMgbGV0cyBhIHRyYW5zZm9ybWF0aW9uIHNheSBlLmcuICJJIHByZXNlcnZlZCBhbGwgZnVuY3Rpb24gYW5hbHlzZXMiLgorLy8vCisvLy8gTm90ZSB0aGF0IHlvdSBtdXN0IHByb3ZpZGUgYW4gZXhwbGljaXQgaW5zdGFudGlhdGlvbiBkZWNsYXJhdGlvbiBhbmQKKy8vLyBkZWZpbml0aW9uIGZvciB0aGlzIHRlbXBsYXRlIGluIG9yZGVyIHRvIGdldCB0aGUgY29ycmVjdCBiZWhhdmlvciBvbgorLy8vIFdpbmRvd3MuIE90aGVyd2lzZSwgdGhlIGFkZHJlc3Mgb2YgU2V0S2V5IHdpbGwgbm90IGJlIHN0YWJsZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJUlVuaXRUPiBjbGFzcyBBbGxBbmFseXNlc09uIHsKK3B1YmxpYzoKKyAgc3RhdGljIEFuYWx5c2lzU2V0S2V5ICpJRCgpIHsgcmV0dXJuICZTZXRLZXk7IH0KKworcHJpdmF0ZToKKyAgc3RhdGljIEFuYWx5c2lzU2V0S2V5IFNldEtleTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBJUlVuaXRUPiBBbmFseXNpc1NldEtleSBBbGxBbmFseXNlc09uPElSVW5pdFQ+OjpTZXRLZXk7CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBBbGxBbmFseXNlc09uPE1vZHVsZT47CitleHRlcm4gdGVtcGxhdGUgY2xhc3MgQWxsQW5hbHlzZXNPbjxGdW5jdGlvbj47CisKKy8vLyBSZXByZXNlbnRzIGFuYWx5c2VzIHRoYXQgb25seSByZWx5IG9uIGZ1bmN0aW9ucycgY29udHJvbCBmbG93LgorLy8vCisvLy8gVGhpcyBjYW4gYmUgdXNlZCB3aXRoIFxjIFByZXNlcnZlZEFuYWx5c2VzIHRvIG1hcmsgdGhlIENGRyBhcyBwcmVzZXJ2ZWQgYW5kCisvLy8gdG8gcXVlcnkgd2hldGhlciBpdCBoYXMgYmVlbiBwcmVzZXJ2ZWQuCisvLy8KKy8vLyBUaGUgQ0ZHIG9mIGEgZnVuY3Rpb24gaXMgZGVmaW5lZCBhcyB0aGUgc2V0IG9mIGJhc2ljIGJsb2NrcyBhbmQgdGhlIGVkZ2VzCisvLy8gYmV0d2VlbiB0aGVtLiBDaGFuZ2luZyB0aGUgc2V0IG9mIGJhc2ljIGJsb2NrcyBpbiBhIGZ1bmN0aW9uIGlzIGVub3VnaCB0bworLy8vIG11dGF0ZSB0aGUgQ0ZHLiBNdXRhdGluZyB0aGUgY29uZGl0aW9uIG9mIGEgYnJhbmNoIG9yIGFyZ3VtZW50IG9mIGFuCisvLy8gaW52b2tlZCBmdW5jdGlvbiBkb2VzIG5vdCBtdXRhdGUgdGhlIENGRywgYnV0IGNoYW5naW5nIHRoZSBzdWNjZXNzb3IgbGFiZWxzCisvLy8gb2YgdGhvc2UgaW5zdHJ1Y3Rpb25zIGRvZXMuCitjbGFzcyBDRkdBbmFseXNlcyB7CitwdWJsaWM6CisgIHN0YXRpYyBBbmFseXNpc1NldEtleSAqSUQoKSB7IHJldHVybiAmU2V0S2V5OyB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyBBbmFseXNpc1NldEtleSBTZXRLZXk7Cit9OworCisvLy8gQSBzZXQgb2YgYW5hbHlzZXMgdGhhdCBhcmUgcHJlc2VydmVkIGZvbGxvd2luZyBhIHJ1biBvZiBhIHRyYW5zZm9ybWF0aW9uCisvLy8gcGFzcy4KKy8vLworLy8vIFRyYW5zZm9ybWF0aW9uIHBhc3NlcyBidWlsZCBhbmQgcmV0dXJuIHRoZXNlIG9iamVjdHMgdG8gY29tbXVuaWNhdGUgd2hpY2gKKy8vLyBhbmFseXNlcyBhcmUgc3RpbGwgdmFsaWQgYWZ0ZXIgdGhlIHRyYW5zZm9ybWF0aW9uLiBGb3IgbW9zdCBwYXNzZXMgdGhpcyBpcworLy8vIGZhaXJseSBzaW1wbGU6IGlmIHRoZXkgZG9uJ3QgY2hhbmdlIGFueXRoaW5nIGFsbCBhbmFseXNlcyBhcmUgcHJlc2VydmVkLAorLy8vIG90aGVyd2lzZSBvbmx5IGEgc2hvcnQgbGlzdCBvZiBhbmFseXNlcyB0aGF0IGhhdmUgYmVlbiBleHBsaWNpdGx5IHVwZGF0ZWQKKy8vLyBhcmUgcHJlc2VydmVkLgorLy8vCisvLy8gVGhpcyBjbGFzcyBhbHNvIGxldHMgdHJhbnNmb3JtYXRpb24gcGFzc2VzIG1hcmsgYWJzdHJhY3QgKnNldHMqIG9mIGFuYWx5c2VzCisvLy8gYXMgcHJlc2VydmVkLiBBIHRyYW5zZm9ybWF0aW9uIHRoYXQgKHNheSkgZG9lcyBub3QgYWx0ZXIgdGhlIENGRyBjYW4KKy8vLyBpbmRpY2F0ZSBzdWNoIGJ5IG1hcmtpbmcgYSBwYXJ0aWN1bGFyIEFuYWx5c2lzU2V0S2V5IGFzIHByZXNlcnZlZCwgYW5kCisvLy8gdGhlbiBhbmFseXNlcyBjYW4gcXVlcnkgd2hldGhlciB0aGF0IEFuYWx5c2lzU2V0S2V5IGlzIHByZXNlcnZlZC4KKy8vLworLy8vIEZpbmFsbHksIHRoaXMgY2xhc3MgY2FuIHJlcHJlc2VudCBhbiAiYWJhbmRvbmVkIiBhbmFseXNpcywgd2hpY2ggaXMKKy8vLyBub3QgcHJlc2VydmVkIGV2ZW4gaWYgaXQgd291bGQgYmUgY292ZXJlZCBieSBzb21lIGFic3RyYWN0IHNldCBvZiBhbmFseXNlcy4KKy8vLworLy8vIEdpdmVuIGEgYFByZXNlcnZlZEFuYWx5c2VzYCBvYmplY3QsIGFuIGFuYWx5c2lzIHdpbGwgdHlwaWNhbGx5IHdhbnQgdG8KKy8vLyBmaWd1cmUgb3V0IHdoZXRoZXIgaXQgaXMgcHJlc2VydmVkLiBJbiB0aGUgZXhhbXBsZSBiZWxvdywgTXlBbmFseXNpc1R5cGUgaXMKKy8vLyBwcmVzZXJ2ZWQgaWYgaXQncyBub3QgYWJhbmRvbmVkLCBhbmQgKGEpIGl0J3MgZXhwbGljaXRseSBtYXJrZWQgYXMKKy8vLyBwcmVzZXJ2ZWQsIChiKSwgdGhlIHNldCBBbGxBbmFseXNlc09uPE15SVJVbml0PiBpcyBwcmVzZXJ2ZWQsIG9yIChjKSBib3RoCisvLy8gQW5hbHlzaXNTZXRBIGFuZCBBbmFseXNpc1NldEIgYXJlIHByZXNlcnZlZC4KKy8vLworLy8vIGBgYAorLy8vICAgYXV0byBQQUMgPSBQQS5nZXRDaGVja2VyPE15QW5hbHlzaXNUeXBlPigpOworLy8vICAgaWYgKFBBQy5wcmVzZXJ2ZWQoKSB8fCBQQUMucHJlc2VydmVkU2V0PEFsbEFuYWx5c2VzT248TXlJUlVuaXQ+PigpIHx8CisvLy8gICAgICAgKFBBQy5wcmVzZXJ2ZWRTZXQ8QW5hbHlzaXNTZXRBPigpICYmCisvLy8gICAgICAgIFBBQy5wcmVzZXJ2ZWRTZXQ8QW5hbHlzaXNTZXRCPigpKSkgeworLy8vICAgICAvLyBUaGUgYW5hbHlzaXMgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHByZXNlcnZlZCAuLi4KKy8vLyAgIH0KKy8vLyBgYGAKK2NsYXNzIFByZXNlcnZlZEFuYWx5c2VzIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDb252ZW5pZW5jZSBmYWN0b3J5IGZ1bmN0aW9uIGZvciB0aGUgZW1wdHkgcHJlc2VydmVkIHNldC4KKyAgc3RhdGljIFByZXNlcnZlZEFuYWx5c2VzIG5vbmUoKSB7IHJldHVybiBQcmVzZXJ2ZWRBbmFseXNlcygpOyB9CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBzcGVjaWFsIHByZXNlcnZlZCBzZXQgdGhhdCBwcmVzZXJ2ZXMgYWxsIHBhc3Nlcy4KKyAgc3RhdGljIFByZXNlcnZlZEFuYWx5c2VzIGFsbCgpIHsKKyAgICBQcmVzZXJ2ZWRBbmFseXNlcyBQQTsKKyAgICBQQS5QcmVzZXJ2ZWRJRHMuaW5zZXJ0KCZBbGxBbmFseXNlc0tleSk7CisgICAgcmV0dXJuIFBBOworICB9CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBwcmVzZXJ2ZWQgYW5hbHlzZXMgb2JqZWN0IHdpdGggYSBzaW5nbGUgcHJlc2VydmVkIHNldC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFuYWx5c2lzU2V0VD4KKyAgc3RhdGljIFByZXNlcnZlZEFuYWx5c2VzIGFsbEluU2V0KCkgeworICAgIFByZXNlcnZlZEFuYWx5c2VzIFBBOworICAgIFBBLnByZXNlcnZlU2V0PEFuYWx5c2lzU2V0VD4oKTsKKyAgICByZXR1cm4gUEE7CisgIH0KKworICAvLy8gTWFyayBhbiBhbmFseXNpcyBhcyBwcmVzZXJ2ZWQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBbmFseXNpc1Q+IHZvaWQgcHJlc2VydmUoKSB7IHByZXNlcnZlKEFuYWx5c2lzVDo6SUQoKSk7IH0KKworICAvLy8gXGJyaWVmIEdpdmVuIGFuIGFuYWx5c2lzJ3MgSUQsIG1hcmsgdGhlIGFuYWx5c2lzIGFzIHByZXNlcnZlZCwgYWRkaW5nIGl0CisgIC8vLyB0byB0aGUgc2V0LgorICB2b2lkIHByZXNlcnZlKEFuYWx5c2lzS2V5ICpJRCkgeworICAgIC8vIENsZWFyIHRoaXMgSUQgZnJvbSB0aGUgZXhwbGljaXQgbm90LXByZXNlcnZlZCBzZXQgaWYgcHJlc2VudC4KKyAgICBOb3RQcmVzZXJ2ZWRBbmFseXNpc0lEcy5lcmFzZShJRCk7CisKKyAgICAvLyBJZiB3ZSdyZSBub3QgYWxyZWFkeSBwcmVzZXJ2aW5nIGFsbCBhbmFseXNlcyAob3RoZXIgdGhhbiB0aG9zZSBpbgorICAgIC8vIE5vdFByZXNlcnZlZEFuYWx5c2lzSURzKS4KKyAgICBpZiAoIWFyZUFsbFByZXNlcnZlZCgpKQorICAgICAgUHJlc2VydmVkSURzLmluc2VydChJRCk7CisgIH0KKworICAvLy8gTWFyayBhbiBhbmFseXNpcyBzZXQgYXMgcHJlc2VydmVkLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQW5hbHlzaXNTZXRUPiB2b2lkIHByZXNlcnZlU2V0KCkgeworICAgIHByZXNlcnZlU2V0KEFuYWx5c2lzU2V0VDo6SUQoKSk7CisgIH0KKworICAvLy8gTWFyayBhbiBhbmFseXNpcyBzZXQgYXMgcHJlc2VydmVkIHVzaW5nIGl0cyBJRC4KKyAgdm9pZCBwcmVzZXJ2ZVNldChBbmFseXNpc1NldEtleSAqSUQpIHsKKyAgICAvLyBJZiB3ZSdyZSBub3QgYWxyZWFkeSBpbiB0aGUgc2F0dXJhdGVkICdhbGwnIHN0YXRlLCBhZGQgdGhpcyBzZXQuCisgICAgaWYgKCFhcmVBbGxQcmVzZXJ2ZWQoKSkKKyAgICAgIFByZXNlcnZlZElEcy5pbnNlcnQoSUQpOworICB9CisKKyAgLy8vIE1hcmsgYW4gYW5hbHlzaXMgYXMgYWJhbmRvbmVkLgorICAvLy8KKyAgLy8vIEFuIGFiYW5kb25lZCBhbmFseXNpcyBpcyBub3QgcHJlc2VydmVkLCBldmVuIGlmIGl0IGlzIG5vbWluYWxseSBjb3ZlcmVkCisgIC8vLyBieSBzb21lIG90aGVyIHNldCBvciB3YXMgcHJldmlvdXNseSBleHBsaWNpdGx5IG1hcmtlZCBhcyBwcmVzZXJ2ZWQuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHlvdSBjYW4gb25seSBhYmFuZG9uIGEgc3BlY2lmaWMgYW5hbHlzaXMsIG5vdCBhICpzZXQqIG9mCisgIC8vLyBhbmFseXNlcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFuYWx5c2lzVD4gdm9pZCBhYmFuZG9uKCkgeyBhYmFuZG9uKEFuYWx5c2lzVDo6SUQoKSk7IH0KKworICAvLy8gTWFyayBhbiBhbmFseXNpcyBhcyBhYmFuZG9uZWQgdXNpbmcgaXRzIElELgorICAvLy8KKyAgLy8vIEFuIGFiYW5kb25lZCBhbmFseXNpcyBpcyBub3QgcHJlc2VydmVkLCBldmVuIGlmIGl0IGlzIG5vbWluYWxseSBjb3ZlcmVkCisgIC8vLyBieSBzb21lIG90aGVyIHNldCBvciB3YXMgcHJldmlvdXNseSBleHBsaWNpdGx5IG1hcmtlZCBhcyBwcmVzZXJ2ZWQuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHlvdSBjYW4gb25seSBhYmFuZG9uIGEgc3BlY2lmaWMgYW5hbHlzaXMsIG5vdCBhICpzZXQqIG9mCisgIC8vLyBhbmFseXNlcy4KKyAgdm9pZCBhYmFuZG9uKEFuYWx5c2lzS2V5ICpJRCkgeworICAgIFByZXNlcnZlZElEcy5lcmFzZShJRCk7CisgICAgTm90UHJlc2VydmVkQW5hbHlzaXNJRHMuaW5zZXJ0KElEKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSW50ZXJzZWN0IHRoaXMgc2V0IHdpdGggYW5vdGhlciBpbiBwbGFjZS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGEgbXV0YXRpbmcgb3BlcmF0aW9uIG9uIHRoaXMgcHJlc2VydmVkIHNldCwgcmVtb3ZpbmcgYWxsCisgIC8vLyBwcmVzZXJ2ZWQgcGFzc2VzIHdoaWNoIGFyZSBub3QgYWxzbyBwcmVzZXJ2ZWQgaW4gdGhlIGFyZ3VtZW50LgorICB2b2lkIGludGVyc2VjdChjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmQXJnKSB7CisgICAgaWYgKEFyZy5hcmVBbGxQcmVzZXJ2ZWQoKSkKKyAgICAgIHJldHVybjsKKyAgICBpZiAoYXJlQWxsUHJlc2VydmVkKCkpIHsKKyAgICAgICp0aGlzID0gQXJnOworICAgICAgcmV0dXJuOworICAgIH0KKyAgICAvLyBUaGUgaW50ZXJzZWN0aW9uIHJlcXVpcmVzIHRoZSAqdW5pb24qIG9mIHRoZSBleHBsaWNpdGx5IG5vdC1wcmVzZXJ2ZWQKKyAgICAvLyBJRHMgYW5kIHRoZSAqaW50ZXJzZWN0aW9uKiBvZiB0aGUgcHJlc2VydmVkIElEcy4KKyAgICBmb3IgKGF1dG8gSUQgOiBBcmcuTm90UHJlc2VydmVkQW5hbHlzaXNJRHMpIHsKKyAgICAgIFByZXNlcnZlZElEcy5lcmFzZShJRCk7CisgICAgICBOb3RQcmVzZXJ2ZWRBbmFseXNpc0lEcy5pbnNlcnQoSUQpOworICAgIH0KKyAgICBmb3IgKGF1dG8gSUQgOiBQcmVzZXJ2ZWRJRHMpCisgICAgICBpZiAoIUFyZy5QcmVzZXJ2ZWRJRHMuY291bnQoSUQpKQorICAgICAgICBQcmVzZXJ2ZWRJRHMuZXJhc2UoSUQpOworICB9CisKKyAgLy8vIFxicmllZiBJbnRlcnNlY3QgdGhpcyBzZXQgd2l0aCBhIHRlbXBvcmFyeSBvdGhlciBzZXQgaW4gcGxhY2UuCisgIC8vLworICAvLy8gVGhpcyBpcyBhIG11dGF0aW5nIG9wZXJhdGlvbiBvbiB0aGlzIHByZXNlcnZlZCBzZXQsIHJlbW92aW5nIGFsbAorICAvLy8gcHJlc2VydmVkIHBhc3NlcyB3aGljaCBhcmUgbm90IGFsc28gcHJlc2VydmVkIGluIHRoZSBhcmd1bWVudC4KKyAgdm9pZCBpbnRlcnNlY3QoUHJlc2VydmVkQW5hbHlzZXMgJiZBcmcpIHsKKyAgICBpZiAoQXJnLmFyZUFsbFByZXNlcnZlZCgpKQorICAgICAgcmV0dXJuOworICAgIGlmIChhcmVBbGxQcmVzZXJ2ZWQoKSkgeworICAgICAgKnRoaXMgPSBzdGQ6Om1vdmUoQXJnKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgLy8gVGhlIGludGVyc2VjdGlvbiByZXF1aXJlcyB0aGUgKnVuaW9uKiBvZiB0aGUgZXhwbGljaXRseSBub3QtcHJlc2VydmVkCisgICAgLy8gSURzIGFuZCB0aGUgKmludGVyc2VjdGlvbiogb2YgdGhlIHByZXNlcnZlZCBJRHMuCisgICAgZm9yIChhdXRvIElEIDogQXJnLk5vdFByZXNlcnZlZEFuYWx5c2lzSURzKSB7CisgICAgICBQcmVzZXJ2ZWRJRHMuZXJhc2UoSUQpOworICAgICAgTm90UHJlc2VydmVkQW5hbHlzaXNJRHMuaW5zZXJ0KElEKTsKKyAgICB9CisgICAgZm9yIChhdXRvIElEIDogUHJlc2VydmVkSURzKQorICAgICAgaWYgKCFBcmcuUHJlc2VydmVkSURzLmNvdW50KElEKSkKKyAgICAgICAgUHJlc2VydmVkSURzLmVyYXNlKElEKTsKKyAgfQorCisgIC8vLyBBIGNoZWNrZXIgb2JqZWN0IHRoYXQgbWFrZXMgaXQgZWFzeSB0byBxdWVyeSBmb3Igd2hldGhlciBhbiBhbmFseXNpcyBvcgorICAvLy8gc29tZSBzZXQgY292ZXJpbmcgaXQgaXMgcHJlc2VydmVkLgorICBjbGFzcyBQcmVzZXJ2ZWRBbmFseXNpc0NoZWNrZXIgeworICAgIGZyaWVuZCBjbGFzcyBQcmVzZXJ2ZWRBbmFseXNlczsKKworICAgIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzICZQQTsKKyAgICBBbmFseXNpc0tleSAqY29uc3QgSUQ7CisgICAgY29uc3QgYm9vbCBJc0FiYW5kb25lZDsKKworICAgIC8vLyBBIFByZXNlcnZlZEFuYWx5c2lzQ2hlY2tlciBpcyB0aWVkIHRvIGEgcGFydGljdWxhciBBbmFseXNpcyBiZWNhdXNlCisgICAgLy8vIGBwcmVzZXJ2ZWQoKWAgYW5kIGBwcmVzZXJ2ZWRTZXQoKWAgYm90aCByZXR1cm4gZmFsc2UgaWYgdGhlIEFuYWx5c2lzCisgICAgLy8vIHdhcyBhYmFuZG9uZWQuCisgICAgUHJlc2VydmVkQW5hbHlzaXNDaGVja2VyKGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzICZQQSwgQW5hbHlzaXNLZXkgKklEKQorICAgICAgICA6IFBBKFBBKSwgSUQoSUQpLCBJc0FiYW5kb25lZChQQS5Ob3RQcmVzZXJ2ZWRBbmFseXNpc0lEcy5jb3VudChJRCkpIHt9CisKKyAgcHVibGljOgorICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNoZWNrZXIncyBhbmFseXNpcyB3YXMgbm90IGFiYW5kb25lZCBhbmQgZWl0aGVyCisgICAgLy8vICAtIHRoZSBhbmFseXNpcyBpcyBleHBsaWNpdGx5IHByZXNlcnZlZCBvcgorICAgIC8vLyAgLSBhbGwgYW5hbHlzZXMgYXJlIHByZXNlcnZlZC4KKyAgICBib29sIHByZXNlcnZlZCgpIHsKKyAgICAgIHJldHVybiAhSXNBYmFuZG9uZWQgJiYgKFBBLlByZXNlcnZlZElEcy5jb3VudCgmQWxsQW5hbHlzZXNLZXkpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQQS5QcmVzZXJ2ZWRJRHMuY291bnQoSUQpKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjaGVja2VyJ3MgYW5hbHlzaXMgd2FzIG5vdCBhYmFuZG9uZWQgYW5kIGVpdGhlcgorICAgIC8vLyAgLSBccCBBbmFseXNpc1NldFQgaXMgZXhwbGljaXRseSBwcmVzZXJ2ZWQgb3IKKyAgICAvLy8gIC0gYWxsIGFuYWx5c2VzIGFyZSBwcmVzZXJ2ZWQuCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIEFuYWx5c2lzU2V0VD4gYm9vbCBwcmVzZXJ2ZWRTZXQoKSB7CisgICAgICBBbmFseXNpc1NldEtleSAqU2V0SUQgPSBBbmFseXNpc1NldFQ6OklEKCk7CisgICAgICByZXR1cm4gIUlzQWJhbmRvbmVkICYmIChQQS5QcmVzZXJ2ZWRJRHMuY291bnQoJkFsbEFuYWx5c2VzS2V5KSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUEEuUHJlc2VydmVkSURzLmNvdW50KFNldElEKSk7CisgICAgfQorICB9OworCisgIC8vLyBCdWlsZCBhIGNoZWNrZXIgZm9yIHRoaXMgYFByZXNlcnZlZEFuYWx5c2VzYCBhbmQgdGhlIHNwZWNpZmllZCBhbmFseXNpcworICAvLy8gdHlwZS4KKyAgLy8vCisgIC8vLyBZb3UgY2FuIHVzZSB0aGUgcmV0dXJuZWQgb2JqZWN0IHRvIHF1ZXJ5IHdoZXRoZXIgYW4gYW5hbHlzaXMgd2FzCisgIC8vLyBwcmVzZXJ2ZWQuIFNlZSB0aGUgZXhhbXBsZSBpbiB0aGUgY29tbWVudCBvbiBgUHJlc2VydmVkQW5hbHlzaXNgLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQW5hbHlzaXNUPiBQcmVzZXJ2ZWRBbmFseXNpc0NoZWNrZXIgZ2V0Q2hlY2tlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlc2VydmVkQW5hbHlzaXNDaGVja2VyKCp0aGlzLCBBbmFseXNpc1Q6OklEKCkpOworICB9CisKKyAgLy8vIEJ1aWxkIGEgY2hlY2tlciBmb3IgdGhpcyBgUHJlc2VydmVkQW5hbHlzZXNgIGFuZCB0aGUgc3BlY2lmaWVkIGFuYWx5c2lzCisgIC8vLyBJRC4KKyAgLy8vCisgIC8vLyBZb3UgY2FuIHVzZSB0aGUgcmV0dXJuZWQgb2JqZWN0IHRvIHF1ZXJ5IHdoZXRoZXIgYW4gYW5hbHlzaXMgd2FzCisgIC8vLyBwcmVzZXJ2ZWQuIFNlZSB0aGUgZXhhbXBsZSBpbiB0aGUgY29tbWVudCBvbiBgUHJlc2VydmVkQW5hbHlzaXNgLgorICBQcmVzZXJ2ZWRBbmFseXNpc0NoZWNrZXIgZ2V0Q2hlY2tlcihBbmFseXNpc0tleSAqSUQpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlc2VydmVkQW5hbHlzaXNDaGVja2VyKCp0aGlzLCBJRCk7CisgIH0KKworICAvLy8gVGVzdCB3aGV0aGVyIGFsbCBhbmFseXNlcyBhcmUgcHJlc2VydmVkIChhbmQgbm9uZSBhcmUgYWJhbmRvbmVkKS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgcHJpbWFyaWx5IHRvIG9wdGltaXplIGZvciB0aGUgY29tbW9uIGNhc2Ugb2YgYSB0cmFuc2Zvcm1hdGlvbgorICAvLy8gd2hpY2ggbWFrZXMgbm8gY2hhbmdlcyB0byB0aGUgSVIuCisgIGJvb2wgYXJlQWxsUHJlc2VydmVkKCkgY29uc3QgeworICAgIHJldHVybiBOb3RQcmVzZXJ2ZWRBbmFseXNpc0lEcy5lbXB0eSgpICYmCisgICAgICAgICAgIFByZXNlcnZlZElEcy5jb3VudCgmQWxsQW5hbHlzZXNLZXkpOworICB9CisKKyAgLy8vIERpcmVjdGx5IHRlc3Qgd2hldGhlciBhIHNldCBvZiBhbmFseXNlcyBpcyBwcmVzZXJ2ZWQuCisgIC8vLworICAvLy8gVGhpcyBpcyBvbmx5IHRydWUgd2hlbiBubyBhbmFseXNlcyBoYXZlIGJlZW4gZXhwbGljaXRseSBhYmFuZG9uZWQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBbmFseXNpc1NldFQ+IGJvb2wgYWxsQW5hbHlzZXNJblNldFByZXNlcnZlZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gYWxsQW5hbHlzZXNJblNldFByZXNlcnZlZChBbmFseXNpc1NldFQ6OklEKCkpOworICB9CisKKyAgLy8vIERpcmVjdGx5IHRlc3Qgd2hldGhlciBhIHNldCBvZiBhbmFseXNlcyBpcyBwcmVzZXJ2ZWQuCisgIC8vLworICAvLy8gVGhpcyBpcyBvbmx5IHRydWUgd2hlbiBubyBhbmFseXNlcyBoYXZlIGJlZW4gZXhwbGljaXRseSBhYmFuZG9uZWQuCisgIGJvb2wgYWxsQW5hbHlzZXNJblNldFByZXNlcnZlZChBbmFseXNpc1NldEtleSAqU2V0SUQpIGNvbnN0IHsKKyAgICByZXR1cm4gTm90UHJlc2VydmVkQW5hbHlzaXNJRHMuZW1wdHkoKSAmJgorICAgICAgICAgICAoUHJlc2VydmVkSURzLmNvdW50KCZBbGxBbmFseXNlc0tleSkgfHwgUHJlc2VydmVkSURzLmNvdW50KFNldElEKSk7CisgIH0KKworcHJpdmF0ZToKKyAgLy8vIEEgc3BlY2lhbCBrZXkgdXNlZCB0byBpbmRpY2F0ZSBhbGwgYW5hbHlzZXMuCisgIHN0YXRpYyBBbmFseXNpc1NldEtleSBBbGxBbmFseXNlc0tleTsKKworICAvLy8gVGhlIElEcyBvZiBhbmFseXNlcyBhbmQgYW5hbHlzaXMgc2V0cyB0aGF0IGFyZSBwcmVzZXJ2ZWQuCisgIFNtYWxsUHRyU2V0PHZvaWQgKiwgMj4gUHJlc2VydmVkSURzOworCisgIC8vLyBUaGUgSURzIG9mIGV4cGxpY2l0bHkgbm90LXByZXNlcnZlZCBhbmFseXNlcy4KKyAgLy8vCisgIC8vLyBJZiBhbiBhbmFseXNpcyBpbiB0aGlzIHNldCBpcyBjb3ZlcmVkIGJ5IGEgc2V0IGluIGBQcmVzZXJ2ZWRJRHNgLCB3ZQorICAvLy8gY29uc2lkZXIgaXQgbm90LXByZXNlcnZlZC4gVGhhdCBpcywgYE5vdFByZXNlcnZlZEFuYWx5c2lzSURzYCBhbHdheXMKKyAgLy8vICJ3aW5zIiBvdmVyIGFuYWx5c2lzIHNldHMgaW4gYFByZXNlcnZlZElEc2AuCisgIC8vLworICAvLy8gQWxzbywgYSBnaXZlbiBJRCBzaG91bGQgbmV2ZXIgb2NjdXIgYm90aCBoZXJlIGFuZCBpbiBgUHJlc2VydmVkSURzYC4KKyAgU21hbGxQdHJTZXQ8QW5hbHlzaXNLZXkgKiwgMj4gTm90UHJlc2VydmVkQW5hbHlzaXNJRHM7Cit9OworCisvLyBGb3J3YXJkIGRlY2xhcmUgdGhlIGFuYWx5c2lzIG1hbmFnZXIgdGVtcGxhdGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSVJVbml0VCwgdHlwZW5hbWUuLi4gRXh0cmFBcmdUcz4gY2xhc3MgQW5hbHlzaXNNYW5hZ2VyOworCisvLy8gQSBDUlRQIG1peC1pbiB0byBhdXRvbWF0aWNhbGx5IHByb3ZpZGUgaW5mb3JtYXRpb25hbCBBUElzIG5lZWRlZCBmb3IKKy8vLyBwYXNzZXMuCisvLy8KKy8vLyBUaGlzIHByb3ZpZGVzIHNvbWUgYm9pbGVycGxhdGUgZm9yIHR5cGVzIHRoYXQgYXJlIHBhc3Nlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkVD4gc3RydWN0IFBhc3NJbmZvTWl4aW4geworICAvLy8gR2V0cyB0aGUgbmFtZSBvZiB0aGUgcGFzcyB3ZSBhcmUgbWl4ZWQgaW50by4KKyAgc3RhdGljIFN0cmluZ1JlZiBuYW1lKCkgeworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19iYXNlX29mPFBhc3NJbmZvTWl4aW4sIERlcml2ZWRUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiTXVzdCBwYXNzIHRoZSBkZXJpdmVkIHR5cGUgYXMgdGhlIHRlbXBsYXRlIGFyZ3VtZW50ISIpOworICAgIFN0cmluZ1JlZiBOYW1lID0gZ2V0VHlwZU5hbWU8RGVyaXZlZFQ+KCk7CisgICAgaWYgKE5hbWUuc3RhcnRzd2l0aCgibGx2bTo6IikpCisgICAgICBOYW1lID0gTmFtZS5kcm9wX2Zyb250KHN0cmxlbigibGx2bTo6IikpOworICAgIHJldHVybiBOYW1lOworICB9Cit9OworCisvLy8gQSBDUlRQIG1peC1pbiB0aGF0IHByb3ZpZGVzIGluZm9ybWF0aW9uYWwgQVBJcyBuZWVkZWQgZm9yIGFuYWx5c2lzIHBhc3Nlcy4KKy8vLworLy8vIFRoaXMgcHJvdmlkZXMgc29tZSBib2lsZXJwbGF0ZSBmb3IgdHlwZXMgdGhhdCBhcmUgYW5hbHlzaXMgcGFzc2VzLiBJdAorLy8vIGF1dG9tYXRpY2FsbHkgbWl4ZXMgaW4gXGMgUGFzc0luZm9NaXhpbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkVD4KK3N0cnVjdCBBbmFseXNpc0luZm9NaXhpbiA6IFBhc3NJbmZvTWl4aW48RGVyaXZlZFQ+IHsKKyAgLy8vIFJldHVybnMgYW4gb3BhcXVlLCB1bmlxdWUgSUQgZm9yIHRoaXMgYW5hbHlzaXMgdHlwZS4KKyAgLy8vCisgIC8vLyBUaGlzIElEIGlzIGEgcG9pbnRlciB0eXBlIHRoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSA4LWJ5dGUgYWxpZ25lZCBhbmQgdGh1cworICAvLy8gc3VpdGFibGUgZm9yIHVzZSBpbiBzZXRzLCBtYXBzLCBhbmQgb3RoZXIgZGF0YSBzdHJ1Y3R1cmVzIHRoYXQgdXNlIHRoZSBsb3cKKyAgLy8vIGJpdHMgb2YgcG9pbnRlcnMuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgdGhlIGRlcml2ZWQgdHlwZSBwcm92aWRlIGEgc3RhdGljIFxjIEFuYWx5c2lzS2V5CisgIC8vLyBtZW1iZXIgY2FsbGVkIFxjIEtleS4KKyAgLy8vCisgIC8vLyBGSVhNRTogVGhlIG9ubHkgcmVhc29uIHRoZSBtaXhpbiB0eXBlIGl0c2VsZiBjYW4ndCBkZWNsYXJlIHRoZSBLZXkgdmFsdWUKKyAgLy8vIGlzIHRoYXQgc29tZSBjb21waWxlcnMgY2Fubm90IGNvcnJlY3RseSB1bmlxdWUgYSB0ZW1wbGF0ZWQgc3RhdGljIHZhcmlhYmxlCisgIC8vLyBzbyBpdCBoYXMgdGhlIHNhbWUgYWRkcmVzc2VzIGluIGVhY2ggaW5zdGFudGlhdGlvbi4gVGhlIG9ubHkgY3VycmVudGx5CisgIC8vLyBrbm93biBwbGF0Zm9ybSB3aXRoIHRoaXMgbGltaXRhdGlvbiBpcyBXaW5kb3dzIERMTCBidWlsZHMsIHNwZWNpZmljYWxseQorICAvLy8gYnVpbGRpbmcgZWFjaCBwYXJ0IG9mIExMVk0gYXMgYSBETEwuIElmIHdlIGV2ZXIgcmVtb3ZlIHRoYXQgYnVpbGQKKyAgLy8vIGNvbmZpZ3VyYXRpb24sIHRoaXMgbWl4aW4gY2FuIHByb3ZpZGUgdGhlIHN0YXRpYyBrZXkgYXMgd2VsbC4KKyAgc3RhdGljIEFuYWx5c2lzS2V5ICpJRCgpIHsKKyAgICBzdGF0aWNfYXNzZXJ0KHN0ZDo6aXNfYmFzZV9vZjxBbmFseXNpc0luZm9NaXhpbiwgRGVyaXZlZFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJNdXN0IHBhc3MgdGhlIGRlcml2ZWQgdHlwZSBhcyB0aGUgdGVtcGxhdGUgYXJndW1lbnQhIik7CisgICAgcmV0dXJuICZEZXJpdmVkVDo6S2V5OworICB9Cit9OworCisvLy8gXGJyaWVmIE1hbmFnZXMgYSBzZXF1ZW5jZSBvZiBwYXNzZXMgb3ZlciBhIHBhcnRpY3VsYXIgdW5pdCBvZiBJUi4KKy8vLworLy8vIEEgcGFzcyBtYW5hZ2VyIGNvbnRhaW5zIGEgc2VxdWVuY2Ugb2YgcGFzc2VzIHRvIHJ1biBvdmVyIGEgcGFydGljdWxhciB1bml0CisvLy8gb2YgSVIgKGUuZy4gRnVuY3Rpb25zLCBNb2R1bGVzKS4gSXQgaXMgaXRzZWxmIGEgdmFsaWQgcGFzcyBvdmVyIHRoYXQgdW5pdCBvZgorLy8vIElSLCBhbmQgd2hlbiBydW4gb3ZlciBzb21lIGdpdmVuIElSIHdpbGwgcnVuIGVhY2ggb2YgaXRzIGNvbnRhaW5lZCBwYXNzZXMgaW4KKy8vLyBzZXF1ZW5jZS4gUGFzcyBtYW5hZ2VycyBhcmUgdGhlIHByaW1hcnkgYW5kIG1vc3QgYmFzaWMgYnVpbGRpbmcgYmxvY2sgb2YgYQorLy8vIHBhc3MgcGlwZWxpbmUuCisvLy8KKy8vLyBXaGVuIHlvdSBydW4gYSBwYXNzIG1hbmFnZXIsIHlvdSBwcm92aWRlIGFuIFxjIEFuYWx5c2lzTWFuYWdlcjxJUlVuaXRUPgorLy8vIGFyZ3VtZW50LiBUaGUgcGFzcyBtYW5hZ2VyIHdpbGwgcHJvcGFnYXRlIHRoYXQgYW5hbHlzaXMgbWFuYWdlciB0byBlYWNoCisvLy8gcGFzcyBpdCBydW5zLCBhbmQgd2lsbCBjYWxsIHRoZSBhbmFseXNpcyBtYW5hZ2VyJ3MgaW52YWxpZGF0aW9uIHJvdXRpbmUgd2l0aAorLy8vIHRoZSBQcmVzZXJ2ZWRBbmFseXNlcyBvZiBlYWNoIHBhc3MgaXQgcnVucy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJUlVuaXRULAorICAgICAgICAgIHR5cGVuYW1lIEFuYWx5c2lzTWFuYWdlclQgPSBBbmFseXNpc01hbmFnZXI8SVJVbml0VD4sCisgICAgICAgICAgdHlwZW5hbWUuLi4gRXh0cmFBcmdUcz4KK2NsYXNzIFBhc3NNYW5hZ2VyIDogcHVibGljIFBhc3NJbmZvTWl4aW48CisgICAgICAgICAgICAgICAgICAgICAgICBQYXNzTWFuYWdlcjxJUlVuaXRULCBBbmFseXNpc01hbmFnZXJULCBFeHRyYUFyZ1RzLi4uPj4geworcHVibGljOgorICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhIHBhc3MgbWFuYWdlci4KKyAgLy8vCisgIC8vLyBJZiBccCBEZWJ1Z0xvZ2dpbmcgaXMgdHJ1ZSwgd2UnbGwgbG9nIG91ciBwcm9ncmVzcyB0byBsbHZtOjpkYmdzKCkuCisgIGV4cGxpY2l0IFBhc3NNYW5hZ2VyKGJvb2wgRGVidWdMb2dnaW5nID0gZmFsc2UpIDogRGVidWdMb2dnaW5nKERlYnVnTG9nZ2luZykge30KKworICAvLyBGSVhNRTogVGhlc2UgYXJlIGVxdWl2YWxlbnQgdG8gdGhlIGRlZmF1bHQgbW92ZSBjb25zdHJ1Y3Rvci9tb3ZlCisgIC8vIGFzc2lnbm1lbnQuIEhvd2V2ZXIsIHVzaW5nID0gZGVmYXVsdCB0cmlnZ2VycyBsaW5rZXIgZXJyb3JzIGR1ZSB0byB0aGUKKyAgLy8gZXhwbGljaXQgaW5zdGFudGlhdGlvbnMgYmVsb3cuIEZpbmQgYXdheSB0byB1c2UgdGhlIGRlZmF1bHQgYW5kIHJlbW92ZSB0aGUKKyAgLy8gZHVwbGljYXRlZCBjb2RlIGhlcmUuCisgIFBhc3NNYW5hZ2VyKFBhc3NNYW5hZ2VyICYmQXJnKQorICAgICAgOiBQYXNzZXMoc3RkOjptb3ZlKEFyZy5QYXNzZXMpKSwKKyAgICAgICAgRGVidWdMb2dnaW5nKHN0ZDo6bW92ZShBcmcuRGVidWdMb2dnaW5nKSkge30KKworICBQYXNzTWFuYWdlciAmb3BlcmF0b3I9KFBhc3NNYW5hZ2VyICYmUkhTKSB7CisgICAgUGFzc2VzID0gc3RkOjptb3ZlKFJIUy5QYXNzZXMpOworICAgIERlYnVnTG9nZ2luZyA9IHN0ZDo6bW92ZShSSFMuRGVidWdMb2dnaW5nKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gXGJyaWVmIFJ1biBhbGwgb2YgdGhlIHBhc3NlcyBpbiB0aGlzIG1hbmFnZXIgb3ZlciB0aGUgZ2l2ZW4gdW5pdCBvZiBJUi4KKyAgLy8vIEV4dHJhQXJncyBhcmUgcGFzc2VkIHRvIGVhY2ggcGFzcy4KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKElSVW5pdFQgJklSLCBBbmFseXNpc01hbmFnZXJUICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEV4dHJhQXJnVHMuLi4gRXh0cmFBcmdzKSB7CisgICAgUHJlc2VydmVkQW5hbHlzZXMgUEEgPSBQcmVzZXJ2ZWRBbmFseXNlczo6YWxsKCk7CisKKyAgICBpZiAoRGVidWdMb2dnaW5nKQorICAgICAgZGJncygpIDw8ICJTdGFydGluZyAiIDw8IGdldFR5cGVOYW1lPElSVW5pdFQ+KCkgPDwgIiBwYXNzIG1hbmFnZXIgcnVuLlxuIjsKKworICAgIGZvciAodW5zaWduZWQgSWR4ID0gMCwgU2l6ZSA9IFBhc3Nlcy5zaXplKCk7IElkeCAhPSBTaXplOyArK0lkeCkgeworICAgICAgaWYgKERlYnVnTG9nZ2luZykKKyAgICAgICAgZGJncygpIDw8ICJSdW5uaW5nIHBhc3M6ICIgPDwgUGFzc2VzW0lkeF0tPm5hbWUoKSA8PCAiIG9uICIKKyAgICAgICAgICAgICAgIDw8IElSLmdldE5hbWUoKSA8PCAiXG4iOworCisgICAgICBQcmVzZXJ2ZWRBbmFseXNlcyBQYXNzUEEgPSBQYXNzZXNbSWR4XS0+cnVuKElSLCBBTSwgRXh0cmFBcmdzLi4uKTsKKworICAgICAgLy8gVXBkYXRlIHRoZSBhbmFseXNpcyBtYW5hZ2VyIGFzIGVhY2ggcGFzcyBydW5zIGFuZCBwb3RlbnRpYWxseQorICAgICAgLy8gaW52YWxpZGF0ZXMgYW5hbHlzZXMuCisgICAgICBBTS5pbnZhbGlkYXRlKElSLCBQYXNzUEEpOworCisgICAgICAvLyBGaW5hbGx5LCBpbnRlcnNlY3QgdGhlIHByZXNlcnZlZCBhbmFseXNlcyB0byBjb21wdXRlIHRoZSBhZ2dyZWdhdGUKKyAgICAgIC8vIHByZXNlcnZlZCBzZXQgZm9yIHRoaXMgcGFzcyBtYW5hZ2VyLgorICAgICAgUEEuaW50ZXJzZWN0KHN0ZDo6bW92ZShQYXNzUEEpKTsKKworICAgICAgLy8gRklYTUU6IEhpc3RvcmljYWxseSwgdGhlIHBhc3MgbWFuYWdlcnMgYWxsIGNhbGxlZCB0aGUgTExWTSBjb250ZXh0J3MKKyAgICAgIC8vIHlpZWxkIGZ1bmN0aW9uIGhlcmUuIFdlIGRvbid0IGhhdmUgYSBnZW5lcmljIHdheSB0byBhY3F1aXJlIHRoZQorICAgICAgLy8gY29udGV4dCBhbmQgaXQgaXNuJ3QgeWV0IGNsZWFyIHdoYXQgdGhlIHJpZ2h0IHBhdHRlcm4gaXMgZm9yIHlpZWxkaW5nCisgICAgICAvLyBpbiB0aGUgbmV3IHBhc3MgbWFuYWdlciBzbyBpdCBpcyBjdXJyZW50bHkgb21pdHRlZC4KKyAgICAgIC8vSVIuZ2V0Q29udGV4dCgpLnlpZWxkKCk7CisgICAgfQorCisgICAgLy8gSW52YWxpZGF0aW9uIHdhcyBoYW5kbGVkIGFmdGVyIGVhY2ggcGFzcyBpbiB0aGUgYWJvdmUgbG9vcCBmb3IgdGhlCisgICAgLy8gY3VycmVudCB1bml0IG9mIElSLiBUaGVyZWZvcmUsIHRoZSByZW1haW5pbmcgYW5hbHlzaXMgcmVzdWx0cyBpbiB0aGUKKyAgICAvLyBBbmFseXNpc01hbmFnZXIgYXJlIHByZXNlcnZlZC4gV2UgbWFyayB0aGlzIHdpdGggYSBzZXQgc28gdGhhdCB3ZSBkb24ndAorICAgIC8vIG5lZWQgdG8gaW5zcGVjdCBlYWNoIG9uZSBpbmRpdmlkdWFsbHkuCisgICAgUEEucHJlc2VydmVTZXQ8QWxsQW5hbHlzZXNPbjxJUlVuaXRUPj4oKTsKKworICAgIGlmIChEZWJ1Z0xvZ2dpbmcpCisgICAgICBkYmdzKCkgPDwgIkZpbmlzaGVkICIgPDwgZ2V0VHlwZU5hbWU8SVJVbml0VD4oKSA8PCAiIHBhc3MgbWFuYWdlciBydW4uXG4iOworCisgICAgcmV0dXJuIFBBOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhc3NUPiB2b2lkIGFkZFBhc3MoUGFzc1QgUGFzcykgeworICAgIHVzaW5nIFBhc3NNb2RlbFQgPQorICAgICAgICBkZXRhaWw6OlBhc3NNb2RlbDxJUlVuaXRULCBQYXNzVCwgUHJlc2VydmVkQW5hbHlzZXMsIEFuYWx5c2lzTWFuYWdlclQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dHJhQXJnVHMuLi4+OworCisgICAgUGFzc2VzLmVtcGxhY2VfYmFjayhuZXcgUGFzc01vZGVsVChzdGQ6Om1vdmUoUGFzcykpKTsKKyAgfQorCitwcml2YXRlOgorICB1c2luZyBQYXNzQ29uY2VwdFQgPQorICAgICAgZGV0YWlsOjpQYXNzQ29uY2VwdDxJUlVuaXRULCBBbmFseXNpc01hbmFnZXJULCBFeHRyYUFyZ1RzLi4uPjsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8UGFzc0NvbmNlcHRUPj4gUGFzc2VzOworCisgIC8vLyBcYnJpZWYgRmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgd2Ugc2hvdWxkIGRvIGRlYnVnIGxvZ2dpbmcuCisgIGJvb2wgRGVidWdMb2dnaW5nOworfTsKKworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIFBhc3NNYW5hZ2VyPE1vZHVsZT47CisKKy8vLyBcYnJpZWYgQ29udmVuaWVuY2UgdHlwZWRlZiBmb3IgYSBwYXNzIG1hbmFnZXIgb3ZlciBtb2R1bGVzLgordXNpbmcgTW9kdWxlUGFzc01hbmFnZXIgPSBQYXNzTWFuYWdlcjxNb2R1bGU+OworCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgUGFzc01hbmFnZXI8RnVuY3Rpb24+OworCisvLy8gXGJyaWVmIENvbnZlbmllbmNlIHR5cGVkZWYgZm9yIGEgcGFzcyBtYW5hZ2VyIG92ZXIgZnVuY3Rpb25zLgordXNpbmcgRnVuY3Rpb25QYXNzTWFuYWdlciA9IFBhc3NNYW5hZ2VyPEZ1bmN0aW9uPjsKKworLy8vIFxicmllZiBBIGNvbnRhaW5lciBmb3IgYW5hbHlzZXMgdGhhdCBsYXppbHkgcnVucyB0aGVtIGFuZCBjYWNoZXMgdGhlaXIKKy8vLyByZXN1bHRzLgorLy8vCisvLy8gVGhpcyBjbGFzcyBjYW4gbWFuYWdlIGFuYWx5c2VzIGZvciBhbnkgSVIgdW5pdCB3aGVyZSB0aGUgYWRkcmVzcyBvZiB0aGUgSVIKKy8vLyB1bml0IHN1ZmZpY2llcyBhcyBpdHMgaWRlbnRpdHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSVJVbml0VCwgdHlwZW5hbWUuLi4gRXh0cmFBcmdUcz4gY2xhc3MgQW5hbHlzaXNNYW5hZ2VyIHsKK3B1YmxpYzoKKyAgY2xhc3MgSW52YWxpZGF0b3I7CisKK3ByaXZhdGU6CisgIC8vIE5vdyB0aGF0IHdlJ3ZlIGRlZmluZWQgb3VyIGludmFsaWRhdG9yLCB3ZSBjYW4gZGVmaW5lIHRoZSBjb25jZXB0IHR5cGVzLgorICB1c2luZyBSZXN1bHRDb25jZXB0VCA9CisgICAgICBkZXRhaWw6OkFuYWx5c2lzUmVzdWx0Q29uY2VwdDxJUlVuaXRULCBQcmVzZXJ2ZWRBbmFseXNlcywgSW52YWxpZGF0b3I+OworICB1c2luZyBQYXNzQ29uY2VwdFQgPQorICAgICAgZGV0YWlsOjpBbmFseXNpc1Bhc3NDb25jZXB0PElSVW5pdFQsIFByZXNlcnZlZEFuYWx5c2VzLCBJbnZhbGlkYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYUFyZ1RzLi4uPjsKKworICAvLy8gXGJyaWVmIExpc3Qgb2YgYW5hbHlzaXMgcGFzcyBJRHMgYW5kIGFzc29jaWF0ZWQgY29uY2VwdCBwb2ludGVycy4KKyAgLy8vCisgIC8vLyBSZXF1aXJlcyBpdGVyYXRvcnMgdG8gYmUgdmFsaWQgYWNyb3NzIGFwcGVuZGluZyBuZXcgZW50cmllcyBhbmQgYXJiaXRyYXJ5CisgIC8vLyBlcmFzZXMuIFByb3ZpZGVzIHRoZSBhbmFseXNpcyBJRCB0byBlbmFibGUgZmluZGluZyBpdGVyYXRvcnMgdG8gYSBnaXZlbgorICAvLy8gZW50cnkgaW4gbWFwcyBiZWxvdywgYW5kIHByb3ZpZGVzIHRoZSBzdG9yYWdlIGZvciB0aGUgYWN0dWFsIHJlc3VsdAorICAvLy8gY29uY2VwdC4KKyAgdXNpbmcgQW5hbHlzaXNSZXN1bHRMaXN0VCA9CisgICAgICBzdGQ6Omxpc3Q8c3RkOjpwYWlyPEFuYWx5c2lzS2V5ICosIHN0ZDo6dW5pcXVlX3B0cjxSZXN1bHRDb25jZXB0VD4+PjsKKworICAvLy8gXGJyaWVmIE1hcCB0eXBlIGZyb20gSVJVbml0VCBwb2ludGVyIHRvIG91ciBjdXN0b20gbGlzdCB0eXBlLgorICB1c2luZyBBbmFseXNpc1Jlc3VsdExpc3RNYXBUID0gRGVuc2VNYXA8SVJVbml0VCAqLCBBbmFseXNpc1Jlc3VsdExpc3RUPjsKKworICAvLy8gXGJyaWVmIE1hcCB0eXBlIGZyb20gYSBwYWlyIG9mIGFuYWx5c2lzIElEIGFuZCBJUlVuaXRUIHBvaW50ZXIgdG8gYW4KKyAgLy8vIGl0ZXJhdG9yIGludG8gYSBwYXJ0aWN1bGFyIHJlc3VsdCBsaXN0ICh3aGljaCBpcyB3aGVyZSB0aGUgYWN0dWFsIGFuYWx5c2lzCisgIC8vLyByZXN1bHQgaXMgc3RvcmVkKS4KKyAgdXNpbmcgQW5hbHlzaXNSZXN1bHRNYXBUID0KKyAgICAgIERlbnNlTWFwPHN0ZDo6cGFpcjxBbmFseXNpc0tleSAqLCBJUlVuaXRUICo+LAorICAgICAgICAgICAgICAgdHlwZW5hbWUgQW5hbHlzaXNSZXN1bHRMaXN0VDo6aXRlcmF0b3I+OworCitwdWJsaWM6CisgIC8vLyBBUEkgdG8gY29tbXVuaWNhdGUgZGVwZW5kZW5jaWVzIGJldHdlZW4gYW5hbHlzZXMgZHVyaW5nIGludmFsaWRhdGlvbi4KKyAgLy8vCisgIC8vLyBXaGVuIGFuIGFuYWx5c2lzIHJlc3VsdCBlbWJlZHMgaGFuZGxlcyB0byBvdGhlciBhbmFseXNpcyByZXN1bHRzLCBpdAorICAvLy8gbmVlZHMgdG8gYmUgaW52YWxpZGF0ZWQgYm90aCB3aGVuIGl0cyBvd24gaW5mb3JtYXRpb24gaXNuJ3QgcHJlc2VydmVkIGFuZAorICAvLy8gd2hlbiBhbnkgb2YgaXRzIGVtYmVkZGVkIGFuYWx5c2lzIHJlc3VsdHMgZW5kIHVwIGludmFsaWRhdGVkLiBXZSBwYXNzIGFuCisgIC8vLyBcYyBJbnZhbGlkYXRvciBvYmplY3QgYXMgYW4gYXJndW1lbnQgdG8gXGMgaW52YWxpZGF0ZSgpIGluIG9yZGVyIHRvIGxldAorICAvLy8gdGhlIGFuYWx5c2lzIHJlc3VsdHMgdGhlbXNlbHZlcyBkZWZpbmUgdGhlIGRlcGVuZGVuY3kgZ3JhcGggb24gdGhlIGZseS4KKyAgLy8vIFRoaXMgbGV0cyB1cyBhdm9pZCBidWlsZGluZyBidWlsZGluZyBhbiBleHBsaWNpdCByZXByZXNlbnRhdGlvbiBvZiB0aGUKKyAgLy8vIGRlcGVuZGVuY2llcyBiZXR3ZWVuIGFuYWx5c2lzIHJlc3VsdHMuCisgIGNsYXNzIEludmFsaWRhdG9yIHsKKyAgcHVibGljOgorICAgIC8vLyBUcmlnZ2VyIHRoZSBpbnZhbGlkYXRpb24gb2Ygc29tZSBvdGhlciBhbmFseXNpcyBwYXNzIGlmIG5vdCBhbHJlYWR5CisgICAgLy8vIGhhbmRsZWQgYW5kIHJldHVybiB3aGV0aGVyIGl0IHdhcyBpbiBmYWN0IGludmFsaWRhdGVkLgorICAgIC8vLworICAgIC8vLyBUaGlzIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBhIGdpdmVuIGFuYWx5c2lzIHJlc3VsdCdzIFxjCisgICAgLy8vIGludmFsaWRhdGUgbWV0aG9kIHRvIHRyaWdnZXIgYSBkZXB0aC1maXJzdCB3YWxrIG9mIGFsbCBpbnRlci1hbmFseXNpcworICAgIC8vLyBkZXBlbmRlbmNpZXMuIFRoZSBzYW1lIFxwIElSIHVuaXQgYW5kIFxwIFBBIHBhc3NlZCB0byB0aGF0IHJlc3VsdCdzIFxjCisgICAgLy8vIGludmFsaWRhdGUgbWV0aG9kIHNob3VsZCBpbiB0dXJuIGJlIHByb3ZpZGVkIHRvIHRoaXMgcm91dGluZS4KKyAgICAvLy8KKyAgICAvLy8gVGhlIGZpcnN0IHRpbWUgdGhpcyBpcyBjYWxsZWQgZm9yIGEgZ2l2ZW4gYW5hbHlzaXMgcGFzcywgaXQgd2lsbCBjYWxsCisgICAgLy8vIHRoZSBjb3JyZXNwb25kaW5nIHJlc3VsdCdzIFxjIGludmFsaWRhdGUgbWV0aG9kLiAgU3Vic2VxdWVudCBjYWxscyB3aWxsCisgICAgLy8vIHVzZSBhIGNhY2hlIG9mIHRoZSByZXN1bHRzIG9mIHRoYXQgaW5pdGlhbCBjYWxsLiAgSXQgaXMgYW4gZXJyb3IgdG8gZm9ybQorICAgIC8vLyBjeWNsaWMgZGVwZW5kZW5jaWVzIGJldHdlZW4gYW5hbHlzaXMgcmVzdWx0cy4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGFuYWx5c2lzJ3MgcmVzdWx0IGlzIGludmFsaWQuIEFueQorICAgIC8vLyBkZXBlbmRlY2llcyBvbiBpdCB3aWxsIGJlY29tZSBpbnZhbGlkIGFzIGEgcmVzdWx0LgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYXNzVD4KKyAgICBib29sIGludmFsaWRhdGUoSVJVbml0VCAmSVIsIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzICZQQSkgeworICAgICAgdXNpbmcgUmVzdWx0TW9kZWxUID0KKyAgICAgICAgICBkZXRhaWw6OkFuYWx5c2lzUmVzdWx0TW9kZWw8SVJVbml0VCwgUGFzc1QsIHR5cGVuYW1lIFBhc3NUOjpSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXNlcnZlZEFuYWx5c2VzLCBJbnZhbGlkYXRvcj47CisKKyAgICAgIHJldHVybiBpbnZhbGlkYXRlSW1wbDxSZXN1bHRNb2RlbFQ+KFBhc3NUOjpJRCgpLCBJUiwgUEEpOworICAgIH0KKworICAgIC8vLyBBIHR5cGUtZXJhc2VkIHZhcmlhbnQgb2YgdGhlIGFib3ZlIGludmFsaWRhdGUgbWV0aG9kIHdpdGggdGhlIHNhbWUgY29yZQorICAgIC8vLyBBUEkgb3RoZXIgdGhhbiBwYXNzaW5nIGFuIGFuYWx5c2lzIElEIHJhdGhlciB0aGFuIGFuIGFuYWx5c2lzIHR5cGUKKyAgICAvLy8gcGFyYW1ldGVyLgorICAgIC8vLworICAgIC8vLyBUaGlzIGlzIHNhZGx5IGxlc3MgZWZmaWNpZW50IHRoYW4gdGhlIGFib3ZlIHJvdXRpbmUsIHdoaWNoIGxldmVyYWdlcworICAgIC8vLyB0aGUgdHlwZSBwYXJhbWV0ZXIgdG8gYXZvaWQgdGhlIHR5cGUgZXJhc3VyZSBvdmVyaGVhZC4KKyAgICBib29sIGludmFsaWRhdGUoQW5hbHlzaXNLZXkgKklELCBJUlVuaXRUICZJUiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJlBBKSB7CisgICAgICByZXR1cm4gaW52YWxpZGF0ZUltcGw8PihJRCwgSVIsIFBBKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBmcmllbmQgY2xhc3MgQW5hbHlzaXNNYW5hZ2VyOworCisgICAgdGVtcGxhdGUgPHR5cGVuYW1lIFJlc3VsdFQgPSBSZXN1bHRDb25jZXB0VD4KKyAgICBib29sIGludmFsaWRhdGVJbXBsKEFuYWx5c2lzS2V5ICpJRCwgSVJVbml0VCAmSVIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmUEEpIHsKKyAgICAgIC8vIElmIHdlJ3ZlIGFscmVhZHkgdmlzaXRlZCB0aGlzIHBhc3MsIHJldHVybiB0cnVlIGlmIGl0IHdhcyBpbnZhbGlkYXRlZAorICAgICAgLy8gYW5kIGZhbHNlIG90aGVyd2lzZS4KKyAgICAgIGF1dG8gSU1hcEkgPSBJc1Jlc3VsdEludmFsaWRhdGVkLmZpbmQoSUQpOworICAgICAgaWYgKElNYXBJICE9IElzUmVzdWx0SW52YWxpZGF0ZWQuZW5kKCkpCisgICAgICAgIHJldHVybiBJTWFwSS0+c2Vjb25kOworCisgICAgICAvLyBPdGhlcndpc2UgbG9vayB1cCB0aGUgcmVzdWx0IG9iamVjdC4KKyAgICAgIGF1dG8gUkkgPSBSZXN1bHRzLmZpbmQoe0lELCAmSVJ9KTsKKyAgICAgIGFzc2VydChSSSAhPSBSZXN1bHRzLmVuZCgpICYmCisgICAgICAgICAgICAgIlRyeWluZyB0byBpbnZhbGlkYXRlIGEgZGVwZW5kZW50IHJlc3VsdCB0aGF0IGlzbid0IGluIHRoZSAiCisgICAgICAgICAgICAgIm1hbmFnZXIncyBjYWNoZSBpcyBhbHdheXMgYW4gZXJyb3IsIGxpa2VseSBkdWUgdG8gYSBzdGFsZSByZXN1bHQgIgorICAgICAgICAgICAgICJoYW5kbGUhIik7CisKKyAgICAgIGF1dG8gJlJlc3VsdCA9IHN0YXRpY19jYXN0PFJlc3VsdFQgJj4oKlJJLT5zZWNvbmQtPnNlY29uZCk7CisKKyAgICAgIC8vIEluc2VydCBpbnRvIHRoZSBtYXAgd2hldGhlciB0aGUgcmVzdWx0IHNob3VsZCBiZSBpbnZhbGlkYXRlZCBhbmQgcmV0dXJuCisgICAgICAvLyB0aGF0LiBOb3RlIHRoYXQgd2UgY2Fubm90IHJldXNlIElNYXBJIGFuZCBtdXN0IGRvIGEgZnJlc2ggaW5zZXJ0IGhlcmUsCisgICAgICAvLyBhcyBjYWxsaW5nIGludmFsaWRhdGUgY291bGQgKHJlY3Vyc2l2ZWx5KSBpbnNlcnQgdGhpbmdzIGludG8gdGhlIG1hcCwKKyAgICAgIC8vIG1ha2luZyBhbnkgaXRlcmF0b3Igb3IgcmVmZXJlbmNlIGludmFsaWQuCisgICAgICBib29sIEluc2VydGVkOworICAgICAgc3RkOjp0aWUoSU1hcEksIEluc2VydGVkKSA9CisgICAgICAgICAgSXNSZXN1bHRJbnZhbGlkYXRlZC5pbnNlcnQoe0lELCBSZXN1bHQuaW52YWxpZGF0ZShJUiwgUEEsICp0aGlzKX0pOworICAgICAgKHZvaWQpSW5zZXJ0ZWQ7CisgICAgICBhc3NlcnQoSW5zZXJ0ZWQgJiYgIlNob3VsZCBub3QgaGF2ZSBhbHJlYWR5IGluc2VydGVkIHRoaXMgSUQsIGxpa2VseSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImluZGljYXRlcyBhIGRlcGVuZGVuY3kgY3ljbGUhIik7CisgICAgICByZXR1cm4gSU1hcEktPnNlY29uZDsKKyAgICB9CisKKyAgICBJbnZhbGlkYXRvcihTbWFsbERlbnNlTWFwPEFuYWx5c2lzS2V5ICosIGJvb2wsIDg+ICZJc1Jlc3VsdEludmFsaWRhdGVkLAorICAgICAgICAgICAgICAgIGNvbnN0IEFuYWx5c2lzUmVzdWx0TWFwVCAmUmVzdWx0cykKKyAgICAgICAgOiBJc1Jlc3VsdEludmFsaWRhdGVkKElzUmVzdWx0SW52YWxpZGF0ZWQpLCBSZXN1bHRzKFJlc3VsdHMpIHt9CisKKyAgICBTbWFsbERlbnNlTWFwPEFuYWx5c2lzS2V5ICosIGJvb2wsIDg+ICZJc1Jlc3VsdEludmFsaWRhdGVkOworICAgIGNvbnN0IEFuYWx5c2lzUmVzdWx0TWFwVCAmUmVzdWx0czsKKyAgfTsKKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBhbiBlbXB0eSBhbmFseXNpcyBtYW5hZ2VyLgorICAvLy8KKyAgLy8vIElmIFxwIERlYnVnTG9nZ2luZyBpcyB0cnVlLCB3ZSdsbCBsb2cgb3VyIHByb2dyZXNzIHRvIGxsdm06OmRiZ3MoKS4KKyAgQW5hbHlzaXNNYW5hZ2VyKGJvb2wgRGVidWdMb2dnaW5nID0gZmFsc2UpIDogRGVidWdMb2dnaW5nKERlYnVnTG9nZ2luZykge30KKyAgQW5hbHlzaXNNYW5hZ2VyKEFuYWx5c2lzTWFuYWdlciAmJikgPSBkZWZhdWx0OworICBBbmFseXNpc01hbmFnZXIgJm9wZXJhdG9yPShBbmFseXNpc01hbmFnZXIgJiYpID0gZGVmYXVsdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgYW5hbHlzaXMgbWFuYWdlciBoYXMgYW4gZW1wdHkgcmVzdWx0cyBjYWNoZS4KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoQW5hbHlzaXNSZXN1bHRzLmVtcHR5KCkgPT0gQW5hbHlzaXNSZXN1bHRMaXN0cy5lbXB0eSgpICYmCisgICAgICAgICAgICJUaGUgc3RvcmFnZSBhbmQgaW5kZXggb2YgYW5hbHlzaXMgcmVzdWx0cyBkaXNhZ3JlZSBvbiBob3cgbWFueSAiCisgICAgICAgICAgICJ0aGVyZSBhcmUhIik7CisgICAgcmV0dXJuIEFuYWx5c2lzUmVzdWx0cy5lbXB0eSgpOworICB9CisKKyAgLy8vIFxicmllZiBDbGVhciBhbnkgY2FjaGVkIGFuYWx5c2lzIHJlc3VsdHMgZm9yIGEgc2luZ2xlIHVuaXQgb2YgSVIuCisgIC8vLworICAvLy8gVGhpcyBkb2Vzbid0IGludmFsaWRhdGUsIGJ1dCBpbnN0ZWFkIHNpbXBseSBkZWxldGVzLCB0aGUgcmVsZXZhbnQgcmVzdWx0cy4KKyAgLy8vIEl0IGlzIHVzZWZ1bCB3aGVuIHRoZSBJUiBpcyBiZWluZyByZW1vdmVkIGFuZCB3ZSB3YW50IHRvIGNsZWFyIG91dCBhbGwgdGhlCisgIC8vLyBtZW1vcnkgcGlubmVkIGZvciBpdC4KKyAgdm9pZCBjbGVhcihJUlVuaXRUICZJUiwgbGx2bTo6U3RyaW5nUmVmIE5hbWUpIHsKKyAgICBpZiAoRGVidWdMb2dnaW5nKQorICAgICAgZGJncygpIDw8ICJDbGVhcmluZyBhbGwgYW5hbHlzaXMgcmVzdWx0cyBmb3I6ICIgPDwgTmFtZSA8PCAiXG4iOworCisgICAgYXV0byBSZXN1bHRzTGlzdEkgPSBBbmFseXNpc1Jlc3VsdExpc3RzLmZpbmQoJklSKTsKKyAgICBpZiAoUmVzdWx0c0xpc3RJID09IEFuYWx5c2lzUmVzdWx0TGlzdHMuZW5kKCkpCisgICAgICByZXR1cm47CisgICAgLy8gRGVsZXRlIHRoZSBtYXAgZW50cmllcyB0aGF0IHBvaW50IGludG8gdGhlIHJlc3VsdHMgbGlzdC4KKyAgICBmb3IgKGF1dG8gJklEQW5kUmVzdWx0IDogUmVzdWx0c0xpc3RJLT5zZWNvbmQpCisgICAgICBBbmFseXNpc1Jlc3VsdHMuZXJhc2Uoe0lEQW5kUmVzdWx0LmZpcnN0LCAmSVJ9KTsKKworICAgIC8vIEFuZCBhY3R1YWxseSBkZXN0cm95IGFuZCBlcmFzZSB0aGUgcmVzdWx0cyBhc3NvY2lhdGVkIHdpdGggdGhpcyBJUi4KKyAgICBBbmFseXNpc1Jlc3VsdExpc3RzLmVyYXNlKFJlc3VsdHNMaXN0SSk7CisgIH0KKworICAvLy8gXGJyaWVmIENsZWFyIGFsbCBhbmFseXNpcyByZXN1bHRzIGNhY2hlZCBieSB0aGlzIEFuYWx5c2lzTWFuYWdlci4KKyAgLy8vCisgIC8vLyBMaWtlIFxjIGNsZWFyKElSVW5pdFQmKSwgdGhpcyBkb2Vzbid0IGludmFsaWRhdGUgdGhlIHJlc3VsdHM7IGl0IHNpbXBseQorICAvLy8gZGVsZXRlcyB0aGVtLiAgVGhpcyBsZXRzIHlvdSBjbGVhbiB1cCB0aGUgQW5hbHlzaXNNYW5hZ2VyIHdoZW4gdGhlIHNldCBvZgorICAvLy8gSVIgdW5pdHMgaXRzZWxmIGhhcyBwb3RlbnRpYWxseSBjaGFuZ2VkLCBhbmQgdGh1cyB3ZSBjYW4ndCBldmVuIGxvb2sgdXAgYQorICAvLy8gYSByZXN1bHQgYW5kIGludmFsaWRhdGUvY2xlYXIgaXQgZGlyZWN0bHkuCisgIHZvaWQgY2xlYXIoKSB7CisgICAgQW5hbHlzaXNSZXN1bHRzLmNsZWFyKCk7CisgICAgQW5hbHlzaXNSZXN1bHRMaXN0cy5jbGVhcigpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHJlc3VsdCBvZiBhbiBhbmFseXNpcyBwYXNzIGZvciBhIGdpdmVuIElSIHVuaXQuCisgIC8vLworICAvLy8gUnVucyB0aGUgYW5hbHlzaXMgaWYgYSBjYWNoZWQgcmVzdWx0IGlzIG5vdCBhdmFpbGFibGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBQYXNzVD4KKyAgdHlwZW5hbWUgUGFzc1Q6OlJlc3VsdCAmZ2V0UmVzdWx0KElSVW5pdFQgJklSLCBFeHRyYUFyZ1RzLi4uIEV4dHJhQXJncykgeworICAgIGFzc2VydChBbmFseXNpc1Bhc3Nlcy5jb3VudChQYXNzVDo6SUQoKSkgJiYKKyAgICAgICAgICAgIlRoaXMgYW5hbHlzaXMgcGFzcyB3YXMgbm90IHJlZ2lzdGVyZWQgcHJpb3IgdG8gYmVpbmcgcXVlcmllZCIpOworICAgIFJlc3VsdENvbmNlcHRUICZSZXN1bHRDb25jZXB0ID0KKyAgICAgICAgZ2V0UmVzdWx0SW1wbChQYXNzVDo6SUQoKSwgSVIsIEV4dHJhQXJncy4uLik7CisKKyAgICB1c2luZyBSZXN1bHRNb2RlbFQgPQorICAgICAgICBkZXRhaWw6OkFuYWx5c2lzUmVzdWx0TW9kZWw8SVJVbml0VCwgUGFzc1QsIHR5cGVuYW1lIFBhc3NUOjpSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVzZXJ2ZWRBbmFseXNlcywgSW52YWxpZGF0b3I+OworCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFJlc3VsdE1vZGVsVCAmPihSZXN1bHRDb25jZXB0KS5SZXN1bHQ7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgY2FjaGVkIHJlc3VsdCBvZiBhbiBhbmFseXNpcyBwYXNzIGZvciBhIGdpdmVuIElSIHVuaXQuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgbmV2ZXIgcnVucyB0aGUgYW5hbHlzaXMuCisgIC8vLworICAvLy8gXHJldHVybnMgbnVsbCBpZiB0aGVyZSBpcyBubyBjYWNoZWQgcmVzdWx0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFzc1Q+CisgIHR5cGVuYW1lIFBhc3NUOjpSZXN1bHQgKmdldENhY2hlZFJlc3VsdChJUlVuaXRUICZJUikgY29uc3QgeworICAgIGFzc2VydChBbmFseXNpc1Bhc3Nlcy5jb3VudChQYXNzVDo6SUQoKSkgJiYKKyAgICAgICAgICAgIlRoaXMgYW5hbHlzaXMgcGFzcyB3YXMgbm90IHJlZ2lzdGVyZWQgcHJpb3IgdG8gYmVpbmcgcXVlcmllZCIpOworCisgICAgUmVzdWx0Q29uY2VwdFQgKlJlc3VsdENvbmNlcHQgPSBnZXRDYWNoZWRSZXN1bHRJbXBsKFBhc3NUOjpJRCgpLCBJUik7CisgICAgaWYgKCFSZXN1bHRDb25jZXB0KQorICAgICAgcmV0dXJuIG51bGxwdHI7CisKKyAgICB1c2luZyBSZXN1bHRNb2RlbFQgPQorICAgICAgICBkZXRhaWw6OkFuYWx5c2lzUmVzdWx0TW9kZWw8SVJVbml0VCwgUGFzc1QsIHR5cGVuYW1lIFBhc3NUOjpSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVzZXJ2ZWRBbmFseXNlcywgSW52YWxpZGF0b3I+OworCisgICAgcmV0dXJuICZzdGF0aWNfY2FzdDxSZXN1bHRNb2RlbFQgKj4oUmVzdWx0Q29uY2VwdCktPlJlc3VsdDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVnaXN0ZXIgYW4gYW5hbHlzaXMgcGFzcyB3aXRoIHRoZSBtYW5hZ2VyLgorICAvLy8KKyAgLy8vIFRoZSBwYXJhbWV0ZXIgaXMgYSBjYWxsYWJsZSB3aG9zZSByZXN1bHQgaXMgYW4gYW5hbHlzaXMgcGFzcy4gVGhpcyBhbGxvd3MKKyAgLy8vIHBhc3NpbmcgaW4gYSBsYW1iZGEgdG8gY29uc3RydWN0IHRoZSBhbmFseXNpcy4KKyAgLy8vCisgIC8vLyBUaGUgYW5hbHlzaXMgdHlwZSB0byByZWdpc3RlciBpcyB0aGUgdHlwZSByZXR1cm5lZCBieSBjYWxsaW5nIHRoZSBcYworICAvLy8gUGFzc0J1aWxkZXIgYXJndW1lbnQuIElmIHRoYXQgdHlwZSBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQsIHRoZW4gdGhlCisgIC8vLyBhcmd1bWVudCB3aWxsIG5vdCBiZSBjYWxsZWQgYW5kIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4gZmFsc2UuCisgIC8vLyBPdGhlcndpc2UsIHdlIHJlZ2lzdGVyIHRoZSBhbmFseXNpcyByZXR1cm5lZCBieSBjYWxsaW5nIFxjIFBhc3NCdWlsZGVyKCksCisgIC8vLyBhbmQgdGhpcyBmdW5jdGlvbiByZXR1cm5zIHRydWUuCisgIC8vLworICAvLy8gKE5vdGU6IEFsdGhvdWdoIHRoZSByZXR1cm4gdmFsdWUgb2YgdGhpcyBmdW5jdGlvbiBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QKKyAgLy8vIGFuIGFuYWx5c2lzIHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQsIHRoZXJlIGludGVudGlvbmFsbHkgaXNuJ3QgYSB3YXkgdG8KKyAgLy8vIHF1ZXJ5IHRoaXMgZGlyZWN0bHkuICBJbnN0ZWFkLCB5b3Ugc2hvdWxkIGp1c3QgcmVnaXN0ZXIgYWxsIHRoZSBhbmFseXNlcworICAvLy8geW91IG1pZ2h0IHdhbnQgYW5kIGxldCB0aGlzIGNsYXNzIHJ1biB0aGVtIGxhemlseS4gIFRoaXMgaWRpb20gbGV0cyB1cworICAvLy8gbWluaW1pemUgdGhlIG51bWJlciBvZiB0aW1lcyB3ZSBoYXZlIHRvIGxvb2sgdXAgYW5hbHlzZXMgaW4gb3VyCisgIC8vLyBoYXNodGFibGUuKQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFzc0J1aWxkZXJUPgorICBib29sIHJlZ2lzdGVyUGFzcyhQYXNzQnVpbGRlclQgJiZQYXNzQnVpbGRlcikgeworICAgIHVzaW5nIFBhc3NUID0gZGVjbHR5cGUoUGFzc0J1aWxkZXIoKSk7CisgICAgdXNpbmcgUGFzc01vZGVsVCA9CisgICAgICAgIGRldGFpbDo6QW5hbHlzaXNQYXNzTW9kZWw8SVJVbml0VCwgUGFzc1QsIFByZXNlcnZlZEFuYWx5c2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRhdG9yLCBFeHRyYUFyZ1RzLi4uPjsKKworICAgIGF1dG8gJlBhc3NQdHIgPSBBbmFseXNpc1Bhc3Nlc1tQYXNzVDo6SUQoKV07CisgICAgaWYgKFBhc3NQdHIpCisgICAgICAvLyBBbHJlYWR5IHJlZ2lzdGVyZWQgdGhpcyBwYXNzIHR5cGUhCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBDb25zdHJ1Y3QgYSBuZXcgbW9kZWwgYXJvdW5kIHRoZSBpbnN0YW5jZSByZXR1cm5lZCBieSB0aGUgYnVpbGRlci4KKyAgICBQYXNzUHRyLnJlc2V0KG5ldyBQYXNzTW9kZWxUKFBhc3NCdWlsZGVyKCkpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSW52YWxpZGF0ZSBhIHNwZWNpZmljIGFuYWx5c2lzIHBhc3MgZm9yIGFuIElSIG1vZHVsZS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhlIGFuYWx5c2lzIHJlc3VsdCBjYW4gZGlzcmVnYXJkIGludmFsaWRhdGlvbiwgaWYgaXQgZGV0ZXJtaW5lcworICAvLy8gaXQgaXMgaW4gZmFjdCBzdGlsbCB2YWxpZC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFBhc3NUPiB2b2lkIGludmFsaWRhdGUoSVJVbml0VCAmSVIpIHsKKyAgICBhc3NlcnQoQW5hbHlzaXNQYXNzZXMuY291bnQoUGFzc1Q6OklEKCkpICYmCisgICAgICAgICAgICJUaGlzIGFuYWx5c2lzIHBhc3Mgd2FzIG5vdCByZWdpc3RlcmVkIHByaW9yIHRvIGJlaW5nIGludmFsaWRhdGVkIik7CisgICAgaW52YWxpZGF0ZUltcGwoUGFzc1Q6OklEKCksIElSKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSW52YWxpZGF0ZSBjYWNoZWQgYW5hbHlzZXMgZm9yIGFuIElSIHVuaXQuCisgIC8vLworICAvLy8gV2FsayB0aHJvdWdoIGFsbCBvZiB0aGUgYW5hbHlzZXMgcGVydGFpbmluZyB0byB0aGlzIHVuaXQgb2YgSVIgYW5kCisgIC8vLyBpbnZhbGlkYXRlIHRoZW0sIHVubGVzcyB0aGV5IGFyZSBwcmVzZXJ2ZWQgYnkgdGhlIFByZXNlcnZlZEFuYWx5c2VzIHNldC4KKyAgdm9pZCBpbnZhbGlkYXRlKElSVW5pdFQgJklSLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmUEEpIHsKKyAgICAvLyBXZSdyZSBkb25lIGlmIGFsbCBhbmFseXNlcyBvbiB0aGlzIElSIHVuaXQgYXJlIHByZXNlcnZlZC4KKyAgICBpZiAoUEEuYWxsQW5hbHlzZXNJblNldFByZXNlcnZlZDxBbGxBbmFseXNlc09uPElSVW5pdFQ+PigpKQorICAgICAgcmV0dXJuOworCisgICAgaWYgKERlYnVnTG9nZ2luZykKKyAgICAgIGRiZ3MoKSA8PCAiSW52YWxpZGF0aW5nIGFsbCBub24tcHJlc2VydmVkIGFuYWx5c2VzIGZvcjogIiA8PCBJUi5nZXROYW1lKCkKKyAgICAgICAgICAgICA8PCAiXG4iOworCisgICAgLy8gVHJhY2sgd2hldGhlciBlYWNoIGFuYWx5c2lzJ3MgcmVzdWx0IGlzIGludmFsaWRhdGVkIGluCisgICAgLy8gSXNSZXN1bHRJbnZhbGlkYXRlZC4KKyAgICBTbWFsbERlbnNlTWFwPEFuYWx5c2lzS2V5ICosIGJvb2wsIDg+IElzUmVzdWx0SW52YWxpZGF0ZWQ7CisgICAgSW52YWxpZGF0b3IgSW52KElzUmVzdWx0SW52YWxpZGF0ZWQsIEFuYWx5c2lzUmVzdWx0cyk7CisgICAgQW5hbHlzaXNSZXN1bHRMaXN0VCAmUmVzdWx0c0xpc3QgPSBBbmFseXNpc1Jlc3VsdExpc3RzWyZJUl07CisgICAgZm9yIChhdXRvICZBbmFseXNpc1Jlc3VsdFBhaXIgOiBSZXN1bHRzTGlzdCkgeworICAgICAgLy8gVGhpcyBpcyBiYXNpY2FsbHkgdGhlIHNhbWUgdGhpbmcgYXMgSW52YWxpZGF0b3I6OmludmFsaWRhdGUsIGJ1dCB3ZQorICAgICAgLy8gY2FuJ3QgY2FsbCBpdCBoZXJlIGJlY2F1c2Ugd2UncmUgb3BlcmF0aW5nIG9uIHRoZSB0eXBlLWVyYXNlZCByZXN1bHQuCisgICAgICAvLyBNb3Jlb3ZlciBpZiB3ZSBpbnN0ZWFkIGNhbGxlZCBpbnZhbGlkYXRlKCkgZGlyZWN0bHksIGl0IHdvdWxkIGRvIGFuCisgICAgICAvLyB1bm5lY2Vzc2FyeSBsb29rIHVwIGluIFJlc3VsdHNMaXN0LgorICAgICAgQW5hbHlzaXNLZXkgKklEID0gQW5hbHlzaXNSZXN1bHRQYWlyLmZpcnN0OworICAgICAgYXV0byAmUmVzdWx0ID0gKkFuYWx5c2lzUmVzdWx0UGFpci5zZWNvbmQ7CisKKyAgICAgIGF1dG8gSU1hcEkgPSBJc1Jlc3VsdEludmFsaWRhdGVkLmZpbmQoSUQpOworICAgICAgaWYgKElNYXBJICE9IElzUmVzdWx0SW52YWxpZGF0ZWQuZW5kKCkpCisgICAgICAgIC8vIFRoaXMgcmVzdWx0IHdhcyBhbHJlYWR5IGhhbmRsZWQgdmlhIHRoZSBJbnZhbGlkYXRvci4KKyAgICAgICAgY29udGludWU7CisKKyAgICAgIC8vIFRyeSB0byBpbnZhbGlkYXRlIHRoZSByZXN1bHQsIGdpdmluZyBpdCB0aGUgSW52YWxpZGF0b3Igc28gaXQgY2FuCisgICAgICAvLyByZWN1cnNpdmVseSBxdWVyeSBmb3IgYW55IGRlcGVuZGVuY2llcyBpdCBoYXMgYW5kIHJlY29yZCB0aGUgcmVzdWx0LgorICAgICAgLy8gTm90ZSB0aGF0IHdlIGNhbm5vdCByZXVzZSAnSU1hcEknIGhlcmUgb3IgcHJlLWluc2VydCB0aGUgSUQsIGFzCisgICAgICAvLyBSZXN1bHQuaW52YWxpZGF0ZSBtYXkgaW5zZXJ0IHRoaW5ncyBpbnRvIHRoZSBtYXAsIGludmFsaWRhdGluZyBvdXIKKyAgICAgIC8vIGl0ZXJhdG9yLgorICAgICAgYm9vbCBJbnNlcnRlZCA9CisgICAgICAgICAgSXNSZXN1bHRJbnZhbGlkYXRlZC5pbnNlcnQoe0lELCBSZXN1bHQuaW52YWxpZGF0ZShJUiwgUEEsIEludil9KQorICAgICAgICAgICAgICAuc2Vjb25kOworICAgICAgKHZvaWQpSW5zZXJ0ZWQ7CisgICAgICBhc3NlcnQoSW5zZXJ0ZWQgJiYgIlNob3VsZCBuZXZlciBoYXZlIGFscmVhZHkgaW5zZXJ0ZWQgdGhpcyBJRCwgbGlrZWx5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiaW5kaWNhdGVzIGEgY3ljbGUhIik7CisgICAgfQorCisgICAgLy8gTm93IGVyYXNlIHRoZSByZXN1bHRzIHRoYXQgd2VyZSBtYXJrZWQgYWJvdmUgYXMgaW52YWxpZGF0ZWQuCisgICAgaWYgKCFJc1Jlc3VsdEludmFsaWRhdGVkLmVtcHR5KCkpIHsKKyAgICAgIGZvciAoYXV0byBJID0gUmVzdWx0c0xpc3QuYmVnaW4oKSwgRSA9IFJlc3VsdHNMaXN0LmVuZCgpOyBJICE9IEU7KSB7CisgICAgICAgIEFuYWx5c2lzS2V5ICpJRCA9IEktPmZpcnN0OworICAgICAgICBpZiAoIUlzUmVzdWx0SW52YWxpZGF0ZWQubG9va3VwKElEKSkgeworICAgICAgICAgICsrSTsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChEZWJ1Z0xvZ2dpbmcpCisgICAgICAgICAgZGJncygpIDw8ICJJbnZhbGlkYXRpbmcgYW5hbHlzaXM6ICIgPDwgdGhpcy0+bG9va1VwUGFzcyhJRCkubmFtZSgpCisgICAgICAgICAgICAgICAgIDw8ICIgb24gIiA8PCBJUi5nZXROYW1lKCkgPDwgIlxuIjsKKworICAgICAgICBJID0gUmVzdWx0c0xpc3QuZXJhc2UoSSk7CisgICAgICAgIEFuYWx5c2lzUmVzdWx0cy5lcmFzZSh7SUQsICZJUn0pOworICAgICAgfQorICAgIH0KKworICAgIGlmIChSZXN1bHRzTGlzdC5lbXB0eSgpKQorICAgICAgQW5hbHlzaXNSZXN1bHRMaXN0cy5lcmFzZSgmSVIpOworICB9CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgTG9vayB1cCBhIHJlZ2lzdGVyZWQgYW5hbHlzaXMgcGFzcy4KKyAgUGFzc0NvbmNlcHRUICZsb29rVXBQYXNzKEFuYWx5c2lzS2V5ICpJRCkgeworICAgIHR5cGVuYW1lIEFuYWx5c2lzUGFzc01hcFQ6Oml0ZXJhdG9yIFBJID0gQW5hbHlzaXNQYXNzZXMuZmluZChJRCk7CisgICAgYXNzZXJ0KFBJICE9IEFuYWx5c2lzUGFzc2VzLmVuZCgpICYmCisgICAgICAgICAgICJBbmFseXNpcyBwYXNzZXMgbXVzdCBiZSByZWdpc3RlcmVkIHByaW9yIHRvIGJlaW5nIHF1ZXJpZWQhIik7CisgICAgcmV0dXJuICpQSS0+c2Vjb25kOworICB9CisKKyAgLy8vIFxicmllZiBMb29rIHVwIGEgcmVnaXN0ZXJlZCBhbmFseXNpcyBwYXNzLgorICBjb25zdCBQYXNzQ29uY2VwdFQgJmxvb2tVcFBhc3MoQW5hbHlzaXNLZXkgKklEKSBjb25zdCB7CisgICAgdHlwZW5hbWUgQW5hbHlzaXNQYXNzTWFwVDo6Y29uc3RfaXRlcmF0b3IgUEkgPSBBbmFseXNpc1Bhc3Nlcy5maW5kKElEKTsKKyAgICBhc3NlcnQoUEkgIT0gQW5hbHlzaXNQYXNzZXMuZW5kKCkgJiYKKyAgICAgICAgICAgIkFuYWx5c2lzIHBhc3NlcyBtdXN0IGJlIHJlZ2lzdGVyZWQgcHJpb3IgdG8gYmVpbmcgcXVlcmllZCEiKTsKKyAgICByZXR1cm4gKlBJLT5zZWNvbmQ7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCBhbiBhbmFseXNpcyByZXN1bHQsIHJ1bm5pbmcgdGhlIHBhc3MgaWYgbmVjZXNzYXJ5LgorICBSZXN1bHRDb25jZXB0VCAmZ2V0UmVzdWx0SW1wbChBbmFseXNpc0tleSAqSUQsIElSVW5pdFQgJklSLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYUFyZ1RzLi4uIEV4dHJhQXJncykgeworICAgIHR5cGVuYW1lIEFuYWx5c2lzUmVzdWx0TWFwVDo6aXRlcmF0b3IgUkk7CisgICAgYm9vbCBJbnNlcnRlZDsKKyAgICBzdGQ6OnRpZShSSSwgSW5zZXJ0ZWQpID0gQW5hbHlzaXNSZXN1bHRzLmluc2VydChzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgc3RkOjptYWtlX3BhaXIoSUQsICZJUiksIHR5cGVuYW1lIEFuYWx5c2lzUmVzdWx0TGlzdFQ6Oml0ZXJhdG9yKCkpKTsKKworICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSBjYWNoZWQgcmVzdWx0IGZvciB0aGlzIGZ1bmN0aW9uLCBsb29rIHVwIHRoZSBwYXNzIGFuZAorICAgIC8vIHJ1biBpdCB0byBwcm9kdWNlIGEgcmVzdWx0LCB3aGljaCB3ZSB0aGVuIGFkZCB0byB0aGUgY2FjaGUuCisgICAgaWYgKEluc2VydGVkKSB7CisgICAgICBhdXRvICZQID0gdGhpcy0+bG9va1VwUGFzcyhJRCk7CisgICAgICBpZiAoRGVidWdMb2dnaW5nKQorICAgICAgICBkYmdzKCkgPDwgIlJ1bm5pbmcgYW5hbHlzaXM6ICIgPDwgUC5uYW1lKCkgPDwgIiBvbiAiIDw8IElSLmdldE5hbWUoKQorICAgICAgICAgICAgICAgPDwgIlxuIjsKKyAgICAgIEFuYWx5c2lzUmVzdWx0TGlzdFQgJlJlc3VsdExpc3QgPSBBbmFseXNpc1Jlc3VsdExpc3RzWyZJUl07CisgICAgICBSZXN1bHRMaXN0LmVtcGxhY2VfYmFjayhJRCwgUC5ydW4oSVIsICp0aGlzLCBFeHRyYUFyZ3MuLi4pKTsKKworICAgICAgLy8gUC5ydW4gbWF5IGhhdmUgaW5zZXJ0ZWQgZWxlbWVudHMgaW50byBBbmFseXNpc1Jlc3VsdHMgYW5kIGludmFsaWRhdGVkCisgICAgICAvLyBSSS4KKyAgICAgIFJJID0gQW5hbHlzaXNSZXN1bHRzLmZpbmQoe0lELCAmSVJ9KTsKKyAgICAgIGFzc2VydChSSSAhPSBBbmFseXNpc1Jlc3VsdHMuZW5kKCkgJiYgIndlIGp1c3QgaW5zZXJ0ZWQgaXQhIik7CisKKyAgICAgIFJJLT5zZWNvbmQgPSBzdGQ6OnByZXYoUmVzdWx0TGlzdC5lbmQoKSk7CisgICAgfQorCisgICAgcmV0dXJuICpSSS0+c2Vjb25kLT5zZWNvbmQ7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCBhIGNhY2hlZCBhbmFseXNpcyByZXN1bHQgb3IgcmV0dXJuIG51bGwuCisgIFJlc3VsdENvbmNlcHRUICpnZXRDYWNoZWRSZXN1bHRJbXBsKEFuYWx5c2lzS2V5ICpJRCwgSVJVbml0VCAmSVIpIGNvbnN0IHsKKyAgICB0eXBlbmFtZSBBbmFseXNpc1Jlc3VsdE1hcFQ6OmNvbnN0X2l0ZXJhdG9yIFJJID0KKyAgICAgICAgQW5hbHlzaXNSZXN1bHRzLmZpbmQoe0lELCAmSVJ9KTsKKyAgICByZXR1cm4gUkkgPT0gQW5hbHlzaXNSZXN1bHRzLmVuZCgpID8gbnVsbHB0ciA6ICYqUkktPnNlY29uZC0+c2Vjb25kOworICB9CisKKyAgLy8vIFxicmllZiBJbnZhbGlkYXRlIGEgZnVuY3Rpb24gcGFzcyByZXN1bHQuCisgIHZvaWQgaW52YWxpZGF0ZUltcGwoQW5hbHlzaXNLZXkgKklELCBJUlVuaXRUICZJUikgeworICAgIHR5cGVuYW1lIEFuYWx5c2lzUmVzdWx0TWFwVDo6aXRlcmF0b3IgUkkgPQorICAgICAgICBBbmFseXNpc1Jlc3VsdHMuZmluZCh7SUQsICZJUn0pOworICAgIGlmIChSSSA9PSBBbmFseXNpc1Jlc3VsdHMuZW5kKCkpCisgICAgICByZXR1cm47CisKKyAgICBpZiAoRGVidWdMb2dnaW5nKQorICAgICAgZGJncygpIDw8ICJJbnZhbGlkYXRpbmcgYW5hbHlzaXM6ICIgPDwgdGhpcy0+bG9va1VwUGFzcyhJRCkubmFtZSgpCisgICAgICAgICAgICAgPDwgIiBvbiAiIDw8IElSLmdldE5hbWUoKSA8PCAiXG4iOworICAgIEFuYWx5c2lzUmVzdWx0TGlzdHNbJklSXS5lcmFzZShSSS0+c2Vjb25kKTsKKyAgICBBbmFseXNpc1Jlc3VsdHMuZXJhc2UoUkkpOworICB9CisKKyAgLy8vIFxicmllZiBNYXAgdHlwZSBmcm9tIG1vZHVsZSBhbmFseXNpcyBwYXNzIElEIHRvIHBhc3MgY29uY2VwdCBwb2ludGVyLgorICB1c2luZyBBbmFseXNpc1Bhc3NNYXBUID0KKyAgICAgIERlbnNlTWFwPEFuYWx5c2lzS2V5ICosIHN0ZDo6dW5pcXVlX3B0cjxQYXNzQ29uY2VwdFQ+PjsKKworICAvLy8gXGJyaWVmIENvbGxlY3Rpb24gb2YgbW9kdWxlIGFuYWx5c2lzIHBhc3NlcywgaW5kZXhlZCBieSBJRC4KKyAgQW5hbHlzaXNQYXNzTWFwVCBBbmFseXNpc1Bhc3NlczsKKworICAvLy8gXGJyaWVmIE1hcCBmcm9tIGZ1bmN0aW9uIHRvIGEgbGlzdCBvZiBmdW5jdGlvbiBhbmFseXNpcyByZXN1bHRzLgorICAvLy8KKyAgLy8vIFByb3ZpZGVzIGxpbmVhciB0aW1lIHJlbW92YWwgb2YgYWxsIGFuYWx5c2lzIHJlc3VsdHMgZm9yIGEgZnVuY3Rpb24gYW5kCisgIC8vLyB0aGUgdWx0aW1hdGUgc3RvcmFnZSBmb3IgYSBwYXJ0aWN1bGFyIGNhY2hlZCBhbmFseXNpcyByZXN1bHQuCisgIEFuYWx5c2lzUmVzdWx0TGlzdE1hcFQgQW5hbHlzaXNSZXN1bHRMaXN0czsKKworICAvLy8gXGJyaWVmIE1hcCBmcm9tIGFuIGFuYWx5c2lzIElEIGFuZCBmdW5jdGlvbiB0byBhIHBhcnRpY3VsYXIgY2FjaGVkCisgIC8vLyBhbmFseXNpcyByZXN1bHQuCisgIEFuYWx5c2lzUmVzdWx0TWFwVCBBbmFseXNpc1Jlc3VsdHM7CisKKyAgLy8vIFxicmllZiBJbmRpY2F0ZXMgd2hldGhlciB3ZSBsb2cgdG8gXGMgbGx2bTo6ZGJncygpLgorICBib29sIERlYnVnTG9nZ2luZzsKK307CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBBbmFseXNpc01hbmFnZXI8TW9kdWxlPjsKKworLy8vIFxicmllZiBDb252ZW5pZW5jZSB0eXBlZGVmIGZvciB0aGUgTW9kdWxlIGFuYWx5c2lzIG1hbmFnZXIuCit1c2luZyBNb2R1bGVBbmFseXNpc01hbmFnZXIgPSBBbmFseXNpc01hbmFnZXI8TW9kdWxlPjsKKworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIEFuYWx5c2lzTWFuYWdlcjxGdW5jdGlvbj47CisKKy8vLyBcYnJpZWYgQ29udmVuaWVuY2UgdHlwZWRlZiBmb3IgdGhlIEZ1bmN0aW9uIGFuYWx5c2lzIG1hbmFnZXIuCit1c2luZyBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciA9IEFuYWx5c2lzTWFuYWdlcjxGdW5jdGlvbj47CisKKy8vLyBcYnJpZWYgQW4gYW5hbHlzaXMgb3ZlciBhbiAib3V0ZXIiIElSIHVuaXQgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gYW4KKy8vLyBhbmFseXNpcyBtYW5hZ2VyIG92ZXIgYW4gImlubmVyIiBJUiB1bml0LiAgVGhlIGlubmVyIHVuaXQgbXVzdCBiZSBjb250YWluZWQKKy8vLyBpbiB0aGUgb3V0ZXIgdW5pdC4KKy8vLworLy8vIEZvcmUgZXhhbXBsZSwgSW5uZXJBbmFseXNpc01hbmFnZXJQcm94eTxGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciwgTW9kdWxlPiBpcworLy8vIGFuIGFuYWx5c2lzIG92ZXIgTW9kdWxlcyAodGhlICJvdXRlciIgdW5pdCkgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gYQorLy8vIEZ1bmN0aW9uIGFuYWx5c2lzIG1hbmFnZXIuICBUaGUgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgaXMgdGhlICJpbm5lciIKKy8vLyBtYW5hZ2VyIGJlaW5nIHByb3hpZWQsIGFuZCBGdW5jdGlvbnMgYXJlIHRoZSAiaW5uZXIiIHVuaXQuICBUaGUgaW5uZXIvb3V0ZXIKKy8vLyByZWxhdGlvbnNoaXAgaXMgdmFsaWQgYmVjYXVzZSBlYWNoIEZ1bmN0aW9uIGlzIGNvbnRhaW5lZCBpbiBvbmUgTW9kdWxlLgorLy8vCisvLy8gSWYgeW91J3JlICh0cmFuc2l0aXZlbHkpIHdpdGhpbiBhIHBhc3MgbWFuYWdlciBmb3IgYW4gSVIgdW5pdCBVIHRoYXQKKy8vLyBjb250YWlucyBJUiB1bml0IFYsIHlvdSBzaG91bGQgbmV2ZXIgdXNlIGFuIGFuYWx5c2lzIG1hbmFnZXIgb3ZlciBWLCBleGNlcHQKKy8vLyB2aWEgb25lIG9mIHRoZXNlIHByb3hpZXMuCisvLy8KKy8vLyBOb3RlIHRoYXQgdGhlIHByb3h5J3MgcmVzdWx0IGlzIGEgbW92ZS1vbmx5IFJBSUkgb2JqZWN0LiAgVGhlIHZhbGlkaXR5IG9mCisvLy8gdGhlIGFuYWx5c2VzIGluIHRoZSBpbm5lciBhbmFseXNpcyBtYW5hZ2VyIGlzIHRpZWQgdG8gaXRzIGxpZmV0aW1lLgordGVtcGxhdGUgPHR5cGVuYW1lIEFuYWx5c2lzTWFuYWdlclQsIHR5cGVuYW1lIElSVW5pdFQsIHR5cGVuYW1lLi4uIEV4dHJhQXJnVHM+CitjbGFzcyBJbm5lckFuYWx5c2lzTWFuYWdlclByb3h5CisgICAgOiBwdWJsaWMgQW5hbHlzaXNJbmZvTWl4aW48CisgICAgICAgICAgSW5uZXJBbmFseXNpc01hbmFnZXJQcm94eTxBbmFseXNpc01hbmFnZXJULCBJUlVuaXRUPj4geworcHVibGljOgorICBjbGFzcyBSZXN1bHQgeworICBwdWJsaWM6CisgICAgZXhwbGljaXQgUmVzdWx0KEFuYWx5c2lzTWFuYWdlclQgJklubmVyQU0pIDogSW5uZXJBTSgmSW5uZXJBTSkge30KKworICAgIFJlc3VsdChSZXN1bHQgJiZBcmcpIDogSW5uZXJBTShzdGQ6Om1vdmUoQXJnLklubmVyQU0pKSB7CisgICAgICAvLyBXZSBoYXZlIHRvIG51bGwgb3V0IHRoZSBhbmFseXNpcyBtYW5hZ2VyIGluIHRoZSBtb3ZlZC1mcm9tIHN0YXRlCisgICAgICAvLyBiZWNhdXNlIHdlIGFyZSB0YWtpbmcgb3duZXJzaGlwIG9mIHRoZSByZXNwb25zaWJpbHR5IHRvIGNsZWFyIHRoZQorICAgICAgLy8gYW5hbHlzaXMgc3RhdGUuCisgICAgICBBcmcuSW5uZXJBTSA9IG51bGxwdHI7CisgICAgfQorCisgICAgflJlc3VsdCgpIHsKKyAgICAgIC8vIElubmVyQU0gaXMgY2xlYXJlZCBpbiBhIG1vdmVkIGZyb20gc3RhdGUgd2hlcmUgdGhlcmUgaXMgbm90aGluZyB0byBkby4KKyAgICAgIGlmICghSW5uZXJBTSkKKyAgICAgICAgcmV0dXJuOworCisgICAgICAvLyBDbGVhciBvdXQgdGhlIGFuYWx5c2lzIG1hbmFnZXIgaWYgd2UncmUgYmVpbmcgZGVzdHJveWVkIC0tIGl0IG1lYW5zIHdlCisgICAgICAvLyBkaWRuJ3QgZXZlbiBzZWUgYW4gaW52YWxpZGF0ZSBjYWxsIHdoZW4gd2UgZ290IGludmFsaWRhdGVkLgorICAgICAgSW5uZXJBTS0+Y2xlYXIoKTsKKyAgICB9CisKKyAgICBSZXN1bHQgJm9wZXJhdG9yPShSZXN1bHQgJiZSSFMpIHsKKyAgICAgIElubmVyQU0gPSBSSFMuSW5uZXJBTTsKKyAgICAgIC8vIFdlIGhhdmUgdG8gbnVsbCBvdXQgdGhlIGFuYWx5c2lzIG1hbmFnZXIgaW4gdGhlIG1vdmVkLWZyb20gc3RhdGUKKyAgICAgIC8vIGJlY2F1c2Ugd2UgYXJlIHRha2luZyBvd25lcnNoaXAgb2YgdGhlIHJlc3BvbnNpYmlsdHkgdG8gY2xlYXIgdGhlCisgICAgICAvLyBhbmFseXNpcyBzdGF0ZS4KKyAgICAgIFJIUy5Jbm5lckFNID0gbnVsbHB0cjsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICAvLy8gXGJyaWVmIEFjY2Vzc29yIGZvciB0aGUgYW5hbHlzaXMgbWFuYWdlci4KKyAgICBBbmFseXNpc01hbmFnZXJUICZnZXRNYW5hZ2VyKCkgeyByZXR1cm4gKklubmVyQU07IH0KKworICAgIC8vLyBcYnJpZWYgSGFuZGxlciBmb3IgaW52YWxpZGF0aW9uIG9mIHRoZSBvdXRlciBJUiB1bml0LCBcYyBJUlVuaXRULgorICAgIC8vLworICAgIC8vLyBJZiB0aGUgcHJveHkgYW5hbHlzaXMgaXRzZWxmIGlzIG5vdCBwcmVzZXJ2ZWQsIHdlIGFzc3VtZSB0aGF0IHRoZSBzZXQgb2YKKyAgICAvLy8gaW5uZXIgSVIgb2JqZWN0cyBjb250YWluZWQgaW4gSVJVbml0IG1heSBoYXZlIGNoYW5nZWQuICBJbiB0aGlzIGNhc2UsCisgICAgLy8vIHdlIGhhdmUgdG8gY2FsbCBcYyBjbGVhcigpIG9uIHRoZSBpbm5lciBhbmFseXNpcyBtYW5hZ2VyLCBhcyBpdCBtYXkgbm93CisgICAgLy8vIGhhdmUgc3RhbGUgcG9pbnRlcnMgdG8gaXRzIGlubmVyIElSIG9iamVjdHMuCisgICAgLy8vCisgICAgLy8vIFJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcHJveHkgYW5hbHlzaXMgaXMgbWFya2VkIGFzIHByZXNlcnZlZCwgYWxsIG9mCisgICAgLy8vIHRoZSBhbmFseXNlcyBpbiB0aGUgaW5uZXIgYW5hbHlzaXMgbWFuYWdlciBhcmUgcG90ZW50aWFsbHkgaW52YWxpZGF0ZWQKKyAgICAvLy8gYmFzZWQgb24gdGhlIHNldCBvZiBwcmVzZXJ2ZWQgYW5hbHlzZXMuCisgICAgYm9vbCBpbnZhbGlkYXRlKAorICAgICAgICBJUlVuaXRUICZJUiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJlBBLAorICAgICAgICB0eXBlbmFtZSBBbmFseXNpc01hbmFnZXI8SVJVbml0VCwgRXh0cmFBcmdUcy4uLj46OkludmFsaWRhdG9yICZJbnYpOworCisgIHByaXZhdGU6CisgICAgQW5hbHlzaXNNYW5hZ2VyVCAqSW5uZXJBTTsKKyAgfTsKKworICBleHBsaWNpdCBJbm5lckFuYWx5c2lzTWFuYWdlclByb3h5KEFuYWx5c2lzTWFuYWdlclQgJklubmVyQU0pCisgICAgICA6IElubmVyQU0oJklubmVyQU0pIHt9CisKKyAgLy8vIFxicmllZiBSdW4gdGhlIGFuYWx5c2lzIHBhc3MgYW5kIGNyZWF0ZSBvdXIgcHJveHkgcmVzdWx0IG9iamVjdC4KKyAgLy8vCisgIC8vLyBUaGlzIGRvZXNuJ3QgZG8gYW55IGludGVyZXN0aW5nIHdvcms7IGl0IGlzIHByaW1hcmlseSB1c2VkIHRvIGluc2VydCBvdXIKKyAgLy8vIHByb3h5IHJlc3VsdCBvYmplY3QgaW50byB0aGUgb3V0ZXIgYW5hbHlzaXMgY2FjaGUgc28gdGhhdCB3ZSBjYW4gcHJveHkKKyAgLy8vIGludmFsaWRhdGlvbiB0byB0aGUgaW5uZXIgYW5hbHlzaXMgbWFuYWdlci4KKyAgUmVzdWx0IHJ1bihJUlVuaXRUICZJUiwgQW5hbHlzaXNNYW5hZ2VyPElSVW5pdFQsIEV4dHJhQXJnVHMuLi4+ICZBTSwKKyAgICAgICAgICAgICBFeHRyYUFyZ1RzLi4uKSB7CisgICAgcmV0dXJuIFJlc3VsdCgqSW5uZXJBTSk7CisgIH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIEFuYWx5c2lzSW5mb01peGluPAorICAgICAgSW5uZXJBbmFseXNpc01hbmFnZXJQcm94eTxBbmFseXNpc01hbmFnZXJULCBJUlVuaXRUPj47CisKKyAgc3RhdGljIEFuYWx5c2lzS2V5IEtleTsKKworICBBbmFseXNpc01hbmFnZXJUICpJbm5lckFNOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEFuYWx5c2lzTWFuYWdlclQsIHR5cGVuYW1lIElSVW5pdFQsIHR5cGVuYW1lLi4uIEV4dHJhQXJnVHM+CitBbmFseXNpc0tleQorICAgIElubmVyQW5hbHlzaXNNYW5hZ2VyUHJveHk8QW5hbHlzaXNNYW5hZ2VyVCwgSVJVbml0VCwgRXh0cmFBcmdUcy4uLj46OktleTsKKworLy8vIFByb3ZpZGUgdGhlIFxjIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyIHRvIFxjIE1vZHVsZSBwcm94eS4KK3VzaW5nIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyTW9kdWxlUHJveHkgPQorICAgIElubmVyQW5hbHlzaXNNYW5hZ2VyUHJveHk8RnVuY3Rpb25BbmFseXNpc01hbmFnZXIsIE1vZHVsZT47CisKKy8vLyBTcGVjaWFsaXphdGlvbiBvZiB0aGUgaW52YWxpZGF0ZSBtZXRob2QgZm9yIHRoZSBcYworLy8vIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyTW9kdWxlUHJveHkncyByZXN1bHQuCit0ZW1wbGF0ZSA8PgorYm9vbCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlck1vZHVsZVByb3h5OjpSZXN1bHQ6OmludmFsaWRhdGUoCisgICAgTW9kdWxlICZNLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlcyAmUEEsCisgICAgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyOjpJbnZhbGlkYXRvciAmSW52KTsKKworLy8gRW5zdXJlIHRoZSBcYyBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlck1vZHVsZVByb3h5IGlzIHByb3ZpZGVkIGFzIGFuIGV4dGVybgorLy8gdGVtcGxhdGUuCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgSW5uZXJBbmFseXNpc01hbmFnZXJQcm94eTxGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZT47CisKKy8vLyBcYnJpZWYgQW4gYW5hbHlzaXMgb3ZlciBhbiAiaW5uZXIiIElSIHVuaXQgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gYW4KKy8vLyBhbmFseXNpcyBtYW5hZ2VyIG92ZXIgYSAib3V0ZXIiIElSIHVuaXQuICBUaGUgaW5uZXIgdW5pdCBtdXN0IGJlIGNvbnRhaW5lZAorLy8vIGluIHRoZSBvdXRlciB1bml0LgorLy8vCisvLy8gRm9yIGV4YW1wbGUgT3V0ZXJBbmFseXNpc01hbmFnZXJQcm94eTxNb2R1bGVBbmFseXNpc01hbmFnZXIsIEZ1bmN0aW9uPiBpcyBhbgorLy8vIGFuYWx5c2lzIG92ZXIgRnVuY3Rpb25zICh0aGUgImlubmVyIiB1bml0KSB3aGljaCBwcm92aWRlcyBhY2Nlc3MgdG8gYSBNb2R1bGUKKy8vLyBhbmFseXNpcyBtYW5hZ2VyLiAgVGhlIE1vZHVsZUFuYWx5c2lzTWFuYWdlciBpcyB0aGUgIm91dGVyIiBtYW5hZ2VyIGJlaW5nCisvLy8gcHJveGllZCwgYW5kIE1vZHVsZXMgYXJlIHRoZSAib3V0ZXIiIElSIHVuaXQuICBUaGUgaW5uZXIvb3V0ZXIgcmVsYXRpb25zaGlwCisvLy8gaXMgdmFsaWQgYmVjYXVzZSBlYWNoIEZ1bmN0aW9uIGlzIGNvbnRhaW5lZCBpbiBvbmUgTW9kdWxlLgorLy8vCisvLy8gVGhpcyBwcm94eSBvbmx5IGV4cG9zZXMgdGhlIGNvbnN0IGludGVyZmFjZSBvZiB0aGUgb3V0ZXIgYW5hbHlzaXMgbWFuYWdlciwKKy8vLyB0byBpbmRpY2F0ZSB0aGF0IHlvdSBjYW5ub3QgY2F1c2UgYW4gb3V0ZXIgYW5hbHlzaXMgdG8gcnVuIGZyb20gd2l0aGluIGFuCisvLy8gaW5uZXIgcGFzcy4gIEluc3RlYWQsIHlvdSBtdXN0IHJlbHkgb24gdGhlIFxjIGdldENhY2hlZFJlc3VsdCBBUEkuCisvLy8KKy8vLyBUaGlzIHByb3h5IGRvZXNuJ3QgbWFuYWdlIGludmFsaWRhdGlvbiBpbiBhbnkgd2F5IC0tIHRoYXQgaXMgaGFuZGxlZCBieSB0aGUKKy8vLyByZWN1cnNpdmUgcmV0dXJuIHBhdGggb2YgZWFjaCBsYXllciBvZiB0aGUgcGFzcyBtYW5hZ2VyLiAgQSBjb25zZXF1ZW5jZSBvZgorLy8vIHRoaXMgaXMgdGhlIG91dGVyIGFuYWx5c2VzIG1heSBiZSBzdGFsZS4gIFdlIGludmFsaWRhdGUgdGhlIG91dGVyIGFuYWx5c2VzCisvLy8gb25seSB3aGVuIHdlJ3JlIGRvbmUgcnVubmluZyBwYXNzZXMgb3ZlciB0aGUgaW5uZXIgSVIgdW5pdHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQW5hbHlzaXNNYW5hZ2VyVCwgdHlwZW5hbWUgSVJVbml0VCwgdHlwZW5hbWUuLi4gRXh0cmFBcmdUcz4KK2NsYXNzIE91dGVyQW5hbHlzaXNNYW5hZ2VyUHJveHkKKyAgICA6IHB1YmxpYyBBbmFseXNpc0luZm9NaXhpbjwKKyAgICAgICAgICBPdXRlckFuYWx5c2lzTWFuYWdlclByb3h5PEFuYWx5c2lzTWFuYWdlclQsIElSVW5pdFQsIEV4dHJhQXJnVHMuLi4+PiB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgUmVzdWx0IHByb3h5IG9iamVjdCBmb3IgXGMgT3V0ZXJBbmFseXNpc01hbmFnZXJQcm94eS4KKyAgY2xhc3MgUmVzdWx0IHsKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IFJlc3VsdChjb25zdCBBbmFseXNpc01hbmFnZXJUICZBTSkgOiBBTSgmQU0pIHt9CisKKyAgICBjb25zdCBBbmFseXNpc01hbmFnZXJUICZnZXRNYW5hZ2VyKCkgY29uc3QgeyByZXR1cm4gKkFNOyB9CisKKyAgICAvLy8gV2hlbiBpbnZhbGlkYXRpb24gb2NjdXJzLCByZW1vdmUgYW55IHJlZ2lzdGVyZWQgaW52YWxpZGF0aW9uIGV2ZW50cy4KKyAgICBib29sIGludmFsaWRhdGUoCisgICAgICAgIElSVW5pdFQgJklSVW5pdCwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXMgJlBBLAorICAgICAgICB0eXBlbmFtZSBBbmFseXNpc01hbmFnZXI8SVJVbml0VCwgRXh0cmFBcmdUcy4uLj46OkludmFsaWRhdG9yICZJbnYpIHsKKyAgICAgIC8vIExvb3Agb3ZlciB0aGUgc2V0IG9mIHJlZ2lzdGVyZWQgb3V0ZXIgaW52YWxpZGF0aW9uIG1hcHBpbmdzIGFuZCBpZiBhbnkKKyAgICAgIC8vIG9mIHRoZW0gbWFwIHRvIGFuIGFuYWx5c2lzIHRoYXQgaXMgbm93IGludmFsaWQsIGNsZWFyIGl0IG91dC4KKyAgICAgIFNtYWxsVmVjdG9yPEFuYWx5c2lzS2V5ICosIDQ+IERlYWRLZXlzOworICAgICAgZm9yIChhdXRvICZLZXlWYWx1ZVBhaXIgOiBPdXRlckFuYWx5c2lzSW52YWxpZGF0aW9uTWFwKSB7CisgICAgICAgIEFuYWx5c2lzS2V5ICpPdXRlcklEID0gS2V5VmFsdWVQYWlyLmZpcnN0OworICAgICAgICBhdXRvICZJbm5lcklEcyA9IEtleVZhbHVlUGFpci5zZWNvbmQ7CisgICAgICAgIElubmVySURzLmVyYXNlKGxsdm06OnJlbW92ZV9pZihJbm5lcklEcywgWyZdKEFuYWx5c2lzS2V5ICpJbm5lcklEKSB7CisgICAgICAgICAgcmV0dXJuIEludi5pbnZhbGlkYXRlKElubmVySUQsIElSVW5pdCwgUEEpOyB9KSwKKyAgICAgICAgICAgICAgICAgICAgICAgSW5uZXJJRHMuZW5kKCkpOworICAgICAgICBpZiAoSW5uZXJJRHMuZW1wdHkoKSkKKyAgICAgICAgICBEZWFkS2V5cy5wdXNoX2JhY2soT3V0ZXJJRCk7CisgICAgICB9CisKKyAgICAgIGZvciAoYXV0byBPdXRlcklEIDogRGVhZEtleXMpCisgICAgICAgIE91dGVyQW5hbHlzaXNJbnZhbGlkYXRpb25NYXAuZXJhc2UoT3V0ZXJJRCk7CisKKyAgICAgIC8vIFRoZSBwcm94eSBpdHNlbGYgcmVtYWlucyB2YWxpZCByZWdhcmRsZXNzIG9mIGFueXRoaW5nIGVsc2UuCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8vIFJlZ2lzdGVyIGEgZGVmZXJyZWQgaW52YWxpZGF0aW9uIGV2ZW50IGZvciB3aGVuIHRoZSBvdXRlciBhbmFseXNpcworICAgIC8vLyBtYW5hZ2VyIHByb2Nlc3NlcyBpdHMgaW52YWxpZGF0aW9ucy4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3V0ZXJBbmFseXNpc1QsIHR5cGVuYW1lIEludmFsaWRhdGVkQW5hbHlzaXNUPgorICAgIHZvaWQgcmVnaXN0ZXJPdXRlckFuYWx5c2lzSW52YWxpZGF0aW9uKCkgeworICAgICAgQW5hbHlzaXNLZXkgKk91dGVySUQgPSBPdXRlckFuYWx5c2lzVDo6SUQoKTsKKyAgICAgIEFuYWx5c2lzS2V5ICpJbnZhbGlkYXRlZElEID0gSW52YWxpZGF0ZWRBbmFseXNpc1Q6OklEKCk7CisKKyAgICAgIGF1dG8gJkludmFsaWRhdGVkSURMaXN0ID0gT3V0ZXJBbmFseXNpc0ludmFsaWRhdGlvbk1hcFtPdXRlcklEXTsKKyAgICAgIC8vIE5vdGUsIHRoaXMgaXMgYSBsaW5lYXIgc2Nhbi4gSWYgd2UgZW5kIHVwIHdpdGggbGFyZ2UgbnVtYmVycyBvZgorICAgICAgLy8gYW5hbHlzZXMgdGhhdCBhbGwgdHJpZ2dlciBpbnZhbGlkYXRpb24gb24gdGhlIHNhbWUgb3V0ZXIgYW5hbHlzaXMsCisgICAgICAvLyB0aGlzIGVudGlyZSBzeXN0ZW0gc2hvdWxkIGJlIGNoYW5nZWQgdG8gc29tZSBvdGhlciBkZXRlcm1pbmlzdGljCisgICAgICAvLyBkYXRhIHN0cnVjdHVyZSBzdWNoIGFzIGEgYFNldFZlY3RvcmAgb2YgYSBwYWlyIG9mIHBvaW50ZXJzLgorICAgICAgYXV0byBJbnZhbGlkYXRlZEl0ID0gc3RkOjpmaW5kKEludmFsaWRhdGVkSURMaXN0LmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZGF0ZWRJRExpc3QuZW5kKCksIEludmFsaWRhdGVkSUQpOworICAgICAgaWYgKEludmFsaWRhdGVkSXQgPT0gSW52YWxpZGF0ZWRJRExpc3QuZW5kKCkpCisgICAgICAgIEludmFsaWRhdGVkSURMaXN0LnB1c2hfYmFjayhJbnZhbGlkYXRlZElEKTsKKyAgICB9CisKKyAgICAvLy8gQWNjZXNzIHRoZSBtYXAgZnJvbSBvdXRlciBhbmFseXNlcyB0byBkZWZlcnJlZCBpbnZhbGlkYXRpb24gcmVxdWlyaW5nCisgICAgLy8vIGFuYWx5c2VzLgorICAgIGNvbnN0IFNtYWxsRGVuc2VNYXA8QW5hbHlzaXNLZXkgKiwgVGlueVB0clZlY3RvcjxBbmFseXNpc0tleSAqPiwgMj4gJgorICAgIGdldE91dGVySW52YWxpZGF0aW9ucygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBPdXRlckFuYWx5c2lzSW52YWxpZGF0aW9uTWFwOworICAgIH0KKworICBwcml2YXRlOgorICAgIGNvbnN0IEFuYWx5c2lzTWFuYWdlclQgKkFNOworCisgICAgLy8vIEEgbWFwIGZyb20gYW4gb3V0ZXIgYW5hbHlzaXMgSUQgdG8gdGhlIHNldCBvZiB0aGlzIElSLXVuaXQncyBhbmFseXNlcworICAgIC8vLyB3aGljaCBuZWVkIHRvIGJlIGludmFsaWRhdGVkLgorICAgIFNtYWxsRGVuc2VNYXA8QW5hbHlzaXNLZXkgKiwgVGlueVB0clZlY3RvcjxBbmFseXNpc0tleSAqPiwgMj4KKyAgICAgICAgT3V0ZXJBbmFseXNpc0ludmFsaWRhdGlvbk1hcDsKKyAgfTsKKworICBPdXRlckFuYWx5c2lzTWFuYWdlclByb3h5KGNvbnN0IEFuYWx5c2lzTWFuYWdlclQgJkFNKSA6IEFNKCZBTSkge30KKworICAvLy8gXGJyaWVmIFJ1biB0aGUgYW5hbHlzaXMgcGFzcyBhbmQgY3JlYXRlIG91ciBwcm94eSByZXN1bHQgb2JqZWN0LgorICAvLy8gTm90aGluZyB0byBzZWUgaGVyZSwgaXQganVzdCBmb3J3YXJkcyB0aGUgXGMgQU0gcmVmZXJlbmNlIGludG8gdGhlCisgIC8vLyByZXN1bHQuCisgIFJlc3VsdCBydW4oSVJVbml0VCAmLCBBbmFseXNpc01hbmFnZXI8SVJVbml0VCwgRXh0cmFBcmdUcy4uLj4gJiwKKyAgICAgICAgICAgICBFeHRyYUFyZ1RzLi4uKSB7CisgICAgcmV0dXJuIFJlc3VsdCgqQU0pOworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjwKKyAgICAgIE91dGVyQW5hbHlzaXNNYW5hZ2VyUHJveHk8QW5hbHlzaXNNYW5hZ2VyVCwgSVJVbml0VCwgRXh0cmFBcmdUcy4uLj4+OworCisgIHN0YXRpYyBBbmFseXNpc0tleSBLZXk7CisKKyAgY29uc3QgQW5hbHlzaXNNYW5hZ2VyVCAqQU07Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQW5hbHlzaXNNYW5hZ2VyVCwgdHlwZW5hbWUgSVJVbml0VCwgdHlwZW5hbWUuLi4gRXh0cmFBcmdUcz4KK0FuYWx5c2lzS2V5CisgICAgT3V0ZXJBbmFseXNpc01hbmFnZXJQcm94eTxBbmFseXNpc01hbmFnZXJULCBJUlVuaXRULCBFeHRyYUFyZ1RzLi4uPjo6S2V5OworCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgT3V0ZXJBbmFseXNpc01hbmFnZXJQcm94eTxNb2R1bGVBbmFseXNpc01hbmFnZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbj47CisvLy8gUHJvdmlkZSB0aGUgXGMgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyIHRvIFxjIEZ1bmN0aW9uIHByb3h5LgordXNpbmcgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyRnVuY3Rpb25Qcm94eSA9CisgICAgT3V0ZXJBbmFseXNpc01hbmFnZXJQcm94eTxNb2R1bGVBbmFseXNpc01hbmFnZXIsIEZ1bmN0aW9uPjsKKworLy8vIFxicmllZiBUcml2aWFsIGFkYXB0b3IgdGhhdCBtYXBzIGZyb20gYSBtb2R1bGUgdG8gaXRzIGZ1bmN0aW9ucy4KKy8vLworLy8vIERlc2lnbmVkIHRvIGFsbG93IGNvbXBvc2l0aW9uIG9mIGEgRnVuY3Rpb25QYXNzKE1hbmFnZXIpIGFuZAorLy8vIGEgTW9kdWxlUGFzc01hbmFnZXIsIGJ5IHJ1bm5pbmcgdGhlIEZ1bmN0aW9uUGFzcyhNYW5hZ2VyKSBvdmVyIGV2ZXJ5CisvLy8gZnVuY3Rpb24gaW4gdGhlIG1vZHVsZS4KKy8vLworLy8vIEZ1bmN0aW9uIHBhc3NlcyBydW4gd2l0aGluIHRoaXMgYWRhcHRvciBjYW4gcmVseSBvbiBoYXZpbmcgZXhjbHVzaXZlIGFjY2VzcworLy8vIHRvIHRoZSBmdW5jdGlvbiB0aGV5IGFyZSBydW4gb3Zlci4gVGhleSBzaG91bGQgbm90IHJlYWQgb3IgbW9kaWZ5IGFueSBvdGhlcgorLy8vIGZ1bmN0aW9ucyEgT3RoZXIgdGhyZWFkcyBvciBzeXN0ZW1zIG1heSBiZSBtYW5pcHVsYXRpbmcgb3RoZXIgZnVuY3Rpb25zIGluCisvLy8gdGhlIG1vZHVsZSwgYW5kIHNvIHRoZWlyIHN0YXRlIHNob3VsZCBuZXZlciBiZSByZWxpZWQgb24uCisvLy8gRklYTUU6IE1ha2UgdGhlIGFib3ZlIHRydWUgZm9yIGFsbCBvZiBMTFZNJ3MgYWN0dWFsIHBhc3Nlcywgc29tZSBzdGlsbAorLy8vIHZpb2xhdGUgdGhpcyBwcmluY2lwbGUuCisvLy8KKy8vLyBGdW5jdGlvbiBwYXNzZXMgY2FuIGFsc28gcmVhZCB0aGUgbW9kdWxlIGNvbnRhaW5pbmcgdGhlIGZ1bmN0aW9uLCBidXQgdGhleQorLy8vIHNob3VsZCBub3QgbW9kaWZ5IHRoYXQgbW9kdWxlIG91dHNpZGUgb2YgdGhlIHVzZSBsaXN0cyBvZiB2YXJpb3VzIGdsb2JhbHMuCisvLy8gRm9yIGV4YW1wbGUsIGEgZnVuY3Rpb24gcGFzcyBpcyBub3QgcGVybWl0dGVkIHRvIGFkZCBmdW5jdGlvbnMgdG8gdGhlCisvLy8gbW9kdWxlLgorLy8vIEZJWE1FOiBNYWtlIHRoZSBhYm92ZSB0cnVlIGZvciBhbGwgb2YgTExWTSdzIGFjdHVhbCBwYXNzZXMsIHNvbWUgc3RpbGwKKy8vLyB2aW9sYXRlIHRoaXMgcHJpbmNpcGxlLgorLy8vCisvLy8gTm90ZSB0aGF0IGFsdGhvdWdoIGZ1bmN0aW9uIHBhc3NlcyBjYW4gYWNjZXNzIG1vZHVsZSBhbmFseXNlcywgbW9kdWxlCisvLy8gYW5hbHlzZXMgYXJlIG5vdCBpbnZhbGlkYXRlZCB3aGlsZSB0aGUgZnVuY3Rpb24gcGFzc2VzIGFyZSBydW5uaW5nLCBzbyB0aGV5CisvLy8gbWF5IGJlIHN0YWxlLiAgRnVuY3Rpb24gYW5hbHlzZXMgd2lsbCBub3QgYmUgc3RhbGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb25QYXNzVD4KK2NsYXNzIE1vZHVsZVRvRnVuY3Rpb25QYXNzQWRhcHRvcgorICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48TW9kdWxlVG9GdW5jdGlvblBhc3NBZGFwdG9yPEZ1bmN0aW9uUGFzc1Q+PiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IE1vZHVsZVRvRnVuY3Rpb25QYXNzQWRhcHRvcihGdW5jdGlvblBhc3NUIFBhc3MpCisgICAgICA6IFBhc3Moc3RkOjptb3ZlKFBhc3MpKSB7fQorCisgIC8vLyBcYnJpZWYgUnVucyB0aGUgZnVuY3Rpb24gcGFzcyBhY3Jvc3MgZXZlcnkgZnVuY3Rpb24gaW4gdGhlIG1vZHVsZS4KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZBTSkgeworICAgIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZGQU0gPQorICAgICAgICBBTS5nZXRSZXN1bHQ8RnVuY3Rpb25BbmFseXNpc01hbmFnZXJNb2R1bGVQcm94eT4oTSkuZ2V0TWFuYWdlcigpOworCisgICAgUHJlc2VydmVkQW5hbHlzZXMgUEEgPSBQcmVzZXJ2ZWRBbmFseXNlczo6YWxsKCk7CisgICAgZm9yIChGdW5jdGlvbiAmRiA6IE0pIHsKKyAgICAgIGlmIChGLmlzRGVjbGFyYXRpb24oKSkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIFByZXNlcnZlZEFuYWx5c2VzIFBhc3NQQSA9IFBhc3MucnVuKEYsIEZBTSk7CisKKyAgICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgZnVuY3Rpb24gcGFzcyBjb3VsZG4ndCBoYXZlIGludmFsaWRhdGVkIGFueSBvdGhlcgorICAgICAgLy8gZnVuY3Rpb24ncyBhbmFseXNlcyAodGhhdCdzIHRoZSBjb250cmFjdCBvZiBhIGZ1bmN0aW9uIHBhc3MpLCBzbworICAgICAgLy8gZGlyZWN0bHkgaGFuZGxlIHRoZSBmdW5jdGlvbiBhbmFseXNpcyBtYW5hZ2VyJ3MgaW52YWxpZGF0aW9uIGhlcmUuCisgICAgICBGQU0uaW52YWxpZGF0ZShGLCBQYXNzUEEpOworCisgICAgICAvLyBUaGVuIGludGVyc2VjdCB0aGUgcHJlc2VydmVkIHNldCBzbyB0aGF0IGludmFsaWRhdGlvbiBvZiBtb2R1bGUKKyAgICAgIC8vIGFuYWx5c2VzIHdpbGwgZXZlbnR1YWxseSBvY2N1ciB3aGVuIHRoZSBtb2R1bGUgcGFzcyBjb21wbGV0ZXMuCisgICAgICBQQS5pbnRlcnNlY3Qoc3RkOjptb3ZlKFBhc3NQQSkpOworICAgIH0KKworICAgIC8vIFRoZSBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlck1vZHVsZVByb3h5IGlzIHByZXNlcnZlZCBiZWNhdXNlICh3ZSBhc3N1bWUpCisgICAgLy8gdGhlIGZ1bmN0aW9uIHBhc3NlcyB3ZSByYW4gZGlkbid0IGFkZCBvciByZW1vdmUgYW55IGZ1bmN0aW9ucy4KKyAgICAvLworICAgIC8vIFdlIGFsc28gcHJlc2VydmUgYWxsIGFuYWx5c2VzIG9uIEZ1bmN0aW9ucywgYmVjYXVzZSB3ZSBkaWQgYWxsIHRoZQorICAgIC8vIGludmFsaWRhdGlvbiB3ZSBuZWVkZWQgdG8gZG8gYWJvdmUuCisgICAgUEEucHJlc2VydmVTZXQ8QWxsQW5hbHlzZXNPbjxGdW5jdGlvbj4+KCk7CisgICAgUEEucHJlc2VydmU8RnVuY3Rpb25BbmFseXNpc01hbmFnZXJNb2R1bGVQcm94eT4oKTsKKyAgICByZXR1cm4gUEE7CisgIH0KKworcHJpdmF0ZToKKyAgRnVuY3Rpb25QYXNzVCBQYXNzOworfTsKKworLy8vIFxicmllZiBBIGZ1bmN0aW9uIHRvIGRlZHVjZSBhIGZ1bmN0aW9uIHBhc3MgdHlwZSBhbmQgd3JhcCBpdCBpbiB0aGUKKy8vLyB0ZW1wbGF0ZWQgYWRhcHRvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvblBhc3NUPgorTW9kdWxlVG9GdW5jdGlvblBhc3NBZGFwdG9yPEZ1bmN0aW9uUGFzc1Q+CitjcmVhdGVNb2R1bGVUb0Z1bmN0aW9uUGFzc0FkYXB0b3IoRnVuY3Rpb25QYXNzVCBQYXNzKSB7CisgIHJldHVybiBNb2R1bGVUb0Z1bmN0aW9uUGFzc0FkYXB0b3I8RnVuY3Rpb25QYXNzVD4oc3RkOjptb3ZlKFBhc3MpKTsKK30KKworLy8vIFxicmllZiBBIHV0aWxpdHkgcGFzcyB0ZW1wbGF0ZSB0byBmb3JjZSBhbiBhbmFseXNpcyByZXN1bHQgdG8gYmUgYXZhaWxhYmxlLgorLy8vCisvLy8gSWYgdGhlcmUgYXJlIGV4dHJhIGFyZ3VtZW50cyBhdCB0aGUgcGFzcydzIHJ1biBsZXZlbCB0aGVyZSBtYXkgYWxzbyBiZQorLy8vIGV4dHJhIGFyZ3VtZW50cyB0byB0aGUgYW5hbHlzaXMgbWFuYWdlcidzIFxjIGdldFJlc3VsdCByb3V0aW5lLiBXZSBjYW4ndAorLy8vIGd1ZXNzIGhvdyB0byBlZmZlY3RpdmVseSBtYXAgdGhlIGFyZ3VtZW50cyBmcm9tIG9uZSB0byB0aGUgb3RoZXIsIGFuZCBzbworLy8vIHRoaXMgc3BlY2lhbGl6YXRpb24ganVzdCBpZ25vcmVzIHRoZW0uCisvLy8KKy8vLyBTcGVjaWZpYyBwYXR0ZXJucyBvZiBydW4tbWV0aG9kIGV4dHJhIGFyZ3VtZW50cyBhbmQgYW5hbHlzaXMgbWFuYWdlciBleHRyYQorLy8vIGFyZ3VtZW50cyB3aWxsIGhhdmUgdG8gYmUgZGVmaW5lZCBhcyBhcHByb3ByaWF0ZSBzcGVjaWFsaXphdGlvbnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQW5hbHlzaXNULCB0eXBlbmFtZSBJUlVuaXRULAorICAgICAgICAgIHR5cGVuYW1lIEFuYWx5c2lzTWFuYWdlclQgPSBBbmFseXNpc01hbmFnZXI8SVJVbml0VD4sCisgICAgICAgICAgdHlwZW5hbWUuLi4gRXh0cmFBcmdUcz4KK3N0cnVjdCBSZXF1aXJlQW5hbHlzaXNQYXNzCisgICAgOiBQYXNzSW5mb01peGluPFJlcXVpcmVBbmFseXNpc1Bhc3M8QW5hbHlzaXNULCBJUlVuaXRULCBBbmFseXNpc01hbmFnZXJULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dHJhQXJnVHMuLi4+PiB7CisgIC8vLyBcYnJpZWYgUnVuIHRoaXMgcGFzcyBvdmVyIHNvbWUgdW5pdCBvZiBJUi4KKyAgLy8vCisgIC8vLyBUaGlzIHBhc3MgY2FuIGJlIHJ1biBvdmVyIGFueSB1bml0IG9mIElSIGFuZCB1c2UgYW55IGFuYWx5c2lzIG1hbmFnZXIKKyAgLy8vIHByb3ZpZGVkIHRoZXkgc2F0aXNmeSB0aGUgYmFzaWMgQVBJIHJlcXVpcmVtZW50cy4gV2hlbiB0aGlzIHBhc3MgaXMKKyAgLy8vIGNyZWF0ZWQsIHRoZXNlIG1ldGhvZHMgY2FuIGJlIGluc3RhbnRpYXRlZCB0byBzYXRpc2Z5IHdoYXRldmVyIHRoZQorICAvLy8gY29udGV4dCByZXF1aXJlcy4KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKElSVW5pdFQgJkFyZywgQW5hbHlzaXNNYW5hZ2VyVCAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYUFyZ1RzICYmLi4uIEFyZ3MpIHsKKyAgICAodm9pZClBTS50ZW1wbGF0ZSBnZXRSZXN1bHQ8QW5hbHlzaXNUPihBcmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkPEV4dHJhQXJnVHM+KEFyZ3MpLi4uKTsKKworICAgIHJldHVybiBQcmVzZXJ2ZWRBbmFseXNlczo6YWxsKCk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQSBuby1vcCBwYXNzIHRlbXBsYXRlIHdoaWNoIHNpbXBseSBmb3JjZXMgYSBzcGVjaWZpYyBhbmFseXNpcyByZXN1bHQKKy8vLyB0byBiZSBpbnZhbGlkYXRlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBBbmFseXNpc1Q+CitzdHJ1Y3QgSW52YWxpZGF0ZUFuYWx5c2lzUGFzcworICAgIDogUGFzc0luZm9NaXhpbjxJbnZhbGlkYXRlQW5hbHlzaXNQYXNzPEFuYWx5c2lzVD4+IHsKKyAgLy8vIFxicmllZiBSdW4gdGhpcyBwYXNzIG92ZXIgc29tZSB1bml0IG9mIElSLgorICAvLy8KKyAgLy8vIFRoaXMgcGFzcyBjYW4gYmUgcnVuIG92ZXIgYW55IHVuaXQgb2YgSVIgYW5kIHVzZSBhbnkgYW5hbHlzaXMgbWFuYWdlciwKKyAgLy8vIHByb3ZpZGVkIHRoZXkgc2F0aXNmeSB0aGUgYmFzaWMgQVBJIHJlcXVpcmVtZW50cy4gV2hlbiB0aGlzIHBhc3MgaXMKKyAgLy8vIGNyZWF0ZWQsIHRoZXNlIG1ldGhvZHMgY2FuIGJlIGluc3RhbnRpYXRlZCB0byBzYXRpc2Z5IHdoYXRldmVyIHRoZQorICAvLy8gY29udGV4dCByZXF1aXJlcy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElSVW5pdFQsIHR5cGVuYW1lIEFuYWx5c2lzTWFuYWdlclQsIHR5cGVuYW1lLi4uIEV4dHJhQXJnVHM+CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihJUlVuaXRUICZBcmcsIEFuYWx5c2lzTWFuYWdlclQgJkFNLCBFeHRyYUFyZ1RzICYmLi4uKSB7CisgICAgYXV0byBQQSA9IFByZXNlcnZlZEFuYWx5c2VzOjphbGwoKTsKKyAgICBQQS5hYmFuZG9uPEFuYWx5c2lzVD4oKTsKKyAgICByZXR1cm4gUEE7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQSB1dGlsaXR5IHBhc3MgdGhhdCBkb2VzIG5vdGhpbmcsIGJ1dCBwcmVzZXJ2ZXMgbm8gYW5hbHlzZXMuCisvLy8KKy8vLyBCZWNhdXNlIHRoaXMgcHJlc2VydmVzIG5vIGFuYWx5c2VzLCBhbnkgYW5hbHlzaXMgcGFzc2VzIHF1ZXJpZWQgYWZ0ZXIgdGhpcworLy8vIHBhc3MgcnVucyB3aWxsIHJlY29tcHV0ZSBmcmVzaCByZXN1bHRzLgorc3RydWN0IEludmFsaWRhdGVBbGxBbmFseXNlc1Bhc3MgOiBQYXNzSW5mb01peGluPEludmFsaWRhdGVBbGxBbmFseXNlc1Bhc3M+IHsKKyAgLy8vIFxicmllZiBSdW4gdGhpcyBwYXNzIG92ZXIgc29tZSB1bml0IG9mIElSLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSVJVbml0VCwgdHlwZW5hbWUgQW5hbHlzaXNNYW5hZ2VyVCwgdHlwZW5hbWUuLi4gRXh0cmFBcmdUcz4KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKElSVW5pdFQgJiwgQW5hbHlzaXNNYW5hZ2VyVCAmLCBFeHRyYUFyZ1RzICYmLi4uKSB7CisgICAgcmV0dXJuIFByZXNlcnZlZEFuYWx5c2VzOjpub25lKCk7CisgIH0KK307CisKKy8vLyBBIHV0aWxpdHkgcGFzcyB0ZW1wbGF0ZSB0aGF0IHNpbXBseSBydW5zIGFub3RoZXIgcGFzcyBtdWx0aXBsZSB0aW1lcy4KKy8vLworLy8vIFRoaXMgY2FuIGJlIHVzZWZ1bCB3aGVuIGRlYnVnZ2luZyBvciB0ZXN0aW5nIHBhc3Nlcy4gSXQgYWxzbyBzZXJ2ZXMgYXMgYW4KKy8vLyBleGFtcGxlIG9mIGhvdyB0byBleHRlbmQgdGhlIHBhc3MgbWFuYWdlciBpbiB3YXlzIGJleW9uZCBjb21wb3NpdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQYXNzVD4KK2NsYXNzIFJlcGVhdGVkUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPFJlcGVhdGVkUGFzczxQYXNzVD4+IHsKK3B1YmxpYzoKKyAgUmVwZWF0ZWRQYXNzKGludCBDb3VudCwgUGFzc1QgUCkgOiBDb3VudChDb3VudCksIFAoc3RkOjptb3ZlKFApKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBJUlVuaXRULCB0eXBlbmFtZSBBbmFseXNpc01hbmFnZXJULCB0eXBlbmFtZS4uLiBUcz4KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKElSVW5pdFQgJkFyZywgQW5hbHlzaXNNYW5hZ2VyVCAmQU0sIFRzICYmLi4uIEFyZ3MpIHsKKyAgICBhdXRvIFBBID0gUHJlc2VydmVkQW5hbHlzZXM6OmFsbCgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ291bnQ7ICsraSkKKyAgICAgIFBBLmludGVyc2VjdChQLnJ1bihBcmcsIEFNLCBzdGQ6OmZvcndhcmQ8VHM+KEFyZ3MpLi4uKSk7CisgICAgcmV0dXJuIFBBOworICB9CisKK3ByaXZhdGU6CisgIGludCBDb3VudDsKKyAgUGFzc1QgUDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBQYXNzVD4KK1JlcGVhdGVkUGFzczxQYXNzVD4gY3JlYXRlUmVwZWF0ZWRQYXNzKGludCBDb3VudCwgUGFzc1QgUCkgeworICByZXR1cm4gUmVwZWF0ZWRQYXNzPFBhc3NUPihDb3VudCwgc3RkOjptb3ZlKFApKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfUEFTU01BTkFHRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9QYXNzTWFuYWdlckludGVybmFsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1Bhc3NNYW5hZ2VySW50ZXJuYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTk1ZDRkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9QYXNzTWFuYWdlckludGVybmFsLmgKQEAgLTAsMCArMSwzMDggQEAKKy8vPT09LSBQYXNzTWFuYWdlciBpbnRlcm5hbCBBUElzIGFuZCBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLworLy8vIFRoaXMgaGVhZGVyIHByb3ZpZGVzIGludGVybmFsIEFQSXMgYW5kIGltcGxlbWVudGF0aW9uIGRldGFpbHMgdXNlZCBieSB0aGUKKy8vLyBwYXNzIG1hbmFnZW1lbnQgaW50ZXJmYWNlcyBleHBvc2VkIGluIFBhc3NNYW5hZ2VyLmguIFRvIHVuZGVyc3RhbmQgbW9yZQorLy8vIGNvbnRleHQgb2Ygd2h5IHRoZXNlIHBhcnRpY3VsYXIgaW50ZXJmYWNlcyBhcmUgbmVlZGVkLCBzZWUgdGhhdCBoZWFkZXIKKy8vLyBmaWxlLiBOb25lIG9mIHRoZXNlIEFQSXMgc2hvdWxkIGJlIHVzZWQgZWxzZXdoZXJlLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfUEFTU01BTkFHRVJJTlRFUk5BTF9ICisjZGVmaW5lIExMVk1fSVJfUEFTU01BTkFHRVJJTlRFUk5BTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSVJVbml0VD4gY2xhc3MgQWxsQW5hbHlzZXNPbjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBJUlVuaXRULCB0eXBlbmFtZS4uLiBFeHRyYUFyZ1RzPiBjbGFzcyBBbmFseXNpc01hbmFnZXI7CitjbGFzcyBQcmVzZXJ2ZWRBbmFseXNlczsKKworLy8vIFxicmllZiBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIG9mIHRoZSBwYXNzIG1hbmFnZXIgaW50ZXJmYWNlcy4KK25hbWVzcGFjZSBkZXRhaWwgeworCisvLy8gXGJyaWVmIFRlbXBsYXRlIGZvciB0aGUgYWJzdHJhY3QgYmFzZSBjbGFzcyB1c2VkIHRvIGRpc3BhdGNoCisvLy8gcG9seW1vcnBoaWNhbGx5IG92ZXIgcGFzcyBvYmplY3RzLgordGVtcGxhdGUgPHR5cGVuYW1lIElSVW5pdFQsIHR5cGVuYW1lIEFuYWx5c2lzTWFuYWdlclQsIHR5cGVuYW1lLi4uIEV4dHJhQXJnVHM+CitzdHJ1Y3QgUGFzc0NvbmNlcHQgeworICAvLyBCb2lsZXIgcGxhdGUgbmVjZXNzYXJ5IGZvciB0aGUgY29udGFpbmVyIG9mIGRlcml2ZWQgY2xhc3Nlcy4KKyAgdmlydHVhbCB+UGFzc0NvbmNlcHQoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxicmllZiBUaGUgcG9seW1vcnBoaWMgQVBJIHdoaWNoIHJ1bnMgdGhlIHBhc3Mgb3ZlciBhIGdpdmVuIElSIGVudGl0eS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgYWN0dWFsIHBhc3Mgb2JqZWN0IGNhbiBvbWl0IHRoZSBhbmFseXNpcyBtYW5hZ2VyIGFyZ3VtZW50IGlmCisgIC8vLyBkZXNpcmVkLiBBbHNvIHRoYXQgdGhlIGFuYWx5c2lzIG1hbmFnZXIgbWF5IGJlIG51bGwgaWYgdGhlcmUgaXMgbm8KKyAgLy8vIGFuYWx5c2lzIG1hbmFnZXIgaW4gdGhlIHBhc3MgcGlwZWxpbmUuCisgIHZpcnR1YWwgUHJlc2VydmVkQW5hbHlzZXMgcnVuKElSVW5pdFQgJklSLCBBbmFseXNpc01hbmFnZXJUICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0cmFBcmdUcy4uLiBFeHRyYUFyZ3MpID0gMDsKKworICAvLy8gXGJyaWVmIFBvbHltb3JwaGljIG1ldGhvZCB0byBhY2Nlc3MgdGhlIG5hbWUgb2YgYSBwYXNzLgorICB2aXJ0dWFsIFN0cmluZ1JlZiBuYW1lKCkgPSAwOworfTsKKworLy8vIFxicmllZiBBIHRlbXBsYXRlIHdyYXBwZXIgdXNlZCB0byBpbXBsZW1lbnQgdGhlIHBvbHltb3JwaGljIEFQSS4KKy8vLworLy8vIENhbiBiZSBpbnN0YW50aWF0ZWQgZm9yIGFueSBvYmplY3Qgd2hpY2ggcHJvdmlkZXMgYSBcYyBydW4gbWV0aG9kIGFjY2VwdGluZworLy8vIGFuIFxjIElSVW5pdFQmIGFuZCBhbiBcYyBBbmFseXNpc01hbmFnZXI8SVJVbml0PiYuIEl0IHJlcXVpcmVzIHRoZSBwYXNzIHRvCisvLy8gYmUgYSBjb3B5YWJsZSBvYmplY3QuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSVJVbml0VCwgdHlwZW5hbWUgUGFzc1QsIHR5cGVuYW1lIFByZXNlcnZlZEFuYWx5c2VzVCwKKyAgICAgICAgICB0eXBlbmFtZSBBbmFseXNpc01hbmFnZXJULCB0eXBlbmFtZS4uLiBFeHRyYUFyZ1RzPgorc3RydWN0IFBhc3NNb2RlbCA6IFBhc3NDb25jZXB0PElSVW5pdFQsIEFuYWx5c2lzTWFuYWdlclQsIEV4dHJhQXJnVHMuLi4+IHsKKyAgZXhwbGljaXQgUGFzc01vZGVsKFBhc3NUIFBhc3MpIDogUGFzcyhzdGQ6Om1vdmUoUGFzcykpIHt9CisgIC8vIFdlIGhhdmUgdG8gZXhwbGljaXRseSBkZWZpbmUgYWxsIHRoZSBzcGVjaWFsIG1lbWJlciBmdW5jdGlvbnMgYmVjYXVzZSBNU1ZDCisgIC8vIHJlZnVzZXMgdG8gZ2VuZXJhdGUgdGhlbS4KKyAgUGFzc01vZGVsKGNvbnN0IFBhc3NNb2RlbCAmQXJnKSA6IFBhc3MoQXJnLlBhc3MpIHt9CisgIFBhc3NNb2RlbChQYXNzTW9kZWwgJiZBcmcpIDogUGFzcyhzdGQ6Om1vdmUoQXJnLlBhc3MpKSB7fQorCisgIGZyaWVuZCB2b2lkIHN3YXAoUGFzc01vZGVsICZMSFMsIFBhc3NNb2RlbCAmUkhTKSB7CisgICAgdXNpbmcgc3RkOjpzd2FwOworICAgIHN3YXAoTEhTLlBhc3MsIFJIUy5QYXNzKTsKKyAgfQorCisgIFBhc3NNb2RlbCAmb3BlcmF0b3I9KFBhc3NNb2RlbCBSSFMpIHsKKyAgICBzd2FwKCp0aGlzLCBSSFMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIFByZXNlcnZlZEFuYWx5c2VzVCBydW4oSVJVbml0VCAmSVIsIEFuYWx5c2lzTWFuYWdlclQgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgIEV4dHJhQXJnVHMuLi4gRXh0cmFBcmdzKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIFBhc3MucnVuKElSLCBBTSwgRXh0cmFBcmdzLi4uKTsKKyAgfQorCisgIFN0cmluZ1JlZiBuYW1lKCkgb3ZlcnJpZGUgeyByZXR1cm4gUGFzc1Q6Om5hbWUoKTsgfQorCisgIFBhc3NUIFBhc3M7Cit9OworCisvLy8gXGJyaWVmIEFic3RyYWN0IGNvbmNlcHQgb2YgYW4gYW5hbHlzaXMgcmVzdWx0LgorLy8vCisvLy8gVGhpcyBjb25jZXB0IGlzIHBhcmFtZXRlcml6ZWQgb3ZlciB0aGUgSVIgdW5pdCB0aGF0IHRoaXMgcmVzdWx0IHBlcnRhaW5zCisvLy8gdG8uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSVJVbml0VCwgdHlwZW5hbWUgUHJlc2VydmVkQW5hbHlzZXNULCB0eXBlbmFtZSBJbnZhbGlkYXRvclQ+CitzdHJ1Y3QgQW5hbHlzaXNSZXN1bHRDb25jZXB0IHsKKyAgdmlydHVhbCB+QW5hbHlzaXNSZXN1bHRDb25jZXB0KCkgPSBkZWZhdWx0OworCisgIC8vLyBcYnJpZWYgTWV0aG9kIHRvIHRyeSBhbmQgbWFyayBhIHJlc3VsdCBhcyBpbnZhbGlkLgorICAvLy8KKyAgLy8vIFdoZW4gdGhlIG91dGVyIGFuYWx5c2lzIG1hbmFnZXIgZGV0ZWN0cyBhIGNoYW5nZSBpbiBzb21lIHVuZGVybHlpbmcKKyAgLy8vIHVuaXQgb2YgdGhlIElSLCBpdCB3aWxsIGNhbGwgdGhpcyBtZXRob2Qgb24gYWxsIG9mIHRoZSByZXN1bHRzIGNhY2hlZC4KKyAgLy8vCisgIC8vLyBccCBQQSBpcyBhIHNldCBvZiBwcmVzZXJ2ZWQgYW5hbHlzZXMgd2hpY2ggY2FuIGJlIHVzZWQgdG8gYXZvaWQKKyAgLy8vIGludmFsaWRhdGlvbiBiZWNhdXNlIHRoZSBwYXNzIHdoaWNoIGNoYW5nZWQgdGhlIHVuZGVybHlpbmcgSVIgdG9vayBjYXJlCisgIC8vLyB0byB1cGRhdGUgb3IgcHJlc2VydmUgdGhlIGFuYWx5c2lzIHJlc3VsdCBpbiBzb21lIHdheS4KKyAgLy8vCisgIC8vLyBccCBJbnYgaXMgdHlwaWNhbGx5IGEgXGMgQW5hbHlzaXNNYW5hZ2VyOjpJbnZhbGlkYXRvciBvYmplY3QgdGhhdCBjYW4gYmUKKyAgLy8vIHVzZWQgYnkgYSBwYXJ0aWN1bGFyIGFuYWx5c2lzIHJlc3VsdCB0byBkaXNjb3ZlciBpZiBvdGhlciBhbmFseXNlcworICAvLy8gcmVzdWx0cyBhcmUgYWxzbyBpbnZhbGlkYXRlZCBpbiB0aGUgZXZlbnQgdGhhdCB0aGlzIHJlc3VsdCBkZXBlbmRzIG9uCisgIC8vLyB0aGVtLiBTZWUgdGhlIGRvY3VtZW50YXRpb24gaW4gdGhlIFxjIEFuYWx5c2lzTWFuYWdlciBmb3IgbW9yZSBkZXRhaWxzLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgdGhlIHJlc3VsdCBpcyBpbmRlZWQgaW52YWxpZCAodGhlIGRlZmF1bHQpLgorICB2aXJ0dWFsIGJvb2wgaW52YWxpZGF0ZShJUlVuaXRUICZJUiwgY29uc3QgUHJlc2VydmVkQW5hbHlzZXNUICZQQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgSW52YWxpZGF0b3JUICZJbnYpID0gMDsKK307CisKKy8vLyBcYnJpZWYgU0ZJTkFFIG1ldGFmdW5jdGlvbiBmb3IgY29tcHV0aW5nIHdoZXRoZXIgXGMgUmVzdWx0VCBwcm92aWRlcyBhbgorLy8vIFxjIGludmFsaWRhdGUgbWVtYmVyIGZ1bmN0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIElSVW5pdFQsIHR5cGVuYW1lIFJlc3VsdFQ+IGNsYXNzIFJlc3VsdEhhc0ludmFsaWRhdGVNZXRob2QgeworICB1c2luZyBFbmFibGVkVHlwZSA9IGNoYXI7CisgIHN0cnVjdCBEaXNhYmxlZFR5cGUgeworICAgIGNoYXIgYSwgYjsKKyAgfTsKKworICAvLyBQdXJlbHkgdG8gaGVscCBvdXQgTVNWQyB3aGljaCBmYWlscyB0byBkaXNhYmxlIHRoZSBiZWxvdyBzcGVjaWFsaXphdGlvbiwKKyAgLy8gZXhwbGljaXRseSBlbmFibGUgdXNpbmcgdGhlIHJlc3VsdCB0eXBlJ3MgaW52YWxpZGF0ZSByb3V0aW5lIGlmIHdlIGNhbgorICAvLyBzdWNjZXNzZnVsbHkgY2FsbCB0aGF0IHJvdXRpbmUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgTm9uY2UgeyB1c2luZyBUeXBlID0gRW5hYmxlZFR5cGU7IH07CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgdHlwZW5hbWUgTm9uY2U8ZGVjbHR5cGUoc3RkOjpkZWNsdmFsPFQ+KCkuaW52YWxpZGF0ZSgKKyAgICAgIHN0ZDo6ZGVjbHZhbDxJUlVuaXRUICY+KCksIHN0ZDo6ZGVjbHZhbDxQcmVzZXJ2ZWRBbmFseXNlcz4oKSkpPjo6VHlwZQorICAgICAgY2hlY2socmFuazwyPik7CisKKyAgLy8gRmlyc3Qgd2UgZGVmaW5lIGFuIG92ZXJsb2FkIHRoYXQgY2FuIG9ubHkgYmUgdGFrZW4gaWYgdGhlcmUgaXMgbm8KKyAgLy8gaW52YWxpZGF0ZSBtZW1iZXIuIFdlIGRvIHRoaXMgYnkgdGFraW5nIHRoZSBhZGRyZXNzIG9mIGFuIGludmFsaWRhdGUKKyAgLy8gbWVtYmVyIGluIGFuIGFkamFjZW50IGJhc2UgY2xhc3Mgb2YgYSBkZXJpdmVkIGNsYXNzLiBUaGlzIHdvdWxkIGJlCisgIC8vIGFtYmlndW91cyBpZiB0aGVyZSB3ZXJlIGFuIGludmFsaWRhdGUgbWVtYmVyIGluIHRoZSByZXN1bHQgdHlwZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+IHN0YXRpYyBEaXNhYmxlZFR5cGUgTm9uY2VGdW5jdGlvbihUIFU6OiopOworICBzdHJ1Y3QgQ2hlY2tlckJhc2UgeyBpbnQgaW52YWxpZGF0ZTsgfTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBDaGVja2VyIDogQ2hlY2tlckJhc2UsIFQge307CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgZGVjbHR5cGUoTm9uY2VGdW5jdGlvbigmQ2hlY2tlcjxUPjo6aW52YWxpZGF0ZSkpIGNoZWNrKHJhbms8MT4pOworCisgIC8vIE5vdyB3ZSBoYXZlIHRoZSBmYWxsYmFjayB0aGF0IHdpbGwgb25seSBiZSByZWFjaGVkIHdoZW4gdGhlcmUgaXMgYW4KKyAgLy8gaW52YWxpZGF0ZSBtZW1iZXIsIGFuZCBlbmFibGVzIHRoZSB0cmFpdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyBFbmFibGVkVHlwZSBjaGVjayhyYW5rPDA+KTsKKworcHVibGljOgorICBlbnVtIHsgVmFsdWUgPSBzaXplb2YoY2hlY2s8UmVzdWx0VD4ocmFuazwyPigpKSkgPT0gc2l6ZW9mKEVuYWJsZWRUeXBlKSB9OworfTsKKworLy8vIFxicmllZiBXcmFwcGVyIHRvIG1vZGVsIHRoZSBhbmFseXNpcyByZXN1bHQgY29uY2VwdC4KKy8vLworLy8vIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbCBpbXBsZW1lbnQgdGhlIGludmFsaWRhdGUgbWV0aG9kIHdpdGggYSB0cml2aWFsCisvLy8gaW1wbGVtZW50YXRpb24gc28gdGhhdCB0aGUgYWN0dWFsIGFuYWx5c2lzIHJlc3VsdCBkb2Vzbid0IG5lZWQgdG8gcHJvdmlkZQorLy8vIGFuIGludmFsaWRhdGlvbiBoYW5kbGVyLiBJdCBpcyBvbmx5IHNlbGVjdGVkIHdoZW4gdGhlIGludmFsaWRhdGlvbiBoYW5kbGVyCisvLy8gaXMgbm90IHBhcnQgb2YgdGhlIFJlc3VsdFQncyBpbnRlcmZhY2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSVJVbml0VCwgdHlwZW5hbWUgUGFzc1QsIHR5cGVuYW1lIFJlc3VsdFQsCisgICAgICAgICAgdHlwZW5hbWUgUHJlc2VydmVkQW5hbHlzZXNULCB0eXBlbmFtZSBJbnZhbGlkYXRvclQsCisgICAgICAgICAgYm9vbCBIYXNJbnZhbGlkYXRlSGFuZGxlciA9CisgICAgICAgICAgICAgIFJlc3VsdEhhc0ludmFsaWRhdGVNZXRob2Q8SVJVbml0VCwgUmVzdWx0VD46OlZhbHVlPgorc3RydWN0IEFuYWx5c2lzUmVzdWx0TW9kZWw7CisKKy8vLyBcYnJpZWYgU3BlY2lhbGl6YXRpb24gb2YgXGMgQW5hbHlzaXNSZXN1bHRNb2RlbCB3aGljaCBwcm92aWRlcyB0aGUgZGVmYXVsdAorLy8vIGludmFsaWRhdGUgZnVuY3Rpb25hbGl0eS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJUlVuaXRULCB0eXBlbmFtZSBQYXNzVCwgdHlwZW5hbWUgUmVzdWx0VCwKKyAgICAgICAgICB0eXBlbmFtZSBQcmVzZXJ2ZWRBbmFseXNlc1QsIHR5cGVuYW1lIEludmFsaWRhdG9yVD4KK3N0cnVjdCBBbmFseXNpc1Jlc3VsdE1vZGVsPElSVW5pdFQsIFBhc3NULCBSZXN1bHRULCBQcmVzZXJ2ZWRBbmFseXNlc1QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkYXRvclQsIGZhbHNlPgorICAgIDogQW5hbHlzaXNSZXN1bHRDb25jZXB0PElSVW5pdFQsIFByZXNlcnZlZEFuYWx5c2VzVCwgSW52YWxpZGF0b3JUPiB7CisgIGV4cGxpY2l0IEFuYWx5c2lzUmVzdWx0TW9kZWwoUmVzdWx0VCBSZXN1bHQpIDogUmVzdWx0KHN0ZDo6bW92ZShSZXN1bHQpKSB7fQorICAvLyBXZSBoYXZlIHRvIGV4cGxpY2l0bHkgZGVmaW5lIGFsbCB0aGUgc3BlY2lhbCBtZW1iZXIgZnVuY3Rpb25zIGJlY2F1c2UgTVNWQworICAvLyByZWZ1c2VzIHRvIGdlbmVyYXRlIHRoZW0uCisgIEFuYWx5c2lzUmVzdWx0TW9kZWwoY29uc3QgQW5hbHlzaXNSZXN1bHRNb2RlbCAmQXJnKSA6IFJlc3VsdChBcmcuUmVzdWx0KSB7fQorICBBbmFseXNpc1Jlc3VsdE1vZGVsKEFuYWx5c2lzUmVzdWx0TW9kZWwgJiZBcmcpCisgICAgICA6IFJlc3VsdChzdGQ6Om1vdmUoQXJnLlJlc3VsdCkpIHt9CisKKyAgZnJpZW5kIHZvaWQgc3dhcChBbmFseXNpc1Jlc3VsdE1vZGVsICZMSFMsIEFuYWx5c2lzUmVzdWx0TW9kZWwgJlJIUykgeworICAgIHVzaW5nIHN0ZDo6c3dhcDsKKyAgICBzd2FwKExIUy5SZXN1bHQsIFJIUy5SZXN1bHQpOworICB9CisKKyAgQW5hbHlzaXNSZXN1bHRNb2RlbCAmb3BlcmF0b3I9KEFuYWx5c2lzUmVzdWx0TW9kZWwgUkhTKSB7CisgICAgc3dhcCgqdGhpcywgUkhTKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gXGJyaWVmIFRoZSBtb2RlbCBiYXNlcyBpbnZhbGlkYXRpb24gc29sZWx5IG9uIGJlaW5nIGluIHRoZSBwcmVzZXJ2ZWQgc2V0LgorICAvLworICAvLyBGSVhNRTogV2Ugc2hvdWxkIGFjdHVhbGx5IHVzZSB0d28gZGlmZmVyZW50IGNvbmNlcHRzIGZvciBhbmFseXNpcyByZXN1bHRzCisgIC8vIHJhdGhlciB0aGFuIHR3byBkaWZmZXJlbnQgbW9kZWxzLCBhbmQgYXZvaWQgdGhlIGluZGlyZWN0IGZ1bmN0aW9uIGNhbGwgZm9yCisgIC8vIG9uZXMgdGhhdCB1c2UgdGhlIHRyaXZpYWwgYmVoYXZpb3IuCisgIGJvb2wgaW52YWxpZGF0ZShJUlVuaXRUICYsIGNvbnN0IFByZXNlcnZlZEFuYWx5c2VzVCAmUEEsCisgICAgICAgICAgICAgICAgICBJbnZhbGlkYXRvclQgJikgb3ZlcnJpZGUgeworICAgIGF1dG8gUEFDID0gUEEudGVtcGxhdGUgZ2V0Q2hlY2tlcjxQYXNzVD4oKTsKKyAgICByZXR1cm4gIVBBQy5wcmVzZXJ2ZWQoKSAmJgorICAgICAgICAgICAhUEFDLnRlbXBsYXRlIHByZXNlcnZlZFNldDxBbGxBbmFseXNlc09uPElSVW5pdFQ+PigpOworICB9CisKKyAgUmVzdWx0VCBSZXN1bHQ7Cit9OworCisvLy8gXGJyaWVmIFNwZWNpYWxpemF0aW9uIG9mIFxjIEFuYWx5c2lzUmVzdWx0TW9kZWwgd2hpY2ggZGVsZWdhdGVzIGludmFsaWRhdGUKKy8vLyBoYW5kbGluZyB0byBcYyBSZXN1bHRULgordGVtcGxhdGUgPHR5cGVuYW1lIElSVW5pdFQsIHR5cGVuYW1lIFBhc3NULCB0eXBlbmFtZSBSZXN1bHRULAorICAgICAgICAgIHR5cGVuYW1lIFByZXNlcnZlZEFuYWx5c2VzVCwgdHlwZW5hbWUgSW52YWxpZGF0b3JUPgorc3RydWN0IEFuYWx5c2lzUmVzdWx0TW9kZWw8SVJVbml0VCwgUGFzc1QsIFJlc3VsdFQsIFByZXNlcnZlZEFuYWx5c2VzVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEludmFsaWRhdG9yVCwgdHJ1ZT4KKyAgICA6IEFuYWx5c2lzUmVzdWx0Q29uY2VwdDxJUlVuaXRULCBQcmVzZXJ2ZWRBbmFseXNlc1QsIEludmFsaWRhdG9yVD4geworICBleHBsaWNpdCBBbmFseXNpc1Jlc3VsdE1vZGVsKFJlc3VsdFQgUmVzdWx0KSA6IFJlc3VsdChzdGQ6Om1vdmUoUmVzdWx0KSkge30KKyAgLy8gV2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlZmluZSBhbGwgdGhlIHNwZWNpYWwgbWVtYmVyIGZ1bmN0aW9ucyBiZWNhdXNlIE1TVkMKKyAgLy8gcmVmdXNlcyB0byBnZW5lcmF0ZSB0aGVtLgorICBBbmFseXNpc1Jlc3VsdE1vZGVsKGNvbnN0IEFuYWx5c2lzUmVzdWx0TW9kZWwgJkFyZykgOiBSZXN1bHQoQXJnLlJlc3VsdCkge30KKyAgQW5hbHlzaXNSZXN1bHRNb2RlbChBbmFseXNpc1Jlc3VsdE1vZGVsICYmQXJnKQorICAgICAgOiBSZXN1bHQoc3RkOjptb3ZlKEFyZy5SZXN1bHQpKSB7fQorCisgIGZyaWVuZCB2b2lkIHN3YXAoQW5hbHlzaXNSZXN1bHRNb2RlbCAmTEhTLCBBbmFseXNpc1Jlc3VsdE1vZGVsICZSSFMpIHsKKyAgICB1c2luZyBzdGQ6OnN3YXA7CisgICAgc3dhcChMSFMuUmVzdWx0LCBSSFMuUmVzdWx0KTsKKyAgfQorCisgIEFuYWx5c2lzUmVzdWx0TW9kZWwgJm9wZXJhdG9yPShBbmFseXNpc1Jlc3VsdE1vZGVsIFJIUykgeworICAgIHN3YXAoKnRoaXMsIFJIUyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxicmllZiBUaGUgbW9kZWwgZGVsZWdhdGVzIHRvIHRoZSBcYyBSZXN1bHRUIG1ldGhvZC4KKyAgYm9vbCBpbnZhbGlkYXRlKElSVW5pdFQgJklSLCBjb25zdCBQcmVzZXJ2ZWRBbmFseXNlc1QgJlBBLAorICAgICAgICAgICAgICAgICAgSW52YWxpZGF0b3JUICZJbnYpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUmVzdWx0LmludmFsaWRhdGUoSVIsIFBBLCBJbnYpOworICB9CisKKyAgUmVzdWx0VCBSZXN1bHQ7Cit9OworCisvLy8gXGJyaWVmIEFic3RyYWN0IGNvbmNlcHQgb2YgYW4gYW5hbHlzaXMgcGFzcy4KKy8vLworLy8vIFRoaXMgY29uY2VwdCBpcyBwYXJhbWV0ZXJpemVkIG92ZXIgdGhlIElSIHVuaXQgdGhhdCBpdCBjYW4gcnVuIG92ZXIgYW5kCisvLy8gcHJvZHVjZSBhbiBhbmFseXNpcyByZXN1bHQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSVJVbml0VCwgdHlwZW5hbWUgUHJlc2VydmVkQW5hbHlzZXNULCB0eXBlbmFtZSBJbnZhbGlkYXRvclQsCisgICAgICAgICAgdHlwZW5hbWUuLi4gRXh0cmFBcmdUcz4KK3N0cnVjdCBBbmFseXNpc1Bhc3NDb25jZXB0IHsKKyAgdmlydHVhbCB+QW5hbHlzaXNQYXNzQ29uY2VwdCgpID0gZGVmYXVsdDsKKworICAvLy8gXGJyaWVmIE1ldGhvZCB0byBydW4gdGhpcyBhbmFseXNpcyBvdmVyIGEgdW5pdCBvZiBJUi4KKyAgLy8vIFxyZXR1cm5zIEEgdW5pcXVlX3B0ciB0byB0aGUgYW5hbHlzaXMgcmVzdWx0IG9iamVjdCB0byBiZSBxdWVyaWVkIGJ5CisgIC8vLyB1c2Vycy4KKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8CisgICAgICBBbmFseXNpc1Jlc3VsdENvbmNlcHQ8SVJVbml0VCwgUHJlc2VydmVkQW5hbHlzZXNULCBJbnZhbGlkYXRvclQ+PgorICBydW4oSVJVbml0VCAmSVIsIEFuYWx5c2lzTWFuYWdlcjxJUlVuaXRULCBFeHRyYUFyZ1RzLi4uPiAmQU0sCisgICAgICBFeHRyYUFyZ1RzLi4uIEV4dHJhQXJncykgPSAwOworCisgIC8vLyBcYnJpZWYgUG9seW1vcnBoaWMgbWV0aG9kIHRvIGFjY2VzcyB0aGUgbmFtZSBvZiBhIHBhc3MuCisgIHZpcnR1YWwgU3RyaW5nUmVmIG5hbWUoKSA9IDA7Cit9OworCisvLy8gXGJyaWVmIFdyYXBwZXIgdG8gbW9kZWwgdGhlIGFuYWx5c2lzIHBhc3MgY29uY2VwdC4KKy8vLworLy8vIENhbiB3cmFwIGFueSB0eXBlIHdoaWNoIGltcGxlbWVudHMgYSBzdWl0YWJsZSBcYyBydW4gbWV0aG9kLiBUaGUgbWV0aG9kCisvLy8gbXVzdCBhY2NlcHQgYW4gXGMgSVJVbml0VCYgYW5kIGFuIFxjIEFuYWx5c2lzTWFuYWdlcjxJUlVuaXRUPiYgYXMgYXJndW1lbnRzCisvLy8gYW5kIHByb2R1Y2UgYW4gb2JqZWN0IHdoaWNoIGNhbiBiZSB3cmFwcGVkIGluIGEgXGMgQW5hbHlzaXNSZXN1bHRNb2RlbC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJUlVuaXRULCB0eXBlbmFtZSBQYXNzVCwgdHlwZW5hbWUgUHJlc2VydmVkQW5hbHlzZXNULAorICAgICAgICAgIHR5cGVuYW1lIEludmFsaWRhdG9yVCwgdHlwZW5hbWUuLi4gRXh0cmFBcmdUcz4KK3N0cnVjdCBBbmFseXNpc1Bhc3NNb2RlbCA6IEFuYWx5c2lzUGFzc0NvbmNlcHQ8SVJVbml0VCwgUHJlc2VydmVkQW5hbHlzZXNULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnZhbGlkYXRvclQsIEV4dHJhQXJnVHMuLi4+IHsKKyAgZXhwbGljaXQgQW5hbHlzaXNQYXNzTW9kZWwoUGFzc1QgUGFzcykgOiBQYXNzKHN0ZDo6bW92ZShQYXNzKSkge30KKyAgLy8gV2UgaGF2ZSB0byBleHBsaWNpdGx5IGRlZmluZSBhbGwgdGhlIHNwZWNpYWwgbWVtYmVyIGZ1bmN0aW9ucyBiZWNhdXNlIE1TVkMKKyAgLy8gcmVmdXNlcyB0byBnZW5lcmF0ZSB0aGVtLgorICBBbmFseXNpc1Bhc3NNb2RlbChjb25zdCBBbmFseXNpc1Bhc3NNb2RlbCAmQXJnKSA6IFBhc3MoQXJnLlBhc3MpIHt9CisgIEFuYWx5c2lzUGFzc01vZGVsKEFuYWx5c2lzUGFzc01vZGVsICYmQXJnKSA6IFBhc3Moc3RkOjptb3ZlKEFyZy5QYXNzKSkge30KKworICBmcmllbmQgdm9pZCBzd2FwKEFuYWx5c2lzUGFzc01vZGVsICZMSFMsIEFuYWx5c2lzUGFzc01vZGVsICZSSFMpIHsKKyAgICB1c2luZyBzdGQ6OnN3YXA7CisgICAgc3dhcChMSFMuUGFzcywgUkhTLlBhc3MpOworICB9CisKKyAgQW5hbHlzaXNQYXNzTW9kZWwgJm9wZXJhdG9yPShBbmFseXNpc1Bhc3NNb2RlbCBSSFMpIHsKKyAgICBzd2FwKCp0aGlzLCBSSFMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vIEZJWE1FOiBSZXBsYWNlIFBhc3NUOjpSZXN1bHQgd2l0aCB0eXBlIHRyYWl0cyB3aGVuIHdlIHVzZSBDKysxMS4KKyAgdXNpbmcgUmVzdWx0TW9kZWxUID0KKyAgICAgIEFuYWx5c2lzUmVzdWx0TW9kZWw8SVJVbml0VCwgUGFzc1QsIHR5cGVuYW1lIFBhc3NUOjpSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFByZXNlcnZlZEFuYWx5c2VzVCwgSW52YWxpZGF0b3JUPjsKKworICAvLy8gXGJyaWVmIFRoZSBtb2RlbCBkZWxlZ2F0ZXMgdG8gdGhlIFxjIFBhc3NUOjpydW4gbWV0aG9kLgorICAvLy8KKyAgLy8vIFRoZSByZXR1cm4gaXMgd3JhcHBlZCBpbiBhbiBcYyBBbmFseXNpc1Jlc3VsdE1vZGVsLgorICBzdGQ6OnVuaXF1ZV9wdHI8CisgICAgICBBbmFseXNpc1Jlc3VsdENvbmNlcHQ8SVJVbml0VCwgUHJlc2VydmVkQW5hbHlzZXNULCBJbnZhbGlkYXRvclQ+PgorICBydW4oSVJVbml0VCAmSVIsIEFuYWx5c2lzTWFuYWdlcjxJUlVuaXRULCBFeHRyYUFyZ1RzLi4uPiAmQU0sCisgICAgICBFeHRyYUFyZ1RzLi4uIEV4dHJhQXJncykgb3ZlcnJpZGUgeworICAgIHJldHVybiBsbHZtOjptYWtlX3VuaXF1ZTxSZXN1bHRNb2RlbFQ+KFBhc3MucnVuKElSLCBBTSwgRXh0cmFBcmdzLi4uKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFRoZSBtb2RlbCBkZWxlZ2F0ZXMgdG8gYSBzdGF0aWMgXGMgUGFzc1Q6Om5hbWUgbWV0aG9kLgorICAvLy8KKyAgLy8vIFRoZSByZXR1cm5lZCBzdHJpbmcgcmVmIG11c3QgcG9pbnQgdG8gY29uc3RhbnQgaW1tdXRhYmxlIGRhdGEhCisgIFN0cmluZ1JlZiBuYW1lKCkgb3ZlcnJpZGUgeyByZXR1cm4gUGFzc1Q6Om5hbWUoKTsgfQorCisgIFBhc3NUIFBhc3M7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgZGV0YWlsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX1BBU1NNQU5BR0VSSU5URVJOQUxfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9QYXR0ZXJuTWF0Y2guaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvUGF0dGVybk1hdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA0Yjg0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvUGF0dGVybk1hdGNoLmgKQEAgLTAsMCArMSwxNzM2IEBACisvLz09PS0gUGF0dGVybk1hdGNoLmggLSBNYXRjaCBvbiB0aGUgTExWTSBJUiAtLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyBhIHNpbXBsZSBhbmQgZWZmaWNpZW50IG1lY2hhbmlzbSBmb3IgcGVyZm9ybWluZyBnZW5lcmFsCisvLyB0cmVlLWJhc2VkIHBhdHRlcm4gbWF0Y2hlcyBvbiB0aGUgTExWTSBJUi4gVGhlIHBvd2VyIG9mIHRoZXNlIHJvdXRpbmVzIGlzCisvLyB0aGF0IGl0IGFsbG93cyB5b3UgdG8gd3JpdGUgY29uY2lzZSBwYXR0ZXJucyB0aGF0IGFyZSBleHByZXNzaXZlIGFuZCBlYXN5IHRvCisvLyB1bmRlcnN0YW5kLiBUaGUgb3RoZXIgbWFqb3IgYWR2YW50YWdlIG9mIHRoaXMgaXMgdGhhdCBpdCBhbGxvd3MgeW91IHRvCisvLyB0cml2aWFsbHkgY2FwdHVyZS9iaW5kIGVsZW1lbnRzIGluIHRoZSBwYXR0ZXJuIHRvIHZhcmlhYmxlcy4gRm9yIGV4YW1wbGUsCisvLyB5b3UgY2FuIGRvIHNvbWV0aGluZyBsaWtlIHRoaXM6CisvLworLy8gIFZhbHVlICpFeHAgPSAuLi4KKy8vICBWYWx1ZSAqWCwgKlk7ICBDb25zdGFudEludCAqQzEsICpDMjsgICAgICAvLyAoWCAmIEMxKSB8IChZICYgQzIpCisvLyAgaWYgKG1hdGNoKEV4cCwgbV9PcihtX0FuZChtX1ZhbHVlKFgpLCBtX0NvbnN0YW50SW50KEMxKSksCisvLyAgICAgICAgICAgICAgICAgICAgICBtX0FuZChtX1ZhbHVlKFkpLCBtX0NvbnN0YW50SW50KEMyKSkpKSkgeworLy8gICAgLi4uIFBhdHRlcm4gaXMgbWF0Y2hlZCBhbmQgdmFyaWFibGVzIGFyZSBib3VuZCAuLi4KKy8vICB9CisvLworLy8gVGhpcyBpcyBwcmltYXJpbHkgdXNlZnVsIHRvIHRoaW5ncyBsaWtlIHRoZSBpbnN0cnVjdGlvbiBjb21iaW5lciwgYnV0IGNhbgorLy8gYWxzbyBiZSB1c2VmdWwgZm9yIHN0YXRpYyBhbmFseXNpcyB0b29scyBvciBjb2RlIGdlbmVyYXRvcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX1BBVFRFUk5NQVRDSF9ICisjZGVmaW5lIExMVk1fSVJfUEFUVEVSTk1BVENIX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FQRmxvYXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEludC5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50LmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudHMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RyVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0ludHJpbnNpY3MuaCIKKyNpbmNsdWRlICJsbHZtL0lSL09wZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIFBhdHRlcm5NYXRjaCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWwsIHR5cGVuYW1lIFBhdHRlcm4+IGJvb2wgbWF0Y2goVmFsICpWLCBjb25zdCBQYXR0ZXJuICZQKSB7CisgIHJldHVybiBjb25zdF9jYXN0PFBhdHRlcm4gJj4oUCkubWF0Y2goVik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTdWJQYXR0ZXJuX3Q+IHN0cnVjdCBPbmVVc2VfbWF0Y2ggeworICBTdWJQYXR0ZXJuX3QgU3ViUGF0dGVybjsKKworICBPbmVVc2VfbWF0Y2goY29uc3QgU3ViUGF0dGVybl90ICZTUCkgOiBTdWJQYXR0ZXJuKFNQKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PiBib29sIG1hdGNoKE9wVHkgKlYpIHsKKyAgICByZXR1cm4gVi0+aGFzT25lVXNlKCkgJiYgU3ViUGF0dGVybi5tYXRjaChWKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGlubGluZSBPbmVVc2VfbWF0Y2g8VD4gbV9PbmVVc2UoY29uc3QgVCAmU3ViUGF0dGVybikgeworICByZXR1cm4gU3ViUGF0dGVybjsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzPiBzdHJ1Y3QgY2xhc3NfbWF0Y2ggeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSVR5PiBib29sIG1hdGNoKElUeSAqVikgeyByZXR1cm4gaXNhPENsYXNzPihWKTsgfQorfTsKKworLy8vIE1hdGNoIGFuIGFyYml0cmFyeSB2YWx1ZSBhbmQgaWdub3JlIGl0LgoraW5saW5lIGNsYXNzX21hdGNoPFZhbHVlPiBtX1ZhbHVlKCkgeyByZXR1cm4gY2xhc3NfbWF0Y2g8VmFsdWU+KCk7IH0KKworLy8vIE1hdGNoIGFuIGFyYml0cmFyeSBiaW5hcnkgb3BlcmF0aW9uIGFuZCBpZ25vcmUgaXQuCitpbmxpbmUgY2xhc3NfbWF0Y2g8QmluYXJ5T3BlcmF0b3I+IG1fQmluT3AoKSB7CisgIHJldHVybiBjbGFzc19tYXRjaDxCaW5hcnlPcGVyYXRvcj4oKTsKK30KKworLy8vIE1hdGNoZXMgYW55IGNvbXBhcmUgaW5zdHJ1Y3Rpb24gYW5kIGlnbm9yZSBpdC4KK2lubGluZSBjbGFzc19tYXRjaDxDbXBJbnN0PiBtX0NtcCgpIHsgcmV0dXJuIGNsYXNzX21hdGNoPENtcEluc3Q+KCk7IH0KKworLy8vIE1hdGNoIGFuIGFyYml0cmFyeSBDb25zdGFudEludCBhbmQgaWdub3JlIGl0LgoraW5saW5lIGNsYXNzX21hdGNoPENvbnN0YW50SW50PiBtX0NvbnN0YW50SW50KCkgeworICByZXR1cm4gY2xhc3NfbWF0Y2g8Q29uc3RhbnRJbnQ+KCk7Cit9CisKKy8vLyBNYXRjaCBhbiBhcmJpdHJhcnkgdW5kZWYgY29uc3RhbnQuCitpbmxpbmUgY2xhc3NfbWF0Y2g8VW5kZWZWYWx1ZT4gbV9VbmRlZigpIHsgcmV0dXJuIGNsYXNzX21hdGNoPFVuZGVmVmFsdWU+KCk7IH0KKworLy8vIE1hdGNoIGFuIGFyYml0cmFyeSBDb25zdGFudCBhbmQgaWdub3JlIGl0LgoraW5saW5lIGNsYXNzX21hdGNoPENvbnN0YW50PiBtX0NvbnN0YW50KCkgeyByZXR1cm4gY2xhc3NfbWF0Y2g8Q29uc3RhbnQ+KCk7IH0KKworLy8vIE1hdGNoaW5nIGNvbWJpbmF0b3JzCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTFR5LCB0eXBlbmFtZSBSVHk+IHN0cnVjdCBtYXRjaF9jb21iaW5lX29yIHsKKyAgTFR5IEw7CisgIFJUeSBSOworCisgIG1hdGNoX2NvbWJpbmVfb3IoY29uc3QgTFR5ICZMZWZ0LCBjb25zdCBSVHkgJlJpZ2h0KSA6IEwoTGVmdCksIFIoUmlnaHQpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElUeT4gYm9vbCBtYXRjaChJVHkgKlYpIHsKKyAgICBpZiAoTC5tYXRjaChWKSkKKyAgICAgIHJldHVybiB0cnVlOworICAgIGlmIChSLm1hdGNoKFYpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTFR5LCB0eXBlbmFtZSBSVHk+IHN0cnVjdCBtYXRjaF9jb21iaW5lX2FuZCB7CisgIExUeSBMOworICBSVHkgUjsKKworICBtYXRjaF9jb21iaW5lX2FuZChjb25zdCBMVHkgJkxlZnQsIGNvbnN0IFJUeSAmUmlnaHQpIDogTChMZWZ0KSwgUihSaWdodCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSVR5PiBib29sIG1hdGNoKElUeSAqVikgeworICAgIGlmIChMLm1hdGNoKFYpKQorICAgICAgaWYgKFIubWF0Y2goVikpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLy8vIENvbWJpbmUgdHdvIHBhdHRlcm4gbWF0Y2hlcnMgbWF0Y2hpbmcgTCB8fCBSCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTFR5LCB0eXBlbmFtZSBSVHk+CitpbmxpbmUgbWF0Y2hfY29tYmluZV9vcjxMVHksIFJUeT4gbV9Db21iaW5lT3IoY29uc3QgTFR5ICZMLCBjb25zdCBSVHkgJlIpIHsKKyAgcmV0dXJuIG1hdGNoX2NvbWJpbmVfb3I8TFR5LCBSVHk+KEwsIFIpOworfQorCisvLy8gQ29tYmluZSB0d28gcGF0dGVybiBtYXRjaGVycyBtYXRjaGluZyBMICYmIFIKK3RlbXBsYXRlIDx0eXBlbmFtZSBMVHksIHR5cGVuYW1lIFJUeT4KK2lubGluZSBtYXRjaF9jb21iaW5lX2FuZDxMVHksIFJUeT4gbV9Db21iaW5lQW5kKGNvbnN0IExUeSAmTCwgY29uc3QgUlR5ICZSKSB7CisgIHJldHVybiBtYXRjaF9jb21iaW5lX2FuZDxMVHksIFJUeT4oTCwgUik7Cit9CisKK3N0cnVjdCBtYXRjaF96ZXJvIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElUeT4gYm9vbCBtYXRjaChJVHkgKlYpIHsKKyAgICBpZiAoY29uc3QgYXV0byAqQyA9IGR5bl9jYXN0PENvbnN0YW50PihWKSkKKyAgICAgIHJldHVybiBDLT5pc051bGxWYWx1ZSgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLy8vIE1hdGNoIGFuIGFyYml0cmFyeSB6ZXJvL251bGwgY29uc3RhbnQuIFRoaXMgaW5jbHVkZXMKKy8vLyB6ZXJvX2luaXRpYWxpemVyIGZvciB2ZWN0b3JzIGFuZCBDb25zdGFudFBvaW50ZXJOdWxsIGZvciBwb2ludGVycy4KK2lubGluZSBtYXRjaF96ZXJvIG1fWmVybygpIHsgcmV0dXJuIG1hdGNoX3plcm8oKTsgfQorCitzdHJ1Y3QgYXBpbnRfbWF0Y2ggeworICBjb25zdCBBUEludCAqJlJlczsKKworICBhcGludF9tYXRjaChjb25zdCBBUEludCAqJlIpIDogUmVzKFIpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElUeT4gYm9vbCBtYXRjaChJVHkgKlYpIHsKKyAgICBpZiAoYXV0byAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVikpIHsKKyAgICAgIFJlcyA9ICZDSS0+Z2V0VmFsdWUoKTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoVi0+Z2V0VHlwZSgpLT5pc1ZlY3RvclR5KCkpCisgICAgICBpZiAoY29uc3QgYXV0byAqQyA9IGR5bl9jYXN0PENvbnN0YW50PihWKSkKKyAgICAgICAgaWYgKGF1dG8gKkNJID0gZHluX2Nhc3Rfb3JfbnVsbDxDb25zdGFudEludD4oQy0+Z2V0U3BsYXRWYWx1ZSgpKSkgeworICAgICAgICAgIFJlcyA9ICZDSS0+Z2V0VmFsdWUoKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKy8vIEVpdGhlciBjb25zdGV4cHIgaWYgb3IgcmVuYW1pbmcgQ29uc3RhbnRGUDo6Z2V0VmFsdWVBUEYgdG8KKy8vIENvbnN0YW50RlA6OmdldFZhbHVlIGlzIG5lZWRlZCB0byBkbyBpdCB2aWEgc2luZ2xlIHRlbXBsYXRlCisvLyBmdW5jdGlvbiBmb3IgYm90aCBhcGludC9hcGZsb2F0Lgorc3RydWN0IGFwZmxvYXRfbWF0Y2ggeworICBjb25zdCBBUEZsb2F0IComUmVzOworICBhcGZsb2F0X21hdGNoKGNvbnN0IEFQRmxvYXQgKiZSKSA6IFJlcyhSKSB7fQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSVR5PiBib29sIG1hdGNoKElUeSAqVikgeworICAgIGlmIChhdXRvICpDSSA9IGR5bl9jYXN0PENvbnN0YW50RlA+KFYpKSB7CisgICAgICBSZXMgPSAmQ0ktPmdldFZhbHVlQVBGKCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKFYtPmdldFR5cGUoKS0+aXNWZWN0b3JUeSgpKQorICAgICAgaWYgKGNvbnN0IGF1dG8gKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpCisgICAgICAgIGlmIChhdXRvICpDSSA9IGR5bl9jYXN0X29yX251bGw8Q29uc3RhbnRGUD4oQy0+Z2V0U3BsYXRWYWx1ZSgpKSkgeworICAgICAgICAgIFJlcyA9ICZDSS0+Z2V0VmFsdWVBUEYoKTsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLy8vIE1hdGNoIGEgQ29uc3RhbnRJbnQgb3Igc3BsYXR0ZWQgQ29uc3RhbnRWZWN0b3IsIGJpbmRpbmcgdGhlCisvLy8gc3BlY2lmaWVkIHBvaW50ZXIgdG8gdGhlIGNvbnRhaW5lZCBBUEludC4KK2lubGluZSBhcGludF9tYXRjaCBtX0FQSW50KGNvbnN0IEFQSW50IComUmVzKSB7IHJldHVybiBSZXM7IH0KKworLy8vIE1hdGNoIGEgQ29uc3RhbnRGUCBvciBzcGxhdHRlZCBDb25zdGFudFZlY3RvciwgYmluZGluZyB0aGUKKy8vLyBzcGVjaWZpZWQgcG9pbnRlciB0byB0aGUgY29udGFpbmVkIEFQRmxvYXQuCitpbmxpbmUgYXBmbG9hdF9tYXRjaCBtX0FQRmxvYXQoY29uc3QgQVBGbG9hdCAqJlJlcykgeyByZXR1cm4gUmVzOyB9CisKK3RlbXBsYXRlIDxpbnQ2NF90IFZhbD4gc3RydWN0IGNvbnN0YW50aW50X21hdGNoIHsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElUeT4gYm9vbCBtYXRjaChJVHkgKlYpIHsKKyAgICBpZiAoY29uc3QgYXV0byAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oVikpIHsKKyAgICAgIGNvbnN0IEFQSW50ICZDSVYgPSBDSS0+Z2V0VmFsdWUoKTsKKyAgICAgIGlmIChWYWwgPj0gMCkKKyAgICAgICAgcmV0dXJuIENJViA9PSBzdGF0aWNfY2FzdDx1aW50NjRfdD4oVmFsKTsKKyAgICAgIC8vIElmIFZhbCBpcyBuZWdhdGl2ZSwgYW5kIENJIGlzIHNob3J0ZXIgdGhhbiBpdCwgdHJ1bmNhdGUgdG8gdGhlIHJpZ2h0CisgICAgICAvLyBudW1iZXIgb2YgYml0cy4gIElmIGl0IGlzIGxhcmdlciwgdGhlbiB3ZSBoYXZlIHRvIHNpZ24gZXh0ZW5kLiAgSnVzdAorICAgICAgLy8gY29tcGFyZSB0aGVpciBuZWdhdGVkIHZhbHVlcy4KKyAgICAgIHJldHVybiAtQ0lWID09IC1WYWw7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLy8vIE1hdGNoIGEgQ29uc3RhbnRJbnQgd2l0aCBhIHNwZWNpZmljIHZhbHVlLgordGVtcGxhdGUgPGludDY0X3QgVmFsPiBpbmxpbmUgY29uc3RhbnRpbnRfbWF0Y2g8VmFsPiBtX0NvbnN0YW50SW50KCkgeworICByZXR1cm4gY29uc3RhbnRpbnRfbWF0Y2g8VmFsPigpOworfQorCisvLy8gVGhpcyBoZWxwZXIgY2xhc3MgaXMgdXNlZCB0byBtYXRjaCBzY2FsYXIgYW5kIHZlY3RvciBpbnRlZ2VyIGNvbnN0YW50cyB0aGF0CisvLy8gc2F0aXNmeSBhIHNwZWNpZmllZCBwcmVkaWNhdGUuCisvLy8gRm9yIHZlY3RvciBjb25zdGFudHMsIHVuZGVmaW5lZCBlbGVtZW50cyBhcmUgaWdub3JlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBQcmVkaWNhdGU+IHN0cnVjdCBjc3RfcHJlZF90eSA6IHB1YmxpYyBQcmVkaWNhdGUgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSVR5PiBib29sIG1hdGNoKElUeSAqVikgeworICAgIGlmIChjb25zdCBhdXRvICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihWKSkKKyAgICAgIHJldHVybiB0aGlzLT5pc1ZhbHVlKENJLT5nZXRWYWx1ZSgpKTsKKyAgICBpZiAoVi0+Z2V0VHlwZSgpLT5pc1ZlY3RvclR5KCkpIHsKKyAgICAgIGlmIChjb25zdCBhdXRvICpDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKSB7CisgICAgICAgIGlmIChjb25zdCBhdXRvICpDSSA9IGR5bl9jYXN0X29yX251bGw8Q29uc3RhbnRJbnQ+KEMtPmdldFNwbGF0VmFsdWUoKSkpCisgICAgICAgICAgcmV0dXJuIHRoaXMtPmlzVmFsdWUoQ0ktPmdldFZhbHVlKCkpOworCisgICAgICAgIC8vIE5vbi1zcGxhdCB2ZWN0b3IgY29uc3RhbnQ6IGNoZWNrIGVhY2ggZWxlbWVudCBmb3IgYSBtYXRjaC4KKyAgICAgICAgdW5zaWduZWQgTnVtRWx0cyA9IFYtPmdldFR5cGUoKS0+Z2V0VmVjdG9yTnVtRWxlbWVudHMoKTsKKyAgICAgICAgYXNzZXJ0KE51bUVsdHMgIT0gMCAmJiAiQ29uc3RhbnQgdmVjdG9yIHdpdGggbm8gZWxlbWVudHM/Iik7CisgICAgICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gTnVtRWx0czsgKytpKSB7CisgICAgICAgICAgQ29uc3RhbnQgKkVsdCA9IEMtPmdldEFnZ3JlZ2F0ZUVsZW1lbnQoaSk7CisgICAgICAgICAgaWYgKCFFbHQpCisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgaWYgKGlzYTxVbmRlZlZhbHVlPihFbHQpKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgYXV0byAqQ0kgPSBkeW5fY2FzdDxDb25zdGFudEludD4oRWx0KTsKKyAgICAgICAgICBpZiAoIUNJIHx8ICF0aGlzLT5pc1ZhbHVlKENJLT5nZXRWYWx1ZSgpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvLy8gVGhpcyBoZWxwZXIgY2xhc3MgaXMgdXNlZCB0byBtYXRjaCBzY2FsYXIgYW5kIHZlY3RvciBjb25zdGFudHMgdGhhdAorLy8vIHNhdGlzZnkgYSBzcGVjaWZpZWQgcHJlZGljYXRlLCBhbmQgYmluZCB0aGVtIHRvIGFuIEFQSW50LgordGVtcGxhdGUgPHR5cGVuYW1lIFByZWRpY2F0ZT4gc3RydWN0IGFwaV9wcmVkX3R5IDogcHVibGljIFByZWRpY2F0ZSB7CisgIGNvbnN0IEFQSW50IComUmVzOworCisgIGFwaV9wcmVkX3R5KGNvbnN0IEFQSW50IComUikgOiBSZXMoUikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSVR5PiBib29sIG1hdGNoKElUeSAqVikgeworICAgIGlmIChjb25zdCBhdXRvICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihWKSkKKyAgICAgIGlmICh0aGlzLT5pc1ZhbHVlKENJLT5nZXRWYWx1ZSgpKSkgeworICAgICAgICBSZXMgPSAmQ0ktPmdldFZhbHVlKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIGlmIChWLT5nZXRUeXBlKCktPmlzVmVjdG9yVHkoKSkKKyAgICAgIGlmIChjb25zdCBhdXRvICpDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKQorICAgICAgICBpZiAoYXV0byAqQ0kgPSBkeW5fY2FzdF9vcl9udWxsPENvbnN0YW50SW50PihDLT5nZXRTcGxhdFZhbHVlKCkpKQorICAgICAgICAgIGlmICh0aGlzLT5pc1ZhbHVlKENJLT5nZXRWYWx1ZSgpKSkgeworICAgICAgICAgICAgUmVzID0gJkNJLT5nZXRWYWx1ZSgpOworICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvLy8gVGhpcyBoZWxwZXIgY2xhc3MgaXMgdXNlZCB0byBtYXRjaCBzY2FsYXIgYW5kIHZlY3RvciBmbG9hdGluZy1wb2ludAorLy8vIGNvbnN0YW50cyB0aGF0IHNhdGlzZnkgYSBzcGVjaWZpZWQgcHJlZGljYXRlLgorLy8vIEZvciB2ZWN0b3IgY29uc3RhbnRzLCB1bmRlZmluZWQgZWxlbWVudHMgYXJlIGlnbm9yZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUHJlZGljYXRlPiBzdHJ1Y3QgY3N0ZnBfcHJlZF90eSA6IHB1YmxpYyBQcmVkaWNhdGUgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSVR5PiBib29sIG1hdGNoKElUeSAqVikgeworICAgIGlmIChjb25zdCBhdXRvICpDRiA9IGR5bl9jYXN0PENvbnN0YW50RlA+KFYpKQorICAgICAgcmV0dXJuIHRoaXMtPmlzVmFsdWUoQ0YtPmdldFZhbHVlQVBGKCkpOworICAgIGlmIChWLT5nZXRUeXBlKCktPmlzVmVjdG9yVHkoKSkgeworICAgICAgaWYgKGNvbnN0IGF1dG8gKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpIHsKKyAgICAgICAgaWYgKGNvbnN0IGF1dG8gKkNGID0gZHluX2Nhc3Rfb3JfbnVsbDxDb25zdGFudEZQPihDLT5nZXRTcGxhdFZhbHVlKCkpKQorICAgICAgICAgIHJldHVybiB0aGlzLT5pc1ZhbHVlKENGLT5nZXRWYWx1ZUFQRigpKTsKKworICAgICAgICAvLyBOb24tc3BsYXQgdmVjdG9yIGNvbnN0YW50OiBjaGVjayBlYWNoIGVsZW1lbnQgZm9yIGEgbWF0Y2guCisgICAgICAgIHVuc2lnbmVkIE51bUVsdHMgPSBWLT5nZXRUeXBlKCktPmdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgICAgICAgIGFzc2VydChOdW1FbHRzICE9IDAgJiYgIkNvbnN0YW50IHZlY3RvciB3aXRoIG5vIGVsZW1lbnRzPyIpOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpICE9IE51bUVsdHM7ICsraSkgeworICAgICAgICAgIENvbnN0YW50ICpFbHQgPSBDLT5nZXRBZ2dyZWdhdGVFbGVtZW50KGkpOworICAgICAgICAgIGlmICghRWx0KQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIGlmIChpc2E8VW5kZWZWYWx1ZT4oRWx0KSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIGF1dG8gKkNGID0gZHluX2Nhc3Q8Q29uc3RhbnRGUD4oRWx0KTsKKyAgICAgICAgICBpZiAoIUNGIHx8ICF0aGlzLT5pc1ZhbHVlKENGLT5nZXRWYWx1ZUFQRigpKSkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gRW5jYXBzdWxhdGUgY29uc3RhbnQgdmFsdWUgcXVlcmllcyBmb3IgdXNlIGluIHRlbXBsYXRlZCBwcmVkaWNhdGUgbWF0Y2hlcnMuCisvLyBUaGlzIGFsbG93cyBjaGVja2luZyBpZiBjb25zdGFudHMgbWF0Y2ggdXNpbmcgY29tcG91bmQgcHJlZGljYXRlcyBhbmQgd29ya3MKKy8vIHdpdGggdmVjdG9yIGNvbnN0YW50cywgcG9zc2libHkgd2l0aCByZWxheGVkIGNvbnN0cmFpbnRzLiBGb3IgZXhhbXBsZSwgaWdub3JlCisvLyB1bmRlZiB2YWx1ZXMuCisvLworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitzdHJ1Y3QgaXNfYWxsX29uZXMgeworICBib29sIGlzVmFsdWUoY29uc3QgQVBJbnQgJkMpIHsgcmV0dXJuIEMuaXNBbGxPbmVzVmFsdWUoKTsgfQorfTsKKy8vLyBNYXRjaCBhbiBpbnRlZ2VyIG9yIHZlY3RvciB3aXRoIGFsbCBiaXRzIHNldC4KKy8vLyBGb3IgdmVjdG9ycywgdGhpcyBpbmNsdWRlcyBjb25zdGFudHMgd2l0aCB1bmRlZmluZWQgZWxlbWVudHMuCitpbmxpbmUgY3N0X3ByZWRfdHk8aXNfYWxsX29uZXM+IG1fQWxsT25lcygpIHsKKyAgcmV0dXJuIGNzdF9wcmVkX3R5PGlzX2FsbF9vbmVzPigpOworfQorCitzdHJ1Y3QgaXNfbWF4c2lnbmVkdmFsdWUgeworICBib29sIGlzVmFsdWUoY29uc3QgQVBJbnQgJkMpIHsgcmV0dXJuIEMuaXNNYXhTaWduZWRWYWx1ZSgpOyB9Cit9OworLy8vIE1hdGNoIGFuIGludGVnZXIgb3IgdmVjdG9yIHdpdGggdmFsdWVzIGhhdmluZyBhbGwgYml0cyBleGNlcHQgZm9yIHRoZSBoaWdoCisvLy8gYml0IHNldCAoMHg3Zi4uLikuCisvLy8gRm9yIHZlY3RvcnMsIHRoaXMgaW5jbHVkZXMgY29uc3RhbnRzIHdpdGggdW5kZWZpbmVkIGVsZW1lbnRzLgoraW5saW5lIGNzdF9wcmVkX3R5PGlzX21heHNpZ25lZHZhbHVlPiBtX01heFNpZ25lZFZhbHVlKCkgeworICByZXR1cm4gY3N0X3ByZWRfdHk8aXNfbWF4c2lnbmVkdmFsdWU+KCk7Cit9CitpbmxpbmUgYXBpX3ByZWRfdHk8aXNfbWF4c2lnbmVkdmFsdWU+IG1fTWF4U2lnbmVkVmFsdWUoY29uc3QgQVBJbnQgKiZWKSB7CisgIHJldHVybiBWOworfQorCitzdHJ1Y3QgaXNfbmVnYXRpdmUgeworICBib29sIGlzVmFsdWUoY29uc3QgQVBJbnQgJkMpIHsgcmV0dXJuIEMuaXNOZWdhdGl2ZSgpOyB9Cit9OworLy8vIE1hdGNoIGFuIGludGVnZXIgb3IgdmVjdG9yIG9mIG5lZ2F0aXZlIHZhbHVlcy4KKy8vLyBGb3IgdmVjdG9ycywgdGhpcyBpbmNsdWRlcyBjb25zdGFudHMgd2l0aCB1bmRlZmluZWQgZWxlbWVudHMuCitpbmxpbmUgY3N0X3ByZWRfdHk8aXNfbmVnYXRpdmU+IG1fTmVnYXRpdmUoKSB7CisgIHJldHVybiBjc3RfcHJlZF90eTxpc19uZWdhdGl2ZT4oKTsKK30KK2lubGluZSBhcGlfcHJlZF90eTxpc19uZWdhdGl2ZT4gbV9OZWdhdGl2ZShjb25zdCBBUEludCAqJlYpIHsKKyAgcmV0dXJuIFY7Cit9CisKK3N0cnVjdCBpc19ub25uZWdhdGl2ZSB7CisgIGJvb2wgaXNWYWx1ZShjb25zdCBBUEludCAmQykgeyByZXR1cm4gQy5pc05vbk5lZ2F0aXZlKCk7IH0KK307CisvLy8gTWF0Y2ggYW4gaW50ZWdlciBvciB2ZWN0b3Igb2Ygbm9ubmVnYXRpdmUgdmFsdWVzLgorLy8vIEZvciB2ZWN0b3JzLCB0aGlzIGluY2x1ZGVzIGNvbnN0YW50cyB3aXRoIHVuZGVmaW5lZCBlbGVtZW50cy4KK2lubGluZSBjc3RfcHJlZF90eTxpc19ub25uZWdhdGl2ZT4gbV9Ob25OZWdhdGl2ZSgpIHsKKyAgcmV0dXJuIGNzdF9wcmVkX3R5PGlzX25vbm5lZ2F0aXZlPigpOworfQoraW5saW5lIGFwaV9wcmVkX3R5PGlzX25vbm5lZ2F0aXZlPiBtX05vbk5lZ2F0aXZlKGNvbnN0IEFQSW50IComVikgeworICByZXR1cm4gVjsKK30KKworc3RydWN0IGlzX29uZSB7CisgIGJvb2wgaXNWYWx1ZShjb25zdCBBUEludCAmQykgeyByZXR1cm4gQy5pc09uZVZhbHVlKCk7IH0KK307CisvLy8gTWF0Y2ggYW4gaW50ZWdlciAxIG9yIGEgdmVjdG9yIHdpdGggYWxsIGVsZW1lbnRzIGVxdWFsIHRvIDEuCisvLy8gRm9yIHZlY3RvcnMsIHRoaXMgaW5jbHVkZXMgY29uc3RhbnRzIHdpdGggdW5kZWZpbmVkIGVsZW1lbnRzLgoraW5saW5lIGNzdF9wcmVkX3R5PGlzX29uZT4gbV9PbmUoKSB7CisgIHJldHVybiBjc3RfcHJlZF90eTxpc19vbmU+KCk7Cit9CisKK3N0cnVjdCBpc19wb3dlcjIgeworICBib29sIGlzVmFsdWUoY29uc3QgQVBJbnQgJkMpIHsgcmV0dXJuIEMuaXNQb3dlck9mMigpOyB9Cit9OworLy8vIE1hdGNoIGFuIGludGVnZXIgb3IgdmVjdG9yIHBvd2VyLW9mLTIuCisvLy8gRm9yIHZlY3RvcnMsIHRoaXMgaW5jbHVkZXMgY29uc3RhbnRzIHdpdGggdW5kZWZpbmVkIGVsZW1lbnRzLgoraW5saW5lIGNzdF9wcmVkX3R5PGlzX3Bvd2VyMj4gbV9Qb3dlcjIoKSB7CisgIHJldHVybiBjc3RfcHJlZF90eTxpc19wb3dlcjI+KCk7Cit9CitpbmxpbmUgYXBpX3ByZWRfdHk8aXNfcG93ZXIyPiBtX1Bvd2VyMihjb25zdCBBUEludCAqJlYpIHsKKyAgcmV0dXJuIFY7Cit9CisKK3N0cnVjdCBpc19wb3dlcjJfb3JfemVybyB7CisgIGJvb2wgaXNWYWx1ZShjb25zdCBBUEludCAmQykgeyByZXR1cm4gIUMgfHwgQy5pc1Bvd2VyT2YyKCk7IH0KK307CisvLy8gTWF0Y2ggYW4gaW50ZWdlciBvciB2ZWN0b3Igb2YgMCBvciBwb3dlci1vZi0yIHZhbHVlcy4KKy8vLyBGb3IgdmVjdG9ycywgdGhpcyBpbmNsdWRlcyBjb25zdGFudHMgd2l0aCB1bmRlZmluZWQgZWxlbWVudHMuCitpbmxpbmUgY3N0X3ByZWRfdHk8aXNfcG93ZXIyX29yX3plcm8+IG1fUG93ZXIyT3JaZXJvKCkgeworICByZXR1cm4gY3N0X3ByZWRfdHk8aXNfcG93ZXIyX29yX3plcm8+KCk7Cit9CitpbmxpbmUgYXBpX3ByZWRfdHk8aXNfcG93ZXIyX29yX3plcm8+IG1fUG93ZXIyT3JaZXJvKGNvbnN0IEFQSW50IComVikgeworICByZXR1cm4gVjsKK30KKworc3RydWN0IGlzX3NpZ25fbWFzayB7CisgIGJvb2wgaXNWYWx1ZShjb25zdCBBUEludCAmQykgeyByZXR1cm4gQy5pc1NpZ25NYXNrKCk7IH0KK307CisvLy8gTWF0Y2ggYW4gaW50ZWdlciBvciB2ZWN0b3Igd2l0aCBvbmx5IHRoZSBzaWduIGJpdChzKSBzZXQuCisvLy8gRm9yIHZlY3RvcnMsIHRoaXMgaW5jbHVkZXMgY29uc3RhbnRzIHdpdGggdW5kZWZpbmVkIGVsZW1lbnRzLgoraW5saW5lIGNzdF9wcmVkX3R5PGlzX3NpZ25fbWFzaz4gbV9TaWduTWFzaygpIHsKKyAgcmV0dXJuIGNzdF9wcmVkX3R5PGlzX3NpZ25fbWFzaz4oKTsKK30KKworc3RydWN0IGlzX25hbiB7CisgIGJvb2wgaXNWYWx1ZShjb25zdCBBUEZsb2F0ICZDKSB7IHJldHVybiBDLmlzTmFOKCk7IH0KK307CisvLy8gTWF0Y2ggYW4gYXJiaXRyYXJ5IE5hTiBjb25zdGFudC4gVGhpcyBpbmNsdWRlcyBxdWlldCBhbmQgc2lnbmFsbGluZyBuYW5zLgorLy8vIEZvciB2ZWN0b3JzLCB0aGlzIGluY2x1ZGVzIGNvbnN0YW50cyB3aXRoIHVuZGVmaW5lZCBlbGVtZW50cy4KK2lubGluZSBjc3RmcF9wcmVkX3R5PGlzX25hbj4gbV9OYU4oKSB7CisgIHJldHVybiBjc3RmcF9wcmVkX3R5PGlzX25hbj4oKTsKK30KKworc3RydWN0IGlzX2FueV96ZXJvX2ZwIHsKKyAgYm9vbCBpc1ZhbHVlKGNvbnN0IEFQRmxvYXQgJkMpIHsgcmV0dXJuIEMuaXNaZXJvKCk7IH0KK307CisvLy8gTWF0Y2ggYSBmbG9hdGluZy1wb2ludCBuZWdhdGl2ZSB6ZXJvIG9yIHBvc2l0aXZlIHplcm8uCisvLy8gRm9yIHZlY3RvcnMsIHRoaXMgaW5jbHVkZXMgY29uc3RhbnRzIHdpdGggdW5kZWZpbmVkIGVsZW1lbnRzLgoraW5saW5lIGNzdGZwX3ByZWRfdHk8aXNfYW55X3plcm9fZnA+IG1fQW55WmVyb0ZQKCkgeworICByZXR1cm4gY3N0ZnBfcHJlZF90eTxpc19hbnlfemVyb19mcD4oKTsKK30KKworc3RydWN0IGlzX3Bvc196ZXJvX2ZwIHsKKyAgYm9vbCBpc1ZhbHVlKGNvbnN0IEFQRmxvYXQgJkMpIHsgcmV0dXJuIEMuaXNQb3NaZXJvKCk7IH0KK307CisvLy8gTWF0Y2ggYSBmbG9hdGluZy1wb2ludCBwb3NpdGl2ZSB6ZXJvLgorLy8vIEZvciB2ZWN0b3JzLCB0aGlzIGluY2x1ZGVzIGNvbnN0YW50cyB3aXRoIHVuZGVmaW5lZCBlbGVtZW50cy4KK2lubGluZSBjc3RmcF9wcmVkX3R5PGlzX3Bvc196ZXJvX2ZwPiBtX1Bvc1plcm9GUCgpIHsKKyAgcmV0dXJuIGNzdGZwX3ByZWRfdHk8aXNfcG9zX3plcm9fZnA+KCk7Cit9CisKK3N0cnVjdCBpc19uZWdfemVyb19mcCB7CisgIGJvb2wgaXNWYWx1ZShjb25zdCBBUEZsb2F0ICZDKSB7IHJldHVybiBDLmlzTmVnWmVybygpOyB9Cit9OworLy8vIE1hdGNoIGEgZmxvYXRpbmctcG9pbnQgbmVnYXRpdmUgemVyby4KKy8vLyBGb3IgdmVjdG9ycywgdGhpcyBpbmNsdWRlcyBjb25zdGFudHMgd2l0aCB1bmRlZmluZWQgZWxlbWVudHMuCitpbmxpbmUgY3N0ZnBfcHJlZF90eTxpc19uZWdfemVyb19mcD4gbV9OZWdaZXJvRlAoKSB7CisgIHJldHVybiBjc3RmcF9wcmVkX3R5PGlzX25lZ196ZXJvX2ZwPigpOworfQorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcz4gc3RydWN0IGJpbmRfdHkgeworICBDbGFzcyAqJlZSOworCisgIGJpbmRfdHkoQ2xhc3MgKiZWKSA6IFZSKFYpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElUeT4gYm9vbCBtYXRjaChJVHkgKlYpIHsKKyAgICBpZiAoYXV0byAqQ1YgPSBkeW5fY2FzdDxDbGFzcz4oVikpIHsKKyAgICAgIFZSID0gQ1Y7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvLy8gTWF0Y2ggYSB2YWx1ZSwgY2FwdHVyaW5nIGl0IGlmIHdlIG1hdGNoLgoraW5saW5lIGJpbmRfdHk8VmFsdWU+IG1fVmFsdWUoVmFsdWUgKiZWKSB7IHJldHVybiBWOyB9CitpbmxpbmUgYmluZF90eTxjb25zdCBWYWx1ZT4gbV9WYWx1ZShjb25zdCBWYWx1ZSAqJlYpIHsgcmV0dXJuIFY7IH0KKworLy8vIE1hdGNoIGFuIGluc3RydWN0aW9uLCBjYXB0dXJpbmcgaXQgaWYgd2UgbWF0Y2guCitpbmxpbmUgYmluZF90eTxJbnN0cnVjdGlvbj4gbV9JbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAqJkkpIHsgcmV0dXJuIEk7IH0KKy8vLyBNYXRjaCBhIGJpbmFyeSBvcGVyYXRvciwgY2FwdHVyaW5nIGl0IGlmIHdlIG1hdGNoLgoraW5saW5lIGJpbmRfdHk8QmluYXJ5T3BlcmF0b3I+IG1fQmluT3AoQmluYXJ5T3BlcmF0b3IgKiZJKSB7IHJldHVybiBJOyB9CisKKy8vLyBNYXRjaCBhIENvbnN0YW50SW50LCBjYXB0dXJpbmcgdGhlIHZhbHVlIGlmIHdlIG1hdGNoLgoraW5saW5lIGJpbmRfdHk8Q29uc3RhbnRJbnQ+IG1fQ29uc3RhbnRJbnQoQ29uc3RhbnRJbnQgKiZDSSkgeyByZXR1cm4gQ0k7IH0KKworLy8vIE1hdGNoIGEgQ29uc3RhbnQsIGNhcHR1cmluZyB0aGUgdmFsdWUgaWYgd2UgbWF0Y2guCitpbmxpbmUgYmluZF90eTxDb25zdGFudD4gbV9Db25zdGFudChDb25zdGFudCAqJkMpIHsgcmV0dXJuIEM7IH0KKworLy8vIE1hdGNoIGEgQ29uc3RhbnRGUCwgY2FwdHVyaW5nIHRoZSB2YWx1ZSBpZiB3ZSBtYXRjaC4KK2lubGluZSBiaW5kX3R5PENvbnN0YW50RlA+IG1fQ29uc3RhbnRGUChDb25zdGFudEZQIComQykgeyByZXR1cm4gQzsgfQorCisvLy8gTWF0Y2ggYSBzcGVjaWZpZWQgVmFsdWUqLgorc3RydWN0IHNwZWNpZmljdmFsX3R5IHsKKyAgY29uc3QgVmFsdWUgKlZhbDsKKworICBzcGVjaWZpY3ZhbF90eShjb25zdCBWYWx1ZSAqVikgOiBWYWwoVikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSVR5PiBib29sIG1hdGNoKElUeSAqVikgeyByZXR1cm4gViA9PSBWYWw7IH0KK307CisKKy8vLyBNYXRjaCBpZiB3ZSBoYXZlIGEgc3BlY2lmaWMgc3BlY2lmaWVkIHZhbHVlLgoraW5saW5lIHNwZWNpZmljdmFsX3R5IG1fU3BlY2lmaWMoY29uc3QgVmFsdWUgKlYpIHsgcmV0dXJuIFY7IH0KKworLy8vIE1hdGNoIGEgc3BlY2lmaWVkIGZsb2F0aW5nIHBvaW50IHZhbHVlIG9yIHZlY3RvciBvZiBhbGwgZWxlbWVudHMgb2YKKy8vLyB0aGF0IHZhbHVlLgorc3RydWN0IHNwZWNpZmljX2ZwdmFsIHsKKyAgZG91YmxlIFZhbDsKKworICBzcGVjaWZpY19mcHZhbChkb3VibGUgVikgOiBWYWwoVikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSVR5PiBib29sIG1hdGNoKElUeSAqVikgeworICAgIGlmIChjb25zdCBhdXRvICpDRlAgPSBkeW5fY2FzdDxDb25zdGFudEZQPihWKSkKKyAgICAgIHJldHVybiBDRlAtPmlzRXhhY3RseVZhbHVlKFZhbCk7CisgICAgaWYgKFYtPmdldFR5cGUoKS0+aXNWZWN0b3JUeSgpKQorICAgICAgaWYgKGNvbnN0IGF1dG8gKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpCisgICAgICAgIGlmIChhdXRvICpDRlAgPSBkeW5fY2FzdF9vcl9udWxsPENvbnN0YW50RlA+KEMtPmdldFNwbGF0VmFsdWUoKSkpCisgICAgICAgICAgcmV0dXJuIENGUC0+aXNFeGFjdGx5VmFsdWUoVmFsKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8vLyBNYXRjaCBhIHNwZWNpZmljIGZsb2F0aW5nIHBvaW50IHZhbHVlIG9yIHZlY3RvciB3aXRoIGFsbCBlbGVtZW50cworLy8vIGVxdWFsIHRvIHRoZSB2YWx1ZS4KK2lubGluZSBzcGVjaWZpY19mcHZhbCBtX1NwZWNpZmljRlAoZG91YmxlIFYpIHsgcmV0dXJuIHNwZWNpZmljX2ZwdmFsKFYpOyB9CisKKy8vLyBNYXRjaCBhIGZsb2F0IDEuMCBvciB2ZWN0b3Igd2l0aCBhbGwgZWxlbWVudHMgZXF1YWwgdG8gMS4wLgoraW5saW5lIHNwZWNpZmljX2ZwdmFsIG1fRlBPbmUoKSB7IHJldHVybiBtX1NwZWNpZmljRlAoMS4wKTsgfQorCitzdHJ1Y3QgYmluZF9jb25zdF9pbnR2YWxfdHkgeworICB1aW50NjRfdCAmVlI7CisKKyAgYmluZF9jb25zdF9pbnR2YWxfdHkodWludDY0X3QgJlYpIDogVlIoVikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSVR5PiBib29sIG1hdGNoKElUeSAqVikgeworICAgIGlmIChjb25zdCBhdXRvICpDViA9IGR5bl9jYXN0PENvbnN0YW50SW50PihWKSkKKyAgICAgIGlmIChDVi0+Z2V0VmFsdWUoKS51bGUoVUlOVDY0X01BWCkpIHsKKyAgICAgICAgVlIgPSBDVi0+Z2V0WkV4dFZhbHVlKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLy8vIE1hdGNoIGEgc3BlY2lmaWVkIGludGVnZXIgdmFsdWUgb3IgdmVjdG9yIG9mIGFsbCBlbGVtZW50cyBvZiB0aGF0CisvLyB2YWx1ZS4KK3N0cnVjdCBzcGVjaWZpY19pbnR2YWwgeworICB1aW50NjRfdCBWYWw7CisKKyAgc3BlY2lmaWNfaW50dmFsKHVpbnQ2NF90IFYpIDogVmFsKFYpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIElUeT4gYm9vbCBtYXRjaChJVHkgKlYpIHsKKyAgICBjb25zdCBhdXRvICpDSSA9IGR5bl9jYXN0PENvbnN0YW50SW50PihWKTsKKyAgICBpZiAoIUNJICYmIFYtPmdldFR5cGUoKS0+aXNWZWN0b3JUeSgpKQorICAgICAgaWYgKGNvbnN0IGF1dG8gKkMgPSBkeW5fY2FzdDxDb25zdGFudD4oVikpCisgICAgICAgIENJID0gZHluX2Nhc3Rfb3JfbnVsbDxDb25zdGFudEludD4oQy0+Z2V0U3BsYXRWYWx1ZSgpKTsKKworICAgIHJldHVybiBDSSAmJiBDSS0+Z2V0VmFsdWUoKSA9PSBWYWw7CisgIH0KK307CisKKy8vLyBNYXRjaCBhIHNwZWNpZmljIGludGVnZXIgdmFsdWUgb3IgdmVjdG9yIHdpdGggYWxsIGVsZW1lbnRzIGVxdWFsIHRvCisvLy8gdGhlIHZhbHVlLgoraW5saW5lIHNwZWNpZmljX2ludHZhbCBtX1NwZWNpZmljSW50KHVpbnQ2NF90IFYpIHsgcmV0dXJuIHNwZWNpZmljX2ludHZhbChWKTsgfQorCisvLy8gTWF0Y2ggYSBDb25zdGFudEludCBhbmQgYmluZCB0byBpdHMgdmFsdWUuICBUaGlzIGRvZXMgbm90IG1hdGNoCisvLy8gQ29uc3RhbnRJbnRzIHdpZGVyIHRoYW4gNjQtYml0cy4KK2lubGluZSBiaW5kX2NvbnN0X2ludHZhbF90eSBtX0NvbnN0YW50SW50KHVpbnQ2NF90ICZWKSB7IHJldHVybiBWOyB9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYXRjaGVyIGZvciBhbnkgYmluYXJ5IG9wZXJhdG9yLgorLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFNfdCwgdHlwZW5hbWUgUkhTX3QsIGJvb2wgQ29tbXV0YWJsZSA9IGZhbHNlPgorc3RydWN0IEFueUJpbmFyeU9wX21hdGNoIHsKKyAgTEhTX3QgTDsKKyAgUkhTX3QgUjsKKworICBBbnlCaW5hcnlPcF9tYXRjaChjb25zdCBMSFNfdCAmTEhTLCBjb25zdCBSSFNfdCAmUkhTKSA6IEwoTEhTKSwgUihSSFMpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+IGJvb2wgbWF0Y2goT3BUeSAqVikgeworICAgIGlmIChhdXRvICpJID0gZHluX2Nhc3Q8QmluYXJ5T3BlcmF0b3I+KFYpKQorICAgICAgcmV0dXJuIChMLm1hdGNoKEktPmdldE9wZXJhbmQoMCkpICYmIFIubWF0Y2goSS0+Z2V0T3BlcmFuZCgxKSkpIHx8CisgICAgICAgICAgICAgKENvbW11dGFibGUgJiYgUi5tYXRjaChJLT5nZXRPcGVyYW5kKDApKSAmJgorICAgICAgICAgICAgICBMLm1hdGNoKEktPmdldE9wZXJhbmQoMSkpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBBbnlCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUz4gbV9CaW5PcChjb25zdCBMSFMgJkwsIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQW55QmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFM+KEwsIFIpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTWF0Y2hlcnMgZm9yIHNwZWNpZmljIGJpbmFyeSBvcGVyYXRvcnMuCisvLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTX3QsIHR5cGVuYW1lIFJIU190LCB1bnNpZ25lZCBPcGNvZGUsCisgICAgICAgICAgYm9vbCBDb21tdXRhYmxlID0gZmFsc2U+CitzdHJ1Y3QgQmluYXJ5T3BfbWF0Y2ggeworICBMSFNfdCBMOworICBSSFNfdCBSOworCisgIEJpbmFyeU9wX21hdGNoKGNvbnN0IExIU190ICZMSFMsIGNvbnN0IFJIU190ICZSSFMpIDogTChMSFMpLCBSKFJIUykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4gYm9vbCBtYXRjaChPcFR5ICpWKSB7CisgICAgaWYgKFYtPmdldFZhbHVlSUQoKSA9PSBWYWx1ZTo6SW5zdHJ1Y3Rpb25WYWwgKyBPcGNvZGUpIHsKKyAgICAgIGF1dG8gKkkgPSBjYXN0PEJpbmFyeU9wZXJhdG9yPihWKTsKKyAgICAgIHJldHVybiAoTC5tYXRjaChJLT5nZXRPcGVyYW5kKDApKSAmJiBSLm1hdGNoKEktPmdldE9wZXJhbmQoMSkpKSB8fAorICAgICAgICAgICAgIChDb21tdXRhYmxlICYmIFIubWF0Y2goSS0+Z2V0T3BlcmFuZCgwKSkgJiYKKyAgICAgICAgICAgICAgTC5tYXRjaChJLT5nZXRPcGVyYW5kKDEpKSk7CisgICAgfQorICAgIGlmIChhdXRvICpDRSA9IGR5bl9jYXN0PENvbnN0YW50RXhwcj4oVikpCisgICAgICByZXR1cm4gQ0UtPmdldE9wY29kZSgpID09IE9wY29kZSAmJgorICAgICAgICAgICAgICgoTC5tYXRjaChDRS0+Z2V0T3BlcmFuZCgwKSkgJiYgUi5tYXRjaChDRS0+Z2V0T3BlcmFuZCgxKSkpIHx8CisgICAgICAgICAgICAgIChDb21tdXRhYmxlICYmIFIubWF0Y2goQ0UtPmdldE9wZXJhbmQoMCkpICYmCisgICAgICAgICAgICAgICBMLm1hdGNoKENFLT5nZXRPcGVyYW5kKDEpKSkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6QWRkPiBtX0FkZChjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpBZGQ+KEwsIFIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpGQWRkPiBtX0ZBZGQoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpGQWRkPihMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6U3ViPiBtX1N1Yihjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpTdWI+KEwsIFIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpGU3ViPiBtX0ZTdWIoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpGU3ViPihMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6TXVsPiBtX011bChjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpNdWw+KEwsIFIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpGTXVsPiBtX0ZNdWwoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpGTXVsPihMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6VURpdj4gbV9VRGl2KGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6VURpdj4oTCwgUik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OlNEaXY+IG1fU0Rpdihjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OlNEaXY+KEwsIFIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpGRGl2PiBtX0ZEaXYoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpGRGl2PihMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6VVJlbT4gbV9VUmVtKGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6VVJlbT4oTCwgUik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OlNSZW0+IG1fU1JlbShjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OlNSZW0+KEwsIFIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpGUmVtPiBtX0ZSZW0oY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpGUmVtPihMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6QW5kPiBtX0FuZChjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpBbmQ+KEwsIFIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpPcj4gbV9Pcihjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6T3I+KEwsIFIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpYb3I+IG1fWG9yKGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246Olhvcj4oTCwgUik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OlNobD4gbV9TaGwoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6U2hsPihMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6TFNocj4gbV9MU2hyKGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6TFNocj4oTCwgUik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OkFTaHI+IG1fQVNocihjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OkFTaHI+KEwsIFIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTX3QsIHR5cGVuYW1lIFJIU190LCB1bnNpZ25lZCBPcGNvZGUsCisgICAgICAgICAgdW5zaWduZWQgV3JhcEZsYWdzID0gMD4KK3N0cnVjdCBPdmVyZmxvd2luZ0JpbmFyeU9wX21hdGNoIHsKKyAgTEhTX3QgTDsKKyAgUkhTX3QgUjsKKworICBPdmVyZmxvd2luZ0JpbmFyeU9wX21hdGNoKGNvbnN0IExIU190ICZMSFMsIGNvbnN0IFJIU190ICZSSFMpCisgICAgICA6IEwoTEhTKSwgUihSSFMpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+IGJvb2wgbWF0Y2goT3BUeSAqVikgeworICAgIGlmIChhdXRvICpPcCA9IGR5bl9jYXN0PE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I+KFYpKSB7CisgICAgICBpZiAoT3AtPmdldE9wY29kZSgpICE9IE9wY29kZSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKFdyYXBGbGFncyAmIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I6Ok5vVW5zaWduZWRXcmFwICYmCisgICAgICAgICAgIU9wLT5oYXNOb1Vuc2lnbmVkV3JhcCgpKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBpZiAoV3JhcEZsYWdzICYgT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvcjo6Tm9TaWduZWRXcmFwICYmCisgICAgICAgICAgIU9wLT5oYXNOb1NpZ25lZFdyYXAoKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgcmV0dXJuIEwubWF0Y2goT3AtPmdldE9wZXJhbmQoMCkpICYmIFIubWF0Y2goT3AtPmdldE9wZXJhbmQoMSkpOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBPdmVyZmxvd2luZ0JpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6QWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvcjo6Tm9TaWduZWRXcmFwPgorbV9OU1dBZGQoY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIE92ZXJmbG93aW5nQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpBZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I6Ok5vU2lnbmVkV3JhcD4oCisgICAgICBMLCBSKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBPdmVyZmxvd2luZ0JpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6U3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvcjo6Tm9TaWduZWRXcmFwPgorbV9OU1dTdWIoY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIE92ZXJmbG93aW5nQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpTdWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I6Ok5vU2lnbmVkV3JhcD4oCisgICAgICBMLCBSKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBPdmVyZmxvd2luZ0JpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6TXVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvcjo6Tm9TaWduZWRXcmFwPgorbV9OU1dNdWwoY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIE92ZXJmbG93aW5nQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpNdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I6Ok5vU2lnbmVkV3JhcD4oCisgICAgICBMLCBSKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBPdmVyZmxvd2luZ0JpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6U2hsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvcjo6Tm9TaWduZWRXcmFwPgorbV9OU1dTaGwoY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIE92ZXJmbG93aW5nQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpTaGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I6Ok5vU2lnbmVkV3JhcD4oCisgICAgICBMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIE92ZXJmbG93aW5nQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpBZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yOjpOb1Vuc2lnbmVkV3JhcD4KK21fTlVXQWRkKGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBPdmVyZmxvd2luZ0JpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6QWRkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yOjpOb1Vuc2lnbmVkV3JhcD4oCisgICAgICBMLCBSKTsKK30KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBPdmVyZmxvd2luZ0JpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6U3ViLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvcjo6Tm9VbnNpZ25lZFdyYXA+CittX05VV1N1Yihjb25zdCBMSFMgJkwsIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gT3ZlcmZsb3dpbmdCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OlN1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3ZlcmZsb3dpbmdCaW5hcnlPcGVyYXRvcjo6Tm9VbnNpZ25lZFdyYXA+KAorICAgICAgTCwgUik7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgT3ZlcmZsb3dpbmdCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246Ok11bCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I6Ok5vVW5zaWduZWRXcmFwPgorbV9OVVdNdWwoY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIE92ZXJmbG93aW5nQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpNdWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE92ZXJmbG93aW5nQmluYXJ5T3BlcmF0b3I6Ok5vVW5zaWduZWRXcmFwPigKKyAgICAgIEwsIFIpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIE92ZXJmbG93aW5nQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpTaGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yOjpOb1Vuc2lnbmVkV3JhcD4KK21fTlVXU2hsKGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBPdmVyZmxvd2luZ0JpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6U2hsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPdmVyZmxvd2luZ0JpbmFyeU9wZXJhdG9yOjpOb1Vuc2lnbmVkV3JhcD4oCisgICAgICBMLCBSKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENsYXNzIHRoYXQgbWF0Y2hlcyBhIGdyb3VwIG9mIGJpbmFyeSBvcGNvZGVzLgorLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFNfdCwgdHlwZW5hbWUgUkhTX3QsIHR5cGVuYW1lIFByZWRpY2F0ZT4KK3N0cnVjdCBCaW5PcFByZWRfbWF0Y2ggOiBQcmVkaWNhdGUgeworICBMSFNfdCBMOworICBSSFNfdCBSOworCisgIEJpbk9wUHJlZF9tYXRjaChjb25zdCBMSFNfdCAmTEhTLCBjb25zdCBSSFNfdCAmUkhTKSA6IEwoTEhTKSwgUihSSFMpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+IGJvb2wgbWF0Y2goT3BUeSAqVikgeworICAgIGlmIChhdXRvICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KFYpKQorICAgICAgcmV0dXJuIHRoaXMtPmlzT3BUeXBlKEktPmdldE9wY29kZSgpKSAmJiBMLm1hdGNoKEktPmdldE9wZXJhbmQoMCkpICYmCisgICAgICAgICAgICAgUi5tYXRjaChJLT5nZXRPcGVyYW5kKDEpKTsKKyAgICBpZiAoYXV0byAqQ0UgPSBkeW5fY2FzdDxDb25zdGFudEV4cHI+KFYpKQorICAgICAgcmV0dXJuIHRoaXMtPmlzT3BUeXBlKENFLT5nZXRPcGNvZGUoKSkgJiYgTC5tYXRjaChDRS0+Z2V0T3BlcmFuZCgwKSkgJiYKKyAgICAgICAgICAgICBSLm1hdGNoKENFLT5nZXRPcGVyYW5kKDEpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3N0cnVjdCBpc19zaGlmdF9vcCB7CisgIGJvb2wgaXNPcFR5cGUodW5zaWduZWQgT3Bjb2RlKSB7IHJldHVybiBJbnN0cnVjdGlvbjo6aXNTaGlmdChPcGNvZGUpOyB9Cit9OworCitzdHJ1Y3QgaXNfcmlnaHRfc2hpZnRfb3AgeworICBib29sIGlzT3BUeXBlKHVuc2lnbmVkIE9wY29kZSkgeworICAgIHJldHVybiBPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246OkxTaHIgfHwgT3Bjb2RlID09IEluc3RydWN0aW9uOjpBU2hyOworICB9Cit9OworCitzdHJ1Y3QgaXNfbG9naWNhbF9zaGlmdF9vcCB7CisgIGJvb2wgaXNPcFR5cGUodW5zaWduZWQgT3Bjb2RlKSB7CisgICAgcmV0dXJuIE9wY29kZSA9PSBJbnN0cnVjdGlvbjo6TFNociB8fCBPcGNvZGUgPT0gSW5zdHJ1Y3Rpb246OlNobDsKKyAgfQorfTsKKworc3RydWN0IGlzX2JpdHdpc2Vsb2dpY19vcCB7CisgIGJvb2wgaXNPcFR5cGUodW5zaWduZWQgT3Bjb2RlKSB7CisgICAgcmV0dXJuIEluc3RydWN0aW9uOjppc0JpdHdpc2VMb2dpY09wKE9wY29kZSk7CisgIH0KK307CisKK3N0cnVjdCBpc19pZGl2X29wIHsKKyAgYm9vbCBpc09wVHlwZSh1bnNpZ25lZCBPcGNvZGUpIHsKKyAgICByZXR1cm4gT3Bjb2RlID09IEluc3RydWN0aW9uOjpTRGl2IHx8IE9wY29kZSA9PSBJbnN0cnVjdGlvbjo6VURpdjsKKyAgfQorfTsKKworLy8vIE1hdGNoZXMgc2hpZnQgb3BlcmF0aW9ucy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5PcFByZWRfbWF0Y2g8TEhTLCBSSFMsIGlzX3NoaWZ0X29wPiBtX1NoaWZ0KGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluT3BQcmVkX21hdGNoPExIUywgUkhTLCBpc19zaGlmdF9vcD4oTCwgUik7Cit9CisKKy8vLyBNYXRjaGVzIGxvZ2ljYWwgc2hpZnQgb3BlcmF0aW9ucy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5PcFByZWRfbWF0Y2g8TEhTLCBSSFMsIGlzX3JpZ2h0X3NoaWZ0X29wPiBtX1Nocihjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5PcFByZWRfbWF0Y2g8TEhTLCBSSFMsIGlzX3JpZ2h0X3NoaWZ0X29wPihMLCBSKTsKK30KKworLy8vIE1hdGNoZXMgbG9naWNhbCBzaGlmdCBvcGVyYXRpb25zLgordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbk9wUHJlZF9tYXRjaDxMSFMsIFJIUywgaXNfbG9naWNhbF9zaGlmdF9vcD4KK21fTG9naWNhbFNoaWZ0KGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5PcFByZWRfbWF0Y2g8TEhTLCBSSFMsIGlzX2xvZ2ljYWxfc2hpZnRfb3A+KEwsIFIpOworfQorCisvLy8gTWF0Y2hlcyBiaXR3aXNlIGxvZ2ljIG9wZXJhdGlvbnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluT3BQcmVkX21hdGNoPExIUywgUkhTLCBpc19iaXR3aXNlbG9naWNfb3A+CittX0JpdHdpc2VMb2dpYyhjb25zdCBMSFMgJkwsIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluT3BQcmVkX21hdGNoPExIUywgUkhTLCBpc19iaXR3aXNlbG9naWNfb3A+KEwsIFIpOworfQorCisvLy8gTWF0Y2hlcyBpbnRlZ2VyIGRpdmlzaW9uIG9wZXJhdGlvbnMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluT3BQcmVkX21hdGNoPExIUywgUkhTLCBpc19pZGl2X29wPiBtX0lEaXYoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluT3BQcmVkX21hdGNoPExIUywgUkhTLCBpc19pZGl2X29wPihMLCBSKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIENsYXNzIHRoYXQgbWF0Y2hlcyBleGFjdCBiaW5hcnkgb3BzLgorLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBTdWJQYXR0ZXJuX3Q+IHN0cnVjdCBFeGFjdF9tYXRjaCB7CisgIFN1YlBhdHRlcm5fdCBTdWJQYXR0ZXJuOworCisgIEV4YWN0X21hdGNoKGNvbnN0IFN1YlBhdHRlcm5fdCAmU1ApIDogU3ViUGF0dGVybihTUCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4gYm9vbCBtYXRjaChPcFR5ICpWKSB7CisgICAgaWYgKGF1dG8gKlBFTyA9IGR5bl9jYXN0PFBvc3NpYmx5RXhhY3RPcGVyYXRvcj4oVikpCisgICAgICByZXR1cm4gUEVPLT5pc0V4YWN0KCkgJiYgU3ViUGF0dGVybi5tYXRjaChWKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBpbmxpbmUgRXhhY3RfbWF0Y2g8VD4gbV9FeGFjdChjb25zdCBUICZTdWJQYXR0ZXJuKSB7CisgIHJldHVybiBTdWJQYXR0ZXJuOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTWF0Y2hlcnMgZm9yIENtcEluc3QgY2xhc3NlcworLy8KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIU190LCB0eXBlbmFtZSBSSFNfdCwgdHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIFByZWRpY2F0ZVR5LAorICAgICAgICAgIGJvb2wgQ29tbXV0YWJsZSA9IGZhbHNlPgorc3RydWN0IENtcENsYXNzX21hdGNoIHsKKyAgUHJlZGljYXRlVHkgJlByZWRpY2F0ZTsKKyAgTEhTX3QgTDsKKyAgUkhTX3QgUjsKKworICBDbXBDbGFzc19tYXRjaChQcmVkaWNhdGVUeSAmUHJlZCwgY29uc3QgTEhTX3QgJkxIUywgY29uc3QgUkhTX3QgJlJIUykKKyAgICAgIDogUHJlZGljYXRlKFByZWQpLCBMKExIUyksIFIoUkhTKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PiBib29sIG1hdGNoKE9wVHkgKlYpIHsKKyAgICBpZiAoYXV0byAqSSA9IGR5bl9jYXN0PENsYXNzPihWKSkKKyAgICAgIGlmICgoTC5tYXRjaChJLT5nZXRPcGVyYW5kKDApKSAmJiBSLm1hdGNoKEktPmdldE9wZXJhbmQoMSkpKSB8fAorICAgICAgICAgIChDb21tdXRhYmxlICYmIFIubWF0Y2goSS0+Z2V0T3BlcmFuZCgwKSkgJiYKKyAgICAgICAgICAgTC5tYXRjaChJLT5nZXRPcGVyYW5kKDEpKSkpIHsKKyAgICAgICAgUHJlZGljYXRlID0gSS0+Z2V0UHJlZGljYXRlKCk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIENtcENsYXNzX21hdGNoPExIUywgUkhTLCBDbXBJbnN0LCBDbXBJbnN0OjpQcmVkaWNhdGU+CittX0NtcChDbXBJbnN0OjpQcmVkaWNhdGUgJlByZWQsIGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBDbXBDbGFzc19tYXRjaDxMSFMsIFJIUywgQ21wSW5zdCwgQ21wSW5zdDo6UHJlZGljYXRlPihQcmVkLCBMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIENtcENsYXNzX21hdGNoPExIUywgUkhTLCBJQ21wSW5zdCwgSUNtcEluc3Q6OlByZWRpY2F0ZT4KK21fSUNtcChJQ21wSW5zdDo6UHJlZGljYXRlICZQcmVkLCBjb25zdCBMSFMgJkwsIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQ21wQ2xhc3NfbWF0Y2g8TEhTLCBSSFMsIElDbXBJbnN0LCBJQ21wSW5zdDo6UHJlZGljYXRlPihQcmVkLCBMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIENtcENsYXNzX21hdGNoPExIUywgUkhTLCBGQ21wSW5zdCwgRkNtcEluc3Q6OlByZWRpY2F0ZT4KK21fRkNtcChGQ21wSW5zdDo6UHJlZGljYXRlICZQcmVkLCBjb25zdCBMSFMgJkwsIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQ21wQ2xhc3NfbWF0Y2g8TEhTLCBSSFMsIEZDbXBJbnN0LCBGQ21wSW5zdDo6UHJlZGljYXRlPihQcmVkLCBMLCBSKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1hdGNoZXJzIGZvciBTZWxlY3RJbnN0IGNsYXNzZXMKKy8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDb25kX3QsIHR5cGVuYW1lIExIU190LCB0eXBlbmFtZSBSSFNfdD4KK3N0cnVjdCBTZWxlY3RDbGFzc19tYXRjaCB7CisgIENvbmRfdCBDOworICBMSFNfdCBMOworICBSSFNfdCBSOworCisgIFNlbGVjdENsYXNzX21hdGNoKGNvbnN0IENvbmRfdCAmQ29uZCwgY29uc3QgTEhTX3QgJkxIUywgY29uc3QgUkhTX3QgJlJIUykKKyAgICAgIDogQyhDb25kKSwgTChMSFMpLCBSKFJIUykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4gYm9vbCBtYXRjaChPcFR5ICpWKSB7CisgICAgaWYgKGF1dG8gKkkgPSBkeW5fY2FzdDxTZWxlY3RJbnN0PihWKSkKKyAgICAgIHJldHVybiBDLm1hdGNoKEktPmdldE9wZXJhbmQoMCkpICYmIEwubWF0Y2goSS0+Z2V0T3BlcmFuZCgxKSkgJiYKKyAgICAgICAgICAgICBSLm1hdGNoKEktPmdldE9wZXJhbmQoMikpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIENvbmQsIHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIFNlbGVjdENsYXNzX21hdGNoPENvbmQsIExIUywgUkhTPiBtX1NlbGVjdChjb25zdCBDb25kICZDLCBjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gU2VsZWN0Q2xhc3NfbWF0Y2g8Q29uZCwgTEhTLCBSSFM+KEMsIEwsIFIpOworfQorCisvLy8gVGhpcyBtYXRjaGVzIGEgc2VsZWN0IG9mIHR3byBjb25zdGFudHMsIGUuZy46CisvLy8gbV9TZWxlY3RDc3Q8LTEsIDA+KG1fVmFsdWUoVikpCit0ZW1wbGF0ZSA8aW50NjRfdCBMLCBpbnQ2NF90IFIsIHR5cGVuYW1lIENvbmQ+CitpbmxpbmUgU2VsZWN0Q2xhc3NfbWF0Y2g8Q29uZCwgY29uc3RhbnRpbnRfbWF0Y2g8TD4sIGNvbnN0YW50aW50X21hdGNoPFI+PgorbV9TZWxlY3RDc3QoY29uc3QgQ29uZCAmQykgeworICByZXR1cm4gbV9TZWxlY3QoQywgbV9Db25zdGFudEludDxMPigpLCBtX0NvbnN0YW50SW50PFI+KCkpOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTWF0Y2hlcnMgZm9yIEluc2VydEVsZW1lbnRJbnN0IGNsYXNzZXMKKy8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWxfdCwgdHlwZW5hbWUgRWx0X3QsIHR5cGVuYW1lIElkeF90Pgorc3RydWN0IEluc2VydEVsZW1lbnRDbGFzc19tYXRjaCB7CisgIFZhbF90IFY7CisgIEVsdF90IEU7CisgIElkeF90IEk7CisKKyAgSW5zZXJ0RWxlbWVudENsYXNzX21hdGNoKGNvbnN0IFZhbF90ICZWYWwsIGNvbnN0IEVsdF90ICZFbHQsIGNvbnN0IElkeF90ICZJZHgpCisgICAgICA6IFYoVmFsKSwgRShFbHQpLCBJKElkeCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4gYm9vbCBtYXRjaChPcFR5ICpWVikgeworICAgIGlmIChhdXRvICpJSSA9IGR5bl9jYXN0PEluc2VydEVsZW1lbnRJbnN0PihWVikpCisgICAgICByZXR1cm4gVi5tYXRjaChJSS0+Z2V0T3BlcmFuZCgwKSkgJiYgRS5tYXRjaChJSS0+Z2V0T3BlcmFuZCgxKSkgJiYKKyAgICAgICAgICAgICBJLm1hdGNoKElJLT5nZXRPcGVyYW5kKDIpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWxfdCwgdHlwZW5hbWUgRWx0X3QsIHR5cGVuYW1lIElkeF90PgoraW5saW5lIEluc2VydEVsZW1lbnRDbGFzc19tYXRjaDxWYWxfdCwgRWx0X3QsIElkeF90PgorbV9JbnNlcnRFbGVtZW50KGNvbnN0IFZhbF90ICZWYWwsIGNvbnN0IEVsdF90ICZFbHQsIGNvbnN0IElkeF90ICZJZHgpIHsKKyAgcmV0dXJuIEluc2VydEVsZW1lbnRDbGFzc19tYXRjaDxWYWxfdCwgRWx0X3QsIElkeF90PihWYWwsIEVsdCwgSWR4KTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1hdGNoZXJzIGZvciBFeHRyYWN0RWxlbWVudEluc3QgY2xhc3NlcworLy8KKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbF90LCB0eXBlbmFtZSBJZHhfdD4gc3RydWN0IEV4dHJhY3RFbGVtZW50Q2xhc3NfbWF0Y2ggeworICBWYWxfdCBWOworICBJZHhfdCBJOworCisgIEV4dHJhY3RFbGVtZW50Q2xhc3NfbWF0Y2goY29uc3QgVmFsX3QgJlZhbCwgY29uc3QgSWR4X3QgJklkeCkKKyAgICAgIDogVihWYWwpLCBJKElkeCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4gYm9vbCBtYXRjaChPcFR5ICpWVikgeworICAgIGlmIChhdXRvICpJSSA9IGR5bl9jYXN0PEV4dHJhY3RFbGVtZW50SW5zdD4oVlYpKQorICAgICAgcmV0dXJuIFYubWF0Y2goSUktPmdldE9wZXJhbmQoMCkpICYmIEkubWF0Y2goSUktPmdldE9wZXJhbmQoMSkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbF90LCB0eXBlbmFtZSBJZHhfdD4KK2lubGluZSBFeHRyYWN0RWxlbWVudENsYXNzX21hdGNoPFZhbF90LCBJZHhfdD4KK21fRXh0cmFjdEVsZW1lbnQoY29uc3QgVmFsX3QgJlZhbCwgY29uc3QgSWR4X3QgJklkeCkgeworICByZXR1cm4gRXh0cmFjdEVsZW1lbnRDbGFzc19tYXRjaDxWYWxfdCwgSWR4X3Q+KFZhbCwgSWR4KTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1hdGNoZXJzIGZvciBTaHVmZmxlVmVjdG9ySW5zdCBjbGFzc2VzCisvLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVjFfdCwgdHlwZW5hbWUgVjJfdCwgdHlwZW5hbWUgTWFza190Pgorc3RydWN0IFNodWZmbGVWZWN0b3JDbGFzc19tYXRjaCB7CisgIFYxX3QgVjE7CisgIFYyX3QgVjI7CisgIE1hc2tfdCBNOworCisgIFNodWZmbGVWZWN0b3JDbGFzc19tYXRjaChjb25zdCBWMV90ICZ2MSwgY29uc3QgVjJfdCAmdjIsIGNvbnN0IE1hc2tfdCAmbSkKKyAgICAgIDogVjEodjEpLCBWMih2MiksIE0obSkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4gYm9vbCBtYXRjaChPcFR5ICpWKSB7CisgICAgaWYgKGF1dG8gKlNJID0gZHluX2Nhc3Q8U2h1ZmZsZVZlY3Rvckluc3Q+KFYpKQorICAgICAgcmV0dXJuIFYxLm1hdGNoKFNJLT5nZXRPcGVyYW5kKDApKSAmJiBWMi5tYXRjaChTSS0+Z2V0T3BlcmFuZCgxKSkgJiYKKyAgICAgICAgICAgICBNLm1hdGNoKFNJLT5nZXRPcGVyYW5kKDIpKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWMV90LCB0eXBlbmFtZSBWMl90LCB0eXBlbmFtZSBNYXNrX3Q+CitpbmxpbmUgU2h1ZmZsZVZlY3RvckNsYXNzX21hdGNoPFYxX3QsIFYyX3QsIE1hc2tfdD4KK21fU2h1ZmZsZVZlY3Rvcihjb25zdCBWMV90ICZ2MSwgY29uc3QgVjJfdCAmdjIsIGNvbnN0IE1hc2tfdCAmbSkgeworICByZXR1cm4gU2h1ZmZsZVZlY3RvckNsYXNzX21hdGNoPFYxX3QsIFYyX3QsIE1hc2tfdD4odjEsIHYyLCBtKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1hdGNoZXJzIGZvciBDYXN0SW5zdCBjbGFzc2VzCisvLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BfdCwgdW5zaWduZWQgT3Bjb2RlPiBzdHJ1Y3QgQ2FzdENsYXNzX21hdGNoIHsKKyAgT3BfdCBPcDsKKworICBDYXN0Q2xhc3NfbWF0Y2goY29uc3QgT3BfdCAmT3BNYXRjaCkgOiBPcChPcE1hdGNoKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PiBib29sIG1hdGNoKE9wVHkgKlYpIHsKKyAgICBpZiAoYXV0byAqTyA9IGR5bl9jYXN0PE9wZXJhdG9yPihWKSkKKyAgICAgIHJldHVybiBPLT5nZXRPcGNvZGUoKSA9PSBPcGNvZGUgJiYgT3AubWF0Y2goTy0+Z2V0T3BlcmFuZCgwKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvLy8gTWF0Y2hlcyBCaXRDYXN0LgordGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+CitpbmxpbmUgQ2FzdENsYXNzX21hdGNoPE9wVHksIEluc3RydWN0aW9uOjpCaXRDYXN0PiBtX0JpdENhc3QoY29uc3QgT3BUeSAmT3ApIHsKKyAgcmV0dXJuIENhc3RDbGFzc19tYXRjaDxPcFR5LCBJbnN0cnVjdGlvbjo6Qml0Q2FzdD4oT3ApOworfQorCisvLy8gTWF0Y2hlcyBQdHJUb0ludC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PgoraW5saW5lIENhc3RDbGFzc19tYXRjaDxPcFR5LCBJbnN0cnVjdGlvbjo6UHRyVG9JbnQ+IG1fUHRyVG9JbnQoY29uc3QgT3BUeSAmT3ApIHsKKyAgcmV0dXJuIENhc3RDbGFzc19tYXRjaDxPcFR5LCBJbnN0cnVjdGlvbjo6UHRyVG9JbnQ+KE9wKTsKK30KKworLy8vIE1hdGNoZXMgVHJ1bmMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4KK2lubGluZSBDYXN0Q2xhc3NfbWF0Y2g8T3BUeSwgSW5zdHJ1Y3Rpb246OlRydW5jPiBtX1RydW5jKGNvbnN0IE9wVHkgJk9wKSB7CisgIHJldHVybiBDYXN0Q2xhc3NfbWF0Y2g8T3BUeSwgSW5zdHJ1Y3Rpb246OlRydW5jPihPcCk7Cit9CisKKy8vLyBNYXRjaGVzIFNFeHQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4KK2lubGluZSBDYXN0Q2xhc3NfbWF0Y2g8T3BUeSwgSW5zdHJ1Y3Rpb246OlNFeHQ+IG1fU0V4dChjb25zdCBPcFR5ICZPcCkgeworICByZXR1cm4gQ2FzdENsYXNzX21hdGNoPE9wVHksIEluc3RydWN0aW9uOjpTRXh0PihPcCk7Cit9CisKKy8vLyBNYXRjaGVzIFpFeHQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4KK2lubGluZSBDYXN0Q2xhc3NfbWF0Y2g8T3BUeSwgSW5zdHJ1Y3Rpb246OlpFeHQ+IG1fWkV4dChjb25zdCBPcFR5ICZPcCkgeworICByZXR1cm4gQ2FzdENsYXNzX21hdGNoPE9wVHksIEluc3RydWN0aW9uOjpaRXh0PihPcCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PgoraW5saW5lIG1hdGNoX2NvbWJpbmVfb3I8Q2FzdENsYXNzX21hdGNoPE9wVHksIEluc3RydWN0aW9uOjpaRXh0PiwKKyAgICAgICAgICAgICAgICAgICAgICAgIENhc3RDbGFzc19tYXRjaDxPcFR5LCBJbnN0cnVjdGlvbjo6U0V4dD4+CittX1pFeHRPclNFeHQoY29uc3QgT3BUeSAmT3ApIHsKKyAgcmV0dXJuIG1fQ29tYmluZU9yKG1fWkV4dChPcCksIG1fU0V4dChPcCkpOworfQorCisvLy8gTWF0Y2hlcyBVSVRvRlAuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4KK2lubGluZSBDYXN0Q2xhc3NfbWF0Y2g8T3BUeSwgSW5zdHJ1Y3Rpb246OlVJVG9GUD4gbV9VSVRvRlAoY29uc3QgT3BUeSAmT3ApIHsKKyAgcmV0dXJuIENhc3RDbGFzc19tYXRjaDxPcFR5LCBJbnN0cnVjdGlvbjo6VUlUb0ZQPihPcCk7Cit9CisKKy8vLyBNYXRjaGVzIFNJVG9GUC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PgoraW5saW5lIENhc3RDbGFzc19tYXRjaDxPcFR5LCBJbnN0cnVjdGlvbjo6U0lUb0ZQPiBtX1NJVG9GUChjb25zdCBPcFR5ICZPcCkgeworICByZXR1cm4gQ2FzdENsYXNzX21hdGNoPE9wVHksIEluc3RydWN0aW9uOjpTSVRvRlA+KE9wKTsKK30KKworLy8vIE1hdGNoZXMgRlBUcnVuYwordGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+CitpbmxpbmUgQ2FzdENsYXNzX21hdGNoPE9wVHksIEluc3RydWN0aW9uOjpGUFRydW5jPiBtX0ZQVHJ1bmMoY29uc3QgT3BUeSAmT3ApIHsKKyAgcmV0dXJuIENhc3RDbGFzc19tYXRjaDxPcFR5LCBJbnN0cnVjdGlvbjo6RlBUcnVuYz4oT3ApOworfQorCisvLy8gTWF0Y2hlcyBGUEV4dAordGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+CitpbmxpbmUgQ2FzdENsYXNzX21hdGNoPE9wVHksIEluc3RydWN0aW9uOjpGUEV4dD4gbV9GUEV4dChjb25zdCBPcFR5ICZPcCkgeworICByZXR1cm4gQ2FzdENsYXNzX21hdGNoPE9wVHksIEluc3RydWN0aW9uOjpGUEV4dD4oT3ApOworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTWF0Y2hlciBmb3IgTG9hZEluc3QgY2xhc3NlcworLy8KKwordGVtcGxhdGUgPHR5cGVuYW1lIE9wX3Q+IHN0cnVjdCBMb2FkQ2xhc3NfbWF0Y2ggeworICBPcF90IE9wOworCisgIExvYWRDbGFzc19tYXRjaChjb25zdCBPcF90ICZPcE1hdGNoKSA6IE9wKE9wTWF0Y2gpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+IGJvb2wgbWF0Y2goT3BUeSAqVikgeworICAgIGlmIChhdXRvICpMSSA9IGR5bl9jYXN0PExvYWRJbnN0PihWKSkKKyAgICAgIHJldHVybiBPcC5tYXRjaChMSS0+Z2V0UG9pbnRlck9wZXJhbmQoKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvLy8gTWF0Y2hlcyBMb2FkSW5zdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PiBpbmxpbmUgTG9hZENsYXNzX21hdGNoPE9wVHk+IG1fTG9hZChjb25zdCBPcFR5ICZPcCkgeworICByZXR1cm4gTG9hZENsYXNzX21hdGNoPE9wVHk+KE9wKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1hdGNoZXJzIGZvciB1bmFyeSBvcGVyYXRvcnMKKy8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFNfdD4gc3RydWN0IG5lZ19tYXRjaCB7CisgIExIU190IEw7CisKKyAgbmVnX21hdGNoKGNvbnN0IExIU190ICZMSFMpIDogTChMSFMpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+IGJvb2wgbWF0Y2goT3BUeSAqVikgeworICAgIGlmIChhdXRvICpPID0gZHluX2Nhc3Q8T3BlcmF0b3I+KFYpKQorICAgICAgaWYgKE8tPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpTdWIpCisgICAgICAgIHJldHVybiBtYXRjaElmTmVnKE8tPmdldE9wZXJhbmQoMCksIE8tPmdldE9wZXJhbmQoMSkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCitwcml2YXRlOgorICBib29sIG1hdGNoSWZOZWcoVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIHJldHVybiAoKGlzYTxDb25zdGFudEludD4oTEhTKSAmJiBjYXN0PENvbnN0YW50SW50PihMSFMpLT5pc1plcm8oKSkgfHwKKyAgICAgICAgICAgIGlzYTxDb25zdGFudEFnZ3JlZ2F0ZVplcm8+KExIUykpICYmCisgICAgICAgICAgIEwubWF0Y2goUkhTKTsKKyAgfQorfTsKKworLy8vIE1hdGNoIGFuIGludGVnZXIgbmVnYXRlLgordGVtcGxhdGUgPHR5cGVuYW1lIExIUz4gaW5saW5lIG5lZ19tYXRjaDxMSFM+IG1fTmVnKGNvbnN0IExIUyAmTCkgeyByZXR1cm4gTDsgfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTX3Q+IHN0cnVjdCBmbmVnX21hdGNoIHsKKyAgTEhTX3QgTDsKKworICBmbmVnX21hdGNoKGNvbnN0IExIU190ICZMSFMpIDogTChMSFMpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+IGJvb2wgbWF0Y2goT3BUeSAqVikgeworICAgIGlmIChhdXRvICpPID0gZHluX2Nhc3Q8T3BlcmF0b3I+KFYpKQorICAgICAgaWYgKE8tPmdldE9wY29kZSgpID09IEluc3RydWN0aW9uOjpGU3ViKQorICAgICAgICByZXR1cm4gbWF0Y2hJZkZOZWcoTy0+Z2V0T3BlcmFuZCgwKSwgTy0+Z2V0T3BlcmFuZCgxKSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKK3ByaXZhdGU6CisgIGJvb2wgbWF0Y2hJZkZOZWcoVmFsdWUgKkxIUywgVmFsdWUgKlJIUykgeworICAgIGlmIChjb25zdCBhdXRvICpDID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KExIUykpCisgICAgICByZXR1cm4gQy0+aXNOZWdhdGl2ZVplcm9WYWx1ZSgpICYmIEwubWF0Y2goUkhTKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8vLyBNYXRjaCBhIGZsb2F0aW5nIHBvaW50IG5lZ2F0ZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFM+IGlubGluZSBmbmVnX21hdGNoPExIUz4gbV9GTmVnKGNvbnN0IExIUyAmTCkgeworICByZXR1cm4gTDsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1hdGNoZXJzIGZvciBjb250cm9sIGZsb3cuCisvLworCitzdHJ1Y3QgYnJfbWF0Y2ggeworICBCYXNpY0Jsb2NrIComU3VjYzsKKworICBicl9tYXRjaChCYXNpY0Jsb2NrIComU3VjYykgOiBTdWNjKFN1Y2MpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+IGJvb2wgbWF0Y2goT3BUeSAqVikgeworICAgIGlmIChhdXRvICpCSSA9IGR5bl9jYXN0PEJyYW5jaEluc3Q+KFYpKQorICAgICAgaWYgKEJJLT5pc1VuY29uZGl0aW9uYWwoKSkgeworICAgICAgICBTdWNjID0gQkktPmdldFN1Y2Nlc3NvcigwKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCitpbmxpbmUgYnJfbWF0Y2ggbV9VbmNvbmRpdGlvbmFsQnIoQmFzaWNCbG9jayAqJlN1Y2MpIHsgcmV0dXJuIGJyX21hdGNoKFN1Y2MpOyB9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDb25kX3Q+IHN0cnVjdCBicmNfbWF0Y2ggeworICBDb25kX3QgQ29uZDsKKyAgQmFzaWNCbG9jayAqJlQsIComRjsKKworICBicmNfbWF0Y2goY29uc3QgQ29uZF90ICZDLCBCYXNpY0Jsb2NrIComdCwgQmFzaWNCbG9jayAqJmYpCisgICAgICA6IENvbmQoQyksIFQodCksIEYoZikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4gYm9vbCBtYXRjaChPcFR5ICpWKSB7CisgICAgaWYgKGF1dG8gKkJJID0gZHluX2Nhc3Q8QnJhbmNoSW5zdD4oVikpCisgICAgICBpZiAoQkktPmlzQ29uZGl0aW9uYWwoKSAmJiBDb25kLm1hdGNoKEJJLT5nZXRDb25kaXRpb24oKSkpIHsKKyAgICAgICAgVCA9IEJJLT5nZXRTdWNjZXNzb3IoMCk7CisgICAgICAgIEYgPSBCSS0+Z2V0U3VjY2Vzc29yKDEpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDb25kX3Q+CitpbmxpbmUgYnJjX21hdGNoPENvbmRfdD4gbV9Ccihjb25zdCBDb25kX3QgJkMsIEJhc2ljQmxvY2sgKiZULCBCYXNpY0Jsb2NrIComRikgeworICByZXR1cm4gYnJjX21hdGNoPENvbmRfdD4oQywgVCwgRik7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYXRjaGVycyBmb3IgbWF4L21pbiBpZGlvbXMsIGVnOiAic2VsZWN0IChzZ3QgeCwgeSksIHgsIHkiIC0+IHNtYXgoeCx5KS4KKy8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDbXBJbnN0X3QsIHR5cGVuYW1lIExIU190LCB0eXBlbmFtZSBSSFNfdCwgdHlwZW5hbWUgUHJlZF90LAorICAgICAgICAgIGJvb2wgQ29tbXV0YWJsZSA9IGZhbHNlPgorc3RydWN0IE1heE1pbl9tYXRjaCB7CisgIExIU190IEw7CisgIFJIU190IFI7CisKKyAgTWF4TWluX21hdGNoKGNvbnN0IExIU190ICZMSFMsIGNvbnN0IFJIU190ICZSSFMpIDogTChMSFMpLCBSKFJIUykge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4gYm9vbCBtYXRjaChPcFR5ICpWKSB7CisgICAgLy8gTG9vayBmb3IgIih4IHByZWQgeSkgPyB4IDogeSIgb3IgIih4IHByZWQgeSkgPyB5IDogeCIuCisgICAgYXV0byAqU0kgPSBkeW5fY2FzdDxTZWxlY3RJbnN0PihWKTsKKyAgICBpZiAoIVNJKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGF1dG8gKkNtcCA9IGR5bl9jYXN0PENtcEluc3RfdD4oU0ktPmdldENvbmRpdGlvbigpKTsKKyAgICBpZiAoIUNtcCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBBdCB0aGlzIHBvaW50IHdlIGhhdmUgYSBzZWxlY3QgY29uZGl0aW9uZWQgb24gYSBjb21wYXJpc29uLiAgQ2hlY2sgdGhhdAorICAgIC8vIGl0IGlzIHRoZSB2YWx1ZXMgcmV0dXJuZWQgYnkgdGhlIHNlbGVjdCB0aGF0IGFyZSBiZWluZyBjb21wYXJlZC4KKyAgICBWYWx1ZSAqVHJ1ZVZhbCA9IFNJLT5nZXRUcnVlVmFsdWUoKTsKKyAgICBWYWx1ZSAqRmFsc2VWYWwgPSBTSS0+Z2V0RmFsc2VWYWx1ZSgpOworICAgIFZhbHVlICpMSFMgPSBDbXAtPmdldE9wZXJhbmQoMCk7CisgICAgVmFsdWUgKlJIUyA9IENtcC0+Z2V0T3BlcmFuZCgxKTsKKyAgICBpZiAoKFRydWVWYWwgIT0gTEhTIHx8IEZhbHNlVmFsICE9IFJIUykgJiYKKyAgICAgICAgKFRydWVWYWwgIT0gUkhTIHx8IEZhbHNlVmFsICE9IExIUykpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgdHlwZW5hbWUgQ21wSW5zdF90OjpQcmVkaWNhdGUgUHJlZCA9CisgICAgICAgIExIUyA9PSBUcnVlVmFsID8gQ21wLT5nZXRQcmVkaWNhdGUoKSA6IENtcC0+Z2V0SW52ZXJzZVByZWRpY2F0ZSgpOworICAgIC8vIERvZXMgIih4IHByZWQgeSkgPyB4IDogeSIgcmVwcmVzZW50IHRoZSBkZXNpcmVkIG1heC9taW4gb3BlcmF0aW9uPworICAgIGlmICghUHJlZF90OjptYXRjaChQcmVkKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBJdCBkb2VzISAgQmluZCB0aGUgb3BlcmFuZHMuCisgICAgcmV0dXJuIChMLm1hdGNoKExIUykgJiYgUi5tYXRjaChSSFMpKSB8fAorICAgICAgICAgICAoQ29tbXV0YWJsZSAmJiBSLm1hdGNoKExIUykgJiYgTC5tYXRjaChSSFMpKTsKKyAgfQorfTsKKworLy8vIEhlbHBlciBjbGFzcyBmb3IgaWRlbnRpZnlpbmcgc2lnbmVkIG1heCBwcmVkaWNhdGVzLgorc3RydWN0IHNtYXhfcHJlZF90eSB7CisgIHN0YXRpYyBib29sIG1hdGNoKElDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCkgeworICAgIHJldHVybiBQcmVkID09IENtcEluc3Q6OklDTVBfU0dUIHx8IFByZWQgPT0gQ21wSW5zdDo6SUNNUF9TR0U7CisgIH0KK307CisKKy8vLyBIZWxwZXIgY2xhc3MgZm9yIGlkZW50aWZ5aW5nIHNpZ25lZCBtaW4gcHJlZGljYXRlcy4KK3N0cnVjdCBzbWluX3ByZWRfdHkgeworICBzdGF0aWMgYm9vbCBtYXRjaChJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQpIHsKKyAgICByZXR1cm4gUHJlZCA9PSBDbXBJbnN0OjpJQ01QX1NMVCB8fCBQcmVkID09IENtcEluc3Q6OklDTVBfU0xFOworICB9Cit9OworCisvLy8gSGVscGVyIGNsYXNzIGZvciBpZGVudGlmeWluZyB1bnNpZ25lZCBtYXggcHJlZGljYXRlcy4KK3N0cnVjdCB1bWF4X3ByZWRfdHkgeworICBzdGF0aWMgYm9vbCBtYXRjaChJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQpIHsKKyAgICByZXR1cm4gUHJlZCA9PSBDbXBJbnN0OjpJQ01QX1VHVCB8fCBQcmVkID09IENtcEluc3Q6OklDTVBfVUdFOworICB9Cit9OworCisvLy8gSGVscGVyIGNsYXNzIGZvciBpZGVudGlmeWluZyB1bnNpZ25lZCBtaW4gcHJlZGljYXRlcy4KK3N0cnVjdCB1bWluX3ByZWRfdHkgeworICBzdGF0aWMgYm9vbCBtYXRjaChJQ21wSW5zdDo6UHJlZGljYXRlIFByZWQpIHsKKyAgICByZXR1cm4gUHJlZCA9PSBDbXBJbnN0OjpJQ01QX1VMVCB8fCBQcmVkID09IENtcEluc3Q6OklDTVBfVUxFOworICB9Cit9OworCisvLy8gSGVscGVyIGNsYXNzIGZvciBpZGVudGlmeWluZyBvcmRlcmVkIG1heCBwcmVkaWNhdGVzLgorc3RydWN0IG9mbWF4X3ByZWRfdHkgeworICBzdGF0aWMgYm9vbCBtYXRjaChGQ21wSW5zdDo6UHJlZGljYXRlIFByZWQpIHsKKyAgICByZXR1cm4gUHJlZCA9PSBDbXBJbnN0OjpGQ01QX09HVCB8fCBQcmVkID09IENtcEluc3Q6OkZDTVBfT0dFOworICB9Cit9OworCisvLy8gSGVscGVyIGNsYXNzIGZvciBpZGVudGlmeWluZyBvcmRlcmVkIG1pbiBwcmVkaWNhdGVzLgorc3RydWN0IG9mbWluX3ByZWRfdHkgeworICBzdGF0aWMgYm9vbCBtYXRjaChGQ21wSW5zdDo6UHJlZGljYXRlIFByZWQpIHsKKyAgICByZXR1cm4gUHJlZCA9PSBDbXBJbnN0OjpGQ01QX09MVCB8fCBQcmVkID09IENtcEluc3Q6OkZDTVBfT0xFOworICB9Cit9OworCisvLy8gSGVscGVyIGNsYXNzIGZvciBpZGVudGlmeWluZyB1bm9yZGVyZWQgbWF4IHByZWRpY2F0ZXMuCitzdHJ1Y3QgdWZtYXhfcHJlZF90eSB7CisgIHN0YXRpYyBib29sIG1hdGNoKEZDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZCkgeworICAgIHJldHVybiBQcmVkID09IENtcEluc3Q6OkZDTVBfVUdUIHx8IFByZWQgPT0gQ21wSW5zdDo6RkNNUF9VR0U7CisgIH0KK307CisKKy8vLyBIZWxwZXIgY2xhc3MgZm9yIGlkZW50aWZ5aW5nIHVub3JkZXJlZCBtaW4gcHJlZGljYXRlcy4KK3N0cnVjdCB1Zm1pbl9wcmVkX3R5IHsKKyAgc3RhdGljIGJvb2wgbWF0Y2goRkNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkKSB7CisgICAgcmV0dXJuIFByZWQgPT0gQ21wSW5zdDo6RkNNUF9VTFQgfHwgUHJlZCA9PSBDbXBJbnN0OjpGQ01QX1VMRTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIE1heE1pbl9tYXRjaDxJQ21wSW5zdCwgTEhTLCBSSFMsIHNtYXhfcHJlZF90eT4gbV9TTWF4KGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIE1heE1pbl9tYXRjaDxJQ21wSW5zdCwgTEhTLCBSSFMsIHNtYXhfcHJlZF90eT4oTCwgUik7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBNYXhNaW5fbWF0Y2g8SUNtcEluc3QsIExIUywgUkhTLCBzbWluX3ByZWRfdHk+IG1fU01pbihjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBNYXhNaW5fbWF0Y2g8SUNtcEluc3QsIExIUywgUkhTLCBzbWluX3ByZWRfdHk+KEwsIFIpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgTWF4TWluX21hdGNoPElDbXBJbnN0LCBMSFMsIFJIUywgdW1heF9wcmVkX3R5PiBtX1VNYXgoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gTWF4TWluX21hdGNoPElDbXBJbnN0LCBMSFMsIFJIUywgdW1heF9wcmVkX3R5PihMLCBSKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIE1heE1pbl9tYXRjaDxJQ21wSW5zdCwgTEhTLCBSSFMsIHVtaW5fcHJlZF90eT4gbV9VTWluKGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIE1heE1pbl9tYXRjaDxJQ21wSW5zdCwgTEhTLCBSSFMsIHVtaW5fcHJlZF90eT4oTCwgUik7Cit9CisKKy8vLyBNYXRjaCBhbiAnb3JkZXJlZCcgZmxvYXRpbmcgcG9pbnQgbWF4aW11bSBmdW5jdGlvbi4KKy8vLyBGbG9hdGluZyBwb2ludCBoYXMgb25lIHNwZWNpYWwgdmFsdWUgJ05hTicuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gdG90YWwKKy8vLyBvcmRlci4gSG93ZXZlciwgaWYgd2UgY2FuIGlnbm9yZSB0aGUgJ05hTicgdmFsdWUgKGZvciBleGFtcGxlLCBiZWNhdXNlIG9mIGEKKy8vLyAnbm8tbmFucy1mbG9hdC1tYXRoJyBmbGFnKSBhIGNvbWJpbmF0aW9uIG9mIGEgZmNtcCBhbmQgc2VsZWN0IGhhcyAnbWF4aW11bScKKy8vLyBzZW1hbnRpY3MuIEluIHRoZSBwcmVzZW5jZSBvZiAnTmFOJyB3ZSBoYXZlIHRvIHByZXNlcnZlIHRoZSBvcmlnaW5hbAorLy8vIHNlbGVjdChmY21wKG9ndC9nZSwgTCwgUiksIEwsIFIpIHNlbWFudGljcyBtYXRjaGVkIGJ5IHRoaXMgcHJlZGljYXRlLgorLy8vCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4KEwsIFIpICBpZmYgTCBhbmQgUiBhcmUgbm90IE5hTgorLy8vICBtX09yZEZNYXgoTCwgUikgPSAgICAgIFIgICAgICAgICAgaWZmIEwgb3IgUiBhcmUgTmFOCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgTWF4TWluX21hdGNoPEZDbXBJbnN0LCBMSFMsIFJIUywgb2ZtYXhfcHJlZF90eT4gbV9PcmRGTWF4KGNvbnN0IExIUyAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBNYXhNaW5fbWF0Y2g8RkNtcEluc3QsIExIUywgUkhTLCBvZm1heF9wcmVkX3R5PihMLCBSKTsKK30KKworLy8vIE1hdGNoIGFuICdvcmRlcmVkJyBmbG9hdGluZyBwb2ludCBtaW5pbXVtIGZ1bmN0aW9uLgorLy8vIEZsb2F0aW5nIHBvaW50IGhhcyBvbmUgc3BlY2lhbCB2YWx1ZSAnTmFOJy4gVGhlcmVmb3JlLCB0aGVyZSBpcyBubyB0b3RhbAorLy8vIG9yZGVyLiBIb3dldmVyLCBpZiB3ZSBjYW4gaWdub3JlIHRoZSAnTmFOJyB2YWx1ZSAoZm9yIGV4YW1wbGUsIGJlY2F1c2Ugb2YgYQorLy8vICduby1uYW5zLWZsb2F0LW1hdGgnIGZsYWcpIGEgY29tYmluYXRpb24gb2YgYSBmY21wIGFuZCBzZWxlY3QgaGFzICdtaW5pbXVtJworLy8vIHNlbWFudGljcy4gSW4gdGhlIHByZXNlbmNlIG9mICdOYU4nIHdlIGhhdmUgdG8gcHJlc2VydmUgdGhlIG9yaWdpbmFsCisvLy8gc2VsZWN0KGZjbXAob2x0L2xlLCBMLCBSKSwgTCwgUikgc2VtYW50aWNzIG1hdGNoZWQgYnkgdGhpcyBwcmVkaWNhdGUuCisvLy8KKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oTCwgUikgIGlmZiBMIGFuZCBSIGFyZSBub3QgTmFOCisvLy8gIG1fT3JkRk1pbihMLCBSKSA9ICAgICAgUiAgICAgICAgICBpZmYgTCBvciBSIGFyZSBOYU4KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBNYXhNaW5fbWF0Y2g8RkNtcEluc3QsIExIUywgUkhTLCBvZm1pbl9wcmVkX3R5PiBtX09yZEZNaW4oY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIE1heE1pbl9tYXRjaDxGQ21wSW5zdCwgTEhTLCBSSFMsIG9mbWluX3ByZWRfdHk+KEwsIFIpOworfQorCisvLy8gTWF0Y2ggYW4gJ3Vub3JkZXJlZCcgZmxvYXRpbmcgcG9pbnQgbWF4aW11bSBmdW5jdGlvbi4KKy8vLyBGbG9hdGluZyBwb2ludCBoYXMgb25lIHNwZWNpYWwgdmFsdWUgJ05hTicuIFRoZXJlZm9yZSwgdGhlcmUgaXMgbm8gdG90YWwKKy8vLyBvcmRlci4gSG93ZXZlciwgaWYgd2UgY2FuIGlnbm9yZSB0aGUgJ05hTicgdmFsdWUgKGZvciBleGFtcGxlLCBiZWNhdXNlIG9mIGEKKy8vLyAnbm8tbmFucy1mbG9hdC1tYXRoJyBmbGFnKSBhIGNvbWJpbmF0aW9uIG9mIGEgZmNtcCBhbmQgc2VsZWN0IGhhcyAnbWF4aW11bScKKy8vLyBzZW1hbnRpY3MuIEluIHRoZSBwcmVzZW5jZSBvZiAnTmFOJyB3ZSBoYXZlIHRvIHByZXNlcnZlIHRoZSBvcmlnaW5hbAorLy8vIHNlbGVjdChmY21wKHVndC9nZSwgTCwgUiksIEwsIFIpIHNlbWFudGljcyBtYXRjaGVkIGJ5IHRoaXMgcHJlZGljYXRlLgorLy8vCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgbWF4KEwsIFIpICBpZmYgTCBhbmQgUiBhcmUgbm90IE5hTgorLy8vICBtX1Vub3JkRk1heChMLCBSKSA9ICAgIEwgICAgICAgICAgaWZmIEwgb3IgUiBhcmUgTmFOCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgTWF4TWluX21hdGNoPEZDbXBJbnN0LCBMSFMsIFJIUywgdWZtYXhfcHJlZF90eT4KK21fVW5vcmRGTWF4KGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBNYXhNaW5fbWF0Y2g8RkNtcEluc3QsIExIUywgUkhTLCB1Zm1heF9wcmVkX3R5PihMLCBSKTsKK30KKworLy8vIE1hdGNoIGFuICd1bm9yZGVyZWQnIGZsb2F0aW5nIHBvaW50IG1pbmltdW0gZnVuY3Rpb24uCisvLy8gRmxvYXRpbmcgcG9pbnQgaGFzIG9uZSBzcGVjaWFsIHZhbHVlICdOYU4nLiBUaGVyZWZvcmUsIHRoZXJlIGlzIG5vIHRvdGFsCisvLy8gb3JkZXIuIEhvd2V2ZXIsIGlmIHdlIGNhbiBpZ25vcmUgdGhlICdOYU4nIHZhbHVlIChmb3IgZXhhbXBsZSwgYmVjYXVzZSBvZiBhCisvLy8gJ25vLW5hbnMtZmxvYXQtbWF0aCcgZmxhZykgYSBjb21iaW5hdGlvbiBvZiBhIGZjbXAgYW5kIHNlbGVjdCBoYXMgJ21pbmltdW0nCisvLy8gc2VtYW50aWNzLiBJbiB0aGUgcHJlc2VuY2Ugb2YgJ05hTicgd2UgaGF2ZSB0byBwcmVzZXJ2ZSB0aGUgb3JpZ2luYWwKKy8vLyBzZWxlY3QoZmNtcCh1bHQvbGUsIEwsIFIpLCBMLCBSKSBzZW1hbnRpY3MgbWF0Y2hlZCBieSB0aGlzIHByZWRpY2F0ZS4KKy8vLworLy8vICAgICAgICAgICAgICAgICAgICAgICAgICBtaW4oTCwgUikgIGlmZiBMIGFuZCBSIGFyZSBub3QgTmFOCisvLy8gIG1fVW5vcmRGTWluKEwsIFIpID0gICAgIEwgICAgICAgICAgaWZmIEwgb3IgUiBhcmUgTmFOCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgTWF4TWluX21hdGNoPEZDbXBJbnN0LCBMSFMsIFJIUywgdWZtaW5fcHJlZF90eT4KK21fVW5vcmRGTWluKGNvbnN0IExIUyAmTCwgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBNYXhNaW5fbWF0Y2g8RkNtcEluc3QsIExIUywgUkhTLCB1Zm1pbl9wcmVkX3R5PihMLCBSKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIE1hdGNoZXJzIGZvciBvdmVyZmxvdyBjaGVjayBwYXR0ZXJuczogZS5nLiAoYSArIGIpIHU8IGEKKy8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFNfdCwgdHlwZW5hbWUgUkhTX3QsIHR5cGVuYW1lIFN1bV90Pgorc3RydWN0IFVBZGRXaXRoT3ZlcmZsb3dfbWF0Y2ggeworICBMSFNfdCBMOworICBSSFNfdCBSOworICBTdW1fdCBTOworCisgIFVBZGRXaXRoT3ZlcmZsb3dfbWF0Y2goY29uc3QgTEhTX3QgJkwsIGNvbnN0IFJIU190ICZSLCBjb25zdCBTdW1fdCAmUykKKyAgICAgIDogTChMKSwgUihSKSwgUyhTKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPcFR5PiBib29sIG1hdGNoKE9wVHkgKlYpIHsKKyAgICBWYWx1ZSAqSUNtcExIUywgKklDbXBSSFM7CisgICAgSUNtcEluc3Q6OlByZWRpY2F0ZSBQcmVkOworICAgIGlmICghbV9JQ21wKFByZWQsIG1fVmFsdWUoSUNtcExIUyksIG1fVmFsdWUoSUNtcFJIUykpLm1hdGNoKFYpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgVmFsdWUgKkFkZExIUywgKkFkZFJIUzsKKyAgICBhdXRvIEFkZEV4cHIgPSBtX0FkZChtX1ZhbHVlKEFkZExIUyksIG1fVmFsdWUoQWRkUkhTKSk7CisKKyAgICAvLyAoYSArIGIpIHU8IGEsIChhICsgYikgdTwgYgorICAgIGlmIChQcmVkID09IElDbXBJbnN0OjpJQ01QX1VMVCkKKyAgICAgIGlmIChBZGRFeHByLm1hdGNoKElDbXBMSFMpICYmIChJQ21wUkhTID09IEFkZExIUyB8fCBJQ21wUkhTID09IEFkZFJIUykpCisgICAgICAgIHJldHVybiBMLm1hdGNoKEFkZExIUykgJiYgUi5tYXRjaChBZGRSSFMpICYmIFMubWF0Y2goSUNtcExIUyk7CisKKyAgICAvLyBhID51IChhICsgYiksIGIgPnUgKGEgKyBiKQorICAgIGlmIChQcmVkID09IElDbXBJbnN0OjpJQ01QX1VHVCkKKyAgICAgIGlmIChBZGRFeHByLm1hdGNoKElDbXBSSFMpICYmIChJQ21wTEhTID09IEFkZExIUyB8fCBJQ21wTEhTID09IEFkZFJIUykpCisgICAgICAgIHJldHVybiBMLm1hdGNoKEFkZExIUykgJiYgUi5tYXRjaChBZGRSSFMpICYmIFMubWF0Y2goSUNtcFJIUyk7CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKKy8vLyBNYXRjaCBhbiBpY21wIGluc3RydWN0aW9uIGNoZWNraW5nIGZvciB1bnNpZ25lZCBvdmVyZmxvdyBvbiBhZGRpdGlvbi4KKy8vLworLy8vIFMgaXMgbWF0Y2hlZCB0byB0aGUgYWRkaXRpb24gd2hvc2UgcmVzdWx0IGlzIGJlaW5nIGNoZWNrZWQgZm9yIG92ZXJmbG93LCBhbmQKKy8vLyBMIGFuZCBSIGFyZSBtYXRjaGVkIHRvIHRoZSBMSFMgYW5kIFJIUyBvZiBTLgordGVtcGxhdGUgPHR5cGVuYW1lIExIU190LCB0eXBlbmFtZSBSSFNfdCwgdHlwZW5hbWUgU3VtX3Q+CitVQWRkV2l0aE92ZXJmbG93X21hdGNoPExIU190LCBSSFNfdCwgU3VtX3Q+CittX1VBZGRXaXRoT3ZlcmZsb3coY29uc3QgTEhTX3QgJkwsIGNvbnN0IFJIU190ICZSLCBjb25zdCBTdW1fdCAmUykgeworICByZXR1cm4gVUFkZFdpdGhPdmVyZmxvd19tYXRjaDxMSFNfdCwgUkhTX3QsIFN1bV90PihMLCBSLCBTKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE9wbmRfdD4gc3RydWN0IEFyZ3VtZW50X21hdGNoIHsKKyAgdW5zaWduZWQgT3BJOworICBPcG5kX3QgVmFsOworCisgIEFyZ3VtZW50X21hdGNoKHVuc2lnbmVkIE9wSWR4LCBjb25zdCBPcG5kX3QgJlYpIDogT3BJKE9wSWR4KSwgVmFsKFYpIHt9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE9wVHk+IGJvb2wgbWF0Y2goT3BUeSAqVikgeworICAgIENhbGxTaXRlIENTKFYpOworICAgIHJldHVybiBDUy5pc0NhbGwoKSAmJiBWYWwubWF0Y2goQ1MuZ2V0QXJndW1lbnQoT3BJKSk7CisgIH0KK307CisKKy8vLyBNYXRjaCBhbiBhcmd1bWVudC4KK3RlbXBsYXRlIDx1bnNpZ25lZCBPcEksIHR5cGVuYW1lIE9wbmRfdD4KK2lubGluZSBBcmd1bWVudF9tYXRjaDxPcG5kX3Q+IG1fQXJndW1lbnQoY29uc3QgT3BuZF90ICZPcCkgeworICByZXR1cm4gQXJndW1lbnRfbWF0Y2g8T3BuZF90PihPcEksIE9wKTsKK30KKworLy8vIEludHJpbnNpYyBtYXRjaGVycy4KK3N0cnVjdCBJbnRyaW5zaWNJRF9tYXRjaCB7CisgIHVuc2lnbmVkIElEOworCisgIEludHJpbnNpY0lEX21hdGNoKEludHJpbnNpYzo6SUQgSW50cklEKSA6IElEKEludHJJRCkge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4gYm9vbCBtYXRjaChPcFR5ICpWKSB7CisgICAgaWYgKGNvbnN0IGF1dG8gKkNJID0gZHluX2Nhc3Q8Q2FsbEluc3Q+KFYpKQorICAgICAgaWYgKGNvbnN0IGF1dG8gKkYgPSBDSS0+Z2V0Q2FsbGVkRnVuY3Rpb24oKSkKKyAgICAgICAgcmV0dXJuIEYtPmdldEludHJpbnNpY0lEKCkgPT0gSUQ7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9OworCisvLy8gSW50cmluc2ljIG1hdGNoZXMgYXJlIGNvbWJpbmF0aW9ucyBvZiBJRCBtYXRjaGVycywgYW5kIGFyZ3VtZW50CisvLy8gbWF0Y2hlcnMuIEhpZ2hlciBhcml0eSBtYXRjaGVyIGFyZSBkZWZpbmVkIHJlY3Vyc2l2ZWx5IGluIHRlcm1zIG9mIGFuZC1pbmcKKy8vLyB0aGVtIHdpdGggbG93ZXIgYXJpdHkgbWF0Y2hlcnMuIEhlcmUncyBzb21lIGNvbnZlbmllbnQgdHlwZWRlZnMgZm9yIHVwIHRvCisvLy8gc2V2ZXJhbCBhcmd1bWVudHMsIGFuZCBtb3JlIGNhbiBiZSBhZGRlZCBhcyBuZWVkZWQKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMCA9IHZvaWQsIHR5cGVuYW1lIFQxID0gdm9pZCwgdHlwZW5hbWUgVDIgPSB2b2lkLAorICAgICAgICAgIHR5cGVuYW1lIFQzID0gdm9pZCwgdHlwZW5hbWUgVDQgPSB2b2lkLCB0eXBlbmFtZSBUNSA9IHZvaWQsCisgICAgICAgICAgdHlwZW5hbWUgVDYgPSB2b2lkLCB0eXBlbmFtZSBUNyA9IHZvaWQsIHR5cGVuYW1lIFQ4ID0gdm9pZCwKKyAgICAgICAgICB0eXBlbmFtZSBUOSA9IHZvaWQsIHR5cGVuYW1lIFQxMCA9IHZvaWQ+CitzdHJ1Y3QgbV9JbnRyaW5zaWNfVHk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDA+IHN0cnVjdCBtX0ludHJpbnNpY19UeTxUMD4geworICB1c2luZyBUeSA9IG1hdGNoX2NvbWJpbmVfYW5kPEludHJpbnNpY0lEX21hdGNoLCBBcmd1bWVudF9tYXRjaDxUMD4+OworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDE+IHN0cnVjdCBtX0ludHJpbnNpY19UeTxUMCwgVDE+IHsKKyAgdXNpbmcgVHkgPQorICAgICAgbWF0Y2hfY29tYmluZV9hbmQ8dHlwZW5hbWUgbV9JbnRyaW5zaWNfVHk8VDA+OjpUeSwgQXJndW1lbnRfbWF0Y2g8VDE+PjsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMj4KK3N0cnVjdCBtX0ludHJpbnNpY19UeTxUMCwgVDEsIFQyPiB7CisgIHVzaW5nIFR5ID0KKyAgICAgIG1hdGNoX2NvbWJpbmVfYW5kPHR5cGVuYW1lIG1fSW50cmluc2ljX1R5PFQwLCBUMT46OlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgQXJndW1lbnRfbWF0Y2g8VDI+PjsKK307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDM+CitzdHJ1Y3QgbV9JbnRyaW5zaWNfVHk8VDAsIFQxLCBUMiwgVDM+IHsKKyAgdXNpbmcgVHkgPQorICAgICAgbWF0Y2hfY29tYmluZV9hbmQ8dHlwZW5hbWUgbV9JbnRyaW5zaWNfVHk8VDAsIFQxLCBUMj46OlR5LAorICAgICAgICAgICAgICAgICAgICAgICAgQXJndW1lbnRfbWF0Y2g8VDM+PjsKK307CisKKy8vLyBNYXRjaCBpbnRyaW5zaWMgY2FsbHMgbGlrZSB0aGlzOgorLy8vIG1fSW50cmluc2ljPEludHJpbnNpYzo6ZmFicz4obV9WYWx1ZShYKSkKK3RlbXBsYXRlIDxJbnRyaW5zaWM6OklEIEludHJJRD4gaW5saW5lIEludHJpbnNpY0lEX21hdGNoIG1fSW50cmluc2ljKCkgeworICByZXR1cm4gSW50cmluc2ljSURfbWF0Y2goSW50cklEKTsKK30KKwordGVtcGxhdGUgPEludHJpbnNpYzo6SUQgSW50cklELCB0eXBlbmFtZSBUMD4KK2lubGluZSB0eXBlbmFtZSBtX0ludHJpbnNpY19UeTxUMD46OlR5IG1fSW50cmluc2ljKGNvbnN0IFQwICZPcDApIHsKKyAgcmV0dXJuIG1fQ29tYmluZUFuZChtX0ludHJpbnNpYzxJbnRySUQ+KCksIG1fQXJndW1lbnQ8MD4oT3AwKSk7Cit9CisKK3RlbXBsYXRlIDxJbnRyaW5zaWM6OklEIEludHJJRCwgdHlwZW5hbWUgVDAsIHR5cGVuYW1lIFQxPgoraW5saW5lIHR5cGVuYW1lIG1fSW50cmluc2ljX1R5PFQwLCBUMT46OlR5IG1fSW50cmluc2ljKGNvbnN0IFQwICZPcDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVDEgJk9wMSkgeworICByZXR1cm4gbV9Db21iaW5lQW5kKG1fSW50cmluc2ljPEludHJJRD4oT3AwKSwgbV9Bcmd1bWVudDwxPihPcDEpKTsKK30KKwordGVtcGxhdGUgPEludHJpbnNpYzo6SUQgSW50cklELCB0eXBlbmFtZSBUMCwgdHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgoraW5saW5lIHR5cGVuYW1lIG1fSW50cmluc2ljX1R5PFQwLCBUMSwgVDI+OjpUeQorbV9JbnRyaW5zaWMoY29uc3QgVDAgJk9wMCwgY29uc3QgVDEgJk9wMSwgY29uc3QgVDIgJk9wMikgeworICByZXR1cm4gbV9Db21iaW5lQW5kKG1fSW50cmluc2ljPEludHJJRD4oT3AwLCBPcDEpLCBtX0FyZ3VtZW50PDI+KE9wMikpOworfQorCit0ZW1wbGF0ZSA8SW50cmluc2ljOjpJRCBJbnRySUQsIHR5cGVuYW1lIFQwLCB0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsCisgICAgICAgICAgdHlwZW5hbWUgVDM+CitpbmxpbmUgdHlwZW5hbWUgbV9JbnRyaW5zaWNfVHk8VDAsIFQxLCBUMiwgVDM+OjpUeQorbV9JbnRyaW5zaWMoY29uc3QgVDAgJk9wMCwgY29uc3QgVDEgJk9wMSwgY29uc3QgVDIgJk9wMiwgY29uc3QgVDMgJk9wMykgeworICByZXR1cm4gbV9Db21iaW5lQW5kKG1fSW50cmluc2ljPEludHJJRD4oT3AwLCBPcDEsIE9wMiksIG1fQXJndW1lbnQ8Mz4oT3AzKSk7Cit9CisKKy8vIEhlbHBlciBpbnRyaW5zaWMgbWF0Y2hpbmcgc3BlY2lhbGl6YXRpb25zLgordGVtcGxhdGUgPHR5cGVuYW1lIE9wbmQwPgoraW5saW5lIHR5cGVuYW1lIG1fSW50cmluc2ljX1R5PE9wbmQwPjo6VHkgbV9CaXRSZXZlcnNlKGNvbnN0IE9wbmQwICZPcDApIHsKKyAgcmV0dXJuIG1fSW50cmluc2ljPEludHJpbnNpYzo6Yml0cmV2ZXJzZT4oT3AwKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE9wbmQwPgoraW5saW5lIHR5cGVuYW1lIG1fSW50cmluc2ljX1R5PE9wbmQwPjo6VHkgbV9CU3dhcChjb25zdCBPcG5kMCAmT3AwKSB7CisgIHJldHVybiBtX0ludHJpbnNpYzxJbnRyaW5zaWM6OmJzd2FwPihPcDApOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BuZDAsIHR5cGVuYW1lIE9wbmQxPgoraW5saW5lIHR5cGVuYW1lIG1fSW50cmluc2ljX1R5PE9wbmQwLCBPcG5kMT46OlR5IG1fRk1pbihjb25zdCBPcG5kMCAmT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcG5kMSAmT3AxKSB7CisgIHJldHVybiBtX0ludHJpbnNpYzxJbnRyaW5zaWM6Om1pbm51bT4oT3AwLCBPcDEpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BuZDAsIHR5cGVuYW1lIE9wbmQxPgoraW5saW5lIHR5cGVuYW1lIG1fSW50cmluc2ljX1R5PE9wbmQwLCBPcG5kMT46OlR5IG1fRk1heChjb25zdCBPcG5kMCAmT3AwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcG5kMSAmT3AxKSB7CisgIHJldHVybiBtX0ludHJpbnNpYzxJbnRyaW5zaWM6Om1heG51bT4oT3AwLCBPcDEpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BuZF90PiBzdHJ1Y3QgU2lnbnVtX21hdGNoIHsKKyAgT3BuZF90IFZhbDsKKyAgU2lnbnVtX21hdGNoKGNvbnN0IE9wbmRfdCAmVikgOiBWYWwoVikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgT3BUeT4gYm9vbCBtYXRjaChPcFR5ICpWKSB7CisgICAgdW5zaWduZWQgVHlwZVNpemUgPSBWLT5nZXRUeXBlKCktPmdldFNjYWxhclNpemVJbkJpdHMoKTsKKyAgICBpZiAoVHlwZVNpemUgPT0gMCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIFNoaWZ0V2lkdGggPSBUeXBlU2l6ZSAtIDE7CisgICAgVmFsdWUgKk9wTCA9IG51bGxwdHIsICpPcFIgPSBudWxscHRyOworCisgICAgLy8gVGhpcyBpcyB0aGUgcmVwcmVzZW50YXRpb24gb2Ygc2lnbnVtIHdlIG1hdGNoOgorICAgIC8vCisgICAgLy8gIHNpZ251bSh4KSA9PSAoeCA+PiA2MykgfCAoLXggPj51IDYzKQorICAgIC8vCisgICAgLy8gQW4gaTEgdmFsdWUgaXMgaXRzIG93biBzaWdudW0sIHNvIGl0J3MgY29ycmVjdCB0byBtYXRjaAorICAgIC8vCisgICAgLy8gIHNpZ251bSh4KSA9PSAoeCA+PiAwKSAgfCAoLXggPj51IDApCisgICAgLy8KKyAgICAvLyBmb3IgaTEgdmFsdWVzLgorCisgICAgYXV0byBMSFMgPSBtX0FTaHIobV9WYWx1ZShPcEwpLCBtX1NwZWNpZmljSW50KFNoaWZ0V2lkdGgpKTsKKyAgICBhdXRvIFJIUyA9IG1fTFNocihtX05lZyhtX1ZhbHVlKE9wUikpLCBtX1NwZWNpZmljSW50KFNoaWZ0V2lkdGgpKTsKKyAgICBhdXRvIFNpZ251bSA9IG1fT3IoTEhTLCBSSFMpOworCisgICAgcmV0dXJuIFNpZ251bS5tYXRjaChWKSAmJiBPcEwgPT0gT3BSICYmIFZhbC5tYXRjaChPcEwpOworICB9Cit9OworCisvLy8gTWF0Y2hlcyBhIHNpZ251bSBwYXR0ZXJuLgorLy8vCisvLy8gc2lnbnVtKHgpID0KKy8vLyAgICAgIHggPiAgMCAgLT4gIDEKKy8vLyAgICAgIHggPT0gMCAgLT4gIDAKKy8vLyAgICAgIHggPCAgMCAgLT4gLTEKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWxfdD4gaW5saW5lIFNpZ251bV9tYXRjaDxWYWxfdD4gbV9TaWdudW0oY29uc3QgVmFsX3QgJlYpIHsKKyAgcmV0dXJuIFNpZ251bV9tYXRjaDxWYWxfdD4oVik7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBNYXRjaGVycyBmb3IgdHdvLW9wZXJhbmRzIG9wZXJhdG9ycyB3aXRoIHRoZSBvcGVyYXRvcnMgaW4gZWl0aGVyIG9yZGVyCisvLworCisvLy8gTWF0Y2hlcyBhIEJpbmFyeU9wZXJhdG9yIHdpdGggTEhTIGFuZCBSSFMgaW4gZWl0aGVyIG9yZGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEFueUJpbmFyeU9wX21hdGNoPExIUywgUkhTLCB0cnVlPiBtX2NfQmluT3AoY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEFueUJpbmFyeU9wX21hdGNoPExIUywgUkhTLCB0cnVlPihMLCBSKTsKK30KKworLy8vIE1hdGNoZXMgYW4gSUNtcCB3aXRoIGEgcHJlZGljYXRlIG92ZXIgTEhTIGFuZCBSSFMgaW4gZWl0aGVyIG9yZGVyLgorLy8vIERvZXMgbm90IHN3YXAgdGhlIHByZWRpY2F0ZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBDbXBDbGFzc19tYXRjaDxMSFMsIFJIUywgSUNtcEluc3QsIElDbXBJbnN0OjpQcmVkaWNhdGUsIHRydWU+CittX2NfSUNtcChJQ21wSW5zdDo6UHJlZGljYXRlICZQcmVkLCBjb25zdCBMSFMgJkwsIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQ21wQ2xhc3NfbWF0Y2g8TEhTLCBSSFMsIElDbXBJbnN0LCBJQ21wSW5zdDo6UHJlZGljYXRlLCB0cnVlPihQcmVkLCBMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSKTsKK30KKworLy8vIE1hdGNoZXMgYSBBZGQgd2l0aCBMSFMgYW5kIFJIUyBpbiBlaXRoZXIgb3JkZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpBZGQsIHRydWU+IG1fY19BZGQoY29uc3QgTEhTICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpBZGQsIHRydWU+KEwsIFIpOworfQorCisvLy8gTWF0Y2hlcyBhIE11bCB3aXRoIExIUyBhbmQgUkhTIGluIGVpdGhlciBvcmRlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246Ok11bCwgdHJ1ZT4gbV9jX011bChjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246Ok11bCwgdHJ1ZT4oTCwgUik7Cit9CisKKy8vLyBNYXRjaGVzIGFuIEFuZCB3aXRoIExIUyBhbmQgUkhTIGluIGVpdGhlciBvcmRlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OkFuZCwgdHJ1ZT4gbV9jX0FuZChjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OkFuZCwgdHJ1ZT4oTCwgUik7Cit9CisKKy8vLyBNYXRjaGVzIGFuIE9yIHdpdGggTEhTIGFuZCBSSFMgaW4gZWl0aGVyIG9yZGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIExIUywgdHlwZW5hbWUgUkhTPgoraW5saW5lIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6T3IsIHRydWU+IG1fY19Pcihjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpPciwgdHJ1ZT4oTCwgUik7Cit9CisKKy8vLyBNYXRjaGVzIGFuIFhvciB3aXRoIExIUyBhbmQgUkhTIGluIGVpdGhlciBvcmRlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OlhvciwgdHJ1ZT4gbV9jX1hvcihjb25zdCBMSFMgJkwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUkhTICZSKSB7CisgIHJldHVybiBCaW5hcnlPcF9tYXRjaDxMSFMsIFJIUywgSW5zdHJ1Y3Rpb246OlhvciwgdHJ1ZT4oTCwgUik7Cit9CisKKy8vLyBNYXRjaGVzIGEgJ05vdCcgYXMgJ3hvciBWLCAtMScgb3IgJ3hvciAtMSwgVicuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsVHk+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8VmFsVHksIGNzdF9wcmVkX3R5PGlzX2FsbF9vbmVzPiwgSW5zdHJ1Y3Rpb246OlhvciwgdHJ1ZT4KK21fTm90KGNvbnN0IFZhbFR5ICZWKSB7CisgIHJldHVybiBtX2NfWG9yKFYsIG1fQWxsT25lcygpKTsKK30KKworLy8vIE1hdGNoZXMgYW4gU01pbiB3aXRoIExIUyBhbmQgUkhTIGluIGVpdGhlciBvcmRlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBMSFMsIHR5cGVuYW1lIFJIUz4KK2lubGluZSBNYXhNaW5fbWF0Y2g8SUNtcEluc3QsIExIUywgUkhTLCBzbWluX3ByZWRfdHksIHRydWU+CittX2NfU01pbihjb25zdCBMSFMgJkwsIGNvbnN0IFJIUyAmUikgeworICByZXR1cm4gTWF4TWluX21hdGNoPElDbXBJbnN0LCBMSFMsIFJIUywgc21pbl9wcmVkX3R5LCB0cnVlPihMLCBSKTsKK30KKy8vLyBNYXRjaGVzIGFuIFNNYXggd2l0aCBMSFMgYW5kIFJIUyBpbiBlaXRoZXIgb3JkZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgTWF4TWluX21hdGNoPElDbXBJbnN0LCBMSFMsIFJIUywgc21heF9wcmVkX3R5LCB0cnVlPgorbV9jX1NNYXgoY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIE1heE1pbl9tYXRjaDxJQ21wSW5zdCwgTEhTLCBSSFMsIHNtYXhfcHJlZF90eSwgdHJ1ZT4oTCwgUik7Cit9CisvLy8gTWF0Y2hlcyBhIFVNaW4gd2l0aCBMSFMgYW5kIFJIUyBpbiBlaXRoZXIgb3JkZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgTWF4TWluX21hdGNoPElDbXBJbnN0LCBMSFMsIFJIUywgdW1pbl9wcmVkX3R5LCB0cnVlPgorbV9jX1VNaW4oY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIE1heE1pbl9tYXRjaDxJQ21wSW5zdCwgTEhTLCBSSFMsIHVtaW5fcHJlZF90eSwgdHJ1ZT4oTCwgUik7Cit9CisvLy8gTWF0Y2hlcyBhIFVNYXggd2l0aCBMSFMgYW5kIFJIUyBpbiBlaXRoZXIgb3JkZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgTWF4TWluX21hdGNoPElDbXBJbnN0LCBMSFMsIFJIUywgdW1heF9wcmVkX3R5LCB0cnVlPgorbV9jX1VNYXgoY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIE1heE1pbl9tYXRjaDxJQ21wSW5zdCwgTEhTLCBSSFMsIHVtYXhfcHJlZF90eSwgdHJ1ZT4oTCwgUik7Cit9CisKKy8vLyBNYXRjaGVzIEZBZGQgd2l0aCBMSFMgYW5kIFJIUyBpbiBlaXRoZXIgb3JkZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpGQWRkLCB0cnVlPgorbV9jX0ZBZGQoY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6RkFkZCwgdHJ1ZT4oTCwgUik7Cit9CisKKy8vLyBNYXRjaGVzIEZNdWwgd2l0aCBMSFMgYW5kIFJIUyBpbiBlaXRoZXIgb3JkZXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTEhTLCB0eXBlbmFtZSBSSFM+CitpbmxpbmUgQmluYXJ5T3BfbWF0Y2g8TEhTLCBSSFMsIEluc3RydWN0aW9uOjpGTXVsLCB0cnVlPgorbV9jX0ZNdWwoY29uc3QgTEhTICZMLCBjb25zdCBSSFMgJlIpIHsKKyAgcmV0dXJuIEJpbmFyeU9wX21hdGNoPExIUywgUkhTLCBJbnN0cnVjdGlvbjo6Rk11bCwgdHJ1ZT4oTCwgUik7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBQYXR0ZXJuTWF0Y2gKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX1BBVFRFUk5NQVRDSF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1ByZWRJdGVyYXRvckNhY2hlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1ByZWRJdGVyYXRvckNhY2hlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODFmNTM1MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvUHJlZEl0ZXJhdG9yQ2FjaGUuaApAQCAtMCwwICsxLDgxIEBACisvLz09PS0gUHJlZEl0ZXJhdG9yQ2FjaGUuaCAtIHByZWRfaXRlcmF0b3IgQ2FjaGUgLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBQcmVkSXRlcmF0b3JDYWNoZSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfUFJFRElURVJBVE9SQ0FDSEVfSAorI2RlZmluZSBMTFZNX0lSX1BSRURJVEVSQVRPUkNBQ0hFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ0ZHLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBQcmVkSXRlcmF0b3JDYWNoZSAtIFRoaXMgY2xhc3MgaXMgYW4gZXh0cmVtZWx5IHRyaXZpYWwgY2FjaGUgZm9yCisvLy8gcHJlZGVjZXNzb3IgaXRlcmF0b3IgcXVlcmllcy4gIFRoaXMgaXMgdXNlZnVsIGZvciBjb2RlIHRoYXQgcmVwZWF0ZWRseQorLy8vIHdhbnRzIHRoZSBwcmVkZWNlc3NvciBsaXN0IGZvciB0aGUgc2FtZSBibG9ja3MuCitjbGFzcyBQcmVkSXRlcmF0b3JDYWNoZSB7CisgIC8vLyBCbG9ja1RvUHJlZHNNYXAgLSBQb2ludGVyIHRvIG51bGwtdGVybWluYXRlZCBsaXN0LgorICBtdXRhYmxlIERlbnNlTWFwPEJhc2ljQmxvY2sgKiwgQmFzaWNCbG9jayAqKj4gQmxvY2tUb1ByZWRzTWFwOworICBtdXRhYmxlIERlbnNlTWFwPEJhc2ljQmxvY2sgKiwgdW5zaWduZWQ+IEJsb2NrVG9QcmVkQ291bnRNYXA7CisKKyAgLy8vIE1lbW9yeSAtIFRoaXMgaXMgdGhlIHNwYWNlIHRoYXQgaG9sZHMgY2FjaGVkIHByZWRzLgorICBCdW1wUHRyQWxsb2NhdG9yIE1lbW9yeTsKKworcHJpdmF0ZToKKyAgLy8vIEdldFByZWRzIC0gR2V0IGEgY2FjaGVkIGxpc3QgZm9yIHRoZSBudWxsLXRlcm1pbmF0ZWQgcHJlZGVjZXNzb3IgbGlzdCBvZgorICAvLy8gdGhlIHNwZWNpZmllZCBibG9jay4gIFRoaXMgY2FuIGJlIHVzZWQgaW4gYSBsb29wIGxpa2UgdGhpczoKKyAgLy8vICAgZm9yIChCYXNpY0Jsb2NrICoqUEkgPSBQcmVkQ2FjaGUtPkdldFByZWRzKEJCKTsgKlBJOyArK1BJKQorICAvLy8gICAgICB1c2UoKlBJKTsKKyAgLy8vIGluc3RlYWQgb2Y6CisgIC8vLyBmb3IgKHByZWRfaXRlcmF0b3IgUEkgPSBwcmVkX2JlZ2luKEJCKSwgRSA9IHByZWRfZW5kKEJCKTsgUEkgIT0gRTsgKytQSSkKKyAgQmFzaWNCbG9jayAqKkdldFByZWRzKEJhc2ljQmxvY2sgKkJCKSB7CisgICAgQmFzaWNCbG9jayAqKiZFbnRyeSA9IEJsb2NrVG9QcmVkc01hcFtCQl07CisgICAgaWYgKEVudHJ5KQorICAgICAgcmV0dXJuIEVudHJ5OworCisgICAgU21hbGxWZWN0b3I8QmFzaWNCbG9jayAqLCAzMj4gUHJlZENhY2hlKHByZWRfYmVnaW4oQkIpLCBwcmVkX2VuZChCQikpOworICAgIFByZWRDYWNoZS5wdXNoX2JhY2sobnVsbHB0cik7IC8vIG51bGwgdGVybWluYXRvci4KKworICAgIEJsb2NrVG9QcmVkQ291bnRNYXBbQkJdID0gUHJlZENhY2hlLnNpemUoKSAtIDE7CisKKyAgICBFbnRyeSA9IE1lbW9yeS5BbGxvY2F0ZTxCYXNpY0Jsb2NrICo+KFByZWRDYWNoZS5zaXplKCkpOworICAgIHN0ZDo6Y29weShQcmVkQ2FjaGUuYmVnaW4oKSwgUHJlZENhY2hlLmVuZCgpLCBFbnRyeSk7CisgICAgcmV0dXJuIEVudHJ5OworICB9CisKKyAgdW5zaWduZWQgR2V0TnVtUHJlZHMoQmFzaWNCbG9jayAqQkIpIGNvbnN0IHsKKyAgICBhdXRvIFJlc3VsdCA9IEJsb2NrVG9QcmVkQ291bnRNYXAuZmluZChCQik7CisgICAgaWYgKFJlc3VsdCAhPSBCbG9ja1RvUHJlZENvdW50TWFwLmVuZCgpKQorICAgICAgcmV0dXJuIFJlc3VsdC0+c2Vjb25kOworICAgIHJldHVybiBCbG9ja1RvUHJlZENvdW50TWFwW0JCXSA9IHN0ZDo6ZGlzdGFuY2UocHJlZF9iZWdpbihCQiksIHByZWRfZW5kKEJCKSk7CisgIH0KKworcHVibGljOgorICBzaXplX3Qgc2l6ZShCYXNpY0Jsb2NrICpCQikgY29uc3QgeyByZXR1cm4gR2V0TnVtUHJlZHMoQkIpOyB9CisgIEFycmF5UmVmPEJhc2ljQmxvY2sgKj4gZ2V0KEJhc2ljQmxvY2sgKkJCKSB7CisgICAgcmV0dXJuIG1ha2VBcnJheVJlZihHZXRQcmVkcyhCQiksIEdldE51bVByZWRzKEJCKSk7CisgIH0KKworICAvLy8gY2xlYXIgLSBSZW1vdmUgYWxsIGluZm9ybWF0aW9uLgorICB2b2lkIGNsZWFyKCkgeworICAgIEJsb2NrVG9QcmVkc01hcC5jbGVhcigpOworICAgIEJsb2NrVG9QcmVkQ291bnRNYXAuY2xlYXIoKTsKKyAgICBNZW1vcnkuUmVzZXQoKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1Byb2ZpbGVTdW1tYXJ5LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1Byb2ZpbGVTdW1tYXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg1Y2U4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvUHJvZmlsZVN1bW1hcnkuaApAQCAtMCwwICsxLDg1IEBACisvLz09PS0gUHJvZmlsZVN1bW1hcnkuaCAtIFByb2ZpbGUgc3VtbWFyeSBkYXRhIHN0cnVjdHVyZS4gLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBwcm9maWxlIHN1bW1hcnkgZGF0YSBzdHJ1Y3R1cmUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX1BST0ZJTEVTVU1NQVJZX0gKKyNkZWZpbmUgTExWTV9JUl9QUk9GSUxFU1VNTUFSWV9ICisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTExWTUNvbnRleHQ7CitjbGFzcyBNZXRhZGF0YTsKKworLy8gVGhlIHByb2ZpbGUgc3VtbWFyeSBpcyBvbmUgb3IgbW9yZSAoQ3V0b2ZmLCBNaW5Db3VudCwgTnVtQ291bnRzKSB0cmlwbGV0cy4KKy8vIFRoZSBzZW1hbnRpY3Mgb2YgY291bnRzIGRlcGVuZCBvbiB0aGUgdHlwZSBvZiBwcm9maWxlLiBGb3IgaW5zdHJ1bWVudGF0aW9uCisvLyBwcm9maWxlLCBjb3VudHMgYXJlIGJsb2NrIGNvdW50cyBhbmQgZm9yIHNhbXBsZSBwcm9maWxlLCBjb3VudHMgYXJlCisvLyBwZXItbGluZSBzYW1wbGVzLiBHaXZlbiBhIHRhcmdldCBjb3VudHMgcGVyY2VudGlsZSwgd2UgY29tcHV0ZSB0aGUgbWluaW11bQorLy8gbnVtYmVyIG9mIGNvdW50cyBuZWVkZWQgdG8gcmVhY2ggdGhpcyB0YXJnZXQgYW5kIHRoZSBtaW5pbXVtIGFtb25nIHRoZXNlCisvLyBjb3VudHMuCitzdHJ1Y3QgUHJvZmlsZVN1bW1hcnlFbnRyeSB7CisgIHVpbnQzMl90IEN1dG9mZjsgICAgLy8vPCBUaGUgcmVxdWlyZWQgcGVyY2VudGlsZSBvZiBjb3VudHMuCisgIHVpbnQ2NF90IE1pbkNvdW50OyAgLy8vPCBUaGUgbWluaW11bSBjb3VudCBmb3IgdGhpcyBwZXJjZW50aWxlLgorICB1aW50NjRfdCBOdW1Db3VudHM7IC8vLzwgTnVtYmVyIG9mIGNvdW50cyA+PSB0aGUgbWluaW11bSBjb3VudC4KKworICBQcm9maWxlU3VtbWFyeUVudHJ5KHVpbnQzMl90IFRoZUN1dG9mZiwgdWludDY0X3QgVGhlTWluQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgVGhlTnVtQ291bnRzKQorICAgICAgOiBDdXRvZmYoVGhlQ3V0b2ZmKSwgTWluQ291bnQoVGhlTWluQ291bnQpLCBOdW1Db3VudHMoVGhlTnVtQ291bnRzKSB7fQorfTsKKwordXNpbmcgU3VtbWFyeUVudHJ5VmVjdG9yID0gc3RkOjp2ZWN0b3I8UHJvZmlsZVN1bW1hcnlFbnRyeT47CisKK2NsYXNzIFByb2ZpbGVTdW1tYXJ5IHsKK3B1YmxpYzoKKyAgZW51bSBLaW5kIHsgUFNLX0luc3RyLCBQU0tfU2FtcGxlIH07CisKK3ByaXZhdGU6CisgIGNvbnN0IEtpbmQgUFNLOworICBzdGF0aWMgY29uc3QgY2hhciAqS2luZFN0clsyXTsKKyAgU3VtbWFyeUVudHJ5VmVjdG9yIERldGFpbGVkU3VtbWFyeTsKKyAgdWludDY0X3QgVG90YWxDb3VudCwgTWF4Q291bnQsIE1heEludGVybmFsQ291bnQsIE1heEZ1bmN0aW9uQ291bnQ7CisgIHVpbnQzMl90IE51bUNvdW50cywgTnVtRnVuY3Rpb25zOworICAvLy8gXGJyaWVmIFJldHVybiBkZXRhaWxlZCBzdW1tYXJ5IGFzIG1ldGFkYXRhLgorICBNZXRhZGF0YSAqZ2V0RGV0YWlsZWRTdW1tYXJ5TUQoTExWTUNvbnRleHQgJkNvbnRleHQpOworCitwdWJsaWM6CisgIHN0YXRpYyBjb25zdCBpbnQgU2NhbGUgPSAxMDAwMDAwOworCisgIFByb2ZpbGVTdW1tYXJ5KEtpbmQgSywgU3VtbWFyeUVudHJ5VmVjdG9yIERldGFpbGVkU3VtbWFyeSwKKyAgICAgICAgICAgICAgICAgdWludDY0X3QgVG90YWxDb3VudCwgdWludDY0X3QgTWF4Q291bnQsCisgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE1heEludGVybmFsQ291bnQsIHVpbnQ2NF90IE1heEZ1bmN0aW9uQ291bnQsCisgICAgICAgICAgICAgICAgIHVpbnQzMl90IE51bUNvdW50cywgdWludDMyX3QgTnVtRnVuY3Rpb25zKQorICAgICAgOiBQU0soSyksIERldGFpbGVkU3VtbWFyeShzdGQ6Om1vdmUoRGV0YWlsZWRTdW1tYXJ5KSksCisgICAgICAgIFRvdGFsQ291bnQoVG90YWxDb3VudCksIE1heENvdW50KE1heENvdW50KSwKKyAgICAgICAgTWF4SW50ZXJuYWxDb3VudChNYXhJbnRlcm5hbENvdW50KSwgTWF4RnVuY3Rpb25Db3VudChNYXhGdW5jdGlvbkNvdW50KSwKKyAgICAgICAgTnVtQ291bnRzKE51bUNvdW50cyksIE51bUZ1bmN0aW9ucyhOdW1GdW5jdGlvbnMpIHt9CisKKyAgS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gUFNLOyB9CisgIC8vLyBcYnJpZWYgUmV0dXJuIHN1bW1hcnkgaW5mb3JtYXRpb24gYXMgbWV0YWRhdGEuCisgIE1ldGFkYXRhICpnZXRNRChMTFZNQ29udGV4dCAmQ29udGV4dCk7CisgIC8vLyBcYnJpZWYgQ29uc3RydWN0IHByb2ZpbGUgc3VtbWFyeSBmcm9tIG1ldGRhdGEuCisgIHN0YXRpYyBQcm9maWxlU3VtbWFyeSAqZ2V0RnJvbU1EKE1ldGFkYXRhICpNRCk7CisgIFN1bW1hcnlFbnRyeVZlY3RvciAmZ2V0RGV0YWlsZWRTdW1tYXJ5KCkgeyByZXR1cm4gRGV0YWlsZWRTdW1tYXJ5OyB9CisgIHVpbnQzMl90IGdldE51bUZ1bmN0aW9ucygpIHsgcmV0dXJuIE51bUZ1bmN0aW9uczsgfQorICB1aW50NjRfdCBnZXRNYXhGdW5jdGlvbkNvdW50KCkgeyByZXR1cm4gTWF4RnVuY3Rpb25Db3VudDsgfQorICB1aW50MzJfdCBnZXROdW1Db3VudHMoKSB7IHJldHVybiBOdW1Db3VudHM7IH0KKyAgdWludDY0X3QgZ2V0VG90YWxDb3VudCgpIHsgcmV0dXJuIFRvdGFsQ291bnQ7IH0KKyAgdWludDY0X3QgZ2V0TWF4Q291bnQoKSB7IHJldHVybiBNYXhDb3VudDsgfQorICB1aW50NjRfdCBnZXRNYXhJbnRlcm5hbENvdW50KCkgeyByZXR1cm4gTWF4SW50ZXJuYWxDb3VudDsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfUFJPRklMRVNVTU1BUllfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9TYWZlcG9pbnRJUlZlcmlmaWVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1NhZmVwb2ludElSVmVyaWZpZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTIwNTBkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9TYWZlcG9pbnRJUlZlcmlmaWVyLmgKQEAgLTAsMCArMSwzNSBAQAorLy89PT0tIFNhZmVwb2ludElSVmVyaWZpZXIuaCAtIENoZWNrcyBmb3IgR0MgcmVsb2NhdGlvbiBwcm9ibGVtcyAqLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIHZlcmlmaWVyIHdoaWNoIGlzIHVzZWZ1bCBmb3IgZW5mb3JjaW5nIHRoZSByZWxvY2F0aW9uCisvLyBwcm9wZXJ0aWVzIHJlcXVpcmVkIGJ5IGEgcmVsb2NhdGluZyBHQy4gIFNwZWNpZmljYWxseSwgaXQgbG9va3MgZm9yIHVzZXMgb2YKKy8vIHRoZSB1bnJlbG9jYXRlZCB2YWx1ZSBvZiBwb2ludGVyIFNTQSB2YWx1ZXMgYWZ0ZXIgYSBwb3NzaWJsZSBzYWZlcG9pbnQuIEl0CisvLyBhdHRlbXB0cyB0byByZXBvcnQgbm8gZmFsc2UgbmVnYXRpdmVzLCBidXQgbWF5IGVuZCB1cCByZXBvcnRpbmcgZmFsc2UKKy8vIHBvc2l0aXZlcyBpbiByYXJlIGNhc2VzIChzZWUgdGhlIG5vdGUgYXQgdGhlIHRvcCBvZiB0aGUgY29ycmVzcG9uZGluZyBjcHAKKy8vIGZpbGUuKQorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9TQUZFUE9JTlRfSVJfVkVSSUZJRVIKKyNkZWZpbmUgTExWTV9JUl9TQUZFUE9JTlRfSVJfVkVSSUZJRVIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEZ1bmN0aW9uUGFzczsKKworLy8vIFJ1biB0aGUgc2FmZXBvaW50IHZlcmlmaWVyIG92ZXIgYSBzaW5nbGUgZnVuY3Rpb24uICBDcmFzaGVzIG9uIGZhaWx1cmUuCit2b2lkIHZlcmlmeVNhZmVwb2ludElSKEZ1bmN0aW9uICZGKTsKKworLy8vIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgc2FmZXBvaW50IHZlcmlmaWVyIHBhc3Mgd2hpY2ggY2FuIGJlIGFkZGVkIHRvCisvLy8gYSBwYXNzIHBpcGVsaW5lIHRvIGNoZWNrIGZvciByZWxvY2F0aW9uIGJ1Z3MuCitGdW5jdGlvblBhc3MgKmNyZWF0ZVNhZmVwb2ludElSVmVyaWZpZXJQYXNzKCk7Cit9CisKKyNlbmRpZiAvLyBMTFZNX0lSX1NBRkVQT0lOVF9JUl9WRVJJRklFUgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9TdGF0ZXBvaW50LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1N0YXRlcG9pbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODdmNjdjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9TdGF0ZXBvaW50LmgKQEAgLTAsMCArMSw0NzQgQEAKKy8vPT09LSBsbHZtL0lSL1N0YXRlcG9pbnQuaCAtIGdjLnN0YXRlcG9pbnQgdXRpbGl0aWVzIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHV0aWxpdHkgZnVuY3Rpb25zIGFuZCBhIHdyYXBwZXIgY2xhc3MgYW5hbG9nb3VzIHRvCisvLyBDYWxsU2l0ZSBmb3IgYWNjZXNzaW5nIHRoZSBmaWVsZHMgb2YgZ2Muc3RhdGVwb2ludCwgZ2MucmVsb2NhdGUsCisvLyBnYy5yZXN1bHQgaW50cmluc2ljczsgYW5kIHNvbWUgZ2VuZXJhbCB1dGlsaXRpZXMgaGVscGZ1bCB3aGVuIGRlYWxpbmcgd2l0aAorLy8gZ2Muc3RhdGVwb2ludC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfU1RBVEVQT0lOVF9ICisjZGVmaW5lIExMVk1fSVJfU1RBVEVQT0lOVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9BdHRyaWJ1dGVzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ29uc3RhbnRzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFRoZSBzdGF0ZXBvaW50IGludHJpbnNpYyBhY2NlcHRzIGEgc2V0IG9mIGZsYWdzIGFzIGl0cyB0aGlyZCBhcmd1bWVudC4KKy8vLyBWYWxpZCB2YWx1ZXMgY29tZSBvdXQgb2YgdGhpcyBzZXQuCitlbnVtIGNsYXNzIFN0YXRlcG9pbnRGbGFncyB7CisgIE5vbmUgPSAwLAorICBHQ1RyYW5zaXRpb24gPSAxLCAvLy88IEluZGljYXRlcyB0aGF0IHRoaXMgc3RhdGVwb2ludCBpcyBhIHRyYW5zaXRpb24gZnJvbQorICAgICAgICAgICAgICAgICAgICAvLy88IEdDLWF3YXJlIGNvZGUgdG8gY29kZSB0aGF0IGlzIG5vdCBHQy1hd2FyZS4KKyAgLy8vIE1hcmsgdGhlIGRlb3B0IGFyZ3VtZW50cyBhc3NvY2lhdGVkIHdpdGggdGhlIHN0YXRlcG9pbnQgYXMgb25seSBiZWluZworICAvLy8gImxpdmUtaW4iLiBCeSBkZWZhdWx0LCBkZW9wdCBhcmd1bWVudHMgYXJlICJsaXZlLXRocm91Z2giLiAgImxpdmUtdGhyb3VnaCIKKyAgLy8vIHJlcXVpcmVzIHRoYXQgdGhleSB0aGUgdmFsdWUgYmUgbGl2ZSBvbiBlbnRyeSwgb24gZXhpdCwgYW5kIGF0IGFueSBwb2ludAorICAvLy8gZHVyaW5nIHRoZSBjYWxsLiAgImxpdmUtaW4iIG9ubHkgcmVxdWlyZXMgdGhlIHZhbHVlIGJlIGF2YWlsYWJsZSBhdCB0aGUKKyAgLy8vIHN0YXJ0IG9mIHRoZSBjYWxsLiAgSW4gcGFydGljdWxhciwgImxpdmUtaW4iIHZhbHVlcyBjYW4gYmUgcGxhY2VkIGluCisgIC8vLyB1bnVzZWQgYXJndW1lbnQgcmVnaXN0ZXJzIG9yIG90aGVyIG5vbi1jYWxsZWUgc2F2ZWQgcmVnaXN0ZXJzLgorICBEZW9wdExpdmVJbiA9IDIsCisKKyAgTWFza0FsbCA9IDMgLy8vPCBBIGJpdG1hc2sgdGhhdCBpbmNsdWRlcyBhbGwgdmFsaWQgZmxhZ3MuCit9OworCitjbGFzcyBHQ1JlbG9jYXRlSW5zdDsKK2NsYXNzIEdDUmVzdWx0SW5zdDsKKworYm9vbCBpc1N0YXRlcG9pbnQoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MpOworYm9vbCBpc1N0YXRlcG9pbnQoY29uc3QgVmFsdWUgKlYpOworYm9vbCBpc1N0YXRlcG9pbnQoY29uc3QgVmFsdWUgJlYpOworCitib29sIGlzR0NSZWxvY2F0ZShJbW11dGFibGVDYWxsU2l0ZSBDUyk7Citib29sIGlzR0NSZWxvY2F0ZShjb25zdCBWYWx1ZSAqVik7CisKK2Jvb2wgaXNHQ1Jlc3VsdChJbW11dGFibGVDYWxsU2l0ZSBDUyk7Citib29sIGlzR0NSZXN1bHQoY29uc3QgVmFsdWUgKlYpOworCisvLy8gQW5hbG9nb3VzIHRvIENhbGxTaXRlQmFzZSwgdGhpcyBwcm92aWRlcyBtb3N0IG9mIHRoZSBhY3R1YWwKKy8vLyBmdW5jdGlvbmFsaXR5IGZvciBTdGF0ZXBvaW50IGFuZCBJbW11dGFibGVTdGF0ZXBvaW50LiAgSXQgaXMKKy8vLyB0ZW1wbGF0aXplZCB0byBhbGxvdyBlYXNpbHkgc3BlY2lhbGl6aW5nIG9mIGNvbnN0IGFuZCBub24tY29uc3QKKy8vLyBjb25jcmV0ZSBzdWJ0eXBlcy4gIFRoaXMgaXMgc3RydWN0dXJlZCBhbmFsb2dvdXMgdG8gQ2FsbFNpdGUKKy8vLyByYXRoZXIgdGhhbiB0aGUgSW50cmluc2ljSW5zdC5oIGhlbHBlcnMgc2luY2Ugd2UgbmVlZCB0byBzdXBwb3J0CisvLy8gaW52b2thYmxlIHN0YXRlcG9pbnRzLgordGVtcGxhdGUgPHR5cGVuYW1lIEZ1blR5LCB0eXBlbmFtZSBJbnN0cnVjdGlvblR5LCB0eXBlbmFtZSBWYWx1ZVR5LAorICAgICAgICAgIHR5cGVuYW1lIENhbGxTaXRlVHk+CitjbGFzcyBTdGF0ZXBvaW50QmFzZSB7CisgIENhbGxTaXRlVHkgU3RhdGVwb2ludENTOworCitwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IFN0YXRlcG9pbnRCYXNlKEluc3RydWN0aW9uVHkgKkkpIHsKKyAgICBpZiAoaXNTdGF0ZXBvaW50KEkpKSB7CisgICAgICBTdGF0ZXBvaW50Q1MgPSBDYWxsU2l0ZVR5KEkpOworICAgICAgYXNzZXJ0KFN0YXRlcG9pbnRDUyAmJiAiaXNTdGF0ZXBvaW50IGltcGxpZXMgQ2FsbFNpdGUiKTsKKyAgICB9CisgIH0KKworICBleHBsaWNpdCBTdGF0ZXBvaW50QmFzZShDYWxsU2l0ZVR5IENTKSB7CisgICAgaWYgKGlzU3RhdGVwb2ludChDUykpCisgICAgICBTdGF0ZXBvaW50Q1MgPSBDUzsKKyAgfQorCitwdWJsaWM6CisgIHVzaW5nIGFyZ19pdGVyYXRvciA9IHR5cGVuYW1lIENhbGxTaXRlVHk6OmFyZ19pdGVyYXRvcjsKKworICBlbnVtIHsKKyAgICBJRFBvcyA9IDAsCisgICAgTnVtUGF0Y2hCeXRlc1BvcyA9IDEsCisgICAgQ2FsbGVkRnVuY3Rpb25Qb3MgPSAyLAorICAgIE51bUNhbGxBcmdzUG9zID0gMywKKyAgICBGbGFnc1BvcyA9IDQsCisgICAgQ2FsbEFyZ3NCZWdpblBvcyA9IDUsCisgIH07CisKKyAgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCwgdW5zaWduZWQpID0gZGVsZXRlOworICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMpID0gZGVsZXRlOworCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdCB7CisgICAgLy8gV2UgZG8gbm90IGFzc2lnbiBub24tc3RhdGVwb2ludCBDYWxsU2l0ZXMgdG8gU3RhdGVwb2ludENTLgorICAgIHJldHVybiAoYm9vbClTdGF0ZXBvaW50Q1M7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSB1bmRlcmx5aW5nIENhbGxTaXRlLgorICBDYWxsU2l0ZVR5IGdldENhbGxTaXRlKCkgY29uc3QgeworICAgIGFzc2VydCgqdGhpcyAmJiAiY2hlY2sgdmFsaWRpdHkgZmlyc3QhIik7CisgICAgcmV0dXJuIFN0YXRlcG9pbnRDUzsKKyAgfQorCisgIHVpbnQ2NF90IGdldEZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PENvbnN0YW50SW50PihnZXRDYWxsU2l0ZSgpLmdldEFyZ3VtZW50KEZsYWdzUG9zKSkKKyAgICAgICAgLT5nZXRaRXh0VmFsdWUoKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIElEIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHN0YXRlcG9pbnQuCisgIHVpbnQ2NF90IGdldElEKCkgY29uc3QgeworICAgIGNvbnN0IFZhbHVlICpJRFZhbCA9IGdldENhbGxTaXRlKCkuZ2V0QXJndW1lbnQoSURQb3MpOworICAgIHJldHVybiBjYXN0PENvbnN0YW50SW50PihJRFZhbCktPmdldFpFeHRWYWx1ZSgpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHBhdGNoYWJsZSBieXRlcyBhc3NvY2lhdGVkIHdpdGggdGhpcyBzdGF0ZXBvaW50LgorICB1aW50MzJfdCBnZXROdW1QYXRjaEJ5dGVzKCkgY29uc3QgeworICAgIGNvbnN0IFZhbHVlICpOdW1QYXRjaEJ5dGVzVmFsID0gZ2V0Q2FsbFNpdGUoKS5nZXRBcmd1bWVudChOdW1QYXRjaEJ5dGVzUG9zKTsKKyAgICB1aW50NjRfdCBOdW1QYXRjaEJ5dGVzID0KKyAgICAgIGNhc3Q8Q29uc3RhbnRJbnQ+KE51bVBhdGNoQnl0ZXNWYWwpLT5nZXRaRXh0VmFsdWUoKTsKKyAgICBhc3NlcnQoaXNJbnQ8MzI+KE51bVBhdGNoQnl0ZXMpICYmICJzaG91bGQgZml0IGluIDMyIGJpdHMhIik7CisgICAgcmV0dXJuIE51bVBhdGNoQnl0ZXM7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSB2YWx1ZSBhY3R1YWxseSBiZWluZyBjYWxsZWQgb3IgaW52b2tlZC4KKyAgVmFsdWVUeSAqZ2V0Q2FsbGVkVmFsdWUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldENhbGxTaXRlKCkuZ2V0QXJndW1lbnQoQ2FsbGVkRnVuY3Rpb25Qb3MpOworICB9CisKKyAgSW5zdHJ1Y3Rpb25UeSAqZ2V0SW5zdHJ1Y3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGdldENhbGxTaXRlKCkuZ2V0SW5zdHJ1Y3Rpb24oKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGZ1bmN0aW9uIGJlaW5nIGNhbGxlZCBpZiB0aGlzIGlzIGEgZGlyZWN0IGNhbGwsIG90aGVyd2lzZQorICAvLy8gcmV0dXJuIG51bGwgKGlmIGl0J3MgYW4gaW5kaXJlY3QgY2FsbCkuCisgIEZ1blR5ICpnZXRDYWxsZWRGdW5jdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZHluX2Nhc3Q8RnVuY3Rpb24+KGdldENhbGxlZFZhbHVlKCkpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgY2FsbGVyIGZ1bmN0aW9uIGZvciB0aGlzIHN0YXRlcG9pbnQuCisgIEZ1blR5ICpnZXRDYWxsZXIoKSBjb25zdCB7IHJldHVybiBnZXRDYWxsU2l0ZSgpLmdldENhbGxlcigpOyB9CisKKyAgLy8vIERldGVybWluZSBpZiB0aGUgc3RhdGVwb2ludCBjYW5ub3QgdW53aW5kLgorICBib29sIGRvZXNOb3RUaHJvdygpIGNvbnN0IHsKKyAgICBGdW5jdGlvbiAqRiA9IGdldENhbGxlZEZ1bmN0aW9uKCk7CisgICAgcmV0dXJuIGdldENhbGxTaXRlKCkuZG9lc05vdFRocm93KCkgfHwgKEYgPyBGLT5kb2VzTm90VGhyb3coKSA6IGZhbHNlKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHR5cGUgb2YgdGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoZSBjYWxsIHVuZGVybHlpbmcgdGhlCisgIC8vLyBzdGF0ZXBvaW50LgorICBUeXBlICpnZXRBY3R1YWxSZXR1cm5UeXBlKCkgY29uc3QgeworICAgIGF1dG8gKkZUeSA9IGNhc3Q8RnVuY3Rpb25UeXBlPigKKyAgICAgICAgY2FzdDxQb2ludGVyVHlwZT4oZ2V0Q2FsbGVkVmFsdWUoKS0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSk7CisgICAgcmV0dXJuIEZUeS0+Z2V0UmV0dXJuVHlwZSgpOworICB9CisKKyAgLy8vIE51bWJlciBvZiBhcmd1bWVudHMgdG8gYmUgcGFzc2VkIHRvIHRoZSBhY3R1YWwgY2FsbGVlLgorICBpbnQgZ2V0TnVtQ2FsbEFyZ3MoKSBjb25zdCB7CisgICAgY29uc3QgVmFsdWUgKk51bUNhbGxBcmdzVmFsID0gZ2V0Q2FsbFNpdGUoKS5nZXRBcmd1bWVudChOdW1DYWxsQXJnc1Bvcyk7CisgICAgcmV0dXJuIGNhc3Q8Q29uc3RhbnRJbnQ+KE51bUNhbGxBcmdzVmFsKS0+Z2V0WkV4dFZhbHVlKCk7CisgIH0KKworICBzaXplX3QgYXJnX3NpemUoKSBjb25zdCB7IHJldHVybiBnZXROdW1DYWxsQXJncygpOyB9CisgIHR5cGVuYW1lIENhbGxTaXRlVHk6OmFyZ19pdGVyYXRvciBhcmdfYmVnaW4oKSBjb25zdCB7CisgICAgYXNzZXJ0KENhbGxBcmdzQmVnaW5Qb3MgPD0gKGludClnZXRDYWxsU2l0ZSgpLmFyZ19zaXplKCkpOworICAgIHJldHVybiBnZXRDYWxsU2l0ZSgpLmFyZ19iZWdpbigpICsgQ2FsbEFyZ3NCZWdpblBvczsKKyAgfQorICB0eXBlbmFtZSBDYWxsU2l0ZVR5OjphcmdfaXRlcmF0b3IgYXJnX2VuZCgpIGNvbnN0IHsKKyAgICBhdXRvIEkgPSBhcmdfYmVnaW4oKSArIGFyZ19zaXplKCk7CisgICAgYXNzZXJ0KChnZXRDYWxsU2l0ZSgpLmFyZ19lbmQoKSAtIEkpID49IDApOworICAgIHJldHVybiBJOworICB9CisKKyAgVmFsdWVUeSAqZ2V0QXJndW1lbnQodW5zaWduZWQgSW5kZXgpIHsKKyAgICBhc3NlcnQoSW5kZXggPCBhcmdfc2l6ZSgpICYmICJvdXQgb2YgYm91bmRzISIpOworICAgIHJldHVybiAqKGFyZ19iZWdpbigpICsgSW5kZXgpOworICB9CisKKyAgLy8vIHJhbmdlIGFkYXB0ZXIgZm9yIGNhbGwgYXJndW1lbnRzCisgIGl0ZXJhdG9yX3JhbmdlPGFyZ19pdGVyYXRvcj4gY2FsbF9hcmdzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGFyZ19iZWdpbigpLCBhcmdfZW5kKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgY2FsbCBvciB0aGUgY2FsbGVlIGhhcyB0aGUgZ2l2ZW4gYXR0cmlidXRlLgorICBib29sIHBhcmFtSGFzQXR0cih1bnNpZ25lZCBpLCBBdHRyaWJ1dGU6OkF0dHJLaW5kIEEpIGNvbnN0IHsKKyAgICBGdW5jdGlvbiAqRiA9IGdldENhbGxlZEZ1bmN0aW9uKCk7CisgICAgcmV0dXJuIGdldENhbGxTaXRlKCkucGFyYW1IYXNBdHRyKGkgKyBDYWxsQXJnc0JlZ2luUG9zLCBBKSB8fAorICAgICAgICAgIChGID8gRi0+Z2V0QXR0cmlidXRlcygpLmhhc0F0dHJpYnV0ZShpLCBBKSA6IGZhbHNlKTsKKyAgfQorCisgIC8vLyBOdW1iZXIgb2YgR0MgdHJhbnNpdGlvbiBhcmdzLgorICBpbnQgZ2V0TnVtVG90YWxHQ1RyYW5zaXRpb25BcmdzKCkgY29uc3QgeworICAgIGNvbnN0IFZhbHVlICpOdW1HQ1RyYW5zaXRpb25BcmdzID0gKmFyZ19lbmQoKTsKKyAgICByZXR1cm4gY2FzdDxDb25zdGFudEludD4oTnVtR0NUcmFuc2l0aW9uQXJncyktPmdldFpFeHRWYWx1ZSgpOworICB9CisgIHR5cGVuYW1lIENhbGxTaXRlVHk6OmFyZ19pdGVyYXRvciBnY190cmFuc2l0aW9uX2FyZ3NfYmVnaW4oKSBjb25zdCB7CisgICAgYXV0byBJID0gYXJnX2VuZCgpICsgMTsKKyAgICBhc3NlcnQoKGdldENhbGxTaXRlKCkuYXJnX2VuZCgpIC0gSSkgPj0gMCk7CisgICAgcmV0dXJuIEk7CisgIH0KKyAgdHlwZW5hbWUgQ2FsbFNpdGVUeTo6YXJnX2l0ZXJhdG9yIGdjX3RyYW5zaXRpb25fYXJnc19lbmQoKSBjb25zdCB7CisgICAgYXV0byBJID0gZ2NfdHJhbnNpdGlvbl9hcmdzX2JlZ2luKCkgKyBnZXROdW1Ub3RhbEdDVHJhbnNpdGlvbkFyZ3MoKTsKKyAgICBhc3NlcnQoKGdldENhbGxTaXRlKCkuYXJnX2VuZCgpIC0gSSkgPj0gMCk7CisgICAgcmV0dXJuIEk7CisgIH0KKworICAvLy8gcmFuZ2UgYWRhcHRlciBmb3IgR0MgdHJhbnNpdGlvbiBhcmd1bWVudHMKKyAgaXRlcmF0b3JfcmFuZ2U8YXJnX2l0ZXJhdG9yPiBnY190cmFuc2l0aW9uX2FyZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoZ2NfdHJhbnNpdGlvbl9hcmdzX2JlZ2luKCksIGdjX3RyYW5zaXRpb25fYXJnc19lbmQoKSk7CisgIH0KKworICAvLy8gTnVtYmVyIG9mIGFkZGl0aW9uYWwgYXJndW1lbnRzIGV4Y2x1ZGluZyB0aG9zZSBpbnRlbmRlZAorICAvLy8gZm9yIGdhcmJhZ2UgY29sbGVjdGlvbi4KKyAgaW50IGdldE51bVRvdGFsVk1TQXJncygpIGNvbnN0IHsKKyAgICBjb25zdCBWYWx1ZSAqTnVtVk1TQXJncyA9ICpnY190cmFuc2l0aW9uX2FyZ3NfZW5kKCk7CisgICAgcmV0dXJuIGNhc3Q8Q29uc3RhbnRJbnQ+KE51bVZNU0FyZ3MpLT5nZXRaRXh0VmFsdWUoKTsKKyAgfQorCisgIHR5cGVuYW1lIENhbGxTaXRlVHk6OmFyZ19pdGVyYXRvciBkZW9wdF9iZWdpbigpIGNvbnN0IHsKKyAgICBhdXRvIEkgPSBnY190cmFuc2l0aW9uX2FyZ3NfZW5kKCkgKyAxOworICAgIGFzc2VydCgoZ2V0Q2FsbFNpdGUoKS5hcmdfZW5kKCkgLSBJKSA+PSAwKTsKKyAgICByZXR1cm4gSTsKKyAgfQorICB0eXBlbmFtZSBDYWxsU2l0ZVR5OjphcmdfaXRlcmF0b3IgZGVvcHRfZW5kKCkgY29uc3QgeworICAgIGF1dG8gSSA9IGRlb3B0X2JlZ2luKCkgKyBnZXROdW1Ub3RhbFZNU0FyZ3MoKTsKKyAgICBhc3NlcnQoKGdldENhbGxTaXRlKCkuYXJnX2VuZCgpIC0gSSkgPj0gMCk7CisgICAgcmV0dXJuIEk7CisgIH0KKworICAvLy8gcmFuZ2UgYWRhcHRlciBmb3Igdm0gc3RhdGUgYXJndW1lbnRzCisgIGl0ZXJhdG9yX3JhbmdlPGFyZ19pdGVyYXRvcj4gZGVvcHRfb3BlcmFuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoZGVvcHRfYmVnaW4oKSwgZGVvcHRfZW5kKCkpOworICB9CisKKyAgdHlwZW5hbWUgQ2FsbFNpdGVUeTo6YXJnX2l0ZXJhdG9yIGdjX2FyZ3NfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGRlb3B0X2VuZCgpOworICB9CisgIHR5cGVuYW1lIENhbGxTaXRlVHk6OmFyZ19pdGVyYXRvciBnY19hcmdzX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0Q2FsbFNpdGUoKS5hcmdfZW5kKCk7CisgIH0KKworICB1bnNpZ25lZCBnY0FyZ3NTdGFydElkeCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2NfYXJnc19iZWdpbigpIC0gZ2V0SW5zdHJ1Y3Rpb24oKS0+b3BfYmVnaW4oKTsKKyAgfQorCisgIC8vLyByYW5nZSBhZGFwdGVyIGZvciBnYyBhcmd1bWVudHMKKyAgaXRlcmF0b3JfcmFuZ2U8YXJnX2l0ZXJhdG9yPiBnY19hcmdzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGdjX2FyZ3NfYmVnaW4oKSwgZ2NfYXJnc19lbmQoKSk7CisgIH0KKworICAvLy8gR2V0IGxpc3Qgb2YgYWxsIGdjIHJlbG9hY3RlcyBsaW5rZWQgdG8gdGhpcyBzdGF0ZXBvaW50CisgIC8vLyBNYXkgY29udGFpbiBzZXZlcmFsIHJlbG9jYXRpb25zIGZvciB0aGUgc2FtZSBiYXNlL2Rlcml2ZWQgcGFpci4KKyAgLy8vIEZvciBleGFtcGxlIHRoaXMgY291bGQgaGFwcGVuIGR1ZSB0byByZWxvY2F0aW9ucyBvbiB1bndpbmRpbmcKKyAgLy8vIHBhdGggb2YgaW52b2tlLgorICBzdGQ6OnZlY3Rvcjxjb25zdCBHQ1JlbG9jYXRlSW5zdCAqPiBnZXRSZWxvY2F0ZXMoKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSBleHBlcmltZW50YWxfZ2NfcmVzdWx0IGNhbGwgdGllZCB0byB0aGlzIHN0YXRlcG9pbnQuICBDYW4gYmUKKyAgLy8vIG51bGxwdHIgaWYgdGhlcmUgaXNuJ3QgYSBnY19yZXN1bHQgdGllZCB0byB0aGlzIHN0YXRlcG9pbnQuICBHdWFyYW50ZWVkIHRvCisgIC8vLyBiZSBhIENhbGxJbnN0IGlmIG5vbi1udWxsLgorICBjb25zdCBHQ1Jlc3VsdEluc3QgKmdldEdDUmVzdWx0KCkgY29uc3QgeworICAgIGZvciAoYXV0byAqVSA6IGdldEluc3RydWN0aW9uKCktPnVzZXJzKCkpCisgICAgICBpZiAoYXV0byAqR1JJID0gZHluX2Nhc3Q8R0NSZXN1bHRJbnN0PihVKSkKKyAgICAgICAgcmV0dXJuIEdSSTsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisjaWZuZGVmIE5ERUJVRworICAvLy8gQXNzZXJ0cyBpZiB0aGlzIHN0YXRlcG9pbnQgaXMgbWFsZm9ybWVkLiAgQ29tbW9uIGNhc2VzIGZvciBmYWlsdXJlCisgIC8vLyBpbmNsdWRlIGluY29ycmVjdCBsZW5ndGggcHJlZml4ZXMgZm9yIHZhcmlhYmxlIGxlbmd0aCBzZWN0aW9ucyBvcgorICAvLy8gaWxsZWdhbCB2YWx1ZXMgZm9yIHBhcmFtZXRlcnMuCisgIHZvaWQgdmVyaWZ5KCkgeworICAgIGFzc2VydChnZXROdW1DYWxsQXJncygpID49IDAgJiYKKyAgICAgICAgICAgIm51bWJlciBvZiBhcmd1bWVudHMgdG8gYWN0dWFsbHkgY2FsbGVlIGNhbid0IGJlIG5lZ2F0aXZlIik7CisKKyAgICAvLyBUaGUgaW50ZXJuYWwgYXNzZXJ0cyBpbiB0aGUgaXRlcmF0b3IgYWNjZXNzb3JzIGRvIHRoZSByZXN0LgorICAgICh2b2lkKWFyZ19iZWdpbigpOworICAgICh2b2lkKWFyZ19lbmQoKTsKKyAgICAodm9pZClnY190cmFuc2l0aW9uX2FyZ3NfYmVnaW4oKTsKKyAgICAodm9pZClnY190cmFuc2l0aW9uX2FyZ3NfZW5kKCk7CisgICAgKHZvaWQpZGVvcHRfYmVnaW4oKTsKKyAgICAodm9pZClkZW9wdF9lbmQoKTsKKyAgICAodm9pZClnY19hcmdzX2JlZ2luKCk7CisgICAgKHZvaWQpZ2NfYXJnc19lbmQoKTsKKyAgfQorI2VuZGlmCit9OworCisvLy8gQSBzcGVjaWFsaXphdGlvbiBvZiBpdCdzIGJhc2UgY2xhc3MgZm9yIHJlYWQgb25seSBhY2Nlc3MKKy8vLyB0byBhIGdjLnN0YXRlcG9pbnQuCitjbGFzcyBJbW11dGFibGVTdGF0ZXBvaW50CisgICAgOiBwdWJsaWMgU3RhdGVwb2ludEJhc2U8Y29uc3QgRnVuY3Rpb24sIGNvbnN0IEluc3RydWN0aW9uLCBjb25zdCBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVDYWxsU2l0ZT4geworICB1c2luZyBCYXNlID0KKyAgICAgIFN0YXRlcG9pbnRCYXNlPGNvbnN0IEZ1bmN0aW9uLCBjb25zdCBJbnN0cnVjdGlvbiwgY29uc3QgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICBJbW11dGFibGVDYWxsU2l0ZT47CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgSW1tdXRhYmxlU3RhdGVwb2ludChjb25zdCBJbnN0cnVjdGlvbiAqSSkgOiBCYXNlKEkpIHt9CisgIGV4cGxpY2l0IEltbXV0YWJsZVN0YXRlcG9pbnQoSW1tdXRhYmxlQ2FsbFNpdGUgQ1MpIDogQmFzZShDUykge30KK307CisKKy8vLyBBIHNwZWNpYWxpemF0aW9uIG9mIGl0J3MgYmFzZSBjbGFzcyBmb3IgcmVhZC13cml0ZSBhY2Nlc3MKKy8vLyB0byBhIGdjLnN0YXRlcG9pbnQuCitjbGFzcyBTdGF0ZXBvaW50CisgICAgOiBwdWJsaWMgU3RhdGVwb2ludEJhc2U8RnVuY3Rpb24sIEluc3RydWN0aW9uLCBWYWx1ZSwgQ2FsbFNpdGU+IHsKKyAgdXNpbmcgQmFzZSA9IFN0YXRlcG9pbnRCYXNlPEZ1bmN0aW9uLCBJbnN0cnVjdGlvbiwgVmFsdWUsIENhbGxTaXRlPjsKKworcHVibGljOgorICBleHBsaWNpdCBTdGF0ZXBvaW50KEluc3RydWN0aW9uICpJKSA6IEJhc2UoSSkge30KKyAgZXhwbGljaXQgU3RhdGVwb2ludChDYWxsU2l0ZSBDUykgOiBCYXNlKENTKSB7fQorfTsKKworLy8vIENvbW1vbiBiYXNlIGNsYXNzIGZvciByZXByZXNlbnRpbmcgdmFsdWVzIHByb2plY3RlZCBmcm9tIGEgc3RhdGVwb2ludC4gIAorLy8vIEN1cnJlbnRseSwgdGhlIG9ubHkgcHJvamVjdGlvbnMgYXZhaWxhYmxlIGFyZSBnYy5yZXN1bHQgYW5kIGdjLnJlbG9jYXRlLgorY2xhc3MgR0NQcm9qZWN0aW9uSW5zdCA6IHB1YmxpYyBJbnRyaW5zaWNJbnN0IHsKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbnRyaW5zaWNJbnN0ICpJKSB7CisgICAgcmV0dXJuIEktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjpleHBlcmltZW50YWxfZ2NfcmVsb2NhdGUgfHwKKyAgICAgIEktPmdldEludHJpbnNpY0lEKCkgPT0gSW50cmluc2ljOjpleHBlcmltZW50YWxfZ2NfcmVzdWx0OworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW50cmluc2ljSW5zdD4oVikgJiYgY2xhc3NvZihjYXN0PEludHJpbnNpY0luc3Q+KFYpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlbG9jYXRlIGlzIHRpZWQgdG8gdGhlIGludm9rZSBzdGF0ZXBvaW50LgorICAvLy8gVGhpcyBpbmNsdWRlcyByZWxvY2F0ZXMgd2hpY2ggYXJlIG9uIHRoZSB1bndpbmRpbmcgcGF0aC4KKyAgYm9vbCBpc1RpZWRUb0ludm9rZSgpIGNvbnN0IHsKKyAgICBjb25zdCBWYWx1ZSAqVG9rZW4gPSBnZXRBcmdPcGVyYW5kKDApOworCisgICAgcmV0dXJuIGlzYTxMYW5kaW5nUGFkSW5zdD4oVG9rZW4pIHx8IGlzYTxJbnZva2VJbnN0PihUb2tlbik7CisgIH0KKworICAvLy8gVGhlIHN0YXRlcG9pbnQgd2l0aCB3aGljaCB0aGlzIGdjLnJlbG9jYXRlIGlzIGFzc29jaWF0ZWQuCisgIGNvbnN0IEluc3RydWN0aW9uICpnZXRTdGF0ZXBvaW50KCkgY29uc3QgeworICAgIGNvbnN0IFZhbHVlICpUb2tlbiA9IGdldEFyZ09wZXJhbmQoMCk7CisKKyAgICAvLyBUaGlzIHRha2VzIGNhcmUgYm90aCBvZiByZWxvY2F0ZXMgZm9yIGNhbGwgc3RhdGVwb2ludHMgYW5kIHJlbG9jYXRlcworICAgIC8vIG9uIG5vcm1hbCBwYXRoIG9mIGludm9rZSBzdGF0ZXBvaW50LgorICAgIGlmICghaXNhPExhbmRpbmdQYWRJbnN0PihUb2tlbikpIHsKKyAgICAgIGFzc2VydChpc1N0YXRlcG9pbnQoVG9rZW4pKTsKKyAgICAgIHJldHVybiBjYXN0PEluc3RydWN0aW9uPihUb2tlbik7CisgICAgfQorCisgICAgLy8gVGhpcyByZWxvY2F0ZSBpcyBvbiBleGNlcHRpb25hbCBwYXRoIG9mIGFuIGludm9rZSBzdGF0ZXBvaW50CisgICAgY29uc3QgQmFzaWNCbG9jayAqSW52b2tlQkIgPQorICAgICAgICBjYXN0PEluc3RydWN0aW9uPihUb2tlbiktPmdldFBhcmVudCgpLT5nZXRVbmlxdWVQcmVkZWNlc3NvcigpOworCisgICAgYXNzZXJ0KEludm9rZUJCICYmICJzYWZlcG9pbnRzIHNob3VsZCBoYXZlIHVuaXF1ZSBsYW5kaW5ncGFkcyIpOworICAgIGFzc2VydChJbnZva2VCQi0+Z2V0VGVybWluYXRvcigpICYmCisgICAgICAgICAgICJzYWZlcG9pbnQgYmxvY2sgc2hvdWxkIGJlIHdlbGwgZm9ybWVkIik7CisgICAgYXNzZXJ0KGlzU3RhdGVwb2ludChJbnZva2VCQi0+Z2V0VGVybWluYXRvcigpKSk7CisKKyAgICByZXR1cm4gSW52b2tlQkItPmdldFRlcm1pbmF0b3IoKTsKKyAgfQorfTsKKworLy8vIFJlcHJlc2VudHMgY2FsbHMgdG8gdGhlIGdjLnJlbG9jYXRlIGludHJpbnNpYy4KK2NsYXNzIEdDUmVsb2NhdGVJbnN0IDogcHVibGljIEdDUHJvamVjdGlvbkluc3QgeworcHVibGljOgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEludHJpbnNpY0luc3QgKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0SW50cmluc2ljSUQoKSA9PSBJbnRyaW5zaWM6OmV4cGVyaW1lbnRhbF9nY19yZWxvY2F0ZTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgIH0KKworICAvLy8gVGhlIGluZGV4IGludG8gdGhlIGFzc29jaWF0ZSBzdGF0ZXBvaW50J3MgYXJndW1lbnQgbGlzdAorICAvLy8gd2hpY2ggY29udGFpbnMgdGhlIGJhc2UgcG9pbnRlciBvZiB0aGUgcG9pbnRlciB3aG9zZQorICAvLy8gcmVsb2NhdGlvbiB0aGlzIGdjLnJlbG9jYXRlIGRlc2NyaWJlcy4KKyAgdW5zaWduZWQgZ2V0QmFzZVB0ckluZGV4KCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PENvbnN0YW50SW50PihnZXRBcmdPcGVyYW5kKDEpKS0+Z2V0WkV4dFZhbHVlKCk7CisgIH0KKworICAvLy8gVGhlIGluZGV4IGludG8gdGhlIGFzc29jaWF0ZSBzdGF0ZXBvaW50J3MgYXJndW1lbnQgbGlzdCB3aGljaAorICAvLy8gY29udGFpbnMgdGhlIHBvaW50ZXIgd2hvc2UgcmVsb2NhdGlvbiB0aGlzIGdjLnJlbG9jYXRlIGRlc2NyaWJlcy4KKyAgdW5zaWduZWQgZ2V0RGVyaXZlZFB0ckluZGV4KCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PENvbnN0YW50SW50PihnZXRBcmdPcGVyYW5kKDIpKS0+Z2V0WkV4dFZhbHVlKCk7CisgIH0KKworICBWYWx1ZSAqZ2V0QmFzZVB0cigpIGNvbnN0IHsKKyAgICBJbW11dGFibGVDYWxsU2l0ZSBDUyhnZXRTdGF0ZXBvaW50KCkpOworICAgIHJldHVybiAqKENTLmFyZ19iZWdpbigpICsgZ2V0QmFzZVB0ckluZGV4KCkpOworICB9CisKKyAgVmFsdWUgKmdldERlcml2ZWRQdHIoKSBjb25zdCB7CisgICAgSW1tdXRhYmxlQ2FsbFNpdGUgQ1MoZ2V0U3RhdGVwb2ludCgpKTsKKyAgICByZXR1cm4gKihDUy5hcmdfYmVnaW4oKSArIGdldERlcml2ZWRQdHJJbmRleCgpKTsKKyAgfQorfTsKKworLy8vIFJlcHJlc2VudHMgY2FsbHMgdG8gdGhlIGdjLnJlc3VsdCBpbnRyaW5zaWMuCitjbGFzcyBHQ1Jlc3VsdEluc3QgOiBwdWJsaWMgR0NQcm9qZWN0aW9uSW5zdCB7CitwdWJsaWM6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW50cmluc2ljSW5zdCAqSSkgeworICAgIHJldHVybiBJLT5nZXRJbnRyaW5zaWNJRCgpID09IEludHJpbnNpYzo6ZXhwZXJpbWVudGFsX2djX3Jlc3VsdDsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gaXNhPEludHJpbnNpY0luc3Q+KFYpICYmIGNsYXNzb2YoY2FzdDxJbnRyaW5zaWNJbnN0PihWKSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGdW5UeSwgdHlwZW5hbWUgSW5zdHJ1Y3Rpb25UeSwgdHlwZW5hbWUgVmFsdWVUeSwKKyAgICAgICAgICB0eXBlbmFtZSBDYWxsU2l0ZVR5Pgorc3RkOjp2ZWN0b3I8Y29uc3QgR0NSZWxvY2F0ZUluc3QgKj4KK1N0YXRlcG9pbnRCYXNlPEZ1blR5LCBJbnN0cnVjdGlvblR5LCBWYWx1ZVR5LCBDYWxsU2l0ZVR5Pjo6Z2V0UmVsb2NhdGVzKCkKKyAgICBjb25zdCB7CisKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgR0NSZWxvY2F0ZUluc3QgKj4gUmVzdWx0OworCisgIENhbGxTaXRlVHkgU3RhdGVwb2ludENTID0gZ2V0Q2FsbFNpdGUoKTsKKworICAvLyBTZWFyY2ggZm9yIHJlbG9jYXRlZCBwb2ludGVycy4gIE5vdGUgdGhhdCB3b3JraW5nIGJhY2t3YXJkcyBmcm9tIHRoZQorICAvLyBnY19yZWxvY2F0ZXMgZW5zdXJlcyB0aGF0IHdlIG9ubHkgZ2V0IHBhaXJzIHdoaWNoIGFyZSBhY3R1YWxseSByZWxvY2F0ZWQKKyAgLy8gYW5kIHVzZWQgYWZ0ZXIgdGhlIHN0YXRlcG9pbnQuCisgIGZvciAoY29uc3QgVXNlciAqVSA6IGdldEluc3RydWN0aW9uKCktPnVzZXJzKCkpCisgICAgaWYgKGF1dG8gKlJlbG9jYXRlID0gZHluX2Nhc3Q8R0NSZWxvY2F0ZUluc3Q+KFUpKQorICAgICAgUmVzdWx0LnB1c2hfYmFjayhSZWxvY2F0ZSk7CisKKyAgaWYgKCFTdGF0ZXBvaW50Q1MuaXNJbnZva2UoKSkKKyAgICByZXR1cm4gUmVzdWx0OworCisgIC8vIFdlIG5lZWQgdG8gc2NhbiB0aG9yb3VnaCBleGNlcHRpb25hbCByZWxvY2F0aW9ucyBpZiBpdCBpcyBpbnZva2Ugc3RhdGVwb2ludAorICBMYW5kaW5nUGFkSW5zdCAqTGFuZGluZ1BhZCA9CisgICAgICBjYXN0PEludm9rZUluc3Q+KGdldEluc3RydWN0aW9uKCkpLT5nZXRMYW5kaW5nUGFkSW5zdCgpOworCisgIC8vIFNlYXJjaCBmb3IgZ2MgcmVsb2NhdGVzIHRoYXQgYXJlIGF0dGFjaGVkIHRvIHRoaXMgbGFuZGluZ3BhZC4KKyAgZm9yIChjb25zdCBVc2VyICpMYW5kaW5nUGFkVXNlciA6IExhbmRpbmdQYWQtPnVzZXJzKCkpIHsKKyAgICBpZiAoYXV0byAqUmVsb2NhdGUgPSBkeW5fY2FzdDxHQ1JlbG9jYXRlSW5zdD4oTGFuZGluZ1BhZFVzZXIpKQorICAgICAgUmVzdWx0LnB1c2hfYmFjayhSZWxvY2F0ZSk7CisgIH0KKyAgcmV0dXJuIFJlc3VsdDsKK30KKworLy8vIENhbGwgc2l0ZXMgdGhhdCBnZXQgd3JhcHBlZCBieSBhIGdjLnN0YXRlcG9pbnQgKGN1cnJlbnRseSBvbmx5IGluCisvLy8gUmV3cml0ZVN0YXRlcG9pbnRzRm9yR0MgYW5kIHBvdGVudGlhbGx5IGluIG90aGVyIHBhc3NlcyBpbiB0aGUgZnV0dXJlKSBjYW4KKy8vLyBoYXZlIGF0dHJpYnV0ZXMgdGhhdCBkZXNjcmliZSBwcm9wZXJ0aWVzIG9mIGdjLnN0YXRlcG9pbnQgY2FsbCB0aGV5IHdpbGwgYmUKKy8vLyBldmVudHVhbGx5IGJlIHdyYXBwZWQgaW4uICBUaGlzIHN0cnVjdCBpcyB1c2VkIHJlcHJlc2VudCBzdWNoIGRpcmVjdGl2ZXMuCitzdHJ1Y3QgU3RhdGVwb2ludERpcmVjdGl2ZXMgeworICBPcHRpb25hbDx1aW50MzJfdD4gTnVtUGF0Y2hCeXRlczsKKyAgT3B0aW9uYWw8dWludDY0X3Q+IFN0YXRlcG9pbnRJRDsKKworICBzdGF0aWMgY29uc3QgdWludDY0X3QgRGVmYXVsdFN0YXRlcG9pbnRJRCA9IDB4QUJDREVGMDA7CisgIHN0YXRpYyBjb25zdCB1aW50NjRfdCBEZW9wdEJ1bmRsZVN0YXRlcG9pbnRJRCA9IDB4QUJDREVGMEY7Cit9OworCisvLy8gUGFyc2Ugb3V0IHN0YXRlcG9pbnQgZGlyZWN0aXZlcyBmcm9tIHRoZSBmdW5jdGlvbiBhdHRyaWJ1dGVzIHByZXNlbnQgaW4gXHAKKy8vLyBBUy4KK1N0YXRlcG9pbnREaXJlY3RpdmVzIHBhcnNlU3RhdGVwb2ludERpcmVjdGl2ZXNGcm9tQXR0cnMoQXR0cmlidXRlTGlzdCBBUyk7CisKKy8vLyBSZXR1cm4gXGMgdHJ1ZSBpZiB0aGUgXHAgQXR0ciBpcyBhbiBhdHRyaWJ1dGUgdGhhdCBpcyBhIHN0YXRlcG9pbnQKKy8vLyBkaXJlY3RpdmUuCitib29sIGlzU3RhdGVwb2ludERpcmVjdGl2ZUF0dHIoQXR0cmlidXRlIEF0dHIpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9TVEFURVBPSU5UX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvU3ltYm9sVGFibGVMaXN0VHJhaXRzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1N5bWJvbFRhYmxlTGlzdFRyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg3Y2U5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1N5bWJvbFRhYmxlTGlzdFRyYWl0cy5oCkBAIC0wLDAgKzEsMTE4IEBACisvLz09PS0gbGx2bS9TeW1ib2xUYWJsZUxpc3RUcmFpdHMuaCAtIFRyYWl0cyBmb3IgaXBsaXN0IC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgZ2VuZXJpYyBjbGFzcyB0aGF0IGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBhdXRvbWF0aWMKKy8vIHN5bWJvbCB0YWJsZSBtYW5pcHVsYXRpb24gdGhhdCBvY2N1cnMgd2hlbiB5b3UgcHV0IChmb3IgZXhhbXBsZSkgYSBuYW1lZAorLy8gaW5zdHJ1Y3Rpb24gaW50byBhIGJhc2ljIGJsb2NrLgorLy8KKy8vIFRoZSB3YXkgdGhhdCB0aGlzIGlzIGltcGxlbWVudGVkIGlzIGJ5IHVzaW5nIGEgc3BlY2lhbCB0cmFpdHMgY2xhc3Mgd2l0aCB0aGUKKy8vIGludHJ1c2l2ZSBsaXN0IHRoYXQgbWFrZXMgdXAgdGhlIGxpc3Qgb2YgaW5zdHJ1Y3Rpb25zIGluIGEgYmFzaWMgYmxvY2suICBXaGVuCisvLyBhIG5ldyBlbGVtZW50IGlzIGFkZGVkIHRvIHRoZSBsaXN0IG9mIGluc3RydWN0aW9ucywgdGhlIHRyYWl0cyBjbGFzcyBpcworLy8gbm90aWZpZWQsIGFsbG93aW5nIHRoZSBzeW1ib2wgdGFibGUgdG8gYmUgdXBkYXRlZC4KKy8vCisvLyBUaGlzIGdlbmVyaWMgY2xhc3MgaW1wbGVtZW50cyB0aGUgdHJhaXRzIGNsYXNzLiAgSXQgbXVzdCBiZSBnZW5lcmljIHNvIHRoYXQKKy8vIGl0IGNhbiB3b3JrIGZvciBhbGwgdXNlcyBpdCwgd2hpY2ggaW5jbHVkZSBsaXN0cyBvZiBpbnN0cnVjdGlvbnMsIGJhc2ljCisvLyBibG9ja3MsIGFyZ3VtZW50cywgZnVuY3Rpb25zLCBnbG9iYWwgdmFyaWFibGVzLCBldGMuLi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfU1lNQk9MVEFCTEVMSVNUVFJBSVRTX0gKKyNkZWZpbmUgTExWTV9JUl9TWU1CT0xUQUJMRUxJU1RUUkFJVFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3QuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9zaW1wbGVfaWxpc3QuaCIKKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFyZ3VtZW50OworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgR2xvYmFsQWxpYXM7CitjbGFzcyBHbG9iYWxJRnVuYzsKK2NsYXNzIEdsb2JhbFZhcmlhYmxlOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBNb2R1bGU7CitjbGFzcyBWYWx1ZVN5bWJvbFRhYmxlOworCisvLy8gVGVtcGxhdGUgbWV0YWZ1bmN0aW9uIHRvIGdldCB0aGUgcGFyZW50IHR5cGUgZm9yIGEgc3ltYm9sIHRhYmxlIGxpc3QuCisvLy8KKy8vLyBJbXBsZW1lbnRhdGlvbnMgY3JlYXRlIGEgdHlwZWRlZiBjYWxsZWQgXGMgdHlwZSBzbyB0aGF0IHdlIG9ubHkgbmVlZCBhCisvLy8gc2luZ2xlIHRlbXBsYXRlIHBhcmFtZXRlciBmb3IgdGhlIGxpc3QgYW5kIHRyYWl0cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVHk+IHN0cnVjdCBTeW1ib2xUYWJsZUxpc3RQYXJlbnRUeXBlIHt9OworCisjZGVmaW5lIERFRklORV9TWU1CT0xfVEFCTEVfUEFSRU5UX1RZUEUoTk9ERSwgUEFSRU5UKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU3ltYm9sVGFibGVMaXN0UGFyZW50VHlwZTxOT0RFPiB7IHVzaW5nIHR5cGUgPSBQQVJFTlQ7IH07CitERUZJTkVfU1lNQk9MX1RBQkxFX1BBUkVOVF9UWVBFKEluc3RydWN0aW9uLCBCYXNpY0Jsb2NrKQorREVGSU5FX1NZTUJPTF9UQUJMRV9QQVJFTlRfVFlQRShCYXNpY0Jsb2NrLCBGdW5jdGlvbikKK0RFRklORV9TWU1CT0xfVEFCTEVfUEFSRU5UX1RZUEUoQXJndW1lbnQsIEZ1bmN0aW9uKQorREVGSU5FX1NZTUJPTF9UQUJMRV9QQVJFTlRfVFlQRShGdW5jdGlvbiwgTW9kdWxlKQorREVGSU5FX1NZTUJPTF9UQUJMRV9QQVJFTlRfVFlQRShHbG9iYWxWYXJpYWJsZSwgTW9kdWxlKQorREVGSU5FX1NZTUJPTF9UQUJMRV9QQVJFTlRfVFlQRShHbG9iYWxBbGlhcywgTW9kdWxlKQorREVGSU5FX1NZTUJPTF9UQUJMRV9QQVJFTlRfVFlQRShHbG9iYWxJRnVuYywgTW9kdWxlKQorI3VuZGVmIERFRklORV9TWU1CT0xfVEFCTEVfUEFSRU5UX1RZUEUKKwordGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVUeT4gY2xhc3MgU3ltYm9sVGFibGVMaXN0OworCisvLyBWYWx1ZVN1YkNsYXNzICAgLSBUaGUgdHlwZSBvZiBvYmplY3RzIHRoYXQgSSBob2xkLCBlLmcuIEluc3RydWN0aW9uLgorLy8gSXRlbVBhcmVudENsYXNzIC0gVGhlIHR5cGUgb2Ygb2JqZWN0IHRoYXQgb3ducyB0aGUgbGlzdCwgZS5nLiBCYXNpY0Jsb2NrLgorLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVN1YkNsYXNzPgorY2xhc3MgU3ltYm9sVGFibGVMaXN0VHJhaXRzIDogcHVibGljIGlsaXN0X2FsbG9jX3RyYWl0czxWYWx1ZVN1YkNsYXNzPiB7CisgIHVzaW5nIExpc3RUeSA9IFN5bWJvbFRhYmxlTGlzdDxWYWx1ZVN1YkNsYXNzPjsKKyAgdXNpbmcgaXRlcmF0b3IgPSB0eXBlbmFtZSBzaW1wbGVfaWxpc3Q8VmFsdWVTdWJDbGFzcz46Oml0ZXJhdG9yOworICB1c2luZyBJdGVtUGFyZW50Q2xhc3MgPQorICAgICAgdHlwZW5hbWUgU3ltYm9sVGFibGVMaXN0UGFyZW50VHlwZTxWYWx1ZVN1YkNsYXNzPjo6dHlwZTsKKworcHVibGljOgorICBTeW1ib2xUYWJsZUxpc3RUcmFpdHMoKSA9IGRlZmF1bHQ7CisKK3ByaXZhdGU6CisgIC8vLyBnZXRMaXN0T3duZXIgLSBSZXR1cm4gdGhlIG9iamVjdCB0aGF0IG93bnMgdGhpcyBsaXN0LiAgSWYgdGhpcyBpcyBhIGxpc3QKKyAgLy8vIG9mIGluc3RydWN0aW9ucywgaXQgcmV0dXJucyB0aGUgQmFzaWNCbG9jayB0aGF0IG93bnMgdGhlbS4KKyAgSXRlbVBhcmVudENsYXNzICpnZXRMaXN0T3duZXIoKSB7CisgICAgc2l6ZV90IE9mZnNldChzaXplX3QoJigoSXRlbVBhcmVudENsYXNzKiludWxscHRyLT4qSXRlbVBhcmVudENsYXNzOjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFN1Ymxpc3RBY2Nlc3Moc3RhdGljX2Nhc3Q8VmFsdWVTdWJDbGFzcyo+KG51bGxwdHIpKSkpKTsKKyAgICBMaXN0VHkgKkFuY2hvcihzdGF0aWNfY2FzdDxMaXN0VHkgKj4odGhpcykpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PEl0ZW1QYXJlbnRDbGFzcyo+KHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KEFuY2hvciktCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2Zmc2V0KTsKKyAgfQorCisgIHN0YXRpYyBMaXN0VHkgJmdldExpc3QoSXRlbVBhcmVudENsYXNzICpQYXIpIHsKKyAgICByZXR1cm4gUGFyLT4qKFBhci0+Z2V0U3VibGlzdEFjY2VzcygoVmFsdWVTdWJDbGFzcyopbnVsbHB0cikpOworICB9CisKKyAgc3RhdGljIFZhbHVlU3ltYm9sVGFibGUgKmdldFN5bVRhYihJdGVtUGFyZW50Q2xhc3MgKlBhcikgeworICAgIHJldHVybiBQYXIgPyB0b1B0cihQYXItPmdldFZhbHVlU3ltYm9sVGFibGUoKSkgOiBudWxscHRyOworICB9CisKK3B1YmxpYzoKKyAgdm9pZCBhZGROb2RlVG9MaXN0KFZhbHVlU3ViQ2xhc3MgKlYpOworICB2b2lkIHJlbW92ZU5vZGVGcm9tTGlzdChWYWx1ZVN1YkNsYXNzICpWKTsKKyAgdm9pZCB0cmFuc2Zlck5vZGVzRnJvbUxpc3QoU3ltYm9sVGFibGVMaXN0VHJhaXRzICZMMiwgaXRlcmF0b3IgZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXJhdG9yIGxhc3QpOworICAvLyBwcml2YXRlOgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUUHRyPgorICB2b2lkIHNldFN5bVRhYk9iamVjdChUUHRyICosIFRQdHIpOworICBzdGF0aWMgVmFsdWVTeW1ib2xUYWJsZSAqdG9QdHIoVmFsdWVTeW1ib2xUYWJsZSAqUCkgeyByZXR1cm4gUDsgfQorICBzdGF0aWMgVmFsdWVTeW1ib2xUYWJsZSAqdG9QdHIoVmFsdWVTeW1ib2xUYWJsZSAmUikgeyByZXR1cm4gJlI7IH0KK307CisKKy8vLyBMaXN0IHRoYXQgYXV0b21hdGljYWxseSB1cGRhdGVzIHBhcmVudCBsaW5rcyBhbmQgc3ltYm9sIHRhYmxlcy4KKy8vLworLy8vIFdoZW4gbm9kZXMgYXJlIGluc2VydGVkIGludG8gYW5kIHJlbW92ZWQgZnJvbSB0aGlzIGxpc3QsIHRoZSBhc3NvY2lhdGVkCisvLy8gc3ltYm9sIHRhYmxlIHdpbGwgYmUgYXV0b21hdGljYWxseSB1cGRhdGVkLiAgU2ltaWxhcmx5LCBwYXJlbnQgbGlua3MgZ2V0CisvLy8gdXBkYXRlZCBhdXRvbWF0aWNhbGx5LgordGVtcGxhdGUgPGNsYXNzIFQ+CitjbGFzcyBTeW1ib2xUYWJsZUxpc3QKKyAgICA6IHB1YmxpYyBpcGxpc3RfaW1wbDxzaW1wbGVfaWxpc3Q8VD4sIFN5bWJvbFRhYmxlTGlzdFRyYWl0czxUPj4ge307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX1NZTUJPTFRBQkxFTElTVFRSQUlUU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1RyYWNraW5nTURSZWYuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVHJhY2tpbmdNRFJlZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkZWM5MDQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1RyYWNraW5nTURSZWYuaApAQCAtMCwwICsxLDE3OCBAQAorLy89PT0tIGxsdm0vSVIvVHJhY2tpbmdNRFJlZi5oIC0gVHJhY2tpbmcgTWV0YWRhdGEgcmVmZXJlbmNlcyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBSZWZlcmVuY2VzIHRvIG1ldGFkYXRhIHRoYXQgdHJhY2sgUkFVVy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfVFJBQ0tJTkdNRFJFRl9ICisjZGVmaW5lIExMVk1fSVJfVFJBQ0tJTkdNRFJFRl9ICisKKyNpbmNsdWRlICJsbHZtL0lSL01ldGFkYXRhLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFxicmllZiBUcmFja2luZyBtZXRhZGF0YSByZWZlcmVuY2UuCisvLy8KKy8vLyBUaGlzIGNsYXNzIGJlaGF2ZXMgbGlrZSBcYSBUcmFja2luZ1ZILCBidXQgZm9yIG1ldGFkYXRhLgorY2xhc3MgVHJhY2tpbmdNRFJlZiB7CisgIE1ldGFkYXRhICpNRCA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgVHJhY2tpbmdNRFJlZigpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgVHJhY2tpbmdNRFJlZihNZXRhZGF0YSAqTUQpIDogTUQoTUQpIHsgdHJhY2soKTsgfQorCisgIFRyYWNraW5nTURSZWYoVHJhY2tpbmdNRFJlZiAmJlgpIDogTUQoWC5NRCkgeyByZXRyYWNrKFgpOyB9CisgIFRyYWNraW5nTURSZWYoY29uc3QgVHJhY2tpbmdNRFJlZiAmWCkgOiBNRChYLk1EKSB7IHRyYWNrKCk7IH0KKworICBUcmFja2luZ01EUmVmICZvcGVyYXRvcj0oVHJhY2tpbmdNRFJlZiAmJlgpIHsKKyAgICBpZiAoJlggPT0gdGhpcykKKyAgICAgIHJldHVybiAqdGhpczsKKworICAgIHVudHJhY2soKTsKKyAgICBNRCA9IFguTUQ7CisgICAgcmV0cmFjayhYKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUcmFja2luZ01EUmVmICZvcGVyYXRvcj0oY29uc3QgVHJhY2tpbmdNRFJlZiAmWCkgeworICAgIGlmICgmWCA9PSB0aGlzKQorICAgICAgcmV0dXJuICp0aGlzOworCisgICAgdW50cmFjaygpOworICAgIE1EID0gWC5NRDsKKyAgICB0cmFjaygpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIH5UcmFja2luZ01EUmVmKCkgeyB1bnRyYWNrKCk7IH0KKworICBNZXRhZGF0YSAqZ2V0KCkgY29uc3QgeyByZXR1cm4gTUQ7IH0KKyAgb3BlcmF0b3IgTWV0YWRhdGEgKigpIGNvbnN0IHsgcmV0dXJuIGdldCgpOyB9CisgIE1ldGFkYXRhICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gZ2V0KCk7IH0KKyAgTWV0YWRhdGEgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpnZXQoKTsgfQorCisgIHZvaWQgcmVzZXQoKSB7CisgICAgdW50cmFjaygpOworICAgIE1EID0gbnVsbHB0cjsKKyAgfQorICB2b2lkIHJlc2V0KE1ldGFkYXRhICpNRCkgeworICAgIHVudHJhY2soKTsKKyAgICB0aGlzLT5NRCA9IE1EOworICAgIHRyYWNrKCk7CisgIH0KKworICAvLy8gXGJyaWVmIENoZWNrIHdoZXRoZXIgdGhpcyBoYXMgYSB0cml2aWFsIGRlc3RydWN0b3IuCisgIC8vLworICAvLy8gSWYgXGMgTUQgaXNuJ3QgcmVwbGFjZWFibGUsIHRoZSBkZXN0cnVjdG9yIHdpbGwgYmUgYSBuby1vcC4KKyAgYm9vbCBoYXNUcml2aWFsRGVzdHJ1Y3RvcigpIGNvbnN0IHsKKyAgICByZXR1cm4gIU1EIHx8ICFNZXRhZGF0YVRyYWNraW5nOjppc1JlcGxhY2VhYmxlKCpNRCk7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgVHJhY2tpbmdNRFJlZiAmWCkgY29uc3QgeyByZXR1cm4gTUQgPT0gWC5NRDsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgVHJhY2tpbmdNRFJlZiAmWCkgY29uc3QgeyByZXR1cm4gTUQgIT0gWC5NRDsgfQorCitwcml2YXRlOgorICB2b2lkIHRyYWNrKCkgeworICAgIGlmIChNRCkKKyAgICAgIE1ldGFkYXRhVHJhY2tpbmc6OnRyYWNrKE1EKTsKKyAgfQorCisgIHZvaWQgdW50cmFjaygpIHsKKyAgICBpZiAoTUQpCisgICAgICBNZXRhZGF0YVRyYWNraW5nOjp1bnRyYWNrKE1EKTsKKyAgfQorCisgIHZvaWQgcmV0cmFjayhUcmFja2luZ01EUmVmICZYKSB7CisgICAgYXNzZXJ0KE1EID09IFguTUQgJiYgIkV4cGVjdGVkIHZhbHVlcyB0byBtYXRjaCIpOworICAgIGlmIChYLk1EKSB7CisgICAgICBNZXRhZGF0YVRyYWNraW5nOjpyZXRyYWNrKFguTUQsIE1EKTsKKyAgICAgIFguTUQgPSBudWxscHRyOworICAgIH0KKyAgfQorfTsKKworLy8vIFxicmllZiBUeXBlZCB0cmFja2luZyByZWYuCisvLy8KKy8vLyBUcmFjayByZWZlcmVyZW5jZXMgb2YgYSBwYXJ0aWN1bGFyIHR5cGUuICBJdCdzIHVzZWZ1bCB0byB1c2UgdGhpcyBmb3IgXGEKKy8vLyBNRE5vZGUgYW5kIFxhIFZhbHVlQXNNZXRhZGF0YS4KK3RlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBUeXBlZFRyYWNraW5nTURSZWYgeworICBUcmFja2luZ01EUmVmIFJlZjsKKworcHVibGljOgorICBUeXBlZFRyYWNraW5nTURSZWYoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IFR5cGVkVHJhY2tpbmdNRFJlZihUICpNRCkgOiBSZWYoc3RhdGljX2Nhc3Q8TWV0YWRhdGEgKj4oTUQpKSB7fQorCisgIFR5cGVkVHJhY2tpbmdNRFJlZihUeXBlZFRyYWNraW5nTURSZWYgJiZYKSA6IFJlZihzdGQ6Om1vdmUoWC5SZWYpKSB7fQorICBUeXBlZFRyYWNraW5nTURSZWYoY29uc3QgVHlwZWRUcmFja2luZ01EUmVmICZYKSA6IFJlZihYLlJlZikge30KKworICBUeXBlZFRyYWNraW5nTURSZWYgJm9wZXJhdG9yPShUeXBlZFRyYWNraW5nTURSZWYgJiZYKSB7CisgICAgUmVmID0gc3RkOjptb3ZlKFguUmVmKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUeXBlZFRyYWNraW5nTURSZWYgJm9wZXJhdG9yPShjb25zdCBUeXBlZFRyYWNraW5nTURSZWYgJlgpIHsKKyAgICBSZWYgPSBYLlJlZjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBUICpnZXQoKSBjb25zdCB7IHJldHVybiAoVCAqKVJlZi5nZXQoKTsgfQorICBvcGVyYXRvciBUICooKSBjb25zdCB7IHJldHVybiBnZXQoKTsgfQorICBUICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gZ2V0KCk7IH0KKyAgVCAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKmdldCgpOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFR5cGVkVHJhY2tpbmdNRFJlZiAmWCkgY29uc3QgeyByZXR1cm4gUmVmID09IFguUmVmOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBUeXBlZFRyYWNraW5nTURSZWYgJlgpIGNvbnN0IHsgcmV0dXJuIFJlZiAhPSBYLlJlZjsgfQorCisgIHZvaWQgcmVzZXQoKSB7IFJlZi5yZXNldCgpOyB9CisgIHZvaWQgcmVzZXQoVCAqTUQpIHsgUmVmLnJlc2V0KHN0YXRpY19jYXN0PE1ldGFkYXRhICo+KE1EKSk7IH0KKworICAvLy8gXGJyaWVmIENoZWNrIHdoZXRoZXIgdGhpcyBoYXMgYSB0cml2aWFsIGRlc3RydWN0b3IuCisgIGJvb2wgaGFzVHJpdmlhbERlc3RydWN0b3IoKSBjb25zdCB7IHJldHVybiBSZWYuaGFzVHJpdmlhbERlc3RydWN0b3IoKTsgfQorfTsKKwordXNpbmcgVHJhY2tpbmdNRE5vZGVSZWYgPSBUeXBlZFRyYWNraW5nTURSZWY8TUROb2RlPjsKK3VzaW5nIFRyYWNraW5nVmFsdWVBc01ldGFkYXRhUmVmID0gVHlwZWRUcmFja2luZ01EUmVmPFZhbHVlQXNNZXRhZGF0YT47CisKKy8vIEV4cG9zZSB0aGUgdW5kZXJseWluZyBtZXRhZGF0YSB0byBjYXN0aW5nLgordGVtcGxhdGUgPD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8VHJhY2tpbmdNRFJlZj4geworICB1c2luZyBTaW1wbGVUeXBlID0gTWV0YWRhdGEgKjsKKworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoVHJhY2tpbmdNRFJlZiAmTUQpIHsgcmV0dXJuIE1ELmdldCgpOyB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxjb25zdCBUcmFja2luZ01EUmVmPiB7CisgIHVzaW5nIFNpbXBsZVR5cGUgPSBNZXRhZGF0YSAqOworCisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShjb25zdCBUcmFja2luZ01EUmVmICZNRCkgeworICAgIHJldHVybiBNRC5nZXQoKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBzaW1wbGlmeV90eXBlPFR5cGVkVHJhY2tpbmdNRFJlZjxUPj4geworICB1c2luZyBTaW1wbGVUeXBlID0gVCAqOworCisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShUeXBlZFRyYWNraW5nTURSZWY8VD4gJk1EKSB7CisgICAgcmV0dXJuIE1ELmdldCgpOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8Y29uc3QgVHlwZWRUcmFja2luZ01EUmVmPFQ+PiB7CisgIHVzaW5nIFNpbXBsZVR5cGUgPSBUICo7CisKKyAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKGNvbnN0IFR5cGVkVHJhY2tpbmdNRFJlZjxUPiAmTUQpIHsKKyAgICByZXR1cm4gTUQuZ2V0KCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX1RSQUNLSU5HTURSRUZfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9UeXBlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1R5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWE3OTc2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9UeXBlLmgKQEAgLTAsMCArMSw1MDQgQEAKKy8vPT09LSBsbHZtL1R5cGUuaCAtIENsYXNzZXMgZm9yIGhhbmRsaW5nIGRhdGEgdHlwZXMgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgVHlwZSBjbGFzcy4gIEZvciBtb3JlICJUeXBlIgorLy8gc3R1ZmYsIGxvb2sgaW4gRGVyaXZlZFR5cGVzLmguCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX1RZUEVfSAorI2RlZmluZSBMTFZNX0lSX1RZUEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQVBGbG9hdC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0JpbmRpbmdXcmFwcGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGU8Y2xhc3MgR3JhcGhUeXBlPiBzdHJ1Y3QgR3JhcGhUcmFpdHM7CitjbGFzcyBJbnRlZ2VyVHlwZTsKK2NsYXNzIExMVk1Db250ZXh0OworY2xhc3MgUG9pbnRlclR5cGU7CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFN0cmluZ1JlZjsKKworLy8vIFRoZSBpbnN0YW5jZXMgb2YgdGhlIFR5cGUgY2xhc3MgYXJlIGltbXV0YWJsZTogb25jZSB0aGV5IGFyZSBjcmVhdGVkLAorLy8vIHRoZXkgYXJlIG5ldmVyIGNoYW5nZWQuICBBbHNvIG5vdGUgdGhhdCBvbmx5IG9uZSBpbnN0YW5jZSBvZiBhIHBhcnRpY3VsYXIKKy8vLyB0eXBlIGlzIGV2ZXIgY3JlYXRlZC4gIFRodXMgc2VlaW5nIGlmIHR3byB0eXBlcyBhcmUgZXF1YWwgaXMgYSBtYXR0ZXIgb2YKKy8vLyBkb2luZyBhIHRyaXZpYWwgcG9pbnRlciBjb21wYXJpc29uLiBUbyBlbmZvcmNlIHRoYXQgbm8gdHdvIGVxdWFsIGluc3RhbmNlcworLy8vIGFyZSBjcmVhdGVkLCBUeXBlIGluc3RhbmNlcyBjYW4gb25seSBiZSBjcmVhdGVkIHZpYSBzdGF0aWMgZmFjdG9yeSBtZXRob2RzCisvLy8gaW4gY2xhc3MgVHlwZSBhbmQgaW4gZGVyaXZlZCBjbGFzc2VzLiAgT25jZSBhbGxvY2F0ZWQsIFR5cGVzIGFyZSBuZXZlcgorLy8vIGZyZWUnZC4KKy8vLworY2xhc3MgVHlwZSB7CitwdWJsaWM6CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLy8gRGVmaW5pdGlvbnMgb2YgYWxsIG9mIHRoZSBiYXNlIHR5cGVzIGZvciB0aGUgVHlwZSBzeXN0ZW0uICBCYXNlZCBvbiB0aGlzCisgIC8vLyB2YWx1ZSwgeW91IGNhbiBjYXN0IHRvIGEgY2xhc3MgZGVmaW5lZCBpbiBEZXJpdmVkVHlwZXMuaC4KKyAgLy8vIE5vdGU6IElmIHlvdSBhZGQgYW4gZWxlbWVudCB0byB0aGlzLCB5b3UgbmVlZCB0byBhZGQgYW4gZWxlbWVudCB0byB0aGUKKyAgLy8vIFR5cGU6OmdldFByaW1pdGl2ZVR5cGUgZnVuY3Rpb24sIG9yIGVsc2UgdGhpbmdzIHdpbGwgYnJlYWshCisgIC8vLyBBbHNvIHVwZGF0ZSBMTFZNVHlwZUtpbmQgYW5kIExMVk1HZXRUeXBlS2luZCAoKSBpbiB0aGUgQyBiaW5kaW5nLgorICAvLy8KKyAgZW51bSBUeXBlSUQgeworICAgIC8vIFByaW1pdGl2ZVR5cGVzIC0gbWFrZSBzdXJlIExhc3RQcmltaXRpdmVUeUlEIHN0YXlzIHVwIHRvIGRhdGUuCisgICAgVm9pZFR5SUQgPSAwLCAgICAvLy88ICAwOiB0eXBlIHdpdGggbm8gc2l6ZQorICAgIEhhbGZUeUlELCAgICAgICAgLy8vPCAgMTogMTYtYml0IGZsb2F0aW5nIHBvaW50IHR5cGUKKyAgICBGbG9hdFR5SUQsICAgICAgIC8vLzwgIDI6IDMyLWJpdCBmbG9hdGluZyBwb2ludCB0eXBlCisgICAgRG91YmxlVHlJRCwgICAgICAvLy88ICAzOiA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgdHlwZQorICAgIFg4Nl9GUDgwVHlJRCwgICAgLy8vPCAgNDogODAtYml0IGZsb2F0aW5nIHBvaW50IHR5cGUgKFg4NykKKyAgICBGUDEyOFR5SUQsICAgICAgIC8vLzwgIDU6IDEyOC1iaXQgZmxvYXRpbmcgcG9pbnQgdHlwZSAoMTEyLWJpdCBtYW50aXNzYSkKKyAgICBQUENfRlAxMjhUeUlELCAgIC8vLzwgIDY6IDEyOC1iaXQgZmxvYXRpbmcgcG9pbnQgdHlwZSAodHdvIDY0LWJpdHMsIFBvd2VyUEMpCisgICAgTGFiZWxUeUlELCAgICAgICAvLy88ICA3OiBMYWJlbHMKKyAgICBNZXRhZGF0YVR5SUQsICAgIC8vLzwgIDg6IE1ldGFkYXRhCisgICAgWDg2X01NWFR5SUQsICAgICAvLy88ICA5OiBNTVggdmVjdG9ycyAoNjQgYml0cywgWDg2IHNwZWNpZmljKQorICAgIFRva2VuVHlJRCwgICAgICAgLy8vPCAxMDogVG9rZW5zCisKKyAgICAvLyBEZXJpdmVkIHR5cGVzLi4uIHNlZSBEZXJpdmVkVHlwZXMuaCBmaWxlLgorICAgIC8vIE1ha2Ugc3VyZSBGaXJzdERlcml2ZWRUeUlEIHN0YXlzIHVwIHRvIGRhdGUhCisgICAgSW50ZWdlclR5SUQsICAgICAvLy88IDExOiBBcmJpdHJhcnkgYml0IHdpZHRoIGludGVnZXJzCisgICAgRnVuY3Rpb25UeUlELCAgICAvLy88IDEyOiBGdW5jdGlvbnMKKyAgICBTdHJ1Y3RUeUlELCAgICAgIC8vLzwgMTM6IFN0cnVjdHVyZXMKKyAgICBBcnJheVR5SUQsICAgICAgIC8vLzwgMTQ6IEFycmF5cworICAgIFBvaW50ZXJUeUlELCAgICAgLy8vPCAxNTogUG9pbnRlcnMKKyAgICBWZWN0b3JUeUlEICAgICAgIC8vLzwgMTY6IFNJTUQgJ3BhY2tlZCcgZm9ybWF0LCBvciBvdGhlciB2ZWN0b3IgdHlwZQorICB9OworCitwcml2YXRlOgorICAvLy8gVGhpcyByZWZlcnMgdG8gdGhlIExMVk1Db250ZXh0IGluIHdoaWNoIHRoaXMgdHlwZSB3YXMgdW5pcXVlZC4KKyAgTExWTUNvbnRleHQgJkNvbnRleHQ7CisKKyAgVHlwZUlEICAgSUQgOiA4OyAgICAgICAgICAgIC8vIFRoZSBjdXJyZW50IGJhc2UgdHlwZSBvZiB0aGlzIHR5cGUuCisgIHVuc2lnbmVkIFN1YmNsYXNzRGF0YSA6IDI0OyAvLyBTcGFjZSBmb3Igc3ViY2xhc3NlcyB0byBzdG9yZSBkYXRhLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm90ZSB0aGF0IHRoaXMgc2hvdWxkIGJlIHN5bmNocm9uaXplZCB3aXRoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBNQVhfSU5UX0JJVFMgdmFsdWUgaW4gSW50ZWdlclR5cGUgY2xhc3MuCisKK3Byb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIExMVk1Db250ZXh0SW1wbDsKKworICBleHBsaWNpdCBUeXBlKExMVk1Db250ZXh0ICZDLCBUeXBlSUQgdGlkKQorICAgIDogQ29udGV4dChDKSwgSUQodGlkKSwgU3ViY2xhc3NEYXRhKDApIHt9CisgIH5UeXBlKCkgPSBkZWZhdWx0OworCisgIHVuc2lnbmVkIGdldFN1YmNsYXNzRGF0YSgpIGNvbnN0IHsgcmV0dXJuIFN1YmNsYXNzRGF0YTsgfQorCisgIHZvaWQgc2V0U3ViY2xhc3NEYXRhKHVuc2lnbmVkIHZhbCkgeworICAgIFN1YmNsYXNzRGF0YSA9IHZhbDsKKyAgICAvLyBFbnN1cmUgd2UgZG9uJ3QgaGF2ZSBhbnkgYWNjaWRlbnRhbCB0cnVuY2F0aW9uLgorICAgIGFzc2VydChnZXRTdWJjbGFzc0RhdGEoKSA9PSB2YWwgJiYgIlN1YmNsYXNzIGRhdGEgdG9vIGxhcmdlIGZvciBmaWVsZCIpOworICB9CisKKyAgLy8vIEtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IFR5cGUqJ3MgdGhlcmUgYXJlIGluIHRoZSBDb250YWluZWRUeXMgbGlzdC4KKyAgdW5zaWduZWQgTnVtQ29udGFpbmVkVHlzID0gMDsKKworICAvLy8gQSBwb2ludGVyIHRvIHRoZSBhcnJheSBvZiBUeXBlcyBjb250YWluZWQgYnkgdGhpcyBUeXBlLiBGb3IgZXhhbXBsZSwgdGhpcworICAvLy8gaW5jbHVkZXMgdGhlIGFyZ3VtZW50cyBvZiBhIGZ1bmN0aW9uIHR5cGUsIHRoZSBlbGVtZW50cyBvZiBhIHN0cnVjdHVyZSwKKyAgLy8vIHRoZSBwb2ludGVlIG9mIGEgcG9pbnRlciwgdGhlIGVsZW1lbnQgdHlwZSBvZiBhbiBhcnJheSwgZXRjLiBUaGlzIHBvaW50ZXIKKyAgLy8vIG1heSBiZSAwIGZvciB0eXBlcyB0aGF0IGRvbid0IGNvbnRhaW4gb3RoZXIgdHlwZXMgKEludGVnZXIsIERvdWJsZSwKKyAgLy8vIEZsb2F0KS4KKyAgVHlwZSAqIGNvbnN0ICpDb250YWluZWRUeXMgPSBudWxscHRyOworCisgIHN0YXRpYyBib29sIGlzU2VxdWVudGlhbFR5cGUoVHlwZUlEIFR5SUQpIHsKKyAgICByZXR1cm4gVHlJRCA9PSBBcnJheVR5SUQgfHwgVHlJRCA9PSBWZWN0b3JUeUlEOworICB9CisKK3B1YmxpYzoKKyAgLy8vIFByaW50IHRoZSBjdXJyZW50IHR5cGUuCisgIC8vLyBPbWl0IHRoZSB0eXBlIGRldGFpbHMgaWYgXHAgTm9EZXRhaWxzID09IHRydWUuCisgIC8vLyBFLmcuLCBsZXQgJXN0ID0gdHlwZSB7IGkzMiwgaTE2IH0KKyAgLy8vIFdoZW4gXHAgTm9EZXRhaWxzIGlzIHRydWUsIHdlIG9ubHkgcHJpbnQgJXN0LgorICAvLy8gUHV0IGRpZmZlcmVudGx5LCBccCBOb0RldGFpbHMgcHJpbnRzIHRoZSB0eXBlIGFzIGlmCisgIC8vLyBpbmxpbmVkIHdpdGggdGhlIG9wZXJhbmRzIHdoZW4gcHJpbnRpbmcgYW4gaW5zdHJ1Y3Rpb24uCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8sIGJvb2wgSXNGb3JEZWJ1ZyA9IGZhbHNlLAorICAgICAgICAgICAgIGJvb2wgTm9EZXRhaWxzID0gZmFsc2UpIGNvbnN0OworCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIExMVk1Db250ZXh0IGluIHdoaWNoIHRoaXMgdHlwZSB3YXMgdW5pcXVlZC4KKyAgTExWTUNvbnRleHQgJmdldENvbnRleHQoKSBjb25zdCB7IHJldHVybiBDb250ZXh0OyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEFjY2Vzc29ycyBmb3Igd29ya2luZyB3aXRoIHR5cGVzLgorICAvLworCisgIC8vLyBSZXR1cm4gdGhlIHR5cGUgaWQgZm9yIHRoZSB0eXBlLiBUaGlzIHdpbGwgcmV0dXJuIG9uZSBvZiB0aGUgVHlwZUlEIGVudW0KKyAgLy8vIGVsZW1lbnRzIGRlZmluZWQgYWJvdmUuCisgIFR5cGVJRCBnZXRUeXBlSUQoKSBjb25zdCB7IHJldHVybiBJRDsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzICd2b2lkJy4KKyAgYm9vbCBpc1ZvaWRUeSgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVJRCgpID09IFZvaWRUeUlEOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgJ2hhbGYnLCBhIDE2LWJpdCBJRUVFIGZwIHR5cGUuCisgIGJvb2wgaXNIYWxmVHkoKSBjb25zdCB7IHJldHVybiBnZXRUeXBlSUQoKSA9PSBIYWxmVHlJRDsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzICdmbG9hdCcsIGEgMzItYml0IElFRUUgZnAgdHlwZS4KKyAgYm9vbCBpc0Zsb2F0VHkoKSBjb25zdCB7IHJldHVybiBnZXRUeXBlSUQoKSA9PSBGbG9hdFR5SUQ7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyAnZG91YmxlJywgYSA2NC1iaXQgSUVFRSBmcCB0eXBlLgorICBib29sIGlzRG91YmxlVHkoKSBjb25zdCB7IHJldHVybiBnZXRUeXBlSUQoKSA9PSBEb3VibGVUeUlEOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgeDg2IGxvbmcgZG91YmxlLgorICBib29sIGlzWDg2X0ZQODBUeSgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVJRCgpID09IFg4Nl9GUDgwVHlJRDsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzICdmcDEyOCcuCisgIGJvb2wgaXNGUDEyOFR5KCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZUlEKCkgPT0gRlAxMjhUeUlEOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgcG93ZXJwYyBsb25nIGRvdWJsZS4KKyAgYm9vbCBpc1BQQ19GUDEyOFR5KCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZUlEKCkgPT0gUFBDX0ZQMTI4VHlJRDsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIG9uZSBvZiB0aGUgc2l4IGZsb2F0aW5nLXBvaW50IHR5cGVzCisgIGJvb2wgaXNGbG9hdGluZ1BvaW50VHkoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFR5cGVJRCgpID09IEhhbGZUeUlEIHx8IGdldFR5cGVJRCgpID09IEZsb2F0VHlJRCB8fAorICAgICAgICAgICBnZXRUeXBlSUQoKSA9PSBEb3VibGVUeUlEIHx8CisgICAgICAgICAgIGdldFR5cGVJRCgpID09IFg4Nl9GUDgwVHlJRCB8fCBnZXRUeXBlSUQoKSA9PSBGUDEyOFR5SUQgfHwKKyAgICAgICAgICAgZ2V0VHlwZUlEKCkgPT0gUFBDX0ZQMTI4VHlJRDsKKyAgfQorCisgIGNvbnN0IGZsdFNlbWFudGljcyAmZ2V0Rmx0U2VtYW50aWNzKCkgY29uc3QgeworICAgIHN3aXRjaCAoZ2V0VHlwZUlEKCkpIHsKKyAgICBjYXNlIEhhbGZUeUlEOiByZXR1cm4gQVBGbG9hdDo6SUVFRWhhbGYoKTsKKyAgICBjYXNlIEZsb2F0VHlJRDogcmV0dXJuIEFQRmxvYXQ6OklFRUVzaW5nbGUoKTsKKyAgICBjYXNlIERvdWJsZVR5SUQ6IHJldHVybiBBUEZsb2F0OjpJRUVFZG91YmxlKCk7CisgICAgY2FzZSBYODZfRlA4MFR5SUQ6IHJldHVybiBBUEZsb2F0Ojp4ODdEb3VibGVFeHRlbmRlZCgpOworICAgIGNhc2UgRlAxMjhUeUlEOiByZXR1cm4gQVBGbG9hdDo6SUVFRXF1YWQoKTsKKyAgICBjYXNlIFBQQ19GUDEyOFR5SUQ6IHJldHVybiBBUEZsb2F0OjpQUENEb3VibGVEb3VibGUoKTsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIGZsb2F0aW5nIHR5cGUiKTsKKyAgICB9CisgIH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBYODYgTU1YLgorICBib29sIGlzWDg2X01NWFR5KCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZUlEKCkgPT0gWDg2X01NWFR5SUQ7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIEZQIHR5cGUgb3IgYSB2ZWN0b3Igb2YgRlAuCisgIGJvb2wgaXNGUE9yRlBWZWN0b3JUeSgpIGNvbnN0IHsgcmV0dXJuIGdldFNjYWxhclR5cGUoKS0+aXNGbG9hdGluZ1BvaW50VHkoKTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzICdsYWJlbCcuCisgIGJvb2wgaXNMYWJlbFR5KCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZUlEKCkgPT0gTGFiZWxUeUlEOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgJ21ldGFkYXRhJy4KKyAgYm9vbCBpc01ldGFkYXRhVHkoKSBjb25zdCB7IHJldHVybiBnZXRUeXBlSUQoKSA9PSBNZXRhZGF0YVR5SUQ7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyAndG9rZW4nLgorICBib29sIGlzVG9rZW5UeSgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVJRCgpID09IFRva2VuVHlJRDsgfQorCisgIC8vLyBUcnVlIGlmIHRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgSW50ZWdlclR5cGUuCisgIGJvb2wgaXNJbnRlZ2VyVHkoKSBjb25zdCB7IHJldHVybiBnZXRUeXBlSUQoKSA9PSBJbnRlZ2VyVHlJRDsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIEludGVnZXJUeXBlIG9mIHRoZSBnaXZlbiB3aWR0aC4KKyAgYm9vbCBpc0ludGVnZXJUeSh1bnNpZ25lZCBCaXR3aWR0aCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gaW50ZWdlciB0eXBlIG9yIGEgdmVjdG9yIG9mIGludGVnZXIgdHlwZXMuCisgIGJvb2wgaXNJbnRPckludFZlY3RvclR5KCkgY29uc3QgeyByZXR1cm4gZ2V0U2NhbGFyVHlwZSgpLT5pc0ludGVnZXJUeSgpOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gaW50ZWdlciB0eXBlIG9yIGEgdmVjdG9yIG9mIGludGVnZXIgdHlwZXMgb2YKKyAgLy8vIHRoZSBnaXZlbiB3aWR0aC4KKyAgYm9vbCBpc0ludE9ySW50VmVjdG9yVHkodW5zaWduZWQgQml0V2lkdGgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U2NhbGFyVHlwZSgpLT5pc0ludGVnZXJUeShCaXRXaWR0aCk7CisgIH0KKworICAvLy8gVHJ1ZSBpZiB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIEZ1bmN0aW9uVHlwZS4KKyAgYm9vbCBpc0Z1bmN0aW9uVHkoKSBjb25zdCB7IHJldHVybiBnZXRUeXBlSUQoKSA9PSBGdW5jdGlvblR5SUQ7IH0KKworICAvLy8gVHJ1ZSBpZiB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIFN0cnVjdFR5cGUuCisgIGJvb2wgaXNTdHJ1Y3RUeSgpIGNvbnN0IHsgcmV0dXJuIGdldFR5cGVJRCgpID09IFN0cnVjdFR5SUQ7IH0KKworICAvLy8gVHJ1ZSBpZiB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIEFycmF5VHlwZS4KKyAgYm9vbCBpc0FycmF5VHkoKSBjb25zdCB7IHJldHVybiBnZXRUeXBlSUQoKSA9PSBBcnJheVR5SUQ7IH0KKworICAvLy8gVHJ1ZSBpZiB0aGlzIGlzIGFuIGluc3RhbmNlIG9mIFBvaW50ZXJUeXBlLgorICBib29sIGlzUG9pbnRlclR5KCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZUlEKCkgPT0gUG9pbnRlclR5SUQ7IH0KKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHBvaW50ZXIgdHlwZSBvciBhIHZlY3RvciBvZiBwb2ludGVyIHR5cGVzLgorICBib29sIGlzUHRyT3JQdHJWZWN0b3JUeSgpIGNvbnN0IHsgcmV0dXJuIGdldFNjYWxhclR5cGUoKS0+aXNQb2ludGVyVHkoKTsgfQorCisgIC8vLyBUcnVlIGlmIHRoaXMgaXMgYW4gaW5zdGFuY2Ugb2YgVmVjdG9yVHlwZS4KKyAgYm9vbCBpc1ZlY3RvclR5KCkgY29uc3QgeyByZXR1cm4gZ2V0VHlwZUlEKCkgPT0gVmVjdG9yVHlJRDsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHR5cGUgY291bGQgYmUgY29udmVydGVkIHdpdGggYSBsb3NzbGVzcyBCaXRDYXN0IHRvCisgIC8vLyB0eXBlICdUeScuIEZvciBleGFtcGxlLCBpOCogdG8gaTMyKi4gQml0Q2FzdHMgYXJlIHZhbGlkIGZvciB0eXBlcyBvZiB0aGUKKyAgLy8vIHNhbWUgc2l6ZSBvbmx5IHdoZXJlIG5vIHJlLWludGVycHJldGF0aW9uIG9mIHRoZSBiaXRzIGlzIGRvbmUuCisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoaXMgdHlwZSBjb3VsZCBiZSBsb3NzbGVzc2x5IGJpdGNhc3QgdG8gVHkKKyAgYm9vbCBjYW5Mb3NzbGVzc2x5Qml0Q2FzdFRvKFR5cGUgKlR5KSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyB0eXBlIGlzIGVtcHR5LCB0aGF0IGlzLCBpdCBoYXMgbm8gZWxlbWVudHMgb3IgYWxsIG9mCisgIC8vLyBpdHMgZWxlbWVudHMgYXJlIGVtcHR5LgorICBib29sIGlzRW1wdHlUeSgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgdHlwZSBpcyAiZmlyc3QgY2xhc3MiLCBtZWFuaW5nIGl0IGlzIGEgdmFsaWQgdHlwZSBmb3IgYQorICAvLy8gVmFsdWUuCisgIGJvb2wgaXNGaXJzdENsYXNzVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VHlwZUlEKCkgIT0gRnVuY3Rpb25UeUlEICYmIGdldFR5cGVJRCgpICE9IFZvaWRUeUlEOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB0eXBlIGlzIGEgdmFsaWQgdHlwZSBmb3IgYSByZWdpc3RlciBpbiBjb2RlZ2VuLiBUaGlzCisgIC8vLyBpbmNsdWRlcyBhbGwgZmlyc3QtY2xhc3MgdHlwZXMgZXhjZXB0IHN0cnVjdCBhbmQgYXJyYXkgdHlwZXMuCisgIGJvb2wgaXNTaW5nbGVWYWx1ZVR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRmxvYXRpbmdQb2ludFR5KCkgfHwgaXNYODZfTU1YVHkoKSB8fCBpc0ludGVnZXJUeSgpIHx8CisgICAgICAgICAgIGlzUG9pbnRlclR5KCkgfHwgaXNWZWN0b3JUeSgpOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSB0eXBlIGlzIGFuIGFnZ3JlZ2F0ZSB0eXBlLiBUaGlzIG1lYW5zIGl0IGlzIHZhbGlkIGFzCisgIC8vLyB0aGUgZmlyc3Qgb3BlcmFuZCBvZiBhbiBpbnNlcnR2YWx1ZSBvciBleHRyYWN0dmFsdWUgaW5zdHJ1Y3Rpb24uIFRoaXMKKyAgLy8vIGluY2x1ZGVzIHN0cnVjdCBhbmQgYXJyYXkgdHlwZXMsIGJ1dCBkb2VzIG5vdCBpbmNsdWRlIHZlY3RvciB0eXBlcy4KKyAgYm9vbCBpc0FnZ3JlZ2F0ZVR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFR5cGVJRCgpID09IFN0cnVjdFR5SUQgfHwgZ2V0VHlwZUlEKCkgPT0gQXJyYXlUeUlEOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGl0IG1ha2VzIHNlbnNlIHRvIHRha2UgdGhlIHNpemUgb2YgdGhpcyB0eXBlLiBUbyBnZXQgdGhlCisgIC8vLyBhY3R1YWwgc2l6ZSBmb3IgYSBwYXJ0aWN1bGFyIHRhcmdldCwgaXQgaXMgcmVhc29uYWJsZSB0byB1c2UgdGhlCisgIC8vLyBEYXRhTGF5b3V0IHN1YnN5c3RlbSB0byBkbyB0aGlzLgorICBib29sIGlzU2l6ZWQoU21hbGxQdHJTZXRJbXBsPFR5cGUqPiAqVmlzaXRlZCA9IG51bGxwdHIpIGNvbnN0IHsKKyAgICAvLyBJZiBpdCdzIGEgcHJpbWl0aXZlLCBpdCBpcyBhbHdheXMgc2l6ZWQuCisgICAgaWYgKGdldFR5cGVJRCgpID09IEludGVnZXJUeUlEIHx8IGlzRmxvYXRpbmdQb2ludFR5KCkgfHwKKyAgICAgICAgZ2V0VHlwZUlEKCkgPT0gUG9pbnRlclR5SUQgfHwKKyAgICAgICAgZ2V0VHlwZUlEKCkgPT0gWDg2X01NWFR5SUQpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAvLyBJZiBpdCBpcyBub3Qgc29tZXRoaW5nIHRoYXQgY2FuIGhhdmUgYSBzaXplIChlLmcuIGEgZnVuY3Rpb24gb3IgbGFiZWwpLAorICAgIC8vIGl0IGRvZXNuJ3QgaGF2ZSBhIHNpemUuCisgICAgaWYgKGdldFR5cGVJRCgpICE9IFN0cnVjdFR5SUQgJiYgZ2V0VHlwZUlEKCkgIT0gQXJyYXlUeUlEICYmCisgICAgICAgIGdldFR5cGVJRCgpICE9IFZlY3RvclR5SUQpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgLy8gT3RoZXJ3aXNlIHdlIGhhdmUgdG8gdHJ5IGhhcmRlciB0byBkZWNpZGUuCisgICAgcmV0dXJuIGlzU2l6ZWREZXJpdmVkVHlwZShWaXNpdGVkKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGJhc2ljIHNpemUgb2YgdGhpcyB0eXBlIGlmIGl0IGlzIGEgcHJpbWl0aXZlIHR5cGUuIFRoZXNlIGFyZQorICAvLy8gZml4ZWQgYnkgTExWTSBhbmQgYXJlIG5vdCB0YXJnZXQtZGVwZW5kZW50LgorICAvLy8gVGhpcyB3aWxsIHJldHVybiB6ZXJvIGlmIHRoZSB0eXBlIGRvZXMgbm90IGhhdmUgYSBzaXplIG9yIGlzIG5vdCBhCisgIC8vLyBwcmltaXRpdmUgdHlwZS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBtYXkgbm90IHJlZmxlY3QgdGhlIHNpemUgb2YgbWVtb3J5IGFsbG9jYXRlZCBmb3IgYW4KKyAgLy8vIGluc3RhbmNlIG9mIHRoZSB0eXBlIG9yIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgd3JpdHRlbiB3aGVuIGFuCisgIC8vLyBpbnN0YW5jZSBvZiB0aGUgdHlwZSBpcyBzdG9yZWQgdG8gbWVtb3J5LiBUaGUgRGF0YUxheW91dCBjbGFzcyBwcm92aWRlcworICAvLy8gYWRkaXRpb25hbCBxdWVyeSBmdW5jdGlvbnMgdG8gcHJvdmlkZSB0aGlzIGluZm9ybWF0aW9uLgorICAvLy8KKyAgdW5zaWduZWQgZ2V0UHJpbWl0aXZlU2l6ZUluQml0cygpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisKKyAgLy8vIElmIHRoaXMgaXMgYSB2ZWN0b3IgdHlwZSwgcmV0dXJuIHRoZSBnZXRQcmltaXRpdmVTaXplSW5CaXRzIHZhbHVlIGZvciB0aGUKKyAgLy8vIGVsZW1lbnQgdHlwZS4gT3RoZXJ3aXNlIHJldHVybiB0aGUgZ2V0UHJpbWl0aXZlU2l6ZUluQml0cyB2YWx1ZSBmb3IgdGhpcworICAvLy8gdHlwZS4KKyAgdW5zaWduZWQgZ2V0U2NhbGFyU2l6ZUluQml0cygpIGNvbnN0IExMVk1fUkVBRE9OTFk7CisKKyAgLy8vIFJldHVybiB0aGUgd2lkdGggb2YgdGhlIG1hbnRpc3NhIG9mIHRoaXMgdHlwZS4gVGhpcyBpcyBvbmx5IHZhbGlkIG9uCisgIC8vLyBmbG9hdGluZy1wb2ludCB0eXBlcy4gSWYgdGhlIEZQIHR5cGUgZG9lcyBub3QgaGF2ZSBhIHN0YWJsZSBtYW50aXNzYSAoZS5nLgorICAvLy8gcHBjIGxvbmcgZG91YmxlKSwgdGhpcyBtZXRob2QgcmV0dXJucyAtMS4KKyAgaW50IGdldEZQTWFudGlzc2FXaWR0aCgpIGNvbnN0OworCisgIC8vLyBJZiB0aGlzIGlzIGEgdmVjdG9yIHR5cGUsIHJldHVybiB0aGUgZWxlbWVudCB0eXBlLCBvdGhlcndpc2UgcmV0dXJuCisgIC8vLyAndGhpcycuCisgIFR5cGUgKmdldFNjYWxhclR5cGUoKSBjb25zdCB7CisgICAgaWYgKGlzVmVjdG9yVHkoKSkKKyAgICAgIHJldHVybiBnZXRWZWN0b3JFbGVtZW50VHlwZSgpOworICAgIHJldHVybiBjb25zdF9jYXN0PFR5cGUqPih0aGlzKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBUeXBlIEl0ZXJhdGlvbiBzdXBwb3J0LgorICAvLworICB1c2luZyBzdWJ0eXBlX2l0ZXJhdG9yID0gVHlwZSAqIGNvbnN0ICo7CisKKyAgc3VidHlwZV9pdGVyYXRvciBzdWJ0eXBlX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gQ29udGFpbmVkVHlzOyB9CisgIHN1YnR5cGVfaXRlcmF0b3Igc3VidHlwZV9lbmQoKSBjb25zdCB7IHJldHVybiAmQ29udGFpbmVkVHlzW051bUNvbnRhaW5lZFR5c107fQorICBBcnJheVJlZjxUeXBlKj4gc3VidHlwZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VBcnJheVJlZihzdWJ0eXBlX2JlZ2luKCksIHN1YnR5cGVfZW5kKCkpOworICB9CisKKyAgdXNpbmcgc3VidHlwZV9yZXZlcnNlX2l0ZXJhdG9yID0gc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPHN1YnR5cGVfaXRlcmF0b3I+OworCisgIHN1YnR5cGVfcmV2ZXJzZV9pdGVyYXRvciBzdWJ0eXBlX3JiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3VidHlwZV9yZXZlcnNlX2l0ZXJhdG9yKHN1YnR5cGVfZW5kKCkpOworICB9CisgIHN1YnR5cGVfcmV2ZXJzZV9pdGVyYXRvciBzdWJ0eXBlX3JlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIHN1YnR5cGVfcmV2ZXJzZV9pdGVyYXRvcihzdWJ0eXBlX2JlZ2luKCkpOworICB9CisKKyAgLy8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSB0eXBlIGl0ZXJhdG9yIChkZWZpbmVkIGF0IHRoZSBlbmQgb2YKKyAgLy8vIHRoZSBmaWxlKS4gRm9yIGRlcml2ZWQgdHlwZXMsIHRoaXMgcmV0dXJucyB0aGUgdHlwZXMgJ2NvbnRhaW5lZCcgaW4gdGhlCisgIC8vLyBkZXJpdmVkIHR5cGUuCisgIFR5cGUgKmdldENvbnRhaW5lZFR5cGUodW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgTnVtQ29udGFpbmVkVHlzICYmICJJbmRleCBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIENvbnRhaW5lZFR5c1tpXTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiB0eXBlcyBpbiB0aGUgZGVyaXZlZCB0eXBlLgorICB1bnNpZ25lZCBnZXROdW1Db250YWluZWRUeXBlcygpIGNvbnN0IHsgcmV0dXJuIE51bUNvbnRhaW5lZFR5czsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBIZWxwZXIgbWV0aG9kcyBjb3JyZXNwb25kaW5nIHRvIHN1YmNsYXNzIG1ldGhvZHMuICBUaGlzIGZvcmNlcyBhIGNhc3QgdG8KKyAgLy8gdGhlIHNwZWNpZmllZCBzdWJjbGFzcyBhbmQgY2FsbHMgaXRzIGFjY2Vzc29yLiAgImdldFZlY3Rvck51bUVsZW1lbnRzIiAoZm9yCisgIC8vIGV4YW1wbGUpIGlzIHNob3J0aGFuZCBmb3IgY2FzdDxWZWN0b3JUeXBlPihUeSktPmdldE51bUVsZW1lbnRzKCkuICBUaGlzIGlzCisgIC8vIG9ubHkgaW50ZW5kZWQgdG8gY292ZXIgdGhlIGNvcmUgbWV0aG9kcyB0aGF0IGFyZSBmcmVxdWVudGx5IHVzZWQsIGhlbHBlcgorICAvLyBtZXRob2RzIHNob3VsZCBub3QgYmUgYWRkZWQgaGVyZS4KKworICBpbmxpbmUgdW5zaWduZWQgZ2V0SW50ZWdlckJpdFdpZHRoKCkgY29uc3Q7CisKKyAgaW5saW5lIFR5cGUgKmdldEZ1bmN0aW9uUGFyYW1UeXBlKHVuc2lnbmVkIGkpIGNvbnN0OworICBpbmxpbmUgdW5zaWduZWQgZ2V0RnVuY3Rpb25OdW1QYXJhbXMoKSBjb25zdDsKKyAgaW5saW5lIGJvb2wgaXNGdW5jdGlvblZhckFyZygpIGNvbnN0OworCisgIGlubGluZSBTdHJpbmdSZWYgZ2V0U3RydWN0TmFtZSgpIGNvbnN0OworICBpbmxpbmUgdW5zaWduZWQgZ2V0U3RydWN0TnVtRWxlbWVudHMoKSBjb25zdDsKKyAgaW5saW5lIFR5cGUgKmdldFN0cnVjdEVsZW1lbnRUeXBlKHVuc2lnbmVkIE4pIGNvbnN0OworCisgIGlubGluZSBUeXBlICpnZXRTZXF1ZW50aWFsRWxlbWVudFR5cGUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzU2VxdWVudGlhbFR5cGUoZ2V0VHlwZUlEKCkpICYmICJOb3QgYSBzZXF1ZW50aWFsIHR5cGUhIik7CisgICAgcmV0dXJuIENvbnRhaW5lZFR5c1swXTsKKyAgfQorCisgIGlubGluZSB1aW50NjRfdCBnZXRBcnJheU51bUVsZW1lbnRzKCkgY29uc3Q7CisKKyAgVHlwZSAqZ2V0QXJyYXlFbGVtZW50VHlwZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoZ2V0VHlwZUlEKCkgPT0gQXJyYXlUeUlEKTsKKyAgICByZXR1cm4gQ29udGFpbmVkVHlzWzBdOworICB9CisKKyAgaW5saW5lIHVuc2lnbmVkIGdldFZlY3Rvck51bUVsZW1lbnRzKCkgY29uc3Q7CisgIFR5cGUgKmdldFZlY3RvckVsZW1lbnRUeXBlKCkgY29uc3QgeworICAgIGFzc2VydChnZXRUeXBlSUQoKSA9PSBWZWN0b3JUeUlEKTsKKyAgICByZXR1cm4gQ29udGFpbmVkVHlzWzBdOworICB9CisKKyAgVHlwZSAqZ2V0UG9pbnRlckVsZW1lbnRUeXBlKCkgY29uc3QgeworICAgIGFzc2VydChnZXRUeXBlSUQoKSA9PSBQb2ludGVyVHlJRCk7CisgICAgcmV0dXJuIENvbnRhaW5lZFR5c1swXTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGFkZHJlc3Mgc3BhY2Ugb2YgdGhpcyBwb2ludGVyIG9yIHBvaW50ZXIgdmVjdG9yIHR5cGUuCisgIGlubGluZSB1bnNpZ25lZCBnZXRQb2ludGVyQWRkcmVzc1NwYWNlKCkgY29uc3Q7CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFN0YXRpYyBtZW1iZXJzIGV4cG9ydGVkIGJ5IHRoZSBUeXBlIGNsYXNzIGl0c2VsZi4gIFVzZWZ1bCBmb3IgZ2V0dGluZworICAvLyBpbnN0YW5jZXMgb2YgVHlwZS4KKyAgLy8KKworICAvLy8gUmV0dXJuIGEgdHlwZSBiYXNlZCBvbiBhbiBpZGVudGlmaWVyLgorICBzdGF0aWMgVHlwZSAqZ2V0UHJpbWl0aXZlVHlwZShMTFZNQ29udGV4dCAmQywgVHlwZUlEIElETnVtYmVyKTsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gVGhlc2UgYXJlIHRoZSBidWlsdGluIHR5cGVzIHRoYXQgYXJlIGFsd2F5cyBhdmFpbGFibGUuCisgIC8vCisgIHN0YXRpYyBUeXBlICpnZXRWb2lkVHkoTExWTUNvbnRleHQgJkMpOworICBzdGF0aWMgVHlwZSAqZ2V0TGFiZWxUeShMTFZNQ29udGV4dCAmQyk7CisgIHN0YXRpYyBUeXBlICpnZXRIYWxmVHkoTExWTUNvbnRleHQgJkMpOworICBzdGF0aWMgVHlwZSAqZ2V0RmxvYXRUeShMTFZNQ29udGV4dCAmQyk7CisgIHN0YXRpYyBUeXBlICpnZXREb3VibGVUeShMTFZNQ29udGV4dCAmQyk7CisgIHN0YXRpYyBUeXBlICpnZXRNZXRhZGF0YVR5KExMVk1Db250ZXh0ICZDKTsKKyAgc3RhdGljIFR5cGUgKmdldFg4Nl9GUDgwVHkoTExWTUNvbnRleHQgJkMpOworICBzdGF0aWMgVHlwZSAqZ2V0RlAxMjhUeShMTFZNQ29udGV4dCAmQyk7CisgIHN0YXRpYyBUeXBlICpnZXRQUENfRlAxMjhUeShMTFZNQ29udGV4dCAmQyk7CisgIHN0YXRpYyBUeXBlICpnZXRYODZfTU1YVHkoTExWTUNvbnRleHQgJkMpOworICBzdGF0aWMgVHlwZSAqZ2V0VG9rZW5UeShMTFZNQ29udGV4dCAmQyk7CisgIHN0YXRpYyBJbnRlZ2VyVHlwZSAqZ2V0SW50TlR5KExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBOKTsKKyAgc3RhdGljIEludGVnZXJUeXBlICpnZXRJbnQxVHkoTExWTUNvbnRleHQgJkMpOworICBzdGF0aWMgSW50ZWdlclR5cGUgKmdldEludDhUeShMTFZNQ29udGV4dCAmQyk7CisgIHN0YXRpYyBJbnRlZ2VyVHlwZSAqZ2V0SW50MTZUeShMTFZNQ29udGV4dCAmQyk7CisgIHN0YXRpYyBJbnRlZ2VyVHlwZSAqZ2V0SW50MzJUeShMTFZNQ29udGV4dCAmQyk7CisgIHN0YXRpYyBJbnRlZ2VyVHlwZSAqZ2V0SW50NjRUeShMTFZNQ29udGV4dCAmQyk7CisgIHN0YXRpYyBJbnRlZ2VyVHlwZSAqZ2V0SW50MTI4VHkoTExWTUNvbnRleHQgJkMpOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2NhbGFyVHk+IHN0YXRpYyBUeXBlICpnZXRTY2FsYXJUeShMTFZNQ29udGV4dCAmQykgeworICAgIGludCBub09mQml0cyA9IHNpemVvZihTY2FsYXJUeSkgKiBDSEFSX0JJVDsKKyAgICBpZiAoc3RkOjppc19pbnRlZ3JhbDxTY2FsYXJUeT46OnZhbHVlKSB7CisgICAgICByZXR1cm4gKFR5cGUqKSBUeXBlOjpnZXRJbnROVHkoQywgbm9PZkJpdHMpOworICAgIH0gZWxzZSBpZiAoc3RkOjppc19mbG9hdGluZ19wb2ludDxTY2FsYXJUeT46OnZhbHVlKSB7CisgICAgICBzd2l0Y2ggKG5vT2ZCaXRzKSB7CisgICAgICBjYXNlIDMyOgorICAgICAgICByZXR1cm4gVHlwZTo6Z2V0RmxvYXRUeShDKTsKKyAgICAgIGNhc2UgNjQ6CisgICAgICAgIHJldHVybiBUeXBlOjpnZXREb3VibGVUeShDKTsKKyAgICAgIH0KKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5zdXBwb3J0ZWQgdHlwZSBpbiBUeXBlOjpnZXRTY2FsYXJUeSIpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIENvbnZlbmllbmNlIG1ldGhvZHMgZm9yIGdldHRpbmcgcG9pbnRlciB0eXBlcyB3aXRoIG9uZSBvZiB0aGUgYWJvdmUgYnVpbHRpbgorICAvLyB0eXBlcyBhcyBwb2ludGVlLgorICAvLworICBzdGF0aWMgUG9pbnRlclR5cGUgKmdldEhhbGZQdHJUeShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQVMgPSAwKTsKKyAgc3RhdGljIFBvaW50ZXJUeXBlICpnZXRGbG9hdFB0clR5KExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBBUyA9IDApOworICBzdGF0aWMgUG9pbnRlclR5cGUgKmdldERvdWJsZVB0clR5KExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBBUyA9IDApOworICBzdGF0aWMgUG9pbnRlclR5cGUgKmdldFg4Nl9GUDgwUHRyVHkoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFTID0gMCk7CisgIHN0YXRpYyBQb2ludGVyVHlwZSAqZ2V0RlAxMjhQdHJUeShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQVMgPSAwKTsKKyAgc3RhdGljIFBvaW50ZXJUeXBlICpnZXRQUENfRlAxMjhQdHJUeShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQVMgPSAwKTsKKyAgc3RhdGljIFBvaW50ZXJUeXBlICpnZXRYODZfTU1YUHRyVHkoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFTID0gMCk7CisgIHN0YXRpYyBQb2ludGVyVHlwZSAqZ2V0SW50TlB0clR5KExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBOLCB1bnNpZ25lZCBBUyA9IDApOworICBzdGF0aWMgUG9pbnRlclR5cGUgKmdldEludDFQdHJUeShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQVMgPSAwKTsKKyAgc3RhdGljIFBvaW50ZXJUeXBlICpnZXRJbnQ4UHRyVHkoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFTID0gMCk7CisgIHN0YXRpYyBQb2ludGVyVHlwZSAqZ2V0SW50MTZQdHJUeShMTFZNQ29udGV4dCAmQywgdW5zaWduZWQgQVMgPSAwKTsKKyAgc3RhdGljIFBvaW50ZXJUeXBlICpnZXRJbnQzMlB0clR5KExMVk1Db250ZXh0ICZDLCB1bnNpZ25lZCBBUyA9IDApOworICBzdGF0aWMgUG9pbnRlclR5cGUgKmdldEludDY0UHRyVHkoTExWTUNvbnRleHQgJkMsIHVuc2lnbmVkIEFTID0gMCk7CisKKyAgLy8vIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgdHlwZS4gVGhpcyBpcyBlcXVpdmFsZW50IHRvCisgIC8vLyBQb2ludGVyVHlwZTo6Z2V0KEZvbywgQWRkclNwYWNlKS4KKyAgUG9pbnRlclR5cGUgKmdldFBvaW50ZXJUbyh1bnNpZ25lZCBBZGRyU3BhY2UgPSAwKSBjb25zdDsKKworcHJpdmF0ZToKKyAgLy8vIERlcml2ZWQgdHlwZXMgbGlrZSBzdHJ1Y3R1cmVzIGFuZCBhcnJheXMgYXJlIHNpemVkIGlmZiBhbGwgb2YgdGhlIG1lbWJlcnMKKyAgLy8vIG9mIHRoZSB0eXBlIGFyZSBzaXplZCBhcyB3ZWxsLiBTaW5jZSBhc2tpbmcgZm9yIHRoZWlyIHNpemUgaXMgcmVsYXRpdmVseQorICAvLy8gdW5jb21tb24sIG1vdmUgdGhpcyBvcGVyYXRpb24gb3V0LW9mLWxpbmUuCisgIGJvb2wgaXNTaXplZERlcml2ZWRUeXBlKFNtYWxsUHRyU2V0SW1wbDxUeXBlKj4gKlZpc2l0ZWQgPSBudWxscHRyKSBjb25zdDsKK307CisKKy8vIFByaW50aW5nIG9mIHR5cGVzLgoraW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgVHlwZSAmVCkgeworICBULnByaW50KE9TKTsKKyAgcmV0dXJuIE9TOworfQorCisvLyBhbGxvdyBpc2E8UG9pbnRlclR5cGU+KHgpIHRvIHdvcmsgd2l0aG91dCBEZXJpdmVkVHlwZXMuaCBpbmNsdWRlZC4KK3RlbXBsYXRlIDw+IHN0cnVjdCBpc2FfaW1wbDxQb2ludGVyVHlwZSwgVHlwZT4geworICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBUeXBlICZUeSkgeworICAgIHJldHVybiBUeS5nZXRUeXBlSUQoKSA9PSBUeXBlOjpQb2ludGVyVHlJRDsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFByb3ZpZGUgc3BlY2lhbGl6YXRpb25zIG9mIEdyYXBoVHJhaXRzIHRvIGJlIGFibGUgdG8gdHJlYXQgYSB0eXBlIGFzIGEKKy8vIGdyYXBoIG9mIHN1YiB0eXBlcy4KKwordGVtcGxhdGUgPD4gc3RydWN0IEdyYXBoVHJhaXRzPFR5cGUgKj4geworICB1c2luZyBOb2RlUmVmID0gVHlwZSAqOworICB1c2luZyBDaGlsZEl0ZXJhdG9yVHlwZSA9IFR5cGU6OnN1YnR5cGVfaXRlcmF0b3I7CisKKyAgc3RhdGljIE5vZGVSZWYgZ2V0RW50cnlOb2RlKFR5cGUgKlQpIHsgcmV0dXJuIFQ7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+c3VidHlwZV9iZWdpbigpOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7IHJldHVybiBOLT5zdWJ0eXBlX2VuZCgpOyB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgR3JhcGhUcmFpdHM8Y29uc3QgVHlwZSo+IHsKKyAgdXNpbmcgTm9kZVJlZiA9IGNvbnN0IFR5cGUgKjsKKyAgdXNpbmcgQ2hpbGRJdGVyYXRvclR5cGUgPSBUeXBlOjpzdWJ0eXBlX2l0ZXJhdG9yOworCisgIHN0YXRpYyBOb2RlUmVmIGdldEVudHJ5Tm9kZShOb2RlUmVmIFQpIHsgcmV0dXJuIFQ7IH0KKyAgc3RhdGljIENoaWxkSXRlcmF0b3JUeXBlIGNoaWxkX2JlZ2luKE5vZGVSZWYgTikgeyByZXR1cm4gTi0+c3VidHlwZV9iZWdpbigpOyB9CisgIHN0YXRpYyBDaGlsZEl0ZXJhdG9yVHlwZSBjaGlsZF9lbmQoTm9kZVJlZiBOKSB7IHJldHVybiBOLT5zdWJ0eXBlX2VuZCgpOyB9Cit9OworCisvLyBDcmVhdGUgd3JhcHBlcnMgZm9yIEMgQmluZGluZyB0eXBlcyAoc2VlIENCaW5kaW5nV3JhcHBpbmcuaCkuCitERUZJTkVfSVNBX0NPTlZFUlNJT05fRlVOQ1RJT05TKFR5cGUsIExMVk1UeXBlUmVmKQorCisvKiBTcGVjaWFsaXplZCBvcGFxdWUgdHlwZSBjb252ZXJzaW9ucy4KKyAqLworaW5saW5lIFR5cGUgKip1bndyYXAoTExWTVR5cGVSZWYqIFR5cykgeworICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUeXBlKio+KFR5cyk7Cit9CisKK2lubGluZSBMTFZNVHlwZVJlZiAqd3JhcChUeXBlICoqVHlzKSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PExMVk1UeXBlUmVmKj4oY29uc3RfY2FzdDxUeXBlKio+KFR5cykpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9UWVBFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVHlwZUJ1aWxkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVHlwZUJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmM2ZjAwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9UeXBlQnVpbGRlci5oCkBAIC0wLDAgKzEsNDA3IEBACisvLz09PS0tLS0gbGx2bS9UeXBlQnVpbGRlci5oIC0gQnVpbGRlciBmb3IgTExWTSB0eXBlcyAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBUeXBlQnVpbGRlciBjbGFzcywgd2hpY2ggaXMgdXNlZCBhcyBhIGNvbnZlbmllbnQgd2F5IHRvCisvLyBjcmVhdGUgTExWTSB0eXBlcyB3aXRoIGEgY29uc2lzdGVudCBhbmQgc2ltcGxpZmllZCBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX1RZUEVCVUlMREVSX0gKKyNkZWZpbmUgTExWTV9JUl9UWVBFQlVJTERFUl9ICisKKyNpbmNsdWRlICJsbHZtL0lSL0Rlcml2ZWRUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvTExWTUNvbnRleHQuaCIKKyNpbmNsdWRlIDxjbGltaXRzPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBUeXBlQnVpbGRlciAtIFRoaXMgcHJvdmlkZXMgYSB1bmlmb3JtIEFQSSBmb3IgbG9va2luZyB1cCB0eXBlcworLy8vIGtub3duIGF0IGNvbXBpbGUgdGltZS4gIFRvIHN1cHBvcnQgY3Jvc3MtY29tcGlsYXRpb24sIHdlIGRlZmluZSBhCisvLy8gc2VyaWVzIG9mIHRhZyB0eXBlcyBpbiB0aGUgbGx2bTo6dHlwZXMgbmFtZXNwYWNlLCBsaWtlIGk8Tj4sCisvLy8gaWVlZV9mbG9hdCwgcHBjX2ZwMTI4LCBldGMuICBUeXBlQnVpbGRlcjxULCBmYWxzZT4gYWxsb3dzIFQgdG8gYmUKKy8vLyBhbnkgb2YgdGhlc2UsIGEgbmF0aXZlIEMgdHlwZSAod2hvc2Ugc2l6ZSBtYXkgZGVwZW5kIG9uIHRoZSBob3N0CisvLy8gY29tcGlsZXIpLCBvciBhIHBvaW50ZXIsIGZ1bmN0aW9uLCBvciBzdHJ1Y3QgdHlwZSBidWlsdCBvdXQgb2YKKy8vLyB0aGVzZS4gIFR5cGVCdWlsZGVyPFQsIHRydWU+IHJlbW92ZXMgbmF0aXZlIEMgdHlwZXMgZnJvbSB0aGlzIHNldAorLy8vIHRvIGd1YXJhbnRlZSB0aGF0IGl0cyByZXN1bHQgaXMgc3VpdGFibGUgZm9yIGNyb3NzLWNvbXBpbGF0aW9uLgorLy8vIFdlIGRlZmluZSB0aGUgcHJpbWl0aXZlIHR5cGVzLCBwb2ludGVyIHR5cGVzLCBhbmQgZnVuY3Rpb25zIHVwIHRvCisvLy8gNSBhcmd1bWVudHMgaGVyZSwgYnV0IHRvIHVzZSB0aGlzIGNsYXNzIHdpdGggeW91ciBvd24gdHlwZXMsCisvLy8geW91J2xsIG5lZWQgdG8gc3BlY2lhbGl6ZSBpdC4gIEZvciBleGFtcGxlLCBzYXkgeW91IHdhbnQgdG8gY2FsbCBhCisvLy8gZnVuY3Rpb24gZGVmaW5lZCBleHRlcm5hbGx5IGFzOgorLy8vCisvLy8gXGNvZGV7LmNwcH0KKy8vLworLy8vICAgc3RydWN0IE15VHlwZSB7CisvLy8gICAgIGludDMyIGE7CisvLy8gICAgIGludDMyICpiOworLy8vICAgICB2b2lkICphcnJheVsxXTsgIC8vIEludGVuZGVkIGFzIGEgZmxleGlibGUgYXJyYXkuCisvLy8gICB9OworLy8vICAgaW50OCBBRnVuY3Rpb24oc3RydWN0IE15VHlwZSAqdmFsdWUpOworLy8vCisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFlvdSdsbCB3YW50IHRvIHVzZQorLy8vICAgRnVuY3Rpb246OkNyZWF0ZShUeXBlQnVpbGRlcjx0eXBlczo6aTw4PihNeVR5cGUqKSwgdHJ1ZT46OmdldCgpLCAuLi4pCisvLy8gdG8gZGVjbGFyZSB0aGUgZnVuY3Rpb24sIGJ1dCB3aGVuIHlvdSBmaXJzdCB0cnkgdGhpcywgeW91ciBjb21waWxlciB3aWxsCisvLy8gY29tcGxhaW4gdGhhdCBUeXBlQnVpbGRlcjxNeVR5cGUsIHRydWU+OjpnZXQoKSBkb2Vzbid0IGV4aXN0LiBUbyBmaXggdGhpcywKKy8vLyB3cml0ZToKKy8vLworLy8vIFxjb2Rley5jcHB9CisvLy8KKy8vLyAgIG5hbWVzcGFjZSBsbHZtIHsKKy8vLyAgIHRlbXBsYXRlPGJvb2wgeGNvbXBpbGU+IGNsYXNzIFR5cGVCdWlsZGVyPE15VHlwZSwgeGNvbXBpbGU+IHsKKy8vLyAgIHB1YmxpYzoKKy8vLyAgICAgc3RhdGljIFN0cnVjdFR5cGUgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCkgeworLy8vICAgICAgIC8vIElmIHlvdSBjYWNoZSB0aGlzIHJlc3VsdCwgYmUgc3VyZSB0byBjYWNoZSBpdCBzZXBhcmF0ZWx5CisvLy8gICAgICAgLy8gZm9yIGVhY2ggTExWTUNvbnRleHQuCisvLy8gICAgICAgcmV0dXJuIFN0cnVjdFR5cGU6OmdldCgKKy8vLyAgICAgICAgIFR5cGVCdWlsZGVyPHR5cGVzOjppPDMyPiwgeGNvbXBpbGU+OjpnZXQoQ29udGV4dCksCisvLy8gICAgICAgICBUeXBlQnVpbGRlcjx0eXBlczo6aTwzMj4qLCB4Y29tcGlsZT46OmdldChDb250ZXh0KSwKKy8vLyAgICAgICAgIFR5cGVCdWlsZGVyPHR5cGVzOjppPDg+KltdLCB4Y29tcGlsZT46OmdldChDb250ZXh0KSwKKy8vLyAgICAgICAgIG51bGxwdHIpOworLy8vICAgICB9CisvLy8KKy8vLyAgICAgLy8gWW91IG1heSBmaW5kIHRoaXMgYSBjb252ZW5pZW50IHBsYWNlIHRvIHB1dCBzb21lIGNvbnN0YW50cworLy8vICAgICAvLyB0byBoZWxwIHdpdGggZ2V0ZWxlbWVudHB0ci4gIFRoZXkgZG9uJ3QgaGF2ZSBhbnkgZWZmZWN0IG9uCisvLy8gICAgIC8vIHRoZSBvcGVyYXRpb24gb2YgVHlwZUJ1aWxkZXIuCisvLy8gICAgIGVudW0gRmllbGRzIHsKKy8vLyAgICAgICBGSUVMRF9BLAorLy8vICAgICAgIEZJRUxEX0IsCisvLy8gICAgICAgRklFTERfQVJSQVkKKy8vLyAgICAgfTsKKy8vLyAgIH0KKy8vLyAgIH0gIC8vIG5hbWVzcGFjZSBsbHZtCisvLy8KKy8vLyBcZW5kY29kZQorLy8vCisvLy8gVHlwZUJ1aWxkZXIgY2Fubm90IGhhbmRsZSByZWN1cnNpdmUgdHlwZXMgb3IgdHlwZXMgeW91IG9ubHkga25vdyBhdCBydW50aW1lLgorLy8vIElmIHlvdSB0cnkgdG8gZ2l2ZSBpdCBhIHJlY3Vyc2l2ZSB0eXBlLCBpdCB3aWxsIGRlYWRsb2NrLCBpbmZpbml0ZWx5CisvLy8gcmVjdXJzZSwgb3IgZG8gc29tZXRoaW5nIHNpbWlsYXJseSB1bmRlc2lyYWJsZS4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgY3Jvc3NfY29tcGlsYWJsZT4gY2xhc3MgVHlwZUJ1aWxkZXIge307CisKKy8vIFR5cGVzIGZvciB1c2Ugd2l0aCBjcm9zcy1jb21waWxhYmxlIFR5cGVCdWlsZGVycy4gIFRoZXNlIGNvcnJlc3BvbmQKKy8vIGV4YWN0bHkgd2l0aCBhbiBMTFZNLW5hdGl2ZSB0eXBlLgorbmFtZXNwYWNlIHR5cGVzIHsKKy8vLyBpPE4+IGNvcnJlc3BvbmRzIHRvIHRoZSBMTFZNIEludGVnZXJUeXBlIHdpdGggTiBiaXRzLgordGVtcGxhdGU8dWludDMyX3QgbnVtX2JpdHM+IGNsYXNzIGkge307CisKKy8vIFRoZSBmb2xsb3dpbmcgY2xhc3NlcyByZXByZXNlbnQgdGhlIExMVk0gZmxvYXRpbmcgdHlwZXMuCitjbGFzcyBpZWVlX2Zsb2F0IHt9OworY2xhc3MgaWVlZV9kb3VibGUge307CitjbGFzcyB4ODZfZnA4MCB7fTsKK2NsYXNzIGZwMTI4IHt9OworY2xhc3MgcHBjX2ZwMTI4IHt9OworLy8gWDg2IE1NWC4KK2NsYXNzIHg4Nl9tbXgge307Cit9ICAvLyBuYW1lc3BhY2UgdHlwZXMKKworLy8gTExWTSBkb2Vzbid0IGhhdmUgY29uc3Qgb3Igdm9sYXRpbGUgdHlwZXMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjxjb25zdCBULCBjcm9zcz4KKyAgOiBwdWJsaWMgVHlwZUJ1aWxkZXI8VCwgY3Jvc3M+IHt9OwordGVtcGxhdGU8dHlwZW5hbWUgVCwgYm9vbCBjcm9zcz4gY2xhc3MgVHlwZUJ1aWxkZXI8dm9sYXRpbGUgVCwgY3Jvc3M+CisgIDogcHVibGljIFR5cGVCdWlsZGVyPFQsIGNyb3NzPiB7fTsKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgY3Jvc3M+IGNsYXNzIFR5cGVCdWlsZGVyPGNvbnN0IHZvbGF0aWxlIFQsIGNyb3NzPgorICA6IHB1YmxpYyBUeXBlQnVpbGRlcjxULCBjcm9zcz4ge307CisKKy8vIFBvaW50ZXJzCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCBib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjxUKiwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIFBvaW50ZXJUeXBlICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQpIHsKKyAgICByZXR1cm4gUG9pbnRlclR5cGU6OmdldFVucXVhbChUeXBlQnVpbGRlcjxULGNyb3NzPjo6Z2V0KENvbnRleHQpKTsKKyAgfQorfTsKKworLy8vIFRoZXJlIGlzIG5vIHN1cHBvcnQgZm9yIHJlZmVyZW5jZXMKK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgY3Jvc3M+IGNsYXNzIFR5cGVCdWlsZGVyPFQmLCBjcm9zcz4ge307CisKKy8vIEFycmF5cwordGVtcGxhdGU8dHlwZW5hbWUgVCwgc2l6ZV90IE4sIGJvb2wgY3Jvc3M+IGNsYXNzIFR5cGVCdWlsZGVyPFRbTl0sIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBBcnJheVR5cGUgKmdldChMTFZNQ29udGV4dCAmQ29udGV4dCkgeworICAgIHJldHVybiBBcnJheVR5cGU6OmdldChUeXBlQnVpbGRlcjxULCBjcm9zcz46OmdldChDb250ZXh0KSwgTik7CisgIH0KK307CisvLy8gTExWTSB1c2VzIGFuIGFycmF5IG9mIGxlbmd0aCAwIHRvIHJlcHJlc2VudCBhbiB1bmtub3duLWxlbmd0aCBhcnJheS4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgY3Jvc3M+IGNsYXNzIFR5cGVCdWlsZGVyPFRbXSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIEFycmF5VHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgcmV0dXJuIEFycmF5VHlwZTo6Z2V0KFR5cGVCdWlsZGVyPFQsIGNyb3NzPjo6Z2V0KENvbnRleHQpLCAwKTsKKyAgfQorfTsKKworLy8gRGVmaW5lIHRoZSBDIGludGVncmFsIHR5cGVzIG9ubHkgZm9yIFR5cGVCdWlsZGVyPFQsIGZhbHNlPi4KKy8vCisvLyBDIGludGVncmFsIHR5cGVzIGRvIG5vdCBoYXZlIGEgZGVmaW5lZCBzaXplLiBJdCB3b3VsZCBiZSBuaWNlIHRvIHVzZSB0aGUKKy8vIHN0ZGludC5oLWRlZmluZWQgdHlwZWRlZnMgdGhhdCBkbyBoYXZlIGRlZmluZWQgc2l6ZXMsIGJ1dCB3ZSdkIHJ1biBpbnRvIHRoZQorLy8gZm9sbG93aW5nIHByb2JsZW06CisvLworLy8gT24gYW4gSUxQMzIgbWFjaGluZSwgc3RkaW50LmggbWlnaHQgZGVmaW5lOgorLy8KKy8vICAgdHlwZWRlZiBpbnQgaW50MzJfdDsKKy8vICAgdHlwZWRlZiBsb25nIGxvbmcgaW50NjRfdDsKKy8vICAgdHlwZWRlZiBsb25nIHNpemVfdDsKKy8vCisvLyBJZiB3ZSBkZWZpbmVkIFR5cGVCdWlsZGVyPGludDMyX3Q+IGFuZCBUeXBlQnVpbGRlcjxpbnQ2NF90PiwgdGhlbiBhbnkgdXNlIG9mCisvLyBUeXBlQnVpbGRlcjxzaXplX3Q+IHdvdWxkIGZhaWwuICBXZSBjb3VsZG4ndCBkZWZpbmUgVHlwZUJ1aWxkZXI8c2l6ZV90PiBpbgorLy8gYWRkaXRpb24gdG8gdGhlIGRlZmluZWQtc2l6ZSB0eXBlcyBiZWNhdXNlIHdlJ2QgZ2V0IGR1cGxpY2F0ZSBkZWZpbml0aW9ucyBvbgorLy8gcGxhdGZvcm1zIHdoZXJlIHN0ZGludC5oIGluc3RlYWQgZGVmaW5lczoKKy8vCisvLyAgIHR5cGVkZWYgaW50IGludDMyX3Q7CisvLyAgIHR5cGVkZWYgbG9uZyBsb25nIGludDY0X3Q7CisvLyAgIHR5cGVkZWYgaW50IHNpemVfdDsKKy8vCisvLyBTbyB3ZSBkZWZpbmUgYWxsIHRoZSBwcmltaXRpdmUgQyB0eXBlcyBhbmQgbm90aGluZyBlbHNlLgorI2RlZmluZSBERUZJTkVfSU5URUdSQUxfVFlQRUJVSUxERVIoVCkgXAordGVtcGxhdGU8PiBjbGFzcyBUeXBlQnVpbGRlcjxULCBmYWxzZT4geyBcCitwdWJsaWM6IFwKKyAgc3RhdGljIEludGVnZXJUeXBlICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQpIHsgXAorICAgIHJldHVybiBJbnRlZ2VyVHlwZTo6Z2V0KENvbnRleHQsIHNpemVvZihUKSAqIENIQVJfQklUKTsgXAorICB9IFwKK307IFwKK3RlbXBsYXRlPD4gY2xhc3MgVHlwZUJ1aWxkZXI8VCwgdHJ1ZT4geyBcCisgIC8qIFdlIHByb3ZpZGUgYSBkZWZpbml0aW9uIGhlcmUgc28gdXNlcnMgZG9uJ3QgYWNjaWRlbnRhbGx5ICovIFwKKyAgLyogZGVmaW5lIHRoZXNlIHR5cGVzIHRvIHdvcmsuICovIFwKK30KK0RFRklORV9JTlRFR1JBTF9UWVBFQlVJTERFUihjaGFyKTsKK0RFRklORV9JTlRFR1JBTF9UWVBFQlVJTERFUihzaWduZWQgY2hhcik7CitERUZJTkVfSU5URUdSQUxfVFlQRUJVSUxERVIodW5zaWduZWQgY2hhcik7CitERUZJTkVfSU5URUdSQUxfVFlQRUJVSUxERVIoc2hvcnQpOworREVGSU5FX0lOVEVHUkFMX1RZUEVCVUlMREVSKHVuc2lnbmVkIHNob3J0KTsKK0RFRklORV9JTlRFR1JBTF9UWVBFQlVJTERFUihpbnQpOworREVGSU5FX0lOVEVHUkFMX1RZUEVCVUlMREVSKHVuc2lnbmVkIGludCk7CitERUZJTkVfSU5URUdSQUxfVFlQRUJVSUxERVIobG9uZyk7CitERUZJTkVfSU5URUdSQUxfVFlQRUJVSUxERVIodW5zaWduZWQgbG9uZyk7CisjaWZkZWYgX01TQ19WRVIKK0RFRklORV9JTlRFR1JBTF9UWVBFQlVJTERFUihfX2ludDY0KTsKK0RFRklORV9JTlRFR1JBTF9UWVBFQlVJTERFUih1bnNpZ25lZCBfX2ludDY0KTsKKyNlbHNlIC8qIF9NU0NfVkVSICovCitERUZJTkVfSU5URUdSQUxfVFlQRUJVSUxERVIobG9uZyBsb25nKTsKK0RFRklORV9JTlRFR1JBTF9UWVBFQlVJTERFUih1bnNpZ25lZCBsb25nIGxvbmcpOworI2VuZGlmIC8qIF9NU0NfVkVSICovCisjdW5kZWYgREVGSU5FX0lOVEVHUkFMX1RZUEVCVUlMREVSCisKK3RlbXBsYXRlPHVpbnQzMl90IG51bV9iaXRzLCBib29sIGNyb3NzPgorY2xhc3MgVHlwZUJ1aWxkZXI8dHlwZXM6Omk8bnVtX2JpdHM+LCBjcm9zcz4geworcHVibGljOgorICBzdGF0aWMgSW50ZWdlclR5cGUgKmdldChMTFZNQ29udGV4dCAmQykgeworICAgIHJldHVybiBJbnRlZ2VyVHlwZTo6Z2V0KEMsIG51bV9iaXRzKTsKKyAgfQorfTsKKwordGVtcGxhdGU8PiBjbGFzcyBUeXBlQnVpbGRlcjxmbG9hdCwgZmFsc2U+IHsKK3B1YmxpYzoKKyAgc3RhdGljIFR5cGUgKmdldChMTFZNQ29udGV4dCYgQykgeworICAgIHJldHVybiBUeXBlOjpnZXRGbG9hdFR5KEMpOworICB9Cit9OwordGVtcGxhdGU8PiBjbGFzcyBUeXBlQnVpbGRlcjxmbG9hdCwgdHJ1ZT4ge307CisKK3RlbXBsYXRlPD4gY2xhc3MgVHlwZUJ1aWxkZXI8ZG91YmxlLCBmYWxzZT4geworcHVibGljOgorICBzdGF0aWMgVHlwZSAqZ2V0KExMVk1Db250ZXh0JiBDKSB7CisgICAgcmV0dXJuIFR5cGU6OmdldERvdWJsZVR5KEMpOworICB9Cit9OwordGVtcGxhdGU8PiBjbGFzcyBUeXBlQnVpbGRlcjxkb3VibGUsIHRydWU+IHt9OworCit0ZW1wbGF0ZTxib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjx0eXBlczo6aWVlZV9mbG9hdCwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIFR5cGUgKmdldChMTFZNQ29udGV4dCYgQykgeyByZXR1cm4gVHlwZTo6Z2V0RmxvYXRUeShDKTsgfQorfTsKK3RlbXBsYXRlPGJvb2wgY3Jvc3M+IGNsYXNzIFR5cGVCdWlsZGVyPHR5cGVzOjppZWVlX2RvdWJsZSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIFR5cGUgKmdldChMTFZNQ29udGV4dCYgQykgeyByZXR1cm4gVHlwZTo6Z2V0RG91YmxlVHkoQyk7IH0KK307Cit0ZW1wbGF0ZTxib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjx0eXBlczo6eDg2X2ZwODAsIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBUeXBlICpnZXQoTExWTUNvbnRleHQmIEMpIHsgcmV0dXJuIFR5cGU6OmdldFg4Nl9GUDgwVHkoQyk7IH0KK307Cit0ZW1wbGF0ZTxib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjx0eXBlczo6ZnAxMjgsIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBUeXBlICpnZXQoTExWTUNvbnRleHQmIEMpIHsgcmV0dXJuIFR5cGU6OmdldEZQMTI4VHkoQyk7IH0KK307Cit0ZW1wbGF0ZTxib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjx0eXBlczo6cHBjX2ZwMTI4LCBjcm9zcz4geworcHVibGljOgorICBzdGF0aWMgVHlwZSAqZ2V0KExMVk1Db250ZXh0JiBDKSB7IHJldHVybiBUeXBlOjpnZXRQUENfRlAxMjhUeShDKTsgfQorfTsKK3RlbXBsYXRlPGJvb2wgY3Jvc3M+IGNsYXNzIFR5cGVCdWlsZGVyPHR5cGVzOjp4ODZfbW14LCBjcm9zcz4geworcHVibGljOgorICBzdGF0aWMgVHlwZSAqZ2V0KExMVk1Db250ZXh0JiBDKSB7IHJldHVybiBUeXBlOjpnZXRYODZfTU1YVHkoQyk7IH0KK307CisKK3RlbXBsYXRlPGJvb2wgY3Jvc3M+IGNsYXNzIFR5cGVCdWlsZGVyPHZvaWQsIGNyb3NzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBUeXBlICpnZXQoTExWTUNvbnRleHQgJkMpIHsKKyAgICByZXR1cm4gVHlwZTo6Z2V0Vm9pZFR5KEMpOworICB9Cit9OworCisvLy8gdm9pZCogaXMgZGlzYWxsb3dlZCBpbiBMTFZNIHR5cGVzLCBidXQgaXQgb2NjdXJzIG9mdGVuIGVub3VnaCBpbiBDIGNvZGUgdGhhdAorLy8vIHdlIHNwZWNpYWwgY2FzZSBpdC4KK3RlbXBsYXRlPD4gY2xhc3MgVHlwZUJ1aWxkZXI8dm9pZCosIGZhbHNlPgorICA6IHB1YmxpYyBUeXBlQnVpbGRlcjx0eXBlczo6aTw4PiosIGZhbHNlPiB7fTsKK3RlbXBsYXRlPD4gY2xhc3MgVHlwZUJ1aWxkZXI8Y29uc3Qgdm9pZCosIGZhbHNlPgorICA6IHB1YmxpYyBUeXBlQnVpbGRlcjx0eXBlczo6aTw4PiosIGZhbHNlPiB7fTsKK3RlbXBsYXRlPD4gY2xhc3MgVHlwZUJ1aWxkZXI8dm9sYXRpbGUgdm9pZCosIGZhbHNlPgorICA6IHB1YmxpYyBUeXBlQnVpbGRlcjx0eXBlczo6aTw4PiosIGZhbHNlPiB7fTsKK3RlbXBsYXRlPD4gY2xhc3MgVHlwZUJ1aWxkZXI8Y29uc3Qgdm9sYXRpbGUgdm9pZCosIGZhbHNlPgorICA6IHB1YmxpYyBUeXBlQnVpbGRlcjx0eXBlczo6aTw4PiosIGZhbHNlPiB7fTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUiwgYm9vbCBjcm9zcz4gY2xhc3MgVHlwZUJ1aWxkZXI8UigpLCBjcm9zcz4geworcHVibGljOgorICBzdGF0aWMgRnVuY3Rpb25UeXBlICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQpIHsKKyAgICByZXR1cm4gRnVuY3Rpb25UeXBlOjpnZXQoVHlwZUJ1aWxkZXI8UiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksIGZhbHNlKTsKKyAgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCBib29sIGNyb3NzPiBjbGFzcyBUeXBlQnVpbGRlcjxSKEExKSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIEZ1bmN0aW9uVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgVHlwZSAqcGFyYW1zW10gPSB7CisgICAgICBUeXBlQnVpbGRlcjxBMSwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgfTsKKyAgICByZXR1cm4gRnVuY3Rpb25UeXBlOjpnZXQoVHlwZUJ1aWxkZXI8UiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgZmFsc2UpOworICB9Cit9OwordGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCBib29sIGNyb3NzPgorY2xhc3MgVHlwZUJ1aWxkZXI8UihBMSwgQTIpLCBjcm9zcz4geworcHVibGljOgorICBzdGF0aWMgRnVuY3Rpb25UeXBlICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQpIHsKKyAgICBUeXBlICpwYXJhbXNbXSA9IHsKKyAgICAgIFR5cGVCdWlsZGVyPEExLCBjcm9zcz46OmdldChDb250ZXh0KSwKKyAgICAgIFR5cGVCdWlsZGVyPEEyLCBjcm9zcz46OmdldChDb250ZXh0KSwKKyAgICB9OworICAgIHJldHVybiBGdW5jdGlvblR5cGU6OmdldChUeXBlQnVpbGRlcjxSLCBjcm9zcz46OmdldChDb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBmYWxzZSk7CisgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCBib29sIGNyb3NzPgorY2xhc3MgVHlwZUJ1aWxkZXI8UihBMSwgQTIsIEEzKSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIEZ1bmN0aW9uVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgVHlwZSAqcGFyYW1zW10gPSB7CisgICAgICBUeXBlQnVpbGRlcjxBMSwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICBUeXBlQnVpbGRlcjxBMiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICBUeXBlQnVpbGRlcjxBMywgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgfTsKKyAgICByZXR1cm4gRnVuY3Rpb25UeXBlOjpnZXQoVHlwZUJ1aWxkZXI8UiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgZmFsc2UpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKKyAgICAgICAgIGJvb2wgY3Jvc3M+CitjbGFzcyBUeXBlQnVpbGRlcjxSKEExLCBBMiwgQTMsIEE0KSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIEZ1bmN0aW9uVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgVHlwZSAqcGFyYW1zW10gPSB7CisgICAgICBUeXBlQnVpbGRlcjxBMSwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICBUeXBlQnVpbGRlcjxBMiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICBUeXBlQnVpbGRlcjxBMywgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICBUeXBlQnVpbGRlcjxBNCwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgfTsKKyAgICByZXR1cm4gRnVuY3Rpb25UeXBlOjpnZXQoVHlwZUJ1aWxkZXI8UiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgZmFsc2UpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwKKyAgICAgICAgIHR5cGVuYW1lIEE1LCBib29sIGNyb3NzPgorY2xhc3MgVHlwZUJ1aWxkZXI8UihBMSwgQTIsIEEzLCBBNCwgQTUpLCBjcm9zcz4geworcHVibGljOgorICBzdGF0aWMgRnVuY3Rpb25UeXBlICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQpIHsKKyAgICBUeXBlICpwYXJhbXNbXSA9IHsKKyAgICAgIFR5cGVCdWlsZGVyPEExLCBjcm9zcz46OmdldChDb250ZXh0KSwKKyAgICAgIFR5cGVCdWlsZGVyPEEyLCBjcm9zcz46OmdldChDb250ZXh0KSwKKyAgICAgIFR5cGVCdWlsZGVyPEEzLCBjcm9zcz46OmdldChDb250ZXh0KSwKKyAgICAgIFR5cGVCdWlsZGVyPEE0LCBjcm9zcz46OmdldChDb250ZXh0KSwKKyAgICAgIFR5cGVCdWlsZGVyPEE1LCBjcm9zcz46OmdldChDb250ZXh0KSwKKyAgICB9OworICAgIHJldHVybiBGdW5jdGlvblR5cGU6OmdldChUeXBlQnVpbGRlcjxSLCBjcm9zcz46OmdldChDb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBmYWxzZSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFIsIGJvb2wgY3Jvc3M+IGNsYXNzIFR5cGVCdWlsZGVyPFIoLi4uKSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIEZ1bmN0aW9uVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgcmV0dXJuIEZ1bmN0aW9uVHlwZTo6Z2V0KFR5cGVCdWlsZGVyPFIsIGNyb3NzPjo6Z2V0KENvbnRleHQpLCB0cnVlKTsKKyAgfQorfTsKK3RlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCBib29sIGNyb3NzPgorY2xhc3MgVHlwZUJ1aWxkZXI8UihBMSwgLi4uKSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIEZ1bmN0aW9uVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgVHlwZSAqcGFyYW1zW10gPSB7CisgICAgICBUeXBlQnVpbGRlcjxBMSwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgfTsKKyAgICByZXR1cm4gRnVuY3Rpb25UeXBlOjpnZXQoVHlwZUJ1aWxkZXI8UiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksIHBhcmFtcywgdHJ1ZSk7CisgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIGJvb2wgY3Jvc3M+CitjbGFzcyBUeXBlQnVpbGRlcjxSKEExLCBBMiwgLi4uKSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIEZ1bmN0aW9uVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgVHlwZSAqcGFyYW1zW10gPSB7CisgICAgICBUeXBlQnVpbGRlcjxBMSwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICBUeXBlQnVpbGRlcjxBMiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgfTsKKyAgICByZXR1cm4gRnVuY3Rpb25UeXBlOjpnZXQoVHlwZUJ1aWxkZXI8UiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgdHJ1ZSk7CisgIH0KK307Cit0ZW1wbGF0ZTx0eXBlbmFtZSBSLCB0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCBib29sIGNyb3NzPgorY2xhc3MgVHlwZUJ1aWxkZXI8UihBMSwgQTIsIEEzLCAuLi4pLCBjcm9zcz4geworcHVibGljOgorICBzdGF0aWMgRnVuY3Rpb25UeXBlICpnZXQoTExWTUNvbnRleHQgJkNvbnRleHQpIHsKKyAgICBUeXBlICpwYXJhbXNbXSA9IHsKKyAgICAgIFR5cGVCdWlsZGVyPEExLCBjcm9zcz46OmdldChDb250ZXh0KSwKKyAgICAgIFR5cGVCdWlsZGVyPEEyLCBjcm9zcz46OmdldChDb250ZXh0KSwKKyAgICAgIFR5cGVCdWlsZGVyPEEzLCBjcm9zcz46OmdldChDb250ZXh0KSwKKyAgICB9OworICAgIHJldHVybiBGdW5jdGlvblR5cGU6OmdldChUeXBlQnVpbGRlcjxSLCBjcm9zcz46OmdldChDb250ZXh0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCB0cnVlKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgUiwgdHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsCisgICAgICAgICBib29sIGNyb3NzPgorY2xhc3MgVHlwZUJ1aWxkZXI8UihBMSwgQTIsIEEzLCBBNCwgLi4uKSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIEZ1bmN0aW9uVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgVHlwZSAqcGFyYW1zW10gPSB7CisgICAgICBUeXBlQnVpbGRlcjxBMSwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICBUeXBlQnVpbGRlcjxBMiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICBUeXBlQnVpbGRlcjxBMywgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICBUeXBlQnVpbGRlcjxBNCwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgfTsKKyAgICByZXR1cm4gRnVuY3Rpb25UeXBlOjpnZXQoVHlwZUJ1aWxkZXI8UiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgdHJ1ZSk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIFIsIHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LAorICAgICAgICAgdHlwZW5hbWUgQTUsIGJvb2wgY3Jvc3M+CitjbGFzcyBUeXBlQnVpbGRlcjxSKEExLCBBMiwgQTMsIEE0LCBBNSwgLi4uKSwgY3Jvc3M+IHsKK3B1YmxpYzoKKyAgc3RhdGljIEZ1bmN0aW9uVHlwZSAqZ2V0KExMVk1Db250ZXh0ICZDb250ZXh0KSB7CisgICAgVHlwZSAqcGFyYW1zW10gPSB7CisgICAgICBUeXBlQnVpbGRlcjxBMSwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICBUeXBlQnVpbGRlcjxBMiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICBUeXBlQnVpbGRlcjxBMywgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICBUeXBlQnVpbGRlcjxBNCwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICBUeXBlQnVpbGRlcjxBNSwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgfTsKKyAgICByZXR1cm4gRnVuY3Rpb25UeXBlOjpnZXQoVHlwZUJ1aWxkZXI8UiwgY3Jvc3M+OjpnZXQoQ29udGV4dCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgdHJ1ZSk7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9UeXBlRmluZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1R5cGVGaW5kZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDUwYzM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9UeXBlRmluZGVyLmgKQEAgLTAsMCArMSw4MiBAQAorLy89PT0tIGxsdm0vSVIvVHlwZUZpbmRlci5oIC0gQ2xhc3MgdG8gZmluZCB1c2VkIHN0cnVjdCB0eXBlcyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBUeXBlRmluZGVyIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9UWVBFRklOREVSX0gKKyNkZWZpbmUgTExWTV9JUl9UWVBFRklOREVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUROb2RlOworY2xhc3MgTW9kdWxlOworY2xhc3MgU3RydWN0VHlwZTsKK2NsYXNzIFR5cGU7CitjbGFzcyBWYWx1ZTsKKworLy8vIFR5cGVGaW5kZXIgLSBXYWxrIG92ZXIgYSBtb2R1bGUsIGlkZW50aWZ5aW5nIGFsbCBvZiB0aGUgdHlwZXMgdGhhdCBhcmUKKy8vLyB1c2VkIGJ5IHRoZSBtb2R1bGUuCitjbGFzcyBUeXBlRmluZGVyIHsKKyAgLy8gVG8gYXZvaWQgd2Fsa2luZyBjb25zdGFudCBleHByZXNzaW9ucyBtdWx0aXBsZSB0aW1lcyBhbmQgb3RoZXIgSVIKKyAgLy8gb2JqZWN0cywgd2Uga2VlcCBzZXZlcmFsIGhlbHBlciBtYXBzLgorICBEZW5zZVNldDxjb25zdCBWYWx1ZSo+IFZpc2l0ZWRDb25zdGFudHM7CisgIERlbnNlU2V0PGNvbnN0IE1ETm9kZSAqPiBWaXNpdGVkTWV0YWRhdGE7CisgIERlbnNlU2V0PFR5cGUqPiBWaXNpdGVkVHlwZXM7CisKKyAgc3RkOjp2ZWN0b3I8U3RydWN0VHlwZSo+IFN0cnVjdFR5cGVzOworICBib29sIE9ubHlOYW1lZCA9IGZhbHNlOworCitwdWJsaWM6CisgIFR5cGVGaW5kZXIoKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBydW4oY29uc3QgTW9kdWxlICZNLCBib29sIG9ubHlOYW1lZCk7CisgIHZvaWQgY2xlYXIoKTsKKworICB1c2luZyBpdGVyYXRvciA9IHN0ZDo6dmVjdG9yPFN0cnVjdFR5cGUqPjo6aXRlcmF0b3I7CisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gc3RkOjp2ZWN0b3I8U3RydWN0VHlwZSo+Ojpjb25zdF9pdGVyYXRvcjsKKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIFN0cnVjdFR5cGVzLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gU3RydWN0VHlwZXMuZW5kKCk7IH0KKworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFN0cnVjdFR5cGVzLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gU3RydWN0VHlwZXMuZW5kKCk7IH0KKworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gU3RydWN0VHlwZXMuZW1wdHkoKTsgfQorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFN0cnVjdFR5cGVzLnNpemUoKTsgfQorICBpdGVyYXRvciBlcmFzZShpdGVyYXRvciBJLCBpdGVyYXRvciBFKSB7IHJldHVybiBTdHJ1Y3RUeXBlcy5lcmFzZShJLCBFKTsgfQorCisgIFN0cnVjdFR5cGUgKiZvcGVyYXRvcltdKHVuc2lnbmVkIElkeCkgeyByZXR1cm4gU3RydWN0VHlwZXNbSWR4XTsgfQorCisgIERlbnNlU2V0PGNvbnN0IE1ETm9kZSAqPiAmZ2V0VmlzaXRlZE1ldGFkYXRhKCkgeyByZXR1cm4gVmlzaXRlZE1ldGFkYXRhOyB9CisKK3ByaXZhdGU6CisgIC8vLyBpbmNvcnBvcmF0ZVR5cGUgLSBUaGlzIG1ldGhvZCBhZGRzIHRoZSB0eXBlIHRvIHRoZSBsaXN0IG9mIHVzZWQKKyAgLy8vIHN0cnVjdHVyZXMgaWYgaXQncyBub3QgaW4gdGhlcmUgYWxyZWFkeS4KKyAgdm9pZCBpbmNvcnBvcmF0ZVR5cGUoVHlwZSAqVHkpOworCisgIC8vLyBpbmNvcnBvcmF0ZVZhbHVlIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byB3YWxrIG9wZXJhbmQgbGlzdHMgZmluZGluZyB0eXBlcworICAvLy8gaGlkaW5nIGluIGNvbnN0YW50IGV4cHJlc3Npb25zIGFuZCBvdGhlciBvcGVyYW5kcyB0aGF0IHdvbid0IGJlIHdhbGtlZCBpbgorICAvLy8gb3RoZXIgd2F5cy4gIEdsb2JhbFZhbHVlcywgYmFzaWMgYmxvY2tzLCBpbnN0cnVjdGlvbnMsIGFuZCBpbnN0IG9wZXJhbmRzCisgIC8vLyBhcmUgYWxsIGV4cGxpY2l0bHkgZW51bWVyYXRlZC4KKyAgdm9pZCBpbmNvcnBvcmF0ZVZhbHVlKGNvbnN0IFZhbHVlICpWKTsKKworICAvLy8gaW5jb3Jwb3JhdGVNRE5vZGUgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHdhbGsgdGhlIG9wZXJhbmRzIG9mIGFuIE1ETm9kZQorICAvLy8gdG8gZmluZCB0eXBlcyBoaWRpbmcgd2l0aGluLgorICB2b2lkIGluY29ycG9yYXRlTUROb2RlKGNvbnN0IE1ETm9kZSAqVik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9UWVBFRklOREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVXNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1VzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhYzEzOTMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1VzZS5oCkBAIC0wLDAgKzEsMTgyIEBACisvLz09PS0gbGx2bS9Vc2UuaCAtIERlZmluaXRpb24gb2YgdGhlIFVzZSBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8KKy8vLyBUaGlzIGRlZmluZXMgdGhlIFVzZSBjbGFzcy4gIFRoZSBVc2UgY2xhc3MgcmVwcmVzZW50cyB0aGUgb3BlcmFuZCBvZiBhbgorLy8vIGluc3RydWN0aW9uIG9yIHNvbWUgb3RoZXIgVXNlciBpbnN0YW5jZSB3aGljaCByZWZlcnMgdG8gYSBWYWx1ZS4gIFRoZSBVc2UKKy8vLyBjbGFzcyBrZWVwcyB0aGUgInVzZSBsaXN0IiBvZiB0aGUgcmVmZXJlbmNlZCB2YWx1ZSB1cCB0byBkYXRlLgorLy8vCisvLy8gUG9pbnRlciB0YWdnaW5nIGlzIHVzZWQgdG8gZWZmaWNpZW50bHkgZmluZCB0aGUgVXNlciBjb3JyZXNwb25kaW5nIHRvIGEgVXNlCisvLy8gd2l0aG91dCBoYXZpbmcgdG8gc3RvcmUgYSBVc2VyIHBvaW50ZXIgaW4gZXZlcnkgVXNlLiBBIFVzZXIgaXMgcHJlY2VkZWQgaW4KKy8vLyBtZW1vcnkgYnkgYWxsIHRoZSBVc2VzIGNvcnJlc3BvbmRpbmcgdG8gaXRzIG9wZXJhbmRzLCBhbmQgdGhlIGxvdyBiaXRzIG9mCisvLy8gb25lIG9mIHRoZSBmaWVsZHMgKFByZXYpIG9mIHRoZSBVc2UgY2xhc3MgYXJlIHVzZWQgdG8gZW5jb2RlIG9mZnNldHMgdG8gYmUKKy8vLyBhYmxlIHRvIGZpbmQgdGhhdCBVc2VyIGdpdmVuIGEgcG9pbnRlciB0byBhbnkgVXNlLiBGb3IgZGV0YWlscywgc2VlOgorLy8vCisvLy8gICBodHRwOi8vd3d3Lmxsdm0ub3JnL2RvY3MvUHJvZ3JhbW1lcnNNYW51YWwuaHRtbCNVc2VyTGF5b3V0CisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9VU0VfSAorI2RlZmluZSBMTFZNX0lSX1VTRV9ICisKKyNpbmNsdWRlICJsbHZtLWMvVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DQmluZGluZ1dyYXBwaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lPiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTsKK2NsYXNzIFVzZXI7CitjbGFzcyBWYWx1ZTsKKworLy8vIFxicmllZiBBIFVzZSByZXByZXNlbnRzIHRoZSBlZGdlIGJldHdlZW4gYSBWYWx1ZSBkZWZpbml0aW9uIGFuZCBpdHMgdXNlcnMuCisvLy8KKy8vLyBUaGlzIGlzIG5vdGlvbmFsbHkgYSB0d28tZGltZW5zaW9uYWwgbGlua2VkIGxpc3QuIEl0IHN1cHBvcnRzIHRyYXZlcnNpbmcKKy8vLyBhbGwgb2YgdGhlIHVzZXMgZm9yIGEgcGFydGljdWxhciB2YWx1ZSBkZWZpbml0aW9uLiBJdCBhbHNvIHN1cHBvcnRzIGp1bXBpbmcKKy8vLyBkaXJlY3RseSB0byB0aGUgdXNlZCB2YWx1ZSB3aGVuIHdlIGFycml2ZSBmcm9tIHRoZSBVc2VyJ3Mgb3BlcmFuZHMsIGFuZAorLy8vIGp1bXBpbmcgZGlyZWN0bHkgdG8gdGhlIFVzZXIgd2hlbiB3ZSBhcnJpdmUgZnJvbSB0aGUgVmFsdWUncyB1c2VzLgorLy8vCisvLy8gVGhlIHBvaW50ZXIgdG8gdGhlIHVzZWQgVmFsdWUgaXMgZXhwbGljaXQsIGFuZCB0aGUgcG9pbnRlciB0byB0aGUgVXNlciBpcworLy8vIGltcGxpY2l0LiBUaGUgaW1wbGljaXQgcG9pbnRlciBpcyBmb3VuZCB2aWEgYSB3YXltYXJraW5nIGFsZ29yaXRobQorLy8vIGRlc2NyaWJlZCBpbiB0aGUgcHJvZ3JhbW1lcidzIG1hbnVhbDoKKy8vLworLy8vICAgaHR0cDovL3d3dy5sbHZtLm9yZy9kb2NzL1Byb2dyYW1tZXJzTWFudWFsLmh0bWwjdGhlLXdheW1hcmtpbmctYWxnb3JpdGhtCisvLy8KKy8vLyBUaGlzIGlzIGVzc2VudGlhbGx5IHRoZSBzaW5nbGUgbW9zdCBtZW1vcnkgaW50ZW5zaXZlIG9iamVjdCBpbiBMTFZNIGJlY2F1c2UKKy8vLyBvZiB0aGUgbnVtYmVyIG9mIHVzZXMgaW4gdGhlIHN5c3RlbS4gQXQgdGhlIHNhbWUgdGltZSwgdGhlIGNvbnN0YW50IHRpbWUKKy8vLyBvcGVyYXRpb25zIGl0IGFsbG93cyBhcmUgZXNzZW50aWFsIHRvIG1hbnkgb3B0aW1pemF0aW9ucyBoYXZpbmcgcmVhc29uYWJsZQorLy8vIHRpbWUgY29tcGxleGl0eS4KK2NsYXNzIFVzZSB7CitwdWJsaWM6CisgIFVzZShjb25zdCBVc2UgJlUpID0gZGVsZXRlOworCisgIC8vLyBcYnJpZWYgUHJvdmlkZSBhIGZhc3Qgc3Vic3RpdHV0ZSB0byBzdGQ6OnN3YXA8VXNlPgorICAvLy8gdGhhdCBhbHNvIHdvcmtzIHdpdGggbGVzcyBzdGFuZGFyZC1jb21wbGlhbnQgY29tcGlsZXJzCisgIHZvaWQgc3dhcChVc2UgJlJIUyk7CisKKyAgLy8vIFBvaW50ZXIgdHJhaXRzIGZvciB0aGUgVXNlclJlZiBQb2ludGVySW50UGFpci4gVGhpcyBlbnN1cmVzIHdlIGFsd2F5cworICAvLy8gdXNlIHRoZSBMU0IgcmVnYXJkbGVzcyBvZiBwb2ludGVyIGFsaWdubWVudCBvbiBkaWZmZXJlbnQgdGFyZ2V0cy4KKyAgc3RydWN0IFVzZXJSZWZQb2ludGVyVHJhaXRzIHsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgKmdldEFzVm9pZFBvaW50ZXIoVXNlciAqUCkgeyByZXR1cm4gUDsgfQorCisgICAgc3RhdGljIGlubGluZSBVc2VyICpnZXRGcm9tVm9pZFBvaW50ZXIodm9pZCAqUCkgeworICAgICAgcmV0dXJuIChVc2VyICopUDsKKyAgICB9CisKKyAgICBlbnVtIHsgTnVtTG93Qml0c0F2YWlsYWJsZSA9IDEgfTsKKyAgfTsKKworICAvLyBBIHR5cGUgZm9yIHRoZSB3b3JkIGZvbGxvd2luZyBhbiBhcnJheSBvZiBodW5nLW9mZiBVc2VzIGluIG1lbW9yeSwgd2hpY2ggaXMKKyAgLy8gYSBwb2ludGVyIGJhY2sgdG8gdGhlaXIgVXNlciB3aXRoIHRoZSBib3R0b20gYml0IHNldC4KKyAgdXNpbmcgVXNlclJlZiA9IFBvaW50ZXJJbnRQYWlyPFVzZXIgKiwgMSwgdW5zaWduZWQsIFVzZXJSZWZQb2ludGVyVHJhaXRzPjsKKworICAvLy8gUG9pbnRlciB0cmFpdHMgZm9yIHRoZSBQcmV2IFBvaW50ZXJJbnRQYWlyLiBUaGlzIGVuc3VyZXMgd2UgYWx3YXlzIHVzZQorICAvLy8gdGhlIHR3byBMU0JzIHJlZ2FyZGxlc3Mgb2YgcG9pbnRlciBhbGlnbm1lbnQgb24gZGlmZmVyZW50IHRhcmdldHMuCisgIHN0cnVjdCBQcmV2UG9pbnRlclRyYWl0cyB7CisgICAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKFVzZSAqKlApIHsgcmV0dXJuIFA7IH0KKworICAgIHN0YXRpYyBpbmxpbmUgVXNlICoqZ2V0RnJvbVZvaWRQb2ludGVyKHZvaWQgKlApIHsKKyAgICAgIHJldHVybiAoVXNlICoqKVA7CisgICAgfQorCisgICAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSAyIH07CisgIH07CisKK3ByaXZhdGU6CisgIC8vLyBEZXN0cnVjdG9yIC0gT25seSBmb3IgemFwKCkKKyAgflVzZSgpIHsKKyAgICBpZiAoVmFsKQorICAgICAgcmVtb3ZlRnJvbUxpc3QoKTsKKyAgfQorCisgIGVudW0gUHJldlB0clRhZyB7IHplcm9EaWdpdFRhZywgb25lRGlnaXRUYWcsIHN0b3BUYWcsIGZ1bGxTdG9wVGFnIH07CisKKyAgLy8vIENvbnN0cnVjdG9yCisgIFVzZShQcmV2UHRyVGFnIHRhZykgeyBQcmV2LnNldEludCh0YWcpOyB9CisKK3B1YmxpYzoKKyAgZnJpZW5kIGNsYXNzIFZhbHVlOworCisgIG9wZXJhdG9yIFZhbHVlICooKSBjb25zdCB7IHJldHVybiBWYWw7IH0KKyAgVmFsdWUgKmdldCgpIGNvbnN0IHsgcmV0dXJuIFZhbDsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgVXNlciB0aGF0IGNvbnRhaW5zIHRoaXMgVXNlLgorICAvLy8KKyAgLy8vIEZvciBhbiBpbnN0cnVjdGlvbiBvcGVyYW5kLCBmb3IgZXhhbXBsZSwgdGhpcyB3aWxsIHJldHVybiB0aGUKKyAgLy8vIGluc3RydWN0aW9uLgorICBVc2VyICpnZXRVc2VyKCkgY29uc3QgTExWTV9SRUFET05MWTsKKworICBpbmxpbmUgdm9pZCBzZXQoVmFsdWUgKlZhbCk7CisKKyAgaW5saW5lIFZhbHVlICpvcGVyYXRvcj0oVmFsdWUgKlJIUyk7CisgIGlubGluZSBjb25zdCBVc2UgJm9wZXJhdG9yPShjb25zdCBVc2UgJlJIUyk7CisKKyAgVmFsdWUgKm9wZXJhdG9yLT4oKSB7IHJldHVybiBWYWw7IH0KKyAgY29uc3QgVmFsdWUgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBWYWw7IH0KKworICBVc2UgKmdldE5leHQoKSBjb25zdCB7IHJldHVybiBOZXh0OyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG9wZXJhbmQgIyBvZiB0aGlzIHVzZSBpbiBpdHMgVXNlci4KKyAgdW5zaWduZWQgZ2V0T3BlcmFuZE5vKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJbml0aWFsaXplcyB0aGUgd2F5bWFya2luZyB0YWdzIG9uIGFuIGFycmF5IG9mIFVzZXMuCisgIC8vLworICAvLy8gVGhpcyBzZXRzIHVwIHRoZSBhcnJheSBvZiBVc2VzIHN1Y2ggdGhhdCBnZXRVc2VyKCkgY2FuIGZpbmQgdGhlIFVzZXIgZnJvbQorICAvLy8gYW55IG9mIHRob3NlIFVzZXMuCisgIHN0YXRpYyBVc2UgKmluaXRUYWdzKFVzZSAqU3RhcnQsIFVzZSAqU3RvcCk7CisKKyAgLy8vIFxicmllZiBEZXN0cm95cyBVc2Ugb3BlcmFuZHMgd2hlbiB0aGUgbnVtYmVyIG9mIG9wZXJhbmRzIG9mCisgIC8vLyBhIFVzZXIgY2hhbmdlcy4KKyAgc3RhdGljIHZvaWQgemFwKFVzZSAqU3RhcnQsIGNvbnN0IFVzZSAqU3RvcCwgYm9vbCBkZWwgPSBmYWxzZSk7CisKK3ByaXZhdGU6CisgIGNvbnN0IFVzZSAqZ2V0SW1wbGllZFVzZXIoKSBjb25zdCBMTFZNX1JFQURPTkxZOworCisgIFZhbHVlICpWYWwgPSBudWxscHRyOworICBVc2UgKk5leHQ7CisgIFBvaW50ZXJJbnRQYWlyPFVzZSAqKiwgMiwgUHJldlB0clRhZywgUHJldlBvaW50ZXJUcmFpdHM+IFByZXY7CisKKyAgdm9pZCBzZXRQcmV2KFVzZSAqKk5ld1ByZXYpIHsgUHJldi5zZXRQb2ludGVyKE5ld1ByZXYpOyB9CisKKyAgdm9pZCBhZGRUb0xpc3QoVXNlICoqTGlzdCkgeworICAgIE5leHQgPSAqTGlzdDsKKyAgICBpZiAoTmV4dCkKKyAgICAgIE5leHQtPnNldFByZXYoJk5leHQpOworICAgIHNldFByZXYoTGlzdCk7CisgICAgKkxpc3QgPSB0aGlzOworICB9CisKKyAgdm9pZCByZW1vdmVGcm9tTGlzdCgpIHsKKyAgICBVc2UgKipTdHJpcHBlZFByZXYgPSBQcmV2LmdldFBvaW50ZXIoKTsKKyAgICAqU3RyaXBwZWRQcmV2ID0gTmV4dDsKKyAgICBpZiAoTmV4dCkKKyAgICAgIE5leHQtPnNldFByZXYoU3RyaXBwZWRQcmV2KTsKKyAgfQorfTsKKworLy8vIFxicmllZiBBbGxvdyBjbGllbnRzIHRvIHRyZWF0IHVzZXMganVzdCBsaWtlIHZhbHVlcyB3aGVuIHVzaW5nCisvLy8gY2FzdGluZyBvcGVyYXRvcnMuCit0ZW1wbGF0ZSA8PiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxVc2U+IHsKKyAgdXNpbmcgU2ltcGxlVHlwZSA9IFZhbHVlICo7CisKKyAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKFVzZSAmVmFsKSB7IHJldHVybiBWYWwuZ2V0KCk7IH0KK307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxjb25zdCBVc2U+IHsKKyAgdXNpbmcgU2ltcGxlVHlwZSA9IC8qY29uc3QqLyBWYWx1ZSAqOworCisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShjb25zdCBVc2UgJlZhbCkgeyByZXR1cm4gVmFsLmdldCgpOyB9Cit9OworCisvLyBDcmVhdGUgd3JhcHBlcnMgZm9yIEMgQmluZGluZyB0eXBlcyAoc2VlIENCaW5kaW5nV3JhcHBpbmcuaCkuCitERUZJTkVfU0lNUExFX0NPTlZFUlNJT05fRlVOQ1RJT05TKFVzZSwgTExWTVVzZVJlZikKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfVVNFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVXNlTGlzdE9yZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1VzZUxpc3RPcmRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4YjM5NGYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1VzZUxpc3RPcmRlci5oCkBAIC0wLDAgKzEsNDQgQEAKKy8vPT09LSBsbHZtL0lSL1VzZUxpc3RPcmRlci5oIC0gTExWTSBVc2UgTGlzdCBPcmRlciAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGhhcyBzdHJ1Y3R1cmVzIGFuZCBjb21tYW5kLWxpbmUgb3B0aW9ucyBmb3IgcHJlc2VydmluZyB1c2UtbGlzdAorLy8gb3JkZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX1VTRUxJU1RPUkRFUl9ICisjZGVmaW5lIExMVk1fSVJfVVNFTElTVE9SREVSX0gKKworI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgVmFsdWU7CisKKy8vLyBcYnJpZWYgU3RydWN0dXJlIHRvIGhvbGQgYSB1c2UtbGlzdCBvcmRlci4KK3N0cnVjdCBVc2VMaXN0T3JkZXIgeworICBjb25zdCBWYWx1ZSAqViA9IG51bGxwdHI7CisgIGNvbnN0IEZ1bmN0aW9uICpGID0gbnVsbHB0cjsKKyAgc3RkOjp2ZWN0b3I8dW5zaWduZWQ+IFNodWZmbGU7CisKKyAgVXNlTGlzdE9yZGVyKGNvbnN0IFZhbHVlICpWLCBjb25zdCBGdW5jdGlvbiAqRiwgc2l6ZV90IFNodWZmbGVTaXplKQorICAgICAgOiBWKFYpLCBGKEYpLCBTaHVmZmxlKFNodWZmbGVTaXplKSB7fQorCisgIFVzZUxpc3RPcmRlcigpID0gZGVmYXVsdDsKKyAgVXNlTGlzdE9yZGVyKFVzZUxpc3RPcmRlciAmJikgPSBkZWZhdWx0OworICBVc2VMaXN0T3JkZXIgJm9wZXJhdG9yPShVc2VMaXN0T3JkZXIgJiYpID0gZGVmYXVsdDsKK307CisKK3VzaW5nIFVzZUxpc3RPcmRlclN0YWNrID0gc3RkOjp2ZWN0b3I8VXNlTGlzdE9yZGVyPjsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfVVNFTElTVE9SREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVXNlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9Vc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQzMGJlMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVXNlci5oCkBAIC0wLDAgKzEsMzM1IEBACisvLz09PS0gbGx2bS9Vc2VyLmggLSBVc2VyIGNsYXNzIGRlZmluaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgY2xhc3MgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHRoYXQgb25lIHdobyB1c2VzIGEgVmFsdWUgbXVzdCBpbXBsZW1lbnQuCisvLyBFYWNoIGluc3RhbmNlIG9mIHRoZSBWYWx1ZSBjbGFzcyBrZWVwcyB0cmFjayBvZiB3aGF0IFVzZXIncyBoYXZlIGhhbmRsZXMKKy8vIHRvIGl0LgorLy8KKy8vICAqIEluc3RydWN0aW9ucyBhcmUgdGhlIGxhcmdlc3QgY2xhc3Mgb2YgVXNlcnMuCisvLyAgKiBDb25zdGFudHMgbWF5IGJlIHVzZXJzIG9mIG90aGVyIGNvbnN0YW50cyAodGhpbmsgYXJyYXlzIGFuZCBzdHVmZikKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfVVNFUl9ICisjZGVmaW5lIExMVk1fSVJfVVNFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Vc2UuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheVJlZjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBNdXRhYmxlQXJyYXlSZWY7CisKKy8vLyBcYnJpZWYgQ29tcGlsZS10aW1lIGN1c3RvbWl6YXRpb24gb2YgVXNlciBvcGVyYW5kcy4KKy8vLworLy8vIEN1c3RvbWl6ZXMgb3BlcmFuZC1yZWxhdGVkIGFsbG9jYXRvcnMgYW5kIGFjY2Vzc29ycy4KK3RlbXBsYXRlIDxjbGFzcz4KK3N0cnVjdCBPcGVyYW5kVHJhaXRzOworCitjbGFzcyBVc2VyIDogcHVibGljIFZhbHVlIHsKKyAgdGVtcGxhdGUgPHVuc2lnbmVkPgorICBmcmllbmQgc3RydWN0IEh1bmdvZmZPcGVyYW5kVHJhaXRzOworCisgIExMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgaW5saW5lIHN0YXRpYyB2b2lkICoKKyAgYWxsb2NhdGVGaXhlZE9wZXJhbmRVc2VyKHNpemVfdCwgdW5zaWduZWQsIHVuc2lnbmVkKTsKKworcHJvdGVjdGVkOgorICAvLy8gQWxsb2NhdGUgYSBVc2VyIHdpdGggYW4gb3BlcmFuZCBwb2ludGVyIGNvLWFsbG9jYXRlZC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgZm9yIHN1YmNsYXNzZXMgd2hpY2ggbmVlZCB0byBhbGxvY2F0ZSBhIHZhcmlhYmxlIG51bWJlcgorICAvLy8gb2Ygb3BlcmFuZHMsIGllLCAnaHVuZyBvZmYgdXNlcycuCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgU2l6ZSk7CisKKyAgLy8vIEFsbG9jYXRlIGEgVXNlciB3aXRoIHRoZSBvcGVyYW5kcyBjby1hbGxvY2F0ZWQuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIGZvciBzdWJjbGFzc2VzIHdoaWNoIGhhdmUgYSBmaXhlZCBudW1iZXIgb2Ygb3BlcmFuZHMuCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgU2l6ZSwgdW5zaWduZWQgVXMpOworCisgIC8vLyBBbGxvY2F0ZSBhIFVzZXIgd2l0aCB0aGUgb3BlcmFuZHMgY28tYWxsb2NhdGVkLiAgSWYgRGVzY0J5dGVzIGlzIG5vbi16ZXJvCisgIC8vLyB0aGVuIGFsbG9jYXRlIGFuIGFkZGl0aW9uYWwgRGVzY0J5dGVzIGJ5dGVzIGJlZm9yZSB0aGUgb3BlcmFuZHMuIFRoZXNlCisgIC8vLyBieXRlcyBjYW4gYmUgYWNjZXNzZWQgYnkgY2FsbGluZyBnZXREZXNjcmlwdG9yLgorICAvLy8KKyAgLy8vIERlc2NCeXRlcyBuZWVkcyB0byBiZSBkaXZpc2libGUgYnkgc2l6ZW9mKHZvaWQgKikuICBUaGUgYWxsb2NhdGVkCisgIC8vLyBkZXNjcmlwdG9yLCBpZiBhbnksIGlzIGFsaWduZWQgdG8gc2l6ZW9mKHZvaWQgKikgYnl0ZXMuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIGZvciBzdWJjbGFzc2VzIHdoaWNoIGhhdmUgYSBmaXhlZCBudW1iZXIgb2Ygb3BlcmFuZHMuCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgU2l6ZSwgdW5zaWduZWQgVXMsIHVuc2lnbmVkIERlc2NCeXRlcyk7CisKKyAgVXNlcihUeXBlICp0eSwgdW5zaWduZWQgdnR5LCBVc2UgKiwgdW5zaWduZWQgTnVtT3BzKQorICAgICAgOiBWYWx1ZSh0eSwgdnR5KSB7CisgICAgYXNzZXJ0KE51bU9wcyA8ICgxdSA8PCBOdW1Vc2VyT3BlcmFuZHNCaXRzKSAmJiAiVG9vIG1hbnkgb3BlcmFuZHMiKTsKKyAgICBOdW1Vc2VyT3BlcmFuZHMgPSBOdW1PcHM7CisgICAgLy8gSWYgd2UgaGF2ZSBodW5nIG9mZiB1c2VzLCB0aGVuIHRoZSBvcGVyYW5kIGxpc3Qgc2hvdWxkIGluaXRpYWxseSBiZQorICAgIC8vIG51bGwuCisgICAgYXNzZXJ0KCghSGFzSHVuZ09mZlVzZXMgfHwgIWdldE9wZXJhbmRMaXN0KCkpICYmCisgICAgICAgICAgICJFcnJvciBpbiBpbml0aWFsaXppbmcgaHVuZyBvZmYgdXNlcyBmb3IgVXNlciIpOworICB9CisKKyAgLy8vIFxicmllZiBBbGxvY2F0ZSB0aGUgYXJyYXkgb2YgVXNlcywgZm9sbG93ZWQgYnkgYSBwb2ludGVyCisgIC8vLyAod2l0aCBib3R0b20gYml0IHNldCkgdG8gdGhlIFVzZXIuCisgIC8vLyBccGFyYW0gSXNQaGkgaWRlbnRpZmllcyBjYWxsZXJzIHdoaWNoIGFyZSBwaGkgbm9kZXMgYW5kIHdoaWNoIG5lZWQKKyAgLy8vIE4gQmFzaWNCbG9jayogYWxsb2NhdGVkIGFsb25nIHdpdGggTgorICB2b2lkIGFsbG9jSHVuZ29mZlVzZXModW5zaWduZWQgTiwgYm9vbCBJc1BoaSA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIEdyb3cgdGhlIG51bWJlciBvZiBodW5nIG9mZiB1c2VzLiAgTm90ZSB0aGF0IGFsbG9jSHVuZ29mZlVzZXMKKyAgLy8vIHNob3VsZCBiZSBjYWxsZWQgaWYgdGhlcmUgYXJlIG5vIHVzZXMuCisgIHZvaWQgZ3Jvd0h1bmdvZmZVc2VzKHVuc2lnbmVkIE4sIGJvb2wgSXNQaGkgPSBmYWxzZSk7CisKK3Byb3RlY3RlZDoKKyAgflVzZXIoKSA9IGRlZmF1bHQ7IC8vIFVzZSBkZWxldGVWYWx1ZSgpIHRvIGRlbGV0ZSBhIGdlbmVyaWMgSW5zdHJ1Y3Rpb24uCisKK3B1YmxpYzoKKyAgVXNlcihjb25zdCBVc2VyICYpID0gZGVsZXRlOworCisgIC8vLyBcYnJpZWYgRnJlZSBtZW1vcnkgYWxsb2NhdGVkIGZvciBVc2VyIGFuZCBVc2Ugb2JqZWN0cy4KKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqVXNyKTsKKyAgLy8vIFxicmllZiBQbGFjZW1lbnQgZGVsZXRlIC0gcmVxdWlyZWQgYnkgc3RkLCBjYWxsZWQgaWYgdGhlIGN0b3IgdGhyb3dzLgorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpVc3IsIHVuc2lnbmVkKSB7CisgICAgLy8gTm90ZTogSWYgYSBzdWJjbGFzcyBtYW5pcHVsYXRlcyB0aGUgaW5mb3JtYXRpb24gd2hpY2ggaXMgcmVxdWlyZWQgdG8gY2FsY3VsYXRlIHRoZSAKKyAgICAvLyBVc3IgbWVtb3J5IHBvaW50ZXIsIGUuZy4gTnVtVXNlck9wZXJhbmRzLCB0aGUgb3BlcmF0b3IgZGVsZXRlIG9mIHRoYXQgc3ViY2xhc3MgaGFzIAorICAgIC8vIHRvIHJlc3RvcmUgdGhlIGNoYW5nZWQgaW5mb3JtYXRpb24gdG8gdGhlIG9yaWdpbmFsIHZhbHVlLCBzaW5jZSB0aGUgZHRvciBvZiB0aGF0IGNsYXNzCisgICAgLy8gaXMgbm90IGNhbGxlZCBpZiB0aGUgY3RvciBmYWlscy4gIAorICAgIFVzZXI6Om9wZXJhdG9yIGRlbGV0ZShVc3IpOworCisjaWZuZGVmIExMVk1fRU5BQkxFX0VYQ0VQVElPTlMKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJDb25zdHJ1Y3RvciB0aHJvd3M/Iik7CisjZW5kaWYKKyAgfQorICAvLy8gXGJyaWVmIFBsYWNlbWVudCBkZWxldGUgLSByZXF1aXJlZCBieSBzdGQsIGNhbGxlZCBpZiB0aGUgY3RvciB0aHJvd3MuCisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKlVzciwgdW5zaWduZWQsIGJvb2wpIHsKKyAgICAvLyBOb3RlOiBJZiBhIHN1YmNsYXNzIG1hbmlwdWxhdGVzIHRoZSBpbmZvcm1hdGlvbiB3aGljaCBpcyByZXF1aXJlZCB0byBjYWxjdWxhdGUgdGhlIAorICAgIC8vIFVzciBtZW1vcnkgcG9pbnRlciwgZS5nLiBOdW1Vc2VyT3BlcmFuZHMsIHRoZSBvcGVyYXRvciBkZWxldGUgb2YgdGhhdCBzdWJjbGFzcyBoYXMgCisgICAgLy8gdG8gcmVzdG9yZSB0aGUgY2hhbmdlZCBpbmZvcm1hdGlvbiB0byB0aGUgb3JpZ2luYWwgdmFsdWUsIHNpbmNlIHRoZSBkdG9yIG9mIHRoYXQgY2xhc3MKKyAgICAvLyBpcyBub3QgY2FsbGVkIGlmIHRoZSBjdG9yIGZhaWxzLiAgCisgICAgVXNlcjo6b3BlcmF0b3IgZGVsZXRlKFVzcik7CisKKyNpZm5kZWYgTExWTV9FTkFCTEVfRVhDRVBUSU9OUworICAgIGxsdm1fdW5yZWFjaGFibGUoIkNvbnN0cnVjdG9yIHRocm93cz8iKTsKKyNlbmRpZgorICB9CisKK3Byb3RlY3RlZDoKKyAgdGVtcGxhdGUgPGludCBJZHgsIHR5cGVuYW1lIFU+IHN0YXRpYyBVc2UgJk9wRnJvbShjb25zdCBVICp0aGF0KSB7CisgICAgcmV0dXJuIElkeCA8IDAKKyAgICAgID8gT3BlcmFuZFRyYWl0czxVPjo6b3BfZW5kKGNvbnN0X2Nhc3Q8VSo+KHRoYXQpKVtJZHhdCisgICAgICA6IE9wZXJhbmRUcmFpdHM8VT46Om9wX2JlZ2luKGNvbnN0X2Nhc3Q8VSo+KHRoYXQpKVtJZHhdOworICB9CisKKyAgdGVtcGxhdGUgPGludCBJZHg+IFVzZSAmT3AoKSB7CisgICAgcmV0dXJuIE9wRnJvbTxJZHg+KHRoaXMpOworICB9CisgIHRlbXBsYXRlIDxpbnQgSWR4PiBjb25zdCBVc2UgJk9wKCkgY29uc3QgeworICAgIHJldHVybiBPcEZyb208SWR4Pih0aGlzKTsKKyAgfQorCitwcml2YXRlOgorICBjb25zdCBVc2UgKmdldEh1bmdPZmZPcGVyYW5kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gKihyZWludGVycHJldF9jYXN0PGNvbnN0IFVzZSAqY29uc3QgKj4odGhpcykgLSAxKTsKKyAgfQorCisgIFVzZSAqJmdldEh1bmdPZmZPcGVyYW5kcygpIHsgcmV0dXJuICoocmVpbnRlcnByZXRfY2FzdDxVc2UgKio+KHRoaXMpIC0gMSk7IH0KKworICBjb25zdCBVc2UgKmdldEludHJ1c2l2ZU9wZXJhbmRzKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFVzZSAqPih0aGlzKSAtIE51bVVzZXJPcGVyYW5kczsKKyAgfQorCisgIFVzZSAqZ2V0SW50cnVzaXZlT3BlcmFuZHMoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VXNlICo+KHRoaXMpIC0gTnVtVXNlck9wZXJhbmRzOworICB9CisKKyAgdm9pZCBzZXRPcGVyYW5kTGlzdChVc2UgKk5ld0xpc3QpIHsKKyAgICBhc3NlcnQoSGFzSHVuZ09mZlVzZXMgJiYKKyAgICAgICAgICAgIlNldHRpbmcgb3BlcmFuZCBsaXN0IG9ubHkgcmVxdWlyZWQgZm9yIGh1bmcgb2ZmIHVzZXMiKTsKKyAgICBnZXRIdW5nT2ZmT3BlcmFuZHMoKSA9IE5ld0xpc3Q7CisgIH0KKworcHVibGljOgorICBjb25zdCBVc2UgKmdldE9wZXJhbmRMaXN0KCkgY29uc3QgeworICAgIHJldHVybiBIYXNIdW5nT2ZmVXNlcyA/IGdldEh1bmdPZmZPcGVyYW5kcygpIDogZ2V0SW50cnVzaXZlT3BlcmFuZHMoKTsKKyAgfQorICBVc2UgKmdldE9wZXJhbmRMaXN0KCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PFVzZSAqPihzdGF0aWNfY2FzdDxjb25zdCBVc2VyICo+KHRoaXMpLT5nZXRPcGVyYW5kTGlzdCgpKTsKKyAgfQorCisgIFZhbHVlICpnZXRPcGVyYW5kKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IE51bVVzZXJPcGVyYW5kcyAmJiAiZ2V0T3BlcmFuZCgpIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gZ2V0T3BlcmFuZExpc3QoKVtpXTsKKyAgfQorCisgIHZvaWQgc2V0T3BlcmFuZCh1bnNpZ25lZCBpLCBWYWx1ZSAqVmFsKSB7CisgICAgYXNzZXJ0KGkgPCBOdW1Vc2VyT3BlcmFuZHMgJiYgInNldE9wZXJhbmQoKSBvdXQgb2YgcmFuZ2UhIik7CisgICAgYXNzZXJ0KCghaXNhPENvbnN0YW50PigoY29uc3QgVmFsdWUqKXRoaXMpIHx8CisgICAgICAgICAgICBpc2E8R2xvYmFsVmFsdWU+KChjb25zdCBWYWx1ZSopdGhpcykpICYmCisgICAgICAgICAgICJDYW5ub3QgbXV0YXRlIGEgY29uc3RhbnQgd2l0aCBzZXRPcGVyYW5kISIpOworICAgIGdldE9wZXJhbmRMaXN0KClbaV0gPSBWYWw7CisgIH0KKworICBjb25zdCBVc2UgJmdldE9wZXJhbmRVc2UodW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpIDwgTnVtVXNlck9wZXJhbmRzICYmICJnZXRPcGVyYW5kVXNlKCkgb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBnZXRPcGVyYW5kTGlzdCgpW2ldOworICB9CisgIFVzZSAmZ2V0T3BlcmFuZFVzZSh1bnNpZ25lZCBpKSB7CisgICAgYXNzZXJ0KGkgPCBOdW1Vc2VyT3BlcmFuZHMgJiYgImdldE9wZXJhbmRVc2UoKSBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIGdldE9wZXJhbmRMaXN0KClbaV07CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kcygpIGNvbnN0IHsgcmV0dXJuIE51bVVzZXJPcGVyYW5kczsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGNvLWFsbG9jYXRlZCB3aXRoIHRoaXMgVXNlciBpbnN0YW5jZS4KKyAgQXJyYXlSZWY8Y29uc3QgdWludDhfdD4gZ2V0RGVzY3JpcHRvcigpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGNvLWFsbG9jYXRlZCB3aXRoIHRoaXMgVXNlciBpbnN0YW5jZS4KKyAgTXV0YWJsZUFycmF5UmVmPHVpbnQ4X3Q+IGdldERlc2NyaXB0b3IoKTsKKworICAvLy8gU2V0IHRoZSBudW1iZXIgb2Ygb3BlcmFuZHMgb24gYSBHbG9iYWxWYXJpYWJsZS4KKyAgLy8vCisgIC8vLyBHbG9iYWxWYXJpYWJsZSBhbHdheXMgYWxsb2NhdGVzIHNwYWNlIGZvciBhIHNpbmdsZSBvcGVyYW5kcywgYnV0CisgIC8vLyBkb2Vzbid0IGFsd2F5cyB1c2UgaXQuCisgIC8vLworICAvLy8gRklYTUU6IEFzIHRoYXQgdGhlIG51bWJlciBvZiBvcGVyYW5kcyBpcyB1c2VkIHRvIGZpbmQgdGhlIHN0YXJ0IG9mCisgIC8vLyB0aGUgYWxsb2NhdGVkIG1lbW9yeSBpbiBvcGVyYXRvciBkZWxldGUsIHdlIG5lZWQgdG8gYWx3YXlzIHRoaW5rIHdlIGhhdmUKKyAgLy8vIDEgb3BlcmFuZCBiZWZvcmUgZGVsZXRlLgorICB2b2lkIHNldEdsb2JhbFZhcmlhYmxlTnVtT3BlcmFuZHModW5zaWduZWQgTnVtT3BzKSB7CisgICAgYXNzZXJ0KE51bU9wcyA8PSAxICYmICJHbG9iYWxWYXJpYWJsZSBjYW4gb25seSBoYXZlIDAgb3IgMSBvcGVyYW5kcyIpOworICAgIE51bVVzZXJPcGVyYW5kcyA9IE51bU9wczsKKyAgfQorCisgIC8vLyBcYnJpZWYgU3ViY2xhc3NlcyB3aXRoIGh1bmcgb2ZmIHVzZXMgbmVlZCB0byBtYW5hZ2UgdGhlIG9wZXJhbmQgY291bnQKKyAgLy8vIHRoZW1zZWx2ZXMuICBJbiB0aGVzZSBpbnN0YW5jZXMsIHRoZSBvcGVyYW5kIGNvdW50IGlzbid0IHVzZWQgdG8gZmluZCB0aGUKKyAgLy8vIE9wZXJhbmRMaXN0LCBzbyB0aGVyZSdzIG5vIGlzc3VlIGluIGhhdmluZyB0aGUgb3BlcmFuZCBjb3VudCBjaGFuZ2UuCisgIHZvaWQgc2V0TnVtSHVuZ09mZlVzZU9wZXJhbmRzKHVuc2lnbmVkIE51bU9wcykgeworICAgIGFzc2VydChIYXNIdW5nT2ZmVXNlcyAmJiAiTXVzdCBoYXZlIGh1bmcgb2ZmIHVzZXMgdG8gdXNlIHRoaXMgbWV0aG9kIik7CisgICAgYXNzZXJ0KE51bU9wcyA8ICgxdSA8PCBOdW1Vc2VyT3BlcmFuZHNCaXRzKSAmJiAiVG9vIG1hbnkgb3BlcmFuZHMiKTsKKyAgICBOdW1Vc2VyT3BlcmFuZHMgPSBOdW1PcHM7CisgIH0KKworICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gT3BlcmFuZCBJdGVyYXRvciBpbnRlcmZhY2UuLi4KKyAgLy8KKyAgdXNpbmcgb3BfaXRlcmF0b3IgPSBVc2UqOworICB1c2luZyBjb25zdF9vcF9pdGVyYXRvciA9IGNvbnN0IFVzZSo7CisgIHVzaW5nIG9wX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8b3BfaXRlcmF0b3I+OworICB1c2luZyBjb25zdF9vcF9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPGNvbnN0X29wX2l0ZXJhdG9yPjsKKworICBvcF9pdGVyYXRvciAgICAgICBvcF9iZWdpbigpICAgICAgIHsgcmV0dXJuIGdldE9wZXJhbmRMaXN0KCk7IH0KKyAgY29uc3Rfb3BfaXRlcmF0b3Igb3BfYmVnaW4oKSBjb25zdCB7IHJldHVybiBnZXRPcGVyYW5kTGlzdCgpOyB9CisgIG9wX2l0ZXJhdG9yICAgICAgIG9wX2VuZCgpICAgICAgICAgeworICAgIHJldHVybiBnZXRPcGVyYW5kTGlzdCgpICsgTnVtVXNlck9wZXJhbmRzOworICB9CisgIGNvbnN0X29wX2l0ZXJhdG9yIG9wX2VuZCgpICAgY29uc3QgeworICAgIHJldHVybiBnZXRPcGVyYW5kTGlzdCgpICsgTnVtVXNlck9wZXJhbmRzOworICB9CisgIG9wX3JhbmdlIG9wZXJhbmRzKCkgeworICAgIHJldHVybiBvcF9yYW5nZShvcF9iZWdpbigpLCBvcF9lbmQoKSk7CisgIH0KKyAgY29uc3Rfb3BfcmFuZ2Ugb3BlcmFuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X29wX3JhbmdlKG9wX2JlZ2luKCksIG9wX2VuZCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSXRlcmF0b3IgZm9yIGRpcmVjdGx5IGl0ZXJhdGluZyBvdmVyIHRoZSBvcGVyYW5kIFZhbHVlcy4KKyAgc3RydWN0IHZhbHVlX29wX2l0ZXJhdG9yCisgICAgICA6IGl0ZXJhdG9yX2FkYXB0b3JfYmFzZTx2YWx1ZV9vcF9pdGVyYXRvciwgb3BfaXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBWYWx1ZSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90LCBWYWx1ZSAqLCBWYWx1ZSAqPiB7CisgICAgZXhwbGljaXQgdmFsdWVfb3BfaXRlcmF0b3IoVXNlICpVID0gbnVsbHB0cikgOiBpdGVyYXRvcl9hZGFwdG9yX2Jhc2UoVSkge30KKworICAgIFZhbHVlICpvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqSTsgfQorICAgIFZhbHVlICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gb3BlcmF0b3IqKCk7IH0KKyAgfTsKKworICB2YWx1ZV9vcF9pdGVyYXRvciB2YWx1ZV9vcF9iZWdpbigpIHsKKyAgICByZXR1cm4gdmFsdWVfb3BfaXRlcmF0b3Iob3BfYmVnaW4oKSk7CisgIH0KKyAgdmFsdWVfb3BfaXRlcmF0b3IgdmFsdWVfb3BfZW5kKCkgeworICAgIHJldHVybiB2YWx1ZV9vcF9pdGVyYXRvcihvcF9lbmQoKSk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8dmFsdWVfb3BfaXRlcmF0b3I+IG9wZXJhbmRfdmFsdWVzKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHZhbHVlX29wX2JlZ2luKCksIHZhbHVlX29wX2VuZCgpKTsKKyAgfQorCisgIHN0cnVjdCBjb25zdF92YWx1ZV9vcF9pdGVyYXRvcgorICAgICAgOiBpdGVyYXRvcl9hZGFwdG9yX2Jhc2U8Y29uc3RfdmFsdWVfb3BfaXRlcmF0b3IsIGNvbnN0X29wX2l0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgY29uc3QgVmFsdWUgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCwgY29uc3QgVmFsdWUgKiwgY29uc3QgVmFsdWUgKj4geworICAgIGV4cGxpY2l0IGNvbnN0X3ZhbHVlX29wX2l0ZXJhdG9yKGNvbnN0IFVzZSAqVSA9IG51bGxwdHIpIDoKKyAgICAgIGl0ZXJhdG9yX2FkYXB0b3JfYmFzZShVKSB7fQorCisgICAgY29uc3QgVmFsdWUgKm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpJOyB9CisgICAgY29uc3QgVmFsdWUgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBvcGVyYXRvciooKTsgfQorICB9OworCisgIGNvbnN0X3ZhbHVlX29wX2l0ZXJhdG9yIHZhbHVlX29wX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF92YWx1ZV9vcF9pdGVyYXRvcihvcF9iZWdpbigpKTsKKyAgfQorICBjb25zdF92YWx1ZV9vcF9pdGVyYXRvciB2YWx1ZV9vcF9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3ZhbHVlX29wX2l0ZXJhdG9yKG9wX2VuZCgpKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTxjb25zdF92YWx1ZV9vcF9pdGVyYXRvcj4gb3BlcmFuZF92YWx1ZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UodmFsdWVfb3BfYmVnaW4oKSwgdmFsdWVfb3BfZW5kKCkpOworICB9CisKKyAgLy8vIFxicmllZiBEcm9wIGFsbCByZWZlcmVuY2VzIHRvIG9wZXJhbmRzLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gaXMgaW4gY2hhcmdlIG9mICJsZXR0aW5nIGdvIiBvZiBhbGwgb2JqZWN0cyB0aGF0IHRoaXMgVXNlcgorICAvLy8gcmVmZXJzIHRvLiAgVGhpcyBhbGxvd3Mgb25lIHRvICdkZWxldGUnIGEgd2hvbGUgY2xhc3MgYXQgYSB0aW1lLCBldmVuCisgIC8vLyB0aG91Z2ggdGhlcmUgbWF5IGJlIGNpcmN1bGFyIHJlZmVyZW5jZXMuLi4gIEZpcnN0IGFsbCByZWZlcmVuY2VzIGFyZQorICAvLy8gZHJvcHBlZCwgYW5kIGFsbCB1c2UgY291bnRzIGdvIHRvIHplcm8uICBUaGVuIGV2ZXJ5dGhpbmcgaXMgZGVsZXRlZCBmb3IKKyAgLy8vIHJlYWwuICBOb3RlIHRoYXQgbm8gb3BlcmF0aW9ucyBhcmUgdmFsaWQgb24gYW4gb2JqZWN0IHRoYXQgaGFzICJkcm9wcGVkCisgIC8vLyBhbGwgcmVmZXJlbmNlcyIsIGV4Y2VwdCBvcGVyYXRvciBkZWxldGUuCisgIHZvaWQgZHJvcEFsbFJlZmVyZW5jZXMoKSB7CisgICAgZm9yIChVc2UgJlUgOiBvcGVyYW5kcygpKQorICAgICAgVS5zZXQobnVsbHB0cik7CisgIH0KKworICAvLy8gXGJyaWVmIFJlcGxhY2UgdXNlcyBvZiBvbmUgVmFsdWUgd2l0aCBhbm90aGVyLgorICAvLy8KKyAgLy8vIFJlcGxhY2VzIGFsbCByZWZlcmVuY2VzIHRvIHRoZSAiRnJvbSIgZGVmaW5pdGlvbiB3aXRoIHJlZmVyZW5jZXMgdG8gdGhlCisgIC8vLyAiVG8iIGRlZmluaXRpb24uCisgIHZvaWQgcmVwbGFjZVVzZXNPZldpdGgoVmFsdWUgKkZyb20sIFZhbHVlICpUbyk7CisKKyAgLy8gTWV0aG9kcyBmb3Igc3VwcG9ydCB0eXBlIGlucXVpcnkgdGhyb3VnaCBpc2EsIGNhc3QsIGFuZCBkeW5fY2FzdDoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBWYWx1ZSAqVikgeworICAgIHJldHVybiBpc2E8SW5zdHJ1Y3Rpb24+KFYpIHx8IGlzYTxDb25zdGFudD4oVik7CisgIH0KK307CisKKy8vIEVpdGhlciBVc2Ugb2JqZWN0cywgb3IgYSBVc2UgcG9pbnRlciBjYW4gYmUgcHJlcGVuZGVkIHRvIFVzZXIuCitzdGF0aWNfYXNzZXJ0KGFsaWdub2YoVXNlKSA+PSBhbGlnbm9mKFVzZXIpLAorICAgICAgICAgICAgICAiQWxpZ25tZW50IGlzIGluc3VmZmljaWVudCBhZnRlciBvYmplY3RzIHByZXBlbmRlZCB0byBVc2VyIik7CitzdGF0aWNfYXNzZXJ0KGFsaWdub2YoVXNlICopID49IGFsaWdub2YoVXNlciksCisgICAgICAgICAgICAgICJBbGlnbm1lbnQgaXMgaW5zdWZmaWNpZW50IGFmdGVyIG9iamVjdHMgcHJlcGVuZGVkIHRvIFVzZXIiKTsKKwordGVtcGxhdGU8PiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxVc2VyOjpvcF9pdGVyYXRvcj4geworICB1c2luZyBTaW1wbGVUeXBlID0gVmFsdWUqOworCisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShVc2VyOjpvcF9pdGVyYXRvciAmVmFsKSB7CisgICAgcmV0dXJuIFZhbC0+Z2V0KCk7CisgIH0KK307Cit0ZW1wbGF0ZTw+IHN0cnVjdCBzaW1wbGlmeV90eXBlPFVzZXI6OmNvbnN0X29wX2l0ZXJhdG9yPiB7CisgIHVzaW5nIFNpbXBsZVR5cGUgPSAvKmNvbnN0Ki8gVmFsdWUqOworCisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShVc2VyOjpjb25zdF9vcF9pdGVyYXRvciAmVmFsKSB7CisgICAgcmV0dXJuIFZhbC0+Z2V0KCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX1VTRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9WYWx1ZS5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1ZhbHVlLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmRkYmEwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9WYWx1ZS5kZWYKQEAgLTAsMCArMSwxMTcgQEAKKy8vPT09LS0tLS0tLS0gbGx2bS9JUi9WYWx1ZS5kZWYgLSBGaWxlIHRoYXQgZGVzY3JpYmVzIFZhbHVlcyAtLS12LSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBkZXNjcmlwdGlvbnMgb2YgdGhlIHZhcmlvdXMgTExWTSB2YWx1ZXMuICBUaGlzIGlzCisvLyB1c2VkIGFzIGEgY2VudHJhbCBwbGFjZSBmb3IgZW51bWVyYXRpbmcgdGhlIGRpZmZlcmVudCB2YWx1ZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gTk9URTogTk8gSU5DTFVERSBHVUFSRCBERVNJUkVEIQorCisvLyBQcm92aWRlIGRlZmluaXRpb25zIG9mIG1hY3JvcyBzbyB0aGF0IHVzZXJzIG9mIHRoaXMgZmlsZSBkbyBub3QgaGF2ZSB0bworLy8gZGVmaW5lIGV2ZXJ5dGhpbmcgdG8gdXNlIGl0Li4uCisvLworI2lmICEoZGVmaW5lZCBIQU5ETEVfR0xPQkFMX1ZBTFVFIHx8IGRlZmluZWQgSEFORExFX0NPTlNUQU5UIHx8ICAgICAgICAgICAgICAgIFwKKyAgICAgIGRlZmluZWQgSEFORExFX0lOU1RSVUNUSU9OIHx8IGRlZmluZWQgSEFORExFX0lOTElORV9BU01fVkFMVUUgfHwgICAgICAgICBcCisgICAgICBkZWZpbmVkIEhBTkRMRV9NRVRBREFUQV9WQUxVRSB8fCBkZWZpbmVkIEhBTkRMRV9WQUxVRSB8fCAgICAgICAgICAgICAgICAgXAorICAgICAgZGVmaW5lZCBIQU5ETEVfQ09OU1RBTlRfTUFSS0VSIHx8IGRlZmluZWQgSEFORExFX01FTU9SWV9WQUxVRSkKKyNlcnJvciAiTWlzc2luZyBtYWNybyBkZWZpbml0aW9uIG9mIEhBTkRMRV9WQUxVRSoiCisjZW5kaWYKKworI2lmbmRlZiBIQU5ETEVfTUVNT1JZX1ZBTFVFCisjZGVmaW5lIEhBTkRMRV9NRU1PUllfVkFMVUUoVmFsdWVOYW1lKSBIQU5ETEVfVkFMVUUoVmFsdWVOYW1lKQorI2VuZGlmCisKKyNpZm5kZWYgSEFORExFX0dMT0JBTF9WQUxVRQorI2RlZmluZSBIQU5ETEVfR0xPQkFMX1ZBTFVFKFZhbHVlTmFtZSkgSEFORExFX0NPTlNUQU5UKFZhbHVlTmFtZSkKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9DT05TVEFOVAorI2RlZmluZSBIQU5ETEVfQ09OU1RBTlQoVmFsdWVOYW1lKSBIQU5ETEVfVkFMVUUoVmFsdWVOYW1lKQorI2VuZGlmCisKKyNpZm5kZWYgSEFORExFX0lOU1RSVUNUSU9OCisjZGVmaW5lIEhBTkRMRV9JTlNUUlVDVElPTihWYWx1ZU5hbWUpIEhBTkRMRV9WQUxVRShWYWx1ZU5hbWUpCisjZW5kaWYKKworI2lmbmRlZiBIQU5ETEVfSU5MSU5FX0FTTV9WQUxVRQorI2RlZmluZSBIQU5ETEVfSU5MSU5FX0FTTV9WQUxVRShWYWx1ZU5hbWUpIEhBTkRMRV9WQUxVRShWYWx1ZU5hbWUpCisjZW5kaWYKKworI2lmbmRlZiBIQU5ETEVfTUVUQURBVEFfVkFMVUUKKyNkZWZpbmUgSEFORExFX01FVEFEQVRBX1ZBTFVFKFZhbHVlTmFtZSkgSEFORExFX1ZBTFVFKFZhbHVlTmFtZSkKKyNlbmRpZgorCisjaWZuZGVmIEhBTkRMRV9WQUxVRQorI2RlZmluZSBIQU5ETEVfVkFMVUUoVmFsdWVOYW1lKQorI2VuZGlmCisKKyNpZm5kZWYgSEFORExFX0NPTlNUQU5UX01BUktFUgorI2RlZmluZSBIQU5ETEVfQ09OU1RBTlRfTUFSS0VSKE1hcmtlck5hbWUsIFZhbHVlTmFtZSkKKyNlbmRpZgorCisvLyBIYXZpbmcgY29uc3RhbnQgZmlyc3QgbWFrZXMgdGhlIHJhbmdlIGNoZWNrIGZvciBpc2E8Q29uc3RhbnQ+IGZhc3RlcgorLy8gYW5kIHNtYWxsZXIgYnkgb25lIG9wZXJhdGlvbi4KKworLy8gQ29uc3RhbnQKK0hBTkRMRV9HTE9CQUxfVkFMVUUoRnVuY3Rpb24pCitIQU5ETEVfR0xPQkFMX1ZBTFVFKEdsb2JhbEFsaWFzKQorSEFORExFX0dMT0JBTF9WQUxVRShHbG9iYWxJRnVuYykKK0hBTkRMRV9HTE9CQUxfVkFMVUUoR2xvYmFsVmFyaWFibGUpCitIQU5ETEVfQ09OU1RBTlQoQmxvY2tBZGRyZXNzKQorSEFORExFX0NPTlNUQU5UKENvbnN0YW50RXhwcikKKworLy8gQ29uc3RhbnRBZ2dyZWdhdGUuCitIQU5ETEVfQ09OU1RBTlQoQ29uc3RhbnRBcnJheSkKK0hBTkRMRV9DT05TVEFOVChDb25zdGFudFN0cnVjdCkKK0hBTkRMRV9DT05TVEFOVChDb25zdGFudFZlY3RvcikKKworLy8gQ29uc3RhbnREYXRhLgorSEFORExFX0NPTlNUQU5UKFVuZGVmVmFsdWUpCitIQU5ETEVfQ09OU1RBTlQoQ29uc3RhbnRBZ2dyZWdhdGVaZXJvKQorSEFORExFX0NPTlNUQU5UKENvbnN0YW50RGF0YUFycmF5KQorSEFORExFX0NPTlNUQU5UKENvbnN0YW50RGF0YVZlY3RvcikKK0hBTkRMRV9DT05TVEFOVChDb25zdGFudEludCkKK0hBTkRMRV9DT05TVEFOVChDb25zdGFudEZQKQorSEFORExFX0NPTlNUQU5UKENvbnN0YW50UG9pbnRlck51bGwpCitIQU5ETEVfQ09OU1RBTlQoQ29uc3RhbnRUb2tlbk5vbmUpCisKK0hBTkRMRV9DT05TVEFOVF9NQVJLRVIoQ29uc3RhbnRGaXJzdFZhbCwgRnVuY3Rpb24pCitIQU5ETEVfQ09OU1RBTlRfTUFSS0VSKENvbnN0YW50TGFzdFZhbCwgQ29uc3RhbnRUb2tlbk5vbmUpCitIQU5ETEVfQ09OU1RBTlRfTUFSS0VSKENvbnN0YW50RGF0YUZpcnN0VmFsLCBVbmRlZlZhbHVlKQorSEFORExFX0NPTlNUQU5UX01BUktFUihDb25zdGFudERhdGFMYXN0VmFsLCBDb25zdGFudFRva2VuTm9uZSkKK0hBTkRMRV9DT05TVEFOVF9NQVJLRVIoQ29uc3RhbnRBZ2dyZWdhdGVGaXJzdFZhbCwgQ29uc3RhbnRBcnJheSkKK0hBTkRMRV9DT05TVEFOVF9NQVJLRVIoQ29uc3RhbnRBZ2dyZWdhdGVMYXN0VmFsLCBDb25zdGFudFZlY3RvcikKKworSEFORExFX1ZBTFVFKEFyZ3VtZW50KQorSEFORExFX1ZBTFVFKEJhc2ljQmxvY2spCisKKworSEFORExFX01FVEFEQVRBX1ZBTFVFKE1ldGFkYXRhQXNWYWx1ZSkKK0hBTkRMRV9JTkxJTkVfQVNNX1ZBTFVFKElubGluZUFzbSkKKworLy8gRklYTUU6IEl0J3MgYXdrd2FyZCB0aGF0IFZhbHVlLmRlZiBrbm93cyBhYm91dCBjbGFzc2VzIGluIEFuYWx5c2lzLiBXaGlsZQorLy8gdGhpcyBkb2Vzbid0IGludHJvZHVjZSBhIHN0cmljdCBsaW5rIG9yIGluY2x1ZGUgZGVwZW5kZW5jeSwgd2Ugc2hvdWxkIHJlbW92ZQorLy8gdGhlIGNpcmN1bGFyIGRlcGVuZGVuY3kgZXZlbnR1YWxseS4KK0hBTkRMRV9NRU1PUllfVkFMVUUoTWVtb3J5VXNlKQorSEFORExFX01FTU9SWV9WQUxVRShNZW1vcnlEZWYpCitIQU5ETEVfTUVNT1JZX1ZBTFVFKE1lbW9yeVBoaSkKKworSEFORExFX0lOU1RSVUNUSU9OKEluc3RydWN0aW9uKQorLy8gRW51bSB2YWx1ZXMgc3RhcnRpbmcgYXQgSW5zdHJ1Y3Rpb25WYWwgYXJlIHVzZWQgZm9yIEluc3RydWN0aW9uczsKKy8vIGRvbid0IGFkZCBuZXcgdmFsdWVzIGhlcmUhCisKKyN1bmRlZiBIQU5ETEVfTUVNT1JZX1ZBTFVFCisjdW5kZWYgSEFORExFX0dMT0JBTF9WQUxVRQorI3VuZGVmIEhBTkRMRV9DT05TVEFOVAorI3VuZGVmIEhBTkRMRV9JTlNUUlVDVElPTgorI3VuZGVmIEhBTkRMRV9NRVRBREFUQV9WQUxVRQorI3VuZGVmIEhBTkRMRV9JTkxJTkVfQVNNX1ZBTFVFCisjdW5kZWYgSEFORExFX1ZBTFVFCisjdW5kZWYgSEFORExFX0NPTlNUQU5UX01BUktFUgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9WYWx1ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9WYWx1ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ4NDhmZTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1ZhbHVlLmgKQEAgLTAsMCArMSw4NzIgQEAKKy8vPT09LSBsbHZtL1ZhbHVlLmggLSBEZWZpbml0aW9uIG9mIHRoZSBWYWx1ZSBjbGFzcyAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBWYWx1ZSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfVkFMVUVfSAorI2RlZmluZSBMTFZNX0lSX1ZBTFVFX0gKKworI2luY2x1ZGUgImxsdm0tYy9UeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Vc2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ0JpbmRpbmdXcmFwcGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQVBJbnQ7CitjbGFzcyBBcmd1bWVudDsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBDb25zdGFudDsKK2NsYXNzIENvbnN0YW50RGF0YTsKK2NsYXNzIENvbnN0YW50QWdncmVnYXRlOworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgR2xvYmFsQWxpYXM7CitjbGFzcyBHbG9iYWxJRnVuYzsKK2NsYXNzIEdsb2JhbEluZGlyZWN0U3ltYm9sOworY2xhc3MgR2xvYmFsT2JqZWN0OworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBHbG9iYWxWYXJpYWJsZTsKK2NsYXNzIElubGluZUFzbTsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgTExWTUNvbnRleHQ7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBNb2R1bGVTbG90VHJhY2tlcjsKK2NsYXNzIHJhd19vc3RyZWFtOwordGVtcGxhdGU8dHlwZW5hbWUgVmFsdWVUeT4gY2xhc3MgU3RyaW5nTWFwRW50cnk7CitjbGFzcyBTdHJpbmdSZWY7CitjbGFzcyBUd2luZTsKK2NsYXNzIFR5cGU7CitjbGFzcyBVc2VyOworCit1c2luZyBWYWx1ZU5hbWUgPSBTdHJpbmdNYXBFbnRyeTxWYWx1ZSAqPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgQ2xhc3MKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBcYnJpZWYgTExWTSBWYWx1ZSBSZXByZXNlbnRhdGlvbgorLy8vCisvLy8gVGhpcyBpcyBhIHZlcnkgaW1wb3J0YW50IExMVk0gY2xhc3MuIEl0IGlzIHRoZSBiYXNlIGNsYXNzIG9mIGFsbCB2YWx1ZXMKKy8vLyBjb21wdXRlZCBieSBhIHByb2dyYW0gdGhhdCBtYXkgYmUgdXNlZCBhcyBvcGVyYW5kcyB0byBvdGhlciB2YWx1ZXMuIFZhbHVlIGlzCisvLy8gdGhlIHN1cGVyIGNsYXNzIG9mIG90aGVyIGltcG9ydGFudCBjbGFzc2VzIHN1Y2ggYXMgSW5zdHJ1Y3Rpb24gYW5kIEZ1bmN0aW9uLgorLy8vIEFsbCBWYWx1ZXMgaGF2ZSBhIFR5cGUuIFR5cGUgaXMgbm90IGEgc3ViY2xhc3Mgb2YgVmFsdWUuIFNvbWUgdmFsdWVzIGNhbgorLy8vIGhhdmUgYSBuYW1lIGFuZCB0aGV5IGJlbG9uZyB0byBzb21lIE1vZHVsZS4gIFNldHRpbmcgdGhlIG5hbWUgb24gdGhlIFZhbHVlCisvLy8gYXV0b21hdGljYWxseSB1cGRhdGVzIHRoZSBtb2R1bGUncyBzeW1ib2wgdGFibGUuCisvLy8KKy8vLyBFdmVyeSB2YWx1ZSBoYXMgYSAidXNlIGxpc3QiIHRoYXQga2VlcHMgdHJhY2sgb2Ygd2hpY2ggb3RoZXIgVmFsdWVzIGFyZQorLy8vIHVzaW5nIHRoaXMgVmFsdWUuICBBIFZhbHVlIGNhbiBhbHNvIGhhdmUgYW4gYXJiaXRyYXJ5IG51bWJlciBvZiBWYWx1ZUhhbmRsZQorLy8vIG9iamVjdHMgdGhhdCB3YXRjaCBpdCBhbmQgbGlzdGVuIHRvIFJBVVcgYW5kIERlc3Ryb3kgZXZlbnRzLiAgU2VlCisvLy8gbGx2bS9JUi9WYWx1ZUhhbmRsZS5oIGZvciBkZXRhaWxzLgorY2xhc3MgVmFsdWUgeworICAvLyBUaGUgbGVhc3Qtc2lnbmlmaWNhbnQgYml0IG9mIHRoZSBmaXJzdCB3b3JkIG9mIFZhbHVlICptdXN0KiBiZSB6ZXJvOgorICAvLyAgIGh0dHA6Ly93d3cubGx2bS5vcmcvZG9jcy9Qcm9ncmFtbWVyc01hbnVhbC5odG1sI3RoZS13YXltYXJraW5nLWFsZ29yaXRobQorICBUeXBlICpWVHk7CisgIFVzZSAqVXNlTGlzdDsKKworICBmcmllbmQgY2xhc3MgVmFsdWVBc01ldGFkYXRhOyAvLyBBbGxvdyBhY2Nlc3MgdG8gSXNVc2VkQnlNRC4KKyAgZnJpZW5kIGNsYXNzIFZhbHVlSGFuZGxlQmFzZTsKKworICBjb25zdCB1bnNpZ25lZCBjaGFyIFN1YmNsYXNzSUQ7ICAgLy8gU3ViY2xhc3MgaWRlbnRpZmllciAoZm9yIGlzYS9keW5fY2FzdCkKKyAgdW5zaWduZWQgY2hhciBIYXNWYWx1ZUhhbmRsZSA6IDE7IC8vIEhhcyBhIFZhbHVlSGFuZGxlIHBvaW50aW5nIHRvIHRoaXM/CisKK3Byb3RlY3RlZDoKKyAgLy8vIFxicmllZiBIb2xkIHN1YmNsYXNzIGRhdGEgdGhhdCBjYW4gYmUgZHJvcHBlZC4KKyAgLy8vCisgIC8vLyBUaGlzIG1lbWJlciBpcyBzaW1pbGFyIHRvIFN1YmNsYXNzRGF0YSwgaG93ZXZlciBpdCBpcyBmb3IgaG9sZGluZworICAvLy8gaW5mb3JtYXRpb24gd2hpY2ggbWF5IGJlIHVzZWQgdG8gYWlkIG9wdGltaXphdGlvbiwgYnV0IHdoaWNoIG1heSBiZQorICAvLy8gY2xlYXJlZCB0byB6ZXJvIHdpdGhvdXQgYWZmZWN0aW5nIGNvbnNlcnZhdGl2ZSBpbnRlcnByZXRhdGlvbi4KKyAgdW5zaWduZWQgY2hhciBTdWJjbGFzc09wdGlvbmFsRGF0YSA6IDc7CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgSG9sZCBhcmJpdHJhcnkgc3ViY2xhc3MgZGF0YS4KKyAgLy8vCisgIC8vLyBUaGlzIG1lbWJlciBpcyBkZWZpbmVkIGJ5IHRoaXMgY2xhc3MsIGJ1dCBpcyBub3QgdXNlZCBmb3IgYW55dGhpbmcuCisgIC8vLyBTdWJjbGFzc2VzIGNhbiB1c2UgaXQgdG8gaG9sZCB3aGF0ZXZlciBzdGF0ZSB0aGV5IGZpbmQgdXNlZnVsLiAgVGhpcworICAvLy8gZmllbGQgaXMgaW5pdGlhbGl6ZWQgdG8gemVybyBieSB0aGUgY3Rvci4KKyAgdW5zaWduZWQgc2hvcnQgU3ViY2xhc3NEYXRhOworCitwcm90ZWN0ZWQ6CisgIC8vLyBcYnJpZWYgVGhlIG51bWJlciBvZiBvcGVyYW5kcyBpbiB0aGUgc3ViY2xhc3MuCisgIC8vLworICAvLy8gVGhpcyBtZW1iZXIgaXMgZGVmaW5lZCBieSB0aGlzIGNsYXNzLCBidXQgbm90IHVzZWQgZm9yIGFueXRoaW5nLgorICAvLy8gU3ViY2xhc3NlcyBjYW4gdXNlIGl0IHRvIHN0b3JlIHRoZWlyIG51bWJlciBvZiBvcGVyYW5kcywgaWYgdGhleSBoYXZlCisgIC8vLyBhbnkuCisgIC8vLworICAvLy8gVGhpcyBpcyBzdG9yZWQgaGVyZSB0byBzYXZlIHNwYWNlIGluIFVzZXIgb24gNjQtYml0IGhvc3RzLiAgU2luY2UgbW9zdAorICAvLy8gaW5zdGFuY2VzIG9mIFZhbHVlIGhhdmUgb3BlcmFuZHMsIDMyLWJpdCBob3N0cyBhcmVuJ3Qgc2lnbmlmaWNhbnRseQorICAvLy8gYWZmZWN0ZWQuCisgIC8vLworICAvLy8gTm90ZSwgdGhpcyBzaG91bGQgKk5PVCogYmUgdXNlZCBkaXJlY3RseSBieSBhbnkgY2xhc3Mgb3RoZXIgdGhhbiBVc2VyLgorICAvLy8gVXNlciB1c2VzIHRoaXMgdmFsdWUgdG8gZmluZCB0aGUgVXNlIGxpc3QuCisgIGVudW0gOiB1bnNpZ25lZCB7IE51bVVzZXJPcGVyYW5kc0JpdHMgPSAyOCB9OworICB1bnNpZ25lZCBOdW1Vc2VyT3BlcmFuZHMgOiBOdW1Vc2VyT3BlcmFuZHNCaXRzOworCisgIC8vIFVzZSB0aGUgc2FtZSB0eXBlIGFzIHRoZSBiaXRmaWVsZCBhYm92ZSBzbyB0aGF0IE1TVkMgd2lsbCBwYWNrIHRoZW0uCisgIHVuc2lnbmVkIElzVXNlZEJ5TUQgOiAxOworICB1bnNpZ25lZCBIYXNOYW1lIDogMTsKKyAgdW5zaWduZWQgSGFzSHVuZ09mZlVzZXMgOiAxOworICB1bnNpZ25lZCBIYXNEZXNjcmlwdG9yIDogMTsKKworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFVzZVQ+IC8vIFVzZVQgPT0gJ1VzZScgb3IgJ2NvbnN0IFVzZScKKyAgY2xhc3MgdXNlX2l0ZXJhdG9yX2ltcGwKKyAgICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgVXNlVCAqPiB7CisgICAgZnJpZW5kIGNsYXNzIFZhbHVlOworCisgICAgVXNlVCAqVTsKKworICAgIGV4cGxpY2l0IHVzZV9pdGVyYXRvcl9pbXBsKFVzZVQgKnUpIDogVSh1KSB7fQorCisgIHB1YmxpYzoKKyAgICB1c2VfaXRlcmF0b3JfaW1wbCgpIDogVSgpIHt9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgdXNlX2l0ZXJhdG9yX2ltcGwgJngpIGNvbnN0IHsgcmV0dXJuIFUgPT0geC5VOyB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IHVzZV9pdGVyYXRvcl9pbXBsICZ4KSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3I9PSh4KTsgfQorCisgICAgdXNlX2l0ZXJhdG9yX2ltcGwgJm9wZXJhdG9yKysoKSB7IC8vIFByZWluY3JlbWVudAorICAgICAgYXNzZXJ0KFUgJiYgIkNhbm5vdCBpbmNyZW1lbnQgZW5kIGl0ZXJhdG9yISIpOworICAgICAgVSA9IFUtPmdldE5leHQoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisKKyAgICB1c2VfaXRlcmF0b3JfaW1wbCBvcGVyYXRvcisrKGludCkgeyAvLyBQb3N0aW5jcmVtZW50CisgICAgICBhdXRvIHRtcCA9ICp0aGlzOworICAgICAgKysqdGhpczsKKyAgICAgIHJldHVybiB0bXA7CisgICAgfQorCisgICAgVXNlVCAmb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgYXNzZXJ0KFUgJiYgIkNhbm5vdCBkZXJlZmVyZW5jZSBlbmQgaXRlcmF0b3IhIik7CisgICAgICByZXR1cm4gKlU7CisgICAgfQorCisgICAgVXNlVCAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICZvcGVyYXRvciooKTsgfQorCisgICAgb3BlcmF0b3IgdXNlX2l0ZXJhdG9yX2ltcGw8Y29uc3QgVXNlVD4oKSBjb25zdCB7CisgICAgICByZXR1cm4gdXNlX2l0ZXJhdG9yX2ltcGw8Y29uc3QgVXNlVD4oVSk7CisgICAgfQorICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVc2VyVHk+IC8vIFVzZXJUeSA9PSAnVXNlcicgb3IgJ2NvbnN0IFVzZXInCisgIGNsYXNzIHVzZXJfaXRlcmF0b3JfaW1wbAorICAgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBVc2VyVHkgKj4geworICAgIHVzZV9pdGVyYXRvcl9pbXBsPFVzZT4gVUk7CisgICAgZXhwbGljaXQgdXNlcl9pdGVyYXRvcl9pbXBsKFVzZSAqVSkgOiBVSShVKSB7fQorICAgIGZyaWVuZCBjbGFzcyBWYWx1ZTsKKworICBwdWJsaWM6CisgICAgdXNlcl9pdGVyYXRvcl9pbXBsKCkgPSBkZWZhdWx0OworCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IHVzZXJfaXRlcmF0b3JfaW1wbCAmeCkgY29uc3QgeyByZXR1cm4gVUkgPT0geC5VSTsgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCB1c2VyX2l0ZXJhdG9yX2ltcGwgJngpIGNvbnN0IHsgcmV0dXJuICFvcGVyYXRvcj09KHgpOyB9CisKKyAgICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGl0ZXJhdG9yIGlzIGVxdWFsIHRvIHVzZXJfZW5kKCkgb24gdGhlIHZhbHVlLgorICAgIGJvb2wgYXRFbmQoKSBjb25zdCB7IHJldHVybiAqdGhpcyA9PSB1c2VyX2l0ZXJhdG9yX2ltcGwoKTsgfQorCisgICAgdXNlcl9pdGVyYXRvcl9pbXBsICZvcGVyYXRvcisrKCkgeyAvLyBQcmVpbmNyZW1lbnQKKyAgICAgICsrVUk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdXNlcl9pdGVyYXRvcl9pbXBsIG9wZXJhdG9yKysoaW50KSB7IC8vIFBvc3RpbmNyZW1lbnQKKyAgICAgIGF1dG8gdG1wID0gKnRoaXM7CisgICAgICArKyp0aGlzOworICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisKKyAgICAvLyBSZXRyaWV2ZSBhIHBvaW50ZXIgdG8gdGhlIGN1cnJlbnQgVXNlci4KKyAgICBVc2VyVHkgKm9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBVSS0+Z2V0VXNlcigpOworICAgIH0KKworICAgIFVzZXJUeSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIG9wZXJhdG9yKigpOyB9CisKKyAgICBvcGVyYXRvciB1c2VyX2l0ZXJhdG9yX2ltcGw8Y29uc3QgVXNlclR5PigpIGNvbnN0IHsKKyAgICAgIHJldHVybiB1c2VyX2l0ZXJhdG9yX2ltcGw8Y29uc3QgVXNlclR5PigqVUkpOworICAgIH0KKworICAgIFVzZSAmZ2V0VXNlKCkgY29uc3QgeyByZXR1cm4gKlVJOyB9CisgIH07CisKK3Byb3RlY3RlZDoKKyAgVmFsdWUoVHlwZSAqVHksIHVuc2lnbmVkIHNjaWQpOworCisgIC8vLyBWYWx1ZSdzIGRlc3RydWN0b3Igc2hvdWxkIGJlIHZpcnR1YWwgYnkgZGVzaWduLCBidXQgdGhhdCB3b3VsZCByZXF1aXJlCisgIC8vLyB0aGF0IFZhbHVlIGFuZCBhbGwgb2YgaXRzIHN1YmNsYXNzZXMgaGF2ZSBhIHZ0YWJsZSB0aGF0IGVmZmVjdGl2ZWx5CisgIC8vLyBkdXBsaWNhdGVzIHRoZSBpbmZvcm1hdGlvbiBpbiB0aGUgdmFsdWUgSUQuIEFzIGEgc2l6ZSBvcHRpbWl6YXRpb24sIHRoZQorICAvLy8gZGVzdHJ1Y3RvciBoYXMgYmVlbiBwcm90ZWN0ZWQsIGFuZCB0aGUgY2FsbGVyIHNob3VsZCBtYW51YWxseSBjYWxsCisgIC8vLyBkZWxldGVWYWx1ZS4KKyAgflZhbHVlKCk7IC8vIFVzZSBkZWxldGVWYWx1ZSgpIHRvIGRlbGV0ZSBhIGdlbmVyaWMgVmFsdWUuCisKK3B1YmxpYzoKKyAgVmFsdWUoY29uc3QgVmFsdWUgJikgPSBkZWxldGU7CisgIFZhbHVlICZvcGVyYXRvcj0oY29uc3QgVmFsdWUgJikgPSBkZWxldGU7CisKKyAgLy8vIERlbGV0ZSBhIHBvaW50ZXIgdG8gYSBnZW5lcmljIFZhbHVlLgorICB2b2lkIGRlbGV0ZVZhbHVlKCk7CisKKyAgLy8vIFxicmllZiBTdXBwb3J0IGZvciBkZWJ1Z2dpbmcsIGNhbGxhYmxlIGluIEdEQjogVi0+ZHVtcCgpCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgSW1wbGVtZW50IG9wZXJhdG9yPDwgb24gVmFsdWUuCisgIC8vLyBAeworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPLCBib29sIElzRm9yRGVidWcgPSBmYWxzZSkgY29uc3Q7CisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8sIE1vZHVsZVNsb3RUcmFja2VyICZNU1QsCisgICAgICAgICAgICAgYm9vbCBJc0ZvckRlYnVnID0gZmFsc2UpIGNvbnN0OworICAvLy8gQH0KKworICAvLy8gXGJyaWVmIFByaW50IHRoZSBuYW1lIG9mIHRoaXMgVmFsdWUgb3V0IHRvIHRoZSBzcGVjaWZpZWQgcmF3X29zdHJlYW0uCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VmdWwgd2hlbiB5b3UganVzdCB3YW50IHRvIHByaW50ICdpbnQgJXJlZzEyNicsIG5vdCB0aGUKKyAgLy8vIGluc3RydWN0aW9uIHRoYXQgZ2VuZXJhdGVkIGl0LiBJZiB5b3Ugc3BlY2lmeSBhIE1vZHVsZSBmb3IgY29udGV4dCwgdGhlbgorICAvLy8gZXZlbiBjb25zdGFuc3QgZ2V0IHByZXR0eS1wcmludGVkOyBmb3IgZXhhbXBsZSwgdGhlIHR5cGUgb2YgYSBudWxsCisgIC8vLyBwb2ludGVyIGlzIHByaW50ZWQgc3ltYm9saWNhbGx5LgorICAvLy8gQHsKKyAgdm9pZCBwcmludEFzT3BlcmFuZChyYXdfb3N0cmVhbSAmTywgYm9vbCBQcmludFR5cGUgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZSAqTSA9IG51bGxwdHIpIGNvbnN0OworICB2b2lkIHByaW50QXNPcGVyYW5kKHJhd19vc3RyZWFtICZPLCBib29sIFByaW50VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBNb2R1bGVTbG90VHJhY2tlciAmTVNUKSBjb25zdDsKKyAgLy8vIEB9CisKKyAgLy8vIFxicmllZiBBbGwgdmFsdWVzIGFyZSB0eXBlZCwgZ2V0IHRoZSB0eXBlIG9mIHRoaXMgdmFsdWUuCisgIFR5cGUgKmdldFR5cGUoKSBjb25zdCB7IHJldHVybiBWVHk7IH0KKworICAvLy8gXGJyaWVmIEFsbCB2YWx1ZXMgaG9sZCBhIGNvbnRleHQgdGhyb3VnaCB0aGVpciB0eXBlLgorICBMTFZNQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0OworCisgIC8vIFxicmllZiBBbGwgdmFsdWVzIGNhbiBwb3RlbnRpYWxseSBiZSBuYW1lZC4KKyAgYm9vbCBoYXNOYW1lKCkgY29uc3QgeyByZXR1cm4gSGFzTmFtZTsgfQorICBWYWx1ZU5hbWUgKmdldFZhbHVlTmFtZSgpIGNvbnN0OworICB2b2lkIHNldFZhbHVlTmFtZShWYWx1ZU5hbWUgKlZOKTsKKworcHJpdmF0ZToKKyAgdm9pZCBkZXN0cm95VmFsdWVOYW1lKCk7CisgIHZvaWQgZG9SQVVXKFZhbHVlICpOZXcsIGJvb2wgTm9NZXRhZGF0YSk7CisgIHZvaWQgc2V0TmFtZUltcGwoY29uc3QgVHdpbmUgJk5hbWUpOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgY29uc3RhbnQgcmVmZXJlbmNlIHRvIHRoZSB2YWx1ZSdzIG5hbWUuCisgIC8vLworICAvLy8gVGhpcyBndWFyYW50ZWVkIHRvIHJldHVybiB0aGUgc2FtZSByZWZlcmVuY2UgYXMgbG9uZyBhcyB0aGUgdmFsdWUgaXMgbm90CisgIC8vLyBtb2RpZmllZC4gIElmIHRoZSB2YWx1ZSBoYXMgYSBuYW1lLCB0aGlzIGRvZXMgYSBoYXNodGFibGUgbG9va3VwLCBzbyBpdCdzCisgIC8vLyBub3QgZnJlZS4KKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIENoYW5nZSB0aGUgbmFtZSBvZiB0aGUgdmFsdWUuCisgIC8vLworICAvLy8gQ2hvb3NlIGEgbmV3IHVuaXF1ZSBuYW1lIGlmIHRoZSBwcm92aWRlZCBuYW1lIGlzIHRha2VuLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOYW1lIFRoZSBuZXcgbmFtZTsgb3IgIiIgaWYgdGhlIHZhbHVlJ3MgbmFtZSBzaG91bGQgYmUgcmVtb3ZlZC4KKyAgdm9pZCBzZXROYW1lKGNvbnN0IFR3aW5lICZOYW1lKTsKKworICAvLy8gXGJyaWVmIFRyYW5zZmVyIHRoZSBuYW1lIGZyb20gViB0byB0aGlzIHZhbHVlLgorICAvLy8KKyAgLy8vIEFmdGVyIHRha2luZyBWJ3MgbmFtZSwgc2V0cyBWJ3MgbmFtZSB0byBlbXB0eS4KKyAgLy8vCisgIC8vLyBcbm90ZSBJdCBpcyBhbiBlcnJvciB0byBjYWxsIFYtPnRha2VOYW1lKFYpLgorICB2b2lkIHRha2VOYW1lKFZhbHVlICpWKTsKKworICAvLy8gXGJyaWVmIENoYW5nZSBhbGwgdXNlcyBvZiB0aGlzIHRvIHBvaW50IHRvIGEgbmV3IFZhbHVlLgorICAvLy8KKyAgLy8vIEdvIHRocm91Z2ggdGhlIHVzZXMgbGlzdCBmb3IgdGhpcyBkZWZpbml0aW9uIGFuZCBtYWtlIGVhY2ggdXNlIHBvaW50IHRvCisgIC8vLyAiViIgaW5zdGVhZCBvZiAidGhpcyIuICBBZnRlciB0aGlzIGNvbXBsZXRlcywgJ3RoaXMncyB1c2UgbGlzdCBpcworICAvLy8gZ3VhcmFudGVlZCB0byBiZSBlbXB0eS4KKyAgdm9pZCByZXBsYWNlQWxsVXNlc1dpdGgoVmFsdWUgKlYpOworCisgIC8vLyBcYnJpZWYgQ2hhbmdlIG5vbi1tZXRhZGF0YSB1c2VzIG9mIHRoaXMgdG8gcG9pbnQgdG8gYSBuZXcgVmFsdWUuCisgIC8vLworICAvLy8gR28gdGhyb3VnaCB0aGUgdXNlcyBsaXN0IGZvciB0aGlzIGRlZmluaXRpb24gYW5kIG1ha2UgZWFjaCB1c2UgcG9pbnQgdG8KKyAgLy8vICJWIiBpbnN0ZWFkIG9mICJ0aGlzIi4gVGhpcyBmdW5jdGlvbiBza2lwcyBtZXRhZGF0YSBlbnRyaWVzIGluIHRoZSBsaXN0LgorICB2b2lkIHJlcGxhY2VOb25NZXRhZGF0YVVzZXNXaXRoKFZhbHVlICpWKTsKKworICAvLy8gcmVwbGFjZVVzZXNPdXRzaWRlQmxvY2sgLSBHbyB0aHJvdWdoIHRoZSB1c2VzIGxpc3QgZm9yIHRoaXMgZGVmaW5pdGlvbiBhbmQKKyAgLy8vIG1ha2UgZWFjaCB1c2UgcG9pbnQgdG8gIlYiIGluc3RlYWQgb2YgInRoaXMiIHdoZW4gdGhlIHVzZSBpcyBvdXRzaWRlIHRoZQorICAvLy8gYmxvY2suICdUaGlzJ3MgdXNlIGxpc3QgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudC4KKyAgLy8vIFVubGlrZSByZXBsYWNlQWxsVXNlc1dpdGggdGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBzdXBwb3J0IGJhc2ljIGJsb2NrCisgIC8vLyB2YWx1ZXMgb3IgY29uc3RhbnQgdXNlcnMuCisgIHZvaWQgcmVwbGFjZVVzZXNPdXRzaWRlQmxvY2soVmFsdWUgKlYsIEJhc2ljQmxvY2sgKkJCKTsKKworICAvLy8gcmVwbGFjZVVzZXNFeGNlcHRCbG9ja0FkZHIgLSBHbyB0aHJvdWdoIHRoZSB1c2VzIGxpc3QgZm9yIHRoaXMgZGVmaW5pdGlvbgorICAvLy8gYW5kIG1ha2UgZWFjaCB1c2UgcG9pbnQgdG8gIlYiIGluc3RlYWQgb2YgInRoaXMiIHdoZW4gdGhlIHVzZSBpcyBvdXRzaWRlCisgIC8vLyB0aGUgYmxvY2suICdUaGlzJ3MgdXNlIGxpc3QgaXMgZXhwZWN0ZWQgdG8gaGF2ZSBhdCBsZWFzdCBvbmUgZWxlbWVudC4KKyAgLy8vIFVubGlrZSByZXBsYWNlQWxsVXNlc1dpdGggdGhpcyBmdW5jdGlvbiBza2lwcyBibG9ja2FkZHIgdXNlcy4KKyAgdm9pZCByZXBsYWNlVXNlc0V4Y2VwdEJsb2NrQWRkcihWYWx1ZSAqTmV3KTsKKworICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gTWV0aG9kcyBmb3IgaGFuZGxpbmcgdGhlIGNoYWluIG9mIHVzZXMgb2YgdGhpcyBWYWx1ZS4KKyAgLy8KKyAgLy8gTWF0ZXJpYWxpemluZyBhIGZ1bmN0aW9uIGNhbiBpbnRyb2R1Y2UgbmV3IHVzZXMsIHNvIHRoZXNlIG1ldGhvZHMgY29tZSBpbgorICAvLyB0d28gdmFyaWFudHM6CisgIC8vIFRoZSBtZXRob2RzIHRoYXQgc3RhcnQgd2l0aCBtYXRlcmlhbGl6ZWRfIGNoZWNrIHRoZSB1c2VzIHRoYXQgYXJlCisgIC8vIGN1cnJlbnRseSBrbm93biBnaXZlbiB3aGljaCBmdW5jdGlvbnMgYXJlIG1hdGVyaWFsaXplZC4gQmUgdmVyeSBjYXJlZnVsCisgIC8vIHdoZW4gdXNpbmcgdGhlbSBzaW5jZSB5b3UgbWlnaHQgbm90IGdldCBhbGwgdXNlcy4KKyAgLy8gVGhlIG1ldGhvZHMgdGhhdCBkb24ndCBzdGFydCB3aXRoIG1hdGVyaWFsaXplZF8gYXNzZXJ0IHRoYXQgbW9kdWxlcyBpcworICAvLyBmdWxseSBtYXRlcmlhbGl6ZWQuCisgIHZvaWQgYXNzZXJ0TW9kdWxlSXNNYXRlcmlhbGl6ZWRJbXBsKCkgY29uc3Q7CisgIC8vIFRoaXMgaW5kaXJlY3Rpb24gZXhpc3RzIHNvIHdlIGNhbiBrZWVwIGFzc2VydE1vZHVsZUlzTWF0ZXJpYWxpemVkSW1wbCgpCisgIC8vIGFyb3VuZCBpbiByZWxlYXNlIGJ1aWxkcyBvZiBWYWx1ZS5jcHAgdG8gYmUgbGlua2VkIHdpdGggb3RoZXIgY29kZSBidWlsdAorICAvLyBpbiBkZWJ1ZyBtb2RlLiBCdXQgdGhpcyBhdm9pZHMgY2FsbGluZyBpdCBpbiBhbnkgb2YgdGhlIHJlbGVhc2UgYnVpbHQgY29kZS4KKyAgdm9pZCBhc3NlcnRNb2R1bGVJc01hdGVyaWFsaXplZCgpIGNvbnN0IHsKKyNpZm5kZWYgTkRFQlVHCisgICAgYXNzZXJ0TW9kdWxlSXNNYXRlcmlhbGl6ZWRJbXBsKCk7CisjZW5kaWYKKyAgfQorCisgIGJvb2wgdXNlX2VtcHR5KCkgY29uc3QgeworICAgIGFzc2VydE1vZHVsZUlzTWF0ZXJpYWxpemVkKCk7CisgICAgcmV0dXJuIFVzZUxpc3QgPT0gbnVsbHB0cjsKKyAgfQorCisgIGJvb2wgbWF0ZXJpYWxpemVkX3VzZV9lbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVXNlTGlzdCA9PSBudWxscHRyOworICB9CisKKyAgdXNpbmcgdXNlX2l0ZXJhdG9yID0gdXNlX2l0ZXJhdG9yX2ltcGw8VXNlPjsKKyAgdXNpbmcgY29uc3RfdXNlX2l0ZXJhdG9yID0gdXNlX2l0ZXJhdG9yX2ltcGw8Y29uc3QgVXNlPjsKKworICB1c2VfaXRlcmF0b3IgbWF0ZXJpYWxpemVkX3VzZV9iZWdpbigpIHsgcmV0dXJuIHVzZV9pdGVyYXRvcihVc2VMaXN0KTsgfQorICBjb25zdF91c2VfaXRlcmF0b3IgbWF0ZXJpYWxpemVkX3VzZV9iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfdXNlX2l0ZXJhdG9yKFVzZUxpc3QpOworICB9CisgIHVzZV9pdGVyYXRvciB1c2VfYmVnaW4oKSB7CisgICAgYXNzZXJ0TW9kdWxlSXNNYXRlcmlhbGl6ZWQoKTsKKyAgICByZXR1cm4gbWF0ZXJpYWxpemVkX3VzZV9iZWdpbigpOworICB9CisgIGNvbnN0X3VzZV9pdGVyYXRvciB1c2VfYmVnaW4oKSBjb25zdCB7CisgICAgYXNzZXJ0TW9kdWxlSXNNYXRlcmlhbGl6ZWQoKTsKKyAgICByZXR1cm4gbWF0ZXJpYWxpemVkX3VzZV9iZWdpbigpOworICB9CisgIHVzZV9pdGVyYXRvciB1c2VfZW5kKCkgeyByZXR1cm4gdXNlX2l0ZXJhdG9yKCk7IH0KKyAgY29uc3RfdXNlX2l0ZXJhdG9yIHVzZV9lbmQoKSBjb25zdCB7IHJldHVybiBjb25zdF91c2VfaXRlcmF0b3IoKTsgfQorICBpdGVyYXRvcl9yYW5nZTx1c2VfaXRlcmF0b3I+IG1hdGVyaWFsaXplZF91c2VzKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKG1hdGVyaWFsaXplZF91c2VfYmVnaW4oKSwgdXNlX2VuZCgpKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTxjb25zdF91c2VfaXRlcmF0b3I+IG1hdGVyaWFsaXplZF91c2VzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKG1hdGVyaWFsaXplZF91c2VfYmVnaW4oKSwgdXNlX2VuZCgpKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTx1c2VfaXRlcmF0b3I+IHVzZXMoKSB7CisgICAgYXNzZXJ0TW9kdWxlSXNNYXRlcmlhbGl6ZWQoKTsKKyAgICByZXR1cm4gbWF0ZXJpYWxpemVkX3VzZXMoKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTxjb25zdF91c2VfaXRlcmF0b3I+IHVzZXMoKSBjb25zdCB7CisgICAgYXNzZXJ0TW9kdWxlSXNNYXRlcmlhbGl6ZWQoKTsKKyAgICByZXR1cm4gbWF0ZXJpYWxpemVkX3VzZXMoKTsKKyAgfQorCisgIGJvb2wgdXNlcl9lbXB0eSgpIGNvbnN0IHsKKyAgICBhc3NlcnRNb2R1bGVJc01hdGVyaWFsaXplZCgpOworICAgIHJldHVybiBVc2VMaXN0ID09IG51bGxwdHI7CisgIH0KKworICB1c2luZyB1c2VyX2l0ZXJhdG9yID0gdXNlcl9pdGVyYXRvcl9pbXBsPFVzZXI+OworICB1c2luZyBjb25zdF91c2VyX2l0ZXJhdG9yID0gdXNlcl9pdGVyYXRvcl9pbXBsPGNvbnN0IFVzZXI+OworCisgIHVzZXJfaXRlcmF0b3IgbWF0ZXJpYWxpemVkX3VzZXJfYmVnaW4oKSB7IHJldHVybiB1c2VyX2l0ZXJhdG9yKFVzZUxpc3QpOyB9CisgIGNvbnN0X3VzZXJfaXRlcmF0b3IgbWF0ZXJpYWxpemVkX3VzZXJfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3VzZXJfaXRlcmF0b3IoVXNlTGlzdCk7CisgIH0KKyAgdXNlcl9pdGVyYXRvciB1c2VyX2JlZ2luKCkgeworICAgIGFzc2VydE1vZHVsZUlzTWF0ZXJpYWxpemVkKCk7CisgICAgcmV0dXJuIG1hdGVyaWFsaXplZF91c2VyX2JlZ2luKCk7CisgIH0KKyAgY29uc3RfdXNlcl9pdGVyYXRvciB1c2VyX2JlZ2luKCkgY29uc3QgeworICAgIGFzc2VydE1vZHVsZUlzTWF0ZXJpYWxpemVkKCk7CisgICAgcmV0dXJuIG1hdGVyaWFsaXplZF91c2VyX2JlZ2luKCk7CisgIH0KKyAgdXNlcl9pdGVyYXRvciB1c2VyX2VuZCgpIHsgcmV0dXJuIHVzZXJfaXRlcmF0b3IoKTsgfQorICBjb25zdF91c2VyX2l0ZXJhdG9yIHVzZXJfZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfdXNlcl9pdGVyYXRvcigpOyB9CisgIFVzZXIgKnVzZXJfYmFjaygpIHsKKyAgICBhc3NlcnRNb2R1bGVJc01hdGVyaWFsaXplZCgpOworICAgIHJldHVybiAqbWF0ZXJpYWxpemVkX3VzZXJfYmVnaW4oKTsKKyAgfQorICBjb25zdCBVc2VyICp1c2VyX2JhY2soKSBjb25zdCB7CisgICAgYXNzZXJ0TW9kdWxlSXNNYXRlcmlhbGl6ZWQoKTsKKyAgICByZXR1cm4gKm1hdGVyaWFsaXplZF91c2VyX2JlZ2luKCk7CisgIH0KKyAgaXRlcmF0b3JfcmFuZ2U8dXNlcl9pdGVyYXRvcj4gbWF0ZXJpYWxpemVkX3VzZXJzKCkgeworICAgIHJldHVybiBtYWtlX3JhbmdlKG1hdGVyaWFsaXplZF91c2VyX2JlZ2luKCksIHVzZXJfZW5kKCkpOworICB9CisgIGl0ZXJhdG9yX3JhbmdlPGNvbnN0X3VzZXJfaXRlcmF0b3I+IG1hdGVyaWFsaXplZF91c2VycygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShtYXRlcmlhbGl6ZWRfdXNlcl9iZWdpbigpLCB1c2VyX2VuZCgpKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTx1c2VyX2l0ZXJhdG9yPiB1c2VycygpIHsKKyAgICBhc3NlcnRNb2R1bGVJc01hdGVyaWFsaXplZCgpOworICAgIHJldHVybiBtYXRlcmlhbGl6ZWRfdXNlcnMoKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTxjb25zdF91c2VyX2l0ZXJhdG9yPiB1c2VycygpIGNvbnN0IHsKKyAgICBhc3NlcnRNb2R1bGVJc01hdGVyaWFsaXplZCgpOworICAgIHJldHVybiBtYXRlcmlhbGl6ZWRfdXNlcnMoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlcmUgaXMgZXhhY3RseSBvbmUgdXNlciBvZiB0aGlzIHZhbHVlLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgc3BlY2lhbGl6ZWQgYmVjYXVzZSBpdCBpcyBhIGNvbW1vbiByZXF1ZXN0IGFuZCBkb2VzIG5vdCByZXF1aXJlCisgIC8vLyB0cmF2ZXJzaW5nIHRoZSB3aG9sZSB1c2UgbGlzdC4KKyAgYm9vbCBoYXNPbmVVc2UoKSBjb25zdCB7CisgICAgY29uc3RfdXNlX2l0ZXJhdG9yIEkgPSB1c2VfYmVnaW4oKSwgRSA9IHVzZV9lbmQoKTsKKyAgICBpZiAoSSA9PSBFKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuICsrSSA9PSBFOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIFZhbHVlIGhhcyBleGFjdGx5IE4gdXNlcnMuCisgIGJvb2wgaGFzTlVzZXModW5zaWduZWQgTikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHZhbHVlIGhhcyBOIHVzZXJzIG9yIG1vcmUuCisgIC8vLworICAvLy8gVGhpcyBpcyBsb2dpY2FsbHkgZXF1aXZhbGVudCB0byBnZXROdW1Vc2VzKCkgPj0gTi4KKyAgYm9vbCBoYXNOVXNlc09yTW9yZSh1bnNpZ25lZCBOKSBjb25zdDsKKworICAvLy8gXGJyaWVmIENoZWNrIGlmIHRoaXMgdmFsdWUgaXMgdXNlZCBpbiB0aGUgc3BlY2lmaWVkIGJhc2ljIGJsb2NrLgorICBib29sIGlzVXNlZEluQmFzaWNCbG9jayhjb25zdCBCYXNpY0Jsb2NrICpCQikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUaGlzIG1ldGhvZCBjb21wdXRlcyB0aGUgbnVtYmVyIG9mIHVzZXMgb2YgdGhpcyBWYWx1ZS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGEgbGluZWFyIHRpbWUgb3BlcmF0aW9uLiAgVXNlIGhhc09uZVVzZSwgaGFzTlVzZXMsIG9yCisgIC8vLyBoYXNOVXNlc09yTW9yZSB0byBjaGVjayBmb3Igc3BlY2lmaWMgdmFsdWVzLgorICB1bnNpZ25lZCBnZXROdW1Vc2VzKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBUaGlzIG1ldGhvZCBzaG91bGQgb25seSBiZSB1c2VkIGJ5IHRoZSBVc2UgY2xhc3MuCisgIHZvaWQgYWRkVXNlKFVzZSAmVSkgeyBVLmFkZFRvTGlzdCgmVXNlTGlzdCk7IH0KKworICAvLy8gXGJyaWVmIENvbmNyZXRlIHN1YmNsYXNzIG9mIHRoaXMuCisgIC8vLworICAvLy8gQW4gZW51bWVyYXRpb24gZm9yIGtlZXBpbmcgdHJhY2sgb2YgdGhlIGNvbmNyZXRlIHN1YmNsYXNzIG9mIFZhbHVlIHRoYXQKKyAgLy8vIGlzIGFjdHVhbGx5IGluc3RhbnRpYXRlZC4gVmFsdWVzIG9mIHRoaXMgZW51bWVyYXRpb24gYXJlIGtlcHQgaW4gdGhlCisgIC8vLyBWYWx1ZSBjbGFzc2VzIFN1YmNsYXNzSUQgZmllbGQuIFRoZXkgYXJlIHVzZWQgZm9yIGNvbmNyZXRlIHR5cGUKKyAgLy8vIGlkZW50aWZpY2F0aW9uLgorICBlbnVtIFZhbHVlVHkgeworI2RlZmluZSBIQU5ETEVfVkFMVUUoTmFtZSkgTmFtZSMjVmFsLAorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuZGVmIgorCisgICAgLy8gTWFya2VyczoKKyNkZWZpbmUgSEFORExFX0NPTlNUQU5UX01BUktFUihNYXJrZXIsIENvbnN0YW50KSBNYXJrZXIgPSBDb25zdGFudCMjVmFsLAorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuZGVmIgorICB9OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIGFuIElEIGZvciB0aGUgY29uY3JldGUgdHlwZSBvZiB0aGlzIG9iamVjdC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBjbGFzc29mIGNoZWNrcy4gIFRoaXMgc2hvdWxkIG5vdCBiZSB1c2VkCisgIC8vLyBmb3IgYW55IG90aGVyIHB1cnBvc2UsIGFzIHRoZSB2YWx1ZXMgbWF5IGNoYW5nZSBhcyBMTFZNIGV2b2x2ZXMuICBBbHNvLAorICAvLy8gbm90ZSB0aGF0IGZvciBpbnN0cnVjdGlvbnMsIHRoZSBJbnN0cnVjdGlvbidzIG9wY29kZSBpcyBhZGRlZCB0bworICAvLy8gSW5zdHJ1Y3Rpb25WYWwuIFNvIHRoaXMgbWVhbnMgdGhyZWUgdGhpbmdzOgorICAvLy8gIyB0aGVyZSBpcyBubyB2YWx1ZSB3aXRoIGNvZGUgSW5zdHJ1Y3Rpb25WYWwgKG5vIG9wY29kZT09MCkuCisgIC8vLyAjIHRoZXJlIGFyZSBtb3JlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhlIHZhbHVlIHR5cGUgdGhhbiBpbiBWYWx1ZVR5IGVudW0uCisgIC8vLyAjIHRoZSBJbnN0cnVjdGlvblZhbCBlbnVtZXJhdG9yIG11c3QgYmUgdGhlIGhpZ2hlc3QgdmFsdWVkIGVudW1lcmF0b3IgaW4KKyAgLy8vICAgdGhlIFZhbHVlVHkgZW51bS4KKyAgdW5zaWduZWQgZ2V0VmFsdWVJRCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3ViY2xhc3NJRDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSByYXcgb3B0aW9uYWwgZmxhZ3MgdmFsdWUgY29udGFpbmVkIGluIHRoaXMgdmFsdWUuCisgIC8vLworICAvLy8gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIHdoZW4gdGVzdGluZyB0d28gVmFsdWVzIGZvciBlcXVpdmFsZW5jZS4KKyAgdW5zaWduZWQgZ2V0UmF3U3ViY2xhc3NPcHRpb25hbERhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIFN1YmNsYXNzT3B0aW9uYWxEYXRhOworICB9CisKKyAgLy8vIFxicmllZiBDbGVhciB0aGUgb3B0aW9uYWwgZmxhZ3MgY29udGFpbmVkIGluIHRoaXMgdmFsdWUuCisgIHZvaWQgY2xlYXJTdWJjbGFzc09wdGlvbmFsRGF0YSgpIHsKKyAgICBTdWJjbGFzc09wdGlvbmFsRGF0YSA9IDA7CisgIH0KKworICAvLy8gXGJyaWVmIENoZWNrIHRoZSBvcHRpb25hbCBmbGFncyBmb3IgZXF1YWxpdHkuCisgIGJvb2wgaGFzU2FtZVN1YmNsYXNzT3B0aW9uYWxEYXRhKGNvbnN0IFZhbHVlICpWKSBjb25zdCB7CisgICAgcmV0dXJuIFN1YmNsYXNzT3B0aW9uYWxEYXRhID09IFYtPlN1YmNsYXNzT3B0aW9uYWxEYXRhOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhIHZhbHVlIGhhbmRsZSBhc3NvY2lhdGVkIHdpdGggdGhpcyB2YWx1ZS4KKyAgYm9vbCBoYXNWYWx1ZUhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIEhhc1ZhbHVlSGFuZGxlOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBtZXRhZGF0YSByZWZlcmVuY2luZyB0aGlzIHZhbHVlLgorICBib29sIGlzVXNlZEJ5TWV0YWRhdGEoKSBjb25zdCB7IHJldHVybiBJc1VzZWRCeU1EOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHZhbHVlIGlzIGEgc3dpZnRlcnJvciB2YWx1ZS4KKyAgLy8vCisgIC8vLyBzd2lmdGVycm9yIHZhbHVlcyBjYW4gYmUgZWl0aGVyIGEgZnVuY3Rpb24gYXJndW1lbnQgb3IgYW4gYWxsb2NhIHdpdGggYQorICAvLy8gc3dpZnRlcnJvciBhdHRyaWJ1dGUuCisgIGJvb2wgaXNTd2lmdEVycm9yKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBTdHJpcCBvZmYgcG9pbnRlciBjYXN0cywgYWxsLXplcm8gR0VQcywgYW5kIGFsaWFzZXMuCisgIC8vLworICAvLy8gUmV0dXJucyB0aGUgb3JpZ2luYWwgdW5jYXN0ZWQgdmFsdWUuICBJZiB0aGlzIGlzIGNhbGxlZCBvbiBhIG5vbi1wb2ludGVyCisgIC8vLyB2YWx1ZSwgaXQgcmV0dXJucyAndGhpcycuCisgIGNvbnN0IFZhbHVlICpzdHJpcFBvaW50ZXJDYXN0cygpIGNvbnN0OworICBWYWx1ZSAqc3RyaXBQb2ludGVyQ2FzdHMoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUgKj4oCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgVmFsdWUgKj4odGhpcyktPnN0cmlwUG9pbnRlckNhc3RzKCkpOworICB9CisKKyAgLy8vIFxicmllZiBTdHJpcCBvZmYgcG9pbnRlciBjYXN0cywgYWxsLXplcm8gR0VQcywgYWxpYXNlcyBhbmQgYmFycmllcnMuCisgIC8vLworICAvLy8gUmV0dXJucyB0aGUgb3JpZ2luYWwgdW5jYXN0ZWQgdmFsdWUuICBJZiB0aGlzIGlzIGNhbGxlZCBvbiBhIG5vbi1wb2ludGVyCisgIC8vLyB2YWx1ZSwgaXQgcmV0dXJucyAndGhpcycuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgb25seSBpbgorICAvLy8gQWxpYXMgYW5hbHlzaXMuCisgIGNvbnN0IFZhbHVlICpzdHJpcFBvaW50ZXJDYXN0c0FuZEJhcnJpZXJzKCkgY29uc3Q7CisgIFZhbHVlICpzdHJpcFBvaW50ZXJDYXN0c0FuZEJhcnJpZXJzKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PFZhbHVlICo+KAorICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBWYWx1ZSAqPih0aGlzKS0+c3RyaXBQb2ludGVyQ2FzdHNBbmRCYXJyaWVycygpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU3RyaXAgb2ZmIHBvaW50ZXIgY2FzdHMgYW5kIGFsbC16ZXJvIEdFUHMuCisgIC8vLworICAvLy8gUmV0dXJucyB0aGUgb3JpZ2luYWwgdW5jYXN0ZWQgdmFsdWUuICBJZiB0aGlzIGlzIGNhbGxlZCBvbiBhIG5vbi1wb2ludGVyCisgIC8vLyB2YWx1ZSwgaXQgcmV0dXJucyAndGhpcycuCisgIGNvbnN0IFZhbHVlICpzdHJpcFBvaW50ZXJDYXN0c05vRm9sbG93QWxpYXNlcygpIGNvbnN0OworICBWYWx1ZSAqc3RyaXBQb2ludGVyQ2FzdHNOb0ZvbGxvd0FsaWFzZXMoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUgKj4oCisgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgVmFsdWUgKj4odGhpcyktPnN0cmlwUG9pbnRlckNhc3RzTm9Gb2xsb3dBbGlhc2VzKCkpOworICB9CisKKyAgLy8vIFxicmllZiBTdHJpcCBvZmYgcG9pbnRlciBjYXN0cyBhbmQgYWxsLWNvbnN0YW50IGluYm91bmRzIEdFUHMuCisgIC8vLworICAvLy8gUmV0dXJucyB0aGUgb3JpZ2luYWwgcG9pbnRlciB2YWx1ZS4gIElmIHRoaXMgaXMgY2FsbGVkIG9uIGEgbm9uLXBvaW50ZXIKKyAgLy8vIHZhbHVlLCBpdCByZXR1cm5zICd0aGlzJy4KKyAgY29uc3QgVmFsdWUgKnN0cmlwSW5Cb3VuZHNDb25zdGFudE9mZnNldHMoKSBjb25zdDsKKyAgVmFsdWUgKnN0cmlwSW5Cb3VuZHNDb25zdGFudE9mZnNldHMoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUgKj4oCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IFZhbHVlICo+KHRoaXMpLT5zdHJpcEluQm91bmRzQ29uc3RhbnRPZmZzZXRzKCkpOworICB9CisKKyAgLy8vIFxicmllZiBBY2N1bXVsYXRlIG9mZnNldHMgZnJvbSBcYSBzdHJpcEluQm91bmRzQ29uc3RhbnRPZmZzZXRzKCkuCisgIC8vLworICAvLy8gU3RvcmVzIHRoZSByZXN1bHRpbmcgY29uc3RhbnQgb2Zmc2V0IHN0cmlwcGVkIGludG8gdGhlIEFQSW50IHByb3ZpZGVkLgorICAvLy8gVGhlIHByb3ZpZGVkIEFQSW50IHdpbGwgYmUgZXh0ZW5kZWQgb3IgdHJ1bmNhdGVkIGFzIG5lZWRlZCB0byBiZSB0aGUKKyAgLy8vIGNvcnJlY3QgYml0d2lkdGggZm9yIGFuIG9mZnNldCBvZiB0aGlzIHBvaW50ZXIgdHlwZS4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIGlzIGNhbGxlZCBvbiBhIG5vbi1wb2ludGVyIHZhbHVlLCBpdCByZXR1cm5zICd0aGlzJy4KKyAgY29uc3QgVmFsdWUgKnN0cmlwQW5kQWNjdW11bGF0ZUluQm91bmRzQ29uc3RhbnRPZmZzZXRzKGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVBJbnQgJk9mZnNldCkgY29uc3Q7CisgIFZhbHVlICpzdHJpcEFuZEFjY3VtdWxhdGVJbkJvdW5kc0NvbnN0YW50T2Zmc2V0cyhjb25zdCBEYXRhTGF5b3V0ICZETCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZPZmZzZXQpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSAqPihzdGF0aWNfY2FzdDxjb25zdCBWYWx1ZSAqPih0aGlzKQorICAgICAgICAtPnN0cmlwQW5kQWNjdW11bGF0ZUluQm91bmRzQ29uc3RhbnRPZmZzZXRzKERMLCBPZmZzZXQpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU3RyaXAgb2ZmIHBvaW50ZXIgY2FzdHMgYW5kIGluYm91bmRzIEdFUHMuCisgIC8vLworICAvLy8gUmV0dXJucyB0aGUgb3JpZ2luYWwgcG9pbnRlciB2YWx1ZS4gIElmIHRoaXMgaXMgY2FsbGVkIG9uIGEgbm9uLXBvaW50ZXIKKyAgLy8vIHZhbHVlLCBpdCByZXR1cm5zICd0aGlzJy4KKyAgY29uc3QgVmFsdWUgKnN0cmlwSW5Cb3VuZHNPZmZzZXRzKCkgY29uc3Q7CisgIFZhbHVlICpzdHJpcEluQm91bmRzT2Zmc2V0cygpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSAqPigKKyAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBWYWx1ZSAqPih0aGlzKS0+c3RyaXBJbkJvdW5kc09mZnNldHMoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBrbm93biB0byBiZSBkZXJlZmVyZW5jZWFibGUgZm9yIHRoZQorICAvLy8gcG9pbnRlciB2YWx1ZS4KKyAgLy8vCisgIC8vLyBJZiBDYW5CZU51bGwgaXMgc2V0IGJ5IHRoaXMgZnVuY3Rpb24gdGhlIHBvaW50ZXIgY2FuIGVpdGhlciBiZSBudWxsIG9yIGJlCisgIC8vLyBkZXJlZmVyZW5jZWFibGUgdXAgdG8gdGhlIHJldHVybmVkIG51bWJlciBvZiBieXRlcy4KKyAgdWludDY0X3QgZ2V0UG9pbnRlckRlcmVmZXJlbmNlYWJsZUJ5dGVzKGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAmQ2FuQmVOdWxsKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybnMgYW4gYWxpZ25tZW50IG9mIHRoZSBwb2ludGVyIHZhbHVlLgorICAvLy8KKyAgLy8vIFJldHVybnMgYW4gYWxpZ25tZW50IHdoaWNoIGlzIGVpdGhlciBzcGVjaWZpZWQgZXhwbGljaXRseSwgZS5nLiB2aWEKKyAgLy8vIGFsaWduIGF0dHJpYnV0ZSBvZiBhIGZ1bmN0aW9uIGFyZ3VtZW50LCBvciBndWFyYW50ZWVkIGJ5IERhdGFMYXlvdXQuCisgIHVuc2lnbmVkIGdldFBvaW50ZXJBbGlnbm1lbnQoY29uc3QgRGF0YUxheW91dCAmREwpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgVHJhbnNsYXRlIFBISSBub2RlIHRvIGl0cyBwcmVkZWNlc3NvciBmcm9tIHRoZSBnaXZlbiBiYXNpYyBibG9jay4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIHZhbHVlIGlzIGEgUEhJIG5vZGUgd2l0aCBDdXJCQiBhcyBpdHMgcGFyZW50LCByZXR1cm4gdGhlIHZhbHVlIGluCisgIC8vLyB0aGUgUEhJIG5vZGUgY29ycmVzcG9uZGluZyB0byBQcmVkQkIuICBJZiBub3QsIHJldHVybiBvdXJzZWxmLiAgVGhpcyBpcworICAvLy8gdXNlZnVsIGlmIHlvdSB3YW50IHRvIGtub3cgdGhlIHZhbHVlIHNvbWV0aGluZyBoYXMgaW4gYSBwcmVkZWNlc3NvcgorICAvLy8gYmxvY2suCisgIGNvbnN0IFZhbHVlICpEb1BISVRyYW5zbGF0aW9uKGNvbnN0IEJhc2ljQmxvY2sgKkN1ckJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCYXNpY0Jsb2NrICpQcmVkQkIpIGNvbnN0OworICBWYWx1ZSAqRG9QSElUcmFuc2xhdGlvbihjb25zdCBCYXNpY0Jsb2NrICpDdXJCQiwgY29uc3QgQmFzaWNCbG9jayAqUHJlZEJCKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUgKj4oCisgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgVmFsdWUgKj4odGhpcyktPkRvUEhJVHJhbnNsYXRpb24oQ3VyQkIsIFByZWRCQikpOworICB9CisKKyAgLy8vIFxicmllZiBUaGUgbWF4aW11bSBhbGlnbm1lbnQgZm9yIGluc3RydWN0aW9ucy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHRoZSBncmVhdGVzdCBhbGlnbm1lbnQgdmFsdWUgc3VwcG9ydGVkIGJ5IGxvYWQsIHN0b3JlLCBhbmQgYWxsb2NhCisgIC8vLyBpbnN0cnVjdGlvbnMsIGFuZCBnbG9iYWwgdmFsdWVzLgorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgTWF4QWxpZ25tZW50RXhwb25lbnQgPSAyOTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE1heGltdW1BbGlnbm1lbnQgPSAxdSA8PCBNYXhBbGlnbm1lbnRFeHBvbmVudDsKKworICAvLy8gXGJyaWVmIE11dGF0ZSB0aGUgdHlwZSBvZiB0aGlzIFZhbHVlIHRvIGJlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBpcyBhbiBleHRyZW1lbHkgZGFuZ2Vyb3VzIG9wZXJhdGlvbiB3aGljaCBjYW4gY3JlYXRlCisgIC8vLyBjb21wbGV0ZWx5IGludmFsaWQgSVIgdmVyeSBlYXNpbHkuICBJdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0aGF0IHlvdQorICAvLy8gcmVjcmVhdGUgSVIgb2JqZWN0cyB3aXRoIHRoZSByaWdodCB0eXBlcyBpbnN0ZWFkIG9mIG11dGF0aW5nIHRoZW0gaW4KKyAgLy8vIHBsYWNlLgorICB2b2lkIG11dGF0ZVR5cGUoVHlwZSAqVHkpIHsKKyAgICBWVHkgPSBUeTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU29ydCB0aGUgdXNlLWxpc3QuCisgIC8vLworICAvLy8gU29ydHMgdGhlIFZhbHVlJ3MgdXNlLWxpc3QgYnkgQ21wIHVzaW5nIGEgc3RhYmxlIG1lcmdlc29ydC4gIENtcCBpcworICAvLy8gZXhwZWN0ZWQgdG8gY29tcGFyZSB0d28gXGEgVXNlIHJlZmVyZW5jZXMuCisgIHRlbXBsYXRlIDxjbGFzcyBDb21wYXJlPiB2b2lkIHNvcnRVc2VMaXN0KENvbXBhcmUgQ21wKTsKKworICAvLy8gXGJyaWVmIFJldmVyc2UgdGhlIHVzZS1saXN0LgorICB2b2lkIHJldmVyc2VVc2VMaXN0KCk7CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgTWVyZ2UgdHdvIGxpc3RzIHRvZ2V0aGVyLgorICAvLy8KKyAgLy8vIE1lcmdlcyBcYyBMIGFuZCBcYyBSIHVzaW5nIFxjIENtcC4gIFRvIGVuYWJsZSBzdGFibGUgc29ydHMsIGFsd2F5cyBwdXNoZXMKKyAgLy8vICJlcXVhbCIgaXRlbXMgZnJvbSBMIGJlZm9yZSBpdGVtcyBmcm9tIFIuCisgIC8vLworICAvLy8gXHJldHVybiB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgbGlzdC4KKyAgLy8vCisgIC8vLyBcbm90ZSBDb21wbGV0ZWx5IGlnbm9yZXMgXGEgVXNlOjpQcmV2IChkb2Vzbid0IHJlYWQsIGRvZXNuJ3QgdXBkYXRlKS4KKyAgdGVtcGxhdGUgPGNsYXNzIENvbXBhcmU+CisgIHN0YXRpYyBVc2UgKm1lcmdlVXNlTGlzdHMoVXNlICpMLCBVc2UgKlIsIENvbXBhcmUgQ21wKSB7CisgICAgVXNlICpNZXJnZWQ7CisgICAgVXNlICoqTmV4dCA9ICZNZXJnZWQ7CisKKyAgICB3aGlsZSAodHJ1ZSkgeworICAgICAgaWYgKCFMKSB7CisgICAgICAgICpOZXh0ID0gUjsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICBpZiAoIVIpIHsKKyAgICAgICAgKk5leHQgPSBMOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIGlmIChDbXAoKlIsICpMKSkgeworICAgICAgICAqTmV4dCA9IFI7CisgICAgICAgIE5leHQgPSAmUi0+TmV4dDsKKyAgICAgICAgUiA9IFItPk5leHQ7CisgICAgICB9IGVsc2UgeworICAgICAgICAqTmV4dCA9IEw7CisgICAgICAgIE5leHQgPSAmTC0+TmV4dDsKKyAgICAgICAgTCA9IEwtPk5leHQ7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE1lcmdlZDsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHVuc2lnbmVkIHNob3J0IGdldFN1YmNsYXNzRGF0YUZyb21WYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFN1YmNsYXNzRGF0YTsgfQorICB2b2lkIHNldFZhbHVlU3ViY2xhc3NEYXRhKHVuc2lnbmVkIHNob3J0IEQpIHsgU3ViY2xhc3NEYXRhID0gRDsgfQorfTsKKworc3RydWN0IFZhbHVlRGVsZXRlciB7IHZvaWQgb3BlcmF0b3IoKShWYWx1ZSAqVikgeyBWLT5kZWxldGVWYWx1ZSgpOyB9IH07CisKKy8vLyBVc2UgdGhpcyBpbnN0ZWFkIG9mIHN0ZDo6dW5pcXVlX3B0cjxWYWx1ZT4gb3Igc3RkOjp1bmlxdWVfcHRyPEluc3RydWN0aW9uPi4KKy8vLyBUaG9zZSBkb24ndCB3b3JrIGJlY2F1c2UgVmFsdWUgYW5kIEluc3RydWN0aW9uJ3MgZGVzdHJ1Y3RvcnMgYXJlIHByb3RlY3RlZCwKKy8vLyBhcmVuJ3QgdmlydHVhbCwgYW5kIHdvbid0IGRlc3Ryb3kgdGhlIGNvbXBsZXRlIG9iamVjdC4KK3VzaW5nIHVuaXF1ZV92YWx1ZSA9IHN0ZDo6dW5pcXVlX3B0cjxWYWx1ZSwgVmFsdWVEZWxldGVyPjsKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgVmFsdWUgJlYpIHsKKyAgVi5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKwordm9pZCBVc2U6OnNldChWYWx1ZSAqVikgeworICBpZiAoVmFsKSByZW1vdmVGcm9tTGlzdCgpOworICBWYWwgPSBWOworICBpZiAoVikgVi0+YWRkVXNlKCp0aGlzKTsKK30KKworVmFsdWUgKlVzZTo6b3BlcmF0b3I9KFZhbHVlICpSSFMpIHsKKyAgc2V0KFJIUyk7CisgIHJldHVybiBSSFM7Cit9CisKK2NvbnN0IFVzZSAmVXNlOjpvcGVyYXRvcj0oY29uc3QgVXNlICZSSFMpIHsKKyAgc2V0KFJIUy5WYWwpOworICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBDb21wYXJlPiB2b2lkIFZhbHVlOjpzb3J0VXNlTGlzdChDb21wYXJlIENtcCkgeworICBpZiAoIVVzZUxpc3QgfHwgIVVzZUxpc3QtPk5leHQpCisgICAgLy8gTm8gbmVlZCB0byBzb3J0IDAgb3IgMSB1c2VzLgorICAgIHJldHVybjsKKworICAvLyBOb3RlOiB0aGlzIGZ1bmN0aW9uIGNvbXBsZXRlbHkgaWdub3JlcyBQcmV2IHBvaW50ZXJzIHVudGlsIHRoZSBlbmQgd2hlbgorICAvLyB0aGV5J3JlIGZpeGVkIGVuIG1hc3NlLgorCisgIC8vIENyZWF0ZSBhIGJpbm9taWFsIHZlY3RvciBvZiBzb3J0ZWQgbGlzdHMsIHZpc2l0aW5nIHVzZXMgb25lIGF0IGEgdGltZSBhbmQKKyAgLy8gbWVyZ2luZyBsaXN0cyBhcyBuZWNlc3NhcnkuCisgIGNvbnN0IHVuc2lnbmVkIE1heFNsb3RzID0gMzI7CisgIFVzZSAqU2xvdHNbTWF4U2xvdHNdOworCisgIC8vIENvbGxlY3QgdGhlIGZpcnN0IHVzZSwgdHVybmluZyBpdCBpbnRvIGEgc2luZ2xlLWl0ZW0gbGlzdC4KKyAgVXNlICpOZXh0ID0gVXNlTGlzdC0+TmV4dDsKKyAgVXNlTGlzdC0+TmV4dCA9IG51bGxwdHI7CisgIHVuc2lnbmVkIE51bVNsb3RzID0gMTsKKyAgU2xvdHNbMF0gPSBVc2VMaXN0OworCisgIC8vIENvbGxlY3QgYWxsIGJ1dCB0aGUgbGFzdCB1c2UuCisgIHdoaWxlIChOZXh0LT5OZXh0KSB7CisgICAgVXNlICpDdXJyZW50ID0gTmV4dDsKKyAgICBOZXh0ID0gQ3VycmVudC0+TmV4dDsKKworICAgIC8vIFR1cm4gQ3VycmVudCBpbnRvIGEgc2luZ2xlLWl0ZW0gbGlzdC4KKyAgICBDdXJyZW50LT5OZXh0ID0gbnVsbHB0cjsKKworICAgIC8vIFNhdmUgQ3VycmVudCBpbiB0aGUgZmlyc3QgYXZhaWxhYmxlIHNsb3QsIG1lcmdpbmcgb24gY29sbGlzaW9ucy4KKyAgICB1bnNpZ25lZCBJOworICAgIGZvciAoSSA9IDA7IEkgPCBOdW1TbG90czsgKytJKSB7CisgICAgICBpZiAoIVNsb3RzW0ldKQorICAgICAgICBicmVhazsKKworICAgICAgLy8gTWVyZ2UgdHdvIGxpc3RzLCBkb3VibGluZyB0aGUgc2l6ZSBvZiBDdXJyZW50IGFuZCBlbXB0eWluZyBzbG90IEkuCisgICAgICAvLworICAgICAgLy8gU2luY2UgdGhlIHVzZXMgaW4gU2xvdHNbSV0gb3JpZ2luYWxseSBwcmVjZWRlZCB0aG9zZSBpbiBDdXJyZW50LCBzZW5kCisgICAgICAvLyBTbG90c1tJXSBpbiBhcyB0aGUgbGVmdCBwYXJhbWV0ZXIgdG8gbWFpbnRhaW4gYSBzdGFibGUgc29ydC4KKyAgICAgIEN1cnJlbnQgPSBtZXJnZVVzZUxpc3RzKFNsb3RzW0ldLCBDdXJyZW50LCBDbXApOworICAgICAgU2xvdHNbSV0gPSBudWxscHRyOworICAgIH0KKyAgICAvLyBDaGVjayBpZiB0aGlzIGlzIGEgbmV3IHNsb3QuCisgICAgaWYgKEkgPT0gTnVtU2xvdHMpIHsKKyAgICAgICsrTnVtU2xvdHM7CisgICAgICBhc3NlcnQoTnVtU2xvdHMgPD0gTWF4U2xvdHMgJiYgIlVzZSBsaXN0IGJpZ2dlciB0aGFuIDJeMzIiKTsKKyAgICB9CisKKyAgICAvLyBGb3VuZCBhbiBvcGVuIHNsb3QuCisgICAgU2xvdHNbSV0gPSBDdXJyZW50OworICB9CisKKyAgLy8gTWVyZ2UgYWxsIHRoZSBsaXN0cyB0b2dldGhlci4KKyAgYXNzZXJ0KE5leHQgJiYgIkV4cGVjdGVkIG9uZSBtb3JlIFVzZSIpOworICBhc3NlcnQoIU5leHQtPk5leHQgJiYgIkV4cGVjdGVkIG9ubHkgb25lIFVzZSIpOworICBVc2VMaXN0ID0gTmV4dDsKKyAgZm9yICh1bnNpZ25lZCBJID0gMDsgSSA8IE51bVNsb3RzOyArK0kpCisgICAgaWYgKFNsb3RzW0ldKQorICAgICAgLy8gU2luY2UgdGhlIHVzZXMgaW4gU2xvdHNbSV0gb3JpZ2luYWxseSBwcmVjZWRlZCB0aG9zZSBpbiBVc2VMaXN0LCBzZW5kCisgICAgICAvLyBTbG90c1tJXSBpbiBhcyB0aGUgbGVmdCBwYXJhbWV0ZXIgdG8gbWFpbnRhaW4gYSBzdGFibGUgc29ydC4KKyAgICAgIFVzZUxpc3QgPSBtZXJnZVVzZUxpc3RzKFNsb3RzW0ldLCBVc2VMaXN0LCBDbXApOworCisgIC8vIEZpeCB0aGUgUHJldiBwb2ludGVycy4KKyAgZm9yIChVc2UgKkkgPSBVc2VMaXN0LCAqKlByZXYgPSAmVXNlTGlzdDsgSTsgSSA9IEktPk5leHQpIHsKKyAgICBJLT5zZXRQcmV2KFByZXYpOworICAgIFByZXYgPSAmSS0+TmV4dDsKKyAgfQorfQorCisvLyBpc2EgLSBQcm92aWRlIHNvbWUgc3BlY2lhbGl6YXRpb25zIG9mIGlzYSBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gaW5jbHVkZQorLy8gdGhlIHN1YnR5cGUgaGVhZGVyIGZpbGVzIHRvIHRlc3QgdG8gc2VlIGlmIHRoZSB2YWx1ZSBpcyBhIHN1YmNsYXNzLi4uCisvLwordGVtcGxhdGUgPD4gc3RydWN0IGlzYV9pbXBsPENvbnN0YW50LCBWYWx1ZT4geworICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBWYWx1ZSAmVmFsKSB7CisgICAgc3RhdGljX2Fzc2VydChWYWx1ZTo6Q29uc3RhbnRGaXJzdFZhbCA9PSAwLCAiVmFsLmdldFZhbHVlSUQoKSA+PSBWYWx1ZTo6Q29uc3RhbnRGaXJzdFZhbCIpOworICAgIHJldHVybiBWYWwuZ2V0VmFsdWVJRCgpIDw9IFZhbHVlOjpDb25zdGFudExhc3RWYWw7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc2FfaW1wbDxDb25zdGFudERhdGEsIFZhbHVlPiB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0KGNvbnN0IFZhbHVlICZWYWwpIHsKKyAgICByZXR1cm4gVmFsLmdldFZhbHVlSUQoKSA+PSBWYWx1ZTo6Q29uc3RhbnREYXRhRmlyc3RWYWwgJiYKKyAgICAgICAgICAgVmFsLmdldFZhbHVlSUQoKSA8PSBWYWx1ZTo6Q29uc3RhbnREYXRhTGFzdFZhbDsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlzYV9pbXBsPENvbnN0YW50QWdncmVnYXRlLCBWYWx1ZT4geworICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBWYWx1ZSAmVmFsKSB7CisgICAgcmV0dXJuIFZhbC5nZXRWYWx1ZUlEKCkgPj0gVmFsdWU6OkNvbnN0YW50QWdncmVnYXRlRmlyc3RWYWwgJiYKKyAgICAgICAgICAgVmFsLmdldFZhbHVlSUQoKSA8PSBWYWx1ZTo6Q29uc3RhbnRBZ2dyZWdhdGVMYXN0VmFsOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNhX2ltcGw8QXJndW1lbnQsIFZhbHVlPiB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0IChjb25zdCBWYWx1ZSAmVmFsKSB7CisgICAgcmV0dXJuIFZhbC5nZXRWYWx1ZUlEKCkgPT0gVmFsdWU6OkFyZ3VtZW50VmFsOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNhX2ltcGw8SW5saW5lQXNtLCBWYWx1ZT4geworICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBWYWx1ZSAmVmFsKSB7CisgICAgcmV0dXJuIFZhbC5nZXRWYWx1ZUlEKCkgPT0gVmFsdWU6OklubGluZUFzbVZhbDsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlzYV9pbXBsPEluc3RydWN0aW9uLCBWYWx1ZT4geworICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBWYWx1ZSAmVmFsKSB7CisgICAgcmV0dXJuIFZhbC5nZXRWYWx1ZUlEKCkgPj0gVmFsdWU6Okluc3RydWN0aW9uVmFsOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNhX2ltcGw8QmFzaWNCbG9jaywgVmFsdWU+IHsKKyAgc3RhdGljIGlubGluZSBib29sIGRvaXQoY29uc3QgVmFsdWUgJlZhbCkgeworICAgIHJldHVybiBWYWwuZ2V0VmFsdWVJRCgpID09IFZhbHVlOjpCYXNpY0Jsb2NrVmFsOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNhX2ltcGw8RnVuY3Rpb24sIFZhbHVlPiB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0KGNvbnN0IFZhbHVlICZWYWwpIHsKKyAgICByZXR1cm4gVmFsLmdldFZhbHVlSUQoKSA9PSBWYWx1ZTo6RnVuY3Rpb25WYWw7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc2FfaW1wbDxHbG9iYWxWYXJpYWJsZSwgVmFsdWU+IHsKKyAgc3RhdGljIGlubGluZSBib29sIGRvaXQoY29uc3QgVmFsdWUgJlZhbCkgeworICAgIHJldHVybiBWYWwuZ2V0VmFsdWVJRCgpID09IFZhbHVlOjpHbG9iYWxWYXJpYWJsZVZhbDsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlzYV9pbXBsPEdsb2JhbEFsaWFzLCBWYWx1ZT4geworICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBWYWx1ZSAmVmFsKSB7CisgICAgcmV0dXJuIFZhbC5nZXRWYWx1ZUlEKCkgPT0gVmFsdWU6Okdsb2JhbEFsaWFzVmFsOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNhX2ltcGw8R2xvYmFsSUZ1bmMsIFZhbHVlPiB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0KGNvbnN0IFZhbHVlICZWYWwpIHsKKyAgICByZXR1cm4gVmFsLmdldFZhbHVlSUQoKSA9PSBWYWx1ZTo6R2xvYmFsSUZ1bmNWYWw7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc2FfaW1wbDxHbG9iYWxJbmRpcmVjdFN5bWJvbCwgVmFsdWU+IHsKKyAgc3RhdGljIGlubGluZSBib29sIGRvaXQoY29uc3QgVmFsdWUgJlZhbCkgeworICAgIHJldHVybiBpc2E8R2xvYmFsQWxpYXM+KFZhbCkgfHwgaXNhPEdsb2JhbElGdW5jPihWYWwpOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNhX2ltcGw8R2xvYmFsVmFsdWUsIFZhbHVlPiB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0KGNvbnN0IFZhbHVlICZWYWwpIHsKKyAgICByZXR1cm4gaXNhPEdsb2JhbE9iamVjdD4oVmFsKSB8fCBpc2E8R2xvYmFsSW5kaXJlY3RTeW1ib2w+KFZhbCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc2FfaW1wbDxHbG9iYWxPYmplY3QsIFZhbHVlPiB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0KGNvbnN0IFZhbHVlICZWYWwpIHsKKyAgICByZXR1cm4gaXNhPEdsb2JhbFZhcmlhYmxlPihWYWwpIHx8IGlzYTxGdW5jdGlvbj4oVmFsKTsKKyAgfQorfTsKKworLy8gQ3JlYXRlIHdyYXBwZXJzIGZvciBDIEJpbmRpbmcgdHlwZXMgKHNlZSBDQmluZGluZ1dyYXBwaW5nLmgpLgorREVGSU5FX0lTQV9DT05WRVJTSU9OX0ZVTkNUSU9OUyhWYWx1ZSwgTExWTVZhbHVlUmVmKQorCisvLyBTcGVjaWFsaXplZCBvcGFxdWUgdmFsdWUgY29udmVyc2lvbnMuCitpbmxpbmUgVmFsdWUgKip1bndyYXAoTExWTVZhbHVlUmVmICpWYWxzKSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFZhbHVlKio+KFZhbHMpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgoraW5saW5lIFQgKip1bndyYXAoTExWTVZhbHVlUmVmICpWYWxzLCB1bnNpZ25lZCBMZW5ndGgpIHsKKyNpZm5kZWYgTkRFQlVHCisgIGZvciAoTExWTVZhbHVlUmVmICpJID0gVmFscywgKkUgPSBWYWxzICsgTGVuZ3RoOyBJICE9IEU7ICsrSSkKKyAgICB1bndyYXA8VD4oKkkpOyAvLyBGb3Igc2lkZSBlZmZlY3Qgb2YgY2FsbGluZyBhc3NlcnQgb24gaW52YWxpZCB1c2FnZS4KKyNlbmRpZgorICAodm9pZClMZW5ndGg7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PFQqKj4oVmFscyk7Cit9CisKK2lubGluZSBMTFZNVmFsdWVSZWYgKndyYXAoY29uc3QgVmFsdWUgKipWYWxzKSB7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PExMVk1WYWx1ZVJlZio+KGNvbnN0X2Nhc3Q8VmFsdWUqKj4oVmFscykpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9WQUxVRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1ZhbHVlSGFuZGxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1ZhbHVlSGFuZGxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ1Y2M3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVmFsdWVIYW5kbGUuaApAQCAtMCwwICsxLDU2MiBAQAorLy89PT0tIFZhbHVlSGFuZGxlLmggLSBWYWx1ZSBTbWFydCBQb2ludGVyIGNsYXNzZXMgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFZhbHVlSGFuZGxlIGNsYXNzIGFuZCBpdHMgc3ViLWNsYXNzZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX1ZBTFVFSEFORExFX0gKKyNkZWZpbmUgTExWTV9JUl9WQUxVRUhBTkRMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFxicmllZiBUaGlzIGlzIHRoZSBjb21tb24gYmFzZSBjbGFzcyBvZiB2YWx1ZSBoYW5kbGVzLgorLy8vCisvLy8gVmFsdWVIYW5kbGUncyBhcmUgc21hcnQgcG9pbnRlcnMgdG8gVmFsdWUncyB0aGF0IGhhdmUgc3BlY2lhbCBiZWhhdmlvciB3aGVuCisvLy8gdGhlIHZhbHVlIGlzIGRlbGV0ZWQgb3IgUmVwbGFjZUFsbFVzZXNXaXRoJ2QuICBTZWUgdGhlIHNwZWNpZmljIGhhbmRsZXMKKy8vLyBiZWxvdyBmb3IgZGV0YWlscy4KK2NsYXNzIFZhbHVlSGFuZGxlQmFzZSB7CisgIGZyaWVuZCBjbGFzcyBWYWx1ZTsKKworcHJvdGVjdGVkOgorICAvLy8gXGJyaWVmIFRoaXMgaW5kaWNhdGVzIHdoYXQgc3ViIGNsYXNzIHRoZSBoYW5kbGUgYWN0dWFsbHkgaXMuCisgIC8vLworICAvLy8gVGhpcyBpcyB0byBhdm9pZCBoYXZpbmcgYSB2dGFibGUgZm9yIHRoZSBsaWdodC13ZWlnaHQgaGFuZGxlIHBvaW50ZXJzLiBUaGUKKyAgLy8vIGZ1bGx5IGdlbmVyYWwgQ2FsbGJhY2sgdmVyc2lvbiBkb2VzIGhhdmUgYSB2dGFibGUuCisgIGVudW0gSGFuZGxlQmFzZUtpbmQgeyBBc3NlcnQsIENhbGxiYWNrLCBXZWFrLCBXZWFrVHJhY2tpbmcgfTsKKworICBWYWx1ZUhhbmRsZUJhc2UoY29uc3QgVmFsdWVIYW5kbGVCYXNlICZSSFMpCisgICAgICA6IFZhbHVlSGFuZGxlQmFzZShSSFMuUHJldlBhaXIuZ2V0SW50KCksIFJIUykge30KKworICBWYWx1ZUhhbmRsZUJhc2UoSGFuZGxlQmFzZUtpbmQgS2luZCwgY29uc3QgVmFsdWVIYW5kbGVCYXNlICZSSFMpCisgICAgICA6IFByZXZQYWlyKG51bGxwdHIsIEtpbmQpLCBWYWwoUkhTLmdldFZhbFB0cigpKSB7CisgICAgaWYgKGlzVmFsaWQoZ2V0VmFsUHRyKCkpKQorICAgICAgQWRkVG9FeGlzdGluZ1VzZUxpc3QoUkhTLmdldFByZXZQdHIoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgUG9pbnRlckludFBhaXI8VmFsdWVIYW5kbGVCYXNlKiosIDIsIEhhbmRsZUJhc2VLaW5kPiBQcmV2UGFpcjsKKyAgVmFsdWVIYW5kbGVCYXNlICpOZXh0ID0gbnVsbHB0cjsKKyAgVmFsdWUgKlZhbCA9IG51bGxwdHI7CisKKyAgdm9pZCBzZXRWYWxQdHIoVmFsdWUgKlYpIHsgVmFsID0gVjsgfQorCitwdWJsaWM6CisgIGV4cGxpY2l0IFZhbHVlSGFuZGxlQmFzZShIYW5kbGVCYXNlS2luZCBLaW5kKQorICAgICAgOiBQcmV2UGFpcihudWxscHRyLCBLaW5kKSB7fQorICBWYWx1ZUhhbmRsZUJhc2UoSGFuZGxlQmFzZUtpbmQgS2luZCwgVmFsdWUgKlYpCisgICAgICA6IFByZXZQYWlyKG51bGxwdHIsIEtpbmQpLCBWYWwoVikgeworICAgIGlmIChpc1ZhbGlkKGdldFZhbFB0cigpKSkKKyAgICAgIEFkZFRvVXNlTGlzdCgpOworICB9CisKKyAgflZhbHVlSGFuZGxlQmFzZSgpIHsKKyAgICBpZiAoaXNWYWxpZChnZXRWYWxQdHIoKSkpCisgICAgICBSZW1vdmVGcm9tVXNlTGlzdCgpOworICB9CisKKyAgVmFsdWUgKm9wZXJhdG9yPShWYWx1ZSAqUkhTKSB7CisgICAgaWYgKGdldFZhbFB0cigpID09IFJIUykKKyAgICAgIHJldHVybiBSSFM7CisgICAgaWYgKGlzVmFsaWQoZ2V0VmFsUHRyKCkpKQorICAgICAgUmVtb3ZlRnJvbVVzZUxpc3QoKTsKKyAgICBzZXRWYWxQdHIoUkhTKTsKKyAgICBpZiAoaXNWYWxpZChnZXRWYWxQdHIoKSkpCisgICAgICBBZGRUb1VzZUxpc3QoKTsKKyAgICByZXR1cm4gUkhTOworICB9CisKKyAgVmFsdWUgKm9wZXJhdG9yPShjb25zdCBWYWx1ZUhhbmRsZUJhc2UgJlJIUykgeworICAgIGlmIChnZXRWYWxQdHIoKSA9PSBSSFMuZ2V0VmFsUHRyKCkpCisgICAgICByZXR1cm4gUkhTLmdldFZhbFB0cigpOworICAgIGlmIChpc1ZhbGlkKGdldFZhbFB0cigpKSkKKyAgICAgIFJlbW92ZUZyb21Vc2VMaXN0KCk7CisgICAgc2V0VmFsUHRyKFJIUy5nZXRWYWxQdHIoKSk7CisgICAgaWYgKGlzVmFsaWQoZ2V0VmFsUHRyKCkpKQorICAgICAgQWRkVG9FeGlzdGluZ1VzZUxpc3QoUkhTLmdldFByZXZQdHIoKSk7CisgICAgcmV0dXJuIGdldFZhbFB0cigpOworICB9CisKKyAgVmFsdWUgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBnZXRWYWxQdHIoKTsgfQorICBWYWx1ZSAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKmdldFZhbFB0cigpOyB9CisKK3Byb3RlY3RlZDoKKyAgVmFsdWUgKmdldFZhbFB0cigpIGNvbnN0IHsgcmV0dXJuIFZhbDsgfQorCisgIHN0YXRpYyBib29sIGlzVmFsaWQoVmFsdWUgKlYpIHsKKyAgICByZXR1cm4gViAmJgorICAgICAgICAgICBWICE9IERlbnNlTWFwSW5mbzxWYWx1ZSAqPjo6Z2V0RW1wdHlLZXkoKSAmJgorICAgICAgICAgICBWICE9IERlbnNlTWFwSW5mbzxWYWx1ZSAqPjo6Z2V0VG9tYnN0b25lS2V5KCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlbW92ZSB0aGlzIFZhbHVlSGFuZGxlIGZyb20gaXRzIGN1cnJlbnQgdXNlIGxpc3QuCisgIHZvaWQgUmVtb3ZlRnJvbVVzZUxpc3QoKTsKKworICAvLy8gXGJyaWVmIENsZWFyIHRoZSB1bmRlcmx5aW5nIHBvaW50ZXIgd2l0aG91dCBjbGVhcmluZyB0aGUgdXNlIGxpc3QuCisgIC8vLworICAvLy8gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkIGlmIGEgZGVyaXZlZCBjbGFzcyBoYXMgbWFudWFsbHkgcmVtb3ZlZCB0aGUKKyAgLy8vIGhhbmRsZSBmcm9tIHRoZSB1c2UgbGlzdC4KKyAgdm9pZCBjbGVhclZhbFB0cigpIHsgc2V0VmFsUHRyKG51bGxwdHIpOyB9CisKK3B1YmxpYzoKKyAgLy8gQ2FsbGJhY2tzIG1hZGUgZnJvbSBWYWx1ZS4KKyAgc3RhdGljIHZvaWQgVmFsdWVJc0RlbGV0ZWQoVmFsdWUgKlYpOworICBzdGF0aWMgdm9pZCBWYWx1ZUlzUkFVV2QoVmFsdWUgKk9sZCwgVmFsdWUgKk5ldyk7CisKK3ByaXZhdGU6CisgIC8vIEludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbHMuCisgIFZhbHVlSGFuZGxlQmFzZSAqKmdldFByZXZQdHIoKSBjb25zdCB7IHJldHVybiBQcmV2UGFpci5nZXRQb2ludGVyKCk7IH0KKyAgSGFuZGxlQmFzZUtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIFByZXZQYWlyLmdldEludCgpOyB9CisgIHZvaWQgc2V0UHJldlB0cihWYWx1ZUhhbmRsZUJhc2UgKipQdHIpIHsgUHJldlBhaXIuc2V0UG9pbnRlcihQdHIpOyB9CisKKyAgLy8vIFxicmllZiBBZGQgdGhpcyBWYWx1ZUhhbmRsZSB0byB0aGUgdXNlIGxpc3QgZm9yIFYuCisgIC8vLworICAvLy8gTGlzdCBpcyB0aGUgYWRkcmVzcyBvZiBlaXRoZXIgdGhlIGhlYWQgb2YgdGhlIGxpc3Qgb3IgYSBOZXh0IG5vZGUgd2l0aGluCisgIC8vLyB0aGUgZXhpc3RpbmcgdXNlIGxpc3QuCisgIHZvaWQgQWRkVG9FeGlzdGluZ1VzZUxpc3QoVmFsdWVIYW5kbGVCYXNlICoqTGlzdCk7CisKKyAgLy8vIFxicmllZiBBZGQgdGhpcyBWYWx1ZUhhbmRsZSB0byB0aGUgdXNlIGxpc3QgYWZ0ZXIgTm9kZS4KKyAgdm9pZCBBZGRUb0V4aXN0aW5nVXNlTGlzdEFmdGVyKFZhbHVlSGFuZGxlQmFzZSAqTm9kZSk7CisKKyAgLy8vIFxicmllZiBBZGQgdGhpcyBWYWx1ZUhhbmRsZSB0byB0aGUgdXNlIGxpc3QgZm9yIFYuCisgIHZvaWQgQWRkVG9Vc2VMaXN0KCk7Cit9OworCisvLy8gXGJyaWVmIEEgbnVsbGFibGUgVmFsdWUgaGFuZGxlIHRoYXQgaXMgbnVsbGFibGUuCisvLy8KKy8vLyBUaGlzIGlzIGEgdmFsdWUgaGFuZGxlIHRoYXQgcG9pbnRzIHRvIGEgdmFsdWUsIGFuZCBudWxscyBpdHNlbGYKKy8vLyBvdXQgaWYgdGhhdCB2YWx1ZSBpcyBkZWxldGVkLgorY2xhc3MgV2Vha1ZIIDogcHVibGljIFZhbHVlSGFuZGxlQmFzZSB7CitwdWJsaWM6CisgIFdlYWtWSCgpIDogVmFsdWVIYW5kbGVCYXNlKFdlYWspIHt9CisgIFdlYWtWSChWYWx1ZSAqUCkgOiBWYWx1ZUhhbmRsZUJhc2UoV2VhaywgUCkge30KKyAgV2Vha1ZIKGNvbnN0IFdlYWtWSCAmUkhTKQorICAgICAgOiBWYWx1ZUhhbmRsZUJhc2UoV2VhaywgUkhTKSB7fQorCisgIFdlYWtWSCAmb3BlcmF0b3I9KGNvbnN0IFdlYWtWSCAmUkhTKSA9IGRlZmF1bHQ7CisKKyAgVmFsdWUgKm9wZXJhdG9yPShWYWx1ZSAqUkhTKSB7CisgICAgcmV0dXJuIFZhbHVlSGFuZGxlQmFzZTo6b3BlcmF0b3I9KFJIUyk7CisgIH0KKyAgVmFsdWUgKm9wZXJhdG9yPShjb25zdCBWYWx1ZUhhbmRsZUJhc2UgJlJIUykgeworICAgIHJldHVybiBWYWx1ZUhhbmRsZUJhc2U6Om9wZXJhdG9yPShSSFMpOworICB9CisKKyAgb3BlcmF0b3IgVmFsdWUqKCkgY29uc3QgeworICAgIHJldHVybiBnZXRWYWxQdHIoKTsKKyAgfQorfTsKKworLy8gU3BlY2lhbGl6ZSBzaW1wbGlmeV90eXBlIHRvIGFsbG93IFdlYWtWSCB0byBwYXJ0aWNpcGF0ZSBpbgorLy8gZHluX2Nhc3QsIGlzYSwgZXRjLgordGVtcGxhdGUgPD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8V2Vha1ZIPiB7CisgIHVzaW5nIFNpbXBsZVR5cGUgPSBWYWx1ZSAqOworCisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShXZWFrVkggJldWSCkgeyByZXR1cm4gV1ZIOyB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8Y29uc3QgV2Vha1ZIPiB7CisgIHVzaW5nIFNpbXBsZVR5cGUgPSBWYWx1ZSAqOworCisgIHN0YXRpYyBTaW1wbGVUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShjb25zdCBXZWFrVkggJldWSCkgeyByZXR1cm4gV1ZIOyB9Cit9OworCisvLy8gXGJyaWVmIFZhbHVlIGhhbmRsZSB0aGF0IGlzIG51bGxhYmxlLCBidXQgdHJpZXMgdG8gdHJhY2sgdGhlIFZhbHVlLgorLy8vCisvLy8gVGhpcyBpcyBhIHZhbHVlIGhhbmRsZSB0aGF0IHRyaWVzIGhhcmQgdG8gcG9pbnQgdG8gYSBWYWx1ZSwgZXZlbiBhY3Jvc3MKKy8vLyBSQVVXIG9wZXJhdGlvbnMsIGJ1dCB3aWxsIG51bGwgaXRzZWxmIG91dCBpZiB0aGUgdmFsdWUgaXMgZGVzdHJveWVkLiAgdGhpcworLy8vIGlzIHVzZWZ1bCBmb3IgYWR2aXNvcnkgc29ydHMgb2YgaW5mb3JtYXRpb24sIGJ1dCBzaG91bGQgbm90IGJlIHVzZWQgYXMgdGhlCisvLy8ga2V5IG9mIGEgbWFwIChzaW5jZSB0aGUgbWFwIHdvdWxkIGhhdmUgdG8gcmVhcnJhbmdlIGl0c2VsZiB3aGVuIHRoZSBwb2ludGVyCisvLy8gY2hhbmdlcykuCitjbGFzcyBXZWFrVHJhY2tpbmdWSCA6IHB1YmxpYyBWYWx1ZUhhbmRsZUJhc2UgeworcHVibGljOgorICBXZWFrVHJhY2tpbmdWSCgpIDogVmFsdWVIYW5kbGVCYXNlKFdlYWtUcmFja2luZykge30KKyAgV2Vha1RyYWNraW5nVkgoVmFsdWUgKlApIDogVmFsdWVIYW5kbGVCYXNlKFdlYWtUcmFja2luZywgUCkge30KKyAgV2Vha1RyYWNraW5nVkgoY29uc3QgV2Vha1RyYWNraW5nVkggJlJIUykKKyAgICAgIDogVmFsdWVIYW5kbGVCYXNlKFdlYWtUcmFja2luZywgUkhTKSB7fQorCisgIFdlYWtUcmFja2luZ1ZIICZvcGVyYXRvcj0oY29uc3QgV2Vha1RyYWNraW5nVkggJlJIUykgPSBkZWZhdWx0OworCisgIFZhbHVlICpvcGVyYXRvcj0oVmFsdWUgKlJIUykgeworICAgIHJldHVybiBWYWx1ZUhhbmRsZUJhc2U6Om9wZXJhdG9yPShSSFMpOworICB9CisgIFZhbHVlICpvcGVyYXRvcj0oY29uc3QgVmFsdWVIYW5kbGVCYXNlICZSSFMpIHsKKyAgICByZXR1cm4gVmFsdWVIYW5kbGVCYXNlOjpvcGVyYXRvcj0oUkhTKTsKKyAgfQorCisgIG9wZXJhdG9yIFZhbHVlKigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmFsUHRyKCk7CisgIH0KKworICBib29sIHBvaW50c1RvQWxpdmVWYWx1ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWVIYW5kbGVCYXNlOjppc1ZhbGlkKGdldFZhbFB0cigpKTsKKyAgfQorfTsKKworLy8gU3BlY2lhbGl6ZSBzaW1wbGlmeV90eXBlIHRvIGFsbG93IFdlYWtUcmFja2luZ1ZIIHRvIHBhcnRpY2lwYXRlIGluCisvLyBkeW5fY2FzdCwgaXNhLCBldGMuCit0ZW1wbGF0ZSA8PiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxXZWFrVHJhY2tpbmdWSD4geworICB1c2luZyBTaW1wbGVUeXBlID0gVmFsdWUgKjsKKworICBzdGF0aWMgU2ltcGxlVHlwZSBnZXRTaW1wbGlmaWVkVmFsdWUoV2Vha1RyYWNraW5nVkggJldWSCkgeyByZXR1cm4gV1ZIOyB9Cit9OwordGVtcGxhdGUgPD4gc3RydWN0IHNpbXBsaWZ5X3R5cGU8Y29uc3QgV2Vha1RyYWNraW5nVkg+IHsKKyAgdXNpbmcgU2ltcGxlVHlwZSA9IFZhbHVlICo7CisKKyAgc3RhdGljIFNpbXBsZVR5cGUgZ2V0U2ltcGxpZmllZFZhbHVlKGNvbnN0IFdlYWtUcmFja2luZ1ZIICZXVkgpIHsKKyAgICByZXR1cm4gV1ZIOworICB9Cit9OworCisvLy8gXGJyaWVmIFZhbHVlIGhhbmRsZSB0aGF0IGFzc2VydHMgaWYgdGhlIFZhbHVlIGlzIGRlbGV0ZWQuCisvLy8KKy8vLyBUaGlzIGlzIGEgVmFsdWUgSGFuZGxlIHRoYXQgcG9pbnRzIHRvIGEgdmFsdWUgYW5kIGFzc2VydHMgb3V0IGlmIHRoZSB2YWx1ZQorLy8vIGlzIGRlc3Ryb3llZCB3aGlsZSB0aGUgaGFuZGxlIGlzIHN0aWxsIGxpdmUuICBUaGlzIGlzIHZlcnkgdXNlZnVsIGZvcgorLy8vIGNhdGNoaW5nIGRhbmdsaW5nIHBvaW50ZXIgYnVncyBhbmQgb3RoZXIgdGhpbmdzIHdoaWNoIGNhbiBiZSBub24tb2J2aW91cy4KKy8vLyBPbmUgcGFydGljdWxhcmx5IHVzZWZ1bCBwbGFjZSB0byB1c2UgdGhpcyBpcyBhcyB0aGUgS2V5IG9mIGEgbWFwLiAgRGFuZ2xpbmcKKy8vLyBwb2ludGVyIGJ1Z3Mgb2Z0ZW4gbGVhZCB0byByZWFsbHkgc3VidGxlIGJ1Z3MgdGhhdCBvbmx5IG9jY3VyIGlmIGFub3RoZXIKKy8vLyBvYmplY3QgaGFwcGVucyB0byBnZXQgYWxsb2NhdGVkIHRvIHRoZSBzYW1lIGFkZHJlc3MgYXMgdGhlIG9sZCBvbmUuICBVc2luZworLy8vIGFuIEFzc2VydGluZ1ZIIGVuc3VyZXMgdGhhdCBhbiBhc3NlcnQgaXMgdHJpZ2dlcmVkIGFzIHNvb24gYXMgdGhlIGJhZAorLy8vIGRlbGV0ZSBvY2N1cnMuCisvLy8KKy8vLyBOb3RlIHRoYXQgYW4gQXNzZXJ0aW5nVkggaGFuZGxlIGRvZXMgKm5vdCogZm9sbG93IHZhbHVlcyBhY3Jvc3MgUkFVVworLy8vIG9wZXJhdGlvbnMuICBUaGlzIG1lYW5zIHRoYXQgUkFVVydzIG5lZWQgdG8gZXhwbGljaXRseSB1cGRhdGUgdGhlCisvLy8gQXNzZXJ0aW5nVkgncyBhcyBpdCBtb3Zlcy4gIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSBpbiBub24tYXNzZXJ0IG1vZGUgdGhpcworLy8vIGNsYXNzIHR1cm5zIGludG8gYSB0cml2aWFsIHdyYXBwZXIgYXJvdW5kIGEgcG9pbnRlci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVR5PgorY2xhc3MgQXNzZXJ0aW5nVkgKKyNpZm5kZWYgTkRFQlVHCisgIDogcHVibGljIFZhbHVlSGFuZGxlQmFzZQorI2VuZGlmCisgIHsKKyAgZnJpZW5kIHN0cnVjdCBEZW5zZU1hcEluZm88QXNzZXJ0aW5nVkg8VmFsdWVUeT4+OworCisjaWZuZGVmIE5ERUJVRworICBWYWx1ZSAqZ2V0UmF3VmFsUHRyKCkgY29uc3QgeyByZXR1cm4gVmFsdWVIYW5kbGVCYXNlOjpnZXRWYWxQdHIoKTsgfQorICB2b2lkIHNldFJhd1ZhbFB0cihWYWx1ZSAqUCkgeyBWYWx1ZUhhbmRsZUJhc2U6Om9wZXJhdG9yPShQKTsgfQorI2Vsc2UKKyAgVmFsdWUgKlRoZVB0cjsKKyAgVmFsdWUgKmdldFJhd1ZhbFB0cigpIGNvbnN0IHsgcmV0dXJuIFRoZVB0cjsgfQorICB2b2lkIHNldFJhd1ZhbFB0cihWYWx1ZSAqUCkgeyBUaGVQdHIgPSBQOyB9CisjZW5kaWYKKyAgLy8gQ29udmVydCBhIFZhbHVlVHkqLCB3aGljaCBtYXkgYmUgY29uc3QsIHRvIHRoZSByYXcgVmFsdWUqLgorICBzdGF0aWMgVmFsdWUgKkdldEFzVmFsdWUoVmFsdWUgKlYpIHsgcmV0dXJuIFY7IH0KKyAgc3RhdGljIFZhbHVlICpHZXRBc1ZhbHVlKGNvbnN0IFZhbHVlICpWKSB7IHJldHVybiBjb25zdF9jYXN0PFZhbHVlKj4oVik7IH0KKworICBWYWx1ZVR5ICpnZXRWYWxQdHIoKSBjb25zdCB7IHJldHVybiBzdGF0aWNfY2FzdDxWYWx1ZVR5ICo+KGdldFJhd1ZhbFB0cigpKTsgfQorICB2b2lkIHNldFZhbFB0cihWYWx1ZVR5ICpQKSB7IHNldFJhd1ZhbFB0cihHZXRBc1ZhbHVlKFApKTsgfQorCitwdWJsaWM6CisjaWZuZGVmIE5ERUJVRworICBBc3NlcnRpbmdWSCgpIDogVmFsdWVIYW5kbGVCYXNlKEFzc2VydCkge30KKyAgQXNzZXJ0aW5nVkgoVmFsdWVUeSAqUCkgOiBWYWx1ZUhhbmRsZUJhc2UoQXNzZXJ0LCBHZXRBc1ZhbHVlKFApKSB7fQorICBBc3NlcnRpbmdWSChjb25zdCBBc3NlcnRpbmdWSCAmUkhTKSA6IFZhbHVlSGFuZGxlQmFzZShBc3NlcnQsIFJIUykge30KKyNlbHNlCisgIEFzc2VydGluZ1ZIKCkgOiBUaGVQdHIobnVsbHB0cikge30KKyAgQXNzZXJ0aW5nVkgoVmFsdWVUeSAqUCkgOiBUaGVQdHIoR2V0QXNWYWx1ZShQKSkge30KKyNlbmRpZgorCisgIG9wZXJhdG9yIFZhbHVlVHkqKCkgY29uc3QgeworICAgIHJldHVybiBnZXRWYWxQdHIoKTsKKyAgfQorCisgIFZhbHVlVHkgKm9wZXJhdG9yPShWYWx1ZVR5ICpSSFMpIHsKKyAgICBzZXRWYWxQdHIoUkhTKTsKKyAgICByZXR1cm4gZ2V0VmFsUHRyKCk7CisgIH0KKyAgVmFsdWVUeSAqb3BlcmF0b3I9KGNvbnN0IEFzc2VydGluZ1ZIPFZhbHVlVHk+ICZSSFMpIHsKKyAgICBzZXRWYWxQdHIoUkhTLmdldFZhbFB0cigpKTsKKyAgICByZXR1cm4gZ2V0VmFsUHRyKCk7CisgIH0KKworICBWYWx1ZVR5ICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gZ2V0VmFsUHRyKCk7IH0KKyAgVmFsdWVUeSAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKmdldFZhbFB0cigpOyB9Cit9OworCisvLyBTcGVjaWFsaXplIERlbnNlTWFwSW5mbyB0byBhbGxvdyBBc3NlcnRpbmdWSCB0byBwYXJ0aWNpcGF0ZSBpbiBEZW5zZU1hcC4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgRGVuc2VNYXBJbmZvPEFzc2VydGluZ1ZIPFQ+PiB7CisgIHN0YXRpYyBpbmxpbmUgQXNzZXJ0aW5nVkg8VD4gZ2V0RW1wdHlLZXkoKSB7CisgICAgQXNzZXJ0aW5nVkg8VD4gUmVzOworICAgIFJlcy5zZXRSYXdWYWxQdHIoRGVuc2VNYXBJbmZvPFZhbHVlICo+OjpnZXRFbXB0eUtleSgpKTsKKyAgICByZXR1cm4gUmVzOworICB9CisKKyAgc3RhdGljIGlubGluZSBBc3NlcnRpbmdWSDxUPiBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgQXNzZXJ0aW5nVkg8VD4gUmVzOworICAgIFJlcy5zZXRSYXdWYWxQdHIoRGVuc2VNYXBJbmZvPFZhbHVlICo+OjpnZXRUb21ic3RvbmVLZXkoKSk7CisgICAgcmV0dXJuIFJlczsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgQXNzZXJ0aW5nVkg8VD4gJlZhbCkgeworICAgIHJldHVybiBEZW5zZU1hcEluZm88VmFsdWUgKj46OmdldEhhc2hWYWx1ZShWYWwuZ2V0UmF3VmFsUHRyKCkpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBBc3NlcnRpbmdWSDxUPiAmTEhTLCBjb25zdCBBc3NlcnRpbmdWSDxUPiAmUkhTKSB7CisgICAgcmV0dXJuIERlbnNlTWFwSW5mbzxWYWx1ZSAqPjo6aXNFcXVhbChMSFMuZ2V0UmF3VmFsUHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSFMuZ2V0UmF3VmFsUHRyKCkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBpc1BvZExpa2U8QXNzZXJ0aW5nVkg8VD4+IHsKKyNpZmRlZiBOREVCVUcKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworI2Vsc2UKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsKKyNlbmRpZgorfTsKKworLy8vIFxicmllZiBWYWx1ZSBoYW5kbGUgdGhhdCB0cmFja3MgYSBWYWx1ZSBhY3Jvc3MgUkFVVy4KKy8vLworLy8vIFRyYWNraW5nVkggaXMgZGVzaWduZWQgZm9yIHNpdHVhdGlvbnMgd2hlcmUgYSBjbGllbnQgbmVlZHMgdG8gaG9sZCBhIGhhbmRsZQorLy8vIHRvIGEgVmFsdWUgKG9yIHN1YmNsYXNzKSBhY3Jvc3Mgc29tZSBvcGVyYXRpb25zIHdoaWNoIG1heSBtb3ZlIHRoYXQgdmFsdWUsCisvLy8gYnV0IHNob3VsZCBuZXZlciBkZXN0cm95IGl0IG9yIHJlcGxhY2UgaXQgd2l0aCBzb21lIHVuYWNjZXB0YWJsZSB0eXBlLgorLy8vCisvLy8gSXQgaXMgYW4gZXJyb3IgdG8gYXR0ZW1wdCB0byByZXBsYWNlIGEgdmFsdWUgd2l0aCBvbmUgb2YgYSB0eXBlIHdoaWNoIGlzCisvLy8gaW5jb21wYXRpYmxlIHdpdGggYW55IG9mIGl0cyBvdXRzdGFuZGluZyBUcmFja2luZ1ZIcy4KKy8vLworLy8vIEl0IGlzIGFuIGVycm9yIHRvIHJlYWQgZnJvbSBhIFRyYWNraW5nVkggdGhhdCBkb2VzIG5vdCBwb2ludCB0byBhIHZhbGlkCisvLy8gdmFsdWUuICBBIFRyYWNraW5nVkggaXMgc2FpZCB0byBub3QgcG9pbnQgdG8gYSB2YWxpZCB2YWx1ZSBpZiBlaXRoZXIgaXQKKy8vLyBoYXNuJ3QgeWV0IGJlZW4gYXNzaWduZWQgYSB2YWx1ZSB5ZXQgb3IgYmVjYXVzZSB0aGUgdmFsdWUgaXQgd2FzIHRyYWNraW5nCisvLy8gaGFzIHNpbmNlIGJlZW4gZGVsZXRlZC4KKy8vLworLy8vIEFzc2lnbmluZyBhIHZhbHVlIHRvIGEgVHJhY2tpbmdWSCBpcyBhbHdheXMgYWxsb3dlZCwgZXZlbiBpZiBzYWlkIFRyYWNraW5nVkgKKy8vLyBubyBsb25nZXIgcG9pbnRzIHRvIGEgdmFsaWQgdmFsdWUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVUeT4gY2xhc3MgVHJhY2tpbmdWSCB7CisgIFdlYWtUcmFja2luZ1ZIIElubmVySGFuZGxlOworCitwdWJsaWM6CisgIFZhbHVlVHkgKmdldFZhbFB0cigpIGNvbnN0IHsKKyAgICBhc3NlcnQoSW5uZXJIYW5kbGUucG9pbnRzVG9BbGl2ZVZhbHVlKCkgJiYKKyAgICAgICAgICAgIlRyYWNraW5nVkggbXVzdCBiZSBub24tbnVsbCBhbmQgdmFsaWQgb24gZGVyZWZlcmVuY2UhIik7CisKKyAgICAvLyBDaGVjayB0aGF0IHRoZSB2YWx1ZSBpcyBhIG1lbWJlciBvZiB0aGUgY29ycmVjdCBzdWJjbGFzcy4gV2Ugd291bGQgbGlrZQorICAgIC8vIHRvIGNoZWNrIHRoaXMgcHJvcGVydHkgb24gYXNzaWdubWVudCBmb3IgYmV0dGVyIGRlYnVnZ2luZywgYnV0IHdlIGRvbid0CisgICAgLy8gd2FudCB0byByZXF1aXJlIGEgdmlydHVhbCBpbnRlcmZhY2Ugb24gdGhpcyBWSC4gSW5zdGVhZCB3ZSBhbGxvdyBSQVVXIHRvCisgICAgLy8gcmVwbGFjZSB0aGlzIHZhbHVlIHdpdGggYSB2YWx1ZSBvZiBhbiBpbnZhbGlkIHR5cGUsIGFuZCBjaGVjayBpdCBoZXJlLgorICAgIGFzc2VydChpc2E8VmFsdWVUeT4oSW5uZXJIYW5kbGUpICYmCisgICAgICAgICAgICJUcmFja2VkIFZhbHVlIHdhcyByZXBsYWNlZCBieSBvbmUgd2l0aCBhbiBpbnZhbGlkIHR5cGUhIik7CisgICAgcmV0dXJuIGNhc3Q8VmFsdWVUeT4oSW5uZXJIYW5kbGUpOworICB9CisKKyAgdm9pZCBzZXRWYWxQdHIoVmFsdWVUeSAqUCkgeworICAgIC8vIEFzc2lnbmluZyB0byBub24tdmFsaWQgVHJhY2tpbmdWSCdzIGFyZSBmaW5lIHNvIHdlIGp1c3QgdW5jb25kaXRpb25hbGx5CisgICAgLy8gYXNzaWduIGhlcmUuCisgICAgSW5uZXJIYW5kbGUgPSBHZXRBc1ZhbHVlKFApOworICB9CisKKyAgLy8gQ29udmVydCBhIFZhbHVlVHkqLCB3aGljaCBtYXkgYmUgY29uc3QsIHRvIHRoZSB0eXBlIHRoZSBiYXNlCisgIC8vIGNsYXNzIGV4cGVjdHMuCisgIHN0YXRpYyBWYWx1ZSAqR2V0QXNWYWx1ZShWYWx1ZSAqVikgeyByZXR1cm4gVjsgfQorICBzdGF0aWMgVmFsdWUgKkdldEFzVmFsdWUoY29uc3QgVmFsdWUgKlYpIHsgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFsdWUqPihWKTsgfQorCitwdWJsaWM6CisgIFRyYWNraW5nVkgoKSA9IGRlZmF1bHQ7CisgIFRyYWNraW5nVkgoVmFsdWVUeSAqUCkgeyBzZXRWYWxQdHIoUCk7IH0KKworICBvcGVyYXRvciBWYWx1ZVR5KigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmFsUHRyKCk7CisgIH0KKworICBWYWx1ZVR5ICpvcGVyYXRvcj0oVmFsdWVUeSAqUkhTKSB7CisgICAgc2V0VmFsUHRyKFJIUyk7CisgICAgcmV0dXJuIGdldFZhbFB0cigpOworICB9CisKKyAgVmFsdWVUeSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIGdldFZhbFB0cigpOyB9CisgIFZhbHVlVHkgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpnZXRWYWxQdHIoKTsgfQorfTsKKworLy8vIFxicmllZiBWYWx1ZSBoYW5kbGUgd2l0aCBjYWxsYmFja3Mgb24gUkFVVyBhbmQgZGVzdHJ1Y3Rpb24uCisvLy8KKy8vLyBUaGlzIGlzIGEgdmFsdWUgaGFuZGxlIHRoYXQgYWxsb3dzIHN1YmNsYXNzZXMgdG8gZGVmaW5lIGNhbGxiYWNrcyB0aGF0IHJ1bgorLy8vIHdoZW4gdGhlIHVuZGVybHlpbmcgVmFsdWUgaGFzIFJBVVcgY2FsbGVkIG9uIGl0IG9yIGlzIGRlc3Ryb3llZC4gIFRoaXMKKy8vLyBjbGFzcyBjYW4gYmUgdXNlZCBhcyB0aGUga2V5IG9mIGEgbWFwLCBhcyBsb25nIGFzIHRoZSB1c2VyIHRha2VzIGl0IG91dCBvZgorLy8vIHRoZSBtYXAgYmVmb3JlIGNhbGxpbmcgc2V0VmFsUHRyKCkgKHNpbmNlIHRoZSBtYXAgaGFzIHRvIHJlYXJyYW5nZSBpdHNlbGYKKy8vLyB3aGVuIHRoZSBwb2ludGVyIGNoYW5nZXMpLiAgVW5saWtlIFZhbHVlSGFuZGxlQmFzZSwgdGhpcyBjbGFzcyBoYXMgYSB2dGFibGUuCitjbGFzcyBDYWxsYmFja1ZIIDogcHVibGljIFZhbHVlSGFuZGxlQmFzZSB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKK3Byb3RlY3RlZDoKKyAgfkNhbGxiYWNrVkgoKSA9IGRlZmF1bHQ7CisgIENhbGxiYWNrVkgoY29uc3QgQ2FsbGJhY2tWSCAmKSA9IGRlZmF1bHQ7CisgIENhbGxiYWNrVkggJm9wZXJhdG9yPShjb25zdCBDYWxsYmFja1ZIICYpID0gZGVmYXVsdDsKKworICB2b2lkIHNldFZhbFB0cihWYWx1ZSAqUCkgeworICAgIFZhbHVlSGFuZGxlQmFzZTo6b3BlcmF0b3I9KFApOworICB9CisKK3B1YmxpYzoKKyAgQ2FsbGJhY2tWSCgpIDogVmFsdWVIYW5kbGVCYXNlKENhbGxiYWNrKSB7fQorICBDYWxsYmFja1ZIKFZhbHVlICpQKSA6IFZhbHVlSGFuZGxlQmFzZShDYWxsYmFjaywgUCkge30KKworICBvcGVyYXRvciBWYWx1ZSooKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFZhbFB0cigpOworICB9CisKKyAgLy8vIFxicmllZiBDYWxsYmFjayBmb3IgVmFsdWUgZGVzdHJ1Y3Rpb24uCisgIC8vLworICAvLy8gQ2FsbGVkIHdoZW4gdGhpcy0+Z2V0VmFsUHRyKCkgaXMgZGVzdHJveWVkLCBpbnNpZGUgflZhbHVlKCksIHNvIHlvdQorICAvLy8gbWF5IGNhbGwgYW55IG5vbi12aXJ0dWFsIFZhbHVlIG1ldGhvZCBvbiBnZXRWYWxQdHIoKSwgYnV0IG5vIHN1YmNsYXNzCisgIC8vLyBtZXRob2RzLiAgSWYgV2Vha1RyYWNraW5nVkggd2VyZSBpbXBsZW1lbnRlZCBhcyBhIENhbGxiYWNrVkgsIGl0IHdvdWxkIHVzZQorICAvLy8gdGhpcworICAvLy8gbWV0aG9kIHRvIGNhbGwgc2V0VmFsUHRyKE5VTEwpLiAgQXNzZXJ0aW5nVkggd291bGQgdXNlIHRoaXMgbWV0aG9kIHRvCisgIC8vLyBjYXVzZSBhbiBhc3NlcnRpb24gZmFpbHVyZS4KKyAgLy8vCisgIC8vLyBBbGwgaW1wbGVtZW50YXRpb25zIG11c3QgcmVtb3ZlIHRoZSByZWZlcmVuY2UgZnJvbSB0aGlzIG9iamVjdCB0byB0aGUKKyAgLy8vIFZhbHVlIHRoYXQncyBiZWluZyBkZXN0cm95ZWQuCisgIHZpcnR1YWwgdm9pZCBkZWxldGVkKCkgeyBzZXRWYWxQdHIobnVsbHB0cik7IH0KKworICAvLy8gXGJyaWVmIENhbGxiYWNrIGZvciBWYWx1ZSBSQVVXLgorICAvLy8KKyAgLy8vIENhbGxlZCB3aGVuIHRoaXMtPmdldFZhbFB0cigpLT5yZXBsYWNlQWxsVXNlc1dpdGgobmV3X3ZhbHVlKSBpcyBjYWxsZWQsCisgIC8vLyBfYmVmb3JlXyBhbnkgb2YgdGhlIHVzZXMgaGF2ZSBhY3R1YWxseSBiZWVuIHJlcGxhY2VkLiAgSWYgV2Vha1RyYWNraW5nVkgKKyAgLy8vIHdlcmUKKyAgLy8vIGltcGxlbWVudGVkIGFzIGEgQ2FsbGJhY2tWSCwgaXQgd291bGQgdXNlIHRoaXMgbWV0aG9kIHRvIGNhbGwKKyAgLy8vIHNldFZhbFB0cihuZXdfdmFsdWUpLiAgQXNzZXJ0aW5nVkggd291bGQgZG8gbm90aGluZyBpbiB0aGlzIG1ldGhvZC4KKyAgdmlydHVhbCB2b2lkIGFsbFVzZXNSZXBsYWNlZFdpdGgoVmFsdWUgKikge30KK307CisKKy8vLyBWYWx1ZSBoYW5kbGUgdGhhdCBwb2lzb25zIGl0c2VsZiBpZiB0aGUgVmFsdWUgaXMgZGVsZXRlZC4KKy8vLworLy8vIFRoaXMgaXMgYSBWYWx1ZSBIYW5kbGUgdGhhdCBwb2ludHMgdG8gYSB2YWx1ZSBhbmQgcG9pc29ucyBpdHNlbGYgaWYgdGhlCisvLy8gdmFsdWUgaXMgZGVzdHJveWVkIHdoaWxlIHRoZSBoYW5kbGUgaXMgc3RpbGwgbGl2ZS4gIFRoaXMgaXMgdmVyeSB1c2VmdWwgZm9yCisvLy8gY2F0Y2hpbmcgZGFuZ2xpbmcgcG9pbnRlciBidWdzIHdoZXJlIGFuIFxjIEFzc2VydGluZ1ZIIGNhbm5vdCBiZSB1c2VkCisvLy8gYmVjYXVzZSB0aGUgZGFuZ2xpbmcgaGFuZGxlIG5lZWRzIHRvIG91dGxpdmUgdGhlIHZhbHVlIHdpdGhvdXQgZXZlciBiZWluZworLy8vIHVzZWQuCisvLy8KKy8vLyBPbmUgcGFydGljdWxhcmx5IHVzZWZ1bCBwbGFjZSB0byB1c2UgdGhpcyBpcyBhcyB0aGUgS2V5IG9mIGEgbWFwLiBEYW5nbGluZworLy8vIHBvaW50ZXIgYnVncyBvZnRlbiBsZWFkIHRvIHJlYWxseSBzdWJ0bGUgYnVncyB0aGF0IG9ubHkgb2NjdXIgaWYgYW5vdGhlcgorLy8vIG9iamVjdCBoYXBwZW5zIHRvIGdldCBhbGxvY2F0ZWQgdG8gdGhlIHNhbWUgYWRkcmVzcyBhcyB0aGUgb2xkIG9uZS4gVXNpbmcKKy8vLyBhIFBvaXNvbmluZ1ZIIGVuc3VyZXMgdGhhdCBhbiBhc3NlcnQgaXMgdHJpZ2dlcmVkIGlmIGxvb2tpbmcgdXAgYSBuZXcgdmFsdWUKKy8vLyBpbiB0aGUgbWFwIGZpbmRzIGEgaGFuZGxlIGZyb20gdGhlIG9sZCB2YWx1ZS4KKy8vLworLy8vIE5vdGUgdGhhdCBhIFBvaXNvbmluZ1ZIIGhhbmRsZSBkb2VzICpub3QqIGZvbGxvdyB2YWx1ZXMgYWNyb3NzIFJBVVcKKy8vLyBvcGVyYXRpb25zLiBUaGlzIG1lYW5zIHRoYXQgUkFVVydzIG5lZWQgdG8gZXhwbGljaXRseSB1cGRhdGUgdGhlCisvLy8gUG9pc29uaW5nVkgncyBhcyBpdCBtb3Zlcy4gVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIGluIG5vbi1hc3NlcnQgbW9kZSB0aGlzCisvLy8gY2xhc3MgdHVybnMgaW50byBhIHRyaXZpYWwgd3JhcHBlciBhcm91bmQgYSBwb2ludGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVHk+CitjbGFzcyBQb2lzb25pbmdWSAorI2lmbmRlZiBOREVCVUcKKyAgICBmaW5hbCA6IHB1YmxpYyBDYWxsYmFja1ZICisjZW5kaWYKK3sKKyAgZnJpZW5kIHN0cnVjdCBEZW5zZU1hcEluZm88UG9pc29uaW5nVkg8VmFsdWVUeT4+OworCisgIC8vIENvbnZlcnQgYSBWYWx1ZVR5Kiwgd2hpY2ggbWF5IGJlIGNvbnN0LCB0byB0aGUgcmF3IFZhbHVlKi4KKyAgc3RhdGljIFZhbHVlICpHZXRBc1ZhbHVlKFZhbHVlICpWKSB7IHJldHVybiBWOyB9CisgIHN0YXRpYyBWYWx1ZSAqR2V0QXNWYWx1ZShjb25zdCBWYWx1ZSAqVikgeyByZXR1cm4gY29uc3RfY2FzdDxWYWx1ZSAqPihWKTsgfQorCisjaWZuZGVmIE5ERUJVRworICAvLy8gQSBmbGFnIHRyYWNraW5nIHdoZXRoZXIgdGhpcyB2YWx1ZSBoYXMgYmVlbiBwb2lzb25lZC4KKyAgLy8vCisgIC8vLyBPbiBkZWxldGUgYW5kIFJBVVcsIHdlIGxlYXZlIHRoZSB2YWx1ZSBwb2ludGVyIGFsb25lIHNvIHRoYXQgYXMgYSByYXcKKyAgLy8vIHBvaW50ZXIgaXQgcHJvZHVjZXMgdGhlIHNhbWUgdmFsdWUgKGFuZCB3ZSBmaXQgaW50byB0aGUgc2FtZSBrZXkgb2YKKyAgLy8vIGEgaGFzaCB0YWJsZSwgZXRjKSwgYnV0IHdlIHBvaXNvbiB0aGUgaGFuZGxlIHNvIHRoYXQgYW55IHRvcC1sZXZlbCB1c2FnZQorICAvLy8gd2lsbCBmYWlsLgorICBib29sIFBvaXNvbmVkID0gZmFsc2U7CisKKyAgVmFsdWUgKmdldFJhd1ZhbFB0cigpIGNvbnN0IHsgcmV0dXJuIFZhbHVlSGFuZGxlQmFzZTo6Z2V0VmFsUHRyKCk7IH0KKyAgdm9pZCBzZXRSYXdWYWxQdHIoVmFsdWUgKlApIHsgVmFsdWVIYW5kbGVCYXNlOjpvcGVyYXRvcj0oUCk7IH0KKworICAvLy8gSGFuZGxlIGRlbGV0aW9uIGJ5IHBvaXNvbmluZyB0aGUgaGFuZGxlLgorICB2b2lkIGRlbGV0ZWQoKSBvdmVycmlkZSB7CisgICAgYXNzZXJ0KCFQb2lzb25lZCAmJiAiVHJpZWQgdG8gZGVsZXRlIGFuIGFscmVhZHkgcG9pc29uZWQgaGFuZGxlISIpOworICAgIFBvaXNvbmVkID0gdHJ1ZTsKKyAgICBSZW1vdmVGcm9tVXNlTGlzdCgpOworICB9CisKKyAgLy8vIEhhbmRsZSBSQVVXIGJ5IHBvaXNvbmluZyB0aGUgaGFuZGxlLgorICB2b2lkIGFsbFVzZXNSZXBsYWNlZFdpdGgoVmFsdWUgKikgb3ZlcnJpZGUgeworICAgIGFzc2VydCghUG9pc29uZWQgJiYgIlRyaWVkIHRvIFJBVVcgYW4gYWxyZWFkeSBwb2lzb25lZCBoYW5kbGUhIik7CisgICAgUG9pc29uZWQgPSB0cnVlOworICAgIFJlbW92ZUZyb21Vc2VMaXN0KCk7CisgIH0KKyNlbHNlIC8vIE5ERUJVRworICBWYWx1ZSAqVGhlUHRyID0gbnVsbHB0cjsKKworICBWYWx1ZSAqZ2V0UmF3VmFsUHRyKCkgY29uc3QgeyByZXR1cm4gVGhlUHRyOyB9CisgIHZvaWQgc2V0UmF3VmFsUHRyKFZhbHVlICpQKSB7IFRoZVB0ciA9IFA7IH0KKyNlbmRpZgorCisgIFZhbHVlVHkgKmdldFZhbFB0cigpIGNvbnN0IHsKKyAgICBhc3NlcnQoIVBvaXNvbmVkICYmICJBY2Nlc3NlZCBhIHBvaXNvbmVkIHZhbHVlIGhhbmRsZSEiKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VmFsdWVUeSAqPihnZXRSYXdWYWxQdHIoKSk7CisgIH0KKyAgdm9pZCBzZXRWYWxQdHIoVmFsdWVUeSAqUCkgeyBzZXRSYXdWYWxQdHIoR2V0QXNWYWx1ZShQKSk7IH0KKworcHVibGljOgorICBQb2lzb25pbmdWSCgpID0gZGVmYXVsdDsKKyNpZm5kZWYgTkRFQlVHCisgIFBvaXNvbmluZ1ZIKFZhbHVlVHkgKlApIDogQ2FsbGJhY2tWSChHZXRBc1ZhbHVlKFApKSB7fQorICBQb2lzb25pbmdWSChjb25zdCBQb2lzb25pbmdWSCAmUkhTKQorICAgICAgOiBDYWxsYmFja1ZIKFJIUyksIFBvaXNvbmVkKFJIUy5Qb2lzb25lZCkge30KKworICB+UG9pc29uaW5nVkgoKSB7CisgICAgaWYgKFBvaXNvbmVkKQorICAgICAgY2xlYXJWYWxQdHIoKTsKKyAgfQorCisgIFBvaXNvbmluZ1ZIICZvcGVyYXRvcj0oY29uc3QgUG9pc29uaW5nVkggJlJIUykgeworICAgIGlmIChQb2lzb25lZCkKKyAgICAgIGNsZWFyVmFsUHRyKCk7CisgICAgQ2FsbGJhY2tWSDo6b3BlcmF0b3I9KFJIUyk7CisgICAgUG9pc29uZWQgPSBSSFMuUG9pc29uZWQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisjZWxzZQorICBQb2lzb25pbmdWSChWYWx1ZVR5ICpQKSA6IFRoZVB0cihHZXRBc1ZhbHVlKFApKSB7fQorI2VuZGlmCisKKyAgb3BlcmF0b3IgVmFsdWVUeSAqKCkgY29uc3QgeyByZXR1cm4gZ2V0VmFsUHRyKCk7IH0KKworICBWYWx1ZVR5ICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gZ2V0VmFsUHRyKCk7IH0KKyAgVmFsdWVUeSAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKmdldFZhbFB0cigpOyB9Cit9OworCisvLyBTcGVjaWFsaXplIERlbnNlTWFwSW5mbyB0byBhbGxvdyBQb2lzb25pbmdWSCB0byBwYXJ0aWNpcGF0ZSBpbiBEZW5zZU1hcC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPFBvaXNvbmluZ1ZIPFQ+PiB7CisgIHN0YXRpYyBpbmxpbmUgUG9pc29uaW5nVkg8VD4gZ2V0RW1wdHlLZXkoKSB7CisgICAgUG9pc29uaW5nVkg8VD4gUmVzOworICAgIFJlcy5zZXRSYXdWYWxQdHIoRGVuc2VNYXBJbmZvPFZhbHVlICo+OjpnZXRFbXB0eUtleSgpKTsKKyAgICByZXR1cm4gUmVzOworICB9CisKKyAgc3RhdGljIGlubGluZSBQb2lzb25pbmdWSDxUPiBnZXRUb21ic3RvbmVLZXkoKSB7CisgICAgUG9pc29uaW5nVkg8VD4gUmVzOworICAgIFJlcy5zZXRSYXdWYWxQdHIoRGVuc2VNYXBJbmZvPFZhbHVlICo+OjpnZXRUb21ic3RvbmVLZXkoKSk7CisgICAgcmV0dXJuIFJlczsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgUG9pc29uaW5nVkg8VD4gJlZhbCkgeworICAgIHJldHVybiBEZW5zZU1hcEluZm88VmFsdWUgKj46OmdldEhhc2hWYWx1ZShWYWwuZ2V0UmF3VmFsUHRyKCkpOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBQb2lzb25pbmdWSDxUPiAmTEhTLCBjb25zdCBQb2lzb25pbmdWSDxUPiAmUkhTKSB7CisgICAgcmV0dXJuIERlbnNlTWFwSW5mbzxWYWx1ZSAqPjo6aXNFcXVhbChMSFMuZ2V0UmF3VmFsUHRyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSSFMuZ2V0UmF3VmFsUHRyKCkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGlzUG9kTGlrZTxQb2lzb25pbmdWSDxUPj4geworI2lmZGVmIE5ERUJVRworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7CisjZWxzZQorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOworI2VuZGlmCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9WQUxVRUhBTkRMRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1ZhbHVlTWFwLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1ZhbHVlTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTFkNTgyMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVmFsdWVNYXAuaApAQCAtMCwwICsxLDQzNCBAQAorLy89PT0tIFZhbHVlTWFwLmggLSBTYWZlIG1hcCBmcm9tIFZhbHVlcyB0byBkYXRhIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgVmFsdWVNYXAgY2xhc3MuICBWYWx1ZU1hcCBtYXBzIFZhbHVlKiBvciBhbnkgc3ViY2xhc3MKKy8vIHRvIGFuIGFyYml0cmFyeSBvdGhlciB0eXBlLiAgSXQgcHJvdmlkZXMgdGhlIERlbnNlTWFwIGludGVyZmFjZSBidXQgdXBkYXRlcworLy8gaXRzZWxmIHRvIHJlbWFpbiBzYWZlIHdoZW4ga2V5cyBhcmUgUkFVV2VkIG9yIGRlbGV0ZWQuICBCeSBkZWZhdWx0LCB3aGVuIGEKKy8vIGtleSBpcyBSQVVXZWQgZnJvbSBWMSB0byBWMiwgdGhlIG9sZCBtYXBwaW5nIFYxLT50YXJnZXQgaXMgcmVtb3ZlZCwgYW5kIGEgbmV3CisvLyBtYXBwaW5nIFYyLT50YXJnZXQgaXMgYWRkZWQuICBJZiBWMiBhbHJlYWR5IGV4aXN0ZWQsIGl0cyBvbGQgdGFyZ2V0IGlzCisvLyBvdmVyd3JpdHRlbi4gIFdoZW4gYSBrZXkgaXMgZGVsZXRlZCwgaXRzIG1hcHBpbmcgaXMgcmVtb3ZlZC4KKy8vCisvLyBZb3UgY2FuIG92ZXJyaWRlIGEgVmFsdWVNYXAncyBDb25maWcgcGFyYW1ldGVyIHRvIGNvbnRyb2wgZXhhY3RseSB3aGF0CisvLyBoYXBwZW5zIG9uIFJBVVcgYW5kIGRlc3RydWN0aW9uIGFuZCB0byBnZXQgY2FsbGVkIGJhY2sgb24gZWFjaCBldmVudC4gIEl0J3MKKy8vIGxlZ2FsIHRvIGNhbGwgYmFjayBpbnRvIHRoZSBWYWx1ZU1hcCBmcm9tIGEgQ29uZmlnJ3MgY2FsbGJhY2tzLiAgQ29uZmlnCisvLyBwYXJhbWV0ZXJzIHNob3VsZCBpbmhlcml0IGZyb20gVmFsdWVNYXBDb25maWc8S2V5VD4gdG8gZ2V0IGRlZmF1bHQKKy8vIGltcGxlbWVudGF0aW9ucyBvZiBhbGwgdGhlIG1ldGhvZHMgVmFsdWVNYXAgdXNlcy4gIFNlZSBWYWx1ZU1hcENvbmZpZyBmb3IKKy8vIGRvY3VtZW50YXRpb24gb2YgdGhlIGZ1bmN0aW9ucyB5b3UgY2FuIG92ZXJyaWRlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JUl9WQUxVRU1BUF9ICisjZGVmaW5lIExMVk1fSVJfVkFMVUVNQVBfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ob25lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1RyYWNraW5nTURSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlSGFuZGxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTXV0ZXguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVW5pcXVlTG9jay5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWx1ZVQsIHR5cGVuYW1lIENvbmZpZz4KK2NsYXNzIFZhbHVlTWFwQ2FsbGJhY2tWSDsKK3RlbXBsYXRlPHR5cGVuYW1lIERlbnNlTWFwVCwgdHlwZW5hbWUgS2V5VD4KK2NsYXNzIFZhbHVlTWFwSXRlcmF0b3I7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBEZW5zZU1hcFQsIHR5cGVuYW1lIEtleVQ+CitjbGFzcyBWYWx1ZU1hcENvbnN0SXRlcmF0b3I7CisKKy8vLyBUaGlzIGNsYXNzIGRlZmluZXMgdGhlIGRlZmF1bHQgYmVoYXZpb3IgZm9yIGNvbmZpZ3VyYWJsZSBhc3BlY3RzIG9mCisvLy8gVmFsdWVNYXA8Pi4gIFVzZXIgQ29uZmlncyBzaG91bGQgaW5oZXJpdCBmcm9tIHRoaXMgY2xhc3MgdG8gYmUgYXMgY29tcGF0aWJsZQorLy8vIGFzIHBvc3NpYmxlIHdpdGggZnV0dXJlIHZlcnNpb25zIG9mIFZhbHVlTWFwLgordGVtcGxhdGU8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgTXV0ZXhUID0gc3lzOjpNdXRleD4KK3N0cnVjdCBWYWx1ZU1hcENvbmZpZyB7CisgIHVzaW5nIG11dGV4X3R5cGUgPSBNdXRleFQ7CisKKyAgLy8vIElmIEZvbGxvd1JBVVcgaXMgdHJ1ZSwgdGhlIFZhbHVlTWFwIHdpbGwgdXBkYXRlIG1hcHBpbmdzIG9uIFJBVVcuIElmIGl0J3MKKyAgLy8vIGZhbHNlLCB0aGUgVmFsdWVNYXAgd2lsbCBsZWF2ZSB0aGUgb3JpZ2luYWwgbWFwcGluZyBpbiBwbGFjZS4KKyAgZW51bSB7IEZvbGxvd1JBVVcgPSB0cnVlIH07CisKKyAgLy8gQWxsIG1ldGhvZHMgd2lsbCBiZSBjYWxsZWQgd2l0aCBhIGZpcnN0IGFyZ3VtZW50IG9mIHR5cGUgRXh0cmFEYXRhLiAgVGhlCisgIC8vIGRlZmF1bHQgaW1wbGVtZW50YXRpb25zIGluIHRoaXMgY2xhc3MgdGFrZSBhIHRlbXBsYXRlZCBmaXJzdCBhcmd1bWVudCBzbworICAvLyB0aGF0IHVzZXJzJyBzdWJjbGFzc2VzIGNhbiB1c2UgYW55IHR5cGUgdGhleSB3YW50IHdpdGhvdXQgaGF2aW5nIHRvCisgIC8vIG92ZXJyaWRlIGFsbCB0aGUgZGVmYXVsdHMuCisgIHN0cnVjdCBFeHRyYURhdGEge307CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgRXh0cmFEYXRhVD4KKyAgc3RhdGljIHZvaWQgb25SQVVXKGNvbnN0IEV4dHJhRGF0YVQgJiAvKkRhdGEqLywgS2V5VCAvKk9sZCovLCBLZXlUIC8qTmV3Ki8pIHt9CisgIHRlbXBsYXRlPHR5cGVuYW1lIEV4dHJhRGF0YVQ+CisgIHN0YXRpYyB2b2lkIG9uRGVsZXRlKGNvbnN0IEV4dHJhRGF0YVQgJi8qRGF0YSovLCBLZXlUIC8qT2xkKi8pIHt9CisKKyAgLy8vIFJldHVybnMgYSBtdXRleCB0aGF0IHNob3VsZCBiZSBhY3F1aXJlZCBhcm91bmQgYW55IGNoYW5nZXMgdG8gdGhlIG1hcC4KKyAgLy8vIFRoaXMgaXMgb25seSBhY3F1aXJlZCBmcm9tIHRoZSBDYWxsYmFja1ZIIChhbmQgaGVsZCBhcm91bmQgY2FsbHMgdG8gb25SQVVXCisgIC8vLyBhbmQgb25EZWxldGUpIGFuZCBub3QgaW5zaWRlIG90aGVyIFZhbHVlTWFwIG1ldGhvZHMuICBOVUxMIG1lYW5zIHRoYXQgbm8KKyAgLy8vIG11dGV4IGlzIG5lY2Vzc2FyeS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRXh0cmFEYXRhVD4KKyAgc3RhdGljIG11dGV4X3R5cGUgKmdldE11dGV4KGNvbnN0IEV4dHJhRGF0YVQgJi8qRGF0YSovKSB7IHJldHVybiBudWxscHRyOyB9Cit9OworCisvLy8gU2VlIHRoZSBmaWxlIGNvbW1lbnQuCit0ZW1wbGF0ZTx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWx1ZVQsIHR5cGVuYW1lIENvbmZpZyA9VmFsdWVNYXBDb25maWc8S2V5VD4+CitjbGFzcyBWYWx1ZU1hcCB7CisgIGZyaWVuZCBjbGFzcyBWYWx1ZU1hcENhbGxiYWNrVkg8S2V5VCwgVmFsdWVULCBDb25maWc+OworCisgIHVzaW5nIFZhbHVlTWFwQ1ZIID0gVmFsdWVNYXBDYWxsYmFja1ZIPEtleVQsIFZhbHVlVCwgQ29uZmlnPjsKKyAgdXNpbmcgTWFwVCA9IERlbnNlTWFwPFZhbHVlTWFwQ1ZILCBWYWx1ZVQsIERlbnNlTWFwSW5mbzxWYWx1ZU1hcENWSD4+OworICB1c2luZyBNRE1hcFQgPSBEZW5zZU1hcDxjb25zdCBNZXRhZGF0YSAqLCBUcmFja2luZ01EUmVmPjsKKyAgdXNpbmcgRXh0cmFEYXRhID0gdHlwZW5hbWUgQ29uZmlnOjpFeHRyYURhdGE7CisKKyAgTWFwVCBNYXA7CisgIE9wdGlvbmFsPE1ETWFwVD4gTURNYXA7CisgIEV4dHJhRGF0YSBEYXRhOworICBib29sIE1heU1hcE1ldGFkYXRhID0gdHJ1ZTsKKworcHVibGljOgorICB1c2luZyBrZXlfdHlwZSA9IEtleVQ7CisgIHVzaW5nIG1hcHBlZF90eXBlID0gVmFsdWVUOworICB1c2luZyB2YWx1ZV90eXBlID0gc3RkOjpwYWlyPEtleVQsIFZhbHVlVD47CisgIHVzaW5nIHNpemVfdHlwZSA9IHVuc2lnbmVkOworCisgIGV4cGxpY2l0IFZhbHVlTWFwKHVuc2lnbmVkIE51bUluaXRCdWNrZXRzID0gNjQpCisgICAgICA6IE1hcChOdW1Jbml0QnVja2V0cyksIERhdGEoKSB7fQorICBleHBsaWNpdCBWYWx1ZU1hcChjb25zdCBFeHRyYURhdGEgJkRhdGEsIHVuc2lnbmVkIE51bUluaXRCdWNrZXRzID0gNjQpCisgICAgICA6IE1hcChOdW1Jbml0QnVja2V0cyksIERhdGEoRGF0YSkge30KKyAgVmFsdWVNYXAoY29uc3QgVmFsdWVNYXAgJikgPSBkZWxldGU7CisgIFZhbHVlTWFwICZvcGVyYXRvcj0oY29uc3QgVmFsdWVNYXAgJikgPSBkZWxldGU7CisKKyAgYm9vbCBoYXNNRCgpIGNvbnN0IHsgcmV0dXJuIGJvb2woTURNYXApOyB9CisgIE1ETWFwVCAmTUQoKSB7CisgICAgaWYgKCFNRE1hcCkKKyAgICAgIE1ETWFwLmVtcGxhY2UoKTsKKyAgICByZXR1cm4gKk1ETWFwOworICB9CisgIE9wdGlvbmFsPE1ETWFwVD4gJmdldE1ETWFwKCkgeyByZXR1cm4gTURNYXA7IH0KKworICBib29sIG1heU1hcE1ldGFkYXRhKCkgY29uc3QgeyByZXR1cm4gTWF5TWFwTWV0YWRhdGE7IH0KKyAgdm9pZCBlbmFibGVNYXBNZXRhZGF0YSgpIHsgTWF5TWFwTWV0YWRhdGEgPSB0cnVlOyB9CisgIHZvaWQgZGlzYWJsZU1hcE1ldGFkYXRhKCkgeyBNYXlNYXBNZXRhZGF0YSA9IGZhbHNlOyB9CisKKyAgLy8vIEdldCB0aGUgbWFwcGVkIG1ldGFkYXRhLCBpZiBpdCdzIGluIHRoZSBtYXAuCisgIE9wdGlvbmFsPE1ldGFkYXRhICo+IGdldE1hcHBlZE1EKGNvbnN0IE1ldGFkYXRhICpNRCkgY29uc3QgeworICAgIGlmICghTURNYXApCisgICAgICByZXR1cm4gTm9uZTsKKyAgICBhdXRvIFdoZXJlID0gTURNYXAtPmZpbmQoTUQpOworICAgIGlmIChXaGVyZSA9PSBNRE1hcC0+ZW5kKCkpCisgICAgICByZXR1cm4gTm9uZTsKKyAgICByZXR1cm4gV2hlcmUtPnNlY29uZC5nZXQoKTsKKyAgfQorCisgIHVzaW5nIGl0ZXJhdG9yID0gVmFsdWVNYXBJdGVyYXRvcjxNYXBULCBLZXlUPjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBWYWx1ZU1hcENvbnN0SXRlcmF0b3I8TWFwVCwgS2V5VD47CisKKyAgaW5saW5lIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gaXRlcmF0b3IoTWFwLmJlZ2luKCkpOyB9CisgIGlubGluZSBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBpdGVyYXRvcihNYXAuZW5kKCkpOyB9CisgIGlubGluZSBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKE1hcC5iZWdpbigpKTsgfQorICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gY29uc3RfaXRlcmF0b3IoTWFwLmVuZCgpKTsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBNYXAuZW1wdHkoKTsgfQorICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIE1hcC5zaXplKCk7IH0KKworICAvLy8gR3JvdyB0aGUgbWFwIHNvIHRoYXQgaXQgaGFzIGF0IGxlYXN0IFNpemUgYnVja2V0cy4gRG9lcyBub3Qgc2hyaW5rCisgIHZvaWQgcmVzaXplKHNpemVfdCBTaXplKSB7IE1hcC5yZXNpemUoU2l6ZSk7IH0KKworICB2b2lkIGNsZWFyKCkgeworICAgIE1hcC5jbGVhcigpOworICAgIE1ETWFwLnJlc2V0KCk7CisgIH0KKworICAvLy8gUmV0dXJuIDEgaWYgdGhlIHNwZWNpZmllZCBrZXkgaXMgaW4gdGhlIG1hcCwgMCBvdGhlcndpc2UuCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBLZXlUICZWYWwpIGNvbnN0IHsKKyAgICByZXR1cm4gTWFwLmZpbmRfYXMoVmFsKSA9PSBNYXAuZW5kKCkgPyAwIDogMTsKKyAgfQorCisgIGl0ZXJhdG9yIGZpbmQoY29uc3QgS2V5VCAmVmFsKSB7CisgICAgcmV0dXJuIGl0ZXJhdG9yKE1hcC5maW5kX2FzKFZhbCkpOworICB9CisgIGNvbnN0X2l0ZXJhdG9yIGZpbmQoY29uc3QgS2V5VCAmVmFsKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKE1hcC5maW5kX2FzKFZhbCkpOworICB9CisKKyAgLy8vIGxvb2t1cCAtIFJldHVybiB0aGUgZW50cnkgZm9yIHRoZSBzcGVjaWZpZWQga2V5LCBvciBhIGRlZmF1bHQKKyAgLy8vIGNvbnN0cnVjdGVkIHZhbHVlIGlmIG5vIHN1Y2ggZW50cnkgZXhpc3RzLgorICBWYWx1ZVQgbG9va3VwKGNvbnN0IEtleVQgJlZhbCkgY29uc3QgeworICAgIHR5cGVuYW1lIE1hcFQ6OmNvbnN0X2l0ZXJhdG9yIEkgPSBNYXAuZmluZF9hcyhWYWwpOworICAgIHJldHVybiBJICE9IE1hcC5lbmQoKSA/IEktPnNlY29uZCA6IFZhbHVlVCgpOworICB9CisKKyAgLy8gSW5zZXJ0cyBrZXksdmFsdWUgcGFpciBpbnRvIHRoZSBtYXAgaWYgdGhlIGtleSBpc24ndCBhbHJlYWR5IGluIHRoZSBtYXAuCisgIC8vIElmIHRoZSBrZXkgaXMgYWxyZWFkeSBpbiB0aGUgbWFwLCBpdCByZXR1cm5zIGZhbHNlIGFuZCBkb2Vzbid0IHVwZGF0ZSB0aGUKKyAgLy8gdmFsdWUuCisgIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gaW5zZXJ0KGNvbnN0IHN0ZDo6cGFpcjxLZXlULCBWYWx1ZVQ+ICZLVikgeworICAgIGF1dG8gTWFwUmVzdWx0ID0gTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihXcmFwKEtWLmZpcnN0KSwgS1Yuc2Vjb25kKSk7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGl0ZXJhdG9yKE1hcFJlc3VsdC5maXJzdCksIE1hcFJlc3VsdC5zZWNvbmQpOworICB9CisKKyAgc3RkOjpwYWlyPGl0ZXJhdG9yLCBib29sPiBpbnNlcnQoc3RkOjpwYWlyPEtleVQsIFZhbHVlVD4gJiZLVikgeworICAgIGF1dG8gTWFwUmVzdWx0ID0KKyAgICAgICAgTWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihXcmFwKEtWLmZpcnN0KSwgc3RkOjptb3ZlKEtWLnNlY29uZCkpKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaXRlcmF0b3IoTWFwUmVzdWx0LmZpcnN0KSwgTWFwUmVzdWx0LnNlY29uZCk7CisgIH0KKworICAvLy8gaW5zZXJ0IC0gUmFuZ2UgaW5zZXJ0aW9uIG9mIHBhaXJzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJbnB1dEl0PgorICB2b2lkIGluc2VydChJbnB1dEl0IEksIElucHV0SXQgRSkgeworICAgIGZvciAoOyBJICE9IEU7ICsrSSkKKyAgICAgIGluc2VydCgqSSk7CisgIH0KKworICBib29sIGVyYXNlKGNvbnN0IEtleVQgJlZhbCkgeworICAgIHR5cGVuYW1lIE1hcFQ6Oml0ZXJhdG9yIEkgPSBNYXAuZmluZF9hcyhWYWwpOworICAgIGlmIChJID09IE1hcC5lbmQoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIE1hcC5lcmFzZShJKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICB2b2lkIGVyYXNlKGl0ZXJhdG9yIEkpIHsKKyAgICByZXR1cm4gTWFwLmVyYXNlKEkuYmFzZSgpKTsKKyAgfQorCisgIHZhbHVlX3R5cGUmIEZpbmRBbmRDb25zdHJ1Y3QoY29uc3QgS2V5VCAmS2V5KSB7CisgICAgcmV0dXJuIE1hcC5GaW5kQW5kQ29uc3RydWN0KFdyYXAoS2V5KSk7CisgIH0KKworICBWYWx1ZVQgJm9wZXJhdG9yW10oY29uc3QgS2V5VCAmS2V5KSB7CisgICAgcmV0dXJuIE1hcFtXcmFwKEtleSldOworICB9CisKKyAgLy8vIGlzUG9pbnRlckludG9CdWNrZXRzQXJyYXkgLSBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIHBvaW50ZXIgcG9pbnRzCisgIC8vLyBzb21ld2hlcmUgaW50byB0aGUgVmFsdWVNYXAncyBhcnJheSBvZiBidWNrZXRzIChpLmUuIGVpdGhlciB0byBhIGtleSBvcgorICAvLy8gdmFsdWUgaW4gdGhlIFZhbHVlTWFwKS4KKyAgYm9vbCBpc1BvaW50ZXJJbnRvQnVja2V0c0FycmF5KGNvbnN0IHZvaWQgKlB0cikgY29uc3QgeworICAgIHJldHVybiBNYXAuaXNQb2ludGVySW50b0J1Y2tldHNBcnJheShQdHIpOworICB9CisKKyAgLy8vIGdldFBvaW50ZXJJbnRvQnVja2V0c0FycmF5KCkgLSBSZXR1cm4gYW4gb3BhcXVlIHBvaW50ZXIgaW50byB0aGUgYnVja2V0cworICAvLy8gYXJyYXkuICBJbiBjb25qdW5jdGlvbiB3aXRoIHRoZSBwcmV2aW91cyBtZXRob2QsIHRoaXMgY2FuIGJlIHVzZWQgdG8KKyAgLy8vIGRldGVybWluZSB3aGV0aGVyIGFuIGluc2VydGlvbiBjYXVzZWQgdGhlIFZhbHVlTWFwIHRvIHJlYWxsb2NhdGUuCisgIGNvbnN0IHZvaWQgKmdldFBvaW50ZXJJbnRvQnVja2V0c0FycmF5KCkgY29uc3QgeworICAgIHJldHVybiBNYXAuZ2V0UG9pbnRlckludG9CdWNrZXRzQXJyYXkoKTsKKyAgfQorCitwcml2YXRlOgorICAvLyBUYWtlcyBhIGtleSBiZWluZyBsb29rZWQgdXAgaW4gdGhlIG1hcCBhbmQgd3JhcHMgaXQgaW50byBhCisgIC8vIFZhbHVlTWFwQ2FsbGJhY2tWSCwgdGhlIGFjdHVhbCBrZXkgdHlwZSBvZiB0aGUgbWFwLiAgV2UgdXNlIGEgaGVscGVyCisgIC8vIGZ1bmN0aW9uIGJlY2F1c2UgVmFsdWVNYXBDVkggaXMgY29uc3RydWN0ZWQgd2l0aCBhIHNlY29uZCBwYXJhbWV0ZXIuCisgIFZhbHVlTWFwQ1ZIIFdyYXAoS2V5VCBrZXkpIGNvbnN0IHsKKyAgICAvLyBUaGUgb25seSB3YXkgdGhlIHJlc3VsdGluZyBDYWxsYmFja1ZIIGNvdWxkIHRyeSB0byBtb2RpZnkgKnRoaXMgKG1ha2luZworICAgIC8vIHRoZSBjb25zdF9jYXN0IGluY29ycmVjdCkgaXMgaWYgaXQgZ2V0cyBpbnNlcnRlZCBpbnRvIHRoZSBtYXAuICBCdXQgdGhlbgorICAgIC8vIHRoaXMgZnVuY3Rpb24gbXVzdCBoYXZlIGJlZW4gY2FsbGVkIGZyb20gYSBub24tY29uc3QgbWV0aG9kLCBtYWtpbmcgdGhlCisgICAgLy8gY29uc3RfY2FzdCBvay4KKyAgICByZXR1cm4gVmFsdWVNYXBDVkgoa2V5LCBjb25zdF9jYXN0PFZhbHVlTWFwKj4odGhpcykpOworICB9Cit9OworCisvLyBUaGlzIENhbGxiYWNrVkggdXBkYXRlcyBpdHMgVmFsdWVNYXAgd2hlbiB0aGUgY29udGFpbmVkIFZhbHVlIGNoYW5nZXMsCisvLyBhY2NvcmRpbmcgdG8gdGhlIHVzZXIncyBwcmVmZXJlbmNlcyBleHByZXNzZWQgdGhyb3VnaCB0aGUgQ29uZmlnIG9iamVjdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULCB0eXBlbmFtZSBWYWx1ZVQsIHR5cGVuYW1lIENvbmZpZz4KK2NsYXNzIFZhbHVlTWFwQ2FsbGJhY2tWSCBmaW5hbCA6IHB1YmxpYyBDYWxsYmFja1ZIIHsKKyAgZnJpZW5kIGNsYXNzIFZhbHVlTWFwPEtleVQsIFZhbHVlVCwgQ29uZmlnPjsKKyAgZnJpZW5kIHN0cnVjdCBEZW5zZU1hcEluZm88VmFsdWVNYXBDYWxsYmFja1ZIPjsKKworICB1c2luZyBWYWx1ZU1hcFQgPSBWYWx1ZU1hcDxLZXlULCBWYWx1ZVQsIENvbmZpZz47CisgIHVzaW5nIEtleVNhbnNQb2ludGVyVCA9IHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3BvaW50ZXI8S2V5VD46OnR5cGU7CisKKyAgVmFsdWVNYXBUICpNYXA7CisKKyAgVmFsdWVNYXBDYWxsYmFja1ZIKEtleVQgS2V5LCBWYWx1ZU1hcFQgKk1hcCkKKyAgICAgIDogQ2FsbGJhY2tWSChjb25zdF9jYXN0PFZhbHVlKj4oc3RhdGljX2Nhc3Q8Y29uc3QgVmFsdWUqPihLZXkpKSksCisgICAgICAgIE1hcChNYXApIHt9CisKKyAgLy8gUHJpdmF0ZSBjb25zdHJ1Y3RvciB1c2VkIHRvIGNyZWF0ZSBlbXB0eS90b21ic3RvbmUgRGVuc2VNYXAga2V5cy4KKyAgVmFsdWVNYXBDYWxsYmFja1ZIKFZhbHVlICpWKSA6IENhbGxiYWNrVkgoViksIE1hcChudWxscHRyKSB7fQorCitwdWJsaWM6CisgIEtleVQgVW53cmFwKCkgY29uc3QgeyByZXR1cm4gY2FzdF9vcl9udWxsPEtleVNhbnNQb2ludGVyVD4oZ2V0VmFsUHRyKCkpOyB9CisKKyAgdm9pZCBkZWxldGVkKCkgb3ZlcnJpZGUgeworICAgIC8vIE1ha2UgYSBjb3B5IHRoYXQgd29uJ3QgZ2V0IGNoYW5nZWQgZXZlbiB3aGVuICp0aGlzIGlzIGRlc3Ryb3llZC4KKyAgICBWYWx1ZU1hcENhbGxiYWNrVkggQ29weSgqdGhpcyk7CisgICAgdHlwZW5hbWUgQ29uZmlnOjptdXRleF90eXBlICpNID0gQ29uZmlnOjpnZXRNdXRleChDb3B5Lk1hcC0+RGF0YSk7CisgICAgdW5pcXVlX2xvY2s8dHlwZW5hbWUgQ29uZmlnOjptdXRleF90eXBlPiBHdWFyZDsKKyAgICBpZiAoTSkKKyAgICAgIEd1YXJkID0gdW5pcXVlX2xvY2s8dHlwZW5hbWUgQ29uZmlnOjptdXRleF90eXBlPigqTSk7CisgICAgQ29uZmlnOjpvbkRlbGV0ZShDb3B5Lk1hcC0+RGF0YSwgQ29weS5VbndyYXAoKSk7ICAvLyBNYXkgZGVzdHJveSAqdGhpcy4KKyAgICBDb3B5Lk1hcC0+TWFwLmVyYXNlKENvcHkpOyAgLy8gRGVmaW5pdGVseSBkZXN0cm95cyAqdGhpcy4KKyAgfQorCisgIHZvaWQgYWxsVXNlc1JlcGxhY2VkV2l0aChWYWx1ZSAqbmV3X2tleSkgb3ZlcnJpZGUgeworICAgIGFzc2VydChpc2E8S2V5U2Fuc1BvaW50ZXJUPihuZXdfa2V5KSAmJgorICAgICAgICAgICAiSW52YWxpZCBSQVVXIG9uIGtleSBvZiBWYWx1ZU1hcDw+Iik7CisgICAgLy8gTWFrZSBhIGNvcHkgdGhhdCB3b24ndCBnZXQgY2hhbmdlZCBldmVuIHdoZW4gKnRoaXMgaXMgZGVzdHJveWVkLgorICAgIFZhbHVlTWFwQ2FsbGJhY2tWSCBDb3B5KCp0aGlzKTsKKyAgICB0eXBlbmFtZSBDb25maWc6Om11dGV4X3R5cGUgKk0gPSBDb25maWc6OmdldE11dGV4KENvcHkuTWFwLT5EYXRhKTsKKyAgICB1bmlxdWVfbG9jazx0eXBlbmFtZSBDb25maWc6Om11dGV4X3R5cGU+IEd1YXJkOworICAgIGlmIChNKQorICAgICAgR3VhcmQgPSB1bmlxdWVfbG9jazx0eXBlbmFtZSBDb25maWc6Om11dGV4X3R5cGU+KCpNKTsKKworICAgIEtleVQgdHlwZWRfbmV3X2tleSA9IGNhc3Q8S2V5U2Fuc1BvaW50ZXJUPihuZXdfa2V5KTsKKyAgICAvLyBDYW4gZGVzdHJveSAqdGhpczoKKyAgICBDb25maWc6Om9uUkFVVyhDb3B5Lk1hcC0+RGF0YSwgQ29weS5VbndyYXAoKSwgdHlwZWRfbmV3X2tleSk7CisgICAgaWYgKENvbmZpZzo6Rm9sbG93UkFVVykgeworICAgICAgdHlwZW5hbWUgVmFsdWVNYXBUOjpNYXBUOjppdGVyYXRvciBJID0gQ29weS5NYXAtPk1hcC5maW5kKENvcHkpOworICAgICAgLy8gSSBjb3VsZCA9PSBDb3B5Lk1hcC0+TWFwLmVuZCgpIGlmIHRoZSBvblJBVVcgY2FsbGJhY2sgYWxyZWFkeQorICAgICAgLy8gcmVtb3ZlZCB0aGUgb2xkIG1hcHBpbmcuCisgICAgICBpZiAoSSAhPSBDb3B5Lk1hcC0+TWFwLmVuZCgpKSB7CisgICAgICAgIFZhbHVlVCBUYXJnZXQoc3RkOjptb3ZlKEktPnNlY29uZCkpOworICAgICAgICBDb3B5Lk1hcC0+TWFwLmVyYXNlKEkpOyAgLy8gRGVmaW5pdGVseSBkZXN0cm95cyAqdGhpcy4KKyAgICAgICAgQ29weS5NYXAtPmluc2VydChzdGQ6Om1ha2VfcGFpcih0eXBlZF9uZXdfa2V5LCBzdGQ6Om1vdmUoVGFyZ2V0KSkpOworICAgICAgfQorICAgIH0KKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgS2V5VCwgdHlwZW5hbWUgVmFsdWVULCB0eXBlbmFtZSBDb25maWc+CitzdHJ1Y3QgRGVuc2VNYXBJbmZvPFZhbHVlTWFwQ2FsbGJhY2tWSDxLZXlULCBWYWx1ZVQsIENvbmZpZz4+IHsKKyAgdXNpbmcgVkggPSBWYWx1ZU1hcENhbGxiYWNrVkg8S2V5VCwgVmFsdWVULCBDb25maWc+OworCisgIHN0YXRpYyBpbmxpbmUgVkggZ2V0RW1wdHlLZXkoKSB7CisgICAgcmV0dXJuIFZIKERlbnNlTWFwSW5mbzxWYWx1ZSAqPjo6Z2V0RW1wdHlLZXkoKSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIFZIIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gVkgoRGVuc2VNYXBJbmZvPFZhbHVlICo+OjpnZXRUb21ic3RvbmVLZXkoKSk7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IFZIICZWYWwpIHsKKyAgICByZXR1cm4gRGVuc2VNYXBJbmZvPEtleVQ+OjpnZXRIYXNoVmFsdWUoVmFsLlVud3JhcCgpKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgS2V5VCAmVmFsKSB7CisgICAgcmV0dXJuIERlbnNlTWFwSW5mbzxLZXlUPjo6Z2V0SGFzaFZhbHVlKFZhbCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IFZIICZMSFMsIGNvbnN0IFZIICZSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgS2V5VCAmTEhTLCBjb25zdCBWSCAmUkhTKSB7CisgICAgcmV0dXJuIExIUyA9PSBSSFMuZ2V0VmFsUHRyKCk7CisgIH0KK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIERlbnNlTWFwVCwgdHlwZW5hbWUgS2V5VD4KK2NsYXNzIFZhbHVlTWFwSXRlcmF0b3IgOgorICAgIHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpwYWlyPEtleVQsIHR5cGVuYW1lIERlbnNlTWFwVDo6bWFwcGVkX3R5cGU+LAorICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdD4geworICB1c2luZyBCYXNlVCA9IHR5cGVuYW1lIERlbnNlTWFwVDo6aXRlcmF0b3I7CisgIHVzaW5nIFZhbHVlVCA9IHR5cGVuYW1lIERlbnNlTWFwVDo6bWFwcGVkX3R5cGU7CisKKyAgQmFzZVQgSTsKKworcHVibGljOgorICBWYWx1ZU1hcEl0ZXJhdG9yKCkgOiBJKCkge30KKyAgVmFsdWVNYXBJdGVyYXRvcihCYXNlVCBJKSA6IEkoSSkge30KKworICBCYXNlVCBiYXNlKCkgY29uc3QgeyByZXR1cm4gSTsgfQorCisgIHN0cnVjdCBWYWx1ZVR5cGVQcm94eSB7CisgICAgY29uc3QgS2V5VCBmaXJzdDsKKyAgICBWYWx1ZVQmIHNlY29uZDsKKworICAgIFZhbHVlVHlwZVByb3h5ICpvcGVyYXRvci0+KCkgeyByZXR1cm4gdGhpczsgfQorCisgICAgb3BlcmF0b3Igc3RkOjpwYWlyPEtleVQsIFZhbHVlVD4oKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZmlyc3QsIHNlY29uZCk7CisgICAgfQorICB9OworCisgIFZhbHVlVHlwZVByb3h5IG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICBWYWx1ZVR5cGVQcm94eSBSZXN1bHQgPSB7SS0+Zmlyc3QuVW53cmFwKCksIEktPnNlY29uZH07CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIFZhbHVlVHlwZVByb3h5IG9wZXJhdG9yLT4oKSBjb25zdCB7CisgICAgcmV0dXJuIG9wZXJhdG9yKigpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZhbHVlTWFwSXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiBJID09IFJIUy5JOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBWYWx1ZU1hcEl0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gSSAhPSBSSFMuSTsKKyAgfQorCisgIGlubGluZSBWYWx1ZU1hcEl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyAgLy8gUHJlaW5jcmVtZW50CisgICAgKytJOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBWYWx1ZU1hcEl0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7ICAvLyBQb3N0aW5jcmVtZW50CisgICAgVmFsdWVNYXBJdGVyYXRvciB0bXAgPSAqdGhpczsgKysqdGhpczsgcmV0dXJuIHRtcDsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgRGVuc2VNYXBULCB0eXBlbmFtZSBLZXlUPgorY2xhc3MgVmFsdWVNYXBDb25zdEl0ZXJhdG9yIDoKKyAgICBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxLZXlULCB0eXBlbmFtZSBEZW5zZU1hcFQ6Om1hcHBlZF90eXBlPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Q+IHsKKyAgdXNpbmcgQmFzZVQgPSB0eXBlbmFtZSBEZW5zZU1hcFQ6OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyBWYWx1ZVQgPSB0eXBlbmFtZSBEZW5zZU1hcFQ6Om1hcHBlZF90eXBlOworCisgIEJhc2VUIEk7CisKK3B1YmxpYzoKKyAgVmFsdWVNYXBDb25zdEl0ZXJhdG9yKCkgOiBJKCkge30KKyAgVmFsdWVNYXBDb25zdEl0ZXJhdG9yKEJhc2VUIEkpIDogSShJKSB7fQorICBWYWx1ZU1hcENvbnN0SXRlcmF0b3IoVmFsdWVNYXBJdGVyYXRvcjxEZW5zZU1hcFQsIEtleVQ+IE90aGVyKQorICAgIDogSShPdGhlci5iYXNlKCkpIHt9CisKKyAgQmFzZVQgYmFzZSgpIGNvbnN0IHsgcmV0dXJuIEk7IH0KKworICBzdHJ1Y3QgVmFsdWVUeXBlUHJveHkgeworICAgIGNvbnN0IEtleVQgZmlyc3Q7CisgICAgY29uc3QgVmFsdWVUJiBzZWNvbmQ7CisgICAgVmFsdWVUeXBlUHJveHkgKm9wZXJhdG9yLT4oKSB7IHJldHVybiB0aGlzOyB9CisgICAgb3BlcmF0b3Igc3RkOjpwYWlyPEtleVQsIFZhbHVlVD4oKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoZmlyc3QsIHNlY29uZCk7CisgICAgfQorICB9OworCisgIFZhbHVlVHlwZVByb3h5IG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICBWYWx1ZVR5cGVQcm94eSBSZXN1bHQgPSB7SS0+Zmlyc3QuVW53cmFwKCksIEktPnNlY29uZH07CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIFZhbHVlVHlwZVByb3h5IG9wZXJhdG9yLT4oKSBjb25zdCB7CisgICAgcmV0dXJuIG9wZXJhdG9yKigpOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZhbHVlTWFwQ29uc3RJdGVyYXRvciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEkgPT0gUkhTLkk7CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFZhbHVlTWFwQ29uc3RJdGVyYXRvciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEkgIT0gUkhTLkk7CisgIH0KKworICBpbmxpbmUgVmFsdWVNYXBDb25zdEl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyAgLy8gUHJlaW5jcmVtZW50CisgICAgKytJOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBWYWx1ZU1hcENvbnN0SXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgIC8vIFBvc3RpbmNyZW1lbnQKKyAgICBWYWx1ZU1hcENvbnN0SXRlcmF0b3IgdG1wID0gKnRoaXM7ICsrKnRoaXM7IHJldHVybiB0bXA7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0lSX1ZBTFVFTUFQX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVmFsdWVTeW1ib2xUYWJsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9JUi9WYWx1ZVN5bWJvbFRhYmxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjZjYmJmYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVmFsdWVTeW1ib2xUYWJsZS5oCkBAIC0wLDAgKzEsMTM5IEBACisvLz09PS0gbGx2bS9WYWx1ZVN5bWJvbFRhYmxlLmggLSBJbXBsZW1lbnQgYSBWYWx1ZSBTeW10YWIgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBuYW1lL1ZhbHVlIHN5bWJvbCB0YWJsZSBmb3IgTExWTS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSVJfVkFMVUVTWU1CT0xUQUJMRV9ICisjZGVmaW5lIExMVk1fSVJfVkFMVUVTWU1CT0xUQUJMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBcmd1bWVudDsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEdsb2JhbEFsaWFzOworY2xhc3MgR2xvYmFsSUZ1bmM7CitjbGFzcyBHbG9iYWxWYXJpYWJsZTsKK2NsYXNzIEluc3RydWN0aW9uOwordGVtcGxhdGUgPHVuc2lnbmVkIEludGVybmFsTGVuPiBjbGFzcyBTbWFsbFN0cmluZzsKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVN1YkNsYXNzPiBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM7CisKKy8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgc3ltYm9sIHRhYmxlIG9mIG5hbWUvdmFsdWUgcGFpcnMuIEl0IGlzIGVzc2VudGlhbGx5CisvLy8gYSBzdGQ6Om1hcDxzdGQ6OnN0cmluZyxWYWx1ZSo+IGJ1dCBoYXMgYSBjb250cm9sbGVkIGludGVyZmFjZSBwcm92aWRlZCBieQorLy8vIExMVk0gYXMgd2VsbCBhcyBlbnN1cmluZyB1bmlxdWVuZXNzIG9mIG5hbWVzLgorLy8vCitjbGFzcyBWYWx1ZVN5bWJvbFRhYmxlIHsKKyAgZnJpZW5kIGNsYXNzIFN5bWJvbFRhYmxlTGlzdFRyYWl0czxBcmd1bWVudD47CisgIGZyaWVuZCBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8QmFzaWNCbG9jaz47CisgIGZyaWVuZCBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8RnVuY3Rpb24+OworICBmcmllbmQgY2xhc3MgU3ltYm9sVGFibGVMaXN0VHJhaXRzPEdsb2JhbEFsaWFzPjsKKyAgZnJpZW5kIGNsYXNzIFN5bWJvbFRhYmxlTGlzdFRyYWl0czxHbG9iYWxJRnVuYz47CisgIGZyaWVuZCBjbGFzcyBTeW1ib2xUYWJsZUxpc3RUcmFpdHM8R2xvYmFsVmFyaWFibGU+OworICBmcmllbmQgY2xhc3MgU3ltYm9sVGFibGVMaXN0VHJhaXRzPEluc3RydWN0aW9uPjsKKyAgZnJpZW5kIGNsYXNzIFZhbHVlOworCisvLy8gQG5hbWUgVHlwZXMKKy8vLyBAeworcHVibGljOgorICAvLy8gQGJyaWVmIEEgbWFwcGluZyBvZiBuYW1lcyB0byB2YWx1ZXMuCisgIHVzaW5nIFZhbHVlTWFwID0gU3RyaW5nTWFwPFZhbHVlKj47CisKKyAgLy8vIEBicmllZiBBbiBpdGVyYXRvciBvdmVyIGEgVmFsdWVNYXAuCisgIHVzaW5nIGl0ZXJhdG9yID0gVmFsdWVNYXA6Oml0ZXJhdG9yOworCisgIC8vLyBAYnJpZWYgQSBjb25zdF9pdGVyYXRvciBvdmVyIGEgVmFsdWVNYXAuCisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gVmFsdWVNYXA6OmNvbnN0X2l0ZXJhdG9yOworCisvLy8gQH0KKy8vLyBAbmFtZSBDb25zdHJ1Y3RvcnMKKy8vLyBAeworCisgIFZhbHVlU3ltYm9sVGFibGUoKSA6IHZtYXAoMCkge30KKyAgflZhbHVlU3ltYm9sVGFibGUoKTsKKworLy8vIEB9CisvLy8gQG5hbWUgQWNjZXNzb3JzCisvLy8gQHsKKworICAvLy8gVGhpcyBtZXRob2QgZmluZHMgdGhlIHZhbHVlIHdpdGggdGhlIGdpdmVuIFxwIE5hbWUgaW4gdGhlCisgIC8vLyB0aGUgc3ltYm9sIHRhYmxlLgorICAvLy8gQHJldHVybnMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgXHAgTmFtZQorICAvLy8gQGJyaWVmIExvb2t1cCBhIG5hbWVkIFZhbHVlLgorICBWYWx1ZSAqbG9va3VwKFN0cmluZ1JlZiBOYW1lKSBjb25zdCB7IHJldHVybiB2bWFwLmxvb2t1cChOYW1lKTsgfQorCisgIC8vLyBAcmV0dXJucyB0cnVlIGlmZiB0aGUgc3ltYm9sIHRhYmxlIGlzIGVtcHR5CisgIC8vLyBAYnJpZWYgRGV0ZXJtaW5lIGlmIHRoZSBzeW1ib2wgdGFibGUgaXMgZW1wdHkKKyAgaW5saW5lIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiB2bWFwLmVtcHR5KCk7IH0KKworICAvLy8gQGJyaWVmIFRoZSBudW1iZXIgb2YgbmFtZS90eXBlIHBhaXJzIGlzIHJldHVybmVkLgorICBpbmxpbmUgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHVuc2lnbmVkKHZtYXAuc2l6ZSgpKTsgfQorCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIGZyb20gdGhlIGRlYnVnZ2VyIHRvIGRpc3BsYXkgdGhlCisgIC8vLyBjb250ZW50IG9mIHRoZSBzeW1ib2wgdGFibGUgd2hpbGUgZGVidWdnaW5nLgorICAvLy8gQGJyaWVmIFByaW50IG91dCBzeW1ib2wgdGFibGUgb24gc3RkZXJyCisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisvLy8gQH0KKy8vLyBAbmFtZSBJdGVyYXRpb24KKy8vLyBAeworCisgIC8vLyBAYnJpZWYgR2V0IGFuIGl0ZXJhdG9yIHRoYXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzeW1ib2wgdGFibGUuCisgIGlubGluZSBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIHZtYXAuYmVnaW4oKTsgfQorCisgIC8vLyBAYnJpZWYgR2V0IGEgY29uc3RfaXRlcmF0b3IgdGhhdCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN5bWJvbCB0YWJsZS4KKyAgaW5saW5lIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gdm1hcC5iZWdpbigpOyB9CisKKyAgLy8vIEBicmllZiBHZXQgYW4gaXRlcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgc3ltYm9sIHRhYmxlLgorICBpbmxpbmUgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gdm1hcC5lbmQoKTsgfQorCisgIC8vLyBAYnJpZWYgR2V0IGEgY29uc3RfaXRlcmF0b3IgdG8gdGhlIGVuZCBvZiB0aGUgc3ltYm9sIHRhYmxlLgorICBpbmxpbmUgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gdm1hcC5lbmQoKTsgfQorCisgIC8vLyBAfQorICAvLy8gQG5hbWUgTXV0YXRvcnMKKyAgLy8vIEB7Citwcml2YXRlOgorICBWYWx1ZU5hbWUgKm1ha2VVbmlxdWVOYW1lKFZhbHVlICpWLCBTbWFsbFN0cmluZzwyNTY+ICZVbmlxdWVOYW1lKTsKKworICAvLy8gVGhpcyBtZXRob2QgYWRkcyB0aGUgcHJvdmlkZWQgdmFsdWUgXHAgTiB0byB0aGUgc3ltYm9sIHRhYmxlLiAgVGhlIFZhbHVlCisgIC8vLyBtdXN0IGhhdmUgYSBuYW1lIHdoaWNoIGlzIHVzZWQgdG8gcGxhY2UgdGhlIHZhbHVlIGluIHRoZSBzeW1ib2wgdGFibGUuCisgIC8vLyBJZiB0aGUgaW5zZXJ0ZWQgbmFtZSBjb25mbGljdHMsIHRoaXMgcmVuYW1lcyB0aGUgdmFsdWUuCisgIC8vLyBAYnJpZWYgQWRkIGEgbmFtZWQgdmFsdWUgdG8gdGhlIHN5bWJvbCB0YWJsZQorICB2b2lkIHJlaW5zZXJ0VmFsdWUoVmFsdWUgKlYpOworCisgIC8vLyBjcmVhdGVWYWx1ZU5hbWUgLSBUaGlzIG1ldGhvZCBhdHRlbXB0cyB0byBjcmVhdGUgYSB2YWx1ZSBuYW1lIGFuZCBpbnNlcnQKKyAgLy8vIGl0IGludG8gdGhlIHN5bWJvbCB0YWJsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4gIElmIGl0IGNvbmZsaWN0cywgaXQKKyAgLy8vIGF1dG8tcmVuYW1lcyB0aGUgbmFtZSBhbmQgcmV0dXJucyB0aGF0IGluc3RlYWQuCisgIFZhbHVlTmFtZSAqY3JlYXRlVmFsdWVOYW1lKFN0cmluZ1JlZiBOYW1lLCBWYWx1ZSAqVik7CisKKyAgLy8vIFRoaXMgbWV0aG9kIHJlbW92ZXMgYSB2YWx1ZSBmcm9tIHRoZSBzeW1ib2wgdGFibGUuICBJdCBsZWF2ZXMgdGhlCisgIC8vLyBWYWx1ZU5hbWUgYXR0YWNoZWQgdG8gdGhlIHZhbHVlLCBidXQgaXQgaXMgbm8gbG9uZ2VyIGluc2VydGVkIGluIHRoZQorICAvLy8gc3ltdGFiLgorICB2b2lkIHJlbW92ZVZhbHVlTmFtZShWYWx1ZU5hbWUgKlYpOworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgSW50ZXJuYWwgRGF0YQorICAvLy8gQHsKKworICBWYWx1ZU1hcCB2bWFwOyAgICAgICAgICAgICAgICAgICAgLy8vPCBUaGUgbWFwIHRoYXQgaG9sZHMgdGhlIHN5bWJvbCB0YWJsZS4KKyAgbXV0YWJsZSB1aW50MzJfdCBMYXN0VW5pcXVlID0gMDsgIC8vLzwgQ291bnRlciBmb3IgdHJhY2tpbmcgdW5pcXVlIG5hbWVzCisKKy8vLyBAfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fSVJfVkFMVUVTWU1CT0xUQUJMRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1ZlcmlmaWVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSL1ZlcmlmaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmMxMGYzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVIvVmVyaWZpZXIuaApAQCAtMCwwICsxLDE0OSBAQAorLy89PT0tIFZlcmlmaWVyLmggLSBMTFZNIElSIFZlcmlmaWVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZnVuY3Rpb24gdmVyaWZpZXIgaW50ZXJmYWNlLCB0aGF0IGNhbiBiZSB1c2VkIGZvciBzb21lCisvLyBzYW5pdHkgY2hlY2tpbmcgb2YgaW5wdXQgdG8gdGhlIHN5c3RlbSwgYW5kIGZvciBjaGVja2luZyB0aGF0IHRyYW5zZm9ybWF0aW9ucworLy8gaGF2ZW4ndCBkb25lIHNvbWV0aGluZyBiYWQuCisvLworLy8gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgcHJvdmlkZSBmdWxsICdqYXZhIHN0eWxlJyBzZWN1cml0eSBhbmQgdmVyaWZpY2F0aW9ucywKKy8vIGluc3RlYWQgaXQganVzdCB0cmllcyB0byBlbnN1cmUgdGhhdCBjb2RlIGlzIHdlbGwgZm9ybWVkLgorLy8KKy8vIFRvIHNlZSB3aGF0IHNwZWNpZmljYWxseSBpcyBjaGVja2VkLCBsb29rIGF0IHRoZSB0b3Agb2YgVmVyaWZpZXIuY3BwCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSX1ZFUklGSUVSX0gKKyNkZWZpbmUgTExWTV9JUl9WRVJJRklFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFQSW50OworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBGdW5jdGlvblBhc3M7CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIE1ETm9kZTsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIHJhd19vc3RyZWFtOworc3RydWN0IFZlcmlmaWVyU3VwcG9ydDsKKworLy8vIFZlcmlmeSB0aGF0IHRoZSBUQkFBIE1ldGFkYXRhcyBhcmUgdmFsaWQuCitjbGFzcyBUQkFBVmVyaWZpZXIgeworICBWZXJpZmllclN1cHBvcnQgKkRpYWdub3N0aWMgPSBudWxscHRyOworCisgIC8vLyBIZWxwZXIgdG8gZGlhZ25vc2UgYSBmYWlsdXJlCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUeXM+IHZvaWQgQ2hlY2tGYWlsZWQoVHlzICYmLi4uIEFyZ3MpOworCisgIC8vLyBDYWNoZSBvZiBUQkFBIGJhc2Ugbm9kZXMgdGhhdCBoYXZlIGFscmVhZHkgYmVlbiB2aXNpdGVkLiAgVGhpcyBjYWNoY2UgbWFwcworICAvLy8gYSBub2RlIHRoYXQgaGFzIGJlZW4gdmlzaXRlZCB0byBhIHBhaXIgKElzSW52YWxpZCwgQml0V2lkdGgpIHdoZXJlCisgIC8vLworICAvLy8gIFxjIElzSW52YWxpZCBpcyB0cnVlIGlmZiB0aGUgbm9kZSBpcyBpbnZhbGlkLgorICAvLy8gIFxjIEJpdFdpZHRoLCBpZiBub24temVybywgaXMgdGhlIGJpdHdpZHRoIG9mIHRoZSBpbnRlZ2VyIHVzZWQgdG8gZGVub3RpbmcKKyAgLy8vICAgIHRoZSBvZmZzZXQgb2YgdGhlIGFjY2Vzcy4gIElmIHplcm8sIG9ubHkgYSB6ZXJvIG9mZnNldCBpcyBhbGxvd2VkLgorICAvLy8KKyAgLy8vIFxjIEJpdFdpZHRoIGhhcyBubyBtZWFuaW5nIGlmIFxjIElzSW52YWxpZCBpcyB0cnVlLgorICB1c2luZyBUQkFBQmFzZU5vZGVTdW1tYXJ5ID0gc3RkOjpwYWlyPGJvb2wsIHVuc2lnbmVkPjsKKyAgRGVuc2VNYXA8Y29uc3QgTUROb2RlICosIFRCQUFCYXNlTm9kZVN1bW1hcnk+IFRCQUFCYXNlTm9kZXM7CisKKyAgLy8vIE1hcHMgYW4gYWxsZWdlZCBzY2FsYXIgVEJBQSBub2RlIHRvIGEgYm9vbGVhbiB0aGF0IGlzIHRydWUgaWYgdGhlIHNhaWQKKyAgLy8vIFRCQUEgbm9kZSBpcyBhIHZhbGlkIHNjYWxhciBUQkFBIG5vZGUgb3IgZmFsc2Ugb3RoZXJ3aXNlLgorICBEZW5zZU1hcDxjb25zdCBNRE5vZGUgKiwgYm9vbD4gVEJBQVNjYWxhck5vZGVzOworCisgIC8vLyBcbmFtZSBIZWxwZXIgZnVuY3Rpb25zIHVzZWQgYnkgXGMgdmlzaXRUQkFBTWV0YWRhdGEuCisgIC8vLyBAeworICBNRE5vZGUgKmdldEZpZWxkTm9kZUZyb21UQkFBQmFzZU5vZGUoSW5zdHJ1Y3Rpb24gJkksIGNvbnN0IE1ETm9kZSAqQmFzZU5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBUEludCAmT2Zmc2V0LCBib29sIElzTmV3Rm9ybWF0KTsKKyAgVEJBQVZlcmlmaWVyOjpUQkFBQmFzZU5vZGVTdW1tYXJ5IHZlcmlmeVRCQUFCYXNlTm9kZShJbnN0cnVjdGlvbiAmSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNRE5vZGUgKkJhc2VOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNOZXdGb3JtYXQpOworICBUQkFBQmFzZU5vZGVTdW1tYXJ5IHZlcmlmeVRCQUFCYXNlTm9kZUltcGwoSW5zdHJ1Y3Rpb24gJkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNRE5vZGUgKkJhc2VOb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc05ld0Zvcm1hdCk7CisKKyAgYm9vbCBpc1ZhbGlkU2NhbGFyVEJBQU5vZGUoY29uc3QgTUROb2RlICpNRCk7CisgIC8vLyBAfQorCitwdWJsaWM6CisgIFRCQUFWZXJpZmllcihWZXJpZmllclN1cHBvcnQgKkRpYWdub3N0aWMgPSBudWxscHRyKQorICAgICAgOiBEaWFnbm9zdGljKERpYWdub3N0aWMpIHt9CisgIC8vLyBWaXNpdCBhbiBpbnN0cnVjdGlvbiBhbmQgcmV0dXJuIHRydWUgaWYgaXQgaXMgdmFsaWQsIHJldHVybiBmYWxzZSBpZiBhbgorICAvLy8gaW52YWxpZCBUQkFBIGlzIGF0dGFjaGVkLgorICBib29sIHZpc2l0VEJBQU1ldGFkYXRhKEluc3RydWN0aW9uICZJLCBjb25zdCBNRE5vZGUgKk1EKTsKK307CisKKy8vLyBcYnJpZWYgQ2hlY2sgYSBmdW5jdGlvbiBmb3IgZXJyb3JzLCB1c2VmdWwgZm9yIHVzZSB3aGVuIGRlYnVnZ2luZyBhCisvLy8gcGFzcy4KKy8vLworLy8vIElmIHRoZXJlIGFyZSBubyBlcnJvcnMsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLiBJZiBhbiBlcnJvciBpcyBmb3VuZCwKKy8vLyBhIG1lc3NhZ2UgZGVzY3JpYmluZyB0aGUgZXJyb3IgaXMgd3JpdHRlbiB0byBPUyAoaWYgbm9uLW51bGwpIGFuZCB0cnVlIGlzCisvLy8gcmV0dXJuZWQuCitib29sIHZlcmlmeUZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uICZGLCByYXdfb3N0cmVhbSAqT1MgPSBudWxscHRyKTsKKworLy8vIFxicmllZiBDaGVjayBhIG1vZHVsZSBmb3IgZXJyb3JzLgorLy8vCisvLy8gSWYgdGhlcmUgYXJlIG5vIGVycm9ycywgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UuIElmIGFuIGVycm9yIGlzCisvLy8gZm91bmQsIGEgbWVzc2FnZSBkZXNjcmliaW5nIHRoZSBlcnJvciBpcyB3cml0dGVuIHRvIE9TIChpZgorLy8vIG5vbi1udWxsKSBhbmQgdHJ1ZSBpcyByZXR1cm5lZC4KKy8vLworLy8vIFxyZXR1cm4gdHJ1ZSBpZiB0aGUgbW9kdWxlIGlzIGJyb2tlbi4gSWYgQnJva2VuRGVidWdJbmZvIGlzCisvLy8gc3VwcGxpZWQsIERlYnVnSW5mbyB2ZXJpZmljYXRpb24gZmFpbHVyZXMgd29uJ3QgYmUgY29uc2lkZXJlZCBhcworLy8vIGVycm9yIGFuZCBpbnN0ZWFkICpCcm9rZW5EZWJ1Z0luZm8gd2lsbCBiZSBzZXQgdG8gdHJ1ZS4gRGVidWcKKy8vLyBpbmZvIGVycm9ycyBjYW4gYmUgInJlY292ZXJlZCIgZnJvbSBieSBzdHJpcHBpbmcgdGhlIGRlYnVnIGluZm8uCitib29sIHZlcmlmeU1vZHVsZShjb25zdCBNb2R1bGUgJk0sIHJhd19vc3RyZWFtICpPUyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICBib29sICpCcm9rZW5EZWJ1Z0luZm8gPSBudWxscHRyKTsKKworRnVuY3Rpb25QYXNzICpjcmVhdGVWZXJpZmllclBhc3MoYm9vbCBGYXRhbEVycm9ycyA9IHRydWUpOworCisvLy8gQ2hlY2sgYSBtb2R1bGUgZm9yIGVycm9ycywgYW5kIHJlcG9ydCBzZXBhcmF0ZSBlcnJvciBzdGF0ZXMgZm9yIElSCisvLy8gYW5kIGRlYnVnIGluZm8gZXJyb3JzLgorY2xhc3MgVmVyaWZpZXJBbmFseXNpcyA6IHB1YmxpYyBBbmFseXNpc0luZm9NaXhpbjxWZXJpZmllckFuYWx5c2lzPiB7CisgIGZyaWVuZCBBbmFseXNpc0luZm9NaXhpbjxWZXJpZmllckFuYWx5c2lzPjsKKworICBzdGF0aWMgQW5hbHlzaXNLZXkgS2V5OworCitwdWJsaWM6CisgIHN0cnVjdCBSZXN1bHQgeworICAgIGJvb2wgSVJCcm9rZW4sIERlYnVnSW5mb0Jyb2tlbjsKKyAgfTsKKworICBSZXN1bHQgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICYpOworICBSZXN1bHQgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmKTsKK307CisKKy8vLyBDaGVjayBhIG1vZHVsZSBmb3IgZXJyb3JzLCBidXQgcmVwb3J0IGRlYnVnIGluZm8gZXJyb3JzIHNlcGFyYXRlbHkuCisvLy8gT3RoZXJ3aXNlIGJlaGF2ZXMgYXMgdGhlIG5vcm1hbCB2ZXJpZnlNb2R1bGUuIERlYnVnIGluZm8gZXJyb3JzIGNhbiBiZQorLy8vICJyZWNvdmVyZWQiIGZyb20gYnkgc3RyaXBwaW5nIHRoZSBkZWJ1ZyBpbmZvLgorYm9vbCB2ZXJpZnlNb2R1bGUoYm9vbCAmQnJva2VuRGVidWdJbmZvLCBjb25zdCBNb2R1bGUgJk0sIHJhd19vc3RyZWFtICpPUyk7CisKKy8vLyBcYnJpZWYgQ3JlYXRlIGEgdmVyaWZpZXIgcGFzcy4KKy8vLworLy8vIENoZWNrIGEgbW9kdWxlIG9yIGZ1bmN0aW9uIGZvciB2YWxpZGl0eS4gVGhpcyBpcyBlc3NlbnRpYWxseSBhIHBhc3Mgd3JhcHBlZAorLy8vIGFyb3VuZCB0aGUgYWJvdmUgdmVyaWZ5RnVuY3Rpb24gYW5kIHZlcmlmeU1vZHVsZSByb3V0aW5lcyBhbmQKKy8vLyBmdW5jdGlvbmFsaXR5LiBXaGVuIHRoZSBwYXNzIGRldGVjdHMgYSB2ZXJpZmljYXRpb24gZXJyb3IgaXQgaXMgYWx3YXlzCisvLy8gcHJpbnRlZCB0byBzdGRlcnIsIGFuZCBieSBkZWZhdWx0IHRoZXkgYXJlIGZhdGFsLiBZb3UgY2FuIG92ZXJyaWRlIHRoYXQgYnkKKy8vLyBwYXNzaW5nIFxjIGZhbHNlIHRvIFxwIEZhdGFsRXJyb3JzLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgY3JlYXRlcyBhIHBhc3Mgc3VpdGFibGUgZm9yIHRoZSBsZWdhY3kgcGFzcyBtYW5hZ2VyLiBJdCBoYXMKKy8vLyBub3RoaW5nIHRvIGRvIHdpdGggXGMgVmVyaWZpZXJQYXNzLgorY2xhc3MgVmVyaWZpZXJQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48VmVyaWZpZXJQYXNzPiB7CisgIGJvb2wgRmF0YWxFcnJvcnM7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgVmVyaWZpZXJQYXNzKGJvb2wgRmF0YWxFcnJvcnMgPSB0cnVlKSA6IEZhdGFsRXJyb3JzKEZhdGFsRXJyb3JzKSB7fQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JUl9WRVJJRklFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSUmVhZGVyL0lSUmVhZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0lSUmVhZGVyL0lSUmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmVkZGU4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vSVJSZWFkZXIvSVJSZWFkZXIuaApAQCAtMCwwICsxLDYzIEBACisvLz09PS0tLS0gbGx2bS9JUlJlYWRlci9JUlJlYWRlci5oIC0gUmVhZGVyIGZvciBMTFZNIElSIGZpbGVzIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGZ1bmN0aW9ucyBmb3IgcmVhZGluZyBMTFZNIElSLiBUaGV5IHN1cHBvcnQgYm90aAorLy8gQml0Y29kZSBhbmQgQXNzZW1ibHksIGF1dG9tYXRpY2FsbHkgZGV0ZWN0aW5nIHRoZSBpbnB1dCBmb3JtYXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lSUkVBREVSX0lSUkVBREVSX0gKKyNkZWZpbmUgTExWTV9JUlJFQURFUl9JUlJFQURFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgU3RyaW5nUmVmOworY2xhc3MgTWVtb3J5QnVmZmVyUmVmOworY2xhc3MgTW9kdWxlOworY2xhc3MgU01EaWFnbm9zdGljOworY2xhc3MgTExWTUNvbnRleHQ7CisKKy8vLyBJZiB0aGUgZ2l2ZW4gZmlsZSBob2xkcyBhIGJpdGNvZGUgaW1hZ2UsIHJldHVybiBhIE1vZHVsZQorLy8vIGZvciBpdCB3aGljaCBkb2VzIGxhenkgZGVzZXJpYWxpemF0aW9uIG9mIGZ1bmN0aW9uIGJvZGllcy4gIE90aGVyd2lzZSwKKy8vLyBhdHRlbXB0IHRvIHBhcnNlIGl0IGFzIExMVk0gQXNzZW1ibHkgYW5kIHJldHVybiBhIGZ1bGx5IHBvcHVsYXRlZAorLy8vIE1vZHVsZS4gVGhlIFNob3VsZExhenlMb2FkTWV0YWRhdGEgZmxhZyBpcyBwYXNzZWQgZG93biB0byB0aGUgYml0Y29kZQorLy8vIHJlYWRlciB0byBvcHRpb25hbGx5IGVuYWJsZSBsYXp5IG1ldGFkYXRhIGxvYWRpbmcuCitzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPgorZ2V0TGF6eUlSRmlsZU1vZHVsZShTdHJpbmdSZWYgRmlsZW5hbWUsIFNNRGlhZ25vc3RpYyAmRXJyLCBMTFZNQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRMYXp5TG9hZE1ldGFkYXRhID0gZmFsc2UpOworCisvLy8gSWYgdGhlIGdpdmVuIE1lbW9yeUJ1ZmZlciBob2xkcyBhIGJpdGNvZGUgaW1hZ2UsIHJldHVybiBhIE1vZHVsZQorLy8vIGZvciBpdC4gIE90aGVyd2lzZSwgYXR0ZW1wdCB0byBwYXJzZSBpdCBhcyBMTFZNIEFzc2VtYmx5IGFuZCByZXR1cm4KKy8vLyBhIE1vZHVsZSBmb3IgaXQuCisvLy8gXHBhcmFtIFVwZ3JhZGVEZWJ1Z0luZm8gUnVuIFVwZ3JhZGVEZWJ1Z0luZm8sIHdoaWNoIHJ1bnMgdGhlIFZlcmlmaWVyLgorLy8vICAgICAgICAgICAgICAgICAgICAgICAgIFRoaXMgb3B0aW9uIHNob3VsZCBvbmx5IGJlIHNldCB0byBmYWxzZSBieSBsbHZtLWFzCisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgZm9yIHVzZSBpbnNpZGUgdGhlIExMVk0gdGVzdHVpdGUhCisvLy8gXHBhcmFtIERhdGFMYXlvdXRTdHJpbmcgT3ZlcnJpZGUgZGF0YWxheW91dCBpbiB0aGUgbGx2bSBhc3NlbWJseS4KK3N0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IHBhcnNlSVIoTWVtb3J5QnVmZmVyUmVmIEJ1ZmZlciwgU01EaWFnbm9zdGljICZFcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICZDb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVwZ3JhZGVEZWJ1Z0luZm8gPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRGF0YUxheW91dFN0cmluZyA9ICIiKTsKKworLy8vIElmIHRoZSBnaXZlbiBmaWxlIGhvbGRzIGEgYml0Y29kZSBpbWFnZSwgcmV0dXJuIGEgTW9kdWxlIGZvciBpdC4KKy8vLyBPdGhlcndpc2UsIGF0dGVtcHQgdG8gcGFyc2UgaXQgYXMgTExWTSBBc3NlbWJseSBhbmQgcmV0dXJuIGEgTW9kdWxlCisvLy8gZm9yIGl0LgorLy8vIFxwYXJhbSBVcGdyYWRlRGVidWdJbmZvIFJ1biBVcGdyYWRlRGVidWdJbmZvLCB3aGljaCBydW5zIHRoZSBWZXJpZmllci4KKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSBzZXQgdG8gZmFsc2UgYnkgbGx2bS1hcworLy8vICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB1c2UgaW5zaWRlIHRoZSBMTFZNIHRlc3R1aXRlIQorLy8vIFxwYXJhbSBEYXRhTGF5b3V0U3RyaW5nIE92ZXJyaWRlIGRhdGFsYXlvdXQgaW4gdGhlIGxsdm0gYXNzZW1ibHkuCitzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBwYXJzZUlSRmlsZShTdHJpbmdSZWYgRmlsZW5hbWUsIFNNRGlhZ25vc3RpYyAmRXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUNvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVwZ3JhZGVEZWJ1Z0luZm8gPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERhdGFMYXlvdXRTdHJpbmcgPSAiIik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Jbml0aWFsaXplUGFzc2VzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0luaXRpYWxpemVQYXNzZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWE1MTEyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Jbml0aWFsaXplUGFzc2VzLmgKQEAgLTAsMCArMSwzOTUgQEAKKy8vPT09LSBsbHZtL0luaXRpYWxpemVQYXNzZXMuaCAtIEluaXRpYWxpemUgQWxsIFBhc3NlcyAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb25zIGZvciB0aGUgcGFzcyBpbml0aWFsaXphdGlvbiByb3V0aW5lcworLy8gZm9yIHRoZSBlbnRpcmUgTExWTSBwcm9qZWN0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JTklUSUFMSVpFUEFTU0VTX0gKKyNkZWZpbmUgTExWTV9JTklUSUFMSVpFUEFTU0VTX0gKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBQYXNzUmVnaXN0cnk7CisKKy8vLyBJbml0aWFsaXplIGFsbCBwYXNzZXMgbGlua2VkIGludG8gdGhlIFRyYW5zZm9ybVV0aWxzIGxpYnJhcnkuCit2b2lkIGluaXRpYWxpemVDb3JlKFBhc3NSZWdpc3RyeSYpOworCisvLy8gSW5pdGlhbGl6ZSBhbGwgcGFzc2VzIGxpbmtlZCBpbnRvIHRoZSBUcmFuc2Zvcm1VdGlscyBsaWJyYXJ5Lgordm9pZCBpbml0aWFsaXplVHJhbnNmb3JtVXRpbHMoUGFzc1JlZ2lzdHJ5Jik7CisKKy8vLyBJbml0aWFsaXplIGFsbCBwYXNzZXMgbGlua2VkIGludG8gdGhlIFNjYWxhck9wdHMgbGlicmFyeS4KK3ZvaWQgaW5pdGlhbGl6ZVNjYWxhck9wdHMoUGFzc1JlZ2lzdHJ5Jik7CisKKy8vLyBJbml0aWFsaXplIGFsbCBwYXNzZXMgbGlua2VkIGludG8gdGhlIE9iakNBUkNPcHRzIGxpYnJhcnkuCit2b2lkIGluaXRpYWxpemVPYmpDQVJDT3B0cyhQYXNzUmVnaXN0cnkmKTsKKworLy8vIEluaXRpYWxpemUgYWxsIHBhc3NlcyBsaW5rZWQgaW50byB0aGUgVmVjdG9yaXplIGxpYnJhcnkuCit2b2lkIGluaXRpYWxpemVWZWN0b3JpemF0aW9uKFBhc3NSZWdpc3RyeSYpOworCisvLy8gSW5pdGlhbGl6ZSBhbGwgcGFzc2VzIGxpbmtlZCBpbnRvIHRoZSBJbnN0Q29tYmluZSBsaWJyYXJ5Lgordm9pZCBpbml0aWFsaXplSW5zdENvbWJpbmUoUGFzc1JlZ2lzdHJ5Jik7CisKKy8vLyBJbml0aWFsaXplIGFsbCBwYXNzZXMgbGlua2VkIGludG8gdGhlIElQTyBsaWJyYXJ5Lgordm9pZCBpbml0aWFsaXplSVBPKFBhc3NSZWdpc3RyeSYpOworCisvLy8gSW5pdGlhbGl6ZSBhbGwgcGFzc2VzIGxpbmtlZCBpbnRvIHRoZSBJbnN0cnVtZW50YXRpb24gbGlicmFyeS4KK3ZvaWQgaW5pdGlhbGl6ZUluc3RydW1lbnRhdGlvbihQYXNzUmVnaXN0cnkmKTsKKworLy8vIEluaXRpYWxpemUgYWxsIHBhc3NlcyBsaW5rZWQgaW50byB0aGUgQW5hbHlzaXMgbGlicmFyeS4KK3ZvaWQgaW5pdGlhbGl6ZUFuYWx5c2lzKFBhc3NSZWdpc3RyeSYpOworCisvLy8gSW5pdGlhbGl6ZSBhbGwgcGFzc2VzIGxpbmtlZCBpbnRvIHRoZSBDb3JvdXRpbmVzIGxpYnJhcnkuCit2b2lkIGluaXRpYWxpemVDb3JvdXRpbmVzKFBhc3NSZWdpc3RyeSYpOworCisvLy8gSW5pdGlhbGl6ZSBhbGwgcGFzc2VzIGxpbmtlZCBpbnRvIHRoZSBDb2RlR2VuIGxpYnJhcnkuCit2b2lkIGluaXRpYWxpemVDb2RlR2VuKFBhc3NSZWdpc3RyeSYpOworCisvLy8gSW5pdGlhbGl6ZSBhbGwgcGFzc2VzIGxpbmtlZCBpbnRvIHRoZSBHbG9iYWxJU2VsIGxpYnJhcnkuCit2b2lkIGluaXRpYWxpemVHbG9iYWxJU2VsKFBhc3NSZWdpc3RyeSYpOworCisvLy8gSW5pdGlhbGl6ZSBhbGwgcGFzc2VzIGxpbmtlZCBpbnRvIHRoZSBDb2RlR2VuIGxpYnJhcnkuCit2b2lkIGluaXRpYWxpemVUYXJnZXQoUGFzc1JlZ2lzdHJ5Jik7CisKK3ZvaWQgaW5pdGlhbGl6ZUFBRXZhbExlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQUFSZXN1bHRzV3JhcHBlclBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQURDRUxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQWRkRGlzY3JpbWluYXRvcnNMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUFkZHJlc3NTYW5pdGl6ZXJNb2R1bGVQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQWRkcmVzc1Nhbml0aXplclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVBZ2dyZXNzaXZlSW5zdENvbWJpbmVyTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVBbGlhc1NldFByaW50ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQWxpZ25tZW50RnJvbUFzc3VtcHRpb25zUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUFsd2F5c0lubGluZXJMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUFyZ1Byb21vdGlvblBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVBc3N1bXB0aW9uQ2FjaGVUcmFja2VyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUF0b21pY0V4cGFuZFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVCRENFTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVCYXJyaWVyTm9vcFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVCYXNpY0FBV3JhcHBlclBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQmxvY2tFeHRyYWN0b3JQYXNzKFBhc3NSZWdpc3RyeSAmKTsKK3ZvaWQgaW5pdGlhbGl6ZUJsb2NrRnJlcXVlbmN5SW5mb1dyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUJvdW5kc0NoZWNraW5nTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVCcmFuY2hGb2xkZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUJyYW5jaFByb2JhYmlsaXR5SW5mb1dyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUJyYW5jaFJlbGF4YXRpb25QYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQnJlYWtDcml0aWNhbEVkZ2VzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUJyZWFrRmFsc2VEZXBzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUNhbGxTaXRlU3BsaXR0aW5nTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVDRkdPbmx5UHJpbnRlckxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQ0ZHT25seVZpZXdlckxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQ0ZHUHJpbnRlckxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQ0ZHU2ltcGxpZnlQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUNGR1ZpZXdlckxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQ0ZMQW5kZXJzQUFXcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVDRkxTdGVlbnNBQVdyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUNhbGxHcmFwaERPVFByaW50ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQ2FsbEdyYXBoUHJpbnRlckxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplQ2FsbEdyYXBoVmlld2VyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUNhbGxHcmFwaFdyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUNvZGVHZW5QcmVwYXJlUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUNvbnN0YW50SG9pc3RpbmdMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUNhbGxlZFZhbHVlUHJvcGFnYXRpb25MZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkgJik7Cit2b2lkIGluaXRpYWxpemVDb25zdGFudE1lcmdlTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVDb25zdGFudFByb3BhZ2F0aW9uUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUNvcnJlbGF0ZWRWYWx1ZVByb3BhZ2F0aW9uUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUNvc3RNb2RlbEFuYWx5c2lzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUVhcmx5TWFjaGluZUxJQ01QYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRWFybHlUYWlsRHVwbGljYXRlUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUVudHJ5RXhpdEluc3RydW1lbnRlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQb3N0SW5saW5lRW50cnlFeGl0SW5zdHJ1bWVudGVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUNyb3NzRFNPQ0ZJUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZURBRVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVEQUhQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRENFTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVEU0VMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZURhdGFGbG93U2FuaXRpemVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZURlYWRJbnN0RWxpbWluYXRpb25QYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRGVhZE1hY2hpbmVJbnN0cnVjdGlvbkVsaW1QYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRGVsaW5lYXJpemF0aW9uUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZURlbWFuZGVkQml0c1dyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZURlcGVuZGVuY2VBbmFseXNpc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVEZXBlbmRlbmNlQW5hbHlzaXNXcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVEZXRlY3REZWFkTGFuZXNQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRGl2ZXJnZW5jZUFuYWx5c2lzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZURpdlJlbVBhaXJzTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVEb21Pbmx5UHJpbnRlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVEb21Pbmx5Vmlld2VyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZURvbVByaW50ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRG9tVmlld2VyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZURvbWluYW5jZUZyb250aWVyV3JhcHBlclBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRG9taW5hdG9yVHJlZVdyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUR3YXJmRUhQcmVwYXJlUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUVhcmx5Q1NFTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVFYXJseUNTRU1lbVNTQUxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRWFybHlJZkNvbnZlcnRlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVFZGdlQnVuZGxlc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVFZmZpY2llbmN5U2FuaXRpemVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUVsaW1pbmF0ZUF2YWlsYWJsZUV4dGVybmFsbHlMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUV4cGFuZElTZWxQc2V1ZG9zUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUV4cGFuZE1lbUNtcFBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRXhwYW5kUG9zdFJBUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUV4cGFuZFJlZHVjdGlvbnNQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRXh0ZXJuYWxBQVdyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUZFbnRyeUluc2VydGVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUZpbmFsaXplTWFjaGluZUJ1bmRsZXNQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRmxhdHRlbkNGR1Bhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplRmxvYXQySW50TGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVGb3JjZUZ1bmN0aW9uQXR0cnNMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUZvcndhcmRDb250cm9sRmxvd0ludGVncml0eVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVGdW5jbGV0TGF5b3V0UGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUZ1bmN0aW9uSW1wb3J0TGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVHQ01hY2hpbmVDb2RlQW5hbHlzaXNQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplR0NNb2R1bGVJbmZvUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUdDT1ZQcm9maWxlckxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplR1ZOSG9pc3RMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUdWTkxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplR1ZOU2lua0xlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplR2xvYmFsRENFTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVHbG9iYWxNZXJnZVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVHbG9iYWxPcHRMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUdsb2JhbFNwbGl0UGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUdsb2JhbHNBQVdyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUd1YXJkV2lkZW5pbmdMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUlQQ1BQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplSVBTQ0NQTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVJUlRyYW5zbGF0b3JQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplSVZVc2Vyc1dyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUlmQ29udmVydGVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUltcGxpY2l0TnVsbENoZWNrc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVJbmRWYXJTaW1wbGlmeUxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplSW5kaXJlY3RCckV4cGFuZFBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplSVJDRUxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplSW5mZXJBZGRyZXNzU3BhY2VzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUluZmVyRnVuY3Rpb25BdHRyc0xlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplSW5saW5lQ29zdEFuYWx5c2lzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUluc3RDb3VudFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVJbnN0TmFtZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplSW5zdFNpbXBsaWZpZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplSW5zdHJQcm9maWxpbmdMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUluc3RydWN0aW9uQ29tYmluaW5nUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVJbnN0cnVjdGlvblNlbGVjdFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVJbnRlcmxlYXZlZEFjY2Vzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVJbnRlcm5hbGl6ZUxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplSW50ZXJ2YWxQYXJ0aXRpb25QYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplSnVtcFRocmVhZGluZ1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMQ1NTQVZlcmlmaWNhdGlvblBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTENTU0FXcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMYXp5QmxvY2tGcmVxdWVuY3lJbmZvUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMYXp5QnJhbmNoUHJvYmFiaWxpdHlJbmZvUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMYXp5TWFjaGluZUJsb2NrRnJlcXVlbmN5SW5mb1Bhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTGF6eVZhbHVlSW5mb1ByaW50ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTGF6eVZhbHVlSW5mb1dyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxlZ2FjeUxJQ01QYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxlZ2FjeUxvb3BTaW5rUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMZWdhbGl6ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTGliQ2FsbHNTaHJpbmtXcmFwTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMaW50UGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxpdmVEZWJ1Z1ZhbHVlc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMaXZlRGVidWdWYXJpYWJsZXNQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTGl2ZUludGVydmFsc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMaXZlUmFuZ2VTaHJpbmtQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTGl2ZVJlZ01hdHJpeFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMaXZlU3RhY2tzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxpdmVWYXJpYWJsZXNQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTG9hZFN0b3JlVmVjdG9yaXplclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb2FkZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvY2FsU3RhY2tTbG90UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb2NhbGl6ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTG9vcEFjY2Vzc0xlZ2FjeUFuYWx5c2lzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvb3BEYXRhUHJlZmV0Y2hMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvb3BEZWxldGlvbkxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTG9vcERpc3RyaWJ1dGVMZWdhY3lQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTG9vcEV4dHJhY3RvclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb29wSWRpb21SZWNvZ25pemVMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvb3BJbmZvV3JhcHBlclBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTG9vcEludGVyY2hhbmdlUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvb3BMb2FkRWxpbWluYXRpb25QYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTG9vcFBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTG9vcFByZWRpY2F0aW9uTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb29wUmVyb2xsUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvb3BSb3RhdGVMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvb3BTaW1wbGlmeUNGR0xlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTG9vcFNpbXBsaWZ5UGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvb3BTdHJlbmd0aFJlZHVjZVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb29wVW5yb2xsUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvb3BVbnN3aXRjaFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb29wVmVjdG9yaXplUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvb3BWZXJzaW9uaW5nTElDTVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb29wVmVyc2lvbmluZ1Bhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTG93ZXJBdG9taWNMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvd2VyRW11VExTUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvd2VyRXhwZWN0SW50cmluc2ljUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvd2VyR3VhcmRJbnRyaW5zaWNMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZUxvd2VySW50cmluc2ljc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVMb3dlckludm9rZUxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTG93ZXJTd2l0Y2hQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTG93ZXJUeXBlVGVzdHNQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTUlSUHJpbnRpbmdQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1hY2hpbmVCbG9ja0ZyZXF1ZW5jeUluZm9QYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWFjaGluZUJsb2NrUGxhY2VtZW50UGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1hY2hpbmVCbG9ja1BsYWNlbWVudFN0YXRzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1hY2hpbmVCcmFuY2hQcm9iYWJpbGl0eUluZm9QYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWFjaGluZUNTRVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNYWNoaW5lQ29tYmluZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWFjaGluZUNvcHlQcm9wYWdhdGlvblBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNYWNoaW5lRG9taW5hbmNlRnJvbnRpZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWFjaGluZURvbWluYXRvclRyZWVQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWFjaGluZUZ1bmN0aW9uUHJpbnRlclBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWFjaGluZUxJQ01QYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWFjaGluZUxvb3BJbmZvUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1hY2hpbmVNb2R1bGVJbmZvUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1hY2hpbmVPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNYWNoaW5lT3V0bGluZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWFjaGluZVBpcGVsaW5lclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNYWNoaW5lUG9zdERvbWluYXRvclRyZWVQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWFjaGluZVJlZ2lvbkluZm9QYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1hY2hpbmVTY2hlZHVsZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWFjaGluZVNpbmtpbmdQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWFjaGluZVRyYWNlTWV0cmljc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNYWNoaW5lVmVyaWZpZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1lbUNweU9wdExlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWVtRGVwUHJpbnRlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNZW1EZXJlZlByaW50ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWVtb3J5RGVwZW5kZW5jZVdyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1lbW9yeVNTQVByaW50ZXJMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1lbW9yeVNTQVdyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1lbW9yeVNhbml0aXplclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNZXJnZUZ1bmN0aW9uc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNZXJnZUlDbXBzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU1lcmdlZExvYWRTdG9yZU1vdGlvbkxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTWV0YVJlbmFtZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTW9kdWxlRGVidWdJbmZvUHJpbnRlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNb2R1bGVTdW1tYXJ5SW5kZXhXcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVNdXN0RXhlY3V0ZVByaW50ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTmFtZUFub25HbG9iYWxMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU5hcnlSZWFzc29jaWF0ZUxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTmV3R1ZOTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVPYmpDQVJDQUFXcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVPYmpDQVJDQVBFbGltUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU9iakNBUkNDb250cmFjdFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVPYmpDQVJDRXhwYW5kUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU9iakNBUkNPcHRQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlcldyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZU9wdGltaXplUEhJc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQQUV2YWxQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUEVJUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVBHT0luZGlyZWN0Q2FsbFByb21vdGlvbkxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUEdPSW5zdHJ1bWVudGF0aW9uR2VuTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQR09JbnN0cnVtZW50YXRpb25Vc2VMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVBHT01lbU9QU2l6ZU9wdExlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUEhJRWxpbWluYXRpb25QYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUGFydGlhbElubGluZXJMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVBhcnRpYWxseUlubGluZUxpYkNhbGxzTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQYXRjaGFibGVGdW5jdGlvblBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQZWVwaG9sZU9wdGltaXplclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQaHlzaWNhbFJlZ2lzdGVyVXNhZ2VJbmZvUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVBsYWNlQmFja2VkZ2VTYWZlcG9pbnRzSW1wbFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQbGFjZVNhZmVwb2ludHNQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUG9zdERvbU9ubHlQcmludGVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVBvc3REb21Pbmx5Vmlld2VyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVBvc3REb21QcmludGVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVBvc3REb21WaWV3ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUG9zdERvbWluYXRvclRyZWVXcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQb3N0TWFjaGluZVNjaGVkdWxlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQb3N0T3JkZXJGdW5jdGlvbkF0dHJzTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQb3N0UkFIYXphcmRSZWNvZ25pemVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVBvc3RSQU1hY2hpbmVTaW5raW5nUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVBvc3RSQVNjaGVkdWxlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQcmVJU2VsSW50cmluc2ljTG93ZXJpbmdMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVByZWRpY2F0ZUluZm9QcmludGVyTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQcmludEJhc2ljQmxvY2tQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVByaW50RnVuY3Rpb25QYXNzV3JhcHBlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVQcmludE1vZHVsZVBhc3NXcmFwcGVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVByb2Nlc3NJbXBsaWNpdERlZnNQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUHJvZmlsZVN1bW1hcnlJbmZvV3JhcHBlclBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUHJvbW90ZUxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUHJ1bmVFSFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVSQUJhc2ljUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVJlZ0FsbG9jRmFzdFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVSQUdyZWVkeVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVSZWFzc29jaWF0ZUxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUmVnQmFua1NlbGVjdFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVSZWFjaGluZ0RlZkFuYWx5c2lzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVJlZ1RvTWVtUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVJlZ2lvbkluZm9QYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVJlZ2lvbk9ubHlQcmludGVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVJlZ2lvbk9ubHlWaWV3ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUmVnaW9uUHJpbnRlclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVSZWdpb25WaWV3ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUmVnaXN0ZXJDb2FsZXNjZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplUmVuYW1lSW5kZXBlbmRlbnRTdWJyZWdzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVJlc2V0TWFjaGluZUZ1bmN0aW9uUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVJldmVyc2VQb3N0T3JkZXJGdW5jdGlvbkF0dHJzTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVSZXdyaXRlU3RhdGVwb2ludHNGb3JHQ0xlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSAmKTsKK3ZvaWQgaW5pdGlhbGl6ZVJld3JpdGVTeW1ib2xzTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTYWZlcG9pbnRJUlZlcmlmaWVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVNDQ1BMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVNDRVZBQVdyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVNMUFZlY3Rvcml6ZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU1JPQUxlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU2FmZVN0YWNrTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTYW1wbGVQcm9maWxlTG9hZGVyTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTYW5pdGl6ZXJDb3ZlcmFnZU1vZHVsZVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTY2FsYXJFdm9sdXRpb25XcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTY2FsYXJpemVNYXNrZWRNZW1JbnRyaW5QYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU2NhbGFyaXplclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTY2F2ZW5nZXJUZXN0UGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVNjb3BlZE5vQWxpYXNBQVdyYXBwZXJQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVNlcGFyYXRlQ29uc3RPZmZzZXRGcm9tR0VQUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVNoYWRvd1N0YWNrR0NMb3dlcmluZ1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTaHJpbmtXcmFwUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVNpbXBsZUlubGluZXJQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU2ltcGxlTG9vcFVuc3dpdGNoTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTaW5nbGVMb29wRXh0cmFjdG9yUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVNpbmtpbmdMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVNqTGpFSFByZXBhcmVQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU2xvdEluZGV4ZXNQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU3BlY3VsYXRpdmVFeGVjdXRpb25MZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVNwaWxsUGxhY2VtZW50UGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVN0YWNrQ29sb3JpbmdQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU3RhY2tNYXBMaXZlbmVzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTdGFja1Byb3RlY3RvclBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTdGFja1Nsb3RDb2xvcmluZ1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTdHJhaWdodExpbmVTdHJlbmd0aFJlZHVjZVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTdHJpcERlYWREZWJ1Z0luZm9QYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU3RyaXBEZWFkUHJvdG90eXBlc0xlZ2FjeVBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU3RyaXBEZWJ1Z0RlY2xhcmVQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU3RyaXBHQ1JlbG9jYXRlc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTdHJpcE5vbkRlYnVnU3ltYm9sc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTdHJpcE5vbkxpbmVUYWJsZURlYnVnSW5mb1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVTdHJpcFN5bWJvbHNQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplU3RydWN0dXJpemVDRkdQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplSFdBZGRyZXNzU2FuaXRpemVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVRhaWxDYWxsRWxpbVBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVUYWlsRHVwbGljYXRlUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVRhcmdldExpYnJhcnlJbmZvV3JhcHBlclBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplVGFyZ2V0UGFzc0NvbmZpZ1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVUYXJnZXRUcmFuc2Zvcm1JbmZvV3JhcHBlclBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplVGhyZWFkU2FuaXRpemVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVR3b0FkZHJlc3NJbnN0cnVjdGlvblBhc3NQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplVHlwZUJhc2VkQUFXcmFwcGVyUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVVbmlmeUZ1bmN0aW9uRXhpdE5vZGVzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVVucGFja01hY2hpbmVCdW5kbGVzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVVucmVhY2hhYmxlQmxvY2tFbGltTGVnYWN5UGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVVbnJlYWNoYWJsZU1hY2hpbmVCbG9ja0VsaW1QYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplVmVyaWZpZXJMZWdhY3lQYXNzUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVZpcnRSZWdNYXBQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplVmlydFJlZ1Jld3JpdGVyUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVdob2xlUHJvZ3JhbURldmlydFBhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVXaW5FSFByZXBhcmVQYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplV3JpdGVCaXRjb2RlUGFzc1Bhc3MoUGFzc1JlZ2lzdHJ5Jik7Cit2b2lkIGluaXRpYWxpemVXcml0ZVRoaW5MVE9CaXRjb2RlUGFzcyhQYXNzUmVnaXN0cnkmKTsKK3ZvaWQgaW5pdGlhbGl6ZVhSYXlJbnN0cnVtZW50YXRpb25QYXNzKFBhc3NSZWdpc3RyeSYpOwordm9pZCBpbml0aWFsaXplTUlSQ2Fub25pY2FsaXplclBhc3MoUGFzc1JlZ2lzdHJ5ICYpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9JTklUSUFMSVpFUEFTU0VTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTFRPL0NhY2hpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTFRPL0NhY2hpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjAxYWIzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MVE8vQ2FjaGluZy5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vPT09LSBDYWNoaW5nLmggLSBMTFZNIExpbmsgVGltZSBPcHRpbWl6ZXIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGxvY2FsQ2FjaGUgZnVuY3Rpb24sIHdoaWNoIGFsbG93cyBjbGllbnRzIHRvIGFkZCBhCisvLyBmaWxlc3lzdGVtIGNhY2hlIHRvIFRoaW5MVE8uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0xUT19DQUNISU5HX0gKKyNkZWZpbmUgTExWTV9MVE9fQ0FDSElOR19ICisKKyNpbmNsdWRlICJsbHZtL0xUTy9MVE8uaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBsdG8geworCisvLy8gVGhpcyB0eXBlIGRlZmluZXMgdGhlIGNhbGxiYWNrIHRvIGFkZCBhIHByZS1leGlzdGluZyBuYXRpdmUgb2JqZWN0IGZpbGUKKy8vLyAoZS5nLiBpbiBhIGNhY2hlKS4KKy8vLworLy8vIEJ1ZmZlciBjYWxsYmFja3MgbXVzdCBiZSB0aHJlYWQgc2FmZS4KK3R5cGVkZWYgc3RkOjpmdW5jdGlvbjx2b2lkKHVuc2lnbmVkIFRhc2ssIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IE1CKT4KKyAgICBBZGRCdWZmZXJGbjsKKworLy8vIENyZWF0ZSBhIGxvY2FsIGZpbGUgc3lzdGVtIGNhY2hlIHdoaWNoIHVzZXMgdGhlIGdpdmVuIGNhY2hlIGRpcmVjdG9yeSBhbmQKKy8vLyBmaWxlIGNhbGxiYWNrLiBUaGlzIGZ1bmN0aW9uIGFsc28gY3JlYXRlcyB0aGUgY2FjaGUgZGlyZWN0b3J5IGlmIGl0IGRvZXMgbm90CisvLy8gYWxyZWFkeSBleGlzdC4KK0V4cGVjdGVkPE5hdGl2ZU9iamVjdENhY2hlPiBsb2NhbENhY2hlKFN0cmluZ1JlZiBDYWNoZURpcmVjdG9yeVBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRCdWZmZXJGbiBBZGRCdWZmZXIpOworCit9IC8vIG5hbWVzcGFjZSBsdG8KK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xUTy9Db25maWcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTFRPL0NvbmZpZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiZDk4MWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xUTy9Db25maWcuaApAQCAtMCwwICsxLDIwMiBAQAorLy89PT0tQ29uZmlnLmggLSBMTFZNIExpbmsgVGltZSBPcHRpbWl6ZXIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgbHRvOjpDb25maWcgZGF0YSBzdHJ1Y3R1cmUsIHdoaWNoIGFsbG93cyBjbGllbnRzIHRvCisvLyBjb25maWd1cmUgTFRPLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9MVE9fQ09ORklHX0gKKyNkZWZpbmUgTExWTV9MVE9fQ09ORklHX0gKKworI2luY2x1ZGUgImxsdm0vSVIvRGlhZ25vc3RpY0luZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29kZUdlbi5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgiCisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEVycm9yOworY2xhc3MgTW9kdWxlOworY2xhc3MgTW9kdWxlU3VtbWFyeUluZGV4OworY2xhc3MgcmF3X3B3cml0ZV9zdHJlYW07CisKK25hbWVzcGFjZSBsdG8geworCisvLy8gTFRPIGNvbmZpZ3VyYXRpb24uIEEgbGlua2VyIGNhbiBjb25maWd1cmUgTFRPIGJ5IHNldHRpbmcgZmllbGRzIGluIHRoaXMgZGF0YQorLy8vIHN0cnVjdHVyZSBhbmQgcGFzc2luZyBpdCB0byB0aGUgbHRvOjpMVE8gY29uc3RydWN0b3IuCitzdHJ1Y3QgQ29uZmlnIHsKKyAgLy8gTm90ZTogd2hlbiBhZGRpbmcgZmllbGRzIGhlcmUsIGNvbnNpZGVyIHdoZXRoZXIgdGhleSBuZWVkIHRvIGJlIGFkZGVkIHRvCisgIC8vIGNvbXB1dGVDYWNoZUtleSBpbiBMVE8uY3BwLgorICBzdGQ6OnN0cmluZyBDUFU7CisgIFRhcmdldE9wdGlvbnMgT3B0aW9uczsKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IE1BdHRyczsKKyAgT3B0aW9uYWw8UmVsb2M6Ok1vZGVsPiBSZWxvY01vZGVsID0gUmVsb2M6OlBJQ187CisgIE9wdGlvbmFsPENvZGVNb2RlbDo6TW9kZWw+IENvZGVNb2RlbCA9IE5vbmU7CisgIENvZGVHZW5PcHQ6OkxldmVsIENHT3B0TGV2ZWwgPSBDb2RlR2VuT3B0OjpEZWZhdWx0OworICBUYXJnZXRNYWNoaW5lOjpDb2RlR2VuRmlsZVR5cGUgQ0dGaWxlVHlwZSA9IFRhcmdldE1hY2hpbmU6OkNHRlRfT2JqZWN0RmlsZTsKKyAgdW5zaWduZWQgT3B0TGV2ZWwgPSAyOworICBib29sIERpc2FibGVWZXJpZnkgPSBmYWxzZTsKKworICAvLy8gVXNlIHRoZSBuZXcgcGFzcyBtYW5hZ2VyCisgIGJvb2wgVXNlTmV3UE0gPSBmYWxzZTsKKworICAvLy8gRGlzYWJsZSBlbnRpcmVseSB0aGUgb3B0aW1pemVyLCBpbmNsdWRpbmcgaW1wb3J0aW5nIGZvciBUaGluTFRPCisgIGJvb2wgQ29kZUdlbk9ubHkgPSBmYWxzZTsKKworICAvLy8gSWYgdGhpcyBmaWVsZCBpcyBzZXQsIHRoZSBzZXQgb2YgcGFzc2VzIHJ1biBpbiB0aGUgbWlkZGxlLWVuZCBvcHRpbWl6ZXIKKyAgLy8vIHdpbGwgYmUgdGhlIG9uZSBzcGVjaWZpZWQgYnkgdGhlIHN0cmluZy4gT25seSB3b3JrcyB3aXRoIHRoZSBuZXcgcGFzcworICAvLy8gbWFuYWdlciBhcyB0aGUgb2xkIG9uZSBkb2Vzbid0IGhhdmUgdGhpcyBhYmlsaXR5LgorICBzdGQ6OnN0cmluZyBPcHRQaXBlbGluZTsKKworICAvLyBJZiB0aGlzIGZpZWxkIGlzIHNldCwgaXQgaGFzIHRoZSBzYW1lIGVmZmVjdCBvZiBzcGVjaWZ5aW5nIGFuIEFBIHBpcGVsaW5lCisgIC8vIGlkZW50aWZpZWQgYnkgdGhlIHN0cmluZy4gT25seSB3b3JrcyB3aXRoIHRoZSBuZXcgcGFzcyBtYW5hZ2VyLCBpbgorICAvLyBjb25qdW5jdGlvbiBPcHRQaXBlbGluZS4KKyAgc3RkOjpzdHJpbmcgQUFQaXBlbGluZTsKKworICAvLy8gU2V0dGluZyB0aGlzIGZpZWxkIHdpbGwgcmVwbGFjZSB0YXJnZXQgdHJpcGxlcyBpbiBpbnB1dCBmaWxlcyB3aXRoIHRoaXMKKyAgLy8vIHRyaXBsZS4KKyAgc3RkOjpzdHJpbmcgT3ZlcnJpZGVUcmlwbGU7CisKKyAgLy8vIFNldHRpbmcgdGhpcyBmaWVsZCB3aWxsIHJlcGxhY2UgdW5zcGVjaWZpZWQgdGFyZ2V0IHRyaXBsZXMgaW4gaW5wdXQgZmlsZXMKKyAgLy8vIHdpdGggdGhpcyB0cmlwbGUuCisgIHN0ZDo6c3RyaW5nIERlZmF1bHRUcmlwbGU7CisKKyAgLy8vIFNhbXBsZSBQR08gcHJvZmlsZSBwYXRoLgorICBzdGQ6OnN0cmluZyBTYW1wbGVQcm9maWxlOworCisgIC8vLyBPcHRpbWl6YXRpb24gcmVtYXJrcyBmaWxlIHBhdGguCisgIHN0ZDo6c3RyaW5nIFJlbWFya3NGaWxlbmFtZSA9ICIiOworCisgIC8vLyBXaGV0aGVyIHRvIGVtaXQgb3B0aW1pemF0aW9uIHJlbWFya3Mgd2l0aCBob3RuZXNzIGluZm9ybWF0aW9ucy4KKyAgYm9vbCBSZW1hcmtzV2l0aEhvdG5lc3MgPSBmYWxzZTsKKworICAvLy8gV2hldGhlciB0byBlbWl0IHRoZSBwYXNzIG1hbmFnZXIgZGVidWdnZ2luZyBpbmZvcm1hdGlvbnMuCisgIGJvb2wgRGVidWdQYXNzTWFuYWdlciA9IGZhbHNlOworCisgIGJvb2wgU2hvdWxkRGlzY2FyZFZhbHVlTmFtZXMgPSB0cnVlOworICBEaWFnbm9zdGljSGFuZGxlckZ1bmN0aW9uIERpYWdIYW5kbGVyOworCisgIC8vLyBJZiB0aGlzIGZpZWxkIGlzIHNldCwgTFRPIHdpbGwgd3JpdGUgaW5wdXQgZmlsZSBwYXRocyBhbmQgc3ltYm9sCisgIC8vLyByZXNvbHV0aW9ucyBoZXJlIGluIGxsdm0tbHRvMiBjb21tYW5kIGxpbmUgZmxhZyBmb3JtYXQuIFRoaXMgY2FuIGJlCisgIC8vLyB1c2VkIGZvciB0ZXN0aW5nIGFuZCBmb3IgcnVubmluZyB0aGUgTFRPIHBpcGVsaW5lIG91dHNpZGUgb2YgdGhlIGxpbmtlcgorICAvLy8gd2l0aCBsbHZtLWx0bzIuCisgIHN0ZDo6dW5pcXVlX3B0cjxyYXdfb3N0cmVhbT4gUmVzb2x1dGlvbkZpbGU7CisKKyAgLy8vIFRoZSBmb2xsb3dpbmcgY2FsbGJhY2tzIGRlYWwgd2l0aCB0YXNrcywgd2hpY2ggbm9ybWFsbHkgcmVwcmVzZW50IHRoZQorICAvLy8gZW50aXJlIG9wdGltaXphdGlvbiBhbmQgY29kZSBnZW5lcmF0aW9uIHBpcGVsaW5lIGZvciB3aGF0IHdpbGwgYmVjb21lIGEKKyAgLy8vIHNpbmdsZSBuYXRpdmUgb2JqZWN0IGZpbGUuIEVhY2ggdGFzayBoYXMgYSB1bmlxdWUgaWRlbnRpZmllciBiZXR3ZWVuIDAgYW5kCisgIC8vLyBnZXRNYXhUYXNrcygpLTEsIHdoaWNoIGlzIHN1cHBsaWVkIHRvIHRoZSBjYWxsYmFjayB2aWEgdGhlIFRhc2sgcGFyYW1ldGVyLgorICAvLy8gQSB0YXNrIHJlcHJlc2VudHMgdGhlIGVudGlyZSBwaXBlbGluZSBmb3IgVGhpbkxUTyBhbmQgcmVndWxhcgorICAvLy8gKG5vbi1wYXJhbGxlbCkgTFRPLCBidXQgYSBwYXJhbGxlbCBjb2RlIGdlbmVyYXRpb24gdGFzayB3aWxsIGJlIHNwbGl0IGludG8KKyAgLy8vIE4gdGFza3MgYmVmb3JlIGNvZGUgZ2VuZXJhdGlvbiwgd2hlcmUgTiBpcyB0aGUgcGFyYWxsZWxpc20gbGV2ZWwuCisgIC8vLworICAvLy8gTFRPIG1heSBkZWNpZGUgdG8gc3RvcCBwcm9jZXNzaW5nIGEgdGFzayBhdCBhbnkgdGltZSwgZm9yIGV4YW1wbGUgaWYgdGhlCisgIC8vLyBtb2R1bGUgaXMgZW1wdHkgb3IgaWYgYSBtb2R1bGUgaG9vayAoc2VlIGJlbG93KSByZXR1cm5zIGZhbHNlLiBGb3IgdGhpcworICAvLy8gcmVhc29uLCB0aGUgY2xpZW50IHNob3VsZCBub3QgZXhwZWN0IHRvIHJlY2VpdmUgZXhhY3RseSBnZXRNYXhUYXNrcygpCisgIC8vLyBuYXRpdmUgb2JqZWN0IGZpbGVzLgorCisgIC8vLyBBIG1vZHVsZSBob29rIG1heSBiZSB1c2VkIGJ5IGEgbGlua2VyIHRvIHBlcmZvcm0gYWN0aW9ucyBkdXJpbmcgdGhlIExUTworICAvLy8gcGlwZWxpbmUuIEZvciBleGFtcGxlLCBhIGxpbmtlciBtYXkgdXNlIHRoaXMgZnVuY3Rpb24gdG8gaW1wbGVtZW50CisgIC8vLyAtc2F2ZS10ZW1wcy4gSWYgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLCBhbnkgZnVydGhlciBwcm9jZXNzaW5nIGZvcgorICAvLy8gdGhhdCB0YXNrIGlzIGFib3J0ZWQuCisgIC8vLworICAvLy8gTW9kdWxlIGhvb2tzIG11c3QgYmUgdGhyZWFkIHNhZmUgd2l0aCByZXNwZWN0IHRvIHRoZSBsaW5rZXIncyBpbnRlcm5hbAorICAvLy8gZGF0YSBzdHJ1Y3R1cmVzLiBBIG1vZHVsZSBob29rIHdpbGwgbmV2ZXIgYmUgY2FsbGVkIGNvbmN1cnJlbnRseSBmcm9tCisgIC8vLyBtdWx0aXBsZSB0aHJlYWRzIHdpdGggdGhlIHNhbWUgdGFzayBJRCwgb3IgdGhlIHNhbWUgbW9kdWxlLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBpbiBvdXQtb2YtcHJvY2VzcyBiYWNrZW5kIHNjZW5hcmlvcywgbm9uZSBvZiB0aGUgaG9va3Mgd2lsbCBiZQorICAvLy8gY2FsbGVkIGZvciBUaGluTFRPIHRhc2tzLgorICB0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248Ym9vbCh1bnNpZ25lZCBUYXNrLCBjb25zdCBNb2R1bGUgJik+IE1vZHVsZUhvb2tGbjsKKworICAvLy8gVGhpcyBtb2R1bGUgaG9vayBpcyBjYWxsZWQgYWZ0ZXIgbGlua2luZyAocmVndWxhciBMVE8pIG9yIGxvYWRpbmcKKyAgLy8vIChUaGluTFRPKSB0aGUgbW9kdWxlLCBiZWZvcmUgbW9kaWZ5aW5nIGl0LgorICBNb2R1bGVIb29rRm4gUHJlT3B0TW9kdWxlSG9vazsKKworICAvLy8gVGhpcyBob29rIGlzIGNhbGxlZCBhZnRlciBwcm9tb3RpbmcgYW55IGludGVybmFsIGZ1bmN0aW9ucworICAvLy8gKFRoaW5MVE8tc3BlY2lmaWMpLgorICBNb2R1bGVIb29rRm4gUG9zdFByb21vdGVNb2R1bGVIb29rOworCisgIC8vLyBUaGlzIGhvb2sgaXMgY2FsbGVkIGFmdGVyIGludGVybmFsaXppbmcgdGhlIG1vZHVsZS4KKyAgTW9kdWxlSG9va0ZuIFBvc3RJbnRlcm5hbGl6ZU1vZHVsZUhvb2s7CisKKyAgLy8vIFRoaXMgaG9vayBpcyBjYWxsZWQgYWZ0ZXIgaW1wb3J0aW5nIGZyb20gb3RoZXIgbW9kdWxlcyAoVGhpbkxUTy1zcGVjaWZpYykuCisgIE1vZHVsZUhvb2tGbiBQb3N0SW1wb3J0TW9kdWxlSG9vazsKKworICAvLy8gVGhpcyBtb2R1bGUgaG9vayBpcyBjYWxsZWQgYWZ0ZXIgb3B0aW1pemF0aW9uIGlzIGNvbXBsZXRlLgorICBNb2R1bGVIb29rRm4gUG9zdE9wdE1vZHVsZUhvb2s7CisKKyAgLy8vIFRoaXMgbW9kdWxlIGhvb2sgaXMgY2FsbGVkIGJlZm9yZSBjb2RlIGdlbmVyYXRpb24uIEl0IGlzIHNpbWlsYXIgdG8gdGhlCisgIC8vLyBQb3N0T3B0TW9kdWxlSG9vaywgYnV0IGZvciBwYXJhbGxlbCBjb2RlIGdlbmVyYXRpb24gaXQgaXMgY2FsbGVkIGFmdGVyCisgIC8vLyBzcGxpdHRpbmcgdGhlIG1vZHVsZS4KKyAgTW9kdWxlSG9va0ZuIFByZUNvZGVHZW5Nb2R1bGVIb29rOworCisgIC8vLyBBIGNvbWJpbmVkIGluZGV4IGhvb2sgaXMgY2FsbGVkIGFmdGVyIGFsbCBwZXItbW9kdWxlIGluZGV4ZXMgaGF2ZSBiZWVuCisgIC8vLyBjb21iaW5lZCAoVGhpbkxUTy1zcGVjaWZpYykuIEl0IGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCAtc2F2ZS10ZW1wcyBmb3IKKyAgLy8vIHRoZSBjb21iaW5lZCBpbmRleC4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UsIGFueSBmdXJ0aGVyIHByb2Nlc3NpbmcgZm9yIFRoaW5MVE8gdGFza3MKKyAgLy8vIGlzIGFib3J0ZWQuCisgIC8vLworICAvLy8gSXQgaXMgY2FsbGVkIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgYmFja2VuZCBpcyBpbi1wcm9jZXNzLCBhbHRob3VnaCBpdAorICAvLy8gaXMgbm90IGNhbGxlZCBmcm9tIGluZGl2aWR1YWwgYmFja2VuZCBwcm9jZXNzZXMuCisgIHR5cGVkZWYgc3RkOjpmdW5jdGlvbjxib29sKGNvbnN0IE1vZHVsZVN1bW1hcnlJbmRleCAmSW5kZXgpPgorICAgICAgQ29tYmluZWRJbmRleEhvb2tGbjsKKyAgQ29tYmluZWRJbmRleEhvb2tGbiBDb21iaW5lZEluZGV4SG9vazsKKworICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRoYXQgY29uZmlndXJlcyB0aGlzIENvbmZpZyBvYmplY3QgdG8gd3JpdGUKKyAgLy8vIHRlbXBvcmFyeSBmaWxlcyBuYW1lZCBhZnRlciB0aGUgZ2l2ZW4gT3V0cHV0RmlsZU5hbWUgZm9yIGVhY2ggb2YgdGhlIExUTworICAvLy8gcGhhc2VzIHRvIGRpc2suIEEgY2xpZW50IGNhbiB1c2UgdGhpcyBmdW5jdGlvbiB0byBpbXBsZW1lbnQgLXNhdmUtdGVtcHMuCisgIC8vLworICAvLy8gRklYTUU6IFRlbXBvcmFyeSBmaWxlcyBkZXJpdmVkIGZyb20gVGhpbkxUTyBiYWNrZW5kcyBhcmUgY3VycmVudGx5IG5hbWVkCisgIC8vLyBhZnRlciB0aGUgaW5wdXQgZmlsZSBuYW1lLCByYXRoZXIgdGhhbiB0aGUgb3V0cHV0IGZpbGUgbmFtZSwgd2hlbgorICAvLy8gVXNlSW5wdXRNb2R1bGVQYXRoIGlzIHNldCB0byB0cnVlLgorICAvLy8KKyAgLy8vIFNwZWNpZmljYWxseSwgaXQgKDEpIHNldHMgZWFjaCBvZiB0aGUgYWJvdmUgbW9kdWxlIGhvb2tzIGFuZCB0aGUgY29tYmluZWQKKyAgLy8vIGluZGV4IGhvb2sgdG8gYSBmdW5jdGlvbiB0aGF0IGNhbGxzIHRoZSBob29rIGZ1bmN0aW9uIChpZiBhbnkpIHRoYXQgd2FzCisgIC8vLyBwcmVzZW50IGluIHRoZSBhcHByb3ByaWF0ZSBmaWVsZCB3aGVuIHRoZSBhZGRTYXZlVGVtcHMgZnVuY3Rpb24gd2FzCisgIC8vLyBjYWxsZWQsIGFuZCB3cml0ZXMgdGhlIG1vZHVsZSB0byBhIGJpdGNvZGUgZmlsZSB3aXRoIGEgbmFtZSBwcmVmaXhlZCBieQorICAvLy8gdGhlIGdpdmVuIG91dHB1dCBmaWxlIG5hbWUsIGFuZCAoMikgY3JlYXRlcyBhIHJlc29sdXRpb24gZmlsZSB3aG9zZSBuYW1lCisgIC8vLyBpcyBwcmVmaXhlZCBieSB0aGUgZ2l2ZW4gb3V0cHV0IGZpbGUgbmFtZSBhbmQgc2V0cyBSZXNvbHV0aW9uRmlsZSB0byBpdHMKKyAgLy8vIGZpbGUgaGFuZGxlLgorICBFcnJvciBhZGRTYXZlVGVtcHMoc3RkOjpzdHJpbmcgT3V0cHV0RmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICBib29sIFVzZUlucHV0TW9kdWxlUGF0aCA9IGZhbHNlKTsKK307CisKK3N0cnVjdCBMVE9MTFZNRGlhZ25vc3RpY0hhbmRsZXIgOiBwdWJsaWMgRGlhZ25vc3RpY0hhbmRsZXIgeworICBEaWFnbm9zdGljSGFuZGxlckZ1bmN0aW9uICpGbjsKKyAgTFRPTExWTURpYWdub3N0aWNIYW5kbGVyKERpYWdub3N0aWNIYW5kbGVyRnVuY3Rpb24gKkRpYWdIYW5kbGVyRm4pCisgICAgICA6IEZuKERpYWdIYW5kbGVyRm4pIHt9CisgIGJvb2wgaGFuZGxlRGlhZ25vc3RpY3MoY29uc3QgRGlhZ25vc3RpY0luZm8gJkRJKSBvdmVycmlkZSB7CisgICAgKCpGbikoREkpOworICAgIHJldHVybiB0cnVlOworICB9Cit9OworLy8vIEEgZGVyaXZlZCBjbGFzcyBvZiBMTFZNQ29udGV4dCB0aGF0IGluaXRpYWxpemVzIGl0c2VsZiBhY2NvcmRpbmcgdG8gYSBnaXZlbgorLy8vIENvbmZpZyBvYmplY3QuIFRoZSBwdXJwb3NlIG9mIHRoaXMgY2xhc3MgaXMgdG8gdGllIG93bmVyc2hpcCBvZiB0aGUKKy8vLyBkaWFnbm9zdGljIGhhbmRsZXIgdG8gdGhlIGNvbnRleHQsIGFzIG9wcG9zZWQgdG8gdGhlIENvbmZpZyBvYmplY3QgKHdoaWNoCisvLy8gbWF5IGJlIGVwaGVtZXJhbCkuCisvLyBGSVhNRTogVGhpcyBzaG91bGQgbm90IGJlIHJlcXVpcmVkIGFzIGRpYWdub3N0aWMgaGFuZGxlciBpcyBub3QgY2FsbGJhY2suCitzdHJ1Y3QgTFRPTExWTUNvbnRleHQgOiBMTFZNQ29udGV4dCB7CisKKyAgTFRPTExWTUNvbnRleHQoY29uc3QgQ29uZmlnICZDKSA6IERpYWdIYW5kbGVyKEMuRGlhZ0hhbmRsZXIpIHsKKyAgICBzZXREaXNjYXJkVmFsdWVOYW1lcyhDLlNob3VsZERpc2NhcmRWYWx1ZU5hbWVzKTsKKyAgICBlbmFibGVEZWJ1Z1R5cGVPRFJVbmlxdWluZygpOworICAgIHNldERpYWdub3N0aWNIYW5kbGVyKAorICAgICAgICBsbHZtOjptYWtlX3VuaXF1ZTxMVE9MTFZNRGlhZ25vc3RpY0hhbmRsZXI+KCZEaWFnSGFuZGxlciksIHRydWUpOworICB9CisgIERpYWdub3N0aWNIYW5kbGVyRnVuY3Rpb24gRGlhZ0hhbmRsZXI7Cit9OworCit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MVE8vTFRPLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xUTy9MVE8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDZiZWFiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MVE8vTFRPLmgKQEAgLTAsMCArMSw0MTcgQEAKKy8vPT09LUxUTy5oIC0gTExWTSBMaW5rIFRpbWUgT3B0aW1pemVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyB1c2VkIHRvIHN1cHBvcnQgTFRPLiBJdCBpcyBpbnRlbmRlZAorLy8gdG8gYmUgdXNlZCBib3RoIGJ5IExUTyBjbGFzc2VzIGFzIHdlbGwgYXMgYnkgY2xpZW50cyAoZ29sZC1wbHVnaW4pIHRoYXQKKy8vIGRvbid0IHV0aWxpemUgdGhlIExUTyBjb2RlIGdlbmVyYXRvciBpbnRlcmZhY2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9MVE9fTFRPX0gKKyNkZWZpbmUgTExWTV9MVE9fTFRPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL01hcFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGlhZ25vc3RpY0luZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZVN1bW1hcnlJbmRleC5oIgorI2luY2x1ZGUgImxsdm0vTFRPL0NvbmZpZy5oIgorI2luY2x1ZGUgImxsdm0vTGlua2VyL0lSTW92ZXIuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9JUlN5bXRhYi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Ub29sT3V0cHV0RmlsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC90aHJlYWQuaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL0lQTy9GdW5jdGlvbkltcG9ydC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJpdGNvZGVNb2R1bGU7CitjbGFzcyBFcnJvcjsKK2NsYXNzIExMVk1Db250ZXh0OworY2xhc3MgTWVtb3J5QnVmZmVyUmVmOworY2xhc3MgTW9kdWxlOworY2xhc3MgVGFyZ2V0OworY2xhc3MgcmF3X3B3cml0ZV9zdHJlYW07CisKKy8vLyBSZXNvbHZlIFdlYWsgYW5kIExpbmtPbmNlIHZhbHVlcyBpbiB0aGUgXHAgSW5kZXguIExpbmthZ2UgY2hhbmdlcyByZWNvcmRlZAorLy8vIGluIHRoZSBpbmRleCBhbmQgdGhlIFRoaW5MVE8gYmFja2VuZHMgbXVzdCBhcHBseSB0aGUgY2hhbmdlcyB0byB0aGUgTW9kdWxlCisvLy8gdmlhIHRoaW5MVE9SZXNvbHZlV2Vha0Zvckxpbmtlck1vZHVsZS4KKy8vLworLy8vIFRoaXMgaXMgZG9uZSBmb3IgY29ycmVjdG5lc3MgKGlmIHZhbHVlIGV4cG9ydGVkLCBlbnN1cmUgd2UgYWx3YXlzCisvLy8gZW1pdCBhIGNvcHkpLCBhbmQgY29tcGlsZS10aW1lIG9wdGltaXphdGlvbiAoYWxsb3cgZHJvcCBvZiBkdXBsaWNhdGVzKS4KK3ZvaWQgdGhpbkxUT1Jlc29sdmVXZWFrRm9yTGlua2VySW5JbmRleCgKKyAgICBNb2R1bGVTdW1tYXJ5SW5kZXggJkluZGV4LAorICAgIGZ1bmN0aW9uX3JlZjxib29sKEdsb2JhbFZhbHVlOjpHVUlELCBjb25zdCBHbG9iYWxWYWx1ZVN1bW1hcnkgKik+CisgICAgICAgIGlzUHJldmFpbGluZywKKyAgICBmdW5jdGlvbl9yZWY8dm9pZChTdHJpbmdSZWYsIEdsb2JhbFZhbHVlOjpHVUlELCBHbG9iYWxWYWx1ZTo6TGlua2FnZVR5cGVzKT4KKyAgICAgICAgcmVjb3JkTmV3TGlua2FnZSk7CisKKy8vLyBVcGRhdGUgdGhlIGxpbmthZ2VzIGluIHRoZSBnaXZlbiBccCBJbmRleCB0byBtYXJrIGV4cG9ydGVkIHZhbHVlcworLy8vIGFzIGV4dGVybmFsIGFuZCBub24tZXhwb3J0ZWQgdmFsdWVzIGFzIGludGVybmFsLiBUaGUgVGhpbkxUTyBiYWNrZW5kcworLy8vIG11c3QgYXBwbHkgdGhlIGNoYW5nZXMgdG8gdGhlIE1vZHVsZSB2aWEgdGhpbkxUT0ludGVybmFsaXplTW9kdWxlLgordm9pZCB0aGluTFRPSW50ZXJuYWxpemVBbmRQcm9tb3RlSW5JbmRleCgKKyAgICBNb2R1bGVTdW1tYXJ5SW5kZXggJkluZGV4LAorICAgIGZ1bmN0aW9uX3JlZjxib29sKFN0cmluZ1JlZiwgR2xvYmFsVmFsdWU6OkdVSUQpPiBpc0V4cG9ydGVkKTsKKworbmFtZXNwYWNlIGx0byB7CisKKy8vLyBHaXZlbiB0aGUgb3JpZ2luYWwgXHAgUGF0aCB0byBhbiBvdXRwdXQgZmlsZSwgcmVwbGFjZSBhbnkgcGF0aAorLy8vIHByZWZpeCBtYXRjaGluZyBccCBPbGRQcmVmaXggd2l0aCBccCBOZXdQcmVmaXguIEFsc28sIGNyZWF0ZSB0aGUKKy8vLyByZXN1bHRpbmcgZGlyZWN0b3J5IGlmIGl0IGRvZXMgbm90IHlldCBleGlzdC4KK3N0ZDo6c3RyaW5nIGdldFRoaW5MVE9PdXRwdXRGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nICZQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJk9sZFByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZOZXdQcmVmaXgpOworCisvLy8gU2V0dXAgb3B0aW1pemF0aW9uIHJlbWFya3MuCitFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8VG9vbE91dHB1dEZpbGU+Pgorc2V0dXBPcHRpbWl6YXRpb25SZW1hcmtzKExMVk1Db250ZXh0ICZDb250ZXh0LCBTdHJpbmdSZWYgTFRPUmVtYXJrc0ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTFRPUGFzc1JlbWFya3NXaXRoSG90bmVzcywgaW50IENvdW50ID0gLTEpOworCitjbGFzcyBMVE87CitzdHJ1Y3QgU3ltYm9sUmVzb2x1dGlvbjsKK2NsYXNzIFRoaW5CYWNrZW5kUHJvYzsKKworLy8vIEFuIGlucHV0IGZpbGUuIFRoaXMgaXMgYSBzeW1ib2wgdGFibGUgd3JhcHBlciB0aGF0IG9ubHkgZXhwb3NlcyB0aGUKKy8vLyBpbmZvcm1hdGlvbiB0aGF0IGFuIExUTyBjbGllbnQgc2hvdWxkIG5lZWQgaW4gb3JkZXIgdG8gZG8gc3ltYm9sIHJlc29sdXRpb24uCitjbGFzcyBJbnB1dEZpbGUgeworcHVibGljOgorICBjbGFzcyBTeW1ib2w7CisKK3ByaXZhdGU6CisgIC8vIEZJWE1FOiBSZW1vdmUgTFRPIGNsYXNzIGZyaWVuZHNoaXAgb25jZSB3ZSBoYXZlIGJpdGNvZGUgc3ltYm9sIHRhYmxlcy4KKyAgZnJpZW5kIExUTzsKKyAgSW5wdXRGaWxlKCkgPSBkZWZhdWx0OworCisgIHN0ZDo6dmVjdG9yPEJpdGNvZGVNb2R1bGU+IE1vZHM7CisgIFNtYWxsVmVjdG9yPGNoYXIsIDA+IFN0cnRhYjsKKyAgc3RkOjp2ZWN0b3I8U3ltYm9sPiBTeW1ib2xzOworCisgIC8vIFtiZWdpbiwgZW5kKSBmb3IgZWFjaCBtb2R1bGUKKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90Pj4gTW9kdWxlU3ltSW5kaWNlczsKKworICBTdHJpbmdSZWYgVGFyZ2V0VHJpcGxlLCBTb3VyY2VGaWxlTmFtZSwgQ09GRkxpbmtlck9wdHM7CisgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gQ29tZGF0VGFibGU7CisKK3B1YmxpYzoKKyAgfklucHV0RmlsZSgpOworCisgIC8vLyBDcmVhdGUgYW4gSW5wdXRGaWxlLgorICBzdGF0aWMgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPElucHV0RmlsZT4+IGNyZWF0ZShNZW1vcnlCdWZmZXJSZWYgT2JqZWN0KTsKKworICAvLy8gVGhlIHB1cnBvc2Ugb2YgdGhpcyBjbGFzcyBpcyB0byBvbmx5IGV4cG9zZSB0aGUgc3ltYm9sIGluZm9ybWF0aW9uIHRoYXQgYW4KKyAgLy8vIExUTyBjbGllbnQgc2hvdWxkIG5lZWQgaW4gb3JkZXIgdG8gZG8gc3ltYm9sIHJlc29sdXRpb24uCisgIGNsYXNzIFN5bWJvbCA6IGlyc3ltdGFiOjpTeW1ib2wgeworICAgIGZyaWVuZCBMVE87CisKKyAgcHVibGljOgorICAgIFN5bWJvbChjb25zdCBpcnN5bXRhYjo6U3ltYm9sICZTKSA6IGlyc3ltdGFiOjpTeW1ib2woUykge30KKworICAgIHVzaW5nIGlyc3ltdGFiOjpTeW1ib2w6OmlzVW5kZWZpbmVkOworICAgIHVzaW5nIGlyc3ltdGFiOjpTeW1ib2w6OmlzQ29tbW9uOworICAgIHVzaW5nIGlyc3ltdGFiOjpTeW1ib2w6OmlzV2VhazsKKyAgICB1c2luZyBpcnN5bXRhYjo6U3ltYm9sOjppc0luZGlyZWN0OworICAgIHVzaW5nIGlyc3ltdGFiOjpTeW1ib2w6OmdldE5hbWU7CisgICAgdXNpbmcgaXJzeW10YWI6OlN5bWJvbDo6Z2V0VmlzaWJpbGl0eTsKKyAgICB1c2luZyBpcnN5bXRhYjo6U3ltYm9sOjpjYW5CZU9taXR0ZWRGcm9tU3ltYm9sVGFibGU7CisgICAgdXNpbmcgaXJzeW10YWI6OlN5bWJvbDo6aXNUTFM7CisgICAgdXNpbmcgaXJzeW10YWI6OlN5bWJvbDo6Z2V0Q29tZGF0SW5kZXg7CisgICAgdXNpbmcgaXJzeW10YWI6OlN5bWJvbDo6Z2V0Q29tbW9uU2l6ZTsKKyAgICB1c2luZyBpcnN5bXRhYjo6U3ltYm9sOjpnZXRDb21tb25BbGlnbm1lbnQ7CisgICAgdXNpbmcgaXJzeW10YWI6OlN5bWJvbDo6Z2V0Q09GRldlYWtFeHRlcm5hbEZhbGxiYWNrOworICAgIHVzaW5nIGlyc3ltdGFiOjpTeW1ib2w6OmdldFNlY3Rpb25OYW1lOworICAgIHVzaW5nIGlyc3ltdGFiOjpTeW1ib2w6OmlzRXhlY3V0YWJsZTsKKyAgfTsKKworICAvLy8gQSByYW5nZSBvdmVyIHRoZSBzeW1ib2xzIGluIHRoaXMgSW5wdXRGaWxlLgorICBBcnJheVJlZjxTeW1ib2w+IHN5bWJvbHMoKSBjb25zdCB7IHJldHVybiBTeW1ib2xzOyB9CisKKyAgLy8vIFJldHVybnMgbGlua2VyIG9wdGlvbnMgc3BlY2lmaWVkIGluIHRoZSBpbnB1dCBmaWxlLgorICBTdHJpbmdSZWYgZ2V0Q09GRkxpbmtlck9wdHMoKSBjb25zdCB7IHJldHVybiBDT0ZGTGlua2VyT3B0czsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBwYXRoIHRvIHRoZSBJbnB1dEZpbGUuCisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIGlucHV0IGZpbGUncyB0YXJnZXQgdHJpcGxlLgorICBTdHJpbmdSZWYgZ2V0VGFyZ2V0VHJpcGxlKCkgY29uc3QgeyByZXR1cm4gVGFyZ2V0VHJpcGxlOyB9CisKKyAgLy8vIFJldHVybnMgdGhlIHNvdXJjZSBmaWxlIHBhdGggc3BlY2lmaWVkIGF0IGNvbXBpbGUgdGltZS4KKyAgU3RyaW5nUmVmIGdldFNvdXJjZUZpbGVOYW1lKCkgY29uc3QgeyByZXR1cm4gU291cmNlRmlsZU5hbWU7IH0KKworICAvLyBSZXR1cm5zIGEgdGFibGUgd2l0aCBhbGwgdGhlIGNvbWRhdHMgdXNlZCBieSB0aGlzIGZpbGUuCisgIEFycmF5UmVmPFN0cmluZ1JlZj4gZ2V0Q29tZGF0VGFibGUoKSBjb25zdCB7IHJldHVybiBDb21kYXRUYWJsZTsgfQorCitwcml2YXRlOgorICBBcnJheVJlZjxTeW1ib2w+IG1vZHVsZV9zeW1ib2xzKHVuc2lnbmVkIEkpIGNvbnN0IHsKKyAgICBjb25zdCBhdXRvICZJbmRpY2VzID0gTW9kdWxlU3ltSW5kaWNlc1tJXTsKKyAgICByZXR1cm4ge1N5bWJvbHMuZGF0YSgpICsgSW5kaWNlcy5maXJzdCwgU3ltYm9scy5kYXRhKCkgKyBJbmRpY2VzLnNlY29uZH07CisgIH0KK307CisKKy8vLyBUaGlzIGNsYXNzIHdyYXBzIGFuIG91dHB1dCBzdHJlYW0gZm9yIGEgbmF0aXZlIG9iamVjdC4gTW9zdCBjbGllbnRzIHNob3VsZAorLy8vIGp1c3QgYmUgYWJsZSB0byByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhpcyBiYXNlIGNsYXNzIGZyb20gdGhlIHN0cmVhbQorLy8vIGNhbGxiYWNrLCBidXQgaWYgYSBjbGllbnQgbmVlZHMgdG8gcGVyZm9ybSBzb21lIGFjdGlvbiBhZnRlciB0aGUgc3RyZWFtIGlzCisvLy8gd3JpdHRlbiB0bywgdGhhdCBjYW4gYmUgZG9uZSBieSBkZXJpdmluZyBmcm9tIHRoaXMgY2xhc3MgYW5kIG92ZXJyaWRpbmcgdGhlCisvLy8gZGVzdHJ1Y3Rvci4KK2NsYXNzIE5hdGl2ZU9iamVjdFN0cmVhbSB7CitwdWJsaWM6CisgIE5hdGl2ZU9iamVjdFN0cmVhbShzdGQ6OnVuaXF1ZV9wdHI8cmF3X3B3cml0ZV9zdHJlYW0+IE9TKSA6IE9TKHN0ZDo6bW92ZShPUykpIHt9CisgIHN0ZDo6dW5pcXVlX3B0cjxyYXdfcHdyaXRlX3N0cmVhbT4gT1M7CisgIHZpcnR1YWwgfk5hdGl2ZU9iamVjdFN0cmVhbSgpID0gZGVmYXVsdDsKK307CisKKy8vLyBUaGlzIHR5cGUgZGVmaW5lcyB0aGUgY2FsbGJhY2sgdG8gYWRkIGEgbmF0aXZlIG9iamVjdCB0aGF0IGlzIGdlbmVyYXRlZCBvbgorLy8vIHRoZSBmbHkuCisvLy8KKy8vLyBTdHJlYW0gY2FsbGJhY2tzIG11c3QgYmUgdGhyZWFkIHNhZmUuCit0eXBlZGVmIHN0ZDo6ZnVuY3Rpb248c3RkOjp1bmlxdWVfcHRyPE5hdGl2ZU9iamVjdFN0cmVhbT4odW5zaWduZWQgVGFzayk+CisgICAgQWRkU3RyZWFtRm47CisKKy8vLyBUaGlzIGlzIHRoZSB0eXBlIG9mIGEgbmF0aXZlIG9iamVjdCBjYWNoZS4gVG8gcmVxdWVzdCBhbiBpdGVtIGZyb20gdGhlCisvLy8gY2FjaGUsIHBhc3MgYSB1bmlxdWUgc3RyaW5nIGFzIHRoZSBLZXkuIEZvciBoaXRzLCB0aGUgY2FjaGVkIGZpbGUgd2lsbCBiZQorLy8vIGFkZGVkIHRvIHRoZSBsaW5rIGFuZCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIEFkZFN0cmVhbUZuKCkuIEZvciBtaXNzZXMsCisvLy8gdGhlIGNhY2hlIHdpbGwgcmV0dXJuIGEgc3RyZWFtIGNhbGxiYWNrIHdoaWNoIG11c3QgYmUgY2FsbGVkIGF0IG1vc3Qgb25jZSB0bworLy8vIHByb2R1Y2UgY29udGVudCBmb3IgdGhlIHN0cmVhbS4gVGhlIG5hdGl2ZSBvYmplY3Qgc3RyZWFtIHByb2R1Y2VkIGJ5IHRoZQorLy8vIHN0cmVhbSBjYWxsYmFjayB3aWxsIGFkZCB0aGUgZmlsZSB0byB0aGUgbGluayBhZnRlciB0aGUgc3RyZWFtIGlzIHdyaXR0ZW4KKy8vLyB0by4KKy8vLworLy8vIENsaWVudHMgZ2VuZXJhbGx5IGxvb2sgbGlrZSB0aGlzOgorLy8vCisvLy8gaWYgKEFkZFN0cmVhbUZuIEFkZFN0cmVhbSA9IENhY2hlKFRhc2ssIEtleSkpCisvLy8gICBQcm9kdWNlQ29udGVudChBZGRTdHJlYW0pOwordHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPEFkZFN0cmVhbUZuKHVuc2lnbmVkIFRhc2ssIFN0cmluZ1JlZiBLZXkpPgorICAgIE5hdGl2ZU9iamVjdENhY2hlOworCisvLy8gQSBUaGluQmFja2VuZCBkZWZpbmVzIHdoYXQgaGFwcGVucyBhZnRlciB0aGUgdGhpbi1saW5rIHBoYXNlIGR1cmluZyBUaGluTFRPLgorLy8vIFRoZSBkZXRhaWxzIG9mIHRoaXMgdHlwZSBkZWZpbml0aW9uIGFyZW4ndCBpbXBvcnRhbnQ7IGNsaWVudHMgY2FuIG9ubHkKKy8vLyBjcmVhdGUgYSBUaGluQmFja2VuZCB1c2luZyBvbmUgb2YgdGhlIGNyZWF0ZSpUaGluQmFja2VuZCgpIGZ1bmN0aW9ucyBiZWxvdy4KK3R5cGVkZWYgc3RkOjpmdW5jdGlvbjxzdGQ6OnVuaXF1ZV9wdHI8VGhpbkJhY2tlbmRQcm9jPigKKyAgICBDb25maWcgJkMsIE1vZHVsZVN1bW1hcnlJbmRleCAmQ29tYmluZWRJbmRleCwKKyAgICBTdHJpbmdNYXA8R1ZTdW1tYXJ5TWFwVHk+ICZNb2R1bGVUb0RlZmluZWRHVlN1bW1hcmllcywKKyAgICBBZGRTdHJlYW1GbiBBZGRTdHJlYW0sIE5hdGl2ZU9iamVjdENhY2hlIENhY2hlKT4KKyAgICBUaGluQmFja2VuZDsKKworLy8vIFRoaXMgVGhpbkJhY2tlbmQgcnVucyB0aGUgaW5kaXZpZHVhbCBiYWNrZW5kIGpvYnMgaW4tcHJvY2Vzcy4KK1RoaW5CYWNrZW5kIGNyZWF0ZUluUHJvY2Vzc1RoaW5CYWNrZW5kKHVuc2lnbmVkIFBhcmFsbGVsaXNtTGV2ZWwpOworCisvLy8gVGhpcyBUaGluQmFja2VuZCB3cml0ZXMgaW5kaXZpZHVhbCBtb2R1bGUgaW5kZXhlcyB0byBmaWxlcywgaW5zdGVhZCBvZgorLy8vIHJ1bm5pbmcgdGhlIGluZGl2aWR1YWwgYmFja2VuZCBqb2JzLiBUaGlzIGJhY2tlbmQgaXMgZm9yIGRpc3RyaWJ1dGVkIGJ1aWxkcworLy8vIHdoZXJlIHNlcGFyYXRlIHByb2Nlc3NlcyB3aWxsIGludm9rZSB0aGUgcmVhbCBiYWNrZW5kcy4KKy8vLworLy8vIFRvIGZpbmQgdGhlIHBhdGggdG8gd3JpdGUgdGhlIGluZGV4IHRvLCB0aGUgYmFja2VuZCBjaGVja3MgaWYgdGhlIHBhdGggaGFzIGEKKy8vLyBwcmVmaXggb2YgT2xkUHJlZml4OyBpZiBzbywgaXQgcmVwbGFjZXMgdGhhdCBwcmVmaXggd2l0aCBOZXdQcmVmaXguIEl0IHRoZW4KKy8vLyBhcHBlbmRzICIudGhpbmx0by5iYyIgYW5kIHdyaXRlcyB0aGUgaW5kZXggdG8gdGhhdCBwYXRoLiBJZgorLy8vIFNob3VsZEVtaXRJbXBvcnRzRmlsZXMgaXMgdHJ1ZSBpdCBhbHNvIHdyaXRlcyBhIGxpc3Qgb2YgaW1wb3J0ZWQgZmlsZXMgdG8gYQorLy8vIHNpbWlsYXIgcGF0aCB3aXRoICIuaW1wb3J0cyIgYXBwZW5kZWQgaW5zdGVhZC4KKy8vLyBMaW5rZWRPYmplY3RzRmlsZSBpcyBhbiBvdXRwdXQgc3RyZWFtIHRvIHdyaXRlIHRoZSBsaXN0IG9mIG9iamVjdCBmaWxlcyBmb3IKKy8vLyB0aGUgZmluYWwgVGhpbkxUTyBsaW5raW5nLiBDYW4gYmUgbnVsbHB0ci4KKy8vLyBPbldyaXRlIGlzIGNhbGxiYWNrIHdoaWNoIHJlY2VpdmVzIG1vZHVsZSBpZGVudGlmaWVyIGFuZCBub3RpZmllcyBMVE8gdXNlcgorLy8vIHRoYXQgaW5kZXggZmlsZSBmb3IgdGhlIG1vZHVsZSAoYW5kIG9wdGlvbmFsbHkgaW1wb3J0cyBmaWxlKSB3YXMgY3JlYXRlZC4KK3VzaW5nIEluZGV4V3JpdGVDYWxsYmFjayA9IHN0ZDo6ZnVuY3Rpb248dm9pZChjb25zdCBzdGQ6OnN0cmluZyAmKT47CitUaGluQmFja2VuZCBjcmVhdGVXcml0ZUluZGV4ZXNUaGluQmFja2VuZChzdGQ6OnN0cmluZyBPbGRQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyBOZXdQcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZEVtaXRJbXBvcnRzRmlsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfZmRfb3N0cmVhbSAqTGlua2VkT2JqZWN0c0ZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleFdyaXRlQ2FsbGJhY2sgT25Xcml0ZSk7CisKKy8vLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSByZXNvbHV0aW9uLWJhc2VkIGludGVyZmFjZSB0byBMTFZNJ3MgTFRPCisvLy8gZnVuY3Rpb25hbGl0eS4gSXQgc3VwcG9ydHMgcmVndWxhciBMVE8sIHBhcmFsbGVsIExUTyBjb2RlIGdlbmVyYXRpb24gYW5kCisvLy8gVGhpbkxUTy4gWW91IGNhbiB1c2UgaXQgZnJvbSBhIGxpbmtlciBpbiB0aGUgZm9sbG93aW5nIHdheToKKy8vLyAtIFNldCBob29rcyBhbmQgY29kZSBnZW5lcmF0aW9uIG9wdGlvbnMgKHNlZSBsdG86OkNvbmZpZyBzdHJ1Y3QgZGVmaW5lZCBpbgorLy8vICAgQ29uZmlnLmgpLCBhbmQgdXNlIHRoZSBsdG86OkNvbmZpZyBvYmplY3QgdG8gY3JlYXRlIGFuIGx0bzo6TFRPIG9iamVjdC4KKy8vLyAtIENyZWF0ZSBsdG86OklucHV0RmlsZSBvYmplY3RzIHVzaW5nIGx0bzo6SW5wdXRGaWxlOjpjcmVhdGUoKSwgdGhlbiB1c2UKKy8vLyAgIHRoZSBzeW1ib2xzKCkgZnVuY3Rpb24gdG8gZW51bWVyYXRlIGl0cyBzeW1ib2xzIGFuZCBjb21wdXRlIGEgcmVzb2x1dGlvbgorLy8vICAgZm9yIGVhY2ggc3ltYm9sIChzZWUgU3ltYm9sUmVzb2x1dGlvbiBiZWxvdykuCisvLy8gLSBBZnRlciB0aGUgbGlua2VyIGhhcyB2aXNpdGVkIGVhY2ggaW5wdXQgZmlsZSAoYW5kIGVhY2ggcmVndWxhciBvYmplY3QKKy8vLyAgIGZpbGUpIGFuZCBjb21wdXRlZCBhIHJlc29sdXRpb24gZm9yIGVhY2ggc3ltYm9sLCB0YWtlIGVhY2ggbHRvOjpJbnB1dEZpbGUKKy8vLyAgIGFuZCBwYXNzIGl0IGFuZCBhbiBhcnJheSBvZiBzeW1ib2wgcmVzb2x1dGlvbnMgdG8gdGhlIGFkZCgpIGZ1bmN0aW9uLgorLy8vIC0gQ2FsbCB0aGUgZ2V0TWF4VGFza3MoKSBmdW5jdGlvbiB0byBnZXQgYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZgorLy8vICAgbmF0aXZlIG9iamVjdCBmaWxlcyB0aGF0IExUTyBtYXkgYWRkIHRvIHRoZSBsaW5rLgorLy8vIC0gQ2FsbCB0aGUgcnVuKCkgZnVuY3Rpb24uIFRoaXMgZnVuY3Rpb24gd2lsbCB1c2UgdGhlIHN1cHBsaWVkIEFkZFN0cmVhbQorLy8vICAgYW5kIENhY2hlIGZ1bmN0aW9ucyB0byBhZGQgdXAgdG8gZ2V0TWF4VGFza3MoKSBuYXRpdmUgb2JqZWN0IGZpbGVzIHRvCisvLy8gICB0aGUgbGluay4KK2NsYXNzIExUTyB7CisgIGZyaWVuZCBJbnB1dEZpbGU7CisKK3B1YmxpYzoKKyAgLy8vIENyZWF0ZSBhbiBMVE8gb2JqZWN0LiBBIGRlZmF1bHQgY29uc3RydWN0ZWQgTFRPIG9iamVjdCBoYXMgYSByZWFzb25hYmxlCisgIC8vLyBwcm9kdWN0aW9uIGNvbmZpZ3VyYXRpb24sIGJ1dCB5b3UgY2FuIGN1c3RvbWl6ZSBpdCBieSBwYXNzaW5nIGFyZ3VtZW50cyB0bworICAvLy8gdGhpcyBjb25zdHJ1Y3Rvci4KKyAgLy8vIEZJWE1FOiBXZSBkbyBjdXJyZW50bHkgcmVxdWlyZSB0aGUgRGlhZ0hhbmRsZXIgZmllbGQgdG8gYmUgc2V0IGluIENvbmYuCisgIC8vLyBVbnRpbCB0aGF0IGlzIGZpeGVkLCBhIENvbmZpZyBhcmd1bWVudCBpcyByZXF1aXJlZC4KKyAgTFRPKENvbmZpZyBDb25mLCBUaGluQmFja2VuZCBCYWNrZW5kID0gbnVsbHB0ciwKKyAgICAgIHVuc2lnbmVkIFBhcmFsbGVsQ29kZUdlblBhcmFsbGVsaXNtTGV2ZWwgPSAxKTsKKyAgfkxUTygpOworCisgIC8vLyBBZGQgYW4gaW5wdXQgZmlsZSB0byB0aGUgTFRPIGxpbmssIHVzaW5nIHRoZSBwcm92aWRlZCBzeW1ib2wgcmVzb2x1dGlvbnMuCisgIC8vLyBUaGUgc3ltYm9sIHJlc29sdXRpb25zIG11c3QgYXBwZWFyIGluIHRoZSBlbnVtZXJhdGlvbiBvcmRlciBnaXZlbiBieQorICAvLy8gSW5wdXRGaWxlOjpzeW1ib2xzKCkuCisgIEVycm9yIGFkZChzdGQ6OnVuaXF1ZV9wdHI8SW5wdXRGaWxlPiBPYmosIEFycmF5UmVmPFN5bWJvbFJlc29sdXRpb24+IFJlcyk7CisKKyAgLy8vIFJldHVybnMgYW4gdXBwZXIgYm91bmQgb24gdGhlIG51bWJlciBvZiB0YXNrcyB0aGF0IHRoZSBjbGllbnQgbWF5IGV4cGVjdC4KKyAgLy8vIFRoaXMgbWF5IG9ubHkgYmUgY2FsbGVkIGFmdGVyIGFsbCBJUiBvYmplY3QgZmlsZXMgaGF2ZSBiZWVuIGFkZGVkLiBGb3IgYQorICAvLy8gZnVsbCBkZXNjcmlwdGlvbiBvZiB0YXNrcyBzZWUgTFRPQmFja2VuZC5oLgorICB1bnNpZ25lZCBnZXRNYXhUYXNrcygpIGNvbnN0OworCisgIC8vLyBSdW5zIHRoZSBMVE8gcGlwZWxpbmUuIFRoaXMgZnVuY3Rpb24gY2FsbHMgdGhlIHN1cHBsaWVkIEFkZFN0cmVhbQorICAvLy8gZnVuY3Rpb24gdG8gYWRkIG5hdGl2ZSBvYmplY3QgZmlsZXMgdG8gdGhlIGxpbmsuCisgIC8vLworICAvLy8gVGhlIENhY2hlIHBhcmFtZXRlciBpcyBvcHRpb25hbC4gSWYgc3VwcGxpZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBjYWNoZQorICAvLy8gbmF0aXZlIG9iamVjdCBmaWxlcyBhbmQgYWRkIHRoZW0gdG8gdGhlIGxpbmsuCisgIC8vLworICAvLy8gVGhlIGNsaWVudCB3aWxsIHJlY2VpdmUgYXQgbW9zdCBvbmUgY2FsbGJhY2sgKHZpYSBlaXRoZXIgQWRkU3RyZWFtIG9yCisgIC8vLyBDYWNoZSkgZm9yIGVhY2ggdGFzayBpZGVudGlmaWVyLgorICBFcnJvciBydW4oQWRkU3RyZWFtRm4gQWRkU3RyZWFtLCBOYXRpdmVPYmplY3RDYWNoZSBDYWNoZSA9IG51bGxwdHIpOworCitwcml2YXRlOgorICBDb25maWcgQ29uZjsKKworICBzdHJ1Y3QgUmVndWxhckxUT1N0YXRlIHsKKyAgICBSZWd1bGFyTFRPU3RhdGUodW5zaWduZWQgUGFyYWxsZWxDb2RlR2VuUGFyYWxsZWxpc21MZXZlbCwgQ29uZmlnICZDb25mKTsKKyAgICBzdHJ1Y3QgQ29tbW9uUmVzb2x1dGlvbiB7CisgICAgICB1aW50NjRfdCBTaXplID0gMDsKKyAgICAgIHVuc2lnbmVkIEFsaWduID0gMDsKKyAgICAgIC8vLyBSZWNvcmQgaWYgYXQgbGVhc3Qgb25lIGluc3RhbmNlIG9mIHRoZSBjb21tb24gd2FzIG1hcmtlZCBhcyBwcmV2YWlsaW5nCisgICAgICBib29sIFByZXZhaWxpbmcgPSBmYWxzZTsKKyAgICB9OworICAgIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBDb21tb25SZXNvbHV0aW9uPiBDb21tb25zOworCisgICAgdW5zaWduZWQgUGFyYWxsZWxDb2RlR2VuUGFyYWxsZWxpc21MZXZlbDsKKyAgICBMVE9MTFZNQ29udGV4dCBDdHg7CisgICAgc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gQ29tYmluZWRNb2R1bGU7CisgICAgc3RkOjp1bmlxdWVfcHRyPElSTW92ZXI+IE1vdmVyOworCisgICAgLy8gVGhpcyBzdG9yZXMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGEgcmVndWxhciBMVE8gbW9kdWxlIHRoYXQgd2UgaGF2ZSBhZGRlZAorICAgIC8vIHRvIHRoZSBsaW5rLiBJdCB3aWxsIGVpdGhlciBiZSBsaW5rZWQgaW1tZWRpYXRlbHkgKGZvciBtb2R1bGVzIHdpdGhvdXQKKyAgICAvLyBzdW1tYXJpZXMpIG9yIGFmdGVyIHN1bW1hcnktYmFzZWQgZGVhZCBzdHJpcHBpbmcgKGZvciBtb2R1bGVzIHdpdGgKKyAgICAvLyBzdW1tYXJpZXMpLgorICAgIHN0cnVjdCBBZGRlZE1vZHVsZSB7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBNOworICAgICAgc3RkOjp2ZWN0b3I8R2xvYmFsVmFsdWUgKj4gS2VlcDsKKyAgICB9OworICAgIHN0ZDo6dmVjdG9yPEFkZGVkTW9kdWxlPiBNb2RzV2l0aFN1bW1hcmllczsKKyAgfSBSZWd1bGFyTFRPOworCisgIHN0cnVjdCBUaGluTFRPU3RhdGUgeworICAgIFRoaW5MVE9TdGF0ZShUaGluQmFja2VuZCBCYWNrZW5kKTsKKworICAgIFRoaW5CYWNrZW5kIEJhY2tlbmQ7CisgICAgTW9kdWxlU3VtbWFyeUluZGV4IENvbWJpbmVkSW5kZXg7CisgICAgTWFwVmVjdG9yPFN0cmluZ1JlZiwgQml0Y29kZU1vZHVsZT4gTW9kdWxlTWFwOworICAgIERlbnNlTWFwPEdsb2JhbFZhbHVlOjpHVUlELCBTdHJpbmdSZWY+IFByZXZhaWxpbmdNb2R1bGVGb3JHVUlEOworICB9IFRoaW5MVE87CisKKyAgLy8gVGhlIGdsb2JhbCByZXNvbHV0aW9uIGZvciBhIHBhcnRpY3VsYXIgKG1hbmdsZWQpIHN5bWJvbCBuYW1lLiBUaGlzIGlzIGluCisgIC8vIHBhcnRpY3VsYXIgbmVjZXNzYXJ5IHRvIHRyYWNrIHdoZXRoZXIgZWFjaCBzeW1ib2wgY2FuIGJlIGludGVybmFsaXplZC4KKyAgLy8gQmVjYXVzZSBhbnkgaW5wdXQgZmlsZSBtYXkgaW50cm9kdWNlIGEgbmV3IGNyb3NzLXBhcnRpdGlvbiByZWZlcmVuY2UsIHdlCisgIC8vIGNhbm5vdCBtYWtlIGFueSBmaW5hbCBpbnRlcm5hbGl6YXRpb24gZGVjaXNpb25zIHVudGlsIGFsbCBpbnB1dCBmaWxlcyBoYXZlCisgIC8vIGJlZW4gYWRkZWQgYW5kIHRoZSBjbGllbnQgaGFzIGNhbGxlZCBydW4oKS4gRHVyaW5nIHJ1bigpIHdlIGFwcGx5CisgIC8vIGludGVybmFsaXphdGlvbiBkZWNpc2lvbnMgZWl0aGVyIGRpcmVjdGx5IHRvIHRoZSBtb2R1bGUgKGZvciByZWd1bGFyIExUTykKKyAgLy8gb3IgdG8gdGhlIGNvbWJpbmVkIGluZGV4IChmb3IgVGhpbkxUTykuCisgIHN0cnVjdCBHbG9iYWxSZXNvbHV0aW9uIHsKKyAgICAvLy8gVGhlIHVubWFuZ2xlZCBuYW1lIG9mIHRoZSBnbG9iYWwuCisgICAgc3RkOjpzdHJpbmcgSVJOYW1lOworCisgICAgLy8vIEtlZXAgdHJhY2sgaWYgdGhlIHN5bWJvbCBpcyB2aXNpYmxlIG91dHNpZGUgb2YgYSBtb2R1bGUgd2l0aCBhIHN1bW1hcnkKKyAgICAvLy8gKGkuZS4gaW4gZWl0aGVyIGEgcmVndWxhciBvYmplY3Qgb3IgYSByZWd1bGFyIExUTyBtb2R1bGUgd2l0aG91dCBhCisgICAgLy8vIHN1bW1hcnkpLgorICAgIGJvb2wgVmlzaWJsZU91dHNpZGVTdW1tYXJ5ID0gZmFsc2U7CisKKyAgICBib29sIFVubmFtZWRBZGRyID0gdHJ1ZTsKKworICAgIC8vLyBUcnVlIGlmIG1vZHVsZSBjb250YWlucyB0aGUgcHJldmFpbGluZyBkZWZpbml0aW9uLgorICAgIGJvb2wgUHJldmFpbGluZyA9IGZhbHNlOworCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBtb2R1bGUgY29udGFpbnMgdGhlIHByZXZhaWxpbmcgZGVmaW5pdGlvbiBhbmQgc3ltYm9sIGlzCisgICAgLy8vIGFuIElSIHN5bWJvbC4gRm9yIGV4YW1wbGUgd2hlbiBtb2R1bGUtbGV2ZWwgaW5saW5lIGFzbSBibG9jayBpcyB1c2VkLAorICAgIC8vLyBzeW1ib2wgY2FuIGJlIHByZXZhaWxpbmcgaW4gbW9kdWxlIGJ1dCBoYXZlIG5vIElSIG5hbWUuCisgICAgYm9vbCBpc1ByZXZhaWxpbmdJUlN5bWJvbCgpIGNvbnN0IHsgcmV0dXJuIFByZXZhaWxpbmcgJiYgIUlSTmFtZS5lbXB0eSgpOyB9CisKKyAgICAvLy8gVGhpcyBmaWVsZCBrZWVwcyB0cmFjayBvZiB0aGUgcGFydGl0aW9uIG51bWJlciBvZiB0aGlzIGdsb2JhbC4gVGhlCisgICAgLy8vIHJlZ3VsYXIgTFRPIG9iamVjdCBpcyBwYXJ0aXRpb24gMCwgd2hpbGUgZWFjaCBUaGluTFRPIG9iamVjdCBoYXMgaXRzIG93bgorICAgIC8vLyBwYXJ0aXRpb24gbnVtYmVyIGZyb20gMSBvbndhcmRzLgorICAgIC8vLworICAgIC8vLyBBbnkgZ2xvYmFsIHRoYXQgaXMgZGVmaW5lZCBvciB1c2VkIGJ5IG1vcmUgdGhhbiBvbmUgcGFydGl0aW9uLCBvciB0aGF0CisgICAgLy8vIGlzIHJlZmVyZW5jZWQgZXh0ZXJuYWxseSwgbWF5IG5vdCBiZSBpbnRlcm5hbGl6ZWQuCisgICAgLy8vCisgICAgLy8vIFBhcnRpdGlvbnMgZ2VuZXJhbGx5IGhhdmUgYSBvbmUtdG8tb25lIGNvcnJlc3BvbmRlbmNlIHdpdGggdGFza3MsIGV4Y2VwdAorICAgIC8vLyB0aGF0IHdlIHVzZSBwYXJ0aXRpb24gMCBmb3IgYWxsIHBhcmFsbGVsIExUTyBjb2RlIGdlbmVyYXRpb24gcGFydGl0aW9ucy4KKyAgICAvLy8gQW55IHBhcnRpdGlvbmluZyBvZiB0aGUgY29tYmluZWQgTFRPIG9iamVjdCBpcyBkb25lIGludGVybmFsbHkgYnkgdGhlCisgICAgLy8vIExUTyBiYWNrZW5kLgorICAgIHVuc2lnbmVkIFBhcnRpdGlvbiA9IFVua25vd247CisKKyAgICAvLy8gU3BlY2lhbCBwYXJ0aXRpb24gbnVtYmVycy4KKyAgICBlbnVtIDogdW5zaWduZWQgeworICAgICAgLy8vIEEgcGFydGl0aW9uIG51bWJlciBoYXMgbm90IHlldCBiZWVuIGFzc2lnbmVkIHRvIHRoaXMgZ2xvYmFsLgorICAgICAgVW5rbm93biA9IC0xdSwKKworICAgICAgLy8vIFRoaXMgZ2xvYmFsIGlzIGVpdGhlciB1c2VkIGJ5IG1vcmUgdGhhbiBvbmUgcGFydGl0aW9uIG9yIGhhcyBhbgorICAgICAgLy8vIGV4dGVybmFsIHJlZmVyZW5jZSwgYW5kIHRoZXJlZm9yZSBjYW5ub3QgYmUgaW50ZXJuYWxpemVkLgorICAgICAgRXh0ZXJuYWwgPSAtMnUsCisKKyAgICAgIC8vLyBUaGUgUmVndWxhckxUTyBwYXJ0aXRpb24KKyAgICAgIFJlZ3VsYXJMVE8gPSAwLAorICAgIH07CisgIH07CisKKyAgLy8gR2xvYmFsIG1hcHBpbmcgZnJvbSBtYW5nbGVkIHN5bWJvbCBuYW1lcyB0byByZXNvbHV0aW9ucy4KKyAgU3RyaW5nTWFwPEdsb2JhbFJlc29sdXRpb24+IEdsb2JhbFJlc29sdXRpb25zOworCisgIHZvaWQgYWRkTW9kdWxlVG9HbG9iYWxSZXMoQXJyYXlSZWY8SW5wdXRGaWxlOjpTeW1ib2w+IFN5bXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U3ltYm9sUmVzb2x1dGlvbj4gUmVzLCB1bnNpZ25lZCBQYXJ0aXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJblN1bW1hcnkpOworCisgIC8vIFRoZXNlIGZ1bmN0aW9ucyB0YWtlIGEgcmFuZ2Ugb2Ygc3ltYm9sIHJlc29sdXRpb25zIFtSZXNJLCBSZXNFKSBhbmQgY29uc3VtZQorICAvLyB0aGUgcmVzb2x1dGlvbnMgdXNlZCBieSBhIHNpbmdsZSBpbnB1dCBtb2R1bGUgYnkgaW5jcmVtZW50aW5nIFJlc0kuIEFmdGVyCisgIC8vIHRoZXNlIGZ1bmN0aW9ucyByZXR1cm4sIFtSZXNJLCBSZXNFKSB3aWxsIHJlZmVyIHRvIHRoZSByZXNvbHV0aW9uIHJhbmdlIGZvcgorICAvLyB0aGUgcmVtYWluaW5nIG1vZHVsZXMgaW4gdGhlIElucHV0RmlsZS4KKyAgRXJyb3IgYWRkTW9kdWxlKElucHV0RmlsZSAmSW5wdXQsIHVuc2lnbmVkIE1vZEksCisgICAgICAgICAgICAgICAgICBjb25zdCBTeW1ib2xSZXNvbHV0aW9uIComUmVzSSwgY29uc3QgU3ltYm9sUmVzb2x1dGlvbiAqUmVzRSk7CisKKyAgRXhwZWN0ZWQ8UmVndWxhckxUT1N0YXRlOjpBZGRlZE1vZHVsZT4KKyAgYWRkUmVndWxhckxUTyhCaXRjb2RlTW9kdWxlIEJNLCBBcnJheVJlZjxJbnB1dEZpbGU6OlN5bWJvbD4gU3ltcywKKyAgICAgICAgICAgICAgICBjb25zdCBTeW1ib2xSZXNvbHV0aW9uIComUmVzSSwgY29uc3QgU3ltYm9sUmVzb2x1dGlvbiAqUmVzRSk7CisgIEVycm9yIGxpbmtSZWd1bGFyTFRPKFJlZ3VsYXJMVE9TdGF0ZTo6QWRkZWRNb2R1bGUgTW9kLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIExpdmVuZXNzRnJvbUluZGV4KTsKKworICBFcnJvciBhZGRUaGluTFRPKEJpdGNvZGVNb2R1bGUgQk0sIEFycmF5UmVmPElucHV0RmlsZTo6U3ltYm9sPiBTeW1zLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IFN5bWJvbFJlc29sdXRpb24gKiZSZXNJLCBjb25zdCBTeW1ib2xSZXNvbHV0aW9uICpSZXNFKTsKKworICBFcnJvciBydW5SZWd1bGFyTFRPKEFkZFN0cmVhbUZuIEFkZFN0cmVhbSk7CisgIEVycm9yIHJ1blRoaW5MVE8oQWRkU3RyZWFtRm4gQWRkU3RyZWFtLCBOYXRpdmVPYmplY3RDYWNoZSBDYWNoZSk7CisKKyAgbXV0YWJsZSBib29sIENhbGxlZEdldE1heFRhc2tzID0gZmFsc2U7Cit9OworCisvLy8gVGhlIHJlc29sdXRpb24gZm9yIGEgc3ltYm9sLiBUaGUgbGlua2VyIG11c3QgcHJvdmlkZSBhIFN5bWJvbFJlc29sdXRpb24gZm9yCisvLy8gZWFjaCBnbG9iYWwgc3ltYm9sIGJhc2VkIG9uIGl0cyBpbnRlcm5hbCByZXNvbHV0aW9uIG9mIHRoYXQgc3ltYm9sLgorc3RydWN0IFN5bWJvbFJlc29sdXRpb24geworICBTeW1ib2xSZXNvbHV0aW9uKCkKKyAgICAgIDogUHJldmFpbGluZygwKSwgRmluYWxEZWZpbml0aW9uSW5MaW5rYWdlVW5pdCgwKSwgVmlzaWJsZVRvUmVndWxhck9iaigwKSwKKyAgICAgICAgTGlua2VyUmVkZWZpbmVkKDApIHt9CisKKyAgLy8vIFRoZSBsaW5rZXIgaGFzIGNob3NlbiB0aGlzIGRlZmluaXRpb24gb2YgdGhlIHN5bWJvbC4KKyAgdW5zaWduZWQgUHJldmFpbGluZyA6IDE7CisKKyAgLy8vIFRoZSBkZWZpbml0aW9uIG9mIHRoaXMgc3ltYm9sIGlzIHVucHJlZW1wdGFibGUgYXQgcnVudGltZSBhbmQgaXMga25vd24gdG8KKyAgLy8vIGJlIGluIHRoaXMgbGlua2FnZSB1bml0LgorICB1bnNpZ25lZCBGaW5hbERlZmluaXRpb25JbkxpbmthZ2VVbml0IDogMTsKKworICAvLy8gVGhlIGRlZmluaXRpb24gb2YgdGhpcyBzeW1ib2wgaXMgdmlzaWJsZSBvdXRzaWRlIG9mIHRoZSBMVE8gdW5pdC4KKyAgdW5zaWduZWQgVmlzaWJsZVRvUmVndWxhck9iaiA6IDE7CisKKyAgLy8vIExpbmtlciByZWRlZmluZWQgdmVyc2lvbiBvZiB0aGUgc3ltYm9sIHdoaWNoIGFwcGVhcmVkIGluIC13cmFwIG9yIC1kZWZzeW0KKyAgLy8vIGxpbmtlciBvcHRpb24uCisgIHVuc2lnbmVkIExpbmtlclJlZGVmaW5lZCA6IDE7Cit9OworCit9IC8vIG5hbWVzcGFjZSBsdG8KK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xUTy9MVE9CYWNrZW5kLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xUTy9MVE9CYWNrZW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ3NDNmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTFRPL0xUT0JhY2tlbmQuaApAQCAtMCwwICsxLDUyIEBACisvLz09PS1MVE9CYWNrZW5kLmggLSBMTFZNIExpbmsgVGltZSBPcHRpbWl6ZXIgQmFja2VuZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSAiYmFja2VuZCIgcGhhc2Ugb2YgTFRPLCBpLmUuIGl0IHBlcmZvcm1zCisvLyBvcHRpbWl6YXRpb24gYW5kIGNvZGUgZ2VuZXJhdGlvbiBvbiBhIGxvYWRlZCBtb2R1bGUuIEl0IGlzIGdlbmVyYWxseSB1c2VkCisvLyBpbnRlcm5hbGx5IGJ5IHRoZSBMVE8gY2xhc3MgYnV0IGNhbiBhbHNvIGJlIHVzZWQgaW5kZXBlbmRlbnRseSwgZm9yIGV4YW1wbGUKKy8vIHRvIGltcGxlbWVudCBhIHN0YW5kYWxvbmUgVGhpbkxUTyBiYWNrZW5kLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9MVE9fTFRPQkFDS0VORF9ICisjZGVmaW5lIExMVk1fTFRPX0xUT0JBQ0tFTkRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvTWFwVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EaWFnbm9zdGljSW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlU3VtbWFyeUluZGV4LmgiCisjaW5jbHVkZSAibGx2bS9MVE8vTFRPLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvSVBPL0Z1bmN0aW9uSW1wb3J0LmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQml0Y29kZU1vZHVsZTsKK2NsYXNzIEVycm9yOworY2xhc3MgTW9kdWxlOworY2xhc3MgVGFyZ2V0OworCituYW1lc3BhY2UgbHRvIHsKKworLy8vIFJ1bnMgYSByZWd1bGFyIExUTyBiYWNrZW5kLiBUaGUgcmVndWxhciBMVE8gYmFja2VuZCBjYW4gYWxzbyBhY3QgYXMgdGhlCisvLy8gcmVndWxhciBMVE8gcGhhc2Ugb2YgVGhpbkxUTywgd2hpY2ggbWF5IG5lZWQgdG8gYWNjZXNzIHRoZSBjb21iaW5lZCBpbmRleC4KK0Vycm9yIGJhY2tlbmQoQ29uZmlnICZDLCBBZGRTdHJlYW1GbiBBZGRTdHJlYW0sCisgICAgICAgICAgICAgIHVuc2lnbmVkIFBhcmFsbGVsQ29kZUdlblBhcmFsbGVsaXNtTGV2ZWwsCisgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IE0sIE1vZHVsZVN1bW1hcnlJbmRleCAmQ29tYmluZWRJbmRleCk7CisKKy8vLyBSdW5zIGEgVGhpbkxUTyBiYWNrZW5kLgorRXJyb3IgdGhpbkJhY2tlbmQoQ29uZmlnICZDLCB1bnNpZ25lZCBUYXNrLCBBZGRTdHJlYW1GbiBBZGRTdHJlYW0sIE1vZHVsZSAmTSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZVN1bW1hcnlJbmRleCAmQ29tYmluZWRJbmRleCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEZ1bmN0aW9uSW1wb3J0ZXI6OkltcG9ydE1hcFR5ICZJbXBvcnRMaXN0LAorICAgICAgICAgICAgICAgICAgY29uc3QgR1ZTdW1tYXJ5TWFwVHkgJkRlZmluZWRHbG9iYWxzLAorICAgICAgICAgICAgICAgICAgTWFwVmVjdG9yPFN0cmluZ1JlZiwgQml0Y29kZU1vZHVsZT4gJk1vZHVsZU1hcCk7Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MVE8vbGVnYWN5L0xUT0NvZGVHZW5lcmF0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTFRPL2xlZ2FjeS9MVE9Db2RlR2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ4YWIwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTFRPL2xlZ2FjeS9MVE9Db2RlR2VuZXJhdG9yLmgKQEAgLTAsMCArMSwyNDQgQEAKKy8vPT09LUxUT0NvZGVHZW5lcmF0b3IuaCAtIExMVk0gTGluayBUaW1lIE9wdGltaXplciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBMVE9Db2RlR2VuZXJhdG9yIGNsYXNzLgorLy8KKy8vICAgTFRPIGNvbXBpbGF0aW9uIGNvbnNpc3RzIG9mIHRocmVlIHBoYXNlczogUHJlLUlQTywgSVBPIGFuZCBQb3N0LUlQTy4KKy8vCisvLyAgIFRoZSBQcmUtSVBPIHBoYXNlIGNvbXBpbGVzIHNvdXJjZSBjb2RlIGludG8gYml0Y29kZSBmaWxlLiBUaGUgcmVzdWx0aW5nCisvLyBiaXRjb2RlIGZpbGVzLCBhbG9uZyB3aXRoIG9iamVjdCBmaWxlcyBhbmQgbGlicmFyaWVzLCB3aWxsIGJlIGZlZCB0byB0aGUKKy8vIGxpbmtlciB0byB0aHJvdWdoIHRoZSBJUE8gYW5kIFBvc3QtSVBPIHBoYXNlcy4gQnkgdXNpbmcgb2JqLWZpbGUgZXh0ZW5zaW9uLAorLy8gdGhlIHJlc3VsdGluZyBiaXRjb2RlIGZpbGUgZGlzZ3Vpc2VzIGl0c2VsZiBhcyBhbiBvYmplY3QgZmlsZSwgYW5kIHRoZXJlZm9yZQorLy8gb2J2aWF0ZXMgdGhlIG5lZWQgb2Ygd3JpdGluZyBhIHNwZWNpYWwgc2V0IG9mIHRoZSBtYWtlLXJ1bGVzIG9ubHkgZm9yIExUTworLy8gY29tcGlsYXRpb24uCisvLworLy8gICBUaGUgSVBPIHBoYXNlIHBlcmZvcm0gaW50ZXItcHJvY2VkdXJhbCBhbmFseXNlcyBhbmQgb3B0aW1pemF0aW9ucywgYW5kCisvLyB0aGUgUG9zdC1JUE8gY29uc2lzdHMgdHdvIHN1Yi1waGFzZXM6IGludHJhLXByb2NlZHVyYWwgc2NhbGFyIG9wdGltaXphdGlvbnMKKy8vIChTT1BUKSwgYW5kIGludHJhLXByb2NlZHVyYWwgdGFyZ2V0LWRlcGVuZGVudCBjb2RlIGdlbmVyYXRvciAoQ0cpLgorLy8KKy8vICAgQXMgb2YgdGhpcyB3cml0aW5nLCB3ZSBkb24ndCBzZXBhcmF0ZSBJUE8gYW5kIHRoZSBQb3N0LUlQTyBTT1BULiBUaGV5CisvLyBhcmUgaW50ZXJtaW5nbGVkIHRvZ2V0aGVyLCBhbmQgYXJlIGRyaXZlbiBieSBhIHNpbmdsZSBwYXNzIG1hbmFnZXIgKHNlZQorLy8gUGFzc01hbmFnZXJCdWlsZGVyOjpwb3B1bGF0ZUxUT1Bhc3NNYW5hZ2VyKCkpLgorLy8KKy8vICAgVGhlICJMVE9Db2RlR2VuZXJhdG9yIiBpcyB0aGUgZHJpdmVyIGZvciB0aGUgSVBPIGFuZCBQb3N0LUlQTyBzdGFnZXMuCisvLyBUaGUgIkNvZGVHZW5lcmF0b3IiIGhlcmUgaXMgYml0IGNvbmZ1c2luZy4gRG9uJ3QgY29uZnVzZSB0aGUgIkNvZGVHZW5lcmF0b3IiCisvLyB3aXRoIHRoZSBtYWNoaW5lIHNwZWNpZmljIGNvZGUgZ2VuZXJhdG9yLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9MVE9fTFRPQ09ERUdFTkVSQVRPUl9ICisjZGVmaW5lIExMVk1fTFRPX0xUT0NPREVHRU5FUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS1jL2x0by5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9JUi9HbG9iYWxWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1Rvb2xPdXRwdXRGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7CisgIGNsYXNzIExMVk1Db250ZXh0OworICBjbGFzcyBEaWFnbm9zdGljSW5mbzsKKyAgY2xhc3MgTGlua2VyOworICBjbGFzcyBNYW5nbGVyOworICBjbGFzcyBNZW1vcnlCdWZmZXI7CisgIGNsYXNzIFRhcmdldExpYnJhcnlJbmZvOworICBjbGFzcyBUYXJnZXRNYWNoaW5lOworICBjbGFzcyByYXdfb3N0cmVhbTsKKyAgY2xhc3MgcmF3X3B3cml0ZV9zdHJlYW07CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQysrIGNsYXNzIHdoaWNoIGltcGxlbWVudHMgdGhlIG9wYXF1ZSBsdG9fY29kZV9nZW5fdCB0eXBlLgorLy8vCitzdHJ1Y3QgTFRPQ29kZUdlbmVyYXRvciB7CisgIHN0YXRpYyBjb25zdCBjaGFyICpnZXRWZXJzaW9uU3RyaW5nKCk7CisKKyAgTFRPQ29kZUdlbmVyYXRvcihMTFZNQ29udGV4dCAmQ29udGV4dCk7CisgIH5MVE9Db2RlR2VuZXJhdG9yKCk7CisKKyAgLy8vIE1lcmdlIGdpdmVuIG1vZHVsZS4gIFJldHVybiB0cnVlIG9uIHN1Y2Nlc3MuCisgIC8vLworICAvLy8gUmVzZXRzIFxhIEhhc1ZlcmlmaWVkSW5wdXQuCisgIGJvb2wgYWRkTW9kdWxlKHN0cnVjdCBMVE9Nb2R1bGUgKik7CisKKyAgLy8vIFNldCB0aGUgZGVzdGluYXRpb24gbW9kdWxlLgorICAvLy8KKyAgLy8vIFJlc2V0cyBcYSBIYXNWZXJpZmllZElucHV0LgorICB2b2lkIHNldE1vZHVsZShzdGQ6OnVuaXF1ZV9wdHI8TFRPTW9kdWxlPiBNKTsKKworICB2b2lkIHNldEFzbVVuZGVmaW5lZFJlZnMoc3RydWN0IExUT01vZHVsZSAqKTsKKyAgdm9pZCBzZXRUYXJnZXRPcHRpb25zKGNvbnN0IFRhcmdldE9wdGlvbnMgJk9wdGlvbnMpOworICB2b2lkIHNldERlYnVnSW5mbyhsdG9fZGVidWdfbW9kZWwpOworICB2b2lkIHNldENvZGVQSUNNb2RlbChPcHRpb25hbDxSZWxvYzo6TW9kZWw+IE1vZGVsKSB7IFJlbG9jTW9kZWwgPSBNb2RlbDsgfQorCisgIC8vLyBTZXQgdGhlIGZpbGUgdHlwZSB0byBiZSBlbWl0dGVkIChhc3NlbWJseSBvciBvYmplY3QgY29kZSkuCisgIC8vLyBUaGUgZGVmYXVsdCBpcyBUYXJnZXRNYWNoaW5lOjpDR0ZUX09iamVjdEZpbGUuCisgIHZvaWQgc2V0RmlsZVR5cGUoVGFyZ2V0TWFjaGluZTo6Q29kZUdlbkZpbGVUeXBlIEZUKSB7IEZpbGVUeXBlID0gRlQ7IH0KKworICB2b2lkIHNldENwdShTdHJpbmdSZWYgTUNwdSkgeyB0aGlzLT5NQ3B1ID0gTUNwdTsgfQorICB2b2lkIHNldEF0dHIoU3RyaW5nUmVmIE1BdHRyKSB7IHRoaXMtPk1BdHRyID0gTUF0dHI7IH0KKyAgdm9pZCBzZXRPcHRMZXZlbCh1bnNpZ25lZCBPcHRMZXZlbCk7CisKKyAgdm9pZCBzZXRTaG91bGRJbnRlcm5hbGl6ZShib29sIFZhbHVlKSB7IFNob3VsZEludGVybmFsaXplID0gVmFsdWU7IH0KKyAgdm9pZCBzZXRTaG91bGRFbWJlZFVzZWxpc3RzKGJvb2wgVmFsdWUpIHsgU2hvdWxkRW1iZWRVc2VsaXN0cyA9IFZhbHVlOyB9CisKKyAgLy8vIFJlc3RvcmUgbGlua2FnZSBvZiBnbG9iYWxzCisgIC8vLworICAvLy8gV2hlbiBzZXQsIHRoZSBsaW5rYWdlIG9mIGdsb2JhbHMgd2lsbCBiZSByZXN0b3JlZCBwcmlvciB0byBjb2RlCisgIC8vLyBnZW5lcmF0aW9uLiBUaGF0IGlzLCBhIGdsb2JhbCBzeW1ib2wgdGhhdCBoYWQgZXh0ZXJuYWwgbGlua2FnZSBwcmlvciB0bworICAvLy8gTFRPIHdpbGwgYmUgZW1pdHRlZCB3aXRoIGV4dGVybmFsIGxpbmthZ2UgYWdhaW47IGFuZCBhIGxvY2FsIHdpbGwgcmVtYWluCisgIC8vLyBsb2NhbC4gTm90ZSB0aGF0IHRoaXMgb3B0aW9uIG9ubHkgYWZmZWN0cyB0aGUgZW5kIHJlc3VsdCAtIGdsb2JhbHMgbWF5CisgIC8vLyBzdGlsbCBiZSBpbnRlcm5hbGl6ZWQgaW4gdGhlIHByb2Nlc3Mgb2YgTFRPIGFuZCBtYXkgYmUgbW9kaWZpZWQgYW5kL29yCisgIC8vLyBkZWxldGVkIHdoZXJlIGxlZ2FsLgorICAvLy8KKyAgLy8vIFRoZSBkZWZhdWx0IGJlaGF2aW9yIHdpbGwgaW50ZXJuYWxpemUgZ2xvYmFscyAodW5sZXNzIG9uIHRoZSBwcmVzZXJ2ZQorICAvLy8gbGlzdCkgYW5kLCBpZiBwYXJhbGxlbCBjb2RlIGdlbmVyYXRpb24gaXMgZW5hYmxlZCwgd2lsbCBleHRlcm5hbGl6ZQorICAvLy8gYWxsIGxvY2Fscy4KKyAgdm9pZCBzZXRTaG91bGRSZXN0b3JlR2xvYmFsc0xpbmthZ2UoYm9vbCBWYWx1ZSkgeworICAgIFNob3VsZFJlc3RvcmVHbG9iYWxzTGlua2FnZSA9IFZhbHVlOworICB9CisKKyAgdm9pZCBhZGRNdXN0UHJlc2VydmVTeW1ib2woU3RyaW5nUmVmIFN5bSkgeyBNdXN0UHJlc2VydmVTeW1ib2xzW1N5bV0gPSAxOyB9CisKKyAgLy8vIFBhc3Mgb3B0aW9ucyB0byB0aGUgZHJpdmVyIGFuZCBvcHRpbWl6YXRpb24gcGFzc2VzLgorICAvLy8KKyAgLy8vIFRoZXNlIG9wdGlvbnMgYXJlIG5vdCBuZWNlc3NhcmlseSBmb3IgZGVidWdnaW5nIHB1cnBvc2UgKHRoZSBmdW5jdGlvbgorICAvLy8gbmFtZSBpcyBtaXNsZWFkaW5nKS4gIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUKKyAgLy8vIExUT0NvZGVHZW5lcmF0b3I6OmNvbXBpbGV4eHgoKSwgYW5kCisgIC8vLyBMVE9Db2RlR2VuZXJhdG9yOjp3cml0ZU1lcmdlZE1vZHVsZXMoKS4KKyAgdm9pZCBzZXRDb2RlR2VuRGVidWdPcHRpb25zKFN0cmluZ1JlZiBPcHRzKTsKKworICAvLy8gUGFyc2UgdGhlIG9wdGlvbnMgc2V0IGluIHNldENvZGVHZW5EZWJ1Z09wdGlvbnMuCisgIC8vLworICAvLy8gTGlrZSBcYSBzZXRDb2RlR2VuRGVidWdPcHRpb25zKCksIHRoaXMgbXVzdCBiZSBjYWxsZWQgYmVmb3JlCisgIC8vLyBMVE9Db2RlR2VuZXJhdG9yOjpjb21waWxleHh4KCkgYW5kCisgIC8vLyBMVE9Db2RlR2VuZXJhdG9yOjp3cml0ZU1lcmdlZE1vZHVsZXMoKS4KKyAgdm9pZCBwYXJzZUNvZGVHZW5EZWJ1Z09wdGlvbnMoKTsKKworICAvLy8gV3JpdGUgdGhlIG1lcmdlZCBtb2R1bGUgdG8gdGhlIGZpbGUgc3BlY2lmaWVkIGJ5IHRoZSBnaXZlbiBwYXRoLiAgUmV0dXJuCisgIC8vLyB0cnVlIG9uIHN1Y2Nlc3MuCisgIC8vLworICAvLy8gQ2FsbHMgXGEgdmVyaWZ5TWVyZ2VkTW9kdWxlT25jZSgpLgorICBib29sIHdyaXRlTWVyZ2VkTW9kdWxlcyhTdHJpbmdSZWYgUGF0aCk7CisKKyAgLy8vIENvbXBpbGUgdGhlIG1lcmdlZCBtb2R1bGUgaW50byBhICpzaW5nbGUqIG91dHB1dCBmaWxlOyB0aGUgcGF0aCB0byBvdXRwdXQKKyAgLy8vIGZpbGUgaXMgcmV0dXJuZWQgdG8gdGhlIGNhbGxlciB2aWEgYXJndW1lbnQgIm5hbWUiLiBSZXR1cm4gdHJ1ZSBvbgorICAvLy8gc3VjY2Vzcy4KKyAgLy8vCisgIC8vLyBcbm90ZSBJdCBpcyB1cCB0byB0aGUgbGlua2VyIHRvIHJlbW92ZSB0aGUgaW50ZXJtZWRpYXRlIG91dHB1dCBmaWxlLiAgRG8KKyAgLy8vIG5vdCB0cnkgdG8gcmVtb3ZlIHRoZSBvYmplY3QgZmlsZSBpbiBMVE9Db2RlR2VuZXJhdG9yJ3MgZGVzdHJ1Y3RvciBhcyB3ZQorICAvLy8gZG9uJ3Qgd2hvIChMVE9Db2RlR2VuZXJhdG9yIG9yIHRoZSBvdXRwdXQgZmlsZSkgd2lsbCBsYXN0IGxvbmdlci4KKyAgYm9vbCBjb21waWxlX3RvX2ZpbGUoY29uc3QgY2hhciAqKk5hbWUsIGJvb2wgRGlzYWJsZVZlcmlmeSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEaXNhYmxlSW5saW5lLCBib29sIERpc2FibGVHVk5Mb2FkUFJFLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIERpc2FibGVWZWN0b3JpemF0aW9uKTsKKworICAvLy8gQXMgd2l0aCBjb21waWxlX3RvX2ZpbGUoKSwgdGhpcyBmdW5jdGlvbiBjb21waWxlcyB0aGUgbWVyZ2VkIG1vZHVsZSBpbnRvCisgIC8vLyBzaW5nbGUgb3V0cHV0IGZpbGUuIEluc3RlYWQgb2YgcmV0dXJuaW5nIHRoZSBvdXRwdXQgZmlsZSBwYXRoIHRvIHRoZQorICAvLy8gY2FsbGVyIChsaW5rZXIpLCBpdCBicmluZ3MgdGhlIG91dHB1dCB0byBhIGJ1ZmZlciwgYW5kIHJldHVybnMgdGhlIGJ1ZmZlcgorICAvLy8gdG8gdGhlIGNhbGxlci4gVGhpcyBmdW5jdGlvbiBzaG91bGQgZGVsZXRlIHRoZSBpbnRlcm1lZGlhdGUgZmlsZSBvbmNlCisgIC8vLyBpdHMgY29udGVudCBpcyBicm91Z2h0IHRvIG1lbW9yeS4gUmV0dXJuIE5VTEwgaWYgdGhlIGNvbXBpbGF0aW9uIHdhcyBub3QKKyAgLy8vIHN1Y2Nlc3NmdWwuCisgIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IGNvbXBpbGUoYm9vbCBEaXNhYmxlVmVyaWZ5LCBib29sIERpc2FibGVJbmxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEaXNhYmxlR1ZOTG9hZFBSRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERpc2FibGVWZWN0b3JpemF0aW9uKTsKKworICAvLy8gT3B0aW1pemVzIHRoZSBtZXJnZWQgbW9kdWxlLiAgUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCisgIC8vLworICAvLy8gQ2FsbHMgXGEgdmVyaWZ5TWVyZ2VkTW9kdWxlT25jZSgpLgorICBib29sIG9wdGltaXplKGJvb2wgRGlzYWJsZVZlcmlmeSwgYm9vbCBEaXNhYmxlSW5saW5lLCBib29sIERpc2FibGVHVk5Mb2FkUFJFLAorICAgICAgICAgICAgICAgIGJvb2wgRGlzYWJsZVZlY3Rvcml6YXRpb24pOworCisgIC8vLyBDb21waWxlcyB0aGUgbWVyZ2VkIG9wdGltaXplZCBtb2R1bGUgaW50byBhIHNpbmdsZSBvdXRwdXQgZmlsZS4gSXQgYnJpbmdzCisgIC8vLyB0aGUgb3V0cHV0IHRvIGEgYnVmZmVyLCBhbmQgcmV0dXJucyB0aGUgYnVmZmVyIHRvIHRoZSBjYWxsZXIuIFJldHVybiBOVUxMCisgIC8vLyBpZiB0aGUgY29tcGlsYXRpb24gd2FzIG5vdCBzdWNjZXNzZnVsLgorICBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBjb21waWxlT3B0aW1pemVkKCk7CisKKyAgLy8vIENvbXBpbGUgdGhlIG1lcmdlZCBvcHRpbWl6ZWQgbW9kdWxlIGludG8gb3V0LnNpemUoKSBvdXRwdXQgZmlsZXMgZWFjaAorICAvLy8gcmVwcmVzZW50aW5nIGEgbGlua2FibGUgcGFydGl0aW9uIG9mIHRoZSBtb2R1bGUuIElmIG91dCBjb250YWlucyBtb3JlCisgIC8vLyB0aGFuIG9uZSBlbGVtZW50LCBjb2RlIGdlbmVyYXRpb24gaXMgZG9uZSBpbiBwYXJhbGxlbCB3aXRoIG91dC5zaXplKCkKKyAgLy8vIHRocmVhZHMuICBPdXRwdXQgZmlsZXMgd2lsbCBiZSB3cml0dGVuIHRvIG1lbWJlcnMgb2Ygb3V0LiBSZXR1cm5zIHRydWUgb24KKyAgLy8vIHN1Y2Nlc3MuCisgIC8vLworICAvLy8gQ2FsbHMgXGEgdmVyaWZ5TWVyZ2VkTW9kdWxlT25jZSgpLgorICBib29sIGNvbXBpbGVPcHRpbWl6ZWQoQXJyYXlSZWY8cmF3X3B3cml0ZV9zdHJlYW0gKj4gT3V0KTsKKworICAvLy8gRW5hYmxlIHRoZSBGcmVlc3RhbmRpbmcgbW9kZTogaW5kaWNhdGUgdGhhdCB0aGUgb3B0aW1pemVyIHNob3VsZCBub3QKKyAgLy8vIGFzc3VtZSBidWlsdGlucyBhcmUgcHJlc2VudCBvbiB0aGUgdGFyZ2V0LgorICB2b2lkIHNldEZyZWVzdGFuZGluZyhib29sIEVuYWJsZWQpIHsgRnJlZXN0YW5kaW5nID0gRW5hYmxlZDsgfQorCisgIHZvaWQgc2V0RGlhZ25vc3RpY0hhbmRsZXIobHRvX2RpYWdub3N0aWNfaGFuZGxlcl90LCB2b2lkICopOworCisgIExMVk1Db250ZXh0ICZnZXRDb250ZXh0KCkgeyByZXR1cm4gQ29udGV4dDsgfQorCisgIHZvaWQgcmVzZXRNZXJnZWRNb2R1bGUoKSB7IE1lcmdlZE1vZHVsZS5yZXNldCgpOyB9CisgIHZvaWQgRGlhZ25vc3RpY0hhbmRsZXIoY29uc3QgRGlhZ25vc3RpY0luZm8gJkRJKTsKKworcHJpdmF0ZToKKyAgdm9pZCBpbml0aWFsaXplTFRPUGFzc2VzKCk7CisKKyAgLy8vIFZlcmlmeSB0aGUgbWVyZ2VkIG1vZHVsZSBvbiBmaXJzdCBjYWxsLgorICAvLy8KKyAgLy8vIFNldHMgXGEgSGFzVmVyaWZpZWRJbnB1dCBvbiBmaXJzdCBjYWxsIGFuZCBkb2Vzbid0IHJ1biBhZ2FpbiBvbiB0aGUgc2FtZQorICAvLy8gaW5wdXQuCisgIHZvaWQgdmVyaWZ5TWVyZ2VkTW9kdWxlT25jZSgpOworCisgIGJvb2wgY29tcGlsZU9wdGltaXplZFRvRmlsZShjb25zdCBjaGFyICoqTmFtZSk7CisgIHZvaWQgcmVzdG9yZUxpbmthZ2VGb3JFeHRlcm5hbHMoKTsKKyAgdm9pZCBhcHBseVNjb3BlUmVzdHJpY3Rpb25zKCk7CisgIHZvaWQgcHJlc2VydmVEaXNjYXJkYWJsZUdWcygKKyAgICAgIE1vZHVsZSAmVGhlTW9kdWxlLAorICAgICAgbGx2bTo6ZnVuY3Rpb25fcmVmPGJvb2woY29uc3QgR2xvYmFsVmFsdWUgJik+IG11c3RQcmVzZXJ2ZUdWKTsKKworICBib29sIGRldGVybWluZVRhcmdldCgpOworICBzdGQ6OnVuaXF1ZV9wdHI8VGFyZ2V0TWFjaGluZT4gY3JlYXRlVGFyZ2V0TWFjaGluZSgpOworCisgIHZvaWQgZW1pdEVycm9yKGNvbnN0IHN0ZDo6c3RyaW5nICZFcnJNc2cpOworICB2b2lkIGVtaXRXYXJuaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZFcnJNc2cpOworCisgIHZvaWQgZmluaXNoT3B0aW1pemF0aW9uUmVtYXJrcygpOworCisgIExMVk1Db250ZXh0ICZDb250ZXh0OworICBzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBNZXJnZWRNb2R1bGU7CisgIHN0ZDo6dW5pcXVlX3B0cjxMaW5rZXI+IFRoZUxpbmtlcjsKKyAgc3RkOjp1bmlxdWVfcHRyPFRhcmdldE1hY2hpbmU+IFRhcmdldE1hY2g7CisgIGJvb2wgRW1pdER3YXJmRGVidWdJbmZvID0gZmFsc2U7CisgIGJvb2wgU2NvcGVSZXN0cmljdGlvbnNEb25lID0gZmFsc2U7CisgIGJvb2wgSGFzVmVyaWZpZWRJbnB1dCA9IGZhbHNlOworICBPcHRpb25hbDxSZWxvYzo6TW9kZWw+IFJlbG9jTW9kZWw7CisgIFN0cmluZ1NldDw+IE11c3RQcmVzZXJ2ZVN5bWJvbHM7CisgIFN0cmluZ1NldDw+IEFzbVVuZGVmaW5lZFJlZnM7CisgIFN0cmluZ01hcDxHbG9iYWxWYWx1ZTo6TGlua2FnZVR5cGVzPiBFeHRlcm5hbFN5bWJvbHM7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBDb2RlZ2VuT3B0aW9uczsKKyAgc3RkOjpzdHJpbmcgRmVhdHVyZVN0cjsKKyAgc3RkOjpzdHJpbmcgTUNwdTsKKyAgc3RkOjpzdHJpbmcgTUF0dHI7CisgIHN0ZDo6c3RyaW5nIE5hdGl2ZU9iamVjdFBhdGg7CisgIFRhcmdldE9wdGlvbnMgT3B0aW9uczsKKyAgQ29kZUdlbk9wdDo6TGV2ZWwgQ0dPcHRMZXZlbCA9IENvZGVHZW5PcHQ6OkRlZmF1bHQ7CisgIGNvbnN0IFRhcmdldCAqTUFyY2ggPSBudWxscHRyOworICBzdGQ6OnN0cmluZyBUcmlwbGVTdHI7CisgIHVuc2lnbmVkIE9wdExldmVsID0gMjsKKyAgbHRvX2RpYWdub3N0aWNfaGFuZGxlcl90IERpYWdIYW5kbGVyID0gbnVsbHB0cjsKKyAgdm9pZCAqRGlhZ0NvbnRleHQgPSBudWxscHRyOworICBib29sIFNob3VsZEludGVybmFsaXplID0gdHJ1ZTsKKyAgYm9vbCBTaG91bGRFbWJlZFVzZWxpc3RzID0gZmFsc2U7CisgIGJvb2wgU2hvdWxkUmVzdG9yZUdsb2JhbHNMaW5rYWdlID0gZmFsc2U7CisgIFRhcmdldE1hY2hpbmU6OkNvZGVHZW5GaWxlVHlwZSBGaWxlVHlwZSA9IFRhcmdldE1hY2hpbmU6OkNHRlRfT2JqZWN0RmlsZTsKKyAgc3RkOjp1bmlxdWVfcHRyPFRvb2xPdXRwdXRGaWxlPiBEaWFnbm9zdGljT3V0cHV0RmlsZTsKKyAgYm9vbCBGcmVlc3RhbmRpbmcgPSBmYWxzZTsKK307Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTFRPL2xlZ2FjeS9MVE9Nb2R1bGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTFRPL2xlZ2FjeS9MVE9Nb2R1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTdlMjIzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MVE8vbGVnYWN5L0xUT01vZHVsZS5oCkBAIC0wLDAgKzEsMjA4IEBACisvLz09PS1MVE9Nb2R1bGUuaCAtIExMVk0gTGluayBUaW1lIE9wdGltaXplciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgTFRPTW9kdWxlIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9MVE9fTFRPTU9EVUxFX0gKKyNkZWZpbmUgTExWTV9MVE9fTFRPTU9EVUxFX0gKKworI2luY2x1ZGUgImxsdm0tYy9sdG8uaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L0lST2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L01vZHVsZVN5bWJvbFRhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKy8vIEZvcndhcmQgcmVmZXJlbmNlcyB0byBsbHZtIGNsYXNzZXMuCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIEZ1bmN0aW9uOworICBjbGFzcyBHbG9iYWxWYWx1ZTsKKyAgY2xhc3MgTWVtb3J5QnVmZmVyOworICBjbGFzcyBUYXJnZXRPcHRpb25zOworICBjbGFzcyBWYWx1ZTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBDKysgY2xhc3Mgd2hpY2ggaW1wbGVtZW50cyB0aGUgb3BhcXVlIGx0b19tb2R1bGVfdCB0eXBlLgorLy8vCitzdHJ1Y3QgTFRPTW9kdWxlIHsKK3ByaXZhdGU6CisgIHN0cnVjdCBOYW1lQW5kQXR0cmlidXRlcyB7CisgICAgU3RyaW5nUmVmIG5hbWU7CisgICAgdWludDMyX3QgICAgICAgICAgIGF0dHJpYnV0ZXMgPSAwOworICAgIGJvb2wgICAgICAgICAgICAgICBpc0Z1bmN0aW9uID0gMDsKKyAgICBjb25zdCBHbG9iYWxWYWx1ZSAqc3ltYm9sID0gMDsKKyAgfTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8TExWTUNvbnRleHQ+IE93bmVkQ29udGV4dDsKKworICBzdGQ6OnN0cmluZyBMaW5rZXJPcHRzOworCisgIHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IE1vZDsKKyAgTWVtb3J5QnVmZmVyUmVmIE1CUmVmOworICBNb2R1bGVTeW1ib2xUYWJsZSBTeW1UYWI7CisgIHN0ZDo6dW5pcXVlX3B0cjxUYXJnZXRNYWNoaW5lPiBfdGFyZ2V0OworICBzdGQ6OnZlY3RvcjxOYW1lQW5kQXR0cmlidXRlcz4gX3N5bWJvbHM7CisKKyAgLy8gX2RlZmluZXMgYW5kIF91bmRlZmluZXMgb25seSBuZWVkZWQgdG8gZGlzYW1iaWd1YXRlIHRlbnRhdGl2ZSBkZWZpbml0aW9ucworICBTdHJpbmdTZXQ8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RlZmluZXM7CisgIFN0cmluZ01hcDxOYW1lQW5kQXR0cmlidXRlcz4gX3VuZGVmaW5lczsKKyAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBfYXNtX3VuZGVmaW5lczsKKworICBMVE9Nb2R1bGUoc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gTSwgTWVtb3J5QnVmZmVyUmVmIE1CUmVmLAorICAgICAgICAgICAgVGFyZ2V0TWFjaGluZSAqVE0pOworCitwdWJsaWM6CisgIH5MVE9Nb2R1bGUoKTsKKworICAvLy8gUmV0dXJucyAndHJ1ZScgaWYgdGhlIGZpbGUgb3IgbWVtb3J5IGNvbnRlbnRzIGlzIExMVk0gYml0Y29kZS4KKyAgc3RhdGljIGJvb2wgaXNCaXRjb2RlRmlsZShjb25zdCB2b2lkICptZW0sIHNpemVfdCBsZW5ndGgpOworICBzdGF0aWMgYm9vbCBpc0JpdGNvZGVGaWxlKFN0cmluZ1JlZiBwYXRoKTsKKworICAvLy8gUmV0dXJucyAndHJ1ZScgaWYgdGhlIE1vZHVsZSBpcyBwcm9kdWNlZCBmb3IgVGhpbkxUTy4KKyAgYm9vbCBpc1RoaW5MVE8oKTsKKworICAvLy8gUmV0dXJucyAndHJ1ZScgaWYgdGhlIG1lbW9yeSBidWZmZXIgaXMgTExWTSBiaXRjb2RlIGZvciB0aGUgc3BlY2lmaWVkCisgIC8vLyB0cmlwbGUuCisgIHN0YXRpYyBib29sIGlzQml0Y29kZUZvclRhcmdldChNZW1vcnlCdWZmZXIgKm1lbUJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiB0cmlwbGVQcmVmaXgpOworCisgIC8vLyBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGUgcHJvZHVjZXIgaWRlbnRpZmljYXRpb24gc3RvcmVkIGluIHRoZQorICAvLy8gYml0Y29kZSwgb3IgIiIgaWYgdGhlIGJpdGNvZGUgZG9lcyBub3QgY29udGFpbnMgYW55LgorICAvLy8KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldFByb2R1Y2VyU3RyaW5nKE1lbW9yeUJ1ZmZlciAqQnVmZmVyKTsKKworICAvLy8gQ3JlYXRlIGEgTWVtb3J5QnVmZmVyIGZyb20gYSBtZW1vcnkgcmFuZ2Ugd2l0aCBhbiBvcHRpb25hbCBuYW1lLgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4KKyAgbWFrZUJ1ZmZlcihjb25zdCB2b2lkICptZW0sIHNpemVfdCBsZW5ndGgsIFN0cmluZ1JlZiBuYW1lID0gIiIpOworCisgIC8vLyBDcmVhdGUgYW4gTFRPTW9kdWxlLiBOLkIuIFRoZXNlIG1ldGhvZHMgdGFrZSBvd25lcnNoaXAgb2YgdGhlIGJ1ZmZlci4gVGhlCisgIC8vLyBjYWxsZXIgbXVzdCBoYXZlIGluaXRpYWxpemVkIHRoZSBUYXJnZXRzLCB0aGUgVGFyZ2V0TUNzLCB0aGUgQXNtUHJpbnRlcnMsCisgIC8vLyBhbmQgdGhlIEFzbVBhcnNlcnMgYnkgY2FsbGluZzoKKyAgLy8vCisgIC8vLyBJbml0aWFsaXplQWxsVGFyZ2V0cygpOworICAvLy8gSW5pdGlhbGl6ZUFsbFRhcmdldE1DcygpOworICAvLy8gSW5pdGlhbGl6ZUFsbEFzbVByaW50ZXJzKCk7CisgIC8vLyBJbml0aWFsaXplQWxsQXNtUGFyc2VycygpOworICBzdGF0aWMgRXJyb3JPcjxzdGQ6OnVuaXF1ZV9wdHI8TFRPTW9kdWxlPj4KKyAgY3JlYXRlRnJvbUZpbGUoTExWTUNvbnRleHQgJkNvbnRleHQsIFN0cmluZ1JlZiBwYXRoLAorICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRPcHRpb25zICZvcHRpb25zKTsKKyAgc3RhdGljIEVycm9yT3I8c3RkOjp1bmlxdWVfcHRyPExUT01vZHVsZT4+CisgIGNyZWF0ZUZyb21PcGVuRmlsZShMTFZNQ29udGV4dCAmQ29udGV4dCwgaW50IGZkLCBTdHJpbmdSZWYgcGF0aCwgc2l6ZV90IHNpemUsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRPcHRpb25zICZvcHRpb25zKTsKKyAgc3RhdGljIEVycm9yT3I8c3RkOjp1bmlxdWVfcHRyPExUT01vZHVsZT4+CisgIGNyZWF0ZUZyb21PcGVuRmlsZVNsaWNlKExMVk1Db250ZXh0ICZDb250ZXh0LCBpbnQgZmQsIFN0cmluZ1JlZiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbWFwX3NpemUsIG9mZl90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0T3B0aW9ucyAmb3B0aW9ucyk7CisgIHN0YXRpYyBFcnJvck9yPHN0ZDo6dW5pcXVlX3B0cjxMVE9Nb2R1bGU+PgorICBjcmVhdGVGcm9tQnVmZmVyKExMVk1Db250ZXh0ICZDb250ZXh0LCBjb25zdCB2b2lkICptZW0sIHNpemVfdCBsZW5ndGgsCisgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0T3B0aW9ucyAmb3B0aW9ucywgU3RyaW5nUmVmIHBhdGggPSAiIik7CisgIHN0YXRpYyBFcnJvck9yPHN0ZDo6dW5pcXVlX3B0cjxMVE9Nb2R1bGU+PgorICBjcmVhdGVJbkxvY2FsQ29udGV4dChzdGQ6OnVuaXF1ZV9wdHI8TExWTUNvbnRleHQ+IENvbnRleHQsIGNvbnN0IHZvaWQgKm1lbSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCwgY29uc3QgVGFyZ2V0T3B0aW9ucyAmb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIHBhdGgpOworCisgIGNvbnN0IE1vZHVsZSAmZ2V0TW9kdWxlKCkgY29uc3QgeyByZXR1cm4gKk1vZDsgfQorICBNb2R1bGUgJmdldE1vZHVsZSgpIHsgcmV0dXJuICpNb2Q7IH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiB0YWtlTW9kdWxlKCkgeyByZXR1cm4gc3RkOjptb3ZlKE1vZCk7IH0KKworICAvLy8gUmV0dXJuIHRoZSBNb2R1bGUncyB0YXJnZXQgdHJpcGxlLgorICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0VGFyZ2V0VHJpcGxlKCkgeworICAgIHJldHVybiBnZXRNb2R1bGUoKS5nZXRUYXJnZXRUcmlwbGUoKTsKKyAgfQorCisgIC8vLyBTZXQgdGhlIE1vZHVsZSdzIHRhcmdldCB0cmlwbGUuCisgIHZvaWQgc2V0VGFyZ2V0VHJpcGxlKFN0cmluZ1JlZiBUcmlwbGUpIHsKKyAgICBnZXRNb2R1bGUoKS5zZXRUYXJnZXRUcmlwbGUoVHJpcGxlKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIG51bWJlciBvZiBzeW1ib2xzCisgIHVpbnQzMl90IGdldFN5bWJvbENvdW50KCkgeworICAgIHJldHVybiBfc3ltYm9scy5zaXplKCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBhdHRyaWJ1dGVzIGZvciBhIHN5bWJvbCBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgorICBsdG9fc3ltYm9sX2F0dHJpYnV0ZXMgZ2V0U3ltYm9sQXR0cmlidXRlcyh1aW50MzJfdCBpbmRleCkgeworICAgIGlmIChpbmRleCA8IF9zeW1ib2xzLnNpemUoKSkKKyAgICAgIHJldHVybiBsdG9fc3ltYm9sX2F0dHJpYnV0ZXMoX3N5bWJvbHNbaW5kZXhdLmF0dHJpYnV0ZXMpOworICAgIHJldHVybiBsdG9fc3ltYm9sX2F0dHJpYnV0ZXMoMCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSBzeW1ib2wgYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KKyAgU3RyaW5nUmVmIGdldFN5bWJvbE5hbWUodWludDMyX3QgaW5kZXgpIHsKKyAgICBpZiAoaW5kZXggPCBfc3ltYm9scy5zaXplKCkpCisgICAgICByZXR1cm4gX3N5bWJvbHNbaW5kZXhdLm5hbWU7CisgICAgcmV0dXJuIFN0cmluZ1JlZigpOworICB9CisKKyAgY29uc3QgR2xvYmFsVmFsdWUgKmdldFN5bWJvbEdWKHVpbnQzMl90IGluZGV4KSB7CisgICAgaWYgKGluZGV4IDwgX3N5bWJvbHMuc2l6ZSgpKQorICAgICAgcmV0dXJuIF9zeW1ib2xzW2luZGV4XS5zeW1ib2w7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBTdHJpbmdSZWYgZ2V0TGlua2VyT3B0cygpIHsgcmV0dXJuIExpbmtlck9wdHM7IH0KKworICBjb25zdCBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+ICZnZXRBc21VbmRlZmluZWRSZWZzKCkgeyByZXR1cm4gX2FzbV91bmRlZmluZXM7IH0KKworcHJpdmF0ZToKKyAgLy8vIFBhcnNlIG1ldGFkYXRhIGZyb20gdGhlIG1vZHVsZQorICAvLyBGSVhNRTogaXQgb25seSBwYXJzZXMgImxsdm0ubGlua2VyLm9wdGlvbnMiIG1ldGFkYXRhIGF0IHRoZSBtb21lbnQKKyAgdm9pZCBwYXJzZU1ldGFkYXRhKCk7CisKKyAgLy8vIFBhcnNlIHRoZSBzeW1ib2xzIGZyb20gdGhlIG1vZHVsZSBhbmQgbW9kZWwtbGV2ZWwgQVNNIGFuZCBhZGQgdGhlbSB0bworICAvLy8gZWl0aGVyIHRoZSBkZWZpbmVkIG9yIHVuZGVmaW5lZCBsaXN0cy4KKyAgdm9pZCBwYXJzZVN5bWJvbHMoKTsKKworICAvLy8gQWRkIGEgc3ltYm9sIHdoaWNoIGlzbid0IGRlZmluZWQganVzdCB5ZXQgdG8gYSBsaXN0IHRvIGJlIHJlc29sdmVkIGxhdGVyLgorICB2b2lkIGFkZFBvdGVudGlhbFVuZGVmaW5lZFN5bWJvbChNb2R1bGVTeW1ib2xUYWJsZTo6U3ltYm9sIFN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0Z1bmMpOworCisgIC8vLyBBZGQgYSBkZWZpbmVkIHN5bWJvbCB0byB0aGUgbGlzdC4KKyAgdm9pZCBhZGREZWZpbmVkU3ltYm9sKFN0cmluZ1JlZiBOYW1lLCBjb25zdCBHbG9iYWxWYWx1ZSAqZGVmLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0Z1bmN0aW9uKTsKKworICAvLy8gQWRkIGEgZGF0YSBzeW1ib2wgYXMgZGVmaW5lZCB0byB0aGUgbGlzdC4KKyAgdm9pZCBhZGREZWZpbmVkRGF0YVN5bWJvbChNb2R1bGVTeW1ib2xUYWJsZTo6U3ltYm9sIFN5bSk7CisgIHZvaWQgYWRkRGVmaW5lZERhdGFTeW1ib2woU3RyaW5nUmVmIE5hbWUsIGNvbnN0IEdsb2JhbFZhbHVlICp2KTsKKworICAvLy8gQWRkIGEgZnVuY3Rpb24gc3ltYm9sIGFzIGRlZmluZWQgdG8gdGhlIGxpc3QuCisgIHZvaWQgYWRkRGVmaW5lZEZ1bmN0aW9uU3ltYm9sKE1vZHVsZVN5bWJvbFRhYmxlOjpTeW1ib2wgU3ltKTsKKyAgdm9pZCBhZGREZWZpbmVkRnVuY3Rpb25TeW1ib2woU3RyaW5nUmVmIE5hbWUsIGNvbnN0IEZ1bmN0aW9uICpGKTsKKworICAvLy8gQWRkIGEgZ2xvYmFsIHN5bWJvbCBmcm9tIG1vZHVsZS1sZXZlbCBBU00gdG8gdGhlIGRlZmluZWQgbGlzdC4KKyAgdm9pZCBhZGRBc21HbG9iYWxTeW1ib2woU3RyaW5nUmVmLCBsdG9fc3ltYm9sX2F0dHJpYnV0ZXMgc2NvcGUpOworCisgIC8vLyBBZGQgYSBnbG9iYWwgc3ltYm9sIGZyb20gbW9kdWxlLWxldmVsIEFTTSB0byB0aGUgdW5kZWZpbmVkIGxpc3QuCisgIHZvaWQgYWRkQXNtR2xvYmFsU3ltYm9sVW5kZWYoU3RyaW5nUmVmKTsKKworICAvLy8gUGFyc2UgaTM4Ni9wcGMgT2JqQyBjbGFzcyBkYXRhIHN0cnVjdHVyZS4KKyAgdm9pZCBhZGRPYmpDQ2xhc3MoY29uc3QgR2xvYmFsVmFyaWFibGUgKmNsZ3YpOworCisgIC8vLyBQYXJzZSBpMzg2L3BwYyBPYmpDIGNhdGVnb3J5IGRhdGEgc3RydWN0dXJlLgorICB2b2lkIGFkZE9iakNDYXRlZ29yeShjb25zdCBHbG9iYWxWYXJpYWJsZSAqY2xndik7CisKKyAgLy8vIFBhcnNlIGkzODYvcHBjIE9iakMgY2xhc3MgbGlzdCBkYXRhIHN0cnVjdHVyZS4KKyAgdm9pZCBhZGRPYmpDQ2xhc3NSZWYoY29uc3QgR2xvYmFsVmFyaWFibGUgKmNsZ3YpOworCisgIC8vLyBHZXQgc3RyaW5nIHRoYXQgdGhlIGRhdGEgcG9pbnRlciBwb2ludHMgdG8uCisgIGJvb2wgb2JqY0NsYXNzTmFtZUZyb21FeHByZXNzaW9uKGNvbnN0IENvbnN0YW50ICpjLCBzdGQ6OnN0cmluZyAmbmFtZSk7CisKKyAgLy8vIENyZWF0ZSBhbiBMVE9Nb2R1bGUgKHByaXZhdGUgdmVyc2lvbikuCisgIHN0YXRpYyBFcnJvck9yPHN0ZDo6dW5pcXVlX3B0cjxMVE9Nb2R1bGU+PgorICBtYWtlTFRPTW9kdWxlKE1lbW9yeUJ1ZmZlclJlZiBCdWZmZXIsIGNvbnN0IFRhcmdldE9wdGlvbnMgJm9wdGlvbnMsCisgICAgICAgICAgICAgICAgTExWTUNvbnRleHQgJkNvbnRleHQsIGJvb2wgU2hvdWxkQmVMYXp5KTsKK307Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTFRPL2xlZ2FjeS9UaGluTFRPQ29kZUdlbmVyYXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MVE8vbGVnYWN5L1RoaW5MVE9Db2RlR2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjMyYTk3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTFRPL2xlZ2FjeS9UaGluTFRPQ29kZUdlbmVyYXRvci5oCkBAIC0wLDAgKzEsMzU2IEBACisvLz09PS1UaGluTFRPQ29kZUdlbmVyYXRvci5oIC0gTExWTSBMaW5rIFRpbWUgT3B0aW1pemVyIC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgVGhpbkxUT0NvZGVHZW5lcmF0b3IgY2xhc3MsIHNpbWlsYXIgdG8gdGhlCisvLyBMVE9Db2RlR2VuZXJhdG9yIGJ1dCBmb3IgdGhlIFRoaW5MVE8gc2NoZW1lLiBJdCBwcm92aWRlcyBhbiBpbnRlcmZhY2UgZm9yCisvLyBsaW5rZXIgcGx1Z2luLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9MVE9fVEhJTkxUT0NPREVHRU5FUkFUT1JfSAorI2RlZmluZSBMTFZNX0xUT19USElOTFRPQ09ERUdFTkVSQVRPUl9ICisKKyNpbmNsdWRlICJsbHZtLWMvbHRvLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHJpcGxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGVTdW1tYXJ5SW5kZXguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FjaGVQcnVuaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvZGVHZW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oIgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBTdHJpbmdSZWY7CitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIFRhcmdldE1hY2hpbmU7CisKKy8vLyBXcmFwcGVyIGFyb3VuZCBNZW1vcnlCdWZmZXJSZWYsIG93bmluZyB0aGUgaWRlbnRpZmllcgorY2xhc3MgVGhpbkxUT0J1ZmZlciB7CisgIHN0ZDo6c3RyaW5nIE93bmVkSWRlbnRpZmllcjsKKyAgU3RyaW5nUmVmIEJ1ZmZlcjsKKworcHVibGljOgorICBUaGluTFRPQnVmZmVyKFN0cmluZ1JlZiBCdWZmZXIsIFN0cmluZ1JlZiBJZGVudGlmaWVyKQorICAgICAgOiBPd25lZElkZW50aWZpZXIoSWRlbnRpZmllciksIEJ1ZmZlcihCdWZmZXIpIHt9CisKKyAgTWVtb3J5QnVmZmVyUmVmIGdldE1lbUJ1ZmZlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gTWVtb3J5QnVmZmVyUmVmKEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHtPd25lZElkZW50aWZpZXIuY19zdHIoKSwgT3duZWRJZGVudGlmaWVyLnNpemUoKX0pOworICB9CisgIFN0cmluZ1JlZiBnZXRCdWZmZXIoKSBjb25zdCB7IHJldHVybiBCdWZmZXI7IH0KKyAgU3RyaW5nUmVmIGdldEJ1ZmZlcklkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiBPd25lZElkZW50aWZpZXI7IH0KK307CisKKy8vLyBIZWxwZXIgdG8gZ2F0aGVyIG9wdGlvbnMgcmVsZXZhbnQgdG8gdGhlIHRhcmdldCBtYWNoaW5lIGNyZWF0aW9uCitzdHJ1Y3QgVGFyZ2V0TWFjaGluZUJ1aWxkZXIgeworICBUcmlwbGUgVGhlVHJpcGxlOworICBzdGQ6OnN0cmluZyBNQ3B1OworICBzdGQ6OnN0cmluZyBNQXR0cjsKKyAgVGFyZ2V0T3B0aW9ucyBPcHRpb25zOworICBPcHRpb25hbDxSZWxvYzo6TW9kZWw+IFJlbG9jTW9kZWw7CisgIENvZGVHZW5PcHQ6OkxldmVsIENHT3B0TGV2ZWwgPSBDb2RlR2VuT3B0OjpBZ2dyZXNzaXZlOworCisgIHN0ZDo6dW5pcXVlX3B0cjxUYXJnZXRNYWNoaW5lPiBjcmVhdGUoKSBjb25zdDsKK307CisKKy8vLyBUaGlzIGNsYXNzIGRlZmluZSBhbiBpbnRlcmZhY2Ugc2ltaWxhciB0byB0aGUgTFRPQ29kZUdlbmVyYXRvciwgYnV0IGFkYXB0ZWQKKy8vLyBmb3IgVGhpbkxUTyBwcm9jZXNzaW5nLgorLy8vIFRoZSBUaGluTFRPQ29kZUdlbmVyYXRvciBpcyBub3QgaW50ZW5kZWQgdG8gYmUgcmV1c2UgZm9yIG11bHRpcGxlCisvLy8gY29tcGlsYXRpb246IHRoZSBtb2RlbCBpcyB0aGF0IHRoZSBjbGllbnQgYWRkcyBtb2R1bGVzIHRvIHRoZSBnZW5lcmF0b3IgYW5kCisvLy8gYXNrIHRvIHBlcmZvcm0gdGhlIFRoaW5MVE8gb3B0aW1pemF0aW9ucyAvIGNvZGVnZW4sIGFuZCBmaW5hbGx5IGRlc3Ryb3lzIHRoZQorLy8vIGNvZGVnZW5lcmF0b3IuCitjbGFzcyBUaGluTFRPQ29kZUdlbmVyYXRvciB7CitwdWJsaWM6CisgIC8vLyBBZGQgZ2l2ZW4gbW9kdWxlIHRvIHRoZSBjb2RlIGdlbmVyYXRvci4KKyAgdm9pZCBhZGRNb2R1bGUoU3RyaW5nUmVmIElkZW50aWZpZXIsIFN0cmluZ1JlZiBEYXRhKTsKKworICAvKioKKyAgICogQWRkcyB0byBhIGxpc3Qgb2YgYWxsIGdsb2JhbCBzeW1ib2xzIHRoYXQgbXVzdCBleGlzdCBpbiB0aGUgZmluYWwgZ2VuZXJhdGVkCisgICAqIGNvZGUuIElmIGEgc3ltYm9sIGlzIG5vdCBsaXN0ZWQgdGhlcmUsIGl0IHdpbGwgYmUgb3B0aW1pemVkIGF3YXkgaWYgaXQgaXMKKyAgICogaW5saW5lZCBpbnRvIGV2ZXJ5IHVzYWdlLgorICAgKi8KKyAgdm9pZCBwcmVzZXJ2ZVN5bWJvbChTdHJpbmdSZWYgTmFtZSk7CisKKyAgLyoqCisgICAqIEFkZHMgdG8gYSBsaXN0IG9mIGFsbCBnbG9iYWwgc3ltYm9scyB0aGF0IGFyZSBjcm9zcy1yZWZlcmVuY2VkIGJldHdlZW4KKyAgICogVGhpbkxUTyBmaWxlcy4gSWYgdGhlIFRoaW5MVE8gQ29kZUdlbmVyYXRvciBjYW4gZW5zdXJlIHRoYXQgZXZlcnkKKyAgICogcmVmZXJlbmNlcyBmcm9tIGEgVGhpbkxUTyBtb2R1bGUgdG8gdGhpcyBzeW1ib2wgaXMgb3B0aW1pemVkIGF3YXksIHRoZW4KKyAgICogdGhlIHN5bWJvbCBjYW4gYmUgZGlzY2FyZGVkLgorICAgKi8KKyAgdm9pZCBjcm9zc1JlZmVyZW5jZVN5bWJvbChTdHJpbmdSZWYgTmFtZSk7CisKKyAgLyoqCisgICAqIFByb2Nlc3MgYWxsIHRoZSBtb2R1bGVzIHRoYXQgd2VyZSBhZGRlZCB0byB0aGUgY29kZSBnZW5lcmF0b3IgaW4gcGFyYWxsZWwuCisgICAqCisgICAqIENsaWVudCBjYW4gYWNjZXNzIHRoZSByZXN1bHRpbmcgb2JqZWN0IGZpbGVzIHVzaW5nIGdldFByb2R1Y2VkQmluYXJpZXMoKSwKKyAgICogdW5sZXNzIHNldEdlbmVyYXRlZE9iamVjdHNEaXJlY3RvcnkoKSBoYXMgYmVlbiBjYWxsZWQsIGluIHdoaWNoIGNhc2UKKyAgICogcmVzdWx0cyBhcmUgYXZhaWxhYmxlIHRocm91Z2ggZ2V0UHJvZHVjZWRCaW5hcnlGaWxlcygpLgorICAgKi8KKyAgdm9pZCBydW4oKTsKKworICAvKioKKyAgICogUmV0dXJuIHRoZSAiaW4gbWVtb3J5IiBiaW5hcmllcyBwcm9kdWNlZCBieSB0aGUgY29kZSBnZW5lcmF0b3IuIFRoaXMgaXMKKyAgICogZmlsbGVkIGFmdGVyIHJ1bigpIHVubGVzcyBzZXRHZW5lcmF0ZWRPYmplY3RzRGlyZWN0b3J5KCkgaGFzIGJlZW4KKyAgICogY2FsbGVkLCBpbiB3aGljaCBjYXNlIHJlc3VsdHMgYXJlIGF2YWlsYWJsZSB0aHJvdWdoCisgICAqIGdldFByb2R1Y2VkQmluYXJ5RmlsZXMoKS4KKyAgICovCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+PiAmZ2V0UHJvZHVjZWRCaW5hcmllcygpIHsKKyAgICByZXR1cm4gUHJvZHVjZWRCaW5hcmllczsKKyAgfQorCisgIC8qKgorICAgKiBSZXR1cm4gdGhlICJvbi1kaXNrIiBiaW5hcmllcyBwcm9kdWNlZCBieSB0aGUgY29kZSBnZW5lcmF0b3IuIFRoaXMgaXMKKyAgICogZmlsbGVkIGFmdGVyIHJ1bigpIHdoZW4gc2V0R2VuZXJhdGVkT2JqZWN0c0RpcmVjdG9yeSgpIGhhcyBiZWVuCisgICAqIGNhbGxlZCwgaW4gd2hpY2ggY2FzZSByZXN1bHRzIGFyZSBhdmFpbGFibGUgdGhyb3VnaCBnZXRQcm9kdWNlZEJpbmFyaWVzKCkuCisgICAqLworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmdldFByb2R1Y2VkQmluYXJ5RmlsZXMoKSB7CisgICAgcmV0dXJuIFByb2R1Y2VkQmluYXJ5RmlsZXM7CisgIH0KKworICAvKioKKyAgICogXGRlZmdyb3VwIE9wdGlvbnMgc2V0dGVycworICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogXGRlZmdyb3VwIENhY2hlIGNvbnRyb2xsaW5nIG9wdGlvbnMKKyAgICoKKyAgICogVGhlc2UgZW50cnkgcG9pbnRzIGNvbnRyb2wgdGhlIFRoaW5MVE8gY2FjaGUuIFRoZSBjYWNoZSBpcyBpbnRlbmRlZCB0bworICAgKiBzdXBwb3J0IGluY3JlbWVudGFsIGJ1aWxkLCBhbmQgdGh1cyBuZWVkcyB0byBiZSBwZXJzaXN0ZW50IGFjY3Jvc3MgYnVpbGQuCisgICAqIFRoZSBjbGllbnQgZW5hYmxlZCB0aGUgY2FjaGUgYnkgc3VwcGx5aW5nIGEgcGF0aCB0byBhbiBleGlzdGluZyBkaXJlY3RvcnkuCisgICAqIFRoZSBjb2RlIGdlbmVyYXRvciB3aWxsIHVzZSB0aGlzIHRvIHN0b3JlIG9iamVjdHMgZmlsZXMgdGhhdCBtYXkgYmUgcmV1c2VkCisgICAqIGR1cmluZyBhIHN1YnNlcXVlbnQgYnVpbGQuCisgICAqIFRvIGF2b2lkIGZpbGxpbmcgdGhlIGRpc2sgc3BhY2UsIGEgZmV3IGtub2JzIGFyZSBwcm92aWRlZDoKKyAgICogIC0gVGhlIHBydW5pbmcgaW50ZXJ2YWwgbGltaXQgdGhlIGZyZXF1ZW5jeSBhdCB3aGljaCB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IKKyAgICogICAgd2lsbCB0cnkgdG8gc2NhbiB0aGUgY2FjaGUgZGlyZWN0b3J5IHRvIHBydW5lIGl0IGZyb20gZXhwaXJlZCBlbnRyaWVzLgorICAgKiAgICBTZXR0aW5nIHRvIC0xIGRpc2FibGUgdGhlIHBydW5pbmcgKGRlZmF1bHQpLiBTZXR0aW5nIHRvIDAgd2lsbCBmb3JjZQorICAgKiAgICBwcnVuaW5nIHRvIG9jY3VyLgorICAgKiAgLSBUaGUgcHJ1bmluZyBleHBpcmF0aW9uIHRpbWUgaW5kaWNhdGVzIHRvIHRoZSBnYXJiYWdlIGNvbGxlY3RvciBob3cgb2xkCisgICAqICAgIGFuIGVudHJ5IG5lZWRzIHRvIGJlIHRvIGJlIHJlbW92ZWQuCisgICAqICAtIEZpbmFsbHksIHRoZSBnYXJiYWdlIGNvbGxlY3RvciBjYW4gYmUgaW5zdHJ1Y3RlZCB0byBwcnVuZSB0aGUgY2FjaGUgdGlsbAorICAgKiAgICB0aGUgb2NjdXBpZWQgc3BhY2UgZ29lcyBiZWxvdyBhIHRocmVzaG9sZC4KKyAgICogQHsKKyAgICovCisKKyAgc3RydWN0IENhY2hpbmdPcHRpb25zIHsKKyAgICBzdGQ6OnN0cmluZyBQYXRoOyAgICAgICAgICAgICAgICAgICAgLy8gUGF0aCB0byB0aGUgY2FjaGUsIGVtcHR5IHRvIGRpc2FibGUuCisgICAgQ2FjaGVQcnVuaW5nUG9saWN5IFBvbGljeTsKKyAgfTsKKworICAvLy8gUHJvdmlkZSBhIHBhdGggdG8gYSBkaXJlY3Rvcnkgd2hlcmUgdG8gc3RvcmUgdGhlIGNhY2hlZCBmaWxlcyBmb3IKKyAgLy8vIGluY3JlbWVudGFsIGJ1aWxkLgorICB2b2lkIHNldENhY2hlRGlyKHN0ZDo6c3RyaW5nIFBhdGgpIHsgQ2FjaGVPcHRpb25zLlBhdGggPSBzdGQ6Om1vdmUoUGF0aCk7IH0KKworICAvLy8gQ2FjaGUgcG9saWN5OiBpbnRlcnZhbCAoc2Vjb25kcykgYmV0d2VlbiB0d28gcHJ1bmVzIG9mIHRoZSBjYWNoZS4gU2V0IHRvIGEKKyAgLy8vIG5lZ2F0aXZlIHZhbHVlIHRvIGRpc2FibGUgcHJ1bmluZy4gQSB2YWx1ZSBvZiAwIHdpbGwgZm9yY2UgcHJ1bmluZyB0bworICAvLy8gb2NjdXIuCisgIHZvaWQgc2V0Q2FjaGVQcnVuaW5nSW50ZXJ2YWwoaW50IEludGVydmFsKSB7CisgICAgaWYoSW50ZXJ2YWwgPCAwKQorICAgICAgQ2FjaGVPcHRpb25zLlBvbGljeS5JbnRlcnZhbC5yZXNldCgpOworICAgIGVsc2UKKyAgICAgIENhY2hlT3B0aW9ucy5Qb2xpY3kuSW50ZXJ2YWwgPSBzdGQ6OmNocm9ubzo6c2Vjb25kcyhJbnRlcnZhbCk7CisgIH0KKworICAvLy8gQ2FjaGUgcG9saWN5OiBleHBpcmF0aW9uIChpbiBzZWNvbmRzKSBmb3IgYW4gZW50cnkuCisgIC8vLyBBIHZhbHVlIG9mIDAgd2lsbCBiZSBpZ25vcmVkLgorICB2b2lkIHNldENhY2hlRW50cnlFeHBpcmF0aW9uKHVuc2lnbmVkIEV4cGlyYXRpb24pIHsKKyAgICBpZiAoRXhwaXJhdGlvbikKKyAgICAgIENhY2hlT3B0aW9ucy5Qb2xpY3kuRXhwaXJhdGlvbiA9IHN0ZDo6Y2hyb25vOjpzZWNvbmRzKEV4cGlyYXRpb24pOworICB9CisKKyAgLyoqCisgICAqIFNldHMgdGhlIG1heGltdW0gY2FjaGUgc2l6ZSB0aGF0IGNhbiBiZSBwZXJzaXN0ZW50IGFjcm9zcyBidWlsZCwgaW4gdGVybXMKKyAgICogb2YgcGVyY2VudGFnZSBvZiB0aGUgYXZhaWxhYmxlIHNwYWNlIG9uIHRoZSBkaXNrLiBTZXQgdG8gMTAwIHRvIGluZGljYXRlCisgICAqIG5vIGxpbWl0LCA1MCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjYWNoZSBzaXplIHdpbGwgbm90IGJlIGxlZnQgb3ZlcgorICAgKiBoYWxmIHRoZSBhdmFpbGFibGUgc3BhY2UuIEEgdmFsdWUgb3ZlciAxMDAgd2lsbCBiZSByZWR1Y2VkIHRvIDEwMCwgYW5kIGEKKyAgICogdmFsdWUgb2YgMCB3aWxsIGJlIGlnbm9yZWQuCisgICAqCisgICAqCisgICAqIFRoZSBmb3JtdWxhIGxvb2tzIGxpa2U6CisgICAqICBBdmFpbGFibGVTcGFjZSA9IEZyZWVTcGFjZSArIEV4aXN0aW5nQ2FjaGVTaXplCisgICAqICBOZXdDYWNoZVNpemUgPSBBdmFpbGFibGVTcGFjZSAqIFAvMTAwCisgICAqCisgICAqLworICB2b2lkIHNldE1heENhY2hlU2l6ZVJlbGF0aXZlVG9BdmFpbGFibGVTcGFjZSh1bnNpZ25lZCBQZXJjZW50YWdlKSB7CisgICAgaWYgKFBlcmNlbnRhZ2UpCisgICAgICBDYWNoZU9wdGlvbnMuUG9saWN5Lk1heFNpemVQZXJjZW50YWdlT2ZBdmFpbGFibGVTcGFjZSA9IFBlcmNlbnRhZ2U7CisgIH0KKworICAvLy8gQ2FjaGUgcG9saWN5OiB0aGUgbWF4aW11bSBzaXplIGZvciB0aGUgY2FjaGUgZGlyZWN0b3J5IGluIGJ5dGVzLiBBIHZhbHVlCisgIC8vLyBvdmVyIHRoZSBhbW91bnQgb2YgYXZhaWxhYmxlIHNwYWNlIG9uIHRoZSBkaXNrIHdpbGwgYmUgcmVkdWNlZCB0byB0aGUKKyAgLy8vIGFtb3VudCBvZiBhdmFpbGFibGUgc3BhY2UuIEEgdmFsdWUgb2YgMCB3aWxsIGJlIGlnbm9yZWQuCisgIHZvaWQgc2V0Q2FjaGVNYXhTaXplQnl0ZXModW5zaWduZWQgTWF4U2l6ZUJ5dGVzKSB7CisgICAgaWYgKE1heFNpemVCeXRlcykKKyAgICAgIENhY2hlT3B0aW9ucy5Qb2xpY3kuTWF4U2l6ZUJ5dGVzID0gTWF4U2l6ZUJ5dGVzOworICB9CisKKyAgLy8vIENhY2hlIHBvbGljeTogdGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIGluIHRoZSBjYWNoZSBkaXJlY3RvcnkuIEEgdmFsdWUKKyAgLy8vIG9mIDAgd2lsbCBiZSBpZ25vcmVkLgorICB2b2lkIHNldENhY2hlTWF4U2l6ZUZpbGVzKHVuc2lnbmVkIE1heFNpemVGaWxlcykgeworICAgIGlmIChNYXhTaXplRmlsZXMpCisgICAgICBDYWNoZU9wdGlvbnMuUG9saWN5Lk1heFNpemVGaWxlcyA9IE1heFNpemVGaWxlczsKKyAgfQorCisgIC8qKkB9Ki8KKworICAvLy8gU2V0IHRoZSBwYXRoIHRvIGEgZGlyZWN0b3J5IHdoZXJlIHRvIHNhdmUgdGVtcG9yYXJpZXMgYXQgdmFyaW91cyBzdGFnZXMgb2YKKyAgLy8vIHRoZSBwcm9jZXNzaW5nLgorICB2b2lkIHNldFNhdmVUZW1wc0RpcihzdGQ6OnN0cmluZyBQYXRoKSB7IFNhdmVUZW1wc0RpciA9IHN0ZDo6bW92ZShQYXRoKTsgfQorCisgIC8vLyBTZXQgdGhlIHBhdGggdG8gYSBkaXJlY3Rvcnkgd2hlcmUgdG8gc2F2ZSBnZW5lcmF0ZWQgb2JqZWN0IGZpbGVzLiBUaGlzCisgIC8vLyBwYXRoIGNhbiBiZSB1c2VkIGJ5IGEgbGlua2VyIHRvIHJlcXVlc3Qgb24tZGlzayBmaWxlcyBpbnN0ZWFkIG9mIGluLW1lbW9yeQorICAvLy8gYnVmZmVycy4gV2hlbiBzZXQsIHJlc3VsdHMgYXJlIGF2YWlsYWJsZSB0aHJvdWdoIGdldFByb2R1Y2VkQmluYXJ5RmlsZXMoKQorICAvLy8gaW5zdGVhZCBvZiBnZXRQcm9kdWNlZEJpbmFyaWVzKCkuCisgIHZvaWQgc2V0R2VuZXJhdGVkT2JqZWN0c0RpcmVjdG9yeShzdGQ6OnN0cmluZyBQYXRoKSB7CisgICAgU2F2ZWRPYmplY3RzRGlyZWN0b3J5UGF0aCA9IHN0ZDo6bW92ZShQYXRoKTsKKyAgfQorCisgIC8vLyBDUFUgdG8gdXNlIHRvIGluaXRpYWxpemUgdGhlIFRhcmdldE1hY2hpbmUKKyAgdm9pZCBzZXRDcHUoc3RkOjpzdHJpbmcgQ3B1KSB7IFRNQnVpbGRlci5NQ3B1ID0gc3RkOjptb3ZlKENwdSk7IH0KKworICAvLy8gU3VidGFyZ2V0IGF0dHJpYnV0ZXMKKyAgdm9pZCBzZXRBdHRyKHN0ZDo6c3RyaW5nIE1BdHRyKSB7IFRNQnVpbGRlci5NQXR0ciA9IHN0ZDo6bW92ZShNQXR0cik7IH0KKworICAvLy8gVGFyZ2V0TWFjaGluZSBvcHRpb25zCisgIHZvaWQgc2V0VGFyZ2V0T3B0aW9ucyhUYXJnZXRPcHRpb25zIE9wdGlvbnMpIHsKKyAgICBUTUJ1aWxkZXIuT3B0aW9ucyA9IHN0ZDo6bW92ZShPcHRpb25zKTsKKyAgfQorCisgIC8vLyBFbmFibGUgdGhlIEZyZWVzdGFuZGluZyBtb2RlOiBpbmRpY2F0ZSB0aGF0IHRoZSBvcHRpbWl6ZXIgc2hvdWxkIG5vdAorICAvLy8gYXNzdW1lIGJ1aWx0aW5zIGFyZSBwcmVzZW50IG9uIHRoZSB0YXJnZXQuCisgIHZvaWQgc2V0RnJlZXN0YW5kaW5nKGJvb2wgRW5hYmxlZCkgeyBGcmVlc3RhbmRpbmcgPSBFbmFibGVkOyB9CisKKyAgLy8vIENvZGVNb2RlbAorICB2b2lkIHNldENvZGVQSUNNb2RlbChPcHRpb25hbDxSZWxvYzo6TW9kZWw+IE1vZGVsKSB7CisgICAgVE1CdWlsZGVyLlJlbG9jTW9kZWwgPSBNb2RlbDsKKyAgfQorCisgIC8vLyBDb2RlR2VuIG9wdGltaXphdGlvbiBsZXZlbAorICB2b2lkIHNldENvZGVHZW5PcHRMZXZlbChDb2RlR2VuT3B0OjpMZXZlbCBDR09wdExldmVsKSB7CisgICAgVE1CdWlsZGVyLkNHT3B0TGV2ZWwgPSBDR09wdExldmVsOworICB9CisKKyAgLy8vIElSIG9wdGltaXphdGlvbiBsZXZlbDogZnJvbSAwIHRvIDMuCisgIHZvaWQgc2V0T3B0TGV2ZWwodW5zaWduZWQgTmV3T3B0TGV2ZWwpIHsKKyAgICBPcHRMZXZlbCA9IChOZXdPcHRMZXZlbCA+IDMpID8gMyA6IE5ld09wdExldmVsOworICB9CisKKyAgLy8vIERpc2FibGUgQ29kZUdlbiwgb25seSBydW4gdGhlIHN0YWdlcyB0aWxsIGNvZGVnZW4gYW5kIHN0b3AuIFRoZSBvdXRwdXQKKyAgLy8vIHdpbGwgYmUgYml0Y29kZS4KKyAgdm9pZCBkaXNhYmxlQ29kZUdlbihib29sIERpc2FibGUpIHsgRGlzYWJsZUNvZGVHZW4gPSBEaXNhYmxlOyB9CisKKyAgLy8vIFBlcmZvcm0gQ29kZUdlbiBvbmx5OiBkaXNhYmxlIGFsbCBvdGhlciBzdGFnZXMuCisgIHZvaWQgc2V0Q29kZUdlbk9ubHkoYm9vbCBDR09ubHkpIHsgQ29kZUdlbk9ubHkgPSBDR09ubHk7IH0KKworICAvKipAfSovCisKKyAgLyoqCisgICAqIFxkZWZncm91cCBTZXQgb2YgQVBJcyB0byBydW4gaW5kaXZpZHVhbCBzdGFnZXMgaW4gaXNvbGF0aW9uLgorICAgKiBAeworICAgKi8KKworICAvKioKKyAgICogUHJvZHVjZSB0aGUgY29tYmluZWQgc3VtbWFyeSBpbmRleCBmcm9tIGFsbCB0aGUgYml0Y29kZSBmaWxlczoKKyAgICogInRoaW4tbGluayIuCisgICAqLworICBzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlU3VtbWFyeUluZGV4PiBsaW5rQ29tYmluZWRJbmRleCgpOworCisgIC8qKgorICAgKiBQZXJmb3JtIHByb21vdGlvbiBhbmQgcmVuYW1pbmcgb2YgZXhwb3J0ZWQgaW50ZXJuYWwgZnVuY3Rpb25zLAorICAgKiBhbmQgYWRkaXRpb25hbGx5IHJlc29sdmUgd2VhayBhbmQgbGlua29uY2Ugc3ltYm9scy4KKyAgICogSW5kZXggaXMgdXBkYXRlZCB0byByZWZsZWN0IGxpbmthZ2UgY2hhbmdlcyBmcm9tIHdlYWsgcmVzb2x1dGlvbi4KKyAgICovCisgIHZvaWQgcHJvbW90ZShNb2R1bGUgJk1vZHVsZSwgTW9kdWxlU3VtbWFyeUluZGV4ICZJbmRleCk7CisKKyAgLyoqCisgICAqIENvbXB1dGUgYW5kIGVtaXQgdGhlIGltcG9ydGVkIGZpbGVzIGZvciBtb2R1bGUgYXQgXHAgTW9kdWxlUGF0aC4KKyAgICovCisgIHN0YXRpYyB2b2lkIGVtaXRJbXBvcnRzKFN0cmluZ1JlZiBNb2R1bGVQYXRoLCBTdHJpbmdSZWYgT3V0cHV0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW9kdWxlU3VtbWFyeUluZGV4ICZJbmRleCk7CisKKyAgLyoqCisgICAqIFBlcmZvcm0gY3Jvc3MtbW9kdWxlIGltcG9ydGluZyBmb3IgdGhlIG1vZHVsZSBpZGVudGlmaWVkIGJ5CisgICAqIE1vZHVsZUlkZW50aWZpZXIuCisgICAqLworICB2b2lkIGNyb3NzTW9kdWxlSW1wb3J0KE1vZHVsZSAmTW9kdWxlLCBNb2R1bGVTdW1tYXJ5SW5kZXggJkluZGV4KTsKKworICAvKioKKyAgICogQ29tcHV0ZSB0aGUgbGlzdCBvZiBzdW1tYXJpZXMgbmVlZGVkIGZvciBpbXBvcnRpbmcgaW50byBtb2R1bGUuCisgICAqLworICBzdGF0aWMgdm9pZCBnYXRoZXJJbXBvcnRlZFN1bW1hcmllc0Zvck1vZHVsZSgKKyAgICAgIFN0cmluZ1JlZiBNb2R1bGVQYXRoLCBNb2R1bGVTdW1tYXJ5SW5kZXggJkluZGV4LAorICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEdWU3VtbWFyeU1hcFR5PiAmTW9kdWxlVG9TdW1tYXJpZXNGb3JJbmRleCk7CisKKyAgLyoqCisgICAqIFBlcmZvcm0gaW50ZXJuYWxpemF0aW9uLiBJbmRleCBpcyB1cGRhdGVkIHRvIHJlZmxlY3QgbGlua2FnZSBjaGFuZ2VzLgorICAgKi8KKyAgdm9pZCBpbnRlcm5hbGl6ZShNb2R1bGUgJk1vZHVsZSwgTW9kdWxlU3VtbWFyeUluZGV4ICZJbmRleCk7CisKKyAgLyoqCisgICAqIFBlcmZvcm0gcG9zdC1pbXBvcnRpbmcgVGhpbkxUTyBvcHRpbWl6YXRpb25zLgorICAgKi8KKyAgdm9pZCBvcHRpbWl6ZShNb2R1bGUgJk1vZHVsZSk7CisKKyAgLyoqCisgICAqIFBlcmZvcm0gVGhpbkxUTyBDb2RlR2VuLgorICAgKi8KKyAgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gY29kZWdlbihNb2R1bGUgJk1vZHVsZSk7CisKKyAgLyoqQH0qLworCitwcml2YXRlOgorICAvLy8gSGVscGVyIGZhY3RvcnkgdG8gYnVpbGQgYSBUYXJnZXRNYWNoaW5lCisgIFRhcmdldE1hY2hpbmVCdWlsZGVyIFRNQnVpbGRlcjsKKworICAvLy8gVmVjdG9yIGhvbGRpbmcgdGhlIGluLW1lbW9yeSBidWZmZXIgY29udGFpbmluZyB0aGUgcHJvZHVjZWQgYmluYXJpZXMsIHdoZW4KKyAgLy8vIFNhdmVkT2JqZWN0c0RpcmVjdG9yeVBhdGggaXNuJ3Qgc2V0LgorICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPj4gUHJvZHVjZWRCaW5hcmllczsKKworICAvLy8gUGF0aCB0byBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIHN1cHBsaWVkIFNhdmVkT2JqZWN0c0RpcmVjdG9yeVBhdGggaWYgYW55LgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gUHJvZHVjZWRCaW5hcnlGaWxlczsKKworICAvLy8gVmVjdG9yIGhvbGRpbmcgdGhlIGlucHV0IGJ1ZmZlcnMgY29udGFpbmluZyB0aGUgYml0Y29kZSBtb2R1bGVzIHRvCisgIC8vLyBwcm9jZXNzLgorICBzdGQ6OnZlY3RvcjxUaGluTFRPQnVmZmVyPiBNb2R1bGVzOworCisgIC8vLyBTZXQgb2Ygc3ltYm9scyB0aGF0IG5lZWQgdG8gYmUgcHJlc2VydmVkIG91dHNpZGUgb2YgdGhlIHNldCBvZiBiaXRjb2RlCisgIC8vLyBmaWxlcy4KKyAgU3RyaW5nU2V0PD4gUHJlc2VydmVkU3ltYm9sczsKKworICAvLy8gU2V0IG9mIHN5bWJvbHMgdGhhdCBhcmUgY3Jvc3MtcmVmZXJlbmNlZCBiZXR3ZWVuIGJpdGNvZGUgZmlsZXMuCisgIFN0cmluZ1NldDw+IENyb3NzUmVmZXJlbmNlZFN5bWJvbHM7CisKKyAgLy8vIENvbnRyb2wgdGhlIGNhY2hpbmcgYmVoYXZpb3IuCisgIENhY2hpbmdPcHRpb25zIENhY2hlT3B0aW9uczsKKworICAvLy8gUGF0aCB0byBhIGRpcmVjdG9yeSB0byBzYXZlIHRoZSB0ZW1wb3JhcnkgYml0Y29kZSBmaWxlcy4KKyAgc3RkOjpzdHJpbmcgU2F2ZVRlbXBzRGlyOworCisgIC8vLyBQYXRoIHRvIGEgZGlyZWN0b3J5IHRvIHNhdmUgdGhlIGdlbmVyYXRlZCBvYmplY3QgZmlsZXMuCisgIHN0ZDo6c3RyaW5nIFNhdmVkT2JqZWN0c0RpcmVjdG9yeVBhdGg7CisKKyAgLy8vIEZsYWcgdG8gZW5hYmxlL2Rpc2FibGUgQ29kZUdlbi4gV2hlbiBzZXQgdG8gdHJ1ZSwgdGhlIHByb2Nlc3Mgc3RvcHMgYWZ0ZXIKKyAgLy8vIG9wdGltaXphdGlvbnMgYW5kIGEgYml0Y29kZSBpcyBwcm9kdWNlZC4KKyAgYm9vbCBEaXNhYmxlQ29kZUdlbiA9IGZhbHNlOworCisgIC8vLyBGbGFnIHRvIGluZGljYXRlIHRoYXQgb25seSB0aGUgQ29kZUdlbiB3aWxsIGJlIHBlcmZvcm1lZCwgbm8gY3Jvc3MtbW9kdWxlCisgIC8vLyBpbXBvcnRpbmcgb3Igb3B0aW1pemF0aW9uLgorICBib29sIENvZGVHZW5Pbmx5ID0gZmFsc2U7CisKKyAgLy8vIEZsYWcgdG8gaW5kaWNhdGUgdGhhdCB0aGUgb3B0aW1pemVyIHNob3VsZCBub3QgYXNzdW1lIGJ1aWx0aW5zIGFyZSBwcmVzZW50CisgIC8vLyBvbiB0aGUgdGFyZ2V0LgorICBib29sIEZyZWVzdGFuZGluZyA9IGZhbHNlOworCisgIC8vLyBJUiBPcHRpbWl6YXRpb24gTGV2ZWwgWzAtM10uCisgIHVuc2lnbmVkIE9wdExldmVsID0gMzsKK307Cit9CisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTFRPL2xlZ2FjeS9VcGRhdGVDb21waWxlclVzZWQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTFRPL2xlZ2FjeS9VcGRhdGVDb21waWxlclVzZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YmUwMDI3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MVE8vbGVnYWN5L1VwZGF0ZUNvbXBpbGVyVXNlZC5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vPT0tLS0tLS0gVXBkYXRlQ29tcGlsZXJVc2VkLmggLSBMTFZNIExpbmsgVGltZSBPcHRpbWl6ZXIgVXRpbGl0eSAtLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIGEgaGVscGVyIGNsYXNzIHRvIHVwZGF0ZSBsbHZtLmNvbXBpbGVyX3VzZWQgbWV0YWRhdGEuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0xUT19VUERBVEVfQ09NUElMRVJfVVNFRF9ICisjZGVmaW5lIExMVk1fTFRPX1VQREFURV9DT01QSUxFUl9VU0VEX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsVmFsdWUuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTW9kdWxlOworY2xhc3MgVGFyZ2V0TWFjaGluZTsKKworLy8vIEZpbmQgYWxsIGdsb2JhbHMgaW4gXHAgVGhlTW9kdWxlIHRoYXQgYXJlIHJlZmVyZW5jZWQgaW4KKy8vLyBccCBBc21VbmRlZmluZWRSZWZzLCBhcyB3ZWxsIGFzIHRoZSB1c2VyLXN1cHBsaWVkIGZ1bmN0aW9ucyBkZWZpbml0aW9ucyB0aGF0CisvLy8gYXJlIGFsc28gbGliY2FsbHMsIGFuZCBjcmVhdGUgb3IgdXBkYXRlIHRoZSBtYWdpYyAibGx2bS5jb21waWxlcl91c2VkIgorLy8vIGdsb2JhbCBpbiBccCBUaGVNb2R1bGUuCit2b2lkIHVwZGF0ZUNvbXBpbGVyVXNlZChNb2R1bGUgJlRoZU1vZHVsZSwgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdTZXQ8PiAmQXNtVW5kZWZpbmVkUmVmcyk7Cit9CisKKyNlbmRpZiAvLyBMTFZNX0xUT19VUERBVEVfQ09NUElMRVJfVVNFRF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xpbmVFZGl0b3IvTGluZUVkaXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MaW5lRWRpdG9yL0xpbmVFZGl0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODk5NWQwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MaW5lRWRpdG9yL0xpbmVFZGl0b3IuaApAQCAtMCwwICsxLDE1NCBAQAorLy89PT0tLSBsbHZtL0xpbmVFZGl0b3IvTGluZUVkaXRvci5oIC0gbGluZSBlZGl0b3IgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0xJTkVFRElUT1JfTElORUVESVRPUl9ICisjZGVmaW5lIExMVk1fTElORUVESVRPUl9MSU5FRURJVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8Y3N0ZGlvPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTGluZUVkaXRvciB7CitwdWJsaWM6CisgIC8vLyBDcmVhdGUgYSBMaW5lRWRpdG9yIG9iamVjdC4KKyAgLy8vCisgIC8vLyBccGFyYW0gUHJvZ05hbWUgVGhlIG5hbWUgb2YgdGhlIGN1cnJlbnQgcHJvZ3JhbS4gVXNlZCB0byBmb3JtIGEgZGVmYXVsdAorICAvLy8gcHJvbXB0LgorICAvLy8gXHBhcmFtIEhpc3RvcnlQYXRoIFBhdGggdG8gdGhlIGZpbGUgaW4gd2hpY2ggdG8gc3RvcmUgaGlzdG9yeSBkYXRhLCBpZgorICAvLy8gcG9zc2libGUuCisgIC8vLyBccGFyYW0gSW4gVGhlIGlucHV0IHN0cmVhbSB1c2VkIGJ5IHRoZSBlZGl0b3IuCisgIC8vLyBccGFyYW0gT3V0IFRoZSBvdXRwdXQgc3RyZWFtIHVzZWQgYnkgdGhlIGVkaXRvci4KKyAgLy8vIFxwYXJhbSBFcnIgVGhlIGVycm9yIHN0cmVhbSB1c2VkIGJ5IHRoZSBlZGl0b3IuCisgIExpbmVFZGl0b3IoU3RyaW5nUmVmIFByb2dOYW1lLCBTdHJpbmdSZWYgSGlzdG9yeVBhdGggPSAiIiwgRklMRSAqSW4gPSBzdGRpbiwKKyAgICAgICAgICAgICBGSUxFICpPdXQgPSBzdGRvdXQsIEZJTEUgKkVyciA9IHN0ZGVycik7CisgIH5MaW5lRWRpdG9yKCk7CisKKyAgLy8vIFJlYWRzIGEgbGluZS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSBsaW5lLCBvciBsbHZtOjpPcHRpb25hbDxzdGQ6OnN0cmluZz4oKSBvbiBFT0YuCisgIGxsdm06Ok9wdGlvbmFsPHN0ZDo6c3RyaW5nPiByZWFkTGluZSgpIGNvbnN0OworCisgIHZvaWQgc2F2ZUhpc3RvcnkoKTsKKyAgdm9pZCBsb2FkSGlzdG9yeSgpOworCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXREZWZhdWx0SGlzdG9yeVBhdGgoU3RyaW5nUmVmIFByb2dOYW1lKTsKKworICAvLy8gVGhlIGFjdGlvbiB0byBwZXJmb3JtIHVwb24gYSBjb21wbGV0aW9uIHJlcXVlc3QuCisgIHN0cnVjdCBDb21wbGV0aW9uQWN0aW9uIHsKKyAgICBlbnVtIEFjdGlvbktpbmQgeworICAgICAgLy8vIEluc2VydCBUZXh0IGF0IHRoZSBjdXJzb3IgcG9zaXRpb24uCisgICAgICBBS19JbnNlcnQsCisgICAgICAvLy8gU2hvdyBDb21wbGV0aW9ucywgb3IgYmVlcCBpZiB0aGUgbGlzdCBpcyBlbXB0eS4KKyAgICAgIEFLX1Nob3dDb21wbGV0aW9ucworICAgIH07CisKKyAgICBBY3Rpb25LaW5kIEtpbmQ7CisKKyAgICAvLy8gVGhlIHRleHQgdG8gaW5zZXJ0LgorICAgIHN0ZDo6c3RyaW5nIFRleHQ7CisKKyAgICAvLy8gVGhlIGxpc3Qgb2YgY29tcGxldGlvbnMgdG8gc2hvdy4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gQ29tcGxldGlvbnM7CisgIH07CisKKyAgLy8vIEEgcG9zc2libGUgY29tcGxldGlvbiBhdCBhIGdpdmVuIGN1cnNvciBwb3NpdGlvbi4KKyAgc3RydWN0IENvbXBsZXRpb24geworICAgIENvbXBsZXRpb24oKSB7fQorICAgIENvbXBsZXRpb24oY29uc3Qgc3RkOjpzdHJpbmcgJlR5cGVkVGV4dCwgY29uc3Qgc3RkOjpzdHJpbmcgJkRpc3BsYXlUZXh0KQorICAgICAgICA6IFR5cGVkVGV4dChUeXBlZFRleHQpLCBEaXNwbGF5VGV4dChEaXNwbGF5VGV4dCkge30KKworICAgIC8vLyBUaGUgdGV4dCB0byBpbnNlcnQuIElmIHRoZSB1c2VyIGhhcyBhbHJlYWR5IGlucHV0IHNvbWUgb2YgdGhlCisgICAgLy8vIGNvbXBsZXRpb24sIHRoaXMgc2hvdWxkIG9ubHkgaW5jbHVkZSB0aGUgcmVzdCBvZiB0aGUgdGV4dC4KKyAgICBzdGQ6OnN0cmluZyBUeXBlZFRleHQ7CisKKyAgICAvLy8gQSBkZXNjcmlwdGlvbiBvZiB0aGlzIGNvbXBsZXRpb24uIFRoaXMgbWF5IGJlIHRoZSBjb21wbGV0aW9uIGl0c2VsZiwgb3IKKyAgICAvLy8gbWF5YmUgYSBzdW1tYXJ5IG9mIGl0cyB0eXBlIG9yIGFyZ3VtZW50cy4KKyAgICBzdGQ6OnN0cmluZyBEaXNwbGF5VGV4dDsKKyAgfTsKKworICAvLy8gU2V0IHRoZSBjb21wbGV0ZXIgZm9yIHRoaXMgTGluZUVkaXRvci4gQSBjb21wbGV0ZXIgaXMgYSBmdW5jdGlvbiBvYmplY3QKKyAgLy8vIHdoaWNoIHRha2VzIGFyZ3VtZW50cyBvZiB0eXBlIFN0cmluZ1JlZiAodGhlIHN0cmluZyB0byBjb21wbGV0ZSkgYW5kCisgIC8vLyBzaXplX3QgKHRoZSB6ZXJvLWJhc2VkIGN1cnNvciBwb3NpdGlvbiBpbiB0aGUgU3RyaW5nUmVmKSBhbmQgcmV0dXJucyBhCisgIC8vLyBDb21wbGV0aW9uQWN0aW9uLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBzZXRDb21wbGV0ZXIoVCBDb21wKSB7CisgICAgQ29tcGxldGVyLnJlc2V0KG5ldyBDb21wbGV0ZXJNb2RlbDxUPihDb21wKSk7CisgIH0KKworICAvLy8gU2V0IHRoZSBjb21wbGV0ZXIgZm9yIHRoaXMgTGluZUVkaXRvciB0byB0aGUgZ2l2ZW4gbGlzdCBjb21wbGV0ZXIuCisgIC8vLyBBIGxpc3QgY29tcGxldGVyIGlzIGEgZnVuY3Rpb24gb2JqZWN0IHdoaWNoIHRha2VzIGFyZ3VtZW50cyBvZiB0eXBlCisgIC8vLyBTdHJpbmdSZWYgKHRoZSBzdHJpbmcgdG8gY29tcGxldGUpIGFuZCBzaXplX3QgKHRoZSB6ZXJvLWJhc2VkIGN1cnNvcgorICAvLy8gcG9zaXRpb24gaW4gdGhlIFN0cmluZ1JlZikgYW5kIHJldHVybnMgYSBzdGQ6OnZlY3RvcjxDb21wbGV0aW9uPi4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgc2V0TGlzdENvbXBsZXRlcihUIENvbXApIHsKKyAgICBDb21wbGV0ZXIucmVzZXQobmV3IExpc3RDb21wbGV0ZXJNb2RlbDxUPihDb21wKSk7CisgIH0KKworICAvLy8gVXNlIHRoZSBjdXJyZW50IGNvbXBsZXRlciB0byBwcm9kdWNlIGEgQ29tcGxldGlvbkFjdGlvbiBmb3IgdGhlIGdpdmVuCisgIC8vLyBjb21wbGV0aW9uIHJlcXVlc3QuIElmIHRoZSBjdXJyZW50IGNvbXBsZXRlciBpcyBhIGxpc3QgY29tcGxldGVyLCB0aGlzCisgIC8vLyB3aWxsIHJldHVybiBhbiBBS19JbnNlcnQgQ29tcGxldGlvbkFjdGlvbiBpZiBlYWNoIGNvbXBsZXRpb24gaGFzIGEgY29tbW9uCisgIC8vLyBwcmVmaXgsIG9yIGFuIEFLX1Nob3dDb21wbGV0aW9ucyBDb21wbGV0aW9uQWN0aW9uIG90aGVyd2lzZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gQnVmZmVyIFRoZSBzdHJpbmcgdG8gY29tcGxldGUKKyAgLy8vIFxwYXJhbSBQb3MgVGhlIHplcm8tYmFzZWQgY3Vyc29yIHBvc2l0aW9uIGluIHRoZSBTdHJpbmdSZWYKKyAgQ29tcGxldGlvbkFjdGlvbiBnZXRDb21wbGV0aW9uQWN0aW9uKFN0cmluZ1JlZiBCdWZmZXIsIHNpemVfdCBQb3MpIGNvbnN0OworCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXRQcm9tcHQoKSBjb25zdCB7IHJldHVybiBQcm9tcHQ7IH0KKyAgdm9pZCBzZXRQcm9tcHQoY29uc3Qgc3RkOjpzdHJpbmcgJlApIHsgUHJvbXB0ID0gUDsgfQorCisgIC8vIFB1YmxpYyBzbyBjYWxsYmFja3MgaW4gTGluZUVkaXRvci5jcHAgY2FuIHVzZSBpdC4KKyAgc3RydWN0IEludGVybmFsRGF0YTsKKworcHJpdmF0ZToKKyAgc3RkOjpzdHJpbmcgUHJvbXB0OworICBzdGQ6OnN0cmluZyBIaXN0b3J5UGF0aDsKKyAgc3RkOjp1bmlxdWVfcHRyPEludGVybmFsRGF0YT4gRGF0YTsKKworICBzdHJ1Y3QgQ29tcGxldGVyQ29uY2VwdCB7CisgICAgdmlydHVhbCB+Q29tcGxldGVyQ29uY2VwdCgpOworICAgIHZpcnR1YWwgQ29tcGxldGlvbkFjdGlvbiBjb21wbGV0ZShTdHJpbmdSZWYgQnVmZmVyLCBzaXplX3QgUG9zKSBjb25zdCA9IDA7CisgIH07CisKKyAgc3RydWN0IExpc3RDb21wbGV0ZXJDb25jZXB0IDogQ29tcGxldGVyQ29uY2VwdCB7CisgICAgfkxpc3RDb21wbGV0ZXJDb25jZXB0KCkgb3ZlcnJpZGU7CisgICAgQ29tcGxldGlvbkFjdGlvbiBjb21wbGV0ZShTdHJpbmdSZWYgQnVmZmVyLCBzaXplX3QgUG9zKSBjb25zdCBvdmVycmlkZTsKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0Q29tbW9uUHJlZml4KGNvbnN0IHN0ZDo6dmVjdG9yPENvbXBsZXRpb24+ICZDb21wcyk7CisgICAgdmlydHVhbCBzdGQ6OnZlY3RvcjxDb21wbGV0aW9uPiBnZXRDb21wbGV0aW9ucyhTdHJpbmdSZWYgQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IFBvcykgY29uc3QgPSAwOworICB9OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdHJ1Y3QgQ29tcGxldGVyTW9kZWwgOiBDb21wbGV0ZXJDb25jZXB0IHsKKyAgICBDb21wbGV0ZXJNb2RlbChUIFZhbHVlKSA6IFZhbHVlKFZhbHVlKSB7fQorICAgIENvbXBsZXRpb25BY3Rpb24gY29tcGxldGUoU3RyaW5nUmVmIEJ1ZmZlciwgc2l6ZV90IFBvcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIFZhbHVlKEJ1ZmZlciwgUG9zKTsKKyAgICB9CisgICAgVCBWYWx1ZTsKKyAgfTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RydWN0IExpc3RDb21wbGV0ZXJNb2RlbCA6IExpc3RDb21wbGV0ZXJDb25jZXB0IHsKKyAgICBMaXN0Q29tcGxldGVyTW9kZWwoVCBWYWx1ZSkgOiBWYWx1ZShzdGQ6Om1vdmUoVmFsdWUpKSB7fQorICAgIHN0ZDo6dmVjdG9yPENvbXBsZXRpb24+IGdldENvbXBsZXRpb25zKFN0cmluZ1JlZiBCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IFBvcykgY29uc3Qgb3ZlcnJpZGUgeworICAgICAgcmV0dXJuIFZhbHVlKEJ1ZmZlciwgUG9zKTsKKyAgICB9CisgICAgVCBWYWx1ZTsKKyAgfTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgQ29tcGxldGVyQ29uY2VwdD4gQ29tcGxldGVyOworfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTGlua0FsbElSLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xpbmtBbGxJUi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhOWYzZDMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xpbmtBbGxJUi5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vPT09LS0tLS0gTGlua0FsbElSLmggLSBSZWZlcmVuY2UgQWxsIFZNQ29yZSBDb2RlIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgcHVsbHMgaW4gYWxsIHRoZSBvYmplY3QgbW9kdWxlcyBvZiB0aGUgVk1Db3JlIGxpYnJhcnkgc28KKy8vIHRoYXQgdG9vbHMgbGlrZSBsbGMsIG9wdCwgYW5kIGxsaSBjYW4gZW5zdXJlIHRoZXkgYXJlIGxpbmtlZCB3aXRoIGFsbCBzeW1ib2xzCisvLyBmcm9tIGxpYlZNQ29yZS5hIEl0IHNob3VsZCBvbmx5IGJlIHVzZWQgZnJvbSBhIHRvb2wncyBtYWluIHByb2dyYW0uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0xJTktBTExJUl9ICisjZGVmaW5lIExMVk1fTElOS0FMTElSX0gKKworI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbmxpbmVBc20uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSVIvTExWTUNvbnRleHQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmVyaWZpZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRHluYW1pY0xpYnJhcnkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTXV0ZXguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUGF0aC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Qcm9jZXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1Byb2dyYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU2lnbmFscy5oIgorI2luY2x1ZGUgPGNzdGRsaWI+CisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBGb3JjZVZNQ29yZUxpbmtpbmcgeworICAgIEZvcmNlVk1Db3JlTGlua2luZygpIHsKKyAgICAgIC8vIFdlIG11c3QgcmVmZXJlbmNlIFZNQ29yZSBpbiBzdWNoIGEgd2F5IHRoYXQgY29tcGlsZXJzIHdpbGwgbm90CisgICAgICAvLyBkZWxldGUgaXQgYWxsIGFzIGRlYWQgY29kZSwgZXZlbiB3aXRoIHdob2xlIHByb2dyYW0gb3B0aW1pemF0aW9uLAorICAgICAgLy8geWV0IGlzIGVmZmVjdGl2ZWx5IGEgTk8tT1AuIEFzIHRoZSBjb21waWxlciBpc24ndCBzbWFydCBlbm91Z2gKKyAgICAgIC8vIHRvIGtub3cgdGhhdCBnZXRlbnYoKSBuZXZlciByZXR1cm5zIC0xLCB0aGlzIHdpbGwgZG8gdGhlIGpvYi4KKyAgICAgIGlmIChzdGQ6OmdldGVudigiYmFyIikgIT0gKGNoYXIqKSAtMSkKKyAgICAgICAgcmV0dXJuOworICAgICAgbGx2bTo6TExWTUNvbnRleHQgQ29udGV4dDsKKyAgICAgICh2b2lkKW5ldyBsbHZtOjpNb2R1bGUoIiIsIENvbnRleHQpOworICAgICAgKHZvaWQpbmV3IGxsdm06OlVucmVhY2hhYmxlSW5zdChDb250ZXh0KTsKKyAgICAgICh2b2lkKSAgICBsbHZtOjpjcmVhdGVWZXJpZmllclBhc3MoKTsgCisgICAgfQorICB9IEZvcmNlVk1Db3JlTGlua2luZzsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xpbmtBbGxQYXNzZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTGlua0FsbFBhc3Nlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNzk1NmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xpbmtBbGxQYXNzZXMuaApAQCAtMCwwICsxLDIzMSBAQAorLy89PT0tIGxsdm0vTGlua0FsbFBhc3Nlcy5oIC0tLS0tLS0tLS0tLSBSZWZlcmVuY2UgQWxsIFBhc3NlcyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBwdWxscyBpbiBhbGwgdHJhbnNmb3JtYXRpb24gYW5kIGFuYWx5c2lzIHBhc3NlcyBmb3IgdG9vbHMKKy8vIGxpa2Ugb3B0IGFuZCBidWdwb2ludCB0aGF0IG5lZWQgdGhpcyBmdW5jdGlvbmFsaXR5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9MSU5LQUxMUEFTU0VTX0gKKyNkZWZpbmUgTExWTV9MSU5LQUxMUEFTU0VTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0YXRpc3RpYy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpc0V2YWx1YXRvci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNTZXRUcmFja2VyLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9CYXNpY0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0NGTEFuZGVyc0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0NGTFN0ZWVuc0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0NhbGxQcmludGVyLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Eb21QcmludGVyLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9HbG9iYWxzTW9kUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9JbnRlcnZhbFBhcnRpdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTGludC5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Qb3N0RG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvUmVnaW9uUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvUmVnaW9uUHJpbnRlci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb25BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY29wZWROb0FsaWFzQUEuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1RhcmdldExpYnJhcnlJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9UeXBlQmFzZWRBbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9Db2RlR2VuL1Bhc3Nlcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0lSUHJpbnRpbmdQYXNzZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVmFsZ3JpbmQuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvSVBPLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL0lQTy9BbHdheXNJbmxpbmVyLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL0lQTy9GdW5jdGlvbkF0dHJzLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24vQm91bmRzQ2hlY2tpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvT2JqQ0FSQy5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9TY2FsYXIuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0dWTi5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9TeW1ib2xSZXdyaXRlci5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9VbmlmeUZ1bmN0aW9uRXhpdE5vZGVzLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1ZlY3Rvcml6ZS5oIgorI2luY2x1ZGUgPGNzdGRsaWI+CisKK25hbWVzcGFjZSB7CisgIHN0cnVjdCBGb3JjZVBhc3NMaW5raW5nIHsKKyAgICBGb3JjZVBhc3NMaW5raW5nKCkgeworICAgICAgLy8gV2UgbXVzdCByZWZlcmVuY2UgdGhlIHBhc3NlcyBpbiBzdWNoIGEgd2F5IHRoYXQgY29tcGlsZXJzIHdpbGwgbm90CisgICAgICAvLyBkZWxldGUgaXQgYWxsIGFzIGRlYWQgY29kZSwgZXZlbiB3aXRoIHdob2xlIHByb2dyYW0gb3B0aW1pemF0aW9uLAorICAgICAgLy8geWV0IGlzIGVmZmVjdGl2ZWx5IGEgTk8tT1AuIEFzIHRoZSBjb21waWxlciBpc24ndCBzbWFydCBlbm91Z2gKKyAgICAgIC8vIHRvIGtub3cgdGhhdCBnZXRlbnYoKSBuZXZlciByZXR1cm5zIC0xLCB0aGlzIHdpbGwgZG8gdGhlIGpvYi4KKyAgICAgIGlmIChzdGQ6OmdldGVudigiYmFyIikgIT0gKGNoYXIqKSAtMSkKKyAgICAgICAgcmV0dXJuOworCisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlQUFFdmFsUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUFnZ3Jlc3NpdmVEQ0VQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlQml0VHJhY2tpbmdEQ0VQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlQXJndW1lbnRQcm9tb3Rpb25QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlQWxpZ25tZW50RnJvbUFzc3VtcHRpb25zUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUJhc2ljQUFXcmFwcGVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVNDRVZBQVdyYXBwZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlVHlwZUJhc2VkQUFXcmFwcGVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVNjb3BlZE5vQWxpYXNBQVdyYXBwZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlQm91bmRzQ2hlY2tpbmdMZWdhY3lQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlQnJlYWtDcml0aWNhbEVkZ2VzUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUNhbGxHcmFwaERPVFByaW50ZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlQ2FsbEdyYXBoVmlld2VyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUNGR1NpbXBsaWZpY2F0aW9uUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUNGTEFuZGVyc0FBV3JhcHBlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVDRkxTdGVlbnNBQVdyYXBwZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlU3RydWN0dXJpemVDRkdQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTGliQ2FsbHNTaHJpbmtXcmFwUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUNhbGxlZFZhbHVlUHJvcGFnYXRpb25QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlQ29uc3RhbnRNZXJnZVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVDb25zdGFudFByb3BhZ2F0aW9uUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUNvc3RNb2RlbEFuYWx5c2lzUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZURlYWRBcmdFbGltaW5hdGlvblBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVEZWFkQ29kZUVsaW1pbmF0aW9uUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZURlYWRJbnN0RWxpbWluYXRpb25QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRGVhZFN0b3JlRWxpbWluYXRpb25QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRGVwZW5kZW5jZUFuYWx5c2lzV3JhcHBlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVEaXZlcmdlbmNlQW5hbHlzaXNQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRG9tT25seVByaW50ZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRG9tUHJpbnRlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVEb21Pbmx5Vmlld2VyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZURvbVZpZXdlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVHQ09WUHJvZmlsZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUEdPSW5zdHJ1bWVudGF0aW9uR2VuTGVnYWN5UGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVBHT0luc3RydW1lbnRhdGlvblVzZUxlZ2FjeVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVQR09JbmRpcmVjdENhbGxQcm9tb3Rpb25MZWdhY3lQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUEdPTWVtT1BTaXplT3B0TGVnYWN5UGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUluc3RyUHJvZmlsaW5nTGVnYWN5UGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUZ1bmN0aW9uSW1wb3J0UGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUZ1bmN0aW9uSW5saW5pbmdQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlQWx3YXlzSW5saW5lckxlZ2FjeVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVHbG9iYWxEQ0VQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlR2xvYmFsT3B0aW1pemVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUdsb2JhbHNBQVdyYXBwZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlR3VhcmRXaWRlbmluZ1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVJUENvbnN0YW50UHJvcGFnYXRpb25QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlSVBTQ0NQUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUluZHVjdGl2ZVJhbmdlQ2hlY2tFbGltaW5hdGlvblBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVJbmRWYXJTaW1wbGlmeVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVJbnN0cnVjdGlvbkNvbWJpbmluZ1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVJbnRlcm5hbGl6ZVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMQ1NTQVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMSUNNUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUxvb3BTaW5rUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUxhenlWYWx1ZUluZm9QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTG9vcEV4dHJhY3RvclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb29wSW50ZXJjaGFuZ2VQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTG9vcFByZWRpY2F0aW9uUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUxvb3BTaW1wbGlmeVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb29wU2ltcGxpZnlDRkdQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTG9vcFN0cmVuZ3RoUmVkdWNlUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUxvb3BSZXJvbGxQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTG9vcFVucm9sbFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb29wVW5zd2l0Y2hQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTG9vcFZlcnNpb25pbmdMSUNNUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUxvb3BJZGlvbVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb29wUm90YXRlUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUxvd2VyRXhwZWN0SW50cmluc2ljUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUxvd2VySW52b2tlUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUxvd2VyU3dpdGNoUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZU5hcnlSZWFzc29jaWF0ZVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVPYmpDQVJDQUFXcmFwcGVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZU9iakNBUkNBUEVsaW1QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlT2JqQ0FSQ0V4cGFuZFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVPYmpDQVJDQ29udHJhY3RQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlT2JqQ0FSQ09wdFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVQQUV2YWxQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUHJvbW90ZU1lbW9yeVRvUmVnaXN0ZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlRGVtb3RlUmVnaXN0ZXJUb01lbW9yeVBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVQcnVuZUVIUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVBvc3REb21Pbmx5UHJpbnRlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVQb3N0RG9tUHJpbnRlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVQb3N0RG9tT25seVZpZXdlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVQb3N0RG9tVmlld2VyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVJlYXNzb2NpYXRlUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVJlZ2lvbkluZm9QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUmVnaW9uT25seVByaW50ZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUmVnaW9uT25seVZpZXdlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVSZWdpb25QcmludGVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVJlZ2lvblZpZXdlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTQ0NQUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVNhZmVTdGFja1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTUk9BUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVNpbmdsZUxvb3BFeHRyYWN0b3JQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlU3RyaXBTeW1ib2xzUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVN0cmlwTm9uRGVidWdTeW1ib2xzUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVN0cmlwRGVhZERlYnVnSW5mb1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTdHJpcERlYWRQcm90b3R5cGVzUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVRhaWxDYWxsRWxpbWluYXRpb25QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlSnVtcFRocmVhZGluZ1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVVbmlmeUZ1bmN0aW9uRXhpdE5vZGVzUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUluc3RDb3VudFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVDb25zdGFudEhvaXN0aW5nUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUNvZGVHZW5QcmVwYXJlUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUVudHJ5RXhpdEluc3RydW1lbnRlclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVQb3N0SW5saW5lRW50cnlFeGl0SW5zdHJ1bWVudGVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUVhcmx5Q1NFUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUdWTkhvaXN0UGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZU1lcmdlZExvYWRTdG9yZU1vdGlvblBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVHVk5QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTmV3R1ZOUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZU1lbUNweU9wdFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb29wRGVsZXRpb25QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUG9zdERvbVRyZWUoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVJbnN0cnVjdGlvbk5hbWVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZU1ldGFSZW5hbWVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVBvc3RPcmRlckZ1bmN0aW9uQXR0cnNMZWdhY3lQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlUmV2ZXJzZVBvc3RPcmRlckZ1bmN0aW9uQXR0cnNQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTWVyZ2VGdW5jdGlvbnNQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTWVyZ2VJQ21wc1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVFeHBhbmRNZW1DbXBQYXNzKCk7CisgICAgICBzdGQ6OnN0cmluZyBidWY7CisgICAgICBsbHZtOjpyYXdfc3RyaW5nX29zdHJlYW0gb3MoYnVmKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVQcmludE1vZHVsZVBhc3Mob3MpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVByaW50RnVuY3Rpb25QYXNzKG9zKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVQcmludEJhc2ljQmxvY2tQYXNzKG9zKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVNb2R1bGVEZWJ1Z0luZm9QcmludGVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVBhcnRpYWxJbmxpbmluZ1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMaW50UGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVNpbmtpbmdQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTG93ZXJBdG9taWNQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlQ29ycmVsYXRlZFZhbHVlUHJvcGFnYXRpb25QYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTWVtRGVwUHJpbnRlcigpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUluc3RydWN0aW9uU2ltcGxpZmllclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVMb29wVmVjdG9yaXplUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVNMUFZlY3Rvcml6ZXJQYXNzKCk7CisgICAgICAodm9pZCkgbGx2bTo6Y3JlYXRlTG9hZFN0b3JlVmVjdG9yaXplclBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVQYXJ0aWFsbHlJbmxpbmVMaWJDYWxsc1Bhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVTY2FsYXJpemVyUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVNlcGFyYXRlQ29uc3RPZmZzZXRGcm9tR0VQUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVNwZWN1bGF0aXZlRXhlY3V0aW9uUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVNwZWN1bGF0aXZlRXhlY3V0aW9uSWZIYXNCcmFuY2hEaXZlcmdlbmNlUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVJld3JpdGVTeW1ib2xzUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVN0cmFpZ2h0TGluZVN0cmVuZ3RoUmVkdWNlUGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZU1lbURlcmVmUHJpbnRlcigpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZU11c3RFeGVjdXRlUHJpbnRlcigpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZUZsb2F0MkludFBhc3MoKTsKKyAgICAgICh2b2lkKSBsbHZtOjpjcmVhdGVFbGltaW5hdGVBdmFpbGFibGVFeHRlcm5hbGx5UGFzcygpOworICAgICAgKHZvaWQpIGxsdm06OmNyZWF0ZVNjYWxhcml6ZU1hc2tlZE1lbUludHJpblBhc3MoKTsKKworICAgICAgKHZvaWQpbmV3IGxsdm06OkludGVydmFsUGFydGl0aW9uKCk7CisgICAgICAodm9pZCluZXcgbGx2bTo6U2NhbGFyRXZvbHV0aW9uV3JhcHBlclBhc3MoKTsKKyAgICAgIGxsdm06OkZ1bmN0aW9uOjpDcmVhdGUobnVsbHB0ciwgbGx2bTo6R2xvYmFsVmFsdWU6OkV4dGVybmFsTGlua2FnZSktPnZpZXdDRkdPbmx5KCk7CisgICAgICBsbHZtOjpSR1Bhc3NNYW5hZ2VyIFJHTTsKKyAgICAgIGxsdm06OlRhcmdldExpYnJhcnlJbmZvSW1wbCBUTElJOworICAgICAgbGx2bTo6VGFyZ2V0TGlicmFyeUluZm8gVExJKFRMSUkpOworICAgICAgbGx2bTo6QWxpYXNBbmFseXNpcyBBQShUTEkpOworICAgICAgbGx2bTo6QWxpYXNTZXRUcmFja2VyIFgoQUEpOworICAgICAgWC5hZGQobnVsbHB0ciwgMCwgbGx2bTo6QUFNRE5vZGVzKCkpOyAvLyBmb3IgLXByaW50LWFsaWFzLXNldHMKKyAgICAgICh2b2lkKSBsbHZtOjpBcmVTdGF0aXN0aWNzRW5hYmxlZCgpOworICAgICAgKHZvaWQpIGxsdm06OnN5czo6UnVubmluZ09uVmFsZ3JpbmQoKTsKKyAgICB9CisgIH0gRm9yY2VQYXNzTGlua2luZzsgLy8gRm9yY2UgbGluayBieSBjcmVhdGluZyBhIGdsb2JhbCBkZWZpbml0aW9uLgorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTGlua2VyL0lSTW92ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTGlua2VyL0lSTW92ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzVhZGE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9MaW5rZXIvSVJNb3Zlci5oCkBAIC0wLDAgKzEsODkgQEAKKy8vPT09LSBJUk1vdmVyLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9MSU5LRVJfSVJNT1ZFUl9ICisjZGVmaW5lIExMVk1fTElOS0VSX0lSTU9WRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEVycm9yOworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBNZXRhZGF0YTsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIFN0cnVjdFR5cGU7CitjbGFzcyBUcmFja2luZ01EUmVmOworY2xhc3MgVHlwZTsKKworY2xhc3MgSVJNb3ZlciB7CisgIHN0cnVjdCBTdHJ1Y3RUeXBlS2V5SW5mbyB7CisgICAgc3RydWN0IEtleVR5IHsKKyAgICAgIEFycmF5UmVmPFR5cGUgKj4gRVR5cGVzOworICAgICAgYm9vbCBJc1BhY2tlZDsKKyAgICAgIEtleVR5KEFycmF5UmVmPFR5cGUgKj4gRSwgYm9vbCBQKTsKKyAgICAgIEtleVR5KGNvbnN0IFN0cnVjdFR5cGUgKlNUKTsKKyAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBLZXlUeSAmdGhhdCkgY29uc3Q7CisgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgS2V5VHkgJnRoYXQpIGNvbnN0OworICAgIH07CisgICAgc3RhdGljIFN0cnVjdFR5cGUgKmdldEVtcHR5S2V5KCk7CisgICAgc3RhdGljIFN0cnVjdFR5cGUgKmdldFRvbWJzdG9uZUtleSgpOworICAgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgS2V5VHkgJktleSk7CisgICAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBTdHJ1Y3RUeXBlICpTVCk7CisgICAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCBLZXlUeSAmTEhTLCBjb25zdCBTdHJ1Y3RUeXBlICpSSFMpOworICAgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgU3RydWN0VHlwZSAqTEhTLCBjb25zdCBTdHJ1Y3RUeXBlICpSSFMpOworICB9OworCisgIC8vLyBUeXBlIG9mIHRoZSBNZXRhZGF0YSBtYXAgaW4gXGEgVmFsdWVUb1ZhbHVlTWFwVHkuCisgIHR5cGVkZWYgRGVuc2VNYXA8Y29uc3QgTWV0YWRhdGEgKiwgVHJhY2tpbmdNRFJlZj4gTURNYXBUOworCitwdWJsaWM6CisgIGNsYXNzIElkZW50aWZpZWRTdHJ1Y3RUeXBlU2V0IHsKKyAgICAvLyBUaGUgc2V0IG9mIG9wYXF1ZSB0eXBlcyBpcyB0aGUgY29tcG9zaXRlIG1vZHVsZS4KKyAgICBEZW5zZVNldDxTdHJ1Y3RUeXBlICo+IE9wYXF1ZVN0cnVjdFR5cGVzOworCisgICAgLy8gVGhlIHNldCBvZiBpZGVudGlmaWVkIGJ1dCBub24gb3BhcXVlIHN0cnVjdHVyZXMgaW4gdGhlIGNvbXBvc2l0ZSBtb2R1bGUuCisgICAgRGVuc2VTZXQ8U3RydWN0VHlwZSAqLCBTdHJ1Y3RUeXBlS2V5SW5mbz4gTm9uT3BhcXVlU3RydWN0VHlwZXM7CisKKyAgcHVibGljOgorICAgIHZvaWQgYWRkTm9uT3BhcXVlKFN0cnVjdFR5cGUgKlR5KTsKKyAgICB2b2lkIHN3aXRjaFRvTm9uT3BhcXVlKFN0cnVjdFR5cGUgKlR5KTsKKyAgICB2b2lkIGFkZE9wYXF1ZShTdHJ1Y3RUeXBlICpUeSk7CisgICAgU3RydWN0VHlwZSAqZmluZE5vbk9wYXF1ZShBcnJheVJlZjxUeXBlICo+IEVUeXBlcywgYm9vbCBJc1BhY2tlZCk7CisgICAgYm9vbCBoYXNUeXBlKFN0cnVjdFR5cGUgKlR5KTsKKyAgfTsKKworICBJUk1vdmVyKE1vZHVsZSAmTSk7CisKKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoR2xvYmFsVmFsdWUgJik+IFZhbHVlQWRkZXI7CisKKyAgLy8vIE1vdmUgaW4gdGhlIHByb3ZpZGUgdmFsdWVzIGluIFxwIFZhbHVlc1RvTGluayBmcm9tIFxwIFNyYy4KKyAgLy8vCisgIC8vLyAtIFxwIEFkZExhenlGb3IgaXMgYSBjYWxsIGJhY2sgdGhhdCB0aGUgSVJNb3ZlciB3aWxsIGNhbGwgd2hlbiBhIGdsb2JhbAorICAvLy8gICB2YWx1ZSBpcyByZWZlcmVuY2VkIGJ5IG9uZSBvZiB0aGUgVmFsdWVzVG9MaW5rICh0cmFuc2l0aXZlbHkpIGJ1dCB3YXMKKyAgLy8vICAgbm90IHByZXNlbnQgaW4gVmFsdWVzVG9MaW5rLiBUaGUgR2xvYmFsVmFsdWUgYW5kIGEgVmFsdWVBZGRlciBjYWxsYmFjaworICAvLy8gICBhcmUgcGFzc2VkIGFzIGFuIGFyZ3VtZW50LCBhbmQgdGhlIGNhbGxiYWNrIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZAorICAvLy8gICBpZiB0aGUgR2xvYmFsVmFsdWUgbmVlZHMgdG8gYmUgYWRkZWQgdG8gdGhlIFxwIFZhbHVlc1RvTGluayBhbmQgbGlua2VkLgorICAvLy8gLSBccCBJc1BlcmZvcm1pbmdJbXBvcnQgaXMgdHJ1ZSB3aGVuIHRoaXMgSVIgbGluayBpcyB0byBwZXJmb3JtIFRoaW5MVE8KKyAgLy8vICAgZnVuY3Rpb24gaW1wb3J0aW5nIGZyb20gU3JjLgorICBFcnJvciBtb3ZlKHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IFNyYywgQXJyYXlSZWY8R2xvYmFsVmFsdWUgKj4gVmFsdWVzVG9MaW5rLAorICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248dm9pZChHbG9iYWxWYWx1ZSAmR1YsIFZhbHVlQWRkZXIgQWRkKT4gQWRkTGF6eUZvciwKKyAgICAgICAgICAgICBib29sIElzUGVyZm9ybWluZ0ltcG9ydCk7CisgIE1vZHVsZSAmZ2V0TW9kdWxlKCkgeyByZXR1cm4gQ29tcG9zaXRlOyB9CisKK3ByaXZhdGU6CisgIE1vZHVsZSAmQ29tcG9zaXRlOworICBJZGVudGlmaWVkU3RydWN0VHlwZVNldCBJZGVudGlmaWVkU3RydWN0VHlwZXM7CisgIE1ETWFwVCBTaGFyZWRNRHM7IC8vLzwgQSBNZXRhZGF0YSBtYXAgdG8gdXNlIGZvciBhbGwgY2FsbHMgdG8gXGEgbW92ZSgpLgorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xpbmtlci9MaW5rZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTGlua2VyL0xpbmtlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOGUwMTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL0xpbmtlci9MaW5rZXIuaApAQCAtMCwwICsxLDU5IEBACisvLz09PS0gTGlua2VyLmggLSBNb2R1bGUgTGlua2VyIEludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTElOS0VSX0xJTktFUl9ICisjZGVmaW5lIExMVk1fTElOS0VSX0xJTktFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0xpbmtlci9JUk1vdmVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIFN0cnVjdFR5cGU7CitjbGFzcyBUeXBlOworCisvLy8gVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgY29yZSBmdW5jdGlvbmFsaXR5IG9mIGxpbmtpbmcgaW4gTExWTS4gSXQga2VlcHMgYQorLy8vIHBvaW50ZXIgdG8gdGhlIG1lcmdlZCBtb2R1bGUgc28gZmFyLiBJdCBkb2Vzbid0IHRha2Ugb3duZXJzaGlwIG9mIHRoZQorLy8vIG1vZHVsZSBzaW5jZSBpdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHVzZXIgb2YgdGhpcyBjbGFzcyB3aWxsIHdhbnQgdG8gZG8KKy8vLyBzb21ldGhpbmcgd2l0aCBpdCBhZnRlciB0aGUgbGlua2luZy4KK2NsYXNzIExpbmtlciB7CisgIElSTW92ZXIgTW92ZXI7CisKK3B1YmxpYzoKKyAgZW51bSBGbGFncyB7CisgICAgTm9uZSA9IDAsCisgICAgT3ZlcnJpZGVGcm9tU3JjID0gKDEgPDwgMCksCisgICAgTGlua09ubHlOZWVkZWQgPSAoMSA8PCAxKSwKKyAgfTsKKworICBMaW5rZXIoTW9kdWxlICZNKTsKKworICAvLy8gXGJyaWVmIExpbmsgXHAgU3JjIGludG8gdGhlIGNvbXBvc2l0ZS4KKyAgLy8vCisgIC8vLyBQYXNzaW5nIE92ZXJyaWRlU3ltYm9scyBhcyB0cnVlIHdpbGwgaGF2ZSBzeW1ib2xzIGZyb20gU3JjCisgIC8vLyBzaGFkb3cgdGhvc2UgaW4gdGhlIERlc3QuCisgIC8vLworICAvLy8gUGFzc2luZyBJbnRlcm5hbGl6ZUNhbGxiYWNrIHdpbGwgaGF2ZSB0aGUgbGlua2VyIGNhbGwgdGhlIGZ1bmN0aW9uIHdpdGgKKyAgLy8vIHRoZSBuZXcgbW9kdWxlIGFuZCBhIGxpc3Qgb2YgZ2xvYmFsIHZhbHVlIG5hbWVzIHRvIGJlIGludGVybmFsaXplZCBieSB0aGUKKyAgLy8vIGNhbGxiYWNrLgorICAvLy8KKyAgLy8vIFJldHVybnMgdHJ1ZSBvbiBlcnJvci4KKyAgYm9vbCBsaW5rSW5Nb2R1bGUoc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gU3JjLCB1bnNpZ25lZCBGbGFncyA9IEZsYWdzOjpOb25lLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPHZvaWQoTW9kdWxlICYsIGNvbnN0IFN0cmluZ1NldDw+ICYpPgorICAgICAgICAgICAgICAgICAgICAgICAgSW50ZXJuYWxpemVDYWxsYmFjayA9IHt9KTsKKworICBzdGF0aWMgYm9vbCBsaW5rTW9kdWxlcyhNb2R1bGUgJkRlc3QsIHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IFNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmxhZ3MgPSBGbGFnczo6Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmdW5jdGlvbjx2b2lkKE1vZHVsZSAmLCBjb25zdCBTdHJpbmdTZXQ8PiAmKT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVybmFsaXplQ2FsbGJhY2sgPSB7fSk7Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvQ29uc3RhbnRQb29scy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9Db25zdGFudFBvb2xzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzMzI1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvQ29uc3RhbnRQb29scy5oCkBAIC0wLDAgKzEsMTAzIEBACisvLz09PS0gQ29uc3RhbnRQb29sLmggLSBLZWVwIHRyYWNrIG9mIGFzc2VtYmxlci1nZW5lcmF0ZWQgIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgQ29uc3RhbnRQb29sIGFuZCBBc3NlbWJsZXJDb25zdGFudFBvb2xzIGNsYXNzZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX0NPTlNUQU5UUE9PTFNfSAorI2RlZmluZSBMTFZNX01DX0NPTlNUQU5UUE9PTFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9NYXBWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TTUxvYy5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWFwPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DQ29udGV4dDsKK2NsYXNzIE1DRXhwcjsKK2NsYXNzIE1DU2VjdGlvbjsKK2NsYXNzIE1DU3RyZWFtZXI7CitjbGFzcyBNQ1N5bWJvbDsKK2NsYXNzIE1DU3ltYm9sUmVmRXhwcjsKKworc3RydWN0IENvbnN0YW50UG9vbEVudHJ5IHsKKyAgQ29uc3RhbnRQb29sRW50cnkoTUNTeW1ib2wgKkwsIGNvbnN0IE1DRXhwciAqVmFsLCB1bnNpZ25lZCBTeiwgU01Mb2MgTG9jXykKKyAgICA6IExhYmVsKEwpLCBWYWx1ZShWYWwpLCBTaXplKFN6KSwgTG9jKExvY18pIHt9CisKKyAgTUNTeW1ib2wgKkxhYmVsOworICBjb25zdCBNQ0V4cHIgKlZhbHVlOworICB1bnNpZ25lZCBTaXplOworICBTTUxvYyBMb2M7Cit9OworCisvLyBBIGNsYXNzIHRvIGtlZXAgdHJhY2sgb2YgYXNzZW1ibGVyLWdlbmVyYXRlZCBjb25zdGFudCBwb29scyB0aGF0IGFyZSB1c2UgdG8KKy8vIGltcGxlbWVudCB0aGUgbGRyLXBzZXVkby4KK2NsYXNzIENvbnN0YW50UG9vbCB7CisgIHVzaW5nIEVudHJ5VmVjVHkgPSBTbWFsbFZlY3RvcjxDb25zdGFudFBvb2xFbnRyeSwgND47CisgIEVudHJ5VmVjVHkgRW50cmllczsKKyAgc3RkOjptYXA8aW50NjRfdCwgY29uc3QgTUNTeW1ib2xSZWZFeHByICo+IENhY2hlZEVudHJpZXM7CisKK3B1YmxpYzoKKyAgLy8gSW5pdGlhbGl6ZSBhIG5ldyBlbXB0eSBjb25zdGFudCBwb29sCisgIENvbnN0YW50UG9vbCgpID0gZGVmYXVsdDsKKworICAvLyBBZGQgYSBuZXcgZW50cnkgdG8gdGhlIGNvbnN0YW50IHBvb2wgaW4gdGhlIG5leHQgc2xvdC4KKyAgLy8gXHBhcmFtIFZhbHVlIGlzIHRoZSBuZXcgZW50cnkgdG8gcHV0IGluIHRoZSBjb25zdGFudCBwb29sLgorICAvLyBccGFyYW0gU2l6ZSBpcyB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgZW50cnkKKyAgLy8KKyAgLy8gXHJldHVybnMgYSBNQ0V4cHIgdGhhdCByZWZlcmVuY2VzIHRoZSBuZXdseSBpbnNlcnRlZCB2YWx1ZQorICBjb25zdCBNQ0V4cHIgKmFkZEVudHJ5KGNvbnN0IE1DRXhwciAqVmFsdWUsIE1DQ29udGV4dCAmQ29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTaXplLCBTTUxvYyBMb2MpOworCisgIC8vIEVtaXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb25zdGFudCBwb29sIHVzaW5nIHRoZSBwcm92aWRlZCBzdHJlYW1lci4KKyAgdm9pZCBlbWl0RW50cmllcyhNQ1N0cmVhbWVyICZTdHJlYW1lcik7CisKKyAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGNvbnN0YW50IHBvb2wgaXMgZW1wdHkKKyAgYm9vbCBlbXB0eSgpOworCisgIHZvaWQgY2xlYXJDYWNoZSgpOworfTsKKworY2xhc3MgQXNzZW1ibGVyQ29uc3RhbnRQb29scyB7CisgIC8vIE1hcCB0eXBlIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBwZXItU2VjdGlvbiBjb25zdGFudCBwb29scyB1c2VkIGJ5IHRoZQorICAvLyBsZHItcHNldWRvIG9wY29kZS4gVGhlIG1hcCBhc3NvY2lhdGVzIGEgc2VjdGlvbiB0byBpdHMgY29uc3RhbnQgcG9vbC4gVGhlCisgIC8vIGNvbnN0YW50IHBvb2wgaXMgYSB2ZWN0b3Igb2YgKGxhYmVsLCB2YWx1ZSkgcGFpcnMuIFdoZW4gdGhlIGxkcgorICAvLyBwc2V1ZG8gaXMgcGFyc2VkIHdlIGluc2VydCBhIG5ldyAobGFiZWwsIHZhbHVlKSBwYWlyIGludG8gdGhlIGNvbnN0YW50IHBvb2wKKyAgLy8gZm9yIHRoZSBjdXJyZW50IHNlY3Rpb24gYW5kIGFkZCBNQ1N5bWJvbFJlZkV4cHIgdG8gdGhlIG5ldyBsYWJlbCBhcworICAvLyBhbiBvcGNvZGUgdG8gdGhlIGxkci4gQWZ0ZXIgd2UgaGF2ZSBwYXJzZWQgYWxsIHRoZSB1c2VyIGlucHV0IHdlCisgIC8vIG91dHB1dCB0aGUgKGxhYmVsLCB2YWx1ZSkgcGFpcnMgaW4gZWFjaCBjb25zdGFudCBwb29sIGF0IHRoZSBlbmQgb2YgdGhlCisgIC8vIHNlY3Rpb24uCisgIC8vCisgIC8vIFdlIHVzZSB0aGUgTWFwVmVjdG9yIGZvciB0aGUgbWFwIHR5cGUgdG8gZW5zdXJlIHN0YWJsZSBpdGVyYXRpb24gb2YKKyAgLy8gdGhlIHNlY3Rpb25zIGF0IHRoZSBlbmQgb2YgdGhlIHBhcnNlLiBXZSBuZWVkIHRvIGl0ZXJhdGUgb3ZlciB0aGUKKyAgLy8gc2VjdGlvbnMgaW4gYSBzdGFibGUgb3JkZXIgdG8gZW5zdXJlIHRoYXQgd2UgaGF2ZSBwcmludCB0aGUKKyAgLy8gY29uc3RhbnQgcG9vbHMgaW4gYSBkZXRlcm1pbmlzdGljIG9yZGVyIHdoZW4gcHJpbnRpbmcgYW4gYXNzZW1ibHkKKyAgLy8gZmlsZS4KKyAgdXNpbmcgQ29uc3RhbnRQb29sTWFwVHkgPSBNYXBWZWN0b3I8TUNTZWN0aW9uICosIENvbnN0YW50UG9vbD47CisgIENvbnN0YW50UG9vbE1hcFR5IENvbnN0YW50UG9vbHM7CisKK3B1YmxpYzoKKyAgdm9pZCBlbWl0QWxsKE1DU3RyZWFtZXIgJlN0cmVhbWVyKTsKKyAgdm9pZCBlbWl0Rm9yQ3VycmVudFNlY3Rpb24oTUNTdHJlYW1lciAmU3RyZWFtZXIpOworICB2b2lkIGNsZWFyQ2FjaGVGb3JDdXJyZW50U2VjdGlvbihNQ1N0cmVhbWVyICZTdHJlYW1lcik7CisgIGNvbnN0IE1DRXhwciAqYWRkRW50cnkoTUNTdHJlYW1lciAmU3RyZWFtZXIsIGNvbnN0IE1DRXhwciAqRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTaXplLCBTTUxvYyBMb2MpOworCitwcml2YXRlOgorICBDb25zdGFudFBvb2wgKmdldENvbnN0YW50UG9vbChNQ1NlY3Rpb24gKlNlY3Rpb24pOworICBDb25zdGFudFBvb2wgJmdldE9yQ3JlYXRlQ29uc3RhbnRQb29sKE1DU2VjdGlvbiAqU2VjdGlvbik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19DT05TVEFOVFBPT0xTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTGFuZUJpdG1hc2suaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTGFuZUJpdG1hc2suaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzBiNGVjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9MYW5lQml0bWFzay5oCkBAIC0wLDAgKzEsMTAyIEBACisvLz09PS0gbGx2bS9NQy9MYW5lQml0bWFzay5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBBIGNvbW1vbiBkZWZpbml0aW9uIG9mIExhbmVCaXRtYXNrIGZvciB1c2UgaW4gVGFibGVHZW4gYW5kIENvZGVHZW4uCisvLy8KKy8vLyBBIGxhbmUgbWFzayBpcyBhIGJpdG1hc2sgcmVwcmVzZW50aW5nIHRoZSBjb3ZlcmluZyBvZiBhIHJlZ2lzdGVyIHdpdGgKKy8vLyBzdWItcmVnaXN0ZXJzLgorLy8vCisvLy8gVGhpcyBpcyB0eXBpY2FsbHkgdXNlZCB0byB0cmFjayBsaXZlbmVzcyBhdCBzdWItcmVnaXN0ZXIgZ3JhbnVsYXJpdHkuCisvLy8gTGFuZSBtYXNrcyBmb3Igc3ViLXJlZ2lzdGVyIGluZGljZXMgYXJlIHNpbWlsYXIgdG8gcmVnaXN0ZXIgdW5pdHMgZm9yCisvLy8gcGh5c2ljYWwgcmVnaXN0ZXJzLiBUaGUgaW5kaXZpZHVhbCBiaXRzIGluIGEgbGFuZSBtYXNrIGNhbid0IGJlIGFzc2lnbmVkCisvLy8gYW55IHNwZWNpZmljIG1lYW5pbmcuIFRoZXkgY2FuIGJlIHVzZWQgdG8gY2hlY2sgaWYgdHdvIHN1Yi1yZWdpc3RlcgorLy8vIGluZGljZXMgb3ZlcmxhcC4KKy8vLworLy8vIElmZiB0aGUgdGFyZ2V0IGhhcyBhIHJlZ2lzdGVyIHN1Y2ggdGhhdDoKKy8vLworLy8vICAgZ2V0U3ViUmVnKFJlZywgQSkgb3ZlcmxhcHMgZ2V0U3ViUmVnKFJlZywgQikKKy8vLworLy8vIHRoZW46CisvLy8KKy8vLyAgIChnZXRTdWJSZWdJbmRleExhbmVNYXNrKEEpICYgZ2V0U3ViUmVnSW5kZXhMYW5lTWFzayhCKSkgIT0gMAorCisjaWZuZGVmIExMVk1fTUNfTEFORUJJVE1BU0tfSAorI2RlZmluZSBMTFZNX01DX0xBTkVCSVRNQVNLX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUHJpbnRhYmxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworICBzdHJ1Y3QgTGFuZUJpdG1hc2sgeworICAgIC8vIFdoZW4gY2hhbmdpbmcgdGhlIHVuZGVybHlpbmcgdHlwZSwgY2hhbmdlIHRoZSBmb3JtYXQgc3RyaW5nIGFzIHdlbGwuCisgICAgdXNpbmcgVHlwZSA9IHVuc2lnbmVkOworICAgIGVudW0gOiB1bnNpZ25lZCB7IEJpdFdpZHRoID0gOCpzaXplb2YoVHlwZSkgfTsKKyAgICBjb25zdGV4cHIgc3RhdGljIGNvbnN0IGNoYXIgKmNvbnN0IEZvcm1hdFN0ciA9ICIlMDhYIjsKKworICAgIGNvbnN0ZXhwciBMYW5lQml0bWFzaygpID0gZGVmYXVsdDsKKyAgICBleHBsaWNpdCBjb25zdGV4cHIgTGFuZUJpdG1hc2soVHlwZSBWKSA6IE1hc2soVikge30KKworICAgIGNvbnN0ZXhwciBib29sIG9wZXJhdG9yPT0gKExhbmVCaXRtYXNrIE0pIGNvbnN0IHsgcmV0dXJuIE1hc2sgPT0gTS5NYXNrOyB9CisgICAgY29uc3RleHByIGJvb2wgb3BlcmF0b3IhPSAoTGFuZUJpdG1hc2sgTSkgY29uc3QgeyByZXR1cm4gTWFzayAhPSBNLk1hc2s7IH0KKyAgICBjb25zdGV4cHIgYm9vbCBvcGVyYXRvcjwgKExhbmVCaXRtYXNrIE0pICBjb25zdCB7IHJldHVybiBNYXNrIDwgTS5NYXNrOyB9CisgICAgY29uc3RleHByIGJvb2wgbm9uZSgpIGNvbnN0IHsgcmV0dXJuIE1hc2sgPT0gMDsgfQorICAgIGNvbnN0ZXhwciBib29sIGFueSgpICBjb25zdCB7IHJldHVybiBNYXNrICE9IDA7IH0KKyAgICBjb25zdGV4cHIgYm9vbCBhbGwoKSAgY29uc3QgeyByZXR1cm4gfk1hc2sgPT0gMDsgfQorCisgICAgY29uc3RleHByIExhbmVCaXRtYXNrIG9wZXJhdG9yfigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMYW5lQml0bWFzayh+TWFzayk7CisgICAgfQorICAgIGNvbnN0ZXhwciBMYW5lQml0bWFzayBvcGVyYXRvcnwoTGFuZUJpdG1hc2sgTSkgY29uc3QgeworICAgICAgcmV0dXJuIExhbmVCaXRtYXNrKE1hc2sgfCBNLk1hc2spOworICAgIH0KKyAgICBjb25zdGV4cHIgTGFuZUJpdG1hc2sgb3BlcmF0b3ImKExhbmVCaXRtYXNrIE0pIGNvbnN0IHsKKyAgICAgIHJldHVybiBMYW5lQml0bWFzayhNYXNrICYgTS5NYXNrKTsKKyAgICB9CisgICAgTGFuZUJpdG1hc2sgJm9wZXJhdG9yfD0oTGFuZUJpdG1hc2sgTSkgeworICAgICAgTWFzayB8PSBNLk1hc2s7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIExhbmVCaXRtYXNrICZvcGVyYXRvciY9KExhbmVCaXRtYXNrIE0pIHsKKyAgICAgIE1hc2sgJj0gTS5NYXNrOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIGNvbnN0ZXhwciBUeXBlIGdldEFzSW50ZWdlcigpIGNvbnN0IHsgcmV0dXJuIE1hc2s7IH0KKworICAgIHVuc2lnbmVkIGdldE51bUxhbmVzKCkgY29uc3QgeworICAgICAgcmV0dXJuIGNvdW50UG9wdWxhdGlvbihNYXNrKTsKKyAgICB9CisgICAgdW5zaWduZWQgZ2V0SGlnaGVzdExhbmUoKSBjb25zdCB7CisgICAgICByZXR1cm4gTG9nMl8zMihNYXNrKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3RleHByIExhbmVCaXRtYXNrIGdldE5vbmUoKSB7IHJldHVybiBMYW5lQml0bWFzaygwKTsgfQorICAgIHN0YXRpYyBjb25zdGV4cHIgTGFuZUJpdG1hc2sgZ2V0QWxsKCkgeyByZXR1cm4gfkxhbmVCaXRtYXNrKDApOyB9CisgICAgc3RhdGljIGNvbnN0ZXhwciBMYW5lQml0bWFzayBnZXRMYW5lKHVuc2lnbmVkIExhbmUpIHsKKyAgICAgIHJldHVybiBMYW5lQml0bWFzayhUeXBlKDEpIDw8IExhbmUpOworICAgIH0KKworICBwcml2YXRlOgorICAgIFR5cGUgTWFzayA9IDA7CisgIH07CisKKyAgLy8vIENyZWF0ZSBQcmludGFibGUgb2JqZWN0IHRvIHByaW50IExhbmVCaXRtYXNrcyBvbiBhIFxyZWYgcmF3X29zdHJlYW0uCisgIGlubGluZSBQcmludGFibGUgUHJpbnRMYW5lTWFzayhMYW5lQml0bWFzayBMYW5lTWFzaykgeworICAgIHJldHVybiBQcmludGFibGUoW0xhbmVNYXNrXShyYXdfb3N0cmVhbSAmT1MpIHsKKyAgICAgIE9TIDw8IGZvcm1hdChMYW5lQml0bWFzazo6Rm9ybWF0U3RyLCBMYW5lTWFzay5nZXRBc0ludGVnZXIoKSk7CisgICAgfSk7CisgIH0KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTEFORUJJVE1BU0tfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0FzbUJhY2tlbmQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNBc21CYWNrZW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThhNTg1MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNBc21CYWNrZW5kLmgKQEAgLTAsMCArMSwxODIgQEAKKy8vPT09LSBsbHZtL01DL01DQXNtQmFja2VuZC5oIC0gTUMgQXNtIEJhY2tlbmQgLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0FTTUJBQ0tFTkRfSAorI2RlZmluZSBMTFZNX01DX01DQVNNQkFDS0VORF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0RpcmVjdGl2ZXMuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRml4dXAuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRnJhZ21lbnQuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0FzbUxheW91dDsKK2NsYXNzIE1DQXNzZW1ibGVyOworY2xhc3MgTUNDRklJbnN0cnVjdGlvbjsKK2NsYXNzIE1DQ29kZVBhZGRlcjsKK3N0cnVjdCBNQ0ZpeHVwS2luZEluZm87CitjbGFzcyBNQ0ZyYWdtZW50OworY2xhc3MgTUNJbnN0OworY2xhc3MgTUNPYmplY3RTdHJlYW1lcjsKK2NsYXNzIE1DT2JqZWN0V3JpdGVyOworc3RydWN0IE1DQ29kZVBhZGRpbmdDb250ZXh0OworY2xhc3MgTUNSZWxheGFibGVGcmFnbWVudDsKK2NsYXNzIE1DU3VidGFyZ2V0SW5mbzsKK2NsYXNzIE1DVmFsdWU7CitjbGFzcyByYXdfcHdyaXRlX3N0cmVhbTsKKworLy8vIEdlbmVyaWMgaW50ZXJmYWNlIHRvIHRhcmdldCBzcGVjaWZpYyBhc3NlbWJsZXIgYmFja2VuZHMuCitjbGFzcyBNQ0FzbUJhY2tlbmQgeworICBzdGQ6OnVuaXF1ZV9wdHI8TUNDb2RlUGFkZGVyPiBDb2RlUGFkZGVyOworCitwcm90ZWN0ZWQ6IC8vIENhbiBvbmx5IGNyZWF0ZSBzdWJjbGFzc2VzLgorICBNQ0FzbUJhY2tlbmQoKTsKKyAgTUNBc21CYWNrZW5kKHN0ZDo6dW5pcXVlX3B0cjxNQ0NvZGVQYWRkZXI+IFRhcmdldENvZGVQYWRkZXIpOworCitwdWJsaWM6CisgIE1DQXNtQmFja2VuZChjb25zdCBNQ0FzbUJhY2tlbmQgJikgPSBkZWxldGU7CisgIE1DQXNtQmFja2VuZCAmb3BlcmF0b3I9KGNvbnN0IE1DQXNtQmFja2VuZCAmKSA9IGRlbGV0ZTsKKyAgdmlydHVhbCB+TUNBc21CYWNrZW5kKCk7CisKKyAgLy8vIGxpZmV0aW1lIG1hbmFnZW1lbnQKKyAgdmlydHVhbCB2b2lkIHJlc2V0KCkge30KKworICAvLy8gQ3JlYXRlIGEgbmV3IE1DT2JqZWN0V3JpdGVyIGluc3RhbmNlIGZvciB1c2UgYnkgdGhlIGFzc2VtYmxlciBiYWNrZW5kIHRvCisgIC8vLyBlbWl0IHRoZSBmaW5hbCBvYmplY3QgZmlsZS4KKyAgdmlydHVhbCBzdGQ6OnVuaXF1ZV9wdHI8TUNPYmplY3RXcml0ZXI+CisgIGNyZWF0ZU9iamVjdFdyaXRlcihyYXdfcHdyaXRlX3N0cmVhbSAmT1MpIGNvbnN0ID0gMDsKKworICAvLy8gXG5hbWUgVGFyZ2V0IEZpeHVwIEludGVyZmFjZXMKKyAgLy8vIEB7CisKKyAgLy8vIEdldCB0aGUgbnVtYmVyIG9mIHRhcmdldCBzcGVjaWZpYyBmaXh1cCBraW5kcy4KKyAgdmlydHVhbCB1bnNpZ25lZCBnZXROdW1GaXh1cEtpbmRzKCkgY29uc3QgPSAwOworCisgIC8vLyBNYXAgYSByZWxvY2F0aW9uIG5hbWUgdXNlZCBpbiAucmVsb2MgdG8gYSBmaXh1cCBraW5kLgorICB2aXJ0dWFsIE9wdGlvbmFsPE1DRml4dXBLaW5kPiBnZXRGaXh1cEtpbmQoU3RyaW5nUmVmIE5hbWUpIGNvbnN0OworCisgIC8vLyBHZXQgaW5mb3JtYXRpb24gb24gYSBmaXh1cCBraW5kLgorICB2aXJ0dWFsIGNvbnN0IE1DRml4dXBLaW5kSW5mbyAmZ2V0Rml4dXBLaW5kSW5mbyhNQ0ZpeHVwS2luZCBLaW5kKSBjb25zdDsKKworICAvLy8gSG9vayB0byBjaGVjayBpZiBhIHJlbG9jYXRpb24gaXMgbmVlZGVkIGZvciBzb21lIHRhcmdldCBzcGVjaWZpYyByZWFzb24uCisgIHZpcnR1YWwgYm9vbCBzaG91bGRGb3JjZVJlbG9jYXRpb24oY29uc3QgTUNBc3NlbWJsZXIgJkFzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0ZpeHVwICZGaXh1cCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1ZhbHVlICZUYXJnZXQpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gQXBwbHkgdGhlIFxwIFZhbHVlIGZvciBnaXZlbiBccCBGaXh1cCBpbnRvIHRoZSBwcm92aWRlZCBkYXRhIGZyYWdtZW50LCBhdAorICAvLy8gdGhlIG9mZnNldCBzcGVjaWZpZWQgYnkgdGhlIGZpeHVwIGFuZCBmb2xsb3dpbmcgdGhlIGZpeHVwIGtpbmQgYXMKKyAgLy8vIGFwcHJvcHJpYXRlLiBFcnJvcnMgKHN1Y2ggYXMgYW4gb3V0IG9mIHJhbmdlIGZpeHVwIHZhbHVlKSBzaG91bGQgYmUKKyAgLy8vIHJlcG9ydGVkIHZpYSBccCBDdHguCisgIHZpcnR1YWwgdm9pZCBhcHBseUZpeHVwKGNvbnN0IE1DQXNzZW1ibGVyICZBc20sIGNvbnN0IE1DRml4dXAgJkZpeHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1ZhbHVlICZUYXJnZXQsIE11dGFibGVBcnJheVJlZjxjaGFyPiBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBWYWx1ZSwgYm9vbCBJc1Jlc29sdmVkKSBjb25zdCA9IDA7CisKKyAgLy8vIEB9CisKKyAgLy8vIFxuYW1lIFRhcmdldCBSZWxheGF0aW9uIEludGVyZmFjZXMKKyAgLy8vIEB7CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGluc3RydWN0aW9uIG1heSBuZWVkIHJlbGF4YXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIEluc3QgLSBUaGUgaW5zdHJ1Y3Rpb24gdG8gdGVzdC4KKyAgdmlydHVhbCBib29sIG1heU5lZWRSZWxheGF0aW9uKGNvbnN0IE1DSW5zdCAmSW5zdCkgY29uc3QgPSAwOworCisgIC8vLyBUYXJnZXQgc3BlY2lmaWMgcHJlZGljYXRlIGZvciB3aGV0aGVyIGEgZ2l2ZW4gZml4dXAgcmVxdWlyZXMgdGhlCisgIC8vLyBhc3NvY2lhdGVkIGluc3RydWN0aW9uIHRvIGJlIHJlbGF4ZWQuCisgIHZpcnR1YWwgYm9vbCBmaXh1cE5lZWRzUmVsYXhhdGlvbkFkdmFuY2VkKGNvbnN0IE1DRml4dXAgJkZpeHVwLCBib29sIFJlc29sdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNSZWxheGFibGVGcmFnbWVudCAqREYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQpIGNvbnN0OworCisgIC8vLyBTaW1wbGUgcHJlZGljYXRlIGZvciB0YXJnZXRzIHdoZXJlICFSZXNvbHZlZCBpbXBsaWVzIHJlcXVpcmluZyByZWxheGF0aW9uCisgIHZpcnR1YWwgYm9vbCBmaXh1cE5lZWRzUmVsYXhhdGlvbihjb25zdCBNQ0ZpeHVwICZGaXh1cCwgdWludDY0X3QgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1JlbGF4YWJsZUZyYWdtZW50ICpERiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQpIGNvbnN0ID0gMDsKKworICAvLy8gUmVsYXggdGhlIGluc3RydWN0aW9uIGluIHRoZSBnaXZlbiBmcmFnbWVudCB0byB0aGUgbmV4dCB3aWRlciBpbnN0cnVjdGlvbi4KKyAgLy8vCisgIC8vLyBccGFyYW0gSW5zdCBUaGUgaW5zdHJ1Y3Rpb24gdG8gcmVsYXgsIHdoaWNoIG1heSBiZSB0aGUgc2FtZSBhcyB0aGUKKyAgLy8vIG91dHB1dC4KKyAgLy8vIFxwYXJhbSBTVEkgdGhlIHN1YnRhcmdldCBpbmZvcm1hdGlvbiBmb3IgdGhlIGFzc29jaWF0ZWQgaW5zdHJ1Y3Rpb24uCisgIC8vLyBccGFyYW0gW291dF0gUmVzIE9uIHJldHVybiwgdGhlIHJlbGF4ZWQgaW5zdHJ1Y3Rpb24uCisgIHZpcnR1YWwgdm9pZCByZWxheEluc3RydWN0aW9uKGNvbnN0IE1DSW5zdCAmSW5zdCwgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZTVEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DSW5zdCAmUmVzKSBjb25zdCA9IDA7CisKKyAgLy8vIEB9CisKKyAgLy8vIFJldHVybnMgdGhlIG1pbmltdW0gc2l6ZSBvZiBhIG5vcCBpbiBieXRlcyBvbiB0aGlzIHRhcmdldC4gVGhlIGFzc2VtYmxlcgorICAvLy8gd2lsbCB1c2UgdGhpcyB0byBlbWl0IGV4Y2VzcyBwYWRkaW5nIGluIHNpdHVhdGlvbnMgd2hlcmUgdGhlIHBhZGRpbmcKKyAgLy8vIHJlcXVpcmVkIGZvciBzaW1wbGUgYWxpZ25tZW50IHdvdWxkIGJlIGxlc3MgdGhhbiB0aGUgbWluaW11bSBub3Agc2l6ZS4KKyAgLy8vCisgIHZpcnR1YWwgdW5zaWduZWQgZ2V0TWluaW11bU5vcFNpemUoKSBjb25zdCB7IHJldHVybiAxOyB9CisKKyAgLy8vIFdyaXRlIGFuIChvcHRpbWFsKSBub3Agc2VxdWVuY2Ugb2YgQ291bnQgYnl0ZXMgdG8gdGhlIGdpdmVuIG91dHB1dC4gSWYgdGhlCisgIC8vLyB0YXJnZXQgY2Fubm90IGdlbmVyYXRlIHN1Y2ggYSBzZXF1ZW5jZSwgaXQgc2hvdWxkIHJldHVybiBhbiBlcnJvci4KKyAgLy8vCisgIC8vLyBccmV0dXJuIC0gVHJ1ZSBvbiBzdWNjZXNzLgorICB2aXJ0dWFsIGJvb2wgd3JpdGVOb3BEYXRhKHVpbnQ2NF90IENvdW50LCBNQ09iamVjdFdyaXRlciAqT1cpIGNvbnN0ID0gMDsKKworICAvLy8gR2l2ZSBiYWNrZW5kIGFuIG9wcG9ydHVuaXR5IHRvIGZpbmlzaCBsYXlvdXQgYWZ0ZXIgcmVsYXhhdGlvbgorICB2aXJ0dWFsIHZvaWQgZmluaXNoTGF5b3V0KE1DQXNzZW1ibGVyIGNvbnN0ICZBc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBc21MYXlvdXQgJkxheW91dCkgY29uc3Qge30KKworICAvLy8gSGFuZGxlIGFueSB0YXJnZXQtc3BlY2lmaWMgYXNzZW1ibGVyIGZsYWdzLiBCeSBkZWZhdWx0LCBkbyBub3RoaW5nLgorICB2aXJ0dWFsIHZvaWQgaGFuZGxlQXNzZW1ibGVyRmxhZyhNQ0Fzc2VtYmxlckZsYWcgRmxhZykge30KKworICAvLy8gXGJyaWVmIEdlbmVyYXRlIHRoZSBjb21wYWN0IHVud2luZCBlbmNvZGluZyBmb3IgdGhlIENGSSBpbnN0cnVjdGlvbnMuCisgIHZpcnR1YWwgdWludDMyX3QKKyAgICAgIGdlbmVyYXRlQ29tcGFjdFVud2luZEVuY29kaW5nKEFycmF5UmVmPE1DQ0ZJSW5zdHJ1Y3Rpb24+KSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLy8gSGFuZGxlcyBhbGwgdGFyZ2V0IHJlbGF0ZWQgY29kZSBwYWRkaW5nIHdoZW4gc3RhcnRpbmcgdG8gd3JpdGUgYSBuZXcKKyAgLy8vIGJhc2ljIGJsb2NrIHRvIGFuIG9iamVjdCBmaWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBPUyBUaGUgc3RyZWFtZXIgdXNlZCBmb3Igd3JpdGluZyB0aGUgcGFkZGluZyBkYXRhIGFuZCBmdW5jdGlvbi4KKyAgLy8vIFxwYXJhbSBDb250ZXh0IHRoZSBjb250ZXh0IG9mIHRoZSBwYWRkaW5nLCBFbWJlZHMgdGhlIGJhc2ljIGJsb2NrJ3MKKyAgLy8vIHBhcmFtZXRlcnMuCisgIHZvaWQgaGFuZGxlQ29kZVBhZGRpbmdCYXNpY0Jsb2NrU3RhcnQoTUNPYmplY3RTdHJlYW1lciAqT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNDb2RlUGFkZGluZ0NvbnRleHQgJkNvbnRleHQpOworICAvLy8gSGFuZGxlcyBhbGwgdGFyZ2V0IHJlbGF0ZWQgY29kZSBwYWRkaW5nIGFmdGVyIHdyaXRpbmcgYSBibG9jayB0byBhbiBvYmplY3QKKyAgLy8vIGZpbGUuCisgIC8vLworICAvLy8gXHBhcmFtIENvbnRleHQgdGhlIGNvbnRleHQgb2YgdGhlIHBhZGRpbmcsIEVtYmVkcyB0aGUgYmFzaWMgYmxvY2sncworICAvLy8gcGFyYW1ldGVycy4KKyAgdm9pZCBoYW5kbGVDb2RlUGFkZGluZ0Jhc2ljQmxvY2tFbmQoY29uc3QgTUNDb2RlUGFkZGluZ0NvbnRleHQgJkNvbnRleHQpOworICAvLy8gSGFuZGxlcyBhbGwgdGFyZ2V0IHJlbGF0ZWQgY29kZSBwYWRkaW5nIGJlZm9yZSB3cml0aW5nIGEgbmV3IGluc3RydWN0aW9uCisgIC8vLyB0byBhbiBvYmplY3QgZmlsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gSW5zdCB0aGUgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgaGFuZGxlQ29kZVBhZGRpbmdJbnN0cnVjdGlvbkJlZ2luKGNvbnN0IE1DSW5zdCAmSW5zdCk7CisgIC8vLyBIYW5kbGVzIGFsbCB0YXJnZXQgcmVsYXRlZCBjb2RlIHBhZGRpbmcgYWZ0ZXIgd3JpdGluZyBhbiBpbnN0cnVjdGlvbiB0byBhbgorICAvLy8gb2JqZWN0IGZpbGUuCisgIC8vLworICAvLy8gXHBhcmFtIEluc3QgdGhlIGluc3RydWN0aW9uLgorICB2b2lkIGhhbmRsZUNvZGVQYWRkaW5nSW5zdHJ1Y3Rpb25FbmQoY29uc3QgTUNJbnN0ICZJbnN0KTsKKworICAvLy8gUmVsYXhlcyBhIGZyYWdtZW50IChjaGFuZ2VzIHRoZSBzaXplIG9mIHRoZSBwYWRkaW5nKSBhY2NvcmRpbmcgdG8gdGFyZ2V0CisgIC8vLyByZXF1aXJlbWVudHMuIFRoZSBuZXcgc2l6ZSBjb21wdXRhdGlvbiBpcyBkb25lIHcuci50IGEgbGF5b3V0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBQRiBUaGUgZnJhZ21lbnQgdG8gcmVsYXguCisgIC8vLyBccGFyYW0gTGF5b3V0IENvZGUgbGF5b3V0IGluZm9ybWF0aW9uLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWZmIGFueSByZWxheGF0aW9uIG9jY3VycmVkLgorICBib29sIHJlbGF4RnJhZ21lbnQoTUNQYWRkaW5nRnJhZ21lbnQgKlBGLCBNQ0FzbUxheW91dCAmTGF5b3V0KTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DQVNNQkFDS0VORF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQXNtSW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0FzbUluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTM4YzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0FzbUluZm8uaApAQCAtMCwwICsxLDYyNCBAQAorLy89PT0tLSBsbHZtL01DL01DQXNtSW5mby5oIC0gQXNtIGluZm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgYSBjbGFzcyB0byBiZSB1c2VkIGFzIHRoZSBiYXNpcyBmb3IgdGFyZ2V0IHNwZWNpZmljCisvLyBhc20gd3JpdGVycy4gIFRoaXMgY2xhc3MgcHJpbWFyaWx5IHRha2VzIGNhcmUgb2YgZ2xvYmFsIHByaW50aW5nIGNvbnN0YW50cywKKy8vIHdoaWNoIGFyZSB1c2VkIGluIHZlcnkgc2ltaWxhciB3YXlzIGFjcm9zcyBhbGwgdGFyZ2V0cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNBU01JTkZPX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0FTTUlORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0RpcmVjdGl2ZXMuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRHdhcmYuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0NvbnRleHQ7CitjbGFzcyBNQ0V4cHI7CitjbGFzcyBNQ1NlY3Rpb247CitjbGFzcyBNQ1N0cmVhbWVyOworY2xhc3MgTUNTeW1ib2w7CisKK25hbWVzcGFjZSBXaW5FSCB7CisKK2VudW0gY2xhc3MgRW5jb2RpbmdUeXBlIHsKKyAgSW52YWxpZCwgLy8vIEludmFsaWQKKyAgQWxwaGEsICAgLy8vIFdpbmRvd3MgQWxwaGEKKyAgQWxwaGE2NCwgLy8vIFdpbmRvd3MgQVhQNjQKKyAgQVJNLCAgICAgLy8vIFdpbmRvd3MgTlQgKFdpbmRvd3Mgb24gQVJNKQorICBDRSwgICAgICAvLy8gV2luZG93cyBDRSBBUk0sIFBvd2VyUEMsIFNIMywgU0g0CisgIEl0YW5pdW0sIC8vLyBXaW5kb3dzIHg2NCwgV2luZG93cyBJdGFuaXVtIChJQS02NCkKKyAgWDg2LCAgICAgLy8vIFdpbmRvd3MgeDg2LCB1c2VzIG5vIENGSSwganVzdCBFSCB0YWJsZXMKKyAgTUlQUyA9IEFscGhhLAorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIFdpbkVICisKK25hbWVzcGFjZSBMQ09NTSB7CisKK2VudW0gTENPTU1UeXBlIHsgTm9BbGlnbm1lbnQsIEJ5dGVBbGlnbm1lbnQsIExvZzJBbGlnbm1lbnQgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIExDT01NCisKKy8vLyBUaGlzIGNsYXNzIGlzIGludGVuZGVkIHRvIGJlIHVzZWQgYXMgYSBiYXNlIGNsYXNzIGZvciBhc20KKy8vLyBwcm9wZXJ0aWVzIGFuZCBmZWF0dXJlcyBzcGVjaWZpYyB0byB0aGUgdGFyZ2V0LgorY2xhc3MgTUNBc21JbmZvIHsKK3Byb3RlY3RlZDoKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBQcm9wZXJ0aWVzIHRvIGJlIHNldCBieSB0aGUgdGFyZ2V0IHdyaXRlciwgdXNlZCB0byBjb25maWd1cmUgYXNtIHByaW50ZXIuCisgIC8vCisKKyAgLy8vIENvZGUgcG9pbnRlciBzaXplIGluIGJ5dGVzLiAgRGVmYXVsdCBpcyA0LgorICB1bnNpZ25lZCBDb2RlUG9pbnRlclNpemUgPSA0OworCisgIC8vLyBTaXplIG9mIHRoZSBzdGFjayBzbG90IHJlc2VydmVkIGZvciBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXJzLCBpbiBieXRlcy4KKyAgLy8vIERlZmF1bHQgaXMgc2FtZSBhcyBwb2ludGVyIHNpemUuCisgIHVuc2lnbmVkIENhbGxlZVNhdmVTdGFja1Nsb3RTaXplID0gNDsKKworICAvLy8gVHJ1ZSBpZiB0YXJnZXQgaXMgbGl0dGxlIGVuZGlhbi4gIERlZmF1bHQgaXMgdHJ1ZS4KKyAgYm9vbCBJc0xpdHRsZUVuZGlhbiA9IHRydWU7CisKKyAgLy8vIFRydWUgaWYgdGFyZ2V0IHN0YWNrIGdyb3cgdXAuICBEZWZhdWx0IGlzIGZhbHNlLgorICBib29sIFN0YWNrR3Jvd3NVcCA9IGZhbHNlOworCisgIC8vLyBUcnVlIGlmIHRoaXMgdGFyZ2V0IGhhcyB0aGUgTWFjaE8gLnN1YnNlY3Rpb25zX3ZpYV9zeW1ib2xzIGRpcmVjdGl2ZS4KKyAgLy8vIERlZmF1bHQgaXMgZmFsc2UuCisgIGJvb2wgSGFzU3Vic2VjdGlvbnNWaWFTeW1ib2xzID0gZmFsc2U7CisKKyAgLy8vIFRydWUgaWYgdGhpcyBpcyBhIE1hY2hPIHRhcmdldCB0aGF0IHN1cHBvcnRzIHRoZSBtYWNoby1zcGVjaWZpYyAuemVyb2ZpbGwKKyAgLy8vIGRpcmVjdGl2ZSBmb3IgZW1pdHRpbmcgQlNTIFN5bWJvbHMuICBEZWZhdWx0IGlzIGZhbHNlLgorICBib29sIEhhc01hY2hvWmVyb0ZpbGxEaXJlY3RpdmUgPSBmYWxzZTsKKworICAvLy8gVHJ1ZSBpZiB0aGlzIGlzIGEgTWFjaE8gdGFyZ2V0IHRoYXQgc3VwcG9ydHMgdGhlIG1hY2hvLXNwZWNpZmljIC50YnNzCisgIC8vLyBkaXJlY3RpdmUgZm9yIGVtaXR0aW5nIHRocmVhZCBsb2NhbCBCU1MgU3ltYm9scy4gIERlZmF1bHQgaXMgZmFsc2UuCisgIGJvb2wgSGFzTWFjaG9UQlNTRGlyZWN0aXZlID0gZmFsc2U7CisKKyAgLy8vIFRoaXMgaXMgdGhlIG1heGltdW0gcG9zc2libGUgbGVuZ3RoIG9mIGFuIGluc3RydWN0aW9uLCB3aGljaCBpcyBuZWVkZWQgdG8KKyAgLy8vIGNvbXB1dGUgdGhlIHNpemUgb2YgYW4gaW5saW5lIGFzbS4gIERlZmF1bHRzIHRvIDQuCisgIHVuc2lnbmVkIE1heEluc3RMZW5ndGggPSA0OworCisgIC8vLyBFdmVyeSBwb3NzaWJsZSBpbnN0cnVjdGlvbiBsZW5ndGggaXMgYSBtdWx0aXBsZSBvZiB0aGlzIHZhbHVlLiAgRmFjdG9yZWQKKyAgLy8vIG91dCBpbiAuZGVidWdfZnJhbWUgYW5kIC5kZWJ1Z19saW5lLiAgRGVmYXVsdHMgdG8gMS4KKyAgdW5zaWduZWQgTWluSW5zdEFsaWdubWVudCA9IDE7CisKKyAgLy8vIFRoZSAnJCcgdG9rZW4sIHdoZW4gbm90IHJlZmVyZW5jaW5nIGFuIGlkZW50aWZpZXIgb3IgY29uc3RhbnQsIHJlZmVycyB0bworICAvLy8gdGhlIGN1cnJlbnQgUEMuICBEZWZhdWx0cyB0byBmYWxzZS4KKyAgYm9vbCBEb2xsYXJJc1BDID0gZmFsc2U7CisKKyAgLy8vIFRoaXMgc3RyaW5nLCBpZiBzcGVjaWZpZWQsIGlzIHVzZWQgdG8gc2VwYXJhdGUgaW5zdHJ1Y3Rpb25zIGZyb20gZWFjaAorICAvLy8gb3RoZXIgd2hlbiBvbiB0aGUgc2FtZSBsaW5lLiAgRGVmYXVsdHMgdG8gJzsnCisgIGNvbnN0IGNoYXIgKlNlcGFyYXRvclN0cmluZzsKKworICAvLy8gVGhpcyBpbmRpY2F0ZXMgdGhlIGNvbW1lbnQgY2hhcmFjdGVyIHVzZWQgYnkgdGhlIGFzc2VtYmxlci4gIERlZmF1bHRzIHRvCisgIC8vLyAiIyIKKyAgU3RyaW5nUmVmIENvbW1lbnRTdHJpbmc7CisKKyAgLy8vIFRoaXMgaXMgYXBwZW5kZWQgdG8gZW1pdHRlZCBsYWJlbHMuICBEZWZhdWx0cyB0byAiOiIKKyAgY29uc3QgY2hhciAqTGFiZWxTdWZmaXg7CisKKyAgLy8gUHJpbnQgdGhlIEVIIGJlZ2luIHN5bWJvbCB3aXRoIGFuIGFzc2lnbm1lbnQuIERlZmF1bHRzIHRvIGZhbHNlLgorICBib29sIFVzZUFzc2lnbm1lbnRGb3JFSEJlZ2luID0gZmFsc2U7CisKKyAgLy8gRG8gd2UgbmVlZCB0byBjcmVhdGUgYSBsb2NhbCBzeW1ib2wgZm9yIC5zaXplPworICBib29sIE5lZWRzTG9jYWxGb3JTaXplID0gZmFsc2U7CisKKyAgLy8vIFRoaXMgcHJlZml4IGlzIHVzZWQgZm9yIGdsb2JhbHMgbGlrZSBjb25zdGFudCBwb29sIGVudHJpZXMgdGhhdCBhcmUKKyAgLy8vIGNvbXBsZXRlbHkgcHJpdmF0ZSB0byB0aGUgLnMgZmlsZSBhbmQgc2hvdWxkIG5vdCBoYXZlIG5hbWVzIGluIHRoZSAubworICAvLy8gZmlsZS4gIERlZmF1bHRzIHRvICJMIgorICBTdHJpbmdSZWYgUHJpdmF0ZUdsb2JhbFByZWZpeDsKKworICAvLy8gVGhpcyBwcmVmaXggaXMgdXNlZCBmb3IgbGFiZWxzIGZvciBiYXNpYyBibG9ja3MuIERlZmF1bHRzIHRvIHRoZSBzYW1lIGFzCisgIC8vLyBQcml2YXRlR2xvYmFsUHJlZml4LgorICBTdHJpbmdSZWYgUHJpdmF0ZUxhYmVsUHJlZml4OworCisgIC8vLyBUaGlzIHByZWZpeCBpcyB1c2VkIGZvciBzeW1ib2xzIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCB0aHJvdWdoIHRoZQorICAvLy8gYXNzZW1ibGVyIGJ1dCBiZSByZW1vdmVkIGJ5IHRoZSBsaW5rZXIuICBUaGlzIGlzICdsJyBvbiBEYXJ3aW4sIGN1cnJlbnRseQorICAvLy8gdXNlZCBmb3Igc29tZSBPYmpDIG1ldGFkYXRhLiAgVGhlIGRlZmF1bHQgb2YgIiIgbWVhc3QgdGhhdCBmb3IgdGhpcyBzeXN0ZW0KKyAgLy8vIGEgcGxhaW4gcHJpdmF0ZSBzeW1ib2wgc2hvdWxkIGJlIHVzZWQuICBEZWZhdWx0cyB0byAiIi4KKyAgU3RyaW5nUmVmIExpbmtlclByaXZhdGVHbG9iYWxQcmVmaXg7CisKKyAgLy8vIElmIHRoZXNlIGFyZSBub25lbXB0eSwgdGhleSBjb250YWluIGEgZGlyZWN0aXZlIHRvIGVtaXQgYmVmb3JlIGFuZCBhZnRlcgorICAvLy8gYW4gaW5saW5lIGFzc2VtYmx5IHN0YXRlbWVudC4gIERlZmF1bHRzIHRvICIjQVBQXG4iLCAiI05PX0FQUFxuIgorICBjb25zdCBjaGFyICpJbmxpbmVBc21TdGFydDsKKyAgY29uc3QgY2hhciAqSW5saW5lQXNtRW5kOworCisgIC8vLyBUaGVzZSBhcmUgYXNzZW1ibHkgZGlyZWN0aXZlcyB0aGF0IHRlbGxzIHRoZSBhc3NlbWJsZXIgdG8gaW50ZXJwcmV0IHRoZQorICAvLy8gZm9sbG93aW5nIGluc3RydWN0aW9ucyBkaWZmZXJlbnRseS4gIERlZmF1bHRzIHRvICIuY29kZTE2IiwgIi5jb2RlMzIiLAorICAvLy8gIi5jb2RlNjQiLgorICBjb25zdCBjaGFyICpDb2RlMTZEaXJlY3RpdmU7CisgIGNvbnN0IGNoYXIgKkNvZGUzMkRpcmVjdGl2ZTsKKyAgY29uc3QgY2hhciAqQ29kZTY0RGlyZWN0aXZlOworCisgIC8vLyBXaGljaCBkaWFsZWN0IG9mIGFuIGFzc2VtYmxlciB2YXJpYW50IHRvIHVzZS4gIERlZmF1bHRzIHRvIDAKKyAgdW5zaWduZWQgQXNzZW1ibGVyRGlhbGVjdCA9IDA7CisKKyAgLy8vIFRoaXMgaXMgdHJ1ZSBpZiB0aGUgYXNzZW1ibGVyIGFsbG93cyBAIGNoYXJhY3RlcnMgaW4gc3ltYm9sIG5hbWVzLgorICAvLy8gRGVmYXVsdHMgdG8gZmFsc2UuCisgIGJvb2wgQWxsb3dBdEluTmFtZSA9IGZhbHNlOworCisgIC8vLyBJZiB0aGlzIGlzIHRydWUsIHN5bWJvbCBuYW1lcyB3aXRoIGludmFsaWQgY2hhcmFjdGVycyB3aWxsIGJlIHByaW50ZWQgaW4KKyAgLy8vIHF1b3Rlcy4KKyAgYm9vbCBTdXBwb3J0c1F1b3RlZE5hbWVzID0gdHJ1ZTsKKworICAvLy8gVGhpcyBpcyB0cnVlIGlmIGRhdGEgcmVnaW9uIG1hcmtlcnMgc2hvdWxkIGJlIHByaW50ZWQgYXMKKyAgLy8vICIuZGF0YV9yZWdpb24vLmVuZF9kYXRhX3JlZ2lvbiIgZGlyZWN0aXZlcy4gSWYgZmFsc2UsIHVzZSAiJGQvJGEiIGxhYmVscworICAvLy8gaW5zdGVhZC4KKyAgYm9vbCBVc2VEYXRhUmVnaW9uRGlyZWN0aXZlcyA9IGZhbHNlOworCisgIC8vPT09LS0tIERhdGEgRW1pc3Npb24gRGlyZWN0aXZlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gVGhpcyBzaG91bGQgYmUgc2V0IHRvIHRoZSBkaXJlY3RpdmUgdXNlZCB0byBnZXQgc29tZSBudW1iZXIgb2YgemVybyBieXRlcworICAvLy8gZW1pdHRlZCB0byB0aGUgY3VycmVudCBzZWN0aW9uLiAgQ29tbW9uIGNhc2VzIGFyZSAiXHQuemVyb1x0IiBhbmQKKyAgLy8vICJcdC5zcGFjZVx0Ii4gIElmIHRoaXMgaXMgc2V0IHRvIG51bGwsIHRoZSBEYXRhKmJpdHNEaXJlY3RpdmUncyB3aWxsIGJlCisgIC8vLyB1c2VkIHRvIGVtaXQgemVybyBieXRlcy4gIERlZmF1bHRzIHRvICJcdC56ZXJvXHQiCisgIGNvbnN0IGNoYXIgKlplcm9EaXJlY3RpdmU7CisKKyAgLy8vIFRoaXMgZGlyZWN0aXZlIGFsbG93cyBlbWlzc2lvbiBvZiBhbiBhc2NpaSBzdHJpbmcgd2l0aCB0aGUgc3RhbmRhcmQgQworICAvLy8gZXNjYXBlIGNoYXJhY3RlcnMgZW1iZWRkZWQgaW50byBpdC4gIElmIGEgdGFyZ2V0IGRvZXNuJ3Qgc3VwcG9ydCB0aGlzLCBpdAorICAvLy8gY2FuIGJlIHNldCB0byBudWxsLiBEZWZhdWx0cyB0byAiXHQuYXNjaWlcdCIKKyAgY29uc3QgY2hhciAqQXNjaWlEaXJlY3RpdmU7CisKKyAgLy8vIElmIG5vdCBudWxsLCB0aGlzIGFsbG93cyBmb3Igc3BlY2lhbCBoYW5kbGluZyBvZiB6ZXJvIHRlcm1pbmF0ZWQgc3RyaW5ncworICAvLy8gb24gdGhpcyB0YXJnZXQuICBUaGlzIGlzIGNvbW1vbmx5IHN1cHBvcnRlZCBhcyAiLmFzY2l6Ii4gIElmIGEgdGFyZ2V0CisgIC8vLyBkb2Vzbid0IHN1cHBvcnQgdGhpcywgaXQgY2FuIGJlIHNldCB0byBudWxsLiAgRGVmYXVsdHMgdG8gIlx0LmFzY2l6XHQiCisgIGNvbnN0IGNoYXIgKkFzY2l6RGlyZWN0aXZlOworCisgIC8vLyBUaGVzZSBkaXJlY3RpdmVzIGFyZSB1c2VkIHRvIG91dHB1dCBzb21lIHVuaXQgb2YgaW50ZWdlciBkYXRhIHRvIHRoZQorICAvLy8gY3VycmVudCBzZWN0aW9uLiAgSWYgYSBkYXRhIGRpcmVjdGl2ZSBpcyBzZXQgdG8gbnVsbCwgc21hbGxlciBkYXRhCisgIC8vLyBkaXJlY3RpdmVzIHdpbGwgYmUgdXNlZCB0byBlbWl0IHRoZSBsYXJnZSBzaXplcy4gIERlZmF1bHRzIHRvICJcdC5ieXRlXHQiLAorICAvLy8gIlx0LnNob3J0XHQiLCAiXHQubG9uZ1x0IiwgIlx0LnF1YWRcdCIKKyAgY29uc3QgY2hhciAqRGF0YThiaXRzRGlyZWN0aXZlOworICBjb25zdCBjaGFyICpEYXRhMTZiaXRzRGlyZWN0aXZlOworICBjb25zdCBjaGFyICpEYXRhMzJiaXRzRGlyZWN0aXZlOworICBjb25zdCBjaGFyICpEYXRhNjRiaXRzRGlyZWN0aXZlOworCisgIC8vLyBJZiBub24tbnVsbCwgYSBkaXJlY3RpdmUgdGhhdCBpcyB1c2VkIHRvIGVtaXQgYSB3b3JkIHdoaWNoIHNob3VsZCBiZQorICAvLy8gcmVsb2NhdGVkIGFzIGEgNjQtYml0IEdQLXJlbGF0aXZlIG9mZnNldCwgZS5nLiAuZ3Bkd29yZCBvbiBNaXBzLiAgRGVmYXVsdHMKKyAgLy8vIHRvIG51bGxwdHIuCisgIGNvbnN0IGNoYXIgKkdQUmVsNjREaXJlY3RpdmUgPSBudWxscHRyOworCisgIC8vLyBJZiBub24tbnVsbCwgYSBkaXJlY3RpdmUgdGhhdCBpcyB1c2VkIHRvIGVtaXQgYSB3b3JkIHdoaWNoIHNob3VsZCBiZQorICAvLy8gcmVsb2NhdGVkIGFzIGEgMzItYml0IEdQLXJlbGF0aXZlIG9mZnNldCwgZS5nLiAuZ3B3b3JkIG9uIE1pcHMgb3IgLmdwcmVsMzIKKyAgLy8vIG9uIEFscGhhLiAgRGVmYXVsdHMgdG8gbnVsbHB0ci4KKyAgY29uc3QgY2hhciAqR1BSZWwzMkRpcmVjdGl2ZSA9IG51bGxwdHI7CisKKyAgLy8vIElmIG5vbi1udWxsLCBkaXJlY3RpdmVzIHRoYXQgYXJlIHVzZWQgdG8gZW1pdCBhIHdvcmQvZHdvcmQgd2hpY2ggc2hvdWxkCisgIC8vLyBiZSByZWxvY2F0ZWQgYXMgYSAzMi82NC1iaXQgRFRQL1RQLXJlbGF0aXZlIG9mZnNldCwgZS5nLiAuZHRwcmVsd29yZC8KKyAgLy8vIC5kdHByZWxkd29yZC8udHByZWx3b3JkLy50cHJlbGR3b3JkIG9uIE1pcHMuCisgIGNvbnN0IGNoYXIgKkRUUFJlbDMyRGlyZWN0aXZlID0gbnVsbHB0cjsKKyAgY29uc3QgY2hhciAqRFRQUmVsNjREaXJlY3RpdmUgPSBudWxscHRyOworICBjb25zdCBjaGFyICpUUFJlbDMyRGlyZWN0aXZlID0gbnVsbHB0cjsKKyAgY29uc3QgY2hhciAqVFBSZWw2NERpcmVjdGl2ZSA9IG51bGxwdHI7CisKKyAgLy8vIFRoaXMgaXMgdHJ1ZSBpZiB0aGlzIHRhcmdldCB1c2VzICJTdW4gU3R5bGUiIHN5bnRheCBmb3Igc2VjdGlvbiBzd2l0Y2hpbmcKKyAgLy8vICgiI2FsbG9jLCN3cml0ZSIgZXRjKSBpbnN0ZWFkIG9mIHRoZSBub3JtYWwgRUxGIHN5bnRheCAoLCJhLHciKSBpbgorICAvLy8gLnNlY3Rpb24gZGlyZWN0aXZlcy4gIERlZmF1bHRzIHRvIGZhbHNlLgorICBib29sIFN1blN0eWxlRUxGU2VjdGlvblN3aXRjaFN5bnRheCA9IGZhbHNlOworCisgIC8vLyBUaGlzIGlzIHRydWUgaWYgdGhpcyB0YXJnZXQgdXNlcyBFTEYgJy5zZWN0aW9uJyBkaXJlY3RpdmUgYmVmb3JlIHRoZQorICAvLy8gJy5ic3MnIG9uZS4gSXQncyB1c2VkIGZvciBQUEMvTGludXggd2hpY2ggZG9lc24ndCBzdXBwb3J0IHRoZSAnLmJzcycKKyAgLy8vIGRpcmVjdGl2ZSBvbmx5LiAgRGVmYXVsdHMgdG8gZmFsc2UuCisgIGJvb2wgVXNlc0VMRlNlY3Rpb25EaXJlY3RpdmVGb3JCU1MgPSBmYWxzZTsKKworICBib29sIE5lZWRzRHdhcmZTZWN0aW9uT2Zmc2V0RGlyZWN0aXZlID0gZmFsc2U7CisKKyAgLy89PT0tLS0gQWxpZ25tZW50IEluZm9ybWF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBJZiB0aGlzIGlzIHRydWUgKHRoZSBkZWZhdWx0KSB0aGVuIHRoZSBhc21wcmludGVyIGVtaXRzICIuYWxpZ24gTiIKKyAgLy8vIGRpcmVjdGl2ZXMsIHdoZXJlIE4gaXMgdGhlIG51bWJlciBvZiBieXRlcyB0byBhbGlnbiB0by4gIE90aGVyd2lzZSwgaXQKKyAgLy8vIGVtaXRzICIuYWxpZ24gbG9nMihOKSIsIGUuZy4gMyB0byBhbGlnbiB0byBhbiA4IGJ5dGUgYm91bmRhcnkuICBEZWZhdWx0cworICAvLy8gdG8gdHJ1ZS4KKyAgYm9vbCBBbGlnbm1lbnRJc0luQnl0ZXMgPSB0cnVlOworCisgIC8vLyBJZiBub24temVybywgdGhpcyBpcyB1c2VkIHRvIGZpbGwgdGhlIGV4ZWN1dGFibGUgc3BhY2UgY3JlYXRlZCBhcyB0aGUKKyAgLy8vIHJlc3VsdCBvZiBhIGFsaWdubWVudCBkaXJlY3RpdmUuICBEZWZhdWx0cyB0byAwCisgIHVuc2lnbmVkIFRleHRBbGlnbkZpbGxWYWx1ZSA9IDA7CisKKyAgLy89PT0tLS0gR2xvYmFsIFZhcmlhYmxlIEVtaXNzaW9uIERpcmVjdGl2ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBUaGlzIGlzIHRoZSBkaXJlY3RpdmUgdXNlZCB0byBkZWNsYXJlIGEgZ2xvYmFsIGVudGl0eS4gRGVmYXVsdHMgdG8KKyAgLy8vICIuZ2xvYmwiLgorICBjb25zdCBjaGFyICpHbG9iYWxEaXJlY3RpdmU7CisKKyAgLy8vIFRydWUgaWYgdGhlIGV4cHJlc3Npb24KKyAgLy8vICAgLmxvbmcgZiAtIGcKKyAgLy8vIHVzZXMgYSByZWxvY2F0aW9uIGJ1dCBpdCBjYW4gYmUgc3VwcHJlc3NlZCBieSB3cml0aW5nCisgIC8vLyAgIGEgPSBmIC0gZworICAvLy8gICAubG9uZyBhCisgIGJvb2wgU2V0RGlyZWN0aXZlU3VwcHJlc3Nlc1JlbG9jID0gZmFsc2U7CisKKyAgLy8vIEZhbHNlIGlmIHRoZSBhc3NlbWJsZXIgcmVxdWlyZXMgdGhhdCB3ZSB1c2UKKyAgLy8vIFxjb2RlCisgIC8vLyAgIExjID0gYSAtIGIKKyAgLy8vICAgLmxvbmcgTGMKKyAgLy8vIFxlbmRjb2RlCisgIC8vCisgIC8vLyBpbnN0ZWFkIG9mCisgIC8vCisgIC8vLyBcY29kZQorICAvLy8gICAubG9uZyBhIC0gYgorICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIC8vLyAgRGVmYXVsdHMgdG8gdHJ1ZS4KKyAgYm9vbCBIYXNBZ2dyZXNzaXZlU3ltYm9sRm9sZGluZyA9IHRydWU7CisKKyAgLy8vIFRydWUgaXMgLmNvbW0ncyBhbmQgLmxjb21tcyBvcHRpb25hbCBhbGlnbm1lbnQgaXMgdG8gYmUgc3BlY2lmaWVkIGluIGJ5dGVzCisgIC8vLyBpbnN0ZWFkIG9mIGxvZzIobikuICBEZWZhdWx0cyB0byB0cnVlLgorICBib29sIENPTU1EaXJlY3RpdmVBbGlnbm1lbnRJc0luQnl0ZXMgPSB0cnVlOworCisgIC8vLyBEZXNjcmliZXMgaWYgdGhlIC5sY29tbSBkaXJlY3RpdmUgZm9yIHRoZSB0YXJnZXQgc3VwcG9ydHMgYW4gYWxpZ25tZW50CisgIC8vLyBhcmd1bWVudCBhbmQgaG93IGl0IGlzIGludGVycHJldGVkLiAgRGVmYXVsdHMgdG8gTm9BbGlnbm1lbnQuCisgIExDT01NOjpMQ09NTVR5cGUgTENPTU1EaXJlY3RpdmVBbGlnbm1lbnRUeXBlID0gTENPTU06Ok5vQWxpZ25tZW50OworCisgIC8vIFRydWUgaWYgdGhlIHRhcmdldCBhbGxvd3MgLmFsaWduIGRpcmVjdGl2ZXMgb24gZnVuY3Rpb25zLiBUaGlzIGlzIHRydWUgZm9yCisgIC8vIG1vc3QgdGFyZ2V0cywgc28gZGVmYXVsdHMgdG8gdHJ1ZS4KKyAgYm9vbCBIYXNGdW5jdGlvbkFsaWdubWVudCA9IHRydWU7CisKKyAgLy8vIFRydWUgaWYgdGhlIHRhcmdldCBoYXMgLnR5cGUgYW5kIC5zaXplIGRpcmVjdGl2ZXMsIHRoaXMgaXMgdHJ1ZSBmb3IgbW9zdAorICAvLy8gRUxGIHRhcmdldHMuICBEZWZhdWx0cyB0byB0cnVlLgorICBib29sIEhhc0RvdFR5cGVEb3RTaXplRGlyZWN0aXZlID0gdHJ1ZTsKKworICAvLy8gVHJ1ZSBpZiB0aGUgdGFyZ2V0IGhhcyBhIHNpbmdsZSBwYXJhbWV0ZXIgLmZpbGUgZGlyZWN0aXZlLCB0aGlzIGlzIHRydWUKKyAgLy8vIGZvciBFTEYgdGFyZ2V0cy4gIERlZmF1bHRzIHRvIHRydWUuCisgIGJvb2wgSGFzU2luZ2xlUGFyYW1ldGVyRG90RmlsZSA9IHRydWU7CisKKyAgLy8vIFRydWUgaWYgdGhlIHRhcmdldCBoYXMgYSAuaWRlbnQgZGlyZWN0aXZlLCB0aGlzIGlzIHRydWUgZm9yIEVMRiB0YXJnZXRzLgorICAvLy8gRGVmYXVsdHMgdG8gZmFsc2UuCisgIGJvb2wgSGFzSWRlbnREaXJlY3RpdmUgPSBmYWxzZTsKKworICAvLy8gVHJ1ZSBpZiB0aGlzIHRhcmdldCBzdXBwb3J0cyB0aGUgTWFjaE8gLm5vX2RlYWRfc3RyaXAgZGlyZWN0aXZlLiAgRGVmYXVsdHMKKyAgLy8vIHRvIGZhbHNlLgorICBib29sIEhhc05vRGVhZFN0cmlwID0gZmFsc2U7CisKKyAgLy8vIFRydWUgaWYgdGhpcyB0YXJnZXQgc3VwcG9ydHMgdGhlIE1hY2hPIC5hbHRfZW50cnkgZGlyZWN0aXZlLiAgRGVmYXVsdHMgdG8KKyAgLy8vIGZhbHNlLgorICBib29sIEhhc0FsdEVudHJ5ID0gZmFsc2U7CisKKyAgLy8vIFVzZWQgdG8gZGVjbGFyZSBhIGdsb2JhbCBhcyBiZWluZyBhIHdlYWsgc3ltYm9sLiBEZWZhdWx0cyB0byAiLndlYWsiLgorICBjb25zdCBjaGFyICpXZWFrRGlyZWN0aXZlOworCisgIC8vLyBUaGlzIGRpcmVjdGl2ZSwgaWYgbm9uLW51bGwsIGlzIHVzZWQgdG8gZGVjbGFyZSBhIGdsb2JhbCBhcyBiZWluZyBhIHdlYWsKKyAgLy8vIHVuZGVmaW5lZCBzeW1ib2wuICBEZWZhdWx0cyB0byBudWxscHRyLgorICBjb25zdCBjaGFyICpXZWFrUmVmRGlyZWN0aXZlID0gbnVsbHB0cjsKKworICAvLy8gVHJ1ZSBpZiB3ZSBoYXZlIGEgZGlyZWN0aXZlIHRvIGRlY2xhcmUgYSBnbG9iYWwgYXMgYmVpbmcgYSB3ZWFrIGRlZmluZWQKKyAgLy8vIHN5bWJvbC4gIERlZmF1bHRzIHRvIGZhbHNlLgorICBib29sIEhhc1dlYWtEZWZEaXJlY3RpdmUgPSBmYWxzZTsKKworICAvLy8gVHJ1ZSBpZiB3ZSBoYXZlIGEgZGlyZWN0aXZlIHRvIGRlY2xhcmUgYSBnbG9iYWwgYXMgYmVpbmcgYSB3ZWFrIGRlZmluZWQKKyAgLy8vIHN5bWJvbCB0aGF0IGNhbiBiZSBoaWRkZW4gKHVuZXhwb3J0ZWQpLiAgRGVmYXVsdHMgdG8gZmFsc2UuCisgIGJvb2wgSGFzV2Vha0RlZkNhbkJlSGlkZGVuRGlyZWN0aXZlID0gZmFsc2U7CisKKyAgLy8vIFRydWUgaWYgd2UgaGF2ZSBhIC5saW5rb25jZSBkaXJlY3RpdmUuICBUaGlzIGlzIHVzZWQgb24gY3lnd2luL21pbmd3LgorICAvLy8gRGVmYXVsdHMgdG8gZmFsc2UuCisgIGJvb2wgSGFzTGlua09uY2VEaXJlY3RpdmUgPSBmYWxzZTsKKworICAvLy8gVGhpcyBhdHRyaWJ1dGUsIGlmIG5vdCBNQ1NBX0ludmFsaWQsIGlzIHVzZWQgdG8gZGVjbGFyZSBhIHN5bWJvbCBhcyBoYXZpbmcKKyAgLy8vIGhpZGRlbiB2aXNpYmlsaXR5LiAgRGVmYXVsdHMgdG8gTUNTQV9IaWRkZW4uCisgIE1DU3ltYm9sQXR0ciBIaWRkZW5WaXNpYmlsaXR5QXR0ciA9IE1DU0FfSGlkZGVuOworCisgIC8vLyBUaGlzIGF0dHJpYnV0ZSwgaWYgbm90IE1DU0FfSW52YWxpZCwgaXMgdXNlZCB0byBkZWNsYXJlIGFuIHVuZGVmaW5lZAorICAvLy8gc3ltYm9sIGFzIGhhdmluZyBoaWRkZW4gdmlzaWJpbGl0eS4gRGVmYXVsdHMgdG8gTUNTQV9IaWRkZW4uCisgIE1DU3ltYm9sQXR0ciBIaWRkZW5EZWNsYXJhdGlvblZpc2liaWxpdHlBdHRyID0gTUNTQV9IaWRkZW47CisKKyAgLy8vIFRoaXMgYXR0cmlidXRlLCBpZiBub3QgTUNTQV9JbnZhbGlkLCBpcyB1c2VkIHRvIGRlY2xhcmUgYSBzeW1ib2wgYXMgaGF2aW5nCisgIC8vLyBwcm90ZWN0ZWQgdmlzaWJpbGl0eS4gIERlZmF1bHRzIHRvIE1DU0FfUHJvdGVjdGVkCisgIE1DU3ltYm9sQXR0ciBQcm90ZWN0ZWRWaXNpYmlsaXR5QXR0ciA9IE1DU0FfUHJvdGVjdGVkOworCisgIC8vPT09LS0tIER3YXJmIEVtaXNzaW9uIERpcmVjdGl2ZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBUcnVlIGlmIHRhcmdldCBzdXBwb3J0cyBlbWlzc2lvbiBvZiBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24uICBEZWZhdWx0cyB0bworICAvLy8gZmFsc2UuCisgIGJvb2wgU3VwcG9ydHNEZWJ1Z0luZm9ybWF0aW9uID0gZmFsc2U7CisKKyAgLy8vIEV4Y2VwdGlvbiBoYW5kbGluZyBmb3JtYXQgZm9yIHRoZSB0YXJnZXQuICBEZWZhdWx0cyB0byBOb25lLgorICBFeGNlcHRpb25IYW5kbGluZyBFeGNlcHRpb25zVHlwZSA9IEV4Y2VwdGlvbkhhbmRsaW5nOjpOb25lOworCisgIC8vLyBXaW5kb3dzIGV4Y2VwdGlvbiBoYW5kbGluZyBkYXRhICgucGRhdGEpIGVuY29kaW5nLiAgRGVmYXVsdHMgdG8gSW52YWxpZC4KKyAgV2luRUg6OkVuY29kaW5nVHlwZSBXaW5FSEVuY29kaW5nVHlwZSA9IFdpbkVIOjpFbmNvZGluZ1R5cGU6OkludmFsaWQ7CisKKyAgLy8vIFRydWUgaWYgRHdhcmYyIG91dHB1dCBnZW5lcmFsbHkgdXNlcyByZWxvY2F0aW9ucyBmb3IgcmVmZXJlbmNlcyB0byBvdGhlcgorICAvLy8gLmRlYnVnXyogc2VjdGlvbnMuCisgIGJvb2wgRHdhcmZVc2VzUmVsb2NhdGlvbnNBY3Jvc3NTZWN0aW9ucyA9IHRydWU7CisKKyAgLy8vIFRydWUgaWYgRFdBUkYgRkRFIHN5bWJvbCByZWZlcmVuY2UgcmVsb2NhdGlvbnMgc2hvdWxkIGJlIHJlcGxhY2VkIGJ5IGFuCisgIC8vLyBhYnNvbHV0ZSBkaWZmZXJlbmNlLgorICBib29sIER3YXJmRkRFU3ltYm9sc1VzZUFic0RpZmYgPSBmYWxzZTsKKworICAvLy8gVHJ1ZSBpZiBkd2FyZiByZWdpc3RlciBudW1iZXJzIGFyZSBwcmludGVkIGluc3RlYWQgb2Ygc3ltYm9saWMgcmVnaXN0ZXIKKyAgLy8vIG5hbWVzIGluIC5jZmlfKiBkaXJlY3RpdmVzLiAgRGVmYXVsdHMgdG8gZmFsc2UuCisgIGJvb2wgRHdhcmZSZWdOdW1Gb3JDRkkgPSBmYWxzZTsKKworICAvLy8gVHJ1ZSBpZiB0YXJnZXQgdXNlcyBwYXJlbnMgdG8gaW5kaWNhdGUgdGhlIHN5bWJvbCB2YXJpYW50IGluc3RlYWQgb2YgQC4KKyAgLy8vIEZvciBleGFtcGxlLCBmb28ocGx0KSBpbnN0ZWFkIG9mIGZvb0BwbHQuICBEZWZhdWx0cyB0byBmYWxzZS4KKyAgYm9vbCBVc2VQYXJlbnNGb3JTeW1ib2xWYXJpYW50ID0gZmFsc2U7CisKKyAgLy89PT0tLS0gUHJvbG9ndWUgU3RhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgc3RkOjp2ZWN0b3I8TUNDRklJbnN0cnVjdGlvbj4gSW5pdGlhbEZyYW1lU3RhdGU7CisKKyAgLy89PT0tLS0gSW50ZWdyYXRlZCBBc3NlbWJsZXIgSW5mb3JtYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyAgLy8vIFNob3VsZCB3ZSB1c2UgdGhlIGludGVncmF0ZWQgYXNzZW1ibGVyPworICAvLy8gVGhlIGludGVncmF0ZWQgYXNzZW1ibGVyIHNob3VsZCBiZSBlbmFibGVkIGJ5IGRlZmF1bHQgKGJ5IHRoZQorICAvLy8gY29uc3RydWN0b3JzKSB3aGVuIGZhaWxpbmcgdG8gcGFyc2UgYSB2YWxpZCBwaWVjZSBvZiBhc3NlbWJseSAoaW5saW5lCisgIC8vLyBvciBvdGhlcndpc2UpIGlzIGNvbnNpZGVyZWQgYSBidWcuIEl0IG1heSB0aGVuIGJlIG92ZXJyaWRkZW4gYWZ0ZXIKKyAgLy8vIGNvbnN0cnVjdGlvbiAoc2VlIExMVk1UYXJnZXRNYWNoaW5lOjppbml0QXNtSW5mbygpKS4KKyAgYm9vbCBVc2VJbnRlZ3JhdGVkQXNzZW1ibGVyOworCisgIC8vLyBQcmVzZXJ2ZSBDb21tZW50cyBpbiBhc3NlbWJseQorICBib29sIFByZXNlcnZlQXNtQ29tbWVudHM7CisKKyAgLy8vIENvbXByZXNzIERXQVJGIGRlYnVnIHNlY3Rpb25zLiBEZWZhdWx0cyB0byBubyBjb21wcmVzc2lvbi4KKyAgRGVidWdDb21wcmVzc2lvblR5cGUgQ29tcHJlc3NEZWJ1Z1NlY3Rpb25zID0gRGVidWdDb21wcmVzc2lvblR5cGU6Ok5vbmU7CisKKyAgLy8vIFRydWUgaWYgdGhlIGludGVncmF0ZWQgYXNzZW1ibGVyIHNob3VsZCBpbnRlcnByZXQgJ2EgPj4gYicgY29uc3RhbnQKKyAgLy8vIGV4cHJlc3Npb25zIGFzIGxvZ2ljYWwgcmF0aGVyIHRoYW4gYXJpdGhtZXRpYy4KKyAgYm9vbCBVc2VMb2dpY2FsU2hyID0gdHJ1ZTsKKworICAvLyBJZiB0cnVlLCBlbWl0IEdPVFBDUkVMWC9SRVhfR09UUENSRUxYIGluc3RlYWQgb2YgR09UUENSRUwsIG9uCisgIC8vIFg4Nl82NCBFTEYuCisgIGJvb2wgUmVsYXhFTEZSZWxvY2F0aW9ucyA9IHRydWU7CisKKyAgLy8gSWYgdHJ1ZSwgdGhlbiB0aGUgbGV4ZXIgYW5kIGV4cHJlc3Npb24gcGFyc2VyIHdpbGwgc3VwcG9ydCAlbmVnKCksCisgIC8vICVoaSgpLCBhbmQgc2ltaWxhciB1bmFyeSBvcGVyYXRvcnMuCisgIGJvb2wgSGFzTWlwc0V4cHJlc3Npb25zID0gZmFsc2U7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgTUNBc21JbmZvKCk7CisgIHZpcnR1YWwgfk1DQXNtSW5mbygpOworCisgIC8vLyBHZXQgdGhlIGNvZGUgcG9pbnRlciBzaXplIGluIGJ5dGVzLgorICB1bnNpZ25lZCBnZXRDb2RlUG9pbnRlclNpemUoKSBjb25zdCB7IHJldHVybiBDb2RlUG9pbnRlclNpemU7IH0KKworICAvLy8gR2V0IHRoZSBjYWxsZWUtc2F2ZWQgcmVnaXN0ZXIgc3RhY2sgc2xvdAorICAvLy8gc2l6ZSBpbiBieXRlcy4KKyAgdW5zaWduZWQgZ2V0Q2FsbGVlU2F2ZVN0YWNrU2xvdFNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIENhbGxlZVNhdmVTdGFja1Nsb3RTaXplOworICB9CisKKyAgLy8vIFRydWUgaWYgdGhlIHRhcmdldCBpcyBsaXR0bGUgZW5kaWFuLgorICBib29sIGlzTGl0dGxlRW5kaWFuKCkgY29uc3QgeyByZXR1cm4gSXNMaXR0bGVFbmRpYW47IH0KKworICAvLy8gVHJ1ZSBpZiB0YXJnZXQgc3RhY2sgZ3JvdyB1cC4KKyAgYm9vbCBpc1N0YWNrR3Jvd3RoRGlyZWN0aW9uVXAoKSBjb25zdCB7IHJldHVybiBTdGFja0dyb3dzVXA7IH0KKworICBib29sIGhhc1N1YnNlY3Rpb25zVmlhU3ltYm9scygpIGNvbnN0IHsgcmV0dXJuIEhhc1N1YnNlY3Rpb25zVmlhU3ltYm9sczsgfQorCisgIC8vIERhdGEgZGlyZWN0aXZlIGFjY2Vzc29ycy4KKworICBjb25zdCBjaGFyICpnZXREYXRhOGJpdHNEaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBEYXRhOGJpdHNEaXJlY3RpdmU7IH0KKyAgY29uc3QgY2hhciAqZ2V0RGF0YTE2Yml0c0RpcmVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIERhdGExNmJpdHNEaXJlY3RpdmU7IH0KKyAgY29uc3QgY2hhciAqZ2V0RGF0YTMyYml0c0RpcmVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIERhdGEzMmJpdHNEaXJlY3RpdmU7IH0KKyAgY29uc3QgY2hhciAqZ2V0RGF0YTY0Yml0c0RpcmVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIERhdGE2NGJpdHNEaXJlY3RpdmU7IH0KKyAgY29uc3QgY2hhciAqZ2V0R1BSZWw2NERpcmVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIEdQUmVsNjREaXJlY3RpdmU7IH0KKyAgY29uc3QgY2hhciAqZ2V0R1BSZWwzMkRpcmVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIEdQUmVsMzJEaXJlY3RpdmU7IH0KKyAgY29uc3QgY2hhciAqZ2V0RFRQUmVsNjREaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBEVFBSZWw2NERpcmVjdGl2ZTsgfQorICBjb25zdCBjaGFyICpnZXREVFBSZWwzMkRpcmVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIERUUFJlbDMyRGlyZWN0aXZlOyB9CisgIGNvbnN0IGNoYXIgKmdldFRQUmVsNjREaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBUUFJlbDY0RGlyZWN0aXZlOyB9CisgIGNvbnN0IGNoYXIgKmdldFRQUmVsMzJEaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBUUFJlbDMyRGlyZWN0aXZlOyB9CisKKyAgLy8vIFRhcmdldHMgY2FuIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBzcGVjaWZ5IGEgc2VjdGlvbiB0byBzd2l0Y2ggdG8gaWYgdGhlCisgIC8vLyB0cmFuc2xhdGlvbiB1bml0IGRvZXNuJ3QgaGF2ZSBhbnkgdHJhbXBvbGluZXMgdGhhdCByZXF1aXJlIGFuIGV4ZWN1dGFibGUKKyAgLy8vIHN0YWNrLgorICB2aXJ0dWFsIE1DU2VjdGlvbiAqZ2V0Tm9uZXhlY3V0YWJsZVN0YWNrU2VjdGlvbihNQ0NvbnRleHQgJkN0eCkgY29uc3QgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoZSBzZWN0aW9uIGlzIGF0b21pemVkIHVzaW5nIHRoZSBzeW1ib2xzIGluIGl0LgorICAvLy8gVGhpcyBpcyBmYWxzZSBpZiB0aGUgc2VjdGlvbiBpcyBub3QgYXRvbWl6ZWQgYXQgYWxsIChtb3N0IEVMRiBzZWN0aW9ucykgb3IKKyAgLy8vIGlmIGl0IGlzIGF0b21pemVkIGJhc2VkIG9uIGl0cyBjb250ZW50cyAoTWFjaE8nIF9fVEVYVCxfX2NzdHJpbmcgZm9yCisgIC8vLyBleGFtcGxlKS4KKyAgdmlydHVhbCBib29sIGlzU2VjdGlvbkF0b21pemFibGVCeVN5bWJvbHMoY29uc3QgTUNTZWN0aW9uICZTZWN0aW9uKSBjb25zdDsKKworICB2aXJ0dWFsIGNvbnN0IE1DRXhwciAqZ2V0RXhwckZvclBlcnNvbmFsaXR5U3ltYm9sKGNvbnN0IE1DU3ltYm9sICpTeW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTdHJlYW1lciAmU3RyZWFtZXIpIGNvbnN0OworCisgIHZpcnR1YWwgY29uc3QgTUNFeHByICpnZXRFeHByRm9yRkRFU3ltYm9sKGNvbnN0IE1DU3ltYm9sICpTeW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1N0cmVhbWVyICZTdHJlYW1lcikgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBpZGVudGlmaWVyIFxwIE5hbWUgZG9lcyBub3QgbmVlZCBxdW90ZXMgdG8gYmUKKyAgLy8vIHN5bnRhY3RpY2FsbHkgY29ycmVjdC4KKyAgdmlydHVhbCBib29sIGlzVmFsaWRVbnF1b3RlZE5hbWUoU3RyaW5nUmVmIE5hbWUpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgLnNlY3Rpb24gZGlyZWN0aXZlIHNob3VsZCBiZSBvbWl0dGVkIHdoZW4KKyAgLy8vIGVtaXR0aW5nIFxwIFNlY3Rpb25OYW1lLiAgRm9yIGV4YW1wbGU6CisgIC8vLworICAvLy8gc2hvdWxkT21pdFNlY3Rpb25EaXJlY3RpdmUoIi50ZXh0IikKKyAgLy8vCisgIC8vLyByZXR1cm5zIGZhbHNlID0+IC5zZWN0aW9uIC50ZXh0LCNhbGxvYywjZXhlY2luc3RyCisgIC8vLyByZXR1cm5zIHRydWUgID0+IC50ZXh0CisgIHZpcnR1YWwgYm9vbCBzaG91bGRPbWl0U2VjdGlvbkRpcmVjdGl2ZShTdHJpbmdSZWYgU2VjdGlvbk5hbWUpIGNvbnN0OworCisgIGJvb2wgdXNlc1N1blN0eWxlRUxGU2VjdGlvblN3aXRjaFN5bnRheCgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3VuU3R5bGVFTEZTZWN0aW9uU3dpdGNoU3ludGF4OworICB9CisKKyAgYm9vbCB1c2VzRUxGU2VjdGlvbkRpcmVjdGl2ZUZvckJTUygpIGNvbnN0IHsKKyAgICByZXR1cm4gVXNlc0VMRlNlY3Rpb25EaXJlY3RpdmVGb3JCU1M7CisgIH0KKworICBib29sIG5lZWRzRHdhcmZTZWN0aW9uT2Zmc2V0RGlyZWN0aXZlKCkgY29uc3QgeworICAgIHJldHVybiBOZWVkc0R3YXJmU2VjdGlvbk9mZnNldERpcmVjdGl2ZTsKKyAgfQorCisgIC8vIEFjY2Vzc29ycy4KKworICBib29sIGhhc01hY2hvWmVyb0ZpbGxEaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBIYXNNYWNob1plcm9GaWxsRGlyZWN0aXZlOyB9CisgIGJvb2wgaGFzTWFjaG9UQlNTRGlyZWN0aXZlKCkgY29uc3QgeyByZXR1cm4gSGFzTWFjaG9UQlNTRGlyZWN0aXZlOyB9CisgIHVuc2lnbmVkIGdldE1heEluc3RMZW5ndGgoKSBjb25zdCB7IHJldHVybiBNYXhJbnN0TGVuZ3RoOyB9CisgIHVuc2lnbmVkIGdldE1pbkluc3RBbGlnbm1lbnQoKSBjb25zdCB7IHJldHVybiBNaW5JbnN0QWxpZ25tZW50OyB9CisgIGJvb2wgZ2V0RG9sbGFySXNQQygpIGNvbnN0IHsgcmV0dXJuIERvbGxhcklzUEM7IH0KKyAgY29uc3QgY2hhciAqZ2V0U2VwYXJhdG9yU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gU2VwYXJhdG9yU3RyaW5nOyB9CisKKyAgLy8vIFRoaXMgaW5kaWNhdGVzIHRoZSBjb2x1bW4gKHplcm8tYmFzZWQpIGF0IHdoaWNoIGFzbSBjb21tZW50cyBzaG91bGQgYmUKKyAgLy8vIHByaW50ZWQuCisgIHVuc2lnbmVkIGdldENvbW1lbnRDb2x1bW4oKSBjb25zdCB7IHJldHVybiA0MDsgfQorCisgIFN0cmluZ1JlZiBnZXRDb21tZW50U3RyaW5nKCkgY29uc3QgeyByZXR1cm4gQ29tbWVudFN0cmluZzsgfQorICBjb25zdCBjaGFyICpnZXRMYWJlbFN1ZmZpeCgpIGNvbnN0IHsgcmV0dXJuIExhYmVsU3VmZml4OyB9CisKKyAgYm9vbCB1c2VBc3NpZ25tZW50Rm9yRUhCZWdpbigpIGNvbnN0IHsgcmV0dXJuIFVzZUFzc2lnbm1lbnRGb3JFSEJlZ2luOyB9CisgIGJvb2wgbmVlZHNMb2NhbEZvclNpemUoKSBjb25zdCB7IHJldHVybiBOZWVkc0xvY2FsRm9yU2l6ZTsgfQorICBTdHJpbmdSZWYgZ2V0UHJpdmF0ZUdsb2JhbFByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIFByaXZhdGVHbG9iYWxQcmVmaXg7IH0KKyAgU3RyaW5nUmVmIGdldFByaXZhdGVMYWJlbFByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIFByaXZhdGVMYWJlbFByZWZpeDsgfQorCisgIGJvb2wgaGFzTGlua2VyUHJpdmF0ZUdsb2JhbFByZWZpeCgpIGNvbnN0IHsKKyAgICByZXR1cm4gTGlua2VyUHJpdmF0ZUdsb2JhbFByZWZpeFswXSAhPSAnXDAnOworICB9CisKKyAgU3RyaW5nUmVmIGdldExpbmtlclByaXZhdGVHbG9iYWxQcmVmaXgoKSBjb25zdCB7CisgICAgaWYgKGhhc0xpbmtlclByaXZhdGVHbG9iYWxQcmVmaXgoKSkKKyAgICAgIHJldHVybiBMaW5rZXJQcml2YXRlR2xvYmFsUHJlZml4OworICAgIHJldHVybiBnZXRQcml2YXRlR2xvYmFsUHJlZml4KCk7CisgIH0KKworICBjb25zdCBjaGFyICpnZXRJbmxpbmVBc21TdGFydCgpIGNvbnN0IHsgcmV0dXJuIElubGluZUFzbVN0YXJ0OyB9CisgIGNvbnN0IGNoYXIgKmdldElubGluZUFzbUVuZCgpIGNvbnN0IHsgcmV0dXJuIElubGluZUFzbUVuZDsgfQorICBjb25zdCBjaGFyICpnZXRDb2RlMTZEaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBDb2RlMTZEaXJlY3RpdmU7IH0KKyAgY29uc3QgY2hhciAqZ2V0Q29kZTMyRGlyZWN0aXZlKCkgY29uc3QgeyByZXR1cm4gQ29kZTMyRGlyZWN0aXZlOyB9CisgIGNvbnN0IGNoYXIgKmdldENvZGU2NERpcmVjdGl2ZSgpIGNvbnN0IHsgcmV0dXJuIENvZGU2NERpcmVjdGl2ZTsgfQorICB1bnNpZ25lZCBnZXRBc3NlbWJsZXJEaWFsZWN0KCkgY29uc3QgeyByZXR1cm4gQXNzZW1ibGVyRGlhbGVjdDsgfQorICBib29sIGRvZXNBbGxvd0F0SW5OYW1lKCkgY29uc3QgeyByZXR1cm4gQWxsb3dBdEluTmFtZTsgfQorICBib29sIHN1cHBvcnRzTmFtZVF1b3RpbmcoKSBjb25zdCB7IHJldHVybiBTdXBwb3J0c1F1b3RlZE5hbWVzOyB9CisKKyAgYm9vbCBkb2VzU3VwcG9ydERhdGFSZWdpb25EaXJlY3RpdmVzKCkgY29uc3QgeworICAgIHJldHVybiBVc2VEYXRhUmVnaW9uRGlyZWN0aXZlczsKKyAgfQorCisgIGNvbnN0IGNoYXIgKmdldFplcm9EaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBaZXJvRGlyZWN0aXZlOyB9CisgIGNvbnN0IGNoYXIgKmdldEFzY2lpRGlyZWN0aXZlKCkgY29uc3QgeyByZXR1cm4gQXNjaWlEaXJlY3RpdmU7IH0KKyAgY29uc3QgY2hhciAqZ2V0QXNjaXpEaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBBc2NpekRpcmVjdGl2ZTsgfQorICBib29sIGdldEFsaWdubWVudElzSW5CeXRlcygpIGNvbnN0IHsgcmV0dXJuIEFsaWdubWVudElzSW5CeXRlczsgfQorICB1bnNpZ25lZCBnZXRUZXh0QWxpZ25GaWxsVmFsdWUoKSBjb25zdCB7IHJldHVybiBUZXh0QWxpZ25GaWxsVmFsdWU7IH0KKyAgY29uc3QgY2hhciAqZ2V0R2xvYmFsRGlyZWN0aXZlKCkgY29uc3QgeyByZXR1cm4gR2xvYmFsRGlyZWN0aXZlOyB9CisKKyAgYm9vbCBkb2VzU2V0RGlyZWN0aXZlU3VwcHJlc3NSZWxvYygpIGNvbnN0IHsKKyAgICByZXR1cm4gU2V0RGlyZWN0aXZlU3VwcHJlc3Nlc1JlbG9jOworICB9CisKKyAgYm9vbCBoYXNBZ2dyZXNzaXZlU3ltYm9sRm9sZGluZygpIGNvbnN0IHsgcmV0dXJuIEhhc0FnZ3Jlc3NpdmVTeW1ib2xGb2xkaW5nOyB9CisKKyAgYm9vbCBnZXRDT01NRGlyZWN0aXZlQWxpZ25tZW50SXNJbkJ5dGVzKCkgY29uc3QgeworICAgIHJldHVybiBDT01NRGlyZWN0aXZlQWxpZ25tZW50SXNJbkJ5dGVzOworICB9CisKKyAgTENPTU06OkxDT01NVHlwZSBnZXRMQ09NTURpcmVjdGl2ZUFsaWdubWVudFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIExDT01NRGlyZWN0aXZlQWxpZ25tZW50VHlwZTsKKyAgfQorCisgIGJvb2wgaGFzRnVuY3Rpb25BbGlnbm1lbnQoKSBjb25zdCB7IHJldHVybiBIYXNGdW5jdGlvbkFsaWdubWVudDsgfQorICBib29sIGhhc0RvdFR5cGVEb3RTaXplRGlyZWN0aXZlKCkgY29uc3QgeyByZXR1cm4gSGFzRG90VHlwZURvdFNpemVEaXJlY3RpdmU7IH0KKyAgYm9vbCBoYXNTaW5nbGVQYXJhbWV0ZXJEb3RGaWxlKCkgY29uc3QgeyByZXR1cm4gSGFzU2luZ2xlUGFyYW1ldGVyRG90RmlsZTsgfQorICBib29sIGhhc0lkZW50RGlyZWN0aXZlKCkgY29uc3QgeyByZXR1cm4gSGFzSWRlbnREaXJlY3RpdmU7IH0KKyAgYm9vbCBoYXNOb0RlYWRTdHJpcCgpIGNvbnN0IHsgcmV0dXJuIEhhc05vRGVhZFN0cmlwOyB9CisgIGJvb2wgaGFzQWx0RW50cnkoKSBjb25zdCB7IHJldHVybiBIYXNBbHRFbnRyeTsgfQorICBjb25zdCBjaGFyICpnZXRXZWFrRGlyZWN0aXZlKCkgY29uc3QgeyByZXR1cm4gV2Vha0RpcmVjdGl2ZTsgfQorICBjb25zdCBjaGFyICpnZXRXZWFrUmVmRGlyZWN0aXZlKCkgY29uc3QgeyByZXR1cm4gV2Vha1JlZkRpcmVjdGl2ZTsgfQorICBib29sIGhhc1dlYWtEZWZEaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBIYXNXZWFrRGVmRGlyZWN0aXZlOyB9CisKKyAgYm9vbCBoYXNXZWFrRGVmQ2FuQmVIaWRkZW5EaXJlY3RpdmUoKSBjb25zdCB7CisgICAgcmV0dXJuIEhhc1dlYWtEZWZDYW5CZUhpZGRlbkRpcmVjdGl2ZTsKKyAgfQorCisgIGJvb2wgaGFzTGlua09uY2VEaXJlY3RpdmUoKSBjb25zdCB7IHJldHVybiBIYXNMaW5rT25jZURpcmVjdGl2ZTsgfQorCisgIE1DU3ltYm9sQXR0ciBnZXRIaWRkZW5WaXNpYmlsaXR5QXR0cigpIGNvbnN0IHsgcmV0dXJuIEhpZGRlblZpc2liaWxpdHlBdHRyOyB9CisKKyAgTUNTeW1ib2xBdHRyIGdldEhpZGRlbkRlY2xhcmF0aW9uVmlzaWJpbGl0eUF0dHIoKSBjb25zdCB7CisgICAgcmV0dXJuIEhpZGRlbkRlY2xhcmF0aW9uVmlzaWJpbGl0eUF0dHI7CisgIH0KKworICBNQ1N5bWJvbEF0dHIgZ2V0UHJvdGVjdGVkVmlzaWJpbGl0eUF0dHIoKSBjb25zdCB7CisgICAgcmV0dXJuIFByb3RlY3RlZFZpc2liaWxpdHlBdHRyOworICB9CisKKyAgYm9vbCBkb2VzU3VwcG9ydERlYnVnSW5mb3JtYXRpb24oKSBjb25zdCB7IHJldHVybiBTdXBwb3J0c0RlYnVnSW5mb3JtYXRpb247IH0KKworICBib29sIGRvZXNTdXBwb3J0RXhjZXB0aW9uSGFuZGxpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIEV4Y2VwdGlvbnNUeXBlICE9IEV4Y2VwdGlvbkhhbmRsaW5nOjpOb25lOworICB9CisKKyAgRXhjZXB0aW9uSGFuZGxpbmcgZ2V0RXhjZXB0aW9uSGFuZGxpbmdUeXBlKCkgY29uc3QgeyByZXR1cm4gRXhjZXB0aW9uc1R5cGU7IH0KKyAgV2luRUg6OkVuY29kaW5nVHlwZSBnZXRXaW5FSEVuY29kaW5nVHlwZSgpIGNvbnN0IHsgcmV0dXJuIFdpbkVIRW5jb2RpbmdUeXBlOyB9CisKKyAgdm9pZCBzZXRFeGNlcHRpb25zVHlwZShFeGNlcHRpb25IYW5kbGluZyBFSCkgeworICAgIEV4Y2VwdGlvbnNUeXBlID0gRUg7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBleGNlcHRpb24gaGFuZGxpbmcgbWV0aG9kIGZvciB0aGUgcGxhdGZvcm0gdXNlcyBjYWxsCisgIC8vLyBmcmFtZSBpbmZvcm1hdGlvbiB0byB1bndpbmQuCisgIGJvb2wgdXNlc0NGSUZvckVIKCkgY29uc3QgeworICAgIHJldHVybiAoRXhjZXB0aW9uc1R5cGUgPT0gRXhjZXB0aW9uSGFuZGxpbmc6OkR3YXJmQ0ZJIHx8CisgICAgICAgICAgICBFeGNlcHRpb25zVHlwZSA9PSBFeGNlcHRpb25IYW5kbGluZzo6QVJNIHx8IHVzZXNXaW5kb3dzQ0ZJKCkpOworICB9CisKKyAgYm9vbCB1c2VzV2luZG93c0NGSSgpIGNvbnN0IHsKKyAgICByZXR1cm4gRXhjZXB0aW9uc1R5cGUgPT0gRXhjZXB0aW9uSGFuZGxpbmc6OldpbkVIICYmCisgICAgICAgICAgIChXaW5FSEVuY29kaW5nVHlwZSAhPSBXaW5FSDo6RW5jb2RpbmdUeXBlOjpJbnZhbGlkICYmCisgICAgICAgICAgICBXaW5FSEVuY29kaW5nVHlwZSAhPSBXaW5FSDo6RW5jb2RpbmdUeXBlOjpYODYpOworICB9CisKKyAgYm9vbCBkb2VzRHdhcmZVc2VSZWxvY2F0aW9uc0Fjcm9zc1NlY3Rpb25zKCkgY29uc3QgeworICAgIHJldHVybiBEd2FyZlVzZXNSZWxvY2F0aW9uc0Fjcm9zc1NlY3Rpb25zOworICB9CisKKyAgYm9vbCBkb0R3YXJmRkRFU3ltYm9sc1VzZUFic0RpZmYoKSBjb25zdCB7IHJldHVybiBEd2FyZkZERVN5bWJvbHNVc2VBYnNEaWZmOyB9CisgIGJvb2wgdXNlRHdhcmZSZWdOdW1Gb3JDRkkoKSBjb25zdCB7IHJldHVybiBEd2FyZlJlZ051bUZvckNGSTsgfQorICBib29sIHVzZVBhcmVuc0ZvclN5bWJvbFZhcmlhbnQoKSBjb25zdCB7IHJldHVybiBVc2VQYXJlbnNGb3JTeW1ib2xWYXJpYW50OyB9CisKKyAgdm9pZCBhZGRJbml0aWFsRnJhbWVTdGF0ZShjb25zdCBNQ0NGSUluc3RydWN0aW9uICZJbnN0KSB7CisgICAgSW5pdGlhbEZyYW1lU3RhdGUucHVzaF9iYWNrKEluc3QpOworICB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8TUNDRklJbnN0cnVjdGlvbj4gJmdldEluaXRpYWxGcmFtZVN0YXRlKCkgY29uc3QgeworICAgIHJldHVybiBJbml0aWFsRnJhbWVTdGF0ZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhc3NlbWJseSAoaW5saW5lIG9yIG90aGVyd2lzZSkgc2hvdWxkIGJlIHBhcnNlZC4KKyAgYm9vbCB1c2VJbnRlZ3JhdGVkQXNzZW1ibGVyKCkgY29uc3QgeyByZXR1cm4gVXNlSW50ZWdyYXRlZEFzc2VtYmxlcjsgfQorCisgIC8vLyBTZXQgd2hldGhlciBhc3NlbWJseSAoaW5saW5lIG9yIG90aGVyd2lzZSkgc2hvdWxkIGJlIHBhcnNlZC4KKyAgdmlydHVhbCB2b2lkIHNldFVzZUludGVncmF0ZWRBc3NlbWJsZXIoYm9vbCBWYWx1ZSkgeworICAgIFVzZUludGVncmF0ZWRBc3NlbWJsZXIgPSBWYWx1ZTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhc3NlbWJseSAoaW5saW5lIG9yIG90aGVyd2lzZSkgc2hvdWxkIGJlIHBhcnNlZC4KKyAgYm9vbCBwcmVzZXJ2ZUFzbUNvbW1lbnRzKCkgY29uc3QgeyByZXR1cm4gUHJlc2VydmVBc21Db21tZW50czsgfQorCisgIC8vLyBTZXQgd2hldGhlciBhc3NlbWJseSAoaW5saW5lIG9yIG90aGVyd2lzZSkgc2hvdWxkIGJlIHBhcnNlZC4KKyAgdmlydHVhbCB2b2lkIHNldFByZXNlcnZlQXNtQ29tbWVudHMoYm9vbCBWYWx1ZSkgeworICAgIFByZXNlcnZlQXNtQ29tbWVudHMgPSBWYWx1ZTsKKyAgfQorCisgIERlYnVnQ29tcHJlc3Npb25UeXBlIGNvbXByZXNzRGVidWdTZWN0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29tcHJlc3NEZWJ1Z1NlY3Rpb25zOworICB9CisKKyAgdm9pZCBzZXRDb21wcmVzc0RlYnVnU2VjdGlvbnMoRGVidWdDb21wcmVzc2lvblR5cGUgQ29tcHJlc3NEZWJ1Z1NlY3Rpb25zKSB7CisgICAgdGhpcy0+Q29tcHJlc3NEZWJ1Z1NlY3Rpb25zID0gQ29tcHJlc3NEZWJ1Z1NlY3Rpb25zOworICB9CisKKyAgYm9vbCBzaG91bGRVc2VMb2dpY2FsU2hyKCkgY29uc3QgeyByZXR1cm4gVXNlTG9naWNhbFNocjsgfQorCisgIGJvb2wgY2FuUmVsYXhSZWxvY2F0aW9ucygpIGNvbnN0IHsgcmV0dXJuIFJlbGF4RUxGUmVsb2NhdGlvbnM7IH0KKyAgdm9pZCBzZXRSZWxheEVMRlJlbG9jYXRpb25zKGJvb2wgVikgeyBSZWxheEVMRlJlbG9jYXRpb25zID0gVjsgfQorICBib29sIGhhc01pcHNFeHByZXNzaW9ucygpIGNvbnN0IHsgcmV0dXJuIEhhc01pcHNFeHByZXNzaW9uczsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNBU01JTkZPX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNBc21JbmZvQ09GRi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0FzbUluZm9DT0ZGLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFjOGFlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNBc21JbmZvQ09GRi5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vPT09LSBNQ0FzbUluZm9DT0ZGLmggLSBDT0ZGIGFzbSBwcm9wZXJ0aWVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0FTTUlORk9DT0ZGX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0FTTUlORk9DT0ZGX0gKKworI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNBc21JbmZvQ09GRiA6IHB1YmxpYyBNQ0FzbUluZm8geworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3Byb3RlY3RlZDoKKyAgZXhwbGljaXQgTUNBc21JbmZvQ09GRigpOworfTsKKworY2xhc3MgTUNBc21JbmZvTWljcm9zb2Z0IDogcHVibGljIE1DQXNtSW5mb0NPRkYgeworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IE1DQXNtSW5mb01pY3Jvc29mdCgpOworfTsKKworY2xhc3MgTUNBc21JbmZvR05VQ09GRiA6IHB1YmxpYyBNQ0FzbUluZm9DT0ZGIHsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICBleHBsaWNpdCBNQ0FzbUluZm9HTlVDT0ZGKCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ0FTTUlORk9DT0ZGX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNBc21JbmZvRGFyd2luLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQXNtSW5mb0Rhcndpbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1MzNkNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQXNtSW5mb0Rhcndpbi5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vPT09LSBNQ0FzbUluZm9EYXJ3aW4uaCAtIERhcndpbiBhc20gcHJvcGVydGllcyAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGFyZ2V0IGFzbSBwcm9wZXJ0aWVzIHJlbGF0ZWQgd2hhdCBmb3JtIGFzbSBzdGF0ZW1lbnRzCisvLyBzaG91bGQgdGFrZSBpbiBnZW5lcmFsIG9uIERhcndpbi1iYXNlZCB0YXJnZXRzCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DQVNNSU5GT0RBUldJTl9ICisjZGVmaW5lIExMVk1fTUNfTUNBU01JTkZPREFSV0lOX0gKKworI2luY2x1ZGUgImxsdm0vTUMvTUNBc21JbmZvLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNBc21JbmZvRGFyd2luIDogcHVibGljIE1DQXNtSW5mbyB7CitwdWJsaWM6CisgIGV4cGxpY2l0IE1DQXNtSW5mb0RhcndpbigpOworCisgIGJvb2wgaXNTZWN0aW9uQXRvbWl6YWJsZUJ5U3ltYm9scyhjb25zdCBNQ1NlY3Rpb24gJlNlY3Rpb24pIGNvbnN0IG92ZXJyaWRlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNBU01JTkZPREFSV0lOX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNBc21JbmZvRUxGLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQXNtSW5mb0VMRi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMTNhZmMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQXNtSW5mb0VMRi5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vPT09LSBsbHZtL01DL01DQXNtSW5mb0VMRi5oIC0gRUxGIEFzbSBpbmZvIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0FTTUlORk9FTEZfSAorI2RlZmluZSBMTFZNX01DX01DQVNNSU5GT0VMRl9ICisKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DQXNtSW5mb0VMRiA6IHB1YmxpYyBNQ0FzbUluZm8geworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisgIE1DU2VjdGlvbiAqZ2V0Tm9uZXhlY3V0YWJsZVN0YWNrU2VjdGlvbihNQ0NvbnRleHQgJkN0eCkgY29uc3QgZmluYWw7CisKK3Byb3RlY3RlZDoKKyAgLy8vIFRhcmdldHMgd2hpY2ggaGF2ZSBub24tZXhlY3V0YWJsZSBzdGFja3MgYnkgZGVmYXVsdCBjYW4gc2V0IHRoaXMgdG8gZmFsc2UKKyAgLy8vIHRvIGRpc2FibGUgdGhlIHNwZWNpYWwgc2VjdGlvbiB3aGljaCByZXF1ZXN0cyBhIG5vbi1leGVjdXRhYmxlIHN0YWNrLgorICBib29sIFVzZXNOb25leGVjdXRhYmxlU3RhY2tTZWN0aW9uID0gdHJ1ZTsKKworICBNQ0FzbUluZm9FTEYoKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DQVNNSU5GT0VMRl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQXNtSW5mb1dhc20uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNBc21JbmZvV2FzbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjNDZjZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQXNtSW5mb1dhc20uaApAQCAtMCwwICsxLDI0IEBACisvLz09PS0tIGxsdm0vTUMvTUNBc21JbmZvV2FzbS5oIC0gV2FzbSBBc20gaW5mbyAtLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNBU01JTkZPV0FTTV9ICisjZGVmaW5lIExMVk1fTUNfTUNBU01JTkZPV0FTTV9ICisKKyNpbmNsdWRlICJsbHZtL01DL01DQXNtSW5mby5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNQ0FzbUluZm9XYXNtIDogcHVibGljIE1DQXNtSW5mbyB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHJvdGVjdGVkOgorICBNQ0FzbUluZm9XYXNtKCk7Cit9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNBc21MYXlvdXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNBc21MYXlvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjIwZDViCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0FzbUxheW91dC5oCkBAIC0wLDAgKzEsMTA3IEBACisvLz09PS0gTUNBc21MYXlvdXQuaCAtIEFzc2VtYmx5IExheW91dCBPYmplY3QgLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNBU01MQVlPVVRfSAorI2RlZmluZSBMTFZNX01DX01DQVNNTEFZT1VUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTUNBc3NlbWJsZXI7CitjbGFzcyBNQ0ZyYWdtZW50OworY2xhc3MgTUNTZWN0aW9uOworY2xhc3MgTUNTeW1ib2w7CisKKy8vLyBFbmNhcHN1bGF0ZXMgdGhlIGxheW91dCBvZiBhbiBhc3NlbWJseSBmaWxlIGF0IGEgcGFydGljdWxhciBwb2ludCBpbiB0aW1lLgorLy8vCisvLy8gQXNzZW1ibHkgbWF5IHJlcXVpcmUgY29tcHV0aW5nIG11bHRpcGxlIGxheW91dHMgZm9yIGEgcGFydGljdWxhciBhc3NlbWJseQorLy8vIGZpbGUgYXMgcGFydCBvZiB0aGUgcmVsYXhhdGlvbiBwcm9jZXNzLiBUaGlzIGNsYXNzIGVuY2Fwc3VsYXRlcyB0aGUgbGF5b3V0CisvLy8gYXQgYSBzaW5nbGUgcG9pbnQgaW4gdGltZSBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgaXMgYWx3YXlzIHBvc3NpYmxlIHRvCisvLy8gZWZmaWNpZW50bHkgY29tcHV0ZSB0aGUgZXhhY3QgYWRkcmVzcyBvZiBhbnkgc3ltYm9sIGluIHRoZSBhc3NlbWJseSBmaWxlLAorLy8vIGV2ZW4gZHVyaW5nIHRoZSByZWxheGF0aW9uIHByb2Nlc3MuCitjbGFzcyBNQ0FzbUxheW91dCB7CisgIE1DQXNzZW1ibGVyICZBc3NlbWJsZXI7CisKKyAgLy8vIExpc3Qgb2Ygc2VjdGlvbnMgaW4gbGF5b3V0IG9yZGVyLgorICBsbHZtOjpTbWFsbFZlY3RvcjxNQ1NlY3Rpb24gKiwgMTY+IFNlY3Rpb25PcmRlcjsKKworICAvLy8gVGhlIGxhc3QgZnJhZ21lbnQgd2hpY2ggd2FzIGxhaWQgb3V0LCBvciAwIGlmIG5vdGhpbmcgaGFzIGJlZW4gbGFpZAorICAvLy8gb3V0LiBGcmFnbWVudHMgYXJlIGFsd2F5cyBsYWlkIG91dCBpbiBvcmRlciwgc28gYWxsIGZyYWdtZW50cyB3aXRoIGEKKyAgLy8vIGxvd2VyIG9yZGluYWwgd2lsbCBiZSB2YWxpZC4KKyAgbXV0YWJsZSBEZW5zZU1hcDxjb25zdCBNQ1NlY3Rpb24gKiwgTUNGcmFnbWVudCAqPiBMYXN0VmFsaWRGcmFnbWVudDsKKworICAvLy8gXGJyaWVmIE1ha2Ugc3VyZSB0aGF0IHRoZSBsYXlvdXQgZm9yIHRoZSBnaXZlbiBmcmFnbWVudCBpcyB2YWxpZCwgbGF6aWx5CisgIC8vLyBjb21wdXRpbmcgaXQgaWYgbmVjZXNzYXJ5LgorICB2b2lkIGVuc3VyZVZhbGlkKGNvbnN0IE1DRnJhZ21lbnQgKkYpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgSXMgdGhlIGxheW91dCBmb3IgdGhpcyBmcmFnbWVudCB2YWxpZD8KKyAgYm9vbCBpc0ZyYWdtZW50VmFsaWQoY29uc3QgTUNGcmFnbWVudCAqRikgY29uc3Q7CisKK3B1YmxpYzoKKyAgTUNBc21MYXlvdXQoTUNBc3NlbWJsZXIgJkFzc2VtYmxlcik7CisKKyAgLy8vIEdldCB0aGUgYXNzZW1ibGVyIG9iamVjdCB0aGlzIGlzIGEgbGF5b3V0IGZvci4KKyAgTUNBc3NlbWJsZXIgJmdldEFzc2VtYmxlcigpIGNvbnN0IHsgcmV0dXJuIEFzc2VtYmxlcjsgfQorCisgIC8vLyBcYnJpZWYgSW52YWxpZGF0ZSB0aGUgZnJhZ21lbnRzIHN0YXJ0aW5nIHdpdGggRiBiZWNhdXNlIGl0IGhhcyBiZWVuCisgIC8vLyByZXNpemVkLiBUaGUgZnJhZ21lbnQncyBzaXplIHNob3VsZCBoYXZlIGFscmVhZHkgYmVlbiB1cGRhdGVkLCBidXQKKyAgLy8vIGl0cyBidW5kbGUgcGFkZGluZyB3aWxsIGJlIHJlY29tcHV0ZWQuCisgIHZvaWQgaW52YWxpZGF0ZUZyYWdtZW50c0Zyb20oTUNGcmFnbWVudCAqRik7CisKKyAgLy8vIFxicmllZiBQZXJmb3JtIGxheW91dCBmb3IgYSBzaW5nbGUgZnJhZ21lbnQsIGFzc3VtaW5nIHRoYXQgdGhlIHByZXZpb3VzCisgIC8vLyBmcmFnbWVudCBoYXMgYWxyZWFkeSBiZWVuIGxhaWQgb3V0IGNvcnJlY3RseSwgYW5kIHRoZSBwYXJlbnQgc2VjdGlvbiBoYXMKKyAgLy8vIGJlZW4gaW5pdGlhbGl6ZWQuCisgIHZvaWQgbGF5b3V0RnJhZ21lbnQoTUNGcmFnbWVudCAqRnJhZ21lbnQpOworCisgIC8vLyBcbmFtZSBTZWN0aW9uIEFjY2VzcyAoaW4gbGF5b3V0IG9yZGVyKQorICAvLy8gQHsKKworICBsbHZtOjpTbWFsbFZlY3RvckltcGw8TUNTZWN0aW9uICo+ICZnZXRTZWN0aW9uT3JkZXIoKSB7IHJldHVybiBTZWN0aW9uT3JkZXI7IH0KKyAgY29uc3QgbGx2bTo6U21hbGxWZWN0b3JJbXBsPE1DU2VjdGlvbiAqPiAmZ2V0U2VjdGlvbk9yZGVyKCkgY29uc3QgeworICAgIHJldHVybiBTZWN0aW9uT3JkZXI7CisgIH0KKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIEZyYWdtZW50IExheW91dCBEYXRhCisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBvZmZzZXQgb2YgdGhlIGdpdmVuIGZyYWdtZW50IGluc2lkZSBpdHMgY29udGFpbmluZyBzZWN0aW9uLgorICB1aW50NjRfdCBnZXRGcmFnbWVudE9mZnNldChjb25zdCBNQ0ZyYWdtZW50ICpGKSBjb25zdDsKKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIFV0aWxpdHkgRnVuY3Rpb25zCisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBhZGRyZXNzIHNwYWNlIHNpemUgb2YgdGhlIGdpdmVuIHNlY3Rpb24sIGFzIGl0IGVmZmVjdHMKKyAgLy8vIGxheW91dC4gVGhpcyBtYXkgZGlmZmVyIGZyb20gdGhlIHNpemUgcmVwb3J0ZWQgYnkgXHNlZSBnZXRTZWN0aW9uU2l6ZSgpIGJ5CisgIC8vLyBub3QgaW5jbHVkaW5nIHNlY3Rpb24gdGFpbCBwYWRkaW5nLgorICB1aW50NjRfdCBnZXRTZWN0aW9uQWRkcmVzc1NpemUoY29uc3QgTUNTZWN0aW9uICpTZWMpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBkYXRhIHNpemUgb2YgdGhlIGdpdmVuIHNlY3Rpb24sIGFzIGVtaXR0ZWQgdG8gdGhlIG9iamVjdAorICAvLy8gZmlsZS4gVGhpcyBtYXkgaW5jbHVkZSBhZGRpdGlvbmFsIHBhZGRpbmcsIG9yIGJlIDAgZm9yIHZpcnR1YWwgc2VjdGlvbnMuCisgIHVpbnQ2NF90IGdldFNlY3Rpb25GaWxlU2l6ZShjb25zdCBNQ1NlY3Rpb24gKlNlYykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG9mZnNldCBvZiB0aGUgZ2l2ZW4gc3ltYm9sLCBhcyBjb21wdXRlZCBpbiB0aGUgY3VycmVudAorICAvLy8gbGF5b3V0LgorICAvLy8gXHJldHVybiBUcnVlIG9uIHN1Y2Nlc3MuCisgIGJvb2wgZ2V0U3ltYm9sT2Zmc2V0KGNvbnN0IE1DU3ltYm9sICZTLCB1aW50NjRfdCAmVmFsKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFZhcmlhbnQgdGhhdCByZXBvcnRzIGEgZmF0YWwgZXJyb3IgaWYgdGhlIG9mZnNldCBpcyBub3QgY29tcHV0YWJsZS4KKyAgdWludDY0X3QgZ2V0U3ltYm9sT2Zmc2V0KGNvbnN0IE1DU3ltYm9sICZTKSBjb25zdDsKKworICAvLy8gXGJyaWVmIElmIHRoaXMgc3ltYm9sIGlzIGVxdWl2YWxlbnQgdG8gQSArIENvbnN0YW50LCByZXR1cm4gQS4KKyAgY29uc3QgTUNTeW1ib2wgKmdldEJhc2VTeW1ib2woY29uc3QgTUNTeW1ib2wgJlN5bWJvbCkgY29uc3Q7CisKKyAgLy8vIEB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNBc21NYWNyby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0FzbU1hY3JvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDliMzJjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNBc21NYWNyby5oCkBAIC0wLDAgKzEsMTU4IEBACisvLz09PS0gTUNBc21NYWNyby5oIC0gQXNzZW1ibHkgTWFjcm9zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNBU01NQUNST19ICisjZGVmaW5lIExMVk1fTUNfTUNBU01NQUNST19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TTUxvYy5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gVGFyZ2V0IGluZGVwZW5kZW50IHJlcHJlc2VudGF0aW9uIGZvciBhbiBhc3NlbWJsZXIgdG9rZW4uCitjbGFzcyBBc21Ub2tlbiB7CitwdWJsaWM6CisgIGVudW0gVG9rZW5LaW5kIHsKKyAgICAvLyBNYXJrZXJzCisgICAgRW9mLCBFcnJvciwKKworICAgIC8vIFN0cmluZyB2YWx1ZXMuCisgICAgSWRlbnRpZmllciwKKyAgICBTdHJpbmcsCisKKyAgICAvLyBJbnRlZ2VyIHZhbHVlcy4KKyAgICBJbnRlZ2VyLAorICAgIEJpZ051bSwgLy8gbGFyZ2VyIHRoYW4gNjQgYml0cworCisgICAgLy8gUmVhbCB2YWx1ZXMuCisgICAgUmVhbCwKKworICAgIC8vIENvbW1lbnRzCisgICAgQ29tbWVudCwKKyAgICBIYXNoRGlyZWN0aXZlLAorICAgIC8vIE5vLXZhbHVlLgorICAgIEVuZE9mU3RhdGVtZW50LAorICAgIENvbG9uLAorICAgIFNwYWNlLAorICAgIFBsdXMsIE1pbnVzLCBUaWxkZSwKKyAgICBTbGFzaCwgICAgIC8vICcvJworICAgIEJhY2tTbGFzaCwgLy8gJ1wnCisgICAgTFBhcmVuLCBSUGFyZW4sIExCcmFjLCBSQnJhYywgTEN1cmx5LCBSQ3VybHksCisgICAgU3RhciwgRG90LCBDb21tYSwgRG9sbGFyLCBFcXVhbCwgRXF1YWxFcXVhbCwKKworICAgIFBpcGUsIFBpcGVQaXBlLCBDYXJldCwKKyAgICBBbXAsIEFtcEFtcCwgRXhjbGFpbSwgRXhjbGFpbUVxdWFsLCBQZXJjZW50LCBIYXNoLAorICAgIExlc3MsIExlc3NFcXVhbCwgTGVzc0xlc3MsIExlc3NHcmVhdGVyLAorICAgIEdyZWF0ZXIsIEdyZWF0ZXJFcXVhbCwgR3JlYXRlckdyZWF0ZXIsIEF0LAorCisgICAgLy8gTUlQUyB1bmFyeSBleHByZXNzaW9uIG9wZXJhdG9ycyBzdWNoIGFzICVuZWcuCisgICAgUGVyY2VudENhbGwxNiwgUGVyY2VudENhbGxfSGksIFBlcmNlbnRDYWxsX0xvLCBQZXJjZW50RHRwcmVsX0hpLAorICAgIFBlcmNlbnREdHByZWxfTG8sIFBlcmNlbnRHb3QsIFBlcmNlbnRHb3RfRGlzcCwgUGVyY2VudEdvdF9IaSwgUGVyY2VudEdvdF9MbywKKyAgICBQZXJjZW50R290X09mc3QsIFBlcmNlbnRHb3RfUGFnZSwgUGVyY2VudEdvdHRwcmVsLCBQZXJjZW50R3BfUmVsLCBQZXJjZW50SGksCisgICAgUGVyY2VudEhpZ2hlciwgUGVyY2VudEhpZ2hlc3QsIFBlcmNlbnRMbywgUGVyY2VudE5lZywgUGVyY2VudFBjcmVsX0hpLAorICAgIFBlcmNlbnRQY3JlbF9MbywgUGVyY2VudFRsc2dkLCBQZXJjZW50VGxzbGRtLCBQZXJjZW50VHByZWxfSGksCisgICAgUGVyY2VudFRwcmVsX0xvCisgIH07CisKK3ByaXZhdGU6CisgIFRva2VuS2luZCBLaW5kOworCisgIC8vLyBBIHJlZmVyZW5jZSB0byB0aGUgZW50aXJlIHRva2VuIGNvbnRlbnRzOyB0aGlzIGlzIGFsd2F5cyBhIHBvaW50ZXIgaW50bworICAvLy8gYSBtZW1vcnkgYnVmZmVyIG93bmVkIGJ5IHRoZSBzb3VyY2UgbWFuYWdlci4KKyAgU3RyaW5nUmVmIFN0cjsKKworICBBUEludCBJbnRWYWw7CisKK3B1YmxpYzoKKyAgQXNtVG9rZW4oKSA9IGRlZmF1bHQ7CisgIEFzbVRva2VuKFRva2VuS2luZCBLaW5kLCBTdHJpbmdSZWYgU3RyLCBBUEludCBJbnRWYWwpCisgICAgICA6IEtpbmQoS2luZCksIFN0cihTdHIpLCBJbnRWYWwoc3RkOjptb3ZlKEludFZhbCkpIHt9CisgIEFzbVRva2VuKFRva2VuS2luZCBLaW5kLCBTdHJpbmdSZWYgU3RyLCBpbnQ2NF90IEludFZhbCA9IDApCisgICAgICA6IEtpbmQoS2luZCksIFN0cihTdHIpLCBJbnRWYWwoNjQsIEludFZhbCwgdHJ1ZSkge30KKworICBUb2tlbktpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKyAgYm9vbCBpcyhUb2tlbktpbmQgSykgY29uc3QgeyByZXR1cm4gS2luZCA9PSBLOyB9CisgIGJvb2wgaXNOb3QoVG9rZW5LaW5kIEspIGNvbnN0IHsgcmV0dXJuIEtpbmQgIT0gSzsgfQorCisgIFNNTG9jIGdldExvYygpIGNvbnN0OworICBTTUxvYyBnZXRFbmRMb2MoKSBjb25zdDsKKyAgU01SYW5nZSBnZXRMb2NSYW5nZSgpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIGNvbnRlbnRzIG9mIGEgc3RyaW5nIHRva2VuICh3aXRob3V0IHF1b3RlcykuCisgIFN0cmluZ1JlZiBnZXRTdHJpbmdDb250ZW50cygpIGNvbnN0IHsKKyAgICBhc3NlcnQoS2luZCA9PSBTdHJpbmcgJiYgIlRoaXMgdG9rZW4gaXNuJ3QgYSBzdHJpbmchIik7CisgICAgcmV0dXJuIFN0ci5zbGljZSgxLCBTdHIuc2l6ZSgpIC0gMSk7CisgIH0KKworICAvLy8gR2V0IHRoZSBpZGVudGlmaWVyIHN0cmluZyBmb3IgdGhlIGN1cnJlbnQgdG9rZW4sIHdoaWNoIHNob3VsZCBiZSBhbgorICAvLy8gaWRlbnRpZmllciBvciBhIHN0cmluZy4gVGhpcyBnZXRzIHRoZSBwb3J0aW9uIG9mIHRoZSBzdHJpbmcgd2hpY2ggc2hvdWxkCisgIC8vLyBiZSB1c2VkIGFzIHRoZSBpZGVudGlmaWVyLCBlLmcuLCBpdCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBxdW90ZXMgb24KKyAgLy8vIHN0cmluZ3MuCisgIFN0cmluZ1JlZiBnZXRJZGVudGlmaWVyKCkgY29uc3QgeworICAgIGlmIChLaW5kID09IElkZW50aWZpZXIpCisgICAgICByZXR1cm4gZ2V0U3RyaW5nKCk7CisgICAgcmV0dXJuIGdldFN0cmluZ0NvbnRlbnRzKCk7CisgIH0KKworICAvLy8gR2V0IHRoZSBzdHJpbmcgZm9yIHRoZSBjdXJyZW50IHRva2VuLCB0aGlzIGluY2x1ZGVzIGFsbCBjaGFyYWN0ZXJzIChmb3IKKyAgLy8vIGV4YW1wbGUsIHRoZSBxdW90ZXMgb24gc3RyaW5ncykgaW4gdGhlIHRva2VuLgorICAvLy8KKyAgLy8vIFRoZSByZXR1cm5lZCBTdHJpbmdSZWYgcG9pbnRzIGludG8gdGhlIHNvdXJjZSBtYW5hZ2VyJ3MgbWVtb3J5IGJ1ZmZlciwgYW5kCisgIC8vLyBpcyBzYWZlIHRvIHN0b3JlIGFjcm9zcyBjYWxscyB0byBMZXgoKS4KKyAgU3RyaW5nUmVmIGdldFN0cmluZygpIGNvbnN0IHsgcmV0dXJuIFN0cjsgfQorCisgIC8vIEZJWE1FOiBEb24ndCBjb21wdXRlIHRoaXMgaW4gYWR2YW5jZSwgaXQgbWFrZXMgZXZlcnkgdG9rZW4gbGFyZ2VyLCBhbmQgaXMKKyAgLy8gYWxzbyBub3QgZ2VuZXJhbGx5IHdoYXQgd2Ugd2FudCAoaXQgaXMgbmljZXIgZm9yIHJlY292ZXJ5IGV0Yy4gdG8gbGV4IDEyM2JyCisgIC8vIGFzIGEgc2luZ2xlIHRva2VuLCB0aGVuIGRpYWdub3NlIGFzIGFuIGludmFsaWQgbnVtYmVyKS4KKyAgaW50NjRfdCBnZXRJbnRWYWwoKSBjb25zdCB7CisgICAgYXNzZXJ0KEtpbmQgPT0gSW50ZWdlciAmJiAiVGhpcyB0b2tlbiBpc24ndCBhbiBpbnRlZ2VyISIpOworICAgIHJldHVybiBJbnRWYWwuZ2V0WkV4dFZhbHVlKCk7CisgIH0KKworICBBUEludCBnZXRBUEludFZhbCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoKEtpbmQgPT0gSW50ZWdlciB8fCBLaW5kID09IEJpZ051bSkgJiYKKyAgICAgICAgICAgIlRoaXMgdG9rZW4gaXNuJ3QgYW4gaW50ZWdlciEiKTsKKyAgICByZXR1cm4gSW50VmFsOworICB9CisKKyAgdm9pZCBkdW1wKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0IHsgZHVtcChkYmdzKCkpOyB9Cit9OworCitzdHJ1Y3QgTUNBc21NYWNyb1BhcmFtZXRlciB7CisgIFN0cmluZ1JlZiBOYW1lOworICBzdGQ6OnZlY3RvcjxBc21Ub2tlbj4gVmFsdWU7CisgIGJvb2wgUmVxdWlyZWQgPSBmYWxzZTsKKyAgYm9vbCBWYXJhcmcgPSBmYWxzZTsKKworICBNQ0FzbU1hY3JvUGFyYW1ldGVyKCkgPSBkZWZhdWx0OworCisgIHZvaWQgZHVtcCgpIGNvbnN0IHsgZHVtcChkYmdzKCkpOyB9CisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworfTsKKwordHlwZWRlZiBzdGQ6OnZlY3RvcjxNQ0FzbU1hY3JvUGFyYW1ldGVyPiBNQ0FzbU1hY3JvUGFyYW1ldGVyczsKK3N0cnVjdCBNQ0FzbU1hY3JvIHsKKyAgU3RyaW5nUmVmIE5hbWU7CisgIFN0cmluZ1JlZiBCb2R5OworICBNQ0FzbU1hY3JvUGFyYW1ldGVycyBQYXJhbWV0ZXJzOworCitwdWJsaWM6CisgIE1DQXNtTWFjcm8oU3RyaW5nUmVmIE4sIFN0cmluZ1JlZiBCLCBNQ0FzbU1hY3JvUGFyYW1ldGVycyBQKQorICAgICAgOiBOYW1lKE4pLCBCb2R5KEIpLCBQYXJhbWV0ZXJzKHN0ZDo6bW92ZShQKSkge30KKworICB2b2lkIGR1bXAoKSBjb25zdCB7IGR1bXAoZGJncygpKTsgfQorICB2b2lkIGR1bXAocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKK307Cit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0Fzc2VtYmxlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0Fzc2VtYmxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5MWIwNDQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQXNzZW1ibGVyLmgKQEAgLTAsMCArMSw0NDUgQEAKKy8vPT09LSBNQ0Fzc2VtYmxlci5oIC0gT2JqZWN0IEZpbGUgR2VuZXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0FTU0VNQkxFUl9ICisjZGVmaW5lIExMVk1fTUNfTUNBU1NFTUJMRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9NYWNoTy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNEaXJlY3RpdmVzLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0R3YXJmLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0ZpeHVwLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0ZyYWdtZW50LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0xpbmtlck9wdGltaXphdGlvbkhpbnQuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3ltYm9sLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DQXNtQmFja2VuZDsKK2NsYXNzIE1DQXNtTGF5b3V0OworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNDb2RlRW1pdHRlcjsKK2NsYXNzIE1DRnJhZ21lbnQ7CitjbGFzcyBNQ09iamVjdFdyaXRlcjsKK2NsYXNzIE1DU2VjdGlvbjsKK2NsYXNzIE1DVmFsdWU7CisKKy8vIEZJWE1FOiBUaGlzIHJlYWxseSBkb2Vzbid0IGJlbG9uZyBoZXJlLiBTZWUgY29tbWVudHMgYmVsb3cuCitzdHJ1Y3QgSW5kaXJlY3RTeW1ib2xEYXRhIHsKKyAgTUNTeW1ib2wgKlN5bWJvbDsKKyAgTUNTZWN0aW9uICpTZWN0aW9uOworfTsKKworLy8gRklYTUU6IERpdHRvIHRoaXMuIFB1cmVseSBzbyB0aGUgU3RyZWFtZXIgYW5kIHRoZSBPYmplY3RXcml0ZXIgY2FuIHRhbGsKKy8vIHRvIG9uZSBhbm90aGVyLgorc3RydWN0IERhdGFSZWdpb25EYXRhIHsKKyAgLy8gVGhpcyBlbnVtIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgdy8gdGhlIG1hY2gtbyBkZWZpbml0aW9uIGluCisgIC8vIGxsdm0vT2JqZWN0L01hY2hPRm9ybWF0LmguCisgIGVudW0gS2luZFR5IHsgRGF0YSA9IDEsIEp1bXBUYWJsZTgsIEp1bXBUYWJsZTE2LCBKdW1wVGFibGUzMiB9IEtpbmQ7CisgIE1DU3ltYm9sICpTdGFydDsKKyAgTUNTeW1ib2wgKkVuZDsKK307CisKK2NsYXNzIE1DQXNzZW1ibGVyIHsKKyAgZnJpZW5kIGNsYXNzIE1DQXNtTGF5b3V0OworCitwdWJsaWM6CisgIHVzaW5nIFNlY3Rpb25MaXN0VHlwZSA9IHN0ZDo6dmVjdG9yPE1DU2VjdGlvbiAqPjsKKyAgdXNpbmcgU3ltYm9sRGF0YUxpc3RUeXBlID0gc3RkOjp2ZWN0b3I8Y29uc3QgTUNTeW1ib2wgKj47CisKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBwb2ludGVlX2l0ZXJhdG9yPFNlY3Rpb25MaXN0VHlwZTo6Y29uc3RfaXRlcmF0b3I+OworICB1c2luZyBpdGVyYXRvciA9IHBvaW50ZWVfaXRlcmF0b3I8U2VjdGlvbkxpc3RUeXBlOjppdGVyYXRvcj47CisKKyAgdXNpbmcgY29uc3Rfc3ltYm9sX2l0ZXJhdG9yID0KKyAgICAgIHBvaW50ZWVfaXRlcmF0b3I8U3ltYm9sRGF0YUxpc3RUeXBlOjpjb25zdF9pdGVyYXRvcj47CisgIHVzaW5nIHN5bWJvbF9pdGVyYXRvciA9IHBvaW50ZWVfaXRlcmF0b3I8U3ltYm9sRGF0YUxpc3RUeXBlOjppdGVyYXRvcj47CisKKyAgdXNpbmcgc3ltYm9sX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8c3ltYm9sX2l0ZXJhdG9yPjsKKyAgdXNpbmcgY29uc3Rfc3ltYm9sX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8Y29uc3Rfc3ltYm9sX2l0ZXJhdG9yPjsKKworICB1c2luZyBjb25zdF9pbmRpcmVjdF9zeW1ib2xfaXRlcmF0b3IgPQorICAgICAgc3RkOjp2ZWN0b3I8SW5kaXJlY3RTeW1ib2xEYXRhPjo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIGluZGlyZWN0X3N5bWJvbF9pdGVyYXRvciA9IHN0ZDo6dmVjdG9yPEluZGlyZWN0U3ltYm9sRGF0YT46Oml0ZXJhdG9yOworCisgIHVzaW5nIGNvbnN0X2RhdGFfcmVnaW9uX2l0ZXJhdG9yID0KKyAgICAgIHN0ZDo6dmVjdG9yPERhdGFSZWdpb25EYXRhPjo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIGRhdGFfcmVnaW9uX2l0ZXJhdG9yID0gc3RkOjp2ZWN0b3I8RGF0YVJlZ2lvbkRhdGE+OjppdGVyYXRvcjsKKworICAvLy8gTWFjaE8gc3BlY2lmaWMgZGVwbG95bWVudCB0YXJnZXQgdmVyc2lvbiBpbmZvLgorICAvLyBBIE1ham9yIHZlcnNpb24gb2YgMCBpbmRpY2F0ZXMgdGhhdCBubyB2ZXJzaW9uIGluZm9ybWF0aW9uIHdhcyBzdXBwbGllZAorICAvLyBhbmQgc28gdGhlIGNvcnJlc3BvbmRpbmcgbG9hZCBjb21tYW5kIHNob3VsZCBub3QgYmUgZW1pdHRlZC4KKyAgdXNpbmcgVmVyc2lvbkluZm9UeXBlID0gc3RydWN0IHsKKyAgICBib29sIEVtaXRCdWlsZFZlcnNpb247CisgICAgdW5pb24geworICAgICAgTUNWZXJzaW9uTWluVHlwZSBUeXBlOyAgICAgICAgICAvLy88IFVzZWQgd2hlbiBFbWl0QnVpbGRWZXJzaW9uPT1mYWxzZS4KKyAgICAgIE1hY2hPOjpQbGF0Zm9ybVR5cGUgUGxhdGZvcm07ICAgLy8vPCBVc2VkIHdoZW4gRW1pdEJ1aWxkVmVyc2lvbj09dHJ1ZS4KKyAgICB9IFR5cGVPclBsYXRmb3JtOworICAgIHVuc2lnbmVkIE1ham9yOworICAgIHVuc2lnbmVkIE1pbm9yOworICAgIHVuc2lnbmVkIFVwZGF0ZTsKKyAgfTsKKworcHJpdmF0ZToKKyAgTUNDb250ZXh0ICZDb250ZXh0OworCisgIE1DQXNtQmFja2VuZCAmQmFja2VuZDsKKworICBNQ0NvZGVFbWl0dGVyICZFbWl0dGVyOworCisgIE1DT2JqZWN0V3JpdGVyICZXcml0ZXI7CisKKyAgU2VjdGlvbkxpc3RUeXBlIFNlY3Rpb25zOworCisgIFN5bWJvbERhdGFMaXN0VHlwZSBTeW1ib2xzOworCisgIHN0ZDo6dmVjdG9yPEluZGlyZWN0U3ltYm9sRGF0YT4gSW5kaXJlY3RTeW1ib2xzOworCisgIHN0ZDo6dmVjdG9yPERhdGFSZWdpb25EYXRhPiBEYXRhUmVnaW9uczsKKworICAvLy8gVGhlIGxpc3Qgb2YgbGlua2VyIG9wdGlvbnMgdG8gcHJvcGFnYXRlIGludG8gdGhlIG9iamVjdCBmaWxlLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4+IExpbmtlck9wdGlvbnM7CisKKyAgLy8vIExpc3Qgb2YgZGVjbGFyZWQgZmlsZSBuYW1lcworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gRmlsZU5hbWVzOworCisgIE1DRHdhcmZMaW5lVGFibGVQYXJhbXMgTFRQYXJhbXM7CisKKyAgLy8vIFRoZSBzZXQgb2YgZnVuY3Rpb24gc3ltYm9scyBmb3Igd2hpY2ggYSAudGh1bWJfZnVuYyBkaXJlY3RpdmUgaGFzCisgIC8vLyBiZWVuIHNlZW4uCisgIC8vCisgIC8vIEZJWE1FOiBXZSByZWFsbHkgd291bGQgbGlrZSB0aGlzIGluIHRhcmdldCBzcGVjaWZpYyBjb2RlIHJhdGhlciB0aGFuCisgIC8vIGhlcmUuIE1heWJlIHdoZW4gdGhlIHJlbG9jYXRpb24gc3R1ZmYgbW92ZXMgdG8gdGFyZ2V0IHNwZWNpZmljLAorICAvLyB0aGlzIGNhbiBnbyB3aXRoIGl0PyBUaGUgc3RyZWFtZXIgd291bGQgbmVlZCBzb21lIHRhcmdldCBzcGVjaWZpYworICAvLyByZWZhY3RvcmluZyB0b28uCisgIG11dGFibGUgU21hbGxQdHJTZXQ8Y29uc3QgTUNTeW1ib2wgKiwgMzI+IFRodW1iRnVuY3M7CisKKyAgLy8vIFxicmllZiBUaGUgYnVuZGxlIGFsaWdubWVudCBzaXplIGN1cnJlbnRseSBzZXQgaW4gdGhlIGFzc2VtYmxlci4KKyAgLy8vCisgIC8vLyBCeSBkZWZhdWx0IGl0J3MgMCwgd2hpY2ggbWVhbnMgYnVuZGxpbmcgaXMgZGlzYWJsZWQuCisgIHVuc2lnbmVkIEJ1bmRsZUFsaWduU2l6ZTsKKworICBib29sIFJlbGF4QWxsIDogMTsKKyAgYm9vbCBTdWJzZWN0aW9uc1ZpYVN5bWJvbHMgOiAxOworICBib29sIEluY3JlbWVudGFsTGlua2VyQ29tcGF0aWJsZSA6IDE7CisKKyAgLy8vIEVMRiBzcGVjaWZpYyBlX2hlYWRlciBmbGFncworICAvLyBJdCB3b3VsZCBiZSBnb29kIGlmIHRoZXJlIHdlcmUgYW4gTUNFTEZBc3NlbWJsZXIgY2xhc3MgdG8gaG9sZCB0aGlzLgorICAvLyBFTEYgaGVhZGVyIGZsYWdzIGFyZSB1c2VkIGJvdGggYnkgdGhlIGludGVncmF0ZWQgYW5kIHN0YW5kYWxvbmUgYXNzZW1ibGVycy4KKyAgLy8gQWNjZXNzIHRvIHRoZSBmbGFncyBpcyBuZWNlc3NhcnkgaW4gY2FzZXMgd2hlcmUgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgYWZmZWN0CisgIC8vIHdoaWNoIGZsYWdzIHRvIGJlIHNldC4KKyAgdW5zaWduZWQgRUxGSGVhZGVyRUZsYWdzOworCisgIC8vLyBVc2VkIHRvIGNvbW11bmljYXRlIExpbmtlciBPcHRpbWl6YXRpb24gSGludCBpbmZvcm1hdGlvbiBiZXR3ZWVuCisgIC8vLyB0aGUgU3RyZWFtZXIgYW5kIHRoZSAubyB3cml0ZXIKKyAgTUNMT0hDb250YWluZXIgTE9IQ29udGFpbmVyOworCisgIFZlcnNpb25JbmZvVHlwZSBWZXJzaW9uSW5mbzsKKworICAvLy8gRXZhbHVhdGUgYSBmaXh1cCB0byBhIHJlbG9jYXRhYmxlIGV4cHJlc3Npb24gYW5kIHRoZSB2YWx1ZSB3aGljaCBzaG91bGQgYmUKKyAgLy8vIHBsYWNlZCBpbnRvIHRoZSBmaXh1cC4KKyAgLy8vCisgIC8vLyBccGFyYW0gTGF5b3V0IFRoZSBsYXlvdXQgdG8gdXNlIGZvciBldmFsdWF0aW9uLgorICAvLy8gXHBhcmFtIEZpeHVwIFRoZSBmaXh1cCB0byBldmFsdWF0ZS4KKyAgLy8vIFxwYXJhbSBERiBUaGUgZnJhZ21lbnQgdGhlIGZpeHVwIGlzIGluc2lkZS4KKyAgLy8vIFxwYXJhbSBUYXJnZXQgW291dF0gT24gcmV0dXJuLCB0aGUgcmVsb2NhdGFibGUgZXhwcmVzc2lvbiB0aGUgZml4dXAKKyAgLy8vIGV2YWx1YXRlcyB0by4KKyAgLy8vIFxwYXJhbSBWYWx1ZSBbb3V0XSBPbiByZXR1cm4sIHRoZSB2YWx1ZSBvZiB0aGUgZml4dXAgYXMgY3VycmVudGx5IGxhaWQKKyAgLy8vIG91dC4KKyAgLy8vIFxyZXR1cm4gV2hldGhlciB0aGUgZml4dXAgdmFsdWUgd2FzIGZ1bGx5IHJlc29sdmVkLiBUaGlzIGlzIHRydWUgaWYgdGhlCisgIC8vLyBccCBWYWx1ZSByZXN1bHQgaXMgZml4ZWQsIG90aGVyd2lzZSB0aGUgdmFsdWUgbWF5IGNoYW5nZSBkdWUgdG8KKyAgLy8vIHJlbG9jYXRpb24uCisgIGJvb2wgZXZhbHVhdGVGaXh1cChjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0LCBjb25zdCBNQ0ZpeHVwICZGaXh1cCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRnJhZ21lbnQgKkRGLCBNQ1ZhbHVlICZUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAmVmFsdWUpIGNvbnN0OworCisgIC8vLyBDaGVjayB3aGV0aGVyIGEgZml4dXAgY2FuIGJlIHNhdGlzZmllZCwgb3Igd2hldGhlciBpdCBuZWVkcyB0byBiZSByZWxheGVkCisgIC8vLyAoaW5jcmVhc2VkIGluIHNpemUsIGluIG9yZGVyIHRvIGhvbGQgaXRzIHZhbHVlIGNvcnJlY3RseSkuCisgIGJvb2wgZml4dXBOZWVkc1JlbGF4YXRpb24oY29uc3QgTUNGaXh1cCAmRml4dXAsIGNvbnN0IE1DUmVsYXhhYmxlRnJhZ21lbnQgKkRGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQpIGNvbnN0OworCisgIC8vLyBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBmcmFnbWVudCBuZWVkcyByZWxheGF0aW9uLgorICBib29sIGZyYWdtZW50TmVlZHNSZWxheGF0aW9uKGNvbnN0IE1DUmVsYXhhYmxlRnJhZ21lbnQgKklGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUGVyZm9ybSBvbmUgbGF5b3V0IGl0ZXJhdGlvbiBhbmQgcmV0dXJuIHRydWUgaWYgYW55IG9mZnNldHMKKyAgLy8vIHdlcmUgYWRqdXN0ZWQuCisgIGJvb2wgbGF5b3V0T25jZShNQ0FzbUxheW91dCAmTGF5b3V0KTsKKworICAvLy8gXGJyaWVmIFBlcmZvcm0gb25lIGxheW91dCBpdGVyYXRpb24gb2YgdGhlIGdpdmVuIHNlY3Rpb24gYW5kIHJldHVybiB0cnVlCisgIC8vLyBpZiBhbnkgb2Zmc2V0cyB3ZXJlIGFkanVzdGVkLgorICBib29sIGxheW91dFNlY3Rpb25PbmNlKE1DQXNtTGF5b3V0ICZMYXlvdXQsIE1DU2VjdGlvbiAmU2VjKTsKKworICBib29sIHJlbGF4SW5zdHJ1Y3Rpb24oTUNBc21MYXlvdXQgJkxheW91dCwgTUNSZWxheGFibGVGcmFnbWVudCAmSUYpOworCisgIGJvb2wgcmVsYXhQYWRkaW5nRnJhZ21lbnQoTUNBc21MYXlvdXQgJkxheW91dCwgTUNQYWRkaW5nRnJhZ21lbnQgJlBGKTsKKworICBib29sIHJlbGF4TEVCKE1DQXNtTGF5b3V0ICZMYXlvdXQsIE1DTEVCRnJhZ21lbnQgJklGKTsKKworICBib29sIHJlbGF4RHdhcmZMaW5lQWRkcihNQ0FzbUxheW91dCAmTGF5b3V0LCBNQ0R3YXJmTGluZUFkZHJGcmFnbWVudCAmREYpOworICBib29sIHJlbGF4RHdhcmZDYWxsRnJhbWVGcmFnbWVudChNQ0FzbUxheW91dCAmTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0R3YXJmQ2FsbEZyYW1lRnJhZ21lbnQgJkRGKTsKKyAgYm9vbCByZWxheENWSW5saW5lTGluZVRhYmxlKE1DQXNtTGF5b3V0ICZMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NWSW5saW5lTGluZVRhYmxlRnJhZ21lbnQgJkRGKTsKKyAgYm9vbCByZWxheENWRGVmUmFuZ2UoTUNBc21MYXlvdXQgJkxheW91dCwgTUNDVkRlZlJhbmdlRnJhZ21lbnQgJkRGKTsKKworICAvLy8gZmluaXNoTGF5b3V0IC0gRmluYWxpemUgYSBsYXlvdXQsIGluY2x1ZGluZyBmcmFnbWVudCBsb3dlcmluZy4KKyAgdm9pZCBmaW5pc2hMYXlvdXQoTUNBc21MYXlvdXQgJkxheW91dCk7CisKKyAgc3RkOjp0dXBsZTxNQ1ZhbHVlLCB1aW50NjRfdCwgYm9vbD4KKyAgaGFuZGxlRml4dXAoY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCwgTUNGcmFnbWVudCAmRiwgY29uc3QgTUNGaXh1cCAmRml4dXApOworCitwdWJsaWM6CisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxTdHJpbmdSZWYsIGNvbnN0IE1DU3ltYm9sICo+PiBTeW12ZXJzOworCisgIC8vLyBDb25zdHJ1Y3QgYSBuZXcgYXNzZW1ibGVyIGluc3RhbmNlLgorICAvLworICAvLyBGSVhNRTogSG93IGFyZSB3ZSBnb2luZyB0byBwYXJhbWV0ZXJpemUgdGhpcz8gVHdvIG9idmlvdXMgb3B0aW9ucyBhcmUgc3RheQorICAvLyBjb25jcmV0ZSBhbmQgcmVxdWlyZSBjbGllbnRzIHRvIHBhc3MgaW4gYSB0YXJnZXQgbGlrZSBvYmplY3QuIFRoZSBvdGhlcgorICAvLyBvcHRpb24gaXMgdG8gbWFrZSB0aGlzIGFic3RyYWN0LCBhbmQgaGF2ZSB0YXJnZXRzIHByb3ZpZGUgY29uY3JldGUKKyAgLy8gaW1wbGVtZW50YXRpb25zIGFzIHdlIGRvIHdpdGggQXNtUGFyc2VyLgorICBNQ0Fzc2VtYmxlcihNQ0NvbnRleHQgJkNvbnRleHQsIE1DQXNtQmFja2VuZCAmQmFja2VuZCwKKyAgICAgICAgICAgICAgTUNDb2RlRW1pdHRlciAmRW1pdHRlciwgTUNPYmplY3RXcml0ZXIgJldyaXRlcik7CisgIE1DQXNzZW1ibGVyKGNvbnN0IE1DQXNzZW1ibGVyICYpID0gZGVsZXRlOworICBNQ0Fzc2VtYmxlciAmb3BlcmF0b3I9KGNvbnN0IE1DQXNzZW1ibGVyICYpID0gZGVsZXRlOworICB+TUNBc3NlbWJsZXIoKTsKKworICAvLy8gQ29tcHV0ZSB0aGUgZWZmZWN0aXZlIGZyYWdtZW50IHNpemUgYXNzdW1pbmcgaXQgaXMgbGFpZCBvdXQgYXQgdGhlIGdpdmVuCisgIC8vLyBccCBTZWN0aW9uQWRkcmVzcyBhbmQgXHAgRnJhZ21lbnRPZmZzZXQuCisgIHVpbnQ2NF90IGNvbXB1dGVGcmFnbWVudFNpemUoY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0ZyYWdtZW50ICZGKSBjb25zdDsKKworICAvLy8gRmluZCB0aGUgc3ltYm9sIHdoaWNoIGRlZmluZXMgdGhlIGF0b20gY29udGFpbmluZyB0aGUgZ2l2ZW4gc3ltYm9sLCBvcgorICAvLy8gbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIHN5bWJvbC4KKyAgY29uc3QgTUNTeW1ib2wgKmdldEF0b20oY29uc3QgTUNTeW1ib2wgJlMpIGNvbnN0OworCisgIC8vLyBDaGVjayB3aGV0aGVyIGEgcGFydGljdWxhciBzeW1ib2wgaXMgdmlzaWJsZSB0byB0aGUgbGlua2VyIGFuZCBpcyByZXF1aXJlZAorICAvLy8gaW4gdGhlIHN5bWJvbCB0YWJsZSwgb3Igd2hldGhlciBpdCBjYW4gYmUgZGlzY2FyZGVkIGJ5IHRoZSBhc3NlbWJsZXIuIFRoaXMKKyAgLy8vIGFsc28gZWZmZWN0cyB3aGV0aGVyIHRoZSBhc3NlbWJsZXIgdHJlYXRzIHRoZSBsYWJlbCBhcyBwb3RlbnRpYWxseQorICAvLy8gZGVmaW5pbmcgYSBzZXBhcmF0ZSBhdG9tLgorICBib29sIGlzU3ltYm9sTGlua2VyVmlzaWJsZShjb25zdCBNQ1N5bWJvbCAmU0QpIGNvbnN0OworCisgIC8vLyBFbWl0IHRoZSBzZWN0aW9uIGNvbnRlbnRzIHVzaW5nIHRoZSBnaXZlbiBvYmplY3Qgd3JpdGVyLgorICB2b2lkIHdyaXRlU2VjdGlvbkRhdGEoY29uc3QgTUNTZWN0aW9uICpTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCkgY29uc3Q7CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgYSBnaXZlbiBzeW1ib2wgaGFzIGJlZW4gZmxhZ2dlZCB3aXRoIC50aHVtYl9mdW5jLgorICBib29sIGlzVGh1bWJGdW5jKGNvbnN0IE1DU3ltYm9sICpGdW5jKSBjb25zdDsKKworICAvLy8gRmxhZyBhIGZ1bmN0aW9uIHN5bWJvbCBhcyB0aGUgdGFyZ2V0IG9mIGEgLnRodW1iX2Z1bmMgZGlyZWN0aXZlLgorICB2b2lkIHNldElzVGh1bWJGdW5jKGNvbnN0IE1DU3ltYm9sICpGdW5jKSB7IFRodW1iRnVuY3MuaW5zZXJ0KEZ1bmMpOyB9CisKKyAgLy8vIEVMRiBlX2hlYWRlciBmbGFncworICB1bnNpZ25lZCBnZXRFTEZIZWFkZXJFRmxhZ3MoKSBjb25zdCB7IHJldHVybiBFTEZIZWFkZXJFRmxhZ3M7IH0KKyAgdm9pZCBzZXRFTEZIZWFkZXJFRmxhZ3ModW5zaWduZWQgRmxhZ3MpIHsgRUxGSGVhZGVyRUZsYWdzID0gRmxhZ3M7IH0KKworICAvLy8gTWFjaE8gZGVwbG95bWVudCB0YXJnZXQgdmVyc2lvbiBpbmZvcm1hdGlvbi4KKyAgY29uc3QgVmVyc2lvbkluZm9UeXBlICZnZXRWZXJzaW9uSW5mbygpIGNvbnN0IHsgcmV0dXJuIFZlcnNpb25JbmZvOyB9CisgIHZvaWQgc2V0VmVyc2lvbk1pbihNQ1ZlcnNpb25NaW5UeXBlIFR5cGUsIHVuc2lnbmVkIE1ham9yLCB1bnNpZ25lZCBNaW5vciwKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFVwZGF0ZSkgeworICAgIFZlcnNpb25JbmZvLkVtaXRCdWlsZFZlcnNpb24gPSBmYWxzZTsKKyAgICBWZXJzaW9uSW5mby5UeXBlT3JQbGF0Zm9ybS5UeXBlID0gVHlwZTsKKyAgICBWZXJzaW9uSW5mby5NYWpvciA9IE1ham9yOworICAgIFZlcnNpb25JbmZvLk1pbm9yID0gTWlub3I7CisgICAgVmVyc2lvbkluZm8uVXBkYXRlID0gVXBkYXRlOworICB9CisgIHZvaWQgc2V0QnVpbGRWZXJzaW9uKE1hY2hPOjpQbGF0Zm9ybVR5cGUgUGxhdGZvcm0sIHVuc2lnbmVkIE1ham9yLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNaW5vciwgdW5zaWduZWQgVXBkYXRlKSB7CisgICAgVmVyc2lvbkluZm8uRW1pdEJ1aWxkVmVyc2lvbiA9IHRydWU7CisgICAgVmVyc2lvbkluZm8uVHlwZU9yUGxhdGZvcm0uUGxhdGZvcm0gPSBQbGF0Zm9ybTsKKyAgICBWZXJzaW9uSW5mby5NYWpvciA9IE1ham9yOworICAgIFZlcnNpb25JbmZvLk1pbm9yID0gTWlub3I7CisgICAgVmVyc2lvbkluZm8uVXBkYXRlID0gVXBkYXRlOworICB9CisKKyAgLy8vIFJldXNlIGFuIGFzc2VtYmxlciBpbnN0YW5jZQorICAvLy8KKyAgdm9pZCByZXNldCgpOworCisgIE1DQ29udGV4dCAmZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIENvbnRleHQ7IH0KKworICBNQ0FzbUJhY2tlbmQgJmdldEJhY2tlbmQoKSBjb25zdCB7IHJldHVybiBCYWNrZW5kOyB9CisKKyAgTUNDb2RlRW1pdHRlciAmZ2V0RW1pdHRlcigpIGNvbnN0IHsgcmV0dXJuIEVtaXR0ZXI7IH0KKworICBNQ09iamVjdFdyaXRlciAmZ2V0V3JpdGVyKCkgY29uc3QgeyByZXR1cm4gV3JpdGVyOyB9CisKKyAgTUNEd2FyZkxpbmVUYWJsZVBhcmFtcyBnZXREV0FSRkxpbmV0YWJsZVBhcmFtcygpIGNvbnN0IHsgcmV0dXJuIExUUGFyYW1zOyB9CisgIHZvaWQgc2V0RFdBUkZMaW5ldGFibGVQYXJhbXMoTUNEd2FyZkxpbmVUYWJsZVBhcmFtcyBQKSB7IExUUGFyYW1zID0gUDsgfQorCisgIC8vLyBGaW5pc2ggLSBEbyBmaW5hbCBwcm9jZXNzaW5nIGFuZCB3cml0ZSB0aGUgb2JqZWN0IHRvIHRoZSBvdXRwdXQgc3RyZWFtLgorICAvLy8gXHAgV3JpdGVyIGlzIHVzZWQgZm9yIGN1c3RvbSBvYmplY3Qgd3JpdGVyIChhcyB0aGUgTUNKSVQgZG9lcyksCisgIC8vLyBpZiBub3Qgc3BlY2lmaWVkIGl0IGlzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBmcm9tIGJhY2tlbmQuCisgIHZvaWQgRmluaXNoKCk7CisKKyAgLy8gTGF5b3V0IGFsbCBzZWN0aW9uIGFuZCBwcmVwYXJlIHRoZW0gZm9yIGVtaXNzaW9uLgorICB2b2lkIGxheW91dChNQ0FzbUxheW91dCAmTGF5b3V0KTsKKworICAvLyBGSVhNRTogVGhpcyBkb2VzIG5vdCBiZWxvbmcgaGVyZS4KKyAgYm9vbCBnZXRTdWJzZWN0aW9uc1ZpYVN5bWJvbHMoKSBjb25zdCB7IHJldHVybiBTdWJzZWN0aW9uc1ZpYVN5bWJvbHM7IH0KKyAgdm9pZCBzZXRTdWJzZWN0aW9uc1ZpYVN5bWJvbHMoYm9vbCBWYWx1ZSkgeyBTdWJzZWN0aW9uc1ZpYVN5bWJvbHMgPSBWYWx1ZTsgfQorCisgIGJvb2wgaXNJbmNyZW1lbnRhbExpbmtlckNvbXBhdGlibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIEluY3JlbWVudGFsTGlua2VyQ29tcGF0aWJsZTsKKyAgfQorICB2b2lkIHNldEluY3JlbWVudGFsTGlua2VyQ29tcGF0aWJsZShib29sIFZhbHVlKSB7CisgICAgSW5jcmVtZW50YWxMaW5rZXJDb21wYXRpYmxlID0gVmFsdWU7CisgIH0KKworICBib29sIGdldFJlbGF4QWxsKCkgY29uc3QgeyByZXR1cm4gUmVsYXhBbGw7IH0KKyAgdm9pZCBzZXRSZWxheEFsbChib29sIFZhbHVlKSB7IFJlbGF4QWxsID0gVmFsdWU7IH0KKworICBib29sIGlzQnVuZGxpbmdFbmFibGVkKCkgY29uc3QgeyByZXR1cm4gQnVuZGxlQWxpZ25TaXplICE9IDA7IH0KKworICB1bnNpZ25lZCBnZXRCdW5kbGVBbGlnblNpemUoKSBjb25zdCB7IHJldHVybiBCdW5kbGVBbGlnblNpemU7IH0KKworICB2b2lkIHNldEJ1bmRsZUFsaWduU2l6ZSh1bnNpZ25lZCBTaXplKSB7CisgICAgYXNzZXJ0KChTaXplID09IDAgfHwgIShTaXplICYgKFNpemUgLSAxKSkpICYmCisgICAgICAgICAgICJFeHBlY3QgYSBwb3dlci1vZi10d28gYnVuZGxlIGFsaWduIHNpemUiKTsKKyAgICBCdW5kbGVBbGlnblNpemUgPSBTaXplOworICB9CisKKyAgLy8vIFxuYW1lIFNlY3Rpb24gTGlzdCBBY2Nlc3MKKyAgLy8vIEB7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBTZWN0aW9ucy5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gU2VjdGlvbnMuYmVnaW4oKTsgfQorCisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIFNlY3Rpb25zLmVuZCgpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIFNlY3Rpb25zLmVuZCgpOyB9CisKKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBTZWN0aW9ucy5zaXplKCk7IH0KKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIFN5bWJvbCBMaXN0IEFjY2VzcworICAvLy8gQHsKKyAgc3ltYm9sX2l0ZXJhdG9yIHN5bWJvbF9iZWdpbigpIHsgcmV0dXJuIFN5bWJvbHMuYmVnaW4oKTsgfQorICBjb25zdF9zeW1ib2xfaXRlcmF0b3Igc3ltYm9sX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gU3ltYm9scy5iZWdpbigpOyB9CisKKyAgc3ltYm9sX2l0ZXJhdG9yIHN5bWJvbF9lbmQoKSB7IHJldHVybiBTeW1ib2xzLmVuZCgpOyB9CisgIGNvbnN0X3N5bWJvbF9pdGVyYXRvciBzeW1ib2xfZW5kKCkgY29uc3QgeyByZXR1cm4gU3ltYm9scy5lbmQoKTsgfQorCisgIHN5bWJvbF9yYW5nZSBzeW1ib2xzKCkgeyByZXR1cm4gbWFrZV9yYW5nZShzeW1ib2xfYmVnaW4oKSwgc3ltYm9sX2VuZCgpKTsgfQorICBjb25zdF9zeW1ib2xfcmFuZ2Ugc3ltYm9scygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShzeW1ib2xfYmVnaW4oKSwgc3ltYm9sX2VuZCgpKTsKKyAgfQorCisgIHNpemVfdCBzeW1ib2xfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFN5bWJvbHMuc2l6ZSgpOyB9CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBJbmRpcmVjdCBTeW1ib2wgTGlzdCBBY2Nlc3MKKyAgLy8vIEB7CisKKyAgLy8gRklYTUU6IFRoaXMgaXMgYSB0b3RhbCBoYWNrLCB0aGlzIHNob3VsZCBub3QgYmUgaGVyZS4gT25jZSB0aGluZ3MgYXJlCisgIC8vIGZhY3RvcmVkIHNvIHRoYXQgdGhlIHN0cmVhbWVyIGhhcyBkaXJlY3QgYWNjZXNzIHRvIHRoZSAubyB3cml0ZXIsIGl0IGNhbgorICAvLyBkaXNhcHBlYXIuCisgIHN0ZDo6dmVjdG9yPEluZGlyZWN0U3ltYm9sRGF0YT4gJmdldEluZGlyZWN0U3ltYm9scygpIHsKKyAgICByZXR1cm4gSW5kaXJlY3RTeW1ib2xzOworICB9CisKKyAgaW5kaXJlY3Rfc3ltYm9sX2l0ZXJhdG9yIGluZGlyZWN0X3N5bWJvbF9iZWdpbigpIHsKKyAgICByZXR1cm4gSW5kaXJlY3RTeW1ib2xzLmJlZ2luKCk7CisgIH0KKyAgY29uc3RfaW5kaXJlY3Rfc3ltYm9sX2l0ZXJhdG9yIGluZGlyZWN0X3N5bWJvbF9iZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5kaXJlY3RTeW1ib2xzLmJlZ2luKCk7CisgIH0KKworICBpbmRpcmVjdF9zeW1ib2xfaXRlcmF0b3IgaW5kaXJlY3Rfc3ltYm9sX2VuZCgpIHsKKyAgICByZXR1cm4gSW5kaXJlY3RTeW1ib2xzLmVuZCgpOworICB9CisgIGNvbnN0X2luZGlyZWN0X3N5bWJvbF9pdGVyYXRvciBpbmRpcmVjdF9zeW1ib2xfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBJbmRpcmVjdFN5bWJvbHMuZW5kKCk7CisgIH0KKworICBzaXplX3QgaW5kaXJlY3Rfc3ltYm9sX3NpemUoKSBjb25zdCB7IHJldHVybiBJbmRpcmVjdFN5bWJvbHMuc2l6ZSgpOyB9CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBMaW5rZXIgT3B0aW9uIExpc3QgQWNjZXNzCisgIC8vLyBAeworCisgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPj4gJmdldExpbmtlck9wdGlvbnMoKSB7CisgICAgcmV0dXJuIExpbmtlck9wdGlvbnM7CisgIH0KKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIERhdGEgUmVnaW9uIExpc3QgQWNjZXNzCisgIC8vLyBAeworCisgIC8vIEZJWE1FOiBUaGlzIGlzIGEgdG90YWwgaGFjaywgdGhpcyBzaG91bGQgbm90IGJlIGhlcmUuIE9uY2UgdGhpbmdzIGFyZQorICAvLyBmYWN0b3JlZCBzbyB0aGF0IHRoZSBzdHJlYW1lciBoYXMgZGlyZWN0IGFjY2VzcyB0byB0aGUgLm8gd3JpdGVyLCBpdCBjYW4KKyAgLy8gZGlzYXBwZWFyLgorICBzdGQ6OnZlY3RvcjxEYXRhUmVnaW9uRGF0YT4gJmdldERhdGFSZWdpb25zKCkgeyByZXR1cm4gRGF0YVJlZ2lvbnM7IH0KKworICBkYXRhX3JlZ2lvbl9pdGVyYXRvciBkYXRhX3JlZ2lvbl9iZWdpbigpIHsgcmV0dXJuIERhdGFSZWdpb25zLmJlZ2luKCk7IH0KKyAgY29uc3RfZGF0YV9yZWdpb25faXRlcmF0b3IgZGF0YV9yZWdpb25fYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIERhdGFSZWdpb25zLmJlZ2luKCk7CisgIH0KKworICBkYXRhX3JlZ2lvbl9pdGVyYXRvciBkYXRhX3JlZ2lvbl9lbmQoKSB7IHJldHVybiBEYXRhUmVnaW9ucy5lbmQoKTsgfQorICBjb25zdF9kYXRhX3JlZ2lvbl9pdGVyYXRvciBkYXRhX3JlZ2lvbl9lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIERhdGFSZWdpb25zLmVuZCgpOworICB9CisKKyAgc2l6ZV90IGRhdGFfcmVnaW9uX3NpemUoKSBjb25zdCB7IHJldHVybiBEYXRhUmVnaW9ucy5zaXplKCk7IH0KKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIERhdGEgUmVnaW9uIExpc3QgQWNjZXNzCisgIC8vLyBAeworCisgIC8vIEZJWE1FOiBUaGlzIGlzIGEgdG90YWwgaGFjaywgdGhpcyBzaG91bGQgbm90IGJlIGhlcmUuIE9uY2UgdGhpbmdzIGFyZQorICAvLyBmYWN0b3JlZCBzbyB0aGF0IHRoZSBzdHJlYW1lciBoYXMgZGlyZWN0IGFjY2VzcyB0byB0aGUgLm8gd3JpdGVyLCBpdCBjYW4KKyAgLy8gZGlzYXBwZWFyLgorICBNQ0xPSENvbnRhaW5lciAmZ2V0TE9IQ29udGFpbmVyKCkgeyByZXR1cm4gTE9IQ29udGFpbmVyOyB9CisgIGNvbnN0IE1DTE9IQ29udGFpbmVyICZnZXRMT0hDb250YWluZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8TUNBc3NlbWJsZXIgKj4odGhpcyktPmdldExPSENvbnRhaW5lcigpOworICB9CisgIC8vLyBAfQorICAvLy8gXG5hbWUgQmFja2VuZCBEYXRhIEFjY2VzcworICAvLy8gQHsKKworICBib29sIHJlZ2lzdGVyU2VjdGlvbihNQ1NlY3Rpb24gJlNlY3Rpb24pOworCisgIHZvaWQgcmVnaXN0ZXJTeW1ib2woY29uc3QgTUNTeW1ib2wgJlN5bWJvbCwgYm9vbCAqQ3JlYXRlZCA9IG51bGxwdHIpOworCisgIEFycmF5UmVmPHN0ZDo6c3RyaW5nPiBnZXRGaWxlTmFtZXMoKSB7IHJldHVybiBGaWxlTmFtZXM7IH0KKworICB2b2lkIGFkZEZpbGVOYW1lKFN0cmluZ1JlZiBGaWxlTmFtZSkgeworICAgIGlmICghaXNfY29udGFpbmVkKEZpbGVOYW1lcywgRmlsZU5hbWUpKQorICAgICAgRmlsZU5hbWVzLnB1c2hfYmFjayhGaWxlTmFtZSk7CisgIH0KKworICAvLy8gXGJyaWVmIFdyaXRlIHRoZSBuZWNlc3NhcnkgYnVuZGxlIHBhZGRpbmcgdG8gdGhlIGdpdmVuIG9iamVjdCB3cml0ZXIuCisgIC8vLyBFeHBlY3RzIGEgZnJhZ21lbnQgXHAgRiBjb250YWluaW5nIGluc3RydWN0aW9ucyBhbmQgaXRzIHNpemUgXHAgRlNpemUuCisgIHZvaWQgd3JpdGVGcmFnbWVudFBhZGRpbmcoY29uc3QgTUNGcmFnbWVudCAmRiwgdWludDY0X3QgRlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNPYmplY3RXcml0ZXIgKk9XKSBjb25zdDsKKworICAvLy8gQH0KKworICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKKy8vLyBcYnJpZWYgQ29tcHV0ZSB0aGUgYW1vdW50IG9mIHBhZGRpbmcgcmVxdWlyZWQgYmVmb3JlIHRoZSBmcmFnbWVudCBccCBGIHRvCisvLy8gb2JleSBidW5kbGluZyByZXN0cmljdGlvbnMsIHdoZXJlIFxwIEZPZmZzZXQgaXMgdGhlIGZyYWdtZW50J3Mgb2Zmc2V0IGluCisvLy8gaXRzIHNlY3Rpb24gYW5kIFxwIEZTaXplIGlzIHRoZSBmcmFnbWVudCdzIHNpemUuCit1aW50NjRfdCBjb21wdXRlQnVuZGxlUGFkZGluZyhjb25zdCBNQ0Fzc2VtYmxlciAmQXNzZW1ibGVyLCBjb25zdCBNQ0ZyYWdtZW50ICpGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgRk9mZnNldCwgdWludDY0X3QgRlNpemUpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ0FTU0VNQkxFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQ29kZUVtaXR0ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNDb2RlRW1pdHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxYjBiNzgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQ29kZUVtaXR0ZXIuaApAQCAtMCwwICsxLDQzIEBACisvLz09PS0gbGx2bS9NQy9NQ0NvZGVFbWl0dGVyLmggLSBJbnN0cnVjdGlvbiBFbmNvZGluZyAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNDT0RFRU1JVFRFUl9ICisjZGVmaW5lIExMVk1fTUNfTUNDT0RFRU1JVFRFUl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNGaXh1cDsKK2NsYXNzIE1DSW5zdDsKK2NsYXNzIE1DU3VidGFyZ2V0SW5mbzsKK2NsYXNzIHJhd19vc3RyZWFtOwordGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgU21hbGxWZWN0b3JJbXBsOworCisvLy8gTUNDb2RlRW1pdHRlciAtIEdlbmVyaWMgaW5zdHJ1Y3Rpb24gZW5jb2RpbmcgaW50ZXJmYWNlLgorY2xhc3MgTUNDb2RlRW1pdHRlciB7Citwcm90ZWN0ZWQ6IC8vIENhbiBvbmx5IGNyZWF0ZSBzdWJjbGFzc2VzLgorICBNQ0NvZGVFbWl0dGVyKCk7CisKK3B1YmxpYzoKKyAgTUNDb2RlRW1pdHRlcihjb25zdCBNQ0NvZGVFbWl0dGVyICYpID0gZGVsZXRlOworICBNQ0NvZGVFbWl0dGVyICZvcGVyYXRvcj0oY29uc3QgTUNDb2RlRW1pdHRlciAmKSA9IGRlbGV0ZTsKKyAgdmlydHVhbCB+TUNDb2RlRW1pdHRlcigpOworCisgIC8vLyBMaWZldGltZSBtYW5hZ2VtZW50CisgIHZpcnR1YWwgdm9pZCByZXNldCgpIHt9CisKKyAgLy8vIEVuY29kZUluc3RydWN0aW9uIC0gRW5jb2RlIHRoZSBnaXZlbiBccCBJbnN0IHRvIGJ5dGVzIG9uIHRoZSBvdXRwdXQKKyAgLy8vIHN0cmVhbSBccCBPUy4KKyAgdmlydHVhbCB2b2lkIGVuY29kZUluc3RydWN0aW9uKGNvbnN0IE1DSW5zdCAmSW5zdCwgcmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPE1DRml4dXA+ICZGaXh1cHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N1YnRhcmdldEluZm8gJlNUSSkgY29uc3QgPSAwOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNDT0RFRU1JVFRFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQ29kZVBhZGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0NvZGVQYWRkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzc3MmI2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0NvZGVQYWRkZXIuaApAQCAtMCwwICsxLDI0MyBAQAorLy89PT0tIGxsdm0vTUMvQ29kZVBhZGRlci5oIC0gTUMgQ29kZSBQYWRkZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DQ09ERVBBRERFUl9ICisjZGVmaW5lIExMVk1fTUNfTUNDT0RFUEFEREVSX0gKKworI2luY2x1ZGUgIk1DRnJhZ21lbnQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsUHRyU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0FzbUxheW91dDsKK2NsYXNzIE1DQ29kZVBhZGRpbmdQb2xpY3k7CitjbGFzcyBNQ0ZyYWdtZW50OworY2xhc3MgTUNJbnN0OworY2xhc3MgTUNPYmplY3RTdHJlYW1lcjsKK2NsYXNzIE1DU2VjdGlvbjsKKwordHlwZWRlZiBTbWFsbFZlY3Rvcjxjb25zdCBNQ1BhZGRpbmdGcmFnbWVudCAqLCA4PiBNQ1BGUmFuZ2U7CisKK3N0cnVjdCBNQ0NvZGVQYWRkaW5nQ29udGV4dCB7CisgIGJvb2wgSXNQYWRkaW5nQWN0aXZlOworICBib29sIElzQmFzaWNCbG9ja0luc2lkZUlubmVybW9zdExvb3A7CisgIGJvb2wgSXNCYXNpY0Jsb2NrUmVhY2hhYmxlVmlhRmFsbHRocm91Z2g7CisgIGJvb2wgSXNCYXNpY0Jsb2NrUmVhY2hhYmxlVmlhQnJhbmNoOworfTsKKworLy8vIFRhcmdldC1pbmRlcGVuZGVudCBiYXNlIGNsYXNzIGluY2hhcmdlIG9mIGFsbCBjb2RlIHBhZGRpbmcgZGVjaXNpb25zIGZvciBhCisvLy8gdGFyZ2V0LiBEdXJpbmcgZW5jb2RpbmcgaXQgZGV0ZXJtaW5lcyBpZiBhbmQgd2hlcmUgTUNQYWRkaW5nRnJhZ21lbnRzIHdpbGwKKy8vLyBiZSBsb2NhdGVkLCBhcyBsYXRlciBvbiwgd2hlbiBsYXlvdXQgaW5mb3JtYXRpb24gaXMgYXZhaWxhYmxlLCBpdCBkZXRlcm1pbmVzCisvLy8gdGhlaXIgc2l6ZXMuCitjbGFzcyBNQ0NvZGVQYWRkZXIgeworICBNQ0NvZGVQYWRkZXIoY29uc3QgTUNDb2RlUGFkZGVyICYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBNQ0NvZGVQYWRkZXIgJikgPSBkZWxldGU7CisKKyAgLy8vIERldGVybWluZXMgaWYgdGhlIE1DQ29kZVBhZGRpbmdQb2xpY2llcyBhcmUgYWN0aXZlLgorICBib29sIEFyZVBvbGljaWVzQWN0aXZlOworCisgIC8vLyBBbGwgdGhlIHN1cHBvcnRlZCBNQ0NvZGVQYWRkaW5nUG9saWNpZXMuCisgIFNtYWxsUHRyU2V0PE1DQ29kZVBhZGRpbmdQb2xpY3kgKiwgND4gQ29kZVBhZGRpbmdQb2xpY2llczsKKworICAvLy8gQSBwb2ludGVyIHRvIHRoZSBmcmFnbWVudCBvZiB0aGUgaW5zdHJ1Y3Rpb24gd2hvc2UgcGFkZGluZyBpcyBjdXJyZW50bHkKKyAgLy8vIGRvbmUgZm9yLgorICBNQ1BhZGRpbmdGcmFnbWVudCAqQ3VyckhhbmRsZWRJbnN0RnJhZ21lbnQ7CisKKyAgLy8vIEEgbWFwIGhvbGRpbmcgdGhlIGp1cmlzZGljdGlvbiBmb3IgZWFjaCBwYWRkaW5nIGZyYWdtZW50LiBLZXk6IHBhZGRpbmcKKyAgLy8vIGZyYWdtZW50LiBWYWx1ZTogVGhlIGZyYWdtZW50J3MganVyaXNkaWN0aW9uLiBBIGp1cmlzZGljdGlvbiBpcyBhIHZlY3RvcgorICAvLy8gb2YgcGFkZGluZyBmcmFnbWVudHMgd2hvc2UgY29uZGl0aW9ucyBhcmUgYmVpbmcgY29udHJvbGxlZCBieSBhbm90aGVyCisgIC8vLyBmcmFnbWVudCwgdGhlIGtleSBmcmFnbWVudC4KKyAgRGVuc2VNYXA8TUNQYWRkaW5nRnJhZ21lbnQgKiwgTUNQRlJhbmdlPiBGcmFnbWVudFRvSnVyaXNkaWN0aW9uOworICBNQ1BGUmFuZ2UgJmdldEp1cmlzZGljdGlvbihNQ1BhZGRpbmdGcmFnbWVudCAqRnJhZ21lbnQsIE1DQXNtTGF5b3V0ICZMYXlvdXQpOworCisgIC8vLyBBIG1hcCBob2xkaW5nIHRoZSBtYXhpbWFsIGluc3RydWN0aW9uIHdpbmRvdyBzaXplIHJlbGV2YW50IGZvciBhIHBhZGRpbmcKKyAgLy8vIGZyYWdtZW50LgorICBEZW5zZU1hcDxNQ1BhZGRpbmdGcmFnbWVudCAqLCB1aW50NjRfdD4gRnJhZ21lbnRUb01heFdpbmRvd1NpemU7CisgIHVpbnQ2NF90IGdldE1heFdpbmRvd1NpemUoTUNQYWRkaW5nRnJhZ21lbnQgKkZyYWdtZW50LCBNQ0FzbUxheW91dCAmTGF5b3V0KTsKKworcHJvdGVjdGVkOgorICAvLy8gVGhlIGN1cnJlbnQgc3RyZWFtZXIsIHVzZWQgdG8gc3RyZWFtIGNvZGUgcGFkZGluZy4KKyAgTUNPYmplY3RTdHJlYW1lciAqT1M7CisKKyAgYm9vbCBhZGRQb2xpY3koTUNDb2RlUGFkZGluZ1BvbGljeSAqUG9saWN5KTsKKworICB2aXJ0dWFsIGJvb2wKKyAgYmFzaWNCbG9ja1JlcXVpcmVzSW5zZXJ0aW9uUG9pbnQoY29uc3QgTUNDb2RlUGFkZGluZ0NvbnRleHQgJkNvbnRleHQpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgaW5zdHJ1Y3Rpb25SZXF1aXJlc0luc2VydGlvblBvaW50KGNvbnN0IE1DSW5zdCAmSW5zdCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCB1c2VQb2xpY2llc0ZvckJhc2ljQmxvY2soY29uc3QgTUNDb2RlUGFkZGluZ0NvbnRleHQgJkNvbnRleHQpIHsKKyAgICByZXR1cm4gQ29udGV4dC5Jc1BhZGRpbmdBY3RpdmU7CisgIH0KKworcHVibGljOgorICBNQ0NvZGVQYWRkZXIoKQorICAgICAgOiBBcmVQb2xpY2llc0FjdGl2ZShmYWxzZSksIEN1cnJIYW5kbGVkSW5zdEZyYWdtZW50KG51bGxwdHIpLAorICAgICAgICBPUyhudWxscHRyKSB7fQorICB2aXJ0dWFsIH5NQ0NvZGVQYWRkZXIoKTsKKworICAvLy8gSGFuZGxlcyBhbGwgdGFyZ2V0IHJlbGF0ZWQgY29kZSBwYWRkaW5nIHdoZW4gc3RhcnRpbmcgdG8gd3JpdGUgYSBuZXcKKyAgLy8vIGJhc2ljIGJsb2NrIHRvIGFuIG9iamVjdCBmaWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBPUyBUaGUgc3RyZWFtZXIgdXNlZCBmb3Igd3JpdGluZyB0aGUgcGFkZGluZyBkYXRhIGFuZCBmdW5jdGlvbi4KKyAgLy8vIFxwYXJhbSBDb250ZXh0IHRoZSBjb250ZXh0IG9mIHRoZSBwYWRkaW5nLCBFbWJlZHMgdGhlIGJhc2ljIGJsb2NrJ3MKKyAgLy8vIHBhcmFtZXRlcnMuCisgIHZvaWQgaGFuZGxlQmFzaWNCbG9ja1N0YXJ0KE1DT2JqZWN0U3RyZWFtZXIgKk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0NvZGVQYWRkaW5nQ29udGV4dCAmQ29udGV4dCk7CisgIC8vLyBIYW5kbGVzIGFsbCB0YXJnZXQgcmVsYXRlZCBjb2RlIHBhZGRpbmcgd2hlbiBkb25lIHdyaXRpbmcgYSBibG9jayB0byBhbgorICAvLy8gb2JqZWN0IGZpbGUuCisgIC8vLworICAvLy8gXHBhcmFtIENvbnRleHQgdGhlIGNvbnRleHQgb2YgdGhlIHBhZGRpbmcsIEVtYmVkcyB0aGUgYmFzaWMgYmxvY2sncworICAvLy8gcGFyYW1ldGVycy4KKyAgdm9pZCBoYW5kbGVCYXNpY0Jsb2NrRW5kKGNvbnN0IE1DQ29kZVBhZGRpbmdDb250ZXh0ICZDb250ZXh0KTsKKyAgLy8vIEhhbmRsZXMgYWxsIHRhcmdldCByZWxhdGVkIGNvZGUgcGFkZGluZyBiZWZvcmUgd3JpdGluZyBhIG5ldyBpbnN0cnVjdGlvbgorICAvLy8gdG8gYW4gb2JqZWN0IGZpbGUuCisgIC8vLworICAvLy8gXHBhcmFtIEluc3QgdGhlIGluc3RydWN0aW9uLgorICB2b2lkIGhhbmRsZUluc3RydWN0aW9uQmVnaW4oY29uc3QgTUNJbnN0ICZJbnN0KTsKKyAgLy8vIEhhbmRsZXMgYWxsIHRhcmdldCByZWxhdGVkIGNvZGUgcGFkZGluZyBhZnRlciB3cml0aW5nIGFuIGluc3RydWN0aW9uIHRvIGFuCisgIC8vLyBvYmplY3QgZmlsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gSW5zdCB0aGUgaW5zdHJ1Y3Rpb24uCisgIHZvaWQgaGFuZGxlSW5zdHJ1Y3Rpb25FbmQoY29uc3QgTUNJbnN0ICZJbnN0KTsKKworICAvLy8gUmVsYXhlcyBhIGZyYWdtZW50IChjaGFuZ2VzIHRoZSBzaXplIG9mIHRoZSBwYWRkaW5nKSBhY2NvcmRpbmcgdG8gdGFyZ2V0CisgIC8vLyByZXF1aXJlbWVudHMuIFRoZSBuZXcgc2l6ZSBjb21wdXRhdGlvbiBpcyBkb25lIHcuci50IGEgbGF5b3V0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBGcmFnbWVudCBUaGUgZnJhZ21lbnQgdG8gcmVsYXguCisgIC8vLyBccGFyYW0gTGF5b3V0IENvZGUgbGF5b3V0IGluZm9ybWF0aW9uLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWZmIGFueSByZWxheGF0aW9uIG9jY3VycmVkLgorICBib29sIHJlbGF4RnJhZ21lbnQoTUNQYWRkaW5nRnJhZ21lbnQgKkZyYWdtZW50LCBNQ0FzbUxheW91dCAmTGF5b3V0KTsKK307CisKKy8vLyBUaGUgYmFzZSBjbGFzcyBmb3IgYWxsIHBhZGRpbmcgcG9saWNpZXMsIGkuZS4gYSBydWxlIG9yIHNldCBvZiBydWxlcyB0byBwYWQKKy8vLyB0aGUgZ2VuZXJhdGVkIGNvZGUuCitjbGFzcyBNQ0NvZGVQYWRkaW5nUG9saWN5IHsKKyAgTUNDb2RlUGFkZGluZ1BvbGljeSgpID0gZGVsZXRlOworICBNQ0NvZGVQYWRkaW5nUG9saWN5KGNvbnN0IE1DQ29kZVBhZGRpbmdQb2xpY3kgJikgPSBkZWxldGU7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IE1DQ29kZVBhZGRpbmdQb2xpY3kgJikgPSBkZWxldGU7CisKK3Byb3RlY3RlZDoKKyAgLy8vIEEgbWFzayBob2xkaW5nIHRoZSBraW5kIG9mIHRoaXMgcG9saWN5LCBpLmUuIG9ubHkgdGhlIGkndGggYml0IHdpbGwgYmUgc2V0CisgIC8vLyB3aGVyZSBpIGlzIHRoZSBraW5kIG51bWJlci4KKyAgY29uc3QgdWludDY0X3QgS2luZE1hc2s7CisgIC8vLyBJbnN0cnVjdGlvbiB3aW5kb3cgc2l6ZSByZWxldmFudCB0byB0aGlzIHBvbGljeS4KKyAgY29uc3QgdWludDY0X3QgV2luZG93U2l6ZTsKKyAgLy8vIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoaWNoIGJ5dGUgb2YgdGhlIGluc3RydWN0aW9uIGRldGVybWllcyBpdHMKKyAgLy8vIGluc3RydWN0aW9uIHdpbmRvdy4gSWYgdHJ1ZSAtIHRoZSBsYXN0IGJ5dGUgb2YgdGhlIGluc3RydWN0aW9ucywgby53LiAtCisgIC8vLyB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgIGNvbnN0IGJvb2wgSW5zdEJ5dGVJc0xhc3RCeXRlOworCisgIE1DQ29kZVBhZGRpbmdQb2xpY3kodWludDY0X3QgS2luZCwgdWludDY0X3QgV2luZG93U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIEluc3RCeXRlSXNMYXN0Qnl0ZSkKKyAgICAgIDogS2luZE1hc2soVUlOVDY0X0MoMSkgPDwgS2luZCksIFdpbmRvd1NpemUoV2luZG93U2l6ZSksCisgICAgICAgIEluc3RCeXRlSXNMYXN0Qnl0ZShJbnN0Qnl0ZUlzTGFzdEJ5dGUpIHt9CisKKyAgLy8vIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIGNvbnNlY3V0aXZlIGZyYWdtZW50IG9mIGEgZ2l2ZW4KKyAgLy8vIGZyYWdtZW50LgorICAvLy8KKyAgLy8vIFxwYXJhbSBGcmFnbWVudCBUaGUgZnJhZ21lbnQgd2hvc2UgY29uc2VjdXRpdmUgb2Zmc2V0IHdpbGwgYmUgY29tcHV0ZWQuCisgIC8vLyBccGFyYW0gTGF5b3V0IENvZGUgbGF5b3V0IGluZm9ybWF0aW9uLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSBvZmZzZXQgb2YgdGhlIGNvbnNlY3V0aXZlIGZyYWdtZW50IG9mIFxwIEZyYWdtZW50LgorICBzdGF0aWMgdWludDY0X3QgZ2V0TmV4dEZyYWdtZW50T2Zmc2V0KGNvbnN0IE1DRnJhZ21lbnQgKkZyYWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQpOworICAvLy8gUmV0dXJucyB0aGUgaW5zdHJ1Y3Rpb24gYnl0ZSBvZiBhbiBpbnN0cnVjdGlvbiBwb2ludGVkIGJ5IGEgZ2l2ZW4KKyAgLy8vIE1DUGFkZGluZ0ZyYWdtZW50LiBBbiBpbnN0cnVjdGlvbiBieXRlIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBieXRlIG9mIGFuCisgIC8vLyBpbnN0cnVjdGlvbiB3aGljaCBkZXRlcm1pbmVzIGl0cyBpbnN0cnVjdGlvbiB3aW5kb3cuCisgIC8vLworICAvLy8gXHBhcmFtIEZyYWdtZW50IFRoZSBmcmFnbWVudCBwb2ludGluZyB0byB0aGUgaW5zdHJ1Y3Rpb24uCisgIC8vLyBccGFyYW0gTGF5b3V0IENvZGUgbGF5b3V0IGluZm9ybWF0aW9uLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSBpbnN0cnVjdGlvbiBieXRlIG9mIGFuIGluc3RydWN0aW9uIHBvaW50ZWQgYnkgXHAgRnJhZ21lbnQuCisgIHVpbnQ2NF90IGdldEZyYWdtZW50SW5zdEJ5dGUoY29uc3QgTUNQYWRkaW5nRnJhZ21lbnQgKkZyYWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQXNtTGF5b3V0ICZMYXlvdXQpIGNvbnN0OworICB1aW50NjRfdCBjb21wdXRlV2luZG93RW5kQWRkcmVzcyhjb25zdCBNQ1BhZGRpbmdGcmFnbWVudCAqRnJhZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldCwgTUNBc21MYXlvdXQgJkxheW91dCkgY29uc3Q7CisKKyAgLy8vIENvbXB1dGVzIGFuZCByZXR1cm5zIHRoZSBwZW5hbHR5IHdlaWdodCBvZiBhIGZpcnN0IGluc3RydWN0aW9uIHdpbmRvdyBpbiBhCisgIC8vLyByYW5nZS4gVGhpcyByZXF1aXJlcyBhIHNwZWNpYWwgZnVuY3Rpb24gc2luY2UgdGhlIGZpcnN0IHdpbmRvdyBkb2VzIG5vdAorICAvLy8gY29udGFpbiBhbGwgdGhlIHBhZGRpbmcgZnJhZ21lbnRzIGluIHRoYXQgd2luZG93LiBJdCBvbmx5IGNvbnRhaW5zIGFsbCB0aGUKKyAgLy8vIHBhZGRpbmcgZnJhZ21lbnRzIHN0YXJ0aW5nIGZyb20gdGhlIHJlbGV2YW50IGluc2VydGlvbiBwb2ludC4KKyAgLy8vCisgIC8vLyBccGFyYW0gV2luZG93IFRoZSBmaXJzdCB3aW5kb3cuCisgIC8vLyBccGFyYW0gT2Zmc2V0IFRoZSBvZmZzZXQgb2YgdGhlIHBhcmVudCBzZWN0aW9uIHJlbGF0aXZlIHRvIHRoZSBiZWdpbm5pbmcKKyAgLy8vIG9mIHRoZSBmaWxlLCBtb2QgdGhlIHdpbmRvdyBzaXplLgorICAvLy8gXHBhcmFtIExheW91dCBDb2RlIGxheW91dCBpbmZvcm1hdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgcGVuYWx0eSB3ZWlnaHQgb2YgYSBmaXJzdCBpbnN0cnVjdGlvbiB3aW5kb3cgaW4gYSByYW5nZSwgXHAKKyAgLy8vIFdpbmRvdy4KKyAgZG91YmxlIGNvbXB1dGVGaXJzdFdpbmRvd1BlbmFsdHlXZWlnaHQoY29uc3QgTUNQRlJhbmdlICZXaW5kb3csCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBc21MYXlvdXQgJkxheW91dCkgY29uc3Q7CisgIC8vLyBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgcGVuYWx0eSBjYXVzZWQgYnkgYW4gaW5zdHJ1Y3Rpb24gd2luZG93LgorICAvLy8KKyAgLy8vIFxwYXJhbSBXaW5kb3cgVGhlIGluc3RydWN0aW9uIHdpbmRvdy4KKyAgLy8vIFxwYXJhbSBPZmZzZXQgVGhlIG9mZnNldCBvZiB0aGUgcGFyZW50IHNlY3Rpb24gcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZworICAvLy8gb2YgdGhlIGZpbGUsIG1vZCB0aGUgd2luZG93IHNpemUuCisgIC8vLyBccGFyYW0gTGF5b3V0IENvZGUgbGF5b3V0IGluZm9ybWF0aW9uLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSBwZW5hbHR5IGNhdXNlZCBieSBccCBXaW5kb3cuCisgIHZpcnR1YWwgZG91YmxlIGNvbXB1dGVXaW5kb3dQZW5hbHR5V2VpZ2h0KGNvbnN0IE1DUEZSYW5nZSAmV2luZG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQXNtTGF5b3V0ICZMYXlvdXQpIGNvbnN0ID0gMDsKKworcHVibGljOgorICB2aXJ0dWFsIH5NQ0NvZGVQYWRkaW5nUG9saWN5KCkge30KKworICAvLy8gUmV0dXJucyB0aGUga2luZCBtYXNrIG9mIHRoaXMgcG9saWN5IC0gIEEgbWFzayBob2xkaW5nIHRoZSBraW5kIG9mIHRoaXMKKyAgLy8vIHBvbGljeSwgaS5lLiBvbmx5IHRoZSBpJ3RoIGJpdCB3aWxsIGJlIHNldCB3aGVyZSBpIGlzIHRoZSBraW5kIG51bWJlci4KKyAgdWludDY0X3QgZ2V0S2luZE1hc2soKSBjb25zdCB7IHJldHVybiBLaW5kTWFzazsgfQorICAvLy8gUmV0dXJucyB0aGUgaW5zdHJ1Y3Rpb24gd2luZG93IHNpemUgcmVsZXZhbnQgdG8gdGhpcyBwb2xpY3kuCisgIHVpbnQ2NF90IGdldFdpbmRvd1NpemUoKSBjb25zdCB7IHJldHVybiBXaW5kb3dTaXplOyB9CisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGxhc3QgYnl0ZSBvZiBhbiBpbnN0cnVjdGlvbiBkZXRlcm1pbmVzIGl0cyBpbnN0cnVjdGlvbgorICAvLy8gd2luZG93LCBvciBmYWxzZSBpZiB0aGUgZmlyc3Qgb2YgYW4gaW5zdHJ1Y3Rpb24gZGV0ZXJtaW5lcyBpdC4KKyAgYm9vbCBpc0luc3RCeXRlTGFzdEJ5dGUoKSBjb25zdCB7IHJldHVybiBJbnN0Qnl0ZUlzTGFzdEJ5dGU7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmZiB0aGlzIHBvbGljeSBuZWVkcyBwYWRkaW5nIGZvciBhIGdpdmVuIGJhc2ljIGJsb2NrLgorICAvLy8KKyAgLy8vIFxwYXJhbSBDb250ZXh0IHRoZSBjb250ZXh0IG9mIHRoZSBwYWRkaW5nLCBFbWJlZHMgdGhlIGJhc2ljIGJsb2NrJ3MKKyAgLy8vIHBhcmFtZXRlcnMuCisgIC8vLworICAvLy8gXHJldHVybnMgdHJ1ZSBpZmYgdGhpcyBwb2xpY3kgbmVlZHMgcGFkZGluZyBmb3IgdGhlIGJhc2ljIGJsb2NrLgorICB2aXJ0dWFsIGJvb2wKKyAgYmFzaWNCbG9ja1JlcXVpcmVzUGFkZGluZ0ZyYWdtZW50KGNvbnN0IE1DQ29kZVBhZGRpbmdDb250ZXh0ICZDb250ZXh0KSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vLyBSZXR1cm5zIHRydWUgaWZmIHRoaXMgcG9saWN5IG5lZWRzIHBhZGRpbmcgZm9yIGEgZ2l2ZW4gaW5zdHJ1Y3Rpb24uCisgIC8vLworICAvLy8gXHBhcmFtIEluc3QgVGhlIGdpdmVuIGluc3RydWN0aW9uLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWZmIHRoaXMgcG9saWN5IG5lZWRzIHBhZGRpbmcgZm9yIFxwIEluc3QuCisgIHZpcnR1YWwgYm9vbCBpbnN0cnVjdGlvblJlcXVpcmVzUGFkZGluZ0ZyYWdtZW50KGNvbnN0IE1DSW5zdCAmSW5zdCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLy8gQ29tcHV0ZXMgYW5kIHJldHVybnMgdGhlIHBlbmFsdHkgY2F1c2VkIGJ5IGEgcmFuZ2Ugb2YgaW5zdHJ1Y3Rpb24gd2luZG93cy4KKyAgLy8vIFRoZSB3ZWlnaHQgaXMgY29tcHV0ZWQgZm9yIGVhY2ggd2luZG93IHNlcGFyZWx0eSBhbmQgdGhlbiBhY2N1bXVsYXRlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gUmFuZ2UgVGhlIHJhbmdlLgorICAvLy8gXHBhcmFtIE9mZnNldCBUaGUgb2Zmc2V0IG9mIHRoZSBwYXJlbnQgc2VjdGlvbiByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nCisgIC8vLyBvZiB0aGUgZmlsZSwgbW9kIHRoZSB3aW5kb3cgc2l6ZS4KKyAgLy8vIFxwYXJhbSBMYXlvdXQgQ29kZSBsYXlvdXQgaW5mb3JtYXRpb24uCisgIC8vLworICAvLy8gXHJldHVybnMgdGhlIHBlbmFsdHkgY2F1c2VkIGJ5IFxwIFJhbmdlLgorICBkb3VibGUgY29tcHV0ZVJhbmdlUGVuYWx0eVdlaWdodChjb25zdCBNQ1BGUmFuZ2UgJlJhbmdlLCB1aW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQXNtTGF5b3V0ICZMYXlvdXQpIGNvbnN0OworfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ0NPREVQQURERVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0NvZGVWaWV3LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQ29kZVZpZXcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGYxNDUxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0NvZGVWaWV3LmgKQEAgLTAsMCArMSwzMDEgQEAKKy8vPT09LSBNQ0NvZGVWaWV3LmggLSBNYWNoaW5lIENvZGUgQ29kZVZpZXcgc3VwcG9ydCAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gSG9sZHMgc3RhdGUgZnJvbSAuY3ZfZmlsZSBhbmQgLmN2X2xvYyBkaXJlY3RpdmVzIGZvciBsYXRlciBlbWlzc2lvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNDT0RFVklFV19ICisjZGVmaW5lIExMVk1fTUNfTUNDT0RFVklFV19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRnJhZ21lbnQuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DT2JqZWN0U3RyZWFtZXIuaCIKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNQ0NvbnRleHQ7CitjbGFzcyBNQ09iamVjdFN0cmVhbWVyOworY2xhc3MgTUNTdHJlYW1lcjsKK2NsYXNzIENvZGVWaWV3Q29udGV4dDsKKworLy8vIFxicmllZiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgdGhlIGluZm9ybWF0aW9uIGZyb20gYQorLy8vIC5jdl9sb2MgZGlyZWN0aXZlLgorY2xhc3MgTUNDVkxvYyB7CisgIHVpbnQzMl90IEZ1bmN0aW9uSWQ7CisgIHVpbnQzMl90IEZpbGVOdW07CisgIHVpbnQzMl90IExpbmU7CisgIHVpbnQxNl90IENvbHVtbjsKKyAgdWludDE2X3QgUHJvbG9ndWVFbmQgOiAxOworICB1aW50MTZfdCBJc1N0bXQgOiAxOworCitwcml2YXRlOiAvLyBDb2RlVmlld0NvbnRleHQgbWFuYWdlcyB0aGVzZQorICBmcmllbmQgY2xhc3MgQ29kZVZpZXdDb250ZXh0OworICBNQ0NWTG9jKHVuc2lnbmVkIGZ1bmN0aW9uaWQsIHVuc2lnbmVkIGZpbGVOdW0sIHVuc2lnbmVkIGxpbmUsIHVuc2lnbmVkIGNvbHVtbiwKKyAgICAgICAgICBib29sIHByb2xvZ3VlZW5kLCBib29sIGlzc3RtdCkKKyAgICAgIDogRnVuY3Rpb25JZChmdW5jdGlvbmlkKSwgRmlsZU51bShmaWxlTnVtKSwgTGluZShsaW5lKSwgQ29sdW1uKGNvbHVtbiksCisgICAgICAgIFByb2xvZ3VlRW5kKHByb2xvZ3VlZW5kKSwgSXNTdG10KGlzc3RtdCkge30KKworICAvLyBBbGxvdyB0aGUgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yIHRvIGJlIHVzZWQKKyAgLy8gZm9yIGFuIE1DQ1ZMb2Mgb2JqZWN0LgorCitwdWJsaWM6CisgIHVuc2lnbmVkIGdldEZ1bmN0aW9uSWQoKSBjb25zdCB7IHJldHVybiBGdW5jdGlvbklkOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIEZpbGVOdW0gb2YgdGhpcyBNQ0NWTG9jLgorICB1bnNpZ25lZCBnZXRGaWxlTnVtKCkgY29uc3QgeyByZXR1cm4gRmlsZU51bTsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBMaW5lIG9mIHRoaXMgTUNDVkxvYy4KKyAgdW5zaWduZWQgZ2V0TGluZSgpIGNvbnN0IHsgcmV0dXJuIExpbmU7IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgQ29sdW1uIG9mIHRoaXMgTUNDVkxvYy4KKyAgdW5zaWduZWQgZ2V0Q29sdW1uKCkgY29uc3QgeyByZXR1cm4gQ29sdW1uOyB9CisKKyAgYm9vbCBpc1Byb2xvZ3VlRW5kKCkgY29uc3QgeyByZXR1cm4gUHJvbG9ndWVFbmQ7IH0KKyAgYm9vbCBpc1N0bXQoKSBjb25zdCB7IHJldHVybiBJc1N0bXQ7IH0KKworICB2b2lkIHNldEZ1bmN0aW9uSWQodW5zaWduZWQgRklEKSB7IEZ1bmN0aW9uSWQgPSBGSUQ7IH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgRmlsZU51bSBvZiB0aGlzIE1DQ1ZMb2MuCisgIHZvaWQgc2V0RmlsZU51bSh1bnNpZ25lZCBmaWxlTnVtKSB7IEZpbGVOdW0gPSBmaWxlTnVtOyB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIExpbmUgb2YgdGhpcyBNQ0NWTG9jLgorICB2b2lkIHNldExpbmUodW5zaWduZWQgbGluZSkgeyBMaW5lID0gbGluZTsgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBDb2x1bW4gb2YgdGhpcyBNQ0NWTG9jLgorICB2b2lkIHNldENvbHVtbih1bnNpZ25lZCBjb2x1bW4pIHsKKyAgICBhc3NlcnQoY29sdW1uIDw9IFVJTlQxNl9NQVgpOworICAgIENvbHVtbiA9IGNvbHVtbjsKKyAgfQorCisgIHZvaWQgc2V0UHJvbG9ndWVFbmQoYm9vbCBQRSkgeyBQcm9sb2d1ZUVuZCA9IFBFOyB9CisgIHZvaWQgc2V0SXNTdG10KGJvb2wgSVMpIHsgSXNTdG10ID0gSVM7IH0KK307CisKKy8vLyBcYnJpZWYgSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgcmVwcmVzZW50IHRoZSBsaW5lIGluZm9ybWF0aW9uIGZvcgorLy8vIHRoZSBDb2RlVmlldyBsaW5lIHRhYmxlIGVudHJpZXMuICBXaGljaCBpcyBjcmVhdGVkIGFmdGVyIGEgbWFjaGluZQorLy8vIGluc3RydWN0aW9uIGlzIGFzc2VtYmxlZCBhbmQgdXNlcyBhbiBhZGRyZXNzIGZyb20gYSB0ZW1wb3JhcnkgbGFiZWwKKy8vLyBjcmVhdGVkIGF0IHRoZSBjdXJyZW50IGFkZHJlc3MgaW4gdGhlIGN1cnJlbnQgc2VjdGlvbiBhbmQgdGhlIGluZm8gZnJvbQorLy8vIHRoZSBsYXN0IC5jdl9sb2MgZGlyZWN0aXZlIHNlZW4gYXMgc3RvcmVkIGluIHRoZSBjb250ZXh0LgorY2xhc3MgTUNDVkxpbmVFbnRyeSA6IHB1YmxpYyBNQ0NWTG9jIHsKKyAgY29uc3QgTUNTeW1ib2wgKkxhYmVsOworCitwcml2YXRlOgorICAvLyBBbGxvdyB0aGUgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yIHRvIGJlIHVzZWQKKyAgLy8gZm9yIGFuIE1DQ1ZMaW5lRW50cnkgb2JqZWN0LgorCitwdWJsaWM6CisgIC8vIENvbnN0cnVjdG9yIHRvIGNyZWF0ZSBhbiBNQ0NWTGluZUVudHJ5IGdpdmVuIGEgc3ltYm9sIGFuZCB0aGUgZHdhcmYgbG9jLgorICBNQ0NWTGluZUVudHJ5KGNvbnN0IE1DU3ltYm9sICpMYWJlbCwgY29uc3QgTUNDVkxvYyBsb2MpCisgICAgICA6IE1DQ1ZMb2MobG9jKSwgTGFiZWwoTGFiZWwpIHt9CisKKyAgY29uc3QgTUNTeW1ib2wgKmdldExhYmVsKCkgY29uc3QgeyByZXR1cm4gTGFiZWw7IH0KKworICAvLyBUaGlzIGlzIGNhbGxlZCB3aGVuIGFuIGluc3RydWN0aW9uIGlzIGFzc2VtYmxlZCBpbnRvIHRoZSBzcGVjaWZpZWQKKyAgLy8gc2VjdGlvbiBhbmQgaWYgdGhlcmUgaXMgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGFzdCAuY3ZfbG9jIGRpcmVjdGl2ZSB0aGF0CisgIC8vIGhhcyB5ZXQgdG8gaGF2ZSBhIGxpbmUgZW50cnkgbWFkZSBmb3IgaXQgaXMgbWFkZS4KKyAgc3RhdGljIHZvaWQgTWFrZShNQ09iamVjdFN0cmVhbWVyICpNQ09TKTsKK307CisKKy8vLyBJbmZvcm1hdGlvbiBkZXNjcmliaW5nIGEgZnVuY3Rpb24gb3IgaW5saW5lZCBjYWxsIHNpdGUgaW50cm9kdWNlZCBieQorLy8vIC5jdl9mdW5jX2lkIG9yIC5jdl9pbmxpbmVfc2l0ZV9pZC4gQWNjdW11bGF0ZXMgaW5mb3JtYXRpb24gZnJvbSAuY3ZfbG9jCisvLy8gZGlyZWN0aXZlcyB1c2VkIHdpdGggdGhpcyBmdW5jdGlvbidzIGlkIG9yIHRoZSBpZCBvZiBhbiBpbmxpbmVkIGNhbGwgc2l0ZQorLy8vIHdpdGhpbiB0aGlzIGZ1bmN0aW9uIG9yIGlubGluZWQgY2FsbCBzaXRlLgorc3RydWN0IE1DQ1ZGdW5jdGlvbkluZm8geworICAvLy8gSWYgdGhpcyByZXByZXNlbnRzIGFuIGlubGluZWQgY2FsbCBzaXRlLCB0aGVuIFBhcmVudEZ1bmNJZFBsdXNPbmUgd2lsbCBiZQorICAvLy8gdGhlIHBhcmVudCBmdW5jdGlvbiBpZCBwbHVzIG9uZS4gSWYgdGhpcyByZXByZXNlbnRzIGEgbm9ybWFsIGZ1bmN0aW9uLAorICAvLy8gdGhlbiB0aGVyZSBpcyBubyBwYXJlbnQsIGFuZCBQYXJlbnRGdW5jSWRQbHVzT25lIHdpbGwgYmUgRnVuY3Rpb25TZW50aW5lbC4KKyAgLy8vIElmIHRoaXMgc3RydWN0IGlzIGFuIHVuYWxsb2NhdGVkIHNsb3QgaW4gdGhlIGZ1bmN0aW9uIGluZm8gdmVjdG9yLCB0aGVuCisgIC8vLyBQYXJlbnRGdW5jSWRQbHVzT25lIHdpbGwgYmUgemVyby4KKyAgdW5zaWduZWQgUGFyZW50RnVuY0lkUGx1c09uZSA9IDA7CisKKyAgZW51bSA6IHVuc2lnbmVkIHsgRnVuY3Rpb25TZW50aW5lbCA9IH4wVSB9OworCisgIHN0cnVjdCBMaW5lSW5mbyB7CisgICAgdW5zaWduZWQgRmlsZTsKKyAgICB1bnNpZ25lZCBMaW5lOworICAgIHVuc2lnbmVkIENvbDsKKyAgfTsKKworICBMaW5lSW5mbyBJbmxpbmVkQXQ7CisKKyAgLy8vIFRoZSBzZWN0aW9uIG9mIHRoZSBmaXJzdCAuY3ZfbG9jIGRpcmVjdGl2ZSB1c2VkIGZvciB0aGlzIGZ1bmN0aW9uLCBvciBudWxsCisgIC8vLyBpZiBub25lIGhhcyBiZWVuIHNlZW4geWV0LgorICBNQ1NlY3Rpb24gKlNlY3Rpb24gPSBudWxscHRyOworCisgIC8vLyBNYXAgZnJvbSBpbmxpbmVkIGNhbGwgc2l0ZSBpZCB0byB0aGUgaW5saW5lZCBhdCBsb2NhdGlvbiB0byB1c2UgZm9yIHRoYXQKKyAgLy8vIGNhbGwgc2l0ZS4gQ2FsbCBjaGFpbnMgYXJlIGNvbGxhcHNlZCwgc28gZm9yIHRoZSBjYWxsIGNoYWluICdmIC0+IGcgLT4gaCcsCisgIC8vLyB0aGUgSW5saW5lZEF0TWFwIG9mICdmJyB3aWxsIGNvbnRhaW4gZW50cmllcyBmb3IgJ2cnIGFuZCAnaCcgdGhhdCBib3RoCisgIC8vLyBsaXN0IHRoZSBsaW5lIGluZm8gZm9yIHRoZSAnZycgY2FsbCBzaXRlLgorICBEZW5zZU1hcDx1bnNpZ25lZCwgTGluZUluZm8+IElubGluZWRBdE1hcDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgZnVuY3Rpb24gaW5mbyBoYXMgbm90IHlldCBiZWVuIHVzZWQgaW4gYQorICAvLy8gLmN2X2Z1bmNfaWQgb3IgLmN2X2lubGluZV9zaXRlX2lkIGRpcmVjdGl2ZS4KKyAgYm9vbCBpc1VuYWxsb2NhdGVkRnVuY3Rpb25JbmZvKCkgY29uc3QgeyByZXR1cm4gUGFyZW50RnVuY0lkUGx1c09uZSA9PSAwOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHJlcHJlc2VudHMgYW4gaW5saW5lZCBjYWxsIHNpdGUsIG1lYW5pbmcKKyAgLy8vIFBhcmVudEZ1bmNJZFBsdXNPbmUgaXMgbmVpdGhlciB6ZXJvIG5vciB+MFUuCisgIGJvb2wgaXNJbmxpbmVkQ2FsbFNpdGUoKSBjb25zdCB7CisgICAgcmV0dXJuICFpc1VuYWxsb2NhdGVkRnVuY3Rpb25JbmZvKCkgJiYKKyAgICAgICAgICAgUGFyZW50RnVuY0lkUGx1c09uZSAhPSBGdW5jdGlvblNlbnRpbmVsOworICB9CisKKyAgdW5zaWduZWQgZ2V0UGFyZW50RnVuY0lkKCkgY29uc3QgeworICAgIGFzc2VydChpc0lubGluZWRDYWxsU2l0ZSgpKTsKKyAgICByZXR1cm4gUGFyZW50RnVuY0lkUGx1c09uZSAtIDE7CisgIH0KK307CisKKy8vLyBIb2xkcyBzdGF0ZSBmcm9tIC5jdl9maWxlIGFuZCAuY3ZfbG9jIGRpcmVjdGl2ZXMgZm9yIGxhdGVyIGVtaXNzaW9uLgorY2xhc3MgQ29kZVZpZXdDb250ZXh0IHsKK3B1YmxpYzoKKyAgQ29kZVZpZXdDb250ZXh0KCk7CisgIH5Db2RlVmlld0NvbnRleHQoKTsKKworICBib29sIGlzVmFsaWRGaWxlTnVtYmVyKHVuc2lnbmVkIEZpbGVOdW1iZXIpIGNvbnN0OworICBib29sIGFkZEZpbGUoTUNTdHJlYW1lciAmT1MsIHVuc2lnbmVkIEZpbGVOdW1iZXIsIFN0cmluZ1JlZiBGaWxlbmFtZSwKKyAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+IENoZWNrc3VtQnl0ZXMsIHVpbnQ4X3QgQ2hlY2tzdW1LaW5kKTsKKworICAvLy8gUmVjb3JkcyB0aGUgZnVuY3Rpb24gaWQgb2YgYSBub3JtYWwgZnVuY3Rpb24uIFJldHVybnMgZmFsc2UgaWYgdGhlCisgIC8vLyBmdW5jdGlvbiBpZCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQsIGFuZCB0cnVlIG90aGVyd2lzZS4KKyAgYm9vbCByZWNvcmRGdW5jdGlvbklkKHVuc2lnbmVkIEZ1bmNJZCk7CisKKyAgLy8vIFJlY29yZHMgdGhlIGZ1bmN0aW9uIGlkIG9mIGFuIGlubGluZWQgY2FsbCBzaXRlLiBSZWNvcmRzIHRoZSAiaW5saW5lZCBhdCIKKyAgLy8vIGxvY2F0aW9uIGluZm8gb2YgdGhlIGNhbGwgc2l0ZSwgaW5jbHVkaW5nIHdoYXQgZnVuY3Rpb24gb3IgaW5saW5lZCBjYWxsCisgIC8vLyBzaXRlIGl0IHdhcyBpbmxpbmVkIGludG8uIFJldHVybnMgZmFsc2UgaWYgdGhlIGZ1bmN0aW9uIGlkIGhhcyBhbHJlYWR5CisgIC8vLyBiZWVuIHVzZWQsIGFuZCB0cnVlIG90aGVyd2lzZS4KKyAgYm9vbCByZWNvcmRJbmxpbmVkQ2FsbFNpdGVJZCh1bnNpZ25lZCBGdW5jSWQsIHVuc2lnbmVkIElBRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJQUZpbGUsIHVuc2lnbmVkIElBTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJQUNvbCk7CisKKyAgLy8vIFJldHJlaXZlIHRoZSBmdW5jdGlvbiBpbmZvIGlmIHRoaXMgaXMgYSB2YWxpZCBmdW5jdGlvbiBpZCwgb3IgbnVsbHB0ci4KKyAgTUNDVkZ1bmN0aW9uSW5mbyAqZ2V0Q1ZGdW5jdGlvbkluZm8odW5zaWduZWQgRnVuY0lkKTsKKworICAvLy8gU2F2ZXMgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGN1cnJlbnRseSBwYXJzZWQgLmN2X2xvYyBkaXJlY3RpdmUKKyAgLy8vIGFuZCBzZXRzIENWTG9jU2Vlbi4gIFdoZW4gdGhlIG5leHQgaW5zdHJ1Y3Rpb24gaXMgYXNzZW1ibGVkIGFuIGVudHJ5CisgIC8vLyBpbiB0aGUgbGluZSBudW1iZXIgdGFibGUgd2l0aCB0aGlzIGluZm9ybWF0aW9uIGFuZCB0aGUgYWRkcmVzcyBvZiB0aGUKKyAgLy8vIGluc3RydWN0aW9uIHdpbGwgYmUgY3JlYXRlZC4KKyAgdm9pZCBzZXRDdXJyZW50Q1ZMb2ModW5zaWduZWQgRnVuY3Rpb25JZCwgdW5zaWduZWQgRmlsZU5vLCB1bnNpZ25lZCBMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb2x1bW4sIGJvb2wgUHJvbG9ndWVFbmQsIGJvb2wgSXNTdG10KSB7CisgICAgQ3VycmVudENWTG9jLnNldEZ1bmN0aW9uSWQoRnVuY3Rpb25JZCk7CisgICAgQ3VycmVudENWTG9jLnNldEZpbGVOdW0oRmlsZU5vKTsKKyAgICBDdXJyZW50Q1ZMb2Muc2V0TGluZShMaW5lKTsKKyAgICBDdXJyZW50Q1ZMb2Muc2V0Q29sdW1uKENvbHVtbik7CisgICAgQ3VycmVudENWTG9jLnNldFByb2xvZ3VlRW5kKFByb2xvZ3VlRW5kKTsKKyAgICBDdXJyZW50Q1ZMb2Muc2V0SXNTdG10KElzU3RtdCk7CisgICAgQ1ZMb2NTZWVuID0gdHJ1ZTsKKyAgfQorCisgIGJvb2wgZ2V0Q1ZMb2NTZWVuKCkgeyByZXR1cm4gQ1ZMb2NTZWVuOyB9CisgIHZvaWQgY2xlYXJDVkxvY1NlZW4oKSB7IENWTG9jU2VlbiA9IGZhbHNlOyB9CisKKyAgY29uc3QgTUNDVkxvYyAmZ2V0Q3VycmVudENWTG9jKCkgeyByZXR1cm4gQ3VycmVudENWTG9jOyB9CisKKyAgYm9vbCBpc1ZhbGlkQ1ZGaWxlTnVtYmVyKHVuc2lnbmVkIEZpbGVOdW1iZXIpOworCisgIC8vLyBcYnJpZWYgQWRkIGEgbGluZSBlbnRyeS4KKyAgdm9pZCBhZGRMaW5lRW50cnkoY29uc3QgTUNDVkxpbmVFbnRyeSAmTGluZUVudHJ5KTsKKworICBzdGQ6OnZlY3RvcjxNQ0NWTGluZUVudHJ5PiBnZXRGdW5jdGlvbkxpbmVFbnRyaWVzKHVuc2lnbmVkIEZ1bmNJZCk7CisKKyAgc3RkOjpwYWlyPHNpemVfdCwgc2l6ZV90PiBnZXRMaW5lRXh0ZW50KHVuc2lnbmVkIEZ1bmNJZCk7CisKKyAgQXJyYXlSZWY8TUNDVkxpbmVFbnRyeT4gZ2V0TGluZXNGb3JFeHRlbnQoc2l6ZV90IEwsIHNpemVfdCBSKTsKKworICAvLy8gRW1pdHMgYSBsaW5lIHRhYmxlIHN1YnN0cmVhbS4KKyAgdm9pZCBlbWl0TGluZVRhYmxlRm9yRnVuY3Rpb24oTUNPYmplY3RTdHJlYW1lciAmT1MsIHVuc2lnbmVkIEZ1bmNJZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKkZ1bmNCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKkZ1bmNFbmQpOworCisgIHZvaWQgZW1pdElubGluZUxpbmVUYWJsZUZvckZ1bmN0aW9uKE1DT2JqZWN0U3RyZWFtZXIgJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQcmltYXJ5RnVuY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU291cmNlRmlsZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTb3VyY2VMaW5lTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqRm5TdGFydFN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKkZuRW5kU3ltKTsKKworICAvLy8gRW5jb2RlcyB0aGUgYmluYXJ5IGFubm90YXRpb25zIG9uY2Ugd2UgaGF2ZSBhIGxheW91dC4KKyAgdm9pZCBlbmNvZGVJbmxpbmVMaW5lVGFibGUoTUNBc21MYXlvdXQgJkxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDVklubGluZUxpbmVUYWJsZUZyYWdtZW50ICZGKTsKKworICB2b2lkCisgIGVtaXREZWZSYW5nZShNQ09iamVjdFN0cmVhbWVyICZPUywKKyAgICAgICAgICAgICAgIEFycmF5UmVmPHN0ZDo6cGFpcjxjb25zdCBNQ1N5bWJvbCAqLCBjb25zdCBNQ1N5bWJvbCAqPj4gUmFuZ2VzLAorICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpeGVkU2l6ZVBvcnRpb24pOworCisgIHZvaWQgZW5jb2RlRGVmUmFuZ2UoTUNBc21MYXlvdXQgJkxheW91dCwgTUNDVkRlZlJhbmdlRnJhZ21lbnQgJkYpOworCisgIC8vLyBFbWl0cyB0aGUgc3RyaW5nIHRhYmxlIHN1YnN0cmVhbS4KKyAgdm9pZCBlbWl0U3RyaW5nVGFibGUoTUNPYmplY3RTdHJlYW1lciAmT1MpOworCisgIC8vLyBFbWl0cyB0aGUgZmlsZSBjaGVja3N1bSBzdWJzdHJlYW0uCisgIHZvaWQgZW1pdEZpbGVDaGVja3N1bXMoTUNPYmplY3RTdHJlYW1lciAmT1MpOworCisgIC8vLyBFbWl0cyB0aGUgb2Zmc2V0IGludG8gdGhlIGNoZWNrc3VtIHRhYmxlIG9mIHRoZSBnaXZlbiBmaWxlIG51bWJlci4KKyAgdm9pZCBlbWl0RmlsZUNoZWNrc3VtT2Zmc2V0KE1DT2JqZWN0U3RyZWFtZXIgJk9TLCB1bnNpZ25lZCBGaWxlTm8pOworCisgIC8vLyBBZGQgc29tZXRoaW5nIHRvIHRoZSBzdHJpbmcgdGFibGUuICBSZXR1cm5zIHRoZSBmaW5hbCBzdHJpbmcgYXMgd2VsbCBhcworICAvLy8gb2Zmc2V0IGludG8gdGhlIHN0cmluZyB0YWJsZS4KKyAgc3RkOjpwYWlyPFN0cmluZ1JlZiwgdW5zaWduZWQ+IGFkZFRvU3RyaW5nVGFibGUoU3RyaW5nUmVmIFMpOworCitwcml2YXRlOgorICAvLy8gVGhlIGN1cnJlbnQgQ29kZVZpZXcgbGluZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSBsYXN0IC5jdl9sb2MgZGlyZWN0aXZlLgorICBNQ0NWTG9jIEN1cnJlbnRDVkxvYyA9IE1DQ1ZMb2MoMCwgMCwgMCwgMCwgZmFsc2UsIHRydWUpOworICBib29sIENWTG9jU2VlbiA9IGZhbHNlOworCisgIC8vLyBNYXAgZnJvbSBzdHJpbmcgdG8gc3RyaW5nIHRhYmxlIG9mZnNldC4KKyAgU3RyaW5nTWFwPHVuc2lnbmVkPiBTdHJpbmdUYWJsZTsKKworICAvLy8gVGhlIGZyYWdtZW50IHRoYXQgdWx0aW1hdGVseSBob2xkcyBvdXIgc3RyaW5ncy4KKyAgTUNEYXRhRnJhZ21lbnQgKlN0clRhYkZyYWdtZW50ID0gbnVsbHB0cjsKKyAgYm9vbCBJbnNlcnRlZFN0clRhYkZyYWdtZW50ID0gZmFsc2U7CisKKyAgTUNEYXRhRnJhZ21lbnQgKmdldFN0cmluZ1RhYmxlRnJhZ21lbnQoKTsKKworICAvLy8gR2V0IGEgc3RyaW5nIHRhYmxlIG9mZnNldC4KKyAgdW5zaWduZWQgZ2V0U3RyaW5nVGFibGVPZmZzZXQoU3RyaW5nUmVmIFMpOworCisgIHN0cnVjdCBGaWxlSW5mbyB7CisgICAgdW5zaWduZWQgU3RyaW5nVGFibGVPZmZzZXQ7CisKKyAgICAvLyBJbmRpY2F0ZXMgaWYgdGhpcyBGaWxlSW5mbyBjb3JyZXNwb25kcyB0byBhbiBhY3R1YWwgZmlsZSwgb3IgaGFzbid0IGJlZW4KKyAgICAvLyBzZXQgeWV0LgorICAgIGJvb2wgQXNzaWduZWQgPSBmYWxzZTsKKworICAgIHVpbnQ4X3QgQ2hlY2tzdW1LaW5kOworCisgICAgQXJyYXlSZWY8dWludDhfdD4gQ2hlY2tzdW07CisKKyAgICAvLyBDaGVja3N1bSBvZmZzZXQgc3RvcmVkIGFzIGEgc3ltYm9sIGJlY2F1c2UgaXQgbWlnaHQgYmUgcmVxdWVzdGVkCisgICAgLy8gYmVmb3JlIGl0IGhhcyBiZWVuIGNhbGN1bGF0ZWQsIHNvIGEgZml4dXAgbWF5IGJlIG5lZWRlZC4KKyAgICBNQ1N5bWJvbCAqQ2hlY2tzdW1UYWJsZU9mZnNldDsKKyAgfTsKKworICAvLy8gQXJyYXkgc3RvcmluZyBhZGRlZCBmaWxlIGluZm9ybWF0aW9uLgorICBTbWFsbFZlY3RvcjxGaWxlSW5mbywgND4gRmlsZXM7CisKKyAgLy8vIFRoZSBvZmZzZXQgb2YgdGhlIGZpcnN0IGFuZCBsYXN0IC5jdl9sb2MgZGlyZWN0aXZlIGZvciBhIGdpdmVuIGZ1bmN0aW9uCisgIC8vLyBpZC4KKyAgc3RkOjptYXA8dW5zaWduZWQsIHN0ZDo6cGFpcjxzaXplX3QsIHNpemVfdD4+IE1DQ1ZMaW5lU3RhcnRTdG9wOworCisgIC8vLyBBIGNvbGxlY3Rpb24gb2YgTUNDVkxpbmVFbnRyeSBmb3IgZWFjaCBzZWN0aW9uLgorICBzdGQ6OnZlY3RvcjxNQ0NWTGluZUVudHJ5PiBNQ0NWTGluZXM7CisKKyAgLy8vIEFsbCBrbm93biBmdW5jdGlvbnMgYW5kIGlubGluZWQgY2FsbCBzaXRlcywgaW5kZXhlZCBieSBmdW5jdGlvbiBpZC4KKyAgc3RkOjp2ZWN0b3I8TUNDVkZ1bmN0aW9uSW5mbz4gRnVuY3Rpb25zOworCisgIC8vLyBJbmRpY2F0ZSB3aGV0aGVyIHdlIGhhdmUgYWxyZWFkeSBsYWlkIG91dCB0aGUgY2hlY2tzdW0gdGFibGUgYWRkcmVzc2VzIG9yCisgIC8vLyBub3QuCisgIGJvb2wgQ2hlY2tzdW1PZmZzZXRzQXNzaWduZWQgPSBmYWxzZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNDb250ZXh0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQ29udGV4dC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxMTBmZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DQ29udGV4dC5oCkBAIC0wLDAgKzEsNzIyIEBACisvLz09PS0gTUNDb250ZXh0LmggLSBNYWNoaW5lIENvZGUgQ29udGV4dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNDT05URVhUX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0NPTlRFWFRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0FzbU1hY3JvLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0R3YXJmLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N1YnRhcmdldEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL1NlY3Rpb25LaW5kLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NRDUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworICBjbGFzcyBDb2RlVmlld0NvbnRleHQ7CisgIGNsYXNzIE1DQXNtSW5mbzsKKyAgY2xhc3MgTUNMYWJlbDsKKyAgY2xhc3MgTUNPYmplY3RGaWxlSW5mbzsKKyAgY2xhc3MgTUNSZWdpc3RlckluZm87CisgIGNsYXNzIE1DU2VjdGlvbjsKKyAgY2xhc3MgTUNTZWN0aW9uQ09GRjsKKyAgY2xhc3MgTUNTZWN0aW9uRUxGOworICBjbGFzcyBNQ1NlY3Rpb25NYWNoTzsKKyAgY2xhc3MgTUNTZWN0aW9uV2FzbTsKKyAgY2xhc3MgTUNTdHJlYW1lcjsKKyAgY2xhc3MgTUNTeW1ib2w7CisgIGNsYXNzIE1DU3ltYm9sRUxGOworICBjbGFzcyBNQ1N5bWJvbFdhc207CisgIGNsYXNzIFNNTG9jOworICBjbGFzcyBTb3VyY2VNZ3I7CisKKyAgLy8vIENvbnRleHQgb2JqZWN0IGZvciBtYWNoaW5lIGNvZGUgb2JqZWN0cy4gIFRoaXMgY2xhc3Mgb3ducyBhbGwgb2YgdGhlCisgIC8vLyBzZWN0aW9ucyB0aGF0IGl0IGNyZWF0ZXMuCisgIC8vLworICBjbGFzcyBNQ0NvbnRleHQgeworICBwdWJsaWM6CisgICAgdXNpbmcgU3ltYm9sVGFibGUgPSBTdHJpbmdNYXA8TUNTeW1ib2wgKiwgQnVtcFB0ckFsbG9jYXRvciAmPjsKKworICBwcml2YXRlOgorICAgIC8vLyBUaGUgU291cmNlTWdyIGZvciB0aGlzIG9iamVjdCwgaWYgYW55LgorICAgIGNvbnN0IFNvdXJjZU1nciAqU3JjTWdyOworCisgICAgLy8vIFRoZSBTb3VyY2VNZ3IgZm9yIGlubGluZSBhc3NlbWJseSwgaWYgYW55LgorICAgIFNvdXJjZU1nciAqSW5saW5lU3JjTWdyOworCisgICAgLy8vIFRoZSBNQ0FzbUluZm8gZm9yIHRoaXMgdGFyZ2V0LgorICAgIGNvbnN0IE1DQXNtSW5mbyAqTUFJOworCisgICAgLy8vIFRoZSBNQ1JlZ2lzdGVySW5mbyBmb3IgdGhpcyB0YXJnZXQuCisgICAgY29uc3QgTUNSZWdpc3RlckluZm8gKk1SSTsKKworICAgIC8vLyBUaGUgTUNPYmplY3RGaWxlSW5mbyBmb3IgdGhpcyB0YXJnZXQuCisgICAgY29uc3QgTUNPYmplY3RGaWxlSW5mbyAqTU9GSTsKKworICAgIHN0ZDo6dW5pcXVlX3B0cjxDb2RlVmlld0NvbnRleHQ+IENWQ29udGV4dDsKKworICAgIC8vLyBBbGxvY2F0b3Igb2JqZWN0IHVzZWQgZm9yIGNyZWF0aW5nIG1hY2hpbmUgY29kZSBvYmplY3RzLgorICAgIC8vLworICAgIC8vLyBXZSB1c2UgYSBidW1wIHBvaW50ZXIgYWxsb2NhdG9yIHRvIGF2b2lkIHRoZSBuZWVkIHRvIHRyYWNrIGFsbCBhbGxvY2F0ZWQKKyAgICAvLy8gb2JqZWN0cy4KKyAgICBCdW1wUHRyQWxsb2NhdG9yIEFsbG9jYXRvcjsKKworICAgIFNwZWNpZmljQnVtcFB0ckFsbG9jYXRvcjxNQ1NlY3Rpb25DT0ZGPiBDT0ZGQWxsb2NhdG9yOworICAgIFNwZWNpZmljQnVtcFB0ckFsbG9jYXRvcjxNQ1NlY3Rpb25FTEY+IEVMRkFsbG9jYXRvcjsKKyAgICBTcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3I8TUNTZWN0aW9uTWFjaE8+IE1hY2hPQWxsb2NhdG9yOworICAgIFNwZWNpZmljQnVtcFB0ckFsbG9jYXRvcjxNQ1NlY3Rpb25XYXNtPiBXYXNtQWxsb2NhdG9yOworCisgICAgLy8vIEJpbmRpbmdzIG9mIG5hbWVzIHRvIHN5bWJvbHMuCisgICAgU3ltYm9sVGFibGUgU3ltYm9sczsKKworICAgIC8vLyBBIG1hcHBpbmcgZnJvbSBhIGxvY2FsIGxhYmVsIG51bWJlciBhbmQgYW4gaW5zdGFuY2UgY291bnQgdG8gYSBzeW1ib2wuCisgICAgLy8vIEZvciBleGFtcGxlLCBpbiB0aGUgYXNzZW1ibHkKKyAgICAvLy8gICAgIDE6CisgICAgLy8vICAgICAyOgorICAgIC8vLyAgICAgMToKKyAgICAvLy8gV2UgaGF2ZSB0aHJlZSBsYWJlbHMgcmVwcmVzZW50ZWQgYnkgdGhlIHBhaXJzICgxLCAwKSwgKDIsIDApIGFuZCAoMSwgMSkKKyAgICBEZW5zZU1hcDxzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPiwgTUNTeW1ib2wgKj4gTG9jYWxTeW1ib2xzOworCisgICAgLy8vIEtlZXBzIHRyYWNrcyBvZiBuYW1lcyB0aGF0IHdlcmUgdXNlZCBib3RoIGZvciB1c2VkIGRlY2xhcmVkIGFuZAorICAgIC8vLyBhcnRpZmljaWFsIHN5bWJvbHMuIFRoZSB2YWx1ZSBpcyAidHJ1ZSIgaWYgdGhlIG5hbWUgaGFzIGJlZW4gdXNlZCBmb3IgYQorICAgIC8vLyBub24tc2VjdGlvbiBzeW1ib2wgKHRoZXJlIGNhbiBiZSBhdCBtb3N0IG9uZSBvZiB0aG9zZSwgcGx1cyBhbiB1bmxpbWl0ZWQKKyAgICAvLy8gbnVtYmVyIG9mIHNlY3Rpb24gc3ltYm9scyB3aXRoIHRoZSBzYW1lIG5hbWUpLgorICAgIFN0cmluZ01hcDxib29sLCBCdW1wUHRyQWxsb2NhdG9yICY+IFVzZWROYW1lczsKKworICAgIC8vLyBUaGUgbmV4dCBJRCB0byBkb2xlIG91dCB0byBhbiB1bm5hbWVkIGFzc2VtYmxlciB0ZW1wb3Jhcnkgc3ltYm9sIHdpdGgKKyAgICAvLy8gYSBnaXZlbiBwcmVmaXguCisgICAgU3RyaW5nTWFwPHVuc2lnbmVkPiBOZXh0SUQ7CisKKyAgICAvLy8gSW5zdGFuY2VzIG9mIGRpcmVjdGlvbmFsIGxvY2FsIGxhYmVscy4KKyAgICBEZW5zZU1hcDx1bnNpZ25lZCwgTUNMYWJlbCAqPiBJbnN0YW5jZXM7CisgICAgLy8vIE5leHRJbnN0YW5jZSgpIGNyZWF0ZXMgdGhlIG5leHQgaW5zdGFuY2Ugb2YgdGhlIGRpcmVjdGlvbmFsIGxvY2FsIGxhYmVsCisgICAgLy8vIGZvciB0aGUgTG9jYWxMYWJlbFZhbCBhbmQgYWRkcyBpdCB0byB0aGUgbWFwIGlmIG5lZWRlZC4KKyAgICB1bnNpZ25lZCBOZXh0SW5zdGFuY2UodW5zaWduZWQgTG9jYWxMYWJlbFZhbCk7CisgICAgLy8vIEdldEluc3RhbmNlKCkgZ2V0cyB0aGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGUgZGlyZWN0aW9uYWwgbG9jYWwgbGFiZWwKKyAgICAvLy8gZm9yIHRoZSBMb2NhbExhYmVsVmFsIGFuZCBhZGRzIGl0IHRvIHRoZSBtYXAgaWYgbmVlZGVkLgorICAgIHVuc2lnbmVkIEdldEluc3RhbmNlKHVuc2lnbmVkIExvY2FsTGFiZWxWYWwpOworCisgICAgLy8vIFRoZSBmaWxlIG5hbWUgb2YgdGhlIGxvZyBmaWxlIGZyb20gdGhlIGVudmlyb25tZW50IHZhcmlhYmxlCisgICAgLy8vIEFTX1NFQ1VSRV9MT0dfRklMRS4gIFdoaWNoIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgLnNlY3VyZV9sb2dfdW5pcXVlCisgICAgLy8vIGRpcmVjdGl2ZSBpcyB1c2VkIG9yIGl0IGlzIGFuIGVycm9yLgorICAgIGNoYXIgKlNlY3VyZUxvZ0ZpbGU7CisgICAgLy8vIFRoZSBzdHJlYW0gdGhhdCBnZXRzIHdyaXR0ZW4gdG8gZm9yIHRoZSAuc2VjdXJlX2xvZ191bmlxdWUgZGlyZWN0aXZlLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxyYXdfZmRfb3N0cmVhbT4gU2VjdXJlTG9nOworICAgIC8vLyBCb29sZWFuIHRvZ2dsZWQgd2hlbiAuc2VjdXJlX2xvZ191bmlxdWUgLyAuc2VjdXJlX2xvZ19yZXNldCBpcyBzZWVuIHRvCisgICAgLy8vIGNhdGNoIGVycm9ycyBpZiAuc2VjdXJlX2xvZ191bmlxdWUgYXBwZWFycyB0d2ljZSB3aXRob3V0CisgICAgLy8vIC5zZWN1cmVfbG9nX3Jlc2V0IGFwcGVhcmluZyBiZXR3ZWVuIHRoZW0uCisgICAgYm9vbCBTZWN1cmVMb2dVc2VkID0gZmFsc2U7CisKKyAgICAvLy8gVGhlIGNvbXBpbGF0aW9uIGRpcmVjdG9yeSB0byB1c2UgZm9yIERXX0FUX2NvbXBfZGlyLgorICAgIFNtYWxsU3RyaW5nPDEyOD4gQ29tcGlsYXRpb25EaXI7CisKKyAgICAvLy8gVGhlIG1haW4gZmlsZSBuYW1lIGlmIHBhc3NlZCBpbiBleHBsaWNpdGx5LgorICAgIHN0ZDo6c3RyaW5nIE1haW5GaWxlTmFtZTsKKworICAgIC8vLyBUaGUgZHdhcmYgZmlsZSBhbmQgZGlyZWN0b3J5IHRhYmxlcyBmcm9tIHRoZSBkd2FyZiAuZmlsZSBkaXJlY3RpdmUuCisgICAgLy8vIFdlIG5vdyBlbWl0IGEgbGluZSB0YWJsZSBmb3IgZWFjaCBjb21waWxlIHVuaXQuIFRvIHJlZHVjZSB0aGUgcHJvbG9ndWUKKyAgICAvLy8gc2l6ZSBvZiBlYWNoIGxpbmUgdGFibGUsIHRoZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMgdXNlZCBieSBlYWNoIGNvbXBpbGUKKyAgICAvLy8gdW5pdCBhcmUgc2VwYXJhdGVkLgorICAgIHN0ZDo6bWFwPHVuc2lnbmVkLCBNQ0R3YXJmTGluZVRhYmxlPiBNQ0R3YXJmTGluZVRhYmxlc0NVTWFwOworCisgICAgLy8vIFRoZSBjdXJyZW50IGR3YXJmIGxpbmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgbGFzdCBkd2FyZiAubG9jIGRpcmVjdGl2ZS4KKyAgICBNQ0R3YXJmTG9jIEN1cnJlbnREd2FyZkxvYzsKKyAgICBib29sIER3YXJmTG9jU2VlbiA9IGZhbHNlOworCisgICAgLy8vIEdlbmVyYXRlIGR3YXJmIGRlYnVnZ2luZyBpbmZvIGZvciBhc3NlbWJseSBzb3VyY2UgZmlsZXMuCisgICAgYm9vbCBHZW5Ed2FyZkZvckFzc2VtYmx5ID0gZmFsc2U7CisKKyAgICAvLy8gVGhlIGN1cnJlbnQgZHdhcmYgZmlsZSBudW1iZXIgd2hlbiBnZW5lcmF0ZSBkd2FyZiBkZWJ1Z2dpbmcgaW5mbyBmb3IKKyAgICAvLy8gYXNzZW1ibHkgc291cmNlIGZpbGVzLgorICAgIHVuc2lnbmVkIEdlbkR3YXJmRmlsZU51bWJlciA9IDA7CisKKyAgICAvLy8gU2VjdGlvbnMgZm9yIGdlbmVyYXRpbmcgdGhlIC5kZWJ1Z19yYW5nZXMgYW5kIC5kZWJ1Z19hcmFuZ2VzIHNlY3Rpb25zLgorICAgIFNldFZlY3RvcjxNQ1NlY3Rpb24gKj4gU2VjdGlvbnNGb3JSYW5nZXM7CisKKyAgICAvLy8gVGhlIGluZm9ybWF0aW9uIGdhdGhlcmVkIGZyb20gbGFiZWxzIHRoYXQgd2lsbCBoYXZlIGR3YXJmIGxhYmVsCisgICAgLy8vIGVudHJpZXMgd2hlbiBnZW5lcmF0aW5nIGR3YXJmIGFzc2VtYmx5IHNvdXJjZSBmaWxlcy4KKyAgICBzdGQ6OnZlY3RvcjxNQ0dlbkR3YXJmTGFiZWxFbnRyeT4gTUNHZW5Ed2FyZkxhYmVsRW50cmllczsKKworICAgIC8vLyBUaGUgc3RyaW5nIHRvIGVtYmVkIGluIHRoZSBkZWJ1ZyBpbmZvcm1hdGlvbiBmb3IgdGhlIGNvbXBpbGUgdW5pdCwgaWYKKyAgICAvLy8gbm9uLWVtcHR5LgorICAgIFN0cmluZ1JlZiBEd2FyZkRlYnVnRmxhZ3M7CisKKyAgICAvLy8gVGhlIHN0cmluZyB0byBlbWJlZCBpbiBhcyB0aGUgZHdhcmYgQVRfcHJvZHVjZXIgZm9yIHRoZSBjb21waWxlIHVuaXQsIGlmCisgICAgLy8vIG5vbi1lbXB0eS4KKyAgICBTdHJpbmdSZWYgRHdhcmZEZWJ1Z1Byb2R1Y2VyOworCisgICAgLy8vIFRoZSBtYXhpbXVtIHZlcnNpb24gb2YgZHdhcmYgdGhhdCB3ZSBzaG91bGQgZW1pdC4KKyAgICB1aW50MTZfdCBEd2FyZlZlcnNpb24gPSA0OworCisgICAgLy8vIEhvbm9yIHRlbXBvcmFyeSBsYWJlbHMsIHRoaXMgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgc2VtYW50aWMKKyAgICAvLy8gZGlmZmVyZW5jZXMgYmV0d2VlbiB0ZW1wb3JhcnkgYW5kIG5vbi10ZW1wb3JhcnkgbGFiZWxzIChwcmltYXJpbHkgb24KKyAgICAvLy8gRGFyd2luKS4KKyAgICBib29sIEFsbG93VGVtcG9yYXJ5TGFiZWxzID0gdHJ1ZTsKKyAgICBib29sIFVzZU5hbWVzT25UZW1wTGFiZWxzID0gdHJ1ZTsKKworICAgIC8vLyBUaGUgQ29tcGlsZSBVbml0IElEIHRoYXQgd2UgYXJlIGN1cnJlbnRseSBwcm9jZXNzaW5nLgorICAgIHVuc2lnbmVkIER3YXJmQ29tcGlsZVVuaXRJRCA9IDA7CisKKyAgICBzdHJ1Y3QgRUxGU2VjdGlvbktleSB7CisgICAgICBzdGQ6OnN0cmluZyBTZWN0aW9uTmFtZTsKKyAgICAgIFN0cmluZ1JlZiBHcm91cE5hbWU7CisgICAgICB1bnNpZ25lZCBVbmlxdWVJRDsKKworICAgICAgRUxGU2VjdGlvbktleShTdHJpbmdSZWYgU2VjdGlvbk5hbWUsIFN0cmluZ1JlZiBHcm91cE5hbWUsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFVuaXF1ZUlEKQorICAgICAgICAgIDogU2VjdGlvbk5hbWUoU2VjdGlvbk5hbWUpLCBHcm91cE5hbWUoR3JvdXBOYW1lKSwgVW5pcXVlSUQoVW5pcXVlSUQpIHsKKyAgICAgIH0KKworICAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgRUxGU2VjdGlvbktleSAmT3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKFNlY3Rpb25OYW1lICE9IE90aGVyLlNlY3Rpb25OYW1lKQorICAgICAgICAgIHJldHVybiBTZWN0aW9uTmFtZSA8IE90aGVyLlNlY3Rpb25OYW1lOworICAgICAgICBpZiAoR3JvdXBOYW1lICE9IE90aGVyLkdyb3VwTmFtZSkKKyAgICAgICAgICByZXR1cm4gR3JvdXBOYW1lIDwgT3RoZXIuR3JvdXBOYW1lOworICAgICAgICByZXR1cm4gVW5pcXVlSUQgPCBPdGhlci5VbmlxdWVJRDsKKyAgICAgIH0KKyAgICB9OworCisgICAgc3RydWN0IENPRkZTZWN0aW9uS2V5IHsKKyAgICAgIHN0ZDo6c3RyaW5nIFNlY3Rpb25OYW1lOworICAgICAgU3RyaW5nUmVmIEdyb3VwTmFtZTsKKyAgICAgIGludCBTZWxlY3Rpb25LZXk7CisgICAgICB1bnNpZ25lZCBVbmlxdWVJRDsKKworICAgICAgQ09GRlNlY3Rpb25LZXkoU3RyaW5nUmVmIFNlY3Rpb25OYW1lLCBTdHJpbmdSZWYgR3JvdXBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgaW50IFNlbGVjdGlvbktleSwgdW5zaWduZWQgVW5pcXVlSUQpCisgICAgICAgICAgOiBTZWN0aW9uTmFtZShTZWN0aW9uTmFtZSksIEdyb3VwTmFtZShHcm91cE5hbWUpLAorICAgICAgICAgICAgU2VsZWN0aW9uS2V5KFNlbGVjdGlvbktleSksIFVuaXF1ZUlEKFVuaXF1ZUlEKSB7fQorCisgICAgICBib29sIG9wZXJhdG9yPChjb25zdCBDT0ZGU2VjdGlvbktleSAmT3RoZXIpIGNvbnN0IHsKKyAgICAgICAgaWYgKFNlY3Rpb25OYW1lICE9IE90aGVyLlNlY3Rpb25OYW1lKQorICAgICAgICAgIHJldHVybiBTZWN0aW9uTmFtZSA8IE90aGVyLlNlY3Rpb25OYW1lOworICAgICAgICBpZiAoR3JvdXBOYW1lICE9IE90aGVyLkdyb3VwTmFtZSkKKyAgICAgICAgICByZXR1cm4gR3JvdXBOYW1lIDwgT3RoZXIuR3JvdXBOYW1lOworICAgICAgICBpZiAoU2VsZWN0aW9uS2V5ICE9IE90aGVyLlNlbGVjdGlvbktleSkKKyAgICAgICAgICByZXR1cm4gU2VsZWN0aW9uS2V5IDwgT3RoZXIuU2VsZWN0aW9uS2V5OworICAgICAgICByZXR1cm4gVW5pcXVlSUQgPCBPdGhlci5VbmlxdWVJRDsKKyAgICAgIH0KKyAgICB9OworCisgICAgc3RydWN0IFdhc21TZWN0aW9uS2V5IHsKKyAgICAgIHN0ZDo6c3RyaW5nIFNlY3Rpb25OYW1lOworICAgICAgU3RyaW5nUmVmIEdyb3VwTmFtZTsKKyAgICAgIHVuc2lnbmVkIFVuaXF1ZUlEOworCisgICAgICBXYXNtU2VjdGlvbktleShTdHJpbmdSZWYgU2VjdGlvbk5hbWUsIFN0cmluZ1JlZiBHcm91cE5hbWUsCisgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBVbmlxdWVJRCkKKyAgICAgICAgICA6IFNlY3Rpb25OYW1lKFNlY3Rpb25OYW1lKSwgR3JvdXBOYW1lKEdyb3VwTmFtZSksIFVuaXF1ZUlEKFVuaXF1ZUlEKSB7CisgICAgICB9CisKKyAgICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFdhc21TZWN0aW9uS2V5ICZPdGhlcikgY29uc3QgeworICAgICAgICBpZiAoU2VjdGlvbk5hbWUgIT0gT3RoZXIuU2VjdGlvbk5hbWUpCisgICAgICAgICAgcmV0dXJuIFNlY3Rpb25OYW1lIDwgT3RoZXIuU2VjdGlvbk5hbWU7CisgICAgICAgIGlmIChHcm91cE5hbWUgIT0gT3RoZXIuR3JvdXBOYW1lKQorICAgICAgICAgIHJldHVybiBHcm91cE5hbWUgPCBPdGhlci5Hcm91cE5hbWU7CisgICAgICAgIHJldHVybiBVbmlxdWVJRCA8IE90aGVyLlVuaXF1ZUlEOworICAgICAgfQorICAgIH07CisKKyAgICBTdHJpbmdNYXA8TUNTZWN0aW9uTWFjaE8gKj4gTWFjaE9VbmlxdWluZ01hcDsKKyAgICBzdGQ6Om1hcDxFTEZTZWN0aW9uS2V5LCBNQ1NlY3Rpb25FTEYgKj4gRUxGVW5pcXVpbmdNYXA7CisgICAgc3RkOjptYXA8Q09GRlNlY3Rpb25LZXksIE1DU2VjdGlvbkNPRkYgKj4gQ09GRlVuaXF1aW5nTWFwOworICAgIHN0ZDo6bWFwPFdhc21TZWN0aW9uS2V5LCBNQ1NlY3Rpb25XYXNtICo+IFdhc21VbmlxdWluZ01hcDsKKyAgICBTdHJpbmdNYXA8Ym9vbD4gUmVsU2VjTmFtZXM7CisKKyAgICBTcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3I8TUNTdWJ0YXJnZXRJbmZvPiBNQ1N1YnRhcmdldEFsbG9jYXRvcjsKKworICAgIC8vLyBEbyBhdXRvbWF0aWMgcmVzZXQgaW4gZGVzdHJ1Y3RvcgorICAgIGJvb2wgQXV0b1Jlc2V0OworCisgICAgYm9vbCBIYWRFcnJvciA9IGZhbHNlOworCisgICAgTUNTeW1ib2wgKmNyZWF0ZVN5bWJvbEltcGwoY29uc3QgU3RyaW5nTWFwRW50cnk8Ym9vbD4gKk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBDYW5CZVVubmFtZWQpOworICAgIE1DU3ltYm9sICpjcmVhdGVTeW1ib2woU3RyaW5nUmVmIE5hbWUsIGJvb2wgQWx3YXlzQWRkU3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1RlbXBvcmFyeSk7CisKKyAgICBNQ1N5bWJvbCAqZ2V0T3JDcmVhdGVEaXJlY3Rpb25hbExvY2FsU3ltYm9sKHVuc2lnbmVkIExvY2FsTGFiZWxWYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbnN0YW5jZSk7CisKKyAgICBNQ1NlY3Rpb25FTEYgKmNyZWF0ZUVMRlNlY3Rpb25JbXBsKFN0cmluZ1JlZiBTZWN0aW9uLCB1bnNpZ25lZCBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmxhZ3MsIFNlY3Rpb25LaW5kIEssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFbnRyeVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbEVMRiAqR3JvdXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBVbmlxdWVJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sRUxGICpBc3NvY2lhdGVkKTsKKworICAgIC8vLyBcYnJpZWYgTWFwIG9mIGN1cnJlbnRseSBkZWZpbmVkIG1hY3Jvcy4KKyAgICBTdHJpbmdNYXA8TUNBc21NYWNybz4gTWFjcm9NYXA7CisKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IE1DQ29udGV4dChjb25zdCBNQ0FzbUluZm8gKk1BSSwgY29uc3QgTUNSZWdpc3RlckluZm8gKk1SSSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNPYmplY3RGaWxlSW5mbyAqTU9GSSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU291cmNlTWdyICpNZ3IgPSBudWxscHRyLCBib29sIERvQXV0b1Jlc2V0ID0gdHJ1ZSk7CisgICAgTUNDb250ZXh0KGNvbnN0IE1DQ29udGV4dCAmKSA9IGRlbGV0ZTsKKyAgICBNQ0NvbnRleHQgJm9wZXJhdG9yPShjb25zdCBNQ0NvbnRleHQgJikgPSBkZWxldGU7CisgICAgfk1DQ29udGV4dCgpOworCisgICAgY29uc3QgU291cmNlTWdyICpnZXRTb3VyY2VNYW5hZ2VyKCkgY29uc3QgeyByZXR1cm4gU3JjTWdyOyB9CisKKyAgICB2b2lkIHNldElubGluZVNvdXJjZU1hbmFnZXIoU291cmNlTWdyICpTTSkgeyBJbmxpbmVTcmNNZ3IgPSBTTTsgfQorCisgICAgY29uc3QgTUNBc21JbmZvICpnZXRBc21JbmZvKCkgY29uc3QgeyByZXR1cm4gTUFJOyB9CisKKyAgICBjb25zdCBNQ1JlZ2lzdGVySW5mbyAqZ2V0UmVnaXN0ZXJJbmZvKCkgY29uc3QgeyByZXR1cm4gTVJJOyB9CisKKyAgICBjb25zdCBNQ09iamVjdEZpbGVJbmZvICpnZXRPYmplY3RGaWxlSW5mbygpIGNvbnN0IHsgcmV0dXJuIE1PRkk7IH0KKworICAgIENvZGVWaWV3Q29udGV4dCAmZ2V0Q1ZDb250ZXh0KCk7CisKKyAgICB2b2lkIHNldEFsbG93VGVtcG9yYXJ5TGFiZWxzKGJvb2wgVmFsdWUpIHsgQWxsb3dUZW1wb3JhcnlMYWJlbHMgPSBWYWx1ZTsgfQorICAgIHZvaWQgc2V0VXNlTmFtZXNPblRlbXBMYWJlbHMoYm9vbCBWYWx1ZSkgeyBVc2VOYW1lc09uVGVtcExhYmVscyA9IFZhbHVlOyB9CisKKyAgICAvLy8gXG5hbWUgTW9kdWxlIExpZmV0aW1lIE1hbmFnZW1lbnQKKyAgICAvLy8gQHsKKworICAgIC8vLyByZXNldCAtIHJldHVybiBvYmplY3QgdG8gcmlnaHQgYWZ0ZXIgY29uc3RydWN0aW9uIHN0YXRlIHRvIHByZXBhcmUKKyAgICAvLy8gdG8gcHJvY2VzcyBhIG5ldyBtb2R1bGUKKyAgICB2b2lkIHJlc2V0KCk7CisKKyAgICAvLy8gQH0KKworICAgIC8vLyBcbmFtZSBTeW1ib2wgTWFuYWdlbWVudAorICAgIC8vLyBAeworCisgICAgLy8vIENyZWF0ZSBhbmQgcmV0dXJuIGEgbmV3IGxpbmtlciB0ZW1wb3Jhcnkgc3ltYm9sIHdpdGggYSB1bmlxdWUgYnV0CisgICAgLy8vIHVuc3BlY2lmaWVkIG5hbWUuCisgICAgTUNTeW1ib2wgKmNyZWF0ZUxpbmtlclByaXZhdGVUZW1wU3ltYm9sKCk7CisKKyAgICAvLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSBuZXcgYXNzZW1ibGVyIHRlbXBvcmFyeSBzeW1ib2wgd2l0aCBhIHVuaXF1ZSBidXQKKyAgICAvLy8gdW5zcGVjaWZpZWQgbmFtZS4KKyAgICBNQ1N5bWJvbCAqY3JlYXRlVGVtcFN5bWJvbChib29sIENhbkJlVW5uYW1lZCA9IHRydWUpOworCisgICAgTUNTeW1ib2wgKmNyZWF0ZVRlbXBTeW1ib2woY29uc3QgVHdpbmUgJk5hbWUsIGJvb2wgQWx3YXlzQWRkU3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQ2FuQmVVbm5hbWVkID0gdHJ1ZSk7CisKKyAgICAvLy8gQ3JlYXRlIHRoZSBkZWZpbml0aW9uIG9mIGEgZGlyZWN0aW9uYWwgbG9jYWwgc3ltYm9sIGZvciBudW1iZXJlZCBsYWJlbAorICAgIC8vLyAodXNlZCBmb3IgIjE6IiBkZWZpbml0aW9ucykuCisgICAgTUNTeW1ib2wgKmNyZWF0ZURpcmVjdGlvbmFsTG9jYWxTeW1ib2wodW5zaWduZWQgTG9jYWxMYWJlbFZhbCk7CisKKyAgICAvLy8gQ3JlYXRlIGFuZCByZXR1cm4gYSBkaXJlY3Rpb25hbCBsb2NhbCBzeW1ib2wgZm9yIG51bWJlcmVkIGxhYmVsICh1c2VkCisgICAgLy8vIGZvciAiMWIiIG9yIDFmIiByZWZlcmVuY2VzKS4KKyAgICBNQ1N5bWJvbCAqZ2V0RGlyZWN0aW9uYWxMb2NhbFN5bWJvbCh1bnNpZ25lZCBMb2NhbExhYmVsVmFsLCBib29sIEJlZm9yZSk7CisKKyAgICAvLy8gTG9va3VwIHRoZSBzeW1ib2wgaW5zaWRlIHdpdGggdGhlIHNwZWNpZmllZCBccCBOYW1lLiAgSWYgaXQgZXhpc3RzLAorICAgIC8vLyByZXR1cm4gaXQuICBJZiBub3QsIGNyZWF0ZSBhIGZvcndhcmQgcmVmZXJlbmNlIGFuZCByZXR1cm4gaXQuCisgICAgLy8vCisgICAgLy8vIFxwYXJhbSBOYW1lIC0gVGhlIHN5bWJvbCBuYW1lLCB3aGljaCBtdXN0IGJlIHVuaXF1ZSBhY3Jvc3MgYWxsIHN5bWJvbHMuCisgICAgTUNTeW1ib2wgKmdldE9yQ3JlYXRlU3ltYm9sKGNvbnN0IFR3aW5lICZOYW1lKTsKKworICAgIC8vLyBHZXRzIGEgc3ltYm9sIHRoYXQgd2lsbCBiZSBkZWZpbmVkIHRvIHRoZSBmaW5hbCBzdGFjayBvZmZzZXQgb2YgYSBsb2NhbAorICAgIC8vLyB2YXJpYWJsZSBhZnRlciBjb2RlZ2VuLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gSWR4IC0gVGhlIGluZGV4IG9mIGEgbG9jYWwgdmFyaWFibGUgcGFzc2VkIHRvIEBsbHZtLmxvY2FsZXNjYXBlLgorICAgIE1DU3ltYm9sICpnZXRPckNyZWF0ZUZyYW1lQWxsb2NTeW1ib2woU3RyaW5nUmVmIEZ1bmNOYW1lLCB1bnNpZ25lZCBJZHgpOworCisgICAgTUNTeW1ib2wgKmdldE9yQ3JlYXRlUGFyZW50RnJhbWVPZmZzZXRTeW1ib2woU3RyaW5nUmVmIEZ1bmNOYW1lKTsKKworICAgIE1DU3ltYm9sICpnZXRPckNyZWF0ZUxTREFTeW1ib2woU3RyaW5nUmVmIEZ1bmNOYW1lKTsKKworICAgIC8vLyBHZXQgdGhlIHN5bWJvbCBmb3IgXHAgTmFtZSwgb3IgbnVsbC4KKyAgICBNQ1N5bWJvbCAqbG9va3VwU3ltYm9sKGNvbnN0IFR3aW5lICZOYW1lKSBjb25zdDsKKworICAgIC8vLyBTZXQgdmFsdWUgZm9yIGEgc3ltYm9sLgorICAgIHZvaWQgc2V0U3ltYm9sVmFsdWUoTUNTdHJlYW1lciAmU3RyZWFtZXIsIFN0cmluZ1JlZiBTeW0sIHVpbnQ2NF90IFZhbCk7CisKKyAgICAvLy8gZ2V0U3ltYm9scyAtIEdldCBhIHJlZmVyZW5jZSBmb3IgdGhlIHN5bWJvbCB0YWJsZSBmb3IgY2xpZW50cyB0aGF0CisgICAgLy8vIHdhbnQgdG8sIGZvciBleGFtcGxlLCBpdGVyYXRlIG92ZXIgYWxsIHN5bWJvbHMuICdjb25zdCcgYmVjYXVzZSB3ZQorICAgIC8vLyBzdGlsbCB3YW50IGFueSBtb2RpZmljYXRpb25zIHRvIHRoZSB0YWJsZSBpdHNlbGYgdG8gdXNlIHRoZSBNQ0NvbnRleHQKKyAgICAvLy8gQVBJcy4KKyAgICBjb25zdCBTeW1ib2xUYWJsZSAmZ2V0U3ltYm9scygpIGNvbnN0IHsgcmV0dXJuIFN5bWJvbHM7IH0KKworICAgIC8vLyBAfQorCisgICAgLy8vIFxuYW1lIFNlY3Rpb24gTWFuYWdlbWVudAorICAgIC8vLyBAeworCisgICAgZW51bSA6IHVuc2lnbmVkIHsKKyAgICAgIC8vLyBQYXNzIHRoaXMgdmFsdWUgYXMgdGhlIFVuaXF1ZUlEIGR1cmluZyBzZWN0aW9uIGNyZWF0aW9uIHRvIGdldCB0aGUKKyAgICAgIC8vLyBnZW5lcmljIHNlY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gbmFtZSBhbmQgY2hhcmFjdGVyaXN0aWNzLiBUaGUgdXN1YWwKKyAgICAgIC8vLyBzZWN0aW9ucyBzdWNoIGFzIC50ZXh0IHVzZSB0aGlzIElELgorICAgICAgR2VuZXJpY1NlY3Rpb25JRCA9IH4wVQorICAgIH07CisKKyAgICAvLy8gUmV0dXJuIHRoZSBNQ1NlY3Rpb24gZm9yIHRoZSBzcGVjaWZpZWQgbWFjaC1vIHNlY3Rpb24uICBUaGlzIHJlcXVpcmVzCisgICAgLy8vIHRoZSBvcGVyYW5kcyB0byBiZSB2YWxpZC4KKyAgICBNQ1NlY3Rpb25NYWNoTyAqZ2V0TWFjaE9TZWN0aW9uKFN0cmluZ1JlZiBTZWdtZW50LCBTdHJpbmdSZWYgU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFR5cGVBbmRBdHRyaWJ1dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUmVzZXJ2ZWQyLCBTZWN0aW9uS2luZCBLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqQmVnaW5TeW1OYW1lID0gbnVsbHB0cik7CisKKyAgICBNQ1NlY3Rpb25NYWNoTyAqZ2V0TWFjaE9TZWN0aW9uKFN0cmluZ1JlZiBTZWdtZW50LCBTdHJpbmdSZWYgU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFR5cGVBbmRBdHRyaWJ1dGVzLCBTZWN0aW9uS2luZCBLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqQmVnaW5TeW1OYW1lID0gbnVsbHB0cikgeworICAgICAgcmV0dXJuIGdldE1hY2hPU2VjdGlvbihTZWdtZW50LCBTZWN0aW9uLCBUeXBlQW5kQXR0cmlidXRlcywgMCwgSywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmVnaW5TeW1OYW1lKTsKKyAgICB9CisKKyAgICBNQ1NlY3Rpb25FTEYgKmdldEVMRlNlY3Rpb24oY29uc3QgVHdpbmUgJlNlY3Rpb24sIHVuc2lnbmVkIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzKSB7CisgICAgICByZXR1cm4gZ2V0RUxGU2VjdGlvbihTZWN0aW9uLCBUeXBlLCBGbGFncywgMCwgIiIpOworICAgIH0KKworICAgIE1DU2VjdGlvbkVMRiAqZ2V0RUxGU2VjdGlvbihjb25zdCBUd2luZSAmU2VjdGlvbiwgdW5zaWduZWQgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmxhZ3MsIHVuc2lnbmVkIEVudHJ5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJkdyb3VwKSB7CisgICAgICByZXR1cm4gZ2V0RUxGU2VjdGlvbihTZWN0aW9uLCBUeXBlLCBGbGFncywgRW50cnlTaXplLCBHcm91cCwgfjApOworICAgIH0KKworICAgIE1DU2VjdGlvbkVMRiAqZ2V0RUxGU2VjdGlvbihjb25zdCBUd2luZSAmU2VjdGlvbiwgdW5zaWduZWQgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmxhZ3MsIHVuc2lnbmVkIEVudHJ5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJkdyb3VwLCB1bnNpZ25lZCBVbmlxdWVJRCkgeworICAgICAgcmV0dXJuIGdldEVMRlNlY3Rpb24oU2VjdGlvbiwgVHlwZSwgRmxhZ3MsIEVudHJ5U2l6ZSwgR3JvdXAsIFVuaXF1ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbHB0cik7CisgICAgfQorCisgICAgTUNTZWN0aW9uRUxGICpnZXRFTEZTZWN0aW9uKGNvbnN0IFR3aW5lICZTZWN0aW9uLCB1bnNpZ25lZCBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGbGFncywgdW5zaWduZWQgRW50cnlTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmR3JvdXAsIHVuc2lnbmVkIFVuaXF1ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbEVMRiAqQXNzb2NpYXRlZCk7CisKKyAgICBNQ1NlY3Rpb25FTEYgKmdldEVMRlNlY3Rpb24oY29uc3QgVHdpbmUgJlNlY3Rpb24sIHVuc2lnbmVkIFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzLCB1bnNpZ25lZCBFbnRyeVNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sRUxGICpHcm91cCwgdW5zaWduZWQgVW5pcXVlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sRUxGICpBc3NvY2lhdGVkKTsKKworICAgIC8vLyBHZXQgYSBzZWN0aW9uIHdpdGggdGhlIHByb3ZpZGVkIGdyb3VwIGlkZW50aWZpZXIuIFRoaXMgc2VjdGlvbiBpcworICAgIC8vLyBuYW1lZCBieSBjb25jYXRlbmF0aW5nIFxwIFByZWZpeCB3aXRoICcuJyB0aGVuIFxwIFN1ZmZpeC4gVGhlIFxwIFR5cGUKKyAgICAvLy8gZGVzY3JpYmVzIHRoZSB0eXBlIG9mIHRoZSBzZWN0aW9uIGFuZCBccCBGbGFncyBhcmUgdXNlZCB0byBmdXJ0aGVyCisgICAgLy8vIGNvbmZpZ3VyZSB0aGlzIG5hbWVkIHNlY3Rpb24uCisgICAgTUNTZWN0aW9uRUxGICpnZXRFTEZOYW1lZFNlY3Rpb24oY29uc3QgVHdpbmUgJlByZWZpeCwgY29uc3QgVHdpbmUgJlN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUeXBlLCB1bnNpZ25lZCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBFbnRyeVNpemUgPSAwKTsKKworICAgIE1DU2VjdGlvbkVMRiAqY3JlYXRlRUxGUmVsU2VjdGlvbihjb25zdCBUd2luZSAmTmFtZSwgdW5zaWduZWQgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmxhZ3MsIHVuc2lnbmVkIEVudHJ5U2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2xFTEYgKkdyb3VwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1NlY3Rpb25FTEYgKlJlbEluZm9TZWN0aW9uKTsKKworICAgIHZvaWQgcmVuYW1lRUxGU2VjdGlvbihNQ1NlY3Rpb25FTEYgKlNlY3Rpb24sIFN0cmluZ1JlZiBOYW1lKTsKKworICAgIE1DU2VjdGlvbkVMRiAqY3JlYXRlRUxGR3JvdXBTZWN0aW9uKGNvbnN0IE1DU3ltYm9sRUxGICpHcm91cCk7CisKKyAgICBNQ1NlY3Rpb25DT0ZGICpnZXRDT0ZGU2VjdGlvbihTdHJpbmdSZWYgU2VjdGlvbiwgdW5zaWduZWQgQ2hhcmFjdGVyaXN0aWNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25LaW5kIEtpbmQsIFN0cmluZ1JlZiBDT01EQVRTeW1OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBTZWxlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVW5pcXVlSUQgPSBHZW5lcmljU2VjdGlvbklELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkJlZ2luU3ltTmFtZSA9IG51bGxwdHIpOworCisgICAgTUNTZWN0aW9uQ09GRiAqZ2V0Q09GRlNlY3Rpb24oU3RyaW5nUmVmIFNlY3Rpb24sIHVuc2lnbmVkIENoYXJhY3RlcmlzdGljcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkJlZ2luU3ltTmFtZSA9IG51bGxwdHIpOworCisgICAgTUNTZWN0aW9uQ09GRiAqZ2V0Q09GRlNlY3Rpb24oU3RyaW5nUmVmIFNlY3Rpb24pOworCisgICAgLy8vIEdldHMgb3IgY3JlYXRlcyBhIHNlY3Rpb24gZXF1aXZhbGVudCB0byBTZWMgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlCisgICAgLy8vIHNlY3Rpb24gY29udGFpbmluZyBLZXlTeW0uIEZvciBleGFtcGxlLCB0byBjcmVhdGUgYSBkZWJ1ZyBpbmZvIHNlY3Rpb24KKyAgICAvLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGlubGluZSBmdW5jdGlvbiwgcGFzcyB0aGUgbm9ybWFsIGRlYnVnIGluZm8gc2VjdGlvbgorICAgIC8vLyBhcyBTZWMgYW5kIHRoZSBmdW5jdGlvbiBzeW1ib2wgYXMgS2V5U3ltLgorICAgIE1DU2VjdGlvbkNPRkYgKgorICAgIGdldEFzc29jaWF0aXZlQ09GRlNlY3Rpb24oTUNTZWN0aW9uQ09GRiAqU2VjLCBjb25zdCBNQ1N5bWJvbCAqS2V5U3ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVW5pcXVlSUQgPSBHZW5lcmljU2VjdGlvbklEKTsKKworICAgIE1DU2VjdGlvbldhc20gKmdldFdhc21TZWN0aW9uKGNvbnN0IFR3aW5lICZTZWN0aW9uLCBTZWN0aW9uS2luZCBLKSB7CisgICAgICByZXR1cm4gZ2V0V2FzbVNlY3Rpb24oU2VjdGlvbiwgSywgbnVsbHB0cik7CisgICAgfQorCisgICAgTUNTZWN0aW9uV2FzbSAqZ2V0V2FzbVNlY3Rpb24oY29uc3QgVHdpbmUgJlNlY3Rpb24sIFNlY3Rpb25LaW5kIEssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqQmVnaW5TeW1OYW1lKSB7CisgICAgICByZXR1cm4gZ2V0V2FzbVNlY3Rpb24oU2VjdGlvbiwgSywgIiIsIH4wLCBCZWdpblN5bU5hbWUpOworICAgIH0KKworICAgIE1DU2VjdGlvbldhc20gKmdldFdhc21TZWN0aW9uKGNvbnN0IFR3aW5lICZTZWN0aW9uLCBTZWN0aW9uS2luZCBLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZHcm91cCwgdW5zaWduZWQgVW5pcXVlSUQpIHsKKyAgICAgIHJldHVybiBnZXRXYXNtU2VjdGlvbihTZWN0aW9uLCBLLCBHcm91cCwgVW5pcXVlSUQsIG51bGxwdHIpOworICAgIH0KKworICAgIE1DU2VjdGlvbldhc20gKmdldFdhc21TZWN0aW9uKGNvbnN0IFR3aW5lICZTZWN0aW9uLCBTZWN0aW9uS2luZCBLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFR3aW5lICZHcm91cCwgdW5zaWduZWQgVW5pcXVlSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqQmVnaW5TeW1OYW1lKTsKKworICAgIE1DU2VjdGlvbldhc20gKmdldFdhc21TZWN0aW9uKGNvbnN0IFR3aW5lICZTZWN0aW9uLCBTZWN0aW9uS2luZCBLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sV2FzbSAqR3JvdXAsIHVuc2lnbmVkIFVuaXF1ZUlELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKkJlZ2luU3ltTmFtZSk7CisKKyAgICAvLyBDcmVhdGUgYW5kIHNhdmUgYSBjb3B5IG9mIFNUSSBhbmQgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBjb3B5LgorICAgIE1DU3VidGFyZ2V0SW5mbyAmZ2V0U3VidGFyZ2V0Q29weShjb25zdCBNQ1N1YnRhcmdldEluZm8gJlNUSSk7CisKKyAgICAvLy8gQH0KKworICAgIC8vLyBcbmFtZSBEd2FyZiBNYW5hZ2VtZW50CisgICAgLy8vIEB7CisKKyAgICAvLy8gXGJyaWVmIEdldCB0aGUgY29tcGlsYXRpb24gZGlyZWN0b3J5IGZvciBEV19BVF9jb21wX2RpcgorICAgIC8vLyBUaGUgY29tcGlsYXRpb24gZGlyZWN0b3J5IHNob3VsZCBiZSBzZXQgd2l0aCBcYyBzZXRDb21waWxhdGlvbkRpciBiZWZvcmUKKyAgICAvLy8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiBJZiBpdCBpcyB1bnNldCwgYW4gZW1wdHkgc3RyaW5nIHdpbGwgYmUgcmV0dXJuZWQuCisgICAgU3RyaW5nUmVmIGdldENvbXBpbGF0aW9uRGlyKCkgY29uc3QgeyByZXR1cm4gQ29tcGlsYXRpb25EaXI7IH0KKworICAgIC8vLyBcYnJpZWYgU2V0IHRoZSBjb21waWxhdGlvbiBkaXJlY3RvcnkgZm9yIERXX0FUX2NvbXBfZGlyCisgICAgdm9pZCBzZXRDb21waWxhdGlvbkRpcihTdHJpbmdSZWYgUykgeyBDb21waWxhdGlvbkRpciA9IFMuc3RyKCk7IH0KKworICAgIC8vLyBcYnJpZWYgR2V0IHRoZSBtYWluIGZpbGUgbmFtZSBmb3IgdXNlIGluIGVycm9yIG1lc3NhZ2VzIGFuZCBkZWJ1ZworICAgIC8vLyBpbmZvLiBUaGlzIGNhbiBiZSBzZXQgdG8gZW5zdXJlIHdlJ3ZlIGdvdCB0aGUgY29ycmVjdCBmaWxlIG5hbWUKKyAgICAvLy8gYWZ0ZXIgcHJlcHJvY2Vzc2luZyBvciBmb3IgLXNhdmUtdGVtcHMuCisgICAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE1haW5GaWxlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIE1haW5GaWxlTmFtZTsgfQorCisgICAgLy8vIFxicmllZiBTZXQgdGhlIG1haW4gZmlsZSBuYW1lIGFuZCBvdmVycmlkZSB0aGUgZGVmYXVsdC4KKyAgICB2b2lkIHNldE1haW5GaWxlTmFtZShTdHJpbmdSZWYgUykgeyBNYWluRmlsZU5hbWUgPSBTOyB9CisKKyAgICAvLy8gQ3JlYXRlcyBhbiBlbnRyeSBpbiB0aGUgZHdhcmYgZmlsZSBhbmQgZGlyZWN0b3J5IHRhYmxlcy4KKyAgICBFeHBlY3RlZDx1bnNpZ25lZD4gZ2V0RHdhcmZGaWxlKFN0cmluZ1JlZiBEaXJlY3RvcnksIFN0cmluZ1JlZiBGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZpbGVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRDU6Ok1ENVJlc3VsdCAqQ2hlY2tzdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxTdHJpbmdSZWY+IFNvdXJjZSwgdW5zaWduZWQgQ1VJRCk7CisKKyAgICBib29sIGlzVmFsaWREd2FyZkZpbGVOdW1iZXIodW5zaWduZWQgRmlsZU51bWJlciwgdW5zaWduZWQgQ1VJRCA9IDApOworCisgICAgY29uc3Qgc3RkOjptYXA8dW5zaWduZWQsIE1DRHdhcmZMaW5lVGFibGU+ICZnZXRNQ0R3YXJmTGluZVRhYmxlcygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBNQ0R3YXJmTGluZVRhYmxlc0NVTWFwOworICAgIH0KKworICAgIE1DRHdhcmZMaW5lVGFibGUgJmdldE1DRHdhcmZMaW5lVGFibGUodW5zaWduZWQgQ1VJRCkgeworICAgICAgcmV0dXJuIE1DRHdhcmZMaW5lVGFibGVzQ1VNYXBbQ1VJRF07CisgICAgfQorCisgICAgY29uc3QgTUNEd2FyZkxpbmVUYWJsZSAmZ2V0TUNEd2FyZkxpbmVUYWJsZSh1bnNpZ25lZCBDVUlEKSBjb25zdCB7CisgICAgICBhdXRvIEkgPSBNQ0R3YXJmTGluZVRhYmxlc0NVTWFwLmZpbmQoQ1VJRCk7CisgICAgICBhc3NlcnQoSSAhPSBNQ0R3YXJmTGluZVRhYmxlc0NVTWFwLmVuZCgpKTsKKyAgICAgIHJldHVybiBJLT5zZWNvbmQ7CisgICAgfQorCisgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPE1DRHdhcmZGaWxlPiAmZ2V0TUNEd2FyZkZpbGVzKHVuc2lnbmVkIENVSUQgPSAwKSB7CisgICAgICByZXR1cm4gZ2V0TUNEd2FyZkxpbmVUYWJsZShDVUlEKS5nZXRNQ0R3YXJmRmlsZXMoKTsKKyAgICB9CisKKyAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8c3RkOjpzdHJpbmc+ICZnZXRNQ0R3YXJmRGlycyh1bnNpZ25lZCBDVUlEID0gMCkgeworICAgICAgcmV0dXJuIGdldE1DRHdhcmZMaW5lVGFibGUoQ1VJRCkuZ2V0TUNEd2FyZkRpcnMoKTsKKyAgICB9CisKKyAgICBib29sIGhhc01DTGluZVNlY3Rpb25zKCkgY29uc3QgeworICAgICAgZm9yIChjb25zdCBhdXRvICZUYWJsZSA6IE1DRHdhcmZMaW5lVGFibGVzQ1VNYXApCisgICAgICAgIGlmICghVGFibGUuc2Vjb25kLmdldE1DRHdhcmZGaWxlcygpLmVtcHR5KCkgfHwgVGFibGUuc2Vjb25kLmdldExhYmVsKCkpCisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0RHdhcmZDb21waWxlVW5pdElEKCkgeyByZXR1cm4gRHdhcmZDb21waWxlVW5pdElEOyB9CisKKyAgICB2b2lkIHNldER3YXJmQ29tcGlsZVVuaXRJRCh1bnNpZ25lZCBDVUluZGV4KSB7CisgICAgICBEd2FyZkNvbXBpbGVVbml0SUQgPSBDVUluZGV4OworICAgIH0KKworICAgIC8vLyBTcGVjaWZpZXMgdGhlICJyb290IiBmaWxlIGFuZCBkaXJlY3Rvcnkgb2YgdGhlIGNvbXBpbGF0aW9uIHVuaXQuCisgICAgLy8vIFRoZXNlIGFyZSAiZmlsZSAwIiBhbmQgImRpcmVjdG9yeSAwIiBpbiBEV0FSRiB2NS4KKyAgICB2b2lkIHNldE1DTGluZVRhYmxlUm9vdEZpbGUodW5zaWduZWQgQ1VJRCwgU3RyaW5nUmVmIENvbXBpbGF0aW9uRGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmlsZW5hbWUsIE1ENTo6TUQ1UmVzdWx0ICpDaGVja3N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8U3RyaW5nUmVmPiBTb3VyY2UpIHsKKyAgICAgIGdldE1DRHdhcmZMaW5lVGFibGUoQ1VJRCkuc2V0Um9vdEZpbGUoQ29tcGlsYXRpb25EaXIsIEZpbGVuYW1lLCBDaGVja3N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlKTsKKyAgICB9CisKKyAgICAvLy8gU2F2ZXMgdGhlIGluZm9ybWF0aW9uIGZyb20gdGhlIGN1cnJlbnRseSBwYXJzZWQgZHdhcmYgLmxvYyBkaXJlY3RpdmUKKyAgICAvLy8gYW5kIHNldHMgRHdhcmZMb2NTZWVuLiAgV2hlbiB0aGUgbmV4dCBpbnN0cnVjdGlvbiBpcyBhc3NlbWJsZWQgYW4gZW50cnkKKyAgICAvLy8gaW4gdGhlIGxpbmUgbnVtYmVyIHRhYmxlIHdpdGggdGhpcyBpbmZvcm1hdGlvbiBhbmQgdGhlIGFkZHJlc3Mgb2YgdGhlCisgICAgLy8vIGluc3RydWN0aW9uIHdpbGwgYmUgY3JlYXRlZC4KKyAgICB2b2lkIHNldEN1cnJlbnREd2FyZkxvYyh1bnNpZ25lZCBGaWxlTnVtLCB1bnNpZ25lZCBMaW5lLCB1bnNpZ25lZCBDb2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmxhZ3MsIHVuc2lnbmVkIElzYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBEaXNjcmltaW5hdG9yKSB7CisgICAgICBDdXJyZW50RHdhcmZMb2Muc2V0RmlsZU51bShGaWxlTnVtKTsKKyAgICAgIEN1cnJlbnREd2FyZkxvYy5zZXRMaW5lKExpbmUpOworICAgICAgQ3VycmVudER3YXJmTG9jLnNldENvbHVtbihDb2x1bW4pOworICAgICAgQ3VycmVudER3YXJmTG9jLnNldEZsYWdzKEZsYWdzKTsKKyAgICAgIEN1cnJlbnREd2FyZkxvYy5zZXRJc2EoSXNhKTsKKyAgICAgIEN1cnJlbnREd2FyZkxvYy5zZXREaXNjcmltaW5hdG9yKERpc2NyaW1pbmF0b3IpOworICAgICAgRHdhcmZMb2NTZWVuID0gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIGNsZWFyRHdhcmZMb2NTZWVuKCkgeyBEd2FyZkxvY1NlZW4gPSBmYWxzZTsgfQorCisgICAgYm9vbCBnZXREd2FyZkxvY1NlZW4oKSB7IHJldHVybiBEd2FyZkxvY1NlZW47IH0KKyAgICBjb25zdCBNQ0R3YXJmTG9jICZnZXRDdXJyZW50RHdhcmZMb2MoKSB7IHJldHVybiBDdXJyZW50RHdhcmZMb2M7IH0KKworICAgIGJvb2wgZ2V0R2VuRHdhcmZGb3JBc3NlbWJseSgpIHsgcmV0dXJuIEdlbkR3YXJmRm9yQXNzZW1ibHk7IH0KKyAgICB2b2lkIHNldEdlbkR3YXJmRm9yQXNzZW1ibHkoYm9vbCBWYWx1ZSkgeyBHZW5Ed2FyZkZvckFzc2VtYmx5ID0gVmFsdWU7IH0KKyAgICB1bnNpZ25lZCBnZXRHZW5Ed2FyZkZpbGVOdW1iZXIoKSB7IHJldHVybiBHZW5Ed2FyZkZpbGVOdW1iZXI7IH0KKworICAgIHZvaWQgc2V0R2VuRHdhcmZGaWxlTnVtYmVyKHVuc2lnbmVkIEZpbGVOdW1iZXIpIHsKKyAgICAgIEdlbkR3YXJmRmlsZU51bWJlciA9IEZpbGVOdW1iZXI7CisgICAgfQorCisgICAgY29uc3QgU2V0VmVjdG9yPE1DU2VjdGlvbiAqPiAmZ2V0R2VuRHdhcmZTZWN0aW9uU3ltcygpIHsKKyAgICAgIHJldHVybiBTZWN0aW9uc0ZvclJhbmdlczsKKyAgICB9CisKKyAgICBib29sIGFkZEdlbkR3YXJmU2VjdGlvbihNQ1NlY3Rpb24gKlNlYykgeworICAgICAgcmV0dXJuIFNlY3Rpb25zRm9yUmFuZ2VzLmluc2VydChTZWMpOworICAgIH0KKworICAgIHZvaWQgZmluYWxpemVEd2FyZlNlY3Rpb25zKE1DU3RyZWFtZXIgJk1DT1MpOworCisgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TUNHZW5Ed2FyZkxhYmVsRW50cnk+ICZnZXRNQ0dlbkR3YXJmTGFiZWxFbnRyaWVzKCkgY29uc3QgeworICAgICAgcmV0dXJuIE1DR2VuRHdhcmZMYWJlbEVudHJpZXM7CisgICAgfQorCisgICAgdm9pZCBhZGRNQ0dlbkR3YXJmTGFiZWxFbnRyeShjb25zdCBNQ0dlbkR3YXJmTGFiZWxFbnRyeSAmRSkgeworICAgICAgTUNHZW5Ed2FyZkxhYmVsRW50cmllcy5wdXNoX2JhY2soRSk7CisgICAgfQorCisgICAgdm9pZCBzZXREd2FyZkRlYnVnRmxhZ3MoU3RyaW5nUmVmIFMpIHsgRHdhcmZEZWJ1Z0ZsYWdzID0gUzsgfQorICAgIFN0cmluZ1JlZiBnZXREd2FyZkRlYnVnRmxhZ3MoKSB7IHJldHVybiBEd2FyZkRlYnVnRmxhZ3M7IH0KKworICAgIHZvaWQgc2V0RHdhcmZEZWJ1Z1Byb2R1Y2VyKFN0cmluZ1JlZiBTKSB7IER3YXJmRGVidWdQcm9kdWNlciA9IFM7IH0KKyAgICBTdHJpbmdSZWYgZ2V0RHdhcmZEZWJ1Z1Byb2R1Y2VyKCkgeyByZXR1cm4gRHdhcmZEZWJ1Z1Byb2R1Y2VyOyB9CisKKyAgICBkd2FyZjo6RHdhcmZGb3JtYXQgZ2V0RHdhcmZGb3JtYXQoKSBjb25zdCB7CisgICAgICAvLyBUT0RPOiBTdXBwb3J0IERXQVJGNjQKKyAgICAgIHJldHVybiBkd2FyZjo6RFdBUkYzMjsKKyAgICB9CisKKyAgICB2b2lkIHNldER3YXJmVmVyc2lvbih1aW50MTZfdCB2KSB7IER3YXJmVmVyc2lvbiA9IHY7IH0KKyAgICB1aW50MTZfdCBnZXREd2FyZlZlcnNpb24oKSBjb25zdCB7IHJldHVybiBEd2FyZlZlcnNpb247IH0KKworICAgIC8vLyBAfQorCisgICAgY2hhciAqZ2V0U2VjdXJlTG9nRmlsZSgpIHsgcmV0dXJuIFNlY3VyZUxvZ0ZpbGU7IH0KKyAgICByYXdfZmRfb3N0cmVhbSAqZ2V0U2VjdXJlTG9nKCkgeyByZXR1cm4gU2VjdXJlTG9nLmdldCgpOyB9CisKKyAgICB2b2lkIHNldFNlY3VyZUxvZyhzdGQ6OnVuaXF1ZV9wdHI8cmF3X2ZkX29zdHJlYW0+IFZhbHVlKSB7CisgICAgICBTZWN1cmVMb2cgPSBzdGQ6Om1vdmUoVmFsdWUpOworICAgIH0KKworICAgIGJvb2wgZ2V0U2VjdXJlTG9nVXNlZCgpIHsgcmV0dXJuIFNlY3VyZUxvZ1VzZWQ7IH0KKyAgICB2b2lkIHNldFNlY3VyZUxvZ1VzZWQoYm9vbCBWYWx1ZSkgeyBTZWN1cmVMb2dVc2VkID0gVmFsdWU7IH0KKworICAgIHZvaWQgKmFsbG9jYXRlKHVuc2lnbmVkIFNpemUsIHVuc2lnbmVkIEFsaWduID0gOCkgeworICAgICAgcmV0dXJuIEFsbG9jYXRvci5BbGxvY2F0ZShTaXplLCBBbGlnbik7CisgICAgfQorCisgICAgdm9pZCBkZWFsbG9jYXRlKHZvaWQgKlB0cikge30KKworICAgIGJvb2wgaGFkRXJyb3IoKSB7IHJldHVybiBIYWRFcnJvcjsgfQorICAgIHZvaWQgcmVwb3J0RXJyb3IoU01Mb2MgTCwgY29uc3QgVHdpbmUgJk1zZyk7CisgICAgLy8gVW5yZWNvdmVyYWJsZSBlcnJvciBoYXMgb2NjdXJyZWQuIERpc3BsYXkgdGhlIGJlc3QgZGlhZ25vc3RpYyB3ZSBjYW4KKyAgICAvLyBhbmQgYmFpbCB2aWEgZXhpdCgxKS4gRm9yIG5vdywgbW9zdCBNQyBiYWNrZW5kIGVycm9ycyBhcmUgdW5yZWNvdmVyYWJsZS4KKyAgICAvLyBGSVhNRTogV2Ugc2hvdWxkIHJlYWxseSBkbyBzb21ldGhpbmcgYWJvdXQgdGhhdC4KKyAgICBMTFZNX0FUVFJJQlVURV9OT1JFVFVSTiB2b2lkIHJlcG9ydEZhdGFsRXJyb3IoU01Mb2MgTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk1zZyk7CisKKyAgICBjb25zdCBNQ0FzbU1hY3JvICpsb29rdXBNYWNybyhTdHJpbmdSZWYgTmFtZSkgeworICAgICAgU3RyaW5nTWFwPE1DQXNtTWFjcm8+OjppdGVyYXRvciBJID0gTWFjcm9NYXAuZmluZChOYW1lKTsKKyAgICAgIHJldHVybiAoSSA9PSBNYWNyb01hcC5lbmQoKSkgPyBudWxscHRyIDogJkktPmdldFZhbHVlKCk7CisgICAgfQorCisgICAgdm9pZCBkZWZpbmVNYWNybyhTdHJpbmdSZWYgTmFtZSwgTUNBc21NYWNybyBNYWNybykgeworICAgICAgTWFjcm9NYXAuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKE5hbWUsIHN0ZDo6bW92ZShNYWNybykpKTsKKyAgICB9CisKKyAgICB2b2lkIHVuZGVmaW5lTWFjcm8oU3RyaW5nUmVmIE5hbWUpIHsgTWFjcm9NYXAuZXJhc2UoTmFtZSk7IH0KKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworLy8gb3BlcmF0b3IgbmV3IGFuZCBkZWxldGUgYXJlbid0IGFsbG93ZWQgaW5zaWRlIG5hbWVzcGFjZXMuCisvLyBUaGUgdGhyb3cgc3BlY2lmaWNhdGlvbnMgYXJlIG1hbmRhdGVkIGJ5IHRoZSBzdGFuZGFyZC4KKy8vLyBcYnJpZWYgUGxhY2VtZW50IG5ldyBmb3IgdXNpbmcgdGhlIE1DQ29udGV4dCdzIGFsbG9jYXRvci4KKy8vLworLy8vIFRoaXMgcGxhY2VtZW50IGZvcm0gb2Ygb3BlcmF0b3IgbmV3IHVzZXMgdGhlIE1DQ29udGV4dCdzIGFsbG9jYXRvciBmb3IKKy8vLyBvYnRhaW5pbmcgbWVtb3J5LiBJdCBpcyBhIG5vbi10aHJvd2luZyBuZXcsIHdoaWNoIG1lYW5zIHRoYXQgaXQgcmV0dXJucworLy8vIG51bGwgb24gZXJyb3IuIChJZiB0aGF0IGlzIHdoYXQgdGhlIGFsbG9jYXRvciBkb2VzLiBUaGUgY3VycmVudCBkb2VzLCBzbyBpZgorLy8vIHRoaXMgZXZlciBjaGFuZ2VzLCB0aGlzIG9wZXJhdG9yIHdpbGwgaGF2ZSB0byBiZSBjaGFuZ2VkLCB0b28uKQorLy8vIFVzYWdlIGxvb2tzIGxpa2UgdGhpcyAoYXNzdW1pbmcgdGhlcmUncyBhbiBNQ0NvbnRleHQgJ0NvbnRleHQnIGluIHNjb3BlKToKKy8vLyBcY29kZQorLy8vIC8vIERlZmF1bHQgYWxpZ25tZW50ICg4KQorLy8vIEludGVnZXJMaXRlcmFsICpFeCA9IG5ldyAoQ29udGV4dCkgSW50ZWdlckxpdGVyYWwoYXJndW1lbnRzKTsKKy8vLyAvLyBTcGVjaWZpYyBhbGlnbm1lbnQKKy8vLyBJbnRlZ2VyTGl0ZXJhbCAqRXgyID0gbmV3IChDb250ZXh0LCA0KSBJbnRlZ2VyTGl0ZXJhbChhcmd1bWVudHMpOworLy8vIFxlbmRjb2RlCisvLy8gUGxlYXNlIG5vdGUgdGhhdCB5b3UgY2Fubm90IHVzZSBkZWxldGUgb24gdGhlIHBvaW50ZXI7IGl0IG11c3QgYmUKKy8vLyBkZWFsbG9jYXRlZCB1c2luZyBhbiBleHBsaWNpdCBkZXN0cnVjdG9yIGNhbGwgZm9sbG93ZWQgYnkKKy8vLyBcYyBDb250ZXh0LkRlYWxsb2NhdGUoUHRyKS4KKy8vLworLy8vIFxwYXJhbSBCeXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlLiBDYWxjdWxhdGVkIGJ5IHRoZSBjb21waWxlci4KKy8vLyBccGFyYW0gQyBUaGUgTUNDb250ZXh0IHRoYXQgcHJvdmlkZXMgdGhlIGFsbG9jYXRvci4KKy8vLyBccGFyYW0gQWxpZ25tZW50IFRoZSBhbGlnbm1lbnQgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgKGlmIHRoZSB1bmRlcmx5aW5nCisvLy8gICAgICAgICAgICAgICAgICBhbGxvY2F0b3Igc3VwcG9ydHMgaXQpLgorLy8vIFxyZXR1cm4gVGhlIGFsbG9jYXRlZCBtZW1vcnkuIENvdWxkIGJlIE5VTEwuCitpbmxpbmUgdm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBCeXRlcywgbGx2bTo6TUNDb250ZXh0ICZDLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgQWxpZ25tZW50ID0gOCkgbm9leGNlcHQgeworICByZXR1cm4gQy5hbGxvY2F0ZShCeXRlcywgQWxpZ25tZW50KTsKK30KKy8vLyBcYnJpZWYgUGxhY2VtZW50IGRlbGV0ZSBjb21wYW5pb24gdG8gdGhlIG5ldyBhYm92ZS4KKy8vLworLy8vIFRoaXMgb3BlcmF0b3IgaXMganVzdCBhIGNvbXBhbmlvbiB0byB0aGUgbmV3IGFib3ZlLiBUaGVyZSBpcyBubyB3YXkgb2YKKy8vLyBpbnZva2luZyBpdCBkaXJlY3RseTsgc2VlIHRoZSBuZXcgb3BlcmF0b3IgZm9yIG1vcmUgZGV0YWlscy4gVGhpcyBvcGVyYXRvcgorLy8vIGlzIGNhbGxlZCBpbXBsaWNpdGx5IGJ5IHRoZSBjb21waWxlciBpZiBhIHBsYWNlbWVudCBuZXcgZXhwcmVzc2lvbiB1c2luZworLy8vIHRoZSBNQ0NvbnRleHQgdGhyb3dzIGluIHRoZSBvYmplY3QgY29uc3RydWN0b3IuCitpbmxpbmUgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqUHRyLCBsbHZtOjpNQ0NvbnRleHQgJkMsIHNpemVfdCkgbm9leGNlcHQgeworICBDLmRlYWxsb2NhdGUoUHRyKTsKK30KKworLy8vIFRoaXMgcGxhY2VtZW50IGZvcm0gb2Ygb3BlcmF0b3IgbmV3W10gdXNlcyB0aGUgTUNDb250ZXh0J3MgYWxsb2NhdG9yIGZvcgorLy8vIG9idGFpbmluZyBtZW1vcnkuIEl0IGlzIGEgbm9uLXRocm93aW5nIG5ld1tdLCB3aGljaCBtZWFucyB0aGF0IGl0IHJldHVybnMKKy8vLyBudWxsIG9uIGVycm9yLgorLy8vIFVzYWdlIGxvb2tzIGxpa2UgdGhpcyAoYXNzdW1pbmcgdGhlcmUncyBhbiBNQ0NvbnRleHQgJ0NvbnRleHQnIGluIHNjb3BlKToKKy8vLyBcY29kZQorLy8vIC8vIERlZmF1bHQgYWxpZ25tZW50ICg4KQorLy8vIGNoYXIgKmRhdGEgPSBuZXcgKENvbnRleHQpIGNoYXJbMTBdOworLy8vIC8vIFNwZWNpZmljIGFsaWdubWVudAorLy8vIGNoYXIgKmRhdGEgPSBuZXcgKENvbnRleHQsIDQpIGNoYXJbMTBdOworLy8vIFxlbmRjb2RlCisvLy8gUGxlYXNlIG5vdGUgdGhhdCB5b3UgY2Fubm90IHVzZSBkZWxldGUgb24gdGhlIHBvaW50ZXI7IGl0IG11c3QgYmUKKy8vLyBkZWFsbG9jYXRlZCB1c2luZyBhbiBleHBsaWNpdCBkZXN0cnVjdG9yIGNhbGwgZm9sbG93ZWQgYnkKKy8vLyBcYyBDb250ZXh0LkRlYWxsb2NhdGUoUHRyKS4KKy8vLworLy8vIFxwYXJhbSBCeXRlcyBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFsbG9jYXRlLiBDYWxjdWxhdGVkIGJ5IHRoZSBjb21waWxlci4KKy8vLyBccGFyYW0gQyBUaGUgTUNDb250ZXh0IHRoYXQgcHJvdmlkZXMgdGhlIGFsbG9jYXRvci4KKy8vLyBccGFyYW0gQWxpZ25tZW50IFRoZSBhbGlnbm1lbnQgb2YgdGhlIGFsbG9jYXRlZCBtZW1vcnkgKGlmIHRoZSB1bmRlcmx5aW5nCisvLy8gICAgICAgICAgICAgICAgICBhbGxvY2F0b3Igc3VwcG9ydHMgaXQpLgorLy8vIFxyZXR1cm4gVGhlIGFsbG9jYXRlZCBtZW1vcnkuIENvdWxkIGJlIE5VTEwuCitpbmxpbmUgdm9pZCAqb3BlcmF0b3IgbmV3W10oc2l6ZV90IEJ5dGVzLCBsbHZtOjpNQ0NvbnRleHQgJkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEFsaWdubWVudCA9IDgpIG5vZXhjZXB0IHsKKyAgcmV0dXJuIEMuYWxsb2NhdGUoQnl0ZXMsIEFsaWdubWVudCk7Cit9CisKKy8vLyBcYnJpZWYgUGxhY2VtZW50IGRlbGV0ZVtdIGNvbXBhbmlvbiB0byB0aGUgbmV3W10gYWJvdmUuCisvLy8KKy8vLyBUaGlzIG9wZXJhdG9yIGlzIGp1c3QgYSBjb21wYW5pb24gdG8gdGhlIG5ld1tdIGFib3ZlLiBUaGVyZSBpcyBubyB3YXkgb2YKKy8vLyBpbnZva2luZyBpdCBkaXJlY3RseTsgc2VlIHRoZSBuZXdbXSBvcGVyYXRvciBmb3IgbW9yZSBkZXRhaWxzLiBUaGlzIG9wZXJhdG9yCisvLy8gaXMgY2FsbGVkIGltcGxpY2l0bHkgYnkgdGhlIGNvbXBpbGVyIGlmIGEgcGxhY2VtZW50IG5ld1tdIGV4cHJlc3Npb24gdXNpbmcKKy8vLyB0aGUgTUNDb250ZXh0IHRocm93cyBpbiB0aGUgb2JqZWN0IGNvbnN0cnVjdG9yLgoraW5saW5lIHZvaWQgb3BlcmF0b3IgZGVsZXRlW10odm9pZCAqUHRyLCBsbHZtOjpNQ0NvbnRleHQgJkMpIG5vZXhjZXB0IHsKKyAgQy5kZWFsbG9jYXRlKFB0cik7Cit9CisKKyNlbmRpZiAvLyBMTFZNX01DX01DQ09OVEVYVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRGlyZWN0aXZlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0RpcmVjdGl2ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Yzc0YjE2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0RpcmVjdGl2ZXMuaApAQCAtMCwwICsxLDczIEBACisvLz09PS0gTUNEaXJlY3RpdmVzLmggLSBFbnVtcyBmb3IgZGlyZWN0aXZlcyBvbiB2YXJpb3VzIHRhcmdldHMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHZhcmlvdXMgZW51bXMgdGhhdCByZXByZXNlbnQgdGFyZ2V0LXNwZWNpZmljIGRpcmVjdGl2ZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DRElSRUNUSVZFU19ICisjZGVmaW5lIExMVk1fTUNfTUNESVJFQ1RJVkVTX0gKKworbmFtZXNwYWNlIGxsdm0geworCitlbnVtIE1DU3ltYm9sQXR0ciB7CisgIE1DU0FfSW52YWxpZCA9IDAsICAgIC8vLzwgTm90IGEgdmFsaWQgZGlyZWN0aXZlLgorCisgIC8vIFZhcmlvdXMgZGlyZWN0aXZlcyBpbiBhbHBoYWJldGljYWwgb3JkZXIuCisgIE1DU0FfRUxGX1R5cGVGdW5jdGlvbiwgICAgLy8vPCAudHlwZSBfZm9vLCBTVFRfRlVOQyAgIyBha2EgQGZ1bmN0aW9uCisgIE1DU0FfRUxGX1R5cGVJbmRGdW5jdGlvbiwgLy8vPCAudHlwZSBfZm9vLCBTVFRfR05VX0lGVU5DCisgIE1DU0FfRUxGX1R5cGVPYmplY3QsICAgICAgLy8vPCAudHlwZSBfZm9vLCBTVFRfT0JKRUNUICAjIGFrYSBAb2JqZWN0CisgIE1DU0FfRUxGX1R5cGVUTFMsICAgICAgICAgLy8vPCAudHlwZSBfZm9vLCBTVFRfVExTICAgICAjIGFrYSBAdGxzX29iamVjdAorICBNQ1NBX0VMRl9UeXBlQ29tbW9uLCAgICAgIC8vLzwgLnR5cGUgX2ZvbywgU1RUX0NPTU1PTiAgIyBha2EgQGNvbW1vbgorICBNQ1NBX0VMRl9UeXBlTm9UeXBlLCAgICAgIC8vLzwgLnR5cGUgX2ZvbywgU1RUX05PVFlQRSAgIyBha2EgQG5vdHlwZQorICBNQ1NBX0VMRl9UeXBlR251VW5pcXVlT2JqZWN0LCAvLy8gLnR5cGUgX2ZvbywgQGdudV91bmlxdWVfb2JqZWN0CisgIE1DU0FfR2xvYmFsLCAgICAgICAgICAgICAgLy8vPCAuZ2xvYmwKKyAgTUNTQV9IaWRkZW4sICAgICAgICAgICAgICAvLy88IC5oaWRkZW4gKEVMRikKKyAgTUNTQV9JbmRpcmVjdFN5bWJvbCwgICAgICAvLy88IC5pbmRpcmVjdF9zeW1ib2wgKE1hY2hPKQorICBNQ1NBX0ludGVybmFsLCAgICAgICAgICAgIC8vLzwgLmludGVybmFsIChFTEYpCisgIE1DU0FfTGF6eVJlZmVyZW5jZSwgICAgICAgLy8vPCAubGF6eV9yZWZlcmVuY2UgKE1hY2hPKQorICBNQ1NBX0xvY2FsLCAgICAgICAgICAgICAgIC8vLzwgLmxvY2FsIChFTEYpCisgIE1DU0FfTm9EZWFkU3RyaXAsICAgICAgICAgLy8vPCAubm9fZGVhZF9zdHJpcCAoTWFjaE8pCisgIE1DU0FfU3ltYm9sUmVzb2x2ZXIsICAgICAgLy8vPCAuc3ltYm9sX3Jlc29sdmVyIChNYWNoTykKKyAgTUNTQV9BbHRFbnRyeSwgICAgICAgICAgICAvLy88IC5hbHRfZW50cnkgKE1hY2hPKQorICBNQ1NBX1ByaXZhdGVFeHRlcm4sICAgICAgIC8vLzwgLnByaXZhdGVfZXh0ZXJuIChNYWNoTykKKyAgTUNTQV9Qcm90ZWN0ZWQsICAgICAgICAgICAvLy88IC5wcm90ZWN0ZWQgKEVMRikKKyAgTUNTQV9SZWZlcmVuY2UsICAgICAgICAgICAvLy88IC5yZWZlcmVuY2UgKE1hY2hPKQorICBNQ1NBX1dlYWssICAgICAgICAgICAgICAgIC8vLzwgLndlYWsKKyAgTUNTQV9XZWFrRGVmaW5pdGlvbiwgICAgICAvLy88IC53ZWFrX2RlZmluaXRpb24gKE1hY2hPKQorICBNQ1NBX1dlYWtSZWZlcmVuY2UsICAgICAgIC8vLzwgLndlYWtfcmVmZXJlbmNlIChNYWNoTykKKyAgTUNTQV9XZWFrRGVmQXV0b1ByaXZhdGUgICAvLy88IC53ZWFrX2RlZl9jYW5fYmVfaGlkZGVuIChNYWNoTykKK307CisKK2VudW0gTUNBc3NlbWJsZXJGbGFnIHsKKyAgTUNBRl9TeW50YXhVbmlmaWVkLCAgICAgICAgIC8vLzwgLnN5bnRheCAoQVJNL0VMRikKKyAgTUNBRl9TdWJzZWN0aW9uc1ZpYVN5bWJvbHMsIC8vLzwgLnN1YnNlY3Rpb25zX3ZpYV9zeW1ib2xzIChNYWNoTykKKyAgTUNBRl9Db2RlMTYsICAgICAgICAgICAgICAgIC8vLzwgLmNvZGUxNiAoWDg2KSAvIC5jb2RlIDE2IChBUk0pCisgIE1DQUZfQ29kZTMyLCAgICAgICAgICAgICAgICAvLy88IC5jb2RlMzIgKFg4NikgLyAuY29kZSAzMiAoQVJNKQorICBNQ0FGX0NvZGU2NCAgICAgICAgICAgICAgICAgLy8vPCAuY29kZTY0IChYODYpCit9OworCitlbnVtIE1DRGF0YVJlZ2lvblR5cGUgeworICBNQ0RSX0RhdGFSZWdpb24sICAgICAgICAgICAgLy8vPCAuZGF0YV9yZWdpb24KKyAgTUNEUl9EYXRhUmVnaW9uSlQ4LCAgICAgICAgIC8vLzwgLmRhdGFfcmVnaW9uIGp0OAorICBNQ0RSX0RhdGFSZWdpb25KVDE2LCAgICAgICAgLy8vPCAuZGF0YV9yZWdpb24ganQxNgorICBNQ0RSX0RhdGFSZWdpb25KVDMyLCAgICAgICAgLy8vPCAuZGF0YV9yZWdpb24ganQzMgorICBNQ0RSX0RhdGFSZWdpb25FbmQgICAgICAgICAgLy8vPCAuZW5kX2RhdGFfcmVnaW9uCit9OworCitlbnVtIE1DVmVyc2lvbk1pblR5cGUgeworICBNQ1ZNX0lPU1ZlcnNpb25NaW4sICAgICAgICAgLy8vPCAuaW9zX3ZlcnNpb25fbWluCisgIE1DVk1fT1NYVmVyc2lvbk1pbiwgICAgICAgICAvLy88IC5tYWNvc3hfdmVyc2lvbl9taW4KKyAgTUNWTV9Udk9TVmVyc2lvbk1pbiwgICAgICAgIC8vLzwgLnR2b3NfdmVyc2lvbl9taW4KKyAgTUNWTV9XYXRjaE9TVmVyc2lvbk1pbiwgICAgIC8vLzwgLndhdGNob3NfdmVyc2lvbl9taW4KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0Rpc2Fzc2VtYmxlci9NQ0Rpc2Fzc2VtYmxlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0Rpc2Fzc2VtYmxlci9NQ0Rpc2Fzc2VtYmxlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmMDljMDUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRGlzYXNzZW1ibGVyL01DRGlzYXNzZW1ibGVyLmgKQEAgLTAsMCArMSwxMTUgQEAKKy8vPT09LSBsbHZtL01DL01DRGlzYXNzZW1ibGVyLmggLSBEaXNhc3NlbWJsZXIgaW50ZXJmYWNlIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0RJU0FTU0VNQkxFUl9NQ0RJU0FTU0VNQkxFUl9ICisjZGVmaW5lIExMVk1fTUNfTUNESVNBU1NFTUJMRVJfTUNESVNBU1NFTUJMRVJfSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ0Rpc2Fzc2VtYmxlci9NQ1N5bWJvbGl6ZXIuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7CitjbGFzcyBNQ0NvbnRleHQ7CitjbGFzcyBNQ0luc3Q7CitjbGFzcyBNQ1N1YnRhcmdldEluZm87CitjbGFzcyByYXdfb3N0cmVhbTsKKworLy8vIFN1cGVyY2xhc3MgZm9yIGFsbCBkaXNhc3NlbWJsZXJzLiBDb25zdW1lcyBhIG1lbW9yeSByZWdpb24gYW5kIHByb3ZpZGVzIGFuCisvLy8gYXJyYXkgb2YgYXNzZW1ibHkgaW5zdHJ1Y3Rpb25zLgorY2xhc3MgTUNEaXNhc3NlbWJsZXIgeworcHVibGljOgorICAvLy8gVGVybmFyeSBkZWNvZGUgc3RhdHVzLiBNb3N0IGJhY2tlbmRzIHdpbGwganVzdCB1c2UgRmFpbCBhbmQKKyAgLy8vIFN1Y2Nlc3MsIGhvd2V2ZXIgc29tZSBoYXZlIGEgY29uY2VwdCBvZiBhbiBpbnN0cnVjdGlvbiB3aXRoCisgIC8vLyB1bmRlcnN0YW5kYWJsZSBzZW1hbnRpY3MgYnV0IHdoaWNoIGlzIGFyY2hpdGVjdHVyYWxseQorICAvLy8gaW5jb3JyZWN0LiBBbiBleGFtcGxlIG9mIHRoaXMgaXMgQVJNIFVOUFJFRElDVEFCTEUgaW5zdHJ1Y3Rpb25zCisgIC8vLyB3aGljaCBhcmUgZGlzYXNzZW1ibGFibGUgYnV0IGNhdXNlIHVuZGVmaW5lZCBiZWhhdmlvdXIuCisgIC8vLworICAvLy8gQmVjYXVzZSBpdCBtYWtlcyBzZW5zZSB0byBkaXNhc3NlbWJsZSB0aGVzZSBpbnN0cnVjdGlvbnMsIHRoZXJlCisgIC8vLyBpcyBhICJzb2Z0IGZhaWwiIGZhaWx1cmUgbW9kZSB0aGF0IGluZGljYXRlcyB0aGUgTUNJbnN0JiBpcworICAvLy8gdmFsaWQgYnV0IGFyY2hpdGVjdHVyYWxseSBpbmNvcnJlY3QuCisgIC8vLworICAvLy8gVGhlIGVudW0gbnVtYmVycyBhcmUgZGVsaWJlcmF0ZWx5IGNob3NlbiBzdWNoIHRoYXQgcmVkdWN0aW9uCisgIC8vLyBmcm9tIFN1Y2Nlc3MtPlNvZnRGYWlsIC0+RmFpbCBjYW4gYmUgZG9uZSB3aXRoIGEgc2ltcGxlCisgIC8vLyBiaXR3aXNlLUFORDoKKyAgLy8vCisgIC8vLyAgIExFRlQgJiBUT1AgPSAgfCBTdWNjZXNzICAgICAgIFVucHJlZGljdGFibGUgICBGYWlsCisgIC8vLyAgIC0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vLyAgIFN1Y2Nlc3MgICAgICAgfCBTdWNjZXNzICAgICAgIFVucHJlZGljdGFibGUgICBGYWlsCisgIC8vLyAgIFVucHJlZGljdGFibGUgfCBVbnByZWRpY3RhYmxlIFVucHJlZGljdGFibGUgICBGYWlsCisgIC8vLyAgIEZhaWwgICAgICAgICAgfCBGYWlsICAgICAgICAgIEZhaWwgICAgICAgICAgICBGYWlsCisgIC8vLworICAvLy8gQW4gZWFzeSB3YXkgb2YgZW5jb2RpbmcgdGhpcyBpcyBhcyAwYjExLCAwYjAxLCAwYjAwIGZvcgorICAvLy8gU3VjY2VzcywgU29mdEZhaWwsIEZhaWwgcmVzcGVjdGl2ZWx5LgorICBlbnVtIERlY29kZVN0YXR1cyB7CisgICAgRmFpbCA9IDAsCisgICAgU29mdEZhaWwgPSAxLAorICAgIFN1Y2Nlc3MgPSAzCisgIH07CisKKyAgTUNEaXNhc3NlbWJsZXIoY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZTVEksIE1DQ29udGV4dCAmQ3R4KQorICAgIDogQ3R4KEN0eCksIFNUSShTVEkpIHt9CisKKyAgdmlydHVhbCB+TUNEaXNhc3NlbWJsZXIoKTsKKworICAvLy8gUmV0dXJucyB0aGUgZGlzYXNzZW1ibHkgb2YgYSBzaW5nbGUgaW5zdHJ1Y3Rpb24uCisgIC8vLworICAvLy8gXHBhcmFtIEluc3RyICAgIC0gQW4gTUNJbnN0IHRvIHBvcHVsYXRlIHdpdGggdGhlIGNvbnRlbnRzIG9mIHRoZQorICAvLy8gICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24uCisgIC8vLyBccGFyYW0gU2l6ZSAgICAgLSBBIHZhbHVlIHRvIHBvcHVsYXRlIHdpdGggdGhlIHNpemUgb2YgdGhlIGluc3RydWN0aW9uLCBvcgorICAvLy8gICAgICAgICAgICAgICAgICAgdGhlIG51bWJlciBvZiBieXRlcyBjb25zdW1lZCB3aGlsZSBhdHRlbXB0aW5nIHRvIGRlY29kZQorICAvLy8gICAgICAgICAgICAgICAgICAgYW4gaW52YWxpZCBpbnN0cnVjdGlvbi4KKyAgLy8vIFxwYXJhbSBBZGRyZXNzICAtIFRoZSBhZGRyZXNzLCBpbiB0aGUgbWVtb3J5IHNwYWNlIG9mIHJlZ2lvbiwgb2YgdGhlIGZpcnN0CisgIC8vLyAgICAgICAgICAgICAgICAgICBieXRlIG9mIHRoZSBpbnN0cnVjdGlvbi4KKyAgLy8vIFxwYXJhbSBCeXRlcyAgICAtIEEgcmVmZXJlbmNlIHRvIHRoZSBhY3R1YWwgYnl0ZXMgb2YgdGhlIGluc3RydWN0aW9uLgorICAvLy8gXHBhcmFtIFZTdHJlYW0gIC0gVGhlIHN0cmVhbSB0byBwcmludCB3YXJuaW5ncyBhbmQgZGlhZ25vc3RpYyBtZXNzYWdlcyBvbi4KKyAgLy8vIFxwYXJhbSBDU3RyZWFtICAtIFRoZSBzdHJlYW0gdG8gcHJpbnQgY29tbWVudHMgYW5kIGFubm90YXRpb25zIG9uLgorICAvLy8gXHJldHVybiAgICAgICAgIC0gTUNEaXNhc3NlbWJsZXI6OlN1Y2Nlc3MgaWYgdGhlIGluc3RydWN0aW9uIGlzIHZhbGlkLAorICAvLy8gICAgICAgICAgICAgICAgICAgTUNEaXNhc3NlbWJsZXI6OlNvZnRGYWlsIGlmIHRoZSBpbnN0cnVjdGlvbiB3YXMKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNhc3NlbWJsYWJsZSBidXQgaW52YWxpZCwKKyAgLy8vICAgICAgICAgICAgICAgICAgIE1DRGlzYXNzZW1ibGVyOjpGYWlsIGlmIHRoZSBpbnN0cnVjdGlvbiB3YXMgaW52YWxpZC4KKyAgdmlydHVhbCBEZWNvZGVTdGF0dXMgZ2V0SW5zdHJ1Y3Rpb24oTUNJbnN0ICZJbnN0ciwgdWludDY0X3QgJlNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+IEJ5dGVzLCB1aW50NjRfdCBBZGRyZXNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmVlN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJkNTdHJlYW0pIGNvbnN0ID0gMDsKKworcHJpdmF0ZToKKyAgTUNDb250ZXh0ICZDdHg7CisKK3Byb3RlY3RlZDoKKyAgLy8gU3VidGFyZ2V0IGluZm9ybWF0aW9uLCBmb3IgaW5zdHJ1Y3Rpb24gZGVjb2RpbmcgcHJlZGljYXRlcyBpZiByZXF1aXJlZC4KKyAgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZTVEk7CisgIHN0ZDo6dW5pcXVlX3B0cjxNQ1N5bWJvbGl6ZXI+IFN5bWJvbGl6ZXI7CisKK3B1YmxpYzoKKyAgLy8gSGVscGVycyBhcm91bmQgTUNTeW1ib2xpemVyCisgIGJvb2wgdHJ5QWRkaW5nU3ltYm9saWNPcGVyYW5kKE1DSW5zdCAmSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgQWRkcmVzcywgYm9vbCBJc0JyYW5jaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT2Zmc2V0LCB1aW50NjRfdCBJbnN0U2l6ZSkgY29uc3Q7CisKKyAgdm9pZCB0cnlBZGRpbmdQY0xvYWRSZWZlcmVuY2VDb21tZW50KGludDY0X3QgVmFsdWUsIHVpbnQ2NF90IEFkZHJlc3MpIGNvbnN0OworCisgIC8vLyBTZXQgXHAgU3ltemVyIGFzIHRoZSBjdXJyZW50IHN5bWJvbGl6ZXIuCisgIC8vLyBUaGlzIHRha2VzIG93bmVyc2hpcCBvZiBccCBTeW16ZXIsIGFuZCBkZWxldGVzIHRoZSBwcmV2aW91c2x5IHNldCBvbmUuCisgIHZvaWQgc2V0U3ltYm9saXplcihzdGQ6OnVuaXF1ZV9wdHI8TUNTeW1ib2xpemVyPiBTeW16ZXIpOworCisgIE1DQ29udGV4dCYgZ2V0Q29udGV4dCgpIGNvbnN0IHsgcmV0dXJuIEN0eDsgfQorCisgIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyYgZ2V0U3VidGFyZ2V0SW5mbygpIGNvbnN0IHsgcmV0dXJuIFNUSTsgfQorCisgIC8vIE1hcmtlZCBtdXRhYmxlIGJlY2F1c2Ugd2UgY2FjaGUgaXQgaW5zaWRlIHRoZSBkaXNhc3NlbWJsZXIsIHJhdGhlciB0aGFuCisgIC8vIGhhdmluZyB0byBwYXNzIGl0IGFyb3VuZCBhcyBhbiBhcmd1bWVudCB0aHJvdWdoIGFsbCB0aGUgYXV0b2dlbmVyYXRlZCBjb2RlLgorICBtdXRhYmxlIHJhd19vc3RyZWFtICpDb21tZW50U3RyZWFtID0gbnVsbHB0cjsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DRElTQVNTRU1CTEVSX01DRElTQVNTRU1CTEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNEaXNhc3NlbWJsZXIvTUNFeHRlcm5hbFN5bWJvbGl6ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNEaXNhc3NlbWJsZXIvTUNFeHRlcm5hbFN5bWJvbGl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZDNlNWQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0Rpc2Fzc2VtYmxlci9NQ0V4dGVybmFsU3ltYm9saXplci5oCkBAIC0wLDAgKzEsNTggQEAKKy8vPT09LS0gbGx2bS9NQy9NQ0V4dGVybmFsU3ltYm9saXplci5oIC0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgTUNFeHRlcm5hbFN5bWJvbGl6ZXIgY2xhc3MsIHdoaWNoCisvLyBlbmFibGVzIGxpYnJhcnkgdXNlcnMgdG8gcHJvdmlkZSBjYWxsYmFja3MgKHRocm91Z2ggdGhlIEMgQVBJKSB0byBkbyB0aGUKKy8vIHN5bWJvbGl6YXRpb24gZXh0ZXJuYWxseS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNESVNBU1NFTUJMRVJfTUNFWFRFUk5BTFNZTUJPTElaRVJfSAorI2RlZmluZSBMTFZNX01DX01DRElTQVNTRU1CTEVSX01DRVhURVJOQUxTWU1CT0xJWkVSX0gKKworI2luY2x1ZGUgImxsdm0tYy9EaXNhc3NlbWJsZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRGlzYXNzZW1ibGVyL01DU3ltYm9saXplci5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gXGJyaWVmIFN5bWJvbGl6ZSB1c2luZyB1c2VyLXByb3ZpZGVkLCBDIEFQSSwgY2FsbGJhY2tzLgorLy8vCisvLy8gU2VlIGxsdm0tYy9EaXNhc3NlbWJsZXIuaC4KK2NsYXNzIE1DRXh0ZXJuYWxTeW1ib2xpemVyIDogcHVibGljIE1DU3ltYm9saXplciB7Citwcm90ZWN0ZWQ6CisgIC8vLyBcbmFtZSBIb29rcyBmb3Igc3ltYm9saWMgZGlzYXNzZW1ibHkgdmlhIHRoZSBwdWJsaWMgJ0MnIGludGVyZmFjZS4KKyAgLy8vIEB7CisgIC8vLyBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBzeW1ib2xpYyBpbmZvcm1hdGlvbiBmb3Igb3BlcmFuZHMuCisgIExMVk1PcEluZm9DYWxsYmFjayBHZXRPcEluZm87CisgIC8vLyBUaGUgZnVuY3Rpb24gdG8gbG9va3VwIGEgc3ltYm9sIG5hbWUuCisgIExMVk1TeW1ib2xMb29rdXBDYWxsYmFjayBTeW1ib2xMb29rVXA7CisgIC8vLyBUaGUgcG9pbnRlciB0byB0aGUgYmxvY2sgb2Ygc3ltYm9saWMgaW5mb3JtYXRpb24gZm9yIGFib3ZlIGNhbGwgYmFjay4KKyAgdm9pZCAqRGlzSW5mbzsKKyAgLy8vIEB9CisKK3B1YmxpYzoKKyAgTUNFeHRlcm5hbFN5bWJvbGl6ZXIoTUNDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNQ1JlbG9jYXRpb25JbmZvPiBSZWxJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBMTFZNT3BJbmZvQ2FsbGJhY2sgZ2V0T3BJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBMTFZNU3ltYm9sTG9va3VwQ2FsbGJhY2sgc3ltYm9sTG9va1VwLCB2b2lkICpkaXNJbmZvKQorICAgIDogTUNTeW1ib2xpemVyKEN0eCwgc3RkOjptb3ZlKFJlbEluZm8pKSwgR2V0T3BJbmZvKGdldE9wSW5mbyksCisgICAgICBTeW1ib2xMb29rVXAoc3ltYm9sTG9va1VwKSwgRGlzSW5mbyhkaXNJbmZvKSB7fQorCisgIGJvb2wgdHJ5QWRkaW5nU3ltYm9saWNPcGVyYW5kKE1DSW5zdCAmTUksIHJhd19vc3RyZWFtICZDb21tZW50U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IFZhbHVlLCB1aW50NjRfdCBBZGRyZXNzLCBib29sIElzQnJhbmNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBPZmZzZXQsIHVpbnQ2NF90IEluc3RTaXplKSBvdmVycmlkZTsKKyAgdm9pZCB0cnlBZGRpbmdQY0xvYWRSZWZlcmVuY2VDb21tZW50KHJhd19vc3RyZWFtICZDb21tZW50U3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEFkZHJlc3MpIG92ZXJyaWRlOworfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNEaXNhc3NlbWJsZXIvTUNSZWxvY2F0aW9uSW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0Rpc2Fzc2VtYmxlci9NQ1JlbG9jYXRpb25JbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgzNmU4OAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNEaXNhc3NlbWJsZXIvTUNSZWxvY2F0aW9uSW5mby5oCkBAIC0wLDAgKzEsNDUgQEAKKy8vPT09LSBsbHZtL01DL01DUmVsb2NhdGlvbkluZm8uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBNQ1JlbG9jYXRpb25JbmZvIGNsYXNzLCB3aGljaCBwcm92aWRlcyBtZXRob2RzIHRvCisvLyBjcmVhdGUgTUNFeHBycyBmcm9tIHJlbG9jYXRpb25zLCBlaXRoZXIgZm91bmQgaW4gYW4gb2JqZWN0OjpPYmplY3RGaWxlCisvLyAob2JqZWN0OjpSZWxvY2F0aW9uUmVmKSwgb3IgcHJvdmlkZWQgdGhyb3VnaCB0aGUgQyBBUEkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DRElTQVNTRU1CTEVSX01DUkVMT0NBVElPTklORk9fSAorI2RlZmluZSBMTFZNX01DX01DRElTQVNTRU1CTEVSX01DUkVMT0NBVElPTklORk9fSAorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DQ29udGV4dDsKK2NsYXNzIE1DRXhwcjsKKworLy8vIFxicmllZiBDcmVhdGUgTUNFeHBycyBmcm9tIHJlbG9jYXRpb25zIGZvdW5kIGluIGFuIG9iamVjdCBmaWxlLgorY2xhc3MgTUNSZWxvY2F0aW9uSW5mbyB7Citwcm90ZWN0ZWQ6CisgIE1DQ29udGV4dCAmQ3R4OworCitwdWJsaWM6CisgIE1DUmVsb2NhdGlvbkluZm8oTUNDb250ZXh0ICZDdHgpOworICBNQ1JlbG9jYXRpb25JbmZvKGNvbnN0IE1DUmVsb2NhdGlvbkluZm8gJikgPSBkZWxldGU7CisgIE1DUmVsb2NhdGlvbkluZm8gJm9wZXJhdG9yPShjb25zdCBNQ1JlbG9jYXRpb25JbmZvICYpID0gZGVsZXRlOworICB2aXJ0dWFsIH5NQ1JlbG9jYXRpb25JbmZvKCk7CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYW4gTUNFeHByIGZvciB0aGUgdGFyZ2V0LXNwZWNpZmljIFxwIFZhcmlhbnRLaW5kLgorICAvLy8gVGhlIFZhcmlhbnRLaW5kcyBhcmUgZGVmaW5lZCBpbiBsbHZtLWMvRGlzYXNzZW1ibGVyLmguCisgIC8vLyBVc2VkIGJ5IE1DRXh0ZXJuYWxTeW1ib2xpemVyLgorICAvLy8gXHJldHVybnMgSWYgcG9zc2libGUsIGFuIE1DRXhwciBjb3JyZXNwb25kaW5nIHRvIFZhcmlhbnRLaW5kLCBlbHNlIDAuCisgIHZpcnR1YWwgY29uc3QgTUNFeHByICpjcmVhdGVFeHByRm9yQ0FQSVZhcmlhbnRLaW5kKGNvbnN0IE1DRXhwciAqU3ViRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVmFyaWFudEtpbmQpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNESVNBU1NFTUJMRVJfTUNSRUxPQ0FUSU9OSU5GT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRGlzYXNzZW1ibGVyL01DU3ltYm9saXplci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0Rpc2Fzc2VtYmxlci9NQ1N5bWJvbGl6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODVjZjVlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0Rpc2Fzc2VtYmxlci9NQ1N5bWJvbGl6ZXIuaApAQCAtMCwwICsxLDgzIEBACisvLz09PS0gbGx2bS9NQy9NQ1N5bWJvbGl6ZXIuaCAtIE1DU3ltYm9saXplciBjbGFzcyAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIE1DU3ltYm9saXplciBjbGFzcywgd2hpY2ggaXMgdXNlZAorLy8gdG8gc3ltYm9saXplIGluc3RydWN0aW9ucyBkZWNvZGVkIGZyb20gYW4gb2JqZWN0LCB0aGF0IGlzLCB0cmFuc2Zvcm0gdGhlaXIKKy8vIGltbWVkaWF0ZSBvcGVyYW5kcyB0byBNQ0V4cHJzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0RJU0FTU0VNQkxFUl9NQ1NZTUJPTElaRVJfSAorI2RlZmluZSBMTFZNX01DX01DRElTQVNTRU1CTEVSX01DU1lNQk9MSVpFUl9ICisKKyNpbmNsdWRlICJsbHZtL01DL01DRGlzYXNzZW1ibGVyL01DUmVsb2NhdGlvbkluZm8uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNJbnN0OworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vLyBcYnJpZWYgU3ltYm9saXplIGFuZCBhbm5vdGF0ZSBkaXNhc3NlbWJsZWQgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gRm9yIG5vdyB0aGlzIG1pbWljcyB0aGUgb2xkIHN5bWJvbGl6YXRpb24gbG9naWMgKGZyb20gYm90aCBBUk0gYW5kIHg4NiksIHRoYXQKKy8vLyByZWxpZWQgb24gdXNlci1wcm92aWRlZCAoQyBBUEkpIGNhbGxiYWNrcyB0byBkbyB0aGUgYWN0dWFsIHN5bWJvbCBsb29rdXAgaW4KKy8vLyB0aGUgb2JqZWN0IGZpbGUuIFRoaXMgd2FzIG1vdmVkIHRvIE1DRXh0ZXJuYWxTeW1ib2xpemVyLgorLy8vIEEgYmV0dGVyIEFQSSB3b3VsZCBub3QgcmVseSBvbiBhY3R1YWxseSBjYWxsaW5nIHRoZSB0d28gbWV0aG9kcyBoZXJlIGZyb20KKy8vLyBpbnNpZGUgZWFjaCBkaXNhc3NlbWJsZXIsIGJ1dCB3b3VsZCB1c2UgdGhlIGluc3RyIGluZm8gdG8gZGV0ZXJtaW5lIHdoYXQKKy8vLyBvcGVyYW5kcyBhcmUgYWN0dWFsbHkgc3ltYm9saXphYmxlLCBhbmQgaW4gd2hhdCB3YXkuIEkgZG9uJ3QgdGhpbmsgdGhpcworLy8vIGluZm9ybWF0aW9uIGV4aXN0cyByaWdodCBub3cuCitjbGFzcyBNQ1N5bWJvbGl6ZXIgeworcHJvdGVjdGVkOgorICBNQ0NvbnRleHQgJkN0eDsKKyAgc3RkOjp1bmlxdWVfcHRyPE1DUmVsb2NhdGlvbkluZm8+IFJlbEluZm87CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYW4gTUNTeW1ib2xpemVyLCB0YWtpbmcgb3duZXJzaGlwIG9mIFxwIFJlbEluZm8uCisgIE1DU3ltYm9saXplcihNQ0NvbnRleHQgJkN0eCwgc3RkOjp1bmlxdWVfcHRyPE1DUmVsb2NhdGlvbkluZm8+IFJlbEluZm8pCisgICAgOiBDdHgoQ3R4KSwgUmVsSW5mbyhzdGQ6Om1vdmUoUmVsSW5mbykpIHsKKyAgfQorCisgIE1DU3ltYm9saXplcihjb25zdCBNQ1N5bWJvbGl6ZXIgJikgPSBkZWxldGU7CisgIE1DU3ltYm9saXplciAmb3BlcmF0b3I9KGNvbnN0IE1DU3ltYm9saXplciAmKSA9IGRlbGV0ZTsKKyAgdmlydHVhbCB+TUNTeW1ib2xpemVyKCk7CisKKyAgLy8vIFxicmllZiBUcnkgdG8gYWRkIGEgc3ltYm9saWMgb3BlcmFuZCBpbnN0ZWFkIG9mIFxwIFZhbHVlIHRvIHRoZSBNQ0luc3QuCisgIC8vLworICAvLy8gSW5zdGVhZCBvZiBoYXZpbmcgYSBkaWZmaWN1bHQgdG8gcmVhZCBpbW1lZGlhdGUsIGEgc3ltYm9saWMgb3BlcmFuZCB3b3VsZAorICAvLy8gcmVwcmVzZW50IHRoaXMgaW1tZWRpYXRlIGluIGEgbW9yZSB1bmRlcnN0YW5kYWJsZSB3YXksIGZvciBpbnN0YW5jZSBhcyBhCisgIC8vLyBzeW1ib2wgb3IgYW4gb2Zmc2V0IGZyb20gYSBzeW1ib2wuIFJlbG9jYXRpb25zIGNhbiBhbHNvIGJlIHVzZWQgdG8gZW5yaWNoCisgIC8vLyB0aGUgc3ltYm9saWMgZXhwcmVzc2lvbi4KKyAgLy8vIFxwYXJhbSBJbnN0ICAgICAgLSBUaGUgTUNJbnN0IHdoZXJlIHRvIGluc2VydCB0aGUgc3ltYm9saWMgb3BlcmFuZC4KKyAgLy8vIFxwYXJhbSBjU3RyZWFtICAgLSBTdHJlYW0gdG8gcHJpbnQgY29tbWVudHMgYW5kIGFubm90YXRpb25zIG9uLgorICAvLy8gXHBhcmFtIFZhbHVlICAgICAtIE9wZXJhbmQgdmFsdWUsIHBjLWFkanVzdGVkIGJ5IHRoZSBjYWxsZXIgaWYgbmVjZXNzYXJ5LgorICAvLy8gXHBhcmFtIEFkZHJlc3MgICAtIExvYWQgYWRkcmVzcyBvZiB0aGUgaW5zdHJ1Y3Rpb24uCisgIC8vLyBccGFyYW0gSXNCcmFuY2ggIC0gSXMgdGhlIGluc3RydWN0aW9uIGEgYnJhbmNoPworICAvLy8gXHBhcmFtIE9mZnNldCAgICAtIEJ5dGUgb2Zmc2V0IG9mIHRoZSBvcGVyYW5kIGluc2lkZSB0aGUgaW5zdC4KKyAgLy8vIFxwYXJhbSBJbnN0U2l6ZSAgLSBTaXplIG9mIHRoZSBpbnN0cnVjdGlvbiBpbiBieXRlcy4KKyAgLy8vIFxyZXR1cm4gV2hldGhlciBhIHN5bWJvbGljIG9wZXJhbmQgd2FzIGFkZGVkLgorICB2aXJ0dWFsIGJvb2wgdHJ5QWRkaW5nU3ltYm9saWNPcGVyYW5kKE1DSW5zdCAmSW5zdCwgcmF3X29zdHJlYW0gJmNTdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBWYWx1ZSwgdWludDY0X3QgQWRkcmVzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzQnJhbmNoLCB1aW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgSW5zdFNpemUpID0gMDsKKworICAvLy8gXGJyaWVmIFRyeSB0byBhZGQgYSBjb21tZW50IG9uIHRoZSBQQy1yZWxhdGl2ZSBsb2FkLgorICAvLy8gRm9yIGluc3RhbmNlLCBpbiBNYWNoLU8sIHRoaXMgaXMgdXNlZCB0byBhZGQgYW5ub3RhdGlvbnMgdG8gaW5zdHJ1Y3Rpb25zCisgIC8vLyB0aGF0IHVzZSBDIHN0cmluZyBsaXRlcmFscywgYXMgZm91bmQgaW4gX19jc3RyaW5nLgorICB2aXJ0dWFsIHZvaWQgdHJ5QWRkaW5nUGNMb2FkUmVmZXJlbmNlQ29tbWVudChyYXdfb3N0cmVhbSAmY1N0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgQWRkcmVzcykgPSAwOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNESVNBU1NFTUJMRVJfTUNTWU1CT0xJWkVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNEd2FyZi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0R3YXJmLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWNkYjE3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNEd2FyZi5oCkBAIC0wLDAgKzEsNTc4IEBACisvLz09PS0gTUNEd2FyZi5oIC0gTWFjaGluZSBDb2RlIER3YXJmIHN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgZGVjbGFyYXRpb24gb2YgdGhlIE1DRHdhcmZGaWxlIHRvIHN1cHBvcnQgdGhlIGR3YXJmCisvLyAuZmlsZSBkaXJlY3RpdmUgYW5kIHRoZSAubG9jIGRpcmVjdGl2ZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNEV0FSRl9ICisjZGVmaW5lIExMVk1fTUNfTUNEV0FSRl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9NYXBWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTUQ1LmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7CitjbGFzcyBNQ0FzbUJhY2tlbmQ7CitjbGFzcyBNQ0NvbnRleHQ7CitjbGFzcyBNQ0R3YXJmTGluZVN0cjsKK2NsYXNzIE1DT2JqZWN0U3RyZWFtZXI7CitjbGFzcyBNQ1N0cmVhbWVyOworY2xhc3MgTUNTeW1ib2w7CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFNNTG9jOworY2xhc3MgU291cmNlTWdyOworCisvLy8gXGJyaWVmIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCB0aGUgbmFtZSBvZiB0aGUgZHdhcmYKKy8vLyAuZmlsZSBkaXJlY3RpdmUgYW5kIGl0cyBhc3NvY2lhdGVkIGR3YXJmIGZpbGUgbnVtYmVyIGluIHRoZSBNQyBmaWxlLAorLy8vIGFuZCBNQ0R3YXJmRmlsZSdzIGFyZSBjcmVhdGVkIGFuZCB1bmlxdWVkIGJ5IHRoZSBNQ0NvbnRleHQgY2xhc3Mgd2hlcmUKKy8vLyB0aGUgZmlsZSBudW1iZXIgZm9yIGVhY2ggaXMgaXRzIGluZGV4IGludG8gdGhlIHZlY3RvciBvZiBEd2FyZkZpbGVzIChub3RlCisvLy8gaW5kZXggMCBpcyBub3QgdXNlZCBhbmQgbm90IGEgdmFsaWQgZHdhcmYgZmlsZSBudW1iZXIpLgorc3RydWN0IE1DRHdhcmZGaWxlIHsKKyAgLy8gXGJyaWVmIFRoZSBiYXNlIG5hbWUgb2YgdGhlIGZpbGUgd2l0aG91dCBpdHMgZGlyZWN0b3J5IHBhdGguCisgIHN0ZDo6c3RyaW5nIE5hbWU7CisKKyAgLy8gXGJyaWVmIFRoZSBpbmRleCBpbnRvIHRoZSBsaXN0IG9mIGRpcmVjdG9yeSBuYW1lcyBmb3IgdGhpcyBmaWxlIG5hbWUuCisgIHVuc2lnbmVkIERpckluZGV4OworCisgIC8vLyBUaGUgTUQ1IGNoZWNrc3VtLCBpZiB0aGVyZSBpcyBvbmUuIE5vbi1vd25pbmcgcG9pbnRlciB0byBkYXRhIGFsbG9jYXRlZAorICAvLy8gaW4gTUNDb250ZXh0LgorICBNRDU6Ok1ENVJlc3VsdCAqQ2hlY2tzdW0gPSBudWxscHRyOworCisgIC8vLyBUaGUgc291cmNlIGNvZGUgb2YgdGhlIGZpbGUuIE5vbi1vd25pbmcgcmVmZXJlbmNlIHRvIGRhdGEgYWxsb2NhdGVkIGluCisgIC8vLyBNQ0NvbnRleHQuCisgIE9wdGlvbmFsPFN0cmluZ1JlZj4gU291cmNlOworfTsKKworLy8vIFxicmllZiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgdGhlIGluZm9ybWF0aW9uIGZyb20gYQorLy8vIGR3YXJmIC5sb2MgZGlyZWN0aXZlLgorY2xhc3MgTUNEd2FyZkxvYyB7CisgIHVpbnQzMl90IEZpbGVOdW07CisgIHVpbnQzMl90IExpbmU7CisgIHVpbnQxNl90IENvbHVtbjsKKyAgLy8gRmxhZ3MgKHNlZSAjZGVmaW5lJ3MgYmVsb3cpCisgIHVpbnQ4X3QgRmxhZ3M7CisgIHVpbnQ4X3QgSXNhOworICB1aW50MzJfdCBEaXNjcmltaW5hdG9yOworCisvLyBGbGFnIHRoYXQgaW5kaWNhdGVzIHRoZSBpbml0aWFsIHZhbHVlIG9mIHRoZSBpc19zdG10X3N0YXJ0IGZsYWcuCisjZGVmaW5lIERXQVJGMl9MSU5FX0RFRkFVTFRfSVNfU1RNVCAxCisKKyNkZWZpbmUgRFdBUkYyX0ZMQUdfSVNfU1RNVCAoMSA8PCAwKQorI2RlZmluZSBEV0FSRjJfRkxBR19CQVNJQ19CTE9DSyAoMSA8PCAxKQorI2RlZmluZSBEV0FSRjJfRkxBR19QUk9MT0dVRV9FTkQgKDEgPDwgMikKKyNkZWZpbmUgRFdBUkYyX0ZMQUdfRVBJTE9HVUVfQkVHSU4gKDEgPDwgMykKKworcHJpdmF0ZTogLy8gTUNDb250ZXh0IG1hbmFnZXMgdGhlc2UKKyAgZnJpZW5kIGNsYXNzIE1DQ29udGV4dDsKKyAgZnJpZW5kIGNsYXNzIE1DRHdhcmZMaW5lRW50cnk7CisKKyAgTUNEd2FyZkxvYyh1bnNpZ25lZCBmaWxlTnVtLCB1bnNpZ25lZCBsaW5lLCB1bnNpZ25lZCBjb2x1bW4sIHVuc2lnbmVkIGZsYWdzLAorICAgICAgICAgICAgIHVuc2lnbmVkIGlzYSwgdW5zaWduZWQgZGlzY3JpbWluYXRvcikKKyAgICAgIDogRmlsZU51bShmaWxlTnVtKSwgTGluZShsaW5lKSwgQ29sdW1uKGNvbHVtbiksIEZsYWdzKGZsYWdzKSwgSXNhKGlzYSksCisgICAgICAgIERpc2NyaW1pbmF0b3IoZGlzY3JpbWluYXRvcikge30KKworICAvLyBBbGxvdyB0aGUgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBhc3NpZ25tZW50IG9wZXJhdG9yIHRvIGJlIHVzZWQKKyAgLy8gZm9yIGFuIE1DRHdhcmZMb2Mgb2JqZWN0LgorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgR2V0IHRoZSBGaWxlTnVtIG9mIHRoaXMgTUNEd2FyZkxvYy4KKyAgdW5zaWduZWQgZ2V0RmlsZU51bSgpIGNvbnN0IHsgcmV0dXJuIEZpbGVOdW07IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgTGluZSBvZiB0aGlzIE1DRHdhcmZMb2MuCisgIHVuc2lnbmVkIGdldExpbmUoKSBjb25zdCB7IHJldHVybiBMaW5lOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIENvbHVtbiBvZiB0aGlzIE1DRHdhcmZMb2MuCisgIHVuc2lnbmVkIGdldENvbHVtbigpIGNvbnN0IHsgcmV0dXJuIENvbHVtbjsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBGbGFncyBvZiB0aGlzIE1DRHdhcmZMb2MuCisgIHVuc2lnbmVkIGdldEZsYWdzKCkgY29uc3QgeyByZXR1cm4gRmxhZ3M7IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgSXNhIG9mIHRoaXMgTUNEd2FyZkxvYy4KKyAgdW5zaWduZWQgZ2V0SXNhKCkgY29uc3QgeyByZXR1cm4gSXNhOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIERpc2NyaW1pbmF0b3Igb2YgdGhpcyBNQ0R3YXJmTG9jLgorICB1bnNpZ25lZCBnZXREaXNjcmltaW5hdG9yKCkgY29uc3QgeyByZXR1cm4gRGlzY3JpbWluYXRvcjsgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBGaWxlTnVtIG9mIHRoaXMgTUNEd2FyZkxvYy4KKyAgdm9pZCBzZXRGaWxlTnVtKHVuc2lnbmVkIGZpbGVOdW0pIHsgRmlsZU51bSA9IGZpbGVOdW07IH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgTGluZSBvZiB0aGlzIE1DRHdhcmZMb2MuCisgIHZvaWQgc2V0TGluZSh1bnNpZ25lZCBsaW5lKSB7IExpbmUgPSBsaW5lOyB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIENvbHVtbiBvZiB0aGlzIE1DRHdhcmZMb2MuCisgIHZvaWQgc2V0Q29sdW1uKHVuc2lnbmVkIGNvbHVtbikgeworICAgIGFzc2VydChjb2x1bW4gPD0gVUlOVDE2X01BWCk7CisgICAgQ29sdW1uID0gY29sdW1uOworICB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIEZsYWdzIG9mIHRoaXMgTUNEd2FyZkxvYy4KKyAgdm9pZCBzZXRGbGFncyh1bnNpZ25lZCBmbGFncykgeworICAgIGFzc2VydChmbGFncyA8PSBVSU5UOF9NQVgpOworICAgIEZsYWdzID0gZmxhZ3M7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgSXNhIG9mIHRoaXMgTUNEd2FyZkxvYy4KKyAgdm9pZCBzZXRJc2EodW5zaWduZWQgaXNhKSB7CisgICAgYXNzZXJ0KGlzYSA8PSBVSU5UOF9NQVgpOworICAgIElzYSA9IGlzYTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBEaXNjcmltaW5hdG9yIG9mIHRoaXMgTUNEd2FyZkxvYy4KKyAgdm9pZCBzZXREaXNjcmltaW5hdG9yKHVuc2lnbmVkIGRpc2NyaW1pbmF0b3IpIHsKKyAgICBEaXNjcmltaW5hdG9yID0gZGlzY3JpbWluYXRvcjsKKyAgfQorfTsKKworLy8vIFxicmllZiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgdGhlIGxpbmUgaW5mb3JtYXRpb24gZm9yCisvLy8gdGhlIGR3YXJmIGxpbmUgdGFibGUgZW50cmllcy4gIFdoaWNoIGlzIGNyZWF0ZWQgYWZ0ZXIgYSBtYWNoaW5lCisvLy8gaW5zdHJ1Y3Rpb24gaXMgYXNzZW1ibGVkIGFuZCB1c2VzIGFuIGFkZHJlc3MgZnJvbSBhIHRlbXBvcmFyeSBsYWJlbAorLy8vIGNyZWF0ZWQgYXQgdGhlIGN1cnJlbnQgYWRkcmVzcyBpbiB0aGUgY3VycmVudCBzZWN0aW9uIGFuZCB0aGUgaW5mbyBmcm9tCisvLy8gdGhlIGxhc3QgLmxvYyBkaXJlY3RpdmUgc2VlbiBhcyBzdG9yZWQgaW4gdGhlIGNvbnRleHQuCitjbGFzcyBNQ0R3YXJmTGluZUVudHJ5IDogcHVibGljIE1DRHdhcmZMb2MgeworICBNQ1N5bWJvbCAqTGFiZWw7CisKK3ByaXZhdGU6CisgIC8vIEFsbG93IHRoZSBkZWZhdWx0IGNvcHkgY29uc3RydWN0b3IgYW5kIGFzc2lnbm1lbnQgb3BlcmF0b3IgdG8gYmUgdXNlZAorICAvLyBmb3IgYW4gTUNEd2FyZkxpbmVFbnRyeSBvYmplY3QuCisKK3B1YmxpYzoKKyAgLy8gQ29uc3RydWN0b3IgdG8gY3JlYXRlIGFuIE1DRHdhcmZMaW5lRW50cnkgZ2l2ZW4gYSBzeW1ib2wgYW5kIHRoZSBkd2FyZiBsb2MuCisgIE1DRHdhcmZMaW5lRW50cnkoTUNTeW1ib2wgKmxhYmVsLCBjb25zdCBNQ0R3YXJmTG9jIGxvYykKKyAgICAgIDogTUNEd2FyZkxvYyhsb2MpLCBMYWJlbChsYWJlbCkge30KKworICBNQ1N5bWJvbCAqZ2V0TGFiZWwoKSBjb25zdCB7IHJldHVybiBMYWJlbDsgfQorCisgIC8vIFRoaXMgaXMgY2FsbGVkIHdoZW4gYW4gaW5zdHJ1Y3Rpb24gaXMgYXNzZW1ibGVkIGludG8gdGhlIHNwZWNpZmllZAorICAvLyBzZWN0aW9uIGFuZCBpZiB0aGVyZSBpcyBpbmZvcm1hdGlvbiBmcm9tIHRoZSBsYXN0IC5sb2MgZGlyZWN0aXZlIHRoYXQKKyAgLy8gaGFzIHlldCB0byBoYXZlIGEgbGluZSBlbnRyeSBtYWRlIGZvciBpdCBpcyBtYWRlLgorICBzdGF0aWMgdm9pZCBNYWtlKE1DT2JqZWN0U3RyZWFtZXIgKk1DT1MsIE1DU2VjdGlvbiAqU2VjdGlvbik7Cit9OworCisvLy8gXGJyaWVmIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCB0aGUgbGluZSBpbmZvcm1hdGlvbiBmb3IgYSBjb21waWxlCisvLy8gdW5pdCB3aGVyZSBtYWNoaW5lIGluc3RydWN0aW9ucyBoYXZlIGJlZW4gYXNzZW1ibGVkIGFmdGVyIHNlZWluZyAubG9jCisvLy8gZGlyZWN0aXZlcy4gIFRoaXMgaXMgdGhlIGluZm9ybWF0aW9uIHVzZWQgdG8gYnVpbGQgdGhlIGR3YXJmIGxpbmUKKy8vLyB0YWJsZSBmb3IgYSBzZWN0aW9uLgorY2xhc3MgTUNMaW5lU2VjdGlvbiB7CitwdWJsaWM6CisgIC8vIFxicmllZiBBZGQgYW4gZW50cnkgdG8gdGhpcyBNQ0xpbmVTZWN0aW9uJ3MgbGluZSBlbnRyaWVzLgorICB2b2lkIGFkZExpbmVFbnRyeShjb25zdCBNQ0R3YXJmTGluZUVudHJ5ICZMaW5lRW50cnksIE1DU2VjdGlvbiAqU2VjKSB7CisgICAgTUNMaW5lRGl2aXNpb25zW1NlY10ucHVzaF9iYWNrKExpbmVFbnRyeSk7CisgIH0KKworICB1c2luZyBNQ0R3YXJmTGluZUVudHJ5Q29sbGVjdGlvbiA9IHN0ZDo6dmVjdG9yPE1DRHdhcmZMaW5lRW50cnk+OworICB1c2luZyBpdGVyYXRvciA9IE1DRHdhcmZMaW5lRW50cnlDb2xsZWN0aW9uOjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBNQ0R3YXJmTGluZUVudHJ5Q29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIE1DTGluZURpdmlzaW9uTWFwID0gTWFwVmVjdG9yPE1DU2VjdGlvbiAqLCBNQ0R3YXJmTGluZUVudHJ5Q29sbGVjdGlvbj47CisKK3ByaXZhdGU6CisgIC8vIEEgY29sbGVjdGlvbiBvZiBNQ0R3YXJmTGluZUVudHJ5IGZvciBlYWNoIHNlY3Rpb24uCisgIE1DTGluZURpdmlzaW9uTWFwIE1DTGluZURpdmlzaW9uczsKKworcHVibGljOgorICAvLyBSZXR1cm5zIHRoZSBjb2xsZWN0aW9uIG9mIE1DRHdhcmZMaW5lRW50cnkgZm9yIGEgZ2l2ZW4gQ29tcGlsZSBVbml0IElELgorICBjb25zdCBNQ0xpbmVEaXZpc2lvbk1hcCAmZ2V0TUNMaW5lRW50cmllcygpIGNvbnN0IHsKKyAgICByZXR1cm4gTUNMaW5lRGl2aXNpb25zOworICB9Cit9OworCitzdHJ1Y3QgTUNEd2FyZkxpbmVUYWJsZVBhcmFtcyB7CisgIC8vLyBGaXJzdCBzcGVjaWFsIGxpbmUgb3Bjb2RlIC0gbGVhdmUgcm9vbSBmb3IgdGhlIHN0YW5kYXJkIG9wY29kZXMuCisgIC8vLyBOb3RlOiBJZiB5b3Ugd2FudCB0byBjaGFuZ2UgdGhpcywgeW91J2xsIGhhdmUgdG8gdXBkYXRlIHRoZQorICAvLy8gIlN0YW5kYXJkT3Bjb2RlTGVuZ3RocyIgdGFibGUgdGhhdCBpcyBlbWl0dGVkIGluCisgIC8vLyBcYyBFbWl0KCkuCisgIHVpbnQ4X3QgRFdBUkYyTGluZU9wY29kZUJhc2UgPSAxMzsKKyAgLy8vIE1pbmltdW0gbGluZSBvZmZzZXQgaW4gYSBzcGVjaWFsIGxpbmUgaW5mby4gb3Bjb2RlLiAgVGhlIHZhbHVlCisgIC8vLyAtNSB3YXMgY2hvc2VuIHRvIGdpdmUgYSByZWFzb25hYmxlIHJhbmdlIG9mIHZhbHVlcy4KKyAgaW50OF90IERXQVJGMkxpbmVCYXNlID0gLTU7CisgIC8vLyBSYW5nZSBvZiBsaW5lIG9mZnNldHMgaW4gYSBzcGVjaWFsIGxpbmUgaW5mby4gb3Bjb2RlLgorICB1aW50OF90IERXQVJGMkxpbmVSYW5nZSA9IDE0OworfTsKKworc3RydWN0IE1DRHdhcmZMaW5lVGFibGVIZWFkZXIgeworICBNQ1N5bWJvbCAqTGFiZWwgPSBudWxscHRyOworICBTbWFsbFZlY3RvcjxzdGQ6OnN0cmluZywgMz4gTUNEd2FyZkRpcnM7CisgIFNtYWxsVmVjdG9yPE1DRHdhcmZGaWxlLCAzPiBNQ0R3YXJmRmlsZXM7CisgIFN0cmluZ01hcDx1bnNpZ25lZD4gU291cmNlSWRNYXA7CisgIFN0cmluZ1JlZiBDb21waWxhdGlvbkRpcjsKKyAgTUNEd2FyZkZpbGUgUm9vdEZpbGU7CisgIGJvb2wgSGFzTUQ1ID0gZmFsc2U7CisgIGJvb2wgSGFzU291cmNlID0gZmFsc2U7CisKKyAgTUNEd2FyZkxpbmVUYWJsZUhlYWRlcigpID0gZGVmYXVsdDsKKworICBFeHBlY3RlZDx1bnNpZ25lZD4gdHJ5R2V0RmlsZShTdHJpbmdSZWYgJkRpcmVjdG9yeSwgU3RyaW5nUmVmICZGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUQ1OjpNRDVSZXN1bHQgKkNoZWNrc3VtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxTdHJpbmdSZWY+ICZTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZpbGVOdW1iZXIgPSAwKTsKKyAgc3RkOjpwYWlyPE1DU3ltYm9sICosIE1DU3ltYm9sICo+CisgIEVtaXQoTUNTdHJlYW1lciAqTUNPUywgTUNEd2FyZkxpbmVUYWJsZVBhcmFtcyBQYXJhbXMsCisgICAgICAgT3B0aW9uYWw8TUNEd2FyZkxpbmVTdHI+ICZMaW5lU3RyKSBjb25zdDsKKyAgc3RkOjpwYWlyPE1DU3ltYm9sICosIE1DU3ltYm9sICo+CisgIEVtaXQoTUNTdHJlYW1lciAqTUNPUywgTUNEd2FyZkxpbmVUYWJsZVBhcmFtcyBQYXJhbXMsCisgICAgICAgQXJyYXlSZWY8Y2hhcj4gU3BlY2lhbE9wY29kZUxlbmd0aHMsCisgICAgICAgT3B0aW9uYWw8TUNEd2FyZkxpbmVTdHI+ICZMaW5lU3RyKSBjb25zdDsKKworcHJpdmF0ZToKKyAgdm9pZCBlbWl0VjJGaWxlRGlyVGFibGVzKE1DU3RyZWFtZXIgKk1DT1MpIGNvbnN0OworICB2b2lkIGVtaXRWNUZpbGVEaXJUYWJsZXMoTUNTdHJlYW1lciAqTUNPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPE1DRHdhcmZMaW5lU3RyPiAmTGluZVN0cikgY29uc3Q7Cit9OworCitjbGFzcyBNQ0R3YXJmRHdvTGluZVRhYmxlIHsKKyAgTUNEd2FyZkxpbmVUYWJsZUhlYWRlciBIZWFkZXI7CisKK3B1YmxpYzoKKyAgdm9pZCBtYXliZVNldFJvb3RGaWxlKFN0cmluZ1JlZiBEaXJlY3RvcnksIFN0cmluZ1JlZiBGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1ENTo6TUQ1UmVzdWx0ICpDaGVja3N1bSwgT3B0aW9uYWw8U3RyaW5nUmVmPiBTb3VyY2UpIHsKKyAgICBpZiAoIUhlYWRlci5Sb290RmlsZS5OYW1lLmVtcHR5KCkpCisgICAgICByZXR1cm47CisgICAgSGVhZGVyLkNvbXBpbGF0aW9uRGlyID0gRGlyZWN0b3J5OworICAgIEhlYWRlci5Sb290RmlsZS5OYW1lID0gRmlsZU5hbWU7CisgICAgSGVhZGVyLlJvb3RGaWxlLkRpckluZGV4ID0gMDsKKyAgICBIZWFkZXIuUm9vdEZpbGUuQ2hlY2tzdW0gPSBDaGVja3N1bTsKKyAgICBIZWFkZXIuUm9vdEZpbGUuU291cmNlID0gU291cmNlOworICAgIEhlYWRlci5IYXNNRDUgPSAoQ2hlY2tzdW0gIT0gbnVsbHB0cik7CisgICAgSGVhZGVyLkhhc1NvdXJjZSA9IFNvdXJjZS5oYXNWYWx1ZSgpOworICB9CisKKyAgdW5zaWduZWQgZ2V0RmlsZShTdHJpbmdSZWYgRGlyZWN0b3J5LCBTdHJpbmdSZWYgRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgTUQ1OjpNRDVSZXN1bHQgKkNoZWNrc3VtLCBPcHRpb25hbDxTdHJpbmdSZWY+IFNvdXJjZSkgeworICAgIHJldHVybiBjYW50RmFpbChIZWFkZXIudHJ5R2V0RmlsZShEaXJlY3RvcnksIEZpbGVOYW1lLCBDaGVja3N1bSwgU291cmNlKSk7CisgIH0KKworICB2b2lkIEVtaXQoTUNTdHJlYW1lciAmTUNPUywgTUNEd2FyZkxpbmVUYWJsZVBhcmFtcyBQYXJhbXMsCisgICAgICAgICAgICBNQ1NlY3Rpb24gKlNlY3Rpb24pIGNvbnN0OworfTsKKworY2xhc3MgTUNEd2FyZkxpbmVUYWJsZSB7CisgIE1DRHdhcmZMaW5lVGFibGVIZWFkZXIgSGVhZGVyOworICBNQ0xpbmVTZWN0aW9uIE1DTGluZVNlY3Rpb25zOworCitwdWJsaWM6CisgIC8vIFRoaXMgZW1pdHMgdGhlIER3YXJmIGZpbGUgYW5kIHRoZSBsaW5lIHRhYmxlcyBmb3IgYWxsIENvbXBpbGUgVW5pdHMuCisgIHN0YXRpYyB2b2lkIEVtaXQoTUNPYmplY3RTdHJlYW1lciAqTUNPUywgTUNEd2FyZkxpbmVUYWJsZVBhcmFtcyBQYXJhbXMpOworCisgIC8vIFRoaXMgZW1pdHMgdGhlIER3YXJmIGZpbGUgYW5kIHRoZSBsaW5lIHRhYmxlcyBmb3IgYSBnaXZlbiBDb21waWxlIFVuaXQuCisgIHZvaWQgRW1pdENVKE1DT2JqZWN0U3RyZWFtZXIgKk1DT1MsIE1DRHdhcmZMaW5lVGFibGVQYXJhbXMgUGFyYW1zLAorICAgICAgICAgICAgICBPcHRpb25hbDxNQ0R3YXJmTGluZVN0cj4gJkxpbmVTdHIpIGNvbnN0OworCisgIEV4cGVjdGVkPHVuc2lnbmVkPiB0cnlHZXRGaWxlKFN0cmluZ1JlZiAmRGlyZWN0b3J5LCBTdHJpbmdSZWYgJkZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNRDU6Ok1ENVJlc3VsdCAqQ2hlY2tzdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPFN0cmluZ1JlZj4gU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGaWxlTnVtYmVyID0gMCk7CisgIHVuc2lnbmVkIGdldEZpbGUoU3RyaW5nUmVmICZEaXJlY3RvcnksIFN0cmluZ1JlZiAmRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgTUQ1OjpNRDVSZXN1bHQgKkNoZWNrc3VtLCBPcHRpb25hbDxTdHJpbmdSZWY+ICZTb3VyY2UsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmlsZU51bWJlciA9IDApIHsKKyAgICByZXR1cm4gY2FudEZhaWwodHJ5R2V0RmlsZShEaXJlY3RvcnksIEZpbGVOYW1lLCBDaGVja3N1bSwgU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVOdW1iZXIpKTsKKyAgfQorCisgIHZvaWQgc2V0Um9vdEZpbGUoU3RyaW5nUmVmIERpcmVjdG9yeSwgU3RyaW5nUmVmIEZpbGVOYW1lLAorICAgICAgICAgICAgICAgICAgIE1ENTo6TUQ1UmVzdWx0ICpDaGVja3N1bSwgT3B0aW9uYWw8U3RyaW5nUmVmPiBTb3VyY2UpIHsKKyAgICBIZWFkZXIuQ29tcGlsYXRpb25EaXIgPSBEaXJlY3Rvcnk7CisgICAgSGVhZGVyLlJvb3RGaWxlLk5hbWUgPSBGaWxlTmFtZTsKKyAgICBIZWFkZXIuUm9vdEZpbGUuRGlySW5kZXggPSAwOworICAgIEhlYWRlci5Sb290RmlsZS5DaGVja3N1bSA9IENoZWNrc3VtOworICAgIEhlYWRlci5Sb290RmlsZS5Tb3VyY2UgPSBTb3VyY2U7CisgICAgSGVhZGVyLkhhc01ENSA9IChDaGVja3N1bSAhPSBudWxscHRyKTsKKyAgICBIZWFkZXIuSGFzU291cmNlID0gU291cmNlLmhhc1ZhbHVlKCk7CisgIH0KKworICBNQ1N5bWJvbCAqZ2V0TGFiZWwoKSBjb25zdCB7CisgICAgcmV0dXJuIEhlYWRlci5MYWJlbDsKKyAgfQorCisgIHZvaWQgc2V0TGFiZWwoTUNTeW1ib2wgKkxhYmVsKSB7CisgICAgSGVhZGVyLkxhYmVsID0gTGFiZWw7CisgIH0KKworICBjb25zdCBTbWFsbFZlY3RvckltcGw8c3RkOjpzdHJpbmc+ICZnZXRNQ0R3YXJmRGlycygpIGNvbnN0IHsKKyAgICByZXR1cm4gSGVhZGVyLk1DRHdhcmZEaXJzOworICB9CisKKyAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6c3RyaW5nPiAmZ2V0TUNEd2FyZkRpcnMoKSB7CisgICAgcmV0dXJuIEhlYWRlci5NQ0R3YXJmRGlyczsKKyAgfQorCisgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxNQ0R3YXJmRmlsZT4gJmdldE1DRHdhcmZGaWxlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gSGVhZGVyLk1DRHdhcmZGaWxlczsKKyAgfQorCisgIFNtYWxsVmVjdG9ySW1wbDxNQ0R3YXJmRmlsZT4gJmdldE1DRHdhcmZGaWxlcygpIHsKKyAgICByZXR1cm4gSGVhZGVyLk1DRHdhcmZGaWxlczsKKyAgfQorCisgIGNvbnN0IE1DTGluZVNlY3Rpb24gJmdldE1DTGluZVNlY3Rpb25zKCkgY29uc3QgeworICAgIHJldHVybiBNQ0xpbmVTZWN0aW9uczsKKyAgfQorICBNQ0xpbmVTZWN0aW9uICZnZXRNQ0xpbmVTZWN0aW9ucygpIHsKKyAgICByZXR1cm4gTUNMaW5lU2VjdGlvbnM7CisgIH0KK307CisKK2NsYXNzIE1DRHdhcmZMaW5lQWRkciB7CitwdWJsaWM6CisgIC8vLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGVuY29kZSBhIER3YXJmIHBhaXIgb2YgTGluZURlbHRhIGFuZCBBZGRyRGVsdGFzLgorICBzdGF0aWMgdm9pZCBFbmNvZGUoTUNDb250ZXh0ICZDb250ZXh0LCBNQ0R3YXJmTGluZVRhYmxlUGFyYW1zIFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgTGluZURlbHRhLCB1aW50NjRfdCBBZGRyRGVsdGEsIHJhd19vc3RyZWFtICZPUyk7CisKKyAgLy8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gZW1pdCB0aGUgZW5jb2RpbmcgdG8gYSBzdHJlYW1lci4KKyAgc3RhdGljIHZvaWQgRW1pdChNQ1N0cmVhbWVyICpNQ09TLCBNQ0R3YXJmTGluZVRhYmxlUGFyYW1zIFBhcmFtcywKKyAgICAgICAgICAgICAgICAgICBpbnQ2NF90IExpbmVEZWx0YSwgdWludDY0X3QgQWRkckRlbHRhKTsKK307CisKK2NsYXNzIE1DR2VuRHdhcmZJbmZvIHsKK3B1YmxpYzoKKyAgLy8KKyAgLy8gV2hlbiBnZW5lcmF0aW5nIGR3YXJmIGZvciBhc3NlbWJseSBzb3VyY2UgZmlsZXMgdGhpcyBlbWl0cyB0aGUgRHdhcmYKKyAgLy8gc2VjdGlvbnMuCisgIC8vCisgIHN0YXRpYyB2b2lkIEVtaXQoTUNTdHJlYW1lciAqTUNPUyk7Cit9OworCisvLyBXaGVuIGdlbmVyYXRpbmcgZHdhcmYgZm9yIGFzc2VtYmx5IHNvdXJjZSBmaWxlcyB0aGlzIGlzIHRoZSBpbmZvIHRoYXQgaXMKKy8vIG5lZWRlZCB0byBiZSBnYXRoZXJlZCBmb3IgZWFjaCBzeW1ib2wgdGhhdCB3aWxsIGhhdmUgYSBkd2FyZiBsYWJlbC4KK2NsYXNzIE1DR2VuRHdhcmZMYWJlbEVudHJ5IHsKK3ByaXZhdGU6CisgIC8vIE5hbWUgb2YgdGhlIHN5bWJvbCB3aXRob3V0IGEgbGVhZGluZyB1bmRlcmJhciwgaWYgYW55LgorICBTdHJpbmdSZWYgTmFtZTsKKyAgLy8gVGhlIGR3YXJmIGZpbGUgbnVtYmVyIHRoaXMgc3ltYm9sIGlzIGluLgorICB1bnNpZ25lZCBGaWxlTnVtYmVyOworICAvLyBUaGUgbGluZSBudW1iZXIgdGhpcyBzeW1ib2wgaXMgYXQuCisgIHVuc2lnbmVkIExpbmVOdW1iZXI7CisgIC8vIFRoZSBsb3dfcGMgZm9yIHRoZSBkd2FyZiBsYWJlbCBpcyB0YWtlbiBmcm9tIHRoaXMgc3ltYm9sLgorICBNQ1N5bWJvbCAqTGFiZWw7CisKK3B1YmxpYzoKKyAgTUNHZW5Ed2FyZkxhYmVsRW50cnkoU3RyaW5nUmVmIG5hbWUsIHVuc2lnbmVkIGZpbGVOdW1iZXIsIHVuc2lnbmVkIGxpbmVOdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgIE1DU3ltYm9sICpsYWJlbCkKKyAgICAgIDogTmFtZShuYW1lKSwgRmlsZU51bWJlcihmaWxlTnVtYmVyKSwgTGluZU51bWJlcihsaW5lTnVtYmVyKSwKKyAgICAgICAgTGFiZWwobGFiZWwpIHt9CisKKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisgIHVuc2lnbmVkIGdldEZpbGVOdW1iZXIoKSBjb25zdCB7IHJldHVybiBGaWxlTnVtYmVyOyB9CisgIHVuc2lnbmVkIGdldExpbmVOdW1iZXIoKSBjb25zdCB7IHJldHVybiBMaW5lTnVtYmVyOyB9CisgIE1DU3ltYm9sICpnZXRMYWJlbCgpIGNvbnN0IHsgcmV0dXJuIExhYmVsOyB9CisKKyAgLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBsYWJlbCBpcyBjcmVhdGVkIHdoZW4gd2UgYXJlIGdlbmVyYXRpbmcgZHdhcmYgZm9yCisgIC8vIGFzc2VtYmx5IHNvdXJjZSBmaWxlcy4KKyAgc3RhdGljIHZvaWQgTWFrZShNQ1N5bWJvbCAqU3ltYm9sLCBNQ1N0cmVhbWVyICpNQ09TLCBTb3VyY2VNZ3IgJlNyY01nciwKKyAgICAgICAgICAgICAgICAgICBTTUxvYyAmTG9jKTsKK307CisKK2NsYXNzIE1DQ0ZJSW5zdHJ1Y3Rpb24geworcHVibGljOgorICBlbnVtIE9wVHlwZSB7CisgICAgT3BTYW1lVmFsdWUsCisgICAgT3BSZW1lbWJlclN0YXRlLAorICAgIE9wUmVzdG9yZVN0YXRlLAorICAgIE9wT2Zmc2V0LAorICAgIE9wRGVmQ2ZhUmVnaXN0ZXIsCisgICAgT3BEZWZDZmFPZmZzZXQsCisgICAgT3BEZWZDZmEsCisgICAgT3BSZWxPZmZzZXQsCisgICAgT3BBZGp1c3RDZmFPZmZzZXQsCisgICAgT3BFc2NhcGUsCisgICAgT3BSZXN0b3JlLAorICAgIE9wVW5kZWZpbmVkLAorICAgIE9wUmVnaXN0ZXIsCisgICAgT3BXaW5kb3dTYXZlLAorICAgIE9wR251QXJnc1NpemUKKyAgfTsKKworcHJpdmF0ZToKKyAgT3BUeXBlIE9wZXJhdGlvbjsKKyAgTUNTeW1ib2wgKkxhYmVsOworICB1bnNpZ25lZCBSZWdpc3RlcjsKKyAgdW5pb24geworICAgIGludCBPZmZzZXQ7CisgICAgdW5zaWduZWQgUmVnaXN0ZXIyOworICB9OworICBzdGQ6OnZlY3RvcjxjaGFyPiBWYWx1ZXM7CisKKyAgTUNDRklJbnN0cnVjdGlvbihPcFR5cGUgT3AsIE1DU3ltYm9sICpMLCB1bnNpZ25lZCBSLCBpbnQgTywgU3RyaW5nUmVmIFYpCisgICAgICA6IE9wZXJhdGlvbihPcCksIExhYmVsKEwpLCBSZWdpc3RlcihSKSwgT2Zmc2V0KE8pLAorICAgICAgICBWYWx1ZXMoVi5iZWdpbigpLCBWLmVuZCgpKSB7CisgICAgYXNzZXJ0KE9wICE9IE9wUmVnaXN0ZXIpOworICB9CisKKyAgTUNDRklJbnN0cnVjdGlvbihPcFR5cGUgT3AsIE1DU3ltYm9sICpMLCB1bnNpZ25lZCBSMSwgdW5zaWduZWQgUjIpCisgICAgICA6IE9wZXJhdGlvbihPcCksIExhYmVsKEwpLCBSZWdpc3RlcihSMSksIFJlZ2lzdGVyMihSMikgeworICAgIGFzc2VydChPcCA9PSBPcFJlZ2lzdGVyKTsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgLmNmaV9kZWZfY2ZhIGRlZmluZXMgYSBydWxlIGZvciBjb21wdXRpbmcgQ0ZBIGFzOiB0YWtlIGFkZHJlc3MgZnJvbQorICAvLy8gUmVnaXN0ZXIgYW5kIGFkZCBPZmZzZXQgdG8gaXQuCisgIHN0YXRpYyBNQ0NGSUluc3RydWN0aW9uIGNyZWF0ZURlZkNmYShNQ1N5bWJvbCAqTCwgdW5zaWduZWQgUmVnaXN0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgT2Zmc2V0KSB7CisgICAgcmV0dXJuIE1DQ0ZJSW5zdHJ1Y3Rpb24oT3BEZWZDZmEsIEwsIFJlZ2lzdGVyLCAtT2Zmc2V0LCAiIik7CisgIH0KKworICAvLy8gXGJyaWVmIC5jZmlfZGVmX2NmYV9yZWdpc3RlciBtb2RpZmllcyBhIHJ1bGUgZm9yIGNvbXB1dGluZyBDRkEuIEZyb20gbm93CisgIC8vLyBvbiBSZWdpc3RlciB3aWxsIGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUgb2xkIG9uZS4gT2Zmc2V0IHJlbWFpbnMgdGhlIHNhbWUuCisgIHN0YXRpYyBNQ0NGSUluc3RydWN0aW9uIGNyZWF0ZURlZkNmYVJlZ2lzdGVyKE1DU3ltYm9sICpMLCB1bnNpZ25lZCBSZWdpc3RlcikgeworICAgIHJldHVybiBNQ0NGSUluc3RydWN0aW9uKE9wRGVmQ2ZhUmVnaXN0ZXIsIEwsIFJlZ2lzdGVyLCAwLCAiIik7CisgIH0KKworICAvLy8gXGJyaWVmIC5jZmlfZGVmX2NmYV9vZmZzZXQgbW9kaWZpZXMgYSBydWxlIGZvciBjb21wdXRpbmcgQ0ZBLiBSZWdpc3RlcgorICAvLy8gcmVtYWlucyB0aGUgc2FtZSwgYnV0IG9mZnNldCBpcyBuZXcuIE5vdGUgdGhhdCBpdCBpcyB0aGUgYWJzb2x1dGUgb2Zmc2V0CisgIC8vLyB0aGF0IHdpbGwgYmUgYWRkZWQgdG8gYSBkZWZpbmVkIHJlZ2lzdGVyIHRvIHRoZSBjb21wdXRlIENGQSBhZGRyZXNzLgorICBzdGF0aWMgTUNDRklJbnN0cnVjdGlvbiBjcmVhdGVEZWZDZmFPZmZzZXQoTUNTeW1ib2wgKkwsIGludCBPZmZzZXQpIHsKKyAgICByZXR1cm4gTUNDRklJbnN0cnVjdGlvbihPcERlZkNmYU9mZnNldCwgTCwgMCwgLU9mZnNldCwgIiIpOworICB9CisKKyAgLy8vIFxicmllZiAuY2ZpX2FkanVzdF9jZmFfb2Zmc2V0IFNhbWUgYXMgLmNmaV9kZWZfY2ZhX29mZnNldCwgYnV0CisgIC8vLyBPZmZzZXQgaXMgYSByZWxhdGl2ZSB2YWx1ZSB0aGF0IGlzIGFkZGVkL3N1YnRyYWN0ZWQgZnJvbSB0aGUgcHJldmlvdXMKKyAgLy8vIG9mZnNldC4KKyAgc3RhdGljIE1DQ0ZJSW5zdHJ1Y3Rpb24gY3JlYXRlQWRqdXN0Q2ZhT2Zmc2V0KE1DU3ltYm9sICpMLCBpbnQgQWRqdXN0bWVudCkgeworICAgIHJldHVybiBNQ0NGSUluc3RydWN0aW9uKE9wQWRqdXN0Q2ZhT2Zmc2V0LCBMLCAwLCBBZGp1c3RtZW50LCAiIik7CisgIH0KKworICAvLy8gXGJyaWVmIC5jZmlfb2Zmc2V0IFByZXZpb3VzIHZhbHVlIG9mIFJlZ2lzdGVyIGlzIHNhdmVkIGF0IG9mZnNldCBPZmZzZXQKKyAgLy8vIGZyb20gQ0ZBLgorICBzdGF0aWMgTUNDRklJbnN0cnVjdGlvbiBjcmVhdGVPZmZzZXQoTUNTeW1ib2wgKkwsIHVuc2lnbmVkIFJlZ2lzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IE9mZnNldCkgeworICAgIHJldHVybiBNQ0NGSUluc3RydWN0aW9uKE9wT2Zmc2V0LCBMLCBSZWdpc3RlciwgT2Zmc2V0LCAiIik7CisgIH0KKworICAvLy8gXGJyaWVmIC5jZmlfcmVsX29mZnNldCBQcmV2aW91cyB2YWx1ZSBvZiBSZWdpc3RlciBpcyBzYXZlZCBhdCBvZmZzZXQKKyAgLy8vIE9mZnNldCBmcm9tIHRoZSBjdXJyZW50IENGQSByZWdpc3Rlci4gVGhpcyBpcyB0cmFuc2Zvcm1lZCB0byAuY2ZpX29mZnNldAorICAvLy8gdXNpbmcgdGhlIGtub3duIGRpc3BsYWNlbWVudCBvZiB0aGUgQ0ZBIHJlZ2lzdGVyIGZyb20gdGhlIENGQS4KKyAgc3RhdGljIE1DQ0ZJSW5zdHJ1Y3Rpb24gY3JlYXRlUmVsT2Zmc2V0KE1DU3ltYm9sICpMLCB1bnNpZ25lZCBSZWdpc3RlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBPZmZzZXQpIHsKKyAgICByZXR1cm4gTUNDRklJbnN0cnVjdGlvbihPcFJlbE9mZnNldCwgTCwgUmVnaXN0ZXIsIE9mZnNldCwgIiIpOworICB9CisKKyAgLy8vIFxicmllZiAuY2ZpX3JlZ2lzdGVyIFByZXZpb3VzIHZhbHVlIG9mIFJlZ2lzdGVyMSBpcyBzYXZlZCBpbgorICAvLy8gcmVnaXN0ZXIgUmVnaXN0ZXIyLgorICBzdGF0aWMgTUNDRklJbnN0cnVjdGlvbiBjcmVhdGVSZWdpc3RlcihNQ1N5bWJvbCAqTCwgdW5zaWduZWQgUmVnaXN0ZXIxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZWdpc3RlcjIpIHsKKyAgICByZXR1cm4gTUNDRklJbnN0cnVjdGlvbihPcFJlZ2lzdGVyLCBMLCBSZWdpc3RlcjEsIFJlZ2lzdGVyMik7CisgIH0KKworICAvLy8gXGJyaWVmIC5jZmlfd2luZG93X3NhdmUgU1BBUkMgcmVnaXN0ZXIgd2luZG93IGlzIHNhdmVkLgorICBzdGF0aWMgTUNDRklJbnN0cnVjdGlvbiBjcmVhdGVXaW5kb3dTYXZlKE1DU3ltYm9sICpMKSB7CisgICAgcmV0dXJuIE1DQ0ZJSW5zdHJ1Y3Rpb24oT3BXaW5kb3dTYXZlLCBMLCAwLCAwLCAiIik7CisgIH0KKworICAvLy8gXGJyaWVmIC5jZmlfcmVzdG9yZSBzYXlzIHRoYXQgdGhlIHJ1bGUgZm9yIFJlZ2lzdGVyIGlzIG5vdyB0aGUgc2FtZSBhcyBpdAorICAvLy8gd2FzIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZ1bmN0aW9uLCBhZnRlciBhbGwgaW5pdGlhbCBpbnN0cnVjdGlvbnMgYWRkZWQKKyAgLy8vIGJ5IC5jZmlfc3RhcnRwcm9jIHdlcmUgZXhlY3V0ZWQuCisgIHN0YXRpYyBNQ0NGSUluc3RydWN0aW9uIGNyZWF0ZVJlc3RvcmUoTUNTeW1ib2wgKkwsIHVuc2lnbmVkIFJlZ2lzdGVyKSB7CisgICAgcmV0dXJuIE1DQ0ZJSW5zdHJ1Y3Rpb24oT3BSZXN0b3JlLCBMLCBSZWdpc3RlciwgMCwgIiIpOworICB9CisKKyAgLy8vIFxicmllZiAuY2ZpX3VuZGVmaW5lZCBGcm9tIG5vdyBvbiB0aGUgcHJldmlvdXMgdmFsdWUgb2YgUmVnaXN0ZXIgY2FuJ3QgYmUKKyAgLy8vIHJlc3RvcmVkIGFueW1vcmUuCisgIHN0YXRpYyBNQ0NGSUluc3RydWN0aW9uIGNyZWF0ZVVuZGVmaW5lZChNQ1N5bWJvbCAqTCwgdW5zaWduZWQgUmVnaXN0ZXIpIHsKKyAgICByZXR1cm4gTUNDRklJbnN0cnVjdGlvbihPcFVuZGVmaW5lZCwgTCwgUmVnaXN0ZXIsIDAsICIiKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgLmNmaV9zYW1lX3ZhbHVlIEN1cnJlbnQgdmFsdWUgb2YgUmVnaXN0ZXIgaXMgdGhlIHNhbWUgYXMgaW4gdGhlCisgIC8vLyBwcmV2aW91cyBmcmFtZS4gSS5lLiwgbm8gcmVzdG9yYXRpb24gaXMgbmVlZGVkLgorICBzdGF0aWMgTUNDRklJbnN0cnVjdGlvbiBjcmVhdGVTYW1lVmFsdWUoTUNTeW1ib2wgKkwsIHVuc2lnbmVkIFJlZ2lzdGVyKSB7CisgICAgcmV0dXJuIE1DQ0ZJSW5zdHJ1Y3Rpb24oT3BTYW1lVmFsdWUsIEwsIFJlZ2lzdGVyLCAwLCAiIik7CisgIH0KKworICAvLy8gXGJyaWVmIC5jZmlfcmVtZW1iZXJfc3RhdGUgU2F2ZSBhbGwgY3VycmVudCBydWxlcyBmb3IgYWxsIHJlZ2lzdGVycy4KKyAgc3RhdGljIE1DQ0ZJSW5zdHJ1Y3Rpb24gY3JlYXRlUmVtZW1iZXJTdGF0ZShNQ1N5bWJvbCAqTCkgeworICAgIHJldHVybiBNQ0NGSUluc3RydWN0aW9uKE9wUmVtZW1iZXJTdGF0ZSwgTCwgMCwgMCwgIiIpOworICB9CisKKyAgLy8vIFxicmllZiAuY2ZpX3Jlc3RvcmVfc3RhdGUgUmVzdG9yZSB0aGUgcHJldmlvdXNseSBzYXZlZCBzdGF0ZS4KKyAgc3RhdGljIE1DQ0ZJSW5zdHJ1Y3Rpb24gY3JlYXRlUmVzdG9yZVN0YXRlKE1DU3ltYm9sICpMKSB7CisgICAgcmV0dXJuIE1DQ0ZJSW5zdHJ1Y3Rpb24oT3BSZXN0b3JlU3RhdGUsIEwsIDAsIDAsICIiKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgLmNmaV9lc2NhcGUgQWxsb3dzIHRoZSB1c2VyIHRvIGFkZCBhcmJpdHJhcnkgYnl0ZXMgdG8gdGhlIHVud2luZAorICAvLy8gaW5mby4KKyAgc3RhdGljIE1DQ0ZJSW5zdHJ1Y3Rpb24gY3JlYXRlRXNjYXBlKE1DU3ltYm9sICpMLCBTdHJpbmdSZWYgVmFscykgeworICAgIHJldHVybiBNQ0NGSUluc3RydWN0aW9uKE9wRXNjYXBlLCBMLCAwLCAwLCBWYWxzKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQSBzcGVjaWFsIHdyYXBwZXIgZm9yIC5jZmlfZXNjYXBlIHRoYXQgaW5kaWNhdGVzIEdOVV9BUkdTX1NJWkUKKyAgc3RhdGljIE1DQ0ZJSW5zdHJ1Y3Rpb24gY3JlYXRlR251QXJnc1NpemUoTUNTeW1ib2wgKkwsIGludCBTaXplKSB7CisgICAgcmV0dXJuIE1DQ0ZJSW5zdHJ1Y3Rpb24oT3BHbnVBcmdzU2l6ZSwgTCwgMCwgU2l6ZSwgIiIpOworICB9CisKKyAgT3BUeXBlIGdldE9wZXJhdGlvbigpIGNvbnN0IHsgcmV0dXJuIE9wZXJhdGlvbjsgfQorICBNQ1N5bWJvbCAqZ2V0TGFiZWwoKSBjb25zdCB7IHJldHVybiBMYWJlbDsgfQorCisgIHVuc2lnbmVkIGdldFJlZ2lzdGVyKCkgY29uc3QgeworICAgIGFzc2VydChPcGVyYXRpb24gPT0gT3BEZWZDZmEgfHwgT3BlcmF0aW9uID09IE9wT2Zmc2V0IHx8CisgICAgICAgICAgIE9wZXJhdGlvbiA9PSBPcFJlc3RvcmUgfHwgT3BlcmF0aW9uID09IE9wVW5kZWZpbmVkIHx8CisgICAgICAgICAgIE9wZXJhdGlvbiA9PSBPcFNhbWVWYWx1ZSB8fCBPcGVyYXRpb24gPT0gT3BEZWZDZmFSZWdpc3RlciB8fAorICAgICAgICAgICBPcGVyYXRpb24gPT0gT3BSZWxPZmZzZXQgfHwgT3BlcmF0aW9uID09IE9wUmVnaXN0ZXIpOworICAgIHJldHVybiBSZWdpc3RlcjsKKyAgfQorCisgIHVuc2lnbmVkIGdldFJlZ2lzdGVyMigpIGNvbnN0IHsKKyAgICBhc3NlcnQoT3BlcmF0aW9uID09IE9wUmVnaXN0ZXIpOworICAgIHJldHVybiBSZWdpc3RlcjI7CisgIH0KKworICBpbnQgZ2V0T2Zmc2V0KCkgY29uc3QgeworICAgIGFzc2VydChPcGVyYXRpb24gPT0gT3BEZWZDZmEgfHwgT3BlcmF0aW9uID09IE9wT2Zmc2V0IHx8CisgICAgICAgICAgIE9wZXJhdGlvbiA9PSBPcFJlbE9mZnNldCB8fCBPcGVyYXRpb24gPT0gT3BEZWZDZmFPZmZzZXQgfHwKKyAgICAgICAgICAgT3BlcmF0aW9uID09IE9wQWRqdXN0Q2ZhT2Zmc2V0IHx8IE9wZXJhdGlvbiA9PSBPcEdudUFyZ3NTaXplKTsKKyAgICByZXR1cm4gT2Zmc2V0OworICB9CisKKyAgU3RyaW5nUmVmIGdldFZhbHVlcygpIGNvbnN0IHsKKyAgICBhc3NlcnQoT3BlcmF0aW9uID09IE9wRXNjYXBlKTsKKyAgICByZXR1cm4gU3RyaW5nUmVmKCZWYWx1ZXNbMF0sIFZhbHVlcy5zaXplKCkpOworICB9Cit9OworCitzdHJ1Y3QgTUNEd2FyZkZyYW1lSW5mbyB7CisgIE1DRHdhcmZGcmFtZUluZm8oKSA9IGRlZmF1bHQ7CisKKyAgTUNTeW1ib2wgKkJlZ2luID0gbnVsbHB0cjsKKyAgTUNTeW1ib2wgKkVuZCA9IG51bGxwdHI7CisgIGNvbnN0IE1DU3ltYm9sICpQZXJzb25hbGl0eSA9IG51bGxwdHI7CisgIGNvbnN0IE1DU3ltYm9sICpMc2RhID0gbnVsbHB0cjsKKyAgc3RkOjp2ZWN0b3I8TUNDRklJbnN0cnVjdGlvbj4gSW5zdHJ1Y3Rpb25zOworICB1bnNpZ25lZCBDdXJyZW50Q2ZhUmVnaXN0ZXIgPSAwOworICB1bnNpZ25lZCBQZXJzb25hbGl0eUVuY29kaW5nID0gMDsKKyAgdW5zaWduZWQgTHNkYUVuY29kaW5nID0gMDsKKyAgdWludDMyX3QgQ29tcGFjdFVud2luZEVuY29kaW5nID0gMDsKKyAgYm9vbCBJc1NpZ25hbEZyYW1lID0gZmFsc2U7CisgIGJvb2wgSXNTaW1wbGUgPSBmYWxzZTsKKyAgdW5zaWduZWQgUkFSZWcgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZD4oSU5UX01BWCk7Cit9OworCitjbGFzcyBNQ0R3YXJmRnJhbWVFbWl0dGVyIHsKK3B1YmxpYzoKKyAgLy8KKyAgLy8gVGhpcyBlbWl0cyB0aGUgZnJhbWUgaW5mbyBzZWN0aW9uLgorICAvLworICBzdGF0aWMgdm9pZCBFbWl0KE1DT2JqZWN0U3RyZWFtZXIgJnN0cmVhbWVyLCBNQ0FzbUJhY2tlbmQgKk1BQiwgYm9vbCBpc0VIKTsKKyAgc3RhdGljIHZvaWQgRW1pdEFkdmFuY2VMb2MoTUNPYmplY3RTdHJlYW1lciAmU3RyZWFtZXIsIHVpbnQ2NF90IEFkZHJEZWx0YSk7CisgIHN0YXRpYyB2b2lkIEVuY29kZUFkdmFuY2VMb2MoTUNDb250ZXh0ICZDb250ZXh0LCB1aW50NjRfdCBBZGRyRGVsdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gJk9TKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DRFdBUkZfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0VMRk9iamVjdFdyaXRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0VMRk9iamVjdFdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkOGQxMTgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRUxGT2JqZWN0V3JpdGVyLmgKQEAgLTAsMCArMSwxNDYgQEAKKy8vPT09LSBsbHZtL01DL01DRUxGT2JqZWN0V3JpdGVyLmggLSBFTEYgT2JqZWN0IFdyaXRlciAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0VMRk9CSkVDVFdSSVRFUl9ICisjZGVmaW5lIExMVk1fTUNfTUNFTEZPQkpFQ1RXUklURVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvVHJpcGxlLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRUxGLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0Fzc2VtYmxlcjsKK2NsYXNzIE1DQ29udGV4dDsKK2NsYXNzIE1DRml4dXA7CitjbGFzcyBNQ09iamVjdFdyaXRlcjsKK2NsYXNzIE1DU3ltYm9sOworY2xhc3MgTUNTeW1ib2xFTEY7CitjbGFzcyBNQ1ZhbHVlOworCitzdHJ1Y3QgRUxGUmVsb2NhdGlvbkVudHJ5IHsKKyAgdWludDY0X3QgT2Zmc2V0OyAvLyBXaGVyZSBpcyB0aGUgcmVsb2NhdGlvbi4KKyAgY29uc3QgTUNTeW1ib2xFTEYgKlN5bWJvbDsgLy8gVGhlIHN5bWJvbCB0byByZWxvY2F0ZSB3aXRoLgorICB1bnNpZ25lZCBUeXBlOyAgIC8vIFRoZSB0eXBlIG9mIHRoZSByZWxvY2F0aW9uLgorICB1aW50NjRfdCBBZGRlbmQ7IC8vIFRoZSBhZGRlbmQgdG8gdXNlLgorICBjb25zdCBNQ1N5bWJvbEVMRiAqT3JpZ2luYWxTeW1ib2w7IC8vIFRoZSBvcmlnaW5hbCB2YWx1ZSBvZiBTeW1ib2wgaWYgd2UgY2hhbmdlZCBpdC4KKyAgdWludDY0X3QgT3JpZ2luYWxBZGRlbmQ7IC8vIFRoZSBvcmlnaW5hbCB2YWx1ZSBvZiBhZGRlbmQuCisKKyAgRUxGUmVsb2NhdGlvbkVudHJ5KHVpbnQ2NF90IE9mZnNldCwgY29uc3QgTUNTeW1ib2xFTEYgKlN5bWJvbCwgdW5zaWduZWQgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEFkZGVuZCwgY29uc3QgTUNTeW1ib2xFTEYgKk9yaWdpbmFsU3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgT3JpZ2luYWxBZGRlbmQpCisgICAgICA6IE9mZnNldChPZmZzZXQpLCBTeW1ib2woU3ltYm9sKSwgVHlwZShUeXBlKSwgQWRkZW5kKEFkZGVuZCksCisgICAgICAgIE9yaWdpbmFsU3ltYm9sKE9yaWdpbmFsU3ltYm9sKSwgT3JpZ2luYWxBZGRlbmQoT3JpZ2luYWxBZGRlbmQpIHt9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT3V0KSBjb25zdCB7CisgICAgT3V0IDw8ICJPZmY9IiA8PCBPZmZzZXQgPDwgIiwgU3ltPSIgPDwgU3ltYm9sIDw8ICIsIFR5cGU9IiA8PCBUeXBlCisgICAgICAgIDw8ICIsIEFkZGVuZD0iIDw8IEFkZGVuZCA8PCAiLCBPcmlnaW5hbFN5bWJvbD0iIDw8IE9yaWdpbmFsU3ltYm9sCisgICAgICAgIDw8ICIsIE9yaWdpbmFsQWRkZW5kPSIgPDwgT3JpZ2luYWxBZGRlbmQ7CisgIH0KKworICB2b2lkIGR1bXAoKSBjb25zdCB7IHByaW50KGVycnMoKSk7IH0KK307CisKK2NsYXNzIE1DRUxGT2JqZWN0VGFyZ2V0V3JpdGVyIHsKKyAgY29uc3QgdWludDhfdCBPU0FCSTsKKyAgY29uc3QgdWludDE2X3QgRU1hY2hpbmU7CisgIGNvbnN0IHVuc2lnbmVkIEhhc1JlbG9jYXRpb25BZGRlbmQgOiAxOworICBjb25zdCB1bnNpZ25lZCBJczY0Qml0IDogMTsKKworcHJvdGVjdGVkOgorICBNQ0VMRk9iamVjdFRhcmdldFdyaXRlcihib29sIElzNjRCaXRfLCB1aW50OF90IE9TQUJJXywgdWludDE2X3QgRU1hY2hpbmVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc1JlbG9jYXRpb25BZGRlbmQpOworCitwdWJsaWM6CisgIHZpcnR1YWwgfk1DRUxGT2JqZWN0VGFyZ2V0V3JpdGVyKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyB1aW50OF90IGdldE9TQUJJKFRyaXBsZTo6T1NUeXBlIE9TVHlwZSkgeworICAgIHN3aXRjaCAoT1NUeXBlKSB7CisgICAgICBjYXNlIFRyaXBsZTo6Q2xvdWRBQkk6CisgICAgICAgIHJldHVybiBFTEY6OkVMRk9TQUJJX0NMT1VEQUJJOworICAgICAgY2FzZSBUcmlwbGU6OlBTNDoKKyAgICAgIGNhc2UgVHJpcGxlOjpGcmVlQlNEOgorICAgICAgICByZXR1cm4gRUxGOjpFTEZPU0FCSV9GUkVFQlNEOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgcmV0dXJuIEVMRjo6RUxGT1NBQklfTk9ORTsKKyAgICB9CisgIH0KKworICB2aXJ0dWFsIHVuc2lnbmVkIGdldFJlbG9jVHlwZShNQ0NvbnRleHQgJkN0eCwgY29uc3QgTUNWYWx1ZSAmVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0ZpeHVwICZGaXh1cCwgYm9vbCBJc1BDUmVsKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBib29sIG5lZWRzUmVsb2NhdGVXaXRoU3ltYm9sKGNvbnN0IE1DU3ltYm9sICZTeW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBUeXBlKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQgc29ydFJlbG9jcyhjb25zdCBNQ0Fzc2VtYmxlciAmQXNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxFTEZSZWxvY2F0aW9uRW50cnk+ICZSZWxvY3MpOworCisgIC8vLyBcbmFtZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisgIHVpbnQ4X3QgZ2V0T1NBQkkoKSBjb25zdCB7IHJldHVybiBPU0FCSTsgfQorICB1aW50MTZfdCBnZXRFTWFjaGluZSgpIGNvbnN0IHsgcmV0dXJuIEVNYWNoaW5lOyB9CisgIGJvb2wgaGFzUmVsb2NhdGlvbkFkZGVuZCgpIGNvbnN0IHsgcmV0dXJuIEhhc1JlbG9jYXRpb25BZGRlbmQ7IH0KKyAgYm9vbCBpczY0Qml0KCkgY29uc3QgeyByZXR1cm4gSXM2NEJpdDsgfQorICAvLy8gQH0KKworICAvLyBJbnN0ZWFkIG9mIGNoYW5naW5nIGV2ZXJ5b25lJ3MgQVBJIHdlIHBhY2sgdGhlIE42NCBUeXBlIGZpZWxkcworICAvLyBpbnRvIHRoZSBleGlzdGluZyAzMiBiaXQgZGF0YSB1bnNpZ25lZC4KKyNkZWZpbmUgUl9UWVBFX1NISUZUIDAKKyNkZWZpbmUgUl9UWVBFX01BU0sgMHhmZmZmZmYwMAorI2RlZmluZSBSX1RZUEUyX1NISUZUIDgKKyNkZWZpbmUgUl9UWVBFMl9NQVNLIDB4ZmZmZjAwZmYKKyNkZWZpbmUgUl9UWVBFM19TSElGVCAxNgorI2RlZmluZSBSX1RZUEUzX01BU0sgMHhmZjAwZmZmZgorI2RlZmluZSBSX1NTWU1fU0hJRlQgMjQKKyNkZWZpbmUgUl9TU1lNX01BU0sgMHgwMGZmZmZmZgorCisgIC8vIE42NCByZWxvY2F0aW9uIHR5cGUgYWNjZXNzb3JzCisgIHVpbnQ4X3QgZ2V0UlR5cGUodWludDMyX3QgVHlwZSkgY29uc3QgeworICAgIHJldHVybiAodW5zaWduZWQpKChUeXBlID4+IFJfVFlQRV9TSElGVCkgJiAweGZmKTsKKyAgfQorICB1aW50OF90IGdldFJUeXBlMih1aW50MzJfdCBUeXBlKSBjb25zdCB7CisgICAgcmV0dXJuICh1bnNpZ25lZCkoKFR5cGUgPj4gUl9UWVBFMl9TSElGVCkgJiAweGZmKTsKKyAgfQorICB1aW50OF90IGdldFJUeXBlMyh1aW50MzJfdCBUeXBlKSBjb25zdCB7CisgICAgcmV0dXJuICh1bnNpZ25lZCkoKFR5cGUgPj4gUl9UWVBFM19TSElGVCkgJiAweGZmKTsKKyAgfQorICB1aW50OF90IGdldFJTc3ltKHVpbnQzMl90IFR5cGUpIGNvbnN0IHsKKyAgICByZXR1cm4gKHVuc2lnbmVkKSgoVHlwZSA+PiBSX1NTWU1fU0hJRlQpICYgMHhmZik7CisgIH0KKworICAvLyBONjQgcmVsb2NhdGlvbiB0eXBlIHNldHRpbmcKKyAgdW5zaWduZWQgc2V0UlR5cGUodW5zaWduZWQgVmFsdWUsIHVuc2lnbmVkIFR5cGUpIGNvbnN0IHsKKyAgICByZXR1cm4gKChUeXBlICYgUl9UWVBFX01BU0spIHwgKChWYWx1ZSAmIDB4ZmYpIDw8IFJfVFlQRV9TSElGVCkpOworICB9CisgIHVuc2lnbmVkIHNldFJUeXBlMih1bnNpZ25lZCBWYWx1ZSwgdW5zaWduZWQgVHlwZSkgY29uc3QgeworICAgIHJldHVybiAoVHlwZSAmIFJfVFlQRTJfTUFTSykgfCAoKFZhbHVlICYgMHhmZikgPDwgUl9UWVBFMl9TSElGVCk7CisgIH0KKyAgdW5zaWduZWQgc2V0UlR5cGUzKHVuc2lnbmVkIFZhbHVlLCB1bnNpZ25lZCBUeXBlKSBjb25zdCB7CisgICAgcmV0dXJuIChUeXBlICYgUl9UWVBFM19NQVNLKSB8ICgoVmFsdWUgJiAweGZmKSA8PCBSX1RZUEUzX1NISUZUKTsKKyAgfQorICB1bnNpZ25lZCBzZXRSU3N5bSh1bnNpZ25lZCBWYWx1ZSwgdW5zaWduZWQgVHlwZSkgY29uc3QgeworICAgIHJldHVybiAoVHlwZSAmIFJfU1NZTV9NQVNLKSB8ICgoVmFsdWUgJiAweGZmKSA8PCBSX1NTWU1fU0hJRlQpOworICB9Cit9OworCisvLy8gXGJyaWVmIENvbnN0cnVjdCBhIG5ldyBFTEYgd3JpdGVyIGluc3RhbmNlLgorLy8vCisvLy8gXHBhcmFtIE1PVFcgLSBUaGUgdGFyZ2V0IHNwZWNpZmljIEVMRiB3cml0ZXIgc3ViY2xhc3MuCisvLy8gXHBhcmFtIE9TIC0gVGhlIHN0cmVhbSB0byB3cml0ZSB0by4KKy8vLyBccmV0dXJucyBUaGUgY29uc3RydWN0ZWQgb2JqZWN0IHdyaXRlci4KK3N0ZDo6dW5pcXVlX3B0cjxNQ09iamVjdFdyaXRlcj4KK2NyZWF0ZUVMRk9iamVjdFdyaXRlcihzdGQ6OnVuaXF1ZV9wdHI8TUNFTEZPYmplY3RUYXJnZXRXcml0ZXI+IE1PVFcsCisgICAgICAgICAgICAgICAgICAgICAgcmF3X3B3cml0ZV9zdHJlYW0gJk9TLCBib29sIElzTGl0dGxlRW5kaWFuKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNFTEZPQkpFQ1RXUklURVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0VMRlN0cmVhbWVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRUxGU3RyZWFtZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjIzY2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0VMRlN0cmVhbWVyLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8vPT09LSBNQ0VMRlN0cmVhbWVyLmggLSBNQ1N0cmVhbWVyIEVMRiBPYmplY3QgRmlsZSBJbnRlcmZhY2UgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0VMRlNUUkVBTUVSX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0VMRlNUUkVBTUVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0RpcmVjdGl2ZXMuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DT2JqZWN0U3RyZWFtZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0FzbUJhY2tlbmQ7CitjbGFzcyBNQ0NvZGVFbWl0dGVyOworY2xhc3MgTUNFeHByOworY2xhc3MgTUNJbnN0OworCitjbGFzcyBNQ0VMRlN0cmVhbWVyIDogcHVibGljIE1DT2JqZWN0U3RyZWFtZXIgeworcHVibGljOgorICBNQ0VMRlN0cmVhbWVyKE1DQ29udGV4dCAmQ29udGV4dCwgc3RkOjp1bmlxdWVfcHRyPE1DQXNtQmFja2VuZD4gVEFCLAorICAgICAgICAgICAgICAgIHJhd19wd3JpdGVfc3RyZWFtICZPUywgc3RkOjp1bmlxdWVfcHRyPE1DQ29kZUVtaXR0ZXI+IEVtaXR0ZXIpOworCisgIH5NQ0VMRlN0cmVhbWVyKCkgb3ZlcnJpZGUgPSBkZWZhdWx0OworCisgIC8vLyBzdGF0ZSBtYW5hZ2VtZW50CisgIHZvaWQgcmVzZXQoKSBvdmVycmlkZSB7CisgICAgU2VlbklkZW50ID0gZmFsc2U7CisgICAgQnVuZGxlR3JvdXBzLmNsZWFyKCk7CisgICAgTUNPYmplY3RTdHJlYW1lcjo6cmVzZXQoKTsKKyAgfQorCisgIC8vLyBcbmFtZSBNQ1N0cmVhbWVyIEludGVyZmFjZQorICAvLy8gQHsKKworICB2b2lkIEluaXRTZWN0aW9ucyhib29sIE5vRXhlY1N0YWNrKSBvdmVycmlkZTsKKyAgdm9pZCBDaGFuZ2VTZWN0aW9uKE1DU2VjdGlvbiAqU2VjdGlvbiwgY29uc3QgTUNFeHByICpTdWJzZWN0aW9uKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0TGFiZWwoTUNTeW1ib2wgKlN5bWJvbCwgU01Mb2MgTG9jID0gU01Mb2MoKSkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdExhYmVsKE1DU3ltYm9sICpTeW1ib2wsIFNNTG9jIExvYywgTUNGcmFnbWVudCAqRikgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdEFzc2VtYmxlckZsYWcoTUNBc3NlbWJsZXJGbGFnIEZsYWcpIG92ZXJyaWRlOworICB2b2lkIEVtaXRUaHVtYkZ1bmMoTUNTeW1ib2wgKkZ1bmMpIG92ZXJyaWRlOworICB2b2lkIEVtaXRXZWFrUmVmZXJlbmNlKE1DU3ltYm9sICpBbGlhcywgY29uc3QgTUNTeW1ib2wgKlN5bWJvbCkgb3ZlcnJpZGU7CisgIGJvb2wgRW1pdFN5bWJvbEF0dHJpYnV0ZShNQ1N5bWJvbCAqU3ltYm9sLCBNQ1N5bWJvbEF0dHIgQXR0cmlidXRlKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0U3ltYm9sRGVzYyhNQ1N5bWJvbCAqU3ltYm9sLCB1bnNpZ25lZCBEZXNjVmFsdWUpIG92ZXJyaWRlOworICB2b2lkIEVtaXRDb21tb25TeW1ib2woTUNTeW1ib2wgKlN5bWJvbCwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQpIG92ZXJyaWRlOworCisgIHZvaWQgZW1pdEVMRlNpemUoTUNTeW1ib2wgKlN5bWJvbCwgY29uc3QgTUNFeHByICpWYWx1ZSkgb3ZlcnJpZGU7CisgIHZvaWQgZW1pdEVMRlN5bXZlckRpcmVjdGl2ZShTdHJpbmdSZWYgQWxpYXNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKkFsaWFzZWUpIG92ZXJyaWRlOworCisgIHZvaWQgRW1pdExvY2FsQ29tbW9uU3ltYm9sKE1DU3ltYm9sICpTeW1ib2wsIHVpbnQ2NF90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQpIG92ZXJyaWRlOworCisgIHZvaWQgRW1pdFplcm9maWxsKE1DU2VjdGlvbiAqU2VjdGlvbiwgTUNTeW1ib2wgKlN5bWJvbCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUgPSAwLCB1bnNpZ25lZCBCeXRlQWxpZ25tZW50ID0gMCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdFRCU1NTeW1ib2woTUNTZWN0aW9uICpTZWN0aW9uLCBNQ1N5bWJvbCAqU3ltYm9sLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQgPSAwKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0VmFsdWVJbXBsKGNvbnN0IE1DRXhwciAqVmFsdWUsIHVuc2lnbmVkIFNpemUsCisgICAgICAgICAgICAgICAgICAgICBTTUxvYyBMb2MgPSBTTUxvYygpKSBvdmVycmlkZTsKKworICB2b2lkIEVtaXRJZGVudChTdHJpbmdSZWYgSWRlbnRTdHJpbmcpIG92ZXJyaWRlOworCisgIHZvaWQgRW1pdFZhbHVlVG9BbGlnbm1lbnQodW5zaWduZWQsIGludDY0X3QsIHVuc2lnbmVkLCB1bnNpZ25lZCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBGaW5pc2hJbXBsKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBFbWl0QnVuZGxlQWxpZ25Nb2RlKHVuc2lnbmVkIEFsaWduUG93Mikgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdEJ1bmRsZUxvY2soYm9vbCBBbGlnblRvRW5kKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0QnVuZGxlVW5sb2NrKCkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIGJvb2wgaXNCdW5kbGVMb2NrZWQoKSBjb25zdDsKKyAgdm9pZCBFbWl0SW5zdFRvRnJhZ21lbnQoY29uc3QgTUNJbnN0ICZJbnN0LCBjb25zdCBNQ1N1YnRhcmdldEluZm8gJikgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdEluc3RUb0RhdGEoY29uc3QgTUNJbnN0ICZJbnN0LCBjb25zdCBNQ1N1YnRhcmdldEluZm8gJikgb3ZlcnJpZGU7CisKKyAgdm9pZCBmaXhTeW1ib2xzSW5UTFNGaXh1cHMoY29uc3QgTUNFeHByICpleHByKTsKKworICAvLy8gXGJyaWVmIE1lcmdlIHRoZSBjb250ZW50IG9mIHRoZSBmcmFnbWVudCBccCBFRiBpbnRvIHRoZSBmcmFnbWVudCBccCBERi4KKyAgdm9pZCBtZXJnZUZyYWdtZW50KE1DRGF0YUZyYWdtZW50ICosIE1DRGF0YUZyYWdtZW50ICopOworCisgIGJvb2wgU2VlbklkZW50ID0gZmFsc2U7CisKKyAgLy8vIEJ1bmRsZUdyb3VwcyAtIFRoZSBzdGFjayBvZiBmcmFnbWVudHMgaG9sZGluZyB0aGUgYnVuZGxlLWxvY2tlZAorICAvLy8gaW5zdHJ1Y3Rpb25zLgorICBTbWFsbFZlY3RvcjxNQ0RhdGFGcmFnbWVudCAqLCA0PiBCdW5kbGVHcm91cHM7Cit9OworCitNQ0VMRlN0cmVhbWVyICpjcmVhdGVBUk1FTEZTdHJlYW1lcihNQ0NvbnRleHQgJkNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TUNBc21CYWNrZW5kPiBUQUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfcHdyaXRlX3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TUNDb2RlRW1pdHRlcj4gRW1pdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVsYXhBbGwsIGJvb2wgSXNUaHVtYik7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DRUxGU1RSRUFNRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0V4cHIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNFeHByLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiYmU2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNFeHByLmgKQEAgLTAsMCArMSw1OTUgQEAKKy8vPT09LSBNQ0V4cHIuaCAtIEFzc2VtYmx5IExldmVsIEV4cHJlc3Npb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0VYUFJfSAorI2RlZmluZSBMTFZNX01DX01DRVhQUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TTUxvYy5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNBc21JbmZvOworY2xhc3MgTUNBc21MYXlvdXQ7CitjbGFzcyBNQ0Fzc2VtYmxlcjsKK2NsYXNzIE1DQ29udGV4dDsKK2NsYXNzIE1DRml4dXA7CitjbGFzcyBNQ0ZyYWdtZW50OworY2xhc3MgTUNTZWN0aW9uOworY2xhc3MgTUNTdHJlYW1lcjsKK2NsYXNzIE1DU3ltYm9sOworY2xhc3MgTUNWYWx1ZTsKK2NsYXNzIHJhd19vc3RyZWFtOworY2xhc3MgU3RyaW5nUmVmOworCit1c2luZyBTZWN0aW9uQWRkck1hcCA9IERlbnNlTWFwPGNvbnN0IE1DU2VjdGlvbiAqLCB1aW50NjRfdD47CisKKy8vLyBcYnJpZWYgQmFzZSBjbGFzcyBmb3IgdGhlIGZ1bGwgcmFuZ2Ugb2YgYXNzZW1ibGVyIGV4cHJlc3Npb25zIHdoaWNoIGFyZQorLy8vIG5lZWRlZCBmb3IgcGFyc2luZy4KK2NsYXNzIE1DRXhwciB7CitwdWJsaWM6CisgIGVudW0gRXhwcktpbmQgeworICAgIEJpbmFyeSwgICAgLy8vPCBCaW5hcnkgZXhwcmVzc2lvbnMuCisgICAgQ29uc3RhbnQsICAvLy88IENvbnN0YW50IGV4cHJlc3Npb25zLgorICAgIFN5bWJvbFJlZiwgLy8vPCBSZWZlcmVuY2VzIHRvIGxhYmVscyBhbmQgYXNzaWduZWQgZXhwcmVzc2lvbnMuCisgICAgVW5hcnksICAgICAvLy88IFVuYXJ5IGV4cHJlc3Npb25zLgorICAgIFRhcmdldCAgICAgLy8vPCBUYXJnZXQgc3BlY2lmaWMgZXhwcmVzc2lvbi4KKyAgfTsKKworcHJpdmF0ZToKKyAgRXhwcktpbmQgS2luZDsKKyAgU01Mb2MgTG9jOworCisgIGJvb2wgZXZhbHVhdGVBc0Fic29sdXRlKGludDY0X3QgJlJlcywgY29uc3QgTUNBc3NlbWJsZXIgKkFzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21MYXlvdXQgKkxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VjdGlvbkFkZHJNYXAgKkFkZHJzKSBjb25zdDsKKworICBib29sIGV2YWx1YXRlQXNBYnNvbHV0ZShpbnQ2NF90ICZSZXMsIGNvbnN0IE1DQXNzZW1ibGVyICpBc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtTGF5b3V0ICpMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlY3Rpb25BZGRyTWFwICpBZGRycywgYm9vbCBJblNldCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgZXhwbGljaXQgTUNFeHByKEV4cHJLaW5kIEtpbmQsIFNNTG9jIExvYykgOiBLaW5kKEtpbmQpLCBMb2MoTG9jKSB7fQorCisgIGJvb2wgZXZhbHVhdGVBc1JlbG9jYXRhYmxlSW1wbChNQ1ZhbHVlICZSZXMsIGNvbnN0IE1DQXNzZW1ibGVyICpBc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAqTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGaXh1cCAqRml4dXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWN0aW9uQWRkck1hcCAqQWRkcnMsIGJvb2wgSW5TZXQpIGNvbnN0OworCitwdWJsaWM6CisgIE1DRXhwcihjb25zdCBNQ0V4cHIgJikgPSBkZWxldGU7CisgIE1DRXhwciAmb3BlcmF0b3I9KGNvbnN0IE1DRXhwciAmKSA9IGRlbGV0ZTsKKworICAvLy8gXG5hbWUgQWNjZXNzb3JzCisgIC8vLyBAeworCisgIEV4cHJLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisgIFNNTG9jIGdldExvYygpIGNvbnN0IHsgcmV0dXJuIExvYzsgfQorCisgIC8vLyBAfQorICAvLy8gXG5hbWUgVXRpbGl0eSBNZXRob2RzCisgIC8vLyBAeworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNQ0FzbUluZm8gKk1BSSwKKyAgICAgICAgICAgICBib29sIEluUGFyZW5zID0gZmFsc2UpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIEV4cHJlc3Npb24gRXZhbHVhdGlvbgorICAvLy8gQHsKKworICAvLy8gXGJyaWVmIFRyeSB0byBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiB0byBhbiBhYnNvbHV0ZSB2YWx1ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gUmVzIC0gVGhlIGFic29sdXRlIHZhbHVlLCBpZiBldmFsdWF0aW9uIHN1Y2NlZWRzLgorICAvLy8gXHBhcmFtIExheW91dCAtIFRoZSBhc3NlbWJsZXIgbGF5b3V0IG9iamVjdCB0byB1c2UgZm9yIGV2YWx1YXRpbmcgc3ltYm9sCisgIC8vLyB2YWx1ZXMuIElmIG5vdCBnaXZlbiwgdGhlbiBvbmx5IG5vbi1zeW1ib2xpYyBleHByZXNzaW9ucyB3aWxsIGJlCisgIC8vLyBldmFsdWF0ZWQuCisgIC8vLyBccmV0dXJuIC0gVHJ1ZSBvbiBzdWNjZXNzLgorICBib29sIGV2YWx1YXRlQXNBYnNvbHV0ZShpbnQ2NF90ICZSZXMsIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlY3Rpb25BZGRyTWFwICZBZGRycykgY29uc3Q7CisgIGJvb2wgZXZhbHVhdGVBc0Fic29sdXRlKGludDY0X3QgJlJlcykgY29uc3Q7CisgIGJvb2wgZXZhbHVhdGVBc0Fic29sdXRlKGludDY0X3QgJlJlcywgY29uc3QgTUNBc3NlbWJsZXIgJkFzbSkgY29uc3Q7CisgIGJvb2wgZXZhbHVhdGVBc0Fic29sdXRlKGludDY0X3QgJlJlcywgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCkgY29uc3Q7CisKKyAgYm9vbCBldmFsdWF0ZUtub3duQWJzb2x1dGUoaW50NjRfdCAmUmVzLCBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KSBjb25zdDsKKworICAvLy8gXGJyaWVmIFRyeSB0byBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiB0byBhIHJlbG9jYXRhYmxlIHZhbHVlLCBpLmUuIGFuCisgIC8vLyBleHByZXNzaW9uIG9mIHRoZSBmaXhlZCBmb3JtIChhIC0gYiArIGNvbnN0YW50KS4KKyAgLy8vCisgIC8vLyBccGFyYW0gUmVzIC0gVGhlIHJlbG9jYXRhYmxlIHZhbHVlLCBpZiBldmFsdWF0aW9uIHN1Y2NlZWRzLgorICAvLy8gXHBhcmFtIExheW91dCAtIFRoZSBhc3NlbWJsZXIgbGF5b3V0IG9iamVjdCB0byB1c2UgZm9yIGV2YWx1YXRpbmcgdmFsdWVzLgorICAvLy8gXHBhcmFtIEZpeHVwIC0gVGhlIEZpeHVwIG9iamVjdCBpZiBhdmFpbGFibGUuCisgIC8vLyBccmV0dXJuIC0gVHJ1ZSBvbiBzdWNjZXNzLgorICBib29sIGV2YWx1YXRlQXNSZWxvY2F0YWJsZShNQ1ZhbHVlICZSZXMsIGNvbnN0IE1DQXNtTGF5b3V0ICpMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRml4dXAgKkZpeHVwKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFRyeSB0byBldmFsdWF0ZSB0aGUgZXhwcmVzc2lvbiB0byB0aGUgZm9ybSAoYSAtIGIgKyBjb25zdGFudCkgd2hlcmUKKyAgLy8vIG5laXRoZXIgYSBub3IgYiBhcmUgdmFyaWFibGVzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYSBtb3JlIGFnZ3Jlc3NpdmUgdmFyaWFudCBvZiBldmFsdWF0ZUFzUmVsb2NhdGFibGUuIFRoZSBpbnRlbmRlZAorICAvLy8gdXNlIGlzIGZvciB3aGVuIHJlbG9jYXRpb25zIGFyZSBub3QgYXZhaWxhYmxlLCBsaWtlIHRoZSAuc2l6ZSBkaXJlY3RpdmUuCisgIGJvb2wgZXZhbHVhdGVBc1ZhbHVlKE1DVmFsdWUgJlJlcywgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBGaW5kIHRoZSAiYXNzb2NpYXRlZCBzZWN0aW9uIiBmb3IgdGhpcyBleHByZXNzaW9uLCB3aGljaCBpcworICAvLy8gY3VycmVudGx5IGRlZmluZWQgYXMgdGhlIGFic29sdXRlIHNlY3Rpb24gZm9yIGNvbnN0YW50cywgb3IKKyAgLy8vIG90aGVyd2lzZSB0aGUgc2VjdGlvbiBhc3NvY2lhdGVkIHdpdGggdGhlIGZpcnN0IGRlZmluZWQgc3ltYm9sIGluIHRoZQorICAvLy8gZXhwcmVzc2lvbi4KKyAgTUNGcmFnbWVudCAqZmluZEFzc29jaWF0ZWRGcmFnbWVudCgpIGNvbnN0OworCisgIC8vLyBAfQorfTsKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTUNFeHByICZFKSB7CisgIEUucHJpbnQoT1MsIG51bGxwdHIpOworICByZXR1cm4gT1M7Cit9CisKKy8vLy8gXGJyaWVmICBSZXByZXNlbnQgYSBjb25zdGFudCBpbnRlZ2VyIGV4cHJlc3Npb24uCitjbGFzcyBNQ0NvbnN0YW50RXhwciA6IHB1YmxpYyBNQ0V4cHIgeworICBpbnQ2NF90IFZhbHVlOworCisgIGV4cGxpY2l0IE1DQ29uc3RhbnRFeHByKGludDY0X3QgVmFsdWUpCisgICAgICA6IE1DRXhwcihNQ0V4cHI6OkNvbnN0YW50LCBTTUxvYygpKSwgVmFsdWUoVmFsdWUpIHt9CisKK3B1YmxpYzoKKyAgLy8vIFxuYW1lIENvbnN0cnVjdGlvbgorICAvLy8gQHsKKworICBzdGF0aWMgY29uc3QgTUNDb25zdGFudEV4cHIgKmNyZWF0ZShpbnQ2NF90IFZhbHVlLCBNQ0NvbnRleHQgJkN0eCk7CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisKKyAgaW50NjRfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgLy8vIEB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0V4cHIgKkUpIHsKKyAgICByZXR1cm4gRS0+Z2V0S2luZCgpID09IE1DRXhwcjo6Q29uc3RhbnQ7CisgIH0KK307CisKKy8vLyBcYnJpZWYgIFJlcHJlc2VudCBhIHJlZmVyZW5jZSB0byBhIHN5bWJvbCBmcm9tIGluc2lkZSBhbiBleHByZXNzaW9uLgorLy8vCisvLy8gQSBzeW1ib2wgcmVmZXJlbmNlIGluIGFuIGV4cHJlc3Npb24gbWF5IGJlIGEgdXNlIG9mIGEgbGFiZWwsIGEgdXNlIG9mIGFuCisvLy8gYXNzZW1ibGVyIHZhcmlhYmxlIChkZWZpbmVkIGNvbnN0YW50KSwgb3IgY29uc3RpdHV0ZSBhbiBpbXBsaWNpdCBkZWZpbml0aW9uCisvLy8gb2YgdGhlIHN5bWJvbCBhcyBleHRlcm5hbC4KK2NsYXNzIE1DU3ltYm9sUmVmRXhwciA6IHB1YmxpYyBNQ0V4cHIgeworcHVibGljOgorICBlbnVtIFZhcmlhbnRLaW5kIDogdWludDE2X3QgeworICAgIFZLX05vbmUsCisgICAgVktfSW52YWxpZCwKKworICAgIFZLX0dPVCwKKyAgICBWS19HT1RPRkYsCisgICAgVktfR09UUkVMLAorICAgIFZLX0dPVFBDUkVMLAorICAgIFZLX0dPVFRQT0ZGLAorICAgIFZLX0lORE5UUE9GRiwKKyAgICBWS19OVFBPRkYsCisgICAgVktfR09UTlRQT0ZGLAorICAgIFZLX1BMVCwKKyAgICBWS19UTFNHRCwKKyAgICBWS19UTFNMRCwKKyAgICBWS19UTFNMRE0sCisgICAgVktfVFBPRkYsCisgICAgVktfRFRQT0ZGLAorICAgIFZLX1RMU0NBTEwsICAgLy8gc3ltYm9sKHRsc2NhbGwpCisgICAgVktfVExTREVTQywgICAvLyBzeW1ib2wodGxzZGVzYykKKyAgICBWS19UTFZQLCAgICAgIC8vIE1hY2gtTyB0aHJlYWQgbG9jYWwgdmFyaWFibGUgcmVsb2NhdGlvbnMKKyAgICBWS19UTFZQUEFHRSwKKyAgICBWS19UTFZQUEFHRU9GRiwKKyAgICBWS19QQUdFLAorICAgIFZLX1BBR0VPRkYsCisgICAgVktfR09UUEFHRSwKKyAgICBWS19HT1RQQUdFT0ZGLAorICAgIFZLX1NFQ1JFTCwKKyAgICBWS19TSVpFLCAgICAgIC8vIHN5bWJvbEBTSVpFCisgICAgVktfV0VBS1JFRiwgICAvLyBUaGUgbGluayBiZXR3ZWVuIHRoZSBzeW1ib2xzIGluIC53ZWFrcmVmIGZvbywgYmFyCisKKyAgICBWS19YODZfQUJTOCwKKworICAgIFZLX0FSTV9OT05FLAorICAgIFZLX0FSTV9HT1RfUFJFTCwKKyAgICBWS19BUk1fVEFSR0VUMSwKKyAgICBWS19BUk1fVEFSR0VUMiwKKyAgICBWS19BUk1fUFJFTDMxLAorICAgIFZLX0FSTV9TQlJFTCwgICAgICAgICAgLy8gc3ltYm9sKHNicmVsKQorICAgIFZLX0FSTV9UTFNMRE8sICAgICAgICAgLy8gc3ltYm9sKHRsc2xkbykKKyAgICBWS19BUk1fVExTREVTQ1NFUSwKKworICAgIFZLX0FWUl9OT05FLAorICAgIFZLX0FWUl9MTzgsCisgICAgVktfQVZSX0hJOCwKKyAgICBWS19BVlJfSExPOCwKKyAgICBWS19BVlJfRElGRjgsCisgICAgVktfQVZSX0RJRkYxNiwKKyAgICBWS19BVlJfRElGRjMyLAorCisgICAgVktfUFBDX0xPLCAgICAgICAgICAgICAvLyBzeW1ib2xAbAorICAgIFZLX1BQQ19ISSwgICAgICAgICAgICAgLy8gc3ltYm9sQGgKKyAgICBWS19QUENfSEEsICAgICAgICAgICAgIC8vIHN5bWJvbEBoYQorICAgIFZLX1BQQ19ISUdIRVIsICAgICAgICAgLy8gc3ltYm9sQGhpZ2hlcgorICAgIFZLX1BQQ19ISUdIRVJBLCAgICAgICAgLy8gc3ltYm9sQGhpZ2hlcmEKKyAgICBWS19QUENfSElHSEVTVCwgICAgICAgIC8vIHN5bWJvbEBoaWdoZXN0CisgICAgVktfUFBDX0hJR0hFU1RBLCAgICAgICAvLyBzeW1ib2xAaGlnaGVzdGEKKyAgICBWS19QUENfR09UX0xPLCAgICAgICAgIC8vIHN5bWJvbEBnb3RAbAorICAgIFZLX1BQQ19HT1RfSEksICAgICAgICAgLy8gc3ltYm9sQGdvdEBoCisgICAgVktfUFBDX0dPVF9IQSwgICAgICAgICAvLyBzeW1ib2xAZ290QGhhCisgICAgVktfUFBDX1RPQ0JBU0UsICAgICAgICAvLyBzeW1ib2xAdG9jYmFzZQorICAgIFZLX1BQQ19UT0MsICAgICAgICAgICAgLy8gc3ltYm9sQHRvYworICAgIFZLX1BQQ19UT0NfTE8sICAgICAgICAgLy8gc3ltYm9sQHRvY0BsCisgICAgVktfUFBDX1RPQ19ISSwgICAgICAgICAvLyBzeW1ib2xAdG9jQGgKKyAgICBWS19QUENfVE9DX0hBLCAgICAgICAgIC8vIHN5bWJvbEB0b2NAaGEKKyAgICBWS19QUENfRFRQTU9ELCAgICAgICAgIC8vIHN5bWJvbEBkdHBtb2QKKyAgICBWS19QUENfVFBSRUxfTE8sICAgICAgIC8vIHN5bWJvbEB0cHJlbEBsCisgICAgVktfUFBDX1RQUkVMX0hJLCAgICAgICAvLyBzeW1ib2xAdHByZWxAaAorICAgIFZLX1BQQ19UUFJFTF9IQSwgICAgICAgLy8gc3ltYm9sQHRwcmVsQGhhCisgICAgVktfUFBDX1RQUkVMX0hJR0hFUiwgICAvLyBzeW1ib2xAdHByZWxAaGlnaGVyCisgICAgVktfUFBDX1RQUkVMX0hJR0hFUkEsICAvLyBzeW1ib2xAdHByZWxAaGlnaGVyYQorICAgIFZLX1BQQ19UUFJFTF9ISUdIRVNULCAgLy8gc3ltYm9sQHRwcmVsQGhpZ2hlc3QKKyAgICBWS19QUENfVFBSRUxfSElHSEVTVEEsIC8vIHN5bWJvbEB0cHJlbEBoaWdoZXN0YQorICAgIFZLX1BQQ19EVFBSRUxfTE8sICAgICAgLy8gc3ltYm9sQGR0cHJlbEBsCisgICAgVktfUFBDX0RUUFJFTF9ISSwgICAgICAvLyBzeW1ib2xAZHRwcmVsQGgKKyAgICBWS19QUENfRFRQUkVMX0hBLCAgICAgIC8vIHN5bWJvbEBkdHByZWxAaGEKKyAgICBWS19QUENfRFRQUkVMX0hJR0hFUiwgIC8vIHN5bWJvbEBkdHByZWxAaGlnaGVyCisgICAgVktfUFBDX0RUUFJFTF9ISUdIRVJBLCAvLyBzeW1ib2xAZHRwcmVsQGhpZ2hlcmEKKyAgICBWS19QUENfRFRQUkVMX0hJR0hFU1QsIC8vIHN5bWJvbEBkdHByZWxAaGlnaGVzdAorICAgIFZLX1BQQ19EVFBSRUxfSElHSEVTVEEsLy8gc3ltYm9sQGR0cHJlbEBoaWdoZXN0YQorICAgIFZLX1BQQ19HT1RfVFBSRUwsICAgICAgLy8gc3ltYm9sQGdvdEB0cHJlbAorICAgIFZLX1BQQ19HT1RfVFBSRUxfTE8sICAgLy8gc3ltYm9sQGdvdEB0cHJlbEBsCisgICAgVktfUFBDX0dPVF9UUFJFTF9ISSwgICAvLyBzeW1ib2xAZ290QHRwcmVsQGgKKyAgICBWS19QUENfR09UX1RQUkVMX0hBLCAgIC8vIHN5bWJvbEBnb3RAdHByZWxAaGEKKyAgICBWS19QUENfR09UX0RUUFJFTCwgICAgIC8vIHN5bWJvbEBnb3RAZHRwcmVsCisgICAgVktfUFBDX0dPVF9EVFBSRUxfTE8sICAvLyBzeW1ib2xAZ290QGR0cHJlbEBsCisgICAgVktfUFBDX0dPVF9EVFBSRUxfSEksICAvLyBzeW1ib2xAZ290QGR0cHJlbEBoCisgICAgVktfUFBDX0dPVF9EVFBSRUxfSEEsICAvLyBzeW1ib2xAZ290QGR0cHJlbEBoYQorICAgIFZLX1BQQ19UTFMsICAgICAgICAgICAgLy8gc3ltYm9sQHRscworICAgIFZLX1BQQ19HT1RfVExTR0QsICAgICAgLy8gc3ltYm9sQGdvdEB0bHNnZAorICAgIFZLX1BQQ19HT1RfVExTR0RfTE8sICAgLy8gc3ltYm9sQGdvdEB0bHNnZEBsCisgICAgVktfUFBDX0dPVF9UTFNHRF9ISSwgICAvLyBzeW1ib2xAZ290QHRsc2dkQGgKKyAgICBWS19QUENfR09UX1RMU0dEX0hBLCAgIC8vIHN5bWJvbEBnb3RAdGxzZ2RAaGEKKyAgICBWS19QUENfVExTR0QsICAgICAgICAgIC8vIHN5bWJvbEB0bHNnZAorICAgIFZLX1BQQ19HT1RfVExTTEQsICAgICAgLy8gc3ltYm9sQGdvdEB0bHNsZAorICAgIFZLX1BQQ19HT1RfVExTTERfTE8sICAgLy8gc3ltYm9sQGdvdEB0bHNsZEBsCisgICAgVktfUFBDX0dPVF9UTFNMRF9ISSwgICAvLyBzeW1ib2xAZ290QHRsc2xkQGgKKyAgICBWS19QUENfR09UX1RMU0xEX0hBLCAgIC8vIHN5bWJvbEBnb3RAdGxzbGRAaGEKKyAgICBWS19QUENfVExTTEQsICAgICAgICAgIC8vIHN5bWJvbEB0bHNsZAorICAgIFZLX1BQQ19MT0NBTCwgICAgICAgICAgLy8gc3ltYm9sQGxvY2FsCisKKyAgICBWS19DT0ZGX0lNR1JFTDMyLCAvLyBzeW1ib2xAaW1ncmVsIChpbWFnZS1yZWxhdGl2ZSkKKworICAgIFZLX0hleGFnb25fUENSRUwsCisgICAgVktfSGV4YWdvbl9MTzE2LAorICAgIFZLX0hleGFnb25fSEkxNiwKKyAgICBWS19IZXhhZ29uX0dQUkVMLAorICAgIFZLX0hleGFnb25fR0RfR09ULAorICAgIFZLX0hleGFnb25fTERfR09ULAorICAgIFZLX0hleGFnb25fR0RfUExULAorICAgIFZLX0hleGFnb25fTERfUExULAorICAgIFZLX0hleGFnb25fSUUsCisgICAgVktfSGV4YWdvbl9JRV9HT1QsCisKKyAgICBWS19XZWJBc3NlbWJseV9GVU5DVElPTiwgLy8gRnVuY3Rpb24gdGFibGUgaW5kZXgsIHJhdGhlciB0aGFuIHZpcnR1YWwgYWRkcgorICAgIFZLX1dlYkFzc2VtYmx5X1RZUEVJTkRFWCwvLyBUeXBlIHRhYmxlIGluZGV4CisKKyAgICBWS19BTURHUFVfR09UUENSRUwzMl9MTywgLy8gc3ltYm9sQGdvdHBjcmVsMzJAbG8KKyAgICBWS19BTURHUFVfR09UUENSRUwzMl9ISSwgLy8gc3ltYm9sQGdvdHBjcmVsMzJAaGkKKyAgICBWS19BTURHUFVfUkVMMzJfTE8sICAgICAgLy8gc3ltYm9sQHJlbDMyQGxvCisgICAgVktfQU1ER1BVX1JFTDMyX0hJLCAgICAgIC8vIHN5bWJvbEByZWwzMkBoaQorCisgICAgVktfVFBSRUwsCisgICAgVktfRFRQUkVMCisgIH07CisKK3ByaXZhdGU6CisgIC8vLyBUaGUgc3ltYm9sIHJlZmVyZW5jZSBtb2RpZmllci4KKyAgY29uc3QgVmFyaWFudEtpbmQgS2luZDsKKworICAvLy8gU3BlY2lmaWVzIGhvdyB0aGUgdmFyaWFudCBraW5kIHNob3VsZCBiZSBwcmludGVkLgorICBjb25zdCB1bnNpZ25lZCBVc2VQYXJlbnNGb3JTeW1ib2xWYXJpYW50IDogMTsKKworICAvLyBGSVhNRTogUmVtb3ZlIHRoaXMgYml0LgorICBjb25zdCB1bnNpZ25lZCBIYXNTdWJzZWN0aW9uc1ZpYVN5bWJvbHMgOiAxOworCisgIC8vLyBUaGUgc3ltYm9sIGJlaW5nIHJlZmVyZW5jZWQuCisgIGNvbnN0IE1DU3ltYm9sICpTeW1ib2w7CisKKyAgZXhwbGljaXQgTUNTeW1ib2xSZWZFeHByKGNvbnN0IE1DU3ltYm9sICpTeW1ib2wsIFZhcmlhbnRLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUluZm8gKk1BSSwgU01Mb2MgTG9jID0gU01Mb2MoKSk7CisKK3B1YmxpYzoKKyAgLy8vIFxuYW1lIENvbnN0cnVjdGlvbgorICAvLy8gQHsKKworICBzdGF0aWMgY29uc3QgTUNTeW1ib2xSZWZFeHByICpjcmVhdGUoY29uc3QgTUNTeW1ib2wgKlN5bWJvbCwgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gTUNTeW1ib2xSZWZFeHByOjpjcmVhdGUoU3ltYm9sLCBWS19Ob25lLCBDdHgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DU3ltYm9sUmVmRXhwciAqY3JlYXRlKGNvbnN0IE1DU3ltYm9sICpTeW1ib2wsIFZhcmlhbnRLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCwgU01Mb2MgTG9jID0gU01Mb2MoKSk7CisgIHN0YXRpYyBjb25zdCBNQ1N5bWJvbFJlZkV4cHIgKmNyZWF0ZShTdHJpbmdSZWYgTmFtZSwgVmFyaWFudEtpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KTsKKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIEFjY2Vzc29ycworICAvLy8gQHsKKworICBjb25zdCBNQ1N5bWJvbCAmZ2V0U3ltYm9sKCkgY29uc3QgeyByZXR1cm4gKlN5bWJvbDsgfQorCisgIFZhcmlhbnRLaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKKyAgdm9pZCBwcmludFZhcmlhbnRLaW5kKHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgYm9vbCBoYXNTdWJzZWN0aW9uc1ZpYVN5bWJvbHMoKSBjb25zdCB7IHJldHVybiBIYXNTdWJzZWN0aW9uc1ZpYVN5bWJvbHM7IH0KKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIFN0YXRpYyBVdGlsaXR5IEZ1bmN0aW9ucworICAvLy8gQHsKKworICBzdGF0aWMgU3RyaW5nUmVmIGdldFZhcmlhbnRLaW5kTmFtZShWYXJpYW50S2luZCBLaW5kKTsKKworICBzdGF0aWMgVmFyaWFudEtpbmQgZ2V0VmFyaWFudEtpbmRGb3JOYW1lKFN0cmluZ1JlZiBOYW1lKTsKKworICAvLy8gQH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DRXhwciAqRSkgeworICAgIHJldHVybiBFLT5nZXRLaW5kKCkgPT0gTUNFeHByOjpTeW1ib2xSZWY7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVW5hcnkgYXNzZW1ibGVyIGV4cHJlc3Npb25zLgorY2xhc3MgTUNVbmFyeUV4cHIgOiBwdWJsaWMgTUNFeHByIHsKK3B1YmxpYzoKKyAgZW51bSBPcGNvZGUgeworICAgIExOb3QsICAvLy88IExvZ2ljYWwgbmVnYXRpb24uCisgICAgTWludXMsIC8vLzwgVW5hcnkgbWludXMuCisgICAgTm90LCAgIC8vLzwgQml0d2lzZSBuZWdhdGlvbi4KKyAgICBQbHVzICAgLy8vPCBVbmFyeSBwbHVzLgorICB9OworCitwcml2YXRlOgorICBPcGNvZGUgT3A7CisgIGNvbnN0IE1DRXhwciAqRXhwcjsKKworICBNQ1VuYXJ5RXhwcihPcGNvZGUgT3AsIGNvbnN0IE1DRXhwciAqRXhwciwgU01Mb2MgTG9jKQorICAgICAgOiBNQ0V4cHIoTUNFeHByOjpVbmFyeSwgTG9jKSwgT3AoT3ApLCBFeHByKEV4cHIpIHt9CisKK3B1YmxpYzoKKyAgLy8vIFxuYW1lIENvbnN0cnVjdGlvbgorICAvLy8gQHsKKworICBzdGF0aWMgY29uc3QgTUNVbmFyeUV4cHIgKmNyZWF0ZShPcGNvZGUgT3AsIGNvbnN0IE1DRXhwciAqRXhwciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgsIFNNTG9jIExvYyA9IFNNTG9jKCkpOworCisgIHN0YXRpYyBjb25zdCBNQ1VuYXJ5RXhwciAqY3JlYXRlTE5vdChjb25zdCBNQ0V4cHIgKkV4cHIsIE1DQ29udGV4dCAmQ3R4LCBTTUxvYyBMb2MgPSBTTUxvYygpKSB7CisgICAgcmV0dXJuIGNyZWF0ZShMTm90LCBFeHByLCBDdHgsIExvYyk7CisgIH0KKworICBzdGF0aWMgY29uc3QgTUNVbmFyeUV4cHIgKmNyZWF0ZU1pbnVzKGNvbnN0IE1DRXhwciAqRXhwciwgTUNDb250ZXh0ICZDdHgsIFNNTG9jIExvYyA9IFNNTG9jKCkpIHsKKyAgICByZXR1cm4gY3JlYXRlKE1pbnVzLCBFeHByLCBDdHgsIExvYyk7CisgIH0KKworICBzdGF0aWMgY29uc3QgTUNVbmFyeUV4cHIgKmNyZWF0ZU5vdChjb25zdCBNQ0V4cHIgKkV4cHIsIE1DQ29udGV4dCAmQ3R4LCBTTUxvYyBMb2MgPSBTTUxvYygpKSB7CisgICAgcmV0dXJuIGNyZWF0ZShOb3QsIEV4cHIsIEN0eCwgTG9jKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBNQ1VuYXJ5RXhwciAqY3JlYXRlUGx1cyhjb25zdCBNQ0V4cHIgKkV4cHIsIE1DQ29udGV4dCAmQ3R4LCBTTUxvYyBMb2MgPSBTTUxvYygpKSB7CisgICAgcmV0dXJuIGNyZWF0ZShQbHVzLCBFeHByLCBDdHgsIExvYyk7CisgIH0KKworICAvLy8gQH0KKyAgLy8vIFxuYW1lIEFjY2Vzc29ycworICAvLy8gQHsKKworICAvLy8gXGJyaWVmIEdldCB0aGUga2luZCBvZiB0aGlzIHVuYXJ5IGV4cHJlc3Npb24uCisgIE9wY29kZSBnZXRPcGNvZGUoKSBjb25zdCB7IHJldHVybiBPcDsgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBjaGlsZCBvZiB0aGlzIHVuYXJ5IGV4cHJlc3Npb24uCisgIGNvbnN0IE1DRXhwciAqZ2V0U3ViRXhwcigpIGNvbnN0IHsgcmV0dXJuIEV4cHI7IH0KKworICAvLy8gQH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DRXhwciAqRSkgeworICAgIHJldHVybiBFLT5nZXRLaW5kKCkgPT0gTUNFeHByOjpVbmFyeTsKKyAgfQorfTsKKworLy8vIFxicmllZiBCaW5hcnkgYXNzZW1ibGVyIGV4cHJlc3Npb25zLgorY2xhc3MgTUNCaW5hcnlFeHByIDogcHVibGljIE1DRXhwciB7CitwdWJsaWM6CisgIGVudW0gT3Bjb2RlIHsKKyAgICBBZGQsICAvLy88IEFkZGl0aW9uLgorICAgIEFuZCwgIC8vLzwgQml0d2lzZSBhbmQuCisgICAgRGl2LCAgLy8vPCBTaWduZWQgZGl2aXNpb24uCisgICAgRVEsICAgLy8vPCBFcXVhbGl0eSBjb21wYXJpc29uLgorICAgIEdULCAgIC8vLzwgU2lnbmVkIGdyZWF0ZXIgdGhhbiBjb21wYXJpc29uIChyZXN1bHQgaXMgZWl0aGVyIDAgb3Igc29tZQorICAgICAgICAgIC8vLzwgdGFyZ2V0LXNwZWNpZmljIG5vbi16ZXJvIHZhbHVlKQorICAgIEdURSwgIC8vLzwgU2lnbmVkIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCBjb21wYXJpc29uIChyZXN1bHQgaXMgZWl0aGVyIDAgb3IKKyAgICAgICAgICAvLy88IHNvbWUgdGFyZ2V0LXNwZWNpZmljIG5vbi16ZXJvIHZhbHVlKS4KKyAgICBMQW5kLCAvLy88IExvZ2ljYWwgYW5kLgorICAgIExPciwgIC8vLzwgTG9naWNhbCBvci4KKyAgICBMVCwgICAvLy88IFNpZ25lZCBsZXNzIHRoYW4gY29tcGFyaXNvbiAocmVzdWx0IGlzIGVpdGhlciAwIG9yCisgICAgICAgICAgLy8vPCBzb21lIHRhcmdldC1zcGVjaWZpYyBub24temVybyB2YWx1ZSkuCisgICAgTFRFLCAgLy8vPCBTaWduZWQgbGVzcyB0aGFuIG9yIGVxdWFsIGNvbXBhcmlzb24gKHJlc3VsdCBpcyBlaXRoZXIgMCBvcgorICAgICAgICAgIC8vLzwgc29tZSB0YXJnZXQtc3BlY2lmaWMgbm9uLXplcm8gdmFsdWUpLgorICAgIE1vZCwgIC8vLzwgU2lnbmVkIHJlbWFpbmRlci4KKyAgICBNdWwsICAvLy88IE11bHRpcGxpY2F0aW9uLgorICAgIE5FLCAgIC8vLzwgSW5lcXVhbGl0eSBjb21wYXJpc29uLgorICAgIE9yLCAgIC8vLzwgQml0d2lzZSBvci4KKyAgICBTaGwsICAvLy88IFNoaWZ0IGxlZnQuCisgICAgQVNociwgLy8vPCBBcml0aG1ldGljIHNoaWZ0IHJpZ2h0LgorICAgIExTaHIsIC8vLzwgTG9naWNhbCBzaGlmdCByaWdodC4KKyAgICBTdWIsICAvLy88IFN1YnRyYWN0aW9uLgorICAgIFhvciAgIC8vLzwgQml0d2lzZSBleGNsdXNpdmUgb3IuCisgIH07CisKK3ByaXZhdGU6CisgIE9wY29kZSBPcDsKKyAgY29uc3QgTUNFeHByICpMSFMsICpSSFM7CisKKyAgTUNCaW5hcnlFeHByKE9wY29kZSBPcCwgY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgU01Mb2MgTG9jID0gU01Mb2MoKSkKKyAgICAgIDogTUNFeHByKE1DRXhwcjo6QmluYXJ5LCBMb2MpLCBPcChPcCksIExIUyhMSFMpLCBSSFMoUkhTKSB7fQorCitwdWJsaWM6CisgIC8vLyBcbmFtZSBDb25zdHJ1Y3Rpb24KKyAgLy8vIEB7CisKKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqY3JlYXRlKE9wY29kZSBPcCwgY29uc3QgTUNFeHByICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0V4cHIgKlJIUywgTUNDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUxvYyBMb2MgPSBTTUxvYygpKTsKKworICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpjcmVhdGVBZGQoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gY3JlYXRlKEFkZCwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpjcmVhdGVBbmQoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gY3JlYXRlKEFuZCwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpjcmVhdGVEaXYoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gY3JlYXRlKERpdiwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpjcmVhdGVFUShjb25zdCBNQ0V4cHIgKkxIUywgY29uc3QgTUNFeHByICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIGNyZWF0ZShFUSwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpjcmVhdGVHVChjb25zdCBNQ0V4cHIgKkxIUywgY29uc3QgTUNFeHByICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIGNyZWF0ZShHVCwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpjcmVhdGVHVEUoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gY3JlYXRlKEdURSwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpjcmVhdGVMQW5kKGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCkgeworICAgIHJldHVybiBjcmVhdGUoTEFuZCwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpjcmVhdGVMT3IoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gY3JlYXRlKExPciwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpjcmVhdGVMVChjb25zdCBNQ0V4cHIgKkxIUywgY29uc3QgTUNFeHByICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIGNyZWF0ZShMVCwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpjcmVhdGVMVEUoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gY3JlYXRlKExURSwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpjcmVhdGVNb2QoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gY3JlYXRlKE1vZCwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpjcmVhdGVNdWwoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gY3JlYXRlKE11bCwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpjcmVhdGVORShjb25zdCBNQ0V4cHIgKkxIUywgY29uc3QgTUNFeHByICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIGNyZWF0ZShORSwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpjcmVhdGVPcihjb25zdCBNQ0V4cHIgKkxIUywgY29uc3QgTUNFeHByICpSSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIGNyZWF0ZShPciwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpjcmVhdGVTaGwoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gY3JlYXRlKFNobCwgTEhTLCBSSFMsIEN0eCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgTUNCaW5hcnlFeHByICpjcmVhdGVBU2hyKGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIGNyZWF0ZShBU2hyLCBMSFMsIFJIUywgQ3R4KTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCBNQ0JpbmFyeUV4cHIgKmNyZWF0ZUxTaHIoY29uc3QgTUNFeHByICpMSFMsIGNvbnN0IE1DRXhwciAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpIHsKKyAgICByZXR1cm4gY3JlYXRlKExTaHIsIExIUywgUkhTLCBDdHgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqY3JlYXRlU3ViKGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIGNyZWF0ZShTdWIsIExIUywgUkhTLCBDdHgpOworICB9CisKKyAgc3RhdGljIGNvbnN0IE1DQmluYXJ5RXhwciAqY3JlYXRlWG9yKGNvbnN0IE1DRXhwciAqTEhTLCBjb25zdCBNQ0V4cHIgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIGNyZWF0ZShYb3IsIExIUywgUkhTLCBDdHgpOworICB9CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGtpbmQgb2YgdGhpcyBiaW5hcnkgZXhwcmVzc2lvbi4KKyAgT3Bjb2RlIGdldE9wY29kZSgpIGNvbnN0IHsgcmV0dXJuIE9wOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGxlZnQtaGFuZCBzaWRlIGV4cHJlc3Npb24gb2YgdGhlIGJpbmFyeSBvcGVyYXRvci4KKyAgY29uc3QgTUNFeHByICpnZXRMSFMoKSBjb25zdCB7IHJldHVybiBMSFM7IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgcmlnaHQtaGFuZCBzaWRlIGV4cHJlc3Npb24gb2YgdGhlIGJpbmFyeSBvcGVyYXRvci4KKyAgY29uc3QgTUNFeHByICpnZXRSSFMoKSBjb25zdCB7IHJldHVybiBSSFM7IH0KKworICAvLy8gQH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DRXhwciAqRSkgeworICAgIHJldHVybiBFLT5nZXRLaW5kKCkgPT0gTUNFeHByOjpCaW5hcnk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyBpcyBhbiBleHRlbnNpb24gcG9pbnQgZm9yIHRhcmdldC1zcGVjaWZpYyBNQ0V4cHIgc3ViY2xhc3NlcyB0bworLy8vIGltcGxlbWVudC4KKy8vLworLy8vIE5PVEU6IEFsbCBzdWJjbGFzc2VzIGFyZSByZXF1aXJlZCB0byBoYXZlIHRyaXZpYWwgZGVzdHJ1Y3RvcnMgYmVjYXVzZQorLy8vIE1DRXhwcnMgYXJlIGJ1bXAgcG9pbnRlciBhbGxvY2F0ZWQgYW5kIG5vdCBkZXN0cnVjdGVkLgorY2xhc3MgTUNUYXJnZXRFeHByIDogcHVibGljIE1DRXhwciB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHJvdGVjdGVkOgorICBNQ1RhcmdldEV4cHIoKSA6IE1DRXhwcihUYXJnZXQsIFNNTG9jKCkpIHt9CisgIHZpcnR1YWwgfk1DVGFyZ2V0RXhwcigpID0gZGVmYXVsdDsKKworcHVibGljOgorICB2aXJ0dWFsIHZvaWQgcHJpbnRJbXBsKHJhd19vc3RyZWFtICZPUywgY29uc3QgTUNBc21JbmZvICpNQUkpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGV2YWx1YXRlQXNSZWxvY2F0YWJsZUltcGwoTUNWYWx1ZSAmUmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAqTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0ZpeHVwICpGaXh1cCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgdmlzaXRVc2VkRXhwcihNQ1N0cmVhbWVyJiBTdHJlYW1lcikgY29uc3QgPSAwOworICB2aXJ0dWFsIE1DRnJhZ21lbnQgKmZpbmRBc3NvY2lhdGVkRnJhZ21lbnQoKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCB2b2lkIGZpeEVMRlN5bWJvbHNJblRMU0ZpeHVwcyhNQ0Fzc2VtYmxlciAmKSBjb25zdCA9IDA7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0V4cHIgKkUpIHsKKyAgICByZXR1cm4gRS0+Z2V0S2luZCgpID09IE1DRXhwcjo6VGFyZ2V0OworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ0VYUFJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0ZpeGVkTGVuRGlzYXNzZW1ibGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRml4ZWRMZW5EaXNhc3NlbWJsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZDM0ZDk0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0ZpeGVkTGVuRGlzYXNzZW1ibGVyLmgKQEAgLTAsMCArMSwzNCBAQAorLy89PT0tLSBsbHZtL01DL01DRml4ZWRMZW5EaXNhc3NlbWJsZXIuaCAtIERlY29kZXIgZHJpdmVyIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEZpeGVkIGxlbmd0aCBkaXNhc3NlbWJsZXIgZGVjb2RlciBzdGF0ZSBtYWNoaW5lIGRyaXZlci4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fTUNfTUNGSVhFRExFTkRJU0FTU0VNQkxFUl9ICisjZGVmaW5lIExMVk1fTUNfTUNGSVhFRExFTkRJU0FTU0VNQkxFUl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworbmFtZXNwYWNlIE1DRCB7CisvLyBEaXNhc3NlbWJsZXIgc3RhdGUgbWFjaGluZSBvcGNvZGVzLgorZW51bSBEZWNvZGVyT3BzIHsKKyAgT1BDX0V4dHJhY3RGaWVsZCA9IDEsIC8vIE9QQ19FeHRyYWN0RmllbGQodWludDhfdCBTdGFydCwgdWludDhfdCBMZW4pCisgIE9QQ19GaWx0ZXJWYWx1ZSwgICAgICAvLyBPUENfRmlsdGVyVmFsdWUodWxlYjEyOCBWYWwsIHVpbnQxNl90IE51bVRvU2tpcCkKKyAgT1BDX0NoZWNrRmllbGQsICAgICAgIC8vIE9QQ19DaGVja0ZpZWxkKHVpbnQ4X3QgU3RhcnQsIHVpbnQ4X3QgTGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICAgdWxlYjEyOCBWYWwsIHVpbnQxNl90IE51bVRvU2tpcCkKKyAgT1BDX0NoZWNrUHJlZGljYXRlLCAgIC8vIE9QQ19DaGVja1ByZWRpY2F0ZSh1bGViMTI4IFBJZHgsIHVpbnQxNl90IE51bVRvU2tpcCkKKyAgT1BDX0RlY29kZSwgICAgICAgICAgIC8vIE9QQ19EZWNvZGUodWxlYjEyOCBPcGNvZGUsIHVsZWIxMjggRElkeCkKKyAgT1BDX1RyeURlY29kZSwgICAgICAgIC8vIE9QQ19UcnlEZWNvZGUodWxlYjEyOCBPcGNvZGUsIHVsZWIxMjggRElkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgdWludDE2X3QgTnVtVG9Ta2lwKQorICBPUENfU29mdEZhaWwsICAgICAgICAgLy8gT1BDX1NvZnRGYWlsKHVsZWIxMjggUE1hc2ssIHVsZWIxMjggTk1hc2spCisgIE9QQ19GYWlsICAgICAgICAgICAgICAvLyBPUENfRmFpbCgpCit9OworCit9IC8vIG5hbWVzcGFjZSBNQ0RlY29kZQorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNGaXh1cC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0ZpeHVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgzMDg2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNGaXh1cC5oCkBAIC0wLDAgKzEsMTE3IEBACisvLz09PS0tIGxsdm0vTUMvTUNGaXh1cC5oIC0gSW5zdHJ1Y3Rpb24gUmVsb2NhdGlvbiBhbmQgUGF0Y2hpbmcgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNGSVhVUF9ICisjZGVmaW5lIExMVk1fTUNfTUNGSVhVUF9ICisKKyNpbmNsdWRlICJsbHZtL01DL01DRXhwci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TTUxvYy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1DRXhwcjsKKworLy8vIFxicmllZiBFeHRlbnNpYmxlIGVudW1lcmF0aW9uIHRvIHJlcHJlc2VudCB0aGUgdHlwZSBvZiBhIGZpeHVwLgorZW51bSBNQ0ZpeHVwS2luZCB7CisgIEZLX0RhdGFfMSA9IDAsIC8vLzwgQSBvbmUtYnl0ZSBmaXh1cC4KKyAgRktfRGF0YV8yLCAgICAgLy8vPCBBIHR3by1ieXRlIGZpeHVwLgorICBGS19EYXRhXzQsICAgICAvLy88IEEgZm91ci1ieXRlIGZpeHVwLgorICBGS19EYXRhXzgsICAgICAvLy88IEEgZWlnaHQtYnl0ZSBmaXh1cC4KKyAgRktfUENSZWxfMSwgICAgLy8vPCBBIG9uZS1ieXRlIHBjIHJlbGF0aXZlIGZpeHVwLgorICBGS19QQ1JlbF8yLCAgICAvLy88IEEgdHdvLWJ5dGUgcGMgcmVsYXRpdmUgZml4dXAuCisgIEZLX1BDUmVsXzQsICAgIC8vLzwgQSBmb3VyLWJ5dGUgcGMgcmVsYXRpdmUgZml4dXAuCisgIEZLX1BDUmVsXzgsICAgIC8vLzwgQSBlaWdodC1ieXRlIHBjIHJlbGF0aXZlIGZpeHVwLgorICBGS19HUFJlbF8xLCAgICAvLy88IEEgb25lLWJ5dGUgZ3AgcmVsYXRpdmUgZml4dXAuCisgIEZLX0dQUmVsXzIsICAgIC8vLzwgQSB0d28tYnl0ZSBncCByZWxhdGl2ZSBmaXh1cC4KKyAgRktfR1BSZWxfNCwgICAgLy8vPCBBIGZvdXItYnl0ZSBncCByZWxhdGl2ZSBmaXh1cC4KKyAgRktfR1BSZWxfOCwgICAgLy8vPCBBIGVpZ2h0LWJ5dGUgZ3AgcmVsYXRpdmUgZml4dXAuCisgIEZLX0RUUFJlbF80LCAgIC8vLzwgQSBmb3VyLWJ5dGUgZHRwIHJlbGF0aXZlIGZpeHVwLgorICBGS19EVFBSZWxfOCwgICAvLy88IEEgZWlnaHQtYnl0ZSBkdHAgcmVsYXRpdmUgZml4dXAuCisgIEZLX1RQUmVsXzQsICAgIC8vLzwgQSBmb3VyLWJ5dGUgdHAgcmVsYXRpdmUgZml4dXAuCisgIEZLX1RQUmVsXzgsICAgIC8vLzwgQSBlaWdodC1ieXRlIHRwIHJlbGF0aXZlIGZpeHVwLgorICBGS19TZWNSZWxfMSwgICAvLy88IEEgb25lLWJ5dGUgc2VjdGlvbiByZWxhdGl2ZSBmaXh1cC4KKyAgRktfU2VjUmVsXzIsICAgLy8vPCBBIHR3by1ieXRlIHNlY3Rpb24gcmVsYXRpdmUgZml4dXAuCisgIEZLX1NlY1JlbF80LCAgIC8vLzwgQSBmb3VyLWJ5dGUgc2VjdGlvbiByZWxhdGl2ZSBmaXh1cC4KKyAgRktfU2VjUmVsXzgsICAgLy8vPCBBIGVpZ2h0LWJ5dGUgc2VjdGlvbiByZWxhdGl2ZSBmaXh1cC4KKworICBGaXJzdFRhcmdldEZpeHVwS2luZCA9IDEyOCwKKworICAvLyBMaW1pdCByYW5nZSBvZiB0YXJnZXQgZml4dXBzLCBpbiBjYXNlIHdlIHdhbnQgdG8gcGFjayBtb3JlIGVmZmljaWVudGx5CisgIC8vIGxhdGVyLgorICBNYXhUYXJnZXRGaXh1cEtpbmQgPSAoMSA8PCA4KQorfTsKKworLy8vIFxicmllZiBFbmNvZGUgaW5mb3JtYXRpb24gb24gYSBzaW5nbGUgb3BlcmF0aW9uIHRvIHBlcmZvcm0gb24gYSBieXRlCisvLy8gc2VxdWVuY2UgKGUuZy4sIGFuIGVuY29kZWQgaW5zdHJ1Y3Rpb24pIHdoaWNoIHJlcXVpcmVzIGFzc2VtYmxlLSBvciBydW4tCisvLy8gdGltZSBwYXRjaGluZy4KKy8vLworLy8vIEZpeHVwcyBhcmUgdXNlZCBhbnkgdGltZSB0aGUgdGFyZ2V0IGluc3RydWN0aW9uIGVuY29kZXIgbmVlZHMgdG8gcmVwcmVzZW50CisvLy8gc29tZSB2YWx1ZSBpbiBhbiBpbnN0cnVjdGlvbiB3aGljaCBpcyBub3QgeWV0IGNvbmNyZXRlLiBUaGUgZW5jb2RlciB3aWxsCisvLy8gZW5jb2RlIHRoZSBpbnN0cnVjdGlvbiBhc3N1bWluZyB0aGUgdmFsdWUgaXMgMCwgYW5kIGVtaXQgYSBmaXh1cCB3aGljaAorLy8vIGNvbW11bmljYXRlcyB0byB0aGUgYXNzZW1ibGVyIGJhY2tlbmQgaG93IGl0IHNob3VsZCByZXdyaXRlIHRoZSBlbmNvZGVkCisvLy8gdmFsdWUuCisvLy8KKy8vLyBEdXJpbmcgdGhlIHByb2Nlc3Mgb2YgcmVsYXhhdGlvbiwgdGhlIGFzc2VtYmxlciB3aWxsIGFwcGx5IGZpeHVwcyBhcworLy8vIHN5bWJvbGljIHZhbHVlcyBiZWNvbWUgY29uY3JldGUuIFdoZW4gcmVsYXhhdGlvbiBpcyBjb21wbGV0ZSwgYW55IHJlbWFpbmluZworLy8vIGZpeHVwcyBiZWNvbWUgcmVsb2NhdGlvbnMgaW4gdGhlIG9iamVjdCBmaWxlIChvciBlcnJvcnMsIGlmIHRoZSBmaXh1cCBjYW5ub3QKKy8vLyBiZSBlbmNvZGVkIG9uIHRoZSB0YXJnZXQpLgorY2xhc3MgTUNGaXh1cCB7CisgIC8vLyBUaGUgdmFsdWUgdG8gcHV0IGludG8gdGhlIGZpeHVwIGxvY2F0aW9uLiBUaGUgZXhhY3QgaW50ZXJwcmV0YXRpb24gb2YgdGhlCisgIC8vLyBleHByZXNzaW9uIGlzIHRhcmdldCBkZXBlbmRlbnQsIHVzdWFsbHkgaXQgd2lsbCBiZSBvbmUgb2YgdGhlIG9wZXJhbmRzIHRvCisgIC8vLyBhbiBpbnN0cnVjdGlvbiBvciBhbiBhc3NlbWJsZXIgZGlyZWN0aXZlLgorICBjb25zdCBNQ0V4cHIgKlZhbHVlOworCisgIC8vLyBUaGUgYnl0ZSBpbmRleCBvZiBzdGFydCBvZiB0aGUgcmVsb2NhdGlvbiBpbnNpZGUgdGhlIE1DRnJhZ21lbnQuCisgIHVpbnQzMl90IE9mZnNldDsKKworICAvLy8gVGhlIHRhcmdldCBkZXBlbmRlbnQga2luZCBvZiBmaXh1cCBpdGVtIHRoaXMgaXMuIFRoZSBraW5kIGlzIHVzZWQgdG8KKyAgLy8vIGRldGVybWluZSBob3cgdGhlIG9wZXJhbmQgdmFsdWUgc2hvdWxkIGJlIGVuY29kZWQgaW50byB0aGUgaW5zdHJ1Y3Rpb24uCisgIHVuc2lnbmVkIEtpbmQ7CisKKyAgLy8vIFRoZSBzb3VyY2UgbG9jYXRpb24gd2hpY2ggZ2F2ZSByaXNlIHRvIHRoZSBmaXh1cCwgaWYgYW55LgorICBTTUxvYyBMb2M7CitwdWJsaWM6CisgIHN0YXRpYyBNQ0ZpeHVwIGNyZWF0ZSh1aW50MzJfdCBPZmZzZXQsIGNvbnN0IE1DRXhwciAqVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBNQ0ZpeHVwS2luZCBLaW5kLCBTTUxvYyBMb2MgPSBTTUxvYygpKSB7CisgICAgYXNzZXJ0KHVuc2lnbmVkKEtpbmQpIDwgTWF4VGFyZ2V0Rml4dXBLaW5kICYmICJLaW5kIG91dCBvZiByYW5nZSEiKTsKKyAgICBNQ0ZpeHVwIEZJOworICAgIEZJLlZhbHVlID0gVmFsdWU7CisgICAgRkkuT2Zmc2V0ID0gT2Zmc2V0OworICAgIEZJLktpbmQgPSB1bnNpZ25lZChLaW5kKTsKKyAgICBGSS5Mb2MgPSBMb2M7CisgICAgcmV0dXJuIEZJOworICB9CisKKyAgTUNGaXh1cEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIE1DRml4dXBLaW5kKEtpbmQpOyB9CisKKyAgdWludDMyX3QgZ2V0T2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gT2Zmc2V0OyB9CisgIHZvaWQgc2V0T2Zmc2V0KHVpbnQzMl90IFZhbHVlKSB7IE9mZnNldCA9IFZhbHVlOyB9CisKKyAgY29uc3QgTUNFeHByICpnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGdlbmVyaWMgZml4dXAga2luZCBmb3IgYSB2YWx1ZSB3aXRoIHRoZSBnaXZlbiBzaXplLiBJdAorICAvLy8gaXMgYW4gZXJyb3IgdG8gcGFzcyBhbiB1bnN1cHBvcnRlZCBzaXplLgorICBzdGF0aWMgTUNGaXh1cEtpbmQgZ2V0S2luZEZvclNpemUodW5zaWduZWQgU2l6ZSwgYm9vbCBpc1BDUmVsKSB7CisgICAgc3dpdGNoIChTaXplKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBnZW5lcmljIGZpeHVwIHNpemUhIik7CisgICAgY2FzZSAxOiByZXR1cm4gaXNQQ1JlbCA/IEZLX1BDUmVsXzEgOiBGS19EYXRhXzE7CisgICAgY2FzZSAyOiByZXR1cm4gaXNQQ1JlbCA/IEZLX1BDUmVsXzIgOiBGS19EYXRhXzI7CisgICAgY2FzZSA0OiByZXR1cm4gaXNQQ1JlbCA/IEZLX1BDUmVsXzQgOiBGS19EYXRhXzQ7CisgICAgY2FzZSA4OiByZXR1cm4gaXNQQ1JlbCA/IEZLX1BDUmVsXzggOiBGS19EYXRhXzg7CisgICAgfQorICB9CisKKyAgU01Mb2MgZ2V0TG9jKCkgY29uc3QgeyByZXR1cm4gTG9jOyB9Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNGaXh1cEtpbmRJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRml4dXBLaW5kSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4MTgzYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DRml4dXBLaW5kSW5mby5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vPT09LS0gbGx2bS9NQy9NQ0ZpeHVwS2luZEluZm8uaCAtIEZpeHVwIERlc2NyaXB0b3JzIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0ZJWFVQS0lORElORk9fSAorI2RlZmluZSBMTFZNX01DX01DRklYVVBLSU5ESU5GT19ICisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFxicmllZiBUYXJnZXQgaW5kZXBlbmRlbnQgaW5mb3JtYXRpb24gb24gYSBmaXh1cCBraW5kLgorc3RydWN0IE1DRml4dXBLaW5kSW5mbyB7CisgIGVudW0gRml4dXBLaW5kRmxhZ3MgeworICAgIC8vLyBJcyB0aGlzIGZpeHVwIGtpbmQgUENyZWxhdGl2ZT8gVGhpcyBpcyB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIgYmFja2VuZCB0bworICAgIC8vLyBldmFsdWF0ZSBmaXh1cCB2YWx1ZXMgaW4gYSB0YXJnZXQgaW5kZXBlbmRlbnQgbWFubmVyIHdoZW4gcG9zc2libGUuCisgICAgRktGX0lzUENSZWwgPSAoMSA8PCAwKSwKKworICAgIC8vLyBTaG91bGQgdGhpcyBmaXh1cCBraW5kIGZvcmNlIGEgNC1ieXRlIGFsaWduZWQgZWZmZWN0aXZlIFBDIHZhbHVlPworICAgIEZLRl9Jc0FsaWduZWREb3duVG8zMkJpdHMgPSAoMSA8PCAxKQorICB9OworCisgIC8vLyBBIHRhcmdldCBzcGVjaWZpYyBuYW1lIGZvciB0aGUgZml4dXAga2luZC4gVGhlIG5hbWVzIHdpbGwgYmUgdW5pcXVlIGZvcgorICAvLy8gZGlzdGluY3Qga2luZHMgb24gYW55IGdpdmVuIHRhcmdldC4KKyAgY29uc3QgY2hhciAqTmFtZTsKKworICAvLy8gVGhlIGJpdCBvZmZzZXQgdG8gd3JpdGUgdGhlIHJlbG9jYXRpb24gaW50by4KKyAgdW5zaWduZWQgVGFyZ2V0T2Zmc2V0OworCisgIC8vLyBUaGUgbnVtYmVyIG9mIGJpdHMgd3JpdHRlbiBieSB0aGlzIGZpeHVwLiBUaGUgYml0cyBhcmUgYXNzdW1lZCB0byBiZQorICAvLy8gY29udGlndW91cy4KKyAgdW5zaWduZWQgVGFyZ2V0U2l6ZTsKKworICAvLy8gRmxhZ3MgZGVzY3JpYmluZyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIG9uIHRoaXMgZml4dXAga2luZC4KKyAgdW5zaWduZWQgRmxhZ3M7Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNGcmFnbWVudC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0ZyYWdtZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhjMzY1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNGcmFnbWVudC5oCkBAIC0wLDAgKzEsNjY2IEBACisvLz09PS0gTUNGcmFnbWVudC5oIC0gRnJhZ21lbnQgdHlwZSBoaWVyYXJjaHkgLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNGUkFHTUVOVF9ICisjZGVmaW5lIExMVk1fTUNfTUNGUkFHTUVOVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pbGlzdF9ub2RlLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0ZpeHVwLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3QuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TTUxvYy5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ1NlY3Rpb247CitjbGFzcyBNQ1N1YnRhcmdldEluZm87CitjbGFzcyBNQ1N5bWJvbDsKKworY2xhc3MgTUNGcmFnbWVudCA6IHB1YmxpYyBpbGlzdF9ub2RlX3dpdGhfcGFyZW50PE1DRnJhZ21lbnQsIE1DU2VjdGlvbj4geworICBmcmllbmQgY2xhc3MgTUNBc21MYXlvdXQ7CisKK3B1YmxpYzoKKyAgZW51bSBGcmFnbWVudFR5cGUgOiB1aW50OF90IHsKKyAgICBGVF9BbGlnbiwKKyAgICBGVF9EYXRhLAorICAgIEZUX0NvbXBhY3RFbmNvZGVkSW5zdCwKKyAgICBGVF9GaWxsLAorICAgIEZUX1JlbGF4YWJsZSwKKyAgICBGVF9PcmcsCisgICAgRlRfRHdhcmYsCisgICAgRlRfRHdhcmZGcmFtZSwKKyAgICBGVF9MRUIsCisgICAgRlRfUGFkZGluZywKKyAgICBGVF9TeW1ib2xJZCwKKyAgICBGVF9DVklubGluZUxpbmVzLAorICAgIEZUX0NWRGVmUmFuZ2UsCisgICAgRlRfRHVtbXkKKyAgfTsKKworcHJpdmF0ZToKKyAgRnJhZ21lbnRUeXBlIEtpbmQ7CisKK3Byb3RlY3RlZDoKKyAgYm9vbCBIYXNJbnN0cnVjdGlvbnM7CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgU2hvdWxkIHRoaXMgZnJhZ21lbnQgYmUgYWxpZ25lZCB0byB0aGUgZW5kIG9mIGEgYnVuZGxlPworICBib29sIEFsaWduVG9CdW5kbGVFbmQ7CisKKyAgdWludDhfdCBCdW5kbGVQYWRkaW5nOworCisgIC8vLyBMYXlvdXRPcmRlciAtIFRoZSBsYXlvdXQgb3JkZXIgb2YgdGhpcyBmcmFnbWVudC4KKyAgdW5zaWduZWQgTGF5b3V0T3JkZXI7CisKKyAgLy8vIFRoZSBkYXRhIGZvciB0aGUgc2VjdGlvbiB0aGlzIGZyYWdtZW50IGlzIGluLgorICBNQ1NlY3Rpb24gKlBhcmVudDsKKworICAvLy8gQXRvbSAtIFRoZSBhdG9tIHRoaXMgZnJhZ21lbnQgaXMgaW4sIGFzIHJlcHJlc2VudGVkIGJ5IGl0J3MgZGVmaW5pbmcKKyAgLy8vIHN5bWJvbC4KKyAgY29uc3QgTUNTeW1ib2wgKkF0b207CisKKyAgLy8vIFxuYW1lIEFzc2VtYmxlciBCYWNrZW5kIERhdGEKKyAgLy8vIEB7CisgIC8vCisgIC8vIEZJWE1FOiBUaGlzIGNvdWxkIGFsbCBiZSBrZXB0IHByaXZhdGUgdG8gdGhlIGFzc2VtYmxlciBpbXBsZW1lbnRhdGlvbi4KKworICAvLy8gT2Zmc2V0IC0gVGhlIG9mZnNldCBvZiB0aGlzIGZyYWdtZW50IGluIGl0cyBzZWN0aW9uLiBUaGlzIGlzIH4wIHVudGlsCisgIC8vLyBpbml0aWFsaXplZC4KKyAgdWludDY0X3QgT2Zmc2V0OworCisgIC8vLyBAfQorCitwcm90ZWN0ZWQ6CisgIE1DRnJhZ21lbnQoRnJhZ21lbnRUeXBlIEtpbmQsIGJvb2wgSGFzSW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgIHVpbnQ4X3QgQnVuZGxlUGFkZGluZywgTUNTZWN0aW9uICpQYXJlbnQgPSBudWxscHRyKTsKKworICB+TUNGcmFnbWVudCgpOworCitwdWJsaWM6CisgIE1DRnJhZ21lbnQoKSA9IGRlbGV0ZTsKKyAgTUNGcmFnbWVudChjb25zdCBNQ0ZyYWdtZW50ICYpID0gZGVsZXRlOworICBNQ0ZyYWdtZW50ICZvcGVyYXRvcj0oY29uc3QgTUNGcmFnbWVudCAmKSA9IGRlbGV0ZTsKKworICAvLy8gRGVzdHJveXMgdGhlIGN1cnJlbnQgZnJhZ21lbnQuCisgIC8vLworICAvLy8gVGhpcyBtdXN0IGJlIHVzZWQgaW5zdGVhZCBvZiBkZWxldGUgYXMgTUNGcmFnbWVudCBpcyBub24tdmlydHVhbC4KKyAgLy8vIFRoaXMgbWV0aG9kIHdpbGwgZGlzcGF0Y2ggdG8gdGhlIGFwcHJvcHJpYXRlIHN1YmNsYXNzLgorICB2b2lkIGRlc3Ryb3koKTsKKworICBGcmFnbWVudFR5cGUgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICBNQ1NlY3Rpb24gKmdldFBhcmVudCgpIGNvbnN0IHsgcmV0dXJuIFBhcmVudDsgfQorICB2b2lkIHNldFBhcmVudChNQ1NlY3Rpb24gKlZhbHVlKSB7IFBhcmVudCA9IFZhbHVlOyB9CisKKyAgY29uc3QgTUNTeW1ib2wgKmdldEF0b20oKSBjb25zdCB7IHJldHVybiBBdG9tOyB9CisgIHZvaWQgc2V0QXRvbShjb25zdCBNQ1N5bWJvbCAqVmFsdWUpIHsgQXRvbSA9IFZhbHVlOyB9CisKKyAgdW5zaWduZWQgZ2V0TGF5b3V0T3JkZXIoKSBjb25zdCB7IHJldHVybiBMYXlvdXRPcmRlcjsgfQorICB2b2lkIHNldExheW91dE9yZGVyKHVuc2lnbmVkIFZhbHVlKSB7IExheW91dE9yZGVyID0gVmFsdWU7IH0KKworICAvLy8gXGJyaWVmIERvZXMgdGhpcyBmcmFnbWVudCBoYXZlIGluc3RydWN0aW9ucyBlbWl0dGVkIGludG8gaXQ/IEJ5IGRlZmF1bHQKKyAgLy8vIHRoaXMgaXMgZmFsc2UsIGJ1dCBzcGVjaWZpYyBmcmFnbWVudCB0eXBlcyBtYXkgc2V0IGl0IHRvIHRydWUuCisgIGJvb2wgaGFzSW5zdHJ1Y3Rpb25zKCkgY29uc3QgeyByZXR1cm4gSGFzSW5zdHJ1Y3Rpb25zOyB9CisKKyAgLy8vIFxicmllZiBTaG91bGQgdGhpcyBmcmFnbWVudCBiZSBwbGFjZWQgYXQgdGhlIGVuZCBvZiBhbiBhbGlnbmVkIGJ1bmRsZT8KKyAgYm9vbCBhbGlnblRvQnVuZGxlRW5kKCkgY29uc3QgeyByZXR1cm4gQWxpZ25Ub0J1bmRsZUVuZDsgfQorICB2b2lkIHNldEFsaWduVG9CdW5kbGVFbmQoYm9vbCBWKSB7IEFsaWduVG9CdW5kbGVFbmQgPSBWOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHBhZGRpbmcgc2l6ZSB0aGF0IG11c3QgYmUgaW5zZXJ0ZWQgYmVmb3JlIHRoaXMgZnJhZ21lbnQuCisgIC8vLyBVc2VkIGZvciBidW5kbGluZy4gQnkgZGVmYXVsdCwgbm8gcGFkZGluZyBpcyBpbnNlcnRlZC4KKyAgLy8vIE5vdGUgdGhhdCBwYWRkaW5nIHNpemUgaXMgcmVzdHJpY3RlZCB0byA4IGJpdHMuIFRoaXMgaXMgYW4gb3B0aW1pemF0aW9uCisgIC8vLyB0byByZWR1Y2UgdGhlIGFtb3VudCBvZiBzcGFjZSB1c2VkIGZvciBlYWNoIGZyYWdtZW50LiBJbiBwcmFjdGljZSwgbGFyZ2VyCisgIC8vLyBwYWRkaW5nIHNob3VsZCBuZXZlciBiZSByZXF1aXJlZC4KKyAgdWludDhfdCBnZXRCdW5kbGVQYWRkaW5nKCkgY29uc3QgeyByZXR1cm4gQnVuZGxlUGFkZGluZzsgfQorCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBwYWRkaW5nIHNpemUgZm9yIHRoaXMgZnJhZ21lbnQuIEJ5IGRlZmF1bHQgaXQncyBhIG5vLW9wLAorICAvLy8gYW5kIG9ubHkgc29tZSBmcmFnbWVudHMgaGF2ZSBhIG1lYW5pbmdmdWwgaW1wbGVtZW50YXRpb24uCisgIHZvaWQgc2V0QnVuZGxlUGFkZGluZyh1aW50OF90IE4pIHsgQnVuZGxlUGFkZGluZyA9IE47IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIGdpdmVuIGZyZ21lbnQgaGFzIEZUX0R1bW15IHR5cGUuCisgIGJvb2wgaXNEdW1teSgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gRlRfRHVtbXk7IH0KKworICB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKK2NsYXNzIE1DRHVtbXlGcmFnbWVudCA6IHB1YmxpYyBNQ0ZyYWdtZW50IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgTUNEdW1teUZyYWdtZW50KE1DU2VjdGlvbiAqU2VjKQorICAgICAgOiBNQ0ZyYWdtZW50KEZUX0R1bW15LCBmYWxzZSwgMCwgU2VjKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNGcmFnbWVudCAqRikgeyByZXR1cm4gRi0+Z2V0S2luZCgpID09IEZUX0R1bW15OyB9Cit9OworCisvLy8gSW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IGZyYWdtZW50cyB0aGF0IGNvbnRhaW4gZW5jb2RlZCBpbnN0cnVjdGlvbnMgYW5kL29yCisvLy8gZGF0YS4KKy8vLworY2xhc3MgTUNFbmNvZGVkRnJhZ21lbnQgOiBwdWJsaWMgTUNGcmFnbWVudCB7Citwcm90ZWN0ZWQ6CisgIE1DRW5jb2RlZEZyYWdtZW50KE1DRnJhZ21lbnQ6OkZyYWdtZW50VHlwZSBGVHlwZSwgYm9vbCBIYXNJbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgIE1DU2VjdGlvbiAqU2VjKQorICAgICAgOiBNQ0ZyYWdtZW50KEZUeXBlLCBIYXNJbnN0cnVjdGlvbnMsIDAsIFNlYykge30KKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DRnJhZ21lbnQgKkYpIHsKKyAgICBNQ0ZyYWdtZW50OjpGcmFnbWVudFR5cGUgS2luZCA9IEYtPmdldEtpbmQoKTsKKyAgICBzd2l0Y2ggKEtpbmQpIHsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgTUNGcmFnbWVudDo6RlRfUmVsYXhhYmxlOgorICAgIGNhc2UgTUNGcmFnbWVudDo6RlRfQ29tcGFjdEVuY29kZWRJbnN0OgorICAgIGNhc2UgTUNGcmFnbWVudDo6RlRfRGF0YToKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorfTsKKworLy8vIEludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBmcmFnbWVudHMgdGhhdCBjb250YWluIGVuY29kZWQgaW5zdHJ1Y3Rpb25zIGFuZC9vcgorLy8vIGRhdGEuCisvLy8KK3RlbXBsYXRlPHVuc2lnbmVkIENvbnRlbnRzU2l6ZT4KK2NsYXNzIE1DRW5jb2RlZEZyYWdtZW50V2l0aENvbnRlbnRzIDogcHVibGljIE1DRW5jb2RlZEZyYWdtZW50IHsKKyAgU21hbGxWZWN0b3I8Y2hhciwgQ29udGVudHNTaXplPiBDb250ZW50czsKKworcHJvdGVjdGVkOgorICBNQ0VuY29kZWRGcmFnbWVudFdpdGhDb250ZW50cyhNQ0ZyYWdtZW50OjpGcmFnbWVudFR5cGUgRlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSGFzSW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb24gKlNlYykKKyAgICAgIDogTUNFbmNvZGVkRnJhZ21lbnQoRlR5cGUsIEhhc0luc3RydWN0aW9ucywgU2VjKSB7fQorCitwdWJsaWM6CisgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmZ2V0Q29udGVudHMoKSB7IHJldHVybiBDb250ZW50czsgfQorICBjb25zdCBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJmdldENvbnRlbnRzKCkgY29uc3QgeyByZXR1cm4gQ29udGVudHM7IH0KK307CisKKy8vLyBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBlbmNvZGVkIGluc3RydWN0aW9ucyBhbmQvb3IKKy8vLyBkYXRhIGFuZCBhbHNvIGhhdmUgZml4dXBzIHJlZ2lzdGVyZWQuCisvLy8KK3RlbXBsYXRlPHVuc2lnbmVkIENvbnRlbnRzU2l6ZSwgdW5zaWduZWQgRml4dXBzU2l6ZT4KK2NsYXNzIE1DRW5jb2RlZEZyYWdtZW50V2l0aEZpeHVwcyA6CisgIHB1YmxpYyBNQ0VuY29kZWRGcmFnbWVudFdpdGhDb250ZW50czxDb250ZW50c1NpemU+IHsKKworICAvLy8gRml4dXBzIC0gVGhlIGxpc3Qgb2YgZml4dXBzIGluIHRoaXMgZnJhZ21lbnQuCisgIFNtYWxsVmVjdG9yPE1DRml4dXAsIEZpeHVwc1NpemU+IEZpeHVwczsKKworcHJvdGVjdGVkOgorICBNQ0VuY29kZWRGcmFnbWVudFdpdGhGaXh1cHMoTUNGcmFnbWVudDo6RnJhZ21lbnRUeXBlIEZUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNJbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb24gKlNlYykKKyAgICAgIDogTUNFbmNvZGVkRnJhZ21lbnRXaXRoQ29udGVudHM8Q29udGVudHNTaXplPihGVHlwZSwgSGFzSW5zdHJ1Y3Rpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlYykge30KKworcHVibGljOgorICB1c2luZyBjb25zdF9maXh1cF9pdGVyYXRvciA9IFNtYWxsVmVjdG9ySW1wbDxNQ0ZpeHVwPjo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIGZpeHVwX2l0ZXJhdG9yID0gU21hbGxWZWN0b3JJbXBsPE1DRml4dXA+OjppdGVyYXRvcjsKKworICBTbWFsbFZlY3RvckltcGw8TUNGaXh1cD4gJmdldEZpeHVwcygpIHsgcmV0dXJuIEZpeHVwczsgfQorICBjb25zdCBTbWFsbFZlY3RvckltcGw8TUNGaXh1cD4gJmdldEZpeHVwcygpIGNvbnN0IHsgcmV0dXJuIEZpeHVwczsgfQorCisgIGZpeHVwX2l0ZXJhdG9yIGZpeHVwX2JlZ2luKCkgeyByZXR1cm4gRml4dXBzLmJlZ2luKCk7IH0KKyAgY29uc3RfZml4dXBfaXRlcmF0b3IgZml4dXBfYmVnaW4oKSBjb25zdCB7IHJldHVybiBGaXh1cHMuYmVnaW4oKTsgfQorCisgIGZpeHVwX2l0ZXJhdG9yIGZpeHVwX2VuZCgpIHsgcmV0dXJuIEZpeHVwcy5lbmQoKTsgfQorICBjb25zdF9maXh1cF9pdGVyYXRvciBmaXh1cF9lbmQoKSBjb25zdCB7IHJldHVybiBGaXh1cHMuZW5kKCk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DRnJhZ21lbnQgKkYpIHsKKyAgICBNQ0ZyYWdtZW50OjpGcmFnbWVudFR5cGUgS2luZCA9IEYtPmdldEtpbmQoKTsKKyAgICByZXR1cm4gS2luZCA9PSBNQ0ZyYWdtZW50OjpGVF9SZWxheGFibGUgfHwgS2luZCA9PSBNQ0ZyYWdtZW50OjpGVF9EYXRhIHx8CisgICAgICAgICAgIEtpbmQgPT0gTUNGcmFnbWVudDo6RlRfQ1ZEZWZSYW5nZTsKKyAgfQorfTsKKworLy8vIEZyYWdtZW50IGZvciBkYXRhIGFuZCBlbmNvZGVkIGluc3RydWN0aW9ucy4KKy8vLworY2xhc3MgTUNEYXRhRnJhZ21lbnQgOiBwdWJsaWMgTUNFbmNvZGVkRnJhZ21lbnRXaXRoRml4dXBzPDMyLCA0PiB7CitwdWJsaWM6CisgIE1DRGF0YUZyYWdtZW50KE1DU2VjdGlvbiAqU2VjID0gbnVsbHB0cikKKyAgICAgIDogTUNFbmNvZGVkRnJhZ21lbnRXaXRoRml4dXBzPDMyLCA0PihGVF9EYXRhLCBmYWxzZSwgU2VjKSB7fQorCisgIHZvaWQgc2V0SGFzSW5zdHJ1Y3Rpb25zKGJvb2wgVikgeyBIYXNJbnN0cnVjdGlvbnMgPSBWOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0ZyYWdtZW50ICpGKSB7CisgICAgcmV0dXJuIEYtPmdldEtpbmQoKSA9PSBNQ0ZyYWdtZW50OjpGVF9EYXRhOworICB9Cit9OworCisvLy8gVGhpcyBpcyBhIGNvbXBhY3QgKG1lbW9yeS1zaXplLXdpc2UpIGZyYWdtZW50IGZvciBob2xkaW5nIGFuIGVuY29kZWQKKy8vLyBpbnN0cnVjdGlvbiAobm9uLXJlbGF4YWJsZSkgdGhhdCBoYXMgbm8gZml4dXBzIHJlZ2lzdGVyZWQuIFdoZW4gYXBwbGljYWJsZSwKKy8vLyBpdCBjYW4gYmUgdXNlZCBpbnN0ZWFkIG9mIE1DRGF0YUZyYWdtZW50IGFuZCBsZWFkIHRvIGxvd2VyIG1lbW9yeQorLy8vIGNvbnN1bXB0aW9uLgorLy8vCitjbGFzcyBNQ0NvbXBhY3RFbmNvZGVkSW5zdEZyYWdtZW50IDogcHVibGljIE1DRW5jb2RlZEZyYWdtZW50V2l0aENvbnRlbnRzPDQ+IHsKK3B1YmxpYzoKKyAgTUNDb21wYWN0RW5jb2RlZEluc3RGcmFnbWVudChNQ1NlY3Rpb24gKlNlYyA9IG51bGxwdHIpCisgICAgICA6IE1DRW5jb2RlZEZyYWdtZW50V2l0aENvbnRlbnRzKEZUX0NvbXBhY3RFbmNvZGVkSW5zdCwgdHJ1ZSwgU2VjKSB7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DRnJhZ21lbnQgKkYpIHsKKyAgICByZXR1cm4gRi0+Z2V0S2luZCgpID09IE1DRnJhZ21lbnQ6OkZUX0NvbXBhY3RFbmNvZGVkSW5zdDsKKyAgfQorfTsKKworLy8vIEEgcmVsYXhhYmxlIGZyYWdtZW50IGhvbGRzIG9uIHRvIGl0cyBNQ0luc3QsIHNpbmNlIGl0IG1heSBuZWVkIHRvIGJlCisvLy8gcmVsYXhlZCBkdXJpbmcgdGhlIGFzc2VtYmxlciBsYXlvdXQgYW5kIHJlbGF4YXRpb24gc3RhZ2UuCisvLy8KK2NsYXNzIE1DUmVsYXhhYmxlRnJhZ21lbnQgOiBwdWJsaWMgTUNFbmNvZGVkRnJhZ21lbnRXaXRoRml4dXBzPDgsIDE+IHsKKworICAvLy8gSW5zdCAtIFRoZSBpbnN0cnVjdGlvbiB0aGlzIGlzIGEgZnJhZ21lbnQgZm9yLgorICBNQ0luc3QgSW5zdDsKKworICAvLy8gU1RJIC0gVGhlIE1DU3VidGFyZ2V0SW5mbyBpbiBlZmZlY3Qgd2hlbiB0aGUgaW5zdHJ1Y3Rpb24gd2FzIGVuY29kZWQuCisgIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU1RJOworCitwdWJsaWM6CisgIE1DUmVsYXhhYmxlRnJhZ21lbnQoY29uc3QgTUNJbnN0ICZJbnN0LCBjb25zdCBNQ1N1YnRhcmdldEluZm8gJlNUSSwKKyAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb24gKlNlYyA9IG51bGxwdHIpCisgICAgICA6IE1DRW5jb2RlZEZyYWdtZW50V2l0aEZpeHVwcyhGVF9SZWxheGFibGUsIHRydWUsIFNlYyksCisgICAgICAgIEluc3QoSW5zdCksIFNUSShTVEkpIHt9CisKKyAgY29uc3QgTUNJbnN0ICZnZXRJbnN0KCkgY29uc3QgeyByZXR1cm4gSW5zdDsgfQorICB2b2lkIHNldEluc3QoY29uc3QgTUNJbnN0ICZWYWx1ZSkgeyBJbnN0ID0gVmFsdWU7IH0KKworICBjb25zdCBNQ1N1YnRhcmdldEluZm8gJmdldFN1YnRhcmdldEluZm8oKSB7IHJldHVybiBTVEk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DRnJhZ21lbnQgKkYpIHsKKyAgICByZXR1cm4gRi0+Z2V0S2luZCgpID09IE1DRnJhZ21lbnQ6OkZUX1JlbGF4YWJsZTsKKyAgfQorfTsKKworY2xhc3MgTUNBbGlnbkZyYWdtZW50IDogcHVibGljIE1DRnJhZ21lbnQgeworICAvLy8gQWxpZ25tZW50IC0gVGhlIGFsaWdubWVudCB0byBlbnN1cmUsIGluIGJ5dGVzLgorICB1bnNpZ25lZCBBbGlnbm1lbnQ7CisKKyAgLy8vIEVtaXROb3BzIC0gRmxhZyB0byBpbmRpY2F0ZSB0aGF0IChvcHRpbWFsKSBOT1BzIHNob3VsZCBiZSBlbWl0dGVkIGluc3RlYWQKKyAgLy8vIG9mIHVzaW5nIHRoZSBwcm92aWRlZCB2YWx1ZS4gVGhlIGV4YWN0IGludGVycHJldGF0aW9uIG9mIHRoaXMgZmxhZyBpcworICAvLy8gdGFyZ2V0IGRlcGVuZGVudC4KKyAgYm9vbCBFbWl0Tm9wcyA6IDE7CisKKyAgLy8vIFZhbHVlIC0gVmFsdWUgdG8gdXNlIGZvciBmaWxsaW5nIHBhZGRpbmcgYnl0ZXMuCisgIGludDY0X3QgVmFsdWU7CisKKyAgLy8vIFZhbHVlU2l6ZSAtIFRoZSBzaXplIG9mIHRoZSBpbnRlZ2VyIChpbiBieXRlcykgb2YgXHAgVmFsdWUuCisgIHVuc2lnbmVkIFZhbHVlU2l6ZTsKKworICAvLy8gTWF4Qnl0ZXNUb0VtaXQgLSBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gZW1pdDsgaWYgdGhlIGFsaWdubWVudAorICAvLy8gY2Fubm90IGJlIHNhdGlzZmllZCBpbiB0aGlzIHdpZHRoIHRoZW4gdGhpcyBmcmFnbWVudCBpcyBpZ25vcmVkLgorICB1bnNpZ25lZCBNYXhCeXRlc1RvRW1pdDsKKworcHVibGljOgorICBNQ0FsaWduRnJhZ21lbnQodW5zaWduZWQgQWxpZ25tZW50LCBpbnQ2NF90IFZhbHVlLCB1bnNpZ25lZCBWYWx1ZVNpemUsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNYXhCeXRlc1RvRW1pdCwgTUNTZWN0aW9uICpTZWMgPSBudWxscHRyKQorICAgICAgOiBNQ0ZyYWdtZW50KEZUX0FsaWduLCBmYWxzZSwgMCwgU2VjKSwgQWxpZ25tZW50KEFsaWdubWVudCksCisgICAgICAgIEVtaXROb3BzKGZhbHNlKSwgVmFsdWUoVmFsdWUpLAorICAgICAgICBWYWx1ZVNpemUoVmFsdWVTaXplKSwgTWF4Qnl0ZXNUb0VtaXQoTWF4Qnl0ZXNUb0VtaXQpIHt9CisKKyAgLy8vIFxuYW1lIEFjY2Vzc29ycworICAvLy8gQHsKKworICB1bnNpZ25lZCBnZXRBbGlnbm1lbnQoKSBjb25zdCB7IHJldHVybiBBbGlnbm1lbnQ7IH0KKworICBpbnQ2NF90IGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKworICB1bnNpZ25lZCBnZXRWYWx1ZVNpemUoKSBjb25zdCB7IHJldHVybiBWYWx1ZVNpemU7IH0KKworICB1bnNpZ25lZCBnZXRNYXhCeXRlc1RvRW1pdCgpIGNvbnN0IHsgcmV0dXJuIE1heEJ5dGVzVG9FbWl0OyB9CisKKyAgYm9vbCBoYXNFbWl0Tm9wcygpIGNvbnN0IHsgcmV0dXJuIEVtaXROb3BzOyB9CisgIHZvaWQgc2V0RW1pdE5vcHMoYm9vbCBWYWx1ZSkgeyBFbWl0Tm9wcyA9IFZhbHVlOyB9CisKKyAgLy8vIEB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0ZyYWdtZW50ICpGKSB7CisgICAgcmV0dXJuIEYtPmdldEtpbmQoKSA9PSBNQ0ZyYWdtZW50OjpGVF9BbGlnbjsKKyAgfQorfTsKKworLy8vIEZyYWdtZW50IGZvciBhZGRpbmcgcmVxdWlyZWQgcGFkZGluZy4KKy8vLyBUaGlzIGZyYWdtZW50IGlzIGFsd2F5cyBpbnNlcnRlZCBiZWZvcmUgYW4gaW5zdHJ1Y3Rpb24sIGFuZCBob2xkcyB0aGF0CisvLy8gaW5zdHJ1Y3Rpb24gYXMgY29udGV4dCBpbmZvcm1hdGlvbiAoYXMgd2VsbCBhcyBhIG1hc2sgb2Yga2luZHMpIGZvcgorLy8vIGRldGVybWluaW5nIHRoZSBwYWRkaW5nIHNpemUuCisvLy8KK2NsYXNzIE1DUGFkZGluZ0ZyYWdtZW50IDogcHVibGljIE1DRnJhZ21lbnQgeworICAvLy8gQSBtYXNrIGNvbnRhaW5pbmcgYWxsIHRoZSBraW5kcyByZWxldmFudCB0byB0aGlzIGZyYWdtZW50LiBpLmUuIHRoZSBpJ3RoCisgIC8vLyBiaXQgd2lsbCBiZSBzZXQgaWZmIGtpbmQgaSBpcyByZWxldmFudCB0byB0aGlzIGZyYWdtZW50LgorICB1aW50NjRfdCBQYWRkaW5nUG9saWNpZXNNYXNrOworICAvLy8gQSBib29sZWFuIGluZGljYXRpbmcgaWYgdGhpcyBmcmFnbWVudCB3aWxsIGFjdHVhbGx5IGhvbGQgcGFkZGluZy4gSWYgaXRzCisgIC8vLyB2YWx1ZSBpcyBmYWxzZSwgdGhlbiB0aGlzIGZyYWdtZW50IHNlcnZlcyBvbmx5IGFzIGEgcGxhY2Vob2xkZXIsCisgIC8vLyBjb250YWluaW5nIGRhdGEgdG8gYXNzaXN0IG90aGVyIGluc2VydGlvbiBwb2ludCBpbiB0aGVpciBkZWNpc2lvbiBtYWtpbmcuCisgIGJvb2wgSXNJbnNlcnRpb25Qb2ludDsKKworICB1aW50NjRfdCBTaXplOworCisgIHN0cnVjdCBNQ0luc3RJbmZvIHsKKyAgICBib29sIElzSW5pdGlhbGl6ZWQ7CisgICAgTUNJbnN0IEluc3Q7CisgICAgLy8vIEEgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGluc3RydWN0aW9uIHBvaW50ZWQgYnkgdGhpcyBmcmFnbWVudCBpcworICAgIC8vLyBhIGZpeGVkIHNpemUgaW5zdHJ1Y3Rpb24gb3IgYSByZWxheGFibGUgaW5zdHJ1Y3Rpb24gaGVsZCBieSBhCisgICAgLy8vIE1DUmVsYXhhYmxlRnJhZ21lbnQuCisgICAgYm9vbCBJc0ltbXV0YWJsZVNpemVkSW5zdDsKKyAgICB1bmlvbiB7CisgICAgICAvLy8gSWYgdGhlIGluc3RydWN0aW9uIGlzIGEgZml4ZWQgc2l6ZSBpbnN0cnVjdGlvbiwgaG9sZCBpdHMgc2l6ZS4KKyAgICAgIHNpemVfdCBJbnN0U2l6ZTsKKyAgICAgIC8vLyBPdGhlcndpc2UsIGhvbGQgYSBwb2ludGVyIHRvIHRoZSBNQ1JlbGF4YWJsZUZyYWdtZW50IGhvbGRpbmcgaXQuCisgICAgICBNQ1JlbGF4YWJsZUZyYWdtZW50ICpJbnN0RnJhZ21lbnQ7CisgICAgfTsKKyAgfTsKKyAgTUNJbnN0SW5mbyBJbnN0SW5mbzsKKworcHVibGljOgorICBzdGF0aWMgY29uc3QgdWludDY0X3QgUEZLX05vbmUgPSBVSU5UNjRfQygwKTsKKworICBlbnVtIE1DUGFkZGluZ0ZyYWdtZW50S2luZCB7CisgICAgLy8gdmFsdWVzIDAtNyBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB0YXJnZXQgaW5kZXBlbmRldCB2YWx1ZXMuCisKKyAgICBGaXJzdFRhcmdldFBlcmZOb3BGcmFnbWVudEtpbmQgPSA4LAorCisgICAgLy8vIExpbWl0IHJhbmdlIG9mIHRhcmdldCBNQ1BlcmZOb3BGcmFnbWVudCBraW5kcyB0byBmaXQgaW4gdWludDY0X3QKKyAgICBNYXhUYXJnZXRQZXJmTm9wRnJhZ21lbnRLaW5kID0gNjMKKyAgfTsKKworICBNQ1BhZGRpbmdGcmFnbWVudChNQ1NlY3Rpb24gKlNlYyA9IG51bGxwdHIpCisgICAgICA6IE1DRnJhZ21lbnQoRlRfUGFkZGluZywgZmFsc2UsIDAsIFNlYyksIFBhZGRpbmdQb2xpY2llc01hc2soUEZLX05vbmUpLAorICAgICAgICBJc0luc2VydGlvblBvaW50KGZhbHNlKSwgU2l6ZShVSU5UNjRfQygwKSksCisgICAgICAgIEluc3RJbmZvKHtmYWxzZSwgTUNJbnN0KCksIGZhbHNlLCB7MH19KSB7fQorCisgIGJvb2wgaXNJbnNlcnRpb25Qb2ludCgpIGNvbnN0IHsgcmV0dXJuIElzSW5zZXJ0aW9uUG9pbnQ7IH0KKyAgdm9pZCBzZXRBc0luc2VydGlvblBvaW50KCkgeyBJc0luc2VydGlvblBvaW50ID0gdHJ1ZTsgfQorICB1aW50NjRfdCBnZXRQYWRkaW5nUG9saWNpZXNNYXNrKCkgY29uc3QgeyByZXR1cm4gUGFkZGluZ1BvbGljaWVzTWFzazsgfQorICB2b2lkIHNldFBhZGRpbmdQb2xpY2llc01hc2sodWludDY0X3QgVmFsdWUpIHsgUGFkZGluZ1BvbGljaWVzTWFzayA9IFZhbHVlOyB9CisgIGJvb2wgaGFzUGFkZGluZ1BvbGljeSh1aW50NjRfdCBQb2xpY3lNYXNrKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzUG93ZXJPZjJfNjQoUG9saWN5TWFzaykgJiYKKyAgICAgICAgICAgIlBvbGljeSBtYXNrIG11c3QgY29udGFpbiBleGFjdGx5IG9uZSBwb2xpY3kiKTsKKyAgICByZXR1cm4gKGdldFBhZGRpbmdQb2xpY2llc01hc2soKSAmIFBvbGljeU1hc2spICE9IFBGS19Ob25lOworICB9CisgIGNvbnN0IE1DSW5zdCAmZ2V0SW5zdCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNJbnN0cnVjdGlvbkluaXRpYWxpemVkKCkgJiYgIkZyYWdtZW50IGhhcyBubyBpbnN0cnVjdGlvbiEiKTsKKyAgICByZXR1cm4gSW5zdEluZm8uSW5zdDsKKyAgfQorICBzaXplX3QgZ2V0SW5zdFNpemUoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzSW5zdHJ1Y3Rpb25Jbml0aWFsaXplZCgpICYmICJGcmFnbWVudCBoYXMgbm8gaW5zdHJ1Y3Rpb24hIik7CisgICAgaWYgKEluc3RJbmZvLklzSW1tdXRhYmxlU2l6ZWRJbnN0KQorICAgICAgcmV0dXJuIEluc3RJbmZvLkluc3RTaXplOworICAgIGFzc2VydChJbnN0SW5mby5JbnN0RnJhZ21lbnQgIT0gbnVsbHB0ciAmJgorICAgICAgICAgICAiTXVzdCBoYXZlIGEgdmFsaWQgSW5zdEZyYWdtZW50IHRvIHJldHJpZXZlIEluc3RTaXplIGZyb20iKTsKKyAgICByZXR1cm4gSW5zdEluZm8uSW5zdEZyYWdtZW50LT5nZXRDb250ZW50cygpLnNpemUoKTsKKyAgfQorICB2b2lkIHNldEluc3RBbmRJbnN0U2l6ZShjb25zdCBNQ0luc3QgJkluc3QsIHNpemVfdCBJbnN0U2l6ZSkgeworCUluc3RJbmZvLklzSW5pdGlhbGl6ZWQgPSB0cnVlOworICAgIEluc3RJbmZvLklzSW1tdXRhYmxlU2l6ZWRJbnN0ID0gdHJ1ZTsKKyAgICBJbnN0SW5mby5JbnN0ID0gSW5zdDsKKyAgICBJbnN0SW5mby5JbnN0U2l6ZSA9IEluc3RTaXplOworICB9CisgIHZvaWQgc2V0SW5zdEFuZEluc3RGcmFnbWVudChjb25zdCBNQ0luc3QgJkluc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1JlbGF4YWJsZUZyYWdtZW50ICpJbnN0RnJhZ21lbnQpIHsKKyAgICBJbnN0SW5mby5Jc0luaXRpYWxpemVkID0gdHJ1ZTsKKyAgICBJbnN0SW5mby5Jc0ltbXV0YWJsZVNpemVkSW5zdCA9IGZhbHNlOworICAgIEluc3RJbmZvLkluc3QgPSBJbnN0OworICAgIEluc3RJbmZvLkluc3RGcmFnbWVudCA9IEluc3RGcmFnbWVudDsKKyAgfQorICB1aW50NjRfdCBnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gU2l6ZTsgfQorICB2b2lkIHNldFNpemUodWludDY0X3QgVmFsdWUpIHsgU2l6ZSA9IFZhbHVlOyB9CisgIGJvb2wgaXNJbnN0cnVjdGlvbkluaXRpYWxpemVkKCkgY29uc3QgeyByZXR1cm4gSW5zdEluZm8uSXNJbml0aWFsaXplZDsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNGcmFnbWVudCAqRikgeworICAgIHJldHVybiBGLT5nZXRLaW5kKCkgPT0gTUNGcmFnbWVudDo6RlRfUGFkZGluZzsKKyAgfQorfTsKKworY2xhc3MgTUNGaWxsRnJhZ21lbnQgOiBwdWJsaWMgTUNGcmFnbWVudCB7CisgIC8vLyBWYWx1ZSB0byB1c2UgZm9yIGZpbGxpbmcgYnl0ZXMuCisgIHVpbnQ4X3QgVmFsdWU7CisKKyAgLy8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gaW5zZXJ0LgorICBjb25zdCBNQ0V4cHIgJlNpemU7CisKKyAgLy8vIFNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgZGlyZWN0aXZlIHRoYXQgdGhpcyBmcmFnbWVudCB3YXMgY3JlYXRlZCBmb3IuCisgIFNNTG9jIExvYzsKKworcHVibGljOgorICBNQ0ZpbGxGcmFnbWVudCh1aW50OF90IFZhbHVlLCBjb25zdCBNQ0V4cHIgJlNpemUsIFNNTG9jIExvYywKKyAgICAgICAgICAgICAgICAgTUNTZWN0aW9uICpTZWMgPSBudWxscHRyKQorICAgICAgOiBNQ0ZyYWdtZW50KEZUX0ZpbGwsIGZhbHNlLCAwLCBTZWMpLCBWYWx1ZShWYWx1ZSksIFNpemUoU2l6ZSksIExvYyhMb2MpIHsKKyAgfQorCisgIHVpbnQ4X3QgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZTsgfQorICBjb25zdCBNQ0V4cHIgJmdldFNpemUoKSBjb25zdCB7IHJldHVybiBTaXplOyB9CisKKyAgU01Mb2MgZ2V0TG9jKCkgY29uc3QgeyByZXR1cm4gTG9jOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0ZyYWdtZW50ICpGKSB7CisgICAgcmV0dXJuIEYtPmdldEtpbmQoKSA9PSBNQ0ZyYWdtZW50OjpGVF9GaWxsOworICB9Cit9OworCitjbGFzcyBNQ09yZ0ZyYWdtZW50IDogcHVibGljIE1DRnJhZ21lbnQgeworICAvLy8gVGhlIG9mZnNldCB0aGlzIGZyYWdtZW50IHNob3VsZCBzdGFydCBhdC4KKyAgY29uc3QgTUNFeHByICpPZmZzZXQ7CisKKyAgLy8vIFZhbHVlIHRvIHVzZSBmb3IgZmlsbGluZyBieXRlcy4KKyAgaW50OF90IFZhbHVlOworCisgIC8vLyBTb3VyY2UgbG9jYXRpb24gb2YgdGhlIGRpcmVjdGl2ZSB0aGF0IHRoaXMgZnJhZ21lbnQgd2FzIGNyZWF0ZWQgZm9yLgorICBTTUxvYyBMb2M7CisKK3B1YmxpYzoKKyAgTUNPcmdGcmFnbWVudChjb25zdCBNQ0V4cHIgJk9mZnNldCwgaW50OF90IFZhbHVlLCBTTUxvYyBMb2MsCisgICAgICAgICAgICAgICAgTUNTZWN0aW9uICpTZWMgPSBudWxscHRyKQorICAgICAgOiBNQ0ZyYWdtZW50KEZUX09yZywgZmFsc2UsIDAsIFNlYyksIE9mZnNldCgmT2Zmc2V0KSwgVmFsdWUoVmFsdWUpLCBMb2MoTG9jKSB7fQorCisgIC8vLyBcbmFtZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisKKyAgY29uc3QgTUNFeHByICZnZXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiAqT2Zmc2V0OyB9CisKKyAgdWludDhfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgU01Mb2MgZ2V0TG9jKCkgY29uc3QgeyByZXR1cm4gTG9jOyB9CisKKyAgLy8vIEB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0ZyYWdtZW50ICpGKSB7CisgICAgcmV0dXJuIEYtPmdldEtpbmQoKSA9PSBNQ0ZyYWdtZW50OjpGVF9Pcmc7CisgIH0KK307CisKK2NsYXNzIE1DTEVCRnJhZ21lbnQgOiBwdWJsaWMgTUNGcmFnbWVudCB7CisgIC8vLyBWYWx1ZSAtIFRoZSB2YWx1ZSB0aGlzIGZyYWdtZW50IHNob3VsZCBjb250YWluLgorICBjb25zdCBNQ0V4cHIgKlZhbHVlOworCisgIC8vLyBJc1NpZ25lZCAtIFRydWUgaWYgdGhpcyBpcyBhIHNsZWIxMjgsIGZhbHNlIGlmIHVsZWIxMjguCisgIGJvb2wgSXNTaWduZWQ7CisKKyAgU21hbGxTdHJpbmc8OD4gQ29udGVudHM7CisKK3B1YmxpYzoKKyAgTUNMRUJGcmFnbWVudChjb25zdCBNQ0V4cHIgJlZhbHVlXywgYm9vbCBJc1NpZ25lZF8sIE1DU2VjdGlvbiAqU2VjID0gbnVsbHB0cikKKyAgICAgIDogTUNGcmFnbWVudChGVF9MRUIsIGZhbHNlLCAwLCBTZWMpLCBWYWx1ZSgmVmFsdWVfKSwgSXNTaWduZWQoSXNTaWduZWRfKSB7CisgICAgQ29udGVudHMucHVzaF9iYWNrKDApOworICB9CisKKyAgLy8vIFxuYW1lIEFjY2Vzc29ycworICAvLy8gQHsKKworICBjb25zdCBNQ0V4cHIgJmdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gKlZhbHVlOyB9CisKKyAgYm9vbCBpc1NpZ25lZCgpIGNvbnN0IHsgcmV0dXJuIElzU2lnbmVkOyB9CisKKyAgU21hbGxTdHJpbmc8OD4gJmdldENvbnRlbnRzKCkgeyByZXR1cm4gQ29udGVudHM7IH0KKyAgY29uc3QgU21hbGxTdHJpbmc8OD4gJmdldENvbnRlbnRzKCkgY29uc3QgeyByZXR1cm4gQ29udGVudHM7IH0KKworICAvLy8gQH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DRnJhZ21lbnQgKkYpIHsKKyAgICByZXR1cm4gRi0+Z2V0S2luZCgpID09IE1DRnJhZ21lbnQ6OkZUX0xFQjsKKyAgfQorfTsKKworY2xhc3MgTUNEd2FyZkxpbmVBZGRyRnJhZ21lbnQgOiBwdWJsaWMgTUNGcmFnbWVudCB7CisgIC8vLyBMaW5lRGVsdGEgLSB0aGUgdmFsdWUgb2YgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIGxpbmUgbnVtYmVycworICAvLy8gYmV0d2VlbiB0d28gLmxvYyBkd2FyZiBkaXJlY3RpdmVzLgorICBpbnQ2NF90IExpbmVEZWx0YTsKKworICAvLy8gQWRkckRlbHRhIC0gVGhlIGV4cHJlc3Npb24gZm9yIHRoZSBkaWZmZXJlbmNlIG9mIHRoZSB0d28gc3ltYm9scyB0aGF0CisgIC8vLyBtYWtlIHVwIHRoZSBhZGRyZXNzIGRlbHRhIGJldHdlZW4gdHdvIC5sb2MgZHdhcmYgZGlyZWN0aXZlcy4KKyAgY29uc3QgTUNFeHByICpBZGRyRGVsdGE7CisKKyAgU21hbGxTdHJpbmc8OD4gQ29udGVudHM7CisKK3B1YmxpYzoKKyAgTUNEd2FyZkxpbmVBZGRyRnJhZ21lbnQoaW50NjRfdCBMaW5lRGVsdGEsIGNvbnN0IE1DRXhwciAmQWRkckRlbHRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNQ1NlY3Rpb24gKlNlYyA9IG51bGxwdHIpCisgICAgICA6IE1DRnJhZ21lbnQoRlRfRHdhcmYsIGZhbHNlLCAwLCBTZWMpLCBMaW5lRGVsdGEoTGluZURlbHRhKSwKKyAgICAgICAgQWRkckRlbHRhKCZBZGRyRGVsdGEpIHsKKyAgICBDb250ZW50cy5wdXNoX2JhY2soMCk7CisgIH0KKworICAvLy8gXG5hbWUgQWNjZXNzb3JzCisgIC8vLyBAeworCisgIGludDY0X3QgZ2V0TGluZURlbHRhKCkgY29uc3QgeyByZXR1cm4gTGluZURlbHRhOyB9CisKKyAgY29uc3QgTUNFeHByICZnZXRBZGRyRGVsdGEoKSBjb25zdCB7IHJldHVybiAqQWRkckRlbHRhOyB9CisKKyAgU21hbGxTdHJpbmc8OD4gJmdldENvbnRlbnRzKCkgeyByZXR1cm4gQ29udGVudHM7IH0KKyAgY29uc3QgU21hbGxTdHJpbmc8OD4gJmdldENvbnRlbnRzKCkgY29uc3QgeyByZXR1cm4gQ29udGVudHM7IH0KKworICAvLy8gQH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DRnJhZ21lbnQgKkYpIHsKKyAgICByZXR1cm4gRi0+Z2V0S2luZCgpID09IE1DRnJhZ21lbnQ6OkZUX0R3YXJmOworICB9Cit9OworCitjbGFzcyBNQ0R3YXJmQ2FsbEZyYW1lRnJhZ21lbnQgOiBwdWJsaWMgTUNGcmFnbWVudCB7CisgIC8vLyBBZGRyRGVsdGEgLSBUaGUgZXhwcmVzc2lvbiBmb3IgdGhlIGRpZmZlcmVuY2Ugb2YgdGhlIHR3byBzeW1ib2xzIHRoYXQKKyAgLy8vIG1ha2UgdXAgdGhlIGFkZHJlc3MgZGVsdGEgYmV0d2VlbiB0d28gLmNmaV8qIGR3YXJmIGRpcmVjdGl2ZXMuCisgIGNvbnN0IE1DRXhwciAqQWRkckRlbHRhOworCisgIFNtYWxsU3RyaW5nPDg+IENvbnRlbnRzOworCitwdWJsaWM6CisgIE1DRHdhcmZDYWxsRnJhbWVGcmFnbWVudChjb25zdCBNQ0V4cHIgJkFkZHJEZWx0YSwgTUNTZWN0aW9uICpTZWMgPSBudWxscHRyKQorICAgICAgOiBNQ0ZyYWdtZW50KEZUX0R3YXJmRnJhbWUsIGZhbHNlLCAwLCBTZWMpLCBBZGRyRGVsdGEoJkFkZHJEZWx0YSkgeworICAgIENvbnRlbnRzLnB1c2hfYmFjaygwKTsKKyAgfQorCisgIC8vLyBcbmFtZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisKKyAgY29uc3QgTUNFeHByICZnZXRBZGRyRGVsdGEoKSBjb25zdCB7IHJldHVybiAqQWRkckRlbHRhOyB9CisKKyAgU21hbGxTdHJpbmc8OD4gJmdldENvbnRlbnRzKCkgeyByZXR1cm4gQ29udGVudHM7IH0KKyAgY29uc3QgU21hbGxTdHJpbmc8OD4gJmdldENvbnRlbnRzKCkgY29uc3QgeyByZXR1cm4gQ29udGVudHM7IH0KKworICAvLy8gQH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DRnJhZ21lbnQgKkYpIHsKKyAgICByZXR1cm4gRi0+Z2V0S2luZCgpID09IE1DRnJhZ21lbnQ6OkZUX0R3YXJmRnJhbWU7CisgIH0KK307CisKKy8vLyBSZXByZXNlbnRzIGEgc3ltYm9sIHRhYmxlIGluZGV4IGZyYWdtZW50LgorY2xhc3MgTUNTeW1ib2xJZEZyYWdtZW50IDogcHVibGljIE1DRnJhZ21lbnQgeworICBjb25zdCBNQ1N5bWJvbCAqU3ltOworCitwdWJsaWM6CisgIE1DU3ltYm9sSWRGcmFnbWVudChjb25zdCBNQ1N5bWJvbCAqU3ltLCBNQ1NlY3Rpb24gKlNlYyA9IG51bGxwdHIpCisgICAgICA6IE1DRnJhZ21lbnQoRlRfU3ltYm9sSWQsIGZhbHNlLCAwLCBTZWMpLCBTeW0oU3ltKSB7fQorCisgIC8vLyBcbmFtZSBBY2Nlc3NvcnMKKyAgLy8vIEB7CisKKyAgY29uc3QgTUNTeW1ib2wgKmdldFN5bWJvbCgpIHsgcmV0dXJuIFN5bTsgfQorICBjb25zdCBNQ1N5bWJvbCAqZ2V0U3ltYm9sKCkgY29uc3QgeyByZXR1cm4gU3ltOyB9CisKKyAgLy8vIEB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0ZyYWdtZW50ICpGKSB7CisgICAgcmV0dXJuIEYtPmdldEtpbmQoKSA9PSBNQ0ZyYWdtZW50OjpGVF9TeW1ib2xJZDsKKyAgfQorfTsKKworLy8vIEZyYWdtZW50IHJlcHJlc2VudGluZyB0aGUgYmluYXJ5IGFubm90YXRpb25zIHByb2R1Y2VkIGJ5IHRoZQorLy8vIC5jdl9pbmxpbmVfbGluZXRhYmxlIGRpcmVjdGl2ZS4KK2NsYXNzIE1DQ1ZJbmxpbmVMaW5lVGFibGVGcmFnbWVudCA6IHB1YmxpYyBNQ0ZyYWdtZW50IHsKKyAgdW5zaWduZWQgU2l0ZUZ1bmNJZDsKKyAgdW5zaWduZWQgU3RhcnRGaWxlSWQ7CisgIHVuc2lnbmVkIFN0YXJ0TGluZU51bTsKKyAgY29uc3QgTUNTeW1ib2wgKkZuU3RhcnRTeW07CisgIGNvbnN0IE1DU3ltYm9sICpGbkVuZFN5bTsKKyAgU21hbGxTdHJpbmc8OD4gQ29udGVudHM7CisKKyAgLy8vIENvZGVWaWV3Q29udGV4dCBoYXMgdGhlIHJlYWwga25vd2xlZGdlIGFib3V0IHRoaXMgZm9ybWF0LCBzbyBsZXQgaXQgYWNjZXNzCisgIC8vLyBvdXIgbWVtYmVycy4KKyAgZnJpZW5kIGNsYXNzIENvZGVWaWV3Q29udGV4dDsKKworcHVibGljOgorICBNQ0NWSW5saW5lTGluZVRhYmxlRnJhZ21lbnQodW5zaWduZWQgU2l0ZUZ1bmNJZCwgdW5zaWduZWQgU3RhcnRGaWxlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTdGFydExpbmVOdW0sIGNvbnN0IE1DU3ltYm9sICpGblN0YXJ0U3ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKkZuRW5kU3ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTZWN0aW9uICpTZWMgPSBudWxscHRyKQorICAgICAgOiBNQ0ZyYWdtZW50KEZUX0NWSW5saW5lTGluZXMsIGZhbHNlLCAwLCBTZWMpLCBTaXRlRnVuY0lkKFNpdGVGdW5jSWQpLAorICAgICAgICBTdGFydEZpbGVJZChTdGFydEZpbGVJZCksIFN0YXJ0TGluZU51bShTdGFydExpbmVOdW0pLAorICAgICAgICBGblN0YXJ0U3ltKEZuU3RhcnRTeW0pLCBGbkVuZFN5bShGbkVuZFN5bSkge30KKworICAvLy8gXG5hbWUgQWNjZXNzb3JzCisgIC8vLyBAeworCisgIGNvbnN0IE1DU3ltYm9sICpnZXRGblN0YXJ0U3ltKCkgY29uc3QgeyByZXR1cm4gRm5TdGFydFN5bTsgfQorICBjb25zdCBNQ1N5bWJvbCAqZ2V0Rm5FbmRTeW0oKSBjb25zdCB7IHJldHVybiBGbkVuZFN5bTsgfQorCisgIFNtYWxsU3RyaW5nPDg+ICZnZXRDb250ZW50cygpIHsgcmV0dXJuIENvbnRlbnRzOyB9CisgIGNvbnN0IFNtYWxsU3RyaW5nPDg+ICZnZXRDb250ZW50cygpIGNvbnN0IHsgcmV0dXJuIENvbnRlbnRzOyB9CisKKyAgLy8vIEB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ0ZyYWdtZW50ICpGKSB7CisgICAgcmV0dXJuIEYtPmdldEtpbmQoKSA9PSBNQ0ZyYWdtZW50OjpGVF9DVklubGluZUxpbmVzOworICB9Cit9OworCisvLy8gRnJhZ21lbnQgcmVwcmVzZW50aW5nIHRoZSAuY3ZfZGVmX3JhbmdlIGRpcmVjdGl2ZS4KK2NsYXNzIE1DQ1ZEZWZSYW5nZUZyYWdtZW50IDogcHVibGljIE1DRW5jb2RlZEZyYWdtZW50V2l0aEZpeHVwczwzMiwgND4geworICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgTUNTeW1ib2wgKiwgY29uc3QgTUNTeW1ib2wgKj4sIDI+IFJhbmdlczsKKyAgU21hbGxTdHJpbmc8MzI+IEZpeGVkU2l6ZVBvcnRpb247CisKKyAgLy8vIENvZGVWaWV3Q29udGV4dCBoYXMgdGhlIHJlYWwga25vd2xlZGdlIGFib3V0IHRoaXMgZm9ybWF0LCBzbyBsZXQgaXQgYWNjZXNzCisgIC8vLyBvdXIgbWVtYmVycy4KKyAgZnJpZW5kIGNsYXNzIENvZGVWaWV3Q29udGV4dDsKKworcHVibGljOgorICBNQ0NWRGVmUmFuZ2VGcmFnbWVudCgKKyAgICAgIEFycmF5UmVmPHN0ZDo6cGFpcjxjb25zdCBNQ1N5bWJvbCAqLCBjb25zdCBNQ1N5bWJvbCAqPj4gUmFuZ2VzLAorICAgICAgU3RyaW5nUmVmIEZpeGVkU2l6ZVBvcnRpb24sIE1DU2VjdGlvbiAqU2VjID0gbnVsbHB0cikKKyAgICAgIDogTUNFbmNvZGVkRnJhZ21lbnRXaXRoRml4dXBzPDMyLCA0PihGVF9DVkRlZlJhbmdlLCBmYWxzZSwgU2VjKSwKKyAgICAgICAgUmFuZ2VzKFJhbmdlcy5iZWdpbigpLCBSYW5nZXMuZW5kKCkpLAorICAgICAgICBGaXhlZFNpemVQb3J0aW9uKEZpeGVkU2l6ZVBvcnRpb24pIHt9CisKKyAgLy8vIFxuYW1lIEFjY2Vzc29ycworICAvLy8gQHsKKyAgQXJyYXlSZWY8c3RkOjpwYWlyPGNvbnN0IE1DU3ltYm9sICosIGNvbnN0IE1DU3ltYm9sICo+PiBnZXRSYW5nZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIFJhbmdlczsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXRGaXhlZFNpemVQb3J0aW9uKCkgY29uc3QgeyByZXR1cm4gRml4ZWRTaXplUG9ydGlvbjsgfQorICAvLy8gQH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DRnJhZ21lbnQgKkYpIHsKKyAgICByZXR1cm4gRi0+Z2V0S2luZCgpID09IE1DRnJhZ21lbnQ6OkZUX0NWRGVmUmFuZ2U7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DRlJBR01FTlRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0luc3QuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNJbnN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIyOGZkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNJbnN0LmgKQEAgLTAsMCArMSwyMjMgQEAKKy8vPT09LSBsbHZtL01DL01DSW5zdC5oIC0gTUNJbnN0IGNsYXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgTUNJbnN0IGFuZCBNQ09wZXJhbmQgY2xhc3Nlcywgd2hpY2gKKy8vIGlzIHRoZSBiYXNpYyByZXByZXNlbnRhdGlvbiB1c2VkIHRvIHJlcHJlc2VudCBsb3ctbGV2ZWwgbWFjaGluZSBjb2RlCisvLyBpbnN0cnVjdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DSU5TVF9ICisjZGVmaW5lIExMVk1fTUNfTUNJTlNUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NNTG9jLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNFeHByOworY2xhc3MgTUNJbnN0OworY2xhc3MgTUNJbnN0UHJpbnRlcjsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gXGJyaWVmIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBvcGVyYW5kcyBvZiB0aGUgTUNJbnN0IGNsYXNzLgorLy8vIFRoaXMgaXMgYSBzaW1wbGUgZGlzY3JpbWluYXRlZCB1bmlvbi4KK2NsYXNzIE1DT3BlcmFuZCB7CisgIGVudW0gTWFjaGluZU9wZXJhbmRUeXBlIDogdW5zaWduZWQgY2hhciB7CisgICAga0ludmFsaWQsICAgICAvLy88IFVuaW5pdGlhbGl6ZWQuCisgICAga1JlZ2lzdGVyLCAgICAvLy88IFJlZ2lzdGVyIG9wZXJhbmQuCisgICAga0ltbWVkaWF0ZSwgICAvLy88IEltbWVkaWF0ZSBvcGVyYW5kLgorICAgIGtGUEltbWVkaWF0ZSwgLy8vPCBGbG9hdGluZy1wb2ludCBpbW1lZGlhdGUgb3BlcmFuZC4KKyAgICBrRXhwciwgICAgICAgIC8vLzwgUmVsb2NhdGFibGUgaW1tZWRpYXRlIG9wZXJhbmQuCisgICAga0luc3QgICAgICAgICAvLy88IFN1Yi1pbnN0cnVjdGlvbiBvcGVyYW5kLgorICB9OworICBNYWNoaW5lT3BlcmFuZFR5cGUgS2luZCA9IGtJbnZhbGlkOworCisgIHVuaW9uIHsKKyAgICB1bnNpZ25lZCBSZWdWYWw7CisgICAgaW50NjRfdCBJbW1WYWw7CisgICAgZG91YmxlIEZQSW1tVmFsOworICAgIGNvbnN0IE1DRXhwciAqRXhwclZhbDsKKyAgICBjb25zdCBNQ0luc3QgKkluc3RWYWw7CisgIH07CisKK3B1YmxpYzoKKyAgTUNPcGVyYW5kKCkgOiBGUEltbVZhbCgwLjApIHt9CisKKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gS2luZCAhPSBrSW52YWxpZDsgfQorICBib29sIGlzUmVnKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBrUmVnaXN0ZXI7IH0KKyAgYm9vbCBpc0ltbSgpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0ga0ltbWVkaWF0ZTsgfQorICBib29sIGlzRlBJbW0oKSBjb25zdCB7IHJldHVybiBLaW5kID09IGtGUEltbWVkaWF0ZTsgfQorICBib29sIGlzRXhwcigpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0ga0V4cHI7IH0KKyAgYm9vbCBpc0luc3QoKSBjb25zdCB7IHJldHVybiBLaW5kID09IGtJbnN0OyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSByZWdpc3RlciBudW1iZXIuCisgIHVuc2lnbmVkIGdldFJlZygpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiVGhpcyBpcyBub3QgYSByZWdpc3RlciBvcGVyYW5kISIpOworICAgIHJldHVybiBSZWdWYWw7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCB0aGUgcmVnaXN0ZXIgbnVtYmVyLgorICB2b2lkIHNldFJlZyh1bnNpZ25lZCBSZWcpIHsKKyAgICBhc3NlcnQoaXNSZWcoKSAmJiAiVGhpcyBpcyBub3QgYSByZWdpc3RlciBvcGVyYW5kISIpOworICAgIFJlZ1ZhbCA9IFJlZzsKKyAgfQorCisgIGludDY0X3QgZ2V0SW1tKCkgY29uc3QgeworICAgIGFzc2VydChpc0ltbSgpICYmICJUaGlzIGlzIG5vdCBhbiBpbW1lZGlhdGUiKTsKKyAgICByZXR1cm4gSW1tVmFsOworICB9CisKKyAgdm9pZCBzZXRJbW0oaW50NjRfdCBWYWwpIHsKKyAgICBhc3NlcnQoaXNJbW0oKSAmJiAiVGhpcyBpcyBub3QgYW4gaW1tZWRpYXRlIik7CisgICAgSW1tVmFsID0gVmFsOworICB9CisKKyAgZG91YmxlIGdldEZQSW1tKCkgY29uc3QgeworICAgIGFzc2VydChpc0ZQSW1tKCkgJiYgIlRoaXMgaXMgbm90IGFuIEZQIGltbWVkaWF0ZSIpOworICAgIHJldHVybiBGUEltbVZhbDsKKyAgfQorCisgIHZvaWQgc2V0RlBJbW0oZG91YmxlIFZhbCkgeworICAgIGFzc2VydChpc0ZQSW1tKCkgJiYgIlRoaXMgaXMgbm90IGFuIEZQIGltbWVkaWF0ZSIpOworICAgIEZQSW1tVmFsID0gVmFsOworICB9CisKKyAgY29uc3QgTUNFeHByICpnZXRFeHByKCkgY29uc3QgeworICAgIGFzc2VydChpc0V4cHIoKSAmJiAiVGhpcyBpcyBub3QgYW4gZXhwcmVzc2lvbiIpOworICAgIHJldHVybiBFeHByVmFsOworICB9CisKKyAgdm9pZCBzZXRFeHByKGNvbnN0IE1DRXhwciAqVmFsKSB7CisgICAgYXNzZXJ0KGlzRXhwcigpICYmICJUaGlzIGlzIG5vdCBhbiBleHByZXNzaW9uIik7CisgICAgRXhwclZhbCA9IFZhbDsKKyAgfQorCisgIGNvbnN0IE1DSW5zdCAqZ2V0SW5zdCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNJbnN0KCkgJiYgIlRoaXMgaXMgbm90IGEgc3ViLWluc3RydWN0aW9uIik7CisgICAgcmV0dXJuIEluc3RWYWw7CisgIH0KKworICB2b2lkIHNldEluc3QoY29uc3QgTUNJbnN0ICpWYWwpIHsKKyAgICBhc3NlcnQoaXNJbnN0KCkgJiYgIlRoaXMgaXMgbm90IGEgc3ViLWluc3RydWN0aW9uIik7CisgICAgSW5zdFZhbCA9IFZhbDsKKyAgfQorCisgIHN0YXRpYyBNQ09wZXJhbmQgY3JlYXRlUmVnKHVuc2lnbmVkIFJlZykgeworICAgIE1DT3BlcmFuZCBPcDsKKyAgICBPcC5LaW5kID0ga1JlZ2lzdGVyOworICAgIE9wLlJlZ1ZhbCA9IFJlZzsKKyAgICByZXR1cm4gT3A7CisgIH0KKworICBzdGF0aWMgTUNPcGVyYW5kIGNyZWF0ZUltbShpbnQ2NF90IFZhbCkgeworICAgIE1DT3BlcmFuZCBPcDsKKyAgICBPcC5LaW5kID0ga0ltbWVkaWF0ZTsKKyAgICBPcC5JbW1WYWwgPSBWYWw7CisgICAgcmV0dXJuIE9wOworICB9CisKKyAgc3RhdGljIE1DT3BlcmFuZCBjcmVhdGVGUEltbShkb3VibGUgVmFsKSB7CisgICAgTUNPcGVyYW5kIE9wOworICAgIE9wLktpbmQgPSBrRlBJbW1lZGlhdGU7CisgICAgT3AuRlBJbW1WYWwgPSBWYWw7CisgICAgcmV0dXJuIE9wOworICB9CisKKyAgc3RhdGljIE1DT3BlcmFuZCBjcmVhdGVFeHByKGNvbnN0IE1DRXhwciAqVmFsKSB7CisgICAgTUNPcGVyYW5kIE9wOworICAgIE9wLktpbmQgPSBrRXhwcjsKKyAgICBPcC5FeHByVmFsID0gVmFsOworICAgIHJldHVybiBPcDsKKyAgfQorCisgIHN0YXRpYyBNQ09wZXJhbmQgY3JlYXRlSW5zdChjb25zdCBNQ0luc3QgKlZhbCkgeworICAgIE1DT3BlcmFuZCBPcDsKKyAgICBPcC5LaW5kID0ga0luc3Q7CisgICAgT3AuSW5zdFZhbCA9IFZhbDsKKyAgICByZXR1cm4gT3A7CisgIH0KKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGlzUG9kTGlrZTxNQ09wZXJhbmQ+IHsgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOyB9OworCisvLy8gXGJyaWVmIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHNpbmdsZSBsb3ctbGV2ZWwgbWFjaGluZQorLy8vIGluc3RydWN0aW9uLgorY2xhc3MgTUNJbnN0IHsKKyAgdW5zaWduZWQgT3Bjb2RlID0gMDsKKyAgU01Mb2MgTG9jOworICBTbWFsbFZlY3RvcjxNQ09wZXJhbmQsIDg+IE9wZXJhbmRzOworICAvLyBUaGVzZSBmbGFncyBjb3VsZCBiZSB1c2VkIHRvIHBhc3Mgc29tZSBpbmZvIGZyb20gb25lIHRhcmdldCBzdWJjb21wb25lbnQKKyAgLy8gdG8gYW5vdGhlciwgZm9yIGV4YW1wbGUsIGZyb20gZGlzYXNzZW1ibGVyIHRvIGFzbSBwcmludGVyLiBUaGUgdmFsdWVzIG9mCisgIC8vIHRoZSBmbGFncyBoYXZlIGFueSBzZW5zZSBvbiB0YXJnZXQgbGV2ZWwgb25seSAoZS5nLiBwcmVmaXhlcyBvbiB4ODYpLgorICB1bnNpZ25lZCBGbGFncyA9IDA7CisKK3B1YmxpYzoKKyAgTUNJbnN0KCkgPSBkZWZhdWx0OworCisgIHZvaWQgc2V0T3Bjb2RlKHVuc2lnbmVkIE9wKSB7IE9wY29kZSA9IE9wOyB9CisgIHVuc2lnbmVkIGdldE9wY29kZSgpIGNvbnN0IHsgcmV0dXJuIE9wY29kZTsgfQorCisgIHZvaWQgc2V0RmxhZ3ModW5zaWduZWQgRikgeyBGbGFncyA9IEY7IH0KKyAgdW5zaWduZWQgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBGbGFnczsgfQorCisgIHZvaWQgc2V0TG9jKFNNTG9jIGxvYykgeyBMb2MgPSBsb2M7IH0KKyAgU01Mb2MgZ2V0TG9jKCkgY29uc3QgeyByZXR1cm4gTG9jOyB9CisKKyAgY29uc3QgTUNPcGVyYW5kICZnZXRPcGVyYW5kKHVuc2lnbmVkIGkpIGNvbnN0IHsgcmV0dXJuIE9wZXJhbmRzW2ldOyB9CisgIE1DT3BlcmFuZCAmZ2V0T3BlcmFuZCh1bnNpZ25lZCBpKSB7IHJldHVybiBPcGVyYW5kc1tpXTsgfQorICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kcygpIGNvbnN0IHsgcmV0dXJuIE9wZXJhbmRzLnNpemUoKTsgfQorCisgIHZvaWQgYWRkT3BlcmFuZChjb25zdCBNQ09wZXJhbmQgJk9wKSB7IE9wZXJhbmRzLnB1c2hfYmFjayhPcCk7IH0KKworICB1c2luZyBpdGVyYXRvciA9IFNtYWxsVmVjdG9ySW1wbDxNQ09wZXJhbmQ+OjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBTbWFsbFZlY3RvckltcGw8TUNPcGVyYW5kPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgdm9pZCBjbGVhcigpIHsgT3BlcmFuZHMuY2xlYXIoKTsgfQorICB2b2lkIGVyYXNlKGl0ZXJhdG9yIEkpIHsgT3BlcmFuZHMuZXJhc2UoSSk7IH0KKyAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBPcGVyYW5kcy5zaXplKCk7IH0KKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBPcGVyYW5kcy5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gT3BlcmFuZHMuYmVnaW4oKTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBPcGVyYW5kcy5lbmQoKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBPcGVyYW5kcy5lbmQoKTsgfQorCisgIGl0ZXJhdG9yIGluc2VydChpdGVyYXRvciBJLCBjb25zdCBNQ09wZXJhbmQgJk9wKSB7CisgICAgcmV0dXJuIE9wZXJhbmRzLmluc2VydChJLCBPcCk7CisgIH0KKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRHVtcCB0aGUgTUNJbnN0IGFzIHByZXR0aWx5IGFzIHBvc3NpYmxlIHVzaW5nIHRoZSBhZGRpdGlvbmFsIE1DCisgIC8vLyBzdHJ1Y3R1cmVzLCBpZiBnaXZlbi4gT3BlcmF0b3JzIGFyZSBzZXBhcmF0ZWQgYnkgdGhlIFxwIFNlcGFyYXRvcgorICAvLy8gc3RyaW5nLgorICB2b2lkIGR1bXBfcHJldHR5KHJhd19vc3RyZWFtICZPUywgY29uc3QgTUNJbnN0UHJpbnRlciAqUHJpbnRlciA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFNlcGFyYXRvciA9ICIgIikgY29uc3Q7Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0mIG9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNQ09wZXJhbmQgJk1PKSB7CisgIE1PLnByaW50KE9TKTsKKyAgcmV0dXJuIE9TOworfQorCitpbmxpbmUgcmF3X29zdHJlYW0mIG9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNQ0luc3QgJk1JKSB7CisgIE1JLnByaW50KE9TKTsKKyAgcmV0dXJuIE9TOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ0lOU1RfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0luc3RCdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DSW5zdEJ1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMDYwOWJkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0luc3RCdWlsZGVyLmgKQEAgLTAsMCArMSw3NCBAQAorLy89PT0tLSBsbHZtL01DL01DSW5zdEJ1aWxkZXIuaCAtIFNpbXBsaWZ5IGNyZWF0aW9uIG9mIE1DSW5zdHMgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIE1DSW5zdEJ1aWxkZXIgY2xhc3MgZm9yIGNvbnZlbmllbnQgY3JlYXRpb24gb2YKKy8vIE1DSW5zdHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DSU5TVEJVSUxERVJfSAorI2RlZmluZSBMTFZNX01DX01DSU5TVEJVSUxERVJfSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3QuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0luc3RCdWlsZGVyIHsKKyAgTUNJbnN0IEluc3Q7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBuZXcgTUNJbnN0QnVpbGRlciBmb3IgYW4gTUNJbnN0IHdpdGggYSBzcGVjaWZpYyBvcGNvZGUuCisgIE1DSW5zdEJ1aWxkZXIodW5zaWduZWQgT3Bjb2RlKSB7CisgICAgSW5zdC5zZXRPcGNvZGUoT3Bjb2RlKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWRkIGEgbmV3IHJlZ2lzdGVyIG9wZXJhbmQuCisgIE1DSW5zdEJ1aWxkZXIgJmFkZFJlZyh1bnNpZ25lZCBSZWcpIHsKKyAgICBJbnN0LmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpjcmVhdGVSZWcoUmVnKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxicmllZiBBZGQgYSBuZXcgaW50ZWdlciBpbW1lZGlhdGUgb3BlcmFuZC4KKyAgTUNJbnN0QnVpbGRlciAmYWRkSW1tKGludDY0X3QgVmFsKSB7CisgICAgSW5zdC5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Y3JlYXRlSW1tKFZhbCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWRkIGEgbmV3IGZsb2F0aW5nIHBvaW50IGltbWVkaWF0ZSBvcGVyYW5kLgorICBNQ0luc3RCdWlsZGVyICZhZGRGUEltbShkb3VibGUgVmFsKSB7CisgICAgSW5zdC5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Y3JlYXRlRlBJbW0oVmFsKSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxicmllZiBBZGQgYSBuZXcgTUNFeHByIG9wZXJhbmQuCisgIE1DSW5zdEJ1aWxkZXIgJmFkZEV4cHIoY29uc3QgTUNFeHByICpWYWwpIHsKKyAgICBJbnN0LmFkZE9wZXJhbmQoTUNPcGVyYW5kOjpjcmVhdGVFeHByKFZhbCkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWRkIGEgbmV3IE1DSW5zdCBvcGVyYW5kLgorICBNQ0luc3RCdWlsZGVyICZhZGRJbnN0KGNvbnN0IE1DSW5zdCAqVmFsKSB7CisgICAgSW5zdC5hZGRPcGVyYW5kKE1DT3BlcmFuZDo6Y3JlYXRlSW5zdChWYWwpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gXGJyaWVmIEFkZCBhbiBvcGVyYW5kLgorICBNQ0luc3RCdWlsZGVyICZhZGRPcGVyYW5kKGNvbnN0IE1DT3BlcmFuZCAmT3ApIHsKKyAgICBJbnN0LmFkZE9wZXJhbmQoT3ApOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIG9wZXJhdG9yIE1DSW5zdCYoKSB7CisgICAgcmV0dXJuIEluc3Q7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0luc3RQcmludGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DSW5zdFByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjk0MDMwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0luc3RQcmludGVyLmgKQEAgLTAsMCArMSwxMDkgQEAKKy8vPT09LSBNQ0luc3RQcmludGVyLmggLSBNQ0luc3QgdG8gdGFyZ2V0IGFzc2VtYmx5IHN5bnRheCAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0lOU1RQUklOVEVSX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0lOU1RQUklOVEVSX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXQuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheVJlZjsKK2NsYXNzIE1DQXNtSW5mbzsKK2NsYXNzIE1DSW5zdDsKK2NsYXNzIE1DSW5zdHJJbmZvOworY2xhc3MgTUNSZWdpc3RlckluZm87CitjbGFzcyBNQ1N1YnRhcmdldEluZm87CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFN0cmluZ1JlZjsKKworLy8vIENvbnZlcnQgYEJ5dGVzJyB0byBhIGhleCBzdHJpbmcgYW5kIG91dHB1dCB0byBgT1MnCit2b2lkIGR1bXBCeXRlcyhBcnJheVJlZjx1aW50OF90PiBCeXRlcywgcmF3X29zdHJlYW0gJk9TKTsKKworbmFtZXNwYWNlIEhleFN0eWxlIHsKKworZW51bSBTdHlsZSB7CisgIEMsICAvLy88IDB4ZmYKKyAgQXNtIC8vLzwgMGZmaAorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEhleFN0eWxlCisKKy8vLyBcYnJpZWYgVGhpcyBpcyBhbiBpbnN0YW5jZSBvZiBhIHRhcmdldCBhc3NlbWJseSBsYW5ndWFnZSBwcmludGVyIHRoYXQKKy8vLyBjb252ZXJ0cyBhbiBNQ0luc3QgdG8gdmFsaWQgdGFyZ2V0IGFzc2VtYmx5IHN5bnRheC4KK2NsYXNzIE1DSW5zdFByaW50ZXIgeworcHJvdGVjdGVkOgorICAvLy8gXGJyaWVmIEEgc3RyZWFtIHRoYXQgY29tbWVudHMgY2FuIGJlIGVtaXR0ZWQgdG8gaWYgZGVzaXJlZC4gIEVhY2ggY29tbWVudAorICAvLy8gbXVzdCBlbmQgd2l0aCBhIG5ld2xpbmUuICBUaGlzIHdpbGwgYmUgbnVsbCBpZiB2ZXJib3NlIGFzc2VtYmx5IGVtaXNzaW9uCisgIC8vLyBpcyBkaXNhYmxlLgorICByYXdfb3N0cmVhbSAqQ29tbWVudFN0cmVhbSA9IG51bGxwdHI7CisgIGNvbnN0IE1DQXNtSW5mbyAmTUFJOworICBjb25zdCBNQ0luc3RySW5mbyAmTUlJOworICBjb25zdCBNQ1JlZ2lzdGVySW5mbyAmTVJJOworCisgIC8vLyBUcnVlIGlmIHdlIGFyZSBwcmludGluZyBtYXJrZWQgdXAgYXNzZW1ibHkuCisgIGJvb2wgVXNlTWFya3VwID0gZmFsc2U7CisKKyAgLy8vIFRydWUgaWYgd2UgYXJlIHByaW50aW5nIGltbWVkaWF0ZXMgYXMgaGV4LgorICBib29sIFByaW50SW1tSGV4ID0gZmFsc2U7CisKKyAgLy8vIFdoaWNoIHN0eWxlIHRvIHVzZSBmb3IgcHJpbnRpbmcgaGV4YWRlY2ltYWwgdmFsdWVzLgorICBIZXhTdHlsZTo6U3R5bGUgUHJpbnRIZXhTdHlsZSA9IEhleFN0eWxlOjpDOworCisgIC8vLyBVdGlsaXR5IGZ1bmN0aW9uIGZvciBwcmludGluZyBhbm5vdGF0aW9ucy4KKyAgdm9pZCBwcmludEFubm90YXRpb24ocmF3X29zdHJlYW0gJk9TLCBTdHJpbmdSZWYgQW5ub3QpOworCitwdWJsaWM6CisgIE1DSW5zdFByaW50ZXIoY29uc3QgTUNBc21JbmZvICZtYWksIGNvbnN0IE1DSW5zdHJJbmZvICZtaWksCisgICAgICAgICAgICAgICAgY29uc3QgTUNSZWdpc3RlckluZm8gJm1yaSkgOiBNQUkobWFpKSwgTUlJKG1paSksIE1SSShtcmkpIHt9CisKKyAgdmlydHVhbCB+TUNJbnN0UHJpbnRlcigpOworCisgIC8vLyBcYnJpZWYgU3BlY2lmeSBhIHN0cmVhbSB0byBlbWl0IGNvbW1lbnRzIHRvLgorICB2b2lkIHNldENvbW1lbnRTdHJlYW0ocmF3X29zdHJlYW0gJk9TKSB7IENvbW1lbnRTdHJlYW0gPSAmT1M7IH0KKworICAvLy8gXGJyaWVmIFByaW50IHRoZSBzcGVjaWZpZWQgTUNJbnN0IHRvIHRoZSBzcGVjaWZpZWQgcmF3X29zdHJlYW0uCisgIHZpcnR1YWwgdm9pZCBwcmludEluc3QoY29uc3QgTUNJbnN0ICpNSSwgcmF3X29zdHJlYW0gJk9TLCBTdHJpbmdSZWYgQW5ub3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZTVEkpID0gMDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgc3BlY2lmaWVkIG9wY29kZSBlbnVtIChlLmcuICJNT1YzMnJpIikgb3IKKyAgLy8vIGVtcHR5IGlmIHdlIGNhbid0IHJlc29sdmUgaXQuCisgIFN0cmluZ1JlZiBnZXRPcGNvZGVOYW1lKHVuc2lnbmVkIE9wY29kZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBQcmludCB0aGUgYXNzZW1ibGVyIHJlZ2lzdGVyIG5hbWUuCisgIHZpcnR1YWwgdm9pZCBwcmludFJlZ05hbWUocmF3X29zdHJlYW0gJk9TLCB1bnNpZ25lZCBSZWdObykgY29uc3Q7CisKKyAgYm9vbCBnZXRVc2VNYXJrdXAoKSBjb25zdCB7IHJldHVybiBVc2VNYXJrdXA7IH0KKyAgdm9pZCBzZXRVc2VNYXJrdXAoYm9vbCBWYWx1ZSkgeyBVc2VNYXJrdXAgPSBWYWx1ZTsgfQorCisgIC8vLyBVdGlsaXR5IGZ1bmN0aW9ucyB0byBtYWtlIGFkZGluZyBtYXJrIHVwcyBzaW1wbGVyLgorICBTdHJpbmdSZWYgbWFya3VwKFN0cmluZ1JlZiBzKSBjb25zdDsKKyAgU3RyaW5nUmVmIG1hcmt1cChTdHJpbmdSZWYgYSwgU3RyaW5nUmVmIGIpIGNvbnN0OworCisgIGJvb2wgZ2V0UHJpbnRJbW1IZXgoKSBjb25zdCB7IHJldHVybiBQcmludEltbUhleDsgfQorICB2b2lkIHNldFByaW50SW1tSGV4KGJvb2wgVmFsdWUpIHsgUHJpbnRJbW1IZXggPSBWYWx1ZTsgfQorCisgIEhleFN0eWxlOjpTdHlsZSBnZXRQcmludEhleFN0eWxlKCkgY29uc3QgeyByZXR1cm4gUHJpbnRIZXhTdHlsZTsgfQorICB2b2lkIHNldFByaW50SGV4U3R5bGUoSGV4U3R5bGU6OlN0eWxlIFZhbHVlKSB7IFByaW50SGV4U3R5bGUgPSBWYWx1ZTsgfQorCisgIC8vLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIHByaW50IGltbWVkaWF0ZXMgaW4gZGVjaW1hbCBvciBoZXguCisgIGZvcm1hdF9vYmplY3Q8aW50NjRfdD4gZm9ybWF0SW1tKGludDY0X3QgVmFsdWUpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJpbnRJbW1IZXggPyBmb3JtYXRIZXgoVmFsdWUpIDogZm9ybWF0RGVjKFZhbHVlKTsKKyAgfQorCisgIC8vLyBVdGlsaXR5IGZ1bmN0aW9ucyB0byBwcmludCBkZWNpbWFsL2hleGFkZWNpbWFsIHZhbHVlcy4KKyAgZm9ybWF0X29iamVjdDxpbnQ2NF90PiBmb3JtYXREZWMoaW50NjRfdCBWYWx1ZSkgY29uc3Q7CisgIGZvcm1hdF9vYmplY3Q8aW50NjRfdD4gZm9ybWF0SGV4KGludDY0X3QgVmFsdWUpIGNvbnN0OworICBmb3JtYXRfb2JqZWN0PHVpbnQ2NF90PiBmb3JtYXRIZXgodWludDY0X3QgVmFsdWUpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNJTlNUUFJJTlRFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DSW5zdHJBbmFseXNpcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0luc3RyQW5hbHlzaXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDNlMWRmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0luc3RyQW5hbHlzaXMuaApAQCAtMCwwICsxLDcyIEBACisvLz09PS0gbGx2bS9NQy9NQ0luc3RyQW5hbHlzaXMuaCAtIEluc3RyRGVzYyB0YXJnZXQgaG9va3MgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBNQ0luc3RyQW5hbHlzaXMgY2xhc3Mgd2hpY2ggdGhlIE1DVGFyZ2V0RGVzY3MgY2FuCisvLyBkZXJpdmUgZnJvbSB0byBnaXZlIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdG8gTUMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DSU5TVFJBTkFMWVNJU19ICisjZGVmaW5lIExMVk1fTUNfTUNJTlNUUkFOQUxZU0lTX0gKKworI2luY2x1ZGUgImxsdm0vTUMvTUNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3RyRGVzYy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNJbnN0ckluZm8uaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DSW5zdHJBbmFseXNpcyB7Citwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBUYXJnZXQ7CisKKyAgY29uc3QgTUNJbnN0ckluZm8gKkluZm87CisKK3B1YmxpYzoKKyAgTUNJbnN0ckFuYWx5c2lzKGNvbnN0IE1DSW5zdHJJbmZvICpJbmZvKSA6IEluZm8oSW5mbykge30KKyAgdmlydHVhbCB+TUNJbnN0ckFuYWx5c2lzKCkgPSBkZWZhdWx0OworCisgIHZpcnR1YWwgYm9vbCBpc0JyYW5jaChjb25zdCBNQ0luc3QgJkluc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5mby0+Z2V0KEluc3QuZ2V0T3Bjb2RlKCkpLmlzQnJhbmNoKCk7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgaXNDb25kaXRpb25hbEJyYW5jaChjb25zdCBNQ0luc3QgJkluc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5mby0+Z2V0KEluc3QuZ2V0T3Bjb2RlKCkpLmlzQ29uZGl0aW9uYWxCcmFuY2goKTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBpc1VuY29uZGl0aW9uYWxCcmFuY2goY29uc3QgTUNJbnN0ICZJbnN0KSBjb25zdCB7CisgICAgcmV0dXJuIEluZm8tPmdldChJbnN0LmdldE9wY29kZSgpKS5pc1VuY29uZGl0aW9uYWxCcmFuY2goKTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBpc0luZGlyZWN0QnJhbmNoKGNvbnN0IE1DSW5zdCAmSW5zdCkgY29uc3QgeworICAgIHJldHVybiBJbmZvLT5nZXQoSW5zdC5nZXRPcGNvZGUoKSkuaXNJbmRpcmVjdEJyYW5jaCgpOworICB9CisKKyAgdmlydHVhbCBib29sIGlzQ2FsbChjb25zdCBNQ0luc3QgJkluc3QpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5mby0+Z2V0KEluc3QuZ2V0T3Bjb2RlKCkpLmlzQ2FsbCgpOworICB9CisKKyAgdmlydHVhbCBib29sIGlzUmV0dXJuKGNvbnN0IE1DSW5zdCAmSW5zdCkgY29uc3QgeworICAgIHJldHVybiBJbmZvLT5nZXQoSW5zdC5nZXRPcGNvZGUoKSkuaXNSZXR1cm4oKTsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBpc1Rlcm1pbmF0b3IoY29uc3QgTUNJbnN0ICZJbnN0KSBjb25zdCB7CisgICAgcmV0dXJuIEluZm8tPmdldChJbnN0LmdldE9wY29kZSgpKS5pc1Rlcm1pbmF0b3IoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2l2ZW4gYSBicmFuY2ggaW5zdHJ1Y3Rpb24gdHJ5IHRvIGdldCB0aGUgYWRkcmVzcyB0aGUgYnJhbmNoCisgIC8vLyB0YXJnZXRzLiBSZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLCBhbmQgdGhlIGFkZHJlc3MgaW4gVGFyZ2V0LgorICB2aXJ0dWFsIGJvb2wKKyAgZXZhbHVhdGVCcmFuY2goY29uc3QgTUNJbnN0ICZJbnN0LCB1aW50NjRfdCBBZGRyLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICB1aW50NjRfdCAmVGFyZ2V0KSBjb25zdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DSU5TVFJBTkFMWVNJU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DSW5zdHJEZXNjLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DSW5zdHJEZXNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmY0Yzc1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNJbnN0ckRlc2MuaApAQCAtMCwwICsxLDU5MSBAQAorLy89PT0tLSBsbHZtL01DL01DSW5zdHJEZXNjLmggLSBJbnN0cnVjdGlvbiBEZXNjcmlwdG9ycyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIE1DT3BlcmFuZEluZm8gYW5kIE1DSW5zdHJEZXNjIGNsYXNzZXMsIHdoaWNoCisvLyBhcmUgdXNlZCB0byBkZXNjcmliZSB0YXJnZXQgaW5zdHJ1Y3Rpb25zIGFuZCB0aGVpciBvcGVyYW5kcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNJTlNUUkRFU0NfSAorI2RlZmluZSBMTFZNX01DX01DSU5TVFJERVNDX0gKKworI2luY2x1ZGUgImxsdm0vTUMvTUNSZWdpc3RlckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIE1DSW5zdDsKKyAgY2xhc3MgTUNTdWJ0YXJnZXRJbmZvOworICBjbGFzcyBGZWF0dXJlQml0c2V0OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTWFjaGluZSBPcGVyYW5kIEZsYWdzIGFuZCBEZXNjcmlwdGlvbgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworbmFtZXNwYWNlIE1DT0kgeworLy8gT3BlcmFuZCBjb25zdHJhaW50cworZW51bSBPcGVyYW5kQ29uc3RyYWludCB7CisgIFRJRURfVE8gPSAwLCAgLy8gTXVzdCBiZSBhbGxvY2F0ZWQgdGhlIHNhbWUgcmVnaXN0ZXIgYXMuCisgIEVBUkxZX0NMT0JCRVIgLy8gT3BlcmFuZCBpcyBhbiBlYXJseSBjbG9iYmVyIHJlZ2lzdGVyIG9wZXJhbmQKK307CisKKy8vLyBcYnJpZWYgVGhlc2UgYXJlIGZsYWdzIHNldCBvbiBvcGVyYW5kcywgYnV0IHNob3VsZCBiZSBjb25zaWRlcmVkCisvLy8gcHJpdmF0ZSwgYWxsIGFjY2VzcyBzaG91bGQgZ28gdGhyb3VnaCB0aGUgTUNPcGVyYW5kSW5mbyBhY2Nlc3NvcnMuCisvLy8gU2VlIHRoZSBhY2Nlc3NvcnMgZm9yIGEgZGVzY3JpcHRpb24gb2Ygd2hhdCB0aGVzZSBhcmUuCitlbnVtIE9wZXJhbmRGbGFncyB7IExvb2t1cFB0clJlZ0NsYXNzID0gMCwgUHJlZGljYXRlLCBPcHRpb25hbERlZiB9OworCisvLy8gXGJyaWVmIE9wZXJhbmRzIGFyZSB0YWdnZWQgd2l0aCBvbmUgb2YgdGhlIHZhbHVlcyBvZiB0aGlzIGVudW0uCitlbnVtIE9wZXJhbmRUeXBlIHsKKyAgT1BFUkFORF9VTktOT1dOID0gMCwKKyAgT1BFUkFORF9JTU1FRElBVEUgPSAxLAorICBPUEVSQU5EX1JFR0lTVEVSID0gMiwKKyAgT1BFUkFORF9NRU1PUlkgPSAzLAorICBPUEVSQU5EX1BDUkVMID0gNCwKKworICBPUEVSQU5EX0ZJUlNUX0dFTkVSSUMgPSA2LAorICBPUEVSQU5EX0dFTkVSSUNfMCA9IDYsCisgIE9QRVJBTkRfR0VORVJJQ18xID0gNywKKyAgT1BFUkFORF9HRU5FUklDXzIgPSA4LAorICBPUEVSQU5EX0dFTkVSSUNfMyA9IDksCisgIE9QRVJBTkRfR0VORVJJQ180ID0gMTAsCisgIE9QRVJBTkRfR0VORVJJQ181ID0gMTEsCisgIE9QRVJBTkRfTEFTVF9HRU5FUklDID0gMTEsCisKKyAgT1BFUkFORF9GSVJTVF9UQVJHRVQgPSAxMiwKK307CisKK2VudW0gR2VuZXJpY09wZXJhbmRUeXBlIHsKK307CisKK30KKworLy8vIFxicmllZiBUaGlzIGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IG9uZSBvcGVyYW5kIG9mIGEgbWFjaGluZSBpbnN0cnVjdGlvbiwKKy8vLyBpbmRpY2F0aW5nIHRoZSByZWdpc3RlciBjbGFzcyBmb3IgcmVnaXN0ZXIgb3BlcmFuZHMsIGV0Yy4KK2NsYXNzIE1DT3BlcmFuZEluZm8geworcHVibGljOgorICAvLy8gXGJyaWVmIFRoaXMgc3BlY2lmaWVzIHRoZSByZWdpc3RlciBjbGFzcyBlbnVtZXJhdGlvbiBvZiB0aGUgb3BlcmFuZAorICAvLy8gaWYgdGhlIG9wZXJhbmQgaXMgYSByZWdpc3Rlci4gIElmIGlzTG9va3VwUHRyUmVnQ2xhc3MgaXMgc2V0LCB0aGVuIHRoaXMgaXMKKyAgLy8vIGFuIGluZGV4IHRoYXQgaXMgcGFzc2VkIHRvIFRhcmdldFJlZ2lzdGVySW5mbzo6Z2V0UG9pbnRlclJlZ0NsYXNzKHgpIHRvCisgIC8vLyBnZXQgYSBkeW5hbWljIHJlZ2lzdGVyIGNsYXNzLgorICBpbnQxNl90IFJlZ0NsYXNzOworCisgIC8vLyBcYnJpZWYgVGhlc2UgYXJlIGZsYWdzIGZyb20gdGhlIE1DT0k6Ok9wZXJhbmRGbGFncyBlbnVtLgorICB1aW50OF90IEZsYWdzOworCisgIC8vLyBcYnJpZWYgSW5mb3JtYXRpb24gYWJvdXQgdGhlIHR5cGUgb2YgdGhlIG9wZXJhbmQuCisgIHVpbnQ4X3QgT3BlcmFuZFR5cGU7CisgIC8vLyBcYnJpZWYgVGhlIGxvd2VyIDE2IGJpdHMgYXJlIHVzZWQgdG8gc3BlY2lmeSB3aGljaCBjb25zdHJhaW50cyBhcmUgc2V0LgorICAvLy8gVGhlIGhpZ2hlciAxNiBiaXRzIGFyZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHZhbHVlIG9mIGNvbnN0cmFpbnRzICg0IGJpdHMKKyAgLy8vIGVhY2gpLgorICB1aW50MzJfdCBDb25zdHJhaW50czsKKworICAvLy8gXGJyaWVmIFNldCBpZiB0aGlzIG9wZXJhbmQgaXMgYSBwb2ludGVyIHZhbHVlIGFuZCBpdCByZXF1aXJlcyBhIGNhbGxiYWNrCisgIC8vLyB0byBsb29rIHVwIGl0cyByZWdpc3RlciBjbGFzcy4KKyAgYm9vbCBpc0xvb2t1cFB0clJlZ0NsYXNzKCkgY29uc3QgeworICAgIHJldHVybiBGbGFncyAmICgxIDw8IE1DT0k6Okxvb2t1cFB0clJlZ0NsYXNzKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgU2V0IGlmIHRoaXMgaXMgb25lIG9mIHRoZSBvcGVyYW5kcyB0aGF0IG1hZGUgdXAgb2YgdGhlIHByZWRpY2F0ZQorICAvLy8gb3BlcmFuZCB0aGF0IGNvbnRyb2xzIGFuIGlzUHJlZGljYWJsZSgpIGluc3RydWN0aW9uLgorICBib29sIGlzUHJlZGljYXRlKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiAoMSA8PCBNQ09JOjpQcmVkaWNhdGUpOyB9CisKKyAgLy8vIFxicmllZiBTZXQgaWYgdGhpcyBvcGVyYW5kIGlzIGEgb3B0aW9uYWwgZGVmLgorICBib29sIGlzT3B0aW9uYWxEZWYoKSBjb25zdCB7IHJldHVybiBGbGFncyAmICgxIDw8IE1DT0k6Ok9wdGlvbmFsRGVmKTsgfQorCisgIGJvb2wgaXNHZW5lcmljVHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gT3BlcmFuZFR5cGUgPj0gTUNPSTo6T1BFUkFORF9GSVJTVF9HRU5FUklDICYmCisgICAgICAgICAgIE9wZXJhbmRUeXBlIDw9IE1DT0k6Ok9QRVJBTkRfTEFTVF9HRU5FUklDOworICB9CisKKyAgdW5zaWduZWQgZ2V0R2VuZXJpY1R5cGVJbmRleCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNHZW5lcmljVHlwZSgpICYmICJub24tZ2VuZXJpYyB0eXBlcyBkb24ndCBoYXZlIGFuIGluZGV4Iik7CisgICAgcmV0dXJuIE9wZXJhbmRUeXBlIC0gTUNPSTo6T1BFUkFORF9GSVJTVF9HRU5FUklDOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gTWFjaGluZSBJbnN0cnVjdGlvbiBGbGFncyBhbmQgRGVzY3JpcHRpb24KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK25hbWVzcGFjZSBNQ0lEIHsKKy8vLyBcYnJpZWYgVGhlc2Ugc2hvdWxkIGJlIGNvbnNpZGVyZWQgcHJpdmF0ZSB0byB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlCisvLy8gTUNJbnN0ckRlc2MgY2xhc3MuICBDbGllbnRzIHNob3VsZCB1c2UgdGhlIHByZWRpY2F0ZSBtZXRob2RzIG9uIE1DSW5zdHJEZXNjLAorLy8vIG5vdCB1c2UgdGhlc2UgZGlyZWN0bHkuICBUaGVzZSBhbGwgY29ycmVzcG9uZCB0byBiaXRmaWVsZHMgaW4gdGhlCisvLy8gTUNJbnN0ckRlc2M6OkZsYWdzIGZpZWxkLgorZW51bSBGbGFnIHsKKyAgVmFyaWFkaWMgPSAwLAorICBIYXNPcHRpb25hbERlZiwKKyAgUHNldWRvLAorICBSZXR1cm4sCisgIENhbGwsCisgIEJhcnJpZXIsCisgIFRlcm1pbmF0b3IsCisgIEJyYW5jaCwKKyAgSW5kaXJlY3RCcmFuY2gsCisgIENvbXBhcmUsCisgIE1vdmVJbW0sCisgIEJpdGNhc3QsCisgIFNlbGVjdCwKKyAgRGVsYXlTbG90LAorICBGb2xkYWJsZUFzTG9hZCwKKyAgTWF5TG9hZCwKKyAgTWF5U3RvcmUsCisgIFByZWRpY2FibGUsCisgIE5vdER1cGxpY2FibGUsCisgIFVubW9kZWxlZFNpZGVFZmZlY3RzLAorICBDb21tdXRhYmxlLAorICBDb252ZXJ0aWJsZVRvM0FkZHIsCisgIFVzZXNDdXN0b21JbnNlcnRlciwKKyAgSGFzUG9zdElTZWxIb29rLAorICBSZW1hdGVyaWFsaXphYmxlLAorICBDaGVhcEFzQU1vdmUsCisgIEV4dHJhU3JjUmVnQWxsb2NSZXEsCisgIEV4dHJhRGVmUmVnQWxsb2NSZXEsCisgIFJlZ1NlcXVlbmNlLAorICBFeHRyYWN0U3VicmVnLAorICBJbnNlcnRTdWJyZWcsCisgIENvbnZlcmdlbnQsCisgIEFkZAorfTsKK30KKworLy8vIFxicmllZiBEZXNjcmliZSBwcm9wZXJ0aWVzIHRoYXQgYXJlIHRydWUgb2YgZWFjaCBpbnN0cnVjdGlvbiBpbiB0aGUgdGFyZ2V0CisvLy8gZGVzY3JpcHRpb24gZmlsZS4gIFRoaXMgY2FwdHVyZXMgaW5mb3JtYXRpb24gYWJvdXQgc2lkZSBlZmZlY3RzLCByZWdpc3RlcgorLy8vIHVzZSBhbmQgbWFueSBvdGhlciB0aGluZ3MuICBUaGVyZSBpcyBvbmUgaW5zdGFuY2Ugb2YgdGhpcyBzdHJ1Y3QgZm9yIGVhY2gKKy8vLyB0YXJnZXQgaW5zdHJ1Y3Rpb24gY2xhc3MsIGFuZCB0aGUgTWFjaGluZUluc3RyIGNsYXNzIHBvaW50cyB0byB0aGlzIHN0cnVjdAorLy8vIGRpcmVjdGx5IHRvIGRlc2NyaWJlIGl0c2VsZi4KK2NsYXNzIE1DSW5zdHJEZXNjIHsKK3B1YmxpYzoKKyAgdW5zaWduZWQgc2hvcnQgT3Bjb2RlOyAgICAgICAgIC8vIFRoZSBvcGNvZGUgbnVtYmVyCisgIHVuc2lnbmVkIHNob3J0IE51bU9wZXJhbmRzOyAgICAvLyBOdW0gb2YgYXJncyAobWF5IGJlIG1vcmUgaWYgdmFyaWFibGVfb3BzKQorICB1bnNpZ25lZCBjaGFyIE51bURlZnM7ICAgICAgICAgLy8gTnVtIG9mIGFyZ3MgdGhhdCBhcmUgZGVmaW5pdGlvbnMKKyAgdW5zaWduZWQgY2hhciBTaXplOyAgICAgICAgICAgIC8vIE51bWJlciBvZiBieXRlcyBpbiBlbmNvZGluZy4KKyAgdW5zaWduZWQgc2hvcnQgU2NoZWRDbGFzczsgICAgIC8vIGVudW0gaWRlbnRpZnlpbmcgaW5zdHIgc2NoZWQgY2xhc3MKKyAgdWludDY0X3QgRmxhZ3M7ICAgICAgICAgICAgICAgIC8vIEZsYWdzIGlkZW50aWZ5aW5nIG1hY2hpbmUgaW5zdHIgY2xhc3MKKyAgdWludDY0X3QgVFNGbGFnczsgICAgICAgICAgICAgIC8vIFRhcmdldCBTcGVjaWZpYyBGbGFnIHZhbHVlcworICBjb25zdCBNQ1BoeXNSZWcgKkltcGxpY2l0VXNlczsgLy8gUmVnaXN0ZXJzIGltcGxpY2l0bHkgcmVhZCBieSB0aGlzIGluc3RyCisgIGNvbnN0IE1DUGh5c1JlZyAqSW1wbGljaXREZWZzOyAvLyBSZWdpc3RlcnMgaW1wbGljaXRseSBkZWZpbmVkIGJ5IHRoaXMgaW5zdHIKKyAgY29uc3QgTUNPcGVyYW5kSW5mbyAqT3BJbmZvOyAgIC8vICdOdW1PcGVyYW5kcycgZW50cmllcyBhYm91dCBvcGVyYW5kcworICAvLyBTdWJ0YXJnZXQgZmVhdHVyZSB0aGF0IHRoaXMgaXMgZGVwcmVjYXRlZCBvbiwgaWYgYW55CisgIC8vIC0xIGltcGxpZXMgdGhpcyBpcyBub3QgZGVwcmVjYXRlZCBieSBhbnkgc2luZ2xlIGZlYXR1cmUuIEl0IG1heSBzdGlsbCBiZQorICAvLyBkZXByZWNhdGVkIGR1ZSB0byBhICJjb21wbGV4IiByZWFzb24sIGJlbG93LgorICBpbnQ2NF90IERlcHJlY2F0ZWRGZWF0dXJlOworCisgIC8vIEEgY29tcGxleCBtZXRob2QgdG8gZGV0ZXJtaW5lIGlzIGEgY2VydGFpbiBpcyBkZXByZWNhdGVkIG9yIG5vdCwgYW5kIHJldHVybgorICAvLyB0aGUgcmVhc29uIGZvciBkZXByZWNhdGlvbi4KKyAgYm9vbCAoKkNvbXBsZXhEZXByZWNhdGlvbkluZm8pKE1DSW5zdCAmLCBjb25zdCBNQ1N1YnRhcmdldEluZm8gJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICYpOworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHNwZWNpZmljIGNvbnN0cmFpbnQgaWYKKyAgLy8vIGl0IGlzIHNldC4gUmV0dXJucyAtMSBpZiBpdCBpcyBub3Qgc2V0LgorICBpbnQgZ2V0T3BlcmFuZENvbnN0cmFpbnQodW5zaWduZWQgT3BOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ09JOjpPcGVyYW5kQ29uc3RyYWludCBDb25zdHJhaW50KSBjb25zdCB7CisgICAgaWYgKE9wTnVtIDwgTnVtT3BlcmFuZHMgJiYKKyAgICAgICAgKE9wSW5mb1tPcE51bV0uQ29uc3RyYWludHMgJiAoMSA8PCBDb25zdHJhaW50KSkpIHsKKyAgICAgIHVuc2lnbmVkIFBvcyA9IDE2ICsgQ29uc3RyYWludCAqIDQ7CisgICAgICByZXR1cm4gKGludCkoT3BJbmZvW09wTnVtXS5Db25zdHJhaW50cyA+PiBQb3MpICYgMHhmOworICAgIH0KKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBhIGNlcnRhaW4gaW5zdHJ1Y3Rpb24gaXMgZGVwcmVjYXRlZCBhbmQgaWYgc28KKyAgLy8vIHJldHVybnMgdGhlIHJlYXNvbiBpbiBccCBJbmZvLgorICBib29sIGdldERlcHJlY2F0ZWRJbmZvKE1DSW5zdCAmTUksIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU1RJLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZJbmZvKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgb3Bjb2RlIG51bWJlciBmb3IgdGhpcyBkZXNjcmlwdG9yLgorICB1bnNpZ25lZCBnZXRPcGNvZGUoKSBjb25zdCB7IHJldHVybiBPcGNvZGU7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGRlY2xhcmVkIE1hY2hpbmVPcGVyYW5kcyBmb3IgdGhpcworICAvLy8gTWFjaGluZUluc3RydWN0aW9uLiAgTm90ZSB0aGF0IHZhcmlhZGljIChpc1ZhcmlhZGljKCkgcmV0dXJucyB0cnVlKQorICAvLy8gaW5zdHJ1Y3Rpb25zIG1heSBoYXZlIGFkZGl0aW9uYWwgb3BlcmFuZHMgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCwgYW5kIG5vdGUKKyAgLy8vIHRoYXQgdGhlIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gbWF5IGluY2x1ZGUgaW1wbGljaXQgcmVnaXN0ZXIgZGVmL3VzZXMgYXMKKyAgLy8vIHdlbGwuCisgIHVuc2lnbmVkIGdldE51bU9wZXJhbmRzKCkgY29uc3QgeyByZXR1cm4gTnVtT3BlcmFuZHM7IH0KKworICB1c2luZyBjb25zdF9vcEluZm9faXRlcmF0b3IgPSBjb25zdCBNQ09wZXJhbmRJbmZvICo7CisKKyAgY29uc3Rfb3BJbmZvX2l0ZXJhdG9yIG9wSW5mb19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIE9wSW5mbzsgfQorICBjb25zdF9vcEluZm9faXRlcmF0b3Igb3BJbmZvX2VuZCgpIGNvbnN0IHsgcmV0dXJuIE9wSW5mbyArIE51bU9wZXJhbmRzOyB9CisKKyAgaXRlcmF0b3JfcmFuZ2U8Y29uc3Rfb3BJbmZvX2l0ZXJhdG9yPiBvcGVyYW5kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShvcEluZm9fYmVnaW4oKSwgb3BJbmZvX2VuZCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgTWFjaGluZU9wZXJhbmRzIHRoYXQgYXJlIHJlZ2lzdGVyCisgIC8vLyBkZWZpbml0aW9ucy4gIFJlZ2lzdGVyIGRlZmluaXRpb25zIGFsd2F5cyBvY2N1ciBhdCB0aGUgc3RhcnQgb2YgdGhlCisgIC8vLyBtYWNoaW5lIG9wZXJhbmQgbGlzdC4gIFRoaXMgaXMgdGhlIG51bWJlciBvZiAib3V0cyIgaW4gdGhlIC50ZCBmaWxlLAorICAvLy8gYW5kIGRvZXMgbm90IGluY2x1ZGUgaW1wbGljaXQgZGVmcy4KKyAgdW5zaWduZWQgZ2V0TnVtRGVmcygpIGNvbnN0IHsgcmV0dXJuIE51bURlZnM7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiBmbGFncyBvZiB0aGlzIGluc3RydWN0aW9uLgorICB1aW50NjRfdCBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIEZsYWdzOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGNhbiBoYXZlIGEgdmFyaWFibGUgbnVtYmVyIG9mCisgIC8vLyBvcGVyYW5kcy4gIEluIHRoaXMgY2FzZSwgdGhlIHZhcmlhYmxlIG9wZXJhbmRzIHdpbGwgYmUgYWZ0ZXIgdGhlIG5vcm1hbAorICAvLy8gb3BlcmFuZHMgYnV0IGJlZm9yZSB0aGUgaW1wbGljaXQgZGVmaW5pdGlvbnMgYW5kIHVzZXMgKGlmIGFueSBhcmUKKyAgLy8vIHByZXNlbnQpLgorICBib29sIGlzVmFyaWFkaWMoKSBjb25zdCB7IHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6OlZhcmlhZGljKTsgfQorCisgIC8vLyBcYnJpZWYgU2V0IGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaGFzIGFuIG9wdGlvbmFsIGRlZmluaXRpb24sIGUuZy4KKyAgLy8vIEFSTSBpbnN0cnVjdGlvbnMgd2hpY2ggY2FuIHNldCBjb25kaXRpb24gY29kZSBpZiAncycgYml0IGlzIHNldC4KKyAgYm9vbCBoYXNPcHRpb25hbERlZigpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6SGFzT3B0aW9uYWxEZWYpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgcHNldWRvIGluc3RydWN0aW9uIHRoYXQgZG9lc24ndAorICAvLy8gY29ycmVzcG9uZCB0byBhIHJlYWwgbWFjaGluZSBpbnN0cnVjdGlvbi4KKyAgYm9vbCBpc1BzZXVkbygpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6UHNldWRvKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIGEgcmV0dXJuLgorICBib29sIGlzUmV0dXJuKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpSZXR1cm4pOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgaW5zdHJ1Y3Rpb24gaXMgYW4gYWRkIGluc3RydWN0aW9uLgorICBib29sIGlzQWRkKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpBZGQpOyB9CisKKyAgLy8vIFxicmllZiAgUmV0dXJuIHRydWUgaWYgdGhlIGluc3RydWN0aW9uIGlzIGEgY2FsbC4KKyAgYm9vbCBpc0NhbGwoKSBjb25zdCB7IHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6OkNhbGwpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBzdG9wcyBjb250cm9sIGZsb3cKKyAgLy8vIGZyb20gZXhlY3V0aW5nIHRoZSBpbnN0cnVjdGlvbiBpbW1lZGlhdGVseSBmb2xsb3dpbmcgaXQuICBFeGFtcGxlcyBpbmNsdWRlCisgIC8vLyB1bmNvbmRpdGlvbmFsIGJyYW5jaGVzIGFuZCByZXR1cm4gaW5zdHJ1Y3Rpb25zLgorICBib29sIGlzQmFycmllcigpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6QmFycmllcik7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIHBhcnQgb2YgdGhlIHRlcm1pbmF0b3IgZm9yCisgIC8vLyBhIGJhc2ljIGJsb2NrLiAgVHlwaWNhbGx5IHRoaXMgaXMgdGhpbmdzIGxpa2UgcmV0dXJuIGFuZCBicmFuY2gKKyAgLy8vIGluc3RydWN0aW9ucy4KKyAgLy8vCisgIC8vLyBWYXJpb3VzIHBhc3NlcyB1c2UgdGhpcyB0byBpbnNlcnQgY29kZSBpbnRvIHRoZSBib3R0b20gb2YgYSBiYXNpYyBibG9jaywKKyAgLy8vIGJ1dCBiZWZvcmUgY29udHJvbCBmbG93IG9jY3Vycy4KKyAgYm9vbCBpc1Rlcm1pbmF0b3IoKSBjb25zdCB7IHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6OlRlcm1pbmF0b3IpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIGNvbmRpdGlvbmFsLCB1bmNvbmRpdGlvbmFsLCBvcgorICAvLy8gaW5kaXJlY3QgYnJhbmNoLiAgUHJlZGljYXRlcyBiZWxvdyBjYW4gYmUgdXNlZCB0byBkaXNjcmltaW5hdGUgYmV0d2VlbgorICAvLy8gdGhlc2UgY2FzZXMsIGFuZCB0aGUgVGFyZ2V0SW5zdHJJbmZvOjpBbmFseXplQnJhbmNoIG1ldGhvZCBjYW4gYmUgdXNlZCB0bworICAvLy8gZ2V0IG1vcmUgaW5mb3JtYXRpb24uCisgIGJvb2wgaXNCcmFuY2goKSBjb25zdCB7IHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6OkJyYW5jaCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYW4gaW5kaXJlY3QgYnJhbmNoLCBzdWNoIGFzIGEKKyAgLy8vIGJyYW5jaCB0aHJvdWdoIGEgcmVnaXN0ZXIuCisgIGJvb2wgaXNJbmRpcmVjdEJyYW5jaCgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6SW5kaXJlY3RCcmFuY2gpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgYnJhbmNoIHdoaWNoIG1heSBmYWxsCisgIC8vLyB0aHJvdWdoIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uIG9yIG1heSB0cmFuc2ZlciBjb250cm9sIGZsb3cgdG8gc29tZSBvdGhlcgorICAvLy8gYmxvY2suICBUaGUgVGFyZ2V0SW5zdHJJbmZvOjpBbmFseXplQnJhbmNoIG1ldGhvZCBjYW4gYmUgdXNlZCB0byBnZXQgbW9yZQorICAvLy8gaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBicmFuY2guCisgIGJvb2wgaXNDb25kaXRpb25hbEJyYW5jaCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNCcmFuY2goKSAmICFpc0JhcnJpZXIoKSAmICFpc0luZGlyZWN0QnJhbmNoKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSBicmFuY2ggd2hpY2ggYWx3YXlzCisgIC8vLyB0cmFuc2ZlcnMgY29udHJvbCBmbG93IHRvIHNvbWUgb3RoZXIgYmxvY2suICBUaGUKKyAgLy8vIFRhcmdldEluc3RySW5mbzo6QW5hbHl6ZUJyYW5jaCBtZXRob2QgY2FuIGJlIHVzZWQgdG8gZ2V0IG1vcmUgaW5mb3JtYXRpb24KKyAgLy8vIGFib3V0IHRoaXMgYnJhbmNoLgorICBib29sIGlzVW5jb25kaXRpb25hbEJyYW5jaCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNCcmFuY2goKSAmIGlzQmFycmllcigpICYgIWlzSW5kaXJlY3RCcmFuY2goKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIGJyYW5jaCBvciBhbiBpbnN0cnVjdGlvbiB3aGljaCBkaXJlY3RseQorICAvLy8gd3JpdGVzIHRvIHRoZSBwcm9ncmFtIGNvdW50ZXIuIENvbnNpZGVyZWQgJ21heScgYWZmZWN0IHJhdGhlciB0aGFuCisgIC8vLyAnZG9lcycgYWZmZWN0IGFzIHRoaW5ncyBsaWtlIHByZWRpY2F0aW9uIGFyZSBub3QgdGFrZW4gaW50byBhY2NvdW50LgorICBib29sIG1heUFmZmVjdENvbnRyb2xGbG93KGNvbnN0IE1DSW5zdCAmTUksIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICZSSSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGhhcyBhIHByZWRpY2F0ZSBvcGVyYW5kCisgIC8vLyB0aGF0IGNvbnRyb2xzIGV4ZWN1dGlvbi4gSXQgbWF5IGJlIHNldCB0byAnYWx3YXlzJywgb3IgbWF5IGJlIHNldCB0byBvdGhlcgorICAvLy8gdmFsdWVzLiBUaGVyZSBhcmUgdmFyaW91cyBtZXRob2RzIGluIFRhcmdldEluc3RySW5mbyB0aGF0IGNhbiBiZSB1c2VkIHRvCisgIC8vLyBjb250cm9sIGFuZCBtb2RpZnkgdGhlIHByZWRpY2F0ZSBpbiB0aGlzIGluc3RydWN0aW9uLgorICBib29sIGlzUHJlZGljYWJsZSgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6UHJlZGljYWJsZSk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgYSBjb21wYXJpc29uLgorICBib29sIGlzQ29tcGFyZSgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6Q29tcGFyZSk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgYSBtb3ZlIGltbWVkaWF0ZQorICAvLy8gKGluY2x1ZGluZyBjb25kaXRpb25hbCBtb3ZlcykgaW5zdHJ1Y3Rpb24uCisgIGJvb2wgaXNNb3ZlSW1tZWRpYXRlKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpNb3ZlSW1tKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBpcyBhIGJpdGNhc3QgaW5zdHJ1Y3Rpb24uCisgIGJvb2wgaXNCaXRjYXN0KCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpCaXRjYXN0KTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHNlbGVjdCBpbnN0cnVjdGlvbi4KKyAgYm9vbCBpc1NlbGVjdCgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6U2VsZWN0KTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBjYW5ub3QgYmUgc2FmZWx5CisgIC8vLyBkdXBsaWNhdGVkLiAgRm9yIGV4YW1wbGUsIGlmIHRoZSBpbnN0cnVjdGlvbiBoYXMgYSB1bmlxdWUgbGFiZWxzIGF0dGFjaGVkCisgIC8vLyB0byBpdCwgZHVwbGljYXRpbmcgaXQgd291bGQgY2F1c2UgbXVsdGlwbGUgZGVmaW5pdGlvbiBlcnJvcnMuCisgIGJvb2wgaXNOb3REdXBsaWNhYmxlKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpOb3REdXBsaWNhYmxlKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gaGFzIGEgZGVsYXkgc2xvdCB3aGljaAorICAvLy8gbXVzdCBiZSBmaWxsZWQgYnkgdGhlIGNvZGUgZ2VuZXJhdG9yLgorICBib29sIGhhc0RlbGF5U2xvdCgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6RGVsYXlTbG90KTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgZm9yIGluc3RydWN0aW9ucyB0aGF0IGNhbiBiZSBmb2xkZWQgYXMgbWVtb3J5IG9wZXJhbmRzCisgIC8vLyBpbiBvdGhlciBpbnN0cnVjdGlvbnMuIFRoZSBtb3N0IGNvbW1vbiB1c2UgZm9yIHRoaXMgaXMgaW5zdHJ1Y3Rpb25zIHRoYXQKKyAgLy8vIGFyZSBzaW1wbGUgbG9hZHMgZnJvbSBtZW1vcnkgdGhhdCBkb24ndCBtb2RpZnkgdGhlIGxvYWRlZCB2YWx1ZSBpbiBhbnkKKyAgLy8vIHdheSwgYnV0IGl0IGNhbiBhbHNvIGJlIHVzZWQgZm9yIGluc3RydWN0aW9ucyB0aGF0IGNhbiBiZSBleHByZXNzZWQgYXMKKyAgLy8vIGNvbnN0YW50LXBvb2wgbG9hZHMsIHN1Y2ggYXMgVl9TRVRBTExPTkVTIG9uIHg4NiwgdG8gYWxsb3cgdGhlbSB0byBiZQorICAvLy8gZm9sZGVkIHdoZW4gaXQgaXMgYmVuZWZpY2lhbC4gIFRoaXMgc2hvdWxkIG9ubHkgYmUgc2V0IG9uIGluc3RydWN0aW9ucworICAvLy8gdGhhdCByZXR1cm4gYSB2YWx1ZSBpbiB0aGVpciBvbmx5IHZpcnR1YWwgcmVnaXN0ZXIgZGVmaW5pdGlvbi4KKyAgYm9vbCBjYW5Gb2xkQXNMb2FkKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpGb2xkYWJsZUFzTG9hZCk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gYmVoYXZlcworICAvLy8gdGhlIHNhbWUgd2F5IGFzIHRoZSBnZW5lcmljIFJFR19TRVFVRU5DRSBpbnN0cnVjdGlvbnMuCisgIC8vLyBFLmcuLCBvbiBBUk0sCisgIC8vLyBkWCBWTU9WRFJSIHJZLCByWgorICAvLy8gaXMgZXF1aXZhbGVudCB0bworICAvLy8gZFggPSBSRUdfU0VRVUVOQ0UgclksIHNzdWJfMCwgclosIHNzdWJfMS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgZm9yIHRoZSBvcHRpbWl6ZXJzIHRvIGJlIGFibGUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YKKyAgLy8vIHRoaXMgcHJvcGVydHksIFRhcmdldEluc3RySW5mbzo6Z2V0UmVnU2VxdWVuY2VMaWtlSW5wdXRzIGhhcyB0byBiZQorICAvLy8gb3ZlcnJpZGUgYWNjb3JkaW5nbHkuCisgIGJvb2wgaXNSZWdTZXF1ZW5jZUxpa2UoKSBjb25zdCB7IHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6OlJlZ1NlcXVlbmNlKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBiZWhhdmVzCisgIC8vLyB0aGUgc2FtZSB3YXkgYXMgdGhlIGdlbmVyaWMgRVhUUkFDVF9TVUJSRUcgaW5zdHJ1Y3Rpb25zLgorICAvLy8gRS5nLiwgb24gQVJNLAorICAvLy8gclgsIHJZIFZNT1ZSUkQgZFoKKyAgLy8vIGlzIGVxdWl2YWxlbnQgdG8gdHdvIEVYVFJBQ1RfU1VCUkVHOgorICAvLy8gclggPSBFWFRSQUNUX1NVQlJFRyBkWiwgc3N1Yl8wCisgIC8vLyByWSA9IEVYVFJBQ1RfU1VCUkVHIGRaLCBzc3ViXzEKKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgZm9yIHRoZSBvcHRpbWl6ZXJzIHRvIGJlIGFibGUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YKKyAgLy8vIHRoaXMgcHJvcGVydHksIFRhcmdldEluc3RySW5mbzo6Z2V0RXh0cmFjdFN1YnJlZ0xpa2VJbnB1dHMgaGFzIHRvIGJlCisgIC8vLyBvdmVycmlkZSBhY2NvcmRpbmdseS4KKyAgYm9vbCBpc0V4dHJhY3RTdWJyZWdMaWtlKCkgY29uc3QgeworICAgIHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6OkV4dHJhY3RTdWJyZWcpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGJlaGF2ZXMKKyAgLy8vIHRoZSBzYW1lIHdheSBhcyB0aGUgZ2VuZXJpYyBJTlNFUlRfU1VCUkVHIGluc3RydWN0aW9ucy4KKyAgLy8vIEUuZy4sIG9uIEFSTSwKKyAgLy8vIGRYID0gVlNFVExOaTMyIGRZLCByWiwgSW1tCisgIC8vLyBpcyBlcXVpdmFsZW50IHRvIGEgSU5TRVJUX1NVQlJFRzoKKyAgLy8vIGRYID0gSU5TRVJUX1NVQlJFRyBkWSwgclosIHRyYW5zbGF0ZUltbVRvU3ViSWR4KEltbSkKKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgZm9yIHRoZSBvcHRpbWl6ZXJzIHRvIGJlIGFibGUgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YKKyAgLy8vIHRoaXMgcHJvcGVydHksIFRhcmdldEluc3RySW5mbzo6Z2V0SW5zZXJ0U3VicmVnTGlrZUlucHV0cyBoYXMgdG8gYmUKKyAgLy8vIG92ZXJyaWRlIGFjY29yZGluZ2x5LgorICBib29sIGlzSW5zZXJ0U3VicmVnTGlrZSgpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6SW5zZXJ0U3VicmVnKTsgfQorCisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGlzIGNvbnZlcmdlbnQuCisgIC8vLworICAvLy8gQ29udmVyZ2VudCBpbnN0cnVjdGlvbnMgbWF5IG5vdCBiZSBtYWRlIGNvbnRyb2wtZGVwZW5kZW50IG9uIGFueQorICAvLy8gYWRkaXRpb25hbCB2YWx1ZXMuCisgIGJvb2wgaXNDb252ZXJnZW50KCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpDb252ZXJnZW50KTsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBTaWRlIEVmZmVjdCBBbmFseXNpcworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gY291bGQgcG9zc2libHkgcmVhZCBtZW1vcnkuCisgIC8vLyBJbnN0cnVjdGlvbnMgd2l0aCB0aGlzIGZsYWcgc2V0IGFyZSBub3QgbmVjZXNzYXJpbHkgc2ltcGxlIGxvYWQKKyAgLy8vIGluc3RydWN0aW9ucywgdGhleSBtYXkgbG9hZCBhIHZhbHVlIGFuZCBtb2RpZnkgaXQsIGZvciBleGFtcGxlLgorICBib29sIG1heUxvYWQoKSBjb25zdCB7IHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6Ok1heUxvYWQpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIGNvdWxkIHBvc3NpYmx5IG1vZGlmeSBtZW1vcnkuCisgIC8vLyBJbnN0cnVjdGlvbnMgd2l0aCB0aGlzIGZsYWcgc2V0IGFyZSBub3QgbmVjZXNzYXJpbHkgc2ltcGxlIHN0b3JlCisgIC8vLyBpbnN0cnVjdGlvbnMsIHRoZXkgbWF5IHN0b3JlIGEgbW9kaWZpZWQgdmFsdWUgYmFzZWQgb24gdGhlaXIgb3BlcmFuZHMsIG9yCisgIC8vLyBtYXkgbm90IGFjdHVhbGx5IG1vZGlmeSBhbnl0aGluZywgZm9yIGV4YW1wbGUuCisgIGJvb2wgbWF5U3RvcmUoKSBjb25zdCB7IHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6Ok1heVN0b3JlKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBoYXMgc2lkZQorICAvLy8gZWZmZWN0cyB0aGF0IGFyZSBub3QgbW9kZWxlZCBieSBvdGhlciBmbGFncy4gIFRoaXMgZG9lcyBub3QgcmV0dXJuIHRydWUKKyAgLy8vIGZvciBpbnN0cnVjdGlvbnMgd2hvc2UgZWZmZWN0cyBhcmUgY2FwdHVyZWQgYnk6CisgIC8vLworICAvLy8gIDEuIFRoZWlyIG9wZXJhbmQgbGlzdCBhbmQgaW1wbGljaXQgZGVmaW5pdGlvbi91c2UgbGlzdC4gIFJlZ2lzdGVyIHVzZS9kZWYKKyAgLy8vICAgICBpbmZvIGlzIGV4cGxpY2l0IGZvciBpbnN0cnVjdGlvbnMuCisgIC8vLyAgMi4gTWVtb3J5IGFjY2Vzc2VzLiAgVXNlIG1heUxvYWQvbWF5U3RvcmUuCisgIC8vLyAgMy4gQ2FsbGluZywgYnJhbmNoaW5nLCByZXR1cm5pbmc6IHVzZSBpc0NhbGwvaXNSZXR1cm4vaXNCcmFuY2guCisgIC8vLworICAvLy8gRXhhbXBsZXMgb2Ygc2lkZSBlZmZlY3RzIHdvdWxkIGJlIG1vZGlmeWluZyAnaW52aXNpYmxlJyBtYWNoaW5lIHN0YXRlIGxpa2UKKyAgLy8vIGEgY29udHJvbCByZWdpc3RlciwgZmx1c2hpbmcgYSBjYWNoZSwgbW9kaWZ5aW5nIGEgcmVnaXN0ZXIgaW52aXNpYmxlIHRvCisgIC8vLyBMTFZNLCBldGMuCisgIGJvb2wgaGFzVW5tb2RlbGVkU2lkZUVmZmVjdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6VW5tb2RlbGVkU2lkZUVmZmVjdHMpOworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIEZsYWdzIHRoYXQgaW5kaWNhdGUgd2hldGhlciBhbiBpbnN0cnVjdGlvbiBjYW4gYmUgbW9kaWZpZWQgYnkgYSBtZXRob2QuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBtYXkgYmUgYSAyLSBvciAzLWFkZHJlc3MgaW5zdHJ1Y3Rpb24gKG9mIHRoZQorICAvLy8gZm9ybSAiWCA9IG9wIFksIFosIC4uLiIpLCB3aGljaCBwcm9kdWNlcyB0aGUgc2FtZSByZXN1bHQgaWYgWSBhbmQgWiBhcmUKKyAgLy8vIGV4Y2hhbmdlZC4gIElmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZW4gdGhlCisgIC8vLyBUYXJnZXRJbnN0ckluZm86OmNvbW11dGVJbnN0cnVjdGlvbiBtZXRob2QgbWF5IGJlIHVzZWQgdG8gaGFjayBvbiB0aGUKKyAgLy8vIGluc3RydWN0aW9uLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGZsYWcgbWF5IGJlIHNldCBvbiBpbnN0cnVjdGlvbnMgdGhhdCBhcmUgb25seSBjb21tdXRhYmxlCisgIC8vLyBzb21ldGltZXMuICBJbiB0aGVzZSBjYXNlcywgdGhlIGNhbGwgdG8gY29tbXV0ZUluc3RydWN0aW9uIHdpbGwgZmFpbC4KKyAgLy8vIEFsc28gbm90ZSB0aGF0IHNvbWUgaW5zdHJ1Y3Rpb25zIHJlcXVpcmUgbm9uLXRyaXZpYWwgbW9kaWZpY2F0aW9uIHRvCisgIC8vLyBjb21tdXRlIHRoZW0uCisgIGJvb2wgaXNDb21tdXRhYmxlKCkgY29uc3QgeyByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpDb21tdXRhYmxlKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIDItYWRkcmVzcyBpbnN0cnVjdGlvbiB3aGljaCBjYW4gYmUgY2hhbmdlZAorICAvLy8gaW50byBhIDMtYWRkcmVzcyBpbnN0cnVjdGlvbiBpZiBuZWVkZWQuICBEb2luZyB0aGlzIHRyYW5zZm9ybWF0aW9uIGNhbiBiZQorICAvLy8gcHJvZml0YWJsZSBpbiB0aGUgcmVnaXN0ZXIgYWxsb2NhdG9yLCBiZWNhdXNlIGl0IG1lYW5zIHRoYXQgdGhlCisgIC8vLyBpbnN0cnVjdGlvbiBjYW4gdXNlIGEgMi1hZGRyZXNzIGZvcm0gaWYgcG9zc2libGUsIGJ1dCBkZWdyYWRlIGludG8gYSBsZXNzCisgIC8vLyBlZmZpY2llbnQgZm9ybSBpZiB0aGUgc291cmNlIGFuZCBkZXN0IHJlZ2lzdGVyIGNhbm5vdCBiZSBhc3NpZ25lZCB0byB0aGUKKyAgLy8vIHNhbWUgcmVnaXN0ZXIuICBGb3IgZXhhbXBsZSwgdGhpcyBhbGxvd3MgdGhlIHg4NiBiYWNrZW5kIHRvIHR1cm4gYSAic2hsCisgIC8vLyByZWcsIDMiIGluc3RydWN0aW9uIGludG8gYW4gTEVBIGluc3RydWN0aW9uLCB3aGljaCBpcyB0aGUgc2FtZSBzcGVlZCBhcworICAvLy8gdGhlIHNoaWZ0IGJ1dCBoYXMgYmlnZ2VyIGNvZGUgc2l6ZS4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIHJldHVybnMgdHJ1ZSwgdGhlbiB0aGUgdGFyZ2V0IG11c3QgaW1wbGVtZW50IHRoZQorICAvLy8gVGFyZ2V0SW5zdHJJbmZvOjpjb252ZXJ0VG9UaHJlZUFkZHJlc3MgbWV0aG9kIGZvciB0aGlzIGluc3RydWN0aW9uLCB3aGljaAorICAvLy8gaXMgYWxsb3dlZCB0byBmYWlsIGlmIHRoZSB0cmFuc2Zvcm1hdGlvbiBpc24ndCB2YWxpZCBmb3IgdGhpcyBzcGVjaWZpYworICAvLy8gaW5zdHJ1Y3Rpb24gKGUuZy4gc2hsIHJlZywgNCBvbiB4ODYpLgorICAvLy8KKyAgYm9vbCBpc0NvbnZlcnRpYmxlVG8zQWRkcigpIGNvbnN0IHsKKyAgICByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpDb252ZXJ0aWJsZVRvM0FkZHIpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIHJlcXVpcmVzIGN1c3RvbSBpbnNlcnRpb24gc3VwcG9ydAorICAvLy8gd2hlbiB0aGUgREFHIHNjaGVkdWxlciBpcyBpbnNlcnRpbmcgaXQgaW50byBhIG1hY2hpbmUgYmFzaWMgYmxvY2suICBJZgorICAvLy8gdGhpcyBpcyB0cnVlIGZvciB0aGUgaW5zdHJ1Y3Rpb24sIGl0IGJhc2ljYWxseSBtZWFucyB0aGF0IGl0IGlzIGEgcHNldWRvCisgIC8vLyBpbnN0cnVjdGlvbiB1c2VkIGF0IFNlbGVjdGlvbkRBRyB0aW1lIHRoYXQgaXMgZXhwYW5kZWQgb3V0IGludG8gbWFnaWMgY29kZQorICAvLy8gYnkgdGhlIHRhcmdldCB3aGVuIE1hY2hpbmVJbnN0cnMgYXJlIGZvcm1lZC4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIGlzIHRydWUsIHRoZSBUYXJnZXRMb3dlcmluZ0luZm86Okluc2VydEF0RW5kT2ZCYXNpY0Jsb2NrIG1ldGhvZAorICAvLy8gaXMgdXNlZCB0byBpbnNlcnQgdGhpcyBpbnRvIHRoZSBNYWNoaW5lQmFzaWNCbG9jay4KKyAgYm9vbCB1c2VzQ3VzdG9tSW5zZXJ0aW9uSG9vaygpIGNvbnN0IHsKKyAgICByZXR1cm4gRmxhZ3MgJiAoMVVMTCA8PCBNQ0lEOjpVc2VzQ3VzdG9tSW5zZXJ0ZXIpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIHJlcXVpcmVzICphZGp1c3RtZW50KiBhZnRlcgorICAvLy8gaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIGJ5IGNhbGxpbmcgYSB0YXJnZXQgaG9vay4gRm9yIGV4YW1wbGUsIHRoaXMgY2FuIGJlCisgIC8vLyB1c2VkIHRvIGZpbGwgaW4gQVJNICdzJyBvcHRpb25hbCBvcGVyYW5kIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZQorICAvLy8gY29uZGl0aW9uYWwgZmxhZyByZWdpc3RlciBpcyB1c2VkLgorICBib29sIGhhc1Bvc3RJU2VsSG9vaygpIGNvbnN0IHsgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6SGFzUG9zdElTZWxIb29rKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaXMgYSBjYW5kaWRhdGUgZm9yIHJlbWF0LiBUaGlzCisgIC8vLyBmbGFnIGlzIG9ubHkgdXNlZCBpbiBUYXJnZXRJbnN0ckluZm8gbWV0aG9kIGlzVHJpdmlhbGx5UmVtYXRlcmlhbGl6YWJsZS4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgaXNSZWFsbHlUcml2aWFsbHlSZU1hdGVyaWFsaXphYmxlKCkKKyAgLy8vIG9yIGlzUmVhbGx5VHJpdmlhbGx5UmVNYXRlcmlhbGl6YWJsZUdlbmVyaWMgbWV0aG9kcyBhcmUgY2FsbGVkIHRvIHZlcmlmeQorICAvLy8gdGhlIGluc3RydWN0aW9uIGlzIHJlYWxseSByZW1hdGFibGUuCisgIGJvb2wgaXNSZW1hdGVyaWFsaXphYmxlKCkgY29uc3QgeworICAgIHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6OlJlbWF0ZXJpYWxpemFibGUpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBoYXMgdGhlIHNhbWUgY29zdCAob3IgbGVzcykgdGhhbiBhCisgIC8vLyBtb3ZlIGluc3RydWN0aW9uLiBUaGlzIGlzIHVzZWZ1bCBkdXJpbmcgY2VydGFpbiB0eXBlcyBvZiBvcHRpbWl6YXRpb25zCisgIC8vLyAoZS5nLiwgcmVtYXQgZHVyaW5nIHR3by1hZGRyZXNzIGNvbnZlcnNpb24gb3IgbWFjaGluZSBsaWNtKSB3aGVyZSB3ZSB3b3VsZAorICAvLy8gbGlrZSB0byByZW1hdCBvciBob2lzdCB0aGUgaW5zdHJ1Y3Rpb24sIGJ1dCBub3QgaWYgaXQgY29zdHMgbW9yZSB0aGFuCisgIC8vLyBtb3ZpbmcgdGhlIGluc3RydWN0aW9uIGludG8gdGhlIGFwcHJvcHJpYXRlIHJlZ2lzdGVyLiBOb3RlLCB3ZSBhcmUgbm90CisgIC8vLyBtYXJraW5nIGNvcGllcyBmcm9tIGFuZCB0byB0aGUgc2FtZSByZWdpc3RlciBjbGFzcyB3aXRoIHRoaXMgZmxhZy4KKyAgLy8vCisgIC8vLyBUaGlzIG1ldGhvZCBjb3VsZCBiZSBjYWxsZWQgYnkgaW50ZXJmYWNlIFRhcmdldEluc3RySW5mbzo6aXNBc0NoZWFwQXNBTW92ZQorICAvLy8gZm9yIGRpZmZlcmVudCBzdWJ0YXJnZXRzLgorICBib29sIGlzQXNDaGVhcEFzQU1vdmUoKSBjb25zdCB7IHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6OkNoZWFwQXNBTW92ZSk7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGluc3RydWN0aW9uIHNvdXJjZSBvcGVyYW5kcyBoYXZlIHNwZWNpYWwKKyAgLy8vIHJlZ2lzdGVyIGFsbG9jYXRpb24gcmVxdWlyZW1lbnRzIHRoYXQgYXJlIG5vdCBjYXB0dXJlZCBieSB0aGUgb3BlcmFuZAorICAvLy8gcmVnaXN0ZXIgY2xhc3Nlcy4gZS5nLiBBUk06OlNUUkQncyB0d28gc291cmNlIHJlZ2lzdGVycyBtdXN0IGJlIGFuIGV2ZW4gLworICAvLy8gb2RkIHBhaXIsIEFSTTo6U1RNIHJlZ2lzdGVycyBoYXZlIHRvIGJlIGluIGFzY2VuZGluZyBvcmRlci4gIFBvc3QtcmVnaXN0ZXIKKyAgLy8vIGFsbG9jYXRpb24gcGFzc2VzIHNob3VsZCBub3QgYXR0ZW1wdCB0byBjaGFuZ2UgYWxsb2NhdGlvbnMgZm9yIHNvdXJjZXMgb2YKKyAgLy8vIGluc3RydWN0aW9ucyB3aXRoIHRoaXMgZmxhZy4KKyAgYm9vbCBoYXNFeHRyYVNyY1JlZ0FsbG9jUmVxKCkgY29uc3QgeworICAgIHJldHVybiBGbGFncyAmICgxVUxMIDw8IE1DSUQ6OkV4dHJhU3JjUmVnQWxsb2NSZXEpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBkZWYgb3BlcmFuZHMgaGF2ZSBzcGVjaWFsIHJlZ2lzdGVyCisgIC8vLyBhbGxvY2F0aW9uIHJlcXVpcmVtZW50cyB0aGF0IGFyZSBub3QgY2FwdHVyZWQgYnkgdGhlIG9wZXJhbmQgcmVnaXN0ZXIKKyAgLy8vIGNsYXNzZXMuIGUuZy4gQVJNOjpMRFJEJ3MgdHdvIGRlZiByZWdpc3RlcnMgbXVzdCBiZSBhbiBldmVuIC8gb2RkIHBhaXIsCisgIC8vLyBBUk06OkxETSByZWdpc3RlcnMgaGF2ZSB0byBiZSBpbiBhc2NlbmRpbmcgb3JkZXIuICBQb3N0LXJlZ2lzdGVyCisgIC8vLyBhbGxvY2F0aW9uIHBhc3NlcyBzaG91bGQgbm90IGF0dGVtcHQgdG8gY2hhbmdlIGFsbG9jYXRpb25zIGZvciBkZWZpbml0aW9ucworICAvLy8gb2YgaW5zdHJ1Y3Rpb25zIHdpdGggdGhpcyBmbGFnLgorICBib29sIGhhc0V4dHJhRGVmUmVnQWxsb2NSZXEoKSBjb25zdCB7CisgICAgcmV0dXJuIEZsYWdzICYgKDFVTEwgPDwgTUNJRDo6RXh0cmFEZWZSZWdBbGxvY1JlcSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBhIGxpc3Qgb2YgcmVnaXN0ZXJzIHRoYXQgYXJlIHBvdGVudGlhbGx5IHJlYWQgYnkgYW55CisgIC8vLyBpbnN0YW5jZSBvZiB0aGlzIG1hY2hpbmUgaW5zdHJ1Y3Rpb24uICBGb3IgZXhhbXBsZSwgb24gWDg2LCB0aGUgImFkYyIKKyAgLy8vIGluc3RydWN0aW9uIGFkZHMgdHdvIHJlZ2lzdGVyIG9wZXJhbmRzIGFuZCBhZGRzIHRoZSBjYXJyeSBiaXQgaW4gZnJvbSB0aGUKKyAgLy8vIGZsYWdzIHJlZ2lzdGVyLiAgSW4gdGhpcyBjYXNlLCB0aGUgaW5zdHJ1Y3Rpb24gaXMgbWFya2VkIGFzIGltcGxpY2l0bHkKKyAgLy8vIHJlYWRpbmcgdGhlIGZsYWdzLiAgTGlrZXdpc2UsIHRoZSB2YXJpYWJsZSBzaGlmdCBpbnN0cnVjdGlvbiBvbiBYODYgaXMKKyAgLy8vIG1hcmtlZCBhcyBpbXBsaWNpdGx5IHJlYWRpbmcgdGhlICdDTCcgcmVnaXN0ZXIsIHdoaWNoIGl0IGFsd2F5cyBkb2VzLgorICAvLy8KKyAgLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgbnVsbCBpZiB0aGUgaW5zdHJ1Y3Rpb24gaGFzIG5vIGltcGxpY2l0IHVzZXMuCisgIGNvbnN0IE1DUGh5c1JlZyAqZ2V0SW1wbGljaXRVc2VzKCkgY29uc3QgeyByZXR1cm4gSW1wbGljaXRVc2VzOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBpbXBsaWNpdCB1c2VzIHRoaXMgaW5zdHJ1Y3Rpb24gaGFzLgorICB1bnNpZ25lZCBnZXROdW1JbXBsaWNpdFVzZXMoKSBjb25zdCB7CisgICAgaWYgKCFJbXBsaWNpdFVzZXMpCisgICAgICByZXR1cm4gMDsKKyAgICB1bnNpZ25lZCBpID0gMDsKKyAgICBmb3IgKDsgSW1wbGljaXRVc2VzW2ldOyArK2kpIC8qZW1wdHkqLworICAgICAgOworICAgIHJldHVybiBpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSBsaXN0IG9mIHJlZ2lzdGVycyB0aGF0IGFyZSBwb3RlbnRpYWxseSB3cml0dGVuIGJ5IGFueQorICAvLy8gaW5zdGFuY2Ugb2YgdGhpcyBtYWNoaW5lIGluc3RydWN0aW9uLiAgRm9yIGV4YW1wbGUsIG9uIFg4NiwgbWFueQorICAvLy8gaW5zdHJ1Y3Rpb25zIGltcGxpY2l0bHkgc2V0IHRoZSBmbGFncyByZWdpc3Rlci4gIEluIHRoaXMgY2FzZSwgdGhleSBhcmUKKyAgLy8vIG1hcmtlZCBhcyBzZXR0aW5nIHRoZSBGTEFHUy4gIExpa2V3aXNlLCBtYW55IGluc3RydWN0aW9ucyBhbHdheXMgZGVwb3NpdAorICAvLy8gdGhlaXIgcmVzdWx0IGluIGEgcGh5c2ljYWwgcmVnaXN0ZXIuICBGb3IgZXhhbXBsZSwgdGhlIFg4NiBkaXZpZGUKKyAgLy8vIGluc3RydWN0aW9uIGFsd2F5cyBkZXBvc2l0cyB0aGUgcXVvdGllbnQgYW5kIHJlbWFpbmRlciBpbiB0aGUgRUFYL0VEWAorICAvLy8gcmVnaXN0ZXJzLiAgRm9yIHRoYXQgaW5zdHJ1Y3Rpb24sIHRoaXMgd2lsbCByZXR1cm4gYSBsaXN0IGNvbnRhaW5pbmcgdGhlCisgIC8vLyBFQVgvRURYL0VGTEFHUyByZWdpc3RlcnMuCisgIC8vLworICAvLy8gVGhpcyBtZXRob2QgcmV0dXJucyBudWxsIGlmIHRoZSBpbnN0cnVjdGlvbiBoYXMgbm8gaW1wbGljaXQgZGVmcy4KKyAgY29uc3QgTUNQaHlzUmVnICpnZXRJbXBsaWNpdERlZnMoKSBjb25zdCB7IHJldHVybiBJbXBsaWNpdERlZnM7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIGltcGxpY2l0IGRlZnMgdGhpcyBpbnN0cnVjdCBoYXMuCisgIHVuc2lnbmVkIGdldE51bUltcGxpY2l0RGVmcygpIGNvbnN0IHsKKyAgICBpZiAoIUltcGxpY2l0RGVmcykKKyAgICAgIHJldHVybiAwOworICAgIHVuc2lnbmVkIGkgPSAwOworICAgIGZvciAoOyBJbXBsaWNpdERlZnNbaV07ICsraSkgLyplbXB0eSovCisgICAgICA7CisgICAgcmV0dXJuIGk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaW1wbGljaXRseQorICAvLy8gdXNlcyB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsIHJlZ2lzdGVyLgorICBib29sIGhhc0ltcGxpY2l0VXNlT2ZQaHlzUmVnKHVuc2lnbmVkIFJlZykgY29uc3QgeworICAgIGlmIChjb25zdCBNQ1BoeXNSZWcgKkltcFVzZXMgPSBJbXBsaWNpdFVzZXMpCisgICAgICBmb3IgKDsgKkltcFVzZXM7ICsrSW1wVXNlcykKKyAgICAgICAgaWYgKCpJbXBVc2VzID09IFJlZykKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgaW5zdHJ1Y3Rpb24gaW1wbGljaXRseQorICAvLy8gZGVmaW5lcyB0aGUgc3BlY2lmaWVkIHBoeXNpY2FsIHJlZ2lzdGVyLgorICBib29sIGhhc0ltcGxpY2l0RGVmT2ZQaHlzUmVnKHVuc2lnbmVkIFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1JlZ2lzdGVySW5mbyAqTVJJID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHNjaGVkdWxpbmcgY2xhc3MgZm9yIHRoaXMgaW5zdHJ1Y3Rpb24uICBUaGUKKyAgLy8vIHNjaGVkdWxpbmcgY2xhc3MgaXMgYW4gaW5kZXggaW50byB0aGUgSW5zdHJJdGluZXJhcnlEYXRhIHRhYmxlLiAgVGhpcworICAvLy8gcmV0dXJucyB6ZXJvIGlmIHRoZXJlIGlzIG5vIGtub3duIHNjaGVkdWxpbmcgaW5mb3JtYXRpb24gZm9yIHRoZQorICAvLy8gaW5zdHJ1Y3Rpb24uCisgIHVuc2lnbmVkIGdldFNjaGVkQ2xhc3MoKSBjb25zdCB7IHJldHVybiBTY2hlZENsYXNzOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgZW5jb2Rpbmcgb2YgdGhpcyBpbnN0cnVjdGlvbiwKKyAgLy8vIG9yIHplcm8gaWYgdGhlIGVuY29kaW5nIHNpemUgY2Fubm90IGJlIGtub3duIGZyb20gdGhlIG9wY29kZS4KKyAgdW5zaWduZWQgZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KKworICAvLy8gXGJyaWVmIEZpbmQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBvcGVyYW5kIGluIHRoZQorICAvLy8gb3BlcmFuZCBsaXN0IHRoYXQgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIHByZWRpY2F0ZS4gSXQgcmV0dXJucyAtMSBpZgorICAvLy8gbm9uZSBpcyBmb3VuZC4KKyAgaW50IGZpbmRGaXJzdFByZWRPcGVyYW5kSWR4KCkgY29uc3QgeworICAgIGlmIChpc1ByZWRpY2FibGUoKSkgeworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBpZiAoT3BJbmZvW2ldLmlzUHJlZGljYXRlKCkpCisgICAgICAgICAgcmV0dXJuIGk7CisgICAgfQorICAgIHJldHVybiAtMTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBpbnN0cnVjdGlvbiBkZWZpbmVzIHRoZSBzcGVjaWZpZWQgcGh5c2ljYWwKKyAgLy8vIHJlZ2lzdGVyLCBlaXRoZXIgZXhwbGljaXRseSBvciBpbXBsaWNpdGx5LgorICBib29sIGhhc0RlZk9mUGh5c1JlZyhjb25zdCBNQ0luc3QgJk1JLCB1bnNpZ25lZCBSZWcsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICZSSSkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNJbnN0ckluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNJbnN0ckluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MGYxZjMyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0luc3RySW5mby5oCkBAIC0wLDAgKzEsNTkgQEAKKy8vPT09LS0gbGx2bS9NQy9NQ0luc3RySW5mby5oIC0gVGFyZ2V0IEluc3RydWN0aW9uIEluZm8gLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgdGFyZ2V0IG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0lOU1RSSU5GT19ICisjZGVmaW5lIExMVk1fTUNfTUNJTlNUUklORk9fSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ0luc3RyRGVzYy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLyBcYnJpZWYgSW50ZXJmYWNlIHRvIGRlc2NyaXB0aW9uIG9mIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0LgorY2xhc3MgTUNJbnN0ckluZm8geworICBjb25zdCBNQ0luc3RyRGVzYyAqRGVzYzsgICAgICAgICAgLy8gUmF3IGFycmF5IHRvIGFsbG93IHN0YXRpYyBpbml0J24KKyAgY29uc3QgdW5zaWduZWQgKkluc3RyTmFtZUluZGljZXM7IC8vIEFycmF5IGZvciBuYW1lIGluZGljZXMgaW4gSW5zdHJOYW1lRGF0YQorICBjb25zdCBjaGFyICpJbnN0ck5hbWVEYXRhOyAgICAgICAgLy8gSW5zdHJ1Y3Rpb24gbmFtZSBzdHJpbmcgcG9vbAorICB1bnNpZ25lZCBOdW1PcGNvZGVzOyAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGRlc2MgYXJyYXkKKworcHVibGljOgorICAvLy8gXGJyaWVmIEluaXRpYWxpemUgTUNJbnN0ckluZm8sIGNhbGxlZCBieSBUYWJsZUdlbiBhdXRvLWdlbmVyYXRlZCByb3V0aW5lcy4KKyAgLy8vICpETyBOT1QgVVNFKi4KKyAgdm9pZCBJbml0TUNJbnN0ckluZm8oY29uc3QgTUNJbnN0ckRlc2MgKkQsIGNvbnN0IHVuc2lnbmVkICpOSSwgY29uc3QgY2hhciAqTkQsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE5PKSB7CisgICAgRGVzYyA9IEQ7CisgICAgSW5zdHJOYW1lSW5kaWNlcyA9IE5JOworICAgIEluc3RyTmFtZURhdGEgPSBORDsKKyAgICBOdW1PcGNvZGVzID0gTk87CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1PcGNvZGVzKCkgY29uc3QgeyByZXR1cm4gTnVtT3Bjb2RlczsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBtYWNoaW5lIGluc3RydWN0aW9uIGRlc2NyaXB0b3IgdGhhdCBjb3JyZXNwb25kcyB0byB0aGUKKyAgLy8vIHNwZWNpZmllZCBpbnN0cnVjdGlvbiBvcGNvZGUuCisgIGNvbnN0IE1DSW5zdHJEZXNjICZnZXQodW5zaWduZWQgT3Bjb2RlKSBjb25zdCB7CisgICAgYXNzZXJ0KE9wY29kZSA8IE51bU9wY29kZXMgJiYgIkludmFsaWQgb3Bjb2RlISIpOworICAgIHJldHVybiBEZXNjW09wY29kZV07CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIG5hbWUgZm9yIHRoZSBpbnN0cnVjdGlvbnMgd2l0aCB0aGUgZ2l2ZW4gb3Bjb2RlLgorICBTdHJpbmdSZWYgZ2V0TmFtZSh1bnNpZ25lZCBPcGNvZGUpIGNvbnN0IHsKKyAgICBhc3NlcnQoT3Bjb2RlIDwgTnVtT3Bjb2RlcyAmJiAiSW52YWxpZCBvcGNvZGUhIik7CisgICAgcmV0dXJuIFN0cmluZ1JlZigmSW5zdHJOYW1lRGF0YVtJbnN0ck5hbWVJbmRpY2VzW09wY29kZV1dKTsKKyAgfQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DSW5zdHJJdGluZXJhcmllcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0luc3RySXRpbmVyYXJpZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDgyNGU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0luc3RySXRpbmVyYXJpZXMuaApAQCAtMCwwICsxLDIzNSBAQAorLy89PT0tIGxsdm0vTUMvTUNJbnN0ckl0aW5lcmFyaWVzLmggLSBTY2hlZHVsaW5nIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBzdHJ1Y3R1cmVzIHVzZWQgZm9yIGluc3RydWN0aW9uCisvLyBpdGluZXJhcmllcywgc3RhZ2VzLCBhbmQgb3BlcmFuZCByZWFkcy93cml0ZXMuICBUaGlzIGlzIHVzZWQgYnkKKy8vIHNjaGVkdWxlcnMgdG8gZGV0ZXJtaW5lIGluc3RydWN0aW9uIHN0YWdlcyBhbmQgbGF0ZW5jaWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0lOU1RSSVRJTkVSQVJJRVNfSAorI2RlZmluZSBMTFZNX01DX01DSU5TVFJJVElORVJBUklFU19ICisKKyNpbmNsdWRlICJsbHZtL01DL01DU2NoZWR1bGUuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBUaGVzZSB2YWx1ZXMgcmVwcmVzZW50IGEgbm9uLXBpcGVsaW5lZCBzdGVwIGluCisvLy8gdGhlIGV4ZWN1dGlvbiBvZiBhbiBpbnN0cnVjdGlvbi4gIEN5Y2xlcyByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YKKy8vLyBkaXNjcmV0ZSB0aW1lIHNsb3RzIG5lZWRlZCB0byBjb21wbGV0ZSB0aGUgc3RhZ2UuICBVbml0cyByZXByZXNlbnQKKy8vLyB0aGUgY2hvaWNlIG9mIGZ1bmN0aW9uYWwgdW5pdHMgdGhhdCBjYW4gYmUgdXNlZCB0byBjb21wbGV0ZSB0aGUKKy8vLyBzdGFnZS4gIEVnLiBJbnRVbml0MSwgSW50VW5pdDIuIE5leHRDeWNsZXMgaW5kaWNhdGVzIGhvdyBtYW55CisvLy8gY3ljbGVzIHNob3VsZCBlbGFwc2UgZnJvbSB0aGUgc3RhcnQgb2YgdGhpcyBzdGFnZSB0byB0aGUgc3RhcnQgb2YKKy8vLyB0aGUgbmV4dCBzdGFnZSBpbiB0aGUgaXRpbmVyYXJ5LiBBIHZhbHVlIG9mIC0xIGluZGljYXRlcyB0aGF0IHRoZQorLy8vIG5leHQgc3RhZ2Ugc2hvdWxkIHN0YXJ0IGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBjdXJyZW50IG9uZS4KKy8vLyBGb3IgZXhhbXBsZToKKy8vLworLy8vICAgeyAxLCB4LCAtMSB9CisvLy8gICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RhZ2Ugb2NjdXBpZXMgRlUgeCBmb3IgMSBjeWNsZSBhbmQgdGhhdAorLy8vICAgICAgdGhlIG5leHQgc3RhZ2Ugc3RhcnRzIGltbWVkaWF0ZWx5IGFmdGVyIHRoaXMgb25lLgorLy8vCisvLy8gICB7IDIsIHh8eSwgMSB9CisvLy8gICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RhZ2Ugb2NjdXBpZXMgZWl0aGVyIEZVIHggb3IgRlUgeSBmb3IgMgorLy8vICAgICAgY29uc2VjdXRpdmUgY3ljbGVzIGFuZCB0aGF0IHRoZSBuZXh0IHN0YWdlIHN0YXJ0cyBvbmUgY3ljbGUKKy8vLyAgICAgIGFmdGVyIHRoaXMgc3RhZ2Ugc3RhcnRzLiBUaGF0IGlzLCB0aGUgc3RhZ2UgcmVxdWlyZW1lbnRzCisvLy8gICAgICBvdmVybGFwIGluIHRpbWUuCisvLy8KKy8vLyAgIHsgMSwgeCwgMCB9CisvLy8gICAgICBpbmRpY2F0ZXMgdGhhdCB0aGUgc3RhZ2Ugb2NjdXBpZXMgRlUgeCBmb3IgMSBjeWNsZSBhbmQgdGhhdAorLy8vICAgICAgdGhlIG5leHQgc3RhZ2Ugc3RhcnRzIGluIHRoaXMgc2FtZSBjeWNsZS4gVGhpcyBjYW4gYmUgdXNlZCB0bworLy8vICAgICAgaW5kaWNhdGUgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gcmVxdWlyZXMgbXVsdGlwbGUgc3RhZ2VzIGF0IHRoZQorLy8vICAgICAgc2FtZSB0aW1lLgorLy8vCisvLy8gRlUgcmVzZXJ2YXRpb24gY2FuIGJlIG9mIHR3byBkaWZmZXJlbnQga2luZHM6CisvLy8gIC0gRlVzIHdoaWNoIGluc3RydWN0aW9uIGFjdHVhbGx5IHJlcXVpcmVzCisvLy8gIC0gRlVzIHdoaWNoIGluc3RydWN0aW9uIGp1c3QgcmVzZXJ2ZXMuIFJlc2VydmVkIHVuaXQgaXMgbm90IGF2YWlsYWJsZSBmb3IKKy8vLyAgICBleGVjdXRpb24gb2Ygb3RoZXIgaW5zdHJ1Y3Rpb24uIEhvd2V2ZXIsIHNldmVyYWwgaW5zdHJ1Y3Rpb25zIGNhbiByZXNlcnZlCisvLy8gICAgdGhlIHNhbWUgdW5pdCBzZXZlcmFsIHRpbWVzLgorLy8vIFN1Y2ggdHdvIHR5cGVzIG9mIHVuaXRzIHJlc2VydmF0aW9uIGlzIHVzZWQgdG8gbW9kZWwgaW5zdHJ1Y3Rpb24gZG9tYWluCisvLy8gY2hhbmdlIHN0YWxscywgRlVzIHVzaW5nIHRoZSBzYW1lIHJlc291cmNlIChlLmcuIHNhbWUgcmVnaXN0ZXIgZmlsZSksIGV0Yy4KKworc3RydWN0IEluc3RyU3RhZ2UgeworICBlbnVtIFJlc2VydmF0aW9uS2luZHMgeworICAgIFJlcXVpcmVkID0gMCwKKyAgICBSZXNlcnZlZCA9IDEKKyAgfTsKKworICB1bnNpZ25lZCBDeWNsZXNfOyAgLy8vPCBMZW5ndGggb2Ygc3RhZ2UgaW4gbWFjaGluZSBjeWNsZXMKKyAgdW5zaWduZWQgVW5pdHNfOyAgIC8vLzwgQ2hvaWNlIG9mIGZ1bmN0aW9uYWwgdW5pdHMKKyAgaW50IE5leHRDeWNsZXNfOyAgIC8vLzwgTnVtYmVyIG9mIG1hY2hpbmUgY3ljbGVzIHRvIG5leHQgc3RhZ2UKKyAgUmVzZXJ2YXRpb25LaW5kcyBLaW5kXzsgLy8vPCBLaW5kIG9mIHRoZSBGVSByZXNlcnZhdGlvbgorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGN5Y2xlcyB0aGUgc3RhZ2UgaXMgb2NjdXBpZWQuCisgIHVuc2lnbmVkIGdldEN5Y2xlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3ljbGVzXzsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgY2hvaWNlIG9mIEZVcy4KKyAgdW5zaWduZWQgZ2V0VW5pdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIFVuaXRzXzsKKyAgfQorCisgIFJlc2VydmF0aW9uS2luZHMgZ2V0UmVzZXJ2YXRpb25LaW5kKCkgY29uc3QgeworICAgIHJldHVybiBLaW5kXzsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgbnVtYmVyIG9mIGN5Y2xlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGlzIHN0YWdlIHRvIHRoZQorICAvLy8gc3RhcnQgb2YgdGhlIG5leHQgc3RhZ2UgaW4gdGhlIGl0aW5lcmFyeQorICB1bnNpZ25lZCBnZXROZXh0Q3ljbGVzKCkgY29uc3QgeworICAgIHJldHVybiAoTmV4dEN5Y2xlc18gPj0gMCkgPyAodW5zaWduZWQpTmV4dEN5Y2xlc18gOiBDeWNsZXNfOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEFuIGl0aW5lcmFyeSByZXByZXNlbnRzIHRoZSBzY2hlZHVsaW5nIGluZm9ybWF0aW9uIGZvciBhbiBpbnN0cnVjdGlvbi4KKy8vLyBUaGlzIGluY2x1ZGVzIGEgc2V0IG9mIHN0YWdlcyBvY2N1cGllZCBieSB0aGUgaW5zdHJ1Y3Rpb24gYW5kIHRoZSBwaXBlbGluZQorLy8vIGN5Y2xlIGluIHdoaWNoIG9wZXJhbmRzIGFyZSByZWFkIGFuZCB3cml0dGVuLgorLy8vCitzdHJ1Y3QgSW5zdHJJdGluZXJhcnkgeworICBpbnQxNl90ICBOdW1NaWNyb09wczsgICAgICAgIC8vLzwgIyBvZiBtaWNyby1vcHMsIC0xIG1lYW5zIGl0J3MgdmFyaWFibGUKKyAgdWludDE2X3QgRmlyc3RTdGFnZTsgICAgICAgICAvLy88IEluZGV4IG9mIGZpcnN0IHN0YWdlIGluIGl0aW5lcmFyeQorICB1aW50MTZfdCBMYXN0U3RhZ2U7ICAgICAgICAgIC8vLzwgSW5kZXggb2YgbGFzdCArIDEgc3RhZ2UgaW4gaXRpbmVyYXJ5CisgIHVpbnQxNl90IEZpcnN0T3BlcmFuZEN5Y2xlOyAgLy8vPCBJbmRleCBvZiBmaXJzdCBvcGVyYW5kIHJkL3dyCisgIHVpbnQxNl90IExhc3RPcGVyYW5kQ3ljbGU7ICAgLy8vPCBJbmRleCBvZiBsYXN0ICsgMSBvcGVyYW5kIHJkL3dyCit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEl0aW5lcmFyeSBkYXRhIHN1cHBsaWVkIGJ5IGEgc3VidGFyZ2V0IHRvIGJlIHVzZWQgYnkgYSB0YXJnZXQuCisvLy8KK2NsYXNzIEluc3RySXRpbmVyYXJ5RGF0YSB7CitwdWJsaWM6CisgIE1DU2NoZWRNb2RlbCBTY2hlZE1vZGVsID0KKyAgICAgIE1DU2NoZWRNb2RlbDo6R2V0RGVmYXVsdFNjaGVkTW9kZWwoKTsgLy8vPCBCYXNpYyBtYWNoaW5lIHByb3BlcnRpZXMuCisgIGNvbnN0IEluc3RyU3RhZ2UgKlN0YWdlcyA9IG51bGxwdHI7ICAgICAgIC8vLzwgQXJyYXkgb2Ygc3RhZ2VzIHNlbGVjdGVkCisgIGNvbnN0IHVuc2lnbmVkICpPcGVyYW5kQ3ljbGVzID0gbnVsbHB0cjsgLy8vPCBBcnJheSBvZiBvcGVyYW5kIGN5Y2xlcyBzZWxlY3RlZAorICBjb25zdCB1bnNpZ25lZCAqRm9yd2FyZGluZ3MgPSBudWxscHRyOyAvLy88IEFycmF5IG9mIHBpcGVsaW5lIGZvcndhcmRpbmcgcGF0aHMKKyAgY29uc3QgSW5zdHJJdGluZXJhcnkgKkl0aW5lcmFyaWVzID0KKyAgICAgIG51bGxwdHI7IC8vLzwgQXJyYXkgb2YgaXRpbmVyYXJpZXMgc2VsZWN0ZWQKKworICBJbnN0ckl0aW5lcmFyeURhdGEoKSA9IGRlZmF1bHQ7CisgIEluc3RySXRpbmVyYXJ5RGF0YShjb25zdCBNQ1NjaGVkTW9kZWwgJlNNLCBjb25zdCBJbnN0clN0YWdlICpTLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgKk9TLCBjb25zdCB1bnNpZ25lZCAqRikKKyAgICA6IFNjaGVkTW9kZWwoU00pLCBTdGFnZXMoUyksIE9wZXJhbmRDeWNsZXMoT1MpLCBGb3J3YXJkaW5ncyhGKSwKKyAgICAgIEl0aW5lcmFyaWVzKFNjaGVkTW9kZWwuSW5zdHJJdGluZXJhcmllcykge30KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgbm8gaXRpbmVyYXJpZXMuCisgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEl0aW5lcmFyaWVzID09IG51bGxwdHI7IH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiB0aGUgaW5kZXggaXMgZm9yIHRoZSBlbmQgbWFya2VyIGl0aW5lcmFyeS4KKyAgYm9vbCBpc0VuZE1hcmtlcih1bnNpZ25lZCBJdGluQ2xhc3NJbmR4KSBjb25zdCB7CisgICAgcmV0dXJuICgoSXRpbmVyYXJpZXNbSXRpbkNsYXNzSW5keF0uRmlyc3RTdGFnZSA9PSBVSU5UMTZfTUFYKSAmJgorICAgICAgICAgICAgKEl0aW5lcmFyaWVzW0l0aW5DbGFzc0luZHhdLkxhc3RTdGFnZSA9PSBVSU5UMTZfTUFYKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgZmlyc3Qgc3RhZ2Ugb2YgdGhlIGl0aW5lcmFyeS4KKyAgY29uc3QgSW5zdHJTdGFnZSAqYmVnaW5TdGFnZSh1bnNpZ25lZCBJdGluQ2xhc3NJbmR4KSBjb25zdCB7CisgICAgdW5zaWduZWQgU3RhZ2VJZHggPSBJdGluZXJhcmllc1tJdGluQ2xhc3NJbmR4XS5GaXJzdFN0YWdlOworICAgIHJldHVybiBTdGFnZXMgKyBTdGFnZUlkeDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBsYXN0KzEgc3RhZ2Ugb2YgdGhlIGl0aW5lcmFyeS4KKyAgY29uc3QgSW5zdHJTdGFnZSAqZW5kU3RhZ2UodW5zaWduZWQgSXRpbkNsYXNzSW5keCkgY29uc3QgeworICAgIHVuc2lnbmVkIFN0YWdlSWR4ID0gSXRpbmVyYXJpZXNbSXRpbkNsYXNzSW5keF0uTGFzdFN0YWdlOworICAgIHJldHVybiBTdGFnZXMgKyBTdGFnZUlkeDsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB0b3RhbCBzdGFnZSBsYXRlbmN5IG9mIHRoZSBnaXZlbiBjbGFzcy4gIFRoZSBsYXRlbmN5IGlzCisgIC8vLyB0aGUgbWF4aW11bSBjb21wbGV0aW9uIHRpbWUgZm9yIGFueSBzdGFnZSBpbiB0aGUgaXRpbmVyYXJ5LiAgSWYgbm8gc3RhZ2VzCisgIC8vLyBleGlzdCwgaXQgZGVmYXVsdHMgdG8gb25lIGN5Y2xlLgorICB1bnNpZ25lZCBnZXRTdGFnZUxhdGVuY3kodW5zaWduZWQgSXRpbkNsYXNzSW5keCkgY29uc3QgeworICAgIC8vIElmIHRoZSB0YXJnZXQgZG9lc24ndCBwcm92aWRlIGl0aW5lcmFyeSBpbmZvcm1hdGlvbiwgdXNlIGEgc2ltcGxlCisgICAgLy8gbm9uLXplcm8gZGVmYXVsdCB2YWx1ZSBmb3IgYWxsIGluc3RydWN0aW9ucy4KKyAgICBpZiAoaXNFbXB0eSgpKQorICAgICAgcmV0dXJuIDE7CisKKyAgICAvLyBDYWxjdWxhdGUgdGhlIG1heGltdW0gY29tcGxldGlvbiB0aW1lIGZvciBhbnkgc3RhZ2UuCisgICAgdW5zaWduZWQgTGF0ZW5jeSA9IDAsIFN0YXJ0Q3ljbGUgPSAwOworICAgIGZvciAoY29uc3QgSW5zdHJTdGFnZSAqSVMgPSBiZWdpblN0YWdlKEl0aW5DbGFzc0luZHgpLAorICAgICAgICAgICAqRSA9IGVuZFN0YWdlKEl0aW5DbGFzc0luZHgpOyBJUyAhPSBFOyArK0lTKSB7CisgICAgICBMYXRlbmN5ID0gc3RkOjptYXgoTGF0ZW5jeSwgU3RhcnRDeWNsZSArIElTLT5nZXRDeWNsZXMoKSk7CisgICAgICBTdGFydEN5Y2xlICs9IElTLT5nZXROZXh0Q3ljbGVzKCk7CisgICAgfQorICAgIHJldHVybiBMYXRlbmN5OworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGN5Y2xlIGZvciB0aGUgZ2l2ZW4gY2xhc3MgYW5kIG9wZXJhbmQuICBSZXR1cm4gLTEgaWYgbm8KKyAgLy8vIGN5Y2xlIGlzIHNwZWNpZmllZCBmb3IgdGhlIG9wZXJhbmQuCisgIGludCBnZXRPcGVyYW5kQ3ljbGUodW5zaWduZWQgSXRpbkNsYXNzSW5keCwgdW5zaWduZWQgT3BlcmFuZElkeCkgY29uc3QgeworICAgIGlmIChpc0VtcHR5KCkpCisgICAgICByZXR1cm4gLTE7CisKKyAgICB1bnNpZ25lZCBGaXJzdElkeCA9IEl0aW5lcmFyaWVzW0l0aW5DbGFzc0luZHhdLkZpcnN0T3BlcmFuZEN5Y2xlOworICAgIHVuc2lnbmVkIExhc3RJZHggPSBJdGluZXJhcmllc1tJdGluQ2xhc3NJbmR4XS5MYXN0T3BlcmFuZEN5Y2xlOworICAgIGlmICgoRmlyc3RJZHggKyBPcGVyYW5kSWR4KSA+PSBMYXN0SWR4KQorICAgICAgcmV0dXJuIC0xOworCisgICAgcmV0dXJuIChpbnQpT3BlcmFuZEN5Y2xlc1tGaXJzdElkeCArIE9wZXJhbmRJZHhdOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGVyZSBpcyBhIHBpcGVsaW5lIGZvcndhcmRpbmcgYmV0d2VlbiBpbnN0cnVjdGlvbnMKKyAgLy8vIG9mIGl0aW5lcmFyeSBjbGFzc2VzIERlZkNsYXNzIGFuZCBVc2VDbGFzc2VzIHNvIHRoYXQgdmFsdWUgcHJvZHVjZWQgYnkgYW4KKyAgLy8vIGluc3RydWN0aW9uIG9mIGl0aW5lcmFyeSBjbGFzcyBEZWZDbGFzcywgb3BlcmFuZCBpbmRleCBEZWZJZHggY2FuIGJlCisgIC8vLyBieXBhc3NlZCB3aGVuIGl0J3MgcmVhZCBieSBhbiBpbnN0cnVjdGlvbiBvZiBpdGluZXJhcnkgY2xhc3MgVXNlQ2xhc3MsCisgIC8vLyBvcGVyYW5kIGluZGV4IFVzZUlkeC4KKyAgYm9vbCBoYXNQaXBlbGluZUZvcndhcmRpbmcodW5zaWduZWQgRGVmQ2xhc3MsIHVuc2lnbmVkIERlZklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgVXNlQ2xhc3MsIHVuc2lnbmVkIFVzZUlkeCkgY29uc3QgeworICAgIHVuc2lnbmVkIEZpcnN0RGVmSWR4ID0gSXRpbmVyYXJpZXNbRGVmQ2xhc3NdLkZpcnN0T3BlcmFuZEN5Y2xlOworICAgIHVuc2lnbmVkIExhc3REZWZJZHggPSBJdGluZXJhcmllc1tEZWZDbGFzc10uTGFzdE9wZXJhbmRDeWNsZTsKKyAgICBpZiAoKEZpcnN0RGVmSWR4ICsgRGVmSWR4KSA+PSBMYXN0RGVmSWR4KQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChGb3J3YXJkaW5nc1tGaXJzdERlZklkeCArIERlZklkeF0gPT0gMCkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIHVuc2lnbmVkIEZpcnN0VXNlSWR4ID0gSXRpbmVyYXJpZXNbVXNlQ2xhc3NdLkZpcnN0T3BlcmFuZEN5Y2xlOworICAgIHVuc2lnbmVkIExhc3RVc2VJZHggPSBJdGluZXJhcmllc1tVc2VDbGFzc10uTGFzdE9wZXJhbmRDeWNsZTsKKyAgICBpZiAoKEZpcnN0VXNlSWR4ICsgVXNlSWR4KSA+PSBMYXN0VXNlSWR4KQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgcmV0dXJuIEZvcndhcmRpbmdzW0ZpcnN0RGVmSWR4ICsgRGVmSWR4XSA9PQorICAgICAgRm9yd2FyZGluZ3NbRmlyc3RVc2VJZHggKyBVc2VJZHhdOworICB9CisKKyAgLy8vIFxicmllZiBDb21wdXRlIGFuZCByZXR1cm4gdGhlIHVzZSBvcGVyYW5kIGxhdGVuY3kgb2YgYSBnaXZlbiBpdGluZXJhcnkKKyAgLy8vIGNsYXNzIGFuZCBvcGVyYW5kIGluZGV4IGlmIHRoZSB2YWx1ZSBpcyBwcm9kdWNlZCBieSBhbiBpbnN0cnVjdGlvbiBvZiB0aGUKKyAgLy8vIHNwZWNpZmllZCBpdGluZXJhcnkgY2xhc3MgYW5kIGRlZiBvcGVyYW5kIGluZGV4LgorICBpbnQgZ2V0T3BlcmFuZExhdGVuY3kodW5zaWduZWQgRGVmQ2xhc3MsIHVuc2lnbmVkIERlZklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFVzZUNsYXNzLCB1bnNpZ25lZCBVc2VJZHgpIGNvbnN0IHsKKyAgICBpZiAoaXNFbXB0eSgpKQorICAgICAgcmV0dXJuIC0xOworCisgICAgaW50IERlZkN5Y2xlID0gZ2V0T3BlcmFuZEN5Y2xlKERlZkNsYXNzLCBEZWZJZHgpOworICAgIGlmIChEZWZDeWNsZSA9PSAtMSkKKyAgICAgIHJldHVybiAtMTsKKworICAgIGludCBVc2VDeWNsZSA9IGdldE9wZXJhbmRDeWNsZShVc2VDbGFzcywgVXNlSWR4KTsKKyAgICBpZiAoVXNlQ3ljbGUgPT0gLTEpCisgICAgICByZXR1cm4gLTE7CisKKyAgICBVc2VDeWNsZSA9IERlZkN5Y2xlIC0gVXNlQ3ljbGUgKyAxOworICAgIGlmIChVc2VDeWNsZSA+IDAgJiYKKyAgICAgICAgaGFzUGlwZWxpbmVGb3J3YXJkaW5nKERlZkNsYXNzLCBEZWZJZHgsIFVzZUNsYXNzLCBVc2VJZHgpKQorICAgICAgLy8gRklYTUU6IFRoaXMgYXNzdW1lcyBvbmUgY3ljbGUgYmVuZWZpdCBmb3IgZXZlcnkgcGlwZWxpbmUgZm9yd2FyZGluZy4KKyAgICAgIC0tVXNlQ3ljbGU7CisgICAgcmV0dXJuIFVzZUN5Y2xlOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBtaWNyby1vcHMgdGhhdCB0aGUgZ2l2ZW4gY2xhc3MgZGVjb2RlcyB0by4KKyAgLy8vIFJldHVybiAtMSBmb3IgY2xhc3NlcyB0aGF0IHJlcXVpcmUgZHluYW1pYyBsb29rdXAgdmlhIFRhcmdldEluc3RySW5mby4KKyAgaW50IGdldE51bU1pY3JvT3BzKHVuc2lnbmVkIEl0aW5DbGFzc0luZHgpIGNvbnN0IHsKKyAgICBpZiAoaXNFbXB0eSgpKQorICAgICAgcmV0dXJuIDE7CisgICAgcmV0dXJuIEl0aW5lcmFyaWVzW0l0aW5DbGFzc0luZHhdLk51bU1pY3JvT3BzOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ0lOU1RSSVRJTkVSQVJJRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0xhYmVsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DTGFiZWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNjU3OWZkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0xhYmVsLmgKQEAgLTAsMCArMSw1NyBAQAorLy89PT0tIE1DTGFiZWwuaCAtIE1hY2hpbmUgQ29kZSBEaXJlY3Rpb25hbCBMb2NhbCBMYWJlbHMgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBNQ0xhYmVsIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ0xBQkVMX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0xBQkVMX0gKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworLy8vIFxicmllZiBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBsYWJlbCBuYW1lIGluIHRoZSBNQyBmaWxlLAorLy8vIGFuZCBNQ0xhYmVsIGFyZSBjcmVhdGVkIGFuZCB1bmlxdWVkIGJ5IHRoZSBNQ0NvbnRleHQgY2xhc3MuICBNQ0xhYmVsCisvLy8gc2hvdWxkIG9ubHkgYmUgY29uc3RydWN0ZWQgZm9yIHZhbGlkIGluc3RhbmNlcyBpbiB0aGUgb2JqZWN0IGZpbGUuCitjbGFzcyBNQ0xhYmVsIHsKKyAgLy8gXGJyaWVmIFRoZSBpbnN0YW5jZSBudW1iZXIgb2YgdGhpcyBEaXJlY3Rpb25hbCBMb2NhbCBMYWJlbC4KKyAgdW5zaWduZWQgSW5zdGFuY2U7CisKK3ByaXZhdGU6IC8vIE1DQ29udGV4dCBjcmVhdGVzIGFuZCB1bmlxdWVzIHRoZXNlLgorICBmcmllbmQgY2xhc3MgTUNDb250ZXh0OworCisgIE1DTGFiZWwodW5zaWduZWQgaW5zdGFuY2UpIDogSW5zdGFuY2UoaW5zdGFuY2UpIHt9CisKK3B1YmxpYzoKKyAgTUNMYWJlbChjb25zdCBNQ0xhYmVsICYpID0gZGVsZXRlOworICBNQ0xhYmVsICZvcGVyYXRvcj0oY29uc3QgTUNMYWJlbCAmKSA9IGRlbGV0ZTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgY3VycmVudCBpbnN0YW5jZSBvZiB0aGlzIERpcmVjdGlvbmFsIExvY2FsIExhYmVsLgorICB1bnNpZ25lZCBnZXRJbnN0YW5jZSgpIGNvbnN0IHsgcmV0dXJuIEluc3RhbmNlOyB9CisKKyAgLy8vIFxicmllZiBJbmNyZW1lbnQgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhpcyBEaXJlY3Rpb25hbCBMb2NhbCBMYWJlbC4KKyAgdW5zaWduZWQgaW5jSW5zdGFuY2UoKSB7IHJldHVybiArK0luc3RhbmNlOyB9CisKKyAgLy8vIFxicmllZiBQcmludCB0aGUgdmFsdWUgdG8gdGhlIHN0cmVhbSBccCBPUy4KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUHJpbnQgdGhlIHZhbHVlIHRvIHN0ZGVyci4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNQ0xhYmVsICZMYWJlbCkgeworICBMYWJlbC5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNMQUJFTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DTGlua2VyT3B0aW1pemF0aW9uSGludC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0xpbmtlck9wdGltaXphdGlvbkhpbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMGZkMDdmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ0xpbmtlck9wdGltaXphdGlvbkhpbnQuaApAQCAtMCwwICsxLDE4NyBAQAorLy89PT0tIE1DTGlua2VyT3B0aW1pemF0aW9uSGludC5oIC0gTE9IIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHNvbWUgaGVscGVycyBjbGFzc2VzIHRvIGhhbmRsZSBMaW5rZXIgT3B0aW1pemF0aW9uIEhpbnQKKy8vIChMT0gpLgorLy8KKy8vIEZJWE1FOiBMT0ggaW50ZXJmYWNlIHN1cHBvcnRzIG9ubHkgTWFjaE8gZm9ybWF0IGF0IHRoZSBtb21lbnQuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNMSU5LRVJPUFRJTUlaQVRJT05ISU5UX0gKKyNkZWZpbmUgTExWTV9NQ19NQ0xJTktFUk9QVElNSVpBVElPTkhJTlRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdTd2l0Y2guaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFjaE9iamVjdFdyaXRlcjsKK2NsYXNzIE1DQXNtTGF5b3V0OworY2xhc3MgTUNTeW1ib2w7CisKKy8vLyBMaW5rZXIgT3B0aW1pemF0aW9uIEhpbnQgVHlwZS4KK2VudW0gTUNMT0hUeXBlIHsKKyAgTUNMT0hfQWRycEFkcnAgPSAweDF1LCAgICAgIC8vLzwgQWRycCB4WSwgX3YxQFBBR0UgLT4gQWRycCB4WSwgX3YyQFBBR0UuCisgIE1DTE9IX0FkcnBMZHIgPSAweDJ1LCAgICAgICAvLy88IEFkcnAgX3ZAUEFHRSAtPiBMZHIgX3ZAUEFHRU9GRi4KKyAgTUNMT0hfQWRycEFkZExkciA9IDB4M3UsICAgIC8vLzwgQWRycCBfdkBQQUdFIC0+IEFkZCBfdkBQQUdFT0ZGIC0+IExkci4KKyAgTUNMT0hfQWRycExkckdvdExkciA9IDB4NHUsIC8vLzwgQWRycCBfdkBHT1RQQUdFIC0+IExkciBfdkBHT1RQQUdFT0ZGIC0+IExkci4KKyAgTUNMT0hfQWRycEFkZFN0ciA9IDB4NXUsICAgIC8vLzwgQWRycCBfdkBQQUdFIC0+IEFkZCBfdkBQQUdFT0ZGIC0+IFN0ci4KKyAgTUNMT0hfQWRycExkckdvdFN0ciA9IDB4NnUsIC8vLzwgQWRycCBfdkBHT1RQQUdFIC0+IExkciBfdkBHT1RQQUdFT0ZGIC0+IFN0ci4KKyAgTUNMT0hfQWRycEFkZCA9IDB4N3UsICAgICAgIC8vLzwgQWRycCBfdkBQQUdFIC0+IEFkZCBfdkBQQUdFT0ZGLgorICBNQ0xPSF9BZHJwTGRyR290ID0gMHg4dSAgICAgLy8vPCBBZHJwIF92QEdPVFBBR0UgLT4gTGRyIF92QEdPVFBBR0VPRkYuCit9OworCitzdGF0aWMgaW5saW5lIFN0cmluZ1JlZiBNQ0xPSERpcmVjdGl2ZU5hbWUoKSB7CisgIHJldHVybiBTdHJpbmdSZWYoIi5sb2giKTsKK30KKworc3RhdGljIGlubGluZSBib29sIGlzVmFsaWRNQ0xPSFR5cGUodW5zaWduZWQgS2luZCkgeworICByZXR1cm4gS2luZCA+PSBNQ0xPSF9BZHJwQWRycCAmJiBLaW5kIDw9IE1DTE9IX0FkcnBMZHJHb3Q7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IE1DTE9ITmFtZVRvSWQoU3RyaW5nUmVmIE5hbWUpIHsKKyNkZWZpbmUgTUNMT0hDYXNlTmFtZVRvSWQoTmFtZSkgICAgIC5DYXNlKCNOYW1lLCBNQ0xPSF8gIyMgTmFtZSkKKyAgcmV0dXJuIFN0cmluZ1N3aXRjaDxpbnQ+KE5hbWUpCisgICAgTUNMT0hDYXNlTmFtZVRvSWQoQWRycEFkcnApCisgICAgTUNMT0hDYXNlTmFtZVRvSWQoQWRycExkcikKKyAgICBNQ0xPSENhc2VOYW1lVG9JZChBZHJwQWRkTGRyKQorICAgIE1DTE9IQ2FzZU5hbWVUb0lkKEFkcnBMZHJHb3RMZHIpCisgICAgTUNMT0hDYXNlTmFtZVRvSWQoQWRycEFkZFN0cikKKyAgICBNQ0xPSENhc2VOYW1lVG9JZChBZHJwTGRyR290U3RyKQorICAgIE1DTE9IQ2FzZU5hbWVUb0lkKEFkcnBBZGQpCisgICAgTUNMT0hDYXNlTmFtZVRvSWQoQWRycExkckdvdCkKKyAgICAuRGVmYXVsdCgtMSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgU3RyaW5nUmVmIE1DTE9ISWRUb05hbWUoTUNMT0hUeXBlIEtpbmQpIHsKKyNkZWZpbmUgTUNMT0hDYXNlSWRUb05hbWUoTmFtZSkgICAgICBjYXNlIE1DTE9IXyAjIyBOYW1lOiByZXR1cm4gU3RyaW5nUmVmKCNOYW1lKTsKKyAgc3dpdGNoIChLaW5kKSB7CisgICAgTUNMT0hDYXNlSWRUb05hbWUoQWRycEFkcnApOworICAgIE1DTE9IQ2FzZUlkVG9OYW1lKEFkcnBMZHIpOworICAgIE1DTE9IQ2FzZUlkVG9OYW1lKEFkcnBBZGRMZHIpOworICAgIE1DTE9IQ2FzZUlkVG9OYW1lKEFkcnBMZHJHb3RMZHIpOworICAgIE1DTE9IQ2FzZUlkVG9OYW1lKEFkcnBBZGRTdHIpOworICAgIE1DTE9IQ2FzZUlkVG9OYW1lKEFkcnBMZHJHb3RTdHIpOworICAgIE1DTE9IQ2FzZUlkVG9OYW1lKEFkcnBBZGQpOworICAgIE1DTE9IQ2FzZUlkVG9OYW1lKEFkcnBMZHJHb3QpOworICB9CisgIHJldHVybiBTdHJpbmdSZWYoKTsKK30KKworc3RhdGljIGlubGluZSBpbnQgTUNMT0hJZFRvTmJBcmdzKE1DTE9IVHlwZSBLaW5kKSB7CisgIHN3aXRjaCAoS2luZCkgeworICAgIC8vIExPSCB3aXRoIHR3byBhcmd1bWVudHMKKyAgY2FzZSBNQ0xPSF9BZHJwQWRycDoKKyAgY2FzZSBNQ0xPSF9BZHJwTGRyOgorICBjYXNlIE1DTE9IX0FkcnBBZGQ6CisgIGNhc2UgTUNMT0hfQWRycExkckdvdDoKKyAgICByZXR1cm4gMjsKKyAgICAvLyBMT0ggd2l0aCB0aHJlZSBhcmd1bWVudHMKKyAgY2FzZSBNQ0xPSF9BZHJwQWRkTGRyOgorICBjYXNlIE1DTE9IX0FkcnBMZHJHb3RMZHI6CisgIGNhc2UgTUNMT0hfQWRycEFkZFN0cjoKKyAgY2FzZSBNQ0xPSF9BZHJwTGRyR290U3RyOgorICAgIHJldHVybiAzOworICB9CisgIHJldHVybiAtMTsKK30KKworLy8vIFN0b3JlIExpbmtlciBPcHRpbWl6YXRpb24gSGludCBpbmZvcm1hdGlvbiAoTE9IKS4KK2NsYXNzIE1DTE9IRGlyZWN0aXZlIHsKKyAgTUNMT0hUeXBlIEtpbmQ7CisKKyAgLy8vIEFyZ3VtZW50cyBvZiB0aGlzIGRpcmVjdGl2ZS4gT3JkZXIgbWF0dGVycy4KKyAgU21hbGxWZWN0b3I8TUNTeW1ib2wgKiwgMz4gQXJnczsKKworICAvLy8gRW1pdCB0aGlzIGRpcmVjdGl2ZSBpbiBccCBPdXRTdHJlYW0gdXNpbmcgdGhlIGluZm9ybWF0aW9uIGF2YWlsYWJsZQorICAvLy8gaW4gdGhlIGdpdmVuIFxwIE9ialdyaXRlciBhbmQgXHAgTGF5b3V0IHRvIGdldCB0aGUgYWRkcmVzcyBvZiB0aGUKKyAgLy8vIGFyZ3VtZW50cyB3aXRoaW4gdGhlIG9iamVjdCBmaWxlLgorICB2b2lkIGVtaXRfaW1wbChyYXdfb3N0cmVhbSAmT3V0U3RyZWFtLCBjb25zdCBNYWNoT2JqZWN0V3JpdGVyICZPYmpXcml0ZXIsCisgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQpIGNvbnN0OworCitwdWJsaWM6CisgIHVzaW5nIExPSEFyZ3MgPSBTbWFsbFZlY3RvckltcGw8TUNTeW1ib2wgKj47CisKKyAgTUNMT0hEaXJlY3RpdmUoTUNMT0hUeXBlIEtpbmQsIGNvbnN0IExPSEFyZ3MgJkFyZ3MpCisgICAgICA6IEtpbmQoS2luZCksIEFyZ3MoQXJncy5iZWdpbigpLCBBcmdzLmVuZCgpKSB7CisgICAgYXNzZXJ0KGlzVmFsaWRNQ0xPSFR5cGUoS2luZCkgJiYgIkludmFsaWQgTE9IIGRpcmVjdGl2ZSB0eXBlISIpOworICB9CisKKyAgTUNMT0hUeXBlIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKKyAgY29uc3QgTE9IQXJncyAmZ2V0QXJncygpIGNvbnN0IHsgcmV0dXJuIEFyZ3M7IH0KKworICAvLy8gRW1pdCB0aGlzIGRpcmVjdGl2ZSBhczoKKyAgLy8vIDxraW5kLCBudW1BcmdzLCBhZGRyMSwgLi4uLCBhZGRyTj4KKyAgdm9pZCBlbWl0KE1hY2hPYmplY3RXcml0ZXIgJk9ialdyaXRlciwgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgc2l6ZSBpbiBieXRlcyBvZiB0aGlzIGRpcmVjdGl2ZSBpZiBlbWl0dGVkIGluIFxwIE9ialdyaXRlciB3aXRoCisgIC8vLyB0aGUgZ2l2ZW4gXHAgTGF5b3V0LgorICB1aW50NjRfdCBnZXRFbWl0U2l6ZShjb25zdCBNYWNoT2JqZWN0V3JpdGVyICZPYmpXcml0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQpIGNvbnN0OworfTsKKworY2xhc3MgTUNMT0hDb250YWluZXIgeworICAvLy8gS2VlcCB0cmFjayBvZiB0aGUgZW1pdCBzaXplIG9mIGFsbCB0aGUgTE9Icy4KKyAgbXV0YWJsZSB1aW50NjRfdCBFbWl0U2l6ZSA9IDA7CisKKyAgLy8vIEtlZXAgdHJhY2sgb2YgYWxsIExPSCBkaXJlY3RpdmVzLgorICBTbWFsbFZlY3RvcjxNQ0xPSERpcmVjdGl2ZSwgMzI+IERpcmVjdGl2ZXM7CisKK3B1YmxpYzoKKyAgdXNpbmcgTE9IRGlyZWN0aXZlcyA9IFNtYWxsVmVjdG9ySW1wbDxNQ0xPSERpcmVjdGl2ZT47CisKKyAgTUNMT0hDb250YWluZXIoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIENvbnN0IGFjY2Vzc29yIHRvIHRoZSBkaXJlY3RpdmVzLgorICBjb25zdCBMT0hEaXJlY3RpdmVzICZnZXREaXJlY3RpdmVzKCkgY29uc3QgeworICAgIHJldHVybiBEaXJlY3RpdmVzOworICB9CisKKyAgLy8vIEFkZCB0aGUgZGlyZWN0aXZlIG9mIHRoZSBnaXZlbiBraW5kIFxwIEtpbmQgd2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzCisgIC8vLyBccCBBcmdzIHRvIHRoZSBjb250YWluZXIuCisgIHZvaWQgYWRkRGlyZWN0aXZlKE1DTE9IVHlwZSBLaW5kLCBjb25zdCBNQ0xPSERpcmVjdGl2ZTo6TE9IQXJncyAmQXJncykgeworICAgIERpcmVjdGl2ZXMucHVzaF9iYWNrKE1DTE9IRGlyZWN0aXZlKEtpbmQsIEFyZ3MpKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIHNpemUgb2YgdGhlIGRpcmVjdGl2ZXMgaWYgZW1pdHRlZC4KKyAgdWludDY0X3QgZ2V0RW1pdFNpemUoY29uc3QgTWFjaE9iamVjdFdyaXRlciAmT2JqV3JpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KSBjb25zdCB7CisgICAgaWYgKCFFbWl0U2l6ZSkgeworICAgICAgZm9yIChjb25zdCBNQ0xPSERpcmVjdGl2ZSAmRCA6IERpcmVjdGl2ZXMpCisgICAgICAgIEVtaXRTaXplICs9IEQuZ2V0RW1pdFNpemUoT2JqV3JpdGVyLCBMYXlvdXQpOworICAgIH0KKyAgICByZXR1cm4gRW1pdFNpemU7CisgIH0KKworICAvLy8gRW1pdCBhbGwgTGlua2VyIE9wdGltaXphdGlvbiBIaW50IGluIG9uZSBiaWcgdGFibGUuCisgIC8vLyBFYWNoIGxpbmUgb2YgdGhlIHRhYmxlIGlzIGVtaXR0ZWQgYnkgTE9IRGlyZWN0aXZlOjplbWl0LgorICB2b2lkIGVtaXQoTWFjaE9iamVjdFdyaXRlciAmT2JqV3JpdGVyLCBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KSBjb25zdCB7CisgICAgZm9yIChjb25zdCBNQ0xPSERpcmVjdGl2ZSAmRCA6IERpcmVjdGl2ZXMpCisgICAgICBELmVtaXQoT2JqV3JpdGVyLCBMYXlvdXQpOworICB9CisKKyAgdm9pZCByZXNldCgpIHsKKyAgICBEaXJlY3RpdmVzLmNsZWFyKCk7CisgICAgRW1pdFNpemUgPSAwOworICB9Cit9OworCisvLyBBZGQgdHlwZXMgZm9yIHNwZWNpYWxpemVkIHRlbXBsYXRlIHVzaW5nIE1DU3ltYm9sLgordXNpbmcgTUNMT0hBcmdzID0gTUNMT0hEaXJlY3RpdmU6OkxPSEFyZ3M7Cit1c2luZyBNQ0xPSERpcmVjdGl2ZXMgPSBNQ0xPSENvbnRhaW5lcjo6TE9IRGlyZWN0aXZlczsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNMSU5LRVJPUFRJTUlaQVRJT05ISU5UX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNNYWNoT2JqZWN0V3JpdGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DTWFjaE9iamVjdFdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5NDg2OWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DTWFjaE9iamVjdFdyaXRlci5oCkBAIC0wLDAgKzEsMjc5IEBACisvLz09PS0gbGx2bS9NQy9NQ01hY2hPYmplY3RXcml0ZXIuaCAtIE1hY2ggT2JqZWN0IFdyaXRlciAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNNQUNIT0JKRUNUV1JJVEVSX0gKKyNkZWZpbmUgTExWTV9NQ19NQ01BQ0hPQkpFQ1RXUklURVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9NYWNoTy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNFeHByLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ09iamVjdFdyaXRlci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9NQy9TdHJpbmdUYWJsZUJ1aWxkZXIuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1hY2hPYmplY3RXcml0ZXI7CisKK2NsYXNzIE1DTWFjaE9iamVjdFRhcmdldFdyaXRlciB7CisgIGNvbnN0IHVuc2lnbmVkIElzNjRCaXQgOiAxOworICBjb25zdCB1aW50MzJfdCBDUFVUeXBlOworICBjb25zdCB1aW50MzJfdCBDUFVTdWJ0eXBlOworICB1bnNpZ25lZCBMb2NhbERpZmZlcmVuY2VfUklUOworCitwcm90ZWN0ZWQ6CisgIE1DTWFjaE9iamVjdFRhcmdldFdyaXRlcihib29sIElzNjRCaXRfLCB1aW50MzJfdCBDUFVUeXBlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENQVVN1YnR5cGVfKTsKKworICB2b2lkIHNldExvY2FsRGlmZmVyZW5jZVJlbG9jYXRpb25UeXBlKHVuc2lnbmVkIFR5cGUpIHsKKyAgICBMb2NhbERpZmZlcmVuY2VfUklUID0gVHlwZTsKKyAgfQorCitwdWJsaWM6CisgIHZpcnR1YWwgfk1DTWFjaE9iamVjdFRhcmdldFdyaXRlcigpOworCisgIC8vLyBcbmFtZSBMaWZldGltZSBNYW5hZ2VtZW50CisgIC8vLyBAeworCisgIHZpcnR1YWwgdm9pZCByZXNldCgpIHt9CisKKyAgLy8vIEB9CisKKyAgLy8vIFxuYW1lIEFjY2Vzc29ycworICAvLy8gQHsKKworICBib29sIGlzNjRCaXQoKSBjb25zdCB7IHJldHVybiBJczY0Qml0OyB9CisgIHVpbnQzMl90IGdldENQVVR5cGUoKSBjb25zdCB7IHJldHVybiBDUFVUeXBlOyB9CisgIHVpbnQzMl90IGdldENQVVN1YnR5cGUoKSBjb25zdCB7IHJldHVybiBDUFVTdWJ0eXBlOyB9CisgIHVuc2lnbmVkIGdldExvY2FsRGlmZmVyZW5jZVJlbG9jYXRpb25UeXBlKCkgY29uc3QgeworICAgIHJldHVybiBMb2NhbERpZmZlcmVuY2VfUklUOworICB9CisKKyAgLy8vIEB9CisKKyAgLy8vIFxuYW1lIEFQSQorICAvLy8gQHsKKworICB2aXJ0dWFsIHZvaWQgcmVjb3JkUmVsb2NhdGlvbihNYWNoT2JqZWN0V3JpdGVyICpXcml0ZXIsIE1DQXNzZW1ibGVyICZBc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRnJhZ21lbnQgKkZyYWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0ZpeHVwICZGaXh1cCwgTUNWYWx1ZSBUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICZGaXhlZFZhbHVlKSA9IDA7CisKKyAgLy8vIEB9Cit9OworCitjbGFzcyBNYWNoT2JqZWN0V3JpdGVyIDogcHVibGljIE1DT2JqZWN0V3JpdGVyIHsKKyAgLy8vIEhlbHBlciBzdHJ1Y3QgZm9yIGNvbnRhaW5pbmcgc29tZSBwcmVjb21wdXRlZCBpbmZvcm1hdGlvbiBvbiBzeW1ib2xzLgorICBzdHJ1Y3QgTWFjaFN5bWJvbERhdGEgeworICAgIGNvbnN0IE1DU3ltYm9sICpTeW1ib2w7CisgICAgdWludDY0X3QgU3RyaW5nSW5kZXg7CisgICAgdWludDhfdCBTZWN0aW9uSW5kZXg7CisKKyAgICAvLyBTdXBwb3J0IGxleGljb2dyYXBoaWMgc29ydGluZy4KKyAgICBib29sIG9wZXJhdG9yPChjb25zdCBNYWNoU3ltYm9sRGF0YSAmUkhTKSBjb25zdDsKKyAgfTsKKworICAvLy8gVGhlIHRhcmdldCBzcGVjaWZpYyBNYWNoLU8gd3JpdGVyIGluc3RhbmNlLgorICBzdGQ6OnVuaXF1ZV9wdHI8TUNNYWNoT2JqZWN0VGFyZ2V0V3JpdGVyPiBUYXJnZXRPYmplY3RXcml0ZXI7CisKKyAgLy8vIFxuYW1lIFJlbG9jYXRpb24gRGF0YQorICAvLy8gQHsKKworICBzdHJ1Y3QgUmVsQW5kU3ltYm9sIHsKKyAgICBjb25zdCBNQ1N5bWJvbCAqU3ltOworICAgIE1hY2hPOjphbnlfcmVsb2NhdGlvbl9pbmZvIE1SRTsKKyAgICBSZWxBbmRTeW1ib2woY29uc3QgTUNTeW1ib2wgKlN5bSwgY29uc3QgTWFjaE86OmFueV9yZWxvY2F0aW9uX2luZm8gJk1SRSkKKyAgICAgICAgOiBTeW0oU3ltKSwgTVJFKE1SRSkge30KKyAgfTsKKworICBEZW5zZU1hcDxjb25zdCBNQ1NlY3Rpb24gKiwgc3RkOjp2ZWN0b3I8UmVsQW5kU3ltYm9sPj4gUmVsb2NhdGlvbnM7CisgIERlbnNlTWFwPGNvbnN0IE1DU2VjdGlvbiAqLCB1bnNpZ25lZD4gSW5kaXJlY3RTeW1CYXNlOworCisgIFNlY3Rpb25BZGRyTWFwIFNlY3Rpb25BZGRyZXNzOworCisgIC8vLyBAfQorICAvLy8gXG5hbWUgU3ltYm9sIFRhYmxlIERhdGEKKyAgLy8vIEB7CisKKyAgU3RyaW5nVGFibGVCdWlsZGVyIFN0cmluZ1RhYmxle1N0cmluZ1RhYmxlQnVpbGRlcjo6TWFjaE99OworICBzdGQ6OnZlY3RvcjxNYWNoU3ltYm9sRGF0YT4gTG9jYWxTeW1ib2xEYXRhOworICBzdGQ6OnZlY3RvcjxNYWNoU3ltYm9sRGF0YT4gRXh0ZXJuYWxTeW1ib2xEYXRhOworICBzdGQ6OnZlY3RvcjxNYWNoU3ltYm9sRGF0YT4gVW5kZWZpbmVkU3ltYm9sRGF0YTsKKworICAvLy8gQH0KKworICBNYWNoU3ltYm9sRGF0YSAqZmluZFN5bWJvbERhdGEoY29uc3QgTUNTeW1ib2wgJlN5bSk7CisKK3B1YmxpYzoKKyAgTWFjaE9iamVjdFdyaXRlcihzdGQ6OnVuaXF1ZV9wdHI8TUNNYWNoT2JqZWN0VGFyZ2V0V3JpdGVyPiBNT1RXLAorICAgICAgICAgICAgICAgICAgIHJhd19wd3JpdGVfc3RyZWFtICZPUywgYm9vbCBJc0xpdHRsZUVuZGlhbikKKyAgICAgIDogTUNPYmplY3RXcml0ZXIoT1MsIElzTGl0dGxlRW5kaWFuKSwKKyAgICAgICAgVGFyZ2V0T2JqZWN0V3JpdGVyKHN0ZDo6bW92ZShNT1RXKSkge30KKworICBjb25zdCBNQ1N5bWJvbCAmZmluZEFsaWFzZWRTeW1ib2woY29uc3QgTUNTeW1ib2wgJlN5bSkgY29uc3Q7CisKKyAgLy8vIFxuYW1lIExpZmV0aW1lIG1hbmFnZW1lbnQgTWV0aG9kcworICAvLy8gQHsKKworICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGU7CisKKyAgLy8vIEB9CisKKyAgLy8vIFxuYW1lIFV0aWxpdHkgTWV0aG9kcworICAvLy8gQHsKKworICBib29sIGlzRml4dXBLaW5kUENSZWwoY29uc3QgTUNBc3NlbWJsZXIgJkFzbSwgdW5zaWduZWQgS2luZCk7CisKKyAgU2VjdGlvbkFkZHJNYXAgJmdldFNlY3Rpb25BZGRyZXNzTWFwKCkgeyByZXR1cm4gU2VjdGlvbkFkZHJlc3M7IH0KKworICB1aW50NjRfdCBnZXRTZWN0aW9uQWRkcmVzcyhjb25zdCBNQ1NlY3Rpb24gKlNlYykgY29uc3QgeworICAgIHJldHVybiBTZWN0aW9uQWRkcmVzcy5sb29rdXAoU2VjKTsKKyAgfQorICB1aW50NjRfdCBnZXRTeW1ib2xBZGRyZXNzKGNvbnN0IE1DU3ltYm9sICZTLCBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KSBjb25zdDsKKworICB1aW50NjRfdCBnZXRGcmFnbWVudEFkZHJlc3MoY29uc3QgTUNGcmFnbWVudCAqRnJhZ21lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KSBjb25zdDsKKworICB1aW50NjRfdCBnZXRQYWRkaW5nU2l6ZShjb25zdCBNQ1NlY3Rpb24gKlNELCBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KSBjb25zdDsKKworICBib29sIGRvZXNTeW1ib2xSZXF1aXJlRXh0ZXJuUmVsb2NhdGlvbihjb25zdCBNQ1N5bWJvbCAmUyk7CisKKyAgLy8vIEB9CisKKyAgLy8vIFxuYW1lIFRhcmdldCBXcml0ZXIgUHJveHkgQWNjZXNzb3JzCisgIC8vLyBAeworCisgIGJvb2wgaXM2NEJpdCgpIGNvbnN0IHsgcmV0dXJuIFRhcmdldE9iamVjdFdyaXRlci0+aXM2NEJpdCgpOyB9CisgIGJvb2wgaXNYODZfNjQoKSBjb25zdCB7CisgICAgdWludDMyX3QgQ1BVVHlwZSA9IFRhcmdldE9iamVjdFdyaXRlci0+Z2V0Q1BVVHlwZSgpOworICAgIHJldHVybiBDUFVUeXBlID09IE1hY2hPOjpDUFVfVFlQRV9YODZfNjQ7CisgIH0KKworICAvLy8gQH0KKworICB2b2lkIHdyaXRlSGVhZGVyKE1hY2hPOjpIZWFkZXJGaWxlVHlwZSBUeXBlLCB1bnNpZ25lZCBOdW1Mb2FkQ29tbWFuZHMsCisgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTG9hZENvbW1hbmRzU2l6ZSwgYm9vbCBTdWJzZWN0aW9uc1ZpYVN5bWJvbHMpOworCisgIC8vLyBXcml0ZSBhIHNlZ21lbnQgbG9hZCBjb21tYW5kLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOdW1TZWN0aW9ucyBUaGUgbnVtYmVyIG9mIHNlY3Rpb25zIGluIHRoaXMgc2VnbWVudC4KKyAgLy8vIFxwYXJhbSBTZWN0aW9uRGF0YVNpemUgVGhlIHRvdGFsIHNpemUgb2YgdGhlIHNlY3Rpb25zLgorICB2b2lkIHdyaXRlU2VnbWVudExvYWRDb21tYW5kKFN0cmluZ1JlZiBOYW1lLCB1bnNpZ25lZCBOdW1TZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBWTUFkZHIsIHVpbnQ2NF90IFZNU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTZWN0aW9uRGF0YVN0YXJ0T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNlY3Rpb25EYXRhU2l6ZSwgdWludDMyX3QgTWF4UHJvdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBJbml0UHJvdCk7CisKKyAgdm9pZCB3cml0ZVNlY3Rpb24oY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCwgY29uc3QgTUNTZWN0aW9uICZTZWMsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFZNQWRkciwgdWludDY0X3QgRmlsZU9mZnNldCwgdW5zaWduZWQgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFJlbG9jYXRpb25zU3RhcnQsIHVuc2lnbmVkIE51bVJlbG9jYXRpb25zKTsKKworICB2b2lkIHdyaXRlU3ltdGFiTG9hZENvbW1hbmQodWludDMyX3QgU3ltYm9sT2Zmc2V0LCB1aW50MzJfdCBOdW1TeW1ib2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU3RyaW5nVGFibGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTdHJpbmdUYWJsZVNpemUpOworCisgIHZvaWQgd3JpdGVEeXN5bXRhYkxvYWRDb21tYW5kKAorICAgICAgdWludDMyX3QgRmlyc3RMb2NhbFN5bWJvbCwgdWludDMyX3QgTnVtTG9jYWxTeW1ib2xzLAorICAgICAgdWludDMyX3QgRmlyc3RFeHRlcm5hbFN5bWJvbCwgdWludDMyX3QgTnVtRXh0ZXJuYWxTeW1ib2xzLAorICAgICAgdWludDMyX3QgRmlyc3RVbmRlZmluZWRTeW1ib2wsIHVpbnQzMl90IE51bVVuZGVmaW5lZFN5bWJvbHMsCisgICAgICB1aW50MzJfdCBJbmRpcmVjdFN5bWJvbE9mZnNldCwgdWludDMyX3QgTnVtSW5kaXJlY3RTeW1ib2xzKTsKKworICB2b2lkIHdyaXRlTmxpc3QoTWFjaFN5bWJvbERhdGEgJk1TRCwgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCk7CisKKyAgdm9pZCB3cml0ZUxpbmtlZGl0TG9hZENvbW1hbmQodWludDMyX3QgVHlwZSwgdWludDMyX3QgRGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGF0YVNpemUpOworCisgIHZvaWQgd3JpdGVMaW5rZXJPcHRpb25zTG9hZENvbW1hbmQoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZPcHRpb25zKTsKKworICAvLyBGSVhNRTogV2UgcmVhbGx5IG5lZWQgdG8gaW1wcm92ZSB0aGUgcmVsb2NhdGlvbiB2YWxpZGF0aW9uLiBCYXNpY2FsbHksIHdlCisgIC8vIHdhbnQgdG8gaW1wbGVtZW50IGEgc2VwYXJhdGUgY29tcHV0YXRpb24gd2hpY2ggZXZhbHVhdGVzIHRoZSByZWxvY2F0aW9uCisgIC8vIGVudHJ5IGFzIHRoZSBsaW5rZXIgd291bGQsIGFuZCB2ZXJpZmllcyB0aGF0IHRoZSByZXN1bHRhbnQgZml4dXAgdmFsdWUgaXMKKyAgLy8gZXhhY3RseSB3aGF0IHRoZSBlbmNvZGVyIHdhbnRlZC4gVGhpcyB3aWxsIGNhdGNoIHNldmVyYWwgY2xhc3NlcyBvZgorICAvLyBwcm9ibGVtczoKKyAgLy8KKyAgLy8gIC0gUmVsb2NhdGlvbiBlbnRyeSBidWdzLCB0aGUgdHdvIGFsZ29yaXRobXMgYXJlIHVubGlrZWx5IHRvIGhhdmUgdGhlIHNhbWUKKyAgLy8gICAgZXhhY3QgYnVnLgorICAvLworICAvLyAgLSBSZWxheGF0aW9uIGlzc3Vlcywgd2hlcmUgd2UgZm9yZ2V0IHRvIHJlbGF4IHNvbWV0aGluZy4KKyAgLy8KKyAgLy8gIC0gSW5wdXQgZXJyb3JzLCB3aGVyZSBzb21ldGhpbmcgY2Fubm90IGJlIGNvcnJlY3RseSBlbmNvZGVkLiAnYXMnIGFsbG93cworICAvLyAgICB0aGVzZSB0aHJvdWdoIGluIG1hbnkgY2FzZXMuCisKKyAgLy8gQWRkIGEgcmVsb2NhdGlvbiB0byBiZSBvdXRwdXQgaW4gdGhlIG9iamVjdCBmaWxlLiBBdCB0aGUgdGltZSB0aGlzIGlzCisgIC8vIGNhbGxlZCwgdGhlIHN5bWJvbCBpbmRleGVzIGFyZSBub3Qga25vdywgc28gaWYgdGhlIHJlbG9jYXRpb24gcmVmZXJzCisgIC8vIHRvIGEgc3ltYm9sIGl0IHNob3VsZCBiZSBwYXNzZWQgYXMgXHAgUmVsU3ltYm9sIHNvIHRoYXQgaXQgY2FuIGJlIHVwZGF0ZWQKKyAgLy8gYWZ0ZXJ3YXJkcy4gSWYgdGhlIHJlbG9jYXRpb24gZG9lc24ndCByZWZlciB0byBhIHN5bWJvbCwgbnVsbHB0ciBzaG91bGQgYmUKKyAgLy8gdXNlZC4KKyAgdm9pZCBhZGRSZWxvY2F0aW9uKGNvbnN0IE1DU3ltYm9sICpSZWxTeW1ib2wsIGNvbnN0IE1DU2VjdGlvbiAqU2VjLAorICAgICAgICAgICAgICAgICAgICAgTWFjaE86OmFueV9yZWxvY2F0aW9uX2luZm8gJk1SRSkgeworICAgIFJlbEFuZFN5bWJvbCBQKFJlbFN5bWJvbCwgTVJFKTsKKyAgICBSZWxvY2F0aW9uc1tTZWNdLnB1c2hfYmFjayhQKTsKKyAgfQorCisgIHZvaWQgcmVjb3JkU2NhdHRlcmVkUmVsb2NhdGlvbihjb25zdCBNQ0Fzc2VtYmxlciAmQXNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRnJhZ21lbnQgKkZyYWdtZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGaXh1cCAmRml4dXAsIE1DVmFsdWUgVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTG9nMlNpemUsIHVpbnQ2NF90ICZGaXhlZFZhbHVlKTsKKworICB2b2lkIHJlY29yZFRMVlBSZWxvY2F0aW9uKGNvbnN0IE1DQXNzZW1ibGVyICZBc20sIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGcmFnbWVudCAqRnJhZ21lbnQsIGNvbnN0IE1DRml4dXAgJkZpeHVwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DVmFsdWUgVGFyZ2V0LCB1aW50NjRfdCAmRml4ZWRWYWx1ZSk7CisKKyAgdm9pZCByZWNvcmRSZWxvY2F0aW9uKE1DQXNzZW1ibGVyICZBc20sIGNvbnN0IE1DQXNtTGF5b3V0ICZMYXlvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0ZyYWdtZW50ICpGcmFnbWVudCwgY29uc3QgTUNGaXh1cCAmRml4dXAsCisgICAgICAgICAgICAgICAgICAgICAgICBNQ1ZhbHVlIFRhcmdldCwgdWludDY0X3QgJkZpeGVkVmFsdWUpIG92ZXJyaWRlOworCisgIHZvaWQgYmluZEluZGlyZWN0U3ltYm9scyhNQ0Fzc2VtYmxlciAmQXNtKTsKKworICAvLy8gQ29tcHV0ZSB0aGUgc3ltYm9sIHRhYmxlIGRhdGEuCisgIHZvaWQgY29tcHV0ZVN5bWJvbFRhYmxlKE1DQXNzZW1ibGVyICZBc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPE1hY2hTeW1ib2xEYXRhPiAmTG9jYWxTeW1ib2xEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxNYWNoU3ltYm9sRGF0YT4gJkV4dGVybmFsU3ltYm9sRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8TWFjaFN5bWJvbERhdGE+ICZVbmRlZmluZWRTeW1ib2xEYXRhKTsKKworICB2b2lkIGNvbXB1dGVTZWN0aW9uQWRkcmVzc2VzKGNvbnN0IE1DQXNzZW1ibGVyICZBc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCk7CisKKyAgdm9pZCBleGVjdXRlUG9zdExheW91dEJpbmRpbmcoTUNBc3NlbWJsZXIgJkFzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCkgb3ZlcnJpZGU7CisKKyAgYm9vbCBpc1N5bWJvbFJlZkRpZmZlcmVuY2VGdWxseVJlc29sdmVkSW1wbChjb25zdCBNQ0Fzc2VtYmxlciAmQXNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICZBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICZCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5TZXQpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgaXNTeW1ib2xSZWZEaWZmZXJlbmNlRnVsbHlSZXNvbHZlZEltcGwoY29uc3QgTUNBc3NlbWJsZXIgJkFzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAmU3ltQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0ZyYWdtZW50ICZGQiwgYm9vbCBJblNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzUENSZWwpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgd3JpdGVPYmplY3QoTUNBc3NlbWJsZXIgJkFzbSwgY29uc3QgTUNBc21MYXlvdXQgJkxheW91dCkgb3ZlcnJpZGU7Cit9OworCisvLy8gQ29uc3RydWN0IGEgbmV3IE1hY2gtTyB3cml0ZXIgaW5zdGFuY2UuCisvLy8KKy8vLyBUaGlzIHJvdXRpbmUgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSB0YXJnZXQgd3JpdGVyIHN1YmNsYXNzLgorLy8vCisvLy8gXHBhcmFtIE1PVFcgLSBUaGUgdGFyZ2V0IHNwZWNpZmljIE1hY2gtTyB3cml0ZXIgc3ViY2xhc3MuCisvLy8gXHBhcmFtIE9TIC0gVGhlIHN0cmVhbSB0byB3cml0ZSB0by4KKy8vLyBccmV0dXJucyBUaGUgY29uc3RydWN0ZWQgb2JqZWN0IHdyaXRlci4KK3N0ZDo6dW5pcXVlX3B0cjxNQ09iamVjdFdyaXRlcj4KK2NyZWF0ZU1hY2hPYmplY3RXcml0ZXIoc3RkOjp1bmlxdWVfcHRyPE1DTWFjaE9iamVjdFRhcmdldFdyaXRlcj4gTU9UVywKKyAgICAgICAgICAgICAgICAgICAgICAgcmF3X3B3cml0ZV9zdHJlYW0gJk9TLCBib29sIElzTGl0dGxlRW5kaWFuKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNNQUNIT0JKRUNUV1JJVEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNPYmplY3RGaWxlSW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ09iamVjdEZpbGVJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk5ZjI1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNPYmplY3RGaWxlSW5mby5oCkBAIC0wLDAgKzEsMzgzIEBACisvLz09PS0tIGxsdm0vTUMvTUNPYmplY3RGaWxlSW5mby5oIC0gT2JqZWN0IEZpbGUgSW5mbyAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgY29tbW9uIG9iamVjdCBmaWxlIGZvcm1hdHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DT0JKRUNURklMRUlORk9fSAorI2RlZmluZSBMTFZNX01DX01DT0JKRUNURklMRUlORk9fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvVHJpcGxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvZGVHZW4uaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNTZWN0aW9uOworCitjbGFzcyBNQ09iamVjdEZpbGVJbmZvIHsKK3Byb3RlY3RlZDoKKyAgLy8vIFRydWUgaWYgLmNvbW0gc3VwcG9ydHMgYWxpZ25tZW50LiAgVGhpcyBpcyBhIGhhY2sgZm9yIGFzIGxvbmcgYXMgd2UKKyAgLy8vIHN1cHBvcnQgMTAuNCBUaWdlciwgd2hvc2UgYXNzZW1ibGVyIGRvZXNuJ3Qgc3VwcG9ydCBhbGlnbm1lbnQgb24gY29tbS4KKyAgYm9vbCBDb21tRGlyZWN0aXZlU3VwcG9ydHNBbGlnbm1lbnQ7CisKKyAgLy8vIFRydWUgaWYgdGFyZ2V0IG9iamVjdCBmaWxlIHN1cHBvcnRzIGEgd2Vha19kZWZpbml0aW9uIG9mIGNvbnN0YW50IDAgZm9yIGFuCisgIC8vLyBvbWl0dGVkIEVIIGZyYW1lLgorICBib29sIFN1cHBvcnRzV2Vha09taXR0ZWRFSEZyYW1lOworCisgIC8vLyBUcnVlIGlmIHRoZSB0YXJnZXQgb2JqZWN0IGZpbGUgc3VwcG9ydHMgZW1pdHRpbmcgYSBjb21wYWN0IHVud2luZCBzZWN0aW9uCisgIC8vLyB3aXRob3V0IGFuIGFzc29jaWF0ZWQgRUggZnJhbWUgc2VjdGlvbi4KKyAgYm9vbCBTdXBwb3J0c0NvbXBhY3RVbndpbmRXaXRob3V0RUhGcmFtZTsKKworICAvLy8gT21pdER3YXJmSWZIYXZlQ29tcGFjdFVud2luZCAtIFRydWUgaWYgdGhlIHRhcmdldCBvYmplY3QgZmlsZQorICAvLy8gc3VwcG9ydHMgaGF2aW5nIHNvbWUgZnVuY3Rpb25zIHdpdGggY29tcGFjdCB1bndpbmQgYW5kIG90aGVyIHdpdGgKKyAgLy8vIGR3YXJmIHVud2luZC4KKyAgYm9vbCBPbWl0RHdhcmZJZkhhdmVDb21wYWN0VW53aW5kOworCisgIC8vLyBQZXJzb25hbGl0eUVuY29kaW5nLCBMU0RBRW5jb2RpbmcsIFRUeXBlRW5jb2RpbmcgLSBTb21lIGVuY29kaW5nIHZhbHVlcworICAvLy8gZm9yIEVILgorICB1bnNpZ25lZCBQZXJzb25hbGl0eUVuY29kaW5nOworICB1bnNpZ25lZCBMU0RBRW5jb2Rpbmc7CisgIHVuc2lnbmVkIEZERUNGSUVuY29kaW5nOworICB1bnNpZ25lZCBUVHlwZUVuY29kaW5nOworCisgIC8vLyBDb21wYWN0IHVud2luZCBlbmNvZGluZyBpbmRpY2F0aW5nIHRoYXQgd2Ugc2hvdWxkIGVtaXQgb25seSBhbiBFSCBmcmFtZS4KKyAgdW5zaWduZWQgQ29tcGFjdFVud2luZER3YXJmRUhGcmFtZU9ubHk7CisKKyAgLy8vIFNlY3Rpb24gZGlyZWN0aXZlIGZvciBzdGFuZGFyZCB0ZXh0LgorICBNQ1NlY3Rpb24gKlRleHRTZWN0aW9uOworCisgIC8vLyBTZWN0aW9uIGRpcmVjdGl2ZSBmb3Igc3RhbmRhcmQgZGF0YS4KKyAgTUNTZWN0aW9uICpEYXRhU2VjdGlvbjsKKworICAvLy8gU2VjdGlvbiB0aGF0IGlzIGRlZmF1bHQgaW5pdGlhbGl6ZWQgdG8gemVyby4KKyAgTUNTZWN0aW9uICpCU1NTZWN0aW9uOworCisgIC8vLyBTZWN0aW9uIHRoYXQgaXMgcmVhZG9ubHkgYW5kIGNhbiBjb250YWluIGFyYml0cmFyeSBpbml0aWFsaXplZCBkYXRhLgorICAvLy8gVGFyZ2V0cyBhcmUgbm90IHJlcXVpcmVkIHRvIGhhdmUgYSByZWFkb25seSBzZWN0aW9uLiBJZiB0aGV5IGRvbid0LAorICAvLy8gdmFyaW91cyBiaXRzIG9mIGNvZGUgd2lsbCBmYWxsIGJhY2sgdG8gdXNpbmcgdGhlIGRhdGEgc2VjdGlvbiBmb3IKKyAgLy8vIGNvbnN0YW50cy4KKyAgTUNTZWN0aW9uICpSZWFkT25seVNlY3Rpb247CisKKyAgLy8vIElmIGV4Y2VwdGlvbiBoYW5kbGluZyBpcyBzdXBwb3J0ZWQgYnkgdGhlIHRhcmdldCwgdGhpcyBpcyB0aGUgc2VjdGlvbiB0aGUKKyAgLy8vIExhbmd1YWdlIFNwZWNpZmljIERhdGEgQXJlYSBpbmZvcm1hdGlvbiBpcyBlbWl0dGVkIHRvLgorICBNQ1NlY3Rpb24gKkxTREFTZWN0aW9uOworCisgIC8vLyBJZiBleGNlcHRpb24gaGFuZGxpbmcgaXMgc3VwcG9ydGVkIGJ5IHRoZSB0YXJnZXQgYW5kIHRoZSB0YXJnZXQgY2FuCisgIC8vLyBzdXBwb3J0IGEgY29tcGFjdCByZXByZXNlbnRhdGlvbiBvZiB0aGUgQ0lFIGFuZCBGREUsIHRoaXMgaXMgdGhlIHNlY3Rpb24KKyAgLy8vIHRvIGVtaXQgdGhlbSBpbnRvLgorICBNQ1NlY3Rpb24gKkNvbXBhY3RVbndpbmRTZWN0aW9uOworCisgIC8vIER3YXJmIHNlY3Rpb25zIGZvciBkZWJ1ZyBpbmZvLiAgSWYgYSB0YXJnZXQgc3VwcG9ydHMgZGVidWcgaW5mbywgdGhlc2UgbXVzdAorICAvLyBiZSBzZXQuCisgIE1DU2VjdGlvbiAqRHdhcmZBYmJyZXZTZWN0aW9uOworICBNQ1NlY3Rpb24gKkR3YXJmSW5mb1NlY3Rpb247CisgIE1DU2VjdGlvbiAqRHdhcmZMaW5lU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpEd2FyZkxpbmVTdHJTZWN0aW9uOworICBNQ1NlY3Rpb24gKkR3YXJmRnJhbWVTZWN0aW9uOworICBNQ1NlY3Rpb24gKkR3YXJmUHViVHlwZXNTZWN0aW9uOworICBjb25zdCBNQ1NlY3Rpb24gKkR3YXJmRGVidWdJbmxpbmVTZWN0aW9uOworICBNQ1NlY3Rpb24gKkR3YXJmU3RyU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpEd2FyZkxvY1NlY3Rpb247CisgIE1DU2VjdGlvbiAqRHdhcmZBUmFuZ2VzU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpEd2FyZlJhbmdlc1NlY3Rpb247CisgIE1DU2VjdGlvbiAqRHdhcmZNYWNpbmZvU2VjdGlvbjsKKyAgLy8gVGhlIHB1Ym5hbWVzIHNlY3Rpb24gaXMgbm8gbG9uZ2VyIGdlbmVyYXRlZCBieSBkZWZhdWx0LiAgVGhlIGdlbmVyYXRpb24KKyAgLy8gY2FuIGJlIGVuYWJsZWQgYnkgYSBjb21waWxlciBmbGFnLgorICBNQ1NlY3Rpb24gKkR3YXJmUHViTmFtZXNTZWN0aW9uOworCisgIC8vLyBEV0FSRjUgRXhwZXJpbWVudGFsIERlYnVnIEluZm8gU2VjdGlvbnMKKyAgLy8vIER3YXJmQWNjZWxOYW1lc1NlY3Rpb24sIER3YXJmQWNjZWxPYmpDU2VjdGlvbiwKKyAgLy8vIER3YXJmQWNjZWxOYW1lc3BhY2VTZWN0aW9uLCBEd2FyZkFjY2VsVHlwZXNTZWN0aW9uIC0KKyAgLy8vIElmIHdlIHVzZSB0aGUgRFdBUkYgYWNjZWxlcmF0ZWQgaGFzaCB0YWJsZXMgdGhlbiB3ZSB3YW50IHRvIGVtaXQgdGhlc2UKKyAgLy8vIHNlY3Rpb25zLgorICBNQ1NlY3Rpb24gKkR3YXJmQWNjZWxOYW1lc1NlY3Rpb247CisgIE1DU2VjdGlvbiAqRHdhcmZBY2NlbE9iakNTZWN0aW9uOworICBNQ1NlY3Rpb24gKkR3YXJmQWNjZWxOYW1lc3BhY2VTZWN0aW9uOworICBNQ1NlY3Rpb24gKkR3YXJmQWNjZWxUeXBlc1NlY3Rpb247CisKKyAgLy8gVGhlc2UgYXJlIHVzZWQgZm9yIHRoZSBGaXNzaW9uIHNlcGFyYXRlIGRlYnVnIGluZm9ybWF0aW9uIGZpbGVzLgorICBNQ1NlY3Rpb24gKkR3YXJmSW5mb0RXT1NlY3Rpb247CisgIE1DU2VjdGlvbiAqRHdhcmZUeXBlc0RXT1NlY3Rpb247CisgIE1DU2VjdGlvbiAqRHdhcmZBYmJyZXZEV09TZWN0aW9uOworICBNQ1NlY3Rpb24gKkR3YXJmU3RyRFdPU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpEd2FyZkxpbmVEV09TZWN0aW9uOworICBNQ1NlY3Rpb24gKkR3YXJmTG9jRFdPU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpEd2FyZlN0ck9mZkRXT1NlY3Rpb247CisKKyAgLy8vIFRoZSBEV0FSRiB2NSBzdHJpbmcgb2Zmc2V0IGFuZCBhZGRyZXNzIHRhYmxlIHNlY3Rpb25zLgorICBNQ1NlY3Rpb24gKkR3YXJmU3RyT2ZmU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpEd2FyZkFkZHJTZWN0aW9uOworCisgIC8vIFRoZXNlIGFyZSBmb3IgRmlzc2lvbiBEV1AgZmlsZXMuCisgIE1DU2VjdGlvbiAqRHdhcmZDVUluZGV4U2VjdGlvbjsKKyAgTUNTZWN0aW9uICpEd2FyZlRVSW5kZXhTZWN0aW9uOworCisgIC8vLyBTZWN0aW9uIGZvciBuZXdlciBnbnUgcHVibmFtZXMuCisgIE1DU2VjdGlvbiAqRHdhcmZHbnVQdWJOYW1lc1NlY3Rpb247CisgIC8vLyBTZWN0aW9uIGZvciBuZXdlciBnbnUgcHVidHlwZXMuCisgIE1DU2VjdGlvbiAqRHdhcmZHbnVQdWJUeXBlc1NlY3Rpb247CisKKyAgLy8gU2VjdGlvbiBmb3IgU3dpZnQgQVNUCisgIE1DU2VjdGlvbiAqRHdhcmZTd2lmdEFTVFNlY3Rpb247CisKKyAgTUNTZWN0aW9uICpDT0ZGRGVidWdTeW1ib2xzU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpDT0ZGRGVidWdUeXBlc1NlY3Rpb247CisgIE1DU2VjdGlvbiAqQ09GRkdsb2JhbFR5cGVIYXNoZXNTZWN0aW9uOworCisgIC8vLyBFeHRyYSBUTFMgVmFyaWFibGUgRGF0YSBzZWN0aW9uLgorICAvLy8KKyAgLy8vIElmIHRoZSB0YXJnZXQgbmVlZHMgdG8gcHV0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gZm9yIGEgVExTIHZhcmlhYmxlLAorICAvLy8gaXQnbGwgZ28gaGVyZS4KKyAgTUNTZWN0aW9uICpUTFNFeHRyYURhdGFTZWN0aW9uOworCisgIC8vLyBTZWN0aW9uIGRpcmVjdGl2ZSBmb3IgVGhyZWFkIExvY2FsIGRhdGEuIEVMRiwgTWFjaE8sIENPRkYsIGFuZCBXYXNtLgorICBNQ1NlY3Rpb24gKlRMU0RhdGFTZWN0aW9uOyAvLyBEZWZhdWx0cyB0byAiLnRkYXRhIi4KKworICAvLy8gU2VjdGlvbiBkaXJlY3RpdmUgZm9yIFRocmVhZCBMb2NhbCB1bmluaXRpYWxpemVkIGRhdGEuCisgIC8vLworICAvLy8gTnVsbCBpZiB0aGlzIHRhcmdldCBkb2Vzbid0IHN1cHBvcnQgYSBCU1Mgc2VjdGlvbi4gRUxGIGFuZCBNYWNoTyBvbmx5LgorICBNQ1NlY3Rpb24gKlRMU0JTU1NlY3Rpb247IC8vIERlZmF1bHRzIHRvICIudGJzcyIuCisKKyAgLy8vIFN0YWNrTWFwIHNlY3Rpb24uCisgIE1DU2VjdGlvbiAqU3RhY2tNYXBTZWN0aW9uOworCisgIC8vLyBGYXVsdE1hcCBzZWN0aW9uLgorICBNQ1NlY3Rpb24gKkZhdWx0TWFwU2VjdGlvbjsKKworICAvLy8gRUggZnJhbWUgc2VjdGlvbi4KKyAgLy8vCisgIC8vLyBJdCBpcyBpbml0aWFsaXplZCBvbiBkZW1hbmQgc28gaXQgY2FuIGJlIG92ZXJ3cml0dGVuICh3aXRoIHVuaXF1aW5nKS4KKyAgTUNTZWN0aW9uICpFSEZyYW1lU2VjdGlvbjsKKworICAvLy8gU2VjdGlvbiBjb250YWluaW5nIG1ldGFkYXRhIG9uIGZ1bmN0aW9uIHN0YWNrIHNpemVzLgorICBNQ1NlY3Rpb24gKlN0YWNrU2l6ZXNTZWN0aW9uOworCisgIC8vIEVMRiBzcGVjaWZpYyBzZWN0aW9ucy4KKyAgTUNTZWN0aW9uICpEYXRhUmVsUk9TZWN0aW9uOworICBNQ1NlY3Rpb24gKk1lcmdlYWJsZUNvbnN0NFNlY3Rpb247CisgIE1DU2VjdGlvbiAqTWVyZ2VhYmxlQ29uc3Q4U2VjdGlvbjsKKyAgTUNTZWN0aW9uICpNZXJnZWFibGVDb25zdDE2U2VjdGlvbjsKKyAgTUNTZWN0aW9uICpNZXJnZWFibGVDb25zdDMyU2VjdGlvbjsKKworICAvLyBNYWNoTyBzcGVjaWZpYyBzZWN0aW9ucy4KKworICAvLy8gU2VjdGlvbiBmb3IgdGhyZWFkIGxvY2FsIHN0cnVjdHVyZSBpbmZvcm1hdGlvbi4KKyAgLy8vCisgIC8vLyBDb250YWlucyB0aGUgc291cmNlIGNvZGUgbmFtZSBvZiB0aGUgdmFyaWFibGUsIHZpc2liaWxpdHkgYW5kIGEgcG9pbnRlciB0bworICAvLy8gdGhlIGluaXRpYWwgdmFsdWUgKC50ZGF0YSBvciAudGJzcykuCisgIE1DU2VjdGlvbiAqVExTVExWU2VjdGlvbjsgLy8gRGVmYXVsdHMgdG8gIi50bHYiLgorCisgIC8vLyBTZWN0aW9uIGZvciB0aHJlYWQgbG9jYWwgZGF0YSBpbml0aWFsaXphdGlvbiBmdW5jdGlvbnMuCisgIGNvbnN0IE1DU2VjdGlvbiAqVExTVGhyZWFkSW5pdFNlY3Rpb247IC8vIERlZmF1bHRzIHRvICIudGhyZWFkX2luaXRfZnVuYyIuCisKKyAgTUNTZWN0aW9uICpDU3RyaW5nU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpVU3RyaW5nU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpUZXh0Q29hbFNlY3Rpb247CisgIE1DU2VjdGlvbiAqQ29uc3RUZXh0Q29hbFNlY3Rpb247CisgIE1DU2VjdGlvbiAqQ29uc3REYXRhU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpEYXRhQ29hbFNlY3Rpb247CisgIE1DU2VjdGlvbiAqRGF0YUNvbW1vblNlY3Rpb247CisgIE1DU2VjdGlvbiAqRGF0YUJTU1NlY3Rpb247CisgIE1DU2VjdGlvbiAqRm91ckJ5dGVDb25zdGFudFNlY3Rpb247CisgIE1DU2VjdGlvbiAqRWlnaHRCeXRlQ29uc3RhbnRTZWN0aW9uOworICBNQ1NlY3Rpb24gKlNpeHRlZW5CeXRlQ29uc3RhbnRTZWN0aW9uOworICBNQ1NlY3Rpb24gKkxhenlTeW1ib2xQb2ludGVyU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpOb25MYXp5U3ltYm9sUG9pbnRlclNlY3Rpb247CisgIE1DU2VjdGlvbiAqVGhyZWFkTG9jYWxQb2ludGVyU2VjdGlvbjsKKworICAvLy8gQ09GRiBzcGVjaWZpYyBzZWN0aW9ucy4KKyAgTUNTZWN0aW9uICpEcmVjdHZlU2VjdGlvbjsKKyAgTUNTZWN0aW9uICpQRGF0YVNlY3Rpb247CisgIE1DU2VjdGlvbiAqWERhdGFTZWN0aW9uOworICBNQ1NlY3Rpb24gKlNYRGF0YVNlY3Rpb247CisgIE1DU2VjdGlvbiAqR0ZJRHNTZWN0aW9uOworCitwdWJsaWM6CisgIHZvaWQgSW5pdE1DT2JqZWN0RmlsZUluZm8oY29uc3QgVHJpcGxlICZUVCwgYm9vbCBQSUMsIE1DQ29udGV4dCAmY3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTGFyZ2VDb2RlTW9kZWwgPSBmYWxzZSk7CisKKyAgYm9vbCBnZXRTdXBwb3J0c1dlYWtPbWl0dGVkRUhGcmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3VwcG9ydHNXZWFrT21pdHRlZEVIRnJhbWU7CisgIH0KKyAgYm9vbCBnZXRTdXBwb3J0c0NvbXBhY3RVbndpbmRXaXRob3V0RUhGcmFtZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3VwcG9ydHNDb21wYWN0VW53aW5kV2l0aG91dEVIRnJhbWU7CisgIH0KKyAgYm9vbCBnZXRPbWl0RHdhcmZJZkhhdmVDb21wYWN0VW53aW5kKCkgY29uc3QgeworICAgIHJldHVybiBPbWl0RHdhcmZJZkhhdmVDb21wYWN0VW53aW5kOworICB9CisKKyAgYm9vbCBnZXRDb21tRGlyZWN0aXZlU3VwcG9ydHNBbGlnbm1lbnQoKSBjb25zdCB7CisgICAgcmV0dXJuIENvbW1EaXJlY3RpdmVTdXBwb3J0c0FsaWdubWVudDsKKyAgfQorCisgIHVuc2lnbmVkIGdldFBlcnNvbmFsaXR5RW5jb2RpbmcoKSBjb25zdCB7IHJldHVybiBQZXJzb25hbGl0eUVuY29kaW5nOyB9CisgIHVuc2lnbmVkIGdldExTREFFbmNvZGluZygpIGNvbnN0IHsgcmV0dXJuIExTREFFbmNvZGluZzsgfQorICB1bnNpZ25lZCBnZXRGREVFbmNvZGluZygpIGNvbnN0IHsgcmV0dXJuIEZERUNGSUVuY29kaW5nOyB9CisgIHVuc2lnbmVkIGdldFRUeXBlRW5jb2RpbmcoKSBjb25zdCB7IHJldHVybiBUVHlwZUVuY29kaW5nOyB9CisKKyAgdW5zaWduZWQgZ2V0Q29tcGFjdFVud2luZER3YXJmRUhGcmFtZU9ubHkoKSBjb25zdCB7CisgICAgcmV0dXJuIENvbXBhY3RVbndpbmREd2FyZkVIRnJhbWVPbmx5OworICB9CisKKyAgTUNTZWN0aW9uICpnZXRUZXh0U2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIFRleHRTZWN0aW9uOyB9CisgIE1DU2VjdGlvbiAqZ2V0RGF0YVNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEYXRhU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldEJTU1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBCU1NTZWN0aW9uOyB9CisgIE1DU2VjdGlvbiAqZ2V0UmVhZE9ubHlTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gUmVhZE9ubHlTZWN0aW9uOyB9CisgIE1DU2VjdGlvbiAqZ2V0TFNEQVNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBMU0RBU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldENvbXBhY3RVbndpbmRTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gQ29tcGFjdFVud2luZFNlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZkFiYnJldlNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEd2FyZkFiYnJldlNlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZkluZm9TZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZJbmZvU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldER3YXJmTGluZVNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEd2FyZkxpbmVTZWN0aW9uOyB9CisgIE1DU2VjdGlvbiAqZ2V0RHdhcmZMaW5lU3RyU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER3YXJmTGluZVN0clNlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZkZyYW1lU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER3YXJmRnJhbWVTZWN0aW9uOyB9CisgIE1DU2VjdGlvbiAqZ2V0RHdhcmZQdWJOYW1lc1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEd2FyZlB1Yk5hbWVzU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldER3YXJmUHViVHlwZXNTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZQdWJUeXBlc1NlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZkdudVB1Yk5hbWVzU2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gRHdhcmZHbnVQdWJOYW1lc1NlY3Rpb247CisgIH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZkdudVB1YlR5cGVzU2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gRHdhcmZHbnVQdWJUeXBlc1NlY3Rpb247CisgIH0KKyAgY29uc3QgTUNTZWN0aW9uICpnZXREd2FyZkRlYnVnSW5saW5lU2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gRHdhcmZEZWJ1Z0lubGluZVNlY3Rpb247CisgIH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZlN0clNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEd2FyZlN0clNlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZkxvY1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEd2FyZkxvY1NlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZkFSYW5nZXNTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZBUmFuZ2VzU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldER3YXJmUmFuZ2VzU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER3YXJmUmFuZ2VzU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldER3YXJmTWFjaW5mb1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEd2FyZk1hY2luZm9TZWN0aW9uOyB9CisKKyAgLy8gRFdBUkY1IEV4cGVyaW1lbnRhbCBEZWJ1ZyBJbmZvIFNlY3Rpb25zCisgIE1DU2VjdGlvbiAqZ2V0RHdhcmZBY2NlbE5hbWVzU2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gRHdhcmZBY2NlbE5hbWVzU2VjdGlvbjsKKyAgfQorICBNQ1NlY3Rpb24gKmdldER3YXJmQWNjZWxPYmpDU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER3YXJmQWNjZWxPYmpDU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldER3YXJmQWNjZWxOYW1lc3BhY2VTZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBEd2FyZkFjY2VsTmFtZXNwYWNlU2VjdGlvbjsKKyAgfQorICBNQ1NlY3Rpb24gKmdldER3YXJmQWNjZWxUeXBlc1NlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIER3YXJmQWNjZWxUeXBlc1NlY3Rpb247CisgIH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZkluZm9EV09TZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZJbmZvRFdPU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldER3YXJmVHlwZXNTZWN0aW9uKHVpbnQ2NF90IEhhc2gpIGNvbnN0OworICBNQ1NlY3Rpb24gKmdldER3YXJmVHlwZXNEV09TZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZUeXBlc0RXT1NlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZkFiYnJldkRXT1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEd2FyZkFiYnJldkRXT1NlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZlN0ckRXT1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEd2FyZlN0ckRXT1NlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZkxpbmVEV09TZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZMaW5lRFdPU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldER3YXJmTG9jRFdPU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER3YXJmTG9jRFdPU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldER3YXJmU3RyT2ZmRFdPU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER3YXJmU3RyT2ZmRFdPU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldER3YXJmU3RyT2ZmU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER3YXJmU3RyT2ZmU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldER3YXJmQWRkclNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEd2FyZkFkZHJTZWN0aW9uOyB9CisgIE1DU2VjdGlvbiAqZ2V0RHdhcmZDVUluZGV4U2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIER3YXJmQ1VJbmRleFNlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREd2FyZlRVSW5kZXhTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZUVUluZGV4U2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldER3YXJmU3dpZnRBU1RTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRHdhcmZTd2lmdEFTVFNlY3Rpb247IH0KKworICBNQ1NlY3Rpb24gKmdldENPRkZEZWJ1Z1N5bWJvbHNTZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBDT0ZGRGVidWdTeW1ib2xzU2VjdGlvbjsKKyAgfQorICBNQ1NlY3Rpb24gKmdldENPRkZEZWJ1Z1R5cGVzU2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gQ09GRkRlYnVnVHlwZXNTZWN0aW9uOworICB9CisgIE1DU2VjdGlvbiAqZ2V0Q09GRkdsb2JhbFR5cGVIYXNoZXNTZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBDT0ZGR2xvYmFsVHlwZUhhc2hlc1NlY3Rpb247CisgIH0KKworICBNQ1NlY3Rpb24gKmdldFRMU0V4dHJhRGF0YVNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBUTFNFeHRyYURhdGFTZWN0aW9uOyB9CisgIGNvbnN0IE1DU2VjdGlvbiAqZ2V0VExTRGF0YVNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBUTFNEYXRhU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldFRMU0JTU1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBUTFNCU1NTZWN0aW9uOyB9CisKKyAgTUNTZWN0aW9uICpnZXRTdGFja01hcFNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBTdGFja01hcFNlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXRGYXVsdE1hcFNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBGYXVsdE1hcFNlY3Rpb247IH0KKworICBNQ1NlY3Rpb24gKmdldFN0YWNrU2l6ZXNTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gU3RhY2tTaXplc1NlY3Rpb247IH0KKworICAvLyBFTEYgc3BlY2lmaWMgc2VjdGlvbnMuCisgIE1DU2VjdGlvbiAqZ2V0RGF0YVJlbFJPU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIERhdGFSZWxST1NlY3Rpb247IH0KKyAgY29uc3QgTUNTZWN0aW9uICpnZXRNZXJnZWFibGVDb25zdDRTZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBNZXJnZWFibGVDb25zdDRTZWN0aW9uOworICB9CisgIGNvbnN0IE1DU2VjdGlvbiAqZ2V0TWVyZ2VhYmxlQ29uc3Q4U2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gTWVyZ2VhYmxlQ29uc3Q4U2VjdGlvbjsKKyAgfQorICBjb25zdCBNQ1NlY3Rpb24gKmdldE1lcmdlYWJsZUNvbnN0MTZTZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBNZXJnZWFibGVDb25zdDE2U2VjdGlvbjsKKyAgfQorICBjb25zdCBNQ1NlY3Rpb24gKmdldE1lcmdlYWJsZUNvbnN0MzJTZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBNZXJnZWFibGVDb25zdDMyU2VjdGlvbjsKKyAgfQorCisgIC8vIE1hY2hPIHNwZWNpZmljIHNlY3Rpb25zLgorICBjb25zdCBNQ1NlY3Rpb24gKmdldFRMU1RMVlNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBUTFNUTFZTZWN0aW9uOyB9CisgIGNvbnN0IE1DU2VjdGlvbiAqZ2V0VExTVGhyZWFkSW5pdFNlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIFRMU1RocmVhZEluaXRTZWN0aW9uOworICB9CisgIGNvbnN0IE1DU2VjdGlvbiAqZ2V0Q1N0cmluZ1NlY3Rpb24oKSBjb25zdCB7IHJldHVybiBDU3RyaW5nU2VjdGlvbjsgfQorICBjb25zdCBNQ1NlY3Rpb24gKmdldFVTdHJpbmdTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gVVN0cmluZ1NlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXRUZXh0Q29hbFNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBUZXh0Q29hbFNlY3Rpb247IH0KKyAgY29uc3QgTUNTZWN0aW9uICpnZXRDb25zdFRleHRDb2FsU2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RUZXh0Q29hbFNlY3Rpb247CisgIH0KKyAgY29uc3QgTUNTZWN0aW9uICpnZXRDb25zdERhdGFTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gQ29uc3REYXRhU2VjdGlvbjsgfQorICBjb25zdCBNQ1NlY3Rpb24gKmdldERhdGFDb2FsU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIERhdGFDb2FsU2VjdGlvbjsgfQorICBjb25zdCBNQ1NlY3Rpb24gKmdldERhdGFDb21tb25TZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gRGF0YUNvbW1vblNlY3Rpb247IH0KKyAgTUNTZWN0aW9uICpnZXREYXRhQlNTU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIERhdGFCU1NTZWN0aW9uOyB9CisgIGNvbnN0IE1DU2VjdGlvbiAqZ2V0Rm91ckJ5dGVDb25zdGFudFNlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIEZvdXJCeXRlQ29uc3RhbnRTZWN0aW9uOworICB9CisgIGNvbnN0IE1DU2VjdGlvbiAqZ2V0RWlnaHRCeXRlQ29uc3RhbnRTZWN0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBFaWdodEJ5dGVDb25zdGFudFNlY3Rpb247CisgIH0KKyAgY29uc3QgTUNTZWN0aW9uICpnZXRTaXh0ZWVuQnl0ZUNvbnN0YW50U2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gU2l4dGVlbkJ5dGVDb25zdGFudFNlY3Rpb247CisgIH0KKyAgTUNTZWN0aW9uICpnZXRMYXp5U3ltYm9sUG9pbnRlclNlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIExhenlTeW1ib2xQb2ludGVyU2VjdGlvbjsKKyAgfQorICBNQ1NlY3Rpb24gKmdldE5vbkxhenlTeW1ib2xQb2ludGVyU2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gTm9uTGF6eVN5bWJvbFBvaW50ZXJTZWN0aW9uOworICB9CisgIE1DU2VjdGlvbiAqZ2V0VGhyZWFkTG9jYWxQb2ludGVyU2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gVGhyZWFkTG9jYWxQb2ludGVyU2VjdGlvbjsKKyAgfQorCisgIC8vIENPRkYgc3BlY2lmaWMgc2VjdGlvbnMuCisgIE1DU2VjdGlvbiAqZ2V0RHJlY3R2ZVNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBEcmVjdHZlU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldFBEYXRhU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIFBEYXRhU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldFhEYXRhU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuIFhEYXRhU2VjdGlvbjsgfQorICBNQ1NlY3Rpb24gKmdldFNYRGF0YVNlY3Rpb24oKSBjb25zdCB7IHJldHVybiBTWERhdGFTZWN0aW9uOyB9CisgIE1DU2VjdGlvbiAqZ2V0R0ZJRHNTZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gR0ZJRHNTZWN0aW9uOyB9CisKKyAgTUNTZWN0aW9uICpnZXRFSEZyYW1lU2VjdGlvbigpIHsKKyAgICByZXR1cm4gRUhGcmFtZVNlY3Rpb247CisgIH0KKworICBlbnVtIEVudmlyb25tZW50IHsgSXNNYWNoTywgSXNFTEYsIElzQ09GRiwgSXNXYXNtIH07CisgIEVudmlyb25tZW50IGdldE9iamVjdEZpbGVUeXBlKCkgY29uc3QgeyByZXR1cm4gRW52OyB9CisKKyAgYm9vbCBpc1Bvc2l0aW9uSW5kZXBlbmRlbnQoKSBjb25zdCB7IHJldHVybiBQb3NpdGlvbkluZGVwZW5kZW50OyB9CisKK3ByaXZhdGU6CisgIEVudmlyb25tZW50IEVudjsKKyAgYm9vbCBQb3NpdGlvbkluZGVwZW5kZW50OworICBNQ0NvbnRleHQgKkN0eDsKKyAgVHJpcGxlIFRUOworCisgIHZvaWQgaW5pdE1hY2hPTUNPYmplY3RGaWxlSW5mbyhjb25zdCBUcmlwbGUgJlQpOworICB2b2lkIGluaXRFTEZNQ09iamVjdEZpbGVJbmZvKGNvbnN0IFRyaXBsZSAmVCwgYm9vbCBMYXJnZSk7CisgIHZvaWQgaW5pdENPRkZNQ09iamVjdEZpbGVJbmZvKGNvbnN0IFRyaXBsZSAmVCk7CisgIHZvaWQgaW5pdFdhc21NQ09iamVjdEZpbGVJbmZvKGNvbnN0IFRyaXBsZSAmVCk7CisKK3B1YmxpYzoKKyAgY29uc3QgVHJpcGxlICZnZXRUYXJnZXRUcmlwbGUoKSBjb25zdCB7IHJldHVybiBUVDsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DT2JqZWN0U3RyZWFtZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNPYmplY3RTdHJlYW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlOWI0YWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DT2JqZWN0U3RyZWFtZXIuaApAQCAtMCwwICsxLDE5MCBAQAorLy89PT0tIE1DT2JqZWN0U3RyZWFtZXIuaCAtIE1DU3RyZWFtZXIgT2JqZWN0IEZpbGUgSW50ZXJmYWNlIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DT0JKRUNUU1RSRUFNRVJfSAorI2RlZmluZSBMTFZNX01DX01DT0JKRUNUU1RSRUFNRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DQXNzZW1ibGVyLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NlY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU3RyZWFtZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTUNBc3NlbWJsZXI7CitjbGFzcyBNQ0NvZGVFbWl0dGVyOworY2xhc3MgTUNTdWJ0YXJnZXRJbmZvOworY2xhc3MgTUNFeHByOworY2xhc3MgTUNGcmFnbWVudDsKK2NsYXNzIE1DRGF0YUZyYWdtZW50OworY2xhc3MgTUNBc21CYWNrZW5kOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyByYXdfcHdyaXRlX3N0cmVhbTsKKworLy8vIFxicmllZiBTdHJlYW1pbmcgb2JqZWN0IGZpbGUgZ2VuZXJhdGlvbiBpbnRlcmZhY2UuCisvLy8KKy8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZSBNQ1N0cmVhbWVyIGludGVyZmFjZSB3aGljaCBpcworLy8vIHN1aXRhYmxlIGZvciB1c2Ugd2l0aCB0aGUgYXNzZW1ibGVyIGJhY2tlbmQuIFNwZWNpZmljIG9iamVjdCBmaWxlIGZvcm1hdHMKKy8vLyBhcmUgZXhwZWN0ZWQgdG8gc3ViY2xhc3MgdGhpcyBpbnRlcmZhY2UgdG8gaW1wbGVtZW50IGRpcmVjdGl2ZXMgc3BlY2lmaWMKKy8vLyB0byB0aGF0IGZpbGUgZm9ybWF0IG9yIGN1c3RvbSBzZW1hbnRpY3MgZXhwZWN0ZWQgYnkgdGhlIG9iamVjdCB3cml0ZXIKKy8vLyBpbXBsZW1lbnRhdGlvbi4KK2NsYXNzIE1DT2JqZWN0U3RyZWFtZXIgOiBwdWJsaWMgTUNTdHJlYW1lciB7CisgIHN0ZDo6dW5pcXVlX3B0cjxNQ09iamVjdFdyaXRlcj4gT2JqZWN0V3JpdGVyOworICBzdGQ6OnVuaXF1ZV9wdHI8TUNBc21CYWNrZW5kPiBUQUI7CisgIHN0ZDo6dW5pcXVlX3B0cjxNQ0NvZGVFbWl0dGVyPiBFbWl0dGVyOworICBzdGQ6OnVuaXF1ZV9wdHI8TUNBc3NlbWJsZXI+IEFzc2VtYmxlcjsKKyAgTUNTZWN0aW9uOjppdGVyYXRvciBDdXJJbnNlcnRpb25Qb2ludDsKKyAgYm9vbCBFbWl0RUhGcmFtZTsKKyAgYm9vbCBFbWl0RGVidWdGcmFtZTsKKyAgU21hbGxWZWN0b3I8TUNTeW1ib2wgKiwgMj4gUGVuZGluZ0xhYmVsczsKKworICB2aXJ0dWFsIHZvaWQgRW1pdEluc3RUb0RhdGEoY29uc3QgTUNJbnN0ICZJbnN0LCBjb25zdCBNQ1N1YnRhcmdldEluZm8mKSA9IDA7CisgIHZvaWQgRW1pdENGSVN0YXJ0UHJvY0ltcGwoTUNEd2FyZkZyYW1lSW5mbyAmRnJhbWUpIG92ZXJyaWRlOworICB2b2lkIEVtaXRDRklFbmRQcm9jSW1wbChNQ0R3YXJmRnJhbWVJbmZvICZGcmFtZSkgb3ZlcnJpZGU7CisgIE1DU3ltYm9sICpFbWl0Q0ZJTGFiZWwoKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0SW5zdHJ1Y3Rpb25JbXBsKGNvbnN0IE1DSW5zdCAmSW5zdCwgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZTVEkpOworCitwcm90ZWN0ZWQ6CisgIE1DT2JqZWN0U3RyZWFtZXIoTUNDb250ZXh0ICZDb250ZXh0LCBzdGQ6OnVuaXF1ZV9wdHI8TUNBc21CYWNrZW5kPiBUQUIsCisgICAgICAgICAgICAgICAgICAgcmF3X3B3cml0ZV9zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNQ0NvZGVFbWl0dGVyPiBFbWl0dGVyKTsKKyAgfk1DT2JqZWN0U3RyZWFtZXIoKTsKKworcHVibGljOgorICAvLy8gc3RhdGUgbWFuYWdlbWVudAorICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGU7CisKKyAgLy8vIE9iamVjdCBzdHJlYW1lcnMgcmVxdWlyZSB0aGUgaW50ZWdyYXRlZCBhc3NlbWJsZXIuCisgIGJvb2wgaXNJbnRlZ3JhdGVkQXNzZW1ibGVyUmVxdWlyZWQoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisKKyAgdm9pZCBFbWl0RnJhbWVzKE1DQXNtQmFja2VuZCAqTUFCKTsKKyAgdm9pZCBFbWl0Q0ZJU2VjdGlvbnMoYm9vbCBFSCwgYm9vbCBEZWJ1Zykgb3ZlcnJpZGU7CisKKyAgTUNGcmFnbWVudCAqZ2V0Q3VycmVudEZyYWdtZW50KCkgY29uc3Q7CisKKyAgdm9pZCBpbnNlcnQoTUNGcmFnbWVudCAqRikgeworICAgIGZsdXNoUGVuZGluZ0xhYmVscyhGKTsKKyAgICBNQ1NlY3Rpb24gKkN1clNlY3Rpb24gPSBnZXRDdXJyZW50U2VjdGlvbk9ubHkoKTsKKyAgICBDdXJTZWN0aW9uLT5nZXRGcmFnbWVudExpc3QoKS5pbnNlcnQoQ3VySW5zZXJ0aW9uUG9pbnQsIEYpOworICAgIEYtPnNldFBhcmVudChDdXJTZWN0aW9uKTsKKyAgfQorCisgIC8vLyBHZXQgYSBkYXRhIGZyYWdtZW50IHRvIHdyaXRlIGludG8sIGNyZWF0aW5nIGEgbmV3IG9uZSBpZiB0aGUgY3VycmVudAorICAvLy8gZnJhZ21lbnQgaXMgbm90IGEgZGF0YSBmcmFnbWVudC4KKyAgTUNEYXRhRnJhZ21lbnQgKmdldE9yQ3JlYXRlRGF0YUZyYWdtZW50KCk7CisgIE1DUGFkZGluZ0ZyYWdtZW50ICpnZXRPckNyZWF0ZVBhZGRpbmdGcmFnbWVudCgpOworCitwcm90ZWN0ZWQ6CisgIGJvb2wgY2hhbmdlU2VjdGlvbkltcGwoTUNTZWN0aW9uICpTZWN0aW9uLCBjb25zdCBNQ0V4cHIgKlN1YnNlY3Rpb24pOworCisgIC8vLyBJZiBhbnkgbGFiZWxzIGhhdmUgYmVlbiBlbWl0dGVkIGJ1dCBub3QgYXNzaWduZWQgZnJhZ21lbnRzLCBlbnN1cmUgdGhhdAorICAvLy8gdGhleSBnZXQgYXNzaWduZWQsIGVpdGhlciB0byBGIGlmIHBvc3NpYmxlIG9yIHRvIGEgbmV3IGRhdGEgZnJhZ21lbnQuCisgIC8vLyBPcHRpb25hbGx5LCBpdCBpcyBhbHNvIHBvc3NpYmxlIHRvIHByb3ZpZGUgYW4gb2Zmc2V0IFxwIEZPZmZzZXQsIHdoaWNoCisgIC8vLyB3aWxsIGJlIHVzZWQgYXMgYSBzeW1ib2wgb2Zmc2V0IHdpdGhpbiB0aGUgZnJhZ21lbnQuCisgIHZvaWQgZmx1c2hQZW5kaW5nTGFiZWxzKE1DRnJhZ21lbnQgKkYsIHVpbnQ2NF90IEZPZmZzZXQgPSAwKTsKKworcHVibGljOgorICB2b2lkIHZpc2l0VXNlZFN5bWJvbChjb25zdCBNQ1N5bWJvbCAmU3ltKSBvdmVycmlkZTsKKworICBNQ0Fzc2VtYmxlciAmZ2V0QXNzZW1ibGVyKCkgeyByZXR1cm4gKkFzc2VtYmxlcjsgfQorCisgIC8vLyBcbmFtZSBNQ1N0cmVhbWVyIEludGVyZmFjZQorICAvLy8gQHsKKworICB2b2lkIEVtaXRMYWJlbChNQ1N5bWJvbCAqU3ltYm9sLCBTTUxvYyBMb2MgPSBTTUxvYygpKSBvdmVycmlkZTsKKyAgdmlydHVhbCB2b2lkIEVtaXRMYWJlbChNQ1N5bWJvbCAqU3ltYm9sLCBTTUxvYyBMb2MsIE1DRnJhZ21lbnQgKkYpOworICB2b2lkIEVtaXRBc3NpZ25tZW50KE1DU3ltYm9sICpTeW1ib2wsIGNvbnN0IE1DRXhwciAqVmFsdWUpIG92ZXJyaWRlOworICB2b2lkIEVtaXRWYWx1ZUltcGwoY29uc3QgTUNFeHByICpWYWx1ZSwgdW5zaWduZWQgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIFNNTG9jIExvYyA9IFNNTG9jKCkpIG92ZXJyaWRlOworICB2b2lkIEVtaXRVTEVCMTI4VmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdFNMRUIxMjhWYWx1ZShjb25zdCBNQ0V4cHIgKlZhbHVlKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0V2Vha1JlZmVyZW5jZShNQ1N5bWJvbCAqQWxpYXMsIGNvbnN0IE1DU3ltYm9sICpTeW1ib2wpIG92ZXJyaWRlOworICB2b2lkIENoYW5nZVNlY3Rpb24oTUNTZWN0aW9uICpTZWN0aW9uLCBjb25zdCBNQ0V4cHIgKlN1YnNlY3Rpb24pIG92ZXJyaWRlOworICB2b2lkIEVtaXRJbnN0cnVjdGlvbihjb25zdCBNQ0luc3QgJkluc3QsIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU1RJLAorICAgICAgICAgICAgICAgICAgICAgICBib29sID0gZmFsc2UpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgRW1pdCBhbiBpbnN0cnVjdGlvbiB0byBhIHNwZWNpYWwgZnJhZ21lbnQsIGJlY2F1c2UgdGhpcyBpbnN0cnVjdGlvbgorICAvLy8gY2FuIGNoYW5nZSBpdHMgc2l6ZSBkdXJpbmcgcmVsYXhhdGlvbi4KKyAgdmlydHVhbCB2b2lkIEVtaXRJbnN0VG9GcmFnbWVudChjb25zdCBNQ0luc3QgJkluc3QsIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmKTsKKworICB2b2lkIEVtaXRCdW5kbGVBbGlnbk1vZGUodW5zaWduZWQgQWxpZ25Qb3cyKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0QnVuZGxlTG9jayhib29sIEFsaWduVG9FbmQpIG92ZXJyaWRlOworICB2b2lkIEVtaXRCdW5kbGVVbmxvY2soKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0Qnl0ZXMoU3RyaW5nUmVmIERhdGEpIG92ZXJyaWRlOworICB2b2lkIEVtaXRWYWx1ZVRvQWxpZ25tZW50KHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQsIGludDY0X3QgVmFsdWUgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFZhbHVlU2l6ZSA9IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF4Qnl0ZXNUb0VtaXQgPSAwKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0Q29kZUFsaWdubWVudCh1bnNpZ25lZCBCeXRlQWxpZ25tZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1heEJ5dGVzVG9FbWl0ID0gMCkgb3ZlcnJpZGU7CisgIHZvaWQgZW1pdFZhbHVlVG9PZmZzZXQoY29uc3QgTUNFeHByICpPZmZzZXQsIHVuc2lnbmVkIGNoYXIgVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgU01Mb2MgTG9jKSBvdmVycmlkZTsKKyAgdm9pZAorICBFbWl0Q29kZVBhZGRpbmdCYXNpY0Jsb2NrU3RhcnQoY29uc3QgTUNDb2RlUGFkZGluZ0NvbnRleHQgJkNvbnRleHQpIG92ZXJyaWRlOworICB2b2lkCisgIEVtaXRDb2RlUGFkZGluZ0Jhc2ljQmxvY2tFbmQoY29uc3QgTUNDb2RlUGFkZGluZ0NvbnRleHQgJkNvbnRleHQpIG92ZXJyaWRlOworICB2b2lkIEVtaXREd2FyZkxvY0RpcmVjdGl2ZSh1bnNpZ25lZCBGaWxlTm8sIHVuc2lnbmVkIExpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbHVtbiwgdW5zaWduZWQgRmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIElzYSwgdW5zaWduZWQgRGlzY3JpbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVOYW1lKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0RHdhcmZBZHZhbmNlTGluZUFkZHIoaW50NjRfdCBMaW5lRGVsdGEsIGNvbnN0IE1DU3ltYm9sICpMYXN0TGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICpMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUG9pbnRlclNpemUpOworICB2b2lkIEVtaXREd2FyZkFkdmFuY2VGcmFtZUFkZHIoY29uc3QgTUNTeW1ib2wgKkxhc3RMYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICpMYWJlbCk7CisgIHZvaWQgRW1pdENWTG9jRGlyZWN0aXZlKHVuc2lnbmVkIEZ1bmN0aW9uSWQsIHVuc2lnbmVkIEZpbGVObywgdW5zaWduZWQgTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ29sdW1uLCBib29sIFByb2xvZ3VlRW5kLCBib29sIElzU3RtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVOYW1lLCBTTUxvYyBMb2MpIG92ZXJyaWRlOworICB2b2lkIEVtaXRDVkxpbmV0YWJsZURpcmVjdGl2ZSh1bnNpZ25lZCBGdW5jdGlvbklkLCBjb25zdCBNQ1N5bWJvbCAqQmVnaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICpFbmQpIG92ZXJyaWRlOworICB2b2lkIEVtaXRDVklubGluZUxpbmV0YWJsZURpcmVjdGl2ZSh1bnNpZ25lZCBQcmltYXJ5RnVuY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU291cmNlRmlsZUlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTb3VyY2VMaW5lTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqRm5TdGFydFN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKkZuRW5kU3ltKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0Q1ZEZWZSYW5nZURpcmVjdGl2ZSgKKyAgICAgIEFycmF5UmVmPHN0ZDo6cGFpcjxjb25zdCBNQ1N5bWJvbCAqLCBjb25zdCBNQ1N5bWJvbCAqPj4gUmFuZ2VzLAorICAgICAgU3RyaW5nUmVmIEZpeGVkU2l6ZVBvcnRpb24pIG92ZXJyaWRlOworICB2b2lkIEVtaXRDVlN0cmluZ1RhYmxlRGlyZWN0aXZlKCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdENWRmlsZUNoZWNrc3Vtc0RpcmVjdGl2ZSgpIG92ZXJyaWRlOworICB2b2lkIEVtaXRDVkZpbGVDaGVja3N1bU9mZnNldERpcmVjdGl2ZSh1bnNpZ25lZCBGaWxlTm8pIG92ZXJyaWRlOworICB2b2lkIEVtaXREVFBSZWwzMlZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUpIG92ZXJyaWRlOworICB2b2lkIEVtaXREVFBSZWw2NFZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUpIG92ZXJyaWRlOworICB2b2lkIEVtaXRUUFJlbDMyVmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdFRQUmVsNjRWYWx1ZShjb25zdCBNQ0V4cHIgKlZhbHVlKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0R1BSZWwzMlZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUpIG92ZXJyaWRlOworICB2b2lkIEVtaXRHUFJlbDY0VmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSkgb3ZlcnJpZGU7CisgIGJvb2wgRW1pdFJlbG9jRGlyZWN0aXZlKGNvbnN0IE1DRXhwciAmT2Zmc2V0LCBTdHJpbmdSZWYgTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNFeHByICpFeHByLCBTTUxvYyBMb2MpIG92ZXJyaWRlOworICB1c2luZyBNQ1N0cmVhbWVyOjplbWl0RmlsbDsKKyAgdm9pZCBlbWl0RmlsbChjb25zdCBNQ0V4cHIgJk51bUJ5dGVzLCB1aW50NjRfdCBGaWxsVmFsdWUsCisgICAgICAgICAgICAgICAgU01Mb2MgTG9jID0gU01Mb2MoKSkgb3ZlcnJpZGU7CisgIHZvaWQgZW1pdEZpbGwoY29uc3QgTUNFeHByICZOdW1WYWx1ZXMsIGludDY0X3QgU2l6ZSwgaW50NjRfdCBFeHByLAorICAgICAgICAgICAgICAgIFNNTG9jIExvYyA9IFNNTG9jKCkpIG92ZXJyaWRlOworICB2b2lkIEVtaXRGaWxlRGlyZWN0aXZlKFN0cmluZ1JlZiBGaWxlbmFtZSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBGaW5pc2hJbXBsKCkgb3ZlcnJpZGU7CisKKyAgLy8vIEVtaXQgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gc3ltYm9scyBpZiBwb3NzaWJsZS4KKyAgLy8vCisgIC8vLyBFbWl0IHRoZSBhYnNvbHV0ZSBkaWZmZXJlbmNlIGJldHdlZW4gXGMgSGkgYW5kIFxjIExvLCBhcyBsb25nIGFzIHdlIGNhbgorICAvLy8gY29tcHV0ZSBpdC4gIEN1cnJlbnRseSwgdGhhdCByZXF1aXJlcyB0aGF0IGJvdGggc3ltYm9scyBhcmUgaW4gdGhlIHNhbWUKKyAgLy8vIGRhdGEgZnJhZ21lbnQuICBPdGhlcndpc2UsIGRvIG5vdGhpbmcgYW5kIHJldHVybiBcYyBmYWxzZS4KKyAgLy8vCisgIC8vLyBccHJlIE9mZnNldCBvZiBcYyBIaSBpcyBncmVhdGVyIHRoYW4gdGhlIG9mZnNldCBcYyBMby4KKyAgdm9pZCBlbWl0QWJzb2x1dGVTeW1ib2xEaWZmKGNvbnN0IE1DU3ltYm9sICpIaSwgY29uc3QgTUNTeW1ib2wgKkxvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBlbWl0QWJzb2x1dGVTeW1ib2xEaWZmQXNVTEVCMTI4KGNvbnN0IE1DU3ltYm9sICpIaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICpMbykgb3ZlcnJpZGU7CisKKyAgYm9vbCBtYXlIYXZlSW5zdHJ1Y3Rpb25zKE1DU2VjdGlvbiAmU2VjKSBjb25zdCBvdmVycmlkZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ09iamVjdFdyaXRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ09iamVjdFdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNkOTA2OTAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DT2JqZWN0V3JpdGVyLmgKQEAgLTAsMCArMSwyMDAgQEAKKy8vPT09LSBsbHZtL01DL01DT2JqZWN0V3JpdGVyLmggLSBPYmplY3QgRmlsZSBXcml0ZXIgSW50ZXJmYWNlIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ09CSkVDVFdSSVRFUl9ICisjZGVmaW5lIExMVk1fTUNfTUNPQkpFQ1RXUklURVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhblN0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0FzbUxheW91dDsKK2NsYXNzIE1DQXNzZW1ibGVyOworY2xhc3MgTUNGaXh1cDsKK2NsYXNzIE1DRnJhZ21lbnQ7CitjbGFzcyBNQ1N5bWJvbDsKK2NsYXNzIE1DU3ltYm9sUmVmRXhwcjsKK2NsYXNzIE1DVmFsdWU7CisKKy8vLyBEZWZpbmVzIHRoZSBvYmplY3QgZmlsZSBhbmQgdGFyZ2V0IGluZGVwZW5kZW50IGludGVyZmFjZXMgdXNlZCBieSB0aGUKKy8vLyBhc3NlbWJsZXIgYmFja2VuZCB0byB3cml0ZSBuYXRpdmUgZmlsZSBmb3JtYXQgb2JqZWN0IGZpbGVzLgorLy8vCisvLy8gVGhlIG9iamVjdCB3cml0ZXIgY29udGFpbnMgYSBmZXcgY2FsbGJhY2tzIHVzZWQgYnkgdGhlIGFzc2VtYmxlciB0byBhbGxvdworLy8vIHRoZSBvYmplY3Qgd3JpdGVyIHRvIG1vZGlmeSB0aGUgYXNzZW1ibGVyIGRhdGEgc3RydWN0dXJlcyBhdCBhcHByb3ByaWF0ZQorLy8vIHBvaW50cy4gT25jZSBhc3NlbWJseSBpcyBjb21wbGV0ZSwgdGhlIG9iamVjdCB3cml0ZXIgaXMgZ2l2ZW4gdGhlCisvLy8gTUNBc3NlbWJsZXIgaW5zdGFuY2UsIHdoaWNoIGNvbnRhaW5zIGFsbCB0aGUgc3ltYm9sIGFuZCBzZWN0aW9uIGRhdGEgd2hpY2gKKy8vLyBzaG91bGQgYmUgZW1pdHRlZCBhcyBwYXJ0IG9mIHdyaXRlT2JqZWN0KCkuCisvLy8KKy8vLyBUaGUgb2JqZWN0IHdyaXRlciBhbHNvIGNvbnRhaW5zIGEgbnVtYmVyIG9mIGhlbHBlciBtZXRob2RzIGZvciB3cml0aW5nCisvLy8gYmluYXJ5IGRhdGEgdG8gdGhlIG91dHB1dCBzdHJlYW0uCitjbGFzcyBNQ09iamVjdFdyaXRlciB7CisgIHJhd19wd3JpdGVfc3RyZWFtICpPUzsKKworcHJvdGVjdGVkOgorICB1bnNpZ25lZCBJc0xpdHRsZUVuZGlhbiA6IDE7CisKKyAgLy8gQ2FuIG9ubHkgY3JlYXRlIHN1YmNsYXNzZXMuCisgIE1DT2JqZWN0V3JpdGVyKHJhd19wd3JpdGVfc3RyZWFtICZPUywgYm9vbCBJc0xpdHRsZUVuZGlhbikKKyAgICAgIDogT1MoJk9TKSwgSXNMaXR0bGVFbmRpYW4oSXNMaXR0bGVFbmRpYW4pIHt9CisKKyAgdW5zaWduZWQgZ2V0SW5pdGlhbE9mZnNldCgpIHsKKyAgICByZXR1cm4gT1MtPnRlbGwoKTsKKyAgfQorCitwdWJsaWM6CisgIE1DT2JqZWN0V3JpdGVyKGNvbnN0IE1DT2JqZWN0V3JpdGVyICYpID0gZGVsZXRlOworICBNQ09iamVjdFdyaXRlciAmb3BlcmF0b3I9KGNvbnN0IE1DT2JqZWN0V3JpdGVyICYpID0gZGVsZXRlOworICB2aXJ0dWFsIH5NQ09iamVjdFdyaXRlcigpOworCisgIC8vLyBsaWZldGltZSBtYW5hZ2VtZW50CisgIHZpcnR1YWwgdm9pZCByZXNldCgpIHt9CisKKyAgYm9vbCBpc0xpdHRsZUVuZGlhbigpIGNvbnN0IHsgcmV0dXJuIElzTGl0dGxlRW5kaWFuOyB9CisKKyAgcmF3X3B3cml0ZV9zdHJlYW0gJmdldFN0cmVhbSgpIHsgcmV0dXJuICpPUzsgfQorICB2b2lkIHNldFN0cmVhbShyYXdfcHdyaXRlX3N0cmVhbSAmTmV3T1MpIHsgT1MgPSAmTmV3T1M7IH0KKworICAvLy8gXG5hbWUgSGlnaC1MZXZlbCBBUEkKKyAgLy8vIEB7CisKKyAgLy8vIFBlcmZvcm0gYW55IGxhdGUgYmluZGluZyBvZiBzeW1ib2xzIChmb3IgZXhhbXBsZSwgdG8gYXNzaWduIHN5bWJvbAorICAvLy8gaW5kaWNlcyBmb3IgdXNlIHdoZW4gZ2VuZXJhdGluZyByZWxvY2F0aW9ucykuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgYXNzZW1ibGVyIGFmdGVyIGxheW91dCBhbmQgcmVsYXhhdGlvbiBpcworICAvLy8gY29tcGxldGUuCisgIHZpcnR1YWwgdm9pZCBleGVjdXRlUG9zdExheW91dEJpbmRpbmcoTUNBc3NlbWJsZXIgJkFzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KSA9IDA7CisKKyAgLy8vIFJlY29yZCBhIHJlbG9jYXRpb24gZW50cnkuCisgIC8vLworICAvLy8gVGhpcyByb3V0aW5lIGlzIGNhbGxlZCBieSB0aGUgYXNzZW1ibGVyIGFmdGVyIGxheW91dCBhbmQgcmVsYXhhdGlvbiwgYW5kCisgIC8vLyBwb3N0IGxheW91dCBiaW5kaW5nLiBUaGUgaW1wbGVtZW50YXRpb24gaXMgcmVzcG9uc2libGUgZm9yIHN0b3JpbmcKKyAgLy8vIGluZm9ybWF0aW9uIGFib3V0IHRoZSByZWxvY2F0aW9uIHNvIHRoYXQgaXQgY2FuIGJlIGVtaXR0ZWQgZHVyaW5nCisgIC8vLyB3cml0ZU9iamVjdCgpLgorICB2aXJ0dWFsIHZvaWQgcmVjb3JkUmVsb2NhdGlvbihNQ0Fzc2VtYmxlciAmQXNtLCBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0ZyYWdtZW50ICpGcmFnbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGaXh1cCAmRml4dXAsIE1DVmFsdWUgVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAmRml4ZWRWYWx1ZSkgPSAwOworCisgIC8vLyBDaGVjayB3aGV0aGVyIHRoZSBkaWZmZXJlbmNlIChBIC0gQikgYmV0d2VlbiB0d28gc3ltYm9sIHJlZmVyZW5jZXMgaXMKKyAgLy8vIGZ1bGx5IHJlc29sdmVkLgorICAvLy8KKyAgLy8vIENsaWVudHMgYXJlIG5vdCByZXF1aXJlZCB0byBhbnN3ZXIgcHJlY2lzZWx5IGFuZCBtYXkgY29uc2VydmF0aXZlbHkgcmV0dXJuCisgIC8vLyBmYWxzZSwgZXZlbiB3aGVuIGEgZGlmZmVyZW5jZSBpcyBmdWxseSByZXNvbHZlZC4KKyAgYm9vbCBpc1N5bWJvbFJlZkRpZmZlcmVuY2VGdWxseVJlc29sdmVkKGNvbnN0IE1DQXNzZW1ibGVyICZBc20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbFJlZkV4cHIgKkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbFJlZkV4cHIgKkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEluU2V0KSBjb25zdDsKKworICB2aXJ0dWFsIGJvb2wgaXNTeW1ib2xSZWZEaWZmZXJlbmNlRnVsbHlSZXNvbHZlZEltcGwoY29uc3QgTUNBc3NlbWJsZXIgJkFzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICZBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgJkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEluU2V0KSBjb25zdDsKKworICB2aXJ0dWFsIGJvb2wgaXNTeW1ib2xSZWZEaWZmZXJlbmNlRnVsbHlSZXNvbHZlZEltcGwoY29uc3QgTUNBc3NlbWJsZXIgJkFzbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICZTeW1BLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNGcmFnbWVudCAmRkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEluU2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1BDUmVsKSBjb25zdDsKKworICAvLy8gV3JpdGUgdGhlIG9iamVjdCBmaWxlLgorICAvLy8KKyAgLy8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgdGhlIGFzc2VtYmxlciBhZnRlciBsYXlvdXQgYW5kIHJlbGF4YXRpb24gaXMKKyAgLy8vIGNvbXBsZXRlLCBmaXh1cHMgaGF2ZSBiZWVuIGV2YWx1YXRlZCBhbmQgYXBwbGllZCwgYW5kIHJlbG9jYXRpb25zCisgIC8vLyBnZW5lcmF0ZWQuCisgIHZpcnR1YWwgdm9pZCB3cml0ZU9iamVjdChNQ0Fzc2VtYmxlciAmQXNtLCBjb25zdCBNQ0FzbUxheW91dCAmTGF5b3V0KSA9IDA7CisKKyAgLy8vIEB9CisgIC8vLyBcbmFtZSBCaW5hcnkgT3V0cHV0CisgIC8vLyBAeworCisgIHZvaWQgd3JpdGU4KHVpbnQ4X3QgVmFsdWUpIHsgKk9TIDw8IGNoYXIoVmFsdWUpOyB9CisKKyAgdm9pZCB3cml0ZUxFMTYodWludDE2X3QgVmFsdWUpIHsKKyAgICBzdXBwb3J0OjplbmRpYW46OldyaXRlcjxzdXBwb3J0OjpsaXR0bGU+KCpPUykud3JpdGUoVmFsdWUpOworICB9CisKKyAgdm9pZCB3cml0ZUxFMzIodWludDMyX3QgVmFsdWUpIHsKKyAgICBzdXBwb3J0OjplbmRpYW46OldyaXRlcjxzdXBwb3J0OjpsaXR0bGU+KCpPUykud3JpdGUoVmFsdWUpOworICB9CisKKyAgdm9pZCB3cml0ZUxFNjQodWludDY0X3QgVmFsdWUpIHsKKyAgICBzdXBwb3J0OjplbmRpYW46OldyaXRlcjxzdXBwb3J0OjpsaXR0bGU+KCpPUykud3JpdGUoVmFsdWUpOworICB9CisKKyAgdm9pZCB3cml0ZUJFMTYodWludDE2X3QgVmFsdWUpIHsKKyAgICBzdXBwb3J0OjplbmRpYW46OldyaXRlcjxzdXBwb3J0OjpiaWc+KCpPUykud3JpdGUoVmFsdWUpOworICB9CisKKyAgdm9pZCB3cml0ZUJFMzIodWludDMyX3QgVmFsdWUpIHsKKyAgICBzdXBwb3J0OjplbmRpYW46OldyaXRlcjxzdXBwb3J0OjpiaWc+KCpPUykud3JpdGUoVmFsdWUpOworICB9CisKKyAgdm9pZCB3cml0ZUJFNjQodWludDY0X3QgVmFsdWUpIHsKKyAgICBzdXBwb3J0OjplbmRpYW46OldyaXRlcjxzdXBwb3J0OjpiaWc+KCpPUykud3JpdGUoVmFsdWUpOworICB9CisKKyAgdm9pZCB3cml0ZTE2KHVpbnQxNl90IFZhbHVlKSB7CisgICAgaWYgKElzTGl0dGxlRW5kaWFuKQorICAgICAgd3JpdGVMRTE2KFZhbHVlKTsKKyAgICBlbHNlCisgICAgICB3cml0ZUJFMTYoVmFsdWUpOworICB9CisKKyAgdm9pZCB3cml0ZTMyKHVpbnQzMl90IFZhbHVlKSB7CisgICAgaWYgKElzTGl0dGxlRW5kaWFuKQorICAgICAgd3JpdGVMRTMyKFZhbHVlKTsKKyAgICBlbHNlCisgICAgICB3cml0ZUJFMzIoVmFsdWUpOworICB9CisKKyAgdm9pZCB3cml0ZTY0KHVpbnQ2NF90IFZhbHVlKSB7CisgICAgaWYgKElzTGl0dGxlRW5kaWFuKQorICAgICAgd3JpdGVMRTY0KFZhbHVlKTsKKyAgICBlbHNlCisgICAgICB3cml0ZUJFNjQoVmFsdWUpOworICB9CisKKyAgdm9pZCBXcml0ZVplcm9zKHVuc2lnbmVkIE4pIHsKKyAgICBjb25zdCBjaGFyIFplcm9zWzE2XSA9IHswfTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBOIC8gMTY7IGkgIT0gZTsgKytpKQorICAgICAgKk9TIDw8IFN0cmluZ1JlZihaZXJvcywgMTYpOworCisgICAgKk9TIDw8IFN0cmluZ1JlZihaZXJvcywgTiAlIDE2KTsKKyAgfQorCisgIHZvaWQgd3JpdGVCeXRlcyhjb25zdCBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJkJ5dGVWZWMsCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBaZXJvRmlsbFNpemUgPSAwKSB7CisgICAgd3JpdGVCeXRlcyhTdHJpbmdSZWYoQnl0ZVZlYy5kYXRhKCksIEJ5dGVWZWMuc2l6ZSgpKSwgWmVyb0ZpbGxTaXplKTsKKyAgfQorCisgIHZvaWQgd3JpdGVCeXRlcyhTdHJpbmdSZWYgU3RyLCB1bnNpZ25lZCBaZXJvRmlsbFNpemUgPSAwKSB7CisgICAgLy8gVE9ETzogdGhpcyB2ZXJzaW9uIG1heSBuZWVkIHRvIGdvIGF3YXkgb25jZSBhbGwgZnJhZ21lbnQgY29udGVudHMgYXJlCisgICAgLy8gY29udmVydGVkIHRvIFNtYWxsVmVjdG9yPGNoYXIsIE4+CisgICAgYXNzZXJ0KAorICAgICAgICAoWmVyb0ZpbGxTaXplID09IDAgfHwgU3RyLnNpemUoKSA8PSBaZXJvRmlsbFNpemUpICYmCisgICAgICAgICJkYXRhIHNpemUgZ3JlYXRlciB0aGFuIGZpbGwgc2l6ZSwgdW5leHBlY3RlZCBsYXJnZSB3cml0ZSB3aWxsIG9jY3VyIik7CisgICAgKk9TIDw8IFN0cjsKKyAgICBpZiAoWmVyb0ZpbGxTaXplKQorICAgICAgV3JpdGVaZXJvcyhaZXJvRmlsbFNpemUgLSBTdHIuc2l6ZSgpKTsKKyAgfQorCisgIC8vLyBAfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNPQkpFQ1RXUklURVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9Bc21Db25kLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DUGFyc2VyL0FzbUNvbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTdiZmM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9Bc21Db25kLmgKQEAgLTAsMCArMSw0MCBAQAorLy89PT0tIEFzbUNvbmQuaCAtIEFzc2VtYmx5IGZpbGUgY29uZGl0aW9uYWwgYXNzZW1ibHkgIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DUEFSU0VSX0FTTUNPTkRfSAorI2RlZmluZSBMTFZNX01DX01DUEFSU0VSX0FTTUNPTkRfSAorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBc21Db25kIC0gQ2xhc3MgdG8gc3VwcG9ydCBjb25kaXRpb25hbCBhc3NlbWJseQorLy8vCisvLy8gVGhlIGNvbmRpdGlvbmFsIGFzc2VtYmx5IGZlYXR1cmUgKC5pZiwgLmVsc2UsIC5lbHNlaWYgYW5kIC5lbmRpZikgaXMKKy8vLyBpbXBsZW1lbnRlZCB3aXRoIEFzbUNvbmQgdGhhdCB0ZWxscyB1cyB3aGF0IHdlIGFyZSBpbiB0aGUgbWlkZGxlIG9mIAorLy8vIHByb2Nlc3NpbmcuICBJZ25vcmUgY2FuIGJlIGVpdGhlciB0cnVlIG9yIGZhbHNlLiAgV2hlbiB0cnVlIHdlIGFyZSBpZ25vcmluZworLy8vIHRoZSBibG9jayBvZiBjb2RlIGluIHRoZSBtaWRkbGUgb2YgYSBjb25kaXRpb25hbC4KKworY2xhc3MgQXNtQ29uZCB7CitwdWJsaWM6CisgIGVudW0gQ29uZGl0aW9uYWxBc3NlbWJseVR5cGUgeworICAgIE5vQ29uZCwgICAgIC8vIG5vIGNvbmRpdGlvbmFsIGlzIGJlaW5nIHByb2Nlc3NlZAorICAgIElmQ29uZCwgICAgIC8vIGluc2lkZSBpZiBjb25kaXRpb25hbAorICAgIEVsc2VJZkNvbmQsIC8vIGluc2lkZSBlbHNlaWYgY29uZGl0aW9uYWwKKyAgICBFbHNlQ29uZCAgICAvLyBpbnNpZGUgZWxzZSBjb25kaXRpb25hbAorICB9OworCisgIENvbmRpdGlvbmFsQXNzZW1ibHlUeXBlIFRoZUNvbmQgPSBOb0NvbmQ7CisgIGJvb2wgQ29uZE1ldCA9IGZhbHNlOworICBib29sIElnbm9yZSA9IGZhbHNlOworCisgIEFzbUNvbmQoKSA9IGRlZmF1bHQ7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ1BBUlNFUl9BU01DT05EX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvQXNtTGV4ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvQXNtTGV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDcxODNhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9Bc21MZXhlci5oCkBAIC0wLDAgKzEsNzYgQEAKKy8vPT09LSBBc21MZXhlci5oIC0gTGV4ZXIgZm9yIEFzc2VtYmx5IEZpbGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBjbGFzcyBkZWNsYXJlcyB0aGUgbGV4ZXIgZm9yIGFzc2VtYmx5IGZpbGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1BBUlNFUl9BU01MRVhFUl9ICisjZGVmaW5lIExMVk1fTUNfTUNQQVJTRVJfQVNNTEVYRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1BhcnNlci9NQ0FzbUxleGVyLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DQXNtSW5mbzsKKworLy8vIEFzbUxleGVyIC0gTGV4ZXIgY2xhc3MgZm9yIGFzc2VtYmx5IGZpbGVzLgorY2xhc3MgQXNtTGV4ZXIgOiBwdWJsaWMgTUNBc21MZXhlciB7CisgIGNvbnN0IE1DQXNtSW5mbyAmTUFJOworCisgIGNvbnN0IGNoYXIgKkN1clB0ciA9IG51bGxwdHI7CisgIFN0cmluZ1JlZiBDdXJCdWY7CisgIGJvb2wgSXNBdFN0YXJ0T2ZMaW5lID0gdHJ1ZTsKKyAgYm9vbCBJc0F0U3RhcnRPZlN0YXRlbWVudCA9IHRydWU7CisgIGJvb2wgSXNQYXJzaW5nTVNJbmxpbmVBc20gPSBmYWxzZTsKKyAgYm9vbCBJc1BlZWtpbmcgPSBmYWxzZTsKKworcHJvdGVjdGVkOgorICAvLy8gTGV4VG9rZW4gLSBSZWFkIHRoZSBuZXh0IHRva2VuIGFuZCByZXR1cm4gaXRzIGNvZGUuCisgIEFzbVRva2VuIExleFRva2VuKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgQXNtTGV4ZXIoY29uc3QgTUNBc21JbmZvICZNQUkpOworICBBc21MZXhlcihjb25zdCBBc21MZXhlciAmKSA9IGRlbGV0ZTsKKyAgQXNtTGV4ZXIgJm9wZXJhdG9yPShjb25zdCBBc21MZXhlciAmKSA9IGRlbGV0ZTsKKyAgfkFzbUxleGVyKCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBzZXRCdWZmZXIoU3RyaW5nUmVmIEJ1ZiwgY29uc3QgY2hhciAqcHRyID0gbnVsbHB0cik7CisgIHZvaWQgc2V0UGFyc2luZ01TSW5saW5lQXNtKGJvb2wgVikgeyBJc1BhcnNpbmdNU0lubGluZUFzbSA9IFY7IH0KKworICBTdHJpbmdSZWYgTGV4VW50aWxFbmRPZlN0YXRlbWVudCgpIG92ZXJyaWRlOworCisgIHNpemVfdCBwZWVrVG9rZW5zKE11dGFibGVBcnJheVJlZjxBc21Ub2tlbj4gQnVmLAorICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZFNraXBTcGFjZSA9IHRydWUpIG92ZXJyaWRlOworCisgIGNvbnN0IE1DQXNtSW5mbyAmZ2V0TUFJKCkgY29uc3QgeyByZXR1cm4gTUFJOyB9CisKK3ByaXZhdGU6CisgIGJvb2wgaXNBdFN0YXJ0T2ZDb21tZW50KGNvbnN0IGNoYXIgKlB0cik7CisgIGJvb2wgaXNBdFN0YXRlbWVudFNlcGFyYXRvcihjb25zdCBjaGFyICpQdHIpOworICBpbnQgZ2V0TmV4dENoYXIoKTsKKyAgQXNtVG9rZW4gUmV0dXJuRXJyb3IoY29uc3QgY2hhciAqTG9jLCBjb25zdCBzdGQ6OnN0cmluZyAmTXNnKTsKKworICBBc21Ub2tlbiBMZXhJZGVudGlmaWVyKCk7CisgIEFzbVRva2VuIExleFNsYXNoKCk7CisgIEFzbVRva2VuIExleExpbmVDb21tZW50KCk7CisgIEFzbVRva2VuIExleERpZ2l0KCk7CisgIEFzbVRva2VuIExleFNpbmdsZVF1b3RlKCk7CisgIEFzbVRva2VuIExleFF1b3RlKCk7CisgIEFzbVRva2VuIExleEZsb2F0TGl0ZXJhbCgpOworICBBc21Ub2tlbiBMZXhIZXhGbG9hdExpdGVyYWwoYm9vbCBOb0ludERpZ2l0cyk7CisKKyAgU3RyaW5nUmVmIExleFVudGlsRW5kT2ZMaW5lKCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ1BBUlNFUl9BU01MRVhFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DUGFyc2VyL01DQXNtTGV4ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvTUNBc21MZXhlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwNTUwYjMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DUGFyc2VyL01DQXNtTGV4ZXIuaApAQCAtMCwwICsxLDE2MiBAQAorLy89PT0tIGxsdm0vTUMvTUNBc21MZXhlci5oIC0gQWJzdHJhY3QgQXNtIExleGVyIEludGVyZmFjZSAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DUEFSU0VSX01DQVNNTEVYRVJfSAorI2RlZmluZSBMTFZNX01DX01DUEFSU0VSX01DQVNNTEVYRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNBc21NYWNyby5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEEgY2FsbGJhY2sgY2xhc3Mgd2hpY2ggaXMgbm90aWZpZWQgb2YgZWFjaCBjb21tZW50IGluIGFuIGFzc2VtYmx5IGZpbGUgYXMKKy8vLyBpdCBpcyBsZXhlZC4KK2NsYXNzIEFzbUNvbW1lbnRDb25zdW1lciB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkFzbUNvbW1lbnRDb25zdW1lcigpID0gZGVmYXVsdDsKKworICAvLy8gQ2FsbGJhY2sgZnVuY3Rpb24gZm9yIHdoZW4gYSBjb21tZW50IGlzIGxleGVkLiBMb2MgaXMgdGhlIHN0YXJ0IG9mIHRoZQorICAvLy8gY29tbWVudCB0ZXh0IChleGNsdWRpbmcgdGhlIGNvbW1lbnQtc3RhcnQgbWFya2VyKS4gQ29tbWVudFRleHQgaXMgdGhlIHRleHQKKyAgLy8vIG9mIHRoZSBjb21tZW50LCBleGNsdWRpbmcgdGhlIGNvbW1lbnQgc3RhcnQgYW5kIGVuZCBtYXJrZXJzLCBhbmQgdGhlCisgIC8vLyBuZXdsaW5lIGZvciBzaW5nbGUtbGluZSBjb21tZW50cy4KKyAgdmlydHVhbCB2b2lkIEhhbmRsZUNvbW1lbnQoU01Mb2MgTG9jLCBTdHJpbmdSZWYgQ29tbWVudFRleHQpID0gMDsKK307CisKKworLy8vIEdlbmVyaWMgYXNzZW1ibGVyIGxleGVyIGludGVyZmFjZSwgZm9yIHVzZSBieSB0YXJnZXQgc3BlY2lmaWMgYXNzZW1ibHkKKy8vLyBsZXhlcnMuCitjbGFzcyBNQ0FzbUxleGVyIHsKKyAgLy8vIFRoZSBjdXJyZW50IHRva2VuLCBzdG9yZWQgaW4gdGhlIGJhc2UgY2xhc3MgZm9yIGZhc3RlciBhY2Nlc3MuCisgIFNtYWxsVmVjdG9yPEFzbVRva2VuLCAxPiBDdXJUb2s7CisKKyAgLy8vIFRoZSBsb2NhdGlvbiBhbmQgZGVzY3JpcHRpb24gb2YgdGhlIGN1cnJlbnQgZXJyb3IKKyAgU01Mb2MgRXJyTG9jOworICBzdGQ6OnN0cmluZyBFcnI7CisKK3Byb3RlY3RlZDogLy8gQ2FuIG9ubHkgY3JlYXRlIHN1YmNsYXNzZXMuCisgIGNvbnN0IGNoYXIgKlRva1N0YXJ0ID0gbnVsbHB0cjsKKyAgYm9vbCBTa2lwU3BhY2UgPSB0cnVlOworICBib29sIEFsbG93QXRJbklkZW50aWZpZXI7CisgIGJvb2wgSXNBdFN0YXJ0T2ZTdGF0ZW1lbnQgPSB0cnVlOworICBBc21Db21tZW50Q29uc3VtZXIgKkNvbW1lbnRDb25zdW1lciA9IG51bGxwdHI7CisKKyAgYm9vbCBBbHRNYWNyb01vZGU7CisgIE1DQXNtTGV4ZXIoKTsKKworICB2aXJ0dWFsIEFzbVRva2VuIExleFRva2VuKCkgPSAwOworCisgIHZvaWQgU2V0RXJyb3IoU01Mb2MgZXJyTG9jLCBjb25zdCBzdGQ6OnN0cmluZyAmZXJyKSB7CisgICAgRXJyTG9jID0gZXJyTG9jOworICAgIEVyciA9IGVycjsKKyAgfQorCitwdWJsaWM6CisgIE1DQXNtTGV4ZXIoY29uc3QgTUNBc21MZXhlciAmKSA9IGRlbGV0ZTsKKyAgTUNBc21MZXhlciAmb3BlcmF0b3I9KGNvbnN0IE1DQXNtTGV4ZXIgJikgPSBkZWxldGU7CisgIHZpcnR1YWwgfk1DQXNtTGV4ZXIoKTsKKworICBib29sIElzYUFsdE1hY3JvTW9kZSgpIHsKKyAgICByZXR1cm4gQWx0TWFjcm9Nb2RlOworICB9CisKKyAgdm9pZCBTZXRBbHRNYWNyb01vZGUoYm9vbCBBbHRNYWNyb1NldCkgeworICAgIEFsdE1hY3JvTW9kZSA9IEFsdE1hY3JvU2V0OworICB9CisKKyAgLy8vIENvbnN1bWUgdGhlIG5leHQgdG9rZW4gZnJvbSB0aGUgaW5wdXQgc3RyZWFtIGFuZCByZXR1cm4gaXQuCisgIC8vLworICAvLy8gVGhlIGxleGVyIHdpbGwgY29udGludW9zbHkgcmV0dXJuIHRoZSBlbmQtb2YtZmlsZSB0b2tlbiBvbmNlIHRoZSBlbmQgb2YKKyAgLy8vIHRoZSBtYWluIGlucHV0IGZpbGUgaGFzIGJlZW4gcmVhY2hlZC4KKyAgY29uc3QgQXNtVG9rZW4gJkxleCgpIHsKKyAgICBhc3NlcnQoIUN1clRvay5lbXB0eSgpKTsKKyAgICAvLyBNYXJrIGlmIHdlIHBhcnNpbmcgb3V0IGEgRW5kT2ZTdGF0ZW1lbnQuCisgICAgSXNBdFN0YXJ0T2ZTdGF0ZW1lbnQgPSBDdXJUb2suZnJvbnQoKS5nZXRLaW5kKCkgPT0gQXNtVG9rZW46OkVuZE9mU3RhdGVtZW50OworICAgIEN1clRvay5lcmFzZShDdXJUb2suYmVnaW4oKSk7CisgICAgLy8gTGV4VG9rZW4gbWF5IGdlbmVyYXRlIG11bHRpcGxlIHRva2VucyB2aWEgVW5MZXggYnV0IHdpbGwgYWx3YXlzIHJldHVybgorICAgIC8vIHRoZSBmaXJzdCBvbmUuIFBsYWNlIHJldHVybmVkIHZhbHVlIGF0IGhlYWQgb2YgQ3VyVG9rIHZlY3Rvci4KKyAgICBpZiAoQ3VyVG9rLmVtcHR5KCkpIHsKKyAgICAgIEFzbVRva2VuIFQgPSBMZXhUb2tlbigpOworICAgICAgQ3VyVG9rLmluc2VydChDdXJUb2suYmVnaW4oKSwgVCk7CisgICAgfQorICAgIHJldHVybiBDdXJUb2suZnJvbnQoKTsKKyAgfQorCisgIHZvaWQgVW5MZXgoQXNtVG9rZW4gY29uc3QgJlRva2VuKSB7CisgICAgSXNBdFN0YXJ0T2ZTdGF0ZW1lbnQgPSBmYWxzZTsKKyAgICBDdXJUb2suaW5zZXJ0KEN1clRvay5iZWdpbigpLCBUb2tlbik7CisgIH0KKworICBib29sIGlzQXRTdGFydE9mU3RhdGVtZW50KCkgeyByZXR1cm4gSXNBdFN0YXJ0T2ZTdGF0ZW1lbnQ7IH0KKworICB2aXJ0dWFsIFN0cmluZ1JlZiBMZXhVbnRpbEVuZE9mU3RhdGVtZW50KCkgPSAwOworCisgIC8vLyBHZXQgdGhlIGN1cnJlbnQgc291cmNlIGxvY2F0aW9uLgorICBTTUxvYyBnZXRMb2MoKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSBjdXJyZW50IChsYXN0KSBsZXhlZCB0b2tlbi4KKyAgY29uc3QgQXNtVG9rZW4gJmdldFRvaygpIGNvbnN0IHsKKyAgICByZXR1cm4gQ3VyVG9rWzBdOworICB9CisKKyAgLy8vIExvb2sgYWhlYWQgYXQgdGhlIG5leHQgdG9rZW4gdG8gYmUgbGV4ZWQuCisgIGNvbnN0IEFzbVRva2VuIHBlZWtUb2soYm9vbCBTaG91bGRTa2lwU3BhY2UgPSB0cnVlKSB7CisgICAgQXNtVG9rZW4gVG9rOworCisgICAgTXV0YWJsZUFycmF5UmVmPEFzbVRva2VuPiBCdWYoVG9rKTsKKyAgICBzaXplX3QgUmVhZENvdW50ID0gcGVla1Rva2VucyhCdWYsIFNob3VsZFNraXBTcGFjZSk7CisKKyAgICBhc3NlcnQoUmVhZENvdW50ID09IDEpOworICAgICh2b2lkKVJlYWRDb3VudDsKKworICAgIHJldHVybiBUb2s7CisgIH0KKworICAvLy8gTG9vayBhaGVhZCBhbiBhcmJpdHJhcnkgbnVtYmVyIG9mIHRva2Vucy4KKyAgdmlydHVhbCBzaXplX3QgcGVla1Rva2VucyhNdXRhYmxlQXJyYXlSZWY8QXNtVG9rZW4+IEJ1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZFNraXBTcGFjZSA9IHRydWUpID0gMDsKKworICAvLy8gR2V0IHRoZSBjdXJyZW50IGVycm9yIGxvY2F0aW9uCisgIFNNTG9jIGdldEVyckxvYygpIHsKKyAgICByZXR1cm4gRXJyTG9jOworICB9CisKKyAgLy8vIEdldCB0aGUgY3VycmVudCBlcnJvciBzdHJpbmcKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldEVycigpIHsKKyAgICByZXR1cm4gRXJyOworICB9CisKKyAgLy8vIEdldCB0aGUga2luZCBvZiBjdXJyZW50IHRva2VuLgorICBBc21Ub2tlbjo6VG9rZW5LaW5kIGdldEtpbmQoKSBjb25zdCB7IHJldHVybiBnZXRUb2soKS5nZXRLaW5kKCk7IH0KKworICAvLy8gQ2hlY2sgaWYgdGhlIGN1cnJlbnQgdG9rZW4gaGFzIGtpbmQgXHAgSy4KKyAgYm9vbCBpcyhBc21Ub2tlbjo6VG9rZW5LaW5kIEspIGNvbnN0IHsgcmV0dXJuIGdldFRvaygpLmlzKEspOyB9CisKKyAgLy8vIENoZWNrIGlmIHRoZSBjdXJyZW50IHRva2VuIGhhcyBraW5kIFxwIEsuCisgIGJvb2wgaXNOb3QoQXNtVG9rZW46OlRva2VuS2luZCBLKSBjb25zdCB7IHJldHVybiBnZXRUb2soKS5pc05vdChLKTsgfQorCisgIC8vLyBTZXQgd2hldGhlciBzcGFjZXMgc2hvdWxkIGJlIGlnbm9yZWQgYnkgdGhlIGxleGVyCisgIHZvaWQgc2V0U2tpcFNwYWNlKGJvb2wgdmFsKSB7IFNraXBTcGFjZSA9IHZhbDsgfQorCisgIGJvb2wgZ2V0QWxsb3dBdEluSWRlbnRpZmllcigpIHsgcmV0dXJuIEFsbG93QXRJbklkZW50aWZpZXI7IH0KKyAgdm9pZCBzZXRBbGxvd0F0SW5JZGVudGlmaWVyKGJvb2wgdikgeyBBbGxvd0F0SW5JZGVudGlmaWVyID0gdjsgfQorCisgIHZvaWQgc2V0Q29tbWVudENvbnN1bWVyKEFzbUNvbW1lbnRDb25zdW1lciAqQ29tbWVudENvbnN1bWVyKSB7CisgICAgdGhpcy0+Q29tbWVudENvbnN1bWVyID0gQ29tbWVudENvbnN1bWVyOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ1BBUlNFUl9NQ0FTTUxFWEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvTUNBc21QYXJzZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvTUNBc21QYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZjc5YzQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9NQ0FzbVBhcnNlci5oCkBAIC0wLDAgKzEsMzEzIEBACisvLz09PS0gbGx2bS9NQy9NQ0FzbVBhcnNlci5oIC0gQWJzdHJhY3QgQXNtIFBhcnNlciBJbnRlcmZhY2UgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNQQVJTRVJfTUNBU01QQVJTRVJfSAorI2RlZmluZSBMTFZNX01DX01DUEFSU0VSX01DQVNNUEFSU0VSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL05vbmUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DUGFyc2VyL01DQXNtTGV4ZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU01Mb2MuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DQXNtSW5mbzsKK2NsYXNzIE1DQXNtUGFyc2VyRXh0ZW5zaW9uOworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNFeHByOworY2xhc3MgTUNJbnN0UHJpbnRlcjsKK2NsYXNzIE1DSW5zdHJJbmZvOworY2xhc3MgTUNTdHJlYW1lcjsKK2NsYXNzIE1DVGFyZ2V0QXNtUGFyc2VyOworY2xhc3MgU291cmNlTWdyOworCitzdHJ1Y3QgSW5saW5lQXNtSWRlbnRpZmllckluZm8geworICBlbnVtIElkS2luZCB7CisgICAgSUtfSW52YWxpZCwgIC8vIEluaXRpYWwgc3RhdGUuIFVuZXhwZWN0ZWQgYWZ0ZXIgYSBzdWNjZXNzZnVsIHBhcnNpbmcuCisgICAgSUtfTGFiZWwsICAgIC8vIEZ1bmN0aW9uL0xhYmVsIHJlZmVyZW5jZS4KKyAgICBJS19FbnVtVmFsLCAgLy8gVmFsdWUgb2YgZW51bWVyYXRpb24gdHlwZS4KKyAgICBJS19WYXIgICAgICAgLy8gVmFyaWFibGUuCisgIH07CisgIC8vIFJlcHJlc2VudHMgYW4gRW51bSB2YWx1ZQorICBzdHJ1Y3QgRW51bUlkZW50aWZpZXIgeworICAgIGludDY0X3QgRW51bVZhbDsKKyAgfTsKKyAgLy8gUmVwcmVzZW50cyBhIGxhYmVsL2Z1bmN0aW9uIHJlZmVyZW5jZQorICBzdHJ1Y3QgTGFiZWxJZGVudGlmaWVyIHsKKyAgICB2b2lkICpEZWNsOworICB9OworICAvLyBSZXByZXNlbnRzIGEgdmFyaWFibGUKKyAgc3RydWN0IFZhcmlhYmxlSWRlbnRpZmllciB7CisgICAgdm9pZCAqRGVjbDsKKyAgICBib29sIElzR2xvYmFsTFY7CisgICAgdW5zaWduZWQgTGVuZ3RoOworICAgIHVuc2lnbmVkIFNpemU7CisgICAgdW5zaWduZWQgVHlwZTsKKyAgfTsKKyAgLy8gQW4gSW5saW5lQXNtIGlkZW50aWZpZXIgY2FuIG9ubHkgYmUgb25lIG9mIHRob3NlCisgIHVuaW9uIHsKKyAgICBFbnVtSWRlbnRpZmllciBFbnVtOworICAgIExhYmVsSWRlbnRpZmllciBMYWJlbDsKKyAgICBWYXJpYWJsZUlkZW50aWZpZXIgVmFyOworICB9OworICBib29sIGlzS2luZChJZEtpbmQga2luZCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBraW5kOyB9CisgIC8vIEluaXRpYWxpemVycworICB2b2lkIHNldEVudW0oaW50NjRfdCBlbnVtVmFsKSB7CisgICAgYXNzZXJ0KGlzS2luZChJS19JbnZhbGlkKSAmJiAic2hvdWxkIGJlIGluaXRpYWxpemVkIG9ubHkgb25jZSIpOworICAgIEtpbmQgPSBJS19FbnVtVmFsOworICAgIEVudW0uRW51bVZhbCA9IGVudW1WYWw7CisgIH0KKyAgdm9pZCBzZXRMYWJlbCh2b2lkICpkZWNsKSB7CisgICAgYXNzZXJ0KGlzS2luZChJS19JbnZhbGlkKSAmJiAic2hvdWxkIGJlIGluaXRpYWxpemVkIG9ubHkgb25jZSIpOworICAgIEtpbmQgPSBJS19MYWJlbDsKKyAgICBMYWJlbC5EZWNsID0gZGVjbDsKKyAgfQorICB2b2lkIHNldFZhcih2b2lkICpkZWNsLCBib29sIGlzR2xvYmFsTFYsIHVuc2lnbmVkIHNpemUsIHVuc2lnbmVkIHR5cGUpIHsKKyAgICBhc3NlcnQoaXNLaW5kKElLX0ludmFsaWQpICYmICJzaG91bGQgYmUgaW5pdGlhbGl6ZWQgb25seSBvbmNlIik7CisgICAgS2luZCA9IElLX1ZhcjsKKyAgICBWYXIuRGVjbCA9IGRlY2w7CisgICAgVmFyLklzR2xvYmFsTFYgPSBpc0dsb2JhbExWOworICAgIFZhci5TaXplID0gc2l6ZTsKKyAgICBWYXIuVHlwZSA9IHR5cGU7CisgICAgVmFyLkxlbmd0aCA9IHNpemUgLyB0eXBlOworICB9CisgIElubGluZUFzbUlkZW50aWZpZXJJbmZvKCkgOiBLaW5kKElLX0ludmFsaWQpIHt9CisKK3ByaXZhdGU6CisgIC8vIERpc2NyaW1pbmF0ZSB1c2luZyB0aGUgY3VycmVudCBraW5kLgorICBJZEtpbmQgS2luZDsKK307CisKKy8vLyBcYnJpZWYgR2VuZXJpYyBTZW1hIGNhbGxiYWNrIGZvciBhc3NlbWJseSBwYXJzZXIuCitjbGFzcyBNQ0FzbVBhcnNlclNlbWFDYWxsYmFjayB7CitwdWJsaWM6CisgIHZpcnR1YWwgfk1DQXNtUGFyc2VyU2VtYUNhbGxiYWNrKCk7CisKKyAgdmlydHVhbCB2b2lkIExvb2t1cElubGluZUFzbUlkZW50aWZpZXIoU3RyaW5nUmVmICZMaW5lQnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmxpbmVBc21JZGVudGlmaWVySW5mbyAmSW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1VuZXZhbHVhdGVkQ29udGV4dCkgPSAwOworICB2aXJ0dWFsIFN0cmluZ1JlZiBMb29rdXBJbmxpbmVBc21MYWJlbChTdHJpbmdSZWYgSWRlbnRpZmllciwgU291cmNlTWdyICZTTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01Mb2MgTG9jYXRpb24sIGJvb2wgQ3JlYXRlKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBMb29rdXBJbmxpbmVBc21GaWVsZChTdHJpbmdSZWYgQmFzZSwgU3RyaW5nUmVmIE1lbWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZPZmZzZXQpID0gMDsKK307CisKKy8vLyBcYnJpZWYgR2VuZXJpYyBhc3NlbWJsZXIgcGFyc2VyIGludGVyZmFjZSwgZm9yIHVzZSBieSB0YXJnZXQgc3BlY2lmaWMKKy8vLyBhc3NlbWJseSBwYXJzZXJzLgorY2xhc3MgTUNBc21QYXJzZXIgeworcHVibGljOgorICB1c2luZyBEaXJlY3RpdmVIYW5kbGVyID0gYm9vbCAoKikoTUNBc21QYXJzZXJFeHRlbnNpb24qLCBTdHJpbmdSZWYsIFNNTG9jKTsKKyAgdXNpbmcgRXh0ZW5zaW9uRGlyZWN0aXZlSGFuZGxlciA9CisgICAgICBzdGQ6OnBhaXI8TUNBc21QYXJzZXJFeHRlbnNpb24qLCBEaXJlY3RpdmVIYW5kbGVyPjsKKworICBzdHJ1Y3QgTUNQZW5kaW5nRXJyb3IgeworICAgIFNNTG9jIExvYzsKKyAgICBTbWFsbFN0cmluZzw2ND4gTXNnOworICAgIFNNUmFuZ2UgUmFuZ2U7CisgIH07CisKK3ByaXZhdGU6CisgIE1DVGFyZ2V0QXNtUGFyc2VyICpUYXJnZXRQYXJzZXIgPSBudWxscHRyOworCisgIHVuc2lnbmVkIFNob3dQYXJzZWRPcGVyYW5kcyA6IDE7CisKK3Byb3RlY3RlZDogLy8gQ2FuIG9ubHkgY3JlYXRlIHN1YmNsYXNzZXMuCisgIE1DQXNtUGFyc2VyKCk7CisKKyAgLy8vIEZsYWcgdHJhY2tpbmcgd2hldGhlciBhbnkgZXJyb3JzIGhhdmUgYmVlbiBlbmNvdW50ZXJlZC4KKyAgYm9vbCBIYWRFcnJvciA9IGZhbHNlOworICAvLy8gRW5hYmxlIHByaW50IFtsYXRlbmN5OnRocm91Z2hwdXRdIGluIG91dHB1dCBmaWxlLgorICBib29sIEVuYWJsZVByaW50U2NoZWRJbmZvID0gZmFsc2U7CisKKyAgU21hbGxWZWN0b3I8TUNQZW5kaW5nRXJyb3IsIDE+IFBlbmRpbmdFcnJvcnM7CisKK3B1YmxpYzoKKyAgTUNBc21QYXJzZXIoY29uc3QgTUNBc21QYXJzZXIgJikgPSBkZWxldGU7CisgIE1DQXNtUGFyc2VyICZvcGVyYXRvcj0oY29uc3QgTUNBc21QYXJzZXIgJikgPSBkZWxldGU7CisgIHZpcnR1YWwgfk1DQXNtUGFyc2VyKCk7CisKKyAgdmlydHVhbCB2b2lkIGFkZERpcmVjdGl2ZUhhbmRsZXIoU3RyaW5nUmVmIERpcmVjdGl2ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uRGlyZWN0aXZlSGFuZGxlciBIYW5kbGVyKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIGFkZEFsaWFzRm9yRGlyZWN0aXZlKFN0cmluZ1JlZiBEaXJlY3RpdmUsIFN0cmluZ1JlZiBBbGlhcykgPSAwOworCisgIHZpcnR1YWwgU291cmNlTWdyICZnZXRTb3VyY2VNYW5hZ2VyKCkgPSAwOworCisgIHZpcnR1YWwgTUNBc21MZXhlciAmZ2V0TGV4ZXIoKSA9IDA7CisgIGNvbnN0IE1DQXNtTGV4ZXIgJmdldExleGVyKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PE1DQXNtUGFyc2VyKj4odGhpcyktPmdldExleGVyKCk7CisgIH0KKworICB2aXJ0dWFsIE1DQ29udGV4dCAmZ2V0Q29udGV4dCgpID0gMDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgb3V0cHV0IHN0cmVhbWVyIGZvciB0aGUgYXNzZW1ibGVyLgorICB2aXJ0dWFsIE1DU3RyZWFtZXIgJmdldFN0cmVhbWVyKCkgPSAwOworCisgIE1DVGFyZ2V0QXNtUGFyc2VyICZnZXRUYXJnZXRQYXJzZXIoKSBjb25zdCB7IHJldHVybiAqVGFyZ2V0UGFyc2VyOyB9CisgIHZvaWQgc2V0VGFyZ2V0UGFyc2VyKE1DVGFyZ2V0QXNtUGFyc2VyICZQKTsKKworICB2aXJ0dWFsIHVuc2lnbmVkIGdldEFzc2VtYmxlckRpYWxlY3QoKSB7IHJldHVybiAwO30KKyAgdmlydHVhbCB2b2lkIHNldEFzc2VtYmxlckRpYWxlY3QodW5zaWduZWQgaSkgeyB9CisKKyAgYm9vbCBnZXRTaG93UGFyc2VkT3BlcmFuZHMoKSBjb25zdCB7IHJldHVybiBTaG93UGFyc2VkT3BlcmFuZHM7IH0KKyAgdm9pZCBzZXRTaG93UGFyc2VkT3BlcmFuZHMoYm9vbCBWYWx1ZSkgeyBTaG93UGFyc2VkT3BlcmFuZHMgPSBWYWx1ZTsgfQorCisgIHZvaWQgc2V0RW5hYmxlUHJpbnRTY2hlZEluZm8oYm9vbCBWYWx1ZSkgeyBFbmFibGVQcmludFNjaGVkSW5mbyA9IFZhbHVlOyB9CisgIGJvb2wgc2hvdWxkUHJpbnRTY2hlZEluZm8oKSB7IHJldHVybiBFbmFibGVQcmludFNjaGVkSW5mbzsgfQorCisgIC8vLyBcYnJpZWYgUnVuIHRoZSBwYXJzZXIgb24gdGhlIGlucHV0IHNvdXJjZSBidWZmZXIuCisgIHZpcnR1YWwgYm9vbCBSdW4oYm9vbCBOb0luaXRpYWxUZXh0U2VjdGlvbiwgYm9vbCBOb0ZpbmFsaXplID0gZmFsc2UpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgc2V0UGFyc2luZ0lubGluZUFzbShib29sIFYpID0gMDsKKyAgdmlydHVhbCBib29sIGlzUGFyc2luZ0lubGluZUFzbSgpID0gMDsKKworICAvLy8gXGJyaWVmIFBhcnNlIE1TLXN0eWxlIGlubGluZSBhc3NlbWJseS4KKyAgdmlydHVhbCBib29sIHBhcnNlTVNJbmxpbmVBc20oCisgICAgICB2b2lkICpBc21Mb2MsIHN0ZDo6c3RyaW5nICZBc21TdHJpbmcsIHVuc2lnbmVkICZOdW1PdXRwdXRzLAorICAgICAgdW5zaWduZWQgJk51bUlucHV0cywgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjx2b2lkICosIGJvb2w+PiAmT3BEZWNscywKKyAgICAgIFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnN0cmluZz4gJkNvbnN0cmFpbnRzLAorICAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6c3RyaW5nPiAmQ2xvYmJlcnMsIGNvbnN0IE1DSW5zdHJJbmZvICpNSUksCisgICAgICBjb25zdCBNQ0luc3RQcmludGVyICpJUCwgTUNBc21QYXJzZXJTZW1hQ2FsbGJhY2sgJlNJKSA9IDA7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgbm90ZSBhdCB0aGUgbG9jYXRpb24gXHAgTCwgd2l0aCB0aGUgbWVzc2FnZSBccCBNc2cuCisgIHZpcnR1YWwgdm9pZCBOb3RlKFNNTG9jIEwsIGNvbnN0IFR3aW5lICZNc2csIFNNUmFuZ2UgUmFuZ2UgPSBOb25lKSA9IDA7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgd2FybmluZyBhdCB0aGUgbG9jYXRpb24gXHAgTCwgd2l0aCB0aGUgbWVzc2FnZSBccCBNc2cuCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgcmV0dXJuIHZhbHVlIGlzIHRydWUsIGlmIHdhcm5pbmdzIGFyZSBmYXRhbC4KKyAgdmlydHVhbCBib29sIFdhcm5pbmcoU01Mb2MgTCwgY29uc3QgVHdpbmUgJk1zZywgU01SYW5nZSBSYW5nZSA9IE5vbmUpID0gMDsKKworICAvLy8gXGJyaWVmIFJldHVybiBhbiBlcnJvciBhdCB0aGUgbG9jYXRpb24gXHAgTCwgd2l0aCB0aGUgbWVzc2FnZSBccCBNc2cuIFRoaXMKKyAgLy8vIG1heSBiZSBtb2RpZmllZCBiZWZvcmUgYmVpbmcgZW1pdHRlZC4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSByZXR1cm4gdmFsdWUgaXMgYWx3YXlzIHRydWUsIGFzIGFuIGlkaW9tYXRpYyBjb252ZW5pZW5jZSB0bworICAvLy8gY2xpZW50cy4KKyAgYm9vbCBFcnJvcihTTUxvYyBMLCBjb25zdCBUd2luZSAmTXNnLCBTTVJhbmdlIFJhbmdlID0gTm9uZSk7CisKKyAgLy8vIFxicmllZiBFbWl0IGFuIGVycm9yIGF0IHRoZSBsb2NhdGlvbiBccCBMLCB3aXRoIHRoZSBtZXNzYWdlIFxwIE1zZy4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSByZXR1cm4gdmFsdWUgaXMgYWx3YXlzIHRydWUsIGFzIGFuIGlkaW9tYXRpYyBjb252ZW5pZW5jZSB0bworICAvLy8gY2xpZW50cy4KKyAgdmlydHVhbCBib29sIHByaW50RXJyb3IoU01Mb2MgTCwgY29uc3QgVHdpbmUgJk1zZywgU01SYW5nZSBSYW5nZSA9IE5vbmUpID0gMDsKKworICBib29sIGhhc1BlbmRpbmdFcnJvcigpIHsgcmV0dXJuICFQZW5kaW5nRXJyb3JzLmVtcHR5KCk7IH0KKworICBib29sIHByaW50UGVuZGluZ0Vycm9ycygpIHsKKyAgICBib29sIHJ2ID0gIVBlbmRpbmdFcnJvcnMuZW1wdHkoKTsKKyAgICBmb3IgKGF1dG8gRXJyIDogUGVuZGluZ0Vycm9ycykgeworICAgICAgcHJpbnRFcnJvcihFcnIuTG9jLCBUd2luZShFcnIuTXNnKSwgRXJyLlJhbmdlKTsKKyAgICB9CisgICAgUGVuZGluZ0Vycm9ycy5jbGVhcigpOworICAgIHJldHVybiBydjsKKyAgfQorCisgIGJvb2wgYWRkRXJyb3JTdWZmaXgoY29uc3QgVHdpbmUgJlN1ZmZpeCk7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG5leHQgQXNtVG9rZW4gaW4gdGhlIHN0cmVhbSwgcG9zc2libHkgaGFuZGxpbmcgZmlsZQorICAvLy8gaW5jbHVzaW9uIGZpcnN0LgorICB2aXJ0dWFsIGNvbnN0IEFzbVRva2VuICZMZXgoKSA9IDA7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGN1cnJlbnQgQXNtVG9rZW4gZnJvbSB0aGUgc3RyZWFtLgorICBjb25zdCBBc21Ub2tlbiAmZ2V0VG9rKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXBvcnQgYW4gZXJyb3IgYXQgdGhlIGN1cnJlbnQgbGV4ZXIgbG9jYXRpb24uCisgIGJvb2wgVG9rRXJyb3IoY29uc3QgVHdpbmUgJk1zZywgU01SYW5nZSBSYW5nZSA9IE5vbmUpOworCisgIGJvb2wgcGFyc2VUb2tlbkxvYyhTTUxvYyAmTG9jKTsKKyAgYm9vbCBwYXJzZVRva2VuKEFzbVRva2VuOjpUb2tlbktpbmQgVCwgY29uc3QgVHdpbmUgJk1zZyA9ICJ1bmV4cGVjdGVkIHRva2VuIik7CisgIC8vLyBcYnJpZWYgQXR0ZW1wdCB0byBwYXJzZSBhbmQgY29uc3VtZSB0b2tlbiwgcmV0dXJuaW5nIHRydWUgb24KKyAgLy8vIHN1Y2Nlc3MuCisgIGJvb2wgcGFyc2VPcHRpb25hbFRva2VuKEFzbVRva2VuOjpUb2tlbktpbmQgVCk7CisKKyAgYm9vbCBwYXJzZUVPTChjb25zdCBUd2luZSAmRXJyTXNnKTsKKworICBib29sIHBhcnNlTWFueShmdW5jdGlvbl9yZWY8Ym9vbCgpPiBwYXJzZU9uZSwgYm9vbCBoYXNDb21tYSA9IHRydWUpOworCisgIGJvb2wgcGFyc2VJbnRUb2tlbihpbnQ2NF90ICZWLCBjb25zdCBUd2luZSAmRXJyTXNnKTsKKworICBib29sIGNoZWNrKGJvb2wgUCwgY29uc3QgVHdpbmUgJk1zZyk7CisgIGJvb2wgY2hlY2soYm9vbCBQLCBTTUxvYyBMb2MsIGNvbnN0IFR3aW5lICZNc2cpOworCisgIC8vLyBcYnJpZWYgUGFyc2UgYW4gaWRlbnRpZmllciBvciBzdHJpbmcgKGFzIGEgcXVvdGVkIGlkZW50aWZpZXIpIGFuZCBzZXQgXHAKKyAgLy8vIFJlcyB0byB0aGUgaWRlbnRpZmllciBjb250ZW50cy4KKyAgdmlydHVhbCBib29sIHBhcnNlSWRlbnRpZmllcihTdHJpbmdSZWYgJlJlcykgPSAwOworCisgIC8vLyBcYnJpZWYgUGFyc2UgdXAgdG8gdGhlIGVuZCBvZiBzdGF0ZW1lbnQgYW5kIHJldHVybiB0aGUgY29udGVudHMgZnJvbSB0aGUKKyAgLy8vIGN1cnJlbnQgdG9rZW4gdW50aWwgdGhlIGVuZCBvZiB0aGUgc3RhdGVtZW50OyB0aGUgY3VycmVudCB0b2tlbiBvbiBleGl0CisgIC8vLyB3aWxsIGJlIGVpdGhlciB0aGUgRW5kT2ZTdGF0ZW1lbnQgb3IgRU9GLgorICB2aXJ0dWFsIFN0cmluZ1JlZiBwYXJzZVN0cmluZ1RvRW5kT2ZTdGF0ZW1lbnQoKSA9IDA7CisKKyAgLy8vIFxicmllZiBQYXJzZSB0aGUgY3VycmVudCB0b2tlbiBhcyBhIHN0cmluZyB3aGljaCBtYXkgaW5jbHVkZSBlc2NhcGVkCisgIC8vLyBjaGFyYWN0ZXJzIGFuZCByZXR1cm4gdGhlIHN0cmluZyBjb250ZW50cy4KKyAgdmlydHVhbCBib29sIHBhcnNlRXNjYXBlZFN0cmluZyhzdGQ6OnN0cmluZyAmRGF0YSkgPSAwOworCisgIC8vLyBcYnJpZWYgU2tpcCB0byB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHN0YXRlbWVudCwgZm9yIGVycm9yIHJlY292ZXJ5LgorICB2aXJ0dWFsIHZvaWQgZWF0VG9FbmRPZlN0YXRlbWVudCgpID0gMDsKKworICAvLy8gXGJyaWVmIFBhcnNlIGFuIGFyYml0cmFyeSBleHByZXNzaW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBSZXMgLSBUaGUgdmFsdWUgb2YgdGhlIGV4cHJlc3Npb24uIFRoZSByZXN1bHQgaXMgdW5kZWZpbmVkCisgIC8vLyBvbiBlcnJvci4KKyAgLy8vIFxyZXR1cm4gLSBGYWxzZSBvbiBzdWNjZXNzLgorICB2aXJ0dWFsIGJvb2wgcGFyc2VFeHByZXNzaW9uKGNvbnN0IE1DRXhwciAqJlJlcywgU01Mb2MgJkVuZExvYykgPSAwOworICBib29sIHBhcnNlRXhwcmVzc2lvbihjb25zdCBNQ0V4cHIgKiZSZXMpOworCisgIC8vLyBcYnJpZWYgUGFyc2UgYSBwcmltYXJ5IGV4cHJlc3Npb24uCisgIC8vLworICAvLy8gXHBhcmFtIFJlcyAtIFRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbi4gVGhlIHJlc3VsdCBpcyB1bmRlZmluZWQKKyAgLy8vIG9uIGVycm9yLgorICAvLy8gXHJldHVybiAtIEZhbHNlIG9uIHN1Y2Nlc3MuCisgIHZpcnR1YWwgYm9vbCBwYXJzZVByaW1hcnlFeHByKGNvbnN0IE1DRXhwciAqJlJlcywgU01Mb2MgJkVuZExvYykgPSAwOworCisgIC8vLyBcYnJpZWYgUGFyc2UgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24sIGFzc3VtaW5nIHRoYXQgYW4gaW5pdGlhbCAnKCcgaGFzCisgIC8vLyBhbHJlYWR5IGJlZW4gY29uc3VtZWQuCisgIC8vLworICAvLy8gXHBhcmFtIFJlcyAtIFRoZSB2YWx1ZSBvZiB0aGUgZXhwcmVzc2lvbi4gVGhlIHJlc3VsdCBpcyB1bmRlZmluZWQKKyAgLy8vIG9uIGVycm9yLgorICAvLy8gXHJldHVybiAtIEZhbHNlIG9uIHN1Y2Nlc3MuCisgIHZpcnR1YWwgYm9vbCBwYXJzZVBhcmVuRXhwcmVzc2lvbihjb25zdCBNQ0V4cHIgKiZSZXMsIFNNTG9jICZFbmRMb2MpID0gMDsKKworICAvLy8gXGJyaWVmIFBhcnNlIGFuIGV4cHJlc3Npb24gd2hpY2ggbXVzdCBldmFsdWF0ZSB0byBhbiBhYnNvbHV0ZSB2YWx1ZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gUmVzIC0gVGhlIHZhbHVlIG9mIHRoZSBhYnNvbHV0ZSBleHByZXNzaW9uLiBUaGUgcmVzdWx0IGlzIHVuZGVmaW5lZAorICAvLy8gb24gZXJyb3IuCisgIC8vLyBccmV0dXJuIC0gRmFsc2Ugb24gc3VjY2Vzcy4KKyAgdmlydHVhbCBib29sIHBhcnNlQWJzb2x1dGVFeHByZXNzaW9uKGludDY0X3QgJlJlcykgPSAwOworCisgIC8vLyBcYnJpZWYgRW5zdXJlIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIHNlY3Rpb24gc2V0IGluIHRoZSBzdHJlYW1lci4gT3RoZXJ3aXNlLAorICAvLy8gcmVwb3J0IGFuIGVycm9yIGFuZCBzd2l0Y2ggdG8gLnRleHQuCisgIC8vLyBccmV0dXJuIC0gRmFsc2Ugb24gc3VjY2Vzcy4KKyAgdmlydHVhbCBib29sIGNoZWNrRm9yVmFsaWRTZWN0aW9uKCkgPSAwOworCisgIC8vLyBcYnJpZWYgUGFyc2UgYW4gYXJiaXRyYXJ5IGV4cHJlc3Npb24gb2YgYSBzcGVjaWZpZWQgcGFyZW50aGVzaXMgZGVwdGgsCisgIC8vLyBhc3N1bWluZyB0aGF0IHRoZSBpbml0aWFsICcoJyBjaGFyYWN0ZXJzIGhhdmUgYWxyZWFkeSBiZWVuIGNvbnN1bWVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBQYXJlbkRlcHRoIC0gU3BlY2lmaWVzIGhvdyBtYW55IHRyYWlsaW5nIGV4cHJlc3Npb25zIG91dHNpZGUgdGhlCisgIC8vLyBjdXJyZW50IHBhcmVudGhlc2VzIHdlIGhhdmUgdG8gcGFyc2UuCisgIC8vLyBccGFyYW0gUmVzIC0gVGhlIHZhbHVlIG9mIHRoZSBleHByZXNzaW9uLiBUaGUgcmVzdWx0IGlzIHVuZGVmaW5lZAorICAvLy8gb24gZXJyb3IuCisgIC8vLyBccmV0dXJuIC0gRmFsc2Ugb24gc3VjY2Vzcy4KKyAgdmlydHVhbCBib29sIHBhcnNlUGFyZW5FeHByT2ZEZXB0aCh1bnNpZ25lZCBQYXJlbkRlcHRoLCBjb25zdCBNQ0V4cHIgKiZSZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01Mb2MgJkVuZExvYykgPSAwOworfTsKKworLy8vIFxicmllZiBDcmVhdGUgYW4gTUNBc21QYXJzZXIgaW5zdGFuY2UuCitNQ0FzbVBhcnNlciAqY3JlYXRlTUNBc21QYXJzZXIoU291cmNlTWdyICYsIE1DQ29udGV4dCAmLCBNQ1N0cmVhbWVyICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNBc21JbmZvICYsIHVuc2lnbmVkIENCID0gMCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DUEFSU0VSX01DQVNNUEFSU0VSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvTUNBc21QYXJzZXJFeHRlbnNpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvTUNBc21QYXJzZXJFeHRlbnNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmI4ZDdhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9NQ0FzbVBhcnNlckV4dGVuc2lvbi5oCkBAIC0wLDAgKzEsMTIxIEBACisvLz09PS0gbGx2bS9NQy9NQ0FzbVBhcnNlckV4dGVuc2lvbi5oIC0gQXNtIFBhcnNlciBIb29rcyAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNQQVJTRVJfTUNBU01QQVJTRVJFWFRFTlNJT05fSAorI2RlZmluZSBMTFZNX01DX01DUEFSU0VSX01DQVNNUEFSU0VSRVhURU5TSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNQYXJzZXIvTUNBc21MZXhlci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNQYXJzZXIvTUNBc21QYXJzZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU01Mb2MuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBUd2luZTsKKworLy8vIFxicmllZiBHZW5lcmljIGludGVyZmFjZSBmb3IgZXh0ZW5kaW5nIHRoZSBNQ0FzbVBhcnNlciwKKy8vLyB3aGljaCBpcyBpbXBsZW1lbnRlZCBieSB0YXJnZXQgYW5kIG9iamVjdCBmaWxlIGFzc2VtYmx5IHBhcnNlcgorLy8vIGltcGxlbWVudGF0aW9ucy4KK2NsYXNzIE1DQXNtUGFyc2VyRXh0ZW5zaW9uIHsKKyAgTUNBc21QYXJzZXIgKlBhcnNlcjsKKworcHJvdGVjdGVkOgorICBNQ0FzbVBhcnNlckV4dGVuc2lvbigpOworCisgIC8vIEhlbHBlciB0ZW1wbGF0ZSBmb3IgaW1wbGVtZW50aW5nIHN0YXRpYyBkaXNwYXRjaCBmdW5jdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIGJvb2wgKFQ6OipIYW5kbGVyKShTdHJpbmdSZWYsIFNNTG9jKT4KKyAgc3RhdGljIGJvb2wgSGFuZGxlRGlyZWN0aXZlKE1DQXNtUGFyc2VyRXh0ZW5zaW9uICpUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRGlyZWN0aXZlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01Mb2MgRGlyZWN0aXZlTG9jKSB7CisgICAgVCAqT2JqID0gc3RhdGljX2Nhc3Q8VCo+KFRhcmdldCk7CisgICAgcmV0dXJuIChPYmotPipIYW5kbGVyKShEaXJlY3RpdmUsIERpcmVjdGl2ZUxvYyk7CisgIH0KKworICBib29sIEJyYWNrZXRFeHByZXNzaW9uc1N1cHBvcnRlZCA9IGZhbHNlOworCitwdWJsaWM6CisgIE1DQXNtUGFyc2VyRXh0ZW5zaW9uKGNvbnN0IE1DQXNtUGFyc2VyRXh0ZW5zaW9uICYpID0gZGVsZXRlOworICBNQ0FzbVBhcnNlckV4dGVuc2lvbiAmb3BlcmF0b3I9KGNvbnN0IE1DQXNtUGFyc2VyRXh0ZW5zaW9uICYpID0gZGVsZXRlOworICB2aXJ0dWFsIH5NQ0FzbVBhcnNlckV4dGVuc2lvbigpOworCisgIC8vLyBcYnJpZWYgSW5pdGlhbGl6ZSB0aGUgZXh0ZW5zaW9uIGZvciBwYXJzaW5nIHVzaW5nIHRoZSBnaXZlbiBccCBQYXJzZXIuCisgIC8vLyBUaGUgZXh0ZW5zaW9uIHNob3VsZCB1c2UgdGhlIEFzbVBhcnNlciBpbnRlcmZhY2VzIHRvIHJlZ2lzdGVyIGl0cworICAvLy8gcGFyc2luZyByb3V0aW5lcy4KKyAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoTUNBc21QYXJzZXIgJlBhcnNlcik7CisKKyAgLy8vIFxuYW1lIE1DQXNtUGFyc2VyIFByb3h5IEludGVyZmFjZXMKKyAgLy8vIEB7CisKKyAgTUNDb250ZXh0ICZnZXRDb250ZXh0KCkgeyByZXR1cm4gZ2V0UGFyc2VyKCkuZ2V0Q29udGV4dCgpOyB9CisKKyAgTUNBc21MZXhlciAmZ2V0TGV4ZXIoKSB7IHJldHVybiBnZXRQYXJzZXIoKS5nZXRMZXhlcigpOyB9CisgIGNvbnN0IE1DQXNtTGV4ZXIgJmdldExleGVyKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PE1DQXNtUGFyc2VyRXh0ZW5zaW9uICo+KHRoaXMpLT5nZXRMZXhlcigpOworICB9CisKKyAgTUNBc21QYXJzZXIgJmdldFBhcnNlcigpIHsgcmV0dXJuICpQYXJzZXI7IH0KKyAgY29uc3QgTUNBc21QYXJzZXIgJmdldFBhcnNlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxNQ0FzbVBhcnNlckV4dGVuc2lvbio+KHRoaXMpLT5nZXRQYXJzZXIoKTsKKyAgfQorCisgIFNvdXJjZU1nciAmZ2V0U291cmNlTWFuYWdlcigpIHsgcmV0dXJuIGdldFBhcnNlcigpLmdldFNvdXJjZU1hbmFnZXIoKTsgfQorICBNQ1N0cmVhbWVyICZnZXRTdHJlYW1lcigpIHsgcmV0dXJuIGdldFBhcnNlcigpLmdldFN0cmVhbWVyKCk7IH0KKworICBib29sIFdhcm5pbmcoU01Mb2MgTCwgY29uc3QgVHdpbmUgJk1zZykgeworICAgIHJldHVybiBnZXRQYXJzZXIoKS5XYXJuaW5nKEwsIE1zZyk7CisgIH0KKworICBib29sIEVycm9yKFNNTG9jIEwsIGNvbnN0IFR3aW5lICZNc2csIFNNUmFuZ2UgUmFuZ2UgPSBTTVJhbmdlKCkpIHsKKyAgICByZXR1cm4gZ2V0UGFyc2VyKCkuRXJyb3IoTCwgTXNnLCBSYW5nZSk7CisgIH0KKworICB2b2lkIE5vdGUoU01Mb2MgTCwgY29uc3QgVHdpbmUgJk1zZykgeworICAgIGdldFBhcnNlcigpLk5vdGUoTCwgTXNnKTsKKyAgfQorCisgIGJvb2wgVG9rRXJyb3IoY29uc3QgVHdpbmUgJk1zZykgeworICAgIHJldHVybiBnZXRQYXJzZXIoKS5Ub2tFcnJvcihNc2cpOworICB9CisKKyAgY29uc3QgQXNtVG9rZW4gJkxleCgpIHsgcmV0dXJuIGdldFBhcnNlcigpLkxleCgpOyB9CisgIGNvbnN0IEFzbVRva2VuICZnZXRUb2soKSB7IHJldHVybiBnZXRQYXJzZXIoKS5nZXRUb2soKTsgfQorICBib29sIHBhcnNlVG9rZW4oQXNtVG9rZW46OlRva2VuS2luZCBULAorICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk1zZyA9ICJ1bmV4cGVjdGVkIHRva2VuIikgeworICAgIHJldHVybiBnZXRQYXJzZXIoKS5wYXJzZVRva2VuKFQsIE1zZyk7CisgIH0KKworICBib29sIHBhcnNlTWFueShmdW5jdGlvbl9yZWY8Ym9vbCgpPiBwYXJzZU9uZSwgYm9vbCBoYXNDb21tYSA9IHRydWUpIHsKKyAgICByZXR1cm4gZ2V0UGFyc2VyKCkucGFyc2VNYW55KHBhcnNlT25lLCBoYXNDb21tYSk7CisgIH0KKworICBib29sIHBhcnNlT3B0aW9uYWxUb2tlbihBc21Ub2tlbjo6VG9rZW5LaW5kIFQpIHsKKyAgICByZXR1cm4gZ2V0UGFyc2VyKCkucGFyc2VPcHRpb25hbFRva2VuKFQpOworICB9CisKKyAgYm9vbCBjaGVjayhib29sIFAsIGNvbnN0IFR3aW5lICZNc2cpIHsKKyAgICByZXR1cm4gZ2V0UGFyc2VyKCkuY2hlY2soUCwgTXNnKTsKKyAgfQorCisgIGJvb2wgY2hlY2soYm9vbCBQLCBTTUxvYyBMb2MsIGNvbnN0IFR3aW5lICZNc2cpIHsKKyAgICByZXR1cm4gZ2V0UGFyc2VyKCkuY2hlY2soUCwgTG9jLCBNc2cpOworICB9CisKKyAgYm9vbCBhZGRFcnJvclN1ZmZpeChjb25zdCBUd2luZSAmU3VmZml4KSB7CisgICAgcmV0dXJuIGdldFBhcnNlcigpLmFkZEVycm9yU3VmZml4KFN1ZmZpeCk7CisgIH0KKworICBib29sIEhhc0JyYWNrZXRFeHByZXNzaW9ucygpIGNvbnN0IHsgcmV0dXJuIEJyYWNrZXRFeHByZXNzaW9uc1N1cHBvcnRlZDsgfQorCisgIC8vLyBAfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNQQVJTRVJfTUNBU01QQVJTRVJFWFRFTlNJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9NQ0FzbVBhcnNlclV0aWxzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DUGFyc2VyL01DQXNtUGFyc2VyVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDE3M2JiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9NQ0FzbVBhcnNlclV0aWxzLmgKQEAgLTAsMCArMSwzNCBAQAorLy89PT0tIGxsdm0vTUMvTUNBc21QYXJzZXJVdGlscy5oIC0gQXNtIFBhcnNlciBVdGlsaXRpZXMgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DUEFSU0VSX01DQVNNUEFSU0VSVVRJTFNfSAorI2RlZmluZSBMTFZNX01DX01DUEFSU0VSX01DQVNNUEFSU0VSVVRJTFNfSAorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DQXNtUGFyc2VyOworY2xhc3MgTUNFeHByOworY2xhc3MgTUNTeW1ib2w7CitjbGFzcyBTdHJpbmdSZWY7CisKK25hbWVzcGFjZSBNQ1BhcnNlclV0aWxzIHsKKworLy8vIFBhcnNlIGEgdmFsdWUgZXhwcmVzc2lvbiBhbmQgcmV0dXJuIHdoZXRoZXIgaXQgY2FuIGJlIGFzc2lnbmVkIHRvIGEgc3ltYm9sCisvLy8gd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KKy8vLworLy8vIE9uIHN1Y2Nlc3MsIHJldHVybnMgZmFsc2UgYW5kIHNldHMgdGhlIFN5bWJvbCBhbmQgVmFsdWUgb3V0cHV0IHBhcmFtZXRlcnMuCitib29sIHBhcnNlQXNzaWdubWVudEV4cHJlc3Npb24oU3RyaW5nUmVmIE5hbWUsIGJvb2wgYWxsb3dfcmVkZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBc21QYXJzZXIgJlBhcnNlciwgTUNTeW1ib2wgKiZTeW1ib2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNFeHByIComVmFsdWUpOworCit9IC8vIG5hbWVzcGFjZSBNQ1BhcnNlclV0aWxzCisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNQQVJTRVJfTUNBU01QQVJTRVJVVElMU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DUGFyc2VyL01DUGFyc2VkQXNtT3BlcmFuZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9NQ1BhcnNlZEFzbU9wZXJhbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YWY3NmFjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1BhcnNlci9NQ1BhcnNlZEFzbU9wZXJhbmQuaApAQCAtMCwwICsxLDEwMCBAQAorLy89PT0tIGxsdm0vTUMvTUNQYXJzZWRBc21PcGVyYW5kLmggLSBBc20gUGFyc2VyIE9wZXJhbmQgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DUEFSU0VSX01DUEFSU0VEQVNNT1BFUkFORF9ICisjZGVmaW5lIExMVk1fTUNfTUNQQVJTRVJfTUNQQVJTRURBU01PUEVSQU5EX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TTUxvYy5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworLy8vIE1DUGFyc2VkQXNtT3BlcmFuZCAtIFRoaXMgYWJzdHJhY3QgY2xhc3MgcmVwcmVzZW50cyBhIHNvdXJjZS1sZXZlbCBhc3NlbWJseQorLy8vIGluc3RydWN0aW9uIG9wZXJhbmQuICBJdCBzaG91bGQgYmUgc3ViY2xhc3NlZCBieSB0YXJnZXQtc3BlY2lmaWMgY29kZS4gIFRoaXMKKy8vLyBiYXNlIGNsYXNzIGlzIHVzZWQgYnkgdGFyZ2V0LWluZGVwZW5kZW50IGNsaWVudHMgYW5kIGlzIHRoZSBpbnRlcmZhY2UKKy8vLyBiZXR3ZWVuIHBhcnNpbmcgYW4gYXNtIGluc3RydWN0aW9uIGFuZCByZWNvZ25pemluZyBpdC4KK2NsYXNzIE1DUGFyc2VkQXNtT3BlcmFuZCB7CisgIC8vLyBNQ09wZXJhbmROdW0gLSBUaGUgY29ycmVzcG9uZGluZyBNQ0luc3Qgb3BlcmFuZCBudW1iZXIuICBPbmx5IHZhbGlkIHdoZW4KKyAgLy8vIHBhcnNpbmcgTVMtc3R5bGUgaW5saW5lIGFzc2VtYmx5LgorICB1bnNpZ25lZCBNQ09wZXJhbmROdW07CisKKyAgLy8vIENvbnN0cmFpbnQgLSBUaGUgY29uc3RyYWludCBvbiB0aGlzIG9wZXJhbmQuICBPbmx5IHZhbGlkIHdoZW4gcGFyc2luZworICAvLy8gTVMtc3R5bGUgaW5saW5lIGFzc2VtYmx5LgorICBzdGQ6OnN0cmluZyBDb25zdHJhaW50OworCitwcm90ZWN0ZWQ6CisgIC8vIFRoaXMgb25seSBzZWVtcyB0byBuZWVkIHRvIGJlIG1vdmFibGUgKGJ5IEFSTU9wZXJhbmQpIGJ1dCBBUk1PcGVyYW5kIGhhcworICAvLyBsb3RzIG9mIG1lbWJlcnMgYW5kIE1TVkMgZG9lc24ndCBzdXBwb3J0IGRlZmF1bHRlZCBtb3ZlIG9wcywgc28gdG8gYXZvaWQKKyAgLy8gdGhhdCB2ZXJib3NpdHksIGp1c3QgcmVseSBvbiBkZWZhdWx0ZWQgY29weSBvcHMuIEl0J3Mgb25seSB0aGUgQ29uc3RyYWludAorICAvLyBzdHJpbmcgbWVtYmVyIHRoYXQgd291bGQgYmVuZWZpdCBmcm9tIG1vdmVtZW50IGFueXdheS4KKyAgTUNQYXJzZWRBc21PcGVyYW5kKCkgPSBkZWZhdWx0OworICBNQ1BhcnNlZEFzbU9wZXJhbmQoY29uc3QgTUNQYXJzZWRBc21PcGVyYW5kICZSSFMpID0gZGVmYXVsdDsKKyAgTUNQYXJzZWRBc21PcGVyYW5kICZvcGVyYXRvcj0oY29uc3QgTUNQYXJzZWRBc21PcGVyYW5kICYpID0gZGVmYXVsdDsKKworcHVibGljOgorICB2aXJ0dWFsIH5NQ1BhcnNlZEFzbU9wZXJhbmQoKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBzZXRDb25zdHJhaW50KFN0cmluZ1JlZiBDKSB7IENvbnN0cmFpbnQgPSBDLnN0cigpOyB9CisgIFN0cmluZ1JlZiBnZXRDb25zdHJhaW50KCkgeyByZXR1cm4gQ29uc3RyYWludDsgfQorCisgIHZvaWQgc2V0TUNPcGVyYW5kTnVtICh1bnNpZ25lZCBPcE51bSkgeyBNQ09wZXJhbmROdW0gPSBPcE51bTsgfQorICB1bnNpZ25lZCBnZXRNQ09wZXJhbmROdW0oKSB7IHJldHVybiBNQ09wZXJhbmROdW07IH0KKworICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRTeW1OYW1lKCkgeyByZXR1cm4gU3RyaW5nUmVmKCk7IH0KKyAgdmlydHVhbCB2b2lkICpnZXRPcERlY2woKSB7IHJldHVybiBudWxscHRyOyB9CisKKyAgLy8vIGlzVG9rZW4gLSBJcyB0aGlzIGEgdG9rZW4gb3BlcmFuZD8KKyAgdmlydHVhbCBib29sIGlzVG9rZW4oKSBjb25zdCA9IDA7CisgIC8vLyBpc0ltbSAtIElzIHRoaXMgYW4gaW1tZWRpYXRlIG9wZXJhbmQ/CisgIHZpcnR1YWwgYm9vbCBpc0ltbSgpIGNvbnN0ID0gMDsKKyAgLy8vIGlzUmVnIC0gSXMgdGhpcyBhIHJlZ2lzdGVyIG9wZXJhbmQ/CisgIHZpcnR1YWwgYm9vbCBpc1JlZygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXRSZWcoKSBjb25zdCA9IDA7CisKKyAgLy8vIGlzTWVtIC0gSXMgdGhpcyBhIG1lbW9yeSBvcGVyYW5kPworICB2aXJ0dWFsIGJvb2wgaXNNZW0oKSBjb25zdCA9IDA7CisKKyAgLy8vIGdldFN0YXJ0TG9jIC0gR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgZmlyc3QgdG9rZW4gb2YgdGhpcyBvcGVyYW5kLgorICB2aXJ0dWFsIFNNTG9jIGdldFN0YXJ0TG9jKCkgY29uc3QgPSAwOworICAvLy8gZ2V0RW5kTG9jIC0gR2V0IHRoZSBsb2NhdGlvbiBvZiB0aGUgbGFzdCB0b2tlbiBvZiB0aGlzIG9wZXJhbmQuCisgIHZpcnR1YWwgU01Mb2MgZ2V0RW5kTG9jKCkgY29uc3QgPSAwOworCisgIC8vLyBuZWVkQWRkcmVzc09mIC0gRG8gd2UgbmVlZCB0byBlbWl0IGNvZGUgdG8gZ2V0IHRoZSBhZGRyZXNzIG9mIHRoZQorICAvLy8gdmFyaWFibGUvbGFiZWw/ICAgT25seSB2YWxpZCB3aGVuIHBhcnNpbmcgTVMtc3R5bGUgaW5saW5lIGFzc2VtYmx5LgorICB2aXJ0dWFsIGJvb2wgbmVlZEFkZHJlc3NPZigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIGlzT2Zmc2V0T2YgLSBEbyB3ZSBuZWVkIHRvIGVtaXQgY29kZSB0byBnZXQgdGhlIG9mZnNldCBvZiB0aGUgdmFyaWFibGUsCisgIC8vLyByYXRoZXIgdGhlbiB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlPyAgIE9ubHkgdmFsaWQgd2hlbiBwYXJzaW5nIE1TLXN0eWxlCisgIC8vLyBpbmxpbmUgYXNzZW1ibHkuCisgIHZpcnR1YWwgYm9vbCBpc09mZnNldE9mKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gZ2V0T2Zmc2V0T2ZMb2MgLSBHZXQgdGhlIGxvY2F0aW9uIG9mIHRoZSBvZmZzZXQgb3BlcmF0b3IuCisgIHZpcnR1YWwgU01Mb2MgZ2V0T2Zmc2V0T2ZMb2MoKSBjb25zdCB7IHJldHVybiBTTUxvYygpOyB9CisKKyAgLy8vIHByaW50IC0gUHJpbnQgYSBkZWJ1ZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgb3BlcmFuZCB0byB0aGUgZ2l2ZW4gc3RyZWFtLgorICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCA9IDA7CisKKyAgLy8vIGR1bXAgLSBQcmludCB0byB0aGUgZGVidWcgc3RyZWFtLgorICB2aXJ0dWFsIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIERlYnVnZ2luZyBTdXBwb3J0CisKK2lubGluZSByYXdfb3N0cmVhbSYgb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IE1DUGFyc2VkQXNtT3BlcmFuZCAmTU8pIHsKKyAgTU8ucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DUEFSU0VSX01DUEFSU0VEQVNNT1BFUkFORF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DUGFyc2VyL01DVGFyZ2V0QXNtUGFyc2VyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DUGFyc2VyL01DVGFyZ2V0QXNtUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDYyODc5NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNQYXJzZXIvTUNUYXJnZXRBc21QYXJzZXIuaApAQCAtMCwwICsxLDQzMiBAQAorLy89PT0tIGxsdm0vTUMvTUNUYXJnZXRBc21QYXJzZXIuaCAtIFRhcmdldCBBc3NlbWJseSBQYXJzZXIgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DUEFSU0VSX01DVEFSR0VUQVNNUEFSU0VSX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1BBUlNFUl9NQ1RBUkdFVEFTTVBBUlNFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRXhwci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNJbnN0ckluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL01DUGFyc2VyL01DQXNtTGV4ZXIuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DUGFyc2VyL01DQXNtUGFyc2VyRXh0ZW5zaW9uLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1RhcmdldE9wdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU01Mb2MuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0luc3Q7CitjbGFzcyBNQ1BhcnNlZEFzbU9wZXJhbmQ7CitjbGFzcyBNQ1N0cmVhbWVyOworY2xhc3MgTUNTdWJ0YXJnZXRJbmZvOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKKwordXNpbmcgT3BlcmFuZFZlY3RvciA9IFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnVuaXF1ZV9wdHI8TUNQYXJzZWRBc21PcGVyYW5kPj47CisKK2VudW0gQXNtUmV3cml0ZUtpbmQgeworICBBT0tfQWxpZ24sICAgICAgICAgIC8vIFJld3JpdGUgYWxpZ24gYXMgLmFsaWduLgorICBBT0tfRVZFTiwgICAgICAgICAgIC8vIFJld3JpdGUgZXZlbiBhcyAuZXZlbi4KKyAgQU9LX0VtaXQsICAgICAgICAgICAvLyBSZXdyaXRlIF9lbWl0IGFzIC5ieXRlLgorICBBT0tfSW5wdXQsICAgICAgICAgIC8vIFJld3JpdGUgaW4gdGVybXMgb2YgJE4uCisgIEFPS19PdXRwdXQsICAgICAgICAgLy8gUmV3cml0ZSBpbiB0ZXJtcyBvZiAkTi4KKyAgQU9LX1NpemVEaXJlY3RpdmUsICAvLyBBZGQgYSBzaXppbmcgZGlyZWN0aXZlIChlLmcuLCBkd29yZCBwdHIpLgorICBBT0tfTGFiZWwsICAgICAgICAgIC8vIFJld3JpdGUgbG9jYWwgbGFiZWxzLgorICBBT0tfRW5kT2ZTdGF0ZW1lbnQsIC8vIEFkZCBFbmRPZlN0YXRlbWVudCAoZS5nLiwgIlxuXHQiKS4KKyAgQU9LX1NraXAsICAgICAgICAgICAvLyBTa2lwIGVtaXNzaW9uIChlLmcuLCBvZmZzZXQvdHlwZSBvcGVyYXRvcnMpLgorICBBT0tfSW50ZWxFeHByICAgICAgIC8vIFNpemVEaXJlY3RpdmUgU3ltRGlzcCBbQmFzZVJlZyArIEluZGV4UmVnICogU2NhbGUgKyBJbW1EaXNwXQorfTsKKworY29uc3QgY2hhciBBc21SZXdyaXRlUHJlY2VkZW5jZSBbXSA9IHsKKyAgMiwgLy8gQU9LX0FsaWduCisgIDIsIC8vIEFPS19FVkVOCisgIDIsIC8vIEFPS19FbWl0CisgIDMsIC8vIEFPS19JbnB1dAorICAzLCAvLyBBT0tfT3V0cHV0CisgIDUsIC8vIEFPS19TaXplRGlyZWN0aXZlCisgIDEsIC8vIEFPS19MYWJlbAorICA1LCAvLyBBT0tfRW5kT2ZTdGF0ZW1lbnQKKyAgMiwgLy8gQU9LX1NraXAKKyAgMiAgLy8gQU9LX0ludGVsRXhwcgorfTsKKworLy8gUmVwcmVzbnQgdGhlIHZhcmlvdXMgcGFydHMgd2hpY2ggbWFrZXMgdXAgYW4gaW50ZWwgZXhwcmVzc2lvbiwKKy8vIHVzZWQgZm9yIGVtaXR0aW5nIGNvbXBvdW5kIGludGVsIGV4cHJlc3Npb25zCitzdHJ1Y3QgSW50ZWxFeHByIHsKKyAgYm9vbCBOZWVkQnJhY3M7CisgIGludDY0X3QgSW1tOworICBTdHJpbmdSZWYgQmFzZVJlZzsKKyAgU3RyaW5nUmVmIEluZGV4UmVnOworICB1bnNpZ25lZCBTY2FsZTsKKworICBJbnRlbEV4cHIoYm9vbCBuZWVkQnJhY3MgPSBmYWxzZSkgOiBOZWVkQnJhY3MobmVlZEJyYWNzKSwgSW1tKDApLAorICAgIEJhc2VSZWcoU3RyaW5nUmVmKCkpLCBJbmRleFJlZyhTdHJpbmdSZWYoKSksCisgICAgU2NhbGUoMSkge30KKyAgLy8gQ29tcHVuZCBpbW1lZGlhdGUgZXhwcmVzc2lvbgorICBJbnRlbEV4cHIoaW50NjRfdCBpbW0sIGJvb2wgbmVlZEJyYWNzKSA6IEludGVsRXhwcihuZWVkQnJhY3MpIHsKKyAgICBJbW0gPSBpbW07CisgIH0KKyAgLy8gW1JlZyArIEltbWVkaWF0ZUV4cHJlc3Npb25dCisgIC8vIFdlIGRvbid0IGJvdGhlciB0byBlbWl0IGFuIGltbWVkaWF0ZSBleHByZXNzaW9uIGV2YWx1YXRlZCB0byB6ZXJvCisgIEludGVsRXhwcihTdHJpbmdSZWYgcmVnLCBpbnQ2NF90IGltbSA9IDAsIHVuc2lnbmVkIHNjYWxlID0gMCwKKyAgICBib29sIG5lZWRCcmFjcyA9IHRydWUpIDoKKyAgICBJbnRlbEV4cHIoaW1tLCBuZWVkQnJhY3MpIHsKKyAgICBJbmRleFJlZyA9IHJlZzsKKyAgICBpZiAoc2NhbGUpCisgICAgICBTY2FsZSA9IHNjYWxlOworICB9CisgIC8vIFtCYXNlUmVnICsgSW5kZXhSZWcgKiBTY2FsZUV4cHJlc3Npb24gKyBJbW1lZGlhdGVFeHByZXNzaW9uXQorICBJbnRlbEV4cHIoU3RyaW5nUmVmIGJhc2VSZWcsIFN0cmluZ1JlZiBpbmRleFJlZywgdW5zaWduZWQgc2NhbGUgPSAwLAorICAgIGludDY0X3QgaW1tID0gMCwgYm9vbCBuZWVkQnJhY3MgPSB0cnVlKSA6CisgICAgSW50ZWxFeHByKGluZGV4UmVnLCBpbW0sIHNjYWxlLCBuZWVkQnJhY3MpIHsKKyAgICBCYXNlUmVnID0gYmFzZVJlZzsKKyAgfQorICBib29sIGhhc0Jhc2VSZWcoKSBjb25zdCB7CisgICAgcmV0dXJuIEJhc2VSZWcuc2l6ZSgpOworICB9CisgIGJvb2wgaGFzSW5kZXhSZWcoKSBjb25zdCB7CisgICAgcmV0dXJuIEluZGV4UmVnLnNpemUoKTsKKyAgfQorICBib29sIGhhc1JlZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc0Jhc2VSZWcoKSB8fCBoYXNJbmRleFJlZygpOworICB9CisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKFNjYWxlID09IDEpIHx8CisgICAgICAgICAgIChoYXNJbmRleFJlZygpICYmIChTY2FsZSA9PSAyIHx8IFNjYWxlID09IDQgfHwgU2NhbGUgPT0gOCkpOworICB9Cit9OworCitzdHJ1Y3QgQXNtUmV3cml0ZSB7CisgIEFzbVJld3JpdGVLaW5kIEtpbmQ7CisgIFNNTG9jIExvYzsKKyAgdW5zaWduZWQgTGVuOworICBpbnQ2NF90IFZhbDsKKyAgU3RyaW5nUmVmIExhYmVsOworICBJbnRlbEV4cHIgSW50ZWxFeHA7CisKK3B1YmxpYzoKKyAgQXNtUmV3cml0ZShBc21SZXdyaXRlS2luZCBraW5kLCBTTUxvYyBsb2MsIHVuc2lnbmVkIGxlbiA9IDAsIGludDY0X3QgdmFsID0gMCkKKyAgICA6IEtpbmQoa2luZCksIExvYyhsb2MpLCBMZW4obGVuKSwgVmFsKHZhbCkge30KKyAgQXNtUmV3cml0ZShBc21SZXdyaXRlS2luZCBraW5kLCBTTUxvYyBsb2MsIHVuc2lnbmVkIGxlbiwgU3RyaW5nUmVmIGxhYmVsKQorICAgIDogQXNtUmV3cml0ZShraW5kLCBsb2MsIGxlbikgeyBMYWJlbCA9IGxhYmVsOyB9CisgIEFzbVJld3JpdGUoU01Mb2MgbG9jLCB1bnNpZ25lZCBsZW4sIEludGVsRXhwciBleHApCisgICAgOiBBc21SZXdyaXRlKEFPS19JbnRlbEV4cHIsIGxvYywgbGVuKSB7IEludGVsRXhwID0gZXhwOyB9Cit9OworCitzdHJ1Y3QgUGFyc2VJbnN0cnVjdGlvbkluZm8geworICBTbWFsbFZlY3RvckltcGw8QXNtUmV3cml0ZT4gKkFzbVJld3JpdGVzID0gbnVsbHB0cjsKKworICBQYXJzZUluc3RydWN0aW9uSW5mbygpID0gZGVmYXVsdDsKKyAgUGFyc2VJbnN0cnVjdGlvbkluZm8oU21hbGxWZWN0b3JJbXBsPEFzbVJld3JpdGU+ICpyZXdyaXRlcykKKyAgICA6IEFzbVJld3JpdGVzKHJld3JpdGVzKSB7fQorfTsKKworZW51bSBPcGVyYW5kTWF0Y2hSZXN1bHRUeSB7CisgIE1hdGNoT3BlcmFuZF9TdWNjZXNzLCAgLy8gb3BlcmFuZCBtYXRjaGVkIHN1Y2Nlc3NmdWxseQorICBNYXRjaE9wZXJhbmRfTm9NYXRjaCwgIC8vIG9wZXJhbmQgZGlkIG5vdCBtYXRjaAorICBNYXRjaE9wZXJhbmRfUGFyc2VGYWlsIC8vIG9wZXJhbmQgbWF0Y2hlZCBidXQgaGFkIGVycm9ycworfTsKKworLy8gV2hlbiBtYXRjaGluZyBvZiBhbiBhc3NlbWJseSBpbnN0cnVjdGlvbiBmYWlscywgdGhlcmUgbWF5IGJlIG11bHRpcGxlCisvLyBlbmNvZGluZ3MgdGhhdCBhcmUgY2xvc2UgdG8gYmVpbmcgYSBtYXRjaC4gSXQncyBvZnRlbiBhbWJpZ3VvdXMgd2hpY2ggb25lCisvLyB0aGUgcHJvZ3JhbW1lciBpbnRlbmRlZCB0byB1c2UsIHNvIHdlIHdhbnQgdG8gcmVwb3J0IGFuIGVycm9yIHdoaWNoIG1lbnRpb25zCisvLyBlYWNoIG9mIHRoZXNlICJuZWFyLW1pc3MiIGVuY29kaW5ncy4gVGhpcyBzdHJ1Y3QgY29udGFpbnMgaW5mb3JtYXRpb24gYWJvdXQKKy8vIG9uZSBzdWNoIGVuY29kaW5nLCBhbmQgd2h5IGl0IGRpZCBub3QgbWF0Y2ggdGhlIHBhcnNlZCBpbnN0cnVjdGlvbi4KK2NsYXNzIE5lYXJNaXNzSW5mbyB7CitwdWJsaWM6CisgIGVudW0gTmVhck1pc3NLaW5kIHsKKyAgICBOb05lYXJNaXNzLAorICAgIE5lYXJNaXNzT3BlcmFuZCwKKyAgICBOZWFyTWlzc0ZlYXR1cmUsCisgICAgTmVhck1pc3NQcmVkaWNhdGUsCisgICAgTmVhck1pc3NUb29GZXdPcGVyYW5kcywKKyAgfTsKKworICAvLyBUaGUgZW5jb2RpbmcgaXMgdmFsaWQgZm9yIHRoZSBwYXJzZWQgYXNzZW1ibHkgc3RyaW5nLiBUaGlzIGlzIG9ubHkgdXNlZAorICAvLyBpbnRlcm5hbGx5IHRvIHRoZSB0YWJsZS1nZW5lcmF0ZWQgYXNzZW1ibHkgbWF0Y2hlci4KKyAgc3RhdGljIE5lYXJNaXNzSW5mbyBnZXRTdWNjZXNzKCkgeyByZXR1cm4gTmVhck1pc3NJbmZvKCk7IH0KKworICAvLyBUaGUgaW5zdHJ1Y3Rpb24gZW5jb2RpbmcgaXMgbm90IHZhbGlkIGJlY2F1c2UgaXQgcmVxdWlyZXMgc29tZSB0YXJnZXQKKyAgLy8gZmVhdHVyZXMgdGhhdCBhcmUgbm90IGN1cnJlbnRseSBlbmFibGVkLiBNaXNzaW5nRmVhdHVyZXMgaGFzIGEgYml0IHNldCBmb3IKKyAgLy8gZWFjaCBmZWF0dXJlIHRoYXQgdGhlIGVuY29kaW5nIG5lZWRzIGJ1dCB3aGljaCBpcyBub3QgZW5hYmxlZC4KKyAgc3RhdGljIE5lYXJNaXNzSW5mbyBnZXRNaXNzZWRGZWF0dXJlKHVpbnQ2NF90IE1pc3NpbmdGZWF0dXJlcykgeworICAgIE5lYXJNaXNzSW5mbyBSZXN1bHQ7CisgICAgUmVzdWx0LktpbmQgPSBOZWFyTWlzc0ZlYXR1cmU7CisgICAgUmVzdWx0LkZlYXR1cmVzID0gTWlzc2luZ0ZlYXR1cmVzOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICAvLyBUaGUgaW5zdHJ1Y3Rpb24gZW5jb2RpbmcgaXMgbm90IHZhbGlkIGJlY2F1c2UgdGhlIHRhcmdldC1zcGVjaWZpYworICAvLyBwcmVkaWNhdGUgZnVuY3Rpb24gcmV0dXJuZWQgYW4gZXJyb3IgY29kZS4gRmFpbHVyZUNvZGUgaXMgdGhlCisgIC8vIHRhcmdldC1zcGVjaWZpYyBlcnJvciBjb2RlIHJldHVybmVkIGJ5IHRoZSBwcmVkaWNhdGUuCisgIHN0YXRpYyBOZWFyTWlzc0luZm8gZ2V0TWlzc2VkUHJlZGljYXRlKHVuc2lnbmVkIEZhaWx1cmVDb2RlKSB7CisgICAgTmVhck1pc3NJbmZvIFJlc3VsdDsKKyAgICBSZXN1bHQuS2luZCA9IE5lYXJNaXNzUHJlZGljYXRlOworICAgIFJlc3VsdC5QcmVkaWNhdGVFcnJvciA9IEZhaWx1cmVDb2RlOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICAvLyBUaGUgaW5zdHJ1Y3Rpb24gZW5jb2RpbmcgaXMgbm90IHZhbGlkIGJlY2F1c2Ugb25lIChhbmQgb25seSBvbmUpIHBhcnNlZAorICAvLyBvcGVyYW5kIGlzIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlLiBPcGVyYW5kRXJyb3IgaXMgdGhlIGVycm9yIGNvZGUKKyAgLy8gcmVsYXRpbmcgdG8gdGhlIG9wZXJhbmQgY2xhc3MgZXhwZWN0ZWQgYnkgdGhlIGVuY29kaW5nLiBPcGVyYW5kQ2xhc3MgaXMKKyAgLy8gdGhlIHR5cGUgb2YgdGhlIGV4cGVjdGVkIG9wZXJhbmQuIE9wY29kZSBpcyB0aGUgb3Bjb2RlIG9mIHRoZSBlbmNvZGluZy4KKyAgLy8gT3BlcmFuZEluZGV4IGlzIHRoZSBpbmRleCBpbnRvIHRoZSBwYXJzZWQgb3BlcmFuZCBsaXN0LgorICBzdGF0aWMgTmVhck1pc3NJbmZvIGdldE1pc3NlZE9wZXJhbmQodW5zaWduZWQgT3BlcmFuZEVycm9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3BlcmFuZENsYXNzLCB1bnNpZ25lZCBPcGNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBPcGVyYW5kSW5kZXgpIHsKKyAgICBOZWFyTWlzc0luZm8gUmVzdWx0OworICAgIFJlc3VsdC5LaW5kID0gTmVhck1pc3NPcGVyYW5kOworICAgIFJlc3VsdC5NaXNzZWRPcGVyYW5kLkVycm9yID0gT3BlcmFuZEVycm9yOworICAgIFJlc3VsdC5NaXNzZWRPcGVyYW5kLkNsYXNzID0gT3BlcmFuZENsYXNzOworICAgIFJlc3VsdC5NaXNzZWRPcGVyYW5kLk9wY29kZSA9IE9wY29kZTsKKyAgICBSZXN1bHQuTWlzc2VkT3BlcmFuZC5JbmRleCA9IE9wZXJhbmRJbmRleDsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgLy8gVGhlIGluc3RydWN0aW9uIGVuY29kaW5nIGlzIG5vdCB2YWxpZCBiZWNhdXNlIGl0IGV4cGVjdHMgbW9yZSBvcGVyYW5kcworICAvLyB0aGFuIHdlcmUgcGFyc2VkLiBPcGVyYW5kQ2xhc3MgaXMgdGhlIGNsYXNzIG9mIHRoZSBleHBlY3RlZCBvcGVyYW5kIHRoYXQKKyAgLy8gd2FzIG5vdCBwcm92aWRlZC4gT3Bjb2RlIGlzIHRoZSBpbnN0cnVjdGlvbiBlbmNvZGluZy4KKyAgc3RhdGljIE5lYXJNaXNzSW5mbyBnZXRUb29GZXdPcGVyYW5kcyh1bnNpZ25lZCBPcGVyYW5kQ2xhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT3Bjb2RlKSB7CisgICAgTmVhck1pc3NJbmZvIFJlc3VsdDsKKyAgICBSZXN1bHQuS2luZCA9IE5lYXJNaXNzVG9vRmV3T3BlcmFuZHM7CisgICAgUmVzdWx0LlRvb0Zld09wZXJhbmRzLkNsYXNzID0gT3BlcmFuZENsYXNzOworICAgIFJlc3VsdC5Ub29GZXdPcGVyYW5kcy5PcGNvZGUgPSBPcGNvZGU7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIG9wZXJhdG9yIGJvb2woKSBjb25zdCB7IHJldHVybiBLaW5kICE9IE5vTmVhck1pc3M7IH0KKworICBOZWFyTWlzc0tpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICAvLyBGZWF0dXJlIGZsYWdzIHJlcXVpcmVkIGJ5IHRoZSBpbnN0cnVjdGlvbiwgdGhhdCB0aGUgY3VycmVudCB0YXJnZXQgZG9lcworICAvLyBub3QgaGF2ZS4KKyAgdWludDY0X3QgZ2V0RmVhdHVyZXMoKSBjb25zdCB7CisgICAgYXNzZXJ0KEtpbmQgPT0gTmVhck1pc3NGZWF0dXJlKTsKKyAgICByZXR1cm4gRmVhdHVyZXM7CisgIH0KKyAgLy8gRXJyb3IgY29kZSByZXR1cm5lZCBieSB0aGUgdGFyZ2V0IHByZWRpY2F0ZSB3aGVuIHZhbGlkYXRpbmcgdGhpcworICAvLyBpbnN0cnVjdGlvbiBlbmNvZGluZy4KKyAgdW5zaWduZWQgZ2V0UHJlZGljYXRlRXJyb3IoKSBjb25zdCB7CisgICAgYXNzZXJ0KEtpbmQgPT0gTmVhck1pc3NQcmVkaWNhdGUpOworICAgIHJldHVybiBQcmVkaWNhdGVFcnJvcjsKKyAgfQorICAvLyBNYXRjaENsYXNzS2luZCBvZiB0aGUgb3BlcmFuZCB0aGF0IHdlIGV4cGVjdGVkIHRvIHNlZS4KKyAgdW5zaWduZWQgZ2V0T3BlcmFuZENsYXNzKCkgY29uc3QgeworICAgIGFzc2VydChLaW5kID09IE5lYXJNaXNzT3BlcmFuZCB8fCBLaW5kID09IE5lYXJNaXNzVG9vRmV3T3BlcmFuZHMpOworICAgIHJldHVybiBNaXNzZWRPcGVyYW5kLkNsYXNzOworICB9CisgIC8vIE9wY29kZSBvZiB0aGUgZW5jb2Rpbmcgd2Ugd2VyZSB0cnlpbmcgdG8gbWF0Y2guCisgIHVuc2lnbmVkIGdldE9wY29kZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoS2luZCA9PSBOZWFyTWlzc09wZXJhbmQgfHwgS2luZCA9PSBOZWFyTWlzc1Rvb0Zld09wZXJhbmRzKTsKKyAgICByZXR1cm4gTWlzc2VkT3BlcmFuZC5PcGNvZGU7CisgIH0KKyAgLy8gRXJyb3IgY29kZSByZXR1cm5lZCB3aGVuIHZhbGlkYXRpbmcgdGhlIG9wZXJhbmQuCisgIHVuc2lnbmVkIGdldE9wZXJhbmRFcnJvcigpIGNvbnN0IHsKKyAgICBhc3NlcnQoS2luZCA9PSBOZWFyTWlzc09wZXJhbmQpOworICAgIHJldHVybiBNaXNzZWRPcGVyYW5kLkVycm9yOworICB9CisgIC8vIEluZGV4IG9mIHRoZSBhY3R1YWwgb3BlcmFuZCB3ZSB3ZXJlIHRyeWluZyB0byBtYXRjaCBpbiB0aGUgbGlzdCBvZiBwYXJzZWQKKyAgLy8gb3BlcmFuZHMuCisgIHVuc2lnbmVkIGdldE9wZXJhbmRJbmRleCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoS2luZCA9PSBOZWFyTWlzc09wZXJhbmQpOworICAgIHJldHVybiBNaXNzZWRPcGVyYW5kLkluZGV4OworICB9CisKK3ByaXZhdGU6CisgIE5lYXJNaXNzS2luZCBLaW5kOworCisgIC8vIFRoZXNlIHR3byBzdHJ1Y3RzIHNoYXJlIGEgY29tbW9uIHByZWZpeCwgc28gd2UgY2FuIHNhZmVseSByZWx5IG9uIHRoZSBmYWN0CisgIC8vIHRoYXQgdGhleSBvdmVybGFwIGluIHRoZSB1bmlvbi4KKyAgc3RydWN0IE1pc3NlZE9wSW5mbyB7CisgICAgdW5zaWduZWQgQ2xhc3M7CisgICAgdW5zaWduZWQgT3Bjb2RlOworICAgIHVuc2lnbmVkIEVycm9yOworICAgIHVuc2lnbmVkIEluZGV4OworICB9OworCisgIHN0cnVjdCBUb29GZXdPcGVyYW5kc0luZm8geworICAgIHVuc2lnbmVkIENsYXNzOworICAgIHVuc2lnbmVkIE9wY29kZTsKKyAgfTsKKworICB1bmlvbiB7CisgICAgdWludDY0X3QgRmVhdHVyZXM7CisgICAgdW5zaWduZWQgUHJlZGljYXRlRXJyb3I7CisgICAgTWlzc2VkT3BJbmZvIE1pc3NlZE9wZXJhbmQ7CisgICAgVG9vRmV3T3BlcmFuZHNJbmZvIFRvb0Zld09wZXJhbmRzOworICB9OworCisgIE5lYXJNaXNzSW5mbygpIDogS2luZChOb05lYXJNaXNzKSB7fQorfTsKKworLy8vIE1DVGFyZ2V0QXNtUGFyc2VyIC0gR2VuZXJpYyBpbnRlcmZhY2UgdG8gdGFyZ2V0IHNwZWNpZmljIGFzc2VtYmx5IHBhcnNlcnMuCitjbGFzcyBNQ1RhcmdldEFzbVBhcnNlciA6IHB1YmxpYyBNQ0FzbVBhcnNlckV4dGVuc2lvbiB7CitwdWJsaWM6CisgIGVudW0gTWF0Y2hSZXN1bHRUeSB7CisgICAgTWF0Y2hfSW52YWxpZE9wZXJhbmQsCisgICAgTWF0Y2hfSW52YWxpZFRpZWRPcGVyYW5kLAorICAgIE1hdGNoX01pc3NpbmdGZWF0dXJlLAorICAgIE1hdGNoX01uZW1vbmljRmFpbCwKKyAgICBNYXRjaF9TdWNjZXNzLAorICAgIE1hdGNoX05lYXJNaXNzZXMsCisgICAgRklSU1RfVEFSR0VUX01BVENIX1JFU1VMVF9UWQorICB9OworCitwcm90ZWN0ZWQ6IC8vIENhbiBvbmx5IGNyZWF0ZSBzdWJjbGFzc2VzLgorICBNQ1RhcmdldEFzbVBhcnNlcihNQ1RhcmdldE9wdGlvbnMgY29uc3QgJiwgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZTVEksCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DSW5zdHJJbmZvICZNSUkpOworCisgIC8vLyBDcmVhdGUgYSBjb3B5IG9mIFNUSSBhbmQgcmV0dXJuIGEgbm9uLWNvbnN0IHJlZmVyZW5jZSB0byBpdC4KKyAgTUNTdWJ0YXJnZXRJbmZvICZjb3B5U1RJKCk7CisKKyAgLy8vIEF2YWlsYWJsZUZlYXR1cmVzIC0gVGhlIGN1cnJlbnQgc2V0IG9mIGF2YWlsYWJsZSBmZWF0dXJlcy4KKyAgdWludDY0X3QgQXZhaWxhYmxlRmVhdHVyZXMgPSAwOworCisgIC8vLyBQYXJzaW5nSW5saW5lQXNtIC0gQXJlIHdlIHBhcnNpbmcgbXMtc3R5bGUgaW5saW5lIGFzc2VtYmx5PworICBib29sIFBhcnNpbmdJbmxpbmVBc20gPSBmYWxzZTsKKworICAvLy8gU2VtYUNhbGxiYWNrIC0gVGhlIFNlbWEgY2FsbGJhY2sgaW1wbGVtZW50YXRpb24uICBNdXN0IGJlIHNldCB3aGVuIHBhcnNpbmcKKyAgLy8vIG1zLXN0eWxlIGlubGluZSBhc3NlbWJseS4KKyAgTUNBc21QYXJzZXJTZW1hQ2FsbGJhY2sgKlNlbWFDYWxsYmFjazsKKworICAvLy8gU2V0IG9mIG9wdGlvbnMgd2hpY2ggYWZmZWN0cyBpbnN0cnVtZW50YXRpb24gb2YgaW5saW5lIGFzc2VtYmx5LgorICBNQ1RhcmdldE9wdGlvbnMgTUNPcHRpb25zOworCisgIC8vLyBDdXJyZW50IFNUSS4KKyAgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICpTVEk7CisKKyAgY29uc3QgTUNJbnN0ckluZm8gJk1JSTsKKworcHVibGljOgorICBNQ1RhcmdldEFzbVBhcnNlcihjb25zdCBNQ1RhcmdldEFzbVBhcnNlciAmKSA9IGRlbGV0ZTsKKyAgTUNUYXJnZXRBc21QYXJzZXIgJm9wZXJhdG9yPShjb25zdCBNQ1RhcmdldEFzbVBhcnNlciAmKSA9IGRlbGV0ZTsKKworICB+TUNUYXJnZXRBc21QYXJzZXIoKSBvdmVycmlkZTsKKworICBjb25zdCBNQ1N1YnRhcmdldEluZm8gJmdldFNUSSgpIGNvbnN0OworCisgIHVpbnQ2NF90IGdldEF2YWlsYWJsZUZlYXR1cmVzKCkgY29uc3QgeyByZXR1cm4gQXZhaWxhYmxlRmVhdHVyZXM7IH0KKyAgdm9pZCBzZXRBdmFpbGFibGVGZWF0dXJlcyh1aW50NjRfdCBWYWx1ZSkgeyBBdmFpbGFibGVGZWF0dXJlcyA9IFZhbHVlOyB9CisKKyAgYm9vbCBpc1BhcnNpbmdJbmxpbmVBc20gKCkgeyByZXR1cm4gUGFyc2luZ0lubGluZUFzbTsgfQorICB2b2lkIHNldFBhcnNpbmdJbmxpbmVBc20gKGJvb2wgVmFsdWUpIHsgUGFyc2luZ0lubGluZUFzbSA9IFZhbHVlOyB9CisKKyAgTUNUYXJnZXRPcHRpb25zIGdldFRhcmdldE9wdGlvbnMoKSBjb25zdCB7IHJldHVybiBNQ09wdGlvbnM7IH0KKworICB2b2lkIHNldFNlbWFDYWxsYmFjayhNQ0FzbVBhcnNlclNlbWFDYWxsYmFjayAqQ2FsbGJhY2spIHsKKyAgICBTZW1hQ2FsbGJhY2sgPSBDYWxsYmFjazsKKyAgfQorCisgIHZpcnR1YWwgYm9vbCBQYXJzZVJlZ2lzdGVyKHVuc2lnbmVkICZSZWdObywgU01Mb2MgJlN0YXJ0TG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUxvYyAmRW5kTG9jKSA9IDA7CisKKyAgLy8vIFNldHMgZnJhbWUgcmVnaXN0ZXIgY29ycmVzcG9uZGluZyB0byB0aGUgY3VycmVudCBNYWNoaW5lRnVuY3Rpb24uCisgIHZpcnR1YWwgdm9pZCBTZXRGcmFtZVJlZ2lzdGVyKHVuc2lnbmVkIFJlZ05vKSB7fQorCisgIC8vLyBQYXJzZUluc3RydWN0aW9uIC0gUGFyc2Ugb25lIGFzc2VtYmx5IGluc3RydWN0aW9uLgorICAvLy8KKyAgLy8vIFRoZSBwYXJzZXIgaXMgcG9zaXRpb25lZCBmb2xsb3dpbmcgdGhlIGluc3RydWN0aW9uIG5hbWUuIFRoZSB0YXJnZXQKKyAgLy8vIHNwZWNpZmljIGluc3RydWN0aW9uIHBhcnNlciBzaG91bGQgcGFyc2UgdGhlIGVudGlyZSBpbnN0cnVjdGlvbiBhbmQKKyAgLy8vIGNvbnN0cnVjdCB0aGUgYXBwcm9wcmlhdGUgTUNJbnN0LCBvciBlbWl0IGFuIGVycm9yLiBPbiBzdWNjZXNzLCB0aGUgZW50aXJlCisgIC8vLyBsaW5lIHNob3VsZCBiZSBwYXJzZWQgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgZW5kLW9mLXN0YXRlbWVudCB0b2tlbi4gT24KKyAgLy8vIGZhaWx1cmUsIHRoZSBwYXJzZXIgaXMgbm90IHJlcXVpcmVkIHRvIHJlYWQgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4KKyAgLy8KKyAgLy8vIFxwYXJhbSBOYW1lIC0gVGhlIGluc3RydWN0aW9uIG5hbWUuCisgIC8vLyBccGFyYW0gTmFtZUxvYyAtIFRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIG5hbWUuCisgIC8vLyBccGFyYW0gT3BlcmFuZHMgW291dF0gLSBUaGUgbGlzdCBvZiBwYXJzZWQgb3BlcmFuZHMsIHRoaXMgcmV0dXJucworICAvLy8gICAgICAgIG93bmVyc2hpcCBvZiB0aGVtIHRvIHRoZSBjYWxsZXIuCisgIC8vLyBccmV0dXJuIFRydWUgb24gZmFpbHVyZS4KKyAgdmlydHVhbCBib29sIFBhcnNlSW5zdHJ1Y3Rpb24oUGFyc2VJbnN0cnVjdGlvbkluZm8gJkluZm8sIFN0cmluZ1JlZiBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUxvYyBOYW1lTG9jLCBPcGVyYW5kVmVjdG9yICZPcGVyYW5kcykgPSAwOworICB2aXJ0dWFsIGJvb2wgUGFyc2VJbnN0cnVjdGlvbihQYXJzZUluc3RydWN0aW9uSW5mbyAmSW5mbywgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzbVRva2VuIFRva2VuLCBPcGVyYW5kVmVjdG9yICZPcGVyYW5kcykgeworICAgIHJldHVybiBQYXJzZUluc3RydWN0aW9uKEluZm8sIE5hbWUsIFRva2VuLmdldExvYygpLCBPcGVyYW5kcyk7CisgIH0KKworICAvLy8gUGFyc2VEaXJlY3RpdmUgLSBQYXJzZSBhIHRhcmdldCBzcGVjaWZpYyBhc3NlbWJsZXIgZGlyZWN0aXZlCisgIC8vLworICAvLy8gVGhlIHBhcnNlciBpcyBwb3NpdGlvbmVkIGZvbGxvd2luZyB0aGUgZGlyZWN0aXZlIG5hbWUuICBUaGUgdGFyZ2V0CisgIC8vLyBzcGVjaWZpYyBkaXJlY3RpdmUgcGFyc2VyIHNob3VsZCBwYXJzZSB0aGUgZW50aXJlIGRpcmVjdGl2ZSBkb2luZyBvcgorICAvLy8gcmVjb3JkaW5nIGFueSB0YXJnZXQgc3BlY2lmaWMgd29yaywgb3IgcmV0dXJuIHRydWUgYW5kIGRvIG5vdGhpbmcgaWYgdGhlCisgIC8vLyBkaXJlY3RpdmUgaXMgbm90IHRhcmdldCBzcGVjaWZpYy4gSWYgdGhlIGRpcmVjdGl2ZSBpcyBzcGVjaWZpYyBmb3IKKyAgLy8vIHRoZSB0YXJnZXQsIHRoZSBlbnRpcmUgbGluZSBpcyBwYXJzZWQgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUKKyAgLy8vIGVuZC1vZi1zdGF0ZW1lbnQgdG9rZW4gYW5kIGZhbHNlIGlzIHJldHVybmVkLgorICAvLy8KKyAgLy8vIFxwYXJhbSBEaXJlY3RpdmVJRCAtIHRoZSBpZGVudGlmaWVyIHRva2VuIG9mIHRoZSBkaXJlY3RpdmUuCisgIHZpcnR1YWwgYm9vbCBQYXJzZURpcmVjdGl2ZShBc21Ub2tlbiBEaXJlY3RpdmVJRCkgPSAwOworCisgIC8vLyBNYXRjaEFuZEVtaXRJbnN0cnVjdGlvbiAtIFJlY29nbml6ZSBhIHNlcmllcyBvZiBvcGVyYW5kcyBvZiBhIHBhcnNlZAorICAvLy8gaW5zdHJ1Y3Rpb24gYXMgYW4gYWN0dWFsIE1DSW5zdCBhbmQgZW1pdCBpdCB0byB0aGUgc3BlY2lmaWVkIE1DU3RyZWFtZXIuCisgIC8vLyBUaGlzIHJldHVybnMgZmFsc2Ugb24gc3VjY2VzcyBhbmQgcmV0dXJucyB0cnVlIG9uIGZhaWx1cmUgdG8gbWF0Y2guCisgIC8vLworICAvLy8gT24gZmFpbHVyZSwgdGhlIHRhcmdldCBwYXJzZXIgaXMgcmVzcG9uc2libGUgZm9yIGVtaXR0aW5nIGEgZGlhZ25vc3RpYworICAvLy8gZXhwbGFpbmluZyB0aGUgbWF0Y2ggZmFpbHVyZS4KKyAgdmlydHVhbCBib29sIE1hdGNoQW5kRW1pdEluc3RydWN0aW9uKFNNTG9jIElETG9jLCB1bnNpZ25lZCAmT3Bjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmFuZFZlY3RvciAmT3BlcmFuZHMsIE1DU3RyZWFtZXIgJk91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90ICZFcnJvckluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE1hdGNoaW5nSW5saW5lQXNtKSA9IDA7CisKKyAgLy8vIEFsbG93cyB0YXJnZXRzIHRvIGxldCByZWdpc3RlcnMgb3B0IG91dCBvZiBjbG9iYmVyIGxpc3RzLgorICB2aXJ0dWFsIGJvb2wgT21pdFJlZ2lzdGVyRnJvbUNsb2JiZXJMaXN0cyh1bnNpZ25lZCBSZWdObykgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gQWxsb3cgYSB0YXJnZXQgdG8gYWRkIHNwZWNpYWwgY2FzZSBvcGVyYW5kIG1hdGNoaW5nIGZvciB0aGluZ3MgdGhhdAorICAvLy8gdGJsZ2VuIGRvZXNuJ3QvY2FuJ3QgaGFuZGxlIGVmZmVjdGl2ZWx5LiBGb3IgZXhhbXBsZSwgbGl0ZXJhbAorICAvLy8gaW1tZWRpYXRlcyBvbiBBUk0uIFRhYmxlR2VuIGV4cGVjdHMgYSB0b2tlbiBvcGVyYW5kLCBidXQgdGhlIHBhcnNlcgorICAvLy8gd2lsbCByZWNvZ25pemUgdGhlbSBhcyBpbW1lZGlhdGVzLgorICB2aXJ0dWFsIHVuc2lnbmVkIHZhbGlkYXRlVGFyZ2V0T3BlcmFuZENsYXNzKE1DUGFyc2VkQXNtT3BlcmFuZCAmT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgS2luZCkgeworICAgIHJldHVybiBNYXRjaF9JbnZhbGlkT3BlcmFuZDsKKyAgfQorCisgIC8vLyBWYWxpZGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gbWF0Y2ggYWdhaW5zdCBhbnkgY29tcGxleCB0YXJnZXQgcHJlZGljYXRlcworICAvLy8gYmVmb3JlIHJlbmRlcmluZyBhbnkgb3BlcmFuZHMgdG8gaXQuCisgIHZpcnR1YWwgdW5zaWduZWQKKyAgY2hlY2tFYXJseVRhcmdldE1hdGNoUHJlZGljYXRlKE1DSW5zdCAmSW5zdCwgY29uc3QgT3BlcmFuZFZlY3RvciAmT3BlcmFuZHMpIHsKKyAgICByZXR1cm4gTWF0Y2hfU3VjY2VzczsKKyAgfQorCisgIC8vLyBjaGVja1RhcmdldE1hdGNoUHJlZGljYXRlIC0gVmFsaWRhdGUgdGhlIGluc3RydWN0aW9uIG1hdGNoIGFnYWluc3QKKyAgLy8vIGFueSBjb21wbGV4IHRhcmdldCBwcmVkaWNhdGVzIG5vdCBleHByZXNzaWJsZSB2aWEgbWF0Y2ggY2xhc3Nlcy4KKyAgdmlydHVhbCB1bnNpZ25lZCBjaGVja1RhcmdldE1hdGNoUHJlZGljYXRlKE1DSW5zdCAmSW5zdCkgeworICAgIHJldHVybiBNYXRjaF9TdWNjZXNzOworICB9CisKKyAgdmlydHVhbCB2b2lkIGNvbnZlcnRUb01hcEFuZENvbnN0cmFpbnRzKHVuc2lnbmVkIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcGVyYW5kVmVjdG9yICZPcGVyYW5kcykgPSAwOworCisgIC8vIFJldHVybiB3aGV0aGVyIHRoaXMgcGFyc2VyIHVzZXMgYXNzaWdubWVudCBzdGF0ZW1lbnRzIHdpdGggZXF1YWxzIHRva2VucworICB2aXJ0dWFsIGJvb2wgZXF1YWxJc0FzbUFzc2lnbm1lbnQoKSB7IHJldHVybiB0cnVlOyB9OworICAvLyBSZXR1cm4gd2hldGhlciB0aGlzIHN0YXJ0IG9mIHN0YXRlbWVudCBpZGVudGlmaWVyIGlzIGEgbGFiZWwKKyAgdmlydHVhbCBib29sIGlzTGFiZWwoQXNtVG9rZW4gJlRva2VuKSB7IHJldHVybiB0cnVlOyB9OworICAvLyBSZXR1cm4gd2hldGhlciB0aGlzIHBhcnNlciBhY2NlcHQgc3RhciBhcyBzdGFydCBvZiBzdGF0ZW1lbnQKKyAgdmlydHVhbCBib29sIHN0YXJJc1N0YXJ0T2ZTdGF0ZW1lbnQoKSB7IHJldHVybiBmYWxzZTsgfTsKKworICB2aXJ0dWFsIGNvbnN0IE1DRXhwciAqYXBwbHlNb2RpZmllclRvRXhwcihjb25zdCBNQ0V4cHIgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU3ltYm9sUmVmRXhwcjo6VmFyaWFudEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgb25MYWJlbFBhcnNlZChNQ1N5bWJvbCAqU3ltYm9sKSB7fQorCisgIC8vLyBFbnN1cmUgdGhhdCBhbGwgcHJldmlvdXNseSBwYXJzZWQgaW5zdHJ1Y3Rpb25zIGhhdmUgYmVlbiBlbWl0dGVkIHRvIHRoZQorICAvLy8gb3V0cHV0IHN0cmVhbWVyLCBpZiB0aGUgdGFyZ2V0IGRvZXMgbm90IGVtaXQgdGhlbSBpbW1lZGlhdGVseS4KKyAgdmlydHVhbCB2b2lkIGZsdXNoUGVuZGluZ0luc3RydWN0aW9ucyhNQ1N0cmVhbWVyICZPdXQpIHt9CisKKyAgdmlydHVhbCBjb25zdCBNQ0V4cHIgKmNyZWF0ZVRhcmdldFVuYXJ5RXhwcihjb25zdCBNQ0V4cHIgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXNtVG9rZW46OlRva2VuS2luZCBPcGVyYXRvclRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DUEFSU0VSX01DVEFSR0VUQVNNUEFSU0VSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNSZWdpc3RlckluZm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNSZWdpc3RlckluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTdjOWVmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1JlZ2lzdGVySW5mby5oCkBAIC0wLDAgKzEsNzM0IEBACisvLz09PS0gTUMvTUNSZWdpc3RlckluZm8uaCAtIFRhcmdldCBSZWdpc3RlciBEZXNjcmlwdGlvbiAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgYW4gYWJzdHJhY3QgaW50ZXJmYWNlIHVzZWQgdG8gZ2V0IGluZm9ybWF0aW9uIGFib3V0IGEKKy8vIHRhcmdldCBtYWNoaW5lcyByZWdpc3RlciBmaWxlLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyB1c2VkIGZvciBhIHZhcmlldHkgb2YKKy8vIHB1cnBvc2VkLCBlc3BlY2lhbGx5IHJlZ2lzdGVyIGFsbG9jYXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DUkVHSVNURVJJTkZPX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1JFR0lTVEVSSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9NQy9MYW5lQml0bWFzay5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBbiB1bnNpZ25lZCBpbnRlZ2VyIHR5cGUgbGFyZ2UgZW5vdWdoIHRvIHJlcHJlc2VudCBhbGwgcGh5c2ljYWwgcmVnaXN0ZXJzLAorLy8vIGJ1dCBub3QgbmVjZXNzYXJpbHkgdmlydHVhbCByZWdpc3RlcnMuCit1c2luZyBNQ1BoeXNSZWcgPSB1aW50MTZfdDsKKworLy8vIE1DUmVnaXN0ZXJDbGFzcyAtIEJhc2UgY2xhc3Mgb2YgVGFyZ2V0UmVnaXN0ZXJDbGFzcy4KK2NsYXNzIE1DUmVnaXN0ZXJDbGFzcyB7CitwdWJsaWM6CisgIHVzaW5nIGl0ZXJhdG9yID0gY29uc3QgTUNQaHlzUmVnKjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBjb25zdCBNQ1BoeXNSZWcqOworCisgIGNvbnN0IGl0ZXJhdG9yIFJlZ3NCZWdpbjsKKyAgY29uc3QgdWludDhfdCAqY29uc3QgUmVnU2V0OworICBjb25zdCB1aW50MzJfdCBOYW1lSWR4OworICBjb25zdCB1aW50MTZfdCBSZWdzU2l6ZTsKKyAgY29uc3QgdWludDE2X3QgUmVnU2V0U2l6ZTsKKyAgY29uc3QgdWludDE2X3QgSUQ7CisgIGNvbnN0IHVpbnQxNl90IFBoeXNSZWdTaXplOworICBjb25zdCBpbnQ4X3QgQ29weUNvc3Q7CisgIGNvbnN0IGJvb2wgQWxsb2NhdGFibGU7CisKKyAgLy8vIGdldElEKCkgLSBSZXR1cm4gdGhlIHJlZ2lzdGVyIGNsYXNzIElEIG51bWJlci4KKyAgLy8vCisgIHVuc2lnbmVkIGdldElEKCkgY29uc3QgeyByZXR1cm4gSUQ7IH0KKworICAvLy8gYmVnaW4vZW5kIC0gUmV0dXJuIGFsbCBvZiB0aGUgcmVnaXN0ZXJzIGluIHRoaXMgY2xhc3MuCisgIC8vLworICBpdGVyYXRvciAgICAgICBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFJlZ3NCZWdpbjsgfQorICBpdGVyYXRvciAgICAgICAgIGVuZCgpIGNvbnN0IHsgcmV0dXJuIFJlZ3NCZWdpbiArIFJlZ3NTaXplOyB9CisKKyAgLy8vIGdldE51bVJlZ3MgLSBSZXR1cm4gdGhlIG51bWJlciBvZiByZWdpc3RlcnMgaW4gdGhpcyBjbGFzcy4KKyAgLy8vCisgIHVuc2lnbmVkIGdldE51bVJlZ3MoKSBjb25zdCB7IHJldHVybiBSZWdzU2l6ZTsgfQorCisgIC8vLyBnZXRSZWdpc3RlciAtIFJldHVybiB0aGUgc3BlY2lmaWVkIHJlZ2lzdGVyIGluIHRoZSBjbGFzcy4KKyAgLy8vCisgIHVuc2lnbmVkIGdldFJlZ2lzdGVyKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IGdldE51bVJlZ3MoKSAmJiAiUmVnaXN0ZXIgbnVtYmVyIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gUmVnc0JlZ2luW2ldOworICB9CisKKyAgLy8vIGNvbnRhaW5zIC0gUmV0dXJuIHRydWUgaWYgdGhlIHNwZWNpZmllZCByZWdpc3RlciBpcyBpbmNsdWRlZCBpbiB0aGlzCisgIC8vLyByZWdpc3RlciBjbGFzcy4gIFRoaXMgZG9lcyBub3QgaW5jbHVkZSB2aXJ0dWFsIHJlZ2lzdGVycy4KKyAgYm9vbCBjb250YWlucyh1bnNpZ25lZCBSZWcpIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBJbkJ5dGUgPSBSZWcgJSA4OworICAgIHVuc2lnbmVkIEJ5dGUgPSBSZWcgLyA4OworICAgIGlmIChCeXRlID49IFJlZ1NldFNpemUpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIChSZWdTZXRbQnl0ZV0gJiAoMSA8PCBJbkJ5dGUpKSAhPSAwOworICB9CisKKyAgLy8vIGNvbnRhaW5zIC0gUmV0dXJuIHRydWUgaWYgYm90aCByZWdpc3RlcnMgYXJlIGluIHRoaXMgY2xhc3MuCisgIGJvb2wgY29udGFpbnModW5zaWduZWQgUmVnMSwgdW5zaWduZWQgUmVnMikgY29uc3QgeworICAgIHJldHVybiBjb250YWlucyhSZWcxKSAmJiBjb250YWlucyhSZWcyKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIHBoeXNpY2FsIHJlZ2lzdGVyIGluIGJ5dGVzLgorICB1bnNpZ25lZCBnZXRQaHlzUmVnU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFBoeXNSZWdTaXplOyB9CisgIC8vLyBUZW1wb3JhcnkgZnVuY3Rpb24gdG8gYWxsb3cgb3V0LW9mLXRyZWUgdGFyZ2V0cyB0byBzd2l0Y2guCisgIHVuc2lnbmVkIGdldFNpemUoKSBjb25zdCB7IHJldHVybiBnZXRQaHlzUmVnU2l6ZSgpOyB9CisKKyAgLy8vIGdldENvcHlDb3N0IC0gUmV0dXJuIHRoZSBjb3N0IG9mIGNvcHlpbmcgYSB2YWx1ZSBiZXR3ZWVuIHR3byByZWdpc3RlcnMgaW4KKyAgLy8vIHRoaXMgY2xhc3MuIEEgbmVnYXRpdmUgbnVtYmVyIG1lYW5zIHRoZSByZWdpc3RlciBjbGFzcyBpcyB2ZXJ5IGV4cGVuc2l2ZQorICAvLy8gdG8gY29weSBlLmcuIHN0YXR1cyBmbGFnIHJlZ2lzdGVyIGNsYXNzZXMuCisgIGludCBnZXRDb3B5Q29zdCgpIGNvbnN0IHsgcmV0dXJuIENvcHlDb3N0OyB9CisKKyAgLy8vIGlzQWxsb2NhdGFibGUgLSBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHJlZ2lzdGVyIGNsYXNzIG1heSBiZSB1c2VkIHRvIGNyZWF0ZQorICAvLy8gdmlydHVhbCByZWdpc3RlcnMuCisgIGJvb2wgaXNBbGxvY2F0YWJsZSgpIGNvbnN0IHsgcmV0dXJuIEFsbG9jYXRhYmxlOyB9Cit9OworCisvLy8gTUNSZWdpc3RlckRlc2MgLSBUaGlzIHJlY29yZCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCBhIHBhcnRpY3VsYXIKKy8vLyByZWdpc3Rlci4gIFRoZSBTdWJSZWdzIGZpZWxkIGlzIGEgemVybyB0ZXJtaW5hdGVkIGFycmF5IG9mIHJlZ2lzdGVycyB0aGF0CisvLy8gYXJlIHN1Yi1yZWdpc3RlcnMgb2YgdGhlIHNwZWNpZmljIHJlZ2lzdGVyLCBlLmcuIEFMLCBBSCBhcmUgc3ViLXJlZ2lzdGVycworLy8vIG9mIEFYLiBUaGUgU3VwZXJSZWdzIGZpZWxkIGlzIGEgemVybyB0ZXJtaW5hdGVkIGFycmF5IG9mIHJlZ2lzdGVycyB0aGF0IGFyZQorLy8vIHN1cGVyLXJlZ2lzdGVycyBvZiB0aGUgc3BlY2lmaWMgcmVnaXN0ZXIsIGUuZy4gUkFYLCBFQVgsIGFyZQorLy8vIHN1cGVyLXJlZ2lzdGVycyBvZiBBWC4KKy8vLworc3RydWN0IE1DUmVnaXN0ZXJEZXNjIHsKKyAgdWludDMyX3QgTmFtZTsgICAgICAvLyBQcmludGFibGUgbmFtZSBmb3IgdGhlIHJlZyAoZm9yIGRlYnVnZ2luZykKKyAgdWludDMyX3QgU3ViUmVnczsgICAvLyBTdWItcmVnaXN0ZXIgc2V0LCBkZXNjcmliZWQgYWJvdmUKKyAgdWludDMyX3QgU3VwZXJSZWdzOyAvLyBTdXBlci1yZWdpc3RlciBzZXQsIGRlc2NyaWJlZCBhYm92ZQorCisgIC8vIE9mZnNldCBpbnRvIE1DUkk6OlN1YlJlZ0luZGljZXMgb2YgYSBsaXN0IG9mIHN1Yi1yZWdpc3RlciBpbmRpY2VzIGZvciBlYWNoCisgIC8vIHN1Yi1yZWdpc3RlciBpbiBTdWJSZWdzLgorICB1aW50MzJfdCBTdWJSZWdJbmRpY2VzOworCisgIC8vIFJlZ1VuaXRzIC0gUG9pbnRzIHRvIHRoZSBsaXN0IG9mIHJlZ2lzdGVyIHVuaXRzLiBUaGUgbG93IDQgYml0cyBob2xkcyB0aGUKKyAgLy8gU2NhbGUsIHRoZSBoaWdoIGJpdHMgaG9sZCBhbiBvZmZzZXQgaW50byBEaWZmTGlzdHMuIFNlZSBNQ1JlZ1VuaXRJdGVyYXRvci4KKyAgdWludDMyX3QgUmVnVW5pdHM7CisKKyAgLy8vIEluZGV4IGludG8gbGlzdCB3aXRoIGxhbmUgbWFzayBzZXF1ZW5jZXMuIFRoZSBzZXF1ZW5jZSBjb250YWlucyBhIGxhbmVtYXNrCisgIC8vLyBmb3IgZXZlcnkgcmVnaXN0ZXIgdW5pdC4KKyAgdWludDE2X3QgUmVnVW5pdExhbmVNYXNrczsKK307CisKKy8vLyBNQ1JlZ2lzdGVySW5mbyBiYXNlIGNsYXNzIC0gV2UgYXNzdW1lIHRoYXQgdGhlIHRhcmdldCBkZWZpbmVzIGEgc3RhdGljCisvLy8gYXJyYXkgb2YgTUNSZWdpc3RlckRlc2Mgb2JqZWN0cyB0aGF0IHJlcHJlc2VudCBhbGwgb2YgdGhlIG1hY2hpbmUKKy8vLyByZWdpc3RlcnMgdGhhdCB0aGUgdGFyZ2V0IGhhcy4gIEFzIHN1Y2gsIHdlIHNpbXBseSBoYXZlIHRvIHRyYWNrIGEgcG9pbnRlcgorLy8vIHRvIHRoaXMgYXJyYXkgc28gdGhhdCB3ZSBjYW4gdHVybiByZWdpc3RlciBudW1iZXIgaW50byBhIHJlZ2lzdGVyCisvLy8gZGVzY3JpcHRvci4KKy8vLworLy8vIE5vdGUgdGhpcyBjbGFzcyBpcyBkZXNpZ25lZCB0byBiZSBhIGJhc2UgY2xhc3Mgb2YgVGFyZ2V0UmVnaXN0ZXJJbmZvLCB3aGljaAorLy8vIGlzIHRoZSBpbnRlcmZhY2UgdXNlZCBieSBjb2RlZ2VuLiBIb3dldmVyLCBzcGVjaWZpYyB0YXJnZXRzICpzaG91bGQgbmV2ZXIqCisvLy8gc3BlY2lhbGl6ZSB0aGlzIGNsYXNzLiBNQ1JlZ2lzdGVySW5mbyBzaG91bGQgb25seSBjb250YWluIGdldHRlcnMgdG8gYWNjZXNzCisvLy8gVGFibGVHZW4gZ2VuZXJhdGVkIHBoeXNpY2FsIHJlZ2lzdGVyIGRhdGEuIEl0IG11c3Qgbm90IGJlIGV4dGVuZGVkIHdpdGgKKy8vLyB2aXJ0dWFsIG1ldGhvZHMuCisvLy8KK2NsYXNzIE1DUmVnaXN0ZXJJbmZvIHsKK3B1YmxpYzoKKyAgdXNpbmcgcmVnY2xhc3NfaXRlcmF0b3IgPSBjb25zdCBNQ1JlZ2lzdGVyQ2xhc3MgKjsKKworICAvLy8gRHdhcmZMTFZNUmVnUGFpciAtIEVtaXR0ZWQgYnkgdGFibGVnZW4gc28gRHdhcmY8LT5MTFZNIHJlZyBtYXBwaW5ncyBjYW4gYmUKKyAgLy8vIHBlcmZvcm1lZCB3aXRoIGEgYmluYXJ5IHNlYXJjaC4KKyAgc3RydWN0IER3YXJmTExWTVJlZ1BhaXIgeworICAgIHVuc2lnbmVkIEZyb21SZWc7CisgICAgdW5zaWduZWQgVG9SZWc7CisKKyAgICBib29sIG9wZXJhdG9yPChEd2FyZkxMVk1SZWdQYWlyIFJIUykgY29uc3QgeyByZXR1cm4gRnJvbVJlZyA8IFJIUy5Gcm9tUmVnOyB9CisgIH07CisKKyAgLy8vIFN1YlJlZ0NvdmVyZWRCaXRzIC0gRW1pdHRlZCBieSB0YWJsZWdlbjogYml0IHJhbmdlIGNvdmVyZWQgYnkgYSBzdWJyZWcKKyAgLy8vIGluZGV4LCAtMSBpbiBhbnkgYmVpbmcgaW52YWxpZC4KKyAgc3RydWN0IFN1YlJlZ0NvdmVyZWRCaXRzIHsKKyAgICB1aW50MTZfdCBPZmZzZXQ7CisgICAgdWludDE2X3QgU2l6ZTsKKyAgfTsKKworcHJpdmF0ZToKKyAgY29uc3QgTUNSZWdpc3RlckRlc2MgKkRlc2M7ICAgICAgICAgICAgICAgICAvLyBQb2ludGVyIHRvIHRoZSBkZXNjcmlwdG9yIGFycmF5CisgIHVuc2lnbmVkIE51bVJlZ3M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGFycmF5CisgIHVuc2lnbmVkIFJBUmVnOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmV0dXJuIGFkZHJlc3MgcmVnaXN0ZXIKKyAgdW5zaWduZWQgUENSZWc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQcm9ncmFtIGNvdW50ZXIgcmVnaXN0ZXIKKyAgY29uc3QgTUNSZWdpc3RlckNsYXNzICpDbGFzc2VzOyAgICAgICAgICAgICAvLyBQb2ludGVyIHRvIHRoZSByZWdjbGFzcyBhcnJheQorICB1bnNpZ25lZCBOdW1DbGFzc2VzOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBhcnJheQorICB1bnNpZ25lZCBOdW1SZWdVbml0czsgICAgICAgICAgICAgICAgICAgICAgIC8vIE51bWJlciBvZiByZWd1bml0cy4KKyAgY29uc3QgTUNQaHlzUmVnICgqUmVnVW5pdFJvb3RzKVsyXTsgICAgICAgICAvLyBQb2ludGVyIHRvIHJlZ3VuaXQgcm9vdCB0YWJsZS4KKyAgY29uc3QgTUNQaHlzUmVnICpEaWZmTGlzdHM7ICAgICAgICAgICAgICAgICAvLyBQb2ludGVyIHRvIHRoZSBkaWZmbGlzdHMgYXJyYXkKKyAgY29uc3QgTGFuZUJpdG1hc2sgKlJlZ1VuaXRNYXNrU2VxdWVuY2VzOyAgICAvLyBQb2ludGVyIHRvIGxhbmUgbWFzayBzZXF1ZW5jZXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgcmVnaXN0ZXIgdW5pdHMuCisgIGNvbnN0IGNoYXIgKlJlZ1N0cmluZ3M7ICAgICAgICAgICAgICAgICAgICAgLy8gUG9pbnRlciB0byB0aGUgc3RyaW5nIHRhYmxlLgorICBjb25zdCBjaGFyICpSZWdDbGFzc1N0cmluZ3M7ICAgICAgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gdGhlIGNsYXNzIHN0cmluZ3MuCisgIGNvbnN0IHVpbnQxNl90ICpTdWJSZWdJbmRpY2VzOyAgICAgICAgICAgICAgLy8gUG9pbnRlciB0byB0aGUgc3VicmVnIGxvb2t1cAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5LgorICBjb25zdCBTdWJSZWdDb3ZlcmVkQml0cyAqU3ViUmVnSWR4UmFuZ2VzOyAgIC8vIFBvaW50ZXIgdG8gdGhlIHN1YnJlZyBjb3ZlcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYml0IHJhbmdlcyBhcnJheS4KKyAgdW5zaWduZWQgTnVtU3ViUmVnSW5kaWNlczsgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2Ygc3VicmVnIGluZGljZXMuCisgIGNvbnN0IHVpbnQxNl90ICpSZWdFbmNvZGluZ1RhYmxlOyAgICAgICAgICAgLy8gUG9pbnRlciB0byBhcnJheSBvZiByZWdpc3RlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGVuY29kaW5ncy4KKworICB1bnNpZ25lZCBMMkR3YXJmUmVnc1NpemU7CisgIHVuc2lnbmVkIEVITDJEd2FyZlJlZ3NTaXplOworICB1bnNpZ25lZCBEd2FyZjJMUmVnc1NpemU7CisgIHVuc2lnbmVkIEVIRHdhcmYyTFJlZ3NTaXplOworICBjb25zdCBEd2FyZkxMVk1SZWdQYWlyICpMMkR3YXJmUmVnczsgICAgICAgIC8vIExMVk0gdG8gRHdhcmYgcmVncyBtYXBwaW5nCisgIGNvbnN0IER3YXJmTExWTVJlZ1BhaXIgKkVITDJEd2FyZlJlZ3M7ICAgICAgLy8gTExWTSB0byBEd2FyZiByZWdzIG1hcHBpbmcgRUgKKyAgY29uc3QgRHdhcmZMTFZNUmVnUGFpciAqRHdhcmYyTFJlZ3M7ICAgICAgICAvLyBEd2FyZiB0byBMTFZNIHJlZ3MgbWFwcGluZworICBjb25zdCBEd2FyZkxMVk1SZWdQYWlyICpFSER3YXJmMkxSZWdzOyAgICAgIC8vIER3YXJmIHRvIExMVk0gcmVncyBtYXBwaW5nIEVICisgIERlbnNlTWFwPHVuc2lnbmVkLCBpbnQ+IEwyU0VIUmVnczsgICAgICAgICAgLy8gTExWTSB0byBTRUggcmVncyBtYXBwaW5nCisgIERlbnNlTWFwPHVuc2lnbmVkLCBpbnQ+IEwyQ1ZSZWdzOyAgICAgICAgICAgLy8gTExWTSB0byBDViByZWdzIG1hcHBpbmcKKworcHVibGljOgorICAvLy8gRGlmZkxpc3RJdGVyYXRvciAtIEJhc2UgaXRlcmF0b3IgY2xhc3MgdGhhdCBjYW4gdHJhdmVyc2UgdGhlCisgIC8vLyBkaWZmZXJlbnRpYWxseSBlbmNvZGVkIHJlZ2lzdGVyIGFuZCByZWd1bml0IGxpc3RzIGluIERpZmZMaXN0cy4KKyAgLy8vIERvbid0IHVzZSB0aGlzIGNsYXNzIGRpcmVjdGx5LCB1c2Ugb25lIG9mIHRoZSBzcGVjaWFsaXplZCBzdWItY2xhc3NlcworICAvLy8gZGVmaW5lZCBiZWxvdy4KKyAgY2xhc3MgRGlmZkxpc3RJdGVyYXRvciB7CisgICAgdWludDE2X3QgVmFsID0gMDsKKyAgICBjb25zdCBNQ1BoeXNSZWcgKkxpc3QgPSBudWxscHRyOworCisgIHByb3RlY3RlZDoKKyAgICAvLy8gQ3JlYXRlIGFuIGludmFsaWQgaXRlcmF0b3IuIENhbGwgaW5pdCgpIHRvIHBvaW50IHRvIHNvbWV0aGluZyB1c2VmdWwuCisgICAgRGlmZkxpc3RJdGVyYXRvcigpID0gZGVmYXVsdDsKKworICAgIC8vLyBpbml0IC0gUG9pbnQgdGhlIGl0ZXJhdG9yIHRvIEluaXRWYWwsIGRlY29kaW5nIHN1YnNlcXVlbnQgdmFsdWVzIGZyb20KKyAgICAvLy8gRGlmZkxpc3QuIFRoZSBpdGVyYXRvciB3aWxsIGluaXRpYWxseSBwb2ludCB0byBJbml0VmFsLCBzdWItY2xhc3NlcyBhcmUKKyAgICAvLy8gcmVzcG9uc2libGUgZm9yIHNraXBwaW5nIHRoZSBzZWVkIHZhbHVlIGlmIGl0IGlzIG5vdCBwYXJ0IG9mIHRoZSBsaXN0LgorICAgIHZvaWQgaW5pdChNQ1BoeXNSZWcgSW5pdFZhbCwgY29uc3QgTUNQaHlzUmVnICpEaWZmTGlzdCkgeworICAgICAgVmFsID0gSW5pdFZhbDsKKyAgICAgIExpc3QgPSBEaWZmTGlzdDsKKyAgICB9CisKKyAgICAvLy8gYWR2YW5jZSAtIE1vdmUgdG8gdGhlIG5leHQgbGlzdCBwb3NpdGlvbiwgcmV0dXJuIHRoZSBhcHBsaWVkCisgICAgLy8vIGRpZmZlcmVudGlhbC4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkZXRlY3QgdGhlIGVuZCBvZiB0aGUgbGlzdCwgdGhhdAorICAgIC8vLyBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgKGJ5IGNoZWNraW5nIGZvciBhIDAgcmV0dXJuIHZhbHVlKS4KKyAgICB1bnNpZ25lZCBhZHZhbmNlKCkgeworICAgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiQ2Fubm90IG1vdmUgb2ZmIHRoZSBlbmQgb2YgdGhlIGxpc3QuIik7CisgICAgICBNQ1BoeXNSZWcgRCA9ICpMaXN0Kys7CisgICAgICBWYWwgKz0gRDsKKyAgICAgIHJldHVybiBEOworICAgIH0KKworICBwdWJsaWM6CisgICAgLy8vIGlzVmFsaWQgLSByZXR1cm5zIHRydWUgaWYgdGhpcyBpdGVyYXRvciBpcyBub3QgeWV0IGF0IHRoZSBlbmQuCisgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gTGlzdDsgfQorCisgICAgLy8vIERlcmVmZXJlbmNlIHRoZSBpdGVyYXRvciB0byBnZXQgdGhlIHZhbHVlIGF0IHRoZSBjdXJyZW50IHBvc2l0aW9uLgorICAgIHVuc2lnbmVkIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIFZhbDsgfQorCisgICAgLy8vIFByZS1pbmNyZW1lbnQgdG8gbW92ZSB0byB0aGUgbmV4dCBwb3NpdGlvbi4KKyAgICB2b2lkIG9wZXJhdG9yKysoKSB7CisgICAgICAvLyBUaGUgZW5kIG9mIHRoZSBsaXN0IGlzIGVuY29kZWQgYXMgYSAwIGRpZmZlcmVudGlhbC4KKyAgICAgIGlmICghYWR2YW5jZSgpKQorICAgICAgICBMaXN0ID0gbnVsbHB0cjsKKyAgICB9CisgIH07CisKKyAgLy8gVGhlc2UgaXRlcmF0b3JzIGFyZSBhbGxvd2VkIHRvIHN1Yi1jbGFzcyBEaWZmTGlzdEl0ZXJhdG9yIGFuZCBhY2Nlc3MKKyAgLy8gaW50ZXJuYWwgbGlzdCBwb2ludGVycy4KKyAgZnJpZW5kIGNsYXNzIE1DU3ViUmVnSXRlcmF0b3I7CisgIGZyaWVuZCBjbGFzcyBNQ1N1YlJlZ0luZGV4SXRlcmF0b3I7CisgIGZyaWVuZCBjbGFzcyBNQ1N1cGVyUmVnSXRlcmF0b3I7CisgIGZyaWVuZCBjbGFzcyBNQ1JlZ1VuaXRJdGVyYXRvcjsKKyAgZnJpZW5kIGNsYXNzIE1DUmVnVW5pdE1hc2tJdGVyYXRvcjsKKyAgZnJpZW5kIGNsYXNzIE1DUmVnVW5pdFJvb3RJdGVyYXRvcjsKKworICAvLy8gXGJyaWVmIEluaXRpYWxpemUgTUNSZWdpc3RlckluZm8sIGNhbGxlZCBieSBUYWJsZUdlbgorICAvLy8gYXV0by1nZW5lcmF0ZWQgcm91dGluZXMuICpETyBOT1QgVVNFKi4KKyAgdm9pZCBJbml0TUNSZWdpc3RlckluZm8oY29uc3QgTUNSZWdpc3RlckRlc2MgKkQsIHVuc2lnbmVkIE5SLCB1bnNpZ25lZCBSQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgUEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DUmVnaXN0ZXJDbGFzcyAqQywgdW5zaWduZWQgTkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DUGh5c1JlZyAoKlJVUm9vdHMpWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOUlUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DUGh5c1JlZyAqREwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExhbmVCaXRtYXNrICpSVU1TLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpTdHJpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpDbGFzc1N0cmluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQxNl90ICpTdWJJbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBOdW1JbmRpY2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdWJSZWdDb3ZlcmVkQml0cyAqU3ViSWR4UmFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MTZfdCAqUkVUKSB7CisgICAgRGVzYyA9IEQ7CisgICAgTnVtUmVncyA9IE5SOworICAgIFJBUmVnID0gUkE7CisgICAgUENSZWcgPSBQQzsKKyAgICBDbGFzc2VzID0gQzsKKyAgICBEaWZmTGlzdHMgPSBETDsKKyAgICBSZWdVbml0TWFza1NlcXVlbmNlcyA9IFJVTVM7CisgICAgUmVnU3RyaW5ncyA9IFN0cmluZ3M7CisgICAgUmVnQ2xhc3NTdHJpbmdzID0gQ2xhc3NTdHJpbmdzOworICAgIE51bUNsYXNzZXMgPSBOQzsKKyAgICBSZWdVbml0Um9vdHMgPSBSVVJvb3RzOworICAgIE51bVJlZ1VuaXRzID0gTlJVOworICAgIFN1YlJlZ0luZGljZXMgPSBTdWJJbmRpY2VzOworICAgIE51bVN1YlJlZ0luZGljZXMgPSBOdW1JbmRpY2VzOworICAgIFN1YlJlZ0lkeFJhbmdlcyA9IFN1YklkeFJhbmdlczsKKyAgICBSZWdFbmNvZGluZ1RhYmxlID0gUkVUOworCisgICAgLy8gSW5pdGlhbGl6ZSBEV0FSRiByZWdpc3RlciBtYXBwaW5nIHZhcmlhYmxlcworICAgIEVITDJEd2FyZlJlZ3MgPSBudWxscHRyOworICAgIEVITDJEd2FyZlJlZ3NTaXplID0gMDsKKyAgICBMMkR3YXJmUmVncyA9IG51bGxwdHI7CisgICAgTDJEd2FyZlJlZ3NTaXplID0gMDsKKyAgICBFSER3YXJmMkxSZWdzID0gbnVsbHB0cjsKKyAgICBFSER3YXJmMkxSZWdzU2l6ZSA9IDA7CisgICAgRHdhcmYyTFJlZ3MgPSBudWxscHRyOworICAgIER3YXJmMkxSZWdzU2l6ZSA9IDA7CisgIH0KKworICAvLy8gXGJyaWVmIFVzZWQgdG8gaW5pdGlhbGl6ZSBMTFZNIHJlZ2lzdGVyIHRvIER3YXJmCisgIC8vLyByZWdpc3RlciBudW1iZXIgbWFwcGluZy4gQ2FsbGVkIGJ5IFRhYmxlR2VuIGF1dG8tZ2VuZXJhdGVkIHJvdXRpbmVzLgorICAvLy8gKkRPIE5PVCBVU0UqLgorICB2b2lkIG1hcExMVk1SZWdzVG9Ed2FyZlJlZ3MoY29uc3QgRHdhcmZMTFZNUmVnUGFpciAqTWFwLCB1bnNpZ25lZCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0VIKSB7CisgICAgaWYgKGlzRUgpIHsKKyAgICAgIEVITDJEd2FyZlJlZ3MgPSBNYXA7CisgICAgICBFSEwyRHdhcmZSZWdzU2l6ZSA9IFNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgIEwyRHdhcmZSZWdzID0gTWFwOworICAgICAgTDJEd2FyZlJlZ3NTaXplID0gU2l6ZTsKKyAgICB9CisgIH0KKworICAvLy8gXGJyaWVmIFVzZWQgdG8gaW5pdGlhbGl6ZSBEd2FyZiByZWdpc3RlciB0byBMTFZNCisgIC8vLyByZWdpc3RlciBudW1iZXIgbWFwcGluZy4gQ2FsbGVkIGJ5IFRhYmxlR2VuIGF1dG8tZ2VuZXJhdGVkIHJvdXRpbmVzLgorICAvLy8gKkRPIE5PVCBVU0UqLgorICB2b2lkIG1hcER3YXJmUmVnc1RvTExWTVJlZ3MoY29uc3QgRHdhcmZMTFZNUmVnUGFpciAqTWFwLCB1bnNpZ25lZCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc0VIKSB7CisgICAgaWYgKGlzRUgpIHsKKyAgICAgIEVIRHdhcmYyTFJlZ3MgPSBNYXA7CisgICAgICBFSER3YXJmMkxSZWdzU2l6ZSA9IFNpemU7CisgICAgfSBlbHNlIHsKKyAgICAgIER3YXJmMkxSZWdzID0gTWFwOworICAgICAgRHdhcmYyTFJlZ3NTaXplID0gU2l6ZTsKKyAgICB9CisgIH0KKworICAvLy8gbWFwTExWTVJlZ1RvU0VIUmVnIC0gVXNlZCB0byBpbml0aWFsaXplIExMVk0gcmVnaXN0ZXIgdG8gU0VIIHJlZ2lzdGVyCisgIC8vLyBudW1iZXIgbWFwcGluZy4gQnkgZGVmYXVsdCB0aGUgU0VIIHJlZ2lzdGVyIG51bWJlciBpcyBqdXN0IHRoZSBzYW1lCisgIC8vLyBhcyB0aGUgTExWTSByZWdpc3RlciBudW1iZXIuCisgIC8vLyBGSVhNRTogVGFibGVHZW4gdGhlc2UgbnVtYmVycy4gQ3VycmVudGx5IHRoaXMgcmVxdWlyZXMgdGFyZ2V0IHNwZWNpZmljCisgIC8vLyBpbml0aWFsaXphdGlvbiBjb2RlLgorICB2b2lkIG1hcExMVk1SZWdUb1NFSFJlZyh1bnNpZ25lZCBMTFZNUmVnLCBpbnQgU0VIUmVnKSB7CisgICAgTDJTRUhSZWdzW0xMVk1SZWddID0gU0VIUmVnOworICB9CisKKyAgdm9pZCBtYXBMTFZNUmVnVG9DVlJlZyh1bnNpZ25lZCBMTFZNUmVnLCBpbnQgQ1ZSZWcpIHsKKyAgICBMMkNWUmVnc1tMTFZNUmVnXSA9IENWUmVnOworICB9CisKKyAgLy8vIFxicmllZiBUaGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSByZWdpc3RlciB3aGVyZSB0aGUgcmV0dXJuCisgIC8vLyBhZGRyZXNzIGNhbiBiZSBmb3VuZC4KKyAgdW5zaWduZWQgZ2V0UkFSZWdpc3RlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gUkFSZWc7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSByZWdpc3RlciB3aGljaCBpcyB0aGUgcHJvZ3JhbSBjb3VudGVyLgorICB1bnNpZ25lZCBnZXRQcm9ncmFtQ291bnRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gUENSZWc7CisgIH0KKworICBjb25zdCBNQ1JlZ2lzdGVyRGVzYyAmb3BlcmF0b3JbXSh1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIGFzc2VydChSZWdObyA8IE51bVJlZ3MgJiYKKyAgICAgICAgICAgIkF0dGVtcHRpbmcgdG8gYWNjZXNzIHJlY29yZCBmb3IgaW52YWxpZCByZWdpc3RlciBudW1iZXIhIik7CisgICAgcmV0dXJuIERlc2NbUmVnTm9dOworICB9CisKKyAgLy8vIFxicmllZiBQcm92aWRlIGEgZ2V0IG1ldGhvZCwgZXF1aXZhbGVudCB0byBbXSwgYnV0IG1vcmUgdXNlZnVsIHdpdGggYQorICAvLy8gcG9pbnRlciB0byB0aGlzIG9iamVjdC4KKyAgY29uc3QgTUNSZWdpc3RlckRlc2MgJmdldCh1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIHJldHVybiBvcGVyYXRvcltdKFJlZ05vKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgcGh5c2ljYWwgcmVnaXN0ZXIgbnVtYmVyIG9mIHN1Yi1yZWdpc3RlciAiSW5kZXgiCisgIC8vLyBmb3IgcGh5c2ljYWwgcmVnaXN0ZXIgUmVnTm8uIFJldHVybiB6ZXJvIGlmIHRoZSBzdWItcmVnaXN0ZXIgZG9lcyBub3QKKyAgLy8vIGV4aXN0LgorICB1bnNpZ25lZCBnZXRTdWJSZWcodW5zaWduZWQgUmVnLCB1bnNpZ25lZCBJZHgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJuIGEgc3VwZXItcmVnaXN0ZXIgb2YgdGhlIHNwZWNpZmllZCByZWdpc3RlcgorICAvLy8gUmVnIHNvIGl0cyBzdWItcmVnaXN0ZXIgb2YgaW5kZXggU3ViSWR4IGlzIFJlZy4KKyAgdW5zaWduZWQgZ2V0TWF0Y2hpbmdTdXBlclJlZyh1bnNpZ25lZCBSZWcsIHVuc2lnbmVkIFN1YklkeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1JlZ2lzdGVyQ2xhc3MgKlJDKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEZvciBhIGdpdmVuIHJlZ2lzdGVyIHBhaXIsIHJldHVybiB0aGUgc3ViLXJlZ2lzdGVyIGluZGV4CisgIC8vLyBpZiB0aGUgc2Vjb25kIHJlZ2lzdGVyIGlzIGEgc3ViLXJlZ2lzdGVyIG9mIHRoZSBmaXJzdC4gUmV0dXJuIHplcm8KKyAgLy8vIG90aGVyd2lzZS4KKyAgdW5zaWduZWQgZ2V0U3ViUmVnSW5kZXgodW5zaWduZWQgUmVnTm8sIHVuc2lnbmVkIFN1YlJlZ05vKSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgc2l6ZSBvZiB0aGUgYml0IHJhbmdlIGNvdmVyZWQgYnkgYSBzdWItcmVnaXN0ZXIgaW5kZXguCisgIC8vLyBJZiB0aGUgaW5kZXggaXNuJ3QgY29udGludW91cywgcmV0dXJuIHRoZSBzdW0gb2YgdGhlIHNpemVzIG9mIGl0cyBwYXJ0cy4KKyAgLy8vIElmIHRoZSBpbmRleCBpcyB1c2VkIHRvIGFjY2VzcyBzdWJyZWdpc3RlcnMgb2YgZGlmZmVyZW50IHNpemVzLCByZXR1cm4gLTEuCisgIHVuc2lnbmVkIGdldFN1YlJlZ0lkeFNpemUodW5zaWduZWQgSWR4KSBjb25zdDsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgb2Zmc2V0IG9mIHRoZSBiaXQgcmFuZ2UgY292ZXJlZCBieSBhIHN1Yi1yZWdpc3RlciBpbmRleC4KKyAgLy8vIElmIGFuIE9mZnNldCBkb2Vzbid0IG1ha2Ugc2Vuc2UgKHRoZSBpbmRleCBpc24ndCBjb250aW51b3VzLCBvciBpcyB1c2VkIHRvCisgIC8vLyBhY2Nlc3Mgc3ViLXJlZ2lzdGVycyBhdCBkaWZmZXJlbnQgb2Zmc2V0cyksIHJldHVybiAtMS4KKyAgdW5zaWduZWQgZ2V0U3ViUmVnSWR4T2Zmc2V0KHVuc2lnbmVkIElkeCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGh1bWFuLXJlYWRhYmxlIHN5bWJvbGljIHRhcmdldC1zcGVjaWZpYyBuYW1lIGZvciB0aGUKKyAgLy8vIHNwZWNpZmllZCBwaHlzaWNhbCByZWdpc3Rlci4KKyAgY29uc3QgY2hhciAqZ2V0TmFtZSh1bnNpZ25lZCBSZWdObykgY29uc3QgeworICAgIHJldHVybiBSZWdTdHJpbmdzICsgZ2V0KFJlZ05vKS5OYW1lOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiByZWdpc3RlcnMgdGhpcyB0YXJnZXQgaGFzICh1c2VmdWwgZm9yCisgIC8vLyBzaXppbmcgYXJyYXlzIGhvbGRpbmcgcGVyIHJlZ2lzdGVyIGluZm9ybWF0aW9uKQorICB1bnNpZ25lZCBnZXROdW1SZWdzKCkgY29uc3QgeworICAgIHJldHVybiBOdW1SZWdzOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBzdWItcmVnaXN0ZXIgaW5kaWNlcworICAvLy8gdW5kZXJzdG9vZCBieSB0aGUgdGFyZ2V0LiBJbmRleCAwIGlzIHJlc2VydmVkIGZvciB0aGUgbm8tb3Agc3ViLXJlZ2lzdGVyLAorICAvLy8gd2hpbGUgMSB0byBnZXROdW1TdWJSZWdJbmRpY2VzKCkgLSAxIHJlcHJlc2VudCByZWFsIHN1Yi1yZWdpc3RlcnMuCisgIHVuc2lnbmVkIGdldE51bVN1YlJlZ0luZGljZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIE51bVN1YlJlZ0luZGljZXM7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgbnVtYmVyIG9mIChuYXRpdmUpIHJlZ2lzdGVyIHVuaXRzIGluIHRoZQorICAvLy8gdGFyZ2V0LiBSZWdpc3RlciB1bml0cyBhcmUgbnVtYmVyZWQgZnJvbSAwIHRvIGdldE51bVJlZ1VuaXRzKCkgLSAxLiBUaGV5CisgIC8vLyBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCBNQ1JlZ1VuaXRJdGVyYXRvciBkZWZpbmVkIGJlbG93LgorICB1bnNpZ25lZCBnZXROdW1SZWdVbml0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gTnVtUmVnVW5pdHM7CisgIH0KKworICAvLy8gXGJyaWVmIE1hcCBhIHRhcmdldCByZWdpc3RlciB0byBhbiBlcXVpdmFsZW50IGR3YXJmIHJlZ2lzdGVyCisgIC8vLyBudW1iZXIuICBSZXR1cm5zIC0xIGlmIHRoZXJlIGlzIG5vIGVxdWl2YWxlbnQgdmFsdWUuICBUaGUgc2Vjb25kCisgIC8vLyBwYXJhbWV0ZXIgYWxsb3dzIHRhcmdldHMgdG8gdXNlIGRpZmZlcmVudCBudW1iZXJpbmdzIGZvciBFSCBpbmZvIGFuZAorICAvLy8gZGVidWdnaW5nIGluZm8uCisgIGludCBnZXREd2FyZlJlZ051bSh1bnNpZ25lZCBSZWdOdW0sIGJvb2wgaXNFSCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBNYXAgYSBkd2FyZiByZWdpc3RlciBiYWNrIHRvIGEgdGFyZ2V0IHJlZ2lzdGVyLgorICBpbnQgZ2V0TExWTVJlZ051bSh1bnNpZ25lZCBSZWdOdW0sIGJvb2wgaXNFSCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBNYXAgYSBEV0FSRiBFSCByZWdpc3RlciBiYWNrIHRvIGEgdGFyZ2V0IHJlZ2lzdGVyIChzYW1lIGFzCisgIC8vLyBnZXRMTFZNUmVnTnVtKFJlZ051bSwgdHJ1ZSkpIGJ1dCByZXR1cm4gLTEgaWYgdGhlcmUgaXMgbm8gbWFwcGluZywKKyAgLy8vIHJhdGhlciB0aGFuIGFzc2VydGluZyB0aGF0IHRoZXJlIG11c3QgYmUgb25lLgorICBpbnQgZ2V0TExWTVJlZ051bUZyb21FSCh1bnNpZ25lZCBSZWdOdW0pIGNvbnN0OworCisgIC8vLyBcYnJpZWYgTWFwIGEgdGFyZ2V0IEVIIHJlZ2lzdGVyIG51bWJlciB0byBhbiBlcXVpdmFsZW50IERXQVJGIHJlZ2lzdGVyCisgIC8vLyBudW1iZXIuCisgIGludCBnZXREd2FyZlJlZ051bUZyb21Ed2FyZkVIUmVnTnVtKHVuc2lnbmVkIFJlZ051bSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBNYXAgYSB0YXJnZXQgcmVnaXN0ZXIgdG8gYW4gZXF1aXZhbGVudCBTRUggcmVnaXN0ZXIKKyAgLy8vIG51bWJlci4gIFJldHVybnMgTExWTSByZWdpc3RlciBudW1iZXIgaWYgdGhlcmUgaXMgbm8gZXF1aXZhbGVudCB2YWx1ZS4KKyAgaW50IGdldFNFSFJlZ051bSh1bnNpZ25lZCBSZWdOdW0pIGNvbnN0OworCisgIC8vLyBcYnJpZWYgTWFwIGEgdGFyZ2V0IHJlZ2lzdGVyIHRvIGFuIGVxdWl2YWxlbnQgQ29kZVZpZXcgcmVnaXN0ZXIKKyAgLy8vIG51bWJlci4KKyAgaW50IGdldENvZGVWaWV3UmVnTnVtKHVuc2lnbmVkIFJlZ051bSkgY29uc3Q7CisKKyAgcmVnY2xhc3NfaXRlcmF0b3IgcmVnY2xhc3NfYmVnaW4oKSBjb25zdCB7IHJldHVybiBDbGFzc2VzOyB9CisgIHJlZ2NsYXNzX2l0ZXJhdG9yIHJlZ2NsYXNzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIENsYXNzZXMrTnVtQ2xhc3NlczsgfQorICBpdGVyYXRvcl9yYW5nZTxyZWdjbGFzc19pdGVyYXRvcj4gcmVnY2xhc3NlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShyZWdjbGFzc19iZWdpbigpLCByZWdjbGFzc19lbmQoKSk7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1SZWdDbGFzc2VzKCkgY29uc3QgeworICAgIHJldHVybiAodW5zaWduZWQpKHJlZ2NsYXNzX2VuZCgpLXJlZ2NsYXNzX2JlZ2luKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSByZWdpc3RlciBjbGFzcyBhc3NvY2lhdGVkIHdpdGggdGhlIGVudW1lcmF0aW9uCisgIC8vLyB2YWx1ZS4gIFNlZSBjbGFzcyBNQ09wZXJhbmRJbmZvLgorICBjb25zdCBNQ1JlZ2lzdGVyQ2xhc3MmIGdldFJlZ0NsYXNzKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IGdldE51bVJlZ0NsYXNzZXMoKSAmJiAiUmVnaXN0ZXIgQ2xhc3MgSUQgb3V0IG9mIHJhbmdlIik7CisgICAgcmV0dXJuIENsYXNzZXNbaV07CisgIH0KKworICBjb25zdCBjaGFyICpnZXRSZWdDbGFzc05hbWUoY29uc3QgTUNSZWdpc3RlckNsYXNzICpDbGFzcykgY29uc3QgeworICAgIHJldHVybiBSZWdDbGFzc1N0cmluZ3MgKyBDbGFzcy0+TmFtZUlkeDsKKyAgfQorCisgICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIGVuY29kaW5nIGZvciBSZWdObworICB1aW50MTZfdCBnZXRFbmNvZGluZ1ZhbHVlKHVuc2lnbmVkIFJlZ05vKSBjb25zdCB7CisgICAgYXNzZXJ0KFJlZ05vIDwgTnVtUmVncyAmJgorICAgICAgICAgICAiQXR0ZW1wdGluZyB0byBnZXQgZW5jb2RpbmcgZm9yIGludmFsaWQgcmVnaXN0ZXIgbnVtYmVyISIpOworICAgIHJldHVybiBSZWdFbmNvZGluZ1RhYmxlW1JlZ05vXTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIFJlZ0IgaXMgYSBzdWItcmVnaXN0ZXIgb2YgUmVnQS4KKyAgYm9vbCBpc1N1YlJlZ2lzdGVyKHVuc2lnbmVkIFJlZ0EsIHVuc2lnbmVkIFJlZ0IpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNTdXBlclJlZ2lzdGVyKFJlZ0IsIFJlZ0EpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgUmVnQiBpcyBhIHN1cGVyLXJlZ2lzdGVyIG9mIFJlZ0EuCisgIGJvb2wgaXNTdXBlclJlZ2lzdGVyKHVuc2lnbmVkIFJlZ0EsIHVuc2lnbmVkIFJlZ0IpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIFJlZ0IgaXMgYSBzdWItcmVnaXN0ZXIgb2YgUmVnQSBvciBpZiBSZWdCID09IFJlZ0EuCisgIGJvb2wgaXNTdWJSZWdpc3RlckVxKHVuc2lnbmVkIFJlZ0EsIHVuc2lnbmVkIFJlZ0IpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNTdXBlclJlZ2lzdGVyRXEoUmVnQiwgUmVnQSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBSZWdCIGlzIGEgc3VwZXItcmVnaXN0ZXIgb2YgUmVnQSBvciBpZgorICAvLy8gUmVnQiA9PSBSZWdBLgorICBib29sIGlzU3VwZXJSZWdpc3RlckVxKHVuc2lnbmVkIFJlZ0EsIHVuc2lnbmVkIFJlZ0IpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVnQSA9PSBSZWdCIHx8IGlzU3VwZXJSZWdpc3RlcihSZWdBLCBSZWdCKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0cnVlIGlmIFJlZ0IgaXMgYSBzdXBlci1yZWdpc3RlciBvciBzdWItcmVnaXN0ZXIgb2YgUmVnQQorICAvLy8gb3IgaWYgUmVnQiA9PSBSZWdBLgorICBib29sIGlzU3VwZXJPclN1YlJlZ2lzdGVyRXEodW5zaWduZWQgUmVnQSwgdW5zaWduZWQgUmVnQikgY29uc3QgeworICAgIHJldHVybiBpc1N1YlJlZ2lzdGVyRXEoUmVnQSwgUmVnQikgfHwgaXNTdXBlclJlZ2lzdGVyKFJlZ0EsIFJlZ0IpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyIExpc3QgSXRlcmF0b3JzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBNQ1JlZ2lzdGVySW5mbyBwcm92aWRlcyBsaXN0cyBvZiBzdXBlci1yZWdpc3RlcnMsIHN1Yi1yZWdpc3RlcnMsIGFuZAorLy8gYWxpYXNpbmcgcmVnaXN0ZXJzLiBVc2UgdGhlc2UgaXRlcmF0b3IgY2xhc3NlcyB0byB0cmF2ZXJzZSB0aGUgbGlzdHMuCisKKy8vLyBNQ1N1YlJlZ0l0ZXJhdG9yIGVudW1lcmF0ZXMgYWxsIHN1Yi1yZWdpc3RlcnMgb2YgUmVnLgorLy8vIElmIEluY2x1ZGVTZWxmIGlzIHNldCwgUmVnIGl0c2VsZiBpcyBpbmNsdWRlZCBpbiB0aGUgbGlzdC4KK2NsYXNzIE1DU3ViUmVnSXRlcmF0b3IgOiBwdWJsaWMgTUNSZWdpc3RlckluZm86OkRpZmZMaXN0SXRlcmF0b3IgeworcHVibGljOgorICBNQ1N1YlJlZ0l0ZXJhdG9yKHVuc2lnbmVkIFJlZywgY29uc3QgTUNSZWdpc3RlckluZm8gKk1DUkksCisgICAgICAgICAgICAgICAgICAgICBib29sIEluY2x1ZGVTZWxmID0gZmFsc2UpIHsKKyAgICBpbml0KFJlZywgTUNSSS0+RGlmZkxpc3RzICsgTUNSSS0+Z2V0KFJlZykuU3ViUmVncyk7CisgICAgLy8gSW5pdGlhbGx5LCB0aGUgaXRlcmF0b3IgcG9pbnRzIHRvIFJlZyBpdHNlbGYuCisgICAgaWYgKCFJbmNsdWRlU2VsZikKKyAgICAgICsrKnRoaXM7CisgIH0KK307CisKKy8vLyBJdGVyYXRvciB0aGF0IGVudW1lcmF0ZXMgdGhlIHN1Yi1yZWdpc3RlcnMgb2YgYSBSZWcgYW5kIHRoZSBhc3NvY2lhdGVkCisvLy8gc3ViLXJlZ2lzdGVyIGluZGljZXMuCitjbGFzcyBNQ1N1YlJlZ0luZGV4SXRlcmF0b3IgeworICBNQ1N1YlJlZ0l0ZXJhdG9yIFNSSXRlcjsKKyAgY29uc3QgdWludDE2X3QgKlNSSW5kZXg7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdHMgYW4gaXRlcmF0b3IgdGhhdCB0cmF2ZXJzZXMgc3VicmVnaXN0ZXJzIGFuZCB0aGVpcgorICAvLy8gYXNzb2NpYXRlZCBzdWJyZWdpc3RlciBpbmRpY2VzLgorICBNQ1N1YlJlZ0luZGV4SXRlcmF0b3IodW5zaWduZWQgUmVnLCBjb25zdCBNQ1JlZ2lzdGVySW5mbyAqTUNSSSkKKyAgICA6IFNSSXRlcihSZWcsIE1DUkkpIHsKKyAgICBTUkluZGV4ID0gTUNSSS0+U3ViUmVnSW5kaWNlcyArIE1DUkktPmdldChSZWcpLlN1YlJlZ0luZGljZXM7CisgIH0KKworICAvLy8gUmV0dXJucyBjdXJyZW50IHN1Yi1yZWdpc3Rlci4KKyAgdW5zaWduZWQgZ2V0U3ViUmVnKCkgY29uc3QgeworICAgIHJldHVybiAqU1JJdGVyOworICB9CisKKyAgLy8vIFJldHVybnMgc3ViLXJlZ2lzdGVyIGluZGV4IG9mIHRoZSBjdXJyZW50IHN1Yi1yZWdpc3Rlci4KKyAgdW5zaWduZWQgZ2V0U3ViUmVnSW5kZXgoKSBjb25zdCB7CisgICAgcmV0dXJuICpTUkluZGV4OworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGl0ZXJhdG9yIGlzIG5vdCB5ZXQgYXQgdGhlIGVuZC4KKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gU1JJdGVyLmlzVmFsaWQoKTsgfQorCisgIC8vLyBNb3ZlcyB0byB0aGUgbmV4dCBwb3NpdGlvbi4KKyAgdm9pZCBvcGVyYXRvcisrKCkgeworICAgICsrU1JJdGVyOworICAgICsrU1JJbmRleDsKKyAgfQorfTsKKworLy8vIE1DU3VwZXJSZWdJdGVyYXRvciBlbnVtZXJhdGVzIGFsbCBzdXBlci1yZWdpc3RlcnMgb2YgUmVnLgorLy8vIElmIEluY2x1ZGVTZWxmIGlzIHNldCwgUmVnIGl0c2VsZiBpcyBpbmNsdWRlZCBpbiB0aGUgbGlzdC4KK2NsYXNzIE1DU3VwZXJSZWdJdGVyYXRvciA6IHB1YmxpYyBNQ1JlZ2lzdGVySW5mbzo6RGlmZkxpc3RJdGVyYXRvciB7CitwdWJsaWM6CisgIE1DU3VwZXJSZWdJdGVyYXRvcigpID0gZGVmYXVsdDsKKworICBNQ1N1cGVyUmVnSXRlcmF0b3IodW5zaWduZWQgUmVnLCBjb25zdCBNQ1JlZ2lzdGVySW5mbyAqTUNSSSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgSW5jbHVkZVNlbGYgPSBmYWxzZSkgeworICAgIGluaXQoUmVnLCBNQ1JJLT5EaWZmTGlzdHMgKyBNQ1JJLT5nZXQoUmVnKS5TdXBlclJlZ3MpOworICAgIC8vIEluaXRpYWxseSwgdGhlIGl0ZXJhdG9yIHBvaW50cyB0byBSZWcgaXRzZWxmLgorICAgIGlmICghSW5jbHVkZVNlbGYpCisgICAgICArKyp0aGlzOworICB9Cit9OworCisvLyBEZWZpbml0aW9uIGZvciBpc1N1cGVyUmVnaXN0ZXIuIFB1dCBpdCBkb3duIGhlcmUgc2luY2UgaXQgbmVlZHMgdGhlCisvLyBpdGVyYXRvciBkZWZpbmVkIGFib3ZlIGluIGFkZGl0aW9uIHRvIHRoZSBNQ1JlZ2lzdGVySW5mbyBjbGFzcyBpdHNlbGYuCitpbmxpbmUgYm9vbCBNQ1JlZ2lzdGVySW5mbzo6aXNTdXBlclJlZ2lzdGVyKHVuc2lnbmVkIFJlZ0EsIHVuc2lnbmVkIFJlZ0IpIGNvbnN0eworICBmb3IgKE1DU3VwZXJSZWdJdGVyYXRvciBJKFJlZ0EsIHRoaXMpOyBJLmlzVmFsaWQoKTsgKytJKQorICAgIGlmICgqSSA9PSBSZWdCKQorICAgICAgcmV0dXJuIHRydWU7CisgIHJldHVybiBmYWxzZTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlZ2lzdGVyIFVuaXRzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBSZWdpc3RlciB1bml0cyBhcmUgdXNlZCB0byBjb21wdXRlIHJlZ2lzdGVyIGFsaWFzaW5nLiBFdmVyeSByZWdpc3RlciBoYXMgYXQKKy8vIGxlYXN0IG9uZSByZWdpc3RlciB1bml0LCBidXQgaXQgY2FuIGhhdmUgbW9yZS4gVHdvIHJlZ2lzdGVycyBvdmVybGFwIGlmIGFuZAorLy8gb25seSBpZiB0aGV5IGhhdmUgYSBjb21tb24gcmVnaXN0ZXIgdW5pdC4KKy8vCisvLyBBIHRhcmdldCB3aXRoIGEgY29tcGxpY2F0ZWQgc3ViLXJlZ2lzdGVyIHN0cnVjdHVyZSB3aWxsIHR5cGljYWxseSBoYXZlIG1hbnkKKy8vIGZld2VyIHJlZ2lzdGVyIHVuaXRzIHRoYW4gYWN0dWFsIHJlZ2lzdGVycy4gTUNSSTo6Z2V0TnVtUmVnVW5pdHMoKSByZXR1cm5zCisvLyB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVyIHVuaXRzIGluIHRoZSB0YXJnZXQuCisKKy8vIE1DUmVnVW5pdEl0ZXJhdG9yIGVudW1lcmF0ZXMgYSBsaXN0IG9mIHJlZ2lzdGVyIHVuaXRzIGZvciBSZWcuIFRoZSBsaXN0IGlzCisvLyBpbiBhc2NlbmRpbmcgbnVtZXJpY2FsIG9yZGVyLgorY2xhc3MgTUNSZWdVbml0SXRlcmF0b3IgOiBwdWJsaWMgTUNSZWdpc3RlckluZm86OkRpZmZMaXN0SXRlcmF0b3IgeworcHVibGljOgorICAvLy8gTUNSZWdVbml0SXRlcmF0b3IgLSBDcmVhdGUgYW4gaXRlcmF0b3IgdGhhdCB0cmF2ZXJzZXMgdGhlIHJlZ2lzdGVyIHVuaXRzCisgIC8vLyBpbiBSZWcuCisgIE1DUmVnVW5pdEl0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgIE1DUmVnVW5pdEl0ZXJhdG9yKHVuc2lnbmVkIFJlZywgY29uc3QgTUNSZWdpc3RlckluZm8gKk1DUkkpIHsKKyAgICBhc3NlcnQoUmVnICYmICJOdWxsIHJlZ2lzdGVyIGhhcyBubyByZWd1bml0cyIpOworICAgIC8vIERlY29kZSB0aGUgUmVnVW5pdHMgTUNSZWdpc3RlckRlc2MgZmllbGQuCisgICAgdW5zaWduZWQgUlUgPSBNQ1JJLT5nZXQoUmVnKS5SZWdVbml0czsKKyAgICB1bnNpZ25lZCBTY2FsZSA9IFJVICYgMTU7CisgICAgdW5zaWduZWQgT2Zmc2V0ID0gUlUgPj4gNDsKKworICAgIC8vIEluaXRpYWxpemUgdGhlIGl0ZXJhdG9yIHRvIFJlZyAqIFNjYWxlLCBhbmQgdGhlIExpc3QgcG9pbnRlciB0bworICAgIC8vIERpZmZMaXN0cyArIE9mZnNldC4KKyAgICBpbml0KFJlZyAqIFNjYWxlLCBNQ1JJLT5EaWZmTGlzdHMgKyBPZmZzZXQpOworCisgICAgLy8gVGhhdCBtYXkgbm90IGJlIGEgdmFsaWQgdW5pdCwgd2UgbmVlZCB0byBhZHZhbmNlIGJ5IG9uZSB0byBnZXQgdGhlIHJlYWwKKyAgICAvLyB1bml0IG51bWJlci4gVGhlIGZpcnN0IGRpZmZlcmVudGlhbCBjYW4gYmUgMCB3aGljaCB3b3VsZCBub3JtYWxseQorICAgIC8vIHRlcm1pbmF0ZSB0aGUgbGlzdCwgYnV0IHNpbmNlIHdlIGtub3cgZXZlcnkgcmVnaXN0ZXIgaGFzIGF0IGxlYXN0IG9uZQorICAgIC8vIHVuaXQsIHdlIGNhbiBhbGxvdyBhIDAgZGlmZmVyZW50aWFsIGhlcmUuCisgICAgYWR2YW5jZSgpOworICB9Cit9OworCisvLy8gTUNSZWdVbml0TWFza0l0ZXJhdG9yIGVudW1lcmF0ZXMgYSBsaXN0IG9mIHJlZ2lzdGVyIHVuaXRzIGFuZCB0aGVpcgorLy8vIGFzc29jaWF0ZWQgbGFuZSBtYXNrcyBmb3IgUmVnLiBUaGUgcmVnaXN0ZXIgdW5pdHMgYXJlIGluIGFzY2VuZGluZworLy8vIG51bWVyaWNhbCBvcmRlci4KK2NsYXNzIE1DUmVnVW5pdE1hc2tJdGVyYXRvciB7CisgIE1DUmVnVW5pdEl0ZXJhdG9yIFJVSXRlcjsKKyAgY29uc3QgTGFuZUJpdG1hc2sgKk1hc2tMaXN0SXRlcjsKKworcHVibGljOgorICBNQ1JlZ1VuaXRNYXNrSXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIENvbnN0cnVjdHMgYW4gaXRlcmF0b3IgdGhhdCB0cmF2ZXJzZXMgdGhlIHJlZ2lzdGVyIHVuaXRzIGFuZCB0aGVpcgorICAvLy8gYXNzb2NpYXRlZCBMYW5lTWFza3MgaW4gUmVnLgorICBNQ1JlZ1VuaXRNYXNrSXRlcmF0b3IodW5zaWduZWQgUmVnLCBjb25zdCBNQ1JlZ2lzdGVySW5mbyAqTUNSSSkKKyAgICA6IFJVSXRlcihSZWcsIE1DUkkpIHsKKyAgICAgIHVpbnQxNl90IElkeCA9IE1DUkktPmdldChSZWcpLlJlZ1VuaXRMYW5lTWFza3M7CisgICAgICBNYXNrTGlzdEl0ZXIgPSAmTUNSSS0+UmVnVW5pdE1hc2tTZXF1ZW5jZXNbSWR4XTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGEgKFJlZ1VuaXQsIExhbmVNYXNrKSBwYWlyLgorICBzdGQ6OnBhaXI8dW5zaWduZWQsTGFuZUJpdG1hc2s+IG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoKlJVSXRlciwgKk1hc2tMaXN0SXRlcik7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXRlcmF0b3IgaXMgbm90IHlldCBhdCB0aGUgZW5kLgorICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBSVUl0ZXIuaXNWYWxpZCgpOyB9CisKKyAgLy8vIE1vdmVzIHRvIHRoZSBuZXh0IHBvc2l0aW9uLgorICB2b2lkIG9wZXJhdG9yKysoKSB7CisgICAgKytNYXNrTGlzdEl0ZXI7CisgICAgKytSVUl0ZXI7CisgIH0KK307CisKKy8vIEVhY2ggcmVnaXN0ZXIgdW5pdCBoYXMgb25lIG9yIHR3byByb290IHJlZ2lzdGVycy4gVGhlIGNvbXBsZXRlIHNldCBvZgorLy8gcmVnaXN0ZXJzIGNvbnRhaW5pbmcgYSByZWdpc3RlciB1bml0IGlzIHRoZSB1bmlvbiBvZiB0aGUgcm9vdHMgYW5kIHRoZWlyCisvLyBzdXBlci1yZWdpc3RlcnMuIEFsbCByZWdpc3RlcnMgYWxpYXNpbmcgVW5pdCBjYW4gYmUgdmlzaXRlZCBsaWtlIHRoaXM6CisvLworLy8gICBmb3IgKE1DUmVnVW5pdFJvb3RJdGVyYXRvciBSSShVbml0LCBNQ1JJKTsgUkkuaXNWYWxpZCgpOyArK1JJKSB7CisvLyAgICAgZm9yIChNQ1N1cGVyUmVnSXRlcmF0b3IgU0koKlJJLCBNQ1JJLCB0cnVlKTsgU0kuaXNWYWxpZCgpOyArK1NJKQorLy8gICAgICAgdmlzaXQoKlNJKTsKKy8vICAgIH0KKworLy8vIE1DUmVnVW5pdFJvb3RJdGVyYXRvciBlbnVtZXJhdGVzIHRoZSByb290IHJlZ2lzdGVycyBvZiBhIHJlZ2lzdGVyIHVuaXQuCitjbGFzcyBNQ1JlZ1VuaXRSb290SXRlcmF0b3IgeworICB1aW50MTZfdCBSZWcwID0gMDsKKyAgdWludDE2X3QgUmVnMSA9IDA7CisKK3B1YmxpYzoKKyAgTUNSZWdVbml0Um9vdEl0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgIE1DUmVnVW5pdFJvb3RJdGVyYXRvcih1bnNpZ25lZCBSZWdVbml0LCBjb25zdCBNQ1JlZ2lzdGVySW5mbyAqTUNSSSkgeworICAgIGFzc2VydChSZWdVbml0IDwgTUNSSS0+Z2V0TnVtUmVnVW5pdHMoKSAmJiAiSW52YWxpZCByZWdpc3RlciB1bml0Iik7CisgICAgUmVnMCA9IE1DUkktPlJlZ1VuaXRSb290c1tSZWdVbml0XVswXTsKKyAgICBSZWcxID0gTUNSSS0+UmVnVW5pdFJvb3RzW1JlZ1VuaXRdWzFdOworICB9CisKKyAgLy8vIFxicmllZiBEZXJlZmVyZW5jZSB0byBnZXQgdGhlIGN1cnJlbnQgcm9vdCByZWdpc3Rlci4KKyAgdW5zaWduZWQgb3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiBSZWcwOworICB9CisKKyAgLy8vIFxicmllZiBDaGVjayBpZiB0aGUgaXRlcmF0b3IgaXMgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdC4KKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgIHJldHVybiBSZWcwOworICB9CisKKyAgLy8vIFxicmllZiBQcmVpbmNyZW1lbnQgdG8gbW92ZSB0byB0aGUgbmV4dCByb290IHJlZ2lzdGVyLgorICB2b2lkIG9wZXJhdG9yKysoKSB7CisgICAgYXNzZXJ0KGlzVmFsaWQoKSAmJiAiQ2Fubm90IG1vdmUgb2ZmIHRoZSBlbmQgb2YgdGhlIGxpc3QuIik7CisgICAgUmVnMCA9IFJlZzE7CisgICAgUmVnMSA9IDA7CisgIH0KK307CisKKy8vLyBNQ1JlZ0FsaWFzSXRlcmF0b3IgZW51bWVyYXRlcyBhbGwgcmVnaXN0ZXJzIGFsaWFzaW5nIFJlZy4gIElmIEluY2x1ZGVTZWxmIGlzCisvLy8gc2V0LCBSZWcgaXRzZWxmIGlzIGluY2x1ZGVkIGluIHRoZSBsaXN0LiAgVGhpcyBpdGVyYXRvciBkb2VzIG5vdCBndWFyYW50ZWUKKy8vLyBhbnkgb3JkZXJpbmcgb3IgdGhhdCBlbnRyaWVzIGFyZSB1bmlxdWUuCitjbGFzcyBNQ1JlZ0FsaWFzSXRlcmF0b3IgeworcHJpdmF0ZToKKyAgdW5zaWduZWQgUmVnOworICBjb25zdCBNQ1JlZ2lzdGVySW5mbyAqTUNSSTsKKyAgYm9vbCBJbmNsdWRlU2VsZjsKKworICBNQ1JlZ1VuaXRJdGVyYXRvciBSSTsKKyAgTUNSZWdVbml0Um9vdEl0ZXJhdG9yIFJSSTsKKyAgTUNTdXBlclJlZ0l0ZXJhdG9yIFNJOworCitwdWJsaWM6CisgIE1DUmVnQWxpYXNJdGVyYXRvcih1bnNpZ25lZCBSZWcsIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICpNQ1JJLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNsdWRlU2VsZikKKyAgICA6IFJlZyhSZWcpLCBNQ1JJKE1DUkkpLCBJbmNsdWRlU2VsZihJbmNsdWRlU2VsZikgeworICAgIC8vIEluaXRpYWxpemUgdGhlIGl0ZXJhdG9ycy4KKyAgICBmb3IgKFJJID0gTUNSZWdVbml0SXRlcmF0b3IoUmVnLCBNQ1JJKTsgUkkuaXNWYWxpZCgpOyArK1JJKSB7CisgICAgICBmb3IgKFJSSSA9IE1DUmVnVW5pdFJvb3RJdGVyYXRvcigqUkksIE1DUkkpOyBSUkkuaXNWYWxpZCgpOyArK1JSSSkgeworICAgICAgICBmb3IgKFNJID0gTUNTdXBlclJlZ0l0ZXJhdG9yKCpSUkksIE1DUkksIHRydWUpOyBTSS5pc1ZhbGlkKCk7ICsrU0kpIHsKKyAgICAgICAgICBpZiAoISghSW5jbHVkZVNlbGYgJiYgUmVnID09ICpTSSkpCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBSSS5pc1ZhbGlkKCk7IH0KKworICB1bnNpZ25lZCBvcGVyYXRvciooKSBjb25zdCB7CisgICAgYXNzZXJ0KFNJLmlzVmFsaWQoKSAmJiAiQ2Fubm90IGRlcmVmZXJlbmNlIGFuIGludmFsaWQgaXRlcmF0b3IuIik7CisgICAgcmV0dXJuICpTSTsKKyAgfQorCisgIHZvaWQgYWR2YW5jZSgpIHsKKyAgICAvLyBBc3N1bWluZyBTSSBpcyB2YWxpZC4KKyAgICArK1NJOworICAgIGlmIChTSS5pc1ZhbGlkKCkpIHJldHVybjsKKworICAgICsrUlJJOworICAgIGlmIChSUkkuaXNWYWxpZCgpKSB7CisgICAgICBTSSA9IE1DU3VwZXJSZWdJdGVyYXRvcigqUlJJLCBNQ1JJLCB0cnVlKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICArK1JJOworICAgIGlmIChSSS5pc1ZhbGlkKCkpIHsKKyAgICAgIFJSSSA9IE1DUmVnVW5pdFJvb3RJdGVyYXRvcigqUkksIE1DUkkpOworICAgICAgU0kgPSBNQ1N1cGVyUmVnSXRlcmF0b3IoKlJSSSwgTUNSSSwgdHJ1ZSk7CisgICAgfQorICB9CisKKyAgdm9pZCBvcGVyYXRvcisrKCkgeworICAgIGFzc2VydChpc1ZhbGlkKCkgJiYgIkNhbm5vdCBtb3ZlIG9mZiB0aGUgZW5kIG9mIHRoZSBsaXN0LiIpOworICAgIGRvIGFkdmFuY2UoKTsKKyAgICB3aGlsZSAoIUluY2x1ZGVTZWxmICYmIGlzVmFsaWQoKSAmJiAqU0kgPT0gUmVnKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNSRUdJU1RFUklORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1NjaGVkdWxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DU2NoZWR1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MmY4ZWZkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1NjaGVkdWxlLmgKQEAgLTAsMCArMSwyNDcgQEAKKy8vPT09LS0gbGx2bS9NQy9NQ1NjaGVkdWxlLmggLSBTY2hlZHVsaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGNsYXNzZXMgdXNlZCB0byBkZXNjcmliZSBhIHN1YnRhcmdldCdzIG1hY2hpbmUgbW9kZWwKKy8vIGZvciBzY2hlZHVsaW5nIGFuZCBvdGhlciBpbnN0cnVjdGlvbiBjb3N0IGhldXJpc3RpY3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DU0NIRURVTEVfSAorI2RlZmluZSBMTFZNX01DX01DU0NIRURVTEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworCitzdHJ1Y3QgSW5zdHJJdGluZXJhcnk7CitjbGFzcyBNQ1N1YnRhcmdldEluZm87CisKKy8vLyBEZWZpbmUgYSBraW5kIG9mIHByb2Nlc3NvciByZXNvdXJjZSB0aGF0IHdpbGwgYmUgbW9kZWxlZCBieSB0aGUgc2NoZWR1bGVyLgorc3RydWN0IE1DUHJvY1Jlc291cmNlRGVzYyB7CisgIGNvbnN0IGNoYXIgKk5hbWU7CisgIHVuc2lnbmVkIE51bVVuaXRzOyAvLyBOdW1iZXIgb2YgcmVzb3VyY2Ugb2YgdGhpcyBraW5kCisgIHVuc2lnbmVkIFN1cGVySWR4OyAvLyBJbmRleCBvZiB0aGUgcmVzb3VyY2VzIGtpbmQgdGhhdCBjb250YWlucyB0aGlzIGtpbmQuCisKKyAgLy8gTnVtYmVyIG9mIHJlc291cmNlcyB0aGF0IG1heSBiZSBidWZmZXJlZC4KKyAgLy8KKyAgLy8gQnVmZmVyZWQgcmVzb3VyY2VzIChCdWZmZXJTaXplICE9IDApIG1heSBiZSBjb25zdW1lZCBhdCBzb21lIGluZGV0ZXJtaW5hdGUKKyAgLy8gY3ljbGUgYWZ0ZXIgZGlzcGF0Y2guIFRoaXMgc2hvdWxkIGJlIHVzZWQgZm9yIG91dC1vZi1vcmRlciBjcHVzIHdoZW4KKyAgLy8gaW5zdHJ1Y3Rpb25zIHRoYXQgdXNlIHRoaXMgcmVzb3VyY2UgY2FuIGJlIGJ1ZmZlcmVkIGluIGEgcmVzZXJ2YXRvbgorICAvLyBzdGF0aW9uLgorICAvLworICAvLyBVbmJ1ZmZlcmVkIHJlc291cmNlcyAoQnVmZmVyU2l6ZSA9PSAwKSBhbHdheXMgY29uc3VtZSB0aGVpciByZXNvdXJjZSBzb21lCisgIC8vIGZpeGVkIG51bWJlciBvZiBjeWNsZXMgYWZ0ZXIgZGlzcGF0Y2guIElmIGEgcmVzb3VyY2UgaXMgdW5idWZmZXJlZCwgdGhlbgorICAvLyB0aGUgc2NoZWR1bGVyIHdpbGwgYXZvaWQgc2NoZWR1bGluZyBpbnN0cnVjdGlvbnMgd2l0aCBjb25mbGljdGluZyByZXNvdXJjZXMKKyAgLy8gaW4gdGhlIHNhbWUgY3ljbGUuIFRoaXMgaXMgZm9yIGluLW9yZGVyIGNwdXMsIG9yIHRoZSBpbi1vcmRlciBwb3J0aW9uIG9mCisgIC8vIGFuIG91dC1vZi1vcmRlciBjcHVzLgorICBpbnQgQnVmZmVyU2l6ZTsKKworICAvLyBJZiB0aGUgcmVzb3VyY2UgaGFzIHN1Yi11bml0cywgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBlbGVtZW50IG9mIGFuIGFycmF5CisgIC8vIG9mIGBOdW1Vbml0c2AgZWxlbWVudHMgY29udGFpbmluZyB0aGUgUHJvY1Jlc291cmNlSWR4IG9mIHRoZSBzdWIgdW5pdHMuCisgIC8vIG51bGxwdHIgaWYgdGhlIHJlc291cmNlIGRvZXMgbm90IGhhdmUgc3ViLXVuaXRzLgorICBjb25zdCB1bnNpZ25lZCAqU3ViVW5pdHNJZHhCZWdpbjsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTUNQcm9jUmVzb3VyY2VEZXNjICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBOdW1Vbml0cyA9PSBPdGhlci5OdW1Vbml0cyAmJiBTdXBlcklkeCA9PSBPdGhlci5TdXBlcklkeAorICAgICAgJiYgQnVmZmVyU2l6ZSA9PSBPdGhlci5CdWZmZXJTaXplOworICB9Cit9OworCisvLy8gSWRlbnRpZnkgb25lIG9mIHRoZSBwcm9jZXNzb3IgcmVzb3VyY2Uga2luZHMgY29uc3VtZWQgYnkgYSBwYXJ0aWN1bGFyCisvLy8gc2NoZWR1bGluZyBjbGFzcyBmb3IgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgY3ljbGVzLgorc3RydWN0IE1DV3JpdGVQcm9jUmVzRW50cnkgeworICB1aW50MTZfdCBQcm9jUmVzb3VyY2VJZHg7CisgIHVpbnQxNl90IEN5Y2xlczsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTUNXcml0ZVByb2NSZXNFbnRyeSAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJvY1Jlc291cmNlSWR4ID09IE90aGVyLlByb2NSZXNvdXJjZUlkeCAmJiBDeWNsZXMgPT0gT3RoZXIuQ3ljbGVzOworICB9Cit9OworCisvLy8gU3BlY2lmeSB0aGUgbGF0ZW5jeSBpbiBjcHUgY3ljbGVzIGZvciBhIHBhcnRpY3VsYXIgc2NoZWR1bGluZyBjbGFzcyBhbmQgZGVmCisvLy8gaW5kZXguIC0xIGluZGljYXRlcyBhbiBpbnZhbGlkIGxhdGVuY3kuIEhldXJpc3RpY3Mgd291bGQgdHlwaWNhbGx5IGNvbnNpZGVyCisvLy8gYW4gaW5zdHJ1Y3Rpb24gd2l0aCBpbnZhbGlkIGxhdGVuY3kgdG8gaGF2ZSBpbmZpbml0ZSBsYXRlbmN5LiAgQWxzbyBpZGVudGlmeQorLy8vIHRoZSBXcml0ZVJlc291cmNlcyBvZiB0aGlzIGRlZi4gV2hlbiB0aGUgb3BlcmFuZCBleHBhbmRzIHRvIGEgc2VxdWVuY2Ugb2YKKy8vLyB3cml0ZXMsIHRoaXMgSUQgaXMgdGhlIGxhc3Qgd3JpdGUgaW4gdGhlIHNlcXVlbmNlLgorc3RydWN0IE1DV3JpdGVMYXRlbmN5RW50cnkgeworICBpbnQxNl90IEN5Y2xlczsKKyAgdWludDE2X3QgV3JpdGVSZXNvdXJjZUlEOworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNQ1dyaXRlTGF0ZW5jeUVudHJ5ICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBDeWNsZXMgPT0gT3RoZXIuQ3ljbGVzICYmIFdyaXRlUmVzb3VyY2VJRCA9PSBPdGhlci5Xcml0ZVJlc291cmNlSUQ7CisgIH0KK307CisKKy8vLyBTcGVjaWZ5IHRoZSBudW1iZXIgb2YgY3ljbGVzIGFsbG93ZWQgYWZ0ZXIgaW5zdHJ1Y3Rpb24gaXNzdWUgYmVmb3JlIGEKKy8vLyBwYXJ0aWN1bGFyIHVzZSBvcGVyYW5kIHJlYWRzIGl0cyByZWdpc3RlcnMuIFRoaXMgZWZmZWN0aXZlbHkgcmVkdWNlcyB0aGUKKy8vLyB3cml0ZSdzIGxhdGVuY3kuIEhlcmUgd2UgYWxsb3cgbmVnYXRpdmUgY3ljbGVzIGZvciBjb3JuZXIgY2FzZXMgd2hlcmUKKy8vLyBsYXRlbmN5IGluY3JlYXNlcy4gVGhpcyBydWxlIG9ubHkgYXBwbGllcyB3aGVuIHRoZSBlbnRyeSdzIFdyaXRlUmVzb3VyY2UKKy8vLyBtYXRjaGVzIHRoZSB3cml0ZSdzIFdyaXRlUmVzb3VyY2UuCisvLy8KKy8vLyBNQ1JlYWRBZHZhbmNlRW50cmllcyBhcmUgc29ydGVkIGZpcnN0IGJ5IG9wZXJhbmQgaW5kZXggKFVzZUlkeCksIHRoZW4gYnkKKy8vLyBXcml0ZVJlc291cmNlSWR4Lgorc3RydWN0IE1DUmVhZEFkdmFuY2VFbnRyeSB7CisgIHVuc2lnbmVkIFVzZUlkeDsKKyAgdW5zaWduZWQgV3JpdGVSZXNvdXJjZUlEOworICBpbnQgQ3ljbGVzOworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNQ1JlYWRBZHZhbmNlRW50cnkgJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIFVzZUlkeCA9PSBPdGhlci5Vc2VJZHggJiYgV3JpdGVSZXNvdXJjZUlEID09IE90aGVyLldyaXRlUmVzb3VyY2VJRAorICAgICAgJiYgQ3ljbGVzID09IE90aGVyLkN5Y2xlczsKKyAgfQorfTsKKworLy8vIFN1bW1hcml6ZSB0aGUgc2NoZWR1bGluZyByZXNvdXJjZXMgcmVxdWlyZWQgZm9yIGFuIGluc3RydWN0aW9uIG9mIGEKKy8vLyBwYXJ0aWN1bGFyIHNjaGVkdWxpbmcgY2xhc3MuCisvLy8KKy8vLyBEZWZpbmVkIGFzIGFuIGFnZ3JlZ2F0ZSBzdHJ1Y3QgZm9yIGNyZWF0aW5nIHRhYmxlcyB3aXRoIGluaXRpYWxpemVyIGxpc3RzLgorc3RydWN0IE1DU2NoZWRDbGFzc0Rlc2MgeworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgc2hvcnQgSW52YWxpZE51bU1pY3JvT3BzID0gKDFVIDw8IDE0KSAtIDE7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBzaG9ydCBWYXJpYW50TnVtTWljcm9PcHMgPSBJbnZhbGlkTnVtTWljcm9PcHMgLSAxOworCisjaWYgIWRlZmluZWQoTkRFQlVHKSB8fCBkZWZpbmVkKExMVk1fRU5BQkxFX0RVTVApCisgIGNvbnN0IGNoYXIqIE5hbWU7CisjZW5kaWYKKyAgdWludDE2X3QgTnVtTWljcm9PcHMgOiAxNDsKKyAgYm9vbCAgICAgQmVnaW5Hcm91cCA6IDE7CisgIGJvb2wgICAgIEVuZEdyb3VwIDogMTsKKyAgdWludDE2X3QgV3JpdGVQcm9jUmVzSWR4OyAvLyBGaXJzdCBpbmRleCBpbnRvIFdyaXRlUHJvY1Jlc1RhYmxlLgorICB1aW50MTZfdCBOdW1Xcml0ZVByb2NSZXNFbnRyaWVzOworICB1aW50MTZfdCBXcml0ZUxhdGVuY3lJZHg7IC8vIEZpcnN0IGluZGV4IGludG8gV3JpdGVMYXRlbmN5VGFibGUuCisgIHVpbnQxNl90IE51bVdyaXRlTGF0ZW5jeUVudHJpZXM7CisgIHVpbnQxNl90IFJlYWRBZHZhbmNlSWR4OyAvLyBGaXJzdCBpbmRleCBpbnRvIFJlYWRBZHZhbmNlVGFibGUuCisgIHVpbnQxNl90IE51bVJlYWRBZHZhbmNlRW50cmllczsKKworICBib29sIGlzVmFsaWQoKSBjb25zdCB7CisgICAgcmV0dXJuIE51bU1pY3JvT3BzICE9IEludmFsaWROdW1NaWNyb09wczsKKyAgfQorICBib29sIGlzVmFyaWFudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gTnVtTWljcm9PcHMgPT0gVmFyaWFudE51bU1pY3JvT3BzOworICB9Cit9OworCisvLy8gTWFjaGluZSBtb2RlbCBmb3Igc2NoZWR1bGluZywgYnVuZGxpbmcsIGFuZCBoZXVyaXN0aWNzLgorLy8vCisvLy8gVGhlIG1hY2hpbmUgbW9kZWwgZGlyZWN0bHkgcHJvdmlkZXMgYmFzaWMgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisvLy8gbWljcm9hcmNoaXRlY3R1cmUgdG8gdGhlIHNjaGVkdWxlciBpbiB0aGUgZm9ybSBvZiBwcm9wZXJ0aWVzLiBJdCBhbHNvCisvLy8gb3B0aW9uYWxseSByZWZlcnMgdG8gc2NoZWR1bGVyIHJlc291cmNlIHRhYmxlcyBhbmQgaXRpbmVyYXJ5CisvLy8gdGFibGVzLiBTY2hlZHVsZXIgcmVzb3VyY2UgdGFibGVzIG1vZGVsIHRoZSBsYXRlbmN5IGFuZCBjb3N0IGZvciBlYWNoCisvLy8gaW5zdHJ1Y3Rpb24gdHlwZS4gSXRpbmVyYXJ5IHRhYmxlcyBhcmUgYW4gaW5kZXBlbmRlbnQgbWVjaGFuaXNtIHRoYXQKKy8vLyBwcm92aWRlcyBhIGRldGFpbGVkIHJlc2VydmF0aW9uIHRhYmxlIGRlc2NyaWJpbmcgZWFjaCBjeWNsZSBvZiBpbnN0cnVjdGlvbgorLy8vIGV4ZWN1dGlvbi4gU3VidGFyZ2V0cyBtYXkgZGVmaW5lIGFueSBvciBhbGwgb2YgdGhlIGFib3ZlIGNhdGVnb3JpZXMgb2YgZGF0YQorLy8vIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBDUFUgYW5kIHNlbGVjdGVkIHNjaGVkdWxlci4KK3N0cnVjdCBNQ1NjaGVkTW9kZWwgeworICAvLyBJc3N1ZVdpZHRoIGlzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBpbnN0cnVjdGlvbnMgdGhhdCBtYXkgYmUgc2NoZWR1bGVkIGluCisgIC8vIHRoZSBzYW1lIHBlci1jeWNsZSBncm91cC4KKyAgdW5zaWduZWQgSXNzdWVXaWR0aDsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIERlZmF1bHRJc3N1ZVdpZHRoID0gMTsKKworICAvLyBNaWNyb09wQnVmZmVyU2l6ZSBpcyB0aGUgbnVtYmVyIG9mIG1pY3JvLW9wcyB0aGF0IHRoZSBwcm9jZXNzb3IgbWF5IGJ1ZmZlcgorICAvLyBmb3Igb3V0LW9mLW9yZGVyIGV4ZWN1dGlvbi4KKyAgLy8KKyAgLy8gIjAiIG1lYW5zIG9wZXJhdGlvbnMgdGhhdCBhcmUgbm90IHJlYWR5IGluIHRoaXMgY3ljbGUgYXJlIG5vdCBjb25zaWRlcmVkCisgIC8vIGZvciBzY2hlZHVsaW5nICh0aGV5IGdvIGluIHRoZSBwZW5kaW5nIHF1ZXVlKS4gTGF0ZW5jeSBpcyBwYXJhbW91bnQuIFRoaXMKKyAgLy8gbWF5IGJlIG1vcmUgZWZmaWNpZW50IGlmIG1hbnkgaW5zdHJ1Y3Rpb25zIGFyZSBwZW5kaW5nIGluIGEgc2NoZWR1bGUuCisgIC8vCisgIC8vICIxIiBtZWFucyBhbGwgaW5zdHJ1Y3Rpb25zIGFyZSBjb25zaWRlcmVkIGZvciBzY2hlZHVsaW5nIHJlZ2FyZGxlc3Mgb2YKKyAgLy8gd2hldGhlciB0aGV5IGFyZSByZWFkeSBpbiB0aGlzIGN5Y2xlLiBMYXRlbmN5IHN0aWxsIGNhdXNlcyBpc3N1ZSBzdGFsbHMsCisgIC8vIGJ1dCB3ZSBiYWxhbmNlIHRob3NlIHN0YWxscyBhZ2FpbnN0IG90aGVyIGhldXJpc3RpY3MuCisgIC8vCisgIC8vICI+IDEiIG1lYW5zIHRoZSBwcm9jZXNzb3IgaXMgb3V0LW9mLW9yZGVyLiBUaGlzIGlzIGEgbWFjaGluZSBpbmRlcGVuZGVudAorICAvLyBlc3RpbWF0ZSBvZiBoaWdobHkgbWFjaGluZSBzcGVjaWZpYyBjaGFyYWN0ZXJpc3RpY3Mgc3VjaCBhcyB0aGUgcmVnaXN0ZXIKKyAgLy8gcmVuYW1pbmcgcG9vbCBhbmQgcmVvcmRlciBidWZmZXIuCisgIHVuc2lnbmVkIE1pY3JvT3BCdWZmZXJTaXplOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgRGVmYXVsdE1pY3JvT3BCdWZmZXJTaXplID0gMDsKKworICAvLyBMb29wTWljcm9PcEJ1ZmZlclNpemUgaXMgdGhlIG51bWJlciBvZiBtaWNyby1vcHMgdGhhdCB0aGUgcHJvY2Vzc29yIG1heQorICAvLyBidWZmZXIgZm9yIG9wdGltaXplZCBsb29wIGV4ZWN1dGlvbi4gTW9yZSBnZW5lcmFsbHksIHRoaXMgcmVwcmVzZW50cyB0aGUKKyAgLy8gb3B0aW1hbCBudW1iZXIgb2YgbWljcm8tb3BzIGluIGEgbG9vcCBib2R5LiBBIGxvb3AgbWF5IGJlIHBhcnRpYWxseQorICAvLyB1bnJvbGxlZCB0byBicmluZyB0aGUgY291bnQgb2YgbWljcm8tb3BzIGluIHRoZSBsb29wIGJvZHkgY2xvc2VyIHRvIHRoaXMKKyAgLy8gbnVtYmVyLgorICB1bnNpZ25lZCBMb29wTWljcm9PcEJ1ZmZlclNpemU7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBEZWZhdWx0TG9vcE1pY3JvT3BCdWZmZXJTaXplID0gMDsKKworICAvLyBMb2FkTGF0ZW5jeSBpcyB0aGUgZXhwZWN0ZWQgbGF0ZW5jeSBvZiBsb2FkIGluc3RydWN0aW9ucy4KKyAgdW5zaWduZWQgTG9hZExhdGVuY3k7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBEZWZhdWx0TG9hZExhdGVuY3kgPSA0OworCisgIC8vIEhpZ2hMYXRlbmN5IGlzIHRoZSBleHBlY3RlZCBsYXRlbmN5IG9mICJ2ZXJ5IGhpZ2ggbGF0ZW5jeSIgb3BlcmF0aW9ucy4KKyAgLy8gU2VlIFRhcmdldEluc3RySW5mbzo6aXNIaWdoTGF0ZW5jeURlZigpLgorICAvLyBCeSBkZWZhdWx0LCB0aGlzIGlzIHNldCB0byBhbiBhcmJpdHJhcmlseSBoaWdoIG51bWJlciBvZiBjeWNsZXMKKyAgLy8gbGlrZWx5IHRvIGhhdmUgc29tZSBpbXBhY3Qgb24gc2NoZWR1bGluZyBoZXVyaXN0aWNzLgorICB1bnNpZ25lZCBIaWdoTGF0ZW5jeTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIERlZmF1bHRIaWdoTGF0ZW5jeSA9IDEwOworCisgIC8vIE1pc3ByZWRpY3RQZW5hbHR5IGlzIHRoZSB0eXBpY2FsIG51bWJlciBvZiBleHRyYSBjeWNsZXMgdGhlIHByb2Nlc3NvcgorICAvLyB0YWtlcyB0byByZWNvdmVyIGZyb20gYSBicmFuY2ggbWlzcHJlZGljdGlvbi4KKyAgdW5zaWduZWQgTWlzcHJlZGljdFBlbmFsdHk7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBEZWZhdWx0TWlzcHJlZGljdFBlbmFsdHkgPSAxMDsKKworICBib29sIFBvc3RSQVNjaGVkdWxlcjsgLy8gZGVmYXVsdCB2YWx1ZSBpcyBmYWxzZQorCisgIGJvb2wgQ29tcGxldGVNb2RlbDsKKworICB1bnNpZ25lZCBQcm9jSUQ7CisgIGNvbnN0IE1DUHJvY1Jlc291cmNlRGVzYyAqUHJvY1Jlc291cmNlVGFibGU7CisgIGNvbnN0IE1DU2NoZWRDbGFzc0Rlc2MgKlNjaGVkQ2xhc3NUYWJsZTsKKyAgdW5zaWduZWQgTnVtUHJvY1Jlc291cmNlS2luZHM7CisgIHVuc2lnbmVkIE51bVNjaGVkQ2xhc3NlczsKKyAgLy8gSW5zdHJ1Y3Rpb24gaXRpbmVyYXJ5IHRhYmxlcyB1c2VkIGJ5IEluc3RySXRpbmVyYXJ5RGF0YS4KKyAgZnJpZW5kIGNsYXNzIEluc3RySXRpbmVyYXJ5RGF0YTsKKyAgY29uc3QgSW5zdHJJdGluZXJhcnkgKkluc3RySXRpbmVyYXJpZXM7CisKKyAgdW5zaWduZWQgZ2V0UHJvY2Vzc29ySUQoKSBjb25zdCB7IHJldHVybiBQcm9jSUQ7IH0KKworICAvLy8gRG9lcyB0aGlzIG1hY2hpbmUgbW9kZWwgaW5jbHVkZSBpbnN0cnVjdGlvbi1sZXZlbCBzY2hlZHVsaW5nLgorICBib29sIGhhc0luc3RyU2NoZWRNb2RlbCgpIGNvbnN0IHsgcmV0dXJuIFNjaGVkQ2xhc3NUYWJsZTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG1hY2hpbmUgbW9kZWwgZGF0YSBmb3IgYWxsIGluc3RydWN0aW9ucyB3aXRoIGEKKyAgLy8vIHNjaGVkdWxpbmcgY2xhc3MgKGl0aW5lcmFyeSBjbGFzcyBvciBTY2hlZFJXIGxpc3QpLgorICBib29sIGlzQ29tcGxldGUoKSBjb25zdCB7IHJldHVybiBDb21wbGV0ZU1vZGVsOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIG1hY2hpbmUgc3VwcG9ydHMgb3V0IG9mIG9yZGVyIGV4ZWN1dGlvbi4KKyAgYm9vbCBpc091dE9mT3JkZXIoKSBjb25zdCB7IHJldHVybiBNaWNyb09wQnVmZmVyU2l6ZSA+IDE7IH0KKworICB1bnNpZ25lZCBnZXROdW1Qcm9jUmVzb3VyY2VLaW5kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gTnVtUHJvY1Jlc291cmNlS2luZHM7CisgIH0KKworICBjb25zdCBNQ1Byb2NSZXNvdXJjZURlc2MgKmdldFByb2NSZXNvdXJjZSh1bnNpZ25lZCBQcm9jUmVzb3VyY2VJZHgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaGFzSW5zdHJTY2hlZE1vZGVsKCkgJiYgIk5vIHNjaGVkdWxpbmcgbWFjaGluZSBtb2RlbCIpOworCisgICAgYXNzZXJ0KFByb2NSZXNvdXJjZUlkeCA8IE51bVByb2NSZXNvdXJjZUtpbmRzICYmICJiYWQgcHJvYyByZXNvdXJjZSBpZHgiKTsKKyAgICByZXR1cm4gJlByb2NSZXNvdXJjZVRhYmxlW1Byb2NSZXNvdXJjZUlkeF07CisgIH0KKworICBjb25zdCBNQ1NjaGVkQ2xhc3NEZXNjICpnZXRTY2hlZENsYXNzRGVzYyh1bnNpZ25lZCBTY2hlZENsYXNzSWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KGhhc0luc3RyU2NoZWRNb2RlbCgpICYmICJObyBzY2hlZHVsaW5nIG1hY2hpbmUgbW9kZWwiKTsKKworICAgIGFzc2VydChTY2hlZENsYXNzSWR4IDwgTnVtU2NoZWRDbGFzc2VzICYmICJiYWQgc2NoZWR1bGluZyBjbGFzcyBpZHgiKTsKKyAgICByZXR1cm4gJlNjaGVkQ2xhc3NUYWJsZVtTY2hlZENsYXNzSWR4XTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBsYXRlbmN5IHZhbHVlIGZvciB0aGUgc2NoZWR1bGluZyBjbGFzcy4KKyAgc3RhdGljIGludCBjb21wdXRlSW5zdHJMYXRlbmN5KGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU1RJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTY2hlZENsYXNzRGVzYyAmU0NEZXNjKTsKKworICAvLy8gUmV0dXJucyB0aGUgcmVjaXByb2NhbCB0aHJvdWdocHV0IGluZm9ybWF0aW9uIGZyb20gYSBNQ1NjaGVkQ2xhc3NEZXNjLgorICBzdGF0aWMgT3B0aW9uYWw8ZG91YmxlPgorICBnZXRSZWNpcHJvY2FsVGhyb3VnaHB1dChjb25zdCBNQ1N1YnRhcmdldEluZm8gJlNUSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTY2hlZENsYXNzRGVzYyAmU0NEZXNjKTsKKworICAvLy8gUmV0dXJucyB0aGUgZGVmYXVsdCBpbml0aWFsaXplZCBtb2RlbC4KKyAgc3RhdGljIGNvbnN0IE1DU2NoZWRNb2RlbCAmR2V0RGVmYXVsdFNjaGVkTW9kZWwoKSB7IHJldHVybiBEZWZhdWx0OyB9CisgIHN0YXRpYyBjb25zdCBNQ1NjaGVkTW9kZWwgRGVmYXVsdDsKK307CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1NlY3Rpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTZWN0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc3MWIxZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTZWN0aW9uLmgKQEAgLTAsMCArMSwxODcgQEAKKy8vPT09LSBNQ1NlY3Rpb24uaCAtIE1hY2hpbmUgQ29kZSBTZWN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBNQ1NlY3Rpb24gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DU0VDVElPTl9ICisjZGVmaW5lIExMVk1fTUNfTUNTRUNUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3QuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRnJhZ21lbnQuaCIKKyNpbmNsdWRlICJsbHZtL01DL1NlY3Rpb25LaW5kLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DQXNtSW5mbzsKK2NsYXNzIE1DQ29udGV4dDsKK2NsYXNzIE1DRXhwcjsKK2NsYXNzIE1DU3ltYm9sOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBUcmlwbGU7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpbGlzdF9hbGxvY190cmFpdHM8TUNGcmFnbWVudD4geworICBzdGF0aWMgdm9pZCBkZWxldGVOb2RlKE1DRnJhZ21lbnQgKlYpOworfTsKKworLy8vIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHJlcHJlc2VudCBhIHVuaXF1ZWQgaWRlbnRpZmllciBmb3IgYSBzZWN0aW9uIGluIHRoZQorLy8vIGN1cnJlbnQgdHJhbnNsYXRpb24gdW5pdC4gIFRoZSBNQ0NvbnRleHQgY2xhc3MgdW5pcXVlcyBhbmQgY3JlYXRlcyB0aGVzZS4KK2NsYXNzIE1DU2VjdGlvbiB7CitwdWJsaWM6CisgIGVudW0gU2VjdGlvblZhcmlhbnQgeyBTVl9DT0ZGID0gMCwgU1ZfRUxGLCBTVl9NYWNoTywgU1ZfV2FzbSB9OworCisgIC8vLyBcYnJpZWYgRXhwcmVzcyB0aGUgc3RhdGUgb2YgYnVuZGxlIGxvY2tlZCBncm91cHMgd2hpbGUgZW1pdHRpbmcgY29kZS4KKyAgZW51bSBCdW5kbGVMb2NrU3RhdGVUeXBlIHsKKyAgICBOb3RCdW5kbGVMb2NrZWQsCisgICAgQnVuZGxlTG9ja2VkLAorICAgIEJ1bmRsZUxvY2tlZEFsaWduVG9FbmQKKyAgfTsKKworICB1c2luZyBGcmFnbWVudExpc3RUeXBlID0gaXBsaXN0PE1DRnJhZ21lbnQ+OworCisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gRnJhZ21lbnRMaXN0VHlwZTo6Y29uc3RfaXRlcmF0b3I7CisgIHVzaW5nIGl0ZXJhdG9yID0gRnJhZ21lbnRMaXN0VHlwZTo6aXRlcmF0b3I7CisKKyAgdXNpbmcgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciA9IEZyYWdtZW50TGlzdFR5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgIHVzaW5nIHJldmVyc2VfaXRlcmF0b3IgPSBGcmFnbWVudExpc3RUeXBlOjpyZXZlcnNlX2l0ZXJhdG9yOworCitwcml2YXRlOgorICBNQ1N5bWJvbCAqQmVnaW47CisgIE1DU3ltYm9sICpFbmQgPSBudWxscHRyOworICAvLy8gVGhlIGFsaWdubWVudCByZXF1aXJlbWVudCBvZiB0aGlzIHNlY3Rpb24uCisgIHVuc2lnbmVkIEFsaWdubWVudCA9IDE7CisgIC8vLyBUaGUgc2VjdGlvbiBpbmRleCBpbiB0aGUgYXNzZW1ibGVycyBzZWN0aW9uIGxpc3QuCisgIHVuc2lnbmVkIE9yZGluYWwgPSAwOworICAvLy8gVGhlIGluZGV4IG9mIHRoaXMgc2VjdGlvbiBpbiB0aGUgbGF5b3V0IG9yZGVyLgorICB1bnNpZ25lZCBMYXlvdXRPcmRlcjsKKworICAvLy8gXGJyaWVmIEtlZXBpbmcgdHJhY2sgb2YgYnVuZGxlLWxvY2tlZCBzdGF0ZS4KKyAgQnVuZGxlTG9ja1N0YXRlVHlwZSBCdW5kbGVMb2NrU3RhdGUgPSBOb3RCdW5kbGVMb2NrZWQ7CisKKyAgLy8vIFxicmllZiBDdXJyZW50IG5lc3RpbmcgZGVwdGggb2YgYnVuZGxlX2xvY2sgZGlyZWN0aXZlcy4KKyAgdW5zaWduZWQgQnVuZGxlTG9ja05lc3RpbmdEZXB0aCA9IDA7CisKKyAgLy8vIFxicmllZiBXZSd2ZSBzZWVuIGEgYnVuZGxlX2xvY2sgZGlyZWN0aXZlIGJ1dCBub3QgaXRzIGZpcnN0IGluc3RydWN0aW9uCisgIC8vLyB5ZXQuCisgIGJvb2wgQnVuZGxlR3JvdXBCZWZvcmVGaXJzdEluc3QgOiAxOworCisgIC8vLyBXaGV0aGVyIHRoaXMgc2VjdGlvbiBoYXMgaGFkIGluc3RydWN0aW9ucyBlbWl0dGVkIGludG8gaXQuCisgIGJvb2wgSGFzSW5zdHJ1Y3Rpb25zIDogMTsKKworICBib29sIElzUmVnaXN0ZXJlZCA6IDE7CisKKyAgTUNEdW1teUZyYWdtZW50IER1bW15RnJhZ21lbnQ7CisKKyAgRnJhZ21lbnRMaXN0VHlwZSBGcmFnbWVudHM7CisKKyAgLy8vIE1hcHBpbmcgZnJvbSBzdWJzZWN0aW9uIG51bWJlciB0byBpbnNlcnRpb24gcG9pbnQgZm9yIHN1YnNlY3Rpb24gbnVtYmVycworICAvLy8gYmVsb3cgdGhhdCBudW1iZXIuCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgTUNGcmFnbWVudCAqPiwgMT4gU3Vic2VjdGlvbkZyYWdtZW50TWFwOworCitwcm90ZWN0ZWQ6CisgIFNlY3Rpb25WYXJpYW50IFZhcmlhbnQ7CisgIFNlY3Rpb25LaW5kIEtpbmQ7CisKKyAgTUNTZWN0aW9uKFNlY3Rpb25WYXJpYW50IFYsIFNlY3Rpb25LaW5kIEssIE1DU3ltYm9sICpCZWdpbik7CisgIH5NQ1NlY3Rpb24oKTsKKworcHVibGljOgorICBNQ1NlY3Rpb24oY29uc3QgTUNTZWN0aW9uICYpID0gZGVsZXRlOworICBNQ1NlY3Rpb24gJm9wZXJhdG9yPShjb25zdCBNQ1NlY3Rpb24gJikgPSBkZWxldGU7CisKKyAgU2VjdGlvbktpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICBTZWN0aW9uVmFyaWFudCBnZXRWYXJpYW50KCkgY29uc3QgeyByZXR1cm4gVmFyaWFudDsgfQorCisgIE1DU3ltYm9sICpnZXRCZWdpblN5bWJvbCgpIHsgcmV0dXJuIEJlZ2luOyB9CisgIGNvbnN0IE1DU3ltYm9sICpnZXRCZWdpblN5bWJvbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxNQ1NlY3Rpb24gKj4odGhpcyktPmdldEJlZ2luU3ltYm9sKCk7CisgIH0KKyAgdm9pZCBzZXRCZWdpblN5bWJvbChNQ1N5bWJvbCAqU3ltKSB7CisgICAgYXNzZXJ0KCFCZWdpbik7CisgICAgQmVnaW4gPSBTeW07CisgIH0KKyAgTUNTeW1ib2wgKmdldEVuZFN5bWJvbChNQ0NvbnRleHQgJkN0eCk7CisgIGJvb2wgaGFzRW5kZWQoKSBjb25zdDsKKworICB1bnNpZ25lZCBnZXRBbGlnbm1lbnQoKSBjb25zdCB7IHJldHVybiBBbGlnbm1lbnQ7IH0KKyAgdm9pZCBzZXRBbGlnbm1lbnQodW5zaWduZWQgVmFsdWUpIHsgQWxpZ25tZW50ID0gVmFsdWU7IH0KKworICB1bnNpZ25lZCBnZXRPcmRpbmFsKCkgY29uc3QgeyByZXR1cm4gT3JkaW5hbDsgfQorICB2b2lkIHNldE9yZGluYWwodW5zaWduZWQgVmFsdWUpIHsgT3JkaW5hbCA9IFZhbHVlOyB9CisKKyAgdW5zaWduZWQgZ2V0TGF5b3V0T3JkZXIoKSBjb25zdCB7IHJldHVybiBMYXlvdXRPcmRlcjsgfQorICB2b2lkIHNldExheW91dE9yZGVyKHVuc2lnbmVkIFZhbHVlKSB7IExheW91dE9yZGVyID0gVmFsdWU7IH0KKworICBCdW5kbGVMb2NrU3RhdGVUeXBlIGdldEJ1bmRsZUxvY2tTdGF0ZSgpIGNvbnN0IHsgcmV0dXJuIEJ1bmRsZUxvY2tTdGF0ZTsgfQorICB2b2lkIHNldEJ1bmRsZUxvY2tTdGF0ZShCdW5kbGVMb2NrU3RhdGVUeXBlIE5ld1N0YXRlKTsKKyAgYm9vbCBpc0J1bmRsZUxvY2tlZCgpIGNvbnN0IHsgcmV0dXJuIEJ1bmRsZUxvY2tTdGF0ZSAhPSBOb3RCdW5kbGVMb2NrZWQ7IH0KKworICBib29sIGlzQnVuZGxlR3JvdXBCZWZvcmVGaXJzdEluc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIEJ1bmRsZUdyb3VwQmVmb3JlRmlyc3RJbnN0OworICB9CisgIHZvaWQgc2V0QnVuZGxlR3JvdXBCZWZvcmVGaXJzdEluc3QoYm9vbCBJc0ZpcnN0KSB7CisgICAgQnVuZGxlR3JvdXBCZWZvcmVGaXJzdEluc3QgPSBJc0ZpcnN0OworICB9CisKKyAgYm9vbCBoYXNJbnN0cnVjdGlvbnMoKSBjb25zdCB7IHJldHVybiBIYXNJbnN0cnVjdGlvbnM7IH0KKyAgdm9pZCBzZXRIYXNJbnN0cnVjdGlvbnMoYm9vbCBWYWx1ZSkgeyBIYXNJbnN0cnVjdGlvbnMgPSBWYWx1ZTsgfQorCisgIGJvb2wgaXNSZWdpc3RlcmVkKCkgY29uc3QgeyByZXR1cm4gSXNSZWdpc3RlcmVkOyB9CisgIHZvaWQgc2V0SXNSZWdpc3RlcmVkKGJvb2wgVmFsdWUpIHsgSXNSZWdpc3RlcmVkID0gVmFsdWU7IH0KKworICBNQ1NlY3Rpb246OkZyYWdtZW50TGlzdFR5cGUgJmdldEZyYWdtZW50TGlzdCgpIHsgcmV0dXJuIEZyYWdtZW50czsgfQorICBjb25zdCBNQ1NlY3Rpb246OkZyYWdtZW50TGlzdFR5cGUgJmdldEZyYWdtZW50TGlzdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxNQ1NlY3Rpb24gKj4odGhpcyktPmdldEZyYWdtZW50TGlzdCgpOworICB9CisKKyAgLy8vIFN1cHBvcnQgZm9yIE1DRnJhZ21lbnQ6OmdldE5leHROb2RlKCkuCisgIHN0YXRpYyBGcmFnbWVudExpc3RUeXBlIE1DU2VjdGlvbjo6KmdldFN1Ymxpc3RBY2Nlc3MoTUNGcmFnbWVudCAqKSB7CisgICAgcmV0dXJuICZNQ1NlY3Rpb246OkZyYWdtZW50czsKKyAgfQorCisgIGNvbnN0IE1DRHVtbXlGcmFnbWVudCAmZ2V0RHVtbXlGcmFnbWVudCgpIGNvbnN0IHsgcmV0dXJuIER1bW15RnJhZ21lbnQ7IH0KKyAgTUNEdW1teUZyYWdtZW50ICZnZXREdW1teUZyYWdtZW50KCkgeyByZXR1cm4gRHVtbXlGcmFnbWVudDsgfQorCisgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gRnJhZ21lbnRzLmJlZ2luKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBGcmFnbWVudHMuYmVnaW4oKTsgfQorCisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIEZyYWdtZW50cy5lbmQoKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBGcmFnbWVudHMuZW5kKCk7IH0KKworICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIEZyYWdtZW50cy5yYmVnaW4oKTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEZyYWdtZW50cy5yYmVnaW4oKTsgfQorCisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsgcmV0dXJuIEZyYWdtZW50cy5yZW5kKCk7IH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgIHsgcmV0dXJuIEZyYWdtZW50cy5yZW5kKCk7IH0KKworICBNQ1NlY3Rpb246Oml0ZXJhdG9yIGdldFN1YnNlY3Rpb25JbnNlcnRpb25Qb2ludCh1bnNpZ25lZCBTdWJzZWN0aW9uKTsKKworICB2b2lkIGR1bXAoKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQgUHJpbnRTd2l0Y2hUb1NlY3Rpb24oY29uc3QgTUNBc21JbmZvICZNQUksIGNvbnN0IFRyaXBsZSAmVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRXhwciAqU3Vic2VjdGlvbikgY29uc3QgPSAwOworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhIC5hbGlnbiBkaXJlY3RpdmUgc2hvdWxkIHVzZSAib3B0aW1pemVkIG5vcHMiIHRvIGZpbGwKKyAgLy8vIGluc3RlYWQgb2YgMHMuCisgIHZpcnR1YWwgYm9vbCBVc2VDb2RlQWxpZ24oKSBjb25zdCA9IDA7CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgdGhpcyBzZWN0aW9uIGlzICJ2aXJ0dWFsIiwgdGhhdCBpcyBoYXMgbm8gYWN0dWFsIG9iamVjdAorICAvLy8gZmlsZSBjb250ZW50cy4KKyAgdmlydHVhbCBib29sIGlzVmlydHVhbFNlY3Rpb24oKSBjb25zdCA9IDA7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ1NFQ1RJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1NlY3Rpb25DT0ZGLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DU2VjdGlvbkNPRkYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNGI5Zjg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1NlY3Rpb25DT0ZGLmgKQEAgLTAsMCArMSwxMDAgQEAKKy8vPT09LSBNQ1NlY3Rpb25DT0ZGLmggLSBDT0ZGIE1hY2hpbmUgQ29kZSBTZWN0aW9ucyAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBNQ1NlY3Rpb25DT0ZGIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1NFQ1RJT05DT0ZGX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1NFQ1RJT05DT0ZGX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTZWN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9NQy9TZWN0aW9uS2luZC5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNTeW1ib2w7CisKKy8vLyBUaGlzIHJlcHJlc2VudHMgYSBzZWN0aW9uIG9uIFdpbmRvd3MKK2NsYXNzIE1DU2VjdGlvbkNPRkYgZmluYWwgOiBwdWJsaWMgTUNTZWN0aW9uIHsKKyAgLy8gVGhlIG1lbW9yeSBmb3IgdGhpcyBzdHJpbmcgaXMgc3RvcmVkIGluIHRoZSBzYW1lIE1DQ29udGV4dCBhcyAqdGhpcy4KKyAgU3RyaW5nUmVmIFNlY3Rpb25OYW1lOworCisgIC8vIEZJWE1FOiBUaGUgZm9sbG93aW5nIGZpZWxkcyBzaG91bGQgbm90IGJlIG11dGFibGUsIGJ1dCBhcmUgZm9yIG5vdyBzbyB0aGUKKyAgLy8gYXNtIHBhcnNlciBjYW4gaG9ub3IgdGhlIC5saW5rb25jZSBkaXJlY3RpdmUuCisKKyAgLy8vIFRoaXMgaXMgdGhlIENoYXJhY3RlcmlzdGljcyBmaWVsZCBvZiBhIHNlY3Rpb24sIGRyYXduIGZyb20gdGhlIGVudW1zCisgIC8vLyBiZWxvdy4KKyAgbXV0YWJsZSB1bnNpZ25lZCBDaGFyYWN0ZXJpc3RpY3M7CisKKyAgLy8vIFRoZSB1bmlxdWUgSURzIHVzZWQgd2l0aCB0aGUgLnBkYXRhIGFuZCAueGRhdGEgc2VjdGlvbnMgY3JlYXRlZCBpbnRlcm5hbGx5CisgIC8vLyBieSB0aGUgYXNzZW1ibGVyLiBUaGlzIElEIGlzIHVzZWQgdG8gZW5zdXJlIHRoYXQgZm9yIGV2ZXJ5IC50ZXh0IHNlY3Rpb24sCisgIC8vLyB0aGVyZSBpcyBleGFjdGx5IG9uZSAucGRhdGEgYW5kIG9uZSAueGRhdGEgc2VjdGlvbiwgd2hpY2ggaXMgcmVxdWlyZWQgYnkKKyAgLy8vIHRoZSBNaWNyb3NvZnQgaW5jcmVtZW50YWwgbGlua2VyLiBUaGlzIGRhdGEgaXMgbXV0YWJsZSBiZWNhdXNlIHRoaXMgSUQgaXMKKyAgLy8vIG5vdCBub3Rpb25hbGx5IHBhcnQgb2YgdGhlIHNlY3Rpb24uCisgIG11dGFibGUgdW5zaWduZWQgV2luQ0ZJU2VjdGlvbklEID0gfjBVOworCisgIC8vLyBUaGUgQ09NREFUIHN5bWJvbCBvZiB0aGlzIHNlY3Rpb24uIE9ubHkgdmFsaWQgaWYgdGhpcyBpcyBhIENPTURBVCBzZWN0aW9uLgorICAvLy8gVHdvIENPTURBVCBzZWN0aW9ucyBhcmUgbWVyZ2VkIGlmIHRoZXkgaGF2ZSB0aGUgc2FtZSBDT01EQVQgc3ltYm9sLgorICBNQ1N5bWJvbCAqQ09NREFUU3ltYm9sOworCisgIC8vLyBUaGlzIGlzIHRoZSBTZWxlY3Rpb24gZmllbGQgZm9yIHRoZSBzZWN0aW9uIHN5bWJvbCwgaWYgaXQgaXMgYSBDT01EQVQKKyAgLy8vIHNlY3Rpb24gKENoYXJhY3RlcmlzdGljcyAmIElNQUdFX1NDTl9MTktfQ09NREFUKSAhPSAwCisgIG11dGFibGUgaW50IFNlbGVjdGlvbjsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIE1DQ29udGV4dDsKKyAgTUNTZWN0aW9uQ09GRihTdHJpbmdSZWYgU2VjdGlvbiwgdW5zaWduZWQgQ2hhcmFjdGVyaXN0aWNzLAorICAgICAgICAgICAgICAgIE1DU3ltYm9sICpDT01EQVRTeW1ib2wsIGludCBTZWxlY3Rpb24sIFNlY3Rpb25LaW5kIEssCisgICAgICAgICAgICAgICAgTUNTeW1ib2wgKkJlZ2luKQorICAgICAgOiBNQ1NlY3Rpb24oU1ZfQ09GRiwgSywgQmVnaW4pLCBTZWN0aW9uTmFtZShTZWN0aW9uKSwKKyAgICAgICAgQ2hhcmFjdGVyaXN0aWNzKENoYXJhY3RlcmlzdGljcyksIENPTURBVFN5bWJvbChDT01EQVRTeW1ib2wpLAorICAgICAgICBTZWxlY3Rpb24oU2VsZWN0aW9uKSB7CisgICAgYXNzZXJ0KChDaGFyYWN0ZXJpc3RpY3MgJiAweDAwRjAwMDAwKSA9PSAwICYmCisgICAgICAgICAgICJhbGlnbm1lbnQgbXVzdCBub3QgYmUgc2V0IHVwb24gc2VjdGlvbiBjcmVhdGlvbiIpOworICB9CisKK3B1YmxpYzoKKyAgfk1DU2VjdGlvbkNPRkYoKTsKKworICAvLy8gRGVjaWRlcyB3aGV0aGVyIGEgJy5zZWN0aW9uJyBkaXJlY3RpdmUgc2hvdWxkIGJlIHByaW50ZWQgYmVmb3JlIHRoZQorICAvLy8gc2VjdGlvbiBuYW1lCisgIGJvb2wgU2hvdWxkT21pdFNlY3Rpb25EaXJlY3RpdmUoU3RyaW5nUmVmIE5hbWUsIGNvbnN0IE1DQXNtSW5mbyAmTUFJKSBjb25zdDsKKworICBTdHJpbmdSZWYgZ2V0U2VjdGlvbk5hbWUoKSBjb25zdCB7IHJldHVybiBTZWN0aW9uTmFtZTsgfQorICB1bnNpZ25lZCBnZXRDaGFyYWN0ZXJpc3RpY3MoKSBjb25zdCB7IHJldHVybiBDaGFyYWN0ZXJpc3RpY3M7IH0KKyAgTUNTeW1ib2wgKmdldENPTURBVFN5bWJvbCgpIGNvbnN0IHsgcmV0dXJuIENPTURBVFN5bWJvbDsgfQorICBpbnQgZ2V0U2VsZWN0aW9uKCkgY29uc3QgeyByZXR1cm4gU2VsZWN0aW9uOyB9CisKKyAgdm9pZCBzZXRTZWxlY3Rpb24oaW50IFNlbGVjdGlvbikgY29uc3Q7CisKKyAgdm9pZCBQcmludFN3aXRjaFRvU2VjdGlvbihjb25zdCBNQ0FzbUluZm8gJk1BSSwgY29uc3QgVHJpcGxlICZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0V4cHIgKlN1YnNlY3Rpb24pIGNvbnN0IG92ZXJyaWRlOworICBib29sIFVzZUNvZGVBbGlnbigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzVmlydHVhbFNlY3Rpb24oKSBjb25zdCBvdmVycmlkZTsKKworICB1bnNpZ25lZCBnZXRPckFzc2lnbldpbkNGSVNlY3Rpb25JRCh1bnNpZ25lZCAqTmV4dElEKSBjb25zdCB7CisgICAgaWYgKFdpbkNGSVNlY3Rpb25JRCA9PSB+MFUpCisgICAgICBXaW5DRklTZWN0aW9uSUQgPSAoKk5leHRJRCkrKzsKKyAgICByZXR1cm4gV2luQ0ZJU2VjdGlvbklEOworICB9CisKKyAgc3RhdGljIGJvb2wgaXNJbXBsaWNpdGx5RGlzY2FyZGFibGUoU3RyaW5nUmVmIE5hbWUpIHsKKyAgICByZXR1cm4gTmFtZS5zdGFydHN3aXRoKCIuZGVidWciKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNTZWN0aW9uICpTKSB7IHJldHVybiBTLT5nZXRWYXJpYW50KCkgPT0gU1ZfQ09GRjsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNTRUNUSU9OQ09GRl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DU2VjdGlvbkVMRi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1NlY3Rpb25FTEYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGMyODljCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1NlY3Rpb25FTEYuaApAQCAtMCwwICsxLDk5IEBACisvLz09PS0gTUNTZWN0aW9uRUxGLmggLSBFTEYgTWFjaGluZSBDb2RlIFNlY3Rpb25zIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgTUNTZWN0aW9uRUxGIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1NFQ1RJT05FTEZfSAorI2RlZmluZSBMTFZNX01DX01DU0VDVElPTkVMRl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTeW1ib2xFTEYuaCIKKyNpbmNsdWRlICJsbHZtL01DL1NlY3Rpb25LaW5kLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNTeW1ib2w7CisKKy8vLyBUaGlzIHJlcHJlc2VudHMgYSBzZWN0aW9uIG9uIGxpbnV4LCBsb3RzIG9mIHVuaXggdmFyaWFudHMgYW5kIHNvbWUgYmFyZQorLy8vIG1ldGFsIHN5c3RlbXMuCitjbGFzcyBNQ1NlY3Rpb25FTEYgZmluYWwgOiBwdWJsaWMgTUNTZWN0aW9uIHsKKyAgLy8vIFRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIHNlY3Rpb24uICBUaGUgcmVmZXJlbmNlZCBtZW1vcnkgaXMgb3duZWQgYnkKKyAgLy8vIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZUVMRidzIEVMRlVuaXF1ZU1hcC4KKyAgU3RyaW5nUmVmIFNlY3Rpb25OYW1lOworCisgIC8vLyBUaGlzIGlzIHRoZSBzaF90eXBlIGZpZWxkIG9mIGEgc2VjdGlvbiwgZHJhd24gZnJvbSB0aGUgZW51bXMgYmVsb3cuCisgIHVuc2lnbmVkIFR5cGU7CisKKyAgLy8vIFRoaXMgaXMgdGhlIHNoX2ZsYWdzIGZpZWxkIG9mIGEgc2VjdGlvbiwgZHJhd24gZnJvbSB0aGUgZW51bXMgYmVsb3cuCisgIHVuc2lnbmVkIEZsYWdzOworCisgIHVuc2lnbmVkIFVuaXF1ZUlEOworCisgIC8vLyBUaGUgc2l6ZSBvZiBlYWNoIGVudHJ5IGluIHRoaXMgc2VjdGlvbi4gVGhpcyBzaXplIG9ubHkgbWFrZXMgc2Vuc2UgZm9yCisgIC8vLyBzZWN0aW9ucyB0aGF0IGNvbnRhaW4gZml4ZWQtc2l6ZWQgZW50cmllcy4gSWYgYSBzZWN0aW9uIGRvZXMgbm90IGNvbnRhaW4KKyAgLy8vIGZpeGVkLXNpemVkIGVudHJpZXMgJ0VudHJ5U2l6ZScgd2lsbCBiZSAwLgorICB1bnNpZ25lZCBFbnRyeVNpemU7CisKKyAgY29uc3QgTUNTeW1ib2xFTEYgKkdyb3VwOworCisgIC8vLyBzaF9pbmZvIGZvciBTSEZfTElOS19PUkRFUiAoY2FuIGJlIG51bGwpLgorICBjb25zdCBNQ1N5bWJvbCAqQXNzb2NpYXRlZFN5bWJvbDsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIE1DQ29udGV4dDsKKworICBNQ1NlY3Rpb25FTEYoU3RyaW5nUmVmIFNlY3Rpb24sIHVuc2lnbmVkIHR5cGUsIHVuc2lnbmVkIGZsYWdzLCBTZWN0aW9uS2luZCBLLAorICAgICAgICAgICAgICAgdW5zaWduZWQgZW50cnlTaXplLCBjb25zdCBNQ1N5bWJvbEVMRiAqZ3JvdXAsIHVuc2lnbmVkIFVuaXF1ZUlELAorICAgICAgICAgICAgICAgTUNTeW1ib2wgKkJlZ2luLCBjb25zdCBNQ1N5bWJvbEVMRiAqQXNzb2NpYXRlZFN5bWJvbCkKKyAgICAgIDogTUNTZWN0aW9uKFNWX0VMRiwgSywgQmVnaW4pLCBTZWN0aW9uTmFtZShTZWN0aW9uKSwgVHlwZSh0eXBlKSwKKyAgICAgICAgRmxhZ3MoZmxhZ3MpLCBVbmlxdWVJRChVbmlxdWVJRCksIEVudHJ5U2l6ZShlbnRyeVNpemUpLCBHcm91cChncm91cCksCisgICAgICAgIEFzc29jaWF0ZWRTeW1ib2woQXNzb2NpYXRlZFN5bWJvbCkgeworICAgIGlmIChHcm91cCkKKyAgICAgIEdyb3VwLT5zZXRJc1NpZ25hdHVyZSgpOworICB9CisKKyAgdm9pZCBzZXRTZWN0aW9uTmFtZShTdHJpbmdSZWYgTmFtZSkgeyBTZWN0aW9uTmFtZSA9IE5hbWU7IH0KKworcHVibGljOgorICB+TUNTZWN0aW9uRUxGKCk7CisKKyAgLy8vIERlY2lkZXMgd2hldGhlciBhICcuc2VjdGlvbicgZGlyZWN0aXZlIHNob3VsZCBiZSBwcmludGVkIGJlZm9yZSB0aGUKKyAgLy8vIHNlY3Rpb24gbmFtZQorICBib29sIFNob3VsZE9taXRTZWN0aW9uRGlyZWN0aXZlKFN0cmluZ1JlZiBOYW1lLCBjb25zdCBNQ0FzbUluZm8gJk1BSSkgY29uc3Q7CisKKyAgU3RyaW5nUmVmIGdldFNlY3Rpb25OYW1lKCkgY29uc3QgeyByZXR1cm4gU2VjdGlvbk5hbWU7IH0KKyAgdW5zaWduZWQgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5cGU7IH0KKyAgdW5zaWduZWQgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBGbGFnczsgfQorICB1bnNpZ25lZCBnZXRFbnRyeVNpemUoKSBjb25zdCB7IHJldHVybiBFbnRyeVNpemU7IH0KKyAgdm9pZCBzZXRGbGFncyh1bnNpZ25lZCBGKSB7IEZsYWdzID0gRjsgfQorICBjb25zdCBNQ1N5bWJvbEVMRiAqZ2V0R3JvdXAoKSBjb25zdCB7IHJldHVybiBHcm91cDsgfQorCisgIHZvaWQgUHJpbnRTd2l0Y2hUb1NlY3Rpb24oY29uc3QgTUNBc21JbmZvICZNQUksIGNvbnN0IFRyaXBsZSAmVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNFeHByICpTdWJzZWN0aW9uKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBVc2VDb2RlQWxpZ24oKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1ZpcnR1YWxTZWN0aW9uKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBpc1VuaXF1ZSgpIGNvbnN0IHsgcmV0dXJuIFVuaXF1ZUlEICE9IH4wVTsgfQorICB1bnNpZ25lZCBnZXRVbmlxdWVJRCgpIGNvbnN0IHsgcmV0dXJuIFVuaXF1ZUlEOyB9CisKKyAgY29uc3QgTUNTZWN0aW9uICpnZXRBc3NvY2lhdGVkU2VjdGlvbigpIGNvbnN0IHsgcmV0dXJuICZBc3NvY2lhdGVkU3ltYm9sLT5nZXRTZWN0aW9uKCk7IH0KKyAgY29uc3QgTUNTeW1ib2wgKmdldEFzc29jaWF0ZWRTeW1ib2woKSBjb25zdCB7IHJldHVybiBBc3NvY2lhdGVkU3ltYm9sOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ1NlY3Rpb24gKlMpIHsKKyAgICByZXR1cm4gUy0+Z2V0VmFyaWFudCgpID09IFNWX0VMRjsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNTRUNUSU9ORUxGX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTZWN0aW9uTWFjaE8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTZWN0aW9uTWFjaE8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OWRiMDljCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1NlY3Rpb25NYWNoTy5oCkBAIC0wLDAgKzEsOTIgQEAKKy8vPT09LSBNQ1NlY3Rpb25NYWNoTy5oIC0gTWFjaE8gTWFjaGluZSBDb2RlIFNlY3Rpb25zIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBNQ1NlY3Rpb25NYWNoTyBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNTRUNUSU9OTUFDSE9fSAorI2RlZmluZSBMTFZNX01DX01DU0VDVElPTk1BQ0hPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L01hY2hPLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NlY3Rpb24uaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gVGhpcyByZXByZXNlbnRzIGEgc2VjdGlvbiBvbiBhIE1hY2gtTyBzeXN0ZW0gKHVzZWQgYnkgTWFjIE9TIFgpLiAgT24gYSBNYWMKKy8vLyBzeXN0ZW0sIHRoZXNlIGFyZSBhbHNvIGRlc2NyaWJlZCBpbiAvdXNyL2luY2x1ZGUvbWFjaC1vL2xvYWRlci5oLgorY2xhc3MgTUNTZWN0aW9uTWFjaE8gZmluYWwgOiBwdWJsaWMgTUNTZWN0aW9uIHsKKyAgY2hhciBTZWdtZW50TmFtZVsxNl07ICAvLyBOb3QgbmVjZXNzYXJpbHkgbnVsbCB0ZXJtaW5hdGVkIQorICBjaGFyIFNlY3Rpb25OYW1lWzE2XTsgIC8vIE5vdCBuZWNlc3NhcmlseSBudWxsIHRlcm1pbmF0ZWQhCisKKyAgLy8vIFRoaXMgaXMgdGhlIFNFQ1RJT05fVFlQRSBhbmQgU0VDVElPTl9BVFRSSUJVVEVTIGZpZWxkIG9mIGEgc2VjdGlvbiwgZHJhd24KKyAgLy8vIGZyb20gdGhlIGVudW1zIGJlbG93LgorICB1bnNpZ25lZCBUeXBlQW5kQXR0cmlidXRlczsKKworICAvLy8gVGhlICdyZXNlcnZlZDInIGZpZWxkIG9mIGEgc2VjdGlvbiwgdXNlZCB0byByZXByZXNlbnQgdGhlIHNpemUgb2Ygc3R1YnMsCisgIC8vLyBmb3IgZXhhbXBsZS4KKyAgdW5zaWduZWQgUmVzZXJ2ZWQyOworCisgIE1DU2VjdGlvbk1hY2hPKFN0cmluZ1JlZiBTZWdtZW50LCBTdHJpbmdSZWYgU2VjdGlvbiwgdW5zaWduZWQgVEFBLAorICAgICAgICAgICAgICAgICB1bnNpZ25lZCByZXNlcnZlZDIsIFNlY3Rpb25LaW5kIEssIE1DU3ltYm9sICpCZWdpbik7CisgIGZyaWVuZCBjbGFzcyBNQ0NvbnRleHQ7CitwdWJsaWM6CisKKyAgU3RyaW5nUmVmIGdldFNlZ21lbnROYW1lKCkgY29uc3QgeworICAgIC8vIFNlZ21lbnROYW1lIGlzIG5vdCBuZWNlc3NhcmlseSBudWxsIHRlcm1pbmF0ZWQhCisgICAgaWYgKFNlZ21lbnROYW1lWzE1XSkKKyAgICAgIHJldHVybiBTdHJpbmdSZWYoU2VnbWVudE5hbWUsIDE2KTsKKyAgICByZXR1cm4gU3RyaW5nUmVmKFNlZ21lbnROYW1lKTsKKyAgfQorICBTdHJpbmdSZWYgZ2V0U2VjdGlvbk5hbWUoKSBjb25zdCB7CisgICAgLy8gU2VjdGlvbk5hbWUgaXMgbm90IG5lY2Vzc2FyaWx5IG51bGwgdGVybWluYXRlZCEKKyAgICBpZiAoU2VjdGlvbk5hbWVbMTVdKQorICAgICAgcmV0dXJuIFN0cmluZ1JlZihTZWN0aW9uTmFtZSwgMTYpOworICAgIHJldHVybiBTdHJpbmdSZWYoU2VjdGlvbk5hbWUpOworICB9CisKKyAgdW5zaWduZWQgZ2V0VHlwZUFuZEF0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBUeXBlQW5kQXR0cmlidXRlczsgfQorICB1bnNpZ25lZCBnZXRTdHViU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFJlc2VydmVkMjsgfQorCisgIE1hY2hPOjpTZWN0aW9uVHlwZSBnZXRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxNYWNoTzo6U2VjdGlvblR5cGU+KFR5cGVBbmRBdHRyaWJ1dGVzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoTzo6U0VDVElPTl9UWVBFKTsKKyAgfQorICBib29sIGhhc0F0dHJpYnV0ZSh1bnNpZ25lZCBWYWx1ZSkgY29uc3QgeworICAgIHJldHVybiAoVHlwZUFuZEF0dHJpYnV0ZXMgJiBWYWx1ZSkgIT0gMDsKKyAgfQorCisgIC8vLyBQYXJzZSB0aGUgc2VjdGlvbiBzcGVjaWZpZXIgaW5kaWNhdGVkIGJ5ICJTcGVjIi4gVGhpcyBpcyBhIHN0cmluZyB0aGF0IGNhbgorICAvLy8gYXBwZWFyIGFmdGVyIGEgLnNlY3Rpb24gZGlyZWN0aXZlIGluIGEgbWFjaC1vIGZsYXZvcmVkIC5zIGZpbGUuICBJZgorICAvLy8gc3VjY2Vzc2Z1bCwgdGhpcyBmaWxscyBpbiB0aGUgc3BlY2lmaWVkIE91dCBwYXJhbWV0ZXJzIGFuZCByZXR1cm5zIGFuCisgIC8vLyBlbXB0eSBzdHJpbmcuICBXaGVuIGFuIGludmFsaWQgc2VjdGlvbiBzcGVjaWZpZXIgaXMgcHJlc2VudCwgdGhpcyByZXR1cm5zCisgIC8vLyBhIHN0cmluZyBpbmRpY2F0aW5nIHRoZSBwcm9ibGVtLiBJZiBubyBUQUEgd2FzIHBhcnNlZCwgVEFBIGlzIG5vdCBhbHRlcmVkLAorICAvLy8gYW5kIFRBQVdhc1NldCBiZWNvbWVzIGZhbHNlLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgUGFyc2VTZWN0aW9uU3BlY2lmaWVyKFN0cmluZ1JlZiBTcGVjLCAgICAgICAvLyBJbi4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgJlNlZ21lbnQsICAgLy8gT3V0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiAmU2VjdGlvbiwgICAvLyBPdXQuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgICZUQUEsICAgICAgIC8vIE91dC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICAgICAgJlRBQVBhcnNlZCwgLy8gT3V0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICAmU3R1YlNpemUpOyAvLyBPdXQuCisKKyAgdm9pZCBQcmludFN3aXRjaFRvU2VjdGlvbihjb25zdCBNQ0FzbUluZm8gJk1BSSwgY29uc3QgVHJpcGxlICZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0V4cHIgKlN1YnNlY3Rpb24pIGNvbnN0IG92ZXJyaWRlOworICBib29sIFVzZUNvZGVBbGlnbigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzVmlydHVhbFNlY3Rpb24oKSBjb25zdCBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DU2VjdGlvbiAqUykgeworICAgIHJldHVybiBTLT5nZXRWYXJpYW50KCkgPT0gU1ZfTWFjaE87CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1NlY3Rpb25XYXNtLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DU2VjdGlvbldhc20uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjRjZDdiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1NlY3Rpb25XYXNtLmgKQEAgLTAsMCArMSw4OCBAQAorLy89PT0tIE1DU2VjdGlvbldhc20uaCAtIFdhc20gTWFjaGluZSBDb2RlIFNlY3Rpb25zIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIE1DU2VjdGlvbldhc20gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DU0VDVElPTldBU01fSAorI2RlZmluZSBMTFZNX01DX01DU0VDVElPTldBU01fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DU2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTeW1ib2xXYXNtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNTeW1ib2w7CisKKy8vLyBUaGlzIHJlcHJlc2VudHMgYSBzZWN0aW9uIG9uIHdhc20uCitjbGFzcyBNQ1NlY3Rpb25XYXNtIGZpbmFsIDogcHVibGljIE1DU2VjdGlvbiB7CisgIC8vLyBUaGlzIGlzIHRoZSBuYW1lIG9mIHRoZSBzZWN0aW9uLiAgVGhlIHJlZmVyZW5jZWQgbWVtb3J5IGlzIG93bmVkIGJ5CisgIC8vLyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGVXYXNtJ3MgV2FzbVVuaXF1ZU1hcC4KKyAgU3RyaW5nUmVmIFNlY3Rpb25OYW1lOworCisgIHVuc2lnbmVkIFVuaXF1ZUlEOworCisgIGNvbnN0IE1DU3ltYm9sV2FzbSAqR3JvdXA7CisKKyAgLy8gVGhlIG9mZnNldCBvZiB0aGUgTUMgZnVuY3Rpb24vZGF0YSBzZWN0aW9uIGluIHRoZSB3YXNtIGNvZGUvZGF0YSBzZWN0aW9uLgorICAvLyBGb3IgZGF0YSByZWxvY2F0aW9ucyB0aGUgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIHN0YXJ0IG9mIHRoZSBkYXRhIHBheWxvYWQKKyAgLy8gaXRzZWxmIGFuZCBkb2VzIG5vdCBpbmNsdWRlIHRoZSBzaXplIG9mIHRoZSBzZWN0aW9uIGhlYWRlci4KKyAgdWludDY0X3QgU2VjdGlvbk9mZnNldCA9IDA7CisKKyAgLy8gRm9yIGRhdGEgc2VjdGlvbnMsIHRoaXMgaXMgdGhlIGluZGV4IG9mIG9mIHRoZSBjb3JyZXNwb25kaW5nIHdhc20gZGF0YQorICAvLyBzZWdtZW50CisgIHVpbnQzMl90IFNlZ21lbnRJbmRleCA9IDA7CisKKyAgZnJpZW5kIGNsYXNzIE1DQ29udGV4dDsKKyAgTUNTZWN0aW9uV2FzbShTdHJpbmdSZWYgU2VjdGlvbiwgU2VjdGlvbktpbmQgSywgY29uc3QgTUNTeW1ib2xXYXNtICpncm91cCwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBVbmlxdWVJRCwgTUNTeW1ib2wgKkJlZ2luKQorICAgICAgOiBNQ1NlY3Rpb24oU1ZfV2FzbSwgSywgQmVnaW4pLCBTZWN0aW9uTmFtZShTZWN0aW9uKSwgVW5pcXVlSUQoVW5pcXVlSUQpLAorICAgICAgICBHcm91cChncm91cCkge30KKworICB2b2lkIHNldFNlY3Rpb25OYW1lKFN0cmluZ1JlZiBOYW1lKSB7IFNlY3Rpb25OYW1lID0gTmFtZTsgfQorCitwdWJsaWM6CisgIH5NQ1NlY3Rpb25XYXNtKCk7CisKKyAgLy8vIERlY2lkZXMgd2hldGhlciBhICcuc2VjdGlvbicgZGlyZWN0aXZlIHNob3VsZCBiZSBwcmludGVkIGJlZm9yZSB0aGUKKyAgLy8vIHNlY3Rpb24gbmFtZQorICBib29sIFNob3VsZE9taXRTZWN0aW9uRGlyZWN0aXZlKFN0cmluZ1JlZiBOYW1lLCBjb25zdCBNQ0FzbUluZm8gJk1BSSkgY29uc3Q7CisKKyAgU3RyaW5nUmVmIGdldFNlY3Rpb25OYW1lKCkgY29uc3QgeyByZXR1cm4gU2VjdGlvbk5hbWU7IH0KKyAgY29uc3QgTUNTeW1ib2xXYXNtICpnZXRHcm91cCgpIGNvbnN0IHsgcmV0dXJuIEdyb3VwOyB9CisKKyAgdm9pZCBQcmludFN3aXRjaFRvU2VjdGlvbihjb25zdCBNQ0FzbUluZm8gJk1BSSwgY29uc3QgVHJpcGxlICZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0V4cHIgKlN1YnNlY3Rpb24pIGNvbnN0IG92ZXJyaWRlOworICBib29sIFVzZUNvZGVBbGlnbigpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzVmlydHVhbFNlY3Rpb24oKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIGlzV2FzbURhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIEtpbmQuaXNHbG9iYWxXcml0ZWFibGVEYXRhKCkgfHwgS2luZC5pc1JlYWRPbmx5KCk7CisgIH0KKworICBib29sIGlzVW5pcXVlKCkgY29uc3QgeyByZXR1cm4gVW5pcXVlSUQgIT0gfjBVOyB9CisgIHVuc2lnbmVkIGdldFVuaXF1ZUlEKCkgY29uc3QgeyByZXR1cm4gVW5pcXVlSUQ7IH0KKworICB1aW50NjRfdCBnZXRTZWN0aW9uT2Zmc2V0KCkgY29uc3QgeyByZXR1cm4gU2VjdGlvbk9mZnNldDsgfQorICB2b2lkIHNldFNlY3Rpb25PZmZzZXQodWludDY0X3QgT2Zmc2V0KSB7IFNlY3Rpb25PZmZzZXQgPSBPZmZzZXQ7IH0KKworICB1aW50MzJfdCBnZXRTZWdtZW50SW5kZXgoKSBjb25zdCB7IHJldHVybiBTZWdtZW50SW5kZXg7IH0KKyAgdm9pZCBzZXRTZWdtZW50SW5kZXgodWludDMyX3QgSW5kZXgpIHsgU2VnbWVudEluZGV4ID0gSW5kZXg7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DU2VjdGlvbiAqUykgeyByZXR1cm4gUy0+Z2V0VmFyaWFudCgpID09IFNWX1dhc207IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1N0cmVhbWVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DU3RyZWFtZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ODJhODM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1N0cmVhbWVyLmgKQEAgLTAsMCArMSw5NzUgQEAKKy8vPT09LSBNQ1N0cmVhbWVyLmggLSBIaWdoLWxldmVsIFN0cmVhbWluZyBNYWNoaW5lIENvZGUgT3V0cHV0IC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBNQ1N0cmVhbWVyIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1NUUkVBTUVSX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1NUUkVBTUVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0RpcmVjdGl2ZXMuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRHdhcmYuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DTGlua2VyT3B0aW1pemF0aW9uSGludC5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DV2luRUguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTUQ1LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NNTG9jLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1RhcmdldFBhcnNlci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFzc2VtYmxlckNvbnN0YW50UG9vbHM7CitjbGFzcyBmb3JtYXR0ZWRfcmF3X29zdHJlYW07CitjbGFzcyBNQ0FzbUJhY2tlbmQ7CitjbGFzcyBNQ0NvZGVFbWl0dGVyOworc3RydWN0IE1DQ29kZVBhZGRpbmdDb250ZXh0OworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNFeHByOworY2xhc3MgTUNJbnN0OworY2xhc3MgTUNJbnN0UHJpbnRlcjsKK2NsYXNzIE1DU2VjdGlvbjsKK2NsYXNzIE1DU3RyZWFtZXI7CitjbGFzcyBNQ1N5bWJvbFJlZkV4cHI7CitjbGFzcyBNQ1N1YnRhcmdldEluZm87CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFR3aW5lOworCit1c2luZyBNQ1NlY3Rpb25TdWJQYWlyID0gc3RkOjpwYWlyPE1DU2VjdGlvbiAqLCBjb25zdCBNQ0V4cHIgKj47CisKKy8vLyBUYXJnZXQgc3BlY2lmaWMgc3RyZWFtZXIgaW50ZXJmYWNlLiBUaGlzIGlzIHVzZWQgc28gdGhhdCB0YXJnZXRzIGNhbgorLy8vIGltcGxlbWVudCBzdXBwb3J0IGZvciB0YXJnZXQgc3BlY2lmaWMgYXNzZW1ibHkgZGlyZWN0aXZlcy4KKy8vLworLy8vIElmIHRhcmdldCBmb28gd2FudHMgdG8gdXNlIHRoaXMsIGl0IHNob3VsZCBpbXBsZW1lbnQgMyBjbGFzc2VzOgorLy8vICogRm9vVGFyZ2V0U3RyZWFtZXIgOiBwdWJsaWMgTUNUYXJnZXRTdHJlYW1lcgorLy8vICogRm9vVGFyZ2V0QXNtU3RyZWFtZXIgOiBwdWJsaWMgRm9vVGFyZ2V0U3RyZWFtZXIKKy8vLyAqIEZvb1RhcmdldEVMRlN0cmVhbWVyIDogcHVibGljIEZvb1RhcmdldFN0cmVhbWVyCisvLy8KKy8vLyBGb29UYXJnZXRTdHJlYW1lciBzaG91bGQgaGF2ZSBhIHB1cmUgdmlydHVhbCBtZXRob2QgZm9yIGVhY2ggZGlyZWN0aXZlLiBGb3IKKy8vLyBleGFtcGxlLCBmb3IgYSAiLmJhciBzeW1ib2xfbmFtZSIgZGlyZWN0aXZlLCBpdCBzaG91bGQgaGF2ZQorLy8vIHZpcnR1YWwgZW1pdEJhcihjb25zdCBNQ1N5bWJvbCAmU3ltYm9sKSA9IDA7CisvLy8KKy8vLyBUaGUgRm9vVGFyZ2V0QXNtU3RyZWFtZXIgYW5kIEZvb1RhcmdldEVMRlN0cmVhbWVyIGNsYXNzZXMgaW1wbGVtZW50IHRoZQorLy8vIG1ldGhvZC4gVGhlIGFzc2VtYmx5IHN0cmVhbWVyIGp1c3QgcHJpbnRzICIuYmFyIHN5bWJvbF9uYW1lIi4gVGhlIG9iamVjdAorLy8vIHN0cmVhbWVyIGRvZXMgd2hhdGV2ZXIgaXMgbmVlZGVkIHRvIGltcGxlbWVudCAuYmFyIGluIHRoZSBvYmplY3QgZmlsZS4KKy8vLworLy8vIEluIHRoZSBhc3NlbWJseSBwcmludGVyIGFuZCBwYXJzZXIgdGhlIHRhcmdldCBzdHJlYW1lciBjYW4gYmUgdXNlZCBieQorLy8vIGNhbGxpbmcgZ2V0VGFyZ2V0U3RyZWFtZXIgYW5kIGNhc3RpbmcgaXQgdG8gRm9vVGFyZ2V0U3RyZWFtZXI6CisvLy8KKy8vLyBNQ1RhcmdldFN0cmVhbWVyICZUUyA9IE91dFN0cmVhbWVyLmdldFRhcmdldFN0cmVhbWVyKCk7CisvLy8gRm9vVGFyZ2V0U3RyZWFtZXIgJkFUUyA9IHN0YXRpY19jYXN0PEZvb1RhcmdldFN0cmVhbWVyICY+KFRTKTsKKy8vLworLy8vIFRoZSBiYXNlIGNsYXNzZXMgRm9vVGFyZ2V0QXNtU3RyZWFtZXIgYW5kIEZvb1RhcmdldEVMRlN0cmVhbWVyIHNob3VsZAorLy8vICpuZXZlciogYmUgdHJlYXRlZCBkaWZmZXJlbnRseS4gQ2FsbGVycyBzaG91bGQgYWx3YXlzIHRhbGsgdG8gYQorLy8vIEZvb1RhcmdldFN0cmVhbWVyLgorY2xhc3MgTUNUYXJnZXRTdHJlYW1lciB7Citwcm90ZWN0ZWQ6CisgIE1DU3RyZWFtZXIgJlN0cmVhbWVyOworCitwdWJsaWM6CisgIE1DVGFyZ2V0U3RyZWFtZXIoTUNTdHJlYW1lciAmUyk7CisgIHZpcnR1YWwgfk1DVGFyZ2V0U3RyZWFtZXIoKTsKKworICBNQ1N0cmVhbWVyICZnZXRTdHJlYW1lcigpIHsgcmV0dXJuIFN0cmVhbWVyOyB9CisKKyAgLy8gQWxsb3cgYSB0YXJnZXQgdG8gYWRkIGJlaGF2aW9yIHRvIHRoZSBFbWl0TGFiZWwgb2YgTUNTdHJlYW1lci4KKyAgdmlydHVhbCB2b2lkIGVtaXRMYWJlbChNQ1N5bWJvbCAqU3ltYm9sKTsKKyAgLy8gQWxsb3cgYSB0YXJnZXQgdG8gYWRkIGJlaGF2aW9yIHRvIHRoZSBlbWl0QXNzaWdubWVudCBvZiBNQ1N0cmVhbWVyLgorICB2aXJ0dWFsIHZvaWQgZW1pdEFzc2lnbm1lbnQoTUNTeW1ib2wgKlN5bWJvbCwgY29uc3QgTUNFeHByICpWYWx1ZSk7CisKKyAgdmlydHVhbCB2b2lkIHByZXR0eVByaW50QXNtKE1DSW5zdFByaW50ZXIgJkluc3RQcmludGVyLCByYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0luc3QgJkluc3QsIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU1RJKTsKKworICB2aXJ0dWFsIHZvaWQgZW1pdER3YXJmRmlsZURpcmVjdGl2ZShTdHJpbmdSZWYgRGlyZWN0aXZlKTsKKworICAvLy8gVXBkYXRlIHN0cmVhbWVyIGZvciBhIG5ldyBhY3RpdmUgc2VjdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGNhbGxlZCBieSBQb3BTZWN0aW9uIGFuZCBTd2l0Y2hTZWN0aW9uLCBpZiB0aGUgY3VycmVudAorICAvLy8gc2VjdGlvbiBjaGFuZ2VzLgorICB2aXJ0dWFsIHZvaWQgY2hhbmdlU2VjdGlvbihjb25zdCBNQ1NlY3Rpb24gKkN1clNlY3Rpb24sIE1DU2VjdGlvbiAqU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNFeHByICpTdWJTZWN0aW9uLCByYXdfb3N0cmVhbSAmT1MpOworCisgIHZpcnR1YWwgdm9pZCBlbWl0VmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSk7CisKKyAgdmlydHVhbCB2b2lkIGZpbmlzaCgpOworfTsKKworLy8gRklYTUU6IGRlY2xhcmVkIGhlcmUgYmVjYXVzZSBpdCBpcyB1c2VkIGZyb20KKy8vIGxpYi9Db2RlR2VuL0FzbVByaW50ZXIvQVJNRXhjZXB0aW9uLmNwcC4KK2NsYXNzIEFSTVRhcmdldFN0cmVhbWVyIDogcHVibGljIE1DVGFyZ2V0U3RyZWFtZXIgeworcHVibGljOgorICBBUk1UYXJnZXRTdHJlYW1lcihNQ1N0cmVhbWVyICZTKTsKKyAgfkFSTVRhcmdldFN0cmVhbWVyKCkgb3ZlcnJpZGU7CisKKyAgdmlydHVhbCB2b2lkIGVtaXRGblN0YXJ0KCk7CisgIHZpcnR1YWwgdm9pZCBlbWl0Rm5FbmQoKTsKKyAgdmlydHVhbCB2b2lkIGVtaXRDYW50VW53aW5kKCk7CisgIHZpcnR1YWwgdm9pZCBlbWl0UGVyc29uYWxpdHkoY29uc3QgTUNTeW1ib2wgKlBlcnNvbmFsaXR5KTsKKyAgdmlydHVhbCB2b2lkIGVtaXRQZXJzb25hbGl0eUluZGV4KHVuc2lnbmVkIEluZGV4KTsKKyAgdmlydHVhbCB2b2lkIGVtaXRIYW5kbGVyRGF0YSgpOworICB2aXJ0dWFsIHZvaWQgZW1pdFNldEZQKHVuc2lnbmVkIEZwUmVnLCB1bnNpZ25lZCBTcFJlZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IE9mZnNldCA9IDApOworICB2aXJ0dWFsIHZvaWQgZW1pdE1vdlNQKHVuc2lnbmVkIFJlZywgaW50NjRfdCBPZmZzZXQgPSAwKTsKKyAgdmlydHVhbCB2b2lkIGVtaXRQYWQoaW50NjRfdCBPZmZzZXQpOworICB2aXJ0dWFsIHZvaWQgZW1pdFJlZ1NhdmUoY29uc3QgU21hbGxWZWN0b3JJbXBsPHVuc2lnbmVkPiAmUmVnTGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNWZWN0b3IpOworICB2aXJ0dWFsIHZvaWQgZW1pdFVud2luZFJhdyhpbnQ2NF90IFN0YWNrT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8dWludDhfdD4gJk9wY29kZXMpOworCisgIHZpcnR1YWwgdm9pZCBzd2l0Y2hWZW5kb3IoU3RyaW5nUmVmIFZlbmRvcik7CisgIHZpcnR1YWwgdm9pZCBlbWl0QXR0cmlidXRlKHVuc2lnbmVkIEF0dHJpYnV0ZSwgdW5zaWduZWQgVmFsdWUpOworICB2aXJ0dWFsIHZvaWQgZW1pdFRleHRBdHRyaWJ1dGUodW5zaWduZWQgQXR0cmlidXRlLCBTdHJpbmdSZWYgU3RyaW5nKTsKKyAgdmlydHVhbCB2b2lkIGVtaXRJbnRUZXh0QXR0cmlidXRlKHVuc2lnbmVkIEF0dHJpYnV0ZSwgdW5zaWduZWQgSW50VmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgU3RyaW5nVmFsdWUgPSAiIik7CisgIHZpcnR1YWwgdm9pZCBlbWl0RlBVKHVuc2lnbmVkIEZQVSk7CisgIHZpcnR1YWwgdm9pZCBlbWl0QXJjaChBUk06OkFyY2hLaW5kIEFyY2gpOworICB2aXJ0dWFsIHZvaWQgZW1pdEFyY2hFeHRlbnNpb24odW5zaWduZWQgQXJjaEV4dCk7CisgIHZpcnR1YWwgdm9pZCBlbWl0T2JqZWN0QXJjaChBUk06OkFyY2hLaW5kIEFyY2gpOworICB2b2lkIGVtaXRUYXJnZXRBdHRyaWJ1dGVzKGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU1RJKTsKKyAgdmlydHVhbCB2b2lkIGZpbmlzaEF0dHJpYnV0ZVNlY3Rpb24oKTsKKyAgdmlydHVhbCB2b2lkIGVtaXRJbnN0KHVpbnQzMl90IEluc3QsIGNoYXIgU3VmZml4ID0gJ1wwJyk7CisKKyAgdmlydHVhbCB2b2lkIEFubm90YXRlVExTRGVzY3JpcHRvclNlcXVlbmNlKGNvbnN0IE1DU3ltYm9sUmVmRXhwciAqU1JFKTsKKworICB2aXJ0dWFsIHZvaWQgZW1pdFRodW1iU2V0KE1DU3ltYm9sICpTeW1ib2wsIGNvbnN0IE1DRXhwciAqVmFsdWUpOworCisgIHZvaWQgZmluaXNoKCkgb3ZlcnJpZGU7CisKKyAgLy8vIFJlc2V0IGFueSBzdGF0ZSBiZXR3ZWVuIG9iamVjdCBlbWlzc2lvbnMsIGkuZS4gdGhlIGVxdWl2YWxlbnQgb2YKKyAgLy8vIE1DU3RyZWFtZXIncyByZXNldCBtZXRob2QuCisgIHZpcnR1YWwgdm9pZCByZXNldCgpOworCisgIC8vLyBDYWxsYmFjayB1c2VkIHRvIGltcGxlbWVudCB0aGUgbGRyPSBwc2V1ZG8uCisgIC8vLyBBZGQgYSBuZXcgZW50cnkgdG8gdGhlIGNvbnN0YW50IHBvb2wgZm9yIHRoZSBjdXJyZW50IHNlY3Rpb24gYW5kIHJldHVybiBhbgorICAvLy8gTUNFeHByIHRoYXQgY2FuIGJlIHVzZWQgdG8gcmVmZXIgdG8gdGhlIGNvbnN0YW50IHBvb2wgbG9jYXRpb24uCisgIGNvbnN0IE1DRXhwciAqYWRkQ29uc3RhbnRQb29sRW50cnkoY29uc3QgTUNFeHByICosIFNNTG9jIExvYyk7CisKKyAgLy8vIENhbGxiYWNrIHVzZWQgdG8gaW1wbGVtbnQgdGhlIC5sdG9yZyBkaXJlY3RpdmUuCisgIC8vLyBFbWl0IGNvbnRlbnRzIG9mIGNvbnN0YW50IHBvb2wgZm9yIHRoZSBjdXJyZW50IHNlY3Rpb24uCisgIHZvaWQgZW1pdEN1cnJlbnRDb25zdGFudFBvb2woKTsKKworcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPEFzc2VtYmxlckNvbnN0YW50UG9vbHM+IENvbnN0YW50UG9vbHM7Cit9OworCisvLy8gXGJyaWVmIFN0cmVhbWluZyBtYWNoaW5lIGNvZGUgZ2VuZXJhdGlvbiBpbnRlcmZhY2UuCisvLy8KKy8vLyBUaGlzIGludGVyZmFjZSBpcyBpbnRlbmRlZCB0byBwcm92aWRlIGEgcHJvZ3JhbWF0aWMgaW50ZXJmYWNlIHRoYXQgaXMgdmVyeQorLy8vIHNpbWlsYXIgdG8gdGhlIGxldmVsIHRoYXQgYW4gYXNzZW1ibGVyIC5zIGZpbGUgcHJvdmlkZXMuICBJdCBoYXMgY2FsbGJhY2tzCisvLy8gdG8gZW1pdCBieXRlcywgaGFuZGxlIGRpcmVjdGl2ZXMsIGV0Yy4gIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVyZmFjZQorLy8vIHJldGFpbnMgc3RhdGUgdG8ga25vdyB3aGF0IHRoZSBjdXJyZW50IHNlY3Rpb24gaXMgZXRjLgorLy8vCisvLy8gVGhlcmUgYXJlIG11bHRpcGxlIGltcGxlbWVudGF0aW9ucyBvZiB0aGlzIGludGVyZmFjZTogb25lIGZvciB3cml0aW5nIG91dAorLy8vIGEgLnMgZmlsZSwgYW5kIGltcGxlbWVudGF0aW9ucyB0aGF0IHdyaXRlIG91dCAubyBmaWxlcyBvZiB2YXJpb3VzIGZvcm1hdHMuCisvLy8KK2NsYXNzIE1DU3RyZWFtZXIgeworICBNQ0NvbnRleHQgJkNvbnRleHQ7CisgIHN0ZDo6dW5pcXVlX3B0cjxNQ1RhcmdldFN0cmVhbWVyPiBUYXJnZXRTdHJlYW1lcjsKKworICBzdGQ6OnZlY3RvcjxNQ0R3YXJmRnJhbWVJbmZvPiBEd2FyZkZyYW1lSW5mb3M7CisgIE1DRHdhcmZGcmFtZUluZm8gKmdldEN1cnJlbnREd2FyZkZyYW1lSW5mbygpOworCisgIC8vLyBTaW1pbGFyIHRvIER3YXJmRnJhbWVJbmZvcywgYnV0IGZvciBTRUggdW53aW5kIGluZm8uIENoYWluZWQgZnJhbWVzIG1heQorICAvLy8gcmVmZXIgdG8gZWFjaCBvdGhlciwgc28gdXNlIHN0ZDo6dW5pcXVlX3B0ciB0byBwcm92aWRlIHBvaW50ZXIgc3RhYmlsaXR5LgorICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8V2luRUg6OkZyYW1lSW5mbz4+IFdpbkZyYW1lSW5mb3M7CisKKyAgV2luRUg6OkZyYW1lSW5mbyAqQ3VycmVudFdpbkZyYW1lSW5mbzsKKworICAvLy8gUmV0cmVpdmUgdGhlIGN1cnJlbnQgZnJhbWUgaW5mbyBpZiBvbmUgaXMgYXZhaWxhYmxlIGFuZCBpdCBpcyBub3QgeWV0CisgIC8vLyBjbG9zZWQuIE90aGVyd2lzZSwgaXNzdWUgYW4gZXJyb3IgYW5kIHJldHVybiBudWxsLgorICBXaW5FSDo6RnJhbWVJbmZvICpFbnN1cmVWYWxpZFdpbkZyYW1lSW5mbyhTTUxvYyBMb2MpOworCisgIC8vLyBcYnJpZWYgVHJhY2tzIGFuIGluZGV4IHRvIHJlcHJlc2VudCB0aGUgb3JkZXIgYSBzeW1ib2wgd2FzIGVtaXR0ZWQgaW4uCisgIC8vLyBaZXJvIG1lYW5zIHdlIGRpZCBub3QgZW1pdCB0aGF0IHN5bWJvbC4KKyAgRGVuc2VNYXA8Y29uc3QgTUNTeW1ib2wgKiwgdW5zaWduZWQ+IFN5bWJvbE9yZGVyaW5nOworCisgIC8vLyBcYnJpZWYgVGhpcyBpcyBzdGFjayBvZiBjdXJyZW50IGFuZCBwcmV2aW91cyBzZWN0aW9uIHZhbHVlcyBzYXZlZCBieQorICAvLy8gUHVzaFNlY3Rpb24uCisgIFNtYWxsVmVjdG9yPHN0ZDo6cGFpcjxNQ1NlY3Rpb25TdWJQYWlyLCBNQ1NlY3Rpb25TdWJQYWlyPiwgND4gU2VjdGlvblN0YWNrOworCisgIC8vLyBUaGUgbmV4dCB1bmlxdWUgSUQgdG8gdXNlIHdoZW4gY3JlYXRpbmcgYSBXaW5DRkktcmVsYXRlZCBzZWN0aW9uICgucGRhdGEKKyAgLy8vIG9yIC54ZGF0YSkuIFRoaXMgSUQgZW5zdXJlcyB0aGF0IHdlIGhhdmUgYSBvbmUtdG8tb25lIG1hcHBpbmcgZnJvbQorICAvLy8gY29kZSBzZWN0aW9uIHRvIHVud2luZCBpbmZvIHNlY3Rpb24sIHdoaWNoIE1TVkMncyBpbmNyZW1lbnRhbCBsaW5rZXIKKyAgLy8vIHJlcXVpcmVzLgorICB1bnNpZ25lZCBOZXh0V2luQ0ZJSUQgPSAwOworCitwcm90ZWN0ZWQ6CisgIE1DU3RyZWFtZXIoTUNDb250ZXh0ICZDdHgpOworCisgIHZpcnR1YWwgdm9pZCBFbWl0Q0ZJU3RhcnRQcm9jSW1wbChNQ0R3YXJmRnJhbWVJbmZvICZGcmFtZSk7CisgIHZpcnR1YWwgdm9pZCBFbWl0Q0ZJRW5kUHJvY0ltcGwoTUNEd2FyZkZyYW1lSW5mbyAmQ3VyRnJhbWUpOworCisgIC8vLyBXaGVuIGVtaXR0aW5nIGFuIG9iamVjdCBmaWxlLCBjcmVhdGUgYW5kIGVtaXQgYSByZWFsIGxhYmVsLiBXaGVuIGVtaXR0aW5nCisgIC8vLyB0ZXh0dWFsIGFzc2VtYmx5LCB0aGlzIHNob3VsZCBkbyBub3RoaW5nIHRvIGF2b2lkIHBvbGx1dGluZyBvdXIgb3V0cHV0LgorICB2aXJ0dWFsIE1DU3ltYm9sICpFbWl0Q0ZJTGFiZWwoKTsKKworICBXaW5FSDo6RnJhbWVJbmZvICpnZXRDdXJyZW50V2luRnJhbWVJbmZvKCkgeworICAgIHJldHVybiBDdXJyZW50V2luRnJhbWVJbmZvOworICB9CisKKyAgdmlydHVhbCB2b2lkIEVtaXRXaW5kb3dzVW53aW5kVGFibGVzKCk7CisKKyAgdmlydHVhbCB2b2lkIEVtaXRSYXdUZXh0SW1wbChTdHJpbmdSZWYgU3RyaW5nKTsKKworcHVibGljOgorICBNQ1N0cmVhbWVyKGNvbnN0IE1DU3RyZWFtZXIgJikgPSBkZWxldGU7CisgIE1DU3RyZWFtZXIgJm9wZXJhdG9yPShjb25zdCBNQ1N0cmVhbWVyICYpID0gZGVsZXRlOworICB2aXJ0dWFsIH5NQ1N0cmVhbWVyKCk7CisKKyAgdm9pZCB2aXNpdFVzZWRFeHByKGNvbnN0IE1DRXhwciAmRXhwcik7CisgIHZpcnR1YWwgdm9pZCB2aXNpdFVzZWRTeW1ib2woY29uc3QgTUNTeW1ib2wgJlN5bSk7CisKKyAgdm9pZCBzZXRUYXJnZXRTdHJlYW1lcihNQ1RhcmdldFN0cmVhbWVyICpUUykgeworICAgIFRhcmdldFN0cmVhbWVyLnJlc2V0KFRTKTsKKyAgfQorCisgIC8vLyBTdGF0ZSBtYW5hZ2VtZW50CisgIC8vLworICB2aXJ0dWFsIHZvaWQgcmVzZXQoKTsKKworICBNQ0NvbnRleHQgJmdldENvbnRleHQoKSBjb25zdCB7IHJldHVybiBDb250ZXh0OyB9CisKKyAgTUNUYXJnZXRTdHJlYW1lciAqZ2V0VGFyZ2V0U3RyZWFtZXIoKSB7CisgICAgcmV0dXJuIFRhcmdldFN0cmVhbWVyLmdldCgpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtRnJhbWVJbmZvcygpIHsgcmV0dXJuIER3YXJmRnJhbWVJbmZvcy5zaXplKCk7IH0KKyAgQXJyYXlSZWY8TUNEd2FyZkZyYW1lSW5mbz4gZ2V0RHdhcmZGcmFtZUluZm9zKCkgY29uc3QgeworICAgIHJldHVybiBEd2FyZkZyYW1lSW5mb3M7CisgIH0KKworICBib29sIGhhc1VuZmluaXNoZWREd2FyZkZyYW1lSW5mbygpOworCisgIHVuc2lnbmVkIGdldE51bVdpbkZyYW1lSW5mb3MoKSB7IHJldHVybiBXaW5GcmFtZUluZm9zLnNpemUoKTsgfQorICBBcnJheVJlZjxzdGQ6OnVuaXF1ZV9wdHI8V2luRUg6OkZyYW1lSW5mbz4+IGdldFdpbkZyYW1lSW5mb3MoKSBjb25zdCB7CisgICAgcmV0dXJuIFdpbkZyYW1lSW5mb3M7CisgIH0KKworICB2b2lkIGdlbmVyYXRlQ29tcGFjdFVud2luZEVuY29kaW5ncyhNQ0FzbUJhY2tlbmQgKk1BQik7CisKKyAgLy8vIFxuYW1lIEFzc2VtYmx5IEZpbGUgRm9ybWF0dGluZy4KKyAgLy8vIEB7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHN0cmVhbWVyIHN1cHBvcnRzIHZlcmJvc2UgYXNzZW1ibHkgYW5kIGlmIGl0IGlzCisgIC8vLyBlbmFibGVkLgorICB2aXJ0dWFsIGJvb2wgaXNWZXJib3NlQXNtKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHRoaXMgYXNtIHN0cmVhbWVyIHN1cHBvcnRzIGVtaXR0aW5nIHVuZm9ybWF0dGVkIHRleHQKKyAgLy8vIHRvIHRoZSAucyBmaWxlIHdpdGggRW1pdFJhd1RleHQuCisgIHZpcnR1YWwgYm9vbCBoYXNSYXdUZXh0U3VwcG9ydCgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFxicmllZiBJcyB0aGUgaW50ZWdyYXRlZCBhc3NlbWJsZXIgcmVxdWlyZWQgZm9yIHRoaXMgc3RyZWFtZXIgdG8gZnVuY3Rpb24KKyAgLy8vIGNvcnJlY3RseT8KKyAgdmlydHVhbCBib29sIGlzSW50ZWdyYXRlZEFzc2VtYmxlclJlcXVpcmVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gXGJyaWVmIEFkZCBhIHRleHR1YWwgY29tbWVudC4KKyAgLy8vCisgIC8vLyBUeXBpY2FsbHkgZm9yIGNvbW1lbnRzIHRoYXQgY2FuIGJlIGVtaXR0ZWQgdG8gdGhlIGdlbmVyYXRlZCAucworICAvLy8gZmlsZSBpZiBhcHBsaWNhYmxlIGFzIGEgUW9JIGlzc3VlIHRvIG1ha2UgdGhlIG91dHB1dCBvZiB0aGUgY29tcGlsZXIKKyAgLy8vIG1vcmUgcmVhZGFibGUuICBUaGlzIG9ubHkgYWZmZWN0cyB0aGUgTUNBc21TdHJlYW1lciwgYW5kIG9ubHkgd2hlbgorICAvLy8gdmVyYm9zZSBhc3NlbWJseSBvdXRwdXQgaXMgZW5hYmxlZC4KKyAgLy8vCisgIC8vLyBJZiB0aGUgY29tbWVudCBpbmNsdWRlcyBlbWJlZGRlZCBcbidzLCB0aGV5IHdpbGwgZWFjaCBnZXQgdGhlIGNvbW1lbnQKKyAgLy8vIHByZWZpeCBhcyBhcHByb3ByaWF0ZS4gIFRoZSBhZGRlZCBjb21tZW50IHNob3VsZCBub3QgZW5kIHdpdGggYSBcbi4KKyAgLy8vIEJ5IGRlZmF1bHQsIGVhY2ggY29tbWVudCBpcyB0ZXJtaW5hdGVkIHdpdGggYW4gZW5kIG9mIGxpbmUsIGkuZS4gdGhlCisgIC8vLyBFT0wgcGFyYW0gaXMgc2V0IHRvIHRydWUgYnkgZGVmYXVsdC4gSWYgb25lIHByZWZlcnMgbm90IHRvIGVuZCB0aGUgCisgIC8vLyBjb21tZW50IHdpdGggYSBuZXcgbGluZSB0aGVuIHRoZSBFT0wgcGFyYW0gc2hvdWxkIGJlIHBhc3NlZCAKKyAgLy8vIHdpdGggYSBmYWxzZSB2YWx1ZS4KKyAgdmlydHVhbCB2b2lkIEFkZENvbW1lbnQoY29uc3QgVHdpbmUgJlQsIGJvb2wgRU9MID0gdHJ1ZSkge30KKworICAvLy8gXGJyaWVmIFJldHVybiBhIHJhd19vc3RyZWFtIHRoYXQgY29tbWVudHMgY2FuIGJlIHdyaXR0ZW4gdG8uIFVubGlrZQorICAvLy8gQWRkQ29tbWVudCwgeW91IGFyZSByZXF1aXJlZCB0byB0ZXJtaW5hdGUgY29tbWVudHMgd2l0aCBcbiBpZiB5b3UgdXNlIHRoaXMKKyAgLy8vIG1ldGhvZC4KKyAgdmlydHVhbCByYXdfb3N0cmVhbSAmR2V0Q29tbWVudE9TKCk7CisKKyAgLy8vIFxicmllZiBQcmludCBUIGFuZCBwcmVmaXggaXQgd2l0aCB0aGUgY29tbWVudCBzdHJpbmcgKG5vcm1hbGx5ICMpIGFuZAorICAvLy8gb3B0aW9uYWxseSBhIHRhYi4gVGhpcyBwcmludHMgdGhlIGNvbW1lbnQgaW1tZWRpYXRlbHksIG5vdCBhdCB0aGUgZW5kIG9mCisgIC8vLyB0aGUgY3VycmVudCBsaW5lLiBJdCBpcyBiYXNpY2FsbHkgYSBzYWZlIHZlcnNpb24gb2YgRW1pdFJhd1RleHQ6IHNpbmNlIGl0CisgIC8vLyBvbmx5IHByaW50cyBjb21tZW50cywgdGhlIG9iamVjdCBzdHJlYW1lciBpZ25vcmVzIGl0IGluc3RlYWQgb2YgYXNzZXJ0aW5nLgorICB2aXJ0dWFsIHZvaWQgZW1pdFJhd0NvbW1lbnQoY29uc3QgVHdpbmUgJlQsIGJvb2wgVGFiUHJlZml4ID0gdHJ1ZSk7CisKKyAgLy8vIFxicmllZiBBZGQgZXhwbGljaXQgY29tbWVudCBULiBUIGlzIHJlcXVpcmVkIHRvIGJlIGEgdmFsaWQKKyAgLy8vIGNvbW1lbnQgaW4gdGhlIG91dHB1dCBhbmQgZG9lcyBub3QgbmVlZCB0byBiZSBlc2NhcGVkLgorICB2aXJ0dWFsIHZvaWQgYWRkRXhwbGljaXRDb21tZW50KGNvbnN0IFR3aW5lICZUKTsKKworICAvLy8gXGJyaWVmIEVtaXQgYWRkZWQgZXhwbGljaXQgY29tbWVudHMuCisgIHZpcnR1YWwgdm9pZCBlbWl0RXhwbGljaXRDb21tZW50cygpOworCisgIC8vLyBBZGRCbGFua0xpbmUgLSBFbWl0IGEgYmxhbmsgbGluZSB0byBhIC5zIGZpbGUgdG8gcHJldHR5IGl0IHVwLgorICB2aXJ0dWFsIHZvaWQgQWRkQmxhbmtMaW5lKCkge30KKworICAvLy8gQH0KKworICAvLy8gXG5hbWUgU3ltYm9sICYgU2VjdGlvbiBNYW5hZ2VtZW50CisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBjdXJyZW50IHNlY3Rpb24gdGhhdCB0aGUgc3RyZWFtZXIgaXMgZW1pdHRpbmcgY29kZSB0by4KKyAgTUNTZWN0aW9uU3ViUGFpciBnZXRDdXJyZW50U2VjdGlvbigpIGNvbnN0IHsKKyAgICBpZiAoIVNlY3Rpb25TdGFjay5lbXB0eSgpKQorICAgICAgcmV0dXJuIFNlY3Rpb25TdGFjay5iYWNrKCkuZmlyc3Q7CisgICAgcmV0dXJuIE1DU2VjdGlvblN1YlBhaXIoKTsKKyAgfQorICBNQ1NlY3Rpb24gKmdldEN1cnJlbnRTZWN0aW9uT25seSgpIGNvbnN0IHsgcmV0dXJuIGdldEN1cnJlbnRTZWN0aW9uKCkuZmlyc3Q7IH0KKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgcHJldmlvdXMgc2VjdGlvbiB0aGF0IHRoZSBzdHJlYW1lciBpcyBlbWl0dGluZyBjb2RlIHRvLgorICBNQ1NlY3Rpb25TdWJQYWlyIGdldFByZXZpb3VzU2VjdGlvbigpIGNvbnN0IHsKKyAgICBpZiAoIVNlY3Rpb25TdGFjay5lbXB0eSgpKQorICAgICAgcmV0dXJuIFNlY3Rpb25TdGFjay5iYWNrKCkuc2Vjb25kOworICAgIHJldHVybiBNQ1NlY3Rpb25TdWJQYWlyKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgYW4gaW5kZXggdG8gcmVwcmVzZW50IHRoZSBvcmRlciBhIHN5bWJvbCB3YXMgZW1pdHRlZCBpbi4KKyAgLy8vICh6ZXJvIGlmIHdlIGRpZCBub3QgZW1pdCB0aGF0IHN5bWJvbCkKKyAgdW5zaWduZWQgR2V0U3ltYm9sT3JkZXIoY29uc3QgTUNTeW1ib2wgKlN5bSkgY29uc3QgeworICAgIHJldHVybiBTeW1ib2xPcmRlcmluZy5sb29rdXAoU3ltKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVXBkYXRlIHN0cmVhbWVyIGZvciBhIG5ldyBhY3RpdmUgc2VjdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGNhbGxlZCBieSBQb3BTZWN0aW9uIGFuZCBTd2l0Y2hTZWN0aW9uLCBpZiB0aGUgY3VycmVudAorICAvLy8gc2VjdGlvbiBjaGFuZ2VzLgorICB2aXJ0dWFsIHZvaWQgQ2hhbmdlU2VjdGlvbihNQ1NlY3Rpb24gKiwgY29uc3QgTUNFeHByICopOworCisgIC8vLyBcYnJpZWYgU2F2ZSB0aGUgY3VycmVudCBhbmQgcHJldmlvdXMgc2VjdGlvbiBvbiB0aGUgc2VjdGlvbiBzdGFjay4KKyAgdm9pZCBQdXNoU2VjdGlvbigpIHsKKyAgICBTZWN0aW9uU3RhY2sucHVzaF9iYWNrKAorICAgICAgICBzdGQ6Om1ha2VfcGFpcihnZXRDdXJyZW50U2VjdGlvbigpLCBnZXRQcmV2aW91c1NlY3Rpb24oKSkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXN0b3JlIHRoZSBjdXJyZW50IGFuZCBwcmV2aW91cyBzZWN0aW9uIGZyb20gdGhlIHNlY3Rpb24gc3RhY2suCisgIC8vLyBDYWxscyBDaGFuZ2VTZWN0aW9uIGFzIG5lZWRlZC4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIGZhbHNlIGlmIHRoZSBzdGFjayB3YXMgZW1wdHkuCisgIGJvb2wgUG9wU2VjdGlvbigpIHsKKyAgICBpZiAoU2VjdGlvblN0YWNrLnNpemUoKSA8PSAxKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGF1dG8gSSA9IFNlY3Rpb25TdGFjay5lbmQoKTsKKyAgICAtLUk7CisgICAgTUNTZWN0aW9uU3ViUGFpciBPbGRTZWN0aW9uID0gSS0+Zmlyc3Q7CisgICAgLS1JOworICAgIE1DU2VjdGlvblN1YlBhaXIgTmV3U2VjdGlvbiA9IEktPmZpcnN0OworCisgICAgaWYgKE9sZFNlY3Rpb24gIT0gTmV3U2VjdGlvbikKKyAgICAgIENoYW5nZVNlY3Rpb24oTmV3U2VjdGlvbi5maXJzdCwgTmV3U2VjdGlvbi5zZWNvbmQpOworICAgIFNlY3Rpb25TdGFjay5wb3BfYmFjaygpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCBTdWJTZWN0aW9uKGNvbnN0IE1DRXhwciAqU3Vic2VjdGlvbikgeworICAgIGlmIChTZWN0aW9uU3RhY2suZW1wdHkoKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIFN3aXRjaFNlY3Rpb24oU2VjdGlvblN0YWNrLmJhY2soKS5maXJzdC5maXJzdCwgU3Vic2VjdGlvbik7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gU2V0IHRoZSBjdXJyZW50IHNlY3Rpb24gd2hlcmUgY29kZSBpcyBiZWluZyBlbWl0dGVkIHRvIFxwIFNlY3Rpb24uICBUaGlzCisgIC8vLyBpcyByZXF1aXJlZCB0byB1cGRhdGUgQ3VyU2VjdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGNvcnJlc3BvbmRzIHRvIGFzc2VtYmxlciBkaXJlY3RpdmVzIGxpa2UgLnNlY3Rpb24sIC50ZXh0LCBldGMuCisgIHZpcnR1YWwgdm9pZCBTd2l0Y2hTZWN0aW9uKE1DU2VjdGlvbiAqU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNFeHByICpTdWJzZWN0aW9uID0gbnVsbHB0cik7CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIGN1cnJlbnQgc2VjdGlvbiB3aGVyZSBjb2RlIGlzIGJlaW5nIGVtaXR0ZWQgdG8gXHAgU2VjdGlvbi4KKyAgLy8vIFRoaXMgaXMgcmVxdWlyZWQgdG8gdXBkYXRlIEN1clNlY3Rpb24uIFRoaXMgdmVyc2lvbiBkb2VzIG5vdCBjYWxsCisgIC8vLyBDaGFuZ2VTZWN0aW9uLgorICB2b2lkIFN3aXRjaFNlY3Rpb25Ob0NoYW5nZShNQ1NlY3Rpb24gKlNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRXhwciAqU3Vic2VjdGlvbiA9IG51bGxwdHIpIHsKKyAgICBhc3NlcnQoU2VjdGlvbiAmJiAiQ2Fubm90IHN3aXRjaCB0byBhIG51bGwgc2VjdGlvbiEiKTsKKyAgICBNQ1NlY3Rpb25TdWJQYWlyIGN1clNlY3Rpb24gPSBTZWN0aW9uU3RhY2suYmFjaygpLmZpcnN0OworICAgIFNlY3Rpb25TdGFjay5iYWNrKCkuc2Vjb25kID0gY3VyU2VjdGlvbjsKKyAgICBpZiAoTUNTZWN0aW9uU3ViUGFpcihTZWN0aW9uLCBTdWJzZWN0aW9uKSAhPSBjdXJTZWN0aW9uKQorICAgICAgU2VjdGlvblN0YWNrLmJhY2soKS5maXJzdCA9IE1DU2VjdGlvblN1YlBhaXIoU2VjdGlvbiwgU3Vic2VjdGlvbik7CisgIH0KKworICAvLy8gXGJyaWVmIENyZWF0ZSB0aGUgZGVmYXVsdCBzZWN0aW9ucyBhbmQgc2V0IHRoZSBpbml0aWFsIG9uZS4KKyAgdmlydHVhbCB2b2lkIEluaXRTZWN0aW9ucyhib29sIE5vRXhlY1N0YWNrKTsKKworICBNQ1N5bWJvbCAqZW5kU2VjdGlvbihNQ1NlY3Rpb24gKlNlY3Rpb24pOworCisgIC8vLyBcYnJpZWYgU2V0cyB0aGUgc3ltYm9sJ3Mgc2VjdGlvbi4KKyAgLy8vCisgIC8vLyBFYWNoIGVtaXR0ZWQgc3ltYm9sIHdpbGwgYmUgdHJhY2tlZCBpbiB0aGUgb3JkZXJpbmcgdGFibGUsCisgIC8vLyBzbyB3ZSBjYW4gc29ydCBvbiB0aGVtIGxhdGVyLgorICB2b2lkIEFzc2lnbkZyYWdtZW50KE1DU3ltYm9sICpTeW1ib2wsIE1DRnJhZ21lbnQgKkZyYWdtZW50KTsKKworICAvLy8gXGJyaWVmIEVtaXQgYSBsYWJlbCBmb3IgXHAgU3ltYm9sIGludG8gdGhlIGN1cnJlbnQgc2VjdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIGNvcnJlc3BvbmRzIHRvIGFuIGFzc2VtYmxlciBzdGF0ZW1lbnQgc3VjaCBhczoKKyAgLy8vICAgZm9vOgorICAvLy8KKyAgLy8vIFxwYXJhbSBTeW1ib2wgLSBUaGUgc3ltYm9sIHRvIGVtaXQuIEEgZ2l2ZW4gc3ltYm9sIHNob3VsZCBvbmx5IGJlCisgIC8vLyBlbWl0dGVkIGFzIGEgbGFiZWwgb25jZSwgYW5kIHN5bWJvbHMgZW1pdHRlZCBhcyBhIGxhYmVsIHNob3VsZCBuZXZlciBiZQorICAvLy8gdXNlZCBpbiBhbiBhc3NpZ25tZW50LgorICAvLyBGSVhNRTogVGhlc2UgZW1pc3Npb24gYXJlIG5vbi1jb25zdCBiZWNhdXNlIHdlIG11dGF0ZSB0aGUgc3ltYm9sIHRvCisgIC8vIGFkZCB0aGUgc2VjdGlvbiB3ZSdyZSBlbWl0dGluZyBpdCB0byBsYXRlci4KKyAgdmlydHVhbCB2b2lkIEVtaXRMYWJlbChNQ1N5bWJvbCAqU3ltYm9sLCBTTUxvYyBMb2MgPSBTTUxvYygpKTsKKworICB2aXJ0dWFsIHZvaWQgRW1pdEVIU3ltQXR0cmlidXRlcyhjb25zdCBNQ1N5bWJvbCAqU3ltYm9sLCBNQ1N5bWJvbCAqRUhTeW1ib2wpOworCisgIC8vLyBcYnJpZWYgTm90ZSBpbiB0aGUgb3V0cHV0IHRoZSBzcGVjaWZpZWQgXHAgRmxhZy4KKyAgdmlydHVhbCB2b2lkIEVtaXRBc3NlbWJsZXJGbGFnKE1DQXNzZW1ibGVyRmxhZyBGbGFnKTsKKworICAvLy8gXGJyaWVmIEVtaXQgdGhlIGdpdmVuIGxpc3QgXHAgT3B0aW9ucyBvZiBzdHJpbmdzIGFzIGxpbmtlcgorICAvLy8gb3B0aW9ucyBpbnRvIHRoZSBvdXRwdXQuCisgIHZpcnR1YWwgdm9pZCBFbWl0TGlua2VyT3B0aW9ucyhBcnJheVJlZjxzdGQ6OnN0cmluZz4gS2luZCkge30KKworICAvLy8gXGJyaWVmIE5vdGUgaW4gdGhlIG91dHB1dCB0aGUgc3BlY2lmaWVkIHJlZ2lvbiBccCBLaW5kLgorICB2aXJ0dWFsIHZvaWQgRW1pdERhdGFSZWdpb24oTUNEYXRhUmVnaW9uVHlwZSBLaW5kKSB7fQorCisgIC8vLyBcYnJpZWYgU3BlY2lmeSB0aGUgTWFjaC1PIG1pbmltdW0gZGVwbG95bWVudCB0YXJnZXQgdmVyc2lvbi4KKyAgdmlydHVhbCB2b2lkIEVtaXRWZXJzaW9uTWluKE1DVmVyc2lvbk1pblR5cGUgVHlwZSwgdW5zaWduZWQgTWFqb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNaW5vciwgdW5zaWduZWQgVXBkYXRlKSB7fQorCisgIC8vLyBFbWl0L1NwZWNpZnkgTWFjaC1PIGJ1aWxkIHZlcnNpb24gY29tbWFuZC4KKyAgLy8vIFxwIFBsYXRmb3JtIHNob3VsZCBiZSBvbmUgb2YgTWFjaE86OlBsYXRmb3JtVHlwZS4KKyAgdmlydHVhbCB2b2lkIEVtaXRCdWlsZFZlcnNpb24odW5zaWduZWQgUGxhdGZvcm0sIHVuc2lnbmVkIE1ham9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNaW5vciwgdW5zaWduZWQgVXBkYXRlKSB7fQorCisgIHZvaWQgRW1pdFZlcnNpb25Gb3JUYXJnZXQoY29uc3QgVHJpcGxlICZUYXJnZXQpOworCisgIC8vLyBcYnJpZWYgTm90ZSBpbiB0aGUgb3V0cHV0IHRoYXQgdGhlIHNwZWNpZmllZCBccCBGdW5jIGlzIGEgVGh1bWIgbW9kZQorICAvLy8gZnVuY3Rpb24gKEFSTSB0YXJnZXQgb25seSkuCisgIHZpcnR1YWwgdm9pZCBFbWl0VGh1bWJGdW5jKE1DU3ltYm9sICpGdW5jKTsKKworICAvLy8gXGJyaWVmIEVtaXQgYW4gYXNzaWdubWVudCBvZiBccCBWYWx1ZSB0byBccCBTeW1ib2wuCisgIC8vLworICAvLy8gVGhpcyBjb3JyZXNwb25kcyB0byBhbiBhc3NlbWJsZXIgc3RhdGVtZW50IHN1Y2ggYXM6CisgIC8vLyAgc3ltYm9sID0gdmFsdWUKKyAgLy8vCisgIC8vLyBUaGUgYXNzaWdubWVudCBnZW5lcmF0ZXMgbm8gY29kZSwgYnV0IGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgYmluZGluZyB0aGUKKyAgLy8vIHZhbHVlIGluIHRoZSBjdXJyZW50IGNvbnRleHQuIEZvciB0aGUgYXNzZW1ibHkgc3RyZWFtZXIsIHRoaXMgcHJpbnRzIHRoZQorICAvLy8gYmluZGluZyBpbnRvIHRoZSAucyBmaWxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTeW1ib2wgLSBUaGUgc3ltYm9sIGJlaW5nIGFzc2lnbmVkIHRvLgorICAvLy8gXHBhcmFtIFZhbHVlIC0gVGhlIHZhbHVlIGZvciB0aGUgc3ltYm9sLgorICB2aXJ0dWFsIHZvaWQgRW1pdEFzc2lnbm1lbnQoTUNTeW1ib2wgKlN5bWJvbCwgY29uc3QgTUNFeHByICpWYWx1ZSk7CisKKyAgLy8vIFxicmllZiBFbWl0IGFuIHdlYWsgcmVmZXJlbmNlIGZyb20gXHAgQWxpYXMgdG8gXHAgU3ltYm9sLgorICAvLy8KKyAgLy8vIFRoaXMgY29ycmVzcG9uZHMgdG8gYW4gYXNzZW1ibGVyIHN0YXRlbWVudCBzdWNoIGFzOgorICAvLy8gIC53ZWFrcmVmIGFsaWFzLCBzeW1ib2wKKyAgLy8vCisgIC8vLyBccGFyYW0gQWxpYXMgLSBUaGUgYWxpYXMgdGhhdCBpcyBiZWluZyBjcmVhdGVkLgorICAvLy8gXHBhcmFtIFN5bWJvbCAtIFRoZSBzeW1ib2wgYmVpbmcgYWxpYXNlZC4KKyAgdmlydHVhbCB2b2lkIEVtaXRXZWFrUmVmZXJlbmNlKE1DU3ltYm9sICpBbGlhcywgY29uc3QgTUNTeW1ib2wgKlN5bWJvbCk7CisKKyAgLy8vIFxicmllZiBBZGQgdGhlIGdpdmVuIFxwIEF0dHJpYnV0ZSB0byBccCBTeW1ib2wuCisgIHZpcnR1YWwgYm9vbCBFbWl0U3ltYm9sQXR0cmlidXRlKE1DU3ltYm9sICpTeW1ib2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU3ltYm9sQXR0ciBBdHRyaWJ1dGUpID0gMDsKKworICAvLy8gXGJyaWVmIFNldCB0aGUgXHAgRGVzY1ZhbHVlIGZvciB0aGUgXHAgU3ltYm9sLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTeW1ib2wgLSBUaGUgc3ltYm9sIHRvIGhhdmUgaXRzIG5fZGVzYyBmaWVsZCBzZXQuCisgIC8vLyBccGFyYW0gRGVzY1ZhbHVlIC0gVGhlIHZhbHVlIHRvIHNldCBpbnRvIHRoZSBuX2Rlc2MgZmllbGQuCisgIHZpcnR1YWwgdm9pZCBFbWl0U3ltYm9sRGVzYyhNQ1N5bWJvbCAqU3ltYm9sLCB1bnNpZ25lZCBEZXNjVmFsdWUpOworCisgIC8vLyBcYnJpZWYgU3RhcnQgZW1pdHRpbmcgQ09GRiBzeW1ib2wgZGVmaW5pdGlvbgorICAvLy8KKyAgLy8vIFxwYXJhbSBTeW1ib2wgLSBUaGUgc3ltYm9sIHRvIGhhdmUgaXRzIEV4dGVybmFsICYgVHlwZSBmaWVsZHMgc2V0LgorICB2aXJ0dWFsIHZvaWQgQmVnaW5DT0ZGU3ltYm9sRGVmKGNvbnN0IE1DU3ltYm9sICpTeW1ib2wpOworCisgIC8vLyBcYnJpZWYgRW1pdCB0aGUgc3RvcmFnZSBjbGFzcyBvZiB0aGUgc3ltYm9sLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTdG9yYWdlQ2xhc3MgLSBUaGUgc3RvcmFnZSBjbGFzcyB0aGUgc3ltYm9sIHNob3VsZCBoYXZlLgorICB2aXJ0dWFsIHZvaWQgRW1pdENPRkZTeW1ib2xTdG9yYWdlQ2xhc3MoaW50IFN0b3JhZ2VDbGFzcyk7CisKKyAgLy8vIFxicmllZiBFbWl0IHRoZSB0eXBlIG9mIHRoZSBzeW1ib2wuCisgIC8vLworICAvLy8gXHBhcmFtIFR5cGUgLSBBIENPRkYgdHlwZSBpZGVudGlmaWVyIChzZWUgQ09GRjo6U3ltYm9sVHlwZSBpbiBYODZDT0ZGLmgpCisgIHZpcnR1YWwgdm9pZCBFbWl0Q09GRlN5bWJvbFR5cGUoaW50IFR5cGUpOworCisgIC8vLyBcYnJpZWYgTWFya3MgdGhlIGVuZCBvZiB0aGUgc3ltYm9sIGRlZmluaXRpb24uCisgIHZpcnR1YWwgdm9pZCBFbmRDT0ZGU3ltYm9sRGVmKCk7CisKKyAgdmlydHVhbCB2b2lkIEVtaXRDT0ZGU2FmZVNFSChNQ1N5bWJvbCBjb25zdCAqU3ltYm9sKTsKKworICAvLy8gXGJyaWVmIEVtaXRzIHRoZSBzeW1ib2wgdGFibGUgaW5kZXggb2YgYSBTeW1ib2wgaW50byB0aGUgY3VycmVudCBzZWN0aW9uLgorICB2aXJ0dWFsIHZvaWQgRW1pdENPRkZTeW1ib2xJbmRleChNQ1N5bWJvbCBjb25zdCAqU3ltYm9sKTsKKworICAvLy8gXGJyaWVmIEVtaXRzIGEgQ09GRiBzZWN0aW9uIGluZGV4LgorICAvLy8KKyAgLy8vIFxwYXJhbSBTeW1ib2wgLSBTeW1ib2wgdGhlIHNlY3Rpb24gbnVtYmVyIHJlbG9jYXRpb24gc2hvdWxkIHBvaW50IHRvLgorICB2aXJ0dWFsIHZvaWQgRW1pdENPRkZTZWN0aW9uSW5kZXgoTUNTeW1ib2wgY29uc3QgKlN5bWJvbCk7CisKKyAgLy8vIFxicmllZiBFbWl0cyBhIENPRkYgc2VjdGlvbiByZWxhdGl2ZSByZWxvY2F0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTeW1ib2wgLSBTeW1ib2wgdGhlIHNlY3Rpb24gcmVsYXRpdmUgcmVsb2NhdGlvbiBzaG91bGQgcG9pbnQgdG8uCisgIHZpcnR1YWwgdm9pZCBFbWl0Q09GRlNlY1JlbDMyKE1DU3ltYm9sIGNvbnN0ICpTeW1ib2wsIHVpbnQ2NF90IE9mZnNldCk7CisKKyAgLy8vIFxicmllZiBFbWl0IGFuIEVMRiAuc2l6ZSBkaXJlY3RpdmUuCisgIC8vLworICAvLy8gVGhpcyBjb3JyZXNwb25kcyB0byBhbiBhc3NlbWJsZXIgc3RhdGVtZW50IHN1Y2ggYXM6CisgIC8vLyAgLnNpemUgc3ltYm9sLCBleHByZXNzaW9uCisgIHZpcnR1YWwgdm9pZCBlbWl0RUxGU2l6ZShNQ1N5bWJvbCAqU3ltYm9sLCBjb25zdCBNQ0V4cHIgKlZhbHVlKTsKKworICAvLy8gXGJyaWVmIEVtaXQgYW4gRUxGIC5zeW12ZXIgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFRoaXMgY29ycmVzcG9uZHMgdG8gYW4gYXNzZW1ibGVyIHN0YXRlbWVudCBzdWNoIGFzOgorICAvLy8gIC5zeW12ZXIgX3N0YXJ0LCBmb29AQFNPTUVfVkVSU0lPTgorICAvLy8gXHBhcmFtIEFsaWFzTmFtZSAtIFRoZSB2ZXJzaW9uZWQgYWxpYXMgKGkuZS4gImZvb0BAU09NRV9WRVJTSU9OIikKKyAgLy8vIFxwYXJhbSBBbGlhc2VlIC0gVGhlIGFsaWFzZWQgc3ltYm9sIChpLmUuICJfc3RhcnQiKQorICB2aXJ0dWFsIHZvaWQgZW1pdEVMRlN5bXZlckRpcmVjdGl2ZShTdHJpbmdSZWYgQWxpYXNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqQWxpYXNlZSk7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgTGlua2VyIE9wdGltaXphdGlvbiBIaW50IChMT0gpIGRpcmVjdGl2ZS4KKyAgLy8vIFxwYXJhbSBBcmdzIC0gQXJndW1lbnRzIG9mIHRoZSBMT0guCisgIHZpcnR1YWwgdm9pZCBFbWl0TE9IRGlyZWN0aXZlKE1DTE9IVHlwZSBLaW5kLCBjb25zdCBNQ0xPSEFyZ3MgJkFyZ3MpIHt9CisKKyAgLy8vIFxicmllZiBFbWl0IGEgY29tbW9uIHN5bWJvbC4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3ltYm9sIC0gVGhlIGNvbW1vbiBzeW1ib2wgdG8gZW1pdC4KKyAgLy8vIFxwYXJhbSBTaXplIC0gVGhlIHNpemUgb2YgdGhlIGNvbW1vbiBzeW1ib2wuCisgIC8vLyBccGFyYW0gQnl0ZUFsaWdubWVudCAtIFRoZSBhbGlnbm1lbnQgb2YgdGhlIHN5bWJvbCBpZgorICAvLy8gbm9uLXplcm8uIFRoaXMgbXVzdCBiZSBhIHBvd2VyIG9mIDIuCisgIHZpcnR1YWwgdm9pZCBFbWl0Q29tbW9uU3ltYm9sKE1DU3ltYm9sICpTeW1ib2wsIHVpbnQ2NF90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQpID0gMDsKKworICAvLy8gXGJyaWVmIEVtaXQgYSBsb2NhbCBjb21tb24gKC5sY29tbSkgc3ltYm9sLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTeW1ib2wgLSBUaGUgY29tbW9uIHN5bWJvbCB0byBlbWl0LgorICAvLy8gXHBhcmFtIFNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgY29tbW9uIHN5bWJvbC4KKyAgLy8vIFxwYXJhbSBCeXRlQWxpZ25tZW50IC0gVGhlIGFsaWdubWVudCBvZiB0aGUgY29tbW9uIHN5bWJvbCBpbiBieXRlcy4KKyAgdmlydHVhbCB2b2lkIEVtaXRMb2NhbENvbW1vblN5bWJvbChNQ1N5bWJvbCAqU3ltYm9sLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQpOworCisgIC8vLyBcYnJpZWYgRW1pdCB0aGUgemVyb2ZpbGwgc2VjdGlvbiBhbmQgYW4gb3B0aW9uYWwgc3ltYm9sLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTZWN0aW9uIC0gVGhlIHplcm9maWxsIHNlY3Rpb24gdG8gY3JlYXRlIGFuZCBvciB0byBwdXQgdGhlIHN5bWJvbAorICAvLy8gXHBhcmFtIFN5bWJvbCAtIFRoZSB6ZXJvZmlsbCBzeW1ib2wgdG8gZW1pdCwgaWYgbm9uLU5VTEwuCisgIC8vLyBccGFyYW0gU2l6ZSAtIFRoZSBzaXplIG9mIHRoZSB6ZXJvZmlsbCBzeW1ib2wuCisgIC8vLyBccGFyYW0gQnl0ZUFsaWdubWVudCAtIFRoZSBhbGlnbm1lbnQgb2YgdGhlIHplcm9maWxsIHN5bWJvbCBpZgorICAvLy8gbm9uLXplcm8uIFRoaXMgbXVzdCBiZSBhIHBvd2VyIG9mIDIgb24gc29tZSB0YXJnZXRzLgorICB2aXJ0dWFsIHZvaWQgRW1pdFplcm9maWxsKE1DU2VjdGlvbiAqU2VjdGlvbiwgTUNTeW1ib2wgKlN5bWJvbCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZSA9IDAsIHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQgPSAwKSA9IDA7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgdGhyZWFkIGxvY2FsIGJzcyAoLnRic3MpIHN5bWJvbC4KKyAgLy8vCisgIC8vLyBccGFyYW0gU2VjdGlvbiAtIFRoZSB0aHJlYWQgbG9jYWwgY29tbW9uIHNlY3Rpb24uCisgIC8vLyBccGFyYW0gU3ltYm9sIC0gVGhlIHRocmVhZCBsb2NhbCBjb21tb24gc3ltYm9sIHRvIGVtaXQuCisgIC8vLyBccGFyYW0gU2l6ZSAtIFRoZSBzaXplIG9mIHRoZSBzeW1ib2wuCisgIC8vLyBccGFyYW0gQnl0ZUFsaWdubWVudCAtIFRoZSBhbGlnbm1lbnQgb2YgdGhlIHRocmVhZCBsb2NhbCBjb21tb24gc3ltYm9sCisgIC8vLyBpZiBub24temVyby4gIFRoaXMgbXVzdCBiZSBhIHBvd2VyIG9mIDIgb24gc29tZSB0YXJnZXRzLgorICB2aXJ0dWFsIHZvaWQgRW1pdFRCU1NTeW1ib2woTUNTZWN0aW9uICpTZWN0aW9uLCBNQ1N5bWJvbCAqU3ltYm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZSwgdW5zaWduZWQgQnl0ZUFsaWdubWVudCA9IDApOworCisgIC8vLyBAfQorICAvLy8gXG5hbWUgR2VuZXJhdGluZyBEYXRhCisgIC8vLyBAeworCisgIC8vLyBcYnJpZWYgRW1pdCB0aGUgYnl0ZXMgaW4gXHAgRGF0YSBpbnRvIHRoZSBvdXRwdXQuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCBhc3NlbWJsZXIgZGlyZWN0aXZlcyBzdWNoIGFzIC5ieXRlLCAuYXNjaWksCisgIC8vLyBldGMuCisgIHZpcnR1YWwgdm9pZCBFbWl0Qnl0ZXMoU3RyaW5nUmVmIERhdGEpOworCisgIC8vLyBGdW5jdGlvbmFsbHkgaWRlbnRpY2FsIHRvIEVtaXRCeXRlcy4gV2hlbiBlbWl0dGluZyB0ZXh0dWFsIGFzc2VtYmx5LCB0aGlzCisgIC8vLyBtZXRob2QgdXNlcyAuYnl0ZSBkaXJlY3RpdmVzIGluc3RlYWQgb2YgLmFzY2lpIG9yIC5hc2NpeiBmb3IgcmVhZGFiaWxpdHkuCisgIHZpcnR1YWwgdm9pZCBFbWl0QmluYXJ5RGF0YShTdHJpbmdSZWYgRGF0YSk7CisKKyAgLy8vIFxicmllZiBFbWl0IHRoZSBleHByZXNzaW9uIFxwIFZhbHVlIGludG8gdGhlIG91dHB1dCBhcyBhIG5hdGl2ZQorICAvLy8gaW50ZWdlciBvZiB0aGUgZ2l2ZW4gXHAgU2l6ZSBieXRlcy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IGFzc2VtYmxlciBkaXJlY3RpdmVzIHN1Y2ggYXMgLndvcmQsIC5xdWFkLAorICAvLy8gZXRjLgorICAvLy8KKyAgLy8vIFxwYXJhbSBWYWx1ZSAtIFRoZSB2YWx1ZSB0byBlbWl0LgorICAvLy8gXHBhcmFtIFNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgaW50ZWdlciAoaW4gYnl0ZXMpIHRvIGVtaXQuIFRoaXMgbXVzdAorICAvLy8gbWF0Y2ggYSBuYXRpdmUgbWFjaGluZSB3aWR0aC4KKyAgLy8vIFxwYXJhbSBMb2MgLSBUaGUgbG9jYXRpb24gb2YgdGhlIGV4cHJlc3Npb24gZm9yIGVycm9yIHJlcG9ydGluZy4KKyAgdmlydHVhbCB2b2lkIEVtaXRWYWx1ZUltcGwoY29uc3QgTUNFeHByICpWYWx1ZSwgdW5zaWduZWQgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01Mb2MgTG9jID0gU01Mb2MoKSk7CisKKyAgdm9pZCBFbWl0VmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSwgdW5zaWduZWQgU2l6ZSwgU01Mb2MgTG9jID0gU01Mb2MoKSk7CisKKyAgLy8vIFxicmllZiBTcGVjaWFsIGNhc2Ugb2YgRW1pdFZhbHVlIHRoYXQgYXZvaWRzIHRoZSBjbGllbnQgaGF2aW5nCisgIC8vLyB0byBwYXNzIGluIGEgTUNFeHByIGZvciBjb25zdGFudCBpbnRlZ2Vycy4KKyAgdmlydHVhbCB2b2lkIEVtaXRJbnRWYWx1ZSh1aW50NjRfdCBWYWx1ZSwgdW5zaWduZWQgU2l6ZSk7CisKKyAgdmlydHVhbCB2b2lkIEVtaXRVTEVCMTI4VmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSk7CisKKyAgdmlydHVhbCB2b2lkIEVtaXRTTEVCMTI4VmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSk7CisKKyAgLy8vIFxicmllZiBTcGVjaWFsIGNhc2Ugb2YgRW1pdFVMRUIxMjhWYWx1ZSB0aGF0IGF2b2lkcyB0aGUgY2xpZW50IGhhdmluZyB0bworICAvLy8gcGFzcyBpbiBhIE1DRXhwciBmb3IgY29uc3RhbnQgaW50ZWdlcnMuCisgIHZvaWQgRW1pdFVMRUIxMjhJbnRWYWx1ZSh1aW50NjRfdCBWYWx1ZSk7CisKKyAgLy8vIFxicmllZiBTcGVjaWFsIGNhc2Ugb2YgRW1pdFNMRUIxMjhWYWx1ZSB0aGF0IGF2b2lkcyB0aGUgY2xpZW50IGhhdmluZyB0bworICAvLy8gcGFzcyBpbiBhIE1DRXhwciBmb3IgY29uc3RhbnQgaW50ZWdlcnMuCisgIHZvaWQgRW1pdFNMRUIxMjhJbnRWYWx1ZShpbnQ2NF90IFZhbHVlKTsKKworICAvLy8gXGJyaWVmIFNwZWNpYWwgY2FzZSBvZiBFbWl0VmFsdWUgdGhhdCBhdm9pZHMgdGhlIGNsaWVudCBoYXZpbmcgdG8gcGFzcyBpbgorICAvLy8gYSBNQ0V4cHIgZm9yIE1DU3ltYm9scy4KKyAgdm9pZCBFbWl0U3ltYm9sVmFsdWUoY29uc3QgTUNTeW1ib2wgKlN5bSwgdW5zaWduZWQgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc1NlY3Rpb25SZWxhdGl2ZSA9IGZhbHNlKTsKKworICAvLy8gXGJyaWVmIEVtaXQgdGhlIGV4cHJlc3Npb24gXHAgVmFsdWUgaW50byB0aGUgb3V0cHV0IGFzIGEgZHRwcmVsCisgIC8vLyAoNjQtYml0IERUUCByZWxhdGl2ZSkgdmFsdWUuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCBhc3NlbWJsZXIgZGlyZWN0aXZlcyBzdWNoIGFzIC5kdHByZWxkd29yZCBvbgorICAvLy8gdGFyZ2V0cyB0aGF0IHN1cHBvcnQgdGhlbS4KKyAgdmlydHVhbCB2b2lkIEVtaXREVFBSZWw2NFZhbHVlKGNvbnN0IE1DRXhwciAqVmFsdWUpOworCisgIC8vLyBcYnJpZWYgRW1pdCB0aGUgZXhwcmVzc2lvbiBccCBWYWx1ZSBpbnRvIHRoZSBvdXRwdXQgYXMgYSBkdHByZWwKKyAgLy8vICgzMi1iaXQgRFRQIHJlbGF0aXZlKSB2YWx1ZS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IGFzc2VtYmxlciBkaXJlY3RpdmVzIHN1Y2ggYXMgLmR0cHJlbHdvcmQgb24KKyAgLy8vIHRhcmdldHMgdGhhdCBzdXBwb3J0IHRoZW0uCisgIHZpcnR1YWwgdm9pZCBFbWl0RFRQUmVsMzJWYWx1ZShjb25zdCBNQ0V4cHIgKlZhbHVlKTsKKworICAvLy8gXGJyaWVmIEVtaXQgdGhlIGV4cHJlc3Npb24gXHAgVmFsdWUgaW50byB0aGUgb3V0cHV0IGFzIGEgdHByZWwKKyAgLy8vICg2NC1iaXQgVFAgcmVsYXRpdmUpIHZhbHVlLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgc3VjaCBhcyAudHByZWxkd29yZCBvbgorICAvLy8gdGFyZ2V0cyB0aGF0IHN1cHBvcnQgdGhlbS4KKyAgdmlydHVhbCB2b2lkIEVtaXRUUFJlbDY0VmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSk7CisKKyAgLy8vIFxicmllZiBFbWl0IHRoZSBleHByZXNzaW9uIFxwIFZhbHVlIGludG8gdGhlIG91dHB1dCBhcyBhIHRwcmVsCisgIC8vLyAoMzItYml0IFRQIHJlbGF0aXZlKSB2YWx1ZS4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgdG8gaW1wbGVtZW50IGFzc2VtYmxlciBkaXJlY3RpdmVzIHN1Y2ggYXMgLnRwcmVsd29yZCBvbgorICAvLy8gdGFyZ2V0cyB0aGF0IHN1cHBvcnQgdGhlbS4KKyAgdmlydHVhbCB2b2lkIEVtaXRUUFJlbDMyVmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSk7CisKKyAgLy8vIFxicmllZiBFbWl0IHRoZSBleHByZXNzaW9uIFxwIFZhbHVlIGludG8gdGhlIG91dHB1dCBhcyBhIGdwcmVsNjQgKDY0LWJpdAorICAvLy8gR1AgcmVsYXRpdmUpIHZhbHVlLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgc3VjaCBhcyAuZ3Bkd29yZCBvbgorICAvLy8gdGFyZ2V0cyB0aGF0IHN1cHBvcnQgdGhlbS4KKyAgdmlydHVhbCB2b2lkIEVtaXRHUFJlbDY0VmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSk7CisKKyAgLy8vIFxicmllZiBFbWl0IHRoZSBleHByZXNzaW9uIFxwIFZhbHVlIGludG8gdGhlIG91dHB1dCBhcyBhIGdwcmVsMzIgKDMyLWJpdAorICAvLy8gR1AgcmVsYXRpdmUpIHZhbHVlLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgc3VjaCBhcyAuZ3ByZWwzMiBvbgorICAvLy8gdGFyZ2V0cyB0aGF0IHN1cHBvcnQgdGhlbS4KKyAgdmlydHVhbCB2b2lkIEVtaXRHUFJlbDMyVmFsdWUoY29uc3QgTUNFeHByICpWYWx1ZSk7CisKKyAgLy8vIFxicmllZiBFbWl0IE51bUJ5dGVzIGJ5dGVzIHdvcnRoIG9mIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgRmlsbFZhbHVlLgorICAvLy8gVGhpcyBpbXBsZW1lbnRzIGRpcmVjdGl2ZXMgc3VjaCBhcyAnLnNwYWNlJy4KKyAgdm9pZCBlbWl0RmlsbCh1aW50NjRfdCBOdW1CeXRlcywgdWludDhfdCBGaWxsVmFsdWUpOworCisgIC8vLyBcYnJpZWYgRW1pdCBccCBTaXplIGJ5dGVzIHdvcnRoIG9mIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgXHAgRmlsbFZhbHVlLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgc3VjaCBhcyAuc3BhY2Ugb3IgLnNraXAuCisgIC8vLworICAvLy8gXHBhcmFtIE51bUJ5dGVzIC0gVGhlIG51bWJlciBvZiBieXRlcyB0byBlbWl0LgorICAvLy8gXHBhcmFtIEZpbGxWYWx1ZSAtIFRoZSB2YWx1ZSB0byB1c2Ugd2hlbiBmaWxsaW5nIGJ5dGVzLgorICAvLy8gXHBhcmFtIExvYyAtIFRoZSBsb2NhdGlvbiBvZiB0aGUgZXhwcmVzc2lvbiBmb3IgZXJyb3IgcmVwb3J0aW5nLgorICB2aXJ0dWFsIHZvaWQgZW1pdEZpbGwoY29uc3QgTUNFeHByICZOdW1CeXRlcywgdWludDY0X3QgRmlsbFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgU01Mb2MgTG9jID0gU01Mb2MoKSk7CisKKyAgLy8vIFxicmllZiBFbWl0IFxwIE51bVZhbHVlcyBjb3BpZXMgb2YgXHAgU2l6ZSBieXRlcy4gRWFjaCBccCBTaXplIGJ5dGVzIGlzCisgIC8vLyB0YWtlbiBmcm9tIHRoZSBsb3dlc3Qgb3JkZXIgNCBieXRlcyBvZiBccCBFeHByIGV4cHJlc3Npb24uCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCBhc3NlbWJsZXIgZGlyZWN0aXZlcyBzdWNoIGFzIC5maWxsLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOdW1WYWx1ZXMgLSBUaGUgbnVtYmVyIG9mIGNvcGllcyBvZiBccCBTaXplIGJ5dGVzIHRvIGVtaXQuCisgIC8vLyBccGFyYW0gU2l6ZSAtIFRoZSBzaXplIChpbiBieXRlcykgb2YgZWFjaCByZXBlYXRlZCB2YWx1ZS4KKyAgLy8vIFxwYXJhbSBFeHByIC0gVGhlIGV4cHJlc3Npb24gZnJvbSB3aGljaCBccCBTaXplIGJ5dGVzIGFyZSB1c2VkLgorICB2aXJ0dWFsIHZvaWQgZW1pdEZpbGwoY29uc3QgTUNFeHByICZOdW1WYWx1ZXMsIGludDY0X3QgU2l6ZSwgaW50NjRfdCBFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgU01Mb2MgTG9jID0gU01Mb2MoKSk7CisKKyAgLy8vIFxicmllZiBFbWl0IE51bUJ5dGVzIHdvcnRoIG9mIHplcm9zLgorICAvLy8gVGhpcyBmdW5jdGlvbiBwcm9wZXJseSBoYW5kbGVzIGRhdGEgaW4gdmlydHVhbCBzZWN0aW9ucy4KKyAgdm9pZCBFbWl0WmVyb3ModWludDY0X3QgTnVtQnl0ZXMpOworCisgIC8vLyBcYnJpZWYgRW1pdCBzb21lIG51bWJlciBvZiBjb3BpZXMgb2YgXHAgVmFsdWUgdW50aWwgdGhlIGJ5dGUgYWxpZ25tZW50IFxwCisgIC8vLyBCeXRlQWxpZ25tZW50IGlzIHJlYWNoZWQuCisgIC8vLworICAvLy8gSWYgdGhlIG51bWJlciBvZiBieXRlcyBuZWVkIHRvIGVtaXQgZm9yIHRoZSBhbGlnbm1lbnQgaXMgbm90IGEgbXVsdGlwbGUKKyAgLy8vIG9mIFxwIFZhbHVlU2l6ZSwgdGhlbiB0aGUgY29udGVudHMgb2YgdGhlIGVtaXR0ZWQgZmlsbCBieXRlcyBpcworICAvLy8gdW5kZWZpbmVkLgorICAvLy8KKyAgLy8vIFRoaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIC5hbGlnbiBhc3NlbWJsZXIgZGlyZWN0aXZlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBCeXRlQWxpZ25tZW50IC0gVGhlIGFsaWdubWVudCB0byByZWFjaC4gVGhpcyBtdXN0IGJlIGEgcG93ZXIgb2YKKyAgLy8vIHR3byBvbiBzb21lIHRhcmdldHMuCisgIC8vLyBccGFyYW0gVmFsdWUgLSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gZmlsbGluZyBieXRlcy4KKyAgLy8vIFxwYXJhbSBWYWx1ZVNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgaW50ZWdlciAoaW4gYnl0ZXMpIHRvIGVtaXQgZm9yCisgIC8vLyBccCBWYWx1ZS4gVGhpcyBtdXN0IG1hdGNoIGEgbmF0aXZlIG1hY2hpbmUgd2lkdGguCisgIC8vLyBccGFyYW0gTWF4Qnl0ZXNUb0VtaXQgLSBUaGUgbWF4aW11bSBudW1iZXJzIG9mIGJ5dGVzIHRvIGVtaXQsIG9yIDAuIElmCisgIC8vLyB0aGUgYWxpZ25tZW50IGNhbm5vdCBiZSByZWFjaGVkIGluIHRoaXMgbWFueSBieXRlcywgbm8gYnl0ZXMgYXJlCisgIC8vLyBlbWl0dGVkLgorICB2aXJ0dWFsIHZvaWQgRW1pdFZhbHVlVG9BbGlnbm1lbnQodW5zaWduZWQgQnl0ZUFsaWdubWVudCwgaW50NjRfdCBWYWx1ZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWYWx1ZVNpemUgPSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWF4Qnl0ZXNUb0VtaXQgPSAwKTsKKworICAvLy8gXGJyaWVmIEVtaXQgbm9wcyB1bnRpbCB0aGUgYnl0ZSBhbGlnbm1lbnQgXHAgQnl0ZUFsaWdubWVudCBpcyByZWFjaGVkLgorICAvLy8KKyAgLy8vIFRoaXMgdXNlZCB0byBhbGlnbiBjb2RlIHdoZXJlIHRoZSBhbGlnbm1lbnQgYnl0ZXMgbWF5IGJlIGV4ZWN1dGVkLiAgVGhpcworICAvLy8gY2FuIGVtaXQgZGlmZmVyZW50IGJ5dGVzIGZvciBkaWZmZXJlbnQgc2l6ZXMgdG8gb3B0aW1pemUgZXhlY3V0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBCeXRlQWxpZ25tZW50IC0gVGhlIGFsaWdubWVudCB0byByZWFjaC4gVGhpcyBtdXN0IGJlIGEgcG93ZXIgb2YKKyAgLy8vIHR3byBvbiBzb21lIHRhcmdldHMuCisgIC8vLyBccGFyYW0gTWF4Qnl0ZXNUb0VtaXQgLSBUaGUgbWF4aW11bSBudW1iZXJzIG9mIGJ5dGVzIHRvIGVtaXQsIG9yIDAuIElmCisgIC8vLyB0aGUgYWxpZ25tZW50IGNhbm5vdCBiZSByZWFjaGVkIGluIHRoaXMgbWFueSBieXRlcywgbm8gYnl0ZXMgYXJlCisgIC8vLyBlbWl0dGVkLgorICB2aXJ0dWFsIHZvaWQgRW1pdENvZGVBbGlnbm1lbnQodW5zaWduZWQgQnl0ZUFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1heEJ5dGVzVG9FbWl0ID0gMCk7CisKKyAgLy8vIFxicmllZiBFbWl0IHNvbWUgbnVtYmVyIG9mIGNvcGllcyBvZiBccCBWYWx1ZSB1bnRpbCB0aGUgYnl0ZSBvZmZzZXQgXHAKKyAgLy8vIE9mZnNldCBpcyByZWFjaGVkLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgYXNzZW1ibGVyIGRpcmVjdGl2ZXMgc3VjaCBhcyAub3JnLgorICAvLy8KKyAgLy8vIFxwYXJhbSBPZmZzZXQgLSBUaGUgb2Zmc2V0IHRvIHJlYWNoLiBUaGlzIG1heSBiZSBhbiBleHByZXNzaW9uLCBidXQgdGhlCisgIC8vLyBleHByZXNzaW9uIG11c3QgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBjdXJyZW50IHNlY3Rpb24uCisgIC8vLyBccGFyYW0gVmFsdWUgLSBUaGUgdmFsdWUgdG8gdXNlIHdoZW4gZmlsbGluZyBieXRlcy4KKyAgdmlydHVhbCB2b2lkIGVtaXRWYWx1ZVRvT2Zmc2V0KGNvbnN0IE1DRXhwciAqT2Zmc2V0LCB1bnNpZ25lZCBjaGFyIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU01Mb2MgTG9jKTsKKworICB2aXJ0dWFsIHZvaWQKKyAgRW1pdENvZGVQYWRkaW5nQmFzaWNCbG9ja1N0YXJ0KGNvbnN0IE1DQ29kZVBhZGRpbmdDb250ZXh0ICZDb250ZXh0KSB7fQorCisgIHZpcnR1YWwgdm9pZAorICBFbWl0Q29kZVBhZGRpbmdCYXNpY0Jsb2NrRW5kKGNvbnN0IE1DQ29kZVBhZGRpbmdDb250ZXh0ICZDb250ZXh0KSB7fQorCisgIC8vLyBAfQorCisgIC8vLyBcYnJpZWYgU3dpdGNoIHRvIGEgbmV3IGxvZ2ljYWwgZmlsZS4gIFRoaXMgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlICcuZmlsZQorICAvLy8gImZvby5jIicgYXNzZW1ibGVyIGRpcmVjdGl2ZS4KKyAgdmlydHVhbCB2b2lkIEVtaXRGaWxlRGlyZWN0aXZlKFN0cmluZ1JlZiBGaWxlbmFtZSk7CisKKyAgLy8vIFxicmllZiBFbWl0IHRoZSAiaWRlbnRpZmllcnMiIGRpcmVjdGl2ZS4gIFRoaXMgaW1wbGVtZW50cyB0aGUKKyAgLy8vICcuaWRlbnQgInZlcnNpb24gZm9vIicgYXNzZW1ibGVyIGRpcmVjdGl2ZS4KKyAgdmlydHVhbCB2b2lkIEVtaXRJZGVudChTdHJpbmdSZWYgSWRlbnRTdHJpbmcpIHt9CisKKyAgLy8vIFxicmllZiBBc3NvY2lhdGUgYSBmaWxlbmFtZSB3aXRoIGEgc3BlY2lmaWVkIGxvZ2ljYWwgZmlsZSBudW1iZXIuICBUaGlzCisgIC8vLyBpbXBsZW1lbnRzIHRoZSBEV0FSRjIgJy5maWxlIDQgImZvby5jIicgYXNzZW1ibGVyIGRpcmVjdGl2ZS4KKyAgdW5zaWduZWQgRW1pdER3YXJmRmlsZURpcmVjdGl2ZSh1bnNpZ25lZCBGaWxlTm8sIFN0cmluZ1JlZiBEaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ENTo6TUQ1UmVzdWx0ICpDaGVja3N1bSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8U3RyaW5nUmVmPiBTb3VyY2UgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIENVSUQgPSAwKSB7CisgICAgcmV0dXJuIGNhbnRGYWlsKAorICAgICAgICB0cnlFbWl0RHdhcmZGaWxlRGlyZWN0aXZlKEZpbGVObywgRGlyZWN0b3J5LCBGaWxlbmFtZSwgQ2hlY2tzdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlLCBDVUlEKSk7CisgIH0KKworICAvLy8gQXNzb2NpYXRlIGEgZmlsZW5hbWUgd2l0aCBhIHNwZWNpZmllZCBsb2dpY2FsIGZpbGUgbnVtYmVyLgorICAvLy8gQWxzbyBhc3NvY2lhdGUgYSBkaXJlY3RvcnksIG9wdGlvbmFsIGNoZWNrc3VtLCBhbmQgb3B0aW9uYWwgc291cmNlCisgIC8vLyB0ZXh0IHdpdGggdGhlIGxvZ2ljYWwgZmlsZS4gIFRoaXMgaW1wbGVtZW50cyB0aGUgRFdBUkYyCisgIC8vLyAnLmZpbGUgNCAiZGlyL2Zvby5jIicgYXNzZW1ibGVyIGRpcmVjdGl2ZSwgYW5kIHRoZSBEV0FSRjUKKyAgLy8vICcuZmlsZSA0ICJkaXIvZm9vLmMiIG1kNSAiLi4uIiBzb3VyY2UgIi4uLiInIGFzc2VtYmxlciBkaXJlY3RpdmUuCisgIHZpcnR1YWwgRXhwZWN0ZWQ8dW5zaWduZWQ+IHRyeUVtaXREd2FyZkZpbGVEaXJlY3RpdmUoCisgICAgICB1bnNpZ25lZCBGaWxlTm8sIFN0cmluZ1JlZiBEaXJlY3RvcnksIFN0cmluZ1JlZiBGaWxlbmFtZSwKKyAgICAgIE1ENTo6TUQ1UmVzdWx0ICpDaGVja3N1bSA9IG51bGxwdHIsIE9wdGlvbmFsPFN0cmluZ1JlZj4gU291cmNlID0gTm9uZSwKKyAgICAgIHVuc2lnbmVkIENVSUQgPSAwKTsKKworICAvLy8gU3BlY2lmeSB0aGUgInJvb3QiIGZpbGUgb2YgdGhlIGNvbXBpbGF0aW9uLCB1c2luZyB0aGUgIi5maWxlIDAiIGV4dGVuc2lvbi4KKyAgdmlydHVhbCB2b2lkIGVtaXREd2FyZkZpbGUwRGlyZWN0aXZlKFN0cmluZ1JlZiBEaXJlY3RvcnksIFN0cmluZ1JlZiBGaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ENTo6TUQ1UmVzdWx0ICpDaGVja3N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPFN0cmluZ1JlZj4gU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ1VJRCA9IDApOworCisgIC8vLyBcYnJpZWYgVGhpcyBpbXBsZW1lbnRzIHRoZSBEV0FSRjIgJy5sb2MgZmlsZW5vIGxpbmVubyAuLi4nIGFzc2VtYmxlcgorICAvLy8gZGlyZWN0aXZlLgorICB2aXJ0dWFsIHZvaWQgRW1pdER3YXJmTG9jRGlyZWN0aXZlKHVuc2lnbmVkIEZpbGVObywgdW5zaWduZWQgTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb2x1bW4sIHVuc2lnbmVkIEZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIElzYSwgdW5zaWduZWQgRGlzY3JpbWluYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmlsZU5hbWUpOworCisgIC8vLyBBc3NvY2lhdGUgYSBmaWxlbmFtZSB3aXRoIGEgc3BlY2lmaWVkIGxvZ2ljYWwgZmlsZSBudW1iZXIsIGFuZCBhbHNvCisgIC8vLyBzcGVjaWZ5IHRoYXQgZmlsZSdzIGNoZWNrc3VtIGluZm9ybWF0aW9uLiAgVGhpcyBpbXBsZW1lbnRzIHRoZSAnLmN2X2ZpbGUgNAorICAvLy8gImZvby5jIicgYXNzZW1ibGVyIGRpcmVjdGl2ZS4gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCisgIHZpcnR1YWwgYm9vbCBFbWl0Q1ZGaWxlRGlyZWN0aXZlKHVuc2lnbmVkIEZpbGVObywgU3RyaW5nUmVmIEZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiBDaGVja3N1bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ2hlY2tzdW1LaW5kKTsKKworICAvLy8gXGJyaWVmIEludHJvZHVjZXMgYSBmdW5jdGlvbiBpZCBmb3IgdXNlIHdpdGggLmN2X2xvYy4KKyAgdmlydHVhbCBib29sIEVtaXRDVkZ1bmNJZERpcmVjdGl2ZSh1bnNpZ25lZCBGdW5jdGlvbklkKTsKKworICAvLy8gXGJyaWVmIEludHJvZHVjZXMgYW4gaW5saW5lIGNhbGwgc2l0ZSBpZCBmb3IgdXNlIHdpdGggLmN2X2xvYy4gSW5jbHVkZXMKKyAgLy8vIGV4dHJhIGluZm9ybWF0aW9uIGZvciBpbmxpbmUgbGluZSB0YWJsZSBnZW5lcmF0aW9uLgorICB2aXJ0dWFsIGJvb2wgRW1pdENWSW5saW5lU2l0ZUlkRGlyZWN0aXZlKHVuc2lnbmVkIEZ1bmN0aW9uSWQsIHVuc2lnbmVkIElBRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJQUZpbGUsIHVuc2lnbmVkIElBTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJQUNvbCwgU01Mb2MgTG9jKTsKKworICAvLy8gXGJyaWVmIFRoaXMgaW1wbGVtZW50cyB0aGUgQ29kZVZpZXcgJy5jdl9sb2MnIGFzc2VtYmxlciBkaXJlY3RpdmUuCisgIHZpcnR1YWwgdm9pZCBFbWl0Q1ZMb2NEaXJlY3RpdmUodW5zaWduZWQgRnVuY3Rpb25JZCwgdW5zaWduZWQgRmlsZU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExpbmUsIHVuc2lnbmVkIENvbHVtbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFByb2xvZ3VlRW5kLCBib29sIElzU3RtdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmlsZU5hbWUsIFNNTG9jIExvYyk7CisKKyAgLy8vIFxicmllZiBUaGlzIGltcGxlbWVudHMgdGhlIENvZGVWaWV3ICcuY3ZfbGluZXRhYmxlJyBhc3NlbWJsZXIgZGlyZWN0aXZlLgorICB2aXJ0dWFsIHZvaWQgRW1pdENWTGluZXRhYmxlRGlyZWN0aXZlKHVuc2lnbmVkIEZ1bmN0aW9uSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKkZuU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2wgKkZuRW5kKTsKKworICAvLy8gXGJyaWVmIFRoaXMgaW1wbGVtZW50cyB0aGUgQ29kZVZpZXcgJy5jdl9pbmxpbmVfbGluZXRhYmxlJyBhc3NlbWJsZXIKKyAgLy8vIGRpcmVjdGl2ZS4KKyAgdmlydHVhbCB2b2lkIEVtaXRDVklubGluZUxpbmV0YWJsZURpcmVjdGl2ZSh1bnNpZ25lZCBQcmltYXJ5RnVuY3Rpb25JZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTb3VyY2VGaWxlSWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU291cmNlTGluZU51bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqRm5TdGFydFN5bSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqRm5FbmRTeW0pOworCisgIC8vLyBcYnJpZWYgVGhpcyBpbXBsZW1lbnRzIHRoZSBDb2RlVmlldyAnLmN2X2RlZl9yYW5nZScgYXNzZW1ibGVyCisgIC8vLyBkaXJlY3RpdmUuCisgIHZpcnR1YWwgdm9pZCBFbWl0Q1ZEZWZSYW5nZURpcmVjdGl2ZSgKKyAgICAgIEFycmF5UmVmPHN0ZDo6cGFpcjxjb25zdCBNQ1N5bWJvbCAqLCBjb25zdCBNQ1N5bWJvbCAqPj4gUmFuZ2VzLAorICAgICAgU3RyaW5nUmVmIEZpeGVkU2l6ZVBvcnRpb24pOworCisgIC8vLyBcYnJpZWYgVGhpcyBpbXBsZW1lbnRzIHRoZSBDb2RlVmlldyAnLmN2X3N0cmluZ3RhYmxlJyBhc3NlbWJsZXIgZGlyZWN0aXZlLgorICB2aXJ0dWFsIHZvaWQgRW1pdENWU3RyaW5nVGFibGVEaXJlY3RpdmUoKSB7fQorCisgIC8vLyBcYnJpZWYgVGhpcyBpbXBsZW1lbnRzIHRoZSBDb2RlVmlldyAnLmN2X2ZpbGVjaGVja3N1bXMnIGFzc2VtYmxlciBkaXJlY3RpdmUuCisgIHZpcnR1YWwgdm9pZCBFbWl0Q1ZGaWxlQ2hlY2tzdW1zRGlyZWN0aXZlKCkge30KKworICAvLy8gVGhpcyBpbXBsZW1lbnRzIHRoZSBDb2RlVmlldyAnLmN2X2ZpbGVjaGVja3N1bW9mZnNldCcgYXNzZW1ibGVyCisgIC8vLyBkaXJlY3RpdmUuCisgIHZpcnR1YWwgdm9pZCBFbWl0Q1ZGaWxlQ2hlY2tzdW1PZmZzZXREaXJlY3RpdmUodW5zaWduZWQgRmlsZU5vKSB7fQorCisgIC8vLyBUaGlzIGltcGxlbWVudHMgdGhlIENvZGVWaWV3ICcuY3ZfZnBvX2RhdGEnIGFzc2VtYmxlciBkaXJlY3RpdmUuCisgIHZpcnR1YWwgdm9pZCBFbWl0Q1ZGUE9EYXRhKGNvbnN0IE1DU3ltYm9sICpQcm9jU3ltLCBTTUxvYyBMb2MgPSB7fSkge30KKworICAvLy8gRW1pdCB0aGUgYWJzb2x1dGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHR3byBzeW1ib2xzLgorICAvLy8KKyAgLy8vIFxwcmUgT2Zmc2V0IG9mIFxjIEhpIGlzIGdyZWF0ZXIgdGhhbiB0aGUgb2Zmc2V0IFxjIExvLgorICB2aXJ0dWFsIHZvaWQgZW1pdEFic29sdXRlU3ltYm9sRGlmZihjb25zdCBNQ1N5bWJvbCAqSGksIGNvbnN0IE1DU3ltYm9sICpMbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZSk7CisKKyAgLy8vIEVtaXQgdGhlIGFic29sdXRlIGRpZmZlcmVuY2UgYmV0d2VlbiB0d28gc3ltYm9scyBlbmNvZGVkIHdpdGggVUxFQjEyOC4KKyAgdmlydHVhbCB2b2lkIGVtaXRBYnNvbHV0ZVN5bWJvbERpZmZBc1VMRUIxMjgoY29uc3QgTUNTeW1ib2wgKkhpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqTG8pOworCisgIHZpcnR1YWwgTUNTeW1ib2wgKmdldER3YXJmTGluZVRhYmxlU3ltYm9sKHVuc2lnbmVkIENVSUQpOworICB2aXJ0dWFsIHZvaWQgRW1pdENGSVNlY3Rpb25zKGJvb2wgRUgsIGJvb2wgRGVidWcpOworICB2b2lkIEVtaXRDRklTdGFydFByb2MoYm9vbCBJc1NpbXBsZSk7CisgIHZvaWQgRW1pdENGSUVuZFByb2MoKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRDRklEZWZDZmEoaW50NjRfdCBSZWdpc3RlciwgaW50NjRfdCBPZmZzZXQpOworICB2aXJ0dWFsIHZvaWQgRW1pdENGSURlZkNmYU9mZnNldChpbnQ2NF90IE9mZnNldCk7CisgIHZpcnR1YWwgdm9pZCBFbWl0Q0ZJRGVmQ2ZhUmVnaXN0ZXIoaW50NjRfdCBSZWdpc3Rlcik7CisgIHZpcnR1YWwgdm9pZCBFbWl0Q0ZJT2Zmc2V0KGludDY0X3QgUmVnaXN0ZXIsIGludDY0X3QgT2Zmc2V0KTsKKyAgdmlydHVhbCB2b2lkIEVtaXRDRklQZXJzb25hbGl0eShjb25zdCBNQ1N5bWJvbCAqU3ltLCB1bnNpZ25lZCBFbmNvZGluZyk7CisgIHZpcnR1YWwgdm9pZCBFbWl0Q0ZJTHNkYShjb25zdCBNQ1N5bWJvbCAqU3ltLCB1bnNpZ25lZCBFbmNvZGluZyk7CisgIHZpcnR1YWwgdm9pZCBFbWl0Q0ZJUmVtZW1iZXJTdGF0ZSgpOworICB2aXJ0dWFsIHZvaWQgRW1pdENGSVJlc3RvcmVTdGF0ZSgpOworICB2aXJ0dWFsIHZvaWQgRW1pdENGSVNhbWVWYWx1ZShpbnQ2NF90IFJlZ2lzdGVyKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRDRklSZXN0b3JlKGludDY0X3QgUmVnaXN0ZXIpOworICB2aXJ0dWFsIHZvaWQgRW1pdENGSVJlbE9mZnNldChpbnQ2NF90IFJlZ2lzdGVyLCBpbnQ2NF90IE9mZnNldCk7CisgIHZpcnR1YWwgdm9pZCBFbWl0Q0ZJQWRqdXN0Q2ZhT2Zmc2V0KGludDY0X3QgQWRqdXN0bWVudCk7CisgIHZpcnR1YWwgdm9pZCBFbWl0Q0ZJRXNjYXBlKFN0cmluZ1JlZiBWYWx1ZXMpOworICB2aXJ0dWFsIHZvaWQgRW1pdENGSVJldHVybkNvbHVtbihpbnQ2NF90IFJlZ2lzdGVyKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRDRklHbnVBcmdzU2l6ZShpbnQ2NF90IFNpemUpOworICB2aXJ0dWFsIHZvaWQgRW1pdENGSVNpZ25hbEZyYW1lKCk7CisgIHZpcnR1YWwgdm9pZCBFbWl0Q0ZJVW5kZWZpbmVkKGludDY0X3QgUmVnaXN0ZXIpOworICB2aXJ0dWFsIHZvaWQgRW1pdENGSVJlZ2lzdGVyKGludDY0X3QgUmVnaXN0ZXIxLCBpbnQ2NF90IFJlZ2lzdGVyMik7CisgIHZpcnR1YWwgdm9pZCBFbWl0Q0ZJV2luZG93U2F2ZSgpOworCisgIHZpcnR1YWwgdm9pZCBFbWl0V2luQ0ZJU3RhcnRQcm9jKGNvbnN0IE1DU3ltYm9sICpTeW1ib2wsIFNNTG9jIExvYyA9IFNNTG9jKCkpOworICB2aXJ0dWFsIHZvaWQgRW1pdFdpbkNGSUVuZFByb2MoU01Mb2MgTG9jID0gU01Mb2MoKSk7CisgIHZpcnR1YWwgdm9pZCBFbWl0V2luQ0ZJU3RhcnRDaGFpbmVkKFNNTG9jIExvYyA9IFNNTG9jKCkpOworICB2aXJ0dWFsIHZvaWQgRW1pdFdpbkNGSUVuZENoYWluZWQoU01Mb2MgTG9jID0gU01Mb2MoKSk7CisgIHZpcnR1YWwgdm9pZCBFbWl0V2luQ0ZJUHVzaFJlZyh1bnNpZ25lZCBSZWdpc3RlciwgU01Mb2MgTG9jID0gU01Mb2MoKSk7CisgIHZpcnR1YWwgdm9pZCBFbWl0V2luQ0ZJU2V0RnJhbWUodW5zaWduZWQgUmVnaXN0ZXIsIHVuc2lnbmVkIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUxvYyBMb2MgPSBTTUxvYygpKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRXaW5DRklBbGxvY1N0YWNrKHVuc2lnbmVkIFNpemUsIFNNTG9jIExvYyA9IFNNTG9jKCkpOworICB2aXJ0dWFsIHZvaWQgRW1pdFdpbkNGSVNhdmVSZWcodW5zaWduZWQgUmVnaXN0ZXIsIHVuc2lnbmVkIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNTG9jIExvYyA9IFNNTG9jKCkpOworICB2aXJ0dWFsIHZvaWQgRW1pdFdpbkNGSVNhdmVYTU0odW5zaWduZWQgUmVnaXN0ZXIsIHVuc2lnbmVkIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNTG9jIExvYyA9IFNNTG9jKCkpOworICB2aXJ0dWFsIHZvaWQgRW1pdFdpbkNGSVB1c2hGcmFtZShib29sIENvZGUsIFNNTG9jIExvYyA9IFNNTG9jKCkpOworICB2aXJ0dWFsIHZvaWQgRW1pdFdpbkNGSUVuZFByb2xvZyhTTUxvYyBMb2MgPSBTTUxvYygpKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRXaW5FSEhhbmRsZXIoY29uc3QgTUNTeW1ib2wgKlN5bSwgYm9vbCBVbndpbmQsIGJvb2wgRXhjZXB0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTTUxvYyBMb2MgPSBTTUxvYygpKTsKKyAgdmlydHVhbCB2b2lkIEVtaXRXaW5FSEhhbmRsZXJEYXRhKFNNTG9jIExvYyA9IFNNTG9jKCkpOworCisgIC8vLyBHZXQgdGhlIC5wZGF0YSBzZWN0aW9uIHVzZWQgZm9yIHRoZSBnaXZlbiBzZWN0aW9uLiBUeXBpY2FsbHkgdGhlIGdpdmVuCisgIC8vLyBzZWN0aW9uIGlzIGVpdGhlciB0aGUgbWFpbiAudGV4dCBzZWN0aW9uIG9yIHNvbWUgb3RoZXIgQ09NREFUIC50ZXh0CisgIC8vLyBzZWN0aW9uLCBidXQgaXQgbWF5IGJlIGFueSBzZWN0aW9uIGNvbnRhaW5pbmcgY29kZS4KKyAgTUNTZWN0aW9uICpnZXRBc3NvY2lhdGVkUERhdGFTZWN0aW9uKGNvbnN0IE1DU2VjdGlvbiAqVGV4dFNlYyk7CisKKyAgLy8vIEdldCB0aGUgLnhkYXRhIHNlY3Rpb24gdXNlZCBmb3IgdGhlIGdpdmVuIHNlY3Rpb24uCisgIE1DU2VjdGlvbiAqZ2V0QXNzb2NpYXRlZFhEYXRhU2VjdGlvbihjb25zdCBNQ1NlY3Rpb24gKlRleHRTZWMpOworCisgIHZpcnR1YWwgdm9pZCBFbWl0U3ludGF4RGlyZWN0aXZlKCk7CisKKyAgLy8vIFxicmllZiBFbWl0IGEgLnJlbG9jIGRpcmVjdGl2ZS4KKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVsb2NhdGlvbiBjb3VsZCBub3QgYmUgZW1pdHRlZCBiZWNhdXNlIE5hbWUgaXMgbm90CisgIC8vLyBrbm93bi4KKyAgdmlydHVhbCBib29sIEVtaXRSZWxvY0RpcmVjdGl2ZShjb25zdCBNQ0V4cHIgJk9mZnNldCwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNFeHByICpFeHByLCBTTUxvYyBMb2MpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRW1pdCB0aGUgZ2l2ZW4gXHAgSW5zdHJ1Y3Rpb24gaW50byB0aGUgY3VycmVudCBzZWN0aW9uLgorICAvLy8gUHJpbnRTY2hlZEluZm8gPT0gdHJ1ZSB0aGVuIHNjaGVkdWwgY29tbWVudCBzaG91bGQgYmUgYWRkZWQgdG8gb3V0cHV0CisgIHZpcnR1YWwgdm9pZCBFbWl0SW5zdHJ1Y3Rpb24oY29uc3QgTUNJbnN0ICZJbnN0LCBjb25zdCBNQ1N1YnRhcmdldEluZm8gJlNUSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFByaW50U2NoZWRJbmZvID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBidW5kbGUgYWxpZ25tZW50IG1vZGUgZnJvbSBub3cgb24gaW4gdGhlIHNlY3Rpb24uCisgIC8vLyBUaGUgYXJndW1lbnQgaXMgdGhlIHBvd2VyIG9mIDIgdG8gd2hpY2ggdGhlIGFsaWdubWVudCBpcyBzZXQuIFRoZQorICAvLy8gdmFsdWUgMCBtZWFucyB0dXJuIHRoZSBidW5kbGUgYWxpZ25tZW50IG9mZi4KKyAgdmlydHVhbCB2b2lkIEVtaXRCdW5kbGVBbGlnbk1vZGUodW5zaWduZWQgQWxpZ25Qb3cyKTsKKworICAvLy8gXGJyaWVmIFRoZSBmb2xsb3dpbmcgaW5zdHJ1Y3Rpb25zIGFyZSBhIGJ1bmRsZS1sb2NrZWQgZ3JvdXAuCisgIC8vLworICAvLy8gXHBhcmFtIEFsaWduVG9FbmQgLSBJZiB0cnVlLCB0aGUgYnVuZGxlLWxvY2tlZCBncm91cCB3aWxsIGJlIGFsaWduZWQgdG8KKyAgLy8vICAgICAgICAgICAgICAgICAgICAgdGhlIGVuZCBvZiBhIGJ1bmRsZS4KKyAgdmlydHVhbCB2b2lkIEVtaXRCdW5kbGVMb2NrKGJvb2wgQWxpZ25Ub0VuZCk7CisKKyAgLy8vIFxicmllZiBFbmRzIGEgYnVuZGxlLWxvY2tlZCBncm91cC4KKyAgdmlydHVhbCB2b2lkIEVtaXRCdW5kbGVVbmxvY2soKTsKKworICAvLy8gXGJyaWVmIElmIHRoaXMgZmlsZSBpcyBiYWNrZWQgYnkgYSBhc3NlbWJseSBzdHJlYW1lciwgdGhpcyBkdW1wcyB0aGUKKyAgLy8vIHNwZWNpZmllZCBzdHJpbmcgaW4gdGhlIG91dHB1dCAucyBmaWxlLiAgVGhpcyBjYXBhYmlsaXR5IGlzIGluZGljYXRlZCBieQorICAvLy8gdGhlIGhhc1Jhd1RleHRTdXBwb3J0KCkgcHJlZGljYXRlLiAgQnkgZGVmYXVsdCB0aGlzIGFib3J0cy4KKyAgdm9pZCBFbWl0UmF3VGV4dChjb25zdCBUd2luZSAmU3RyaW5nKTsKKworICAvLy8gXGJyaWVmIFN0cmVhbWVyIHNwZWNpZmljIGZpbmFsaXphdGlvbi4KKyAgdmlydHVhbCB2b2lkIEZpbmlzaEltcGwoKTsKKyAgLy8vIFxicmllZiBGaW5pc2ggZW1pc3Npb24gb2YgbWFjaGluZSBjb2RlLgorICB2b2lkIEZpbmlzaCgpOworCisgIHZpcnR1YWwgYm9vbCBtYXlIYXZlSW5zdHJ1Y3Rpb25zKE1DU2VjdGlvbiAmU2VjKSBjb25zdCB7IHJldHVybiB0cnVlOyB9Cit9OworCisvLy8gQ3JlYXRlIGEgZHVtbXkgbWFjaGluZSBjb2RlIHN0cmVhbWVyLCB3aGljaCBkb2VzIG5vdGhpbmcuIFRoaXMgaXMgdXNlZnVsIGZvcgorLy8vIHRpbWluZyB0aGUgYXNzZW1ibGVyIGZyb250IGVuZC4KK01DU3RyZWFtZXIgKmNyZWF0ZU51bGxTdHJlYW1lcihNQ0NvbnRleHQgJkN0eCk7CisKKy8vLyBDcmVhdGUgYSBtYWNoaW5lIGNvZGUgc3RyZWFtZXIgd2hpY2ggd2lsbCBwcmludCBvdXQgYXNzZW1ibHkgZm9yIHRoZSBuYXRpdmUKKy8vLyB0YXJnZXQsIHN1aXRhYmxlIGZvciBjb21waWxpbmcgd2l0aCBhIG5hdGl2ZSBhc3NlbWJsZXIuCisvLy8KKy8vLyBccGFyYW0gSW5zdFByaW50IC0gSWYgZ2l2ZW4sIHRoZSBpbnN0cnVjdGlvbiBwcmludGVyIHRvIHVzZS4gSWYgbm90IGdpdmVuCisvLy8gdGhlIE1DSW5zdCByZXByZXNlbnRhdGlvbiB3aWxsIGJlIHByaW50ZWQuICBUaGlzIG1ldGhvZCB0YWtlcyBvd25lcnNoaXAgb2YKKy8vLyBJbnN0UHJpbnQuCisvLy8KKy8vLyBccGFyYW0gQ0UgLSBJZiBnaXZlbiwgYSBjb2RlIGVtaXR0ZXIgdG8gdXNlIHRvIHNob3cgdGhlIGluc3RydWN0aW9uCisvLy8gZW5jb2RpbmcgaW5saW5lIHdpdGggdGhlIGFzc2VtYmx5LiBUaGlzIG1ldGhvZCB0YWtlcyBvd25lcnNoaXAgb2YgXHAgQ0UuCisvLy8KKy8vLyBccGFyYW0gVEFCIC0gSWYgZ2l2ZW4sIGEgdGFyZ2V0IGFzbSBiYWNrZW5kIHRvIHVzZSB0byBzaG93IHRoZSBmaXh1cAorLy8vIGluZm9ybWF0aW9uIGluIGNvbmp1bmN0aW9uIHdpdGggZW5jb2RpbmcgaW5mb3JtYXRpb24uIFRoaXMgbWV0aG9kIHRha2VzCisvLy8gb3duZXJzaGlwIG9mIFxwIFRBQi4KKy8vLworLy8vIFxwYXJhbSBTaG93SW5zdCAtIFdoZXRoZXIgdG8gc2hvdyB0aGUgTUNJbnN0IHJlcHJlc2VudGF0aW9uIGlubGluZSB3aXRoCisvLy8gdGhlIGFzc2VtYmx5LgorTUNTdHJlYW1lciAqY3JlYXRlQXNtU3RyZWFtZXIoTUNDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Zm9ybWF0dGVkX3Jhd19vc3RyZWFtPiBPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNWZXJib3NlQXNtLCBib29sIHVzZUR3YXJmRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNJbnN0UHJpbnRlciAqSW5zdFByaW50LCBNQ0NvZGVFbWl0dGVyICpDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQXNtQmFja2VuZCAqVEFCLCBib29sIFNob3dJbnN0KTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNTVFJFQU1FUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DU3VidGFyZ2V0SW5mby5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1N1YnRhcmdldEluZm8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTJiMjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1N1YnRhcmdldEluZm8uaApAQCAtMCwwICsxLDE4MSBAQAorLy89PT0tIGxsdm0vTUMvTUNTdWJ0YXJnZXRJbmZvLmggLSBTdWJ0YXJnZXQgSW5mb3JtYXRpb24gLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBzdWJ0YXJnZXQgb3B0aW9ucyBvZiBhIFRhcmdldCBtYWNoaW5lLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1NVQlRBUkdFVElORk9fSAorI2RlZmluZSBMTFZNX01DX01DU1VCVEFSR0VUSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1RyaXBsZS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNJbnN0ckl0aW5lcmFyaWVzLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1NjaGVkdWxlLmgiCisjaW5jbHVkZSAibGx2bS9NQy9TdWJ0YXJnZXRGZWF0dXJlLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWFjaGluZUluc3RyOworY2xhc3MgTUNJbnN0OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gR2VuZXJpYyBiYXNlIGNsYXNzIGZvciBhbGwgdGFyZ2V0IHN1YnRhcmdldHMuCisvLy8KK2NsYXNzIE1DU3VidGFyZ2V0SW5mbyB7CisgIFRyaXBsZSBUYXJnZXRUcmlwbGU7CisgIHN0ZDo6c3RyaW5nIENQVTsgLy8gQ1BVIGJlaW5nIHRhcmdldGVkLgorICBBcnJheVJlZjxTdWJ0YXJnZXRGZWF0dXJlS1Y+IFByb2NGZWF0dXJlczsgIC8vIFByb2Nlc3NvciBmZWF0dXJlIGxpc3QKKyAgQXJyYXlSZWY8U3VidGFyZ2V0RmVhdHVyZUtWPiBQcm9jRGVzYzsgIC8vIFByb2Nlc3NvciBkZXNjcmlwdGlvbnMKKworICAvLyBTY2hlZHVsZXIgbWFjaGluZSBtb2RlbAorICBjb25zdCBTdWJ0YXJnZXRJbmZvS1YgKlByb2NTY2hlZE1vZGVsczsKKyAgY29uc3QgTUNXcml0ZVByb2NSZXNFbnRyeSAqV3JpdGVQcm9jUmVzVGFibGU7CisgIGNvbnN0IE1DV3JpdGVMYXRlbmN5RW50cnkgKldyaXRlTGF0ZW5jeVRhYmxlOworICBjb25zdCBNQ1JlYWRBZHZhbmNlRW50cnkgKlJlYWRBZHZhbmNlVGFibGU7CisgIGNvbnN0IE1DU2NoZWRNb2RlbCAqQ1BVU2NoZWRNb2RlbDsKKworICBjb25zdCBJbnN0clN0YWdlICpTdGFnZXM7ICAgICAgICAgICAgLy8gSW5zdHJ1Y3Rpb24gaXRpbmVyYXJ5IHN0YWdlcworICBjb25zdCB1bnNpZ25lZCAqT3BlcmFuZEN5Y2xlczsgICAgICAgLy8gSXRpbmVyYXJ5IG9wZXJhbmQgY3ljbGVzCisgIGNvbnN0IHVuc2lnbmVkICpGb3J3YXJkaW5nUGF0aHM7CisgIEZlYXR1cmVCaXRzZXQgRmVhdHVyZUJpdHM7ICAgICAgICAgICAvLyBGZWF0dXJlIGJpdHMgZm9yIGN1cnJlbnQgQ1BVICsgRlMKKworcHVibGljOgorICBNQ1N1YnRhcmdldEluZm8oY29uc3QgTUNTdWJ0YXJnZXRJbmZvICYpID0gZGVmYXVsdDsKKyAgTUNTdWJ0YXJnZXRJbmZvKGNvbnN0IFRyaXBsZSAmVFQsIFN0cmluZ1JlZiBDUFUsIFN0cmluZ1JlZiBGUywKKyAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFN1YnRhcmdldEZlYXR1cmVLVj4gUEYsCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTdWJ0YXJnZXRGZWF0dXJlS1Y+IFBELAorICAgICAgICAgICAgICAgICAgY29uc3QgU3VidGFyZ2V0SW5mb0tWICpQcm9jU2NoZWQsCisgICAgICAgICAgICAgICAgICBjb25zdCBNQ1dyaXRlUHJvY1Jlc0VudHJ5ICpXUFIsIGNvbnN0IE1DV3JpdGVMYXRlbmN5RW50cnkgKldMLAorICAgICAgICAgICAgICAgICAgY29uc3QgTUNSZWFkQWR2YW5jZUVudHJ5ICpSQSwgY29uc3QgSW5zdHJTdGFnZSAqSVMsCisgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCAqT0MsIGNvbnN0IHVuc2lnbmVkICpGUCk7CisgIE1DU3VidGFyZ2V0SW5mbygpID0gZGVsZXRlOworICBNQ1N1YnRhcmdldEluZm8gJm9wZXJhdG9yPShjb25zdCBNQ1N1YnRhcmdldEluZm8gJikgPSBkZWxldGU7CisgIE1DU3VidGFyZ2V0SW5mbyAmb3BlcmF0b3I9KE1DU3VidGFyZ2V0SW5mbyAmJikgPSBkZWxldGU7CisgIHZpcnR1YWwgfk1DU3VidGFyZ2V0SW5mbygpID0gZGVmYXVsdDsKKworICBjb25zdCBUcmlwbGUgJmdldFRhcmdldFRyaXBsZSgpIGNvbnN0IHsgcmV0dXJuIFRhcmdldFRyaXBsZTsgfQorICBTdHJpbmdSZWYgZ2V0Q1BVKCkgY29uc3QgeyByZXR1cm4gQ1BVOyB9CisKKyAgY29uc3QgRmVhdHVyZUJpdHNldCYgZ2V0RmVhdHVyZUJpdHMoKSBjb25zdCB7IHJldHVybiBGZWF0dXJlQml0czsgfQorICB2b2lkIHNldEZlYXR1cmVCaXRzKGNvbnN0IEZlYXR1cmVCaXRzZXQgJkZlYXR1cmVCaXRzXykgeworICAgIEZlYXR1cmVCaXRzID0gRmVhdHVyZUJpdHNfOworICB9CisKKyAgYm9vbCBoYXNGZWF0dXJlKHVuc2lnbmVkIEZlYXR1cmUpIGNvbnN0IHsKKyAgICByZXR1cm4gRmVhdHVyZUJpdHNbRmVhdHVyZV07CisgIH0KKworcHJvdGVjdGVkOgorICAvLy8gSW5pdGlhbGl6ZSB0aGUgc2NoZWR1bGluZyBtb2RlbCBhbmQgZmVhdHVyZSBiaXRzLgorICAvLy8KKyAgLy8vIEZJWE1FOiBGaW5kIGEgd2F5IHRvIHN0aWNrIHRoaXMgaW4gdGhlIGNvbnN0cnVjdG9yLCBzaW5jZSBpdCBzaG91bGQgb25seQorICAvLy8gYmUgY2FsbGVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAgdm9pZCBJbml0TUNQcm9jZXNzb3JJbmZvKFN0cmluZ1JlZiBDUFUsIFN0cmluZ1JlZiBGUyk7CisKK3B1YmxpYzoKKyAgLy8vIFNldCB0aGUgZmVhdHVyZXMgdG8gdGhlIGRlZmF1bHQgZm9yIHRoZSBnaXZlbiBDUFUgd2l0aCBhbiBhcHBlbmRlZCBmZWF0dXJlCisgIC8vLyBzdHJpbmcuCisgIHZvaWQgc2V0RGVmYXVsdEZlYXR1cmVzKFN0cmluZ1JlZiBDUFUsIFN0cmluZ1JlZiBGUyk7CisKKyAgLy8vIFRvZ2dsZSBhIGZlYXR1cmUgYW5kIHJldHVybiB0aGUgcmUtY29tcHV0ZWQgZmVhdHVyZSBiaXRzLgorICAvLy8gVGhpcyB2ZXJzaW9uIGRvZXMgbm90IGNoYW5nZSB0aGUgaW1wbGllZCBiaXRzLgorICBGZWF0dXJlQml0c2V0IFRvZ2dsZUZlYXR1cmUodWludDY0X3QgRkIpOworCisgIC8vLyBUb2dnbGUgYSBmZWF0dXJlIGFuZCByZXR1cm4gdGhlIHJlLWNvbXB1dGVkIGZlYXR1cmUgYml0cy4KKyAgLy8vIFRoaXMgdmVyc2lvbiBkb2VzIG5vdCBjaGFuZ2UgdGhlIGltcGxpZWQgYml0cy4KKyAgRmVhdHVyZUJpdHNldCBUb2dnbGVGZWF0dXJlKGNvbnN0IEZlYXR1cmVCaXRzZXQmIEZCKTsKKworICAvLy8gVG9nZ2xlIGEgc2V0IG9mIGZlYXR1cmVzIGFuZCByZXR1cm4gdGhlIHJlLWNvbXB1dGVkIGZlYXR1cmUgYml0cy4KKyAgLy8vIFRoaXMgdmVyc2lvbiB3aWxsIGFsc28gY2hhbmdlIGFsbCBpbXBsaWVkIGJpdHMuCisgIEZlYXR1cmVCaXRzZXQgVG9nZ2xlRmVhdHVyZShTdHJpbmdSZWYgRlMpOworCisgIC8vLyBBcHBseSBhIGZlYXR1cmUgZmxhZyBhbmQgcmV0dXJuIHRoZSByZS1jb21wdXRlZCBmZWF0dXJlIGJpdHMsIGluY2x1ZGluZworICAvLy8gYWxsIGZlYXR1cmUgYml0cyBpbXBsaWVkIGJ5IHRoZSBmbGFnLgorICBGZWF0dXJlQml0c2V0IEFwcGx5RmVhdHVyZUZsYWcoU3RyaW5nUmVmIEZTKTsKKworICAvLy8gQ2hlY2sgd2hldGhlciB0aGUgc3VidGFyZ2V0IGZlYXR1cmVzIGFyZSBlbmFibGVkL2Rpc2FibGVkIGFzIHBlcgorICAvLy8gdGhlIHByb3ZpZGVkIHN0cmluZywgaWdub3JpbmcgYWxsIG90aGVyIGZlYXR1cmVzLgorICBib29sIGNoZWNrRmVhdHVyZXMoU3RyaW5nUmVmIEZTKSBjb25zdDsKKworICAvLy8gR2V0IHRoZSBtYWNoaW5lIG1vZGVsIG9mIGEgQ1BVLgorICBjb25zdCBNQ1NjaGVkTW9kZWwgJmdldFNjaGVkTW9kZWxGb3JDUFUoU3RyaW5nUmVmIENQVSkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgbWFjaGluZSBtb2RlbCBmb3IgdGhpcyBzdWJ0YXJnZXQncyBDUFUuCisgIGNvbnN0IE1DU2NoZWRNb2RlbCAmZ2V0U2NoZWRNb2RlbCgpIGNvbnN0IHsgcmV0dXJuICpDUFVTY2hlZE1vZGVsOyB9CisKKyAgLy8vIFJldHVybiBhbiBpdGVyYXRvciBhdCB0aGUgZmlyc3QgcHJvY2VzcyByZXNvdXJjZSBjb25zdW1lZCBieSB0aGUgZ2l2ZW4KKyAgLy8vIHNjaGVkdWxpbmcgY2xhc3MuCisgIGNvbnN0IE1DV3JpdGVQcm9jUmVzRW50cnkgKmdldFdyaXRlUHJvY1Jlc0JlZ2luKAorICAgIGNvbnN0IE1DU2NoZWRDbGFzc0Rlc2MgKlNDKSBjb25zdCB7CisgICAgcmV0dXJuICZXcml0ZVByb2NSZXNUYWJsZVtTQy0+V3JpdGVQcm9jUmVzSWR4XTsKKyAgfQorICBjb25zdCBNQ1dyaXRlUHJvY1Jlc0VudHJ5ICpnZXRXcml0ZVByb2NSZXNFbmQoCisgICAgY29uc3QgTUNTY2hlZENsYXNzRGVzYyAqU0MpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0V3JpdGVQcm9jUmVzQmVnaW4oU0MpICsgU0MtPk51bVdyaXRlUHJvY1Jlc0VudHJpZXM7CisgIH0KKworICBjb25zdCBNQ1dyaXRlTGF0ZW5jeUVudHJ5ICpnZXRXcml0ZUxhdGVuY3lFbnRyeShjb25zdCBNQ1NjaGVkQ2xhc3NEZXNjICpTQywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRGVmSWR4KSBjb25zdCB7CisgICAgYXNzZXJ0KERlZklkeCA8IFNDLT5OdW1Xcml0ZUxhdGVuY3lFbnRyaWVzICYmCisgICAgICAgICAgICJNYWNoaW5lTW9kZWwgZG9lcyBub3Qgc3BlY2lmeSBhIFdyaXRlUmVzb3VyY2UgZm9yIERlZklkeCIpOworCisgICAgcmV0dXJuICZXcml0ZUxhdGVuY3lUYWJsZVtTQy0+V3JpdGVMYXRlbmN5SWR4ICsgRGVmSWR4XTsKKyAgfQorCisgIGludCBnZXRSZWFkQWR2YW5jZUN5Y2xlcyhjb25zdCBNQ1NjaGVkQ2xhc3NEZXNjICpTQywgdW5zaWduZWQgVXNlSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgV3JpdGVSZXNJRCkgY29uc3QgeworICAgIC8vIFRPRE86IFRoZSBudW1iZXIgb2YgcmVhZCBhZHZhbmNlIGVudHJpZXMgaW4gYSBjbGFzcyBjYW4gYmUgc2lnbmlmaWNhbnQKKyAgICAvLyAofjUwKS4gQ29uc2lkZXIgY29tcHJlc3NpbmcgdGhlIFdyaXRlSUQgaW50byBhIGRlbnNlIElEIG9mIHRob3NlIHRoYXQgYXJlCisgICAgLy8gdXNlZCBieSBSZWFkQWR2YW5jZSBhbmQgcmVwcmVzZW50aW5nIHRoZW0gYXMgYSBiaXRzZXQuCisgICAgZm9yIChjb25zdCBNQ1JlYWRBZHZhbmNlRW50cnkgKkkgPSAmUmVhZEFkdmFuY2VUYWJsZVtTQy0+UmVhZEFkdmFuY2VJZHhdLAorICAgICAgICAgICAqRSA9IEkgKyBTQy0+TnVtUmVhZEFkdmFuY2VFbnRyaWVzOyBJICE9IEU7ICsrSSkgeworICAgICAgaWYgKEktPlVzZUlkeCA8IFVzZUlkeCkKKyAgICAgICAgY29udGludWU7CisgICAgICBpZiAoSS0+VXNlSWR4ID4gVXNlSWR4KQorICAgICAgICBicmVhazsKKyAgICAgIC8vIEZpbmQgdGhlIGZpcnN0IFdyaXRlUmVzSWR4IG1hdGNoLCB3aGljaCBoYXMgdGhlIGhpZ2hlc3QgY3ljbGUgY291bnQuCisgICAgICBpZiAoIUktPldyaXRlUmVzb3VyY2VJRCB8fCBJLT5Xcml0ZVJlc291cmNlSUQgPT0gV3JpdGVSZXNJRCkgeworICAgICAgICByZXR1cm4gSS0+Q3ljbGVzOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBHZXQgc2NoZWR1bGluZyBpdGluZXJhcnkgb2YgYSBDUFUuCisgIEluc3RySXRpbmVyYXJ5RGF0YSBnZXRJbnN0ckl0aW5lcmFyeUZvckNQVShTdHJpbmdSZWYgQ1BVKSBjb25zdDsKKworICAvLy8gSW5pdGlhbGl6ZSBhbiBJbnN0ckl0aW5lcmFyeURhdGEgaW5zdGFuY2UuCisgIHZvaWQgaW5pdEluc3RySXRpbnMoSW5zdHJJdGluZXJhcnlEYXRhICZJbnN0ckl0aW5zKSBjb25zdDsKKworICAvLy8gQ2hlY2sgd2hldGhlciB0aGUgQ1BVIHN0cmluZyBpcyB2YWxpZC4KKyAgYm9vbCBpc0NQVVN0cmluZ1ZhbGlkKFN0cmluZ1JlZiBDUFUpIGNvbnN0IHsKKyAgICBhdXRvIEZvdW5kID0gc3RkOjpsb3dlcl9ib3VuZChQcm9jRGVzYy5iZWdpbigpLCBQcm9jRGVzYy5lbmQoKSwgQ1BVKTsKKyAgICByZXR1cm4gRm91bmQgIT0gUHJvY0Rlc2MuZW5kKCkgJiYgU3RyaW5nUmVmKEZvdW5kLT5LZXkpID09IENQVTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiBzY2hlZHVsZXIgY29tbWVudAorICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldFNjaGVkSW5mb1N0cihjb25zdCBNYWNoaW5lSW5zdHIgJk1JKSBjb25zdCB7CisgICAgcmV0dXJuIHt9OworICB9CisKKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBnZXRTY2hlZEluZm9TdHIoTUNJbnN0IGNvbnN0ICZNQ0kpIGNvbnN0IHsKKyAgICByZXR1cm4ge307CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DU1VCVEFSR0VUSU5GT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DU3ltYm9sLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DU3ltYm9sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M4ZmMwMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTeW1ib2wuaApAQCAtMCwwICsxLDQyNyBAQAorLy89PT0tIE1DU3ltYm9sLmggLSBNYWNoaW5lIENvZGUgU3ltYm9scyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgdGhlIGRlY2xhcmF0aW9uIG9mIHRoZSBNQ1N5bWJvbCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNTWU1CT0xfSAorI2RlZmluZSBMTFZNX01DX01DU1lNQk9MX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ0ZyYWdtZW50LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DQXNtSW5mbzsKK2NsYXNzIE1DQ29udGV4dDsKK2NsYXNzIE1DRXhwcjsKK2NsYXNzIE1DU2VjdGlvbjsKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gTUNTeW1ib2wgLSBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyByZXByZXNlbnQgYSBzeW1ib2wgbmFtZSBpbiB0aGUgTUMgZmlsZSwKKy8vLyBhbmQgTUNTeW1ib2xzIGFyZSBjcmVhdGVkIGFuZCB1bmlxdWVkIGJ5IHRoZSBNQ0NvbnRleHQgY2xhc3MuICBNQ1N5bWJvbHMKKy8vLyBzaG91bGQgb25seSBiZSBjb25zdHJ1Y3RlZCB3aXRoIHZhbGlkIG5hbWVzIGZvciB0aGUgb2JqZWN0IGZpbGUuCisvLy8KKy8vLyBJZiB0aGUgc3ltYm9sIGlzIGRlZmluZWQvZW1pdHRlZCBpbnRvIHRoZSBjdXJyZW50IHRyYW5zbGF0aW9uIHVuaXQsIHRoZQorLy8vIFNlY3Rpb24gbWVtYmVyIGlzIHNldCB0byBpbmRpY2F0ZSB3aGF0IHNlY3Rpb24gaXQgbGl2ZXMgaW4uICBPdGhlcndpc2UsIGlmCisvLy8gaXQgaXMgYSByZWZlcmVuY2UgdG8gYW4gZXh0ZXJuYWwgZW50aXR5LCBpdCBoYXMgYSBudWxsIHNlY3Rpb24uCitjbGFzcyBNQ1N5bWJvbCB7Citwcm90ZWN0ZWQ6CisgIC8vLyBUaGUga2luZCBvZiB0aGUgc3ltYm9sLiAgSWYgaXQgaXMgYW55IHZhbHVlIG90aGVyIHRoYW4gdW5zZXQgdGhlbiB0aGlzCisgIC8vLyBjbGFzcyBpcyBhY3R1YWxseSBvbmUgb2YgdGhlIGFwcHJvcHJpYXRlIHN1YmNsYXNzZXMgb2YgTUNTeW1ib2wuCisgIGVudW0gU3ltYm9sS2luZCB7CisgICAgU3ltYm9sS2luZFVuc2V0LAorICAgIFN5bWJvbEtpbmRDT0ZGLAorICAgIFN5bWJvbEtpbmRFTEYsCisgICAgU3ltYm9sS2luZE1hY2hPLAorICAgIFN5bWJvbEtpbmRXYXNtLAorICB9OworCisgIC8vLyBBIHN5bWJvbCBjYW4gY29udGFpbiBhbiBPZmZzZXQsIG9yIFZhbHVlLCBvciBiZSBDb21tb24sIGJ1dCBuZXZlciBtb3JlCisgIC8vLyB0aGFuIG9uZSBvZiB0aGVzZS4KKyAgZW51bSBDb250ZW50cyA6IHVpbnQ4X3QgeworICAgIFN5bUNvbnRlbnRzVW5zZXQsCisgICAgU3ltQ29udGVudHNPZmZzZXQsCisgICAgU3ltQ29udGVudHNWYXJpYWJsZSwKKyAgICBTeW1Db250ZW50c0NvbW1vbiwKKyAgfTsKKworICAvLyBTcGVjaWFsIHNlbnRpbmFsIHZhbHVlIGZvciB0aGUgYWJzb2x1dGUgcHNldWRvIGZyYWdtZW50LgorICBzdGF0aWMgTUNGcmFnbWVudCAqQWJzb2x1dGVQc2V1ZG9GcmFnbWVudDsKKworICAvLy8gSWYgYSBzeW1ib2wgaGFzIGEgRnJhZ21lbnQsIHRoZSBzZWN0aW9uIGlzIGltcGxpZWQsIHNvIHdlIG9ubHkgbmVlZAorICAvLy8gb25lIHBvaW50ZXIuCisgIC8vLyBUaGUgc3BlY2lhbCBBYnNvbHV0ZVBzZXVkb0ZyYWdtZW50IHZhbHVlIGlzIGZvciBhYnNvbHV0ZSBzeW1ib2xzLgorICAvLy8gSWYgdGhpcyBpcyBhIHZhcmlhYmxlIHN5bWJvbCwgdGhpcyBjYWNoZXMgdGhlIHZhcmlhYmxlIHZhbHVlJ3MgZnJhZ21lbnQuCisgIC8vLyBGSVhNRTogV2UgbWlnaHQgYmUgYWJsZSB0byBzaW1wbGlmeSB0aGlzIGJ5IGhhdmluZyB0aGUgYXNtIHN0cmVhbWVyIGNyZWF0ZQorICAvLy8gZHVtbXkgZnJhZ21lbnRzLgorICAvLy8gSWYgdGhpcyBpcyBhIHNlY3Rpb24sIHRoZW4gaXQgZ2l2ZXMgdGhlIHN5bWJvbCBpcyBkZWZpbmVkIGluLiBUaGlzIGlzIG51bGwKKyAgLy8vIGZvciB1bmRlZmluZWQgc3ltYm9scy4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIGlzIGEgZnJhZ21lbnQsIHRoZW4gaXQgZ2l2ZXMgdGhlIGZyYWdtZW50IHRoaXMgc3ltYm9sJ3MgdmFsdWUgaXMKKyAgLy8vIHJlbGF0aXZlIHRvLCBpZiBhbnkuCisgIC8vLworICAvLy8gRm9yIHRoZSAnSGFzTmFtZScgaW50ZWdlciwgdGhpcyBpcyB0cnVlIGlmIHRoaXMgc3ltYm9sIGlzIG5hbWVkLgorICAvLy8gQSBuYW1lZCBzeW1ib2wgd2lsbCBoYXZlIGEgcG9pbnRlciB0byB0aGUgbmFtZSBhbGxvY2F0ZWQgaW4gdGhlIGJ5dGVzCisgIC8vLyBpbW1lZGlhdGVseSBwcmlvciB0byB0aGUgTUNTeW1ib2wuCisgIG11dGFibGUgUG9pbnRlckludFBhaXI8TUNGcmFnbWVudCAqLCAxPiBGcmFnbWVudEFuZEhhc05hbWU7CisKKyAgLy8vIElzVGVtcG9yYXJ5IC0gVHJ1ZSBpZiB0aGlzIGlzIGFuIGFzc2VtYmxlciB0ZW1wb3JhcnkgbGFiZWwsIHdoaWNoCisgIC8vLyB0eXBpY2FsbHkgZG9lcyBub3Qgc3Vydml2ZSBpbiB0aGUgLm8gZmlsZSdzIHN5bWJvbCB0YWJsZS4gIFVzdWFsbHkKKyAgLy8vICJMZm9vIiBvciAiLmZvbyIuCisgIHVuc2lnbmVkIElzVGVtcG9yYXJ5IDogMTsKKworICAvLy8gXGJyaWVmIFRydWUgaWYgdGhpcyBzeW1ib2wgY2FuIGJlIHJlZGVmaW5lZC4KKyAgdW5zaWduZWQgSXNSZWRlZmluYWJsZSA6IDE7CisKKyAgLy8vIElzVXNlZCAtIFRydWUgaWYgdGhpcyBzeW1ib2wgaGFzIGJlZW4gdXNlZC4KKyAgbXV0YWJsZSB1bnNpZ25lZCBJc1VzZWQgOiAxOworCisgIG11dGFibGUgdW5zaWduZWQgSXNSZWdpc3RlcmVkIDogMTsKKworICAvLy8gVGhpcyBzeW1ib2wgaXMgdmlzaWJsZSBvdXRzaWRlIHRoaXMgdHJhbnNsYXRpb24gdW5pdC4KKyAgbXV0YWJsZSB1bnNpZ25lZCBJc0V4dGVybmFsIDogMTsKKworICAvLy8gVGhpcyBzeW1ib2wgaXMgcHJpdmF0ZSBleHRlcm4uCisgIG11dGFibGUgdW5zaWduZWQgSXNQcml2YXRlRXh0ZXJuIDogMTsKKworICAvLy8gTExWTSBSVFRJIGRpc2NyaW1pbmF0b3IuIFRoaXMgaXMgYWN0dWFsbHkgYSBTeW1ib2xLaW5kIGVudW1lcmF0b3IsIGJ1dCBpcworICAvLy8gdW5zaWduZWQgdG8gYXZvaWQgc2lnbiBleHRlbnNpb24gYW5kIGFjaGlldmUgYmV0dGVyIGJpdHBhY2tpbmcgd2l0aCBNU1ZDLgorICB1bnNpZ25lZCBLaW5kIDogMzsKKworICAvLy8gVHJ1ZSBpZiB3ZSBoYXZlIGNyZWF0ZWQgYSByZWxvY2F0aW9uIHRoYXQgdXNlcyB0aGlzIHN5bWJvbC4KKyAgbXV0YWJsZSB1bnNpZ25lZCBJc1VzZWRJblJlbG9jIDogMTsKKworICAvLy8gVGhpcyBpcyBhY3R1YWxseSBhIENvbnRlbnRzIGVudW1lcmF0b3IsIGJ1dCBpcyB1bnNpZ25lZCB0byBhdm9pZCBzaWduCisgIC8vLyBleHRlbnNpb24gYW5kIGFjaGlldmUgYmV0dGVyIGJpdHBhY2tpbmcgd2l0aCBNU1ZDLgorICB1bnNpZ25lZCBTeW1ib2xDb250ZW50cyA6IDI7CisKKyAgLy8vIFRoZSBhbGlnbm1lbnQgb2YgdGhlIHN5bWJvbCwgaWYgaXQgaXMgJ2NvbW1vbicsIG9yIC0xLgorICAvLy8KKyAgLy8vIFRoZSBhbGlnbm1lbnQgaXMgc3RvcmVkIGFzIGxvZzIoYWxpZ24pICsgMS4gIFRoaXMgYWxsb3dzIGFsbCB2YWx1ZXMgZnJvbQorICAvLy8gMCB0byAyXjMxIHRvIGJlIHN0b3JlZCB3aGljaCBpcyBldmVyeSBwb3dlciBvZiAyIHJlcHJlc2VudGFibGUgYnkgYW4KKyAgLy8vIHVuc2lnbmVkLgorICBlbnVtIDogdW5zaWduZWQgeyBOdW1Db21tb25BbGlnbm1lbnRCaXRzID0gNSB9OworICB1bnNpZ25lZCBDb21tb25BbGlnbkxvZzIgOiBOdW1Db21tb25BbGlnbm1lbnRCaXRzOworCisgIC8vLyBUaGUgRmxhZ3MgZmllbGQgaXMgdXNlZCBieSBvYmplY3QgZmlsZSBpbXBsZW1lbnRhdGlvbnMgdG8gc3RvcmUKKyAgLy8vIGFkZGl0aW9uYWwgcGVyIHN5bWJvbCBpbmZvcm1hdGlvbiB3aGljaCBpcyBub3QgZWFzaWx5IGNsYXNzaWZpZWQuCisgIGVudW0gOiB1bnNpZ25lZCB7IE51bUZsYWdzQml0cyA9IDE2IH07CisgIG11dGFibGUgdWludDMyX3QgRmxhZ3MgOiBOdW1GbGFnc0JpdHM7CisKKyAgLy8vIEluZGV4IGZpZWxkLCBmb3IgdXNlIGJ5IHRoZSBvYmplY3QgZmlsZSBpbXBsZW1lbnRhdGlvbi4KKyAgbXV0YWJsZSB1aW50MzJfdCBJbmRleCA9IDA7CisKKyAgdW5pb24geworICAgIC8vLyBUaGUgb2Zmc2V0IHRvIGFwcGx5IHRvIHRoZSBmcmFnbWVudCBhZGRyZXNzIHRvIGZvcm0gdGhpcyBzeW1ib2wncyB2YWx1ZS4KKyAgICB1aW50NjRfdCBPZmZzZXQ7CisKKyAgICAvLy8gVGhlIHNpemUgb2YgdGhlIHN5bWJvbCwgaWYgaXQgaXMgJ2NvbW1vbicuCisgICAgdWludDY0X3QgQ29tbW9uU2l6ZTsKKworICAgIC8vLyBJZiBub24tbnVsbCwgdGhlIHZhbHVlIGZvciBhIHZhcmlhYmxlIHN5bWJvbC4KKyAgICBjb25zdCBNQ0V4cHIgKlZhbHVlOworICB9OworCisgIC8vIE1DQ29udGV4dCBjcmVhdGVzIGFuZCB1bmlxdWVzIHRoZXNlLgorICBmcmllbmQgY2xhc3MgTUNFeHByOworICBmcmllbmQgY2xhc3MgTUNDb250ZXh0OworCisgIC8vLyBcYnJpZWYgVGhlIG5hbWUgZm9yIGEgc3ltYm9sLgorICAvLy8gTUNTeW1ib2wgY29udGFpbnMgYSB1aW50NjRfdCBzbyBpcyBwcm9iYWJseSBhbGlnbmVkIHRvIDguICBPbiBhIDMyLWJpdAorICAvLy8gc3lzdGVtLCB0aGUgbmFtZSBpcyBhIHBvaW50ZXIgc28gaXNuJ3QgZ29pbmcgdG8gc2F0aXNmeSB0aGUgOCBieXRlCisgIC8vLyBhbGlnbm1lbnQgb2YgdWludDY0X3QuICBBY2NvdW50IGZvciB0aGF0IGhlcmUuCisgIHVzaW5nIE5hbWVFbnRyeVN0b3JhZ2VUeSA9IHVuaW9uIHsKKyAgICBjb25zdCBTdHJpbmdNYXBFbnRyeTxib29sPiAqTmFtZUVudHJ5OworICAgIHVpbnQ2NF90IEFsaWdubWVudFBhZGRpbmc7CisgIH07CisKKyAgTUNTeW1ib2woU3ltYm9sS2luZCBLaW5kLCBjb25zdCBTdHJpbmdNYXBFbnRyeTxib29sPiAqTmFtZSwgYm9vbCBpc1RlbXBvcmFyeSkKKyAgICAgIDogSXNUZW1wb3JhcnkoaXNUZW1wb3JhcnkpLCBJc1JlZGVmaW5hYmxlKGZhbHNlKSwgSXNVc2VkKGZhbHNlKSwKKyAgICAgICAgSXNSZWdpc3RlcmVkKGZhbHNlKSwgSXNFeHRlcm5hbChmYWxzZSksIElzUHJpdmF0ZUV4dGVybihmYWxzZSksCisgICAgICAgIEtpbmQoS2luZCksIElzVXNlZEluUmVsb2MoZmFsc2UpLCBTeW1ib2xDb250ZW50cyhTeW1Db250ZW50c1Vuc2V0KSwKKyAgICAgICAgQ29tbW9uQWxpZ25Mb2cyKDApLCBGbGFncygwKSB7CisgICAgT2Zmc2V0ID0gMDsKKyAgICBGcmFnbWVudEFuZEhhc05hbWUuc2V0SW50KCEhTmFtZSk7CisgICAgaWYgKE5hbWUpCisgICAgICBnZXROYW1lRW50cnlQdHIoKSA9IE5hbWU7CisgIH0KKworICAvLyBQcm92aWRlIGN1c3RvbSBuZXcvZGVsZXRlIGFzIHdlIHdpbGwgb25seSBhbGxvY2F0ZSBzcGFjZSBmb3IgYSBuYW1lCisgIC8vIGlmIHdlIG5lZWQgb25lLgorICB2b2lkICpvcGVyYXRvciBuZXcoc2l6ZV90IHMsIGNvbnN0IFN0cmluZ01hcEVudHJ5PGJvb2w+ICpOYW1lLAorICAgICAgICAgICAgICAgICAgICAgTUNDb250ZXh0ICZDdHgpOworCitwcml2YXRlOgorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICopOworICAvLy8gXGJyaWVmIFBsYWNlbWVudCBkZWxldGUgLSByZXF1aXJlZCBieSBzdGQsIGJ1dCBuZXZlciBjYWxsZWQuCisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqLCB1bnNpZ25lZCkgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIkNvbnN0cnVjdG9yIHRocm93cz8iKTsKKyAgfQorICAvLy8gXGJyaWVmIFBsYWNlbWVudCBkZWxldGUgLSByZXF1aXJlZCBieSBzdGQsIGJ1dCBuZXZlciBjYWxsZWQuCisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqLCB1bnNpZ25lZCwgYm9vbCkgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIkNvbnN0cnVjdG9yIHRocm93cz8iKTsKKyAgfQorCisgIE1DU2VjdGlvbiAqZ2V0U2VjdGlvblB0cigpIGNvbnN0IHsKKyAgICBpZiAoTUNGcmFnbWVudCAqRiA9IGdldEZyYWdtZW50KCkpIHsKKyAgICAgIGFzc2VydChGICE9IEFic29sdXRlUHNldWRvRnJhZ21lbnQpOworICAgICAgcmV0dXJuIEYtPmdldFBhcmVudCgpOworICAgIH0KKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGEgcmVmZXJlbmNlIHRvIHRoZSBuYW1lIGZpZWxkLiAgUmVxdWlyZXMgdGhhdCB3ZSBoYXZlIGEgbmFtZQorICBjb25zdCBTdHJpbmdNYXBFbnRyeTxib29sPiAqJmdldE5hbWVFbnRyeVB0cigpIHsKKyAgICBhc3NlcnQoRnJhZ21lbnRBbmRIYXNOYW1lLmdldEludCgpICYmICJOYW1lIGlzIHJlcXVpcmVkIik7CisgICAgTmFtZUVudHJ5U3RvcmFnZVR5ICpOYW1lID0gcmVpbnRlcnByZXRfY2FzdDxOYW1lRW50cnlTdG9yYWdlVHkgKj4odGhpcyk7CisgICAgcmV0dXJuICgqKE5hbWUgLSAxKSkuTmFtZUVudHJ5OworICB9CisgIGNvbnN0IFN0cmluZ01hcEVudHJ5PGJvb2w+IComZ2V0TmFtZUVudHJ5UHRyKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PE1DU3ltYm9sKj4odGhpcyktPmdldE5hbWVFbnRyeVB0cigpOworICB9CisKK3B1YmxpYzoKKyAgTUNTeW1ib2woY29uc3QgTUNTeW1ib2wgJikgPSBkZWxldGU7CisgIE1DU3ltYm9sICZvcGVyYXRvcj0oY29uc3QgTUNTeW1ib2wgJikgPSBkZWxldGU7CisKKyAgLy8vIGdldE5hbWUgLSBHZXQgdGhlIHN5bWJvbCBuYW1lLgorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsKKyAgICBpZiAoIUZyYWdtZW50QW5kSGFzTmFtZS5nZXRJbnQoKSkKKyAgICAgIHJldHVybiBTdHJpbmdSZWYoKTsKKworICAgIHJldHVybiBnZXROYW1lRW50cnlQdHIoKS0+Zmlyc3QoKTsKKyAgfQorCisgIGJvb2wgaXNSZWdpc3RlcmVkKCkgY29uc3QgeyByZXR1cm4gSXNSZWdpc3RlcmVkOyB9CisgIHZvaWQgc2V0SXNSZWdpc3RlcmVkKGJvb2wgVmFsdWUpIGNvbnN0IHsgSXNSZWdpc3RlcmVkID0gVmFsdWU7IH0KKworICB2b2lkIHNldFVzZWRJblJlbG9jKCkgY29uc3QgeyBJc1VzZWRJblJlbG9jID0gdHJ1ZTsgfQorICBib29sIGlzVXNlZEluUmVsb2MoKSBjb25zdCB7IHJldHVybiBJc1VzZWRJblJlbG9jOyB9CisKKyAgLy8vIFxuYW1lIEFjY2Vzc29ycworICAvLy8gQHsKKworICAvLy8gaXNUZW1wb3JhcnkgLSBDaGVjayBpZiB0aGlzIGlzIGFuIGFzc2VtYmxlciB0ZW1wb3Jhcnkgc3ltYm9sLgorICBib29sIGlzVGVtcG9yYXJ5KCkgY29uc3QgeyByZXR1cm4gSXNUZW1wb3Jhcnk7IH0KKworICAvLy8gaXNVc2VkIC0gQ2hlY2sgaWYgdGhpcyBpcyB1c2VkLgorICBib29sIGlzVXNlZCgpIGNvbnN0IHsgcmV0dXJuIElzVXNlZDsgfQorCisgIC8vLyBcYnJpZWYgQ2hlY2sgaWYgdGhpcyBzeW1ib2wgaXMgcmVkZWZpbmFibGUuCisgIGJvb2wgaXNSZWRlZmluYWJsZSgpIGNvbnN0IHsgcmV0dXJuIElzUmVkZWZpbmFibGU7IH0KKyAgLy8vIFxicmllZiBNYXJrIHRoaXMgc3ltYm9sIGFzIHJlZGVmaW5hYmxlLgorICB2b2lkIHNldFJlZGVmaW5hYmxlKGJvb2wgVmFsdWUpIHsgSXNSZWRlZmluYWJsZSA9IFZhbHVlOyB9CisgIC8vLyBcYnJpZWYgUHJlcGFyZSB0aGlzIHN5bWJvbCB0byBiZSByZWRlZmluZWQuCisgIHZvaWQgcmVkZWZpbmVJZlBvc3NpYmxlKCkgeworICAgIGlmIChJc1JlZGVmaW5hYmxlKSB7CisgICAgICBpZiAoU3ltYm9sQ29udGVudHMgPT0gU3ltQ29udGVudHNWYXJpYWJsZSkgeworICAgICAgICBWYWx1ZSA9IG51bGxwdHI7CisgICAgICAgIFN5bWJvbENvbnRlbnRzID0gU3ltQ29udGVudHNVbnNldDsKKyAgICAgIH0KKyAgICAgIHNldFVuZGVmaW5lZCgpOworICAgICAgSXNSZWRlZmluYWJsZSA9IGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vLyBAfQorICAvLy8gXG5hbWUgQXNzb2NpYXRlZCBTZWN0aW9ucworICAvLy8gQHsKKworICAvLy8gaXNEZWZpbmVkIC0gQ2hlY2sgaWYgdGhpcyBzeW1ib2wgaXMgZGVmaW5lZCAoaS5lLiwgaXQgaGFzIGFuIGFkZHJlc3MpLgorICAvLy8KKyAgLy8vIERlZmluZWQgc3ltYm9scyBhcmUgZWl0aGVyIGFic29sdXRlIG9yIGluIHNvbWUgc2VjdGlvbi4KKyAgYm9vbCBpc0RlZmluZWQoKSBjb25zdCB7IHJldHVybiAhaXNVbmRlZmluZWQoKTsgfQorCisgIC8vLyBpc0luU2VjdGlvbiAtIENoZWNrIGlmIHRoaXMgc3ltYm9sIGlzIGRlZmluZWQgaW4gc29tZSBzZWN0aW9uIChpLmUuLCBpdAorICAvLy8gaXMgZGVmaW5lZCBidXQgbm90IGFic29sdXRlKS4KKyAgYm9vbCBpc0luU2VjdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNEZWZpbmVkKCkgJiYgIWlzQWJzb2x1dGUoKTsKKyAgfQorCisgIC8vLyBpc1VuZGVmaW5lZCAtIENoZWNrIGlmIHRoaXMgc3ltYm9sIHVuZGVmaW5lZCAoaS5lLiwgaW1wbGljaXRseSBkZWZpbmVkKS4KKyAgYm9vbCBpc1VuZGVmaW5lZChib29sIFNldFVzZWQgPSB0cnVlKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEZyYWdtZW50KFNldFVzZWQpID09IG51bGxwdHI7CisgIH0KKworICAvLy8gaXNBYnNvbHV0ZSAtIENoZWNrIGlmIHRoaXMgaXMgYW4gYWJzb2x1dGUgc3ltYm9sLgorICBib29sIGlzQWJzb2x1dGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEZyYWdtZW50KCkgPT0gQWJzb2x1dGVQc2V1ZG9GcmFnbWVudDsKKyAgfQorCisgIC8vLyBHZXQgdGhlIHNlY3Rpb24gYXNzb2NpYXRlZCB3aXRoIGEgZGVmaW5lZCwgbm9uLWFic29sdXRlIHN5bWJvbC4KKyAgTUNTZWN0aW9uICZnZXRTZWN0aW9uKCkgY29uc3QgeworICAgIGFzc2VydChpc0luU2VjdGlvbigpICYmICJJbnZhbGlkIGFjY2Vzc29yISIpOworICAgIHJldHVybiAqZ2V0U2VjdGlvblB0cigpOworICB9CisKKyAgLy8vIE1hcmsgdGhlIHN5bWJvbCBhcyBkZWZpbmVkIGluIHRoZSBmcmFnbWVudCBccCBGLgorICB2b2lkIHNldEZyYWdtZW50KE1DRnJhZ21lbnQgKkYpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWlzVmFyaWFibGUoKSAmJiAiQ2Fubm90IHNldCBmcmFnbWVudCBvZiB2YXJpYWJsZSIpOworICAgIEZyYWdtZW50QW5kSGFzTmFtZS5zZXRQb2ludGVyKEYpOworICB9CisKKyAgLy8vIE1hcmsgdGhlIHN5bWJvbCBhcyB1bmRlZmluZWQuCisgIHZvaWQgc2V0VW5kZWZpbmVkKCkgeyBGcmFnbWVudEFuZEhhc05hbWUuc2V0UG9pbnRlcihudWxscHRyKTsgfQorCisgIGJvb2wgaXNFTEYoKSBjb25zdCB7IHJldHVybiBLaW5kID09IFN5bWJvbEtpbmRFTEY7IH0KKworICBib29sIGlzQ09GRigpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gU3ltYm9sS2luZENPRkY7IH0KKworICBib29sIGlzTWFjaE8oKSBjb25zdCB7IHJldHVybiBLaW5kID09IFN5bWJvbEtpbmRNYWNoTzsgfQorCisgIGJvb2wgaXNXYXNtKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBTeW1ib2xLaW5kV2FzbTsgfQorCisgIC8vLyBAfQorICAvLy8gXG5hbWUgVmFyaWFibGUgU3ltYm9scworICAvLy8gQHsKKworICAvLy8gaXNWYXJpYWJsZSAtIENoZWNrIGlmIHRoaXMgaXMgYSB2YXJpYWJsZSBzeW1ib2wuCisgIGJvb2wgaXNWYXJpYWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gU3ltYm9sQ29udGVudHMgPT0gU3ltQ29udGVudHNWYXJpYWJsZTsKKyAgfQorCisgIC8vLyBnZXRWYXJpYWJsZVZhbHVlIC0gR2V0IHRoZSB2YWx1ZSBmb3IgdmFyaWFibGUgc3ltYm9scy4KKyAgY29uc3QgTUNFeHByICpnZXRWYXJpYWJsZVZhbHVlKGJvb2wgU2V0VXNlZCA9IHRydWUpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNWYXJpYWJsZSgpICYmICJJbnZhbGlkIGFjY2Vzc29yISIpOworICAgIElzVXNlZCB8PSBTZXRVc2VkOworICAgIHJldHVybiBWYWx1ZTsKKyAgfQorCisgIHZvaWQgc2V0VmFyaWFibGVWYWx1ZShjb25zdCBNQ0V4cHIgKlZhbHVlKTsKKworICAvLy8gQH0KKworICAvLy8gR2V0IHRoZSAoaW1wbGVtZW50YXRpb24gZGVmaW5lZCkgaW5kZXguCisgIHVpbnQzMl90IGdldEluZGV4KCkgY29uc3QgeworICAgIHJldHVybiBJbmRleDsKKyAgfQorCisgIC8vLyBTZXQgdGhlIChpbXBsZW1lbnRhdGlvbiBkZWZpbmVkKSBpbmRleC4KKyAgdm9pZCBzZXRJbmRleCh1aW50MzJfdCBWYWx1ZSkgY29uc3QgeworICAgIEluZGV4ID0gVmFsdWU7CisgIH0KKworICB1aW50NjRfdCBnZXRPZmZzZXQoKSBjb25zdCB7CisgICAgYXNzZXJ0KChTeW1ib2xDb250ZW50cyA9PSBTeW1Db250ZW50c1Vuc2V0IHx8CisgICAgICAgICAgICBTeW1ib2xDb250ZW50cyA9PSBTeW1Db250ZW50c09mZnNldCkgJiYKKyAgICAgICAgICAgIkNhbm5vdCBnZXQgb2Zmc2V0IGZvciBhIGNvbW1vbi92YXJpYWJsZSBzeW1ib2wiKTsKKyAgICByZXR1cm4gT2Zmc2V0OworICB9CisgIHZvaWQgc2V0T2Zmc2V0KHVpbnQ2NF90IFZhbHVlKSB7CisgICAgYXNzZXJ0KChTeW1ib2xDb250ZW50cyA9PSBTeW1Db250ZW50c1Vuc2V0IHx8CisgICAgICAgICAgICBTeW1ib2xDb250ZW50cyA9PSBTeW1Db250ZW50c09mZnNldCkgJiYKKyAgICAgICAgICAgIkNhbm5vdCBzZXQgb2Zmc2V0IGZvciBhIGNvbW1vbi92YXJpYWJsZSBzeW1ib2wiKTsKKyAgICBPZmZzZXQgPSBWYWx1ZTsKKyAgICBTeW1ib2xDb250ZW50cyA9IFN5bUNvbnRlbnRzT2Zmc2V0OworICB9CisKKyAgLy8vIFJldHVybiB0aGUgc2l6ZSBvZiBhICdjb21tb24nIHN5bWJvbC4KKyAgdWludDY0X3QgZ2V0Q29tbW9uU2l6ZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNDb21tb24oKSAmJiAiTm90IGEgJ2NvbW1vbicgc3ltYm9sISIpOworICAgIHJldHVybiBDb21tb25TaXplOworICB9CisKKyAgLy8vIE1hcmsgdGhpcyBzeW1ib2wgYXMgYmVpbmcgJ2NvbW1vbicuCisgIC8vLworICAvLy8gXHBhcmFtIFNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgc3ltYm9sLgorICAvLy8gXHBhcmFtIEFsaWduIC0gVGhlIGFsaWdubWVudCBvZiB0aGUgc3ltYm9sLgorICB2b2lkIHNldENvbW1vbih1aW50NjRfdCBTaXplLCB1bnNpZ25lZCBBbGlnbikgeworICAgIGFzc2VydChnZXRPZmZzZXQoKSA9PSAwKTsKKyAgICBDb21tb25TaXplID0gU2l6ZTsKKyAgICBTeW1ib2xDb250ZW50cyA9IFN5bUNvbnRlbnRzQ29tbW9uOworCisgICAgYXNzZXJ0KCghQWxpZ24gfHwgaXNQb3dlck9mMl8zMihBbGlnbikpICYmCisgICAgICAgICAgICJBbGlnbm1lbnQgbXVzdCBiZSBhIHBvd2VyIG9mIDIiKTsKKyAgICB1bnNpZ25lZCBMb2cyQWxpZ24gPSBMb2cyXzMyKEFsaWduKSArIDE7CisgICAgYXNzZXJ0KExvZzJBbGlnbiA8ICgxVSA8PCBOdW1Db21tb25BbGlnbm1lbnRCaXRzKSAmJgorICAgICAgICAgICAiT3V0IG9mIHJhbmdlIGFsaWdubWVudCIpOworICAgIENvbW1vbkFsaWduTG9nMiA9IExvZzJBbGlnbjsKKyAgfQorCisgIC8vLyAgUmV0dXJuIHRoZSBhbGlnbm1lbnQgb2YgYSAnY29tbW9uJyBzeW1ib2wuCisgIHVuc2lnbmVkIGdldENvbW1vbkFsaWdubWVudCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNDb21tb24oKSAmJiAiTm90IGEgJ2NvbW1vbicgc3ltYm9sISIpOworICAgIHJldHVybiBDb21tb25BbGlnbkxvZzIgPyAoMVUgPDwgKENvbW1vbkFsaWduTG9nMiAtIDEpKSA6IDA7CisgIH0KKworICAvLy8gRGVjbGFyZSB0aGlzIHN5bWJvbCBhcyBiZWluZyAnY29tbW9uJy4KKyAgLy8vCisgIC8vLyBccGFyYW0gU2l6ZSAtIFRoZSBzaXplIG9mIHRoZSBzeW1ib2wuCisgIC8vLyBccGFyYW0gQWxpZ24gLSBUaGUgYWxpZ25tZW50IG9mIHRoZSBzeW1ib2wuCisgIC8vLyBccmV0dXJuIFRydWUgaWYgc3ltYm9sIHdhcyBhbHJlYWR5IGRlY2xhcmVkIGFzIGEgZGlmZmVyZW50IHR5cGUKKyAgYm9vbCBkZWNsYXJlQ29tbW9uKHVpbnQ2NF90IFNpemUsIHVuc2lnbmVkIEFsaWduKSB7CisgICAgYXNzZXJ0KGlzQ29tbW9uKCkgfHwgZ2V0T2Zmc2V0KCkgPT0gMCk7CisgICAgaWYoaXNDb21tb24oKSkgeworICAgICAgaWYoQ29tbW9uU2l6ZSAhPSBTaXplIHx8IGdldENvbW1vbkFsaWdubWVudCgpICE9IEFsaWduKQorICAgICAgIHJldHVybiB0cnVlOworICAgIH0gZWxzZQorICAgICAgc2V0Q29tbW9uKFNpemUsIEFsaWduKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gSXMgdGhpcyBhICdjb21tb24nIHN5bWJvbC4KKyAgYm9vbCBpc0NvbW1vbigpIGNvbnN0IHsKKyAgICByZXR1cm4gU3ltYm9sQ29udGVudHMgPT0gU3ltQ29udGVudHNDb21tb247CisgIH0KKworICBNQ0ZyYWdtZW50ICpnZXRGcmFnbWVudChib29sIFNldFVzZWQgPSB0cnVlKSBjb25zdCB7CisgICAgTUNGcmFnbWVudCAqRnJhZ21lbnQgPSBGcmFnbWVudEFuZEhhc05hbWUuZ2V0UG9pbnRlcigpOworICAgIGlmIChGcmFnbWVudCB8fCAhaXNWYXJpYWJsZSgpKQorICAgICAgcmV0dXJuIEZyYWdtZW50OworICAgIEZyYWdtZW50ID0gZ2V0VmFyaWFibGVWYWx1ZShTZXRVc2VkKS0+ZmluZEFzc29jaWF0ZWRGcmFnbWVudCgpOworICAgIEZyYWdtZW50QW5kSGFzTmFtZS5zZXRQb2ludGVyKEZyYWdtZW50KTsKKyAgICByZXR1cm4gRnJhZ21lbnQ7CisgIH0KKworICBib29sIGlzRXh0ZXJuYWwoKSBjb25zdCB7IHJldHVybiBJc0V4dGVybmFsOyB9CisgIHZvaWQgc2V0RXh0ZXJuYWwoYm9vbCBWYWx1ZSkgY29uc3QgeyBJc0V4dGVybmFsID0gVmFsdWU7IH0KKworICBib29sIGlzUHJpdmF0ZUV4dGVybigpIGNvbnN0IHsgcmV0dXJuIElzUHJpdmF0ZUV4dGVybjsgfQorICB2b2lkIHNldFByaXZhdGVFeHRlcm4oYm9vbCBWYWx1ZSkgeyBJc1ByaXZhdGVFeHRlcm4gPSBWYWx1ZTsgfQorCisgIC8vLyBwcmludCAtIFByaW50IHRoZSB2YWx1ZSB0byB0aGUgc3RyZWFtIFxwIE9TLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgY29uc3QgTUNBc21JbmZvICpNQUkpIGNvbnN0OworCisgIC8vLyBkdW1wIC0gUHJpbnQgdGhlIHZhbHVlIHRvIHN0ZGVyci4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgLy8vIEdldCB0aGUgKGltcGxlbWVudGF0aW9uIGRlZmluZWQpIHN5bWJvbCBmbGFncy4KKyAgdWludDMyX3QgZ2V0RmxhZ3MoKSBjb25zdCB7IHJldHVybiBGbGFnczsgfQorCisgIC8vLyBTZXQgdGhlIChpbXBsZW1lbnRhdGlvbiBkZWZpbmVkKSBzeW1ib2wgZmxhZ3MuCisgIHZvaWQgc2V0RmxhZ3ModWludDMyX3QgVmFsdWUpIGNvbnN0IHsKKyAgICBhc3NlcnQoVmFsdWUgPCAoMVUgPDwgTnVtRmxhZ3NCaXRzKSAmJiAiT3V0IG9mIHJhbmdlIGZsYWdzIik7CisgICAgRmxhZ3MgPSBWYWx1ZTsKKyAgfQorCisgIC8vLyBNb2RpZnkgdGhlIGZsYWdzIHZpYSBhIG1hc2sKKyAgdm9pZCBtb2RpZnlGbGFncyh1aW50MzJfdCBWYWx1ZSwgdWludDMyX3QgTWFzaykgY29uc3QgeworICAgIGFzc2VydChWYWx1ZSA8ICgxVSA8PCBOdW1GbGFnc0JpdHMpICYmICJPdXQgb2YgcmFuZ2UgZmxhZ3MiKTsKKyAgICBGbGFncyA9IChGbGFncyAmIH5NYXNrKSB8IFZhbHVlOworICB9Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNQ1N5bWJvbCAmU3ltKSB7CisgIFN5bS5wcmludChPUywgbnVsbHB0cik7CisgIHJldHVybiBPUzsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNTWU1CT0xfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1N5bWJvbENPRkYuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTeW1ib2xDT0ZGLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkxOGMzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTeW1ib2xDT0ZGLmgKQEAgLTAsMCArMSw2NyBAQAorLy89PT0tIE1DU3ltYm9sQ09GRi5oIC0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DU1lNQk9MQ09GRl9ICisjZGVmaW5lIExMVk1fTUNfTUNTWU1CT0xDT0ZGX0gKKworI2luY2x1ZGUgImxsdm0vTUMvTUNTeW1ib2wuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DU3ltYm9sQ09GRiA6IHB1YmxpYyBNQ1N5bWJvbCB7CisgIC8vLyBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBlX3R5cGUgZmllbGQgb2YgdGhlIENPRkYgc3ltYm9sLgorICBtdXRhYmxlIHVpbnQxNl90IFR5cGUgPSAwOworCisgIGVudW0gU3ltYm9sRmxhZ3MgOiB1aW50MTZfdCB7CisgICAgU0ZfQ2xhc3NNYXNrID0gMHgwMEZGLAorICAgIFNGX0NsYXNzU2hpZnQgPSAwLAorCisgICAgU0ZfV2Vha0V4dGVybmFsID0gMHgwMTAwLAorICAgIFNGX1NhZmVTRUggPSAweDAyMDAsCisgIH07CisKK3B1YmxpYzoKKyAgTUNTeW1ib2xDT0ZGKGNvbnN0IFN0cmluZ01hcEVudHJ5PGJvb2w+ICpOYW1lLCBib29sIGlzVGVtcG9yYXJ5KQorICAgICAgOiBNQ1N5bWJvbChTeW1ib2xLaW5kQ09GRiwgTmFtZSwgaXNUZW1wb3JhcnkpIHt9CisKKyAgdWludDE2X3QgZ2V0VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVHlwZTsKKyAgfQorICB2b2lkIHNldFR5cGUodWludDE2X3QgVHkpIGNvbnN0IHsKKyAgICBUeXBlID0gVHk7CisgIH0KKworICB1aW50MTZfdCBnZXRDbGFzcygpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdldEZsYWdzKCkgJiBTRl9DbGFzc01hc2spID4+IFNGX0NsYXNzU2hpZnQ7CisgIH0KKyAgdm9pZCBzZXRDbGFzcyh1aW50MTZfdCBTdG9yYWdlQ2xhc3MpIGNvbnN0IHsKKyAgICBtb2RpZnlGbGFncyhTdG9yYWdlQ2xhc3MgPDwgU0ZfQ2xhc3NTaGlmdCwgU0ZfQ2xhc3NNYXNrKTsKKyAgfQorCisgIGJvb2wgaXNXZWFrRXh0ZXJuYWwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEZsYWdzKCkgJiBTRl9XZWFrRXh0ZXJuYWw7CisgIH0KKyAgdm9pZCBzZXRJc1dlYWtFeHRlcm5hbCgpIGNvbnN0IHsKKyAgICBtb2RpZnlGbGFncyhTRl9XZWFrRXh0ZXJuYWwsIFNGX1dlYWtFeHRlcm5hbCk7CisgIH0KKworICBib29sIGlzU2FmZVNFSCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RmxhZ3MoKSAmIFNGX1NhZmVTRUg7CisgIH0KKyAgdm9pZCBzZXRJc1NhZmVTRUgoKSBjb25zdCB7CisgICAgbW9kaWZ5RmxhZ3MoU0ZfU2FmZVNFSCwgU0ZfU2FmZVNFSCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DU3ltYm9sICpTKSB7IHJldHVybiBTLT5pc0NPRkYoKTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNTWU1CT0xDT0ZGX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTeW1ib2xFTEYuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTeW1ib2xFTEYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYmNkMjJlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1N5bWJvbEVMRi5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vPT09LSBNQ1N5bWJvbEVMRi5oIC0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fTUNfTUNTWU1CT0xFTEZfSAorI2RlZmluZSBMTFZNX01DX01DU1lNQk9MRUxGX0gKKworI2luY2x1ZGUgImxsdm0vTUMvTUNTeW1ib2wuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTUNTeW1ib2xFTEYgOiBwdWJsaWMgTUNTeW1ib2wgeworICAvLy8gQW4gZXhwcmVzc2lvbiBkZXNjcmliaW5nIGhvdyB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgYSBzeW1ib2wuIElmIGEKKyAgLy8vIHN5bWJvbCBoYXMgbm8gc2l6ZSB0aGlzIGZpZWxkIHdpbGwgYmUgTlVMTC4KKyAgY29uc3QgTUNFeHByICpTeW1ib2xTaXplID0gbnVsbHB0cjsKKworcHVibGljOgorICBNQ1N5bWJvbEVMRihjb25zdCBTdHJpbmdNYXBFbnRyeTxib29sPiAqTmFtZSwgYm9vbCBpc1RlbXBvcmFyeSkKKyAgICAgIDogTUNTeW1ib2woU3ltYm9sS2luZEVMRiwgTmFtZSwgaXNUZW1wb3JhcnkpIHt9CisgIHZvaWQgc2V0U2l6ZShjb25zdCBNQ0V4cHIgKlNTKSB7IFN5bWJvbFNpemUgPSBTUzsgfQorCisgIGNvbnN0IE1DRXhwciAqZ2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFN5bWJvbFNpemU7IH0KKworICB2b2lkIHNldFZpc2liaWxpdHkodW5zaWduZWQgVmlzaWJpbGl0eSk7CisgIHVuc2lnbmVkIGdldFZpc2liaWxpdHkoKSBjb25zdDsKKworICB2b2lkIHNldE90aGVyKHVuc2lnbmVkIE90aGVyKTsKKyAgdW5zaWduZWQgZ2V0T3RoZXIoKSBjb25zdDsKKworICB2b2lkIHNldFR5cGUodW5zaWduZWQgVHlwZSkgY29uc3Q7CisgIHVuc2lnbmVkIGdldFR5cGUoKSBjb25zdDsKKworICB2b2lkIHNldEJpbmRpbmcodW5zaWduZWQgQmluZGluZykgY29uc3Q7CisgIHVuc2lnbmVkIGdldEJpbmRpbmcoKSBjb25zdDsKKworICBib29sIGlzQmluZGluZ1NldCgpIGNvbnN0OworCisgIHZvaWQgc2V0SXNXZWFrcmVmVXNlZEluUmVsb2MoKSBjb25zdDsKKyAgYm9vbCBpc1dlYWtyZWZVc2VkSW5SZWxvYygpIGNvbnN0OworCisgIHZvaWQgc2V0SXNTaWduYXR1cmUoKSBjb25zdDsKKyAgYm9vbCBpc1NpZ25hdHVyZSgpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTUNTeW1ib2wgKlMpIHsgcmV0dXJuIFMtPmlzRUxGKCk7IH0KKworcHJpdmF0ZToKKyAgdm9pZCBzZXRJc0JpbmRpbmdTZXQoKSBjb25zdDsKK307Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1N5bWJvbE1hY2hPLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DU3ltYm9sTWFjaE8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTIyMGU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1N5bWJvbE1hY2hPLmgKQEAgLTAsMCArMSwxMzYgQEAKKy8vPT09LSBNQ1N5bWJvbE1hY2hPLmggLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fTUNfTUNTWU1CT0xNQUNIT19ICisjZGVmaW5lIExMVk1fTUNfTUNTWU1CT0xNQUNIT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTeW1ib2wuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTUNTeW1ib2xNYWNoTyA6IHB1YmxpYyBNQ1N5bWJvbCB7CisgIC8vLyBcYnJpZWYgV2Ugc3RvcmUgdGhlIHZhbHVlIGZvciB0aGUgJ2Rlc2MnIHN5bWJvbCBmaWVsZCBpbiB0aGUKKyAgLy8vIGxvd2VzdCAxNiBiaXRzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGZsYWdzLgorICBlbnVtIE1hY2hPU3ltYm9sRmxhZ3MgOiB1aW50MTZfdCB7IC8vIFNlZSA8bWFjaC1vL25saXN0Lmg+LgorICAgIFNGX0Rlc2NGbGFnc01hc2sgICAgICAgICAgICAgICAgICAgICAgICA9IDB4RkZGRiwKKworICAgIC8vIFJlZmVyZW5jZSB0eXBlIGZsYWdzLgorICAgIFNGX1JlZmVyZW5jZVR5cGVNYXNrICAgICAgICAgICAgICAgICAgICA9IDB4MDAwNywKKyAgICBTRl9SZWZlcmVuY2VUeXBlVW5kZWZpbmVkTm9uTGF6eSAgICAgICAgPSAweDAwMDAsCisgICAgU0ZfUmVmZXJlbmNlVHlwZVVuZGVmaW5lZExhenkgICAgICAgICAgID0gMHgwMDAxLAorICAgIFNGX1JlZmVyZW5jZVR5cGVEZWZpbmVkICAgICAgICAgICAgICAgICA9IDB4MDAwMiwKKyAgICBTRl9SZWZlcmVuY2VUeXBlUHJpdmF0ZURlZmluZWQgICAgICAgICAgPSAweDAwMDMsCisgICAgU0ZfUmVmZXJlbmNlVHlwZVByaXZhdGVVbmRlZmluZWROb25MYXp5ID0gMHgwMDA0LAorICAgIFNGX1JlZmVyZW5jZVR5cGVQcml2YXRlVW5kZWZpbmVkTGF6eSAgICA9IDB4MDAwNSwKKworICAgIC8vIE90aGVyICdkZXNjJyBmbGFncy4KKyAgICBTRl9UaHVtYkZ1bmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwMDgsCisgICAgU0ZfTm9EZWFkU3RyaXAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMDIwLAorICAgIFNGX1dlYWtSZWZlcmVuY2UgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDA0MCwKKyAgICBTRl9XZWFrRGVmaW5pdGlvbiAgICAgICAgICAgICAgICAgICAgICAgPSAweDAwODAsCisgICAgU0ZfU3ltYm9sUmVzb2x2ZXIgICAgICAgICAgICAgICAgICAgICAgID0gMHgwMTAwLAorICAgIFNGX0FsdEVudHJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MDIwMCwKKworICAgIC8vIENvbW1vbiBhbGlnbm1lbnQKKyAgICBTRl9Db21tb25BbGlnbm1lbnRNYXNrICAgICAgICAgICAgICAgICAgPSAweEYwRkYsCisgICAgU0ZfQ29tbW9uQWxpZ25tZW50U2hpZnQgICAgICAgICAgICAgICAgID0gOAorICB9OworCitwdWJsaWM6CisgIE1DU3ltYm9sTWFjaE8oY29uc3QgU3RyaW5nTWFwRW50cnk8Ym9vbD4gKk5hbWUsIGJvb2wgaXNUZW1wb3JhcnkpCisgICAgICA6IE1DU3ltYm9sKFN5bWJvbEtpbmRNYWNoTywgTmFtZSwgaXNUZW1wb3JhcnkpIHt9CisKKyAgLy8gUmVmZXJlbmNlIHR5cGUgbWV0aG9kcy4KKworICB2b2lkIGNsZWFyUmVmZXJlbmNlVHlwZSgpIGNvbnN0IHsKKyAgICBtb2RpZnlGbGFncygwLCBTRl9SZWZlcmVuY2VUeXBlTWFzayk7CisgIH0KKworICB2b2lkIHNldFJlZmVyZW5jZVR5cGVVbmRlZmluZWRMYXp5KGJvb2wgVmFsdWUpIGNvbnN0IHsKKyAgICBtb2RpZnlGbGFncyhWYWx1ZSA/IFNGX1JlZmVyZW5jZVR5cGVVbmRlZmluZWRMYXp5IDogMCwKKyAgICAgICAgICAgICAgICBTRl9SZWZlcmVuY2VUeXBlVW5kZWZpbmVkTGF6eSk7CisgIH0KKworICAvLyBPdGhlciAnZGVzYycgbWV0aG9kcy4KKworICB2b2lkIHNldFRodW1iRnVuYygpIGNvbnN0IHsKKyAgICBtb2RpZnlGbGFncyhTRl9UaHVtYkZ1bmMsIFNGX1RodW1iRnVuYyk7CisgIH0KKworICBib29sIGlzTm9EZWFkU3RyaXAoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEZsYWdzKCkgJiBTRl9Ob0RlYWRTdHJpcDsKKyAgfQorICB2b2lkIHNldE5vRGVhZFN0cmlwKCkgY29uc3QgeworICAgIG1vZGlmeUZsYWdzKFNGX05vRGVhZFN0cmlwLCBTRl9Ob0RlYWRTdHJpcCk7CisgIH0KKworICBib29sIGlzV2Vha1JlZmVyZW5jZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RmxhZ3MoKSAmIFNGX1dlYWtSZWZlcmVuY2U7CisgIH0KKyAgdm9pZCBzZXRXZWFrUmVmZXJlbmNlKCkgY29uc3QgeworICAgIG1vZGlmeUZsYWdzKFNGX1dlYWtSZWZlcmVuY2UsIFNGX1dlYWtSZWZlcmVuY2UpOworICB9CisKKyAgYm9vbCBpc1dlYWtEZWZpbml0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBnZXRGbGFncygpICYgU0ZfV2Vha0RlZmluaXRpb247CisgIH0KKyAgdm9pZCBzZXRXZWFrRGVmaW5pdGlvbigpIGNvbnN0IHsKKyAgICBtb2RpZnlGbGFncyhTRl9XZWFrRGVmaW5pdGlvbiwgU0ZfV2Vha0RlZmluaXRpb24pOworICB9CisKKyAgYm9vbCBpc1N5bWJvbFJlc29sdmVyKCkgY29uc3QgeworICAgIHJldHVybiBnZXRGbGFncygpICYgU0ZfU3ltYm9sUmVzb2x2ZXI7CisgIH0KKyAgdm9pZCBzZXRTeW1ib2xSZXNvbHZlcigpIGNvbnN0IHsKKyAgICBtb2RpZnlGbGFncyhTRl9TeW1ib2xSZXNvbHZlciwgU0ZfU3ltYm9sUmVzb2x2ZXIpOworICB9CisKKyAgdm9pZCBzZXRBbHRFbnRyeSgpIGNvbnN0IHsKKyAgICBtb2RpZnlGbGFncyhTRl9BbHRFbnRyeSwgU0ZfQWx0RW50cnkpOworICB9CisKKyAgYm9vbCBpc0FsdEVudHJ5KCkgY29uc3QgeworICAgIHJldHVybiBnZXRGbGFncygpICYgU0ZfQWx0RW50cnk7CisgIH0KKworICB2b2lkIHNldERlc2ModW5zaWduZWQgVmFsdWUpIGNvbnN0IHsKKyAgICBhc3NlcnQoVmFsdWUgPT0gKFZhbHVlICYgU0ZfRGVzY0ZsYWdzTWFzaykgJiYKKyAgICAgICAgICAgIkludmFsaWQgLmRlc2MgdmFsdWUhIik7CisgICAgc2V0RmxhZ3MoVmFsdWUgJiBTRl9EZXNjRmxhZ3NNYXNrKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBlbmNvZGVkIHZhbHVlIG9mIHRoZSBmbGFncyBhcyB0aGV5IHdpbGwgYmUgZW1pdHRlZCBpbiB0bworICAvLy8gdGhlIE1hY2hPIGJpbmFyeQorICB1aW50MTZfdCBnZXRFbmNvZGVkRmxhZ3MoYm9vbCBFbmNvZGVBc0FsdEVudHJ5KSBjb25zdCB7CisgICAgdWludDE2X3QgRmxhZ3MgPSBnZXRGbGFncygpOworCisgICAgLy8gQ29tbW9uIGFsaWdubWVudCBpcyBwYWNrZWQgaW50byB0aGUgJ2Rlc2MnIGJpdHMuCisgICAgaWYgKGlzQ29tbW9uKCkpIHsKKyAgICAgIGlmICh1bnNpZ25lZCBBbGlnbiA9IGdldENvbW1vbkFsaWdubWVudCgpKSB7CisgICAgICAgIHVuc2lnbmVkIExvZzJTaXplID0gTG9nMl8zMihBbGlnbik7CisgICAgICAgIGFzc2VydCgoMVUgPDwgTG9nMlNpemUpID09IEFsaWduICYmICJJbnZhbGlkICdjb21tb24nIGFsaWdubWVudCEiKTsKKyAgICAgICAgaWYgKExvZzJTaXplID4gMTUpCisgICAgICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJpbnZhbGlkICdjb21tb24nIGFsaWdubWVudCAnIiArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR3aW5lKEFsaWduKSArICInIGZvciAnIiArIGdldE5hbWUoKSArICInIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgICAgICBGbGFncyA9IChGbGFncyAmIFNGX0NvbW1vbkFsaWdubWVudE1hc2spIHwKKyAgICAgICAgICAgICAgICAoTG9nMlNpemUgPDwgU0ZfQ29tbW9uQWxpZ25tZW50U2hpZnQpOworICAgICAgfQorICAgIH0KKworICAgIGlmIChFbmNvZGVBc0FsdEVudHJ5KQorICAgICAgRmxhZ3MgfD0gU0ZfQWx0RW50cnk7CisKKyAgICByZXR1cm4gRmxhZ3M7CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1DU3ltYm9sICpTKSB7IHJldHVybiBTLT5pc01hY2hPKCk7IH0KK307Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1N5bWJvbFdhc20uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTeW1ib2xXYXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBlYWRiMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNTeW1ib2xXYXNtLmgKQEAgLTAsMCArMSw5NiBAQAorLy89PT0tIE1DU3ltYm9sV2FzbS5oIC0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9NQ19NQ1NZTUJPTFdBU01fSAorI2RlZmluZSBMTFZNX01DX01DU1lNQk9MV0FTTV9ICisKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9XYXNtLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ1N5bWJvbC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1DU3ltYm9sV2FzbSA6IHB1YmxpYyBNQ1N5bWJvbCB7CisgIHdhc206Oldhc21TeW1ib2xUeXBlIFR5cGUgPSB3YXNtOjpXQVNNX1NZTUJPTF9UWVBFX0RBVEE7CisgIGJvb2wgSXNXZWFrID0gZmFsc2U7CisgIGJvb2wgSXNIaWRkZW4gPSBmYWxzZTsKKyAgYm9vbCBJc0NvbWRhdCA9IGZhbHNlOworICBzdGQ6OnN0cmluZyBNb2R1bGVOYW1lOworICBTbWFsbFZlY3Rvcjx3YXNtOjpWYWxUeXBlLCAxPiBSZXR1cm5zOworICBTbWFsbFZlY3Rvcjx3YXNtOjpWYWxUeXBlLCA0PiBQYXJhbXM7CisgIHdhc206Oldhc21HbG9iYWxUeXBlIEdsb2JhbFR5cGU7CisgIGJvb2wgUGFyYW1zU2V0ID0gZmFsc2U7CisgIGJvb2wgUmV0dXJuc1NldCA9IGZhbHNlOworICBib29sIEdsb2JhbFR5cGVTZXQgPSBmYWxzZTsKKworICAvLy8gQW4gZXhwcmVzc2lvbiBkZXNjcmliaW5nIGhvdyB0byBjYWxjdWxhdGUgdGhlIHNpemUgb2YgYSBzeW1ib2wuIElmIGEKKyAgLy8vIHN5bWJvbCBoYXMgbm8gc2l6ZSB0aGlzIGZpZWxkIHdpbGwgYmUgTlVMTC4KKyAgY29uc3QgTUNFeHByICpTeW1ib2xTaXplID0gbnVsbHB0cjsKKworcHVibGljOgorICAvLyBVc2UgYSBtb2R1bGUgbmFtZSBvZiAiZW52IiBmb3Igbm93LCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIGV4aXN0aW5nIHRvb2xzLgorICAvLyBUaGlzIGlzIHRlbXBvcmFyeSwgYW5kIG1heSBjaGFuZ2UsIGFzIHRoZSBBQkkgaXMgbm90IHlldCBzdGFibGUuCisgIE1DU3ltYm9sV2FzbShjb25zdCBTdHJpbmdNYXBFbnRyeTxib29sPiAqTmFtZSwgYm9vbCBpc1RlbXBvcmFyeSkKKyAgICAgIDogTUNTeW1ib2woU3ltYm9sS2luZFdhc20sIE5hbWUsIGlzVGVtcG9yYXJ5KSwKKyAgICAgICAgTW9kdWxlTmFtZSgiZW52Iikge30KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBNQ1N5bWJvbCAqUykgeyByZXR1cm4gUy0+aXNXYXNtKCk7IH0KKworICBjb25zdCBNQ0V4cHIgKmdldFNpemUoKSBjb25zdCB7IHJldHVybiBTeW1ib2xTaXplOyB9CisgIHZvaWQgc2V0U2l6ZShjb25zdCBNQ0V4cHIgKlNTKSB7IFN5bWJvbFNpemUgPSBTUzsgfQorCisgIGJvb2wgaXNGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIFR5cGUgPT0gd2FzbTo6V0FTTV9TWU1CT0xfVFlQRV9GVU5DVElPTjsgfQorICBib29sIGlzRGF0YSgpIGNvbnN0IHsgcmV0dXJuIFR5cGUgPT0gd2FzbTo6V0FTTV9TWU1CT0xfVFlQRV9EQVRBOyB9CisgIGJvb2wgaXNHbG9iYWwoKSBjb25zdCB7IHJldHVybiBUeXBlID09IHdhc206OldBU01fU1lNQk9MX1RZUEVfR0xPQkFMOyB9CisgIHdhc206Oldhc21TeW1ib2xUeXBlIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBUeXBlOyB9CisgIHZvaWQgc2V0VHlwZSh3YXNtOjpXYXNtU3ltYm9sVHlwZSB0eXBlKSB7IFR5cGUgPSB0eXBlOyB9CisKKyAgYm9vbCBpc1dlYWsoKSBjb25zdCB7IHJldHVybiBJc1dlYWs7IH0KKyAgdm9pZCBzZXRXZWFrKGJvb2wgaXNXZWFrKSB7IElzV2VhayA9IGlzV2VhazsgfQorCisgIGJvb2wgaXNIaWRkZW4oKSBjb25zdCB7IHJldHVybiBJc0hpZGRlbjsgfQorICB2b2lkIHNldEhpZGRlbihib29sIGlzSGlkZGVuKSB7IElzSGlkZGVuID0gaXNIaWRkZW47IH0KKworICBib29sIGlzQ29tZGF0KCkgY29uc3QgeyByZXR1cm4gSXNDb21kYXQ7IH0KKyAgdm9pZCBzZXRDb21kYXQoYm9vbCBpc0NvbWRhdCkgeyBJc0NvbWRhdCA9IGlzQ29tZGF0OyB9CisKKyAgY29uc3QgU3RyaW5nUmVmIGdldE1vZHVsZU5hbWUoKSBjb25zdCB7IHJldHVybiBNb2R1bGVOYW1lOyB9CisgIHZvaWQgc2V0TW9kdWxlTmFtZShTdHJpbmdSZWYgTmFtZSkgeyBNb2R1bGVOYW1lID0gTmFtZTsgfQorCisgIGNvbnN0IFNtYWxsVmVjdG9yPHdhc206OlZhbFR5cGUsIDE+ICZnZXRSZXR1cm5zKCkgY29uc3QgeworICAgIGFzc2VydChSZXR1cm5zU2V0KTsKKyAgICByZXR1cm4gUmV0dXJuczsKKyAgfQorCisgIHZvaWQgc2V0UmV0dXJucyhTbWFsbFZlY3RvckltcGw8d2FzbTo6VmFsVHlwZT4gJiZSZXRzKSB7CisgICAgUmV0dXJuc1NldCA9IHRydWU7CisgICAgUmV0dXJucyA9IHN0ZDo6bW92ZShSZXRzKTsKKyAgfQorCisgIGNvbnN0IFNtYWxsVmVjdG9yPHdhc206OlZhbFR5cGUsIDQ+ICZnZXRQYXJhbXMoKSBjb25zdCB7CisgICAgYXNzZXJ0KFBhcmFtc1NldCk7CisgICAgcmV0dXJuIFBhcmFtczsKKyAgfQorCisgIHZvaWQgc2V0UGFyYW1zKFNtYWxsVmVjdG9ySW1wbDx3YXNtOjpWYWxUeXBlPiAmJlBhcnMpIHsKKyAgICBQYXJhbXNTZXQgPSB0cnVlOworICAgIFBhcmFtcyA9IHN0ZDo6bW92ZShQYXJzKTsKKyAgfQorCisgIGNvbnN0IHdhc206Oldhc21HbG9iYWxUeXBlICZnZXRHbG9iYWxUeXBlKCkgY29uc3QgeworICAgIGFzc2VydChHbG9iYWxUeXBlU2V0KTsKKyAgICByZXR1cm4gR2xvYmFsVHlwZTsKKyAgfQorCisgIHZvaWQgc2V0R2xvYmFsVHlwZSh3YXNtOjpXYXNtR2xvYmFsVHlwZSBHVCkgeworICAgIEdsb2JhbFR5cGVTZXQgPSB0cnVlOworICAgIEdsb2JhbFR5cGUgPSBHVDsKKyAgfQorfTsKKworfSAgLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DU1lNQk9MV0FTTV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DVGFyZ2V0T3B0aW9ucy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1RhcmdldE9wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWQzMzBmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1RhcmdldE9wdGlvbnMuaApAQCAtMCwwICsxLDgwIEBACisvLz09PS0gTUNUYXJnZXRPcHRpb25zLmggLSBNQyBUYXJnZXQgT3B0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNUQVJHRVRPUFRJT05TX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1RBUkdFVE9QVElPTlNfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitlbnVtIGNsYXNzIEV4Y2VwdGlvbkhhbmRsaW5nIHsKKyAgTm9uZSwgICAgIC8vLyBObyBleGNlcHRpb24gc3VwcG9ydAorICBEd2FyZkNGSSwgLy8vIERXQVJGLWxpa2UgaW5zdHJ1Y3Rpb24gYmFzZWQgZXhjZXB0aW9ucworICBTakxqLCAgICAgLy8vIHNldGptcC9sb25nam1wIGJhc2VkIGV4Y2VwdGlvbnMKKyAgQVJNLCAgICAgIC8vLyBBUk0gRUhBQkkKKyAgV2luRUgsICAgIC8vLyBXaW5kb3dzIEV4Y2VwdGlvbiBIYW5kbGluZworICBXYXNtLCAgICAgLy8vIFdlYkFzc2VtYmx5IEV4Y2VwdGlvbiBIYW5kbGluZworfTsKKworZW51bSBjbGFzcyBEZWJ1Z0NvbXByZXNzaW9uVHlwZSB7CisgIE5vbmUsIC8vLyBObyBjb21wcmVzc2lvbgorICBHTlUsICAvLy8gemxpYi1nbnUgc3R5bGUgY29tcHJlc3Npb24KKyAgWiwgICAgLy8vIHpsaWIgc3R5bGUgY29tcGxlc3Npb24KK307CisKK2NsYXNzIFN0cmluZ1JlZjsKKworY2xhc3MgTUNUYXJnZXRPcHRpb25zIHsKK3B1YmxpYzoKKyAgZW51bSBBc21JbnN0cnVtZW50YXRpb24geworICAgIEFzbUluc3RydW1lbnRhdGlvbk5vbmUsCisgICAgQXNtSW5zdHJ1bWVudGF0aW9uQWRkcmVzcworICB9OworCisgIC8vLyBFbmFibGVzIEFkZHJlc3NTYW5pdGl6ZXIgaW5zdHJ1bWVudGF0aW9uIGF0IG1hY2hpbmUgbGV2ZWwuCisgIGJvb2wgU2FuaXRpemVBZGRyZXNzIDogMTsKKworICBib29sIE1DUmVsYXhBbGwgOiAxOworICBib29sIE1DTm9FeGVjU3RhY2sgOiAxOworICBib29sIE1DRmF0YWxXYXJuaW5ncyA6IDE7CisgIGJvb2wgTUNOb1dhcm4gOiAxOworICBib29sIE1DTm9EZXByZWNhdGVkV2FybiA6IDE7CisgIGJvb2wgTUNTYXZlVGVtcExhYmVscyA6IDE7CisgIGJvb2wgTUNVc2VEd2FyZkRpcmVjdG9yeSA6IDE7CisgIGJvb2wgTUNJbmNyZW1lbnRhbExpbmtlckNvbXBhdGlibGUgOiAxOworICBib29sIE1DUElFQ29weVJlbG9jYXRpb25zIDogMTsKKyAgYm9vbCBTaG93TUNFbmNvZGluZyA6IDE7CisgIGJvb2wgU2hvd01DSW5zdCA6IDE7CisgIGJvb2wgQXNtVmVyYm9zZSA6IDE7CisKKyAgLy8vIFByZXNlcnZlIENvbW1lbnRzIGluIEFzc2VtYmx5LgorICBib29sIFByZXNlcnZlQXNtQ29tbWVudHMgOiAxOworCisgIGludCBEd2FyZlZlcnNpb24gPSAwOworCisgIHN0ZDo6c3RyaW5nIEFCSU5hbWU7CisgIHN0ZDo6c3RyaW5nIFNwbGl0RHdhcmZGaWxlOworCisgIC8vLyBBZGRpdGlvbmFsIHBhdGhzIHRvIHNlYXJjaCBmb3IgYC5pbmNsdWRlYCBkaXJlY3RpdmVzIHdoZW4gdXNpbmcgdGhlCisgIC8vLyBpbnRlZ3JhdGVkIGFzc2VtYmxlci4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IElBU1NlYXJjaFBhdGhzOworCisgIE1DVGFyZ2V0T3B0aW9ucygpOworCisgIC8vLyBnZXRBQklOYW1lIC0gSWYgdGhpcyByZXR1cm5zIGEgbm9uLWVtcHR5IHN0cmluZyB0aGlzIHJlcHJlc2VudHMgdGhlCisgIC8vLyB0ZXh0dWFsIG5hbWUgb2YgdGhlIEFCSSB0aGF0IHdlIHdhbnQgdGhlIGJhY2tlbmQgdG8gdXNlLCBlLmcuIG8zMiwgb3IKKyAgLy8vIGFhcGNzLWxpbnV4LgorICBTdHJpbmdSZWYgZ2V0QUJJTmFtZSgpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTUNfTUNUQVJHRVRPUFRJT05TX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNUYXJnZXRPcHRpb25zQ29tbWFuZEZsYWdzLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNUYXJnZXRPcHRpb25zQ29tbWFuZEZsYWdzLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTcyZmE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1RhcmdldE9wdGlvbnNDb21tYW5kRmxhZ3MuZGVmCkBAIC0wLDAgKzEsODAgQEAKKy8vPT09LS0gTUNUYXJnZXRPcHRpb25zQ29tbWFuZEZsYWdzLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgbWFjaGluZSBjb2RlLXNwZWNpZmljIGZsYWdzIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuCisvLyBkaWZmZXJlbnQgY29tbWFuZCBsaW5lIHRvb2xzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1RBUkdFVE9QVElPTlNDT01NQU5ERkxBR1NfSAorI2RlZmluZSBMTFZNX01DX01DVEFSR0VUT1BUSU9OU0NPTU1BTkRGTEFHU19ICisKKyNpbmNsdWRlICJsbHZtL01DL01DVGFyZ2V0T3B0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgordXNpbmcgbmFtZXNwYWNlIGxsdm07CisKK3N0YXRpYyBjbDo6b3B0PE1DVGFyZ2V0T3B0aW9uczo6QXNtSW5zdHJ1bWVudGF0aW9uPiBBc21JbnN0cnVtZW50YXRpb24oCisgICAgImFzbS1pbnN0cnVtZW50YXRpb24iLCBjbDo6ZGVzYygiSW5zdHJ1bWVudGF0aW9uIG9mIGlubGluZSBhc3NlbWJseSBhbmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFzc2VtYmx5IHNvdXJjZSBmaWxlcyIpLAorICAgIGNsOjppbml0KE1DVGFyZ2V0T3B0aW9uczo6QXNtSW5zdHJ1bWVudGF0aW9uTm9uZSksCisgICAgY2w6OnZhbHVlcyhjbEVudW1WYWxOKE1DVGFyZ2V0T3B0aW9uczo6QXNtSW5zdHJ1bWVudGF0aW9uTm9uZSwgIm5vbmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAibm8gaW5zdHJ1bWVudGF0aW9uIGF0IGFsbCIpLAorICAgICAgICAgICAgICAgY2xFbnVtVmFsTihNQ1RhcmdldE9wdGlvbnM6OkFzbUluc3RydW1lbnRhdGlvbkFkZHJlc3MsICJhZGRyZXNzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImluc3RydW1lbnQgaW5zdHJ1Y3Rpb25zIHdpdGggbWVtb3J5IGFyZ3VtZW50cyIpKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IFJlbGF4QWxsKCJtYy1yZWxheC1hbGwiLAorICAgICAgICAgICAgICAgICAgICAgICBjbDo6ZGVzYygiV2hlbiB1c2VkIHdpdGggZmlsZXR5cGU9b2JqLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZWxheCBhbGwgZml4dXBzIGluIHRoZSBlbWl0dGVkIG9iamVjdCBmaWxlIikpOworCitzdGF0aWMgY2w6Om9wdDxib29sPiBJbmNyZW1lbnRhbExpbmtlckNvbXBhdGlibGUoCisgICAgImluY3JlbWVudGFsLWxpbmtlci1jb21wYXRpYmxlIiwKKyAgICBjbDo6ZGVzYygKKyAgICAgICAgIldoZW4gdXNlZCB3aXRoIGZpbGV0eXBlPW9iaiwgIgorICAgICAgICAiZW1pdCBhbiBvYmplY3QgZmlsZSB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIGFuIGluY3JlbWVudGFsIGxpbmtlciIpKTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4gUElFQ29weVJlbG9jYXRpb25zKCJwaWUtY29weS1yZWxvY2F0aW9ucyIsIGNsOjpkZXNjKCJQSUUgQ29weSBSZWxvY2F0aW9ucyIpKTsKKworc3RhdGljIGNsOjpvcHQ8aW50PiBEd2FyZlZlcnNpb24oImR3YXJmLXZlcnNpb24iLCBjbDo6ZGVzYygiRHdhcmYgdmVyc2lvbiIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjbDo6aW5pdCgwKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IFNob3dNQ0luc3QoImFzbS1zaG93LWluc3QiLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJFbWl0IGludGVybmFsIGluc3RydWN0aW9uIHJlcHJlc2VudGF0aW9uIHRvICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXNzZW1ibHkgZmlsZSIpKTsKKworc3RhdGljIGNsOjpvcHQ8Ym9vbD4gRmF0YWxXYXJuaW5ncygiZmF0YWwtd2FybmluZ3MiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsOjpkZXNjKCJUcmVhdCB3YXJuaW5ncyBhcyBlcnJvcnMiKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IE5vV2Fybigibm8td2FybiIsIGNsOjpkZXNjKCJTdXBwcmVzcyBhbGwgd2FybmluZ3MiKSk7CitzdGF0aWMgY2w6OmFsaWFzIE5vV2FyblcoIlciLCBjbDo6ZGVzYygiQWxpYXMgZm9yIC0tbm8td2FybiIpLCBjbDo6YWxpYXNvcHQoTm9XYXJuKSk7CisKK3N0YXRpYyBjbDo6b3B0PGJvb2w+IE5vRGVwcmVjYXRlZFdhcm4oIm5vLWRlcHJlY2F0ZWQtd2FybiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2w6OmRlc2MoIlN1cHByZXNzIGFsbCBkZXByZWNhdGVkIHdhcm5pbmdzIikpOworCitzdGF0aWMgY2w6Om9wdDxzdGQ6OnN0cmluZz4KK0FCSU5hbWUoInRhcmdldC1hYmkiLCBjbDo6SGlkZGVuLAorICAgICAgICBjbDo6ZGVzYygiVGhlIG5hbWUgb2YgdGhlIEFCSSB0byBiZSB0YXJnZXRlZCBmcm9tIHRoZSBiYWNrZW5kLiIpLAorICAgICAgICBjbDo6aW5pdCgiIikpOworCitzdGF0aWMgTUNUYXJnZXRPcHRpb25zIEluaXRNQ1RhcmdldE9wdGlvbnNGcm9tRmxhZ3MoKSB7CisgIE1DVGFyZ2V0T3B0aW9ucyBPcHRpb25zOworICBPcHRpb25zLlNhbml0aXplQWRkcmVzcyA9CisgICAgICAoQXNtSW5zdHJ1bWVudGF0aW9uID09IE1DVGFyZ2V0T3B0aW9uczo6QXNtSW5zdHJ1bWVudGF0aW9uQWRkcmVzcyk7CisgIE9wdGlvbnMuTUNSZWxheEFsbCA9IFJlbGF4QWxsOworICBPcHRpb25zLk1DSW5jcmVtZW50YWxMaW5rZXJDb21wYXRpYmxlID0gSW5jcmVtZW50YWxMaW5rZXJDb21wYXRpYmxlOworICBPcHRpb25zLk1DUElFQ29weVJlbG9jYXRpb25zID0gUElFQ29weVJlbG9jYXRpb25zOworICBPcHRpb25zLkR3YXJmVmVyc2lvbiA9IER3YXJmVmVyc2lvbjsKKyAgT3B0aW9ucy5TaG93TUNJbnN0ID0gU2hvd01DSW5zdDsKKyAgT3B0aW9ucy5BQklOYW1lID0gQUJJTmFtZTsKKyAgT3B0aW9ucy5NQ0ZhdGFsV2FybmluZ3MgPSBGYXRhbFdhcm5pbmdzOworICBPcHRpb25zLk1DTm9XYXJuID0gTm9XYXJuOworICBPcHRpb25zLk1DTm9EZXByZWNhdGVkV2FybiA9IE5vRGVwcmVjYXRlZFdhcm47CisgIHJldHVybiBPcHRpb25zOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNWYWx1ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1ZhbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmYyMjNmNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNWYWx1ZS5oCkBAIC0wLDAgKzEsODcgQEAKKy8vPT09LS0gbGx2bS9NQy9NQ1ZhbHVlLmggLSBNQ1ZhbHVlIGNsYXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgTUNWYWx1ZSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNWQUxVRV9ICisjZGVmaW5lIExMVk1fTUNfTUNWQUxVRV9ICisKKyNpbmNsdWRlICJsbHZtL01DL01DRXhwci5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNTeW1ib2wuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTUNBc21JbmZvOworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzIGFuICJhc3NlbWJsZXIgaW1tZWRpYXRlIi4KKy8vLworLy8vICBJbiBpdHMgbW9zdCBnZW5lcmFsIGZvcm0sIHRoaXMgY2FuIGhvbGQgIjpLaW5kOihTeW1ib2xBIC0gU3ltYm9sQiArCisvLy8gIGltbTY0KSIuICBOb3QgYWxsIHRhcmdldHMgc3VwcG9ydHMgcmVsb2NhdGlvbnMgb2YgdGhpcyBnZW5lcmFsIGZvcm0sIGJ1dCB3ZQorLy8vICBuZWVkIHRvIHJlcHJlc2VudCB0aGlzIGFueXdheS4KKy8vLworLy8vIEluIGdlbmVyYWwgYm90aCBTeW1ib2xBIGFuZCBTeW1ib2xCIHdpbGwgYWxzbyBoYXZlIGEgbW9kaWZpZXIKKy8vLyBhbmFsb2dvdXMgdG8gdGhlIHRvcC1sZXZlbCBLaW5kLiBDdXJyZW50IHRhcmdldHMgYXJlIG5vdCBleHBlY3RlZAorLy8vIHRvIG1ha2UgdXNlIG9mIGJvdGggdGhvdWdoLiBUaGUgY2hvaWNlIGNvbWVzIGRvd24gdG8gd2hldGhlcgorLy8vIHJlbG9jYXRpb24gbW9kaWZpZXJzIGFwcGx5IHRvIHRoZSBjbG9zZXN0IHN5bWJvbCBvciB0aGUgd2hvbGUKKy8vLyBleHByZXNzaW9uLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgY2xhc3MgbXVzdCByZW1haW4gYSBzaW1wbGUgUE9EIHZhbHVlIGNsYXNzLCBiZWNhdXNlIHdlIG5lZWQKKy8vLyBpdCB0byBsaXZlIGluIHVuaW9ucyBldGMuCitjbGFzcyBNQ1ZhbHVlIHsKKyAgY29uc3QgTUNTeW1ib2xSZWZFeHByICpTeW1BID0gbnVsbHB0ciwgKlN5bUIgPSBudWxscHRyOworICBpbnQ2NF90IENzdCA9IDA7CisgIHVpbnQzMl90IFJlZktpbmQgPSAwOworCitwdWJsaWM6CisgIE1DVmFsdWUoKSA9IGRlZmF1bHQ7CisgIGludDY0X3QgZ2V0Q29uc3RhbnQoKSBjb25zdCB7IHJldHVybiBDc3Q7IH0KKyAgY29uc3QgTUNTeW1ib2xSZWZFeHByICpnZXRTeW1BKCkgY29uc3QgeyByZXR1cm4gU3ltQTsgfQorICBjb25zdCBNQ1N5bWJvbFJlZkV4cHIgKmdldFN5bUIoKSBjb25zdCB7IHJldHVybiBTeW1COyB9CisgIHVpbnQzMl90IGdldFJlZktpbmQoKSBjb25zdCB7IHJldHVybiBSZWZLaW5kOyB9CisKKyAgLy8vIFxicmllZiBJcyB0aGlzIGFuIGFic29sdXRlIChhcyBvcHBvc2VkIHRvIHJlbG9jYXRhYmxlKSB2YWx1ZS4KKyAgYm9vbCBpc0Fic29sdXRlKCkgY29uc3QgeyByZXR1cm4gIVN5bUEgJiYgIVN5bUI7IH0KKworICAvLy8gXGJyaWVmIFByaW50IHRoZSB2YWx1ZSB0byB0aGUgc3RyZWFtIFxwIE9TLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBQcmludCB0aGUgdmFsdWUgdG8gc3RkZXJyLgorICB2b2lkIGR1bXAoKSBjb25zdDsKKworICBNQ1N5bWJvbFJlZkV4cHI6OlZhcmlhbnRLaW5kIGdldEFjY2Vzc1ZhcmlhbnQoKSBjb25zdDsKKworICBzdGF0aWMgTUNWYWx1ZSBnZXQoY29uc3QgTUNTeW1ib2xSZWZFeHByICpTeW1BLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTeW1ib2xSZWZFeHByICpTeW1CID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgVmFsID0gMCwgdWludDMyX3QgUmVmS2luZCA9IDApIHsKKyAgICBNQ1ZhbHVlIFI7CisgICAgUi5Dc3QgPSBWYWw7CisgICAgUi5TeW1BID0gU3ltQTsKKyAgICBSLlN5bUIgPSBTeW1COworICAgIFIuUmVmS2luZCA9IFJlZktpbmQ7CisgICAgcmV0dXJuIFI7CisgIH0KKworICBzdGF0aWMgTUNWYWx1ZSBnZXQoaW50NjRfdCBWYWwpIHsKKyAgICBNQ1ZhbHVlIFI7CisgICAgUi5Dc3QgPSBWYWw7CisgICAgUi5TeW1BID0gbnVsbHB0cjsKKyAgICBSLlN5bUIgPSBudWxscHRyOworICAgIFIuUmVmS2luZCA9IDA7CisgICAgcmV0dXJuIFI7CisgIH0KKworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DV2FzbU9iamVjdFdyaXRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1dhc21PYmplY3RXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGQ1ZWI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1dhc21PYmplY3RXcml0ZXIuaApAQCAtMCwwICsxLDUzIEBACisvLz09PS0tIGxsdm0vTUMvTUNXYXNtT2JqZWN0V3JpdGVyLmggLSBXYXNtIE9iamVjdCBXcml0ZXIgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNXQVNNT0JKRUNUV1JJVEVSX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1dBU01PQkpFQ1RXUklURVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvVHJpcGxlLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvV2FzbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNQ0ZpeHVwOworY2xhc3MgTUNPYmplY3RXcml0ZXI7CitjbGFzcyBNQ1ZhbHVlOworY2xhc3MgcmF3X3B3cml0ZV9zdHJlYW07CisKK2NsYXNzIE1DV2FzbU9iamVjdFRhcmdldFdyaXRlciB7CisgIGNvbnN0IHVuc2lnbmVkIElzNjRCaXQgOiAxOworCitwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IE1DV2FzbU9iamVjdFRhcmdldFdyaXRlcihib29sIElzNjRCaXRfKTsKKworcHVibGljOgorICB2aXJ0dWFsIH5NQ1dhc21PYmplY3RUYXJnZXRXcml0ZXIoKTsKKworICB2aXJ0dWFsIHVuc2lnbmVkIGdldFJlbG9jVHlwZShjb25zdCBNQ1ZhbHVlICZUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRml4dXAgJkZpeHVwKSBjb25zdCA9IDA7CisKKyAgLy8vIFxuYW1lIEFjY2Vzc29ycworICAvLy8gQHsKKyAgYm9vbCBpczY0Qml0KCkgY29uc3QgeyByZXR1cm4gSXM2NEJpdDsgfQorICAvLy8gQH0KK307CisKKy8vLyBcYnJpZWYgQ29uc3RydWN0IGEgbmV3IFdhc20gd3JpdGVyIGluc3RhbmNlLgorLy8vCisvLy8gXHBhcmFtIE1PVFcgLSBUaGUgdGFyZ2V0IHNwZWNpZmljIFdhc20gd3JpdGVyIHN1YmNsYXNzLgorLy8vIFxwYXJhbSBPUyAtIFRoZSBzdHJlYW0gdG8gd3JpdGUgdG8uCisvLy8gXHJldHVybnMgVGhlIGNvbnN0cnVjdGVkIG9iamVjdCB3cml0ZXIuCitzdGQ6OnVuaXF1ZV9wdHI8TUNPYmplY3RXcml0ZXI+CitjcmVhdGVXYXNtT2JqZWN0V3JpdGVyKHN0ZDo6dW5pcXVlX3B0cjxNQ1dhc21PYmplY3RUYXJnZXRXcml0ZXI+IE1PVFcsCisgICAgICAgICAgICAgICAgICAgICAgIHJhd19wd3JpdGVfc3RyZWFtICZPUyk7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1dhc21TdHJlYW1lci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1dhc21TdHJlYW1lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZDQ1NDUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DV2FzbVN0cmVhbWVyLmgKQEAgLTAsMCArMSw4NCBAQAorLy89PT0tIE1DV2FzbVN0cmVhbWVyLmggLSBNQ1N0cmVhbWVyIFdhc20gT2JqZWN0IEZpbGUgSW50ZXJmYWNlIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DV0FTTVNUUkVBTUVSX0gKKyNkZWZpbmUgTExWTV9NQ19NQ1dBU01TVFJFQU1FUl9ICisKKyNpbmNsdWRlICJNQ0FzbUJhY2tlbmQuaCIKKyNpbmNsdWRlICJNQ0NvZGVFbWl0dGVyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DRGlyZWN0aXZlcy5oIgorI2luY2x1ZGUgImxsdm0vTUMvTUNPYmplY3RTdHJlYW1lci5oIgorI2luY2x1ZGUgImxsdm0vTUMvU2VjdGlvbktpbmQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1DQXNzZW1ibGVyOworY2xhc3MgTUNFeHByOworY2xhc3MgTUNJbnN0OworY2xhc3MgcmF3X29zdHJlYW07CisKK2NsYXNzIE1DV2FzbVN0cmVhbWVyIDogcHVibGljIE1DT2JqZWN0U3RyZWFtZXIgeworcHVibGljOgorICBNQ1dhc21TdHJlYW1lcihNQ0NvbnRleHQgJkNvbnRleHQsIHN0ZDo6dW5pcXVlX3B0cjxNQ0FzbUJhY2tlbmQ+IFRBQiwKKyAgICAgICAgICAgICAgICAgcmF3X3B3cml0ZV9zdHJlYW0gJk9TLCBzdGQ6OnVuaXF1ZV9wdHI8TUNDb2RlRW1pdHRlcj4gRW1pdHRlcikKKyAgICAgIDogTUNPYmplY3RTdHJlYW1lcihDb250ZXh0LCBzdGQ6Om1vdmUoVEFCKSwgT1MsIHN0ZDo6bW92ZShFbWl0dGVyKSksCisgICAgICAgIFNlZW5JZGVudChmYWxzZSkge30KKworICB+TUNXYXNtU3RyZWFtZXIoKSBvdmVycmlkZTsKKworICAvLy8gc3RhdGUgbWFuYWdlbWVudAorICB2b2lkIHJlc2V0KCkgb3ZlcnJpZGUgeworICAgIFNlZW5JZGVudCA9IGZhbHNlOworICAgIE1DT2JqZWN0U3RyZWFtZXI6OnJlc2V0KCk7CisgIH0KKworICAvLy8gXG5hbWUgTUNTdHJlYW1lciBJbnRlcmZhY2UKKyAgLy8vIEB7CisKKyAgdm9pZCBDaGFuZ2VTZWN0aW9uKE1DU2VjdGlvbiAqU2VjdGlvbiwgY29uc3QgTUNFeHByICpTdWJzZWN0aW9uKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0QXNzZW1ibGVyRmxhZyhNQ0Fzc2VtYmxlckZsYWcgRmxhZykgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdFRodW1iRnVuYyhNQ1N5bWJvbCAqRnVuYykgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdFdlYWtSZWZlcmVuY2UoTUNTeW1ib2wgKkFsaWFzLCBjb25zdCBNQ1N5bWJvbCAqU3ltYm9sKSBvdmVycmlkZTsKKyAgYm9vbCBFbWl0U3ltYm9sQXR0cmlidXRlKE1DU3ltYm9sICpTeW1ib2wsIE1DU3ltYm9sQXR0ciBBdHRyaWJ1dGUpIG92ZXJyaWRlOworICB2b2lkIEVtaXRTeW1ib2xEZXNjKE1DU3ltYm9sICpTeW1ib2wsIHVuc2lnbmVkIERlc2NWYWx1ZSkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdENvbW1vblN5bWJvbChNQ1N5bWJvbCAqU3ltYm9sLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQnl0ZUFsaWdubWVudCkgb3ZlcnJpZGU7CisKKyAgdm9pZCBlbWl0RUxGU2l6ZShNQ1N5bWJvbCAqU3ltYm9sLCBjb25zdCBNQ0V4cHIgKlZhbHVlKSBvdmVycmlkZTsKKworICB2b2lkIEVtaXRMb2NhbENvbW1vblN5bWJvbChNQ1N5bWJvbCAqU3ltYm9sLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCeXRlQWxpZ25tZW50KSBvdmVycmlkZTsKKworICB2b2lkIEVtaXRaZXJvZmlsbChNQ1NlY3Rpb24gKlNlY3Rpb24sIE1DU3ltYm9sICpTeW1ib2wgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBTaXplID0gMCwgdW5zaWduZWQgQnl0ZUFsaWdubWVudCA9IDApIG92ZXJyaWRlOworICB2b2lkIEVtaXRUQlNTU3ltYm9sKE1DU2VjdGlvbiAqU2VjdGlvbiwgTUNTeW1ib2wgKlN5bWJvbCwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCeXRlQWxpZ25tZW50ID0gMCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdFZhbHVlSW1wbChjb25zdCBNQ0V4cHIgKlZhbHVlLCB1bnNpZ25lZCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgU01Mb2MgTG9jID0gU01Mb2MoKSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBFbWl0SWRlbnQoU3RyaW5nUmVmIElkZW50U3RyaW5nKSBvdmVycmlkZTsKKworICB2b2lkIEVtaXRWYWx1ZVRvQWxpZ25tZW50KHVuc2lnbmVkLCBpbnQ2NF90LCB1bnNpZ25lZCwgdW5zaWduZWQpIG92ZXJyaWRlOworCisgIHZvaWQgRmluaXNoSW1wbCgpIG92ZXJyaWRlOworCitwcml2YXRlOgorICB2b2lkIEVtaXRJbnN0VG9GcmFnbWVudChjb25zdCBNQ0luc3QgJkluc3QsIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0SW5zdFRvRGF0YShjb25zdCBNQ0luc3QgJkluc3QsIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIE1lcmdlIHRoZSBjb250ZW50IG9mIHRoZSBmcmFnbWVudCBccCBFRiBpbnRvIHRoZSBmcmFnbWVudCBccCBERi4KKyAgdm9pZCBtZXJnZUZyYWdtZW50KE1DRGF0YUZyYWdtZW50ICosIE1DRGF0YUZyYWdtZW50ICopOworCisgIGJvb2wgU2VlbklkZW50OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DV2luNjRFSC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1dpbjY0RUguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2VhNzM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NQ1dpbjY0RUguaApAQCAtMCwwICsxLDYyIEBACisvLz09PS0gTUNXaW42NEVILmggLSBNYWNoaW5lIENvZGUgV2luNjQgRUggc3VwcG9ydCAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBkZWNsYXJhdGlvbnMgdG8gc3VwcG9ydCB0aGUgV2luNjQgRXhjZXB0aW9uIEhhbmRsaW5nCisvLyBzY2hlbWUgaW4gTUMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01DV0lONjRFSF9ICisjZGVmaW5lIExMVk1fTUNfTUNXSU42NEVIX0gKKworI2luY2x1ZGUgImxsdm0vTUMvTUNXaW5FSC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9XaW42NEVILmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1DU3RyZWFtZXI7CitjbGFzcyBNQ1N5bWJvbDsKKworbmFtZXNwYWNlIFdpbjY0RUggeworc3RydWN0IEluc3RydWN0aW9uIHsKKyAgc3RhdGljIFdpbkVIOjpJbnN0cnVjdGlvbiBQdXNoTm9uVm9sKE1DU3ltYm9sICpMLCB1bnNpZ25lZCBSZWcpIHsKKyAgICByZXR1cm4gV2luRUg6Okluc3RydWN0aW9uKFdpbjY0RUg6OlVPUF9QdXNoTm9uVm9sLCBMLCBSZWcsIC0xKTsKKyAgfQorICBzdGF0aWMgV2luRUg6Okluc3RydWN0aW9uIEFsbG9jKE1DU3ltYm9sICpMLCB1bnNpZ25lZCBTaXplKSB7CisgICAgcmV0dXJuIFdpbkVIOjpJbnN0cnVjdGlvbihTaXplID4gMTI4ID8gVU9QX0FsbG9jTGFyZ2UgOiBVT1BfQWxsb2NTbWFsbCwgTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCBTaXplKTsKKyAgfQorICBzdGF0aWMgV2luRUg6Okluc3RydWN0aW9uIFB1c2hNYWNoRnJhbWUoTUNTeW1ib2wgKkwsIGJvb2wgQ29kZSkgeworICAgIHJldHVybiBXaW5FSDo6SW5zdHJ1Y3Rpb24oVU9QX1B1c2hNYWNoRnJhbWUsIEwsIC0xLCBDb2RlID8gMSA6IDApOworICB9CisgIHN0YXRpYyBXaW5FSDo6SW5zdHJ1Y3Rpb24gU2F2ZU5vblZvbChNQ1N5bWJvbCAqTCwgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT2Zmc2V0KSB7CisgICAgcmV0dXJuIFdpbkVIOjpJbnN0cnVjdGlvbihPZmZzZXQgPiA1MTIgKiAxMDI0IC0gOCA/IFVPUF9TYXZlTm9uVm9sQmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFVPUF9TYXZlTm9uVm9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCwgUmVnLCBPZmZzZXQpOworICB9CisgIHN0YXRpYyBXaW5FSDo6SW5zdHJ1Y3Rpb24gU2F2ZVhNTShNQ1N5bWJvbCAqTCwgdW5zaWduZWQgUmVnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgT2Zmc2V0KSB7CisgICAgcmV0dXJuIFdpbkVIOjpJbnN0cnVjdGlvbihPZmZzZXQgPiA1MTIgKiAxMDI0IC0gOCA/IFVPUF9TYXZlWE1NMTI4QmlnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFVPUF9TYXZlWE1NMTI4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTCwgUmVnLCBPZmZzZXQpOworICB9CisgIHN0YXRpYyBXaW5FSDo6SW5zdHJ1Y3Rpb24gU2V0RlBSZWcoTUNTeW1ib2wgKkwsIHVuc2lnbmVkIFJlZywgdW5zaWduZWQgT2ZmKSB7CisgICAgcmV0dXJuIFdpbkVIOjpJbnN0cnVjdGlvbihVT1BfU2V0RlBSZWcsIEwsIFJlZywgT2ZmKTsKKyAgfQorfTsKKworY2xhc3MgVW53aW5kRW1pdHRlciA6IHB1YmxpYyBXaW5FSDo6VW53aW5kRW1pdHRlciB7CitwdWJsaWM6CisgIHZvaWQgRW1pdChNQ1N0cmVhbWVyICZTdHJlYW1lcikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdFVud2luZEluZm8oTUNTdHJlYW1lciAmU3RyZWFtZXIsIFdpbkVIOjpGcmFtZUluZm8gKkZJKSBjb25zdCBvdmVycmlkZTsKK307Cit9Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNXaW5DT0ZGT2JqZWN0V3JpdGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DV2luQ09GRk9iamVjdFdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMzRiZDkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DV2luQ09GRk9iamVjdFdyaXRlci5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vPT09LSBsbHZtL01DL01DV2luQ09GRk9iamVjdFdyaXRlci5oIC0gV2luIENPRkYgT2JqZWN0IFdyaXRlciAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19NQ1dJTkNPRkZPQkpFQ1RXUklURVJfSAorI2RlZmluZSBMTFZNX01DX01DV0lOQ09GRk9CSkVDVFdSSVRFUl9ICisKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNBc21CYWNrZW5kOworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNGaXh1cDsKK2NsYXNzIE1DT2JqZWN0V3JpdGVyOworY2xhc3MgTUNWYWx1ZTsKK2NsYXNzIHJhd19wd3JpdGVfc3RyZWFtOworCisgIGNsYXNzIE1DV2luQ09GRk9iamVjdFRhcmdldFdyaXRlciB7CisgICAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCisgICAgY29uc3QgdW5zaWduZWQgTWFjaGluZTsKKworICBwcm90ZWN0ZWQ6CisgICAgTUNXaW5DT0ZGT2JqZWN0VGFyZ2V0V3JpdGVyKHVuc2lnbmVkIE1hY2hpbmVfKTsKKworICBwdWJsaWM6CisgICAgdmlydHVhbCB+TUNXaW5DT0ZGT2JqZWN0VGFyZ2V0V3JpdGVyKCkgPSBkZWZhdWx0OworCisgICAgdW5zaWduZWQgZ2V0TWFjaGluZSgpIGNvbnN0IHsgcmV0dXJuIE1hY2hpbmU7IH0KKyAgICB2aXJ0dWFsIHVuc2lnbmVkIGdldFJlbG9jVHlwZShNQ0NvbnRleHQgJkN0eCwgY29uc3QgTUNWYWx1ZSAmVGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DRml4dXAgJkZpeHVwLCBib29sIElzQ3Jvc3NTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtQmFja2VuZCAmTUFCKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBib29sIHJlY29yZFJlbG9jYXRpb24oY29uc3QgTUNGaXh1cCAmKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisgIH07CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBuZXcgV2luIENPRkYgd3JpdGVyIGluc3RhbmNlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBNT1RXIC0gVGhlIHRhcmdldCBzcGVjaWZpYyBXaW5DT0ZGIHdyaXRlciBzdWJjbGFzcy4KKyAgLy8vIFxwYXJhbSBPUyAtIFRoZSBzdHJlYW0gdG8gd3JpdGUgdG8uCisgIC8vLyBccmV0dXJucyBUaGUgY29uc3RydWN0ZWQgb2JqZWN0IHdyaXRlci4KKyAgc3RkOjp1bmlxdWVfcHRyPE1DT2JqZWN0V3JpdGVyPgorICBjcmVhdGVXaW5DT0ZGT2JqZWN0V3JpdGVyKHN0ZDo6dW5pcXVlX3B0cjxNQ1dpbkNPRkZPYmplY3RUYXJnZXRXcml0ZXI+IE1PVFcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X3B3cml0ZV9zdHJlYW0gJk9TKTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX01DV0lOQ09GRk9CSkVDVFdSSVRFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DV2luQ09GRlN0cmVhbWVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DV2luQ09GRlN0cmVhbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBjMTdjYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNXaW5DT0ZGU3RyZWFtZXIuaApAQCAtMCwwICsxLDgxIEBACisvLz09PS0gTUNXaW5DT0ZGU3RyZWFtZXIuaCAtIENPRkYgT2JqZWN0IEZpbGUgSW50ZXJmYWNlIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNXSU5DT0ZGU1RSRUFNRVJfSAorI2RlZmluZSBMTFZNX01DX01DV0lOQ09GRlNUUkVBTUVSX0gKKworI2luY2x1ZGUgImxsdm0vTUMvTUNEaXJlY3RpdmVzLmgiCisjaW5jbHVkZSAibGx2bS9NQy9NQ09iamVjdFN0cmVhbWVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTUNBc21CYWNrZW5kOworY2xhc3MgTUNDb250ZXh0OworY2xhc3MgTUNDb2RlRW1pdHRlcjsKK2NsYXNzIE1DSW5zdDsKK2NsYXNzIE1DU2VjdGlvbjsKK2NsYXNzIE1DU3VidGFyZ2V0SW5mbzsKK2NsYXNzIE1DU3ltYm9sOworY2xhc3MgU3RyaW5nUmVmOworY2xhc3MgcmF3X3B3cml0ZV9zdHJlYW07CisKK2NsYXNzIE1DV2luQ09GRlN0cmVhbWVyIDogcHVibGljIE1DT2JqZWN0U3RyZWFtZXIgeworcHVibGljOgorICBNQ1dpbkNPRkZTdHJlYW1lcihNQ0NvbnRleHQgJkNvbnRleHQsIHN0ZDo6dW5pcXVlX3B0cjxNQ0FzbUJhY2tlbmQ+IE1BQiwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1DQ29kZUVtaXR0ZXI+IENFLCByYXdfcHdyaXRlX3N0cmVhbSAmT1MpOworCisgIC8vLyBzdGF0ZSBtYW5hZ2VtZW50CisgIHZvaWQgcmVzZXQoKSBvdmVycmlkZSB7CisgICAgQ3VyU3ltYm9sID0gbnVsbHB0cjsKKyAgICBNQ09iamVjdFN0cmVhbWVyOjpyZXNldCgpOworICB9CisKKyAgLy8vIFxuYW1lIE1DU3RyZWFtZXIgaW50ZXJmYWNlCisgIC8vLyBceworCisgIHZvaWQgSW5pdFNlY3Rpb25zKGJvb2wgTm9FeGVjU3RhY2spIG92ZXJyaWRlOworICB2b2lkIEVtaXRMYWJlbChNQ1N5bWJvbCAqU3ltYm9sLCBTTUxvYyBMb2MgPSBTTUxvYygpKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0QXNzZW1ibGVyRmxhZyhNQ0Fzc2VtYmxlckZsYWcgRmxhZykgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdFRodW1iRnVuYyhNQ1N5bWJvbCAqRnVuYykgb3ZlcnJpZGU7CisgIGJvb2wgRW1pdFN5bWJvbEF0dHJpYnV0ZShNQ1N5bWJvbCAqU3ltYm9sLCBNQ1N5bWJvbEF0dHIgQXR0cmlidXRlKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0U3ltYm9sRGVzYyhNQ1N5bWJvbCAqU3ltYm9sLCB1bnNpZ25lZCBEZXNjVmFsdWUpIG92ZXJyaWRlOworICB2b2lkIEJlZ2luQ09GRlN5bWJvbERlZihNQ1N5bWJvbCBjb25zdCAqU3ltYm9sKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0Q09GRlN5bWJvbFN0b3JhZ2VDbGFzcyhpbnQgU3RvcmFnZUNsYXNzKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0Q09GRlN5bWJvbFR5cGUoaW50IFR5cGUpIG92ZXJyaWRlOworICB2b2lkIEVuZENPRkZTeW1ib2xEZWYoKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0Q09GRlNhZmVTRUgoTUNTeW1ib2wgY29uc3QgKlN5bWJvbCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdENPRkZTeW1ib2xJbmRleChNQ1N5bWJvbCBjb25zdCAqU3ltYm9sKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0Q09GRlNlY3Rpb25JbmRleChNQ1N5bWJvbCBjb25zdCAqU3ltYm9sKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0Q09GRlNlY1JlbDMyKE1DU3ltYm9sIGNvbnN0ICpTeW1ib2wsIHVpbnQ2NF90IE9mZnNldCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdENvbW1vblN5bWJvbChNQ1N5bWJvbCAqU3ltYm9sLCB1aW50NjRfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQnl0ZUFsaWdubWVudCkgb3ZlcnJpZGU7CisgIHZvaWQgRW1pdExvY2FsQ29tbW9uU3ltYm9sKE1DU3ltYm9sICpTeW1ib2wsIHVpbnQ2NF90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQpIG92ZXJyaWRlOworICB2b2lkIEVtaXRaZXJvZmlsbChNQ1NlY3Rpb24gKlNlY3Rpb24sIE1DU3ltYm9sICpTeW1ib2wsIHVpbnQ2NF90IFNpemUsCisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJ5dGVBbGlnbm1lbnQpIG92ZXJyaWRlOworICB2b2lkIEVtaXRUQlNTU3ltYm9sKE1DU2VjdGlvbiAqU2VjdGlvbiwgTUNTeW1ib2wgKlN5bWJvbCwgdWludDY0X3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBCeXRlQWxpZ25tZW50KSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0SWRlbnQoU3RyaW5nUmVmIElkZW50U3RyaW5nKSBvdmVycmlkZTsKKyAgdm9pZCBFbWl0V2luRUhIYW5kbGVyRGF0YShTTUxvYyBMb2MpIG92ZXJyaWRlOworICB2b2lkIEZpbmlzaEltcGwoKSBvdmVycmlkZTsKKworICAvLy8gXH0KKworcHJvdGVjdGVkOgorICBjb25zdCBNQ1N5bWJvbCAqQ3VyU3ltYm9sOworCisgIHZvaWQgRW1pdEluc3RUb0RhdGEoY29uc3QgTUNJbnN0ICZJbnN0LCBjb25zdCBNQ1N1YnRhcmdldEluZm8gJlNUSSkgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIHZvaWQgRXJyb3IoY29uc3QgVHdpbmUgJk1zZykgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQ1dJTkNPRkZTVFJFQU1FUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DV2luRUguaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvTUNXaW5FSC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjYTUyYTYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01DV2luRUguaApAQCAtMCwwICsxLDY3IEBACisvLz09PS0gTUNXaW5FSC5oIC0gV2luZG93cyBVbndpbmRpbmcgU3VwcG9ydCAtLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fTUNfTUNXSU5FSF9ICisjZGVmaW5lIExMVk1fTUNfTUNXSU5FSF9ICisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1DU2VjdGlvbjsKK2NsYXNzIE1DU3RyZWFtZXI7CitjbGFzcyBNQ1N5bWJvbDsKKworbmFtZXNwYWNlIFdpbkVIIHsKK3N0cnVjdCBJbnN0cnVjdGlvbiB7CisgIGNvbnN0IE1DU3ltYm9sICpMYWJlbDsKKyAgY29uc3QgdW5zaWduZWQgT2Zmc2V0OworICBjb25zdCB1bnNpZ25lZCBSZWdpc3RlcjsKKyAgY29uc3QgdW5zaWduZWQgT3BlcmF0aW9uOworCisgIEluc3RydWN0aW9uKHVuc2lnbmVkIE9wLCBNQ1N5bWJvbCAqTCwgdW5zaWduZWQgUmVnLCB1bnNpZ25lZCBPZmYpCisgICAgOiBMYWJlbChMKSwgT2Zmc2V0KE9mZiksIFJlZ2lzdGVyKFJlZyksIE9wZXJhdGlvbihPcCkge30KK307CisKK3N0cnVjdCBGcmFtZUluZm8geworICBjb25zdCBNQ1N5bWJvbCAqQmVnaW4gPSBudWxscHRyOworICBjb25zdCBNQ1N5bWJvbCAqRW5kID0gbnVsbHB0cjsKKyAgY29uc3QgTUNTeW1ib2wgKkV4Y2VwdGlvbkhhbmRsZXIgPSBudWxscHRyOworICBjb25zdCBNQ1N5bWJvbCAqRnVuY3Rpb24gPSBudWxscHRyOworICBjb25zdCBNQ1N5bWJvbCAqUHJvbG9nRW5kID0gbnVsbHB0cjsKKyAgY29uc3QgTUNTeW1ib2wgKlN5bWJvbCA9IG51bGxwdHI7CisgIGNvbnN0IE1DU2VjdGlvbiAqVGV4dFNlY3Rpb24gPSBudWxscHRyOworCisgIGJvb2wgSGFuZGxlc1Vud2luZCA9IGZhbHNlOworICBib29sIEhhbmRsZXNFeGNlcHRpb25zID0gZmFsc2U7CisKKyAgaW50IExhc3RGcmFtZUluc3QgPSAtMTsKKyAgY29uc3QgRnJhbWVJbmZvICpDaGFpbmVkUGFyZW50ID0gbnVsbHB0cjsKKyAgc3RkOjp2ZWN0b3I8SW5zdHJ1Y3Rpb24+IEluc3RydWN0aW9uczsKKworICBGcmFtZUluZm8oKSA9IGRlZmF1bHQ7CisgIEZyYW1lSW5mbyhjb25zdCBNQ1N5bWJvbCAqRnVuY3Rpb24sIGNvbnN0IE1DU3ltYm9sICpCZWdpbkZ1bmNFSExhYmVsKQorICAgICAgOiBCZWdpbihCZWdpbkZ1bmNFSExhYmVsKSwgRnVuY3Rpb24oRnVuY3Rpb24pIHt9CisgIEZyYW1lSW5mbyhjb25zdCBNQ1N5bWJvbCAqRnVuY3Rpb24sIGNvbnN0IE1DU3ltYm9sICpCZWdpbkZ1bmNFSExhYmVsLAorICAgICAgICAgICAgY29uc3QgRnJhbWVJbmZvICpDaGFpbmVkUGFyZW50KQorICAgICAgOiBCZWdpbihCZWdpbkZ1bmNFSExhYmVsKSwgRnVuY3Rpb24oRnVuY3Rpb24pLAorICAgICAgICBDaGFpbmVkUGFyZW50KENoYWluZWRQYXJlbnQpIHt9Cit9OworCitjbGFzcyBVbndpbmRFbWl0dGVyIHsKK3B1YmxpYzoKKyAgdmlydHVhbCB+VW53aW5kRW1pdHRlcigpOworCisgIC8vLyBUaGlzIGVtaXRzIHRoZSB1bndpbmQgaW5mbyBzZWN0aW9ucyAoLnBkYXRhIGFuZCAueGRhdGEgaW4gUEUvQ09GRikuCisgIHZpcnR1YWwgdm9pZCBFbWl0KE1DU3RyZWFtZXIgJlN0cmVhbWVyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBFbWl0VW53aW5kSW5mbyhNQ1N0cmVhbWVyICZTdHJlYW1lciwgRnJhbWVJbmZvICpGSSkgY29uc3QgPSAwOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL01hY2hpbmVMb2NhdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NYWNoaW5lTG9jYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MWVkNjYxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9NYWNoaW5lTG9jYXRpb24uaApAQCAtMCwwICsxLDU5IEBACisvLz09PS0gbGx2bS9NQy9NYWNoaW5lTG9jYXRpb24uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGhlIE1hY2hpbmVMb2NhdGlvbiBjbGFzcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIHNpbXBsZSBsb2NhdGlvbiBpbiBhIG1hY2hpbmUKKy8vIGZyYW1lLiAgTG9jYXRpb25zIHdpbGwgYmUgb25lIG9mIHR3byBmb3JtczsgYSByZWdpc3RlciBvciBhbiBhZGRyZXNzIGZvcm1lZAorLy8gZnJvbSBhIGJhc2UgYWRkcmVzcyBwbHVzIGFuIG9mZnNldC4gIFJlZ2lzdGVyIGluZGlyZWN0aW9uIGNhbiBiZSBzcGVjaWZpZWQgYnkKKy8vIGV4cGxpY2l0bHkgcGFzc2luZyBhbiBvZmZzZXQgdG8gdGhlIGNvbnN0cnVjdG9yLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX01BQ0hJTkVMT0NBVElPTl9ICisjZGVmaW5lIExMVk1fTUNfTUFDSElORUxPQ0FUSU9OX0gKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNYWNoaW5lTG9jYXRpb24geworcHJpdmF0ZToKKyAgYm9vbCBJc1JlZ2lzdGVyID0gZmFsc2U7ICAgICAgICAgICAgICAvLy88IFRydWUgaWYgbG9jYXRpb24gaXMgYSByZWdpc3Rlci4KKyAgdW5zaWduZWQgUmVnaXN0ZXIgPSAwOyAgICAgICAgICAgICAgICAvLy88IGdjYy9nZGIgcmVnaXN0ZXIgbnVtYmVyLgorCitwdWJsaWM6CisgIGVudW0gOiB1aW50MzJfdCB7CisgICAgLy8gVGhlIHRhcmdldCByZWdpc3RlciBudW1iZXIgZm9yIGFuIGFic3RyYWN0IGZyYW1lIHBvaW50ZXIuIFRoZSB2YWx1ZSBpcworICAgIC8vIGFuIGFyYml0cmFyeSB2YWx1ZSB0aGF0IGRvZXNuJ3QgY29sbGlkZSB3aXRoIGFueSByZWFsIHRhcmdldCByZWdpc3Rlci4KKyAgICBWaXJ0dWFsRlAgPSB+MFUKKyAgfTsKKworICBNYWNoaW5lTG9jYXRpb24oKSA9IGRlZmF1bHQ7CisgIC8vLyBDcmVhdGUgYSBkaXJlY3QgcmVnaXN0ZXIgbG9jYXRpb24uCisgIGV4cGxpY2l0IE1hY2hpbmVMb2NhdGlvbih1bnNpZ25lZCBSLCBib29sIEluZGlyZWN0ID0gZmFsc2UpCisgICAgICA6IElzUmVnaXN0ZXIoIUluZGlyZWN0KSwgUmVnaXN0ZXIoUikge30KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWFjaGluZUxvY2F0aW9uICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBJc1JlZ2lzdGVyID09IE90aGVyLklzUmVnaXN0ZXIgJiYgUmVnaXN0ZXIgPT0gT3RoZXIuUmVnaXN0ZXI7CisgIH0KKworICAvLyBBY2Nlc3NvcnMuCisgIC8vLyBccmV0dXJuIHRydWUgaWZmIHRoaXMgaXMgYSByZWdpc3Rlci1pbmRpcmVjdCBsb2NhdGlvbi4KKyAgYm9vbCBpc0luZGlyZWN0KCkgICAgICBjb25zdCB7IHJldHVybiAhSXNSZWdpc3RlcjsgfQorICBib29sIGlzUmVnKCkgICAgICAgICAgIGNvbnN0IHsgcmV0dXJuIElzUmVnaXN0ZXI7IH0KKyAgdW5zaWduZWQgZ2V0UmVnKCkgICAgICBjb25zdCB7IHJldHVybiBSZWdpc3RlcjsgfQorICB2b2lkIHNldElzUmVnaXN0ZXIoYm9vbCBJcykgIHsgSXNSZWdpc3RlciA9IElzOyB9CisgIHZvaWQgc2V0UmVnaXN0ZXIodW5zaWduZWQgUikgeyBSZWdpc3RlciA9IFI7IH0KK307CisKK2lubGluZSBib29sIG9wZXJhdG9yIT0oY29uc3QgTWFjaGluZUxvY2F0aW9uICZMSFMsIGNvbnN0IE1hY2hpbmVMb2NhdGlvbiAmUkhTKSB7CisgIHJldHVybiAhKExIUyA9PSBSSFMpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19NQUNISU5FTE9DQVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9TZWN0aW9uS2luZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9NQy9TZWN0aW9uS2luZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY2ZWI5ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL1NlY3Rpb25LaW5kLmgKQEAgLTAsMCArMSwyMDggQEAKKy8vPT09LS0gbGx2bS9NQy9TZWN0aW9uS2luZC5oIC0gQ2xhc3NpZmljYXRpb24gb2Ygc2VjdGlvbnMgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19TRUNUSU9OS0lORF9ICisjZGVmaW5lIExMVk1fTUNfU0VDVElPTktJTkRfSAorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBTZWN0aW9uS2luZCAtIFRoaXMgaXMgYSBzaW1wbGUgUE9EIHZhbHVlIHRoYXQgY2xhc3NpZmllcyB0aGUgcHJvcGVydGllcyBvZgorLy8vIGEgc2VjdGlvbi4gIEEgc2VjdGlvbiBpcyBjbGFzc2lmaWVkIGludG8gdGhlIGRlZXBlc3QgcG9zc2libGUKKy8vLyBjbGFzc2lmaWNhdGlvbiwgYW5kIHRoZW4gdGhlIHRhcmdldCBtYXBzIHRoZW0gb250byB0aGVpciBzZWN0aW9ucyBiYXNlZCBvbgorLy8vIHdoYXQgY2FwYWJpbGl0aWVzIHRoZXkgaGF2ZS4KKy8vLworLy8vIFRoZSBjb21tZW50cyBiZWxvdyBkZXNjcmliZSB0aGVzZSBhcyBpZiB0aGV5IHdlcmUgYW4gaW5oZXJpdGFuY2UgaGllcmFyY2h5CisvLy8gaW4gb3JkZXIgdG8gZXhwbGFpbiB0aGUgcHJlZGljYXRlcyBiZWxvdy4KKy8vLworY2xhc3MgU2VjdGlvbktpbmQgeworICBlbnVtIEtpbmQgeworICAgIC8vLyBNZXRhZGF0YSAtIERlYnVnIGluZm8gc2VjdGlvbnMgb3Igb3RoZXIgbWV0YWRhdGEuCisgICAgTWV0YWRhdGEsCisKKyAgICAvLy8gVGV4dCAtIFRleHQgc2VjdGlvbiwgdXNlZCBmb3IgZnVuY3Rpb25zIGFuZCBvdGhlciBleGVjdXRhYmxlIGNvZGUuCisgICAgVGV4dCwKKworICAgICAgICAgICAvLy8gRXhlY3V0ZU9ubHksIFRleHQgc2VjdGlvbiB0aGF0IGlzIG5vdCByZWFkYWJsZS4KKyAgICAgICAgICAgRXhlY3V0ZU9ubHksCisKKyAgICAvLy8gUmVhZE9ubHkgLSBEYXRhIHRoYXQgaXMgbmV2ZXIgd3JpdHRlbiB0byBhdCBwcm9ncmFtIHJ1bnRpbWUgYnkgdGhlCisgICAgLy8vIHByb2dyYW0gb3IgdGhlIGR5bmFtaWMgbGlua2VyLiAgVGhpbmdzIGluIHRoZSB0b3AtbGV2ZWwgcmVhZG9ubHkKKyAgICAvLy8gU2VjdGlvbktpbmQgYXJlIG5vdCBtZXJnZWFibGUuCisgICAgUmVhZE9ubHksCisKKyAgICAgICAgLy8vIE1lcmdhYmxlQ1N0cmluZyAtIEFueSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHdoaWNoIGFsbG93cyBtZXJnaW5nLgorICAgICAgICAvLy8gVGhlc2UgdmFsdWVzIGFyZSBrbm93biB0byBlbmQgaW4gYSBudWwgdmFsdWUgb2YgdGhlIHNwZWNpZmllZCBzaXplLAorICAgICAgICAvLy8gbm90IG90aGVyd2lzZSBjb250YWluIGEgbnVsIHZhbHVlLCBhbmQgYmUgbWVyZ2FibGUuICBUaGlzIGFsbG93cyB0aGUKKyAgICAgICAgLy8vIGxpbmtlciB0byB1bmlxdWUgdGhlIHN0cmluZ3MgaWYgaXQgc28gZGVzaXJlcy4KKworICAgICAgICAgICAvLy8gTWVyZ2VhYmxlMUJ5dGVDU3RyaW5nIC0gMSBieXRlIG1lcmdhYmxlLCBudWxsIHRlcm1pbmF0ZWQsIHN0cmluZy4KKyAgICAgICAgICAgTWVyZ2VhYmxlMUJ5dGVDU3RyaW5nLAorCisgICAgICAgICAgIC8vLyBNZXJnZWFibGUyQnl0ZUNTdHJpbmcgLSAyIGJ5dGUgbWVyZ2FibGUsIG51bGwgdGVybWluYXRlZCwgc3RyaW5nLgorICAgICAgICAgICBNZXJnZWFibGUyQnl0ZUNTdHJpbmcsCisKKyAgICAgICAgICAgLy8vIE1lcmdlYWJsZTRCeXRlQ1N0cmluZyAtIDQgYnl0ZSBtZXJnYWJsZSwgbnVsbCB0ZXJtaW5hdGVkLCBzdHJpbmcuCisgICAgICAgICAgIE1lcmdlYWJsZTRCeXRlQ1N0cmluZywKKworICAgICAgICAvLy8gTWVyZ2VhYmxlQ29uc3QgLSBUaGVzZSBhcmUgc2VjdGlvbnMgZm9yIG1lcmdpbmcgZml4ZWQtbGVuZ3RoCisgICAgICAgIC8vLyBjb25zdGFudHMgdG9nZXRoZXIuICBGb3IgZXhhbXBsZSwgdGhpcyBjYW4gYmUgdXNlZCB0byB1bmlxdWUKKyAgICAgICAgLy8vIGNvbnN0YW50IHBvb2wgZW50cmllcyBldGMuCisKKyAgICAgICAgICAgIC8vLyBNZXJnZWFibGVDb25zdDQgLSBUaGlzIGlzIGEgc2VjdGlvbiB1c2VkIGJ5IDQtYnl0ZSBjb25zdGFudHMsCisgICAgICAgICAgICAvLy8gZm9yIGV4YW1wbGUsIGZsb2F0cy4KKyAgICAgICAgICAgIE1lcmdlYWJsZUNvbnN0NCwKKworICAgICAgICAgICAgLy8vIE1lcmdlYWJsZUNvbnN0OCAtIFRoaXMgaXMgYSBzZWN0aW9uIHVzZWQgYnkgOC1ieXRlIGNvbnN0YW50cywKKyAgICAgICAgICAgIC8vLyBmb3IgZXhhbXBsZSwgZG91Ymxlcy4KKyAgICAgICAgICAgIE1lcmdlYWJsZUNvbnN0OCwKKworICAgICAgICAgICAgLy8vIE1lcmdlYWJsZUNvbnN0MTYgLSBUaGlzIGlzIGEgc2VjdGlvbiB1c2VkIGJ5IDE2LWJ5dGUgY29uc3RhbnRzLAorICAgICAgICAgICAgLy8vIGZvciBleGFtcGxlLCB2ZWN0b3JzLgorICAgICAgICAgICAgTWVyZ2VhYmxlQ29uc3QxNiwKKworICAgICAgICAgICAgLy8vIE1lcmdlYWJsZUNvbnN0MzIgLSBUaGlzIGlzIGEgc2VjdGlvbiB1c2VkIGJ5IDMyLWJ5dGUgY29uc3RhbnRzLAorICAgICAgICAgICAgLy8vIGZvciBleGFtcGxlLCB2ZWN0b3JzLgorICAgICAgICAgICAgTWVyZ2VhYmxlQ29uc3QzMiwKKworICAgIC8vLyBXcml0ZWFibGUgLSBUaGlzIGlzIHRoZSBiYXNlIG9mIGFsbCBzZWdtZW50cyB0aGF0IG5lZWQgdG8gYmUgd3JpdHRlbgorICAgIC8vLyB0byBkdXJpbmcgcHJvZ3JhbSBydW50aW1lLgorCisgICAgICAgLy8vIFRocmVhZExvY2FsIC0gVGhpcyBpcyB0aGUgYmFzZSBvZiBhbGwgVExTIHNlZ21lbnRzLiAgQWxsIFRMUworICAgICAgIC8vLyBvYmplY3RzIG11c3QgYmUgd3JpdGVhYmxlLCBvdGhlcndpc2UgdGhlcmUgaXMgbm8gcmVhc29uIGZvciB0aGVtIHRvCisgICAgICAgLy8vIGJlIHRocmVhZCBsb2NhbCEKKworICAgICAgICAgICAvLy8gVGhyZWFkQlNTIC0gWmVyby1pbml0aWFsaXplZCBUTFMgZGF0YSBvYmplY3RzLgorICAgICAgICAgICBUaHJlYWRCU1MsCisKKyAgICAgICAgICAgLy8vIFRocmVhZERhdGEgLSBJbml0aWFsaXplZCBUTFMgZGF0YSBvYmplY3RzLgorICAgICAgICAgICBUaHJlYWREYXRhLAorCisgICAgICAgLy8vIEdsb2JhbFdyaXRlYWJsZURhdGEgLSBXcml0ZWFibGUgZGF0YSB0aGF0IGlzIGdsb2JhbCAobm90IHRocmVhZAorICAgICAgIC8vLyBsb2NhbCkuCisKKyAgICAgICAgICAgLy8vIEJTUyAtIFplcm8gaW5pdGlhbGl6ZWQgd3JpdGVhYmxlIGRhdGEuCisgICAgICAgICAgIEJTUywKKworICAgICAgICAgICAgICAgLy8vIEJTU0xvY2FsIC0gVGhpcyBpcyBCU1MgKHplcm8gaW5pdGlhbGl6ZWQgYW5kIHdyaXRhYmxlKSBkYXRhCisgICAgICAgICAgICAgICAvLy8gd2hpY2ggaGFzIGxvY2FsIGxpbmthZ2UuCisgICAgICAgICAgICAgICBCU1NMb2NhbCwKKworICAgICAgICAgICAgICAgLy8vIEJTU0V4dGVybiAtIFRoaXMgaXMgQlNTIGRhdGEgd2l0aCBub3JtYWwgZXh0ZXJuYWwgbGlua2FnZS4KKyAgICAgICAgICAgICAgIEJTU0V4dGVybiwKKworICAgICAgICAgICAvLy8gQ29tbW9uIC0gRGF0YSB3aXRoIGNvbW1vbiBsaW5rYWdlLiAgVGhlc2UgcmVwcmVzZW50IHRlbnRhdGl2ZQorICAgICAgICAgICAvLy8gZGVmaW5pdGlvbnMsIHdoaWNoIGFsd2F5cyBoYXZlIGEgemVybyBpbml0aWFsaXplciBhbmQgYXJlIG5ldmVyCisgICAgICAgICAgIC8vLyBtYXJrZWQgJ2NvbnN0YW50Jy4KKyAgICAgICAgICAgQ29tbW9uLAorCisgICAgICAgICAgIC8vLyBUaGlzIGlzIHdyaXRlYWJsZSBkYXRhIHRoYXQgaGFzIGEgbm9uLXplcm8gaW5pdGlhbGl6ZXIuCisgICAgICAgICAgIERhdGEsCisKKyAgICAgICAgICAgLy8vIFJlYWRPbmx5V2l0aFJlbCAtIFRoZXNlIGFyZSBnbG9iYWwgdmFyaWFibGVzIHRoYXQgYXJlIG5ldmVyCisgICAgICAgICAgIC8vLyB3cml0dGVuIHRvIGJ5IHRoZSBwcm9ncmFtLCBidXQgdGhhdCBoYXZlIHJlbG9jYXRpb25zLCBzbyB0aGV5CisgICAgICAgICAgIC8vLyBtdXN0IGJlIHN0dWNrIGluIGEgd3JpdGVhYmxlIHNlY3Rpb24gc28gdGhhdCB0aGUgZHluYW1pYyBsaW5rZXIKKyAgICAgICAgICAgLy8vIGNhbiB3cml0ZSB0byB0aGVtLiAgSWYgaXQgY2hvb3NlcyB0bywgdGhlIGR5bmFtaWMgbGlua2VyIGNhbgorICAgICAgICAgICAvLy8gbWFyayB0aGUgcGFnZXMgdGhlc2UgZ2xvYmFscyBlbmQgdXAgb24gYXMgcmVhZC1vbmx5IGFmdGVyIGl0IGlzCisgICAgICAgICAgIC8vLyBkb25lIHdpdGggaXRzIHJlbG9jYXRpb24gcGhhc2UuCisgICAgICAgICAgIFJlYWRPbmx5V2l0aFJlbAorICB9IEsgOiA4OworcHVibGljOgorCisgIGJvb2wgaXNNZXRhZGF0YSgpIGNvbnN0IHsgcmV0dXJuIEsgPT0gTWV0YWRhdGE7IH0KKworICBib29sIGlzVGV4dCgpIGNvbnN0IHsgcmV0dXJuIEsgPT0gVGV4dCB8fCBLID09IEV4ZWN1dGVPbmx5OyB9CisKKyAgYm9vbCBpc0V4ZWN1dGVPbmx5KCkgY29uc3QgeyByZXR1cm4gSyA9PSBFeGVjdXRlT25seTsgfQorCisgIGJvb2wgaXNSZWFkT25seSgpIGNvbnN0IHsKKyAgICByZXR1cm4gSyA9PSBSZWFkT25seSB8fCBpc01lcmdlYWJsZUNTdHJpbmcoKSB8fAorICAgICAgICAgICBpc01lcmdlYWJsZUNvbnN0KCk7CisgIH0KKworICBib29sIGlzTWVyZ2VhYmxlQ1N0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gSyA9PSBNZXJnZWFibGUxQnl0ZUNTdHJpbmcgfHwgSyA9PSBNZXJnZWFibGUyQnl0ZUNTdHJpbmcgfHwKKyAgICAgICAgICAgSyA9PSBNZXJnZWFibGU0Qnl0ZUNTdHJpbmc7CisgIH0KKyAgYm9vbCBpc01lcmdlYWJsZTFCeXRlQ1N0cmluZygpIGNvbnN0IHsgcmV0dXJuIEsgPT0gTWVyZ2VhYmxlMUJ5dGVDU3RyaW5nOyB9CisgIGJvb2wgaXNNZXJnZWFibGUyQnl0ZUNTdHJpbmcoKSBjb25zdCB7IHJldHVybiBLID09IE1lcmdlYWJsZTJCeXRlQ1N0cmluZzsgfQorICBib29sIGlzTWVyZ2VhYmxlNEJ5dGVDU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gSyA9PSBNZXJnZWFibGU0Qnl0ZUNTdHJpbmc7IH0KKworICBib29sIGlzTWVyZ2VhYmxlQ29uc3QoKSBjb25zdCB7CisgICAgcmV0dXJuIEsgPT0gTWVyZ2VhYmxlQ29uc3Q0IHx8IEsgPT0gTWVyZ2VhYmxlQ29uc3Q4IHx8CisgICAgICAgICAgIEsgPT0gTWVyZ2VhYmxlQ29uc3QxNiB8fCBLID09IE1lcmdlYWJsZUNvbnN0MzI7CisgIH0KKyAgYm9vbCBpc01lcmdlYWJsZUNvbnN0NCgpIGNvbnN0IHsgcmV0dXJuIEsgPT0gTWVyZ2VhYmxlQ29uc3Q0OyB9CisgIGJvb2wgaXNNZXJnZWFibGVDb25zdDgoKSBjb25zdCB7IHJldHVybiBLID09IE1lcmdlYWJsZUNvbnN0ODsgfQorICBib29sIGlzTWVyZ2VhYmxlQ29uc3QxNigpIGNvbnN0IHsgcmV0dXJuIEsgPT0gTWVyZ2VhYmxlQ29uc3QxNjsgfQorICBib29sIGlzTWVyZ2VhYmxlQ29uc3QzMigpIGNvbnN0IHsgcmV0dXJuIEsgPT0gTWVyZ2VhYmxlQ29uc3QzMjsgfQorCisgIGJvb2wgaXNXcml0ZWFibGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzVGhyZWFkTG9jYWwoKSB8fCBpc0dsb2JhbFdyaXRlYWJsZURhdGEoKTsKKyAgfQorCisgIGJvb2wgaXNUaHJlYWRMb2NhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSyA9PSBUaHJlYWREYXRhIHx8IEsgPT0gVGhyZWFkQlNTOworICB9CisKKyAgYm9vbCBpc1RocmVhZEJTUygpIGNvbnN0IHsgcmV0dXJuIEsgPT0gVGhyZWFkQlNTOyB9CisgIGJvb2wgaXNUaHJlYWREYXRhKCkgY29uc3QgeyByZXR1cm4gSyA9PSBUaHJlYWREYXRhOyB9CisKKyAgYm9vbCBpc0dsb2JhbFdyaXRlYWJsZURhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzQlNTKCkgfHwgaXNDb21tb24oKSB8fCBpc0RhdGEoKSB8fCBpc1JlYWRPbmx5V2l0aFJlbCgpOworICB9CisKKyAgYm9vbCBpc0JTUygpIGNvbnN0IHsgcmV0dXJuIEsgPT0gQlNTIHx8IEsgPT0gQlNTTG9jYWwgfHwgSyA9PSBCU1NFeHRlcm47IH0KKyAgYm9vbCBpc0JTU0xvY2FsKCkgY29uc3QgeyByZXR1cm4gSyA9PSBCU1NMb2NhbDsgfQorICBib29sIGlzQlNTRXh0ZXJuKCkgY29uc3QgeyByZXR1cm4gSyA9PSBCU1NFeHRlcm47IH0KKworICBib29sIGlzQ29tbW9uKCkgY29uc3QgeyByZXR1cm4gSyA9PSBDb21tb247IH0KKworICBib29sIGlzRGF0YSgpIGNvbnN0IHsgcmV0dXJuIEsgPT0gRGF0YTsgfQorCisgIGJvb2wgaXNSZWFkT25seVdpdGhSZWwoKSBjb25zdCB7CisgICAgcmV0dXJuIEsgPT0gUmVhZE9ubHlXaXRoUmVsOworICB9Citwcml2YXRlOgorICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0KEtpbmQgSykgeworICAgIFNlY3Rpb25LaW5kIFJlczsKKyAgICBSZXMuSyA9IEs7CisgICAgcmV0dXJuIFJlczsKKyAgfQorcHVibGljOgorCisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRNZXRhZGF0YSgpIHsgcmV0dXJuIGdldChNZXRhZGF0YSk7IH0KKyAgc3RhdGljIFNlY3Rpb25LaW5kIGdldFRleHQoKSB7IHJldHVybiBnZXQoVGV4dCk7IH0KKyAgc3RhdGljIFNlY3Rpb25LaW5kIGdldEV4ZWN1dGVPbmx5KCkgeyByZXR1cm4gZ2V0KEV4ZWN1dGVPbmx5KTsgfQorICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0UmVhZE9ubHkoKSB7IHJldHVybiBnZXQoUmVhZE9ubHkpOyB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRNZXJnZWFibGUxQnl0ZUNTdHJpbmcoKSB7CisgICAgcmV0dXJuIGdldChNZXJnZWFibGUxQnl0ZUNTdHJpbmcpOworICB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRNZXJnZWFibGUyQnl0ZUNTdHJpbmcoKSB7CisgICAgcmV0dXJuIGdldChNZXJnZWFibGUyQnl0ZUNTdHJpbmcpOworICB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRNZXJnZWFibGU0Qnl0ZUNTdHJpbmcoKSB7CisgICAgcmV0dXJuIGdldChNZXJnZWFibGU0Qnl0ZUNTdHJpbmcpOworICB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRNZXJnZWFibGVDb25zdDQoKSB7IHJldHVybiBnZXQoTWVyZ2VhYmxlQ29uc3Q0KTsgfQorICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0TWVyZ2VhYmxlQ29uc3Q4KCkgeyByZXR1cm4gZ2V0KE1lcmdlYWJsZUNvbnN0OCk7IH0KKyAgc3RhdGljIFNlY3Rpb25LaW5kIGdldE1lcmdlYWJsZUNvbnN0MTYoKSB7IHJldHVybiBnZXQoTWVyZ2VhYmxlQ29uc3QxNik7IH0KKyAgc3RhdGljIFNlY3Rpb25LaW5kIGdldE1lcmdlYWJsZUNvbnN0MzIoKSB7IHJldHVybiBnZXQoTWVyZ2VhYmxlQ29uc3QzMik7IH0KKyAgc3RhdGljIFNlY3Rpb25LaW5kIGdldFRocmVhZEJTUygpIHsgcmV0dXJuIGdldChUaHJlYWRCU1MpOyB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRUaHJlYWREYXRhKCkgeyByZXR1cm4gZ2V0KFRocmVhZERhdGEpOyB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRCU1MoKSB7IHJldHVybiBnZXQoQlNTKTsgfQorICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0QlNTTG9jYWwoKSB7IHJldHVybiBnZXQoQlNTTG9jYWwpOyB9CisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRCU1NFeHRlcm4oKSB7IHJldHVybiBnZXQoQlNTRXh0ZXJuKTsgfQorICBzdGF0aWMgU2VjdGlvbktpbmQgZ2V0Q29tbW9uKCkgeyByZXR1cm4gZ2V0KENvbW1vbik7IH0KKyAgc3RhdGljIFNlY3Rpb25LaW5kIGdldERhdGEoKSB7IHJldHVybiBnZXQoRGF0YSk7IH0KKyAgc3RhdGljIFNlY3Rpb25LaW5kIGdldFJlYWRPbmx5V2l0aFJlbCgpIHsgcmV0dXJuIGdldChSZWFkT25seVdpdGhSZWwpOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvU3RyaW5nVGFibGVCdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL1N0cmluZ1RhYmxlQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5YmM1NWEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL1N0cmluZ1RhYmxlQnVpbGRlci5oCkBAIC0wLDAgKzEsNzUgQEAKKy8vPT09LSBTdHJpbmdUYWJsZUJ1aWxkZXIuaCAtIFN0cmluZyB0YWJsZSBidWlsZGluZyB1dGlsaXR5IC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9NQ19TVFJJTkdUQUJMRUJVSUxERVJfSAorI2RlZmluZSBMTFZNX01DX1NUUklOR1RBQkxFQlVJTERFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9DYWNoZWRIYXNoU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vLyBcYnJpZWYgVXRpbGl0eSBmb3IgYnVpbGRpbmcgc3RyaW5nIHRhYmxlcyB3aXRoIGRlZHVwbGljYXRlZCBzdWZmaXhlcy4KK2NsYXNzIFN0cmluZ1RhYmxlQnVpbGRlciB7CitwdWJsaWM6CisgIGVudW0gS2luZCB7IEVMRiwgV2luQ09GRiwgTWFjaE8sIFJBVywgRFdBUkYgfTsKKworcHJpdmF0ZToKKyAgRGVuc2VNYXA8Q2FjaGVkSGFzaFN0cmluZ1JlZiwgc2l6ZV90PiBTdHJpbmdJbmRleE1hcDsKKyAgc2l6ZV90IFNpemUgPSAwOworICBLaW5kIEs7CisgIHVuc2lnbmVkIEFsaWdubWVudDsKKyAgYm9vbCBGaW5hbGl6ZWQgPSBmYWxzZTsKKworICB2b2lkIGZpbmFsaXplU3RyaW5nVGFibGUoYm9vbCBPcHRpbWl6ZSk7CisgIHZvaWQgaW5pdFNpemUoKTsKKworcHVibGljOgorICBTdHJpbmdUYWJsZUJ1aWxkZXIoS2luZCBLLCB1bnNpZ25lZCBBbGlnbm1lbnQgPSAxKTsKKyAgflN0cmluZ1RhYmxlQnVpbGRlcigpOworCisgIC8vLyBcYnJpZWYgQWRkIGEgc3RyaW5nIHRvIHRoZSBidWlsZGVyLiBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiBTIGluIHRoZQorICAvLy8gdGFibGUuIFRoZSBwb3NpdGlvbiB3aWxsIGJlIGNoYW5nZWQgaWYgZmluYWxpemUgaXMgdXNlZC4KKyAgLy8vIENhbiBvbmx5IGJlIHVzZWQgYmVmb3JlIHRoZSB0YWJsZSBpcyBmaW5hbGl6ZWQuCisgIHNpemVfdCBhZGQoQ2FjaGVkSGFzaFN0cmluZ1JlZiBTKTsKKyAgc2l6ZV90IGFkZChTdHJpbmdSZWYgUykgeyByZXR1cm4gYWRkKENhY2hlZEhhc2hTdHJpbmdSZWYoUykpOyB9CisKKyAgLy8vIFxicmllZiBBbmFseXplIHRoZSBzdHJpbmdzIGFuZCBidWlsZCB0aGUgZmluYWwgdGFibGUuIE5vIG1vcmUgc3RyaW5ncyBjYW4KKyAgLy8vIGJlIGFkZGVkIGFmdGVyIHRoaXMgcG9pbnQuCisgIHZvaWQgZmluYWxpemUoKTsKKworICAvLy8gRmluYWxpemUgdGhlIHN0cmluZyB0YWJsZSB3aXRob3V0IHJlb3JkaW5nIGl0LiBJbiB0aGlzIG1vZGUsIG9mZnNldHMKKyAgLy8vIHJldHVybmVkIGJ5IGFkZCB3aWxsIHN0aWxsIGJlIHZhbGlkLgorICB2b2lkIGZpbmFsaXplSW5PcmRlcigpOworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBvZmZlc3Qgb2YgYSBzdHJpbmcgaW4gdGhlIHN0cmluZyB0YWJsZS4gQ2FuIG9ubHkgYmUgdXNlZAorICAvLy8gYWZ0ZXIgdGhlIHRhYmxlIGlzIGZpbmFsaXplZC4KKyAgc2l6ZV90IGdldE9mZnNldChDYWNoZWRIYXNoU3RyaW5nUmVmIFMpIGNvbnN0OworICBzaXplX3QgZ2V0T2Zmc2V0KFN0cmluZ1JlZiBTKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9mZnNldChDYWNoZWRIYXNoU3RyaW5nUmVmKFMpKTsKKyAgfQorCisgIHNpemVfdCBnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gU2l6ZTsgfQorICB2b2lkIGNsZWFyKCk7CisKKyAgdm9pZCB3cml0ZShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIHdyaXRlKHVpbnQ4X3QgKkJ1ZikgY29uc3Q7CisKK3ByaXZhdGU6CisgIGJvb2wgaXNGaW5hbGl6ZWQoKSBjb25zdCB7IHJldHVybiBGaW5hbGl6ZWQ7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX01DX1NUUklOR1RBQkxFQlVJTERFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL1N1YnRhcmdldEZlYXR1cmUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vTUMvU3VidGFyZ2V0RmVhdHVyZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2YzdkZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL01DL1N1YnRhcmdldEZlYXR1cmUuaApAQCAtMCwwICsxLDEzMyBAQAorLy89PT0tIGxsdm0vTUMvU3VidGFyZ2V0RmVhdHVyZS5oIC0gQ1BVIGNoYXJhY3RlcmlzdGljcyAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUgRGVmaW5lcyBhbmQgbWFuYWdlcyB1c2VyIG9yIHRvb2wgc3BlY2lmaWVkIENQVSBjaGFyYWN0ZXJpc3RpY3MuCisvLy8gVGhlIGludGVudCBpcyB0byBiZSBhYmxlIHRvIHBhY2thZ2Ugc3BlY2lmaWMgZmVhdHVyZXMgdGhhdCBzaG91bGQgb3Igc2hvdWxkCisvLy8gbm90IGJlIHVzZWQgb24gYSBzcGVjaWZpYyB0YXJnZXQgcHJvY2Vzc29yLiAgQSB0b29sLCBzdWNoIGFzIGxsYywgY291bGQsIGFzCisvLy8gYXMgZXhhbXBsZSwgZ2F0aGVyIGNoaXAgaW5mbyBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIGEgbG9uZyB3aXRoIGZlYXR1cmVzCisvLy8gdGhhdCBzaG91bGQgYmUgdXNlZCBvbiB0aGF0IGNoaXAuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX01DX1NVQlRBUkdFVEZFQVRVUkVfSAorI2RlZmluZSBMTFZNX01DX1NVQlRBUkdFVEZFQVRVUkVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8Yml0c2V0PgorI2luY2x1ZGUgPGluaXRpYWxpemVyX2xpc3Q+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFRyaXBsZTsKKworY29uc3QgdW5zaWduZWQgTUFYX1NVQlRBUkdFVF9GRUFUVVJFUyA9IDE5MjsKKy8vLyBDb250YWluZXIgY2xhc3MgZm9yIHN1YnRhcmdldCBmZWF0dXJlcy4KKy8vLyBUaGlzIGlzIGNvbnZlbmllbnQgYmVjYXVzZSBzdGQ6OmJpdHNldCBkb2VzIG5vdCBoYXZlIGEgY29uc3RydWN0b3IKKy8vLyB3aXRoIGFuIGluaXRpYWxpemVyIGxpc3Qgb2Ygc2V0IGJpdHMuCitjbGFzcyBGZWF0dXJlQml0c2V0IDogcHVibGljIHN0ZDo6Yml0c2V0PE1BWF9TVUJUQVJHRVRfRkVBVFVSRVM+IHsKK3B1YmxpYzoKKyAgLy8gQ2Fubm90IGluaGVyaXQgY29uc3RydWN0b3JzIGJlY2F1c2UgaXQncyBub3Qgc3VwcG9ydGVkIGJ5IFZDKysuLgorICBGZWF0dXJlQml0c2V0KCkgPSBkZWZhdWx0OworCisgIEZlYXR1cmVCaXRzZXQoY29uc3QgYml0c2V0PE1BWF9TVUJUQVJHRVRfRkVBVFVSRVM+JiBCKSA6IGJpdHNldChCKSB7fQorCisgIEZlYXR1cmVCaXRzZXQoc3RkOjppbml0aWFsaXplcl9saXN0PHVuc2lnbmVkPiBJbml0KSB7CisgICAgZm9yIChhdXRvIEkgOiBJbml0KQorICAgICAgc2V0KEkpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gVXNlZCB0byBwcm92aWRlIGtleSB2YWx1ZSBwYWlycyBmb3IgZmVhdHVyZSBhbmQgQ1BVIGJpdCBmbGFncy4KK3N0cnVjdCBTdWJ0YXJnZXRGZWF0dXJlS1YgeworICBjb25zdCBjaGFyICpLZXk7ICAgICAgICAgICAgICAgICAgICAgIC8vLzwgSy1WIGtleSBzdHJpbmcKKyAgY29uc3QgY2hhciAqRGVzYzsgICAgICAgICAgICAgICAgICAgICAvLy88IEhlbHAgZGVzY3JpcHRvcgorICBGZWF0dXJlQml0c2V0IFZhbHVlOyAgICAgICAgICAgICAgICAgIC8vLzwgSy1WIGludGVnZXIgdmFsdWUKKyAgRmVhdHVyZUJpdHNldCBJbXBsaWVzOyAgICAgICAgICAgICAgICAvLy88IEstViBiaXQgbWFzaworCisgIC8vLyBDb21wYXJlIHJvdXRpbmUgZm9yIHN0ZDo6bG93ZXJfYm91bmQKKyAgYm9vbCBvcGVyYXRvcjwoU3RyaW5nUmVmIFMpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RyaW5nUmVmKEtleSkgPCBTOworICB9CisKKyAgLy8vIENvbXBhcmUgcm91dGluZSBmb3Igc3RkOjppc19zb3J0ZWQuCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFN1YnRhcmdldEZlYXR1cmVLViAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RyaW5nUmVmKEtleSkgPCBTdHJpbmdSZWYoT3RoZXIuS2V5KTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIFVzZWQgdG8gcHJvdmlkZSBrZXkgdmFsdWUgcGFpcnMgZm9yIENQVSBhbmQgYXJiaXRyYXJ5IHBvaW50ZXJzLgorc3RydWN0IFN1YnRhcmdldEluZm9LViB7CisgIGNvbnN0IGNoYXIgKktleTsgICAgICAgICAgICAgICAgICAgICAgLy8vPCBLLVYga2V5IHN0cmluZworICBjb25zdCB2b2lkICpWYWx1ZTsgICAgICAgICAgICAgICAgICAgIC8vLzwgSy1WIHBvaW50ZXIgdmFsdWUKKworICAvLy8gQ29tcGFyZSByb3V0aW5lIGZvciBzdGQ6Omxvd2VyX2JvdW5kCisgIGJvb2wgb3BlcmF0b3I8KFN0cmluZ1JlZiBTKSBjb25zdCB7CisgICAgcmV0dXJuIFN0cmluZ1JlZihLZXkpIDwgUzsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIE1hbmFnZXMgdGhlIGVuYWJsaW5nIGFuZCBkaXNhYmxpbmcgb2Ygc3VidGFyZ2V0IHNwZWNpZmljIGZlYXR1cmVzLgorLy8vCisvLy8gRmVhdHVyZXMgYXJlIGVuY29kZWQgYXMgYSBzdHJpbmcgb2YgdGhlIGZvcm0KKy8vLyAgICIrYXR0cjEsK2F0dHIyLC1hdHRyMywuLi4sK2F0dHJOIgorLy8vIEEgY29tbWEgc2VwYXJhdGVzIGVhY2ggZmVhdHVyZSBmcm9tIHRoZSBuZXh0IChhbGwgbG93ZXJjYXNlLikKKy8vLyBFYWNoIG9mIHRoZSByZW1haW5pbmcgZmVhdHVyZXMgaXMgcHJlZml4ZWQgd2l0aCArIG9yIC0gaW5kaWNhdGluZyB3aGV0aGVyCisvLy8gdGhhdCBmZWF0dXJlIHNob3VsZCBiZSBlbmFibGVkIG9yIGRpc2FibGVkIGNvbnRyYXJ5IHRvIHRoZSBjcHUKKy8vLyBzcGVjaWZpY2F0aW9uLgorY2xhc3MgU3VidGFyZ2V0RmVhdHVyZXMgeworICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gRmVhdHVyZXM7ICAgIC8vLzwgU3VidGFyZ2V0IGZlYXR1cmVzIGFzIGEgdmVjdG9yCisKK3B1YmxpYzoKKyAgZXhwbGljaXQgU3VidGFyZ2V0RmVhdHVyZXMoU3RyaW5nUmVmIEluaXRpYWwgPSAiIik7CisKKyAgLy8vIFJldHVybnMgZmVhdHVyZXMgYXMgYSBzdHJpbmcuCisgIHN0ZDo6c3RyaW5nIGdldFN0cmluZygpIGNvbnN0OworCisgIC8vLyBBZGRzIEZlYXR1cmVzLgorICB2b2lkIEFkZEZlYXR1cmUoU3RyaW5nUmVmIFN0cmluZywgYm9vbCBFbmFibGUgPSB0cnVlKTsKKworICAvLy8gVG9nZ2xlcyBhIGZlYXR1cmUgYW5kIHVwZGF0ZSB0aGUgZmVhdHVyZSBiaXRzLgorICBzdGF0aWMgdm9pZCBUb2dnbGVGZWF0dXJlKEZlYXR1cmVCaXRzZXQgJkJpdHMsIFN0cmluZ1JlZiBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U3VidGFyZ2V0RmVhdHVyZUtWPiBGZWF0dXJlVGFibGUpOworCisgIC8vLyBBcHBsaWVzIHRoZSBmZWF0dXJlIGZsYWcgYW5kIHVwZGF0ZSB0aGUgZmVhdHVyZSBiaXRzLgorICBzdGF0aWMgdm9pZCBBcHBseUZlYXR1cmVGbGFnKEZlYXR1cmVCaXRzZXQgJkJpdHMsIFN0cmluZ1JlZiBGZWF0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFN1YnRhcmdldEZlYXR1cmVLVj4gRmVhdHVyZVRhYmxlKTsKKworICAvLy8gUmV0dXJucyBmZWF0dXJlIGJpdHMgb2YgYSBDUFUuCisgIEZlYXR1cmVCaXRzZXQgZ2V0RmVhdHVyZUJpdHMoU3RyaW5nUmVmIENQVSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTdWJ0YXJnZXRGZWF0dXJlS1Y+IENQVVRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFN1YnRhcmdldEZlYXR1cmVLVj4gRmVhdHVyZVRhYmxlKTsKKworICAvLy8gUmV0dXJucyB0aGUgdmVjdG9yIG9mIGluZGl2aWR1YWwgc3VidGFyZ2V0IGZlYXR1cmVzLgorICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJmdldEZlYXR1cmVzKCkgY29uc3QgeyByZXR1cm4gRmVhdHVyZXM7IH0KKworICAvLy8gUHJpbnRzIGZlYXR1cmUgc3RyaW5nLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgLy8gRHVtcHMgZmVhdHVyZSBpbmZvLgorICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLy8gQWRkcyB0aGUgZGVmYXVsdCBmZWF0dXJlcyBmb3IgdGhlIHNwZWNpZmllZCB0YXJnZXQgdHJpcGxlLgorICB2b2lkIGdldERlZmF1bHRTdWJ0YXJnZXRGZWF0dXJlcyhjb25zdCBUcmlwbGUmIFRyaXBsZSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9NQ19TVUJUQVJHRVRGRUFUVVJFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0FyY2hpdmUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0FyY2hpdmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTE1MTJiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvQXJjaGl2ZS5oCkBAIC0wLDAgKzEsMjg5IEBACisvLz09PS0gQXJjaGl2ZS5oIC0gYXIgYXJjaGl2ZSBmaWxlIGZvcm1hdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgYXIgYXJjaGl2ZSBmaWxlIGZvcm1hdCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUX0FSQ0hJVkVfSAorI2RlZmluZSBMTFZNX09CSkVDVF9BUkNISVZFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9CaW5hcnkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2hyb25vLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0ZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9iamVjdCB7CisKK2NsYXNzIEFyY2hpdmU7CisKK2NsYXNzIEFyY2hpdmVNZW1iZXJIZWFkZXIgeworcHVibGljOgorICBmcmllbmQgY2xhc3MgQXJjaGl2ZTsKKworICBBcmNoaXZlTWVtYmVySGVhZGVyKEFyY2hpdmUgY29uc3QgKlBhcmVudCwgY29uc3QgY2hhciAqUmF3SGVhZGVyUHRyLAorICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNpemUsIEVycm9yICpFcnIpOworICAvLyBBcmNoaXZlTWVtYmVySGVhZGVyKCkgPSBkZWZhdWx0OworCisgIC8vLyBHZXQgdGhlIG5hbWUgd2l0aG91dCBsb29raW5nIHVwIGxvbmcgbmFtZXMuCisgIEV4cGVjdGVkPFN0cmluZ1JlZj4gZ2V0UmF3TmFtZSgpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIG5hbWUgbG9va2luZyB1cCBsb25nIG5hbWVzLgorICBFeHBlY3RlZDxTdHJpbmdSZWY+IGdldE5hbWUodWludDY0X3QgU2l6ZSkgY29uc3Q7CisKKyAgLy8vIE1lbWJlcnMgYXJlIG5vdCBsYXJnZXIgdGhhbiA0R0IuCisgIEV4cGVjdGVkPHVpbnQzMl90PiBnZXRTaXplKCkgY29uc3Q7CisKKyAgRXhwZWN0ZWQ8c3lzOjpmczo6cGVybXM+IGdldEFjY2Vzc01vZGUoKSBjb25zdDsKKyAgRXhwZWN0ZWQ8c3lzOjpUaW1lUG9pbnQ8c3RkOjpjaHJvbm86OnNlY29uZHM+PiBnZXRMYXN0TW9kaWZpZWQoKSBjb25zdDsKKworICBTdHJpbmdSZWYgZ2V0UmF3TGFzdE1vZGlmaWVkKCkgY29uc3QgeworICAgIHJldHVybiBTdHJpbmdSZWYoQXJNZW1IZHItPkxhc3RNb2RpZmllZCwKKyAgICAgICAgICAgICAgICAgICAgIHNpemVvZihBck1lbUhkci0+TGFzdE1vZGlmaWVkKSkucnRyaW0oJyAnKTsKKyAgfQorCisgIEV4cGVjdGVkPHVuc2lnbmVkPiBnZXRVSUQoKSBjb25zdDsKKyAgRXhwZWN0ZWQ8dW5zaWduZWQ+IGdldEdJRCgpIGNvbnN0OworCisgIC8vIFRoaXMgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgcHJpdmF0ZSBzdHJ1Y3QgQXJNZW1IZHJUeXBlCisgIHVpbnQ2NF90IGdldFNpemVPZigpIGNvbnN0IHsKKyAgICByZXR1cm4gc2l6ZW9mKEFyTWVtSGRyVHlwZSk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RydWN0IEFyTWVtSGRyVHlwZSB7CisgICAgY2hhciBOYW1lWzE2XTsKKyAgICBjaGFyIExhc3RNb2RpZmllZFsxMl07CisgICAgY2hhciBVSURbNl07CisgICAgY2hhciBHSURbNl07CisgICAgY2hhciBBY2Nlc3NNb2RlWzhdOworICAgIGNoYXIgU2l6ZVsxMF07IC8vLzwgU2l6ZSBvZiBkYXRhLCBub3QgaW5jbHVkaW5nIGhlYWRlciBvciBwYWRkaW5nLgorICAgIGNoYXIgVGVybWluYXRvclsyXTsKKyAgfTsKKyAgQXJjaGl2ZSBjb25zdCAqUGFyZW50OworICBBck1lbUhkclR5cGUgY29uc3QgKkFyTWVtSGRyOworfTsKKworY2xhc3MgQXJjaGl2ZSA6IHB1YmxpYyBCaW5hcnkgeworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3B1YmxpYzoKKyAgY2xhc3MgQ2hpbGQgeworICAgIGZyaWVuZCBBcmNoaXZlOworICAgIGZyaWVuZCBBcmNoaXZlTWVtYmVySGVhZGVyOworCisgICAgY29uc3QgQXJjaGl2ZSAqUGFyZW50OworICAgIEFyY2hpdmVNZW1iZXJIZWFkZXIgSGVhZGVyOworICAgIC8vLyBcYnJpZWYgSW5jbHVkZXMgaGVhZGVyIGJ1dCBub3QgcGFkZGluZyBieXRlLgorICAgIFN0cmluZ1JlZiBEYXRhOworICAgIC8vLyBcYnJpZWYgT2Zmc2V0IGZyb20gRGF0YSB0byB0aGUgc3RhcnQgb2YgdGhlIGZpbGUuCisgICAgdWludDE2X3QgU3RhcnRPZkZpbGU7CisKKyAgICBFeHBlY3RlZDxib29sPiBpc1RoaW5NZW1iZXIoKSBjb25zdDsKKworICBwdWJsaWM6CisgICAgQ2hpbGQoY29uc3QgQXJjaGl2ZSAqUGFyZW50LCBjb25zdCBjaGFyICpTdGFydCwgRXJyb3IgKkVycik7CisgICAgQ2hpbGQoY29uc3QgQXJjaGl2ZSAqUGFyZW50LCBTdHJpbmdSZWYgRGF0YSwgdWludDE2X3QgU3RhcnRPZkZpbGUpOworCisgICAgYm9vbCBvcGVyYXRvciA9PShjb25zdCBDaGlsZCAmb3RoZXIpIGNvbnN0IHsKKyAgICAgIGFzc2VydCghUGFyZW50IHx8ICFvdGhlci5QYXJlbnQgfHwgUGFyZW50ID09IG90aGVyLlBhcmVudCk7CisgICAgICByZXR1cm4gRGF0YS5iZWdpbigpID09IG90aGVyLkRhdGEuYmVnaW4oKTsKKyAgICB9CisKKyAgICBjb25zdCBBcmNoaXZlICpnZXRQYXJlbnQoKSBjb25zdCB7IHJldHVybiBQYXJlbnQ7IH0KKyAgICBFeHBlY3RlZDxDaGlsZD4gZ2V0TmV4dCgpIGNvbnN0OworCisgICAgRXhwZWN0ZWQ8U3RyaW5nUmVmPiBnZXROYW1lKCkgY29uc3Q7CisgICAgRXhwZWN0ZWQ8c3RkOjpzdHJpbmc+IGdldEZ1bGxOYW1lKCkgY29uc3Q7CisgICAgRXhwZWN0ZWQ8U3RyaW5nUmVmPiBnZXRSYXdOYW1lKCkgY29uc3QgeyByZXR1cm4gSGVhZGVyLmdldFJhd05hbWUoKTsgfQorCisgICAgRXhwZWN0ZWQ8c3lzOjpUaW1lUG9pbnQ8c3RkOjpjaHJvbm86OnNlY29uZHM+PiBnZXRMYXN0TW9kaWZpZWQoKSBjb25zdCB7CisgICAgICByZXR1cm4gSGVhZGVyLmdldExhc3RNb2RpZmllZCgpOworICAgIH0KKworICAgIFN0cmluZ1JlZiBnZXRSYXdMYXN0TW9kaWZpZWQoKSBjb25zdCB7CisgICAgICByZXR1cm4gSGVhZGVyLmdldFJhd0xhc3RNb2RpZmllZCgpOworICAgIH0KKworICAgIEV4cGVjdGVkPHVuc2lnbmVkPiBnZXRVSUQoKSBjb25zdCB7IHJldHVybiBIZWFkZXIuZ2V0VUlEKCk7IH0KKyAgICBFeHBlY3RlZDx1bnNpZ25lZD4gZ2V0R0lEKCkgY29uc3QgeyByZXR1cm4gSGVhZGVyLmdldEdJRCgpOyB9CisKKyAgICBFeHBlY3RlZDxzeXM6OmZzOjpwZXJtcz4gZ2V0QWNjZXNzTW9kZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBIZWFkZXIuZ2V0QWNjZXNzTW9kZSgpOworICAgIH0KKworICAgIC8vLyBccmV0dXJuIHRoZSBzaXplIG9mIHRoZSBhcmNoaXZlIG1lbWJlciB3aXRob3V0IHRoZSBoZWFkZXIgb3IgcGFkZGluZy4KKyAgICBFeHBlY3RlZDx1aW50NjRfdD4gZ2V0U2l6ZSgpIGNvbnN0OworICAgIC8vLyBccmV0dXJuIHRoZSBzaXplIGluIHRoZSBhcmNoaXZlIGhlYWRlciBmb3IgdGhpcyBtZW1iZXIuCisgICAgRXhwZWN0ZWQ8dWludDY0X3Q+IGdldFJhd1NpemUoKSBjb25zdDsKKworICAgIEV4cGVjdGVkPFN0cmluZ1JlZj4gZ2V0QnVmZmVyKCkgY29uc3Q7CisgICAgdWludDY0X3QgZ2V0Q2hpbGRPZmZzZXQoKSBjb25zdDsKKworICAgIEV4cGVjdGVkPE1lbW9yeUJ1ZmZlclJlZj4gZ2V0TWVtb3J5QnVmZmVyUmVmKCkgY29uc3Q7CisKKyAgICBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8QmluYXJ5Pj4KKyAgICBnZXRBc0JpbmFyeShMTFZNQ29udGV4dCAqQ29udGV4dCA9IG51bGxwdHIpIGNvbnN0OworICB9OworCisgIGNsYXNzIGNoaWxkX2l0ZXJhdG9yIHsKKyAgICBDaGlsZCBDOworICAgIEVycm9yICpFID0gbnVsbHB0cjsKKworICBwdWJsaWM6CisgICAgY2hpbGRfaXRlcmF0b3IoKSA6IEMoQ2hpbGQobnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikpIHt9CisgICAgY2hpbGRfaXRlcmF0b3IoY29uc3QgQ2hpbGQgJkMsIEVycm9yICpFKSA6IEMoQyksIEUoRSkge30KKworICAgIGNvbnN0IENoaWxkICpvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJkM7IH0KKyAgICBjb25zdCBDaGlsZCAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gQzsgfQorCisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNoaWxkX2l0ZXJhdG9yICZvdGhlcikgY29uc3QgeworICAgICAgLy8gSWdub3JlIGVycm9ycyBoZXJlOiBJZiBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgaW5jcmVtZW50IHRoZW4gZ2V0TmV4dAorICAgICAgLy8gd2lsbCBoYXZlIGJlZW4gc2V0IHRvIGNoaWxkX2VuZCgpLCBhbmQgdGhlIGZvbGxvd2luZyBjb21wYXJpc29uIHNob3VsZAorICAgICAgLy8gZG8gdGhlIHJpZ2h0IHRoaW5nLgorICAgICAgcmV0dXJuIEMgPT0gb3RoZXIuQzsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgY2hpbGRfaXRlcmF0b3IgJm90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgICAgfQorCisgICAgLy8gQ29kZSBpbiBsb29wcyB3aXRoIGNoaWxkX2l0ZXJhdG9ycyBtdXN0IGNoZWNrIGZvciBlcnJvcnMgb24gZWFjaCBsb29wCisgICAgLy8gaXRlcmF0aW9uLiAgQW5kIGlmIHRoZXJlIGlzIGFuIGVycm9yIGJyZWFrIG91dCBvZiB0aGUgbG9vcC4KKyAgICBjaGlsZF9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsgLy8gUHJlaW5jcmVtZW50CisgICAgICBhc3NlcnQoRSAmJiAiQ2FuJ3QgaW5jcmVtZW50IGl0ZXJhdG9yIHdpdGggbm8gRXJyb3IgYXR0YWNoZWQiKTsKKyAgICAgIEVycm9yQXNPdXRQYXJhbWV0ZXIgRXJyQXNPdXRQYXJhbShFKTsKKyAgICAgIGlmIChhdXRvIENoaWxkT3JFcnIgPSBDLmdldE5leHQoKSkKKyAgICAgICAgQyA9ICpDaGlsZE9yRXJyOworICAgICAgZWxzZSB7CisgICAgICAgIEMgPSBDLmdldFBhcmVudCgpLT5jaGlsZF9lbmQoKS5DOworICAgICAgICAqRSA9IENoaWxkT3JFcnIudGFrZUVycm9yKCk7CisgICAgICAgIEUgPSBudWxscHRyOworICAgICAgfQorICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgfTsKKworICBjbGFzcyBTeW1ib2wgeworICAgIGNvbnN0IEFyY2hpdmUgKlBhcmVudDsKKyAgICB1aW50MzJfdCBTeW1ib2xJbmRleDsKKyAgICB1aW50MzJfdCBTdHJpbmdJbmRleDsgLy8gRXh0cmEgaW5kZXggdG8gdGhlIHN0cmluZy4KKworICBwdWJsaWM6CisgICAgU3ltYm9sKGNvbnN0IEFyY2hpdmUgKnAsIHVpbnQzMl90IHN5bWksIHVpbnQzMl90IHN0cmkpCisgICAgICA6IFBhcmVudChwKQorICAgICAgLCBTeW1ib2xJbmRleChzeW1pKQorICAgICAgLCBTdHJpbmdJbmRleChzdHJpKSB7fQorCisgICAgYm9vbCBvcGVyYXRvciA9PShjb25zdCBTeW1ib2wgJm90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gKFBhcmVudCA9PSBvdGhlci5QYXJlbnQpICYmIChTeW1ib2xJbmRleCA9PSBvdGhlci5TeW1ib2xJbmRleCk7CisgICAgfQorCisgICAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdDsKKyAgICBFeHBlY3RlZDxDaGlsZD4gZ2V0TWVtYmVyKCkgY29uc3Q7CisgICAgU3ltYm9sIGdldE5leHQoKSBjb25zdDsKKyAgfTsKKworICBjbGFzcyBzeW1ib2xfaXRlcmF0b3IgeworICAgIFN5bWJvbCBzeW1ib2w7CisKKyAgcHVibGljOgorICAgIHN5bWJvbF9pdGVyYXRvcihjb25zdCBTeW1ib2wgJnMpIDogc3ltYm9sKHMpIHt9CisKKyAgICBjb25zdCBTeW1ib2wgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmc3ltYm9sOyB9CisgICAgY29uc3QgU3ltYm9sICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBzeW1ib2w7IH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBzeW1ib2xfaXRlcmF0b3IgJm90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gc3ltYm9sID09IG90aGVyLnN5bWJvbDsKKyAgICB9CisKKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3Qgc3ltYm9sX2l0ZXJhdG9yICZvdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOworICAgIH0KKworICAgIHN5bWJvbF9pdGVyYXRvciYgb3BlcmF0b3IrKygpIHsgIC8vIFByZWluY3JlbWVudAorICAgICAgc3ltYm9sID0gc3ltYm9sLmdldE5leHQoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgIH07CisKKyAgQXJjaGl2ZShNZW1vcnlCdWZmZXJSZWYgU291cmNlLCBFcnJvciAmRXJyKTsKKyAgc3RhdGljIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxBcmNoaXZlPj4gY3JlYXRlKE1lbW9yeUJ1ZmZlclJlZiBTb3VyY2UpOworCisgIGVudW0gS2luZCB7CisgICAgS19HTlUsCisgICAgS19HTlU2NCwKKyAgICBLX0JTRCwKKyAgICBLX0RBUldJTiwKKyAgICBLX0RBUldJTjY0LAorICAgIEtfQ09GRgorICB9OworCisgIEtpbmQga2luZCgpIGNvbnN0IHsgcmV0dXJuIChLaW5kKUZvcm1hdDsgfQorICBib29sIGlzVGhpbigpIGNvbnN0IHsgcmV0dXJuIElzVGhpbjsgfQorCisgIGNoaWxkX2l0ZXJhdG9yIGNoaWxkX2JlZ2luKEVycm9yICZFcnIsIGJvb2wgU2tpcEludGVybmFsID0gdHJ1ZSkgY29uc3Q7CisgIGNoaWxkX2l0ZXJhdG9yIGNoaWxkX2VuZCgpIGNvbnN0OworICBpdGVyYXRvcl9yYW5nZTxjaGlsZF9pdGVyYXRvcj4gY2hpbGRyZW4oRXJyb3IgJkVyciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2tpcEludGVybmFsID0gdHJ1ZSkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGNoaWxkX2JlZ2luKEVyciwgU2tpcEludGVybmFsKSwgY2hpbGRfZW5kKCkpOworICB9CisKKyAgc3ltYm9sX2l0ZXJhdG9yIHN5bWJvbF9iZWdpbigpIGNvbnN0OworICBzeW1ib2xfaXRlcmF0b3Igc3ltYm9sX2VuZCgpIGNvbnN0OworICBpdGVyYXRvcl9yYW5nZTxzeW1ib2xfaXRlcmF0b3I+IHN5bWJvbHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2Uoc3ltYm9sX2JlZ2luKCksIHN5bWJvbF9lbmQoKSk7CisgIH0KKworICAvLyBDYXN0IG1ldGhvZHMuCisgIHN0YXRpYyBib29sIGNsYXNzb2YoQmluYXJ5IGNvbnN0ICp2KSB7CisgICAgcmV0dXJuIHYtPmlzQXJjaGl2ZSgpOworICB9CisKKyAgLy8gY2hlY2sgaWYgYSBzeW1ib2wgaXMgaW4gdGhlIGFyY2hpdmUKKyAgRXhwZWN0ZWQ8T3B0aW9uYWw8Q2hpbGQ+PiBmaW5kU3ltKFN0cmluZ1JlZiBuYW1lKSBjb25zdDsKKworICBib29sIGlzRW1wdHkoKSBjb25zdDsKKyAgYm9vbCBoYXNTeW1ib2xUYWJsZSgpIGNvbnN0OworICBTdHJpbmdSZWYgZ2V0U3ltYm9sVGFibGUoKSBjb25zdCB7IHJldHVybiBTeW1ib2xUYWJsZTsgfQorICBTdHJpbmdSZWYgZ2V0U3RyaW5nVGFibGUoKSBjb25zdCB7IHJldHVybiBTdHJpbmdUYWJsZTsgfQorICB1aW50MzJfdCBnZXROdW1iZXJPZlN5bWJvbHMoKSBjb25zdDsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPj4gdGFrZVRoaW5CdWZmZXJzKCkgeworICAgIHJldHVybiBzdGQ6Om1vdmUoVGhpbkJ1ZmZlcnMpOworICB9CisKK3ByaXZhdGU6CisgIFN0cmluZ1JlZiBTeW1ib2xUYWJsZTsKKyAgU3RyaW5nUmVmIFN0cmluZ1RhYmxlOworCisgIFN0cmluZ1JlZiBGaXJzdFJlZ3VsYXJEYXRhOworICB1aW50MTZfdCBGaXJzdFJlZ3VsYXJTdGFydE9mRmlsZSA9IC0xOworICB2b2lkIHNldEZpcnN0UmVndWxhcihjb25zdCBDaGlsZCAmQyk7CisKKyAgdW5zaWduZWQgRm9ybWF0IDogMzsKKyAgdW5zaWduZWQgSXNUaGluIDogMTsKKyAgbXV0YWJsZSBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPj4gVGhpbkJ1ZmZlcnM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugb2JqZWN0Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9PQkpFQ1RfQVJDSElWRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9BcmNoaXZlV3JpdGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9BcmNoaXZlV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk1Yjk0MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0FyY2hpdmVXcml0ZXIuaApAQCAtMCwwICsxLDQ3IEBACisvLz09PS0gQXJjaGl2ZVdyaXRlci5oIC0gYXIgYXJjaGl2ZSBmaWxlIGZvcm1hdCB3cml0ZXIgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIERlY2xhcmVzIHRoZSB3cml0ZUFyY2hpdmUgZnVuY3Rpb24gZm9yIHdyaXRpbmcgYW4gYXJjaGl2ZSBmaWxlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RfQVJDSElWRVdSSVRFUl9ICisjZGVmaW5lIExMVk1fT0JKRUNUX0FSQ0hJVkVXUklURVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvQXJjaGl2ZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworc3RydWN0IE5ld0FyY2hpdmVNZW1iZXIgeworICBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBCdWY7CisgIFN0cmluZ1JlZiBNZW1iZXJOYW1lOworICBzeXM6OlRpbWVQb2ludDxzdGQ6OmNocm9ubzo6c2Vjb25kcz4gTW9kVGltZTsKKyAgdW5zaWduZWQgVUlEID0gMCwgR0lEID0gMCwgUGVybXMgPSAwNjQ0OworCisgIGJvb2wgSXNOZXcgPSBmYWxzZTsKKyAgTmV3QXJjaGl2ZU1lbWJlcigpID0gZGVmYXVsdDsKKyAgTmV3QXJjaGl2ZU1lbWJlcihNZW1vcnlCdWZmZXJSZWYgQnVmUmVmKTsKKworICBzdGF0aWMgRXhwZWN0ZWQ8TmV3QXJjaGl2ZU1lbWJlcj4KKyAgZ2V0T2xkTWVtYmVyKGNvbnN0IG9iamVjdDo6QXJjaGl2ZTo6Q2hpbGQgJk9sZE1lbWJlciwgYm9vbCBEZXRlcm1pbmlzdGljKTsKKworICBzdGF0aWMgRXhwZWN0ZWQ8TmV3QXJjaGl2ZU1lbWJlcj4gZ2V0RmlsZShTdHJpbmdSZWYgRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGV0ZXJtaW5pc3RpYyk7Cit9OworCitFcnJvciB3cml0ZUFyY2hpdmUoU3RyaW5nUmVmIEFyY05hbWUsIEFycmF5UmVmPE5ld0FyY2hpdmVNZW1iZXI+IE5ld01lbWJlcnMsCisgICAgICAgICAgICAgICAgICAgYm9vbCBXcml0ZVN5bXRhYiwgb2JqZWN0OjpBcmNoaXZlOjpLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgYm9vbCBEZXRlcm1pbmlzdGljLCBib29sIFRoaW4sCisgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gT2xkQXJjaGl2ZUJ1ZiA9IG51bGxwdHIpOworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0JpbmFyeS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvQmluYXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU5MzY5MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0JpbmFyeS5oCkBAIC0wLDAgKzEsMjE5IEBACisvLz09PS0gQmluYXJ5LmggLSBBIGdlbmVyaWMgYmluYXJ5IGZpbGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgQmluYXJ5IGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RfQklOQVJZX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RfQklOQVJZX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1RyaXBsZS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIFN0cmluZ1JlZjsKKworbmFtZXNwYWNlIG9iamVjdCB7CisKK2NsYXNzIEJpbmFyeSB7Citwcml2YXRlOgorICB1bnNpZ25lZCBpbnQgVHlwZUlEOworCitwcm90ZWN0ZWQ6CisgIE1lbW9yeUJ1ZmZlclJlZiBEYXRhOworCisgIEJpbmFyeSh1bnNpZ25lZCBpbnQgVHlwZSwgTWVtb3J5QnVmZmVyUmVmIFNvdXJjZSk7CisKKyAgZW51bSB7CisgICAgSURfQXJjaGl2ZSwKKyAgICBJRF9NYWNoT1VuaXZlcnNhbEJpbmFyeSwKKyAgICBJRF9DT0ZGSW1wb3J0RmlsZSwKKyAgICBJRF9JUiwgICAgICAgICAgICAgICAgIC8vIExMVk0gSVIKKworICAgIElEX1dpblJlcywgLy8gV2luZG93cyByZXNvdXJjZSAoLnJlcykgZmlsZS4KKworICAgIC8vIE9iamVjdCBhbmQgY2hpbGRyZW4uCisgICAgSURfU3RhcnRPYmplY3RzLAorICAgIElEX0NPRkYsCisKKyAgICBJRF9FTEYzMkwsIC8vIEVMRiAzMi1iaXQsIGxpdHRsZSBlbmRpYW4KKyAgICBJRF9FTEYzMkIsIC8vIEVMRiAzMi1iaXQsIGJpZyBlbmRpYW4KKyAgICBJRF9FTEY2NEwsIC8vIEVMRiA2NC1iaXQsIGxpdHRsZSBlbmRpYW4KKyAgICBJRF9FTEY2NEIsIC8vIEVMRiA2NC1iaXQsIGJpZyBlbmRpYW4KKworICAgIElEX01hY2hPMzJMLCAvLyBNYWNoTyAzMi1iaXQsIGxpdHRsZSBlbmRpYW4KKyAgICBJRF9NYWNoTzMyQiwgLy8gTWFjaE8gMzItYml0LCBiaWcgZW5kaWFuCisgICAgSURfTWFjaE82NEwsIC8vIE1hY2hPIDY0LWJpdCwgbGl0dGxlIGVuZGlhbgorICAgIElEX01hY2hPNjRCLCAvLyBNYWNoTyA2NC1iaXQsIGJpZyBlbmRpYW4KKworICAgIElEX1dhc20sCisKKyAgICBJRF9FbmRPYmplY3RzCisgIH07CisKKyAgc3RhdGljIGlubGluZSB1bnNpZ25lZCBpbnQgZ2V0RUxGVHlwZShib29sIGlzTEUsIGJvb2wgaXM2NEJpdHMpIHsKKyAgICBpZiAoaXNMRSkKKyAgICAgIHJldHVybiBpczY0Qml0cyA/IElEX0VMRjY0TCA6IElEX0VMRjMyTDsKKyAgICBlbHNlCisgICAgICByZXR1cm4gaXM2NEJpdHMgPyBJRF9FTEY2NEIgOiBJRF9FTEYzMkI7CisgIH0KKworICBzdGF0aWMgdW5zaWduZWQgaW50IGdldE1hY2hPVHlwZShib29sIGlzTEUsIGJvb2wgaXM2NEJpdHMpIHsKKyAgICBpZiAoaXNMRSkKKyAgICAgIHJldHVybiBpczY0Qml0cyA/IElEX01hY2hPNjRMIDogSURfTWFjaE8zMkw7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGlzNjRCaXRzID8gSURfTWFjaE82NEIgOiBJRF9NYWNoTzMyQjsKKyAgfQorCitwdWJsaWM6CisgIEJpbmFyeSgpID0gZGVsZXRlOworICBCaW5hcnkoY29uc3QgQmluYXJ5ICZvdGhlcikgPSBkZWxldGU7CisgIHZpcnR1YWwgfkJpbmFyeSgpOworCisgIFN0cmluZ1JlZiBnZXREYXRhKCkgY29uc3Q7CisgIFN0cmluZ1JlZiBnZXRGaWxlTmFtZSgpIGNvbnN0OworICBNZW1vcnlCdWZmZXJSZWYgZ2V0TWVtb3J5QnVmZmVyUmVmKCkgY29uc3Q7CisKKyAgLy8gQ2FzdCBtZXRob2RzLgorICB1bnNpZ25lZCBpbnQgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5cGVJRDsgfQorCisgIC8vIENvbnZlbmllbmNlIG1ldGhvZHMKKyAgYm9vbCBpc09iamVjdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVHlwZUlEID4gSURfU3RhcnRPYmplY3RzICYmIFR5cGVJRCA8IElEX0VuZE9iamVjdHM7CisgIH0KKworICBib29sIGlzU3ltYm9saWMoKSBjb25zdCB7IHJldHVybiBpc0lSKCkgfHwgaXNPYmplY3QoKSB8fCBpc0NPRkZJbXBvcnRGaWxlKCk7IH0KKworICBib29sIGlzQXJjaGl2ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gVHlwZUlEID09IElEX0FyY2hpdmU7CisgIH0KKworICBib29sIGlzTWFjaE9Vbml2ZXJzYWxCaW5hcnkoKSBjb25zdCB7CisgICAgcmV0dXJuIFR5cGVJRCA9PSBJRF9NYWNoT1VuaXZlcnNhbEJpbmFyeTsKKyAgfQorCisgIGJvb2wgaXNFTEYoKSBjb25zdCB7CisgICAgcmV0dXJuIFR5cGVJRCA+PSBJRF9FTEYzMkwgJiYgVHlwZUlEIDw9IElEX0VMRjY0QjsKKyAgfQorCisgIGJvb2wgaXNNYWNoTygpIGNvbnN0IHsKKyAgICByZXR1cm4gVHlwZUlEID49IElEX01hY2hPMzJMICYmIFR5cGVJRCA8PSBJRF9NYWNoTzY0QjsKKyAgfQorCisgIGJvb2wgaXNDT0ZGKCkgY29uc3QgeworICAgIHJldHVybiBUeXBlSUQgPT0gSURfQ09GRjsKKyAgfQorCisgIGJvb2wgaXNXYXNtKCkgY29uc3QgeyByZXR1cm4gVHlwZUlEID09IElEX1dhc207IH0KKworICBib29sIGlzQ09GRkltcG9ydEZpbGUoKSBjb25zdCB7CisgICAgcmV0dXJuIFR5cGVJRCA9PSBJRF9DT0ZGSW1wb3J0RmlsZTsKKyAgfQorCisgIGJvb2wgaXNJUigpIGNvbnN0IHsKKyAgICByZXR1cm4gVHlwZUlEID09IElEX0lSOworICB9CisKKyAgYm9vbCBpc0xpdHRsZUVuZGlhbigpIGNvbnN0IHsKKyAgICByZXR1cm4gIShUeXBlSUQgPT0gSURfRUxGMzJCIHx8IFR5cGVJRCA9PSBJRF9FTEY2NEIgfHwKKyAgICAgICAgICAgICBUeXBlSUQgPT0gSURfTWFjaE8zMkIgfHwgVHlwZUlEID09IElEX01hY2hPNjRCKTsKKyAgfQorCisgIGJvb2wgaXNXaW5SZXMoKSBjb25zdCB7IHJldHVybiBUeXBlSUQgPT0gSURfV2luUmVzOyB9CisKKyAgVHJpcGxlOjpPYmplY3RGb3JtYXRUeXBlIGdldFRyaXBsZU9iamVjdEZvcm1hdCgpIGNvbnN0IHsKKyAgICBpZiAoaXNDT0ZGKCkpCisgICAgICByZXR1cm4gVHJpcGxlOjpDT0ZGOworICAgIGlmIChpc01hY2hPKCkpCisgICAgICByZXR1cm4gVHJpcGxlOjpNYWNoTzsKKyAgICBpZiAoaXNFTEYoKSkKKyAgICAgIHJldHVybiBUcmlwbGU6OkVMRjsKKyAgICByZXR1cm4gVHJpcGxlOjpVbmtub3duT2JqZWN0Rm9ybWF0OworICB9CisKKyAgc3RhdGljIHN0ZDo6ZXJyb3JfY29kZSBjaGVja09mZnNldChNZW1vcnlCdWZmZXJSZWYgTSwgdWludHB0cl90IEFkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDY0X3QgU2l6ZSkgeworICAgIGlmIChBZGRyICsgU2l6ZSA8IEFkZHIgfHwgQWRkciArIFNpemUgPCBTaXplIHx8CisgICAgICAgIEFkZHIgKyBTaXplID4gdWludHB0cl90KE0uZ2V0QnVmZmVyRW5kKCkpIHx8CisgICAgICAgIEFkZHIgPCB1aW50cHRyX3QoTS5nZXRCdWZmZXJTdGFydCgpKSkgeworICAgICAgcmV0dXJuIG9iamVjdF9lcnJvcjo6dW5leHBlY3RlZF9lb2Y7CisgICAgfQorICAgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKKyAgfQorfTsKKworLy8vIEBicmllZiBDcmVhdGUgYSBCaW5hcnkgZnJvbSBTb3VyY2UsIGF1dG9kZXRlY3RpbmcgdGhlIGZpbGUgdHlwZS4KKy8vLworLy8vIEBwYXJhbSBTb3VyY2UgVGhlIGRhdGEgdG8gY3JlYXRlIHRoZSBCaW5hcnkgZnJvbS4KK0V4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxCaW5hcnk+PiBjcmVhdGVCaW5hcnkoTWVtb3J5QnVmZmVyUmVmIFNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTUNvbnRleHQgKkNvbnRleHQgPSBudWxscHRyKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIE93bmluZ0JpbmFyeSB7CisgIHN0ZDo6dW5pcXVlX3B0cjxUPiBCaW47CisgIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IEJ1ZjsKKworcHVibGljOgorICBPd25pbmdCaW5hcnkoKTsKKyAgT3duaW5nQmluYXJ5KHN0ZDo6dW5pcXVlX3B0cjxUPiBCaW4sIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IEJ1Zik7CisgIE93bmluZ0JpbmFyeShPd25pbmdCaW5hcnk8VD4mJiBPdGhlcik7CisgIE93bmluZ0JpbmFyeTxUPiAmb3BlcmF0b3I9KE93bmluZ0JpbmFyeTxUPiAmJk90aGVyKTsKKworICBzdGQ6OnBhaXI8c3RkOjp1bmlxdWVfcHRyPFQ+LCBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPj4gdGFrZUJpbmFyeSgpOworCisgIFQqIGdldEJpbmFyeSgpOworICBjb25zdCBUKiBnZXRCaW5hcnkoKSBjb25zdDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorT3duaW5nQmluYXJ5PFQ+OjpPd25pbmdCaW5hcnkoc3RkOjp1bmlxdWVfcHRyPFQ+IEJpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IEJ1ZikKKyAgICA6IEJpbihzdGQ6Om1vdmUoQmluKSksIEJ1ZihzdGQ6Om1vdmUoQnVmKSkge30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IE93bmluZ0JpbmFyeTxUPjo6T3duaW5nQmluYXJ5KCkgPSBkZWZhdWx0OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK093bmluZ0JpbmFyeTxUPjo6T3duaW5nQmluYXJ5KE93bmluZ0JpbmFyeSAmJk90aGVyKQorICAgIDogQmluKHN0ZDo6bW92ZShPdGhlci5CaW4pKSwgQnVmKHN0ZDo6bW92ZShPdGhlci5CdWYpKSB7fQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK093bmluZ0JpbmFyeTxUPiAmT3duaW5nQmluYXJ5PFQ+OjpvcGVyYXRvcj0oT3duaW5nQmluYXJ5ICYmT3RoZXIpIHsKKyAgQmluID0gc3RkOjptb3ZlKE90aGVyLkJpbik7CisgIEJ1ZiA9IHN0ZDo6bW92ZShPdGhlci5CdWYpOworICByZXR1cm4gKnRoaXM7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RkOjpwYWlyPHN0ZDo6dW5pcXVlX3B0cjxUPiwgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4+CitPd25pbmdCaW5hcnk8VD46OnRha2VCaW5hcnkoKSB7CisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihzdGQ6Om1vdmUoQmluKSwgc3RkOjptb3ZlKEJ1ZikpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCogT3duaW5nQmluYXJ5PFQ+OjpnZXRCaW5hcnkoKSB7CisgIHJldHVybiBCaW4uZ2V0KCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjb25zdCBUKiBPd25pbmdCaW5hcnk8VD46OmdldEJpbmFyeSgpIGNvbnN0IHsKKyAgcmV0dXJuIEJpbi5nZXQoKTsKK30KKworRXhwZWN0ZWQ8T3duaW5nQmluYXJ5PEJpbmFyeT4+IGNyZWF0ZUJpbmFyeShTdHJpbmdSZWYgUGF0aCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvYmplY3QKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fT0JKRUNUX0JJTkFSWV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9DT0ZGLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9DT0ZGLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5MDE0OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0NPRkYuaApAQCAtMCwwICsxLDEyMjYgQEAKKy8vPT09LSBDT0ZGLmggLSBDT0ZGIG9iamVjdCBmaWxlIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBDT0ZGT2JqZWN0RmlsZSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUX0NPRkZfSAorI2RlZmluZSBMTFZNX09CSkVDVF9DT0ZGX0gKKworI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvQ09GRi5oIgorI2luY2x1ZGUgImxsdm0vTUMvU3VidGFyZ2V0RmVhdHVyZS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L0JpbmFyeS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L0NWRGVidWdSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L09iamVjdEZpbGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5Qnl0ZVN0cmVhbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db252ZXJ0VVRGLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheVJlZjsKKworbmFtZXNwYWNlIG9iamVjdCB7CisKK2NsYXNzIEJhc2VSZWxvY1JlZjsKK2NsYXNzIERlbGF5SW1wb3J0RGlyZWN0b3J5RW50cnlSZWY7CitjbGFzcyBFeHBvcnREaXJlY3RvcnlFbnRyeVJlZjsKK2NsYXNzIEltcG9ydERpcmVjdG9yeUVudHJ5UmVmOworY2xhc3MgSW1wb3J0ZWRTeW1ib2xSZWY7CitjbGFzcyBSZXNvdXJjZVNlY3Rpb25SZWY7CisKK3VzaW5nIGltcG9ydF9kaXJlY3RvcnlfaXRlcmF0b3IgPSBjb250ZW50X2l0ZXJhdG9yPEltcG9ydERpcmVjdG9yeUVudHJ5UmVmPjsKK3VzaW5nIGRlbGF5X2ltcG9ydF9kaXJlY3RvcnlfaXRlcmF0b3IgPQorICAgIGNvbnRlbnRfaXRlcmF0b3I8RGVsYXlJbXBvcnREaXJlY3RvcnlFbnRyeVJlZj47Cit1c2luZyBleHBvcnRfZGlyZWN0b3J5X2l0ZXJhdG9yID0gY29udGVudF9pdGVyYXRvcjxFeHBvcnREaXJlY3RvcnlFbnRyeVJlZj47Cit1c2luZyBpbXBvcnRlZF9zeW1ib2xfaXRlcmF0b3IgPSBjb250ZW50X2l0ZXJhdG9yPEltcG9ydGVkU3ltYm9sUmVmPjsKK3VzaW5nIGJhc2VfcmVsb2NfaXRlcmF0b3IgPSBjb250ZW50X2l0ZXJhdG9yPEJhc2VSZWxvY1JlZj47CisKKy8vLyBUaGUgRE9TIGNvbXBhdGlibGUgaGVhZGVyIGF0IHRoZSBmcm9udCBvZiBhbGwgUEUvQ09GRiBleGVjdXRhYmxlcy4KK3N0cnVjdCBkb3NfaGVhZGVyIHsKKyAgY2hhciAgICAgICAgICAgICAgICAgTWFnaWNbMl07CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFVzZWRCeXRlc0luVGhlTGFzdFBhZ2U7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IEZpbGVTaXplSW5QYWdlczsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTnVtYmVyT2ZSZWxvY2F0aW9uSXRlbXM7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IEhlYWRlclNpemVJblBhcmFncmFwaHM7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1pbmltdW1FeHRyYVBhcmFncmFwaHM7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1heGltdW1FeHRyYVBhcmFncmFwaHM7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IEluaXRpYWxSZWxhdGl2ZVNTOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBJbml0aWFsU1A7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IENoZWNrc3VtOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBJbml0aWFsSVA7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IEluaXRpYWxSZWxhdGl2ZUNTOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBBZGRyZXNzT2ZSZWxvY2F0aW9uVGFibGU7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE92ZXJsYXlOdW1iZXI7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFJlc2VydmVkWzRdOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBPRU1pZDsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgT0VNaW5mbzsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgUmVzZXJ2ZWQyWzEwXTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQWRkcmVzc09mTmV3RXhlSGVhZGVyOworfTsKKworc3RydWN0IGNvZmZfZmlsZV9oZWFkZXIgeworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNYWNoaW5lOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBOdW1iZXJPZlNlY3Rpb25zOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBUaW1lRGF0ZVN0YW1wOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBQb2ludGVyVG9TeW1ib2xUYWJsZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTnVtYmVyT2ZTeW1ib2xzOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBTaXplT2ZPcHRpb25hbEhlYWRlcjsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgQ2hhcmFjdGVyaXN0aWNzOworCisgIGJvb2wgaXNJbXBvcnRMaWJyYXJ5KCkgY29uc3QgeyByZXR1cm4gTnVtYmVyT2ZTZWN0aW9ucyA9PSAweGZmZmY7IH0KK307CisKK3N0cnVjdCBjb2ZmX2JpZ29ial9maWxlX2hlYWRlciB7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFNpZzE7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFNpZzI7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1hY2hpbmU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFRpbWVEYXRlU3RhbXA7CisgIHVpbnQ4X3QgICAgICAgICAgICAgIFVVSURbMTZdOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCB1bnVzZWQxOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCB1bnVzZWQyOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCB1bnVzZWQzOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCB1bnVzZWQ0OworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBOdW1iZXJPZlNlY3Rpb25zOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBQb2ludGVyVG9TeW1ib2xUYWJsZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTnVtYmVyT2ZTeW1ib2xzOworfTsKKworLy8vIFRoZSAzMi1iaXQgUEUgaGVhZGVyIHRoYXQgZm9sbG93cyB0aGUgQ09GRiBoZWFkZXIuCitzdHJ1Y3QgcGUzMl9oZWFkZXIgeworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNYWdpYzsKKyAgdWludDhfdCBNYWpvckxpbmtlclZlcnNpb247CisgIHVpbnQ4X3QgTWlub3JMaW5rZXJWZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTaXplT2ZDb2RlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTaXplT2ZJbml0aWFsaXplZERhdGE7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNpemVPZlVuaW5pdGlhbGl6ZWREYXRhOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBBZGRyZXNzT2ZFbnRyeVBvaW50OworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBCYXNlT2ZDb2RlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBCYXNlT2ZEYXRhOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBJbWFnZUJhc2U7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNlY3Rpb25BbGlnbm1lbnQ7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEZpbGVBbGlnbm1lbnQ7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1ham9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTWlub3JPcGVyYXRpbmdTeXN0ZW1WZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNYWpvckltYWdlVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTWlub3JJbWFnZVZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1ham9yU3Vic3lzdGVtVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTWlub3JTdWJzeXN0ZW1WZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBXaW4zMlZlcnNpb25WYWx1ZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2l6ZU9mSW1hZ2U7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNpemVPZkhlYWRlcnM7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IENoZWNrU3VtOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBTdWJzeXN0ZW07CisgIC8vIEZJWE1FOiBUaGlzIHNob3VsZCBiZSBEbGxDaGFyYWN0ZXJpc3RpY3MuCisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IERMTENoYXJhY3RlcmlzdGljczsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2l6ZU9mU3RhY2tSZXNlcnZlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTaXplT2ZTdGFja0NvbW1pdDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2l6ZU9mSGVhcFJlc2VydmU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNpemVPZkhlYXBDb21taXQ7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IExvYWRlckZsYWdzOworICAvLyBGSVhNRTogVGhpcyBzaG91bGQgYmUgTnVtYmVyT2ZSdmFBbmRTaXplcy4KKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTnVtYmVyT2ZSdmFBbmRTaXplOworfTsKKworLy8vIFRoZSA2NC1iaXQgUEUgaGVhZGVyIHRoYXQgZm9sbG93cyB0aGUgQ09GRiBoZWFkZXIuCitzdHJ1Y3QgcGUzMnBsdXNfaGVhZGVyIHsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTWFnaWM7CisgIHVpbnQ4X3QgTWFqb3JMaW5rZXJWZXJzaW9uOworICB1aW50OF90IE1pbm9yTGlua2VyVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2l6ZU9mQ29kZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2l6ZU9mSW5pdGlhbGl6ZWREYXRhOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTaXplT2ZVbmluaXRpYWxpemVkRGF0YTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQWRkcmVzc09mRW50cnlQb2ludDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQmFzZU9mQ29kZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTY0X3QgSW1hZ2VCYXNlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTZWN0aW9uQWxpZ25tZW50OworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBGaWxlQWxpZ25tZW50OworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNYWpvck9wZXJhdGluZ1N5c3RlbVZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1pbm9yT3BlcmF0aW5nU3lzdGVtVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTWFqb3JJbWFnZVZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1pbm9ySW1hZ2VWZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNYWpvclN1YnN5c3RlbVZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1pbm9yU3Vic3lzdGVtVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgV2luMzJWZXJzaW9uVmFsdWU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNpemVPZkltYWdlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTaXplT2ZIZWFkZXJzOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBDaGVja1N1bTsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgU3Vic3lzdGVtOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBETExDaGFyYWN0ZXJpc3RpY3M7CisgIHN1cHBvcnQ6OnVsaXR0bGU2NF90IFNpemVPZlN0YWNrUmVzZXJ2ZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTY0X3QgU2l6ZU9mU3RhY2tDb21taXQ7CisgIHN1cHBvcnQ6OnVsaXR0bGU2NF90IFNpemVPZkhlYXBSZXNlcnZlOworICBzdXBwb3J0Ojp1bGl0dGxlNjRfdCBTaXplT2ZIZWFwQ29tbWl0OworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBMb2FkZXJGbGFnczsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTnVtYmVyT2ZSdmFBbmRTaXplOworfTsKKworc3RydWN0IGRhdGFfZGlyZWN0b3J5IHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUmVsYXRpdmVWaXJ0dWFsQWRkcmVzczsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2l6ZTsKK307CisKK3N0cnVjdCBkZWJ1Z19kaXJlY3RvcnkgeworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBDaGFyYWN0ZXJpc3RpY3M7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFRpbWVEYXRlU3RhbXA7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1ham9yVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTWlub3JWZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBUeXBlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTaXplT2ZEYXRhOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBBZGRyZXNzT2ZSYXdEYXRhOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBQb2ludGVyVG9SYXdEYXRhOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEludFR5Pgorc3RydWN0IGltcG9ydF9sb29rdXBfdGFibGVfZW50cnkgeworICBJbnRUeSBEYXRhOworCisgIGJvb2wgaXNPcmRpbmFsKCkgY29uc3QgeyByZXR1cm4gRGF0YSA8IDA7IH0KKworICB1aW50MTZfdCBnZXRPcmRpbmFsKCkgY29uc3QgeworICAgIGFzc2VydChpc09yZGluYWwoKSAmJiAiSUxUIGVudHJ5IGlzIG5vdCBhbiBvcmRpbmFsISIpOworICAgIHJldHVybiBEYXRhICYgMHhGRkZGOworICB9CisKKyAgdWludDMyX3QgZ2V0SGludE5hbWVSVkEoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFpc09yZGluYWwoKSAmJiAiSUxUIGVudHJ5IGlzIG5vdCBhIEhpbnQvTmFtZSBSVkEhIik7CisgICAgcmV0dXJuIERhdGEgJiAweEZGRkZGRkZGOworICB9Cit9OworCit1c2luZyBpbXBvcnRfbG9va3VwX3RhYmxlX2VudHJ5MzIgPQorICAgIGltcG9ydF9sb29rdXBfdGFibGVfZW50cnk8c3VwcG9ydDo6bGl0dGxlMzJfdD47Cit1c2luZyBpbXBvcnRfbG9va3VwX3RhYmxlX2VudHJ5NjQgPQorICAgIGltcG9ydF9sb29rdXBfdGFibGVfZW50cnk8c3VwcG9ydDo6bGl0dGxlNjRfdD47CisKK3N0cnVjdCBkZWxheV9pbXBvcnRfZGlyZWN0b3J5X3RhYmxlX2VudHJ5IHsKKyAgLy8gZHVtcGJpbiByZXBvcnRzIHRoaXMgZmllbGQgYXMgIkNoYXJhY3RlcmlzdGljcyIgaW5zdGVhZCBvZiAiQXR0cmlidXRlcyIuCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEF0dHJpYnV0ZXM7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE5hbWU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE1vZHVsZUhhbmRsZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRGVsYXlJbXBvcnRBZGRyZXNzVGFibGU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IERlbGF5SW1wb3J0TmFtZVRhYmxlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBCb3VuZERlbGF5SW1wb3J0VGFibGU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFVubG9hZERlbGF5SW1wb3J0VGFibGU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFRpbWVTdGFtcDsKK307CisKK3N0cnVjdCBleHBvcnRfZGlyZWN0b3J5X3RhYmxlX2VudHJ5IHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRXhwb3J0RmxhZ3M7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFRpbWVEYXRlU3RhbXA7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1ham9yVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTWlub3JWZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBOYW1lUlZBOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBPcmRpbmFsQmFzZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQWRkcmVzc1RhYmxlRW50cmllczsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTnVtYmVyT2ZOYW1lUG9pbnRlcnM7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEV4cG9ydEFkZHJlc3NUYWJsZVJWQTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTmFtZVBvaW50ZXJSVkE7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE9yZGluYWxUYWJsZVJWQTsKK307CisKK3VuaW9uIGV4cG9ydF9hZGRyZXNzX3RhYmxlX2VudHJ5IHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRXhwb3J0UlZBOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBGb3J3YXJkZXJSVkE7Cit9OworCit1c2luZyBleHBvcnRfbmFtZV9wb2ludGVyX3RhYmxlX2VudHJ5ID0gc3VwcG9ydDo6dWxpdHRsZTMyX3Q7Cit1c2luZyBleHBvcnRfb3JkaW5hbF90YWJsZV9lbnRyeSA9IHN1cHBvcnQ6OnVsaXR0bGUxNl90OworCitzdHJ1Y3QgU3RyaW5nVGFibGVPZmZzZXQgeworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBaZXJvZXM7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE9mZnNldDsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTZWN0aW9uTnVtYmVyVHlwZT4KK3N0cnVjdCBjb2ZmX3N5bWJvbCB7CisgIHVuaW9uIHsKKyAgICBjaGFyIFNob3J0TmFtZVtDT0ZGOjpOYW1lU2l6ZV07CisgICAgU3RyaW5nVGFibGVPZmZzZXQgT2Zmc2V0OworICB9IE5hbWU7CisKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVmFsdWU7CisgIFNlY3Rpb25OdW1iZXJUeXBlIFNlY3Rpb25OdW1iZXI7CisKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgVHlwZTsKKworICB1aW50OF90IFN0b3JhZ2VDbGFzczsKKyAgdWludDhfdCBOdW1iZXJPZkF1eFN5bWJvbHM7Cit9OworCit1c2luZyBjb2ZmX3N5bWJvbDE2ID0gY29mZl9zeW1ib2w8c3VwcG9ydDo6dWxpdHRsZTE2X3Q+OwordXNpbmcgY29mZl9zeW1ib2wzMiA9IGNvZmZfc3ltYm9sPHN1cHBvcnQ6OnVsaXR0bGUzMl90PjsKKworLy8gQ29udGFpbnMgb25seSBjb21tb24gcGFydHMgb2YgY29mZl9zeW1ib2wxNiBhbmQgY29mZl9zeW1ib2wzMi4KK3N0cnVjdCBjb2ZmX3N5bWJvbF9nZW5lcmljIHsKKyAgdW5pb24geworICAgIGNoYXIgU2hvcnROYW1lW0NPRkY6Ok5hbWVTaXplXTsKKyAgICBTdHJpbmdUYWJsZU9mZnNldCBPZmZzZXQ7CisgIH0gTmFtZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVmFsdWU7Cit9OworCitzdHJ1Y3QgY29mZl9hdXhfc2VjdGlvbl9kZWZpbml0aW9uOworCitjbGFzcyBDT0ZGU3ltYm9sUmVmIHsKK3B1YmxpYzoKKyAgQ09GRlN5bWJvbFJlZigpID0gZGVmYXVsdDsKKyAgQ09GRlN5bWJvbFJlZihjb25zdCBjb2ZmX3N5bWJvbDE2ICpDUykgOiBDUzE2KENTKSB7fQorICBDT0ZGU3ltYm9sUmVmKGNvbnN0IGNvZmZfc3ltYm9sMzIgKkNTKSA6IENTMzIoQ1MpIHt9CisKKyAgY29uc3Qgdm9pZCAqZ2V0UmF3UHRyKCkgY29uc3QgeworICAgIHJldHVybiBDUzE2ID8gc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCAqPihDUzE2KSA6IENTMzI7CisgIH0KKworICBjb25zdCBjb2ZmX3N5bWJvbF9nZW5lcmljICpnZXRHZW5lcmljKCkgY29uc3QgeworICAgIGlmIChDUzE2KQorICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY29mZl9zeW1ib2xfZ2VuZXJpYyAqPihDUzE2KTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjb2ZmX3N5bWJvbF9nZW5lcmljICo+KENTMzIpOworICB9CisKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I8KENPRkZTeW1ib2xSZWYgQSwgQ09GRlN5bWJvbFJlZiBCKSB7CisgICAgcmV0dXJuIEEuZ2V0UmF3UHRyKCkgPCBCLmdldFJhd1B0cigpOworICB9CisKKyAgYm9vbCBpc0JpZ09iaigpIGNvbnN0IHsKKyAgICBpZiAoQ1MxNikKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoQ1MzMikKKyAgICAgIHJldHVybiB0cnVlOworICAgIGxsdm1fdW5yZWFjaGFibGUoIkNPRkZTeW1ib2xSZWYgcG9pbnRzIHRvIG5vdGhpbmchIik7CisgIH0KKworICBjb25zdCBjaGFyICpnZXRTaG9ydE5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIENTMTYgPyBDUzE2LT5OYW1lLlNob3J0TmFtZSA6IENTMzItPk5hbWUuU2hvcnROYW1lOworICB9CisKKyAgY29uc3QgU3RyaW5nVGFibGVPZmZzZXQgJmdldFN0cmluZ1RhYmxlT2Zmc2V0KCkgY29uc3QgeworICAgIGFzc2VydChpc1NldCgpICYmICJDT0ZGU3ltYm9sUmVmIHBvaW50cyB0byBub3RoaW5nISIpOworICAgIHJldHVybiBDUzE2ID8gQ1MxNi0+TmFtZS5PZmZzZXQgOiBDUzMyLT5OYW1lLk9mZnNldDsKKyAgfQorCisgIHVpbnQzMl90IGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gQ1MxNiA/IENTMTYtPlZhbHVlIDogQ1MzMi0+VmFsdWU7IH0KKworICBpbnQzMl90IGdldFNlY3Rpb25OdW1iZXIoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzU2V0KCkgJiYgIkNPRkZTeW1ib2xSZWYgcG9pbnRzIHRvIG5vdGhpbmchIik7CisgICAgaWYgKENTMTYpIHsKKyAgICAgIC8vIFJlc2VydmVkIHNlY3Rpb25zIGFyZSByZXR1cm5lZCBhcyBuZWdhdGl2ZSBudW1iZXJzLgorICAgICAgaWYgKENTMTYtPlNlY3Rpb25OdW1iZXIgPD0gQ09GRjo6TWF4TnVtYmVyT2ZTZWN0aW9uczE2KQorICAgICAgICByZXR1cm4gQ1MxNi0+U2VjdGlvbk51bWJlcjsKKyAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQxNl90PihDUzE2LT5TZWN0aW9uTnVtYmVyKTsKKyAgICB9CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KENTMzItPlNlY3Rpb25OdW1iZXIpOworICB9CisKKyAgdWludDE2X3QgZ2V0VHlwZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNTZXQoKSAmJiAiQ09GRlN5bWJvbFJlZiBwb2ludHMgdG8gbm90aGluZyEiKTsKKyAgICByZXR1cm4gQ1MxNiA/IENTMTYtPlR5cGUgOiBDUzMyLT5UeXBlOworICB9CisKKyAgdWludDhfdCBnZXRTdG9yYWdlQ2xhc3MoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzU2V0KCkgJiYgIkNPRkZTeW1ib2xSZWYgcG9pbnRzIHRvIG5vdGhpbmchIik7CisgICAgcmV0dXJuIENTMTYgPyBDUzE2LT5TdG9yYWdlQ2xhc3MgOiBDUzMyLT5TdG9yYWdlQ2xhc3M7CisgIH0KKworICB1aW50OF90IGdldE51bWJlck9mQXV4U3ltYm9scygpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNTZXQoKSAmJiAiQ09GRlN5bWJvbFJlZiBwb2ludHMgdG8gbm90aGluZyEiKTsKKyAgICByZXR1cm4gQ1MxNiA/IENTMTYtPk51bWJlck9mQXV4U3ltYm9scyA6IENTMzItPk51bWJlck9mQXV4U3ltYm9sczsKKyAgfQorCisgIHVpbnQ4X3QgZ2V0QmFzZVR5cGUoKSBjb25zdCB7IHJldHVybiBnZXRUeXBlKCkgJiAweDBGOyB9CisKKyAgdWludDhfdCBnZXRDb21wbGV4VHlwZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKGdldFR5cGUoKSAmIDB4RjApID4+IENPRkY6OlNDVF9DT01QTEVYX1RZUEVfU0hJRlQ7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY29uc3QgVCAqZ2V0QXV4KCkgY29uc3QgeworICAgIHJldHVybiBDUzE2ID8gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUICo+KENTMTYgKyAxKQorICAgICAgICAgICAgICAgIDogcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUICo+KENTMzIgKyAxKTsKKyAgfQorCisgIGNvbnN0IGNvZmZfYXV4X3NlY3Rpb25fZGVmaW5pdGlvbiAqZ2V0U2VjdGlvbkRlZmluaXRpb24oKSBjb25zdCB7CisgICAgaWYgKCFnZXROdW1iZXJPZkF1eFN5bWJvbHMoKSB8fAorICAgICAgICBnZXRTdG9yYWdlQ2xhc3MoKSAhPSBDT0ZGOjpJTUFHRV9TWU1fQ0xBU1NfU1RBVElDKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIGdldEF1eDxjb2ZmX2F1eF9zZWN0aW9uX2RlZmluaXRpb24+KCk7CisgIH0KKworICBib29sIGlzQWJzb2x1dGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFNlY3Rpb25OdW1iZXIoKSA9PSAtMTsKKyAgfQorCisgIGJvb2wgaXNFeHRlcm5hbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3RvcmFnZUNsYXNzKCkgPT0gQ09GRjo6SU1BR0VfU1lNX0NMQVNTX0VYVEVSTkFMOworICB9CisKKyAgYm9vbCBpc0NvbW1vbigpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNFeHRlcm5hbCgpICYmIGdldFNlY3Rpb25OdW1iZXIoKSA9PSBDT0ZGOjpJTUFHRV9TWU1fVU5ERUZJTkVEICYmCisgICAgICAgICAgIGdldFZhbHVlKCkgIT0gMDsKKyAgfQorCisgIGJvb2wgaXNVbmRlZmluZWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRXh0ZXJuYWwoKSAmJiBnZXRTZWN0aW9uTnVtYmVyKCkgPT0gQ09GRjo6SU1BR0VfU1lNX1VOREVGSU5FRCAmJgorICAgICAgICAgICBnZXRWYWx1ZSgpID09IDA7CisgIH0KKworICBib29sIGlzV2Vha0V4dGVybmFsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdG9yYWdlQ2xhc3MoKSA9PSBDT0ZGOjpJTUFHRV9TWU1fQ0xBU1NfV0VBS19FWFRFUk5BTDsKKyAgfQorCisgIGJvb2wgaXNGdW5jdGlvbkRlZmluaXRpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGlzRXh0ZXJuYWwoKSAmJiBnZXRCYXNlVHlwZSgpID09IENPRkY6OklNQUdFX1NZTV9UWVBFX05VTEwgJiYKKyAgICAgICAgICAgZ2V0Q29tcGxleFR5cGUoKSA9PSBDT0ZGOjpJTUFHRV9TWU1fRFRZUEVfRlVOQ1RJT04gJiYKKyAgICAgICAgICAgIUNPRkY6OmlzUmVzZXJ2ZWRTZWN0aW9uTnVtYmVyKGdldFNlY3Rpb25OdW1iZXIoKSk7CisgIH0KKworICBib29sIGlzRnVuY3Rpb25MaW5lSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U3RvcmFnZUNsYXNzKCkgPT0gQ09GRjo6SU1BR0VfU1lNX0NMQVNTX0ZVTkNUSU9OOworICB9CisKKyAgYm9vbCBpc0FueVVuZGVmaW5lZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNVbmRlZmluZWQoKSB8fCBpc1dlYWtFeHRlcm5hbCgpOworICB9CisKKyAgYm9vbCBpc0ZpbGVSZWNvcmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN0b3JhZ2VDbGFzcygpID09IENPRkY6OklNQUdFX1NZTV9DTEFTU19GSUxFOworICB9CisKKyAgYm9vbCBpc1NlY3Rpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFN0b3JhZ2VDbGFzcygpID09IENPRkY6OklNQUdFX1NZTV9DTEFTU19TRUNUSU9OOworICB9CisKKyAgYm9vbCBpc1NlY3Rpb25EZWZpbml0aW9uKCkgY29uc3QgeworICAgIC8vIEMrKy9DTEkgY3JlYXRlcyBleHRlcm5hbCBBQlMgc3ltYm9scyBmb3Igbm9uLWNvbnN0IGFwcGRvbWFpbiBnbG9iYWxzLgorICAgIC8vIFRoZXNlIGFyZSBhbHNvIGZvbGxvd2VkIGJ5IGFuIGF1eGlsaWFyeSBzZWN0aW9uIGRlZmluaXRpb24uCisgICAgYm9vbCBpc0FwcGRvbWFpbkdsb2JhbCA9CisgICAgICAgIGdldFN0b3JhZ2VDbGFzcygpID09IENPRkY6OklNQUdFX1NZTV9DTEFTU19FWFRFUk5BTCAmJgorICAgICAgICBnZXRTZWN0aW9uTnVtYmVyKCkgPT0gQ09GRjo6SU1BR0VfU1lNX0FCU09MVVRFOworICAgIGJvb2wgaXNPcmRpbmFyeVNlY3Rpb24gPSBnZXRTdG9yYWdlQ2xhc3MoKSA9PSBDT0ZGOjpJTUFHRV9TWU1fQ0xBU1NfU1RBVElDOworICAgIGlmICghZ2V0TnVtYmVyT2ZBdXhTeW1ib2xzKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIGlzQXBwZG9tYWluR2xvYmFsIHx8IGlzT3JkaW5hcnlTZWN0aW9uOworICB9CisKKyAgYm9vbCBpc0NMUlRva2VuKCkgY29uc3QgeworICAgIHJldHVybiBnZXRTdG9yYWdlQ2xhc3MoKSA9PSBDT0ZGOjpJTUFHRV9TWU1fQ0xBU1NfQ0xSX1RPS0VOOworICB9CisKK3ByaXZhdGU6CisgIGJvb2wgaXNTZXQoKSBjb25zdCB7IHJldHVybiBDUzE2IHx8IENTMzI7IH0KKworICBjb25zdCBjb2ZmX3N5bWJvbDE2ICpDUzE2ID0gbnVsbHB0cjsKKyAgY29uc3QgY29mZl9zeW1ib2wzMiAqQ1MzMiA9IG51bGxwdHI7Cit9OworCitzdHJ1Y3QgY29mZl9zZWN0aW9uIHsKKyAgY2hhciBOYW1lW0NPRkY6Ok5hbWVTaXplXTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVmlydHVhbFNpemU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFZpcnR1YWxBZGRyZXNzOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTaXplT2ZSYXdEYXRhOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBQb2ludGVyVG9SYXdEYXRhOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBQb2ludGVyVG9SZWxvY2F0aW9uczsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUG9pbnRlclRvTGluZW51bWJlcnM7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE51bWJlck9mUmVsb2NhdGlvbnM7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE51bWJlck9mTGluZW51bWJlcnM7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IENoYXJhY3RlcmlzdGljczsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGFjdHVhbCBudW1iZXIgb2YgcmVsb2NhdGlvbnMgaXMgc3RvcmVkIGluCisgIC8vIFZpcnR1YWxBZGRyZXNzIGZpZWxkIG9mIHRoZSBmaXJzdCByZWxvY2F0aW9uIHRhYmxlIGVudHJ5LgorICBib29sIGhhc0V4dGVuZGVkUmVsb2NhdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIChDaGFyYWN0ZXJpc3RpY3MgJiBDT0ZGOjpJTUFHRV9TQ05fTE5LX05SRUxPQ19PVkZMKSAmJgorICAgICAgICAgICBOdW1iZXJPZlJlbG9jYXRpb25zID09IFVJTlQxNl9NQVg7CisgIH0KKworICB1aW50MzJfdCBnZXRBbGlnbm1lbnQoKSBjb25zdCB7CisgICAgLy8gVGhlIElNQUdFX1NDTl9UWVBFX05PX1BBRCBiaXQgaXMgYSBsZWdhY3kgd2F5IG9mIGdldHRpbmcgdG8KKyAgICAvLyBJTUFHRV9TQ05fQUxJR05fMUJZVEVTLgorICAgIGlmIChDaGFyYWN0ZXJpc3RpY3MgJiBDT0ZGOjpJTUFHRV9TQ05fVFlQRV9OT19QQUQpCisgICAgICByZXR1cm4gMTsKKworICAgIC8vIEJpdCBbMjA6MjRdIGNvbnRhaW5zIHNlY3Rpb24gYWxpZ25tZW50LiBCb3RoIDAgYW5kIDEgbWVhbiBhbGlnbm1lbnQgMS4KKyAgICB1aW50MzJfdCBTaGlmdCA9IChDaGFyYWN0ZXJpc3RpY3MgPj4gMjApICYgMHhGOworICAgIGlmIChTaGlmdCA+IDApCisgICAgICByZXR1cm4gMVUgPDwgKFNoaWZ0IC0gMSk7CisgICAgcmV0dXJuIDE7CisgIH0KK307CisKK3N0cnVjdCBjb2ZmX3JlbG9jYXRpb24geworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBWaXJ0dWFsQWRkcmVzczsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU3ltYm9sVGFibGVJbmRleDsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgVHlwZTsKK307CisKK3N0cnVjdCBjb2ZmX2F1eF9mdW5jdGlvbl9kZWZpbml0aW9uIHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVGFnSW5kZXg7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFRvdGFsU2l6ZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUG9pbnRlclRvTGluZW51bWJlcjsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUG9pbnRlclRvTmV4dEZ1bmN0aW9uOworICBjaGFyIFVudXNlZDFbMl07Cit9OworCitzdGF0aWNfYXNzZXJ0KHNpemVvZihjb2ZmX2F1eF9mdW5jdGlvbl9kZWZpbml0aW9uKSA9PSAxOCwKKyAgICAgICAgICAgICAgImF1eGlsaWFyeSBlbnRyeSBtdXN0IGJlIDE4IGJ5dGVzIik7CisKK3N0cnVjdCBjb2ZmX2F1eF9iZl9hbmRfZWZfc3ltYm9sIHsKKyAgY2hhciBVbnVzZWQxWzRdOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBMaW5lbnVtYmVyOworICBjaGFyIFVudXNlZDJbNl07CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFBvaW50ZXJUb05leHRGdW5jdGlvbjsKKyAgY2hhciBVbnVzZWQzWzJdOworfTsKKworc3RhdGljX2Fzc2VydChzaXplb2YoY29mZl9hdXhfYmZfYW5kX2VmX3N5bWJvbCkgPT0gMTgsCisgICAgICAgICAgICAgICJhdXhpbGlhcnkgZW50cnkgbXVzdCBiZSAxOCBieXRlcyIpOworCitzdHJ1Y3QgY29mZl9hdXhfd2Vha19leHRlcm5hbCB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFRhZ0luZGV4OworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBDaGFyYWN0ZXJpc3RpY3M7CisgIGNoYXIgVW51c2VkMVsxMF07Cit9OworCitzdGF0aWNfYXNzZXJ0KHNpemVvZihjb2ZmX2F1eF93ZWFrX2V4dGVybmFsKSA9PSAxOCwKKyAgICAgICAgICAgICAgImF1eGlsaWFyeSBlbnRyeSBtdXN0IGJlIDE4IGJ5dGVzIik7CisKK3N0cnVjdCBjb2ZmX2F1eF9zZWN0aW9uX2RlZmluaXRpb24geworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBMZW5ndGg7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE51bWJlck9mUmVsb2NhdGlvbnM7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE51bWJlck9mTGluZW51bWJlcnM7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IENoZWNrU3VtOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBOdW1iZXJMb3dQYXJ0OworICB1aW50OF90ICAgICAgICAgICAgICBTZWxlY3Rpb247CisgIHVpbnQ4X3QgICAgICAgICAgICAgIFVudXNlZDsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTnVtYmVySGlnaFBhcnQ7CisgIGludDMyX3QgZ2V0TnVtYmVyKGJvb2wgSXNCaWdPYmopIGNvbnN0IHsKKyAgICB1aW50MzJfdCBOdW1iZXIgPSBzdGF0aWNfY2FzdDx1aW50MzJfdD4oTnVtYmVyTG93UGFydCk7CisgICAgaWYgKElzQmlnT2JqKQorICAgICAgTnVtYmVyIHw9IHN0YXRpY19jYXN0PHVpbnQzMl90PihOdW1iZXJIaWdoUGFydCkgPDwgMTY7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KE51bWJlcik7CisgIH0KK307CisKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKGNvZmZfYXV4X3NlY3Rpb25fZGVmaW5pdGlvbikgPT0gMTgsCisgICAgICAgICAgICAgICJhdXhpbGlhcnkgZW50cnkgbXVzdCBiZSAxOCBieXRlcyIpOworCitzdHJ1Y3QgY29mZl9hdXhfY2xyX3Rva2VuIHsKKyAgdWludDhfdCAgICAgICAgICAgICAgQXV4VHlwZTsKKyAgdWludDhfdCAgICAgICAgICAgICAgUmVzZXJ2ZWQ7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFN5bWJvbFRhYmxlSW5kZXg7CisgIGNoYXIgICAgICAgICAgICAgICAgIE1CWlsxMl07Cit9OworCitzdGF0aWNfYXNzZXJ0KHNpemVvZihjb2ZmX2F1eF9jbHJfdG9rZW4pID09IDE4LAorICAgICAgICAgICAgICAiYXV4aWxpYXJ5IGVudHJ5IG11c3QgYmUgMTggYnl0ZXMiKTsKKworc3RydWN0IGNvZmZfaW1wb3J0X2hlYWRlciB7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFNpZzE7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFNpZzI7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1hY2hpbmU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFRpbWVEYXRlU3RhbXA7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNpemVPZkRhdGE7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE9yZGluYWxIaW50OworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBUeXBlSW5mbzsKKworICBpbnQgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5cGVJbmZvICYgMHgzOyB9CisgIGludCBnZXROYW1lVHlwZSgpIGNvbnN0IHsgcmV0dXJuIChUeXBlSW5mbyA+PiAyKSAmIDB4NzsgfQorfTsKKworc3RydWN0IGNvZmZfaW1wb3J0X2RpcmVjdG9yeV90YWJsZV9lbnRyeSB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEltcG9ydExvb2t1cFRhYmxlUlZBOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBUaW1lRGF0ZVN0YW1wOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBGb3J3YXJkZXJDaGFpbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTmFtZVJWQTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgSW1wb3J0QWRkcmVzc1RhYmxlUlZBOworCisgIGJvb2wgaXNOdWxsKCkgY29uc3QgeworICAgIHJldHVybiBJbXBvcnRMb29rdXBUYWJsZVJWQSA9PSAwICYmIFRpbWVEYXRlU3RhbXAgPT0gMCAmJgorICAgICAgICAgICBGb3J3YXJkZXJDaGFpbiA9PSAwICYmIE5hbWVSVkEgPT0gMCAmJiBJbXBvcnRBZGRyZXNzVGFibGVSVkEgPT0gMDsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEludFR5Pgorc3RydWN0IGNvZmZfdGxzX2RpcmVjdG9yeSB7CisgIEludFR5IFN0YXJ0QWRkcmVzc09mUmF3RGF0YTsKKyAgSW50VHkgRW5kQWRkcmVzc09mUmF3RGF0YTsKKyAgSW50VHkgQWRkcmVzc09mSW5kZXg7CisgIEludFR5IEFkZHJlc3NPZkNhbGxCYWNrczsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2l6ZU9mWmVyb0ZpbGw7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IENoYXJhY3RlcmlzdGljczsKKworICB1aW50MzJfdCBnZXRBbGlnbm1lbnQoKSBjb25zdCB7CisgICAgLy8gQml0IFsyMDoyNF0gY29udGFpbnMgc2VjdGlvbiBhbGlnbm1lbnQuCisgICAgdWludDMyX3QgU2hpZnQgPSAoQ2hhcmFjdGVyaXN0aWNzICYgMHgwMEYwMDAwMCkgPj4gMjA7CisgICAgaWYgKFNoaWZ0ID4gMCkKKyAgICAgIHJldHVybiAxVSA8PCAoU2hpZnQgLSAxKTsKKyAgICByZXR1cm4gMDsKKyAgfQorfTsKKwordXNpbmcgY29mZl90bHNfZGlyZWN0b3J5MzIgPSBjb2ZmX3Rsc19kaXJlY3Rvcnk8c3VwcG9ydDo6bGl0dGxlMzJfdD47Cit1c2luZyBjb2ZmX3Rsc19kaXJlY3Rvcnk2NCA9IGNvZmZfdGxzX2RpcmVjdG9yeTxzdXBwb3J0OjpsaXR0bGU2NF90PjsKKworLy8vIEJpdHMgaW4gY29udHJvbCBmbG93IGd1YXJkIGZsYWdzIGFzIHdlIHVuZGVyc3RhbmQgdGhlbS4KK2VudW0gY2xhc3MgY29mZl9ndWFyZF9mbGFncyA6IHVpbnQzMl90IHsKKyAgQ0ZJbnN0cnVtZW50ZWQgPSAweDAwMDAwMTAwLAorICBIYXNGaWRUYWJsZSA9IDB4MDAwMDA0MDAsCisgIFByb3RlY3REZWxheUxvYWRJQVQgPSAweDAwMDAxMDAwLAorICBEZWxheUxvYWRJQVRTZWN0aW9uID0gMHgwMDAwMjAwMCwgLy8gRGVsYXkgbG9hZCBpbiBzZXBhcmF0ZSBzZWN0aW9uCisgIEhhc0xvbmdKbXBUYWJsZSA9IDB4MDAwMTAwMDAsCisgIEZpZFRhYmxlSGFzRmxhZ3MgPSAweDEwMDAwMDAwLCAvLyBJbmRpY2F0ZXMgdGhhdCBmaWQgdGFibGVzIGFyZSA1IGJ5dGVzCit9OworCitzdHJ1Y3QgY29mZl9sb2FkX2NvbmZpZ19jb2RlX2ludGVncml0eSB7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IEZsYWdzOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBDYXRhbG9nOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBDYXRhbG9nT2Zmc2V0OworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBSZXNlcnZlZDsKK307CisKKy8vLyAzMi1iaXQgbG9hZCBjb25maWcgKElNQUdFX0xPQURfQ09ORklHX0RJUkVDVE9SWTMyKQorc3RydWN0IGNvZmZfbG9hZF9jb25maWd1cmF0aW9uMzIgeworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTaXplOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBUaW1lRGF0ZVN0YW1wOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNYWpvclZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE1pbm9yVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgR2xvYmFsRmxhZ3NDbGVhcjsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgR2xvYmFsRmxhZ3NTZXQ7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IENyaXRpY2FsU2VjdGlvbkRlZmF1bHRUaW1lb3V0OworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBEZUNvbW1pdEZyZWVCbG9ja1RocmVzaG9sZDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRGVDb21taXRUb3RhbEZyZWVUaHJlc2hvbGQ7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IExvY2tQcmVmaXhUYWJsZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTWF4aW11bUFsbG9jYXRpb25TaXplOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBWaXJ0dWFsTWVtb3J5VGhyZXNob2xkOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBQcm9jZXNzQWZmaW5pdHlNYXNrOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBQcm9jZXNzSGVhcEZsYWdzOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBDU0RWZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBEZXBlbmRlbnRMb2FkRmxhZ3M7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEVkaXRMaXN0OworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBTZWN1cml0eUNvb2tpZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU0VIYW5kbGVyVGFibGU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNFSGFuZGxlckNvdW50OworCisgIC8vIEFkZGVkIGluIE1TVkMgMjAxNSBmb3IgL2d1YXJkOmNmLgorICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBHdWFyZENGQ2hlY2tGdW5jdGlvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgR3VhcmRDRkNoZWNrRGlzcGF0Y2g7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEd1YXJkQ0ZGdW5jdGlvblRhYmxlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBHdWFyZENGRnVuY3Rpb25Db3VudDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgR3VhcmRGbGFnczsgLy8gY29mZl9ndWFyZF9mbGFncworCisgIC8vIEFkZGVkIGluIE1TVkMgMjAxNworICBjb2ZmX2xvYWRfY29uZmlnX2NvZGVfaW50ZWdyaXR5IENvZGVJbnRlZ3JpdHk7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEd1YXJkQWRkcmVzc1Rha2VuSWF0RW50cnlUYWJsZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgR3VhcmRBZGRyZXNzVGFrZW5JYXRFbnRyeUNvdW50OworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBHdWFyZExvbmdKdW1wVGFyZ2V0VGFibGU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEd1YXJkTG9uZ0p1bXBUYXJnZXRDb3VudDsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRHluYW1pY1ZhbHVlUmVsb2NUYWJsZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQ0hQRU1ldGFkYXRhUG9pbnRlcjsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgR3VhcmRSRkZhaWx1cmVSb3V0aW5lOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBHdWFyZFJGRmFpbHVyZVJvdXRpbmVGdW5jdGlvblBvaW50ZXI7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IER5bmFtaWNWYWx1ZVJlbG9jVGFibGVPZmZzZXQ7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IER5bmFtaWNWYWx1ZVJlbG9jVGFibGVTZWN0aW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBSZXNlcnZlZDI7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEd1YXJkUkZWZXJpZnlTdGFja1BvaW50ZXJGdW5jdGlvblBvaW50ZXI7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEhvdFBhdGNoVGFibGVPZmZzZXQ7Cit9OworCisvLy8gNjQtYml0IGxvYWQgY29uZmlnIChJTUFHRV9MT0FEX0NPTkZJR19ESVJFQ1RPUlk2NCkKK3N0cnVjdCBjb2ZmX2xvYWRfY29uZmlndXJhdGlvbjY0IHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2l6ZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVGltZURhdGVTdGFtcDsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTWFqb3JWZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNaW5vclZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEdsb2JhbEZsYWdzQ2xlYXI7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEdsb2JhbEZsYWdzU2V0OworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBDcml0aWNhbFNlY3Rpb25EZWZhdWx0VGltZW91dDsKKyAgc3VwcG9ydDo6dWxpdHRsZTY0X3QgRGVDb21taXRGcmVlQmxvY2tUaHJlc2hvbGQ7CisgIHN1cHBvcnQ6OnVsaXR0bGU2NF90IERlQ29tbWl0VG90YWxGcmVlVGhyZXNob2xkOworICBzdXBwb3J0Ojp1bGl0dGxlNjRfdCBMb2NrUHJlZml4VGFibGU7CisgIHN1cHBvcnQ6OnVsaXR0bGU2NF90IE1heGltdW1BbGxvY2F0aW9uU2l6ZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTY0X3QgVmlydHVhbE1lbW9yeVRocmVzaG9sZDsKKyAgc3VwcG9ydDo6dWxpdHRsZTY0X3QgUHJvY2Vzc0FmZmluaXR5TWFzazsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUHJvY2Vzc0hlYXBGbGFnczsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgQ1NEVmVyc2lvbjsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgRGVwZW5kZW50TG9hZEZsYWdzOworICBzdXBwb3J0Ojp1bGl0dGxlNjRfdCBFZGl0TGlzdDsKKyAgc3VwcG9ydDo6dWxpdHRsZTY0X3QgU2VjdXJpdHlDb29raWU7CisgIHN1cHBvcnQ6OnVsaXR0bGU2NF90IFNFSGFuZGxlclRhYmxlOworICBzdXBwb3J0Ojp1bGl0dGxlNjRfdCBTRUhhbmRsZXJDb3VudDsKKworICAvLyBBZGRlZCBpbiBNU1ZDIDIwMTUgZm9yIC9ndWFyZDpjZi4KKyAgc3VwcG9ydDo6dWxpdHRsZTY0X3QgR3VhcmRDRkNoZWNrRnVuY3Rpb247CisgIHN1cHBvcnQ6OnVsaXR0bGU2NF90IEd1YXJkQ0ZDaGVja0Rpc3BhdGNoOworICBzdXBwb3J0Ojp1bGl0dGxlNjRfdCBHdWFyZENGRnVuY3Rpb25UYWJsZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTY0X3QgR3VhcmRDRkZ1bmN0aW9uQ291bnQ7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IEd1YXJkRmxhZ3M7CisKKyAgLy8gQWRkZWQgaW4gTVNWQyAyMDE3CisgIGNvZmZfbG9hZF9jb25maWdfY29kZV9pbnRlZ3JpdHkgQ29kZUludGVncml0eTsKKyAgc3VwcG9ydDo6dWxpdHRsZTY0X3QgR3VhcmRBZGRyZXNzVGFrZW5JYXRFbnRyeVRhYmxlOworICBzdXBwb3J0Ojp1bGl0dGxlNjRfdCBHdWFyZEFkZHJlc3NUYWtlbklhdEVudHJ5Q291bnQ7CisgIHN1cHBvcnQ6OnVsaXR0bGU2NF90IEd1YXJkTG9uZ0p1bXBUYXJnZXRUYWJsZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTY0X3QgR3VhcmRMb25nSnVtcFRhcmdldENvdW50OworICBzdXBwb3J0Ojp1bGl0dGxlNjRfdCBEeW5hbWljVmFsdWVSZWxvY1RhYmxlOworICBzdXBwb3J0Ojp1bGl0dGxlNjRfdCBDSFBFTWV0YWRhdGFQb2ludGVyOworICBzdXBwb3J0Ojp1bGl0dGxlNjRfdCBHdWFyZFJGRmFpbHVyZVJvdXRpbmU7CisgIHN1cHBvcnQ6OnVsaXR0bGU2NF90IEd1YXJkUkZGYWlsdXJlUm91dGluZUZ1bmN0aW9uUG9pbnRlcjsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRHluYW1pY1ZhbHVlUmVsb2NUYWJsZU9mZnNldDsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgRHluYW1pY1ZhbHVlUmVsb2NUYWJsZVNlY3Rpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFJlc2VydmVkMjsKKyAgc3VwcG9ydDo6dWxpdHRsZTY0X3QgR3VhcmRSRlZlcmlmeVN0YWNrUG9pbnRlckZ1bmN0aW9uUG9pbnRlcjsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgSG90UGF0Y2hUYWJsZU9mZnNldDsKK307CisKK3N0cnVjdCBjb2ZmX3J1bnRpbWVfZnVuY3Rpb25feDY0IHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQmVnaW5BZGRyZXNzOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBFbmRBZGRyZXNzOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBVbndpbmRJbmZvcm1hdGlvbjsKK307CisKK3N0cnVjdCBjb2ZmX2Jhc2VfcmVsb2NfYmxvY2tfaGVhZGVyIHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgUGFnZVJWQTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQmxvY2tTaXplOworfTsKKworc3RydWN0IGNvZmZfYmFzZV9yZWxvY19ibG9ja19lbnRyeSB7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IERhdGE7CisKKyAgaW50IGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBEYXRhID4+IDEyOyB9CisgIGludCBnZXRPZmZzZXQoKSBjb25zdCB7IHJldHVybiBEYXRhICYgKCgxIDw8IDEyKSAtIDEpOyB9Cit9OworCitzdHJ1Y3QgY29mZl9yZXNvdXJjZV9kaXJfZW50cnkgeworICB1bmlvbiB7CisgICAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTmFtZU9mZnNldDsKKyAgICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBJRDsKKyAgICB1aW50MzJfdCBnZXROYW1lT2Zmc2V0KCkgY29uc3QgeworICAgICAgcmV0dXJuIG1hc2tUcmFpbGluZ09uZXM8dWludDMyX3Q+KDMxKSAmIE5hbWVPZmZzZXQ7CisgICAgfQorICAgIC8vIEV2ZW4gdGhvdWdoIHRoZSBQRS9DT0ZGIHNwZWMgZG9lc24ndCBtZW50aW9uIHRoaXMsIHRoZSBoaWdoIGJpdCBvZiBhIG5hbWUKKyAgICAvLyBvZmZzZXQgaXMgc2V0LgorICAgIHZvaWQgc2V0TmFtZU9mZnNldCh1aW50MzJfdCBPZmZzZXQpIHsgTmFtZU9mZnNldCA9IE9mZnNldCB8ICgxIDw8IDMxKTsgfQorICB9IElkZW50aWZpZXI7CisgIHVuaW9uIHsKKyAgICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBEYXRhRW50cnlPZmZzZXQ7CisgICAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU3ViZGlyT2Zmc2V0OworCisgICAgYm9vbCBpc1N1YkRpcigpIGNvbnN0IHsgcmV0dXJuIFN1YmRpck9mZnNldCA+PiAzMTsgfQorICAgIHVpbnQzMl90IHZhbHVlKCkgY29uc3QgeworICAgICAgcmV0dXJuIG1hc2tUcmFpbGluZ09uZXM8dWludDMyX3Q+KDMxKSAmIFN1YmRpck9mZnNldDsKKyAgICB9CisKKyAgfSBPZmZzZXQ7Cit9OworCitzdHJ1Y3QgY29mZl9yZXNvdXJjZV9kYXRhX2VudHJ5IHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRGF0YVJWQTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRGF0YVNpemU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IENvZGVwYWdlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBSZXNlcnZlZDsKK307CisKK3N0cnVjdCBjb2ZmX3Jlc291cmNlX2Rpcl90YWJsZSB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IENoYXJhY3RlcmlzdGljczsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVGltZURhdGVTdGFtcDsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTWFqb3JWZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNaW5vclZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE51bWJlck9mTmFtZUVudHJpZXM7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE51bWJlck9mSURFbnRyaWVzOworfTsKKworc3RydWN0IGRlYnVnX2hfaGVhZGVyIHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgTWFnaWM7CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IFZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IEhhc2hBbGdvcml0aG07Cit9OworCitjbGFzcyBDT0ZGT2JqZWN0RmlsZSA6IHB1YmxpYyBPYmplY3RGaWxlIHsKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBJbXBvcnREaXJlY3RvcnlFbnRyeVJlZjsKKyAgZnJpZW5kIGNsYXNzIEV4cG9ydERpcmVjdG9yeUVudHJ5UmVmOworICBjb25zdCBjb2ZmX2ZpbGVfaGVhZGVyICpDT0ZGSGVhZGVyOworICBjb25zdCBjb2ZmX2JpZ29ial9maWxlX2hlYWRlciAqQ09GRkJpZ09iakhlYWRlcjsKKyAgY29uc3QgcGUzMl9oZWFkZXIgKlBFMzJIZWFkZXI7CisgIGNvbnN0IHBlMzJwbHVzX2hlYWRlciAqUEUzMlBsdXNIZWFkZXI7CisgIGNvbnN0IGRhdGFfZGlyZWN0b3J5ICpEYXRhRGlyZWN0b3J5OworICBjb25zdCBjb2ZmX3NlY3Rpb24gKlNlY3Rpb25UYWJsZTsKKyAgY29uc3QgY29mZl9zeW1ib2wxNiAqU3ltYm9sVGFibGUxNjsKKyAgY29uc3QgY29mZl9zeW1ib2wzMiAqU3ltYm9sVGFibGUzMjsKKyAgY29uc3QgY2hhciAqU3RyaW5nVGFibGU7CisgIHVpbnQzMl90IFN0cmluZ1RhYmxlU2l6ZTsKKyAgY29uc3QgY29mZl9pbXBvcnRfZGlyZWN0b3J5X3RhYmxlX2VudHJ5ICpJbXBvcnREaXJlY3Rvcnk7CisgIGNvbnN0IGRlbGF5X2ltcG9ydF9kaXJlY3RvcnlfdGFibGVfZW50cnkgKkRlbGF5SW1wb3J0RGlyZWN0b3J5OworICB1aW50MzJfdCBOdW1iZXJPZkRlbGF5SW1wb3J0RGlyZWN0b3J5OworICBjb25zdCBleHBvcnRfZGlyZWN0b3J5X3RhYmxlX2VudHJ5ICpFeHBvcnREaXJlY3Rvcnk7CisgIGNvbnN0IGNvZmZfYmFzZV9yZWxvY19ibG9ja19oZWFkZXIgKkJhc2VSZWxvY0hlYWRlcjsKKyAgY29uc3QgY29mZl9iYXNlX3JlbG9jX2Jsb2NrX2hlYWRlciAqQmFzZVJlbG9jRW5kOworICBjb25zdCBkZWJ1Z19kaXJlY3RvcnkgKkRlYnVnRGlyZWN0b3J5QmVnaW47CisgIGNvbnN0IGRlYnVnX2RpcmVjdG9yeSAqRGVidWdEaXJlY3RvcnlFbmQ7CisgIC8vIEVpdGhlciBjb2ZmX2xvYWRfY29uZmlndXJhdGlvbjMyIG9yIGNvZmZfbG9hZF9jb25maWd1cmF0aW9uNjQuCisgIGNvbnN0IHZvaWQgKkxvYWRDb25maWcgPSBudWxscHRyOworCisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRTdHJpbmcodWludDMyX3Qgb2Zmc2V0LCBTdHJpbmdSZWYgJlJlcykgY29uc3Q7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIGNvZmZfc3ltYm9sX3R5cGU+CisgIGNvbnN0IGNvZmZfc3ltYm9sX3R5cGUgKnRvU3ltYihEYXRhUmVmSW1wbCBTeW1iKSBjb25zdDsKKyAgY29uc3QgY29mZl9zZWN0aW9uICp0b1NlYyhEYXRhUmVmSW1wbCBTZWMpIGNvbnN0OworICBjb25zdCBjb2ZmX3JlbG9jYXRpb24gKnRvUmVsKERhdGFSZWZJbXBsIFJlbCkgY29uc3Q7CisKKyAgc3RkOjplcnJvcl9jb2RlIGluaXRTeW1ib2xUYWJsZVB0cigpOworICBzdGQ6OmVycm9yX2NvZGUgaW5pdEltcG9ydFRhYmxlUHRyKCk7CisgIHN0ZDo6ZXJyb3JfY29kZSBpbml0RGVsYXlJbXBvcnRUYWJsZVB0cigpOworICBzdGQ6OmVycm9yX2NvZGUgaW5pdEV4cG9ydFRhYmxlUHRyKCk7CisgIHN0ZDo6ZXJyb3JfY29kZSBpbml0QmFzZVJlbG9jUHRyKCk7CisgIHN0ZDo6ZXJyb3JfY29kZSBpbml0RGVidWdEaXJlY3RvcnlQdHIoKTsKKyAgc3RkOjplcnJvcl9jb2RlIGluaXRMb2FkQ29uZmlnUHRyKCk7CisKK3B1YmxpYzoKKyAgdWludHB0cl90IGdldFN5bWJvbFRhYmxlKCkgY29uc3QgeworICAgIGlmIChTeW1ib2xUYWJsZTE2KQorICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihTeW1ib2xUYWJsZTE2KTsKKyAgICBpZiAoU3ltYm9sVGFibGUzMikKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oU3ltYm9sVGFibGUzMik7CisgICAgcmV0dXJuIHVpbnRwdHJfdCgwKTsKKyAgfQorCisgIHVpbnQxNl90IGdldE1hY2hpbmUoKSBjb25zdCB7CisgICAgaWYgKENPRkZIZWFkZXIpCisgICAgICByZXR1cm4gQ09GRkhlYWRlci0+TWFjaGluZTsKKyAgICBpZiAoQ09GRkJpZ09iakhlYWRlcikKKyAgICAgIHJldHVybiBDT0ZGQmlnT2JqSGVhZGVyLT5NYWNoaW5lOworICAgIGxsdm1fdW5yZWFjaGFibGUoIm5vIENPRkYgaGVhZGVyISIpOworICB9CisKKyAgdWludDE2X3QgZ2V0U2l6ZU9mT3B0aW9uYWxIZWFkZXIoKSBjb25zdCB7CisgICAgaWYgKENPRkZIZWFkZXIpCisgICAgICByZXR1cm4gQ09GRkhlYWRlci0+aXNJbXBvcnRMaWJyYXJ5KCkgPyAwCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDT0ZGSGVhZGVyLT5TaXplT2ZPcHRpb25hbEhlYWRlcjsKKyAgICAvLyBiaWdvYmogZG9lc24ndCBoYXZlIHRoaXMgZmllbGQuCisgICAgaWYgKENPRkZCaWdPYmpIZWFkZXIpCisgICAgICByZXR1cm4gMDsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJubyBDT0ZGIGhlYWRlciEiKTsKKyAgfQorCisgIHVpbnQxNl90IGdldENoYXJhY3RlcmlzdGljcygpIGNvbnN0IHsKKyAgICBpZiAoQ09GRkhlYWRlcikKKyAgICAgIHJldHVybiBDT0ZGSGVhZGVyLT5pc0ltcG9ydExpYnJhcnkoKSA/IDAgOiBDT0ZGSGVhZGVyLT5DaGFyYWN0ZXJpc3RpY3M7CisgICAgLy8gYmlnb2JqIGRvZXNuJ3QgaGF2ZSBjaGFyYWN0ZXJpc3RpY3MgdG8gc3BlYWsgb2YsCisgICAgLy8gZWRpdGJpbiB3aWxsIHNpbGVudGx5IGxpZSB0byB5b3UgaWYgeW91IGF0dGVtcHQgdG8gc2V0IGFueS4KKyAgICBpZiAoQ09GRkJpZ09iakhlYWRlcikKKyAgICAgIHJldHVybiAwOworICAgIGxsdm1fdW5yZWFjaGFibGUoIm5vIENPRkYgaGVhZGVyISIpOworICB9CisKKyAgdWludDMyX3QgZ2V0VGltZURhdGVTdGFtcCgpIGNvbnN0IHsKKyAgICBpZiAoQ09GRkhlYWRlcikKKyAgICAgIHJldHVybiBDT0ZGSGVhZGVyLT5UaW1lRGF0ZVN0YW1wOworICAgIGlmIChDT0ZGQmlnT2JqSGVhZGVyKQorICAgICAgcmV0dXJuIENPRkZCaWdPYmpIZWFkZXItPlRpbWVEYXRlU3RhbXA7CisgICAgbGx2bV91bnJlYWNoYWJsZSgibm8gQ09GRiBoZWFkZXIhIik7CisgIH0KKworICB1aW50MzJfdCBnZXROdW1iZXJPZlNlY3Rpb25zKCkgY29uc3QgeworICAgIGlmIChDT0ZGSGVhZGVyKQorICAgICAgcmV0dXJuIENPRkZIZWFkZXItPmlzSW1wb3J0TGlicmFyeSgpID8gMCA6IENPRkZIZWFkZXItPk51bWJlck9mU2VjdGlvbnM7CisgICAgaWYgKENPRkZCaWdPYmpIZWFkZXIpCisgICAgICByZXR1cm4gQ09GRkJpZ09iakhlYWRlci0+TnVtYmVyT2ZTZWN0aW9uczsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJubyBDT0ZGIGhlYWRlciEiKTsKKyAgfQorCisgIHVpbnQzMl90IGdldFBvaW50ZXJUb1N5bWJvbFRhYmxlKCkgY29uc3QgeworICAgIGlmIChDT0ZGSGVhZGVyKQorICAgICAgcmV0dXJuIENPRkZIZWFkZXItPmlzSW1wb3J0TGlicmFyeSgpID8gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ09GRkhlYWRlci0+UG9pbnRlclRvU3ltYm9sVGFibGU7CisgICAgaWYgKENPRkZCaWdPYmpIZWFkZXIpCisgICAgICByZXR1cm4gQ09GRkJpZ09iakhlYWRlci0+UG9pbnRlclRvU3ltYm9sVGFibGU7CisgICAgbGx2bV91bnJlYWNoYWJsZSgibm8gQ09GRiBoZWFkZXIhIik7CisgIH0KKworICB1aW50MzJfdCBnZXRSYXdOdW1iZXJPZlN5bWJvbHMoKSBjb25zdCB7CisgICAgaWYgKENPRkZIZWFkZXIpCisgICAgICByZXR1cm4gQ09GRkhlYWRlci0+aXNJbXBvcnRMaWJyYXJ5KCkgPyAwIDogQ09GRkhlYWRlci0+TnVtYmVyT2ZTeW1ib2xzOworICAgIGlmIChDT0ZGQmlnT2JqSGVhZGVyKQorICAgICAgcmV0dXJuIENPRkZCaWdPYmpIZWFkZXItPk51bWJlck9mU3ltYm9sczsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJubyBDT0ZGIGhlYWRlciEiKTsKKyAgfQorCisgIHVpbnQzMl90IGdldE51bWJlck9mU3ltYm9scygpIGNvbnN0IHsKKyAgICBpZiAoIVN5bWJvbFRhYmxlMTYgJiYgIVN5bWJvbFRhYmxlMzIpCisgICAgICByZXR1cm4gMDsKKyAgICByZXR1cm4gZ2V0UmF3TnVtYmVyT2ZTeW1ib2xzKCk7CisgIH0KKworICBjb25zdCBjb2ZmX2xvYWRfY29uZmlndXJhdGlvbjMyICpnZXRMb2FkQ29uZmlnMzIoKSBjb25zdCB7CisgICAgYXNzZXJ0KCFpczY0KCkpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IGNvZmZfbG9hZF9jb25maWd1cmF0aW9uMzIgKj4oTG9hZENvbmZpZyk7CisgIH0KKworICBjb25zdCBjb2ZmX2xvYWRfY29uZmlndXJhdGlvbjY0ICpnZXRMb2FkQ29uZmlnNjQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzNjQoKSk7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY29mZl9sb2FkX2NvbmZpZ3VyYXRpb242NCAqPihMb2FkQ29uZmlnKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHZvaWQgbW92ZVN5bWJvbE5leHQoRGF0YVJlZkltcGwgJlN5bWIpIGNvbnN0IG92ZXJyaWRlOworICBFeHBlY3RlZDxTdHJpbmdSZWY+IGdldFN5bWJvbE5hbWUoRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisgIEV4cGVjdGVkPHVpbnQ2NF90PiBnZXRTeW1ib2xBZGRyZXNzKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRTeW1ib2xBbGlnbm1lbnQoRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldFN5bWJvbFZhbHVlSW1wbChEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0Q29tbW9uU3ltYm9sU2l6ZUltcGwoRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFN5bWJvbEZsYWdzKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICBFeHBlY3RlZDxTeW1ib2xSZWY6OlR5cGU+IGdldFN5bWJvbFR5cGUoRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisgIEV4cGVjdGVkPHNlY3Rpb25faXRlcmF0b3I+IGdldFN5bWJvbFNlY3Rpb24oRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgbW92ZVNlY3Rpb25OZXh0KERhdGFSZWZJbXBsICZTZWMpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OmVycm9yX2NvZGUgZ2V0U2VjdGlvbk5hbWUoRGF0YVJlZkltcGwgU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmICZSZXMpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRTZWN0aW9uQWRkcmVzcyhEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRTZWN0aW9uSW5kZXgoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0U2VjdGlvblNpemUoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjplcnJvcl9jb2RlIGdldFNlY3Rpb25Db250ZW50cyhEYXRhUmVmSW1wbCBTZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmICZSZXMpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRTZWN0aW9uQWxpZ25tZW50KERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTZWN0aW9uQ29tcHJlc3NlZChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2VjdGlvblRleHQoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1NlY3Rpb25EYXRhKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTZWN0aW9uQlNTKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTZWN0aW9uVmlydHVhbChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICByZWxvY2F0aW9uX2l0ZXJhdG9yIHNlY3Rpb25fcmVsX2JlZ2luKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIHJlbG9jYXRpb25faXRlcmF0b3Igc2VjdGlvbl9yZWxfZW5kKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgdm9pZCBtb3ZlUmVsb2NhdGlvbk5leHQoRGF0YVJlZkltcGwgJlJlbCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldFJlbG9jYXRpb25PZmZzZXQoRGF0YVJlZkltcGwgUmVsKSBjb25zdCBvdmVycmlkZTsKKyAgc3ltYm9sX2l0ZXJhdG9yIGdldFJlbG9jYXRpb25TeW1ib2woRGF0YVJlZkltcGwgUmVsKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0UmVsb2NhdGlvblR5cGUoRGF0YVJlZkltcGwgUmVsKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBnZXRSZWxvY2F0aW9uVHlwZU5hbWUoRGF0YVJlZkltcGwgUmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlJlc3VsdCkgY29uc3Qgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgQ09GRk9iamVjdEZpbGUoTWVtb3J5QnVmZmVyUmVmIE9iamVjdCwgc3RkOjplcnJvcl9jb2RlICZFQyk7CisKKyAgYmFzaWNfc3ltYm9sX2l0ZXJhdG9yIHN5bWJvbF9iZWdpbigpIGNvbnN0IG92ZXJyaWRlOworICBiYXNpY19zeW1ib2xfaXRlcmF0b3Igc3ltYm9sX2VuZCgpIGNvbnN0IG92ZXJyaWRlOworICBzZWN0aW9uX2l0ZXJhdG9yIHNlY3Rpb25fYmVnaW4oKSBjb25zdCBvdmVycmlkZTsKKyAgc2VjdGlvbl9pdGVyYXRvciBzZWN0aW9uX2VuZCgpIGNvbnN0IG92ZXJyaWRlOworCisgIGNvbnN0IGNvZmZfc2VjdGlvbiAqZ2V0Q09GRlNlY3Rpb24oY29uc3QgU2VjdGlvblJlZiAmU2VjdGlvbikgY29uc3Q7CisgIENPRkZTeW1ib2xSZWYgZ2V0Q09GRlN5bWJvbChjb25zdCBEYXRhUmVmSW1wbCAmUmVmKSBjb25zdDsKKyAgQ09GRlN5bWJvbFJlZiBnZXRDT0ZGU3ltYm9sKGNvbnN0IFN5bWJvbFJlZiAmU3ltYm9sKSBjb25zdDsKKyAgY29uc3QgY29mZl9yZWxvY2F0aW9uICpnZXRDT0ZGUmVsb2NhdGlvbihjb25zdCBSZWxvY2F0aW9uUmVmICZSZWxvYykgY29uc3Q7CisgIHVuc2lnbmVkIGdldFNlY3Rpb25JRChTZWN0aW9uUmVmIFNlYykgY29uc3Q7CisgIHVuc2lnbmVkIGdldFN5bWJvbFNlY3Rpb25JRChTeW1ib2xSZWYgU3ltKSBjb25zdDsKKworICB1aW50OF90IGdldEJ5dGVzSW5BZGRyZXNzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFN0cmluZ1JlZiBnZXRGaWxlRm9ybWF0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICBUcmlwbGU6OkFyY2hUeXBlIGdldEFyY2goKSBjb25zdCBvdmVycmlkZTsKKyAgU3VidGFyZ2V0RmVhdHVyZXMgZ2V0RmVhdHVyZXMoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBTdWJ0YXJnZXRGZWF0dXJlcygpOyB9CisKKyAgaW1wb3J0X2RpcmVjdG9yeV9pdGVyYXRvciBpbXBvcnRfZGlyZWN0b3J5X2JlZ2luKCkgY29uc3Q7CisgIGltcG9ydF9kaXJlY3RvcnlfaXRlcmF0b3IgaW1wb3J0X2RpcmVjdG9yeV9lbmQoKSBjb25zdDsKKyAgZGVsYXlfaW1wb3J0X2RpcmVjdG9yeV9pdGVyYXRvciBkZWxheV9pbXBvcnRfZGlyZWN0b3J5X2JlZ2luKCkgY29uc3Q7CisgIGRlbGF5X2ltcG9ydF9kaXJlY3RvcnlfaXRlcmF0b3IgZGVsYXlfaW1wb3J0X2RpcmVjdG9yeV9lbmQoKSBjb25zdDsKKyAgZXhwb3J0X2RpcmVjdG9yeV9pdGVyYXRvciBleHBvcnRfZGlyZWN0b3J5X2JlZ2luKCkgY29uc3Q7CisgIGV4cG9ydF9kaXJlY3RvcnlfaXRlcmF0b3IgZXhwb3J0X2RpcmVjdG9yeV9lbmQoKSBjb25zdDsKKyAgYmFzZV9yZWxvY19pdGVyYXRvciBiYXNlX3JlbG9jX2JlZ2luKCkgY29uc3Q7CisgIGJhc2VfcmVsb2NfaXRlcmF0b3IgYmFzZV9yZWxvY19lbmQoKSBjb25zdDsKKyAgY29uc3QgZGVidWdfZGlyZWN0b3J5ICpkZWJ1Z19kaXJlY3RvcnlfYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIERlYnVnRGlyZWN0b3J5QmVnaW47CisgIH0KKyAgY29uc3QgZGVidWdfZGlyZWN0b3J5ICpkZWJ1Z19kaXJlY3RvcnlfZW5kKCkgY29uc3QgeworICAgIHJldHVybiBEZWJ1Z0RpcmVjdG9yeUVuZDsKKyAgfQorCisgIGl0ZXJhdG9yX3JhbmdlPGltcG9ydF9kaXJlY3RvcnlfaXRlcmF0b3I+IGltcG9ydF9kaXJlY3RvcmllcygpIGNvbnN0OworICBpdGVyYXRvcl9yYW5nZTxkZWxheV9pbXBvcnRfZGlyZWN0b3J5X2l0ZXJhdG9yPgorICAgICAgZGVsYXlfaW1wb3J0X2RpcmVjdG9yaWVzKCkgY29uc3Q7CisgIGl0ZXJhdG9yX3JhbmdlPGV4cG9ydF9kaXJlY3RvcnlfaXRlcmF0b3I+IGV4cG9ydF9kaXJlY3RvcmllcygpIGNvbnN0OworICBpdGVyYXRvcl9yYW5nZTxiYXNlX3JlbG9jX2l0ZXJhdG9yPiBiYXNlX3JlbG9jcygpIGNvbnN0OworICBpdGVyYXRvcl9yYW5nZTxjb25zdCBkZWJ1Z19kaXJlY3RvcnkgKj4gZGVidWdfZGlyZWN0b3JpZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoZGVidWdfZGlyZWN0b3J5X2JlZ2luKCksIGRlYnVnX2RpcmVjdG9yeV9lbmQoKSk7CisgIH0KKworICBjb25zdCBkb3NfaGVhZGVyICpnZXRET1NIZWFkZXIoKSBjb25zdCB7CisgICAgaWYgKCFQRTMySGVhZGVyICYmICFQRTMyUGx1c0hlYWRlcikKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IGRvc19oZWFkZXIgKj4oYmFzZSgpKTsKKyAgfQorICBzdGQ6OmVycm9yX2NvZGUgZ2V0UEUzMkhlYWRlcihjb25zdCBwZTMyX2hlYWRlciAqJlJlcykgY29uc3Q7CisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRQRTMyUGx1c0hlYWRlcihjb25zdCBwZTMycGx1c19oZWFkZXIgKiZSZXMpIGNvbnN0OworICBzdGQ6OmVycm9yX2NvZGUgZ2V0RGF0YURpcmVjdG9yeSh1aW50MzJfdCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZGF0YV9kaXJlY3RvcnkgKiZSZXMpIGNvbnN0OworICBzdGQ6OmVycm9yX2NvZGUgZ2V0U2VjdGlvbihpbnQzMl90IGluZGV4LCBjb25zdCBjb2ZmX3NlY3Rpb24gKiZSZXMpIGNvbnN0OworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBjb2ZmX3N5bWJvbF90eXBlPgorICBzdGQ6OmVycm9yX2NvZGUgZ2V0U3ltYm9sKHVpbnQzMl90IEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNvZmZfc3ltYm9sX3R5cGUgKiZSZXMpIGNvbnN0IHsKKyAgICBpZiAoSW5kZXggPj0gZ2V0TnVtYmVyT2ZTeW1ib2xzKCkpCisgICAgICByZXR1cm4gb2JqZWN0X2Vycm9yOjpwYXJzZV9mYWlsZWQ7CisKKyAgICBSZXMgPSByZWludGVycHJldF9jYXN0PGNvZmZfc3ltYm9sX3R5cGUgKj4oZ2V0U3ltYm9sVGFibGUoKSkgKyBJbmRleDsKKyAgICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKCk7CisgIH0KKyAgRXhwZWN0ZWQ8Q09GRlN5bWJvbFJlZj4gZ2V0U3ltYm9sKHVpbnQzMl90IGluZGV4KSBjb25zdCB7CisgICAgaWYgKFN5bWJvbFRhYmxlMTYpIHsKKyAgICAgIGNvbnN0IGNvZmZfc3ltYm9sMTYgKlN5bWIgPSBudWxscHRyOworICAgICAgaWYgKHN0ZDo6ZXJyb3JfY29kZSBFQyA9IGdldFN5bWJvbChpbmRleCwgU3ltYikpCisgICAgICAgIHJldHVybiBlcnJvckNvZGVUb0Vycm9yKEVDKTsKKyAgICAgIHJldHVybiBDT0ZGU3ltYm9sUmVmKFN5bWIpOworICAgIH0KKyAgICBpZiAoU3ltYm9sVGFibGUzMikgeworICAgICAgY29uc3QgY29mZl9zeW1ib2wzMiAqU3ltYiA9IG51bGxwdHI7CisgICAgICBpZiAoc3RkOjplcnJvcl9jb2RlIEVDID0gZ2V0U3ltYm9sKGluZGV4LCBTeW1iKSkKKyAgICAgICAgcmV0dXJuIGVycm9yQ29kZVRvRXJyb3IoRUMpOworICAgICAgcmV0dXJuIENPRkZTeW1ib2xSZWYoU3ltYik7CisgICAgfQorICAgIHJldHVybiBlcnJvckNvZGVUb0Vycm9yKG9iamVjdF9lcnJvcjo6cGFyc2VfZmFpbGVkKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGQ6OmVycm9yX2NvZGUgZ2V0QXV4U3ltYm9sKHVpbnQzMl90IGluZGV4LCBjb25zdCBUIComUmVzKSBjb25zdCB7CisgICAgRXhwZWN0ZWQ8Q09GRlN5bWJvbFJlZj4gUyA9IGdldFN5bWJvbChpbmRleCk7CisgICAgaWYgKEVycm9yIEUgPSBTLnRha2VFcnJvcigpKQorICAgICAgcmV0dXJuIGVycm9yVG9FcnJvckNvZGUoc3RkOjptb3ZlKEUpKTsKKyAgICBSZXMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4oUy0+Z2V0UmF3UHRyKCkpOworICAgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKKyAgfQorCisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRTeW1ib2xOYW1lKENPRkZTeW1ib2xSZWYgU3ltYm9sLCBTdHJpbmdSZWYgJlJlcykgY29uc3Q7CisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRTeW1ib2xOYW1lKGNvbnN0IGNvZmZfc3ltYm9sX2dlbmVyaWMgKlN5bWJvbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmICZSZXMpIGNvbnN0OworCisgIEFycmF5UmVmPHVpbnQ4X3Q+IGdldFN5bWJvbEF1eERhdGEoQ09GRlN5bWJvbFJlZiBTeW1ib2wpIGNvbnN0OworCisgIHNpemVfdCBnZXRTeW1ib2xUYWJsZUVudHJ5U2l6ZSgpIGNvbnN0IHsKKyAgICBpZiAoQ09GRkhlYWRlcikKKyAgICAgIHJldHVybiBzaXplb2YoY29mZl9zeW1ib2wxNik7CisgICAgaWYgKENPRkZCaWdPYmpIZWFkZXIpCisgICAgICByZXR1cm4gc2l6ZW9mKGNvZmZfc3ltYm9sMzIpOworICAgIGxsdm1fdW5yZWFjaGFibGUoIm51bGwgc3ltYm9sIHRhYmxlIHBvaW50ZXIhIik7CisgIH0KKworICBpdGVyYXRvcl9yYW5nZTxjb25zdCBjb2ZmX3JlbG9jYXRpb24gKj4KKyAgZ2V0UmVsb2NhdGlvbnMoY29uc3QgY29mZl9zZWN0aW9uICpTZWMpIGNvbnN0OworCisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRTZWN0aW9uTmFtZShjb25zdCBjb2ZmX3NlY3Rpb24gKlNlYywgU3RyaW5nUmVmICZSZXMpIGNvbnN0OworICB1aW50NjRfdCBnZXRTZWN0aW9uU2l6ZShjb25zdCBjb2ZmX3NlY3Rpb24gKlNlYykgY29uc3Q7CisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRTZWN0aW9uQ29udGVudHMoY29uc3QgY29mZl9zZWN0aW9uICpTZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gJlJlcykgY29uc3Q7CisKKyAgdWludDY0X3QgZ2V0SW1hZ2VCYXNlKCkgY29uc3Q7CisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRWYVB0cih1aW50NjRfdCBWQSwgdWludHB0cl90ICZSZXMpIGNvbnN0OworICBzdGQ6OmVycm9yX2NvZGUgZ2V0UnZhUHRyKHVpbnQzMl90IFJ2YSwgdWludHB0cl90ICZSZXMpIGNvbnN0OworCisgIC8vLyBHaXZlbiBhbiBSVkEgYmFzZSBhbmQgc2l6ZSwgcmV0dXJucyBhIHZhbGlkIGFycmF5IG9mIGJ5dGVzIG9yIGFuIGVycm9yCisgIC8vLyBjb2RlIGlmIHRoZSBSVkEgYW5kIHNpemUgaXMgbm90IGNvbnRhaW5lZCBjb21wbGV0ZWx5IHdpdGhpbiBhIHZhbGlkCisgIC8vLyBzZWN0aW9uLgorICBzdGQ6OmVycm9yX2NvZGUgZ2V0UnZhQW5kU2l6ZUFzQnl0ZXModWludDMyX3QgUlZBLCB1aW50MzJfdCBTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gJkNvbnRlbnRzKSBjb25zdDsKKworICBzdGQ6OmVycm9yX2NvZGUgZ2V0SGludE5hbWUodWludDMyX3QgUnZhLCB1aW50MTZfdCAmSGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiAmTmFtZSkgY29uc3Q7CisKKyAgLy8vIEdldCBQREIgaW5mb3JtYXRpb24gb3V0IG9mIGEgY29kZXZpZXcgZGVidWcgZGlyZWN0b3J5IGVudHJ5LgorICBzdGQ6OmVycm9yX2NvZGUgZ2V0RGVidWdQREJJbmZvKGNvbnN0IGRlYnVnX2RpcmVjdG9yeSAqRGVidWdEaXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZXZpZXc6OkRlYnVnSW5mbyAqJkluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmICZQREJGaWxlTmFtZSkgY29uc3Q7CisKKyAgLy8vIEdldCBQREIgaW5mb3JtYXRpb24gZnJvbSBhbiBleGVjdXRhYmxlLiBJZiB0aGUgaW5mb3JtYXRpb24gaXMgbm90IHByZXNlbnQsCisgIC8vLyBJbmZvIHdpbGwgYmUgc2V0IHRvIG51bGxwdHIgYW5kIFBEQkZpbGVOYW1lIHdpbGwgYmUgZW1wdHkuIEFuIGVycm9yIGlzCisgIC8vLyByZXR1cm5lZCBvbmx5IG9uIGNvcnJ1cHQgb2JqZWN0IGZpbGVzLiBDb252ZW5pZW5jZSBhY2Nlc3NvciB0aGF0IGNhbiBiZQorICAvLy8gdXNlZCBpZiB0aGUgZGVidWcgZGlyZWN0b3J5IGlzIG5vdCBhbHJlYWR5IGhhbmR5LgorICBzdGQ6OmVycm9yX2NvZGUgZ2V0RGVidWdQREJJbmZvKGNvbnN0IGNvZGV2aWV3OjpEZWJ1Z0luZm8gKiZJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiAmUERCRmlsZU5hbWUpIGNvbnN0OworCisgIGJvb2wgaXNSZWxvY2F0YWJsZU9iamVjdCgpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzNjQoKSBjb25zdCB7IHJldHVybiBQRTMyUGx1c0hlYWRlcjsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQmluYXJ5ICp2KSB7IHJldHVybiB2LT5pc0NPRkYoKTsgfQorfTsKKworLy8gVGhlIGl0ZXJhdG9yIGZvciB0aGUgaW1wb3J0IGRpcmVjdG9yeSB0YWJsZS4KK2NsYXNzIEltcG9ydERpcmVjdG9yeUVudHJ5UmVmIHsKK3B1YmxpYzoKKyAgSW1wb3J0RGlyZWN0b3J5RW50cnlSZWYoKSA9IGRlZmF1bHQ7CisgIEltcG9ydERpcmVjdG9yeUVudHJ5UmVmKGNvbnN0IGNvZmZfaW1wb3J0X2RpcmVjdG9yeV90YWJsZV9lbnRyeSAqVGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEksIGNvbnN0IENPRkZPYmplY3RGaWxlICpPd25lcikKKyAgICAgIDogSW1wb3J0VGFibGUoVGFibGUpLCBJbmRleChJKSwgT3duaW5nT2JqZWN0KE93bmVyKSB7fQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbXBvcnREaXJlY3RvcnlFbnRyeVJlZiAmT3RoZXIpIGNvbnN0OworICB2b2lkIG1vdmVOZXh0KCk7CisKKyAgaW1wb3J0ZWRfc3ltYm9sX2l0ZXJhdG9yIGltcG9ydGVkX3N5bWJvbF9iZWdpbigpIGNvbnN0OworICBpbXBvcnRlZF9zeW1ib2xfaXRlcmF0b3IgaW1wb3J0ZWRfc3ltYm9sX2VuZCgpIGNvbnN0OworICBpdGVyYXRvcl9yYW5nZTxpbXBvcnRlZF9zeW1ib2xfaXRlcmF0b3I+IGltcG9ydGVkX3N5bWJvbHMoKSBjb25zdDsKKworICBpbXBvcnRlZF9zeW1ib2xfaXRlcmF0b3IgbG9va3VwX3RhYmxlX2JlZ2luKCkgY29uc3Q7CisgIGltcG9ydGVkX3N5bWJvbF9pdGVyYXRvciBsb29rdXBfdGFibGVfZW5kKCkgY29uc3Q7CisgIGl0ZXJhdG9yX3JhbmdlPGltcG9ydGVkX3N5bWJvbF9pdGVyYXRvcj4gbG9va3VwX3RhYmxlX3N5bWJvbHMoKSBjb25zdDsKKworICBzdGQ6OmVycm9yX2NvZGUgZ2V0TmFtZShTdHJpbmdSZWYgJlJlc3VsdCkgY29uc3Q7CisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRJbXBvcnRMb29rdXBUYWJsZVJWQSh1aW50MzJfdCAmUmVzdWx0KSBjb25zdDsKKyAgc3RkOjplcnJvcl9jb2RlIGdldEltcG9ydEFkZHJlc3NUYWJsZVJWQSh1aW50MzJfdCAmUmVzdWx0KSBjb25zdDsKKworICBzdGQ6OmVycm9yX2NvZGUKKyAgZ2V0SW1wb3J0VGFibGVFbnRyeShjb25zdCBjb2ZmX2ltcG9ydF9kaXJlY3RvcnlfdGFibGVfZW50cnkgKiZSZXN1bHQpIGNvbnN0OworCitwcml2YXRlOgorICBjb25zdCBjb2ZmX2ltcG9ydF9kaXJlY3RvcnlfdGFibGVfZW50cnkgKkltcG9ydFRhYmxlOworICB1aW50MzJfdCBJbmRleDsKKyAgY29uc3QgQ09GRk9iamVjdEZpbGUgKk93bmluZ09iamVjdCA9IG51bGxwdHI7Cit9OworCitjbGFzcyBEZWxheUltcG9ydERpcmVjdG9yeUVudHJ5UmVmIHsKK3B1YmxpYzoKKyAgRGVsYXlJbXBvcnREaXJlY3RvcnlFbnRyeVJlZigpID0gZGVmYXVsdDsKKyAgRGVsYXlJbXBvcnREaXJlY3RvcnlFbnRyeVJlZihjb25zdCBkZWxheV9pbXBvcnRfZGlyZWN0b3J5X3RhYmxlX2VudHJ5ICpULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEksIGNvbnN0IENPRkZPYmplY3RGaWxlICpPd25lcikKKyAgICAgIDogVGFibGUoVCksIEluZGV4KEkpLCBPd25pbmdPYmplY3QoT3duZXIpIHt9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IERlbGF5SW1wb3J0RGlyZWN0b3J5RW50cnlSZWYgJk90aGVyKSBjb25zdDsKKyAgdm9pZCBtb3ZlTmV4dCgpOworCisgIGltcG9ydGVkX3N5bWJvbF9pdGVyYXRvciBpbXBvcnRlZF9zeW1ib2xfYmVnaW4oKSBjb25zdDsKKyAgaW1wb3J0ZWRfc3ltYm9sX2l0ZXJhdG9yIGltcG9ydGVkX3N5bWJvbF9lbmQoKSBjb25zdDsKKyAgaXRlcmF0b3JfcmFuZ2U8aW1wb3J0ZWRfc3ltYm9sX2l0ZXJhdG9yPiBpbXBvcnRlZF9zeW1ib2xzKCkgY29uc3Q7CisKKyAgc3RkOjplcnJvcl9jb2RlIGdldE5hbWUoU3RyaW5nUmVmICZSZXN1bHQpIGNvbnN0OworICBzdGQ6OmVycm9yX2NvZGUgZ2V0RGVsYXlJbXBvcnRUYWJsZSgKKyAgICAgIGNvbnN0IGRlbGF5X2ltcG9ydF9kaXJlY3RvcnlfdGFibGVfZW50cnkgKiZSZXN1bHQpIGNvbnN0OworICBzdGQ6OmVycm9yX2NvZGUgZ2V0SW1wb3J0QWRkcmVzcyhpbnQgQWRkckluZGV4LCB1aW50NjRfdCAmUmVzdWx0KSBjb25zdDsKKworcHJpdmF0ZToKKyAgY29uc3QgZGVsYXlfaW1wb3J0X2RpcmVjdG9yeV90YWJsZV9lbnRyeSAqVGFibGU7CisgIHVpbnQzMl90IEluZGV4OworICBjb25zdCBDT0ZGT2JqZWN0RmlsZSAqT3duaW5nT2JqZWN0ID0gbnVsbHB0cjsKK307CisKKy8vIFRoZSBpdGVyYXRvciBmb3IgdGhlIGV4cG9ydCBkaXJlY3RvcnkgdGFibGUgZW50cnkuCitjbGFzcyBFeHBvcnREaXJlY3RvcnlFbnRyeVJlZiB7CitwdWJsaWM6CisgIEV4cG9ydERpcmVjdG9yeUVudHJ5UmVmKCkgPSBkZWZhdWx0OworICBFeHBvcnREaXJlY3RvcnlFbnRyeVJlZihjb25zdCBleHBvcnRfZGlyZWN0b3J5X3RhYmxlX2VudHJ5ICpUYWJsZSwgdWludDMyX3QgSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09GRk9iamVjdEZpbGUgKk93bmVyKQorICAgICAgOiBFeHBvcnRUYWJsZShUYWJsZSksIEluZGV4KEkpLCBPd25pbmdPYmplY3QoT3duZXIpIHt9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEV4cG9ydERpcmVjdG9yeUVudHJ5UmVmICZPdGhlcikgY29uc3Q7CisgIHZvaWQgbW92ZU5leHQoKTsKKworICBzdGQ6OmVycm9yX2NvZGUgZ2V0RGxsTmFtZShTdHJpbmdSZWYgJlJlc3VsdCkgY29uc3Q7CisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRPcmRpbmFsQmFzZSh1aW50MzJfdCAmUmVzdWx0KSBjb25zdDsKKyAgc3RkOjplcnJvcl9jb2RlIGdldE9yZGluYWwodWludDMyX3QgJlJlc3VsdCkgY29uc3Q7CisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRFeHBvcnRSVkEodWludDMyX3QgJlJlc3VsdCkgY29uc3Q7CisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRTeW1ib2xOYW1lKFN0cmluZ1JlZiAmUmVzdWx0KSBjb25zdDsKKworICBzdGQ6OmVycm9yX2NvZGUgaXNGb3J3YXJkZXIoYm9vbCAmUmVzdWx0KSBjb25zdDsKKyAgc3RkOjplcnJvcl9jb2RlIGdldEZvcndhcmRUbyhTdHJpbmdSZWYgJlJlc3VsdCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIGNvbnN0IGV4cG9ydF9kaXJlY3RvcnlfdGFibGVfZW50cnkgKkV4cG9ydFRhYmxlOworICB1aW50MzJfdCBJbmRleDsKKyAgY29uc3QgQ09GRk9iamVjdEZpbGUgKk93bmluZ09iamVjdCA9IG51bGxwdHI7Cit9OworCitjbGFzcyBJbXBvcnRlZFN5bWJvbFJlZiB7CitwdWJsaWM6CisgIEltcG9ydGVkU3ltYm9sUmVmKCkgPSBkZWZhdWx0OworICBJbXBvcnRlZFN5bWJvbFJlZihjb25zdCBpbXBvcnRfbG9va3VwX3RhYmxlX2VudHJ5MzIgKkVudHJ5LCB1aW50MzJfdCBJLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0ZGT2JqZWN0RmlsZSAqT3duZXIpCisgICAgICA6IEVudHJ5MzIoRW50cnkpLCBFbnRyeTY0KG51bGxwdHIpLCBJbmRleChJKSwgT3duaW5nT2JqZWN0KE93bmVyKSB7fQorICBJbXBvcnRlZFN5bWJvbFJlZihjb25zdCBpbXBvcnRfbG9va3VwX3RhYmxlX2VudHJ5NjQgKkVudHJ5LCB1aW50MzJfdCBJLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0ZGT2JqZWN0RmlsZSAqT3duZXIpCisgICAgICA6IEVudHJ5MzIobnVsbHB0ciksIEVudHJ5NjQoRW50cnkpLCBJbmRleChJKSwgT3duaW5nT2JqZWN0KE93bmVyKSB7fQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJbXBvcnRlZFN5bWJvbFJlZiAmT3RoZXIpIGNvbnN0OworICB2b2lkIG1vdmVOZXh0KCk7CisKKyAgc3RkOjplcnJvcl9jb2RlIGdldFN5bWJvbE5hbWUoU3RyaW5nUmVmICZSZXN1bHQpIGNvbnN0OworICBzdGQ6OmVycm9yX2NvZGUgaXNPcmRpbmFsKGJvb2wgJlJlc3VsdCkgY29uc3Q7CisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRPcmRpbmFsKHVpbnQxNl90ICZSZXN1bHQpIGNvbnN0OworICBzdGQ6OmVycm9yX2NvZGUgZ2V0SGludE5hbWVSVkEodWludDMyX3QgJlJlc3VsdCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIGNvbnN0IGltcG9ydF9sb29rdXBfdGFibGVfZW50cnkzMiAqRW50cnkzMjsKKyAgY29uc3QgaW1wb3J0X2xvb2t1cF90YWJsZV9lbnRyeTY0ICpFbnRyeTY0OworICB1aW50MzJfdCBJbmRleDsKKyAgY29uc3QgQ09GRk9iamVjdEZpbGUgKk93bmluZ09iamVjdCA9IG51bGxwdHI7Cit9OworCitjbGFzcyBCYXNlUmVsb2NSZWYgeworcHVibGljOgorICBCYXNlUmVsb2NSZWYoKSA9IGRlZmF1bHQ7CisgIEJhc2VSZWxvY1JlZihjb25zdCBjb2ZmX2Jhc2VfcmVsb2NfYmxvY2tfaGVhZGVyICpIZWFkZXIsCisgICAgICAgICAgICAgICBjb25zdCBDT0ZGT2JqZWN0RmlsZSAqT3duZXIpCisgICAgICA6IEhlYWRlcihIZWFkZXIpLCBJbmRleCgwKSB7fQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBCYXNlUmVsb2NSZWYgJk90aGVyKSBjb25zdDsKKyAgdm9pZCBtb3ZlTmV4dCgpOworCisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRUeXBlKHVpbnQ4X3QgJlR5cGUpIGNvbnN0OworICBzdGQ6OmVycm9yX2NvZGUgZ2V0UlZBKHVpbnQzMl90ICZSZXN1bHQpIGNvbnN0OworCitwcml2YXRlOgorICBjb25zdCBjb2ZmX2Jhc2VfcmVsb2NfYmxvY2tfaGVhZGVyICpIZWFkZXI7CisgIHVpbnQzMl90IEluZGV4OworfTsKKworY2xhc3MgUmVzb3VyY2VTZWN0aW9uUmVmIHsKK3B1YmxpYzoKKyAgUmVzb3VyY2VTZWN0aW9uUmVmKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBSZXNvdXJjZVNlY3Rpb25SZWYoU3RyaW5nUmVmIFJlZikgOiBCQlMoUmVmLCBzdXBwb3J0OjpsaXR0bGUpIHt9CisKKyAgRXhwZWN0ZWQ8QXJyYXlSZWY8VVRGMTY+PgorICBnZXRFbnRyeU5hbWVTdHJpbmcoY29uc3QgY29mZl9yZXNvdXJjZV9kaXJfZW50cnkgJkVudHJ5KTsKKyAgRXhwZWN0ZWQ8Y29uc3QgY29mZl9yZXNvdXJjZV9kaXJfdGFibGUgJj4KKyAgZ2V0RW50cnlTdWJEaXIoY29uc3QgY29mZl9yZXNvdXJjZV9kaXJfZW50cnkgJkVudHJ5KTsKKyAgRXhwZWN0ZWQ8Y29uc3QgY29mZl9yZXNvdXJjZV9kaXJfdGFibGUgJj4gZ2V0QmFzZVRhYmxlKCk7CisKK3ByaXZhdGU6CisgIEJpbmFyeUJ5dGVTdHJlYW0gQkJTOworCisgIEV4cGVjdGVkPGNvbnN0IGNvZmZfcmVzb3VyY2VfZGlyX3RhYmxlICY+IGdldFRhYmxlQXRPZmZzZXQodWludDMyX3QgT2Zmc2V0KTsKKyAgRXhwZWN0ZWQ8QXJyYXlSZWY8VVRGMTY+PiBnZXREaXJTdHJpbmdBdE9mZnNldCh1aW50MzJfdCBPZmZzZXQpOworfTsKKworLy8gQ29ycmVzcG9uZHMgdG8gYF9GUE9fREFUQWAgc3RydWN0dXJlIGluIHRoZSBQRS9DT0ZGIHNwZWMuCitzdHJ1Y3QgRnBvRGF0YSB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE9mZnNldDsgLy8gdWxPZmZTdGFydDogT2Zmc2V0IDFzdCBieXRlIG9mIGZ1bmN0aW9uIGNvZGUKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU2l6ZTsgICAvLyBjYlByb2NTaXplOiAjIGJ5dGVzIGluIGZ1bmN0aW9uCisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE51bUxvY2FsczsgLy8gY2R3TG9jYWxzOiAjIGJ5dGVzIGluIGxvY2Fscy80CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IE51bVBhcmFtczsgLy8gY2R3UGFyYW1zOiAjIGJ5dGVzIGluIHBhcmFtcy80CisgIHN1cHBvcnQ6OnVsaXR0bGUxNl90IEF0dHJpYnV0ZXM7CisKKyAgLy8gY2JQcm9sb2c6ICMgYnl0ZXMgaW4gcHJvbG9nCisgIGludCBnZXRQcm9sb2dTaXplKCkgY29uc3QgeyByZXR1cm4gQXR0cmlidXRlcyAmIDB4RjsgfQorCisgIC8vIGNiUmVnczogIyByZWdzIHNhdmVkCisgIGludCBnZXROdW1TYXZlZFJlZ3MoKSBjb25zdCB7IHJldHVybiAoQXR0cmlidXRlcyA+PiA4KSAmIDB4NzsgfQorCisgIC8vIGZIYXNTRUg6IHRydWUgaWYgc2VoIGlzIGZ1bmMKKyAgYm9vbCBoYXNTRUgoKSBjb25zdCB7IHJldHVybiAoQXR0cmlidXRlcyA+PiA5KSAmIDE7IH0KKworICAvLyBmVXNlQlA6IHRydWUgaWYgRUJQIGhhcyBiZWVuIGFsbG9jYXRlZAorICBib29sIHVzZUJQKCkgY29uc3QgeyByZXR1cm4gKEF0dHJpYnV0ZXMgPj4gMTApICYgMTsgfQorCisgIC8vIGNiRnJhbWU6IGZyYW1lIHBvaW50ZXIKKyAgaW50IGdldEZQKCkgY29uc3QgeyByZXR1cm4gQXR0cmlidXRlcyA+PiAxNDsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9iamVjdAorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9PQkpFQ1RfQ09GRl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9DT0ZGSW1wb3J0RmlsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvQ09GRkltcG9ydEZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2E0MTZmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvQ09GRkltcG9ydEZpbGUuaApAQCAtMCwwICsxLDEwNyBAQAorLy89PT0tIENPRkZJbXBvcnRGaWxlLmggLSBDT0ZGIHNob3J0IGltcG9ydCBmaWxlIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDT0ZGIHNob3J0IGltcG9ydCBmaWxlIGlzIGEgc3BlY2lhbCBraW5kIG9mIGZpbGUgd2hpY2ggY29udGFpbnMKKy8vIG9ubHkgc3ltYm9sIG5hbWVzIGZvciBETEwtZXhwb3J0ZWQgc3ltYm9scy4gVGhpcyBjbGFzcyBpbXBsZW1lbnRzCisvLyBleHBvcnRpbmcgb2YgU3ltYm9scyB0byBjcmVhdGUgbGlicmFyaWVzIGFuZCBhIFN5bWJvbGljRmlsZQorLy8gaW50ZXJmYWNlIGZvciB0aGUgZmlsZSB0eXBlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RfQ09GRl9JTVBPUlRfRklMRV9ICisjZGVmaW5lIExMVk1fT0JKRUNUX0NPRkZfSU1QT1JUX0ZJTEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9DT0ZGLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvSVJPYmplY3RGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvT2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L1N5bWJvbGljRmlsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9iamVjdCB7CisKK2NsYXNzIENPRkZJbXBvcnRGaWxlIDogcHVibGljIFN5bWJvbGljRmlsZSB7CitwdWJsaWM6CisgIENPRkZJbXBvcnRGaWxlKE1lbW9yeUJ1ZmZlclJlZiBTb3VyY2UpCisgICAgICA6IFN5bWJvbGljRmlsZShJRF9DT0ZGSW1wb3J0RmlsZSwgU291cmNlKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoQmluYXJ5IGNvbnN0ICpWKSB7IHJldHVybiBWLT5pc0NPRkZJbXBvcnRGaWxlKCk7IH0KKworICB2b2lkIG1vdmVTeW1ib2xOZXh0KERhdGFSZWZJbXBsICZTeW1iKSBjb25zdCBvdmVycmlkZSB7ICsrU3ltYi5wOyB9CisKKyAgc3RkOjplcnJvcl9jb2RlIHByaW50U3ltYm9sTmFtZShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGUgeworICAgIGlmIChTeW1iLnAgPT0gMCkKKyAgICAgIE9TIDw8ICJfX2ltcF8iOworICAgIE9TIDw8IFN0cmluZ1JlZihEYXRhLmdldEJ1ZmZlclN0YXJ0KCkgKyBzaXplb2YoY29mZl9pbXBvcnRfaGVhZGVyKSk7CisgICAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOworICB9CisKKyAgdWludDMyX3QgZ2V0U3ltYm9sRmxhZ3MoRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBTeW1ib2xSZWY6OlNGX0dsb2JhbDsKKyAgfQorCisgIGJhc2ljX3N5bWJvbF9pdGVyYXRvciBzeW1ib2xfYmVnaW4oKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEJhc2ljU3ltYm9sUmVmKERhdGFSZWZJbXBsKCksIHRoaXMpOworICB9CisKKyAgYmFzaWNfc3ltYm9sX2l0ZXJhdG9yIHN5bWJvbF9lbmQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgRGF0YVJlZkltcGwgU3ltYjsKKyAgICBTeW1iLnAgPSBpc0RhdGEoKSA/IDEgOiAyOworICAgIHJldHVybiBCYXNpY1N5bWJvbFJlZihTeW1iLCB0aGlzKTsKKyAgfQorCisgIGNvbnN0IGNvZmZfaW1wb3J0X2hlYWRlciAqZ2V0Q09GRkltcG9ydEhlYWRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBvYmplY3Q6OmNvZmZfaW1wb3J0X2hlYWRlciAqPigKKyAgICAgICAgRGF0YS5nZXRCdWZmZXJTdGFydCgpKTsKKyAgfQorCitwcml2YXRlOgorICBib29sIGlzRGF0YSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0Q09GRkltcG9ydEhlYWRlcigpLT5nZXRUeXBlKCkgPT0gQ09GRjo6SU1QT1JUX0RBVEE7CisgIH0KK307CisKK3N0cnVjdCBDT0ZGU2hvcnRFeHBvcnQgeworICBzdGQ6OnN0cmluZyBOYW1lOworICBzdGQ6OnN0cmluZyBFeHROYW1lOworICBzdGQ6OnN0cmluZyBTeW1ib2xOYW1lOworCisgIHVpbnQxNl90IE9yZGluYWwgPSAwOworICBib29sIE5vbmFtZSA9IGZhbHNlOworICBib29sIERhdGEgPSBmYWxzZTsKKyAgYm9vbCBQcml2YXRlID0gZmFsc2U7CisgIGJvb2wgQ29uc3RhbnQgPSBmYWxzZTsKKworICBib29sIGlzV2VhaygpIHsKKyAgICByZXR1cm4gRXh0TmFtZS5zaXplKCkgJiYgRXh0TmFtZSAhPSBOYW1lOworICB9CisKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDT0ZGU2hvcnRFeHBvcnQgJkwsIGNvbnN0IENPRkZTaG9ydEV4cG9ydCAmUikgeworICAgIHJldHVybiBMLk5hbWUgPT0gUi5OYW1lICYmIEwuRXh0TmFtZSA9PSBSLkV4dE5hbWUgJiYKKyAgICAgICAgICAgIEwuT3JkaW5hbCA9PSBSLk9yZGluYWwgJiYgTC5Ob25hbWUgPT0gUi5Ob25hbWUgJiYKKyAgICAgICAgICAgIEwuRGF0YSA9PSBSLkRhdGEgJiYgTC5Qcml2YXRlID09IFIuUHJpdmF0ZTsKKyAgfQorCisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgQ09GRlNob3J0RXhwb3J0ICZMLCBjb25zdCBDT0ZGU2hvcnRFeHBvcnQgJlIpIHsKKyAgICByZXR1cm4gIShMID09IFIpOworICB9Cit9OworCitFcnJvciB3cml0ZUltcG9ydExpYnJhcnkoU3RyaW5nUmVmIEltcG9ydE5hbWUsIFN0cmluZ1JlZiBQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPENPRkZTaG9ydEV4cG9ydD4gRXhwb3J0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBDT0ZGOjpNYWNoaW5lVHlwZXMgTWFjaGluZSwgYm9vbCBNYWtlV2Vha0FsaWFzZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNaW5HVyk7CisKK30gLy8gbmFtZXNwYWNlIG9iamVjdAorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0NPRkZNb2R1bGVEZWZpbml0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9DT0ZGTW9kdWxlRGVmaW5pdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJlMTM5YTIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9DT0ZGTW9kdWxlRGVmaW5pdGlvbi5oCkBAIC0wLDAgKzEsNTMgQEAKKy8vPT09LS0tIENPRkZNb2R1bGVEZWZpbml0aW9uLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gV2luZG93cy1zcGVjaWZpYy4KKy8vIEEgcGFyc2VyIGZvciB0aGUgbW9kdWxlLWRlZmluaXRpb24gZmlsZSAoLmRlZiBmaWxlKS4KKy8vIFBhcnNlZCByZXN1bHRzIGFyZSBkaXJlY3RseSB3cml0dGVuIHRvIENvbmZpZyBnbG9iYWwgdmFyaWFibGUuCisvLworLy8gVGhlIGZvcm1hdCBvZiBtb2R1bGUtZGVmaW5pdGlvbiBmaWxlcyBhcmUgZGVzY3JpYmVkIGluIHRoaXMgZG9jdW1lbnQ6CisvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5LzI4ZDZzNzloLmFzcHgKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUX0NPRkZfTU9EVUxFX0RFRklOSVRJT05fSAorI2RlZmluZSBMTFZNX09CSkVDVF9DT0ZGX01PRFVMRV9ERUZJTklUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vT2JqZWN0L0NPRkYuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9DT0ZGSW1wb3J0RmlsZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb2JqZWN0IHsKKworc3RydWN0IENPRkZNb2R1bGVEZWZpbml0aW9uIHsKKyAgc3RkOjp2ZWN0b3I8Q09GRlNob3J0RXhwb3J0PiBFeHBvcnRzOworICBzdGQ6OnN0cmluZyBPdXRwdXRGaWxlOworICBzdGQ6OnN0cmluZyBJbXBvcnROYW1lOworICB1aW50NjRfdCBJbWFnZUJhc2UgPSAwOworICB1aW50NjRfdCBTdGFja1Jlc2VydmUgPSAwOworICB1aW50NjRfdCBTdGFja0NvbW1pdCA9IDA7CisgIHVpbnQ2NF90IEhlYXBSZXNlcnZlID0gMDsKKyAgdWludDY0X3QgSGVhcENvbW1pdCA9IDA7CisgIHVpbnQzMl90IE1ham9ySW1hZ2VWZXJzaW9uID0gMDsKKyAgdWludDMyX3QgTWlub3JJbWFnZVZlcnNpb24gPSAwOworICB1aW50MzJfdCBNYWpvck9TVmVyc2lvbiA9IDA7CisgIHVpbnQzMl90IE1pbm9yT1NWZXJzaW9uID0gMDsKK307CisKKy8vIG1pbmd3IGFuZCB3aW5lIGRlZiBmaWxlcyBkbyBub3QgbWFuZ2xlIF8gZm9yIHg4NiB3aGljaAorLy8gaXMgYSBjb25zZXF1ZW5jZSBvZiBsZWdhY3kgYmludXRpbHMnIGRsbHRvb2wgZnVuY3Rpb25hbGl0eS4KKy8vIFRoaXMgTWluZ3dEZWYgZmxhZyBzaG91bGQgYmUgcmVtb3ZlZCBvbmNlIG1pbmd3IHN0b3BzIHRoaXMgcHJhdGljZS4KK0V4cGVjdGVkPENPRkZNb2R1bGVEZWZpbml0aW9uPgorcGFyc2VDT0ZGTW9kdWxlRGVmaW5pdGlvbihNZW1vcnlCdWZmZXJSZWYgTUIsIENPRkY6Ok1hY2hpbmVUeXBlcyBNYWNoaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE1pbmd3RGVmID0gZmFsc2UpOworCit9IC8vIEVuZCBuYW1lc3BhY2Ugb2JqZWN0LgorfSAvLyBFbmQgbmFtZXNwYWNlIGxsdm0uCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvQ1ZEZWJ1Z1JlY29yZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvQ1ZEZWJ1Z1JlY29yZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhYWQ3MmMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9DVkRlYnVnUmVjb3JkLmgKQEAgLTAsMCArMSw1NSBAQAorLy89PT0tIENWRGVidWdSZWNvcmQuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVF9DVkRFQlVHUkVDT1JEX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RfQ1ZERUJVR1JFQ09SRF9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBPTUYgeworc3RydWN0IFNpZ25hdHVyZSB7CisgIGVudW0gSUQgOiB1aW50MzJfdCB7CisgICAgUERCNzAgPSAweDUzNDQ1MzUyLCAvLyBSU0RTCisgICAgUERCMjAgPSAweDMwMzE0MjRlLCAvLyBOQjEwCisgICAgQ1Y1MCA9IDB4MzEzMTQyNGUsICAvLyBOQjExCisgICAgQ1Y0MSA9IDB4MzkzMDQyNGUsICAvLyBOQjA5CisgIH07CisKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQ1ZTaWduYXR1cmU7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IE9mZnNldDsKK307Cit9CisKK25hbWVzcGFjZSBjb2RldmlldyB7CitzdHJ1Y3QgUERCNzBEZWJ1Z0luZm8geworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBDVlNpZ25hdHVyZTsKKyAgdWludDhfdCBTaWduYXR1cmVbMTZdOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBBZ2U7CisgIC8vIGNoYXIgUERCRmlsZU5hbWVbXTsKK307CisKK3N0cnVjdCBQREIyMERlYnVnSW5mbyB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IENWU2lnbmF0dXJlOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBPZmZzZXQ7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFNpZ25hdHVyZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQWdlOworICAvLyBjaGFyIFBEQkZpbGVOYW1lW107Cit9OworCit1bmlvbiBEZWJ1Z0luZm8geworICBzdHJ1Y3QgT01GOjpTaWduYXR1cmUgU2lnbmF0dXJlOworICBzdHJ1Y3QgUERCMjBEZWJ1Z0luZm8gUERCMjA7CisgIHN0cnVjdCBQREI3MERlYnVnSW5mbyBQREI3MDsKK307Cit9Cit9CisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9EZWNvbXByZXNzb3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0RlY29tcHJlc3Nvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZTg4OGQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9EZWNvbXByZXNzb3IuaApAQCAtMCwwICsxLDY3IEBACisvLz09PS0tIERlY29tcHJlc3Nvci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RfREVDT01QUkVTU09SX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RfREVDT01QUkVTU09SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvT2JqZWN0RmlsZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb2JqZWN0IHsKKworLy8vIEBicmllZiBEZWNvbXByZXNzb3IgaGVscHMgdG8gaGFuZGxlIGRlY29tcHJlc3Npb24gb2YgY29tcHJlc3NlZCBzZWN0aW9ucy4KK2NsYXNzIERlY29tcHJlc3NvciB7CitwdWJsaWM6CisgIC8vLyBAYnJpZWYgQ3JlYXRlIGRlY29tcHJlc3NvciBvYmplY3QuCisgIC8vLyBAcGFyYW0gTmFtZSAgICAgICAgU2VjdGlvbiBuYW1lLgorICAvLy8gQHBhcmFtIERhdGEgICAgICAgIFNlY3Rpb24gY29udGVudC4KKyAgLy8vIEBwYXJhbSBJc0xFICAgICAgICBGbGFnIGRldGVybWluZXMgaWYgRGF0YSBpcyBpbiBsaXR0bGUgZW5kaWFuIGZvcm0uCisgIC8vLyBAcGFyYW0gSXM2NEJpdCAgICAgRmxhZyBkZXRlcm1pbmVzIGlmIG9iamVjdCBpcyA2NCBiaXQuCisgIHN0YXRpYyBFeHBlY3RlZDxEZWNvbXByZXNzb3I+IGNyZWF0ZShTdHJpbmdSZWYgTmFtZSwgU3RyaW5nUmVmIERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIElzTEUsIGJvb2wgSXM2NEJpdCk7CisKKyAgLy8vIEBicmllZiBSZXNpemUgdGhlIGJ1ZmZlciBhbmQgdW5jb21wcmVzcyBzZWN0aW9uIGRhdGEgaW50byBpdC4KKyAgLy8vIEBwYXJhbSBPdXQgICAgICAgICBEZXN0aW5hdGlvbiBidWZmZXIuCisgIHRlbXBsYXRlIDxjbGFzcyBUPiBFcnJvciByZXNpemVBbmREZWNvbXByZXNzKFQgJk91dCkgeworICAgIE91dC5yZXNpemUoRGVjb21wcmVzc2VkU2l6ZSk7CisgICAgcmV0dXJuIGRlY29tcHJlc3Moe091dC5kYXRhKCksIChzaXplX3QpRGVjb21wcmVzc2VkU2l6ZX0pOworICB9CisKKyAgLy8vIEBicmllZiBVbmNvbXByZXNzIHNlY3Rpb24gZGF0YSB0byByYXcgYnVmZmVyIHByb3ZpZGVkLgorICAvLy8gQHBhcmFtIEJ1ZmZlciAgICAgIERlc3RpbmF0aW9uIGJ1ZmZlci4KKyAgRXJyb3IgZGVjb21wcmVzcyhNdXRhYmxlQXJyYXlSZWY8Y2hhcj4gQnVmZmVyKTsKKworICAvLy8gQGJyaWVmIFJldHVybiBtZW1vcnkgYnVmZmVyIHNpemUgcmVxdWlyZWQgZm9yIGRlY29tcHJlc3Npb24uCisgIHVpbnQ2NF90IGdldERlY29tcHJlc3NlZFNpemUoKSB7IHJldHVybiBEZWNvbXByZXNzZWRTaXplOyB9CisKKyAgLy8vIEBicmllZiBSZXR1cm4gdHJ1ZSBpZiBzZWN0aW9uIGlzIGNvbXByZXNzZWQsIGluY2x1ZGluZyBnbnUtc3R5bGVkIGNhc2UuCisgIHN0YXRpYyBib29sIGlzQ29tcHJlc3NlZChjb25zdCBvYmplY3Q6OlNlY3Rpb25SZWYgJlNlY3Rpb24pOworCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRydWUgaWYgc2VjdGlvbiBpcyBhIEVMRiBjb21wcmVzc2VkIG9uZS4KKyAgc3RhdGljIGJvb2wgaXNDb21wcmVzc2VkRUxGU2VjdGlvbih1aW50NjRfdCBGbGFncywgU3RyaW5nUmVmIE5hbWUpOworCisgIC8vLyBAYnJpZWYgUmV0dXJuIHRydWUgaWYgc2VjdGlvbiBuYW1lIG1hdGNoZXMgZ251IHN0eWxlIGNvbXByZXNzZWQgb25lLgorICBzdGF0aWMgYm9vbCBpc0dudVN0eWxlKFN0cmluZ1JlZiBOYW1lKTsKKworcHJpdmF0ZToKKyAgRGVjb21wcmVzc29yKFN0cmluZ1JlZiBEYXRhKTsKKworICBFcnJvciBjb25zdW1lQ29tcHJlc3NlZEdudUhlYWRlcigpOworICBFcnJvciBjb25zdW1lQ29tcHJlc3NlZFpMaWJIZWFkZXIoYm9vbCBJczY0Qml0LCBib29sIElzTGl0dGxlRW5kaWFuKTsKKworICBTdHJpbmdSZWYgU2VjdGlvbkRhdGE7CisgIHVpbnQ2NF90IERlY29tcHJlc3NlZFNpemU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugb2JqZWN0Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9PQkpFQ1RfREVDT01QUkVTU09SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0VMRi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvRUxGLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY1MDRlNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0VMRi5oCkBAIC0wLDAgKzEsNjExIEBACisvLz09PS0gRUxGLmggLSBFTEYgb2JqZWN0IGZpbGUgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgRUxGRmlsZSB0ZW1wbGF0ZSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUX0VMRl9ICisjZGVmaW5lIExMVk1fT0JKRUNUX0VMRl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRUxGLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvRUxGVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9iamVjdCB7CisKK1N0cmluZ1JlZiBnZXRFTEZSZWxvY2F0aW9uVHlwZU5hbWUodWludDMyX3QgTWFjaGluZSwgdWludDMyX3QgVHlwZSk7CitTdHJpbmdSZWYgZ2V0RUxGU2VjdGlvblR5cGVOYW1lKHVpbnQzMl90IE1hY2hpbmUsIHVpbnQzMl90IFR5cGUpOworCisvLyBTdWJjbGFzc2VzIG9mIEVMRkZpbGUgbWF5IG5lZWQgdGhpcyBmb3IgdGVtcGxhdGUgaW5zdGFudGlhdGlvbgoraW5saW5lIHN0ZDo6cGFpcjx1bnNpZ25lZCBjaGFyLCB1bnNpZ25lZCBjaGFyPgorZ2V0RWxmQXJjaFR5cGUoU3RyaW5nUmVmIE9iamVjdCkgeworICBpZiAoT2JqZWN0LnNpemUoKSA8IEVMRjo6RUlfTklERU5UKQorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigodWludDhfdClFTEY6OkVMRkNMQVNTTk9ORSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKHVpbnQ4X3QpRUxGOjpFTEZEQVRBTk9ORSk7CisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigodWludDhfdClPYmplY3RbRUxGOjpFSV9DTEFTU10sCisgICAgICAgICAgICAgICAgICAgICAgICAodWludDhfdClPYmplY3RbRUxGOjpFSV9EQVRBXSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgRXJyb3IgY3JlYXRlRXJyb3IoU3RyaW5nUmVmIEVycikgeworICByZXR1cm4gbWFrZV9lcnJvcjxTdHJpbmdFcnJvcj4oRXJyLCBvYmplY3RfZXJyb3I6OnBhcnNlX2ZhaWxlZCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorY2xhc3MgRUxGRmlsZSB7CitwdWJsaWM6CisgIExMVk1fRUxGX0lNUE9SVF9UWVBFU19FTEZUKEVMRlQpCisgIHVzaW5nIHVpbnRYX3QgPSB0eXBlbmFtZSBFTEZUOjp1aW50OworICB1c2luZyBFbGZfRWhkciA9IHR5cGVuYW1lIEVMRlQ6OkVoZHI7CisgIHVzaW5nIEVsZl9TaGRyID0gdHlwZW5hbWUgRUxGVDo6U2hkcjsKKyAgdXNpbmcgRWxmX1N5bSA9IHR5cGVuYW1lIEVMRlQ6OlN5bTsKKyAgdXNpbmcgRWxmX0R5biA9IHR5cGVuYW1lIEVMRlQ6OkR5bjsKKyAgdXNpbmcgRWxmX1BoZHIgPSB0eXBlbmFtZSBFTEZUOjpQaGRyOworICB1c2luZyBFbGZfUmVsID0gdHlwZW5hbWUgRUxGVDo6UmVsOworICB1c2luZyBFbGZfUmVsYSA9IHR5cGVuYW1lIEVMRlQ6OlJlbGE7CisgIHVzaW5nIEVsZl9WZXJkZWYgPSB0eXBlbmFtZSBFTEZUOjpWZXJkZWY7CisgIHVzaW5nIEVsZl9WZXJkYXV4ID0gdHlwZW5hbWUgRUxGVDo6VmVyZGF1eDsKKyAgdXNpbmcgRWxmX1Zlcm5lZWQgPSB0eXBlbmFtZSBFTEZUOjpWZXJuZWVkOworICB1c2luZyBFbGZfVmVybmF1eCA9IHR5cGVuYW1lIEVMRlQ6OlZlcm5hdXg7CisgIHVzaW5nIEVsZl9WZXJzeW0gPSB0eXBlbmFtZSBFTEZUOjpWZXJzeW07CisgIHVzaW5nIEVsZl9IYXNoID0gdHlwZW5hbWUgRUxGVDo6SGFzaDsKKyAgdXNpbmcgRWxmX0dudUhhc2ggPSB0eXBlbmFtZSBFTEZUOjpHbnVIYXNoOworICB1c2luZyBFbGZfTmhkciA9IHR5cGVuYW1lIEVMRlQ6Ok5oZHI7CisgIHVzaW5nIEVsZl9Ob3RlID0gdHlwZW5hbWUgRUxGVDo6Tm90ZTsKKyAgdXNpbmcgRWxmX05vdGVfSXRlcmF0b3IgPSB0eXBlbmFtZSBFTEZUOjpOb3RlSXRlcmF0b3I7CisgIHVzaW5nIEVsZl9EeW5fUmFuZ2UgPSB0eXBlbmFtZSBFTEZUOjpEeW5SYW5nZTsKKyAgdXNpbmcgRWxmX1NoZHJfUmFuZ2UgPSB0eXBlbmFtZSBFTEZUOjpTaGRyUmFuZ2U7CisgIHVzaW5nIEVsZl9TeW1fUmFuZ2UgPSB0eXBlbmFtZSBFTEZUOjpTeW1SYW5nZTsKKyAgdXNpbmcgRWxmX1JlbF9SYW5nZSA9IHR5cGVuYW1lIEVMRlQ6OlJlbFJhbmdlOworICB1c2luZyBFbGZfUmVsYV9SYW5nZSA9IHR5cGVuYW1lIEVMRlQ6OlJlbGFSYW5nZTsKKyAgdXNpbmcgRWxmX1BoZHJfUmFuZ2UgPSB0eXBlbmFtZSBFTEZUOjpQaGRyUmFuZ2U7CisKKyAgY29uc3QgdWludDhfdCAqYmFzZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KEJ1Zi5kYXRhKCkpOworICB9CisKKyAgc2l6ZV90IGdldEJ1ZlNpemUoKSBjb25zdCB7IHJldHVybiBCdWYuc2l6ZSgpOyB9CisKK3ByaXZhdGU6CisgIFN0cmluZ1JlZiBCdWY7CisKKyAgRUxGRmlsZShTdHJpbmdSZWYgT2JqZWN0KTsKKworcHVibGljOgorICBjb25zdCBFbGZfRWhkciAqZ2V0SGVhZGVyKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEVsZl9FaGRyICo+KGJhc2UoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgRXhwZWN0ZWQ8Y29uc3QgVCAqPiBnZXRFbnRyeSh1aW50MzJfdCBTZWN0aW9uLCB1aW50MzJfdCBFbnRyeSkgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBFeHBlY3RlZDxjb25zdCBUICo+IGdldEVudHJ5KGNvbnN0IEVsZl9TaGRyICpTZWN0aW9uLCB1aW50MzJfdCBFbnRyeSkgY29uc3Q7CisKKyAgRXhwZWN0ZWQ8U3RyaW5nUmVmPiBnZXRTdHJpbmdUYWJsZShjb25zdCBFbGZfU2hkciAqU2VjdGlvbikgY29uc3Q7CisgIEV4cGVjdGVkPFN0cmluZ1JlZj4gZ2V0U3RyaW5nVGFibGVGb3JTeW10YWIoY29uc3QgRWxmX1NoZHIgJlNlY3Rpb24pIGNvbnN0OworICBFeHBlY3RlZDxTdHJpbmdSZWY+IGdldFN0cmluZ1RhYmxlRm9yU3ltdGFiKGNvbnN0IEVsZl9TaGRyICZTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZl9TaGRyX1JhbmdlIFNlY3Rpb25zKSBjb25zdDsKKworICBFeHBlY3RlZDxBcnJheVJlZjxFbGZfV29yZD4+IGdldFNITkRYVGFibGUoY29uc3QgRWxmX1NoZHIgJlNlY3Rpb24pIGNvbnN0OworICBFeHBlY3RlZDxBcnJheVJlZjxFbGZfV29yZD4+IGdldFNITkRYVGFibGUoY29uc3QgRWxmX1NoZHIgJlNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbGZfU2hkcl9SYW5nZSBTZWN0aW9ucykgY29uc3Q7CisKKyAgU3RyaW5nUmVmIGdldFJlbG9jYXRpb25UeXBlTmFtZSh1aW50MzJfdCBUeXBlKSBjb25zdDsKKyAgdm9pZCBnZXRSZWxvY2F0aW9uVHlwZU5hbWUodWludDMyX3QgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZSZXN1bHQpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBzeW1ib2wgZm9yIGEgZ2l2ZW4gcmVsb2NhdGlvbi4KKyAgRXhwZWN0ZWQ8Y29uc3QgRWxmX1N5bSAqPiBnZXRSZWxvY2F0aW9uU3ltYm9sKGNvbnN0IEVsZl9SZWwgKlJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVsZl9TaGRyICpTeW1UYWIpIGNvbnN0OworCisgIHN0YXRpYyBFeHBlY3RlZDxFTEZGaWxlPiBjcmVhdGUoU3RyaW5nUmVmIE9iamVjdCk7CisKKyAgYm9vbCBpc01pcHNFTEY2NCgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SGVhZGVyKCktPmVfbWFjaGluZSA9PSBFTEY6OkVNX01JUFMgJiYKKyAgICAgICAgICAgZ2V0SGVhZGVyKCktPmdldEZpbGVDbGFzcygpID09IEVMRjo6RUxGQ0xBU1M2NDsKKyAgfQorCisgIGJvb2wgaXNNaXBzNjRFTCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNNaXBzRUxGNjQoKSAmJgorICAgICAgICAgICBnZXRIZWFkZXIoKS0+Z2V0RGF0YUVuY29kaW5nKCkgPT0gRUxGOjpFTEZEQVRBMkxTQjsKKyAgfQorCisgIEV4cGVjdGVkPEVsZl9TaGRyX1JhbmdlPiBzZWN0aW9ucygpIGNvbnN0OworCisgIEV4cGVjdGVkPEVsZl9TeW1fUmFuZ2U+IHN5bWJvbHMoY29uc3QgRWxmX1NoZHIgKlNlYykgY29uc3QgeworICAgIGlmICghU2VjKQorICAgICAgcmV0dXJuIG1ha2VBcnJheVJlZjxFbGZfU3ltPihudWxscHRyLCBudWxscHRyKTsKKyAgICByZXR1cm4gZ2V0U2VjdGlvbkNvbnRlbnRzQXNBcnJheTxFbGZfU3ltPihTZWMpOworICB9CisKKyAgRXhwZWN0ZWQ8RWxmX1JlbGFfUmFuZ2U+IHJlbGFzKGNvbnN0IEVsZl9TaGRyICpTZWMpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0U2VjdGlvbkNvbnRlbnRzQXNBcnJheTxFbGZfUmVsYT4oU2VjKTsKKyAgfQorCisgIEV4cGVjdGVkPEVsZl9SZWxfUmFuZ2U+IHJlbHMoY29uc3QgRWxmX1NoZHIgKlNlYykgY29uc3QgeworICAgIHJldHVybiBnZXRTZWN0aW9uQ29udGVudHNBc0FycmF5PEVsZl9SZWw+KFNlYyk7CisgIH0KKworICBFeHBlY3RlZDxzdGQ6OnZlY3RvcjxFbGZfUmVsYT4+IGFuZHJvaWRfcmVsYXMoY29uc3QgRWxmX1NoZHIgKlNlYykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBJdGVyYXRlIG92ZXIgcHJvZ3JhbSBoZWFkZXIgdGFibGUuCisgIEV4cGVjdGVkPEVsZl9QaGRyX1JhbmdlPiBwcm9ncmFtX2hlYWRlcnMoKSBjb25zdCB7CisgICAgaWYgKGdldEhlYWRlcigpLT5lX3BobnVtICYmIGdldEhlYWRlcigpLT5lX3BoZW50c2l6ZSAhPSBzaXplb2YoRWxmX1BoZHIpKQorICAgICAgcmV0dXJuIGNyZWF0ZUVycm9yKCJpbnZhbGlkIGVfcGhlbnRzaXplIik7CisgICAgaWYgKGdldEhlYWRlcigpLT5lX3Bob2ZmICsKKyAgICAgICAgICAgIChnZXRIZWFkZXIoKS0+ZV9waG51bSAqIGdldEhlYWRlcigpLT5lX3BoZW50c2l6ZSkgPgorICAgICAgICBnZXRCdWZTaXplKCkpCisgICAgICByZXR1cm4gY3JlYXRlRXJyb3IoInByb2dyYW0gaGVhZGVycyBsb25nZXIgdGhhbiBiaW5hcnkiKTsKKyAgICBhdXRvICpCZWdpbiA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRWxmX1BoZHIgKj4oYmFzZSgpICsgZ2V0SGVhZGVyKCktPmVfcGhvZmYpOworICAgIHJldHVybiBtYWtlQXJyYXlSZWYoQmVnaW4sIEJlZ2luICsgZ2V0SGVhZGVyKCktPmVfcGhudW0pOworICB9CisKKyAgLy8vIEdldCBhbiBpdGVyYXRvciBvdmVyIG5vdGVzIGluIGEgcHJvZ3JhbSBoZWFkZXIuCisgIC8vLworICAvLy8gVGhlIHByb2dyYW0gaGVhZGVyIG11c3QgYmUgb2YgdHlwZSBcYyBQVF9OT1RFLgorICAvLy8KKyAgLy8vIFxwYXJhbSBQaGRyIHRoZSBwcm9ncmFtIGhlYWRlciB0byBpdGVyYXRlIG92ZXIuCisgIC8vLyBccGFyYW0gRXJyIFtvdXRdIGFuIGVycm9yIHRvIHN1cHBvcnQgZmFsbGlibGUgaXRlcmF0aW9uLCB3aGljaCBzaG91bGQKKyAgLy8vICBiZSBjaGVja2VkIGFmdGVyIGl0ZXJhdGlvbiBlbmRzLgorICBFbGZfTm90ZV9JdGVyYXRvciBub3Rlc19iZWdpbihjb25zdCBFbGZfUGhkciAmUGhkciwgRXJyb3IgJkVycikgY29uc3QgeworICAgIGlmIChQaGRyLnBfdHlwZSAhPSBFTEY6OlBUX05PVEUpIHsKKyAgICAgIEVyciA9IGNyZWF0ZUVycm9yKCJhdHRlbXB0IHRvIGl0ZXJhdGUgbm90ZXMgb2Ygbm9uLW5vdGUgcHJvZ3JhbSBoZWFkZXIiKTsKKyAgICAgIHJldHVybiBFbGZfTm90ZV9JdGVyYXRvcihFcnIpOworICAgIH0KKyAgICBpZiAoUGhkci5wX29mZnNldCArIFBoZHIucF9maWxlc3ogPiBnZXRCdWZTaXplKCkpIHsKKyAgICAgIEVyciA9IGNyZWF0ZUVycm9yKCJpbnZhbGlkIHByb2dyYW0gaGVhZGVyIG9mZnNldC9zaXplIik7CisgICAgICByZXR1cm4gRWxmX05vdGVfSXRlcmF0b3IoRXJyKTsKKyAgICB9CisgICAgcmV0dXJuIEVsZl9Ob3RlX0l0ZXJhdG9yKGJhc2UoKSArIFBoZHIucF9vZmZzZXQsIFBoZHIucF9maWxlc3osIEVycik7CisgIH0KKworICAvLy8gR2V0IGFuIGl0ZXJhdG9yIG92ZXIgbm90ZXMgaW4gYSBzZWN0aW9uLgorICAvLy8KKyAgLy8vIFRoZSBzZWN0aW9uIG11c3QgYmUgb2YgdHlwZSBcYyBTSFRfTk9URS4KKyAgLy8vCisgIC8vLyBccGFyYW0gU2hkciB0aGUgc2VjdGlvbiB0byBpdGVyYXRlIG92ZXIuCisgIC8vLyBccGFyYW0gRXJyIFtvdXRdIGFuIGVycm9yIHRvIHN1cHBvcnQgZmFsbGlibGUgaXRlcmF0aW9uLCB3aGljaCBzaG91bGQKKyAgLy8vICBiZSBjaGVja2VkIGFmdGVyIGl0ZXJhdGlvbiBlbmRzLgorICBFbGZfTm90ZV9JdGVyYXRvciBub3Rlc19iZWdpbihjb25zdCBFbGZfU2hkciAmU2hkciwgRXJyb3IgJkVycikgY29uc3QgeworICAgIGlmIChTaGRyLnNoX3R5cGUgIT0gRUxGOjpTSFRfTk9URSkgeworICAgICAgRXJyID0gY3JlYXRlRXJyb3IoImF0dGVtcHQgdG8gaXRlcmF0ZSBub3RlcyBvZiBub24tbm90ZSBzZWN0aW9uIik7CisgICAgICByZXR1cm4gRWxmX05vdGVfSXRlcmF0b3IoRXJyKTsKKyAgICB9CisgICAgaWYgKFNoZHIuc2hfb2Zmc2V0ICsgU2hkci5zaF9zaXplID4gZ2V0QnVmU2l6ZSgpKSB7CisgICAgICBFcnIgPSBjcmVhdGVFcnJvcigiaW52YWxpZCBzZWN0aW9uIG9mZnNldC9zaXplIik7CisgICAgICByZXR1cm4gRWxmX05vdGVfSXRlcmF0b3IoRXJyKTsKKyAgICB9CisgICAgcmV0dXJuIEVsZl9Ob3RlX0l0ZXJhdG9yKGJhc2UoKSArIFNoZHIuc2hfb2Zmc2V0LCBTaGRyLnNoX3NpemUsIEVycik7CisgIH0KKworICAvLy8gR2V0IHRoZSBlbmQgaXRlcmF0b3IgZm9yIG5vdGVzLgorICBFbGZfTm90ZV9JdGVyYXRvciBub3Rlc19lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIEVsZl9Ob3RlX0l0ZXJhdG9yKCk7CisgIH0KKworICAvLy8gR2V0IGFuIGl0ZXJhdG9yIHJhbmdlIG92ZXIgbm90ZXMgb2YgYSBwcm9ncmFtIGhlYWRlci4KKyAgLy8vCisgIC8vLyBUaGUgcHJvZ3JhbSBoZWFkZXIgbXVzdCBiZSBvZiB0eXBlIFxjIFBUX05PVEUuCisgIC8vLworICAvLy8gXHBhcmFtIFBoZHIgdGhlIHByb2dyYW0gaGVhZGVyIHRvIGl0ZXJhdGUgb3Zlci4KKyAgLy8vIFxwYXJhbSBFcnIgW291dF0gYW4gZXJyb3IgdG8gc3VwcG9ydCBmYWxsaWJsZSBpdGVyYXRpb24sIHdoaWNoIHNob3VsZAorICAvLy8gIGJlIGNoZWNrZWQgYWZ0ZXIgaXRlcmF0aW9uIGVuZHMuCisgIGl0ZXJhdG9yX3JhbmdlPEVsZl9Ob3RlX0l0ZXJhdG9yPiBub3Rlcyhjb25zdCBFbGZfUGhkciAmUGhkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yICZFcnIpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShub3Rlc19iZWdpbihQaGRyLCBFcnIpLCBub3Rlc19lbmQoKSk7CisgIH0KKworICAvLy8gR2V0IGFuIGl0ZXJhdG9yIHJhbmdlIG92ZXIgbm90ZXMgb2YgYSBzZWN0aW9uLgorICAvLy8KKyAgLy8vIFRoZSBzZWN0aW9uIG11c3QgYmUgb2YgdHlwZSBcYyBTSFRfTk9URS4KKyAgLy8vCisgIC8vLyBccGFyYW0gU2hkciB0aGUgc2VjdGlvbiB0byBpdGVyYXRlIG92ZXIuCisgIC8vLyBccGFyYW0gRXJyIFtvdXRdIGFuIGVycm9yIHRvIHN1cHBvcnQgZmFsbGlibGUgaXRlcmF0aW9uLCB3aGljaCBzaG91bGQKKyAgLy8vICBiZSBjaGVja2VkIGFmdGVyIGl0ZXJhdGlvbiBlbmRzLgorICBpdGVyYXRvcl9yYW5nZTxFbGZfTm90ZV9JdGVyYXRvcj4gbm90ZXMoY29uc3QgRWxmX1NoZHIgJlNoZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFcnJvciAmRXJyKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2Uobm90ZXNfYmVnaW4oU2hkciwgRXJyKSwgbm90ZXNfZW5kKCkpOworICB9CisKKyAgRXhwZWN0ZWQ8U3RyaW5nUmVmPiBnZXRTZWN0aW9uU3RyaW5nVGFibGUoRWxmX1NoZHJfUmFuZ2UgU2VjdGlvbnMpIGNvbnN0OworICBFeHBlY3RlZDx1aW50MzJfdD4gZ2V0U2VjdGlvbkluZGV4KGNvbnN0IEVsZl9TeW0gKlN5bSwgRWxmX1N5bV9SYW5nZSBTeW1zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEVsZl9Xb3JkPiBTaG5keFRhYmxlKSBjb25zdDsKKyAgRXhwZWN0ZWQ8Y29uc3QgRWxmX1NoZHIgKj4gZ2V0U2VjdGlvbihjb25zdCBFbGZfU3ltICpTeW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRWxmX1NoZHIgKlN5bVRhYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFbGZfV29yZD4gU2huZHhUYWJsZSkgY29uc3Q7CisgIEV4cGVjdGVkPGNvbnN0IEVsZl9TaGRyICo+IGdldFNlY3Rpb24oY29uc3QgRWxmX1N5bSAqU3ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZl9TeW1fUmFuZ2UgU3ltdGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEVsZl9Xb3JkPiBTaG5keFRhYmxlKSBjb25zdDsKKyAgRXhwZWN0ZWQ8Y29uc3QgRWxmX1NoZHIgKj4gZ2V0U2VjdGlvbih1aW50MzJfdCBJbmRleCkgY29uc3Q7CisKKyAgRXhwZWN0ZWQ8Y29uc3QgRWxmX1N5bSAqPiBnZXRTeW1ib2woY29uc3QgRWxmX1NoZHIgKlNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSW5kZXgpIGNvbnN0OworCisgIEV4cGVjdGVkPFN0cmluZ1JlZj4gZ2V0U2VjdGlvbk5hbWUoY29uc3QgRWxmX1NoZHIgKlNlY3Rpb24pIGNvbnN0OworICBFeHBlY3RlZDxTdHJpbmdSZWY+IGdldFNlY3Rpb25OYW1lKGNvbnN0IEVsZl9TaGRyICpTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEb3RTaHN0cnRhYikgY29uc3Q7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBFeHBlY3RlZDxBcnJheVJlZjxUPj4gZ2V0U2VjdGlvbkNvbnRlbnRzQXNBcnJheShjb25zdCBFbGZfU2hkciAqU2VjKSBjb25zdDsKKyAgRXhwZWN0ZWQ8QXJyYXlSZWY8dWludDhfdD4+IGdldFNlY3Rpb25Db250ZW50cyhjb25zdCBFbGZfU2hkciAqU2VjKSBjb25zdDsKK307CisKK3VzaW5nIEVMRjMyTEVGaWxlID0gRUxGRmlsZTxFTEYzMkxFPjsKK3VzaW5nIEVMRjY0TEVGaWxlID0gRUxGRmlsZTxFTEY2NExFPjsKK3VzaW5nIEVMRjMyQkVGaWxlID0gRUxGRmlsZTxFTEYzMkJFPjsKK3VzaW5nIEVMRjY0QkVGaWxlID0gRUxGRmlsZTxFTEY2NEJFPjsKKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitpbmxpbmUgRXhwZWN0ZWQ8Y29uc3QgdHlwZW5hbWUgRUxGVDo6U2hkciAqPgorZ2V0U2VjdGlvbih0eXBlbmFtZSBFTEZUOjpTaGRyUmFuZ2UgU2VjdGlvbnMsIHVpbnQzMl90IEluZGV4KSB7CisgIGlmIChJbmRleCA+PSBTZWN0aW9ucy5zaXplKCkpCisgICAgcmV0dXJuIGNyZWF0ZUVycm9yKCJpbnZhbGlkIHNlY3Rpb24gaW5kZXgiKTsKKyAgcmV0dXJuICZTZWN0aW9uc1tJbmRleF07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgoraW5saW5lIEV4cGVjdGVkPHVpbnQzMl90PgorZ2V0RXh0ZW5kZWRTeW1ib2xUYWJsZUluZGV4KGNvbnN0IHR5cGVuYW1lIEVMRlQ6OlN5bSAqU3ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIEVMRlQ6OlN5bSAqRmlyc3RTeW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dHlwZW5hbWUgRUxGVDo6V29yZD4gU2huZHhUYWJsZSkgeworICBhc3NlcnQoU3ltLT5zdF9zaG5keCA9PSBFTEY6OlNITl9YSU5ERVgpOworICB1bnNpZ25lZCBJbmRleCA9IFN5bSAtIEZpcnN0U3ltOworICBpZiAoSW5kZXggPj0gU2huZHhUYWJsZS5zaXplKCkpCisgICAgcmV0dXJuIGNyZWF0ZUVycm9yKCJpbmRleCBwYXN0IHRoZSBlbmQgb2YgdGhlIHN5bWJvbCB0YWJsZSIpOworCisgIC8vIFRoZSBzaXplIG9mIHRoZSB0YWJsZSB3YXMgY2hlY2tlZCBpbiBnZXRTSE5EWFRhYmxlLgorICByZXR1cm4gU2huZHhUYWJsZVtJbmRleF07Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorRXhwZWN0ZWQ8dWludDMyX3Q+CitFTEZGaWxlPEVMRlQ+OjpnZXRTZWN0aW9uSW5kZXgoY29uc3QgRWxmX1N5bSAqU3ltLCBFbGZfU3ltX1JhbmdlIFN5bXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8RWxmX1dvcmQ+IFNobmR4VGFibGUpIGNvbnN0IHsKKyAgdWludDMyX3QgSW5kZXggPSBTeW0tPnN0X3NobmR4OworICBpZiAoSW5kZXggPT0gRUxGOjpTSE5fWElOREVYKSB7CisgICAgYXV0byBFcnJvck9ySW5kZXggPSBnZXRFeHRlbmRlZFN5bWJvbFRhYmxlSW5kZXg8RUxGVD4oCisgICAgICAgIFN5bSwgU3ltcy5iZWdpbigpLCBTaG5keFRhYmxlKTsKKyAgICBpZiAoIUVycm9yT3JJbmRleCkKKyAgICAgIHJldHVybiBFcnJvck9ySW5kZXgudGFrZUVycm9yKCk7CisgICAgcmV0dXJuICpFcnJvck9ySW5kZXg7CisgIH0KKyAgaWYgKEluZGV4ID09IEVMRjo6U0hOX1VOREVGIHx8IEluZGV4ID49IEVMRjo6U0hOX0xPUkVTRVJWRSkKKyAgICByZXR1cm4gMDsKKyAgcmV0dXJuIEluZGV4OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK0V4cGVjdGVkPGNvbnN0IHR5cGVuYW1lIEVMRlQ6OlNoZHIgKj4KK0VMRkZpbGU8RUxGVD46OmdldFNlY3Rpb24oY29uc3QgRWxmX1N5bSAqU3ltLCBjb25zdCBFbGZfU2hkciAqU3ltVGFiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFbGZfV29yZD4gU2huZHhUYWJsZSkgY29uc3QgeworICBhdXRvIFN5bXNPckVyciA9IHN5bWJvbHMoU3ltVGFiKTsKKyAgaWYgKCFTeW1zT3JFcnIpCisgICAgcmV0dXJuIFN5bXNPckVyci50YWtlRXJyb3IoKTsKKyAgcmV0dXJuIGdldFNlY3Rpb24oU3ltLCAqU3ltc09yRXJyLCBTaG5keFRhYmxlKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitFeHBlY3RlZDxjb25zdCB0eXBlbmFtZSBFTEZUOjpTaGRyICo+CitFTEZGaWxlPEVMRlQ+OjpnZXRTZWN0aW9uKGNvbnN0IEVsZl9TeW0gKlN5bSwgRWxmX1N5bV9SYW5nZSBTeW1ib2xzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxFbGZfV29yZD4gU2huZHhUYWJsZSkgY29uc3QgeworICBhdXRvIEluZGV4T3JFcnIgPSBnZXRTZWN0aW9uSW5kZXgoU3ltLCBTeW1ib2xzLCBTaG5keFRhYmxlKTsKKyAgaWYgKCFJbmRleE9yRXJyKQorICAgIHJldHVybiBJbmRleE9yRXJyLnRha2VFcnJvcigpOworICB1aW50MzJfdCBJbmRleCA9ICpJbmRleE9yRXJyOworICBpZiAoSW5kZXggPT0gMCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIGdldFNlY3Rpb24oSW5kZXgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK2lubGluZSBFeHBlY3RlZDxjb25zdCB0eXBlbmFtZSBFTEZUOjpTeW0gKj4KK2dldFN5bWJvbCh0eXBlbmFtZSBFTEZUOjpTeW1SYW5nZSBTeW1ib2xzLCB1aW50MzJfdCBJbmRleCkgeworICBpZiAoSW5kZXggPj0gU3ltYm9scy5zaXplKCkpCisgICAgcmV0dXJuIGNyZWF0ZUVycm9yKCJpbnZhbGlkIHN5bWJvbCBpbmRleCIpOworICByZXR1cm4gJlN5bWJvbHNbSW5kZXhdOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK0V4cGVjdGVkPGNvbnN0IHR5cGVuYW1lIEVMRlQ6OlN5bSAqPgorRUxGRmlsZTxFTEZUPjo6Z2V0U3ltYm9sKGNvbnN0IEVsZl9TaGRyICpTZWMsIHVpbnQzMl90IEluZGV4KSBjb25zdCB7CisgIGF1dG8gU3ltdGFiT3JFcnIgPSBzeW1ib2xzKFNlYyk7CisgIGlmICghU3ltdGFiT3JFcnIpCisgICAgcmV0dXJuIFN5bXRhYk9yRXJyLnRha2VFcnJvcigpOworICByZXR1cm4gb2JqZWN0OjpnZXRTeW1ib2w8RUxGVD4oKlN5bXRhYk9yRXJyLCBJbmRleCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitFeHBlY3RlZDxBcnJheVJlZjxUPj4KK0VMRkZpbGU8RUxGVD46OmdldFNlY3Rpb25Db250ZW50c0FzQXJyYXkoY29uc3QgRWxmX1NoZHIgKlNlYykgY29uc3QgeworICBpZiAoU2VjLT5zaF9lbnRzaXplICE9IHNpemVvZihUKSAmJiBzaXplb2YoVCkgIT0gMSkKKyAgICByZXR1cm4gY3JlYXRlRXJyb3IoImludmFsaWQgc2hfZW50c2l6ZSIpOworCisgIHVpbnRYX3QgT2Zmc2V0ID0gU2VjLT5zaF9vZmZzZXQ7CisgIHVpbnRYX3QgU2l6ZSA9IFNlYy0+c2hfc2l6ZTsKKworICBpZiAoU2l6ZSAlIHNpemVvZihUKSkKKyAgICByZXR1cm4gY3JlYXRlRXJyb3IoInNpemUgaXMgbm90IGEgbXVsdGlwbGUgb2Ygc2hfZW50c2l6ZSIpOworICBpZiAoKHN0ZDo6bnVtZXJpY19saW1pdHM8dWludFhfdD46Om1heCgpIC0gT2Zmc2V0IDwgU2l6ZSkgfHwKKyAgICAgIE9mZnNldCArIFNpemUgPiBCdWYuc2l6ZSgpKQorICAgIHJldHVybiBjcmVhdGVFcnJvcigiaW52YWxpZCBzZWN0aW9uIG9mZnNldCIpOworCisgIGlmIChPZmZzZXQgJSBhbGlnbm9mKFQpKQorICAgIHJldHVybiBjcmVhdGVFcnJvcigidW5hbGlnbmVkIGRhdGEiKTsKKworICBjb25zdCBUICpTdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCAqPihiYXNlKCkgKyBPZmZzZXQpOworICByZXR1cm4gbWFrZUFycmF5UmVmKFN0YXJ0LCBTaXplIC8gc2l6ZW9mKFQpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitFeHBlY3RlZDxBcnJheVJlZjx1aW50OF90Pj4KK0VMRkZpbGU8RUxGVD46OmdldFNlY3Rpb25Db250ZW50cyhjb25zdCBFbGZfU2hkciAqU2VjKSBjb25zdCB7CisgIHJldHVybiBnZXRTZWN0aW9uQ29udGVudHNBc0FycmF5PHVpbnQ4X3Q+KFNlYyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorU3RyaW5nUmVmIEVMRkZpbGU8RUxGVD46OmdldFJlbG9jYXRpb25UeXBlTmFtZSh1aW50MzJfdCBUeXBlKSBjb25zdCB7CisgIHJldHVybiBnZXRFTEZSZWxvY2F0aW9uVHlwZU5hbWUoZ2V0SGVhZGVyKCktPmVfbWFjaGluZSwgVHlwZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgordm9pZCBFTEZGaWxlPEVMRlQ+OjpnZXRSZWxvY2F0aW9uVHlwZU5hbWUodWludDMyX3QgVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzdWx0KSBjb25zdCB7CisgIGlmICghaXNNaXBzRUxGNjQoKSkgeworICAgIFN0cmluZ1JlZiBOYW1lID0gZ2V0UmVsb2NhdGlvblR5cGVOYW1lKFR5cGUpOworICAgIFJlc3VsdC5hcHBlbmQoTmFtZS5iZWdpbigpLCBOYW1lLmVuZCgpKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBUaGUgTWlwcyBONjQgQUJJIGFsbG93cyB1cCB0byB0aHJlZSBvcGVyYXRpb25zIHRvIGJlIHNwZWNpZmllZCBwZXIKKyAgICAvLyByZWxvY2F0aW9uIHJlY29yZC4gVW5mb3J0dW5hdGVseSB0aGVyZSdzIG5vIGVhc3kgd2F5IHRvIHRlc3QgZm9yIHRoZQorICAgIC8vIHByZXNlbmNlIG9mIE42NCBFTEZzIGFzIHRoZXkgaGF2ZSBubyBzcGVjaWFsIGZsYWcgdGhhdCBpZGVudGlmaWVzIHRoZW0KKyAgICAvLyBhcyBiZWluZyBONjQuIFdlIGNhbiBzYWZlbHkgYXNzdW1lIGF0IHRoZSBtb21lbnQgdGhhdCBhbGwgTWlwcworICAgIC8vIEVMRkNMQVNTNjQgRUxGcyBhcmUgTjY0LiBOZXcgTWlwczY0IEFCSXMgc2hvdWxkIHByb3ZpZGUgZW5vdWdoCisgICAgLy8gaW5mb3JtYXRpb24gdG8gZGlzYW1iaWd1YXRlIGJldHdlZW4gb2xkIHZzIG5ldyBBQklzLgorICAgIHVpbnQ4X3QgVHlwZTEgPSAoVHlwZSA+PiAwKSAmIDB4RkY7CisgICAgdWludDhfdCBUeXBlMiA9IChUeXBlID4+IDgpICYgMHhGRjsKKyAgICB1aW50OF90IFR5cGUzID0gKFR5cGUgPj4gMTYpICYgMHhGRjsKKworICAgIC8vIENvbmNhdCBhbGwgdGhyZWUgcmVsb2NhdGlvbiB0eXBlIG5hbWVzLgorICAgIFN0cmluZ1JlZiBOYW1lID0gZ2V0UmVsb2NhdGlvblR5cGVOYW1lKFR5cGUxKTsKKyAgICBSZXN1bHQuYXBwZW5kKE5hbWUuYmVnaW4oKSwgTmFtZS5lbmQoKSk7CisKKyAgICBOYW1lID0gZ2V0UmVsb2NhdGlvblR5cGVOYW1lKFR5cGUyKTsKKyAgICBSZXN1bHQuYXBwZW5kKDEsICcvJyk7CisgICAgUmVzdWx0LmFwcGVuZChOYW1lLmJlZ2luKCksIE5hbWUuZW5kKCkpOworCisgICAgTmFtZSA9IGdldFJlbG9jYXRpb25UeXBlTmFtZShUeXBlMyk7CisgICAgUmVzdWx0LmFwcGVuZCgxLCAnLycpOworICAgIFJlc3VsdC5hcHBlbmQoTmFtZS5iZWdpbigpLCBOYW1lLmVuZCgpKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK0V4cGVjdGVkPGNvbnN0IHR5cGVuYW1lIEVMRlQ6OlN5bSAqPgorRUxGRmlsZTxFTEZUPjo6Z2V0UmVsb2NhdGlvblN5bWJvbChjb25zdCBFbGZfUmVsICpSZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVsZl9TaGRyICpTeW1UYWIpIGNvbnN0IHsKKyAgdWludDMyX3QgSW5kZXggPSBSZWwtPmdldFN5bWJvbChpc01pcHM2NEVMKCkpOworICBpZiAoSW5kZXggPT0gMCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIGdldEVudHJ5PEVsZl9TeW0+KFN5bVRhYiwgSW5kZXgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK0V4cGVjdGVkPFN0cmluZ1JlZj4KK0VMRkZpbGU8RUxGVD46OmdldFNlY3Rpb25TdHJpbmdUYWJsZShFbGZfU2hkcl9SYW5nZSBTZWN0aW9ucykgY29uc3QgeworICB1aW50MzJfdCBJbmRleCA9IGdldEhlYWRlcigpLT5lX3Noc3RybmR4OworICBpZiAoSW5kZXggPT0gRUxGOjpTSE5fWElOREVYKQorICAgIEluZGV4ID0gU2VjdGlvbnNbMF0uc2hfbGluazsKKworICBpZiAoIUluZGV4KSAvLyBubyBzZWN0aW9uIHN0cmluZyB0YWJsZS4KKyAgICByZXR1cm4gIiI7CisgIGlmIChJbmRleCA+PSBTZWN0aW9ucy5zaXplKCkpCisgICAgcmV0dXJuIGNyZWF0ZUVycm9yKCJpbnZhbGlkIHNlY3Rpb24gaW5kZXgiKTsKKyAgcmV0dXJuIGdldFN0cmluZ1RhYmxlKCZTZWN0aW9uc1tJbmRleF0pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4gRUxGRmlsZTxFTEZUPjo6RUxGRmlsZShTdHJpbmdSZWYgT2JqZWN0KSA6IEJ1ZihPYmplY3QpIHt9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorRXhwZWN0ZWQ8RUxGRmlsZTxFTEZUPj4gRUxGRmlsZTxFTEZUPjo6Y3JlYXRlKFN0cmluZ1JlZiBPYmplY3QpIHsKKyAgaWYgKHNpemVvZihFbGZfRWhkcikgPiBPYmplY3Quc2l6ZSgpKQorICAgIHJldHVybiBjcmVhdGVFcnJvcigiSW52YWxpZCBidWZmZXIiKTsKKyAgcmV0dXJuIEVMRkZpbGUoT2JqZWN0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitFeHBlY3RlZDx0eXBlbmFtZSBFTEZUOjpTaGRyUmFuZ2U+IEVMRkZpbGU8RUxGVD46OnNlY3Rpb25zKCkgY29uc3QgeworICBjb25zdCB1aW50WF90IFNlY3Rpb25UYWJsZU9mZnNldCA9IGdldEhlYWRlcigpLT5lX3Nob2ZmOworICBpZiAoU2VjdGlvblRhYmxlT2Zmc2V0ID09IDApCisgICAgcmV0dXJuIEFycmF5UmVmPEVsZl9TaGRyPigpOworCisgIGlmIChnZXRIZWFkZXIoKS0+ZV9zaGVudHNpemUgIT0gc2l6ZW9mKEVsZl9TaGRyKSkKKyAgICByZXR1cm4gY3JlYXRlRXJyb3IoCisgICAgICAgICJpbnZhbGlkIHNlY3Rpb24gaGVhZGVyIGVudHJ5IHNpemUgKGVfc2hlbnRzaXplKSBpbiBFTEYgaGVhZGVyIik7CisKKyAgY29uc3QgdWludDY0X3QgRmlsZVNpemUgPSBCdWYuc2l6ZSgpOworCisgIGlmIChTZWN0aW9uVGFibGVPZmZzZXQgKyBzaXplb2YoRWxmX1NoZHIpID4gRmlsZVNpemUpCisgICAgcmV0dXJuIGNyZWF0ZUVycm9yKCJzZWN0aW9uIGhlYWRlciB0YWJsZSBnb2VzIHBhc3QgdGhlIGVuZCBvZiB0aGUgZmlsZSIpOworCisgIC8vIEludmFsaWQgYWRkcmVzcyBhbGlnbm1lbnQgb2Ygc2VjdGlvbiBoZWFkZXJzCisgIGlmIChTZWN0aW9uVGFibGVPZmZzZXQgJiAoYWxpZ25vZihFbGZfU2hkcikgLSAxKSkKKyAgICByZXR1cm4gY3JlYXRlRXJyb3IoImludmFsaWQgYWxpZ25tZW50IG9mIHNlY3Rpb24gaGVhZGVycyIpOworCisgIGNvbnN0IEVsZl9TaGRyICpGaXJzdCA9CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IEVsZl9TaGRyICo+KGJhc2UoKSArIFNlY3Rpb25UYWJsZU9mZnNldCk7CisKKyAgdWludFhfdCBOdW1TZWN0aW9ucyA9IGdldEhlYWRlcigpLT5lX3NobnVtOworICBpZiAoTnVtU2VjdGlvbnMgPT0gMCkKKyAgICBOdW1TZWN0aW9ucyA9IEZpcnN0LT5zaF9zaXplOworCisgIGlmIChOdW1TZWN0aW9ucyA+IFVJTlQ2NF9NQVggLyBzaXplb2YoRWxmX1NoZHIpKQorICAgIHJldHVybiBjcmVhdGVFcnJvcigic2VjdGlvbiB0YWJsZSBnb2VzIHBhc3QgdGhlIGVuZCBvZiBmaWxlIik7CisKKyAgY29uc3QgdWludDY0X3QgU2VjdGlvblRhYmxlU2l6ZSA9IE51bVNlY3Rpb25zICogc2l6ZW9mKEVsZl9TaGRyKTsKKworICAvLyBTZWN0aW9uIHRhYmxlIGdvZXMgcGFzdCBlbmQgb2YgZmlsZSEKKyAgaWYgKFNlY3Rpb25UYWJsZU9mZnNldCArIFNlY3Rpb25UYWJsZVNpemUgPiBGaWxlU2l6ZSkKKyAgICByZXR1cm4gY3JlYXRlRXJyb3IoInNlY3Rpb24gdGFibGUgZ29lcyBwYXN0IHRoZSBlbmQgb2YgZmlsZSIpOworCisgIHJldHVybiBtYWtlQXJyYXlSZWYoRmlyc3QsIE51bVNlY3Rpb25zKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK0V4cGVjdGVkPGNvbnN0IFQgKj4gRUxGRmlsZTxFTEZUPjo6Z2V0RW50cnkodWludDMyX3QgU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRW50cnkpIGNvbnN0IHsKKyAgYXV0byBTZWNPckVyciA9IGdldFNlY3Rpb24oU2VjdGlvbik7CisgIGlmICghU2VjT3JFcnIpCisgICAgcmV0dXJuIFNlY09yRXJyLnRha2VFcnJvcigpOworICByZXR1cm4gZ2V0RW50cnk8VD4oKlNlY09yRXJyLCBFbnRyeSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitFeHBlY3RlZDxjb25zdCBUICo+IEVMRkZpbGU8RUxGVD46OmdldEVudHJ5KGNvbnN0IEVsZl9TaGRyICpTZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBFbnRyeSkgY29uc3QgeworICBpZiAoc2l6ZW9mKFQpICE9IFNlY3Rpb24tPnNoX2VudHNpemUpCisgICAgcmV0dXJuIGNyZWF0ZUVycm9yKCJpbnZhbGlkIHNoX2VudHNpemUiKTsKKyAgc2l6ZV90IFBvcyA9IFNlY3Rpb24tPnNoX29mZnNldCArIEVudHJ5ICogc2l6ZW9mKFQpOworICBpZiAoUG9zICsgc2l6ZW9mKFQpID4gQnVmLnNpemUoKSkKKyAgICByZXR1cm4gY3JlYXRlRXJyb3IoImludmFsaWQgc2VjdGlvbiBvZmZzZXQiKTsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCAqPihiYXNlKCkgKyBQb3MpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK0V4cGVjdGVkPGNvbnN0IHR5cGVuYW1lIEVMRlQ6OlNoZHIgKj4KK0VMRkZpbGU8RUxGVD46OmdldFNlY3Rpb24odWludDMyX3QgSW5kZXgpIGNvbnN0IHsKKyAgYXV0byBUYWJsZU9yRXJyID0gc2VjdGlvbnMoKTsKKyAgaWYgKCFUYWJsZU9yRXJyKQorICAgIHJldHVybiBUYWJsZU9yRXJyLnRha2VFcnJvcigpOworICByZXR1cm4gb2JqZWN0OjpnZXRTZWN0aW9uPEVMRlQ+KCpUYWJsZU9yRXJyLCBJbmRleCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorRXhwZWN0ZWQ8U3RyaW5nUmVmPgorRUxGRmlsZTxFTEZUPjo6Z2V0U3RyaW5nVGFibGUoY29uc3QgRWxmX1NoZHIgKlNlY3Rpb24pIGNvbnN0IHsKKyAgaWYgKFNlY3Rpb24tPnNoX3R5cGUgIT0gRUxGOjpTSFRfU1RSVEFCKQorICAgIHJldHVybiBjcmVhdGVFcnJvcigiaW52YWxpZCBzaF90eXBlIGZvciBzdHJpbmcgdGFibGUsIGV4cGVjdGVkIFNIVF9TVFJUQUIiKTsKKyAgYXV0byBWID0gZ2V0U2VjdGlvbkNvbnRlbnRzQXNBcnJheTxjaGFyPihTZWN0aW9uKTsKKyAgaWYgKCFWKQorICAgIHJldHVybiBWLnRha2VFcnJvcigpOworICBBcnJheVJlZjxjaGFyPiBEYXRhID0gKlY7CisgIGlmIChEYXRhLmVtcHR5KCkpCisgICAgcmV0dXJuIGNyZWF0ZUVycm9yKCJlbXB0eSBzdHJpbmcgdGFibGUiKTsKKyAgaWYgKERhdGEuYmFjaygpICE9ICdcMCcpCisgICAgcmV0dXJuIGNyZWF0ZUVycm9yKCJzdHJpbmcgdGFibGUgbm9uLW51bGwgdGVybWluYXRlZCIpOworICByZXR1cm4gU3RyaW5nUmVmKERhdGEuYmVnaW4oKSwgRGF0YS5zaXplKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK0V4cGVjdGVkPEFycmF5UmVmPHR5cGVuYW1lIEVMRlQ6OldvcmQ+PgorRUxGRmlsZTxFTEZUPjo6Z2V0U0hORFhUYWJsZShjb25zdCBFbGZfU2hkciAmU2VjdGlvbikgY29uc3QgeworICBhdXRvIFNlY3Rpb25zT3JFcnIgPSBzZWN0aW9ucygpOworICBpZiAoIVNlY3Rpb25zT3JFcnIpCisgICAgcmV0dXJuIFNlY3Rpb25zT3JFcnIudGFrZUVycm9yKCk7CisgIHJldHVybiBnZXRTSE5EWFRhYmxlKFNlY3Rpb24sICpTZWN0aW9uc09yRXJyKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitFeHBlY3RlZDxBcnJheVJlZjx0eXBlbmFtZSBFTEZUOjpXb3JkPj4KK0VMRkZpbGU8RUxGVD46OmdldFNITkRYVGFibGUoY29uc3QgRWxmX1NoZHIgJlNlY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVsZl9TaGRyX1JhbmdlIFNlY3Rpb25zKSBjb25zdCB7CisgIGFzc2VydChTZWN0aW9uLnNoX3R5cGUgPT0gRUxGOjpTSFRfU1lNVEFCX1NITkRYKTsKKyAgYXV0byBWT3JFcnIgPSBnZXRTZWN0aW9uQ29udGVudHNBc0FycmF5PEVsZl9Xb3JkPigmU2VjdGlvbik7CisgIGlmICghVk9yRXJyKQorICAgIHJldHVybiBWT3JFcnIudGFrZUVycm9yKCk7CisgIEFycmF5UmVmPEVsZl9Xb3JkPiBWID0gKlZPckVycjsKKyAgYXV0byBTeW1UYWJsZU9yRXJyID0gb2JqZWN0OjpnZXRTZWN0aW9uPEVMRlQ+KFNlY3Rpb25zLCBTZWN0aW9uLnNoX2xpbmspOworICBpZiAoIVN5bVRhYmxlT3JFcnIpCisgICAgcmV0dXJuIFN5bVRhYmxlT3JFcnIudGFrZUVycm9yKCk7CisgIGNvbnN0IEVsZl9TaGRyICZTeW1UYWJsZSA9ICoqU3ltVGFibGVPckVycjsKKyAgaWYgKFN5bVRhYmxlLnNoX3R5cGUgIT0gRUxGOjpTSFRfU1lNVEFCICYmCisgICAgICBTeW1UYWJsZS5zaF90eXBlICE9IEVMRjo6U0hUX0RZTlNZTSkKKyAgICByZXR1cm4gY3JlYXRlRXJyb3IoImludmFsaWQgc2hfdHlwZSIpOworICBpZiAoVi5zaXplKCkgIT0gKFN5bVRhYmxlLnNoX3NpemUgLyBzaXplb2YoRWxmX1N5bSkpKQorICAgIHJldHVybiBjcmVhdGVFcnJvcigiaW52YWxpZCBzZWN0aW9uIGNvbnRlbnRzIHNpemUiKTsKKyAgcmV0dXJuIFY7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorRXhwZWN0ZWQ8U3RyaW5nUmVmPgorRUxGRmlsZTxFTEZUPjo6Z2V0U3RyaW5nVGFibGVGb3JTeW10YWIoY29uc3QgRWxmX1NoZHIgJlNlYykgY29uc3QgeworICBhdXRvIFNlY3Rpb25zT3JFcnIgPSBzZWN0aW9ucygpOworICBpZiAoIVNlY3Rpb25zT3JFcnIpCisgICAgcmV0dXJuIFNlY3Rpb25zT3JFcnIudGFrZUVycm9yKCk7CisgIHJldHVybiBnZXRTdHJpbmdUYWJsZUZvclN5bXRhYihTZWMsICpTZWN0aW9uc09yRXJyKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitFeHBlY3RlZDxTdHJpbmdSZWY+CitFTEZGaWxlPEVMRlQ+OjpnZXRTdHJpbmdUYWJsZUZvclN5bXRhYihjb25zdCBFbGZfU2hkciAmU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWxmX1NoZHJfUmFuZ2UgU2VjdGlvbnMpIGNvbnN0IHsKKworICBpZiAoU2VjLnNoX3R5cGUgIT0gRUxGOjpTSFRfU1lNVEFCICYmIFNlYy5zaF90eXBlICE9IEVMRjo6U0hUX0RZTlNZTSkKKyAgICByZXR1cm4gY3JlYXRlRXJyb3IoCisgICAgICAgICJpbnZhbGlkIHNoX3R5cGUgZm9yIHN5bWJvbCB0YWJsZSwgZXhwZWN0ZWQgU0hUX1NZTVRBQiBvciBTSFRfRFlOU1lNIik7CisgIGF1dG8gU2VjdGlvbk9yRXJyID0gb2JqZWN0OjpnZXRTZWN0aW9uPEVMRlQ+KFNlY3Rpb25zLCBTZWMuc2hfbGluayk7CisgIGlmICghU2VjdGlvbk9yRXJyKQorICAgIHJldHVybiBTZWN0aW9uT3JFcnIudGFrZUVycm9yKCk7CisgIHJldHVybiBnZXRTdHJpbmdUYWJsZSgqU2VjdGlvbk9yRXJyKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitFeHBlY3RlZDxTdHJpbmdSZWY+CitFTEZGaWxlPEVMRlQ+OjpnZXRTZWN0aW9uTmFtZShjb25zdCBFbGZfU2hkciAqU2VjdGlvbikgY29uc3QgeworICBhdXRvIFNlY3Rpb25zT3JFcnIgPSBzZWN0aW9ucygpOworICBpZiAoIVNlY3Rpb25zT3JFcnIpCisgICAgcmV0dXJuIFNlY3Rpb25zT3JFcnIudGFrZUVycm9yKCk7CisgIGF1dG8gVGFibGUgPSBnZXRTZWN0aW9uU3RyaW5nVGFibGUoKlNlY3Rpb25zT3JFcnIpOworICBpZiAoIVRhYmxlKQorICAgIHJldHVybiBUYWJsZS50YWtlRXJyb3IoKTsKKyAgcmV0dXJuIGdldFNlY3Rpb25OYW1lKFNlY3Rpb24sICpUYWJsZSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorRXhwZWN0ZWQ8U3RyaW5nUmVmPiBFTEZGaWxlPEVMRlQ+OjpnZXRTZWN0aW9uTmFtZShjb25zdCBFbGZfU2hkciAqU2VjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIERvdFNoc3RydGFiKSBjb25zdCB7CisgIHVpbnQzMl90IE9mZnNldCA9IFNlY3Rpb24tPnNoX25hbWU7CisgIGlmIChPZmZzZXQgPT0gMCkKKyAgICByZXR1cm4gU3RyaW5nUmVmKCk7CisgIGlmIChPZmZzZXQgPj0gRG90U2hzdHJ0YWIuc2l6ZSgpKQorICAgIHJldHVybiBjcmVhdGVFcnJvcigiaW52YWxpZCBzdHJpbmcgb2Zmc2V0Iik7CisgIHJldHVybiBTdHJpbmdSZWYoRG90U2hzdHJ0YWIuZGF0YSgpICsgT2Zmc2V0KTsKK30KKworLy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgaGFzaCB2YWx1ZSBmb3IgYSBzeW1ib2wgaW4gdGhlIC5keW5zeW0gc2VjdGlvbgorLy8vIE5hbWUgb2YgdGhlIEFQSSByZW1haW5zIGNvbnNpc3RlbnQgYXMgc3BlY2lmaWVkIGluIHRoZSBsaWJlbGYKKy8vLyBSRUYgOiBodHRwOi8vd3d3LnNjby5jb20vZGV2ZWxvcGVycy9nYWJpL2xhdGVzdC9jaDUuZHluYW1pYy5odG1sI2hhc2gKK2lubGluZSB1bnNpZ25lZCBoYXNoU3lzVihTdHJpbmdSZWYgU3ltYm9sTmFtZSkgeworICB1bnNpZ25lZCBoID0gMCwgZzsKKyAgZm9yIChjaGFyIEMgOiBTeW1ib2xOYW1lKSB7CisgICAgaCA9IChoIDw8IDQpICsgQzsKKyAgICBnID0gaCAmIDB4ZjAwMDAwMDBMOworICAgIGlmIChnICE9IDApCisgICAgICBoIF49IGcgPj4gMjQ7CisgICAgaCAmPSB+ZzsKKyAgfQorICByZXR1cm4gaDsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIG9iamVjdAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fT0JKRUNUX0VMRl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9FTEZPYmplY3RGaWxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9FTEZPYmplY3RGaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQwMDEwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0VMRk9iamVjdEZpbGUuaApAQCAtMCwwICsxLDExMjIgQEAKKy8vPT09LSBFTEZPYmplY3RGaWxlLmggLSBFTEYgb2JqZWN0IGZpbGUgaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBFTEZPYmplY3RGaWxlIHRlbXBsYXRlIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RfRUxGT0JKRUNURklMRV9ICisjZGVmaW5lIExMVk1fT0JKRUNUX0VMRk9CSkVDVEZJTEVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1RyaXBsZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRUxGLmgiCisjaW5jbHVkZSAibGx2bS9NQy9TdWJ0YXJnZXRGZWF0dXJlLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvQmluYXJ5LmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvRUxGLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvRUxGVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L09iamVjdEZpbGUuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9TeW1ib2xpY0ZpbGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQVJNQXR0cmlidXRlUGFyc2VyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FSTUJ1aWxkQXR0cmlidXRlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBvYmplY3QgeworCitjbGFzcyBlbGZfc3ltYm9sX2l0ZXJhdG9yOworCitjbGFzcyBFTEZPYmplY3RGaWxlQmFzZSA6IHB1YmxpYyBPYmplY3RGaWxlIHsKKyAgZnJpZW5kIGNsYXNzIEVMRlJlbG9jYXRpb25SZWY7CisgIGZyaWVuZCBjbGFzcyBFTEZTZWN0aW9uUmVmOworICBmcmllbmQgY2xhc3MgRUxGU3ltYm9sUmVmOworCitwcm90ZWN0ZWQ6CisgIEVMRk9iamVjdEZpbGVCYXNlKHVuc2lnbmVkIGludCBUeXBlLCBNZW1vcnlCdWZmZXJSZWYgU291cmNlKTsKKworICB2aXJ0dWFsIHVpbnQxNl90IGdldEVNYWNoaW5lKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQ2NF90IGdldFN5bWJvbFNpemUoRGF0YVJlZkltcGwgU3ltYikgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQ4X3QgZ2V0U3ltYm9sT3RoZXIoRGF0YVJlZkltcGwgU3ltYikgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQ4X3QgZ2V0U3ltYm9sRUxGVHlwZShEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCB1aW50MzJfdCBnZXRTZWN0aW9uVHlwZShEYXRhUmVmSW1wbCBTZWMpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50NjRfdCBnZXRTZWN0aW9uRmxhZ3MoRGF0YVJlZkltcGwgU2VjKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDY0X3QgZ2V0U2VjdGlvbk9mZnNldChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIEV4cGVjdGVkPGludDY0X3Q+IGdldFJlbG9jYXRpb25BZGRlbmQoRGF0YVJlZkltcGwgUmVsKSBjb25zdCA9IDA7CisKK3B1YmxpYzoKKyAgdXNpbmcgZWxmX3N5bWJvbF9pdGVyYXRvcl9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPGVsZl9zeW1ib2xfaXRlcmF0b3I+OworCisgIHZpcnR1YWwgZWxmX3N5bWJvbF9pdGVyYXRvcl9yYW5nZSBnZXREeW5hbWljU3ltYm9sSXRlcmF0b3JzKCkgY29uc3QgPSAwOworCisgIC8vLyBSZXR1cm5zIHBsYXRmb3JtLXNwZWNpZmljIG9iamVjdCBmbGFncywgaWYgYW55LgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldFBsYXRmb3JtRmxhZ3MoKSBjb25zdCA9IDA7CisKKyAgZWxmX3N5bWJvbF9pdGVyYXRvcl9yYW5nZSBzeW1ib2xzKCkgY29uc3Q7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBCaW5hcnkgKnYpIHsgcmV0dXJuIHYtPmlzRUxGKCk7IH0KKworICBTdWJ0YXJnZXRGZWF0dXJlcyBnZXRGZWF0dXJlcygpIGNvbnN0IG92ZXJyaWRlOworCisgIFN1YnRhcmdldEZlYXR1cmVzIGdldE1JUFNGZWF0dXJlcygpIGNvbnN0OworCisgIFN1YnRhcmdldEZlYXR1cmVzIGdldEFSTUZlYXR1cmVzKCkgY29uc3Q7CisKKyAgU3VidGFyZ2V0RmVhdHVyZXMgZ2V0UklTQ1ZGZWF0dXJlcygpIGNvbnN0OworCisgIHZvaWQgc2V0QVJNU3ViQXJjaChUcmlwbGUgJlRoZVRyaXBsZSkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCitjbGFzcyBFTEZTZWN0aW9uUmVmIDogcHVibGljIFNlY3Rpb25SZWYgeworcHVibGljOgorICBFTEZTZWN0aW9uUmVmKGNvbnN0IFNlY3Rpb25SZWYgJkIpIDogU2VjdGlvblJlZihCKSB7CisgICAgYXNzZXJ0KGlzYTxFTEZPYmplY3RGaWxlQmFzZT4oU2VjdGlvblJlZjo6Z2V0T2JqZWN0KCkpKTsKKyAgfQorCisgIGNvbnN0IEVMRk9iamVjdEZpbGVCYXNlICpnZXRPYmplY3QoKSBjb25zdCB7CisgICAgcmV0dXJuIGNhc3Q8RUxGT2JqZWN0RmlsZUJhc2U+KFNlY3Rpb25SZWY6OmdldE9iamVjdCgpKTsKKyAgfQorCisgIHVpbnQzMl90IGdldFR5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9iamVjdCgpLT5nZXRTZWN0aW9uVHlwZShnZXRSYXdEYXRhUmVmSW1wbCgpKTsKKyAgfQorCisgIHVpbnQ2NF90IGdldEZsYWdzKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPYmplY3QoKS0+Z2V0U2VjdGlvbkZsYWdzKGdldFJhd0RhdGFSZWZJbXBsKCkpOworICB9CisKKyAgdWludDY0X3QgZ2V0T2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBnZXRPYmplY3QoKS0+Z2V0U2VjdGlvbk9mZnNldChnZXRSYXdEYXRhUmVmSW1wbCgpKTsKKyAgfQorfTsKKworY2xhc3MgZWxmX3NlY3Rpb25faXRlcmF0b3IgOiBwdWJsaWMgc2VjdGlvbl9pdGVyYXRvciB7CitwdWJsaWM6CisgIGVsZl9zZWN0aW9uX2l0ZXJhdG9yKGNvbnN0IHNlY3Rpb25faXRlcmF0b3IgJkIpIDogc2VjdGlvbl9pdGVyYXRvcihCKSB7CisgICAgYXNzZXJ0KGlzYTxFTEZPYmplY3RGaWxlQmFzZT4oQi0+Z2V0T2JqZWN0KCkpKTsKKyAgfQorCisgIGNvbnN0IEVMRlNlY3Rpb25SZWYgKm9wZXJhdG9yLT4oKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IEVMRlNlY3Rpb25SZWYgKj4oc2VjdGlvbl9pdGVyYXRvcjo6b3BlcmF0b3ItPigpKTsKKyAgfQorCisgIGNvbnN0IEVMRlNlY3Rpb25SZWYgJm9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgRUxGU2VjdGlvblJlZiAmPihzZWN0aW9uX2l0ZXJhdG9yOjpvcGVyYXRvciooKSk7CisgIH0KK307CisKK2NsYXNzIEVMRlN5bWJvbFJlZiA6IHB1YmxpYyBTeW1ib2xSZWYgeworcHVibGljOgorICBFTEZTeW1ib2xSZWYoY29uc3QgU3ltYm9sUmVmICZCKSA6IFN5bWJvbFJlZihCKSB7CisgICAgYXNzZXJ0KGlzYTxFTEZPYmplY3RGaWxlQmFzZT4oU3ltYm9sUmVmOjpnZXRPYmplY3QoKSkpOworICB9CisKKyAgY29uc3QgRUxGT2JqZWN0RmlsZUJhc2UgKmdldE9iamVjdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY2FzdDxFTEZPYmplY3RGaWxlQmFzZT4oQmFzaWNTeW1ib2xSZWY6OmdldE9iamVjdCgpKTsKKyAgfQorCisgIHVpbnQ2NF90IGdldFNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9iamVjdCgpLT5nZXRTeW1ib2xTaXplKGdldFJhd0RhdGFSZWZJbXBsKCkpOworICB9CisKKyAgdWludDhfdCBnZXRPdGhlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0T2JqZWN0KCktPmdldFN5bWJvbE90aGVyKGdldFJhd0RhdGFSZWZJbXBsKCkpOworICB9CisKKyAgdWludDhfdCBnZXRFTEZUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBnZXRPYmplY3QoKS0+Z2V0U3ltYm9sRUxGVHlwZShnZXRSYXdEYXRhUmVmSW1wbCgpKTsKKyAgfQorfTsKKworY2xhc3MgZWxmX3N5bWJvbF9pdGVyYXRvciA6IHB1YmxpYyBzeW1ib2xfaXRlcmF0b3IgeworcHVibGljOgorICBlbGZfc3ltYm9sX2l0ZXJhdG9yKGNvbnN0IGJhc2ljX3N5bWJvbF9pdGVyYXRvciAmQikKKyAgICAgIDogc3ltYm9sX2l0ZXJhdG9yKFN5bWJvbFJlZihCLT5nZXRSYXdEYXRhUmVmSW1wbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8RUxGT2JqZWN0RmlsZUJhc2U+KEItPmdldE9iamVjdCgpKSkpIHt9CisKKyAgY29uc3QgRUxGU3ltYm9sUmVmICpvcGVyYXRvci0+KCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBFTEZTeW1ib2xSZWYgKj4oc3ltYm9sX2l0ZXJhdG9yOjpvcGVyYXRvci0+KCkpOworICB9CisKKyAgY29uc3QgRUxGU3ltYm9sUmVmICZvcGVyYXRvciooKSBjb25zdCB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IEVMRlN5bWJvbFJlZiAmPihzeW1ib2xfaXRlcmF0b3I6Om9wZXJhdG9yKigpKTsKKyAgfQorfTsKKworY2xhc3MgRUxGUmVsb2NhdGlvblJlZiA6IHB1YmxpYyBSZWxvY2F0aW9uUmVmIHsKK3B1YmxpYzoKKyAgRUxGUmVsb2NhdGlvblJlZihjb25zdCBSZWxvY2F0aW9uUmVmICZCKSA6IFJlbG9jYXRpb25SZWYoQikgeworICAgIGFzc2VydChpc2E8RUxGT2JqZWN0RmlsZUJhc2U+KFJlbG9jYXRpb25SZWY6OmdldE9iamVjdCgpKSk7CisgIH0KKworICBjb25zdCBFTEZPYmplY3RGaWxlQmFzZSAqZ2V0T2JqZWN0KCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PEVMRk9iamVjdEZpbGVCYXNlPihSZWxvY2F0aW9uUmVmOjpnZXRPYmplY3QoKSk7CisgIH0KKworICBFeHBlY3RlZDxpbnQ2NF90PiBnZXRBZGRlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE9iamVjdCgpLT5nZXRSZWxvY2F0aW9uQWRkZW5kKGdldFJhd0RhdGFSZWZJbXBsKCkpOworICB9Cit9OworCitjbGFzcyBlbGZfcmVsb2NhdGlvbl9pdGVyYXRvciA6IHB1YmxpYyByZWxvY2F0aW9uX2l0ZXJhdG9yIHsKK3B1YmxpYzoKKyAgZWxmX3JlbG9jYXRpb25faXRlcmF0b3IoY29uc3QgcmVsb2NhdGlvbl9pdGVyYXRvciAmQikKKyAgICAgIDogcmVsb2NhdGlvbl9pdGVyYXRvcihSZWxvY2F0aW9uUmVmKAorICAgICAgICAgICAgQi0+Z2V0UmF3RGF0YVJlZkltcGwoKSwgY2FzdDxFTEZPYmplY3RGaWxlQmFzZT4oQi0+Z2V0T2JqZWN0KCkpKSkge30KKworICBjb25zdCBFTEZSZWxvY2F0aW9uUmVmICpvcGVyYXRvci0+KCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBFTEZSZWxvY2F0aW9uUmVmICo+KAorICAgICAgICByZWxvY2F0aW9uX2l0ZXJhdG9yOjpvcGVyYXRvci0+KCkpOworICB9CisKKyAgY29uc3QgRUxGUmVsb2NhdGlvblJlZiAmb3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBFTEZSZWxvY2F0aW9uUmVmICY+KAorICAgICAgICByZWxvY2F0aW9uX2l0ZXJhdG9yOjpvcGVyYXRvciooKSk7CisgIH0KK307CisKK2lubGluZSBFTEZPYmplY3RGaWxlQmFzZTo6ZWxmX3N5bWJvbF9pdGVyYXRvcl9yYW5nZQorRUxGT2JqZWN0RmlsZUJhc2U6OnN5bWJvbHMoKSBjb25zdCB7CisgIHJldHVybiBlbGZfc3ltYm9sX2l0ZXJhdG9yX3JhbmdlKHN5bWJvbF9iZWdpbigpLCBzeW1ib2xfZW5kKCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4gY2xhc3MgRUxGT2JqZWN0RmlsZSA6IHB1YmxpYyBFTEZPYmplY3RGaWxlQmFzZSB7CisgIHVpbnQxNl90IGdldEVNYWNoaW5lKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldFN5bWJvbFNpemUoRGF0YVJlZkltcGwgU3ltKSBjb25zdCBvdmVycmlkZTsKKworcHVibGljOgorICBMTFZNX0VMRl9JTVBPUlRfVFlQRVNfRUxGVChFTEZUKQorCisgIHVzaW5nIHVpbnRYX3QgPSB0eXBlbmFtZSBFTEZUOjp1aW50OworCisgIHVzaW5nIEVsZl9TeW0gPSB0eXBlbmFtZSBFTEZUOjpTeW07CisgIHVzaW5nIEVsZl9TaGRyID0gdHlwZW5hbWUgRUxGVDo6U2hkcjsKKyAgdXNpbmcgRWxmX0VoZHIgPSB0eXBlbmFtZSBFTEZUOjpFaGRyOworICB1c2luZyBFbGZfUmVsID0gdHlwZW5hbWUgRUxGVDo6UmVsOworICB1c2luZyBFbGZfUmVsYSA9IHR5cGVuYW1lIEVMRlQ6OlJlbGE7CisgIHVzaW5nIEVsZl9EeW4gPSB0eXBlbmFtZSBFTEZUOjpEeW47CisKK3ByaXZhdGU6CisgIEVMRk9iamVjdEZpbGUoTWVtb3J5QnVmZmVyUmVmIE9iamVjdCwgRUxGRmlsZTxFTEZUPiBFRiwKKyAgICAgICAgICAgICAgICBjb25zdCBFbGZfU2hkciAqRG90RHluU3ltU2VjLCBjb25zdCBFbGZfU2hkciAqRG90U3ltdGFiU2VjLAorICAgICAgICAgICAgICAgIEFycmF5UmVmPEVsZl9Xb3JkPiBTaG5keFRhYmxlKTsKKworcHJvdGVjdGVkOgorICBFTEZGaWxlPEVMRlQ+IEVGOworCisgIGNvbnN0IEVsZl9TaGRyICpEb3REeW5TeW1TZWMgPSBudWxscHRyOyAvLyBEeW5hbWljIHN5bWJvbCB0YWJsZSBzZWN0aW9uLgorICBjb25zdCBFbGZfU2hkciAqRG90U3ltdGFiU2VjID0gbnVsbHB0cjsgLy8gU3ltYm9sIHRhYmxlIHNlY3Rpb24uCisgIEFycmF5UmVmPEVsZl9Xb3JkPiBTaG5keFRhYmxlOworCisgIHZvaWQgbW92ZVN5bWJvbE5leHQoRGF0YVJlZkltcGwgJlN5bWIpIGNvbnN0IG92ZXJyaWRlOworICBFeHBlY3RlZDxTdHJpbmdSZWY+IGdldFN5bWJvbE5hbWUoRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisgIEV4cGVjdGVkPHVpbnQ2NF90PiBnZXRTeW1ib2xBZGRyZXNzKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRTeW1ib2xWYWx1ZUltcGwoRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFN5bWJvbEFsaWdubWVudChEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0Q29tbW9uU3ltYm9sU2l6ZUltcGwoRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFN5bWJvbEZsYWdzKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICB1aW50OF90IGdldFN5bWJvbE90aGVyKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICB1aW50OF90IGdldFN5bWJvbEVMRlR5cGUoRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisgIEV4cGVjdGVkPFN5bWJvbFJlZjo6VHlwZT4gZ2V0U3ltYm9sVHlwZShEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCBvdmVycmlkZTsKKyAgRXhwZWN0ZWQ8c2VjdGlvbl9pdGVyYXRvcj4gZ2V0U3ltYm9sU2VjdGlvbihjb25zdCBFbGZfU3ltICpTeW1iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVsZl9TaGRyICpTeW1UYWIpIGNvbnN0OworICBFeHBlY3RlZDxzZWN0aW9uX2l0ZXJhdG9yPiBnZXRTeW1ib2xTZWN0aW9uKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgbW92ZVNlY3Rpb25OZXh0KERhdGFSZWZJbXBsICZTZWMpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OmVycm9yX2NvZGUgZ2V0U2VjdGlvbk5hbWUoRGF0YVJlZkltcGwgU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmICZSZXMpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRTZWN0aW9uQWRkcmVzcyhEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRTZWN0aW9uSW5kZXgoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0U2VjdGlvblNpemUoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjplcnJvcl9jb2RlIGdldFNlY3Rpb25Db250ZW50cyhEYXRhUmVmSW1wbCBTZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmICZSZXMpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRTZWN0aW9uQWxpZ25tZW50KERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTZWN0aW9uQ29tcHJlc3NlZChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2VjdGlvblRleHQoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1NlY3Rpb25EYXRhKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTZWN0aW9uQlNTKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTZWN0aW9uVmlydHVhbChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICByZWxvY2F0aW9uX2l0ZXJhdG9yIHNlY3Rpb25fcmVsX2JlZ2luKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIHJlbG9jYXRpb25faXRlcmF0b3Igc2VjdGlvbl9yZWxfZW5kKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIHNlY3Rpb25faXRlcmF0b3IgZ2V0UmVsb2NhdGVkU2VjdGlvbihEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgbW92ZVJlbG9jYXRpb25OZXh0KERhdGFSZWZJbXBsICZSZWwpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRSZWxvY2F0aW9uT2Zmc2V0KERhdGFSZWZJbXBsIFJlbCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN5bWJvbF9pdGVyYXRvciBnZXRSZWxvY2F0aW9uU3ltYm9sKERhdGFSZWZJbXBsIFJlbCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldFJlbG9jYXRpb25UeXBlKERhdGFSZWZJbXBsIFJlbCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0UmVsb2NhdGlvblR5cGVOYW1lKERhdGFSZWZJbXBsIFJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZSZXN1bHQpIGNvbnN0IG92ZXJyaWRlOworCisgIHVpbnQzMl90IGdldFNlY3Rpb25UeXBlKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldFNlY3Rpb25GbGFncyhEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRTZWN0aW9uT2Zmc2V0KERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIFN0cmluZ1JlZiBnZXRSZWxvY2F0aW9uVHlwZU5hbWUodWludDMyX3QgVHlwZSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHJlbG9jYXRpb24gc2VjdGlvbiB0aGF0IGNvbnRhaW5zIFxhIFJlbC4KKyAgY29uc3QgRWxmX1NoZHIgKmdldFJlbFNlY3Rpb24oRGF0YVJlZkltcGwgUmVsKSBjb25zdCB7CisgICAgYXV0byBSZWxTZWNPckVyciA9IEVGLmdldFNlY3Rpb24oUmVsLmQuYSk7CisgICAgaWYgKCFSZWxTZWNPckVycikKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcihlcnJvclRvRXJyb3JDb2RlKFJlbFNlY09yRXJyLnRha2VFcnJvcigpKS5tZXNzYWdlKCkpOworICAgIHJldHVybiAqUmVsU2VjT3JFcnI7CisgIH0KKworICBEYXRhUmVmSW1wbCB0b0RSSShjb25zdCBFbGZfU2hkciAqU3ltVGFibGUsIHVuc2lnbmVkIFN5bWJvbE51bSkgY29uc3QgeworICAgIERhdGFSZWZJbXBsIERSSTsKKyAgICBpZiAoIVN5bVRhYmxlKSB7CisgICAgICBEUkkuZC5hID0gMDsKKyAgICAgIERSSS5kLmIgPSAwOworICAgICAgcmV0dXJuIERSSTsKKyAgICB9CisgICAgYXNzZXJ0KFN5bVRhYmxlLT5zaF90eXBlID09IEVMRjo6U0hUX1NZTVRBQiB8fAorICAgICAgICAgICBTeW1UYWJsZS0+c2hfdHlwZSA9PSBFTEY6OlNIVF9EWU5TWU0pOworCisgICAgYXV0byBTZWN0aW9uc09yRXJyID0gRUYuc2VjdGlvbnMoKTsKKyAgICBpZiAoIVNlY3Rpb25zT3JFcnIpIHsKKyAgICAgIERSSS5kLmEgPSAwOworICAgICAgRFJJLmQuYiA9IDA7CisgICAgICByZXR1cm4gRFJJOworICAgIH0KKyAgICB1aW50cHRyX3QgU0hUID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KCgqU2VjdGlvbnNPckVycikuYmVnaW4oKSk7CisgICAgdW5zaWduZWQgU3ltVGFibGVJbmRleCA9CisgICAgICAgIChyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oU3ltVGFibGUpIC0gU0hUKSAvIHNpemVvZihFbGZfU2hkcik7CisKKyAgICBEUkkuZC5hID0gU3ltVGFibGVJbmRleDsKKyAgICBEUkkuZC5iID0gU3ltYm9sTnVtOworICAgIHJldHVybiBEUkk7CisgIH0KKworICBjb25zdCBFbGZfU2hkciAqdG9FTEZTaGRySXRlcihEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFbGZfU2hkciAqPihTZWMucCk7CisgIH0KKworICBEYXRhUmVmSW1wbCB0b0RSSShjb25zdCBFbGZfU2hkciAqU2VjKSBjb25zdCB7CisgICAgRGF0YVJlZkltcGwgRFJJOworICAgIERSSS5wID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFNlYyk7CisgICAgcmV0dXJuIERSSTsKKyAgfQorCisgIERhdGFSZWZJbXBsIHRvRFJJKGNvbnN0IEVsZl9EeW4gKkR5bikgY29uc3QgeworICAgIERhdGFSZWZJbXBsIERSSTsKKyAgICBEUkkucCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihEeW4pOworICAgIHJldHVybiBEUkk7CisgIH0KKworICBib29sIGlzRXhwb3J0ZWRUb090aGVyRFNPKGNvbnN0IEVsZl9TeW0gKkVTeW0pIGNvbnN0IHsKKyAgICB1bnNpZ25lZCBjaGFyIEJpbmRpbmcgPSBFU3ltLT5nZXRCaW5kaW5nKCk7CisgICAgdW5zaWduZWQgY2hhciBWaXNpYmlsaXR5ID0gRVN5bS0+Z2V0VmlzaWJpbGl0eSgpOworCisgICAgLy8gQSBzeW1ib2wgaXMgZXhwb3J0ZWQgaWYgaXRzIGJpbmRpbmcgaXMgZWl0aGVyIEdMT0JBTCBvciBXRUFLLCBhbmQgaXRzCisgICAgLy8gdmlzaWJpbGl0eSBpcyBlaXRoZXIgREVGQVVMVCBvciBQUk9URUNURUQuIEFsbCBvdGhlciBzeW1ib2xzIGFyZSBub3QKKyAgICAvLyBleHBvcnRlZC4KKyAgICByZXR1cm4gKChCaW5kaW5nID09IEVMRjo6U1RCX0dMT0JBTCB8fCBCaW5kaW5nID09IEVMRjo6U1RCX1dFQUspICYmCisgICAgICAgICAgICAoVmlzaWJpbGl0eSA9PSBFTEY6OlNUVl9ERUZBVUxUIHx8CisgICAgICAgICAgICAgVmlzaWJpbGl0eSA9PSBFTEY6OlNUVl9QUk9URUNURUQpKTsKKyAgfQorCisgIC8vIFRoaXMgZmxhZyBpcyB1c2VkIGZvciBjbGFzc29mLCB0byBkaXN0aW5ndWlzaCBFTEZPYmplY3RGaWxlIGZyb20KKyAgLy8gaXRzIHN1YmNsYXNzLiBJZiBtb3JlIHN1YmNsYXNzZXMgd2lsbCBiZSBjcmVhdGVkLCB0aGlzIGZsYWcgd2lsbAorICAvLyBoYXZlIHRvIGJlY29tZSBhbiBlbnVtLgorICBib29sIGlzRHlsZEVMRk9iamVjdDsKKworcHVibGljOgorICBFTEZPYmplY3RGaWxlKEVMRk9iamVjdEZpbGU8RUxGVD4gJiZPdGhlcik7CisgIHN0YXRpYyBFeHBlY3RlZDxFTEZPYmplY3RGaWxlPEVMRlQ+PiBjcmVhdGUoTWVtb3J5QnVmZmVyUmVmIE9iamVjdCk7CisKKyAgY29uc3QgRWxmX1JlbCAqZ2V0UmVsKERhdGFSZWZJbXBsIFJlbCkgY29uc3Q7CisgIGNvbnN0IEVsZl9SZWxhICpnZXRSZWxhKERhdGFSZWZJbXBsIFJlbGEpIGNvbnN0OworCisgIGNvbnN0IEVsZl9TeW0gKmdldFN5bWJvbChEYXRhUmVmSW1wbCBTeW0pIGNvbnN0IHsKKyAgICBhdXRvIFJldCA9IEVGLnRlbXBsYXRlIGdldEVudHJ5PEVsZl9TeW0+KFN5bS5kLmEsIFN5bS5kLmIpOworICAgIGlmICghUmV0KQorICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKGVycm9yVG9FcnJvckNvZGUoUmV0LnRha2VFcnJvcigpKS5tZXNzYWdlKCkpOworICAgIHJldHVybiAqUmV0OworICB9CisKKyAgY29uc3QgRWxmX1NoZHIgKmdldFNlY3Rpb24oRGF0YVJlZkltcGwgU2VjKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRWxmX1NoZHIgKj4oU2VjLnApOworICB9CisKKyAgYmFzaWNfc3ltYm9sX2l0ZXJhdG9yIHN5bWJvbF9iZWdpbigpIGNvbnN0IG92ZXJyaWRlOworICBiYXNpY19zeW1ib2xfaXRlcmF0b3Igc3ltYm9sX2VuZCgpIGNvbnN0IG92ZXJyaWRlOworCisgIGVsZl9zeW1ib2xfaXRlcmF0b3IgZHluYW1pY19zeW1ib2xfYmVnaW4oKSBjb25zdDsKKyAgZWxmX3N5bWJvbF9pdGVyYXRvciBkeW5hbWljX3N5bWJvbF9lbmQoKSBjb25zdDsKKworICBzZWN0aW9uX2l0ZXJhdG9yIHNlY3Rpb25fYmVnaW4oKSBjb25zdCBvdmVycmlkZTsKKyAgc2VjdGlvbl9pdGVyYXRvciBzZWN0aW9uX2VuZCgpIGNvbnN0IG92ZXJyaWRlOworCisgIEV4cGVjdGVkPGludDY0X3Q+IGdldFJlbG9jYXRpb25BZGRlbmQoRGF0YVJlZkltcGwgUmVsKSBjb25zdCBvdmVycmlkZTsKKworICB1aW50OF90IGdldEJ5dGVzSW5BZGRyZXNzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFN0cmluZ1JlZiBnZXRGaWxlRm9ybWF0TmFtZSgpIGNvbnN0IG92ZXJyaWRlOworICBUcmlwbGU6OkFyY2hUeXBlIGdldEFyY2goKSBjb25zdCBvdmVycmlkZTsKKworICB1bnNpZ25lZCBnZXRQbGF0Zm9ybUZsYWdzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gRUYuZ2V0SGVhZGVyKCktPmVfZmxhZ3M7IH0KKworICBzdGQ6OmVycm9yX2NvZGUgZ2V0QnVpbGRBdHRyaWJ1dGVzKEFSTUF0dHJpYnV0ZVBhcnNlciAmQXR0cmlidXRlcykgY29uc3Qgb3ZlcnJpZGUgeworICAgIGF1dG8gU2VjdGlvbnNPckVyciA9IEVGLnNlY3Rpb25zKCk7CisgICAgaWYgKCFTZWN0aW9uc09yRXJyKQorICAgICAgcmV0dXJuIGVycm9yVG9FcnJvckNvZGUoU2VjdGlvbnNPckVyci50YWtlRXJyb3IoKSk7CisKKyAgICBmb3IgKGNvbnN0IEVsZl9TaGRyICZTZWMgOiAqU2VjdGlvbnNPckVycikgeworICAgICAgaWYgKFNlYy5zaF90eXBlID09IEVMRjo6U0hUX0FSTV9BVFRSSUJVVEVTKSB7CisgICAgICAgIGF1dG8gRXJyb3JPckNvbnRlbnRzID0gRUYuZ2V0U2VjdGlvbkNvbnRlbnRzKCZTZWMpOworICAgICAgICBpZiAoIUVycm9yT3JDb250ZW50cykKKyAgICAgICAgICByZXR1cm4gZXJyb3JUb0Vycm9yQ29kZShFcnJvck9yQ29udGVudHMudGFrZUVycm9yKCkpOworCisgICAgICAgIGF1dG8gQ29udGVudHMgPSBFcnJvck9yQ29udGVudHMuZ2V0KCk7CisgICAgICAgIGlmIChDb250ZW50c1swXSAhPSBBUk1CdWlsZEF0dHJzOjpGb3JtYXRfVmVyc2lvbiB8fCBDb250ZW50cy5zaXplKCkgPT0gMSkKKyAgICAgICAgICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKCk7CisKKyAgICAgICAgQXR0cmlidXRlcy5QYXJzZShDb250ZW50cywgRUxGVDo6VGFyZ2V0RW5kaWFubmVzcyA9PSBzdXBwb3J0OjpsaXR0bGUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOworICB9CisKKyAgY29uc3QgRUxGRmlsZTxFTEZUPiAqZ2V0RUxGRmlsZSgpIGNvbnN0IHsgcmV0dXJuICZFRjsgfQorCisgIGJvb2wgaXNEeWxkVHlwZSgpIGNvbnN0IHsgcmV0dXJuIGlzRHlsZEVMRk9iamVjdDsgfQorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEJpbmFyeSAqdikgeworICAgIHJldHVybiB2LT5nZXRUeXBlKCkgPT0gZ2V0RUxGVHlwZShFTEZUOjpUYXJnZXRFbmRpYW5uZXNzID09IHN1cHBvcnQ6OmxpdHRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUxGVDo6SXM2NEJpdHMpOworICB9CisKKyAgZWxmX3N5bWJvbF9pdGVyYXRvcl9yYW5nZSBnZXREeW5hbWljU3ltYm9sSXRlcmF0b3JzKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBpc1JlbG9jYXRhYmxlT2JqZWN0KCkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCit1c2luZyBFTEYzMkxFT2JqZWN0RmlsZSA9IEVMRk9iamVjdEZpbGU8RUxGMzJMRT47Cit1c2luZyBFTEY2NExFT2JqZWN0RmlsZSA9IEVMRk9iamVjdEZpbGU8RUxGNjRMRT47Cit1c2luZyBFTEYzMkJFT2JqZWN0RmlsZSA9IEVMRk9iamVjdEZpbGU8RUxGMzJCRT47Cit1c2luZyBFTEY2NEJFT2JqZWN0RmlsZSA9IEVMRk9iamVjdEZpbGU8RUxGNjRCRT47CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgordm9pZCBFTEZPYmplY3RGaWxlPEVMRlQ+Ojptb3ZlU3ltYm9sTmV4dChEYXRhUmVmSW1wbCAmU3ltKSBjb25zdCB7CisgICsrU3ltLmQuYjsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitFeHBlY3RlZDxTdHJpbmdSZWY+IEVMRk9iamVjdEZpbGU8RUxGVD46OmdldFN5bWJvbE5hbWUoRGF0YVJlZkltcGwgU3ltKSBjb25zdCB7CisgIGNvbnN0IEVsZl9TeW0gKkVTeW0gPSBnZXRTeW1ib2woU3ltKTsKKyAgYXV0byBTeW1UYWJPckVyciA9IEVGLmdldFNlY3Rpb24oU3ltLmQuYSk7CisgIGlmICghU3ltVGFiT3JFcnIpCisgICAgcmV0dXJuIFN5bVRhYk9yRXJyLnRha2VFcnJvcigpOworICBjb25zdCBFbGZfU2hkciAqU3ltVGFibGVTZWMgPSAqU3ltVGFiT3JFcnI7CisgIGF1dG8gU3RyVGFiT3JFcnIgPSBFRi5nZXRTZWN0aW9uKFN5bVRhYmxlU2VjLT5zaF9saW5rKTsKKyAgaWYgKCFTdHJUYWJPckVycikKKyAgICByZXR1cm4gU3RyVGFiT3JFcnIudGFrZUVycm9yKCk7CisgIGNvbnN0IEVsZl9TaGRyICpTdHJpbmdUYWJsZVNlYyA9ICpTdHJUYWJPckVycjsKKyAgYXV0byBTeW1TdHJUYWJPckVyciA9IEVGLmdldFN0cmluZ1RhYmxlKFN0cmluZ1RhYmxlU2VjKTsKKyAgaWYgKCFTeW1TdHJUYWJPckVycikKKyAgICByZXR1cm4gU3ltU3RyVGFiT3JFcnIudGFrZUVycm9yKCk7CisgIHJldHVybiBFU3ltLT5nZXROYW1lKCpTeW1TdHJUYWJPckVycik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgordWludDY0X3QgRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0U2VjdGlvbkZsYWdzKERhdGFSZWZJbXBsIFNlYykgY29uc3QgeworICByZXR1cm4gZ2V0U2VjdGlvbihTZWMpLT5zaF9mbGFnczsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+Cit1aW50MzJfdCBFTEZPYmplY3RGaWxlPEVMRlQ+OjpnZXRTZWN0aW9uVHlwZShEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFNlY3Rpb24oU2VjKS0+c2hfdHlwZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+Cit1aW50NjRfdCBFTEZPYmplY3RGaWxlPEVMRlQ+OjpnZXRTZWN0aW9uT2Zmc2V0KERhdGFSZWZJbXBsIFNlYykgY29uc3QgeworICByZXR1cm4gZ2V0U2VjdGlvbihTZWMpLT5zaF9vZmZzZXQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgordWludDY0X3QgRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0U3ltYm9sVmFsdWVJbXBsKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IHsKKyAgY29uc3QgRWxmX1N5bSAqRVN5bSA9IGdldFN5bWJvbChTeW1iKTsKKyAgdWludDY0X3QgUmV0ID0gRVN5bS0+c3RfdmFsdWU7CisgIGlmIChFU3ltLT5zdF9zaG5keCA9PSBFTEY6OlNITl9BQlMpCisgICAgcmV0dXJuIFJldDsKKworICBjb25zdCBFbGZfRWhkciAqSGVhZGVyID0gRUYuZ2V0SGVhZGVyKCk7CisgIC8vIENsZWFyIHRoZSBBUk0vVGh1bWIgb3IgbWljcm9NSVBTIGluZGljYXRvciBmbGFnLgorICBpZiAoKEhlYWRlci0+ZV9tYWNoaW5lID09IEVMRjo6RU1fQVJNIHx8IEhlYWRlci0+ZV9tYWNoaW5lID09IEVMRjo6RU1fTUlQUykgJiYKKyAgICAgIEVTeW0tPmdldFR5cGUoKSA9PSBFTEY6OlNUVF9GVU5DKQorICAgIFJldCAmPSB+MTsKKworICByZXR1cm4gUmV0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK0V4cGVjdGVkPHVpbnQ2NF90PgorRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0U3ltYm9sQWRkcmVzcyhEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCB7CisgIHVpbnQ2NF90IFJlc3VsdCA9IGdldFN5bWJvbFZhbHVlKFN5bWIpOworICBjb25zdCBFbGZfU3ltICpFU3ltID0gZ2V0U3ltYm9sKFN5bWIpOworICBzd2l0Y2ggKEVTeW0tPnN0X3NobmR4KSB7CisgIGNhc2UgRUxGOjpTSE5fQ09NTU9OOgorICBjYXNlIEVMRjo6U0hOX1VOREVGOgorICBjYXNlIEVMRjo6U0hOX0FCUzoKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgY29uc3QgRWxmX0VoZHIgKkhlYWRlciA9IEVGLmdldEhlYWRlcigpOworICBhdXRvIFN5bVRhYk9yRXJyID0gRUYuZ2V0U2VjdGlvbihTeW1iLmQuYSk7CisgIGlmICghU3ltVGFiT3JFcnIpCisgICAgcmV0dXJuIFN5bVRhYk9yRXJyLnRha2VFcnJvcigpOworICBjb25zdCBFbGZfU2hkciAqU3ltVGFiID0gKlN5bVRhYk9yRXJyOworCisgIGlmIChIZWFkZXItPmVfdHlwZSA9PSBFTEY6OkVUX1JFTCkgeworICAgIGF1dG8gU2VjdGlvbk9yRXJyID0gRUYuZ2V0U2VjdGlvbihFU3ltLCBTeW1UYWIsIFNobmR4VGFibGUpOworICAgIGlmICghU2VjdGlvbk9yRXJyKQorICAgICAgcmV0dXJuIFNlY3Rpb25PckVyci50YWtlRXJyb3IoKTsKKyAgICBjb25zdCBFbGZfU2hkciAqU2VjdGlvbiA9ICpTZWN0aW9uT3JFcnI7CisgICAgaWYgKFNlY3Rpb24pCisgICAgICBSZXN1bHQgKz0gU2VjdGlvbi0+c2hfYWRkcjsKKyAgfQorCisgIHJldHVybiBSZXN1bHQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgordWludDMyX3QgRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0U3ltYm9sQWxpZ25tZW50KERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IHsKKyAgY29uc3QgRWxmX1N5bSAqU3ltID0gZ2V0U3ltYm9sKFN5bWIpOworICBpZiAoU3ltLT5zdF9zaG5keCA9PSBFTEY6OlNITl9DT01NT04pCisgICAgcmV0dXJuIFN5bS0+c3RfdmFsdWU7CisgIHJldHVybiAwOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3VpbnQxNl90IEVMRk9iamVjdEZpbGU8RUxGVD46OmdldEVNYWNoaW5lKCkgY29uc3QgeworICByZXR1cm4gRUYuZ2V0SGVhZGVyKCktPmVfbWFjaGluZTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+Cit1aW50NjRfdCBFTEZPYmplY3RGaWxlPEVMRlQ+OjpnZXRTeW1ib2xTaXplKERhdGFSZWZJbXBsIFN5bSkgY29uc3QgeworICByZXR1cm4gZ2V0U3ltYm9sKFN5bSktPnN0X3NpemU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgordWludDY0X3QgRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0Q29tbW9uU3ltYm9sU2l6ZUltcGwoRGF0YVJlZkltcGwgU3ltYikgY29uc3QgeworICByZXR1cm4gZ2V0U3ltYm9sKFN5bWIpLT5zdF9zaXplOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3VpbnQ4X3QgRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0U3ltYm9sT3RoZXIoRGF0YVJlZkltcGwgU3ltYikgY29uc3QgeworICByZXR1cm4gZ2V0U3ltYm9sKFN5bWIpLT5zdF9vdGhlcjsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+Cit1aW50OF90IEVMRk9iamVjdEZpbGU8RUxGVD46OmdldFN5bWJvbEVMRlR5cGUoRGF0YVJlZkltcGwgU3ltYikgY29uc3QgeworICByZXR1cm4gZ2V0U3ltYm9sKFN5bWIpLT5nZXRUeXBlKCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorRXhwZWN0ZWQ8U3ltYm9sUmVmOjpUeXBlPgorRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0U3ltYm9sVHlwZShEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCB7CisgIGNvbnN0IEVsZl9TeW0gKkVTeW0gPSBnZXRTeW1ib2woU3ltYik7CisKKyAgc3dpdGNoIChFU3ltLT5nZXRUeXBlKCkpIHsKKyAgY2FzZSBFTEY6OlNUVF9OT1RZUEU6CisgICAgcmV0dXJuIFN5bWJvbFJlZjo6U1RfVW5rbm93bjsKKyAgY2FzZSBFTEY6OlNUVF9TRUNUSU9OOgorICAgIHJldHVybiBTeW1ib2xSZWY6OlNUX0RlYnVnOworICBjYXNlIEVMRjo6U1RUX0ZJTEU6CisgICAgcmV0dXJuIFN5bWJvbFJlZjo6U1RfRmlsZTsKKyAgY2FzZSBFTEY6OlNUVF9GVU5DOgorICAgIHJldHVybiBTeW1ib2xSZWY6OlNUX0Z1bmN0aW9uOworICBjYXNlIEVMRjo6U1RUX09CSkVDVDoKKyAgY2FzZSBFTEY6OlNUVF9DT01NT046CisgIGNhc2UgRUxGOjpTVFRfVExTOgorICAgIHJldHVybiBTeW1ib2xSZWY6OlNUX0RhdGE7CisgIGRlZmF1bHQ6CisgICAgcmV0dXJuIFN5bWJvbFJlZjo6U1RfT3RoZXI7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+Cit1aW50MzJfdCBFTEZPYmplY3RGaWxlPEVMRlQ+OjpnZXRTeW1ib2xGbGFncyhEYXRhUmVmSW1wbCBTeW0pIGNvbnN0IHsKKyAgY29uc3QgRWxmX1N5bSAqRVN5bSA9IGdldFN5bWJvbChTeW0pOworCisgIHVpbnQzMl90IFJlc3VsdCA9IFN5bWJvbFJlZjo6U0ZfTm9uZTsKKworICBpZiAoRVN5bS0+Z2V0QmluZGluZygpICE9IEVMRjo6U1RCX0xPQ0FMKQorICAgIFJlc3VsdCB8PSBTeW1ib2xSZWY6OlNGX0dsb2JhbDsKKworICBpZiAoRVN5bS0+Z2V0QmluZGluZygpID09IEVMRjo6U1RCX1dFQUspCisgICAgUmVzdWx0IHw9IFN5bWJvbFJlZjo6U0ZfV2VhazsKKworICBpZiAoRVN5bS0+c3Rfc2huZHggPT0gRUxGOjpTSE5fQUJTKQorICAgIFJlc3VsdCB8PSBTeW1ib2xSZWY6OlNGX0Fic29sdXRlOworCisgIGlmIChFU3ltLT5nZXRUeXBlKCkgPT0gRUxGOjpTVFRfRklMRSB8fCBFU3ltLT5nZXRUeXBlKCkgPT0gRUxGOjpTVFRfU0VDVElPTikKKyAgICBSZXN1bHQgfD0gU3ltYm9sUmVmOjpTRl9Gb3JtYXRTcGVjaWZpYzsKKworICBhdXRvIERvdFN5bXRhYlNlY1N5bXMgPSBFRi5zeW1ib2xzKERvdFN5bXRhYlNlYyk7CisgIGlmIChEb3RTeW10YWJTZWNTeW1zICYmIEVTeW0gPT0gKCpEb3RTeW10YWJTZWNTeW1zKS5iZWdpbigpKQorICAgIFJlc3VsdCB8PSBTeW1ib2xSZWY6OlNGX0Zvcm1hdFNwZWNpZmljOworICBhdXRvIERvdER5blN5bVNlY1N5bXMgPSBFRi5zeW1ib2xzKERvdER5blN5bVNlYyk7CisgIGlmIChEb3REeW5TeW1TZWNTeW1zICYmIEVTeW0gPT0gKCpEb3REeW5TeW1TZWNTeW1zKS5iZWdpbigpKQorICAgIFJlc3VsdCB8PSBTeW1ib2xSZWY6OlNGX0Zvcm1hdFNwZWNpZmljOworCisgIGlmIChFRi5nZXRIZWFkZXIoKS0+ZV9tYWNoaW5lID09IEVMRjo6RU1fQVJNKSB7CisgICAgaWYgKEV4cGVjdGVkPFN0cmluZ1JlZj4gTmFtZU9yRXJyID0gZ2V0U3ltYm9sTmFtZShTeW0pKSB7CisgICAgICBTdHJpbmdSZWYgTmFtZSA9ICpOYW1lT3JFcnI7CisgICAgICBpZiAoTmFtZS5zdGFydHN3aXRoKCIkZCIpIHx8IE5hbWUuc3RhcnRzd2l0aCgiJHQiKSB8fAorICAgICAgICAgIE5hbWUuc3RhcnRzd2l0aCgiJGEiKSkKKyAgICAgICAgUmVzdWx0IHw9IFN5bWJvbFJlZjo6U0ZfRm9ybWF0U3BlY2lmaWM7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIFRPRE86IEFjdHVhbGx5IHJlcG9ydCBlcnJvcnMgaGVscGZ1bGx5LgorICAgICAgY29uc3VtZUVycm9yKE5hbWVPckVyci50YWtlRXJyb3IoKSk7CisgICAgfQorICAgIGlmIChFU3ltLT5nZXRUeXBlKCkgPT0gRUxGOjpTVFRfRlVOQyAmJiAoRVN5bS0+c3RfdmFsdWUgJiAxKSA9PSAxKQorICAgICAgUmVzdWx0IHw9IFN5bWJvbFJlZjo6U0ZfVGh1bWI7CisgIH0KKworICBpZiAoRVN5bS0+c3Rfc2huZHggPT0gRUxGOjpTSE5fVU5ERUYpCisgICAgUmVzdWx0IHw9IFN5bWJvbFJlZjo6U0ZfVW5kZWZpbmVkOworCisgIGlmIChFU3ltLT5nZXRUeXBlKCkgPT0gRUxGOjpTVFRfQ09NTU9OIHx8IEVTeW0tPnN0X3NobmR4ID09IEVMRjo6U0hOX0NPTU1PTikKKyAgICBSZXN1bHQgfD0gU3ltYm9sUmVmOjpTRl9Db21tb247CisKKyAgaWYgKGlzRXhwb3J0ZWRUb090aGVyRFNPKEVTeW0pKQorICAgIFJlc3VsdCB8PSBTeW1ib2xSZWY6OlNGX0V4cG9ydGVkOworCisgIGlmIChFU3ltLT5nZXRWaXNpYmlsaXR5KCkgPT0gRUxGOjpTVFZfSElEREVOKQorICAgIFJlc3VsdCB8PSBTeW1ib2xSZWY6OlNGX0hpZGRlbjsKKworICByZXR1cm4gUmVzdWx0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK0V4cGVjdGVkPHNlY3Rpb25faXRlcmF0b3I+CitFTEZPYmplY3RGaWxlPEVMRlQ+OjpnZXRTeW1ib2xTZWN0aW9uKGNvbnN0IEVsZl9TeW0gKkVTeW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVsZl9TaGRyICpTeW1UYWIpIGNvbnN0IHsKKyAgYXV0byBFU2VjT3JFcnIgPSBFRi5nZXRTZWN0aW9uKEVTeW0sIFN5bVRhYiwgU2huZHhUYWJsZSk7CisgIGlmICghRVNlY09yRXJyKQorICAgIHJldHVybiBFU2VjT3JFcnIudGFrZUVycm9yKCk7CisKKyAgY29uc3QgRWxmX1NoZHIgKkVTZWMgPSAqRVNlY09yRXJyOworICBpZiAoIUVTZWMpCisgICAgcmV0dXJuIHNlY3Rpb25fZW5kKCk7CisKKyAgRGF0YVJlZkltcGwgU2VjOworICBTZWMucCA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KEVTZWMpOworICByZXR1cm4gc2VjdGlvbl9pdGVyYXRvcihTZWN0aW9uUmVmKFNlYywgdGhpcykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK0V4cGVjdGVkPHNlY3Rpb25faXRlcmF0b3I+CitFTEZPYmplY3RGaWxlPEVMRlQ+OjpnZXRTeW1ib2xTZWN0aW9uKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IHsKKyAgY29uc3QgRWxmX1N5bSAqU3ltID0gZ2V0U3ltYm9sKFN5bWIpOworICBhdXRvIFN5bVRhYk9yRXJyID0gRUYuZ2V0U2VjdGlvbihTeW1iLmQuYSk7CisgIGlmICghU3ltVGFiT3JFcnIpCisgICAgcmV0dXJuIFN5bVRhYk9yRXJyLnRha2VFcnJvcigpOworICBjb25zdCBFbGZfU2hkciAqU3ltVGFiID0gKlN5bVRhYk9yRXJyOworICByZXR1cm4gZ2V0U3ltYm9sU2VjdGlvbihTeW0sIFN5bVRhYik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgordm9pZCBFTEZPYmplY3RGaWxlPEVMRlQ+Ojptb3ZlU2VjdGlvbk5leHQoRGF0YVJlZkltcGwgJlNlYykgY29uc3QgeworICBjb25zdCBFbGZfU2hkciAqRVNlYyA9IGdldFNlY3Rpb24oU2VjKTsKKyAgU2VjID0gdG9EUkkoKytFU2VjKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitzdGQ6OmVycm9yX2NvZGUgRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0U2VjdGlvbk5hbWUoRGF0YVJlZkltcGwgU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiAmUmVzdWx0KSBjb25zdCB7CisgIGF1dG8gTmFtZSA9IEVGLmdldFNlY3Rpb25OYW1lKCYqZ2V0U2VjdGlvbihTZWMpKTsKKyAgaWYgKCFOYW1lKQorICAgIHJldHVybiBlcnJvclRvRXJyb3JDb2RlKE5hbWUudGFrZUVycm9yKCkpOworICBSZXN1bHQgPSAqTmFtZTsKKyAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3VpbnQ2NF90IEVMRk9iamVjdEZpbGU8RUxGVD46OmdldFNlY3Rpb25BZGRyZXNzKERhdGFSZWZJbXBsIFNlYykgY29uc3QgeworICByZXR1cm4gZ2V0U2VjdGlvbihTZWMpLT5zaF9hZGRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3VpbnQ2NF90IEVMRk9iamVjdEZpbGU8RUxGVD46OmdldFNlY3Rpb25JbmRleChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IHsKKyAgYXV0byBTZWN0aW9uc09yRXJyID0gRUYuc2VjdGlvbnMoKTsKKyAgaGFuZGxlQWxsRXJyb3JzKHN0ZDo6bW92ZShTZWN0aW9uc09yRXJyLnRha2VFcnJvcigpKSwKKyAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IEVycm9ySW5mb0Jhc2UgJikgeworICAgICAgICAgICAgICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJ1bmFibGUgdG8gZ2V0IHNlY3Rpb24gaW5kZXgiKTsKKyAgICAgICAgICAgICAgICAgIH0pOworICBjb25zdCBFbGZfU2hkciAqRmlyc3QgPSBTZWN0aW9uc09yRXJyLT5iZWdpbigpOworICByZXR1cm4gZ2V0U2VjdGlvbihTZWMpIC0gRmlyc3Q7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgordWludDY0X3QgRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0U2VjdGlvblNpemUoRGF0YVJlZkltcGwgU2VjKSBjb25zdCB7CisgIHJldHVybiBnZXRTZWN0aW9uKFNlYyktPnNoX3NpemU7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorc3RkOjplcnJvcl9jb2RlCitFTEZPYmplY3RGaWxlPEVMRlQ+OjpnZXRTZWN0aW9uQ29udGVudHMoRGF0YVJlZkltcGwgU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiAmUmVzdWx0KSBjb25zdCB7CisgIGNvbnN0IEVsZl9TaGRyICpFU2hkciA9IGdldFNlY3Rpb24oU2VjKTsKKyAgaWYgKHN0ZDo6ZXJyb3JfY29kZSBFQyA9CisgICAgICAgICAgY2hlY2tPZmZzZXQoZ2V0TWVtb3J5QnVmZmVyUmVmKCksCisgICAgICAgICAgICAgICAgICAgICAgKHVpbnRwdHJfdCliYXNlKCkgKyBFU2hkci0+c2hfb2Zmc2V0LCBFU2hkci0+c2hfc2l6ZSkpCisgICAgcmV0dXJuIEVDOworICBSZXN1bHQgPSBTdHJpbmdSZWYoKGNvbnN0IGNoYXIgKiliYXNlKCkgKyBFU2hkci0+c2hfb2Zmc2V0LCBFU2hkci0+c2hfc2l6ZSk7CisgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+Cit1aW50NjRfdCBFTEZPYmplY3RGaWxlPEVMRlQ+OjpnZXRTZWN0aW9uQWxpZ25tZW50KERhdGFSZWZJbXBsIFNlYykgY29uc3QgeworICByZXR1cm4gZ2V0U2VjdGlvbihTZWMpLT5zaF9hZGRyYWxpZ247Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorYm9vbCBFTEZPYmplY3RGaWxlPEVMRlQ+Ojppc1NlY3Rpb25Db21wcmVzc2VkKERhdGFSZWZJbXBsIFNlYykgY29uc3QgeworICByZXR1cm4gZ2V0U2VjdGlvbihTZWMpLT5zaF9mbGFncyAmIEVMRjo6U0hGX0NPTVBSRVNTRUQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorYm9vbCBFTEZPYmplY3RGaWxlPEVMRlQ+Ojppc1NlY3Rpb25UZXh0KERhdGFSZWZJbXBsIFNlYykgY29uc3QgeworICByZXR1cm4gZ2V0U2VjdGlvbihTZWMpLT5zaF9mbGFncyAmIEVMRjo6U0hGX0VYRUNJTlNUUjsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+Citib29sIEVMRk9iamVjdEZpbGU8RUxGVD46OmlzU2VjdGlvbkRhdGEoRGF0YVJlZkltcGwgU2VjKSBjb25zdCB7CisgIGNvbnN0IEVsZl9TaGRyICpFU2hkciA9IGdldFNlY3Rpb24oU2VjKTsKKyAgcmV0dXJuIEVTaGRyLT5zaF9mbGFncyAmIChFTEY6OlNIRl9BTExPQyB8IEVMRjo6U0hGX1dSSVRFKSAmJgorICAgICAgICAgRVNoZHItPnNoX3R5cGUgPT0gRUxGOjpTSFRfUFJPR0JJVFM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorYm9vbCBFTEZPYmplY3RGaWxlPEVMRlQ+Ojppc1NlY3Rpb25CU1MoRGF0YVJlZkltcGwgU2VjKSBjb25zdCB7CisgIGNvbnN0IEVsZl9TaGRyICpFU2hkciA9IGdldFNlY3Rpb24oU2VjKTsKKyAgcmV0dXJuIEVTaGRyLT5zaF9mbGFncyAmIChFTEY6OlNIRl9BTExPQyB8IEVMRjo6U0hGX1dSSVRFKSAmJgorICAgICAgICAgRVNoZHItPnNoX3R5cGUgPT0gRUxGOjpTSFRfTk9CSVRTOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK2Jvb2wgRUxGT2JqZWN0RmlsZTxFTEZUPjo6aXNTZWN0aW9uVmlydHVhbChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IHsKKyAgcmV0dXJuIGdldFNlY3Rpb24oU2VjKS0+c2hfdHlwZSA9PSBFTEY6OlNIVF9OT0JJVFM7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorcmVsb2NhdGlvbl9pdGVyYXRvcgorRUxGT2JqZWN0RmlsZTxFTEZUPjo6c2VjdGlvbl9yZWxfYmVnaW4oRGF0YVJlZkltcGwgU2VjKSBjb25zdCB7CisgIERhdGFSZWZJbXBsIFJlbERhdGE7CisgIGF1dG8gU2VjdGlvbnNPckVyciA9IEVGLnNlY3Rpb25zKCk7CisgIGlmICghU2VjdGlvbnNPckVycikKKyAgICByZXR1cm4gcmVsb2NhdGlvbl9pdGVyYXRvcihSZWxvY2F0aW9uUmVmKCkpOworICB1aW50cHRyX3QgU0hUID0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KCgqU2VjdGlvbnNPckVycikuYmVnaW4oKSk7CisgIFJlbERhdGEuZC5hID0gKFNlYy5wIC0gU0hUKSAvIEVGLmdldEhlYWRlcigpLT5lX3NoZW50c2l6ZTsKKyAgUmVsRGF0YS5kLmIgPSAwOworICByZXR1cm4gcmVsb2NhdGlvbl9pdGVyYXRvcihSZWxvY2F0aW9uUmVmKFJlbERhdGEsIHRoaXMpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CityZWxvY2F0aW9uX2l0ZXJhdG9yCitFTEZPYmplY3RGaWxlPEVMRlQ+OjpzZWN0aW9uX3JlbF9lbmQoRGF0YVJlZkltcGwgU2VjKSBjb25zdCB7CisgIGNvbnN0IEVsZl9TaGRyICpTID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFbGZfU2hkciAqPihTZWMucCk7CisgIHJlbG9jYXRpb25faXRlcmF0b3IgQmVnaW4gPSBzZWN0aW9uX3JlbF9iZWdpbihTZWMpOworICBpZiAoUy0+c2hfdHlwZSAhPSBFTEY6OlNIVF9SRUxBICYmIFMtPnNoX3R5cGUgIT0gRUxGOjpTSFRfUkVMKQorICAgIHJldHVybiBCZWdpbjsKKyAgRGF0YVJlZkltcGwgUmVsRGF0YSA9IEJlZ2luLT5nZXRSYXdEYXRhUmVmSW1wbCgpOworICBjb25zdCBFbGZfU2hkciAqUmVsU2VjID0gZ2V0UmVsU2VjdGlvbihSZWxEYXRhKTsKKworICAvLyBFcnJvciBjaGVjayBzaF9saW5rIGhlcmUgc28gdGhhdCBnZXRSZWxvY2F0aW9uU3ltYm9sIGNhbiBqdXN0IHVzZSBpdC4KKyAgYXV0byBTeW1TZWNPckVyciA9IEVGLmdldFNlY3Rpb24oUmVsU2VjLT5zaF9saW5rKTsKKyAgaWYgKCFTeW1TZWNPckVycikKKyAgICByZXBvcnRfZmF0YWxfZXJyb3IoZXJyb3JUb0Vycm9yQ29kZShTeW1TZWNPckVyci50YWtlRXJyb3IoKSkubWVzc2FnZSgpKTsKKworICBSZWxEYXRhLmQuYiArPSBTLT5zaF9zaXplIC8gUy0+c2hfZW50c2l6ZTsKKyAgcmV0dXJuIHJlbG9jYXRpb25faXRlcmF0b3IoUmVsb2NhdGlvblJlZihSZWxEYXRhLCB0aGlzKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorc2VjdGlvbl9pdGVyYXRvcgorRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0UmVsb2NhdGVkU2VjdGlvbihEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IHsKKyAgaWYgKEVGLmdldEhlYWRlcigpLT5lX3R5cGUgIT0gRUxGOjpFVF9SRUwpCisgICAgcmV0dXJuIHNlY3Rpb25fZW5kKCk7CisKKyAgY29uc3QgRWxmX1NoZHIgKkVTaGRyID0gZ2V0U2VjdGlvbihTZWMpOworICB1aW50WF90IFR5cGUgPSBFU2hkci0+c2hfdHlwZTsKKyAgaWYgKFR5cGUgIT0gRUxGOjpTSFRfUkVMICYmIFR5cGUgIT0gRUxGOjpTSFRfUkVMQSkKKyAgICByZXR1cm4gc2VjdGlvbl9lbmQoKTsKKworICBhdXRvIFIgPSBFRi5nZXRTZWN0aW9uKEVTaGRyLT5zaF9pbmZvKTsKKyAgaWYgKCFSKQorICAgIHJlcG9ydF9mYXRhbF9lcnJvcihlcnJvclRvRXJyb3JDb2RlKFIudGFrZUVycm9yKCkpLm1lc3NhZ2UoKSk7CisgIHJldHVybiBzZWN0aW9uX2l0ZXJhdG9yKFNlY3Rpb25SZWYodG9EUkkoKlIpLCB0aGlzKSk7Cit9CisKKy8vIFJlbG9jYXRpb25zCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3ZvaWQgRUxGT2JqZWN0RmlsZTxFTEZUPjo6bW92ZVJlbG9jYXRpb25OZXh0KERhdGFSZWZJbXBsICZSZWwpIGNvbnN0IHsKKyAgKytSZWwuZC5iOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3N5bWJvbF9pdGVyYXRvcgorRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0UmVsb2NhdGlvblN5bWJvbChEYXRhUmVmSW1wbCBSZWwpIGNvbnN0IHsKKyAgdWludDMyX3Qgc3ltYm9sSWR4OworICBjb25zdCBFbGZfU2hkciAqc2VjID0gZ2V0UmVsU2VjdGlvbihSZWwpOworICBpZiAoc2VjLT5zaF90eXBlID09IEVMRjo6U0hUX1JFTCkKKyAgICBzeW1ib2xJZHggPSBnZXRSZWwoUmVsKS0+Z2V0U3ltYm9sKEVGLmlzTWlwczY0RUwoKSk7CisgIGVsc2UKKyAgICBzeW1ib2xJZHggPSBnZXRSZWxhKFJlbCktPmdldFN5bWJvbChFRi5pc01pcHM2NEVMKCkpOworICBpZiAoIXN5bWJvbElkeCkKKyAgICByZXR1cm4gc3ltYm9sX2VuZCgpOworCisgIC8vIEZJWE1FOiBlcnJvciBjaGVjayBzeW1ib2xJZHgKKyAgRGF0YVJlZkltcGwgU3ltYm9sRGF0YTsKKyAgU3ltYm9sRGF0YS5kLmEgPSBzZWMtPnNoX2xpbms7CisgIFN5bWJvbERhdGEuZC5iID0gc3ltYm9sSWR4OworICByZXR1cm4gc3ltYm9sX2l0ZXJhdG9yKFN5bWJvbFJlZihTeW1ib2xEYXRhLCB0aGlzKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgordWludDY0X3QgRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0UmVsb2NhdGlvbk9mZnNldChEYXRhUmVmSW1wbCBSZWwpIGNvbnN0IHsKKyAgYXNzZXJ0KEVGLmdldEhlYWRlcigpLT5lX3R5cGUgPT0gRUxGOjpFVF9SRUwgJiYKKyAgICAgICAgICJPbmx5IHJlbG9jYXRhYmxlIG9iamVjdCBmaWxlcyBoYXZlIHJlbG9jYXRpb24gb2Zmc2V0cyIpOworICBjb25zdCBFbGZfU2hkciAqc2VjID0gZ2V0UmVsU2VjdGlvbihSZWwpOworICBpZiAoc2VjLT5zaF90eXBlID09IEVMRjo6U0hUX1JFTCkKKyAgICByZXR1cm4gZ2V0UmVsKFJlbCktPnJfb2Zmc2V0OworCisgIHJldHVybiBnZXRSZWxhKFJlbCktPnJfb2Zmc2V0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3VpbnQ2NF90IEVMRk9iamVjdEZpbGU8RUxGVD46OmdldFJlbG9jYXRpb25UeXBlKERhdGFSZWZJbXBsIFJlbCkgY29uc3QgeworICBjb25zdCBFbGZfU2hkciAqc2VjID0gZ2V0UmVsU2VjdGlvbihSZWwpOworICBpZiAoc2VjLT5zaF90eXBlID09IEVMRjo6U0hUX1JFTCkKKyAgICByZXR1cm4gZ2V0UmVsKFJlbCktPmdldFR5cGUoRUYuaXNNaXBzNjRFTCgpKTsKKyAgZWxzZQorICAgIHJldHVybiBnZXRSZWxhKFJlbCktPmdldFR5cGUoRUYuaXNNaXBzNjRFTCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitTdHJpbmdSZWYgRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0UmVsb2NhdGlvblR5cGVOYW1lKHVpbnQzMl90IFR5cGUpIGNvbnN0IHsKKyAgcmV0dXJuIGdldEVMRlJlbG9jYXRpb25UeXBlTmFtZShFRi5nZXRIZWFkZXIoKS0+ZV9tYWNoaW5lLCBUeXBlKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+Cit2b2lkIEVMRk9iamVjdEZpbGU8RUxGVD46OmdldFJlbG9jYXRpb25UeXBlTmFtZSgKKyAgICBEYXRhUmVmSW1wbCBSZWwsIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzdWx0KSBjb25zdCB7CisgIHVpbnQzMl90IHR5cGUgPSBnZXRSZWxvY2F0aW9uVHlwZShSZWwpOworICBFRi5nZXRSZWxvY2F0aW9uVHlwZU5hbWUodHlwZSwgUmVzdWx0KTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitFeHBlY3RlZDxpbnQ2NF90PgorRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0UmVsb2NhdGlvbkFkZGVuZChEYXRhUmVmSW1wbCBSZWwpIGNvbnN0IHsKKyAgaWYgKGdldFJlbFNlY3Rpb24oUmVsKS0+c2hfdHlwZSAhPSBFTEY6OlNIVF9SRUxBKQorICAgIHJldHVybiBjcmVhdGVFcnJvcigiU2VjdGlvbiBpcyBub3QgU0hUX1JFTEEiKTsKKyAgcmV0dXJuIChpbnQ2NF90KWdldFJlbGEoUmVsKS0+cl9hZGRlbmQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorY29uc3QgdHlwZW5hbWUgRUxGT2JqZWN0RmlsZTxFTEZUPjo6RWxmX1JlbCAqCitFTEZPYmplY3RGaWxlPEVMRlQ+OjpnZXRSZWwoRGF0YVJlZkltcGwgUmVsKSBjb25zdCB7CisgIGFzc2VydChnZXRSZWxTZWN0aW9uKFJlbCktPnNoX3R5cGUgPT0gRUxGOjpTSFRfUkVMKTsKKyAgYXV0byBSZXQgPSBFRi50ZW1wbGF0ZSBnZXRFbnRyeTxFbGZfUmVsPihSZWwuZC5hLCBSZWwuZC5iKTsKKyAgaWYgKCFSZXQpCisgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKGVycm9yVG9FcnJvckNvZGUoUmV0LnRha2VFcnJvcigpKS5tZXNzYWdlKCkpOworICByZXR1cm4gKlJldDsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+Citjb25zdCB0eXBlbmFtZSBFTEZPYmplY3RGaWxlPEVMRlQ+OjpFbGZfUmVsYSAqCitFTEZPYmplY3RGaWxlPEVMRlQ+OjpnZXRSZWxhKERhdGFSZWZJbXBsIFJlbGEpIGNvbnN0IHsKKyAgYXNzZXJ0KGdldFJlbFNlY3Rpb24oUmVsYSktPnNoX3R5cGUgPT0gRUxGOjpTSFRfUkVMQSk7CisgIGF1dG8gUmV0ID0gRUYudGVtcGxhdGUgZ2V0RW50cnk8RWxmX1JlbGE+KFJlbGEuZC5hLCBSZWxhLmQuYik7CisgIGlmICghUmV0KQorICAgIHJlcG9ydF9mYXRhbF9lcnJvcihlcnJvclRvRXJyb3JDb2RlKFJldC50YWtlRXJyb3IoKSkubWVzc2FnZSgpKTsKKyAgcmV0dXJuICpSZXQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorRXhwZWN0ZWQ8RUxGT2JqZWN0RmlsZTxFTEZUPj4KK0VMRk9iamVjdEZpbGU8RUxGVD46OmNyZWF0ZShNZW1vcnlCdWZmZXJSZWYgT2JqZWN0KSB7CisgIGF1dG8gRUZPckVyciA9IEVMRkZpbGU8RUxGVD46OmNyZWF0ZShPYmplY3QuZ2V0QnVmZmVyKCkpOworICBpZiAoRXJyb3IgRSA9IEVGT3JFcnIudGFrZUVycm9yKCkpCisgICAgcmV0dXJuIHN0ZDo6bW92ZShFKTsKKyAgYXV0byBFRiA9IHN0ZDo6bW92ZSgqRUZPckVycik7CisKKyAgYXV0byBTZWN0aW9uc09yRXJyID0gRUYuc2VjdGlvbnMoKTsKKyAgaWYgKCFTZWN0aW9uc09yRXJyKQorICAgIHJldHVybiBTZWN0aW9uc09yRXJyLnRha2VFcnJvcigpOworCisgIGNvbnN0IEVsZl9TaGRyICpEb3REeW5TeW1TZWMgPSBudWxscHRyOworICBjb25zdCBFbGZfU2hkciAqRG90U3ltdGFiU2VjID0gbnVsbHB0cjsKKyAgQXJyYXlSZWY8RWxmX1dvcmQ+IFNobmR4VGFibGU7CisgIGZvciAoY29uc3QgRWxmX1NoZHIgJlNlYyA6ICpTZWN0aW9uc09yRXJyKSB7CisgICAgc3dpdGNoIChTZWMuc2hfdHlwZSkgeworICAgIGNhc2UgRUxGOjpTSFRfRFlOU1lNOiB7CisgICAgICBpZiAoRG90RHluU3ltU2VjKQorICAgICAgICByZXR1cm4gY3JlYXRlRXJyb3IoIk1vcmUgdGhhbiBvbmUgZHluYW1pYyBzeW1ib2wgdGFibGUhIik7CisgICAgICBEb3REeW5TeW1TZWMgPSAmU2VjOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRUxGOjpTSFRfU1lNVEFCOiB7CisgICAgICBpZiAoRG90U3ltdGFiU2VjKQorICAgICAgICByZXR1cm4gY3JlYXRlRXJyb3IoIk1vcmUgdGhhbiBvbmUgc3RhdGljIHN5bWJvbCB0YWJsZSEiKTsKKyAgICAgIERvdFN5bXRhYlNlYyA9ICZTZWM7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBFTEY6OlNIVF9TWU1UQUJfU0hORFg6IHsKKyAgICAgIGF1dG8gVGFibGVPckVyciA9IEVGLmdldFNITkRYVGFibGUoU2VjKTsKKyAgICAgIGlmICghVGFibGVPckVycikKKyAgICAgICAgcmV0dXJuIFRhYmxlT3JFcnIudGFrZUVycm9yKCk7CisgICAgICBTaG5keFRhYmxlID0gKlRhYmxlT3JFcnI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgfQorICB9CisgIHJldHVybiBFTEZPYmplY3RGaWxlPEVMRlQ+KE9iamVjdCwgRUYsIERvdER5blN5bVNlYywgRG90U3ltdGFiU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaG5keFRhYmxlKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitFTEZPYmplY3RGaWxlPEVMRlQ+OjpFTEZPYmplY3RGaWxlKE1lbW9yeUJ1ZmZlclJlZiBPYmplY3QsIEVMRkZpbGU8RUxGVD4gRUYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVsZl9TaGRyICpEb3REeW5TeW1TZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVsZl9TaGRyICpEb3RTeW10YWJTZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEVsZl9Xb3JkPiBTaG5keFRhYmxlKQorICAgIDogRUxGT2JqZWN0RmlsZUJhc2UoCisgICAgICAgICAgZ2V0RUxGVHlwZShFTEZUOjpUYXJnZXRFbmRpYW5uZXNzID09IHN1cHBvcnQ6OmxpdHRsZSwgRUxGVDo6SXM2NEJpdHMpLAorICAgICAgICAgIE9iamVjdCksCisgICAgICBFRihFRiksIERvdER5blN5bVNlYyhEb3REeW5TeW1TZWMpLCBEb3RTeW10YWJTZWMoRG90U3ltdGFiU2VjKSwKKyAgICAgIFNobmR4VGFibGUoU2huZHhUYWJsZSkge30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitFTEZPYmplY3RGaWxlPEVMRlQ+OjpFTEZPYmplY3RGaWxlKEVMRk9iamVjdEZpbGU8RUxGVD4gJiZPdGhlcikKKyAgICA6IEVMRk9iamVjdEZpbGUoT3RoZXIuRGF0YSwgT3RoZXIuRUYsIE90aGVyLkRvdER5blN5bVNlYywKKyAgICAgICAgICAgICAgICAgICAgT3RoZXIuRG90U3ltdGFiU2VjLCBPdGhlci5TaG5keFRhYmxlKSB7fQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK2Jhc2ljX3N5bWJvbF9pdGVyYXRvciBFTEZPYmplY3RGaWxlPEVMRlQ+OjpzeW1ib2xfYmVnaW4oKSBjb25zdCB7CisgIERhdGFSZWZJbXBsIFN5bSA9IHRvRFJJKERvdFN5bXRhYlNlYywgMCk7CisgIHJldHVybiBiYXNpY19zeW1ib2xfaXRlcmF0b3IoU3ltYm9sUmVmKFN5bSwgdGhpcykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK2Jhc2ljX3N5bWJvbF9pdGVyYXRvciBFTEZPYmplY3RGaWxlPEVMRlQ+OjpzeW1ib2xfZW5kKCkgY29uc3QgeworICBjb25zdCBFbGZfU2hkciAqU3ltVGFiID0gRG90U3ltdGFiU2VjOworICBpZiAoIVN5bVRhYikKKyAgICByZXR1cm4gc3ltYm9sX2JlZ2luKCk7CisgIERhdGFSZWZJbXBsIFN5bSA9IHRvRFJJKFN5bVRhYiwgU3ltVGFiLT5zaF9zaXplIC8gc2l6ZW9mKEVsZl9TeW0pKTsKKyAgcmV0dXJuIGJhc2ljX3N5bWJvbF9pdGVyYXRvcihTeW1ib2xSZWYoU3ltLCB0aGlzKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorZWxmX3N5bWJvbF9pdGVyYXRvciBFTEZPYmplY3RGaWxlPEVMRlQ+OjpkeW5hbWljX3N5bWJvbF9iZWdpbigpIGNvbnN0IHsKKyAgRGF0YVJlZkltcGwgU3ltID0gdG9EUkkoRG90RHluU3ltU2VjLCAwKTsKKyAgcmV0dXJuIHN5bWJvbF9pdGVyYXRvcihTeW1ib2xSZWYoU3ltLCB0aGlzKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorZWxmX3N5bWJvbF9pdGVyYXRvciBFTEZPYmplY3RGaWxlPEVMRlQ+OjpkeW5hbWljX3N5bWJvbF9lbmQoKSBjb25zdCB7CisgIGNvbnN0IEVsZl9TaGRyICpTeW1UYWIgPSBEb3REeW5TeW1TZWM7CisgIGlmICghU3ltVGFiKQorICAgIHJldHVybiBkeW5hbWljX3N5bWJvbF9iZWdpbigpOworICBEYXRhUmVmSW1wbCBTeW0gPSB0b0RSSShTeW1UYWIsIFN5bVRhYi0+c2hfc2l6ZSAvIHNpemVvZihFbGZfU3ltKSk7CisgIHJldHVybiBiYXNpY19zeW1ib2xfaXRlcmF0b3IoU3ltYm9sUmVmKFN5bSwgdGhpcykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3NlY3Rpb25faXRlcmF0b3IgRUxGT2JqZWN0RmlsZTxFTEZUPjo6c2VjdGlvbl9iZWdpbigpIGNvbnN0IHsKKyAgYXV0byBTZWN0aW9uc09yRXJyID0gRUYuc2VjdGlvbnMoKTsKKyAgaWYgKCFTZWN0aW9uc09yRXJyKQorICAgIHJldHVybiBzZWN0aW9uX2l0ZXJhdG9yKFNlY3Rpb25SZWYoKSk7CisgIHJldHVybiBzZWN0aW9uX2l0ZXJhdG9yKFNlY3Rpb25SZWYodG9EUkkoKCpTZWN0aW9uc09yRXJyKS5iZWdpbigpKSwgdGhpcykpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3NlY3Rpb25faXRlcmF0b3IgRUxGT2JqZWN0RmlsZTxFTEZUPjo6c2VjdGlvbl9lbmQoKSBjb25zdCB7CisgIGF1dG8gU2VjdGlvbnNPckVyciA9IEVGLnNlY3Rpb25zKCk7CisgIGlmICghU2VjdGlvbnNPckVycikKKyAgICByZXR1cm4gc2VjdGlvbl9pdGVyYXRvcihTZWN0aW9uUmVmKCkpOworICByZXR1cm4gc2VjdGlvbl9pdGVyYXRvcihTZWN0aW9uUmVmKHRvRFJJKCgqU2VjdGlvbnNPckVycikuZW5kKCkpLCB0aGlzKSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgordWludDhfdCBFTEZPYmplY3RGaWxlPEVMRlQ+OjpnZXRCeXRlc0luQWRkcmVzcygpIGNvbnN0IHsKKyAgcmV0dXJuIEVMRlQ6OklzNjRCaXRzID8gOCA6IDQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorU3RyaW5nUmVmIEVMRk9iamVjdEZpbGU8RUxGVD46OmdldEZpbGVGb3JtYXROYW1lKCkgY29uc3QgeworICBib29sIElzTGl0dGxlRW5kaWFuID0gRUxGVDo6VGFyZ2V0RW5kaWFubmVzcyA9PSBzdXBwb3J0OjpsaXR0bGU7CisgIHN3aXRjaCAoRUYuZ2V0SGVhZGVyKCktPmVfaWRlbnRbRUxGOjpFSV9DTEFTU10pIHsKKyAgY2FzZSBFTEY6OkVMRkNMQVNTMzI6CisgICAgc3dpdGNoIChFRi5nZXRIZWFkZXIoKS0+ZV9tYWNoaW5lKSB7CisgICAgY2FzZSBFTEY6OkVNXzM4NjoKKyAgICAgIHJldHVybiAiRUxGMzItaTM4NiI7CisgICAgY2FzZSBFTEY6OkVNX0lBTUNVOgorICAgICAgcmV0dXJuICJFTEYzMi1pYW1jdSI7CisgICAgY2FzZSBFTEY6OkVNX1g4Nl82NDoKKyAgICAgIHJldHVybiAiRUxGMzIteDg2LTY0IjsKKyAgICBjYXNlIEVMRjo6RU1fQVJNOgorICAgICAgcmV0dXJuIChJc0xpdHRsZUVuZGlhbiA/ICJFTEYzMi1hcm0tbGl0dGxlIiA6ICJFTEYzMi1hcm0tYmlnIik7CisgICAgY2FzZSBFTEY6OkVNX0FWUjoKKyAgICAgIHJldHVybiAiRUxGMzItYXZyIjsKKyAgICBjYXNlIEVMRjo6RU1fSEVYQUdPTjoKKyAgICAgIHJldHVybiAiRUxGMzItaGV4YWdvbiI7CisgICAgY2FzZSBFTEY6OkVNX0xBTkFJOgorICAgICAgcmV0dXJuICJFTEYzMi1sYW5haSI7CisgICAgY2FzZSBFTEY6OkVNX01JUFM6CisgICAgICByZXR1cm4gIkVMRjMyLW1pcHMiOworICAgIGNhc2UgRUxGOjpFTV9QUEM6CisgICAgICByZXR1cm4gIkVMRjMyLXBwYyI7CisgICAgY2FzZSBFTEY6OkVNX1JJU0NWOgorICAgICAgcmV0dXJuICJFTEYzMi1yaXNjdiI7CisgICAgY2FzZSBFTEY6OkVNX1NQQVJDOgorICAgIGNhc2UgRUxGOjpFTV9TUEFSQzMyUExVUzoKKyAgICAgIHJldHVybiAiRUxGMzItc3BhcmMiOworICAgIGNhc2UgRUxGOjpFTV9XRUJBU1NFTUJMWToKKyAgICAgIHJldHVybiAiRUxGMzItd2FzbSI7CisgICAgY2FzZSBFTEY6OkVNX0FNREdQVToKKyAgICAgIHJldHVybiAiRUxGMzItYW1kZ3B1IjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJFTEYzMi11bmtub3duIjsKKyAgICB9CisgIGNhc2UgRUxGOjpFTEZDTEFTUzY0OgorICAgIHN3aXRjaCAoRUYuZ2V0SGVhZGVyKCktPmVfbWFjaGluZSkgeworICAgIGNhc2UgRUxGOjpFTV8zODY6CisgICAgICByZXR1cm4gIkVMRjY0LWkzODYiOworICAgIGNhc2UgRUxGOjpFTV9YODZfNjQ6CisgICAgICByZXR1cm4gIkVMRjY0LXg4Ni02NCI7CisgICAgY2FzZSBFTEY6OkVNX0FBUkNINjQ6CisgICAgICByZXR1cm4gKElzTGl0dGxlRW5kaWFuID8gIkVMRjY0LWFhcmNoNjQtbGl0dGxlIiA6ICJFTEY2NC1hYXJjaDY0LWJpZyIpOworICAgIGNhc2UgRUxGOjpFTV9QUEM2NDoKKyAgICAgIHJldHVybiAiRUxGNjQtcHBjNjQiOworICAgIGNhc2UgRUxGOjpFTV9SSVNDVjoKKyAgICAgIHJldHVybiAiRUxGNjQtcmlzY3YiOworICAgIGNhc2UgRUxGOjpFTV9TMzkwOgorICAgICAgcmV0dXJuICJFTEY2NC1zMzkwIjsKKyAgICBjYXNlIEVMRjo6RU1fU1BBUkNWOToKKyAgICAgIHJldHVybiAiRUxGNjQtc3BhcmMiOworICAgIGNhc2UgRUxGOjpFTV9NSVBTOgorICAgICAgcmV0dXJuICJFTEY2NC1taXBzIjsKKyAgICBjYXNlIEVMRjo6RU1fV0VCQVNTRU1CTFk6CisgICAgICByZXR1cm4gIkVMRjY0LXdhc20iOworICAgIGNhc2UgRUxGOjpFTV9BTURHUFU6CisgICAgICByZXR1cm4gIkVMRjY0LWFtZGdwdSI7CisgICAgY2FzZSBFTEY6OkVNX0JQRjoKKyAgICAgIHJldHVybiAiRUxGNjQtQlBGIjsKKyAgICBkZWZhdWx0OgorICAgICAgcmV0dXJuICJFTEY2NC11bmtub3duIjsKKyAgICB9CisgIGRlZmF1bHQ6CisgICAgLy8gRklYTUU6IFByb3BlciBlcnJvciBoYW5kbGluZy4KKyAgICByZXBvcnRfZmF0YWxfZXJyb3IoIkludmFsaWQgRUxGQ0xBU1MhIik7CisgIH0KK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+IFRyaXBsZTo6QXJjaFR5cGUgRUxGT2JqZWN0RmlsZTxFTEZUPjo6Z2V0QXJjaCgpIGNvbnN0IHsKKyAgYm9vbCBJc0xpdHRsZUVuZGlhbiA9IEVMRlQ6OlRhcmdldEVuZGlhbm5lc3MgPT0gc3VwcG9ydDo6bGl0dGxlOworICBzd2l0Y2ggKEVGLmdldEhlYWRlcigpLT5lX21hY2hpbmUpIHsKKyAgY2FzZSBFTEY6OkVNXzM4NjoKKyAgY2FzZSBFTEY6OkVNX0lBTUNVOgorICAgIHJldHVybiBUcmlwbGU6Ong4NjsKKyAgY2FzZSBFTEY6OkVNX1g4Nl82NDoKKyAgICByZXR1cm4gVHJpcGxlOjp4ODZfNjQ7CisgIGNhc2UgRUxGOjpFTV9BQVJDSDY0OgorICAgIHJldHVybiBJc0xpdHRsZUVuZGlhbiA/IFRyaXBsZTo6YWFyY2g2NCA6IFRyaXBsZTo6YWFyY2g2NF9iZTsKKyAgY2FzZSBFTEY6OkVNX0FSTToKKyAgICByZXR1cm4gVHJpcGxlOjphcm07CisgIGNhc2UgRUxGOjpFTV9BVlI6CisgICAgcmV0dXJuIFRyaXBsZTo6YXZyOworICBjYXNlIEVMRjo6RU1fSEVYQUdPTjoKKyAgICByZXR1cm4gVHJpcGxlOjpoZXhhZ29uOworICBjYXNlIEVMRjo6RU1fTEFOQUk6CisgICAgcmV0dXJuIFRyaXBsZTo6bGFuYWk7CisgIGNhc2UgRUxGOjpFTV9NSVBTOgorICAgIHN3aXRjaCAoRUYuZ2V0SGVhZGVyKCktPmVfaWRlbnRbRUxGOjpFSV9DTEFTU10pIHsKKyAgICBjYXNlIEVMRjo6RUxGQ0xBU1MzMjoKKyAgICAgIHJldHVybiBJc0xpdHRsZUVuZGlhbiA/IFRyaXBsZTo6bWlwc2VsIDogVHJpcGxlOjptaXBzOworICAgIGNhc2UgRUxGOjpFTEZDTEFTUzY0OgorICAgICAgcmV0dXJuIElzTGl0dGxlRW5kaWFuID8gVHJpcGxlOjptaXBzNjRlbCA6IFRyaXBsZTo6bWlwczY0OworICAgIGRlZmF1bHQ6CisgICAgICByZXBvcnRfZmF0YWxfZXJyb3IoIkludmFsaWQgRUxGQ0xBU1MhIik7CisgICAgfQorICBjYXNlIEVMRjo6RU1fUFBDOgorICAgIHJldHVybiBUcmlwbGU6OnBwYzsKKyAgY2FzZSBFTEY6OkVNX1BQQzY0OgorICAgIHJldHVybiBJc0xpdHRsZUVuZGlhbiA/IFRyaXBsZTo6cHBjNjRsZSA6IFRyaXBsZTo6cHBjNjQ7CisgIGNhc2UgRUxGOjpFTV9SSVNDVjoKKyAgICBzd2l0Y2ggKEVGLmdldEhlYWRlcigpLT5lX2lkZW50W0VMRjo6RUlfQ0xBU1NdKSB7CisgICAgY2FzZSBFTEY6OkVMRkNMQVNTMzI6CisgICAgICByZXR1cm4gVHJpcGxlOjpyaXNjdjMyOworICAgIGNhc2UgRUxGOjpFTEZDTEFTUzY0OgorICAgICAgcmV0dXJuIFRyaXBsZTo6cmlzY3Y2NDsKKyAgICBkZWZhdWx0OgorICAgICAgcmVwb3J0X2ZhdGFsX2Vycm9yKCJJbnZhbGlkIEVMRkNMQVNTISIpOworICAgIH0KKyAgY2FzZSBFTEY6OkVNX1MzOTA6CisgICAgcmV0dXJuIFRyaXBsZTo6c3lzdGVtejsKKworICBjYXNlIEVMRjo6RU1fU1BBUkM6CisgIGNhc2UgRUxGOjpFTV9TUEFSQzMyUExVUzoKKyAgICByZXR1cm4gSXNMaXR0bGVFbmRpYW4gPyBUcmlwbGU6OnNwYXJjZWwgOiBUcmlwbGU6OnNwYXJjOworICBjYXNlIEVMRjo6RU1fU1BBUkNWOToKKyAgICByZXR1cm4gVHJpcGxlOjpzcGFyY3Y5OworICBjYXNlIEVMRjo6RU1fV0VCQVNTRU1CTFk6CisgICAgc3dpdGNoIChFRi5nZXRIZWFkZXIoKS0+ZV9pZGVudFtFTEY6OkVJX0NMQVNTXSkgeworICAgIGNhc2UgRUxGOjpFTEZDTEFTUzMyOiByZXR1cm4gVHJpcGxlOjp3YXNtMzI7CisgICAgY2FzZSBFTEY6OkVMRkNMQVNTNjQ6IHJldHVybiBUcmlwbGU6Ondhc202NDsKKyAgICBkZWZhdWx0OiByZXR1cm4gVHJpcGxlOjpVbmtub3duQXJjaDsKKyAgICB9CisKKyAgY2FzZSBFTEY6OkVNX0FNREdQVTogeworICAgIGlmICghSXNMaXR0bGVFbmRpYW4pCisgICAgICByZXR1cm4gVHJpcGxlOjpVbmtub3duQXJjaDsKKworICAgIHVuc2lnbmVkIE1BQ0ggPSBFRi5nZXRIZWFkZXIoKS0+ZV9mbGFncyAmIEVMRjo6RUZfQU1ER1BVX01BQ0g7CisgICAgaWYgKE1BQ0ggPj0gRUxGOjpFRl9BTURHUFVfTUFDSF9SNjAwX0ZJUlNUICYmCisgICAgICAgIE1BQ0ggPD0gRUxGOjpFRl9BTURHUFVfTUFDSF9SNjAwX0xBU1QpCisgICAgICByZXR1cm4gVHJpcGxlOjpyNjAwOworICAgIGlmIChNQUNIID49IEVMRjo6RUZfQU1ER1BVX01BQ0hfQU1ER0NOX0ZJUlNUICYmCisgICAgICAgIE1BQ0ggPD0gRUxGOjpFRl9BTURHUFVfTUFDSF9BTURHQ05fTEFTVCkKKyAgICAgIHJldHVybiBUcmlwbGU6OmFtZGdjbjsKKworICAgIHJldHVybiBUcmlwbGU6OlVua25vd25BcmNoOworICB9CisKKyAgY2FzZSBFTEY6OkVNX0JQRjoKKyAgICByZXR1cm4gSXNMaXR0bGVFbmRpYW4gPyBUcmlwbGU6OmJwZmVsIDogVHJpcGxlOjpicGZlYjsKKworICBkZWZhdWx0OgorICAgIHJldHVybiBUcmlwbGU6OlVua25vd25BcmNoOworICB9Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorRUxGT2JqZWN0RmlsZUJhc2U6OmVsZl9zeW1ib2xfaXRlcmF0b3JfcmFuZ2UKK0VMRk9iamVjdEZpbGU8RUxGVD46OmdldER5bmFtaWNTeW1ib2xJdGVyYXRvcnMoKSBjb25zdCB7CisgIHJldHVybiBtYWtlX3JhbmdlKGR5bmFtaWNfc3ltYm9sX2JlZ2luKCksIGR5bmFtaWNfc3ltYm9sX2VuZCgpKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+IGJvb2wgRUxGT2JqZWN0RmlsZTxFTEZUPjo6aXNSZWxvY2F0YWJsZU9iamVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIEVGLmdldEhlYWRlcigpLT5lX3R5cGUgPT0gRUxGOjpFVF9SRUw7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvYmplY3QKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX09CSkVDVF9FTEZPQkpFQ1RGSUxFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0VMRlR5cGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9FTEZUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MGNhOTYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9FTEZUeXBlcy5oCkBAIC0wLDAgKzEsNzQwIEBACisvLz09PS0gRUxGVHlwZXMuaCAtIEVuZGlhbiBzcGVjaWZpYyB0eXBlcyBmb3IgRUxGIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUX0VMRlRZUEVTX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RfRUxGVFlQRVNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9FTEYuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9iamVjdCB7CisKK3VzaW5nIHN1cHBvcnQ6OmVuZGlhbm5lc3M7CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPiBzdHJ1Y3QgRWxmX0VoZHJfSW1wbDsKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPiBzdHJ1Y3QgRWxmX1NoZHJfSW1wbDsKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPiBzdHJ1Y3QgRWxmX1N5bV9JbXBsOwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+IHN0cnVjdCBFbGZfRHluX0ltcGw7Cit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4gc3RydWN0IEVsZl9QaGRyX0ltcGw7Cit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVCwgYm9vbCBpc1JlbGE+IHN0cnVjdCBFbGZfUmVsX0ltcGw7Cit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4gc3RydWN0IEVsZl9WZXJkZWZfSW1wbDsKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPiBzdHJ1Y3QgRWxmX1ZlcmRhdXhfSW1wbDsKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPiBzdHJ1Y3QgRWxmX1Zlcm5lZWRfSW1wbDsKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPiBzdHJ1Y3QgRWxmX1Zlcm5hdXhfSW1wbDsKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPiBzdHJ1Y3QgRWxmX1ZlcnN5bV9JbXBsOwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+IHN0cnVjdCBFbGZfSGFzaF9JbXBsOwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+IHN0cnVjdCBFbGZfR251SGFzaF9JbXBsOwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+IHN0cnVjdCBFbGZfQ2hkcl9JbXBsOwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+IHN0cnVjdCBFbGZfTmhkcl9JbXBsOwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+IGNsYXNzIEVsZl9Ob3RlX0ltcGw7Cit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4gY2xhc3MgRWxmX05vdGVfSXRlcmF0b3JfSW1wbDsKKwordGVtcGxhdGUgPGVuZGlhbm5lc3MgRSwgYm9vbCBJczY0PiBzdHJ1Y3QgRUxGVHlwZSB7Citwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHk+CisgIHVzaW5nIHBhY2tlZCA9IHN1cHBvcnQ6OmRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDxUeSwgRSwgMT47CisKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGVuZGlhbm5lc3MgVGFyZ2V0RW5kaWFubmVzcyA9IEU7CisgIHN0YXRpYyBjb25zdCBib29sIElzNjRCaXRzID0gSXM2NDsKKworICB1c2luZyB1aW50ID0gdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxJczY0LCB1aW50NjRfdCwgdWludDMyX3Q+Ojp0eXBlOworICB1c2luZyBFaGRyID0gRWxmX0VoZHJfSW1wbDxFTEZUeXBlPEUsIElzNjQ+PjsKKyAgdXNpbmcgU2hkciA9IEVsZl9TaGRyX0ltcGw8RUxGVHlwZTxFLCBJczY0Pj47CisgIHVzaW5nIFN5bSA9IEVsZl9TeW1fSW1wbDxFTEZUeXBlPEUsIElzNjQ+PjsKKyAgdXNpbmcgRHluID0gRWxmX0R5bl9JbXBsPEVMRlR5cGU8RSwgSXM2ND4+OworICB1c2luZyBQaGRyID0gRWxmX1BoZHJfSW1wbDxFTEZUeXBlPEUsIElzNjQ+PjsKKyAgdXNpbmcgUmVsID0gRWxmX1JlbF9JbXBsPEVMRlR5cGU8RSwgSXM2ND4sIGZhbHNlPjsKKyAgdXNpbmcgUmVsYSA9IEVsZl9SZWxfSW1wbDxFTEZUeXBlPEUsIElzNjQ+LCB0cnVlPjsKKyAgdXNpbmcgVmVyZGVmID0gRWxmX1ZlcmRlZl9JbXBsPEVMRlR5cGU8RSwgSXM2ND4+OworICB1c2luZyBWZXJkYXV4ID0gRWxmX1ZlcmRhdXhfSW1wbDxFTEZUeXBlPEUsIElzNjQ+PjsKKyAgdXNpbmcgVmVybmVlZCA9IEVsZl9WZXJuZWVkX0ltcGw8RUxGVHlwZTxFLCBJczY0Pj47CisgIHVzaW5nIFZlcm5hdXggPSBFbGZfVmVybmF1eF9JbXBsPEVMRlR5cGU8RSwgSXM2ND4+OworICB1c2luZyBWZXJzeW0gPSBFbGZfVmVyc3ltX0ltcGw8RUxGVHlwZTxFLCBJczY0Pj47CisgIHVzaW5nIEhhc2ggPSBFbGZfSGFzaF9JbXBsPEVMRlR5cGU8RSwgSXM2ND4+OworICB1c2luZyBHbnVIYXNoID0gRWxmX0dudUhhc2hfSW1wbDxFTEZUeXBlPEUsIElzNjQ+PjsKKyAgdXNpbmcgQ2hkciA9IEVsZl9DaGRyX0ltcGw8RUxGVHlwZTxFLCBJczY0Pj47CisgIHVzaW5nIE5oZHIgPSBFbGZfTmhkcl9JbXBsPEVMRlR5cGU8RSwgSXM2ND4+OworICB1c2luZyBOb3RlID0gRWxmX05vdGVfSW1wbDxFTEZUeXBlPEUsIElzNjQ+PjsKKyAgdXNpbmcgTm90ZUl0ZXJhdG9yID0gRWxmX05vdGVfSXRlcmF0b3JfSW1wbDxFTEZUeXBlPEUsIElzNjQ+PjsKKyAgdXNpbmcgRHluUmFuZ2UgPSBBcnJheVJlZjxEeW4+OworICB1c2luZyBTaGRyUmFuZ2UgPSBBcnJheVJlZjxTaGRyPjsKKyAgdXNpbmcgU3ltUmFuZ2UgPSBBcnJheVJlZjxTeW0+OworICB1c2luZyBSZWxSYW5nZSA9IEFycmF5UmVmPFJlbD47CisgIHVzaW5nIFJlbGFSYW5nZSA9IEFycmF5UmVmPFJlbGE+OworICB1c2luZyBQaGRyUmFuZ2UgPSBBcnJheVJlZjxQaGRyPjsKKworICB1c2luZyBIYWxmID0gcGFja2VkPHVpbnQxNl90PjsKKyAgdXNpbmcgV29yZCA9IHBhY2tlZDx1aW50MzJfdD47CisgIHVzaW5nIFN3b3JkID0gcGFja2VkPGludDMyX3Q+OworICB1c2luZyBYd29yZCA9IHBhY2tlZDx1aW50NjRfdD47CisgIHVzaW5nIFN4d29yZCA9IHBhY2tlZDxpbnQ2NF90PjsKKyAgdXNpbmcgQWRkciA9IHBhY2tlZDx1aW50PjsKKyAgdXNpbmcgT2ZmID0gcGFja2VkPHVpbnQ+OworfTsKKwordXNpbmcgRUxGMzJMRSA9IEVMRlR5cGU8c3VwcG9ydDo6bGl0dGxlLCBmYWxzZT47Cit1c2luZyBFTEYzMkJFID0gRUxGVHlwZTxzdXBwb3J0OjpiaWcsIGZhbHNlPjsKK3VzaW5nIEVMRjY0TEUgPSBFTEZUeXBlPHN1cHBvcnQ6OmxpdHRsZSwgdHJ1ZT47Cit1c2luZyBFTEY2NEJFID0gRUxGVHlwZTxzdXBwb3J0OjpiaWcsIHRydWU+OworCisvLyBVc2UgYW4gYWxpZ25tZW50IG9mIDIgZm9yIHRoZSB0eXBlZGVmcyBzaW5jZSB0aGF0IGlzIHRoZSB3b3JzdCBjYXNlIGZvcgorLy8gRUxGIGZpbGVzIGluIGFyY2hpdmVzLgorCisvLyBJIHJlYWxseSBkb24ndCBsaWtlIGRvaW5nIHRoaXMsIGJ1dCB0aGUgYWx0ZXJuYXRpdmUgaXMgY29weXBhc3RhLgorI2RlZmluZSBMTFZNX0VMRl9JTVBPUlRfVFlQRVNfRUxGVChFTEZUKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdXNpbmcgRWxmX0FkZHIgPSB0eXBlbmFtZSBFTEZUOjpBZGRyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVzaW5nIEVsZl9PZmYgPSB0eXBlbmFtZSBFTEZUOjpPZmY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1c2luZyBFbGZfSGFsZiA9IHR5cGVuYW1lIEVMRlQ6OkhhbGY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdXNpbmcgRWxmX1dvcmQgPSB0eXBlbmFtZSBFTEZUOjpXb3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHVzaW5nIEVsZl9Td29yZCA9IHR5cGVuYW1lIEVMRlQ6OlN3b3JkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB1c2luZyBFbGZfWHdvcmQgPSB0eXBlbmFtZSBFTEZUOjpYd29yZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdXNpbmcgRWxmX1N4d29yZCA9IHR5cGVuYW1lIEVMRlQ6OlN4d29yZDsKKworI2RlZmluZSBMTFZNX0VMRl9DT01NQSAsCisjZGVmaW5lIExMVk1fRUxGX0lNUE9SVF9UWVBFUyhFLCBXKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBMTFZNX0VMRl9JTVBPUlRfVFlQRVNfRUxGVChFTEZUeXBlPEUgTExWTV9FTEZfQ09NTUEgVz4pCisKKy8vIFNlY3Rpb24gaGVhZGVyLgordGVtcGxhdGUgPGNsYXNzIEVMRlQ+IHN0cnVjdCBFbGZfU2hkcl9CYXNlOworCit0ZW1wbGF0ZSA8ZW5kaWFubmVzcyBUYXJnZXRFbmRpYW5uZXNzPgorc3RydWN0IEVsZl9TaGRyX0Jhc2U8RUxGVHlwZTxUYXJnZXRFbmRpYW5uZXNzLCBmYWxzZT4+IHsKKyAgTExWTV9FTEZfSU1QT1JUX1RZUEVTKFRhcmdldEVuZGlhbm5lc3MsIGZhbHNlKQorICBFbGZfV29yZCBzaF9uYW1lOyAgICAgIC8vIFNlY3Rpb24gbmFtZSAoaW5kZXggaW50byBzdHJpbmcgdGFibGUpCisgIEVsZl9Xb3JkIHNoX3R5cGU7ICAgICAgLy8gU2VjdGlvbiB0eXBlIChTSFRfKikKKyAgRWxmX1dvcmQgc2hfZmxhZ3M7ICAgICAvLyBTZWN0aW9uIGZsYWdzIChTSEZfKikKKyAgRWxmX0FkZHIgc2hfYWRkcjsgICAgICAvLyBBZGRyZXNzIHdoZXJlIHNlY3Rpb24gaXMgdG8gYmUgbG9hZGVkCisgIEVsZl9PZmYgc2hfb2Zmc2V0OyAgICAgLy8gRmlsZSBvZmZzZXQgb2Ygc2VjdGlvbiBkYXRhLCBpbiBieXRlcworICBFbGZfV29yZCBzaF9zaXplOyAgICAgIC8vIFNpemUgb2Ygc2VjdGlvbiwgaW4gYnl0ZXMKKyAgRWxmX1dvcmQgc2hfbGluazsgICAgICAvLyBTZWN0aW9uIHR5cGUtc3BlY2lmaWMgaGVhZGVyIHRhYmxlIGluZGV4IGxpbmsKKyAgRWxmX1dvcmQgc2hfaW5mbzsgICAgICAvLyBTZWN0aW9uIHR5cGUtc3BlY2lmaWMgZXh0cmEgaW5mb3JtYXRpb24KKyAgRWxmX1dvcmQgc2hfYWRkcmFsaWduOyAvLyBTZWN0aW9uIGFkZHJlc3MgYWxpZ25tZW50CisgIEVsZl9Xb3JkIHNoX2VudHNpemU7ICAgLy8gU2l6ZSBvZiByZWNvcmRzIGNvbnRhaW5lZCB3aXRoaW4gdGhlIHNlY3Rpb24KK307CisKK3RlbXBsYXRlIDxlbmRpYW5uZXNzIFRhcmdldEVuZGlhbm5lc3M+CitzdHJ1Y3QgRWxmX1NoZHJfQmFzZTxFTEZUeXBlPFRhcmdldEVuZGlhbm5lc3MsIHRydWU+PiB7CisgIExMVk1fRUxGX0lNUE9SVF9UWVBFUyhUYXJnZXRFbmRpYW5uZXNzLCB0cnVlKQorICBFbGZfV29yZCBzaF9uYW1lOyAgICAgICAvLyBTZWN0aW9uIG5hbWUgKGluZGV4IGludG8gc3RyaW5nIHRhYmxlKQorICBFbGZfV29yZCBzaF90eXBlOyAgICAgICAvLyBTZWN0aW9uIHR5cGUgKFNIVF8qKQorICBFbGZfWHdvcmQgc2hfZmxhZ3M7ICAgICAvLyBTZWN0aW9uIGZsYWdzIChTSEZfKikKKyAgRWxmX0FkZHIgc2hfYWRkcjsgICAgICAgLy8gQWRkcmVzcyB3aGVyZSBzZWN0aW9uIGlzIHRvIGJlIGxvYWRlZAorICBFbGZfT2ZmIHNoX29mZnNldDsgICAgICAvLyBGaWxlIG9mZnNldCBvZiBzZWN0aW9uIGRhdGEsIGluIGJ5dGVzCisgIEVsZl9Yd29yZCBzaF9zaXplOyAgICAgIC8vIFNpemUgb2Ygc2VjdGlvbiwgaW4gYnl0ZXMKKyAgRWxmX1dvcmQgc2hfbGluazsgICAgICAgLy8gU2VjdGlvbiB0eXBlLXNwZWNpZmljIGhlYWRlciB0YWJsZSBpbmRleCBsaW5rCisgIEVsZl9Xb3JkIHNoX2luZm87ICAgICAgIC8vIFNlY3Rpb24gdHlwZS1zcGVjaWZpYyBleHRyYSBpbmZvcm1hdGlvbgorICBFbGZfWHdvcmQgc2hfYWRkcmFsaWduOyAvLyBTZWN0aW9uIGFkZHJlc3MgYWxpZ25tZW50CisgIEVsZl9Yd29yZCBzaF9lbnRzaXplOyAgIC8vIFNpemUgb2YgcmVjb3JkcyBjb250YWluZWQgd2l0aGluIHRoZSBzZWN0aW9uCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3N0cnVjdCBFbGZfU2hkcl9JbXBsIDogRWxmX1NoZHJfQmFzZTxFTEZUPiB7CisgIHVzaW5nIEVsZl9TaGRyX0Jhc2U8RUxGVD46OnNoX2VudHNpemU7CisgIHVzaW5nIEVsZl9TaGRyX0Jhc2U8RUxGVD46OnNoX3NpemU7CisKKyAgLy8vIEBicmllZiBHZXQgdGhlIG51bWJlciBvZiBlbnRpdGllcyB0aGlzIHNlY3Rpb24gY29udGFpbnMgaWYgaXQgaGFzIGFueS4KKyAgdW5zaWduZWQgZ2V0RW50aXR5Q291bnQoKSBjb25zdCB7CisgICAgaWYgKHNoX2VudHNpemUgPT0gMCkKKyAgICAgIHJldHVybiAwOworICAgIHJldHVybiBzaF9zaXplIC8gc2hfZW50c2l6ZTsKKyAgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+IHN0cnVjdCBFbGZfU3ltX0Jhc2U7CisKK3RlbXBsYXRlIDxlbmRpYW5uZXNzIFRhcmdldEVuZGlhbm5lc3M+CitzdHJ1Y3QgRWxmX1N5bV9CYXNlPEVMRlR5cGU8VGFyZ2V0RW5kaWFubmVzcywgZmFsc2U+PiB7CisgIExMVk1fRUxGX0lNUE9SVF9UWVBFUyhUYXJnZXRFbmRpYW5uZXNzLCBmYWxzZSkKKyAgRWxmX1dvcmQgc3RfbmFtZTsgICAgICAgLy8gU3ltYm9sIG5hbWUgKGluZGV4IGludG8gc3RyaW5nIHRhYmxlKQorICBFbGZfQWRkciBzdF92YWx1ZTsgICAgICAvLyBWYWx1ZSBvciBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3ltYm9sCisgIEVsZl9Xb3JkIHN0X3NpemU7ICAgICAgIC8vIFNpemUgb2YgdGhlIHN5bWJvbAorICB1bnNpZ25lZCBjaGFyIHN0X2luZm87ICAvLyBTeW1ib2wncyB0eXBlIGFuZCBiaW5kaW5nIGF0dHJpYnV0ZXMKKyAgdW5zaWduZWQgY2hhciBzdF9vdGhlcjsgLy8gTXVzdCBiZSB6ZXJvOyByZXNlcnZlZAorICBFbGZfSGFsZiBzdF9zaG5keDsgICAgICAvLyBXaGljaCBzZWN0aW9uIChoZWFkZXIgdGFibGUgaW5kZXgpIGl0J3MgZGVmaW5lZCBpbgorfTsKKwordGVtcGxhdGUgPGVuZGlhbm5lc3MgVGFyZ2V0RW5kaWFubmVzcz4KK3N0cnVjdCBFbGZfU3ltX0Jhc2U8RUxGVHlwZTxUYXJnZXRFbmRpYW5uZXNzLCB0cnVlPj4geworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVMoVGFyZ2V0RW5kaWFubmVzcywgdHJ1ZSkKKyAgRWxmX1dvcmQgc3RfbmFtZTsgICAgICAgLy8gU3ltYm9sIG5hbWUgKGluZGV4IGludG8gc3RyaW5nIHRhYmxlKQorICB1bnNpZ25lZCBjaGFyIHN0X2luZm87ICAvLyBTeW1ib2wncyB0eXBlIGFuZCBiaW5kaW5nIGF0dHJpYnV0ZXMKKyAgdW5zaWduZWQgY2hhciBzdF9vdGhlcjsgLy8gTXVzdCBiZSB6ZXJvOyByZXNlcnZlZAorICBFbGZfSGFsZiBzdF9zaG5keDsgICAgICAvLyBXaGljaCBzZWN0aW9uIChoZWFkZXIgdGFibGUgaW5kZXgpIGl0J3MgZGVmaW5lZCBpbgorICBFbGZfQWRkciBzdF92YWx1ZTsgICAgICAvLyBWYWx1ZSBvciBhZGRyZXNzIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3ltYm9sCisgIEVsZl9Yd29yZCBzdF9zaXplOyAgICAgIC8vIFNpemUgb2YgdGhlIHN5bWJvbAorfTsKKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitzdHJ1Y3QgRWxmX1N5bV9JbXBsIDogRWxmX1N5bV9CYXNlPEVMRlQ+IHsKKyAgdXNpbmcgRWxmX1N5bV9CYXNlPEVMRlQ+OjpzdF9pbmZvOworICB1c2luZyBFbGZfU3ltX0Jhc2U8RUxGVD46OnN0X3NobmR4OworICB1c2luZyBFbGZfU3ltX0Jhc2U8RUxGVD46OnN0X290aGVyOworICB1c2luZyBFbGZfU3ltX0Jhc2U8RUxGVD46OnN0X3ZhbHVlOworCisgIC8vIFRoZXNlIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgY29ycmVzcG9uZCB0byB0aGUgRUxGMzJfU1RfQklORCwKKyAgLy8gRUxGMzJfU1RfVFlQRSwgYW5kIEVMRjMyX1NUX0lORk8gbWFjcm9zIGRlZmluZWQgaW4gdGhlIEVMRiBzcGVjaWZpY2F0aW9uOgorICB1bnNpZ25lZCBjaGFyIGdldEJpbmRpbmcoKSBjb25zdCB7IHJldHVybiBzdF9pbmZvID4+IDQ7IH0KKyAgdW5zaWduZWQgY2hhciBnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gc3RfaW5mbyAmIDB4MGY7IH0KKyAgdWludDY0X3QgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBzdF92YWx1ZTsgfQorICB2b2lkIHNldEJpbmRpbmcodW5zaWduZWQgY2hhciBiKSB7IHNldEJpbmRpbmdBbmRUeXBlKGIsIGdldFR5cGUoKSk7IH0KKyAgdm9pZCBzZXRUeXBlKHVuc2lnbmVkIGNoYXIgdCkgeyBzZXRCaW5kaW5nQW5kVHlwZShnZXRCaW5kaW5nKCksIHQpOyB9CisKKyAgdm9pZCBzZXRCaW5kaW5nQW5kVHlwZSh1bnNpZ25lZCBjaGFyIGIsIHVuc2lnbmVkIGNoYXIgdCkgeworICAgIHN0X2luZm8gPSAoYiA8PCA0KSArICh0ICYgMHgwZik7CisgIH0KKworICAvLy8gQWNjZXNzIHRvIHRoZSBTVFZfeHh4IGZsYWcgc3RvcmVkIGluIHRoZSBmaXJzdCB0d28gYml0cyBvZiBzdF9vdGhlci4KKyAgLy8vIFNUVl9ERUZBVUxUOiAwCisgIC8vLyBTVFZfSU5URVJOQUw6IDEKKyAgLy8vIFNUVl9ISURERU46IDIKKyAgLy8vIFNUVl9QUk9URUNURUQ6IDMKKyAgdW5zaWduZWQgY2hhciBnZXRWaXNpYmlsaXR5KCkgY29uc3QgeyByZXR1cm4gc3Rfb3RoZXIgJiAweDM7IH0KKyAgdm9pZCBzZXRWaXNpYmlsaXR5KHVuc2lnbmVkIGNoYXIgdikgeworICAgIGFzc2VydCh2IDwgNCAmJiAiSW52YWxpZCB2YWx1ZSBmb3IgdmlzaWJpbGl0eSIpOworICAgIHN0X290aGVyID0gKHN0X290aGVyICYgfjB4MykgfCB2OworICB9CisKKyAgYm9vbCBpc0Fic29sdXRlKCkgY29uc3QgeyByZXR1cm4gc3Rfc2huZHggPT0gRUxGOjpTSE5fQUJTOyB9CisKKyAgYm9vbCBpc0NvbW1vbigpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VHlwZSgpID09IEVMRjo6U1RUX0NPTU1PTiB8fCBzdF9zaG5keCA9PSBFTEY6OlNITl9DT01NT047CisgIH0KKworICBib29sIGlzRGVmaW5lZCgpIGNvbnN0IHsgcmV0dXJuICFpc1VuZGVmaW5lZCgpOyB9CisKKyAgYm9vbCBpc1Byb2Nlc3NvclNwZWNpZmljKCkgY29uc3QgeworICAgIHJldHVybiBzdF9zaG5keCA+PSBFTEY6OlNITl9MT1BST0MgJiYgc3Rfc2huZHggPD0gRUxGOjpTSE5fSElQUk9DOworICB9CisKKyAgYm9vbCBpc09TU3BlY2lmaWMoKSBjb25zdCB7CisgICAgcmV0dXJuIHN0X3NobmR4ID49IEVMRjo6U0hOX0xPT1MgJiYgc3Rfc2huZHggPD0gRUxGOjpTSE5fSElPUzsKKyAgfQorCisgIGJvb2wgaXNSZXNlcnZlZCgpIGNvbnN0IHsKKyAgICAvLyBFTEY6OlNITl9ISVJFU0VSVkUgaXMgMHhmZmZmIHNvIHN0X3NobmR4IDw9IEVMRjo6U0hOX0hJUkVTRVJWRSBpcyBhbHdheXMKKyAgICAvLyB0cnVlIGFuZCBzb21lIGNvbXBpbGVycyB3YXJuIGFib3V0IGl0LgorICAgIHJldHVybiBzdF9zaG5keCA+PSBFTEY6OlNITl9MT1JFU0VSVkU7CisgIH0KKworICBib29sIGlzVW5kZWZpbmVkKCkgY29uc3QgeyByZXR1cm4gc3Rfc2huZHggPT0gRUxGOjpTSE5fVU5ERUY7IH0KKworICBib29sIGlzRXh0ZXJuYWwoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldEJpbmRpbmcoKSAhPSBFTEY6OlNUQl9MT0NBTDsKKyAgfQorCisgIEV4cGVjdGVkPFN0cmluZ1JlZj4gZ2V0TmFtZShTdHJpbmdSZWYgU3RyVGFiKSBjb25zdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorRXhwZWN0ZWQ8U3RyaW5nUmVmPiBFbGZfU3ltX0ltcGw8RUxGVD46OmdldE5hbWUoU3RyaW5nUmVmIFN0clRhYikgY29uc3QgeworICB1aW50MzJfdCBPZmZzZXQgPSB0aGlzLT5zdF9uYW1lOworICBpZiAoT2Zmc2V0ID49IFN0clRhYi5zaXplKCkpCisgICAgcmV0dXJuIGVycm9yQ29kZVRvRXJyb3Iob2JqZWN0X2Vycm9yOjpwYXJzZV9mYWlsZWQpOworICByZXR1cm4gU3RyaW5nUmVmKFN0clRhYi5kYXRhKCkgKyBPZmZzZXQpOworfQorCisvLy8gRWxmX1ZlcnN5bTogVGhpcyBpcyB0aGUgc3RydWN0dXJlIG9mIGVudHJpZXMgaW4gdGhlIFNIVF9HTlVfdmVyc3ltIHNlY3Rpb24KKy8vLyAoLmdudS52ZXJzaW9uKS4gVGhpcyBzdHJ1Y3R1cmUgaXMgaWRlbnRpY2FsIGZvciBFTEYzMiBhbmQgRUxGNjQuCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3N0cnVjdCBFbGZfVmVyc3ltX0ltcGwgeworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVNfRUxGVChFTEZUKQorICBFbGZfSGFsZiB2c19pbmRleDsgLy8gVmVyc2lvbiBpbmRleCB3aXRoIGZsYWdzIChlLmcuIFZFUlNZTV9ISURERU4pCit9OworCisvLy8gRWxmX1ZlcmRlZjogVGhpcyBpcyB0aGUgc3RydWN0dXJlIG9mIGVudHJpZXMgaW4gdGhlIFNIVF9HTlVfdmVyZGVmIHNlY3Rpb24KKy8vLyAoLmdudS52ZXJzaW9uX2QpLiBUaGlzIHN0cnVjdHVyZSBpcyBpZGVudGljYWwgZm9yIEVMRjMyIGFuZCBFTEY2NC4KK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorc3RydWN0IEVsZl9WZXJkZWZfSW1wbCB7CisgIExMVk1fRUxGX0lNUE9SVF9UWVBFU19FTEZUKEVMRlQpCisgIHVzaW5nIEVsZl9WZXJkYXV4ID0gRWxmX1ZlcmRhdXhfSW1wbDxFTEZUPjsKKyAgRWxmX0hhbGYgdmRfdmVyc2lvbjsgLy8gVmVyc2lvbiBvZiB0aGlzIHN0cnVjdHVyZSAoZS5nLiBWRVJfREVGX0NVUlJFTlQpCisgIEVsZl9IYWxmIHZkX2ZsYWdzOyAgIC8vIEJpdHdpc2UgZmxhZ3MgKFZFUl9ERUZfKikKKyAgRWxmX0hhbGYgdmRfbmR4OyAgICAgLy8gVmVyc2lvbiBpbmRleCwgdXNlZCBpbiAuZ251LnZlcnNpb24gZW50cmllcworICBFbGZfSGFsZiB2ZF9jbnQ7ICAgICAvLyBOdW1iZXIgb2YgVmVyZGF1eCBlbnRyaWVzCisgIEVsZl9Xb3JkIHZkX2hhc2g7ICAgIC8vIEhhc2ggb2YgbmFtZQorICBFbGZfV29yZCB2ZF9hdXg7ICAgICAvLyBPZmZzZXQgdG8gdGhlIGZpcnN0IFZlcmRhdXggZW50cnkgKGluIGJ5dGVzKQorICBFbGZfV29yZCB2ZF9uZXh0OyAgICAvLyBPZmZzZXQgdG8gdGhlIG5leHQgVmVyZGVmIGVudHJ5IChpbiBieXRlcykKKworICAvLy8gR2V0IHRoZSBmaXJzdCBWZXJkYXV4IGVudHJ5IGZvciB0aGlzIFZlcmRlZi4KKyAgY29uc3QgRWxmX1ZlcmRhdXggKmdldEF1eCgpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFbGZfVmVyZGF1eCAqPigoY29uc3QgY2hhciAqKXRoaXMgKyB2ZF9hdXgpOworICB9Cit9OworCisvLy8gRWxmX1ZlcmRhdXg6IFRoaXMgaXMgdGhlIHN0cnVjdHVyZSBvZiBhdXhpbGlhcnkgZGF0YSBpbiB0aGUgU0hUX0dOVV92ZXJkZWYKKy8vLyBzZWN0aW9uICguZ251LnZlcnNpb25fZCkuIFRoaXMgc3RydWN0dXJlIGlzIGlkZW50aWNhbCBmb3IgRUxGMzIgYW5kIEVMRjY0LgordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitzdHJ1Y3QgRWxmX1ZlcmRhdXhfSW1wbCB7CisgIExMVk1fRUxGX0lNUE9SVF9UWVBFU19FTEZUKEVMRlQpCisgIEVsZl9Xb3JkIHZkYV9uYW1lOyAvLyBWZXJzaW9uIG5hbWUgKG9mZnNldCBpbiBzdHJpbmcgdGFibGUpCisgIEVsZl9Xb3JkIHZkYV9uZXh0OyAvLyBPZmZzZXQgdG8gbmV4dCBWZXJkYXV4IGVudHJ5IChpbiBieXRlcykKK307CisKKy8vLyBFbGZfVmVybmVlZDogVGhpcyBpcyB0aGUgc3RydWN0dXJlIG9mIGVudHJpZXMgaW4gdGhlIFNIVF9HTlVfdmVybmVlZAorLy8vIHNlY3Rpb24gKC5nbnUudmVyc2lvbl9yKS4gVGhpcyBzdHJ1Y3R1cmUgaXMgaWRlbnRpY2FsIGZvciBFTEYzMiBhbmQgRUxGNjQuCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3N0cnVjdCBFbGZfVmVybmVlZF9JbXBsIHsKKyAgTExWTV9FTEZfSU1QT1JUX1RZUEVTX0VMRlQoRUxGVCkKKyAgRWxmX0hhbGYgdm5fdmVyc2lvbjsgLy8gVmVyc2lvbiBvZiB0aGlzIHN0cnVjdHVyZSAoZS5nLiBWRVJfTkVFRF9DVVJSRU5UKQorICBFbGZfSGFsZiB2bl9jbnQ7ICAgICAvLyBOdW1iZXIgb2YgYXNzb2NpYXRlZCBWZXJuYXV4IGVudHJpZXMKKyAgRWxmX1dvcmQgdm5fZmlsZTsgICAgLy8gTGlicmFyeSBuYW1lIChzdHJpbmcgdGFibGUgb2Zmc2V0KQorICBFbGZfV29yZCB2bl9hdXg7ICAgICAvLyBPZmZzZXQgdG8gZmlyc3QgVmVybmF1eCBlbnRyeSAoaW4gYnl0ZXMpCisgIEVsZl9Xb3JkIHZuX25leHQ7ICAgIC8vIE9mZnNldCB0byBuZXh0IFZlcm5lZWQgZW50cnkgKGluIGJ5dGVzKQorfTsKKworLy8vIEVsZl9WZXJuYXV4OiBUaGlzIGlzIHRoZSBzdHJ1Y3R1cmUgb2YgYXV4aWxpYXJ5IGRhdGEgaW4gU0hUX0dOVV92ZXJuZWVkCisvLy8gc2VjdGlvbiAoLmdudS52ZXJzaW9uX3IpLiBUaGlzIHN0cnVjdHVyZSBpcyBpZGVudGljYWwgZm9yIEVMRjMyIGFuZCBFTEY2NC4KK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorc3RydWN0IEVsZl9WZXJuYXV4X0ltcGwgeworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVNfRUxGVChFTEZUKQorICBFbGZfV29yZCB2bmFfaGFzaDsgIC8vIEhhc2ggb2YgZGVwZW5kZW5jeSBuYW1lCisgIEVsZl9IYWxmIHZuYV9mbGFnczsgLy8gQml0d2lzZSBGbGFncyAoVkVSX0ZMQUdfKikKKyAgRWxmX0hhbGYgdm5hX290aGVyOyAvLyBWZXJzaW9uIGluZGV4LCB1c2VkIGluIC5nbnUudmVyc2lvbiBlbnRyaWVzCisgIEVsZl9Xb3JkIHZuYV9uYW1lOyAgLy8gRGVwZW5kZW5jeSBuYW1lCisgIEVsZl9Xb3JkIHZuYV9uZXh0OyAgLy8gT2Zmc2V0IHRvIG5leHQgVmVybmF1eCBlbnRyeSAoaW4gYnl0ZXMpCit9OworCisvLy8gRWxmX0R5bl9CYXNlOiBUaGlzIHN0cnVjdHVyZSBtYXRjaGVzIHRoZSBmb3JtIG9mIGVudHJpZXMgaW4gdGhlIGR5bmFtaWMKKy8vLyAgICAgICAgICAgICAgIHRhYmxlIHNlY3Rpb24gKC5keW5hbWljKSBsb29rIGxpa2UuCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4gc3RydWN0IEVsZl9EeW5fQmFzZTsKKwordGVtcGxhdGUgPGVuZGlhbm5lc3MgVGFyZ2V0RW5kaWFubmVzcz4KK3N0cnVjdCBFbGZfRHluX0Jhc2U8RUxGVHlwZTxUYXJnZXRFbmRpYW5uZXNzLCBmYWxzZT4+IHsKKyAgTExWTV9FTEZfSU1QT1JUX1RZUEVTKFRhcmdldEVuZGlhbm5lc3MsIGZhbHNlKQorICBFbGZfU3dvcmQgZF90YWc7CisgIHVuaW9uIHsKKyAgICBFbGZfV29yZCBkX3ZhbDsKKyAgICBFbGZfQWRkciBkX3B0cjsKKyAgfSBkX3VuOworfTsKKwordGVtcGxhdGUgPGVuZGlhbm5lc3MgVGFyZ2V0RW5kaWFubmVzcz4KK3N0cnVjdCBFbGZfRHluX0Jhc2U8RUxGVHlwZTxUYXJnZXRFbmRpYW5uZXNzLCB0cnVlPj4geworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVMoVGFyZ2V0RW5kaWFubmVzcywgdHJ1ZSkKKyAgRWxmX1N4d29yZCBkX3RhZzsKKyAgdW5pb24geworICAgIEVsZl9Yd29yZCBkX3ZhbDsKKyAgICBFbGZfQWRkciBkX3B0cjsKKyAgfSBkX3VuOworfTsKKworLy8vIEVsZl9EeW5fSW1wbDogVGhpcyBpbmhlcml0cyBmcm9tIEVsZl9EeW5fQmFzZSwgYWRkaW5nIGdldHRlcnMuCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3N0cnVjdCBFbGZfRHluX0ltcGwgOiBFbGZfRHluX0Jhc2U8RUxGVD4geworICB1c2luZyBFbGZfRHluX0Jhc2U8RUxGVD46OmRfdGFnOworICB1c2luZyBFbGZfRHluX0Jhc2U8RUxGVD46OmRfdW47CisgIHVzaW5nIGludFhfdCA9IHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8RUxGVDo6SXM2NEJpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCwgaW50MzJfdD46OnR5cGU7CisgIHVzaW5nIHVpbnRYX3QgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPEVMRlQ6OklzNjRCaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCwgdWludDMyX3Q+Ojp0eXBlOworICBpbnRYX3QgZ2V0VGFnKCkgY29uc3QgeyByZXR1cm4gZF90YWc7IH0KKyAgdWludFhfdCBnZXRWYWwoKSBjb25zdCB7IHJldHVybiBkX3VuLmRfdmFsOyB9CisgIHVpbnRYX3QgZ2V0UHRyKCkgY29uc3QgeyByZXR1cm4gZF91bi5kX3B0cjsgfQorfTsKKwordGVtcGxhdGUgPGVuZGlhbm5lc3MgVGFyZ2V0RW5kaWFubmVzcz4KK3N0cnVjdCBFbGZfUmVsX0ltcGw8RUxGVHlwZTxUYXJnZXRFbmRpYW5uZXNzLCBmYWxzZT4sIGZhbHNlPiB7CisgIExMVk1fRUxGX0lNUE9SVF9UWVBFUyhUYXJnZXRFbmRpYW5uZXNzLCBmYWxzZSkKKyAgc3RhdGljIGNvbnN0IGJvb2wgSXNSZWxhID0gZmFsc2U7CisgIEVsZl9BZGRyIHJfb2Zmc2V0OyAvLyBMb2NhdGlvbiAoZmlsZSBieXRlIG9mZnNldCwgb3IgcHJvZ3JhbSB2aXJ0dWFsIGFkZHIpCisgIEVsZl9Xb3JkIHJfaW5mbzsgICAvLyBTeW1ib2wgdGFibGUgaW5kZXggYW5kIHR5cGUgb2YgcmVsb2NhdGlvbiB0byBhcHBseQorCisgIHVpbnQzMl90IGdldFJJbmZvKGJvb2wgaXNNaXBzNjRFTCkgY29uc3QgeworICAgIGFzc2VydCghaXNNaXBzNjRFTCk7CisgICAgcmV0dXJuIHJfaW5mbzsKKyAgfQorICB2b2lkIHNldFJJbmZvKHVpbnQzMl90IFIsIGJvb2wgSXNNaXBzNjRFTCkgeworICAgIGFzc2VydCghSXNNaXBzNjRFTCk7CisgICAgcl9pbmZvID0gUjsKKyAgfQorCisgIC8vIFRoZXNlIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgY29ycmVzcG9uZCB0byB0aGUgRUxGMzJfUl9TWU0sIEVMRjMyX1JfVFlQRSwKKyAgLy8gYW5kIEVMRjMyX1JfSU5GTyBtYWNyb3MgZGVmaW5lZCBpbiB0aGUgRUxGIHNwZWNpZmljYXRpb246CisgIHVpbnQzMl90IGdldFN5bWJvbChib29sIGlzTWlwczY0RUwpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+Z2V0UkluZm8oaXNNaXBzNjRFTCkgPj4gODsKKyAgfQorICB1bnNpZ25lZCBjaGFyIGdldFR5cGUoYm9vbCBpc01pcHM2NEVMKSBjb25zdCB7CisgICAgcmV0dXJuICh1bnNpZ25lZCBjaGFyKSh0aGlzLT5nZXRSSW5mbyhpc01pcHM2NEVMKSAmIDB4MGZmKTsKKyAgfQorICB2b2lkIHNldFN5bWJvbCh1aW50MzJfdCBzLCBib29sIElzTWlwczY0RUwpIHsKKyAgICBzZXRTeW1ib2xBbmRUeXBlKHMsIGdldFR5cGUoSXNNaXBzNjRFTCksIElzTWlwczY0RUwpOworICB9CisgIHZvaWQgc2V0VHlwZSh1bnNpZ25lZCBjaGFyIHQsIGJvb2wgSXNNaXBzNjRFTCkgeworICAgIHNldFN5bWJvbEFuZFR5cGUoZ2V0U3ltYm9sKElzTWlwczY0RUwpLCB0LCBJc01pcHM2NEVMKTsKKyAgfQorICB2b2lkIHNldFN5bWJvbEFuZFR5cGUodWludDMyX3QgcywgdW5zaWduZWQgY2hhciB0LCBib29sIElzTWlwczY0RUwpIHsKKyAgICB0aGlzLT5zZXRSSW5mbygocyA8PCA4KSArIHQsIElzTWlwczY0RUwpOworICB9Cit9OworCit0ZW1wbGF0ZSA8ZW5kaWFubmVzcyBUYXJnZXRFbmRpYW5uZXNzPgorc3RydWN0IEVsZl9SZWxfSW1wbDxFTEZUeXBlPFRhcmdldEVuZGlhbm5lc3MsIGZhbHNlPiwgdHJ1ZT4KKyAgICA6IHB1YmxpYyBFbGZfUmVsX0ltcGw8RUxGVHlwZTxUYXJnZXRFbmRpYW5uZXNzLCBmYWxzZT4sIGZhbHNlPiB7CisgIExMVk1fRUxGX0lNUE9SVF9UWVBFUyhUYXJnZXRFbmRpYW5uZXNzLCBmYWxzZSkKKyAgc3RhdGljIGNvbnN0IGJvb2wgSXNSZWxhID0gdHJ1ZTsKKyAgRWxmX1N3b3JkIHJfYWRkZW5kOyAvLyBDb21wdXRlIHZhbHVlIGZvciByZWxvY2F0YWJsZSBmaWVsZCBieSBhZGRpbmcgdGhpcworfTsKKwordGVtcGxhdGUgPGVuZGlhbm5lc3MgVGFyZ2V0RW5kaWFubmVzcz4KK3N0cnVjdCBFbGZfUmVsX0ltcGw8RUxGVHlwZTxUYXJnZXRFbmRpYW5uZXNzLCB0cnVlPiwgZmFsc2U+IHsKKyAgTExWTV9FTEZfSU1QT1JUX1RZUEVTKFRhcmdldEVuZGlhbm5lc3MsIHRydWUpCisgIHN0YXRpYyBjb25zdCBib29sIElzUmVsYSA9IGZhbHNlOworICBFbGZfQWRkciByX29mZnNldDsgLy8gTG9jYXRpb24gKGZpbGUgYnl0ZSBvZmZzZXQsIG9yIHByb2dyYW0gdmlydHVhbCBhZGRyKQorICBFbGZfWHdvcmQgcl9pbmZvOyAgLy8gU3ltYm9sIHRhYmxlIGluZGV4IGFuZCB0eXBlIG9mIHJlbG9jYXRpb24gdG8gYXBwbHkKKworICB1aW50NjRfdCBnZXRSSW5mbyhib29sIGlzTWlwczY0RUwpIGNvbnN0IHsKKyAgICB1aW50NjRfdCB0ID0gcl9pbmZvOworICAgIGlmICghaXNNaXBzNjRFTCkKKyAgICAgIHJldHVybiB0OworICAgIC8vIE1pcHM2NCBsaXR0bGUgZW5kaWFuIGhhcyBhICJzcGVjaWFsIiBlbmNvZGluZyBvZiByX2luZm8uIEluc3RlYWQgb2Ygb25lCisgICAgLy8gNjQgYml0IGxpdHRsZSBlbmRpYW4gbnVtYmVyLCBpdCBpcyBhIGxpdHRsZSBlbmRpYW4gMzIgYml0IG51bWJlciBmb2xsb3dlZAorICAgIC8vIGJ5IGEgMzIgYml0IGJpZyBlbmRpYW4gbnVtYmVyLgorICAgIHJldHVybiAodCA8PCAzMikgfCAoKHQgPj4gOCkgJiAweGZmMDAwMDAwKSB8ICgodCA+PiAyNCkgJiAweDAwZmYwMDAwKSB8CisgICAgICAgICAgICgodCA+PiA0MCkgJiAweDAwMDBmZjAwKSB8ICgodCA+PiA1NikgJiAweDAwMDAwMGZmKTsKKyAgfQorCisgIHZvaWQgc2V0UkluZm8odWludDY0X3QgUiwgYm9vbCBJc01pcHM2NEVMKSB7CisgICAgaWYgKElzTWlwczY0RUwpCisgICAgICByX2luZm8gPSAoUiA+PiAzMikgfCAoKFIgJiAweGZmMDAwMDAwKSA8PCA4KSB8ICgoUiAmIDB4MDBmZjAwMDApIDw8IDI0KSB8CisgICAgICAgICAgICAgICAoKFIgJiAweDAwMDBmZjAwKSA8PCA0MCkgfCAoKFIgJiAweDAwMDAwMGZmKSA8PCA1Nik7CisgICAgZWxzZQorICAgICAgcl9pbmZvID0gUjsKKyAgfQorCisgIC8vIFRoZXNlIGFjY2Vzc29ycyBhbmQgbXV0YXRvcnMgY29ycmVzcG9uZCB0byB0aGUgRUxGNjRfUl9TWU0sIEVMRjY0X1JfVFlQRSwKKyAgLy8gYW5kIEVMRjY0X1JfSU5GTyBtYWNyb3MgZGVmaW5lZCBpbiB0aGUgRUxGIHNwZWNpZmljYXRpb246CisgIHVpbnQzMl90IGdldFN5bWJvbChib29sIGlzTWlwczY0RUwpIGNvbnN0IHsKKyAgICByZXR1cm4gKHVpbnQzMl90KSh0aGlzLT5nZXRSSW5mbyhpc01pcHM2NEVMKSA+PiAzMik7CisgIH0KKyAgdWludDMyX3QgZ2V0VHlwZShib29sIGlzTWlwczY0RUwpIGNvbnN0IHsKKyAgICByZXR1cm4gKHVpbnQzMl90KSh0aGlzLT5nZXRSSW5mbyhpc01pcHM2NEVMKSAmIDB4ZmZmZmZmZmZMKTsKKyAgfQorICB2b2lkIHNldFN5bWJvbCh1aW50MzJfdCBzLCBib29sIElzTWlwczY0RUwpIHsKKyAgICBzZXRTeW1ib2xBbmRUeXBlKHMsIGdldFR5cGUoSXNNaXBzNjRFTCksIElzTWlwczY0RUwpOworICB9CisgIHZvaWQgc2V0VHlwZSh1aW50MzJfdCB0LCBib29sIElzTWlwczY0RUwpIHsKKyAgICBzZXRTeW1ib2xBbmRUeXBlKGdldFN5bWJvbChJc01pcHM2NEVMKSwgdCwgSXNNaXBzNjRFTCk7CisgIH0KKyAgdm9pZCBzZXRTeW1ib2xBbmRUeXBlKHVpbnQzMl90IHMsIHVpbnQzMl90IHQsIGJvb2wgSXNNaXBzNjRFTCkgeworICAgIHRoaXMtPnNldFJJbmZvKCgodWludDY0X3QpcyA8PCAzMikgKyAodCAmIDB4ZmZmZmZmZmZMKSwgSXNNaXBzNjRFTCk7CisgIH0KK307CisKK3RlbXBsYXRlIDxlbmRpYW5uZXNzIFRhcmdldEVuZGlhbm5lc3M+CitzdHJ1Y3QgRWxmX1JlbF9JbXBsPEVMRlR5cGU8VGFyZ2V0RW5kaWFubmVzcywgdHJ1ZT4sIHRydWU+CisgICAgOiBwdWJsaWMgRWxmX1JlbF9JbXBsPEVMRlR5cGU8VGFyZ2V0RW5kaWFubmVzcywgdHJ1ZT4sIGZhbHNlPiB7CisgIExMVk1fRUxGX0lNUE9SVF9UWVBFUyhUYXJnZXRFbmRpYW5uZXNzLCB0cnVlKQorICBzdGF0aWMgY29uc3QgYm9vbCBJc1JlbGEgPSB0cnVlOworICBFbGZfU3h3b3JkIHJfYWRkZW5kOyAvLyBDb21wdXRlIHZhbHVlIGZvciByZWxvY2F0YWJsZSBmaWVsZCBieSBhZGRpbmcgdGhpcy4KK307CisKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorc3RydWN0IEVsZl9FaGRyX0ltcGwgeworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVNfRUxGVChFTEZUKQorICB1bnNpZ25lZCBjaGFyIGVfaWRlbnRbRUxGOjpFSV9OSURFTlRdOyAvLyBFTEYgSWRlbnRpZmljYXRpb24gYnl0ZXMKKyAgRWxmX0hhbGYgZV90eXBlOyAgICAgICAgICAgICAgICAgICAgICAgLy8gVHlwZSBvZiBmaWxlIChzZWUgRVRfKikKKyAgRWxmX0hhbGYgZV9tYWNoaW5lOyAgIC8vIFJlcXVpcmVkIGFyY2hpdGVjdHVyZSBmb3IgdGhpcyBmaWxlIChzZWUgRU1fKikKKyAgRWxmX1dvcmQgZV92ZXJzaW9uOyAgIC8vIE11c3QgYmUgZXF1YWwgdG8gMQorICBFbGZfQWRkciBlX2VudHJ5OyAgICAgLy8gQWRkcmVzcyB0byBqdW1wIHRvIGluIG9yZGVyIHRvIHN0YXJ0IHByb2dyYW0KKyAgRWxmX09mZiBlX3Bob2ZmOyAgICAgIC8vIFByb2dyYW0gaGVhZGVyIHRhYmxlJ3MgZmlsZSBvZmZzZXQsIGluIGJ5dGVzCisgIEVsZl9PZmYgZV9zaG9mZjsgICAgICAvLyBTZWN0aW9uIGhlYWRlciB0YWJsZSdzIGZpbGUgb2Zmc2V0LCBpbiBieXRlcworICBFbGZfV29yZCBlX2ZsYWdzOyAgICAgLy8gUHJvY2Vzc29yLXNwZWNpZmljIGZsYWdzCisgIEVsZl9IYWxmIGVfZWhzaXplOyAgICAvLyBTaXplIG9mIEVMRiBoZWFkZXIsIGluIGJ5dGVzCisgIEVsZl9IYWxmIGVfcGhlbnRzaXplOyAvLyBTaXplIG9mIGFuIGVudHJ5IGluIHRoZSBwcm9ncmFtIGhlYWRlciB0YWJsZQorICBFbGZfSGFsZiBlX3BobnVtOyAgICAgLy8gTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHByb2dyYW0gaGVhZGVyIHRhYmxlCisgIEVsZl9IYWxmIGVfc2hlbnRzaXplOyAvLyBTaXplIG9mIGFuIGVudHJ5IGluIHRoZSBzZWN0aW9uIGhlYWRlciB0YWJsZQorICBFbGZfSGFsZiBlX3NobnVtOyAgICAgLy8gTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIHNlY3Rpb24gaGVhZGVyIHRhYmxlCisgIEVsZl9IYWxmIGVfc2hzdHJuZHg7ICAvLyBTZWN0aW9uIGhlYWRlciB0YWJsZSBpbmRleCBvZiBzZWN0aW9uIG5hbWUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0cmluZyB0YWJsZQorCisgIGJvb2wgY2hlY2tNYWdpYygpIGNvbnN0IHsKKyAgICByZXR1cm4gKG1lbWNtcChlX2lkZW50LCBFTEY6OkVsZk1hZ2ljLCBzdHJsZW4oRUxGOjpFbGZNYWdpYykpKSA9PSAwOworICB9CisKKyAgdW5zaWduZWQgY2hhciBnZXRGaWxlQ2xhc3MoKSBjb25zdCB7IHJldHVybiBlX2lkZW50W0VMRjo6RUlfQ0xBU1NdOyB9CisgIHVuc2lnbmVkIGNoYXIgZ2V0RGF0YUVuY29kaW5nKCkgY29uc3QgeyByZXR1cm4gZV9pZGVudFtFTEY6OkVJX0RBVEFdOyB9Cit9OworCit0ZW1wbGF0ZSA8ZW5kaWFubmVzcyBUYXJnZXRFbmRpYW5uZXNzPgorc3RydWN0IEVsZl9QaGRyX0ltcGw8RUxGVHlwZTxUYXJnZXRFbmRpYW5uZXNzLCBmYWxzZT4+IHsKKyAgTExWTV9FTEZfSU1QT1JUX1RZUEVTKFRhcmdldEVuZGlhbm5lc3MsIGZhbHNlKQorICBFbGZfV29yZCBwX3R5cGU7ICAgLy8gVHlwZSBvZiBzZWdtZW50CisgIEVsZl9PZmYgcF9vZmZzZXQ7ICAvLyBGaWxlT2Zmc2V0IHdoZXJlIHNlZ21lbnQgaXMgbG9jYXRlZCwgaW4gYnl0ZXMKKyAgRWxmX0FkZHIgcF92YWRkcjsgIC8vIFZpcnR1YWwgQWRkcmVzcyBvZiBiZWdpbm5pbmcgb2Ygc2VnbWVudAorICBFbGZfQWRkciBwX3BhZGRyOyAgLy8gUGh5c2ljYWwgYWRkcmVzcyBvZiBiZWdpbm5pbmcgb2Ygc2VnbWVudCAoT1Mtc3BlY2lmaWMpCisgIEVsZl9Xb3JkIHBfZmlsZXN6OyAvLyBOdW0uIG9mIGJ5dGVzIGluIGZpbGUgaW1hZ2Ugb2Ygc2VnbWVudCAobWF5IGJlIHplcm8pCisgIEVsZl9Xb3JkIHBfbWVtc3o7ICAvLyBOdW0uIG9mIGJ5dGVzIGluIG1lbSBpbWFnZSBvZiBzZWdtZW50IChtYXkgYmUgemVybykKKyAgRWxmX1dvcmQgcF9mbGFnczsgIC8vIFNlZ21lbnQgZmxhZ3MKKyAgRWxmX1dvcmQgcF9hbGlnbjsgIC8vIFNlZ21lbnQgYWxpZ25tZW50IGNvbnN0cmFpbnQKK307CisKK3RlbXBsYXRlIDxlbmRpYW5uZXNzIFRhcmdldEVuZGlhbm5lc3M+CitzdHJ1Y3QgRWxmX1BoZHJfSW1wbDxFTEZUeXBlPFRhcmdldEVuZGlhbm5lc3MsIHRydWU+PiB7CisgIExMVk1fRUxGX0lNUE9SVF9UWVBFUyhUYXJnZXRFbmRpYW5uZXNzLCB0cnVlKQorICBFbGZfV29yZCBwX3R5cGU7ICAgIC8vIFR5cGUgb2Ygc2VnbWVudAorICBFbGZfV29yZCBwX2ZsYWdzOyAgIC8vIFNlZ21lbnQgZmxhZ3MKKyAgRWxmX09mZiBwX29mZnNldDsgICAvLyBGaWxlT2Zmc2V0IHdoZXJlIHNlZ21lbnQgaXMgbG9jYXRlZCwgaW4gYnl0ZXMKKyAgRWxmX0FkZHIgcF92YWRkcjsgICAvLyBWaXJ0dWFsIEFkZHJlc3Mgb2YgYmVnaW5uaW5nIG9mIHNlZ21lbnQKKyAgRWxmX0FkZHIgcF9wYWRkcjsgICAvLyBQaHlzaWNhbCBhZGRyZXNzIG9mIGJlZ2lubmluZyBvZiBzZWdtZW50IChPUy1zcGVjaWZpYykKKyAgRWxmX1h3b3JkIHBfZmlsZXN6OyAvLyBOdW0uIG9mIGJ5dGVzIGluIGZpbGUgaW1hZ2Ugb2Ygc2VnbWVudCAobWF5IGJlIHplcm8pCisgIEVsZl9Yd29yZCBwX21lbXN6OyAgLy8gTnVtLiBvZiBieXRlcyBpbiBtZW0gaW1hZ2Ugb2Ygc2VnbWVudCAobWF5IGJlIHplcm8pCisgIEVsZl9Yd29yZCBwX2FsaWduOyAgLy8gU2VnbWVudCBhbGlnbm1lbnQgY29uc3RyYWludAorfTsKKworLy8gRUxGVCBuZWVkZWQgZm9yIGVuZGlhbm5lc3MuCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3N0cnVjdCBFbGZfSGFzaF9JbXBsIHsKKyAgTExWTV9FTEZfSU1QT1JUX1RZUEVTX0VMRlQoRUxGVCkKKyAgRWxmX1dvcmQgbmJ1Y2tldDsKKyAgRWxmX1dvcmQgbmNoYWluOworCisgIEFycmF5UmVmPEVsZl9Xb3JkPiBidWNrZXRzKCkgY29uc3QgeworICAgIHJldHVybiBBcnJheVJlZjxFbGZfV29yZD4oJm5idWNrZXQgKyAyLCAmbmJ1Y2tldCArIDIgKyBuYnVja2V0KTsKKyAgfQorCisgIEFycmF5UmVmPEVsZl9Xb3JkPiBjaGFpbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIEFycmF5UmVmPEVsZl9Xb3JkPigmbmJ1Y2tldCArIDIgKyBuYnVja2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5idWNrZXQgKyAyICsgbmJ1Y2tldCArIG5jaGFpbik7CisgIH0KK307CisKKy8vIC5nbnUuaGFzaCBzZWN0aW9uCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK3N0cnVjdCBFbGZfR251SGFzaF9JbXBsIHsKKyAgTExWTV9FTEZfSU1QT1JUX1RZUEVTX0VMRlQoRUxGVCkKKyAgRWxmX1dvcmQgbmJ1Y2tldHM7CisgIEVsZl9Xb3JkIHN5bW5keDsKKyAgRWxmX1dvcmQgbWFza3dvcmRzOworICBFbGZfV29yZCBzaGlmdDI7CisKKyAgQXJyYXlSZWY8RWxmX09mZj4gZmlsdGVyKCkgY29uc3QgeworICAgIHJldHVybiBBcnJheVJlZjxFbGZfT2ZmPihyZWludGVycHJldF9jYXN0PGNvbnN0IEVsZl9PZmYgKj4oJnNoaWZ0MiArIDEpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrd29yZHMpOworICB9CisKKyAgQXJyYXlSZWY8RWxmX1dvcmQ+IGJ1Y2tldHMoKSBjb25zdCB7CisgICAgcmV0dXJuIEFycmF5UmVmPEVsZl9Xb3JkPigKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFbGZfV29yZCAqPihmaWx0ZXIoKS5lbmQoKSksIG5idWNrZXRzKTsKKyAgfQorCisgIEFycmF5UmVmPEVsZl9Xb3JkPiB2YWx1ZXModW5zaWduZWQgRHluYW1pY1N5bUNvdW50KSBjb25zdCB7CisgICAgcmV0dXJuIEFycmF5UmVmPEVsZl9Xb3JkPihidWNrZXRzKCkuZW5kKCksIER5bmFtaWNTeW1Db3VudCAtIHN5bW5keCk7CisgIH0KK307CisKKy8vIENvbXByZXNzZWQgc2VjdGlvbiBoZWFkZXJzLgorLy8gaHR0cDovL3d3dy5zY28uY29tL2RldmVsb3BlcnMvZ2FiaS9sYXRlc3QvY2g0LnNoZWFkZXIuaHRtbCNjb21wcmVzc2lvbl9oZWFkZXIKK3RlbXBsYXRlIDxlbmRpYW5uZXNzIFRhcmdldEVuZGlhbm5lc3M+CitzdHJ1Y3QgRWxmX0NoZHJfSW1wbDxFTEZUeXBlPFRhcmdldEVuZGlhbm5lc3MsIGZhbHNlPj4geworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVMoVGFyZ2V0RW5kaWFubmVzcywgZmFsc2UpCisgIEVsZl9Xb3JkIGNoX3R5cGU7CisgIEVsZl9Xb3JkIGNoX3NpemU7CisgIEVsZl9Xb3JkIGNoX2FkZHJhbGlnbjsKK307CisKK3RlbXBsYXRlIDxlbmRpYW5uZXNzIFRhcmdldEVuZGlhbm5lc3M+CitzdHJ1Y3QgRWxmX0NoZHJfSW1wbDxFTEZUeXBlPFRhcmdldEVuZGlhbm5lc3MsIHRydWU+PiB7CisgIExMVk1fRUxGX0lNUE9SVF9UWVBFUyhUYXJnZXRFbmRpYW5uZXNzLCB0cnVlKQorICBFbGZfV29yZCBjaF90eXBlOworICBFbGZfV29yZCBjaF9yZXNlcnZlZDsKKyAgRWxmX1h3b3JkIGNoX3NpemU7CisgIEVsZl9Yd29yZCBjaF9hZGRyYWxpZ247Cit9OworCisvLy8gTm90ZSBoZWFkZXIKK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorc3RydWN0IEVsZl9OaGRyX0ltcGwgeworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVNfRUxGVChFTEZUKQorICBFbGZfV29yZCBuX25hbWVzejsKKyAgRWxmX1dvcmQgbl9kZXNjc3o7CisgIEVsZl9Xb3JkIG5fdHlwZTsKKworICAvLy8gVGhlIGFsaWdubWVudCBvZiB0aGUgbmFtZSBhbmQgZGVzY3JpcHRvci4KKyAgLy8vCisgIC8vLyBJbXBsZW1lbnRhdGlvbnMgZGlmZmVyIGZyb20gdGhlIHNwZWNpZmljYXRpb24gaGVyZTogaW4gcHJhY3RpY2UgYWxsCisgIC8vLyB2YXJpYW50cyBhbGlnbiBib3RoIHRoZSBuYW1lIGFuZCBkZXNjcmlwdG9yIHRvIDQtYnl0ZXMuCisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgQWxpZ24gPSA0OworCisgIC8vLyBHZXQgdGhlIHNpemUgb2YgdGhlIG5vdGUsIGluY2x1ZGluZyBuYW1lLCBkZXNjcmlwdG9yLCBhbmQgcGFkZGluZy4KKyAgc2l6ZV90IGdldFNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIHNpemVvZigqdGhpcykgKyBhbGlnblRvPEFsaWduPihuX25hbWVzeikgKyBhbGlnblRvPEFsaWduPihuX2Rlc2Nzeik7CisgIH0KK307CisKKy8vLyBBbiBFTEYgbm90ZS4KKy8vLworLy8vIFdyYXBzIGEgbm90ZSBoZWFkZXIsIHByb3ZpZGluZyBtZXRob2RzIGZvciBhY2Nlc3NpbmcgdGhlIG5hbWUgYW5kCisvLy8gZGVzY3JpcHRvciBzYWZlbHkuCit0ZW1wbGF0ZSA8Y2xhc3MgRUxGVD4KK2NsYXNzIEVsZl9Ob3RlX0ltcGwgeworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVNfRUxGVChFTEZUKQorCisgIGNvbnN0IEVsZl9OaGRyX0ltcGw8RUxGVD4gJk5oZHI7CisKKyAgdGVtcGxhdGUgPGNsYXNzIE5vdGVJdGVyYXRvckVMRlQ+IGZyaWVuZCBjbGFzcyBFbGZfTm90ZV9JdGVyYXRvcl9JbXBsOworCisgIEVsZl9Ob3RlX0ltcGwoY29uc3QgRWxmX05oZHJfSW1wbDxFTEZUPiAmTmhkcikgOiBOaGRyKE5oZHIpIHt9CisKK3B1YmxpYzoKKyAgLy8vIEdldCB0aGUgbm90ZSdzIG5hbWUsIGV4Y2x1ZGluZyB0aGUgdGVybWluYXRpbmcgbnVsbCBieXRlLgorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsKKyAgICBpZiAoIU5oZHIubl9uYW1lc3opCisgICAgICByZXR1cm4gU3RyaW5nUmVmKCk7CisgICAgcmV0dXJuIFN0cmluZ1JlZihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oJk5oZHIpICsgc2l6ZW9mKE5oZHIpLAorICAgICAgICAgICAgICAgICAgICAgTmhkci5uX25hbWVzeiAtIDEpOworICB9CisKKyAgLy8vIEdldCB0aGUgbm90ZSdzIGRlc2NyaXB0b3IuCisgIEFycmF5UmVmPEVsZl9Xb3JkPiBnZXREZXNjKCkgY29uc3QgeworICAgIGlmICghTmhkci5uX2Rlc2NzeikKKyAgICAgIHJldHVybiBBcnJheVJlZjxFbGZfV29yZD4oKTsKKyAgICByZXR1cm4gQXJyYXlSZWY8RWxmX1dvcmQ+KAorICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IEVsZl9Xb3JkICo+KAorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KCZOaGRyKSArIHNpemVvZihOaGRyKSArCisgICAgICAgICAgICBhbGlnblRvPEVsZl9OaGRyX0ltcGw8RUxGVD46OkFsaWduPihOaGRyLm5fbmFtZXN6KSksCisgICAgICAgIE5oZHIubl9kZXNjc3opOworICB9CisKKyAgLy8vIEdldCB0aGUgbm90ZSdzIHR5cGUuCisgIEVsZl9Xb3JkIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBOaGRyLm5fdHlwZTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIEVMRlQ+CitjbGFzcyBFbGZfTm90ZV9JdGVyYXRvcl9JbXBsCisgICAgOiBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIEVsZl9Ob3RlX0ltcGw8RUxGVD4+IHsKKyAgLy8gTmhkciBiZWluZyBhIG51bGxwdHIgbWFya3MgdGhlIGVuZCBvZiBpdGVyYXRpb24uCisgIGNvbnN0IEVsZl9OaGRyX0ltcGw8RUxGVD4gKk5oZHIgPSBudWxscHRyOworICBzaXplX3QgUmVtYWluaW5nU2l6ZSA9IDB1OworICBFcnJvciAqRXJyID0gbnVsbHB0cjsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgRUxGRmlsZUVMRlQ+IGZyaWVuZCBjbGFzcyBFTEZGaWxlOworCisgIC8vIFN0b3AgaXRlcmF0aW9uIGFuZCBpbmRpY2F0ZSBhbiBvdmVyZmxvdy4KKyAgdm9pZCBzdG9wV2l0aE92ZXJmbG93RXJyb3IoKSB7CisgICAgTmhkciA9IG51bGxwdHI7CisgICAgKkVyciA9IG1ha2VfZXJyb3I8U3RyaW5nRXJyb3I+KCJFTEYgbm90ZSBvdmVyZmxvd3MgY29udGFpbmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X2Vycm9yOjpwYXJzZV9mYWlsZWQpOworICB9CisKKyAgLy8gQWR2YW5jZSBOaGRyIGJ5IE5vdGVTaXplIGJ5dGVzLCBzdGFydGluZyBmcm9tIE5oZHJQb3MuCisgIC8vCisgIC8vIEFzc3VtZXMgTm90ZVNpemUgPD0gUmVtYWluaW5nU2l6ZS4gRW5zdXJlcyBOaGRyLT5nZXRTaXplKCkgPD0gUmVtYWluaW5nU2l6ZQorICAvLyB1cG9uIHJldHVybmluZy4gSGFuZGxlcyBzdG9wcGluZyBpdGVyYXRpb24gd2hlbiByZWFjaGluZyB0aGUgZW5kIG9mIHRoZQorICAvLyBjb250YWluZXIsIGVpdGhlciBjbGVhbmx5IG9yIHdpdGggYW4gb3ZlcmZsb3cgZXJyb3IuCisgIHZvaWQgYWR2YW5jZU5oZHIoY29uc3QgdWludDhfdCAqTmhkclBvcywgc2l6ZV90IE5vdGVTaXplKSB7CisgICAgUmVtYWluaW5nU2l6ZSAtPSBOb3RlU2l6ZTsKKyAgICBpZiAoUmVtYWluaW5nU2l6ZSA9PSAwdSkKKyAgICAgIE5oZHIgPSBudWxscHRyOworICAgIGVsc2UgaWYgKHNpemVvZigqTmhkcikgPiBSZW1haW5pbmdTaXplKQorICAgICAgc3RvcFdpdGhPdmVyZmxvd0Vycm9yKCk7CisgICAgZWxzZSB7CisgICAgICBOaGRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFbGZfTmhkcl9JbXBsPEVMRlQ+ICo+KE5oZHJQb3MgKyBOb3RlU2l6ZSk7CisgICAgICBpZiAoTmhkci0+Z2V0U2l6ZSgpID4gUmVtYWluaW5nU2l6ZSkKKyAgICAgICAgc3RvcFdpdGhPdmVyZmxvd0Vycm9yKCk7CisgICAgfQorICB9CisKKyAgRWxmX05vdGVfSXRlcmF0b3JfSW1wbCgpIHt9CisgIGV4cGxpY2l0IEVsZl9Ob3RlX0l0ZXJhdG9yX0ltcGwoRXJyb3IgJkVycikgOiBFcnIoJkVycikge30KKyAgRWxmX05vdGVfSXRlcmF0b3JfSW1wbChjb25zdCB1aW50OF90ICpTdGFydCwgc2l6ZV90IFNpemUsIEVycm9yICZFcnIpCisgICAgICA6IFJlbWFpbmluZ1NpemUoU2l6ZSksIEVycigmRXJyKSB7CisgICAgYXNzZXJ0KFN0YXJ0ICYmICJFTEYgbm90ZSBpdGVyYXRvciBzdGFydGluZyBhdCBOVUxMIik7CisgICAgYWR2YW5jZU5oZHIoU3RhcnQsIDB1KTsKKyAgfQorCitwdWJsaWM6CisgIEVsZl9Ob3RlX0l0ZXJhdG9yX0ltcGwgJm9wZXJhdG9yKysoKSB7CisgICAgYXNzZXJ0KE5oZHIgJiYgImluY3JlbWVudGVkIEVMRiBub3RlIGVuZCBpdGVyYXRvciIpOworICAgIGNvbnN0IHVpbnQ4X3QgKk5oZHJQb3MgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oTmhkcik7CisgICAgc2l6ZV90IE5vdGVTaXplID0gTmhkci0+Z2V0U2l6ZSgpOworICAgIGFkdmFuY2VOaGRyKE5oZHJQb3MsIE5vdGVTaXplKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgYm9vbCBvcGVyYXRvcj09KEVsZl9Ob3RlX0l0ZXJhdG9yX0ltcGwgT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gTmhkciA9PSBPdGhlci5OaGRyOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShFbGZfTm90ZV9JdGVyYXRvcl9JbXBsIE90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuICEoKnRoaXMgPT0gT3RoZXIpOworICB9CisgIEVsZl9Ob3RlX0ltcGw8RUxGVD4gb3BlcmF0b3IqKCkgY29uc3QgeworICAgIGFzc2VydChOaGRyICYmICJkZXJlZmVyZW5jZWQgRUxGIG5vdGUgZW5kIGl0ZXJhdG9yIik7CisgICAgcmV0dXJuIEVsZl9Ob3RlX0ltcGw8RUxGVD4oKk5oZHIpOworICB9Cit9OworCisvLyBNSVBTIC5yZWdpbmZvIHNlY3Rpb24KK3RlbXBsYXRlIDxjbGFzcyBFTEZUPgorc3RydWN0IEVsZl9NaXBzX1JlZ0luZm87CisKK3RlbXBsYXRlIDxzdXBwb3J0OjplbmRpYW5uZXNzIFRhcmdldEVuZGlhbm5lc3M+CitzdHJ1Y3QgRWxmX01pcHNfUmVnSW5mbzxFTEZUeXBlPFRhcmdldEVuZGlhbm5lc3MsIGZhbHNlPj4geworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVMoVGFyZ2V0RW5kaWFubmVzcywgZmFsc2UpCisgIEVsZl9Xb3JkIHJpX2dwcm1hc2s7ICAgICAvLyBiaXQtbWFzayBvZiB1c2VkIGdlbmVyYWwgcmVnaXN0ZXJzCisgIEVsZl9Xb3JkIHJpX2Nwcm1hc2tbNF07ICAvLyBiaXQtbWFzayBvZiB1c2VkIGNvLXByb2Nlc3NvciByZWdpc3RlcnMKKyAgRWxmX0FkZHIgcmlfZ3BfdmFsdWU7ICAgIC8vIGdwIHJlZ2lzdGVyIHZhbHVlCit9OworCit0ZW1wbGF0ZSA8c3VwcG9ydDo6ZW5kaWFubmVzcyBUYXJnZXRFbmRpYW5uZXNzPgorc3RydWN0IEVsZl9NaXBzX1JlZ0luZm88RUxGVHlwZTxUYXJnZXRFbmRpYW5uZXNzLCB0cnVlPj4geworICBMTFZNX0VMRl9JTVBPUlRfVFlQRVMoVGFyZ2V0RW5kaWFubmVzcywgdHJ1ZSkKKyAgRWxmX1dvcmQgcmlfZ3BybWFzazsgICAgIC8vIGJpdC1tYXNrIG9mIHVzZWQgZ2VuZXJhbCByZWdpc3RlcnMKKyAgRWxmX1dvcmQgcmlfcGFkOyAgICAgICAgIC8vIHVudXNlZCBwYWRkaW5nIGZpZWxkCisgIEVsZl9Xb3JkIHJpX2Nwcm1hc2tbNF07ICAvLyBiaXQtbWFzayBvZiB1c2VkIGNvLXByb2Nlc3NvciByZWdpc3RlcnMKKyAgRWxmX0FkZHIgcmlfZ3BfdmFsdWU7ICAgIC8vIGdwIHJlZ2lzdGVyIHZhbHVlCit9OworCisvLyAuTUlQUy5vcHRpb25zIHNlY3Rpb24KK3RlbXBsYXRlIDxjbGFzcyBFTEZUPiBzdHJ1Y3QgRWxmX01pcHNfT3B0aW9ucyB7CisgIExMVk1fRUxGX0lNUE9SVF9UWVBFU19FTEZUKEVMRlQpCisgIHVpbnQ4X3Qga2luZDsgICAgIC8vIERldGVybWluZXMgaW50ZXJwcmV0YXRpb24gb2YgdmFyaWFibGUgcGFydCBvZiBkZXNjcmlwdG9yCisgIHVpbnQ4X3Qgc2l6ZTsgICAgIC8vIEJ5dGUgc2l6ZSBvZiBkZXNjcmlwdG9yLCBpbmNsdWRpbmcgdGhpcyBoZWFkZXIKKyAgRWxmX0hhbGYgc2VjdGlvbjsgLy8gU2VjdGlvbiBoZWFkZXIgaW5kZXggb2Ygc2VjdGlvbiBhZmZlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgLy8gb3IgMCBmb3IgZ2xvYmFsIG9wdGlvbnMKKyAgRWxmX1dvcmQgaW5mbzsgICAgLy8gS2luZC1zcGVjaWZpYyBpbmZvcm1hdGlvbgorCisgIEVsZl9NaXBzX1JlZ0luZm88RUxGVD4gJmdldFJlZ0luZm8oKSB7CisgICAgYXNzZXJ0KGtpbmQgPT0gRUxGOjpPREtfUkVHSU5GTyk7CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEVsZl9NaXBzX1JlZ0luZm88RUxGVD4gKj4oCisgICAgICAgICh1aW50OF90ICopdGhpcyArIHNpemVvZihFbGZfTWlwc19PcHRpb25zKSk7CisgIH0KKyAgY29uc3QgRWxmX01pcHNfUmVnSW5mbzxFTEZUPiAmZ2V0UmVnSW5mbygpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxFbGZfTWlwc19PcHRpb25zICo+KHRoaXMpLT5nZXRSZWdJbmZvKCk7CisgIH0KK307CisKKy8vIC5NSVBTLmFiaWZsYWdzIHNlY3Rpb24gY29udGVudAordGVtcGxhdGUgPGNsYXNzIEVMRlQ+IHN0cnVjdCBFbGZfTWlwc19BQklGbGFncyB7CisgIExMVk1fRUxGX0lNUE9SVF9UWVBFU19FTEZUKEVMRlQpCisgIEVsZl9IYWxmIHZlcnNpb247ICAvLyBWZXJzaW9uIG9mIHRoZSBzdHJ1Y3R1cmUKKyAgdWludDhfdCBpc2FfbGV2ZWw7IC8vIElTQSBsZXZlbDogMS01LCAzMiwgYW5kIDY0CisgIHVpbnQ4X3QgaXNhX3JldjsgICAvLyBJU0EgcmV2aXNpb24gKDAgZm9yIE1JUFMgSSAtIE1JUFMgVikKKyAgdWludDhfdCBncHJfc2l6ZTsgIC8vIEdlbmVyYWwgcHVycG9zZSByZWdpc3RlcnMgc2l6ZQorICB1aW50OF90IGNwcjFfc2l6ZTsgLy8gQ28tcHJvY2Vzc29yIDEgcmVnaXN0ZXJzIHNpemUKKyAgdWludDhfdCBjcHIyX3NpemU7IC8vIENvLXByb2Nlc3NvciAyIHJlZ2lzdGVycyBzaXplCisgIHVpbnQ4X3QgZnBfYWJpOyAgICAvLyBGbG9hdGluZy1wb2ludCBBQkkgZmxhZworICBFbGZfV29yZCBpc2FfZXh0OyAgLy8gUHJvY2Vzc29yLXNwZWNpZmljIGV4dGVuc2lvbgorICBFbGZfV29yZCBhc2VzOyAgICAgLy8gQVNFcyBmbGFncworICBFbGZfV29yZCBmbGFnczE7ICAgLy8gR2VuZXJhbCBmbGFncworICBFbGZfV29yZCBmbGFnczI7ICAgLy8gR2VuZXJhbCBmbGFncworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9iamVjdC4KK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtLgorCisjZW5kaWYgLy8gTExWTV9PQkpFQ1RfRUxGVFlQRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvRXJyb3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWI5MzgzMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0Vycm9yLmgKQEAgLTAsMCArMSw5MiBAQAorLy89PT0tIEVycm9yLmggLSBzeXN0ZW1fZXJyb3IgZXh0ZW5zaW9ucyBmb3IgT2JqZWN0IC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGRlY2xhcmVzIGEgbmV3IGVycm9yX2NhdGVnb3J5IGZvciB0aGUgT2JqZWN0IGxpYnJhcnkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVF9FUlJPUl9ICisjZGVmaW5lIExMVk1fT0JKRUNUX0VSUk9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb2JqZWN0IHsKKworY2xhc3MgQmluYXJ5OworCitjb25zdCBzdGQ6OmVycm9yX2NhdGVnb3J5ICZvYmplY3RfY2F0ZWdvcnkoKTsKKworZW51bSBjbGFzcyBvYmplY3RfZXJyb3IgeworICAvLyBFcnJvciBjb2RlIDAgaXMgYWJzZW50LiBVc2Ugc3RkOjplcnJvcl9jb2RlKCkgaW5zdGVhZC4KKyAgYXJjaF9ub3RfZm91bmQgPSAxLAorICBpbnZhbGlkX2ZpbGVfdHlwZSwKKyAgcGFyc2VfZmFpbGVkLAorICB1bmV4cGVjdGVkX2VvZiwKKyAgc3RyaW5nX3RhYmxlX25vbl9udWxsX2VuZCwKKyAgaW52YWxpZF9zZWN0aW9uX2luZGV4LAorICBiaXRjb2RlX3NlY3Rpb25fbm90X2ZvdW5kLAorICBpbnZhbGlkX3N5bWJvbF9pbmRleCwKK307CisKK2lubGluZSBzdGQ6OmVycm9yX2NvZGUgbWFrZV9lcnJvcl9jb2RlKG9iamVjdF9lcnJvciBlKSB7CisgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoc3RhdGljX2Nhc3Q8aW50PihlKSwgb2JqZWN0X2NhdGVnb3J5KCkpOworfQorCisvLy8gQmFzZSBjbGFzcyBmb3IgYWxsIGVycm9ycyBpbmRpY2F0aW5nIG1hbGZvcm1lZCBiaW5hcnkgZmlsZXMuCisvLy8KKy8vLyBIYXZpbmcgYSBzdWJjbGFzcyBmb3IgYWxsIG1hbGZvcm1lZCBiaW5hcnkgZmlsZXMgYWxsb3dzIGFyY2hpdmUtd2Fsa2luZworLy8vIGNvZGUgdG8gc2tpcCBtYWxmb3JtZWQgZmlsZXMgd2l0aG91dCBoYXZpbmcgdG8gdW5kZXJzdGFuZCBldmVyeSBwb3NzaWJsZQorLy8vIHdheSB0aGF0IGEgYmluYXJ5IGZpbGUgbWlnaHQgYmUgbWFsZm9ybWVkLgorLy8vCisvLy8gQ3VycmVudGx5IGluaGVyaXRzIGZyb20gRUNFcnJvciBmb3IgZWFzeSBpbnRlcm9wZXJhYmlsaXR5IHdpdGgKKy8vLyBzdGQ6OmVycm9yX2NvZGUsIGJ1dCB0aGlzIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUgZnV0dXJlLgorY2xhc3MgQmluYXJ5RXJyb3IgOiBwdWJsaWMgRXJyb3JJbmZvPEJpbmFyeUVycm9yLCBFQ0Vycm9yPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworICBCaW5hcnlFcnJvcigpIHsKKyAgICAvLyBEZWZhdWx0IHRvIHBhcnNlX2ZhaWxlZCwgY2FuIGJlIG92ZXJyaWRkZW4gd2l0aCBzZXRFcnJvckNvZGUuCisgICAgc2V0RXJyb3JDb2RlKG1ha2VfZXJyb3JfY29kZShvYmplY3RfZXJyb3I6OnBhcnNlX2ZhaWxlZCkpOworICB9Cit9OworCisvLy8gR2VuZXJpYyBiaW5hcnkgZXJyb3IuCisvLy8KKy8vLyBGb3IgZXJyb3JzIHRoYXQgZG9uJ3QgcmVxdWlyZSB0aGVpciBvd24gc3BlY2lmaWMgc3ViLWVycm9yIChtb3N0IGVycm9ycykKKy8vLyB0aGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGRlc2NyaWJlIHRoZSBlcnJvciB2aWEgYSBzdHJpbmcgbWVzc2FnZS4KK2NsYXNzIEdlbmVyaWNCaW5hcnlFcnJvciA6IHB1YmxpYyBFcnJvckluZm88R2VuZXJpY0JpbmFyeUVycm9yLCBCaW5hcnlFcnJvcj4geworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKyAgR2VuZXJpY0JpbmFyeUVycm9yKFR3aW5lIE1zZyk7CisgIEdlbmVyaWNCaW5hcnlFcnJvcihUd2luZSBNc2csIG9iamVjdF9lcnJvciBFQ092ZXJyaWRlKTsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgJmdldE1lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBNc2c7IH0KKyAgdm9pZCBsb2cocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZTsKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIE1zZzsKK307CisKKy8vLyBpc05vdE9iamVjdEVycm9ySW52YWxpZEZpbGVUeXBlKCkgaXMgdXNlZCB3aGVuIGxvb3BpbmcgdGhyb3VnaCB0aGUgY2hpbGRyZW4KKy8vLyBvZiBhbiBhcmNoaXZlIGFmdGVyIGNhbGxpbmcgZ2V0QXNCaW5hcnkoKSBvbiB0aGUgY2hpbGQgYW5kIGl0IHJldHVybnMgYW4KKy8vLyBsbHZtOjpFcnJvci4gIEluIHRoZSBjYXNlcyB3ZSB3YW50IHRvIGxvb3AgdGhyb3VnaCB0aGUgY2hpbGRyZW4gYW5kIGlnbm9yZSB0aGUKKy8vLyBub24tb2JqZWN0cyBpbiB0aGUgYXJjaGl2ZSB0aGlzIGlzIHVzZWQgdG8gdGVzdCB0aGUgZXJyb3IgdG8gc2VlIGlmIGFuCisvLy8gZXJyb3IoKSBmdW5jdGlvbiBuZWVkcyB0byBjYWxsZWQgb24gdGhlIGxsdm06OkVycm9yLgorRXJyb3IgaXNOb3RPYmplY3RFcnJvckludmFsaWRGaWxlVHlwZShsbHZtOjpFcnJvciBFcnIpOworCit9IC8vIGVuZCBuYW1lc3BhY2Ugb2JqZWN0LgorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bS4KKworbmFtZXNwYWNlIHN0ZCB7Cit0ZW1wbGF0ZSA8Pgorc3RydWN0IGlzX2Vycm9yX2NvZGVfZW51bTxsbHZtOjpvYmplY3Q6Om9iamVjdF9lcnJvcj4gOiBzdGQ6OnRydWVfdHlwZSB7fTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9JUk9iamVjdEZpbGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0lST2JqZWN0RmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMjcxYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9JUk9iamVjdEZpbGUuaApAQCAtMCwwICsxLDgyIEBACisvLz09PS0gSVJPYmplY3RGaWxlLmggLSBMTFZNIElSIG9iamVjdCBmaWxlIGltcGxlbWVudGF0aW9uIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgSVJPYmplY3RGaWxlIHRlbXBsYXRlIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RfSVJPQkpFQ1RGSUxFX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RfSVJPQkpFQ1RGSUxFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJVbmlvbi5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L0lSU3ltdGFiLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvTW9kdWxlU3ltYm9sVGFibGUuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9TeW1ib2xpY0ZpbGUuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgQml0Y29kZU1vZHVsZTsKK2NsYXNzIE1hbmdsZXI7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBHbG9iYWxWYWx1ZTsKK2NsYXNzIFRyaXBsZTsKKworbmFtZXNwYWNlIG9iamVjdCB7CitjbGFzcyBPYmplY3RGaWxlOworCitjbGFzcyBJUk9iamVjdEZpbGUgOiBwdWJsaWMgU3ltYm9saWNGaWxlIHsKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4+IE1vZHM7CisgIE1vZHVsZVN5bWJvbFRhYmxlIFN5bVRhYjsKKyAgSVJPYmplY3RGaWxlKE1lbW9yeUJ1ZmZlclJlZiBPYmplY3QsCisgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPj4gTW9kcyk7CisKK3B1YmxpYzoKKyAgfklST2JqZWN0RmlsZSgpIG92ZXJyaWRlOworICB2b2lkIG1vdmVTeW1ib2xOZXh0KERhdGFSZWZJbXBsICZTeW1iKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjplcnJvcl9jb2RlIHByaW50U3ltYm9sTmFtZShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFN5bWJvbEZsYWdzKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICBiYXNpY19zeW1ib2xfaXRlcmF0b3Igc3ltYm9sX2JlZ2luKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJhc2ljX3N5bWJvbF9pdGVyYXRvciBzeW1ib2xfZW5kKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgU3RyaW5nUmVmIGdldFRhcmdldFRyaXBsZSgpIGNvbnN0OworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQmluYXJ5ICp2KSB7CisgICAgcmV0dXJuIHYtPmlzSVIoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRmluZHMgYW5kIHJldHVybnMgYml0Y29kZSBlbWJlZGRlZCBpbiB0aGUgZ2l2ZW4gb2JqZWN0IGZpbGUsIG9yIGFuCisgIC8vLyBlcnJvciBjb2RlIGlmIG5vdCBmb3VuZC4KKyAgc3RhdGljIEV4cGVjdGVkPE1lbW9yeUJ1ZmZlclJlZj4gZmluZEJpdGNvZGVJbk9iamVjdChjb25zdCBPYmplY3RGaWxlICZPYmopOworCisgIC8vLyBcYnJpZWYgRmluZHMgYW5kIHJldHVybnMgYml0Y29kZSBpbiB0aGUgZ2l2ZW4gbWVtb3J5IGJ1ZmZlciAod2hpY2ggbWF5CisgIC8vLyBiZSBlaXRoZXIgYSBiaXRjb2RlIGZpbGUgb3IgYSBuYXRpdmUgb2JqZWN0IGZpbGUgd2l0aCBlbWJlZGRlZCBiaXRjb2RlKSwKKyAgLy8vIG9yIGFuIGVycm9yIGNvZGUgaWYgbm90IGZvdW5kLgorICBzdGF0aWMgRXhwZWN0ZWQ8TWVtb3J5QnVmZmVyUmVmPgorICBmaW5kQml0Y29kZUluTWVtQnVmZmVyKE1lbW9yeUJ1ZmZlclJlZiBPYmplY3QpOworCisgIHN0YXRpYyBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8SVJPYmplY3RGaWxlPj4gY3JlYXRlKE1lbW9yeUJ1ZmZlclJlZiBPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExMVk1Db250ZXh0ICZDb250ZXh0KTsKK307CisKKy8vLyBUaGUgY29udGVudHMgb2YgYSBiaXRjb2RlIGZpbGUgYW5kIGl0cyBpcnN5bXRhYi4gQW55IHVuZGVybHlpbmcgZGF0YQorLy8vIGZvciB0aGUgaXJzeW10YWIgYXJlIG93bmVkIGJ5IFN5bXRhYiBhbmQgU3RydGFiLgorc3RydWN0IElSU3ltdGFiRmlsZSB7CisgIHN0ZDo6dmVjdG9yPEJpdGNvZGVNb2R1bGU+IE1vZHM7CisgIFNtYWxsVmVjdG9yPGNoYXIsIDA+IFN5bXRhYiwgU3RydGFiOworICBpcnN5bXRhYjo6UmVhZGVyIFRoZVJlYWRlcjsKK307CisKKy8vLyBSZWFkcyBhIGJpdGNvZGUgZmlsZSwgY3JlYXRpbmcgaXRzIGlyc3ltdGFiIGlmIG5lY2Vzc2FyeS4KK0V4cGVjdGVkPElSU3ltdGFiRmlsZT4gcmVhZElSU3ltdGFiKE1lbW9yeUJ1ZmZlclJlZiBNQlJlZik7CisKK30KKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L0lSU3ltdGFiLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9JUlN5bXRhYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmNmEwMjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9JUlN5bXRhYi5oCkBAIC0wLDAgKzEsMzU4IEBACisvLz09PS0gSVJTeW10YWIuaCAtIGRhdGEgZGVmaW5pdGlvbnMgZm9yIElSIHN5bWJvbCB0YWJsZXMgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBkYXRhIGRlZmluaXRpb25zIGFuZCBhIHJlYWRlciBhbmQgYnVpbGRlciBmb3IgYSBzeW1ib2wKKy8vIHRhYmxlIGZvciBMTFZNIElSLiBJdHMgcHVycG9zZSBpcyB0byBhbGxvdyBsaW5rZXJzIGFuZCBvdGhlciBjb25zdW1lcnMgb2YKKy8vIGJpdGNvZGUgZmlsZXMgdG8gZWZmaWNpZW50bHkgcmVhZCB0aGUgc3ltYm9sIHRhYmxlIGZvciBzeW1ib2wgcmVzb2x1dGlvbgorLy8gcHVycG9zZXMgd2l0aG91dCBuZWVkaW5nIHRvIGNvbnN0cnVjdCBhIG1vZHVsZSBpbiBtZW1vcnkuCisvLworLy8gQXMgd2l0aCBtb3N0IG9iamVjdCBmaWxlcyB0aGUgc3ltYm9sIHRhYmxlIGhhcyB0d28gcGFydHM6IHRoZSBzeW1ib2wgdGFibGUKKy8vIGl0c2VsZiBhbmQgYSBzdHJpbmcgdGFibGUgd2hpY2ggaXMgcmVmZXJlbmNlZCBieSB0aGUgc3ltYm9sIHRhYmxlLgorLy8KKy8vIEEgc3ltYm9sIHRhYmxlIGNvcnJlc3BvbmRzIHRvIGEgc2luZ2xlIGJpdGNvZGUgZmlsZSwgd2hpY2ggbWF5IGNvbnNpc3Qgb2YKKy8vIG11bHRpcGxlIG1vZHVsZXMsIHNvIHN5bWJvbCB0YWJsZXMgbWF5IGxpa2V3aXNlIGNvbnRhaW4gc3ltYm9scyBmb3IgbXVsdGlwbGUKKy8vIG1vZHVsZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVF9JUlNZTVRBQl9ICisjZGVmaW5lIExMVk1fT0JKRUNUX0lSU1lNVEFCX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0dsb2JhbFZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvU3ltYm9saWNGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworc3RydWN0IEJpdGNvZGVGaWxlQ29udGVudHM7CitjbGFzcyBTdHJpbmdUYWJsZUJ1aWxkZXI7CisKK25hbWVzcGFjZSBpcnN5bXRhYiB7CisKK25hbWVzcGFjZSBzdG9yYWdlIHsKKworLy8gVGhlIGRhdGEgc3RydWN0dXJlcyBpbiB0aGlzIG5hbWVzcGFjZSBkZWZpbmUgdGhlIGxvdy1sZXZlbCBzZXJpYWxpemF0aW9uCisvLyBmb3JtYXQuIENsaWVudHMgdGhhdCBqdXN0IHdhbnQgdG8gcmVhZCBhIHN5bWJvbCB0YWJsZSBzaG91bGQgdXNlIHRoZQorLy8gaXJzeW10YWI6OlJlYWRlciBjbGFzcy4KKwordXNpbmcgV29yZCA9IHN1cHBvcnQ6OnVsaXR0bGUzMl90OworCisvLy8gQSByZWZlcmVuY2UgdG8gYSBzdHJpbmcgaW4gdGhlIHN0cmluZyB0YWJsZS4KK3N0cnVjdCBTdHIgeworICBXb3JkIE9mZnNldCwgU2l6ZTsKKworICBTdHJpbmdSZWYgZ2V0KFN0cmluZ1JlZiBTdHJ0YWIpIGNvbnN0IHsKKyAgICByZXR1cm4ge1N0cnRhYi5kYXRhKCkgKyBPZmZzZXQsIFNpemV9OworICB9Cit9OworCisvLy8gQSByZWZlcmVuY2UgdG8gYSByYW5nZSBvZiBvYmplY3RzIGluIHRoZSBzeW1ib2wgdGFibGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFJhbmdlIHsKKyAgV29yZCBPZmZzZXQsIFNpemU7CisKKyAgQXJyYXlSZWY8VD4gZ2V0KFN0cmluZ1JlZiBTeW10YWIpIGNvbnN0IHsKKyAgICByZXR1cm4ge3JlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCAqPihTeW10YWIuZGF0YSgpICsgT2Zmc2V0KSwgU2l6ZX07CisgIH0KK307CisKKy8vLyBEZXNjcmliZXMgdGhlIHJhbmdlIG9mIGEgcGFydGljdWxhciBtb2R1bGUncyBzeW1ib2xzIHdpdGhpbiB0aGUgc3ltYm9sCisvLy8gdGFibGUuCitzdHJ1Y3QgTW9kdWxlIHsKKyAgV29yZCBCZWdpbiwgRW5kOworCisgIC8vLyBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IFVuY29tbW9uIGZvciB0aGlzIE1vZHVsZS4KKyAgV29yZCBVbmNCZWdpbjsKK307CisKKy8vLyBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gYW4gSVIgY29tZGF0Lgorc3RydWN0IENvbWRhdCB7CisgIFN0ciBOYW1lOworfTsKKworLy8vIENvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgYnkgbGlua2VycyBmb3Igc3ltYm9sIHJlc29sdXRpb24sIGFzIHdlbGwgYXMKKy8vLyBieSB0aGUgTFRPIGltcGxlbWVudGF0aW9uIGl0c2VsZi4KK3N0cnVjdCBTeW1ib2wgeworICAvLy8gVGhlIG1hbmdsZWQgc3ltYm9sIG5hbWUuCisgIFN0ciBOYW1lOworCisgIC8vLyBUaGUgdW5tYW5nbGVkIHN5bWJvbCBuYW1lLCBvciB0aGUgZW1wdHkgc3RyaW5nIGlmIHRoaXMgaXMgbm90IGFuIElSCisgIC8vLyBzeW1ib2wuCisgIFN0ciBJUk5hbWU7CisKKyAgLy8vIFRoZSBpbmRleCBpbnRvIEhlYWRlcjo6Q29tZGF0cywgb3IgLTEgaWYgbm90IGEgY29tZGF0IG1lbWJlci4KKyAgV29yZCBDb21kYXRJbmRleDsKKworICBXb3JkIEZsYWdzOworICBlbnVtIEZsYWdCaXRzIHsKKyAgICBGQl92aXNpYmlsaXR5LCAvLyAyIGJpdHMKKyAgICBGQl9oYXNfdW5jb21tb24gPSBGQl92aXNpYmlsaXR5ICsgMiwKKyAgICBGQl91bmRlZmluZWQsCisgICAgRkJfd2VhaywKKyAgICBGQl9jb21tb24sCisgICAgRkJfaW5kaXJlY3QsCisgICAgRkJfdXNlZCwKKyAgICBGQl90bHMsCisgICAgRkJfbWF5X29taXQsCisgICAgRkJfZ2xvYmFsLAorICAgIEZCX2Zvcm1hdF9zcGVjaWZpYywKKyAgICBGQl91bm5hbWVkX2FkZHIsCisgICAgRkJfZXhlY3V0YWJsZSwKKyAgfTsKK307CisKKy8vLyBUaGlzIGRhdGEgc3RydWN0dXJlIGNvbnRhaW5zIHJhcmVseSB1c2VkIHN5bWJvbCBmaWVsZHMgYW5kIGlzIG9wdGlvbmFsbHkKKy8vLyByZWZlcmVuY2VkIGJ5IGEgU3ltYm9sLgorc3RydWN0IFVuY29tbW9uIHsKKyAgV29yZCBDb21tb25TaXplLCBDb21tb25BbGlnbjsKKworICAvLy8gQ09GRi1zcGVjaWZpYzogdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB0aGF0IGEgd2VhayBleHRlcm5hbCByZXNvbHZlcyB0bworICAvLy8gaWYgbm90IGRlZmluZWQuCisgIFN0ciBDT0ZGV2Vha0V4dGVybkZhbGxiYWNrTmFtZTsKKworICAvLy8gU3BlY2lmaWVkIHNlY3Rpb24gbmFtZSwgaWYgYW55LgorICBTdHIgU2VjdGlvbk5hbWU7Cit9OworCitzdHJ1Y3QgSGVhZGVyIHsKKyAgLy8vIFZlcnNpb24gbnVtYmVyIG9mIHRoZSBzeW10YWIgZm9ybWF0LiBUaGlzIG51bWJlciBzaG91bGQgYmUgaW5jcmVtZW50ZWQKKyAgLy8vIHdoZW4gdGhlIGZvcm1hdCBjaGFuZ2VzLCBidXQgaXQgZG9lcyBub3QgbmVlZCB0byBiZSBpbmNyZW1lbnRlZCBpZiBhCisgIC8vLyBjaGFuZ2UgdG8gTExWTSB3b3VsZCBjYXVzZSBpdCB0byBjcmVhdGUgYSBkaWZmZXJlbnQgc3ltYm9sIHRhYmxlLgorICBXb3JkIFZlcnNpb247CisgIGVudW0geyBrQ3VycmVudFZlcnNpb24gPSAxIH07CisKKyAgLy8vIFRoZSBwcm9kdWNlcidzIHZlcnNpb24gc3RyaW5nIChMTFZNX1ZFUlNJT05fU1RSSU5HICIgIiBMTFZNX1JFVklTSU9OKS4KKyAgLy8vIENvbnN1bWVycyBzaG91bGQgcmVidWlsZCB0aGUgc3ltYm9sIHRhYmxlIGZyb20gSVIgaWYgdGhlIHByb2R1Y2VyJ3MKKyAgLy8vIHZlcnNpb24gZG9lcyBub3QgbWF0Y2ggdGhlIGNvbnN1bWVyJ3MgdmVyc2lvbiBkdWUgdG8gcG90ZW50aWFsIGRpZmZlcmVuY2VzCisgIC8vLyBpbiBzeW1ib2wgdGFibGUgZm9ybWF0LCBzeW1ib2wgZW51bWVyYXRpb24gb3JkZXIgYW5kIHNvIG9uLgorICBTdHIgUHJvZHVjZXI7CisKKyAgUmFuZ2U8TW9kdWxlPiBNb2R1bGVzOworICBSYW5nZTxDb21kYXQ+IENvbWRhdHM7CisgIFJhbmdlPFN5bWJvbD4gU3ltYm9sczsKKyAgUmFuZ2U8VW5jb21tb24+IFVuY29tbW9uczsKKworICBTdHIgVGFyZ2V0VHJpcGxlLCBTb3VyY2VGaWxlTmFtZTsKKworICAvLy8gQ09GRi1zcGVjaWZpYzogbGlua2VyIGRpcmVjdGl2ZXMuCisgIFN0ciBDT0ZGTGlua2VyT3B0czsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBzdG9yYWdlCisKKy8vLyBGaWxscyBpbiBTeW10YWIgYW5kIFN0cnRhYkJ1aWxkZXIgd2l0aCBhIHZhbGlkIHN5bWJvbCBhbmQgc3RyaW5nIHRhYmxlIGZvcgorLy8vIE1vZHMuCitFcnJvciBidWlsZChBcnJheVJlZjxNb2R1bGUgKj4gTW9kcywgU21hbGxWZWN0b3I8Y2hhciwgMD4gJlN5bXRhYiwKKyAgICAgICAgICAgIFN0cmluZ1RhYmxlQnVpbGRlciAmU3RydGFiQnVpbGRlciwgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2MpOworCisvLy8gVGhpcyByZXByZXNlbnRzIGEgc3ltYm9sIHRoYXQgaGFzIGJlZW4gcmVhZCBmcm9tIGEgc3RvcmFnZTo6U3ltYm9sIGFuZAorLy8vIHBvc3NpYmx5IGEgc3RvcmFnZTo6VW5jb21tb24uCitzdHJ1Y3QgU3ltYm9sIHsKKyAgLy8gQ29waWVkIGZyb20gc3RvcmFnZTo6U3ltYm9sLgorICBTdHJpbmdSZWYgTmFtZSwgSVJOYW1lOworICBpbnQgQ29tZGF0SW5kZXg7CisgIHVpbnQzMl90IEZsYWdzOworCisgIC8vIENvcGllZCBmcm9tIHN0b3JhZ2U6OlVuY29tbW9uLgorICB1aW50MzJfdCBDb21tb25TaXplLCBDb21tb25BbGlnbjsKKyAgU3RyaW5nUmVmIENPRkZXZWFrRXh0ZXJuRmFsbGJhY2tOYW1lOworICBTdHJpbmdSZWYgU2VjdGlvbk5hbWU7CisKKyAgLy8vIFJldHVybnMgdGhlIG1hbmdsZWQgc3ltYm9sIG5hbWUuCisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSB1bm1hbmdsZWQgc3ltYm9sIG5hbWUsIG9yIHRoZSBlbXB0eSBzdHJpbmcgaWYgdGhpcyBpcyBub3QgYW4KKyAgLy8vIElSIHN5bWJvbC4KKyAgU3RyaW5nUmVmIGdldElSTmFtZSgpIGNvbnN0IHsgcmV0dXJuIElSTmFtZTsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBpbmRleCBpbnRvIHRoZSBjb21kYXQgdGFibGUgKHNlZSBSZWFkZXI6OmdldENvbWRhdFRhYmxlKCkpLCBvcgorICAvLy8gLTEgaWYgbm90IGEgY29tZGF0IG1lbWJlci4KKyAgaW50IGdldENvbWRhdEluZGV4KCkgY29uc3QgeyByZXR1cm4gQ29tZGF0SW5kZXg7IH0KKworICB1c2luZyBTID0gc3RvcmFnZTo6U3ltYm9sOworCisgIEdsb2JhbFZhbHVlOjpWaXNpYmlsaXR5VHlwZXMgZ2V0VmlzaWJpbGl0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gR2xvYmFsVmFsdWU6OlZpc2liaWxpdHlUeXBlcygoRmxhZ3MgPj4gUzo6RkJfdmlzaWJpbGl0eSkgJiAzKTsKKyAgfQorCisgIGJvb2wgaXNVbmRlZmluZWQoKSBjb25zdCB7IHJldHVybiAoRmxhZ3MgPj4gUzo6RkJfdW5kZWZpbmVkKSAmIDE7IH0KKyAgYm9vbCBpc1dlYWsoKSBjb25zdCB7IHJldHVybiAoRmxhZ3MgPj4gUzo6RkJfd2VhaykgJiAxOyB9CisgIGJvb2wgaXNDb21tb24oKSBjb25zdCB7IHJldHVybiAoRmxhZ3MgPj4gUzo6RkJfY29tbW9uKSAmIDE7IH0KKyAgYm9vbCBpc0luZGlyZWN0KCkgY29uc3QgeyByZXR1cm4gKEZsYWdzID4+IFM6OkZCX2luZGlyZWN0KSAmIDE7IH0KKyAgYm9vbCBpc1VzZWQoKSBjb25zdCB7IHJldHVybiAoRmxhZ3MgPj4gUzo6RkJfdXNlZCkgJiAxOyB9CisgIGJvb2wgaXNUTFMoKSBjb25zdCB7IHJldHVybiAoRmxhZ3MgPj4gUzo6RkJfdGxzKSAmIDE7IH0KKworICBib29sIGNhbkJlT21pdHRlZEZyb21TeW1ib2xUYWJsZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gKEZsYWdzID4+IFM6OkZCX21heV9vbWl0KSAmIDE7CisgIH0KKworICBib29sIGlzR2xvYmFsKCkgY29uc3QgeyByZXR1cm4gKEZsYWdzID4+IFM6OkZCX2dsb2JhbCkgJiAxOyB9CisgIGJvb2wgaXNGb3JtYXRTcGVjaWZpYygpIGNvbnN0IHsgcmV0dXJuIChGbGFncyA+PiBTOjpGQl9mb3JtYXRfc3BlY2lmaWMpICYgMTsgfQorICBib29sIGlzVW5uYW1lZEFkZHIoKSBjb25zdCB7IHJldHVybiAoRmxhZ3MgPj4gUzo6RkJfdW5uYW1lZF9hZGRyKSAmIDE7IH0KKyAgYm9vbCBpc0V4ZWN1dGFibGUoKSBjb25zdCB7IHJldHVybiAoRmxhZ3MgPj4gUzo6RkJfZXhlY3V0YWJsZSkgJiAxOyB9CisKKyAgdWludDY0X3QgZ2V0Q29tbW9uU2l6ZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNDb21tb24oKSk7CisgICAgcmV0dXJuIENvbW1vblNpemU7CisgIH0KKworICB1aW50MzJfdCBnZXRDb21tb25BbGlnbm1lbnQoKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzQ29tbW9uKCkpOworICAgIHJldHVybiBDb21tb25BbGlnbjsKKyAgfQorCisgIC8vLyBDT0ZGLXNwZWNpZmljOiBmb3Igd2VhayBleHRlcm5hbHMsIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB0aGF0IGlzCisgIC8vLyB1c2VkIGFzIGEgZmFsbGJhY2sgaWYgdGhlIHdlYWsgZXh0ZXJuYWwgcmVtYWlucyB1bmRlZmluZWQuCisgIFN0cmluZ1JlZiBnZXRDT0ZGV2Vha0V4dGVybmFsRmFsbGJhY2soKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzV2VhaygpICYmIGlzSW5kaXJlY3QoKSk7CisgICAgcmV0dXJuIENPRkZXZWFrRXh0ZXJuRmFsbGJhY2tOYW1lOworICB9CisKKyAgU3RyaW5nUmVmIGdldFNlY3Rpb25OYW1lKCkgY29uc3QgeyByZXR1cm4gU2VjdGlvbk5hbWU7IH0KK307CisKKy8vLyBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIHJlYWQgYSBTeW10YWIgYW5kIFN0cnRhYiBwcm9kdWNlZCBieQorLy8vIGlyc3ltdGFiOjpidWlsZC4KK2NsYXNzIFJlYWRlciB7CisgIFN0cmluZ1JlZiBTeW10YWIsIFN0cnRhYjsKKworICBBcnJheVJlZjxzdG9yYWdlOjpNb2R1bGU+IE1vZHVsZXM7CisgIEFycmF5UmVmPHN0b3JhZ2U6OkNvbWRhdD4gQ29tZGF0czsKKyAgQXJyYXlSZWY8c3RvcmFnZTo6U3ltYm9sPiBTeW1ib2xzOworICBBcnJheVJlZjxzdG9yYWdlOjpVbmNvbW1vbj4gVW5jb21tb25zOworCisgIFN0cmluZ1JlZiBzdHIoc3RvcmFnZTo6U3RyIFMpIGNvbnN0IHsgcmV0dXJuIFMuZ2V0KFN0cnRhYik7IH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gQXJyYXlSZWY8VD4gcmFuZ2Uoc3RvcmFnZTo6UmFuZ2U8VD4gUikgY29uc3QgeworICAgIHJldHVybiBSLmdldChTeW10YWIpOworICB9CisKKyAgY29uc3Qgc3RvcmFnZTo6SGVhZGVyICZoZWFkZXIoKSBjb25zdCB7CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IHN0b3JhZ2U6OkhlYWRlciAqPihTeW10YWIuZGF0YSgpKTsKKyAgfQorCitwdWJsaWM6CisgIGNsYXNzIFN5bWJvbFJlZjsKKworICBSZWFkZXIoKSA9IGRlZmF1bHQ7CisgIFJlYWRlcihTdHJpbmdSZWYgU3ltdGFiLCBTdHJpbmdSZWYgU3RydGFiKSA6IFN5bXRhYihTeW10YWIpLCBTdHJ0YWIoU3RydGFiKSB7CisgICAgTW9kdWxlcyA9IHJhbmdlKGhlYWRlcigpLk1vZHVsZXMpOworICAgIENvbWRhdHMgPSByYW5nZShoZWFkZXIoKS5Db21kYXRzKTsKKyAgICBTeW1ib2xzID0gcmFuZ2UoaGVhZGVyKCkuU3ltYm9scyk7CisgICAgVW5jb21tb25zID0gcmFuZ2UoaGVhZGVyKCkuVW5jb21tb25zKTsKKyAgfQorCisgIHVzaW5nIHN5bWJvbF9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPG9iamVjdDo6Y29udGVudF9pdGVyYXRvcjxTeW1ib2xSZWY+PjsKKworICAvLy8gUmV0dXJucyB0aGUgc3ltYm9sIHRhYmxlIGZvciB0aGUgZW50aXJlIGJpdGNvZGUgZmlsZS4KKyAgLy8vIFRoZSBzeW1ib2xzIGVudW1lcmF0ZWQgYnkgdGhpcyBtZXRob2QgYXJlIGVwaGVtZXJhbCwgYnV0IHRoZXkgY2FuIGJlCisgIC8vLyBjb3BpZWQgaW50byBhbiBpcnN5bXRhYjo6U3ltYm9sIG9iamVjdC4KKyAgc3ltYm9sX3JhbmdlIHN5bWJvbHMoKSBjb25zdDsKKworICBzaXplX3QgZ2V0TnVtTW9kdWxlcygpIGNvbnN0IHsgcmV0dXJuIE1vZHVsZXMuc2l6ZSgpOyB9CisKKyAgLy8vIFJldHVybnMgYSBzbGljZSBvZiB0aGUgc3ltYm9sIHRhYmxlIGZvciB0aGUgSSd0aCBtb2R1bGUgaW4gdGhlIGZpbGUuCisgIC8vLyBUaGUgc3ltYm9scyBlbnVtZXJhdGVkIGJ5IHRoaXMgbWV0aG9kIGFyZSBlcGhlbWVyYWwsIGJ1dCB0aGV5IGNhbiBiZQorICAvLy8gY29waWVkIGludG8gYW4gaXJzeW10YWI6OlN5bWJvbCBvYmplY3QuCisgIHN5bWJvbF9yYW5nZSBtb2R1bGVfc3ltYm9scyh1bnNpZ25lZCBJKSBjb25zdDsKKworICBTdHJpbmdSZWYgZ2V0VGFyZ2V0VHJpcGxlKCkgY29uc3QgeyByZXR1cm4gc3RyKGhlYWRlcigpLlRhcmdldFRyaXBsZSk7IH0KKworICAvLy8gUmV0dXJucyB0aGUgc291cmNlIGZpbGUgcGF0aCBzcGVjaWZpZWQgYXQgY29tcGlsZSB0aW1lLgorICBTdHJpbmdSZWYgZ2V0U291cmNlRmlsZU5hbWUoKSBjb25zdCB7IHJldHVybiBzdHIoaGVhZGVyKCkuU291cmNlRmlsZU5hbWUpOyB9CisKKyAgLy8vIFJldHVybnMgYSB0YWJsZSB3aXRoIGFsbCB0aGUgY29tZGF0cyB1c2VkIGJ5IHRoaXMgZmlsZS4KKyAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBnZXRDb21kYXRUYWJsZSgpIGNvbnN0IHsKKyAgICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IENvbWRhdFRhYmxlOworICAgIENvbWRhdFRhYmxlLnJlc2VydmUoQ29tZGF0cy5zaXplKCkpOworICAgIGZvciAoYXV0byBDIDogQ29tZGF0cykKKyAgICAgIENvbWRhdFRhYmxlLnB1c2hfYmFjayhzdHIoQy5OYW1lKSk7CisgICAgcmV0dXJuIENvbWRhdFRhYmxlOworICB9CisKKyAgLy8vIENPRkYtc3BlY2lmaWM6IHJldHVybnMgbGlua2VyIG9wdGlvbnMgc3BlY2lmaWVkIGluIHRoZSBpbnB1dCBmaWxlLgorICBTdHJpbmdSZWYgZ2V0Q09GRkxpbmtlck9wdHMoKSBjb25zdCB7IHJldHVybiBzdHIoaGVhZGVyKCkuQ09GRkxpbmtlck9wdHMpOyB9Cit9OworCisvLy8gRXBoZW1lcmFsIHN5bWJvbHMgcHJvZHVjZWQgYnkgUmVhZGVyOjpzeW1ib2xzKCkgYW5kCisvLy8gUmVhZGVyOjptb2R1bGVfc3ltYm9scygpLgorY2xhc3MgUmVhZGVyOjpTeW1ib2xSZWYgOiBwdWJsaWMgU3ltYm9sIHsKKyAgY29uc3Qgc3RvcmFnZTo6U3ltYm9sICpTeW1JLCAqU3ltRTsKKyAgY29uc3Qgc3RvcmFnZTo6VW5jb21tb24gKlVuY0k7CisgIGNvbnN0IFJlYWRlciAqUjsKKworICB2b2lkIHJlYWQoKSB7CisgICAgaWYgKFN5bUkgPT0gU3ltRSkKKyAgICAgIHJldHVybjsKKworICAgIE5hbWUgPSBSLT5zdHIoU3ltSS0+TmFtZSk7CisgICAgSVJOYW1lID0gUi0+c3RyKFN5bUktPklSTmFtZSk7CisgICAgQ29tZGF0SW5kZXggPSBTeW1JLT5Db21kYXRJbmRleDsKKyAgICBGbGFncyA9IFN5bUktPkZsYWdzOworCisgICAgaWYgKEZsYWdzICYgKDEgPDwgc3RvcmFnZTo6U3ltYm9sOjpGQl9oYXNfdW5jb21tb24pKSB7CisgICAgICBDb21tb25TaXplID0gVW5jSS0+Q29tbW9uU2l6ZTsKKyAgICAgIENvbW1vbkFsaWduID0gVW5jSS0+Q29tbW9uQWxpZ247CisgICAgICBDT0ZGV2Vha0V4dGVybkZhbGxiYWNrTmFtZSA9IFItPnN0cihVbmNJLT5DT0ZGV2Vha0V4dGVybkZhbGxiYWNrTmFtZSk7CisgICAgICBTZWN0aW9uTmFtZSA9IFItPnN0cihVbmNJLT5TZWN0aW9uTmFtZSk7CisgICAgfSBlbHNlCisgICAgICAvLyBSZXNldCB0aGlzIGZpZWxkIHNvIGl0IGNhbiBiZSBxdWVyaWVkIHVuY29uZGl0aW9uYWxseSBmb3IgYWxsIHN5bWJvbHMuCisgICAgICBTZWN0aW9uTmFtZSA9ICIiOworICB9CisKK3B1YmxpYzoKKyAgU3ltYm9sUmVmKGNvbnN0IHN0b3JhZ2U6OlN5bWJvbCAqU3ltSSwgY29uc3Qgc3RvcmFnZTo6U3ltYm9sICpTeW1FLAorICAgICAgICAgICAgY29uc3Qgc3RvcmFnZTo6VW5jb21tb24gKlVuY0ksIGNvbnN0IFJlYWRlciAqUikKKyAgICAgIDogU3ltSShTeW1JKSwgU3ltRShTeW1FKSwgVW5jSShVbmNJKSwgUihSKSB7CisgICAgcmVhZCgpOworICB9CisKKyAgdm9pZCBtb3ZlTmV4dCgpIHsKKyAgICArK1N5bUk7CisgICAgaWYgKEZsYWdzICYgKDEgPDwgc3RvcmFnZTo6U3ltYm9sOjpGQl9oYXNfdW5jb21tb24pKQorICAgICAgKytVbmNJOworICAgIHJlYWQoKTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTeW1ib2xSZWYgJk90aGVyKSBjb25zdCB7IHJldHVybiBTeW1JID09IE90aGVyLlN5bUk7IH0KK307CisKK2lubGluZSBSZWFkZXI6OnN5bWJvbF9yYW5nZSBSZWFkZXI6OnN5bWJvbHMoKSBjb25zdCB7CisgIHJldHVybiB7U3ltYm9sUmVmKFN5bWJvbHMuYmVnaW4oKSwgU3ltYm9scy5lbmQoKSwgVW5jb21tb25zLmJlZ2luKCksIHRoaXMpLAorICAgICAgICAgIFN5bWJvbFJlZihTeW1ib2xzLmVuZCgpLCBTeW1ib2xzLmVuZCgpLCBudWxscHRyLCB0aGlzKX07Cit9CisKK2lubGluZSBSZWFkZXI6OnN5bWJvbF9yYW5nZSBSZWFkZXI6Om1vZHVsZV9zeW1ib2xzKHVuc2lnbmVkIEkpIGNvbnN0IHsKKyAgY29uc3Qgc3RvcmFnZTo6TW9kdWxlICZNID0gTW9kdWxlc1tJXTsKKyAgY29uc3Qgc3RvcmFnZTo6U3ltYm9sICpNQmVnaW4gPSBTeW1ib2xzLmJlZ2luKCkgKyBNLkJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgKk1FbmQgPSBTeW1ib2xzLmJlZ2luKCkgKyBNLkVuZDsKKyAgcmV0dXJuIHtTeW1ib2xSZWYoTUJlZ2luLCBNRW5kLCBVbmNvbW1vbnMuYmVnaW4oKSArIE0uVW5jQmVnaW4sIHRoaXMpLAorICAgICAgICAgIFN5bWJvbFJlZihNRW5kLCBNRW5kLCBudWxscHRyLCB0aGlzKX07Cit9CisKKy8vLyBUaGUgY29udGVudHMgb2YgdGhlIGlyc3ltdGFiIGluIGEgYml0Y29kZSBmaWxlLiBBbnkgdW5kZXJseWluZyBkYXRhIGZvciB0aGUKKy8vLyBpcnN5bXRhYiBhcmUgb3duZWQgYnkgU3ltdGFiIGFuZCBTdHJ0YWIuCitzdHJ1Y3QgRmlsZUNvbnRlbnRzIHsKKyAgU21hbGxWZWN0b3I8Y2hhciwgMD4gU3ltdGFiLCBTdHJ0YWI7CisgIFJlYWRlciBUaGVSZWFkZXI7Cit9OworCisvLy8gUmVhZHMgdGhlIGNvbnRlbnRzIG9mIGEgYml0Y29kZSBmaWxlLCBjcmVhdGluZyBpdHMgaXJzeW10YWIgaWYgbmVjZXNzYXJ5LgorRXhwZWN0ZWQ8RmlsZUNvbnRlbnRzPiByZWFkQml0Y29kZShjb25zdCBCaXRjb2RlRmlsZUNvbnRlbnRzICZCRkMpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgaXJzeW10YWIKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX09CSkVDVF9JUlNZTVRBQl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9NYWNoTy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvTWFjaE8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZmQzNDYyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvTWFjaE8uaApAQCAtMCwwICsxLDczNyBAQAorLy89PT0tIE1hY2hPLmggLSBNYWNoTyBvYmplY3QgZmlsZSBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIE1hY2hPT2JqZWN0RmlsZSBjbGFzcywgd2hpY2ggaW1wbGVtZW50IHRoZSBPYmplY3RGaWxlCisvLyBpbnRlcmZhY2UgZm9yIE1hY2hPIGZpbGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RfTUFDSE9fSAorI2RlZmluZSBMTFZNX09CSkVDVF9NQUNIT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L01hY2hPLmgiCisjaW5jbHVkZSAibGx2bS9NQy9TdWJ0YXJnZXRGZWF0dXJlLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvQmluYXJ5LmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvT2JqZWN0RmlsZS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L1N5bWJvbGljRmlsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9iamVjdCB7CisKKy8vLyBEaWNlUmVmIC0gVGhpcyBpcyBhIHZhbHVlIHR5cGUgY2xhc3MgdGhhdCByZXByZXNlbnRzIGEgc2luZ2xlCisvLy8gZGF0YSBpbiBjb2RlIGVudHJ5IGluIHRoZSB0YWJsZSBpbiBhIE1hY2gtTyBvYmplY3QgZmlsZS4KK2NsYXNzIERpY2VSZWYgeworICBEYXRhUmVmSW1wbCBEaWNlUGltcGw7CisgIGNvbnN0IE9iamVjdEZpbGUgKk93bmluZ09iamVjdCA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgRGljZVJlZigpID0gZGVmYXVsdDsKKyAgRGljZVJlZihEYXRhUmVmSW1wbCBEaWNlUCwgY29uc3QgT2JqZWN0RmlsZSAqT3duZXIpOworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEaWNlUmVmICZPdGhlcikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IERpY2VSZWYgJk90aGVyKSBjb25zdDsKKworICB2b2lkIG1vdmVOZXh0KCk7CisKKyAgc3RkOjplcnJvcl9jb2RlIGdldE9mZnNldCh1aW50MzJfdCAmUmVzdWx0KSBjb25zdDsKKyAgc3RkOjplcnJvcl9jb2RlIGdldExlbmd0aCh1aW50MTZfdCAmUmVzdWx0KSBjb25zdDsKKyAgc3RkOjplcnJvcl9jb2RlIGdldEtpbmQodWludDE2X3QgJlJlc3VsdCkgY29uc3Q7CisKKyAgRGF0YVJlZkltcGwgZ2V0UmF3RGF0YVJlZkltcGwoKSBjb25zdDsKKyAgY29uc3QgT2JqZWN0RmlsZSAqZ2V0T2JqZWN0RmlsZSgpIGNvbnN0OworfTsKK3VzaW5nIGRpY2VfaXRlcmF0b3IgPSBjb250ZW50X2l0ZXJhdG9yPERpY2VSZWY+OworCisvLy8gRXhwb3J0RW50cnkgZW5jYXBzdWxhdGVzIHRoZSBjdXJyZW50LXN0YXRlLW9mLXRoZS13YWxrIHVzZWQgd2hlbiBkb2luZyBhCisvLy8gbm9uLXJlY3Vyc2l2ZSB3YWxrIG9mIHRoZSB0cmllIGRhdGEgc3RydWN0dXJlLiAgVGhpcyBhbGxvd3MgeW91IHRvIGl0ZXJhdGUKKy8vLyBhY3Jvc3MgYWxsIGV4cG9ydGVkIHN5bWJvbHMgdXNpbmc6CisvLy8gICAgICBFcnJvciBFcnI7CisvLy8gICAgICBmb3IgKGNvbnN0IGxsdm06Om9iamVjdDo6RXhwb3J0RW50cnkgJkFuRXhwb3J0IDogT2JqLT5leHBvcnRzKCZFcnIpKSB7CisvLy8gICAgICB9CisvLy8gICAgICBpZiAoRXJyKSB7IHJlcG9ydCBlcnJvciAuLi4KK2NsYXNzIEV4cG9ydEVudHJ5IHsKK3B1YmxpYzoKKyAgRXhwb3J0RW50cnkoRXJyb3IgKkVyciwgY29uc3QgTWFjaE9PYmplY3RGaWxlICpPLCBBcnJheVJlZjx1aW50OF90PiBUcmllKTsKKworICBTdHJpbmdSZWYgbmFtZSgpIGNvbnN0OworICB1aW50NjRfdCBmbGFncygpIGNvbnN0OworICB1aW50NjRfdCBhZGRyZXNzKCkgY29uc3Q7CisgIHVpbnQ2NF90IG90aGVyKCkgY29uc3Q7CisgIFN0cmluZ1JlZiBvdGhlck5hbWUoKSBjb25zdDsKKyAgdWludDMyX3Qgbm9kZU9mZnNldCgpIGNvbnN0OworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBFeHBvcnRFbnRyeSAmKSBjb25zdDsKKworICB2b2lkIG1vdmVOZXh0KCk7CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBNYWNoT09iamVjdEZpbGU7CisKKyAgdm9pZCBtb3ZlVG9GaXJzdCgpOworICB2b2lkIG1vdmVUb0VuZCgpOworICB1aW50NjRfdCByZWFkVUxFQjEyOChjb25zdCB1aW50OF90IComcCwgY29uc3QgY2hhciAqKmVycm9yKTsKKyAgdm9pZCBwdXNoRG93blVudGlsQm90dG9tKCk7CisgIHZvaWQgcHVzaE5vZGUodWludDY0X3QgT2Zmc2V0KTsKKworICAvLyBSZXByZXNlbnRzIGEgbm9kZSBpbiB0aGUgbWFjaC1vIGV4cG9ydHMgdHJpZS4KKyAgc3RydWN0IE5vZGVTdGF0ZSB7CisgICAgTm9kZVN0YXRlKGNvbnN0IHVpbnQ4X3QgKlB0cik7CisKKyAgICBjb25zdCB1aW50OF90ICpTdGFydDsKKyAgICBjb25zdCB1aW50OF90ICpDdXJyZW50OworICAgIHVpbnQ2NF90IEZsYWdzID0gMDsKKyAgICB1aW50NjRfdCBBZGRyZXNzID0gMDsKKyAgICB1aW50NjRfdCBPdGhlciA9IDA7CisgICAgY29uc3QgY2hhciAqSW1wb3J0TmFtZSA9IG51bGxwdHI7CisgICAgdW5zaWduZWQgQ2hpbGRDb3VudCA9IDA7CisgICAgdW5zaWduZWQgTmV4dENoaWxkSW5kZXggPSAwOworICAgIHVuc2lnbmVkIFBhcmVudFN0cmluZ0xlbmd0aCA9IDA7CisgICAgYm9vbCBJc0V4cG9ydE5vZGUgPSBmYWxzZTsKKyAgfTsKKyAgdXNpbmcgTm9kZUxpc3QgPSBTbWFsbFZlY3RvcjxOb2RlU3RhdGUsIDE2PjsKKyAgdXNpbmcgbm9kZV9pdGVyYXRvciA9IE5vZGVMaXN0Ojpjb25zdF9pdGVyYXRvcjsKKworICBFcnJvciAqRTsKKyAgY29uc3QgTWFjaE9PYmplY3RGaWxlICpPOworICBBcnJheVJlZjx1aW50OF90PiBUcmllOworICBTbWFsbFN0cmluZzwyNTY+IEN1bXVsYXRpdmVTdHJpbmc7CisgIE5vZGVMaXN0IFN0YWNrOworICBib29sIERvbmUgPSBmYWxzZTsKKworICBpdGVyYXRvcl9yYW5nZTxub2RlX2l0ZXJhdG9yPiBub2RlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShTdGFjay5iZWdpbigpLCBTdGFjay5lbmQoKSk7CisgIH0KK307Cit1c2luZyBleHBvcnRfaXRlcmF0b3IgPSBjb250ZW50X2l0ZXJhdG9yPEV4cG9ydEVudHJ5PjsKKworLy8gU2VnbWVudCBpbmZvIHNvIFNlZ0luZGV4L1NlZ09mZnNldCBwYWlycyBpbiBhIE1hY2gtTyBCaW5kIG9yIFJlYmFzZSBlbnRyeQorLy8gY2FuIGJlIGNoZWNrZWQgYW5kIHRyYW5zbGF0ZWQuICBPbmx5IHRoZSBTZWdJbmRleC9TZWdPZmZzZXQgcGFpcnMgZnJvbQorLy8gY2hlY2tlZCBlbnRyaWVzIGFyZSB0byBiZSB1c2VkIHdpdGggdGhlIHNlZ21lbnROYW1lKCksIHNlY3Rpb25OYW1lKCkgYW5kCisvLyBhZGRyZXNzKCkgbWV0aG9kcyBiZWxvdy4KK2NsYXNzIEJpbmRSZWJhc2VTZWdJbmZvIHsKK3B1YmxpYzoKKyAgQmluZFJlYmFzZVNlZ0luZm8oY29uc3QgTWFjaE9PYmplY3RGaWxlICpPYmopOworCisgIC8vIFVzZWQgdG8gY2hlY2sgYSBNYWNoLU8gQmluZCBvciBSZWJhc2UgZW50cnkgZm9yIGVycm9ycyB3aGVuIGl0ZXJhdGluZy4KKyAgY29uc3QgY2hhciAqY2hlY2tTZWdBbmRPZmZzZXQoaW50MzJfdCBTZWdJbmRleCwgdWludDY0X3QgU2VnT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuZEludmFsaWQpOworICBjb25zdCBjaGFyICpjaGVja0NvdW50QW5kU2tpcCh1aW50MzJfdCBDb3VudCwgdWludDMyX3QgU2tpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBQb2ludGVyU2l6ZSwgaW50MzJfdCBTZWdJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2VnT2Zmc2V0KTsKKyAgLy8gVXNlZCB3aXRoIHZhbGlkIFNlZ0luZGV4L1NlZ09mZnNldCB2YWx1ZXMgZnJvbSBjaGVja2VkIGVudHJpZXMuCisgIFN0cmluZ1JlZiBzZWdtZW50TmFtZShpbnQzMl90IFNlZ0luZGV4KTsKKyAgU3RyaW5nUmVmIHNlY3Rpb25OYW1lKGludDMyX3QgU2VnSW5kZXgsIHVpbnQ2NF90IFNlZ09mZnNldCk7CisgIHVpbnQ2NF90IGFkZHJlc3ModWludDMyX3QgU2VnSW5kZXgsIHVpbnQ2NF90IFNlZ09mZnNldCk7CisKK3ByaXZhdGU6CisgIHN0cnVjdCBTZWN0aW9uSW5mbyB7CisgICAgdWludDY0X3QgQWRkcmVzczsKKyAgICB1aW50NjRfdCBTaXplOworICAgIFN0cmluZ1JlZiBTZWN0aW9uTmFtZTsKKyAgICBTdHJpbmdSZWYgU2VnbWVudE5hbWU7CisgICAgdWludDY0X3QgT2Zmc2V0SW5TZWdtZW50OworICAgIHVpbnQ2NF90IFNlZ21lbnRTdGFydEFkZHJlc3M7CisgICAgaW50MzJfdCBTZWdtZW50SW5kZXg7CisgIH07CisgIGNvbnN0IFNlY3Rpb25JbmZvICZmaW5kU2VjdGlvbihpbnQzMl90IFNlZ0luZGV4LCB1aW50NjRfdCBTZWdPZmZzZXQpOworCisgIFNtYWxsVmVjdG9yPFNlY3Rpb25JbmZvLCAzMj4gU2VjdGlvbnM7CisgIGludDMyX3QgTWF4U2VnSW5kZXg7Cit9OworCisvLy8gTWFjaE9SZWJhc2VFbnRyeSBlbmNhcHN1bGF0ZXMgdGhlIGN1cnJlbnQgc3RhdGUgaW4gdGhlIGRlY29tcHJlc3Npb24gb2YKKy8vLyByZWJhc2luZyBvcGNvZGVzLiBUaGlzIGFsbG93cyB5b3UgdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBjb21wcmVzc2VkIHRhYmxlIG9mCisvLy8gcmViYXNpbmcgdXNpbmc6CisvLy8gICAgRXJyb3IgRXJyOworLy8vICAgIGZvciAoY29uc3QgbGx2bTo6b2JqZWN0OjpNYWNoT1JlYmFzZUVudHJ5ICZFbnRyeSA6IE9iai0+cmViYXNlVGFibGUoJkVycikpIHsKKy8vLyAgICB9CisvLy8gICAgaWYgKEVycikgeyByZXBvcnQgZXJyb3IgLi4uCitjbGFzcyBNYWNoT1JlYmFzZUVudHJ5IHsKK3B1YmxpYzoKKyAgTWFjaE9SZWJhc2VFbnRyeShFcnJvciAqRXJyLCBjb25zdCBNYWNoT09iamVjdEZpbGUgKk8sCisgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gb3Bjb2RlcywgYm9vbCBpczY0Qml0KTsKKworICBpbnQzMl90IHNlZ21lbnRJbmRleCgpIGNvbnN0OworICB1aW50NjRfdCBzZWdtZW50T2Zmc2V0KCkgY29uc3Q7CisgIFN0cmluZ1JlZiB0eXBlTmFtZSgpIGNvbnN0OworICBTdHJpbmdSZWYgc2VnbWVudE5hbWUoKSBjb25zdDsKKyAgU3RyaW5nUmVmIHNlY3Rpb25OYW1lKCkgY29uc3Q7CisgIHVpbnQ2NF90IGFkZHJlc3MoKSBjb25zdDsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWFjaE9SZWJhc2VFbnRyeSAmKSBjb25zdDsKKworICB2b2lkIG1vdmVOZXh0KCk7CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBNYWNoT09iamVjdEZpbGU7CisKKyAgdm9pZCBtb3ZlVG9GaXJzdCgpOworICB2b2lkIG1vdmVUb0VuZCgpOworICB1aW50NjRfdCByZWFkVUxFQjEyOChjb25zdCBjaGFyICoqZXJyb3IpOworCisgIEVycm9yICpFOworICBjb25zdCBNYWNoT09iamVjdEZpbGUgKk87CisgIEFycmF5UmVmPHVpbnQ4X3Q+IE9wY29kZXM7CisgIGNvbnN0IHVpbnQ4X3QgKlB0cjsKKyAgdWludDY0X3QgU2VnbWVudE9mZnNldCA9IDA7CisgIGludDMyX3QgU2VnbWVudEluZGV4ID0gLTE7CisgIHVpbnQ2NF90IFJlbWFpbmluZ0xvb3BDb3VudCA9IDA7CisgIHVpbnQ2NF90IEFkdmFuY2VBbW91bnQgPSAwOworICB1aW50OF90ICBSZWJhc2VUeXBlID0gMDsKKyAgdWludDhfdCAgUG9pbnRlclNpemU7CisgIGJvb2wgICAgIERvbmUgPSBmYWxzZTsKK307Cit1c2luZyByZWJhc2VfaXRlcmF0b3IgPSBjb250ZW50X2l0ZXJhdG9yPE1hY2hPUmViYXNlRW50cnk+OworCisvLy8gTWFjaE9CaW5kRW50cnkgZW5jYXBzdWxhdGVzIHRoZSBjdXJyZW50IHN0YXRlIGluIHRoZSBkZWNvbXByZXNzaW9uIG9mCisvLy8gYmluZGluZyBvcGNvZGVzLiBUaGlzIGFsbG93cyB5b3UgdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBjb21wcmVzc2VkIHRhYmxlIG9mCisvLy8gYmluZGluZ3MgdXNpbmc6CisvLy8gICAgRXJyb3IgRXJyOworLy8vICAgIGZvciAoY29uc3QgbGx2bTo6b2JqZWN0OjpNYWNoT0JpbmRFbnRyeSAmRW50cnkgOiBPYmotPmJpbmRUYWJsZSgmRXJyKSkgeworLy8vICAgIH0KKy8vLyAgICBpZiAoRXJyKSB7IHJlcG9ydCBlcnJvciAuLi4KK2NsYXNzIE1hY2hPQmluZEVudHJ5IHsKK3B1YmxpYzoKKyAgZW51bSBjbGFzcyBLaW5kIHsgUmVndWxhciwgTGF6eSwgV2VhayB9OworCisgIE1hY2hPQmluZEVudHJ5KEVycm9yICpFcnIsIGNvbnN0IE1hY2hPT2JqZWN0RmlsZSAqTywKKyAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gT3Bjb2RlcywgYm9vbCBpczY0Qml0LCBNYWNoT0JpbmRFbnRyeTo6S2luZCk7CisKKyAgaW50MzJfdCBzZWdtZW50SW5kZXgoKSBjb25zdDsKKyAgdWludDY0X3Qgc2VnbWVudE9mZnNldCgpIGNvbnN0OworICBTdHJpbmdSZWYgdHlwZU5hbWUoKSBjb25zdDsKKyAgU3RyaW5nUmVmIHN5bWJvbE5hbWUoKSBjb25zdDsKKyAgdWludDMyX3QgZmxhZ3MoKSBjb25zdDsKKyAgaW50NjRfdCBhZGRlbmQoKSBjb25zdDsKKyAgaW50IG9yZGluYWwoKSBjb25zdDsKKworICBTdHJpbmdSZWYgc2VnbWVudE5hbWUoKSBjb25zdDsKKyAgU3RyaW5nUmVmIHNlY3Rpb25OYW1lKCkgY29uc3Q7CisgIHVpbnQ2NF90IGFkZHJlc3MoKSBjb25zdDsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgTWFjaE9CaW5kRW50cnkgJikgY29uc3Q7CisKKyAgdm9pZCBtb3ZlTmV4dCgpOworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgTWFjaE9PYmplY3RGaWxlOworCisgIHZvaWQgbW92ZVRvRmlyc3QoKTsKKyAgdm9pZCBtb3ZlVG9FbmQoKTsKKyAgdWludDY0X3QgcmVhZFVMRUIxMjgoY29uc3QgY2hhciAqKmVycm9yKTsKKyAgaW50NjRfdCByZWFkU0xFQjEyOChjb25zdCBjaGFyICoqZXJyb3IpOworCisgIEVycm9yICpFOworICBjb25zdCBNYWNoT09iamVjdEZpbGUgKk87CisgIEFycmF5UmVmPHVpbnQ4X3Q+IE9wY29kZXM7CisgIGNvbnN0IHVpbnQ4X3QgKlB0cjsKKyAgdWludDY0X3QgU2VnbWVudE9mZnNldCA9IDA7CisgIGludDMyX3QgIFNlZ21lbnRJbmRleCA9IC0xOworICBTdHJpbmdSZWYgU3ltYm9sTmFtZTsKKyAgYm9vbCAgICAgTGlicmFyeU9yZGluYWxTZXQgPSBmYWxzZTsKKyAgaW50ICAgICAgT3JkaW5hbCA9IDA7CisgIHVpbnQzMl90IEZsYWdzID0gMDsKKyAgaW50NjRfdCAgQWRkZW5kID0gMDsKKyAgdWludDY0X3QgUmVtYWluaW5nTG9vcENvdW50ID0gMDsKKyAgdWludDY0X3QgQWR2YW5jZUFtb3VudCA9IDA7CisgIHVpbnQ4X3QgIEJpbmRUeXBlID0gMDsKKyAgdWludDhfdCAgUG9pbnRlclNpemU7CisgIEtpbmQgICAgIFRhYmxlS2luZDsKKyAgYm9vbCAgICAgRG9uZSA9IGZhbHNlOworfTsKK3VzaW5nIGJpbmRfaXRlcmF0b3IgPSBjb250ZW50X2l0ZXJhdG9yPE1hY2hPQmluZEVudHJ5PjsKKworY2xhc3MgTWFjaE9PYmplY3RGaWxlIDogcHVibGljIE9iamVjdEZpbGUgeworcHVibGljOgorICBzdHJ1Y3QgTG9hZENvbW1hbmRJbmZvIHsKKyAgICBjb25zdCBjaGFyICpQdHI7ICAgICAgLy8gV2hlcmUgaW4gbWVtb3J5IHRoZSBsb2FkIGNvbW1hbmQgaXMuCisgICAgTWFjaE86OmxvYWRfY29tbWFuZCBDOyAvLyBUaGUgY29tbWFuZCBpdHNlbGYuCisgIH07CisgIHVzaW5nIExvYWRDb21tYW5kTGlzdCA9IFNtYWxsVmVjdG9yPExvYWRDb21tYW5kSW5mbywgND47CisgIHVzaW5nIGxvYWRfY29tbWFuZF9pdGVyYXRvciA9IExvYWRDb21tYW5kTGlzdDo6Y29uc3RfaXRlcmF0b3I7CisKKyAgc3RhdGljIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxNYWNoT09iamVjdEZpbGU+PgorICBjcmVhdGUoTWVtb3J5QnVmZmVyUmVmIE9iamVjdCwgYm9vbCBJc0xpdHRsZUVuZGlhbiwgYm9vbCBJczY0Qml0cywKKyAgICAgICAgIHVpbnQzMl90IFVuaXZlcnNhbENwdXR5cGUgPSAwLCB1aW50MzJfdCBVbml2ZXJzYWxJbmRleCA9IDApOworCisgIHZvaWQgbW92ZVN5bWJvbE5leHQoRGF0YVJlZkltcGwgJlN5bWIpIGNvbnN0IG92ZXJyaWRlOworCisgIHVpbnQ2NF90IGdldE5WYWx1ZShEYXRhUmVmSW1wbCBTeW0pIGNvbnN0OworICBFeHBlY3RlZDxTdHJpbmdSZWY+IGdldFN5bWJvbE5hbWUoRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8gTWFjaE8gc3BlY2lmaWMuCisgIEVycm9yIGNoZWNrU3ltYm9sVGFibGUoKSBjb25zdDsKKworICBzdGQ6OmVycm9yX2NvZGUgZ2V0SW5kaXJlY3ROYW1lKERhdGFSZWZJbXBsIFN5bWIsIFN0cmluZ1JlZiAmUmVzKSBjb25zdDsKKyAgdW5zaWduZWQgZ2V0U2VjdGlvblR5cGUoU2VjdGlvblJlZiBTZWMpIGNvbnN0OworCisgIEV4cGVjdGVkPHVpbnQ2NF90PiBnZXRTeW1ib2xBZGRyZXNzKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRTeW1ib2xBbGlnbm1lbnQoRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldENvbW1vblN5bWJvbFNpemVJbXBsKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICBFeHBlY3RlZDxTeW1ib2xSZWY6OlR5cGU+IGdldFN5bWJvbFR5cGUoRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQzMl90IGdldFN5bWJvbEZsYWdzKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICBFeHBlY3RlZDxzZWN0aW9uX2l0ZXJhdG9yPiBnZXRTeW1ib2xTZWN0aW9uKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICB1bnNpZ25lZCBnZXRTeW1ib2xTZWN0aW9uSUQoU3ltYm9sUmVmIFN5bWIpIGNvbnN0OworICB1bnNpZ25lZCBnZXRTZWN0aW9uSUQoU2VjdGlvblJlZiBTZWMpIGNvbnN0OworCisgIHZvaWQgbW92ZVNlY3Rpb25OZXh0KERhdGFSZWZJbXBsICZTZWMpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OmVycm9yX2NvZGUgZ2V0U2VjdGlvbk5hbWUoRGF0YVJlZkltcGwgU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmICZSZXMpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRTZWN0aW9uQWRkcmVzcyhEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRTZWN0aW9uSW5kZXgoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0U2VjdGlvblNpemUoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjplcnJvcl9jb2RlIGdldFNlY3Rpb25Db250ZW50cyhEYXRhUmVmSW1wbCBTZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmICZSZXMpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRTZWN0aW9uQWxpZ25tZW50KERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTZWN0aW9uQ29tcHJlc3NlZChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2VjdGlvblRleHQoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1NlY3Rpb25EYXRhKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTZWN0aW9uQlNTKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTZWN0aW9uVmlydHVhbChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2VjdGlvbkJpdGNvZGUoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gV2hlbiBkc3ltdXRpbCBnZW5lcmF0ZXMgdGhlIGNvbXBhbmlvbiBmaWxlLCBpdCBzdHJpcHMgYWxsIHVubmVjZXNzYXJ5CisgIC8vLyBzZWN0aW9ucyAoZS5nLiBldmVyeXRoaW5nIGluIHRoZSBfVEVYVCBzZWdtZW50KSBieSBvbWl0dGluZyB0aGVpciBib2R5CisgIC8vLyBhbmQgc2V0dGluZyB0aGUgb2Zmc2V0IGluIHRoZWlyIGNvcnJlc3BvbmRpbmcgbG9hZCBjb21tYW5kIHRvIHplcm8uCisgIC8vLworICAvLy8gV2hpbGUgdGhlIGxvYWQgY29tbWFuZCBpdHNlbGYgaXMgdmFsaWQsIHJlYWRpbmcgdGhlIHNlY3Rpb24gY29ycmVzcG9uZHMKKyAgLy8vIHRvIHJlYWRpbmcgdGhlIG51bWJlciBvZiBieXRlcyBzcGVjaWZpZWQgaW4gdGhlIGxvYWQgY29tbWFuZCwgc3RhcnRpbmcKKyAgLy8vIGZyb20gb2Zmc2V0IDAgKGkuZS4gdGhlIE1hY2gtTyBoZWFkZXIgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgZmlsZSkuCisgIGJvb2wgaXNTZWN0aW9uU3RyaXBwZWQoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKworICByZWxvY2F0aW9uX2l0ZXJhdG9yIHNlY3Rpb25fcmVsX2JlZ2luKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIHJlbG9jYXRpb25faXRlcmF0b3Igc2VjdGlvbl9yZWxfZW5kKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgcmVsb2NhdGlvbl9pdGVyYXRvciBleHRyZWxfYmVnaW4oKSBjb25zdDsKKyAgcmVsb2NhdGlvbl9pdGVyYXRvciBleHRyZWxfZW5kKCkgY29uc3Q7CisgIGl0ZXJhdG9yX3JhbmdlPHJlbG9jYXRpb25faXRlcmF0b3I+IGV4dGVybmFsX3JlbG9jYXRpb25zKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGV4dHJlbF9iZWdpbigpLCBleHRyZWxfZW5kKCkpOworICB9CisKKyAgcmVsb2NhdGlvbl9pdGVyYXRvciBsb2NyZWxfYmVnaW4oKSBjb25zdDsKKyAgcmVsb2NhdGlvbl9pdGVyYXRvciBsb2NyZWxfZW5kKCkgY29uc3Q7CisgIAorICB2b2lkIG1vdmVSZWxvY2F0aW9uTmV4dChEYXRhUmVmSW1wbCAmUmVsKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0UmVsb2NhdGlvbk9mZnNldChEYXRhUmVmSW1wbCBSZWwpIGNvbnN0IG92ZXJyaWRlOworICBzeW1ib2xfaXRlcmF0b3IgZ2V0UmVsb2NhdGlvblN5bWJvbChEYXRhUmVmSW1wbCBSZWwpIGNvbnN0IG92ZXJyaWRlOworICBzZWN0aW9uX2l0ZXJhdG9yIGdldFJlbG9jYXRpb25TZWN0aW9uKERhdGFSZWZJbXBsIFJlbCkgY29uc3Q7CisgIHVpbnQ2NF90IGdldFJlbG9jYXRpb25UeXBlKERhdGFSZWZJbXBsIFJlbCkgY29uc3Qgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0UmVsb2NhdGlvblR5cGVOYW1lKERhdGFSZWZJbXBsIFJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZSZXN1bHQpIGNvbnN0IG92ZXJyaWRlOworICB1aW50OF90IGdldFJlbG9jYXRpb25MZW5ndGgoRGF0YVJlZkltcGwgUmVsKSBjb25zdDsKKworICAvLyBNYWNoTyBzcGVjaWZpYy4KKyAgc3RkOjplcnJvcl9jb2RlIGdldExpYnJhcnlTaG9ydE5hbWVCeUluZGV4KHVuc2lnbmVkIEluZGV4LCBTdHJpbmdSZWYgJikgY29uc3Q7CisgIHVpbnQzMl90IGdldExpYnJhcnlDb3VudCgpIGNvbnN0OworCisgIHNlY3Rpb25faXRlcmF0b3IgZ2V0UmVsb2NhdGlvblJlbG9jYXRlZFNlY3Rpb24ocmVsb2NhdGlvbl9pdGVyYXRvciBSZWwpIGNvbnN0OworCisgIC8vIFRPRE86IFdvdWxkIGJlIHVzZWZ1bCB0byBoYXZlIGFuIGl0ZXJhdG9yIGJhc2VkIHZlcnNpb24KKyAgLy8gb2YgdGhlIGxvYWQgY29tbWFuZCBpbnRlcmZhY2UgdG9vLgorCisgIGJhc2ljX3N5bWJvbF9pdGVyYXRvciBzeW1ib2xfYmVnaW4oKSBjb25zdCBvdmVycmlkZTsKKyAgYmFzaWNfc3ltYm9sX2l0ZXJhdG9yIHN5bWJvbF9lbmQoKSBjb25zdCBvdmVycmlkZTsKKworICAvLyBNYWNoTyBzcGVjaWZpYy4KKyAgYmFzaWNfc3ltYm9sX2l0ZXJhdG9yIGdldFN5bWJvbEJ5SW5kZXgodW5zaWduZWQgSW5kZXgpIGNvbnN0OworICB1aW50NjRfdCBnZXRTeW1ib2xJbmRleChEYXRhUmVmSW1wbCBTeW1iKSBjb25zdDsKKworICBzZWN0aW9uX2l0ZXJhdG9yIHNlY3Rpb25fYmVnaW4oKSBjb25zdCBvdmVycmlkZTsKKyAgc2VjdGlvbl9pdGVyYXRvciBzZWN0aW9uX2VuZCgpIGNvbnN0IG92ZXJyaWRlOworCisgIHVpbnQ4X3QgZ2V0Qnl0ZXNJbkFkZHJlc3MoKSBjb25zdCBvdmVycmlkZTsKKworICBTdHJpbmdSZWYgZ2V0RmlsZUZvcm1hdE5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgVHJpcGxlOjpBcmNoVHlwZSBnZXRBcmNoKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFN1YnRhcmdldEZlYXR1cmVzIGdldEZlYXR1cmVzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gU3VidGFyZ2V0RmVhdHVyZXMoKTsgfQorICBUcmlwbGUgZ2V0QXJjaFRyaXBsZShjb25zdCBjaGFyICoqTWNwdURlZmF1bHQgPSBudWxscHRyKSBjb25zdDsKKworICByZWxvY2F0aW9uX2l0ZXJhdG9yIHNlY3Rpb25fcmVsX2JlZ2luKHVuc2lnbmVkIEluZGV4KSBjb25zdDsKKyAgcmVsb2NhdGlvbl9pdGVyYXRvciBzZWN0aW9uX3JlbF9lbmQodW5zaWduZWQgSW5kZXgpIGNvbnN0OworCisgIGRpY2VfaXRlcmF0b3IgYmVnaW5fZGljZXMoKSBjb25zdDsKKyAgZGljZV9pdGVyYXRvciBlbmRfZGljZXMoKSBjb25zdDsKKworICBsb2FkX2NvbW1hbmRfaXRlcmF0b3IgYmVnaW5fbG9hZF9jb21tYW5kcygpIGNvbnN0OworICBsb2FkX2NvbW1hbmRfaXRlcmF0b3IgZW5kX2xvYWRfY29tbWFuZHMoKSBjb25zdDsKKyAgaXRlcmF0b3JfcmFuZ2U8bG9hZF9jb21tYW5kX2l0ZXJhdG9yPiBsb2FkX2NvbW1hbmRzKCkgY29uc3Q7CisKKyAgLy8vIEZvciB1c2UgaXRlcmF0aW5nIG92ZXIgYWxsIGV4cG9ydGVkIHN5bWJvbHMuCisgIGl0ZXJhdG9yX3JhbmdlPGV4cG9ydF9pdGVyYXRvcj4gZXhwb3J0cyhFcnJvciAmRXJyKSBjb25zdDsKKworICAvLy8gRm9yIHVzZSBleGFtaW5pbmcgYSB0cmllIG5vdCBpbiBhIE1hY2hPT2JqZWN0RmlsZS4KKyAgc3RhdGljIGl0ZXJhdG9yX3JhbmdlPGV4cG9ydF9pdGVyYXRvcj4gZXhwb3J0cyhFcnJvciAmRXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+IFRyaWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaE9PYmplY3RGaWxlICpPID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxscHRyKTsKKworICAvLy8gRm9yIHVzZSBpdGVyYXRpbmcgb3ZlciBhbGwgcmViYXNlIHRhYmxlIGVudHJpZXMuCisgIGl0ZXJhdG9yX3JhbmdlPHJlYmFzZV9pdGVyYXRvcj4gcmViYXNlVGFibGUoRXJyb3IgJkVycik7CisKKyAgLy8vIEZvciB1c2UgZXhhbWluaW5nIHJlYmFzZSBvcGNvZGVzIGluIGEgTWFjaE9PYmplY3RGaWxlLgorICBzdGF0aWMgaXRlcmF0b3JfcmFuZ2U8cmViYXNlX2l0ZXJhdG9yPiByZWJhc2VUYWJsZShFcnJvciAmRXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoT09iamVjdEZpbGUgKk8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+IE9wY29kZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXM2NCk7CisKKyAgLy8vIEZvciB1c2UgaXRlcmF0aW5nIG92ZXIgYWxsIGJpbmQgdGFibGUgZW50cmllcy4KKyAgaXRlcmF0b3JfcmFuZ2U8YmluZF9pdGVyYXRvcj4gYmluZFRhYmxlKEVycm9yICZFcnIpOworCisgIC8vLyBGb3IgdXNlIGl0ZXJhdGluZyBvdmVyIGFsbCBsYXp5IGJpbmQgdGFibGUgZW50cmllcy4KKyAgaXRlcmF0b3JfcmFuZ2U8YmluZF9pdGVyYXRvcj4gbGF6eUJpbmRUYWJsZShFcnJvciAmRXJyKTsKKworICAvLy8gRm9yIHVzZSBpdGVyYXRpbmcgb3ZlciBhbGwgd2VhayBiaW5kIHRhYmxlIGVudHJpZXMuCisgIGl0ZXJhdG9yX3JhbmdlPGJpbmRfaXRlcmF0b3I+IHdlYWtCaW5kVGFibGUoRXJyb3IgJkVycik7CisKKyAgLy8vIEZvciB1c2UgZXhhbWluaW5nIGJpbmQgb3Bjb2RlcyBpbiBhIE1hY2hPT2JqZWN0RmlsZS4KKyAgc3RhdGljIGl0ZXJhdG9yX3JhbmdlPGJpbmRfaXRlcmF0b3I+IGJpbmRUYWJsZShFcnJvciAmRXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hPT2JqZWN0RmlsZSAqTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiBPcGNvZGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXM2NCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoT0JpbmRFbnRyeTo6S2luZCk7CisKKyAgLy8vIEZvciB1c2Ugd2l0aCBhIFNlZ0luZGV4LFNlZ09mZnNldCBwYWlyIGluIE1hY2hPQmluZEVudHJ5Ojptb3ZlTmV4dCgpIHRvCisgIC8vLyB2YWxpZGF0ZSBhIE1hY2hPQmluZEVudHJ5LgorICBjb25zdCBjaGFyICpCaW5kRW50cnlDaGVja1NlZ0FuZE9mZnNldChpbnQzMl90IFNlZ0luZGV4LCB1aW50NjRfdCBTZWdPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5kSW52YWxpZCkgY29uc3QgeworICAgIHJldHVybiBCaW5kUmViYXNlU2VjdGlvblRhYmxlLT5jaGVja1NlZ0FuZE9mZnNldChTZWdJbmRleCwgU2VnT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmRJbnZhbGlkKTsKKyAgfQorICAvLy8gRm9yIHVzZSBpbiBNYWNoT0JpbmRFbnRyeTo6bW92ZU5leHQoKSB0byB2YWxpZGF0ZSBhIE1hY2hPQmluZEVudHJ5IGZvcgorICAvLy8gdGhlIEJJTkRfT1BDT0RFX0RPX0JJTkRfVUxFQl9USU1FU19TS0lQUElOR19VTEVCIG9wY29kZS4KKyAgY29uc3QgY2hhciAqQmluZEVudHJ5Q2hlY2tDb3VudEFuZFNraXAodWludDMyX3QgQ291bnQsIHVpbnQzMl90IFNraXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgUG9pbnRlclNpemUsIGludDMyX3QgU2VnSW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFNlZ09mZnNldCkgY29uc3QgeworICAgIHJldHVybiBCaW5kUmViYXNlU2VjdGlvblRhYmxlLT5jaGVja0NvdW50QW5kU2tpcChDb3VudCwgU2tpcCwgUG9pbnRlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlZ0luZGV4LCBTZWdPZmZzZXQpOworICB9CisKKyAgLy8vIEZvciB1c2Ugd2l0aCBhIFNlZ0luZGV4LFNlZ09mZnNldCBwYWlyIGluIE1hY2hPUmViYXNlRW50cnk6Om1vdmVOZXh0KCkgdG8KKyAgLy8vIHZhbGlkYXRlIGEgTWFjaE9SZWJhc2VFbnRyeS4KKyAgY29uc3QgY2hhciAqUmViYXNlRW50cnlDaGVja1NlZ0FuZE9mZnNldChpbnQzMl90IFNlZ0luZGV4LCB1aW50NjRfdCBTZWdPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmRJbnZhbGlkKSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmRSZWJhc2VTZWN0aW9uVGFibGUtPmNoZWNrU2VnQW5kT2Zmc2V0KFNlZ0luZGV4LCBTZWdPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZEludmFsaWQpOworICB9CisgIC8vLyBGb3IgdXNlIGluIE1hY2hPUmViYXNlRW50cnk6Om1vdmVOZXh0KCkgdG8gdmFsaWRhdGUgYSBNYWNoT1JlYmFzZUVudHJ5IGZvcgorICAvLy8gdGhlIFJFQkFTRV9PUENPREVfRE9fKl9USU1FUyogb3Bjb2Rlcy4KKyAgY29uc3QgY2hhciAqUmViYXNlRW50cnlDaGVja0NvdW50QW5kU2tpcCh1aW50MzJfdCBDb3VudCwgdWludDMyX3QgU2tpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBQb2ludGVyU2l6ZSwgaW50MzJfdCBTZWdJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2VnT2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmRSZWJhc2VTZWN0aW9uVGFibGUtPmNoZWNrQ291bnRBbmRTa2lwKENvdW50LCBTa2lwLCBQb2ludGVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VnSW5kZXgsIFNlZ09mZnNldCk7CisgIH0KKworICAvLy8gRm9yIHVzZSB3aXRoIHRoZSBTZWdJbmRleCBvZiBhIGNoZWNrZWQgTWFjaC1PIEJpbmQgb3IgUmViYXNlIGVudHJ5IHRvCisgIC8vLyBnZXQgdGhlIHNlZ21lbnQgbmFtZS4KKyAgU3RyaW5nUmVmIEJpbmRSZWJhc2VTZWdtZW50TmFtZShpbnQzMl90IFNlZ0luZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIEJpbmRSZWJhc2VTZWN0aW9uVGFibGUtPnNlZ21lbnROYW1lKFNlZ0luZGV4KTsKKyAgfQorCisgIC8vLyBGb3IgdXNlIHdpdGggYSBTZWdJbmRleCxTZWdPZmZzZXQgcGFpciBmcm9tIGEgY2hlY2tlZCBNYWNoLU8gQmluZCBvcgorICAvLy8gUmViYXNlIGVudHJ5IHRvIGdldCB0aGUgc2VjdGlvbiBuYW1lLgorICBTdHJpbmdSZWYgQmluZFJlYmFzZVNlY3Rpb25OYW1lKHVpbnQzMl90IFNlZ0luZGV4LCB1aW50NjRfdCBTZWdPZmZzZXQpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluZFJlYmFzZVNlY3Rpb25UYWJsZS0+c2VjdGlvbk5hbWUoU2VnSW5kZXgsIFNlZ09mZnNldCk7CisgIH0KKworICAvLy8gRm9yIHVzZSB3aXRoIGEgU2VnSW5kZXgsU2VnT2Zmc2V0IHBhaXIgZnJvbSBhIGNoZWNrZWQgTWFjaC1PIEJpbmQgb3IKKyAgLy8vIFJlYmFzZSBlbnRyeSB0byBnZXQgdGhlIGFkZHJlc3MuCisgIHVpbnQ2NF90IEJpbmRSZWJhc2VBZGRyZXNzKHVpbnQzMl90IFNlZ0luZGV4LCB1aW50NjRfdCBTZWdPZmZzZXQpIGNvbnN0IHsKKyAgICByZXR1cm4gQmluZFJlYmFzZVNlY3Rpb25UYWJsZS0+YWRkcmVzcyhTZWdJbmRleCwgU2VnT2Zmc2V0KTsKKyAgfQorCisgIC8vIEluIGEgTWFjaE8gZmlsZSwgc2VjdGlvbnMgaGF2ZSBhIHNlZ21lbnQgbmFtZS4gVGhpcyBpcyB1c2VkIGluIHRoZSAubworICAvLyBmaWxlcy4gVGhleSBoYXZlIGEgc2luZ2xlIHNlZ21lbnQsIGJ1dCB0aGlzIGZpZWxkIHNwZWNpZmllcyB3aGljaCBzZWdtZW50CisgIC8vIGEgc2VjdGlvbiBzaG91bGQgYmUgcHV0IGluIHRoZSBmaW5hbCBvYmplY3QuCisgIFN0cmluZ1JlZiBnZXRTZWN0aW9uRmluYWxTZWdtZW50TmFtZShEYXRhUmVmSW1wbCBTZWMpIGNvbnN0OworCisgIC8vIE5hbWVzIGFyZSBzdG9yZWQgYXMgMTYgYnl0ZXMuIFRoZXNlIHJldHVybnMgdGhlIHJhdyAxNiBieXRlcyB3aXRob3V0CisgIC8vIGludGVycHJldGluZyB0aGVtIGFzIGEgQyBzdHJpbmcuCisgIEFycmF5UmVmPGNoYXI+IGdldFNlY3Rpb25SYXdOYW1lKERhdGFSZWZJbXBsIFNlYykgY29uc3Q7CisgIEFycmF5UmVmPGNoYXI+IGdldFNlY3Rpb25SYXdGaW5hbFNlZ21lbnROYW1lKERhdGFSZWZJbXBsIFNlYykgY29uc3Q7CisKKyAgLy8gTWFjaE8gc3BlY2lmaWMgSW5mbyBhYm91dCByZWxvY2F0aW9ucy4KKyAgYm9vbCBpc1JlbG9jYXRpb25TY2F0dGVyZWQoY29uc3QgTWFjaE86OmFueV9yZWxvY2F0aW9uX2luZm8gJlJFKSBjb25zdDsKKyAgdW5zaWduZWQgZ2V0UGxhaW5SZWxvY2F0aW9uU3ltYm9sTnVtKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFjaE86OmFueV9yZWxvY2F0aW9uX2luZm8gJlJFKSBjb25zdDsKKyAgYm9vbCBnZXRQbGFpblJlbG9jYXRpb25FeHRlcm5hbChjb25zdCBNYWNoTzo6YW55X3JlbG9jYXRpb25faW5mbyAmUkUpIGNvbnN0OworICBib29sIGdldFNjYXR0ZXJlZFJlbG9jYXRpb25TY2F0dGVyZWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoTzo6YW55X3JlbG9jYXRpb25faW5mbyAmUkUpIGNvbnN0OworICB1aW50MzJfdCBnZXRTY2F0dGVyZWRSZWxvY2F0aW9uVmFsdWUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYWNoTzo6YW55X3JlbG9jYXRpb25faW5mbyAmUkUpIGNvbnN0OworICB1aW50MzJfdCBnZXRTY2F0dGVyZWRSZWxvY2F0aW9uVHlwZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hY2hPOjphbnlfcmVsb2NhdGlvbl9pbmZvICZSRSkgY29uc3Q7CisgIHVuc2lnbmVkIGdldEFueVJlbG9jYXRpb25BZGRyZXNzKGNvbnN0IE1hY2hPOjphbnlfcmVsb2NhdGlvbl9pbmZvICZSRSkgY29uc3Q7CisgIHVuc2lnbmVkIGdldEFueVJlbG9jYXRpb25QQ1JlbChjb25zdCBNYWNoTzo6YW55X3JlbG9jYXRpb25faW5mbyAmUkUpIGNvbnN0OworICB1bnNpZ25lZCBnZXRBbnlSZWxvY2F0aW9uTGVuZ3RoKGNvbnN0IE1hY2hPOjphbnlfcmVsb2NhdGlvbl9pbmZvICZSRSkgY29uc3Q7CisgIHVuc2lnbmVkIGdldEFueVJlbG9jYXRpb25UeXBlKGNvbnN0IE1hY2hPOjphbnlfcmVsb2NhdGlvbl9pbmZvICZSRSkgY29uc3Q7CisgIFNlY3Rpb25SZWYgZ2V0QW55UmVsb2NhdGlvblNlY3Rpb24oY29uc3QgTWFjaE86OmFueV9yZWxvY2F0aW9uX2luZm8gJlJFKSBjb25zdDsKKworICAvLyBNYWNoTyBzcGVjaWZpYyBzdHJ1Y3R1cmVzLgorICBNYWNoTzo6c2VjdGlvbiBnZXRTZWN0aW9uKERhdGFSZWZJbXBsIERSSSkgY29uc3Q7CisgIE1hY2hPOjpzZWN0aW9uXzY0IGdldFNlY3Rpb242NChEYXRhUmVmSW1wbCBEUkkpIGNvbnN0OworICBNYWNoTzo6c2VjdGlvbiBnZXRTZWN0aW9uKGNvbnN0IExvYWRDb21tYW5kSW5mbyAmTCwgdW5zaWduZWQgSW5kZXgpIGNvbnN0OworICBNYWNoTzo6c2VjdGlvbl82NCBnZXRTZWN0aW9uNjQoY29uc3QgTG9hZENvbW1hbmRJbmZvICZMLHVuc2lnbmVkIEluZGV4KSBjb25zdDsKKyAgTWFjaE86Om5saXN0IGdldFN5bWJvbFRhYmxlRW50cnkoRGF0YVJlZkltcGwgRFJJKSBjb25zdDsKKyAgTWFjaE86Om5saXN0XzY0IGdldFN5bWJvbDY0VGFibGVFbnRyeShEYXRhUmVmSW1wbCBEUkkpIGNvbnN0OworCisgIE1hY2hPOjpsaW5rZWRpdF9kYXRhX2NvbW1hbmQKKyAgZ2V0TGlua2VkaXREYXRhTG9hZENvbW1hbmQoY29uc3QgTG9hZENvbW1hbmRJbmZvICZMKSBjb25zdDsKKyAgTWFjaE86OnNlZ21lbnRfY29tbWFuZAorICBnZXRTZWdtZW50TG9hZENvbW1hbmQoY29uc3QgTG9hZENvbW1hbmRJbmZvICZMKSBjb25zdDsKKyAgTWFjaE86OnNlZ21lbnRfY29tbWFuZF82NAorICBnZXRTZWdtZW50NjRMb2FkQ29tbWFuZChjb25zdCBMb2FkQ29tbWFuZEluZm8gJkwpIGNvbnN0OworICBNYWNoTzo6bGlua2VyX29wdGlvbl9jb21tYW5kCisgIGdldExpbmtlck9wdGlvbkxvYWRDb21tYW5kKGNvbnN0IExvYWRDb21tYW5kSW5mbyAmTCkgY29uc3Q7CisgIE1hY2hPOjp2ZXJzaW9uX21pbl9jb21tYW5kCisgIGdldFZlcnNpb25NaW5Mb2FkQ29tbWFuZChjb25zdCBMb2FkQ29tbWFuZEluZm8gJkwpIGNvbnN0OworICBNYWNoTzo6bm90ZV9jb21tYW5kCisgIGdldE5vdGVMb2FkQ29tbWFuZChjb25zdCBMb2FkQ29tbWFuZEluZm8gJkwpIGNvbnN0OworICBNYWNoTzo6YnVpbGRfdmVyc2lvbl9jb21tYW5kCisgIGdldEJ1aWxkVmVyc2lvbkxvYWRDb21tYW5kKGNvbnN0IExvYWRDb21tYW5kSW5mbyAmTCkgY29uc3Q7CisgIE1hY2hPOjpidWlsZF90b29sX3ZlcnNpb24KKyAgZ2V0QnVpbGRUb29sVmVyc2lvbih1bnNpZ25lZCBpbmRleCkgY29uc3Q7CisgIE1hY2hPOjpkeWxpYl9jb21tYW5kCisgIGdldER5bGliSURMb2FkQ29tbWFuZChjb25zdCBMb2FkQ29tbWFuZEluZm8gJkwpIGNvbnN0OworICBNYWNoTzo6ZHlsZF9pbmZvX2NvbW1hbmQKKyAgZ2V0RHlsZEluZm9Mb2FkQ29tbWFuZChjb25zdCBMb2FkQ29tbWFuZEluZm8gJkwpIGNvbnN0OworICBNYWNoTzo6ZHlsaW5rZXJfY29tbWFuZAorICBnZXREeWxpbmtlckNvbW1hbmQoY29uc3QgTG9hZENvbW1hbmRJbmZvICZMKSBjb25zdDsKKyAgTWFjaE86OnV1aWRfY29tbWFuZAorICBnZXRVdWlkQ29tbWFuZChjb25zdCBMb2FkQ29tbWFuZEluZm8gJkwpIGNvbnN0OworICBNYWNoTzo6cnBhdGhfY29tbWFuZAorICBnZXRScGF0aENvbW1hbmQoY29uc3QgTG9hZENvbW1hbmRJbmZvICZMKSBjb25zdDsKKyAgTWFjaE86OnNvdXJjZV92ZXJzaW9uX2NvbW1hbmQKKyAgZ2V0U291cmNlVmVyc2lvbkNvbW1hbmQoY29uc3QgTG9hZENvbW1hbmRJbmZvICZMKSBjb25zdDsKKyAgTWFjaE86OmVudHJ5X3BvaW50X2NvbW1hbmQKKyAgZ2V0RW50cnlQb2ludENvbW1hbmQoY29uc3QgTG9hZENvbW1hbmRJbmZvICZMKSBjb25zdDsKKyAgTWFjaE86OmVuY3J5cHRpb25faW5mb19jb21tYW5kCisgIGdldEVuY3J5cHRpb25JbmZvQ29tbWFuZChjb25zdCBMb2FkQ29tbWFuZEluZm8gJkwpIGNvbnN0OworICBNYWNoTzo6ZW5jcnlwdGlvbl9pbmZvX2NvbW1hbmRfNjQKKyAgZ2V0RW5jcnlwdGlvbkluZm9Db21tYW5kNjQoY29uc3QgTG9hZENvbW1hbmRJbmZvICZMKSBjb25zdDsKKyAgTWFjaE86OnN1Yl9mcmFtZXdvcmtfY29tbWFuZAorICBnZXRTdWJGcmFtZXdvcmtDb21tYW5kKGNvbnN0IExvYWRDb21tYW5kSW5mbyAmTCkgY29uc3Q7CisgIE1hY2hPOjpzdWJfdW1icmVsbGFfY29tbWFuZAorICBnZXRTdWJVbWJyZWxsYUNvbW1hbmQoY29uc3QgTG9hZENvbW1hbmRJbmZvICZMKSBjb25zdDsKKyAgTWFjaE86OnN1Yl9saWJyYXJ5X2NvbW1hbmQKKyAgZ2V0U3ViTGlicmFyeUNvbW1hbmQoY29uc3QgTG9hZENvbW1hbmRJbmZvICZMKSBjb25zdDsKKyAgTWFjaE86OnN1Yl9jbGllbnRfY29tbWFuZAorICBnZXRTdWJDbGllbnRDb21tYW5kKGNvbnN0IExvYWRDb21tYW5kSW5mbyAmTCkgY29uc3Q7CisgIE1hY2hPOjpyb3V0aW5lc19jb21tYW5kCisgIGdldFJvdXRpbmVzQ29tbWFuZChjb25zdCBMb2FkQ29tbWFuZEluZm8gJkwpIGNvbnN0OworICBNYWNoTzo6cm91dGluZXNfY29tbWFuZF82NAorICBnZXRSb3V0aW5lc0NvbW1hbmQ2NChjb25zdCBMb2FkQ29tbWFuZEluZm8gJkwpIGNvbnN0OworICBNYWNoTzo6dGhyZWFkX2NvbW1hbmQKKyAgZ2V0VGhyZWFkQ29tbWFuZChjb25zdCBMb2FkQ29tbWFuZEluZm8gJkwpIGNvbnN0OworCisgIE1hY2hPOjphbnlfcmVsb2NhdGlvbl9pbmZvIGdldFJlbG9jYXRpb24oRGF0YVJlZkltcGwgUmVsKSBjb25zdDsKKyAgTWFjaE86OmRhdGFfaW5fY29kZV9lbnRyeSBnZXREaWNlKERhdGFSZWZJbXBsIFJlbCkgY29uc3Q7CisgIGNvbnN0IE1hY2hPOjptYWNoX2hlYWRlciAmZ2V0SGVhZGVyKCkgY29uc3Q7CisgIGNvbnN0IE1hY2hPOjptYWNoX2hlYWRlcl82NCAmZ2V0SGVhZGVyNjQoKSBjb25zdDsKKyAgdWludDMyX3QKKyAgZ2V0SW5kaXJlY3RTeW1ib2xUYWJsZUVudHJ5KGNvbnN0IE1hY2hPOjpkeXN5bXRhYl9jb21tYW5kICZETEMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRleCkgY29uc3Q7CisgIE1hY2hPOjpkYXRhX2luX2NvZGVfZW50cnkgZ2V0RGF0YUluQ29kZVRhYmxlRW50cnkodWludDMyX3QgRGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJbmRleCkgY29uc3Q7CisgIE1hY2hPOjpzeW10YWJfY29tbWFuZCBnZXRTeW10YWJMb2FkQ29tbWFuZCgpIGNvbnN0OworICBNYWNoTzo6ZHlzeW10YWJfY29tbWFuZCBnZXREeXN5bXRhYkxvYWRDb21tYW5kKCkgY29uc3Q7CisgIE1hY2hPOjpsaW5rZWRpdF9kYXRhX2NvbW1hbmQgZ2V0RGF0YUluQ29kZUxvYWRDb21tYW5kKCkgY29uc3Q7CisgIE1hY2hPOjpsaW5rZWRpdF9kYXRhX2NvbW1hbmQgZ2V0TGlua09wdEhpbnRzTG9hZENvbW1hbmQoKSBjb25zdDsKKyAgQXJyYXlSZWY8dWludDhfdD4gZ2V0RHlsZEluZm9SZWJhc2VPcGNvZGVzKCkgY29uc3Q7CisgIEFycmF5UmVmPHVpbnQ4X3Q+IGdldER5bGRJbmZvQmluZE9wY29kZXMoKSBjb25zdDsKKyAgQXJyYXlSZWY8dWludDhfdD4gZ2V0RHlsZEluZm9XZWFrQmluZE9wY29kZXMoKSBjb25zdDsKKyAgQXJyYXlSZWY8dWludDhfdD4gZ2V0RHlsZEluZm9MYXp5QmluZE9wY29kZXMoKSBjb25zdDsKKyAgQXJyYXlSZWY8dWludDhfdD4gZ2V0RHlsZEluZm9FeHBvcnRzVHJpZSgpIGNvbnN0OworICBBcnJheVJlZjx1aW50OF90PiBnZXRVdWlkKCkgY29uc3Q7CisKKyAgU3RyaW5nUmVmIGdldFN0cmluZ1RhYmxlRGF0YSgpIGNvbnN0OworICBib29sIGlzNjRCaXQoKSBjb25zdDsKKyAgdm9pZCBSZWFkVUxFQjEyOHModWludDY0X3QgSW5kZXgsIFNtYWxsVmVjdG9ySW1wbDx1aW50NjRfdD4gJk91dCkgY29uc3Q7CisKKyAgc3RhdGljIFN0cmluZ1JlZiBndWVzc0xpYnJhcnlTaG9ydE5hbWUoU3RyaW5nUmVmIE5hbWUsIGJvb2wgJmlzRnJhbWV3b3JrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgJlN1ZmZpeCk7CisKKyAgc3RhdGljIFRyaXBsZTo6QXJjaFR5cGUgZ2V0QXJjaCh1aW50MzJfdCBDUFVUeXBlKTsKKyAgc3RhdGljIFRyaXBsZSBnZXRBcmNoVHJpcGxlKHVpbnQzMl90IENQVVR5cGUsIHVpbnQzMl90IENQVVN1YlR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqTWNwdURlZmF1bHQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKkFyY2hGbGFnID0gbnVsbHB0cik7CisgIHN0YXRpYyBib29sIGlzVmFsaWRBcmNoKFN0cmluZ1JlZiBBcmNoRmxhZyk7CisgIHN0YXRpYyBUcmlwbGUgZ2V0SG9zdEFyY2goKTsKKworICBib29sIGlzUmVsb2NhdGFibGVPYmplY3QoKSBjb25zdCBvdmVycmlkZTsKKworICBTdHJpbmdSZWYgbWFwRGVidWdTZWN0aW9uTmFtZShTdHJpbmdSZWYgTmFtZSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBoYXNQYWdlWmVyb1NlZ21lbnQoKSBjb25zdCB7IHJldHVybiBIYXNQYWdlWmVyb1NlZ21lbnQ7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEJpbmFyeSAqdikgeworICAgIHJldHVybiB2LT5pc01hY2hPKCk7CisgIH0KKworICBzdGF0aWMgdWludDMyX3QKKyAgZ2V0VmVyc2lvbk1pbk1ham9yKE1hY2hPOjp2ZXJzaW9uX21pbl9jb21tYW5kICZDLCBib29sIFNESykgeworICAgIHVpbnQzMl90IFZlcnNpb25PclNESyA9IChTREspID8gQy5zZGsgOiBDLnZlcnNpb247CisgICAgcmV0dXJuIChWZXJzaW9uT3JTREsgPj4gMTYpICYgMHhmZmZmOworICB9CisKKyAgc3RhdGljIHVpbnQzMl90CisgIGdldFZlcnNpb25NaW5NaW5vcihNYWNoTzo6dmVyc2lvbl9taW5fY29tbWFuZCAmQywgYm9vbCBTREspIHsKKyAgICB1aW50MzJfdCBWZXJzaW9uT3JTREsgPSAoU0RLKSA/IEMuc2RrIDogQy52ZXJzaW9uOworICAgIHJldHVybiAoVmVyc2lvbk9yU0RLID4+IDgpICYgMHhmZjsKKyAgfQorCisgIHN0YXRpYyB1aW50MzJfdAorICBnZXRWZXJzaW9uTWluVXBkYXRlKE1hY2hPOjp2ZXJzaW9uX21pbl9jb21tYW5kICZDLCBib29sIFNESykgeworICAgIHVpbnQzMl90IFZlcnNpb25PclNESyA9IChTREspID8gQy5zZGsgOiBDLnZlcnNpb247CisgICAgcmV0dXJuIFZlcnNpb25PclNESyAmIDB4ZmY7CisgIH0KKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0QnVpbGRQbGF0Zm9ybSh1aW50MzJfdCBwbGF0Zm9ybSkgeworICAgIHN3aXRjaCAocGxhdGZvcm0pIHsKKyAgICBjYXNlIE1hY2hPOjpQTEFURk9STV9NQUNPUzogcmV0dXJuICJtYWNvcyI7CisgICAgY2FzZSBNYWNoTzo6UExBVEZPUk1fSU9TOiByZXR1cm4gImlvcyI7CisgICAgY2FzZSBNYWNoTzo6UExBVEZPUk1fVFZPUzogcmV0dXJuICJ0dm9zIjsKKyAgICBjYXNlIE1hY2hPOjpQTEFURk9STV9XQVRDSE9TOiByZXR1cm4gIndhdGNob3MiOworICAgIGNhc2UgTWFjaE86OlBMQVRGT1JNX0JSSURHRU9TOiByZXR1cm4gImJyaWRnZW9zIjsKKyAgICBkZWZhdWx0OgorICAgICAgc3RkOjpzdHJpbmcgcmV0OworICAgICAgcmF3X3N0cmluZ19vc3RyZWFtIHNzKHJldCk7CisgICAgICBzcyA8PCBmb3JtYXRfaGV4KHBsYXRmb3JtLCA4LCB0cnVlKTsKKyAgICAgIHJldHVybiBzcy5zdHIoKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0QnVpbGRUb29sKHVpbnQzMl90IHRvb2xzKSB7CisgICAgc3dpdGNoICh0b29scykgeworICAgIGNhc2UgTWFjaE86OlRPT0xfQ0xBTkc6IHJldHVybiAiY2xhbmciOworICAgIGNhc2UgTWFjaE86OlRPT0xfU1dJRlQ6IHJldHVybiAic3dpZnQiOworICAgIGNhc2UgTWFjaE86OlRPT0xfTEQ6IHJldHVybiAibGQiOworICAgIGRlZmF1bHQ6CisgICAgICBzdGQ6OnN0cmluZyByZXQ7CisgICAgICByYXdfc3RyaW5nX29zdHJlYW0gc3MocmV0KTsKKyAgICAgIHNzIDw8IGZvcm1hdF9oZXgodG9vbHMsIDgsIHRydWUpOworICAgICAgcmV0dXJuIHNzLnN0cigpOworICAgIH0KKyAgfQorCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRWZXJzaW9uU3RyaW5nKHVpbnQzMl90IHZlcnNpb24pIHsKKyAgICB1aW50MzJfdCBtYWpvciA9ICh2ZXJzaW9uID4+IDE2KSAmIDB4ZmZmZjsKKyAgICB1aW50MzJfdCBtaW5vciA9ICh2ZXJzaW9uID4+IDgpICYgMHhmZjsKKyAgICB1aW50MzJfdCB1cGRhdGUgPSB2ZXJzaW9uICYgMHhmZjsKKworICAgIFNtYWxsU3RyaW5nPDMyPiBWZXJzaW9uOworICAgIFZlcnNpb24gPSB1dG9zdHIobWFqb3IpICsgIi4iICsgdXRvc3RyKG1pbm9yKTsKKyAgICBpZiAodXBkYXRlICE9IDApCisgICAgICBWZXJzaW9uICs9ICIuIiArIHV0b3N0cih1cGRhdGUpOworICAgIHJldHVybiBWZXJzaW9uLnN0cigpOworICB9CisKK3ByaXZhdGU6CisgIE1hY2hPT2JqZWN0RmlsZShNZW1vcnlCdWZmZXJSZWYgT2JqZWN0LCBib29sIElzTGl0dGxlRW5kaWFuLCBib29sIElzNjRCaXRzLAorICAgICAgICAgICAgICAgICAgRXJyb3IgJkVyciwgdWludDMyX3QgVW5pdmVyc2FsQ3B1dHlwZSA9IDAsCisgICAgICAgICAgICAgICAgICB1aW50MzJfdCBVbml2ZXJzYWxJbmRleCA9IDApOworCisgIHVpbnQ2NF90IGdldFN5bWJvbFZhbHVlSW1wbChEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCBvdmVycmlkZTsKKworICB1bmlvbiB7CisgICAgTWFjaE86Om1hY2hfaGVhZGVyXzY0IEhlYWRlcjY0OworICAgIE1hY2hPOjptYWNoX2hlYWRlciBIZWFkZXI7CisgIH07CisgIHVzaW5nIFNlY3Rpb25MaXN0ID0gU21hbGxWZWN0b3I8Y29uc3QgY2hhciosIDE+OworICBTZWN0aW9uTGlzdCBTZWN0aW9uczsKKyAgdXNpbmcgTGlicmFyeUxpc3QgPSBTbWFsbFZlY3Rvcjxjb25zdCBjaGFyKiwgMT47CisgIExpYnJhcnlMaXN0IExpYnJhcmllczsKKyAgTG9hZENvbW1hbmRMaXN0IExvYWRDb21tYW5kczsKKyAgdXNpbmcgTGlicmFyeVNob3J0TmFtZSA9IFNtYWxsVmVjdG9yPFN0cmluZ1JlZiwgMT47CisgIHVzaW5nIEJ1aWxkVG9vbExpc3QgPSBTbWFsbFZlY3Rvcjxjb25zdCBjaGFyKiwgMT47CisgIEJ1aWxkVG9vbExpc3QgQnVpbGRUb29sczsKKyAgbXV0YWJsZSBMaWJyYXJ5U2hvcnROYW1lIExpYnJhcmllc1Nob3J0TmFtZXM7CisgIHN0ZDo6dW5pcXVlX3B0cjxCaW5kUmViYXNlU2VnSW5mbz4gQmluZFJlYmFzZVNlY3Rpb25UYWJsZTsKKyAgY29uc3QgY2hhciAqU3ltdGFiTG9hZENtZCA9IG51bGxwdHI7CisgIGNvbnN0IGNoYXIgKkR5c3ltdGFiTG9hZENtZCA9IG51bGxwdHI7CisgIGNvbnN0IGNoYXIgKkRhdGFJbkNvZGVMb2FkQ21kID0gbnVsbHB0cjsKKyAgY29uc3QgY2hhciAqTGlua09wdEhpbnRzTG9hZENtZCA9IG51bGxwdHI7CisgIGNvbnN0IGNoYXIgKkR5bGRJbmZvTG9hZENtZCA9IG51bGxwdHI7CisgIGNvbnN0IGNoYXIgKlV1aWRMb2FkQ21kID0gbnVsbHB0cjsKKyAgYm9vbCBIYXNQYWdlWmVyb1NlZ21lbnQgPSBmYWxzZTsKK307CisKKy8vLyBEaWNlUmVmCitpbmxpbmUgRGljZVJlZjo6RGljZVJlZihEYXRhUmVmSW1wbCBEaWNlUCwgY29uc3QgT2JqZWN0RmlsZSAqT3duZXIpCisgIDogRGljZVBpbXBsKERpY2VQKSAsIE93bmluZ09iamVjdChPd25lcikge30KKworaW5saW5lIGJvb2wgRGljZVJlZjo6b3BlcmF0b3I9PShjb25zdCBEaWNlUmVmICZPdGhlcikgY29uc3QgeworICByZXR1cm4gRGljZVBpbXBsID09IE90aGVyLkRpY2VQaW1wbDsKK30KKworaW5saW5lIGJvb2wgRGljZVJlZjo6b3BlcmF0b3I8KGNvbnN0IERpY2VSZWYgJk90aGVyKSBjb25zdCB7CisgIHJldHVybiBEaWNlUGltcGwgPCBPdGhlci5EaWNlUGltcGw7Cit9CisKK2lubGluZSB2b2lkIERpY2VSZWY6Om1vdmVOZXh0KCkgeworICBjb25zdCBNYWNoTzo6ZGF0YV9pbl9jb2RlX2VudHJ5ICpQID0KKyAgICByZWludGVycHJldF9jYXN0PGNvbnN0IE1hY2hPOjpkYXRhX2luX2NvZGVfZW50cnkgKj4oRGljZVBpbXBsLnApOworICBEaWNlUGltcGwucCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihQICsgMSk7Cit9CisKKy8vIFNpbmNlIGEgTWFjaC1PIGRhdGEgaW4gY29kZSByZWZlcmVuY2UsIGEgRGljZVJlZiwgY2FuIG9ubHkgYmUgY3JlYXRlZCB3aGVuCisvLyB0aGUgT3duaW5nT2JqZWN0IE9iamVjdEZpbGUgaXMgYSBNYWNoT09iamVjdEZpbGUgYSBzdGF0aWNfY2FzdDw+IGlzIHVzZWQgZm9yCisvLyB0aGUgbWV0aG9kcyB0aGF0IGdldCB0aGUgdmFsdWVzIG9mIHRoZSBmaWVsZHMgb2YgdGhlIHJlZmVyZW5jZS4KKworaW5saW5lIHN0ZDo6ZXJyb3JfY29kZSBEaWNlUmVmOjpnZXRPZmZzZXQodWludDMyX3QgJlJlc3VsdCkgY29uc3QgeworICBjb25zdCBNYWNoT09iamVjdEZpbGUgKk1hY2hPT0YgPQorICAgIHN0YXRpY19jYXN0PGNvbnN0IE1hY2hPT2JqZWN0RmlsZSAqPihPd25pbmdPYmplY3QpOworICBNYWNoTzo6ZGF0YV9pbl9jb2RlX2VudHJ5IERpY2UgPSBNYWNoT09GLT5nZXREaWNlKERpY2VQaW1wbCk7CisgIFJlc3VsdCA9IERpY2Uub2Zmc2V0OworICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKCk7Cit9CisKK2lubGluZSBzdGQ6OmVycm9yX2NvZGUgRGljZVJlZjo6Z2V0TGVuZ3RoKHVpbnQxNl90ICZSZXN1bHQpIGNvbnN0IHsKKyAgY29uc3QgTWFjaE9PYmplY3RGaWxlICpNYWNoT09GID0KKyAgICBzdGF0aWNfY2FzdDxjb25zdCBNYWNoT09iamVjdEZpbGUgKj4oT3duaW5nT2JqZWN0KTsKKyAgTWFjaE86OmRhdGFfaW5fY29kZV9lbnRyeSBEaWNlID0gTWFjaE9PRi0+Z2V0RGljZShEaWNlUGltcGwpOworICBSZXN1bHQgPSBEaWNlLmxlbmd0aDsKKyAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOworfQorCitpbmxpbmUgc3RkOjplcnJvcl9jb2RlIERpY2VSZWY6OmdldEtpbmQodWludDE2X3QgJlJlc3VsdCkgY29uc3QgeworICBjb25zdCBNYWNoT09iamVjdEZpbGUgKk1hY2hPT0YgPQorICAgIHN0YXRpY19jYXN0PGNvbnN0IE1hY2hPT2JqZWN0RmlsZSAqPihPd25pbmdPYmplY3QpOworICBNYWNoTzo6ZGF0YV9pbl9jb2RlX2VudHJ5IERpY2UgPSBNYWNoT09GLT5nZXREaWNlKERpY2VQaW1wbCk7CisgIFJlc3VsdCA9IERpY2Uua2luZDsKKyAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOworfQorCitpbmxpbmUgRGF0YVJlZkltcGwgRGljZVJlZjo6Z2V0UmF3RGF0YVJlZkltcGwoKSBjb25zdCB7CisgIHJldHVybiBEaWNlUGltcGw7Cit9CisKK2lubGluZSBjb25zdCBPYmplY3RGaWxlICpEaWNlUmVmOjpnZXRPYmplY3RGaWxlKCkgY29uc3QgeworICByZXR1cm4gT3duaW5nT2JqZWN0OworfQorCit9IC8vIGVuZCBuYW1lc3BhY2Ugb2JqZWN0Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9PQkpFQ1RfTUFDSE9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvTWFjaE9Vbml2ZXJzYWwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L01hY2hPVW5pdmVyc2FsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzI4MzdkMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L01hY2hPVW5pdmVyc2FsLmgKQEAgLTAsMCArMSwxNjggQEAKKy8vPT09LSBNYWNoT1VuaXZlcnNhbC5oIC0gTWFjaC1PIHVuaXZlcnNhbCBiaW5hcmllcyAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIE1hY2gtTyBmYXQvdW5pdmVyc2FsIGJpbmFyaWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RfTUFDSE9VTklWRVJTQUxfSAorI2RlZmluZSBMTFZNX09CSkVDVF9NQUNIT1VOSVZFUlNBTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L01hY2hPLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvQXJjaGl2ZS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L0JpbmFyeS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L01hY2hPLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFN0cmluZ1JlZjsKKworbmFtZXNwYWNlIG9iamVjdCB7CisKK2NsYXNzIE1hY2hPVW5pdmVyc2FsQmluYXJ5IDogcHVibGljIEJpbmFyeSB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworICB1aW50MzJfdCBNYWdpYzsKKyAgdWludDMyX3QgTnVtYmVyT2ZPYmplY3RzOworcHVibGljOgorICBjbGFzcyBPYmplY3RGb3JBcmNoIHsKKyAgICBjb25zdCBNYWNoT1VuaXZlcnNhbEJpbmFyeSAqUGFyZW50OworICAgIC8vLyBcYnJpZWYgSW5kZXggb2Ygb2JqZWN0IGluIHRoZSB1bml2ZXJzYWwgYmluYXJ5LgorICAgIHVpbnQzMl90IEluZGV4OworICAgIC8vLyBcYnJpZWYgRGVzY3JpcHRvciBvZiB0aGUgb2JqZWN0LgorICAgIE1hY2hPOjpmYXRfYXJjaCBIZWFkZXI7CisgICAgTWFjaE86OmZhdF9hcmNoXzY0IEhlYWRlcjY0OworCisgIHB1YmxpYzoKKyAgICBPYmplY3RGb3JBcmNoKGNvbnN0IE1hY2hPVW5pdmVyc2FsQmluYXJ5ICpQYXJlbnQsIHVpbnQzMl90IEluZGV4KTsKKworICAgIHZvaWQgY2xlYXIoKSB7CisgICAgICBQYXJlbnQgPSBudWxscHRyOworICAgICAgSW5kZXggPSAwOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBPYmplY3RGb3JBcmNoICZPdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIChQYXJlbnQgPT0gT3RoZXIuUGFyZW50KSAmJiAoSW5kZXggPT0gT3RoZXIuSW5kZXgpOworICAgIH0KKworICAgIE9iamVjdEZvckFyY2ggZ2V0TmV4dCgpIGNvbnN0IHsgcmV0dXJuIE9iamVjdEZvckFyY2goUGFyZW50LCBJbmRleCArIDEpOyB9CisgICAgdWludDMyX3QgZ2V0Q1BVVHlwZSgpIGNvbnN0IHsKKyAgICAgIGlmIChQYXJlbnQtPmdldE1hZ2ljKCkgPT0gTWFjaE86OkZBVF9NQUdJQykKKyAgICAgICAgcmV0dXJuIEhlYWRlci5jcHV0eXBlOworICAgICAgZWxzZSAvLyBQYXJlbnQtPmdldE1hZ2ljKCkgPT0gTWFjaE86OkZBVF9NQUdJQ182NAorICAgICAgICByZXR1cm4gSGVhZGVyNjQuY3B1dHlwZTsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0Q1BVU3ViVHlwZSgpIGNvbnN0IHsKKyAgICAgIGlmIChQYXJlbnQtPmdldE1hZ2ljKCkgPT0gTWFjaE86OkZBVF9NQUdJQykKKyAgICAgICAgcmV0dXJuIEhlYWRlci5jcHVzdWJ0eXBlOworICAgICAgZWxzZSAvLyBQYXJlbnQtPmdldE1hZ2ljKCkgPT0gTWFjaE86OkZBVF9NQUdJQ182NAorICAgICAgICByZXR1cm4gSGVhZGVyNjQuY3B1c3VidHlwZTsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0T2Zmc2V0KCkgY29uc3QgeworICAgICAgaWYgKFBhcmVudC0+Z2V0TWFnaWMoKSA9PSBNYWNoTzo6RkFUX01BR0lDKQorICAgICAgICByZXR1cm4gSGVhZGVyLm9mZnNldDsKKyAgICAgIGVsc2UgLy8gUGFyZW50LT5nZXRNYWdpYygpID09IE1hY2hPOjpGQVRfTUFHSUNfNjQKKyAgICAgICAgcmV0dXJuIEhlYWRlcjY0Lm9mZnNldDsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0U2l6ZSgpIGNvbnN0IHsKKyAgICAgIGlmIChQYXJlbnQtPmdldE1hZ2ljKCkgPT0gTWFjaE86OkZBVF9NQUdJQykKKyAgICAgICAgcmV0dXJuIEhlYWRlci5zaXplOworICAgICAgZWxzZSAvLyBQYXJlbnQtPmdldE1hZ2ljKCkgPT0gTWFjaE86OkZBVF9NQUdJQ182NAorICAgICAgICByZXR1cm4gSGVhZGVyNjQuc2l6ZTsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0QWxpZ24oKSBjb25zdCB7CisgICAgICBpZiAoUGFyZW50LT5nZXRNYWdpYygpID09IE1hY2hPOjpGQVRfTUFHSUMpCisgICAgICAgIHJldHVybiBIZWFkZXIuYWxpZ247CisgICAgICBlbHNlIC8vIFBhcmVudC0+Z2V0TWFnaWMoKSA9PSBNYWNoTzo6RkFUX01BR0lDXzY0CisgICAgICAgIHJldHVybiBIZWFkZXI2NC5hbGlnbjsKKyAgICB9CisgICAgdWludDMyX3QgZ2V0UmVzZXJ2ZWQoKSBjb25zdCB7CisgICAgICBpZiAoUGFyZW50LT5nZXRNYWdpYygpID09IE1hY2hPOjpGQVRfTUFHSUMpCisgICAgICAgIHJldHVybiAwOworICAgICAgZWxzZSAvLyBQYXJlbnQtPmdldE1hZ2ljKCkgPT0gTWFjaE86OkZBVF9NQUdJQ182NAorICAgICAgICByZXR1cm4gSGVhZGVyNjQucmVzZXJ2ZWQ7CisgICAgfQorICAgIHN0ZDo6c3RyaW5nIGdldEFyY2hGbGFnTmFtZSgpIGNvbnN0IHsKKyAgICAgIGNvbnN0IGNoYXIgKk1jcHVEZWZhdWx0LCAqQXJjaEZsYWc7CisgICAgICBpZiAoUGFyZW50LT5nZXRNYWdpYygpID09IE1hY2hPOjpGQVRfTUFHSUMpIHsKKyAgICAgICAgVHJpcGxlIFQgPQorICAgICAgICAgICAgTWFjaE9PYmplY3RGaWxlOjpnZXRBcmNoVHJpcGxlKEhlYWRlci5jcHV0eXBlLCBIZWFkZXIuY3B1c3VidHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWNwdURlZmF1bHQsICZBcmNoRmxhZyk7CisgICAgICB9IGVsc2UgeyAvLyBQYXJlbnQtPmdldE1hZ2ljKCkgPT0gTWFjaE86OkZBVF9NQUdJQ182NAorICAgICAgICBUcmlwbGUgVCA9CisgICAgICAgICAgICBNYWNoT09iamVjdEZpbGU6OmdldEFyY2hUcmlwbGUoSGVhZGVyNjQuY3B1dHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIZWFkZXI2NC5jcHVzdWJ0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNY3B1RGVmYXVsdCwgJkFyY2hGbGFnKTsKKyAgICAgIH0KKyAgICAgIGlmIChBcmNoRmxhZykgeworICAgICAgICBzdGQ6OnN0cmluZyBBcmNoRmxhZ05hbWUoQXJjaEZsYWcpOworICAgICAgICByZXR1cm4gQXJjaEZsYWdOYW1lOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgc3RkOjpzdHJpbmcgQXJjaEZsYWdOYW1lKCIiKTsKKyAgICAgICAgcmV0dXJuIEFyY2hGbGFnTmFtZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8TWFjaE9PYmplY3RGaWxlPj4gZ2V0QXNPYmplY3RGaWxlKCkgY29uc3Q7CisKKyAgICBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8QXJjaGl2ZT4+IGdldEFzQXJjaGl2ZSgpIGNvbnN0OworICB9OworCisgIGNsYXNzIG9iamVjdF9pdGVyYXRvciB7CisgICAgT2JqZWN0Rm9yQXJjaCBPYmo7CisgIHB1YmxpYzoKKyAgICBvYmplY3RfaXRlcmF0b3IoY29uc3QgT2JqZWN0Rm9yQXJjaCAmT2JqKSA6IE9iaihPYmopIHt9CisgICAgY29uc3QgT2JqZWN0Rm9yQXJjaCAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICZPYmo7IH0KKyAgICBjb25zdCBPYmplY3RGb3JBcmNoICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBPYmo7IH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBvYmplY3RfaXRlcmF0b3IgJk90aGVyKSBjb25zdCB7CisgICAgICByZXR1cm4gT2JqID09IE90aGVyLk9iajsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IG9iamVjdF9pdGVyYXRvciAmT3RoZXIpIGNvbnN0IHsKKyAgICAgIHJldHVybiAhKCp0aGlzID09IE90aGVyKTsKKyAgICB9CisKKyAgICBvYmplY3RfaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7ICAvLyBQcmVpbmNyZW1lbnQKKyAgICAgIE9iaiA9IE9iai5nZXROZXh0KCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICB9OworCisgIE1hY2hPVW5pdmVyc2FsQmluYXJ5KE1lbW9yeUJ1ZmZlclJlZiBTb3VjZSwgRXJyb3IgJkVycik7CisgIHN0YXRpYyBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8TWFjaE9Vbml2ZXJzYWxCaW5hcnk+PgorICBjcmVhdGUoTWVtb3J5QnVmZmVyUmVmIFNvdXJjZSk7CisKKyAgb2JqZWN0X2l0ZXJhdG9yIGJlZ2luX29iamVjdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIE9iamVjdEZvckFyY2godGhpcywgMCk7CisgIH0KKyAgb2JqZWN0X2l0ZXJhdG9yIGVuZF9vYmplY3RzKCkgY29uc3QgeworICAgIHJldHVybiBPYmplY3RGb3JBcmNoKG51bGxwdHIsIDApOworICB9CisKKyAgaXRlcmF0b3JfcmFuZ2U8b2JqZWN0X2l0ZXJhdG9yPiBvYmplY3RzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGJlZ2luX29iamVjdHMoKSwgZW5kX29iamVjdHMoKSk7CisgIH0KKworICB1aW50MzJfdCBnZXRNYWdpYygpIGNvbnN0IHsgcmV0dXJuIE1hZ2ljOyB9CisgIHVpbnQzMl90IGdldE51bWJlck9mT2JqZWN0cygpIGNvbnN0IHsgcmV0dXJuIE51bWJlck9mT2JqZWN0czsgfQorCisgIC8vIENhc3QgbWV0aG9kcy4KKyAgc3RhdGljIGJvb2wgY2xhc3NvZihCaW5hcnkgY29uc3QgKlYpIHsKKyAgICByZXR1cm4gVi0+aXNNYWNoT1VuaXZlcnNhbEJpbmFyeSgpOworICB9CisKKyAgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPE1hY2hPT2JqZWN0RmlsZT4+CisgIGdldE9iamVjdEZvckFyY2goU3RyaW5nUmVmIEFyY2hOYW1lKSBjb25zdDsKK307CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9Nb2R1bGVTeW1ib2xUYWJsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvTW9kdWxlU3ltYm9sVGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZTkzMjI4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvTW9kdWxlU3ltYm9sVGFibGUuaApAQCAtMCwwICsxLDY0IEBACisvLz09PS0gTW9kdWxlU3ltYm9sVGFibGUuaCAtIHN5bWJvbCB0YWJsZSBmb3IgaW4tbWVtb3J5IElSIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIHN5bWJvbCB0YWJsZSBidWlsdCBmcm9tIGluLW1lbW9yeSBJUi4gSXQgcHJvdmlkZXMKKy8vIGFjY2VzcyB0byBHbG9iYWxWYWx1ZXMgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgc3VjaCBhY2Nlc3MgaXMgcmVxdWlyZWQKKy8vIChlLmcuIGluIHRoZSBMVE8gaW1wbGVtZW50YXRpb24pLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RfTU9EVUxFU1lNQk9MVEFCTEVfSAorI2RlZmluZSBMTFZNX09CSkVDVF9NT0RVTEVTWU1CT0xUQUJMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJVbmlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvTWFuZ2xlci5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L1N5bWJvbGljRmlsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBHbG9iYWxWYWx1ZTsKKworY2xhc3MgTW9kdWxlU3ltYm9sVGFibGUgeworcHVibGljOgorICB1c2luZyBBc21TeW1ib2wgPSBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHVpbnQzMl90PjsKKyAgdXNpbmcgU3ltYm9sID0gUG9pbnRlclVuaW9uPEdsb2JhbFZhbHVlICosIEFzbVN5bWJvbCAqPjsKKworcHJpdmF0ZToKKyAgTW9kdWxlICpGaXJzdE1vZCA9IG51bGxwdHI7CisKKyAgU3BlY2lmaWNCdW1wUHRyQWxsb2NhdG9yPEFzbVN5bWJvbD4gQXNtU3ltYm9sczsKKyAgc3RkOjp2ZWN0b3I8U3ltYm9sPiBTeW1UYWI7CisgIE1hbmdsZXIgTWFuZzsKKworcHVibGljOgorICBBcnJheVJlZjxTeW1ib2w+IHN5bWJvbHMoKSBjb25zdCB7IHJldHVybiBTeW1UYWI7IH0KKyAgdm9pZCBhZGRNb2R1bGUoTW9kdWxlICpNKTsKKworICB2b2lkIHByaW50U3ltYm9sTmFtZShyYXdfb3N0cmVhbSAmT1MsIFN5bWJvbCBTKSBjb25zdDsKKyAgdWludDMyX3QgZ2V0U3ltYm9sRmxhZ3MoU3ltYm9sIFMpIGNvbnN0OworCisgIC8vLyBQYXJzZSBpbmxpbmUgQVNNIGFuZCBjb2xsZWN0IHRoZSBzeW1ib2xzIHRoYXQgYXJlIGRlZmluZWQgb3IgcmVmZXJlbmNlZCBpbgorICAvLy8gdGhlIGN1cnJlbnQgbW9kdWxlLgorICAvLy8KKyAgLy8vIEZvciBlYWNoIGZvdW5kIHN5bWJvbCwgY2FsbCBccCBBc21TeW1ib2wgd2l0aCB0aGUgbmFtZSBvZiB0aGUgc3ltYm9sIGZvdW5kCisgIC8vLyBhbmQgdGhlIGFzc29jaWF0ZWQgZmxhZ3MuCisgIHN0YXRpYyB2b2lkIENvbGxlY3RBc21TeW1ib2xzKAorICAgICAgY29uc3QgTW9kdWxlICZNLAorICAgICAgZnVuY3Rpb25fcmVmPHZvaWQoU3RyaW5nUmVmLCBvYmplY3Q6OkJhc2ljU3ltYm9sUmVmOjpGbGFncyk+IEFzbVN5bWJvbCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9PQkpFQ1RfTU9EVUxFU1lNQk9MVEFCTEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvT2JqZWN0RmlsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvT2JqZWN0RmlsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljNGFlOTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9PYmplY3RGaWxlLmgKQEAgLTAsMCArMSw1MDcgQEAKKy8vPT09LSBPYmplY3RGaWxlLmggLSBGaWxlIGZvcm1hdCBpbmRlcGVuZGVudCBvYmplY3QgZmlsZSAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIGEgZmlsZSBmb3JtYXQgaW5kZXBlbmRlbnQgT2JqZWN0RmlsZSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUX09CSkVDVEZJTEVfSAorI2RlZmluZSBMTFZNX09CSkVDVF9PQkpFQ1RGSUxFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1RyaXBsZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvTWFnaWMuaCIKKyNpbmNsdWRlICJsbHZtL01DL1N1YnRhcmdldEZlYXR1cmUuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9CaW5hcnkuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L1N5bWJvbGljRmlsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0ZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQVJNQXR0cmlidXRlUGFyc2VyOworCituYW1lc3BhY2Ugb2JqZWN0IHsKKworY2xhc3MgQ09GRk9iamVjdEZpbGU7CitjbGFzcyBNYWNoT09iamVjdEZpbGU7CitjbGFzcyBPYmplY3RGaWxlOworY2xhc3MgU2VjdGlvblJlZjsKK2NsYXNzIFN5bWJvbFJlZjsKK2NsYXNzIHN5bWJvbF9pdGVyYXRvcjsKK2NsYXNzIFdhc21PYmplY3RGaWxlOworCit1c2luZyBzZWN0aW9uX2l0ZXJhdG9yID0gY29udGVudF9pdGVyYXRvcjxTZWN0aW9uUmVmPjsKKworLy8vIFRoaXMgaXMgYSB2YWx1ZSB0eXBlIGNsYXNzIHRoYXQgcmVwcmVzZW50cyBhIHNpbmdsZSByZWxvY2F0aW9uIGluIHRoZSBsaXN0CisvLy8gb2YgcmVsb2NhdGlvbnMgaW4gdGhlIG9iamVjdCBmaWxlLgorY2xhc3MgUmVsb2NhdGlvblJlZiB7CisgIERhdGFSZWZJbXBsIFJlbG9jYXRpb25QaW1wbDsKKyAgY29uc3QgT2JqZWN0RmlsZSAqT3duaW5nT2JqZWN0ID0gbnVsbHB0cjsKKworcHVibGljOgorICBSZWxvY2F0aW9uUmVmKCkgPSBkZWZhdWx0OworICBSZWxvY2F0aW9uUmVmKERhdGFSZWZJbXBsIFJlbG9jYXRpb25QLCBjb25zdCBPYmplY3RGaWxlICpPd25lcik7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFJlbG9jYXRpb25SZWYgJk90aGVyKSBjb25zdDsKKworICB2b2lkIG1vdmVOZXh0KCk7CisKKyAgdWludDY0X3QgZ2V0T2Zmc2V0KCkgY29uc3Q7CisgIHN5bWJvbF9pdGVyYXRvciBnZXRTeW1ib2woKSBjb25zdDsKKyAgdWludDY0X3QgZ2V0VHlwZSgpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgR2V0IGEgc3RyaW5nIHRoYXQgcmVwcmVzZW50cyB0aGUgdHlwZSBvZiB0aGlzIHJlbG9jYXRpb24uCisgIC8vLworICAvLy8gVGhpcyBpcyBmb3IgZGlzcGxheSBwdXJwb3NlcyBvbmx5LgorICB2b2lkIGdldFR5cGVOYW1lKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzdWx0KSBjb25zdDsKKworICBEYXRhUmVmSW1wbCBnZXRSYXdEYXRhUmVmSW1wbCgpIGNvbnN0OworICBjb25zdCBPYmplY3RGaWxlICpnZXRPYmplY3QoKSBjb25zdDsKK307CisKK3VzaW5nIHJlbG9jYXRpb25faXRlcmF0b3IgPSBjb250ZW50X2l0ZXJhdG9yPFJlbG9jYXRpb25SZWY+OworCisvLy8gVGhpcyBpcyBhIHZhbHVlIHR5cGUgY2xhc3MgdGhhdCByZXByZXNlbnRzIGEgc2luZ2xlIHNlY3Rpb24gaW4gdGhlIGxpc3Qgb2YKKy8vLyBzZWN0aW9ucyBpbiB0aGUgb2JqZWN0IGZpbGUuCitjbGFzcyBTZWN0aW9uUmVmIHsKKyAgZnJpZW5kIGNsYXNzIFN5bWJvbFJlZjsKKworICBEYXRhUmVmSW1wbCBTZWN0aW9uUGltcGw7CisgIGNvbnN0IE9iamVjdEZpbGUgKk93bmluZ09iamVjdCA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgU2VjdGlvblJlZigpID0gZGVmYXVsdDsKKyAgU2VjdGlvblJlZihEYXRhUmVmSW1wbCBTZWN0aW9uUCwgY29uc3QgT2JqZWN0RmlsZSAqT3duZXIpOworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBTZWN0aW9uUmVmICZPdGhlcikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTZWN0aW9uUmVmICZPdGhlcikgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFNlY3Rpb25SZWYgJk90aGVyKSBjb25zdDsKKworICB2b2lkIG1vdmVOZXh0KCk7CisKKyAgc3RkOjplcnJvcl9jb2RlIGdldE5hbWUoU3RyaW5nUmVmICZSZXN1bHQpIGNvbnN0OworICB1aW50NjRfdCBnZXRBZGRyZXNzKCkgY29uc3Q7CisgIHVpbnQ2NF90IGdldEluZGV4KCkgY29uc3Q7CisgIHVpbnQ2NF90IGdldFNpemUoKSBjb25zdDsKKyAgc3RkOjplcnJvcl9jb2RlIGdldENvbnRlbnRzKFN0cmluZ1JlZiAmUmVzdWx0KSBjb25zdDsKKworICAvLy8gQGJyaWVmIEdldCB0aGUgYWxpZ25tZW50IG9mIHRoaXMgc2VjdGlvbiBhcyB0aGUgYWN0dWFsIHZhbHVlIChub3QgbG9nIDIpLgorICB1aW50NjRfdCBnZXRBbGlnbm1lbnQoKSBjb25zdDsKKworICBib29sIGlzQ29tcHJlc3NlZCgpIGNvbnN0OworICBib29sIGlzVGV4dCgpIGNvbnN0OworICBib29sIGlzRGF0YSgpIGNvbnN0OworICBib29sIGlzQlNTKCkgY29uc3Q7CisgIGJvb2wgaXNWaXJ0dWFsKCkgY29uc3Q7CisgIGJvb2wgaXNCaXRjb2RlKCkgY29uc3Q7CisgIGJvb2wgaXNTdHJpcHBlZCgpIGNvbnN0OworCisgIGJvb2wgY29udGFpbnNTeW1ib2woU3ltYm9sUmVmIFMpIGNvbnN0OworCisgIHJlbG9jYXRpb25faXRlcmF0b3IgcmVsb2NhdGlvbl9iZWdpbigpIGNvbnN0OworICByZWxvY2F0aW9uX2l0ZXJhdG9yIHJlbG9jYXRpb25fZW5kKCkgY29uc3Q7CisgIGl0ZXJhdG9yX3JhbmdlPHJlbG9jYXRpb25faXRlcmF0b3I+IHJlbG9jYXRpb25zKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHJlbG9jYXRpb25fYmVnaW4oKSwgcmVsb2NhdGlvbl9lbmQoKSk7CisgIH0KKyAgc2VjdGlvbl9pdGVyYXRvciBnZXRSZWxvY2F0ZWRTZWN0aW9uKCkgY29uc3Q7CisKKyAgRGF0YVJlZkltcGwgZ2V0UmF3RGF0YVJlZkltcGwoKSBjb25zdDsKKyAgY29uc3QgT2JqZWN0RmlsZSAqZ2V0T2JqZWN0KCkgY29uc3Q7Cit9OworCisvLy8gVGhpcyBpcyBhIHZhbHVlIHR5cGUgY2xhc3MgdGhhdCByZXByZXNlbnRzIGEgc2luZ2xlIHN5bWJvbCBpbiB0aGUgbGlzdCBvZgorLy8vIHN5bWJvbHMgaW4gdGhlIG9iamVjdCBmaWxlLgorY2xhc3MgU3ltYm9sUmVmIDogcHVibGljIEJhc2ljU3ltYm9sUmVmIHsKKyAgZnJpZW5kIGNsYXNzIFNlY3Rpb25SZWY7CisKK3B1YmxpYzoKKyAgZW51bSBUeXBlIHsKKyAgICBTVF9Vbmtub3duLCAvLyBUeXBlIG5vdCBzcGVjaWZpZWQKKyAgICBTVF9EYXRhLAorICAgIFNUX0RlYnVnLAorICAgIFNUX0ZpbGUsCisgICAgU1RfRnVuY3Rpb24sCisgICAgU1RfT3RoZXIKKyAgfTsKKworICBTeW1ib2xSZWYoKSA9IGRlZmF1bHQ7CisgIFN5bWJvbFJlZihEYXRhUmVmSW1wbCBTeW1ib2xQLCBjb25zdCBPYmplY3RGaWxlICpPd25lcik7CisgIFN5bWJvbFJlZihjb25zdCBCYXNpY1N5bWJvbFJlZiAmQikgOiBCYXNpY1N5bWJvbFJlZihCKSB7CisgICAgYXNzZXJ0KGlzYTxPYmplY3RGaWxlPihCYXNpY1N5bWJvbFJlZjo6Z2V0T2JqZWN0KCkpKTsKKyAgfQorCisgIEV4cGVjdGVkPFN0cmluZ1JlZj4gZ2V0TmFtZSgpIGNvbnN0OworICAvLy8gUmV0dXJucyB0aGUgc3ltYm9sIHZpcnR1YWwgYWRkcmVzcyAoaS5lLiBhZGRyZXNzIGF0IHdoaWNoIGl0IHdpbGwgYmUKKyAgLy8vIG1hcHBlZCkuCisgIEV4cGVjdGVkPHVpbnQ2NF90PiBnZXRBZGRyZXNzKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIHN5bWJvbCBkZXBlbmRpbmcgb24gdGhlIG9iamVjdCB0aGlzIGNhbiBiZSBhbgorICAvLy8gb2Zmc2V0IG9yIGEgdmlydHVhbCBhZGRyZXNzLgorICB1aW50NjRfdCBnZXRWYWx1ZSgpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgR2V0IHRoZSBhbGlnbm1lbnQgb2YgdGhpcyBzeW1ib2wgYXMgdGhlIGFjdHVhbCB2YWx1ZSAobm90IGxvZyAyKS4KKyAgdWludDMyX3QgZ2V0QWxpZ25tZW50KCkgY29uc3Q7CisgIHVpbnQ2NF90IGdldENvbW1vblNpemUoKSBjb25zdDsKKyAgRXhwZWN0ZWQ8U3ltYm9sUmVmOjpUeXBlPiBnZXRUeXBlKCkgY29uc3Q7CisKKyAgLy8vIEBicmllZiBHZXQgc2VjdGlvbiB0aGlzIHN5bWJvbCBpcyBkZWZpbmVkIGluIHJlZmVyZW5jZSB0by4gUmVzdWx0IGlzCisgIC8vLyBlbmRfc2VjdGlvbnMoKSBpZiBpdCBpcyB1bmRlZmluZWQgb3IgaXMgYW4gYWJzb2x1dGUgc3ltYm9sLgorICBFeHBlY3RlZDxzZWN0aW9uX2l0ZXJhdG9yPiBnZXRTZWN0aW9uKCkgY29uc3Q7CisKKyAgY29uc3QgT2JqZWN0RmlsZSAqZ2V0T2JqZWN0KCkgY29uc3Q7Cit9OworCitjbGFzcyBzeW1ib2xfaXRlcmF0b3IgOiBwdWJsaWMgYmFzaWNfc3ltYm9sX2l0ZXJhdG9yIHsKK3B1YmxpYzoKKyAgc3ltYm9sX2l0ZXJhdG9yKFN5bWJvbFJlZiBTeW0pIDogYmFzaWNfc3ltYm9sX2l0ZXJhdG9yKFN5bSkge30KKyAgc3ltYm9sX2l0ZXJhdG9yKGNvbnN0IGJhc2ljX3N5bWJvbF9pdGVyYXRvciAmQikKKyAgICAgIDogYmFzaWNfc3ltYm9sX2l0ZXJhdG9yKFN5bWJvbFJlZihCLT5nZXRSYXdEYXRhUmVmSW1wbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Q8T2JqZWN0RmlsZT4oQi0+Z2V0T2JqZWN0KCkpKSkge30KKworICBjb25zdCBTeW1ib2xSZWYgKm9wZXJhdG9yLT4oKSBjb25zdCB7CisgICAgY29uc3QgQmFzaWNTeW1ib2xSZWYgJlAgPSBiYXNpY19zeW1ib2xfaXRlcmF0b3I6Om9wZXJhdG9yICooKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgU3ltYm9sUmVmKj4oJlApOworICB9CisKKyAgY29uc3QgU3ltYm9sUmVmICZvcGVyYXRvciooKSBjb25zdCB7CisgICAgY29uc3QgQmFzaWNTeW1ib2xSZWYgJlAgPSBiYXNpY19zeW1ib2xfaXRlcmF0b3I6Om9wZXJhdG9yICooKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgU3ltYm9sUmVmJj4oUCk7CisgIH0KK307CisKKy8vLyBUaGlzIGNsYXNzIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgb2JqZWN0IGZpbGUgdHlwZXMuIENvbmNyZXRlIGluc3RhbmNlcworLy8vIG9mIHRoaXMgb2JqZWN0IGFyZSBjcmVhdGVkIGJ5IGNyZWF0ZU9iamVjdEZpbGUsIHdoaWNoIGZpZ3VyZXMgb3V0IHdoaWNoIHR5cGUKKy8vLyB0byBjcmVhdGUuCitjbGFzcyBPYmplY3RGaWxlIDogcHVibGljIFN5bWJvbGljRmlsZSB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHJvdGVjdGVkOgorICBPYmplY3RGaWxlKHVuc2lnbmVkIGludCBUeXBlLCBNZW1vcnlCdWZmZXJSZWYgU291cmNlKTsKKworICBjb25zdCB1aW50OF90ICpiYXNlKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oRGF0YS5nZXRCdWZmZXJTdGFydCgpKTsKKyAgfQorCisgIC8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZm9yIFN5bWJvbFJlZiB0byBjYWxsIGludGVybmFsbHkuIFRoZSBtYWluIGdvYWwgb2YKKyAgLy8gdGhpcyBpcyB0byBhbGxvdyBTeW1ib2xSZWY6OlN5bWJvbFBpbXBsIHRvIHBvaW50IGRpcmVjdGx5IHRvIHRoZSBzeW1ib2wKKyAgLy8gZW50cnkgaW4gdGhlIG1lbW9yeSBtYXBwZWQgb2JqZWN0IGZpbGUuIFN5bWJvbFBpbXBsIGNhbm5vdCBjb250YWluIGFueQorICAvLyB2aXJ0dWFsIGZ1bmN0aW9ucyBiZWNhdXNlIHRoZW4gaXQgY291bGQgbm90IHBvaW50IGludG8gdGhlIG1lbW9yeSBtYXBwZWQKKyAgLy8gZmlsZS4KKyAgLy8KKyAgLy8gSW1wbGVtZW50YXRpb25zIGFzc3VtZSB0aGF0IHRoZSBEYXRhUmVmSW1wbCBpcyB2YWxpZCBhbmQgaGFzIG5vdCBiZWVuCisgIC8vIG1vZGlmaWVkIGV4dGVybmFsbHkuIEl0J3MgVUIgb3RoZXJ3aXNlLgorICBmcmllbmQgY2xhc3MgU3ltYm9sUmVmOworCisgIHZpcnR1YWwgRXhwZWN0ZWQ8U3RyaW5nUmVmPiBnZXRTeW1ib2xOYW1lKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0ID0gMDsKKyAgc3RkOjplcnJvcl9jb2RlIHByaW50U3ltYm9sTmFtZShyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisgIHZpcnR1YWwgRXhwZWN0ZWQ8dWludDY0X3Q+IGdldFN5bWJvbEFkZHJlc3MoRGF0YVJlZkltcGwgU3ltYikgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQ2NF90IGdldFN5bWJvbFZhbHVlSW1wbChEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3ltYm9sQWxpZ25tZW50KERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0OworICB2aXJ0dWFsIHVpbnQ2NF90IGdldENvbW1vblN5bWJvbFNpemVJbXBsKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBFeHBlY3RlZDxTeW1ib2xSZWY6OlR5cGU+IGdldFN5bWJvbFR5cGUoRGF0YVJlZkltcGwgU3ltYikgY29uc3QgPSAwOworICB2aXJ0dWFsIEV4cGVjdGVkPHNlY3Rpb25faXRlcmF0b3I+CisgIGdldFN5bWJvbFNlY3Rpb24oRGF0YVJlZkltcGwgU3ltYikgY29uc3QgPSAwOworCisgIC8vIFNhbWUgYXMgYWJvdmUgZm9yIFNlY3Rpb25SZWYuCisgIGZyaWVuZCBjbGFzcyBTZWN0aW9uUmVmOworCisgIHZpcnR1YWwgdm9pZCBtb3ZlU2VjdGlvbk5leHQoRGF0YVJlZkltcGwgJlNlYykgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6ZXJyb3JfY29kZSBnZXRTZWN0aW9uTmFtZShEYXRhUmVmSW1wbCBTZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiAmUmVzKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDY0X3QgZ2V0U2VjdGlvbkFkZHJlc3MoRGF0YVJlZkltcGwgU2VjKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDY0X3QgZ2V0U2VjdGlvbkluZGV4KERhdGFSZWZJbXBsIFNlYykgY29uc3QgPSAwOworICB2aXJ0dWFsIHVpbnQ2NF90IGdldFNlY3Rpb25TaXplKERhdGFSZWZJbXBsIFNlYykgY29uc3QgPSAwOworICB2aXJ0dWFsIHN0ZDo6ZXJyb3JfY29kZSBnZXRTZWN0aW9uQ29udGVudHMoRGF0YVJlZkltcGwgU2VjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmICZSZXMpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50NjRfdCBnZXRTZWN0aW9uQWxpZ25tZW50KERhdGFSZWZJbXBsIFNlYykgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNTZWN0aW9uQ29tcHJlc3NlZChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzU2VjdGlvblRleHQoRGF0YVJlZkltcGwgU2VjKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBpc1NlY3Rpb25EYXRhKERhdGFSZWZJbXBsIFNlYykgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgaXNTZWN0aW9uQlNTKERhdGFSZWZJbXBsIFNlYykgY29uc3QgPSAwOworICAvLyBBIHNlY3Rpb24gaXMgJ3ZpcnR1YWwnIGlmIGl0cyBjb250ZW50cyBhcmVuJ3QgcHJlc2VudCBpbiB0aGUgb2JqZWN0IGltYWdlLgorICB2aXJ0dWFsIGJvb2wgaXNTZWN0aW9uVmlydHVhbChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzU2VjdGlvbkJpdGNvZGUoRGF0YVJlZkltcGwgU2VjKSBjb25zdDsKKyAgdmlydHVhbCBib29sIGlzU2VjdGlvblN0cmlwcGVkKERhdGFSZWZJbXBsIFNlYykgY29uc3Q7CisgIHZpcnR1YWwgcmVsb2NhdGlvbl9pdGVyYXRvciBzZWN0aW9uX3JlbF9iZWdpbihEYXRhUmVmSW1wbCBTZWMpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCByZWxvY2F0aW9uX2l0ZXJhdG9yIHNlY3Rpb25fcmVsX2VuZChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzZWN0aW9uX2l0ZXJhdG9yIGdldFJlbG9jYXRlZFNlY3Rpb24oRGF0YVJlZkltcGwgU2VjKSBjb25zdDsKKworICAvLyBTYW1lIGFzIGFib3ZlIGZvciBSZWxvY2F0aW9uUmVmLgorICBmcmllbmQgY2xhc3MgUmVsb2NhdGlvblJlZjsKKyAgdmlydHVhbCB2b2lkIG1vdmVSZWxvY2F0aW9uTmV4dChEYXRhUmVmSW1wbCAmUmVsKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdWludDY0X3QgZ2V0UmVsb2NhdGlvbk9mZnNldChEYXRhUmVmSW1wbCBSZWwpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzeW1ib2xfaXRlcmF0b3IgZ2V0UmVsb2NhdGlvblN5bWJvbChEYXRhUmVmSW1wbCBSZWwpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB1aW50NjRfdCBnZXRSZWxvY2F0aW9uVHlwZShEYXRhUmVmSW1wbCBSZWwpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIGdldFJlbG9jYXRpb25UeXBlTmFtZShEYXRhUmVmSW1wbCBSZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZSZXN1bHQpIGNvbnN0ID0gMDsKKworICB1aW50NjRfdCBnZXRTeW1ib2xWYWx1ZShEYXRhUmVmSW1wbCBTeW1iKSBjb25zdDsKKworcHVibGljOgorICBPYmplY3RGaWxlKCkgPSBkZWxldGU7CisgIE9iamVjdEZpbGUoY29uc3QgT2JqZWN0RmlsZSAmb3RoZXIpID0gZGVsZXRlOworCisgIHVpbnQ2NF90IGdldENvbW1vblN5bWJvbFNpemUoRGF0YVJlZkltcGwgU3ltYikgY29uc3QgeworICAgIGFzc2VydChnZXRTeW1ib2xGbGFncyhTeW1iKSAmIFN5bWJvbFJlZjo6U0ZfQ29tbW9uKTsKKyAgICByZXR1cm4gZ2V0Q29tbW9uU3ltYm9sU2l6ZUltcGwoU3ltYik7CisgIH0KKworICB1c2luZyBzeW1ib2xfaXRlcmF0b3JfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxzeW1ib2xfaXRlcmF0b3I+OworICBzeW1ib2xfaXRlcmF0b3JfcmFuZ2Ugc3ltYm9scygpIGNvbnN0IHsKKyAgICByZXR1cm4gc3ltYm9sX2l0ZXJhdG9yX3JhbmdlKHN5bWJvbF9iZWdpbigpLCBzeW1ib2xfZW5kKCkpOworICB9CisKKyAgdmlydHVhbCBzZWN0aW9uX2l0ZXJhdG9yIHNlY3Rpb25fYmVnaW4oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgc2VjdGlvbl9pdGVyYXRvciBzZWN0aW9uX2VuZCgpIGNvbnN0ID0gMDsKKworICB1c2luZyBzZWN0aW9uX2l0ZXJhdG9yX3JhbmdlID0gaXRlcmF0b3JfcmFuZ2U8c2VjdGlvbl9pdGVyYXRvcj47CisgIHNlY3Rpb25faXRlcmF0b3JfcmFuZ2Ugc2VjdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIHNlY3Rpb25faXRlcmF0b3JfcmFuZ2Uoc2VjdGlvbl9iZWdpbigpLCBzZWN0aW9uX2VuZCgpKTsKKyAgfQorCisgIC8vLyBAYnJpZWYgVGhlIG51bWJlciBvZiBieXRlcyB1c2VkIHRvIHJlcHJlc2VudCBhbiBhZGRyZXNzIGluIHRoaXMgb2JqZWN0CisgIC8vLyAgICAgICAgZmlsZSBmb3JtYXQuCisgIHZpcnR1YWwgdWludDhfdCBnZXRCeXRlc0luQWRkcmVzcygpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRGaWxlRm9ybWF0TmFtZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBUcmlwbGU6OkFyY2hUeXBlIGdldEFyY2goKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgU3VidGFyZ2V0RmVhdHVyZXMgZ2V0RmVhdHVyZXMoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBzZXRBUk1TdWJBcmNoKFRyaXBsZSAmVGhlVHJpcGxlKSBjb25zdCB7IH0KKworICAvLy8gQGJyaWVmIENyZWF0ZSBhIHRyaXBsZSBmcm9tIHRoZSBkYXRhIGluIHRoaXMgb2JqZWN0IGZpbGUuCisgIFRyaXBsZSBtYWtlVHJpcGxlKCkgY29uc3Q7CisKKyAgdmlydHVhbCBzdGQ6OmVycm9yX2NvZGUKKyAgICBnZXRCdWlsZEF0dHJpYnV0ZXMoQVJNQXR0cmlidXRlUGFyc2VyICZBdHRyaWJ1dGVzKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKCk7CisgICAgfQorCisgIC8vLyBNYXBzIGEgZGVidWcgc2VjdGlvbiBuYW1lIHRvIGEgc3RhbmRhcmQgRFdBUkYgc2VjdGlvbiBuYW1lLgorICB2aXJ0dWFsIFN0cmluZ1JlZiBtYXBEZWJ1Z1NlY3Rpb25OYW1lKFN0cmluZ1JlZiBOYW1lKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisKKyAgLy8vIFRydWUgaWYgdGhpcyBpcyBhIHJlbG9jYXRhYmxlIG9iamVjdCAoLm8vLm9iaikuCisgIHZpcnR1YWwgYm9vbCBpc1JlbG9jYXRhYmxlT2JqZWN0KCkgY29uc3QgPSAwOworCisgIC8vLyBAcmV0dXJucyBQb2ludGVyIHRvIE9iamVjdEZpbGUgc3ViY2xhc3MgdG8gaGFuZGxlIHRoaXMgdHlwZSBvZiBvYmplY3QuCisgIC8vLyBAcGFyYW0gT2JqZWN0UGF0aCBUaGUgcGF0aCB0byB0aGUgb2JqZWN0IGZpbGUuIE9iamVjdFBhdGguaXNPYmplY3QgbXVzdAorICAvLy8gICAgICAgIHJldHVybiB0cnVlLgorICAvLy8gQGJyaWVmIENyZWF0ZSBPYmplY3RGaWxlIGZyb20gcGF0aC4KKyAgc3RhdGljIEV4cGVjdGVkPE93bmluZ0JpbmFyeTxPYmplY3RGaWxlPj4KKyAgY3JlYXRlT2JqZWN0RmlsZShTdHJpbmdSZWYgT2JqZWN0UGF0aCk7CisKKyAgc3RhdGljIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxPYmplY3RGaWxlPj4KKyAgY3JlYXRlT2JqZWN0RmlsZShNZW1vcnlCdWZmZXJSZWYgT2JqZWN0LCBsbHZtOjpmaWxlX21hZ2ljIFR5cGUpOworICBzdGF0aWMgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPE9iamVjdEZpbGU+PgorICBjcmVhdGVPYmplY3RGaWxlKE1lbW9yeUJ1ZmZlclJlZiBPYmplY3QpIHsKKyAgICByZXR1cm4gY3JlYXRlT2JqZWN0RmlsZShPYmplY3QsIGxsdm06OmZpbGVfbWFnaWM6OnVua25vd24pOworICB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBCaW5hcnkgKnYpIHsKKyAgICByZXR1cm4gdi0+aXNPYmplY3QoKTsKKyAgfQorCisgIHN0YXRpYyBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8Q09GRk9iamVjdEZpbGU+PgorICBjcmVhdGVDT0ZGT2JqZWN0RmlsZShNZW1vcnlCdWZmZXJSZWYgT2JqZWN0KTsKKworICBzdGF0aWMgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPE9iamVjdEZpbGU+PgorICBjcmVhdGVFTEZPYmplY3RGaWxlKE1lbW9yeUJ1ZmZlclJlZiBPYmplY3QpOworCisgIHN0YXRpYyBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8TWFjaE9PYmplY3RGaWxlPj4KKyAgY3JlYXRlTWFjaE9PYmplY3RGaWxlKE1lbW9yeUJ1ZmZlclJlZiBPYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBVbml2ZXJzYWxDcHV0eXBlID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFVuaXZlcnNhbEluZGV4ID0gMCk7CisKKyAgc3RhdGljIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxXYXNtT2JqZWN0RmlsZT4+CisgIGNyZWF0ZVdhc21PYmplY3RGaWxlKE1lbW9yeUJ1ZmZlclJlZiBPYmplY3QpOworfTsKKworLy8gSW5saW5lIGZ1bmN0aW9uIGRlZmluaXRpb25zLgoraW5saW5lIFN5bWJvbFJlZjo6U3ltYm9sUmVmKERhdGFSZWZJbXBsIFN5bWJvbFAsIGNvbnN0IE9iamVjdEZpbGUgKk93bmVyKQorICAgIDogQmFzaWNTeW1ib2xSZWYoU3ltYm9sUCwgT3duZXIpIHt9CisKK2lubGluZSBFeHBlY3RlZDxTdHJpbmdSZWY+IFN5bWJvbFJlZjo6Z2V0TmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGdldE9iamVjdCgpLT5nZXRTeW1ib2xOYW1lKGdldFJhd0RhdGFSZWZJbXBsKCkpOworfQorCitpbmxpbmUgRXhwZWN0ZWQ8dWludDY0X3Q+IFN5bWJvbFJlZjo6Z2V0QWRkcmVzcygpIGNvbnN0IHsKKyAgcmV0dXJuIGdldE9iamVjdCgpLT5nZXRTeW1ib2xBZGRyZXNzKGdldFJhd0RhdGFSZWZJbXBsKCkpOworfQorCitpbmxpbmUgdWludDY0X3QgU3ltYm9sUmVmOjpnZXRWYWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGdldE9iamVjdCgpLT5nZXRTeW1ib2xWYWx1ZShnZXRSYXdEYXRhUmVmSW1wbCgpKTsKK30KKworaW5saW5lIHVpbnQzMl90IFN5bWJvbFJlZjo6Z2V0QWxpZ25tZW50KCkgY29uc3QgeworICByZXR1cm4gZ2V0T2JqZWN0KCktPmdldFN5bWJvbEFsaWdubWVudChnZXRSYXdEYXRhUmVmSW1wbCgpKTsKK30KKworaW5saW5lIHVpbnQ2NF90IFN5bWJvbFJlZjo6Z2V0Q29tbW9uU2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGdldE9iamVjdCgpLT5nZXRDb21tb25TeW1ib2xTaXplKGdldFJhd0RhdGFSZWZJbXBsKCkpOworfQorCitpbmxpbmUgRXhwZWN0ZWQ8c2VjdGlvbl9pdGVyYXRvcj4gU3ltYm9sUmVmOjpnZXRTZWN0aW9uKCkgY29uc3QgeworICByZXR1cm4gZ2V0T2JqZWN0KCktPmdldFN5bWJvbFNlY3Rpb24oZ2V0UmF3RGF0YVJlZkltcGwoKSk7Cit9CisKK2lubGluZSBFeHBlY3RlZDxTeW1ib2xSZWY6OlR5cGU+IFN5bWJvbFJlZjo6Z2V0VHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGdldE9iamVjdCgpLT5nZXRTeW1ib2xUeXBlKGdldFJhd0RhdGFSZWZJbXBsKCkpOworfQorCitpbmxpbmUgY29uc3QgT2JqZWN0RmlsZSAqU3ltYm9sUmVmOjpnZXRPYmplY3QoKSBjb25zdCB7CisgIGNvbnN0IFN5bWJvbGljRmlsZSAqTyA9IEJhc2ljU3ltYm9sUmVmOjpnZXRPYmplY3QoKTsKKyAgcmV0dXJuIGNhc3Q8T2JqZWN0RmlsZT4oTyk7Cit9CisKKy8vLyBTZWN0aW9uUmVmCitpbmxpbmUgU2VjdGlvblJlZjo6U2VjdGlvblJlZihEYXRhUmVmSW1wbCBTZWN0aW9uUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9iamVjdEZpbGUgKk93bmVyKQorICA6IFNlY3Rpb25QaW1wbChTZWN0aW9uUCkKKyAgLCBPd25pbmdPYmplY3QoT3duZXIpIHt9CisKK2lubGluZSBib29sIFNlY3Rpb25SZWY6Om9wZXJhdG9yPT0oY29uc3QgU2VjdGlvblJlZiAmT3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIFNlY3Rpb25QaW1wbCA9PSBPdGhlci5TZWN0aW9uUGltcGw7Cit9CisKK2lubGluZSBib29sIFNlY3Rpb25SZWY6Om9wZXJhdG9yIT0oY29uc3QgU2VjdGlvblJlZiAmT3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIFNlY3Rpb25QaW1wbCAhPSBPdGhlci5TZWN0aW9uUGltcGw7Cit9CisKK2lubGluZSBib29sIFNlY3Rpb25SZWY6Om9wZXJhdG9yPChjb25zdCBTZWN0aW9uUmVmICZPdGhlcikgY29uc3QgeworICByZXR1cm4gU2VjdGlvblBpbXBsIDwgT3RoZXIuU2VjdGlvblBpbXBsOworfQorCitpbmxpbmUgdm9pZCBTZWN0aW9uUmVmOjptb3ZlTmV4dCgpIHsKKyAgcmV0dXJuIE93bmluZ09iamVjdC0+bW92ZVNlY3Rpb25OZXh0KFNlY3Rpb25QaW1wbCk7Cit9CisKK2lubGluZSBzdGQ6OmVycm9yX2NvZGUgU2VjdGlvblJlZjo6Z2V0TmFtZShTdHJpbmdSZWYgJlJlc3VsdCkgY29uc3QgeworICByZXR1cm4gT3duaW5nT2JqZWN0LT5nZXRTZWN0aW9uTmFtZShTZWN0aW9uUGltcGwsIFJlc3VsdCk7Cit9CisKK2lubGluZSB1aW50NjRfdCBTZWN0aW9uUmVmOjpnZXRBZGRyZXNzKCkgY29uc3QgeworICByZXR1cm4gT3duaW5nT2JqZWN0LT5nZXRTZWN0aW9uQWRkcmVzcyhTZWN0aW9uUGltcGwpOworfQorCitpbmxpbmUgdWludDY0X3QgU2VjdGlvblJlZjo6Z2V0SW5kZXgoKSBjb25zdCB7CisgIHJldHVybiBPd25pbmdPYmplY3QtPmdldFNlY3Rpb25JbmRleChTZWN0aW9uUGltcGwpOworfQorCitpbmxpbmUgdWludDY0X3QgU2VjdGlvblJlZjo6Z2V0U2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIE93bmluZ09iamVjdC0+Z2V0U2VjdGlvblNpemUoU2VjdGlvblBpbXBsKTsKK30KKworaW5saW5lIHN0ZDo6ZXJyb3JfY29kZSBTZWN0aW9uUmVmOjpnZXRDb250ZW50cyhTdHJpbmdSZWYgJlJlc3VsdCkgY29uc3QgeworICByZXR1cm4gT3duaW5nT2JqZWN0LT5nZXRTZWN0aW9uQ29udGVudHMoU2VjdGlvblBpbXBsLCBSZXN1bHQpOworfQorCitpbmxpbmUgdWludDY0X3QgU2VjdGlvblJlZjo6Z2V0QWxpZ25tZW50KCkgY29uc3QgeworICByZXR1cm4gT3duaW5nT2JqZWN0LT5nZXRTZWN0aW9uQWxpZ25tZW50KFNlY3Rpb25QaW1wbCk7Cit9CisKK2lubGluZSBib29sIFNlY3Rpb25SZWY6OmlzQ29tcHJlc3NlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIE93bmluZ09iamVjdC0+aXNTZWN0aW9uQ29tcHJlc3NlZChTZWN0aW9uUGltcGwpOworfQorCitpbmxpbmUgYm9vbCBTZWN0aW9uUmVmOjppc1RleHQoKSBjb25zdCB7CisgIHJldHVybiBPd25pbmdPYmplY3QtPmlzU2VjdGlvblRleHQoU2VjdGlvblBpbXBsKTsKK30KKworaW5saW5lIGJvb2wgU2VjdGlvblJlZjo6aXNEYXRhKCkgY29uc3QgeworICByZXR1cm4gT3duaW5nT2JqZWN0LT5pc1NlY3Rpb25EYXRhKFNlY3Rpb25QaW1wbCk7Cit9CisKK2lubGluZSBib29sIFNlY3Rpb25SZWY6OmlzQlNTKCkgY29uc3QgeworICByZXR1cm4gT3duaW5nT2JqZWN0LT5pc1NlY3Rpb25CU1MoU2VjdGlvblBpbXBsKTsKK30KKworaW5saW5lIGJvb2wgU2VjdGlvblJlZjo6aXNWaXJ0dWFsKCkgY29uc3QgeworICByZXR1cm4gT3duaW5nT2JqZWN0LT5pc1NlY3Rpb25WaXJ0dWFsKFNlY3Rpb25QaW1wbCk7Cit9CisKK2lubGluZSBib29sIFNlY3Rpb25SZWY6OmlzQml0Y29kZSgpIGNvbnN0IHsKKyAgcmV0dXJuIE93bmluZ09iamVjdC0+aXNTZWN0aW9uQml0Y29kZShTZWN0aW9uUGltcGwpOworfQorCitpbmxpbmUgYm9vbCBTZWN0aW9uUmVmOjppc1N0cmlwcGVkKCkgY29uc3QgeworICByZXR1cm4gT3duaW5nT2JqZWN0LT5pc1NlY3Rpb25TdHJpcHBlZChTZWN0aW9uUGltcGwpOworfQorCitpbmxpbmUgcmVsb2NhdGlvbl9pdGVyYXRvciBTZWN0aW9uUmVmOjpyZWxvY2F0aW9uX2JlZ2luKCkgY29uc3QgeworICByZXR1cm4gT3duaW5nT2JqZWN0LT5zZWN0aW9uX3JlbF9iZWdpbihTZWN0aW9uUGltcGwpOworfQorCitpbmxpbmUgcmVsb2NhdGlvbl9pdGVyYXRvciBTZWN0aW9uUmVmOjpyZWxvY2F0aW9uX2VuZCgpIGNvbnN0IHsKKyAgcmV0dXJuIE93bmluZ09iamVjdC0+c2VjdGlvbl9yZWxfZW5kKFNlY3Rpb25QaW1wbCk7Cit9CisKK2lubGluZSBzZWN0aW9uX2l0ZXJhdG9yIFNlY3Rpb25SZWY6OmdldFJlbG9jYXRlZFNlY3Rpb24oKSBjb25zdCB7CisgIHJldHVybiBPd25pbmdPYmplY3QtPmdldFJlbG9jYXRlZFNlY3Rpb24oU2VjdGlvblBpbXBsKTsKK30KKworaW5saW5lIERhdGFSZWZJbXBsIFNlY3Rpb25SZWY6OmdldFJhd0RhdGFSZWZJbXBsKCkgY29uc3QgeworICByZXR1cm4gU2VjdGlvblBpbXBsOworfQorCitpbmxpbmUgY29uc3QgT2JqZWN0RmlsZSAqU2VjdGlvblJlZjo6Z2V0T2JqZWN0KCkgY29uc3QgeworICByZXR1cm4gT3duaW5nT2JqZWN0OworfQorCisvLy8gUmVsb2NhdGlvblJlZgoraW5saW5lIFJlbG9jYXRpb25SZWY6OlJlbG9jYXRpb25SZWYoRGF0YVJlZkltcGwgUmVsb2NhdGlvblAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPYmplY3RGaWxlICpPd25lcikKKyAgOiBSZWxvY2F0aW9uUGltcGwoUmVsb2NhdGlvblApCisgICwgT3duaW5nT2JqZWN0KE93bmVyKSB7fQorCitpbmxpbmUgYm9vbCBSZWxvY2F0aW9uUmVmOjpvcGVyYXRvcj09KGNvbnN0IFJlbG9jYXRpb25SZWYgJk90aGVyKSBjb25zdCB7CisgIHJldHVybiBSZWxvY2F0aW9uUGltcGwgPT0gT3RoZXIuUmVsb2NhdGlvblBpbXBsOworfQorCitpbmxpbmUgdm9pZCBSZWxvY2F0aW9uUmVmOjptb3ZlTmV4dCgpIHsKKyAgcmV0dXJuIE93bmluZ09iamVjdC0+bW92ZVJlbG9jYXRpb25OZXh0KFJlbG9jYXRpb25QaW1wbCk7Cit9CisKK2lubGluZSB1aW50NjRfdCBSZWxvY2F0aW9uUmVmOjpnZXRPZmZzZXQoKSBjb25zdCB7CisgIHJldHVybiBPd25pbmdPYmplY3QtPmdldFJlbG9jYXRpb25PZmZzZXQoUmVsb2NhdGlvblBpbXBsKTsKK30KKworaW5saW5lIHN5bWJvbF9pdGVyYXRvciBSZWxvY2F0aW9uUmVmOjpnZXRTeW1ib2woKSBjb25zdCB7CisgIHJldHVybiBPd25pbmdPYmplY3QtPmdldFJlbG9jYXRpb25TeW1ib2woUmVsb2NhdGlvblBpbXBsKTsKK30KKworaW5saW5lIHVpbnQ2NF90IFJlbG9jYXRpb25SZWY6OmdldFR5cGUoKSBjb25zdCB7CisgIHJldHVybiBPd25pbmdPYmplY3QtPmdldFJlbG9jYXRpb25UeXBlKFJlbG9jYXRpb25QaW1wbCk7Cit9CisKK2lubGluZSB2b2lkIFJlbG9jYXRpb25SZWY6OmdldFR5cGVOYW1lKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzdWx0KSBjb25zdCB7CisgIHJldHVybiBPd25pbmdPYmplY3QtPmdldFJlbG9jYXRpb25UeXBlTmFtZShSZWxvY2F0aW9uUGltcGwsIFJlc3VsdCk7Cit9CisKK2lubGluZSBEYXRhUmVmSW1wbCBSZWxvY2F0aW9uUmVmOjpnZXRSYXdEYXRhUmVmSW1wbCgpIGNvbnN0IHsKKyAgcmV0dXJuIFJlbG9jYXRpb25QaW1wbDsKK30KKworaW5saW5lIGNvbnN0IE9iamVjdEZpbGUgKlJlbG9jYXRpb25SZWY6OmdldE9iamVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIE93bmluZ09iamVjdDsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIG9iamVjdAorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9PQkpFQ1RfT0JKRUNURklMRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9SZWxvY1Zpc2l0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L1JlbG9jVmlzaXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkMGU5MzgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9SZWxvY1Zpc2l0b3IuaApAQCAtMCwwICsxLDMyNCBAQAorLy89PT0tIFJlbG9jVmlzaXRvci5oIC0gVmlzaXRvciBmb3Igb2JqZWN0IGZpbGUgcmVsb2NhdGlvbnMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgYSB3cmFwcGVyIGFyb3VuZCBhbGwgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiByZWxvY2F0aW9ucworLy8gaW4gZGlmZmVyZW50IGZpbGUgZm9ybWF0cywgc3VjaCB0aGF0IGEgY2xpZW50IGNhbiBoYW5kbGUgdGhlbSBpbiBhIHVuaWZpZWQKKy8vIG1hbm5lciBieSBvbmx5IGltcGxlbWVudGluZyBhIG1pbmltYWwgbnVtYmVyIG9mIGZ1bmN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUX1JFTE9DVklTSVRPUl9ICisjZGVmaW5lIExMVk1fT0JKRUNUX1JFTE9DVklTSVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9FTEYuaCIKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9NYWNoTy5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L0NPRkYuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9FTEZPYmplY3RGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3QvTWFjaE8uaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9PYmplY3RGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb2JqZWN0IHsKKworLy8vIEBicmllZiBCYXNlIGNsYXNzIGZvciBvYmplY3QgZmlsZSByZWxvY2F0aW9uIHZpc2l0b3JzLgorY2xhc3MgUmVsb2NWaXNpdG9yIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgUmVsb2NWaXNpdG9yKGNvbnN0IE9iamVjdEZpbGUgJk9iaikgOiBPYmpUb1Zpc2l0KE9iaikge30KKworICAvLyBUT0RPOiBTaG91bGQgaGFuZGxlIG11bHRpcGxlIGFwcGxpZWQgcmVsb2NhdGlvbnMgdmlhIGVpdGhlciBwYXNzaW5nIGluIHRoZQorICAvLyBwcmV2aW91c2x5IGNvbXB1dGVkIHZhbHVlIG9yIGp1c3QgY291bnQgcGFpcmVkIHJlbG9jYXRpb25zIGFzIGEgc2luZ2xlCisgIC8vIHZpc2l0LgorICB1aW50NjRfdCB2aXNpdCh1aW50MzJfdCBSZWwsIFJlbG9jYXRpb25SZWYgUiwgdWludDY0X3QgVmFsdWUgPSAwKSB7CisgICAgaWYgKGlzYTxFTEZPYmplY3RGaWxlQmFzZT4oT2JqVG9WaXNpdCkpCisgICAgICByZXR1cm4gdmlzaXRFTEYoUmVsLCBSLCBWYWx1ZSk7CisgICAgaWYgKGlzYTxDT0ZGT2JqZWN0RmlsZT4oT2JqVG9WaXNpdCkpCisgICAgICByZXR1cm4gdmlzaXRDT0ZGKFJlbCwgUiwgVmFsdWUpOworICAgIGlmIChpc2E8TWFjaE9PYmplY3RGaWxlPihPYmpUb1Zpc2l0KSkKKyAgICAgIHJldHVybiB2aXNpdE1hY2hPKFJlbCwgUiwgVmFsdWUpOworCisgICAgSGFzRXJyb3IgPSB0cnVlOworICAgIHJldHVybiAwOworICB9CisKKyAgYm9vbCBlcnJvcigpIHsgcmV0dXJuIEhhc0Vycm9yOyB9CisKK3ByaXZhdGU6CisgIGNvbnN0IE9iamVjdEZpbGUgJk9ialRvVmlzaXQ7CisgIGJvb2wgSGFzRXJyb3IgPSBmYWxzZTsKKworICB1aW50NjRfdCB2aXNpdEVMRih1aW50MzJfdCBSZWwsIFJlbG9jYXRpb25SZWYgUiwgdWludDY0X3QgVmFsdWUpIHsKKyAgICBpZiAoT2JqVG9WaXNpdC5nZXRCeXRlc0luQWRkcmVzcygpID09IDgpIHsgLy8gNjQtYml0IG9iamVjdCBmaWxlCisgICAgICBzd2l0Y2ggKE9ialRvVmlzaXQuZ2V0QXJjaCgpKSB7CisgICAgICBjYXNlIFRyaXBsZTo6eDg2XzY0OgorICAgICAgICByZXR1cm4gdmlzaXRYODZfNjQoUmVsLCBSLCBWYWx1ZSk7CisgICAgICBjYXNlIFRyaXBsZTo6YWFyY2g2NDoKKyAgICAgIGNhc2UgVHJpcGxlOjphYXJjaDY0X2JlOgorICAgICAgICByZXR1cm4gdmlzaXRBYXJjaDY0KFJlbCwgUiwgVmFsdWUpOworICAgICAgY2FzZSBUcmlwbGU6OmJwZmVsOgorICAgICAgY2FzZSBUcmlwbGU6OmJwZmViOgorICAgICAgICByZXR1cm4gdmlzaXRCcGYoUmVsLCBSLCBWYWx1ZSk7CisgICAgICBjYXNlIFRyaXBsZTo6bWlwczY0ZWw6CisgICAgICBjYXNlIFRyaXBsZTo6bWlwczY0OgorICAgICAgICByZXR1cm4gdmlzaXRNaXBzNjQoUmVsLCBSLCBWYWx1ZSk7CisgICAgICBjYXNlIFRyaXBsZTo6cHBjNjRsZToKKyAgICAgIGNhc2UgVHJpcGxlOjpwcGM2NDoKKyAgICAgICAgcmV0dXJuIHZpc2l0UFBDNjQoUmVsLCBSLCBWYWx1ZSk7CisgICAgICBjYXNlIFRyaXBsZTo6c3lzdGVtejoKKyAgICAgICAgcmV0dXJuIHZpc2l0U3lzdGVteihSZWwsIFIsIFZhbHVlKTsKKyAgICAgIGNhc2UgVHJpcGxlOjpzcGFyY3Y5OgorICAgICAgICByZXR1cm4gdmlzaXRTcGFyYzY0KFJlbCwgUiwgVmFsdWUpOworICAgICAgY2FzZSBUcmlwbGU6OmFtZGdjbjoKKyAgICAgICAgcmV0dXJuIHZpc2l0QW1kZ3B1KFJlbCwgUiwgVmFsdWUpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgSGFzRXJyb3IgPSB0cnVlOworICAgICAgICByZXR1cm4gMDsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyAzMi1iaXQgb2JqZWN0IGZpbGUKKyAgICBhc3NlcnQoT2JqVG9WaXNpdC5nZXRCeXRlc0luQWRkcmVzcygpID09IDQgJiYKKyAgICAgICAgICAgIkludmFsaWQgd29yZCBzaXplIGluIG9iamVjdCBmaWxlIik7CisKKyAgICBzd2l0Y2ggKE9ialRvVmlzaXQuZ2V0QXJjaCgpKSB7CisgICAgY2FzZSBUcmlwbGU6Ong4NjoKKyAgICAgIHJldHVybiB2aXNpdFg4NihSZWwsIFIsIFZhbHVlKTsKKyAgICBjYXNlIFRyaXBsZTo6cHBjOgorICAgICAgcmV0dXJuIHZpc2l0UFBDMzIoUmVsLCBSLCBWYWx1ZSk7CisgICAgY2FzZSBUcmlwbGU6OmFybToKKyAgICBjYXNlIFRyaXBsZTo6YXJtZWI6CisgICAgICByZXR1cm4gdmlzaXRBUk0oUmVsLCBSLCBWYWx1ZSk7CisgICAgY2FzZSBUcmlwbGU6OmxhbmFpOgorICAgICAgcmV0dXJuIHZpc2l0TGFuYWkoUmVsLCBSLCBWYWx1ZSk7CisgICAgY2FzZSBUcmlwbGU6Om1pcHNlbDoKKyAgICBjYXNlIFRyaXBsZTo6bWlwczoKKyAgICAgIHJldHVybiB2aXNpdE1pcHMzMihSZWwsIFIsIFZhbHVlKTsKKyAgICBjYXNlIFRyaXBsZTo6c3BhcmM6CisgICAgICByZXR1cm4gdmlzaXRTcGFyYzMyKFJlbCwgUiwgVmFsdWUpOworICAgIGNhc2UgVHJpcGxlOjpoZXhhZ29uOgorICAgICAgcmV0dXJuIHZpc2l0SGV4YWdvbihSZWwsIFIsIFZhbHVlKTsKKyAgICBkZWZhdWx0OgorICAgICAgSGFzRXJyb3IgPSB0cnVlOworICAgICAgcmV0dXJuIDA7CisgICAgfQorICB9CisKKyAgaW50NjRfdCBnZXRFTEZBZGRlbmQoUmVsb2NhdGlvblJlZiBSKSB7CisgICAgRXhwZWN0ZWQ8aW50NjRfdD4gQWRkZW5kT3JFcnIgPSBFTEZSZWxvY2F0aW9uUmVmKFIpLmdldEFkZGVuZCgpOworICAgIGhhbmRsZUFsbEVycm9ycyhBZGRlbmRPckVyci50YWtlRXJyb3IoKSwgW10oY29uc3QgRXJyb3JJbmZvQmFzZSAmRUkpIHsKKyAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcihFSS5tZXNzYWdlKCkpOworICAgIH0pOworICAgIHJldHVybiAqQWRkZW5kT3JFcnI7CisgIH0KKworICB1aW50NjRfdCB2aXNpdFg4Nl82NCh1aW50MzJfdCBSZWwsIFJlbG9jYXRpb25SZWYgUiwgdWludDY0X3QgVmFsdWUpIHsKKyAgICBzd2l0Y2ggKFJlbCkgeworICAgIGNhc2UgRUxGOjpSX1g4Nl82NF9OT05FOgorICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBFTEY6OlJfWDg2XzY0XzY0OgorICAgICAgcmV0dXJuIFZhbHVlICsgZ2V0RUxGQWRkZW5kKFIpOworICAgIGNhc2UgRUxGOjpSX1g4Nl82NF9QQzMyOgorICAgICAgcmV0dXJuIFZhbHVlICsgZ2V0RUxGQWRkZW5kKFIpIC0gUi5nZXRPZmZzZXQoKTsKKyAgICBjYXNlIEVMRjo6Ul9YODZfNjRfMzI6CisgICAgY2FzZSBFTEY6OlJfWDg2XzY0XzMyUzoKKyAgICAgIHJldHVybiAoVmFsdWUgKyBnZXRFTEZBZGRlbmQoUikpICYgMHhGRkZGRkZGRjsKKyAgICB9CisgICAgSGFzRXJyb3IgPSB0cnVlOworICAgIHJldHVybiAwOworICB9CisKKyAgdWludDY0X3QgdmlzaXRBYXJjaDY0KHVpbnQzMl90IFJlbCwgUmVsb2NhdGlvblJlZiBSLCB1aW50NjRfdCBWYWx1ZSkgeworICAgIHN3aXRjaCAoUmVsKSB7CisgICAgY2FzZSBFTEY6OlJfQUFSQ0g2NF9BQlMzMjogeworICAgICAgaW50NjRfdCBSZXMgPSBWYWx1ZSArIGdldEVMRkFkZGVuZChSKTsKKyAgICAgIGlmIChSZXMgPCBJTlQzMl9NSU4gfHwgUmVzID4gVUlOVDMyX01BWCkKKyAgICAgICAgSGFzRXJyb3IgPSB0cnVlOworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihSZXMpOworICAgIH0KKyAgICBjYXNlIEVMRjo6Ul9BQVJDSDY0X0FCUzY0OgorICAgICAgcmV0dXJuIFZhbHVlICsgZ2V0RUxGQWRkZW5kKFIpOworICAgIH0KKyAgICBIYXNFcnJvciA9IHRydWU7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB1aW50NjRfdCB2aXNpdEJwZih1aW50MzJfdCBSZWwsIFJlbG9jYXRpb25SZWYgUiwgdWludDY0X3QgVmFsdWUpIHsKKyAgICBzd2l0Y2ggKFJlbCkgeworICAgIGNhc2UgRUxGOjpSX0JQRl82NF8zMjoKKyAgICAgIHJldHVybiBWYWx1ZSAmIDB4RkZGRkZGRkY7CisgICAgY2FzZSBFTEY6OlJfQlBGXzY0XzY0OgorICAgICAgcmV0dXJuIFZhbHVlOworICAgIH0KKyAgICBIYXNFcnJvciA9IHRydWU7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB1aW50NjRfdCB2aXNpdE1pcHM2NCh1aW50MzJfdCBSZWwsIFJlbG9jYXRpb25SZWYgUiwgdWludDY0X3QgVmFsdWUpIHsKKyAgICBzd2l0Y2ggKFJlbCkgeworICAgIGNhc2UgRUxGOjpSX01JUFNfMzI6CisgICAgICByZXR1cm4gKFZhbHVlICsgZ2V0RUxGQWRkZW5kKFIpKSAmIDB4RkZGRkZGRkY7CisgICAgY2FzZSBFTEY6OlJfTUlQU182NDoKKyAgICAgIHJldHVybiBWYWx1ZSArIGdldEVMRkFkZGVuZChSKTsKKyAgICBjYXNlIEVMRjo6Ul9NSVBTX1RMU19EVFBSRUw2NDoKKyAgICAgIHJldHVybiBWYWx1ZSArIGdldEVMRkFkZGVuZChSKSAtIDB4ODAwMDsKKyAgICB9CisgICAgSGFzRXJyb3IgPSB0cnVlOworICAgIHJldHVybiAwOworICB9CisKKyAgdWludDY0X3QgdmlzaXRQUEM2NCh1aW50MzJfdCBSZWwsIFJlbG9jYXRpb25SZWYgUiwgdWludDY0X3QgVmFsdWUpIHsKKyAgICBzd2l0Y2ggKFJlbCkgeworICAgIGNhc2UgRUxGOjpSX1BQQzY0X0FERFIzMjoKKyAgICAgIHJldHVybiAoVmFsdWUgKyBnZXRFTEZBZGRlbmQoUikpICYgMHhGRkZGRkZGRjsKKyAgICBjYXNlIEVMRjo6Ul9QUEM2NF9BRERSNjQ6CisgICAgICByZXR1cm4gVmFsdWUgKyBnZXRFTEZBZGRlbmQoUik7CisgICAgfQorICAgIEhhc0Vycm9yID0gdHJ1ZTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHVpbnQ2NF90IHZpc2l0U3lzdGVteih1aW50MzJfdCBSZWwsIFJlbG9jYXRpb25SZWYgUiwgdWludDY0X3QgVmFsdWUpIHsKKyAgICBzd2l0Y2ggKFJlbCkgeworICAgIGNhc2UgRUxGOjpSXzM5MF8zMjogeworICAgICAgaW50NjRfdCBSZXMgPSBWYWx1ZSArIGdldEVMRkFkZGVuZChSKTsKKyAgICAgIGlmIChSZXMgPCBJTlQzMl9NSU4gfHwgUmVzID4gVUlOVDMyX01BWCkKKyAgICAgICAgSGFzRXJyb3IgPSB0cnVlOworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihSZXMpOworICAgIH0KKyAgICBjYXNlIEVMRjo6Ul8zOTBfNjQ6CisgICAgICByZXR1cm4gVmFsdWUgKyBnZXRFTEZBZGRlbmQoUik7CisgICAgfQorICAgIEhhc0Vycm9yID0gdHJ1ZTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHVpbnQ2NF90IHZpc2l0U3BhcmM2NCh1aW50MzJfdCBSZWwsIFJlbG9jYXRpb25SZWYgUiwgdWludDY0X3QgVmFsdWUpIHsKKyAgICBzd2l0Y2ggKFJlbCkgeworICAgIGNhc2UgRUxGOjpSX1NQQVJDXzMyOgorICAgIGNhc2UgRUxGOjpSX1NQQVJDXzY0OgorICAgIGNhc2UgRUxGOjpSX1NQQVJDX1VBMzI6CisgICAgY2FzZSBFTEY6OlJfU1BBUkNfVUE2NDoKKyAgICAgIHJldHVybiBWYWx1ZSArIGdldEVMRkFkZGVuZChSKTsKKyAgICB9CisgICAgSGFzRXJyb3IgPSB0cnVlOworICAgIHJldHVybiAwOworICB9CisKKyAgdWludDY0X3QgdmlzaXRBbWRncHUodWludDMyX3QgUmVsLCBSZWxvY2F0aW9uUmVmIFIsIHVpbnQ2NF90IFZhbHVlKSB7CisgICAgc3dpdGNoIChSZWwpIHsKKyAgICBjYXNlIEVMRjo6Ul9BTURHUFVfQUJTMzI6CisgICAgY2FzZSBFTEY6OlJfQU1ER1BVX0FCUzY0OgorICAgICAgcmV0dXJuIFZhbHVlICsgZ2V0RUxGQWRkZW5kKFIpOworICAgIH0KKyAgICBIYXNFcnJvciA9IHRydWU7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB1aW50NjRfdCB2aXNpdFg4Nih1aW50MzJfdCBSZWwsIFJlbG9jYXRpb25SZWYgUiwgdWludDY0X3QgVmFsdWUpIHsKKyAgICBzd2l0Y2ggKFJlbCkgeworICAgIGNhc2UgRUxGOjpSXzM4Nl9OT05FOgorICAgICAgcmV0dXJuIDA7CisgICAgY2FzZSBFTEY6OlJfMzg2XzMyOgorICAgICAgcmV0dXJuIFZhbHVlOworICAgIGNhc2UgRUxGOjpSXzM4Nl9QQzMyOgorICAgICAgcmV0dXJuIFZhbHVlIC0gUi5nZXRPZmZzZXQoKTsKKyAgICB9CisgICAgSGFzRXJyb3IgPSB0cnVlOworICAgIHJldHVybiAwOworICB9CisKKyAgdWludDY0X3QgdmlzaXRQUEMzMih1aW50MzJfdCBSZWwsIFJlbG9jYXRpb25SZWYgUiwgdWludDY0X3QgVmFsdWUpIHsKKyAgICBpZiAoUmVsID09IEVMRjo6Ul9QUENfQUREUjMyKQorICAgICAgcmV0dXJuIChWYWx1ZSArIGdldEVMRkFkZGVuZChSKSkgJiAweEZGRkZGRkZGOworICAgIEhhc0Vycm9yID0gdHJ1ZTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHVpbnQ2NF90IHZpc2l0QVJNKHVpbnQzMl90IFJlbCwgUmVsb2NhdGlvblJlZiBSLCB1aW50NjRfdCBWYWx1ZSkgeworICAgIGlmIChSZWwgPT0gRUxGOjpSX0FSTV9BQlMzMikgeworICAgICAgaWYgKChpbnQ2NF90KVZhbHVlIDwgSU5UMzJfTUlOIHx8IChpbnQ2NF90KVZhbHVlID4gVUlOVDMyX01BWCkKKyAgICAgICAgSGFzRXJyb3IgPSB0cnVlOworICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihWYWx1ZSk7CisgICAgfQorICAgIEhhc0Vycm9yID0gdHJ1ZTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHVpbnQ2NF90IHZpc2l0TGFuYWkodWludDMyX3QgUmVsLCBSZWxvY2F0aW9uUmVmIFIsIHVpbnQ2NF90IFZhbHVlKSB7CisgICAgaWYgKFJlbCA9PSBFTEY6OlJfTEFOQUlfMzIpCisgICAgICByZXR1cm4gKFZhbHVlICsgZ2V0RUxGQWRkZW5kKFIpKSAmIDB4RkZGRkZGRkY7CisgICAgSGFzRXJyb3IgPSB0cnVlOworICAgIHJldHVybiAwOworICB9CisKKyAgdWludDY0X3QgdmlzaXRNaXBzMzIodWludDMyX3QgUmVsLCBSZWxvY2F0aW9uUmVmIFIsIHVpbnQ2NF90IFZhbHVlKSB7CisgICAgLy8gRklYTUU6IFRha2UgaW4gYWNjb3VudCBpbXBsaWNpdCBhZGRlbmRzIHRvIGdldCBjb3JyZWN0IHJlc3VsdHMuCisgICAgaWYgKFJlbCA9PSBFTEY6OlJfTUlQU18zMikKKyAgICAgIHJldHVybiBWYWx1ZSAmIDB4RkZGRkZGRkY7CisgICAgaWYgKFJlbCA9PSBFTEY6OlJfTUlQU19UTFNfRFRQUkVMMzIpCisgICAgICByZXR1cm4gVmFsdWUgJiAweEZGRkZGRkZGOworICAgIEhhc0Vycm9yID0gdHJ1ZTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIHVpbnQ2NF90IHZpc2l0U3BhcmMzMih1aW50MzJfdCBSZWwsIFJlbG9jYXRpb25SZWYgUiwgdWludDY0X3QgVmFsdWUpIHsKKyAgICBpZiAoUmVsID09IEVMRjo6Ul9TUEFSQ18zMiB8fCBSZWwgPT0gRUxGOjpSX1NQQVJDX1VBMzIpCisgICAgICByZXR1cm4gVmFsdWUgKyBnZXRFTEZBZGRlbmQoUik7CisgICAgSGFzRXJyb3IgPSB0cnVlOworICAgIHJldHVybiAwOworICB9CisKKyAgdWludDY0X3QgdmlzaXRIZXhhZ29uKHVpbnQzMl90IFJlbCwgUmVsb2NhdGlvblJlZiBSLCB1aW50NjRfdCBWYWx1ZSkgeworICAgIGlmIChSZWwgPT0gRUxGOjpSX0hFWF8zMikKKyAgICAgIHJldHVybiBWYWx1ZSArIGdldEVMRkFkZGVuZChSKTsKKyAgICBIYXNFcnJvciA9IHRydWU7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB1aW50NjRfdCB2aXNpdENPRkYodWludDMyX3QgUmVsLCBSZWxvY2F0aW9uUmVmIFIsIHVpbnQ2NF90IFZhbHVlKSB7CisgICAgc3dpdGNoIChPYmpUb1Zpc2l0LmdldEFyY2goKSkgeworICAgIGNhc2UgVHJpcGxlOjp4ODY6CisgICAgICBzd2l0Y2ggKFJlbCkgeworICAgICAgY2FzZSBDT0ZGOjpJTUFHRV9SRUxfSTM4Nl9TRUNSRUw6CisgICAgICBjYXNlIENPRkY6OklNQUdFX1JFTF9JMzg2X0RJUjMyOgorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFZhbHVlKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgVHJpcGxlOjp4ODZfNjQ6CisgICAgICBzd2l0Y2ggKFJlbCkgeworICAgICAgY2FzZSBDT0ZGOjpJTUFHRV9SRUxfQU1ENjRfU0VDUkVMOgorICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KFZhbHVlKTsKKyAgICAgIGNhc2UgQ09GRjo6SU1BR0VfUkVMX0FNRDY0X0FERFI2NDoKKyAgICAgICAgcmV0dXJuIFZhbHVlOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBIYXNFcnJvciA9IHRydWU7CisgICAgcmV0dXJuIDA7CisgIH0KKworICB1aW50NjRfdCB2aXNpdE1hY2hPKHVpbnQzMl90IFJlbCwgUmVsb2NhdGlvblJlZiBSLCB1aW50NjRfdCBWYWx1ZSkgeworICAgIGlmIChPYmpUb1Zpc2l0LmdldEFyY2goKSA9PSBUcmlwbGU6Ong4Nl82NCAmJgorICAgICAgICBSZWwgPT0gTWFjaE86Olg4Nl82NF9SRUxPQ19VTlNJR05FRCkKKyAgICAgIHJldHVybiBWYWx1ZTsKKyAgICBIYXNFcnJvciA9IHRydWU7CisgICAgcmV0dXJuIDA7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvYmplY3QKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX09CSkVDVF9SRUxPQ1ZJU0lUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvU3RhY2tNYXBQYXJzZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L1N0YWNrTWFwUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTU3ZGI1YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L1N0YWNrTWFwUGFyc2VyLmgKQEAgLTAsMCArMSw0MzkgQEAKKy8vPT09LSBTdGFja01hcFBhcnNlci5oIC0gU3RhY2tNYXAgUGFyc2luZyBTdXBwb3J0IC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9DT0RFR0VOX1NUQUNLTUFQUEFSU0VSX0gKKyNkZWZpbmUgTExWTV9DT0RFR0VOX1NUQUNLTUFQUEFSU0VSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDxzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbm5lc3M+CitjbGFzcyBTdGFja01hcFYyUGFyc2VyIHsKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEFjY2Vzc29yVD4KKyAgY2xhc3MgQWNjZXNzb3JJdGVyYXRvciB7CisgIHB1YmxpYzoKKyAgICBBY2Nlc3Nvckl0ZXJhdG9yKEFjY2Vzc29yVCBBKSA6IEEoQSkge30KKworICAgIEFjY2Vzc29ySXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7IEEgPSBBLm5leHQoKTsgcmV0dXJuICp0aGlzOyB9CisgICAgQWNjZXNzb3JJdGVyYXRvciBvcGVyYXRvcisrKGludCkgeworICAgICAgYXV0byB0bXAgPSAqdGhpczsKKyAgICAgICsrKnRoaXM7CisgICAgICByZXR1cm4gdG1wOworICAgIH0KKworICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBBY2Nlc3Nvckl0ZXJhdG9yICZPdGhlcikgeworICAgICAgcmV0dXJuIEEuUCA9PSBPdGhlci5BLlA7CisgICAgfQorCisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFjY2Vzc29ySXRlcmF0b3IgJk90aGVyKSB7IHJldHVybiAhKCp0aGlzID09IE90aGVyKTsgfQorCisgICAgQWNjZXNzb3JUJiBvcGVyYXRvciooKSB7IHJldHVybiBBOyB9CisgICAgQWNjZXNzb3JUKiBvcGVyYXRvci0+KCkgeyByZXR1cm4gJkE7IH0KKworICBwcml2YXRlOgorICAgIEFjY2Vzc29yVCBBOworICB9OworCisgIC8vLyBBY2Nlc3NvciBmb3IgZnVuY3Rpb24gcmVjb3Jkcy4KKyAgY2xhc3MgRnVuY3Rpb25BY2Nlc3NvciB7CisgICAgZnJpZW5kIGNsYXNzIFN0YWNrTWFwVjJQYXJzZXI7CisKKyAgcHVibGljOgorICAgIC8vLyBHZXQgdGhlIGZ1bmN0aW9uIGFkZHJlc3MuCisgICAgdWludDY0X3QgZ2V0RnVuY3Rpb25BZGRyZXNzKCkgY29uc3QgeworICAgICAgcmV0dXJuIHJlYWQ8dWludDY0X3Q+KFApOworICAgIH0KKworICAgIC8vLyBHZXQgdGhlIGZ1bmN0aW9uJ3Mgc3RhY2sgc2l6ZS4KKyAgICB1aW50NjRfdCBnZXRTdGFja1NpemUoKSBjb25zdCB7CisgICAgICByZXR1cm4gcmVhZDx1aW50NjRfdD4oUCArIHNpemVvZih1aW50NjRfdCkpOworICAgIH0KKworICAgIC8vLyBHZXQgdGhlIG51bWJlciBvZiBjYWxsc2l0ZSByZWNvcmRzLgorICAgIHVpbnQ2NF90IGdldFJlY29yZENvdW50KCkgY29uc3QgeworICAgICAgcmV0dXJuIHJlYWQ8dWludDY0X3Q+KFAgKyAoMiAqIHNpemVvZih1aW50NjRfdCkpKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBGdW5jdGlvbkFjY2Vzc29yKGNvbnN0IHVpbnQ4X3QgKlApIDogUChQKSB7fQorCisgICAgY29uc3Qgc3RhdGljIGludCBGdW5jdGlvbkFjY2Vzc29yU2l6ZSA9IDMgKiBzaXplb2YodWludDY0X3QpOworCisgICAgRnVuY3Rpb25BY2Nlc3NvciBuZXh0KCkgY29uc3QgeworICAgICAgcmV0dXJuIEZ1bmN0aW9uQWNjZXNzb3IoUCArIEZ1bmN0aW9uQWNjZXNzb3JTaXplKTsKKyAgICB9CisKKyAgICBjb25zdCB1aW50OF90ICpQOworICB9OworCisgIC8vLyBBY2Nlc3NvciBmb3IgY29uc3RhbnRzLgorICBjbGFzcyBDb25zdGFudEFjY2Vzc29yIHsKKyAgICBmcmllbmQgY2xhc3MgU3RhY2tNYXBWMlBhcnNlcjsKKworICBwdWJsaWM6CisgICAgLy8vIFJldHVybiB0aGUgdmFsdWUgb2YgdGhpcyBjb25zdGFudC4KKyAgICB1aW50NjRfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHJlYWQ8dWludDY0X3Q+KFApOyB9CisKKyAgcHJpdmF0ZToKKyAgICBDb25zdGFudEFjY2Vzc29yKGNvbnN0IHVpbnQ4X3QgKlApIDogUChQKSB7fQorCisgICAgY29uc3Qgc3RhdGljIGludCBDb25zdGFudEFjY2Vzc29yU2l6ZSA9IHNpemVvZih1aW50NjRfdCk7CisKKyAgICBDb25zdGFudEFjY2Vzc29yIG5leHQoKSBjb25zdCB7CisgICAgICByZXR1cm4gQ29uc3RhbnRBY2Nlc3NvcihQICsgQ29uc3RhbnRBY2Nlc3NvclNpemUpOworICAgIH0KKworICAgIGNvbnN0IHVpbnQ4X3QgKlA7CisgIH07CisKKyAgZW51bSBjbGFzcyBMb2NhdGlvbktpbmQgOiB1aW50OF90IHsKKyAgICBSZWdpc3RlciA9IDEsIERpcmVjdCA9IDIsIEluZGlyZWN0ID0gMywgQ29uc3RhbnQgPSA0LCBDb25zdGFudEluZGV4ID0gNQorICB9OworCisgIC8vLyBBY2Nlc3NvciBmb3IgbG9jYXRpb24gcmVjb3Jkcy4KKyAgY2xhc3MgTG9jYXRpb25BY2Nlc3NvciB7CisgICAgZnJpZW5kIGNsYXNzIFN0YWNrTWFwVjJQYXJzZXI7CisgICAgZnJpZW5kIGNsYXNzIFJlY29yZEFjY2Vzc29yOworCisgIHB1YmxpYzoKKyAgICAvLy8gR2V0IHRoZSBLaW5kIGZvciB0aGlzIGxvY2F0aW9uLgorICAgIExvY2F0aW9uS2luZCBnZXRLaW5kKCkgY29uc3QgeworICAgICAgcmV0dXJuIExvY2F0aW9uS2luZChQW0tpbmRPZmZzZXRdKTsKKyAgICB9CisKKyAgICAvLy8gR2V0IHRoZSBEd2FyZiByZWdpc3RlciBudW1iZXIgZm9yIHRoaXMgbG9jYXRpb24uCisgICAgdWludDE2X3QgZ2V0RHdhcmZSZWdOdW0oKSBjb25zdCB7CisgICAgICByZXR1cm4gcmVhZDx1aW50MTZfdD4oUCArIER3YXJmUmVnTnVtT2Zmc2V0KTsKKyAgICB9CisKKyAgICAvLy8gR2V0IHRoZSBzbWFsbC1jb25zdGFudCBmb3IgdGhpcyBsb2NhdGlvbi4gKEtpbmQgbXVzdCBiZSBDb25zdGFudCkuCisgICAgdWludDMyX3QgZ2V0U21hbGxDb25zdGFudCgpIGNvbnN0IHsKKyAgICAgIGFzc2VydChnZXRLaW5kKCkgPT0gTG9jYXRpb25LaW5kOjpDb25zdGFudCAmJiAiTm90IGEgc21hbGwgY29uc3RhbnQuIik7CisgICAgICByZXR1cm4gcmVhZDx1aW50MzJfdD4oUCArIFNtYWxsQ29uc3RhbnRPZmZzZXQpOworICAgIH0KKworICAgIC8vLyBHZXQgdGhlIGNvbnN0YW50LWluZGV4IGZvciB0aGlzIGxvY2F0aW9uLiAoS2luZCBtdXN0IGJlIENvbnN0YW50SW5kZXgpLgorICAgIHVpbnQzMl90IGdldENvbnN0YW50SW5kZXgoKSBjb25zdCB7CisgICAgICBhc3NlcnQoZ2V0S2luZCgpID09IExvY2F0aW9uS2luZDo6Q29uc3RhbnRJbmRleCAmJgorICAgICAgICAgICAgICJOb3QgYSBjb25zdGFudC1pbmRleC4iKTsKKyAgICAgIHJldHVybiByZWFkPHVpbnQzMl90PihQICsgU21hbGxDb25zdGFudE9mZnNldCk7CisgICAgfQorCisgICAgLy8vIEdldCB0aGUgb2Zmc2V0IGZvciB0aGlzIGxvY2F0aW9uLiAoS2luZCBtdXN0IGJlIERpcmVjdCBvciBJbmRpcmVjdCkuCisgICAgaW50MzJfdCBnZXRPZmZzZXQoKSBjb25zdCB7CisgICAgICBhc3NlcnQoKGdldEtpbmQoKSA9PSBMb2NhdGlvbktpbmQ6OkRpcmVjdCB8fAorICAgICAgICAgICAgICBnZXRLaW5kKCkgPT0gTG9jYXRpb25LaW5kOjpJbmRpcmVjdCkgJiYKKyAgICAgICAgICAgICAiTm90IGRpcmVjdCBvciBpbmRpcmVjdC4iKTsKKyAgICAgIHJldHVybiByZWFkPGludDMyX3Q+KFAgKyBTbWFsbENvbnN0YW50T2Zmc2V0KTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBMb2NhdGlvbkFjY2Vzc29yKGNvbnN0IHVpbnQ4X3QgKlApIDogUChQKSB7fQorCisgICAgTG9jYXRpb25BY2Nlc3NvciBuZXh0KCkgY29uc3QgeworICAgICAgcmV0dXJuIExvY2F0aW9uQWNjZXNzb3IoUCArIExvY2F0aW9uQWNjZXNzb3JTaXplKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgaW50IEtpbmRPZmZzZXQgPSAwOworICAgIHN0YXRpYyBjb25zdCBpbnQgRHdhcmZSZWdOdW1PZmZzZXQgPSBLaW5kT2Zmc2V0ICsgc2l6ZW9mKHVpbnQxNl90KTsKKyAgICBzdGF0aWMgY29uc3QgaW50IFNtYWxsQ29uc3RhbnRPZmZzZXQgPSBEd2FyZlJlZ051bU9mZnNldCArIHNpemVvZih1aW50MTZfdCk7CisgICAgc3RhdGljIGNvbnN0IGludCBMb2NhdGlvbkFjY2Vzc29yU2l6ZSA9IHNpemVvZih1aW50NjRfdCk7CisKKyAgICBjb25zdCB1aW50OF90ICpQOworICB9OworCisgIC8vLyBBY2Nlc3NvciBmb3Igc3RhY2ttYXAgbGl2ZS1vdXQgZmllbGRzLgorICBjbGFzcyBMaXZlT3V0QWNjZXNzb3IgeworICAgIGZyaWVuZCBjbGFzcyBTdGFja01hcFYyUGFyc2VyOworICAgIGZyaWVuZCBjbGFzcyBSZWNvcmRBY2Nlc3NvcjsKKworICBwdWJsaWM6CisgICAgLy8vIEdldCB0aGUgRHdhcmYgcmVnaXN0ZXIgbnVtYmVyIGZvciB0aGlzIGxpdmUtb3V0LgorICAgIHVpbnQxNl90IGdldER3YXJmUmVnTnVtKCkgY29uc3QgeworICAgICAgcmV0dXJuIHJlYWQ8dWludDE2X3Q+KFAgKyBEd2FyZlJlZ051bU9mZnNldCk7CisgICAgfQorCisgICAgLy8vIEdldCB0aGUgc2l6ZSBpbiBieXRlcyBvZiBsaXZlIFtzdWJdcmVnaXN0ZXIuCisgICAgdW5zaWduZWQgZ2V0U2l6ZUluQnl0ZXMoKSBjb25zdCB7CisgICAgICByZXR1cm4gcmVhZDx1aW50OF90PihQICsgU2l6ZU9mZnNldCk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgTGl2ZU91dEFjY2Vzc29yKGNvbnN0IHVpbnQ4X3QgKlApIDogUChQKSB7fQorCisgICAgTGl2ZU91dEFjY2Vzc29yIG5leHQoKSBjb25zdCB7CisgICAgICByZXR1cm4gTGl2ZU91dEFjY2Vzc29yKFAgKyBMaXZlT3V0QWNjZXNzb3JTaXplKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgaW50IER3YXJmUmVnTnVtT2Zmc2V0ID0gMDsKKyAgICBzdGF0aWMgY29uc3QgaW50IFNpemVPZmZzZXQgPQorICAgICAgRHdhcmZSZWdOdW1PZmZzZXQgKyBzaXplb2YodWludDE2X3QpICsgc2l6ZW9mKHVpbnQ4X3QpOworICAgIHN0YXRpYyBjb25zdCBpbnQgTGl2ZU91dEFjY2Vzc29yU2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CisKKyAgICBjb25zdCB1aW50OF90ICpQOworICB9OworCisgIC8vLyBBY2Nlc3NvciBmb3Igc3RhY2ttYXAgcmVjb3Jkcy4KKyAgY2xhc3MgUmVjb3JkQWNjZXNzb3IgeworICAgIGZyaWVuZCBjbGFzcyBTdGFja01hcFYyUGFyc2VyOworCisgIHB1YmxpYzoKKyAgICB1c2luZyBsb2NhdGlvbl9pdGVyYXRvciA9IEFjY2Vzc29ySXRlcmF0b3I8TG9jYXRpb25BY2Nlc3Nvcj47CisgICAgdXNpbmcgbGl2ZW91dF9pdGVyYXRvciA9IEFjY2Vzc29ySXRlcmF0b3I8TGl2ZU91dEFjY2Vzc29yPjsKKworICAgIC8vLyBHZXQgdGhlIHBhdGNocG9pbnQvc3RhY2ttYXAgSUQgZm9yIHRoaXMgcmVjb3JkLgorICAgIHVpbnQ2NF90IGdldElEKCkgY29uc3QgeworICAgICAgcmV0dXJuIHJlYWQ8dWludDY0X3Q+KFAgKyBQYXRjaHBvaW50SURPZmZzZXQpOworICAgIH0KKworICAgIC8vLyBHZXQgdGhlIGluc3RydWN0aW9uIG9mZnNldCAoZnJvbSB0aGUgc3RhcnQgb2YgdGhlIGNvbnRhaW5pbmcgZnVuY3Rpb24pCisgICAgLy8vIGZvciB0aGlzIHJlY29yZC4KKyAgICB1aW50MzJfdCBnZXRJbnN0cnVjdGlvbk9mZnNldCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiByZWFkPHVpbnQzMl90PihQICsgSW5zdHJ1Y3Rpb25PZmZzZXRPZmZzZXQpOworICAgIH0KKworICAgIC8vLyBHZXQgdGhlIG51bWJlciBvZiBsb2NhdGlvbnMgY29udGFpbmVkIGluIHRoaXMgcmVjb3JkLgorICAgIHVpbnQxNl90IGdldE51bUxvY2F0aW9ucygpIGNvbnN0IHsKKyAgICAgIHJldHVybiByZWFkPHVpbnQxNl90PihQICsgTnVtTG9jYXRpb25zT2Zmc2V0KTsKKyAgICB9CisKKyAgICAvLy8gR2V0IHRoZSBsb2NhdGlvbiB3aXRoIHRoZSBnaXZlbiBpbmRleC4KKyAgICBMb2NhdGlvbkFjY2Vzc29yIGdldExvY2F0aW9uKHVuc2lnbmVkIExvY2F0aW9uSW5kZXgpIGNvbnN0IHsKKyAgICAgIHVuc2lnbmVkIExvY2F0aW9uT2Zmc2V0ID0KKyAgICAgICAgTG9jYXRpb25MaXN0T2Zmc2V0ICsgTG9jYXRpb25JbmRleCAqIExvY2F0aW9uU2l6ZTsKKyAgICAgIHJldHVybiBMb2NhdGlvbkFjY2Vzc29yKFAgKyBMb2NhdGlvbk9mZnNldCk7CisgICAgfQorCisgICAgLy8vIEJlZ2luIGl0ZXJhdG9yIGZvciBsb2NhdGlvbnMuCisgICAgbG9jYXRpb25faXRlcmF0b3IgbG9jYXRpb25fYmVnaW4oKSBjb25zdCB7CisgICAgICByZXR1cm4gbG9jYXRpb25faXRlcmF0b3IoZ2V0TG9jYXRpb24oMCkpOworICAgIH0KKworICAgIC8vLyBFbmQgaXRlcmF0b3IgZm9yIGxvY2F0aW9ucy4KKyAgICBsb2NhdGlvbl9pdGVyYXRvciBsb2NhdGlvbl9lbmQoKSBjb25zdCB7CisgICAgICByZXR1cm4gbG9jYXRpb25faXRlcmF0b3IoZ2V0TG9jYXRpb24oZ2V0TnVtTG9jYXRpb25zKCkpKTsKKyAgICB9CisKKyAgICAvLy8gSXRlcmF0b3IgcmFuZ2UgZm9yIGxvY2F0aW9ucy4KKyAgICBpdGVyYXRvcl9yYW5nZTxsb2NhdGlvbl9pdGVyYXRvcj4gbG9jYXRpb25zKCkgY29uc3QgeworICAgICAgcmV0dXJuIG1ha2VfcmFuZ2UobG9jYXRpb25fYmVnaW4oKSwgbG9jYXRpb25fZW5kKCkpOworICAgIH0KKworICAgIC8vLyBHZXQgdGhlIG51bWJlciBvZiBsaXZlb3V0cyBjb250YWluZWQgaW4gdGhpcyByZWNvcmQuCisgICAgdWludDE2X3QgZ2V0TnVtTGl2ZU91dHMoKSBjb25zdCB7CisgICAgICByZXR1cm4gcmVhZDx1aW50MTZfdD4oUCArIGdldE51bUxpdmVPdXRzT2Zmc2V0KCkpOworICAgIH0KKworICAgIC8vLyBHZXQgdGhlIGxpdmUtb3V0IHdpdGggdGhlIGdpdmVuIGluZGV4LgorICAgIExpdmVPdXRBY2Nlc3NvciBnZXRMaXZlT3V0KHVuc2lnbmVkIExpdmVPdXRJbmRleCkgY29uc3QgeworICAgICAgdW5zaWduZWQgTGl2ZU91dE9mZnNldCA9CisgICAgICAgIGdldE51bUxpdmVPdXRzT2Zmc2V0KCkgKyBzaXplb2YodWludDE2X3QpICsgTGl2ZU91dEluZGV4ICogTGl2ZU91dFNpemU7CisgICAgICByZXR1cm4gTGl2ZU91dEFjY2Vzc29yKFAgKyBMaXZlT3V0T2Zmc2V0KTsKKyAgICB9CisKKyAgICAvLy8gQmVnaW4gaXRlcmF0b3IgZm9yIGxpdmUtb3V0cy4KKyAgICBsaXZlb3V0X2l0ZXJhdG9yIGxpdmVvdXRzX2JlZ2luKCkgY29uc3QgeworICAgICAgcmV0dXJuIGxpdmVvdXRfaXRlcmF0b3IoZ2V0TGl2ZU91dCgwKSk7CisgICAgfQorCisgICAgLy8vIEVuZCBpdGVyYXRvciBmb3IgbGl2ZS1vdXRzLgorICAgIGxpdmVvdXRfaXRlcmF0b3IgbGl2ZW91dHNfZW5kKCkgY29uc3QgeworICAgICAgcmV0dXJuIGxpdmVvdXRfaXRlcmF0b3IoZ2V0TGl2ZU91dChnZXROdW1MaXZlT3V0cygpKSk7CisgICAgfQorCisgICAgLy8vIEl0ZXJhdG9yIHJhbmdlIGZvciBsaXZlLW91dHMuCisgICAgaXRlcmF0b3JfcmFuZ2U8bGl2ZW91dF9pdGVyYXRvcj4gbGl2ZW91dHMoKSBjb25zdCB7CisgICAgICByZXR1cm4gbWFrZV9yYW5nZShsaXZlb3V0c19iZWdpbigpLCBsaXZlb3V0c19lbmQoKSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgUmVjb3JkQWNjZXNzb3IoY29uc3QgdWludDhfdCAqUCkgOiBQKFApIHt9CisKKyAgICB1bnNpZ25lZCBnZXROdW1MaXZlT3V0c09mZnNldCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBMb2NhdGlvbkxpc3RPZmZzZXQgKyBMb2NhdGlvblNpemUgKiBnZXROdW1Mb2NhdGlvbnMoKSArCisgICAgICAgICAgICAgc2l6ZW9mKHVpbnQxNl90KTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBnZXRTaXplSW5CeXRlcygpIGNvbnN0IHsKKyAgICAgIHVuc2lnbmVkIFJlY29yZFNpemUgPQorICAgICAgICBnZXROdW1MaXZlT3V0c09mZnNldCgpICsgc2l6ZW9mKHVpbnQxNl90KSArIGdldE51bUxpdmVPdXRzKCkgKiBMaXZlT3V0U2l6ZTsKKyAgICAgIHJldHVybiAoUmVjb3JkU2l6ZSArIDcpICYgfjB4NzsKKyAgICB9CisKKyAgICBSZWNvcmRBY2Nlc3NvciBuZXh0KCkgY29uc3QgeworICAgICAgcmV0dXJuIFJlY29yZEFjY2Vzc29yKFAgKyBnZXRTaXplSW5CeXRlcygpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgUGF0Y2hwb2ludElET2Zmc2V0ID0gMDsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgSW5zdHJ1Y3Rpb25PZmZzZXRPZmZzZXQgPQorICAgICAgUGF0Y2hwb2ludElET2Zmc2V0ICsgc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgTnVtTG9jYXRpb25zT2Zmc2V0ID0KKyAgICAgIEluc3RydWN0aW9uT2Zmc2V0T2Zmc2V0ICsgc2l6ZW9mKHVpbnQzMl90KSArIHNpemVvZih1aW50MTZfdCk7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIExvY2F0aW9uTGlzdE9mZnNldCA9CisgICAgICBOdW1Mb2NhdGlvbnNPZmZzZXQgKyBzaXplb2YodWludDE2X3QpOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBMb2NhdGlvblNpemUgPSBzaXplb2YodWludDY0X3QpOworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBMaXZlT3V0U2l6ZSA9IHNpemVvZih1aW50MzJfdCk7CisKKyAgICBjb25zdCB1aW50OF90ICpQOworICB9OworCisgIC8vLyBDb25zdHJ1Y3QgYSBwYXJzZXIgZm9yIGEgdmVyc2lvbi0yIHN0YWNrbWFwLiBTdGFja01hcCBkYXRhIHdpbGwgYmUgcmVhZAorICAvLy8gZnJvbSB0aGUgZ2l2ZW4gYXJyYXkuCisgIFN0YWNrTWFwVjJQYXJzZXIoQXJyYXlSZWY8dWludDhfdD4gU3RhY2tNYXBTZWN0aW9uKQorICAgICAgOiBTdGFja01hcFNlY3Rpb24oU3RhY2tNYXBTZWN0aW9uKSB7CisgICAgQ29uc3RhbnRzTGlzdE9mZnNldCA9IEZ1bmN0aW9uTGlzdE9mZnNldCArIGdldE51bUZ1bmN0aW9ucygpICogRnVuY3Rpb25TaXplOworCisgICAgYXNzZXJ0KFN0YWNrTWFwU2VjdGlvblswXSA9PSAyICYmCisgICAgICAgICAgICJTdGFja01hcFYyUGFyc2VyIGNhbiBvbmx5IHBhcnNlIHZlcnNpb24gMiBzdGFja21hcHMiKTsKKworICAgIHVuc2lnbmVkIEN1cnJlbnRSZWNvcmRPZmZzZXQgPQorICAgICAgQ29uc3RhbnRzTGlzdE9mZnNldCArIGdldE51bUNvbnN0YW50cygpICogQ29uc3RhbnRTaXplOworCisgICAgZm9yICh1bnNpZ25lZCBJID0gMCwgRSA9IGdldE51bVJlY29yZHMoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIFN0YWNrTWFwUmVjb3JkT2Zmc2V0cy5wdXNoX2JhY2soQ3VycmVudFJlY29yZE9mZnNldCk7CisgICAgICBDdXJyZW50UmVjb3JkT2Zmc2V0ICs9CisgICAgICAgIFJlY29yZEFjY2Vzc29yKCZTdGFja01hcFNlY3Rpb25bQ3VycmVudFJlY29yZE9mZnNldF0pLmdldFNpemVJbkJ5dGVzKCk7CisgICAgfQorICB9CisKKyAgdXNpbmcgZnVuY3Rpb25faXRlcmF0b3IgPSBBY2Nlc3Nvckl0ZXJhdG9yPEZ1bmN0aW9uQWNjZXNzb3I+OworICB1c2luZyBjb25zdGFudF9pdGVyYXRvciA9IEFjY2Vzc29ySXRlcmF0b3I8Q29uc3RhbnRBY2Nlc3Nvcj47CisgIHVzaW5nIHJlY29yZF9pdGVyYXRvciA9IEFjY2Vzc29ySXRlcmF0b3I8UmVjb3JkQWNjZXNzb3I+OworCisgIC8vLyBHZXQgdGhlIHZlcnNpb24gbnVtYmVyIG9mIHRoaXMgc3RhY2ttYXAuIChBbHdheXMgcmV0dXJucyAyKS4KKyAgdW5zaWduZWQgZ2V0VmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIDI7IH0KKworICAvLy8gR2V0IHRoZSBudW1iZXIgb2YgZnVuY3Rpb25zIGluIHRoZSBzdGFjayBtYXAuCisgIHVpbnQzMl90IGdldE51bUZ1bmN0aW9ucygpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVhZDx1aW50MzJfdD4oJlN0YWNrTWFwU2VjdGlvbltOdW1GdW5jdGlvbnNPZmZzZXRdKTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIG51bWJlciBvZiBsYXJnZSBjb25zdGFudHMgaW4gdGhlIHN0YWNrIG1hcC4KKyAgdWludDMyX3QgZ2V0TnVtQ29uc3RhbnRzKCkgY29uc3QgeworICAgIHJldHVybiByZWFkPHVpbnQzMl90PigmU3RhY2tNYXBTZWN0aW9uW051bUNvbnN0YW50c09mZnNldF0pOworICB9CisKKyAgLy8vIEdldCB0aGUgbnVtYmVyIG9mIHN0YWNrbWFwIHJlY29yZHMgaW4gdGhlIHN0YWNrbWFwLgorICB1aW50MzJfdCBnZXROdW1SZWNvcmRzKCkgY29uc3QgeworICAgIHJldHVybiByZWFkPHVpbnQzMl90PigmU3RhY2tNYXBTZWN0aW9uW051bVJlY29yZHNPZmZzZXRdKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYW4gRnVuY3Rpb25BY2Nlc3NvciBmb3IgdGhlIGdpdmVuIGZ1bmN0aW9uIGluZGV4LgorICBGdW5jdGlvbkFjY2Vzc29yIGdldEZ1bmN0aW9uKHVuc2lnbmVkIEZ1bmN0aW9uSW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gRnVuY3Rpb25BY2Nlc3NvcihTdGFja01hcFNlY3Rpb24uZGF0YSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGdW5jdGlvbk9mZnNldChGdW5jdGlvbkluZGV4KSk7CisgIH0KKworICAvLy8gQmVnaW4gaXRlcmF0b3IgZm9yIGZ1bmN0aW9ucy4KKyAgZnVuY3Rpb25faXRlcmF0b3IgZnVuY3Rpb25zX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBmdW5jdGlvbl9pdGVyYXRvcihnZXRGdW5jdGlvbigwKSk7CisgIH0KKworICAvLy8gRW5kIGl0ZXJhdG9yIGZvciBmdW5jdGlvbnMuCisgIGZ1bmN0aW9uX2l0ZXJhdG9yIGZ1bmN0aW9uc19lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGZ1bmN0aW9uX2l0ZXJhdG9yKAorICAgICAgICAgICAgIEZ1bmN0aW9uQWNjZXNzb3IoU3RhY2tNYXBTZWN0aW9uLmRhdGEoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRGdW5jdGlvbk9mZnNldChnZXROdW1GdW5jdGlvbnMoKSkpKTsKKyAgfQorCisgIC8vLyBJdGVyYXRvciByYW5nZSBmb3IgZnVuY3Rpb25zLgorICBpdGVyYXRvcl9yYW5nZTxmdW5jdGlvbl9pdGVyYXRvcj4gZnVuY3Rpb25zKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGZ1bmN0aW9uc19iZWdpbigpLCBmdW5jdGlvbnNfZW5kKCkpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgbGFyZ2UgY29uc3RhbnQgYXQgdGhlIGdpdmVuIGluZGV4LgorICBDb25zdGFudEFjY2Vzc29yIGdldENvbnN0YW50KHVuc2lnbmVkIENvbnN0YW50SW5kZXgpIGNvbnN0IHsKKyAgICByZXR1cm4gQ29uc3RhbnRBY2Nlc3NvcihTdGFja01hcFNlY3Rpb24uZGF0YSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb25zdGFudE9mZnNldChDb25zdGFudEluZGV4KSk7CisgIH0KKworICAvLy8gQmVnaW4gaXRlcmF0b3IgZm9yIGNvbnN0YW50cy4KKyAgY29uc3RhbnRfaXRlcmF0b3IgY29uc3RhbnRzX2JlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdGFudF9pdGVyYXRvcihnZXRDb25zdGFudCgwKSk7CisgIH0KKworICAvLy8gRW5kIGl0ZXJhdG9yIGZvciBjb25zdGFudHMuCisgIGNvbnN0YW50X2l0ZXJhdG9yIGNvbnN0YW50c19lbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0YW50X2l0ZXJhdG9yKAorICAgICAgICAgICAgIENvbnN0YW50QWNjZXNzb3IoU3RhY2tNYXBTZWN0aW9uLmRhdGEoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRDb25zdGFudE9mZnNldChnZXROdW1Db25zdGFudHMoKSkpKTsKKyAgfQorCisgIC8vLyBJdGVyYXRvciByYW5nZSBmb3IgY29uc3RhbnRzLgorICBpdGVyYXRvcl9yYW5nZTxjb25zdGFudF9pdGVyYXRvcj4gY29uc3RhbnRzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKGNvbnN0YW50c19iZWdpbigpLCBjb25zdGFudHNfZW5kKCkpOworICB9CisKKyAgLy8vIFJldHVybiBhIFJlY29yZEFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gcmVjb3JkIGluZGV4LgorICBSZWNvcmRBY2Nlc3NvciBnZXRSZWNvcmQodW5zaWduZWQgUmVjb3JkSW5kZXgpIGNvbnN0IHsKKyAgICBzdGQ6OnNpemVfdCBSZWNvcmRPZmZzZXQgPSBTdGFja01hcFJlY29yZE9mZnNldHNbUmVjb3JkSW5kZXhdOworICAgIHJldHVybiBSZWNvcmRBY2Nlc3NvcihTdGFja01hcFNlY3Rpb24uZGF0YSgpICsgUmVjb3JkT2Zmc2V0KTsKKyAgfQorCisgIC8vLyBCZWdpbiBpdGVyYXRvciBmb3IgcmVjb3Jkcy4KKyAgcmVjb3JkX2l0ZXJhdG9yIHJlY29yZHNfYmVnaW4oKSBjb25zdCB7CisgICAgaWYgKGdldE51bVJlY29yZHMoKSA9PSAwKQorICAgICAgcmV0dXJuIHJlY29yZF9pdGVyYXRvcihSZWNvcmRBY2Nlc3NvcihudWxscHRyKSk7CisgICAgcmV0dXJuIHJlY29yZF9pdGVyYXRvcihnZXRSZWNvcmQoMCkpOworICB9CisKKyAgLy8vIEVuZCBpdGVyYXRvciBmb3IgcmVjb3Jkcy4KKyAgcmVjb3JkX2l0ZXJhdG9yIHJlY29yZHNfZW5kKCkgY29uc3QgeworICAgIC8vIFJlY29yZHMgbmVlZCB0byBiZSBoYW5kbGVkIHNwZWNpYWxseSwgc2luY2Ugd2UgY2FjaGUgdGhlIHN0YXJ0IGFkZHJlc3NlcworICAgIC8vIGZvciB0aGVtOiBXZSBjYW4ndCBqdXN0IGNvbXB1dGUgdGhlIDEtcGFzdC10aGUtZW5kIGFkZHJlc3MsIHdlIGhhdmUgdG8KKyAgICAvLyBsb29rIGF0IHRoZSBsYXN0IHJlY29yZCBhbmQgdXNlIHRoZSAnbmV4dCcgbWV0aG9kLgorICAgIGlmIChnZXROdW1SZWNvcmRzKCkgPT0gMCkKKyAgICAgIHJldHVybiByZWNvcmRfaXRlcmF0b3IoUmVjb3JkQWNjZXNzb3IobnVsbHB0cikpOworICAgIHJldHVybiByZWNvcmRfaXRlcmF0b3IoZ2V0UmVjb3JkKGdldE51bVJlY29yZHMoKSAtIDEpLm5leHQoKSk7CisgIH0KKworICAvLy8gSXRlcmF0b3IgcmFuZ2UgZm9yIHJlY29yZHMuCisgIGl0ZXJhdG9yX3JhbmdlPHJlY29yZF9pdGVyYXRvcj4gcmVjb3JkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShyZWNvcmRzX2JlZ2luKCksIHJlY29yZHNfZW5kKCkpOworICB9CisKK3ByaXZhdGU6CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgVCByZWFkKGNvbnN0IHVpbnQ4X3QgKlApIHsKKyAgICByZXR1cm4gc3VwcG9ydDo6ZW5kaWFuOjpyZWFkPFQsIEVuZGlhbm5lc3MsIDE+KFApOworICB9CisKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEhlYWRlck9mZnNldCA9IDA7CisgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBOdW1GdW5jdGlvbnNPZmZzZXQgPSBIZWFkZXJPZmZzZXQgKyBzaXplb2YodWludDMyX3QpOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgTnVtQ29uc3RhbnRzT2Zmc2V0ID0gTnVtRnVuY3Rpb25zT2Zmc2V0ICsgc2l6ZW9mKHVpbnQzMl90KTsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIE51bVJlY29yZHNPZmZzZXQgPSBOdW1Db25zdGFudHNPZmZzZXQgKyBzaXplb2YodWludDMyX3QpOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgRnVuY3Rpb25MaXN0T2Zmc2V0ID0gTnVtUmVjb3Jkc09mZnNldCArIHNpemVvZih1aW50MzJfdCk7CisKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEZ1bmN0aW9uU2l6ZSA9IDMgKiBzaXplb2YodWludDY0X3QpOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgQ29uc3RhbnRTaXplID0gc2l6ZW9mKHVpbnQ2NF90KTsKKworICBzdGQ6OnNpemVfdCBnZXRGdW5jdGlvbk9mZnNldCh1bnNpZ25lZCBGdW5jdGlvbkluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIEZ1bmN0aW9uTGlzdE9mZnNldCArIEZ1bmN0aW9uSW5kZXggKiBGdW5jdGlvblNpemU7CisgIH0KKworICBzdGQ6OnNpemVfdCBnZXRDb25zdGFudE9mZnNldCh1bnNpZ25lZCBDb25zdGFudEluZGV4KSBjb25zdCB7CisgICAgcmV0dXJuIENvbnN0YW50c0xpc3RPZmZzZXQgKyBDb25zdGFudEluZGV4ICogQ29uc3RhbnRTaXplOworICB9CisKKyAgQXJyYXlSZWY8dWludDhfdD4gU3RhY2tNYXBTZWN0aW9uOworICB1bnNpZ25lZCBDb25zdGFudHNMaXN0T2Zmc2V0OworICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gU3RhY2tNYXBSZWNvcmRPZmZzZXRzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9TVEFDS01BUFBBUlNFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9TeW1ib2xTaXplLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9TeW1ib2xTaXplLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWExZGM4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L1N5bWJvbFNpemUuaApAQCAtMCwwICsxLDM0IEBACisvLz09PS0gU3ltYm9sU2l6ZS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVF9TWU1CT0xTSVpFX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RfU1lNQk9MU0laRV9ICisKKyNpbmNsdWRlICJsbHZtL09iamVjdC9PYmplY3RGaWxlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBvYmplY3QgeworCitzdHJ1Y3QgU3ltRW50cnkgeworICBzeW1ib2xfaXRlcmF0b3IgSTsKKyAgdWludDY0X3QgQWRkcmVzczsKKyAgdW5zaWduZWQgTnVtYmVyOworICB1bnNpZ25lZCBTZWN0aW9uSUQ7Cit9OworCitpbnQgY29tcGFyZUFkZHJlc3MoY29uc3QgU3ltRW50cnkgKkEsIGNvbnN0IFN5bUVudHJ5ICpCKTsKKworc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPFN5bWJvbFJlZiwgdWludDY0X3Q+PgorY29tcHV0ZVN5bWJvbFNpemVzKGNvbnN0IE9iamVjdEZpbGUgJk8pOworCit9Cit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvU3ltYm9saWNGaWxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9TeW1ib2xpY0ZpbGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Yjk1NDliCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvU3ltYm9saWNGaWxlLmgKQEAgLTAsMCArMSwyMTYgQEAKKy8vPT09LSBTeW1ib2xpY0ZpbGUuaCAtIEludGVyZmFjZSB0aGF0IG9ubHkgcHJvdmlkZXMgc3ltYm9scyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBTeW1ib2xpY0ZpbGUgaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RfU1lNQk9MSUNGSUxFX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RfU1lNQk9MSUNGSUxFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvTWFnaWMuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9CaW5hcnkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRmlsZVN5c3RlbS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSA8Y2ludHR5cGVzPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugb2JqZWN0IHsKKwordW5pb24gRGF0YVJlZkltcGwgeworICAvLyBUaGlzIGVudGlyZSB1bmlvbiBzaG91bGQgcHJvYmFibHkgYmUgYQorICAvLyBjaGFyW21heCg4LCBzaXplb2YodWludHB0cl90KSldIGFuZCByZXF1aXJlIHRoZSBpbXBsIHRvIGNhc3QuCisgIHN0cnVjdCB7CisgICAgdWludDMyX3QgYSwgYjsKKyAgfSBkOworICB1aW50cHRyX3QgcDsKKworICBEYXRhUmVmSW1wbCgpIHsgc3RkOjptZW1zZXQodGhpcywgMCwgc2l6ZW9mKERhdGFSZWZJbXBsKSk7IH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBPU3RyZWFtPgorT1N0cmVhbSYgb3BlcmF0b3I8PChPU3RyZWFtICZPUywgY29uc3QgRGF0YVJlZkltcGwgJkQpIHsKKyAgT1MgPDwgIigiIDw8IGZvcm1hdCgiMHglMDgiIFBSSXhQVFIsIEQucCkgPDwgIiAoIiA8PCBmb3JtYXQoIjB4JTA4eCIsIEQuZC5hKQorICAgICA8PCAiLCAiIDw8IGZvcm1hdCgiMHglMDh4IiwgRC5kLmIpIDw8ICIpKSI7CisgIHJldHVybiBPUzsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBEYXRhUmVmSW1wbCAmYSwgY29uc3QgRGF0YVJlZkltcGwgJmIpIHsKKyAgLy8gQ2hlY2sgYml0d2lzZSBpZGVudGljYWwuIFRoaXMgaXMgdGhlIG9ubHkgbGVnYWwgd2F5IHRvIGNvbXBhcmUgYSB1bmlvbiB3L28KKyAgLy8ga25vd2luZyB3aGljaCBtZW1iZXIgaXMgaW4gdXNlLgorICByZXR1cm4gc3RkOjptZW1jbXAoJmEsICZiLCBzaXplb2YoRGF0YVJlZkltcGwpKSA9PSAwOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvciE9KGNvbnN0IERhdGFSZWZJbXBsICZhLCBjb25zdCBEYXRhUmVmSW1wbCAmYikgeworICByZXR1cm4gIW9wZXJhdG9yPT0oYSwgYik7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChjb25zdCBEYXRhUmVmSW1wbCAmYSwgY29uc3QgRGF0YVJlZkltcGwgJmIpIHsKKyAgLy8gQ2hlY2sgYml0d2lzZSBpZGVudGljYWwuIFRoaXMgaXMgdGhlIG9ubHkgbGVnYWwgd2F5IHRvIGNvbXBhcmUgYSB1bmlvbiB3L28KKyAgLy8ga25vd2luZyB3aGljaCBtZW1iZXIgaXMgaW4gdXNlLgorICByZXR1cm4gc3RkOjptZW1jbXAoJmEsICZiLCBzaXplb2YoRGF0YVJlZkltcGwpKSA8IDA7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBjb250ZW50X3R5cGU+CitjbGFzcyBjb250ZW50X2l0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBjb250ZW50X3R5cGU+IHsKKyAgY29udGVudF90eXBlIEN1cnJlbnQ7CisKK3B1YmxpYzoKKyAgY29udGVudF9pdGVyYXRvcihjb250ZW50X3R5cGUgc3ltYikgOiBDdXJyZW50KHN0ZDo6bW92ZShzeW1iKSkge30KKworICBjb25zdCBjb250ZW50X3R5cGUgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmQ3VycmVudDsgfQorCisgIGNvbnN0IGNvbnRlbnRfdHlwZSAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gQ3VycmVudDsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBjb250ZW50X2l0ZXJhdG9yICZvdGhlcikgY29uc3QgeworICAgIHJldHVybiBDdXJyZW50ID09IG90aGVyLkN1cnJlbnQ7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgY29udGVudF9pdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7CisgIH0KKworICBjb250ZW50X2l0ZXJhdG9yICZvcGVyYXRvcisrKCkgeyAvLyBwcmVpbmNyZW1lbnQKKyAgICBDdXJyZW50Lm1vdmVOZXh0KCk7CisgICAgcmV0dXJuICp0aGlzOworICB9Cit9OworCitjbGFzcyBTeW1ib2xpY0ZpbGU7CisKKy8vLyBUaGlzIGlzIGEgdmFsdWUgdHlwZSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgYSBzaW5nbGUgc3ltYm9sIGluIHRoZSBsaXN0IG9mCisvLy8gc3ltYm9scyBpbiB0aGUgb2JqZWN0IGZpbGUuCitjbGFzcyBCYXNpY1N5bWJvbFJlZiB7CisgIERhdGFSZWZJbXBsIFN5bWJvbFBpbXBsOworICBjb25zdCBTeW1ib2xpY0ZpbGUgKk93bmluZ09iamVjdCA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgZW51bSBGbGFncyA6IHVuc2lnbmVkIHsKKyAgICBTRl9Ob25lID0gMCwKKyAgICBTRl9VbmRlZmluZWQgPSAxVSA8PCAwLCAgICAgIC8vIFN5bWJvbCBpcyBkZWZpbmVkIGluIGFub3RoZXIgb2JqZWN0IGZpbGUKKyAgICBTRl9HbG9iYWwgPSAxVSA8PCAxLCAgICAgICAgIC8vIEdsb2JhbCBzeW1ib2wKKyAgICBTRl9XZWFrID0gMVUgPDwgMiwgICAgICAgICAgIC8vIFdlYWsgc3ltYm9sCisgICAgU0ZfQWJzb2x1dGUgPSAxVSA8PCAzLCAgICAgICAvLyBBYnNvbHV0ZSBzeW1ib2wKKyAgICBTRl9Db21tb24gPSAxVSA8PCA0LCAgICAgICAgIC8vIFN5bWJvbCBoYXMgY29tbW9uIGxpbmthZ2UKKyAgICBTRl9JbmRpcmVjdCA9IDFVIDw8IDUsICAgICAgIC8vIFN5bWJvbCBpcyBhbiBhbGlhcyB0byBhbm90aGVyIHN5bWJvbAorICAgIFNGX0V4cG9ydGVkID0gMVUgPDwgNiwgICAgICAgLy8gU3ltYm9sIGlzIHZpc2libGUgdG8gb3RoZXIgRFNPcworICAgIFNGX0Zvcm1hdFNwZWNpZmljID0gMVUgPDwgNywgLy8gU3BlY2lmaWMgdG8gdGhlIG9iamVjdCBmaWxlIGZvcm1hdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGUuZy4gc2VjdGlvbiBzeW1ib2xzKQorICAgIFNGX1RodW1iID0gMVUgPDwgOCwgICAgICAgICAgLy8gVGh1bWIgc3ltYm9sIGluIGEgMzItYml0IEFSTSBiaW5hcnkKKyAgICBTRl9IaWRkZW4gPSAxVSA8PCA5LCAgICAgICAgIC8vIFN5bWJvbCBoYXMgaGlkZGVuIHZpc2liaWxpdHkKKyAgICBTRl9Db25zdCA9IDFVIDw8IDEwLCAgICAgICAgIC8vIFN5bWJvbCB2YWx1ZSBpcyBjb25zdGFudAorICAgIFNGX0V4ZWN1dGFibGUgPSAxVSA8PCAxMSwgICAgLy8gU3ltYm9sIHBvaW50cyB0byBhbiBleGVjdXRhYmxlIHNlY3Rpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIChJUiBvbmx5KQorICB9OworCisgIEJhc2ljU3ltYm9sUmVmKCkgPSBkZWZhdWx0OworICBCYXNpY1N5bWJvbFJlZihEYXRhUmVmSW1wbCBTeW1ib2xQLCBjb25zdCBTeW1ib2xpY0ZpbGUgKk93bmVyKTsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgQmFzaWNTeW1ib2xSZWYgJk90aGVyKSBjb25zdDsKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQmFzaWNTeW1ib2xSZWYgJk90aGVyKSBjb25zdDsKKworICB2b2lkIG1vdmVOZXh0KCk7CisKKyAgc3RkOjplcnJvcl9jb2RlIHByaW50TmFtZShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIC8vLyBHZXQgc3ltYm9sIGZsYWdzIChiaXR3aXNlIE9SIG9mIFN5bWJvbFJlZjo6RmxhZ3MpCisgIHVpbnQzMl90IGdldEZsYWdzKCkgY29uc3Q7CisKKyAgRGF0YVJlZkltcGwgZ2V0UmF3RGF0YVJlZkltcGwoKSBjb25zdDsKKyAgY29uc3QgU3ltYm9saWNGaWxlICpnZXRPYmplY3QoKSBjb25zdDsKK307CisKK3VzaW5nIGJhc2ljX3N5bWJvbF9pdGVyYXRvciA9IGNvbnRlbnRfaXRlcmF0b3I8QmFzaWNTeW1ib2xSZWY+OworCitjbGFzcyBTeW1ib2xpY0ZpbGUgOiBwdWJsaWMgQmluYXJ5IHsKK3B1YmxpYzoKKyAgU3ltYm9saWNGaWxlKHVuc2lnbmVkIGludCBUeXBlLCBNZW1vcnlCdWZmZXJSZWYgU291cmNlKTsKKyAgflN5bWJvbGljRmlsZSgpIG92ZXJyaWRlOworCisgIC8vIHZpcnR1YWwgaW50ZXJmYWNlLgorICB2aXJ0dWFsIHZvaWQgbW92ZVN5bWJvbE5leHQoRGF0YVJlZkltcGwgJlN5bWIpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHN0ZDo6ZXJyb3JfY29kZSBwcmludFN5bWJvbE5hbWUocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YVJlZkltcGwgU3ltYikgY29uc3QgPSAwOworCisgIHZpcnR1YWwgdWludDMyX3QgZ2V0U3ltYm9sRmxhZ3MoRGF0YVJlZkltcGwgU3ltYikgY29uc3QgPSAwOworCisgIHZpcnR1YWwgYmFzaWNfc3ltYm9sX2l0ZXJhdG9yIHN5bWJvbF9iZWdpbigpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIGJhc2ljX3N5bWJvbF9pdGVyYXRvciBzeW1ib2xfZW5kKCkgY29uc3QgPSAwOworCisgIC8vIGNvbnZlbmllbmNlIHdyYXBwZXJzLgorICB1c2luZyBiYXNpY19zeW1ib2xfaXRlcmF0b3JfcmFuZ2UgPSBpdGVyYXRvcl9yYW5nZTxiYXNpY19zeW1ib2xfaXRlcmF0b3I+OworICBiYXNpY19zeW1ib2xfaXRlcmF0b3JfcmFuZ2Ugc3ltYm9scygpIGNvbnN0IHsKKyAgICByZXR1cm4gYmFzaWNfc3ltYm9sX2l0ZXJhdG9yX3JhbmdlKHN5bWJvbF9iZWdpbigpLCBzeW1ib2xfZW5kKCkpOworICB9CisKKyAgLy8gY29uc3RydWN0aW9uIGF1eC4KKyAgc3RhdGljIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxTeW1ib2xpY0ZpbGU+PgorICBjcmVhdGVTeW1ib2xpY0ZpbGUoTWVtb3J5QnVmZmVyUmVmIE9iamVjdCwgbGx2bTo6ZmlsZV9tYWdpYyBUeXBlLAorICAgICAgICAgICAgICAgICAgICAgTExWTUNvbnRleHQgKkNvbnRleHQpOworCisgIHN0YXRpYyBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8U3ltYm9saWNGaWxlPj4KKyAgY3JlYXRlU3ltYm9saWNGaWxlKE1lbW9yeUJ1ZmZlclJlZiBPYmplY3QpIHsKKyAgICByZXR1cm4gY3JlYXRlU3ltYm9saWNGaWxlKE9iamVjdCwgbGx2bTo6ZmlsZV9tYWdpYzo6dW5rbm93biwgbnVsbHB0cik7CisgIH0KKyAgc3RhdGljIEV4cGVjdGVkPE93bmluZ0JpbmFyeTxTeW1ib2xpY0ZpbGU+PgorICBjcmVhdGVTeW1ib2xpY0ZpbGUoU3RyaW5nUmVmIE9iamVjdFBhdGgpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgQmluYXJ5ICp2KSB7CisgICAgcmV0dXJuIHYtPmlzU3ltYm9saWMoKTsKKyAgfQorfTsKKworaW5saW5lIEJhc2ljU3ltYm9sUmVmOjpCYXNpY1N5bWJvbFJlZihEYXRhUmVmSW1wbCBTeW1ib2xQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTeW1ib2xpY0ZpbGUgKk93bmVyKQorICAgIDogU3ltYm9sUGltcGwoU3ltYm9sUCksIE93bmluZ09iamVjdChPd25lcikge30KKworaW5saW5lIGJvb2wgQmFzaWNTeW1ib2xSZWY6Om9wZXJhdG9yPT0oY29uc3QgQmFzaWNTeW1ib2xSZWYgJk90aGVyKSBjb25zdCB7CisgIHJldHVybiBTeW1ib2xQaW1wbCA9PSBPdGhlci5TeW1ib2xQaW1wbDsKK30KKworaW5saW5lIGJvb2wgQmFzaWNTeW1ib2xSZWY6Om9wZXJhdG9yPChjb25zdCBCYXNpY1N5bWJvbFJlZiAmT3RoZXIpIGNvbnN0IHsKKyAgcmV0dXJuIFN5bWJvbFBpbXBsIDwgT3RoZXIuU3ltYm9sUGltcGw7Cit9CisKK2lubGluZSB2b2lkIEJhc2ljU3ltYm9sUmVmOjptb3ZlTmV4dCgpIHsKKyAgcmV0dXJuIE93bmluZ09iamVjdC0+bW92ZVN5bWJvbE5leHQoU3ltYm9sUGltcGwpOworfQorCitpbmxpbmUgc3RkOjplcnJvcl9jb2RlIEJhc2ljU3ltYm9sUmVmOjpwcmludE5hbWUocmF3X29zdHJlYW0gJk9TKSBjb25zdCB7CisgIHJldHVybiBPd25pbmdPYmplY3QtPnByaW50U3ltYm9sTmFtZShPUywgU3ltYm9sUGltcGwpOworfQorCitpbmxpbmUgdWludDMyX3QgQmFzaWNTeW1ib2xSZWY6OmdldEZsYWdzKCkgY29uc3QgeworICByZXR1cm4gT3duaW5nT2JqZWN0LT5nZXRTeW1ib2xGbGFncyhTeW1ib2xQaW1wbCk7Cit9CisKK2lubGluZSBEYXRhUmVmSW1wbCBCYXNpY1N5bWJvbFJlZjo6Z2V0UmF3RGF0YVJlZkltcGwoKSBjb25zdCB7CisgIHJldHVybiBTeW1ib2xQaW1wbDsKK30KKworaW5saW5lIGNvbnN0IFN5bWJvbGljRmlsZSAqQmFzaWNTeW1ib2xSZWY6OmdldE9iamVjdCgpIGNvbnN0IHsKKyAgcmV0dXJuIE93bmluZ09iamVjdDsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIG9iamVjdAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fT0JKRUNUX1NZTUJPTElDRklMRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9XYXNtLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9XYXNtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDQ5YWNmMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L1dhc20uaApAQCAtMCwwICsxLDI3OCBAQAorLy89PT0tIFdhc21PYmplY3RGaWxlLmggLSBXYXNtIG9iamVjdCBmaWxlIGltcGxlbWVudGF0aW9uIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFdhc21PYmplY3RGaWxlIGNsYXNzLCB3aGljaCBpbXBsZW1lbnRzIHRoZSBPYmplY3RGaWxlCisvLyBpbnRlcmZhY2UgZm9yIFdhc20gZmlsZXMuCisvLworLy8gU2VlOiBodHRwczovL2dpdGh1Yi5jb20vV2ViQXNzZW1ibHkvZGVzaWduL2Jsb2IvbWFzdGVyL0JpbmFyeUVuY29kaW5nLm1kCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVF9XQVNNX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RfV0FTTV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L1dhc20uaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9CaW5hcnkuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdC9PYmplY3RGaWxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBvYmplY3QgeworCitjbGFzcyBXYXNtU3ltYm9sIHsKK3B1YmxpYzoKKyAgV2FzbVN5bWJvbChjb25zdCB3YXNtOjpXYXNtU3ltYm9sSW5mbyAmSW5mbywKKyAgICAgICAgICAgICBjb25zdCB3YXNtOjpXYXNtU2lnbmF0dXJlICpGdW5jdGlvblR5cGUsCisgICAgICAgICAgICAgY29uc3Qgd2FzbTo6V2FzbUdsb2JhbFR5cGUgKkdsb2JhbFR5cGUpCisgICAgICA6IEluZm8oSW5mbyksIEZ1bmN0aW9uVHlwZShGdW5jdGlvblR5cGUpLCBHbG9iYWxUeXBlKEdsb2JhbFR5cGUpIHt9CisKKyAgY29uc3Qgd2FzbTo6V2FzbVN5bWJvbEluZm8gJkluZm87CisgIGNvbnN0IHdhc206Oldhc21TaWduYXR1cmUgKkZ1bmN0aW9uVHlwZTsKKyAgY29uc3Qgd2FzbTo6V2FzbUdsb2JhbFR5cGUgKkdsb2JhbFR5cGU7CisKKyAgYm9vbCBpc1R5cGVGdW5jdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5mby5LaW5kID09IHdhc206OldBU01fU1lNQk9MX1RZUEVfRlVOQ1RJT047CisgIH0KKworICBib29sIGlzVHlwZURhdGEoKSBjb25zdCB7IHJldHVybiBJbmZvLktpbmQgPT0gd2FzbTo6V0FTTV9TWU1CT0xfVFlQRV9EQVRBOyB9CisKKyAgYm9vbCBpc1R5cGVHbG9iYWwoKSBjb25zdCB7CisgICAgcmV0dXJuIEluZm8uS2luZCA9PSB3YXNtOjpXQVNNX1NZTUJPTF9UWVBFX0dMT0JBTDsKKyAgfQorCisgIGJvb2wgaXNEZWZpbmVkKCkgY29uc3QgeyByZXR1cm4gIWlzVW5kZWZpbmVkKCk7IH0KKworICBib29sIGlzVW5kZWZpbmVkKCkgY29uc3QgeworICAgIHJldHVybiAoSW5mby5GbGFncyAmIHdhc206OldBU01fU1lNQk9MX1VOREVGSU5FRCkgIT0gMDsKKyAgfQorCisgIGJvb2wgaXNCaW5kaW5nV2VhaygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0QmluZGluZygpID09IHdhc206OldBU01fU1lNQk9MX0JJTkRJTkdfV0VBSzsKKyAgfQorCisgIGJvb2wgaXNCaW5kaW5nR2xvYmFsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRCaW5kaW5nKCkgPT0gd2FzbTo6V0FTTV9TWU1CT0xfQklORElOR19HTE9CQUw7CisgIH0KKworICBib29sIGlzQmluZGluZ0xvY2FsKCkgY29uc3QgeworICAgIHJldHVybiBnZXRCaW5kaW5nKCkgPT0gd2FzbTo6V0FTTV9TWU1CT0xfQklORElOR19MT0NBTDsKKyAgfQorCisgIHVuc2lnbmVkIGdldEJpbmRpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIEluZm8uRmxhZ3MgJiB3YXNtOjpXQVNNX1NZTUJPTF9CSU5ESU5HX01BU0s7CisgIH0KKworICBib29sIGlzSGlkZGVuKCkgY29uc3QgeworICAgIHJldHVybiBnZXRWaXNpYmlsaXR5KCkgPT0gd2FzbTo6V0FTTV9TWU1CT0xfVklTSUJJTElUWV9ISURERU47CisgIH0KKworICB1bnNpZ25lZCBnZXRWaXNpYmlsaXR5KCkgY29uc3QgeworICAgIHJldHVybiBJbmZvLkZsYWdzICYgd2FzbTo6V0FTTV9TWU1CT0xfVklTSUJJTElUWV9NQVNLOworICB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT3V0KSBjb25zdCB7CisgICAgT3V0IDw8ICJOYW1lPSIgPDwgSW5mby5OYW1lIDw8ICIsIEtpbmQ9IiA8PCBJbmZvLktpbmQKKyAgICAgICAgPDwgIiwgRmxhZ3M9IiA8PCBJbmZvLkZsYWdzOworICAgIGlmICghaXNUeXBlRGF0YSgpKSB7CisgICAgICBPdXQgPDwgIiwgRWxlbUluZGV4PSIgPDwgSW5mby5FbGVtZW50SW5kZXg7CisgICAgfSBlbHNlIGlmIChpc0RlZmluZWQoKSkgeworICAgICAgT3V0IDw8ICIsIFNlZ21lbnQ9IiA8PCBJbmZvLkRhdGFSZWYuU2VnbWVudDsKKyAgICAgIE91dCA8PCAiLCBPZmZzZXQ9IiA8PCBJbmZvLkRhdGFSZWYuT2Zmc2V0OworICAgICAgT3V0IDw8ICIsIFNpemU9IiA8PCBJbmZvLkRhdGFSZWYuU2l6ZTsKKyAgICB9CisgIH0KKworI2lmICFkZWZpbmVkKE5ERUJVRykgfHwgZGVmaW5lZChMTFZNX0VOQUJMRV9EVU1QKQorICBMTFZNX0RVTVBfTUVUSE9EIHZvaWQgZHVtcCgpIGNvbnN0IHsgcHJpbnQoZGJncygpKTsgfQorI2VuZGlmCit9OworCitzdHJ1Y3QgV2FzbVNlY3Rpb24geworICBXYXNtU2VjdGlvbigpID0gZGVmYXVsdDsKKworICB1aW50MzJfdCBUeXBlID0gMDsgLy8gU2VjdGlvbiB0eXBlIChTZWUgYmVsb3cpCisgIHVpbnQzMl90IE9mZnNldCA9IDA7IC8vIE9mZnNldCB3aXRoIGluIHRoZSBmaWxlCisgIFN0cmluZ1JlZiBOYW1lOyAvLyBTZWN0aW9uIG5hbWUgKFVzZXItZGVmaW5lZCBzZWN0aW9ucyBvbmx5KQorICBBcnJheVJlZjx1aW50OF90PiBDb250ZW50OyAvLyBTZWN0aW9uIGNvbnRlbnQKKyAgc3RkOjp2ZWN0b3I8d2FzbTo6V2FzbVJlbG9jYXRpb24+IFJlbG9jYXRpb25zOyAvLyBSZWxvY2F0aW9ucyBmb3IgdGhpcyBzZWN0aW9uCit9OworCitzdHJ1Y3QgV2FzbVNlZ21lbnQgeworICB1aW50MzJfdCBTZWN0aW9uT2Zmc2V0OworICB3YXNtOjpXYXNtRGF0YVNlZ21lbnQgRGF0YTsKK307CisKK2NsYXNzIFdhc21PYmplY3RGaWxlIDogcHVibGljIE9iamVjdEZpbGUgeworCitwdWJsaWM6CisgIFdhc21PYmplY3RGaWxlKE1lbW9yeUJ1ZmZlclJlZiBPYmplY3QsIEVycm9yICZFcnIpOworCisgIGNvbnN0IHdhc206Oldhc21PYmplY3RIZWFkZXIgJmdldEhlYWRlcigpIGNvbnN0OworICBjb25zdCBXYXNtU3ltYm9sICZnZXRXYXNtU3ltYm9sKGNvbnN0IERhdGFSZWZJbXBsICZTeW1iKSBjb25zdDsKKyAgY29uc3QgV2FzbVN5bWJvbCAmZ2V0V2FzbVN5bWJvbChjb25zdCBTeW1ib2xSZWYgJlN5bWJvbCkgY29uc3Q7CisgIGNvbnN0IFdhc21TZWN0aW9uICZnZXRXYXNtU2VjdGlvbihjb25zdCBTZWN0aW9uUmVmICZTZWN0aW9uKSBjb25zdDsKKyAgY29uc3Qgd2FzbTo6V2FzbVJlbG9jYXRpb24gJmdldFdhc21SZWxvY2F0aW9uKGNvbnN0IFJlbG9jYXRpb25SZWYmIFJlZikgY29uc3Q7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBCaW5hcnkgKnYpIHsgcmV0dXJuIHYtPmlzV2FzbSgpOyB9CisKKyAgQXJyYXlSZWY8d2FzbTo6V2FzbVNpZ25hdHVyZT4gdHlwZXMoKSBjb25zdCB7IHJldHVybiBTaWduYXR1cmVzOyB9CisgIEFycmF5UmVmPHVpbnQzMl90PiBmdW5jdGlvblR5cGVzKCkgY29uc3QgeyByZXR1cm4gRnVuY3Rpb25UeXBlczsgfQorICBBcnJheVJlZjx3YXNtOjpXYXNtSW1wb3J0PiBpbXBvcnRzKCkgY29uc3QgeyByZXR1cm4gSW1wb3J0czsgfQorICBBcnJheVJlZjx3YXNtOjpXYXNtVGFibGU+IHRhYmxlcygpIGNvbnN0IHsgcmV0dXJuIFRhYmxlczsgfQorICBBcnJheVJlZjx3YXNtOjpXYXNtTGltaXRzPiBtZW1vcmllcygpIGNvbnN0IHsgcmV0dXJuIE1lbW9yaWVzOyB9CisgIEFycmF5UmVmPHdhc206Oldhc21HbG9iYWw+IGdsb2JhbHMoKSBjb25zdCB7IHJldHVybiBHbG9iYWxzOyB9CisgIEFycmF5UmVmPHdhc206Oldhc21FeHBvcnQ+IGV4cG9ydHMoKSBjb25zdCB7IHJldHVybiBFeHBvcnRzOyB9CisgIEFycmF5UmVmPFdhc21TeW1ib2w+IHN5bXMoKSBjb25zdCB7IHJldHVybiBTeW1ib2xzOyB9CisgIGNvbnN0IHdhc206Oldhc21MaW5raW5nRGF0YSYgbGlua2luZ0RhdGEoKSBjb25zdCB7IHJldHVybiBMaW5raW5nRGF0YTsgfQorICB1aW50MzJfdCBnZXROdW1iZXJPZlN5bWJvbHMoKSBjb25zdCB7IHJldHVybiBTeW1ib2xzLnNpemUoKTsgfQorICBBcnJheVJlZjx3YXNtOjpXYXNtRWxlbVNlZ21lbnQ+IGVsZW1lbnRzKCkgY29uc3QgeyByZXR1cm4gRWxlbVNlZ21lbnRzOyB9CisgIEFycmF5UmVmPFdhc21TZWdtZW50PiBkYXRhU2VnbWVudHMoKSBjb25zdCB7IHJldHVybiBEYXRhU2VnbWVudHM7IH0KKyAgQXJyYXlSZWY8d2FzbTo6V2FzbUZ1bmN0aW9uPiBmdW5jdGlvbnMoKSBjb25zdCB7IHJldHVybiBGdW5jdGlvbnM7IH0KKyAgQXJyYXlSZWY8d2FzbTo6V2FzbUZ1bmN0aW9uTmFtZT4gZGVidWdOYW1lcygpIGNvbnN0IHsgcmV0dXJuIERlYnVnTmFtZXM7IH0KKyAgdWludDMyX3Qgc3RhcnRGdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIFN0YXJ0RnVuY3Rpb247IH0KKyAgdWludDMyX3QgZ2V0TnVtSW1wb3J0ZWRHbG9iYWxzKCkgY29uc3QgeyByZXR1cm4gTnVtSW1wb3J0ZWRHbG9iYWxzOyB9CisgIHVpbnQzMl90IGdldE51bUltcG9ydGVkRnVuY3Rpb25zKCkgY29uc3QgeyByZXR1cm4gTnVtSW1wb3J0ZWRGdW5jdGlvbnM7IH0KKworICB2b2lkIG1vdmVTeW1ib2xOZXh0KERhdGFSZWZJbXBsICZTeW1iKSBjb25zdCBvdmVycmlkZTsKKworICB1aW50MzJfdCBnZXRTeW1ib2xGbGFncyhEYXRhUmVmSW1wbCBTeW1iKSBjb25zdCBvdmVycmlkZTsKKworICBiYXNpY19zeW1ib2xfaXRlcmF0b3Igc3ltYm9sX2JlZ2luKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYmFzaWNfc3ltYm9sX2l0ZXJhdG9yIHN5bWJvbF9lbmQoKSBjb25zdCBvdmVycmlkZTsKKyAgRXhwZWN0ZWQ8U3RyaW5nUmVmPiBnZXRTeW1ib2xOYW1lKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworCisgIEV4cGVjdGVkPHVpbnQ2NF90PiBnZXRTeW1ib2xBZGRyZXNzKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRXYXNtU3ltYm9sVmFsdWUoY29uc3QgV2FzbVN5bWJvbCYgU3ltKSBjb25zdDsKKyAgdWludDY0X3QgZ2V0U3ltYm9sVmFsdWVJbXBsKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICB1aW50MzJfdCBnZXRTeW1ib2xBbGlnbm1lbnQoRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldENvbW1vblN5bWJvbFNpemVJbXBsKERhdGFSZWZJbXBsIFN5bWIpIGNvbnN0IG92ZXJyaWRlOworICBFeHBlY3RlZDxTeW1ib2xSZWY6OlR5cGU+IGdldFN5bWJvbFR5cGUoRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisgIEV4cGVjdGVkPHNlY3Rpb25faXRlcmF0b3I+IGdldFN5bWJvbFNlY3Rpb24oRGF0YVJlZkltcGwgU3ltYikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8gT3ZlcnJpZGVzIGZyb20gU2VjdGlvblJlZi4KKyAgdm9pZCBtb3ZlU2VjdGlvbk5leHQoRGF0YVJlZkltcGwgJlNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6ZXJyb3JfY29kZSBnZXRTZWN0aW9uTmFtZShEYXRhUmVmSW1wbCBTZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgJlJlcykgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldFNlY3Rpb25BZGRyZXNzKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldFNlY3Rpb25JbmRleChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICB1aW50NjRfdCBnZXRTZWN0aW9uU2l6ZShEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OmVycm9yX2NvZGUgZ2V0U2VjdGlvbkNvbnRlbnRzKERhdGFSZWZJbXBsIFNlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgJlJlcykgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldFNlY3Rpb25BbGlnbm1lbnQoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1NlY3Rpb25Db21wcmVzc2VkKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTZWN0aW9uVGV4dChEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICBib29sIGlzU2VjdGlvbkRhdGEoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1NlY3Rpb25CU1MoRGF0YVJlZkltcGwgU2VjKSBjb25zdCBvdmVycmlkZTsKKyAgYm9vbCBpc1NlY3Rpb25WaXJ0dWFsKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNTZWN0aW9uQml0Y29kZShEYXRhUmVmSW1wbCBTZWMpIGNvbnN0IG92ZXJyaWRlOworICByZWxvY2F0aW9uX2l0ZXJhdG9yIHNlY3Rpb25fcmVsX2JlZ2luKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisgIHJlbG9jYXRpb25faXRlcmF0b3Igc2VjdGlvbl9yZWxfZW5kKERhdGFSZWZJbXBsIFNlYykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8gT3ZlcnJpZGVzIGZyb20gUmVsb2NhdGlvblJlZi4KKyAgdm9pZCBtb3ZlUmVsb2NhdGlvbk5leHQoRGF0YVJlZkltcGwgJlJlbCkgY29uc3Qgb3ZlcnJpZGU7CisgIHVpbnQ2NF90IGdldFJlbG9jYXRpb25PZmZzZXQoRGF0YVJlZkltcGwgUmVsKSBjb25zdCBvdmVycmlkZTsKKyAgc3ltYm9sX2l0ZXJhdG9yIGdldFJlbG9jYXRpb25TeW1ib2woRGF0YVJlZkltcGwgUmVsKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDY0X3QgZ2V0UmVsb2NhdGlvblR5cGUoRGF0YVJlZkltcGwgUmVsKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBnZXRSZWxvY2F0aW9uVHlwZU5hbWUoRGF0YVJlZkltcGwgUmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlJlc3VsdCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc2VjdGlvbl9pdGVyYXRvciBzZWN0aW9uX2JlZ2luKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHNlY3Rpb25faXRlcmF0b3Igc2VjdGlvbl9lbmQoKSBjb25zdCBvdmVycmlkZTsKKyAgdWludDhfdCBnZXRCeXRlc0luQWRkcmVzcygpIGNvbnN0IG92ZXJyaWRlOworICBTdHJpbmdSZWYgZ2V0RmlsZUZvcm1hdE5hbWUoKSBjb25zdCBvdmVycmlkZTsKKyAgVHJpcGxlOjpBcmNoVHlwZSBnZXRBcmNoKCkgY29uc3Qgb3ZlcnJpZGU7CisgIFN1YnRhcmdldEZlYXR1cmVzIGdldEZlYXR1cmVzKCkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgaXNSZWxvY2F0YWJsZU9iamVjdCgpIGNvbnN0IG92ZXJyaWRlOworCitwcml2YXRlOgorICBib29sIGlzVmFsaWRGdW5jdGlvbkluZGV4KHVpbnQzMl90IEluZGV4KSBjb25zdDsKKyAgYm9vbCBpc0RlZmluZWRGdW5jdGlvbkluZGV4KHVpbnQzMl90IEluZGV4KSBjb25zdDsKKyAgYm9vbCBpc1ZhbGlkR2xvYmFsSW5kZXgodWludDMyX3QgSW5kZXgpIGNvbnN0OworICBib29sIGlzRGVmaW5lZEdsb2JhbEluZGV4KHVpbnQzMl90IEluZGV4KSBjb25zdDsKKyAgYm9vbCBpc1ZhbGlkRnVuY3Rpb25TeW1ib2wodWludDMyX3QgSW5kZXgpIGNvbnN0OworICBib29sIGlzVmFsaWRHbG9iYWxTeW1ib2wodWludDMyX3QgSW5kZXgpIGNvbnN0OworICBib29sIGlzVmFsaWREYXRhU3ltYm9sKHVpbnQzMl90IEluZGV4KSBjb25zdDsKKyAgd2FzbTo6V2FzbUZ1bmN0aW9uICZnZXREZWZpbmVkRnVuY3Rpb24odWludDMyX3QgSW5kZXgpOworICB3YXNtOjpXYXNtR2xvYmFsICZnZXREZWZpbmVkR2xvYmFsKHVpbnQzMl90IEluZGV4KTsKKworICBjb25zdCBXYXNtU2VjdGlvbiAmZ2V0V2FzbVNlY3Rpb24oRGF0YVJlZkltcGwgUmVmKSBjb25zdDsKKyAgY29uc3Qgd2FzbTo6V2FzbVJlbG9jYXRpb24gJmdldFdhc21SZWxvY2F0aW9uKERhdGFSZWZJbXBsIFJlZikgY29uc3Q7CisKKyAgV2FzbVNlY3Rpb24qIGZpbmRDdXN0b21TZWN0aW9uQnlOYW1lKFN0cmluZ1JlZiBOYW1lKTsKKyAgV2FzbVNlY3Rpb24qIGZpbmRTZWN0aW9uQnlUeXBlKHVpbnQzMl90IFR5cGUpOworCisgIGNvbnN0IHVpbnQ4X3QgKmdldFB0cihzaXplX3QgT2Zmc2V0KSBjb25zdDsKKyAgRXJyb3IgcGFyc2VTZWN0aW9uKFdhc21TZWN0aW9uICZTZWMpOworICBFcnJvciBwYXJzZUN1c3RvbVNlY3Rpb24oV2FzbVNlY3Rpb24gJlNlYywgY29uc3QgdWludDhfdCAqUHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqRW5kKTsKKworICAvLyBTdGFuZGFyZCBzZWN0aW9uIHR5cGVzCisgIEVycm9yIHBhcnNlVHlwZVNlY3Rpb24oY29uc3QgdWludDhfdCAqUHRyLCBjb25zdCB1aW50OF90ICpFbmQpOworICBFcnJvciBwYXJzZUltcG9ydFNlY3Rpb24oY29uc3QgdWludDhfdCAqUHRyLCBjb25zdCB1aW50OF90ICpFbmQpOworICBFcnJvciBwYXJzZUZ1bmN0aW9uU2VjdGlvbihjb25zdCB1aW50OF90ICpQdHIsIGNvbnN0IHVpbnQ4X3QgKkVuZCk7CisgIEVycm9yIHBhcnNlVGFibGVTZWN0aW9uKGNvbnN0IHVpbnQ4X3QgKlB0ciwgY29uc3QgdWludDhfdCAqRW5kKTsKKyAgRXJyb3IgcGFyc2VNZW1vcnlTZWN0aW9uKGNvbnN0IHVpbnQ4X3QgKlB0ciwgY29uc3QgdWludDhfdCAqRW5kKTsKKyAgRXJyb3IgcGFyc2VHbG9iYWxTZWN0aW9uKGNvbnN0IHVpbnQ4X3QgKlB0ciwgY29uc3QgdWludDhfdCAqRW5kKTsKKyAgRXJyb3IgcGFyc2VFeHBvcnRTZWN0aW9uKGNvbnN0IHVpbnQ4X3QgKlB0ciwgY29uc3QgdWludDhfdCAqRW5kKTsKKyAgRXJyb3IgcGFyc2VTdGFydFNlY3Rpb24oY29uc3QgdWludDhfdCAqUHRyLCBjb25zdCB1aW50OF90ICpFbmQpOworICBFcnJvciBwYXJzZUVsZW1TZWN0aW9uKGNvbnN0IHVpbnQ4X3QgKlB0ciwgY29uc3QgdWludDhfdCAqRW5kKTsKKyAgRXJyb3IgcGFyc2VDb2RlU2VjdGlvbihjb25zdCB1aW50OF90ICpQdHIsIGNvbnN0IHVpbnQ4X3QgKkVuZCk7CisgIEVycm9yIHBhcnNlRGF0YVNlY3Rpb24oY29uc3QgdWludDhfdCAqUHRyLCBjb25zdCB1aW50OF90ICpFbmQpOworCisgIC8vIEN1c3RvbSBzZWN0aW9uIHR5cGVzCisgIEVycm9yIHBhcnNlTmFtZVNlY3Rpb24oY29uc3QgdWludDhfdCAqUHRyLCBjb25zdCB1aW50OF90ICpFbmQpOworICBFcnJvciBwYXJzZUxpbmtpbmdTZWN0aW9uKGNvbnN0IHVpbnQ4X3QgKlB0ciwgY29uc3QgdWludDhfdCAqRW5kKTsKKyAgRXJyb3IgcGFyc2VMaW5raW5nU2VjdGlvblN5bXRhYihjb25zdCB1aW50OF90IComUHRyLCBjb25zdCB1aW50OF90ICpFbmQpOworICBFcnJvciBwYXJzZUxpbmtpbmdTZWN0aW9uQ29tZGF0KGNvbnN0IHVpbnQ4X3QgKiZQdHIsIGNvbnN0IHVpbnQ4X3QgKkVuZCk7CisgIEVycm9yIHBhcnNlUmVsb2NTZWN0aW9uKFN0cmluZ1JlZiBOYW1lLCBjb25zdCB1aW50OF90ICpQdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKkVuZCk7CisKKyAgd2FzbTo6V2FzbU9iamVjdEhlYWRlciBIZWFkZXI7CisgIHN0ZDo6dmVjdG9yPFdhc21TZWN0aW9uPiBTZWN0aW9uczsKKyAgc3RkOjp2ZWN0b3I8d2FzbTo6V2FzbVNpZ25hdHVyZT4gU2lnbmF0dXJlczsKKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IEZ1bmN0aW9uVHlwZXM7CisgIHN0ZDo6dmVjdG9yPHdhc206Oldhc21UYWJsZT4gVGFibGVzOworICBzdGQ6OnZlY3Rvcjx3YXNtOjpXYXNtTGltaXRzPiBNZW1vcmllczsKKyAgc3RkOjp2ZWN0b3I8d2FzbTo6V2FzbUdsb2JhbD4gR2xvYmFsczsKKyAgc3RkOjp2ZWN0b3I8d2FzbTo6V2FzbUltcG9ydD4gSW1wb3J0czsKKyAgc3RkOjp2ZWN0b3I8d2FzbTo6V2FzbUV4cG9ydD4gRXhwb3J0czsKKyAgc3RkOjp2ZWN0b3I8d2FzbTo6V2FzbUVsZW1TZWdtZW50PiBFbGVtU2VnbWVudHM7CisgIHN0ZDo6dmVjdG9yPFdhc21TZWdtZW50PiBEYXRhU2VnbWVudHM7CisgIHN0ZDo6dmVjdG9yPHdhc206Oldhc21GdW5jdGlvbj4gRnVuY3Rpb25zOworICBzdGQ6OnZlY3RvcjxXYXNtU3ltYm9sPiBTeW1ib2xzOworICBzdGQ6OnZlY3Rvcjx3YXNtOjpXYXNtRnVuY3Rpb25OYW1lPiBEZWJ1Z05hbWVzOworICB1aW50MzJfdCBTdGFydEZ1bmN0aW9uID0gLTE7CisgIGJvb2wgSGFzTGlua2luZ1NlY3Rpb24gPSBmYWxzZTsKKyAgd2FzbTo6V2FzbUxpbmtpbmdEYXRhIExpbmtpbmdEYXRhOworICB1aW50MzJfdCBOdW1JbXBvcnRlZEdsb2JhbHMgPSAwOworICB1aW50MzJfdCBOdW1JbXBvcnRlZEZ1bmN0aW9ucyA9IDA7CisgIHVpbnQzMl90IENvZGVTZWN0aW9uID0gMDsKKyAgdWludDMyX3QgRGF0YVNlY3Rpb24gPSAwOworICB1aW50MzJfdCBHbG9iYWxTZWN0aW9uID0gMDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvYmplY3QKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBvYmplY3Q6Oldhc21TeW1ib2wgJlN5bSkgeworICBTeW0ucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX09CSkVDVF9XQVNNX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L1dhc21UcmFpdHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0L1dhc21UcmFpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYmNkMDBiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvV2FzbVRyYWl0cy5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vPT09LSBXYXNtVHJhaXRzLmggLSBEZW5zZU1hcCB0cmFpdHMgZm9yIHRoZSBXYXNtIHN0cnVjdHVyZXMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGVzIGxsdm06OkRlbnNlTWFwSW5mbyB0cmFpdHMgZm9yIHRoZSBXYXNtIHN0cnVjdHVyZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVF9XQVNNVFJBSVRTX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RfV0FTTVRSQUlUU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9IYXNoaW5nLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvV2FzbS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgRGVuc2VNYXBJbmZvOworCisvLyBUcmFpdHMgZm9yIHVzaW5nIFdhc21TaWduYXR1cmUgaW4gYSBEZW5zZU1hcC4KK3RlbXBsYXRlIDw+IHN0cnVjdCBEZW5zZU1hcEluZm88d2FzbTo6V2FzbVNpZ25hdHVyZT4geworICBzdGF0aWMgd2FzbTo6V2FzbVNpZ25hdHVyZSBnZXRFbXB0eUtleSgpIHsKKyAgICByZXR1cm4gd2FzbTo6V2FzbVNpZ25hdHVyZXt7fSwgMX07CisgIH0KKyAgc3RhdGljIHdhc206Oldhc21TaWduYXR1cmUgZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiB3YXNtOjpXYXNtU2lnbmF0dXJle3t9LCAyfTsKKyAgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IHdhc206Oldhc21TaWduYXR1cmUgJlNpZykgeworICAgIHVuc2lnbmVkIEggPSBoYXNoX3ZhbHVlKFNpZy5SZXR1cm5UeXBlKTsKKyAgICBmb3IgKGludDMyX3QgUGFyYW0gOiBTaWcuUGFyYW1UeXBlcykKKyAgICAgIEggPSBoYXNoX2NvbWJpbmUoSCwgUGFyYW0pOworICAgIHJldHVybiBIOworICB9CisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3Qgd2FzbTo6V2FzbVNpZ25hdHVyZSAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhc206Oldhc21TaWduYXR1cmUgJlJIUykgeworICAgIHJldHVybiBMSFMgPT0gUkhTOworICB9Cit9OworCisvLyBUcmFpdHMgZm9yIHVzaW5nIFdhc21HbG9iYWxUeXBlIGluIGEgRGVuc2VNYXAKK3RlbXBsYXRlIDw+IHN0cnVjdCBEZW5zZU1hcEluZm88d2FzbTo6V2FzbUdsb2JhbFR5cGU+IHsKKyAgc3RhdGljIHdhc206Oldhc21HbG9iYWxUeXBlIGdldEVtcHR5S2V5KCkgeworICAgIHJldHVybiB3YXNtOjpXYXNtR2xvYmFsVHlwZXsxLCB0cnVlfTsKKyAgfQorICBzdGF0aWMgd2FzbTo6V2FzbUdsb2JhbFR5cGUgZ2V0VG9tYnN0b25lS2V5KCkgeworICAgIHJldHVybiB3YXNtOjpXYXNtR2xvYmFsVHlwZXsyLCB0cnVlfTsKKyAgfQorICBzdGF0aWMgdW5zaWduZWQgZ2V0SGFzaFZhbHVlKGNvbnN0IHdhc206Oldhc21HbG9iYWxUeXBlICZHbG9iYWxUeXBlKSB7CisgICAgcmV0dXJuIGhhc2hfY29tYmluZShHbG9iYWxUeXBlLlR5cGUsIEdsb2JhbFR5cGUuTXV0YWJsZSk7CisgIH0KKyAgc3RhdGljIGJvb2wgaXNFcXVhbChjb25zdCB3YXNtOjpXYXNtR2xvYmFsVHlwZSAmTEhTLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdhc206Oldhc21HbG9iYWxUeXBlICZSSFMpIHsKKyAgICByZXR1cm4gTEhTID09IFJIUzsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fT0JKRUNUX1dBU01UUkFJVFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvV2luZG93c1Jlc291cmNlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdC9XaW5kb3dzUmVzb3VyY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDc3YzgyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3QvV2luZG93c1Jlc291cmNlLmgKQEAgLTAsMCArMSwyMjcgQEAKKy8vPT09LS0gV2luZG93c1Jlc291cmNlLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgLnJlcyBmaWxlIGNsYXNzLiAgLnJlcyBmaWxlcyBhcmUgaW50ZXJtZWRpYXRlCisvLyBwcm9kdWN0cyBvZiB0aGUgdHlwaWNhbCByZXNvdXJjZS1jb21waWxhdGlvbiBwcm9jZXNzIG9uIFdpbmRvd3MuICBUaGlzCisvLyBwcm9jZXNzIGlzIGFzIGZvbGxvd3M6CisvLworLy8gLnJjIGZpbGUocykgLS0tKHJjLmV4ZSktLS0+IC5yZXMgZmlsZShzKSAtLS0oY3Z0cmVzLmV4ZSktLS0+IENPRkYgZmlsZQorLy8KKy8vIC5yYyBmaWxlcyBhcmUgaHVtYW4tcmVhZGFibGUgc2NyaXB0cyB0aGF0IGxpc3QgYWxsIHJlc291cmNlcyBhIHByb2dyYW0gdXNlcy4KKy8vCisvLyBUaGV5IGFyZSBjb21waWxlZCBpbnRvIC5yZXMgZmlsZXMsIHdoaWNoIGFyZSBhIGxpc3Qgb2YgdGhlIHJlc291cmNlcyBpbgorLy8gYmluYXJ5IGZvcm0uCisvLworLy8gRmluYWxseSB0aGUgZGF0YSBzdG9yZWQgaW4gdGhlIC5yZXMgaXMgY29tcGlsZWQgaW50byBhIENPRkYgZmlsZSwgd2hlcmUgaXQKKy8vIGlzIG9yZ2FuaXplZCBpbiBhIGRpcmVjdG9yeSB0cmVlIHN0cnVjdHVyZSBmb3Igb3B0aW1pemVkIGFjY2VzcyBieSB0aGUKKy8vIHByb2dyYW0gZHVyaW5nIHJ1bnRpbWUuCisvLworLy8gUmVmOiBtc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS93aW5kb3dzL2Rlc2t0b3AvbXM2NDgwMDcodj12cy44NSkuYXNweAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX0lOQ0xVREVfTExWTV9PQkpFQ1RfUkVTRklMRV9ICisjZGVmaW5lIExMVk1fSU5DTFVERV9MTFZNX09CSkVDVF9SRVNGSUxFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvQ09GRi5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L0JpbmFyeS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeUJ5dGVTdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVhZGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbnZlcnRVVEYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1Njb3BlZFByaW50ZXIuaCIKKworI2luY2x1ZGUgPG1hcD4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9iamVjdCB7CisKK2NsYXNzIFdpbmRvd3NSZXNvdXJjZTsKKworY29uc3Qgc2l6ZV90IFdJTl9SRVNfTUFHSUNfU0laRSA9IDE2OworY29uc3Qgc2l6ZV90IFdJTl9SRVNfTlVMTF9FTlRSWV9TSVpFID0gMTY7Citjb25zdCB1aW50MzJfdCBXSU5fUkVTX0hFQURFUl9BTElHTk1FTlQgPSA0OworY29uc3QgdWludDMyX3QgV0lOX1JFU19EQVRBX0FMSUdOTUVOVCA9IDQ7Citjb25zdCB1aW50MTZfdCBXSU5fUkVTX1BVUkVfTU9WRUFCTEUgPSAweDAwMzA7CisKK3N0cnVjdCBXaW5SZXNIZWFkZXJQcmVmaXggeworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBEYXRhU2l6ZTsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgSGVhZGVyU2l6ZTsKK307CisKKy8vIFR5cGUgYW5kIE5hbWUgbWF5IGVhY2ggZWl0aGVyIGJlIGFuIGludGVnZXIgSUQgb3IgYSBzdHJpbmcuICBUaGlzIHN0cnVjdCBpcworLy8gb25seSB1c2VkIGluIHRoZSBjYXNlIHdoZXJlIHRoZXkgYXJlIGJvdGggSURzLgorc3RydWN0IFdpblJlc0lEcyB7CisgIHVpbnQxNl90IFR5cGVGbGFnOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBUeXBlSUQ7CisgIHVpbnQxNl90IE5hbWVGbGFnOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBOYW1lSUQ7CisKKyAgdm9pZCBzZXRUeXBlKHVpbnQxNl90IElEKSB7CisgICAgVHlwZUZsYWcgPSAweGZmZmY7CisgICAgVHlwZUlEID0gSUQ7CisgIH0KKworICB2b2lkIHNldE5hbWUodWludDE2X3QgSUQpIHsKKyAgICBOYW1lRmxhZyA9IDB4ZmZmZjsKKyAgICBOYW1lSUQgPSBJRDsKKyAgfQorfTsKKworc3RydWN0IFdpblJlc0hlYWRlclN1ZmZpeCB7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IERhdGFWZXJzaW9uOworICBzdXBwb3J0Ojp1bGl0dGxlMTZfdCBNZW1vcnlGbGFnczsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgTGFuZ3VhZ2U7CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IFZlcnNpb247CisgIHN1cHBvcnQ6OnVsaXR0bGUzMl90IENoYXJhY3RlcmlzdGljczsKK307CisKK2NsYXNzIEVtcHR5UmVzRXJyb3IgOiBwdWJsaWMgR2VuZXJpY0JpbmFyeUVycm9yIHsKK3B1YmxpYzoKKyAgRW1wdHlSZXNFcnJvcihUd2luZSBNc2csIG9iamVjdF9lcnJvciBFQ092ZXJyaWRlKQorICAgICAgOiBHZW5lcmljQmluYXJ5RXJyb3IoTXNnLCBFQ092ZXJyaWRlKSB7fQorfTsKKworY2xhc3MgUmVzb3VyY2VFbnRyeVJlZiB7CitwdWJsaWM6CisgIEVycm9yIG1vdmVOZXh0KGJvb2wgJkVuZCk7CisgIGJvb2wgY2hlY2tUeXBlU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gSXNTdHJpbmdUeXBlOyB9CisgIEFycmF5UmVmPFVURjE2PiBnZXRUeXBlU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gVHlwZTsgfQorICB1aW50MTZfdCBnZXRUeXBlSUQoKSBjb25zdCB7IHJldHVybiBUeXBlSUQ7IH0KKyAgYm9vbCBjaGVja05hbWVTdHJpbmcoKSBjb25zdCB7IHJldHVybiBJc1N0cmluZ05hbWU7IH0KKyAgQXJyYXlSZWY8VVRGMTY+IGdldE5hbWVTdHJpbmcoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisgIHVpbnQxNl90IGdldE5hbWVJRCgpIGNvbnN0IHsgcmV0dXJuIE5hbWVJRDsgfQorICB1aW50MTZfdCBnZXREYXRhVmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIFN1ZmZpeC0+RGF0YVZlcnNpb247IH0KKyAgdWludDE2X3QgZ2V0TGFuZ3VhZ2UoKSBjb25zdCB7IHJldHVybiBTdWZmaXgtPkxhbmd1YWdlOyB9CisgIHVpbnQxNl90IGdldE1lbW9yeUZsYWdzKCkgY29uc3QgeyByZXR1cm4gU3VmZml4LT5NZW1vcnlGbGFnczsgfQorICB1aW50MTZfdCBnZXRNYWpvclZlcnNpb24oKSBjb25zdCB7IHJldHVybiBTdWZmaXgtPlZlcnNpb24gPj4gMTY7IH0KKyAgdWludDE2X3QgZ2V0TWlub3JWZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gU3VmZml4LT5WZXJzaW9uOyB9CisgIHVpbnQzMl90IGdldENoYXJhY3RlcmlzdGljcygpIGNvbnN0IHsgcmV0dXJuIFN1ZmZpeC0+Q2hhcmFjdGVyaXN0aWNzOyB9CisgIEFycmF5UmVmPHVpbnQ4X3Q+IGdldERhdGEoKSBjb25zdCB7IHJldHVybiBEYXRhOyB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBXaW5kb3dzUmVzb3VyY2U7CisKKyAgUmVzb3VyY2VFbnRyeVJlZihCaW5hcnlTdHJlYW1SZWYgUmVmLCBjb25zdCBXaW5kb3dzUmVzb3VyY2UgKk93bmVyKTsKKyAgRXJyb3IgbG9hZE5leHQoKTsKKworICBzdGF0aWMgRXhwZWN0ZWQ8UmVzb3VyY2VFbnRyeVJlZj4gY3JlYXRlKEJpbmFyeVN0cmVhbVJlZiBSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2luZG93c1Jlc291cmNlICpPd25lcik7CisKKyAgQmluYXJ5U3RyZWFtUmVhZGVyIFJlYWRlcjsKKyAgYm9vbCBJc1N0cmluZ1R5cGU7CisgIEFycmF5UmVmPFVURjE2PiBUeXBlOworICB1aW50MTZfdCBUeXBlSUQ7CisgIGJvb2wgSXNTdHJpbmdOYW1lOworICBBcnJheVJlZjxVVEYxNj4gTmFtZTsKKyAgdWludDE2X3QgTmFtZUlEOworICBjb25zdCBXaW5SZXNIZWFkZXJTdWZmaXggKlN1ZmZpeCA9IG51bGxwdHI7CisgIEFycmF5UmVmPHVpbnQ4X3Q+IERhdGE7Cit9OworCitjbGFzcyBXaW5kb3dzUmVzb3VyY2UgOiBwdWJsaWMgQmluYXJ5IHsKK3B1YmxpYzoKKyAgRXhwZWN0ZWQ8UmVzb3VyY2VFbnRyeVJlZj4gZ2V0SGVhZEVudHJ5KCk7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBCaW5hcnkgKlYpIHsgcmV0dXJuIFYtPmlzV2luUmVzKCk7IH0KKworICBzdGF0aWMgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPFdpbmRvd3NSZXNvdXJjZT4+CisgIGNyZWF0ZVdpbmRvd3NSZXNvdXJjZShNZW1vcnlCdWZmZXJSZWYgU291cmNlKTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFJlc291cmNlRW50cnlSZWY7CisKKyAgV2luZG93c1Jlc291cmNlKE1lbW9yeUJ1ZmZlclJlZiBTb3VyY2UpOworCisgIEJpbmFyeUJ5dGVTdHJlYW0gQkJTOworfTsKKworY2xhc3MgV2luZG93c1Jlc291cmNlUGFyc2VyIHsKK3B1YmxpYzoKKyAgY2xhc3MgVHJlZU5vZGU7CisgIFdpbmRvd3NSZXNvdXJjZVBhcnNlcigpOworICBFcnJvciBwYXJzZShXaW5kb3dzUmVzb3VyY2UgKldSKTsKKyAgdm9pZCBwcmludFRyZWUocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgY29uc3QgVHJlZU5vZGUgJmdldFRyZWUoKSBjb25zdCB7IHJldHVybiBSb290OyB9CisgIGNvbnN0IEFycmF5UmVmPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBnZXREYXRhKCkgY29uc3QgeyByZXR1cm4gRGF0YTsgfQorICBjb25zdCBBcnJheVJlZjxzdGQ6OnZlY3RvcjxVVEYxNj4+IGdldFN0cmluZ1RhYmxlKCkgY29uc3QgeworICAgIHJldHVybiBTdHJpbmdUYWJsZTsKKyAgfQorCisgIGNsYXNzIFRyZWVOb2RlIHsKKyAgcHVibGljOgorICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICAgIHVzaW5nIENoaWxkcmVuID0gc3RkOjptYXA8VCwgc3RkOjp1bmlxdWVfcHRyPFRyZWVOb2RlPj47CisKKyAgICB2b2lkIHByaW50KFNjb3BlZFByaW50ZXIgJldyaXRlciwgU3RyaW5nUmVmIE5hbWUpIGNvbnN0OworICAgIHVpbnQzMl90IGdldFRyZWVTaXplKCkgY29uc3Q7CisgICAgdWludDMyX3QgZ2V0U3RyaW5nSW5kZXgoKSBjb25zdCB7IHJldHVybiBTdHJpbmdJbmRleDsgfQorICAgIHVpbnQzMl90IGdldERhdGFJbmRleCgpIGNvbnN0IHsgcmV0dXJuIERhdGFJbmRleDsgfQorICAgIHVpbnQxNl90IGdldE1ham9yVmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIE1ham9yVmVyc2lvbjsgfQorICAgIHVpbnQxNl90IGdldE1pbm9yVmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIE1pbm9yVmVyc2lvbjsgfQorICAgIHVpbnQzMl90IGdldENoYXJhY3RlcmlzdGljcygpIGNvbnN0IHsgcmV0dXJuIENoYXJhY3RlcmlzdGljczsgfQorICAgIGJvb2wgY2hlY2tJc0RhdGFOb2RlKCkgY29uc3QgeyByZXR1cm4gSXNEYXRhTm9kZTsgfQorICAgIGNvbnN0IENoaWxkcmVuPHVpbnQzMl90PiAmZ2V0SURDaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIElEQ2hpbGRyZW47IH0KKyAgICBjb25zdCBDaGlsZHJlbjxzdGQ6OnN0cmluZz4gJmdldFN0cmluZ0NoaWxkcmVuKCkgY29uc3QgeworICAgICAgcmV0dXJuIFN0cmluZ0NoaWxkcmVuOworICAgIH0KKworICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBXaW5kb3dzUmVzb3VyY2VQYXJzZXI7CisKKyAgICBzdGF0aWMgdWludDMyX3QgU3RyaW5nQ291bnQ7CisgICAgc3RhdGljIHVpbnQzMl90IERhdGFDb3VudDsKKworICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8VHJlZU5vZGU+IGNyZWF0ZVN0cmluZ05vZGUoKTsKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFRyZWVOb2RlPiBjcmVhdGVJRE5vZGUoKTsKKyAgICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFRyZWVOb2RlPiBjcmVhdGVEYXRhTm9kZSh1aW50MTZfdCBNYWpvclZlcnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QgTWlub3JWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IENoYXJhY3RlcmlzdGljcyk7CisKKyAgICBleHBsaWNpdCBUcmVlTm9kZShib29sIElzU3RyaW5nTm9kZSk7CisgICAgVHJlZU5vZGUodWludDE2X3QgTWFqb3JWZXJzaW9uLCB1aW50MTZfdCBNaW5vclZlcnNpb24sCisgICAgICAgICAgICAgdWludDMyX3QgQ2hhcmFjdGVyaXN0aWNzKTsKKworICAgIHZvaWQgYWRkRW50cnkoY29uc3QgUmVzb3VyY2VFbnRyeVJlZiAmRW50cnksIGJvb2wgJklzTmV3VHlwZVN0cmluZywKKyAgICAgICAgICAgICAgICAgIGJvb2wgJklzTmV3TmFtZVN0cmluZyk7CisgICAgVHJlZU5vZGUgJmFkZFR5cGVOb2RlKGNvbnN0IFJlc291cmNlRW50cnlSZWYgJkVudHJ5LCBib29sICZJc05ld1R5cGVTdHJpbmcpOworICAgIFRyZWVOb2RlICZhZGROYW1lTm9kZShjb25zdCBSZXNvdXJjZUVudHJ5UmVmICZFbnRyeSwgYm9vbCAmSXNOZXdOYW1lU3RyaW5nKTsKKyAgICBUcmVlTm9kZSAmYWRkTGFuZ3VhZ2VOb2RlKGNvbnN0IFJlc291cmNlRW50cnlSZWYgJkVudHJ5KTsKKyAgICBUcmVlTm9kZSAmYWRkQ2hpbGQodWludDMyX3QgSUQsIGJvb2wgSXNEYXRhTm9kZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCBNYWpvclZlcnNpb24gPSAwLCB1aW50MTZfdCBNaW5vclZlcnNpb24gPSAwLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBDaGFyYWN0ZXJpc3RpY3MgPSAwKTsKKyAgICBUcmVlTm9kZSAmYWRkQ2hpbGQoQXJyYXlSZWY8VVRGMTY+IE5hbWVSZWYsIGJvb2wgJklzTmV3U3RyaW5nKTsKKworICAgIGJvb2wgSXNEYXRhTm9kZSA9IGZhbHNlOworICAgIHVpbnQzMl90IFN0cmluZ0luZGV4OworICAgIHVpbnQzMl90IERhdGFJbmRleDsKKyAgICBDaGlsZHJlbjx1aW50MzJfdD4gSURDaGlsZHJlbjsKKyAgICBDaGlsZHJlbjxzdGQ6OnN0cmluZz4gU3RyaW5nQ2hpbGRyZW47CisgICAgdWludDE2X3QgTWFqb3JWZXJzaW9uID0gMDsKKyAgICB1aW50MTZfdCBNaW5vclZlcnNpb24gPSAwOworICAgIHVpbnQzMl90IENoYXJhY3RlcmlzdGljcyA9IDA7CisgIH07CisKK3ByaXZhdGU6CisgIFRyZWVOb2RlIFJvb3Q7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+PiBEYXRhOworICBzdGQ6OnZlY3RvcjxzdGQ6OnZlY3RvcjxVVEYxNj4+IFN0cmluZ1RhYmxlOworfTsKKworRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4+Cit3cml0ZVdpbmRvd3NSZXNvdXJjZUNPRkYobGx2bTo6Q09GRjo6TWFjaGluZVR5cGVzIE1hY2hpbmVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFdpbmRvd3NSZXNvdXJjZVBhcnNlciAmUGFyc2VyKTsKKworfSAvLyBuYW1lc3BhY2Ugb2JqZWN0Cit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML0NPRkZZQU1MLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdFlBTUwvQ09GRllBTUwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Nzk0ZWFhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML0NPRkZZQU1MLmgKQEAgLTAsMCArMSwyNTAgQEAKKy8vPT09LSBDT0ZGWUFNTC5oIC0gQ09GRiBZQU1MSU8gaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIGNsYXNzZXMgZm9yIGhhbmRsaW5nIHRoZSBZQU1MIHJlcHJlc2VudGF0aW9uIG9mIENPRkYuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVFlBTUxfQ09GRllBTUxfSAorI2RlZmluZSBMTFZNX09CSkVDVFlBTUxfQ09GRllBTUxfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9DT0ZGLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3RZQU1ML0NvZGVWaWV3WUFNTERlYnVnU2VjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdFlBTUwvQ29kZVZpZXdZQU1MVHlwZUhhc2hpbmcuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdFlBTUwvQ29kZVZpZXdZQU1MVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdFlBTUwvWUFNTC5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBDT0ZGIHsKKworaW5saW5lIENoYXJhY3RlcmlzdGljcyBvcGVyYXRvcnwoQ2hhcmFjdGVyaXN0aWNzIGEsIENoYXJhY3RlcmlzdGljcyBiKSB7CisgIHVpbnQzMl90IFJldCA9IHN0YXRpY19jYXN0PHVpbnQzMl90PihhKSB8IHN0YXRpY19jYXN0PHVpbnQzMl90PihiKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PENoYXJhY3RlcmlzdGljcz4oUmV0KTsKK30KKworaW5saW5lIFNlY3Rpb25DaGFyYWN0ZXJpc3RpY3Mgb3BlcmF0b3J8KFNlY3Rpb25DaGFyYWN0ZXJpc3RpY3MgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZWN0aW9uQ2hhcmFjdGVyaXN0aWNzIGIpIHsKKyAgdWludDMyX3QgUmV0ID0gc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGEpIHwgc3RhdGljX2Nhc3Q8dWludDMyX3Q+KGIpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8U2VjdGlvbkNoYXJhY3RlcmlzdGljcz4oUmV0KTsKK30KKworaW5saW5lIERMTENoYXJhY3RlcmlzdGljcyBvcGVyYXRvcnwoRExMQ2hhcmFjdGVyaXN0aWNzIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBETExDaGFyYWN0ZXJpc3RpY3MgYikgeworICB1aW50MTZfdCBSZXQgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oYSkgfCBzdGF0aWNfY2FzdDx1aW50MTZfdD4oYik7CisgIHJldHVybiBzdGF0aWNfY2FzdDxETExDaGFyYWN0ZXJpc3RpY3M+KFJldCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBDT0ZGCisKKy8vIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIHlhbWwgZmlsZXMgaXMgbm90IGFuIGV4YWN0IDE6MSBtYXRjaCB0byBDT0ZGLiBJbiBvcmRlcgorLy8gdG8gdXNlIHlhbWw6OklPLCB3ZSB1c2UgdGhlc2Ugc3RydWN0dXJlcyB3aGljaCBhcmUgY2xvc2VyIHRvIHRoZSBzb3VyY2UuCituYW1lc3BhY2UgQ09GRllBTUwgeworCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDhfdCwgQ09NREFUVHlwZSkKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50MzJfdCwgV2Vha0V4dGVybmFsQ2hhcmFjdGVyaXN0aWNzKQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQ4X3QsIEF1eFN5bWJvbFR5cGUpCisKK3N0cnVjdCBSZWxvY2F0aW9uIHsKKyAgdWludDMyX3QgVmlydHVhbEFkZHJlc3M7CisgIHVpbnQxNl90IFR5cGU7CisgIFN0cmluZ1JlZiBTeW1ib2xOYW1lOworfTsKKworc3RydWN0IFNlY3Rpb24geworICBDT0ZGOjpzZWN0aW9uIEhlYWRlcjsKKyAgdW5zaWduZWQgQWxpZ25tZW50ID0gMDsKKyAgeWFtbDo6QmluYXJ5UmVmIFNlY3Rpb25EYXRhOworICBzdGQ6OnZlY3RvcjxDb2RlVmlld1lBTUw6OllBTUxEZWJ1Z1N1YnNlY3Rpb24+IERlYnVnUzsKKyAgc3RkOjp2ZWN0b3I8Q29kZVZpZXdZQU1MOjpMZWFmUmVjb3JkPiBEZWJ1Z1Q7CisgIE9wdGlvbmFsPENvZGVWaWV3WUFNTDo6RGVidWdIU2VjdGlvbj4gRGVidWdIOworICBzdGQ6OnZlY3RvcjxSZWxvY2F0aW9uPiBSZWxvY2F0aW9uczsKKyAgU3RyaW5nUmVmIE5hbWU7CisKKyAgU2VjdGlvbigpOworfTsKKworc3RydWN0IFN5bWJvbCB7CisgIENPRkY6OnN5bWJvbCBIZWFkZXI7CisgIENPRkY6OlN5bWJvbEJhc2VUeXBlIFNpbXBsZVR5cGUgPSBDT0ZGOjpJTUFHRV9TWU1fVFlQRV9OVUxMOworICBDT0ZGOjpTeW1ib2xDb21wbGV4VHlwZSBDb21wbGV4VHlwZSA9IENPRkY6OklNQUdFX1NZTV9EVFlQRV9OVUxMOworICBPcHRpb25hbDxDT0ZGOjpBdXhpbGlhcnlGdW5jdGlvbkRlZmluaXRpb24+IEZ1bmN0aW9uRGVmaW5pdGlvbjsKKyAgT3B0aW9uYWw8Q09GRjo6QXV4aWxpYXJ5YmZBbmRlZlN5bWJvbD4gYmZBbmRlZlN5bWJvbDsKKyAgT3B0aW9uYWw8Q09GRjo6QXV4aWxpYXJ5V2Vha0V4dGVybmFsPiBXZWFrRXh0ZXJuYWw7CisgIFN0cmluZ1JlZiBGaWxlOworICBPcHRpb25hbDxDT0ZGOjpBdXhpbGlhcnlTZWN0aW9uRGVmaW5pdGlvbj4gU2VjdGlvbkRlZmluaXRpb247CisgIE9wdGlvbmFsPENPRkY6OkF1eGlsaWFyeUNMUlRva2VuPiBDTFJUb2tlbjsKKyAgU3RyaW5nUmVmIE5hbWU7CisKKyAgU3ltYm9sKCk7Cit9OworCitzdHJ1Y3QgUEVIZWFkZXIgeworICBDT0ZGOjpQRTMySGVhZGVyIEhlYWRlcjsKKyAgT3B0aW9uYWw8Q09GRjo6RGF0YURpcmVjdG9yeT4gRGF0YURpcmVjdG9yaWVzW0NPRkY6Ok5VTV9EQVRBX0RJUkVDVE9SSUVTXTsKK307CisKK3N0cnVjdCBPYmplY3QgeworICBPcHRpb25hbDxQRUhlYWRlcj4gT3B0aW9uYWxIZWFkZXI7CisgIENPRkY6OmhlYWRlciBIZWFkZXI7CisgIHN0ZDo6dmVjdG9yPFNlY3Rpb24+IFNlY3Rpb25zOworICBzdGQ6OnZlY3RvcjxTeW1ib2w+IFN5bWJvbHM7CisKKyAgT2JqZWN0KCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ09GRllBTUwKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihDT0ZGWUFNTDo6U2VjdGlvbikKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IoQ09GRllBTUw6OlN5bWJvbCkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IoQ09GRllBTUw6OlJlbG9jYXRpb24pCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSB5YW1sIHsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxDT0ZGWUFNTDo6V2Vha0V4dGVybmFsQ2hhcmFjdGVyaXN0aWNzPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgQ09GRllBTUw6OldlYWtFeHRlcm5hbENoYXJhY3RlcmlzdGljcyAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxDT0ZGWUFNTDo6QXV4U3ltYm9sVHlwZT4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIENPRkZZQU1MOjpBdXhTeW1ib2xUeXBlICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPENPRkZZQU1MOjpDT01EQVRUeXBlPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgQ09GRllBTUw6OkNPTURBVFR5cGUgJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8Q09GRjo6TWFjaGluZVR5cGVzPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgQ09GRjo6TWFjaGluZVR5cGVzICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPENPRkY6OlN5bWJvbEJhc2VUeXBlPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgQ09GRjo6U3ltYm9sQmFzZVR5cGUgJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8Q09GRjo6U3ltYm9sU3RvcmFnZUNsYXNzPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgQ09GRjo6U3ltYm9sU3RvcmFnZUNsYXNzICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPENPRkY6OlN5bWJvbENvbXBsZXhUeXBlPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgQ09GRjo6U3ltYm9sQ29tcGxleFR5cGUgJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8Q09GRjo6UmVsb2NhdGlvblR5cGVJMzg2PiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgQ09GRjo6UmVsb2NhdGlvblR5cGVJMzg2ICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPENPRkY6OlJlbG9jYXRpb25UeXBlQU1ENjQ+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBDT0ZGOjpSZWxvY2F0aW9uVHlwZUFNRDY0ICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPENPRkY6OlJlbG9jYXRpb25UeXBlc0FSTT4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIENPRkY6OlJlbG9jYXRpb25UeXBlc0FSTSAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxDT0ZGOjpSZWxvY2F0aW9uVHlwZXNBUk02ND4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIENPRkY6OlJlbG9jYXRpb25UeXBlc0FSTTY0ICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPENPRkY6OldpbmRvd3NTdWJzeXN0ZW0+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBDT0ZGOjpXaW5kb3dzU3Vic3lzdGVtICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckJpdFNldFRyYWl0czxDT0ZGOjpDaGFyYWN0ZXJpc3RpY3M+IHsKKyAgc3RhdGljIHZvaWQgYml0c2V0KElPICZJTywgQ09GRjo6Q2hhcmFjdGVyaXN0aWNzICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckJpdFNldFRyYWl0czxDT0ZGOjpTZWN0aW9uQ2hhcmFjdGVyaXN0aWNzPiB7CisgIHN0YXRpYyB2b2lkIGJpdHNldChJTyAmSU8sIENPRkY6OlNlY3Rpb25DaGFyYWN0ZXJpc3RpY3MgJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2NhbGFyQml0U2V0VHJhaXRzPENPRkY6OkRMTENoYXJhY3RlcmlzdGljcz4geworICBzdGF0aWMgdm9pZCBiaXRzZXQoSU8gJklPLCBDT0ZGOjpETExDaGFyYWN0ZXJpc3RpY3MgJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgTWFwcGluZ1RyYWl0czxDT0ZGWUFNTDo6UmVsb2NhdGlvbj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgQ09GRllBTUw6OlJlbG9jYXRpb24gJlJlbCk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE1hcHBpbmdUcmFpdHM8Q09GRllBTUw6OlBFSGVhZGVyPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBDT0ZGWUFNTDo6UEVIZWFkZXIgJlBIKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgTWFwcGluZ1RyYWl0czxDT0ZGOjpEYXRhRGlyZWN0b3J5PiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBDT0ZGOjpEYXRhRGlyZWN0b3J5ICZERCk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE1hcHBpbmdUcmFpdHM8Q09GRjo6aGVhZGVyPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBDT0ZGOjpoZWFkZXIgJkgpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8Q09GRjo6QXV4aWxpYXJ5RnVuY3Rpb25EZWZpbml0aW9uPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBDT0ZGOjpBdXhpbGlhcnlGdW5jdGlvbkRlZmluaXRpb24gJkFGRCk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxDT0ZGOjpBdXhpbGlhcnliZkFuZGVmU3ltYm9sPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBDT0ZGOjpBdXhpbGlhcnliZkFuZGVmU3ltYm9sICZBQVMpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8Q09GRjo6QXV4aWxpYXJ5V2Vha0V4dGVybmFsPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBDT0ZGOjpBdXhpbGlhcnlXZWFrRXh0ZXJuYWwgJkFXRSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxDT0ZGOjpBdXhpbGlhcnlTZWN0aW9uRGVmaW5pdGlvbj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgQ09GRjo6QXV4aWxpYXJ5U2VjdGlvbkRlZmluaXRpb24gJkFTRCk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxDT0ZGOjpBdXhpbGlhcnlDTFJUb2tlbj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgQ09GRjo6QXV4aWxpYXJ5Q0xSVG9rZW4gJkFDVCk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE1hcHBpbmdUcmFpdHM8Q09GRllBTUw6OlN5bWJvbD4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgQ09GRllBTUw6OlN5bWJvbCAmUyk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IE1hcHBpbmdUcmFpdHM8Q09GRllBTUw6OlNlY3Rpb24+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIENPRkZZQU1MOjpTZWN0aW9uICZTZWMpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBNYXBwaW5nVHJhaXRzPENPRkZZQU1MOjpPYmplY3Q+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIENPRkZZQU1MOjpPYmplY3QgJk9iaik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgeWFtbAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fT0JKRUNUWUFNTF9DT0ZGWUFNTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdFlBTUwvQ29kZVZpZXdZQU1MRGVidWdTZWN0aW9ucy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML0NvZGVWaWV3WUFNTERlYnVnU2VjdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjIwMDA4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML0NvZGVWaWV3WUFNTERlYnVnU2VjdGlvbnMuaApAQCAtMCwwICsxLDE0MCBAQAorLy89LSBDb2RlVmlld1lBTUxEZWJ1Z1NlY3Rpb25zLmggLSBDb2RlVmlldyBZQU1MSU8gZGVidWcgc2VjdGlvbnMgLSotIEMrKyAtKi09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBjbGFzc2VzIGZvciBoYW5kbGluZyB0aGUgWUFNTCByZXByZXNlbnRhdGlvbiBvZiBDb2RlVmlldworLy8gRGVidWcgSW5mby4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUWUFNTF9DT0RFVklFV1lBTUxERUJVR1NFQ1RJT05TX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RZQU1MX0NPREVWSUVXWUFNTERFQlVHU0VDVElPTlNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9Db2RlVmlldy5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3Vic2VjdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vRGVidWdJbmZvL0NvZGVWaWV3L0RlYnVnU3Vic2VjdGlvblJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9ZQU1MVHJhaXRzLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBjb2RldmlldyB7CisKK2NsYXNzIFN0cmluZ3NBbmRDaGVja3N1bXM7CitjbGFzcyBTdHJpbmdzQW5kQ2hlY2tzdW1zUmVmOworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29kZXZpZXcKKworbmFtZXNwYWNlIENvZGVWaWV3WUFNTCB7CisKK25hbWVzcGFjZSBkZXRhaWwgeworCitzdHJ1Y3QgWUFNTFN1YnNlY3Rpb25CYXNlOworCit9IC8vIGVuZCBuYW1lc3BhY2UgZGV0YWlsCisKK3N0cnVjdCBZQU1MRnJhbWVEYXRhIHsKKyAgdWludDMyX3QgUnZhU3RhcnQ7CisgIHVpbnQzMl90IENvZGVTaXplOworICB1aW50MzJfdCBMb2NhbFNpemU7CisgIHVpbnQzMl90IFBhcmFtc1NpemU7CisgIHVpbnQzMl90IE1heFN0YWNrU2l6ZTsKKyAgU3RyaW5nUmVmIEZyYW1lRnVuYzsKKyAgdWludDMyX3QgUHJvbG9nU2l6ZTsKKyAgdWludDMyX3QgU2F2ZWRSZWdzU2l6ZTsKKyAgdWludDMyX3QgRmxhZ3M7Cit9OworCitzdHJ1Y3QgWUFNTENyb3NzTW9kdWxlSW1wb3J0IHsKKyAgU3RyaW5nUmVmIE1vZHVsZU5hbWU7CisgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBJbXBvcnRJZHM7Cit9OworCitzdHJ1Y3QgU291cmNlTGluZUVudHJ5IHsKKyAgdWludDMyX3QgT2Zmc2V0OworICB1aW50MzJfdCBMaW5lU3RhcnQ7CisgIHVpbnQzMl90IEVuZERlbHRhOworICBib29sIElzU3RhdGVtZW50OworfTsKKworc3RydWN0IFNvdXJjZUNvbHVtbkVudHJ5IHsKKyAgdWludDE2X3QgU3RhcnRDb2x1bW47CisgIHVpbnQxNl90IEVuZENvbHVtbjsKK307CisKK3N0cnVjdCBTb3VyY2VMaW5lQmxvY2sgeworICBTdHJpbmdSZWYgRmlsZU5hbWU7CisgIHN0ZDo6dmVjdG9yPFNvdXJjZUxpbmVFbnRyeT4gTGluZXM7CisgIHN0ZDo6dmVjdG9yPFNvdXJjZUNvbHVtbkVudHJ5PiBDb2x1bW5zOworfTsKKworc3RydWN0IEhleEZvcm1hdHRlZFN0cmluZyB7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEJ5dGVzOworfTsKKworc3RydWN0IFNvdXJjZUZpbGVDaGVja3N1bUVudHJ5IHsKKyAgU3RyaW5nUmVmIEZpbGVOYW1lOworICBjb2Rldmlldzo6RmlsZUNoZWNrc3VtS2luZCBLaW5kOworICBIZXhGb3JtYXR0ZWRTdHJpbmcgQ2hlY2tzdW1CeXRlczsKK307CisKK3N0cnVjdCBTb3VyY2VMaW5lSW5mbyB7CisgIHVpbnQzMl90IFJlbG9jT2Zmc2V0OworICB1aW50MzJfdCBSZWxvY1NlZ21lbnQ7CisgIGNvZGV2aWV3OjpMaW5lRmxhZ3MgRmxhZ3M7CisgIHVpbnQzMl90IENvZGVTaXplOworICBzdGQ6OnZlY3RvcjxTb3VyY2VMaW5lQmxvY2s+IEJsb2NrczsKK307CisKK3N0cnVjdCBJbmxpbmVlU2l0ZSB7CisgIHVpbnQzMl90IElubGluZWU7CisgIFN0cmluZ1JlZiBGaWxlTmFtZTsKKyAgdWludDMyX3QgU291cmNlTGluZU51bTsKKyAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBFeHRyYUZpbGVzOworfTsKKworc3RydWN0IElubGluZWVJbmZvIHsKKyAgYm9vbCBIYXNFeHRyYUZpbGVzOworICBzdGQ6OnZlY3RvcjxJbmxpbmVlU2l0ZT4gU2l0ZXM7Cit9OworCitzdHJ1Y3QgWUFNTERlYnVnU3Vic2VjdGlvbiB7CisgIHN0YXRpYyBFeHBlY3RlZDxZQU1MRGVidWdTdWJzZWN0aW9uPgorICBmcm9tQ29kZVZpZXdTdWJlY3Rpb24oY29uc3QgY29kZXZpZXc6OlN0cmluZ3NBbmRDaGVja3N1bXNSZWYgJlNDLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZXZpZXc6OkRlYnVnU3Vic2VjdGlvblJlY29yZCAmU1MpOworCisgIHN0ZDo6c2hhcmVkX3B0cjxkZXRhaWw6OllBTUxTdWJzZWN0aW9uQmFzZT4gU3Vic2VjdGlvbjsKK307CisKK3N0cnVjdCBEZWJ1Z1N1YnNlY3Rpb25TdGF0ZSB7fTsKKworRXhwZWN0ZWQ8c3RkOjp2ZWN0b3I8c3RkOjpzaGFyZWRfcHRyPGNvZGV2aWV3OjpEZWJ1Z1N1YnNlY3Rpb24+Pj4KK3RvQ29kZVZpZXdTdWJzZWN0aW9uTGlzdChCdW1wUHRyQWxsb2NhdG9yICZBbGxvY2F0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8WUFNTERlYnVnU3Vic2VjdGlvbj4gU3Vic2VjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY29kZXZpZXc6OlN0cmluZ3NBbmRDaGVja3N1bXMgJlNDKTsKKworc3RkOjp2ZWN0b3I8WUFNTERlYnVnU3Vic2VjdGlvbj4KK2Zyb21EZWJ1Z1MoQXJyYXlSZWY8dWludDhfdD4gRGF0YSwgY29uc3QgY29kZXZpZXc6OlN0cmluZ3NBbmRDaGVja3N1bXNSZWYgJlNDKTsKKwordm9pZCBpbml0aWFsaXplU3RyaW5nc0FuZENoZWNrc3VtcyhBcnJheVJlZjxZQU1MRGVidWdTdWJzZWN0aW9uPiBTZWN0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29kZXZpZXc6OlN0cmluZ3NBbmRDaGVja3N1bXMgJlNDKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENvZGVWaWV3WUFNTAorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCitMTFZNX1lBTUxfREVDTEFSRV9NQVBQSU5HX1RSQUlUUyhDb2RlVmlld1lBTUw6OllBTUxEZWJ1Z1N1YnNlY3Rpb24pCisKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IoQ29kZVZpZXdZQU1MOjpZQU1MRGVidWdTdWJzZWN0aW9uKQorCisjZW5kaWYgLy8gTExWTV9PQkpFQ1RZQU1MX0NPREVWSUVXWUFNTERFQlVHU0VDVElPTlNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML0NvZGVWaWV3WUFNTFN5bWJvbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9Db2RlVmlld1lBTUxTeW1ib2xzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkxMTkzYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9Db2RlVmlld1lBTUxTeW1ib2xzLmgKQEAgLTAsMCArMSw0OSBAQAorLy89PT0tIENvZGVWaWV3WUFNTFN5bWJvbHMuaCAtIENvZGVWaWV3IFlBTUxJTyBTeW1ib2wgaW1wbGVtZW50YXRpb24gLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBjbGFzc2VzIGZvciBoYW5kbGluZyB0aGUgWUFNTCByZXByZXNlbnRhdGlvbiBvZiBDb2RlVmlldworLy8gRGVidWcgSW5mby4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUWUFNTF9DT0RFVklFV1lBTUxTWU1CT0xTX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RZQU1MX0NPREVWSUVXWUFNTFNZTUJPTFNfSAorCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvQ29kZVZpZXcuaCIKKyNpbmNsdWRlICJsbHZtL0RlYnVnSW5mby9Db2RlVmlldy9TeW1ib2xSZWNvcmQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvWUFNTFRyYWl0cy5oIgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIENvZGVWaWV3WUFNTCB7CisKK25hbWVzcGFjZSBkZXRhaWwgeworCitzdHJ1Y3QgU3ltYm9sUmVjb3JkQmFzZTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAorCitzdHJ1Y3QgU3ltYm9sUmVjb3JkIHsKKyAgc3RkOjpzaGFyZWRfcHRyPGRldGFpbDo6U3ltYm9sUmVjb3JkQmFzZT4gU3ltYm9sOworCisgIGNvZGV2aWV3OjpDVlN5bWJvbAorICB0b0NvZGVWaWV3U3ltYm9sKEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvciwKKyAgICAgICAgICAgICAgICAgICBjb2Rldmlldzo6Q29kZVZpZXdDb250YWluZXIgQ29udGFpbmVyKSBjb25zdDsKKworICBzdGF0aWMgRXhwZWN0ZWQ8U3ltYm9sUmVjb3JkPiBmcm9tQ29kZVZpZXdTeW1ib2woY29kZXZpZXc6OkNWU3ltYm9sIFN5bWJvbCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ29kZVZpZXdZQU1MCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCitMTFZNX1lBTUxfREVDTEFSRV9NQVBQSU5HX1RSQUlUUyhDb2RlVmlld1lBTUw6OlN5bWJvbFJlY29yZCkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IoQ29kZVZpZXdZQU1MOjpTeW1ib2xSZWNvcmQpCisKKyNlbmRpZiAvLyBMTFZNX09CSkVDVFlBTUxfQ09ERVZJRVdZQU1MU1lNQk9MU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdFlBTUwvQ29kZVZpZXdZQU1MVHlwZUhhc2hpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9Db2RlVmlld1lBTUxUeXBlSGFzaGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMGQ5ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdFlBTUwvQ29kZVZpZXdZQU1MVHlwZUhhc2hpbmcuaApAQCAtMCwwICsxLDYyIEBACisvLz09LSBDb2RlVmlld1lBTUxUeXBlSGFzaGluZy5oIC0gQ29kZVZpZXcgWUFNTElPIFR5cGUgaGFzaGluZyAtLS0tKi0gQysrLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGNsYXNzZXMgZm9yIGhhbmRsaW5nIHRoZSBZQU1MIHJlcHJlc2VudGF0aW9uIG9mIENvZGVWaWV3CisvLyBEZWJ1ZyBJbmZvLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RZQU1MX0NPREVWSUVXWUFNTFRZUEVIQVNISU5HX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RZQU1MX0NPREVWSUVXWUFNTFRZUEVIQVNISU5HX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZUhhc2hpbmcuaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdFlBTUwvWUFNTC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvWUFNTFRyYWl0cy5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgQ29kZVZpZXdZQU1MIHsKKworc3RydWN0IEdsb2JhbEhhc2ggeworICBHbG9iYWxIYXNoKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBHbG9iYWxIYXNoKFN0cmluZ1JlZiBTKSA6IEhhc2goUykgeworICAgIGFzc2VydChTLnNpemUoKSA9PSAyMCAmJiAiSW52YWxpZCBoYXNoIHNpemUhIik7CisgIH0KKyAgZXhwbGljaXQgR2xvYmFsSGFzaChBcnJheVJlZjx1aW50OF90PiBTKSA6IEhhc2goUykgeworICAgIGFzc2VydChTLnNpemUoKSA9PSAyMCAmJiAiSW52YWxpZCBoYXNoIHNpemUhIik7CisgIH0KKyAgeWFtbDo6QmluYXJ5UmVmIEhhc2g7Cit9OworCitzdHJ1Y3QgRGVidWdIU2VjdGlvbiB7CisgIHVpbnQzMl90IE1hZ2ljOworICB1aW50MTZfdCBWZXJzaW9uOworICB1aW50MTZfdCBIYXNoQWxnb3JpdGhtOworICBzdGQ6OnZlY3RvcjxHbG9iYWxIYXNoPiBIYXNoZXM7Cit9OworCitEZWJ1Z0hTZWN0aW9uIGZyb21EZWJ1Z0goQXJyYXlSZWY8dWludDhfdD4gRGVidWdUKTsKK0FycmF5UmVmPHVpbnQ4X3Q+IHRvRGVidWdIKGNvbnN0IERlYnVnSFNlY3Rpb24gJkRlYnVnSCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENvZGVWaWV3WUFNTAorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCitMTFZNX1lBTUxfREVDTEFSRV9NQVBQSU5HX1RSQUlUUyhDb2RlVmlld1lBTUw6OkRlYnVnSFNlY3Rpb24pCitMTFZNX1lBTUxfREVDTEFSRV9TQ0FMQVJfVFJBSVRTKENvZGVWaWV3WUFNTDo6R2xvYmFsSGFzaCwgUXVvdGluZ1R5cGU6Ok5vbmUpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKENvZGVWaWV3WUFNTDo6R2xvYmFsSGFzaCkKKworI2VuZGlmIC8vIExMVk1fT0JKRUNUWUFNTF9DT0RFVklFV1lBTUxUWVBFU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdFlBTUwvQ29kZVZpZXdZQU1MVHlwZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9Db2RlVmlld1lBTUxUeXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJjM2I1NTYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdFlBTUwvQ29kZVZpZXdZQU1MVHlwZXMuaApAQCAtMCwwICsxLDY5IEBACisvLz09LSBDb2RlVmlld1lBTUxUeXBlcy5oIC0gQ29kZVZpZXcgWUFNTElPIFR5cGUgaW1wbGVtZW50YXRpb24gLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGNsYXNzZXMgZm9yIGhhbmRsaW5nIHRoZSBZQU1MIHJlcHJlc2VudGF0aW9uIG9mIENvZGVWaWV3CisvLyBEZWJ1ZyBJbmZvLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RZQU1MX0NPREVWSUVXWUFNTFRZUEVTX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RZQU1MX0NPREVWSUVXWUFNTFRZUEVTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9EZWJ1Z0luZm8vQ29kZVZpZXcvVHlwZVJlY29yZC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvWUFNTFRyYWl0cy5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgY29kZXZpZXcgeworY2xhc3MgQXBwZW5kaW5nVHlwZVRhYmxlQnVpbGRlcjsKK30KKworbmFtZXNwYWNlIENvZGVWaWV3WUFNTCB7CisKK25hbWVzcGFjZSBkZXRhaWwgeworCitzdHJ1Y3QgTGVhZlJlY29yZEJhc2U7CitzdHJ1Y3QgTWVtYmVyUmVjb3JkQmFzZTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAorCitzdHJ1Y3QgTWVtYmVyUmVjb3JkIHsKKyAgc3RkOjpzaGFyZWRfcHRyPGRldGFpbDo6TWVtYmVyUmVjb3JkQmFzZT4gTWVtYmVyOworfTsKKworc3RydWN0IExlYWZSZWNvcmQgeworICBzdGQ6OnNoYXJlZF9wdHI8ZGV0YWlsOjpMZWFmUmVjb3JkQmFzZT4gTGVhZjsKKworICBjb2Rldmlldzo6Q1ZUeXBlCisgIHRvQ29kZVZpZXdSZWNvcmQoY29kZXZpZXc6OkFwcGVuZGluZ1R5cGVUYWJsZUJ1aWxkZXIgJlNlcmlhbGl6ZXIpIGNvbnN0OworICBzdGF0aWMgRXhwZWN0ZWQ8TGVhZlJlY29yZD4gZnJvbUNvZGVWaWV3UmVjb3JkKGNvZGV2aWV3OjpDVlR5cGUgVHlwZSk7Cit9OworCitzdGQ6OnZlY3RvcjxMZWFmUmVjb3JkPiBmcm9tRGVidWdUKEFycmF5UmVmPHVpbnQ4X3Q+IERlYnVnVCk7CitBcnJheVJlZjx1aW50OF90PiB0b0RlYnVnVChBcnJheVJlZjxMZWFmUmVjb3JkPiwgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2MpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgQ29kZVZpZXdZQU1MCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKK0xMVk1fWUFNTF9ERUNMQVJFX1NDQUxBUl9UUkFJVFMoY29kZXZpZXc6OkdVSUQsIFF1b3RpbmdUeXBlOjpTaW5nbGUpCisKK0xMVk1fWUFNTF9ERUNMQVJFX01BUFBJTkdfVFJBSVRTKENvZGVWaWV3WUFNTDo6TGVhZlJlY29yZCkKK0xMVk1fWUFNTF9ERUNMQVJFX01BUFBJTkdfVFJBSVRTKENvZGVWaWV3WUFNTDo6TWVtYmVyUmVjb3JkKQorCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKENvZGVWaWV3WUFNTDo6TGVhZlJlY29yZCkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IoQ29kZVZpZXdZQU1MOjpNZW1iZXJSZWNvcmQpCisKKyNlbmRpZiAvLyBMTFZNX09CSkVDVFlBTUxfQ09ERVZJRVdZQU1MVFlQRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML0RXQVJGRW1pdHRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML0RXQVJGRW1pdHRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkN2Q4YjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdFlBTUwvRFdBUkZFbWl0dGVyLmgKQEAgLTAsMCArMSw0OSBAQAorLy89PT0tLS0gRFdBUkZFbWl0dGVyLmggLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBDb21tb24gZGVjbGFyYXRpb25zIGZvciB5YW1sMm9iagorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVFlBTUxfRFdBUkZFTUlUVEVSX0gKKyNkZWZpbmUgTExWTV9PQkpFQ1RZQU1MX0RXQVJGRU1JVFRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvSG9zdC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBEV0FSRllBTUwgeworCitzdHJ1Y3QgRGF0YTsKK3N0cnVjdCBQdWJTZWN0aW9uOworCit2b2lkIEVtaXREZWJ1Z0FiYnJldihyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IERhdGEgJkRJKTsKK3ZvaWQgRW1pdERlYnVnU3RyKHJhd19vc3RyZWFtICZPUywgY29uc3QgRGF0YSAmREkpOworCit2b2lkIEVtaXREZWJ1Z0FyYW5nZXMocmF3X29zdHJlYW0gJk9TLCBjb25zdCBEYXRhICZESSk7Cit2b2lkIEVtaXRQdWJTZWN0aW9uKHJhd19vc3RyZWFtICZPUywgY29uc3QgUHViU2VjdGlvbiAmU2VjdCwKKyAgICAgICAgICAgICAgICAgICAgYm9vbCBJc0xpdHRsZUVuZGlhbik7Cit2b2lkIEVtaXREZWJ1Z0luZm8ocmF3X29zdHJlYW0gJk9TLCBjb25zdCBEYXRhICZESSk7Cit2b2lkIEVtaXREZWJ1Z0xpbmUocmF3X29zdHJlYW0gJk9TLCBjb25zdCBEYXRhICZESSk7CisKK0V4cGVjdGVkPFN0cmluZ01hcDxzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPj4+CitFbWl0RGVidWdTZWN0aW9ucyhTdHJpbmdSZWYgWUFNTFN0cmluZywKKyAgICAgICAgICAgICAgICAgIGJvb2wgSXNMaXR0bGVFbmRpYW4gPSBzeXM6OklzTGl0dGxlRW5kaWFuSG9zdCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBEV0FSRllBTUwKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fT0JKRUNUWUFNTF9EV0FSRkVNSVRURVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML0RXQVJGWUFNTC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML0RXQVJGWUFNTC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxNjJmMGYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdFlBTUwvRFdBUkZZQU1MLmgKQEAgLTAsMCArMSwzMDkgQEAKKy8vPT09LSBEV0FSRllBTUwuaCAtIERXQVJGIFlBTUxJTyBpbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBUaGlzIGZpbGUgZGVjbGFyZXMgY2xhc3NlcyBmb3IgaGFuZGxpbmcgdGhlIFlBTUwgcmVwcmVzZW50YXRpb24KKy8vLyBvZiBEV0FSRiBEZWJ1ZyBJbmZvLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fT0JKRUNUWUFNTF9EV0FSRllBTUxfSAorI2RlZmluZSBMTFZNX09CSkVDVFlBTUxfRFdBUkZZQU1MX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1lBTUxUcmFpdHMuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIERXQVJGWUFNTCB7CisKK3N0cnVjdCBJbml0aWFsTGVuZ3RoIHsKKyAgdWludDMyX3QgVG90YWxMZW5ndGg7CisgIHVpbnQ2NF90IFRvdGFsTGVuZ3RoNjQ7CisKKyAgYm9vbCBpc0RXQVJGNjQoKSBjb25zdCB7IHJldHVybiBUb3RhbExlbmd0aCA9PSBVSU5UMzJfTUFYOyB9CisKKyAgdWludDY0X3QgZ2V0TGVuZ3RoKCkgY29uc3QgeworICAgIHJldHVybiBpc0RXQVJGNjQoKSA/IFRvdGFsTGVuZ3RoNjQgOiBUb3RhbExlbmd0aDsKKyAgfQorCisgIHZvaWQgc2V0TGVuZ3RoKHVpbnQ2NF90IExlbikgeworICAgIGlmIChMZW4gPj0gKHVpbnQ2NF90KVVJTlQzMl9NQVgpIHsKKyAgICAgIFRvdGFsTGVuZ3RoNjQgPSBMZW47CisgICAgICBUb3RhbExlbmd0aCA9IFVJTlQzMl9NQVg7CisgICAgfSBlbHNlIHsKKyAgICAgIFRvdGFsTGVuZ3RoID0gTGVuOworICAgIH0KKyAgfQorfTsKKworc3RydWN0IEF0dHJpYnV0ZUFiYnJldiB7CisgIGxsdm06OmR3YXJmOjpBdHRyaWJ1dGUgQXR0cmlidXRlOworICBsbHZtOjpkd2FyZjo6Rm9ybSBGb3JtOworICBsbHZtOjp5YW1sOjpIZXg2NCBWYWx1ZTsgLy8gU29tZSBEV0FSRjUgYXR0cmlidXRlcyBoYXZlIHZhbHVlcworfTsKKworc3RydWN0IEFiYnJldiB7CisgIGxsdm06OnlhbWw6OkhleDMyIENvZGU7CisgIGxsdm06OmR3YXJmOjpUYWcgVGFnOworICBsbHZtOjpkd2FyZjo6Q29uc3RhbnRzIENoaWxkcmVuOworICBzdGQ6OnZlY3RvcjxBdHRyaWJ1dGVBYmJyZXY+IEF0dHJpYnV0ZXM7Cit9OworCitzdHJ1Y3QgQVJhbmdlRGVzY3JpcHRvciB7CisgIGxsdm06OnlhbWw6OkhleDY0IEFkZHJlc3M7CisgIHVpbnQ2NF90IExlbmd0aDsKK307CisKK3N0cnVjdCBBUmFuZ2UgeworICBJbml0aWFsTGVuZ3RoIExlbmd0aDsKKyAgdWludDE2X3QgVmVyc2lvbjsKKyAgdWludDMyX3QgQ3VPZmZzZXQ7CisgIHVpbnQ4X3QgQWRkclNpemU7CisgIHVpbnQ4X3QgU2VnU2l6ZTsKKyAgc3RkOjp2ZWN0b3I8QVJhbmdlRGVzY3JpcHRvcj4gRGVzY3JpcHRvcnM7Cit9OworCitzdHJ1Y3QgUHViRW50cnkgeworICBsbHZtOjp5YW1sOjpIZXgzMiBEaWVPZmZzZXQ7CisgIGxsdm06OnlhbWw6OkhleDggRGVzY3JpcHRvcjsKKyAgU3RyaW5nUmVmIE5hbWU7Cit9OworCitzdHJ1Y3QgUHViU2VjdGlvbiB7CisgIEluaXRpYWxMZW5ndGggTGVuZ3RoOworICB1aW50MTZfdCBWZXJzaW9uOworICB1aW50MzJfdCBVbml0T2Zmc2V0OworICB1aW50MzJfdCBVbml0U2l6ZTsKKyAgYm9vbCBJc0dOVVN0eWxlID0gZmFsc2U7CisgIHN0ZDo6dmVjdG9yPFB1YkVudHJ5PiBFbnRyaWVzOworfTsKKworc3RydWN0IEZvcm1WYWx1ZSB7CisgIGxsdm06OnlhbWw6OkhleDY0IFZhbHVlOworICBTdHJpbmdSZWYgQ1N0cjsKKyAgc3RkOjp2ZWN0b3I8bGx2bTo6eWFtbDo6SGV4OD4gQmxvY2tEYXRhOworfTsKKworc3RydWN0IEVudHJ5IHsKKyAgbGx2bTo6eWFtbDo6SGV4MzIgQWJickNvZGU7CisgIHN0ZDo6dmVjdG9yPEZvcm1WYWx1ZT4gVmFsdWVzOworfTsKKworc3RydWN0IFVuaXQgeworICBJbml0aWFsTGVuZ3RoIExlbmd0aDsKKyAgdWludDE2X3QgVmVyc2lvbjsKKyAgbGx2bTo6ZHdhcmY6OlVuaXRUeXBlIFR5cGU7IC8vIEFkZGVkIGluIERXQVJGIDUKKyAgdWludDMyX3QgQWJick9mZnNldDsKKyAgdWludDhfdCBBZGRyU2l6ZTsKKyAgc3RkOjp2ZWN0b3I8RW50cnk+IEVudHJpZXM7Cit9OworCitzdHJ1Y3QgRmlsZSB7CisgIFN0cmluZ1JlZiBOYW1lOworICB1aW50NjRfdCBEaXJJZHg7CisgIHVpbnQ2NF90IE1vZFRpbWU7CisgIHVpbnQ2NF90IExlbmd0aDsKK307CisKK3N0cnVjdCBMaW5lVGFibGVPcGNvZGUgeworICBkd2FyZjo6TGluZU51bWJlck9wcyBPcGNvZGU7CisgIHVpbnQ2NF90IEV4dExlbjsKKyAgZHdhcmY6OkxpbmVOdW1iZXJFeHRlbmRlZE9wcyBTdWJPcGNvZGU7CisgIHVpbnQ2NF90IERhdGE7CisgIGludDY0X3QgU0RhdGE7CisgIEZpbGUgRmlsZUVudHJ5OworICBzdGQ6OnZlY3RvcjxsbHZtOjp5YW1sOjpIZXg4PiBVbmtub3duT3Bjb2RlRGF0YTsKKyAgc3RkOjp2ZWN0b3I8bGx2bTo6eWFtbDo6SGV4NjQ+IFN0YW5kYXJkT3Bjb2RlRGF0YTsKK307CisKK3N0cnVjdCBMaW5lVGFibGUgeworICBJbml0aWFsTGVuZ3RoIExlbmd0aDsKKyAgdWludDE2X3QgVmVyc2lvbjsKKyAgdWludDY0X3QgUHJvbG9ndWVMZW5ndGg7CisgIHVpbnQ4X3QgTWluSW5zdExlbmd0aDsKKyAgdWludDhfdCBNYXhPcHNQZXJJbnN0OworICB1aW50OF90IERlZmF1bHRJc1N0bXQ7CisgIHVpbnQ4X3QgTGluZUJhc2U7CisgIHVpbnQ4X3QgTGluZVJhbmdlOworICB1aW50OF90IE9wY29kZUJhc2U7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IFN0YW5kYXJkT3Bjb2RlTGVuZ3RoczsKKyAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBJbmNsdWRlRGlyczsKKyAgc3RkOjp2ZWN0b3I8RmlsZT4gRmlsZXM7CisgIHN0ZDo6dmVjdG9yPExpbmVUYWJsZU9wY29kZT4gT3Bjb2RlczsKK307CisKK3N0cnVjdCBEYXRhIHsKKyAgYm9vbCBJc0xpdHRsZUVuZGlhbjsKKyAgc3RkOjp2ZWN0b3I8QWJicmV2PiBBYmJyZXZEZWNsczsKKyAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBEZWJ1Z1N0cmluZ3M7CisgIHN0ZDo6dmVjdG9yPEFSYW5nZT4gQVJhbmdlczsKKyAgUHViU2VjdGlvbiBQdWJOYW1lczsKKyAgUHViU2VjdGlvbiBQdWJUeXBlczsKKworICBQdWJTZWN0aW9uIEdOVVB1Yk5hbWVzOworICBQdWJTZWN0aW9uIEdOVVB1YlR5cGVzOworCisgIHN0ZDo6dmVjdG9yPFVuaXQ+IENvbXBpbGVVbml0czsKKworICBzdGQ6OnZlY3RvcjxMaW5lVGFibGU+IERlYnVnTGluZXM7CisKKyAgYm9vbCBpc0VtcHR5KCkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgRFdBUkZZQU1MCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06OnlhbWw6OkhleDY0KQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjp5YW1sOjpIZXg4KQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpEV0FSRllBTUw6OkF0dHJpYnV0ZUFiYnJldikKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6RFdBUkZZQU1MOjpBYmJyZXYpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06OkRXQVJGWUFNTDo6QVJhbmdlRGVzY3JpcHRvcikKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6RFdBUkZZQU1MOjpBUmFuZ2UpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06OkRXQVJGWUFNTDo6UHViRW50cnkpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06OkRXQVJGWUFNTDo6VW5pdCkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6RFdBUkZZQU1MOjpGb3JtVmFsdWUpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06OkRXQVJGWUFNTDo6RW50cnkpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06OkRXQVJGWUFNTDo6RmlsZSkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6RFdBUkZZQU1MOjpMaW5lVGFibGUpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06OkRXQVJGWUFNTDo6TGluZVRhYmxlT3Bjb2RlKQorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgeWFtbCB7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPERXQVJGWUFNTDo6RGF0YT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgRFdBUkZZQU1MOjpEYXRhICZEV0FSRik7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxEV0FSRllBTUw6OkFiYnJldj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgRFdBUkZZQU1MOjpBYmJyZXYgJkFiYnJldik7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxEV0FSRllBTUw6OkF0dHJpYnV0ZUFiYnJldj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgRFdBUkZZQU1MOjpBdHRyaWJ1dGVBYmJyZXYgJkF0dEFiYnJldik7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxEV0FSRllBTUw6OkFSYW5nZURlc2NyaXB0b3I+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIERXQVJGWUFNTDo6QVJhbmdlRGVzY3JpcHRvciAmRGVzY3JpcHRvcik7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxEV0FSRllBTUw6OkFSYW5nZT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgRFdBUkZZQU1MOjpBUmFuZ2UgJlJhbmdlKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPERXQVJGWUFNTDo6UHViRW50cnk+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIERXQVJGWUFNTDo6UHViRW50cnkgJkVudHJ5KTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPERXQVJGWUFNTDo6UHViU2VjdGlvbj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgRFdBUkZZQU1MOjpQdWJTZWN0aW9uICZTZWN0aW9uKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPERXQVJGWUFNTDo6VW5pdD4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgRFdBUkZZQU1MOjpVbml0ICZVbml0KTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPERXQVJGWUFNTDo6RW50cnk+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIERXQVJGWUFNTDo6RW50cnkgJkVudHJ5KTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPERXQVJGWUFNTDo6Rm9ybVZhbHVlPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBEV0FSRllBTUw6OkZvcm1WYWx1ZSAmRm9ybVZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPERXQVJGWUFNTDo6RmlsZT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgRFdBUkZZQU1MOjpGaWxlICZGaWxlKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPERXQVJGWUFNTDo6TGluZVRhYmxlT3Bjb2RlPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBEV0FSRllBTUw6OkxpbmVUYWJsZU9wY29kZSAmTGluZVRhYmxlT3Bjb2RlKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPERXQVJGWUFNTDo6TGluZVRhYmxlPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBEV0FSRllBTUw6OkxpbmVUYWJsZSAmTGluZVRhYmxlKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPERXQVJGWUFNTDo6SW5pdGlhbExlbmd0aD4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgRFdBUkZZQU1MOjpJbml0aWFsTGVuZ3RoICZEV0FSRik7Cit9OworCisjZGVmaW5lIEhBTkRMRV9EV19UQUcodW51c2VkLCBuYW1lLCB1bnVzZWQyLCB1bnVzZWQzKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpby5lbnVtQ2FzZSh2YWx1ZSwgIkRXX1RBR18iICNuYW1lLCBkd2FyZjo6RFdfVEFHXyMjbmFtZSk7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxkd2FyZjo6VGFnPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZpbywgZHdhcmY6OlRhZyAmdmFsdWUpIHsKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5kZWYiCisgICAgaW8uZW51bUZhbGxiYWNrPEhleDE2Pih2YWx1ZSk7CisgIH0KK307CisKKyNkZWZpbmUgSEFORExFX0RXX0xOUyh1bnVzZWQsIG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlvLmVudW1DYXNlKHZhbHVlLCAiRFdfTE5TXyIgI25hbWUsIGR3YXJmOjpEV19MTlNfIyNuYW1lKTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPGR3YXJmOjpMaW5lTnVtYmVyT3BzPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZpbywgZHdhcmY6OkxpbmVOdW1iZXJPcHMgJnZhbHVlKSB7CisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvRHdhcmYuZGVmIgorICAgIGlvLmVudW1GYWxsYmFjazxIZXg4Pih2YWx1ZSk7CisgIH0KK307CisKKyNkZWZpbmUgSEFORExFX0RXX0xORSh1bnVzZWQsIG5hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlvLmVudW1DYXNlKHZhbHVlLCAiRFdfTE5FXyIgI25hbWUsIGR3YXJmOjpEV19MTkVfIyNuYW1lKTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPGR3YXJmOjpMaW5lTnVtYmVyRXh0ZW5kZWRPcHM+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJmlvLCBkd2FyZjo6TGluZU51bWJlckV4dGVuZGVkT3BzICZ2YWx1ZSkgeworI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZiIKKyAgICBpby5lbnVtRmFsbGJhY2s8SGV4MTY+KHZhbHVlKTsKKyAgfQorfTsKKworI2RlZmluZSBIQU5ETEVfRFdfQVQodW51c2VkLCBuYW1lLCB1bnVzZWQyLCB1bnVzZWQzKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW8uZW51bUNhc2UodmFsdWUsICJEV19BVF8iICNuYW1lLCBkd2FyZjo6RFdfQVRfIyNuYW1lKTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPGR3YXJmOjpBdHRyaWJ1dGU+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJmlvLCBkd2FyZjo6QXR0cmlidXRlICZ2YWx1ZSkgeworI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZiIKKyAgICBpby5lbnVtRmFsbGJhY2s8SGV4MTY+KHZhbHVlKTsKKyAgfQorfTsKKworI2RlZmluZSBIQU5ETEVfRFdfRk9STSh1bnVzZWQsIG5hbWUsIHVudXNlZDIsIHVudXNlZDMpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW8uZW51bUNhc2UodmFsdWUsICJEV19GT1JNXyIgI25hbWUsIGR3YXJmOjpEV19GT1JNXyMjbmFtZSk7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxkd2FyZjo6Rm9ybT4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmaW8sIGR3YXJmOjpGb3JtICZ2YWx1ZSkgeworI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L0R3YXJmLmRlZiIKKyAgICBpby5lbnVtRmFsbGJhY2s8SGV4MTY+KHZhbHVlKTsKKyAgfQorfTsKKworI2RlZmluZSBIQU5ETEVfRFdfVVQodW51c2VkLCBuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW8uZW51bUNhc2UodmFsdWUsICJEV19VVF8iICNuYW1lLCBkd2FyZjo6RFdfVVRfIyNuYW1lKTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPGR3YXJmOjpVbml0VHlwZT4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmaW8sIGR3YXJmOjpVbml0VHlwZSAmdmFsdWUpIHsKKyNpbmNsdWRlICJsbHZtL0JpbmFyeUZvcm1hdC9Ed2FyZi5kZWYiCisgICAgaW8uZW51bUZhbGxiYWNrPEhleDg+KHZhbHVlKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPGR3YXJmOjpDb25zdGFudHM+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJmlvLCBkd2FyZjo6Q29uc3RhbnRzICZ2YWx1ZSkgeworICAgIGlvLmVudW1DYXNlKHZhbHVlLCAiRFdfQ0hJTERSRU5fbm8iLCBkd2FyZjo6RFdfQ0hJTERSRU5fbm8pOworICAgIGlvLmVudW1DYXNlKHZhbHVlLCAiRFdfQ0hJTERSRU5feWVzIiwgZHdhcmY6OkRXX0NISUxEUkVOX3llcyk7CisgICAgaW8uZW51bUZhbGxiYWNrPEhleDE2Pih2YWx1ZSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSB5YW1sCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9PQkpFQ1RZQU1MX0RXQVJGWUFNTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdFlBTUwvRUxGWUFNTC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML0VMRllBTUwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmE4Mzk2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML0VMRllBTUwuaApAQCAtMCwwICsxLDM3OSBAQAorLy89PT0tIEVMRllBTUwuaCAtIEVMRiBZQU1MSU8gaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIFRoaXMgZmlsZSBkZWNsYXJlcyBjbGFzc2VzIGZvciBoYW5kbGluZyB0aGUgWUFNTCByZXByZXNlbnRhdGlvbgorLy8vIG9mIEVMRi4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVFlBTUxfRUxGWUFNTF9ICisjZGVmaW5lIExMVk1fT0JKRUNUWUFNTF9FTEZZQU1MX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0WUFNTC9ZQU1MLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1lBTUxUcmFpdHMuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBFTEZZQU1MIHsKKworLy8gVGhlc2UgdHlwZXMgYXJlIGludmFyaWFudCBhY3Jvc3MgMzIvNjQtYml0IEVMRiwgc28gZm9yIHNpbXBsaWNpdHkganVzdAorLy8gZGlyZWN0bHkgZ2l2ZSB0aGVtIHRoZWlyIGV4YWN0IHNpemVzLiBXZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0CisvLyBlbmRpYW5uZXNzIGJlY2F1c2UgdGhlc2UgYXJlIGp1c3QgdGhlIHR5cGVzIGluIHRoZSBZQU1MSU8gc3RydWN0dXJlcywKKy8vIGFuZCBhcmUgYXBwcm9wcmlhdGVseSBjb252ZXJ0ZWQgdG8gdGhlIG5lY2Vzc2FyeSBlbmRpYW5uZXNzIHdoZW4KKy8vIHJlYWRpbmcvZ2VuZXJhdGluZyBiaW5hcnkgb2JqZWN0IGZpbGVzLgorLy8gVGhlIG5hbWluZyBvZiB0aGVzZSB0eXBlcyBpcyBpbnRlbmRlZCB0byBiZSBFTEZfUFJFRklYLCB3aGVyZSBQUkVGSVggaXMKKy8vIHRoZSBjb21tb24gcHJlZml4IG9mIHRoZSByZXNwZWN0aXZlIGNvbnN0YW50cy4gRS5nLiBFTEZfRU0gY29ycmVzcG9uZHMKKy8vIHRvIHRoZSBgZV9tYWNoaW5lYCBjb25zdGFudHMsIGxpa2UgYEVNX1g4Nl82NGAuCisvLyBJbiB0aGUgZnV0dXJlLCB0aGVzZSB3b3VsZCBwcm9iYWJseSBiZSBiZXR0ZXIgc3VpdGVkIGJ5IEMrKzExIGVudW0KKy8vIGNsYXNzJ3Mgd2l0aCBhcHByb3ByaWF0ZSBmaXhlZCB1bmRlcmx5aW5nIHR5cGUuCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDE2X3QsIEVMRl9FVCkKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50MzJfdCwgRUxGX1BUKQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQzMl90LCBFTEZfRU0pCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDhfdCwgRUxGX0VMRkNMQVNTKQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQ4X3QsIEVMRl9FTEZEQVRBKQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQ4X3QsIEVMRl9FTEZPU0FCSSkKKy8vIEp1c3QgdXNlIDY0LCBzaW5jZSBpdCBjYW4gaG9sZCAzMi1iaXQgdmFsdWVzIHRvby4KK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50NjRfdCwgRUxGX0VGKQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQzMl90LCBFTEZfUEYpCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDMyX3QsIEVMRl9TSFQpCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDMyX3QsIEVMRl9SRUwpCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDhfdCwgRUxGX1JTUykKKy8vIEp1c3QgdXNlIDY0LCBzaW5jZSBpdCBjYW4gaG9sZCAzMi1iaXQgdmFsdWVzIHRvby4KK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50NjRfdCwgRUxGX1NIRikKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50MTZfdCwgRUxGX1NITikKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50OF90LCBFTEZfU1RUKQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQ4X3QsIEVMRl9TVFYpCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDhfdCwgRUxGX1NUTykKKworTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQ4X3QsIE1JUFNfQUZMX1JFRykKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50OF90LCBNSVBTX0FCSV9GUCkKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50MzJfdCwgTUlQU19BRkxfRVhUKQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQzMl90LCBNSVBTX0FGTF9BU0UpCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDMyX3QsIE1JUFNfQUZMX0ZMQUdTMSkKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50MzJfdCwgTUlQU19JU0EpCisKKy8vIEZvciBub3csIGhhcmRjb2RlIDY0IGJpdHMgZXZlcnl3aGVyZSB0aGF0IDMyIG9yIDY0IHdvdWxkIGJlIG5lZWRlZAorLy8gc2luY2UgNjQtYml0IGNhbiBob2xkIDMyLWJpdCB2YWx1ZXMgdG9vLgorc3RydWN0IEZpbGVIZWFkZXIgeworICBFTEZfRUxGQ0xBU1MgQ2xhc3M7CisgIEVMRl9FTEZEQVRBIERhdGE7CisgIEVMRl9FTEZPU0FCSSBPU0FCSTsKKyAgRUxGX0VUIFR5cGU7CisgIEVMRl9FTSBNYWNoaW5lOworICBFTEZfRUYgRmxhZ3M7CisgIGxsdm06OnlhbWw6OkhleDY0IEVudHJ5OworfTsKKworc3RydWN0IFNlY3Rpb25OYW1lIHsKKyAgU3RyaW5nUmVmIFNlY3Rpb247Cit9OworCitzdHJ1Y3QgUHJvZ3JhbUhlYWRlciB7CisgIEVMRl9QVCBUeXBlOworICBFTEZfUEYgRmxhZ3M7CisgIGxsdm06OnlhbWw6OkhleDY0IFZBZGRyOworICBsbHZtOjp5YW1sOjpIZXg2NCBQQWRkcjsKKyAgT3B0aW9uYWw8bGx2bTo6eWFtbDo6SGV4NjQ+IEFsaWduOworICBzdGQ6OnZlY3RvcjxTZWN0aW9uTmFtZT4gU2VjdGlvbnM7Cit9OworCitzdHJ1Y3QgU3ltYm9sIHsKKyAgU3RyaW5nUmVmIE5hbWU7CisgIEVMRl9TVFQgVHlwZTsKKyAgU3RyaW5nUmVmIFNlY3Rpb247CisgIE9wdGlvbmFsPEVMRl9TSE4+IEluZGV4OworICBsbHZtOjp5YW1sOjpIZXg2NCBWYWx1ZTsKKyAgbGx2bTo6eWFtbDo6SGV4NjQgU2l6ZTsKKyAgdWludDhfdCBPdGhlcjsKK307CisKK3N0cnVjdCBMb2NhbEdsb2JhbFdlYWtTeW1ib2xzIHsKKyAgc3RkOjp2ZWN0b3I8U3ltYm9sPiBMb2NhbDsKKyAgc3RkOjp2ZWN0b3I8U3ltYm9sPiBHbG9iYWw7CisgIHN0ZDo6dmVjdG9yPFN5bWJvbD4gV2VhazsKK307CisKK3N0cnVjdCBTZWN0aW9uT3JUeXBlIHsKKyAgU3RyaW5nUmVmIHNlY3Rpb25OYW1lT3JUeXBlOworfTsKKworc3RydWN0IFNlY3Rpb24geworICBlbnVtIGNsYXNzIFNlY3Rpb25LaW5kIHsKKyAgICBHcm91cCwKKyAgICBSYXdDb250ZW50LAorICAgIFJlbG9jYXRpb24sCisgICAgTm9CaXRzLAorICAgIE1pcHNBQklGbGFncworICB9OworICBTZWN0aW9uS2luZCBLaW5kOworICBTdHJpbmdSZWYgTmFtZTsKKyAgRUxGX1NIVCBUeXBlOworICBFTEZfU0hGIEZsYWdzOworICBsbHZtOjp5YW1sOjpIZXg2NCBBZGRyZXNzOworICBTdHJpbmdSZWYgTGluazsKKyAgU3RyaW5nUmVmIEluZm87CisgIGxsdm06OnlhbWw6OkhleDY0IEFkZHJlc3NBbGlnbjsKKworICBTZWN0aW9uKFNlY3Rpb25LaW5kIEtpbmQpIDogS2luZChLaW5kKSB7fQorICB2aXJ0dWFsIH5TZWN0aW9uKCk7Cit9Oworc3RydWN0IFJhd0NvbnRlbnRTZWN0aW9uIDogU2VjdGlvbiB7CisgIHlhbWw6OkJpbmFyeVJlZiBDb250ZW50OworICBsbHZtOjp5YW1sOjpIZXg2NCBTaXplOworCisgIFJhd0NvbnRlbnRTZWN0aW9uKCkgOiBTZWN0aW9uKFNlY3Rpb25LaW5kOjpSYXdDb250ZW50KSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU2VjdGlvbiAqUykgeworICAgIHJldHVybiBTLT5LaW5kID09IFNlY3Rpb25LaW5kOjpSYXdDb250ZW50OworICB9Cit9OworCitzdHJ1Y3QgTm9CaXRzU2VjdGlvbiA6IFNlY3Rpb24geworICBsbHZtOjp5YW1sOjpIZXg2NCBTaXplOworCisgIE5vQml0c1NlY3Rpb24oKSA6IFNlY3Rpb24oU2VjdGlvbktpbmQ6Ok5vQml0cykge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNlY3Rpb24gKlMpIHsKKyAgICByZXR1cm4gUy0+S2luZCA9PSBTZWN0aW9uS2luZDo6Tm9CaXRzOworICB9Cit9OworCitzdHJ1Y3QgR3JvdXAgOiBTZWN0aW9uIHsKKyAgLy8gTWVtYmVycyBvZiBhIGdyb3VwIGNvbnRhaW4gYSBmbGFnIGFuZCBhIGxpc3Qgb2Ygc2VjdGlvbiBpbmRpY2VzCisgIC8vIHRoYXQgYXJlIHBhcnQgb2YgdGhlIGdyb3VwLgorICBzdGQ6OnZlY3RvcjxTZWN0aW9uT3JUeXBlPiBNZW1iZXJzOworCisgIEdyb3VwKCkgOiBTZWN0aW9uKFNlY3Rpb25LaW5kOjpHcm91cCkge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNlY3Rpb24gKlMpIHsKKyAgICByZXR1cm4gUy0+S2luZCA9PSBTZWN0aW9uS2luZDo6R3JvdXA7CisgIH0KK307CisKK3N0cnVjdCBSZWxvY2F0aW9uIHsKKyAgbGx2bTo6eWFtbDo6SGV4NjQgT2Zmc2V0OworICBpbnQ2NF90IEFkZGVuZDsKKyAgRUxGX1JFTCBUeXBlOworICBPcHRpb25hbDxTdHJpbmdSZWY+IFN5bWJvbDsKK307CisKK3N0cnVjdCBSZWxvY2F0aW9uU2VjdGlvbiA6IFNlY3Rpb24geworICBzdGQ6OnZlY3RvcjxSZWxvY2F0aW9uPiBSZWxvY2F0aW9uczsKKworICBSZWxvY2F0aW9uU2VjdGlvbigpIDogU2VjdGlvbihTZWN0aW9uS2luZDo6UmVsb2NhdGlvbikge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNlY3Rpb24gKlMpIHsKKyAgICByZXR1cm4gUy0+S2luZCA9PSBTZWN0aW9uS2luZDo6UmVsb2NhdGlvbjsKKyAgfQorfTsKKworLy8gUmVwcmVzZW50cyAuTUlQUy5hYmlmbGFncyBzZWN0aW9uCitzdHJ1Y3QgTWlwc0FCSUZsYWdzIDogU2VjdGlvbiB7CisgIGxsdm06OnlhbWw6OkhleDE2IFZlcnNpb247CisgIE1JUFNfSVNBIElTQUxldmVsOworICBsbHZtOjp5YW1sOjpIZXg4IElTQVJldmlzaW9uOworICBNSVBTX0FGTF9SRUcgR1BSU2l6ZTsKKyAgTUlQU19BRkxfUkVHIENQUjFTaXplOworICBNSVBTX0FGTF9SRUcgQ1BSMlNpemU7CisgIE1JUFNfQUJJX0ZQIEZwQUJJOworICBNSVBTX0FGTF9FWFQgSVNBRXh0ZW5zaW9uOworICBNSVBTX0FGTF9BU0UgQVNFczsKKyAgTUlQU19BRkxfRkxBR1MxIEZsYWdzMTsKKyAgbGx2bTo6eWFtbDo6SGV4MzIgRmxhZ3MyOworCisgIE1pcHNBQklGbGFncygpIDogU2VjdGlvbihTZWN0aW9uS2luZDo6TWlwc0FCSUZsYWdzKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU2VjdGlvbiAqUykgeworICAgIHJldHVybiBTLT5LaW5kID09IFNlY3Rpb25LaW5kOjpNaXBzQUJJRmxhZ3M7CisgIH0KK307CisKK3N0cnVjdCBPYmplY3QgeworICBGaWxlSGVhZGVyIEhlYWRlcjsKKyAgc3RkOjp2ZWN0b3I8UHJvZ3JhbUhlYWRlcj4gUHJvZ3JhbUhlYWRlcnM7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxTZWN0aW9uPj4gU2VjdGlvbnM7CisgIC8vIEFsdGhvdWdoIGluIHJlYWxpdHkgdGhlIHN5bWJvbHMgcmVzaWRlIGluIGEgc2VjdGlvbiwgaXQgaXMgYSBsb3QKKyAgLy8gY2xlYW5lciBhbmQgbmljZXIgaWYgd2UgcmVhZCB0aGVtIGZyb20gdGhlIFlBTUwgYXMgYSBzZXBhcmF0ZQorICAvLyB0b3AtbGV2ZWwga2V5LCB3aGljaCBhdXRvbWF0aWNhbGx5IGVuc3VyZXMgdGhhdCBpbnZhcmlhbnRzIGxpa2UgdGhlcmUKKyAgLy8gYmVpbmcgYSBzaW5nbGUgU0hUX1NZTVRBQiBzZWN0aW9uIGFyZSB1cGhlbGQuCisgIExvY2FsR2xvYmFsV2Vha1N5bWJvbHMgU3ltYm9sczsKKyAgTG9jYWxHbG9iYWxXZWFrU3ltYm9scyBEeW5hbWljU3ltYm9sczsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBFTEZZQU1MCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06OkVMRllBTUw6OlByb2dyYW1IZWFkZXIpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpFTEZZQU1MOjpTZWN0aW9uPikKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6RUxGWUFNTDo6U3ltYm9sKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpFTEZZQU1MOjpSZWxvY2F0aW9uKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpFTEZZQU1MOjpTZWN0aW9uT3JUeXBlKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpFTEZZQU1MOjpTZWN0aW9uTmFtZSkKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHlhbWwgeworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPEVMRllBTUw6OkVMRl9FVD4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIEVMRllBTUw6OkVMRl9FVCAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPEVMRllBTUw6OkVMRl9QVD4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIEVMRllBTUw6OkVMRl9QVCAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxFTEZZQU1MOjpFTEZfRU0+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBFTEZZQU1MOjpFTEZfRU0gJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8RUxGWUFNTDo6RUxGX0VMRkNMQVNTPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgRUxGWUFNTDo6RUxGX0VMRkNMQVNTICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPEVMRllBTUw6OkVMRl9FTEZEQVRBPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgRUxGWUFNTDo6RUxGX0VMRkRBVEEgJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8RUxGWUFNTDo6RUxGX0VMRk9TQUJJPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgRUxGWUFNTDo6RUxGX0VMRk9TQUJJICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckJpdFNldFRyYWl0czxFTEZZQU1MOjpFTEZfRUY+IHsKKyAgc3RhdGljIHZvaWQgYml0c2V0KElPICZJTywgRUxGWUFNTDo6RUxGX0VGICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyQml0U2V0VHJhaXRzPEVMRllBTUw6OkVMRl9QRj4geworICBzdGF0aWMgdm9pZCBiaXRzZXQoSU8gJklPLCBFTEZZQU1MOjpFTEZfUEYgJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8RUxGWUFNTDo6RUxGX1NIVD4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIEVMRllBTUw6OkVMRl9TSFQgJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2NhbGFyQml0U2V0VHJhaXRzPEVMRllBTUw6OkVMRl9TSEY+IHsKKyAgc3RhdGljIHZvaWQgYml0c2V0KElPICZJTywgRUxGWUFNTDo6RUxGX1NIRiAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPEVMRllBTUw6OkVMRl9TSE4+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBFTEZZQU1MOjpFTEZfU0hOICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPEVMRllBTUw6OkVMRl9TVFQ+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBFTEZZQU1MOjpFTEZfU1RUICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPEVMRllBTUw6OkVMRl9TVFY+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBFTEZZQU1MOjpFTEZfU1RWICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckJpdFNldFRyYWl0czxFTEZZQU1MOjpFTEZfU1RPPiB7CisgIHN0YXRpYyB2b2lkIGJpdHNldChJTyAmSU8sIEVMRllBTUw6OkVMRl9TVE8gJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8RUxGWUFNTDo6RUxGX1JFTD4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIEVMRllBTUw6OkVMRl9SRUwgJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8RUxGWUFNTDo6RUxGX1JTUz4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIEVMRllBTUw6OkVMRl9SU1MgJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8RUxGWUFNTDo6TUlQU19BRkxfUkVHPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgRUxGWUFNTDo6TUlQU19BRkxfUkVHICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPEVMRllBTUw6Ok1JUFNfQUJJX0ZQPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgRUxGWUFNTDo6TUlQU19BQklfRlAgJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8RUxGWUFNTDo6TUlQU19BRkxfRVhUPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgRUxGWUFNTDo6TUlQU19BRkxfRVhUICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPEVMRllBTUw6Ok1JUFNfSVNBPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgRUxGWUFNTDo6TUlQU19JU0EgJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2NhbGFyQml0U2V0VHJhaXRzPEVMRllBTUw6Ok1JUFNfQUZMX0FTRT4geworICBzdGF0aWMgdm9pZCBiaXRzZXQoSU8gJklPLCBFTEZZQU1MOjpNSVBTX0FGTF9BU0UgJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgU2NhbGFyQml0U2V0VHJhaXRzPEVMRllBTUw6Ok1JUFNfQUZMX0ZMQUdTMT4geworICBzdGF0aWMgdm9pZCBiaXRzZXQoSU8gJklPLCBFTEZZQU1MOjpNSVBTX0FGTF9GTEFHUzEgJlZhbHVlKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgTWFwcGluZ1RyYWl0czxFTEZZQU1MOjpGaWxlSGVhZGVyPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBFTEZZQU1MOjpGaWxlSGVhZGVyICZGaWxlSGRyKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPEVMRllBTUw6OlByb2dyYW1IZWFkZXI+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIEVMRllBTUw6OlByb2dyYW1IZWFkZXIgJkZpbGVIZHIpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBNYXBwaW5nVHJhaXRzPEVMRllBTUw6OlN5bWJvbD4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgRUxGWUFNTDo6U3ltYm9sICZTeW1ib2wpOworICBzdGF0aWMgU3RyaW5nUmVmIHZhbGlkYXRlKElPICZJTywgRUxGWUFNTDo6U3ltYm9sICZTeW1ib2wpOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBNYXBwaW5nVHJhaXRzPEVMRllBTUw6OkxvY2FsR2xvYmFsV2Vha1N5bWJvbHM+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIEVMRllBTUw6OkxvY2FsR2xvYmFsV2Vha1N5bWJvbHMgJlN5bWJvbHMpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8RUxGWUFNTDo6UmVsb2NhdGlvbj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgRUxGWUFNTDo6UmVsb2NhdGlvbiAmUmVsKTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgTWFwcGluZ1RyYWl0czxzdGQ6OnVuaXF1ZV9wdHI8RUxGWUFNTDo6U2VjdGlvbj4+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIHN0ZDo6dW5pcXVlX3B0cjxFTEZZQU1MOjpTZWN0aW9uPiAmU2VjdGlvbik7CisgIHN0YXRpYyBTdHJpbmdSZWYgdmFsaWRhdGUoSU8gJmlvLCBzdGQ6OnVuaXF1ZV9wdHI8RUxGWUFNTDo6U2VjdGlvbj4gJlNlY3Rpb24pOworfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBNYXBwaW5nVHJhaXRzPEVMRllBTUw6Ok9iamVjdD4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgRUxGWUFNTDo6T2JqZWN0ICZPYmplY3QpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8RUxGWUFNTDo6U2VjdGlvbk9yVHlwZT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgRUxGWUFNTDo6U2VjdGlvbk9yVHlwZSAmc2VjdGlvbk9yVHlwZSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxFTEZZQU1MOjpTZWN0aW9uTmFtZT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgRUxGWUFNTDo6U2VjdGlvbk5hbWUgJnNlY3Rpb25OYW1lKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSB5YW1sCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9PQkpFQ1RZQU1MX0VMRllBTUxfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML01hY2hPWUFNTC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML01hY2hPWUFNTC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmYThmOTIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09iamVjdFlBTUwvTWFjaE9ZQU1MLmgKQEAgLTAsMCArMSwzMDcgQEAKKy8vPT09LSBNYWNoT1lBTUwuaCAtIE1hY2gtTyBZQU1MSU8gaW1wbGVtZW50YXRpb24gLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBUaGlzIGZpbGUgZGVjbGFyZXMgY2xhc3NlcyBmb3IgaGFuZGxpbmcgdGhlIFlBTUwgcmVwcmVzZW50YXRpb24KKy8vLyBvZiBNYWNoLU8uCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RZQU1MX01BQ0hPWUFNTF9ICisjZGVmaW5lIExMVk1fT0JKRUNUWUFNTF9NQUNIT1lBTUxfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvTWFjaE8uaCIKKyNpbmNsdWRlICJsbHZtL09iamVjdFlBTUwvRFdBUkZZQU1MLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1lBTUxUcmFpdHMuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBNYWNoT1lBTUwgeworCitzdHJ1Y3QgU2VjdGlvbiB7CisgIGNoYXIgc2VjdG5hbWVbMTZdOworICBjaGFyIHNlZ25hbWVbMTZdOworICBsbHZtOjp5YW1sOjpIZXg2NCBhZGRyOworICB1aW50NjRfdCBzaXplOworICBsbHZtOjp5YW1sOjpIZXgzMiBvZmZzZXQ7CisgIHVpbnQzMl90IGFsaWduOworICBsbHZtOjp5YW1sOjpIZXgzMiByZWxvZmY7CisgIHVpbnQzMl90IG5yZWxvYzsKKyAgbGx2bTo6eWFtbDo6SGV4MzIgZmxhZ3M7CisgIGxsdm06OnlhbWw6OkhleDMyIHJlc2VydmVkMTsKKyAgbGx2bTo6eWFtbDo6SGV4MzIgcmVzZXJ2ZWQyOworICBsbHZtOjp5YW1sOjpIZXgzMiByZXNlcnZlZDM7Cit9OworCitzdHJ1Y3QgRmlsZUhlYWRlciB7CisgIGxsdm06OnlhbWw6OkhleDMyIG1hZ2ljOworICBsbHZtOjp5YW1sOjpIZXgzMiBjcHV0eXBlOworICBsbHZtOjp5YW1sOjpIZXgzMiBjcHVzdWJ0eXBlOworICBsbHZtOjp5YW1sOjpIZXgzMiBmaWxldHlwZTsKKyAgdWludDMyX3QgbmNtZHM7CisgIHVpbnQzMl90IHNpemVvZmNtZHM7CisgIGxsdm06OnlhbWw6OkhleDMyIGZsYWdzOworICBsbHZtOjp5YW1sOjpIZXgzMiByZXNlcnZlZDsKK307CisKK3N0cnVjdCBMb2FkQ29tbWFuZCB7CisgIHZpcnR1YWwgfkxvYWRDb21tYW5kKCk7CisKKyAgbGx2bTo6TWFjaE86Om1hY2hvX2xvYWRfY29tbWFuZCBEYXRhOworICBzdGQ6OnZlY3RvcjxTZWN0aW9uPiBTZWN0aW9uczsKKyAgc3RkOjp2ZWN0b3I8TWFjaE86OmJ1aWxkX3Rvb2xfdmVyc2lvbj4gVG9vbHM7CisgIHN0ZDo6dmVjdG9yPGxsdm06OnlhbWw6OkhleDg+IFBheWxvYWRCeXRlczsKKyAgc3RkOjpzdHJpbmcgUGF5bG9hZFN0cmluZzsKKyAgdWludDY0X3QgWmVyb1BhZEJ5dGVzOworfTsKKworc3RydWN0IE5MaXN0RW50cnkgeworICB1aW50MzJfdCBuX3N0cng7CisgIGxsdm06OnlhbWw6OkhleDggbl90eXBlOworICB1aW50OF90IG5fc2VjdDsKKyAgdWludDE2X3Qgbl9kZXNjOworICB1aW50NjRfdCBuX3ZhbHVlOworfTsKKworc3RydWN0IFJlYmFzZU9wY29kZSB7CisgIE1hY2hPOjpSZWJhc2VPcGNvZGUgT3Bjb2RlOworICB1aW50OF90IEltbTsKKyAgc3RkOjp2ZWN0b3I8eWFtbDo6SGV4NjQ+IEV4dHJhRGF0YTsKK307CisKK3N0cnVjdCBCaW5kT3Bjb2RlIHsKKyAgTWFjaE86OkJpbmRPcGNvZGUgT3Bjb2RlOworICB1aW50OF90IEltbTsKKyAgc3RkOjp2ZWN0b3I8eWFtbDo6SGV4NjQ+IFVMRUJFeHRyYURhdGE7CisgIHN0ZDo6dmVjdG9yPGludDY0X3Q+IFNMRUJFeHRyYURhdGE7CisgIFN0cmluZ1JlZiBTeW1ib2w7Cit9OworCitzdHJ1Y3QgRXhwb3J0RW50cnkgeworICB1aW50NjRfdCBUZXJtaW5hbFNpemUgPSAwOworICB1aW50NjRfdCBOb2RlT2Zmc2V0ID0gMDsKKyAgc3RkOjpzdHJpbmcgTmFtZTsKKyAgbGx2bTo6eWFtbDo6SGV4NjQgRmxhZ3MgPSAwOworICBsbHZtOjp5YW1sOjpIZXg2NCBBZGRyZXNzID0gMDsKKyAgbGx2bTo6eWFtbDo6SGV4NjQgT3RoZXIgPSAwOworICBzdGQ6OnN0cmluZyBJbXBvcnROYW1lOworICBzdGQ6OnZlY3RvcjxNYWNoT1lBTUw6OkV4cG9ydEVudHJ5PiBDaGlsZHJlbjsKK307CisKK3N0cnVjdCBMaW5rRWRpdERhdGEgeworICBzdGQ6OnZlY3RvcjxNYWNoT1lBTUw6OlJlYmFzZU9wY29kZT4gUmViYXNlT3Bjb2RlczsKKyAgc3RkOjp2ZWN0b3I8TWFjaE9ZQU1MOjpCaW5kT3Bjb2RlPiBCaW5kT3Bjb2RlczsKKyAgc3RkOjp2ZWN0b3I8TWFjaE9ZQU1MOjpCaW5kT3Bjb2RlPiBXZWFrQmluZE9wY29kZXM7CisgIHN0ZDo6dmVjdG9yPE1hY2hPWUFNTDo6QmluZE9wY29kZT4gTGF6eUJpbmRPcGNvZGVzOworICBNYWNoT1lBTUw6OkV4cG9ydEVudHJ5IEV4cG9ydFRyaWU7CisgIHN0ZDo6dmVjdG9yPE5MaXN0RW50cnk+IE5hbWVMaXN0OworICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IFN0cmluZ1RhYmxlOworCisgIGJvb2wgaXNFbXB0eSgpIGNvbnN0OworfTsKKworc3RydWN0IE9iamVjdCB7CisgIGJvb2wgSXNMaXR0bGVFbmRpYW47CisgIEZpbGVIZWFkZXIgSGVhZGVyOworICBzdGQ6OnZlY3RvcjxMb2FkQ29tbWFuZD4gTG9hZENvbW1hbmRzOworICBzdGQ6OnZlY3RvcjxTZWN0aW9uPiBTZWN0aW9uczsKKyAgTGlua0VkaXREYXRhIExpbmtFZGl0OworICBEV0FSRllBTUw6OkRhdGEgRFdBUkY7Cit9OworCitzdHJ1Y3QgRmF0SGVhZGVyIHsKKyAgbGx2bTo6eWFtbDo6SGV4MzIgbWFnaWM7CisgIHVpbnQzMl90IG5mYXRfYXJjaDsKK307CisKK3N0cnVjdCBGYXRBcmNoIHsKKyAgbGx2bTo6eWFtbDo6SGV4MzIgY3B1dHlwZTsKKyAgbGx2bTo6eWFtbDo6SGV4MzIgY3B1c3VidHlwZTsKKyAgbGx2bTo6eWFtbDo6SGV4NjQgb2Zmc2V0OworICB1aW50NjRfdCBzaXplOworICB1aW50MzJfdCBhbGlnbjsKKyAgbGx2bTo6eWFtbDo6SGV4MzIgcmVzZXJ2ZWQ7Cit9OworCitzdHJ1Y3QgVW5pdmVyc2FsQmluYXJ5IHsKKyAgRmF0SGVhZGVyIEhlYWRlcjsKKyAgc3RkOjp2ZWN0b3I8RmF0QXJjaD4gRmF0QXJjaHM7CisgIHN0ZDo6dmVjdG9yPE9iamVjdD4gU2xpY2VzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIE1hY2hPWUFNTAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpNYWNoT1lBTUw6OkxvYWRDb21tYW5kKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpNYWNoT1lBTUw6OlNlY3Rpb24pCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Ok1hY2hPWUFNTDo6UmViYXNlT3Bjb2RlKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpNYWNoT1lBTUw6OkJpbmRPcGNvZGUpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Ok1hY2hPWUFNTDo6RXhwb3J0RW50cnkpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Ok1hY2hPWUFNTDo6Tkxpc3RFbnRyeSkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6TWFjaE9ZQU1MOjpPYmplY3QpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Ok1hY2hPWUFNTDo6RmF0QXJjaCkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6TWFjaE86OmJ1aWxkX3Rvb2xfdmVyc2lvbikKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworbmFtZXNwYWNlIHlhbWwgeworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoT1lBTUw6OkZpbGVIZWFkZXI+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIE1hY2hPWUFNTDo6RmlsZUhlYWRlciAmRmlsZUhlYWRlcik7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoT1lBTUw6Ok9iamVjdD4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgTWFjaE9ZQU1MOjpPYmplY3QgJk9iamVjdCk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoT1lBTUw6OkZhdEhlYWRlcj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgTWFjaE9ZQU1MOjpGYXRIZWFkZXIgJkZhdEhlYWRlcik7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoT1lBTUw6OkZhdEFyY2g+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIE1hY2hPWUFNTDo6RmF0QXJjaCAmRmF0QXJjaCk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoT1lBTUw6OlVuaXZlcnNhbEJpbmFyeT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgTWFjaE9ZQU1MOjpVbml2ZXJzYWxCaW5hcnkgJlVuaXZlcnNhbEJpbmFyeSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoT1lBTUw6OkxvYWRDb21tYW5kPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBNYWNoT1lBTUw6OkxvYWRDb21tYW5kICZMb2FkQ29tbWFuZCk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoT1lBTUw6OkxpbmtFZGl0RGF0YT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgTWFjaE9ZQU1MOjpMaW5rRWRpdERhdGEgJkxpbmtFZGl0RGF0YSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoT1lBTUw6OlJlYmFzZU9wY29kZT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgTWFjaE9ZQU1MOjpSZWJhc2VPcGNvZGUgJlJlYmFzZU9wY29kZSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoT1lBTUw6OkJpbmRPcGNvZGU+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIE1hY2hPWUFNTDo6QmluZE9wY29kZSAmQmluZE9wY29kZSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoT1lBTUw6OkV4cG9ydEVudHJ5PiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBNYWNoT1lBTUw6OkV4cG9ydEVudHJ5ICZFeHBvcnRFbnRyeSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoT1lBTUw6OlNlY3Rpb24+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIE1hY2hPWUFNTDo6U2VjdGlvbiAmU2VjdGlvbik7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoT1lBTUw6Ok5MaXN0RW50cnk+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIE1hY2hPWUFNTDo6Tkxpc3RFbnRyeSAmTkxpc3RFbnRyeSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoTzo6YnVpbGRfdG9vbF92ZXJzaW9uPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBNYWNoTzo6YnVpbGRfdG9vbF92ZXJzaW9uICZ0b29sKTsKK307CisKKyNkZWZpbmUgSEFORExFX0xPQURfQ09NTUFORChMQ05hbWUsIExDVmFsdWUsIExDU3RydWN0KSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlvLmVudW1DYXNlKHZhbHVlLCAjTENOYW1lLCBNYWNoTzo6TENOYW1lKTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPE1hY2hPOjpMb2FkQ29tbWFuZFR5cGU+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJmlvLCBNYWNoTzo6TG9hZENvbW1hbmRUeXBlICZ2YWx1ZSkgeworI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L01hY2hPLmRlZiIKKyAgICBpby5lbnVtRmFsbGJhY2s8SGV4MzI+KHZhbHVlKTsKKyAgfQorfTsKKworI2RlZmluZSBFTlVNX0NBU0UoRW51bSkgaW8uZW51bUNhc2UodmFsdWUsICNFbnVtLCBNYWNoTzo6RW51bSk7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxNYWNoTzo6UmViYXNlT3Bjb2RlPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZpbywgTWFjaE86OlJlYmFzZU9wY29kZSAmdmFsdWUpIHsKKyAgICBFTlVNX0NBU0UoUkVCQVNFX09QQ09ERV9ET05FKQorICAgIEVOVU1fQ0FTRShSRUJBU0VfT1BDT0RFX1NFVF9UWVBFX0lNTSkKKyAgICBFTlVNX0NBU0UoUkVCQVNFX09QQ09ERV9TRVRfU0VHTUVOVF9BTkRfT0ZGU0VUX1VMRUIpCisgICAgRU5VTV9DQVNFKFJFQkFTRV9PUENPREVfQUREX0FERFJfVUxFQikKKyAgICBFTlVNX0NBU0UoUkVCQVNFX09QQ09ERV9BRERfQUREUl9JTU1fU0NBTEVEKQorICAgIEVOVU1fQ0FTRShSRUJBU0VfT1BDT0RFX0RPX1JFQkFTRV9JTU1fVElNRVMpCisgICAgRU5VTV9DQVNFKFJFQkFTRV9PUENPREVfRE9fUkVCQVNFX1VMRUJfVElNRVMpCisgICAgRU5VTV9DQVNFKFJFQkFTRV9PUENPREVfRE9fUkVCQVNFX0FERF9BRERSX1VMRUIpCisgICAgRU5VTV9DQVNFKFJFQkFTRV9PUENPREVfRE9fUkVCQVNFX1VMRUJfVElNRVNfU0tJUFBJTkdfVUxFQikKKyAgICBpby5lbnVtRmFsbGJhY2s8SGV4OD4odmFsdWUpOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8TWFjaE86OkJpbmRPcGNvZGU+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJmlvLCBNYWNoTzo6QmluZE9wY29kZSAmdmFsdWUpIHsKKyAgICBFTlVNX0NBU0UoQklORF9PUENPREVfRE9ORSkKKyAgICBFTlVNX0NBU0UoQklORF9PUENPREVfU0VUX0RZTElCX09SRElOQUxfSU1NKQorICAgIEVOVU1fQ0FTRShCSU5EX09QQ09ERV9TRVRfRFlMSUJfT1JESU5BTF9VTEVCKQorICAgIEVOVU1fQ0FTRShCSU5EX09QQ09ERV9TRVRfRFlMSUJfU1BFQ0lBTF9JTU0pCisgICAgRU5VTV9DQVNFKEJJTkRfT1BDT0RFX1NFVF9TWU1CT0xfVFJBSUxJTkdfRkxBR1NfSU1NKQorICAgIEVOVU1fQ0FTRShCSU5EX09QQ09ERV9TRVRfVFlQRV9JTU0pCisgICAgRU5VTV9DQVNFKEJJTkRfT1BDT0RFX1NFVF9BRERFTkRfU0xFQikKKyAgICBFTlVNX0NBU0UoQklORF9PUENPREVfU0VUX1NFR01FTlRfQU5EX09GRlNFVF9VTEVCKQorICAgIEVOVU1fQ0FTRShCSU5EX09QQ09ERV9BRERfQUREUl9VTEVCKQorICAgIEVOVU1fQ0FTRShCSU5EX09QQ09ERV9ET19CSU5EKQorICAgIEVOVU1fQ0FTRShCSU5EX09QQ09ERV9ET19CSU5EX0FERF9BRERSX1VMRUIpCisgICAgRU5VTV9DQVNFKEJJTkRfT1BDT0RFX0RPX0JJTkRfQUREX0FERFJfSU1NX1NDQUxFRCkKKyAgICBFTlVNX0NBU0UoQklORF9PUENPREVfRE9fQklORF9VTEVCX1RJTUVTX1NLSVBQSU5HX1VMRUIpCisgICAgaW8uZW51bUZhbGxiYWNrPEhleDg+KHZhbHVlKTsKKyAgfQorfTsKKworLy8gVGhpcyB0cmFpdCBpcyB1c2VkIGZvciAxNi1ieXRlIGNoYXJzIGluIE1hY2ggc3RydWN0dXJlcyB1c2VkIGZvciBzdHJpbmdzCit1c2luZyBjaGFyXzE2ID0gY2hhclsxNl07CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJUcmFpdHM8Y2hhcl8xNj4geworICBzdGF0aWMgdm9pZCBvdXRwdXQoY29uc3QgY2hhcl8xNiAmVmFsLCB2b2lkICosIHJhd19vc3RyZWFtICZPdXQpOworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiBTY2FsYXIsIHZvaWQgKiwgY2hhcl8xNiAmVmFsKTsKKyAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYgUyk7Cit9OworCisvLyBUaGlzIHRyYWl0IGlzIHVzZWQgZm9yIFVVSURzLiBJdCByZWFkcyBhbmQgd3JpdGVzIHRoZW0gbWF0Y2hpbmcgb3Rvb2wncworLy8gZm9ybWF0dGluZyBzdHlsZS4KK3VzaW5nIHV1aWRfdCA9IHJhd19vc3RyZWFtOjp1dWlkX3Q7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJUcmFpdHM8dXVpZF90PiB7CisgIHN0YXRpYyB2b2lkIG91dHB1dChjb25zdCB1dWlkX3QgJlZhbCwgdm9pZCAqLCByYXdfb3N0cmVhbSAmT3V0KTsKKyAgc3RhdGljIFN0cmluZ1JlZiBpbnB1dChTdHJpbmdSZWYgU2NhbGFyLCB2b2lkICosIHV1aWRfdCAmVmFsKTsKKyAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYgUyk7Cit9OworCisvLyBMb2FkIENvbW1hbmQgc3RydWN0IG1hcHBpbmcgdHJhaXRzCisKKyNkZWZpbmUgTE9BRF9DT01NQU5EX1NUUlVDVChMQ1N0cnVjdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPE1hY2hPOjpMQ1N0cnVjdD4geyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBNYWNoTzo6TENTdHJ1Y3QgJkxvYWRDb21tYW5kKTsgICAgICAgICAgICAgICAgIFwKKyAgfTsKKworI2luY2x1ZGUgImxsdm0vQmluYXJ5Rm9ybWF0L01hY2hPLmRlZiIKKworLy8gRXh0cmEgc3RydWN0dXJlcyB1c2VkIGJ5IGxvYWQgY29tbWFuZHMKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPE1hY2hPOjpkeWxpYj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgTWFjaE86OmR5bGliICZMb2FkQ29tbWFuZCk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoTzo6ZnZtbGliPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBNYWNoTzo6ZnZtbGliICZMb2FkQ29tbWFuZCk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxNYWNoTzo6c2VjdGlvbj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgTWFjaE86OnNlY3Rpb24gJkxvYWRDb21tYW5kKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPE1hY2hPOjpzZWN0aW9uXzY0PiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBNYWNoTzo6c2VjdGlvbl82NCAmTG9hZENvbW1hbmQpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHlhbWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fT0JKRUNUWUFNTF9NQUNIT1lBTUxfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML09iamVjdFlBTUwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9PYmplY3RZQU1MLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDBjZTg2NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9PYmplY3RZQU1MLmgKQEAgLTAsMCArMSw0MCBAQAorLy89PT0tIE9iamVjdFlBTUwuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVFlBTUxfT0JKRUNUWUFNTF9ICisjZGVmaW5lIExMVk1fT0JKRUNUWUFNTF9PQkpFQ1RZQU1MX0gKKworI2luY2x1ZGUgImxsdm0vT2JqZWN0WUFNTC9DT0ZGWUFNTC5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0WUFNTC9FTEZZQU1MLmgiCisjaW5jbHVkZSAibGx2bS9PYmplY3RZQU1ML01hY2hPWUFNTC5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0WUFNTC9XYXNtWUFNTC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9ZQU1MVHJhaXRzLmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgeWFtbCB7CisKK2NsYXNzIElPOworCitzdHJ1Y3QgWWFtbE9iamVjdEZpbGUgeworICBzdGQ6OnVuaXF1ZV9wdHI8RUxGWUFNTDo6T2JqZWN0PiBFbGY7CisgIHN0ZDo6dW5pcXVlX3B0cjxDT0ZGWUFNTDo6T2JqZWN0PiBDb2ZmOworICBzdGQ6OnVuaXF1ZV9wdHI8TWFjaE9ZQU1MOjpPYmplY3Q+IE1hY2hPOworICBzdGQ6OnVuaXF1ZV9wdHI8TWFjaE9ZQU1MOjpVbml2ZXJzYWxCaW5hcnk+IEZhdE1hY2hPOworICBzdGQ6OnVuaXF1ZV9wdHI8V2FzbVlBTUw6Ok9iamVjdD4gV2FzbTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPFlhbWxPYmplY3RGaWxlPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBZYW1sT2JqZWN0RmlsZSAmT2JqZWN0RmlsZSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgeWFtbAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fT0JKRUNUWUFNTF9PQkpFQ1RZQU1MX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9XYXNtWUFNTC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML1dhc21ZQU1MLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWM1ZTc3ZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9XYXNtWUFNTC5oCkBAIC0wLDAgKzEsNDc2IEBACisvLz09PS0gV2FzbVlBTUwuaCAtIFdhc20gWUFNTElPIGltcGxlbWVudGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgVGhpcyBmaWxlIGRlY2xhcmVzIGNsYXNzZXMgZm9yIGhhbmRsaW5nIHRoZSBZQU1MIHJlcHJlc2VudGF0aW9uCisvLy8gb2Ygd2FzbSBiaW5hcmllcy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09CSkVDVFlBTUxfV0FTTVlBTUxfSAorI2RlZmluZSBMTFZNX09CSkVDVFlBTUxfV0FTTVlBTUxfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9CaW5hcnlGb3JtYXQvV2FzbS5oIgorI2luY2x1ZGUgImxsdm0vT2JqZWN0WUFNTC9ZQU1MLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBXYXNtWUFNTCB7CisKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50MzJfdCwgU2VjdGlvblR5cGUpCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDMyX3QsIFZhbHVlVHlwZSkKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50MzJfdCwgVGFibGVUeXBlKQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQzMl90LCBTaWduYXR1cmVGb3JtKQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQzMl90LCBFeHBvcnRLaW5kKQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQzMl90LCBPcGNvZGUpCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDMyX3QsIFJlbG9jVHlwZSkKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50MzJfdCwgU3ltYm9sRmxhZ3MpCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDMyX3QsIFN5bWJvbEtpbmQpCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDMyX3QsIFNlZ21lbnRGbGFncykKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50MzJfdCwgTGltaXRGbGFncykKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50MzJfdCwgQ29tZGF0S2luZCkKKworc3RydWN0IEZpbGVIZWFkZXIgeworICB5YW1sOjpIZXgzMiBWZXJzaW9uOworfTsKKworc3RydWN0IExpbWl0cyB7CisgIExpbWl0RmxhZ3MgRmxhZ3M7CisgIHlhbWw6OkhleDMyIEluaXRpYWw7CisgIHlhbWw6OkhleDMyIE1heGltdW07Cit9OworCitzdHJ1Y3QgVGFibGUgeworICBUYWJsZVR5cGUgRWxlbVR5cGU7CisgIExpbWl0cyBUYWJsZUxpbWl0czsKK307CisKK3N0cnVjdCBFeHBvcnQgeworICBTdHJpbmdSZWYgTmFtZTsKKyAgRXhwb3J0S2luZCBLaW5kOworICB1aW50MzJfdCBJbmRleDsKK307CisKK3N0cnVjdCBFbGVtU2VnbWVudCB7CisgIHVpbnQzMl90IFRhYmxlSW5kZXg7CisgIHdhc206Oldhc21Jbml0RXhwciBPZmZzZXQ7CisgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBGdW5jdGlvbnM7Cit9OworCitzdHJ1Y3QgR2xvYmFsIHsKKyAgdWludDMyX3QgSW5kZXg7CisgIFZhbHVlVHlwZSBUeXBlOworICBib29sIE11dGFibGU7CisgIHdhc206Oldhc21Jbml0RXhwciBJbml0RXhwcjsKK307CisKK3N0cnVjdCBJbXBvcnQgeworICBTdHJpbmdSZWYgTW9kdWxlOworICBTdHJpbmdSZWYgRmllbGQ7CisgIEV4cG9ydEtpbmQgS2luZDsKKyAgdW5pb24geworICAgIHVpbnQzMl90IFNpZ0luZGV4OworICAgIEdsb2JhbCBHbG9iYWxJbXBvcnQ7CisgICAgVGFibGUgVGFibGVJbXBvcnQ7CisgICAgTGltaXRzIE1lbW9yeTsKKyAgfTsKK307CisKK3N0cnVjdCBMb2NhbERlY2wgeworICBWYWx1ZVR5cGUgVHlwZTsKKyAgdWludDMyX3QgQ291bnQ7Cit9OworCitzdHJ1Y3QgRnVuY3Rpb24geworICB1aW50MzJfdCBJbmRleDsKKyAgc3RkOjp2ZWN0b3I8TG9jYWxEZWNsPiBMb2NhbHM7CisgIHlhbWw6OkJpbmFyeVJlZiBCb2R5OworfTsKKworc3RydWN0IFJlbG9jYXRpb24geworICBSZWxvY1R5cGUgVHlwZTsKKyAgdWludDMyX3QgSW5kZXg7CisgIHlhbWw6OkhleDMyIE9mZnNldDsKKyAgaW50MzJfdCBBZGRlbmQ7Cit9OworCitzdHJ1Y3QgRGF0YVNlZ21lbnQgeworICB1aW50MzJfdCBNZW1vcnlJbmRleDsKKyAgdWludDMyX3QgU2VjdGlvbk9mZnNldDsKKyAgd2FzbTo6V2FzbUluaXRFeHByIE9mZnNldDsKKyAgeWFtbDo6QmluYXJ5UmVmIENvbnRlbnQ7Cit9OworCitzdHJ1Y3QgTmFtZUVudHJ5IHsKKyAgdWludDMyX3QgSW5kZXg7CisgIFN0cmluZ1JlZiBOYW1lOworfTsKKworc3RydWN0IFNlZ21lbnRJbmZvIHsKKyAgdWludDMyX3QgSW5kZXg7CisgIFN0cmluZ1JlZiBOYW1lOworICB1aW50MzJfdCBBbGlnbm1lbnQ7CisgIFNlZ21lbnRGbGFncyBGbGFnczsKK307CisKK3N0cnVjdCBTaWduYXR1cmUgeworICB1aW50MzJfdCBJbmRleDsKKyAgU2lnbmF0dXJlRm9ybSBGb3JtID0gd2FzbTo6V0FTTV9UWVBFX0ZVTkM7CisgIHN0ZDo6dmVjdG9yPFZhbHVlVHlwZT4gUGFyYW1UeXBlczsKKyAgVmFsdWVUeXBlIFJldHVyblR5cGU7Cit9OworCitzdHJ1Y3QgU3ltYm9sSW5mbyB7CisgIHVpbnQzMl90IEluZGV4OworICBTdHJpbmdSZWYgTmFtZTsKKyAgU3ltYm9sS2luZCBLaW5kOworICBTeW1ib2xGbGFncyBGbGFnczsKKyAgdW5pb24geworICAgIHVpbnQzMl90IEVsZW1lbnRJbmRleDsKKyAgICB3YXNtOjpXYXNtRGF0YVJlZmVyZW5jZSBEYXRhUmVmOworICB9OworfTsKKworc3RydWN0IEluaXRGdW5jdGlvbiB7CisgIHVpbnQzMl90IFByaW9yaXR5OworICB1aW50MzJfdCBTeW1ib2w7Cit9OworCitzdHJ1Y3QgQ29tZGF0RW50cnkgeworICBDb21kYXRLaW5kIEtpbmQ7CisgIHVpbnQzMl90IEluZGV4OworfTsKKworc3RydWN0IENvbWRhdCB7CisgIFN0cmluZ1JlZiBOYW1lOworICBzdGQ6OnZlY3RvcjxDb21kYXRFbnRyeT4gRW50cmllczsKK307CisKK3N0cnVjdCBTZWN0aW9uIHsKKyAgZXhwbGljaXQgU2VjdGlvbihTZWN0aW9uVHlwZSBTZWNUeXBlKSA6IFR5cGUoU2VjVHlwZSkge30KKyAgdmlydHVhbCB+U2VjdGlvbigpOworCisgIFNlY3Rpb25UeXBlIFR5cGU7CisgIHN0ZDo6dmVjdG9yPFJlbG9jYXRpb24+IFJlbG9jYXRpb25zOworfTsKKworc3RydWN0IEN1c3RvbVNlY3Rpb24gOiBTZWN0aW9uIHsKKyAgZXhwbGljaXQgQ3VzdG9tU2VjdGlvbihTdHJpbmdSZWYgTmFtZSkKKyAgICAgIDogU2VjdGlvbih3YXNtOjpXQVNNX1NFQ19DVVNUT00pLCBOYW1lKE5hbWUpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPlR5cGUgPT0gd2FzbTo6V0FTTV9TRUNfQ1VTVE9NOworICB9CisKKyAgU3RyaW5nUmVmIE5hbWU7CisgIHlhbWw6OkJpbmFyeVJlZiBQYXlsb2FkOworfTsKKworc3RydWN0IE5hbWVTZWN0aW9uIDogQ3VzdG9tU2VjdGlvbiB7CisgIE5hbWVTZWN0aW9uKCkgOiBDdXN0b21TZWN0aW9uKCJuYW1lIikge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNlY3Rpb24gKlMpIHsKKyAgICBhdXRvIEMgPSBkeW5fY2FzdDxDdXN0b21TZWN0aW9uPihTKTsKKyAgICByZXR1cm4gQyAmJiBDLT5OYW1lID09ICJuYW1lIjsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPE5hbWVFbnRyeT4gRnVuY3Rpb25OYW1lczsKK307CisKK3N0cnVjdCBMaW5raW5nU2VjdGlvbiA6IEN1c3RvbVNlY3Rpb24geworICBMaW5raW5nU2VjdGlvbigpIDogQ3VzdG9tU2VjdGlvbigibGlua2luZyIpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTZWN0aW9uICpTKSB7CisgICAgYXV0byBDID0gZHluX2Nhc3Q8Q3VzdG9tU2VjdGlvbj4oUyk7CisgICAgcmV0dXJuIEMgJiYgQy0+TmFtZSA9PSAibGlua2luZyI7CisgIH0KKworICBzdGQ6OnZlY3RvcjxTeW1ib2xJbmZvPiBTeW1ib2xUYWJsZTsKKyAgc3RkOjp2ZWN0b3I8U2VnbWVudEluZm8+IFNlZ21lbnRJbmZvczsKKyAgc3RkOjp2ZWN0b3I8SW5pdEZ1bmN0aW9uPiBJbml0RnVuY3Rpb25zOworICBzdGQ6OnZlY3RvcjxDb21kYXQ+IENvbWRhdHM7Cit9OworCitzdHJ1Y3QgVHlwZVNlY3Rpb24gOiBTZWN0aW9uIHsKKyAgVHlwZVNlY3Rpb24oKSA6IFNlY3Rpb24od2FzbTo6V0FTTV9TRUNfVFlQRSkge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNlY3Rpb24gKlMpIHsKKyAgICByZXR1cm4gUy0+VHlwZSA9PSB3YXNtOjpXQVNNX1NFQ19UWVBFOworICB9CisKKyAgc3RkOjp2ZWN0b3I8U2lnbmF0dXJlPiBTaWduYXR1cmVzOworfTsKKworc3RydWN0IEltcG9ydFNlY3Rpb24gOiBTZWN0aW9uIHsKKyAgSW1wb3J0U2VjdGlvbigpIDogU2VjdGlvbih3YXNtOjpXQVNNX1NFQ19JTVBPUlQpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPlR5cGUgPT0gd2FzbTo6V0FTTV9TRUNfSU1QT1JUOworICB9CisKKyAgc3RkOjp2ZWN0b3I8SW1wb3J0PiBJbXBvcnRzOworfTsKKworc3RydWN0IEZ1bmN0aW9uU2VjdGlvbiA6IFNlY3Rpb24geworICBGdW5jdGlvblNlY3Rpb24oKSA6IFNlY3Rpb24od2FzbTo6V0FTTV9TRUNfRlVOQ1RJT04pIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPlR5cGUgPT0gd2FzbTo6V0FTTV9TRUNfRlVOQ1RJT047CisgIH0KKworICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gRnVuY3Rpb25UeXBlczsKK307CisKK3N0cnVjdCBUYWJsZVNlY3Rpb24gOiBTZWN0aW9uIHsKKyAgVGFibGVTZWN0aW9uKCkgOiBTZWN0aW9uKHdhc206OldBU01fU0VDX1RBQkxFKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU2VjdGlvbiAqUykgeworICAgIHJldHVybiBTLT5UeXBlID09IHdhc206OldBU01fU0VDX1RBQkxFOworICB9CisKKyAgc3RkOjp2ZWN0b3I8VGFibGU+IFRhYmxlczsKK307CisKK3N0cnVjdCBNZW1vcnlTZWN0aW9uIDogU2VjdGlvbiB7CisgIE1lbW9yeVNlY3Rpb24oKSA6IFNlY3Rpb24od2FzbTo6V0FTTV9TRUNfTUVNT1JZKSB7fQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU2VjdGlvbiAqUykgeworICAgIHJldHVybiBTLT5UeXBlID09IHdhc206OldBU01fU0VDX01FTU9SWTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPExpbWl0cz4gTWVtb3JpZXM7Cit9OworCitzdHJ1Y3QgR2xvYmFsU2VjdGlvbiA6IFNlY3Rpb24geworICBHbG9iYWxTZWN0aW9uKCkgOiBTZWN0aW9uKHdhc206OldBU01fU0VDX0dMT0JBTCkge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNlY3Rpb24gKlMpIHsKKyAgICByZXR1cm4gUy0+VHlwZSA9PSB3YXNtOjpXQVNNX1NFQ19HTE9CQUw7CisgIH0KKworICBzdGQ6OnZlY3RvcjxHbG9iYWw+IEdsb2JhbHM7Cit9OworCitzdHJ1Y3QgRXhwb3J0U2VjdGlvbiA6IFNlY3Rpb24geworICBFeHBvcnRTZWN0aW9uKCkgOiBTZWN0aW9uKHdhc206OldBU01fU0VDX0VYUE9SVCkge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNlY3Rpb24gKlMpIHsKKyAgICByZXR1cm4gUy0+VHlwZSA9PSB3YXNtOjpXQVNNX1NFQ19FWFBPUlQ7CisgIH0KKworICBzdGQ6OnZlY3RvcjxFeHBvcnQ+IEV4cG9ydHM7Cit9OworCitzdHJ1Y3QgU3RhcnRTZWN0aW9uIDogU2VjdGlvbiB7CisgIFN0YXJ0U2VjdGlvbigpIDogU2VjdGlvbih3YXNtOjpXQVNNX1NFQ19TVEFSVCkge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNlY3Rpb24gKlMpIHsKKyAgICByZXR1cm4gUy0+VHlwZSA9PSB3YXNtOjpXQVNNX1NFQ19TVEFSVDsKKyAgfQorCisgIHVpbnQzMl90IFN0YXJ0RnVuY3Rpb247Cit9OworCitzdHJ1Y3QgRWxlbVNlY3Rpb24gOiBTZWN0aW9uIHsKKyAgRWxlbVNlY3Rpb24oKSA6IFNlY3Rpb24od2FzbTo6V0FTTV9TRUNfRUxFTSkge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNlY3Rpb24gKlMpIHsKKyAgICByZXR1cm4gUy0+VHlwZSA9PSB3YXNtOjpXQVNNX1NFQ19FTEVNOworICB9CisKKyAgc3RkOjp2ZWN0b3I8RWxlbVNlZ21lbnQ+IFNlZ21lbnRzOworfTsKKworc3RydWN0IENvZGVTZWN0aW9uIDogU2VjdGlvbiB7CisgIENvZGVTZWN0aW9uKCkgOiBTZWN0aW9uKHdhc206OldBU01fU0VDX0NPREUpIHt9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBTZWN0aW9uICpTKSB7CisgICAgcmV0dXJuIFMtPlR5cGUgPT0gd2FzbTo6V0FTTV9TRUNfQ09ERTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPEZ1bmN0aW9uPiBGdW5jdGlvbnM7Cit9OworCitzdHJ1Y3QgRGF0YVNlY3Rpb24gOiBTZWN0aW9uIHsKKyAgRGF0YVNlY3Rpb24oKSA6IFNlY3Rpb24od2FzbTo6V0FTTV9TRUNfREFUQSkge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNlY3Rpb24gKlMpIHsKKyAgICByZXR1cm4gUy0+VHlwZSA9PSB3YXNtOjpXQVNNX1NFQ19EQVRBOworICB9CisKKyAgc3RkOjp2ZWN0b3I8RGF0YVNlZ21lbnQ+IFNlZ21lbnRzOworfTsKKworc3RydWN0IE9iamVjdCB7CisgIEZpbGVIZWFkZXIgSGVhZGVyOworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8U2VjdGlvbj4+IFNlY3Rpb25zOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIFdhc21ZQU1MCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKHN0ZDo6dW5pcXVlX3B0cjxsbHZtOjpXYXNtWUFNTDo6U2VjdGlvbj4pCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Oldhc21ZQU1MOjpTaWduYXR1cmUpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Oldhc21ZQU1MOjpWYWx1ZVR5cGUpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Oldhc21ZQU1MOjpUYWJsZSkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6V2FzbVlBTUw6OkltcG9ydCkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6V2FzbVlBTUw6OkV4cG9ydCkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6V2FzbVlBTUw6OkVsZW1TZWdtZW50KQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpXYXNtWUFNTDo6TGltaXRzKQorTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUihsbHZtOjpXYXNtWUFNTDo6RGF0YVNlZ21lbnQpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Oldhc21ZQU1MOjpHbG9iYWwpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Oldhc21ZQU1MOjpGdW5jdGlvbikKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6V2FzbVlBTUw6OkxvY2FsRGVjbCkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6V2FzbVlBTUw6OlJlbG9jYXRpb24pCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Oldhc21ZQU1MOjpOYW1lRW50cnkpCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Oldhc21ZQU1MOjpTZWdtZW50SW5mbykKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6V2FzbVlBTUw6OlN5bWJvbEluZm8pCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Oldhc21ZQU1MOjpJbml0RnVuY3Rpb24pCitMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SKGxsdm06Oldhc21ZQU1MOjpDb21kYXRFbnRyeSkKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IobGx2bTo6V2FzbVlBTUw6OkNvbWRhdCkKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHlhbWwgeworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxXYXNtWUFNTDo6RmlsZUhlYWRlcj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgV2FzbVlBTUw6OkZpbGVIZWFkZXIgJkZpbGVIZHIpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8c3RkOjp1bmlxdWVfcHRyPFdhc21ZQU1MOjpTZWN0aW9uPj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgc3RkOjp1bmlxdWVfcHRyPFdhc21ZQU1MOjpTZWN0aW9uPiAmU2VjdGlvbik7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxXYXNtWUFNTDo6T2JqZWN0PiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBXYXNtWUFNTDo6T2JqZWN0ICZPYmplY3QpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8V2FzbVlBTUw6OkltcG9ydD4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgV2FzbVlBTUw6OkltcG9ydCAmSW1wb3J0KTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPFdhc21ZQU1MOjpFeHBvcnQ+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIFdhc21ZQU1MOjpFeHBvcnQgJkV4cG9ydCk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxXYXNtWUFNTDo6R2xvYmFsPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBXYXNtWUFNTDo6R2xvYmFsICZHbG9iYWwpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckJpdFNldFRyYWl0czxXYXNtWUFNTDo6TGltaXRGbGFncz4geworICBzdGF0aWMgdm9pZCBiaXRzZXQoSU8gJklPLCBXYXNtWUFNTDo6TGltaXRGbGFncyAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckJpdFNldFRyYWl0czxXYXNtWUFNTDo6U3ltYm9sRmxhZ3M+IHsKKyAgc3RhdGljIHZvaWQgYml0c2V0KElPICZJTywgV2FzbVlBTUw6OlN5bWJvbEZsYWdzICZWYWx1ZSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8V2FzbVlBTUw6OlN5bWJvbEtpbmQ+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBXYXNtWUFNTDo6U3ltYm9sS2luZCAmS2luZCk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyQml0U2V0VHJhaXRzPFdhc21ZQU1MOjpTZWdtZW50RmxhZ3M+IHsKKyAgc3RhdGljIHZvaWQgYml0c2V0KElPICZJTywgV2FzbVlBTUw6OlNlZ21lbnRGbGFncyAmVmFsdWUpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPFdhc21ZQU1MOjpTZWN0aW9uVHlwZT4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIFdhc21ZQU1MOjpTZWN0aW9uVHlwZSAmVHlwZSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxXYXNtWUFNTDo6U2lnbmF0dXJlPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBXYXNtWUFNTDo6U2lnbmF0dXJlICZTaWduYXR1cmUpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8V2FzbVlBTUw6OlRhYmxlPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBXYXNtWUFNTDo6VGFibGUgJlRhYmxlKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPFdhc21ZQU1MOjpMaW1pdHM+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIFdhc21ZQU1MOjpMaW1pdHMgJkxpbWl0cyk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxXYXNtWUFNTDo6RnVuY3Rpb24+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIFdhc21ZQU1MOjpGdW5jdGlvbiAmRnVuY3Rpb24pOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8V2FzbVlBTUw6OlJlbG9jYXRpb24+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIFdhc21ZQU1MOjpSZWxvY2F0aW9uICZSZWxvY2F0aW9uKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPFdhc21ZQU1MOjpOYW1lRW50cnk+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIFdhc21ZQU1MOjpOYW1lRW50cnkgJk5hbWVFbnRyeSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxXYXNtWUFNTDo6U2VnbWVudEluZm8+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIFdhc21ZQU1MOjpTZWdtZW50SW5mbyAmU2VnbWVudEluZm8pOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8V2FzbVlBTUw6OkxvY2FsRGVjbD4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgV2FzbVlBTUw6OkxvY2FsRGVjbCAmTG9jYWxEZWNsKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPHdhc206Oldhc21Jbml0RXhwcj4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgd2FzbTo6V2FzbUluaXRFeHByICZFeHByKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPFdhc21ZQU1MOjpEYXRhU2VnbWVudD4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgV2FzbVlBTUw6OkRhdGFTZWdtZW50ICZTZWdtZW50KTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPFdhc21ZQU1MOjpFbGVtU2VnbWVudD4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgV2FzbVlBTUw6OkVsZW1TZWdtZW50ICZTZWdtZW50KTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPFdhc21ZQU1MOjpTeW1ib2xJbmZvPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBXYXNtWUFNTDo6U3ltYm9sSW5mbyAmSW5mbyk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxXYXNtWUFNTDo6SW5pdEZ1bmN0aW9uPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBXYXNtWUFNTDo6SW5pdEZ1bmN0aW9uICZJbml0KTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxXYXNtWUFNTDo6Q29tZGF0S2luZD4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIFdhc21ZQU1MOjpDb21kYXRLaW5kICZLaW5kKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPFdhc21ZQU1MOjpDb21kYXRFbnRyeT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgV2FzbVlBTUw6OkNvbWRhdEVudHJ5ICZDb21kYXRFbnRyeSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxXYXNtWUFNTDo6Q29tZGF0PiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCBXYXNtWUFNTDo6Q29tZGF0ICZDb21kYXQpOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPFdhc21ZQU1MOjpWYWx1ZVR5cGU+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCBXYXNtWUFNTDo6VmFsdWVUeXBlICZUeXBlKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxXYXNtWUFNTDo6RXhwb3J0S2luZD4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIFdhc21ZQU1MOjpFeHBvcnRLaW5kICZLaW5kKTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxXYXNtWUFNTDo6VGFibGVUeXBlPiB7CisgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZJTywgV2FzbVlBTUw6OlRhYmxlVHlwZSAmVHlwZSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8V2FzbVlBTUw6Ok9wY29kZT4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIFdhc21ZQU1MOjpPcGNvZGUgJk9wY29kZSk7Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8V2FzbVlBTUw6OlJlbG9jVHlwZT4geworICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmSU8sIFdhc21ZQU1MOjpSZWxvY1R5cGUgJktpbmQpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHlhbWwKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX09CSkVDVFlBTUxfV0FTTVlBTUxfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PYmplY3RZQU1ML1lBTUwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9ZQU1MLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTMyNjZkZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT2JqZWN0WUFNTC9ZQU1MLmgKQEAgLTAsMCArMSwxMTcgQEAKKy8vPT09LSBZQU1MLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PQkpFQ1RZQU1MX1lBTUxfSAorI2RlZmluZSBMTFZNX09CSkVDVFlBTUxfWUFNTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9ZQU1MVHJhaXRzLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworbmFtZXNwYWNlIHlhbWwgeworCisvLy8gXGJyaWVmIFNwZWNpYWxpemVkIFlBTUxJTyBzY2FsYXIgdHlwZSBmb3IgcmVwcmVzZW50aW5nIGEgYmluYXJ5IGJsb2IuCisvLy8KKy8vLyBBIHR5cGljYWwgdXNlIGNhc2Ugd291bGQgYmUgdG8gcmVwcmVzZW50IHRoZSBjb250ZW50IG9mIGEgc2VjdGlvbiBpbiBhCisvLy8gYmluYXJ5IGZpbGUuCisvLy8gVGhpcyBjbGFzcyBoYXMgY3VzdG9tIFlBTUxJTyB0cmFpdHMgZm9yIGNvbnZlbmllbnQgcmVhZGluZyBhbmQgd3JpdGluZy4KKy8vLyBJdCByZW5kZXJzIGFzIGEgc3RyaW5nIG9mIGhleCBkaWdpdHMgaW4gYSBZQU1MIGZpbGUuCisvLy8gRm9yIGV4YW1wbGUsIGl0IG1pZ2h0IHJlbmRlciBhcyBgREVBREJFRUZDQUZFQkFCRWAgKFlBTUwgZG9lcyBub3QKKy8vLyByZXF1aXJlIHRoZSBxdW90YXRpb24gbWFya3MsIHNvIGZvciBzaW1wbGljaXR5IHdoZW4gb3V0cHV0dGluZyB0aGV5IGFyZQorLy8vIG9taXR0ZWQpLgorLy8vIFdoZW4gcmVhZGluZywgYW55IHN0cmluZyB3aG9zZSBjb250ZW50IGlzIGFuIGV2ZW4gbnVtYmVyIG9mIGhleCBkaWdpdHMKKy8vLyB3aWxsIGJlIGFjY2VwdGVkLgorLy8vIEZvciBleGFtcGxlLCBhbGwgb2YgdGhlIGZvbGxvd2luZyBhcmUgYWNjZXB0YWJsZToKKy8vLyBgREVBREJFRUZgLCBgIkRlQURiRWVGImAsIGAiXHg0NEVBREJFRUYiYCAoTm90ZTogJ1x4NDQnID09ICdEJykKKy8vLworLy8vIEEgc2lnbmlmaWNhbnQgYWR2YW50YWdlIG9mIHVzaW5nIHRoaXMgY2xhc3MgaXMgdGhhdCBpdCBuZXZlciBhbGxvY2F0ZXMKKy8vLyB0ZW1wb3Jhcnkgc3RyaW5ncyBvciBidWZmZXJzIGZvciBhbnkgb2YgaXRzIGZ1bmN0aW9uYWxpdHkuCisvLy8KKy8vLyBFeGFtcGxlOgorLy8vCisvLy8gVGhlIFlBTUwgbWFwcGluZzoKKy8vLyBcY29kZQorLy8vIEZvbzogREVBREJFRUZDQUZFQkFCRQorLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBDb3VsZCBiZSBtb2RlbGVkIGluIFlBTUxJTyBieSB0aGUgc3RydWN0OgorLy8vIFxjb2RlCisvLy8gc3RydWN0IEZvb0hvbGRlciB7CisvLy8gICBCaW5hcnlSZWYgRm9vOworLy8vIH07CisvLy8gbmFtZXNwYWNlIGxsdm0geworLy8vIG5hbWVzcGFjZSB5YW1sIHsKKy8vLyB0ZW1wbGF0ZSA8PgorLy8vIHN0cnVjdCBNYXBwaW5nVHJhaXRzPEZvb0hvbGRlcj4geworLy8vICAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIEZvb0hvbGRlciAmRkgpIHsKKy8vLyAgICAgSU8ubWFwUmVxdWlyZWQoIkZvbyIsIEZILkZvbyk7CisvLy8gICB9CisvLy8gfTsKKy8vLyB9IC8vIGVuZCBuYW1lc3BhY2UgeWFtbAorLy8vIH0gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisvLy8gXGVuZGNvZGUKK2NsYXNzIEJpbmFyeVJlZiB7CisgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgQmluYXJ5UmVmICZMSFMsIGNvbnN0IEJpbmFyeVJlZiAmUkhTKTsKKworICAvLy8gXGJyaWVmIEVpdGhlciByYXcgYmluYXJ5IGRhdGEsIG9yIGEgc3RyaW5nIG9mIGhleCBieXRlcyAobXVzdCBhbHdheXMKKyAgLy8vIGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGNoYXJhY3RlcnMpLgorICBBcnJheVJlZjx1aW50OF90PiBEYXRhOworCisgIC8vLyBcYnJpZWYgRGlzY3JpbWluYXRvciBiZXR3ZWVuIHRoZSB0d28gc3RhdGVzIG9mIHRoZSBgRGF0YWAgbWVtYmVyLgorICBib29sIERhdGFJc0hleFN0cmluZyA9IHRydWU7CisKK3B1YmxpYzoKKyAgQmluYXJ5UmVmKCkgPSBkZWZhdWx0OworICBCaW5hcnlSZWYoQXJyYXlSZWY8dWludDhfdD4gRGF0YSkgOiBEYXRhKERhdGEpLCBEYXRhSXNIZXhTdHJpbmcoZmFsc2UpIHt9CisgIEJpbmFyeVJlZihTdHJpbmdSZWYgRGF0YSkKKyAgICAgIDogRGF0YShyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oRGF0YS5kYXRhKCkpLCBEYXRhLnNpemUoKSkge30KKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhcmUgcmVwcmVzZW50ZWQgYnkgdGhpcyBCaW5hcnlSZWYuCisgIC8vLyBUaGlzIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3cml0ZUFzQmluYXJ5KCkgd2lsbCB3cml0ZS4KKyAgQXJyYXlSZWY8dWludDhfdD46OnNpemVfdHlwZSBiaW5hcnlfc2l6ZSgpIGNvbnN0IHsKKyAgICBpZiAoRGF0YUlzSGV4U3RyaW5nKQorICAgICAgcmV0dXJuIERhdGEuc2l6ZSgpIC8gMjsKKyAgICByZXR1cm4gRGF0YS5zaXplKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFdyaXRlIHRoZSBjb250ZW50cyAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGJpbmFyeSBvciBhCisgIC8vLyBoZXggc3RyaW5nKSBhcyBiaW5hcnkgdG8gdGhlIGdpdmVuIHJhd19vc3RyZWFtLgorICB2b2lkIHdyaXRlQXNCaW5hcnkocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFdyaXRlIHRoZSBjb250ZW50cyAocmVnYXJkbGVzcyBvZiB3aGV0aGVyIGl0IGlzIGJpbmFyeSBvciBhCisgIC8vLyBoZXggc3RyaW5nKSBhcyBoZXggdG8gdGhlIGdpdmVuIHJhd19vc3RyZWFtLgorICAvLy8KKyAgLy8vIEZvciBleGFtcGxlLCBhIHBvc3NpYmxlIG91dHB1dCBjb3VsZCBiZSBgREVBREJFRUZDQUZFQkFCRWAuCisgIHZvaWQgd3JpdGVBc0hleChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworfTsKKworaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBCaW5hcnlSZWYgJkxIUywgY29uc3QgQmluYXJ5UmVmICZSSFMpIHsKKyAgLy8gU3BlY2lhbCBjYXNlIGZvciBkZWZhdWx0IGNvbnN0cnVjdGVkIEJpbmFyeVJlZi4KKyAgaWYgKExIUy5EYXRhLmVtcHR5KCkgJiYgUkhTLkRhdGEuZW1wdHkoKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gTEhTLkRhdGFJc0hleFN0cmluZyA9PSBSSFMuRGF0YUlzSGV4U3RyaW5nICYmIExIUy5EYXRhID09IFJIUy5EYXRhOworfQorCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyVHJhaXRzPEJpbmFyeVJlZj4geworICBzdGF0aWMgdm9pZCBvdXRwdXQoY29uc3QgQmluYXJ5UmVmICYsIHZvaWQgKiwgcmF3X29zdHJlYW0gJik7CisgIHN0YXRpYyBTdHJpbmdSZWYgaW5wdXQoU3RyaW5nUmVmLCB2b2lkICosIEJpbmFyeVJlZiAmKTsKKyAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYgUykgeyByZXR1cm4gbmVlZHNRdW90ZXMoUyk7IH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSB5YW1sCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX09CSkVDVFlBTUxfWUFNTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09wdGlvbi9BcmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT3B0aW9uL0FyZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MTlhNGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09wdGlvbi9BcmcuaApAQCAtMCwwICsxLDEzMiBAQAorLy89PT0tIEFyZy5oIC0gUGFyc2VkIEFyZ3VtZW50IENsYXNzZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIERlZmluZXMgdGhlIGxsdm06OkFyZyBjbGFzcyBmb3IgcGFyc2VkIGFyZ3VtZW50cy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09QVElPTl9BUkdfSAorI2RlZmluZSBMTFZNX09QVElPTl9BUkdfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL09wdGlvbi9PcHRpb24uaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBvcHQgeworCitjbGFzcyBBcmdMaXN0OworCisvLy8gXGJyaWVmIEEgY29uY3JldGUgaW5zdGFuY2Ugb2YgYSBwYXJ0aWN1bGFyIGRyaXZlciBvcHRpb24uCisvLy8KKy8vLyBUaGUgQXJnIGNsYXNzIGVuY29kZXMganVzdCBlbm91Z2ggaW5mb3JtYXRpb24gdG8gYmUgYWJsZSB0bworLy8vIGRlcml2ZSB0aGUgYXJndW1lbnQgdmFsdWVzIGVmZmljaWVudGx5LgorY2xhc3MgQXJnIHsKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgVGhlIG9wdGlvbiB0aGlzIGFyZ3VtZW50IGlzIGFuIGluc3RhbmNlIG9mLgorICBjb25zdCBPcHRpb24gT3B0OworCisgIC8vLyBcYnJpZWYgVGhlIGFyZ3VtZW50IHRoaXMgYXJndW1lbnQgd2FzIGRlcml2ZWQgZnJvbSAoZHVyaW5nIHRvb2wgY2hhaW4KKyAgLy8vIGFyZ3VtZW50IHRyYW5zbGF0aW9uKSwgaWYgYW55LgorICBjb25zdCBBcmcgKkJhc2VBcmc7CisKKyAgLy8vIFxicmllZiBIb3cgdGhpcyBpbnN0YW5jZSBvZiB0aGUgb3B0aW9uIHdhcyBzcGVsbGVkLgorICBTdHJpbmdSZWYgU3BlbGxpbmc7CisKKyAgLy8vIFxicmllZiBUaGUgaW5kZXggYXQgd2hpY2ggdGhpcyBhcmd1bWVudCBhcHBlYXJzIGluIHRoZSBjb250YWluaW5nCisgIC8vLyBBcmdMaXN0LgorICB1bnNpZ25lZCBJbmRleDsKKworICAvLy8gXGJyaWVmIFdhcyB0aGlzIGFyZ3VtZW50IHVzZWQgdG8gZWZmZWN0IGNvbXBpbGF0aW9uPworICAvLy8KKyAgLy8vIFRoaXMgaXMgdXNlZCBmb3IgZ2VuZXJhdGluZyAiYXJndW1lbnQgdW51c2VkIiBkaWFnbm9zdGljcy4KKyAgbXV0YWJsZSB1bnNpZ25lZCBDbGFpbWVkIDogMTsKKworICAvLy8gXGJyaWVmIERvZXMgdGhpcyBhcmd1bWVudCBvd24gaXRzIHZhbHVlcz8KKyAgbXV0YWJsZSB1bnNpZ25lZCBPd25zVmFsdWVzIDogMTsKKworICAvLy8gXGJyaWVmIFRoZSBhcmd1bWVudCB2YWx1ZXMsIGFzIEMgc3RyaW5ncy4KKyAgU21hbGxWZWN0b3I8Y29uc3QgY2hhciAqLCAyPiBWYWx1ZXM7CisKK3B1YmxpYzoKKyAgQXJnKGNvbnN0IE9wdGlvbiBPcHQsIFN0cmluZ1JlZiBTcGVsbGluZywgdW5zaWduZWQgSW5kZXgsCisgICAgICBjb25zdCBBcmcgKkJhc2VBcmcgPSBudWxscHRyKTsKKyAgQXJnKGNvbnN0IE9wdGlvbiBPcHQsIFN0cmluZ1JlZiBTcGVsbGluZywgdW5zaWduZWQgSW5kZXgsCisgICAgICBjb25zdCBjaGFyICpWYWx1ZTAsIGNvbnN0IEFyZyAqQmFzZUFyZyA9IG51bGxwdHIpOworICBBcmcoY29uc3QgT3B0aW9uIE9wdCwgU3RyaW5nUmVmIFNwZWxsaW5nLCB1bnNpZ25lZCBJbmRleCwKKyAgICAgIGNvbnN0IGNoYXIgKlZhbHVlMCwgY29uc3QgY2hhciAqVmFsdWUxLCBjb25zdCBBcmcgKkJhc2VBcmcgPSBudWxscHRyKTsKKyAgQXJnKGNvbnN0IEFyZyAmKSA9IGRlbGV0ZTsKKyAgQXJnICZvcGVyYXRvcj0oY29uc3QgQXJnICYpID0gZGVsZXRlOworICB+QXJnKCk7CisKKyAgY29uc3QgT3B0aW9uICZnZXRPcHRpb24oKSBjb25zdCB7IHJldHVybiBPcHQ7IH0KKyAgU3RyaW5nUmVmIGdldFNwZWxsaW5nKCkgY29uc3QgeyByZXR1cm4gU3BlbGxpbmc7IH0KKyAgdW5zaWduZWQgZ2V0SW5kZXgoKSBjb25zdCB7IHJldHVybiBJbmRleDsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBiYXNlIGFyZ3VtZW50IHdoaWNoIGdlbmVyYXRlZCB0aGlzIGFyZy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGVpdGhlciB0aGUgYXJndW1lbnQgaXRzZWxmIG9yIHRoZSBhcmd1bWVudCBpdCB3YXMKKyAgLy8vIGRlcml2ZWQgZnJvbSBkdXJpbmcgdG9vbCBjaGFpbiBzcGVjaWZpYyBhcmd1bWVudCB0cmFuc2xhdGlvbi4KKyAgY29uc3QgQXJnICZnZXRCYXNlQXJnKCkgY29uc3QgeworICAgIHJldHVybiBCYXNlQXJnID8gKkJhc2VBcmcgOiAqdGhpczsKKyAgfQorICB2b2lkIHNldEJhc2VBcmcoY29uc3QgQXJnICpCYXNlQXJnKSB7IHRoaXMtPkJhc2VBcmcgPSBCYXNlQXJnOyB9CisKKyAgYm9vbCBnZXRPd25zVmFsdWVzKCkgY29uc3QgeyByZXR1cm4gT3duc1ZhbHVlczsgfQorICB2b2lkIHNldE93bnNWYWx1ZXMoYm9vbCBWYWx1ZSkgY29uc3QgeyBPd25zVmFsdWVzID0gVmFsdWU7IH0KKworICBib29sIGlzQ2xhaW1lZCgpIGNvbnN0IHsgcmV0dXJuIGdldEJhc2VBcmcoKS5DbGFpbWVkOyB9CisKKyAgLy8vIFxicmllZiBTZXQgdGhlIEFyZyBjbGFpbWVkIGJpdC4KKyAgdm9pZCBjbGFpbSgpIGNvbnN0IHsgZ2V0QmFzZUFyZygpLkNsYWltZWQgPSB0cnVlOyB9CisKKyAgdW5zaWduZWQgZ2V0TnVtVmFsdWVzKCkgY29uc3QgeyByZXR1cm4gVmFsdWVzLnNpemUoKTsgfQorCisgIGNvbnN0IGNoYXIgKmdldFZhbHVlKHVuc2lnbmVkIE4gPSAwKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlc1tOXTsKKyAgfQorCisgIFNtYWxsVmVjdG9ySW1wbDxjb25zdCBjaGFyICo+ICZnZXRWYWx1ZXMoKSB7IHJldHVybiBWYWx1ZXM7IH0KKyAgY29uc3QgU21hbGxWZWN0b3JJbXBsPGNvbnN0IGNoYXIgKj4gJmdldFZhbHVlcygpIGNvbnN0IHsgcmV0dXJuIFZhbHVlczsgfQorCisgIGJvb2wgY29udGFpbnNWYWx1ZShTdHJpbmdSZWYgVmFsdWUpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gZ2V0TnVtVmFsdWVzKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKFZhbHVlc1tpXSA9PSBWYWx1ZSkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIFxicmllZiBBcHBlbmQgdGhlIGFyZ3VtZW50IG9udG8gdGhlIGdpdmVuIGFycmF5IGFzIHN0cmluZ3MuCisgIHZvaWQgcmVuZGVyKGNvbnN0IEFyZ0xpc3QgJkFyZ3MsIEFyZ1N0cmluZ0xpc3QgJk91dHB1dCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBBcHBlbmQgdGhlIGFyZ3VtZW50LCByZW5kZXIgYXMgYW4gaW5wdXQsIG9udG8gdGhlIGdpdmVuCisgIC8vLyBhcnJheSBhcyBzdHJpbmdzLgorICAvLy8KKyAgLy8vIFRoZSBkaXN0aW5jdGlvbiBpcyB0aGF0IHNvbWUgb3B0aW9ucyBvbmx5IHJlbmRlciB0aGVpciB2YWx1ZXMKKyAgLy8vIHdoZW4gcmVuZGVyZWQgYXMgYSBpbnB1dCAoZS5nLiwgWGxpbmtlcikuCisgIHZvaWQgcmVuZGVyQXNJbnB1dChjb25zdCBBcmdMaXN0ICZBcmdzLCBBcmdTdHJpbmdMaXN0ICZPdXRwdXQpIGNvbnN0OworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk8pIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFJldHVybiBhIGZvcm1hdHRlZCB2ZXJzaW9uIG9mIHRoZSBhcmd1bWVudCBhbmQKKyAgLy8vIGl0cyB2YWx1ZXMsIGZvciBkZWJ1Z2dpbmcgYW5kIGRpYWdub3N0aWNzLgorICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZyhjb25zdCBBcmdMaXN0ICZBcmdzKSBjb25zdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvcHQKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fT1BUSU9OX0FSR19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09wdGlvbi9BcmdMaXN0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09wdGlvbi9BcmdMaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwOTIxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT3B0aW9uL0FyZ0xpc3QuaApAQCAtMCwwICsxLDUyMyBAQAorLy89PT0tIEFyZ0xpc3QuaCAtIEFyZ3VtZW50IExpc3QgTWFuYWdlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09QVElPTl9BUkdMSVNUX0gKKyNkZWZpbmUgTExWTV9PUFRJT05fQVJHTElTVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL09wdGlvbi9BcmcuaCIKKyNpbmNsdWRlICJsbHZtL09wdGlvbi9PcHRTcGVjaWZpZXIuaCIKKyNpbmNsdWRlICJsbHZtL09wdGlvbi9PcHRpb24uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworbmFtZXNwYWNlIG9wdCB7CisKKy8vLyBhcmdfaXRlcmF0b3IgLSBJdGVyYXRlcyB0aHJvdWdoIGFyZ3VtZW50cyBzdG9yZWQgaW5zaWRlIGFuIEFyZ0xpc3QuCit0ZW1wbGF0ZTx0eXBlbmFtZSBCYXNlSXRlciwgdW5zaWduZWQgTnVtT3B0U3BlY2lmaWVycyA9IDA+CitjbGFzcyBhcmdfaXRlcmF0b3IgeworICAvLy8gVGhlIGN1cnJlbnQgYXJndW1lbnQgYW5kIHRoZSBlbmQgb2YgdGhlIHNlcXVlbmNlIHdlJ3JlIGl0ZXJhdGluZy4KKyAgQmFzZUl0ZXIgQ3VycmVudCwgRW5kOworCisgIC8vLyBPcHRpb25hbCBmaWx0ZXJzIG9uIHRoZSBhcmd1bWVudHMgd2hpY2ggd2lsbCBiZSBtYXRjaC4gVG8gYXZvaWQgYQorICAvLy8gemVyby1zaXplZCBhcnJheSwgd2Ugc3RvcmUgb25lIHNwZWNpZmllciBldmVuIGlmIHdlJ3JlIGFza2VkIGZvciBub25lLgorICBPcHRTcGVjaWZpZXIgSWRzW051bU9wdFNwZWNpZmllcnMgPyBOdW1PcHRTcGVjaWZpZXJzIDogMV07CisKKyAgdm9pZCBTa2lwVG9OZXh0QXJnKCkgeworICAgIGZvciAoOyBDdXJyZW50ICE9IEVuZDsgKytDdXJyZW50KSB7CisgICAgICAvLyBTa2lwIGVyYXNlZCBlbGVtZW50cy4KKyAgICAgIGlmICghKkN1cnJlbnQpCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvLyBEb25lIGlmIHRoZXJlIGFyZSBubyBmaWx0ZXJzLgorICAgICAgaWYgKCFOdW1PcHRTcGVjaWZpZXJzKQorICAgICAgICByZXR1cm47CisKKyAgICAgIC8vIE90aGVyd2lzZSByZXF1aXJlIGEgbWF0Y2guCisgICAgICBjb25zdCBPcHRpb24gJk8gPSAoKkN1cnJlbnQpLT5nZXRPcHRpb24oKTsKKyAgICAgIGZvciAoYXV0byBJZCA6IElkcykgeworICAgICAgICBpZiAoIUlkLmlzVmFsaWQoKSkKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgaWYgKE8ubWF0Y2hlcyhJZCkpCisgICAgICAgICAgcmV0dXJuOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHVzaW5nIFRyYWl0cyA9IHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEJhc2VJdGVyPjsKKworcHVibGljOgorICB1c2luZyB2YWx1ZV90eXBlID0gdHlwZW5hbWUgVHJhaXRzOjp2YWx1ZV90eXBlOworICB1c2luZyByZWZlcmVuY2UgPSB0eXBlbmFtZSBUcmFpdHM6OnJlZmVyZW5jZTsKKyAgdXNpbmcgcG9pbnRlciA9IHR5cGVuYW1lIFRyYWl0czo6cG9pbnRlcjsKKyAgdXNpbmcgaXRlcmF0b3JfY2F0ZWdvcnkgPSBzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnOworICB1c2luZyBkaWZmZXJlbmNlX3R5cGUgPSBzdGQ6OnB0cmRpZmZfdDsKKworICBhcmdfaXRlcmF0b3IoCisgICAgICBCYXNlSXRlciBDdXJyZW50LCBCYXNlSXRlciBFbmQsCisgICAgICBjb25zdCBPcHRTcGVjaWZpZXIgKCZJZHMpW051bU9wdFNwZWNpZmllcnMgPyBOdW1PcHRTcGVjaWZpZXJzIDogMV0gPSB7fSkKKyAgICAgIDogQ3VycmVudChDdXJyZW50KSwgRW5kKEVuZCkgeworICAgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgIT0gTnVtT3B0U3BlY2lmaWVyczsgKytJKQorICAgICAgdGhpcy0+SWRzW0ldID0gSWRzW0ldOworICAgIFNraXBUb05leHRBcmcoKTsKKyAgfQorCisgIC8vIEZJWE1FOiBUaGlzIGNvbnZlcnNpb24gZnVuY3Rpb24gbWFrZXMgbm8gc2Vuc2UuCisgIG9wZXJhdG9yIGNvbnN0IEFyZyooKSB7IHJldHVybiAqQ3VycmVudDsgfQorCisgIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqQ3VycmVudDsgfQorICBwb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiBDdXJyZW50OyB9CisKKyAgYXJnX2l0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgICsrQ3VycmVudDsKKyAgICBTa2lwVG9OZXh0QXJnKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgYXJnX2l0ZXJhdG9yIG9wZXJhdG9yKysoaW50KSB7CisgICAgYXJnX2l0ZXJhdG9yIHRtcCgqdGhpcyk7CisgICAgKysoKnRoaXMpOworICAgIHJldHVybiB0bXA7CisgIH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGFyZ19pdGVyYXRvciBMSFMsIGFyZ19pdGVyYXRvciBSSFMpIHsKKyAgICByZXR1cm4gTEhTLkN1cnJlbnQgPT0gUkhTLkN1cnJlbnQ7CisgIH0KKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3IhPShhcmdfaXRlcmF0b3IgTEhTLCBhcmdfaXRlcmF0b3IgUkhTKSB7CisgICAgcmV0dXJuICEoTEhTID09IFJIUyk7CisgIH0KK307CisKKy8vLyBBcmdMaXN0IC0gT3JkZXJlZCBjb2xsZWN0aW9uIG9mIGRyaXZlciBhcmd1bWVudHMuCisvLy8KKy8vLyBUaGUgQXJnTGlzdCBjbGFzcyBtYW5hZ2VzIGEgbGlzdCBvZiBBcmcgaW5zdGFuY2VzIGFzIHdlbGwgYXMKKy8vLyBhdXhpbGlhcnkgZGF0YSBhbmQgY29udmVuaWVuY2UgbWV0aG9kcyB0byBhbGxvdyBUb29scyB0byBxdWlja2x5CisvLy8gY2hlY2sgZm9yIHRoZSBwcmVzZW5jZSBvZiBBcmcgaW5zdGFuY2VzIGZvciBhIHBhcnRpY3VsYXIgT3B0aW9uCisvLy8gYW5kIHRvIGl0ZXJhdGUgb3ZlciBncm91cHMgb2YgYXJndW1lbnRzLgorY2xhc3MgQXJnTGlzdCB7CitwdWJsaWM6CisgIHVzaW5nIGFyZ2xpc3RfdHlwZSA9IFNtYWxsVmVjdG9yPEFyZyAqLCAxNj47CisgIHVzaW5nIGl0ZXJhdG9yID0gYXJnX2l0ZXJhdG9yPGFyZ2xpc3RfdHlwZTo6aXRlcmF0b3I+OworICB1c2luZyBjb25zdF9pdGVyYXRvciA9IGFyZ19pdGVyYXRvcjxhcmdsaXN0X3R5cGU6OmNvbnN0X2l0ZXJhdG9yPjsKKyAgdXNpbmcgcmV2ZXJzZV9pdGVyYXRvciA9IGFyZ19pdGVyYXRvcjxhcmdsaXN0X3R5cGU6OnJldmVyc2VfaXRlcmF0b3I+OworICB1c2luZyBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yID0KKyAgICAgIGFyZ19pdGVyYXRvcjxhcmdsaXN0X3R5cGU6OmNvbnN0X3JldmVyc2VfaXRlcmF0b3I+OworCisgIHRlbXBsYXRlPHVuc2lnbmVkIE4+IHVzaW5nIGZpbHRlcmVkX2l0ZXJhdG9yID0KKyAgICAgIGFyZ19pdGVyYXRvcjxhcmdsaXN0X3R5cGU6OmNvbnN0X2l0ZXJhdG9yLCBOPjsKKyAgdGVtcGxhdGU8dW5zaWduZWQgTj4gdXNpbmcgZmlsdGVyZWRfcmV2ZXJzZV9pdGVyYXRvciA9CisgICAgICBhcmdfaXRlcmF0b3I8YXJnbGlzdF90eXBlOjpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yLCBOPjsKKworcHJpdmF0ZToKKyAgLy8vIFRoZSBpbnRlcm5hbCBsaXN0IG9mIGFyZ3VtZW50cy4KKyAgYXJnbGlzdF90eXBlIEFyZ3M7CisKKyAgdXNpbmcgT3B0UmFuZ2UgPSBzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPjsKKyAgc3RhdGljIE9wdFJhbmdlIGVtcHR5UmFuZ2UoKSB7IHJldHVybiB7LTF1LCAwdX07IH0KKworICAvLy8gVGhlIGZpcnN0IGFuZCBsYXN0IGluZGV4IG9mIGVhY2ggZGlmZmVyZW50IE9wdFNwZWNpZmllciBJRC4KKyAgRGVuc2VNYXA8dW5zaWduZWQsIE9wdFJhbmdlPiBPcHRSYW5nZXM7CisKKyAgLy8vIEdldCB0aGUgcmFuZ2Ugb2YgaW5kZXhlcyBpbiB3aGljaCBvcHRpb25zIHdpdGggdGhlIHNwZWNpZmllZCBJRHMgbWlnaHQKKyAgLy8vIHJlc2lkZSwgb3IgKDAsIDApIGlmIHRoZXJlIGFyZSBubyBzdWNoIG9wdGlvbnMuCisgIE9wdFJhbmdlIGdldFJhbmdlKHN0ZDo6aW5pdGlhbGl6ZXJfbGlzdDxPcHRTcGVjaWZpZXI+IElkcykgY29uc3Q7CisKK3Byb3RlY3RlZDoKKyAgLy8gTWFrZSB0aGUgZGVmYXVsdCBzcGVjaWFsIG1lbWJlcnMgcHJvdGVjdGVkIHNvIHRoZXkgd29uJ3QgYmUgdXNlZCB0byBzbGljZQorICAvLyBkZXJpdmVkIG9iamVjdHMsIGJ1dCBjYW4gc3RpbGwgYmUgdXNlZCBieSBkZXJpdmVkIG9iamVjdHMgdG8gaW1wbGVtZW50CisgIC8vIHRoZWlyIG93biBzcGVjaWFsIG1lbWJlcnMuCisgIEFyZ0xpc3QoKSA9IGRlZmF1bHQ7CisKKyAgLy8gRXhwbGljaXQgbW92ZSBvcGVyYXRpb25zIHRvIGVuc3VyZSB0aGUgY29udGFpbmVyIGlzIGNsZWFyZWQgcG9zdC1tb3ZlCisgIC8vIG90aGVyd2lzZSBpdCBjb3VsZCBsZWFkIHRvIGEgZG91YmxlLWRlbGV0ZSBpbiB0aGUgY2FzZSBvZiBtb3Zpbmcgb2YgYW4KKyAgLy8gSW5wdXRBcmdMaXN0IHdoaWNoIGRlbGV0ZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBjb250YWluZXIuIElmIHdlIGNvdWxkIGZpeAorICAvLyB1cCB0aGUgb3duZXJzaGlwIGhlcmUgKGRlbGVnYXRlIHN0b3JhZ2Uvb3duZXJzaGlwIHRvIHRoZSBkZXJpdmVkIGNsYXNzIHNvCisgIC8vIGl0IGNhbiBiZSBhIGNvbnRhaW5lciBvZiB1bmlxdWVfcHRyKSB0aGlzIHdvdWxkIGJlIHNpbXBsZXIuCisgIEFyZ0xpc3QoQXJnTGlzdCAmJlJIUykKKyAgICAgIDogQXJncyhzdGQ6Om1vdmUoUkhTLkFyZ3MpKSwgT3B0UmFuZ2VzKHN0ZDo6bW92ZShSSFMuT3B0UmFuZ2VzKSkgeworICAgIFJIUy5BcmdzLmNsZWFyKCk7CisgICAgUkhTLk9wdFJhbmdlcy5jbGVhcigpOworICB9CisKKyAgQXJnTGlzdCAmb3BlcmF0b3I9KEFyZ0xpc3QgJiZSSFMpIHsKKyAgICBBcmdzID0gc3RkOjptb3ZlKFJIUy5BcmdzKTsKKyAgICBSSFMuQXJncy5jbGVhcigpOworICAgIE9wdFJhbmdlcyA9IHN0ZDo6bW92ZShSSFMuT3B0UmFuZ2VzKTsKKyAgICBSSFMuT3B0UmFuZ2VzLmNsZWFyKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gUHJvdGVjdCB0aGUgZHRvciB0byBlbnN1cmUgdGhpcyB0eXBlIGlzIG5ldmVyIGRlc3Ryb3llZCBwb2x5bW9ycGhpY2FsbHkuCisgIH5BcmdMaXN0KCkgPSBkZWZhdWx0OworCisgIC8vIEltcGxpY2l0bHkgY29udmVydCBhIHZhbHVlIHRvIGFuIE9wdFNwZWNpZmllci4gVXNlZCB0byB3b3JrIGFyb3VuZCBhIGJ1ZworICAvLyBpbiBNU1ZDJ3MgaW1wbGVtZW50YXRpb24gb2YgbmFycm93aW5nIGNvbnZlcnNpb24gY2hlY2tpbmcuCisgIHN0YXRpYyBPcHRTcGVjaWZpZXIgdG9PcHRTcGVjaWZpZXIoT3B0U3BlY2lmaWVyIFMpIHsgcmV0dXJuIFM7IH0KKworcHVibGljOgorICAvLy8gQG5hbWUgQXJnIEFjY2VzcworICAvLy8gQHsKKworICAvLy8gYXBwZW5kIC0gQXBwZW5kIFxwIEEgdG8gdGhlIGFyZyBsaXN0LgorICB2b2lkIGFwcGVuZChBcmcgKkEpOworCisgIGNvbnN0IGFyZ2xpc3RfdHlwZSAmZ2V0QXJncygpIGNvbnN0IHsgcmV0dXJuIEFyZ3M7IH0KKworICB1bnNpZ25lZCBzaXplKCkgY29uc3QgeyByZXR1cm4gQXJncy5zaXplKCk7IH0KKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIEFyZyBJdGVyYXRpb24KKyAgLy8vIEB7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiB7QXJncy5iZWdpbigpLCBBcmdzLmVuZCgpfTsgfQorICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiB7QXJncy5lbmQoKSwgQXJncy5lbmQoKX07IH0KKworICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsgcmV0dXJuIHtBcmdzLnJiZWdpbigpLCBBcmdzLnJlbmQoKX07IH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeyByZXR1cm4ge0FyZ3MucmVuZCgpLCBBcmdzLnJlbmQoKX07IH0KKworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIHtBcmdzLmJlZ2luKCksIEFyZ3MuZW5kKCl9OyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIHtBcmdzLmVuZCgpLCBBcmdzLmVuZCgpfTsgfQorCisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeyByZXR1cm4ge0FyZ3MucmJlZ2luKCksIEFyZ3MucmVuZCgpfTsgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7IHJldHVybiB7QXJncy5yZW5kKCksIEFyZ3MucmVuZCgpfTsgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLk9wdFNwZWNpZmllcnM+CisgIGl0ZXJhdG9yX3JhbmdlPGZpbHRlcmVkX2l0ZXJhdG9yPHNpemVvZi4uLihPcHRTcGVjaWZpZXJzKT4+CisgIGZpbHRlcmVkKE9wdFNwZWNpZmllcnMgLi4uSWRzKSBjb25zdCB7CisgICAgT3B0UmFuZ2UgUmFuZ2UgPSBnZXRSYW5nZSh7dG9PcHRTcGVjaWZpZXIoSWRzKS4uLn0pOworICAgIGF1dG8gQiA9IEFyZ3MuYmVnaW4oKSArIFJhbmdlLmZpcnN0OworICAgIGF1dG8gRSA9IEFyZ3MuYmVnaW4oKSArIFJhbmdlLnNlY29uZDsKKyAgICB1c2luZyBJdGVyYXRvciA9IGZpbHRlcmVkX2l0ZXJhdG9yPHNpemVvZi4uLihPcHRTcGVjaWZpZXJzKT47CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoSXRlcmF0b3IoQiwgRSwge3RvT3B0U3BlY2lmaWVyKElkcykuLi59KSwKKyAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvcihFLCBFLCB7dG9PcHRTcGVjaWZpZXIoSWRzKS4uLn0pKTsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLk9wdFNwZWNpZmllcnM+CisgIGl0ZXJhdG9yX3JhbmdlPGZpbHRlcmVkX3JldmVyc2VfaXRlcmF0b3I8c2l6ZW9mLi4uKE9wdFNwZWNpZmllcnMpPj4KKyAgZmlsdGVyZWRfcmV2ZXJzZShPcHRTcGVjaWZpZXJzIC4uLklkcykgY29uc3QgeworICAgIE9wdFJhbmdlIFJhbmdlID0gZ2V0UmFuZ2Uoe3RvT3B0U3BlY2lmaWVyKElkcykuLi59KTsKKyAgICBhdXRvIEIgPSBBcmdzLnJlbmQoKSAtIFJhbmdlLnNlY29uZDsKKyAgICBhdXRvIEUgPSBBcmdzLnJlbmQoKSAtIFJhbmdlLmZpcnN0OworICAgIHVzaW5nIEl0ZXJhdG9yID0gZmlsdGVyZWRfcmV2ZXJzZV9pdGVyYXRvcjxzaXplb2YuLi4oT3B0U3BlY2lmaWVycyk+OworICAgIHJldHVybiBtYWtlX3JhbmdlKEl0ZXJhdG9yKEIsIEUsIHt0b09wdFNwZWNpZmllcihJZHMpLi4ufSksCisgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IoRSwgRSwge3RvT3B0U3BlY2lmaWVyKElkcykuLi59KSk7CisgIH0KKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIEFyZyBSZW1vdmFsCisgIC8vLyBAeworCisgIC8vLyBlcmFzZUFyZyAtIFJlbW92ZSBhbnkgb3B0aW9uIG1hdGNoaW5nIFxwIElkLgorICB2b2lkIGVyYXNlQXJnKE9wdFNwZWNpZmllciBJZCk7CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBBcmcgQWNjZXNzCisgIC8vLyBAeworCisgIC8vLyBoYXNBcmcgLSBEb2VzIHRoZSBhcmcgbGlzdCBjb250YWluIGFueSBvcHRpb24gbWF0Y2hpbmcgXHAgSWQuCisgIC8vLworICAvLy8gXHAgQ2xhaW0gV2hldGhlciB0aGUgYXJndW1lbnQgc2hvdWxkIGJlIGNsYWltZWQsIGlmIGl0IGV4aXN0cy4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uT3B0U3BlY2lmaWVycz4KKyAgYm9vbCBoYXNBcmdOb0NsYWltKE9wdFNwZWNpZmllcnMgLi4uSWRzKSBjb25zdCB7CisgICAgcmV0dXJuIGdldExhc3RBcmdOb0NsYWltKElkcy4uLikgIT0gbnVsbHB0cjsKKyAgfQorICB0ZW1wbGF0ZTx0eXBlbmFtZSAuLi5PcHRTcGVjaWZpZXJzPgorICBib29sIGhhc0FyZyhPcHRTcGVjaWZpZXJzIC4uLklkcykgY29uc3QgeworICAgIHJldHVybiBnZXRMYXN0QXJnKElkcy4uLikgIT0gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGxhc3QgYXJndW1lbnQgbWF0Y2hpbmcgXHAgSWQsIG9yIG51bGwuCisgIHRlbXBsYXRlPHR5cGVuYW1lIC4uLk9wdFNwZWNpZmllcnM+CisgIEFyZyAqZ2V0TGFzdEFyZyhPcHRTcGVjaWZpZXJzIC4uLklkcykgY29uc3QgeworICAgIEFyZyAqUmVzID0gbnVsbHB0cjsKKyAgICBmb3IgKEFyZyAqQSA6IGZpbHRlcmVkKElkcy4uLikpIHsKKyAgICAgIFJlcyA9IEE7CisgICAgICBSZXMtPmNsYWltKCk7CisgICAgfQorICAgIHJldHVybiBSZXM7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBsYXN0IGFyZ3VtZW50IG1hdGNoaW5nIFxwIElkLCBvciBudWxsLiBEbyBub3QgImNsYWltIiB0aGUKKyAgLy8vIG9wdGlvbiAoZG9uJ3QgbWFyayBpdCBhcyBoYXZpbmcgYmVlbiB1c2VkKS4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgLi4uT3B0U3BlY2lmaWVycz4KKyAgQXJnICpnZXRMYXN0QXJnTm9DbGFpbShPcHRTcGVjaWZpZXJzIC4uLklkcykgY29uc3QgeworICAgIGZvciAoQXJnICpBIDogZmlsdGVyZWRfcmV2ZXJzZShJZHMuLi4pKQorICAgICAgcmV0dXJuIEE7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gZ2V0QXJnU3RyaW5nIC0gUmV0dXJuIHRoZSBpbnB1dCBhcmd1bWVudCBzdHJpbmcgYXQgXHAgSW5kZXguCisgIHZpcnR1YWwgY29uc3QgY2hhciAqZ2V0QXJnU3RyaW5nKHVuc2lnbmVkIEluZGV4KSBjb25zdCA9IDA7CisKKyAgLy8vIGdldE51bUlucHV0QXJnU3RyaW5ncyAtIFJldHVybiB0aGUgbnVtYmVyIG9mIG9yaWdpbmFsIGFyZ3VtZW50IHN0cmluZ3MsCisgIC8vLyB3aGljaCBhcmUgZ3VhcmFudGVlZCB0byBiZSB0aGUgZmlyc3Qgc3RyaW5ncyBpbiB0aGUgYXJndW1lbnQgc3RyaW5nCisgIC8vLyBsaXN0LgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldE51bUlucHV0QXJnU3RyaW5ncygpIGNvbnN0ID0gMDsKKworICAvLy8gQH0KKyAgLy8vIEBuYW1lIEFyZ3VtZW50IExvb2t1cCBVdGlsaXRpZXMKKyAgLy8vIEB7CisKKyAgLy8vIGdldExhc3RBcmdWYWx1ZSAtIFJldHVybiB0aGUgdmFsdWUgb2YgdGhlIGxhc3QgYXJndW1lbnQsIG9yIGEgZGVmYXVsdC4KKyAgU3RyaW5nUmVmIGdldExhc3RBcmdWYWx1ZShPcHRTcGVjaWZpZXIgSWQsIFN0cmluZ1JlZiBEZWZhdWx0ID0gIiIpIGNvbnN0OworCisgIC8vLyBnZXRBbGxBcmdWYWx1ZXMgLSBHZXQgdGhlIHZhbHVlcyBvZiBhbGwgaW5zdGFuY2VzIG9mIHRoZSBnaXZlbiBhcmd1bWVudAorICAvLy8gYXMgc3RyaW5ncy4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IGdldEFsbEFyZ1ZhbHVlcyhPcHRTcGVjaWZpZXIgSWQpIGNvbnN0OworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgVHJhbnNsYXRpb24gVXRpbGl0aWVzCisgIC8vLyBAeworCisgIC8vLyBoYXNGbGFnIC0gR2l2ZW4gYW4gb3B0aW9uIFxwIFBvcyBhbmQgaXRzIG5lZ2F0aXZlIGZvcm0gXHAgTmVnLCByZXR1cm4KKyAgLy8vIHRydWUgaWYgdGhlIG9wdGlvbiBpcyBwcmVzZW50LCBmYWxzZSBpZiB0aGUgbmVnYXRpb24gaXMgcHJlc2VudCwgYW5kCisgIC8vLyBccCBEZWZhdWx0IGlmIG5laXRoZXIgb3B0aW9uIGlzIGdpdmVuLiBJZiBib3RoIHRoZSBvcHRpb24gYW5kIGl0cworICAvLy8gbmVnYXRpb24gYXJlIHByZXNlbnQsIHRoZSBsYXN0IG9uZSB3aW5zLgorICBib29sIGhhc0ZsYWcoT3B0U3BlY2lmaWVyIFBvcywgT3B0U3BlY2lmaWVyIE5lZywgYm9vbCBEZWZhdWx0PXRydWUpIGNvbnN0OworCisgIC8vLyBoYXNGbGFnIC0gR2l2ZW4gYW4gb3B0aW9uIFxwIFBvcywgYW4gYWxpYXMgXHAgUG9zQWxpYXMgYW5kIGl0cyBuZWdhdGl2ZQorICAvLy8gZm9ybSBccCBOZWcsIHJldHVybiB0cnVlIGlmIHRoZSBvcHRpb24gb3IgaXRzIGFsaWFzIGlzIHByZXNlbnQsIGZhbHNlIGlmCisgIC8vLyB0aGUgbmVnYXRpb24gaXMgcHJlc2VudCwgYW5kIFxwIERlZmF1bHQgaWYgbm9uZSBvZiB0aGUgb3B0aW9ucyBhcmUKKyAgLy8vIGdpdmVuLiBJZiBtdWx0aXBsZSBvcHRpb25zIGFyZSBwcmVzZW50LCB0aGUgbGFzdCBvbmUgd2lucy4KKyAgYm9vbCBoYXNGbGFnKE9wdFNwZWNpZmllciBQb3MsIE9wdFNwZWNpZmllciBQb3NBbGlhcywgT3B0U3BlY2lmaWVyIE5lZywKKyAgICAgICAgICAgICAgIGJvb2wgRGVmYXVsdCA9IHRydWUpIGNvbnN0OworCisgIC8vLyBBZGRMYXN0QXJnIC0gUmVuZGVyIG9ubHkgdGhlIGxhc3QgYXJndW1lbnQgbWF0Y2ggXHAgSWQwLCBpZiBwcmVzZW50LgorICB2b2lkIEFkZExhc3RBcmcoQXJnU3RyaW5nTGlzdCAmT3V0cHV0LCBPcHRTcGVjaWZpZXIgSWQwKSBjb25zdDsKKyAgdm9pZCBBZGRMYXN0QXJnKEFyZ1N0cmluZ0xpc3QgJk91dHB1dCwgT3B0U3BlY2lmaWVyIElkMCwKKyAgICAgICAgICAgICAgICAgIE9wdFNwZWNpZmllciBJZDEpIGNvbnN0OworCisgIC8vLyBBZGRBbGxBcmdzRXhjZXB0IC0gUmVuZGVyIGFsbCBhcmd1bWVudHMgbWF0Y2hpbmcgYW55IG9mIHRoZSBnaXZlbiBpZHMKKyAgLy8vIGFuZCBub3QgbWF0Y2hpbmcgYW55IG9mIHRoZSBleGNsdWRlZCBpZHMuCisgIHZvaWQgQWRkQWxsQXJnc0V4Y2VwdChBcmdTdHJpbmdMaXN0ICZPdXRwdXQsIEFycmF5UmVmPE9wdFNwZWNpZmllcj4gSWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8T3B0U3BlY2lmaWVyPiBFeGNsdWRlSWRzKSBjb25zdDsKKyAgLy8vIEFkZEFsbEFyZ3MgLSBSZW5kZXIgYWxsIGFyZ3VtZW50cyBtYXRjaGluZyBhbnkgb2YgdGhlIGdpdmVuIGlkcy4KKyAgdm9pZCBBZGRBbGxBcmdzKEFyZ1N0cmluZ0xpc3QgJk91dHB1dCwgQXJyYXlSZWY8T3B0U3BlY2lmaWVyPiBJZHMpIGNvbnN0OworCisgIC8vLyBBZGRBbGxBcmdzIC0gUmVuZGVyIGFsbCBhcmd1bWVudHMgbWF0Y2hpbmcgdGhlIGdpdmVuIGlkcy4KKyAgdm9pZCBBZGRBbGxBcmdzKEFyZ1N0cmluZ0xpc3QgJk91dHB1dCwgT3B0U3BlY2lmaWVyIElkMCwKKyAgICAgICAgICAgICAgICAgIE9wdFNwZWNpZmllciBJZDEgPSAwVSwgT3B0U3BlY2lmaWVyIElkMiA9IDBVKSBjb25zdDsKKworICAvLy8gQWRkQWxsQXJnVmFsdWVzIC0gUmVuZGVyIHRoZSBhcmd1bWVudCB2YWx1ZXMgb2YgYWxsIGFyZ3VtZW50cworICAvLy8gbWF0Y2hpbmcgdGhlIGdpdmVuIGlkcy4KKyAgdm9pZCBBZGRBbGxBcmdWYWx1ZXMoQXJnU3RyaW5nTGlzdCAmT3V0cHV0LCBPcHRTcGVjaWZpZXIgSWQwLAorICAgICAgICAgICAgICAgICAgICAgICBPcHRTcGVjaWZpZXIgSWQxID0gMFUsIE9wdFNwZWNpZmllciBJZDIgPSAwVSkgY29uc3Q7CisKKyAgLy8vIEFkZEFsbEFyZ3NUcmFuc2xhdGVkIC0gUmVuZGVyIGFsbCB0aGUgYXJndW1lbnRzIG1hdGNoaW5nIHRoZQorICAvLy8gZ2l2ZW4gaWRzLCBidXQgZm9yY2VkIHRvIHNlcGFyYXRlIGFyZ3MgYW5kIHVzaW5nIHRoZSBwcm92aWRlZAorICAvLy8gbmFtZSBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBvcHRpb24gdmFsdWUuCisgIC8vLworICAvLy8gXHBhcmFtIEpvaW5lZCAtIElmIHRydWUsIHJlbmRlciB0aGUgYXJndW1lbnQgYXMgam9pbmVkIHdpdGgKKyAgLy8vIHRoZSBvcHRpb24gc3BlY2lmaWVyLgorICB2b2lkIEFkZEFsbEFyZ3NUcmFuc2xhdGVkKEFyZ1N0cmluZ0xpc3QgJk91dHB1dCwgT3B0U3BlY2lmaWVyIElkMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpUcmFuc2xhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEpvaW5lZCA9IGZhbHNlKSBjb25zdDsKKworICAvLy8gQ2xhaW1BbGxBcmdzIC0gQ2xhaW0gYWxsIGFyZ3VtZW50cyB3aGljaCBtYXRjaCB0aGUgZ2l2ZW4KKyAgLy8vIG9wdGlvbiBpZC4KKyAgdm9pZCBDbGFpbUFsbEFyZ3MoT3B0U3BlY2lmaWVyIElkMCkgY29uc3Q7CisKKyAgLy8vIENsYWltQWxsQXJncyAtIENsYWltIGFsbCBhcmd1bWVudHMuCisgIC8vLworICB2b2lkIENsYWltQWxsQXJncygpIGNvbnN0OworCisgIC8vLyBAfQorICAvLy8gQG5hbWUgQXJnIFN5bnRoZXNpcworICAvLy8gQHsKKworICAvLy8gQ29uc3RydWN0IGEgY29uc3RhbnQgc3RyaW5nIHBvaW50ZXIgd2hvc2UKKyAgLy8vIGxpZmV0aW1lIHdpbGwgbWF0Y2ggdGhhdCBvZiB0aGUgQXJnTGlzdC4KKyAgdmlydHVhbCBjb25zdCBjaGFyICpNYWtlQXJnU3RyaW5nUmVmKFN0cmluZ1JlZiBTdHIpIGNvbnN0ID0gMDsKKyAgY29uc3QgY2hhciAqTWFrZUFyZ1N0cmluZyhjb25zdCBUd2luZSAmU3RyKSBjb25zdCB7CisgICAgU21hbGxTdHJpbmc8MjU2PiBCdWY7CisgICAgcmV0dXJuIE1ha2VBcmdTdHJpbmdSZWYoU3RyLnRvU3RyaW5nUmVmKEJ1ZikpOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYW4gYXJnIHN0cmluZyBmb3IgKFxwIExIUyArIFxwIFJIUyksIHJldXNpbmcgdGhlCisgIC8vLyBzdHJpbmcgYXQgXHAgSW5kZXggaWYgcG9zc2libGUuCisgIGNvbnN0IGNoYXIgKkdldE9yTWFrZUpvaW5lZEFyZ1N0cmluZyh1bnNpZ25lZCBJbmRleCwgU3RyaW5nUmVmIExIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgUkhTKSBjb25zdDsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8vIEB9Cit9OworCitjbGFzcyBJbnB1dEFyZ0xpc3QgZmluYWwgOiBwdWJsaWMgQXJnTGlzdCB7Citwcml2YXRlOgorICAvLy8gTGlzdCBvZiBhcmd1bWVudCBzdHJpbmdzIHVzZWQgYnkgdGhlIGNvbnRhaW5lZCBBcmdzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgbXV0YWJsZSBzaW5jZSB3ZSB0cmVhdCB0aGUgQXJnTGlzdCBhcyBiZWluZyB0aGUgbGlzdAorICAvLy8gb2YgQXJncywgYW5kIGFsbG93IHJvdXRpbmVzIHRvIGFkZCBuZXcgc3RyaW5ncyAodG8gaGF2ZSBhCisgIC8vLyBjb252ZW5pZW50IHBsYWNlIHRvIHN0b3JlIHRoZSBtZW1vcnkpIHZpYSBNYWtlSW5kZXguCisgIG11dGFibGUgQXJnU3RyaW5nTGlzdCBBcmdTdHJpbmdzOworCisgIC8vLyBTdHJpbmdzIGZvciBzeW50aGVzaXplZCBhcmd1bWVudHMuCisgIC8vLworICAvLy8gVGhpcyBpcyBtdXRhYmxlIHNpbmNlIHdlIHRyZWF0IHRoZSBBcmdMaXN0IGFzIGJlaW5nIHRoZSBsaXN0CisgIC8vLyBvZiBBcmdzLCBhbmQgYWxsb3cgcm91dGluZXMgdG8gYWRkIG5ldyBzdHJpbmdzICh0byBoYXZlIGEKKyAgLy8vIGNvbnZlbmllbnQgcGxhY2UgdG8gc3RvcmUgdGhlIG1lbW9yeSkgdmlhIE1ha2VJbmRleC4KKyAgbXV0YWJsZSBzdGQ6Omxpc3Q8c3RkOjpzdHJpbmc+IFN5bnRoZXNpemVkU3RyaW5nczsKKworICAvLy8gVGhlIG51bWJlciBvZiBvcmlnaW5hbCBpbnB1dCBhcmd1bWVudCBzdHJpbmdzLgorICB1bnNpZ25lZCBOdW1JbnB1dEFyZ1N0cmluZ3M7CisKKyAgLy8vIFJlbGVhc2UgYWxsb2NhdGVkIGFyZ3VtZW50cy4KKyAgdm9pZCByZWxlYXNlTWVtb3J5KCk7CisKK3B1YmxpYzoKKyAgSW5wdXRBcmdMaXN0KCkgOiBOdW1JbnB1dEFyZ1N0cmluZ3MoMCkge30KKworICBJbnB1dEFyZ0xpc3QoY29uc3QgY2hhciogY29uc3QgKkFyZ0JlZ2luLCBjb25zdCBjaGFyKiBjb25zdCAqQXJnRW5kKTsKKworICBJbnB1dEFyZ0xpc3QoSW5wdXRBcmdMaXN0ICYmUkhTKQorICAgICAgOiBBcmdMaXN0KHN0ZDo6bW92ZShSSFMpKSwgQXJnU3RyaW5ncyhzdGQ6Om1vdmUoUkhTLkFyZ1N0cmluZ3MpKSwKKyAgICAgICAgU3ludGhlc2l6ZWRTdHJpbmdzKHN0ZDo6bW92ZShSSFMuU3ludGhlc2l6ZWRTdHJpbmdzKSksCisgICAgICAgIE51bUlucHV0QXJnU3RyaW5ncyhSSFMuTnVtSW5wdXRBcmdTdHJpbmdzKSB7fQorCisgIElucHV0QXJnTGlzdCAmb3BlcmF0b3I9KElucHV0QXJnTGlzdCAmJlJIUykgeworICAgIHJlbGVhc2VNZW1vcnkoKTsKKyAgICBBcmdMaXN0OjpvcGVyYXRvcj0oc3RkOjptb3ZlKFJIUykpOworICAgIEFyZ1N0cmluZ3MgPSBzdGQ6Om1vdmUoUkhTLkFyZ1N0cmluZ3MpOworICAgIFN5bnRoZXNpemVkU3RyaW5ncyA9IHN0ZDo6bW92ZShSSFMuU3ludGhlc2l6ZWRTdHJpbmdzKTsKKyAgICBOdW1JbnB1dEFyZ1N0cmluZ3MgPSBSSFMuTnVtSW5wdXRBcmdTdHJpbmdzOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIH5JbnB1dEFyZ0xpc3QoKSB7IHJlbGVhc2VNZW1vcnkoKTsgfQorCisgIGNvbnN0IGNoYXIgKmdldEFyZ1N0cmluZyh1bnNpZ25lZCBJbmRleCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBBcmdTdHJpbmdzW0luZGV4XTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bUlucHV0QXJnU3RyaW5ncygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gTnVtSW5wdXRBcmdTdHJpbmdzOworICB9CisKKyAgLy8vIEBuYW1lIEFyZyBTeW50aGVzaXMKKyAgLy8vIEB7CisKK3B1YmxpYzoKKyAgLy8vIE1ha2VJbmRleCAtIEdldCBhbiBpbmRleCBmb3IgdGhlIGdpdmVuIHN0cmluZyhzKS4KKyAgdW5zaWduZWQgTWFrZUluZGV4KFN0cmluZ1JlZiBTdHJpbmcwKSBjb25zdDsKKyAgdW5zaWduZWQgTWFrZUluZGV4KFN0cmluZ1JlZiBTdHJpbmcwLCBTdHJpbmdSZWYgU3RyaW5nMSkgY29uc3Q7CisKKyAgdXNpbmcgQXJnTGlzdDo6TWFrZUFyZ1N0cmluZzsKKyAgY29uc3QgY2hhciAqTWFrZUFyZ1N0cmluZ1JlZihTdHJpbmdSZWYgU3RyKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gQH0KK307CisKKy8vLyBEZXJpdmVkQXJnTGlzdCAtIEFuIG9yZGVyZWQgY29sbGVjdGlvbiBvZiBkcml2ZXIgYXJndW1lbnRzLAorLy8vIHdob3NlIHN0b3JhZ2UgbWF5IGJlIGluIGFub3RoZXIgYXJndW1lbnQgbGlzdC4KK2NsYXNzIERlcml2ZWRBcmdMaXN0IGZpbmFsIDogcHVibGljIEFyZ0xpc3QgeworICBjb25zdCBJbnB1dEFyZ0xpc3QgJkJhc2VBcmdzOworCisgIC8vLyBUaGUgbGlzdCBvZiBhcmd1bWVudHMgd2Ugc3ludGhlc2l6ZWQuCisgIG11dGFibGUgU21hbGxWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEFyZz4sIDE2PiBTeW50aGVzaXplZEFyZ3M7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdCBhIG5ldyBkZXJpdmVkIGFyZyBsaXN0IGZyb20gXHAgQmFzZUFyZ3MuCisgIERlcml2ZWRBcmdMaXN0KGNvbnN0IElucHV0QXJnTGlzdCAmQmFzZUFyZ3MpOworCisgIGNvbnN0IGNoYXIgKmdldEFyZ1N0cmluZyh1bnNpZ25lZCBJbmRleCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBCYXNlQXJncy5nZXRBcmdTdHJpbmcoSW5kZXgpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtSW5wdXRBcmdTdHJpbmdzKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBCYXNlQXJncy5nZXROdW1JbnB1dEFyZ1N0cmluZ3MoKTsKKyAgfQorCisgIGNvbnN0IElucHV0QXJnTGlzdCAmZ2V0QmFzZUFyZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIEJhc2VBcmdzOworICB9CisKKyAgLy8vIEBuYW1lIEFyZyBTeW50aGVzaXMKKyAgLy8vIEB7CisKKyAgLy8vIEFkZFN5bnRoZXNpemVkQXJnIC0gQWRkIGEgYXJndW1lbnQgdG8gdGhlIGxpc3Qgb2Ygc3ludGhlc2l6ZWQgYXJndW1lbnRzCisgIC8vLyAodG8gYmUgZnJlZWQpLgorICB2b2lkIEFkZFN5bnRoZXNpemVkQXJnKEFyZyAqQSk7CisKKyAgdXNpbmcgQXJnTGlzdDo6TWFrZUFyZ1N0cmluZzsKKyAgY29uc3QgY2hhciAqTWFrZUFyZ1N0cmluZ1JlZihTdHJpbmdSZWYgU3RyKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gQWRkRmxhZ0FyZyAtIENvbnN0cnVjdCBhIG5ldyBGbGFnQXJnIGZvciB0aGUgZ2l2ZW4gb3B0aW9uIFxwIElkIGFuZAorICAvLy8gYXBwZW5kIGl0IHRvIHRoZSBhcmd1bWVudCBsaXN0LgorICB2b2lkIEFkZEZsYWdBcmcoY29uc3QgQXJnICpCYXNlQXJnLCBjb25zdCBPcHRpb24gT3B0KSB7CisgICAgYXBwZW5kKE1ha2VGbGFnQXJnKEJhc2VBcmcsIE9wdCkpOworICB9CisKKyAgLy8vIEFkZFBvc2l0aW9uYWxBcmcgLSBDb25zdHJ1Y3QgYSBuZXcgUG9zaXRpb25hbCBhcmcgZm9yIHRoZSBnaXZlbiBvcHRpb24KKyAgLy8vIFxwIElkLCB3aXRoIHRoZSBwcm92aWRlZCBccCBWYWx1ZSBhbmQgYXBwZW5kIGl0IHRvIHRoZSBhcmd1bWVudAorICAvLy8gbGlzdC4KKyAgdm9pZCBBZGRQb3NpdGlvbmFsQXJnKGNvbnN0IEFyZyAqQmFzZUFyZywgY29uc3QgT3B0aW9uIE9wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBWYWx1ZSkgeworICAgIGFwcGVuZChNYWtlUG9zaXRpb25hbEFyZyhCYXNlQXJnLCBPcHQsIFZhbHVlKSk7CisgIH0KKworICAvLy8gQWRkU2VwYXJhdGVBcmcgLSBDb25zdHJ1Y3QgYSBuZXcgUG9zaXRpb25hbCBhcmcgZm9yIHRoZSBnaXZlbiBvcHRpb24KKyAgLy8vIFxwIElkLCB3aXRoIHRoZSBwcm92aWRlZCBccCBWYWx1ZSBhbmQgYXBwZW5kIGl0IHRvIHRoZSBhcmd1bWVudAorICAvLy8gbGlzdC4KKyAgdm9pZCBBZGRTZXBhcmF0ZUFyZyhjb25zdCBBcmcgKkJhc2VBcmcsIGNvbnN0IE9wdGlvbiBPcHQsCisgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFZhbHVlKSB7CisgICAgYXBwZW5kKE1ha2VTZXBhcmF0ZUFyZyhCYXNlQXJnLCBPcHQsIFZhbHVlKSk7CisgIH0KKworICAvLy8gQWRkSm9pbmVkQXJnIC0gQ29uc3RydWN0IGEgbmV3IFBvc2l0aW9uYWwgYXJnIGZvciB0aGUgZ2l2ZW4gb3B0aW9uCisgIC8vLyBccCBJZCwgd2l0aCB0aGUgcHJvdmlkZWQgXHAgVmFsdWUgYW5kIGFwcGVuZCBpdCB0byB0aGUgYXJndW1lbnQgbGlzdC4KKyAgdm9pZCBBZGRKb2luZWRBcmcoY29uc3QgQXJnICpCYXNlQXJnLCBjb25zdCBPcHRpb24gT3B0LAorICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVmFsdWUpIHsKKyAgICBhcHBlbmQoTWFrZUpvaW5lZEFyZyhCYXNlQXJnLCBPcHQsIFZhbHVlKSk7CisgIH0KKworICAvLy8gTWFrZUZsYWdBcmcgLSBDb25zdHJ1Y3QgYSBuZXcgRmxhZ0FyZyBmb3IgdGhlIGdpdmVuIG9wdGlvbiBccCBJZC4KKyAgQXJnICpNYWtlRmxhZ0FyZyhjb25zdCBBcmcgKkJhc2VBcmcsIGNvbnN0IE9wdGlvbiBPcHQpIGNvbnN0OworCisgIC8vLyBNYWtlUG9zaXRpb25hbEFyZyAtIENvbnN0cnVjdCBhIG5ldyBQb3NpdGlvbmFsIGFyZyBmb3IgdGhlCisgIC8vLyBnaXZlbiBvcHRpb24gXHAgSWQsIHdpdGggdGhlIHByb3ZpZGVkIFxwIFZhbHVlLgorICBBcmcgKk1ha2VQb3NpdGlvbmFsQXJnKGNvbnN0IEFyZyAqQmFzZUFyZywgY29uc3QgT3B0aW9uIE9wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFZhbHVlKSBjb25zdDsKKworICAvLy8gTWFrZVNlcGFyYXRlQXJnIC0gQ29uc3RydWN0IGEgbmV3IFBvc2l0aW9uYWwgYXJnIGZvciB0aGUKKyAgLy8vIGdpdmVuIG9wdGlvbiBccCBJZCwgd2l0aCB0aGUgcHJvdmlkZWQgXHAgVmFsdWUuCisgIEFyZyAqTWFrZVNlcGFyYXRlQXJnKGNvbnN0IEFyZyAqQmFzZUFyZywgY29uc3QgT3B0aW9uIE9wdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBWYWx1ZSkgY29uc3Q7CisKKyAgLy8vIE1ha2VKb2luZWRBcmcgLSBDb25zdHJ1Y3QgYSBuZXcgUG9zaXRpb25hbCBhcmcgZm9yIHRoZQorICAvLy8gZ2l2ZW4gb3B0aW9uIFxwIElkLCB3aXRoIHRoZSBwcm92aWRlZCBccCBWYWx1ZS4KKyAgQXJnICpNYWtlSm9pbmVkQXJnKGNvbnN0IEFyZyAqQmFzZUFyZywgY29uc3QgT3B0aW9uIE9wdCwKKyAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVmFsdWUpIGNvbnN0OworCisgIC8vLyBAfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9wdAorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9PUFRJT05fQVJHTElTVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09wdGlvbi9PcHRQYXJzZXIudGQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09wdGlvbi9PcHRQYXJzZXIudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMzNzM3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT3B0aW9uL09wdFBhcnNlci50ZApAQCAtMCwwICsxLDEzOSBAQAorLy89PT0tLS0gT3B0UGFyc2VyLnRkIC0gQ29tbW9uIE9wdGlvbiBQYXJzaW5nIEludGVyZmFjZXMgLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIGNvbW1vbiBpbnRlcmZhY2VzIHVzZWQgYnkgdGhlIG9wdGlvbiBwYXJzaW5nIFRhYmxlR2VuCisvLyAgYmFja2VuZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBEZWZpbmUgdGhlIGtpbmRzIG9mIG9wdGlvbnMuCisKK2NsYXNzIE9wdGlvbktpbmQ8c3RyaW5nIG5hbWUsIGludCBwcmVjZWRlbmNlID0gMCwgYml0IHNlbnRpbmVsID0gMD4geworICBzdHJpbmcgTmFtZSA9IG5hbWU7CisgIC8vIFRoZSBraW5kIHByZWNlZGVuY2UsIGtpbmRzIHdpdGggbG93ZXIgcHJlY2VkZW5jZSBhcmUgbWF0Y2hlZCBmaXJzdC4KKyAgaW50IFByZWNlZGVuY2UgPSBwcmVjZWRlbmNlOworICAvLyBJbmRpY2F0ZSBhIHNlbnRpbmVsIG9wdGlvbi4KKyAgYml0IFNlbnRpbmVsID0gc2VudGluZWw7Cit9CisKKy8vIEFuIG9wdGlvbiBncm91cC4KK2RlZiBLSU5EX0dST1VQIDogT3B0aW9uS2luZDwiR3JvdXAiPjsKKy8vIFRoZSBpbnB1dCBvcHRpb24ga2luZC4KK2RlZiBLSU5EX0lOUFVUIDogT3B0aW9uS2luZDwiSW5wdXQiLCAxLCAxPjsKKy8vIFRoZSB1bmtub3duIG9wdGlvbiBraW5kLgorZGVmIEtJTkRfVU5LTk9XTiA6IE9wdGlvbktpbmQ8IlVua25vd24iLCAyLCAxPjsKKy8vIEEgZmxhZyB3aXRoIG5vIHZhbHVlcy4KK2RlZiBLSU5EX0ZMQUcgOiBPcHRpb25LaW5kPCJGbGFnIj47CisvLyBBbiBvcHRpb24gd2hpY2ggcHJlZml4ZXMgaXRzIChzaW5nbGUpIHZhbHVlLgorZGVmIEtJTkRfSk9JTkVEIDogT3B0aW9uS2luZDwiSm9pbmVkIiwgMT47CisvLyBBbiBvcHRpb24gd2hpY2ggaXMgZm9sbG93ZWQgYnkgaXRzIHZhbHVlLgorZGVmIEtJTkRfU0VQQVJBVEUgOiBPcHRpb25LaW5kPCJTZXBhcmF0ZSI+OworLy8gQW4gb3B0aW9uIGZvbGxvd2VkIGJ5IGl0cyB2YWx1ZXMsIHdoaWNoIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWFzLgorZGVmIEtJTkRfQ09NTUFKT0lORUQgOiBPcHRpb25LaW5kPCJDb21tYUpvaW5lZCI+OworLy8gQW4gb3B0aW9uIHdoaWNoIGlzIHdoaWNoIHRha2VzIG11bHRpcGxlIChzZXBhcmF0ZSkgYXJndW1lbnRzLgorZGVmIEtJTkRfTVVMVElBUkcgOiBPcHRpb25LaW5kPCJNdWx0aUFyZyI+OworLy8gQW4gb3B0aW9uIHdoaWNoIGlzIGVpdGhlciBqb2luZWQgdG8gaXRzIChub24tZW1wdHkpIHZhbHVlLCBvciBmb2xsb3dlZCBieSBpdHMKKy8vIHZhbHVlLgorZGVmIEtJTkRfSk9JTkVEX09SX1NFUEFSQVRFIDogT3B0aW9uS2luZDwiSm9pbmVkT3JTZXBhcmF0ZSI+OworLy8gQW4gb3B0aW9uIHdoaWNoIGlzIGJvdGggam9pbmVkIHRvIGl0cyAoZmlyc3QpIHZhbHVlLCBhbmQgZm9sbG93ZWQgYnkgaXRzCisvLyAoc2Vjb25kKSB2YWx1ZS4KK2RlZiBLSU5EX0pPSU5FRF9BTkRfU0VQQVJBVEUgOiBPcHRpb25LaW5kPCJKb2luZWRBbmRTZXBhcmF0ZSI+OworLy8gQW4gb3B0aW9uIHdoaWNoIGNvbnN1bWVzIGFsbCByZW1haW5pbmcgYXJndW1lbnRzIGlmIHRoZXJlIGFyZSBhbnkuCitkZWYgS0lORF9SRU1BSU5JTkdfQVJHUyA6IE9wdGlvbktpbmQ8IlJlbWFpbmluZ0FyZ3MiPjsKKy8vIEFuIG9wdGlvbiB3aGljaCBjb25zdW1lcyBhbiBvcHRpb25hbCBqb2luZWQgYXJndW1lbnQgYW5kIGFueSBvdGhlciByZW1haW5pbmcKKy8vIGFyZ3VtZW50cy4KK2RlZiBLSU5EX1JFTUFJTklOR19BUkdTX0pPSU5FRCA6IE9wdGlvbktpbmQ8IlJlbWFpbmluZ0FyZ3NKb2luZWQiPjsKKworLy8gRGVmaW5lIHRoZSBvcHRpb24gZmxhZ3MuCisKK2NsYXNzIE9wdGlvbkZsYWcge30KKworLy8gSGVscEhpZGRlbiAtIFRoZSBvcHRpb24gc2hvdWxkIG5vdCBiZSBkaXNwbGF5ZWQgaW4gLS1oZWxwLCBldmVuIGlmIGl0IGhhcworLy8gaGVscCB0ZXh0LiBDbGllbnRzICpjYW4qIHVzZSB0aGlzIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIE9wdFRhYmxlOjpQcmludEhlbHAKKy8vIGFyZ3VtZW50cyB0byBpbXBsZW1lbnQgaGlkZGVuIGhlbHAgZ3JvdXBzLgorZGVmIEhlbHBIaWRkZW4gOiBPcHRpb25GbGFnOworCisvLyBSZW5kZXJBc0lucHV0IC0gVGhlIG9wdGlvbiBzaG91bGQgbm90IHJlbmRlciB0aGUgbmFtZSB3aGVuIHJlbmRlcmVkIGFzIGFuCisvLyBpbnB1dCAoaS5lLiwgdGhlIG9wdGlvbiBpcyByZW5kZXJlZCBhcyB2YWx1ZXMpLgorZGVmIFJlbmRlckFzSW5wdXQgOiBPcHRpb25GbGFnOworCisvLyBSZW5kZXJKb2luZWQgLSBUaGUgb3B0aW9uIHNob3VsZCBiZSByZW5kZXJlZCBqb2luZWQsIGV2ZW4gaWYgc2VwYXJhdGUgKG9ubHkKKy8vIHNlbnNpYmxlIG9uIHNpbmdsZSB2YWx1ZSBzZXBhcmF0ZSBvcHRpb25zKS4KK2RlZiBSZW5kZXJKb2luZWQgOiBPcHRpb25GbGFnOworCisvLyBSZW5kZXJTZXBhcmF0ZSAtIFRoZSBvcHRpb24gc2hvdWxkIGJlIHJlbmRlcmVkIHNlcGFyYXRlbHksIGV2ZW4gaWYgam9pbmVkCisvLyAob25seSBzZW5zaWJsZSBvbiBqb2luZWQgb3B0aW9ucykuCitkZWYgUmVuZGVyU2VwYXJhdGUgOiBPcHRpb25GbGFnOworCisvLyBEZWZpbmUgdGhlIG9wdGlvbiBncm91cCBjbGFzcy4KKworY2xhc3MgT3B0aW9uR3JvdXA8c3RyaW5nIG5hbWU+IHsKKyAgc3RyaW5nIEVudW1OYW1lID0gPzsgLy8gVXNlcyB0aGUgZGVmIG5hbWUgaWYgdW5kZWZpbmVkLgorICBzdHJpbmcgTmFtZSA9IG5hbWU7CisgIHN0cmluZyBIZWxwVGV4dCA9ID87CisgIE9wdGlvbkdyb3VwIEdyb3VwID0gPzsKKyAgbGlzdDxPcHRpb25GbGFnPiBGbGFncyA9IFtdOworfQorCisvLyBEZWZpbmUgdGhlIG9wdGlvbiBjbGFzcy4KKworY2xhc3MgT3B0aW9uPGxpc3Q8c3RyaW5nPiBwcmVmaXhlcywgc3RyaW5nIG5hbWUsIE9wdGlvbktpbmQga2luZD4geworICBzdHJpbmcgRW51bU5hbWUgPSA/OyAvLyBVc2VzIHRoZSBkZWYgbmFtZSBpZiB1bmRlZmluZWQuCisgIGxpc3Q8c3RyaW5nPiBQcmVmaXhlcyA9IHByZWZpeGVzOworICBzdHJpbmcgTmFtZSA9IG5hbWU7CisgIE9wdGlvbktpbmQgS2luZCA9IGtpbmQ7CisgIC8vIFVzZWQgYnkgTXVsdGlBcmcgb3B0aW9uIGtpbmQuCisgIGludCBOdW1BcmdzID0gMDsKKyAgc3RyaW5nIEhlbHBUZXh0ID0gPzsKKyAgc3RyaW5nIE1ldGFWYXJOYW1lID0gPzsKKyAgc3RyaW5nIFZhbHVlcyA9ID87CisgIGNvZGUgVmFsdWVzQ29kZSA9ID87CisgIGxpc3Q8T3B0aW9uRmxhZz4gRmxhZ3MgPSBbXTsKKyAgT3B0aW9uR3JvdXAgR3JvdXAgPSA/OworICBPcHRpb24gQWxpYXMgPSA/OworICBsaXN0PHN0cmluZz4gQWxpYXNBcmdzID0gW107Cit9CisKKy8vIEhlbHBlcnMgZm9yIGRlZmluaW5nIG9wdGlvbnMuCisKK2NsYXNzIEZsYWc8bGlzdDxzdHJpbmc+IHByZWZpeGVzLCBzdHJpbmcgbmFtZT4KKyAgOiBPcHRpb248cHJlZml4ZXMsIG5hbWUsIEtJTkRfRkxBRz47CitjbGFzcyBKb2luZWQ8bGlzdDxzdHJpbmc+IHByZWZpeGVzLCBzdHJpbmcgbmFtZT4KKyAgOiBPcHRpb248cHJlZml4ZXMsIG5hbWUsIEtJTkRfSk9JTkVEPjsKK2NsYXNzIFNlcGFyYXRlPGxpc3Q8c3RyaW5nPiBwcmVmaXhlcywgc3RyaW5nIG5hbWU+CisgIDogT3B0aW9uPHByZWZpeGVzLCBuYW1lLCBLSU5EX1NFUEFSQVRFPjsKK2NsYXNzIENvbW1hSm9pbmVkPGxpc3Q8c3RyaW5nPiBwcmVmaXhlcywgc3RyaW5nIG5hbWU+CisgIDogT3B0aW9uPHByZWZpeGVzLCBuYW1lLCBLSU5EX0NPTU1BSk9JTkVEPjsKK2NsYXNzIE11bHRpQXJnPGxpc3Q8c3RyaW5nPiBwcmVmaXhlcywgc3RyaW5nIG5hbWUsIGludCBudW1hcmdzPgorICA6IE9wdGlvbjxwcmVmaXhlcywgbmFtZSwgS0lORF9NVUxUSUFSRz4geworICBpbnQgTnVtQXJncyA9IG51bWFyZ3M7Cit9CitjbGFzcyBKb2luZWRPclNlcGFyYXRlPGxpc3Q8c3RyaW5nPiBwcmVmaXhlcywgc3RyaW5nIG5hbWU+CisgIDogT3B0aW9uPHByZWZpeGVzLCBuYW1lLCBLSU5EX0pPSU5FRF9PUl9TRVBBUkFURT47CitjbGFzcyBKb2luZWRBbmRTZXBhcmF0ZTxsaXN0PHN0cmluZz4gcHJlZml4ZXMsIHN0cmluZyBuYW1lPgorICA6IE9wdGlvbjxwcmVmaXhlcywgbmFtZSwgS0lORF9KT0lORURfQU5EX1NFUEFSQVRFPjsKKworLy8gTWl4LWlucyBmb3IgYWRkaW5nIG9wdGlvbmFsIGF0dHJpYnV0ZXMuCisKK2NsYXNzIEFsaWFzPE9wdGlvbiBhbGlhcz4geyBPcHRpb24gQWxpYXMgPSBhbGlhczsgfQorY2xhc3MgQWxpYXNBcmdzPGxpc3Q8c3RyaW5nPiBhbGlhc2FyZ3M+IHsgbGlzdDxzdHJpbmc+IEFsaWFzQXJncyA9IGFsaWFzYXJnczsgfQorY2xhc3MgRW51bU5hbWU8c3RyaW5nIG5hbWU+IHsgc3RyaW5nIEVudW1OYW1lID0gbmFtZTsgfQorY2xhc3MgRmxhZ3M8bGlzdDxPcHRpb25GbGFnPiBmbGFncz4geyBsaXN0PE9wdGlvbkZsYWc+IEZsYWdzID0gZmxhZ3M7IH0KK2NsYXNzIEdyb3VwPE9wdGlvbkdyb3VwIGdyb3VwPiB7IE9wdGlvbkdyb3VwIEdyb3VwID0gZ3JvdXA7IH0KK2NsYXNzIEhlbHBUZXh0PHN0cmluZyB0ZXh0PiB7IHN0cmluZyBIZWxwVGV4dCA9IHRleHQ7IH0KK2NsYXNzIE1ldGFWYXJOYW1lPHN0cmluZyBuYW1lPiB7IHN0cmluZyBNZXRhVmFyTmFtZSA9IG5hbWU7IH0KK2NsYXNzIFZhbHVlczxzdHJpbmcgdmFsdWU+IHsgc3RyaW5nIFZhbHVlcyA9IHZhbHVlOyB9CitjbGFzcyBWYWx1ZXNDb2RlPGNvZGUgdmFsdWVjb2RlPiB7IGNvZGUgVmFsdWVzQ29kZSA9IHZhbHVlY29kZTsgfQorCisvLyBQcmVkZWZpbmVkIG9wdGlvbnMuCisKKy8vIEZJWE1FOiBIYXZlIGdlbmVyYXRvciB2YWxpZGF0ZSB0aGF0IHRoZXNlIGFwcGVhciBpbiBjb3JyZWN0IHBvc2l0aW9uIChhbmQKKy8vIGFyZW4ndCBkdXBsaWNhdGVkKS4KK2RlZiBJTlBVVCA6IE9wdGlvbjxbXSwgIjxpbnB1dD4iLCBLSU5EX0lOUFVUPjsKK2RlZiBVTktOT1dOIDogT3B0aW9uPFtdLCAiPHVua25vd24+IiwgS0lORF9VTktOT1dOPjsKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT3B0aW9uL09wdFNwZWNpZmllci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PcHRpb24vT3B0U3BlY2lmaWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjM2NmOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT3B0aW9uL09wdFNwZWNpZmllci5oCkBAIC0wLDAgKzEsMzkgQEAKKy8vPT09LSBPcHRTcGVjaWZpZXIuaCAtIE9wdGlvbiBTcGVjaWZpZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9PUFRJT05fT1BUU1BFQ0lGSUVSX0gKKyNkZWZpbmUgTExWTV9PUFRJT05fT1BUU1BFQ0lGSUVSX0gKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIG9wdCB7CisKK2NsYXNzIE9wdGlvbjsKKworLy8vIE9wdFNwZWNpZmllciAtIFdyYXBwZXIgY2xhc3MgZm9yIGFic3RyYWN0aW5nIHJlZmVyZW5jZXMgdG8gb3B0aW9uIElEcy4KK2NsYXNzIE9wdFNwZWNpZmllciB7CisgIHVuc2lnbmVkIElEID0gMDsKKworcHVibGljOgorICBPcHRTcGVjaWZpZXIoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IE9wdFNwZWNpZmllcihib29sKSA9IGRlbGV0ZTsKKyAgLyppbXBsaWNpdCovIE9wdFNwZWNpZmllcih1bnNpZ25lZCBJRCkgOiBJRChJRCkge30KKyAgLyppbXBsaWNpdCovIE9wdFNwZWNpZmllcihjb25zdCBPcHRpb24gKk9wdCk7CisKKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gSUQgIT0gMDsgfQorCisgIHVuc2lnbmVkIGdldElEKCkgY29uc3QgeyByZXR1cm4gSUQ7IH0KKworICBib29sIG9wZXJhdG9yPT0oT3B0U3BlY2lmaWVyIE9wdCkgY29uc3QgeyByZXR1cm4gSUQgPT0gT3B0LmdldElEKCk7IH0KKyAgYm9vbCBvcGVyYXRvciE9KE9wdFNwZWNpZmllciBPcHQpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gT3B0KTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9wdAorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fT1BUSU9OX09QVFNQRUNJRklFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09wdGlvbi9PcHRUYWJsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PcHRpb24vT3B0VGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGI5YmJhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9PcHRpb24vT3B0VGFibGUuaApAQCAtMCwwICsxLDI0MSBAQAorLy89PT0tIE9wdFRhYmxlLmggLSBPcHRpb24gVGFibGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09QVElPTl9PUFRUQUJMRV9ICisjZGVmaW5lIExMVk1fT1BUSU9OX09QVFRBQkxFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nU2V0LmgiCisjaW5jbHVkZSAibGx2bS9PcHRpb24vT3B0U3BlY2lmaWVyLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCituYW1lc3BhY2Ugb3B0IHsKKworY2xhc3MgQXJnOworY2xhc3MgQXJnTGlzdDsKK2NsYXNzIElucHV0QXJnTGlzdDsKK2NsYXNzIE9wdGlvbjsKKworLy8vIFxicmllZiBQcm92aWRlIGFjY2VzcyB0byB0aGUgT3B0aW9uIGluZm8gdGFibGUuCisvLy8KKy8vLyBUaGUgT3B0VGFibGUgY2xhc3MgcHJvdmlkZXMgYSBsYXllciBvZiBpbmRpcmVjdGlvbiB3aGljaCBhbGxvd3MgT3B0aW9uCisvLy8gaW5zdGFuY2UgdG8gYmUgY3JlYXRlZCBsYXppbHkuIEluIHRoZSBjb21tb24gY2FzZSwgb25seSBhIGZldyBvcHRpb25zIHdpbGwKKy8vLyBiZSBuZWVkZWQgYXQgcnVudGltZTsgdGhlIE9wdFRhYmxlIGNsYXNzIG1haW50YWlucyBlbm91Z2ggaW5mb3JtYXRpb24gdG8KKy8vLyBwYXJzZSBjb21tYW5kIGxpbmVzIHdpdGhvdXQgaW5zdGFudGlhdGluZyBPcHRpb25zLCB3aGlsZSBsZXR0aW5nIG90aGVyCisvLy8gcGFydHMgb2YgdGhlIGRyaXZlciBzdGlsbCB1c2UgT3B0aW9uIGluc3RhbmNlcyB3aGVyZSBjb252ZW5pZW50LgorY2xhc3MgT3B0VGFibGUgeworcHVibGljOgorICAvLy8gXGJyaWVmIEVudHJ5IGZvciBhIHNpbmdsZSBvcHRpb24gaW5zdGFuY2UgaW4gdGhlIG9wdGlvbiBkYXRhIHRhYmxlLgorICBzdHJ1Y3QgSW5mbyB7CisgICAgLy8vIEEgbnVsbCB0ZXJtaW5hdGVkIGFycmF5IG9mIHByZWZpeCBzdHJpbmdzIHRvIGFwcGx5IHRvIG5hbWUgd2hpbGUKKyAgICAvLy8gbWF0Y2hpbmcuCisgICAgY29uc3QgY2hhciAqY29uc3QgKlByZWZpeGVzOworICAgIGNvbnN0IGNoYXIgKk5hbWU7CisgICAgY29uc3QgY2hhciAqSGVscFRleHQ7CisgICAgY29uc3QgY2hhciAqTWV0YVZhcjsKKyAgICB1bnNpZ25lZCBJRDsKKyAgICB1bnNpZ25lZCBjaGFyIEtpbmQ7CisgICAgdW5zaWduZWQgY2hhciBQYXJhbTsKKyAgICB1bnNpZ25lZCBzaG9ydCBGbGFnczsKKyAgICB1bnNpZ25lZCBzaG9ydCBHcm91cElEOworICAgIHVuc2lnbmVkIHNob3J0IEFsaWFzSUQ7CisgICAgY29uc3QgY2hhciAqQWxpYXNBcmdzOworICAgIGNvbnN0IGNoYXIgKlZhbHVlczsKKyAgfTsKKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBUaGUgb3B0aW9uIGluZm9ybWF0aW9uIHRhYmxlLgorICBzdGQ6OnZlY3RvcjxJbmZvPiBPcHRpb25JbmZvczsKKyAgYm9vbCBJZ25vcmVDYXNlOworCisgIHVuc2lnbmVkIFRoZUlucHV0T3B0aW9uSUQgPSAwOworICB1bnNpZ25lZCBUaGVVbmtub3duT3B0aW9uSUQgPSAwOworCisgIC8vLyBUaGUgaW5kZXggb2YgdGhlIGZpcnN0IG9wdGlvbiB3aGljaCBjYW4gYmUgcGFyc2VkIChpLmUuLCBpcyBub3QgYQorICAvLy8gc3BlY2lhbCBvcHRpb24gbGlrZSAnaW5wdXQnIG9yICd1bmtub3duJywgYW5kIGlzIG5vdCBhbiBvcHRpb24gZ3JvdXApLgorICB1bnNpZ25lZCBGaXJzdFNlYXJjaGFibGVJbmRleCA9IDA7CisKKyAgLy8vIFRoZSB1bmlvbiBvZiBhbGwgb3B0aW9uIHByZWZpeGVzLiBJZiBhbiBhcmd1bWVudCBkb2VzIG5vdCBiZWdpbiB3aXRoCisgIC8vLyBvbmUgb2YgdGhlc2UsIGl0IGlzIGFuIGlucHV0LgorICBTdHJpbmdTZXQ8PiBQcmVmaXhlc1VuaW9uOworICBzdGQ6OnN0cmluZyBQcmVmaXhDaGFyczsKKworcHJpdmF0ZToKKyAgY29uc3QgSW5mbyAmZ2V0SW5mbyhPcHRTcGVjaWZpZXIgT3B0KSBjb25zdCB7CisgICAgdW5zaWduZWQgaWQgPSBPcHQuZ2V0SUQoKTsKKyAgICBhc3NlcnQoaWQgPiAwICYmIGlkIC0gMSA8IGdldE51bU9wdGlvbnMoKSAmJiAiSW52YWxpZCBPcHRpb24gSUQuIik7CisgICAgcmV0dXJuIE9wdGlvbkluZm9zW2lkIC0gMV07CisgIH0KKworcHJvdGVjdGVkOgorICBPcHRUYWJsZShBcnJheVJlZjxJbmZvPiBPcHRpb25JbmZvcywgYm9vbCBJZ25vcmVDYXNlID0gZmFsc2UpOworCitwdWJsaWM6CisgIH5PcHRUYWJsZSgpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2Ygb3B0aW9uIGNsYXNzZXMuCisgIHVuc2lnbmVkIGdldE51bU9wdGlvbnMoKSBjb25zdCB7IHJldHVybiBPcHRpb25JbmZvcy5zaXplKCk7IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgZ2l2ZW4gT3B0J3MgT3B0aW9uIGluc3RhbmNlLCBsYXppbHkgY3JlYXRpbmcgaXQKKyAgLy8vIGlmIG5lY2Vzc2FyeS4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSBvcHRpb24sIG9yIG51bGwgZm9yIHRoZSBJTlZBTElEIG9wdGlvbiBpZC4KKyAgY29uc3QgT3B0aW9uIGdldE9wdGlvbihPcHRTcGVjaWZpZXIgT3B0KSBjb25zdDsKKworICAvLy8gXGJyaWVmIExvb2t1cCB0aGUgbmFtZSBvZiB0aGUgZ2l2ZW4gb3B0aW9uLgorICBjb25zdCBjaGFyICpnZXRPcHRpb25OYW1lKE9wdFNwZWNpZmllciBpZCkgY29uc3QgeworICAgIHJldHVybiBnZXRJbmZvKGlkKS5OYW1lOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGtpbmQgb2YgdGhlIGdpdmVuIG9wdGlvbi4KKyAgdW5zaWduZWQgZ2V0T3B0aW9uS2luZChPcHRTcGVjaWZpZXIgaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SW5mbyhpZCkuS2luZDsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBncm91cCBpZCBmb3IgdGhlIGdpdmVuIG9wdGlvbi4KKyAgdW5zaWduZWQgZ2V0T3B0aW9uR3JvdXBJRChPcHRTcGVjaWZpZXIgaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SW5mbyhpZCkuR3JvdXBJRDsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBoZWxwIHRleHQgdG8gdXNlIHRvIGRlc2NyaWJlIHRoaXMgb3B0aW9uLgorICBjb25zdCBjaGFyICpnZXRPcHRpb25IZWxwVGV4dChPcHRTcGVjaWZpZXIgaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SW5mbyhpZCkuSGVscFRleHQ7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbWV0YS12YXJpYWJsZSBuYW1lIHRvIHVzZSB3aGVuIGRlc2NyaWJpbmcKKyAgLy8vIHRoaXMgb3B0aW9ucyB2YWx1ZXMgaW4gdGhlIGhlbHAgdGV4dC4KKyAgY29uc3QgY2hhciAqZ2V0T3B0aW9uTWV0YVZhcihPcHRTcGVjaWZpZXIgaWQpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0SW5mbyhpZCkuTWV0YVZhcjsKKyAgfQorCisgIC8vLyBGaW5kIHBvc3NpYmxlIHZhbHVlIGZvciBnaXZlbiBmbGFncy4gVGhpcyBpcyB1c2VkIGZvciBzaGVsbAorICAvLy8gYXV0b2NvbXBsZXRpb24uCisgIC8vLworICAvLy8gXHBhcmFtIFtpbl0gT3B0aW9uIC0gS2V5IGZsYWcgbGlrZSAiLXN0ZGxpYj0iIHdoZW4gIi1zdGRsaWI9bCIKKyAgLy8vIHdhcyBwYXNzZWQgdG8gY2xhbmcuCisgIC8vLworICAvLy8gXHBhcmFtIFtpbl0gQXJnIC0gVmFsdWUgd2hpY2ggd2Ugd2FudCB0byBhdXRvY29tcGxldGUgbGlrZSAibCIKKyAgLy8vIHdoZW4gIi1zdGRsaWI9bCIgd2FzIHBhc3NlZCB0byBjbGFuZy4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSB2ZWN0b3Igb2YgcG9zc2libGUgdmFsdWVzLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3VnZ2VzdFZhbHVlQ29tcGxldGlvbnMoU3RyaW5nUmVmIE9wdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBBcmcpIGNvbnN0OworCisgIC8vLyBGaW5kIGZsYWdzIGZyb20gT3B0VGFibGUgd2hpY2ggc3RhcnRzIHdpdGggQ3VyLgorICAvLy8KKyAgLy8vIFxwYXJhbSBbaW5dIEN1ciAtIFN0cmluZyBwcmVmaXggdGhhdCBhbGwgcmV0dXJuZWQgZmxhZ3MgbmVlZAorICAvLyAgdG8gc3RhcnQgd2l0aC4KKyAgLy8vCisgIC8vLyBccmV0dXJuIFRoZSB2ZWN0b3Igb2YgZmxhZ3Mgd2hpY2ggc3RhcnQgd2l0aCBDdXIuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBmaW5kQnlQcmVmaXgoU3RyaW5nUmVmIEN1ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBzaG9ydCBEaXNhYmxlRmxhZ3MpIGNvbnN0OworCisgIC8vLyBGaW5kIHRoZSBPcHRUYWJsZSBvcHRpb24gdGhhdCBtb3N0IGNsb3NlbHkgbWF0Y2hlcyB0aGUgZ2l2ZW4gc3RyaW5nLgorICAvLy8KKyAgLy8vIFxwYXJhbSBbaW5dIE9wdGlvbiAtIEEgc3RyaW5nLCBzdWNoIGFzICItc3RkbGlicz1sIiwgdGhhdCByZXByZXNlbnRzIHVzZXIKKyAgLy8vIGlucHV0IG9mIGFuIG9wdGlvbiB0aGF0IG1heSBub3QgZXhpc3QgaW4gdGhlIE9wdFRhYmxlLiBOb3RlIHRoYXQgdGhlCisgIC8vLyBzdHJpbmcgaW5jbHVkZXMgcHJlZml4IGRhc2hlcyAiLSIgYXMgd2VsbCBhcyB2YWx1ZXMgIj1sIi4KKyAgLy8vIFxwYXJhbSBbb3V0XSBOZWFyZXN0U3RyaW5nIC0gVGhlIG5lYXJlc3Qgb3B0aW9uIHN0cmluZyBmb3VuZCBpbiB0aGUKKyAgLy8vIE9wdFRhYmxlLgorICAvLy8gXHBhcmFtIFtpbl0gRmxhZ3NUb0luY2x1ZGUgLSBPbmx5IGZpbmQgb3B0aW9ucyB3aXRoIGFueSBvZiB0aGVzZSBmbGFncy4KKyAgLy8vIFplcm8gaXMgdGhlIGRlZmF1bHQsIHdoaWNoIGluY2x1ZGVzIGFsbCBmbGFncy4KKyAgLy8vIFxwYXJhbSBbaW5dIEZsYWdzVG9FeGNsdWRlIC0gRG9uJ3QgZmluZCBvcHRpb25zIHdpdGggdGhpcyBmbGFnLiBaZXJvCisgIC8vLyBpcyB0aGUgZGVmYXVsdCwgYW5kIG1lYW5zIGV4Y2x1ZGUgbm90aGluZy4KKyAgLy8vIFxwYXJhbSBbaW5dIE1pbmltdW1MZW5ndGggLSBEb24ndCBmaW5kIG9wdGlvbnMgc2hvcnRlciB0aGFuIHRoaXMgbGVuZ3RoLgorICAvLy8gRm9yIGV4YW1wbGUsIGEgbWluaW11bSBsZW5ndGggb2YgMyBwcmV2ZW50cyAiLXgiIGZyb20gYmVpbmcgY29uc2lkZXJlZAorICAvLy8gbmVhciB0byAiLVMiLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVGhlIGVkaXQgZGlzdGFuY2Ugb2YgdGhlIG5lYXJlc3Qgc3RyaW5nIGZvdW5kLgorICB1bnNpZ25lZCBmaW5kTmVhcmVzdChTdHJpbmdSZWYgT3B0aW9uLCBzdGQ6OnN0cmluZyAmTmVhcmVzdFN0cmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmxhZ3NUb0luY2x1ZGUgPSAwLCB1bnNpZ25lZCBGbGFnc1RvRXhjbHVkZSA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1pbmltdW1MZW5ndGggPSA0KSBjb25zdDsKKworICAvLy8gQWRkIFZhbHVlcyB0byBPcHRpb24ncyBWYWx1ZXMgY2xhc3MKKyAgLy8vCisgIC8vLyBccGFyYW0gW2luXSBPcHRpb24gLSBQcmVmaXggKyBOYW1lIG9mIHRoZSBmbGFnIHdoaWNoIFZhbHVlcyB3aWxsIGJlCisgIC8vLyAgY2hhbmdlZC4gRm9yIGV4YW1wbGUsICItYW5hbHl6ZXItY2hlY2tlciIuCisgIC8vLyBccGFyYW0gW2luXSBWYWx1ZXMgLSBTdHJpbmcgb2YgVmFsdWVzIHNlcGVyYXRlZCBieSAiLCIsIHN1Y2ggYXMKKyAgLy8vICAiZm9vLCBiYXIuLiIsIHdoZXJlIGZvbyBhbmQgYmFyIGlzIHRoZSBhcmd1bWVudCB3aGljaCB0aGUgT3B0aW9uIGZsYWcKKyAgLy8vICB0YWtlcworICAvLy8KKyAgLy8vIFxyZXR1cm4gdHJ1ZSBpbiBzdWNjZXNzLCBhbmQgZmFsc2UgaW4gZmFpbC4KKyAgYm9vbCBhZGRWYWx1ZXMoY29uc3QgY2hhciAqT3B0aW9uLCBjb25zdCBjaGFyICpWYWx1ZXMpOworCisgIC8vLyBcYnJpZWYgUGFyc2UgYSBzaW5nbGUgYXJndW1lbnQ7IHJldHVybmluZyB0aGUgbmV3IGFyZ3VtZW50IGFuZAorICAvLy8gdXBkYXRpbmcgSW5kZXguCisgIC8vLworICAvLy8gXHBhcmFtIFtpbixvdXRdIEluZGV4IC0gVGhlIGN1cnJlbnQgcGFyc2luZyBwb3NpdGlvbiBpbiB0aGUgYXJndW1lbnQKKyAgLy8vIHN0cmluZyBsaXN0OyBvbiByZXR1cm4gdGhpcyB3aWxsIGJlIHRoZSBpbmRleCBvZiB0aGUgbmV4dCBhcmd1bWVudAorICAvLy8gc3RyaW5nIHRvIHBhcnNlLgorICAvLy8gXHBhcmFtIFtpbl0gRmxhZ3NUb0luY2x1ZGUgLSBPbmx5IHBhcnNlIG9wdGlvbnMgd2l0aCBhbnkgb2YgdGhlc2UgZmxhZ3MuCisgIC8vLyBaZXJvIGlzIHRoZSBkZWZhdWx0IHdoaWNoIGluY2x1ZGVzIGFsbCBmbGFncy4KKyAgLy8vIFxwYXJhbSBbaW5dIEZsYWdzVG9FeGNsdWRlIC0gRG9uJ3QgcGFyc2Ugb3B0aW9ucyB3aXRoIHRoaXMgZmxhZy4gIFplcm8KKyAgLy8vIGlzIHRoZSBkZWZhdWx0IGFuZCBtZWFucyBleGNsdWRlIG5vdGhpbmcuCisgIC8vLworICAvLy8gXHJldHVybiBUaGUgcGFyc2VkIGFyZ3VtZW50LCBvciAwIGlmIHRoZSBhcmd1bWVudCBpcyBtaXNzaW5nIHZhbHVlcworICAvLy8gKGluIHdoaWNoIGNhc2UgSW5kZXggc3RpbGwgcG9pbnRzIGF0IHRoZSBjb25jZXB0dWFsIG5leHQgYXJndW1lbnQgc3RyaW5nCisgIC8vLyB0byBwYXJzZSkuCisgIEFyZyAqUGFyc2VPbmVBcmcoY29uc3QgQXJnTGlzdCAmQXJncywgdW5zaWduZWQgJkluZGV4LAorICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzVG9JbmNsdWRlID0gMCwKKyAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGbGFnc1RvRXhjbHVkZSA9IDApIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUGFyc2UgYW4gbGlzdCBvZiBhcmd1bWVudHMgaW50byBhbiBJbnB1dEFyZ0xpc3QuCisgIC8vLworICAvLy8gVGhlIHJlc3VsdGluZyBJbnB1dEFyZ0xpc3Qgd2lsbCByZWZlcmVuY2UgdGhlIHN0cmluZ3MgaW4gW1xwIEFyZ0JlZ2luLAorICAvLy8gXHAgQXJnRW5kKSwgYW5kIHRoZWlyIGxpZmV0aW1lIHNob3VsZCBleHRlbmQgcGFzdCB0aGF0IG9mIHRoZSByZXR1cm5lZAorICAvLy8gSW5wdXRBcmdMaXN0LgorICAvLy8KKyAgLy8vIFRoZSBvbmx5IGVycm9yIHRoYXQgY2FuIG9jY3VyIGluIHRoaXMgcm91dGluZSBpcyBpZiBhbiBhcmd1bWVudCBpcworICAvLy8gbWlzc2luZyB2YWx1ZXM7IGluIHRoaXMgY2FzZSBccCBNaXNzaW5nQXJnQ291bnQgd2lsbCBiZSBub24temVyby4KKyAgLy8vCisgIC8vLyBccGFyYW0gTWlzc2luZ0FyZ0luZGV4IC0gT24gZXJyb3IsIHRoZSBpbmRleCBvZiB0aGUgb3B0aW9uIHdoaWNoIGNvdWxkCisgIC8vLyBub3QgYmUgcGFyc2VkLgorICAvLy8gXHBhcmFtIE1pc3NpbmdBcmdDb3VudCAtIE9uIGVycm9yLCB0aGUgbnVtYmVyIG9mIG1pc3Npbmcgb3B0aW9ucy4KKyAgLy8vIFxwYXJhbSBGbGFnc1RvSW5jbHVkZSAtIE9ubHkgcGFyc2Ugb3B0aW9ucyB3aXRoIGFueSBvZiB0aGVzZSBmbGFncy4KKyAgLy8vIFplcm8gaXMgdGhlIGRlZmF1bHQgd2hpY2ggaW5jbHVkZXMgYWxsIGZsYWdzLgorICAvLy8gXHBhcmFtIEZsYWdzVG9FeGNsdWRlIC0gRG9uJ3QgcGFyc2Ugb3B0aW9ucyB3aXRoIHRoaXMgZmxhZy4gIFplcm8KKyAgLy8vIGlzIHRoZSBkZWZhdWx0IGFuZCBtZWFucyBleGNsdWRlIG5vdGhpbmcuCisgIC8vLyBccmV0dXJuIEFuIElucHV0QXJnTGlzdDsgb24gZXJyb3IgdGhpcyB3aWxsIGNvbnRhaW4gYWxsIHRoZSBvcHRpb25zCisgIC8vLyB3aGljaCBjb3VsZCBiZSBwYXJzZWQuCisgIElucHV0QXJnTGlzdCBQYXJzZUFyZ3MoQXJyYXlSZWY8Y29uc3QgY2hhciAqPiBBcmdzLCB1bnNpZ25lZCAmTWlzc2luZ0FyZ0luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZNaXNzaW5nQXJnQ291bnQsIHVuc2lnbmVkIEZsYWdzVG9JbmNsdWRlID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGbGFnc1RvRXhjbHVkZSA9IDApIGNvbnN0OworCisgIC8vLyBcYnJpZWYgUmVuZGVyIHRoZSBoZWxwIHRleHQgZm9yIGFuIG9wdGlvbiB0YWJsZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gT1MgLSBUaGUgc3RyZWFtIHRvIHdyaXRlIHRoZSBoZWxwIHRleHQgdG8uCisgIC8vLyBccGFyYW0gTmFtZSAtIFRoZSBuYW1lIHRvIHVzZSBpbiB0aGUgdXNhZ2UgbGluZS4KKyAgLy8vIFxwYXJhbSBUaXRsZSAtIFRoZSB0aXRsZSB0byB1c2UgaW4gdGhlIHVzYWdlIGxpbmUuCisgIC8vLyBccGFyYW0gRmxhZ3NUb0luY2x1ZGUgLSBJZiBub24temVybywgb25seSBpbmNsdWRlIG9wdGlvbnMgd2l0aCBhbnkKKyAgLy8vICAgICAgICAgICAgICAgICAgICAgICAgIG9mIHRoZXNlIGZsYWdzIHNldC4KKyAgLy8vIFxwYXJhbSBGbGFnc1RvRXhjbHVkZSAtIEV4Y2x1ZGUgb3B0aW9ucyB3aXRoIGFueSBvZiB0aGVzZSBmbGFncyBzZXQuCisgIC8vLyBccGFyYW0gU2hvd0FsbEFsaWFzZXMgLSBJZiB0cnVlLCBkaXNwbGF5IGFsbCBvcHRpb25zIGluY2x1ZGluZyBhbGlhc2VzCisgIC8vLyAgICAgICAgICAgICAgICAgICAgICAgICB0aGF0IGRvbid0IGhhdmUgaGVscCB0ZXh0cy4gQnkgZGVmYXVsdCwgd2UgZGlzcGxheQorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgb25seSBvcHRpb25zIHRoYXQgYXJlIG5vdCBoaWRkZW4gYW5kIGhhdmUgaGVscAorICAvLy8gICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHMuCisgIHZvaWQgUHJpbnRIZWxwKHJhd19vc3RyZWFtICZPUywgY29uc3QgY2hhciAqTmFtZSwgY29uc3QgY2hhciAqVGl0bGUsCisgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEZsYWdzVG9JbmNsdWRlLCB1bnNpZ25lZCBGbGFnc1RvRXhjbHVkZSwKKyAgICAgICAgICAgICAgICAgYm9vbCBTaG93QWxsQWxpYXNlcykgY29uc3Q7CisKKyAgdm9pZCBQcmludEhlbHAocmF3X29zdHJlYW0gJk9TLCBjb25zdCBjaGFyICpOYW1lLCBjb25zdCBjaGFyICpUaXRsZSwKKyAgICAgICAgICAgICAgICAgYm9vbCBTaG93SGlkZGVuID0gZmFsc2UsIGJvb2wgU2hvd0FsbEFsaWFzZXMgPSBmYWxzZSkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugb3B0CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX09QVElPTl9PUFRUQUJMRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09wdGlvbi9PcHRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vT3B0aW9uL09wdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YWViZDUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL09wdGlvbi9PcHRpb24uaApAQCAtMCwwICsxLDIxOCBAQAorLy89PT0tIE9wdGlvbi5oIC0gQWJzdHJhY3QgRHJpdmVyIE9wdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX09QVElPTl9PUFRJT05fSAorI2RlZmluZSBMTFZNX09QVElPTl9PUFRJT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL09wdGlvbi9PcHRTcGVjaWZpZXIuaCIKKyNpbmNsdWRlICJsbHZtL09wdGlvbi9PcHRUYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBvcHQgeworCitjbGFzcyBBcmc7CitjbGFzcyBBcmdMaXN0OworCisvLy8gQXJnU3RyaW5nTGlzdCAtIFR5cGUgdXNlZCBmb3IgY29uc3RydWN0aW5nIGFyZ3YgbGlzdHMgZm9yIHN1YnByb2Nlc3Nlcy4KK3VzaW5nIEFyZ1N0cmluZ0xpc3QgPSBTbWFsbFZlY3Rvcjxjb25zdCBjaGFyICosIDE2PjsKKworLy8vIEJhc2UgZmxhZ3MgZm9yIGFsbCBvcHRpb25zLiBDdXN0b20gZmxhZ3MgbWF5IGJlIGFkZGVkIGFmdGVyLgorZW51bSBEcml2ZXJGbGFnIHsKKyAgSGVscEhpZGRlbiAgICAgICA9ICgxIDw8IDApLAorICBSZW5kZXJBc0lucHV0ICAgID0gKDEgPDwgMSksCisgIFJlbmRlckpvaW5lZCAgICAgPSAoMSA8PCAyKSwKKyAgUmVuZGVyU2VwYXJhdGUgICA9ICgxIDw8IDMpCit9OworCisvLy8gT3B0aW9uIC0gQWJzdHJhY3QgcmVwcmVzZW50YXRpb24gZm9yIGEgc2luZ2xlIGZvcm0gb2YgZHJpdmVyCisvLy8gYXJndW1lbnQuCisvLy8KKy8vLyBBbiBPcHRpb24gY2xhc3MgcmVwcmVzZW50cyBhIGZvcm0gb2Ygb3B0aW9uIHRoYXQgdGhlIGRyaXZlcgorLy8vIHRha2VzLCBmb3IgZXhhbXBsZSBob3cgbWFueSBhcmd1bWVudHMgdGhlIG9wdGlvbiBoYXMgYW5kIGhvdworLy8vIHRoZXkgY2FuIGJlIHByb3ZpZGVkLiBJbmRpdmlkdWFsIG9wdGlvbiBpbnN0YW5jZXMgc3RvcmUKKy8vLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgZ3JvdXAgdGhlIG9wdGlvbiBpcyBhIG1lbWJlcgorLy8vIG9mIChpZiBhbnkpLCBpZiB0aGUgb3B0aW9uIGlzIGFuIGFsaWFzLCBhbmQgYSBudW1iZXIgb2YKKy8vLyBmbGFncy4gQXQgcnVudGltZSB0aGUgZHJpdmVyIHBhcnNlcyB0aGUgY29tbWFuZCBsaW5lIGludG8KKy8vLyBjb25jcmV0ZSBBcmcgaW5zdGFuY2VzLCBlYWNoIG9mIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGEKKy8vLyBwYXJ0aWN1bGFyIE9wdGlvbiBpbnN0YW5jZS4KK2NsYXNzIE9wdGlvbiB7CitwdWJsaWM6CisgIGVudW0gT3B0aW9uQ2xhc3MgeworICAgIEdyb3VwQ2xhc3MgPSAwLAorICAgIElucHV0Q2xhc3MsCisgICAgVW5rbm93bkNsYXNzLAorICAgIEZsYWdDbGFzcywKKyAgICBKb2luZWRDbGFzcywKKyAgICBWYWx1ZXNDbGFzcywKKyAgICBTZXBhcmF0ZUNsYXNzLAorICAgIFJlbWFpbmluZ0FyZ3NDbGFzcywKKyAgICBSZW1haW5pbmdBcmdzSm9pbmVkQ2xhc3MsCisgICAgQ29tbWFKb2luZWRDbGFzcywKKyAgICBNdWx0aUFyZ0NsYXNzLAorICAgIEpvaW5lZE9yU2VwYXJhdGVDbGFzcywKKyAgICBKb2luZWRBbmRTZXBhcmF0ZUNsYXNzCisgIH07CisKKyAgZW51bSBSZW5kZXJTdHlsZUtpbmQgeworICAgIFJlbmRlckNvbW1hSm9pbmVkU3R5bGUsCisgICAgUmVuZGVySm9pbmVkU3R5bGUsCisgICAgUmVuZGVyU2VwYXJhdGVTdHlsZSwKKyAgICBSZW5kZXJWYWx1ZXNTdHlsZQorICB9OworCitwcm90ZWN0ZWQ6CisgIGNvbnN0IE9wdFRhYmxlOjpJbmZvICpJbmZvOworICBjb25zdCBPcHRUYWJsZSAqT3duZXI7CisKK3B1YmxpYzoKKyAgT3B0aW9uKGNvbnN0IE9wdFRhYmxlOjpJbmZvICpJbmZvLCBjb25zdCBPcHRUYWJsZSAqT3duZXIpOworCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5mbyAhPSBudWxscHRyOworICB9CisKKyAgdW5zaWduZWQgZ2V0SUQoKSBjb25zdCB7CisgICAgYXNzZXJ0KEluZm8gJiYgIk11c3QgaGF2ZSBhIHZhbGlkIGluZm8hIik7CisgICAgcmV0dXJuIEluZm8tPklEOworICB9CisKKyAgT3B0aW9uQ2xhc3MgZ2V0S2luZCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoSW5mbyAmJiAiTXVzdCBoYXZlIGEgdmFsaWQgaW5mbyEiKTsKKyAgICByZXR1cm4gT3B0aW9uQ2xhc3MoSW5mby0+S2luZCk7CisgIH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgbmFtZSBvZiB0aGlzIG9wdGlvbiB3aXRob3V0IGFueSBwcmVmaXguCisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeworICAgIGFzc2VydChJbmZvICYmICJNdXN0IGhhdmUgYSB2YWxpZCBpbmZvISIpOworICAgIHJldHVybiBJbmZvLT5OYW1lOworICB9CisKKyAgY29uc3QgT3B0aW9uIGdldEdyb3VwKCkgY29uc3QgeworICAgIGFzc2VydChJbmZvICYmICJNdXN0IGhhdmUgYSB2YWxpZCBpbmZvISIpOworICAgIGFzc2VydChPd25lciAmJiAiTXVzdCBoYXZlIGEgdmFsaWQgb3duZXIhIik7CisgICAgcmV0dXJuIE93bmVyLT5nZXRPcHRpb24oSW5mby0+R3JvdXBJRCk7CisgIH0KKworICBjb25zdCBPcHRpb24gZ2V0QWxpYXMoKSBjb25zdCB7CisgICAgYXNzZXJ0KEluZm8gJiYgIk11c3QgaGF2ZSBhIHZhbGlkIGluZm8hIik7CisgICAgYXNzZXJ0KE93bmVyICYmICJNdXN0IGhhdmUgYSB2YWxpZCBvd25lciEiKTsKKyAgICByZXR1cm4gT3duZXItPmdldE9wdGlvbihJbmZvLT5BbGlhc0lEKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBhbGlhcyBhcmd1bWVudHMgYXMgYSBcMCBzZXBhcmF0ZWQgbGlzdC4KKyAgLy8vIEUuZy4gWyJmb28iLCAiYmFyIl0gd291bGQgYmUgcmV0dXJuZWQgYXMgImZvb1wwYmFyXDAiLgorICBjb25zdCBjaGFyICpnZXRBbGlhc0FyZ3MoKSBjb25zdCB7CisgICAgYXNzZXJ0KEluZm8gJiYgIk11c3QgaGF2ZSBhIHZhbGlkIGluZm8hIik7CisgICAgYXNzZXJ0KCghSW5mby0+QWxpYXNBcmdzIHx8IEluZm8tPkFsaWFzQXJnc1swXSAhPSAwKSAmJgorICAgICAgICAgICAiQWxpYXNBcmdzIHNob3VsZCBiZSBlaXRoZXIgMCBvciBub24tZW1wdHkuIik7CisKKyAgICByZXR1cm4gSW5mby0+QWxpYXNBcmdzOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIGRlZmF1bHQgcHJlZml4IGZvciB0aGlzIG9wdGlvbi4KKyAgU3RyaW5nUmVmIGdldFByZWZpeCgpIGNvbnN0IHsKKyAgICBjb25zdCBjaGFyICpQcmVmaXggPSAqSW5mby0+UHJlZml4ZXM7CisgICAgcmV0dXJuIFByZWZpeCA/IFByZWZpeCA6IFN0cmluZ1JlZigpOworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIG5hbWUgb2YgdGhpcyBvcHRpb24gd2l0aCB0aGUgZGVmYXVsdCBwcmVmaXguCisgIHN0ZDo6c3RyaW5nIGdldFByZWZpeGVkTmFtZSgpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZyBSZXQgPSBnZXRQcmVmaXgoKTsKKyAgICBSZXQgKz0gZ2V0TmFtZSgpOworICAgIHJldHVybiBSZXQ7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1BcmdzKCkgY29uc3QgeyByZXR1cm4gSW5mby0+UGFyYW07IH0KKworICBib29sIGhhc05vT3B0QXNJbnB1dCgpIGNvbnN0IHsgcmV0dXJuIEluZm8tPkZsYWdzICYgUmVuZGVyQXNJbnB1dDt9CisKKyAgUmVuZGVyU3R5bGVLaW5kIGdldFJlbmRlclN0eWxlKCkgY29uc3QgeworICAgIGlmIChJbmZvLT5GbGFncyAmIFJlbmRlckpvaW5lZCkKKyAgICAgIHJldHVybiBSZW5kZXJKb2luZWRTdHlsZTsKKyAgICBpZiAoSW5mby0+RmxhZ3MgJiBSZW5kZXJTZXBhcmF0ZSkKKyAgICAgIHJldHVybiBSZW5kZXJTZXBhcmF0ZVN0eWxlOworICAgIHN3aXRjaCAoZ2V0S2luZCgpKSB7CisgICAgY2FzZSBHcm91cENsYXNzOgorICAgIGNhc2UgSW5wdXRDbGFzczoKKyAgICBjYXNlIFVua25vd25DbGFzczoKKyAgICAgIHJldHVybiBSZW5kZXJWYWx1ZXNTdHlsZTsKKyAgICBjYXNlIEpvaW5lZENsYXNzOgorICAgIGNhc2UgSm9pbmVkQW5kU2VwYXJhdGVDbGFzczoKKyAgICAgIHJldHVybiBSZW5kZXJKb2luZWRTdHlsZTsKKyAgICBjYXNlIENvbW1hSm9pbmVkQ2xhc3M6CisgICAgICByZXR1cm4gUmVuZGVyQ29tbWFKb2luZWRTdHlsZTsKKyAgICBjYXNlIEZsYWdDbGFzczoKKyAgICBjYXNlIFZhbHVlc0NsYXNzOgorICAgIGNhc2UgU2VwYXJhdGVDbGFzczoKKyAgICBjYXNlIE11bHRpQXJnQ2xhc3M6CisgICAgY2FzZSBKb2luZWRPclNlcGFyYXRlQ2xhc3M6CisgICAgY2FzZSBSZW1haW5pbmdBcmdzQ2xhc3M6CisgICAgY2FzZSBSZW1haW5pbmdBcmdzSm9pbmVkQ2xhc3M6CisgICAgICByZXR1cm4gUmVuZGVyU2VwYXJhdGVTdHlsZTsKKyAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5leHBlY3RlZCBraW5kISIpOworICB9CisKKyAgLy8vIFRlc3QgaWYgdGhpcyBvcHRpb24gaGFzIHRoZSBmbGFnIFxhIFZhbC4KKyAgYm9vbCBoYXNGbGFnKHVuc2lnbmVkIFZhbCkgY29uc3QgeworICAgIHJldHVybiBJbmZvLT5GbGFncyAmIFZhbDsKKyAgfQorCisgIC8vLyBnZXRVbmFsaWFzZWRPcHRpb24gLSBSZXR1cm4gdGhlIGZpbmFsIG9wdGlvbiB0aGlzIG9wdGlvbgorICAvLy8gYWxpYXNlcyAoaXRzZWxmLCBpZiB0aGUgb3B0aW9uIGhhcyBubyBhbGlhcykuCisgIGNvbnN0IE9wdGlvbiBnZXRVbmFsaWFzZWRPcHRpb24oKSBjb25zdCB7CisgICAgY29uc3QgT3B0aW9uIEFsaWFzID0gZ2V0QWxpYXMoKTsKKyAgICBpZiAoQWxpYXMuaXNWYWxpZCgpKSByZXR1cm4gQWxpYXMuZ2V0VW5hbGlhc2VkT3B0aW9uKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIGdldFJlbmRlck5hbWUgLSBSZXR1cm4gdGhlIG5hbWUgdG8gdXNlIHdoZW4gcmVuZGVyaW5nIHRoaXMKKyAgLy8vIG9wdGlvbi4KKyAgU3RyaW5nUmVmIGdldFJlbmRlck5hbWUoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFVuYWxpYXNlZE9wdGlvbigpLmdldE5hbWUoKTsKKyAgfQorCisgIC8vLyBtYXRjaGVzIC0gUHJlZGljYXRlIGZvciB3aGV0aGVyIHRoaXMgb3B0aW9uIGlzIHBhcnQgb2YgdGhlCisgIC8vLyBnaXZlbiBvcHRpb24gKHdoaWNoIG1heSBiZSBhIGdyb3VwKS4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgbWF0Y2hlcyBhZ2FpbnN0IG9wdGlvbnMgd2hpY2ggYXJlIGFuIGFsaWFzIHNob3VsZCBuZXZlciBiZQorICAvLy8gZG9uZSAtLSBhbGlhc2VzIGRvIG5vdCBwYXJ0aWNpcGF0ZSBpbiBtYXRjaGluZyBhbmQgc28gc3VjaCBhIHF1ZXJ5IHdpbGwKKyAgLy8vIGFsd2F5cyBiZSBmYWxzZS4KKyAgYm9vbCBtYXRjaGVzKE9wdFNwZWNpZmllciBJRCkgY29uc3Q7CisKKyAgLy8vIGFjY2VwdCAtIFBvdGVudGlhbGx5IGFjY2VwdCB0aGUgY3VycmVudCBhcmd1bWVudCwgcmV0dXJuaW5nIGEKKyAgLy8vIG5ldyBBcmcgaW5zdGFuY2UsIG9yIDAgaWYgdGhlIG9wdGlvbiBkb2VzIG5vdCBhY2NlcHQgdGhpcworICAvLy8gYXJndW1lbnQgKG9yIHRoZSBhcmd1bWVudCBpcyBtaXNzaW5nIHZhbHVlcykuCisgIC8vLworICAvLy8gSWYgdGhlIG9wdGlvbiBhY2NlcHRzIHRoZSBjdXJyZW50IGFyZ3VtZW50LCBhY2NlcHQoKSBzZXRzCisgIC8vLyBJbmRleCB0byB0aGUgcG9zaXRpb24gd2hlcmUgYXJndW1lbnQgcGFyc2luZyBzaG91bGQgcmVzdW1lCisgIC8vLyAoZXZlbiBpZiB0aGUgYXJndW1lbnQgaXMgbWlzc2luZyB2YWx1ZXMpLgorICAvLy8KKyAgLy8vIFxwYXJhbSBBcmdTaXplIFRoZSBudW1iZXIgb2YgYnl0ZXMgdGFrZW4gdXAgYnkgdGhlIG1hdGNoZWQgT3B0aW9uIHByZWZpeAorICAvLy8gICAgICAgICAgICAgICAgYW5kIG5hbWUuIFRoaXMgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hlcmUgam9pbmVkIHZhbHVlcworICAvLy8gICAgICAgICAgICAgICAgc3RhcnQuCisgIEFyZyAqYWNjZXB0KGNvbnN0IEFyZ0xpc3QgJkFyZ3MsIHVuc2lnbmVkICZJbmRleCwgdW5zaWduZWQgQXJnU2l6ZSkgY29uc3Q7CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmTykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIG9wdAorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9PUFRJT05fT1BUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUGFzcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9QYXNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI5YjM3NwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUGFzcy5oCkBAIC0wLDAgKzEsMzc4IEBACisvLz09PS0gbGx2bS9QYXNzLmggLSBCYXNlIGNsYXNzIGZvciBQYXNzZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgYmFzZSBjbGFzcyB0aGF0IGluZGljYXRlcyB0aGF0IGEgc3BlY2lmaWVkIGNsYXNzIGlzIGEKKy8vIHRyYW5zZm9ybWF0aW9uIHBhc3MgaW1wbGVtZW50YXRpb24uCisvLworLy8gUGFzc2VzIGFyZSBkZXNpZ25lZCB0aGlzIHdheSBzbyB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIHJ1biBwYXNzZXMgaW4gYSBjYWNoZQorLy8gYW5kIG9yZ2FuaXphdGlvbmFsbHkgb3B0aW1hbCBvcmRlciB3aXRob3V0IGhhdmluZyB0byBzcGVjaWZ5IGl0IGF0IHRoZSBmcm9udAorLy8gZW5kLiAgVGhpcyBhbGxvd3MgYXJiaXRyYXJ5IHBhc3NlcyB0byBiZSBzdHJ1bmcgdG9nZXRoZXIgYW5kIGhhdmUgdGhlbQorLy8gZXhlY3V0ZWQgYXMgZWZmaWNpZW50bHkgYXMgcG9zc2libGUuCisvLworLy8gUGFzc2VzIHNob3VsZCBleHRlbmQgb25lIG9mIHRoZSBjbGFzc2VzIGJlbG93LCBkZXBlbmRpbmcgb24gdGhlIGd1YXJhbnRlZXMKKy8vIHRoYXQgaXQgY2FuIG1ha2UgYWJvdXQgd2hhdCB3aWxsIGJlIG1vZGlmaWVkIGFzIGl0IGlzIHJ1bi4gIEZvciBleGFtcGxlLCBtb3N0CisvLyBnbG9iYWwgb3B0aW1pemF0aW9ucyBzaG91bGQgZGVyaXZlIGZyb20gRnVuY3Rpb25QYXNzLCBiZWNhdXNlIHRoZXkgZG8gbm90IGFkZAorLy8gb3IgZGVsZXRlIGZ1bmN0aW9ucywgdGhleSBvcGVyYXRlIG9uIHRoZSBpbnRlcm5hbHMgb2YgdGhlIGZ1bmN0aW9uLgorLy8KKy8vIE5vdGUgdGhhdCB0aGlzIGZpbGUgI2luY2x1ZGVzIFBhc3NTdXBwb3J0LmggYW5kIFBhc3NBbmFseXNpc1N1cHBvcnQuaCAoYXQgdGhlCisvLyBib3R0b20pLCBzbyB0aGUgQVBJcyBleHBvc2VkIGJ5IHRoZXNlIGZpbGVzIGFyZSBhbHNvIGF1dG9tYXRpY2FsbHkgYXZhaWxhYmxlCisvLyB0byBhbGwgdXNlcnMgb2YgdGhpcyBmaWxlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9QQVNTX0gKKyNkZWZpbmUgTExWTV9QQVNTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBbmFseXNpc1Jlc29sdmVyOworY2xhc3MgQW5hbHlzaXNVc2FnZTsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEltbXV0YWJsZVBhc3M7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBQYXNzSW5mbzsKK2NsYXNzIFBNRGF0YU1hbmFnZXI7CitjbGFzcyBQTVN0YWNrOworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vIEFuYWx5c2lzSUQgLSBVc2UgdGhlIFBhc3NJbmZvIHRvIGlkZW50aWZ5IGEgcGFzcy4uLgordXNpbmcgQW5hbHlzaXNJRCA9IGNvbnN0IHZvaWQgKjsKKworLy8vIERpZmZlcmVudCB0eXBlcyBvZiBpbnRlcm5hbCBwYXNzIG1hbmFnZXJzLiBFeHRlcm5hbCBwYXNzIG1hbmFnZXJzCisvLy8gKFBhc3NNYW5hZ2VyIGFuZCBGdW5jdGlvblBhc3NNYW5hZ2VyKSBhcmUgbm90IHJlcHJlc2VudGVkIGhlcmUuCisvLy8gT3JkZXJpbmcgb2YgcGFzcyBtYW5hZ2VyIHR5cGVzIGlzIGltcG9ydGFudCBoZXJlLgorZW51bSBQYXNzTWFuYWdlclR5cGUgeworICBQTVRfVW5rbm93biA9IDAsCisgIFBNVF9Nb2R1bGVQYXNzTWFuYWdlciA9IDEsIC8vLzwgTVBQYXNzTWFuYWdlcgorICBQTVRfQ2FsbEdyYXBoUGFzc01hbmFnZXIsICAvLy88IENHUGFzc01hbmFnZXIKKyAgUE1UX0Z1bmN0aW9uUGFzc01hbmFnZXIsICAgLy8vPCBGUFBhc3NNYW5hZ2VyCisgIFBNVF9Mb29wUGFzc01hbmFnZXIsICAgICAgIC8vLzwgTFBQYXNzTWFuYWdlcgorICBQTVRfUmVnaW9uUGFzc01hbmFnZXIsICAgICAvLy88IFJHUGFzc01hbmFnZXIKKyAgUE1UX0Jhc2ljQmxvY2tQYXNzTWFuYWdlciwgLy8vPCBCQlBhc3NNYW5hZ2VyCisgIFBNVF9MYXN0Cit9OworCisvLyBEaWZmZXJlbnQgdHlwZXMgb2YgcGFzc2VzLgorZW51bSBQYXNzS2luZCB7CisgIFBUX0Jhc2ljQmxvY2ssCisgIFBUX1JlZ2lvbiwKKyAgUFRfTG9vcCwKKyAgUFRfRnVuY3Rpb24sCisgIFBUX0NhbGxHcmFwaFNDQywKKyAgUFRfTW9kdWxlLAorICBQVF9QYXNzTWFuYWdlcgorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBQYXNzIGludGVyZmFjZSAtIEltcGxlbWVudGVkIGJ5IGFsbCAncGFzc2VzJy4gIFN1YmNsYXNzIHRoaXMgaWYgeW91IGFyZSBhbgorLy8vIGludGVycHJvY2VkdXJhbCBvcHRpbWl6YXRpb24gb3IgeW91IGRvIG5vdCBmaXQgaW50byBhbnkgb2YgdGhlIG1vcmUKKy8vLyBjb25zdHJhaW5lZCBwYXNzZXMgZGVzY3JpYmVkIGJlbG93LgorLy8vCitjbGFzcyBQYXNzIHsKKyAgQW5hbHlzaXNSZXNvbHZlciAqUmVzb2x2ZXIgPSBudWxscHRyOyAgLy8gVXNlZCB0byByZXNvbHZlIGFuYWx5c2lzCisgIGNvbnN0IHZvaWQgKlBhc3NJRDsKKyAgUGFzc0tpbmQgS2luZDsKKworcHVibGljOgorICBleHBsaWNpdCBQYXNzKFBhc3NLaW5kIEssIGNoYXIgJnBpZCkgOiBQYXNzSUQoJnBpZCksIEtpbmQoSykge30KKyAgUGFzcyhjb25zdCBQYXNzICYpID0gZGVsZXRlOworICBQYXNzICZvcGVyYXRvcj0oY29uc3QgUGFzcyAmKSA9IGRlbGV0ZTsKKyAgdmlydHVhbCB+UGFzcygpOworCisgIFBhc3NLaW5kIGdldFBhc3NLaW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQorCisgIC8vLyBnZXRQYXNzTmFtZSAtIFJldHVybiBhIG5pY2UgY2xlYW4gbmFtZSBmb3IgYSBwYXNzLiAgVGhpcyB1c3VhbGx5CisgIC8vLyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB0aGUgbmFtZSB0aGF0IGlzIHJlZ2lzdGVyZWQgYnkgb25lIG9mIHRoZQorICAvLy8gUmVnaXN0cmF0aW9uIHRlbXBsYXRlcywgYnV0IGNhbiBiZSBvdmVybG9hZGVkIGRpcmVjdGx5LgorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXRQYXNzTmFtZSgpIGNvbnN0OworCisgIC8vLyBnZXRQYXNzSUQgLSBSZXR1cm4gdGhlIFBhc3NJRCBudW1iZXIgdGhhdCBjb3JyZXNwb25kcyB0byB0aGlzIHBhc3MuCisgIEFuYWx5c2lzSUQgZ2V0UGFzc0lEKCkgY29uc3QgeworICAgIHJldHVybiBQYXNzSUQ7CisgIH0KKworICAvLy8gZG9Jbml0aWFsaXphdGlvbiAtIFZpcnR1YWwgbWV0aG9kIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB0byBkbworICAvLy8gYW55IG5lY2Vzc2FyeSBpbml0aWFsaXphdGlvbiBiZWZvcmUgYW55IHBhc3MgaXMgcnVuLgorICB2aXJ0dWFsIGJvb2wgZG9Jbml0aWFsaXphdGlvbihNb2R1bGUgJikgIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIGRvRmluYWxpemF0aW9uIC0gVmlydHVhbCBtZXRob2Qgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzZXMgdG8gZG8gYW55CisgIC8vLyBuZWNlc3NhcnkgY2xlYW4gdXAgYWZ0ZXIgYWxsIHBhc3NlcyBoYXZlIHJ1bi4KKyAgdmlydHVhbCBib29sIGRvRmluYWxpemF0aW9uKE1vZHVsZSAmKSB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vLyBwcmludCAtIFByaW50IG91dCB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhlIHBhc3MuICBUaGlzIGlzIGNhbGxlZCBieQorICAvLy8gQW5hbHl6ZSB0byBwcmludCBvdXQgdGhlIGNvbnRlbnRzIG9mIGFuIGFuYWx5c2lzLiAgT3RoZXJ3aXNlIGl0IGlzIG5vdAorICAvLy8gbmVjZXNzYXJ5IHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZC4gIEJld2FyZSB0aGF0IHRoZSBtb2R1bGUgcG9pbnRlciBNQVkgYmUKKyAgLy8vIG51bGwuICBUaGlzIGF1dG9tYXRpY2FsbHkgZm9yd2FyZHMgdG8gYSB2aXJ0dWFsIGZ1bmN0aW9uIHRoYXQgZG9lcyBub3QKKyAgLy8vIHByb3ZpZGUgdGhlIE1vZHVsZSogaW4gY2FzZSB0aGUgYW5hbHlzaXMgZG9lc24ndCBuZWVkIGl0IGl0IGNhbiBqdXN0IGJlCisgIC8vLyBpZ25vcmVkLgorICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TLCBjb25zdCBNb2R1bGUgKk0pIGNvbnN0OworCisgIHZvaWQgZHVtcCgpIGNvbnN0OyAvLyBkdW1wIC0gUHJpbnQgdG8gc3RkZXJyLgorCisgIC8vLyBjcmVhdGVQcmludGVyUGFzcyAtIEdldCBhIFBhc3MgYXBwcm9wcmlhdGUgdG8gcHJpbnQgdGhlIElSIHRoaXMKKyAgLy8vIHBhc3Mgb3BlcmF0ZXMgb24gKE1vZHVsZSwgRnVuY3Rpb24gb3IgTWFjaGluZUZ1bmN0aW9uKS4KKyAgdmlydHVhbCBQYXNzICpjcmVhdGVQcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkJhbm5lcikgY29uc3QgPSAwOworCisgIC8vLyBFYWNoIHBhc3MgaXMgcmVzcG9uc2libGUgZm9yIGFzc2lnbmluZyBhIHBhc3MgbWFuYWdlciB0byBpdHNlbGYuCisgIC8vLyBQTVMgaXMgdGhlIHN0YWNrIG9mIGF2YWlsYWJsZSBwYXNzIG1hbmFnZXIuCisgIHZpcnR1YWwgdm9pZCBhc3NpZ25QYXNzTWFuYWdlcihQTVN0YWNrICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXNzTWFuYWdlclR5cGUpIHt9CisKKyAgLy8vIENoZWNrIGlmIGF2YWlsYWJsZSBwYXNzIG1hbmFnZXJzIGFyZSBzdWl0YWJsZSBmb3IgdGhpcyBwYXNzIG9yIG5vdC4KKyAgdmlydHVhbCB2b2lkIHByZXBhcmVQYXNzTWFuYWdlcihQTVN0YWNrICYpOworCisgIC8vLyAgUmV0dXJuIHdoYXQga2luZCBvZiBQYXNzIE1hbmFnZXIgY2FuIG1hbmFnZSB0aGlzIHBhc3MuCisgIHZpcnR1YWwgUGFzc01hbmFnZXJUeXBlIGdldFBvdGVudGlhbFBhc3NNYW5hZ2VyVHlwZSgpIGNvbnN0OworCisgIC8vIEFjY2VzcyBBbmFseXNpc1Jlc29sdmVyCisgIHZvaWQgc2V0UmVzb2x2ZXIoQW5hbHlzaXNSZXNvbHZlciAqQVIpOworICBBbmFseXNpc1Jlc29sdmVyICpnZXRSZXNvbHZlcigpIGNvbnN0IHsgcmV0dXJuIFJlc29sdmVyOyB9CisKKyAgLy8vIGdldEFuYWx5c2lzVXNhZ2UgLSBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvdmVycmlkZW4gYnkgcGFzc2VzIHRoYXQgbmVlZAorICAvLy8gYW5hbHlzaXMgaW5mb3JtYXRpb24gdG8gZG8gdGhlaXIgam9iLiAgSWYgYSBwYXNzIHNwZWNpZmllcyB0aGF0IGl0IHVzZXMgYQorICAvLy8gcGFydGljdWxhciBhbmFseXNpcyByZXN1bHQgdG8gdGhpcyBmdW5jdGlvbiwgaXQgY2FuIHRoZW4gdXNlIHRoZQorICAvLy8gZ2V0QW5hbHlzaXM8QW5hbHlzaXNUeXBlPigpIGZ1bmN0aW9uLCBiZWxvdy4KKyAgdmlydHVhbCB2b2lkIGdldEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmKSBjb25zdDsKKworICAvLy8gcmVsZWFzZU1lbW9yeSgpIC0gVGhpcyBtZW1iZXIgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGEgcGFzcyBpZiBpdCB3YW50cyB0bworICAvLy8gYmUgYWJsZSB0byByZWxlYXNlIGl0cyBtZW1vcnkgd2hlbiBpdCBpcyBubyBsb25nZXIgbmVlZGVkLiAgVGhlIGRlZmF1bHQKKyAgLy8vIGJlaGF2aW9yIG9mIHBhc3NlcyBpcyB0byBob2xkIG9udG8gbWVtb3J5IGZvciB0aGUgZW50aXJlIGR1cmF0aW9uIG9mIHRoZWlyCisgIC8vLyBsaWZldGltZSAod2hpY2ggaXMgdGhlIGVudGlyZSBjb21waWxlIHRpbWUpLiAgRm9yIHBpcGVsaW5lZCBwYXNzZXMsIHRoaXMKKyAgLy8vIGlzIG5vdCBhIGJpZyBkZWFsIGJlY2F1c2UgdGhhdCBtZW1vcnkgZ2V0cyByZWN5Y2xlZCBldmVyeSB0aW1lIHRoZSBwYXNzIGlzCisgIC8vLyBpbnZva2VkIG9uIGFub3RoZXIgcHJvZ3JhbSB1bml0LiAgRm9yIElQIHBhc3NlcywgaXQgaXMgbW9yZSBpbXBvcnRhbnQgdG8KKyAgLy8vIGZyZWUgbWVtb3J5IHdoZW4gaXQgaXMgdW51c2VkLgorICAvLy8KKyAgLy8vIE9wdGlvbmFsbHkgaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24gdG8gcmVsZWFzZSBwYXNzIG1lbW9yeSB3aGVuIGl0IGlzIG5vCisgIC8vLyBsb25nZXIgdXNlZC4KKyAgdmlydHVhbCB2b2lkIHJlbGVhc2VNZW1vcnkoKTsKKworICAvLy8gZ2V0QWRqdXN0ZWRBbmFseXNpc1BvaW50ZXIgLSBUaGlzIG1ldGhvZCBpcyB1c2VkIHdoZW4gYSBwYXNzIGltcGxlbWVudHMKKyAgLy8vIGFuIGFuYWx5c2lzIGludGVyZmFjZSB0aHJvdWdoIG11bHRpcGxlIGluaGVyaXRhbmNlLiAgSWYgbmVlZGVkLCBpdCBzaG91bGQKKyAgLy8vIG92ZXJyaWRlIHRoaXMgdG8gYWRqdXN0IHRoZSB0aGlzIHBvaW50ZXIgYXMgbmVlZGVkIGZvciB0aGUgc3BlY2lmaWVkIHBhc3MKKyAgLy8vIGluZm8uCisgIHZpcnR1YWwgdm9pZCAqZ2V0QWRqdXN0ZWRBbmFseXNpc1BvaW50ZXIoQW5hbHlzaXNJRCBJRCk7CisgIHZpcnR1YWwgSW1tdXRhYmxlUGFzcyAqZ2V0QXNJbW11dGFibGVQYXNzKCk7CisgIHZpcnR1YWwgUE1EYXRhTWFuYWdlciAqZ2V0QXNQTURhdGFNYW5hZ2VyKCk7CisKKyAgLy8vIHZlcmlmeUFuYWx5c2lzKCkgLSBUaGlzIG1lbWJlciBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgYSBhbmFseXNpcyBwYXNzIHRvCisgIC8vLyBjaGVjayBzdGF0ZSBvZiBhbmFseXNpcyBpbmZvcm1hdGlvbi4KKyAgdmlydHVhbCB2b2lkIHZlcmlmeUFuYWx5c2lzKCkgY29uc3Q7CisKKyAgLy8gZHVtcFBhc3NTdHJ1Y3R1cmUgLSBJbXBsZW1lbnQgdGhlIC1kZWJ1Zy1wYXNzZXM9UGFzc1N0cnVjdHVyZSBvcHRpb24KKyAgdmlydHVhbCB2b2lkIGR1bXBQYXNzU3RydWN0dXJlKHVuc2lnbmVkIE9mZnNldCA9IDApOworCisgIC8vIGxvb2t1cFBhc3NJbmZvIC0gUmV0dXJuIHRoZSBwYXNzIGluZm8gb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIHBhc3MgY2xhc3MsCisgIC8vIG9yIG51bGwgaWYgaXQgaXMgbm90IGtub3duLgorICBzdGF0aWMgY29uc3QgUGFzc0luZm8gKmxvb2t1cFBhc3NJbmZvKGNvbnN0IHZvaWQgKlRJKTsKKworICAvLyBsb29rdXBQYXNzSW5mbyAtIFJldHVybiB0aGUgcGFzcyBpbmZvIG9iamVjdCBmb3IgdGhlIHBhc3Mgd2l0aCB0aGUgZ2l2ZW4KKyAgLy8gYXJndW1lbnQgc3RyaW5nLCBvciBudWxsIGlmIGl0IGlzIG5vdCBrbm93bi4KKyAgc3RhdGljIGNvbnN0IFBhc3NJbmZvICpsb29rdXBQYXNzSW5mbyhTdHJpbmdSZWYgQXJnKTsKKworICAvLyBjcmVhdGVQYXNzIC0gQ3JlYXRlIGEgb2JqZWN0IGZvciB0aGUgc3BlY2lmaWVkIHBhc3MgY2xhc3MsCisgIC8vIG9yIG51bGwgaWYgaXQgaXMgbm90IGtub3duLgorICBzdGF0aWMgUGFzcyAqY3JlYXRlUGFzcyhBbmFseXNpc0lEIElEKTsKKworICAvLy8gZ2V0QW5hbHlzaXNJZkF2YWlsYWJsZTxBbmFseXNpc1R5cGU+KCkgLSBTdWJjbGFzc2VzIHVzZSB0aGlzIGZ1bmN0aW9uIHRvCisgIC8vLyBnZXQgYW5hbHlzaXMgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBiZSBhcm91bmQsIGZvciBleGFtcGxlIHRvIHVwZGF0ZSBpdC4KKyAgLy8vIFRoaXMgaXMgZGlmZmVyZW50IHRoYW4gZ2V0QW5hbHlzaXMgaW4gdGhhdCBpdCBjYW4gZmFpbCAoaWYgdGhlIGFuYWx5c2lzCisgIC8vLyByZXN1bHRzIGhhdmVuJ3QgYmVlbiBjb21wdXRlZCksIHNvIHNob3VsZCBvbmx5IGJlIHVzZWQgaWYgeW91IGNhbiBoYW5kbGUKKyAgLy8vIHRoZSBjYXNlIHdoZW4gdGhlIGFuYWx5c2lzIGlzIG5vdCBhdmFpbGFibGUuICBUaGlzIG1ldGhvZCBpcyBvZnRlbiB1c2VkIGJ5CisgIC8vLyB0cmFuc2Zvcm1hdGlvbiBBUElzIHRvIHVwZGF0ZSBhbmFseXNpcyByZXN1bHRzIGZvciBhIHBhc3MgYXV0b21hdGljYWxseSBhcworICAvLy8gdGhlIHRyYW5zZm9ybSBpcyBwZXJmb3JtZWQuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEFuYWx5c2lzVHlwZT4gQW5hbHlzaXNUeXBlICoKKyAgICBnZXRBbmFseXNpc0lmQXZhaWxhYmxlKCkgY29uc3Q7IC8vIERlZmluZWQgaW4gUGFzc0FuYWx5c2lzU3VwcG9ydC5oCisKKyAgLy8vIG11c3RQcmVzZXJ2ZUFuYWx5c2lzSUQgLSBUaGlzIG1ldGhvZCBzZXJ2ZXMgdGhlIHNhbWUgZnVuY3Rpb24gYXMKKyAgLy8vIGdldEFuYWx5c2lzSWZBdmFpbGFibGUsIGJ1dCB3b3JrcyBpZiB5b3UganVzdCBoYXZlIGFuIEFuYWx5c2lzSUQuICBUaGlzCisgIC8vLyBvYnZpb3VzbHkgY2Fubm90IGdpdmUgeW91IGEgcHJvcGVybHkgdHlwZWQgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIGlmIHlvdQorICAvLy8gZG9uJ3QgaGF2ZSB0aGUgY2xhc3MgbmFtZSBhdmFpbGFibGUgKHVzZSBnZXRBbmFseXNpc0lmQXZhaWxhYmxlIGlmIHlvdQorICAvLy8gZG8pLCBidXQgaXQgY2FuIHRlbGwgeW91IGlmIHlvdSBuZWVkIHRvIHByZXNlcnZlIHRoZSBwYXNzIGF0IGxlYXN0LgorICBib29sIG11c3RQcmVzZXJ2ZUFuYWx5c2lzSUQoY2hhciAmQUlEKSBjb25zdDsKKworICAvLy8gZ2V0QW5hbHlzaXM8QW5hbHlzaXNUeXBlPigpIC0gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHN1YmNsYXNzZXMgdG8gZ2V0CisgIC8vLyB0byB0aGUgYW5hbHlzaXMgaW5mb3JtYXRpb24gdGhhdCB0aGV5IGNsYWltIHRvIHVzZSBieSBvdmVycmlkaW5nIHRoZQorICAvLy8gZ2V0QW5hbHlzaXNVc2FnZSBmdW5jdGlvbi4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgQW5hbHlzaXNUeXBlPgorICBBbmFseXNpc1R5cGUgJmdldEFuYWx5c2lzKCkgY29uc3Q7IC8vIERlZmluZWQgaW4gUGFzc0FuYWx5c2lzU3VwcG9ydC5oCisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgQW5hbHlzaXNUeXBlPgorICBBbmFseXNpc1R5cGUgJmdldEFuYWx5c2lzKEZ1bmN0aW9uICZGKTsgLy8gRGVmaW5lZCBpbiBQYXNzQW5hbHlzaXNTdXBwb3J0LmgKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbmFseXNpc1R5cGU+CisgIEFuYWx5c2lzVHlwZSAmZ2V0QW5hbHlzaXNJRChBbmFseXNpc0lEIFBJKSBjb25zdDsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBBbmFseXNpc1R5cGU+CisgIEFuYWx5c2lzVHlwZSAmZ2V0QW5hbHlzaXNJRChBbmFseXNpc0lEIFBJLCBGdW5jdGlvbiAmRik7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIE1vZHVsZVBhc3MgY2xhc3MgLSBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gaW1wbGVtZW50IHVuc3RydWN0dXJlZAorLy8vIGludGVycHJvY2VkdXJhbCBvcHRpbWl6YXRpb25zIGFuZCBhbmFseXNlcy4gIE1vZHVsZVBhc3NlcyBtYXkgZG8gYW55dGhpbmcKKy8vLyB0aGV5IHdhbnQgdG8gdGhlIHByb2dyYW0uCisvLy8KK2NsYXNzIE1vZHVsZVBhc3MgOiBwdWJsaWMgUGFzcyB7CitwdWJsaWM6CisgIGV4cGxpY2l0IE1vZHVsZVBhc3MoY2hhciAmcGlkKSA6IFBhc3MoUFRfTW9kdWxlLCBwaWQpIHt9CisKKyAgLy8gRm9yY2Ugb3V0LW9mLWxpbmUgdmlydHVhbCBtZXRob2QuCisgIH5Nb2R1bGVQYXNzKCkgb3ZlcnJpZGU7CisKKyAgLy8vIGNyZWF0ZVByaW50ZXJQYXNzIC0gR2V0IGEgbW9kdWxlIHByaW50ZXIgcGFzcy4KKyAgUGFzcyAqY3JlYXRlUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmQmFubmVyKSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gcnVuT25Nb2R1bGUgLSBWaXJ0dWFsIG1ldGhvZCBvdmVycmlkZW4gYnkgc3ViY2xhc3NlcyB0byBwcm9jZXNzIHRoZSBtb2R1bGUKKyAgLy8vIGJlaW5nIG9wZXJhdGVkIG9uLgorICB2aXJ0dWFsIGJvb2wgcnVuT25Nb2R1bGUoTW9kdWxlICZNKSA9IDA7CisKKyAgdm9pZCBhc3NpZ25QYXNzTWFuYWdlcihQTVN0YWNrICZQTVMsIFBhc3NNYW5hZ2VyVHlwZSBUKSBvdmVycmlkZTsKKworICAvLy8gIFJldHVybiB3aGF0IGtpbmQgb2YgUGFzcyBNYW5hZ2VyIGNhbiBtYW5hZ2UgdGhpcyBwYXNzLgorICBQYXNzTWFuYWdlclR5cGUgZ2V0UG90ZW50aWFsUGFzc01hbmFnZXJUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgLy8vIE9wdGlvbmFsIHBhc3NlcyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gY2hlY2sgd2hldGhlciB0aGUgcGFzcyBzaG91bGQgYmUKKyAgLy8vIHNraXBwZWQuIFRoaXMgaXMgdGhlIGNhc2Ugd2hlbiBvcHRpbWl6YXRpb24gYmlzZWN0IGlzIG92ZXIgdGhlIGxpbWl0LgorICBib29sIHNraXBNb2R1bGUoTW9kdWxlICZNKSBjb25zdDsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gSW1tdXRhYmxlUGFzcyBjbGFzcyAtIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBwcm92aWRlIGluZm9ybWF0aW9uIHRoYXQgZG9lcworLy8vIG5vdCBuZWVkIHRvIGJlIHJ1bi4gIFRoaXMgaXMgdXNlZnVsIGZvciB0aGluZ3MgbGlrZSB0YXJnZXQgaW5mb3JtYXRpb24gYW5kCisvLy8gImJhc2ljIiB2ZXJzaW9ucyBvZiBBbmFseXNpc0dyb3Vwcy4KKy8vLworY2xhc3MgSW1tdXRhYmxlUGFzcyA6IHB1YmxpYyBNb2R1bGVQYXNzIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgSW1tdXRhYmxlUGFzcyhjaGFyICZwaWQpIDogTW9kdWxlUGFzcyhwaWQpIHt9CisKKyAgLy8gRm9yY2Ugb3V0LW9mLWxpbmUgdmlydHVhbCBtZXRob2QuCisgIH5JbW11dGFibGVQYXNzKCkgb3ZlcnJpZGU7CisKKyAgLy8vIGluaXRpYWxpemVQYXNzIC0gVGhpcyBtZXRob2QgbWF5IGJlIG92ZXJyaWRlbiBieSBpbW11dGFibGUgcGFzc2VzIHRvIGFsbG93CisgIC8vLyB0aGVtIHRvIHBlcmZvcm0gdmFyaW91cyBpbml0aWFsaXphdGlvbiBhY3Rpb25zIHRoZXkgcmVxdWlyZS4gIFRoaXMgaXMKKyAgLy8vIHByaW1hcmlseSBiZWNhdXNlIGFuIEltbXV0YWJsZVBhc3MgY2FuICJyZXF1aXJlIiBhbm90aGVyIEltbXV0YWJsZVBhc3MsCisgIC8vLyBhbmQgaWYgaXQgZG9lcywgdGhlIG92ZXJsb2FkZWQgdmVyc2lvbiBvZiBpbml0aWFsaXplUGFzcyBtYXkgZ2V0IGFjY2VzcyB0bworICAvLy8gdGhlc2UgcGFzc2VzIHdpdGggZ2V0QW5hbHlzaXM8Pi4KKyAgdmlydHVhbCB2b2lkIGluaXRpYWxpemVQYXNzKCk7CisKKyAgSW1tdXRhYmxlUGFzcyAqZ2V0QXNJbW11dGFibGVQYXNzKCkgb3ZlcnJpZGUgeyByZXR1cm4gdGhpczsgfQorCisgIC8vLyBJbW11dGFibGVQYXNzZXMgYXJlIG5ldmVyIHJ1bi4KKyAgYm9vbCBydW5Pbk1vZHVsZShNb2R1bGUgJikgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gRnVuY3Rpb25QYXNzIGNsYXNzIC0gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGltcGxlbWVudCBtb3N0IGdsb2JhbAorLy8vIG9wdGltaXphdGlvbnMuICBPcHRpbWl6YXRpb25zIHNob3VsZCBzdWJjbGFzcyB0aGlzIGNsYXNzIGlmIHRoZXkgbWVldCB0aGUKKy8vLyBmb2xsb3dpbmcgY29uc3RyYWludHM6CisvLy8KKy8vLyAgMS4gT3B0aW1pemF0aW9ucyBhcmUgb3JnYW5pemVkIGdsb2JhbGx5LCBpLmUuLCBhIGZ1bmN0aW9uIGF0IGEgdGltZQorLy8vICAyLiBPcHRpbWl6aW5nIGEgZnVuY3Rpb24gZG9lcyBub3QgY2F1c2UgdGhlIGFkZGl0aW9uIG9yIHJlbW92YWwgb2YgYW55CisvLy8gICAgIGZ1bmN0aW9ucyBpbiB0aGUgbW9kdWxlCisvLy8KK2NsYXNzIEZ1bmN0aW9uUGFzcyA6IHB1YmxpYyBQYXNzIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgRnVuY3Rpb25QYXNzKGNoYXIgJnBpZCkgOiBQYXNzKFBUX0Z1bmN0aW9uLCBwaWQpIHt9CisKKyAgLy8vIGNyZWF0ZVByaW50ZXJQYXNzIC0gR2V0IGEgZnVuY3Rpb24gcHJpbnRlciBwYXNzLgorICBQYXNzICpjcmVhdGVQcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZCYW5uZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vLyBydW5PbkZ1bmN0aW9uIC0gVmlydHVhbCBtZXRob2Qgb3ZlcnJpZGVuIGJ5IHN1YmNsYXNzZXMgdG8gZG8gdGhlCisgIC8vLyBwZXItZnVuY3Rpb24gcHJvY2Vzc2luZyBvZiB0aGUgcGFzcy4KKyAgdmlydHVhbCBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpID0gMDsKKworICB2b2lkIGFzc2lnblBhc3NNYW5hZ2VyKFBNU3RhY2sgJlBNUywgUGFzc01hbmFnZXJUeXBlIFQpIG92ZXJyaWRlOworCisgIC8vLyAgUmV0dXJuIHdoYXQga2luZCBvZiBQYXNzIE1hbmFnZXIgY2FuIG1hbmFnZSB0aGlzIHBhc3MuCisgIFBhc3NNYW5hZ2VyVHlwZSBnZXRQb3RlbnRpYWxQYXNzTWFuYWdlclR5cGUoKSBjb25zdCBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICAvLy8gT3B0aW9uYWwgcGFzc2VzIGNhbGwgdGhpcyBmdW5jdGlvbiB0byBjaGVjayB3aGV0aGVyIHRoZSBwYXNzIHNob3VsZCBiZQorICAvLy8gc2tpcHBlZC4gVGhpcyBpcyB0aGUgY2FzZSB3aGVuIEF0dHJpYnV0ZTo6T3B0aW1pemVOb25lIGlzIHNldCBvciB3aGVuCisgIC8vLyBvcHRpbWl6YXRpb24gYmlzZWN0IGlzIG92ZXIgdGhlIGxpbWl0LgorICBib29sIHNraXBGdW5jdGlvbihjb25zdCBGdW5jdGlvbiAmRikgY29uc3Q7Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIEJhc2ljQmxvY2tQYXNzIGNsYXNzIC0gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIGltcGxlbWVudCBtb3N0IGxvY2FsCisvLy8gb3B0aW1pemF0aW9ucy4gIE9wdGltaXphdGlvbnMgc2hvdWxkIHN1YmNsYXNzIHRoaXMgY2xhc3MgaWYgdGhleQorLy8vIG1lZXQgdGhlIGZvbGxvd2luZyBjb25zdHJhaW50czoKKy8vLyAgIDEuIE9wdGltaXphdGlvbnMgYXJlIGxvY2FsLCBvcGVyYXRpbmcgb24gZWl0aGVyIGEgYmFzaWMgYmxvY2sgb3IKKy8vLyAgICAgIGluc3RydWN0aW9uIGF0IGEgdGltZS4KKy8vLyAgIDIuIE9wdGltaXphdGlvbnMgZG8gbm90IG1vZGlmeSB0aGUgQ0ZHIG9mIHRoZSBjb250YWluZWQgZnVuY3Rpb24sIG9yIGFueQorLy8vICAgICAgb3RoZXIgYmFzaWMgYmxvY2sgaW4gdGhlIGZ1bmN0aW9uLgorLy8vICAgMy4gT3B0aW1pemF0aW9ucyBjb25mb3JtIHRvIGFsbCBvZiB0aGUgY29uc3RyYWludHMgb2YgRnVuY3Rpb25QYXNzZXMuCisvLy8KK2NsYXNzIEJhc2ljQmxvY2tQYXNzIDogcHVibGljIFBhc3MgeworcHVibGljOgorICBleHBsaWNpdCBCYXNpY0Jsb2NrUGFzcyhjaGFyICZwaWQpIDogUGFzcyhQVF9CYXNpY0Jsb2NrLCBwaWQpIHt9CisKKyAgLy8vIGNyZWF0ZVByaW50ZXJQYXNzIC0gR2V0IGEgYmFzaWMgYmxvY2sgcHJpbnRlciBwYXNzLgorICBQYXNzICpjcmVhdGVQcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nICZCYW5uZXIpIGNvbnN0IG92ZXJyaWRlOworCisgIHVzaW5nIGxsdm06OlBhc3M6OmRvSW5pdGlhbGl6YXRpb247CisgIHVzaW5nIGxsdm06OlBhc3M6OmRvRmluYWxpemF0aW9uOworCisgIC8vLyBkb0luaXRpYWxpemF0aW9uIC0gVmlydHVhbCBtZXRob2Qgb3ZlcnJpZGRlbiBieSBCYXNpY0Jsb2NrUGFzcyBzdWJjbGFzc2VzCisgIC8vLyB0byBkbyBhbnkgbmVjZXNzYXJ5IHBlci1mdW5jdGlvbiBpbml0aWFsaXphdGlvbi4KKyAgdmlydHVhbCBib29sIGRvSW5pdGlhbGl6YXRpb24oRnVuY3Rpb24gJik7CisKKyAgLy8vIHJ1bk9uQmFzaWNCbG9jayAtIFZpcnR1YWwgbWV0aG9kIG92ZXJyaWRlbiBieSBzdWJjbGFzc2VzIHRvIGRvIHRoZQorICAvLy8gcGVyLWJhc2ljYmxvY2sgcHJvY2Vzc2luZyBvZiB0aGUgcGFzcy4KKyAgdmlydHVhbCBib29sIHJ1bk9uQmFzaWNCbG9jayhCYXNpY0Jsb2NrICZCQikgPSAwOworCisgIC8vLyBkb0ZpbmFsaXphdGlvbiAtIFZpcnR1YWwgbWV0aG9kIG92ZXJyaWRlbiBieSBCYXNpY0Jsb2NrUGFzcyBzdWJjbGFzc2VzIHRvCisgIC8vLyBkbyBhbnkgcG9zdCBwcm9jZXNzaW5nIG5lZWRlZCBhZnRlciBhbGwgcGFzc2VzIGhhdmUgcnVuLgorICB2aXJ0dWFsIGJvb2wgZG9GaW5hbGl6YXRpb24oRnVuY3Rpb24gJik7CisKKyAgdm9pZCBhc3NpZ25QYXNzTWFuYWdlcihQTVN0YWNrICZQTVMsIFBhc3NNYW5hZ2VyVHlwZSBUKSBvdmVycmlkZTsKKworICAvLy8gIFJldHVybiB3aGF0IGtpbmQgb2YgUGFzcyBNYW5hZ2VyIGNhbiBtYW5hZ2UgdGhpcyBwYXNzLgorICBQYXNzTWFuYWdlclR5cGUgZ2V0UG90ZW50aWFsUGFzc01hbmFnZXJUeXBlKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgLy8vIE9wdGlvbmFsIHBhc3NlcyBjYWxsIHRoaXMgZnVuY3Rpb24gdG8gY2hlY2sgd2hldGhlciB0aGUgcGFzcyBzaG91bGQgYmUKKyAgLy8vIHNraXBwZWQuIFRoaXMgaXMgdGhlIGNhc2Ugd2hlbiBBdHRyaWJ1dGU6Ok9wdGltaXplTm9uZSBpcyBzZXQgb3Igd2hlbgorICAvLy8gb3B0aW1pemF0aW9uIGJpc2VjdCBpcyBvdmVyIHRoZSBsaW1pdC4KKyAgYm9vbCBza2lwQmFzaWNCbG9jayhjb25zdCBCYXNpY0Jsb2NrICZCQikgY29uc3Q7Cit9OworCisvLy8gSWYgdGhlIHVzZXIgc3BlY2lmaWVzIHRoZSAtdGltZS1wYXNzZXMgYXJndW1lbnQgb24gYW4gTExWTSB0b29sIGNvbW1hbmQgbGluZQorLy8vIHRoZW4gdGhlIHZhbHVlIG9mIHRoaXMgYm9vbGVhbiB3aWxsIGJlIHRydWUsIG90aGVyd2lzZSBmYWxzZS4KKy8vLyBAYnJpZWYgVGhpcyBpcyB0aGUgc3RvcmFnZSBmb3IgdGhlIC10aW1lLXBhc3NlcyBvcHRpb24uCitleHRlcm4gYm9vbCBUaW1lUGFzc2VzSXNFbmFibGVkOworCisvLy8gaXNGdW5jdGlvbkluUHJpbnRMaXN0IC0gcmV0dXJucyB0cnVlIGlmIGEgZnVuY3Rpb24gc2hvdWxkIGJlIHByaW50ZWQgdmlhCisvLyAgZGVidWdnaW5nIG9wdGlvbnMgbGlrZSAtcHJpbnQtYWZ0ZXItYWxsLy1wcmludC1iZWZvcmUtYWxsLgorLy8gIEBicmllZiBUZWxscyBpZiB0aGUgZnVuY3Rpb24gSVIgc2hvdWxkIGJlIHByaW50ZWQgYnkgUHJpbnRlclBhc3MuCitleHRlcm4gYm9vbCBpc0Z1bmN0aW9uSW5QcmludExpc3QoU3RyaW5nUmVmIEZ1bmN0aW9uTmFtZSk7CisKKy8vLyBmb3JjZVByaW50TW9kdWxlSVIgLSByZXR1cm5zIHRydWUgaWYgSVIgcHJpbnRpbmcgcGFzc2VzIHNob3VsZAorLy8gIGJlIHByaW50aW5nIG1vZHVsZSBJUiAoZXZlbiBmb3IgbG9jYWwtcGFzcyBwcmludGVycyBlLmcuIGZ1bmN0aW9uLXBhc3MpCisvLyAgdG8gcHJvdmlkZSBtb3JlIGNvbnRleHQsIGFzIGVuYWJsZWQgYnkgZGVidWdnaW5nIG9wdGlvbiAtcHJpbnQtbW9kdWxlLXNjb3BlCisvLyAgQGJyaWVmIFRlbGxzIGlmIElSIHByaW50ZXIgc2hvdWxkIGJlIHByaW50aW5nIG1vZHVsZSBJUgorZXh0ZXJuIGJvb2wgZm9yY2VQcmludE1vZHVsZUlSKCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKy8vIEluY2x1ZGUgc3VwcG9ydCBmaWxlcyB0aGF0IGNvbnRhaW4gaW1wb3J0YW50IEFQSXMgY29tbW9ubHkgdXNlZCBieSBQYXNzZXMsCisvLyBidXQgdGhhdCB3ZSB3YW50IHRvIHNlcGFyYXRlIG91dCB0byBtYWtlIGl0IGVhc2llciB0byByZWFkIHRoZSBoZWFkZXIgZmlsZXMuCisjaW5jbHVkZSAibGx2bS9Jbml0aWFsaXplUGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzQW5hbHlzaXNTdXBwb3J0LmgiCisjaW5jbHVkZSAibGx2bS9QYXNzU3VwcG9ydC5oIgorCisjZW5kaWYgLy8gTExWTV9QQVNTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUGFzc0FuYWx5c2lzU3VwcG9ydC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9QYXNzQW5hbHlzaXNTdXBwb3J0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE4NzE4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUGFzc0FuYWx5c2lzU3VwcG9ydC5oCkBAIC0wLDAgKzEsMjc0IEBACisvLz09PS0gbGx2bS9QYXNzQW5hbHlzaXNTdXBwb3J0LmggLSBBbmFseXNpcyBQYXNzIFN1cHBvcnQgY29kZSAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHN0dWZmIHRoYXQgaXMgdXNlZCB0byBkZWZpbmUgYW5kICJ1c2UiIEFuYWx5c2lzIFBhc3Nlcy4KKy8vIFRoaXMgZmlsZSBpcyBhdXRvbWF0aWNhbGx5ICNpbmNsdWRlZCBieSBQYXNzLmgsIHNvOgorLy8KKy8vICAgICAgICAgICBOTyAuQ1BQIEZJTEVTIFNIT1VMRCBJTkNMVURFIFRISVMgRklMRSBESVJFQ1RMWQorLy8KKy8vIEluc3RlYWQsICNpbmNsdWRlIFBhc3MuaAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9QQVNTQU5BTFlTSVNTVVBQT1JUX0gKKyNkZWZpbmUgTExWTV9QQVNTQU5BTFlTSVNTVVBQT1JUX0gKKworI2luY2x1ZGUgIlBhc3MuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBQYXNzOworY2xhc3MgUE1EYXRhTWFuYWdlcjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBSZXByZXNlbnQgdGhlIGFuYWx5c2lzIHVzYWdlIGluZm9ybWF0aW9uIG9mIGEgcGFzcy4gIFRoaXMgdHJhY2tzIGFuYWx5c2VzCisvLy8gdGhhdCB0aGUgcGFzcyBSRVFVSVJFUyAobXVzdCBiZSBhdmFpbGFibGUgd2hlbiB0aGUgcGFzcyBydW5zKSwgUkVRVUlSRVMKKy8vLyBUUkFOU0lUSVZFIChtdXN0IGJlIGF2YWlsYWJsZSB0aHJvdWdob3V0IHRoZSBsaWZldGltZSBvZiB0aGUgcGFzcyksIGFuZAorLy8vIGFuYWx5c2VzIHRoYXQgdGhlIHBhc3MgUFJFU0VSVkVTICh0aGUgcGFzcyBkb2VzIG5vdCBpbnZhbGlkYXRlIHRoZSByZXN1bHRzCisvLy8gb2YgdGhlc2UgYW5hbHlzZXMpLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBwcm92aWRlZCBieSBhIHBhc3MgdG8gdGhlIFBhc3MKKy8vLyBpbmZyYXN0cnVjdHVyZSB0aHJvdWdoIHRoZSBnZXRBbmFseXNpc1VzYWdlIHZpcnR1YWwgZnVuY3Rpb24uCisvLy8KK2NsYXNzIEFuYWx5c2lzVXNhZ2UgeworcHVibGljOgorICB1c2luZyBWZWN0b3JUeXBlID0gU21hbGxWZWN0b3JJbXBsPEFuYWx5c2lzSUQ+OworCitwcml2YXRlOgorICAvLy8gU2V0cyBvZiBhbmFseXNlcyByZXF1aXJlZCBhbmQgcHJlc2VydmVkIGJ5IGEgcGFzcworICAvLyBUT0RPOiBJdCdzIG5vdCBjbGVhciB0aGF0IFNtYWxsVmVjdG9yIGlzIGFuIGFwcHJvcHJpYXRlIGRhdGEgc3RydWN0dXJlIGZvcgorICAvLyB0aGlzIHVzZWNhc2UuICBUaGUgc2l6ZXMgd2VyZSBwaWNrZWQgdG8gbWluaW1pemUgd2FzdGVkIHNwYWNlLCBidXQgYXJlCisgIC8vIG90aGVyd2lzZSBmYWlybHkgbWVhbmluZ2xlc3MuCisgIFNtYWxsVmVjdG9yPEFuYWx5c2lzSUQsIDg+IFJlcXVpcmVkOworICBTbWFsbFZlY3RvcjxBbmFseXNpc0lELCAyPiBSZXF1aXJlZFRyYW5zaXRpdmU7CisgIFNtYWxsVmVjdG9yPEFuYWx5c2lzSUQsIDI+IFByZXNlcnZlZDsKKyAgU21hbGxWZWN0b3I8QW5hbHlzaXNJRCwgMD4gVXNlZDsKKyAgYm9vbCBQcmVzZXJ2ZXNBbGwgPSBmYWxzZTsKKworcHVibGljOgorICBBbmFseXNpc1VzYWdlKCkgPSBkZWZhdWx0OworCisgIC8vL0B7CisgIC8vLyBBZGQgdGhlIHNwZWNpZmllZCBJRCB0byB0aGUgcmVxdWlyZWQgc2V0IG9mIHRoZSB1c2FnZSBpbmZvIGZvciBhIHBhc3MuCisgIEFuYWx5c2lzVXNhZ2UgJmFkZFJlcXVpcmVkSUQoY29uc3Qgdm9pZCAqSUQpOworICBBbmFseXNpc1VzYWdlICZhZGRSZXF1aXJlZElEKGNoYXIgJklEKTsKKyAgdGVtcGxhdGU8Y2xhc3MgUGFzc0NsYXNzPgorICBBbmFseXNpc1VzYWdlICZhZGRSZXF1aXJlZCgpIHsKKyAgICByZXR1cm4gYWRkUmVxdWlyZWRJRChQYXNzQ2xhc3M6OklEKTsKKyAgfQorCisgIEFuYWx5c2lzVXNhZ2UgJmFkZFJlcXVpcmVkVHJhbnNpdGl2ZUlEKGNoYXIgJklEKTsKKyAgdGVtcGxhdGU8Y2xhc3MgUGFzc0NsYXNzPgorICBBbmFseXNpc1VzYWdlICZhZGRSZXF1aXJlZFRyYW5zaXRpdmUoKSB7CisgICAgcmV0dXJuIGFkZFJlcXVpcmVkVHJhbnNpdGl2ZUlEKFBhc3NDbGFzczo6SUQpOworICB9CisgIC8vL0B9CisKKyAgLy8vQHsKKyAgLy8vIEFkZCB0aGUgc3BlY2lmaWVkIElEIHRvIHRoZSBzZXQgb2YgYW5hbHlzZXMgcHJlc2VydmVkIGJ5IHRoaXMgcGFzcy4KKyAgQW5hbHlzaXNVc2FnZSAmYWRkUHJlc2VydmVkSUQoY29uc3Qgdm9pZCAqSUQpIHsKKyAgICBQcmVzZXJ2ZWQucHVzaF9iYWNrKElEKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgQW5hbHlzaXNVc2FnZSAmYWRkUHJlc2VydmVkSUQoY2hhciAmSUQpIHsKKyAgICBQcmVzZXJ2ZWQucHVzaF9iYWNrKCZJRCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIC8vLyBBZGQgdGhlIHNwZWNpZmllZCBQYXNzIGNsYXNzIHRvIHRoZSBzZXQgb2YgYW5hbHlzZXMgcHJlc2VydmVkIGJ5IHRoaXMgcGFzcy4KKyAgdGVtcGxhdGU8Y2xhc3MgUGFzc0NsYXNzPgorICBBbmFseXNpc1VzYWdlICZhZGRQcmVzZXJ2ZWQoKSB7CisgICAgUHJlc2VydmVkLnB1c2hfYmFjaygmUGFzc0NsYXNzOjpJRCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIC8vL0B9CisKKyAgLy8vQHsKKyAgLy8vIEFkZCB0aGUgc3BlY2lmaWVkIElEIHRvIHRoZSBzZXQgb2YgYW5hbHlzZXMgdXNlZCBieSB0aGlzIHBhc3MgaWYgdGhleSBhcmUKKyAgLy8vIGF2YWlsYWJsZS4uCisgIEFuYWx5c2lzVXNhZ2UgJmFkZFVzZWRJZkF2YWlsYWJsZUlEKGNvbnN0IHZvaWQgKklEKSB7CisgICAgVXNlZC5wdXNoX2JhY2soSUQpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBBbmFseXNpc1VzYWdlICZhZGRVc2VkSWZBdmFpbGFibGVJRChjaGFyICZJRCkgeworICAgIFVzZWQucHVzaF9iYWNrKCZJRCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIC8vLyBBZGQgdGhlIHNwZWNpZmllZCBQYXNzIGNsYXNzIHRvIHRoZSBzZXQgb2YgYW5hbHlzZXMgdXNlZCBieSB0aGlzIHBhc3MuCisgIHRlbXBsYXRlPGNsYXNzIFBhc3NDbGFzcz4KKyAgQW5hbHlzaXNVc2FnZSAmYWRkVXNlZElmQXZhaWxhYmxlKCkgeworICAgIFVzZWQucHVzaF9iYWNrKCZQYXNzQ2xhc3M6OklEKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgLy8vQH0KKworICAvLy8gQWRkIHRoZSBQYXNzIHdpdGggdGhlIHNwZWNpZmllZCBhcmd1bWVudCBzdHJpbmcgdG8gdGhlIHNldCBvZiBhbmFseXNlcworICAvLy8gcHJlc2VydmVkIGJ5IHRoaXMgcGFzcy4gSWYgbm8gc3VjaCBQYXNzIGV4aXN0cywgZG8gbm90aGluZy4gVGhpcyBjYW4gYmUKKyAgLy8vIHVzZWZ1bCB3aGVuIGEgcGFzcyBpcyB0cml2aWFsbHkgcHJlc2VydmVkLCBidXQgbWF5IG5vdCBiZSBsaW5rZWQgaW4uIEJlCisgIC8vLyBjYXJlZnVsIGFib3V0IHNwZWxsaW5nIQorICBBbmFseXNpc1VzYWdlICZhZGRQcmVzZXJ2ZWQoU3RyaW5nUmVmIEFyZyk7CisKKyAgLy8vIFNldCBieSBhbmFseXNlcyB0aGF0IGRvIG5vdCB0cmFuc2Zvcm0gdGhlaXIgaW5wdXQgYXQgYWxsCisgIHZvaWQgc2V0UHJlc2VydmVzQWxsKCkgeyBQcmVzZXJ2ZXNBbGwgPSB0cnVlOyB9CisKKyAgLy8vIERldGVybWluZSB3aGV0aGVyIGEgcGFzcyBzYWlkIGl0IGRvZXMgbm90IHRyYW5zZm9ybSBpdHMgaW5wdXQgYXQgYWxsCisgIGJvb2wgZ2V0UHJlc2VydmVzQWxsKCkgY29uc3QgeyByZXR1cm4gUHJlc2VydmVzQWxsOyB9CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIGNhbGxlZCBieSB0aGUgcGFzcywgaWZmIHRoZXkgZG8gbm90OgorICAvLy8KKyAgLy8vICAxLiBBZGQgb3IgcmVtb3ZlIGJhc2ljIGJsb2NrcyBmcm9tIHRoZSBmdW5jdGlvbgorICAvLy8gIDIuIE1vZGlmeSB0ZXJtaW5hdG9yIGluc3RydWN0aW9ucyBpbiBhbnkgd2F5LgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gYW5ub3RhdGVzIHRoZSBBbmFseXNpc1VzYWdlIGluZm8gb2JqZWN0IHRvIHNheSB0aGF0IGFuYWx5c2VzCisgIC8vLyB0aGF0IG9ubHkgZGVwZW5kIG9uIHRoZSBDRkcgYXJlIHByZXNlcnZlZCBieSB0aGlzIHBhc3MuCisgIHZvaWQgc2V0UHJlc2VydmVzQ0ZHKCk7CisKKyAgY29uc3QgVmVjdG9yVHlwZSAmZ2V0UmVxdWlyZWRTZXQoKSBjb25zdCB7IHJldHVybiBSZXF1aXJlZDsgfQorICBjb25zdCBWZWN0b3JUeXBlICZnZXRSZXF1aXJlZFRyYW5zaXRpdmVTZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIFJlcXVpcmVkVHJhbnNpdGl2ZTsKKyAgfQorICBjb25zdCBWZWN0b3JUeXBlICZnZXRQcmVzZXJ2ZWRTZXQoKSBjb25zdCB7IHJldHVybiBQcmVzZXJ2ZWQ7IH0KKyAgY29uc3QgVmVjdG9yVHlwZSAmZ2V0VXNlZFNldCgpIGNvbnN0IHsgcmV0dXJuIFVzZWQ7IH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQW5hbHlzaXNSZXNvbHZlciAtIFNpbXBsZSBpbnRlcmZhY2UgdXNlZCBieSBQYXNzIG9iamVjdHMgdG8gcHVsbCBhbGwKKy8vLyBhbmFseXNpcyBpbmZvcm1hdGlvbiBvdXQgb2YgcGFzcyBtYW5hZ2VyIHRoYXQgaXMgcmVzcG9uc2libGUgdG8gbWFuYWdlCisvLy8gdGhlIHBhc3MuCisvLy8KK2NsYXNzIEFuYWx5c2lzUmVzb2x2ZXIgeworcHVibGljOgorICBBbmFseXNpc1Jlc29sdmVyKCkgPSBkZWxldGU7CisgIGV4cGxpY2l0IEFuYWx5c2lzUmVzb2x2ZXIoUE1EYXRhTWFuYWdlciAmUCkgOiBQTShQKSB7fQorCisgIFBNRGF0YU1hbmFnZXIgJmdldFBNRGF0YU1hbmFnZXIoKSB7IHJldHVybiBQTTsgfQorCisgIC8vLyBGaW5kIHBhc3MgdGhhdCBpcyBpbXBsZW1lbnRpbmcgUEkuCisgIFBhc3MgKmZpbmRJbXBsUGFzcyhBbmFseXNpc0lEIFBJKSB7CisgICAgUGFzcyAqUmVzdWx0UGFzcyA9IG51bGxwdHI7CisgICAgZm9yIChjb25zdCBhdXRvICZBbmFseXNpc0ltcGwgOiBBbmFseXNpc0ltcGxzKSB7CisgICAgICBpZiAoQW5hbHlzaXNJbXBsLmZpcnN0ID09IFBJKSB7CisgICAgICAgIFJlc3VsdFBhc3MgPSBBbmFseXNpc0ltcGwuc2Vjb25kOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIFJlc3VsdFBhc3M7CisgIH0KKworICAvLy8gRmluZCBwYXNzIHRoYXQgaXMgaW1wbGVtZW50aW5nIFBJLiBJbml0aWFsaXplIHBhc3MgZm9yIEZ1bmN0aW9uIEYuCisgIFBhc3MgKmZpbmRJbXBsUGFzcyhQYXNzICpQLCBBbmFseXNpc0lEIFBJLCBGdW5jdGlvbiAmRik7CisKKyAgdm9pZCBhZGRBbmFseXNpc0ltcGxzUGFpcihBbmFseXNpc0lEIFBJLCBQYXNzICpQKSB7CisgICAgaWYgKGZpbmRJbXBsUGFzcyhQSSkgPT0gUCkKKyAgICAgIHJldHVybjsKKyAgICBzdGQ6OnBhaXI8QW5hbHlzaXNJRCwgUGFzcyo+IHBpciA9IHN0ZDo6bWFrZV9wYWlyKFBJLFApOworICAgIEFuYWx5c2lzSW1wbHMucHVzaF9iYWNrKHBpcik7CisgIH0KKworICAvLy8gQ2xlYXIgY2FjaGUgdGhhdCBpcyB1c2VkIHRvIGNvbm5lY3QgYSBwYXNzIHRvIHRoZSBhbmFseXNpcyAoUGFzc0luZm8pLgorICB2b2lkIGNsZWFyQW5hbHlzaXNJbXBscygpIHsKKyAgICBBbmFseXNpc0ltcGxzLmNsZWFyKCk7CisgIH0KKworICAvLy8gUmV0dXJuIGFuYWx5c2lzIHJlc3VsdCBvciBudWxsIGlmIGl0IGRvZXNuJ3QgZXhpc3QuCisgIFBhc3MgKmdldEFuYWx5c2lzSWZBdmFpbGFibGUoQW5hbHlzaXNJRCBJRCwgYm9vbCBEaXJlY3Rpb24pIGNvbnN0OworCitwcml2YXRlOgorICAvLy8gVGhpcyBrZWVwcyB0cmFjayBvZiB3aGljaCBwYXNzZXMgaW1wbGVtZW50cyB0aGUgaW50ZXJmYWNlcyB0aGF0IGFyZQorICAvLy8gcmVxdWlyZWQgYnkgdGhlIGN1cnJlbnQgcGFzcyAodG8gaW1wbGVtZW50IGdldEFuYWx5c2lzKCkpLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8QW5hbHlzaXNJRCwgUGFzcyAqPj4gQW5hbHlzaXNJbXBsczsKKworICAvLy8gUGFzc01hbmFnZXIgdGhhdCBpcyB1c2VkIHRvIHJlc29sdmUgYW5hbHlzaXMgaW5mbworICBQTURhdGFNYW5hZ2VyICZQTTsKK307CisKKy8vLyBnZXRBbmFseXNpc0lmQXZhaWxhYmxlPEFuYWx5c2lzVHlwZT4oKSAtIFN1YmNsYXNzZXMgdXNlIHRoaXMgZnVuY3Rpb24gdG8KKy8vLyBnZXQgYW5hbHlzaXMgaW5mb3JtYXRpb24gdGhhdCBtaWdodCBiZSBhcm91bmQsIGZvciBleGFtcGxlIHRvIHVwZGF0ZSBpdC4KKy8vLyBUaGlzIGlzIGRpZmZlcmVudCB0aGFuIGdldEFuYWx5c2lzIGluIHRoYXQgaXQgY2FuIGZhaWwgKGlmIHRoZSBhbmFseXNpcworLy8vIHJlc3VsdHMgaGF2ZW4ndCBiZWVuIGNvbXB1dGVkKSwgc28gc2hvdWxkIG9ubHkgYmUgdXNlZCBpZiB5b3UgY2FuIGhhbmRsZQorLy8vIHRoZSBjYXNlIHdoZW4gdGhlIGFuYWx5c2lzIGlzIG5vdCBhdmFpbGFibGUuICBUaGlzIG1ldGhvZCBpcyBvZnRlbiB1c2VkIGJ5CisvLy8gdHJhbnNmb3JtYXRpb24gQVBJcyB0byB1cGRhdGUgYW5hbHlzaXMgcmVzdWx0cyBmb3IgYSBwYXNzIGF1dG9tYXRpY2FsbHkgYXMKKy8vLyB0aGUgdHJhbnNmb3JtIGlzIHBlcmZvcm1lZC4KK3RlbXBsYXRlPHR5cGVuYW1lIEFuYWx5c2lzVHlwZT4KK0FuYWx5c2lzVHlwZSAqUGFzczo6Z2V0QW5hbHlzaXNJZkF2YWlsYWJsZSgpIGNvbnN0IHsKKyAgYXNzZXJ0KFJlc29sdmVyICYmICJQYXNzIG5vdCByZXNpZGVudCBpbiBhIFBhc3NNYW5hZ2VyIG9iamVjdCEiKTsKKworICBjb25zdCB2b2lkICpQSSA9ICZBbmFseXNpc1R5cGU6OklEOworCisgIFBhc3MgKlJlc3VsdFBhc3MgPSBSZXNvbHZlci0+Z2V0QW5hbHlzaXNJZkF2YWlsYWJsZShQSSwgdHJ1ZSk7CisgIGlmICghUmVzdWx0UGFzcykgcmV0dXJuIG51bGxwdHI7CisKKyAgLy8gQmVjYXVzZSB0aGUgQW5hbHlzaXNUeXBlIG1heSBub3QgYmUgYSBzdWJjbGFzcyBvZiBwYXNzIChmb3IKKyAgLy8gQW5hbHlzaXNHcm91cHMpLCB3ZSB1c2UgZ2V0QWRqdXN0ZWRBbmFseXNpc1BvaW50ZXIgaGVyZSB0byBwb3RlbnRpYWxseQorICAvLyBhZGp1c3QgdGhlIHJldHVybiBwb2ludGVyIChiZWNhdXNlIHRoZSBjbGFzcyBtYXkgbXVsdGlwbHkgaW5oZXJpdCwgb25jZQorICAvLyBmcm9tIHBhc3MsIG9uY2UgZnJvbSBBbmFseXNpc1R5cGUpLgorICByZXR1cm4gKEFuYWx5c2lzVHlwZSopUmVzdWx0UGFzcy0+Z2V0QWRqdXN0ZWRBbmFseXNpc1BvaW50ZXIoUEkpOworfQorCisvLy8gZ2V0QW5hbHlzaXM8QW5hbHlzaXNUeXBlPigpIC0gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIGJ5IHN1YmNsYXNzZXMgdG8gZ2V0CisvLy8gdG8gdGhlIGFuYWx5c2lzIGluZm9ybWF0aW9uIHRoYXQgdGhleSBjbGFpbSB0byB1c2UgYnkgb3ZlcnJpZGluZyB0aGUKKy8vLyBnZXRBbmFseXNpc1VzYWdlIGZ1bmN0aW9uLgordGVtcGxhdGU8dHlwZW5hbWUgQW5hbHlzaXNUeXBlPgorQW5hbHlzaXNUeXBlICZQYXNzOjpnZXRBbmFseXNpcygpIGNvbnN0IHsKKyAgYXNzZXJ0KFJlc29sdmVyICYmICJQYXNzIGhhcyBub3QgYmVlbiBpbnNlcnRlZCBpbnRvIGEgUGFzc01hbmFnZXIgb2JqZWN0ISIpOworICByZXR1cm4gZ2V0QW5hbHlzaXNJRDxBbmFseXNpc1R5cGU+KCZBbmFseXNpc1R5cGU6OklEKTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgQW5hbHlzaXNUeXBlPgorQW5hbHlzaXNUeXBlICZQYXNzOjpnZXRBbmFseXNpc0lEKEFuYWx5c2lzSUQgUEkpIGNvbnN0IHsKKyAgYXNzZXJ0KFBJICYmICJnZXRBbmFseXNpcyBmb3IgdW5yZWdpc3RlcmVkIHBhc3MhIik7CisgIGFzc2VydChSZXNvbHZlciYmIlBhc3MgaGFzIG5vdCBiZWVuIGluc2VydGVkIGludG8gYSBQYXNzTWFuYWdlciBvYmplY3QhIik7CisgIC8vIFBJICptdXN0KiBhcHBlYXIgaW4gQW5hbHlzaXNJbXBscy4gIEJlY2F1c2UgdGhlIG51bWJlciBvZiBwYXNzZXMgdXNlZAorICAvLyBzaG91bGQgYmUgYSBzbWFsbCBudW1iZXIsIHdlIGp1c3QgZG8gYSBsaW5lYXIgc2VhcmNoIG92ZXIgYSAoZGVuc2UpCisgIC8vIHZlY3Rvci4KKyAgUGFzcyAqUmVzdWx0UGFzcyA9IFJlc29sdmVyLT5maW5kSW1wbFBhc3MoUEkpOworICBhc3NlcnQoUmVzdWx0UGFzcyAmJiAKKyAgICAgICAgICJnZXRBbmFseXNpcyooKSBjYWxsZWQgb24gYW4gYW5hbHlzaXMgdGhhdCB3YXMgbm90ICIKKyAgICAgICAgICIncmVxdWlyZWQnIGJ5IHBhc3MhIik7CisKKyAgLy8gQmVjYXVzZSB0aGUgQW5hbHlzaXNUeXBlIG1heSBub3QgYmUgYSBzdWJjbGFzcyBvZiBwYXNzIChmb3IKKyAgLy8gQW5hbHlzaXNHcm91cHMpLCB3ZSB1c2UgZ2V0QWRqdXN0ZWRBbmFseXNpc1BvaW50ZXIgaGVyZSB0byBwb3RlbnRpYWxseQorICAvLyBhZGp1c3QgdGhlIHJldHVybiBwb2ludGVyIChiZWNhdXNlIHRoZSBjbGFzcyBtYXkgbXVsdGlwbHkgaW5oZXJpdCwgb25jZQorICAvLyBmcm9tIHBhc3MsIG9uY2UgZnJvbSBBbmFseXNpc1R5cGUpLgorICByZXR1cm4gKihBbmFseXNpc1R5cGUqKVJlc3VsdFBhc3MtPmdldEFkanVzdGVkQW5hbHlzaXNQb2ludGVyKFBJKTsKK30KKworLy8vIGdldEFuYWx5c2lzPEFuYWx5c2lzVHlwZT4oKSAtIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBieSBzdWJjbGFzc2VzIHRvIGdldAorLy8vIHRvIHRoZSBhbmFseXNpcyBpbmZvcm1hdGlvbiB0aGF0IHRoZXkgY2xhaW0gdG8gdXNlIGJ5IG92ZXJyaWRpbmcgdGhlCisvLy8gZ2V0QW5hbHlzaXNVc2FnZSBmdW5jdGlvbi4KK3RlbXBsYXRlPHR5cGVuYW1lIEFuYWx5c2lzVHlwZT4KK0FuYWx5c2lzVHlwZSAmUGFzczo6Z2V0QW5hbHlzaXMoRnVuY3Rpb24gJkYpIHsKKyAgYXNzZXJ0KFJlc29sdmVyICYmIlBhc3MgaGFzIG5vdCBiZWVuIGluc2VydGVkIGludG8gYSBQYXNzTWFuYWdlciBvYmplY3QhIik7CisKKyAgcmV0dXJuIGdldEFuYWx5c2lzSUQ8QW5hbHlzaXNUeXBlPigmQW5hbHlzaXNUeXBlOjpJRCwgRik7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEFuYWx5c2lzVHlwZT4KK0FuYWx5c2lzVHlwZSAmUGFzczo6Z2V0QW5hbHlzaXNJRChBbmFseXNpc0lEIFBJLCBGdW5jdGlvbiAmRikgeworICBhc3NlcnQoUEkgJiYgImdldEFuYWx5c2lzIGZvciB1bnJlZ2lzdGVyZWQgcGFzcyEiKTsKKyAgYXNzZXJ0KFJlc29sdmVyICYmICJQYXNzIGhhcyBub3QgYmVlbiBpbnNlcnRlZCBpbnRvIGEgUGFzc01hbmFnZXIgb2JqZWN0ISIpOworICAvLyBQSSAqbXVzdCogYXBwZWFyIGluIEFuYWx5c2lzSW1wbHMuICBCZWNhdXNlIHRoZSBudW1iZXIgb2YgcGFzc2VzIHVzZWQKKyAgLy8gc2hvdWxkIGJlIGEgc21hbGwgbnVtYmVyLCB3ZSBqdXN0IGRvIGEgbGluZWFyIHNlYXJjaCBvdmVyIGEgKGRlbnNlKQorICAvLyB2ZWN0b3IuCisgIFBhc3MgKlJlc3VsdFBhc3MgPSBSZXNvbHZlci0+ZmluZEltcGxQYXNzKHRoaXMsIFBJLCBGKTsKKyAgYXNzZXJ0KFJlc3VsdFBhc3MgJiYgIlVuYWJsZSB0byBmaW5kIHJlcXVlc3RlZCBhbmFseXNpcyBpbmZvIik7CisKKyAgLy8gQmVjYXVzZSB0aGUgQW5hbHlzaXNUeXBlIG1heSBub3QgYmUgYSBzdWJjbGFzcyBvZiBwYXNzIChmb3IKKyAgLy8gQW5hbHlzaXNHcm91cHMpLCB3ZSB1c2UgZ2V0QWRqdXN0ZWRBbmFseXNpc1BvaW50ZXIgaGVyZSB0byBwb3RlbnRpYWxseQorICAvLyBhZGp1c3QgdGhlIHJldHVybiBwb2ludGVyIChiZWNhdXNlIHRoZSBjbGFzcyBtYXkgbXVsdGlwbHkgaW5oZXJpdCwgb25jZQorICAvLyBmcm9tIHBhc3MsIG9uY2UgZnJvbSBBbmFseXNpc1R5cGUpLgorICByZXR1cm4gKihBbmFseXNpc1R5cGUqKVJlc3VsdFBhc3MtPmdldEFkanVzdGVkQW5hbHlzaXNQb2ludGVyKFBJKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fUEFTU0FOQUxZU0lTU1VQUE9SVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Bhc3NJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Bhc3NJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmYxYWI0ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUGFzc0luZm8uaApAQCAtMCwwICsxLDEyMSBAQAorLy89PT0tIGxsdm0vUGFzc0luZm8uaCAtIFBhc3MgSW5mbyBjbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhbmQgaW1wbGVtZW50cyB0aGUgUGFzc0luZm8gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1BBU1NJTkZPX0gKKyNkZWZpbmUgTExWTV9QQVNTSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBQYXNzOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8vIFBhc3NJbmZvIGNsYXNzIC0gQW4gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBleGlzdHMgZm9yIGV2ZXJ5IHBhc3Mga25vd24gYnkKKy8vLyB0aGUgc3lzdGVtLCBhbmQgY2FuIGJlIG9idGFpbmVkIGZyb20gYSBsaXZlIFBhc3MgYnkgY2FsbGluZyBpdHMKKy8vLyBnZXRQYXNzSW5mbygpIG1ldGhvZC4gIFRoZXNlIG9iamVjdHMgYXJlIHNldCB1cCBieSB0aGUgUmVnaXN0ZXJQYXNzPD4KKy8vLyB0ZW1wbGF0ZS4KKy8vLworY2xhc3MgUGFzc0luZm8geworcHVibGljOgorICB1c2luZyBOb3JtYWxDdG9yX3QgPSBQYXNzKiAoKikoKTsKKworcHJpdmF0ZToKKyAgU3RyaW5nUmVmIFBhc3NOYW1lOyAgICAgLy8gTmljZSBuYW1lIGZvciBQYXNzCisgIFN0cmluZ1JlZiBQYXNzQXJndW1lbnQ7IC8vIENvbW1hbmQgTGluZSBhcmd1bWVudCB0byBydW4gdGhpcyBwYXNzCisgIGNvbnN0IHZvaWQgKlBhc3NJRDsKKyAgY29uc3QgYm9vbCBJc0NGR09ubHlQYXNzID0gZmFsc2U7ICAgICAgLy8gUGFzcyBvbmx5IGxvb2tzIGF0IHRoZSBDRkcuCisgIGNvbnN0IGJvb2wgSXNBbmFseXNpczsgICAgICAgICAgICAgICAgIC8vIFRydWUgaWYgYW4gYW5hbHlzaXMgcGFzcy4KKyAgY29uc3QgYm9vbCBJc0FuYWx5c2lzR3JvdXA7ICAgICAgICAgICAgLy8gVHJ1ZSBpZiBhbiBhbmFseXNpcyBncm91cC4KKyAgc3RkOjp2ZWN0b3I8Y29uc3QgUGFzc0luZm8gKj4gSXRmSW1wbDsgLy8gSW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBieSB0aGlzIHBhc3MKKyAgTm9ybWFsQ3Rvcl90IE5vcm1hbEN0b3IgPSBudWxscHRyOworCitwdWJsaWM6CisgIC8vLyBQYXNzSW5mbyBjdG9yIC0gRG8gbm90IGNhbGwgdGhpcyBkaXJlY3RseSwgdGhpcyBzaG91bGQgb25seSBiZSBpbnZva2VkCisgIC8vLyB0aHJvdWdoIFJlZ2lzdGVyUGFzcy4KKyAgUGFzc0luZm8oU3RyaW5nUmVmIG5hbWUsIFN0cmluZ1JlZiBhcmcsIGNvbnN0IHZvaWQgKnBpLCBOb3JtYWxDdG9yX3Qgbm9ybWFsLAorICAgICAgICAgICBib29sIGlzQ0ZHT25seSwgYm9vbCBpc19hbmFseXNpcykKKyAgICAgIDogUGFzc05hbWUobmFtZSksIFBhc3NBcmd1bWVudChhcmcpLCBQYXNzSUQocGkpLCBJc0NGR09ubHlQYXNzKGlzQ0ZHT25seSksCisgICAgICAgIElzQW5hbHlzaXMoaXNfYW5hbHlzaXMpLCBJc0FuYWx5c2lzR3JvdXAoZmFsc2UpLCBOb3JtYWxDdG9yKG5vcm1hbCkge30KKworICAvLy8gUGFzc0luZm8gY3RvciAtIERvIG5vdCBjYWxsIHRoaXMgZGlyZWN0bHksIHRoaXMgc2hvdWxkIG9ubHkgYmUgaW52b2tlZAorICAvLy8gdGhyb3VnaCBSZWdpc3RlclBhc3MuIFRoaXMgdmVyc2lvbiBpcyBmb3IgdXNlIGJ5IGFuYWx5c2lzIGdyb3VwczsgaXQKKyAgLy8vIGRvZXMgbm90IGF1dG8tcmVnaXN0ZXIgdGhlIHBhc3MuCisgIFBhc3NJbmZvKFN0cmluZ1JlZiBuYW1lLCBjb25zdCB2b2lkICpwaSkKKyAgICAgIDogUGFzc05hbWUobmFtZSksIFBhc3NJRChwaSksIElzQW5hbHlzaXMoZmFsc2UpLCBJc0FuYWx5c2lzR3JvdXAodHJ1ZSkge30KKworICBQYXNzSW5mbyhjb25zdCBQYXNzSW5mbyAmKSA9IGRlbGV0ZTsKKyAgUGFzc0luZm8gJm9wZXJhdG9yPShjb25zdCBQYXNzSW5mbyAmKSA9IGRlbGV0ZTsKKworICAvLy8gZ2V0UGFzc05hbWUgLSBSZXR1cm4gdGhlIGZyaWVuZGx5IG5hbWUgZm9yIHRoZSBwYXNzLCBuZXZlciByZXR1cm5zIG51bGwKKyAgU3RyaW5nUmVmIGdldFBhc3NOYW1lKCkgY29uc3QgeyByZXR1cm4gUGFzc05hbWU7IH0KKworICAvLy8gZ2V0UGFzc0FyZ3VtZW50IC0gUmV0dXJuIHRoZSBjb21tYW5kIGxpbmUgb3B0aW9uIHRoYXQgbWF5IGJlIHBhc3NlZCB0bworICAvLy8gJ29wdCcgdGhhdCB3aWxsIGNhdXNlIHRoaXMgcGFzcyB0byBiZSBydW4uICBUaGlzIHdpbGwgcmV0dXJuIG51bGwgaWYgdGhlcmUKKyAgLy8vIGlzIG5vIGFyZ3VtZW50LgorICBTdHJpbmdSZWYgZ2V0UGFzc0FyZ3VtZW50KCkgY29uc3QgeyByZXR1cm4gUGFzc0FyZ3VtZW50OyB9CisKKyAgLy8vIGdldFR5cGVJbmZvIC0gUmV0dXJuIHRoZSBpZCBvYmplY3QgZm9yIHRoZSBwYXNzLi4uCisgIC8vLyBUT0RPIDogUmVuYW1lCisgIGNvbnN0IHZvaWQgKmdldFR5cGVJbmZvKCkgY29uc3QgeyByZXR1cm4gUGFzc0lEOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgUGFzc0lEIGltcGxlbWVudHMgdGhlIHNwZWNpZmllZCBJRCBwb2ludGVyLgorICBib29sIGlzUGFzc0lEKGNvbnN0IHZvaWQgKklEUHRyKSBjb25zdCB7IHJldHVybiBQYXNzSUQgPT0gSURQdHI7IH0KKworICAvLy8gaXNBbmFseXNpc0dyb3VwIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBhbmFseXNpcyBncm91cCwgbm90IGEgbm9ybWFsCisgIC8vLyBwYXNzLgorICBib29sIGlzQW5hbHlzaXNHcm91cCgpIGNvbnN0IHsgcmV0dXJuIElzQW5hbHlzaXNHcm91cDsgfQorICBib29sIGlzQW5hbHlzaXMoKSBjb25zdCB7IHJldHVybiBJc0FuYWx5c2lzOyB9CisKKyAgLy8vIGlzQ0ZHT25seVBhc3MgLSByZXR1cm4gdHJ1ZSBpZiB0aGlzIHBhc3Mgb25seSBsb29rcyBhdCB0aGUgQ0ZHIGZvciB0aGUKKyAgLy8vIGZ1bmN0aW9uLgorICBib29sIGlzQ0ZHT25seVBhc3MoKSBjb25zdCB7IHJldHVybiBJc0NGR09ubHlQYXNzOyB9CisKKyAgLy8vIGdldE5vcm1hbEN0b3IgLSBSZXR1cm4gYSBwb2ludGVyIHRvIGEgZnVuY3Rpb24sIHRoYXQgd2hlbiBjYWxsZWQsIGNyZWF0ZXMKKyAgLy8vIGFuIGluc3RhbmNlIG9mIHRoZSBwYXNzIGFuZCByZXR1cm5zIGl0LiAgVGhpcyBwb2ludGVyIG1heSBiZSBudWxsIGlmIHRoZXJlCisgIC8vLyBpcyBubyBkZWZhdWx0IGNvbnN0cnVjdG9yIGZvciB0aGUgcGFzcy4KKyAgTm9ybWFsQ3Rvcl90IGdldE5vcm1hbEN0b3IoKSBjb25zdCB7CisgICAgcmV0dXJuIE5vcm1hbEN0b3I7CisgIH0KKyAgdm9pZCBzZXROb3JtYWxDdG9yKE5vcm1hbEN0b3JfdCBDdG9yKSB7CisgICAgTm9ybWFsQ3RvciA9IEN0b3I7CisgIH0KKworICAvLy8gY3JlYXRlUGFzcygpIC0gVXNlIHRoaXMgbWV0aG9kIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGlzIHBhc3MuCisgIFBhc3MgKmNyZWF0ZVBhc3MoKSBjb25zdCB7CisgICAgYXNzZXJ0KCghaXNBbmFseXNpc0dyb3VwKCkgfHwgTm9ybWFsQ3RvcikgJiYKKyAgICAgICAgICAgIk5vIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm91bmQgZm9yIGFuYWx5c2lzIGdyb3VwISIpOworICAgIGFzc2VydChOb3JtYWxDdG9yICYmCisgICAgICAgICAgICJDYW5ub3QgY2FsbCBjcmVhdGVQYXNzIG9uIFBhc3NJbmZvIHdpdGhvdXQgZGVmYXVsdCBjdG9yISIpOworICAgIHJldHVybiBOb3JtYWxDdG9yKCk7CisgIH0KKworICAvLy8gYWRkSW50ZXJmYWNlSW1wbGVtZW50ZWQgLSBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiB0aGlzIHBhc3MgaXMKKyAgLy8vIHJlZ2lzdGVyZWQgYXMgYSBtZW1iZXIgb2YgYW4gYW5hbHlzaXMgZ3JvdXAgd2l0aCB0aGUgUmVnaXN0ZXJBbmFseXNpc0dyb3VwCisgIC8vLyB0ZW1wbGF0ZS4KKyAgdm9pZCBhZGRJbnRlcmZhY2VJbXBsZW1lbnRlZChjb25zdCBQYXNzSW5mbyAqSXRmUEkpIHsKKyAgICBJdGZJbXBsLnB1c2hfYmFjayhJdGZQSSk7CisgIH0KKworICAvLy8gZ2V0SW50ZXJmYWNlc0ltcGxlbWVudGVkIC0gUmV0dXJuIGEgbGlzdCBvZiBhbGwgb2YgdGhlIGFuYWx5c2lzIGdyb3VwCisgIC8vLyBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHRoaXMgcGFzcy4KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgUGFzc0luZm8qPiAmZ2V0SW50ZXJmYWNlc0ltcGxlbWVudGVkKCkgY29uc3QgeworICAgIHJldHVybiBJdGZJbXBsOworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9QQVNTSU5GT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Bhc3NSZWdpc3RyeS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9QYXNzUmVnaXN0cnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2VkYzEyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9QYXNzUmVnaXN0cnkuaApAQCAtMCwwICsxLDk4IEBACisvLz09PS0gbGx2bS9QYXNzUmVnaXN0cnkuaCAtIFBhc3MgSW5mb3JtYXRpb24gUmVnaXN0cnkgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIFBhc3NSZWdpc3RyeSwgYSBjbGFzcyB0aGF0IGlzIHVzZWQgaW4gdGhlIGluaXRpYWxpemF0aW9uCisvLyBhbmQgcmVnaXN0cmF0aW9uIG9mIHBhc3Nlcy4gIEF0IGFwcGxpY2F0aW9uIHN0YXJ0dXAsIHBhc3NlcyBhcmUgcmVnaXN0ZXJlZAorLy8gd2l0aCB0aGUgUGFzc1JlZ2lzdHJ5LCB3aGljaCBpcyBsYXRlciBwcm92aWRlZCB0byB0aGUgUGFzc01hbmFnZXIgZm9yIAorLy8gZGVwZW5kZW5jeSByZXNvbHV0aW9uIGFuZCBzaW1pbGFyIHRhc2tzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9QQVNTUkVHSVNUUllfSAorI2RlZmluZSBMTFZNX1BBU1NSRUdJU1RSWV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DQmluZGluZ1dyYXBwaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1JXTXV0ZXguaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFBhc3NJbmZvOworc3RydWN0IFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lcjsKKworLy8vIFBhc3NSZWdpc3RyeSAtIFRoaXMgY2xhc3MgbWFuYWdlcyB0aGUgcmVnaXN0cmF0aW9uIGFuZCBpbnRpdGlhbGl6YXRpb24gb2YKKy8vLyB0aGUgcGFzcyBzdWJzeXN0ZW0gYXMgYXBwbGljYXRpb24gc3RhcnR1cCwgYW5kIGFzc2lzdHMgdGhlIFBhc3NNYW5hZ2VyCisvLy8gaW4gcmVzb2x2aW5nIHBhc3MgZGVwZW5kZW5jaWVzLgorLy8vIE5PVEU6IFBhc3NSZWdpc3RyeSBpcyBOT1QgdGhyZWFkLXNhZmUuICBJZiB5b3Ugd2FudCB0byB1c2UgTExWTSBvbiBtdWx0aXBsZQorLy8vIHRocmVhZHMgc2ltdWx0YW5lb3VzbHksIHlvdSB3aWxsIG5lZWQgdG8gdXNlIGEgc2VwYXJhdGUgUGFzc1JlZ2lzdHJ5IG9uCisvLy8gZWFjaCB0aHJlYWQuCitjbGFzcyBQYXNzUmVnaXN0cnkgeworICBtdXRhYmxlIHN5czo6U21hcnRSV011dGV4PHRydWU+IExvY2s7CisKKyAgLy8vIFBhc3NJbmZvTWFwIC0gS2VlcCB0cmFjayBvZiB0aGUgUGFzc0luZm8gb2JqZWN0IGZvciBlYWNoIHJlZ2lzdGVyZWQgcGFzcy4KKyAgdXNpbmcgTWFwVHlwZSA9IERlbnNlTWFwPGNvbnN0IHZvaWQgKiwgY29uc3QgUGFzc0luZm8gKj47CisgIE1hcFR5cGUgUGFzc0luZm9NYXA7CisKKyAgdXNpbmcgU3RyaW5nTWFwVHlwZSA9IFN0cmluZ01hcDxjb25zdCBQYXNzSW5mbyAqPjsKKyAgU3RyaW5nTWFwVHlwZSBQYXNzSW5mb1N0cmluZ01hcDsKKworICBzdGQ6OnZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8Y29uc3QgUGFzc0luZm8+PiBUb0ZyZWU7CisgIHN0ZDo6dmVjdG9yPFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lciAqPiBMaXN0ZW5lcnM7CisKK3B1YmxpYzoKKyAgUGFzc1JlZ2lzdHJ5KCkgPSBkZWZhdWx0OworICB+UGFzc1JlZ2lzdHJ5KCk7CisKKyAgLy8vIGdldFBhc3NSZWdpc3RyeSAtIEFjY2VzcyB0aGUgZ2xvYmFsIHJlZ2lzdHJ5IG9iamVjdCwgd2hpY2ggaXMKKyAgLy8vIGF1dG9tYXRpY2FsbHkgaW5pdGlhbGl6ZWQgYXQgYXBwbGljYXRpb24gbGF1bmNoIGFuZCBkZXN0cm95ZWQgYnkKKyAgLy8vIGxsdm1fc2h1dGRvd24uCisgIHN0YXRpYyBQYXNzUmVnaXN0cnkgKmdldFBhc3NSZWdpc3RyeSgpOworCisgIC8vLyBnZXRQYXNzSW5mbyAtIExvb2sgdXAgYSBwYXNzJyBjb3JyZXNwb25kaW5nIFBhc3NJbmZvLCBpbmRleGVkIGJ5IHRoZSBwYXNzJworICAvLy8gdHlwZSBpZGVudGlmaWVyICgmTXlQYXNzOjpJRCkuCisgIGNvbnN0IFBhc3NJbmZvICpnZXRQYXNzSW5mbyhjb25zdCB2b2lkICpUSSkgY29uc3Q7CisKKyAgLy8vIGdldFBhc3NJbmZvIC0gTG9vayB1cCBhIHBhc3MnIGNvcnJlc3BvbmRpbmcgUGFzc0luZm8sIGluZGV4ZWQgYnkgdGhlIHBhc3MnCisgIC8vLyBhcmd1bWVudCBzdHJpbmcuCisgIGNvbnN0IFBhc3NJbmZvICpnZXRQYXNzSW5mbyhTdHJpbmdSZWYgQXJnKSBjb25zdDsKKworICAvLy8gcmVnaXN0ZXJQYXNzIC0gUmVnaXN0ZXIgYSBwYXNzIChieSBtZWFucyBvZiBpdHMgUGFzc0luZm8pIHdpdGggdGhlCisgIC8vLyByZWdpc3RyeS4gIFJlcXVpcmVkIGluIG9yZGVyIHRvIHVzZSB0aGUgcGFzcyB3aXRoIGEgUGFzc01hbmFnZXIuCisgIHZvaWQgcmVnaXN0ZXJQYXNzKGNvbnN0IFBhc3NJbmZvICZQSSwgYm9vbCBTaG91bGRGcmVlID0gZmFsc2UpOworCisgIC8vLyByZWdpc3RlckFuYWx5c2lzR3JvdXAgLSBSZWdpc3RlciBhbiBhbmFseXNpcyBncm91cCAob3IgYSBwYXNzIGltcGxlbWVudGluZworICAvLyBhbiBhbmFseXNpcyBncm91cCkgd2l0aCB0aGUgcmVnaXN0cnkuICBMaWtlIHJlZ2lzdGVyUGFzcywgdGhpcyBpcyByZXF1aXJlZAorICAvLyBpbiBvcmRlciBmb3IgYSBQYXNzTWFuYWdlciB0byBiZSBhYmxlIHRvIHVzZSB0aGlzIGdyb3VwL3Bhc3MuCisgIHZvaWQgcmVnaXN0ZXJBbmFseXNpc0dyb3VwKGNvbnN0IHZvaWQgKkludGVyZmFjZUlELCBjb25zdCB2b2lkICpQYXNzSUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3NJbmZvICZSZWdpc3RlcmVlLCBib29sIGlzRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRGcmVlID0gZmFsc2UpOworCisgIC8vLyBlbnVtZXJhdGVXaXRoIC0gRW51bWVyYXRlIHRoZSByZWdpc3RlcmVkIHBhc3NlcywgY2FsbGluZyB0aGUgcHJvdmlkZWQKKyAgLy8vIFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lcidzIHBhc3NFbnVtZXJhdGUoKSBjYWxsYmFjayBvbiBlYWNoIG9mIHRoZW0uCisgIHZvaWQgZW51bWVyYXRlV2l0aChQYXNzUmVnaXN0cmF0aW9uTGlzdGVuZXIgKkwpOworCisgIC8vLyBhZGRSZWdpc3RyYXRpb25MaXN0ZW5lciAtIFJlZ2lzdGVyIHRoZSBnaXZlbiBQYXNzUmVnaXN0cmF0aW9uTGlzdGVuZXIKKyAgLy8vIHRvIHJlY2VpdmUgcGFzc1JlZ2lzdGVyZWQoKSBjYWxsYmFja3Mgd2hlbmV2ZXIgYSBuZXcgcGFzcyBpcyByZWdpc3RlcmVkLgorICB2b2lkIGFkZFJlZ2lzdHJhdGlvbkxpc3RlbmVyKFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lciAqTCk7CisKKyAgLy8vIHJlbW92ZVJlZ2lzdHJhdGlvbkxpc3RlbmVyIC0gVW5yZWdpc3RlciBhIFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lciBzbyB0aGF0CisgIC8vLyBpdCBubyBsb25nZXIgcmVjZWl2ZXMgcGFzc1JlZ2lzdGVyZWQoKSBjYWxsYmFja3MuCisgIHZvaWQgcmVtb3ZlUmVnaXN0cmF0aW9uTGlzdGVuZXIoUGFzc1JlZ2lzdHJhdGlvbkxpc3RlbmVyICpMKTsKK307CisKKy8vIENyZWF0ZSB3cmFwcGVycyBmb3IgQyBCaW5kaW5nIHR5cGVzIChzZWUgQ0JpbmRpbmdXcmFwcGluZy5oKS4KK0RFRklORV9TVERDWFhfQ09OVkVSU0lPTl9GVU5DVElPTlMoUGFzc1JlZ2lzdHJ5LCBMTFZNUGFzc1JlZ2lzdHJ5UmVmKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9QQVNTUkVHSVNUUllfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9QYXNzU3VwcG9ydC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9QYXNzU3VwcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiZjIzZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Bhc3NTdXBwb3J0LmgKQEAgLTAsMCArMSwyMTYgQEAKKy8vPT09LSBsbHZtL1Bhc3NTdXBwb3J0LmggLSBQYXNzIFN1cHBvcnQgY29kZSAtLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgc3R1ZmYgdGhhdCBpcyB1c2VkIHRvIGRlZmluZSBhbmQgInVzZSIgUGFzc2VzLiAgVGhpcyBmaWxlCisvLyBpcyBhdXRvbWF0aWNhbGx5ICNpbmNsdWRlZCBieSBQYXNzLmgsIHNvOgorLy8KKy8vICAgICAgICAgICBOTyAuQ1BQIEZJTEVTIFNIT1VMRCBJTkNMVURFIFRISVMgRklMRSBESVJFQ1RMWQorLy8KKy8vIEluc3RlYWQsICNpbmNsdWRlIFBhc3MuaC4KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBQYXNzIHJlZ2lzdHJhdGlvbiBjb2RlIGFuZCBjbGFzc2VzIHVzZWQgZm9yIGl0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9QQVNTU1VQUE9SVF9ICisjZGVmaW5lIExMVk1fUEFTU1NVUFBPUlRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzSW5mby5oIgorI2luY2x1ZGUgImxsdm0vUGFzc1JlZ2lzdHJ5LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1RocmVhZGluZy5oIgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgUGFzczsKKworI2RlZmluZSBJTklUSUFMSVpFX1BBU1MocGFzc05hbWUsIGFyZywgbmFtZSwgY2ZnLCBhbmFseXNpcykgICAgICAgICAgICAgICAgICAgIFwKKyAgc3RhdGljIHZvaWQgKmluaXRpYWxpemUjI3Bhc3NOYW1lIyNQYXNzT25jZShQYXNzUmVnaXN0cnkgJlJlZ2lzdHJ5KSB7ICAgICAgICBcCisgICAgUGFzc0luZm8gKlBJID0gbmV3IFBhc3NJbmZvKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuYW1lLCBhcmcsICZwYXNzTmFtZTo6SUQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgUGFzc0luZm86Ok5vcm1hbEN0b3JfdChjYWxsRGVmYXVsdEN0b3I8cGFzc05hbWU+KSwgY2ZnLCBhbmFseXNpcyk7ICAgICBcCisgICAgUmVnaXN0cnkucmVnaXN0ZXJQYXNzKCpQSSwgdHJ1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBQSTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBsbHZtOjpvbmNlX2ZsYWcgSW5pdGlhbGl6ZSMjcGFzc05hbWUjI1Bhc3NGbGFnOyAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIGxsdm06OmluaXRpYWxpemUjI3Bhc3NOYW1lIyNQYXNzKFBhc3NSZWdpc3RyeSAmUmVnaXN0cnkpIHsgICAgICAgICAgICAgIFwKKyAgICBsbHZtOjpjYWxsX29uY2UoSW5pdGlhbGl6ZSMjcGFzc05hbWUjI1Bhc3NGbGFnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemUjI3Bhc3NOYW1lIyNQYXNzT25jZSwgc3RkOjpyZWYoUmVnaXN0cnkpKTsgICAgICAgXAorICB9CisKKyNkZWZpbmUgSU5JVElBTElaRV9QQVNTX0JFR0lOKHBhc3NOYW1lLCBhcmcsIG5hbWUsIGNmZywgYW5hbHlzaXMpICAgICAgICAgICAgICBcCisgIHN0YXRpYyB2b2lkICppbml0aWFsaXplIyNwYXNzTmFtZSMjUGFzc09uY2UoUGFzc1JlZ2lzdHJ5ICZSZWdpc3RyeSkgeworCisjZGVmaW5lIElOSVRJQUxJWkVfUEFTU19ERVBFTkRFTkNZKGRlcE5hbWUpIGluaXRpYWxpemUjI2RlcE5hbWUjI1Bhc3MoUmVnaXN0cnkpOworI2RlZmluZSBJTklUSUFMSVpFX0FHX0RFUEVOREVOQ1koZGVwTmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5pdGlhbGl6ZSMjZGVwTmFtZSMjQW5hbHlzaXNHcm91cChSZWdpc3RyeSk7CisKKyNkZWZpbmUgSU5JVElBTElaRV9QQVNTX0VORChwYXNzTmFtZSwgYXJnLCBuYW1lLCBjZmcsIGFuYWx5c2lzKSAgICAgICAgICAgICAgICBcCisgIFBhc3NJbmZvICpQSSA9IG5ldyBQYXNzSW5mbyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbmFtZSwgYXJnLCAmcGFzc05hbWU6OklELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFBhc3NJbmZvOjpOb3JtYWxDdG9yX3QoY2FsbERlZmF1bHRDdG9yPHBhc3NOYW1lPiksIGNmZywgYW5hbHlzaXMpOyAgICAgICBcCisgIFJlZ2lzdHJ5LnJlZ2lzdGVyUGFzcygqUEksIHRydWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICByZXR1cm4gUEk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBsbHZtOjpvbmNlX2ZsYWcgSW5pdGlhbGl6ZSMjcGFzc05hbWUjI1Bhc3NGbGFnOyAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIGxsdm06OmluaXRpYWxpemUjI3Bhc3NOYW1lIyNQYXNzKFBhc3NSZWdpc3RyeSAmUmVnaXN0cnkpIHsgICAgICAgICAgICAgIFwKKyAgICBsbHZtOjpjYWxsX29uY2UoSW5pdGlhbGl6ZSMjcGFzc05hbWUjI1Bhc3NGbGFnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemUjI3Bhc3NOYW1lIyNQYXNzT25jZSwgc3RkOjpyZWYoUmVnaXN0cnkpKTsgICAgICAgXAorICB9CisKKyNkZWZpbmUgSU5JVElBTElaRV9QQVNTX1dJVEhfT1BUSU9OUyhQYXNzTmFtZSwgQXJnLCBOYW1lLCBDZmcsIEFuYWx5c2lzKSAgICAgICBcCisgIElOSVRJQUxJWkVfUEFTU19CRUdJTihQYXNzTmFtZSwgQXJnLCBOYW1lLCBDZmcsIEFuYWx5c2lzKSAgICAgICAgICAgICAgICAgICAgXAorICBQYXNzTmFtZTo6cmVnaXN0ZXJPcHRpb25zKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5JVElBTElaRV9QQVNTX0VORChQYXNzTmFtZSwgQXJnLCBOYW1lLCBDZmcsIEFuYWx5c2lzKQorCisjZGVmaW5lIElOSVRJQUxJWkVfUEFTU19XSVRIX09QVElPTlNfQkVHSU4oUGFzc05hbWUsIEFyZywgTmFtZSwgQ2ZnLCBBbmFseXNpcykgXAorICBJTklUSUFMSVpFX1BBU1NfQkVHSU4oUGFzc05hbWUsIEFyZywgTmFtZSwgQ2ZnLCBBbmFseXNpcykgICAgICAgICAgICAgICAgICAgIFwKKyAgUGFzc05hbWU6OnJlZ2lzdGVyT3B0aW9ucygpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFzc05hbWU+IFBhc3MgKmNhbGxEZWZhdWx0Q3RvcigpIHsgcmV0dXJuIG5ldyBQYXNzTmFtZSgpOyB9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8gUmVnaXN0ZXJQYXNzPHQ+IHRlbXBsYXRlIC0gVGhpcyB0ZW1wbGF0ZSBjbGFzcyBpcyB1c2VkIHRvIG5vdGlmeSB0aGUgc3lzdGVtCisvLy8gdGhhdCBhIFBhc3MgaXMgYXZhaWxhYmxlIGZvciB1c2UsIGFuZCByZWdpc3RlcnMgaXQgaW50byB0aGUgaW50ZXJuYWwKKy8vLyBkYXRhYmFzZSBtYWludGFpbmVkIGJ5IHRoZSBQYXNzTWFuYWdlci4gIFVubGVzcyB0aGlzIHRlbXBsYXRlIGlzIHVzZWQsIG9wdCwKKy8vLyBmb3IgZXhhbXBsZSB3aWxsIG5vdCBiZSBhYmxlIHRvIHNlZSB0aGUgcGFzcyBhbmQgYXR0ZW1wdHMgdG8gY3JlYXRlIHRoZSBwYXNzCisvLy8gd2lsbCBmYWlsLiBUaGlzIHRlbXBsYXRlIGlzIHVzZWQgaW4gdGhlIGZvbGxvdyBtYW5uZXIgKGF0IGdsb2JhbCBzY29wZSwgaW4KKy8vLyB5b3VyIC5jcHAgZmlsZSk6CisvLy8KKy8vLyBzdGF0aWMgUmVnaXN0ZXJQYXNzPFlvdXJQYXNzQ2xhc3NOYW1lPiB0bXAoInBhc3NvcHQiLCAiTXkgUGFzcyBOYW1lIik7CisvLy8KKy8vLyBUaGlzIHN0YXRlbWVudCB3aWxsIGNhdXNlIHlvdXIgcGFzcyB0byBiZSBjcmVhdGVkIGJ5IGNhbGxpbmcgdGhlIGRlZmF1bHQKKy8vLyBjb25zdHJ1Y3RvciBleHBvc2VkIGJ5IHRoZSBwYXNzLgordGVtcGxhdGUgPHR5cGVuYW1lIHBhc3NOYW1lPiBzdHJ1Y3QgUmVnaXN0ZXJQYXNzIDogcHVibGljIFBhc3NJbmZvIHsKKyAgLy8gUmVnaXN0ZXIgUGFzcyB1c2luZyBkZWZhdWx0IGNvbnN0cnVjdG9yLi4uCisgIFJlZ2lzdGVyUGFzcyhTdHJpbmdSZWYgUGFzc0FyZywgU3RyaW5nUmVmIE5hbWUsIGJvb2wgQ0ZHT25seSA9IGZhbHNlLAorICAgICAgICAgICAgICAgYm9vbCBpc19hbmFseXNpcyA9IGZhbHNlKQorICAgICAgOiBQYXNzSW5mbyhOYW1lLCBQYXNzQXJnLCAmcGFzc05hbWU6OklELAorICAgICAgICAgICAgICAgICBQYXNzSW5mbzo6Tm9ybWFsQ3Rvcl90KGNhbGxEZWZhdWx0Q3RvcjxwYXNzTmFtZT4pLCBDRkdPbmx5LAorICAgICAgICAgICAgICAgICBpc19hbmFseXNpcykgeworICAgIFBhc3NSZWdpc3RyeTo6Z2V0UGFzc1JlZ2lzdHJ5KCktPnJlZ2lzdGVyUGFzcygqdGhpcyk7CisgIH0KK307CisKKy8vLyBSZWdpc3RlckFuYWx5c2lzR3JvdXAgLSBSZWdpc3RlciBhIFBhc3MgYXMgYSBtZW1iZXIgb2YgYW4gYW5hbHlzaXMgX2dyb3VwXy4KKy8vLyBBbmFseXNpcyBncm91cHMgYXJlIHVzZWQgdG8gZGVmaW5lIGFuIGludGVyZmFjZSAod2hpY2ggbmVlZCBub3QgZGVyaXZlIGZyb20KKy8vLyBQYXNzKSB0aGF0IGlzIHJlcXVpcmVkIGJ5IHBhc3NlcyB0byBkbyB0aGVpciBqb2IuICBBbmFseXNpcyBHcm91cHMgZGlmZmVyCisvLy8gZnJvbSBub3JtYWwgYW5hbHlzZXMgYmVjYXVzZSBhbnkgYXZhaWxhYmxlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBncm91cCB3aWxsCisvLy8gYmUgdXNlZCBpZiBpdCBpcyBhdmFpbGFibGUuCisvLy8KKy8vLyBJZiBubyBhbmFseXNpcyBpbXBsZW1lbnRpbmcgdGhlIGludGVyZmFjZSBpcyBhdmFpbGFibGUsIGEgZGVmYXVsdAorLy8vIGltcGxlbWVudGF0aW9uIGlzIGNyZWF0ZWQgYW5kIGFkZGVkLiAgQSBwYXNzIHJlZ2lzdGVycyBpdHNlbGYgYXMgdGhlIGRlZmF1bHQKKy8vLyBpbXBsZW1lbnRhdGlvbiBieSBzcGVjaWZ5aW5nICd0cnVlJyBhcyB0aGUgc2Vjb25kIHRlbXBsYXRlIGFyZ3VtZW50IG9mIHRoaXMKKy8vLyBjbGFzcy4KKy8vLworLy8vIEluIGFkZGl0aW9uIHRvIHJlZ2lzdGVyaW5nIGl0c2VsZiBhcyBhbiBhbmFseXNpcyBncm91cCBtZW1iZXIsIGEgcGFzcyBtdXN0CisvLy8gcmVnaXN0ZXIgaXRzZWxmIG5vcm1hbGx5IGFzIHdlbGwuICBQYXNzZXMgbWF5IGJlIG1lbWJlcnMgb2YgbXVsdGlwbGUgZ3JvdXBzCisvLy8gYW5kIG1heSBzdGlsbCBiZSAicmVxdWlyZWQiIHNwZWNpZmljYWxseSBieSBuYW1lLgorLy8vCisvLy8gVGhlIGFjdHVhbCBpbnRlcmZhY2UgbWF5IGFsc28gYmUgcmVnaXN0ZXJlZCBhcyB3ZWxsIChieSBub3Qgc3BlY2lmeWluZyB0aGUKKy8vLyBzZWNvbmQgdGVtcGxhdGUgYXJndW1lbnQpLiAgVGhlIGludGVyZmFjZSBzaG91bGQgYmUgcmVnaXN0ZXJlZCB0byBhc3NvY2lhdGUKKy8vLyBhIG5pY2UgbmFtZSB3aXRoIHRoZSBpbnRlcmZhY2UuCitjbGFzcyBSZWdpc3RlckFHQmFzZSA6IHB1YmxpYyBQYXNzSW5mbyB7CitwdWJsaWM6CisgIFJlZ2lzdGVyQUdCYXNlKFN0cmluZ1JlZiBOYW1lLCBjb25zdCB2b2lkICpJbnRlcmZhY2VJRCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqUGFzc0lEID0gbnVsbHB0ciwgYm9vbCBpc0RlZmF1bHQgPSBmYWxzZSk7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW50ZXJmYWNlLCBib29sIERlZmF1bHQgPSBmYWxzZT4KK3N0cnVjdCBSZWdpc3RlckFuYWx5c2lzR3JvdXAgOiBwdWJsaWMgUmVnaXN0ZXJBR0Jhc2UgeworICBleHBsaWNpdCBSZWdpc3RlckFuYWx5c2lzR3JvdXAoUGFzc0luZm8gJlJQQikKKyAgICAgIDogUmVnaXN0ZXJBR0Jhc2UoUlBCLmdldFBhc3NOYW1lKCksICZJbnRlcmZhY2U6OklELCBSUEIuZ2V0VHlwZUluZm8oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgRGVmYXVsdCkge30KKworICBleHBsaWNpdCBSZWdpc3RlckFuYWx5c2lzR3JvdXAoY29uc3QgY2hhciAqTmFtZSkKKyAgICAgIDogUmVnaXN0ZXJBR0Jhc2UoTmFtZSwgJkludGVyZmFjZTo6SUQpIHt9Cit9OworCisjZGVmaW5lIElOSVRJQUxJWkVfQU5BTFlTSVNfR1JPVVAoYWdOYW1lLCBuYW1lLCBkZWZhdWx0UGFzcykgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgdm9pZCAqaW5pdGlhbGl6ZSMjYWdOYW1lIyNBbmFseXNpc0dyb3VwT25jZShQYXNzUmVnaXN0cnkgJlJlZ2lzdHJ5KSB7IFwKKyAgICBpbml0aWFsaXplIyNkZWZhdWx0UGFzcyMjUGFzcyhSZWdpc3RyeSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgUGFzc0luZm8gKkFJID0gbmV3IFBhc3NJbmZvKG5hbWUsICZhZ05hbWU6OklEKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJlZ2lzdHJ5LnJlZ2lzdGVyQW5hbHlzaXNHcm91cCgmYWdOYW1lOjpJRCwgMCwgKkFJLCBmYWxzZSwgdHJ1ZSk7ICAgICAgICAgIFwKKyAgICByZXR1cm4gQUk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgbGx2bTo6b25jZV9mbGFnIEluaXRpYWxpemUjI2FnTmFtZSMjQW5hbHlzaXNHcm91cEZsYWc7ICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBsbHZtOjppbml0aWFsaXplIyNhZ05hbWUjI0FuYWx5c2lzR3JvdXAoUGFzc1JlZ2lzdHJ5ICZSZWdpc3RyeSkgeyAgICAgICBcCisgICAgbGx2bTo6Y2FsbF9vbmNlKEluaXRpYWxpemUjI2FnTmFtZSMjQW5hbHlzaXNHcm91cEZsYWcsICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBpbml0aWFsaXplIyNhZ05hbWUjI0FuYWx5c2lzR3JvdXBPbmNlLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgc3RkOjpyZWYoUmVnaXN0cnkpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBJTklUSUFMSVpFX0FHX1BBU1MocGFzc05hbWUsIGFnTmFtZSwgYXJnLCBuYW1lLCBjZmcsIGFuYWx5c2lzLCBkZWYpICAgIFwKKyAgc3RhdGljIHZvaWQgKmluaXRpYWxpemUjI3Bhc3NOYW1lIyNQYXNzT25jZShQYXNzUmVnaXN0cnkgJlJlZ2lzdHJ5KSB7ICAgICAgICBcCisgICAgaWYgKCFkZWYpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgaW5pdGlhbGl6ZSMjYWdOYW1lIyNBbmFseXNpc0dyb3VwKFJlZ2lzdHJ5KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBQYXNzSW5mbyAqUEkgPSBuZXcgUGFzc0luZm8oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5hbWUsIGFyZywgJnBhc3NOYW1lOjpJRCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBQYXNzSW5mbzo6Tm9ybWFsQ3Rvcl90KGNhbGxEZWZhdWx0Q3RvcjxwYXNzTmFtZT4pLCBjZmcsIGFuYWx5c2lzKTsgICAgIFwKKyAgICBSZWdpc3RyeS5yZWdpc3RlclBhc3MoKlBJLCB0cnVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFBhc3NJbmZvICpBSSA9IG5ldyBQYXNzSW5mbyhuYW1lLCAmYWdOYW1lOjpJRCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSZWdpc3RyeS5yZWdpc3RlckFuYWx5c2lzR3JvdXAoJmFnTmFtZTo6SUQsICZwYXNzTmFtZTo6SUQsICpBSSwgZGVmLCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBBSTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBsbHZtOjpvbmNlX2ZsYWcgSW5pdGlhbGl6ZSMjcGFzc05hbWUjI1Bhc3NGbGFnOyAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIGxsdm06OmluaXRpYWxpemUjI3Bhc3NOYW1lIyNQYXNzKFBhc3NSZWdpc3RyeSAmUmVnaXN0cnkpIHsgICAgICAgICAgICAgIFwKKyAgICBsbHZtOjpjYWxsX29uY2UoSW5pdGlhbGl6ZSMjcGFzc05hbWUjI1Bhc3NGbGFnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemUjI3Bhc3NOYW1lIyNQYXNzT25jZSwgc3RkOjpyZWYoUmVnaXN0cnkpKTsgICAgICAgXAorICB9CisKKyNkZWZpbmUgSU5JVElBTElaRV9BR19QQVNTX0JFR0lOKHBhc3NOYW1lLCBhZ05hbWUsIGFyZywgbiwgY2ZnLCBhbmFseXNpcywgZGVmKSBcCisgIHN0YXRpYyB2b2lkICppbml0aWFsaXplIyNwYXNzTmFtZSMjUGFzc09uY2UoUGFzc1JlZ2lzdHJ5ICZSZWdpc3RyeSkgeyAgICAgICAgXAorICAgIGlmICghZGVmKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGluaXRpYWxpemUjI2FnTmFtZSMjQW5hbHlzaXNHcm91cChSZWdpc3RyeSk7CisKKyNkZWZpbmUgSU5JVElBTElaRV9BR19QQVNTX0VORChwYXNzTmFtZSwgYWdOYW1lLCBhcmcsIG4sIGNmZywgYW5hbHlzaXMsIGRlZikgICBcCisgIFBhc3NJbmZvICpQSSA9IG5ldyBQYXNzSW5mbyggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgbiwgYXJnLCAmcGFzc05hbWU6OklELCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIFBhc3NJbmZvOjpOb3JtYWxDdG9yX3QoY2FsbERlZmF1bHRDdG9yPHBhc3NOYW1lPiksIGNmZywgYW5hbHlzaXMpOyAgICAgICBcCisgIFJlZ2lzdHJ5LnJlZ2lzdGVyUGFzcygqUEksIHRydWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgUGFzc0luZm8gKkFJID0gbmV3IFBhc3NJbmZvKG4sICZhZ05hbWU6OklEKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFJlZ2lzdHJ5LnJlZ2lzdGVyQW5hbHlzaXNHcm91cCgmYWdOYW1lOjpJRCwgJnBhc3NOYW1lOjpJRCwgKkFJLCBkZWYsIHRydWUpOyAgXAorICByZXR1cm4gQUk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpYyBsbHZtOjpvbmNlX2ZsYWcgSW5pdGlhbGl6ZSMjcGFzc05hbWUjI1Bhc3NGbGFnOyAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIGxsdm06OmluaXRpYWxpemUjI3Bhc3NOYW1lIyNQYXNzKFBhc3NSZWdpc3RyeSAmUmVnaXN0cnkpIHsgICAgICAgICAgICAgIFwKKyAgICBsbHZtOjpjYWxsX29uY2UoSW5pdGlhbGl6ZSMjcGFzc05hbWUjI1Bhc3NGbGFnLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIGluaXRpYWxpemUjI3Bhc3NOYW1lIyNQYXNzT25jZSwgc3RkOjpyZWYoUmVnaXN0cnkpKTsgICAgICAgXAorICB9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8gUGFzc1JlZ2lzdHJhdGlvbkxpc3RlbmVyIGNsYXNzIC0gVGhpcyBjbGFzcyBpcyBtZWFudCB0byBiZSBkZXJpdmVkIGZyb20gYnkKKy8vLyBjbGllbnRzIHRoYXQgYXJlIGludGVyZXN0ZWQgaW4gd2hpY2ggcGFzc2VzIGdldCByZWdpc3RlcmVkIGFuZCB1bnJlZ2lzdGVyZWQKKy8vLyBhdCBydW50aW1lICh3aGljaCBjYW4gYmUgYmVjYXVzZSBvZiB0aGUgUmVnaXN0ZXJQYXNzIGNvbnN0cnVjdG9ycyBiZWluZyBydW4KKy8vLyBhcyB0aGUgcHJvZ3JhbSBzdGFydHMgdXAsIG9yIG1heSBiZSBiZWNhdXNlIGEgc2hhcmVkIG9iamVjdCBqdXN0IGdvdAorLy8vIGxvYWRlZCkuCitzdHJ1Y3QgUGFzc1JlZ2lzdHJhdGlvbkxpc3RlbmVyIHsKKyAgUGFzc1JlZ2lzdHJhdGlvbkxpc3RlbmVyKCkgPSBkZWZhdWx0OworICB2aXJ0dWFsIH5QYXNzUmVnaXN0cmF0aW9uTGlzdGVuZXIoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIENhbGxiYWNrIGZ1bmN0aW9ucyAtIFRoZXNlIGZ1bmN0aW9ucyBhcmUgaW52b2tlZCB3aGVuZXZlciBhIHBhc3MgaXMgbG9hZGVkCisgIC8vLyBvciByZW1vdmVkIGZyb20gdGhlIGN1cnJlbnQgZXhlY3V0YWJsZS4KKyAgdmlydHVhbCB2b2lkIHBhc3NSZWdpc3RlcmVkKGNvbnN0IFBhc3NJbmZvICopIHt9CisKKyAgLy8vIGVudW1lcmF0ZVBhc3NlcyAtIEl0ZXJhdGUgb3ZlciB0aGUgcmVnaXN0ZXJlZCBwYXNzZXMsIGNhbGxpbmcgdGhlCisgIC8vLyBwYXNzRW51bWVyYXRlIGNhbGxiYWNrIG9uIGVhY2ggUGFzc0luZm8gb2JqZWN0LgorICB2b2lkIGVudW1lcmF0ZVBhc3NlcygpOworCisgIC8vLyBwYXNzRW51bWVyYXRlIC0gQ2FsbGJhY2sgZnVuY3Rpb24gaW52b2tlZCB3aGVuIHNvbWVvbmUgY2FsbHMKKyAgLy8vIGVudW1lcmF0ZVBhc3NlcyBvbiB0aGlzIFBhc3NSZWdpc3RyYXRpb25MaXN0ZW5lciBvYmplY3QuCisgIHZpcnR1YWwgdm9pZCBwYXNzRW51bWVyYXRlKGNvbnN0IFBhc3NJbmZvICopIHt9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9QQVNTU1VQUE9SVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Bhc3Nlcy9QYXNzQnVpbGRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9QYXNzZXMvUGFzc0J1aWxkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWZjZGEwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9QYXNzZXMvUGFzc0J1aWxkZXIuaApAQCAtMCwwICsxLDY4NSBAQAorLy89PT0tIFBhcnNpbmcsIHNlbGVjdGlvbiwgYW5kIGNvbnN0cnVjdGlvbiBvZiBwYXNzIHBpcGVsaW5lcyAtLSotIEMrKyAtKi0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vCisvLy8gSW50ZXJmYWNlcyBmb3IgcmVnaXN0ZXJpbmcgYW5hbHlzaXMgcGFzc2VzLCBwcm9kdWNpbmcgY29tbW9uIHBhc3MgbWFuYWdlcgorLy8vIGNvbmZpZ3VyYXRpb25zLCBhbmQgcGFyc2luZyBvZiBwYXNzIHBpcGVsaW5lcy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1BBU1NFU19QQVNTQlVJTERFUl9ICisjZGVmaW5lIExMVk1fUEFTU0VTX1BBU1NCVUlMREVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9DR1NDQ1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BQYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgU3RyaW5nUmVmOworY2xhc3MgQUFNYW5hZ2VyOworY2xhc3MgVGFyZ2V0TWFjaGluZTsKKworLy8vIEEgc3RydWN0IGNhcHR1cmluZyBQR08gdHVuYWJsZXMuCitzdHJ1Y3QgUEdPT3B0aW9ucyB7CisgIFBHT09wdGlvbnMoc3RkOjpzdHJpbmcgUHJvZmlsZUdlbkZpbGUgPSAiIiwgc3RkOjpzdHJpbmcgUHJvZmlsZVVzZUZpbGUgPSAiIiwKKyAgICAgICAgICAgICBzdGQ6OnN0cmluZyBTYW1wbGVQcm9maWxlRmlsZSA9ICIiLCBib29sIFJ1blByb2ZpbGVHZW4gPSBmYWxzZSwKKyAgICAgICAgICAgICBib29sIFNhbXBsZVBHT1N1cHBvcnQgPSBmYWxzZSkKKyAgICAgIDogUHJvZmlsZUdlbkZpbGUoUHJvZmlsZUdlbkZpbGUpLCBQcm9maWxlVXNlRmlsZShQcm9maWxlVXNlRmlsZSksCisgICAgICAgIFNhbXBsZVByb2ZpbGVGaWxlKFNhbXBsZVByb2ZpbGVGaWxlKSwgUnVuUHJvZmlsZUdlbihSdW5Qcm9maWxlR2VuKSwKKyAgICAgICAgU2FtcGxlUEdPU3VwcG9ydChTYW1wbGVQR09TdXBwb3J0IHx8ICFTYW1wbGVQcm9maWxlRmlsZS5lbXB0eSgpKSB7CisgICAgYXNzZXJ0KChSdW5Qcm9maWxlR2VuIHx8CisgICAgICAgICAgICAhU2FtcGxlUHJvZmlsZUZpbGUuZW1wdHkoKSB8fAorICAgICAgICAgICAgIVByb2ZpbGVVc2VGaWxlLmVtcHR5KCkgfHwKKyAgICAgICAgICAgIFNhbXBsZVBHT1N1cHBvcnQpICYmICJJbGxlZ2FsIFBHT09wdGlvbnMuIik7CisgIH0KKyAgc3RkOjpzdHJpbmcgUHJvZmlsZUdlbkZpbGU7CisgIHN0ZDo6c3RyaW5nIFByb2ZpbGVVc2VGaWxlOworICBzdGQ6OnN0cmluZyBTYW1wbGVQcm9maWxlRmlsZTsKKyAgYm9vbCBSdW5Qcm9maWxlR2VuOworICBib29sIFNhbXBsZVBHT1N1cHBvcnQ7Cit9OworCisvLy8gXGJyaWVmIFRoaXMgY2xhc3MgcHJvdmlkZXMgYWNjZXNzIHRvIGJ1aWxkaW5nIExMVk0ncyBwYXNzZXMuCisvLy8KKy8vLyBJdCdzIG1lbWJlcnMgcHJvdmlkZSB0aGUgYmFzZWxpbmUgc3RhdGUgYXZhaWxhYmxlIHRvIHBhc3NlcyBkdXJpbmcgdGhlaXIKKy8vLyBjb25zdHJ1Y3Rpb24uIFRoZSBcYyBQYXNzUmVnaXN0cnkuZGVmIGZpbGUgc3BlY2lmaWVzIGhvdyB0byBjb25zdHJ1Y3QgYWxsCisvLy8gb2YgdGhlIGJ1aWx0LWluIHBhc3NlcywgYW5kIHRob3NlIG1heSByZWZlcmVuY2UgdGhlc2UgbWVtYmVycyBkdXJpbmcKKy8vLyBjb25zdHJ1Y3Rpb24uCitjbGFzcyBQYXNzQnVpbGRlciB7CisgIFRhcmdldE1hY2hpbmUgKlRNOworICBPcHRpb25hbDxQR09PcHRpb25zPiBQR09PcHQ7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBBIHN0cnVjdCB0byBjYXB0dXJlIHBhcnNlZCBwYXNzIHBpcGVsaW5lIG5hbWVzLgorICAvLy8KKyAgLy8vIEEgcGlwZWxpbmUgaXMgZGVmaW5lZCBhcyBhIHNlcmllcyBvZiBuYW1lcywgZWFjaCBvZiB3aGljaCBtYXkgaW4gaXRzZWxmCisgIC8vLyByZWN1cnNpdmVseSBjb250YWluIGEgbmVzdGVkIHBpcGVsaW5lLiBBIG5hbWUgaXMgZWl0aGVyIHRoZSBuYW1lIG9mIGEgcGFzcworICAvLy8gKGUuZy4gImluc3Rjb21iaW5lIikgb3IgdGhlIG5hbWUgb2YgYSBwaXBlbGluZSB0eXBlIChlLmcuICJjZ3NjYyIpLiBJZiB0aGUKKyAgLy8vIG5hbWUgaXMgdGhlIG5hbWUgb2YgYSBwYXNzLCB0aGUgSW5uZXJQaXBlbGluZSBpcyBlbXB0eSwgc2luY2UgcGFzc2VzCisgIC8vLyBjYW5ub3QgY29udGFpbiBpbm5lciBwaXBlbGluZXMuIFNlZSBwYXJzZVBhc3NQaXBlbGluZSgpIGZvciBhIG1vcmUKKyAgLy8vIGRldGFpbGVkIGRlc2NyaXB0aW9uIG9mIHRoZSB0ZXh0dWFsIHBpcGVsaW5lIGZvcm1hdC4KKyAgc3RydWN0IFBpcGVsaW5lRWxlbWVudCB7CisgICAgU3RyaW5nUmVmIE5hbWU7CisgICAgc3RkOjp2ZWN0b3I8UGlwZWxpbmVFbGVtZW50PiBJbm5lclBpcGVsaW5lOworICB9OworCisgIC8vLyBcYnJpZWYgVGhpbkxUTyBwaGFzZS4KKyAgLy8vCisgIC8vLyBUaGlzIGVudW1lcmF0ZXMgdGhlIExMVk0gVGhpbkxUTyBvcHRpbWl6YXRpb24gcGhhc2VzLgorICBlbnVtIGNsYXNzIFRoaW5MVE9QaGFzZSB7CisgICAgLy8vIE5vIFRoaW5MVE8gYmVoYXZpb3IgbmVlZGVkLgorICAgIE5vbmUsCisgICAgLy8gVGhpbkxUTyBwcmVsaW5rIChzdW1tYXJ5KSBwaGFzZS4KKyAgICBQcmVMaW5rLAorICAgIC8vIFRoaW5MVE8gcG9zdGxpbmsgKGJhY2tlbmQgY29tcGlsZSkgcGhhc2UuCisgICAgUG9zdExpbmsKKyAgfTsKKworICAvLy8gXGJyaWVmIExMVk0tcHJvdmlkZWQgaGlnaC1sZXZlbCBvcHRpbWl6YXRpb24gbGV2ZWxzLgorICAvLy8KKyAgLy8vIFRoaXMgZW51bWVyYXRlcyB0aGUgTExWTS1wcm92aWRlZCBoaWdoLWxldmVsIG9wdGltaXphdGlvbiBsZXZlbHMuIEVhY2gKKyAgLy8vIGxldmVsIGhhcyBhIHNwZWNpZmljIGdvYWwgYW5kIHJhdGlvbmFsZS4KKyAgZW51bSBPcHRpbWl6YXRpb25MZXZlbCB7CisgICAgLy8vIERpc2FibGUgYXMgbWFueSBvcHRpbWl6YXRpb25zIGFzIHBvc3NpYmxlLiBUaGlzIGRvZXNuJ3QgY29tcGxldGVseQorICAgIC8vLyBkaXNhYmxlIHRoZSBvcHRpbWl6ZXIgaW4gYWxsIGNhc2VzLCBmb3IgZXhhbXBsZSBhbHdheXNfaW5saW5lIGZ1bmN0aW9ucworICAgIC8vLyBjYW4gYmUgcmVxdWlyZWQgdG8gYmUgaW5saW5lZCBmb3IgY29ycmVjdG5lc3MuCisgICAgTzAsCisKKyAgICAvLy8gT3B0aW1pemUgcXVpY2tseSB3aXRob3V0IGRlc3Ryb3lpbmcgZGVidWdnYWJpbGl0eS4KKyAgICAvLy8KKyAgICAvLy8gRklYTUU6IFRoZSBjdXJyZW50IGFuZCBoaXN0b3JpY2FsIGJlaGF2aW9yIG9mIHRoaXMgbGV2ZWwgZG9lcyAqbm90KgorICAgIC8vLyBhZ3JlZSB3aXRoIHRoaXMgZ29hbCwgYnV0IHdlIHdvdWxkIGxpa2UgdG8gbW92ZSB0b3dhcmQgdGhpcyBnb2FsIGluIHRoZQorICAgIC8vLyBmdXR1cmUuCisgICAgLy8vCisgICAgLy8vIFRoaXMgbGV2ZWwgaXMgdHVuZWQgdG8gcHJvZHVjZSBhIHJlc3VsdCBmcm9tIHRoZSBvcHRpbWl6ZXIgYXMgcXVpY2tseQorICAgIC8vLyBhcyBwb3NzaWJsZSBhbmQgdG8gYXZvaWQgZGVzdHJveWluZyBkZWJ1Z2dhYmlsaXR5LiBUaGlzIHRlbmRzIHRvIHJlc3VsdAorICAgIC8vLyBpbiBhIHZlcnkgZ29vZCBkZXZlbG9wbWVudCBtb2RlIHdoZXJlIHRoZSBjb21waWxlZCBjb2RlIHdpbGwgYmUKKyAgICAvLy8gaW1tZWRpYXRlbHkgZXhlY3V0ZWQgYXMgcGFydCBvZiB0ZXN0aW5nLiBBcyBhIGNvbnNlcXVlbmNlLCB3aGVyZQorICAgIC8vLyBwb3NzaWJsZSwgd2Ugd291bGQgbGlrZSB0byBwcm9kdWNlIGVmZmljaWVudC10by1leGVjdXRlIGNvZGUsIGJ1dCBub3QKKyAgICAvLy8gaWYgaXQgc2lnbmlmaWNhbnRseSBzbG93cyBkb3duIGNvbXBpbGF0aW9uIG9yIHdvdWxkIHByZXZlbnQgZXZlbiBiYXNpYworICAgIC8vLyBkZWJ1Z2dpbmcgb2YgdGhlIHJlc3VsdGluZyBiaW5hcnkuCisgICAgLy8vCisgICAgLy8vIEFzIGFuIGV4YW1wbGUsIGNvbXBsZXggbG9vcCB0cmFuc2Zvcm1hdGlvbnMgc3VjaCBhcyB2ZXJzaW9uaW5nLAorICAgIC8vLyB2ZWN0b3JpemF0aW9uLCBvciBmdXNpb24gbWlnaHQgbm90IG1ha2Ugc2Vuc2UgaGVyZSBkdWUgdG8gdGhlIGRlZ3JlZSB0bworICAgIC8vLyB3aGljaCB0aGUgZXhlY3V0ZWQgY29kZSB3b3VsZCBkaWZmZXIgZnJvbSB0aGUgc291cmNlIGNvZGUsIGFuZCB0aGUKKyAgICAvLy8gcG90ZW50aWFsIGNvbXBpbGUgdGltZSBjb3N0LgorICAgIE8xLAorCisgICAgLy8vIE9wdGltaXplIGZvciBmYXN0IGV4ZWN1dGlvbiBhcyBtdWNoIGFzIHBvc3NpYmxlIHdpdGhvdXQgdHJpZ2dlcmluZworICAgIC8vLyBzaWduaWZpY2FudCBpbmNyZW1lbnRhbCBjb21waWxlIHRpbWUgb3IgY29kZSBzaXplIGdyb3d0aC4KKyAgICAvLy8KKyAgICAvLy8gVGhlIGtleSBpZGVhIGlzIHRoYXQgb3B0aW1pemF0aW9ucyBhdCB0aGlzIGxldmVsIHNob3VsZCAicGF5IGZvcgorICAgIC8vLyB0aGVtc2VsdmVzIi4gU28gaWYgYW4gb3B0aW1pemF0aW9uIGluY3JlYXNlcyBjb21waWxlIHRpbWUgYnkgNSUgb3IKKyAgICAvLy8gaW5jcmVhc2VzIGNvZGUgc2l6ZSBieSA1JSBmb3IgYSBwYXJ0aWN1bGFyIGJlbmNobWFyaywgdGhhdCBiZW5jaG1hcmsKKyAgICAvLy8gc2hvdWxkIGFsc28gYmUgb25lIHdoaWNoIHNlZXMgYSA1JSBydW50aW1lIGltcHJvdmVtZW50LiBJZiB0aGUgY29tcGlsZQorICAgIC8vLyB0aW1lIG9yIGNvZGUgc2l6ZSBwZW5hbHRpZXMgaGFwcGVuIG9uIGF2ZXJhZ2UgYWNyb3NzIGEgZGl2ZXJzZSByYW5nZSBvZgorICAgIC8vLyBMTFZNIHVzZXJzJyBiZW5jaG1hcmtzLCB0aGVuIHRoZSBpbXByb3ZlbWVudHMgc2hvdWxkIGFzIHdlbGwuCisgICAgLy8vCisgICAgLy8vIEFuZCBubyBtYXR0ZXIgd2hhdCwgdGhlIGNvbXBpbGUgdGltZSBuZWVkcyB0byBub3QgZ3JvdyBzdXBlcmxpbmVhcmx5CisgICAgLy8vIHdpdGggdGhlIHNpemUgb2YgaW5wdXQgdG8gTExWTSBzbyB0aGF0IHVzZXJzIGNhbiBjb250cm9sIHRoZSBydW50aW1lIG9mCisgICAgLy8vIHRoZSBvcHRpbWl6ZXIgaW4gdGhpcyBtb2RlLgorICAgIC8vLworICAgIC8vLyBUaGlzIGlzIGV4cGVjdGVkIHRvIGJlIGEgZ29vZCBkZWZhdWx0IG9wdGltaXphdGlvbiBsZXZlbCBmb3IgdGhlIHZhc3QKKyAgICAvLy8gbWFqb3JpdHkgb2YgdXNlcnMuCisgICAgTzIsCisKKyAgICAvLy8gT3B0aW1pemUgZm9yIGZhc3QgZXhlY3V0aW9uIGFzIG11Y2ggYXMgcG9zc2libGUuCisgICAgLy8vCisgICAgLy8vIFRoaXMgbW9kZSBpcyBzaWduaWZpY2FudGx5IG1vcmUgYWdncmVzc2l2ZSBpbiB0cmFkaW5nIG9mZiBjb21waWxlIHRpbWUKKyAgICAvLy8gYW5kIGNvZGUgc2l6ZSB0byBnZXQgZXhlY3V0aW9uIHRpbWUgaW1wcm92ZW1lbnRzLiBUaGUgY29yZSBpZGVhIGlzIHRoYXQKKyAgICAvLy8gdGhpcyBtb2RlIHNob3VsZCBpbmNsdWRlIGFueSBvcHRpbWl6YXRpb24gdGhhdCBoZWxwcyBleGVjdXRpb24gdGltZSBvbgorICAgIC8vLyBiYWxhbmNlIGFjcm9zcyBhIGRpdmVyc2UgY29sbGVjdGlvbiBvZiBiZW5jaG1hcmtzLCBldmVuIGlmIGl0IGluY3JlYXNlcworICAgIC8vLyBjb2RlIHNpemUgb3IgY29tcGlsZSB0aW1lIGZvciBzb21lIGJlbmNobWFya3Mgd2l0aG91dCBjb3JyZXNwb25kaW5nCisgICAgLy8vIGltcHJvdmVtZW50cyB0byBleGVjdXRpb24gdGltZS4KKyAgICAvLy8KKyAgICAvLy8gRGVzcGl0ZSBiZWluZyB3aWxsaW5nIHRvIHRyYWRlIG1vcmUgY29tcGlsZSB0aW1lIG9mZiB0byBnZXQgaW1wcm92ZWQKKyAgICAvLy8gZXhlY3V0aW9uIHRpbWUsIHRoaXMgbW9kZSBzdGlsbCB0cmllcyB0byBhdm9pZCBzdXBlcmxpbmVhciBncm93dGggaW4KKyAgICAvLy8gb3JkZXIgdG8gbWFrZSBldmVuIHNpZ25pZmljYW50bHkgc2xvd2VyIGNvbXBpbGUgdGltZXMgYXQgbGVhc3Qgc2NhbGUKKyAgICAvLy8gcmVhc29uYWJseS4gVGhpcyBkb2VzIG5vdCBwcmVjbHVkZSB2ZXJ5IHN1YnN0YW50aWFsIGNvbnN0YW50IGZhY3RvcgorICAgIC8vLyBjb3N0cyB0aG91Z2guCisgICAgTzMsCisKKyAgICAvLy8gU2ltaWxhciB0byBcYyBPMiBidXQgdHJpZXMgdG8gb3B0aW1pemUgZm9yIHNtYWxsIGNvZGUgc2l6ZSBpbnN0ZWFkIG9mCisgICAgLy8vIGZhc3QgZXhlY3V0aW9uIHdpdGhvdXQgdHJpZ2dlcmluZyBzaWduaWZpY2FudCBpbmNyZW1lbnRhbCBleGVjdXRpb24KKyAgICAvLy8gdGltZSBzbG93ZG93bnMuCisgICAgLy8vCisgICAgLy8vIFRoZSBsb2dpYyBoZXJlIGlzIGV4YWN0bHkgdGhlIHNhbWUgYXMgXGMgTzIsIGJ1dCB3aXRoIGNvZGUgc2l6ZSBhbmQKKyAgICAvLy8gZXhlY3V0aW9uIHRpbWUgbWV0cmljcyBzd2FwcGVkLgorICAgIC8vLworICAgIC8vLyBBIGNvbnNlcXVlbmNlIG9mIHRoZSBkaWZmZXJlbnQgY29yZSBnb2FsIGlzIHRoYXQgdGhpcyBzaG91bGQgaW4gZ2VuZXJhbAorICAgIC8vLyBwcm9kdWNlIHN1YnN0YW50aWFsbHkgc21hbGxlciBleGVjdXRhYmxlcyB0aGF0IHN0aWxsIHJ1biBpbgorICAgIC8vLyBhIHJlYXNvbmFibGUgYW1vdW50IG9mIHRpbWUuCisgICAgT3MsCisKKyAgICAvLy8gQSB2ZXJ5IHNwZWNpYWxpemVkIG1vZGUgdGhhdCB3aWxsIG9wdGltaXplIGZvciBjb2RlIHNpemUgYXQgYW55IGFuZCBhbGwKKyAgICAvLy8gY29zdHMuCisgICAgLy8vCisgICAgLy8vIFRoaXMgaXMgdXNlZnVsIHByaW1hcmlseSB3aGVuIHRoZXJlIGFyZSBhYnNvbHV0ZSBzaXplIGxpbWl0YXRpb25zIGFuZAorICAgIC8vLyBhbnkgZWZmb3J0IHRha2VuIHRvIHJlZHVjZSB0aGUgc2l6ZSBpcyB3b3J0aCBpdCByZWdhcmRsZXNzIG9mIHRoZQorICAgIC8vLyBleGVjdXRpb24gdGltZSBpbXBhY3QuIFlvdSBzaG91bGQgZXhwZWN0IHRoaXMgbGV2ZWwgdG8gcHJvZHVjZSByYXRoZXIKKyAgICAvLy8gc2xvdywgYnV0IHZlcnkgc21hbGwsIGNvZGUuCisgICAgT3oKKyAgfTsKKworICBleHBsaWNpdCBQYXNzQnVpbGRlcihUYXJnZXRNYWNoaW5lICpUTSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPFBHT09wdGlvbnM+IFBHT09wdCA9IE5vbmUpCisgICAgICA6IFRNKFRNKSwgUEdPT3B0KFBHT09wdCkge30KKworICAvLy8gXGJyaWVmIENyb3NzIHJlZ2lzdGVyIHRoZSBhbmFseXNpcyBtYW5hZ2VycyB0aHJvdWdoIHRoZWlyIHByb3hpZXMuCisgIC8vLworICAvLy8gVGhpcyBpcyBhbiBpbnRlcmZhY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBjcm9zcyByZWdpc3RlciBlYWNoCisgIC8vIEFuYWx5c2lzTWFuYWdlciB3aXRoIGFsbCB0aGUgb3RoZXJzIGFuYWx5c2lzIG1hbmFnZXJzLgorICB2b2lkIGNyb3NzUmVnaXN0ZXJQcm94aWVzKExvb3BBbmFseXNpc01hbmFnZXIgJkxBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmRkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENHU0NDQW5hbHlzaXNNYW5hZ2VyICZDR0FNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmTUFNKTsKKworICAvLy8gXGJyaWVmIFJlZ2lzdGVycyBhbGwgYXZhaWxhYmxlIG1vZHVsZSBhbmFseXNpcyBwYXNzZXMuCisgIC8vLworICAvLy8gVGhpcyBpcyBhbiBpbnRlcmZhY2UgdGhhdCBjYW4gYmUgdXNlZCB0byBwb3B1bGF0ZSBhIFxjCisgIC8vLyBNb2R1bGVBbmFseXNpc01hbmFnZXIgd2l0aCBhbGwgcmVnaXN0ZXJlZCBtb2R1bGUgYW5hbHlzZXMuIENhbGxlcnMgY2FuCisgIC8vLyBzdGlsbCBtYW51YWxseSByZWdpc3RlciBhbnkgYWRkaXRpb25hbCBhbmFseXNlcy4gQ2FsbGVycyBjYW4gYWxzbworICAvLy8gcHJlLXJlZ2lzdGVyIGFuYWx5c2VzIGFuZCB0aGlzIHdpbGwgbm90IG92ZXJyaWRlIHRob3NlLgorICB2b2lkIHJlZ2lzdGVyTW9kdWxlQW5hbHlzZXMoTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZNQU0pOworCisgIC8vLyBcYnJpZWYgUmVnaXN0ZXJzIGFsbCBhdmFpbGFibGUgQ0dTQ0MgYW5hbHlzaXMgcGFzc2VzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYW4gaW50ZXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gcG9wdWxhdGUgYSBcYyBDR1NDQ0FuYWx5c2lzTWFuYWdlcgorICAvLy8gd2l0aCBhbGwgcmVnaXN0ZXJlZCBDR1NDQyBhbmFseXNlcy4gQ2FsbGVycyBjYW4gc3RpbGwgbWFudWFsbHkgcmVnaXN0ZXIgYW55CisgIC8vLyBhZGRpdGlvbmFsIGFuYWx5c2VzLiBDYWxsZXJzIGNhbiBhbHNvIHByZS1yZWdpc3RlciBhbmFseXNlcyBhbmQgdGhpcyB3aWxsCisgIC8vLyBub3Qgb3ZlcnJpZGUgdGhvc2UuCisgIHZvaWQgcmVnaXN0ZXJDR1NDQ0FuYWx5c2VzKENHU0NDQW5hbHlzaXNNYW5hZ2VyICZDR0FNKTsKKworICAvLy8gXGJyaWVmIFJlZ2lzdGVycyBhbGwgYXZhaWxhYmxlIGZ1bmN0aW9uIGFuYWx5c2lzIHBhc3Nlcy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGFuIGludGVyZmFjZSB0aGF0IGNhbiBiZSB1c2VkIHRvIHBvcHVsYXRlIGEgXGMKKyAgLy8vIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyIHdpdGggYWxsIHJlZ2lzdGVyZWQgZnVuY3Rpb24gYW5hbHlzZXMuIENhbGxlcnMgY2FuCisgIC8vLyBzdGlsbCBtYW51YWxseSByZWdpc3RlciBhbnkgYWRkaXRpb25hbCBhbmFseXNlcy4gQ2FsbGVycyBjYW4gYWxzbworICAvLy8gcHJlLXJlZ2lzdGVyIGFuYWx5c2VzIGFuZCB0aGlzIHdpbGwgbm90IG92ZXJyaWRlIHRob3NlLgorICB2b2lkIHJlZ2lzdGVyRnVuY3Rpb25BbmFseXNlcyhGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmRkFNKTsKKworICAvLy8gXGJyaWVmIFJlZ2lzdGVycyBhbGwgYXZhaWxhYmxlIGxvb3AgYW5hbHlzaXMgcGFzc2VzLgorICAvLy8KKyAgLy8vIFRoaXMgaXMgYW4gaW50ZXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gcG9wdWxhdGUgYSBcYyBMb29wQW5hbHlzaXNNYW5hZ2VyCisgIC8vLyB3aXRoIGFsbCByZWdpc3RlcmVkIGxvb3AgYW5hbHlzZXMuIENhbGxlcnMgY2FuIHN0aWxsIG1hbnVhbGx5IHJlZ2lzdGVyIGFueQorICAvLy8gYWRkaXRpb25hbCBhbmFseXNlcy4KKyAgdm9pZCByZWdpc3Rlckxvb3BBbmFseXNlcyhMb29wQW5hbHlzaXNNYW5hZ2VyICZMQU0pOworCisgIC8vLyBDb25zdHJ1Y3QgdGhlIGNvcmUgTExWTSBmdW5jdGlvbiBjYW5vbmljYWxpemF0aW9uIGFuZCBzaW1wbGlmaWNhdGlvbgorICAvLy8gcGlwZWxpbmUuCisgIC8vLworICAvLy8gVGhpcyBpcyBhIGxvbmcgcGlwZWxpbmUgYW5kIHVzZXMgbW9zdCBvZiB0aGUgcGVyLWZ1bmN0aW9uIG9wdGltaXphdGlvbgorICAvLy8gcGFzc2VzIGluIExMVk0gdG8gY2Fub25pY2FsaXplIGFuZCBzaW1wbGlmeSB0aGUgSVIuIEl0IGlzIHN1aXRhYmxlIHRvIHJ1bgorICAvLy8gcmVwZWF0ZWRseSBvdmVyIHRoZSBJUiBhbmQgaXMgbm90IGV4cGVjdGVkIHRvIGRlc3Ryb3kgaW1wb3J0YW50CisgIC8vLyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc2VtYW50aWNzIG9mIHRoZSBJUi4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgXHAgTGV2ZWwgY2Fubm90IGJlIGBPMGAgaGVyZS4gVGhlIHBpcGVsaW5lcyBwcm9kdWNlZCBhcmUKKyAgLy8vIG9ubHkgaW50ZW5kZWQgZm9yIHVzZSB3aGVuIGF0dGVtcHRpbmcgdG8gb3B0aW1pemUgY29kZS4gSWYgZnJvbnRlbmRzCisgIC8vLyByZXF1aXJlIHNvbWUgdHJhbnNmb3JtYXRpb25zIGZvciBzZW1hbnRpYyByZWFzb25zLCB0aGV5IHNob3VsZCBleHBsaWNpdGx5CisgIC8vLyBidWlsZCB0aGVtLgorICAvLy8KKyAgLy8vIFxwIFBoYXNlIGluZGljYXRlcyB0aGUgY3VycmVudCBUaGluTFRPIHBoYXNlLgorICBGdW5jdGlvblBhc3NNYW5hZ2VyCisgIGJ1aWxkRnVuY3Rpb25TaW1wbGlmaWNhdGlvblBpcGVsaW5lKE9wdGltaXphdGlvbkxldmVsIExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGluTFRPUGhhc2UgUGhhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVidWdMb2dnaW5nID0gZmFsc2UpOworCisgIC8vLyBDb25zdHJ1Y3QgdGhlIGNvcmUgTExWTSBtb2R1bGUgY2Fub25pY2FsaXphdGlvbiBhbmQgc2ltcGxpZmljYXRpb24KKyAgLy8vIHBpcGVsaW5lLgorICAvLy8KKyAgLy8vIFRoaXMgcGlwZWxpbmUgZm9jdXNlcyBvbiBjYW5vbmljYWxpemluZyBhbmQgc2ltcGxpZnlpbmcgdGhlIGVudGlyZSBtb2R1bGUKKyAgLy8vIG9mIElSLiBNdWNoIGxpa2UgdGhlIGZ1bmN0aW9uIHNpbXBsaWZpY2F0aW9uIHBpcGVsaW5lIGFib3ZlLCBpdCBpcworICAvLy8gc3VpdGFibGUgdG8gcnVuIHJlcGVhdGVkbHkgb3ZlciB0aGUgSVIgYW5kIGlzIG5vdCBleHBlY3RlZCB0byBkZXN0cm95CisgIC8vLyBpbXBvcnRhbnQgaW5mb3JtYXRpb24uIEl0IGRvZXMsIGhvd2V2ZXIsIHBlcmZvcm0gaW5saW5pbmcgYW5kIG90aGVyCisgIC8vLyBoZXVyaXN0aWMgYmFzZWQgc2ltcGxpZmljYXRpb25zIHRoYXQgYXJlIG5vdCBzdHJpY3RseSByZXZlcnNpYmxlLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBccCBMZXZlbCBjYW5ub3QgYmUgYE8wYCBoZXJlLiBUaGUgcGlwZWxpbmVzIHByb2R1Y2VkIGFyZQorICAvLy8gb25seSBpbnRlbmRlZCBmb3IgdXNlIHdoZW4gYXR0ZW1wdGluZyB0byBvcHRpbWl6ZSBjb2RlLiBJZiBmcm9udGVuZHMKKyAgLy8vIHJlcXVpcmUgc29tZSB0cmFuc2Zvcm1hdGlvbnMgZm9yIHNlbWFudGljIHJlYXNvbnMsIHRoZXkgc2hvdWxkIGV4cGxpY2l0bHkKKyAgLy8vIGJ1aWxkIHRoZW0uCisgIC8vLworICAvLy8gXHAgUGhhc2UgaW5kaWNhdGVzIHRoZSBjdXJyZW50IFRoaW5MVE8gcGhhc2UuCisgIE1vZHVsZVBhc3NNYW5hZ2VyCisgIGJ1aWxkTW9kdWxlU2ltcGxpZmljYXRpb25QaXBlbGluZShPcHRpbWl6YXRpb25MZXZlbCBMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoaW5MVE9QaGFzZSBQaGFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVidWdMb2dnaW5nID0gZmFsc2UpOworCisgIC8vLyBDb25zdHJ1Y3QgdGhlIGNvcmUgTExWTSBtb2R1bGUgb3B0aW1pemF0aW9uIHBpcGVsaW5lLgorICAvLy8KKyAgLy8vIFRoaXMgcGlwZWxpbmUgZm9jdXNlcyBvbiBvcHRpbWl6aW5nIHRoZSBleGVjdXRpb24gc3BlZWQgb2YgdGhlIElSLiBJdAorICAvLy8gdXNlcyBjb3N0IG1vZGVsaW5nIGFuZCB0aHJlc2hvbGRzIHRvIGJhbGFuY2UgY29kZSBncm93dGggYWdhaW5zdCBydW50aW1lCisgIC8vLyBpbXByb3ZlbWVudHMuIEl0IGluY2x1ZGVzIHZlY3Rvcml6YXRpb24gYW5kIG90aGVyIGluZm9ybWF0aW9uIGRlc3Ryb3lpbmcKKyAgLy8vIHRyYW5zZm9ybWF0aW9ucy4gSXQgYWxzbyBjYW5ub3QgZ2VuZXJhbGx5IGJlIHJ1biByZXBlYXRlZGx5IG9uIGEgbW9kdWxlCisgIC8vLyB3aXRob3V0IHBvdGVudGlhbGx5IHNlcmlvdXNseSByZWdyZXNzaW5nIGVpdGhlciBydW50aW1lIHBlcmZvcm1hbmNlIG9mCisgIC8vLyB0aGUgY29kZSBvciBzZXJpb3VzIGNvZGUgc2l6ZSBncm93dGguCisgIC8vLworICAvLy8gTm90ZSB0aGF0IFxwIExldmVsIGNhbm5vdCBiZSBgTzBgIGhlcmUuIFRoZSBwaXBlbGluZXMgcHJvZHVjZWQgYXJlCisgIC8vLyBvbmx5IGludGVuZGVkIGZvciB1c2Ugd2hlbiBhdHRlbXB0aW5nIHRvIG9wdGltaXplIGNvZGUuIElmIGZyb250ZW5kcworICAvLy8gcmVxdWlyZSBzb21lIHRyYW5zZm9ybWF0aW9ucyBmb3Igc2VtYW50aWMgcmVhc29ucywgdGhleSBzaG91bGQgZXhwbGljaXRseQorICAvLy8gYnVpbGQgdGhlbS4KKyAgTW9kdWxlUGFzc01hbmFnZXIgYnVpbGRNb2R1bGVPcHRpbWl6YXRpb25QaXBlbGluZShPcHRpbWl6YXRpb25MZXZlbCBMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERlYnVnTG9nZ2luZyA9IGZhbHNlKTsKKworICAvLy8gQnVpbGQgYSBwZXItbW9kdWxlIGRlZmF1bHQgb3B0aW1pemF0aW9uIHBpcGVsaW5lLgorICAvLy8KKyAgLy8vIFRoaXMgcHJvdmlkZXMgYSBnb29kIGRlZmF1bHQgb3B0aW1pemF0aW9uIHBpcGVsaW5lIGZvciBwZXItbW9kdWxlCisgIC8vLyBvcHRpbWl6YXRpb24gYW5kIGNvZGUgZ2VuZXJhdGlvbiB3aXRob3V0IGFueSBsaW5rLXRpbWUgb3B0aW1pemF0aW9uLiBJdAorICAvLy8gdHlwaWNhbGx5IGNvcnJlc3BvbmQgdG8gZnJvbnRlbmQgIi1PWzEyM10iIG9wdGlvbnMgZm9yIG9wdGltaXphdGlvbgorICAvLy8gbGV2ZWxzIFxjIE8xLCBcYyBPMiBhbmQgXGMgTzMgcmVzcC4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgXHAgTGV2ZWwgY2Fubm90IGJlIGBPMGAgaGVyZS4gVGhlIHBpcGVsaW5lcyBwcm9kdWNlZCBhcmUKKyAgLy8vIG9ubHkgaW50ZW5kZWQgZm9yIHVzZSB3aGVuIGF0dGVtcHRpbmcgdG8gb3B0aW1pemUgY29kZS4gSWYgZnJvbnRlbmRzCisgIC8vLyByZXF1aXJlIHNvbWUgdHJhbnNmb3JtYXRpb25zIGZvciBzZW1hbnRpYyByZWFzb25zLCB0aGV5IHNob3VsZCBleHBsaWNpdGx5CisgIC8vLyBidWlsZCB0aGVtLgorICBNb2R1bGVQYXNzTWFuYWdlciBidWlsZFBlck1vZHVsZURlZmF1bHRQaXBlbGluZShPcHRpbWl6YXRpb25MZXZlbCBMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEZWJ1Z0xvZ2dpbmcgPSBmYWxzZSk7CisKKyAgLy8vIEJ1aWxkIGEgcHJlLWxpbmssIFRoaW5MVE8tdGFyZ2V0aW5nIGRlZmF1bHQgb3B0aW1pemF0aW9uIHBpcGVsaW5lIHRvCisgIC8vLyBhIHBhc3MgbWFuYWdlci4KKyAgLy8vCisgIC8vLyBUaGlzIGFkZHMgdGhlIHByZS1saW5rIG9wdGltaXphdGlvbnMgdHVuZWQgdG8gcHJlcGFyZSBhIG1vZHVsZSBmb3IKKyAgLy8vIGEgVGhpbkxUTyBydW4uIEl0IHdvcmtzIHRvIG1pbmltaXplIHRoZSBJUiB3aGljaCBuZWVkcyB0byBiZSBhbmFseXplZAorICAvLy8gd2l0aG91dCBtYWtpbmcgaXJyZXZlcnNpYmxlIGRlY2lzaW9ucyB3aGljaCBjb3VsZCBiZSBtYWRlIGJldHRlciBkdXJpbmcKKyAgLy8vIHRoZSBMVE8gcnVuLgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBccCBMZXZlbCBjYW5ub3QgYmUgYE8wYCBoZXJlLiBUaGUgcGlwZWxpbmVzIHByb2R1Y2VkIGFyZQorICAvLy8gb25seSBpbnRlbmRlZCBmb3IgdXNlIHdoZW4gYXR0ZW1wdGluZyB0byBvcHRpbWl6ZSBjb2RlLiBJZiBmcm9udGVuZHMKKyAgLy8vIHJlcXVpcmUgc29tZSB0cmFuc2Zvcm1hdGlvbnMgZm9yIHNlbWFudGljIHJlYXNvbnMsIHRoZXkgc2hvdWxkIGV4cGxpY2l0bHkKKyAgLy8vIGJ1aWxkIHRoZW0uCisgIE1vZHVsZVBhc3NNYW5hZ2VyCisgIGJ1aWxkVGhpbkxUT1ByZUxpbmtEZWZhdWx0UGlwZWxpbmUoT3B0aW1pemF0aW9uTGV2ZWwgTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEZWJ1Z0xvZ2dpbmcgPSBmYWxzZSk7CisKKyAgLy8vIEJ1aWxkIGFuIFRoaW5MVE8gZGVmYXVsdCBvcHRpbWl6YXRpb24gcGlwZWxpbmUgdG8gYSBwYXNzIG1hbmFnZXIuCisgIC8vLworICAvLy8gVGhpcyBwcm92aWRlcyBhIGdvb2QgZGVmYXVsdCBvcHRpbWl6YXRpb24gcGlwZWxpbmUgZm9yIGxpbmstdGltZQorICAvLy8gb3B0aW1pemF0aW9uIGFuZCBjb2RlIGdlbmVyYXRpb24uIEl0IGlzIHBhcnRpY3VsYXJseSB0dW5lZCB0byBmaXQgd2VsbAorICAvLy8gd2hlbiBJUiBjb21pbmcgaW50byB0aGUgTFRPIHBoYXNlIHdhcyBmaXJzdCBydW4gdGhyb3VnaCBcYworICAvLy8gYWRkUHJlTGlua0xUT0RlZmF1bHRQaXBlbGluZSwgYW5kIHRoZSB0d28gY29vcmRpbmF0ZSBjbG9zZWx5LgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBccCBMZXZlbCBjYW5ub3QgYmUgYE8wYCBoZXJlLiBUaGUgcGlwZWxpbmVzIHByb2R1Y2VkIGFyZQorICAvLy8gb25seSBpbnRlbmRlZCBmb3IgdXNlIHdoZW4gYXR0ZW1wdGluZyB0byBvcHRpbWl6ZSBjb2RlLiBJZiBmcm9udGVuZHMKKyAgLy8vIHJlcXVpcmUgc29tZSB0cmFuc2Zvcm1hdGlvbnMgZm9yIHNlbWFudGljIHJlYXNvbnMsIHRoZXkgc2hvdWxkIGV4cGxpY2l0bHkKKyAgLy8vIGJ1aWxkIHRoZW0uCisgIE1vZHVsZVBhc3NNYW5hZ2VyIGJ1aWxkVGhpbkxUT0RlZmF1bHRQaXBlbGluZShPcHRpbWl6YXRpb25MZXZlbCBMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVidWdMb2dnaW5nID0gZmFsc2UpOworCisgIC8vLyBCdWlsZCBhIHByZS1saW5rLCBMVE8tdGFyZ2V0aW5nIGRlZmF1bHQgb3B0aW1pemF0aW9uIHBpcGVsaW5lIHRvIGEgcGFzcworICAvLy8gbWFuYWdlci4KKyAgLy8vCisgIC8vLyBUaGlzIGFkZHMgdGhlIHByZS1saW5rIG9wdGltaXphdGlvbnMgdHVuZWQgdG8gd29yayB3ZWxsIHdpdGggYSBsYXRlciBMVE8KKyAgLy8vIHJ1bi4gSXQgd29ya3MgdG8gbWluaW1pemUgdGhlIElSIHdoaWNoIG5lZWRzIHRvIGJlIGFuYWx5emVkIHdpdGhvdXQKKyAgLy8vIG1ha2luZyBpcnJldmVyc2libGUgZGVjaXNpb25zIHdoaWNoIGNvdWxkIGJlIG1hZGUgYmV0dGVyIGR1cmluZyB0aGUgTFRPCisgIC8vLyBydW4uCisgIC8vLworICAvLy8gTm90ZSB0aGF0IFxwIExldmVsIGNhbm5vdCBiZSBgTzBgIGhlcmUuIFRoZSBwaXBlbGluZXMgcHJvZHVjZWQgYXJlCisgIC8vLyBvbmx5IGludGVuZGVkIGZvciB1c2Ugd2hlbiBhdHRlbXB0aW5nIHRvIG9wdGltaXplIGNvZGUuIElmIGZyb250ZW5kcworICAvLy8gcmVxdWlyZSBzb21lIHRyYW5zZm9ybWF0aW9ucyBmb3Igc2VtYW50aWMgcmVhc29ucywgdGhleSBzaG91bGQgZXhwbGljaXRseQorICAvLy8gYnVpbGQgdGhlbS4KKyAgTW9kdWxlUGFzc01hbmFnZXIgYnVpbGRMVE9QcmVMaW5rRGVmYXVsdFBpcGVsaW5lKE9wdGltaXphdGlvbkxldmVsIExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEZWJ1Z0xvZ2dpbmcgPSBmYWxzZSk7CisKKyAgLy8vIEJ1aWxkIGFuIExUTyBkZWZhdWx0IG9wdGltaXphdGlvbiBwaXBlbGluZSB0byBhIHBhc3MgbWFuYWdlci4KKyAgLy8vCisgIC8vLyBUaGlzIHByb3ZpZGVzIGEgZ29vZCBkZWZhdWx0IG9wdGltaXphdGlvbiBwaXBlbGluZSBmb3IgbGluay10aW1lCisgIC8vLyBvcHRpbWl6YXRpb24gYW5kIGNvZGUgZ2VuZXJhdGlvbi4gSXQgaXMgcGFydGljdWxhcmx5IHR1bmVkIHRvIGZpdCB3ZWxsCisgIC8vLyB3aGVuIElSIGNvbWluZyBpbnRvIHRoZSBMVE8gcGhhc2Ugd2FzIGZpcnN0IHJ1biB0aHJvdWdoIFxjCisgIC8vLyBhZGRQcmVMaW5rTFRPRGVmYXVsdFBpcGVsaW5lLCBhbmQgdGhlIHR3byBjb29yZGluYXRlIGNsb3NlbHkuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IFxwIExldmVsIGNhbm5vdCBiZSBgTzBgIGhlcmUuIFRoZSBwaXBlbGluZXMgcHJvZHVjZWQgYXJlCisgIC8vLyBvbmx5IGludGVuZGVkIGZvciB1c2Ugd2hlbiBhdHRlbXB0aW5nIHRvIG9wdGltaXplIGNvZGUuIElmIGZyb250ZW5kcworICAvLy8gcmVxdWlyZSBzb21lIHRyYW5zZm9ybWF0aW9ucyBmb3Igc2VtYW50aWMgcmVhc29ucywgdGhleSBzaG91bGQgZXhwbGljaXRseQorICAvLy8gYnVpbGQgdGhlbS4KKyAgTW9kdWxlUGFzc01hbmFnZXIgYnVpbGRMVE9EZWZhdWx0UGlwZWxpbmUoT3B0aW1pemF0aW9uTGV2ZWwgTGV2ZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGVidWdMb2dnaW5nID0gZmFsc2UpOworCisgIC8vLyBCdWlsZCB0aGUgZGVmYXVsdCBgQUFNYW5hZ2VyYCB3aXRoIHRoZSBkZWZhdWx0IGFsaWFzIGFuYWx5c2lzIHBpcGVsaW5lCisgIC8vLyByZWdpc3RlcmVkLgorICBBQU1hbmFnZXIgYnVpbGREZWZhdWx0QUFQaXBlbGluZSgpOworCisgIC8vLyBcYnJpZWYgUGFyc2UgYSB0ZXh0dWFsIHBhc3MgcGlwZWxpbmUgZGVzY3JpcHRpb24gaW50byBhIFxjCisgIC8vLyBNb2R1bGVQYXNzTWFuYWdlci4KKyAgLy8vCisgIC8vLyBUaGUgZm9ybWF0IG9mIHRoZSB0ZXh0dWFsIHBhc3MgcGlwZWxpbmUgZGVzY3JpcHRpb24gbG9va3Mgc29tZXRoaW5nIGxpa2U6CisgIC8vLworICAvLy8gICBtb2R1bGUoZnVuY3Rpb24oaW5zdGNvbWJpbmUsc3JvYSksZGNlLGNnc2NjKGlubGluZXIsZnVuY3Rpb24oLi4uKSksLi4uKQorICAvLy8KKyAgLy8vIFBhc3MgbWFuYWdlcnMgaGF2ZSAoKXMgZGVzY3JpYmluZyB0aGUgbmVzdCBzdHJ1Y3R1cmUgb2YgcGFzc2VzLiBBbGwgcGFzc2VzCisgIC8vLyBhcmUgY29tbWEgc2VwYXJhdGVkLiBBcyBhIHNwZWNpYWwgc2hvcnRjdXQsIGlmIHRoZSB2ZXJ5IGZpcnN0IHBhc3MgaXMgbm90CisgIC8vLyBhIG1vZHVsZSBwYXNzIChhcyBhIG1vZHVsZSBwYXNzIG1hbmFnZXIgaXMpLCB0aGlzIHdpbGwgYXV0b21hdGljYWxseSBmb3JtCisgIC8vLyB0aGUgc2hvcnRlc3Qgc3RhY2sgb2YgcGFzcyBtYW5hZ2VycyB0aGF0IGFsbG93IGluc2VydGluZyB0aGF0IGZpcnN0IHBhc3MuCisgIC8vLyBTbywgYXNzdW1pbmcgZnVuY3Rpb24gcGFzc2VzICdmcGFzc04nLCBDR1NDQyBwYXNzZXMgJ2NncGFzc04nLCBhbmQgbG9vcAorICAvLy8gcGFzc2VzICdscGFzc04nLCBhbGwgb2YgdGhlc2UgYXJlIHZhbGlkOgorICAvLy8KKyAgLy8vICAgZnBhc3MxLGZwYXNzMixmcGFzczMKKyAgLy8vICAgY2dwYXNzMSxjZ3Bhc3MyLGNncGFzczMKKyAgLy8vICAgbHBhc3MxLGxwYXNzMixscGFzczMKKyAgLy8vCisgIC8vLyBBbmQgdGhleSBhcmUgZXF1aXZhbGVudCB0byB0aGUgZm9sbG93aW5nIChyZXNwLik6CisgIC8vLworICAvLy8gICBtb2R1bGUoZnVuY3Rpb24oZnBhc3MxLGZwYXNzMixmcGFzczMpKQorICAvLy8gICBtb2R1bGUoY2dzY2MoY2dwYXNzMSxjZ3Bhc3MyLGNncGFzczMpKQorICAvLy8gICBtb2R1bGUoZnVuY3Rpb24obG9vcChscGFzczEsbHBhc3MyLGxwYXNzMykpKQorICAvLy8KKyAgLy8vIFRoaXMgc2hvcnRjdXQgaXMgZXNwZWNpYWxseSB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgdGVzdGluZyBzbWFsbCBwYXNzCisgIC8vLyBjb21iaW5hdGlvbnMuIE5vdGUgdGhhdCB0aGVzZSBzaG9ydGN1dHMgZG9uJ3QgaW50cm9kdWNlIGFueSBvdGhlciBtYWdpYy4KKyAgLy8vIElmIHRoZSBzZXF1ZW5jZSBvZiBwYXNzZXMgYXJlbid0IGFsbCB0aGUgZXhhY3Qgc2FtZSBraW5kIG9mIHBhc3MsIGl0IHdpbGwKKyAgLy8vIGJlIGFuIGVycm9yLiBZb3UgY2Fubm90IG1peCBkaWZmZXJlbnQgbGV2ZWxzIGltcGxpY2l0bHksIHlvdSBtdXN0CisgIC8vLyBleHBsaWNpdGx5IGZvcm0gYSBwYXNzIG1hbmFnZXIgaW4gd2hpY2ggdG8gbmVzdCBwYXNzZXMuCisgIGJvb2wgcGFyc2VQYXNzUGlwZWxpbmUoTW9kdWxlUGFzc01hbmFnZXIgJk1QTSwgU3RyaW5nUmVmIFBpcGVsaW5lVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFZlcmlmeUVhY2hQYXNzID0gdHJ1ZSwgYm9vbCBEZWJ1Z0xvZ2dpbmcgPSBmYWxzZSk7CisKKyAgLy8vIHt7QCBQYXJzZSBhIHRleHR1YWwgcGFzcyBwaXBlbGluZSBkZXNjcmlwdGlvbiBpbnRvIGEgc3BlY2lmaWMgUGFzc01hbmFnZXIKKyAgLy8vCisgIC8vLyBBdXRvbWF0aWMgZGVkdWN0aW9uIG9mIGFuIGFwcHJvcHJpYXRlIHBhc3MgbWFuYWdlciBzdGFjayBpcyBub3Qgc3VwcG9ydGVkLgorICAvLy8gRm9yIGV4YW1wbGUsIHRvIGluc2VydCBhIGxvb3AgcGFzcyAnbHBhc3MnIGludG8gYSBGdW5jdGlub1Bhc3NNYW5hZ2VyLAorICAvLy8gdGhpcyBpcyB0aGUgdmFsaWQgcGlwZWxpbmUgdGV4dDoKKyAgLy8vCisgIC8vLyAgIGZ1bmN0aW9uKGxwYXNzKQorICBib29sIHBhcnNlUGFzc1BpcGVsaW5lKENHU0NDUGFzc01hbmFnZXIgJkNHUE0sIFN0cmluZ1JlZiBQaXBlbGluZVRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBWZXJpZnlFYWNoUGFzcyA9IHRydWUsIGJvb2wgRGVidWdMb2dnaW5nID0gZmFsc2UpOworICBib29sIHBhcnNlUGFzc1BpcGVsaW5lKEZ1bmN0aW9uUGFzc01hbmFnZXIgJkZQTSwgU3RyaW5nUmVmIFBpcGVsaW5lVGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFZlcmlmeUVhY2hQYXNzID0gdHJ1ZSwgYm9vbCBEZWJ1Z0xvZ2dpbmcgPSBmYWxzZSk7CisgIGJvb2wgcGFyc2VQYXNzUGlwZWxpbmUoTG9vcFBhc3NNYW5hZ2VyICZMUE0sIFN0cmluZ1JlZiBQaXBlbGluZVRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBWZXJpZnlFYWNoUGFzcyA9IHRydWUsIGJvb2wgRGVidWdMb2dnaW5nID0gZmFsc2UpOworICAvLy8gQH19CisKKyAgLy8vIFBhcnNlIGEgdGV4dHVhbCBhbGlhcyBhbmFseXNpcyBwaXBlbGluZSBpbnRvIHRoZSBwcm92aWRlZCBBQSBtYW5hZ2VyLgorICAvLy8KKyAgLy8vIFRoZSBmb3JtYXQgb2YgdGhlIHRleHR1YWwgQUEgcGlwZWxpbmUgaXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBBQQorICAvLy8gcGFzcyBuYW1lczoKKyAgLy8vCisgIC8vLyAgIGJhc2ljLWFhLGdsb2JhbHMtYWEsLi4uCisgIC8vLworICAvLy8gVGhlIEFBIG1hbmFnZXIgaXMgc2V0IHVwIHN1Y2ggdGhhdCB0aGUgcHJvdmlkZWQgYWxpYXMgYW5hbHlzZXMgYXJlIHRyaWVkCisgIC8vLyBpbiB0aGUgb3JkZXIgc3BlY2lmaWVkLiBTZWUgdGhlIFxjIEFBTWFuYWFnZXIgZG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscworICAvLy8gYWJvdXQgdGhlIGxvZ2ljIHVzZWQuIFRoaXMgcm91dGluZSBqdXN0IHByb3ZpZGVzIHRoZSB0ZXh0dWFsIG1hcHBpbmcKKyAgLy8vIGJldHdlZW4gQUEgbmFtZXMgYW5kIHRoZSBhbmFseXNlcyB0byByZWdpc3RlciB3aXRoIHRoZSBtYW5hZ2VyLgorICAvLy8KKyAgLy8vIFJldHVybnMgZmFsc2UgaWYgdGhlIHRleHQgY2Fubm90IGJlIHBhcnNlZCBjbGVhbmx5LiBUaGUgc3BlY2lmaWMgc3RhdGUgb2YKKyAgLy8vIHRoZSBccCBBQSBtYW5hZ2VyIGlzIHVuc3BlY2lmaWVkIGlmIHN1Y2ggYW4gZXJyb3IgaXMgZW5jb3VudGVyZWQgYW5kIHRoaXMKKyAgLy8vIHJldHVybnMgZmFsc2UuCisgIGJvb2wgcGFyc2VBQVBpcGVsaW5lKEFBTWFuYWdlciAmQUEsIFN0cmluZ1JlZiBQaXBlbGluZVRleHQpOworCisgIC8vLyBcYnJpZWYgUmVnaXN0ZXIgYSBjYWxsYmFjayBmb3IgYSBkZWZhdWx0IG9wdGltaXplciBwaXBlbGluZSBleHRlbnNpb24KKyAgLy8vIHBvaW50CisgIC8vLworICAvLy8gVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGFkZGluZyBwYXNzZXMgdGhhdCBwZXJmb3JtIHBlZXBob2xlCisgIC8vLyBvcHRpbWl6YXRpb25zIHNpbWlsYXIgdG8gdGhlIGluc3RydWN0aW9uIGNvbWJpbmVyLiBUaGVzZSBwYXNzZXMgd2lsbCBiZQorICAvLy8gaW5zZXJ0ZWQgYWZ0ZXIgZWFjaCBpbnN0YW5jZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gY29tYmluZXIgcGFzcy4KKyAgdm9pZCByZWdpc3RlclBlZXBob2xlRVBDYWxsYmFjaygKKyAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChGdW5jdGlvblBhc3NNYW5hZ2VyICYsIE9wdGltaXphdGlvbkxldmVsKT4gJkMpIHsKKyAgICBQZWVwaG9sZUVQQ2FsbGJhY2tzLnB1c2hfYmFjayhDKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVnaXN0ZXIgYSBjYWxsYmFjayBmb3IgYSBkZWZhdWx0IG9wdGltaXplciBwaXBlbGluZSBleHRlbnNpb24KKyAgLy8vIHBvaW50CisgIC8vLworICAvLy8gVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGFkZGluZyBsYXRlIGxvb3AgY2Fub25pY2FsaXphdGlvbiBhbmQKKyAgLy8vIHNpbXBsaWZpY2F0aW9uIHBhc3Nlcy4gVGhpcyBpcyB0aGUgbGFzdCBwb2ludCBpbiB0aGUgbG9vcCBvcHRpbWl6YXRpb24KKyAgLy8vIHBpcGVsaW5lIGJlZm9yZSBsb29wIGRlbGV0aW9uLiBFYWNoIHBhc3MgYWRkZWQKKyAgLy8vIGhlcmUgbXVzdCBiZSBhbiBpbnN0YW5jZSBvZiBMb29wUGFzcy4KKyAgLy8vIFRoaXMgaXMgdGhlIHBsYWNlIHRvIGFkZCBwYXNzZXMgdGhhdCBjYW4gcmVtb3ZlIGxvb3BzLCBzdWNoIGFzIHRhcmdldC0KKyAgLy8vIHNwZWNpZmljIGxvb3AgaWRpb20gcmVjb2duaXRpb24uCisgIHZvaWQgcmVnaXN0ZXJMYXRlTG9vcE9wdGltaXphdGlvbnNFUENhbGxiYWNrKAorICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKExvb3BQYXNzTWFuYWdlciAmLCBPcHRpbWl6YXRpb25MZXZlbCk+ICZDKSB7CisgICAgTGF0ZUxvb3BPcHRpbWl6YXRpb25zRVBDYWxsYmFja3MucHVzaF9iYWNrKEMpOworICB9CisKKyAgLy8vIFxicmllZiBSZWdpc3RlciBhIGNhbGxiYWNrIGZvciBhIGRlZmF1bHQgb3B0aW1pemVyIHBpcGVsaW5lIGV4dGVuc2lvbgorICAvLy8gcG9pbnQKKyAgLy8vCisgIC8vLyBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYWRkaW5nIGxvb3AgcGFzc2VzIHRvIHRoZSBlbmQgb2YgdGhlIGxvb3AKKyAgLy8vIG9wdGltaXplci4KKyAgdm9pZCByZWdpc3Rlckxvb3BPcHRpbWl6ZXJFbmRFUENhbGxiYWNrKAorICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKExvb3BQYXNzTWFuYWdlciAmLCBPcHRpbWl6YXRpb25MZXZlbCk+ICZDKSB7CisgICAgTG9vcE9wdGltaXplckVuZEVQQ2FsbGJhY2tzLnB1c2hfYmFjayhDKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVnaXN0ZXIgYSBjYWxsYmFjayBmb3IgYSBkZWZhdWx0IG9wdGltaXplciBwaXBlbGluZSBleHRlbnNpb24KKyAgLy8vIHBvaW50CisgIC8vLworICAvLy8gVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGFkZGluZyBvcHRpbWl6YXRpb24gcGFzc2VzIGFmdGVyIG1vc3Qgb2YgdGhlCisgIC8vLyBtYWluIG9wdGltaXphdGlvbnMsIGJ1dCBiZWZvcmUgdGhlIGxhc3QgY2xlYW51cC1pc2ggb3B0aW1pemF0aW9ucy4KKyAgdm9pZCByZWdpc3RlclNjYWxhck9wdGltaXplckxhdGVFUENhbGxiYWNrKAorICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKEZ1bmN0aW9uUGFzc01hbmFnZXIgJiwgT3B0aW1pemF0aW9uTGV2ZWwpPiAmQykgeworICAgIFNjYWxhck9wdGltaXplckxhdGVFUENhbGxiYWNrcy5wdXNoX2JhY2soQyk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZm9yIGEgZGVmYXVsdCBvcHRpbWl6ZXIgcGlwZWxpbmUgZXh0ZW5zaW9uCisgIC8vLyBwb2ludAorICAvLy8KKyAgLy8vIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhZGRpbmcgQ2FsbEdyYXBoU0NDIHBhc3NlcyBhdCB0aGUgZW5kIG9mIHRoZQorICAvLy8gbWFpbiBDYWxsR3JhcGhTQ0MgcGFzc2VzIGFuZCBiZWZvcmUgYW55IGZ1bmN0aW9uIHNpbXBsaWZpY2F0aW9uIHBhc3NlcyBydW4KKyAgLy8vIGJ5IENHUGFzc01hbmFnZXIuCisgIHZvaWQgcmVnaXN0ZXJDR1NDQ09wdGltaXplckxhdGVFUENhbGxiYWNrKAorICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKENHU0NDUGFzc01hbmFnZXIgJiwgT3B0aW1pemF0aW9uTGV2ZWwpPiAmQykgeworICAgIENHU0NDT3B0aW1pemVyTGF0ZUVQQ2FsbGJhY2tzLnB1c2hfYmFjayhDKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmVnaXN0ZXIgYSBjYWxsYmFjayBmb3IgYSBkZWZhdWx0IG9wdGltaXplciBwaXBlbGluZSBleHRlbnNpb24KKyAgLy8vIHBvaW50CisgIC8vLworICAvLy8gVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGFkZGluZyBvcHRpbWl6YXRpb24gcGFzc2VzIGJlZm9yZSB0aGUKKyAgLy8vIHZlY3Rvcml6ZXIgYW5kIG90aGVyIGhpZ2hseSB0YXJnZXQgc3BlY2lmaWMgb3B0aW1pemF0aW9uIHBhc3NlcyBhcmUKKyAgLy8vIGV4ZWN1dGVkLgorICB2b2lkIHJlZ2lzdGVyVmVjdG9yaXplclN0YXJ0RVBDYWxsYmFjaygKKyAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChGdW5jdGlvblBhc3NNYW5hZ2VyICYsIE9wdGltaXphdGlvbkxldmVsKT4gJkMpIHsKKyAgICBWZWN0b3JpemVyU3RhcnRFUENhbGxiYWNrcy5wdXNoX2JhY2soQyk7CisgIH0KKworICAvLy8gUmVnaXN0ZXIgYSBjYWxsYmFjayBmb3IgYSBkZWZhdWx0IG9wdGltaXplciBwaXBlbGluZSBleHRlbnNpb24gcG9pbnQuCisgIC8vLworICAvLy8gVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGFkZGluZyBvcHRpbWl6YXRpb24gb25jZSBhdCB0aGUgc3RhcnQgb2YgdGhlCisgIC8vLyBwaXBlbGluZS4gVGhpcyBkb2VzIG5vdCBhcHBseSB0byAnYmFja2VuZCcgY29tcGlsZXMgKExUTyBhbmQgVGhpbkxUTworICAvLy8gbGluay10aW1lIHBpcGVsaW5lcykuCisgIHZvaWQgcmVnaXN0ZXJQaXBlbGluZVN0YXJ0RVBDYWxsYmFjaygKKyAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248dm9pZChNb2R1bGVQYXNzTWFuYWdlciAmKT4gJkMpIHsKKyAgICBQaXBlbGluZVN0YXJ0RVBDYWxsYmFja3MucHVzaF9iYWNrKEMpOworICB9CisKKyAgLy8vIFxicmllZiBSZWdpc3RlciBhIGNhbGxiYWNrIGZvciBwYXJzaW5nIGFuIEFsaWFzQW5hbHlzaXMgTmFtZSB0byBwb3B1bGF0ZQorICAvLy8gdGhlIGdpdmVuIEFBTWFuYWdlciBccCBBQQorICB2b2lkIHJlZ2lzdGVyUGFyc2VBQUNhbGxiYWNrKAorICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjxib29sKFN0cmluZ1JlZiBOYW1lLCBBQU1hbmFnZXIgJkFBKT4gJkMpIHsKKyAgICBBQVBhcnNpbmdDYWxsYmFja3MucHVzaF9iYWNrKEMpOworICB9CisKKyAgLy8vIHt7QCBSZWdpc3RlciBjYWxsYmFja3MgZm9yIGFuYWx5c2lzIHJlZ2lzdHJhdGlvbiB3aXRoIHRoaXMgUGFzc0J1aWxkZXIKKyAgLy8vIGluc3RhbmNlLgorICAvLy8gQ2FsbGVlcyByZWdpc3RlciB0aGVpciBhbmFseXNlcyB3aXRoIHRoZSBnaXZlbiBBbmFseXNpc01hbmFnZXIgb2JqZWN0cy4KKyAgdm9pZCByZWdpc3RlckFuYWx5c2lzUmVnaXN0cmF0aW9uQ2FsbGJhY2soCisgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoQ0dTQ0NBbmFseXNpc01hbmFnZXIgJik+ICZDKSB7CisgICAgQ0dTQ0NBbmFseXNpc1JlZ2lzdHJhdGlvbkNhbGxiYWNrcy5wdXNoX2JhY2soQyk7CisgIH0KKyAgdm9pZCByZWdpc3RlckFuYWx5c2lzUmVnaXN0cmF0aW9uQ2FsbGJhY2soCisgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJik+ICZDKSB7CisgICAgRnVuY3Rpb25BbmFseXNpc1JlZ2lzdHJhdGlvbkNhbGxiYWNrcy5wdXNoX2JhY2soQyk7CisgIH0KKyAgdm9pZCByZWdpc3RlckFuYWx5c2lzUmVnaXN0cmF0aW9uQ2FsbGJhY2soCisgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPHZvaWQoTG9vcEFuYWx5c2lzTWFuYWdlciAmKT4gJkMpIHsKKyAgICBMb29wQW5hbHlzaXNSZWdpc3RyYXRpb25DYWxsYmFja3MucHVzaF9iYWNrKEMpOworICB9CisgIHZvaWQgcmVnaXN0ZXJBbmFseXNpc1JlZ2lzdHJhdGlvbkNhbGxiYWNrKAorICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjx2b2lkKE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmKT4gJkMpIHsKKyAgICBNb2R1bGVBbmFseXNpc1JlZ2lzdHJhdGlvbkNhbGxiYWNrcy5wdXNoX2JhY2soQyk7CisgIH0KKyAgLy8vIEB9fQorCisgIC8vLyB7e0AgUmVnaXN0ZXIgcGlwZWxpbmUgcGFyc2luZyBjYWxsYmFja3Mgd2l0aCB0aGlzIHBhc3MgYnVpbGRlciBpbnN0YW5jZS4KKyAgLy8vIFVzaW5nIHRoZXNlIGNhbGxiYWNrcywgY2FsbGVycyBjYW4gcGFyc2UgYm90aCBhIHNpbmdsZSBwYXNzIG5hbWUsIGFzIHdlbGwKKyAgLy8vIGFzIGVudGlyZSBzdWItcGlwZWxpbmVzLCBhbmQgcG9wdWxhdGUgdGhlIFBhc3NNYW5hZ2VyIGluc3RhbmNlCisgIC8vLyBhY2NvcmRpbmdseS4KKyAgdm9pZCByZWdpc3RlclBpcGVsaW5lUGFyc2luZ0NhbGxiYWNrKAorICAgICAgY29uc3Qgc3RkOjpmdW5jdGlvbjxib29sKFN0cmluZ1JlZiBOYW1lLCBDR1NDQ1Bhc3NNYW5hZ2VyICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGlwZWxpbmVFbGVtZW50Pik+ICZDKSB7CisgICAgQ0dTQ0NQaXBlbGluZVBhcnNpbmdDYWxsYmFja3MucHVzaF9iYWNrKEMpOworICB9CisgIHZvaWQgcmVnaXN0ZXJQaXBlbGluZVBhcnNpbmdDYWxsYmFjaygKKyAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248Ym9vbChTdHJpbmdSZWYgTmFtZSwgRnVuY3Rpb25QYXNzTWFuYWdlciAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBpcGVsaW5lRWxlbWVudD4pPiAmQykgeworICAgIEZ1bmN0aW9uUGlwZWxpbmVQYXJzaW5nQ2FsbGJhY2tzLnB1c2hfYmFjayhDKTsKKyAgfQorICB2b2lkIHJlZ2lzdGVyUGlwZWxpbmVQYXJzaW5nQ2FsbGJhY2soCisgICAgICBjb25zdCBzdGQ6OmZ1bmN0aW9uPGJvb2woU3RyaW5nUmVmIE5hbWUsIExvb3BQYXNzTWFuYWdlciAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBpcGVsaW5lRWxlbWVudD4pPiAmQykgeworICAgIExvb3BQaXBlbGluZVBhcnNpbmdDYWxsYmFja3MucHVzaF9iYWNrKEMpOworICB9CisgIHZvaWQgcmVnaXN0ZXJQaXBlbGluZVBhcnNpbmdDYWxsYmFjaygKKyAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248Ym9vbChTdHJpbmdSZWYgTmFtZSwgTW9kdWxlUGFzc01hbmFnZXIgJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQaXBlbGluZUVsZW1lbnQ+KT4gJkMpIHsKKyAgICBNb2R1bGVQaXBlbGluZVBhcnNpbmdDYWxsYmFja3MucHVzaF9iYWNrKEMpOworICB9CisgIC8vLyBAfX0KKworICAvLy8gXGJyaWVmIFJlZ2lzdGVyIGEgY2FsbGJhY2sgZm9yIGEgdG9wLWxldmVsIHBpcGVsaW5lIGVudHJ5LgorICAvLy8KKyAgLy8vIElmIHRoZSBQYXNzTWFuYWdlciB0eXBlIGlzIG5vdCBnaXZlbiBhdCB0aGUgdG9wIGxldmVsIG9mIHRoZSBwaXBlbGluZQorICAvLy8gdGV4dCwgdGhpcyBDYWxsYmFjayBzaG91bGQgYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGFwcHJvcHJpYXRlIHN0YWNrIG9mCisgIC8vLyBQYXNzTWFuYWdlcnMgYW5kIHBvcHVsYXRlIHRoZSBwYXNzZWQgTW9kdWxlUGFzc01hbmFnZXIuCisgIHZvaWQgcmVnaXN0ZXJQYXJzZVRvcExldmVsUGlwZWxpbmVDYWxsYmFjaygKKyAgICAgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248Ym9vbChNb2R1bGVQYXNzTWFuYWdlciAmLCBBcnJheVJlZjxQaXBlbGluZUVsZW1lbnQ+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVmVyaWZ5RWFjaFBhc3MsIGJvb2wgRGVidWdMb2dnaW5nKT4gJkMpIHsKKyAgICBUb3BMZXZlbFBpcGVsaW5lUGFyc2luZ0NhbGxiYWNrcy5wdXNoX2JhY2soQyk7CisgIH0KKworcHJpdmF0ZToKKyAgc3RhdGljIE9wdGlvbmFsPHN0ZDo6dmVjdG9yPFBpcGVsaW5lRWxlbWVudD4+CisgIHBhcnNlUGlwZWxpbmVUZXh0KFN0cmluZ1JlZiBUZXh0KTsKKworICBib29sIHBhcnNlTW9kdWxlUGFzcyhNb2R1bGVQYXNzTWFuYWdlciAmTVBNLCBjb25zdCBQaXBlbGluZUVsZW1lbnQgJkUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVmVyaWZ5RWFjaFBhc3MsIGJvb2wgRGVidWdMb2dnaW5nKTsKKyAgYm9vbCBwYXJzZUNHU0NDUGFzcyhDR1NDQ1Bhc3NNYW5hZ2VyICZDR1BNLCBjb25zdCBQaXBlbGluZUVsZW1lbnQgJkUsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBWZXJpZnlFYWNoUGFzcywgYm9vbCBEZWJ1Z0xvZ2dpbmcpOworICBib29sIHBhcnNlRnVuY3Rpb25QYXNzKEZ1bmN0aW9uUGFzc01hbmFnZXIgJkZQTSwgY29uc3QgUGlwZWxpbmVFbGVtZW50ICZFLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBWZXJpZnlFYWNoUGFzcywgYm9vbCBEZWJ1Z0xvZ2dpbmcpOworICBib29sIHBhcnNlTG9vcFBhc3MoTG9vcFBhc3NNYW5hZ2VyICZMUE0sIGNvbnN0IFBpcGVsaW5lRWxlbWVudCAmRSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgVmVyaWZ5RWFjaFBhc3MsIGJvb2wgRGVidWdMb2dnaW5nKTsKKyAgYm9vbCBwYXJzZUFBUGFzc05hbWUoQUFNYW5hZ2VyICZBQSwgU3RyaW5nUmVmIE5hbWUpOworCisgIGJvb2wgcGFyc2VMb29wUGFzc1BpcGVsaW5lKExvb3BQYXNzTWFuYWdlciAmTFBNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQaXBlbGluZUVsZW1lbnQ+IFBpcGVsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFZlcmlmeUVhY2hQYXNzLCBib29sIERlYnVnTG9nZ2luZyk7CisgIGJvb2wgcGFyc2VGdW5jdGlvblBhc3NQaXBlbGluZShGdW5jdGlvblBhc3NNYW5hZ2VyICZGUE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQaXBlbGluZUVsZW1lbnQ+IFBpcGVsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBWZXJpZnlFYWNoUGFzcywgYm9vbCBEZWJ1Z0xvZ2dpbmcpOworICBib29sIHBhcnNlQ0dTQ0NQYXNzUGlwZWxpbmUoQ0dTQ0NQYXNzTWFuYWdlciAmQ0dQTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBpcGVsaW5lRWxlbWVudD4gUGlwZWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFZlcmlmeUVhY2hQYXNzLCBib29sIERlYnVnTG9nZ2luZyk7CisgIGJvb2wgcGFyc2VNb2R1bGVQYXNzUGlwZWxpbmUoTW9kdWxlUGFzc01hbmFnZXIgJk1QTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQaXBlbGluZUVsZW1lbnQ+IFBpcGVsaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVmVyaWZ5RWFjaFBhc3MsIGJvb2wgRGVidWdMb2dnaW5nKTsKKworICB2b2lkIGFkZFBHT0luc3RyUGFzc2VzKE1vZHVsZVBhc3NNYW5hZ2VyICZNUE0sIGJvb2wgRGVidWdMb2dnaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGltaXphdGlvbkxldmVsIExldmVsLCBib29sIFJ1blByb2ZpbGVHZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgUHJvZmlsZUdlbkZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgUHJvZmlsZVVzZUZpbGUpOworCisgIHZvaWQgaW52b2tlUGVlcGhvbGVFUENhbGxiYWNrcyhGdW5jdGlvblBhc3NNYW5hZ2VyICYsIE9wdGltaXphdGlvbkxldmVsKTsKKworICAvLyBFeHRlbnNpb24gUG9pbnQgY2FsbGJhY2tzCisgIFNtYWxsVmVjdG9yPHN0ZDo6ZnVuY3Rpb248dm9pZChGdW5jdGlvblBhc3NNYW5hZ2VyICYsIE9wdGltaXphdGlvbkxldmVsKT4sIDI+CisgICAgICBQZWVwaG9sZUVQQ2FsbGJhY2tzOworICBTbWFsbFZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoTG9vcFBhc3NNYW5hZ2VyICYsIE9wdGltaXphdGlvbkxldmVsKT4sIDI+CisgICAgICBMYXRlTG9vcE9wdGltaXphdGlvbnNFUENhbGxiYWNrczsKKyAgU21hbGxWZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKExvb3BQYXNzTWFuYWdlciAmLCBPcHRpbWl6YXRpb25MZXZlbCk+LCAyPgorICAgICAgTG9vcE9wdGltaXplckVuZEVQQ2FsbGJhY2tzOworICBTbWFsbFZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoRnVuY3Rpb25QYXNzTWFuYWdlciAmLCBPcHRpbWl6YXRpb25MZXZlbCk+LCAyPgorICAgICAgU2NhbGFyT3B0aW1pemVyTGF0ZUVQQ2FsbGJhY2tzOworICBTbWFsbFZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoQ0dTQ0NQYXNzTWFuYWdlciAmLCBPcHRpbWl6YXRpb25MZXZlbCk+LCAyPgorICAgICAgQ0dTQ0NPcHRpbWl6ZXJMYXRlRVBDYWxsYmFja3M7CisgIFNtYWxsVmVjdG9yPHN0ZDo6ZnVuY3Rpb248dm9pZChGdW5jdGlvblBhc3NNYW5hZ2VyICYsIE9wdGltaXphdGlvbkxldmVsKT4sIDI+CisgICAgICBWZWN0b3JpemVyU3RhcnRFUENhbGxiYWNrczsKKyAgLy8gTW9kdWxlIGNhbGxiYWNrcworICBTbWFsbFZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoTW9kdWxlUGFzc01hbmFnZXIgJik+LCAyPgorICAgICAgUGlwZWxpbmVTdGFydEVQQ2FsbGJhY2tzOworICBTbWFsbFZlY3RvcjxzdGQ6OmZ1bmN0aW9uPHZvaWQoTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICYpPiwgMj4KKyAgICAgIE1vZHVsZUFuYWx5c2lzUmVnaXN0cmF0aW9uQ2FsbGJhY2tzOworICBTbWFsbFZlY3RvcjxzdGQ6OmZ1bmN0aW9uPGJvb2woU3RyaW5nUmVmLCBNb2R1bGVQYXNzTWFuYWdlciAmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8UGlwZWxpbmVFbGVtZW50Pik+LAorICAgICAgICAgICAgICAyPgorICAgICAgTW9kdWxlUGlwZWxpbmVQYXJzaW5nQ2FsbGJhY2tzOworICBTbWFsbFZlY3RvcjxzdGQ6OmZ1bmN0aW9uPGJvb2woTW9kdWxlUGFzc01hbmFnZXIgJiwgQXJyYXlSZWY8UGlwZWxpbmVFbGVtZW50PiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVmVyaWZ5RWFjaFBhc3MsIGJvb2wgRGVidWdMb2dnaW5nKT4sCisgICAgICAgICAgICAgIDI+CisgICAgICBUb3BMZXZlbFBpcGVsaW5lUGFyc2luZ0NhbGxiYWNrczsKKyAgLy8gQ0dTQ0MgY2FsbGJhY2tzCisgIFNtYWxsVmVjdG9yPHN0ZDo6ZnVuY3Rpb248dm9pZChDR1NDQ0FuYWx5c2lzTWFuYWdlciAmKT4sIDI+CisgICAgICBDR1NDQ0FuYWx5c2lzUmVnaXN0cmF0aW9uQ2FsbGJhY2tzOworICBTbWFsbFZlY3RvcjxzdGQ6OmZ1bmN0aW9uPGJvb2woU3RyaW5nUmVmLCBDR1NDQ1Bhc3NNYW5hZ2VyICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQaXBlbGluZUVsZW1lbnQ+KT4sCisgICAgICAgICAgICAgIDI+CisgICAgICBDR1NDQ1BpcGVsaW5lUGFyc2luZ0NhbGxiYWNrczsKKyAgLy8gRnVuY3Rpb24gY2FsbGJhY2tzCisgIFNtYWxsVmVjdG9yPHN0ZDo6ZnVuY3Rpb248dm9pZChGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmKT4sIDI+CisgICAgICBGdW5jdGlvbkFuYWx5c2lzUmVnaXN0cmF0aW9uQ2FsbGJhY2tzOworICBTbWFsbFZlY3RvcjxzdGQ6OmZ1bmN0aW9uPGJvb2woU3RyaW5nUmVmLCBGdW5jdGlvblBhc3NNYW5hZ2VyICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQaXBlbGluZUVsZW1lbnQ+KT4sCisgICAgICAgICAgICAgIDI+CisgICAgICBGdW5jdGlvblBpcGVsaW5lUGFyc2luZ0NhbGxiYWNrczsKKyAgLy8gTG9vcCBjYWxsYmFja3MKKyAgU21hbGxWZWN0b3I8c3RkOjpmdW5jdGlvbjx2b2lkKExvb3BBbmFseXNpc01hbmFnZXIgJik+LCAyPgorICAgICAgTG9vcEFuYWx5c2lzUmVnaXN0cmF0aW9uQ2FsbGJhY2tzOworICBTbWFsbFZlY3RvcjxzdGQ6OmZ1bmN0aW9uPGJvb2woU3RyaW5nUmVmLCBMb29wUGFzc01hbmFnZXIgJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFBpcGVsaW5lRWxlbWVudD4pPiwKKyAgICAgICAgICAgICAgMj4KKyAgICAgIExvb3BQaXBlbGluZVBhcnNpbmdDYWxsYmFja3M7CisgIC8vIEFBIGNhbGxiYWNrcworICBTbWFsbFZlY3RvcjxzdGQ6OmZ1bmN0aW9uPGJvb2woU3RyaW5nUmVmIE5hbWUsIEFBTWFuYWdlciAmQUEpPiwgMj4KKyAgICAgIEFBUGFyc2luZ0NhbGxiYWNrczsKK307CisKKy8vLyBUaGlzIHV0aWxpdHkgdGVtcGxhdGUgdGFrZXMgY2FyZSBvZiBhZGRpbmcgcmVxdWlyZTw+IGFuZCBpbnZhbGlkYXRlPD4KKy8vLyBwYXNzZXMgZm9yIGFuIGFuYWx5c2lzIHRvIGEgZ2l2ZW4gXGMgUGFzc01hbmFnZXIuIEl0IGlzIGludGVuZGVkIHRvIGJlIHVzZWQKKy8vLyBkdXJpbmcgcGFyc2luZyBvZiBhIHBhc3MgcGlwZWxpbmUgd2hlbiBwYXJzaW5nIGEgc2luZ2xlIFBpcGVsaW5lTmFtZS4KKy8vLyBXaGVuIHJlZ2lzdGVyaW5nIGEgbmV3IGZ1bmN0aW9uIGFuYWx5c2lzIEZhbmN5QW5hbHlzaXMgd2l0aCB0aGUgcGFzcworLy8vIHBpcGVsaW5lIG5hbWUgImZhbmN5LWFuYWx5c2lzIiwgYSBtYXRjaGluZyBQYXJzZVBpcGVsaW5lQ2FsbGJhY2sgY291bGQgbG9vaworLy8vIGxpa2UgdGhpczoKKy8vLworLy8vIHN0YXRpYyBib29sIHBhcnNlRnVuY3Rpb25QaXBlbGluZShTdHJpbmdSZWYgTmFtZSwgRnVuY3Rpb25QYXNzTWFuYWdlciAmRlBNLAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxQaXBlbGluZUVsZW1lbnQ+IFApIHsKKy8vLyAgIGlmIChwYXJzZUFuYWx5c2lzVXRpbGl0eVBhc3NlczxGYW5jeUFuYWx5c2lzPigiZmFuY3ktYW5hbHlzaXMiLCBOYW1lLAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZQTSkpCisvLy8gICAgIHJldHVybiB0cnVlOworLy8vICAgcmV0dXJuIGZhbHNlOworLy8vIH0KK3RlbXBsYXRlIDx0eXBlbmFtZSBBbmFseXNpc1QsIHR5cGVuYW1lIElSVW5pdFQsIHR5cGVuYW1lIEFuYWx5c2lzTWFuYWdlclQsCisgICAgICAgICAgdHlwZW5hbWUuLi4gRXh0cmFBcmdUcz4KK2Jvb2wgcGFyc2VBbmFseXNpc1V0aWxpdHlQYXNzZXMoCisgICAgU3RyaW5nUmVmIEFuYWx5c2lzTmFtZSwgU3RyaW5nUmVmIFBpcGVsaW5lTmFtZSwKKyAgICBQYXNzTWFuYWdlcjxJUlVuaXRULCBBbmFseXNpc01hbmFnZXJULCBFeHRyYUFyZ1RzLi4uPiAmUE0pIHsKKyAgaWYgKCFQaXBlbGluZU5hbWUuZW5kc3dpdGgoIj4iKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIC8vIFNlZSBpZiB0aGlzIGlzIGFuIGludmFsaWRhdGU8PiBwYXNzIG5hbWUKKyAgaWYgKFBpcGVsaW5lTmFtZS5zdGFydHN3aXRoKCJpbnZhbGlkYXRlPCIpKSB7CisgICAgUGlwZWxpbmVOYW1lID0gUGlwZWxpbmVOYW1lLnN1YnN0cigxMSwgUGlwZWxpbmVOYW1lLnNpemUoKSAtIDEyKTsKKyAgICBpZiAoUGlwZWxpbmVOYW1lICE9IEFuYWx5c2lzTmFtZSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBQTS5hZGRQYXNzKEludmFsaWRhdGVBbmFseXNpc1Bhc3M8QW5hbHlzaXNUPigpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFNlZSBpZiB0aGlzIGlzIGEgcmVxdWlyZTw+IHBhc3MgbmFtZQorICBpZiAoUGlwZWxpbmVOYW1lLnN0YXJ0c3dpdGgoInJlcXVpcmU8IikpIHsKKyAgICBQaXBlbGluZU5hbWUgPSBQaXBlbGluZU5hbWUuc3Vic3RyKDgsIFBpcGVsaW5lTmFtZS5zaXplKCkgLSA5KTsKKyAgICBpZiAoUGlwZWxpbmVOYW1lICE9IEFuYWx5c2lzTmFtZSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBQTS5hZGRQYXNzKFJlcXVpcmVBbmFseXNpc1Bhc3M8QW5hbHlzaXNULCBJUlVuaXRULCBBbmFseXNpc01hbmFnZXJULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRyYUFyZ1RzLi4uPigpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL0NvdmVyYWdlL0NvdmVyYWdlTWFwcGluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9Db3ZlcmFnZS9Db3ZlcmFnZU1hcHBpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YTQwOThjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9Db3ZlcmFnZS9Db3ZlcmFnZU1hcHBpbmcuaApAQCAtMCwwICsxLDgzMSBAQAorLy89PT0tIENvdmVyYWdlTWFwcGluZy5oIC0gQ29kZSBjb3ZlcmFnZSBtYXBwaW5nIHN1cHBvcnQgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDb2RlIGNvdmVyYWdlIG1hcHBpbmcgZGF0YSBpcyBnZW5lcmF0ZWQgYnkgY2xhbmcgYW5kIHJlYWQgYnkKKy8vIGxsdm0tY292IHRvIHNob3cgY29kZSBjb3ZlcmFnZSBzdGF0aXN0aWNzIGZvciBhIGZpbGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1BST0ZJTEVEQVRBX0NPVkVSQUdFX0NPVkVSQUdFTUFQUElOR19ICisjZGVmaW5lIExMVk1fUFJPRklMRURBVEFfQ09WRVJBR0VfQ09WRVJBR0VNQVBQSU5HX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9IYXNoaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgSW5kZXhlZEluc3RyUHJvZlJlYWRlcjsKKworbmFtZXNwYWNlIGNvdmVyYWdlIHsKKworY2xhc3MgQ292ZXJhZ2VNYXBwaW5nUmVhZGVyOworc3RydWN0IENvdmVyYWdlTWFwcGluZ1JlY29yZDsKKworZW51bSBjbGFzcyBjb3ZlcmFnZW1hcF9lcnJvciB7CisgIHN1Y2Nlc3MgPSAwLAorICBlb2YsCisgIG5vX2RhdGFfZm91bmQsCisgIHVuc3VwcG9ydGVkX3ZlcnNpb24sCisgIHRydW5jYXRlZCwKKyAgbWFsZm9ybWVkCit9OworCitjb25zdCBzdGQ6OmVycm9yX2NhdGVnb3J5ICZjb3ZlcmFnZW1hcF9jYXRlZ29yeSgpOworCitpbmxpbmUgc3RkOjplcnJvcl9jb2RlIG1ha2VfZXJyb3JfY29kZShjb3ZlcmFnZW1hcF9lcnJvciBFKSB7CisgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoc3RhdGljX2Nhc3Q8aW50PihFKSwgY292ZXJhZ2VtYXBfY2F0ZWdvcnkoKSk7Cit9CisKK2NsYXNzIENvdmVyYWdlTWFwRXJyb3IgOiBwdWJsaWMgRXJyb3JJbmZvPENvdmVyYWdlTWFwRXJyb3I+IHsKK3B1YmxpYzoKKyAgQ292ZXJhZ2VNYXBFcnJvcihjb3ZlcmFnZW1hcF9lcnJvciBFcnIpIDogRXJyKEVycikgeworICAgIGFzc2VydChFcnIgIT0gY292ZXJhZ2VtYXBfZXJyb3I6OnN1Y2Nlc3MgJiYgIk5vdCBhbiBlcnJvciIpOworICB9CisKKyAgc3RkOjpzdHJpbmcgbWVzc2FnZSgpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgbG9nKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgeyBPUyA8PCBtZXNzYWdlKCk7IH0KKworICBzdGQ6OmVycm9yX2NvZGUgY29udmVydFRvRXJyb3JDb2RlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBtYWtlX2Vycm9yX2NvZGUoRXJyKTsKKyAgfQorCisgIGNvdmVyYWdlbWFwX2Vycm9yIGdldCgpIGNvbnN0IHsgcmV0dXJuIEVycjsgfQorCisgIHN0YXRpYyBjaGFyIElEOworCitwcml2YXRlOgorICBjb3ZlcmFnZW1hcF9lcnJvciBFcnI7Cit9OworCisvLy8gQSBDb3VudGVyIGlzIGFuIGFic3RyYWN0IHZhbHVlIHRoYXQgZGVzY3JpYmVzIGhvdyB0byBjb21wdXRlIHRoZQorLy8vIGV4ZWN1dGlvbiBjb3VudCBmb3IgYSByZWdpb24gb2YgY29kZSB1c2luZyB0aGUgY29sbGVjdGVkIHByb2ZpbGUgY291bnQgZGF0YS4KK3N0cnVjdCBDb3VudGVyIHsKKyAgZW51bSBDb3VudGVyS2luZCB7IFplcm8sIENvdW50ZXJWYWx1ZVJlZmVyZW5jZSwgRXhwcmVzc2lvbiB9OworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgRW5jb2RpbmdUYWdCaXRzID0gMjsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEVuY29kaW5nVGFnTWFzayA9IDB4MzsKKyAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIEVuY29kaW5nQ291bnRlclRhZ0FuZEV4cGFuc2lvblJlZ2lvblRhZ0JpdHMgPQorICAgICAgRW5jb2RpbmdUYWdCaXRzICsgMTsKKworcHJpdmF0ZToKKyAgQ291bnRlcktpbmQgS2luZCA9IFplcm87CisgIHVuc2lnbmVkIElEID0gMDsKKworICBDb3VudGVyKENvdW50ZXJLaW5kIEtpbmQsIHVuc2lnbmVkIElEKSA6IEtpbmQoS2luZCksIElEKElEKSB7fQorCitwdWJsaWM6CisgIENvdW50ZXIoKSA9IGRlZmF1bHQ7CisKKyAgQ291bnRlcktpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICBib29sIGlzWmVybygpIGNvbnN0IHsgcmV0dXJuIEtpbmQgPT0gWmVybzsgfQorCisgIGJvb2wgaXNFeHByZXNzaW9uKCkgY29uc3QgeyByZXR1cm4gS2luZCA9PSBFeHByZXNzaW9uOyB9CisKKyAgdW5zaWduZWQgZ2V0Q291bnRlcklEKCkgY29uc3QgeyByZXR1cm4gSUQ7IH0KKworICB1bnNpZ25lZCBnZXRFeHByZXNzaW9uSUQoKSBjb25zdCB7IHJldHVybiBJRDsgfQorCisgIGZyaWVuZCBib29sIG9wZXJhdG9yPT0oY29uc3QgQ291bnRlciAmTEhTLCBjb25zdCBDb3VudGVyICZSSFMpIHsKKyAgICByZXR1cm4gTEhTLktpbmQgPT0gUkhTLktpbmQgJiYgTEhTLklEID09IFJIUy5JRDsKKyAgfQorCisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgQ291bnRlciAmTEhTLCBjb25zdCBDb3VudGVyICZSSFMpIHsKKyAgICByZXR1cm4gIShMSFMgPT0gUkhTKTsKKyAgfQorCisgIGZyaWVuZCBib29sIG9wZXJhdG9yPChjb25zdCBDb3VudGVyICZMSFMsIGNvbnN0IENvdW50ZXIgJlJIUykgeworICAgIHJldHVybiBzdGQ6OnRpZShMSFMuS2luZCwgTEhTLklEKSA8IHN0ZDo6dGllKFJIUy5LaW5kLCBSSFMuSUQpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgY291bnRlciB0aGF0IHJlcHJlc2VudHMgdGhlIG51bWJlciB6ZXJvLgorICBzdGF0aWMgQ291bnRlciBnZXRaZXJvKCkgeyByZXR1cm4gQ291bnRlcigpOyB9CisKKyAgLy8vIFJldHVybiB0aGUgY291bnRlciB0aGF0IGNvcnJlc3BvbmRzIHRvIGEgc3BlY2lmaWMgcHJvZmlsZSBjb3VudGVyLgorICBzdGF0aWMgQ291bnRlciBnZXRDb3VudGVyKHVuc2lnbmVkIENvdW50ZXJJZCkgeworICAgIHJldHVybiBDb3VudGVyKENvdW50ZXJWYWx1ZVJlZmVyZW5jZSwgQ291bnRlcklkKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gdGhlIGNvdW50ZXIgdGhhdCBjb3JyZXNwb25kcyB0byBhIHNwZWNpZmljIGFkZGl0aW9uIGNvdW50ZXIKKyAgLy8vIGV4cHJlc3Npb24uCisgIHN0YXRpYyBDb3VudGVyIGdldEV4cHJlc3Npb24odW5zaWduZWQgRXhwcmVzc2lvbklkKSB7CisgICAgcmV0dXJuIENvdW50ZXIoRXhwcmVzc2lvbiwgRXhwcmVzc2lvbklkKTsKKyAgfQorfTsKKworLy8vIEEgQ291bnRlciBleHByZXNzaW9uIGlzIGEgdmFsdWUgdGhhdCByZXByZXNlbnRzIGFuIGFyaXRobWV0aWMgb3BlcmF0aW9uCisvLy8gd2l0aCB0d28gY291bnRlcnMuCitzdHJ1Y3QgQ291bnRlckV4cHJlc3Npb24geworICBlbnVtIEV4cHJLaW5kIHsgU3VidHJhY3QsIEFkZCB9OworICBFeHByS2luZCBLaW5kOworICBDb3VudGVyIExIUywgUkhTOworCisgIENvdW50ZXJFeHByZXNzaW9uKEV4cHJLaW5kIEtpbmQsIENvdW50ZXIgTEhTLCBDb3VudGVyIFJIUykKKyAgICAgIDogS2luZChLaW5kKSwgTEhTKExIUyksIFJIUyhSSFMpIHt9Cit9OworCisvLy8gQSBDb3VudGVyIGV4cHJlc3Npb24gYnVpbGRlciBpcyB1c2VkIHRvIGNvbnN0cnVjdCB0aGUgY291bnRlciBleHByZXNzaW9ucy4KKy8vLyBJdCBhdm9pZHMgdW5uZWNlc3NhcnkgZHVwbGljYXRpb24gYW5kIHNpbXBsaWZpZXMgYWxnZWJyYWljIGV4cHJlc3Npb25zLgorY2xhc3MgQ291bnRlckV4cHJlc3Npb25CdWlsZGVyIHsKKyAgLy8vIEEgbGlzdCBvZiBhbGwgdGhlIGNvdW50ZXIgZXhwcmVzc2lvbnMKKyAgc3RkOjp2ZWN0b3I8Q291bnRlckV4cHJlc3Npb24+IEV4cHJlc3Npb25zOworCisgIC8vLyBBIGxvb2t1cCB0YWJsZSBmb3IgdGhlIGluZGV4IG9mIGEgZ2l2ZW4gZXhwcmVzc2lvbi4KKyAgRGVuc2VNYXA8Q291bnRlckV4cHJlc3Npb24sIHVuc2lnbmVkPiBFeHByZXNzaW9uSW5kaWNlczsKKworICAvLy8gUmV0dXJuIHRoZSBjb3VudGVyIHdoaWNoIGNvcnJlc3BvbmRzIHRvIHRoZSBnaXZlbiBleHByZXNzaW9uLgorICAvLy8KKyAgLy8vIElmIHRoZSBnaXZlbiBleHByZXNzaW9uIGlzIGFscmVhZHkgc3RvcmVkIGluIHRoZSBidWlsZGVyLCBhIGNvdW50ZXIKKyAgLy8vIHRoYXQgcmVmZXJlbmNlcyB0aGF0IGV4cHJlc3Npb24gaXMgcmV0dXJuZWQuIE90aGVyd2lzZSwgdGhlIGdpdmVuCisgIC8vLyBleHByZXNzaW9uIGlzIGFkZGVkIHRvIHRoZSBidWlsZGVyJ3MgY29sbGVjdGlvbiBvZiBleHByZXNzaW9ucy4KKyAgQ291bnRlciBnZXQoY29uc3QgQ291bnRlckV4cHJlc3Npb24gJkUpOworCisgIC8vLyBSZXByZXNlbnRzIGEgdGVybSBpbiBhIGNvdW50ZXIgZXhwcmVzc2lvbiB0cmVlLgorICBzdHJ1Y3QgVGVybSB7CisgICAgdW5zaWduZWQgQ291bnRlcklEOworICAgIGludCBGYWN0b3I7CisKKyAgICBUZXJtKHVuc2lnbmVkIENvdW50ZXJJRCwgaW50IEZhY3RvcikKKyAgICAgICAgOiBDb3VudGVySUQoQ291bnRlcklEKSwgRmFjdG9yKEZhY3Rvcikge30KKyAgfTsKKworICAvLy8gR2F0aGVyIHRoZSB0ZXJtcyBvZiB0aGUgZXhwcmVzc2lvbiB0cmVlIGZvciBwcm9jZXNzaW5nLgorICAvLy8KKyAgLy8vIFRoaXMgY29sbGVjdHMgZWFjaCBhZGRpdGlvbiBhbmQgc3VidHJhY3Rpb24gcmVmZXJlbmNlZCBieSB0aGUgY291bnRlciBpbnRvCisgIC8vLyBhIHNlcXVlbmNlIHRoYXQgY2FuIGJlIHNvcnRlZCBhbmQgY29tYmluZWQgdG8gYnVpbGQgYSBzaW1wbGlmaWVkIGNvdW50ZXIKKyAgLy8vIGV4cHJlc3Npb24uCisgIHZvaWQgZXh0cmFjdFRlcm1zKENvdW50ZXIgQywgaW50IFNpZ24sIFNtYWxsVmVjdG9ySW1wbDxUZXJtPiAmVGVybXMpOworCisgIC8vLyBTaW1wbGlmaWVzIHRoZSBnaXZlbiBleHByZXNzaW9uIHRyZWUKKyAgLy8vIGJ5IGdldHRpbmcgcmlkIG9mIGFsZ2VicmFpY2FsbHkgcmVkdW5kYW50IG9wZXJhdGlvbnMuCisgIENvdW50ZXIgc2ltcGxpZnkoQ291bnRlciBFeHByZXNzaW9uVHJlZSk7CisKK3B1YmxpYzoKKyAgQXJyYXlSZWY8Q291bnRlckV4cHJlc3Npb24+IGdldEV4cHJlc3Npb25zKCkgY29uc3QgeyByZXR1cm4gRXhwcmVzc2lvbnM7IH0KKworICAvLy8gUmV0dXJuIGEgY291bnRlciB0aGF0IHJlcHJlc2VudHMgdGhlIGV4cHJlc3Npb24gdGhhdCBhZGRzIExIUyBhbmQgUkhTLgorICBDb3VudGVyIGFkZChDb3VudGVyIExIUywgQ291bnRlciBSSFMpOworCisgIC8vLyBSZXR1cm4gYSBjb3VudGVyIHRoYXQgcmVwcmVzZW50cyB0aGUgZXhwcmVzc2lvbiB0aGF0IHN1YnRyYWN0cyBSSFMgZnJvbQorICAvLy8gTEhTLgorICBDb3VudGVyIHN1YnRyYWN0KENvdW50ZXIgTEhTLCBDb3VudGVyIFJIUyk7Cit9OworCit1c2luZyBMaW5lQ29sUGFpciA9IHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+OworCisvLy8gQSBDb3VudGVyIG1hcHBpbmcgcmVnaW9uIGFzc29jaWF0ZXMgYSBzb3VyY2UgcmFuZ2Ugd2l0aCBhIHNwZWNpZmljIGNvdW50ZXIuCitzdHJ1Y3QgQ291bnRlck1hcHBpbmdSZWdpb24geworICBlbnVtIFJlZ2lvbktpbmQgeworICAgIC8vLyBBIENvZGVSZWdpb24gYXNzb2NpYXRlcyBzb21lIGNvZGUgd2l0aCBhIGNvdW50ZXIKKyAgICBDb2RlUmVnaW9uLAorCisgICAgLy8vIEFuIEV4cGFuc2lvblJlZ2lvbiByZXByZXNlbnRzIGEgZmlsZSBleHBhbnNpb24gcmVnaW9uIHRoYXQgYXNzb2NpYXRlcyAKKyAgICAvLy8gYSBzb3VyY2UgcmFuZ2Ugd2l0aCB0aGUgZXhwYW5zaW9uIG9mIGEgdmlydHVhbCBzb3VyY2UgZmlsZSwgc3VjaCBhcworICAgIC8vLyBmb3IgYSBtYWNybyBpbnN0YW50aWF0aW9uIG9yICNpbmNsdWRlIGZpbGUuCisgICAgRXhwYW5zaW9uUmVnaW9uLAorCisgICAgLy8vIEEgU2tpcHBlZFJlZ2lvbiByZXByZXNlbnRzIGEgc291cmNlIHJhbmdlIHdpdGggY29kZSB0aGF0IHdhcyBza2lwcGVkCisgICAgLy8vIGJ5IGEgcHJlcHJvY2Vzc29yIG9yIHNpbWlsYXIgbWVhbnMuCisgICAgU2tpcHBlZFJlZ2lvbiwKKworICAgIC8vLyBBIEdhcFJlZ2lvbiBpcyBsaWtlIGEgQ29kZVJlZ2lvbiwgYnV0IGl0cyBjb3VudCBpcyBvbmx5IHNldCBhcyB0aGUKKyAgICAvLy8gbGluZSBleGVjdXRpb24gY291bnQgd2hlbiBpdHMgdGhlIG9ubHkgcmVnaW9uIGluIHRoZSBsaW5lLgorICAgIEdhcFJlZ2lvbgorICB9OworCisgIENvdW50ZXIgQ291bnQ7CisgIHVuc2lnbmVkIEZpbGVJRCwgRXhwYW5kZWRGaWxlSUQ7CisgIHVuc2lnbmVkIExpbmVTdGFydCwgQ29sdW1uU3RhcnQsIExpbmVFbmQsIENvbHVtbkVuZDsKKyAgUmVnaW9uS2luZCBLaW5kOworCisgIENvdW50ZXJNYXBwaW5nUmVnaW9uKENvdW50ZXIgQ291bnQsIHVuc2lnbmVkIEZpbGVJRCwgdW5zaWduZWQgRXhwYW5kZWRGaWxlSUQsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExpbmVTdGFydCwgdW5zaWduZWQgQ29sdW1uU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIExpbmVFbmQsIHVuc2lnbmVkIENvbHVtbkVuZCwgUmVnaW9uS2luZCBLaW5kKQorICAgICAgOiBDb3VudChDb3VudCksIEZpbGVJRChGaWxlSUQpLCBFeHBhbmRlZEZpbGVJRChFeHBhbmRlZEZpbGVJRCksCisgICAgICAgIExpbmVTdGFydChMaW5lU3RhcnQpLCBDb2x1bW5TdGFydChDb2x1bW5TdGFydCksIExpbmVFbmQoTGluZUVuZCksCisgICAgICAgIENvbHVtbkVuZChDb2x1bW5FbmQpLCBLaW5kKEtpbmQpIHt9CisKKyAgc3RhdGljIENvdW50ZXJNYXBwaW5nUmVnaW9uCisgIG1ha2VSZWdpb24oQ291bnRlciBDb3VudCwgdW5zaWduZWQgRmlsZUlELCB1bnNpZ25lZCBMaW5lU3RhcnQsCisgICAgICAgICAgICAgdW5zaWduZWQgQ29sdW1uU3RhcnQsIHVuc2lnbmVkIExpbmVFbmQsIHVuc2lnbmVkIENvbHVtbkVuZCkgeworICAgIHJldHVybiBDb3VudGVyTWFwcGluZ1JlZ2lvbihDb3VudCwgRmlsZUlELCAwLCBMaW5lU3RhcnQsIENvbHVtblN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW5lRW5kLCBDb2x1bW5FbmQsIENvZGVSZWdpb24pOworICB9CisKKyAgc3RhdGljIENvdW50ZXJNYXBwaW5nUmVnaW9uCisgIG1ha2VFeHBhbnNpb24odW5zaWduZWQgRmlsZUlELCB1bnNpZ25lZCBFeHBhbmRlZEZpbGVJRCwgdW5zaWduZWQgTGluZVN0YXJ0LAorICAgICAgICAgICAgICAgIHVuc2lnbmVkIENvbHVtblN0YXJ0LCB1bnNpZ25lZCBMaW5lRW5kLCB1bnNpZ25lZCBDb2x1bW5FbmQpIHsKKyAgICByZXR1cm4gQ291bnRlck1hcHBpbmdSZWdpb24oQ291bnRlcigpLCBGaWxlSUQsIEV4cGFuZGVkRmlsZUlELCBMaW5lU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbHVtblN0YXJ0LCBMaW5lRW5kLCBDb2x1bW5FbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4cGFuc2lvblJlZ2lvbik7CisgIH0KKworICBzdGF0aWMgQ291bnRlck1hcHBpbmdSZWdpb24KKyAgbWFrZVNraXBwZWQodW5zaWduZWQgRmlsZUlELCB1bnNpZ25lZCBMaW5lU3RhcnQsIHVuc2lnbmVkIENvbHVtblN0YXJ0LAorICAgICAgICAgICAgICB1bnNpZ25lZCBMaW5lRW5kLCB1bnNpZ25lZCBDb2x1bW5FbmQpIHsKKyAgICByZXR1cm4gQ291bnRlck1hcHBpbmdSZWdpb24oQ291bnRlcigpLCBGaWxlSUQsIDAsIExpbmVTdGFydCwgQ29sdW1uU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVFbmQsIENvbHVtbkVuZCwgU2tpcHBlZFJlZ2lvbik7CisgIH0KKworICBzdGF0aWMgQ291bnRlck1hcHBpbmdSZWdpb24KKyAgbWFrZUdhcFJlZ2lvbihDb3VudGVyIENvdW50LCB1bnNpZ25lZCBGaWxlSUQsIHVuc2lnbmVkIExpbmVTdGFydCwKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCBDb2x1bW5TdGFydCwgdW5zaWduZWQgTGluZUVuZCwgdW5zaWduZWQgQ29sdW1uRW5kKSB7CisgICAgcmV0dXJuIENvdW50ZXJNYXBwaW5nUmVnaW9uKENvdW50LCBGaWxlSUQsIDAsIExpbmVTdGFydCwgQ29sdW1uU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExpbmVFbmQsICgxVSA8PCAzMSkgfCBDb2x1bW5FbmQsIEdhcFJlZ2lvbik7CisgIH0KKworICBpbmxpbmUgTGluZUNvbFBhaXIgc3RhcnRMb2MoKSBjb25zdCB7CisgICAgcmV0dXJuIExpbmVDb2xQYWlyKExpbmVTdGFydCwgQ29sdW1uU3RhcnQpOworICB9CisKKyAgaW5saW5lIExpbmVDb2xQYWlyIGVuZExvYygpIGNvbnN0IHsgcmV0dXJuIExpbmVDb2xQYWlyKExpbmVFbmQsIENvbHVtbkVuZCk7IH0KK307CisKKy8vLyBBc3NvY2lhdGVzIGEgc291cmNlIHJhbmdlIHdpdGggYW4gZXhlY3V0aW9uIGNvdW50Lgorc3RydWN0IENvdW50ZWRSZWdpb24gOiBwdWJsaWMgQ291bnRlck1hcHBpbmdSZWdpb24geworICB1aW50NjRfdCBFeGVjdXRpb25Db3VudDsKKworICBDb3VudGVkUmVnaW9uKGNvbnN0IENvdW50ZXJNYXBwaW5nUmVnaW9uICZSLCB1aW50NjRfdCBFeGVjdXRpb25Db3VudCkKKyAgICAgIDogQ291bnRlck1hcHBpbmdSZWdpb24oUiksIEV4ZWN1dGlvbkNvdW50KEV4ZWN1dGlvbkNvdW50KSB7fQorfTsKKworLy8vIEEgQ291bnRlciBtYXBwaW5nIGNvbnRleHQgaXMgdXNlZCB0byBjb25uZWN0IHRoZSBjb3VudGVycywgZXhwcmVzc2lvbnMKKy8vLyBhbmQgdGhlIG9idGFpbmVkIGNvdW50ZXIgdmFsdWVzLgorY2xhc3MgQ291bnRlck1hcHBpbmdDb250ZXh0IHsKKyAgQXJyYXlSZWY8Q291bnRlckV4cHJlc3Npb24+IEV4cHJlc3Npb25zOworICBBcnJheVJlZjx1aW50NjRfdD4gQ291bnRlclZhbHVlczsKKworcHVibGljOgorICBDb3VudGVyTWFwcGluZ0NvbnRleHQoQXJyYXlSZWY8Q291bnRlckV4cHJlc3Npb24+IEV4cHJlc3Npb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDY0X3Q+IENvdW50ZXJWYWx1ZXMgPSBOb25lKQorICAgICAgOiBFeHByZXNzaW9ucyhFeHByZXNzaW9ucyksIENvdW50ZXJWYWx1ZXMoQ291bnRlclZhbHVlcykge30KKworICB2b2lkIHNldENvdW50cyhBcnJheVJlZjx1aW50NjRfdD4gQ291bnRzKSB7IENvdW50ZXJWYWx1ZXMgPSBDb3VudHM7IH0KKworICB2b2lkIGR1bXAoY29uc3QgQ291bnRlciAmQywgcmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgdm9pZCBkdW1wKGNvbnN0IENvdW50ZXIgJkMpIGNvbnN0IHsgZHVtcChDLCBkYmdzKCkpOyB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoYXQgYSByZWdpb24gb2YgY29kZSBhc3NvY2lhdGVkIHdpdGggdGhpcworICAvLy8gY291bnRlciB3YXMgZXhlY3V0ZWQuCisgIEV4cGVjdGVkPGludDY0X3Q+IGV2YWx1YXRlKGNvbnN0IENvdW50ZXIgJkMpIGNvbnN0OworfTsKKworLy8vIENvZGUgY292ZXJhZ2UgaW5mb3JtYXRpb24gZm9yIGEgc2luZ2xlIGZ1bmN0aW9uLgorc3RydWN0IEZ1bmN0aW9uUmVjb3JkIHsKKyAgLy8vIFJhdyBmdW5jdGlvbiBuYW1lLgorICBzdGQ6OnN0cmluZyBOYW1lOworICAvLy8gQXNzb2NpYXRlZCBmaWxlcy4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IEZpbGVuYW1lczsKKyAgLy8vIFJlZ2lvbnMgaW4gdGhlIGZ1bmN0aW9uIGFsb25nIHdpdGggdGhlaXIgY291bnRzLgorICBzdGQ6OnZlY3RvcjxDb3VudGVkUmVnaW9uPiBDb3VudGVkUmVnaW9uczsKKyAgLy8vIFRoZSBudW1iZXIgb2YgdGltZXMgdGhpcyBmdW5jdGlvbiB3YXMgZXhlY3V0ZWQuCisgIHVpbnQ2NF90IEV4ZWN1dGlvbkNvdW50OworCisgIEZ1bmN0aW9uUmVjb3JkKFN0cmluZ1JlZiBOYW1lLCBBcnJheVJlZjxTdHJpbmdSZWY+IEZpbGVuYW1lcykKKyAgICAgIDogTmFtZShOYW1lKSwgRmlsZW5hbWVzKEZpbGVuYW1lcy5iZWdpbigpLCBGaWxlbmFtZXMuZW5kKCkpIHt9CisKKyAgRnVuY3Rpb25SZWNvcmQoRnVuY3Rpb25SZWNvcmQgJiZGUikgPSBkZWZhdWx0OworICBGdW5jdGlvblJlY29yZCAmb3BlcmF0b3I9KEZ1bmN0aW9uUmVjb3JkICYmKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBwdXNoUmVnaW9uKENvdW50ZXJNYXBwaW5nUmVnaW9uIFJlZ2lvbiwgdWludDY0X3QgQ291bnQpIHsKKyAgICBpZiAoQ291bnRlZFJlZ2lvbnMuZW1wdHkoKSkKKyAgICAgIEV4ZWN1dGlvbkNvdW50ID0gQ291bnQ7CisgICAgQ291bnRlZFJlZ2lvbnMuZW1wbGFjZV9iYWNrKFJlZ2lvbiwgQ291bnQpOworICB9Cit9OworCisvLy8gSXRlcmF0b3Igb3ZlciBGdW5jdGlvbnMsIG9wdGlvbmFsbHkgZmlsdGVyZWQgdG8gYSBzaW5nbGUgZmlsZS4KK2NsYXNzIEZ1bmN0aW9uUmVjb3JkSXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcl9mYWNhZGVfYmFzZTxGdW5jdGlvblJlY29yZEl0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIEZ1bmN0aW9uUmVjb3JkPiB7CisgIEFycmF5UmVmPEZ1bmN0aW9uUmVjb3JkPiBSZWNvcmRzOworICBBcnJheVJlZjxGdW5jdGlvblJlY29yZD46Oml0ZXJhdG9yIEN1cnJlbnQ7CisgIFN0cmluZ1JlZiBGaWxlbmFtZTsKKworICAvLy8gU2tpcCByZWNvcmRzIHdob3NlIHByaW1hcnkgZmlsZSBpcyBub3QgXGMgRmlsZW5hbWUuCisgIHZvaWQgc2tpcE90aGVyRmlsZXMoKTsKKworcHVibGljOgorICBGdW5jdGlvblJlY29yZEl0ZXJhdG9yKEFycmF5UmVmPEZ1bmN0aW9uUmVjb3JkPiBSZWNvcmRzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmlsZW5hbWUgPSAiIikKKyAgICAgIDogUmVjb3JkcyhSZWNvcmRzXyksIEN1cnJlbnQoUmVjb3Jkcy5iZWdpbigpKSwgRmlsZW5hbWUoRmlsZW5hbWUpIHsKKyAgICBza2lwT3RoZXJGaWxlcygpOworICB9CisKKyAgRnVuY3Rpb25SZWNvcmRJdGVyYXRvcigpIDogQ3VycmVudChSZWNvcmRzLmJlZ2luKCkpIHt9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZ1bmN0aW9uUmVjb3JkSXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgIHJldHVybiBDdXJyZW50ID09IFJIUy5DdXJyZW50ICYmIEZpbGVuYW1lID09IFJIUy5GaWxlbmFtZTsKKyAgfQorCisgIGNvbnN0IEZ1bmN0aW9uUmVjb3JkICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqQ3VycmVudDsgfQorCisgIEZ1bmN0aW9uUmVjb3JkSXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7CisgICAgYXNzZXJ0KEN1cnJlbnQgIT0gUmVjb3Jkcy5lbmQoKSAmJiAiaW5jcmVtZW50ZWQgcGFzdCBlbmQiKTsKKyAgICArK0N1cnJlbnQ7CisgICAgc2tpcE90aGVyRmlsZXMoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KK307CisKKy8vLyBDb3ZlcmFnZSBpbmZvcm1hdGlvbiBmb3IgYSBtYWNybyBleHBhbnNpb24gb3IgI2luY2x1ZGVkIGZpbGUuCisvLy8KKy8vLyBXaGVuIGNvdmVyZWQgY29kZSBoYXMgcGllY2VzIHRoYXQgY2FuIGJlIGV4cGFuZGVkIGZvciBtb3JlIGRldGFpbCwgc3VjaCBhcyBhCisvLy8gcHJlcHJvY2Vzc29yIG1hY3JvIHVzZSBhbmQgaXRzIGRlZmluaXRpb24sIHRoZXNlIGFyZSByZXByZXNlbnRlZCBhcworLy8vIGV4cGFuc2lvbnMgd2hvc2UgY292ZXJhZ2UgY2FuIGJlIGxvb2tlZCB1cCBpbmRlcGVuZGVudGx5Lgorc3RydWN0IEV4cGFuc2lvblJlY29yZCB7CisgIC8vLyBUaGUgYWJzdHJhY3QgZmlsZSB0aGlzIGV4cGFuc2lvbiBjb3ZlcnMuCisgIHVuc2lnbmVkIEZpbGVJRDsKKyAgLy8vIFRoZSByZWdpb24gdGhhdCBleHBhbmRzIHRvIHRoaXMgcmVjb3JkLgorICBjb25zdCBDb3VudGVkUmVnaW9uICZSZWdpb247CisgIC8vLyBDb3ZlcmFnZSBmb3IgdGhlIGV4cGFuc2lvbi4KKyAgY29uc3QgRnVuY3Rpb25SZWNvcmQgJkZ1bmN0aW9uOworCisgIEV4cGFuc2lvblJlY29yZChjb25zdCBDb3VudGVkUmVnaW9uICZSZWdpb24sCisgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvblJlY29yZCAmRnVuY3Rpb24pCisgICAgICA6IEZpbGVJRChSZWdpb24uRXhwYW5kZWRGaWxlSUQpLCBSZWdpb24oUmVnaW9uKSwgRnVuY3Rpb24oRnVuY3Rpb24pIHt9Cit9OworCisvLy8gVGhlIGV4ZWN1dGlvbiBjb3VudCBpbmZvcm1hdGlvbiBzdGFydGluZyBhdCBhIHBvaW50IGluIGEgZmlsZS4KKy8vLworLy8vIEEgc2VxdWVuY2Ugb2YgQ292ZXJhZ2VTZWdtZW50cyBnaXZlcyBleGVjdXRpb24gY291bnRzIGZvciBhIGZpbGUgaW4gZm9ybWF0CisvLy8gdGhhdCdzIHNpbXBsZSB0byBpdGVyYXRlIHRocm91Z2ggZm9yIHByb2Nlc3NpbmcuCitzdHJ1Y3QgQ292ZXJhZ2VTZWdtZW50IHsKKyAgLy8vIFRoZSBsaW5lIHdoZXJlIHRoaXMgc2VnbWVudCBiZWdpbnMuCisgIHVuc2lnbmVkIExpbmU7CisgIC8vLyBUaGUgY29sdW1uIHdoZXJlIHRoaXMgc2VnbWVudCBiZWdpbnMuCisgIHVuc2lnbmVkIENvbDsKKyAgLy8vIFRoZSBleGVjdXRpb24gY291bnQsIG9yIHplcm8gaWYgbm8gY291bnQgd2FzIHJlY29yZGVkLgorICB1aW50NjRfdCBDb3VudDsKKyAgLy8vIFdoZW4gZmFsc2UsIHRoZSBzZWdtZW50IHdhcyB1bmluc3RydW1lbnRlZCBvciBza2lwcGVkLgorICBib29sIEhhc0NvdW50OworICAvLy8gV2hldGhlciB0aGlzIGVudGVycyBhIG5ldyByZWdpb24gb3IgcmV0dXJucyB0byBhIHByZXZpb3VzIGNvdW50LgorICBib29sIElzUmVnaW9uRW50cnk7CisgIC8vLyBXaGV0aGVyIHRoaXMgZW50ZXJzIGEgZ2FwIHJlZ2lvbi4KKyAgYm9vbCBJc0dhcFJlZ2lvbjsKKworICBDb3ZlcmFnZVNlZ21lbnQodW5zaWduZWQgTGluZSwgdW5zaWduZWQgQ29sLCBib29sIElzUmVnaW9uRW50cnkpCisgICAgICA6IExpbmUoTGluZSksIENvbChDb2wpLCBDb3VudCgwKSwgSGFzQ291bnQoZmFsc2UpLAorICAgICAgICBJc1JlZ2lvbkVudHJ5KElzUmVnaW9uRW50cnkpLCBJc0dhcFJlZ2lvbihmYWxzZSkge30KKworICBDb3ZlcmFnZVNlZ21lbnQodW5zaWduZWQgTGluZSwgdW5zaWduZWQgQ29sLCB1aW50NjRfdCBDb3VudCwKKyAgICAgICAgICAgICAgICAgIGJvb2wgSXNSZWdpb25FbnRyeSwgYm9vbCBJc0dhcFJlZ2lvbiA9IGZhbHNlKQorICAgICAgOiBMaW5lKExpbmUpLCBDb2woQ29sKSwgQ291bnQoQ291bnQpLCBIYXNDb3VudCh0cnVlKSwKKyAgICAgICAgSXNSZWdpb25FbnRyeShJc1JlZ2lvbkVudHJ5KSwgSXNHYXBSZWdpb24oSXNHYXBSZWdpb24pIHt9CisKKyAgZnJpZW5kIGJvb2wgb3BlcmF0b3I9PShjb25zdCBDb3ZlcmFnZVNlZ21lbnQgJkwsIGNvbnN0IENvdmVyYWdlU2VnbWVudCAmUikgeworICAgIHJldHVybiBzdGQ6OnRpZShMLkxpbmUsIEwuQ29sLCBMLkNvdW50LCBMLkhhc0NvdW50LCBMLklzUmVnaW9uRW50cnksCisgICAgICAgICAgICAgICAgICAgIEwuSXNHYXBSZWdpb24pID09IHN0ZDo6dGllKFIuTGluZSwgUi5Db2wsIFIuQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFIuSGFzQ291bnQsIFIuSXNSZWdpb25FbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUi5Jc0dhcFJlZ2lvbik7CisgIH0KK307CisKKy8vLyBBbiBpbnN0YW50aWF0aW9uIGdyb3VwIGNvbnRhaW5zIGEgXGMgRnVuY3Rpb25SZWNvcmQgbGlzdCwgc3VjaCB0aGF0IGVhY2gKKy8vLyByZWNvcmQgY29ycmVzcG9uZHMgdG8gYSBkaXN0aW5jdCBpbnN0YW50aWF0aW9uIG9mIHRoZSBzYW1lIGZ1bmN0aW9uLgorLy8vCisvLy8gTm90ZSB0aGF0IGl0J3MgcG9zc2libGUgZm9yIGEgZnVuY3Rpb24gdG8gaGF2ZSBtb3JlIHRoYW4gb25lIGluc3RhbnRpYXRpb24KKy8vLyAoY29uc2lkZXIgQysrIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9ucyBvciBzdGF0aWMgaW5saW5lIGZ1bmN0aW9ucykuCitjbGFzcyBJbnN0YW50aWF0aW9uR3JvdXAgeworICBmcmllbmQgY2xhc3MgQ292ZXJhZ2VNYXBwaW5nOworCisgIHVuc2lnbmVkIExpbmU7CisgIHVuc2lnbmVkIENvbDsKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgRnVuY3Rpb25SZWNvcmQgKj4gSW5zdGFudGlhdGlvbnM7CisKKyAgSW5zdGFudGlhdGlvbkdyb3VwKHVuc2lnbmVkIExpbmUsIHVuc2lnbmVkIENvbCwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEZ1bmN0aW9uUmVjb3JkICo+IEluc3RhbnRpYXRpb25zKQorICAgICAgOiBMaW5lKExpbmUpLCBDb2woQ29sKSwgSW5zdGFudGlhdGlvbnMoc3RkOjptb3ZlKEluc3RhbnRpYXRpb25zKSkge30KKworcHVibGljOgorICBJbnN0YW50aWF0aW9uR3JvdXAoY29uc3QgSW5zdGFudGlhdGlvbkdyb3VwICYpID0gZGVsZXRlOworICBJbnN0YW50aWF0aW9uR3JvdXAoSW5zdGFudGlhdGlvbkdyb3VwICYmKSA9IGRlZmF1bHQ7CisKKyAgLy8vIEdldCB0aGUgbnVtYmVyIG9mIGluc3RhbnRpYXRpb25zIGluIHRoaXMgZ3JvdXAuCisgIHNpemVfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gSW5zdGFudGlhdGlvbnMuc2l6ZSgpOyB9CisKKyAgLy8vIEdldCB0aGUgbGluZSB3aGVyZSB0aGUgY29tbW9uIGZ1bmN0aW9uIHdhcyBkZWZpbmVkLgorICB1bnNpZ25lZCBnZXRMaW5lKCkgY29uc3QgeyByZXR1cm4gTGluZTsgfQorCisgIC8vLyBHZXQgdGhlIGNvbHVtbiB3aGVyZSB0aGUgY29tbW9uIGZ1bmN0aW9uIHdhcyBkZWZpbmVkLgorICB1bnNpZ25lZCBnZXRDb2x1bW4oKSBjb25zdCB7IHJldHVybiBDb2w7IH0KKworICAvLy8gQ2hlY2sgaWYgdGhlIGluc3RhbnRpYXRpb25zIGluIHRoaXMgZ3JvdXAgaGF2ZSBhIGNvbW1vbiBtYW5nbGVkIG5hbWUuCisgIGJvb2wgaGFzTmFtZSgpIGNvbnN0IHsKKyAgICBmb3IgKHVuc2lnbmVkIEkgPSAxLCBFID0gSW5zdGFudGlhdGlvbnMuc2l6ZSgpOyBJIDwgRTsgKytJKQorICAgICAgaWYgKEluc3RhbnRpYXRpb25zW0ldLT5OYW1lICE9IEluc3RhbnRpYXRpb25zWzBdLT5OYW1lKQorICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gR2V0IHRoZSBjb21tb24gbWFuZ2xlZCBuYW1lIGZvciBpbnN0YW50aWF0aW9ucyBpbiB0aGlzIGdyb3VwLgorICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaGFzTmFtZSgpICYmICJJbnN0YW50aWF0aW9ucyBkb24ndCBoYXZlIGEgc2hhcmVkIG5hbWUiKTsKKyAgICByZXR1cm4gSW5zdGFudGlhdGlvbnNbMF0tPk5hbWU7CisgIH0KKworICAvLy8gR2V0IHRoZSB0b3RhbCBleGVjdXRpb24gY291bnQgb2YgYWxsIGluc3RhbnRpYXRpb25zIGluIHRoaXMgZ3JvdXAuCisgIHVpbnQ2NF90IGdldFRvdGFsRXhlY3V0aW9uQ291bnQoKSBjb25zdCB7CisgICAgdWludDY0X3QgQ291bnQgPSAwOworICAgIGZvciAoY29uc3QgRnVuY3Rpb25SZWNvcmQgKkYgOiBJbnN0YW50aWF0aW9ucykKKyAgICAgIENvdW50ICs9IEYtPkV4ZWN1dGlvbkNvdW50OworICAgIHJldHVybiBDb3VudDsKKyAgfQorCisgIC8vLyBHZXQgdGhlIGluc3RhbnRpYXRpb25zIGluIHRoaXMgZ3JvdXAuCisgIEFycmF5UmVmPGNvbnN0IEZ1bmN0aW9uUmVjb3JkICo+IGdldEluc3RhbnRpYXRpb25zKCkgY29uc3QgeworICAgIHJldHVybiBJbnN0YW50aWF0aW9uczsKKyAgfQorfTsKKworLy8vIENvdmVyYWdlIGluZm9ybWF0aW9uIHRvIGJlIHByb2Nlc3NlZCBvciBkaXNwbGF5ZWQuCisvLy8KKy8vLyBUaGlzIHJlcHJlc2VudHMgdGhlIGNvdmVyYWdlIG9mIGFuIGVudGlyZSBmaWxlLCBleHBhbnNpb24sIG9yIGZ1bmN0aW9uLiBJdAorLy8vIHByb3ZpZGVzIGEgc2VxdWVuY2Ugb2YgQ292ZXJhZ2VTZWdtZW50cyB0byBpdGVyYXRlIHRocm91Z2gsIGFzIHdlbGwgYXMgdGhlCisvLy8gbGlzdCBvZiBleHBhbnNpb25zIHRoYXQgY2FuIGJlIGZ1cnRoZXIgcHJvY2Vzc2VkLgorY2xhc3MgQ292ZXJhZ2VEYXRhIHsKKyAgZnJpZW5kIGNsYXNzIENvdmVyYWdlTWFwcGluZzsKKworICBzdGQ6OnN0cmluZyBGaWxlbmFtZTsKKyAgc3RkOjp2ZWN0b3I8Q292ZXJhZ2VTZWdtZW50PiBTZWdtZW50czsKKyAgc3RkOjp2ZWN0b3I8RXhwYW5zaW9uUmVjb3JkPiBFeHBhbnNpb25zOworCitwdWJsaWM6CisgIENvdmVyYWdlRGF0YSgpID0gZGVmYXVsdDsKKworICBDb3ZlcmFnZURhdGEoU3RyaW5nUmVmIEZpbGVuYW1lKSA6IEZpbGVuYW1lKEZpbGVuYW1lKSB7fQorCisgIC8vLyBHZXQgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdGhpcyBkYXRhIGNvdmVycy4KKyAgU3RyaW5nUmVmIGdldEZpbGVuYW1lKCkgY29uc3QgeyByZXR1cm4gRmlsZW5hbWU7IH0KKworICAvLy8gR2V0IGFuIGl0ZXJhdG9yIG92ZXIgdGhlIGNvdmVyYWdlIHNlZ21lbnRzIGZvciB0aGlzIG9iamVjdC4gVGhlIHNlZ21lbnRzCisgIC8vLyBhcmUgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWVkIGFuZCBzb3J0ZWQgYnkgbG9jYXRpb24uCisgIHN0ZDo6dmVjdG9yPENvdmVyYWdlU2VnbWVudD46OmNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBTZWdtZW50cy5iZWdpbigpOworICB9CisKKyAgc3RkOjp2ZWN0b3I8Q292ZXJhZ2VTZWdtZW50Pjo6Y29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeworICAgIHJldHVybiBTZWdtZW50cy5lbmQoKTsKKyAgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBTZWdtZW50cy5lbXB0eSgpOyB9CisKKyAgLy8vIEV4cGFuc2lvbnMgdGhhdCBjYW4gYmUgZnVydGhlciBwcm9jZXNzZWQuCisgIEFycmF5UmVmPEV4cGFuc2lvblJlY29yZD4gZ2V0RXhwYW5zaW9ucygpIGNvbnN0IHsgcmV0dXJuIEV4cGFuc2lvbnM7IH0KK307CisKKy8vLyBUaGUgbWFwcGluZyBvZiBwcm9maWxlIGluZm9ybWF0aW9uIHRvIGNvdmVyYWdlIGRhdGEuCisvLy8KKy8vLyBUaGlzIGlzIHRoZSBtYWluIGludGVyZmFjZSB0byBnZXQgY292ZXJhZ2UgaW5mb3JtYXRpb24sIHVzaW5nIGEgcHJvZmlsZSB0bworLy8vIGZpbGwgb3V0IGV4ZWN1dGlvbiBjb3VudHMuCitjbGFzcyBDb3ZlcmFnZU1hcHBpbmcgeworICBTdHJpbmdTZXQ8PiBGdW5jdGlvbk5hbWVzOworICBzdGQ6OnZlY3RvcjxGdW5jdGlvblJlY29yZD4gRnVuY3Rpb25zOworICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHVpbnQ2NF90Pj4gRnVuY0hhc2hNaXNtYXRjaGVzOworICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHVpbnQ2NF90Pj4gRnVuY0NvdW50ZXJNaXNtYXRjaGVzOworCisgIENvdmVyYWdlTWFwcGluZygpID0gZGVmYXVsdDsKKworICAvLy8gQWRkIGEgZnVuY3Rpb24gcmVjb3JkIGNvcnJlc3BvbmRpbmcgdG8gXHAgUmVjb3JkLgorICBFcnJvciBsb2FkRnVuY3Rpb25SZWNvcmQoY29uc3QgQ292ZXJhZ2VNYXBwaW5nUmVjb3JkICZSZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbmRleGVkSW5zdHJQcm9mUmVhZGVyICZQcm9maWxlUmVhZGVyKTsKKworcHVibGljOgorICBDb3ZlcmFnZU1hcHBpbmcoY29uc3QgQ292ZXJhZ2VNYXBwaW5nICYpID0gZGVsZXRlOworICBDb3ZlcmFnZU1hcHBpbmcgJm9wZXJhdG9yPShjb25zdCBDb3ZlcmFnZU1hcHBpbmcgJikgPSBkZWxldGU7CisKKyAgLy8vIExvYWQgdGhlIGNvdmVyYWdlIG1hcHBpbmcgdXNpbmcgdGhlIGdpdmVuIHJlYWRlcnMuCisgIHN0YXRpYyBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8Q292ZXJhZ2VNYXBwaW5nPj4KKyAgbG9hZChBcnJheVJlZjxzdGQ6OnVuaXF1ZV9wdHI8Q292ZXJhZ2VNYXBwaW5nUmVhZGVyPj4gQ292ZXJhZ2VSZWFkZXJzLAorICAgICAgIEluZGV4ZWRJbnN0clByb2ZSZWFkZXIgJlByb2ZpbGVSZWFkZXIpOworCisgIC8vLyBMb2FkIHRoZSBjb3ZlcmFnZSBtYXBwaW5nIGZyb20gdGhlIGdpdmVuIG9iamVjdCBmaWxlcyBhbmQgcHJvZmlsZS4gSWYKKyAgLy8vIFxwIEFyY2hlcyBpcyBub24tZW1wdHksIGl0IG11c3Qgc3BlY2lmeSBhbiBhcmNoaXRlY3R1cmUgZm9yIGVhY2ggb2JqZWN0LgorICBzdGF0aWMgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPENvdmVyYWdlTWFwcGluZz4+CisgIGxvYWQoQXJyYXlSZWY8U3RyaW5nUmVmPiBPYmplY3RGaWxlbmFtZXMsIFN0cmluZ1JlZiBQcm9maWxlRmlsZW5hbWUsCisgICAgICAgQXJyYXlSZWY8U3RyaW5nUmVmPiBBcmNoZXMgPSBOb25lKTsKKworICAvLy8gVGhlIG51bWJlciBvZiBmdW5jdGlvbnMgdGhhdCBjb3VsZG4ndCBoYXZlIHRoZWlyIHByb2ZpbGVzIG1hcHBlZC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGEgY291bnQgb2YgZnVuY3Rpb25zIHdob3NlIHByb2ZpbGUgaXMgb3V0IG9mIGRhdGUgb3Igb3RoZXJ3aXNlCisgIC8vLyBjYW4ndCBiZSBhc3NvY2lhdGVkIHdpdGggYW55IGNvdmVyYWdlIGluZm9ybWF0aW9uLgorICB1bnNpZ25lZCBnZXRNaXNtYXRjaGVkQ291bnQoKSBjb25zdCB7CisgICAgcmV0dXJuIEZ1bmNIYXNoTWlzbWF0Y2hlcy5zaXplKCkgKyBGdW5jQ291bnRlck1pc21hdGNoZXMuc2l6ZSgpOworICB9CisKKyAgLy8vIEEgaGFzaCBtaXNtYXRjaCBvY2N1cnMgd2hlbiBhIHByb2ZpbGUgcmVjb3JkIGZvciBhIHN5bWJvbCBkb2VzIG5vdCBoYXZlCisgIC8vLyB0aGUgc2FtZSBoYXNoIGFzIGEgY292ZXJhZ2UgbWFwcGluZyByZWNvcmQgZm9yIHRoZSBzYW1lIHN5bWJvbC4gVGhpcworICAvLy8gcmV0dXJucyBhIGxpc3Qgb2YgaGFzaCBtaXNtYXRjaGVzLCB3aGVyZSBlYWNoIG1pc21hdGNoIGlzIGEgcGFpciBvZiB0aGUKKyAgLy8vIHN5bWJvbCBuYW1lIGFuZCBpdHMgY292ZXJhZ2UgbWFwcGluZyBoYXNoLgorICBBcnJheVJlZjxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHVpbnQ2NF90Pj4gZ2V0SGFzaE1pc21hdGNoZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIEZ1bmNIYXNoTWlzbWF0Y2hlczsKKyAgfQorCisgIC8vLyBBIGNvdW50ZXIgbWlzbWF0Y2ggb2NjdXJzIHdoZW4gdGhlcmUgaXMgYW4gZXJyb3Igd2hlbiBldmFsdWF0aW5nIHRoZQorICAvLy8gY291bnRlciBleHByZXNzaW9ucyBpbiBhIGNvdmVyYWdlIG1hcHBpbmcgcmVjb3JkLiBUaGlzIHJldHVybnMgYSBsaXN0IG9mCisgIC8vLyBjb3VudGVyIG1pc21hdGNoZXMsIHdoZXJlIGVhY2ggbWlzbWF0Y2ggaXMgYSBwYWlyIG9mIHRoZSBzeW1ib2wgbmFtZSBhbmQKKyAgLy8vIHRoZSBudW1iZXIgb2YgdmFsaWQgZXZhbHVhdGVkIGNvdW50ZXIgZXhwcmVzc2lvbnMuCisgIEFycmF5UmVmPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgdWludDY0X3Q+PiBnZXRDb3VudGVyTWlzbWF0Y2hlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gRnVuY0NvdW50ZXJNaXNtYXRjaGVzOworICB9CisKKyAgLy8vIFJldHVybnMgYSBsZXhpY29ncmFwaGljYWxseSBzb3J0ZWQsIHVuaXF1ZSBsaXN0IG9mIGZpbGVzIHRoYXQgYXJlCisgIC8vLyBjb3ZlcmVkLgorICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IGdldFVuaXF1ZVNvdXJjZUZpbGVzKCkgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgY292ZXJhZ2UgZm9yIGEgcGFydGljdWxhciBmaWxlLgorICAvLy8KKyAgLy8vIFRoZSBnaXZlbiBmaWxlbmFtZSBtdXN0IGJlIHRoZSBuYW1lIGFzIHJlY29yZGVkIGluIHRoZSBjb3ZlcmFnZQorICAvLy8gaW5mb3JtYXRpb24uIFRoYXQgaXMsIG9ubHkgbmFtZXMgcmV0dXJuZWQgZnJvbSBnZXRVbmlxdWVTb3VyY2VGaWxlcyB3aWxsCisgIC8vLyB5aWVsZCBhIHJlc3VsdC4KKyAgQ292ZXJhZ2VEYXRhIGdldENvdmVyYWdlRm9yRmlsZShTdHJpbmdSZWYgRmlsZW5hbWUpIGNvbnN0OworCisgIC8vLyBHZXQgdGhlIGNvdmVyYWdlIGZvciBhIHBhcnRpY3VsYXIgZnVuY3Rpb24uCisgIENvdmVyYWdlRGF0YSBnZXRDb3ZlcmFnZUZvckZ1bmN0aW9uKGNvbnN0IEZ1bmN0aW9uUmVjb3JkICZGdW5jdGlvbikgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgY292ZXJhZ2UgZm9yIGFuIGV4cGFuc2lvbiB3aXRoaW4gYSBjb3ZlcmFnZSBzZXQuCisgIENvdmVyYWdlRGF0YSBnZXRDb3ZlcmFnZUZvckV4cGFuc2lvbihjb25zdCBFeHBhbnNpb25SZWNvcmQgJkV4cGFuc2lvbikgY29uc3Q7CisKKyAgLy8vIEdldHMgYWxsIG9mIHRoZSBmdW5jdGlvbnMgY292ZXJlZCBieSB0aGlzIHByb2ZpbGUuCisgIGl0ZXJhdG9yX3JhbmdlPEZ1bmN0aW9uUmVjb3JkSXRlcmF0b3I+IGdldENvdmVyZWRGdW5jdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoRnVuY3Rpb25SZWNvcmRJdGVyYXRvcihGdW5jdGlvbnMpLAorICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uUmVjb3JkSXRlcmF0b3IoKSk7CisgIH0KKworICAvLy8gR2V0cyBhbGwgb2YgdGhlIGZ1bmN0aW9ucyBpbiBhIHBhcnRpY3VsYXIgZmlsZS4KKyAgaXRlcmF0b3JfcmFuZ2U8RnVuY3Rpb25SZWNvcmRJdGVyYXRvcj4KKyAgZ2V0Q292ZXJlZEZ1bmN0aW9ucyhTdHJpbmdSZWYgRmlsZW5hbWUpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShGdW5jdGlvblJlY29yZEl0ZXJhdG9yKEZ1bmN0aW9ucywgRmlsZW5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uUmVjb3JkSXRlcmF0b3IoKSk7CisgIH0KKworICAvLy8gR2V0IHRoZSBsaXN0IG9mIGZ1bmN0aW9uIGluc3RhbnRpYXRpb24gZ3JvdXBzIGluIGEgcGFydGljdWxhciBmaWxlLgorICAvLy8KKyAgLy8vIEV2ZXJ5IGluc3RhbnRpYXRpb24gZ3JvdXAgaW4gYSBwcm9ncmFtIGlzIGF0dHJpYnV0ZWQgdG8gZXhhY3RseSBvbmUgZmlsZToKKyAgLy8vIHRoZSBmaWxlIGluIHdoaWNoIHRoZSBkZWZpbml0aW9uIGZvciB0aGUgY29tbW9uIGZ1bmN0aW9uIGJlZ2lucy4KKyAgc3RkOjp2ZWN0b3I8SW5zdGFudGlhdGlvbkdyb3VwPgorICBnZXRJbnN0YW50aWF0aW9uR3JvdXBzKFN0cmluZ1JlZiBGaWxlbmFtZSkgY29uc3Q7Cit9OworCisvLy8gQ292ZXJhZ2Ugc3RhdGlzdGljcyBmb3IgYSBzaW5nbGUgbGluZS4KK2NsYXNzIExpbmVDb3ZlcmFnZVN0YXRzIHsKKyAgdWludDY0X3QgRXhlY3V0aW9uQ291bnQ7CisgIGJvb2wgSGFzTXVsdGlwbGVSZWdpb25zOworICBib29sIE1hcHBlZDsKKyAgdW5zaWduZWQgTGluZTsKKyAgQXJyYXlSZWY8Y29uc3QgQ292ZXJhZ2VTZWdtZW50ICo+IExpbmVTZWdtZW50czsKKyAgY29uc3QgQ292ZXJhZ2VTZWdtZW50ICpXcmFwcGVkU2VnbWVudDsKKworICBmcmllbmQgY2xhc3MgTGluZUNvdmVyYWdlSXRlcmF0b3I7CisgIExpbmVDb3ZlcmFnZVN0YXRzKCkgPSBkZWZhdWx0OworCitwdWJsaWM6CisgIExpbmVDb3ZlcmFnZVN0YXRzKEFycmF5UmVmPGNvbnN0IENvdmVyYWdlU2VnbWVudCAqPiBMaW5lU2VnbWVudHMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvdmVyYWdlU2VnbWVudCAqV3JhcHBlZFNlZ21lbnQsIHVuc2lnbmVkIExpbmUpOworCisgIHVpbnQ2NF90IGdldEV4ZWN1dGlvbkNvdW50KCkgY29uc3QgeyByZXR1cm4gRXhlY3V0aW9uQ291bnQ7IH0KKworICBib29sIGhhc011bHRpcGxlUmVnaW9ucygpIGNvbnN0IHsgcmV0dXJuIEhhc011bHRpcGxlUmVnaW9uczsgfQorCisgIGJvb2wgaXNNYXBwZWQoKSBjb25zdCB7IHJldHVybiBNYXBwZWQ7IH0KKworICB1bnNpZ25lZCBnZXRMaW5lKCkgY29uc3QgeyByZXR1cm4gTGluZTsgfQorCisgIEFycmF5UmVmPGNvbnN0IENvdmVyYWdlU2VnbWVudCAqPiBnZXRMaW5lU2VnbWVudHMoKSBjb25zdCB7CisgICAgcmV0dXJuIExpbmVTZWdtZW50czsKKyAgfQorCisgIGNvbnN0IENvdmVyYWdlU2VnbWVudCAqZ2V0V3JhcHBlZFNlZ21lbnQoKSBjb25zdCB7IHJldHVybiBXcmFwcGVkU2VnbWVudDsgfQorfTsKKworLy8vIEFuIGl0ZXJhdG9yIG92ZXIgdGhlIFxjIExpbmVDb3ZlcmFnZVN0YXRzIG9iamVjdHMgZm9yIGxpbmVzIGRlc2NyaWJlZCBieQorLy8vIGEgXGMgQ292ZXJhZ2VEYXRhIGluc3RhbmNlLgorY2xhc3MgTGluZUNvdmVyYWdlSXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcl9mYWNhZGVfYmFzZTwKKyAgICAgICAgICBMaW5lQ292ZXJhZ2VJdGVyYXRvciwgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgTGluZUNvdmVyYWdlU3RhdHM+IHsKK3B1YmxpYzoKKyAgTGluZUNvdmVyYWdlSXRlcmF0b3IoY29uc3QgQ292ZXJhZ2VEYXRhICZDRCkKKyAgICAgIDogTGluZUNvdmVyYWdlSXRlcmF0b3IoQ0QsIENELmJlZ2luKCktPkxpbmUpIHt9CisKKyAgTGluZUNvdmVyYWdlSXRlcmF0b3IoY29uc3QgQ292ZXJhZ2VEYXRhICZDRCwgdW5zaWduZWQgTGluZSkKKyAgICAgIDogQ0QoQ0QpLCBXcmFwcGVkU2VnbWVudChudWxscHRyKSwgTmV4dChDRC5iZWdpbigpKSwgRW5kZWQoZmFsc2UpLAorICAgICAgICBMaW5lKExpbmUpLCBTZWdtZW50cygpLCBTdGF0cygpIHsKKyAgICB0aGlzLT5vcGVyYXRvcisrKCk7CisgIH0KKworICBMaW5lQ292ZXJhZ2VJdGVyYXRvciAmb3BlcmF0b3I9KGNvbnN0IExpbmVDb3ZlcmFnZUl0ZXJhdG9yICZSKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IExpbmVDb3ZlcmFnZUl0ZXJhdG9yICZSKSBjb25zdCB7CisgICAgcmV0dXJuICZDRCA9PSAmUi5DRCAmJiBOZXh0ID09IFIuTmV4dCAmJiBFbmRlZCA9PSBSLkVuZGVkOworICB9CisKKyAgY29uc3QgTGluZUNvdmVyYWdlU3RhdHMgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIFN0YXRzOyB9CisKKyAgTGluZUNvdmVyYWdlU3RhdHMgJm9wZXJhdG9yKigpIHsgcmV0dXJuIFN0YXRzOyB9CisKKyAgTGluZUNvdmVyYWdlSXRlcmF0b3IgJm9wZXJhdG9yKysoKTsKKworICBMaW5lQ292ZXJhZ2VJdGVyYXRvciBnZXRFbmQoKSBjb25zdCB7CisgICAgYXV0byBFbmRJdCA9ICp0aGlzOworICAgIEVuZEl0Lk5leHQgPSBDRC5lbmQoKTsKKyAgICBFbmRJdC5FbmRlZCA9IHRydWU7CisgICAgcmV0dXJuIEVuZEl0OworICB9CisKK3ByaXZhdGU6CisgIGNvbnN0IENvdmVyYWdlRGF0YSAmQ0Q7CisgIGNvbnN0IENvdmVyYWdlU2VnbWVudCAqV3JhcHBlZFNlZ21lbnQ7CisgIHN0ZDo6dmVjdG9yPENvdmVyYWdlU2VnbWVudD46OmNvbnN0X2l0ZXJhdG9yIE5leHQ7CisgIGJvb2wgRW5kZWQ7CisgIHVuc2lnbmVkIExpbmU7CisgIFNtYWxsVmVjdG9yPGNvbnN0IENvdmVyYWdlU2VnbWVudCAqLCA0PiBTZWdtZW50czsKKyAgTGluZUNvdmVyYWdlU3RhdHMgU3RhdHM7Cit9OworCisvLy8gR2V0IGEgXGMgTGluZUNvdmVyYWdlSXRlcmF0b3IgcmFuZ2UgZm9yIHRoZSBsaW5lcyBkZXNjcmliZWQgYnkgXHAgQ0QuCitzdGF0aWMgaW5saW5lIGl0ZXJhdG9yX3JhbmdlPExpbmVDb3ZlcmFnZUl0ZXJhdG9yPgorZ2V0TGluZUNvdmVyYWdlU3RhdHMoY29uc3QgY292ZXJhZ2U6OkNvdmVyYWdlRGF0YSAmQ0QpIHsKKyAgYXV0byBCZWdpbiA9IExpbmVDb3ZlcmFnZUl0ZXJhdG9yKENEKTsKKyAgYXV0byBFbmQgPSBCZWdpbi5nZXRFbmQoKTsKKyAgcmV0dXJuIG1ha2VfcmFuZ2UoQmVnaW4sIEVuZCk7Cit9CisKKy8vIFByb2ZpbGUgY292ZXJhZ2UgbWFwIGhhcyB0aGUgZm9sbG93aW5nIGxheW91dDoKKy8vIFtDb3ZlcmFnZU1hcEZpbGVIZWFkZXJdCisvLyBbQXJyYXlTdGFydF0KKy8vICBbQ292TWFwRnVuY3Rpb25SZWNvcmRdCisvLyAgW0Nvdk1hcEZ1bmN0aW9uUmVjb3JkXQorLy8gIC4uLgorLy8gW0FycmF5RW5kXQorLy8gW0VuY29kZWQgUmVnaW9uIE1hcHBpbmcgRGF0YV0KK0xMVk1fUEFDS0VEX1NUQVJUCit0ZW1wbGF0ZSA8Y2xhc3MgSW50UHRyVD4gc3RydWN0IENvdk1hcEZ1bmN0aW9uUmVjb3JkVjEgeworI2RlZmluZSBDT1ZNQVBfVjEKKyNkZWZpbmUgQ09WTUFQX0ZVTkNfUkVDT1JEKFR5cGUsIExMVk1UeXBlLCBOYW1lLCBJbml0KSBUeXBlIE5hbWU7CisjaW5jbHVkZSAibGx2bS9Qcm9maWxlRGF0YS9JbnN0clByb2ZEYXRhLmluYyIKKyN1bmRlZiBDT1ZNQVBfVjEKKworICAvLyBSZXR1cm4gdGhlIHN0cnVjdHVyYWwgaGFzaCBhc3NvY2lhdGVkIHdpdGggdGhlIGZ1bmN0aW9uLgorICB0ZW1wbGF0ZSA8c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW4+IHVpbnQ2NF90IGdldEZ1bmNIYXNoKCkgY29uc3QgeworICAgIHJldHVybiBzdXBwb3J0OjplbmRpYW46OmJ5dGVfc3dhcDx1aW50NjRfdCwgRW5kaWFuPihGdW5jSGFzaCk7CisgIH0KKworICAvLyBSZXR1cm4gdGhlIGNvdmVyYWdlIG1hcCBkYXRhIHNpemUgZm9yIHRoZSBmdW5jaXRvbi4KKyAgdGVtcGxhdGUgPHN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFuPiB1aW50MzJfdCBnZXREYXRhU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3VwcG9ydDo6ZW5kaWFuOjpieXRlX3N3YXA8dWludDMyX3QsIEVuZGlhbj4oRGF0YVNpemUpOworICB9CisKKyAgLy8gUmV0dXJuIGZ1bmN0aW9uIGxvb2t1cCBrZXkuIFRoZSB2YWx1ZSBpcyBjb25zaWRlciBvcGFxdWUuCisgIHRlbXBsYXRlIDxzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbj4gSW50UHRyVCBnZXRGdW5jTmFtZVJlZigpIGNvbnN0IHsKKyAgICByZXR1cm4gc3VwcG9ydDo6ZW5kaWFuOjpieXRlX3N3YXA8SW50UHRyVCwgRW5kaWFuPihOYW1lUHRyKTsKKyAgfQorCisgIC8vIFJldHVybiB0aGUgUEdPIG5hbWUgb2YgdGhlIGZ1bmN0aW9uICovCisgIHRlbXBsYXRlIDxzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbj4KKyAgRXJyb3IgZ2V0RnVuY05hbWUoSW5zdHJQcm9mU3ltdGFiICZQcm9maWxlTmFtZXMsIFN0cmluZ1JlZiAmRnVuY05hbWUpIGNvbnN0IHsKKyAgICBJbnRQdHJUIE5hbWVSZWYgPSBnZXRGdW5jTmFtZVJlZjxFbmRpYW4+KCk7CisgICAgdWludDMyX3QgTmFtZVMgPSBzdXBwb3J0OjplbmRpYW46OmJ5dGVfc3dhcDx1aW50MzJfdCwgRW5kaWFuPihOYW1lU2l6ZSk7CisgICAgRnVuY05hbWUgPSBQcm9maWxlTmFtZXMuZ2V0RnVuY05hbWUoTmFtZVJlZiwgTmFtZVMpOworICAgIGlmIChOYW1lUyAmJiBGdW5jTmFtZS5lbXB0eSgpKQorICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8Q292ZXJhZ2VNYXBFcnJvcj4oY292ZXJhZ2VtYXBfZXJyb3I6Om1hbGZvcm1lZCk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KK307CisKK3N0cnVjdCBDb3ZNYXBGdW5jdGlvblJlY29yZCB7CisjZGVmaW5lIENPVk1BUF9GVU5DX1JFQ09SRChUeXBlLCBMTFZNVHlwZSwgTmFtZSwgSW5pdCkgVHlwZSBOYW1lOworI2luY2x1ZGUgImxsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mRGF0YS5pbmMiCisKKyAgLy8gUmV0dXJuIHRoZSBzdHJ1Y3R1cmFsIGhhc2ggYXNzb2NpYXRlZCB3aXRoIHRoZSBmdW5jdGlvbi4KKyAgdGVtcGxhdGUgPHN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFuPiB1aW50NjRfdCBnZXRGdW5jSGFzaCgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3VwcG9ydDo6ZW5kaWFuOjpieXRlX3N3YXA8dWludDY0X3QsIEVuZGlhbj4oRnVuY0hhc2gpOworICB9CisKKyAgLy8gUmV0dXJuIHRoZSBjb3ZlcmFnZSBtYXAgZGF0YSBzaXplIGZvciB0aGUgZnVuY2l0b24uCisgIHRlbXBsYXRlIDxzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbj4gdWludDMyX3QgZ2V0RGF0YVNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN1cHBvcnQ6OmVuZGlhbjo6Ynl0ZV9zd2FwPHVpbnQzMl90LCBFbmRpYW4+KERhdGFTaXplKTsKKyAgfQorCisgIC8vIFJldHVybiBmdW5jdGlvbiBsb29rdXAga2V5LiBUaGUgdmFsdWUgaXMgY29uc2lkZXIgb3BhcXVlLgorICB0ZW1wbGF0ZSA8c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW4+IHVpbnQ2NF90IGdldEZ1bmNOYW1lUmVmKCkgY29uc3QgeworICAgIHJldHVybiBzdXBwb3J0OjplbmRpYW46OmJ5dGVfc3dhcDx1aW50NjRfdCwgRW5kaWFuPihOYW1lUmVmKTsKKyAgfQorCisgIC8vIFJldHVybiB0aGUgUEdPIG5hbWUgb2YgdGhlIGZ1bmN0aW9uICovCisgIHRlbXBsYXRlIDxzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbj4KKyAgRXJyb3IgZ2V0RnVuY05hbWUoSW5zdHJQcm9mU3ltdGFiICZQcm9maWxlTmFtZXMsIFN0cmluZ1JlZiAmRnVuY05hbWUpIGNvbnN0IHsKKyAgICB1aW50NjRfdCBOYW1lUmVmID0gZ2V0RnVuY05hbWVSZWY8RW5kaWFuPigpOworICAgIEZ1bmNOYW1lID0gUHJvZmlsZU5hbWVzLmdldEZ1bmNOYW1lKE5hbWVSZWYpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9Cit9OworCisvLyBQZXIgbW9kdWxlIGNvdmVyYWdlIG1hcHBpbmcgZGF0YSBoZWFkZXIsIGkuZS4gQ292ZXJhZ2VNYXBGaWxlSGVhZGVyCisvLyBkb2N1bWVudGVkIGFib3ZlLgorc3RydWN0IENvdk1hcEhlYWRlciB7CisjZGVmaW5lIENPVk1BUF9IRUFERVIoVHlwZSwgTExWTVR5cGUsIE5hbWUsIEluaXQpIFR5cGUgTmFtZTsKKyNpbmNsdWRlICJsbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZkRhdGEuaW5jIgorICB0ZW1wbGF0ZSA8c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW4+IHVpbnQzMl90IGdldE5SZWNvcmRzKCkgY29uc3QgeworICAgIHJldHVybiBzdXBwb3J0OjplbmRpYW46OmJ5dGVfc3dhcDx1aW50MzJfdCwgRW5kaWFuPihOUmVjb3Jkcyk7CisgIH0KKworICB0ZW1wbGF0ZSA8c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW4+IHVpbnQzMl90IGdldEZpbGVuYW1lc1NpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN1cHBvcnQ6OmVuZGlhbjo6Ynl0ZV9zd2FwPHVpbnQzMl90LCBFbmRpYW4+KEZpbGVuYW1lc1NpemUpOworICB9CisKKyAgdGVtcGxhdGUgPHN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFuPiB1aW50MzJfdCBnZXRDb3ZlcmFnZVNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuIHN1cHBvcnQ6OmVuZGlhbjo6Ynl0ZV9zd2FwPHVpbnQzMl90LCBFbmRpYW4+KENvdmVyYWdlU2l6ZSk7CisgIH0KKworICB0ZW1wbGF0ZSA8c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW4+IHVpbnQzMl90IGdldFZlcnNpb24oKSBjb25zdCB7CisgICAgcmV0dXJuIHN1cHBvcnQ6OmVuZGlhbjo6Ynl0ZV9zd2FwPHVpbnQzMl90LCBFbmRpYW4+KFZlcnNpb24pOworICB9Cit9OworCitMTFZNX1BBQ0tFRF9FTkQKKworZW51bSBDb3ZNYXBWZXJzaW9uIHsKKyAgVmVyc2lvbjEgPSAwLAorICAvLyBGdW5jdGlvbidzIG5hbWUgcmVmZXJlbmNlIGZyb20gQ292TWFwRnVuY1JlY29yZCBpcyBjaGFuZ2VkIGZyb20gcmF3CisgIC8vIG5hbWUgc3RyaW5nIHBvaW50ZXIgdG8gTUQ1IHRvIHN1cHBvcnQgbmFtZSBzZWN0aW9uIGNvbXByZXNzaW9uLiBOYW1lCisgIC8vIHNlY3Rpb24gaXMgYWxzbyBjb21wcmVzc2VkLgorICBWZXJzaW9uMiA9IDEsCisgIC8vIEEgbmV3IGludGVycHJldGF0aW9uIG9mIHRoZSBjb2x1bW5FbmQgZmllbGQgaXMgYWRkZWQgaW4gb3JkZXIgdG8gbWFyaworICAvLyByZWdpb25zIGFzIGdhcCBhcmVhcy4KKyAgVmVyc2lvbjMgPSAyLAorICAvLyBUaGUgY3VycmVudCB2ZXJzaW9uIGlzIFZlcnNpb24zCisgIEN1cnJlbnRWZXJzaW9uID0gSU5TVFJfUFJPRl9DT1ZNQVBfVkVSU0lPTgorfTsKKwordGVtcGxhdGUgPGludCBDb3ZNYXBWZXJzaW9uLCBjbGFzcyBJbnRQdHJUPiBzdHJ1Y3QgQ292TWFwVHJhaXRzIHsKKyAgdXNpbmcgQ292TWFwRnVuY1JlY29yZFR5cGUgPSBDb3ZNYXBGdW5jdGlvblJlY29yZDsKKyAgdXNpbmcgTmFtZVJlZlR5cGUgPSB1aW50NjRfdDsKK307CisKK3RlbXBsYXRlIDxjbGFzcyBJbnRQdHJUPiBzdHJ1Y3QgQ292TWFwVHJhaXRzPENvdk1hcFZlcnNpb246OlZlcnNpb24xLCBJbnRQdHJUPiB7CisgIHVzaW5nIENvdk1hcEZ1bmNSZWNvcmRUeXBlID0gQ292TWFwRnVuY3Rpb25SZWNvcmRWMTxJbnRQdHJUPjsKKyAgdXNpbmcgTmFtZVJlZlR5cGUgPSBJbnRQdHJUOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNvdmVyYWdlCisKKy8vLyBQcm92aWRlIERlbnNlTWFwSW5mbyBmb3IgQ291bnRlckV4cHJlc3Npb24KK3RlbXBsYXRlPD4gc3RydWN0IERlbnNlTWFwSW5mbzxjb3ZlcmFnZTo6Q291bnRlckV4cHJlc3Npb24+IHsKKyAgc3RhdGljIGlubGluZSBjb3ZlcmFnZTo6Q291bnRlckV4cHJlc3Npb24gZ2V0RW1wdHlLZXkoKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIGNvdmVyYWdlOworCisgICAgcmV0dXJuIENvdW50ZXJFeHByZXNzaW9uKENvdW50ZXJFeHByZXNzaW9uOjpFeHByS2luZDo6U3VidHJhY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ZXI6OmdldENvdW50ZXIofjBVKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlcjo6Z2V0Q291bnRlcih+MFUpKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgY292ZXJhZ2U6OkNvdW50ZXJFeHByZXNzaW9uIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICB1c2luZyBuYW1lc3BhY2UgY292ZXJhZ2U7CisKKyAgICByZXR1cm4gQ291bnRlckV4cHJlc3Npb24oQ291bnRlckV4cHJlc3Npb246OkV4cHJLaW5kOjpBZGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvdW50ZXI6OmdldENvdW50ZXIofjBVKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ291bnRlcjo6Z2V0Q291bnRlcih+MFUpKTsKKyAgfQorCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRIYXNoVmFsdWUoY29uc3QgY292ZXJhZ2U6OkNvdW50ZXJFeHByZXNzaW9uICZWKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PHVuc2lnbmVkPigKKyAgICAgICAgaGFzaF9jb21iaW5lKFYuS2luZCwgVi5MSFMuZ2V0S2luZCgpLCBWLkxIUy5nZXRDb3VudGVySUQoKSwKKyAgICAgICAgICAgICAgICAgICAgIFYuUkhTLmdldEtpbmQoKSwgVi5SSFMuZ2V0Q291bnRlcklEKCkpKTsKKyAgfQorCisgIHN0YXRpYyBib29sIGlzRXF1YWwoY29uc3QgY292ZXJhZ2U6OkNvdW50ZXJFeHByZXNzaW9uICZMSFMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY292ZXJhZ2U6OkNvdW50ZXJFeHByZXNzaW9uICZSSFMpIHsKKyAgICByZXR1cm4gTEhTLktpbmQgPT0gUkhTLktpbmQgJiYgTEhTLkxIUyA9PSBSSFMuTEhTICYmIExIUy5SSFMgPT0gUkhTLlJIUzsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fUFJPRklMRURBVEFfQ09WRVJBR0VfQ09WRVJBR0VNQVBQSU5HX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvQ292ZXJhZ2UvQ292ZXJhZ2VNYXBwaW5nUmVhZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL0NvdmVyYWdlL0NvdmVyYWdlTWFwcGluZ1JlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzM2U1MTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL0NvdmVyYWdlL0NvdmVyYWdlTWFwcGluZ1JlYWRlci5oCkBAIC0wLDAgKzEsMjE3IEBACisvLz09PS0gQ292ZXJhZ2VNYXBwaW5nUmVhZGVyLmggLSBDb2RlIGNvdmVyYWdlIG1hcHBpbmcgcmVhZGVyIC0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBzdXBwb3J0IGZvciByZWFkaW5nIGNvdmVyYWdlIG1hcHBpbmcgZGF0YSBmb3IKKy8vIGluc3RydW1lbnRhdGlvbiBiYXNlZCBjb3ZlcmFnZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fUFJPRklMRURBVEFfQ09WRVJBR0VfQ09WRVJBR0VNQVBQSU5HUkVBREVSX0gKKyNkZWZpbmUgTExWTV9QUk9GSUxFREFUQV9DT1ZFUkFHRV9DT1ZFUkFHRU1BUFBJTkdSRUFERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1Byb2ZpbGVEYXRhL0NvdmVyYWdlL0NvdmVyYWdlTWFwcGluZy5oIgorI2luY2x1ZGUgImxsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgY292ZXJhZ2UgeworCitjbGFzcyBDb3ZlcmFnZU1hcHBpbmdSZWFkZXI7CisKKy8vLyBcYnJpZWYgQ292ZXJhZ2UgbWFwcGluZyBpbmZvcm1hdGlvbiBmb3IgYSBzaW5nbGUgZnVuY3Rpb24uCitzdHJ1Y3QgQ292ZXJhZ2VNYXBwaW5nUmVjb3JkIHsKKyAgU3RyaW5nUmVmIEZ1bmN0aW9uTmFtZTsKKyAgdWludDY0X3QgRnVuY3Rpb25IYXNoOworICBBcnJheVJlZjxTdHJpbmdSZWY+IEZpbGVuYW1lczsKKyAgQXJyYXlSZWY8Q291bnRlckV4cHJlc3Npb24+IEV4cHJlc3Npb25zOworICBBcnJheVJlZjxDb3VudGVyTWFwcGluZ1JlZ2lvbj4gTWFwcGluZ1JlZ2lvbnM7Cit9OworCisvLy8gXGJyaWVmIEEgZmlsZSBmb3JtYXQgYWdub3N0aWMgaXRlcmF0b3Igb3ZlciBjb3ZlcmFnZSBtYXBwaW5nIGRhdGEuCitjbGFzcyBDb3ZlcmFnZU1hcHBpbmdJdGVyYXRvcgorICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjppbnB1dF9pdGVyYXRvcl90YWcsIENvdmVyYWdlTWFwcGluZ1JlY29yZD4geworICBDb3ZlcmFnZU1hcHBpbmdSZWFkZXIgKlJlYWRlcjsKKyAgQ292ZXJhZ2VNYXBwaW5nUmVjb3JkIFJlY29yZDsKKyAgY292ZXJhZ2VtYXBfZXJyb3IgUmVhZEVycjsKKworICB2b2lkIGluY3JlbWVudCgpOworCitwdWJsaWM6CisgIENvdmVyYWdlTWFwcGluZ0l0ZXJhdG9yKCkKKyAgICAgIDogUmVhZGVyKG51bGxwdHIpLCBSZWNvcmQoKSwgUmVhZEVycihjb3ZlcmFnZW1hcF9lcnJvcjo6c3VjY2Vzcykge30KKworICBDb3ZlcmFnZU1hcHBpbmdJdGVyYXRvcihDb3ZlcmFnZU1hcHBpbmdSZWFkZXIgKlJlYWRlcikKKyAgICAgIDogUmVhZGVyKFJlYWRlciksIFJlY29yZCgpLCBSZWFkRXJyKGNvdmVyYWdlbWFwX2Vycm9yOjpzdWNjZXNzKSB7CisgICAgaW5jcmVtZW50KCk7CisgIH0KKworICB+Q292ZXJhZ2VNYXBwaW5nSXRlcmF0b3IoKSB7CisgICAgaWYgKFJlYWRFcnIgIT0gY292ZXJhZ2VtYXBfZXJyb3I6OnN1Y2Nlc3MpCisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmV4cGVjdGVkIGVycm9yIGluIGNvdmVyYWdlIG1hcHBpbmcgaXRlcmF0b3IiKTsKKyAgfQorCisgIENvdmVyYWdlTWFwcGluZ0l0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgIGluY3JlbWVudCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgQ292ZXJhZ2VNYXBwaW5nSXRlcmF0b3IgJlJIUykgeworICAgIHJldHVybiBSZWFkZXIgPT0gUkhTLlJlYWRlcjsKKyAgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgQ292ZXJhZ2VNYXBwaW5nSXRlcmF0b3IgJlJIUykgeworICAgIHJldHVybiBSZWFkZXIgIT0gUkhTLlJlYWRlcjsKKyAgfQorICBFeHBlY3RlZDxDb3ZlcmFnZU1hcHBpbmdSZWNvcmQgJj4gb3BlcmF0b3IqKCkgeworICAgIGlmIChSZWFkRXJyICE9IGNvdmVyYWdlbWFwX2Vycm9yOjpzdWNjZXNzKSB7CisgICAgICBhdXRvIEUgPSBtYWtlX2Vycm9yPENvdmVyYWdlTWFwRXJyb3I+KFJlYWRFcnIpOworICAgICAgUmVhZEVyciA9IGNvdmVyYWdlbWFwX2Vycm9yOjpzdWNjZXNzOworICAgICAgcmV0dXJuIHN0ZDo6bW92ZShFKTsKKyAgICB9CisgICAgcmV0dXJuIFJlY29yZDsKKyAgfQorICBFeHBlY3RlZDxDb3ZlcmFnZU1hcHBpbmdSZWNvcmQgKj4gb3BlcmF0b3ItPigpIHsKKyAgICBpZiAoUmVhZEVyciAhPSBjb3ZlcmFnZW1hcF9lcnJvcjo6c3VjY2VzcykgeworICAgICAgYXV0byBFID0gbWFrZV9lcnJvcjxDb3ZlcmFnZU1hcEVycm9yPihSZWFkRXJyKTsKKyAgICAgIFJlYWRFcnIgPSBjb3ZlcmFnZW1hcF9lcnJvcjo6c3VjY2VzczsKKyAgICAgIHJldHVybiBzdGQ6Om1vdmUoRSk7CisgICAgfQorICAgIHJldHVybiAmUmVjb3JkOworICB9Cit9OworCitjbGFzcyBDb3ZlcmFnZU1hcHBpbmdSZWFkZXIgeworcHVibGljOgorICB2aXJ0dWFsIH5Db3ZlcmFnZU1hcHBpbmdSZWFkZXIoKSA9IGRlZmF1bHQ7CisKKyAgdmlydHVhbCBFcnJvciByZWFkTmV4dFJlY29yZChDb3ZlcmFnZU1hcHBpbmdSZWNvcmQgJlJlY29yZCkgPSAwOworICBDb3ZlcmFnZU1hcHBpbmdJdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIENvdmVyYWdlTWFwcGluZ0l0ZXJhdG9yKHRoaXMpOyB9CisgIENvdmVyYWdlTWFwcGluZ0l0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIENvdmVyYWdlTWFwcGluZ0l0ZXJhdG9yKCk7IH0KK307CisKKy8vLyBcYnJpZWYgQmFzZSBjbGFzcyBmb3IgdGhlIHJhdyBjb3ZlcmFnZSBtYXBwaW5nIGFuZCBmaWxlbmFtZXMgZGF0YSByZWFkZXJzLgorY2xhc3MgUmF3Q292ZXJhZ2VSZWFkZXIgeworcHJvdGVjdGVkOgorICBTdHJpbmdSZWYgRGF0YTsKKworICBSYXdDb3ZlcmFnZVJlYWRlcihTdHJpbmdSZWYgRGF0YSkgOiBEYXRhKERhdGEpIHt9CisKKyAgRXJyb3IgcmVhZFVMRUIxMjgodWludDY0X3QgJlJlc3VsdCk7CisgIEVycm9yIHJlYWRJbnRNYXgodWludDY0X3QgJlJlc3VsdCwgdWludDY0X3QgTWF4UGx1czEpOworICBFcnJvciByZWFkU2l6ZSh1aW50NjRfdCAmUmVzdWx0KTsKKyAgRXJyb3IgcmVhZFN0cmluZyhTdHJpbmdSZWYgJlJlc3VsdCk7Cit9OworCisvLy8gXGJyaWVmIFJlYWRlciBmb3IgdGhlIHJhdyBjb3ZlcmFnZSBmaWxlbmFtZXMuCitjbGFzcyBSYXdDb3ZlcmFnZUZpbGVuYW1lc1JlYWRlciA6IHB1YmxpYyBSYXdDb3ZlcmFnZVJlYWRlciB7CisgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gJkZpbGVuYW1lczsKKworcHVibGljOgorICBSYXdDb3ZlcmFnZUZpbGVuYW1lc1JlYWRlcihTdHJpbmdSZWYgRGF0YSwgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiAmRmlsZW5hbWVzKQorICAgICAgOiBSYXdDb3ZlcmFnZVJlYWRlcihEYXRhKSwgRmlsZW5hbWVzKEZpbGVuYW1lcykge30KKyAgUmF3Q292ZXJhZ2VGaWxlbmFtZXNSZWFkZXIoY29uc3QgUmF3Q292ZXJhZ2VGaWxlbmFtZXNSZWFkZXIgJikgPSBkZWxldGU7CisgIFJhd0NvdmVyYWdlRmlsZW5hbWVzUmVhZGVyICYKKyAgb3BlcmF0b3I9KGNvbnN0IFJhd0NvdmVyYWdlRmlsZW5hbWVzUmVhZGVyICYpID0gZGVsZXRlOworCisgIEVycm9yIHJlYWQoKTsKK307CisKKy8vLyBcYnJpZWYgQ2hlY2tzIGlmIHRoZSBnaXZlbiBjb3ZlcmFnZSBtYXBwaW5nIGRhdGEgaXMgZXhwb3J0ZWQgZm9yCisvLy8gYW4gdW51c2VkIGZ1bmN0aW9uLgorY2xhc3MgUmF3Q292ZXJhZ2VNYXBwaW5nRHVtbXlDaGVja2VyIDogcHVibGljIFJhd0NvdmVyYWdlUmVhZGVyIHsKK3B1YmxpYzoKKyAgUmF3Q292ZXJhZ2VNYXBwaW5nRHVtbXlDaGVja2VyKFN0cmluZ1JlZiBNYXBwaW5nRGF0YSkKKyAgICAgIDogUmF3Q292ZXJhZ2VSZWFkZXIoTWFwcGluZ0RhdGEpIHt9CisKKyAgRXhwZWN0ZWQ8Ym9vbD4gaXNEdW1teSgpOworfTsKKworLy8vIFxicmllZiBSZWFkZXIgZm9yIHRoZSByYXcgY292ZXJhZ2UgbWFwcGluZyBkYXRhLgorY2xhc3MgUmF3Q292ZXJhZ2VNYXBwaW5nUmVhZGVyIDogcHVibGljIFJhd0NvdmVyYWdlUmVhZGVyIHsKKyAgQXJyYXlSZWY8U3RyaW5nUmVmPiBUcmFuc2xhdGlvblVuaXRGaWxlbmFtZXM7CisgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gJkZpbGVuYW1lczsKKyAgc3RkOjp2ZWN0b3I8Q291bnRlckV4cHJlc3Npb24+ICZFeHByZXNzaW9uczsKKyAgc3RkOjp2ZWN0b3I8Q291bnRlck1hcHBpbmdSZWdpb24+ICZNYXBwaW5nUmVnaW9uczsKKworcHVibGljOgorICBSYXdDb3ZlcmFnZU1hcHBpbmdSZWFkZXIoU3RyaW5nUmVmIE1hcHBpbmdEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8U3RyaW5nUmVmPiBUcmFuc2xhdGlvblVuaXRGaWxlbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+ICZGaWxlbmFtZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxDb3VudGVyRXhwcmVzc2lvbj4gJkV4cHJlc3Npb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Q291bnRlck1hcHBpbmdSZWdpb24+ICZNYXBwaW5nUmVnaW9ucykKKyAgICAgIDogUmF3Q292ZXJhZ2VSZWFkZXIoTWFwcGluZ0RhdGEpLAorICAgICAgICBUcmFuc2xhdGlvblVuaXRGaWxlbmFtZXMoVHJhbnNsYXRpb25Vbml0RmlsZW5hbWVzKSwKKyAgICAgICAgRmlsZW5hbWVzKEZpbGVuYW1lcyksIEV4cHJlc3Npb25zKEV4cHJlc3Npb25zKSwKKyAgICAgICAgTWFwcGluZ1JlZ2lvbnMoTWFwcGluZ1JlZ2lvbnMpIHt9CisgIFJhd0NvdmVyYWdlTWFwcGluZ1JlYWRlcihjb25zdCBSYXdDb3ZlcmFnZU1hcHBpbmdSZWFkZXIgJikgPSBkZWxldGU7CisgIFJhd0NvdmVyYWdlTWFwcGluZ1JlYWRlciAmCisgIG9wZXJhdG9yPShjb25zdCBSYXdDb3ZlcmFnZU1hcHBpbmdSZWFkZXIgJikgPSBkZWxldGU7CisKKyAgRXJyb3IgcmVhZCgpOworCitwcml2YXRlOgorICBFcnJvciBkZWNvZGVDb3VudGVyKHVuc2lnbmVkIFZhbHVlLCBDb3VudGVyICZDKTsKKyAgRXJyb3IgcmVhZENvdW50ZXIoQ291bnRlciAmQyk7CisgIEVycm9yCisgIHJlYWRNYXBwaW5nUmVnaW9uc1N1YkFycmF5KHN0ZDo6dmVjdG9yPENvdW50ZXJNYXBwaW5nUmVnaW9uPiAmTWFwcGluZ1JlZ2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEluZmVycmVkRmlsZUlELCBzaXplX3QgTnVtRmlsZUlEcyk7Cit9OworCisvLy8gXGJyaWVmIFJlYWRlciBmb3IgdGhlIGNvdmVyYWdlIG1hcHBpbmcgZGF0YSB0aGF0IGlzIGVtaXR0ZWQgYnkgdGhlCisvLy8gZnJvbnRlbmQgYW5kIHN0b3JlZCBpbiBhbiBvYmplY3QgZmlsZS4KK2NsYXNzIEJpbmFyeUNvdmVyYWdlUmVhZGVyIDogcHVibGljIENvdmVyYWdlTWFwcGluZ1JlYWRlciB7CitwdWJsaWM6CisgIHN0cnVjdCBQcm9maWxlTWFwcGluZ1JlY29yZCB7CisgICAgQ292TWFwVmVyc2lvbiBWZXJzaW9uOworICAgIFN0cmluZ1JlZiBGdW5jdGlvbk5hbWU7CisgICAgdWludDY0X3QgRnVuY3Rpb25IYXNoOworICAgIFN0cmluZ1JlZiBDb3ZlcmFnZU1hcHBpbmc7CisgICAgc2l6ZV90IEZpbGVuYW1lc0JlZ2luOworICAgIHNpemVfdCBGaWxlbmFtZXNTaXplOworCisgICAgUHJvZmlsZU1hcHBpbmdSZWNvcmQoQ292TWFwVmVyc2lvbiBWZXJzaW9uLCBTdHJpbmdSZWYgRnVuY3Rpb25OYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEZ1bmN0aW9uSGFzaCwgU3RyaW5nUmVmIENvdmVyYWdlTWFwcGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgRmlsZW5hbWVzQmVnaW4sIHNpemVfdCBGaWxlbmFtZXNTaXplKQorICAgICAgICA6IFZlcnNpb24oVmVyc2lvbiksIEZ1bmN0aW9uTmFtZShGdW5jdGlvbk5hbWUpLAorICAgICAgICAgIEZ1bmN0aW9uSGFzaChGdW5jdGlvbkhhc2gpLCBDb3ZlcmFnZU1hcHBpbmcoQ292ZXJhZ2VNYXBwaW5nKSwKKyAgICAgICAgICBGaWxlbmFtZXNCZWdpbihGaWxlbmFtZXNCZWdpbiksIEZpbGVuYW1lc1NpemUoRmlsZW5hbWVzU2l6ZSkge30KKyAgfTsKKworcHJpdmF0ZToKKyAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBGaWxlbmFtZXM7CisgIHN0ZDo6dmVjdG9yPFByb2ZpbGVNYXBwaW5nUmVjb3JkPiBNYXBwaW5nUmVjb3JkczsKKyAgSW5zdHJQcm9mU3ltdGFiIFByb2ZpbGVOYW1lczsKKyAgc2l6ZV90IEN1cnJlbnRSZWNvcmQgPSAwOworICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IEZ1bmN0aW9uc0ZpbGVuYW1lczsKKyAgc3RkOjp2ZWN0b3I8Q291bnRlckV4cHJlc3Npb24+IEV4cHJlc3Npb25zOworICBzdGQ6OnZlY3RvcjxDb3VudGVyTWFwcGluZ1JlZ2lvbj4gTWFwcGluZ1JlZ2lvbnM7CisKKyAgQmluYXJ5Q292ZXJhZ2VSZWFkZXIoKSA9IGRlZmF1bHQ7CisKK3B1YmxpYzoKKyAgQmluYXJ5Q292ZXJhZ2VSZWFkZXIoY29uc3QgQmluYXJ5Q292ZXJhZ2VSZWFkZXIgJikgPSBkZWxldGU7CisgIEJpbmFyeUNvdmVyYWdlUmVhZGVyICZvcGVyYXRvcj0oY29uc3QgQmluYXJ5Q292ZXJhZ2VSZWFkZXIgJikgPSBkZWxldGU7CisKKyAgc3RhdGljIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxCaW5hcnlDb3ZlcmFnZVJlYWRlcj4+CisgIGNyZWF0ZShzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiAmT2JqZWN0QnVmZmVyLAorICAgICAgICAgU3RyaW5nUmVmIEFyY2gpOworCisgIEVycm9yIHJlYWROZXh0UmVjb3JkKENvdmVyYWdlTWFwcGluZ1JlY29yZCAmUmVjb3JkKSBvdmVycmlkZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBjb3ZlcmFnZQorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fUFJPRklMRURBVEFfQ09WRVJBR0VfQ09WRVJBR0VNQVBQSU5HUkVBREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvQ292ZXJhZ2UvQ292ZXJhZ2VNYXBwaW5nV3JpdGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL0NvdmVyYWdlL0NvdmVyYWdlTWFwcGluZ1dyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI2Zjg2NGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL0NvdmVyYWdlL0NvdmVyYWdlTWFwcGluZ1dyaXRlci5oCkBAIC0wLDAgKzEsNjIgQEAKKy8vPT09LSBDb3ZlcmFnZU1hcHBpbmdXcml0ZXIuaCAtIENvZGUgY292ZXJhZ2UgbWFwcGluZyB3cml0ZXIgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHN1cHBvcnQgZm9yIHdyaXRpbmcgY292ZXJhZ2UgbWFwcGluZyBkYXRhIGZvcgorLy8gaW5zdHJ1bWVudGF0aW9uIGJhc2VkIGNvdmVyYWdlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9QUk9GSUxFREFUQV9DT1ZFUkFHRV9DT1ZFUkFHRU1BUFBJTkdXUklURVJfSAorI2RlZmluZSBMTFZNX1BST0ZJTEVEQVRBX0NPVkVSQUdFX0NPVkVSQUdFTUFQUElOR1dSSVRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vUHJvZmlsZURhdGEvQ292ZXJhZ2UvQ292ZXJhZ2VNYXBwaW5nLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBjb3ZlcmFnZSB7CisKKy8vLyBcYnJpZWYgV3JpdGVyIG9mIHRoZSBmaWxlbmFtZXMgc2VjdGlvbiBmb3IgdGhlIGluc3RydW1lbnRhdGlvbgorLy8vIGJhc2VkIGNvZGUgY292ZXJhZ2UuCitjbGFzcyBDb3ZlcmFnZUZpbGVuYW1lc1NlY3Rpb25Xcml0ZXIgeworICBBcnJheVJlZjxTdHJpbmdSZWY+IEZpbGVuYW1lczsKKworcHVibGljOgorICBDb3ZlcmFnZUZpbGVuYW1lc1NlY3Rpb25Xcml0ZXIoQXJyYXlSZWY8U3RyaW5nUmVmPiBGaWxlbmFtZXMpCisgICAgICA6IEZpbGVuYW1lcyhGaWxlbmFtZXMpIHt9CisKKyAgLy8vIFxicmllZiBXcml0ZSBlbmNvZGVkIGZpbGVuYW1lcyB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KKyAgdm9pZCB3cml0ZShyYXdfb3N0cmVhbSAmT1MpOworfTsKKworLy8vIFxicmllZiBXcml0ZXIgZm9yIGluc3RydW1lbnRhdGlvbiBiYXNlZCBjb3ZlcmFnZSBtYXBwaW5nIGRhdGEuCitjbGFzcyBDb3ZlcmFnZU1hcHBpbmdXcml0ZXIgeworICBBcnJheVJlZjx1bnNpZ25lZD4gVmlydHVhbEZpbGVNYXBwaW5nOworICBBcnJheVJlZjxDb3VudGVyRXhwcmVzc2lvbj4gRXhwcmVzc2lvbnM7CisgIE11dGFibGVBcnJheVJlZjxDb3VudGVyTWFwcGluZ1JlZ2lvbj4gTWFwcGluZ1JlZ2lvbnM7CisKK3B1YmxpYzoKKyAgQ292ZXJhZ2VNYXBwaW5nV3JpdGVyKEFycmF5UmVmPHVuc2lnbmVkPiBWaXJ0dWFsRmlsZU1hcHBpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxDb3VudGVyRXhwcmVzc2lvbj4gRXhwcmVzc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICBNdXRhYmxlQXJyYXlSZWY8Q291bnRlck1hcHBpbmdSZWdpb24+IE1hcHBpbmdSZWdpb25zKQorICAgICAgOiBWaXJ0dWFsRmlsZU1hcHBpbmcoVmlydHVhbEZpbGVNYXBwaW5nKSwgRXhwcmVzc2lvbnMoRXhwcmVzc2lvbnMpLAorICAgICAgICBNYXBwaW5nUmVnaW9ucyhNYXBwaW5nUmVnaW9ucykge30KKworICAvLy8gXGJyaWVmIFdyaXRlIGVuY29kZWQgY292ZXJhZ2UgbWFwcGluZyBkYXRhIHRvIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtLgorICB2b2lkIHdyaXRlKHJhd19vc3RyZWFtICZPUyk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY292ZXJhZ2UKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fUFJPRklMRURBVEFfQ09WRVJBR0VfQ09WRVJBR0VNQVBQSU5HV1JJVEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvR0NPVi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9HQ09WLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk3ZjgwYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvR0NPVi5oCkBAIC0wLDAgKzEsNDYwIEBACisvLz09PS0gR0NPVi5oIC0gTExWTSBjb3ZlcmFnZSB0b29sIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgdG8gcmVhZCBhbmQgd3JpdGUgY292ZXJhZ2UgZmlsZXMgdGhhdAorLy8gdXNlICdnY292JyBmb3JtYXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1BST0ZJTEVEQVRBX0dDT1ZfSAorI2RlZmluZSBMTFZNX1BST0ZJTEVEQVRBX0dDT1ZfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9NYXBWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEdDT1ZGdW5jdGlvbjsKK2NsYXNzIEdDT1ZCbG9jazsKK2NsYXNzIEZpbGVJbmZvOworCituYW1lc3BhY2UgR0NPViB7CisKK2VudW0gR0NPVlZlcnNpb24geyBWNDAyLCBWNDA0LCBWNzA0IH07CisKKy8vLyBcYnJpZWYgQSBzdHJ1Y3QgZm9yIHBhc3NpbmcgZ2NvdiBvcHRpb25zIGJldHdlZW4gZnVuY3Rpb25zLgorc3RydWN0IE9wdGlvbnMgeworICBPcHRpb25zKGJvb2wgQSwgYm9vbCBCLCBib29sIEMsIGJvb2wgRiwgYm9vbCBQLCBib29sIFUsIGJvb2wgTCwgYm9vbCBOKQorICAgICAgOiBBbGxCbG9ja3MoQSksIEJyYW5jaEluZm8oQiksIEJyYW5jaENvdW50KEMpLCBGdW5jQ292ZXJhZ2UoRiksCisgICAgICAgIFByZXNlcnZlUGF0aHMoUCksIFVuY29uZEJyYW5jaChVKSwgTG9uZ0ZpbGVOYW1lcyhMKSwgTm9PdXRwdXQoTikge30KKworICBib29sIEFsbEJsb2NrczsKKyAgYm9vbCBCcmFuY2hJbmZvOworICBib29sIEJyYW5jaENvdW50OworICBib29sIEZ1bmNDb3ZlcmFnZTsKKyAgYm9vbCBQcmVzZXJ2ZVBhdGhzOworICBib29sIFVuY29uZEJyYW5jaDsKKyAgYm9vbCBMb25nRmlsZU5hbWVzOworICBib29sIE5vT3V0cHV0OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEdDT1YKKworLy8vIEdDT1ZCdWZmZXIgLSBBIHdyYXBwZXIgYXJvdW5kIE1lbW9yeUJ1ZmZlciB0byBwcm92aWRlIEdDT1Ygc3BlY2lmaWMKKy8vLyByZWFkIG9wZXJhdGlvbnMuCitjbGFzcyBHQ09WQnVmZmVyIHsKK3B1YmxpYzoKKyAgR0NPVkJ1ZmZlcihNZW1vcnlCdWZmZXIgKkIpIDogQnVmZmVyKEIpIHt9CisKKyAgLy8vIHJlYWRHQ05PRm9ybWF0IC0gQ2hlY2sgR0NOTyBzaWduYXR1cmUgaXMgdmFsaWQgYXQgdGhlIGJlZ2lubmluZyBvZiBidWZmZXIuCisgIGJvb2wgcmVhZEdDTk9Gb3JtYXQoKSB7CisgICAgU3RyaW5nUmVmIEZpbGUgPSBCdWZmZXItPmdldEJ1ZmZlcigpLnNsaWNlKDAsIDQpOworICAgIGlmIChGaWxlICE9ICJvbmNnIikgeworICAgICAgZXJycygpIDw8ICJVbmV4cGVjdGVkIGZpbGUgdHlwZTogIiA8PCBGaWxlIDw8ICIuXG4iOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBDdXJzb3IgPSA0OworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIHJlYWRHQ0RBRm9ybWF0IC0gQ2hlY2sgR0NEQSBzaWduYXR1cmUgaXMgdmFsaWQgYXQgdGhlIGJlZ2lubmluZyBvZiBidWZmZXIuCisgIGJvb2wgcmVhZEdDREFGb3JtYXQoKSB7CisgICAgU3RyaW5nUmVmIEZpbGUgPSBCdWZmZXItPmdldEJ1ZmZlcigpLnNsaWNlKDAsIDQpOworICAgIGlmIChGaWxlICE9ICJhZGNnIikgeworICAgICAgZXJycygpIDw8ICJVbmV4cGVjdGVkIGZpbGUgdHlwZTogIiA8PCBGaWxlIDw8ICIuXG4iOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBDdXJzb3IgPSA0OworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIHJlYWRHQ09WVmVyc2lvbiAtIFJlYWQgR0NPViB2ZXJzaW9uLgorICBib29sIHJlYWRHQ09WVmVyc2lvbihHQ09WOjpHQ09WVmVyc2lvbiAmVmVyc2lvbikgeworICAgIFN0cmluZ1JlZiBWZXJzaW9uU3RyID0gQnVmZmVyLT5nZXRCdWZmZXIoKS5zbGljZShDdXJzb3IsIEN1cnNvciArIDQpOworICAgIGlmIChWZXJzaW9uU3RyID09ICIqMjA0IikgeworICAgICAgQ3Vyc29yICs9IDQ7CisgICAgICBWZXJzaW9uID0gR0NPVjo6VjQwMjsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoVmVyc2lvblN0ciA9PSAiKjQwNCIpIHsKKyAgICAgIEN1cnNvciArPSA0OworICAgICAgVmVyc2lvbiA9IEdDT1Y6OlY0MDQ7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgaWYgKFZlcnNpb25TdHIgPT0gIio3MDQiKSB7CisgICAgICBDdXJzb3IgKz0gNDsKKyAgICAgIFZlcnNpb24gPSBHQ09WOjpWNzA0OworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGVycnMoKSA8PCAiVW5leHBlY3RlZCB2ZXJzaW9uOiAiIDw8IFZlcnNpb25TdHIgPDwgIi5cbiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIHJlYWRGdW5jdGlvblRhZyAtIElmIGN1cnNvciBwb2ludHMgdG8gYSBmdW5jdGlvbiB0YWcgdGhlbiBpbmNyZW1lbnQgdGhlCisgIC8vLyBjdXJzb3IgYW5kIHJldHVybiB0cnVlIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuCisgIGJvb2wgcmVhZEZ1bmN0aW9uVGFnKCkgeworICAgIFN0cmluZ1JlZiBUYWcgPSBCdWZmZXItPmdldEJ1ZmZlcigpLnNsaWNlKEN1cnNvciwgQ3Vyc29yICsgNCk7CisgICAgaWYgKFRhZy5lbXB0eSgpIHx8IFRhZ1swXSAhPSAnXDAnIHx8IFRhZ1sxXSAhPSAnXDAnIHx8IFRhZ1syXSAhPSAnXDAnIHx8CisgICAgICAgIFRhZ1szXSAhPSAnXDEnKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEN1cnNvciArPSA0OworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIHJlYWRCbG9ja1RhZyAtIElmIGN1cnNvciBwb2ludHMgdG8gYSBibG9jayB0YWcgdGhlbiBpbmNyZW1lbnQgdGhlCisgIC8vLyBjdXJzb3IgYW5kIHJldHVybiB0cnVlIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuCisgIGJvb2wgcmVhZEJsb2NrVGFnKCkgeworICAgIFN0cmluZ1JlZiBUYWcgPSBCdWZmZXItPmdldEJ1ZmZlcigpLnNsaWNlKEN1cnNvciwgQ3Vyc29yICsgNCk7CisgICAgaWYgKFRhZy5lbXB0eSgpIHx8IFRhZ1swXSAhPSAnXDAnIHx8IFRhZ1sxXSAhPSAnXDAnIHx8IFRhZ1syXSAhPSAnXHg0MScgfHwKKyAgICAgICAgVGFnWzNdICE9ICdceDAxJykgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBDdXJzb3IgKz0gNDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyByZWFkRWRnZVRhZyAtIElmIGN1cnNvciBwb2ludHMgdG8gYW4gZWRnZSB0YWcgdGhlbiBpbmNyZW1lbnQgdGhlCisgIC8vLyBjdXJzb3IgYW5kIHJldHVybiB0cnVlIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuCisgIGJvb2wgcmVhZEVkZ2VUYWcoKSB7CisgICAgU3RyaW5nUmVmIFRhZyA9IEJ1ZmZlci0+Z2V0QnVmZmVyKCkuc2xpY2UoQ3Vyc29yLCBDdXJzb3IgKyA0KTsKKyAgICBpZiAoVGFnLmVtcHR5KCkgfHwgVGFnWzBdICE9ICdcMCcgfHwgVGFnWzFdICE9ICdcMCcgfHwgVGFnWzJdICE9ICdceDQzJyB8fAorICAgICAgICBUYWdbM10gIT0gJ1x4MDEnKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEN1cnNvciArPSA0OworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIHJlYWRMaW5lVGFnIC0gSWYgY3Vyc29yIHBvaW50cyB0byBhIGxpbmUgdGFnIHRoZW4gaW5jcmVtZW50IHRoZQorICAvLy8gY3Vyc29yIGFuZCByZXR1cm4gdHJ1ZSBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLgorICBib29sIHJlYWRMaW5lVGFnKCkgeworICAgIFN0cmluZ1JlZiBUYWcgPSBCdWZmZXItPmdldEJ1ZmZlcigpLnNsaWNlKEN1cnNvciwgQ3Vyc29yICsgNCk7CisgICAgaWYgKFRhZy5lbXB0eSgpIHx8IFRhZ1swXSAhPSAnXDAnIHx8IFRhZ1sxXSAhPSAnXDAnIHx8IFRhZ1syXSAhPSAnXHg0NScgfHwKKyAgICAgICAgVGFnWzNdICE9ICdceDAxJykgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBDdXJzb3IgKz0gNDsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyByZWFkQXJjVGFnIC0gSWYgY3Vyc29yIHBvaW50cyB0byBhbiBnY2RhIGFyYyB0YWcgdGhlbiBpbmNyZW1lbnQgdGhlCisgIC8vLyBjdXJzb3IgYW5kIHJldHVybiB0cnVlIG90aGVyd2lzZSByZXR1cm4gZmFsc2UuCisgIGJvb2wgcmVhZEFyY1RhZygpIHsKKyAgICBTdHJpbmdSZWYgVGFnID0gQnVmZmVyLT5nZXRCdWZmZXIoKS5zbGljZShDdXJzb3IsIEN1cnNvciArIDQpOworICAgIGlmIChUYWcuZW1wdHkoKSB8fCBUYWdbMF0gIT0gJ1wwJyB8fCBUYWdbMV0gIT0gJ1wwJyB8fCBUYWdbMl0gIT0gJ1x4YTEnIHx8CisgICAgICAgIFRhZ1szXSAhPSAnXDEnKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEN1cnNvciArPSA0OworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8vIHJlYWRPYmplY3RUYWcgLSBJZiBjdXJzb3IgcG9pbnRzIHRvIGFuIG9iamVjdCBzdW1tYXJ5IHRhZyB0aGVuIGluY3JlbWVudAorICAvLy8gdGhlIGN1cnNvciBhbmQgcmV0dXJuIHRydWUgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KKyAgYm9vbCByZWFkT2JqZWN0VGFnKCkgeworICAgIFN0cmluZ1JlZiBUYWcgPSBCdWZmZXItPmdldEJ1ZmZlcigpLnNsaWNlKEN1cnNvciwgQ3Vyc29yICsgNCk7CisgICAgaWYgKFRhZy5lbXB0eSgpIHx8IFRhZ1swXSAhPSAnXDAnIHx8IFRhZ1sxXSAhPSAnXDAnIHx8IFRhZ1syXSAhPSAnXDAnIHx8CisgICAgICAgIFRhZ1szXSAhPSAnXHhhMScpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgQ3Vyc29yICs9IDQ7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gcmVhZFByb2dyYW1UYWcgLSBJZiBjdXJzb3IgcG9pbnRzIHRvIGEgcHJvZ3JhbSBzdW1tYXJ5IHRhZyB0aGVuIGluY3JlbWVudAorICAvLy8gdGhlIGN1cnNvciBhbmQgcmV0dXJuIHRydWUgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KKyAgYm9vbCByZWFkUHJvZ3JhbVRhZygpIHsKKyAgICBTdHJpbmdSZWYgVGFnID0gQnVmZmVyLT5nZXRCdWZmZXIoKS5zbGljZShDdXJzb3IsIEN1cnNvciArIDQpOworICAgIGlmIChUYWcuZW1wdHkoKSB8fCBUYWdbMF0gIT0gJ1wwJyB8fCBUYWdbMV0gIT0gJ1wwJyB8fCBUYWdbMl0gIT0gJ1wwJyB8fAorICAgICAgICBUYWdbM10gIT0gJ1x4YTMnKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEN1cnNvciArPSA0OworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCByZWFkSW50KHVpbnQzMl90ICZWYWwpIHsKKyAgICBpZiAoQnVmZmVyLT5nZXRCdWZmZXIoKS5zaXplKCkgPCBDdXJzb3IgKyA0KSB7CisgICAgICBlcnJzKCkgPDwgIlVuZXhwZWN0ZWQgZW5kIG9mIG1lbW9yeSBidWZmZXI6ICIgPDwgQ3Vyc29yICsgNCA8PCAiLlxuIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgU3RyaW5nUmVmIFN0ciA9IEJ1ZmZlci0+Z2V0QnVmZmVyKCkuc2xpY2UoQ3Vyc29yLCBDdXJzb3IgKyA0KTsKKyAgICBDdXJzb3IgKz0gNDsKKyAgICBWYWwgPSAqKGNvbnN0IHVpbnQzMl90ICopKFN0ci5kYXRhKCkpOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCByZWFkSW50NjQodWludDY0X3QgJlZhbCkgeworICAgIHVpbnQzMl90IExvLCBIaTsKKyAgICBpZiAoIXJlYWRJbnQoTG8pIHx8ICFyZWFkSW50KEhpKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBWYWwgPSAoKHVpbnQ2NF90KUhpIDw8IDMyKSB8IExvOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCByZWFkU3RyaW5nKFN0cmluZ1JlZiAmU3RyKSB7CisgICAgdWludDMyX3QgTGVuID0gMDsKKyAgICAvLyBLZWVwIHJlYWRpbmcgdW50aWwgd2UgZmluZCBhIG5vbi16ZXJvIGxlbmd0aC4gVGhpcyBlbXVsYXRlcyBnY292J3MKKyAgICAvLyBiZWhhdmlvdXIsIHdoaWNoIGFwcGVhcnMgdG8gZG8gdGhlIHNhbWUuCisgICAgd2hpbGUgKExlbiA9PSAwKQorICAgICAgaWYgKCFyZWFkSW50KExlbikpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICBMZW4gKj0gNDsKKyAgICBpZiAoQnVmZmVyLT5nZXRCdWZmZXIoKS5zaXplKCkgPCBDdXJzb3IgKyBMZW4pIHsKKyAgICAgIGVycnMoKSA8PCAiVW5leHBlY3RlZCBlbmQgb2YgbWVtb3J5IGJ1ZmZlcjogIiA8PCBDdXJzb3IgKyBMZW4gPDwgIi5cbiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIFN0ciA9IEJ1ZmZlci0+Z2V0QnVmZmVyKCkuc2xpY2UoQ3Vyc29yLCBDdXJzb3IgKyBMZW4pLnNwbGl0KCdcMCcpLmZpcnN0OworICAgIEN1cnNvciArPSBMZW47CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICB1aW50NjRfdCBnZXRDdXJzb3IoKSBjb25zdCB7IHJldHVybiBDdXJzb3I7IH0KKyAgdm9pZCBhZHZhbmNlQ3Vyc29yKHVpbnQzMl90IG4pIHsgQ3Vyc29yICs9IG4gKiA0OyB9CisKK3ByaXZhdGU6CisgIE1lbW9yeUJ1ZmZlciAqQnVmZmVyOworICB1aW50NjRfdCBDdXJzb3IgPSAwOworfTsKKworLy8vIEdDT1ZGaWxlIC0gQ29sbGVjdHMgY292ZXJhZ2UgaW5mb3JtYXRpb24gZm9yIG9uZSBwYWlyIG9mIGNvdmVyYWdlIGZpbGUKKy8vLyAoLmdjbm8gYW5kIC5nY2RhKS4KK2NsYXNzIEdDT1ZGaWxlIHsKK3B1YmxpYzoKKyAgR0NPVkZpbGUoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCByZWFkR0NOTyhHQ09WQnVmZmVyICZCdWZmZXIpOworICBib29sIHJlYWRHQ0RBKEdDT1ZCdWZmZXIgJkJ1ZmZlcik7CisgIHVpbnQzMl90IGdldENoZWNrc3VtKCkgY29uc3QgeyByZXR1cm4gQ2hlY2tzdW07IH0KKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKKyAgdm9pZCBjb2xsZWN0TGluZUNvdW50cyhGaWxlSW5mbyAmRkkpOworCitwcml2YXRlOgorICBib29sIEdDTk9Jbml0aWFsaXplZCA9IGZhbHNlOworICBHQ09WOjpHQ09WVmVyc2lvbiBWZXJzaW9uOworICB1aW50MzJfdCBDaGVja3N1bSA9IDA7CisgIFNtYWxsVmVjdG9yPHN0ZDo6dW5pcXVlX3B0cjxHQ09WRnVuY3Rpb24+LCAxNj4gRnVuY3Rpb25zOworICB1aW50MzJfdCBSdW5Db3VudCA9IDA7CisgIHVpbnQzMl90IFByb2dyYW1Db3VudCA9IDA7Cit9OworCisvLy8gR0NPVkVkZ2UgLSBDb2xsZWN0cyBlZGdlIGluZm9ybWF0aW9uLgorc3RydWN0IEdDT1ZFZGdlIHsKKyAgR0NPVkVkZ2UoR0NPVkJsb2NrICZTLCBHQ09WQmxvY2sgJkQpIDogU3JjKFMpLCBEc3QoRCkge30KKworICBHQ09WQmxvY2sgJlNyYzsKKyAgR0NPVkJsb2NrICZEc3Q7CisgIHVpbnQ2NF90IENvdW50ID0gMDsKK307CisKKy8vLyBHQ09WRnVuY3Rpb24gLSBDb2xsZWN0cyBmdW5jdGlvbiBpbmZvcm1hdGlvbi4KK2NsYXNzIEdDT1ZGdW5jdGlvbiB7CitwdWJsaWM6CisgIHVzaW5nIEJsb2NrSXRlcmF0b3IgPSBwb2ludGVlX2l0ZXJhdG9yPFNtYWxsVmVjdG9ySW1wbDwKKyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxHQ09WQmxvY2s+Pjo6Y29uc3RfaXRlcmF0b3I+OworCisgIEdDT1ZGdW5jdGlvbihHQ09WRmlsZSAmUCkgOiBQYXJlbnQoUCkge30KKworICBib29sIHJlYWRHQ05PKEdDT1ZCdWZmZXIgJkJ1ZmZlciwgR0NPVjo6R0NPVlZlcnNpb24gVmVyc2lvbik7CisgIGJvb2wgcmVhZEdDREEoR0NPVkJ1ZmZlciAmQnVmZmVyLCBHQ09WOjpHQ09WVmVyc2lvbiBWZXJzaW9uKTsKKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisgIFN0cmluZ1JlZiBnZXRGaWxlbmFtZSgpIGNvbnN0IHsgcmV0dXJuIEZpbGVuYW1lOyB9CisgIHNpemVfdCBnZXROdW1CbG9ja3MoKSBjb25zdCB7IHJldHVybiBCbG9ja3Muc2l6ZSgpOyB9CisgIHVpbnQ2NF90IGdldEVudHJ5Q291bnQoKSBjb25zdDsKKyAgdWludDY0X3QgZ2V0RXhpdENvdW50KCkgY29uc3Q7CisKKyAgQmxvY2tJdGVyYXRvciBibG9ja19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIEJsb2Nrcy5iZWdpbigpOyB9CisgIEJsb2NrSXRlcmF0b3IgYmxvY2tfZW5kKCkgY29uc3QgeyByZXR1cm4gQmxvY2tzLmVuZCgpOyB9CisgIGl0ZXJhdG9yX3JhbmdlPEJsb2NrSXRlcmF0b3I+IGJsb2NrcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShibG9ja19iZWdpbigpLCBibG9ja19lbmQoKSk7CisgIH0KKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworICB2b2lkIGNvbGxlY3RMaW5lQ291bnRzKEZpbGVJbmZvICZGSSk7CisKK3ByaXZhdGU6CisgIEdDT1ZGaWxlICZQYXJlbnQ7CisgIHVpbnQzMl90IElkZW50ID0gMDsKKyAgdWludDMyX3QgQ2hlY2tzdW07CisgIHVpbnQzMl90IExpbmVOdW1iZXIgPSAwOworICBTdHJpbmdSZWYgTmFtZTsKKyAgU3RyaW5nUmVmIEZpbGVuYW1lOworICBTbWFsbFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8R0NPVkJsb2NrPiwgMTY+IEJsb2NrczsKKyAgU21hbGxWZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEdDT1ZFZGdlPiwgMTY+IEVkZ2VzOworfTsKKworLy8vIEdDT1ZCbG9jayAtIENvbGxlY3RzIGJsb2NrIGluZm9ybWF0aW9uLgorY2xhc3MgR0NPVkJsb2NrIHsKKyAgc3RydWN0IEVkZ2VXZWlnaHQgeworICAgIEVkZ2VXZWlnaHQoR0NPVkJsb2NrICpEKSA6IERzdChEKSB7fQorCisgICAgR0NPVkJsb2NrICpEc3Q7CisgICAgdWludDY0X3QgQ291bnQgPSAwOworICB9OworCisgIHN0cnVjdCBTb3J0RHN0RWRnZXNGdW5jdG9yIHsKKyAgICBib29sIG9wZXJhdG9yKCkoY29uc3QgR0NPVkVkZ2UgKkUxLCBjb25zdCBHQ09WRWRnZSAqRTIpIHsKKyAgICAgIHJldHVybiBFMS0+RHN0Lk51bWJlciA8IEUyLT5Ec3QuTnVtYmVyOworICAgIH0KKyAgfTsKKworcHVibGljOgorICB1c2luZyBFZGdlSXRlcmF0b3IgPSBTbWFsbFZlY3RvckltcGw8R0NPVkVkZ2UgKj46OmNvbnN0X2l0ZXJhdG9yOworCisgIEdDT1ZCbG9jayhHQ09WRnVuY3Rpb24gJlAsIHVpbnQzMl90IE4pIDogUGFyZW50KFApLCBOdW1iZXIoTikge30KKyAgfkdDT1ZCbG9jaygpOworCisgIGNvbnN0IEdDT1ZGdW5jdGlvbiAmZ2V0UGFyZW50KCkgY29uc3QgeyByZXR1cm4gUGFyZW50OyB9CisgIHZvaWQgYWRkTGluZSh1aW50MzJfdCBOKSB7IExpbmVzLnB1c2hfYmFjayhOKTsgfQorICB1aW50MzJfdCBnZXRMYXN0TGluZSgpIGNvbnN0IHsgcmV0dXJuIExpbmVzLmJhY2soKTsgfQorICB2b2lkIGFkZENvdW50KHNpemVfdCBEc3RFZGdlTm8sIHVpbnQ2NF90IE4pOworICB1aW50NjRfdCBnZXRDb3VudCgpIGNvbnN0IHsgcmV0dXJuIENvdW50ZXI7IH0KKworICB2b2lkIGFkZFNyY0VkZ2UoR0NPVkVkZ2UgKkVkZ2UpIHsKKyAgICBhc3NlcnQoJkVkZ2UtPkRzdCA9PSB0aGlzKTsgLy8gdXAgdG8gY2FsbGVyIHRvIGVuc3VyZSBlZGdlIGlzIHZhbGlkCisgICAgU3JjRWRnZXMucHVzaF9iYWNrKEVkZ2UpOworICB9CisKKyAgdm9pZCBhZGREc3RFZGdlKEdDT1ZFZGdlICpFZGdlKSB7CisgICAgYXNzZXJ0KCZFZGdlLT5TcmMgPT0gdGhpcyk7IC8vIHVwIHRvIGNhbGxlciB0byBlbnN1cmUgZWRnZSBpcyB2YWxpZAorICAgIC8vIENoZWNrIGlmIGFkZGluZyB0aGlzIGVkZ2UgY2F1c2VzIGxpc3QgdG8gYmVjb21lIHVuc29ydGVkLgorICAgIGlmIChEc3RFZGdlcy5zaXplKCkgJiYgRHN0RWRnZXMuYmFjaygpLT5Ec3QuTnVtYmVyID4gRWRnZS0+RHN0Lk51bWJlcikKKyAgICAgIERzdEVkZ2VzQXJlU29ydGVkID0gZmFsc2U7CisgICAgRHN0RWRnZXMucHVzaF9iYWNrKEVkZ2UpOworICB9CisKKyAgc2l6ZV90IGdldE51bVNyY0VkZ2VzKCkgY29uc3QgeyByZXR1cm4gU3JjRWRnZXMuc2l6ZSgpOyB9CisgIHNpemVfdCBnZXROdW1Ec3RFZGdlcygpIGNvbnN0IHsgcmV0dXJuIERzdEVkZ2VzLnNpemUoKTsgfQorICB2b2lkIHNvcnREc3RFZGdlcygpOworCisgIEVkZ2VJdGVyYXRvciBzcmNfYmVnaW4oKSBjb25zdCB7IHJldHVybiBTcmNFZGdlcy5iZWdpbigpOyB9CisgIEVkZ2VJdGVyYXRvciBzcmNfZW5kKCkgY29uc3QgeyByZXR1cm4gU3JjRWRnZXMuZW5kKCk7IH0KKyAgaXRlcmF0b3JfcmFuZ2U8RWRnZUl0ZXJhdG9yPiBzcmNzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlX3JhbmdlKHNyY19iZWdpbigpLCBzcmNfZW5kKCkpOworICB9CisKKyAgRWRnZUl0ZXJhdG9yIGRzdF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIERzdEVkZ2VzLmJlZ2luKCk7IH0KKyAgRWRnZUl0ZXJhdG9yIGRzdF9lbmQoKSBjb25zdCB7IHJldHVybiBEc3RFZGdlcy5lbmQoKTsgfQorICBpdGVyYXRvcl9yYW5nZTxFZGdlSXRlcmF0b3I+IGRzdHMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoZHN0X2JlZ2luKCksIGRzdF9lbmQoKSk7CisgIH0KKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworICB2b2lkIGNvbGxlY3RMaW5lQ291bnRzKEZpbGVJbmZvICZGSSk7CisKK3ByaXZhdGU6CisgIEdDT1ZGdW5jdGlvbiAmUGFyZW50OworICB1aW50MzJfdCBOdW1iZXI7CisgIHVpbnQ2NF90IENvdW50ZXIgPSAwOworICBib29sIERzdEVkZ2VzQXJlU29ydGVkID0gdHJ1ZTsKKyAgU21hbGxWZWN0b3I8R0NPVkVkZ2UgKiwgMTY+IFNyY0VkZ2VzOworICBTbWFsbFZlY3RvcjxHQ09WRWRnZSAqLCAxNj4gRHN0RWRnZXM7CisgIFNtYWxsVmVjdG9yPHVpbnQzMl90LCAxNj4gTGluZXM7Cit9OworCitjbGFzcyBGaWxlSW5mbyB7CisgIC8vIEl0IGlzIHVubGlrZWx5LS1idXQgcG9zc2libGUtLWZvciBtdWx0aXBsZSBmdW5jdGlvbnMgdG8gYmUgb24gdGhlIHNhbWUKKyAgLy8gbGluZS4KKyAgLy8gVGhlcmVmb3JlIHRoaXMgdHlwZWRlZiBhbGxvd3MgTGluZURhdGEuRnVuY3Rpb25zIHRvIHN0b3JlIG11bHRpcGxlCisgIC8vIGZ1bmN0aW9ucworICAvLyBwZXIgaW5zdGFuY2UuIFRoaXMgaXMgcmFyZSwgaG93ZXZlciwgc28gb3B0aW1pemUgZm9yIHRoZSBjb21tb24gY2FzZS4KKyAgdXNpbmcgRnVuY3Rpb25WZWN0b3IgPSBTbWFsbFZlY3Rvcjxjb25zdCBHQ09WRnVuY3Rpb24gKiwgMT47CisgIHVzaW5nIEZ1bmN0aW9uTGluZXMgPSBEZW5zZU1hcDx1aW50MzJfdCwgRnVuY3Rpb25WZWN0b3I+OworICB1c2luZyBCbG9ja1ZlY3RvciA9IFNtYWxsVmVjdG9yPGNvbnN0IEdDT1ZCbG9jayAqLCA0PjsKKyAgdXNpbmcgQmxvY2tMaW5lcyA9IERlbnNlTWFwPHVpbnQzMl90LCBCbG9ja1ZlY3Rvcj47CisKKyAgc3RydWN0IExpbmVEYXRhIHsKKyAgICBMaW5lRGF0YSgpID0gZGVmYXVsdDsKKworICAgIEJsb2NrTGluZXMgQmxvY2tzOworICAgIEZ1bmN0aW9uTGluZXMgRnVuY3Rpb25zOworICAgIHVpbnQzMl90IExhc3RMaW5lID0gMDsKKyAgfTsKKworICBzdHJ1Y3QgR0NPVkNvdmVyYWdlIHsKKyAgICBHQ09WQ292ZXJhZ2UoU3RyaW5nUmVmIE5hbWUpIDogTmFtZShOYW1lKSB7fQorCisgICAgU3RyaW5nUmVmIE5hbWU7CisKKyAgICB1aW50MzJfdCBMb2dpY2FsTGluZXMgPSAwOworICAgIHVpbnQzMl90IExpbmVzRXhlYyA9IDA7CisKKyAgICB1aW50MzJfdCBCcmFuY2hlcyA9IDA7CisgICAgdWludDMyX3QgQnJhbmNoZXNFeGVjID0gMDsKKyAgICB1aW50MzJfdCBCcmFuY2hlc1Rha2VuID0gMDsKKyAgfTsKKworcHVibGljOgorICBGaWxlSW5mbyhjb25zdCBHQ09WOjpPcHRpb25zICZPcHRpb25zKSA6IE9wdGlvbnMoT3B0aW9ucykge30KKworICB2b2lkIGFkZEJsb2NrTGluZShTdHJpbmdSZWYgRmlsZW5hbWUsIHVpbnQzMl90IExpbmUsIGNvbnN0IEdDT1ZCbG9jayAqQmxvY2spIHsKKyAgICBpZiAoTGluZSA+IExpbmVJbmZvW0ZpbGVuYW1lXS5MYXN0TGluZSkKKyAgICAgIExpbmVJbmZvW0ZpbGVuYW1lXS5MYXN0TGluZSA9IExpbmU7CisgICAgTGluZUluZm9bRmlsZW5hbWVdLkJsb2Nrc1tMaW5lIC0gMV0ucHVzaF9iYWNrKEJsb2NrKTsKKyAgfQorCisgIHZvaWQgYWRkRnVuY3Rpb25MaW5lKFN0cmluZ1JlZiBGaWxlbmFtZSwgdWludDMyX3QgTGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR0NPVkZ1bmN0aW9uICpGdW5jdGlvbikgeworICAgIGlmIChMaW5lID4gTGluZUluZm9bRmlsZW5hbWVdLkxhc3RMaW5lKQorICAgICAgTGluZUluZm9bRmlsZW5hbWVdLkxhc3RMaW5lID0gTGluZTsKKyAgICBMaW5lSW5mb1tGaWxlbmFtZV0uRnVuY3Rpb25zW0xpbmUgLSAxXS5wdXNoX2JhY2soRnVuY3Rpb24pOworICB9CisKKyAgdm9pZCBzZXRSdW5Db3VudCh1aW50MzJfdCBSdW5zKSB7IFJ1bkNvdW50ID0gUnVuczsgfQorICB2b2lkIHNldFByb2dyYW1Db3VudCh1aW50MzJfdCBQcm9ncmFtcykgeyBQcm9ncmFtQ291bnQgPSBQcm9ncmFtczsgfQorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgU3RyaW5nUmVmIE1haW5GaWxlbmFtZSwgU3RyaW5nUmVmIEdDTk9GaWxlLAorICAgICAgICAgICAgIFN0cmluZ1JlZiBHQ0RBRmlsZSk7CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIGdldENvdmVyYWdlUGF0aChTdHJpbmdSZWYgRmlsZW5hbWUsIFN0cmluZ1JlZiBNYWluRmlsZW5hbWUpOworICBzdGQ6OnVuaXF1ZV9wdHI8cmF3X29zdHJlYW0+IG9wZW5Db3ZlcmFnZVBhdGgoU3RyaW5nUmVmIENvdmVyYWdlUGF0aCk7CisgIHZvaWQgcHJpbnRGdW5jdGlvblN1bW1hcnkocmF3X29zdHJlYW0gJk9TLCBjb25zdCBGdW5jdGlvblZlY3RvciAmRnVuY3MpIGNvbnN0OworICB2b2lkIHByaW50QmxvY2tJbmZvKHJhd19vc3RyZWFtICZPUywgY29uc3QgR0NPVkJsb2NrICZCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBMaW5lSW5kZXgsIHVpbnQzMl90ICZCbG9ja05vKSBjb25zdDsKKyAgdm9pZCBwcmludEJyYW5jaEluZm8ocmF3X29zdHJlYW0gJk9TLCBjb25zdCBHQ09WQmxvY2sgJkJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICBHQ09WQ292ZXJhZ2UgJkNvdmVyYWdlLCB1aW50MzJfdCAmRWRnZU5vKTsKKyAgdm9pZCBwcmludFVuY29uZEJyYW5jaEluZm8ocmF3X29zdHJlYW0gJk9TLCB1aW50MzJfdCAmRWRnZU5vLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBDb3VudCkgY29uc3Q7CisKKyAgdm9pZCBwcmludENvdmVyYWdlKHJhd19vc3RyZWFtICZPUywgY29uc3QgR0NPVkNvdmVyYWdlICZDb3ZlcmFnZSkgY29uc3Q7CisgIHZvaWQgcHJpbnRGdW5jQ292ZXJhZ2UocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgdm9pZCBwcmludEZpbGVDb3ZlcmFnZShyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworCisgIGNvbnN0IEdDT1Y6Ok9wdGlvbnMgJk9wdGlvbnM7CisgIFN0cmluZ01hcDxMaW5lRGF0YT4gTGluZUluZm87CisgIHVpbnQzMl90IFJ1bkNvdW50ID0gMDsKKyAgdWludDMyX3QgUHJvZ3JhbUNvdW50ID0gMDsKKworICB1c2luZyBGaWxlQ292ZXJhZ2VMaXN0ID0gU21hbGxWZWN0b3I8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBHQ09WQ292ZXJhZ2U+LCA0PjsKKyAgdXNpbmcgRnVuY0NvdmVyYWdlTWFwID0gTWFwVmVjdG9yPGNvbnN0IEdDT1ZGdW5jdGlvbiAqLCBHQ09WQ292ZXJhZ2U+OworCisgIEZpbGVDb3ZlcmFnZUxpc3QgRmlsZUNvdmVyYWdlczsKKyAgRnVuY0NvdmVyYWdlTWFwIEZ1bmNDb3ZlcmFnZXM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0dDT1ZfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9JbnN0clByb2YuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhhZTBmMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mLmgKQEAgLTAsMCArMSwxMDQ2IEBACisvLz09PS0gSW5zdHJQcm9mLmggLSBJbnN0cnVtZW50ZWQgcHJvZmlsaW5nIGZvcm1hdCBzdXBwb3J0IC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEluc3RydW1lbnRhdGlvbi1iYXNlZCBwcm9maWxpbmcgZGF0YSBpcyBnZW5lcmF0ZWQgYnkgaW5zdHJ1bWVudGVkCisvLyBiaW5hcmllcyB0aHJvdWdoIGxpYnJhcnkgZnVuY3Rpb25zIGluIGNvbXBpbGVyLXJ0LCBhbmQgcmVhZCBieSB0aGUgY2xhbmcKKy8vIGZyb250ZW5kIHRvIGZlZWQgUEdPLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9QUk9GSUxFREFUQV9JTlNUUlBST0ZfSAorI2RlZmluZSBMTFZNX1BST0ZJTEVEQVRBX0lOU1RSUFJPRl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1RyaXBsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Byb2ZpbGVTdW1tYXJ5LmgiCisjaW5jbHVkZSAibGx2bS9Qcm9maWxlRGF0YS9JbnN0clByb2ZEYXRhLmluYyIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvSG9zdC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NRDUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGxpc3Q+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBHbG9iYWxWYXJpYWJsZTsKK3N0cnVjdCBJbnN0clByb2ZSZWNvcmQ7CitjbGFzcyBJbnN0clByb2ZTeW10YWI7CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIE1ETm9kZTsKK2NsYXNzIE1vZHVsZTsKKworZW51bSBJbnN0clByb2ZTZWN0S2luZCB7CisjZGVmaW5lIElOU1RSX1BST0ZfU0VDVF9FTlRSWShLaW5kLCBTZWN0TmFtZUNvbW1vbiwgU2VjdE5hbWVDb2ZmLCBQcmVmaXgpIEtpbmQsCisjaW5jbHVkZSAibGx2bS9Qcm9maWxlRGF0YS9JbnN0clByb2ZEYXRhLmluYyIKK307CisKKy8vLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHByb2ZpbGUgc2VjdGlvbiBjb3JyZXNwb25kaW5nIHRvIFxwIElQU0suCisvLy8KKy8vLyBUaGUgbmFtZSBvZiB0aGUgc2VjdGlvbiBkZXBlbmRzIG9uIHRoZSBvYmplY3QgZm9ybWF0IHR5cGUgXHAgT0YuIElmCisvLy8gXHAgQWRkU2VnbWVudEluZm8gaXMgdHJ1ZSwgYSBzZWdtZW50IHByZWZpeCBhbmQgYWRkaXRpb25hbCBsaW5rZXIgaGludHMgbWF5CisvLy8gYmUgYWRkZWQgdG8gdGhlIHNlY3Rpb24gbmFtZSAodGhpcyBpcyB0aGUgZGVmYXVsdCkuCitzdGQ6OnN0cmluZyBnZXRJbnN0clByb2ZTZWN0aW9uTmFtZShJbnN0clByb2ZTZWN0S2luZCBJUFNLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpcGxlOjpPYmplY3RGb3JtYXRUeXBlIE9GLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBZGRTZWdtZW50SW5mbyA9IHRydWUpOworCisvLy8gUmV0dXJuIHRoZSBuYW1lIHByb2ZpbGUgcnVudGltZSBlbnRyeSBwb2ludCB0byBkbyB2YWx1ZSBwcm9maWxpbmcKKy8vLyBmb3IgYSBnaXZlbiBzaXRlLgoraW5saW5lIFN0cmluZ1JlZiBnZXRJbnN0clByb2ZWYWx1ZVByb2ZGdW5jTmFtZSgpIHsKKyAgcmV0dXJuIElOU1RSX1BST0ZfVkFMVUVfUFJPRl9GVU5DX1NUUjsKK30KKworLy8vIFJldHVybiB0aGUgbmFtZSBwcm9maWxlIHJ1bnRpbWUgZW50cnkgcG9pbnQgdG8gZG8gdmFsdWUgcmFuZ2UgcHJvZmlsaW5nLgoraW5saW5lIFN0cmluZ1JlZiBnZXRJbnN0clByb2ZWYWx1ZVJhbmdlUHJvZkZ1bmNOYW1lKCkgeworICByZXR1cm4gSU5TVFJfUFJPRl9WQUxVRV9SQU5HRV9QUk9GX0ZVTkNfU1RSOworfQorCisvLy8gUmV0dXJuIHRoZSBuYW1lIHByZWZpeCBvZiB2YXJpYWJsZXMgY29udGFpbmluZyBpbnN0cnVtZW50ZWQgZnVuY3Rpb24gbmFtZXMuCitpbmxpbmUgU3RyaW5nUmVmIGdldEluc3RyUHJvZk5hbWVWYXJQcmVmaXgoKSB7IHJldHVybiAiX19wcm9mbl8iOyB9CisKKy8vLyBSZXR1cm4gdGhlIG5hbWUgcHJlZml4IG9mIHZhcmlhYmxlcyBjb250YWluaW5nIHBlci1mdW5jdGlvbiBjb250cm9sIGRhdGEuCitpbmxpbmUgU3RyaW5nUmVmIGdldEluc3RyUHJvZkRhdGFWYXJQcmVmaXgoKSB7IHJldHVybiAiX19wcm9mZF8iOyB9CisKKy8vLyBSZXR1cm4gdGhlIG5hbWUgcHJlZml4IG9mIHByb2ZpbGUgY291bnRlciB2YXJpYWJsZXMuCitpbmxpbmUgU3RyaW5nUmVmIGdldEluc3RyUHJvZkNvdW50ZXJzVmFyUHJlZml4KCkgeyByZXR1cm4gIl9fcHJvZmNfIjsgfQorCisvLy8gUmV0dXJuIHRoZSBuYW1lIHByZWZpeCBvZiB2YWx1ZSBwcm9maWxlIHZhcmlhYmxlcy4KK2lubGluZSBTdHJpbmdSZWYgZ2V0SW5zdHJQcm9mVmFsdWVzVmFyUHJlZml4KCkgeyByZXR1cm4gIl9fcHJvZnZwXyI7IH0KKworLy8vIFJldHVybiB0aGUgbmFtZSBvZiB2YWx1ZSBwcm9maWxlIG5vZGUgYXJyYXkgdmFyaWFibGVzOgoraW5saW5lIFN0cmluZ1JlZiBnZXRJbnN0clByb2ZWTm9kZXNWYXJOYW1lKCkgeyByZXR1cm4gIl9fbGx2bV9wcmZfdm5vZGVzIjsgfQorCisvLy8gUmV0dXJuIHRoZSBuYW1lIHByZWZpeCBvZiB0aGUgQ09NREFUIGdyb3VwIGZvciBpbnN0cnVtZW50YXRpb24gdmFyaWFibGVzCisvLy8gYXNzb2NpYXRlZCB3aXRoIGEgQ09NREFUIGZ1bmN0aW9uLgoraW5saW5lIFN0cmluZ1JlZiBnZXRJbnN0clByb2ZDb21kYXRQcmVmaXgoKSB7IHJldHVybiAiX19wcm9mdl8iOyB9CisKKy8vLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlIGhvbGRpbmcgdGhlIHN0cmluZ3MgKHBvc3NpYmx5IGNvbXByZXNzZWQpCisvLy8gb2YgYWxsIGZ1bmN0aW9uJ3MgUEdPIG5hbWVzLgoraW5saW5lIFN0cmluZ1JlZiBnZXRJbnN0clByb2ZOYW1lc1Zhck5hbWUoKSB7CisgIHJldHVybiAiX19sbHZtX3ByZl9ubSI7Cit9CisKKy8vLyBSZXR1cm4gdGhlIG5hbWUgb2YgYSBjb3ZhcmFnZSBtYXBwaW5nIHZhcmlhYmxlIChpbnRlcm5hbCBsaW5rYWdlKQorLy8vIGZvciBlYWNoIGluc3RydW1lbnRlZCBzb3VyY2UgbW9kdWxlLiBTdWNoIHZhcmlhYmxlcyBhcmUgYWxsb2NhdGVkCisvLy8gaW4gdGhlIF9fbGx2bV9jb3ZtYXAgc2VjdGlvbi4KK2lubGluZSBTdHJpbmdSZWYgZ2V0Q292ZXJhZ2VNYXBwaW5nVmFyTmFtZSgpIHsKKyAgcmV0dXJuICJfX2xsdm1fY292ZXJhZ2VfbWFwcGluZyI7Cit9CisKKy8vLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGludGVybmFsIHZhcmlhYmxlIHJlY29yZGluZyB0aGUgYXJyYXkKKy8vLyBvZiBQR08gbmFtZSB2YXJzIHJlZmVyZW5jZWQgYnkgdGhlIGNvdmVyYWdlIG1hcHBpbmcuIFRoZSBvd25pbmcKKy8vLyBmdW5jdGlvbnMgb2YgdGhvc2UgbmFtZXMgYXJlIG5vdCBlbWl0dGVkIGJ5IEZFIChlLmcsIHVudXNlZCBpbmxpbmUKKy8vLyBmdW5jdGlvbnMuKQoraW5saW5lIFN0cmluZ1JlZiBnZXRDb3ZlcmFnZVVudXNlZE5hbWVzVmFyTmFtZSgpIHsKKyAgcmV0dXJuICJfX2xsdm1fY292ZXJhZ2VfbmFtZXMiOworfQorCisvLy8gUmV0dXJuIHRoZSBuYW1lIG9mIGZ1bmN0aW9uIHRoYXQgcmVnaXN0ZXJzIGFsbCB0aGUgcGVyLWZ1bmN0aW9uIGNvbnRyb2wKKy8vLyBkYXRhIGF0IHByb2dyYW0gc3RhcnR1cCB0aW1lIGJ5IGNhbGxpbmcgX19sbHZtX3JlZ2lzdGVyX2Z1bmN0aW9uLiBUaGlzCisvLy8gZnVuY3Rpb24gaGFzIGludGVybmFsIGxpbmthZ2UgYW5kIGlzIGNhbGxlZCBieSAgX19sbHZtX3Byb2ZpbGVfaW5pdAorLy8vIHJ1bnRpbWUgbWV0aG9kLiBUaGlzIGZ1bmN0aW9uIGlzIG5vdCBnZW5lcmF0ZWQgZm9yIHRoZXNlIHBsYXRmb3JtczoKKy8vLyBEYXJ3aW4sIExpbnV4LCBhbmQgRnJlZUJTRC4KK2lubGluZSBTdHJpbmdSZWYgZ2V0SW5zdHJQcm9mUmVnRnVuY3NOYW1lKCkgeworICByZXR1cm4gIl9fbGx2bV9wcm9maWxlX3JlZ2lzdGVyX2Z1bmN0aW9ucyI7Cit9CisKKy8vLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHJ1bnRpbWUgaW50ZXJmYWNlIHRoYXQgcmVnaXN0ZXJzIHBlci1mdW5jdGlvbiBjb250cm9sCisvLy8gZGF0YSBmb3Igb25lIGluc3RydW1lbnRlZCBmdW5jdGlvbi4KK2lubGluZSBTdHJpbmdSZWYgZ2V0SW5zdHJQcm9mUmVnRnVuY05hbWUoKSB7CisgIHJldHVybiAiX19sbHZtX3Byb2ZpbGVfcmVnaXN0ZXJfZnVuY3Rpb24iOworfQorCisvLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBydW50aW1lIGludGVyZmFjZSB0aGF0IHJlZ2lzdGVycyB0aGUgUEdPIG5hbWUgc3RyaW5ncy4KK2lubGluZSBTdHJpbmdSZWYgZ2V0SW5zdHJQcm9mTmFtZXNSZWdGdW5jTmFtZSgpIHsKKyAgcmV0dXJuICJfX2xsdm1fcHJvZmlsZV9yZWdpc3Rlcl9uYW1lc19mdW5jdGlvbiI7Cit9CisKKy8vLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHJ1bnRpbWUgaW5pdGlhbGl6YXRpb24gbWV0aG9kIHRoYXQgaXMgZ2VuZXJhdGVkIGJ5CisvLy8gdGhlIGNvbXBpbGVyLiBUaGUgZnVuY3Rpb24gY2FsbHMgX19sbHZtX3Byb2ZpbGVfcmVnaXN0ZXJfZnVuY3Rpb25zIGFuZAorLy8vIF9fbGx2bV9wcm9maWxlX292ZXJyaWRlX2RlZmF1bHRfZmlsZW5hbWUgZnVuY3Rpb25zIGlmIG5lZWRlZC4gVGhpcyBmdW5jdGlvbgorLy8vIGhhcyBpbnRlcm5hbCBsaW5rYWdlIGFuZCBpbnZva2VkIGF0IHN0YXJ0dXAgdGltZSB2aWEgaW5pdF9hcnJheS4KK2lubGluZSBTdHJpbmdSZWYgZ2V0SW5zdHJQcm9mSW5pdEZ1bmNOYW1lKCkgeyByZXR1cm4gIl9fbGx2bV9wcm9maWxlX2luaXQiOyB9CisKKy8vLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIGhvb2sgdmFyaWFibGUgZGVmaW5lZCBpbiBwcm9maWxlIHJ1bnRpbWUgbGlicmFyeS4KKy8vLyBBIHJlZmVyZW5jZSB0byB0aGUgdmFyaWFibGUgY2F1c2VzIHRoZSBsaW5rZXIgdG8gbGluayBpbiB0aGUgcnVudGltZQorLy8vIGluaXRpYWxpemF0aW9uIG1vZHVsZSAod2hpY2ggZGVmaW5lcyB0aGUgaG9vayB2YXJpYWJsZSkuCitpbmxpbmUgU3RyaW5nUmVmIGdldEluc3RyUHJvZlJ1bnRpbWVIb29rVmFyTmFtZSgpIHsKKyAgcmV0dXJuIElOU1RSX1BST0ZfUVVPVEUoSU5TVFJfUFJPRl9QUk9GSUxFX1JVTlRJTUVfVkFSKTsKK30KKworLy8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgY29tcGlsZXIgZ2VuZXJhdGVkIGZ1bmN0aW9uIHRoYXQgcmVmZXJlbmNlcyB0aGUKKy8vLyBydW50aW1lIGhvb2sgdmFyaWFibGUuIFRoZSBmdW5jdGlvbiBpcyBhIHdlYWsgZ2xvYmFsLgoraW5saW5lIFN0cmluZ1JlZiBnZXRJbnN0clByb2ZSdW50aW1lSG9va1ZhclVzZUZ1bmNOYW1lKCkgeworICByZXR1cm4gIl9fbGx2bV9wcm9maWxlX3J1bnRpbWVfdXNlciI7Cit9CisKKy8vLyBSZXR1cm4gdGhlIG1hcmtlciB1c2VkIHRvIHNlcGFyYXRlIFBHTyBuYW1lcyBkdXJpbmcgc2VyaWFsaXphdGlvbi4KK2lubGluZSBTdHJpbmdSZWYgZ2V0SW5zdHJQcm9mTmFtZVNlcGFyYXRvcigpIHsgcmV0dXJuICJcMDEiOyB9CisKKy8vLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG5hbWUgZm9yIGZ1bmN0aW9uIFxjIEYgc3VpdGFibGUgdG8gYmUKKy8vLyB1c2VkIHRoZSBrZXkgZm9yIHByb2ZpbGUgbG9va3VwLiBWYXJpYWJsZSBcYyBJbkxUTyBpbmRpY2F0ZXMgaWYgdGhpcworLy8vIGlzIGNhbGxlZCBpbiBMVE8gb3B0aW1pemF0aW9uIHBhc3Nlcy4KK3N0ZDo6c3RyaW5nIGdldFBHT0Z1bmNOYW1lKGNvbnN0IEZ1bmN0aW9uICZGLCBib29sIEluTFRPID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBWZXJzaW9uID0gSU5TVFJfUFJPRl9JTkRFWF9WRVJTSU9OKTsKKworLy8vIFJldHVybiB0aGUgbW9kaWZpZWQgbmFtZSBmb3IgYSBmdW5jdGlvbiBzdWl0YWJsZSB0byBiZQorLy8vIHVzZWQgdGhlIGtleSBmb3IgcHJvZmlsZSBsb29rdXAuIFRoZSBmdW5jdGlvbidzIG9yaWdpbmFsCisvLy8gbmFtZSBpcyBcYyBSYXdGdW5jTmFtZSBhbmQgaGFzIGxpbmthZ2Ugb2YgdHlwZSBcYyBMaW5rYWdlLgorLy8vIFRoZSBmdW5jdGlvbiBpcyBkZWZpbmVkIGluIG1vZHVsZSBcYyBGaWxlTmFtZS4KK3N0ZDo6c3RyaW5nIGdldFBHT0Z1bmNOYW1lKFN0cmluZ1JlZiBSYXdGdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEdsb2JhbFZhbHVlOjpMaW5rYWdlVHlwZXMgTGlua2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGaWxlTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFZlcnNpb24gPSBJTlNUUl9QUk9GX0lOREVYX1ZFUlNJT04pOworCisvLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBnbG9iYWwgdmFyaWFibGUgdXNlZCB0byBzdG9yZSBhIGZ1bmN0aW9uCisvLy8gbmFtZSBpbiBQR08gaW5zdHJ1bWVudGF0aW9uLiBcYyBGdW5jTmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24KKy8vLyByZXR1cm5lZCBieSB0aGUgXGMgZ2V0UEdPRnVuY05hbWUgY2FsbC4KK3N0ZDo6c3RyaW5nIGdldFBHT0Z1bmNOYW1lVmFyTmFtZShTdHJpbmdSZWYgRnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcyBMaW5rYWdlKTsKKworLy8vIENyZWF0ZSBhbmQgcmV0dXJuIHRoZSBnbG9iYWwgdmFyaWFibGUgZm9yIGZ1bmN0aW9uIG5hbWUgdXNlZCBpbiBQR08KKy8vLyBpbnN0cnVtZW50YXRpb24uIFxjIEZ1bmNOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbiByZXR1cm5lZAorLy8vIGJ5IFxjIGdldFBHT0Z1bmNOYW1lIGNhbGwuCitHbG9iYWxWYXJpYWJsZSAqY3JlYXRlUEdPRnVuY05hbWVWYXIoRnVuY3Rpb24gJkYsIFN0cmluZ1JlZiBQR09GdW5jTmFtZSk7CisKKy8vLyBDcmVhdGUgYW5kIHJldHVybiB0aGUgZ2xvYmFsIHZhcmlhYmxlIGZvciBmdW5jdGlvbiBuYW1lIHVzZWQgaW4gUEdPCisvLy8gaW5zdHJ1bWVudGF0aW9uLiAgLy8vIFxjIEZ1bmNOYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmdW5jdGlvbgorLy8vIHJldHVybmVkIGJ5IFxjIGdldFBHT0Z1bmNOYW1lIGNhbGwsIFxjIE0gaXMgdGhlIG93bmluZyBtb2R1bGUsCisvLy8gYW5kIFxjIExpbmthZ2UgaXMgdGhlIGxpbmthZ2Ugb2YgdGhlIGluc3RydW1lbnRlZCBmdW5jdGlvbi4KK0dsb2JhbFZhcmlhYmxlICpjcmVhdGVQR09GdW5jTmFtZVZhcihNb2R1bGUgJk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2xvYmFsVmFsdWU6OkxpbmthZ2VUeXBlcyBMaW5rYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBQR09GdW5jTmFtZSk7CisKKy8vLyBSZXR1cm4gdGhlIGluaXRpYWxpemVyIGluIHN0cmluZyBvZiB0aGUgUEdPIG5hbWUgdmFyIFxjIE5hbWVWYXIuCitTdHJpbmdSZWYgZ2V0UEdPRnVuY05hbWVWYXJJbml0aWFsaXplcihHbG9iYWxWYXJpYWJsZSAqTmFtZVZhcik7CisKKy8vLyBHaXZlbiBhIFBHTyBmdW5jdGlvbiBuYW1lLCByZW1vdmUgdGhlIGZpbGVuYW1lIHByZWZpeCBhbmQgcmV0dXJuCisvLy8gdGhlIG9yaWdpbmFsIChzdGF0aWMpIGZ1bmN0aW9uIG5hbWUuCitTdHJpbmdSZWYgZ2V0RnVuY05hbWVXaXRob3V0UHJlZml4KFN0cmluZ1JlZiBQR09GdW5jTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVOYW1lID0gIjx1bmtub3duPiIpOworCisvLy8gR2l2ZW4gYSB2ZWN0b3Igb2Ygc3RyaW5ncyAoZnVuY3Rpb24gUEdPIG5hbWVzKSBcYyBOYW1lU3RycywgdGhlCisvLy8gbWV0aG9kIGdlbmVyYXRlcyBhIGNvbWJpbmVkIHN0cmluZyBcYyBSZXN1bHQgdGhhdGlzIHJlYWR5IHRvIGJlCisvLy8gc2VyaWFsaXplZC4gIFRoZSBcYyBSZXN1bHQgc3RyaW5nIGlzIGNvbXByaXNlZCBvZiB0aHJlZSBmaWVsZHM6CisvLy8gVGhlIGZpcnN0IGZpZWxkIGlzIHRoZSBsZWdudGggb2YgdGhlIHVuY29tcHJlc3NlZCBzdHJpbmdzLCBhbmQgdGhlCisvLy8gdGhlIHNlY29uZCBmaWVsZCBpcyB0aGUgbGVuZ3RoIG9mIHRoZSB6bGliLWNvbXByZXNzZWQgc3RyaW5nLgorLy8vIEJvdGggZmllbGRzIGFyZSBlbmNvZGVkIGluIFVMRUIxMjguICBJZiBcYyBkb0NvbXByZXNzIGlzIGZhbHNlLCB0aGUKKy8vLyAgdGhpcmQgZmllbGQgaXMgdGhlIHVuY29tcHJlc3NlZCBzdHJpbmdzOyBvdGhlcndpc2UgaXQgaXMgdGhlCisvLy8gY29tcHJlc3NlZCBzdHJpbmcuIFdoZW4gdGhlIHN0cmluZyBjb21wcmVzc2lvbiBpcyBvZmYsIHRoZQorLy8vIHNlY29uZCBmaWVsZCB3aWxsIGhhdmUgdmFsdWUgemVyby4KK0Vycm9yIGNvbGxlY3RQR09GdW5jTmFtZVN0cmluZ3MoQXJyYXlSZWY8c3RkOjpzdHJpbmc+IE5hbWVTdHJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvQ29tcHJlc3Npb24sIHN0ZDo6c3RyaW5nICZSZXN1bHQpOworCisvLy8gUHJvZHVjZSBcYyBSZXN1bHQgc3RyaW5nIHdpdGggdGhlIHNhbWUgZm9ybWF0IGRlc2NyaWJlZCBhYm92ZS4gVGhlIGlucHV0CisvLy8gaXMgdmVjdG9yIG9mIFBHTyBmdW5jdGlvbiBuYW1lIHZhcmlhYmxlcyB0aGF0IGFyZSByZWZlcmVuY2VkLgorRXJyb3IgY29sbGVjdFBHT0Z1bmNOYW1lU3RyaW5ncyhBcnJheVJlZjxHbG9iYWxWYXJpYWJsZSAqPiBOYW1lVmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJlJlc3VsdCwgYm9vbCBkb0NvbXByZXNzaW9uID0gdHJ1ZSk7CisKKy8vLyBcYyBOYW1lU3RyaW5ncyBpcyBhIHN0cmluZyBjb21wb3NlZCBvZiBvbmUgb2YgbW9yZSBzdWItc3RyaW5ncyBlbmNvZGVkIGluCisvLy8gdGhlIGZvcm1hdCBkZXNjcmliZWQgYWJvdmUuIFRoZSBzdWJzdHJpbmdzIGFyZSBzZXBhcmF0ZWQgYnkgMCBvciBtb3JlIHplcm8KKy8vLyBieXRlcy4gVGhpcyBtZXRob2QgZGVjb2RlcyB0aGUgc3RyaW5nIGFuZCBwb3B1bGF0ZXMgdGhlIFxjIFN5bXRhYi4KK0Vycm9yIHJlYWRQR09GdW5jTmFtZVN0cmluZ3MoU3RyaW5nUmVmIE5hbWVTdHJpbmdzLCBJbnN0clByb2ZTeW10YWIgJlN5bXRhYik7CisKKy8vLyBDaGVjayBpZiBJTlNUUl9QUk9GX1JBV19WRVJTSU9OX1ZBUiBpcyBkZWZpbmVkLiBUaGlzIGdsb2JhbCBpcyBvbmx5IGJlaW5nCisvLy8gc2V0IGluIElSIFBHTyBjb21waWxhdGlvbi4KK2Jvb2wgaXNJUlBHT0ZsYWdTZXQoY29uc3QgTW9kdWxlICpNKTsKKworLy8vIENoZWNrIGlmIHdlIGNhbiBzYWZlbHkgcmVuYW1lIHRoaXMgQ29tZGF0IGZ1bmN0aW9uLiBJbnN0YW5jZXMgb2YgdGhlIHNhbWUKKy8vLyBjb21kYXQgZnVuY3Rpb24gbWF5IGhhdmUgZGlmZmVyZW50IGNvbnRyb2wgZmxvd3MgdGh1cyBjYW4gbm90IHNoYXJlIHRoZQorLy8vIHNhbWUgY291bnRlciB2YXJpYWJsZS4KK2Jvb2wgY2FuUmVuYW1lQ29tZGF0RnVuYyhjb25zdCBGdW5jdGlvbiAmRiwgYm9vbCBDaGVja0FkZHJlc3NUYWtlbiA9IGZhbHNlKTsKKworZW51bSBJbnN0clByb2ZWYWx1ZUtpbmQgOiB1aW50MzJfdCB7CisjZGVmaW5lIFZBTFVFX1BST0ZfS0lORChFbnVtZXJhdG9yLCBWYWx1ZSkgRW51bWVyYXRvciA9IFZhbHVlLAorI2luY2x1ZGUgImxsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mRGF0YS5pbmMiCit9OworCisvLy8gR2V0IHRoZSB2YWx1ZSBwcm9maWxlIGRhdGEgZm9yIHZhbHVlIHNpdGUgXHAgU2l0ZUlkeCBmcm9tIFxwIEluc3RyUHJvZlIKKy8vLyBhbmQgYW5ub3RhdGUgdGhlIGluc3RydWN0aW9uIFxwIEluc3Qgd2l0aCB0aGUgdmFsdWUgcHJvZmlsZSBtZXRhIGRhdGEuCisvLy8gQW5ub3RhdGUgdXAgdG8gXHAgTWF4TURDb3VudCAoZGVmYXVsdCAzKSBudW1iZXIgb2YgcmVjb3JkcyBwZXIgdmFsdWUgc2l0ZS4KK3ZvaWQgYW5ub3RhdGVWYWx1ZVNpdGUoTW9kdWxlICZNLCBJbnN0cnVjdGlvbiAmSW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJQcm9mUmVjb3JkICZJbnN0clByb2ZSLAorICAgICAgICAgICAgICAgICAgICAgICBJbnN0clByb2ZWYWx1ZUtpbmQgVmFsdWVLaW5kLCB1aW50MzJfdCBTaXRlSW5keCwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTWF4TURDb3VudCA9IDMpOworCisvLy8gU2FtZSBhcyB0aGUgYWJvdmUgaW50ZXJmYWNlIGJ1dCB1c2luZyBhbiBBcnJheVJlZiwgYXMgd2VsbCBhcyBccCBTdW0uCit2b2lkIGFubm90YXRlVmFsdWVTaXRlKE1vZHVsZSAmTSwgSW5zdHJ1Y3Rpb24gJkluc3QsCisgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPEluc3RyUHJvZlZhbHVlRGF0YT4gVkRzLCB1aW50NjRfdCBTdW0sCisgICAgICAgICAgICAgICAgICAgICAgIEluc3RyUHJvZlZhbHVlS2luZCBWYWx1ZUtpbmQsIHVpbnQzMl90IE1heE1EQ291bnQpOworCisvLy8gRXh0cmFjdCB0aGUgdmFsdWUgcHJvZmlsZSBkYXRhIGZyb20gXHAgSW5zdCB3aGljaCBpcyBhbm5vdGF0ZWQgd2l0aAorLy8vIHZhbHVlIHByb2ZpbGUgbWV0YSBkYXRhLiBSZXR1cm4gZmFsc2UgaWYgdGhlcmUgaXMgbm8gdmFsdWUgZGF0YSBhbm5vdGF0ZWQsCisvLy8gb3RoZXJ3aXNlICByZXR1cm4gdHJ1ZS4KK2Jvb2wgZ2V0VmFsdWVQcm9mRGF0YUZyb21JbnN0KGNvbnN0IEluc3RydWN0aW9uICZJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJQcm9mVmFsdWVLaW5kIFZhbHVlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE1heE51bVZhbHVlRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyUHJvZlZhbHVlRGF0YSBWYWx1ZURhdGFbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZBY3R1YWxOdW1WYWx1ZURhdGEsIHVpbnQ2NF90ICZUb3RhbEMpOworCitpbmxpbmUgU3RyaW5nUmVmIGdldFBHT0Z1bmNOYW1lTWV0YWRhdGFOYW1lKCkgeyByZXR1cm4gIlBHT0Z1bmNOYW1lIjsgfQorCisvLy8gUmV0dXJuIHRoZSBQR09GdW5jTmFtZSBtZXRhIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGEgZnVuY3Rpb24uCitNRE5vZGUgKmdldFBHT0Z1bmNOYW1lTWV0YWRhdGEoY29uc3QgRnVuY3Rpb24gJkYpOworCisvLy8gQ3JlYXRlIHRoZSBQR09GdW5jTmFtZSBtZXRhIGRhdGEgaWYgUEdPRnVuY05hbWUgaXMgZGlmZmVyZW50IGZyb20KKy8vLyBmdW5jdGlvbidzIHJhdyBuYW1lLiBUaGlzIHNob3VsZCBvbmx5IGFwcGx5IHRvIGludGVybmFsIGxpbmthZ2UgZnVuY3Rpb25zCisvLy8gZGVjbGFyZWQgYnkgdXNlcnMgb25seS4KK3ZvaWQgY3JlYXRlUEdPRnVuY05hbWVNZXRhZGF0YShGdW5jdGlvbiAmRiwgU3RyaW5nUmVmIFBHT0Z1bmNOYW1lKTsKKworLy8vIENoZWNrIGlmIHdlIGNhbiB1c2UgQ29tZGF0IGZvciBwcm9maWxlIHZhcmlhYmxlcy4gVGhpcyB3aWxsIGVsaW1pbmF0ZQorLy8vIHRoZSBkdXBsaWNhdGVkIHByb2ZpbGUgdmFyaWFibGVzIGZvciBDb21kYXQgZnVuY3Rpb25zLgorYm9vbCBuZWVkc0NvbWRhdEZvckNvdW50ZXIoY29uc3QgRnVuY3Rpb24gJkYsIGNvbnN0IE1vZHVsZSAmTSk7CisKK2NvbnN0IHN0ZDo6ZXJyb3JfY2F0ZWdvcnkgJmluc3RycHJvZl9jYXRlZ29yeSgpOworCitlbnVtIGNsYXNzIGluc3RycHJvZl9lcnJvciB7CisgIHN1Y2Nlc3MgPSAwLAorICBlb2YsCisgIHVucmVjb2duaXplZF9mb3JtYXQsCisgIGJhZF9tYWdpYywKKyAgYmFkX2hlYWRlciwKKyAgdW5zdXBwb3J0ZWRfdmVyc2lvbiwKKyAgdW5zdXBwb3J0ZWRfaGFzaF90eXBlLAorICB0b29fbGFyZ2UsCisgIHRydW5jYXRlZCwKKyAgbWFsZm9ybWVkLAorICB1bmtub3duX2Z1bmN0aW9uLAorICBoYXNoX21pc21hdGNoLAorICBjb3VudF9taXNtYXRjaCwKKyAgY291bnRlcl9vdmVyZmxvdywKKyAgdmFsdWVfc2l0ZV9jb3VudF9taXNtYXRjaCwKKyAgY29tcHJlc3NfZmFpbGVkLAorICB1bmNvbXByZXNzX2ZhaWxlZCwKKyAgZW1wdHlfcmF3X3Byb2ZpbGUsCisgIHpsaWJfdW5hdmFpbGFibGUKK307CisKK2lubGluZSBzdGQ6OmVycm9yX2NvZGUgbWFrZV9lcnJvcl9jb2RlKGluc3RycHJvZl9lcnJvciBFKSB7CisgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoc3RhdGljX2Nhc3Q8aW50PihFKSwgaW5zdHJwcm9mX2NhdGVnb3J5KCkpOworfQorCitjbGFzcyBJbnN0clByb2ZFcnJvciA6IHB1YmxpYyBFcnJvckluZm88SW5zdHJQcm9mRXJyb3I+IHsKK3B1YmxpYzoKKyAgSW5zdHJQcm9mRXJyb3IoaW5zdHJwcm9mX2Vycm9yIEVycikgOiBFcnIoRXJyKSB7CisgICAgYXNzZXJ0KEVyciAhPSBpbnN0cnByb2ZfZXJyb3I6OnN1Y2Nlc3MgJiYgIk5vdCBhbiBlcnJvciIpOworICB9CisKKyAgc3RkOjpzdHJpbmcgbWVzc2FnZSgpIGNvbnN0IG92ZXJyaWRlOworCisgIHZvaWQgbG9nKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGUgeyBPUyA8PCBtZXNzYWdlKCk7IH0KKworICBzdGQ6OmVycm9yX2NvZGUgY29udmVydFRvRXJyb3JDb2RlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBtYWtlX2Vycm9yX2NvZGUoRXJyKTsKKyAgfQorCisgIGluc3RycHJvZl9lcnJvciBnZXQoKSBjb25zdCB7IHJldHVybiBFcnI7IH0KKworICAvLy8gQ29uc3VtZSBhbiBFcnJvciBhbmQgcmV0dXJuIHRoZSByYXcgZW51bSB2YWx1ZSBjb250YWluZWQgd2l0aGluIGl0LiBUaGUKKyAgLy8vIEVycm9yIG11c3QgZWl0aGVyIGJlIGEgc3VjY2VzcyB2YWx1ZSwgb3IgY29udGFpbiBhIHNpbmdsZSBJbnN0clByb2ZFcnJvci4KKyAgc3RhdGljIGluc3RycHJvZl9lcnJvciB0YWtlKEVycm9yIEUpIHsKKyAgICBhdXRvIEVyciA9IGluc3RycHJvZl9lcnJvcjo6c3VjY2VzczsKKyAgICBoYW5kbGVBbGxFcnJvcnMoc3RkOjptb3ZlKEUpLCBbJkVycl0oY29uc3QgSW5zdHJQcm9mRXJyb3IgJklQRSkgeworICAgICAgYXNzZXJ0KEVyciA9PSBpbnN0cnByb2ZfZXJyb3I6OnN1Y2Nlc3MgJiYgIk11bHRpcGxlIGVycm9ycyBlbmNvdW50ZXJlZCIpOworICAgICAgRXJyID0gSVBFLmdldCgpOworICAgIH0pOworICAgIHJldHVybiBFcnI7CisgIH0KKworICBzdGF0aWMgY2hhciBJRDsKKworcHJpdmF0ZToKKyAgaW5zdHJwcm9mX2Vycm9yIEVycjsKK307CisKK2NsYXNzIFNvZnRJbnN0clByb2ZFcnJvcnMgeworICAvLy8gQ291bnQgdGhlIG51bWJlciBvZiBzb2Z0IGluc3RycHJvZl9lcnJvcnMgZW5jb3VudGVyZWQgYW5kIGtlZXAgdHJhY2sgb2YKKyAgLy8vIHRoZSBmaXJzdCBzdWNoIGVycm9yIGZvciByZXBvcnRpbmcgcHVycG9zZXMuCisKKyAgLy8vIFRoZSBmaXJzdCBzb2Z0IGVycm9yIGVuY291bnRlcmVkLgorICBpbnN0cnByb2ZfZXJyb3IgRmlyc3RFcnJvciA9IGluc3RycHJvZl9lcnJvcjo6c3VjY2VzczsKKworICAvLy8gVGhlIG51bWJlciBvZiBoYXNoIG1pc21hdGNoZXMuCisgIHVuc2lnbmVkIE51bUhhc2hNaXNtYXRjaGVzID0gMDsKKworICAvLy8gVGhlIG51bWJlciBvZiBjb3VudCBtaXNtYXRjaGVzLgorICB1bnNpZ25lZCBOdW1Db3VudE1pc21hdGNoZXMgPSAwOworCisgIC8vLyBUaGUgbnVtYmVyIG9mIGNvdW50ZXIgb3ZlcmZsb3dzLgorICB1bnNpZ25lZCBOdW1Db3VudGVyT3ZlcmZsb3dzID0gMDsKKworICAvLy8gVGhlIG51bWJlciBvZiB2YWx1ZSBzaXRlIGNvdW50IG1pc21hdGNoZXMuCisgIHVuc2lnbmVkIE51bVZhbHVlU2l0ZUNvdW50TWlzbWF0Y2hlcyA9IDA7CisKK3B1YmxpYzoKKyAgU29mdEluc3RyUHJvZkVycm9ycygpID0gZGVmYXVsdDsKKworICB+U29mdEluc3RyUHJvZkVycm9ycygpIHsKKyAgICBhc3NlcnQoRmlyc3RFcnJvciA9PSBpbnN0cnByb2ZfZXJyb3I6OnN1Y2Nlc3MgJiYKKyAgICAgICAgICAgIlVuY2hlY2tlZCBzb2Z0IGVycm9yIGVuY291bnRlcmVkIik7CisgIH0KKworICAvLy8gVHJhY2sgYSBzb2Z0IGVycm9yIChccCBJRSkgYW5kIGluY3JlbWVudCBpdHMgYXNzb2NpYXRlZCBjb3VudGVyLgorICB2b2lkIGFkZEVycm9yKGluc3RycHJvZl9lcnJvciBJRSk7CisKKyAgLy8vIEdldCB0aGUgbnVtYmVyIG9mIGhhc2ggbWlzbWF0Y2hlcy4KKyAgdW5zaWduZWQgZ2V0TnVtSGFzaE1pc21hdGNoZXMoKSBjb25zdCB7IHJldHVybiBOdW1IYXNoTWlzbWF0Y2hlczsgfQorCisgIC8vLyBHZXQgdGhlIG51bWJlciBvZiBjb3VudCBtaXNtYXRjaGVzLgorICB1bnNpZ25lZCBnZXROdW1Db3VudE1pc21hdGNoZXMoKSBjb25zdCB7IHJldHVybiBOdW1Db3VudE1pc21hdGNoZXM7IH0KKworICAvLy8gR2V0IHRoZSBudW1iZXIgb2YgY291bnRlciBvdmVyZmxvd3MuCisgIHVuc2lnbmVkIGdldE51bUNvdW50ZXJPdmVyZmxvd3MoKSBjb25zdCB7IHJldHVybiBOdW1Db3VudGVyT3ZlcmZsb3dzOyB9CisKKyAgLy8vIEdldCB0aGUgbnVtYmVyIG9mIHZhbHVlIHNpdGUgY291bnQgbWlzbWF0Y2hlcy4KKyAgdW5zaWduZWQgZ2V0TnVtVmFsdWVTaXRlQ291bnRNaXNtYXRjaGVzKCkgY29uc3QgeworICAgIHJldHVybiBOdW1WYWx1ZVNpdGVDb3VudE1pc21hdGNoZXM7CisgIH0KKworICAvLy8gUmV0dXJuIHRoZSBmaXJzdCBlbmNvdW50ZXJlZCBlcnJvciBhbmQgcmVzZXQgRmlyc3RFcnJvciB0byBhIHN1Y2Nlc3MKKyAgLy8vIHZhbHVlLgorICBFcnJvciB0YWtlRXJyb3IoKSB7CisgICAgaWYgKEZpcnN0RXJyb3IgPT0gaW5zdHJwcm9mX2Vycm9yOjpzdWNjZXNzKQorICAgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgICAgYXV0byBFID0gbWFrZV9lcnJvcjxJbnN0clByb2ZFcnJvcj4oRmlyc3RFcnJvcik7CisgICAgRmlyc3RFcnJvciA9IGluc3RycHJvZl9lcnJvcjo6c3VjY2VzczsKKyAgICByZXR1cm4gRTsKKyAgfQorfTsKKworbmFtZXNwYWNlIG9iamVjdCB7CisKK2NsYXNzIFNlY3Rpb25SZWY7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBvYmplY3QKKworbmFtZXNwYWNlIEluZGV4ZWRJbnN0clByb2YgeworCit1aW50NjRfdCBDb21wdXRlSGFzaChTdHJpbmdSZWYgSyk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBJbmRleGVkSW5zdHJQcm9mCisKKy8vLyBBIHN5bWJvbCB0YWJsZSB1c2VkIGZvciBmdW5jdGlvbiBQR08gbmFtZSBsb29rLXVwIHdpdGgga2V5cworLy8vIChzdWNoIGFzIHBvaW50ZXJzLCBtZDVoYXNoIHZhbHVlcykgdG8gdGhlIGZ1bmN0aW9uLiBBIGZ1bmN0aW9uJ3MKKy8vLyBQR08gbmFtZSBvciBuYW1lJ3MgbWQ1aGFzaCBhcmUgdXNlZCBpbiByZXRyaWV2aW5nIHRoZSBwcm9maWxlCisvLy8gZGF0YSBvZiB0aGUgZnVuY3Rpb24uIFNlZSBcYyBnZXRQR09GdW5jTmFtZSgpIG1ldGhvZCBmb3IgZGV0YWlscworLy8vIG9uIGhvdyBQR08gbmFtZSBpcyBmb3JtZWQuCitjbGFzcyBJbnN0clByb2ZTeW10YWIgeworcHVibGljOgorICB1c2luZyBBZGRySGFzaE1hcCA9IHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1aW50NjRfdCwgdWludDY0X3Q+PjsKKworcHJpdmF0ZToKKyAgU3RyaW5nUmVmIERhdGE7CisgIHVpbnQ2NF90IEFkZHJlc3MgPSAwOworICAvLyBVbmlxdWUgbmFtZSBzdHJpbmdzLgorICBTdHJpbmdTZXQ8PiBOYW1lVGFiOworICAvLyBBIG1hcCBmcm9tIE1ENSBrZXlzIHRvIGZ1bmN0aW9uIG5hbWUgc3RyaW5ncy4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVpbnQ2NF90LCBTdHJpbmdSZWY+PiBNRDVOYW1lTWFwOworICAvLyBBIG1hcCBmcm9tIE1ENSBrZXlzIHRvIGZ1bmN0aW9uIGRlZmluZS4gV2Ugb25seSBwb3B1bGF0ZSB0aGlzIG1hcAorICAvLyB3aGVuIGJ1aWxkIHRoZSBTeW10YWIgZnJvbSBhIE1vZHVsZS4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPHVpbnQ2NF90LCBGdW5jdGlvbiAqPj4gTUQ1RnVuY01hcDsKKyAgLy8gQSBtYXAgZnJvbSBmdW5jdGlvbiBydW50aW1lIGFkZHJlc3MgdG8gZnVuY3Rpb24gbmFtZSBNRDUgaGFzaC4KKyAgLy8gVGhpcyBtYXAgaXMgb25seSBwb3B1bGF0ZWQgYW5kIHVzZWQgYnkgcmF3IGluc3RyIHByb2ZpbGUgcmVhZGVyLgorICBBZGRySGFzaE1hcCBBZGRyVG9NRDVNYXA7CisgIGJvb2wgU29ydGVkID0gZmFsc2U7CisKKyAgc3RhdGljIFN0cmluZ1JlZiBnZXRFeHRlcm5hbFN5bWJvbCgpIHsKKyAgICByZXR1cm4gIioqIEV4dGVybmFsIFN5bWJvbCAqKiI7CisgIH0KKworICAvLyBJZiB0aGUgc3ltdGFiIGlzIGNyZWF0ZWQgYnkgYSBzZXJpZXMgb2YgY2FsbHMgdG8gXGMgYWRkRnVuY05hbWUsIFxjCisgIC8vIGZpbmFsaXplU3ltdGFiIG5lZWRzIHRvIGJlIGNhbGxlZCBiZWZvcmUgbG9va2luZyB1cCBmdW5jdGlvbiBuYW1lcy4KKyAgLy8gVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZSB1bmRlcmx5aW5nIG1hcCBpcyBhIHZlY3RvciAoZm9yIHNwYWNlCisgIC8vIGVmZmljaWVuY3kpIHdoaWNoIG5lZWRzIHRvIGJlIHNvcnRlZC4KKyAgaW5saW5lIHZvaWQgZmluYWxpemVTeW10YWIoKTsKKworcHVibGljOgorICBJbnN0clByb2ZTeW10YWIoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIENyZWF0ZSBJbnN0clByb2ZTeW10YWIgZnJvbSBhbiBvYmplY3QgZmlsZSBzZWN0aW9uIHdoaWNoCisgIC8vLyBjb250YWlucyBmdW5jdGlvbiBQR08gbmFtZXMuIFdoZW4gc2VjdGlvbiBtYXkgY29udGFpbiByYXcKKyAgLy8vIHN0cmluZyBkYXRhIG9yIHN0cmluZyBkYXRhIGluIGNvbXByZXNzZWQgZm9ybS4gVGhpcyBtZXRob2QKKyAgLy8vIG9ubHkgaW5pdGlhbGl6ZSB0aGUgc3ltdGFiIHdpdGggcmVmZXJlbmNlIHRvIHRoZSBkYXRhIGFuZAorICAvLy8gdGhlIHNlY3Rpb24gYmFzZSBhZGRyZXNzLiBUaGUgZGVjb21wcmVzc2lvbiB3aWxsIGJlIGRlbGF5ZWQKKyAgLy8vIHVudGlsIGJlZm9yZSBpdCBpcyB1c2VkLiBTZWUgYWxzbyBcYyBjcmVhdGUoU3RyaW5nUmVmKSBtZXRob2QuCisgIEVycm9yIGNyZWF0ZShvYmplY3Q6OlNlY3Rpb25SZWYgJlNlY3Rpb24pOworCisgIC8vLyBUaGlzIGludGVyZmFjZSBpcyB1c2VkIGJ5IHJlYWRlciBvZiBDb3ZlcmFnZU1hcHBpbmcgdGVzdAorICAvLy8gZm9ybWF0LgorICBpbmxpbmUgRXJyb3IgY3JlYXRlKFN0cmluZ1JlZiBELCB1aW50NjRfdCBCYXNlQWRkcik7CisKKyAgLy8vIFxjIE5hbWVTdHJpbmdzIGlzIGEgc3RyaW5nIGNvbXBvc2VkIG9mIG9uZSBvZiBtb3JlIHN1Yi1zdHJpbmdzCisgIC8vLyAgZW5jb2RlZCBpbiB0aGUgZm9ybWF0IGRlc2NyaWJlZCBpbiBcYyBjb2xsZWN0UEdPRnVuY05hbWVTdHJpbmdzLgorICAvLy8gVGhpcyBtZXRob2QgaXMgYSB3cmFwcGVyIHRvIFxjIHJlYWRQR09GdW5jTmFtZVN0cmluZ3MgbWV0aG9kLgorICBpbmxpbmUgRXJyb3IgY3JlYXRlKFN0cmluZ1JlZiBOYW1lU3RyaW5ncyk7CisKKyAgLy8vIEEgd3JhcHBlciBpbnRlcmZhY2UgdG8gcG9wdWxhdGUgdGhlIFBHTyBzeW10YWIgd2l0aCBmdW5jdGlvbnMKKyAgLy8vIGRlY2xzIGZyb20gbW9kdWxlIFxjIE0uIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWQgYnkgdHJhbnNmb3JtYXRpb24KKyAgLy8vIHBhc3NlcyBzdWNoIGFzIGluZGlyZWN0IGZ1bmN0aW9uIGNhbGwgcHJvbW90aW9uLiBWYXJpYWJsZSBcYyBJbkxUTworICAvLy8gaW5kaWNhdGVzIGlmIHRoaXMgaXMgY2FsbGVkIGZyb20gTFRPIG9wdGltaXphdGlvbiBwYXNzZXMuCisgIEVycm9yIGNyZWF0ZShNb2R1bGUgJk0sIGJvb2wgSW5MVE8gPSBmYWxzZSk7CisKKyAgLy8vIENyZWF0ZSBJbnN0clByb2ZTeW10YWIgZnJvbSBhIHNldCBvZiBuYW1lcyBpdGVyYXRhYmxlIGZyb20KKyAgLy8vIFxwIEl0ZXJSYW5nZS4gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCBieSBJbmRleGVkUHJvZlJlYWRlci4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIE5hbWVJdGVyUmFuZ2U+IEVycm9yIGNyZWF0ZShjb25zdCBOYW1lSXRlclJhbmdlICZJdGVyUmFuZ2UpOworCisgIC8vLyBVcGRhdGUgdGhlIHN5bXRhYiBieSBhZGRpbmcgXHAgRnVuY05hbWUgdG8gdGhlIHRhYmxlLiBUaGlzIGludGVyZmFjZQorICAvLy8gaXMgdXNlZCBieSB0aGUgcmF3IGFuZCB0ZXh0IHByb2ZpbGUgcmVhZGVycy4KKyAgRXJyb3IgYWRkRnVuY05hbWUoU3RyaW5nUmVmIEZ1bmNOYW1lKSB7CisgICAgaWYgKEZ1bmNOYW1lLmVtcHR5KCkpCisgICAgICByZXR1cm4gbWFrZV9lcnJvcjxJbnN0clByb2ZFcnJvcj4oaW5zdHJwcm9mX2Vycm9yOjptYWxmb3JtZWQpOworICAgIGF1dG8gSW5zID0gTmFtZVRhYi5pbnNlcnQoRnVuY05hbWUpOworICAgIGlmIChJbnMuc2Vjb25kKSB7CisgICAgICBNRDVOYW1lTWFwLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcigKKyAgICAgICAgICBJbmRleGVkSW5zdHJQcm9mOjpDb21wdXRlSGFzaChGdW5jTmFtZSksIElucy5maXJzdC0+Z2V0S2V5KCkpKTsKKyAgICAgIFNvcnRlZCA9IGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIC8vLyBNYXAgYSBmdW5jdGlvbiBhZGRyZXNzIHRvIGl0cyBuYW1lJ3MgTUQ1IGhhc2guIFRoaXMgaW50ZXJmYWNlCisgIC8vLyBpcyBvbmx5IHVzZWQgYnkgdGhlIHJhdyBwcm9maWxlciByZWFkZXIuCisgIHZvaWQgbWFwQWRkcmVzcyh1aW50NjRfdCBBZGRyLCB1aW50NjRfdCBNRDVWYWwpIHsKKyAgICBBZGRyVG9NRDVNYXAucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKEFkZHIsIE1ENVZhbCkpOworICB9CisKKyAgLy8vIFJldHVybiBhIGZ1bmN0aW9uJ3MgaGFzaCwgb3IgMCwgaWYgdGhlIGZ1bmN0aW9uIGlzbid0IGluIHRoaXMgU3ltVGFiLgorICB1aW50NjRfdCBnZXRGdW5jdGlvbkhhc2hGcm9tQWRkcmVzcyh1aW50NjRfdCBBZGRyZXNzKTsKKworICAvLy8gUmV0dXJuIGZ1bmN0aW9uJ3MgUEdPIG5hbWUgZnJvbSB0aGUgZnVuY3Rpb24gbmFtZSdzIHN5bWJvbAorICAvLy8gYWRkcmVzcyBpbiB0aGUgb2JqZWN0IGZpbGUuIElmIGFuIGVycm9yIG9jY3VycywgcmV0dXJuCisgIC8vLyBhbiBlbXB0eSBzdHJpbmcuCisgIFN0cmluZ1JlZiBnZXRGdW5jTmFtZSh1aW50NjRfdCBGdW5jTmFtZUFkZHJlc3MsIHNpemVfdCBOYW1lU2l6ZSk7CisKKyAgLy8vIFJldHVybiBmdW5jdGlvbidzIFBHTyBuYW1lIGZyb20gdGhlIG5hbWUncyBtZDUgaGFzaCB2YWx1ZS4KKyAgLy8vIElmIG5vdCBmb3VuZCwgcmV0dXJuIGFuIGVtcHR5IHN0cmluZy4KKyAgaW5saW5lIFN0cmluZ1JlZiBnZXRGdW5jTmFtZSh1aW50NjRfdCBGdW5jTUQ1SGFzaCk7CisKKyAgLy8vIEp1c3QgbGlrZSBnZXRGdW5jTmFtZSwgZXhjZXB0IHRoYXQgaXQgd2lsbCByZXR1cm4gYSBub24tZW1wdHkgU3RyaW5nUmVmCisgIC8vLyBpZiB0aGUgZnVuY3Rpb24gaXMgZXh0ZXJuYWwgdG8gdGhpcyBzeW1ib2wgdGFibGUuIEFsbCBzdWNoIGNhc2VzCisgIC8vLyB3aWxsIGJlIHJlcHJlc2VudGVkIHVzaW5nIHRoZSBzYW1lIFN0cmluZ1JlZiB2YWx1ZS4KKyAgaW5saW5lIFN0cmluZ1JlZiBnZXRGdW5jTmFtZU9yRXh0ZXJuYWxTeW1ib2wodWludDY0X3QgRnVuY01ENUhhc2gpOworCisgIC8vLyBUcnVlIGlmIFN5bWJvbCBpcyB0aGUgdmFsdWUgdXNlZCB0byByZXByZXNlbnQgZXh0ZXJuYWwgc3ltYm9scy4KKyAgc3RhdGljIGJvb2wgaXNFeHRlcm5hbFN5bWJvbChjb25zdCBTdHJpbmdSZWYgJlN5bWJvbCkgeworICAgIHJldHVybiBTeW1ib2wgPT0gSW5zdHJQcm9mU3ltdGFiOjpnZXRFeHRlcm5hbFN5bWJvbCgpOworICB9CisKKyAgLy8vIFJldHVybiBmdW5jdGlvbiBmcm9tIHRoZSBuYW1lJ3MgbWQ1IGhhc2guIFJldHVybiBudWxscHRyIGlmIG5vdCBmb3VuZC4KKyAgaW5saW5lIEZ1bmN0aW9uICpnZXRGdW5jdGlvbih1aW50NjRfdCBGdW5jTUQ1SGFzaCk7CisKKyAgLy8vIFJldHVybiB0aGUgZnVuY3Rpb24ncyBvcmlnaW5hbCBhc3NlbWJseSBuYW1lIGJ5IHN0cmlwcGluZyBvZmYKKyAgLy8vIHRoZSBwcmVmaXggYXR0YWNoZWQgKHRvIHN5bWJvbHMgd2l0aCBwcml2aWF0ZSBsaW5rYWdlKS4gRm9yCisgIC8vLyBnbG9iYWwgZnVuY3Rpb25zLCBpdCByZXR1cm5zIHRoZSBzYW1lIHN0cmluZyBhcyBnZXRGdW5jTmFtZS4KKyAgaW5saW5lIFN0cmluZ1JlZiBnZXRPcmlnRnVuY05hbWUodWludDY0X3QgRnVuY01ENUhhc2gpOworCisgIC8vLyBSZXR1cm4gdGhlIG5hbWUgc2VjdGlvbiBkYXRhLgorICBpbmxpbmUgU3RyaW5nUmVmIGdldE5hbWVEYXRhKCkgY29uc3QgeyByZXR1cm4gRGF0YTsgfQorfTsKKworRXJyb3IgSW5zdHJQcm9mU3ltdGFiOjpjcmVhdGUoU3RyaW5nUmVmIEQsIHVpbnQ2NF90IEJhc2VBZGRyKSB7CisgIERhdGEgPSBEOworICBBZGRyZXNzID0gQmFzZUFkZHI7CisgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworfQorCitFcnJvciBJbnN0clByb2ZTeW10YWI6OmNyZWF0ZShTdHJpbmdSZWYgTmFtZVN0cmluZ3MpIHsKKyAgcmV0dXJuIHJlYWRQR09GdW5jTmFtZVN0cmluZ3MoTmFtZVN0cmluZ3MsICp0aGlzKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIE5hbWVJdGVyUmFuZ2U+CitFcnJvciBJbnN0clByb2ZTeW10YWI6OmNyZWF0ZShjb25zdCBOYW1lSXRlclJhbmdlICZJdGVyUmFuZ2UpIHsKKyAgZm9yIChhdXRvIE5hbWUgOiBJdGVyUmFuZ2UpCisgICAgaWYgKEVycm9yIEUgPSBhZGRGdW5jTmFtZShOYW1lKSkKKyAgICAgIHJldHVybiBFOworCisgIGZpbmFsaXplU3ltdGFiKCk7CisgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworfQorCit2b2lkIEluc3RyUHJvZlN5bXRhYjo6ZmluYWxpemVTeW10YWIoKSB7CisgIGlmIChTb3J0ZWQpCisgICAgcmV0dXJuOworICBzdGQ6OnNvcnQoTUQ1TmFtZU1hcC5iZWdpbigpLCBNRDVOYW1lTWFwLmVuZCgpLCBsZXNzX2ZpcnN0KCkpOworICBzdGQ6OnNvcnQoTUQ1RnVuY01hcC5iZWdpbigpLCBNRDVGdW5jTWFwLmVuZCgpLCBsZXNzX2ZpcnN0KCkpOworICBzdGQ6OnNvcnQoQWRkclRvTUQ1TWFwLmJlZ2luKCksIEFkZHJUb01ENU1hcC5lbmQoKSwgbGVzc19maXJzdCgpKTsKKyAgQWRkclRvTUQ1TWFwLmVyYXNlKHN0ZDo6dW5pcXVlKEFkZHJUb01ENU1hcC5iZWdpbigpLCBBZGRyVG9NRDVNYXAuZW5kKCkpLAorICAgICAgICAgICAgICAgICAgICAgQWRkclRvTUQ1TWFwLmVuZCgpKTsKKyAgU29ydGVkID0gdHJ1ZTsKK30KKworU3RyaW5nUmVmIEluc3RyUHJvZlN5bXRhYjo6Z2V0RnVuY05hbWVPckV4dGVybmFsU3ltYm9sKHVpbnQ2NF90IEZ1bmNNRDVIYXNoKSB7CisgIFN0cmluZ1JlZiByZXQgPSBnZXRGdW5jTmFtZShGdW5jTUQ1SGFzaCk7CisgIGlmIChyZXQuZW1wdHkoKSkKKyAgICByZXR1cm4gSW5zdHJQcm9mU3ltdGFiOjpnZXRFeHRlcm5hbFN5bWJvbCgpOworICByZXR1cm4gcmV0OworfQorCitTdHJpbmdSZWYgSW5zdHJQcm9mU3ltdGFiOjpnZXRGdW5jTmFtZSh1aW50NjRfdCBGdW5jTUQ1SGFzaCkgeworICBmaW5hbGl6ZVN5bXRhYigpOworICBhdXRvIFJlc3VsdCA9CisgICAgICBzdGQ6Omxvd2VyX2JvdW5kKE1ENU5hbWVNYXAuYmVnaW4oKSwgTUQ1TmFtZU1hcC5lbmQoKSwgRnVuY01ENUhhc2gsCisgICAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IHN0ZDo6cGFpcjx1aW50NjRfdCwgc3RkOjpzdHJpbmc+ICZMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFJIUykgeyByZXR1cm4gTEhTLmZpcnN0IDwgUkhTOyB9KTsKKyAgaWYgKFJlc3VsdCAhPSBNRDVOYW1lTWFwLmVuZCgpICYmIFJlc3VsdC0+Zmlyc3QgPT0gRnVuY01ENUhhc2gpCisgICAgcmV0dXJuIFJlc3VsdC0+c2Vjb25kOworICByZXR1cm4gU3RyaW5nUmVmKCk7Cit9CisKK0Z1bmN0aW9uKiBJbnN0clByb2ZTeW10YWI6OmdldEZ1bmN0aW9uKHVpbnQ2NF90IEZ1bmNNRDVIYXNoKSB7CisgIGZpbmFsaXplU3ltdGFiKCk7CisgIGF1dG8gUmVzdWx0ID0KKyAgICAgIHN0ZDo6bG93ZXJfYm91bmQoTUQ1RnVuY01hcC5iZWdpbigpLCBNRDVGdW5jTWFwLmVuZCgpLCBGdW5jTUQ1SGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgW10oY29uc3Qgc3RkOjpwYWlyPHVpbnQ2NF90LCBGdW5jdGlvbio+ICZMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFJIUykgeyByZXR1cm4gTEhTLmZpcnN0IDwgUkhTOyB9KTsKKyAgaWYgKFJlc3VsdCAhPSBNRDVGdW5jTWFwLmVuZCgpICYmIFJlc3VsdC0+Zmlyc3QgPT0gRnVuY01ENUhhc2gpCisgICAgcmV0dXJuIFJlc3VsdC0+c2Vjb25kOworICByZXR1cm4gbnVsbHB0cjsKK30KKworLy8gU2VlIGFsc28gZ2V0UEdPRnVuY05hbWUgaW1wbGVtZW50YXRpb24uIFRoZXNlIHR3byBuZWVkIHRvIGJlCisvLyBtYXRjaGVkLgorU3RyaW5nUmVmIEluc3RyUHJvZlN5bXRhYjo6Z2V0T3JpZ0Z1bmNOYW1lKHVpbnQ2NF90IEZ1bmNNRDVIYXNoKSB7CisgIFN0cmluZ1JlZiBQR09OYW1lID0gZ2V0RnVuY05hbWUoRnVuY01ENUhhc2gpOworICBzaXplX3QgUyA9IFBHT05hbWUuZmluZF9maXJzdF9vZignOicpOworICBpZiAoUyA9PSBTdHJpbmdSZWY6Om5wb3MpCisgICAgcmV0dXJuIFBHT05hbWU7CisgIHJldHVybiBQR09OYW1lLmRyb3BfZnJvbnQoUyArIDEpOworfQorCitzdHJ1Y3QgSW5zdHJQcm9mVmFsdWVTaXRlUmVjb3JkIHsKKyAgLy8vIFZhbHVlIHByb2ZpbGluZyBkYXRhIHBhaXJzIGF0IGEgZ2l2ZW4gdmFsdWUgc2l0ZS4KKyAgc3RkOjpsaXN0PEluc3RyUHJvZlZhbHVlRGF0YT4gVmFsdWVEYXRhOworCisgIEluc3RyUHJvZlZhbHVlU2l0ZVJlY29yZCgpIHsgVmFsdWVEYXRhLmNsZWFyKCk7IH0KKyAgdGVtcGxhdGUgPGNsYXNzIElucHV0SXRlcmF0b3I+CisgIEluc3RyUHJvZlZhbHVlU2l0ZVJlY29yZChJbnB1dEl0ZXJhdG9yIEYsIElucHV0SXRlcmF0b3IgTCkKKyAgICAgIDogVmFsdWVEYXRhKEYsIEwpIHt9CisKKyAgLy8vIFNvcnQgVmFsdWVEYXRhIGFzY2VuZGluZyBieSBWYWx1ZQorICB2b2lkIHNvcnRCeVRhcmdldFZhbHVlcygpIHsKKyAgICBWYWx1ZURhdGEuc29ydCgKKyAgICAgICAgW10oY29uc3QgSW5zdHJQcm9mVmFsdWVEYXRhICZsZWZ0LCBjb25zdCBJbnN0clByb2ZWYWx1ZURhdGEgJnJpZ2h0KSB7CisgICAgICAgICAgcmV0dXJuIGxlZnQuVmFsdWUgPCByaWdodC5WYWx1ZTsKKyAgICAgICAgfSk7CisgIH0KKyAgLy8vIFNvcnQgVmFsdWVEYXRhIERlc2NlbmRpbmcgYnkgQ291bnQKKyAgaW5saW5lIHZvaWQgc29ydEJ5Q291bnQoKTsKKworICAvLy8gTWVyZ2UgZGF0YSBmcm9tIGFub3RoZXIgSW5zdHJQcm9mVmFsdWVTaXRlUmVjb3JkCisgIC8vLyBPcHRpb25hbGx5IHNjYWxlIG1lcmdlZCBjb3VudHMgYnkgXHAgV2VpZ2h0LgorICB2b2lkIG1lcmdlKEluc3RyUHJvZlZhbHVlU2l0ZVJlY29yZCAmSW5wdXQsIHVpbnQ2NF90IFdlaWdodCwKKyAgICAgICAgICAgICBmdW5jdGlvbl9yZWY8dm9pZChpbnN0cnByb2ZfZXJyb3IpPiBXYXJuKTsKKyAgLy8vIFNjYWxlIHVwIHZhbHVlIHByb2ZpbGUgZGF0YSBjb3VudHMuCisgIHZvaWQgc2NhbGUodWludDY0X3QgV2VpZ2h0LCBmdW5jdGlvbl9yZWY8dm9pZChpbnN0cnByb2ZfZXJyb3IpPiBXYXJuKTsKK307CisKKy8vLyBQcm9maWxpbmcgaW5mb3JtYXRpb24gZm9yIGEgc2luZ2xlIGZ1bmN0aW9uLgorc3RydWN0IEluc3RyUHJvZlJlY29yZCB7CisgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBDb3VudHM7CisKKyAgSW5zdHJQcm9mUmVjb3JkKCkgPSBkZWZhdWx0OworICBJbnN0clByb2ZSZWNvcmQoc3RkOjp2ZWN0b3I8dWludDY0X3Q+IENvdW50cykgOiBDb3VudHMoc3RkOjptb3ZlKENvdW50cykpIHt9CisgIEluc3RyUHJvZlJlY29yZChJbnN0clByb2ZSZWNvcmQgJiYpID0gZGVmYXVsdDsKKyAgSW5zdHJQcm9mUmVjb3JkKGNvbnN0IEluc3RyUHJvZlJlY29yZCAmUkhTKQorICAgICAgOiBDb3VudHMoUkhTLkNvdW50cyksCisgICAgICAgIFZhbHVlRGF0YShSSFMuVmFsdWVEYXRhCisgICAgICAgICAgICAgICAgICAgICAgPyBsbHZtOjptYWtlX3VuaXF1ZTxWYWx1ZVByb2ZEYXRhPigqUkhTLlZhbHVlRGF0YSkKKyAgICAgICAgICAgICAgICAgICAgICA6IG51bGxwdHIpIHt9CisgIEluc3RyUHJvZlJlY29yZCAmb3BlcmF0b3I9KEluc3RyUHJvZlJlY29yZCAmJikgPSBkZWZhdWx0OworICBJbnN0clByb2ZSZWNvcmQgJm9wZXJhdG9yPShjb25zdCBJbnN0clByb2ZSZWNvcmQgJlJIUykgeworICAgIENvdW50cyA9IFJIUy5Db3VudHM7CisgICAgaWYgKCFSSFMuVmFsdWVEYXRhKSB7CisgICAgICBWYWx1ZURhdGEgPSBudWxscHRyOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBpZiAoIVZhbHVlRGF0YSkKKyAgICAgIFZhbHVlRGF0YSA9IGxsdm06Om1ha2VfdW5pcXVlPFZhbHVlUHJvZkRhdGE+KCpSSFMuVmFsdWVEYXRhKTsKKyAgICBlbHNlCisgICAgICAqVmFsdWVEYXRhID0gKlJIUy5WYWx1ZURhdGE7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHZhbHVlIHByb2ZpbGUga2luZHMgd2l0aCBub24temVybyBudW1iZXIKKyAgLy8vIG9mIHByb2ZpbGUgc2l0ZXMuCisgIGlubGluZSB1aW50MzJfdCBnZXROdW1WYWx1ZUtpbmRzKCkgY29uc3Q7CisgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBpbnN0cnVtZW50ZWQgc2l0ZXMgZm9yIFZhbHVlS2luZC4KKyAgaW5saW5lIHVpbnQzMl90IGdldE51bVZhbHVlU2l0ZXModWludDMyX3QgVmFsdWVLaW5kKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSB0b3RhbCBudW1iZXIgb2YgVmFsdWVEYXRhIGZvciBWYWx1ZUtpbmQuCisgIGlubGluZSB1aW50MzJfdCBnZXROdW1WYWx1ZURhdGEodWludDMyX3QgVmFsdWVLaW5kKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgdmFsdWUgZGF0YSBjb2xsZWN0ZWQgZm9yIFZhbHVlS2luZCBhdCBwcm9maWxpbmcKKyAgLy8vIHNpdGU6IFNpdGUuCisgIGlubGluZSB1aW50MzJfdCBnZXROdW1WYWx1ZURhdGFGb3JTaXRlKHVpbnQzMl90IFZhbHVlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2l0ZSkgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0aGUgYXJyYXkgb2YgcHJvZmlsZWQgdmFsdWVzIGF0IFxwIFNpdGUuIElmIFxwIFRvdGFsQworICAvLy8gaXMgbm90IG51bGwsIHRoZSB0b3RhbCBjb3VudCBvZiBhbGwgdGFyZ2V0IHZhbHVlcyBhdCB0aGlzIHNpdGUKKyAgLy8vIHdpbGwgYmUgc3RvcmVkIGluIFxjICpUb3RhbEMuCisgIGlubGluZSBzdGQ6OnVuaXF1ZV9wdHI8SW5zdHJQcm9mVmFsdWVEYXRhW10+CisgIGdldFZhbHVlRm9yU2l0ZSh1aW50MzJfdCBWYWx1ZUtpbmQsIHVpbnQzMl90IFNpdGUsCisgICAgICAgICAgICAgICAgICB1aW50NjRfdCAqVG90YWxDID0gbnVsbHB0cikgY29uc3Q7CisKKyAgLy8vIEdldCB0aGUgdGFyZ2V0IHZhbHVlL2NvdW50cyBvZiBraW5kIFxwIFZhbHVlS2luZCBjb2xsZWN0ZWQgYXQgc2l0ZQorICAvLy8gXHAgU2l0ZSBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbiBhcnJheSBccCBEZXN0LiBSZXR1cm4gdGhlIHRvdGFsCisgIC8vLyBjb3VudHMgb2YgYWxsIHRhcmdldCB2YWx1ZXMgYXQgdGhpcyBzaXRlLgorICBpbmxpbmUgdWludDY0X3QgZ2V0VmFsdWVGb3JTaXRlKEluc3RyUHJvZlZhbHVlRGF0YSBEZXN0W10sIHVpbnQzMl90IFZhbHVlS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBTaXRlKSBjb25zdDsKKworICAvLy8gUmVzZXJ2ZSBzcGFjZSBmb3IgTnVtVmFsdWVTaXRlcyBzaXRlcy4KKyAgaW5saW5lIHZvaWQgcmVzZXJ2ZVNpdGVzKHVpbnQzMl90IFZhbHVlS2luZCwgdWludDMyX3QgTnVtVmFsdWVTaXRlcyk7CisKKyAgLy8vIEFkZCBWYWx1ZURhdGEgZm9yIFZhbHVlS2luZCBhdCB2YWx1ZSBTaXRlLgorICB2b2lkIGFkZFZhbHVlRGF0YSh1aW50MzJfdCBWYWx1ZUtpbmQsIHVpbnQzMl90IFNpdGUsCisgICAgICAgICAgICAgICAgICAgIEluc3RyUHJvZlZhbHVlRGF0YSAqVkRhdGEsIHVpbnQzMl90IE4sCisgICAgICAgICAgICAgICAgICAgIEluc3RyUHJvZlN5bXRhYiAqU3ltVGFiKTsKKworICAvLy8gTWVyZ2UgdGhlIGNvdW50cyBpbiBccCBPdGhlciBpbnRvIHRoaXMgb25lLgorICAvLy8gT3B0aW9uYWxseSBzY2FsZSBtZXJnZWQgY291bnRzIGJ5IFxwIFdlaWdodC4KKyAgdm9pZCBtZXJnZShJbnN0clByb2ZSZWNvcmQgJk90aGVyLCB1aW50NjRfdCBXZWlnaHQsCisgICAgICAgICAgICAgZnVuY3Rpb25fcmVmPHZvaWQoaW5zdHJwcm9mX2Vycm9yKT4gV2Fybik7CisKKyAgLy8vIFNjYWxlIHVwIHByb2ZpbGUgY291bnRzIChpbmNsdWRpbmcgdmFsdWUgcHJvZmlsZSBkYXRhKSBieQorICAvLy8gXHAgV2VpZ2h0LgorICB2b2lkIHNjYWxlKHVpbnQ2NF90IFdlaWdodCwgZnVuY3Rpb25fcmVmPHZvaWQoaW5zdHJwcm9mX2Vycm9yKT4gV2Fybik7CisKKyAgLy8vIFNvcnQgdmFsdWUgcHJvZmlsZSBkYXRhIChwZXIgc2l0ZSkgYnkgY291bnQuCisgIHZvaWQgc29ydFZhbHVlRGF0YSgpIHsKKyAgICBmb3IgKHVpbnQzMl90IEtpbmQgPSBJUFZLX0ZpcnN0OyBLaW5kIDw9IElQVktfTGFzdDsgKytLaW5kKQorICAgICAgZm9yIChhdXRvICZTUiA6IGdldFZhbHVlU2l0ZXNGb3JLaW5kKEtpbmQpKQorICAgICAgICBTUi5zb3J0QnlDb3VudCgpOworICB9CisKKyAgLy8vIENsZWFyIHZhbHVlIGRhdGEgZW50cmllcyBhbmQgZWRnZSBjb3VudGVycy4KKyAgdm9pZCBDbGVhcigpIHsKKyAgICBDb3VudHMuY2xlYXIoKTsKKyAgICBjbGVhclZhbHVlRGF0YSgpOworICB9CisKKyAgLy8vIENsZWFyIHZhbHVlIGRhdGEgZW50cmllcworICB2b2lkIGNsZWFyVmFsdWVEYXRhKCkgeyBWYWx1ZURhdGEgPSBudWxscHRyOyB9CisKK3ByaXZhdGU6CisgIHN0cnVjdCBWYWx1ZVByb2ZEYXRhIHsKKyAgICBzdGQ6OnZlY3RvcjxJbnN0clByb2ZWYWx1ZVNpdGVSZWNvcmQ+IEluZGlyZWN0Q2FsbFNpdGVzOworICAgIHN0ZDo6dmVjdG9yPEluc3RyUHJvZlZhbHVlU2l0ZVJlY29yZD4gTWVtT1BTaXplczsKKyAgfTsKKyAgc3RkOjp1bmlxdWVfcHRyPFZhbHVlUHJvZkRhdGE+IFZhbHVlRGF0YTsKKworICBNdXRhYmxlQXJyYXlSZWY8SW5zdHJQcm9mVmFsdWVTaXRlUmVjb3JkPgorICBnZXRWYWx1ZVNpdGVzRm9yS2luZCh1aW50MzJfdCBWYWx1ZUtpbmQpIHsKKyAgICAvLyBDYXN0IHRvIC9hZGQvIGNvbnN0IChzaG91bGQgYmUgYW4gaW1wbGljaXRfY2FzdCwgaWRlYWxseSwgaWYgdGhhdCdzIGV2ZXIKKyAgICAvLyBpbXBsZW1lbnRlZCBpbiBMTFZNKSB0byBjYWxsIHRoZSBjb25zdCBvdmVybG9hZCBvZiB0aGlzIGZ1bmN0aW9uLCB0aGVuCisgICAgLy8gY2FzdCBhd2F5IHRoZSBjb25zdG5lc3MgZnJvbSB0aGUgcmVzdWx0LgorICAgIGF1dG8gQVIgPSBjb25zdF9jYXN0PGNvbnN0IEluc3RyUHJvZlJlY29yZCAqPih0aGlzKS0+Z2V0VmFsdWVTaXRlc0ZvcktpbmQoCisgICAgICAgIFZhbHVlS2luZCk7CisgICAgcmV0dXJuIG1ha2VNdXRhYmxlQXJyYXlSZWYoCisgICAgICAgIGNvbnN0X2Nhc3Q8SW5zdHJQcm9mVmFsdWVTaXRlUmVjb3JkICo+KEFSLmRhdGEoKSksIEFSLnNpemUoKSk7CisgIH0KKyAgQXJyYXlSZWY8SW5zdHJQcm9mVmFsdWVTaXRlUmVjb3JkPgorICBnZXRWYWx1ZVNpdGVzRm9yS2luZCh1aW50MzJfdCBWYWx1ZUtpbmQpIGNvbnN0IHsKKyAgICBpZiAoIVZhbHVlRGF0YSkKKyAgICAgIHJldHVybiBOb25lOworICAgIHN3aXRjaCAoVmFsdWVLaW5kKSB7CisgICAgY2FzZSBJUFZLX0luZGlyZWN0Q2FsbFRhcmdldDoKKyAgICAgIHJldHVybiBWYWx1ZURhdGEtPkluZGlyZWN0Q2FsbFNpdGVzOworICAgIGNhc2UgSVBWS19NZW1PUFNpemU6CisgICAgICByZXR1cm4gVmFsdWVEYXRhLT5NZW1PUFNpemVzOworICAgIGRlZmF1bHQ6CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHZhbHVlIGtpbmQhIik7CisgICAgfQorICB9CisKKyAgc3RkOjp2ZWN0b3I8SW5zdHJQcm9mVmFsdWVTaXRlUmVjb3JkPiAmCisgIGdldE9yQ3JlYXRlVmFsdWVTaXRlc0ZvcktpbmQodWludDMyX3QgVmFsdWVLaW5kKSB7CisgICAgaWYgKCFWYWx1ZURhdGEpCisgICAgICBWYWx1ZURhdGEgPSBsbHZtOjptYWtlX3VuaXF1ZTxWYWx1ZVByb2ZEYXRhPigpOworICAgIHN3aXRjaCAoVmFsdWVLaW5kKSB7CisgICAgY2FzZSBJUFZLX0luZGlyZWN0Q2FsbFRhcmdldDoKKyAgICAgIHJldHVybiBWYWx1ZURhdGEtPkluZGlyZWN0Q2FsbFNpdGVzOworICAgIGNhc2UgSVBWS19NZW1PUFNpemU6CisgICAgICByZXR1cm4gVmFsdWVEYXRhLT5NZW1PUFNpemVzOworICAgIGRlZmF1bHQ6CisgICAgICBsbHZtX3VucmVhY2hhYmxlKCJVbmtub3duIHZhbHVlIGtpbmQhIik7CisgICAgfQorICB9CisKKyAgLy8gTWFwIGluZGlyZWN0IGNhbGwgdGFyZ2V0IG5hbWUgaGFzaCB0byBuYW1lIHN0cmluZy4KKyAgdWludDY0X3QgcmVtYXBWYWx1ZSh1aW50NjRfdCBWYWx1ZSwgdWludDMyX3QgVmFsdWVLaW5kLAorICAgICAgICAgICAgICAgICAgICAgIEluc3RyUHJvZlN5bXRhYiAqU3ltVGFiKTsKKworICAvLyBNZXJnZSBWYWx1ZSBQcm9maWxlIGRhdGEgZnJvbSBTcmMgcmVjb3JkIHRvIHRoaXMgcmVjb3JkIGZvciBWYWx1ZUtpbmQuCisgIC8vIFNjYWxlIG1lcmdlZCB2YWx1ZSBjb3VudHMgYnkgXHAgV2VpZ2h0LgorICB2b2lkIG1lcmdlVmFsdWVQcm9mRGF0YSh1aW50MzJfdCBWYWxrZUtpbmQsIEluc3RyUHJvZlJlY29yZCAmU3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBXZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX3JlZjx2b2lkKGluc3RycHJvZl9lcnJvcik+IFdhcm4pOworCisgIC8vIFNjYWxlIHVwIHZhbHVlIHByb2ZpbGUgZGF0YSBjb3VudC4KKyAgdm9pZCBzY2FsZVZhbHVlUHJvZkRhdGEodWludDMyX3QgVmFsdWVLaW5kLCB1aW50NjRfdCBXZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX3JlZjx2b2lkKGluc3RycHJvZl9lcnJvcik+IFdhcm4pOworfTsKKworc3RydWN0IE5hbWVkSW5zdHJQcm9mUmVjb3JkIDogSW5zdHJQcm9mUmVjb3JkIHsKKyAgU3RyaW5nUmVmIE5hbWU7CisgIHVpbnQ2NF90IEhhc2g7CisKKyAgTmFtZWRJbnN0clByb2ZSZWNvcmQoKSA9IGRlZmF1bHQ7CisgIE5hbWVkSW5zdHJQcm9mUmVjb3JkKFN0cmluZ1JlZiBOYW1lLCB1aW50NjRfdCBIYXNoLAorICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50NjRfdD4gQ291bnRzKQorICAgICAgOiBJbnN0clByb2ZSZWNvcmQoc3RkOjptb3ZlKENvdW50cykpLCBOYW1lKE5hbWUpLCBIYXNoKEhhc2gpIHt9Cit9OworCit1aW50MzJfdCBJbnN0clByb2ZSZWNvcmQ6OmdldE51bVZhbHVlS2luZHMoKSBjb25zdCB7CisgIHVpbnQzMl90IE51bVZhbHVlS2luZHMgPSAwOworICBmb3IgKHVpbnQzMl90IEtpbmQgPSBJUFZLX0ZpcnN0OyBLaW5kIDw9IElQVktfTGFzdDsgKytLaW5kKQorICAgIE51bVZhbHVlS2luZHMgKz0gIShnZXRWYWx1ZVNpdGVzRm9yS2luZChLaW5kKS5lbXB0eSgpKTsKKyAgcmV0dXJuIE51bVZhbHVlS2luZHM7Cit9CisKK3VpbnQzMl90IEluc3RyUHJvZlJlY29yZDo6Z2V0TnVtVmFsdWVEYXRhKHVpbnQzMl90IFZhbHVlS2luZCkgY29uc3QgeworICB1aW50MzJfdCBOID0gMDsKKyAgZm9yIChhdXRvICZTUiA6IGdldFZhbHVlU2l0ZXNGb3JLaW5kKFZhbHVlS2luZCkpCisgICAgTiArPSBTUi5WYWx1ZURhdGEuc2l6ZSgpOworICByZXR1cm4gTjsKK30KKwordWludDMyX3QgSW5zdHJQcm9mUmVjb3JkOjpnZXROdW1WYWx1ZVNpdGVzKHVpbnQzMl90IFZhbHVlS2luZCkgY29uc3QgeworICByZXR1cm4gZ2V0VmFsdWVTaXRlc0ZvcktpbmQoVmFsdWVLaW5kKS5zaXplKCk7Cit9CisKK3VpbnQzMl90IEluc3RyUHJvZlJlY29yZDo6Z2V0TnVtVmFsdWVEYXRhRm9yU2l0ZSh1aW50MzJfdCBWYWx1ZUtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2l0ZSkgY29uc3QgeworICByZXR1cm4gZ2V0VmFsdWVTaXRlc0ZvcktpbmQoVmFsdWVLaW5kKVtTaXRlXS5WYWx1ZURhdGEuc2l6ZSgpOworfQorCitzdGQ6OnVuaXF1ZV9wdHI8SW5zdHJQcm9mVmFsdWVEYXRhW10+CitJbnN0clByb2ZSZWNvcmQ6OmdldFZhbHVlRm9yU2l0ZSh1aW50MzJfdCBWYWx1ZUtpbmQsIHVpbnQzMl90IFNpdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCAqVG90YWxDKSBjb25zdCB7CisgIHVpbnQ2NF90IER1bW15OworICB1aW50NjRfdCAmVG90YWxDb3VudCA9IChUb3RhbEMgPT0gbnVsbHB0ciA/IER1bW15IDogKlRvdGFsQyk7CisgIHVpbnQzMl90IE4gPSBnZXROdW1WYWx1ZURhdGFGb3JTaXRlKFZhbHVlS2luZCwgU2l0ZSk7CisgIGlmIChOID09IDApIHsKKyAgICBUb3RhbENvdW50ID0gMDsKKyAgICByZXR1cm4gc3RkOjp1bmlxdWVfcHRyPEluc3RyUHJvZlZhbHVlRGF0YVtdPihudWxscHRyKTsKKyAgfQorCisgIGF1dG8gVkQgPSBsbHZtOjptYWtlX3VuaXF1ZTxJbnN0clByb2ZWYWx1ZURhdGFbXT4oTik7CisgIFRvdGFsQ291bnQgPSBnZXRWYWx1ZUZvclNpdGUoVkQuZ2V0KCksIFZhbHVlS2luZCwgU2l0ZSk7CisKKyAgcmV0dXJuIFZEOworfQorCit1aW50NjRfdCBJbnN0clByb2ZSZWNvcmQ6OmdldFZhbHVlRm9yU2l0ZShJbnN0clByb2ZWYWx1ZURhdGEgRGVzdFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVmFsdWVLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU2l0ZSkgY29uc3QgeworICB1aW50MzJfdCBJID0gMDsKKyAgdWludDY0X3QgVG90YWxDb3VudCA9IDA7CisgIGZvciAoYXV0byBWIDogZ2V0VmFsdWVTaXRlc0ZvcktpbmQoVmFsdWVLaW5kKVtTaXRlXS5WYWx1ZURhdGEpIHsKKyAgICBEZXN0W0ldLlZhbHVlID0gVi5WYWx1ZTsKKyAgICBEZXN0W0ldLkNvdW50ID0gVi5Db3VudDsKKyAgICBUb3RhbENvdW50ID0gU2F0dXJhdGluZ0FkZChUb3RhbENvdW50LCBWLkNvdW50KTsKKyAgICBJKys7CisgIH0KKyAgcmV0dXJuIFRvdGFsQ291bnQ7Cit9CisKK3ZvaWQgSW5zdHJQcm9mUmVjb3JkOjpyZXNlcnZlU2l0ZXModWludDMyX3QgVmFsdWVLaW5kLCB1aW50MzJfdCBOdW1WYWx1ZVNpdGVzKSB7CisgIGlmICghTnVtVmFsdWVTaXRlcykKKyAgICByZXR1cm47CisgIGdldE9yQ3JlYXRlVmFsdWVTaXRlc0ZvcktpbmQoVmFsdWVLaW5kKS5yZXNlcnZlKE51bVZhbHVlU2l0ZXMpOworfQorCitpbmxpbmUgc3VwcG9ydDo6ZW5kaWFubmVzcyBnZXRIb3N0RW5kaWFubmVzcygpIHsKKyAgcmV0dXJuIHN5czo6SXNMaXR0bGVFbmRpYW5Ib3N0ID8gc3VwcG9ydDo6bGl0dGxlIDogc3VwcG9ydDo6YmlnOworfQorCisvLyBJbmNsdWRlIGRlZmluaXRpb25zIGZvciB2YWx1ZSBwcm9maWxlIGRhdGEKKyNkZWZpbmUgSU5TVFJfUFJPRl9WQUxVRV9QUk9GX0RBVEEKKyNpbmNsdWRlICJsbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZkRhdGEuaW5jIgorCit2b2lkIEluc3RyUHJvZlZhbHVlU2l0ZVJlY29yZDo6c29ydEJ5Q291bnQoKSB7CisgIFZhbHVlRGF0YS5zb3J0KAorICAgICAgW10oY29uc3QgSW5zdHJQcm9mVmFsdWVEYXRhICZsZWZ0LCBjb25zdCBJbnN0clByb2ZWYWx1ZURhdGEgJnJpZ2h0KSB7CisgICAgICAgIHJldHVybiBsZWZ0LkNvdW50ID4gcmlnaHQuQ291bnQ7CisgICAgICB9KTsKKyAgLy8gTm93IHRydW5jYXRlCisgIHNpemVfdCBtYXhfcyA9IElOU1RSX1BST0ZfTUFYX05VTV9WQUxfUEVSX1NJVEU7CisgIGlmIChWYWx1ZURhdGEuc2l6ZSgpID4gbWF4X3MpCisgICAgVmFsdWVEYXRhLnJlc2l6ZShtYXhfcyk7Cit9CisKK25hbWVzcGFjZSBJbmRleGVkSW5zdHJQcm9mIHsKKworZW51bSBjbGFzcyBIYXNoVCA6IHVpbnQzMl90IHsKKyAgTUQ1LAorICBMYXN0ID0gTUQ1Cit9OworCitpbmxpbmUgdWludDY0X3QgQ29tcHV0ZUhhc2goSGFzaFQgVHlwZSwgU3RyaW5nUmVmIEspIHsKKyAgc3dpdGNoIChUeXBlKSB7CisgIGNhc2UgSGFzaFQ6Ok1ENToKKyAgICByZXR1cm4gTUQ1SGFzaChLKTsKKyAgfQorICBsbHZtX3VucmVhY2hhYmxlKCJVbmhhbmRsZWQgaGFzaCB0eXBlIik7Cit9CisKK2NvbnN0IHVpbnQ2NF90IE1hZ2ljID0gMHg4MTY5NjY2ZjcyNzA2Y2ZmOyAvLyAiXHhmZmxwcm9maVx4ODEiCisKK2VudW0gUHJvZlZlcnNpb24geworICAvLyBWZXJzaW9uIDEgaXMgdGhlIGZpcnN0IHZlcnNpb24uIEluIHRoaXMgdmVyc2lvbiwgdGhlIHZhbHVlIG9mCisgIC8vIGEga2V5L3ZhbHVlIHBhaXIgY2FuIG9ubHkgaW5jbHVkZSBwcm9maWxlIGRhdGEgb2YgYSBzaW5nbGUgZnVuY3Rpb24uCisgIC8vIER1ZSB0byB0aGlzIHJlc3RyaWN0aW9uLCB0aGUgbnVtYmVyIG9mIGJsb2NrIGNvdW50ZXJzIGZvciBhIGdpdmVuCisgIC8vIGZ1bmN0aW9uIGlzIG5vdCByZWNvcmRlZCBidXQgZGVyaXZlZCBmcm9tIHRoZSBsZW5ndGggb2YgdGhlIHZhbHVlLgorICBWZXJzaW9uMSA9IDEsCisgIC8vIFRoZSB2ZXJzaW9uIDIgZm9ybWF0IHN1cHBvcnRzIHJlY29yZGluZyBwcm9maWxlIGRhdGEgb2YgbXVsdGlwbGUKKyAgLy8gZnVuY3Rpb25zIHdoaWNoIHNoYXJlIHRoZSBzYW1lIGtleSBpbiBvbmUgdmFsdWUgZmllbGQuIFRvIHN1cHBvcnQgdGhpcywKKyAgLy8gdGhlIG51bWJlciBibG9jayBjb3VudGVycyBpcyByZWNvcmRlZCBhcyBhbiB1aW50NjRfdCBmaWVsZCByaWdodCBhZnRlciB0aGUKKyAgLy8gZnVuY3Rpb24gc3RydWN0dXJhbCBoYXNoLgorICBWZXJzaW9uMiA9IDIsCisgIC8vIFZlcnNpb24gMyBzdXBwb3J0cyB2YWx1ZSBwcm9maWxlIGRhdGEuIFRoZSB2YWx1ZSBwcm9maWxlIGRhdGEgaXMgZXhwZWN0ZWQKKyAgLy8gdG8gZm9sbG93IHRoZSBibG9jayBjb3VudGVyIHByb2ZpbGUgZGF0YS4KKyAgVmVyc2lvbjMgPSAzLAorICAvLyBJbiB0aGlzIHZlcnNpb24sIHByb2ZpbGUgc3VtbWFyeSBkYXRhIFxjIEluZGV4ZWRJbnN0clByb2Y6OlN1bW1hcnkgaXMKKyAgLy8gc3RvcmVkIGFmdGVyIHRoZSBwcm9maWxlIGhlYWRlci4KKyAgVmVyc2lvbjQgPSA0LAorICAvLyBJbiB0aGlzIHZlcnNpb24sIHRoZSBmcm9udGVuZCBQR08gc3RhYmxlIGhhc2ggYWxnb3JpdGhtIGRlZmF1bHRzIHRvIFYyLgorICBWZXJzaW9uNSA9IDUsCisgIC8vIFRoZSBjdXJyZW50IHZlcnNpb24gaXMgNS4KKyAgQ3VycmVudFZlcnNpb24gPSBJTlNUUl9QUk9GX0lOREVYX1ZFUlNJT04KK307Citjb25zdCB1aW50NjRfdCBWZXJzaW9uID0gUHJvZlZlcnNpb246OkN1cnJlbnRWZXJzaW9uOworCitjb25zdCBIYXNoVCBIYXNoVHlwZSA9IEhhc2hUOjpNRDU7CisKK2lubGluZSB1aW50NjRfdCBDb21wdXRlSGFzaChTdHJpbmdSZWYgSykgeyByZXR1cm4gQ29tcHV0ZUhhc2goSGFzaFR5cGUsIEspOyB9CisKKy8vIFRoaXMgc3RydWN0dXJlIGRlZmluZXMgdGhlIGZpbGUgaGVhZGVyIG9mIHRoZSBMTFZNIHByb2ZpbGUKKy8vIGRhdGEgZmlsZSBpbiBpbmRleGVkLWZvcm1hdC4KK3N0cnVjdCBIZWFkZXIgeworICB1aW50NjRfdCBNYWdpYzsKKyAgdWludDY0X3QgVmVyc2lvbjsKKyAgdWludDY0X3QgVW51c2VkOyAvLyBCZWNvbWVzIHVudXNlZCBzaW5jZSB2ZXJzaW9uIDQKKyAgdWludDY0X3QgSGFzaFR5cGU7CisgIHVpbnQ2NF90IEhhc2hPZmZzZXQ7Cit9OworCisvLyBQcm9maWxlIHN1bW1hcnkgZGF0YSByZWNvcmRlZCBpbiB0aGUgcHJvZmlsZSBkYXRhIGZpbGUgaW4gaW5kZXhlZAorLy8gZm9ybWF0LiBJdCBpcyBpbnRyb2R1Y2VkIGluIHZlcnNpb24gNC4gVGhlIHN1bW1hcnkgZGF0YSBmb2xsb3dzCisvLyByaWdodCBhZnRlciB0aGUgcHJvZmlsZSBmaWxlIGhlYWRlci4KK3N0cnVjdCBTdW1tYXJ5IHsKKyAgc3RydWN0IEVudHJ5IHsKKyAgICB1aW50NjRfdCBDdXRvZmY7IC8vLzwgVGhlIHJlcXVpcmVkIHBlcmNlbnRpbGUgb2YgdG90YWwgZXhlY3V0aW9uIGNvdW50LgorICAgIHVpbnQ2NF90CisgICAgICAgIE1pbkJsb2NrQ291bnQ7ICAvLy88IFRoZSBtaW5pbXVtIGV4ZWN1dGlvbiBjb3VudCBmb3IgdGhpcyBwZXJjZW50aWxlLgorICAgIHVpbnQ2NF90IE51bUJsb2NrczsgLy8vPCBOdW1iZXIgb2YgYmxvY2tzID49IHRoZSBtaW51bXVtIGV4ZWN1dGlvbiBjb3VudC4KKyAgfTsKKyAgLy8gVGhlIGZpZWxkIGtpbmQgZW51bWVyYXRvciB0byBhc3NpZ25lZCB2YWx1ZSBtYXBwaW5nIHNob3VsZCByZW1haW4KKyAgLy8gdW5jaGFuZ2VkICB3aGVuIGEgbmV3IGtpbmQgaXMgYWRkZWQgb3IgYW4gb2xkIGtpbmQgZ2V0cyBkZWxldGVkIGluCisgIC8vIHRoZSBmdXR1cmUuCisgIGVudW0gU3VtbWFyeUZpZWxkS2luZCB7CisgICAgLy8vIFRoZSB0b3RhbCBudW1iZXIgb2YgZnVuY3Rpb25zIGluc3RydW1lbnRlZC4KKyAgICBUb3RhbE51bUZ1bmN0aW9ucyA9IDAsCisgICAgLy8vIFRvdGFsIG51bWJlciBvZiBpbnN0cnVtZW50ZWQgYmxvY2tzL2VkZ2VzLgorICAgIFRvdGFsTnVtQmxvY2tzID0gMSwKKyAgICAvLy8gVGhlIG1heGltYWwgZXhlY3V0aW9uIGNvdW50IGFtb25nIGFsbCBmdW5jdGlvbnMuCisgICAgLy8vIFRoaXMgZmllbGQgZG9lcyBub3QgZXhpc3QgZm9yIHByb2ZpbGUgZGF0YSBmcm9tIElSIGJhc2VkCisgICAgLy8vIGluc3RydW1lbnRhdGlvbi4KKyAgICBNYXhGdW5jdGlvbkNvdW50ID0gMiwKKyAgICAvLy8gTWF4IGJsb2NrIGNvdW50IG9mIHRoZSBwcm9ncmFtLgorICAgIE1heEJsb2NrQ291bnQgPSAzLAorICAgIC8vLyBNYXggaW50ZXJuYWwgYmxvY2sgY291bnQgb2YgdGhlIHByb2dyYW0gKGV4Y2x1ZGluZyBlbnRyeSBibG9ja3MpLgorICAgIE1heEludGVybmFsQmxvY2tDb3VudCA9IDQsCisgICAgLy8vIFRoZSBzdW0gb2YgYWxsIGluc3RydW1lbnRlZCBibG9jayBjb3VudHMuCisgICAgVG90YWxCbG9ja0NvdW50ID0gNSwKKyAgICBOdW1LaW5kcyA9IFRvdGFsQmxvY2tDb3VudCArIDEKKyAgfTsKKworICAvLyBUaGUgbnVtYmVyIG9mIHN1bW1tYXJ5IGZpZWxkcyBmb2xsb3dpbmcgdGhlIHN1bW1hcnkgaGVhZGVyLgorICB1aW50NjRfdCBOdW1TdW1tYXJ5RmllbGRzOworICAvLyBUaGUgbnVtYmVyIG9mIEN1dG9mZiBFbnRyaWVzIChTdW1tYXJ5OjpFbnRyeSkgZm9sbG93aW5nIHN1bW1hcnkgZmllbGRzLgorICB1aW50NjRfdCBOdW1DdXRvZmZFbnRyaWVzOworCisgIFN1bW1hcnkoKSA9IGRlbGV0ZTsKKyAgU3VtbWFyeSh1aW50MzJfdCBTaXplKSB7IG1lbXNldCh0aGlzLCAwLCBTaXplKTsgfQorCisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKnB0cikgeyA6Om9wZXJhdG9yIGRlbGV0ZShwdHIpOyB9CisKKyAgc3RhdGljIHVpbnQzMl90IGdldFNpemUodWludDMyX3QgTnVtU3VtRmllbGRzLCB1aW50MzJfdCBOdW1DdXRvZmZFbnRyaWVzKSB7CisgICAgcmV0dXJuIHNpemVvZihTdW1tYXJ5KSArIE51bUN1dG9mZkVudHJpZXMgKiBzaXplb2YoRW50cnkpICsKKyAgICAgICAgICAgTnVtU3VtRmllbGRzICogc2l6ZW9mKHVpbnQ2NF90KTsKKyAgfQorCisgIGNvbnN0IHVpbnQ2NF90ICpnZXRTdW1tYXJ5RGF0YUJhc2UoKSBjb25zdCB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0X3QgKj4odGhpcyArIDEpOworICB9CisKKyAgdWludDY0X3QgKmdldFN1bW1hcnlEYXRhQmFzZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50NjRfdCAqPih0aGlzICsgMSk7CisgIH0KKworICBjb25zdCBFbnRyeSAqZ2V0Q3V0b2ZmRW50cnlCYXNlKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEVudHJ5ICo+KAorICAgICAgICAmZ2V0U3VtbWFyeURhdGFCYXNlKClbTnVtU3VtbWFyeUZpZWxkc10pOworICB9CisKKyAgRW50cnkgKmdldEN1dG9mZkVudHJ5QmFzZSgpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxFbnRyeSAqPigmZ2V0U3VtbWFyeURhdGFCYXNlKClbTnVtU3VtbWFyeUZpZWxkc10pOworICB9CisKKyAgdWludDY0X3QgZ2V0KFN1bW1hcnlGaWVsZEtpbmQgSykgY29uc3QgeworICAgIHJldHVybiBnZXRTdW1tYXJ5RGF0YUJhc2UoKVtLXTsKKyAgfQorCisgIHZvaWQgc2V0KFN1bW1hcnlGaWVsZEtpbmQgSywgdWludDY0X3QgVikgeworICAgIGdldFN1bW1hcnlEYXRhQmFzZSgpW0tdID0gVjsKKyAgfQorCisgIGNvbnN0IEVudHJ5ICZnZXRFbnRyeSh1aW50MzJfdCBJKSBjb25zdCB7IHJldHVybiBnZXRDdXRvZmZFbnRyeUJhc2UoKVtJXTsgfQorCisgIHZvaWQgc2V0RW50cnkodWludDMyX3QgSSwgY29uc3QgUHJvZmlsZVN1bW1hcnlFbnRyeSAmRSkgeworICAgIEVudHJ5ICZFUiA9IGdldEN1dG9mZkVudHJ5QmFzZSgpW0ldOworICAgIEVSLkN1dG9mZiA9IEUuQ3V0b2ZmOworICAgIEVSLk1pbkJsb2NrQ291bnQgPSBFLk1pbkNvdW50OworICAgIEVSLk51bUJsb2NrcyA9IEUuTnVtQ291bnRzOworICB9Cit9OworCitpbmxpbmUgc3RkOjp1bmlxdWVfcHRyPFN1bW1hcnk+IGFsbG9jU3VtbWFyeSh1aW50MzJfdCBUb3RhbFNpemUpIHsKKyAgcmV0dXJuIHN0ZDo6dW5pcXVlX3B0cjxTdW1tYXJ5PihuZXcgKDo6b3BlcmF0b3IgbmV3KFRvdGFsU2l6ZSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1bW1hcnkoVG90YWxTaXplKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBJbmRleGVkSW5zdHJQcm9mCisKK25hbWVzcGFjZSBSYXdJbnN0clByb2YgeworCisvLyBWZXJzaW9uIDE6IEZpcnN0IHZlcnNpb24KKy8vIFZlcnNpb24gMjogQWRkZWQgdmFsdWUgcHJvZmlsZSBkYXRhIHNlY3Rpb24uIFBlci1mdW5jdGlvbiBjb250cm9sIGRhdGEKKy8vIHN0cnVjdCBoYXMgbW9yZSBmaWVsZHMgdG8gZGVzY3JpYmUgdmFsdWUgcHJvZmlsZSBpbmZvcm1hdGlvbi4KKy8vIFZlcnNpb24gMzogQ29tcHJlc3NlZCBuYW1lIHNlY3Rpb24gc3VwcG9ydC4gRnVuY3Rpb24gUEdPIG5hbWUgcmVmZXJlbmNlCisvLyBmcm9tIGNvbnRyb2wgZGF0YSBzdHJ1Y3QgaXMgY2hhbmdlZCBmcm9tIHJhdyBwb2ludGVyIHRvIE5hbWUncyBNRDUgdmFsdWUuCisvLyBWZXJzaW9uIDQ6IFZhbHVlRGF0YUJlZ2luIGFuZCBWYWx1ZURhdGFTaXplcyBmaWVsZHMgYXJlIHJlbW92ZWQgZnJvbSB0aGUKKy8vIHJhdyBoZWFkZXIuCitjb25zdCB1aW50NjRfdCBWZXJzaW9uID0gSU5TVFJfUFJPRl9SQVdfVkVSU0lPTjsKKwordGVtcGxhdGUgPGNsYXNzIEludFB0clQ+IGlubGluZSB1aW50NjRfdCBnZXRNYWdpYygpOwordGVtcGxhdGUgPD4gaW5saW5lIHVpbnQ2NF90IGdldE1hZ2ljPHVpbnQ2NF90PigpIHsKKyAgcmV0dXJuIElOU1RSX1BST0ZfUkFXX01BR0lDXzY0OworfQorCit0ZW1wbGF0ZSA8PiBpbmxpbmUgdWludDY0X3QgZ2V0TWFnaWM8dWludDMyX3Q+KCkgeworICByZXR1cm4gSU5TVFJfUFJPRl9SQVdfTUFHSUNfMzI7Cit9CisKKy8vIFBlci1mdW5jdGlvbiBwcm9maWxlIGRhdGEgaGVhZGVyL2NvbnRyb2wgc3RydWN0dXJlLgorLy8gVGhlIGRlZmluaXRpb24gc2hvdWxkIG1hdGNoIHRoZSBzdHJ1Y3R1cmUgZGVmaW5lZCBpbgorLy8gY29tcGlsZXItcnQvbGliL3Byb2ZpbGUvSW5zdHJQcm9maWxpbmcuaC4KKy8vIEl0IHNob3VsZCBhbHNvIG1hdGNoIHRoZSBzeW50aGVzaXplZCB0eXBlIGluCisvLyBUcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9JbnN0clByb2ZpbGluZy5jcHA6Z2V0T3JDcmVhdGVSZWdpb25Db3VudGVycy4KK3RlbXBsYXRlIDxjbGFzcyBJbnRQdHJUPiBzdHJ1Y3QgTExWTV9BTElHTkFTKDgpIFByb2ZpbGVEYXRhIHsKKyAgI2RlZmluZSBJTlNUUl9QUk9GX0RBVEEoVHlwZSwgTExWTVR5cGUsIE5hbWUsIEluaXQpIFR5cGUgTmFtZTsKKyAgI2luY2x1ZGUgImxsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mRGF0YS5pbmMiCit9OworCisvLyBGaWxlIGhlYWRlciBzdHJ1Y3R1cmUgb2YgdGhlIExMVk0gcHJvZmlsZSBkYXRhIGluIHJhdyBmb3JtYXQuCisvLyBUaGUgZGVmaW5pdGlvbiBzaG91bGQgbWF0Y2ggdGhlIGhlYWRlciByZWZlcmVuY2VkIGluCisvLyBjb21waWxlci1ydC9saWIvcHJvZmlsZS9JbnN0clByb2ZpbGluZ0ZpbGUuYyAgYW5kCisvLyBJbnN0clByb2ZpbGluZ0J1ZmZlci5jLgorc3RydWN0IEhlYWRlciB7CisjZGVmaW5lIElOU1RSX1BST0ZfUkFXX0hFQURFUihUeXBlLCBOYW1lLCBJbml0KSBjb25zdCBUeXBlIE5hbWU7CisjaW5jbHVkZSAibGx2bS9Qcm9maWxlRGF0YS9JbnN0clByb2ZEYXRhLmluYyIKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBSYXdJbnN0clByb2YKKworLy8gUGFyc2UgTWVtT1AgU2l6ZSByYW5nZSBvcHRpb24uCit2b2lkIGdldE1lbU9QU2l6ZVJhbmdlRnJvbU9wdGlvbihTdHJpbmdSZWYgU3RyLCBpbnQ2NF90ICZSYW5nZVN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAmUmFuZ2VMYXN0KTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fUFJPRklMRURBVEFfSU5TVFJQUk9GX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mRGF0YS5pbmMgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZkRhdGEuaW5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhYzhjY2UKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZkRhdGEuaW5jCkBAIC0wLDAgKzEsNzQwIEBACisvKj09PS0tIEluc3RyUHJvZkRhdGEuaW5jIC0gaW5zdHIgcHJvZmlsaW5nIHJ1bnRpbWUgc3RydWN0dXJlcyAtKi0gQysrIC0qLT09PSAqXAorfCoKK3wqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKK3wqCit8KiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKK3wqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KK3wqCitcKj09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0qLworLyoKKyAqIFRoaXMgaXMgdGhlIG1hc3RlciBmaWxlIHRoYXQgZGVmaW5lcyBhbGwgdGhlIGRhdGEgc3RydWN0dXJlLCBzaWduYXR1cmUsCisgKiBjb25zdGFudCBsaXRlcmFscyB0aGF0IGFyZSBzaGFyZWQgYWNyb3NzIHByb2ZpbGluZyBydW50aW1lIGxpYnJhcnksCisgKiBjb21waWxlciAoaW5zdHJ1bWVudGF0aW9uKSwgYW5kIGhvc3QgdG9vbHMgKHJlYWRlci93cml0ZXIpLiBUaGUgZW50aXRpZXMKKyAqIGRlZmluZWQgaW4gdGhpcyBmaWxlIGFmZmVjdCB0aGUgcHJvZmlsZSBydW50aW1lIEFCSSwgdGhlIHJhdyBwcm9maWxlIGZvcm1hdCwKKyAqIG9yIGJvdGguCisgKgorICogVGhlIGZpbGUgaGFzIHR3byBpZGVudGljYWwgY29waWVzLiBUaGUgbWFzdGVyIGNvcHkgbGl2ZXMgaW4gTExWTSBhbmQKKyAqIHRoZSBvdGhlciBvbmUgIHNpdHMgaW4gY29tcGlsZXItcnQvbGliL3Byb2ZpbGUgZGlyZWN0b3J5LiBUbyBtYWtlIGNoYW5nZXMKKyAqIGluIHRoaXMgZmlsZSwgZmlyc3QgbW9kaWZ5IHRoZSBtYXN0ZXIgY29weSBhbmQgY29weSBpdCBvdmVyIHRvIGNvbXBpbGVyLXJ0LgorICogVGVzdGluZyBvZiBhbnkgY2hhbmdlIGluIHRoaXMgZmlsZSBjYW4gc3RhcnQgb25seSBhZnRlciB0aGUgdHdvIGNvcGllcyBhcmUKKyAqIHN5bmNlZCB1cC4KKyAqCisgKiBUaGUgZmlyc3QgcGFydCBvZiB0aGUgZmlsZSBpbmNsdWRlcyBtYWNyb3MgdGhhdCBkZWZpbmVzIHR5cGVzLCBuYW1lcywgYW5kCisgKiBpbml0aWFsaXplcnMgZm9yIHRoZSBtZW1iZXIgZmllbGRzIG9mIHRoZSBjb3JlIGRhdGEgc3RydWN0dXJlcy4gVGhlIGZpZWxkCisgKiBkZWNsYXJhdGlvbnMgZm9yIG9uZSBzdHJ1Y3R1cmUgaXMgZW5hYmxlZCBieSBkZWZpbmluZyB0aGUgZmllbGQgYWN0aXZhdGlvbgorICogbWFjcm8gYXNzb2NpYXRlZCB3aXRoIHRoYXQgc3RydWN0dXJlLiBPbmx5IG9uZSBmaWVsZCBhY3RpdmF0aW9uIHJlY29yZAorICogY2FuIGJlIGRlZmluZWQgYXQgb25lIHRpbWUgYW5kIHRoZSByZXN0IGRlZmluaXRpb25zIHdpbGwgYmUgZmlsdGVyZWQgb3V0IGJ5CisgKiB0aGUgcHJlcHJvY2Vzc29yLgorICoKKyAqIEV4YW1wbGVzIG9mIGhvdyB0aGUgdGVtcGxhdGUgaXMgdXNlZCB0byBpbnN0YW50aWF0ZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbjoKKyAqIDEuIFRvIGRlY2xhcmUgYSBzdHJ1Y3R1cmU6CisgKgorICogc3RydWN0IFByb2ZEYXRhIHsKKyAqICNkZWZpbmUgSU5TVFJfUFJPRl9EQVRBKFR5cGUsIExMVk1UeXBlLCBOYW1lLCBJbml0aWFsaXplcikgXAorICogICAgVHlwZSBOYW1lOworICogI2luY2x1ZGUgImxsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mRGF0YS5pbmMiCisgKiB9OworICoKKyAqIDIuIFRvIGNvbnN0cnVjdCBMTFZNIHR5cGUgYXJyYXlzIGZvciB0aGUgc3RydWN0IHR5cGU6CisgKgorICogVHlwZSAqRGF0YVR5cGVzW10gPSB7CisgKiAjZGVmaW5lIElOU1RSX1BST0ZfREFUQShUeXBlLCBMTFZNVHlwZSwgTmFtZSwgSW5pdGlhbGl6ZXIpIFwKKyAqICAgTExWTVR5cGUsCisgKiAjaW5jbHVkZSAibGx2bS9Qcm9maWxlRGF0YS9JbnN0clByb2ZEYXRhLmluYyIKKyAqIH07CisgKgorICogNC4gVG8gY29uc3RydWN0IGNvbnN0YW50IGFycmF5IGZvciB0aGUgaW5pdGlhbGl6ZXJzOgorICogI2RlZmluZSBJTlNUUl9QUk9GX0RBVEEoVHlwZSwgTExWTVR5cGUsIE5hbWUsIEluaXRpYWxpemVyKSBcCisgKiAgIEluaXRpYWxpemVyLAorICogQ29uc3RhbnQgKkNvbnN0YW50VmFsc1tdID0geworICogI2luY2x1ZGUgImxsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mRGF0YS5pbmMiCisgKiB9OworICoKKyAqCisgKiBUaGUgc2Vjb25kIHBhcnQgb2YgdGhlIGZpbGUgaW5jbHVkZXMgZGVmaW5pdGlvbnMgYWxsIG90aGVyIGVudGl0aWVzIHRoYXQKKyAqIGFyZSByZWxhdGVkIHRvIHJ1bnRpbWUgQUJJIGFuZCBmb3JtYXQuIFdoZW4gbm8gZmllbGQgYWN0aXZhdGlvbiBtYWNybyBpcworICogZGVmaW5lZCwgdGhpcyBmaWxlIGNhbiBiZSBpbmNsdWRlZCB0byBpbnRyb2R1Y2UgdGhlIGRlZmluaXRpb25zLgorICoKK1wqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKy8qIEZ1bmN0aW9ucyBtYXJrZWQgd2l0aCBJTlNUUl9QUk9GX1ZJU0lCSUxJVFkgbXVzdCBoYXZlIGhpZGRlbiB2aXNpYmlsaXR5IGluCisgKiB0aGUgY29tcGlsZXIgcnVudGltZS4gKi8KKyNpZm5kZWYgSU5TVFJfUFJPRl9WSVNJQklMSVRZCisjZGVmaW5lIElOU1RSX1BST0ZfVklTSUJJTElUWQorI2VuZGlmCisKKy8qIElOU1RSX1BST0ZfREFUQSBzdGFydC4gKi8KKy8qIERlZmluaXRpb24gb2YgbWVtYmVyIGZpZWxkcyBvZiB0aGUgcGVyLWZ1bmN0aW9uIGNvbnRyb2wgc3RydWN0dXJlLiAqLworI2lmbmRlZiBJTlNUUl9QUk9GX0RBVEEKKyNkZWZpbmUgSU5TVFJfUFJPRl9EQVRBKFR5cGUsIExMVk1UeXBlLCBOYW1lLCBJbml0aWFsaXplcikKKyNlbHNlCisjZGVmaW5lIElOU1RSX1BST0ZfREFUQV9ERUZJTkVECisjZW5kaWYKK0lOU1RSX1BST0ZfREFUQShjb25zdCB1aW50NjRfdCwgbGx2bTo6VHlwZTo6Z2V0SW50NjRUeShDdHgpLCBOYW1lUmVmLCBcCisgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChsbHZtOjpUeXBlOjpnZXRJbnQ2NFR5KEN0eCksIFwKKyAgICAgICAgICAgICAgICBJbmRleGVkSW5zdHJQcm9mOjpDb21wdXRlSGFzaChnZXRQR09GdW5jTmFtZVZhckluaXRpYWxpemVyKEluYy0+Z2V0TmFtZSgpKSkpKQorSU5TVFJfUFJPRl9EQVRBKGNvbnN0IHVpbnQ2NF90LCBsbHZtOjpUeXBlOjpnZXRJbnQ2NFR5KEN0eCksIEZ1bmNIYXNoLCBcCisgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQ6OmdldChsbHZtOjpUeXBlOjpnZXRJbnQ2NFR5KEN0eCksIFwKKyAgICAgICAgICAgICAgICBJbmMtPmdldEhhc2goKS0+Z2V0WkV4dFZhbHVlKCkpKQorSU5TVFJfUFJPRl9EQVRBKGNvbnN0IEludFB0clQsIGxsdm06OlR5cGU6OmdldEludDY0UHRyVHkoQ3R4KSwgQ291bnRlclB0ciwgXAorICAgICAgICAgICAgICAgIENvbnN0YW50RXhwcjo6Z2V0Qml0Q2FzdChDb3VudGVyUHRyLCBcCisgICAgICAgICAgICAgICAgbGx2bTo6VHlwZTo6Z2V0SW50NjRQdHJUeShDdHgpKSkKKy8qIFRoaXMgaXMgdXNlZCB0byBtYXAgZnVuY3Rpb24gcG9pbnRlcnMgZm9yIHRoZSBpbmRpcmVjdCBjYWxsIHRhcmdldHMgdG8KKyAqIGZ1bmN0aW9uIG5hbWUgaGFzaGVzIGR1cmluZyB0aGUgY29udmVyc2lvbiBmcm9tIHJhdyB0byBtZXJnZWQgcHJvZmlsZQorICogZGF0YS4KKyAqLworSU5TVFJfUFJPRl9EQVRBKGNvbnN0IEludFB0clQsIGxsdm06OlR5cGU6OmdldEludDhQdHJUeShDdHgpLCBGdW5jdGlvblBvaW50ZXIsIFwKKyAgICAgICAgICAgICAgICBGdW5jdGlvbkFkZHIpCitJTlNUUl9QUk9GX0RBVEEoSW50UHRyVCwgbGx2bTo6VHlwZTo6Z2V0SW50OFB0clR5KEN0eCksIFZhbHVlcywgXAorICAgICAgICAgICAgICAgIFZhbHVlc1B0ckV4cHIpCitJTlNUUl9QUk9GX0RBVEEoY29uc3QgdWludDMyX3QsIGxsdm06OlR5cGU6OmdldEludDMyVHkoQ3R4KSwgTnVtQ291bnRlcnMsIFwKKyAgICAgICAgICAgICAgICBDb25zdGFudEludDo6Z2V0KGxsdm06OlR5cGU6OmdldEludDMyVHkoQ3R4KSwgTnVtQ291bnRlcnMpKQorSU5TVFJfUFJPRl9EQVRBKGNvbnN0IHVpbnQxNl90LCBJbnQxNkFycmF5VHksIE51bVZhbHVlU2l0ZXNbSVBWS19MYXN0KzFdLCBcCisgICAgICAgICAgICAgICAgQ29uc3RhbnRBcnJheTo6Z2V0KEludDE2QXJyYXlUeSwgSW50MTZBcnJheVZhbHMpKQorI3VuZGVmIElOU1RSX1BST0ZfREFUQQorLyogSU5TVFJfUFJPRl9EQVRBIGVuZC4gKi8KKworCisvKiBUaGlzIGlzIGFuIGludGVybmFsIGRhdGEgc3RydWN0dXJlIHVzZWQgYnkgdmFsdWUgcHJvZmlsZXIuIEl0CisgKiBpcyBkZWZpbmVkIGhlcmUgdG8gYWxsb3cgc2VyaWFsaXphdGlvbiBjb2RlIHNoYXJpbmcgYnkgTExWTQorICogdG8gYmUgdXNlZCBpbiB1bml0IHRlc3QuCisgKgorICogdHlwZWRlZiBzdHJ1Y3QgVmFsdWVQcm9mTm9kZSB7CisgKiAgIC8vIEluc3RyUHJvZlZhbHVlRGF0YSBWRGF0YTsKKyAqICAgdWludDY0X3QgVmFsdWU7CisgKiAgIHVpbnQ2NF90IENvdW50OworICogICBzdHJ1Y3QgVmFsdWVQcm9mTm9kZSAqTmV4dDsKKyAqIH0gVmFsdWVQcm9mTm9kZTsKKyAqLworLyogSU5TVFJfUFJPRl9WQUxVRV9OT0RFIHN0YXJ0LiAqLworI2lmbmRlZiBJTlNUUl9QUk9GX1ZBTFVFX05PREUKKyNkZWZpbmUgSU5TVFJfUFJPRl9WQUxVRV9OT0RFKFR5cGUsIExMVk1UeXBlLCBOYW1lLCBJbml0aWFsaXplcikKKyNlbHNlCisjZGVmaW5lIElOU1RSX1BST0ZfREFUQV9ERUZJTkVECisjZW5kaWYKK0lOU1RSX1BST0ZfVkFMVUVfTk9ERSh1aW50NjRfdCwgbGx2bTo6VHlwZTo6Z2V0SW50NjRUeShDdHgpLCBWYWx1ZSwgXAorICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQobGx2bTo6VHlwZTo6R2V0SW50NjRUeShDdHgpLCAwKSkKK0lOU1RSX1BST0ZfVkFMVUVfTk9ERSh1aW50NjRfdCwgbGx2bTo6VHlwZTo6Z2V0SW50NjRUeShDdHgpLCBDb3VudCwgXAorICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQobGx2bTo6VHlwZTo6R2V0SW50NjRUeShDdHgpLCAwKSkKK0lOU1RSX1BST0ZfVkFMVUVfTk9ERShQdHJUb05vZGVULCBsbHZtOjpUeXBlOjpnZXRJbnQ4UHRyVHkoQ3R4KSwgTmV4dCwgXAorICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50SW50OjpnZXQobGx2bTo6VHlwZTo6R2V0SW50OFB0clR5KEN0eCksIDApKQorI3VuZGVmIElOU1RSX1BST0ZfVkFMVUVfTk9ERQorLyogSU5TVFJfUFJPRl9WQUxVRV9OT0RFIGVuZC4gKi8KKworLyogSU5TVFJfUFJPRl9SQVdfSEVBREVSICBzdGFydCAqLworLyogRGVmaW5pdGlvbiBvZiBtZW1iZXIgZmllbGRzIG9mIHRoZSByYXcgcHJvZmlsZSBoZWFkZXIgZGF0YSBzdHJ1Y3R1cmUuICovCisjaWZuZGVmIElOU1RSX1BST0ZfUkFXX0hFQURFUgorI2RlZmluZSBJTlNUUl9QUk9GX1JBV19IRUFERVIoVHlwZSwgTmFtZSwgSW5pdGlhbGl6ZXIpCisjZWxzZQorI2RlZmluZSBJTlNUUl9QUk9GX0RBVEFfREVGSU5FRAorI2VuZGlmCitJTlNUUl9QUk9GX1JBV19IRUFERVIodWludDY0X3QsIE1hZ2ljLCBfX2xsdm1fcHJvZmlsZV9nZXRfbWFnaWMoKSkKK0lOU1RSX1BST0ZfUkFXX0hFQURFUih1aW50NjRfdCwgVmVyc2lvbiwgX19sbHZtX3Byb2ZpbGVfZ2V0X3ZlcnNpb24oKSkKK0lOU1RSX1BST0ZfUkFXX0hFQURFUih1aW50NjRfdCwgRGF0YVNpemUsIERhdGFTaXplKQorSU5TVFJfUFJPRl9SQVdfSEVBREVSKHVpbnQ2NF90LCBDb3VudGVyc1NpemUsIENvdW50ZXJzU2l6ZSkKK0lOU1RSX1BST0ZfUkFXX0hFQURFUih1aW50NjRfdCwgTmFtZXNTaXplLCAgTmFtZXNTaXplKQorSU5TVFJfUFJPRl9SQVdfSEVBREVSKHVpbnQ2NF90LCBDb3VudGVyc0RlbHRhLCAodWludHB0cl90KUNvdW50ZXJzQmVnaW4pCitJTlNUUl9QUk9GX1JBV19IRUFERVIodWludDY0X3QsIE5hbWVzRGVsdGEsICh1aW50cHRyX3QpTmFtZXNCZWdpbikKK0lOU1RSX1BST0ZfUkFXX0hFQURFUih1aW50NjRfdCwgVmFsdWVLaW5kTGFzdCwgSVBWS19MYXN0KQorI3VuZGVmIElOU1RSX1BST0ZfUkFXX0hFQURFUgorLyogSU5TVFJfUFJPRl9SQVdfSEVBREVSICBlbmQgKi8KKworLyogVkFMVUVfUFJPRl9GVU5DX1BBUkFNIHN0YXJ0ICovCisvKiBEZWZpbml0aW9uIG9mIHBhcmFtZXRlciB0eXBlcyBvZiB0aGUgcnVudGltZSBBUEkgdXNlZCB0byBkbyB2YWx1ZSBwcm9maWxpbmcKKyAqIGZvciBhIGdpdmVuIHZhbHVlIHNpdGUuCisgKi8KKyNpZm5kZWYgVkFMVUVfUFJPRl9GVU5DX1BBUkFNCisjZGVmaW5lIFZBTFVFX1BST0ZfRlVOQ19QQVJBTShBcmdUeXBlLCBBcmdOYW1lLCBBcmdMTFZNVHlwZSkKKyNkZWZpbmUgSU5TVFJfUFJPRl9DT01NQQorI2Vsc2UKKyNkZWZpbmUgSU5TVFJfUFJPRl9EQVRBX0RFRklORUQKKyNkZWZpbmUgSU5TVFJfUFJPRl9DT01NQSAsCisjZW5kaWYKK1ZBTFVFX1BST0ZfRlVOQ19QQVJBTSh1aW50NjRfdCwgVGFyZ2V0VmFsdWUsIFR5cGU6OmdldEludDY0VHkoQ3R4KSkgXAorICAgICAgICAgICAgICAgICAgICAgIElOU1RSX1BST0ZfQ09NTUEKK1ZBTFVFX1BST0ZfRlVOQ19QQVJBTSh2b2lkICosIERhdGEsIFR5cGU6OmdldEludDhQdHJUeShDdHgpKSBJTlNUUl9QUk9GX0NPTU1BCisjaWZuZGVmIFZBTFVFX1JBTkdFX1BST0YKK1ZBTFVFX1BST0ZfRlVOQ19QQVJBTSh1aW50MzJfdCwgQ291bnRlckluZGV4LCBUeXBlOjpnZXRJbnQzMlR5KEN0eCkpCisjZWxzZSAvKiBWQUxVRV9SQU5HRV9QUk9GICovCitWQUxVRV9QUk9GX0ZVTkNfUEFSQU0odWludDMyX3QsIENvdW50ZXJJbmRleCwgVHlwZTo6Z2V0SW50MzJUeShDdHgpKSBcCisgICAgICAgICAgICAgICAgICAgICAgSU5TVFJfUFJPRl9DT01NQQorVkFMVUVfUFJPRl9GVU5DX1BBUkFNKHVpbnQ2NF90LCBQcmVjaXNlUmFuZ2VTdGFydCwgVHlwZTo6Z2V0SW50NjRUeShDdHgpKSBcCisgICAgICAgICAgICAgICAgICAgICAgSU5TVFJfUFJPRl9DT01NQQorVkFMVUVfUFJPRl9GVU5DX1BBUkFNKHVpbnQ2NF90LCBQcmVjaXNlUmFuZ2VMYXN0LCBUeXBlOjpnZXRJbnQ2NFR5KEN0eCkpIFwKKyAgICAgICAgICAgICAgICAgICAgICBJTlNUUl9QUk9GX0NPTU1BCitWQUxVRV9QUk9GX0ZVTkNfUEFSQU0odWludDY0X3QsIExhcmdlVmFsdWUsIFR5cGU6OmdldEludDY0VHkoQ3R4KSkKKyNlbmRpZiAvKlZBTFVFX1JBTkdFX1BST0YgKi8KKyN1bmRlZiBWQUxVRV9QUk9GX0ZVTkNfUEFSQU0KKyN1bmRlZiBJTlNUUl9QUk9GX0NPTU1BCisvKiBWQUxVRV9QUk9GX0ZVTkNfUEFSQU0gZW5kICovCisKKy8qIFZBTFVFX1BST0ZfS0lORCBzdGFydCAqLworI2lmbmRlZiBWQUxVRV9QUk9GX0tJTkQKKyNkZWZpbmUgVkFMVUVfUFJPRl9LSU5EKEVudW1lcmF0b3IsIFZhbHVlKQorI2Vsc2UKKyNkZWZpbmUgSU5TVFJfUFJPRl9EQVRBX0RFRklORUQKKyNlbmRpZgorLyogRm9yIGluZGlyZWN0IGZ1bmN0aW9uIGNhbGwgdmFsdWUgcHJvZmlsaW5nLCB0aGUgYWRkcmVzc2VzIG9mIHRoZSB0YXJnZXQKKyAqIGZ1bmN0aW9ucyBhcmUgcHJvZmlsZWQgYnkgdGhlIGluc3RydW1lbnRlZCBjb2RlLiBUaGUgdGFyZ2V0IGFkZHJlc3NlcyBhcmUKKyAqIHdyaXR0ZW4gaW4gdGhlIHJhdyBwcm9maWxlIGRhdGEgYW5kIGNvbnZlcnRlZCB0byB0YXJnZXQgZnVuY3Rpb24gbmFtZSdzIE1ENQorICogaGFzaCBieSB0aGUgcHJvZmlsZSByZWFkZXIgZHVyaW5nIGRlc2VyaWFsaXphdGlvbi4gIFR5cGljYWxseSwgdGhpcyBoYXBwZW5zCisgKiB3aGVuIHRoZSByYXcgcHJvZmlsZSBkYXRhIGlzIHJlYWQgZHVyaW5nIHByb2ZpbGUgbWVyZ2luZy4KKyAqCisgKiBGb3IgdGhpcyByZW1hcHBpbmcgdGhlIFByb2ZEYXRhIGlzIHVzZWQuICBQcm9mRGF0YSBjb250YWlucyBib3RoIHRoZSBmdW5jdGlvbgorICogbmFtZSBoYXNoIGFuZCB0aGUgZnVuY3Rpb24gYWRkcmVzcy4KKyAqLworVkFMVUVfUFJPRl9LSU5EKElQVktfSW5kaXJlY3RDYWxsVGFyZ2V0LCAwKQorLyogRm9yIG1lbW9yeSBpbnRyaW5zaWMgZnVuY3Rpb25zIHNpemUgcHJvZmlsaW5nLiAqLworVkFMVUVfUFJPRl9LSU5EKElQVktfTWVtT1BTaXplLCAxKQorLyogVGhlc2UgdHdvIGtpbmRzIG11c3QgYmUgdGhlIGxhc3QgdG8gYmUKKyAqIGRlY2xhcmVkLiBUaGlzIGlzIHRvIG1ha2Ugc3VyZSB0aGUgc3RyaW5nCisgKiBhcnJheSBjcmVhdGVkIHdpdGggdGhlIHRlbXBsYXRlIGNhbiBiZQorICogaW5kZXhlZCB3aXRoIHRoZSBraW5kIHZhbHVlLgorICovCitWQUxVRV9QUk9GX0tJTkQoSVBWS19GaXJzdCwgSVBWS19JbmRpcmVjdENhbGxUYXJnZXQpCitWQUxVRV9QUk9GX0tJTkQoSVBWS19MYXN0LCBJUFZLX01lbU9QU2l6ZSkKKworI3VuZGVmIFZBTFVFX1BST0ZfS0lORAorLyogVkFMVUVfUFJPRl9LSU5EIGVuZCAqLworCisvKiBDT1ZNQVBfRlVOQ19SRUNPUkQgc3RhcnQgKi8KKy8qIERlZmluaXRpb24gb2YgbWVtYmVyIGZpZWxkcyBvZiB0aGUgZnVuY3Rpb24gcmVjb3JkIHN0cnVjdHVyZSBpbiBjb3ZlcmFnZQorICogbWFwLgorICovCisjaWZuZGVmIENPVk1BUF9GVU5DX1JFQ09SRAorI2RlZmluZSBDT1ZNQVBfRlVOQ19SRUNPUkQoVHlwZSwgTExWTVR5cGUsIE5hbWUsIEluaXRpYWxpemVyKQorI2Vsc2UKKyNkZWZpbmUgSU5TVFJfUFJPRl9EQVRBX0RFRklORUQKKyNlbmRpZgorI2lmZGVmIENPVk1BUF9WMQorQ09WTUFQX0ZVTkNfUkVDT1JEKGNvbnN0IEludFB0clQsIGxsdm06OlR5cGU6OmdldEludDhQdHJUeShDdHgpLCBcCisgICAgICAgICAgICAgICAgICAgTmFtZVB0ciwgbGx2bTo6Q29uc3RhbnRFeHByOjpnZXRCaXRDYXN0KE5hbWVQdHIsIFwKKyAgICAgICAgICAgICAgICAgICBsbHZtOjpUeXBlOjpnZXRJbnQ4UHRyVHkoQ3R4KSkpCitDT1ZNQVBfRlVOQ19SRUNPUkQoY29uc3QgdWludDMyX3QsIGxsdm06OlR5cGU6OmdldEludDMyVHkoQ3R4KSwgTmFtZVNpemUsIFwKKyAgICAgICAgICAgICAgICAgICBsbHZtOjpDb25zdGFudEludDo6Z2V0KGxsdm06OlR5cGU6OmdldEludDMyVHkoQ3R4KSwgXAorICAgICAgICAgICAgICAgICAgIE5hbWVWYWx1ZS5zaXplKCkpKQorI2Vsc2UKK0NPVk1BUF9GVU5DX1JFQ09SRChjb25zdCBpbnQ2NF90LCBsbHZtOjpUeXBlOjpnZXRJbnQ2NFR5KEN0eCksIE5hbWVSZWYsIFwKKyAgICAgICAgICAgICAgICAgICBsbHZtOjpDb25zdGFudEludDo6Z2V0KGxsdm06OlR5cGU6OmdldEludDY0VHkoQ3R4KSwgXAorICAgICAgICAgICAgICAgICAgIGxsdm06OkluZGV4ZWRJbnN0clByb2Y6OkNvbXB1dGVIYXNoKE5hbWVWYWx1ZSkpKQorI2VuZGlmCitDT1ZNQVBfRlVOQ19SRUNPUkQoY29uc3QgdWludDMyX3QsIGxsdm06OlR5cGU6OmdldEludDMyVHkoQ3R4KSwgRGF0YVNpemUsIFwKKyAgICAgICAgICAgICAgICAgICBsbHZtOjpDb25zdGFudEludDo6Z2V0KGxsdm06OlR5cGU6OmdldEludDMyVHkoQ3R4KSxcCisgICAgICAgICAgICAgICAgICAgQ292ZXJhZ2VNYXBwaW5nLnNpemUoKSkpCitDT1ZNQVBfRlVOQ19SRUNPUkQoY29uc3QgdWludDY0X3QsIGxsdm06OlR5cGU6OmdldEludDY0VHkoQ3R4KSwgRnVuY0hhc2gsIFwKKyAgICAgICAgICAgICAgICAgICBsbHZtOjpDb25zdGFudEludDo6Z2V0KGxsdm06OlR5cGU6OmdldEludDY0VHkoQ3R4KSwgRnVuY0hhc2gpKQorI3VuZGVmIENPVk1BUF9GVU5DX1JFQ09SRAorLyogQ09WTUFQX0ZVTkNfUkVDT1JEIGVuZC4gICovCisKKy8qIENPVk1BUF9IRUFERVIgc3RhcnQgKi8KKy8qIERlZmluaXRpb24gb2YgbWVtYmVyIGZpZWxkcyBvZiBjb3ZlcmFnZSBtYXAgaGVhZGVyLgorICovCisjaWZuZGVmIENPVk1BUF9IRUFERVIKKyNkZWZpbmUgQ09WTUFQX0hFQURFUihUeXBlLCBMTFZNVHlwZSwgTmFtZSwgSW5pdGlhbGl6ZXIpCisjZWxzZQorI2RlZmluZSBJTlNUUl9QUk9GX0RBVEFfREVGSU5FRAorI2VuZGlmCitDT1ZNQVBfSEVBREVSKHVpbnQzMl90LCBJbnQzMlR5LCBOUmVjb3JkcywgXAorICAgICAgICAgICAgICBsbHZtOjpDb25zdGFudEludDo6Z2V0KEludDMyVHksICBGdW5jdGlvblJlY29yZHMuc2l6ZSgpKSkKK0NPVk1BUF9IRUFERVIodWludDMyX3QsIEludDMyVHksIEZpbGVuYW1lc1NpemUsIFwKKyAgICAgICAgICAgICAgbGx2bTo6Q29uc3RhbnRJbnQ6OmdldChJbnQzMlR5LCBGaWxlbmFtZXNTaXplKSkKK0NPVk1BUF9IRUFERVIodWludDMyX3QsIEludDMyVHksIENvdmVyYWdlU2l6ZSwgXAorICAgICAgICAgICAgICBsbHZtOjpDb25zdGFudEludDo6Z2V0KEludDMyVHksIENvdmVyYWdlTWFwcGluZ1NpemUpKQorQ09WTUFQX0hFQURFUih1aW50MzJfdCwgSW50MzJUeSwgVmVyc2lvbiwgXAorICAgICAgICAgICAgICBsbHZtOjpDb25zdGFudEludDo6Z2V0KEludDMyVHksIENvdk1hcFZlcnNpb246OkN1cnJlbnRWZXJzaW9uKSkKKyN1bmRlZiBDT1ZNQVBfSEVBREVSCisvKiBDT1ZNQVBfSEVBREVSIGVuZC4gICovCisKKworI2lmZGVmIElOU1RSX1BST0ZfU0VDVF9FTlRSWQorI2RlZmluZSBJTlNUUl9QUk9GX0RBVEFfREVGSU5FRAorSU5TVFJfUFJPRl9TRUNUX0VOVFJZKElQU0tfZGF0YSwgXAorICAgICAgICAgICAgICAgICAgICAgIElOU1RSX1BST0ZfUVVPVEUoSU5TVFJfUFJPRl9EQVRBX0NPTU1PTiksIFwKKyAgICAgICAgICAgICAgICAgICAgICBJTlNUUl9QUk9GX1FVT1RFKElOU1RSX1BST0ZfREFUQV9DT0ZGKSwgIl9fREFUQSwiKQorSU5TVFJfUFJPRl9TRUNUX0VOVFJZKElQU0tfY250cywgXAorICAgICAgICAgICAgICAgICAgICAgIElOU1RSX1BST0ZfUVVPVEUoSU5TVFJfUFJPRl9DTlRTX0NPTU1PTiksIFwKKyAgICAgICAgICAgICAgICAgICAgICBJTlNUUl9QUk9GX1FVT1RFKElOU1RSX1BST0ZfQ05UU19DT0ZGKSwgIl9fREFUQSwiKQorSU5TVFJfUFJPRl9TRUNUX0VOVFJZKElQU0tfbmFtZSwgXAorICAgICAgICAgICAgICAgICAgICAgIElOU1RSX1BST0ZfUVVPVEUoSU5TVFJfUFJPRl9OQU1FX0NPTU1PTiksIFwKKyAgICAgICAgICAgICAgICAgICAgICBJTlNUUl9QUk9GX1FVT1RFKElOU1RSX1BST0ZfTkFNRV9DT0ZGKSwgIl9fREFUQSwiKQorSU5TVFJfUFJPRl9TRUNUX0VOVFJZKElQU0tfdmFscywgXAorICAgICAgICAgICAgICAgICAgICAgIElOU1RSX1BST0ZfUVVPVEUoSU5TVFJfUFJPRl9WQUxTX0NPTU1PTiksIFwKKyAgICAgICAgICAgICAgICAgICAgICBJTlNUUl9QUk9GX1FVT1RFKElOU1RSX1BST0ZfVkFMU19DT0ZGKSwgIl9fREFUQSwiKQorSU5TVFJfUFJPRl9TRUNUX0VOVFJZKElQU0tfdm5vZGVzLCBcCisgICAgICAgICAgICAgICAgICAgICAgSU5TVFJfUFJPRl9RVU9URShJTlNUUl9QUk9GX1ZOT0RFU19DT01NT04pLCBcCisgICAgICAgICAgICAgICAgICAgICAgSU5TVFJfUFJPRl9RVU9URShJTlNUUl9QUk9GX1ZOT0RFU19DT0ZGKSwgIl9fREFUQSwiKQorSU5TVFJfUFJPRl9TRUNUX0VOVFJZKElQU0tfY292bWFwLCBcCisgICAgICAgICAgICAgICAgICAgICAgSU5TVFJfUFJPRl9RVU9URShJTlNUUl9QUk9GX0NPVk1BUF9DT01NT04pLCBcCisgICAgICAgICAgICAgICAgICAgICAgSU5TVFJfUFJPRl9RVU9URShJTlNUUl9QUk9GX0NPVk1BUF9DT0ZGKSwgIl9fTExWTV9DT1YsIikKKworI3VuZGVmIElOU1RSX1BST0ZfU0VDVF9FTlRSWQorI2VuZGlmCisKKworI2lmZGVmIElOU1RSX1BST0ZfVkFMVUVfUFJPRl9EQVRBCisjZGVmaW5lIElOU1RSX1BST0ZfREFUQV9ERUZJTkVECisKKyNkZWZpbmUgSU5TVFJfUFJPRl9NQVhfTlVNX1ZBTF9QRVJfU0lURSAyNTUKKy8qIQorICogVGhpcyBpcyB0aGUgaGVhZGVyIG9mIHRoZSBkYXRhIHN0cnVjdHVyZSB0aGF0IGRlZmluZXMgdGhlIG9uLWRpc2sKKyAqIGxheW91dCBvZiB0aGUgdmFsdWUgcHJvZmlsZSBkYXRhIG9mIGEgcGFydGljdWxhciBraW5kIGZvciBvbmUgZnVuY3Rpb24uCisgKi8KK3R5cGVkZWYgc3RydWN0IFZhbHVlUHJvZlJlY29yZCB7CisgIC8qIFRoZSBraW5kIG9mIHRoZSB2YWx1ZSBwcm9maWxlIHJlY29yZC4gKi8KKyAgdWludDMyX3QgS2luZDsKKyAgLyoKKyAgICogVGhlIG51bWJlciBvZiB2YWx1ZSBwcm9maWxlIHNpdGVzLiBJdCBpcyBndWFyYW50ZWVkIHRvIGJlIG5vbi16ZXJvOworICAgKiBvdGhlcndpc2UgdGhlIHJlY29yZCBmb3IgdGhpcyBraW5kIHdvbid0IGJlIGVtaXR0ZWQuCisgICAqLworICB1aW50MzJfdCBOdW1WYWx1ZVNpdGVzOworICAvKgorICAgKiBUaGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgYXJyYXkgdGhhdCBzdG9yZXMgdGhlIG51bWJlciBvZiBwcm9maWxlZAorICAgKiB2YWx1ZXMgZm9yIGVhY2ggdmFsdWUgc2l0ZS4gVGhlIHNpemUgb2YgdGhlIGFycmF5IGlzIE51bVZhbHVlU2l0ZXMuCisgICAqIFNpbmNlIE51bVZhbHVlU2l0ZXMgaXMgZ3JlYXRlciB0aGFuIHplcm8sIHRoZXJlIGlzIGF0IGxlYXN0IG9uZQorICAgKiBlbGVtZW50IGluIHRoZSBhcnJheS4KKyAgICovCisgIHVpbnQ4X3QgU2l0ZUNvdW50QXJyYXlbMV07CisKKyAgLyoKKyAgICogVGhlIGZha2UgZGVjbGFyYXRpb24gaXMgZm9yIGRvY3VtZW50YXRpb24gcHVycG9zZSBvbmx5LgorICAgKiBBbGlnbiB0aGUgc3RhcnQgb2YgbmV4dCBmaWVsZCB0byBiZSBvbiA4IGJ5dGUgYm91bmRhcmllcy4KKyAgdWludDhfdCBQYWRkaW5nW1hdOworICAgKi8KKworICAvKiBUaGUgYXJyYXkgb2YgdmFsdWUgcHJvZmlsZSBkYXRhLiBUaGUgc2l6ZSBvZiB0aGUgYXJyYXkgaXMgdGhlIHN1bQorICAgKiBvZiBhbGwgZWxlbWVudHMgaW4gU2l0ZUNvdW50QXJyYXlbXS4KKyAgSW5zdHJQcm9mVmFsdWVEYXRhIFZhbHVlRGF0YVtdOworICAgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisgIC8qIQorICAgKiBcYnJpZWYgUmV0dXJuIHRoZSBudW1iZXIgb2YgdmFsdWUgc2l0ZXMuCisgICAqLworICB1aW50MzJfdCBnZXROdW1WYWx1ZVNpdGVzKCkgY29uc3QgeyByZXR1cm4gTnVtVmFsdWVTaXRlczsgfQorICAvKiEKKyAgICogXGJyaWVmIFJlYWQgZGF0YSBmcm9tIHRoaXMgcmVjb3JkIGFuZCBzYXZlIGl0IHRvIFJlY29yZC4KKyAgICovCisgIHZvaWQgZGVzZXJpYWxpemVUbyhJbnN0clByb2ZSZWNvcmQgJlJlY29yZCwKKyAgICAgICAgICAgICAgICAgICAgIEluc3RyUHJvZlN5bXRhYiAqU3ltVGFiKTsKKyAgLyoKKyAgICogSW4tcGxhY2UgYnl0ZSBzd2FwOgorICAgKiBEbyBieXRlIHN3YXAgZm9yIHRoaXMgaW5zdGFuY2UuIFxjIE9sZCBpcyB0aGUgb3JpZ2luYWwgb3JkZXIgYmVmb3JlCisgICAqIHRoZSBzd2FwLCBhbmQgXGMgTmV3IGlzIHRoZSBOZXcgYnl0ZSBvcmRlci4KKyAgICovCisgIHZvaWQgc3dhcEJ5dGVzKHN1cHBvcnQ6OmVuZGlhbm5lc3MgT2xkLCBzdXBwb3J0OjplbmRpYW5uZXNzIE5ldyk7CisjZW5kaWYKK30gVmFsdWVQcm9mUmVjb3JkOworCisvKiEKKyAqIFBlci1mdW5jdGlvbiBoZWFkZXIvY29udHJvbCBkYXRhIHN0cnVjdHVyZSBmb3IgdmFsdWUgcHJvZmlsaW5nCisgKiBkYXRhIGluIGluZGV4ZWQgZm9ybWF0LgorICovCit0eXBlZGVmIHN0cnVjdCBWYWx1ZVByb2ZEYXRhIHsKKyAgLyoKKyAgICogVG90YWwgc2l6ZSBpbiBieXRlcyBpbmNsdWRpbmcgdGhpcyBmaWVsZC4gSXQgbXVzdCBiZSBhIG11bHRpcGxlCisgICAqIG9mIHNpemVvZih1aW50NjRfdCkuCisgICAqLworICB1aW50MzJfdCBUb3RhbFNpemU7CisgIC8qCisgICAqVGhlIG51bWJlciBvZiB2YWx1ZSBwcm9maWxlIGtpbmRzIHRoYXQgaGFzIHZhbHVlIHByb2ZpbGUgZGF0YS4KKyAgICogSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiwgYSB2YWx1ZSBwcm9maWxlIGtpbmQgaXMgY29uc2lkZXJlZCB0bworICAgKiBoYXZlIHByb2ZpbGUgZGF0YSBpZiB0aGUgbnVtYmVyIG9mIHZhbHVlIHByb2ZpbGUgc2l0ZXMgZm9yIHRoZQorICAgKiBraW5kIGlzIG5vdCB6ZXJvLiBNb3JlIGFnZ3Jlc3NpdmVseSwgdGhlIGltcGxlbWVudGF0aW9uIGNhbgorICAgKiBjaG9vc2UgdG8gY2hlY2sgdGhlIGFjdHVhbCBkYXRhIHZhbHVlOiBpZiBub25lIG9mIHRoZSB2YWx1ZSBzaXRlcworICAgKiBoYXMgYW55IHByb2ZpbGVkIHZhbHVlcywgdGhlIGtpbmQgY2FuIGJlIHNraXBwZWQuCisgICAqLworICB1aW50MzJfdCBOdW1WYWx1ZUtpbmRzOworCisgIC8qCisgICAqIEZvbGxvd2luZyBhcmUgYSBzZXF1ZW5jZSBvZiB2YXJpYWJsZSBsZW5ndGggcmVjb3Jkcy4gVGhlIHByZWZpeC9oZWFkZXIKKyAgICogb2YgZWFjaCByZWNvcmQgaXMgZGVmaW5lZCBieSBWYWx1ZVByb2ZSZWNvcmQgdHlwZS4gVGhlIG51bWJlciBvZgorICAgKiByZWNvcmRzIGlzIE51bVZhbHVlS2luZHMuCisgICAqIFZhbHVlUHJvZlJlY29yZCBSZWNvcmRfMTsKKyAgICogVmFsdWVQcm9mUmVjb3JkIFJlY29yZF9OOworICAgKi8KKworI2lmIF9fY3BsdXNwbHVzCisgIC8qIQorICAgKiBSZXR1cm4gdGhlIHRvdGFsIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG9uLWRpc2sgdmFsdWUgcHJvZmlsZSBkYXRhCisgICAqIGdpdmVuIHRoZSBkYXRhIHN0b3JlZCBpbiBSZWNvcmQuCisgICAqLworICBzdGF0aWMgdWludDMyX3QgZ2V0U2l6ZShjb25zdCBJbnN0clByb2ZSZWNvcmQgJlJlY29yZCk7CisgIC8qIQorICAgKiBSZXR1cm4gYSBwb2ludGVyIHRvIFxjIFZhbHVlUHJvZkRhdGEgaW5zdGFuY2UgcmVhZHkgdG8gYmUgc3RyZWFtZWQuCisgICAqLworICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFZhbHVlUHJvZkRhdGE+CisgIHNlcmlhbGl6ZUZyb20oY29uc3QgSW5zdHJQcm9mUmVjb3JkICZSZWNvcmQpOworICAvKiEKKyAgICogQ2hlY2sgdGhlIGludGVncml0eSBvZiB0aGUgcmVjb3JkLgorICAgKi8KKyAgRXJyb3IgY2hlY2tJbnRlZ3JpdHkoKTsKKyAgLyohCisgICAqIFJldHVybiBhIHBvaW50ZXIgdG8gXGMgVmFsdWVQcm9maWxlRGF0YSBpbnN0YW5jZSByZWFkeSB0byBiZSByZWFkLgorICAgKiBBbGwgZGF0YSBpbiB0aGUgaW5zdGFuY2UgYXJlIHByb3Blcmx5IGJ5dGUgc3dhcHBlZC4gVGhlIGlucHV0CisgICAqIGRhdGEgaXMgYXNzdW1lZCB0byBiZSBpbiBsaXR0bGUgZW5kaWFuIG9yZGVyLgorICAgKi8KKyAgc3RhdGljIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxWYWx1ZVByb2ZEYXRhPj4KKyAgZ2V0VmFsdWVQcm9mRGF0YShjb25zdCB1bnNpZ25lZCBjaGFyICpTcmNCdWZmZXIsCisgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqY29uc3QgU3JjQnVmZmVyRW5kLAorICAgICAgICAgICAgICAgICAgIHN1cHBvcnQ6OmVuZGlhbm5lc3MgU3JjRGF0YUVuZGlhbm5lc3MpOworICAvKiEKKyAgICogU3dhcCBieXRlIG9yZGVyIGZyb20gXGMgRW5kaWFubmVzcyBvcmRlciB0byBob3N0IGJ5dGUgb3JkZXIuCisgICAqLworICB2b2lkIHN3YXBCeXRlc1RvSG9zdChzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbm5lc3MpOworICAvKiEKKyAgICogU3dhcCBieXRlIG9yZGVyIGZyb20gaG9zdCBieXRlIG9yZGVyIHRvIFxjIEVuZGlhbm5lc3Mgb3JkZXIuCisgICAqLworICB2b2lkIHN3YXBCeXRlc0Zyb21Ib3N0KHN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFubmVzcyk7CisgIC8qIQorICAgKiBSZXR1cm4gdGhlIHRvdGFsIHNpemUgb2YgXGMgVmFsdWVQcm9maWxlRGF0YS4KKyAgICovCisgIHVpbnQzMl90IGdldFNpemUoKSBjb25zdCB7IHJldHVybiBUb3RhbFNpemU7IH0KKyAgLyohCisgICAqIFJlYWQgZGF0YSBmcm9tIHRoaXMgZGF0YSBhbmQgc2F2ZSBpdCB0byBcYyBSZWNvcmQuCisgICAqLworICB2b2lkIGRlc2VyaWFsaXplVG8oSW5zdHJQcm9mUmVjb3JkICZSZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICBJbnN0clByb2ZTeW10YWIgKlN5bVRhYik7CisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKnB0cikgeyA6Om9wZXJhdG9yIGRlbGV0ZShwdHIpOyB9CisjZW5kaWYKK30gVmFsdWVQcm9mRGF0YTsKKworLyoKKyAqIFRoZSBjbG9zdXJlIGlzIGRlc2lnbmVkIHRvIGFic3RhY3QgYXdheSB0d28gdHlwZXMgb2YgdmFsdWUgcHJvZmlsZSBkYXRhOgorICogLSBJbnN0clByb2ZSZWNvcmQgd2hpY2ggaXMgdGhlIHByaW1hcnkgZGF0YSBzdHJ1Y3R1cmUgdXNlZCB0bworICogICByZXByZXNlbnQgcHJvZmlsZSBkYXRhIGluIGhvc3QgdG9vbHMgKHJlYWRlciwgd3JpdGVyLCBhbmQgcHJvZmlsZS11c2UpCisgKiAtIHZhbHVlIHByb2ZpbGUgcnVudGltZSBkYXRhIHN0cnVjdHVyZSBzdWl0YWJsZSB0byBiZSB1c2VkIGJ5IEMKKyAqICAgcnVudGltZSBsaWJyYXJ5LgorICoKKyAqIEJvdGggc291cmNlcyBvZiBkYXRhIG5lZWQgdG8gc2VyaWFsaXplIHRvIGRpc2svbWVtb3J5LWJ1ZmZlciBpbiBjb21tb24KKyAqIGZvcm1hdDogVmFsdWVQcm9mRGF0YS4gVGhlIGFic3RyYWN0aW9uIGFsbG93cyBjb21waWxlci1ydCdzIHJhdyBwcm9maWxlcgorICogd3JpdGVyIHRvIHNoYXJlIHRoZSBzYW1lIGZvcm1hdCBhbmQgY29kZSB3aXRoIGluZGV4ZWQgcHJvZmlsZSB3cml0ZXIuCisgKgorICogRm9yIGRvY3VtZW50YXRpb24gb2YgdGhlIG1lbWJlciBtZXRob2RzIGJlbG93LCByZWZlciB0byBjb3JyZXNwb25kaW5nIG1ldGhvZHMKKyAqIGluIGNsYXNzIEluc3RyUHJvZlJlY29yZC4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgVmFsdWVQcm9mUmVjb3JkQ2xvc3VyZSB7CisgIGNvbnN0IHZvaWQgKlJlY29yZDsKKyAgdWludDMyX3QgKCpHZXROdW1WYWx1ZUtpbmRzKShjb25zdCB2b2lkICpSZWNvcmQpOworICB1aW50MzJfdCAoKkdldE51bVZhbHVlU2l0ZXMpKGNvbnN0IHZvaWQgKlJlY29yZCwgdWludDMyX3QgVktpbmQpOworICB1aW50MzJfdCAoKkdldE51bVZhbHVlRGF0YSkoY29uc3Qgdm9pZCAqUmVjb3JkLCB1aW50MzJfdCBWS2luZCk7CisgIHVpbnQzMl90ICgqR2V0TnVtVmFsdWVEYXRhRm9yU2l0ZSkoY29uc3Qgdm9pZCAqUiwgdWludDMyX3QgVkssIHVpbnQzMl90IFMpOworCisgIC8qCisgICAqIEFmdGVyIGV4dHJhY3RpbmcgdGhlIHZhbHVlIHByb2ZpbGUgZGF0YSBmcm9tIHRoZSB2YWx1ZSBwcm9maWxlIHJlY29yZCwKKyAgICogdGhpcyBtZXRob2QgaXMgdXNlZCB0byBtYXAgdGhlIGluLW1lbW9yeSB2YWx1ZSB0byBvbi1kaXNrIHZhbHVlLiBJZgorICAgKiB0aGUgbWV0aG9kIGlzIG51bGwsIHZhbHVlIHdpbGwgYmUgd3JpdHRlbiBvdXQgdW50cmFuc2xhdGVkLgorICAgKi8KKyAgdWludDY0X3QgKCpSZW1hcFZhbHVlRGF0YSkodWludDMyX3QsIHVpbnQ2NF90IFZhbHVlKTsKKyAgdm9pZCAoKkdldFZhbHVlRm9yU2l0ZSkoY29uc3Qgdm9pZCAqUiwgSW5zdHJQcm9mVmFsdWVEYXRhICpEc3QsIHVpbnQzMl90IEssCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFMpOworICBWYWx1ZVByb2ZEYXRhICooKkFsbG9jVmFsdWVQcm9mRGF0YSkoc2l6ZV90IFRvdGFsU2l6ZUluQnl0ZXMpOworfSBWYWx1ZVByb2ZSZWNvcmRDbG9zdXJlOworCitJTlNUUl9QUk9GX1ZJU0lCSUxJVFkgVmFsdWVQcm9mUmVjb3JkICoKK2dldEZpcnN0VmFsdWVQcm9mUmVjb3JkKFZhbHVlUHJvZkRhdGEgKlZQRCk7CitJTlNUUl9QUk9GX1ZJU0lCSUxJVFkgVmFsdWVQcm9mUmVjb3JkICoKK2dldFZhbHVlUHJvZlJlY29yZE5leHQoVmFsdWVQcm9mUmVjb3JkICpWUFIpOworSU5TVFJfUFJPRl9WSVNJQklMSVRZIEluc3RyUHJvZlZhbHVlRGF0YSAqCitnZXRWYWx1ZVByb2ZSZWNvcmRWYWx1ZURhdGEoVmFsdWVQcm9mUmVjb3JkICpWUFIpOworSU5TVFJfUFJPRl9WSVNJQklMSVRZIHVpbnQzMl90CitnZXRWYWx1ZVByb2ZSZWNvcmRIZWFkZXJTaXplKHVpbnQzMl90IE51bVZhbHVlU2l0ZXMpOworCisjdW5kZWYgSU5TVFJfUFJPRl9WQUxVRV9QUk9GX0RBVEEKKyNlbmRpZiAgLyogSU5TVFJfUFJPRl9WQUxVRV9QUk9GX0RBVEEgKi8KKworCisjaWZkZWYgSU5TVFJfUFJPRl9DT01NT05fQVBJX0lNUEwKKyNkZWZpbmUgSU5TVFJfUFJPRl9EQVRBX0RFRklORUQKKyNpZmRlZiBfX2NwbHVzcGx1cworI2RlZmluZSBJTlNUUl9QUk9GX0lOTElORSBpbmxpbmUKKyNkZWZpbmUgSU5TVFJfUFJPRl9OVUxMUFRSIG51bGxwdHIKKyNlbHNlCisjZGVmaW5lIElOU1RSX1BST0ZfSU5MSU5FCisjZGVmaW5lIElOU1RSX1BST0ZfTlVMTFBUUiBOVUxMCisjZW5kaWYKKworI2lmbmRlZiBvZmZzZXRvZgorI2RlZmluZSBvZmZzZXRvZihUWVBFLCBNRU1CRVIpICgoc2l6ZV90KSAmKChUWVBFICopMCktPk1FTUJFUikKKyNlbmRpZgorCisvKiEKKyAqIFxicmllZiBSZXR1cm4gdGhlIFxjIFZhbHVlUHJvZlJlY29yZCBoZWFkZXIgc2l6ZSBpbmNsdWRpbmcgdGhlCisgKiBwYWRkaW5nIGJ5dGVzLgorICovCitJTlNUUl9QUk9GX1ZJU0lCSUxJVFkgSU5TVFJfUFJPRl9JTkxJTkUKK3VpbnQzMl90IGdldFZhbHVlUHJvZlJlY29yZEhlYWRlclNpemUodWludDMyX3QgTnVtVmFsdWVTaXRlcykgeworICB1aW50MzJfdCBTaXplID0gb2Zmc2V0b2YoVmFsdWVQcm9mUmVjb3JkLCBTaXRlQ291bnRBcnJheSkgKworICAgICAgICAgICAgICAgICAgc2l6ZW9mKHVpbnQ4X3QpICogTnVtVmFsdWVTaXRlczsKKyAgLyogUm91bmQgdGhlIHNpemUgdG8gbXVsdGlwbGUgb2YgOCBieXRlcy4gKi8KKyAgU2l6ZSA9IChTaXplICsgNykgJiB+NzsKKyAgcmV0dXJuIFNpemU7Cit9CisKKy8qIQorICogXGJyaWVmIFJldHVybiB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgdmFsdWUgcHJvZmlsZSByZWNvcmQgaW5jbHVkaW5nIHRoZQorICogaGVhZGVyIGFuZCB0aGUgdmFsdWUgZGF0YS4KKyAqLworSU5TVFJfUFJPRl9WSVNJQklMSVRZIElOU1RSX1BST0ZfSU5MSU5FCit1aW50MzJfdCBnZXRWYWx1ZVByb2ZSZWNvcmRTaXplKHVpbnQzMl90IE51bVZhbHVlU2l0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE51bVZhbHVlRGF0YSkgeworICByZXR1cm4gZ2V0VmFsdWVQcm9mUmVjb3JkSGVhZGVyU2l6ZShOdW1WYWx1ZVNpdGVzKSArCisgICAgICAgICBzaXplb2YoSW5zdHJQcm9mVmFsdWVEYXRhKSAqIE51bVZhbHVlRGF0YTsKK30KKworLyohCisgKiBcYnJpZWYgUmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSBzdGFydCBvZiB2YWx1ZSBkYXRhIGFycmF5LgorICovCitJTlNUUl9QUk9GX1ZJU0lCSUxJVFkgSU5TVFJfUFJPRl9JTkxJTkUKK0luc3RyUHJvZlZhbHVlRGF0YSAqZ2V0VmFsdWVQcm9mUmVjb3JkVmFsdWVEYXRhKFZhbHVlUHJvZlJlY29yZCAqVGhpcykgeworICByZXR1cm4gKEluc3RyUHJvZlZhbHVlRGF0YSAqKSgoY2hhciAqKVRoaXMgKyBnZXRWYWx1ZVByb2ZSZWNvcmRIZWFkZXJTaXplKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcy0+TnVtVmFsdWVTaXRlcykpOworfQorCisvKiEKKyAqIFxicmllZiBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiB2YWx1ZSBkYXRhIGZvciBcYyBUaGlzIHJlY29yZC4KKyAqLworSU5TVFJfUFJPRl9WSVNJQklMSVRZIElOU1RSX1BST0ZfSU5MSU5FCit1aW50MzJfdCBnZXRWYWx1ZVByb2ZSZWNvcmROdW1WYWx1ZURhdGEoVmFsdWVQcm9mUmVjb3JkICpUaGlzKSB7CisgIHVpbnQzMl90IE51bVZhbHVlRGF0YSA9IDA7CisgIHVpbnQzMl90IEk7CisgIGZvciAoSSA9IDA7IEkgPCBUaGlzLT5OdW1WYWx1ZVNpdGVzOyBJKyspCisgICAgTnVtVmFsdWVEYXRhICs9IFRoaXMtPlNpdGVDb3VudEFycmF5W0ldOworICByZXR1cm4gTnVtVmFsdWVEYXRhOworfQorCisvKiEKKyAqIFxicmllZiBVc2UgdGhpcyBtZXRob2QgdG8gYWR2YW5jZSB0byB0aGUgbmV4dCBcYyBUaGlzIFxjIFZhbHVlUHJvZlJlY29yZC4KKyAqLworSU5TVFJfUFJPRl9WSVNJQklMSVRZIElOU1RSX1BST0ZfSU5MSU5FCitWYWx1ZVByb2ZSZWNvcmQgKmdldFZhbHVlUHJvZlJlY29yZE5leHQoVmFsdWVQcm9mUmVjb3JkICpUaGlzKSB7CisgIHVpbnQzMl90IE51bVZhbHVlRGF0YSA9IGdldFZhbHVlUHJvZlJlY29yZE51bVZhbHVlRGF0YShUaGlzKTsKKyAgcmV0dXJuIChWYWx1ZVByb2ZSZWNvcmQgKikoKGNoYXIgKilUaGlzICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VmFsdWVQcm9mUmVjb3JkU2l6ZShUaGlzLT5OdW1WYWx1ZVNpdGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bVZhbHVlRGF0YSkpOworfQorCisvKiEKKyAqIFxicmllZiBSZXR1cm4gdGhlIGZpcnN0IFxjIFZhbHVlUHJvZlJlY29yZCBpbnN0YW5jZS4KKyAqLworSU5TVFJfUFJPRl9WSVNJQklMSVRZIElOU1RSX1BST0ZfSU5MSU5FCitWYWx1ZVByb2ZSZWNvcmQgKmdldEZpcnN0VmFsdWVQcm9mUmVjb3JkKFZhbHVlUHJvZkRhdGEgKlRoaXMpIHsKKyAgcmV0dXJuIChWYWx1ZVByb2ZSZWNvcmQgKikoKGNoYXIgKilUaGlzICsgc2l6ZW9mKFZhbHVlUHJvZkRhdGEpKTsKK30KKworLyogQ2xvc3VyZSBiYXNlZCBpbnRlcmZhY2VzLiAgKi8KKworLyohCisgKiBSZXR1cm4gdGhlIHRvdGFsIHNpemUgaW4gYnl0ZXMgb2YgdGhlIG9uLWRpc2sgdmFsdWUgcHJvZmlsZSBkYXRhCisgKiBnaXZlbiB0aGUgZGF0YSBzdG9yZWQgaW4gUmVjb3JkLgorICovCitJTlNUUl9QUk9GX1ZJU0lCSUxJVFkgdWludDMyX3QKK2dldFZhbHVlUHJvZkRhdGFTaXplKFZhbHVlUHJvZlJlY29yZENsb3N1cmUgKkNsb3N1cmUpIHsKKyAgdWludDMyX3QgS2luZDsKKyAgdWludDMyX3QgVG90YWxTaXplID0gc2l6ZW9mKFZhbHVlUHJvZkRhdGEpOworICBjb25zdCB2b2lkICpSZWNvcmQgPSBDbG9zdXJlLT5SZWNvcmQ7CisKKyAgZm9yIChLaW5kID0gSVBWS19GaXJzdDsgS2luZCA8PSBJUFZLX0xhc3Q7IEtpbmQrKykgeworICAgIHVpbnQzMl90IE51bVZhbHVlU2l0ZXMgPSBDbG9zdXJlLT5HZXROdW1WYWx1ZVNpdGVzKFJlY29yZCwgS2luZCk7CisgICAgaWYgKCFOdW1WYWx1ZVNpdGVzKQorICAgICAgY29udGludWU7CisgICAgVG90YWxTaXplICs9IGdldFZhbHVlUHJvZlJlY29yZFNpemUoTnVtVmFsdWVTaXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbG9zdXJlLT5HZXROdW1WYWx1ZURhdGEoUmVjb3JkLCBLaW5kKSk7CisgIH0KKyAgcmV0dXJuIFRvdGFsU2l6ZTsKK30KKworLyohCisgKiBFeHRyYWN0IHZhbHVlIHByb2ZpbGUgZGF0YSBvZiBhIGZ1bmN0aW9uIGZvciB0aGUgcHJvZmlsZSBraW5kIFxjIFZhbHVlS2luZAorICogZnJvbSB0aGUgXGMgQ2xvc3VyZSBhbmQgc2VyaWFsaXplIHRoZSBkYXRhIGludG8gXGMgVGhpcyByZWNvcmQgaW5zdGFuY2UuCisgKi8KK0lOU1RSX1BST0ZfVklTSUJJTElUWSB2b2lkCitzZXJpYWxpemVWYWx1ZVByb2ZSZWNvcmRGcm9tKFZhbHVlUHJvZlJlY29yZCAqVGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVQcm9mUmVjb3JkQ2xvc3VyZSAqQ2xvc3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVmFsdWVLaW5kLCB1aW50MzJfdCBOdW1WYWx1ZVNpdGVzKSB7CisgIHVpbnQzMl90IFM7CisgIGNvbnN0IHZvaWQgKlJlY29yZCA9IENsb3N1cmUtPlJlY29yZDsKKyAgVGhpcy0+S2luZCA9IFZhbHVlS2luZDsKKyAgVGhpcy0+TnVtVmFsdWVTaXRlcyA9IE51bVZhbHVlU2l0ZXM7CisgIEluc3RyUHJvZlZhbHVlRGF0YSAqRHN0VkQgPSBnZXRWYWx1ZVByb2ZSZWNvcmRWYWx1ZURhdGEoVGhpcyk7CisKKyAgZm9yIChTID0gMDsgUyA8IE51bVZhbHVlU2l0ZXM7IFMrKykgeworICAgIHVpbnQzMl90IE5EID0gQ2xvc3VyZS0+R2V0TnVtVmFsdWVEYXRhRm9yU2l0ZShSZWNvcmQsIFZhbHVlS2luZCwgUyk7CisgICAgVGhpcy0+U2l0ZUNvdW50QXJyYXlbU10gPSBORDsKKyAgICBDbG9zdXJlLT5HZXRWYWx1ZUZvclNpdGUoUmVjb3JkLCBEc3RWRCwgVmFsdWVLaW5kLCBTKTsKKyAgICBEc3RWRCArPSBORDsKKyAgfQorfQorCisvKiEKKyAqIEV4dHJhY3QgdmFsdWUgcHJvZmlsZSBkYXRhIG9mIGEgZnVuY3Rpb24gIGZyb20gdGhlIFxjIENsb3N1cmUKKyAqIGFuZCBzZXJpYWxpemUgdGhlIGRhdGEgaW50byBcYyBEc3REYXRhIGlmIGl0IGlzIG5vdCBOVUxMIG9yIGhlYXAKKyAqIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhlIFxjIENsb3N1cmUncyBhbGxvY2F0b3IgbWV0aG9kLiBJZiBcYworICogRHN0RGF0YSBpcyBub3QgbnVsbCwgdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBzZXQgdGhlIFRvdGFsU2l6ZQorICogaW4gRHN0RGF0YS4KKyAqLworSU5TVFJfUFJPRl9WSVNJQklMSVRZIFZhbHVlUHJvZkRhdGEgKgorc2VyaWFsaXplVmFsdWVQcm9mRGF0YUZyb20oVmFsdWVQcm9mUmVjb3JkQ2xvc3VyZSAqQ2xvc3VyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlUHJvZkRhdGEgKkRzdERhdGEpIHsKKyAgdWludDMyX3QgS2luZDsKKyAgdWludDMyX3QgVG90YWxTaXplID0KKyAgICAgIERzdERhdGEgPyBEc3REYXRhLT5Ub3RhbFNpemUgOiBnZXRWYWx1ZVByb2ZEYXRhU2l6ZShDbG9zdXJlKTsKKworICBWYWx1ZVByb2ZEYXRhICpWUEQgPQorICAgICAgRHN0RGF0YSA/IERzdERhdGEgOiBDbG9zdXJlLT5BbGxvY1ZhbHVlUHJvZkRhdGEoVG90YWxTaXplKTsKKworICBWUEQtPlRvdGFsU2l6ZSA9IFRvdGFsU2l6ZTsKKyAgVlBELT5OdW1WYWx1ZUtpbmRzID0gQ2xvc3VyZS0+R2V0TnVtVmFsdWVLaW5kcyhDbG9zdXJlLT5SZWNvcmQpOworICBWYWx1ZVByb2ZSZWNvcmQgKlZSID0gZ2V0Rmlyc3RWYWx1ZVByb2ZSZWNvcmQoVlBEKTsKKyAgZm9yIChLaW5kID0gSVBWS19GaXJzdDsgS2luZCA8PSBJUFZLX0xhc3Q7IEtpbmQrKykgeworICAgIHVpbnQzMl90IE51bVZhbHVlU2l0ZXMgPSBDbG9zdXJlLT5HZXROdW1WYWx1ZVNpdGVzKENsb3N1cmUtPlJlY29yZCwgS2luZCk7CisgICAgaWYgKCFOdW1WYWx1ZVNpdGVzKQorICAgICAgY29udGludWU7CisgICAgc2VyaWFsaXplVmFsdWVQcm9mUmVjb3JkRnJvbShWUiwgQ2xvc3VyZSwgS2luZCwgTnVtVmFsdWVTaXRlcyk7CisgICAgVlIgPSBnZXRWYWx1ZVByb2ZSZWNvcmROZXh0KFZSKTsKKyAgfQorICByZXR1cm4gVlBEOworfQorCisjdW5kZWYgSU5TVFJfUFJPRl9DT01NT05fQVBJX0lNUEwKKyNlbmRpZiAvKiBJTlNUUl9QUk9GX0NPTU1PTl9BUElfSU1QTCAqLworCisvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qLworCisjaWZuZGVmIElOU1RSX1BST0ZfREFUQV9ERUZJTkVECisKKyNpZm5kZWYgSU5TVFJfUFJPRl9EQVRBX0lOQworI2RlZmluZSBJTlNUUl9QUk9GX0RBVEFfSU5DCisKKy8qIEhlbHBlciBtYWNyb3MuICAqLworI2RlZmluZSBJTlNUUl9QUk9GX1NJTVBMRV9RVU9URSh4KSAjeAorI2RlZmluZSBJTlNUUl9QUk9GX1FVT1RFKHgpIElOU1RSX1BST0ZfU0lNUExFX1FVT1RFKHgpCisjZGVmaW5lIElOU1RSX1BST0ZfU0lNUExFX0NPTkNBVCh4LHkpIHggIyMgeQorI2RlZmluZSBJTlNUUl9QUk9GX0NPTkNBVCh4LHkpIElOU1RSX1BST0ZfU0lNUExFX0NPTkNBVCh4LHkpCisKKy8qIE1hZ2ljIG51bWJlciB0byBkZXRlY3QgZmlsZSBmb3JtYXQgYW5kIGVuZGlhbm5lc3MuCisgKiBVc2UgMjU1IGF0IG9uZSBlbmQsIHNpbmNlIG5vIFVURi04IGZpbGUgY2FuIHVzZSB0aGF0IGNoYXJhY3Rlci4gIEF2b2lkIDAsCisgKiBzbyB0aGF0IHV0aWxpdGllcywgbGlrZSBzdHJpbmdzLCBkb24ndCBncmFiIGl0IGFzIGEgc3RyaW5nLiAgMTI5IGlzIGFsc28KKyAqIGludmFsaWQgVVRGLTgsIGFuZCBoaWdoIGVub3VnaCB0byBiZSBpbnRlcmVzdGluZy4KKyAqIFVzZSAibHByb2ZyIiBpbiB0aGUgY2VudHJlIHRvIHN0YW5kIGZvciAiTExWTSBQcm9maWxlIFJhdyIsIG9yICJscHJvZlIiCisgKiBmb3IgMzItYml0IHBsYXRmb3Jtcy4KKyAqLworI2RlZmluZSBJTlNUUl9QUk9GX1JBV19NQUdJQ182NCAodWludDY0X3QpMjU1IDw8IDU2IHwgKHVpbnQ2NF90KSdsJyA8PCA0OCB8IFwKKyAgICAgICAodWludDY0X3QpJ3AnIDw8IDQwIHwgKHVpbnQ2NF90KSdyJyA8PCAzMiB8ICh1aW50NjRfdCknbycgPDwgMjQgfCAgXAorICAgICAgICAodWludDY0X3QpJ2YnIDw8IDE2IHwgKHVpbnQ2NF90KSdyJyA8PCA4IHwgKHVpbnQ2NF90KTEyOQorI2RlZmluZSBJTlNUUl9QUk9GX1JBV19NQUdJQ18zMiAodWludDY0X3QpMjU1IDw8IDU2IHwgKHVpbnQ2NF90KSdsJyA8PCA0OCB8IFwKKyAgICAgICAodWludDY0X3QpJ3AnIDw8IDQwIHwgKHVpbnQ2NF90KSdyJyA8PCAzMiB8ICh1aW50NjRfdCknbycgPDwgMjQgfCAgXAorICAgICAgICAodWludDY0X3QpJ2YnIDw8IDE2IHwgKHVpbnQ2NF90KSdSJyA8PCA4IHwgKHVpbnQ2NF90KTEyOQorCisvKiBSYXcgcHJvZmlsZSBmb3JtYXQgdmVyc2lvbiAoc3RhcnQgZnJvbSAxKS4gKi8KKyNkZWZpbmUgSU5TVFJfUFJPRl9SQVdfVkVSU0lPTiA0CisvKiBJbmRleGVkIHByb2ZpbGUgZm9ybWF0IHZlcnNpb24gKHN0YXJ0IGZyb20gMSkuICovCisjZGVmaW5lIElOU1RSX1BST0ZfSU5ERVhfVkVSU0lPTiA1CisvKiBDb3ZlcmFnZSBtYXBwaW5nIGZvcm1hdCB2cmVzaW9uIChzdGFydCBmcm9tIDApLiAqLworI2RlZmluZSBJTlNUUl9QUk9GX0NPVk1BUF9WRVJTSU9OIDIKKworLyogUHJvZmlsZSB2ZXJzaW9uIGlzIGFsd2F5cyBvZiB0eXBlIHVpbnQ2NF90LiBSZXNlcnZlIHRoZSB1cHBlciA4IGJpdHMgaW4gdGhlCisgKiB2ZXJzaW9uIGZvciBvdGhlciB2YXJpYW50cyBvZiBwcm9maWxlLiBXZSBzZXQgdGhlIGxvd2VzdCBiaXQgb2YgdGhlIHVwcGVyIDgKKyAqIGJpdHMgKGkuZS4gYml0IDU2KSB0byAxIHRvIGluZGljYXRlIGlmIHRoaXMgaXMgYW4gSVItbGV2ZWwgaW5zdHJ1bWVudGFpdG9uCisgKiBnZW5lcmF0ZWQgcHJvZmlsZSwgYW5kIDAgaWYgdGhpcyBpcyBhIENsYW5nIEZFIGdlbmVyYXRlZCBwcm9maWxlLgorICovCisjZGVmaW5lIFZBUklBTlRfTUFTS1NfQUxMIDB4ZmYwMDAwMDAwMDAwMDAwMFVMTAorI2RlZmluZSBHRVRfVkVSU0lPTihWKSAoKFYpICYgflZBUklBTlRfTUFTS1NfQUxMKQorI2RlZmluZSBWQVJJQU5UX01BU0tfSVJfUFJPRiAoMHgxVUxMIDw8IDU2KQorI2RlZmluZSBJTlNUUl9QUk9GX1JBV19WRVJTSU9OX1ZBUiBfX2xsdm1fcHJvZmlsZV9yYXdfdmVyc2lvbgorI2RlZmluZSBJTlNUUl9QUk9GX1BST0ZJTEVfUlVOVElNRV9WQVIgX19sbHZtX3Byb2ZpbGVfcnVudGltZQorCisvKiBUaGUgdmFyaWFibGUgdGhhdCBob2xkcyB0aGUgbmFtZSBvZiB0aGUgcHJvZmlsZSBkYXRhCisgKiBzcGVjaWZpZWQgdmlhIGNvbW1hbmQgbGluZS4gKi8KKyNkZWZpbmUgSU5TVFJfUFJPRl9QUk9GSUxFX05BTUVfVkFSIF9fbGx2bV9wcm9maWxlX2ZpbGVuYW1lCisKKy8qIHNlY3Rpb24gbmFtZSBzdHJpbmdzIGNvbW1vbiB0byBhbGwgdGFyZ2V0cyBvdGhlcgorICAgdGhhbiBXSU4zMiAqLworI2RlZmluZSBJTlNUUl9QUk9GX0RBVEFfQ09NTU9OIF9fbGx2bV9wcmZfZGF0YQorI2RlZmluZSBJTlNUUl9QUk9GX05BTUVfQ09NTU9OIF9fbGx2bV9wcmZfbmFtZXMKKyNkZWZpbmUgSU5TVFJfUFJPRl9DTlRTX0NPTU1PTiBfX2xsdm1fcHJmX2NudHMKKyNkZWZpbmUgSU5TVFJfUFJPRl9WQUxTX0NPTU1PTiBfX2xsdm1fcHJmX3ZhbHMKKyNkZWZpbmUgSU5TVFJfUFJPRl9WTk9ERVNfQ09NTU9OIF9fbGx2bV9wcmZfdm5kcworI2RlZmluZSBJTlNUUl9QUk9GX0NPVk1BUF9DT01NT04gX19sbHZtX2Nvdm1hcAorLyogV2luMzIgKi8KKyNkZWZpbmUgSU5TVFJfUFJPRl9EQVRBX0NPRkYgLmxwcmZkCisjZGVmaW5lIElOU1RSX1BST0ZfTkFNRV9DT0ZGIC5scHJmbgorI2RlZmluZSBJTlNUUl9QUk9GX0NOVFNfQ09GRiAubHByZmMKKyNkZWZpbmUgSU5TVFJfUFJPRl9WQUxTX0NPRkYgLmxwcmZ2CisjZGVmaW5lIElOU1RSX1BST0ZfVk5PREVTX0NPRkYgLmxwcmZuZAorI2RlZmluZSBJTlNUUl9QUk9GX0NPVk1BUF9DT0ZGIC5sY292bWFwCisKKyNpZmRlZiBfV0lOMzIKKy8qIFJ1bnRpbWUgc2VjdGlvbiBuYW1lcyBhbmQgbmFtZSBzdHJpbmdzLiAgKi8KKyNkZWZpbmUgSU5TVFJfUFJPRl9EQVRBX1NFQ1RfTkFNRSBJTlNUUl9QUk9GX0RBVEFfQ09GRgorI2RlZmluZSBJTlNUUl9QUk9GX05BTUVfU0VDVF9OQU1FIElOU1RSX1BST0ZfTkFNRV9DT0ZGCisjZGVmaW5lIElOU1RSX1BST0ZfQ05UU19TRUNUX05BTUUgSU5TVFJfUFJPRl9DTlRTX0NPRkYKKy8qIEFycmF5IG9mIHBvaW50ZXJzLiBFYWNoIHBvaW50ZXIgcG9pbnRzIHRvIGEgbGlzdAorICogb2YgdmFsdWUgbm9kZXMgYXNzb2NpYXRlZCB3aXRoIG9uZSB2YWx1ZSBzaXRlLgorICovCisjZGVmaW5lIElOU1RSX1BST0ZfVkFMU19TRUNUX05BTUUgSU5TVFJfUFJPRl9WQUxTX0NPRkYKKy8qIFZhbHVlIHByb2ZpbGUgbm9kZXMgc2VjdGlvbi4gKi8KKyNkZWZpbmUgSU5TVFJfUFJPRl9WTk9ERVNfU0VDVF9OQU1FIElOU1RSX1BST0ZfVk5PREVTX0NPRkYKKyNkZWZpbmUgSU5TVFJfUFJPRl9DT1ZNQVBfU0VDVF9OQU1FIElOU1RSX1BST0ZfQ09WTUFQX0NPRkYKKyNlbHNlCisvKiBSdW50aW1lIHNlY3Rpb24gbmFtZXMgYW5kIG5hbWUgc3RyaW5ncy4gICovCisjZGVmaW5lIElOU1RSX1BST0ZfREFUQV9TRUNUX05BTUUgSU5TVFJfUFJPRl9EQVRBX0NPTU1PTgorI2RlZmluZSBJTlNUUl9QUk9GX05BTUVfU0VDVF9OQU1FIElOU1RSX1BST0ZfTkFNRV9DT01NT04KKyNkZWZpbmUgSU5TVFJfUFJPRl9DTlRTX1NFQ1RfTkFNRSBJTlNUUl9QUk9GX0NOVFNfQ09NTU9OCisvKiBBcnJheSBvZiBwb2ludGVycy4gRWFjaCBwb2ludGVyIHBvaW50cyB0byBhIGxpc3QKKyAqIG9mIHZhbHVlIG5vZGVzIGFzc29jaWF0ZWQgd2l0aCBvbmUgdmFsdWUgc2l0ZS4KKyAqLworI2RlZmluZSBJTlNUUl9QUk9GX1ZBTFNfU0VDVF9OQU1FIElOU1RSX1BST0ZfVkFMU19DT01NT04KKy8qIFZhbHVlIHByb2ZpbGUgbm9kZXMgc2VjdGlvbi4gKi8KKyNkZWZpbmUgSU5TVFJfUFJPRl9WTk9ERVNfU0VDVF9OQU1FIElOU1RSX1BST0ZfVk5PREVTX0NPTU1PTgorI2RlZmluZSBJTlNUUl9QUk9GX0NPVk1BUF9TRUNUX05BTUUgSU5TVFJfUFJPRl9DT1ZNQVBfQ09NTU9OCisjZW5kaWYKKworI2RlZmluZSBJTlNUUl9QUk9GX0RBVEFfU0VDVF9OQU1FX1NUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5TVFJfUFJPRl9RVU9URShJTlNUUl9QUk9GX0RBVEFfU0VDVF9OQU1FKQorI2RlZmluZSBJTlNUUl9QUk9GX05BTUVfU0VDVF9OQU1FX1NUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5TVFJfUFJPRl9RVU9URShJTlNUUl9QUk9GX05BTUVfU0VDVF9OQU1FKQorI2RlZmluZSBJTlNUUl9QUk9GX0NOVFNfU0VDVF9OQU1FX1NUUiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5TVFJfUFJPRl9RVU9URShJTlNUUl9QUk9GX0NOVFNfU0VDVF9OQU1FKQorI2RlZmluZSBJTlNUUl9QUk9GX0NPVk1BUF9TRUNUX05BTUVfU1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgSU5TVFJfUFJPRl9RVU9URShJTlNUUl9QUk9GX0NPVk1BUF9TRUNUX05BTUUpCisjZGVmaW5lIElOU1RSX1BST0ZfVkFMU19TRUNUX05BTUVfU1RSICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTlNUUl9QUk9GX1FVT1RFKElOU1RSX1BST0ZfVkFMU19TRUNUX05BTUUpCisjZGVmaW5lIElOU1RSX1BST0ZfVk5PREVTX1NFQ1RfTkFNRV9TVFIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBJTlNUUl9QUk9GX1FVT1RFKElOU1RSX1BST0ZfVk5PREVTX1NFQ1RfTkFNRSkKKworLyogTWFjcm9zIHRvIGRlZmluZSBzdGFydC9zdG9wIHNlY3Rpb24gc3ltYm9sIGZvciBhIGdpdmVuCisgKiBzZWN0aW9uIG9uIExpbnV4LiBGb3IgaW5zdGFuY2UKKyAqIElOU1RSX1BST0ZfU0VDVF9TVEFSVChJTlNUUl9QUk9GX0RBVEFfU0VDVF9OQU1FKSB3aWxsCisgKiBleHBhbmQgdG8gX19zdGFydF9fX2xsdm1fcHJvZl9kYXRhCisgKi8KKyNkZWZpbmUgSU5TVFJfUFJPRl9TRUNUX1NUQVJUKFNlY3QpIFwKKyAgICAgICAgSU5TVFJfUFJPRl9DT05DQVQoX19zdGFydF8sU2VjdCkKKyNkZWZpbmUgSU5TVFJfUFJPRl9TRUNUX1NUT1AoU2VjdCkgXAorICAgICAgICBJTlNUUl9QUk9GX0NPTkNBVChfX3N0b3BfLFNlY3QpCisKKy8qIFZhbHVlIFByb2ZpbGluZyBBUEkgbGlua2FnZSBuYW1lLiAgKi8KKyNkZWZpbmUgSU5TVFJfUFJPRl9WQUxVRV9QUk9GX0ZVTkMgX19sbHZtX3Byb2ZpbGVfaW5zdHJ1bWVudF90YXJnZXQKKyNkZWZpbmUgSU5TVFJfUFJPRl9WQUxVRV9QUk9GX0ZVTkNfU1RSIFwKKyAgICAgICAgSU5TVFJfUFJPRl9RVU9URShJTlNUUl9QUk9GX1ZBTFVFX1BST0ZfRlVOQykKKyNkZWZpbmUgSU5TVFJfUFJPRl9WQUxVRV9SQU5HRV9QUk9GX0ZVTkMgX19sbHZtX3Byb2ZpbGVfaW5zdHJ1bWVudF9yYW5nZQorI2RlZmluZSBJTlNUUl9QUk9GX1ZBTFVFX1JBTkdFX1BST0ZfRlVOQ19TVFIgXAorICAgICAgICBJTlNUUl9QUk9GX1FVT1RFKElOU1RSX1BST0ZfVkFMVUVfUkFOR0VfUFJPRl9GVU5DKQorCisvKiBJbnN0clByb2ZpbGUgcGVyLWZ1bmN0aW9uIGNvbnRyb2wgZGF0YSBhbGlnbm1lbnQuICAqLworI2RlZmluZSBJTlNUUl9QUk9GX0RBVEFfQUxJR05NRU5UIDgKKworLyogVGhlIGRhdGEgc3RydWN0dXJlIHRoYXQgcmVwcmVzZW50cyBhIHRyYWNrZWQgdmFsdWUgYnkgdGhlCisgKiB2YWx1ZSBwcm9maWxlci4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgSW5zdHJQcm9mVmFsdWVEYXRhIHsKKyAgLyogUHJvZmlsZWQgdmFsdWUuICovCisgIHVpbnQ2NF90IFZhbHVlOworICAvKiBOdW1iZXIgb2YgdGltZXMgdGhlIHZhbHVlIGFwcGVhcnMgaW4gdGhlIHRyYWluaW5nIHJ1bi4gKi8KKyAgdWludDY0X3QgQ291bnQ7Cit9IEluc3RyUHJvZlZhbHVlRGF0YTsKKworI2VuZGlmIC8qIElOU1RSX1BST0ZfREFUQV9JTkMgKi8KKworI2Vsc2UKKyN1bmRlZiBJTlNUUl9QUk9GX0RBVEFfREVGSU5FRAorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZlJlYWRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9JbnN0clByb2ZSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmMyMmRjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9JbnN0clByb2ZSZWFkZXIuaApAQCAtMCwwICsxLDQ1NiBAQAorLy89PT0tIEluc3RyUHJvZlJlYWRlci5oIC0gSW5zdHJ1bWVudGVkIHByb2ZpbGluZyByZWFkZXJzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgc3VwcG9ydCBmb3IgcmVhZGluZyBwcm9maWxpbmcgZGF0YSBmb3IgaW5zdHJ1bWVudGF0aW9uCisvLyBiYXNlZCBQR08gYW5kIGNvdmVyYWdlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9QUk9GSUxFREFUQV9JTlNUUlBST0ZSRUFERVJfSAorI2RlZmluZSBMTFZNX1BST0ZJTEVEQVRBX0lOU1RSUFJPRlJFQURFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vSVIvUHJvZmlsZVN1bW1hcnkuaCIKKyNpbmNsdWRlICJsbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTGluZUl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01lbW9yeUJ1ZmZlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9PbkRpc2tIYXNoVGFibGUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU3dhcEJ5dGVPcmRlci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgSW5zdHJQcm9mUmVhZGVyOworCisvLy8gQSBmaWxlIGZvcm1hdCBhZ25vc3RpYyBpdGVyYXRvciBvdmVyIHByb2ZpbGluZyBkYXRhLgorY2xhc3MgSW5zdHJQcm9mSXRlcmF0b3IgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmFtZWRJbnN0clByb2ZSZWNvcmQ+IHsKKyAgSW5zdHJQcm9mUmVhZGVyICpSZWFkZXIgPSBudWxscHRyOworICB2YWx1ZV90eXBlIFJlY29yZDsKKworICB2b2lkIEluY3JlbWVudCgpOworCitwdWJsaWM6CisgIEluc3RyUHJvZkl0ZXJhdG9yKCkgPSBkZWZhdWx0OworICBJbnN0clByb2ZJdGVyYXRvcihJbnN0clByb2ZSZWFkZXIgKlJlYWRlcikgOiBSZWFkZXIoUmVhZGVyKSB7IEluY3JlbWVudCgpOyB9CisKKyAgSW5zdHJQcm9mSXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7IEluY3JlbWVudCgpOyByZXR1cm4gKnRoaXM7IH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEluc3RyUHJvZkl0ZXJhdG9yICZSSFMpIHsgcmV0dXJuIFJlYWRlciA9PSBSSFMuUmVhZGVyOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBJbnN0clByb2ZJdGVyYXRvciAmUkhTKSB7IHJldHVybiBSZWFkZXIgIT0gUkhTLlJlYWRlcjsgfQorICB2YWx1ZV90eXBlICZvcGVyYXRvciooKSB7IHJldHVybiBSZWNvcmQ7IH0KKyAgdmFsdWVfdHlwZSAqb3BlcmF0b3ItPigpIHsgcmV0dXJuICZSZWNvcmQ7IH0KK307CisKKy8vLyBCYXNlIGNsYXNzIGFuZCBpbnRlcmZhY2UgZm9yIHJlYWRpbmcgcHJvZmlsaW5nIGRhdGEgb2YgYW55IGtub3duIGluc3RycHJvZgorLy8vIGZvcm1hdC4gUHJvdmlkZXMgYW4gaXRlcmF0b3Igb3ZlciBOYW1lZEluc3RyUHJvZlJlY29yZHMuCitjbGFzcyBJbnN0clByb2ZSZWFkZXIgeworICBpbnN0cnByb2ZfZXJyb3IgTGFzdEVycm9yID0gaW5zdHJwcm9mX2Vycm9yOjpzdWNjZXNzOworCitwdWJsaWM6CisgIEluc3RyUHJvZlJlYWRlcigpID0gZGVmYXVsdDsKKyAgdmlydHVhbCB+SW5zdHJQcm9mUmVhZGVyKCkgPSBkZWZhdWx0OworCisgIC8vLyBSZWFkIHRoZSBoZWFkZXIuICBSZXF1aXJlZCBiZWZvcmUgcmVhZGluZyBmaXJzdCByZWNvcmQuCisgIHZpcnR1YWwgRXJyb3IgcmVhZEhlYWRlcigpID0gMDsKKworICAvLy8gUmVhZCBhIHNpbmdsZSByZWNvcmQuCisgIHZpcnR1YWwgRXJyb3IgcmVhZE5leHRSZWNvcmQoTmFtZWRJbnN0clByb2ZSZWNvcmQgJlJlY29yZCkgPSAwOworCisgIC8vLyBJdGVyYXRvciBvdmVyIHByb2ZpbGUgZGF0YS4KKyAgSW5zdHJQcm9mSXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBJbnN0clByb2ZJdGVyYXRvcih0aGlzKTsgfQorICBJbnN0clByb2ZJdGVyYXRvciBlbmQoKSB7IHJldHVybiBJbnN0clByb2ZJdGVyYXRvcigpOyB9CisKKyAgdmlydHVhbCBib29sIGlzSVJMZXZlbFByb2ZpbGUoKSBjb25zdCA9IDA7CisKKyAgLy8vIFJldHVybiB0aGUgUEdPIHN5bXRhYi4gVGhlcmUgYXJlIHRocmVlIGRpZmZlcmVudCByZWFkZXJzOgorICAvLy8gUmF3LCBUZXh0LCBhbmQgSW5kZXhlZCBwcm9maWxlIHJlYWRlcnMuIFRoZSBmaXJzdCB0d28gdHlwZXMKKyAgLy8vIG9mIHJlYWRlcnMgYXJlIHVzZWQgb25seSBieSBsbHZtLXByb2ZkYXRhIHRvb2wsIHdoaWxlIHRoZSBpbmRleGVkCisgIC8vLyBwcm9maWxlIHJlYWRlciBpcyBhbHNvIHVzZWQgYnkgbGx2bS1jb3YgdG9vbCBhbmQgdGhlIGNvbXBpbGVyICgKKyAgLy8vIGJhY2tlbmQgb3IgZnJvbnRlbmQpLiBTaW5jZSBjcmVhdGluZyBQR08gc3ltdGFiIGNhbiBjcmVhdGUKKyAgLy8vIHNpZ25pZmljYW50IHJ1bnRpbWUgYW5kIG1lbW9yeSBvdmVyaGVhZCAoYXMgaXQgdG91Y2hlcyBkYXRhCisgIC8vLyBmb3IgdGhlIHdob2xlIHByb2dyYW0pLCBJbnN0clByb2ZTeW10YWIgZm9yIHRoZSBpbmRleGVkIHByb2ZpbGUKKyAgLy8vIHJlYWRlciBzaG91bGQgYmUgY3JlYXRlZCBvbiBkZW1hbmQgYW5kIGl0IGlzIHJlY29tbWVuZGVkIHRvIGJlCisgIC8vLyBvbmx5IHVzZWQgZm9yIGR1bXBpbmcgcHVycG9zZSB3aXRoIGxsdm0tcHJvZnRvb2wsIG5vdCB3aXRoIHRoZQorICAvLy8gY29tcGlsZXIuCisgIHZpcnR1YWwgSW5zdHJQcm9mU3ltdGFiICZnZXRTeW10YWIoKSA9IDA7CisKK3Byb3RlY3RlZDoKKyAgc3RkOjp1bmlxdWVfcHRyPEluc3RyUHJvZlN5bXRhYj4gU3ltdGFiOworCisgIC8vLyBTZXQgdGhlIGN1cnJlbnQgZXJyb3IgYW5kIHJldHVybiBzYW1lLgorICBFcnJvciBlcnJvcihpbnN0cnByb2ZfZXJyb3IgRXJyKSB7CisgICAgTGFzdEVycm9yID0gRXJyOworICAgIGlmIChFcnIgPT0gaW5zdHJwcm9mX2Vycm9yOjpzdWNjZXNzKQorICAgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgICAgcmV0dXJuIG1ha2VfZXJyb3I8SW5zdHJQcm9mRXJyb3I+KEVycik7CisgIH0KKworICBFcnJvciBlcnJvcihFcnJvciAmJkUpIHsgcmV0dXJuIGVycm9yKEluc3RyUHJvZkVycm9yOjp0YWtlKHN0ZDo6bW92ZShFKSkpOyB9CisKKyAgLy8vIENsZWFyIHRoZSBjdXJyZW50IGVycm9yIGFuZCByZXR1cm4gYSBzdWNjZXNzZnVsIG9uZS4KKyAgRXJyb3Igc3VjY2VzcygpIHsgcmV0dXJuIGVycm9yKGluc3RycHJvZl9lcnJvcjo6c3VjY2Vzcyk7IH0KKworcHVibGljOgorICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIHJlYWRlciBoYXMgZmluaXNoZWQgcmVhZGluZyB0aGUgcHJvZmlsZSBkYXRhLgorICBib29sIGlzRU9GKCkgeyByZXR1cm4gTGFzdEVycm9yID09IGluc3RycHJvZl9lcnJvcjo6ZW9mOyB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSByZWFkZXIgZW5jb3VudGVyZWQgYW4gZXJyb3IgcmVhZGluZyBwcm9maWxpbmcgZGF0YS4KKyAgYm9vbCBoYXNFcnJvcigpIHsgcmV0dXJuIExhc3RFcnJvciAhPSBpbnN0cnByb2ZfZXJyb3I6OnN1Y2Nlc3MgJiYgIWlzRU9GKCk7IH0KKworICAvLy8gR2V0IHRoZSBjdXJyZW50IGVycm9yLgorICBFcnJvciBnZXRFcnJvcigpIHsKKyAgICBpZiAoaGFzRXJyb3IoKSkKKyAgICAgIHJldHVybiBtYWtlX2Vycm9yPEluc3RyUHJvZkVycm9yPihMYXN0RXJyb3IpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgLy8vIEZhY3RvcnkgbWV0aG9kIHRvIGNyZWF0ZSBhbiBhcHByb3ByaWF0ZWx5IHR5cGVkIHJlYWRlciBmb3IgdGhlIGdpdmVuCisgIC8vLyBpbnN0cnByb2YgZmlsZS4KKyAgc3RhdGljIEV4cGVjdGVkPHN0ZDo6dW5pcXVlX3B0cjxJbnN0clByb2ZSZWFkZXI+PiBjcmVhdGUoY29uc3QgVHdpbmUgJlBhdGgpOworCisgIHN0YXRpYyBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5zdHJQcm9mUmVhZGVyPj4KKyAgY3JlYXRlKHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IEJ1ZmZlcik7Cit9OworCisvLy8gUmVhZGVyIGZvciB0aGUgc2ltcGxlIHRleHQgYmFzZWQgaW5zdHJwcm9mIGZvcm1hdC4KKy8vLworLy8vIFRoaXMgZm9ybWF0IGlzIGEgc2ltcGxlIHRleHQgZm9ybWF0IHRoYXQncyBzdWl0YWJsZSBmb3IgdGVzdCBkYXRhLiBSZWNvcmRzCisvLy8gYXJlIHNlcGFyYXRlZCBieSBvbmUgb3IgbW9yZSBibGFuayBsaW5lcywgYW5kIHJlY29yZCBmaWVsZHMgYXJlIHNlcGFyYXRlZCBieQorLy8vIG5ldyBsaW5lcy4KKy8vLworLy8vIEVhY2ggcmVjb3JkIGNvbnNpc3RzIG9mIGEgZnVuY3Rpb24gbmFtZSwgYSBmdW5jdGlvbiBoYXNoLCBhIG51bWJlciBvZgorLy8vIGNvdW50ZXJzLCBhbmQgdGhlbiBlYWNoIGNvdW50ZXIgdmFsdWUsIGluIHRoYXQgb3JkZXIuCitjbGFzcyBUZXh0SW5zdHJQcm9mUmVhZGVyIDogcHVibGljIEluc3RyUHJvZlJlYWRlciB7Citwcml2YXRlOgorICAvLy8gVGhlIHByb2ZpbGUgZGF0YSBmaWxlIGNvbnRlbnRzLgorICBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBEYXRhQnVmZmVyOworICAvLy8gSXRlcmF0b3Igb3ZlciB0aGUgcHJvZmlsZSBkYXRhLgorICBsaW5lX2l0ZXJhdG9yIExpbmU7CisgIGJvb2wgSXNJUkxldmVsUHJvZmlsZSA9IGZhbHNlOworCisgIEVycm9yIHJlYWRWYWx1ZVByb2ZpbGVEYXRhKEluc3RyUHJvZlJlY29yZCAmUmVjb3JkKTsKKworcHVibGljOgorICBUZXh0SW5zdHJQcm9mUmVhZGVyKHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IERhdGFCdWZmZXJfKQorICAgICAgOiBEYXRhQnVmZmVyKHN0ZDo6bW92ZShEYXRhQnVmZmVyXykpLCBMaW5lKCpEYXRhQnVmZmVyLCB0cnVlLCAnIycpIHt9CisgIFRleHRJbnN0clByb2ZSZWFkZXIoY29uc3QgVGV4dEluc3RyUHJvZlJlYWRlciAmKSA9IGRlbGV0ZTsKKyAgVGV4dEluc3RyUHJvZlJlYWRlciAmb3BlcmF0b3I9KGNvbnN0IFRleHRJbnN0clByb2ZSZWFkZXIgJikgPSBkZWxldGU7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBidWZmZXIgaXMgaW4gdGV4dCBpbnN0cnByb2YgZm9ybWF0LgorICBzdGF0aWMgYm9vbCBoYXNGb3JtYXQoY29uc3QgTWVtb3J5QnVmZmVyICZCdWZmZXIpOworCisgIGJvb2wgaXNJUkxldmVsUHJvZmlsZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIElzSVJMZXZlbFByb2ZpbGU7IH0KKworICAvLy8gUmVhZCB0aGUgaGVhZGVyLgorICBFcnJvciByZWFkSGVhZGVyKCkgb3ZlcnJpZGU7CisKKyAgLy8vIFJlYWQgYSBzaW5nbGUgcmVjb3JkLgorICBFcnJvciByZWFkTmV4dFJlY29yZChOYW1lZEluc3RyUHJvZlJlY29yZCAmUmVjb3JkKSBvdmVycmlkZTsKKworICBJbnN0clByb2ZTeW10YWIgJmdldFN5bXRhYigpIG92ZXJyaWRlIHsKKyAgICBhc3NlcnQoU3ltdGFiLmdldCgpKTsKKyAgICByZXR1cm4gKlN5bXRhYi5nZXQoKTsKKyAgfQorfTsKKworLy8vIFJlYWRlciBmb3IgdGhlIHJhdyBpbnN0cnByb2YgYmluYXJ5IGZvcm1hdCBmcm9tIHJ1bnRpbWUuCisvLy8KKy8vLyBUaGlzIGZvcm1hdCBpcyBhIHJhdyBtZW1vcnkgZHVtcCBvZiB0aGUgaW5zdHJ1bWVudGF0aW9uLWJhZWQgcHJvZmlsaW5nIGRhdGEKKy8vLyBmcm9tIHRoZSBydW50aW1lLiAgSXQgaGFzIG5vIGluZGV4LgorLy8vCisvLy8gVGVtcGxhdGVkIG9uIHRoZSB1bnNpZ25lZCB0eXBlIHdob3NlIHNpemUgbWF0Y2hlcyBwb2ludGVycyBvbiB0aGUgcGxhdGZvcm0KKy8vLyB0aGF0IHdyb3RlIHRoZSBwcm9maWxlLgordGVtcGxhdGUgPGNsYXNzIEludFB0clQ+CitjbGFzcyBSYXdJbnN0clByb2ZSZWFkZXIgOiBwdWJsaWMgSW5zdHJQcm9mUmVhZGVyIHsKK3ByaXZhdGU6CisgIC8vLyBUaGUgcHJvZmlsZSBkYXRhIGZpbGUgY29udGVudHMuCisgIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IERhdGFCdWZmZXI7CisgIGJvb2wgU2hvdWxkU3dhcEJ5dGVzOworICAvLyBUaGUgdmFsdWUgb2YgdGhlIHZlcnNpb24gZmllbGQgb2YgdGhlIHJhdyBwcm9maWxlIGRhdGEgaGVhZGVyLiBUaGUgbG93ZXIgNTYKKyAgLy8gYml0cyBzcGVjaWZpZXMgdGhlIGZvcm1hdCB2ZXJzaW9uIGFuZCB0aGUgbW9zdCBzaWduaWZpY2FudCA4IGJpdHMgc3BlY2lmeQorICAvLyB0aGUgdmFyaWFudCB0eXBlcyBvZiB0aGUgcHJvZmlsZS4KKyAgdWludDY0X3QgVmVyc2lvbjsKKyAgdWludDY0X3QgQ291bnRlcnNEZWx0YTsKKyAgdWludDY0X3QgTmFtZXNEZWx0YTsKKyAgY29uc3QgUmF3SW5zdHJQcm9mOjpQcm9maWxlRGF0YTxJbnRQdHJUPiAqRGF0YTsKKyAgY29uc3QgUmF3SW5zdHJQcm9mOjpQcm9maWxlRGF0YTxJbnRQdHJUPiAqRGF0YUVuZDsKKyAgY29uc3QgdWludDY0X3QgKkNvdW50ZXJzU3RhcnQ7CisgIGNvbnN0IGNoYXIgKk5hbWVzU3RhcnQ7CisgIHVpbnQ2NF90IE5hbWVzU2l6ZTsKKyAgLy8gQWZ0ZXIgdmFsdWUgcHJvZmlsZSBpcyBhbGwgcmVhZCwgdGhpcyBwb2ludGVyIHBvaW50cyB0bworICAvLyB0aGUgaGVhZGVyIG9mIG5leHQgcHJvZmlsZSBkYXRhIChpZiBleGlzdHMpCisgIGNvbnN0IHVpbnQ4X3QgKlZhbHVlRGF0YVN0YXJ0OworICB1aW50MzJfdCBWYWx1ZUtpbmRMYXN0OworICB1aW50MzJfdCBDdXJWYWx1ZURhdGFTaXplOworCitwdWJsaWM6CisgIFJhd0luc3RyUHJvZlJlYWRlcihzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBEYXRhQnVmZmVyKQorICAgICAgOiBEYXRhQnVmZmVyKHN0ZDo6bW92ZShEYXRhQnVmZmVyKSkge30KKyAgUmF3SW5zdHJQcm9mUmVhZGVyKGNvbnN0IFJhd0luc3RyUHJvZlJlYWRlciAmKSA9IGRlbGV0ZTsKKyAgUmF3SW5zdHJQcm9mUmVhZGVyICZvcGVyYXRvcj0oY29uc3QgUmF3SW5zdHJQcm9mUmVhZGVyICYpID0gZGVsZXRlOworCisgIHN0YXRpYyBib29sIGhhc0Zvcm1hdChjb25zdCBNZW1vcnlCdWZmZXIgJkRhdGFCdWZmZXIpOworICBFcnJvciByZWFkSGVhZGVyKCkgb3ZlcnJpZGU7CisgIEVycm9yIHJlYWROZXh0UmVjb3JkKE5hbWVkSW5zdHJQcm9mUmVjb3JkICZSZWNvcmQpIG92ZXJyaWRlOworCisgIGJvb2wgaXNJUkxldmVsUHJvZmlsZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gKFZlcnNpb24gJiBWQVJJQU5UX01BU0tfSVJfUFJPRikgIT0gMDsKKyAgfQorCisgIEluc3RyUHJvZlN5bXRhYiAmZ2V0U3ltdGFiKCkgb3ZlcnJpZGUgeworICAgIGFzc2VydChTeW10YWIuZ2V0KCkpOworICAgIHJldHVybiAqU3ltdGFiLmdldCgpOworICB9CisKK3ByaXZhdGU6CisgIEVycm9yIGNyZWF0ZVN5bXRhYihJbnN0clByb2ZTeW10YWIgJlN5bXRhYik7CisgIEVycm9yIHJlYWROZXh0SGVhZGVyKGNvbnN0IGNoYXIgKkN1cnJlbnRQb3MpOworICBFcnJvciByZWFkSGVhZGVyKGNvbnN0IFJhd0luc3RyUHJvZjo6SGVhZGVyICZIZWFkZXIpOworCisgIHRlbXBsYXRlIDxjbGFzcyBJbnRUPiBJbnRUIHN3YXAoSW50VCBJbnQpIGNvbnN0IHsKKyAgICByZXR1cm4gU2hvdWxkU3dhcEJ5dGVzID8gc3lzOjpnZXRTd2FwcGVkQnl0ZXMoSW50KSA6IEludDsKKyAgfQorCisgIHN1cHBvcnQ6OmVuZGlhbm5lc3MgZ2V0RGF0YUVuZGlhbm5lc3MoKSBjb25zdCB7CisgICAgc3VwcG9ydDo6ZW5kaWFubmVzcyBIb3N0RW5kaWFuID0gZ2V0SG9zdEVuZGlhbm5lc3MoKTsKKyAgICBpZiAoIVNob3VsZFN3YXBCeXRlcykKKyAgICAgIHJldHVybiBIb3N0RW5kaWFuOworICAgIGlmIChIb3N0RW5kaWFuID09IHN1cHBvcnQ6OmxpdHRsZSkKKyAgICAgIHJldHVybiBzdXBwb3J0OjpiaWc7CisgICAgZWxzZQorICAgICAgcmV0dXJuIHN1cHBvcnQ6OmxpdHRsZTsKKyAgfQorCisgIGlubGluZSB1aW50OF90IGdldE51bVBhZGRpbmdCeXRlcyh1aW50NjRfdCBTaXplSW5CeXRlcykgeworICAgIHJldHVybiA3ICYgKHNpemVvZih1aW50NjRfdCkgLSBTaXplSW5CeXRlcyAlIHNpemVvZih1aW50NjRfdCkpOworICB9CisKKyAgRXJyb3IgcmVhZE5hbWUoTmFtZWRJbnN0clByb2ZSZWNvcmQgJlJlY29yZCk7CisgIEVycm9yIHJlYWRGdW5jSGFzaChOYW1lZEluc3RyUHJvZlJlY29yZCAmUmVjb3JkKTsKKyAgRXJyb3IgcmVhZFJhd0NvdW50cyhJbnN0clByb2ZSZWNvcmQgJlJlY29yZCk7CisgIEVycm9yIHJlYWRWYWx1ZVByb2ZpbGluZ0RhdGEoSW5zdHJQcm9mUmVjb3JkICZSZWNvcmQpOworICBib29sIGF0RW5kKCkgY29uc3QgeyByZXR1cm4gRGF0YSA9PSBEYXRhRW5kOyB9CisKKyAgdm9pZCBhZHZhbmNlRGF0YSgpIHsKKyAgICBEYXRhKys7CisgICAgVmFsdWVEYXRhU3RhcnQgKz0gQ3VyVmFsdWVEYXRhU2l6ZTsKKyAgfQorCisgIGNvbnN0IGNoYXIgKmdldE5leHRIZWFkZXJQb3MoKSBjb25zdCB7CisgICAgICBhc3NlcnQoYXRFbmQoKSk7CisgICAgICByZXR1cm4gKGNvbnN0IGNoYXIgKilWYWx1ZURhdGFTdGFydDsKKyAgfQorCisgIGNvbnN0IHVpbnQ2NF90ICpnZXRDb3VudGVyKEludFB0clQgQ291bnRlclB0cikgY29uc3QgeworICAgIHB0cmRpZmZfdCBPZmZzZXQgPSAoc3dhcChDb3VudGVyUHRyKSAtIENvdW50ZXJzRGVsdGEpIC8gc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICByZXR1cm4gQ291bnRlcnNTdGFydCArIE9mZnNldDsKKyAgfQorCisgIFN0cmluZ1JlZiBnZXROYW1lKHVpbnQ2NF90IE5hbWVSZWYpIGNvbnN0IHsKKyAgICByZXR1cm4gU3ltdGFiLT5nZXRGdW5jTmFtZShzd2FwKE5hbWVSZWYpKTsKKyAgfQorfTsKKwordXNpbmcgUmF3SW5zdHJQcm9mUmVhZGVyMzIgPSBSYXdJbnN0clByb2ZSZWFkZXI8dWludDMyX3Q+OwordXNpbmcgUmF3SW5zdHJQcm9mUmVhZGVyNjQgPSBSYXdJbnN0clByb2ZSZWFkZXI8dWludDY0X3Q+OworCituYW1lc3BhY2UgSW5kZXhlZEluc3RyUHJvZiB7CisKK2VudW0gY2xhc3MgSGFzaFQgOiB1aW50MzJfdDsKKworfSAvLyBlbmQgbmFtZXNwYWNlIEluZGV4ZWRJbnN0clByb2YKKworLy8vIFRyYWl0IGZvciBsb29rdXBzIGludG8gdGhlIG9uLWRpc2sgaGFzaCB0YWJsZSBmb3IgdGhlIGJpbmFyeSBpbnN0cnByb2YKKy8vLyBmb3JtYXQuCitjbGFzcyBJbnN0clByb2ZMb29rdXBUcmFpdCB7CisgIHN0ZDo6dmVjdG9yPE5hbWVkSW5zdHJQcm9mUmVjb3JkPiBEYXRhQnVmZmVyOworICBJbmRleGVkSW5zdHJQcm9mOjpIYXNoVCBIYXNoVHlwZTsKKyAgdW5zaWduZWQgRm9ybWF0VmVyc2lvbjsKKyAgLy8gRW5kaWFubmVzcyBvZiB0aGUgaW5wdXQgdmFsdWUgcHJvZmlsZSBkYXRhLgorICAvLyBJdCBzaG91bGQgYmUgTEUgYnkgZGVmYXVsdCwgYnV0IGNhbiBiZSBjaGFuZ2VkCisgIC8vIGZvciB0ZXN0aW5nIHB1cnBvc2UuCisgIHN1cHBvcnQ6OmVuZGlhbm5lc3MgVmFsdWVQcm9mRGF0YUVuZGlhbm5lc3MgPSBzdXBwb3J0OjpsaXR0bGU7CisKK3B1YmxpYzoKKyAgSW5zdHJQcm9mTG9va3VwVHJhaXQoSW5kZXhlZEluc3RyUHJvZjo6SGFzaFQgSGFzaFR5cGUsIHVuc2lnbmVkIEZvcm1hdFZlcnNpb24pCisgICAgICA6IEhhc2hUeXBlKEhhc2hUeXBlKSwgRm9ybWF0VmVyc2lvbihGb3JtYXRWZXJzaW9uKSB7fQorCisgIHVzaW5nIGRhdGFfdHlwZSA9IEFycmF5UmVmPE5hbWVkSW5zdHJQcm9mUmVjb3JkPjsKKworICB1c2luZyBpbnRlcm5hbF9rZXlfdHlwZSA9IFN0cmluZ1JlZjsKKyAgdXNpbmcgZXh0ZXJuYWxfa2V5X3R5cGUgPSBTdHJpbmdSZWY7CisgIHVzaW5nIGhhc2hfdmFsdWVfdHlwZSA9IHVpbnQ2NF90OworICB1c2luZyBvZmZzZXRfdHlwZSA9IHVpbnQ2NF90OworCisgIHN0YXRpYyBib29sIEVxdWFsS2V5KFN0cmluZ1JlZiBBLCBTdHJpbmdSZWYgQikgeyByZXR1cm4gQSA9PSBCOyB9CisgIHN0YXRpYyBTdHJpbmdSZWYgR2V0SW50ZXJuYWxLZXkoU3RyaW5nUmVmIEspIHsgcmV0dXJuIEs7IH0KKyAgc3RhdGljIFN0cmluZ1JlZiBHZXRFeHRlcm5hbEtleShTdHJpbmdSZWYgSykgeyByZXR1cm4gSzsgfQorCisgIGhhc2hfdmFsdWVfdHlwZSBDb21wdXRlSGFzaChTdHJpbmdSZWYgSyk7CisKKyAgc3RhdGljIHN0ZDo6cGFpcjxvZmZzZXRfdHlwZSwgb2Zmc2V0X3R5cGU+CisgIFJlYWRLZXlEYXRhTGVuZ3RoKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiZEKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIHN1cHBvcnQ7CisKKyAgICBvZmZzZXRfdHlwZSBLZXlMZW4gPSBlbmRpYW46OnJlYWROZXh0PG9mZnNldF90eXBlLCBsaXR0bGUsIHVuYWxpZ25lZD4oRCk7CisgICAgb2Zmc2V0X3R5cGUgRGF0YUxlbiA9IGVuZGlhbjo6cmVhZE5leHQ8b2Zmc2V0X3R5cGUsIGxpdHRsZSwgdW5hbGlnbmVkPihEKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoS2V5TGVuLCBEYXRhTGVuKTsKKyAgfQorCisgIFN0cmluZ1JlZiBSZWFkS2V5KGNvbnN0IHVuc2lnbmVkIGNoYXIgKkQsIG9mZnNldF90eXBlIE4pIHsKKyAgICByZXR1cm4gU3RyaW5nUmVmKChjb25zdCBjaGFyICopRCwgTik7CisgIH0KKworICBib29sIHJlYWRWYWx1ZVByb2ZpbGluZ0RhdGEoY29uc3QgdW5zaWduZWQgY2hhciAqJkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCBFbmQpOworICBkYXRhX3R5cGUgUmVhZERhdGEoU3RyaW5nUmVmIEssIGNvbnN0IHVuc2lnbmVkIGNoYXIgKkQsIG9mZnNldF90eXBlIE4pOworCisgIC8vIFVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZSBvbmx5LgorICB2b2lkIHNldFZhbHVlUHJvZkRhdGFFbmRpYW5uZXNzKHN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFubmVzcykgeworICAgIFZhbHVlUHJvZkRhdGFFbmRpYW5uZXNzID0gRW5kaWFubmVzczsKKyAgfQorfTsKKworc3RydWN0IEluc3RyUHJvZlJlYWRlckluZGV4QmFzZSB7CisgIHZpcnR1YWwgfkluc3RyUHJvZlJlYWRlckluZGV4QmFzZSgpID0gZGVmYXVsdDsKKworICAvLyBSZWFkIGFsbCB0aGUgcHJvZmlsZSByZWNvcmRzIHdpdGggdGhlIHNhbWUga2V5IHBvaW50ZWQgdG8gdGhlIGN1cnJlbnQKKyAgLy8gaXRlcmF0b3IuCisgIHZpcnR1YWwgRXJyb3IgZ2V0UmVjb3JkcyhBcnJheVJlZjxOYW1lZEluc3RyUHJvZlJlY29yZD4gJkRhdGEpID0gMDsKKworICAvLyBSZWFkIGFsbCB0aGUgcHJvZmlsZSByZWNvcmRzIHdpdGggdGhlIGtleSBlcXVhbCB0byBGdW5jTmFtZQorICB2aXJ0dWFsIEVycm9yIGdldFJlY29yZHMoU3RyaW5nUmVmIEZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE5hbWVkSW5zdHJQcm9mUmVjb3JkPiAmRGF0YSkgPSAwOworICB2aXJ0dWFsIHZvaWQgYWR2YW5jZVRvTmV4dEtleSgpID0gMDsKKyAgdmlydHVhbCBib29sIGF0RW5kKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgc2V0VmFsdWVQcm9mRGF0YUVuZGlhbm5lc3Moc3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW5uZXNzKSA9IDA7CisgIHZpcnR1YWwgdWludDY0X3QgZ2V0VmVyc2lvbigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIGlzSVJMZXZlbFByb2ZpbGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgRXJyb3IgcG9wdWxhdGVTeW10YWIoSW5zdHJQcm9mU3ltdGFiICYpID0gMDsKK307CisKK3VzaW5nIE9uRGlza0hhc2hUYWJsZUltcGxWMyA9CisgICAgT25EaXNrSXRlcmFibGVDaGFpbmVkSGFzaFRhYmxlPEluc3RyUHJvZkxvb2t1cFRyYWl0PjsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEhhc2hUYWJsZUltcGw+CitjbGFzcyBJbnN0clByb2ZSZWFkZXJJbmRleCA6IHB1YmxpYyBJbnN0clByb2ZSZWFkZXJJbmRleEJhc2UgeworcHJpdmF0ZToKKyAgc3RkOjp1bmlxdWVfcHRyPEhhc2hUYWJsZUltcGw+IEhhc2hUYWJsZTsKKyAgdHlwZW5hbWUgSGFzaFRhYmxlSW1wbDo6ZGF0YV9pdGVyYXRvciBSZWNvcmRJdGVyYXRvcjsKKyAgdWludDY0X3QgRm9ybWF0VmVyc2lvbjsKKworcHVibGljOgorICBJbnN0clByb2ZSZWFkZXJJbmRleChjb25zdCB1bnNpZ25lZCBjaGFyICpCdWNrZXRzLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCBQYXlsb2FkLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCBCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICBJbmRleGVkSW5zdHJQcm9mOjpIYXNoVCBIYXNoVHlwZSwgdWludDY0X3QgVmVyc2lvbik7CisgIH5JbnN0clByb2ZSZWFkZXJJbmRleCgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICBFcnJvciBnZXRSZWNvcmRzKEFycmF5UmVmPE5hbWVkSW5zdHJQcm9mUmVjb3JkPiAmRGF0YSkgb3ZlcnJpZGU7CisgIEVycm9yIGdldFJlY29yZHMoU3RyaW5nUmVmIEZ1bmNOYW1lLAorICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPE5hbWVkSW5zdHJQcm9mUmVjb3JkPiAmRGF0YSkgb3ZlcnJpZGU7CisgIHZvaWQgYWR2YW5jZVRvTmV4dEtleSgpIG92ZXJyaWRlIHsgUmVjb3JkSXRlcmF0b3IrKzsgfQorCisgIGJvb2wgYXRFbmQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIFJlY29yZEl0ZXJhdG9yID09IEhhc2hUYWJsZS0+ZGF0YV9lbmQoKTsKKyAgfQorCisgIHZvaWQgc2V0VmFsdWVQcm9mRGF0YUVuZGlhbm5lc3Moc3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW5uZXNzKSBvdmVycmlkZSB7CisgICAgSGFzaFRhYmxlLT5nZXRJbmZvT2JqKCkuc2V0VmFsdWVQcm9mRGF0YUVuZGlhbm5lc3MoRW5kaWFubmVzcyk7CisgIH0KKworICB1aW50NjRfdCBnZXRWZXJzaW9uKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gR0VUX1ZFUlNJT04oRm9ybWF0VmVyc2lvbik7IH0KKworICBib29sIGlzSVJMZXZlbFByb2ZpbGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIChGb3JtYXRWZXJzaW9uICYgVkFSSUFOVF9NQVNLX0lSX1BST0YpICE9IDA7CisgIH0KKworICBFcnJvciBwb3B1bGF0ZVN5bXRhYihJbnN0clByb2ZTeW10YWIgJlN5bXRhYikgb3ZlcnJpZGUgeworICAgIHJldHVybiBTeW10YWIuY3JlYXRlKEhhc2hUYWJsZS0+a2V5cygpKTsKKyAgfQorfTsKKworLy8vIFJlYWRlciBmb3IgdGhlIGluZGV4ZWQgYmluYXJ5IGluc3RycHJvZiBmb3JtYXQuCitjbGFzcyBJbmRleGVkSW5zdHJQcm9mUmVhZGVyIDogcHVibGljIEluc3RyUHJvZlJlYWRlciB7Citwcml2YXRlOgorICAvLy8gVGhlIHByb2ZpbGUgZGF0YSBmaWxlIGNvbnRlbnRzLgorICBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBEYXRhQnVmZmVyOworICAvLy8gVGhlIGluZGV4IGludG8gdGhlIHByb2ZpbGUgZGF0YS4KKyAgc3RkOjp1bmlxdWVfcHRyPEluc3RyUHJvZlJlYWRlckluZGV4QmFzZT4gSW5kZXg7CisgIC8vLyBQcm9maWxlIHN1bW1hcnkgZGF0YS4KKyAgc3RkOjp1bmlxdWVfcHRyPFByb2ZpbGVTdW1tYXJ5PiBTdW1tYXJ5OworICAvLyBJbmRleCB0byB0aGUgY3VycmVudCByZWNvcmQgaW4gdGhlIHJlY29yZCBhcnJheS4KKyAgdW5zaWduZWQgUmVjb3JkSW5kZXg7CisKKyAgLy8gUmVhZCB0aGUgcHJvZmlsZSBzdW1tYXJ5LiBSZXR1cm4gYSBwb2ludGVyIHBvaW50aW5nIHRvIG9uZSBieXRlIHBhc3QgdGhlCisgIC8vIGVuZCBvZiB0aGUgc3VtbWFyeSBkYXRhIGlmIGl0IGV4aXN0cyBvciB0aGUgaW5wdXQgXGMgQ3VyLgorICBjb25zdCB1bnNpZ25lZCBjaGFyICpyZWFkU3VtbWFyeShJbmRleGVkSW5zdHJQcm9mOjpQcm9mVmVyc2lvbiBWZXJzaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpDdXIpOworCitwdWJsaWM6CisgIEluZGV4ZWRJbnN0clByb2ZSZWFkZXIoc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gRGF0YUJ1ZmZlcikKKyAgICAgIDogRGF0YUJ1ZmZlcihzdGQ6Om1vdmUoRGF0YUJ1ZmZlcikpLCBSZWNvcmRJbmRleCgwKSB7fQorICBJbmRleGVkSW5zdHJQcm9mUmVhZGVyKGNvbnN0IEluZGV4ZWRJbnN0clByb2ZSZWFkZXIgJikgPSBkZWxldGU7CisgIEluZGV4ZWRJbnN0clByb2ZSZWFkZXIgJm9wZXJhdG9yPShjb25zdCBJbmRleGVkSW5zdHJQcm9mUmVhZGVyICYpID0gZGVsZXRlOworCisgIC8vLyBSZXR1cm4gdGhlIHByb2ZpbGUgdmVyc2lvbi4KKyAgdWludDY0X3QgZ2V0VmVyc2lvbigpIGNvbnN0IHsgcmV0dXJuIEluZGV4LT5nZXRWZXJzaW9uKCk7IH0KKyAgYm9vbCBpc0lSTGV2ZWxQcm9maWxlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gSW5kZXgtPmlzSVJMZXZlbFByb2ZpbGUoKTsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gYnVmZmVyIGlzIGluIGFuIGluZGV4ZWQgaW5zdHJwcm9mIGZvcm1hdC4KKyAgc3RhdGljIGJvb2wgaGFzRm9ybWF0KGNvbnN0IE1lbW9yeUJ1ZmZlciAmRGF0YUJ1ZmZlcik7CisKKyAgLy8vIFJlYWQgdGhlIGZpbGUgaGVhZGVyLgorICBFcnJvciByZWFkSGVhZGVyKCkgb3ZlcnJpZGU7CisgIC8vLyBSZWFkIGEgc2luZ2xlIHJlY29yZC4KKyAgRXJyb3IgcmVhZE5leHRSZWNvcmQoTmFtZWRJbnN0clByb2ZSZWNvcmQgJlJlY29yZCkgb3ZlcnJpZGU7CisKKyAgLy8vIFJldHVybiB0aGUgTmFtZWRJbnN0clByb2ZSZWNvcmQgYXNzb2NpYXRlZCB3aXRoIEZ1bmNOYW1lIGFuZCBGdW5jSGFzaAorICBFeHBlY3RlZDxJbnN0clByb2ZSZWNvcmQ+IGdldEluc3RyUHJvZlJlY29yZChTdHJpbmdSZWYgRnVuY05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IEZ1bmNIYXNoKTsKKworICAvLy8gRmlsbCBDb3VudHMgd2l0aCB0aGUgcHJvZmlsZSBkYXRhIGZvciB0aGUgZ2l2ZW4gZnVuY3Rpb24gbmFtZS4KKyAgRXJyb3IgZ2V0RnVuY3Rpb25Db3VudHMoU3RyaW5nUmVmIEZ1bmNOYW1lLCB1aW50NjRfdCBGdW5jSGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+ICZDb3VudHMpOworCisgIC8vLyBSZXR1cm4gdGhlIG1heGltdW0gb2YgYWxsIGtub3duIGZ1bmN0aW9uIGNvdW50cy4KKyAgdWludDY0X3QgZ2V0TWF4aW11bUZ1bmN0aW9uQ291bnQoKSB7IHJldHVybiBTdW1tYXJ5LT5nZXRNYXhGdW5jdGlvbkNvdW50KCk7IH0KKworICAvLy8gRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGFuIGluZGV4ZWQgcmVhZGVyLgorICBzdGF0aWMgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPEluZGV4ZWRJbnN0clByb2ZSZWFkZXI+PgorICBjcmVhdGUoY29uc3QgVHdpbmUgJlBhdGgpOworCisgIHN0YXRpYyBFeHBlY3RlZDxzdGQ6OnVuaXF1ZV9wdHI8SW5kZXhlZEluc3RyUHJvZlJlYWRlcj4+CisgIGNyZWF0ZShzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBCdWZmZXIpOworCisgIC8vIFVzZWQgZm9yIHRlc3RpbmcgcHVycG9zZSBvbmx5LgorICB2b2lkIHNldFZhbHVlUHJvZkRhdGFFbmRpYW5uZXNzKHN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFubmVzcykgeworICAgIEluZGV4LT5zZXRWYWx1ZVByb2ZEYXRhRW5kaWFubmVzcyhFbmRpYW5uZXNzKTsKKyAgfQorCisgIC8vIFNlZSBkZXNjcmlwdGlvbiBpbiB0aGUgYmFzZSBjbGFzcy4gVGhpcyBpbnRlcmZhY2UgaXMgZGVzaWduZWQKKyAgLy8gdG8gYmUgdXNlZCBieSBsbHZtLXByb2ZkYXRhIChmb3IgZHVtcGluZykuIEF2b2lkIHVzaW5nIHRoaXMgd2hlbgorICAvLyB0aGUgY2xpZW50IGlzIHRoZSBjb21waWxlci4KKyAgSW5zdHJQcm9mU3ltdGFiICZnZXRTeW10YWIoKSBvdmVycmlkZTsKKyAgUHJvZmlsZVN1bW1hcnkgJmdldFN1bW1hcnkoKSB7IHJldHVybiAqKFN1bW1hcnkuZ2V0KCkpOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9QUk9GSUxFREFUQV9JTlNUUlBST0ZSRUFERVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9JbnN0clByb2ZXcml0ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODEwN2FiMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvSW5zdHJQcm9mV3JpdGVyLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8vPT09LSBJbnN0clByb2ZXcml0ZXIuaCAtIEluc3RydW1lbnRlZCBwcm9maWxpbmcgd3JpdGVyIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHN1cHBvcnQgZm9yIHdyaXRpbmcgcHJvZmlsaW5nIGRhdGEgZm9yIGluc3RydW1lbnRhdGlvbgorLy8gYmFzZWQgUEdPIGFuZCBjb3ZlcmFnZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fUFJPRklMRURBVEFfSU5TVFJQUk9GV1JJVEVSX0gKKyNkZWZpbmUgTExWTV9QUk9GSUxFREFUQV9JTlNUUlBST0ZXUklURVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFdyaXRlciBmb3IgaW5zdHJ1bWVudGF0aW9uIGJhc2VkIHByb2ZpbGUgZGF0YS4KK2NsYXNzIEluc3RyUHJvZlJlY29yZFdyaXRlclRyYWl0OworY2xhc3MgUHJvZk9TdHJlYW07CitjbGFzcyByYXdfZmRfb3N0cmVhbTsKKworY2xhc3MgSW5zdHJQcm9mV3JpdGVyIHsKK3B1YmxpYzoKKyAgdXNpbmcgUHJvZmlsaW5nRGF0YSA9IFNtYWxsRGVuc2VNYXA8dWludDY0X3QsIEluc3RyUHJvZlJlY29yZD47CisgIGVudW0gUHJvZktpbmQgeyBQRl9Vbmtub3duID0gMCwgUEZfRkUsIFBGX0lSTGV2ZWwgfTsKKworcHJpdmF0ZToKKyAgYm9vbCBTcGFyc2U7CisgIFN0cmluZ01hcDxQcm9maWxpbmdEYXRhPiBGdW5jdGlvbkRhdGE7CisgIFByb2ZLaW5kIFByb2ZpbGVLaW5kID0gUEZfVW5rbm93bjsKKyAgLy8gVXNlIHJhdyBwb2ludGVyIGhlcmUgZm9yIHRoZSBpbmNvbXBsZXRlIHR5cGUgb2JqZWN0LgorICBJbnN0clByb2ZSZWNvcmRXcml0ZXJUcmFpdCAqSW5mb09iajsKKworcHVibGljOgorICBJbnN0clByb2ZXcml0ZXIoYm9vbCBTcGFyc2UgPSBmYWxzZSk7CisgIH5JbnN0clByb2ZXcml0ZXIoKTsKKworICAvLy8gQWRkIGZ1bmN0aW9uIGNvdW50cyBmb3IgdGhlIGdpdmVuIGZ1bmN0aW9uLiBJZiB0aGVyZSBhcmUgYWxyZWFkeSBjb3VudHMKKyAgLy8vIGZvciB0aGlzIGZ1bmN0aW9uIGFuZCB0aGUgaGFzaCBhbmQgbnVtYmVyIG9mIGNvdW50cyBtYXRjaCwgZWFjaCBjb3VudGVyIGlzCisgIC8vLyBzdW1tZWQuIE9wdGlvbmFsbHkgc2NhbGUgY291bnRzIGJ5IFxwIFdlaWdodC4KKyAgdm9pZCBhZGRSZWNvcmQoTmFtZWRJbnN0clByb2ZSZWNvcmQgJiZJLCB1aW50NjRfdCBXZWlnaHQsCisgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX3JlZjx2b2lkKEVycm9yKT4gV2Fybik7CisgIHZvaWQgYWRkUmVjb3JkKE5hbWVkSW5zdHJQcm9mUmVjb3JkICYmSSwgZnVuY3Rpb25fcmVmPHZvaWQoRXJyb3IpPiBXYXJuKSB7CisgICAgYWRkUmVjb3JkKHN0ZDo6bW92ZShJKSwgMSwgV2Fybik7CisgIH0KKworICAvLy8gTWVyZ2UgZXhpc3RpbmcgZnVuY3Rpb24gY291bnRzIGZyb20gdGhlIGdpdmVuIHdyaXRlci4KKyAgdm9pZCBtZXJnZVJlY29yZHNGcm9tV3JpdGVyKEluc3RyUHJvZldyaXRlciAmJklQVywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX3JlZjx2b2lkKEVycm9yKT4gV2Fybik7CisKKyAgLy8vIFdyaXRlIHRoZSBwcm9maWxlIHRvIFxjIE9TCisgIHZvaWQgd3JpdGUocmF3X2ZkX29zdHJlYW0gJk9TKTsKKworICAvLy8gV3JpdGUgdGhlIHByb2ZpbGUgaW4gdGV4dCBmb3JtYXQgdG8gXGMgT1MKKyAgRXJyb3Igd3JpdGVUZXh0KHJhd19mZF9vc3RyZWFtICZPUyk7CisKKyAgLy8vIFdyaXRlIFxjIFJlY29yZCBpbiB0ZXh0IGZvcm1hdCB0byBcYyBPUworICBzdGF0aWMgdm9pZCB3cml0ZVJlY29yZEluVGV4dChTdHJpbmdSZWYgTmFtZSwgdWludDY0X3QgSGFzaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5zdHJQcm9mUmVjb3JkICZDb3VudGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJQcm9mU3ltdGFiICZTeW10YWIsIHJhd19mZF9vc3RyZWFtICZPUyk7CisKKyAgLy8vIFdyaXRlIHRoZSBwcm9maWxlLCByZXR1cm5pbmcgdGhlIHJhdyBkYXRhLiBGb3IgdGVzdGluZy4KKyAgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gd3JpdGVCdWZmZXIoKTsKKworICAvLy8gU2V0IHRoZSBQcm9maWxlS2luZC4gUmVwb3J0IGVycm9yIGlmIG1peGluZyBGRSBhbmQgSVIgbGV2ZWwgcHJvZmlsZXMuCisgIEVycm9yIHNldElzSVJMZXZlbFByb2ZpbGUoYm9vbCBJc0lSTGV2ZWwpIHsKKyAgICBpZiAoUHJvZmlsZUtpbmQgPT0gUEZfVW5rbm93bikgeworICAgICAgUHJvZmlsZUtpbmQgPSBJc0lSTGV2ZWwgPyBQRl9JUkxldmVsOiBQRl9GRTsKKyAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICAgIH0KKyAgICByZXR1cm4gKElzSVJMZXZlbCA9PSAoUHJvZmlsZUtpbmQgPT0gUEZfSVJMZXZlbCkpCisgICAgICAgICAgICAgICA/IEVycm9yOjpzdWNjZXNzKCkKKyAgICAgICAgICAgICAgIDogbWFrZV9lcnJvcjxJbnN0clByb2ZFcnJvcj4oCisgICAgICAgICAgICAgICAgICAgICBpbnN0cnByb2ZfZXJyb3I6OnVuc3VwcG9ydGVkX3ZlcnNpb24pOworICB9CisKKyAgLy8gSW50ZXJuYWwgaW50ZXJmYWNlIGZvciB0ZXN0aW5nIHB1cnBvc2Ugb25seS4KKyAgdm9pZCBzZXRWYWx1ZVByb2ZEYXRhRW5kaWFubmVzcyhzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbm5lc3MpOworICB2b2lkIHNldE91dHB1dFNwYXJzZShib29sIFNwYXJzZSk7CisKK3ByaXZhdGU6CisgIHZvaWQgYWRkUmVjb3JkKFN0cmluZ1JlZiBOYW1lLCB1aW50NjRfdCBIYXNoLCBJbnN0clByb2ZSZWNvcmQgJiZJLAorICAgICAgICAgICAgICAgICB1aW50NjRfdCBXZWlnaHQsIGZ1bmN0aW9uX3JlZjx2b2lkKEVycm9yKT4gV2Fybik7CisgIGJvb2wgc2hvdWxkRW5jb2RlRGF0YShjb25zdCBQcm9maWxpbmdEYXRhICZQRCk7CisgIHZvaWQgd3JpdGVJbXBsKFByb2ZPU3RyZWFtICZPUyk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9QUk9GSUxFREFUQV9JTlNUUlBST0ZXUklURVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9Qcm9maWxlQ29tbW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL1Byb2ZpbGVDb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWIwNjViCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9Qcm9maWxlQ29tbW9uLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8vPT09LSBQcm9maWxlQ29tbW9uLmggLSBDb21tb24gcHJvZmlsaW5nIEFQSXMuIC0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGRhdGEgc3RydWN0dXJlcyBhbmQgZnVuY3Rpb25zIGNvbW1vbiB0byBib3RoIGluc3RydW1lbnRlZAorLy8gYW5kIHNhbXBsZSBwcm9maWxpbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1BST0ZJTEVEQVRBX1BST0ZJTEVDT01NT05fSAorI2RlZmluZSBMTFZNX1BST0ZJTEVEQVRBX1BST0ZJTEVDT01NT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Byb2ZpbGVTdW1tYXJ5LmgiCisjaW5jbHVkZSAibGx2bS9Qcm9maWxlRGF0YS9JbnN0clByb2YuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBzYW1wbGVwcm9mIHsKKworY2xhc3MgRnVuY3Rpb25TYW1wbGVzOworCit9IC8vIGVuZCBuYW1lc3BhY2Ugc2FtcGxlcHJvZgorCitpbmxpbmUgY29uc3QgY2hhciAqZ2V0SG90U2VjdGlvblByZWZpeCgpIHsgcmV0dXJuICIuaG90IjsgfQoraW5saW5lIGNvbnN0IGNoYXIgKmdldFVubGlrZWx5U2VjdGlvblByZWZpeCgpIHsgcmV0dXJuICIudW5saWtlbHkiOyB9CisKK2NsYXNzIFByb2ZpbGVTdW1tYXJ5QnVpbGRlciB7Citwcml2YXRlOgorICAvLy8gV2Uga2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIHRpbWVzIGEgY291bnQgKGJsb2NrIGNvdW50IG9yIHNhbXBsZXMpCisgIC8vLyBhcHBlYXJzIGluIHRoZSBwcm9maWxlLiBUaGUgbWFwIGlzIGtlcHQgc29ydGVkIGluIHRoZSBkZXNjZW5kaW5nIG9yZGVyIG9mCisgIC8vLyBjb3VudHMuCisgIHN0ZDo6bWFwPHVpbnQ2NF90LCB1aW50MzJfdCwgc3RkOjpncmVhdGVyPHVpbnQ2NF90Pj4gQ291bnRGcmVxdWVuY2llczsKKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IERldGFpbGVkU3VtbWFyeUN1dG9mZnM7CisKK3Byb3RlY3RlZDoKKyAgU3VtbWFyeUVudHJ5VmVjdG9yIERldGFpbGVkU3VtbWFyeTsKKyAgdWludDY0X3QgVG90YWxDb3VudCA9IDA7CisgIHVpbnQ2NF90IE1heENvdW50ID0gMDsKKyAgdWludDY0X3QgTWF4RnVuY3Rpb25Db3VudCA9IDA7CisgIHVpbnQzMl90IE51bUNvdW50cyA9IDA7CisgIHVpbnQzMl90IE51bUZ1bmN0aW9ucyA9IDA7CisKKyAgUHJvZmlsZVN1bW1hcnlCdWlsZGVyKHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBDdXRvZmZzKQorICAgICAgOiBEZXRhaWxlZFN1bW1hcnlDdXRvZmZzKHN0ZDo6bW92ZShDdXRvZmZzKSkge30KKyAgflByb2ZpbGVTdW1tYXJ5QnVpbGRlcigpID0gZGVmYXVsdDsKKworICBpbmxpbmUgdm9pZCBhZGRDb3VudCh1aW50NjRfdCBDb3VudCk7CisgIHZvaWQgY29tcHV0ZURldGFpbGVkU3VtbWFyeSgpOworCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQSB2ZWN0b3Igb2YgdXNlZnVsIGN1dG9mZiB2YWx1ZXMgZm9yIGRldGFpbGVkIHN1bW1hcnkuCisgIHN0YXRpYyBjb25zdCBBcnJheVJlZjx1aW50MzJfdD4gRGVmYXVsdEN1dG9mZnM7Cit9OworCitjbGFzcyBJbnN0clByb2ZTdW1tYXJ5QnVpbGRlciBmaW5hbCA6IHB1YmxpYyBQcm9maWxlU3VtbWFyeUJ1aWxkZXIgeworICB1aW50NjRfdCBNYXhJbnRlcm5hbEJsb2NrQ291bnQgPSAwOworCisgIGlubGluZSB2b2lkIGFkZEVudHJ5Q291bnQodWludDY0X3QgQ291bnQpOworICBpbmxpbmUgdm9pZCBhZGRJbnRlcm5hbENvdW50KHVpbnQ2NF90IENvdW50KTsKKworcHVibGljOgorICBJbnN0clByb2ZTdW1tYXJ5QnVpbGRlcihzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gQ3V0b2ZmcykKKyAgICAgIDogUHJvZmlsZVN1bW1hcnlCdWlsZGVyKHN0ZDo6bW92ZShDdXRvZmZzKSkge30KKworICB2b2lkIGFkZFJlY29yZChjb25zdCBJbnN0clByb2ZSZWNvcmQgJik7CisgIHN0ZDo6dW5pcXVlX3B0cjxQcm9maWxlU3VtbWFyeT4gZ2V0U3VtbWFyeSgpOworfTsKKworY2xhc3MgU2FtcGxlUHJvZmlsZVN1bW1hcnlCdWlsZGVyIGZpbmFsIDogcHVibGljIFByb2ZpbGVTdW1tYXJ5QnVpbGRlciB7CitwdWJsaWM6CisgIFNhbXBsZVByb2ZpbGVTdW1tYXJ5QnVpbGRlcihzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gQ3V0b2ZmcykKKyAgICAgIDogUHJvZmlsZVN1bW1hcnlCdWlsZGVyKHN0ZDo6bW92ZShDdXRvZmZzKSkge30KKworICB2b2lkIGFkZFJlY29yZChjb25zdCBzYW1wbGVwcm9mOjpGdW5jdGlvblNhbXBsZXMgJkZTKTsKKyAgc3RkOjp1bmlxdWVfcHRyPFByb2ZpbGVTdW1tYXJ5PiBnZXRTdW1tYXJ5KCk7Cit9OworCisvLy8gVGhpcyBpcyBjYWxsZWQgd2hlbiBhIGNvdW50IGlzIHNlZW4gaW4gdGhlIHByb2ZpbGUuCit2b2lkIFByb2ZpbGVTdW1tYXJ5QnVpbGRlcjo6YWRkQ291bnQodWludDY0X3QgQ291bnQpIHsKKyAgVG90YWxDb3VudCArPSBDb3VudDsKKyAgaWYgKENvdW50ID4gTWF4Q291bnQpCisgICAgTWF4Q291bnQgPSBDb3VudDsKKyAgTnVtQ291bnRzKys7CisgIENvdW50RnJlcXVlbmNpZXNbQ291bnRdKys7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1BST0ZJTEVEQVRBX1BST0ZJTEVDT01NT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9TYW1wbGVQcm9mLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL1NhbXBsZVByb2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzllZjNiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9TYW1wbGVQcm9mLmgKQEAgLTAsMCArMSw0NzEgQEAKKy8vPT09LSBTYW1wbGVQcm9mLmggLSBTYW1wbGluZyBwcm9maWxpbmcgZm9ybWF0IHN1cHBvcnQgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGNvbW1vbiBkZWZpbml0aW9ucyB1c2VkIGluIHRoZSByZWFkaW5nIGFuZCB3cml0aW5nIG9mCisvLyBzYW1wbGUgcHJvZmlsZSBkYXRhLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9QUk9GSUxFREFUQV9TQU1QTEVQUk9GX0gKKyNkZWZpbmUgTExWTV9QUk9GSUxFREFUQV9TQU1QTEVQUk9GX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9HbG9iYWxWYWx1ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yT3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK2NvbnN0IHN0ZDo6ZXJyb3JfY2F0ZWdvcnkgJnNhbXBsZXByb2ZfY2F0ZWdvcnkoKTsKKworZW51bSBjbGFzcyBzYW1wbGVwcm9mX2Vycm9yIHsKKyAgc3VjY2VzcyA9IDAsCisgIGJhZF9tYWdpYywKKyAgdW5zdXBwb3J0ZWRfdmVyc2lvbiwKKyAgdG9vX2xhcmdlLAorICB0cnVuY2F0ZWQsCisgIG1hbGZvcm1lZCwKKyAgdW5yZWNvZ25pemVkX2Zvcm1hdCwKKyAgdW5zdXBwb3J0ZWRfd3JpdGluZ19mb3JtYXQsCisgIHRydW5jYXRlZF9uYW1lX3RhYmxlLAorICBub3RfaW1wbGVtZW50ZWQsCisgIGNvdW50ZXJfb3ZlcmZsb3cKK307CisKK2lubGluZSBzdGQ6OmVycm9yX2NvZGUgbWFrZV9lcnJvcl9jb2RlKHNhbXBsZXByb2ZfZXJyb3IgRSkgeworICByZXR1cm4gc3RkOjplcnJvcl9jb2RlKHN0YXRpY19jYXN0PGludD4oRSksIHNhbXBsZXByb2ZfY2F0ZWdvcnkoKSk7Cit9CisKK2lubGluZSBzYW1wbGVwcm9mX2Vycm9yIE1lcmdlUmVzdWx0KHNhbXBsZXByb2ZfZXJyb3IgJkFjY3VtdWxhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2FtcGxlcHJvZl9lcnJvciBSZXN1bHQpIHsKKyAgLy8gUHJlZmVyIGZpcnN0IGVycm9yIGVuY291bnRlcmVkIGFzIGxhdGVyIGVycm9ycyBtYXkgYmUgc2Vjb25kYXJ5IGVmZmVjdHMgb2YKKyAgLy8gdGhlIGluaXRpYWwgcHJvYmxlbS4KKyAgaWYgKEFjY3VtdWxhdG9yID09IHNhbXBsZXByb2ZfZXJyb3I6OnN1Y2Nlc3MgJiYKKyAgICAgIFJlc3VsdCAhPSBzYW1wbGVwcm9mX2Vycm9yOjpzdWNjZXNzKQorICAgIEFjY3VtdWxhdG9yID0gUmVzdWx0OworICByZXR1cm4gQWNjdW11bGF0b3I7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKK25hbWVzcGFjZSBzdGQgeworCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGlzX2Vycm9yX2NvZGVfZW51bTxsbHZtOjpzYW1wbGVwcm9mX2Vycm9yPiA6IHN0ZDo6dHJ1ZV90eXBlIHt9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugc3RkCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBzYW1wbGVwcm9mIHsKKworc3RhdGljIGlubGluZSB1aW50NjRfdCBTUE1hZ2ljKCkgeworICByZXR1cm4gdWludDY0X3QoJ1MnKSA8PCAoNjQgLSA4KSB8IHVpbnQ2NF90KCdQJykgPDwgKDY0IC0gMTYpIHwKKyAgICAgICAgIHVpbnQ2NF90KCdSJykgPDwgKDY0IC0gMjQpIHwgdWludDY0X3QoJ08nKSA8PCAoNjQgLSAzMikgfAorICAgICAgICAgdWludDY0X3QoJ0YnKSA8PCAoNjQgLSA0MCkgfCB1aW50NjRfdCgnNCcpIDw8ICg2NCAtIDQ4KSB8CisgICAgICAgICB1aW50NjRfdCgnMicpIDw8ICg2NCAtIDU2KSB8IHVpbnQ2NF90KDB4ZmYpOworfQorCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IFNQVmVyc2lvbigpIHsgcmV0dXJuIDEwMzsgfQorCisvLy8gUmVwcmVzZW50cyB0aGUgcmVsYXRpdmUgbG9jYXRpb24gb2YgYW4gaW5zdHJ1Y3Rpb24uCisvLy8KKy8vLyBJbnN0cnVjdGlvbiBsb2NhdGlvbnMgYXJlIHNwZWNpZmllZCBieSB0aGUgbGluZSBvZmZzZXQgZnJvbSB0aGUKKy8vLyBiZWdpbm5pbmcgb2YgdGhlIGZ1bmN0aW9uIChtYXJrZWQgYnkgdGhlIGxpbmUgd2hlcmUgdGhlIGZ1bmN0aW9uCisvLy8gaGVhZGVyIGlzKSBhbmQgdGhlIGRpc2NyaW1pbmF0b3IgdmFsdWUgd2l0aGluIHRoYXQgbGluZS4KKy8vLworLy8vIFRoZSBkaXNjcmltaW5hdG9yIHZhbHVlIGlzIHVzZWZ1bCB0byBkaXN0aW5ndWlzaCBpbnN0cnVjdGlvbnMKKy8vLyB0aGF0IGFyZSBvbiB0aGUgc2FtZSBsaW5lIGJ1dCBiZWxvbmcgdG8gZGlmZmVyZW50IGJhc2ljIGJsb2NrcworLy8vIChlLmcuLCB0aGUgdHdvIHBvc3QtaW5jcmVtZW50IGluc3RydWN0aW9ucyBpbiAiaWYgKHApIHgrKzsgZWxzZSB5Kys7IikuCitzdHJ1Y3QgTGluZUxvY2F0aW9uIHsKKyAgTGluZUxvY2F0aW9uKHVpbnQzMl90IEwsIHVpbnQzMl90IEQpIDogTGluZU9mZnNldChMKSwgRGlzY3JpbWluYXRvcihEKSB7fQorCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgTGluZUxvY2F0aW9uICZPKSBjb25zdCB7CisgICAgcmV0dXJuIExpbmVPZmZzZXQgPCBPLkxpbmVPZmZzZXQgfHwKKyAgICAgICAgICAgKExpbmVPZmZzZXQgPT0gTy5MaW5lT2Zmc2V0ICYmIERpc2NyaW1pbmF0b3IgPCBPLkRpc2NyaW1pbmF0b3IpOworICB9CisKKyAgdWludDMyX3QgTGluZU9mZnNldDsKKyAgdWludDMyX3QgRGlzY3JpbWluYXRvcjsKK307CisKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgTGluZUxvY2F0aW9uICZMb2MpOworCisvLy8gUmVwcmVzZW50YXRpb24gb2YgYSBzaW5nbGUgc2FtcGxlIHJlY29yZC4KKy8vLworLy8vIEEgc2FtcGxlIHJlY29yZCBpcyByZXByZXNlbnRlZCBieSBhIHBvc2l0aXZlIGludGVnZXIgdmFsdWUsIHdoaWNoCisvLy8gaW5kaWNhdGVzIGhvdyBmcmVxdWVudGx5IHdhcyB0aGUgYXNzb2NpYXRlZCBsaW5lIGxvY2F0aW9uIGV4ZWN1dGVkLgorLy8vCisvLy8gQWRkaXRpb25hbGx5LCBpZiB0aGUgYXNzb2NpYXRlZCBsb2NhdGlvbiBjb250YWlucyBhIGZ1bmN0aW9uIGNhbGwsCisvLy8gdGhlIHJlY29yZCB3aWxsIGhvbGQgYSBsaXN0IG9mIGFsbCB0aGUgcG9zc2libGUgY2FsbGVkIHRhcmdldHMuIEZvcgorLy8vIGRpcmVjdCBjYWxscywgdGhpcyB3aWxsIGJlIHRoZSBleGFjdCBmdW5jdGlvbiBiZWluZyBpbnZva2VkLiBGb3IKKy8vLyBpbmRpcmVjdCBjYWxscyAoZnVuY3Rpb24gcG9pbnRlcnMsIHZpcnR1YWwgdGFibGUgZGlzcGF0Y2gpLCB0aGlzCisvLy8gd2lsbCBiZSBhIGxpc3Qgb2Ygb25lIG9yIG1vcmUgZnVuY3Rpb25zLgorY2xhc3MgU2FtcGxlUmVjb3JkIHsKK3B1YmxpYzoKKyAgdXNpbmcgQ2FsbFRhcmdldE1hcCA9IFN0cmluZ01hcDx1aW50NjRfdD47CisKKyAgU2FtcGxlUmVjb3JkKCkgPSBkZWZhdWx0OworCisgIC8vLyBJbmNyZW1lbnQgdGhlIG51bWJlciBvZiBzYW1wbGVzIGZvciB0aGlzIHJlY29yZCBieSBccCBTLgorICAvLy8gT3B0aW9uYWxseSBzY2FsZSBzYW1wbGUgY291bnQgXHAgUyBieSBccCBXZWlnaHQuCisgIC8vLworICAvLy8gU2FtcGxlIGNvdW50cyBhY2N1bXVsYXRlIHVzaW5nIHNhdHVyYXRpbmcgYXJpdGhtZXRpYywgdG8gYXZvaWQgd3JhcHBpbmcKKyAgLy8vIGFyb3VuZCB1bnNpZ25lZCBpbnRlZ2Vycy4KKyAgc2FtcGxlcHJvZl9lcnJvciBhZGRTYW1wbGVzKHVpbnQ2NF90IFMsIHVpbnQ2NF90IFdlaWdodCA9IDEpIHsKKyAgICBib29sIE92ZXJmbG93ZWQ7CisgICAgTnVtU2FtcGxlcyA9IFNhdHVyYXRpbmdNdWx0aXBseUFkZChTLCBXZWlnaHQsIE51bVNhbXBsZXMsICZPdmVyZmxvd2VkKTsKKyAgICByZXR1cm4gT3ZlcmZsb3dlZCA/IHNhbXBsZXByb2ZfZXJyb3I6OmNvdW50ZXJfb3ZlcmZsb3cKKyAgICAgICAgICAgICAgICAgICAgICA6IHNhbXBsZXByb2ZfZXJyb3I6OnN1Y2Nlc3M7CisgIH0KKworICAvLy8gQWRkIGNhbGxlZCBmdW5jdGlvbiBccCBGIHdpdGggc2FtcGxlcyBccCBTLgorICAvLy8gT3B0aW9uYWxseSBzY2FsZSBzYW1wbGUgY291bnQgXHAgUyBieSBccCBXZWlnaHQuCisgIC8vLworICAvLy8gU2FtcGxlIGNvdW50cyBhY2N1bXVsYXRlIHVzaW5nIHNhdHVyYXRpbmcgYXJpdGhtZXRpYywgdG8gYXZvaWQgd3JhcHBpbmcKKyAgLy8vIGFyb3VuZCB1bnNpZ25lZCBpbnRlZ2Vycy4KKyAgc2FtcGxlcHJvZl9lcnJvciBhZGRDYWxsZWRUYXJnZXQoU3RyaW5nUmVmIEYsIHVpbnQ2NF90IFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFdlaWdodCA9IDEpIHsKKyAgICB1aW50NjRfdCAmVGFyZ2V0U2FtcGxlcyA9IENhbGxUYXJnZXRzW0ZdOworICAgIGJvb2wgT3ZlcmZsb3dlZDsKKyAgICBUYXJnZXRTYW1wbGVzID0KKyAgICAgICAgU2F0dXJhdGluZ011bHRpcGx5QWRkKFMsIFdlaWdodCwgVGFyZ2V0U2FtcGxlcywgJk92ZXJmbG93ZWQpOworICAgIHJldHVybiBPdmVyZmxvd2VkID8gc2FtcGxlcHJvZl9lcnJvcjo6Y291bnRlcl9vdmVyZmxvdworICAgICAgICAgICAgICAgICAgICAgIDogc2FtcGxlcHJvZl9lcnJvcjo6c3VjY2VzczsKKyAgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIHNhbXBsZSByZWNvcmQgY29udGFpbnMgZnVuY3Rpb24gY2FsbHMuCisgIGJvb2wgaGFzQ2FsbHMoKSBjb25zdCB7IHJldHVybiAhQ2FsbFRhcmdldHMuZW1wdHkoKTsgfQorCisgIHVpbnQ2NF90IGdldFNhbXBsZXMoKSBjb25zdCB7IHJldHVybiBOdW1TYW1wbGVzOyB9CisgIGNvbnN0IENhbGxUYXJnZXRNYXAgJmdldENhbGxUYXJnZXRzKCkgY29uc3QgeyByZXR1cm4gQ2FsbFRhcmdldHM7IH0KKworICAvLy8gTWVyZ2UgdGhlIHNhbXBsZXMgaW4gXHAgT3RoZXIgaW50byB0aGlzIHJlY29yZC4KKyAgLy8vIE9wdGlvbmFsbHkgc2NhbGUgc2FtcGxlIGNvdW50cyBieSBccCBXZWlnaHQuCisgIHNhbXBsZXByb2ZfZXJyb3IgbWVyZ2UoY29uc3QgU2FtcGxlUmVjb3JkICZPdGhlciwgdWludDY0X3QgV2VpZ2h0ID0gMSkgeworICAgIHNhbXBsZXByb2ZfZXJyb3IgUmVzdWx0ID0gYWRkU2FtcGxlcyhPdGhlci5nZXRTYW1wbGVzKCksIFdlaWdodCk7CisgICAgZm9yIChjb25zdCBhdXRvICZJIDogT3RoZXIuZ2V0Q2FsbFRhcmdldHMoKSkgeworICAgICAgTWVyZ2VSZXN1bHQoUmVzdWx0LCBhZGRDYWxsZWRUYXJnZXQoSS5maXJzdCgpLCBJLnNlY29uZCwgV2VpZ2h0KSk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgdW5zaWduZWQgSW5kZW50KSBjb25zdDsKKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIHVpbnQ2NF90IE51bVNhbXBsZXMgPSAwOworICBDYWxsVGFyZ2V0TWFwIENhbGxUYXJnZXRzOworfTsKKworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBTYW1wbGVSZWNvcmQgJlNhbXBsZSk7CisKK2NsYXNzIEZ1bmN0aW9uU2FtcGxlczsKKwordXNpbmcgQm9keVNhbXBsZU1hcCA9IHN0ZDo6bWFwPExpbmVMb2NhdGlvbiwgU2FtcGxlUmVjb3JkPjsKKy8vIE5PVEU6IFVzaW5nIGEgU3RyaW5nTWFwIGhlcmUgbWFrZXMgcGFyc2VkIHByb2ZpbGVzIGNvbnN1bWUgYXJvdW5kIDE3JSBtb3JlCisvLyBtZW1vcnksIHdoaWNoIGlzICp2ZXJ5KiBzaWduaWZpY2FudCBmb3IgbGFyZ2UgcHJvZmlsZXMuCit1c2luZyBGdW5jdGlvblNhbXBsZXNNYXAgPSBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgRnVuY3Rpb25TYW1wbGVzPjsKK3VzaW5nIENhbGxzaXRlU2FtcGxlTWFwID0gc3RkOjptYXA8TGluZUxvY2F0aW9uLCBGdW5jdGlvblNhbXBsZXNNYXA+OworCisvLy8gUmVwcmVzZW50YXRpb24gb2YgdGhlIHNhbXBsZXMgY29sbGVjdGVkIGZvciBhIGZ1bmN0aW9uLgorLy8vCisvLy8gVGhpcyBkYXRhIHN0cnVjdHVyZSBjb250YWlucyBhbGwgdGhlIGNvbGxlY3RlZCBzYW1wbGVzIGZvciB0aGUgYm9keQorLy8vIG9mIGEgZnVuY3Rpb24uIEVhY2ggc2FtcGxlIGNvcnJlc3BvbmRzIHRvIGEgTGluZUxvY2F0aW9uIGluc3RhbmNlCisvLy8gd2l0aGluIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbi4KK2NsYXNzIEZ1bmN0aW9uU2FtcGxlcyB7CitwdWJsaWM6CisgIEZ1bmN0aW9uU2FtcGxlcygpID0gZGVmYXVsdDsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUyA9IGRiZ3MoKSwgdW5zaWduZWQgSW5kZW50ID0gMCkgY29uc3Q7CisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIHNhbXBsZXByb2ZfZXJyb3IgYWRkVG90YWxTYW1wbGVzKHVpbnQ2NF90IE51bSwgdWludDY0X3QgV2VpZ2h0ID0gMSkgeworICAgIGJvb2wgT3ZlcmZsb3dlZDsKKyAgICBUb3RhbFNhbXBsZXMgPQorICAgICAgICBTYXR1cmF0aW5nTXVsdGlwbHlBZGQoTnVtLCBXZWlnaHQsIFRvdGFsU2FtcGxlcywgJk92ZXJmbG93ZWQpOworICAgIHJldHVybiBPdmVyZmxvd2VkID8gc2FtcGxlcHJvZl9lcnJvcjo6Y291bnRlcl9vdmVyZmxvdworICAgICAgICAgICAgICAgICAgICAgIDogc2FtcGxlcHJvZl9lcnJvcjo6c3VjY2VzczsKKyAgfQorCisgIHNhbXBsZXByb2ZfZXJyb3IgYWRkSGVhZFNhbXBsZXModWludDY0X3QgTnVtLCB1aW50NjRfdCBXZWlnaHQgPSAxKSB7CisgICAgYm9vbCBPdmVyZmxvd2VkOworICAgIFRvdGFsSGVhZFNhbXBsZXMgPQorICAgICAgICBTYXR1cmF0aW5nTXVsdGlwbHlBZGQoTnVtLCBXZWlnaHQsIFRvdGFsSGVhZFNhbXBsZXMsICZPdmVyZmxvd2VkKTsKKyAgICByZXR1cm4gT3ZlcmZsb3dlZCA/IHNhbXBsZXByb2ZfZXJyb3I6OmNvdW50ZXJfb3ZlcmZsb3cKKyAgICAgICAgICAgICAgICAgICAgICA6IHNhbXBsZXByb2ZfZXJyb3I6OnN1Y2Nlc3M7CisgIH0KKworICBzYW1wbGVwcm9mX2Vycm9yIGFkZEJvZHlTYW1wbGVzKHVpbnQzMl90IExpbmVPZmZzZXQsIHVpbnQzMl90IERpc2NyaW1pbmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgTnVtLCB1aW50NjRfdCBXZWlnaHQgPSAxKSB7CisgICAgcmV0dXJuIEJvZHlTYW1wbGVzW0xpbmVMb2NhdGlvbihMaW5lT2Zmc2V0LCBEaXNjcmltaW5hdG9yKV0uYWRkU2FtcGxlcygKKyAgICAgICAgTnVtLCBXZWlnaHQpOworICB9CisKKyAgc2FtcGxlcHJvZl9lcnJvciBhZGRDYWxsZWRUYXJnZXRTYW1wbGVzKHVpbnQzMl90IExpbmVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBEaXNjcmltaW5hdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZOYW1lLCB1aW50NjRfdCBOdW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBXZWlnaHQgPSAxKSB7CisgICAgcmV0dXJuIEJvZHlTYW1wbGVzW0xpbmVMb2NhdGlvbihMaW5lT2Zmc2V0LCBEaXNjcmltaW5hdG9yKV0uYWRkQ2FsbGVkVGFyZ2V0KAorICAgICAgICBGTmFtZSwgTnVtLCBXZWlnaHQpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHNhbXBsZXMgY29sbGVjdGVkIGF0IHRoZSBnaXZlbiBsb2NhdGlvbi4KKyAgLy8vIEVhY2ggbG9jYXRpb24gaXMgc3BlY2lmaWVkIGJ5IFxwIExpbmVPZmZzZXQgYW5kIFxwIERpc2NyaW1pbmF0b3IuCisgIC8vLyBJZiB0aGUgbG9jYXRpb24gaXMgbm90IGZvdW5kIGluIHByb2ZpbGUsIHJldHVybiBlcnJvci4KKyAgRXJyb3JPcjx1aW50NjRfdD4gZmluZFNhbXBsZXNBdCh1aW50MzJfdCBMaW5lT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IERpc2NyaW1pbmF0b3IpIGNvbnN0IHsKKyAgICBjb25zdCBhdXRvICZyZXQgPSBCb2R5U2FtcGxlcy5maW5kKExpbmVMb2NhdGlvbihMaW5lT2Zmc2V0LCBEaXNjcmltaW5hdG9yKSk7CisgICAgaWYgKHJldCA9PSBCb2R5U2FtcGxlcy5lbmQoKSkKKyAgICAgIHJldHVybiBzdGQ6OmVycm9yX2NvZGUoKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gcmV0LT5zZWNvbmQuZ2V0U2FtcGxlcygpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIGNhbGwgdGFyZ2V0IG1hcCBjb2xsZWN0ZWQgYXQgYSBnaXZlbiBsb2NhdGlvbi4KKyAgLy8vIEVhY2ggbG9jYXRpb24gaXMgc3BlY2lmaWVkIGJ5IFxwIExpbmVPZmZzZXQgYW5kIFxwIERpc2NyaW1pbmF0b3IuCisgIC8vLyBJZiB0aGUgbG9jYXRpb24gaXMgbm90IGZvdW5kIGluIHByb2ZpbGUsIHJldHVybiBlcnJvci4KKyAgRXJyb3JPcjxTYW1wbGVSZWNvcmQ6OkNhbGxUYXJnZXRNYXA+CisgIGZpbmRDYWxsVGFyZ2V0TWFwQXQodWludDMyX3QgTGluZU9mZnNldCwgdWludDMyX3QgRGlzY3JpbWluYXRvcikgY29uc3QgeworICAgIGNvbnN0IGF1dG8gJnJldCA9IEJvZHlTYW1wbGVzLmZpbmQoTGluZUxvY2F0aW9uKExpbmVPZmZzZXQsIERpc2NyaW1pbmF0b3IpKTsKKyAgICBpZiAocmV0ID09IEJvZHlTYW1wbGVzLmVuZCgpKQorICAgICAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOworICAgIHJldHVybiByZXQtPnNlY29uZC5nZXRDYWxsVGFyZ2V0cygpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgZnVuY3Rpb24gc2FtcGxlcyBhdCB0aGUgZ2l2ZW4gY2FsbHNpdGUgbG9jYXRpb24uCisgIEZ1bmN0aW9uU2FtcGxlc01hcCAmZnVuY3Rpb25TYW1wbGVzQXQoY29uc3QgTGluZUxvY2F0aW9uICZMb2MpIHsKKyAgICByZXR1cm4gQ2FsbHNpdGVTYW1wbGVzW0xvY107CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgRnVuY3Rpb25TYW1wbGVzTWFwIGF0IHRoZSBnaXZlbiBccCBMb2MuCisgIGNvbnN0IEZ1bmN0aW9uU2FtcGxlc01hcCAqCisgIGZpbmRGdW5jdGlvblNhbXBsZXNNYXBBdChjb25zdCBMaW5lTG9jYXRpb24gJkxvYykgY29uc3QgeworICAgIGF1dG8gaXRlciA9IENhbGxzaXRlU2FtcGxlcy5maW5kKExvYyk7CisgICAgaWYgKGl0ZXIgPT0gQ2FsbHNpdGVTYW1wbGVzLmVuZCgpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuICZpdGVyLT5zZWNvbmQ7CisgIH0KKworICAvLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gRnVuY3Rpb25TYW1wbGVzIGF0IHRoZSBnaXZlbiBjYWxsc2l0ZSBsb2NhdGlvbiBccCBMb2MKKyAgLy8vIHdpdGggY2FsbGVlIFxwIENhbGxlZU5hbWUuIElmIG5vIGNhbGxzaXRlIGNhbiBiZSBmb3VuZCwgcmVsYXggdGhlCisgIC8vLyByZXN0cmljdGlvbiB0byByZXR1cm4gdGhlIEZ1bmN0aW9uU2FtcGxlcyBhdCBjYWxsc2l0ZSBsb2NhdGlvbiBccCBMb2MKKyAgLy8vIHdpdGggdGhlIG1heGltdW0gdG90YWwgc2FtcGxlIGNvdW50LgorICBjb25zdCBGdW5jdGlvblNhbXBsZXMgKmZpbmRGdW5jdGlvblNhbXBsZXNBdChjb25zdCBMaW5lTG9jYXRpb24gJkxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIENhbGxlZU5hbWUpIGNvbnN0IHsKKyAgICBhdXRvIGl0ZXIgPSBDYWxsc2l0ZVNhbXBsZXMuZmluZChMb2MpOworICAgIGlmIChpdGVyID09IENhbGxzaXRlU2FtcGxlcy5lbmQoKSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIGF1dG8gRlMgPSBpdGVyLT5zZWNvbmQuZmluZChDYWxsZWVOYW1lKTsKKyAgICBpZiAoRlMgIT0gaXRlci0+c2Vjb25kLmVuZCgpKQorICAgICAgcmV0dXJuICZGUy0+c2Vjb25kOworICAgIC8vIElmIHdlIGNhbm5vdCBmaW5kIGV4YWN0IG1hdGNoIG9mIHRoZSBjYWxsZWUgbmFtZSwgcmV0dXJuIHRoZSBGUyB3aXRoCisgICAgLy8gdGhlIG1heCB0b3RhbCBjb3VudC4KKyAgICB1aW50NjRfdCBNYXhUb3RhbFNhbXBsZXMgPSAwOworICAgIGNvbnN0IEZ1bmN0aW9uU2FtcGxlcyAqUiA9IG51bGxwdHI7CisgICAgZm9yIChjb25zdCBhdXRvICZOYW1lRlMgOiBpdGVyLT5zZWNvbmQpCisgICAgICBpZiAoTmFtZUZTLnNlY29uZC5nZXRUb3RhbFNhbXBsZXMoKSA+PSBNYXhUb3RhbFNhbXBsZXMpIHsKKyAgICAgICAgTWF4VG90YWxTYW1wbGVzID0gTmFtZUZTLnNlY29uZC5nZXRUb3RhbFNhbXBsZXMoKTsKKyAgICAgICAgUiA9ICZOYW1lRlMuc2Vjb25kOworICAgICAgfQorICAgIHJldHVybiBSOworICB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFRvdGFsU2FtcGxlcyA9PSAwOyB9CisKKyAgLy8vIFJldHVybiB0aGUgdG90YWwgbnVtYmVyIG9mIHNhbXBsZXMgY29sbGVjdGVkIGluc2lkZSB0aGUgZnVuY3Rpb24uCisgIHVpbnQ2NF90IGdldFRvdGFsU2FtcGxlcygpIGNvbnN0IHsgcmV0dXJuIFRvdGFsU2FtcGxlczsgfQorCisgIC8vLyBSZXR1cm4gdGhlIHRvdGFsIG51bWJlciBvZiBicmFuY2ggc2FtcGxlcyB0aGF0IGhhdmUgdGhlIGZ1bmN0aW9uIGFzIHRoZQorICAvLy8gYnJhbmNoIHRhcmdldC4gVGhpcyBzaG91bGQgYmUgZXF1aXZhbGVudCB0byB0aGUgc2FtcGxlIG9mIHRoZSBmaXJzdAorICAvLy8gaW5zdHJ1Y3Rpb24gb2YgdGhlIHN5bWJvbC4gQnV0IGFzIHdlIGRpcmVjdGx5IGdldCB0aGlzIGluZm8gZm9yIHJhdworICAvLy8gcHJvZmlsZSB3aXRob3V0IHJlZmVycmluZyB0byBwb3RlbnRpYWxseSBpbmFjY3VyYXRlIGRlYnVnIGluZm8sIHRoaXMKKyAgLy8vIGdpdmVzIG1vcmUgYWNjdXJhdGUgcHJvZmlsZSBkYXRhIGFuZCBpcyBwcmVmZXJyZWQgZm9yIHN0YW5kYWxvbmUgc3ltYm9scy4KKyAgdWludDY0X3QgZ2V0SGVhZFNhbXBsZXMoKSBjb25zdCB7IHJldHVybiBUb3RhbEhlYWRTYW1wbGVzOyB9CisKKyAgLy8vIFJldHVybiB0aGUgc2FtcGxlIGNvdW50IG9mIHRoZSBmaXJzdCBpbnN0cnVjdGlvbiBvZiB0aGUgZnVuY3Rpb24uCisgIC8vLyBUaGUgZnVuY3Rpb24gY2FuIGJlIGVpdGhlciBhIHN0YW5kYWxvbmUgc3ltYm9sIG9yIGFuIGlubGluZWQgZnVuY3Rpb24uCisgIHVpbnQ2NF90IGdldEVudHJ5U2FtcGxlcygpIGNvbnN0IHsKKyAgICAvLyBVc2UgZWl0aGVyIEJvZHlTYW1wbGVzIG9yIENhbGxzaXRlU2FtcGxlcyB3aGljaCBldmVyIGhhcyB0aGUgc21hbGxlcgorICAgIC8vIGxpbmVuby4KKyAgICBpZiAoIUJvZHlTYW1wbGVzLmVtcHR5KCkgJiYKKyAgICAgICAgKENhbGxzaXRlU2FtcGxlcy5lbXB0eSgpIHx8CisgICAgICAgICBCb2R5U2FtcGxlcy5iZWdpbigpLT5maXJzdCA8IENhbGxzaXRlU2FtcGxlcy5iZWdpbigpLT5maXJzdCkpCisgICAgICByZXR1cm4gQm9keVNhbXBsZXMuYmVnaW4oKS0+c2Vjb25kLmdldFNhbXBsZXMoKTsKKyAgICBpZiAoIUNhbGxzaXRlU2FtcGxlcy5lbXB0eSgpKSB7CisgICAgICB1aW50NjRfdCBUID0gMDsKKyAgICAgIC8vIEFuIGluZGlyZWN0IGNhbGxzaXRlIG1heSBiZSBwcm9tb3RlZCB0byBzZXZlcmFsIGlubGluZWQgZGlyZWN0IGNhbGxzLgorICAgICAgLy8gV2UgbmVlZCB0byBnZXQgdGhlIHN1bSBvZiB0aGVtLgorICAgICAgZm9yIChjb25zdCBhdXRvICZOX0ZTIDogQ2FsbHNpdGVTYW1wbGVzLmJlZ2luKCktPnNlY29uZCkKKyAgICAgICAgVCArPSBOX0ZTLnNlY29uZC5nZXRFbnRyeVNhbXBsZXMoKTsKKyAgICAgIHJldHVybiBUOworICAgIH0KKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBSZXR1cm4gYWxsIHRoZSBzYW1wbGVzIGNvbGxlY3RlZCBpbiB0aGUgYm9keSBvZiB0aGUgZnVuY3Rpb24uCisgIGNvbnN0IEJvZHlTYW1wbGVNYXAgJmdldEJvZHlTYW1wbGVzKCkgY29uc3QgeyByZXR1cm4gQm9keVNhbXBsZXM7IH0KKworICAvLy8gUmV0dXJuIGFsbCB0aGUgY2FsbHNpdGUgc2FtcGxlcyBjb2xsZWN0ZWQgaW4gdGhlIGJvZHkgb2YgdGhlIGZ1bmN0aW9uLgorICBjb25zdCBDYWxsc2l0ZVNhbXBsZU1hcCAmZ2V0Q2FsbHNpdGVTYW1wbGVzKCkgY29uc3QgeworICAgIHJldHVybiBDYWxsc2l0ZVNhbXBsZXM7CisgIH0KKworICAvLy8gTWVyZ2UgdGhlIHNhbXBsZXMgaW4gXHAgT3RoZXIgaW50byB0aGlzIG9uZS4KKyAgLy8vIE9wdGlvbmFsbHkgc2NhbGUgc2FtcGxlcyBieSBccCBXZWlnaHQuCisgIHNhbXBsZXByb2ZfZXJyb3IgbWVyZ2UoY29uc3QgRnVuY3Rpb25TYW1wbGVzICZPdGhlciwgdWludDY0X3QgV2VpZ2h0ID0gMSkgeworICAgIHNhbXBsZXByb2ZfZXJyb3IgUmVzdWx0ID0gc2FtcGxlcHJvZl9lcnJvcjo6c3VjY2VzczsKKyAgICBOYW1lID0gT3RoZXIuZ2V0TmFtZSgpOworICAgIE1lcmdlUmVzdWx0KFJlc3VsdCwgYWRkVG90YWxTYW1wbGVzKE90aGVyLmdldFRvdGFsU2FtcGxlcygpLCBXZWlnaHQpKTsKKyAgICBNZXJnZVJlc3VsdChSZXN1bHQsIGFkZEhlYWRTYW1wbGVzKE90aGVyLmdldEhlYWRTYW1wbGVzKCksIFdlaWdodCkpOworICAgIGZvciAoY29uc3QgYXV0byAmSSA6IE90aGVyLmdldEJvZHlTYW1wbGVzKCkpIHsKKyAgICAgIGNvbnN0IExpbmVMb2NhdGlvbiAmTG9jID0gSS5maXJzdDsKKyAgICAgIGNvbnN0IFNhbXBsZVJlY29yZCAmUmVjID0gSS5zZWNvbmQ7CisgICAgICBNZXJnZVJlc3VsdChSZXN1bHQsIEJvZHlTYW1wbGVzW0xvY10ubWVyZ2UoUmVjLCBXZWlnaHQpKTsKKyAgICB9CisgICAgZm9yIChjb25zdCBhdXRvICZJIDogT3RoZXIuZ2V0Q2FsbHNpdGVTYW1wbGVzKCkpIHsKKyAgICAgIGNvbnN0IExpbmVMb2NhdGlvbiAmTG9jID0gSS5maXJzdDsKKyAgICAgIEZ1bmN0aW9uU2FtcGxlc01hcCAmRlNNYXAgPSBmdW5jdGlvblNhbXBsZXNBdChMb2MpOworICAgICAgZm9yIChjb25zdCBhdXRvICZSZWMgOiBJLnNlY29uZCkKKyAgICAgICAgTWVyZ2VSZXN1bHQoUmVzdWx0LCBGU01hcFtSZWMuZmlyc3RdLm1lcmdlKFJlYy5zZWNvbmQsIFdlaWdodCkpOworICAgIH0KKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgLy8vIFJlY3Vyc2l2ZWx5IHRyYXZlcnNlcyBhbGwgY2hpbGRyZW4sIGlmIHRoZSB0b3RhbCBzYW1wbGUgY291bnQgb2YgdGhlCisgIC8vLyBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uIGlzIG5vIGxlc3MgdGhhbiBccCBUaHJlc2hvbGQsIGFkZCBpdHMgY29ycmVzcG9uZGluZworICAvLy8gR1VJRCB0byBccCBTLiBBbHNvIHRyYXZlcnNlIHRoZSBCb2R5U2FtcGxlcyB0byBhZGQgaG90IENhbGxUYXJnZXQncyBHVUlECisgIC8vLyB0byBccCBTLgorICB2b2lkIGZpbmRJbmxpbmVkRnVuY3Rpb25zKERlbnNlU2V0PEdsb2JhbFZhbHVlOjpHVUlEPiAmUywgY29uc3QgTW9kdWxlICpNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFRocmVzaG9sZCkgY29uc3QgeworICAgIGlmIChUb3RhbFNhbXBsZXMgPD0gVGhyZXNob2xkKQorICAgICAgcmV0dXJuOworICAgIFMuaW5zZXJ0KEZ1bmN0aW9uOjpnZXRHVUlEKE5hbWUpKTsKKyAgICAvLyBJbXBvcnQgaG90IENhbGxUYXJnZXRzLCB3aGljaCBtYXkgbm90IGJlIGF2YWlsYWJsZSBpbiBJUiBiZWNhdXNlIGZ1bGwKKyAgICAvLyBwcm9maWxlIGFubm90YXRpb24gY2Fubm90IGJlIGRvbmUgdW50aWwgYmFja2VuZCBjb21waWxhdGlvbiBpbiBUaGluTFRPLgorICAgIGZvciAoY29uc3QgYXV0byAmQlMgOiBCb2R5U2FtcGxlcykKKyAgICAgIGZvciAoY29uc3QgYXV0byAmVFMgOiBCUy5zZWNvbmQuZ2V0Q2FsbFRhcmdldHMoKSkKKyAgICAgICAgaWYgKFRTLmdldFZhbHVlKCkgPiBUaHJlc2hvbGQpIHsKKyAgICAgICAgICBGdW5jdGlvbiAqQ2FsbGVlID0gTS0+Z2V0RnVuY3Rpb24oVFMuZ2V0S2V5KCkpOworICAgICAgICAgIGlmICghQ2FsbGVlIHx8ICFDYWxsZWUtPmdldFN1YnByb2dyYW0oKSkKKyAgICAgICAgICAgIFMuaW5zZXJ0KEZ1bmN0aW9uOjpnZXRHVUlEKFRTLmdldEtleSgpKSk7CisgICAgICAgIH0KKyAgICBmb3IgKGNvbnN0IGF1dG8gJkNTIDogQ2FsbHNpdGVTYW1wbGVzKQorICAgICAgZm9yIChjb25zdCBhdXRvICZOYW1lRlMgOiBDUy5zZWNvbmQpCisgICAgICAgIE5hbWVGUy5zZWNvbmQuZmluZElubGluZWRGdW5jdGlvbnMoUywgTSwgVGhyZXNob2xkKTsKKyAgfQorCisgIC8vLyBTZXQgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uLgorICB2b2lkIHNldE5hbWUoU3RyaW5nUmVmIEZ1bmN0aW9uTmFtZSkgeyBOYW1lID0gRnVuY3Rpb25OYW1lOyB9CisKKyAgLy8vIFJldHVybiB0aGUgZnVuY3Rpb24gbmFtZS4KKyAgY29uc3QgU3RyaW5nUmVmICZnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBsaW5lIG9mZnNldCB0byB0aGUgc3RhcnQgbGluZSBvZiB0aGUgc3VicHJvZ3JhbS4KKyAgLy8vIFdlIGFzc3VtZSB0aGF0IGEgc2luZ2xlIGZ1bmN0aW9uIHdpbGwgbm90IGV4Y2VlZCA2NTUzNSBMT0MuCisgIHN0YXRpYyB1bnNpZ25lZCBnZXRPZmZzZXQoY29uc3QgRElMb2NhdGlvbiAqRElMKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgRnVuY3Rpb25TYW1wbGVzIG9mIHRoZSBpbmxpbmUgaW5zdGFuY2Ugd2hlcmUgRElMIG9yaWdpbmF0ZXMKKyAgLy8vIGZyb20uCisgIC8vLworICAvLy8gVGhlIEZ1bmN0aW9uU2FtcGxlcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gKE1hY2hpbmUgb3IgSVIpIGFzc29jaWF0ZWQgdG8KKyAgLy8vIFxwIERJTCBpcyB0aGUgaW5saW5lZCBpbnN0YW5jZSBpbiB3aGljaCB0aGF0IGluc3RydWN0aW9uIGlzIGNvbWluZyBmcm9tLgorICAvLy8gV2UgdHJhdmVyc2UgdGhlIGlubGluZSBzdGFjayBvZiB0aGF0IGluc3RydWN0aW9uLCBhbmQgbWF0Y2ggaXQgd2l0aCB0aGUKKyAgLy8vIHRyZWUgbm9kZXMgaW4gdGhlIHByb2ZpbGUuCisgIC8vLworICAvLy8gXHJldHVybnMgdGhlIEZ1bmN0aW9uU2FtcGxlcyBwb2ludGVyIHRvIHRoZSBpbmxpbmVkIGluc3RhbmNlLgorICBjb25zdCBGdW5jdGlvblNhbXBsZXMgKmZpbmRGdW5jdGlvblNhbXBsZXMoY29uc3QgRElMb2NhdGlvbiAqRElMKSBjb25zdDsKKworcHJpdmF0ZToKKyAgLy8vIE1hbmdsZWQgbmFtZSBvZiB0aGUgZnVuY3Rpb24uCisgIFN0cmluZ1JlZiBOYW1lOworCisgIC8vLyBUb3RhbCBudW1iZXIgb2Ygc2FtcGxlcyBjb2xsZWN0ZWQgaW5zaWRlIHRoaXMgZnVuY3Rpb24uCisgIC8vLworICAvLy8gU2FtcGxlcyBhcmUgY3VtdWxhdGl2ZSwgdGhleSBpbmNsdWRlIGFsbCB0aGUgc2FtcGxlcyBjb2xsZWN0ZWQKKyAgLy8vIGluc2lkZSB0aGlzIGZ1bmN0aW9uIGFuZCBhbGwgaXRzIGlubGluZWQgY2FsbGVlcy4KKyAgdWludDY0X3QgVG90YWxTYW1wbGVzID0gMDsKKworICAvLy8gVG90YWwgbnVtYmVyIG9mIHNhbXBsZXMgY29sbGVjdGVkIGF0IHRoZSBoZWFkIG9mIHRoZSBmdW5jdGlvbi4KKyAgLy8vIFRoaXMgaXMgYW4gYXBwcm94aW1hdGlvbiBvZiB0aGUgbnVtYmVyIG9mIGNhbGxzIG1hZGUgdG8gdGhpcyBmdW5jdGlvbgorICAvLy8gYXQgcnVudGltZS4KKyAgdWludDY0X3QgVG90YWxIZWFkU2FtcGxlcyA9IDA7CisKKyAgLy8vIE1hcCBpbnN0cnVjdGlvbiBsb2NhdGlvbnMgdG8gY29sbGVjdGVkIHNhbXBsZXMuCisgIC8vLworICAvLy8gRWFjaCBlbnRyeSBpbiB0aGlzIG1hcCBjb250YWlucyB0aGUgbnVtYmVyIG9mIHNhbXBsZXMKKyAgLy8vIGNvbGxlY3RlZCBhdCB0aGUgY29ycmVzcG9uZGluZyBsaW5lIG9mZnNldC4gQWxsIGxpbmUgbG9jYXRpb25zCisgIC8vLyBhcmUgYW4gb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4KKyAgQm9keVNhbXBsZU1hcCBCb2R5U2FtcGxlczsKKworICAvLy8gTWFwIGNhbGwgc2l0ZXMgdG8gY29sbGVjdGVkIHNhbXBsZXMgZm9yIHRoZSBjYWxsZWQgZnVuY3Rpb24uCisgIC8vLworICAvLy8gRWFjaCBlbnRyeSBpbiB0aGlzIG1hcCBjb3JyZXNwb25kcyB0byBhbGwgdGhlIHNhbXBsZXMKKyAgLy8vIGNvbGxlY3RlZCBmb3IgdGhlIGlubGluZWQgZnVuY3Rpb24gY2FsbCBhdCB0aGUgZ2l2ZW4KKyAgLy8vIGxvY2F0aW9uLiBGb3IgZXhhbXBsZSwgZ2l2ZW46CisgIC8vLworICAvLy8gICAgIHZvaWQgZm9vKCkgeworICAvLy8gIDEgICAgYmFyKCk7CisgIC8vLyAgLi4uCisgIC8vLyAgOCAgICBiYXooKTsKKyAgLy8vICAgICB9CisgIC8vLworICAvLy8gSWYgdGhlIGJhcigpIGFuZCBiYXooKSBjYWxscyB3ZXJlIGlubGluZWQgaW5zaWRlIGZvbygpLCB0aGlzCisgIC8vLyBtYXAgd2lsbCBjb250YWluIHR3byBlbnRyaWVzLiAgT25lIGZvciBhbGwgdGhlIHNhbXBsZXMgY29sbGVjdGVkCisgIC8vLyBpbiB0aGUgY2FsbCB0byBiYXIoKSBhdCBsaW5lIG9mZnNldCAxLCB0aGUgb3RoZXIgZm9yIGFsbCB0aGUgc2FtcGxlcworICAvLy8gY29sbGVjdGVkIGluIHRoZSBjYWxsIHRvIGJheigpIGF0IGxpbmUgb2Zmc2V0IDguCisgIENhbGxzaXRlU2FtcGxlTWFwIENhbGxzaXRlU2FtcGxlczsKK307CisKK3Jhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgRnVuY3Rpb25TYW1wbGVzICZGUyk7CisKKy8vLyBTb3J0IGEgTG9jYXRpb25ULT5TYW1wbGVUIG1hcCBieSBMb2NhdGlvblQuCisvLy8KKy8vLyBJdCBwcm9kdWNlcyBhIHNvcnRlZCBsaXN0IG9mIDxMb2NhdGlvblQsIFNhbXBsZVQ+IHJlY29yZHMgYnkgYXNjZW5kaW5nCisvLy8gb3JkZXIgb2YgTG9jYXRpb25ULgordGVtcGxhdGUgPGNsYXNzIExvY2F0aW9uVCwgY2xhc3MgU2FtcGxlVD4gY2xhc3MgU2FtcGxlU29ydGVyIHsKK3B1YmxpYzoKKyAgdXNpbmcgU2FtcGxlc1dpdGhMb2MgPSBzdGQ6OnBhaXI8Y29uc3QgTG9jYXRpb25ULCBTYW1wbGVUPjsKKyAgdXNpbmcgU2FtcGxlc1dpdGhMb2NMaXN0ID0gU21hbGxWZWN0b3I8Y29uc3QgU2FtcGxlc1dpdGhMb2MgKiwgMjA+OworCisgIFNhbXBsZVNvcnRlcihjb25zdCBzdGQ6Om1hcDxMb2NhdGlvblQsIFNhbXBsZVQ+ICZTYW1wbGVzKSB7CisgICAgZm9yIChjb25zdCBhdXRvICZJIDogU2FtcGxlcykKKyAgICAgIFYucHVzaF9iYWNrKCZJKTsKKyAgICBzdGQ6OnN0YWJsZV9zb3J0KFYuYmVnaW4oKSwgVi5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgIFtdKGNvbnN0IFNhbXBsZXNXaXRoTG9jICpBLCBjb25zdCBTYW1wbGVzV2l0aExvYyAqQikgeworICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gQS0+Zmlyc3QgPCBCLT5maXJzdDsKKyAgICAgICAgICAgICAgICAgICAgIH0pOworICB9CisKKyAgY29uc3QgU2FtcGxlc1dpdGhMb2NMaXN0ICZnZXQoKSBjb25zdCB7IHJldHVybiBWOyB9CisKK3ByaXZhdGU6CisgIFNhbXBsZXNXaXRoTG9jTGlzdCBWOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHNhbXBsZXByb2YKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1BST0ZJTEVEQVRBX1NBTVBMRVBST0ZfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9TYW1wbGVQcm9mUmVhZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Byb2ZpbGVEYXRhL1NhbXBsZVByb2ZSZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTlhYjJkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9TYW1wbGVQcm9mUmVhZGVyLmgKQEAgLTAsMCArMSw0NjIgQEAKKy8vPT09LSBTYW1wbGVQcm9mUmVhZGVyLmggLSBSZWFkIExMVk0gc2FtcGxlIHByb2ZpbGUgZGF0YSAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBuZWVkZWQgZm9yIHJlYWRpbmcgc2FtcGxlIHByb2ZpbGVzLgorLy8KKy8vIE5PVEU6IElmIHlvdSBhcmUgbWFraW5nIGNoYW5nZXMgdG8gdGhpcyBmaWxlIGZvcm1hdCwgcGxlYXNlIHJlbWVtYmVyCisvLyAgICAgICB0byBkb2N1bWVudCB0aGVtIGluIHRoZSBDbGFuZyBkb2N1bWVudGF0aW9uIGF0CisvLyAgICAgICB0b29scy9jbGFuZy9kb2NzL1VzZXJzTWFudWFsLnJzdC4KKy8vCisvLyBUZXh0IGZvcm1hdAorLy8gLS0tLS0tLS0tLS0KKy8vCisvLyBTYW1wbGUgcHJvZmlsZXMgYXJlIHdyaXR0ZW4gYXMgQVNDSUkgdGV4dC4gVGhlIGZpbGUgaXMgZGl2aWRlZCBpbnRvCisvLyBzZWN0aW9ucywgd2hpY2ggY29ycmVzcG9uZCB0byBlYWNoIG9mIHRoZSBmdW5jdGlvbnMgZXhlY3V0ZWQgYXQgcnVudGltZS4KKy8vIEVhY2ggc2VjdGlvbiBoYXMgdGhlIGZvbGxvd2luZyBmb3JtYXQKKy8vCisvLyAgICAgZnVuY3Rpb24xOnRvdGFsX3NhbXBsZXM6dG90YWxfaGVhZF9zYW1wbGVzCisvLyAgICAgIG9mZnNldDFbLmRpc2NyaW1pbmF0b3JdOiBudW1iZXJfb2Zfc2FtcGxlcyBbZm4xOm51bSBmbjI6bnVtIC4uLiBdCisvLyAgICAgIG9mZnNldDJbLmRpc2NyaW1pbmF0b3JdOiBudW1iZXJfb2Zfc2FtcGxlcyBbZm4zOm51bSBmbjQ6bnVtIC4uLiBdCisvLyAgICAgIC4uLgorLy8gICAgICBvZmZzZXROWy5kaXNjcmltaW5hdG9yXTogbnVtYmVyX29mX3NhbXBsZXMgW2ZuNTpudW0gZm42Om51bSAuLi4gXQorLy8gICAgICBvZmZzZXRBWy5kaXNjcmltaW5hdG9yXTogZm5BOm51bV9vZl90b3RhbF9zYW1wbGVzCisvLyAgICAgICBvZmZzZXRBMVsuZGlzY3JpbWluYXRvcl06IG51bWJlcl9vZl9zYW1wbGVzIFtmbjc6bnVtIGZuODpudW0gLi4uIF0KKy8vICAgICAgIC4uLgorLy8KKy8vIFRoaXMgaXMgYSBuZXN0ZWQgdHJlZSBpbiB3aGljaCB0aGUgaWRlbnRhdGlvbiByZXByZXNlbnRzIHRoZSBuZXN0aW5nIGxldmVsCisvLyBvZiB0aGUgaW5saW5lIHN0YWNrLiBUaGVyZSBhcmUgbm8gYmxhbmsgbGluZXMgaW4gdGhlIGZpbGUuIEFuZCB0aGUgc3BhY2luZworLy8gd2l0aGluIGEgc2luZ2xlIGxpbmUgaXMgZml4ZWQuIEFkZGl0aW9uYWwgc3BhY2VzIHdpbGwgcmVzdWx0IGluIGFuIGVycm9yCisvLyB3aGlsZSByZWFkaW5nIHRoZSBmaWxlLgorLy8KKy8vIEFueSBsaW5lIHN0YXJ0aW5nIHdpdGggdGhlICcjJyBjaGFyYWN0ZXIgaXMgY29tcGxldGVseSBpZ25vcmVkLgorLy8KKy8vIElubGluZWQgY2FsbHMgYXJlIHJlcHJlc2VudGVkIHdpdGggaW5kZW50YXRpb24uIFRoZSBJbmxpbmUgc3RhY2sgaXMgYQorLy8gc3RhY2sgb2Ygc291cmNlIGxvY2F0aW9ucyBpbiB3aGljaCB0aGUgdG9wIG9mIHRoZSBzdGFjayByZXByZXNlbnRzIHRoZQorLy8gbGVhZiBmdW5jdGlvbiwgYW5kIHRoZSBib3R0b20gb2YgdGhlIHN0YWNrIHJlcHJlc2VudHMgdGhlIGFjdHVhbAorLy8gc3ltYm9sIHRvIHdoaWNoIHRoZSBpbnN0cnVjdGlvbiBiZWxvbmdzLgorLy8KKy8vIEZ1bmN0aW9uIG5hbWVzIG11c3QgYmUgbWFuZ2xlZCBpbiBvcmRlciBmb3IgdGhlIHByb2ZpbGUgbG9hZGVyIHRvCisvLyBtYXRjaCB0aGVtIGluIHRoZSBjdXJyZW50IHRyYW5zbGF0aW9uIHVuaXQuIFRoZSB0d28gbnVtYmVycyBpbiB0aGUKKy8vIGZ1bmN0aW9uIGhlYWRlciBzcGVjaWZ5IGhvdyBtYW55IHRvdGFsIHNhbXBsZXMgd2VyZSBhY2N1bXVsYXRlZCBpbiB0aGUKKy8vIGZ1bmN0aW9uIChmaXJzdCBudW1iZXIpLCBhbmQgdGhlIHRvdGFsIG51bWJlciBvZiBzYW1wbGVzIGFjY3VtdWxhdGVkCisvLyBpbiB0aGUgcHJvbG9ndWUgb2YgdGhlIGZ1bmN0aW9uIChzZWNvbmQgbnVtYmVyKS4gVGhpcyBoZWFkIHNhbXBsZQorLy8gY291bnQgcHJvdmlkZXMgYW4gaW5kaWNhdG9yIG9mIGhvdyBmcmVxdWVudGx5IHRoZSBmdW5jdGlvbiBpcyBpbnZva2VkLgorLy8KKy8vIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgbGluZXMgaW4gdGhlIGZ1bmN0aW9uIGJvZHkuCisvLworLy8gKiBTYW1wbGVkIGxpbmUgcmVwcmVzZW50cyB0aGUgcHJvZmlsZSBpbmZvcm1hdGlvbiBvZiBhIHNvdXJjZSBsb2NhdGlvbi4KKy8vICogQ2FsbHNpdGUgbGluZSByZXByZXNlbnRzIHRoZSBwcm9maWxlIGluZm9ybWF0aW9uIG9mIGEgY2FsbHNpdGUuCisvLworLy8gRWFjaCBzYW1wbGVkIGxpbmUgbWF5IGNvbnRhaW4gc2V2ZXJhbCBpdGVtcy4gU29tZSBhcmUgb3B0aW9uYWwgKG1hcmtlZAorLy8gYmVsb3cpOgorLy8KKy8vIGEuIFNvdXJjZSBsaW5lIG9mZnNldC4gVGhpcyBudW1iZXIgcmVwcmVzZW50cyB0aGUgbGluZSBudW1iZXIKKy8vICAgIGluIHRoZSBmdW5jdGlvbiB3aGVyZSB0aGUgc2FtcGxlIHdhcyBjb2xsZWN0ZWQuIFRoZSBsaW5lIG51bWJlciBpcworLy8gICAgYWx3YXlzIHJlbGF0aXZlIHRvIHRoZSBsaW5lIHdoZXJlIHN5bWJvbCBvZiB0aGUgZnVuY3Rpb24gaXMKKy8vICAgIGRlZmluZWQuIFNvLCBpZiB0aGUgZnVuY3Rpb24gaGFzIGl0cyBoZWFkZXIgYXQgbGluZSAyODAsIHRoZSBvZmZzZXQKKy8vICAgIDEzIGlzIGF0IGxpbmUgMjkzIGluIHRoZSBmaWxlLgorLy8KKy8vICAgIE5vdGUgdGhhdCB0aGlzIG9mZnNldCBzaG91bGQgbmV2ZXIgYmUgYSBuZWdhdGl2ZSBudW1iZXIuIFRoaXMgY291bGQKKy8vICAgIGhhcHBlbiBpbiBjYXNlcyBsaWtlIG1hY3Jvcy4gVGhlIGRlYnVnIG1hY2hpbmVyeSB3aWxsIHJlZ2lzdGVyIHRoZQorLy8gICAgbGluZSBudW1iZXIgYXQgdGhlIHBvaW50IG9mIG1hY3JvIGV4cGFuc2lvbi4gU28sIGlmIHRoZSBtYWNybyB3YXMKKy8vICAgIGV4cGFuZGVkIGluIGEgbGluZSBiZWZvcmUgdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiwgdGhlIHByb2ZpbGUKKy8vICAgIGNvbnZlcnRlciBzaG91bGQgZW1pdCBhIDAgYXMgdGhlIG9mZnNldCAodGhpcyBtZWFucyB0aGF0IHRoZSBvcHRpbWl6ZXJzCisvLyAgICB3aWxsIG5vdCBiZSBhYmxlIHRvIGFzc29jaWF0ZSBhIG1lYW5pbmdmdWwgd2VpZ2h0IHRvIHRoZSBpbnN0cnVjdGlvbnMKKy8vICAgIGluIHRoZSBtYWNybykuCisvLworLy8gYi4gW09QVElPTkFMXSBEaXNjcmltaW5hdG9yLiBUaGlzIGlzIHVzZWQgaWYgdGhlIHNhbXBsZWQgcHJvZ3JhbQorLy8gICAgd2FzIGNvbXBpbGVkIHdpdGggRFdBUkYgZGlzY3JpbWluYXRvciBzdXBwb3J0CisvLyAgICAoaHR0cDovL3dpa2kuZHdhcmZzdGQub3JnL2luZGV4LnBocD90aXRsZT1QYXRoX0Rpc2NyaW1pbmF0b3JzKS4KKy8vICAgIERXQVJGIGRpc2NyaW1pbmF0b3JzIGFyZSB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlcyB0aGF0IGFsbG93IHRoZQorLy8gICAgY29tcGlsZXIgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBtdWx0aXBsZSBleGVjdXRpb24gcGF0aHMgb24gdGhlCisvLyAgICBzYW1lIHNvdXJjZSBsaW5lIGxvY2F0aW9uLgorLy8KKy8vICAgIEZvciBleGFtcGxlLCBjb25zaWRlciB0aGUgbGluZSBvZiBjb2RlIGBgaWYgKGNvbmQpIGZvbygpOyBlbHNlIGJhcigpO2BgLgorLy8gICAgSWYgdGhlIHByZWRpY2F0ZSBgYGNvbmRgYCBpcyB0cnVlIDgwJSBvZiB0aGUgdGltZSwgdGhlbiB0aGUgZWRnZQorLy8gICAgaW50byBmdW5jdGlvbiBgYGZvb2BgIHNob3VsZCBiZSBjb25zaWRlcmVkIHRvIGJlIHRha2VuIG1vc3Qgb2YgdGhlCisvLyAgICB0aW1lLiBCdXQgYm90aCBjYWxscyB0byBgYGZvb2BgIGFuZCBgYGJhcmBgIGFyZSBhdCB0aGUgc2FtZSBzb3VyY2UKKy8vICAgIGxpbmUsIHNvIGEgc2FtcGxlIGNvdW50IGF0IHRoYXQgbGluZSBpcyBub3Qgc3VmZmljaWVudC4gVGhlCisvLyAgICBjb21waWxlciBuZWVkcyB0byBrbm93IHdoaWNoIHBhcnQgb2YgdGhhdCBsaW5lIGlzIHRha2VuIG1vcmUKKy8vICAgIGZyZXF1ZW50bHkuCisvLworLy8gICAgVGhpcyBpcyB3aGF0IGRpc2NyaW1pbmF0b3JzIHByb3ZpZGUuIEluIHRoaXMgY2FzZSwgdGhlIGNhbGxzIHRvCisvLyAgICBgYGZvb2BgIGFuZCBgYGJhcmBgIHdpbGwgYmUgYXQgdGhlIHNhbWUgbGluZSwgYnV0IHdpbGwgaGF2ZQorLy8gICAgZGlmZmVyZW50IGRpc2NyaW1pbmF0b3IgdmFsdWVzLiBUaGlzIGFsbG93cyB0aGUgY29tcGlsZXIgdG8gY29ycmVjdGx5CisvLyAgICBzZXQgZWRnZSB3ZWlnaHRzIGludG8gYGBmb29gYCBhbmQgYGBiYXJgYC4KKy8vCisvLyBjLiBOdW1iZXIgb2Ygc2FtcGxlcy4gVGhpcyBpcyBhbiBpbnRlZ2VyIHF1YW50aXR5IHJlcHJlc2VudGluZyB0aGUKKy8vICAgIG51bWJlciBvZiBzYW1wbGVzIGNvbGxlY3RlZCBieSB0aGUgcHJvZmlsZXIgYXQgdGhpcyBzb3VyY2UKKy8vICAgIGxvY2F0aW9uLgorLy8KKy8vIGQuIFtPUFRJT05BTF0gUG90ZW50aWFsIGNhbGwgdGFyZ2V0cyBhbmQgc2FtcGxlcy4gSWYgcHJlc2VudCwgdGhpcworLy8gICAgbGluZSBjb250YWlucyBhIGNhbGwgaW5zdHJ1Y3Rpb24uIFRoaXMgbW9kZWxzIGJvdGggZGlyZWN0IGFuZAorLy8gICAgbnVtYmVyIG9mIHNhbXBsZXMuIEZvciBleGFtcGxlLAorLy8KKy8vICAgICAgMTMwOiA3ICBmb286MyAgYmFyOjIgIGJhejo3CisvLworLy8gICAgVGhlIGFib3ZlIG1lYW5zIHRoYXQgYXQgcmVsYXRpdmUgbGluZSBvZmZzZXQgMTMwIHRoZXJlIGlzIGEgY2FsbAorLy8gICAgaW5zdHJ1Y3Rpb24gdGhhdCBjYWxscyBvbmUgb2YgYGBmb28oKWBgLCBgYGJhcigpYGAgYW5kIGBgYmF6KClgYCwKKy8vICAgIHdpdGggYGBiYXooKWBgIGJlaW5nIHRoZSByZWxhdGl2ZWx5IG1vcmUgZnJlcXVlbnRseSBjYWxsZWQgdGFyZ2V0LgorLy8KKy8vIEVhY2ggY2FsbHNpdGUgbGluZSBtYXkgY29udGFpbiBzZXZlcmFsIGl0ZW1zLiBTb21lIGFyZSBvcHRpb25hbC4KKy8vCisvLyBhLiBTb3VyY2UgbGluZSBvZmZzZXQuIFRoaXMgbnVtYmVyIHJlcHJlc2VudHMgdGhlIGxpbmUgbnVtYmVyIG9mIHRoZQorLy8gICAgY2FsbHNpdGUgdGhhdCBpcyBpbmxpbmVkIGluIHRoZSBwcm9maWxlZCBiaW5hcnkuCisvLworLy8gYi4gW09QVElPTkFMXSBEaXNjcmltaW5hdG9yLiBTYW1lIGFzIHRoZSBkaXNjcmltaW5hdG9yIGZvciBzYW1wbGVkIGxpbmUuCisvLworLy8gYy4gTnVtYmVyIG9mIHNhbXBsZXMuIFRoaXMgaXMgYW4gaW50ZWdlciBxdWFudGl0eSByZXByZXNlbnRpbmcgdGhlCisvLyAgICB0b3RhbCBudW1iZXIgb2Ygc2FtcGxlcyBjb2xsZWN0ZWQgZm9yIHRoZSBpbmxpbmVkIGluc3RhbmNlIGF0IHRoaXMKKy8vICAgIGNhbGxzaXRlCisvLworLy8KKy8vIEJpbmFyeSBmb3JtYXQKKy8vIC0tLS0tLS0tLS0tLS0KKy8vCisvLyBUaGlzIGlzIGEgbW9yZSBjb21wYWN0IGVuY29kaW5nLiBOdW1iZXJzIGFyZSBlbmNvZGVkIGFzIFVMRUIxMjggdmFsdWVzCisvLyBhbmQgYWxsIHN0cmluZ3MgYXJlIGVuY29kZWQgaW4gYSBuYW1lIHRhYmxlLiBUaGUgZmlsZSBpcyBvcmdhbml6ZWQgaW4KKy8vIHRoZSBmb2xsb3dpbmcgc2VjdGlvbnM6CisvLworLy8gTUFHSUMgKHVpbnQ2NF90KQorLy8gICAgRmlsZSBpZGVudGlmaWVyIGNvbXB1dGVkIGJ5IGZ1bmN0aW9uIFNQTWFnaWMoKSAoMHg1MzUwNTI0ZjQ2MzQzMmZmKQorLy8KKy8vIFZFUlNJT04gKHVpbnQzMl90KQorLy8gICAgRmlsZSBmb3JtYXQgdmVyc2lvbiBudW1iZXIgY29tcHV0ZWQgYnkgU1BWZXJzaW9uKCkKKy8vCisvLyBTVU1NQVJZCisvLyAgICBUT1RBTF9DT1VOVCAodWludDY0X3QpCisvLyAgICAgICAgVG90YWwgbnVtYmVyIG9mIHNhbXBsZXMgaW4gdGhlIHByb2ZpbGUuCisvLyAgICBNQVhfQ09VTlQgKHVpbnQ2NF90KQorLy8gICAgICAgIE1heGltdW0gdmFsdWUgb2Ygc2FtcGxlcyBvbiBhIGxpbmUuCisvLyAgICBNQVhfRlVOQ1RJT05fQ09VTlQgKHVpbnQ2NF90KQorLy8gICAgICAgIE1heGltdW0gbnVtYmVyIG9mIHNhbXBsZXMgYXQgZnVuY3Rpb24gZW50cnkgKGhlYWQgc2FtcGxlcykuCisvLyAgICBOVU1fQ09VTlRTICh1aW50NjRfdCkKKy8vICAgICAgICBOdW1iZXIgb2YgbGluZXMgd2l0aCBzYW1wbGVzLgorLy8gICAgTlVNX0ZVTkNUSU9OUyAodWludDY0X3QpCisvLyAgICAgICAgTnVtYmVyIG9mIGZ1bmN0aW9ucyB3aXRoIHNhbXBsZXMuCisvLyAgICBOVU1fREVUQUlMRURfU1VNTUFSWV9FTlRSSUVTIChzaXplX3QpCisvLyAgICAgICAgTnVtYmVyIG9mIGVudHJpZXMgaW4gZGV0YWlsZWQgc3VtbWFyeQorLy8gICAgREVUQUlMRURfU1VNTUFSWQorLy8gICAgICAgIEEgbGlzdCBvZiBkZXRhaWxlZCBzdW1tYXJ5IGVudHJ5LiBFYWNoIGVudHJ5IGNvbnNpc3RzIG9mCisvLyAgICAgICAgQ1VUT0ZGICh1aW50MzJfdCkKKy8vICAgICAgICAgICAgUmVxdWlyZWQgcGVyY2VudGlsZSBvZiB0b3RhbCBzYW1wbGUgY291bnQgZXhwcmVzc2VkIGFzIGEgZnJhY3Rpb24KKy8vICAgICAgICAgICAgbXVsdGlwbGllZCBieSAxMDAwMDAwLgorLy8gICAgICAgIE1JTl9DT1VOVCAodWludDY0X3QpCisvLyAgICAgICAgICAgIFRoZSBtaW5pbXVtIG51bWJlciBvZiBzYW1wbGVzIHJlcXVpcmVkIHRvIHJlYWNoIHRoZSB0YXJnZXQKKy8vICAgICAgICAgICAgQ1VUT0ZGLgorLy8gICAgICAgIE5VTV9DT1VOVFMgKHVpbnQ2NF90KQorLy8gICAgICAgICAgICBOdW1iZXIgb2Ygc2FtcGxlcyB0byBnZXQgdG8gdGhlIGRlc3JpcmVkIHBlcmNlbnRpbGUuCisvLworLy8gTkFNRSBUQUJMRQorLy8gICAgU0laRSAodWludDMyX3QpCisvLyAgICAgICAgTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIG5hbWUgdGFibGUuCisvLyAgICBOQU1FUworLy8gICAgICAgIEEgTlVMLXNlcGFyYXRlZCBsaXN0IG9mIFNJWkUgc3RyaW5ncy4KKy8vCisvLyBGVU5DVElPTiBCT0RZIChvbmUgZm9yIGVhY2ggdW5pbmxpbmVkIGZ1bmN0aW9uIGJvZHkgcHJlc2VudCBpbiB0aGUgcHJvZmlsZSkKKy8vICAgIEhFQURfU0FNUExFUyAodWludDY0X3QpIFtvbmx5IGZvciB0b3AtbGV2ZWwgZnVuY3Rpb25zXQorLy8gICAgICAgIFRvdGFsIG51bWJlciBvZiBzYW1wbGVzIGNvbGxlY3RlZCBhdCB0aGUgaGVhZCAocHJvbG9ndWUpIG9mIHRoZQorLy8gICAgICAgIGZ1bmN0aW9uLgorLy8gICAgICAgIE5PVEU6IFRoaXMgZmllbGQgc2hvdWxkIG9ubHkgYmUgcHJlc2VudCBmb3IgdG9wLWxldmVsIGZ1bmN0aW9ucworLy8gICAgICAgICAgICAgIChpLmUuLCBub3QgaW5saW5lZCBpbnRvIGFueSBjYWxsZXIpLiBJbmxpbmVkIGZ1bmN0aW9uIGNhbGxzCisvLyAgICAgICAgICAgICAgaGF2ZSBubyBwcm9sb2d1ZSwgc28gdGhleSBkb24ndCBuZWVkIHRoaXMuCisvLyAgICBOQU1FX0lEWCAodWludDMyX3QpCisvLyAgICAgICAgSW5kZXggaW50byB0aGUgbmFtZSB0YWJsZSBpbmRpY2F0aW5nIHRoZSBmdW5jdGlvbiBuYW1lLgorLy8gICAgU0FNUExFUyAodWludDY0X3QpCisvLyAgICAgICAgVG90YWwgbnVtYmVyIG9mIHNhbXBsZXMgY29sbGVjdGVkIGluIHRoaXMgZnVuY3Rpb24uCisvLyAgICBOUkVDUyAodWludDMyX3QpCisvLyAgICAgICAgVG90YWwgbnVtYmVyIG9mIHNhbXBsaW5nIHJlY29yZHMgdGhpcyBmdW5jdGlvbidzIHByb2ZpbGUuCisvLyAgICBCT0RZIFJFQ09SRFMKKy8vICAgICAgICBBIGxpc3Qgb2YgTlJFQ1MgZW50cmllcy4gRWFjaCBlbnRyeSBjb250YWluczoKKy8vICAgICAgICAgIE9GRlNFVCAodWludDMyX3QpCisvLyAgICAgICAgICAgIExpbmUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4KKy8vICAgICAgICAgIERJU0NSSU1JTkFUT1IgKHVpbnQzMl90KQorLy8gICAgICAgICAgICBEaXNjcmltaW5hdG9yIHZhbHVlIChzZWUgZGVzY3JpcHRpb24gb2YgZGlzY3JpbWluYXRvcnMKKy8vICAgICAgICAgICAgaW4gdGhlIHRleHQgZm9ybWF0IGRvY3VtZW50YXRpb24gYWJvdmUpLgorLy8gICAgICAgICAgU0FNUExFUyAodWludDY0X3QpCisvLyAgICAgICAgICAgIE51bWJlciBvZiBzYW1wbGVzIGNvbGxlY3RlZCBhdCB0aGlzIGxvY2F0aW9uLgorLy8gICAgICAgICAgTlVNX0NBTExTICh1aW50MzJfdCkKKy8vICAgICAgICAgICAgTnVtYmVyIG9mIG5vbi1pbmxpbmVkIGZ1bmN0aW9uIGNhbGxzIG1hZGUgYXQgdGhpcyBsb2NhdGlvbi4gSW4gdGhlCisvLyAgICAgICAgICAgIGNhc2Ugb2YgZGlyZWN0IGNhbGxzLCB0aGlzIG51bWJlciB3aWxsIGFsd2F5cyBiZSAxLiBGb3IgaW5kaXJlY3QKKy8vICAgICAgICAgICAgY2FsbHMgKHZpcnR1YWwgZnVuY3Rpb25zIGFuZCBmdW5jdGlvbiBwb2ludGVycykgdGhpcyB3aWxsCisvLyAgICAgICAgICAgIHJlcHJlc2VudCBhbGwgdGhlIGFjdHVhbCBmdW5jdGlvbnMgY2FsbGVkIGF0IHJ1bnRpbWUuCisvLyAgICAgICAgICBDQUxMX1RBUkdFVFMKKy8vICAgICAgICAgICAgQSBsaXN0IG9mIE5VTV9DQUxMUyBlbnRyaWVzIGZvciBlYWNoIGNhbGxlZCBmdW5jdGlvbjoKKy8vICAgICAgICAgICAgICAgTkFNRV9JRFggKHVpbnQzMl90KQorLy8gICAgICAgICAgICAgICAgICBJbmRleCBpbnRvIHRoZSBuYW1lIHRhYmxlIHdpdGggdGhlIGNhbGxlZSBuYW1lLgorLy8gICAgICAgICAgICAgICBTQU1QTEVTICh1aW50NjRfdCkKKy8vICAgICAgICAgICAgICAgICAgTnVtYmVyIG9mIHNhbXBsZXMgY29sbGVjdGVkIGF0IHRoZSBjYWxsIHNpdGUuCisvLyAgICBOVU1fSU5MSU5FRF9GVU5DVElPTlMgKHVpbnQzMl90KQorLy8gICAgICBOdW1iZXIgb2YgY2FsbGVlcyBpbmxpbmVkIGludG8gdGhpcyBmdW5jdGlvbi4KKy8vICAgIElOTElORUQgRlVOQ1RJT04gUkVDT1JEUworLy8gICAgICBBIGxpc3Qgb2YgTlVNX0lOTElORURfRlVOQ1RJT05TIGVudHJpZXMgZGVzY3JpYmluZyBlYWNoIG9mIHRoZSBpbmxpbmVkCisvLyAgICAgIGNhbGxlZXMuCisvLyAgICAgICAgT0ZGU0VUICh1aW50MzJfdCkKKy8vICAgICAgICAgIExpbmUgb2Zmc2V0IGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbi4KKy8vICAgICAgICBESVNDUklNSU5BVE9SICh1aW50MzJfdCkKKy8vICAgICAgICAgIERpc2NyaW1pbmF0b3IgdmFsdWUgKHNlZSBkZXNjcmlwdGlvbiBvZiBkaXNjcmltaW5hdG9ycworLy8gICAgICAgICAgaW4gdGhlIHRleHQgZm9ybWF0IGRvY3VtZW50YXRpb24gYWJvdmUpLgorLy8gICAgICAgIEZVTkNUSU9OIEJPRFkKKy8vICAgICAgICAgIEEgRlVOQ1RJT04gQk9EWSBlbnRyeSBkZXNjcmliaW5nIHRoZSBpbmxpbmVkIGZ1bmN0aW9uLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1BST0ZJTEVEQVRBX1NBTVBMRVBST0ZSRUFERVJfSAorI2RlZmluZSBMTFZNX1BST0ZJTEVEQVRBX1NBTVBMRVBST0ZSRUFERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvRGlhZ25vc3RpY0luZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9MTFZNQ29udGV4dC5oIgorI2luY2x1ZGUgImxsdm0vSVIvUHJvZmlsZVN1bW1hcnkuaCIKKyNpbmNsdWRlICJsbHZtL1Byb2ZpbGVEYXRhL0dDT1YuaCIKKyNpbmNsdWRlICJsbHZtL1Byb2ZpbGVEYXRhL1NhbXBsZVByb2YuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JPci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBzYW1wbGVwcm9mIHsKKworLy8vIFxicmllZiBTYW1wbGUtYmFzZWQgcHJvZmlsZSByZWFkZXIuCisvLy8KKy8vLyBFYWNoIHByb2ZpbGUgY29udGFpbnMgc2FtcGxlIGNvdW50cyBmb3IgYWxsIHRoZSBmdW5jdGlvbnMKKy8vLyBleGVjdXRlZC4gSW5zaWRlIGVhY2ggZnVuY3Rpb24sIHN0YXRlbWVudHMgYXJlIGFubm90YXRlZCB3aXRoIHRoZQorLy8vIGNvbGxlY3RlZCBzYW1wbGVzIG9uIGFsbCB0aGUgaW5zdHJ1Y3Rpb25zIGFzc29jaWF0ZWQgd2l0aCB0aGF0CisvLy8gc3RhdGVtZW50LgorLy8vCisvLy8gRm9yIHRoaXMgdG8gcHJvZHVjZSBtZWFuaW5nZnVsIGRhdGEsIHRoZSBwcm9ncmFtIG5lZWRzIHRvIGJlCisvLy8gY29tcGlsZWQgd2l0aCBzb21lIGRlYnVnIGluZm9ybWF0aW9uIChhdCBtaW5pbXVtLCBsaW5lIG51bWJlcnM6CisvLy8gLWdsaW5lLXRhYmxlcy1vbmx5KS4gT3RoZXJ3aXNlLCBpdCB3aWxsIGJlIGltcG9zc2libGUgdG8gbWF0Y2ggSVIKKy8vLyBpbnN0cnVjdGlvbnMgdG8gdGhlIGxpbmUgbnVtYmVycyBjb2xsZWN0ZWQgYnkgdGhlIHByb2ZpbGVyLgorLy8vCisvLy8gRnJvbSB0aGUgcHJvZmlsZSBmaWxlLCB3ZSBhcmUgaW50ZXJlc3RlZCBpbiBjb2xsZWN0aW5nIHRoZQorLy8vIGZvbGxvd2luZyBpbmZvcm1hdGlvbjoKKy8vLworLy8vICogQSBsaXN0IG9mIGZ1bmN0aW9ucyBpbmNsdWRlZCBpbiB0aGUgcHJvZmlsZSAobWFuZ2xlZCBuYW1lcykuCisvLy8KKy8vLyAqIEZvciBlYWNoIGZ1bmN0aW9uIEY6CisvLy8gICAxLiBUaGUgdG90YWwgbnVtYmVyIG9mIHNhbXBsZXMgY29sbGVjdGVkIGluIEYuCisvLy8KKy8vLyAgIDIuIFRoZSBzYW1wbGVzIGNvbGxlY3RlZCBhdCBlYWNoIGxpbmUgaW4gRi4gVG8gcHJvdmlkZSBzb21lCisvLy8gICAgICBwcm90ZWN0aW9uIGFnYWluc3Qgc291cmNlIGNvZGUgc2h1ZmZsaW5nLCBsaW5lIG51bWJlcnMgc2hvdWxkCisvLy8gICAgICBiZSByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIGZ1bmN0aW9uLgorLy8vCisvLy8gVGhlIHJlYWRlciBzdXBwb3J0cyB0d28gZmlsZSBmb3JtYXRzOiB0ZXh0IGFuZCBiaW5hcnkuIFRoZSB0ZXh0IGZvcm1hdAorLy8vIGlzIHVzZWZ1bCBmb3IgZGVidWdnaW5nIGFuZCB0ZXN0aW5nLCB3aGlsZSB0aGUgYmluYXJ5IGZvcm1hdCBpcyBtb3JlCisvLy8gY29tcGFjdCBhbmQgSS9PIGVmZmljaWVudC4gVGhleSBjYW4gYm90aCBiZSB1c2VkIGludGVyY2hhbmdlYWJseS4KK2NsYXNzIFNhbXBsZVByb2ZpbGVSZWFkZXIgeworcHVibGljOgorICBTYW1wbGVQcm9maWxlUmVhZGVyKHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IEIsIExMVk1Db250ZXh0ICZDKQorICAgICAgOiBQcm9maWxlcygwKSwgQ3R4KEMpLCBCdWZmZXIoc3RkOjptb3ZlKEIpKSB7fQorCisgIHZpcnR1YWwgflNhbXBsZVByb2ZpbGVSZWFkZXIoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxicmllZiBSZWFkIGFuZCB2YWxpZGF0ZSB0aGUgZmlsZSBoZWFkZXIuCisgIHZpcnR1YWwgc3RkOjplcnJvcl9jb2RlIHJlYWRIZWFkZXIoKSA9IDA7CisKKyAgLy8vIFxicmllZiBSZWFkIHNhbXBsZSBwcm9maWxlcyBmcm9tIHRoZSBhc3NvY2lhdGVkIGZpbGUuCisgIHZpcnR1YWwgc3RkOjplcnJvcl9jb2RlIHJlYWQoKSA9IDA7CisKKyAgLy8vIFxicmllZiBQcmludCB0aGUgcHJvZmlsZSBmb3IgXHAgRk5hbWUgb24gc3RyZWFtIFxwIE9TLgorICB2b2lkIGR1bXBGdW5jdGlvblByb2ZpbGUoU3RyaW5nUmVmIEZOYW1lLCByYXdfb3N0cmVhbSAmT1MgPSBkYmdzKCkpOworCisgIC8vLyBcYnJpZWYgUHJpbnQgYWxsIHRoZSBwcm9maWxlcyBvbiBzdHJlYW0gXHAgT1MuCisgIHZvaWQgZHVtcChyYXdfb3N0cmVhbSAmT1MgPSBkYmdzKCkpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBzYW1wbGVzIGNvbGxlY3RlZCBmb3IgZnVuY3Rpb24gXHAgRi4KKyAgRnVuY3Rpb25TYW1wbGVzICpnZXRTYW1wbGVzRm9yKGNvbnN0IEZ1bmN0aW9uICZGKSB7CisgICAgLy8gVGhlIGZ1bmN0aW9uIG5hbWUgbWF5IGhhdmUgYmVlbiB1cGRhdGVkIGJ5IGFkZGluZyBzdWZmaXguIEluIHNhbXBsZQorICAgIC8vIHByb2ZpbGUsIHRoZSBmdW5jdGlvbiBuYW1lcyBhcmUgYWxsIHN0cmlwcGVkLCBzbyB3ZSBuZWVkIHRvIHN0cmlwCisgICAgLy8gdGhlIGZ1bmN0aW9uIG5hbWUgc3VmZml4IGJlZm9yZSBtYXRjaGluZyB3aXRoIHByb2ZpbGUuCisgICAgaWYgKFByb2ZpbGVzLmNvdW50KEYuZ2V0TmFtZSgpLnNwbGl0KCcuJykuZmlyc3QpKQorICAgICAgcmV0dXJuICZQcm9maWxlc1soRi5nZXROYW1lKCkuc3BsaXQoJy4nKS5maXJzdCldOworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYWxsIHRoZSBwcm9maWxlcy4KKyAgU3RyaW5nTWFwPEZ1bmN0aW9uU2FtcGxlcz4gJmdldFByb2ZpbGVzKCkgeyByZXR1cm4gUHJvZmlsZXM7IH0KKworICAvLy8gXGJyaWVmIFJlcG9ydCBhIHBhcnNlIGVycm9yIG1lc3NhZ2UuCisgIHZvaWQgcmVwb3J0RXJyb3IoaW50NjRfdCBMaW5lTnVtYmVyLCBUd2luZSBNc2cpIGNvbnN0IHsKKyAgICBDdHguZGlhZ25vc2UoRGlhZ25vc3RpY0luZm9TYW1wbGVQcm9maWxlKEJ1ZmZlci0+Z2V0QnVmZmVySWRlbnRpZmllcigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGluZU51bWJlciwgTXNnKSk7CisgIH0KKworICAvLy8gXGJyaWVmIENyZWF0ZSBhIHNhbXBsZSBwcm9maWxlIHJlYWRlciBhcHByb3ByaWF0ZSB0byB0aGUgZmlsZSBmb3JtYXQuCisgIHN0YXRpYyBFcnJvck9yPHN0ZDo6dW5pcXVlX3B0cjxTYW1wbGVQcm9maWxlUmVhZGVyPj4KKyAgY3JlYXRlKGNvbnN0IFR3aW5lICZGaWxlbmFtZSwgTExWTUNvbnRleHQgJkMpOworCisgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgc2FtcGxlIHByb2ZpbGUgcmVhZGVyIGZyb20gdGhlIHN1cHBsaWVkIG1lbW9yeSBidWZmZXIuCisgIHN0YXRpYyBFcnJvck9yPHN0ZDo6dW5pcXVlX3B0cjxTYW1wbGVQcm9maWxlUmVhZGVyPj4KKyAgY3JlYXRlKHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+ICZCLCBMTFZNQ29udGV4dCAmQyk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIHByb2ZpbGUgc3VtbWFyeS4KKyAgUHJvZmlsZVN1bW1hcnkgJmdldFN1bW1hcnkoKSB7IHJldHVybiAqKFN1bW1hcnkuZ2V0KCkpOyB9CisKK3Byb3RlY3RlZDoKKyAgLy8vIFxicmllZiBNYXAgZXZlcnkgZnVuY3Rpb24gdG8gaXRzIGFzc29jaWF0ZWQgcHJvZmlsZS4KKyAgLy8vCisgIC8vLyBUaGUgcHJvZmlsZSBvZiBldmVyeSBmdW5jdGlvbiBleGVjdXRlZCBhdCBydW50aW1lIGlzIGNvbGxlY3RlZAorICAvLy8gaW4gdGhlIHN0cnVjdHVyZSBGdW5jdGlvblNhbXBsZXMuIFRoaXMgbWFwcyBmdW5jdGlvbiBvYmplY3RzCisgIC8vLyB0byB0aGVpciBjb3JyZXNwb25kaW5nIHByb2ZpbGVzLgorICBTdHJpbmdNYXA8RnVuY3Rpb25TYW1wbGVzPiBQcm9maWxlczsKKworICAvLy8gXGJyaWVmIExMVk0gY29udGV4dCB1c2VkIHRvIGVtaXQgZGlhZ25vc3RpY3MuCisgIExMVk1Db250ZXh0ICZDdHg7CisKKyAgLy8vIFxicmllZiBNZW1vcnkgYnVmZmVyIGhvbGRpbmcgdGhlIHByb2ZpbGUgZmlsZS4KKyAgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gQnVmZmVyOworCisgIC8vLyBcYnJpZWYgUHJvZmlsZSBzdW1tYXJ5IGluZm9ybWF0aW9uLgorICBzdGQ6OnVuaXF1ZV9wdHI8UHJvZmlsZVN1bW1hcnk+IFN1bW1hcnk7CisKKyAgLy8vIFxicmllZiBDb21wdXRlIHN1bW1hcnkgZm9yIHRoaXMgcHJvZmlsZS4KKyAgdm9pZCBjb21wdXRlU3VtbWFyeSgpOworfTsKKworY2xhc3MgU2FtcGxlUHJvZmlsZVJlYWRlclRleHQgOiBwdWJsaWMgU2FtcGxlUHJvZmlsZVJlYWRlciB7CitwdWJsaWM6CisgIFNhbXBsZVByb2ZpbGVSZWFkZXJUZXh0KHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IEIsIExMVk1Db250ZXh0ICZDKQorICAgICAgOiBTYW1wbGVQcm9maWxlUmVhZGVyKHN0ZDo6bW92ZShCKSwgQykge30KKworICAvLy8gXGJyaWVmIFJlYWQgYW5kIHZhbGlkYXRlIHRoZSBmaWxlIGhlYWRlci4KKyAgc3RkOjplcnJvcl9jb2RlIHJlYWRIZWFkZXIoKSBvdmVycmlkZSB7IHJldHVybiBzYW1wbGVwcm9mX2Vycm9yOjpzdWNjZXNzOyB9CisKKyAgLy8vIFxicmllZiBSZWFkIHNhbXBsZSBwcm9maWxlcyBmcm9tIHRoZSBhc3NvY2lhdGVkIGZpbGUuCisgIHN0ZDo6ZXJyb3JfY29kZSByZWFkKCkgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiBccCBCdWZmZXIgaXMgaW4gdGhlIGZvcm1hdCBzdXBwb3J0ZWQgYnkgdGhpcyBjbGFzcy4KKyAgc3RhdGljIGJvb2wgaGFzRm9ybWF0KGNvbnN0IE1lbW9yeUJ1ZmZlciAmQnVmZmVyKTsKK307CisKK2NsYXNzIFNhbXBsZVByb2ZpbGVSZWFkZXJCaW5hcnkgOiBwdWJsaWMgU2FtcGxlUHJvZmlsZVJlYWRlciB7CitwdWJsaWM6CisgIFNhbXBsZVByb2ZpbGVSZWFkZXJCaW5hcnkoc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gQiwgTExWTUNvbnRleHQgJkMpCisgICAgICA6IFNhbXBsZVByb2ZpbGVSZWFkZXIoc3RkOjptb3ZlKEIpLCBDKSB7fQorCisgIC8vLyBcYnJpZWYgUmVhZCBhbmQgdmFsaWRhdGUgdGhlIGZpbGUgaGVhZGVyLgorICBzdGQ6OmVycm9yX2NvZGUgcmVhZEhlYWRlcigpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUmVhZCBzYW1wbGUgcHJvZmlsZXMgZnJvbSB0aGUgYXNzb2NpYXRlZCBmaWxlLgorICBzdGQ6OmVycm9yX2NvZGUgcmVhZCgpIG92ZXJyaWRlOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgXHAgQnVmZmVyIGlzIGluIHRoZSBmb3JtYXQgc3VwcG9ydGVkIGJ5IHRoaXMgY2xhc3MuCisgIHN0YXRpYyBib29sIGhhc0Zvcm1hdChjb25zdCBNZW1vcnlCdWZmZXIgJkJ1ZmZlcik7CisKK3Byb3RlY3RlZDoKKyAgLy8vIFxicmllZiBSZWFkIGEgbnVtZXJpYyB2YWx1ZSBvZiB0eXBlIFQgZnJvbSB0aGUgcHJvZmlsZS4KKyAgLy8vCisgIC8vLyBJZiBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIGRlY29kaW5nLCBhIGRpYWdub3N0aWMgbWVzc2FnZSBpcyBlbWl0dGVkIGFuZAorICAvLy8gRUMgaXMgc2V0LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSByZWFkIHZhbHVlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gRXJyb3JPcjxUPiByZWFkTnVtYmVyKCk7CisKKyAgLy8vIFxicmllZiBSZWFkIGEgc3RyaW5nIGZyb20gdGhlIHByb2ZpbGUuCisgIC8vLworICAvLy8gSWYgYW4gZXJyb3Igb2NjdXJzIGR1cmluZyBkZWNvZGluZywgYSBkaWFnbm9zdGljIG1lc3NhZ2UgaXMgZW1pdHRlZCBhbmQKKyAgLy8vIEVDIGlzIHNldC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyB0aGUgcmVhZCB2YWx1ZS4KKyAgRXJyb3JPcjxTdHJpbmdSZWY+IHJlYWRTdHJpbmcoKTsKKworICAvLy8gUmVhZCBhIHN0cmluZyBpbmRpcmVjdGx5IHZpYSB0aGUgbmFtZSB0YWJsZS4KKyAgRXJyb3JPcjxTdHJpbmdSZWY+IHJlYWRTdHJpbmdGcm9tVGFibGUoKTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiBmaWxlLgorICBib29sIGF0X2VvZigpIGNvbnN0IHsgcmV0dXJuIERhdGEgPj0gRW5kOyB9CisKKyAgLy8vIFJlYWQgdGhlIGNvbnRlbnRzIG9mIHRoZSBnaXZlbiBwcm9maWxlIGluc3RhbmNlLgorICBzdGQ6OmVycm9yX2NvZGUgcmVhZFByb2ZpbGUoRnVuY3Rpb25TYW1wbGVzICZGUHJvZmlsZSk7CisKKyAgLy8vIFxicmllZiBQb2ludHMgdG8gdGhlIGN1cnJlbnQgbG9jYXRpb24gaW4gdGhlIGJ1ZmZlci4KKyAgY29uc3QgdWludDhfdCAqRGF0YSA9IG51bGxwdHI7CisKKyAgLy8vIFxicmllZiBQb2ludHMgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgorICBjb25zdCB1aW50OF90ICpFbmQgPSBudWxscHRyOworCisgIC8vLyBGdW5jdGlvbiBuYW1lIHRhYmxlLgorICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IE5hbWVUYWJsZTsKKworcHJpdmF0ZToKKyAgc3RkOjplcnJvcl9jb2RlIHJlYWRTdW1tYXJ5RW50cnkoc3RkOjp2ZWN0b3I8UHJvZmlsZVN1bW1hcnlFbnRyeT4gJkVudHJpZXMpOworCisgIC8vLyBcYnJpZWYgUmVhZCBwcm9maWxlIHN1bW1hcnkuCisgIHN0ZDo6ZXJyb3JfY29kZSByZWFkU3VtbWFyeSgpOworfTsKKwordXNpbmcgSW5saW5lQ2FsbFN0YWNrID0gU21hbGxWZWN0b3I8RnVuY3Rpb25TYW1wbGVzICosIDEwPjsKKworLy8gU3VwcG9ydGVkIGhpc3RvZ3JhbSB0eXBlcyBpbiBHQ0MuICBDdXJyZW50bHksIHdlIG9ubHkgbmVlZCBzdXBwb3J0IGZvcgorLy8gY2FsbCB0YXJnZXQgaGlzdG9ncmFtcy4KK2VudW0gSGlzdFR5cGUgeworICBISVNUX1RZUEVfSU5URVJWQUwsCisgIEhJU1RfVFlQRV9QT1cyLAorICBISVNUX1RZUEVfU0lOR0xFX1ZBTFVFLAorICBISVNUX1RZUEVfQ09OU1RfREVMVEEsCisgIEhJU1RfVFlQRV9JTkRJUl9DQUxMLAorICBISVNUX1RZUEVfQVZFUkFHRSwKKyAgSElTVF9UWVBFX0lPUiwKKyAgSElTVF9UWVBFX0lORElSX0NBTExfVE9QTgorfTsKKworY2xhc3MgU2FtcGxlUHJvZmlsZVJlYWRlckdDQyA6IHB1YmxpYyBTYW1wbGVQcm9maWxlUmVhZGVyIHsKK3B1YmxpYzoKKyAgU2FtcGxlUHJvZmlsZVJlYWRlckdDQyhzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBCLCBMTFZNQ29udGV4dCAmQykKKyAgICAgIDogU2FtcGxlUHJvZmlsZVJlYWRlcihzdGQ6Om1vdmUoQiksIEMpLCBHY292QnVmZmVyKEJ1ZmZlci5nZXQoKSkge30KKworICAvLy8gXGJyaWVmIFJlYWQgYW5kIHZhbGlkYXRlIHRoZSBmaWxlIGhlYWRlci4KKyAgc3RkOjplcnJvcl9jb2RlIHJlYWRIZWFkZXIoKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFJlYWQgc2FtcGxlIHByb2ZpbGVzIGZyb20gdGhlIGFzc29jaWF0ZWQgZmlsZS4KKyAgc3RkOjplcnJvcl9jb2RlIHJlYWQoKSBvdmVycmlkZTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIFxwIEJ1ZmZlciBpcyBpbiB0aGUgZm9ybWF0IHN1cHBvcnRlZCBieSB0aGlzIGNsYXNzLgorICBzdGF0aWMgYm9vbCBoYXNGb3JtYXQoY29uc3QgTWVtb3J5QnVmZmVyICZCdWZmZXIpOworCitwcm90ZWN0ZWQ6CisgIHN0ZDo6ZXJyb3JfY29kZSByZWFkTmFtZVRhYmxlKCk7CisgIHN0ZDo6ZXJyb3JfY29kZSByZWFkT25lRnVuY3Rpb25Qcm9maWxlKGNvbnN0IElubGluZUNhbGxTdGFjayAmSW5saW5lU3RhY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVXBkYXRlLCB1aW50MzJfdCBPZmZzZXQpOworICBzdGQ6OmVycm9yX2NvZGUgcmVhZEZ1bmN0aW9uUHJvZmlsZXMoKTsKKyAgc3RkOjplcnJvcl9jb2RlIHNraXBOZXh0V29yZCgpOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gRXJyb3JPcjxUPiByZWFkTnVtYmVyKCk7CisgIEVycm9yT3I8U3RyaW5nUmVmPiByZWFkU3RyaW5nKCk7CisKKyAgLy8vIFxicmllZiBSZWFkIHRoZSBzZWN0aW9uIHRhZyBhbmQgY2hlY2sgdGhhdCBpdCdzIHRoZSBzYW1lIGFzIFxwIEV4cGVjdGVkLgorICBzdGQ6OmVycm9yX2NvZGUgcmVhZFNlY3Rpb25UYWcodWludDMyX3QgRXhwZWN0ZWQpOworCisgIC8vLyBHQ09WIGJ1ZmZlciBjb250YWluaW5nIHRoZSBwcm9maWxlLgorICBHQ09WQnVmZmVyIEdjb3ZCdWZmZXI7CisKKyAgLy8vIEZ1bmN0aW9uIG5hbWVzIGluIHRoaXMgcHJvZmlsZS4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IE5hbWVzOworCisgIC8vLyBHQ09WIHRhZ3MgdXNlZCB0byBzZXBhcmF0ZSBzZWN0aW9ucyBpbiB0aGUgcHJvZmlsZSBmaWxlLgorICBzdGF0aWMgY29uc3QgdWludDMyX3QgR0NPVlRhZ0FGRE9GaWxlTmFtZXMgPSAweGFhMDAwMDAwOworICBzdGF0aWMgY29uc3QgdWludDMyX3QgR0NPVlRhZ0FGRE9GdW5jdGlvbiA9IDB4YWMwMDAwMDA7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2Ugc2FtcGxlcHJvZgorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9QUk9GSUxFREFUQV9TQU1QTEVQUk9GUkVBREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvU2FtcGxlUHJvZldyaXRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Qcm9maWxlRGF0YS9TYW1wbGVQcm9mV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODZhZjEwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vUHJvZmlsZURhdGEvU2FtcGxlUHJvZldyaXRlci5oCkBAIC0wLDAgKzEsMTMzIEBACisvLz09PS0gU2FtcGxlUHJvZldyaXRlci5oIC0gV3JpdGUgTExWTSBzYW1wbGUgcHJvZmlsZSBkYXRhIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgZGVmaW5pdGlvbnMgbmVlZGVkIGZvciB3cml0aW5nIHNhbXBsZSBwcm9maWxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX1BST0ZJTEVEQVRBX1NBTVBMRVBST0ZXUklURVJfSAorI2RlZmluZSBMTFZNX1BST0ZJTEVEQVRBX1NBTVBMRVBST0ZXUklURVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvTWFwVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Qcm9maWxlU3VtbWFyeS5oIgorI2luY2x1ZGUgImxsdm0vUHJvZmlsZURhdGEvU2FtcGxlUHJvZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvck9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHNhbXBsZXByb2YgeworCitlbnVtIFNhbXBsZVByb2ZpbGVGb3JtYXQgeyBTUEZfTm9uZSA9IDAsIFNQRl9UZXh0LCBTUEZfQmluYXJ5LCBTUEZfR0NDIH07CisKKy8vLyBcYnJpZWYgU2FtcGxlLWJhc2VkIHByb2ZpbGUgd3JpdGVyLiBCYXNlIGNsYXNzLgorY2xhc3MgU2FtcGxlUHJvZmlsZVdyaXRlciB7CitwdWJsaWM6CisgIHZpcnR1YWwgflNhbXBsZVByb2ZpbGVXcml0ZXIoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFdyaXRlIHNhbXBsZSBwcm9maWxlcyBpbiBccCBTLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHN0YXR1cyBjb2RlIG9mIHRoZSBmaWxlIHVwZGF0ZSBvcGVyYXRpb24uCisgIHZpcnR1YWwgc3RkOjplcnJvcl9jb2RlIHdyaXRlKGNvbnN0IEZ1bmN0aW9uU2FtcGxlcyAmUykgPSAwOworCisgIC8vLyBXcml0ZSBhbGwgdGhlIHNhbXBsZSBwcm9maWxlcyBpbiB0aGUgZ2l2ZW4gbWFwIG9mIHNhbXBsZXMuCisgIC8vLworICAvLy8gXHJldHVybnMgc3RhdHVzIGNvZGUgb2YgdGhlIGZpbGUgdXBkYXRlIG9wZXJhdGlvbi4KKyAgc3RkOjplcnJvcl9jb2RlIHdyaXRlKGNvbnN0IFN0cmluZ01hcDxGdW5jdGlvblNhbXBsZXM+ICZQcm9maWxlTWFwKTsKKworICByYXdfb3N0cmVhbSAmZ2V0T3V0cHV0U3RyZWFtKCkgeyByZXR1cm4gKk91dHB1dFN0cmVhbTsgfQorCisgIC8vLyBQcm9maWxlIHdyaXRlciBmYWN0b3J5LgorICAvLy8KKyAgLy8vIENyZWF0ZSBhIG5ldyBmaWxlIHdyaXRlciBiYXNlZCBvbiB0aGUgdmFsdWUgb2YgXHAgRm9ybWF0LgorICBzdGF0aWMgRXJyb3JPcjxzdGQ6OnVuaXF1ZV9wdHI8U2FtcGxlUHJvZmlsZVdyaXRlcj4+CisgIGNyZWF0ZShTdHJpbmdSZWYgRmlsZW5hbWUsIFNhbXBsZVByb2ZpbGVGb3JtYXQgRm9ybWF0KTsKKworICAvLy8gQ3JlYXRlIGEgbmV3IHN0cmVhbSB3cml0ZXIgYmFzZWQgb24gdGhlIHZhbHVlIG9mIFxwIEZvcm1hdC4KKyAgLy8vIEZvciB0ZXN0aW5nLgorICBzdGF0aWMgRXJyb3JPcjxzdGQ6OnVuaXF1ZV9wdHI8U2FtcGxlUHJvZmlsZVdyaXRlcj4+CisgIGNyZWF0ZShzdGQ6OnVuaXF1ZV9wdHI8cmF3X29zdHJlYW0+ICZPUywgU2FtcGxlUHJvZmlsZUZvcm1hdCBGb3JtYXQpOworCitwcm90ZWN0ZWQ6CisgIFNhbXBsZVByb2ZpbGVXcml0ZXIoc3RkOjp1bmlxdWVfcHRyPHJhd19vc3RyZWFtPiAmT1MpCisgICAgICA6IE91dHB1dFN0cmVhbShzdGQ6Om1vdmUoT1MpKSB7fQorCisgIC8vLyBcYnJpZWYgV3JpdGUgYSBmaWxlIGhlYWRlciBmb3IgdGhlIHByb2ZpbGUgZmlsZS4KKyAgdmlydHVhbCBzdGQ6OmVycm9yX2NvZGUKKyAgd3JpdGVIZWFkZXIoY29uc3QgU3RyaW5nTWFwPEZ1bmN0aW9uU2FtcGxlcz4gJlByb2ZpbGVNYXApID0gMDsKKworICAvLy8gXGJyaWVmIE91dHB1dCBzdHJlYW0gd2hlcmUgdG8gZW1pdCB0aGUgcHJvZmlsZSB0by4KKyAgc3RkOjp1bmlxdWVfcHRyPHJhd19vc3RyZWFtPiBPdXRwdXRTdHJlYW07CisKKyAgLy8vIFxicmllZiBQcm9maWxlIHN1bW1hcnkuCisgIHN0ZDo6dW5pcXVlX3B0cjxQcm9maWxlU3VtbWFyeT4gU3VtbWFyeTsKKworICAvLy8gXGJyaWVmIENvbXB1dGUgc3VtbWFyeSBmb3IgdGhpcyBwcm9maWxlLgorICB2b2lkIGNvbXB1dGVTdW1tYXJ5KGNvbnN0IFN0cmluZ01hcDxGdW5jdGlvblNhbXBsZXM+ICZQcm9maWxlTWFwKTsKK307CisKKy8vLyBcYnJpZWYgU2FtcGxlLWJhc2VkIHByb2ZpbGUgd3JpdGVyICh0ZXh0IGZvcm1hdCkuCitjbGFzcyBTYW1wbGVQcm9maWxlV3JpdGVyVGV4dCA6IHB1YmxpYyBTYW1wbGVQcm9maWxlV3JpdGVyIHsKK3B1YmxpYzoKKyAgc3RkOjplcnJvcl9jb2RlIHdyaXRlKGNvbnN0IEZ1bmN0aW9uU2FtcGxlcyAmUykgb3ZlcnJpZGU7CisKK3Byb3RlY3RlZDoKKyAgU2FtcGxlUHJvZmlsZVdyaXRlclRleHQoc3RkOjp1bmlxdWVfcHRyPHJhd19vc3RyZWFtPiAmT1MpCisgICAgICA6IFNhbXBsZVByb2ZpbGVXcml0ZXIoT1MpLCBJbmRlbnQoMCkge30KKworICBzdGQ6OmVycm9yX2NvZGUKKyAgd3JpdGVIZWFkZXIoY29uc3QgU3RyaW5nTWFwPEZ1bmN0aW9uU2FtcGxlcz4gJlByb2ZpbGVNYXApIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gc2FtcGxlcHJvZl9lcnJvcjo6c3VjY2VzczsKKyAgfQorCitwcml2YXRlOgorICAvLy8gSW5kZW50IGxldmVsIHRvIHVzZSB3aGVuIHdyaXRpbmcuCisgIC8vLworICAvLy8gVGhpcyBpcyB1c2VkIHdoZW4gcHJpbnRpbmcgaW5saW5lZCBjYWxsZWVzLgorICB1bnNpZ25lZCBJbmRlbnQ7CisKKyAgZnJpZW5kIEVycm9yT3I8c3RkOjp1bmlxdWVfcHRyPFNhbXBsZVByb2ZpbGVXcml0ZXI+PgorICBTYW1wbGVQcm9maWxlV3JpdGVyOjpjcmVhdGUoc3RkOjp1bmlxdWVfcHRyPHJhd19vc3RyZWFtPiAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYW1wbGVQcm9maWxlRm9ybWF0IEZvcm1hdCk7Cit9OworCisvLy8gXGJyaWVmIFNhbXBsZS1iYXNlZCBwcm9maWxlIHdyaXRlciAoYmluYXJ5IGZvcm1hdCkuCitjbGFzcyBTYW1wbGVQcm9maWxlV3JpdGVyQmluYXJ5IDogcHVibGljIFNhbXBsZVByb2ZpbGVXcml0ZXIgeworcHVibGljOgorICBzdGQ6OmVycm9yX2NvZGUgd3JpdGUoY29uc3QgRnVuY3Rpb25TYW1wbGVzICZTKSBvdmVycmlkZTsKKworcHJvdGVjdGVkOgorICBTYW1wbGVQcm9maWxlV3JpdGVyQmluYXJ5KHN0ZDo6dW5pcXVlX3B0cjxyYXdfb3N0cmVhbT4gJk9TKQorICAgICAgOiBTYW1wbGVQcm9maWxlV3JpdGVyKE9TKSB7fQorCisgIHN0ZDo6ZXJyb3JfY29kZQorICB3cml0ZUhlYWRlcihjb25zdCBTdHJpbmdNYXA8RnVuY3Rpb25TYW1wbGVzPiAmUHJvZmlsZU1hcCkgb3ZlcnJpZGU7CisgIHN0ZDo6ZXJyb3JfY29kZSB3cml0ZVN1bW1hcnkoKTsKKyAgc3RkOjplcnJvcl9jb2RlIHdyaXRlTmFtZUlkeChTdHJpbmdSZWYgRk5hbWUpOworICBzdGQ6OmVycm9yX2NvZGUgd3JpdGVCb2R5KGNvbnN0IEZ1bmN0aW9uU2FtcGxlcyAmUyk7CisKK3ByaXZhdGU6CisgIHZvaWQgYWRkTmFtZShTdHJpbmdSZWYgRk5hbWUpOworICB2b2lkIGFkZE5hbWVzKGNvbnN0IEZ1bmN0aW9uU2FtcGxlcyAmUyk7CisKKyAgTWFwVmVjdG9yPFN0cmluZ1JlZiwgdWludDMyX3Q+IE5hbWVUYWJsZTsKKworICBmcmllbmQgRXJyb3JPcjxzdGQ6OnVuaXF1ZV9wdHI8U2FtcGxlUHJvZmlsZVdyaXRlcj4+CisgIFNhbXBsZVByb2ZpbGVXcml0ZXI6OmNyZWF0ZShzdGQ6OnVuaXF1ZV9wdHI8cmF3X29zdHJlYW0+ICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNhbXBsZVByb2ZpbGVGb3JtYXQgRm9ybWF0KTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBzYW1wbGVwcm9mCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9QUk9GSUxFREFUQV9TQU1QTEVQUk9GV1JJVEVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BQXJjaDY0VGFyZ2V0UGFyc2VyLmRlZiBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BQXJjaDY0VGFyZ2V0UGFyc2VyLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGM3OTI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FBcmNoNjRUYXJnZXRQYXJzZXIuZGVmCkBAIC0wLDAgKzEsMTAzIEBACisvLz09PS0gQUFSQ0g2NFRhcmdldFBhcnNlci5kZWYgLSBBQVJDSDY0IHRhcmdldCBwYXJzaW5nIGRlZmluZXMgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGVzIGRlZmluZXMgdG8gYnVpbGQgdXAgdGhlIEFBUkNINjQgdGFyZ2V0IHBhcnNlcidzIGxvZ2ljLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIE5PVEU6IE5PIElOQ0xVREUgR1VBUkQgREVTSVJFRCEKKworI2lmbmRlZiBBQVJDSDY0X0FSQ0gKKyNkZWZpbmUgQUFSQ0g2NF9BUkNIKE5BTUUsIElELCBDUFVfQVRUUiwgU1VCX0FSQ0gsIEFSQ0hfQVRUUiwgQVJDSF9GUFUsIEFSQ0hfQkFTRV9FWFQpCisjZW5kaWYKK0FBUkNINjRfQVJDSCgiaW52YWxpZCIsIElOVkFMSUQsICIiLCAiIiwKKyAgICAgICAgICAgICBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2OF9BLCBGS19OT05FLCBBQXJjaDY0OjpBRUtfTk9ORSkKK0FBUkNINjRfQVJDSCgiYXJtdjgtYSIsIEFSTVY4QSwgIjgtQSIsICJ2OCIsIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OnY4X0EsCisgICAgICAgICAgICAgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsCisgICAgICAgICAgICAgKEFBcmNoNjQ6OkFFS19DUllQVE8gfCBBQXJjaDY0OjpBRUtfRlAgfCBBQXJjaDY0OjpBRUtfU0lNRCkpCitBQVJDSDY0X0FSQ0goImFybXY4LjEtYSIsIEFSTVY4XzFBLCAiOC4xLUEiLCAidjguMWEiLAorICAgICAgICAgICAgIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OnY4X0EsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LAorICAgICAgICAgICAgIChBQXJjaDY0OjpBRUtfQ1JDIHwgQUFyY2g2NDo6QUVLX0NSWVBUTyB8IEFBcmNoNjQ6OkFFS19GUCB8CisgICAgICAgICAgICAgIEFBcmNoNjQ6OkFFS19TSU1EIHwgQUFyY2g2NDo6QUVLX0xTRSB8IEFBcmNoNjQ6OkFFS19SRE0pKQorQUFSQ0g2NF9BUkNIKCJhcm12OC4yLWEiLCBBUk1WOF8yQSwgIjguMi1BIiwgInY4LjJhIiwKKyAgICAgICAgICAgICBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2OF9BLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwKKyAgICAgICAgICAgICAoQUFyY2g2NDo6QUVLX0NSQyB8IEFBcmNoNjQ6OkFFS19DUllQVE8gfCBBQXJjaDY0OjpBRUtfRlAgfAorICAgICAgICAgICAgICBBQXJjaDY0OjpBRUtfU0lNRCB8IEFBcmNoNjQ6OkFFS19SQVMgfCBBQXJjaDY0OjpBRUtfTFNFIHwKKyAgICAgICAgICAgICAgQUFyY2g2NDo6QUVLX1JETSkpCitBQVJDSDY0X0FSQ0goImFybXY4LjMtYSIsIEFSTVY4XzNBLCAiOC4zLUEiLCAidjguM2EiLAorICAgICAgICAgICAgIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OnY4X0EsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LAorICAgICAgICAgICAgIChBQXJjaDY0OjpBRUtfQ1JDIHwgQUFyY2g2NDo6QUVLX0NSWVBUTyB8IEFBcmNoNjQ6OkFFS19GUCB8CisgICAgICAgICAgICAgIEFBcmNoNjQ6OkFFS19TSU1EIHwgQUFyY2g2NDo6QUVLX1JBUyB8IEFBcmNoNjQ6OkFFS19MU0UgfAorICAgICAgICAgICAgICBBQXJjaDY0OjpBRUtfUkRNIHwgQUFyY2g2NDo6QUVLX1JDUEMpKQorI3VuZGVmIEFBUkNINjRfQVJDSAorCisjaWZuZGVmIEFBUkNINjRfQVJDSF9FWFRfTkFNRQorI2RlZmluZSBBQVJDSDY0X0FSQ0hfRVhUX05BTUUoTkFNRSwgSUQsIEZFQVRVUkUsIE5FR0ZFQVRVUkUpCisjZW5kaWYKKy8vIEZJWE1FOiBUaGlzIHdvdWxkIGJlIG5pY2VyIHdlcmUgaXQgdGFibGVnZW4KK0FBUkNINjRfQVJDSF9FWFRfTkFNRSgiaW52YWxpZCIsICBBQXJjaDY0OjpBRUtfSU5WQUxJRCwgIG51bGxwdHIsICBudWxscHRyKQorQUFSQ0g2NF9BUkNIX0VYVF9OQU1FKCJub25lIiwgICAgIEFBcmNoNjQ6OkFFS19OT05FLCAgICAgbnVsbHB0ciwgIG51bGxwdHIpCitBQVJDSDY0X0FSQ0hfRVhUX05BTUUoImNyYyIsICAgICAgQUFyY2g2NDo6QUVLX0NSQywgICAgICAiK2NyYyIsICAgIi1jcmMiKQorQUFSQ0g2NF9BUkNIX0VYVF9OQU1FKCJsc2UiLCAgICAgIEFBcmNoNjQ6OkFFS19MU0UsICAgICAgIitsc2UiLCAgICItbHNlIikKK0FBUkNINjRfQVJDSF9FWFRfTkFNRSgicmRtIiwgICAgICBBQXJjaDY0OjpBRUtfUkRNLCAgICAgICIrcmRtIiwgICAiLXJkbSIpCitBQVJDSDY0X0FSQ0hfRVhUX05BTUUoImNyeXB0byIsICAgQUFyY2g2NDo6QUVLX0NSWVBUTywgICAiK2NyeXB0byIsIi1jcnlwdG8iKQorQUFSQ0g2NF9BUkNIX0VYVF9OQU1FKCJkb3Rwcm9kIiwgIEFBcmNoNjQ6OkFFS19ET1RQUk9ELCAgIitkb3Rwcm9kIiwiLWRvdHByb2QiKQorQUFSQ0g2NF9BUkNIX0VYVF9OQU1FKCJmcCIsICAgICAgIEFBcmNoNjQ6OkFFS19GUCwgICAgICAgIitmcC1hcm12OCIsICAiLWZwLWFybXY4IikKK0FBUkNINjRfQVJDSF9FWFRfTkFNRSgic2ltZCIsICAgICBBQXJjaDY0OjpBRUtfU0lNRCwgICAgICIrbmVvbiIsICAiLW5lb24iKQorQUFSQ0g2NF9BUkNIX0VYVF9OQU1FKCJmcDE2IiwgICAgIEFBcmNoNjQ6OkFFS19GUDE2LCAgICAgIitmdWxsZnAxNiIsICAiLWZ1bGxmcDE2IikKK0FBUkNINjRfQVJDSF9FWFRfTkFNRSgicHJvZmlsZSIsICBBQXJjaDY0OjpBRUtfUFJPRklMRSwgICIrc3BlIiwgICItc3BlIikKK0FBUkNINjRfQVJDSF9FWFRfTkFNRSgicmFzIiwgICAgICBBQXJjaDY0OjpBRUtfUkFTLCAgICAgICIrcmFzIiwgICItcmFzIikKK0FBUkNINjRfQVJDSF9FWFRfTkFNRSgic3ZlIiwgICAgICBBQXJjaDY0OjpBRUtfU1ZFLCAgICAgICIrc3ZlIiwgICItc3ZlIikKK0FBUkNINjRfQVJDSF9FWFRfTkFNRSgicmNwYyIsICAgICBBQXJjaDY0OjpBRUtfUkNQQywgICAgICIrcmNwYyIsICItcmNwYyIpCisjdW5kZWYgQUFSQ0g2NF9BUkNIX0VYVF9OQU1FCisKKyNpZm5kZWYgQUFSQ0g2NF9DUFVfTkFNRQorI2RlZmluZSBBQVJDSDY0X0NQVV9OQU1FKE5BTUUsIElELCBERUZBVUxUX0ZQVSwgSVNfREVGQVVMVCwgREVGQVVMVF9FWFQpCisjZW5kaWYKK0FBUkNINjRfQ1BVX05BTUUoImNvcnRleC1hMzUiLCBBUk1WOEEsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAoQUFyY2g2NDo6QUVLX0NSQykpCitBQVJDSDY0X0NQVV9OQU1FKCJjb3J0ZXgtYTUzIiwgQVJNVjhBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgdHJ1ZSwKKyAgICAgICAgICAgICAgICAoQUFyY2g2NDo6QUVLX0NSQykpCitBQVJDSDY0X0NQVV9OQU1FKCJjb3J0ZXgtYTU1IiwgQVJNVjhfMkEsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgKEFBcmNoNjQ6OkFFS19GUDE2IHwgQUFyY2g2NDo6QUVLX0RPVFBST0QgfCBBQXJjaDY0OjpBRUtfUkNQQykpCitBQVJDSDY0X0NQVV9OQU1FKCJjb3J0ZXgtYTU3IiwgQVJNVjhBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgZmFsc2UsCisgICAgICAgICAgICAgICAgKEFBcmNoNjQ6OkFFS19DUkMpKQorQUFSQ0g2NF9DUFVfTkFNRSgiY29ydGV4LWE3MiIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLAorICAgICAgICAgICAgICAgIChBQXJjaDY0OjpBRUtfQ1JDKSkKK0FBUkNINjRfQ1BVX05BTUUoImNvcnRleC1hNzMiLCBBUk1WOEEsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAoQUFyY2g2NDo6QUVLX0NSQykpCitBQVJDSDY0X0NQVV9OQU1FKCJjb3J0ZXgtYTc1IiwgQVJNVjhfMkEsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgKEFBcmNoNjQ6OkFFS19GUDE2IHwgQUFyY2g2NDo6QUVLX0RPVFBST0QgfCBBQXJjaDY0OjpBRUtfUkNQQykpCitBQVJDSDY0X0NQVV9OQU1FKCJjeWNsb25lIiwgQVJNVjhBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgZmFsc2UsCisgICAgICAgICAgICAgICAgKEFBcmNoNjQ6OkFFS19OT05FKSkKK0FBUkNINjRfQ1BVX05BTUUoImV4eW5vcy1tMSIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLAorICAgICAgICAgICAgICAgIChBQXJjaDY0OjpBRUtfQ1JDKSkKK0FBUkNINjRfQ1BVX05BTUUoImV4eW5vcy1tMiIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLAorICAgICAgICAgICAgICAgIChBQXJjaDY0OjpBRUtfQ1JDKSkKK0FBUkNINjRfQ1BVX05BTUUoImV4eW5vcy1tMyIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLAorICAgICAgICAgICAgICAgIChBQXJjaDY0OjpBRUtfQ1JDKSkKK0FBUkNINjRfQ1BVX05BTUUoImZhbGtvciIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLAorICAgICAgICAgICAgICAgIChBQXJjaDY0OjpBRUtfQ1JDIHwgQUFyY2g2NDo6QUVLX1JETSkpCitBQVJDSDY0X0NQVV9OQU1FKCJzYXBoaXJhIiwgQVJNVjhfM0EsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAoQUFyY2g2NDo6QUVLX1BST0ZJTEUpKQorQUFSQ0g2NF9DUFVfTkFNRSgia3J5byIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLAorICAgICAgICAgICAgICAgIChBQXJjaDY0OjpBRUtfQ1JDKSkKK0FBUkNINjRfQ1BVX05BTUUoInRodW5kZXJ4MnQ5OSIsIEFSTVY4XzFBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgZmFsc2UsCisgICAgICAgICAgICAgICAgKEFBcmNoNjQ6OkFFS19OT05FKSkKK0FBUkNINjRfQ1BVX05BTUUoInRodW5kZXJ4IiwgQVJNVjhBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgZmFsc2UsCisgICAgICAgICAgICAgICAgKEFBcmNoNjQ6OkFFS19DUkMgfCBBQXJjaDY0OjpBRUtfUFJPRklMRSkpCitBQVJDSDY0X0NQVV9OQU1FKCJ0aHVuZGVyeHQ4OCIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLAorICAgICAgICAgICAgICAgIChBQXJjaDY0OjpBRUtfQ1JDIHwgQUFyY2g2NDo6QUVLX1BST0ZJTEUpKQorQUFSQ0g2NF9DUFVfTkFNRSgidGh1bmRlcnh0ODEiLCBBUk1WOEEsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAoQUFyY2g2NDo6QUVLX0NSQyB8IEFBcmNoNjQ6OkFFS19QUk9GSUxFKSkKK0FBUkNINjRfQ1BVX05BTUUoInRodW5kZXJ4dDgzIiwgQVJNVjhBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgZmFsc2UsCisgICAgICAgICAgICAgICAgKEFBcmNoNjQ6OkFFS19DUkMgfCBBQXJjaDY0OjpBRUtfUFJPRklMRSkpCisvLyBJbnZhbGlkIENQVQorQUFSQ0g2NF9DUFVfTkFNRSgiaW52YWxpZCIsIElOVkFMSUQsIEZLX0lOVkFMSUQsIHRydWUsIEFBcmNoNjQ6OkFFS19JTlZBTElEKQorI3VuZGVmIEFBUkNINjRfQ1BVX05BTUUKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BTURHUFVLZXJuZWxEZXNjcmlwdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQU1ER1BVS2VybmVsRGVzY3JpcHRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlMmMwYzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQU1ER1BVS2VybmVsRGVzY3JpcHRvci5oCkBAIC0wLDAgKzEsMTM5IEBACisvLz09PS0tLSBBTURHUFVLZXJuZWxEZXNjcmlwdG9yLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBBTURHUFUga2VybmVsIGRlc2NyaXB0b3IgZGVmaW5pdGlvbnMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCB2aXNpdAorLy8vIGh0dHBzOi8vbGx2bS5vcmcvZG9jcy9BTURHUFVVc2FnZS5odG1sI2tlcm5lbC1kZXNjcmlwdG9yLWZvci1nZng2LWdmeDkKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9BTURHUFVLRVJORUxERVNDUklQVE9SX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0FNREdQVUtFUk5FTERFU0NSSVBUT1JfSAorCisjaW5jbHVkZSA8Y3N0ZGludD4KKworLy8gQ3JlYXRlcyBlbnVtZXJhdGlvbiBlbnRyaWVzIHVzZWQgZm9yIHBhY2tpbmcgYml0cyBpbnRvIGludGVnZXJzLiBFbnVtZXJhdGlvbgorLy8gZW50cmllcyBpbmNsdWRlIGJpdCBzaGlmdCBhbW91bnQsIGJpdCB3aWR0aCwgYW5kIGJpdCBtYXNrLgorI2RlZmluZSBBTURHUFVfQklUU19FTlVNX0VOVFJZKG5hbWUsIHNoaWZ0LCB3aWR0aCkgXAorICBuYW1lICMjIF9TSElGVCA9IChzaGlmdCksICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lICMjIF9XSURUSCA9ICh3aWR0aCksICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lID0gKCgoMSA8PCAod2lkdGgpKSAtIDEpIDw8IChzaGlmdCkpICAgICAgICAgXAorCisvLyBHZXRzIGJpdHMgZm9yIHNwZWNpZmllZCBiaXQgbWFzayBmcm9tIHNwZWNpZmllZCBzb3VyY2UuCisjZGVmaW5lIEFNREdQVV9CSVRTX0dFVChzcmMsIG1hc2spIFwKKyAgKChzcmMgJiBtYXNrKSA+PiBtYXNrICMjIF9TSElGVCkgXAorCisvLyBTZXRzIGJpdHMgZm9yIHNwZWNpZmllZCBiaXQgbWFzayBpbiBzcGVjaWZpZWQgZGVzdGluYXRpb24uCisjZGVmaW5lIEFNREdQVV9CSVRTX1NFVChkc3QsIG1hc2ssIHZhbCkgICAgIFwKKyAgZHN0ICY9ICh+KDEgPDwgbWFzayAjIyBfU0hJRlQpICYgfm1hc2spOyAgXAorICBkc3QgfD0gKCgodmFsKSA8PCBtYXNrICMjIF9TSElGVCkgJiBtYXNrKSBcCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBBTURHUFUgeworbmFtZXNwYWNlIEhTQUtEIHsKKworLy8vIFxicmllZiBGbG9hdGluZyBwb2ludCByb3VuZGluZyBtb2Rlcy4KK2VudW0gOiB1aW50OF90IHsKKyAgQU1ER1BVX0ZMT0FUX1JPVU5EX01PREVfTkVBUl9FVkVOICAgICAgPSAwLAorICBBTURHUFVfRkxPQVRfUk9VTkRfTU9ERV9QTFVTX0lORklOSVRZICA9IDEsCisgIEFNREdQVV9GTE9BVF9ST1VORF9NT0RFX01JTlVTX0lORklOSVRZID0gMiwKKyAgQU1ER1BVX0ZMT0FUX1JPVU5EX01PREVfWkVSTyAgICAgICAgICAgPSAzLAorfTsKKworLy8vIFxicmllZiBGbG9hdGluZyBwb2ludCBkZW5vcm0gbW9kZXMuCitlbnVtIDogdWludDhfdCB7CisgIEFNREdQVV9GTE9BVF9ERU5PUk1fTU9ERV9GTFVTSF9TUkNfRFNUID0gMCwKKyAgQU1ER1BVX0ZMT0FUX0RFTk9STV9NT0RFX0ZMVVNIX0RTVCAgICAgPSAxLAorICBBTURHUFVfRkxPQVRfREVOT1JNX01PREVfRkxVU0hfU1JDICAgICA9IDIsCisgIEFNREdQVV9GTE9BVF9ERU5PUk1fTU9ERV9GTFVTSF9OT05FICAgID0gMywKK307CisKKy8vLyBcYnJpZWYgU3lzdGVtIFZHUFIgd29ya2l0ZW0gSURzLgorZW51bSA6IHVpbnQ4X3QgeworICBBTURHUFVfU1lTVEVNX1ZHUFJfV09SS0lURU1fSURfWCAgICAgICAgID0gMCwKKyAgQU1ER1BVX1NZU1RFTV9WR1BSX1dPUktJVEVNX0lEX1hfWSAgICAgICA9IDEsCisgIEFNREdQVV9TWVNURU1fVkdQUl9XT1JLSVRFTV9JRF9YX1lfWiAgICAgPSAyLAorICBBTURHUFVfU1lTVEVNX1ZHUFJfV09SS0lURU1fSURfVU5ERUZJTkVEID0gMywKK307CisKKy8vLyBcYnJpZWYgQ29tcHV0ZSBwcm9ncmFtIHJlc291cmNlIHJlZ2lzdGVyIG9uZSBsYXlvdXQuCitlbnVtIENvbXB1dGVQZ21Sc3JjMSB7CisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoR1JBTlVMQVRFRF9XT1JLSVRFTV9WR1BSX0NPVU5ULCAwLCA2KSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShHUkFOVUxBVEVEX1dBVkVGUk9OVF9TR1BSX0NPVU5ULCA2LCA0KSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShQUklPUklUWSwgMTAsIDIpLAorICBBTURHUFVfQklUU19FTlVNX0VOVFJZKEZMT0FUX1JPVU5EX01PREVfMzIsIDEyLCAyKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShGTE9BVF9ST1VORF9NT0RFXzE2XzY0LCAxNCwgMiksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoRkxPQVRfREVOT1JNX01PREVfMzIsIDE2LCAyKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShGTE9BVF9ERU5PUk1fTU9ERV8xNl82NCwgMTgsIDIpLAorICBBTURHUFVfQklUU19FTlVNX0VOVFJZKFBSSVYsIDIwLCAxKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShFTkFCTEVfRFgxMF9DTEFNUCwgMjEsIDEpLAorICBBTURHUFVfQklUU19FTlVNX0VOVFJZKERFQlVHX01PREUsIDIyLCAxKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShFTkFCTEVfSUVFRV9NT0RFLCAyMywgMSksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoQlVMS1ksIDI0LCAxKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShDREJHX1VTRVIsIDI1LCAxKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShGUDE2X09WRkwsIDI2LCAxKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShSRVNFUlZFRDAsIDI3LCA1KSwKK307CisKKy8vLyBcYnJpZWYgQ29tcHV0ZSBwcm9ncmFtIHJlc291cmNlIHJlZ2lzdGVyIHR3byBsYXlvdXQuCitlbnVtIENvbXB1dGVQZ21Sc3JjMiB7CisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoRU5BQkxFX1NHUFJfUFJJVkFURV9TRUdNRU5UX1dBVkVfT0ZGU0VULCAwLCAxKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShVU0VSX1NHUFJfQ09VTlQsIDEsIDUpLAorICBBTURHUFVfQklUU19FTlVNX0VOVFJZKEVOQUJMRV9UUkFQX0hBTkRMRVIsIDYsIDEpLAorICBBTURHUFVfQklUU19FTlVNX0VOVFJZKEVOQUJMRV9TR1BSX1dPUktHUk9VUF9JRF9YLCA3LCAxKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShFTkFCTEVfU0dQUl9XT1JLR1JPVVBfSURfWSwgOCwgMSksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoRU5BQkxFX1NHUFJfV09SS0dST1VQX0lEX1osIDksIDEpLAorICBBTURHUFVfQklUU19FTlVNX0VOVFJZKEVOQUJMRV9TR1BSX1dPUktHUk9VUF9JTkZPLCAxMCwgMSksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoRU5BQkxFX1ZHUFJfV09SS0lURU1fSUQsIDExLCAyKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShFTkFCTEVfRVhDRVBUSU9OX0FERFJFU1NfV0FUQ0gsIDEzLCAxKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShFTkFCTEVfRVhDRVBUSU9OX01FTU9SWSwgMTQsIDEpLAorICBBTURHUFVfQklUU19FTlVNX0VOVFJZKEdSQU5VTEFURURfTERTX1NJWkUsIDE1LCA5KSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShFTkFCTEVfRVhDRVBUSU9OX0lFRUVfNzU0X0ZQX0lOVkFMSURfT1BFUkFUSU9OLCAyNCwgMSksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoRU5BQkxFX0VYQ0VQVElPTl9GUF9ERU5PUk1BTF9TT1VSQ0UsIDI1LCAxKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShFTkFCTEVfRVhDRVBUSU9OX0lFRUVfNzU0X0ZQX0RJVklTSU9OX0JZX1pFUk8sIDI2LCAxKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShFTkFCTEVfRVhDRVBUSU9OX0lFRUVfNzU0X0ZQX09WRVJGTE9XLCAyNywgMSksCisgIEFNREdQVV9CSVRTX0VOVU1fRU5UUlkoRU5BQkxFX0VYQ0VQVElPTl9JRUVFXzc1NF9GUF9VTkRFUkZMT1csIDI4LCAxKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShFTkFCTEVfRVhDRVBUSU9OX0lFRUVfNzU0X0ZQX0lORVhBQ1QsIDI5LCAxKSwKKyAgQU1ER1BVX0JJVFNfRU5VTV9FTlRSWShFTkFCTEVfRVhDRVBUSU9OX0lOVF9ESVZJREVfQllfWkVSTywgMzAsIDEpLAorICBBTURHUFVfQklUU19FTlVNX0VOVFJZKFJFU0VSVkVEMSwgMzEsIDEpLAorfTsKKworLy8vIFxicmllZiBLZXJuZWwgZGVzY3JpcHRvciBsYXlvdXQuIFRoaXMgbGF5b3V0IHNob3VsZCBiZSBrZXB0IGJhY2t3YXJkcworLy8vIGNvbXBhdGlibGUgYXMgaXQgaXMgY29uc3VtZWQgYnkgdGhlIGNvbW1hbmQgcHJvY2Vzc29yLgorc3RydWN0IEtlcm5lbERlc2NyaXB0b3IgZmluYWwgeworICB1aW50MzJfdCBHcm91cFNlZ21lbnRGaXhlZFNpemU7CisgIHVpbnQzMl90IFByaXZhdGVTZWdtZW50Rml4ZWRTaXplOworICB1aW50MzJfdCBNYXhGbGF0V29ya0dyb3VwU2l6ZTsKKyAgdWludDY0X3QgSXNEeW5hbWljQ2FsbFN0YWNrIDogMTsKKyAgdWludDY0X3QgSXNYTkFDS0VuYWJsZWQgOiAxOworICB1aW50NjRfdCBSZXNlcnZlZDAgOiAzMDsKKyAgaW50NjRfdCBLZXJuZWxDb2RlRW50cnlCeXRlT2Zmc2V0OworICB1aW50NjRfdCBSZXNlcnZlZDFbM107CisgIHVpbnQzMl90IENvbXB1dGVQZ21Sc3JjMTsKKyAgdWludDMyX3QgQ29tcHV0ZVBnbVJzcmMyOworICB1aW50NjRfdCBFbmFibGVTR1BSUHJpdmF0ZVNlZ21lbnRCdWZmZXIgOiAxOworICB1aW50NjRfdCBFbmFibGVTR1BSRGlzcGF0Y2hQdHIgOiAxOworICB1aW50NjRfdCBFbmFibGVTR1BSUXVldWVQdHIgOiAxOworICB1aW50NjRfdCBFbmFibGVTR1BSS2VybmFyZ1NlZ21lbnRQdHIgOiAxOworICB1aW50NjRfdCBFbmFibGVTR1BSRGlzcGF0Y2hJRCA6IDE7CisgIHVpbnQ2NF90IEVuYWJsZVNHUFJGbGF0U2NyYXRjaEluaXQgOiAxOworICB1aW50NjRfdCBFbmFibGVTR1BSUHJpdmF0ZVNlZ21lbnRTaXplIDogMTsKKyAgdWludDY0X3QgRW5hYmxlU0dQUkdyaWRXb3JrZ3JvdXBDb3VudFggOiAxOworICB1aW50NjRfdCBFbmFibGVTR1BSR3JpZFdvcmtncm91cENvdW50WSA6IDE7CisgIHVpbnQ2NF90IEVuYWJsZVNHUFJHcmlkV29ya2dyb3VwQ291bnRaIDogMTsKKyAgdWludDY0X3QgUmVzZXJ2ZWQyIDogNTQ7CisKKyAgS2VybmVsRGVzY3JpcHRvcigpID0gZGVmYXVsdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBIU0FLRAorfSAvLyBlbmQgbmFtZXNwYWNlIEFNREdQVQorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9BTURHUFVLRVJORUxERVNDUklQVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BTURHUFVNZXRhZGF0YS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FNREdQVU1ldGFkYXRhLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAwMzlhNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BTURHUFVNZXRhZGF0YS5oCkBAIC0wLDAgKzEsNDgxIEBACisvLz09PS0tLSBBTURHUFVNZXRhZGF0YS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBBTURHUFUgbWV0YWRhdGEgZGVmaW5pdGlvbnMgYW5kIGluLW1lbW9yeSByZXByZXNlbnRhdGlvbnMuCisvLy8KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9BTURHUFVNRVRBREFUQV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9BTURHUFVNRVRBREFUQV9ICisKKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgQU1ER1BVIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEhTQSBtZXRhZGF0YS4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCituYW1lc3BhY2UgSFNBTUQgeworCisvLy8gXGJyaWVmIEhTQSBtZXRhZGF0YSBtYWpvciB2ZXJzaW9uLgorY29uc3RleHByIHVpbnQzMl90IFZlcnNpb25NYWpvciA9IDE7CisvLy8gXGJyaWVmIEhTQSBtZXRhZGF0YSBtaW5vciB2ZXJzaW9uLgorY29uc3RleHByIHVpbnQzMl90IFZlcnNpb25NaW5vciA9IDA7CisKKy8vLyBcYnJpZWYgSFNBIG1ldGFkYXRhIGJlZ2lubmluZyBhc3NlbWJsZXIgZGlyZWN0aXZlLgorY29uc3RleHByIGNoYXIgQXNzZW1ibGVyRGlyZWN0aXZlQmVnaW5bXSA9ICIuYW1kX2FtZGdwdV9oc2FfbWV0YWRhdGEiOworLy8vIFxicmllZiBIU0EgbWV0YWRhdGEgZW5kaW5nIGFzc2VtYmxlciBkaXJlY3RpdmUuCitjb25zdGV4cHIgY2hhciBBc3NlbWJsZXJEaXJlY3RpdmVFbmRbXSA9ICIuZW5kX2FtZF9hbWRncHVfaHNhX21ldGFkYXRhIjsKKworLy8vIFxicmllZiBBY2Nlc3MgcXVhbGlmaWVycy4KK2VudW0gY2xhc3MgQWNjZXNzUXVhbGlmaWVyIDogdWludDhfdCB7CisgIERlZmF1bHQgICA9IDAsCisgIFJlYWRPbmx5ICA9IDEsCisgIFdyaXRlT25seSA9IDIsCisgIFJlYWRXcml0ZSA9IDMsCisgIFVua25vd24gICA9IDB4ZmYKK307CisKKy8vLyBcYnJpZWYgQWRkcmVzcyBzcGFjZSBxdWFsaWZpZXJzLgorZW51bSBjbGFzcyBBZGRyZXNzU3BhY2VRdWFsaWZpZXIgOiB1aW50OF90IHsKKyAgUHJpdmF0ZSAgPSAwLAorICBHbG9iYWwgICA9IDEsCisgIENvbnN0YW50ID0gMiwKKyAgTG9jYWwgICAgPSAzLAorICBHZW5lcmljICA9IDQsCisgIFJlZ2lvbiAgID0gNSwKKyAgVW5rbm93biAgPSAweGZmCit9OworCisvLy8gXGJyaWVmIFZhbHVlIGtpbmRzLgorZW51bSBjbGFzcyBWYWx1ZUtpbmQgOiB1aW50OF90IHsKKyAgQnlWYWx1ZSAgICAgICAgICAgICAgICA9IDAsCisgIEdsb2JhbEJ1ZmZlciAgICAgICAgICAgPSAxLAorICBEeW5hbWljU2hhcmVkUG9pbnRlciAgID0gMiwKKyAgU2FtcGxlciAgICAgICAgICAgICAgICA9IDMsCisgIEltYWdlICAgICAgICAgICAgICAgICAgPSA0LAorICBQaXBlICAgICAgICAgICAgICAgICAgID0gNSwKKyAgUXVldWUgICAgICAgICAgICAgICAgICA9IDYsCisgIEhpZGRlbkdsb2JhbE9mZnNldFggICAgPSA3LAorICBIaWRkZW5HbG9iYWxPZmZzZXRZICAgID0gOCwKKyAgSGlkZGVuR2xvYmFsT2Zmc2V0WiAgICA9IDksCisgIEhpZGRlbk5vbmUgICAgICAgICAgICAgPSAxMCwKKyAgSGlkZGVuUHJpbnRmQnVmZmVyICAgICA9IDExLAorICBIaWRkZW5EZWZhdWx0UXVldWUgICAgID0gMTIsCisgIEhpZGRlbkNvbXBsZXRpb25BY3Rpb24gPSAxMywKKyAgVW5rbm93biAgICAgICAgICAgICAgICA9IDB4ZmYKK307CisKKy8vLyBcYnJpZWYgVmFsdWUgdHlwZXMuCitlbnVtIGNsYXNzIFZhbHVlVHlwZSA6IHVpbnQ4X3QgeworICBTdHJ1Y3QgID0gMCwKKyAgSTggICAgICA9IDEsCisgIFU4ICAgICAgPSAyLAorICBJMTYgICAgID0gMywKKyAgVTE2ICAgICA9IDQsCisgIEYxNiAgICAgPSA1LAorICBJMzIgICAgID0gNiwKKyAgVTMyICAgICA9IDcsCisgIEYzMiAgICAgPSA4LAorICBJNjQgICAgID0gOSwKKyAgVTY0ICAgICA9IDEwLAorICBGNjQgICAgID0gMTEsCisgIFVua25vd24gPSAweGZmCit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gS2VybmVsIE1ldGFkYXRhLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK25hbWVzcGFjZSBLZXJuZWwgeworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gS2VybmVsIEF0dHJpYnV0ZXMgTWV0YWRhdGEuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworbmFtZXNwYWNlIEF0dHJzIHsKKworbmFtZXNwYWNlIEtleSB7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpBdHRyOjpNZXRhZGF0YTo6bVJlcWRXb3JrR3JvdXBTaXplLgorY29uc3RleHByIGNoYXIgUmVxZFdvcmtHcm91cFNpemVbXSA9ICJSZXFkV29ya0dyb3VwU2l6ZSI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpBdHRyOjpNZXRhZGF0YTo6bVdvcmtHcm91cFNpemVIaW50LgorY29uc3RleHByIGNoYXIgV29ya0dyb3VwU2l6ZUhpbnRbXSA9ICJXb3JrR3JvdXBTaXplSGludCI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpBdHRyOjpNZXRhZGF0YTo6bVZlY1R5cGVIaW50LgorY29uc3RleHByIGNoYXIgVmVjVHlwZUhpbnRbXSA9ICJWZWNUeXBlSGludCI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpBdHRyOjpNZXRhZGF0YTo6bVJ1bnRpbWVIYW5kbGUuCitjb25zdGV4cHIgY2hhciBSdW50aW1lSGFuZGxlW10gPSAiUnVudGltZUhhbmRsZSI7Cit9IC8vIGVuZCBuYW1lc3BhY2UgS2V5CisKKy8vLyBcYnJpZWYgSW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIGtlcm5lbCBhdHRyaWJ1dGVzIG1ldGFkYXRhLgorc3RydWN0IE1ldGFkYXRhIGZpbmFsIHsKKyAgLy8vIFxicmllZiAncmVxZF93b3JrX2dyb3VwX3NpemUnIGF0dHJpYnV0ZS4gT3B0aW9uYWwuCisgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBtUmVxZFdvcmtHcm91cFNpemUgPSBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4oKTsKKyAgLy8vIFxicmllZiAnd29ya19ncm91cF9zaXplX2hpbnQnIGF0dHJpYnV0ZS4gT3B0aW9uYWwuCisgIHN0ZDo6dmVjdG9yPHVpbnQzMl90PiBtV29ya0dyb3VwU2l6ZUhpbnQgPSBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4oKTsKKyAgLy8vIFxicmllZiAndmVjX3R5cGVfaGludCcgYXR0cmlidXRlLiBPcHRpb25hbC4KKyAgc3RkOjpzdHJpbmcgbVZlY1R5cGVIaW50ID0gc3RkOjpzdHJpbmcoKTsKKyAgLy8vIFxicmllZiBFeHRlcm5hbCBzeW1ib2wgY3JlYXRlZCBieSBydW50aW1lIHRvIHN0b3JlIHRoZSBrZXJuZWwgYWRkcmVzcworICAvLy8gZm9yIGVucXVldWVkIGJsb2Nrcy4KKyAgc3RkOjpzdHJpbmcgbVJ1bnRpbWVIYW5kbGUgPSBzdGQ6OnN0cmluZygpOworCisgIC8vLyBcYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgTWV0YWRhdGEoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxyZXR1cm5zIFRydWUgaWYga2VybmVsIGF0dHJpYnV0ZXMgbWV0YWRhdGEgaXMgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIW5vdEVtcHR5KCk7CisgIH0KKworICAvLy8gXHJldHVybnMgVHJ1ZSBpZiBrZXJuZWwgYXR0cmlidXRlcyBtZXRhZGF0YSBpcyBub3QgZW1wdHksIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBub3RFbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIW1SZXFkV29ya0dyb3VwU2l6ZS5lbXB0eSgpIHx8ICFtV29ya0dyb3VwU2l6ZUhpbnQuZW1wdHkoKSB8fAorICAgICAgICAgICAhbVZlY1R5cGVIaW50LmVtcHR5KCkgfHwgIW1SdW50aW1lSGFuZGxlLmVtcHR5KCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBBdHRycworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gS2VybmVsIEFyZ3VtZW50IE1ldGFkYXRhLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KK25hbWVzcGFjZSBBcmcgeworCituYW1lc3BhY2UgS2V5IHsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkFyZzo6TWV0YWRhdGE6Om1OYW1lLgorY29uc3RleHByIGNoYXIgTmFtZVtdID0gIk5hbWUiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6QXJnOjpNZXRhZGF0YTo6bVR5cGVOYW1lLgorY29uc3RleHByIGNoYXIgVHlwZU5hbWVbXSA9ICJUeXBlTmFtZSI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpBcmc6Ok1ldGFkYXRhOjptU2l6ZS4KK2NvbnN0ZXhwciBjaGFyIFNpemVbXSA9ICJTaXplIjsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkFyZzo6TWV0YWRhdGE6Om1BbGlnbi4KK2NvbnN0ZXhwciBjaGFyIEFsaWduW10gPSAiQWxpZ24iOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6QXJnOjpNZXRhZGF0YTo6bVZhbHVlS2luZC4KK2NvbnN0ZXhwciBjaGFyIFZhbHVlS2luZFtdID0gIlZhbHVlS2luZCI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpBcmc6Ok1ldGFkYXRhOjptVmFsdWVUeXBlLgorY29uc3RleHByIGNoYXIgVmFsdWVUeXBlW10gPSAiVmFsdWVUeXBlIjsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkFyZzo6TWV0YWRhdGE6Om1Qb2ludGVlQWxpZ24uCitjb25zdGV4cHIgY2hhciBQb2ludGVlQWxpZ25bXSA9ICJQb2ludGVlQWxpZ24iOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6QXJnOjpNZXRhZGF0YTo6bUFkZHJTcGFjZVF1YWwuCitjb25zdGV4cHIgY2hhciBBZGRyU3BhY2VRdWFsW10gPSAiQWRkclNwYWNlUXVhbCI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpBcmc6Ok1ldGFkYXRhOjptQWNjUXVhbC4KK2NvbnN0ZXhwciBjaGFyIEFjY1F1YWxbXSA9ICJBY2NRdWFsIjsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkFyZzo6TWV0YWRhdGE6Om1BY3R1YWxBY2NRdWFsLgorY29uc3RleHByIGNoYXIgQWN0dWFsQWNjUXVhbFtdID0gIkFjdHVhbEFjY1F1YWwiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6QXJnOjpNZXRhZGF0YTo6bUlzQ29uc3QuCitjb25zdGV4cHIgY2hhciBJc0NvbnN0W10gPSAiSXNDb25zdCI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpBcmc6Ok1ldGFkYXRhOjptSXNSZXN0cmljdC4KK2NvbnN0ZXhwciBjaGFyIElzUmVzdHJpY3RbXSA9ICJJc1Jlc3RyaWN0IjsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkFyZzo6TWV0YWRhdGE6Om1Jc1ZvbGF0aWxlLgorY29uc3RleHByIGNoYXIgSXNWb2xhdGlsZVtdID0gIklzVm9sYXRpbGUiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6QXJnOjpNZXRhZGF0YTo6bUlzUGlwZS4KK2NvbnN0ZXhwciBjaGFyIElzUGlwZVtdID0gIklzUGlwZSI7Cit9IC8vIGVuZCBuYW1lc3BhY2UgS2V5CisKKy8vLyBcYnJpZWYgSW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIGtlcm5lbCBhcmd1bWVudCBtZXRhZGF0YS4KK3N0cnVjdCBNZXRhZGF0YSBmaW5hbCB7CisgIC8vLyBcYnJpZWYgTmFtZS4gT3B0aW9uYWwuCisgIHN0ZDo6c3RyaW5nIG1OYW1lID0gc3RkOjpzdHJpbmcoKTsKKyAgLy8vIFxicmllZiBUeXBlIG5hbWUuIE9wdGlvbmFsLgorICBzdGQ6OnN0cmluZyBtVHlwZU5hbWUgPSBzdGQ6OnN0cmluZygpOworICAvLy8gXGJyaWVmIFNpemUgaW4gYnl0ZXMuIFJlcXVpcmVkLgorICB1aW50MzJfdCBtU2l6ZSA9IDA7CisgIC8vLyBcYnJpZWYgQWxpZ25tZW50IGluIGJ5dGVzLiBSZXF1aXJlZC4KKyAgdWludDMyX3QgbUFsaWduID0gMDsKKyAgLy8vIFxicmllZiBWYWx1ZSBraW5kLiBSZXF1aXJlZC4KKyAgVmFsdWVLaW5kIG1WYWx1ZUtpbmQgPSBWYWx1ZUtpbmQ6OlVua25vd247CisgIC8vLyBcYnJpZWYgVmFsdWUgdHlwZS4gUmVxdWlyZWQuCisgIFZhbHVlVHlwZSBtVmFsdWVUeXBlID0gVmFsdWVUeXBlOjpVbmtub3duOworICAvLy8gXGJyaWVmIFBvaW50ZWUgYWxpZ25tZW50IGluIGJ5dGVzLiBPcHRpb25hbC4KKyAgdWludDMyX3QgbVBvaW50ZWVBbGlnbiA9IDA7CisgIC8vLyBcYnJpZWYgQWRkcmVzcyBzcGFjZSBxdWFsaWZpZXIuIE9wdGlvbmFsLgorICBBZGRyZXNzU3BhY2VRdWFsaWZpZXIgbUFkZHJTcGFjZVF1YWwgPSBBZGRyZXNzU3BhY2VRdWFsaWZpZXI6OlVua25vd247CisgIC8vLyBcYnJpZWYgQWNjZXNzIHF1YWxpZmllci4gT3B0aW9uYWwuCisgIEFjY2Vzc1F1YWxpZmllciBtQWNjUXVhbCA9IEFjY2Vzc1F1YWxpZmllcjo6VW5rbm93bjsKKyAgLy8vIFxicmllZiBBY3R1YWwgYWNjZXNzIHF1YWxpZmllci4gT3B0aW9uYWwuCisgIEFjY2Vzc1F1YWxpZmllciBtQWN0dWFsQWNjUXVhbCA9IEFjY2Vzc1F1YWxpZmllcjo6VW5rbm93bjsKKyAgLy8vIFxicmllZiBUcnVlIGlmICdjb25zdCcgcXVhbGlmaWVyIGlzIHNwZWNpZmllZC4gT3B0aW9uYWwuCisgIGJvb2wgbUlzQ29uc3QgPSBmYWxzZTsKKyAgLy8vIFxicmllZiBUcnVlIGlmICdyZXN0cmljdCcgcXVhbGlmaWVyIGlzIHNwZWNpZmllZC4gT3B0aW9uYWwuCisgIGJvb2wgbUlzUmVzdHJpY3QgPSBmYWxzZTsKKyAgLy8vIFxicmllZiBUcnVlIGlmICd2b2xhdGlsZScgcXVhbGlmaWVyIGlzIHNwZWNpZmllZC4gT3B0aW9uYWwuCisgIGJvb2wgbUlzVm9sYXRpbGUgPSBmYWxzZTsKKyAgLy8vIFxicmllZiBUcnVlIGlmICdwaXBlJyBxdWFsaWZpZXIgaXMgc3BlY2lmaWVkLiBPcHRpb25hbC4KKyAgYm9vbCBtSXNQaXBlID0gZmFsc2U7CisKKyAgLy8vIFxicmllZiBEZWZhdWx0IGNvbnN0cnVjdG9yLgorICBNZXRhZGF0YSgpID0gZGVmYXVsdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBBcmcKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEtlcm5lbCBDb2RlIFByb3BlcnRpZXMgTWV0YWRhdGEuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworbmFtZXNwYWNlIENvZGVQcm9wcyB7CisKK25hbWVzcGFjZSBLZXkgeworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6Q29kZVByb3BzOjpNZXRhZGF0YTo6bUtlcm5hcmdTZWdtZW50U2l6ZS4KK2NvbnN0ZXhwciBjaGFyIEtlcm5hcmdTZWdtZW50U2l6ZVtdID0gIktlcm5hcmdTZWdtZW50U2l6ZSI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpDb2RlUHJvcHM6Ok1ldGFkYXRhOjptR3JvdXBTZWdtZW50Rml4ZWRTaXplLgorY29uc3RleHByIGNoYXIgR3JvdXBTZWdtZW50Rml4ZWRTaXplW10gPSAiR3JvdXBTZWdtZW50Rml4ZWRTaXplIjsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkNvZGVQcm9wczo6TWV0YWRhdGE6Om1Qcml2YXRlU2VnbWVudEZpeGVkU2l6ZS4KK2NvbnN0ZXhwciBjaGFyIFByaXZhdGVTZWdtZW50Rml4ZWRTaXplW10gPSAiUHJpdmF0ZVNlZ21lbnRGaXhlZFNpemUiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6Q29kZVByb3BzOjpNZXRhZGF0YTo6bUtlcm5hcmdTZWdtZW50QWxpZ24uCitjb25zdGV4cHIgY2hhciBLZXJuYXJnU2VnbWVudEFsaWduW10gPSAiS2VybmFyZ1NlZ21lbnRBbGlnbiI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpDb2RlUHJvcHM6Ok1ldGFkYXRhOjptV2F2ZWZyb250U2l6ZS4KK2NvbnN0ZXhwciBjaGFyIFdhdmVmcm9udFNpemVbXSA9ICJXYXZlZnJvbnRTaXplIjsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkNvZGVQcm9wczo6TWV0YWRhdGE6Om1OdW1TR1BScy4KK2NvbnN0ZXhwciBjaGFyIE51bVNHUFJzW10gPSAiTnVtU0dQUnMiOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6Q29kZVByb3BzOjpNZXRhZGF0YTo6bU51bVZHUFJzLgorY29uc3RleHByIGNoYXIgTnVtVkdQUnNbXSA9ICJOdW1WR1BScyI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpDb2RlUHJvcHM6Ok1ldGFkYXRhOjptTWF4RmxhdFdvcmtHcm91cFNpemUuCitjb25zdGV4cHIgY2hhciBNYXhGbGF0V29ya0dyb3VwU2l6ZVtdID0gIk1heEZsYXRXb3JrR3JvdXBTaXplIjsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkNvZGVQcm9wczo6TWV0YWRhdGE6Om1Jc0R5bmFtaWNDYWxsU3RhY2suCitjb25zdGV4cHIgY2hhciBJc0R5bmFtaWNDYWxsU3RhY2tbXSA9ICJJc0R5bmFtaWNDYWxsU3RhY2siOworLy8vIFxicmllZiBLZXkgZm9yIEtlcm5lbDo6Q29kZVByb3BzOjpNZXRhZGF0YTo6bUlzWE5BQ0tFbmFibGVkLgorY29uc3RleHByIGNoYXIgSXNYTkFDS0VuYWJsZWRbXSA9ICJJc1hOQUNLRW5hYmxlZCI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpDb2RlUHJvcHM6Ok1ldGFkYXRhOjptTnVtU3BpbGxlZFNHUFJzLgorY29uc3RleHByIGNoYXIgTnVtU3BpbGxlZFNHUFJzW10gPSAiTnVtU3BpbGxlZFNHUFJzIjsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkNvZGVQcm9wczo6TWV0YWRhdGE6Om1OdW1TcGlsbGVkVkdQUnMuCitjb25zdGV4cHIgY2hhciBOdW1TcGlsbGVkVkdQUnNbXSA9ICJOdW1TcGlsbGVkVkdQUnMiOworfSAvLyBlbmQgbmFtZXNwYWNlIEtleQorCisvLy8gXGJyaWVmIEluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiBrZXJuZWwgY29kZSBwcm9wZXJ0aWVzIG1ldGFkYXRhLgorc3RydWN0IE1ldGFkYXRhIGZpbmFsIHsKKyAgLy8vIFxicmllZiBTaXplIGluIGJ5dGVzIG9mIHRoZSBrZXJuYXJnIHNlZ21lbnQgbWVtb3J5LiBLZXJuYXJnIHNlZ21lbnQgbWVtb3J5CisgIC8vLyBob2xkcyB0aGUgdmFsdWVzIG9mIHRoZSBhcmd1bWVudHMgdG8gdGhlIGtlcm5lbC4gUmVxdWlyZWQuCisgIHVpbnQ2NF90IG1LZXJuYXJnU2VnbWVudFNpemUgPSAwOworICAvLy8gXGJyaWVmIFNpemUgaW4gYnl0ZXMgb2YgdGhlIGdyb3VwIHNlZ21lbnQgbWVtb3J5IHJlcXVpcmVkIGJ5IGEgd29ya2dyb3VwLgorICAvLy8gVGhpcyB2YWx1ZSBkb2VzIG5vdCBpbmNsdWRlIGFueSBkeW5hbWljYWxseSBhbGxvY2F0ZWQgZ3JvdXAgc2VnbWVudCBtZW1vcnkKKyAgLy8vIHRoYXQgbWF5IGJlIGFkZGVkIHdoZW4gdGhlIGtlcm5lbCBpcyBkaXNwYXRjaGVkLiBSZXF1aXJlZC4KKyAgdWludDMyX3QgbUdyb3VwU2VnbWVudEZpeGVkU2l6ZSA9IDA7CisgIC8vLyBcYnJpZWYgU2l6ZSBpbiBieXRlcyBvZiB0aGUgcHJpdmF0ZSBzZWdtZW50IG1lbW9yeSByZXF1aXJlZCBieSBhIHdvcmtpdGVtLgorICAvLy8gUHJpdmF0ZSBzZWdtZW50IG1lbW9yeSBpbmNsdWRlcyBhcmcsIHNwaWxsIGFuZCBwcml2YXRlIHNlZ21lbnRzLiBSZXF1aXJlZC4KKyAgdWludDMyX3QgbVByaXZhdGVTZWdtZW50Rml4ZWRTaXplID0gMDsKKyAgLy8vIFxicmllZiBNYXhpbXVtIGJ5dGUgYWxpZ25tZW50IG9mIHZhcmlhYmxlcyB1c2VkIGJ5IHRoZSBrZXJuZWwgaW4gdGhlCisgIC8vLyBrZXJuYXJnIG1lbW9yeSBzZWdtZW50LiBSZXF1aXJlZC4KKyAgdWludDMyX3QgbUtlcm5hcmdTZWdtZW50QWxpZ24gPSAwOworICAvLy8gXGJyaWVmIFdhdmVmcm9udCBzaXplLiBSZXF1aXJlZC4KKyAgdWludDMyX3QgbVdhdmVmcm9udFNpemUgPSAwOworICAvLy8gXGJyaWVmIFRvdGFsIG51bWJlciBvZiBTR1BScyB1c2VkIGJ5IGEgd2F2ZWZyb250LiBPcHRpb25hbC4KKyAgdWludDE2X3QgbU51bVNHUFJzID0gMDsKKyAgLy8vIFxicmllZiBUb3RhbCBudW1iZXIgb2YgVkdQUnMgdXNlZCBieSBhIHdvcmtpdGVtLiBPcHRpb25hbC4KKyAgdWludDE2X3QgbU51bVZHUFJzID0gMDsKKyAgLy8vIFxicmllZiBNYXhpbXVtIGZsYXQgd29yay1ncm91cCBzaXplIHN1cHBvcnRlZCBieSB0aGUga2VybmVsLiBPcHRpb25hbC4KKyAgdWludDMyX3QgbU1heEZsYXRXb3JrR3JvdXBTaXplID0gMDsKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoZSBnZW5lcmF0ZWQgbWFjaGluZSBjb2RlIGlzIHVzaW5nIGEgZHluYW1pY2FsbHkgc2l6ZWQKKyAgLy8vIGNhbGwgc3RhY2suIE9wdGlvbmFsLgorICBib29sIG1Jc0R5bmFtaWNDYWxsU3RhY2sgPSBmYWxzZTsKKyAgLy8vIFxicmllZiBUcnVlIGlmIHRoZSBnZW5lcmF0ZWQgbWFjaGluZSBjb2RlIGlzIGNhcGFibGUgb2Ygc3VwcG9ydGluZyBYTkFDSy4KKyAgLy8vIE9wdGlvbmFsLgorICBib29sIG1Jc1hOQUNLRW5hYmxlZCA9IGZhbHNlOworICAvLy8gXGJyaWVmIE51bWJlciBvZiBTR1BScyBzcGlsbGVkIGJ5IGEgd2F2ZWZyb250LiBPcHRpb25hbC4KKyAgdWludDE2X3QgbU51bVNwaWxsZWRTR1BScyA9IDA7CisgIC8vLyBcYnJpZWYgTnVtYmVyIG9mIFZHUFJzIHNwaWxsZWQgYnkgYSB3b3JraXRlbS4gT3B0aW9uYWwuCisgIHVpbnQxNl90IG1OdW1TcGlsbGVkVkdQUnMgPSAwOworCisgIC8vLyBcYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgTWV0YWRhdGEoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxyZXR1cm5zIFRydWUgaWYga2VybmVsIGNvZGUgcHJvcGVydGllcyBtZXRhZGF0YSBpcyBlbXB0eSwgZmFsc2UKKyAgLy8vIG90aGVyd2lzZS4KKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIW5vdEVtcHR5KCk7CisgIH0KKworICAvLy8gXHJldHVybnMgVHJ1ZSBpZiBrZXJuZWwgY29kZSBwcm9wZXJ0aWVzIG1ldGFkYXRhIGlzIG5vdCBlbXB0eSwgZmFsc2UKKyAgLy8vIG90aGVyd2lzZS4KKyAgYm9vbCBub3RFbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIENvZGVQcm9wcworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gS2VybmVsIERlYnVnIFByb3BlcnRpZXMgTWV0YWRhdGEuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworbmFtZXNwYWNlIERlYnVnUHJvcHMgeworCituYW1lc3BhY2UgS2V5IHsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkRlYnVnUHJvcHM6Ok1ldGFkYXRhOjptRGVidWdnZXJBQklWZXJzaW9uLgorY29uc3RleHByIGNoYXIgRGVidWdnZXJBQklWZXJzaW9uW10gPSAiRGVidWdnZXJBQklWZXJzaW9uIjsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkRlYnVnUHJvcHM6Ok1ldGFkYXRhOjptUmVzZXJ2ZWROdW1WR1BScy4KK2NvbnN0ZXhwciBjaGFyIFJlc2VydmVkTnVtVkdQUnNbXSA9ICJSZXNlcnZlZE51bVZHUFJzIjsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkRlYnVnUHJvcHM6Ok1ldGFkYXRhOjptUmVzZXJ2ZWRGaXJzdFZHUFIuCitjb25zdGV4cHIgY2hhciBSZXNlcnZlZEZpcnN0VkdQUltdID0gIlJlc2VydmVkRmlyc3RWR1BSIjsKKy8vLyBcYnJpZWYgS2V5IGZvciBLZXJuZWw6OkRlYnVnUHJvcHM6Ok1ldGFkYXRhOjptUHJpdmF0ZVNlZ21lbnRCdWZmZXJTR1BSLgorY29uc3RleHByIGNoYXIgUHJpdmF0ZVNlZ21lbnRCdWZmZXJTR1BSW10gPSAiUHJpdmF0ZVNlZ21lbnRCdWZmZXJTR1BSIjsKKy8vLyBcYnJpZWYgS2V5IGZvcgorLy8vICAgICBLZXJuZWw6OkRlYnVnUHJvcHM6Ok1ldGFkYXRhOjptV2F2ZWZyb250UHJpdmF0ZVNlZ21lbnRPZmZzZXRTR1BSLgorY29uc3RleHByIGNoYXIgV2F2ZWZyb250UHJpdmF0ZVNlZ21lbnRPZmZzZXRTR1BSW10gPQorICAgICJXYXZlZnJvbnRQcml2YXRlU2VnbWVudE9mZnNldFNHUFIiOworfSAvLyBlbmQgbmFtZXNwYWNlIEtleQorCisvLy8gXGJyaWVmIEluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiBrZXJuZWwgZGVidWcgcHJvcGVydGllcyBtZXRhZGF0YS4KK3N0cnVjdCBNZXRhZGF0YSBmaW5hbCB7CisgIC8vLyBcYnJpZWYgRGVidWdnZXIgQUJJIHZlcnNpb24uIE9wdGlvbmFsLgorICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gbURlYnVnZ2VyQUJJVmVyc2lvbiA9IHN0ZDo6dmVjdG9yPHVpbnQzMl90PigpOworICAvLy8gXGJyaWVmIENvbnNlY3V0aXZlIG51bWJlciBvZiBWR1BScyByZXNlcnZlZCBmb3IgZGVidWdnZXIgdXNlLiBNdXN0IGJlIDAgaWYKKyAgLy8vIG1EZWJ1Z2dlckFCSVZlcnNpb24gaXMgbm90IHNldC4gT3B0aW9uYWwuCisgIHVpbnQxNl90IG1SZXNlcnZlZE51bVZHUFJzID0gMDsKKyAgLy8vIFxicmllZiBGaXJzdCBmaXhlZCBWR1BSIHJlc2VydmVkLiBNdXN0IGJlIHVpbnQxNl90KC0xKSBpZgorICAvLy8gbURlYnVnZ2VyQUJJVmVyc2lvbiBpcyBub3Qgc2V0IG9yIG1SZXNlcnZlZEZpcnN0VkdQUiBpcyAwLiBPcHRpb25hbC4KKyAgdWludDE2X3QgbVJlc2VydmVkRmlyc3RWR1BSID0gdWludDE2X3QoLTEpOworICAvLy8gXGJyaWVmIEZpeGVkIFNHUFIgb2YgdGhlIGZpcnN0IG9mIDQgU0dQUnMgdXNlZCB0byBob2xkIHRoZSBzY3JhdGNoIFYjIHVzZWQKKyAgLy8vIGZvciB0aGUgZW50aXJlIGtlcm5lbCBleGVjdXRpb24uIE11c3QgYmUgdWludDE2X3QoLTEpIGlmCisgIC8vLyBtRGVidWdnZXJBQklWZXJzaW9uIGlzIG5vdCBzZXQgb3IgU0dQUiBub3QgdXNlZCBvciBub3Qga25vd24uIE9wdGlvbmFsLgorICB1aW50MTZfdCBtUHJpdmF0ZVNlZ21lbnRCdWZmZXJTR1BSID0gdWludDE2X3QoLTEpOworICAvLy8gXGJyaWVmIEZpeGVkIFNHUFIgdXNlZCB0byBob2xkIHRoZSB3YXZlIHNjcmF0Y2ggb2Zmc2V0IGZvciB0aGUgZW50aXJlCisgIC8vLyBrZXJuZWwgZXhlY3V0aW9uLiBNdXN0IGJlIHVpbnQxNl90KC0xKSBpZiBtRGVidWdnZXJBQklWZXJzaW9uIGlzIG5vdCBzZXQKKyAgLy8vIG9yIFNHUFIgaXMgbm90IHVzZWQgb3Igbm90IGtub3duLiBPcHRpb25hbC4KKyAgdWludDE2X3QgbVdhdmVmcm9udFByaXZhdGVTZWdtZW50T2Zmc2V0U0dQUiA9IHVpbnQxNl90KC0xKTsKKworICAvLy8gXGJyaWVmIERlZmF1bHQgY29uc3RydWN0b3IuCisgIE1ldGFkYXRhKCkgPSBkZWZhdWx0OworCisgIC8vLyBccmV0dXJucyBUcnVlIGlmIGtlcm5lbCBkZWJ1ZyBwcm9wZXJ0aWVzIG1ldGFkYXRhIGlzIGVtcHR5LCBmYWxzZQorICAvLy8gb3RoZXJ3aXNlLgorICBib29sIGVtcHR5KCkgY29uc3QgeworICAgIHJldHVybiAhbm90RW1wdHkoKTsKKyAgfQorCisgIC8vLyBccmV0dXJucyBUcnVlIGlmIGtlcm5lbCBkZWJ1ZyBwcm9wZXJ0aWVzIG1ldGFkYXRhIGlzIG5vdCBlbXB0eSwgZmFsc2UKKyAgLy8vIG90aGVyd2lzZS4KKyAgYm9vbCBub3RFbXB0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gIW1EZWJ1Z2dlckFCSVZlcnNpb24uZW1wdHkoKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIERlYnVnUHJvcHMKKworbmFtZXNwYWNlIEtleSB7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpNZXRhZGF0YTo6bU5hbWUuCitjb25zdGV4cHIgY2hhciBOYW1lW10gPSAiTmFtZSI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpNZXRhZGF0YTo6bVN5bWJvbE5hbWUuCitjb25zdGV4cHIgY2hhciBTeW1ib2xOYW1lW10gPSAiU3ltYm9sTmFtZSI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpNZXRhZGF0YTo6bUxhbmd1YWdlLgorY29uc3RleHByIGNoYXIgTGFuZ3VhZ2VbXSA9ICJMYW5ndWFnZSI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpNZXRhZGF0YTo6bUxhbmd1YWdlVmVyc2lvbi4KK2NvbnN0ZXhwciBjaGFyIExhbmd1YWdlVmVyc2lvbltdID0gIkxhbmd1YWdlVmVyc2lvbiI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpNZXRhZGF0YTo6bUF0dHJzLgorY29uc3RleHByIGNoYXIgQXR0cnNbXSA9ICJBdHRycyI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpNZXRhZGF0YTo6bUFyZ3MuCitjb25zdGV4cHIgY2hhciBBcmdzW10gPSAiQXJncyI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpNZXRhZGF0YTo6bUNvZGVQcm9wcy4KK2NvbnN0ZXhwciBjaGFyIENvZGVQcm9wc1tdID0gIkNvZGVQcm9wcyI7CisvLy8gXGJyaWVmIEtleSBmb3IgS2VybmVsOjpNZXRhZGF0YTo6bURlYnVnUHJvcHMuCitjb25zdGV4cHIgY2hhciBEZWJ1Z1Byb3BzW10gPSAiRGVidWdQcm9wcyI7Cit9IC8vIGVuZCBuYW1lc3BhY2UgS2V5CisKKy8vLyBcYnJpZWYgSW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIGtlcm5lbCBtZXRhZGF0YS4KK3N0cnVjdCBNZXRhZGF0YSBmaW5hbCB7CisgIC8vLyBcYnJpZWYgS2VybmVsIHNvdXJjZSBuYW1lLiBSZXF1aXJlZC4KKyAgc3RkOjpzdHJpbmcgbU5hbWUgPSBzdGQ6OnN0cmluZygpOworICAvLy8gXGJyaWVmIEtlcm5lbCBkZXNjcmlwdG9yIG5hbWUuIFJlcXVpcmVkLgorICBzdGQ6OnN0cmluZyBtU3ltYm9sTmFtZSA9IHN0ZDo6c3RyaW5nKCk7CisgIC8vLyBcYnJpZWYgTGFuZ3VhZ2UuIE9wdGlvbmFsLgorICBzdGQ6OnN0cmluZyBtTGFuZ3VhZ2UgPSBzdGQ6OnN0cmluZygpOworICAvLy8gXGJyaWVmIExhbmd1YWdlIHZlcnNpb24uIE9wdGlvbmFsLgorICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gbUxhbmd1YWdlVmVyc2lvbiA9IHN0ZDo6dmVjdG9yPHVpbnQzMl90PigpOworICAvLy8gXGJyaWVmIEF0dHJpYnV0ZXMgbWV0YWRhdGEuIE9wdGlvbmFsLgorICBBdHRyczo6TWV0YWRhdGEgbUF0dHJzID0gQXR0cnM6Ok1ldGFkYXRhKCk7CisgIC8vLyBcYnJpZWYgQXJndW1lbnRzIG1ldGFkYXRhLiBPcHRpb25hbC4KKyAgc3RkOjp2ZWN0b3I8QXJnOjpNZXRhZGF0YT4gbUFyZ3MgPSBzdGQ6OnZlY3RvcjxBcmc6Ok1ldGFkYXRhPigpOworICAvLy8gXGJyaWVmIENvZGUgcHJvcGVydGllcyBtZXRhZGF0YS4gT3B0aW9uYWwuCisgIENvZGVQcm9wczo6TWV0YWRhdGEgbUNvZGVQcm9wcyA9IENvZGVQcm9wczo6TWV0YWRhdGEoKTsKKyAgLy8vIFxicmllZiBEZWJ1ZyBwcm9wZXJ0aWVzIG1ldGFkYXRhLiBPcHRpb25hbC4KKyAgRGVidWdQcm9wczo6TWV0YWRhdGEgbURlYnVnUHJvcHMgPSBEZWJ1Z1Byb3BzOjpNZXRhZGF0YSgpOworCisgIC8vLyBcYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgTWV0YWRhdGEoKSA9IGRlZmF1bHQ7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgS2VybmVsCisKK25hbWVzcGFjZSBLZXkgeworLy8vIFxicmllZiBLZXkgZm9yIEhTQTo6TWV0YWRhdGE6Om1WZXJzaW9uLgorY29uc3RleHByIGNoYXIgVmVyc2lvbltdID0gIlZlcnNpb24iOworLy8vIFxicmllZiBLZXkgZm9yIEhTQTo6TWV0YWRhdGE6Om1QcmludGYuCitjb25zdGV4cHIgY2hhciBQcmludGZbXSA9ICJQcmludGYiOworLy8vIFxicmllZiBLZXkgZm9yIEhTQTo6TWV0YWRhdGE6Om1LZXJuZWxzLgorY29uc3RleHByIGNoYXIgS2VybmVsc1tdID0gIktlcm5lbHMiOworfSAvLyBlbmQgbmFtZXNwYWNlIEtleQorCisvLy8gXGJyaWVmIEluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiBIU0EgbWV0YWRhdGEuCitzdHJ1Y3QgTWV0YWRhdGEgZmluYWwgeworICAvLy8gXGJyaWVmIEhTQSBtZXRhZGF0YSB2ZXJzaW9uLiBSZXF1aXJlZC4KKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IG1WZXJzaW9uID0gc3RkOjp2ZWN0b3I8dWludDMyX3Q+KCk7CisgIC8vLyBcYnJpZWYgUHJpbnRmIG1ldGFkYXRhLiBPcHRpb25hbC4KKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IG1QcmludGYgPSBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4oKTsKKyAgLy8vIFxicmllZiBLZXJuZWxzIG1ldGFkYXRhLiBSZXF1aXJlZC4KKyAgc3RkOjp2ZWN0b3I8S2VybmVsOjpNZXRhZGF0YT4gbUtlcm5lbHMgPSBzdGQ6OnZlY3RvcjxLZXJuZWw6Ok1ldGFkYXRhPigpOworCisgIC8vLyBcYnJpZWYgRGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgTWV0YWRhdGEoKSA9IGRlZmF1bHQ7Cit9OworCisvLy8gXGJyaWVmIENvbnZlcnRzIFxwIFN0cmluZyB0byBccCBIU0FNZXRhZGF0YS4KK3N0ZDo6ZXJyb3JfY29kZSBmcm9tU3RyaW5nKHN0ZDo6c3RyaW5nIFN0cmluZywgTWV0YWRhdGEgJkhTQU1ldGFkYXRhKTsKKworLy8vIFxicmllZiBDb252ZXJ0cyBccCBIU0FNZXRhZGF0YSB0byBccCBTdHJpbmcuCitzdGQ6OmVycm9yX2NvZGUgdG9TdHJpbmcoTWV0YWRhdGEgSFNBTWV0YWRhdGEsIHN0ZDo6c3RyaW5nICZTdHJpbmcpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgSFNBTUQKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBBTCBtZXRhZGF0YS4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCituYW1lc3BhY2UgUEFMTUQgeworCisvLy8gXGJyaWVmIFBBTCBtZXRhZGF0YSBhc3NlbWJsZXIgZGlyZWN0aXZlLgorY29uc3RleHByIGNoYXIgQXNzZW1ibGVyRGlyZWN0aXZlW10gPSAiLmFtZF9hbWRncHVfcGFsX21ldGFkYXRhIjsKKworLy8vIFxicmllZiBQQUwgbWV0YWRhdGEga2V5cy4KK2VudW0gS2V5IDogdWludDMyX3QgeworICBMU19OVU1fVVNFRF9WR1BSUyA9IDB4MTAwMDAwMjEsCisgIEhTX05VTV9VU0VEX1ZHUFJTID0gMHgxMDAwMDAyMiwKKyAgRVNfTlVNX1VTRURfVkdQUlMgPSAweDEwMDAwMDIzLAorICBHU19OVU1fVVNFRF9WR1BSUyA9IDB4MTAwMDAwMjQsCisgIFZTX05VTV9VU0VEX1ZHUFJTID0gMHgxMDAwMDAyNSwKKyAgUFNfTlVNX1VTRURfVkdQUlMgPSAweDEwMDAwMDI2LAorICBDU19OVU1fVVNFRF9WR1BSUyA9IDB4MTAwMDAwMjcsCisKKyAgTFNfTlVNX1VTRURfU0dQUlMgPSAweDEwMDAwMDI4LAorICBIU19OVU1fVVNFRF9TR1BSUyA9IDB4MTAwMDAwMjksCisgIEVTX05VTV9VU0VEX1NHUFJTID0gMHgxMDAwMDAyYSwKKyAgR1NfTlVNX1VTRURfU0dQUlMgPSAweDEwMDAwMDJiLAorICBWU19OVU1fVVNFRF9TR1BSUyA9IDB4MTAwMDAwMmMsCisgIFBTX05VTV9VU0VEX1NHUFJTID0gMHgxMDAwMDAyZCwKKyAgQ1NfTlVNX1VTRURfU0dQUlMgPSAweDEwMDAwMDJlLAorCisgIExTX1NDUkFUQ0hfU0laRSA9IDB4MTAwMDAwNDQsCisgIEhTX1NDUkFUQ0hfU0laRSA9IDB4MTAwMDAwNDUsCisgIEVTX1NDUkFUQ0hfU0laRSA9IDB4MTAwMDAwNDYsCisgIEdTX1NDUkFUQ0hfU0laRSA9IDB4MTAwMDAwNDcsCisgIFZTX1NDUkFUQ0hfU0laRSA9IDB4MTAwMDAwNDgsCisgIFBTX1NDUkFUQ0hfU0laRSA9IDB4MTAwMDAwNDksCisgIENTX1NDUkFUQ0hfU0laRSA9IDB4MTAwMDAwNGEKK307CisKKy8vLyBcYnJpZWYgUEFMIG1ldGFkYXRhIHJlcHJlc2VudGVkIGFzIGEgdmVjdG9yLgordHlwZWRlZiBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gTWV0YWRhdGE7CisKKy8vLyBcYnJpZWYgQ29udmVydHMgXHAgUEFMTWV0YWRhdGEgdG8gXHAgU3RyaW5nLgorc3RkOjplcnJvcl9jb2RlIHRvU3RyaW5nKGNvbnN0IE1ldGFkYXRhICZQQUxNZXRhZGF0YSwgc3RkOjpzdHJpbmcgJlN0cmluZyk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBQQUxNRAorfSAvLyBlbmQgbmFtZXNwYWNlIEFNREdQVQorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9BTURHUFVNRVRBREFUQV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQVJNQXR0cmlidXRlUGFyc2VyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQVJNQXR0cmlidXRlUGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE5ZjM5NwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BUk1BdHRyaWJ1dGVQYXJzZXIuaApAQCAtMCwwICsxLDE0MCBAQAorLy89PT0tLS0gQVJNQXR0cmlidXRlUGFyc2VyLmggLSBBUk0gQXR0cmlidXRlIEluZm9ybWF0aW9uIFByaW50ZXIgLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQVJNQVRUUklCVVRFUEFSU0VSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0FSTUFUVFJJQlVURVBBUlNFUl9ICisKKyNpbmNsdWRlICJBUk1CdWlsZEF0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJTY29wZWRQcmludGVyLmgiCisKKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFN0cmluZ1JlZjsKKworY2xhc3MgQVJNQXR0cmlidXRlUGFyc2VyIHsKKyAgU2NvcGVkUHJpbnRlciAqU1c7CisKKyAgc3RkOjptYXA8dW5zaWduZWQsIHVuc2lnbmVkPiBBdHRyaWJ1dGVzOworCisgIHN0cnVjdCBEaXNwbGF5SGFuZGxlciB7CisgICAgQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgQXR0cmlidXRlOworICAgIHZvaWQgKEFSTUF0dHJpYnV0ZVBhcnNlcjo6KlJvdXRpbmUpKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKiwgdWludDMyX3QgJik7CisgIH07CisgIHN0YXRpYyBjb25zdCBEaXNwbGF5SGFuZGxlciBEaXNwbGF5Um91dGluZXNbXTsKKworICB1aW50NjRfdCBQYXJzZUludGVnZXIoY29uc3QgdWludDhfdCAqRGF0YSwgdWludDMyX3QgJk9mZnNldCk7CisgIFN0cmluZ1JlZiBQYXJzZVN0cmluZyhjb25zdCB1aW50OF90ICpEYXRhLCB1aW50MzJfdCAmT2Zmc2V0KTsKKworICB2b2lkIEludGVnZXJBdHRyaWJ1dGUoQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgVGFnLCBjb25zdCB1aW50OF90ICpEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgU3RyaW5nQXR0cmlidXRlKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisKKyAgdm9pZCBQcmludEF0dHJpYnV0ZSh1bnNpZ25lZCBUYWcsIHVuc2lnbmVkIFZhbHVlLCBTdHJpbmdSZWYgVmFsdWVEZXNjKTsKKworICB2b2lkIENQVV9hcmNoKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICB1aW50MzJfdCAmT2Zmc2V0KTsKKyAgdm9pZCBDUFVfYXJjaF9wcm9maWxlKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIEFSTV9JU0FfdXNlKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmT2Zmc2V0KTsKKyAgdm9pZCBUSFVNQl9JU0FfdXNlKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIEZQX2FyY2goQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgVGFnLCBjb25zdCB1aW50OF90ICpEYXRhLAorICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgV01NWF9hcmNoKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgQWR2YW5jZWRfU0lNRF9hcmNoKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgUENTX2NvbmZpZyhBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmT2Zmc2V0KTsKKyAgdm9pZCBBQklfUENTX1I5X3VzZShBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgQUJJX1BDU19SV19kYXRhKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgQUJJX1BDU19ST19kYXRhKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgQUJJX1BDU19HT1RfdXNlKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgQUJJX1BDU193Y2hhcl90KEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgQUJJX0ZQX3JvdW5kaW5nKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgQUJJX0ZQX2Rlbm9ybWFsKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgQUJJX0ZQX2V4Y2VwdGlvbnMoQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgVGFnLCBjb25zdCB1aW50OF90ICpEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIEFCSV9GUF91c2VyX2V4Y2VwdGlvbnMoQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgVGFnLCBjb25zdCB1aW50OF90ICpEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgQUJJX0ZQX251bWJlcl9tb2RlbChBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmT2Zmc2V0KTsKKyAgdm9pZCBBQklfYWxpZ25fbmVlZGVkKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIEFCSV9hbGlnbl9wcmVzZXJ2ZWQoQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgVGFnLCBjb25zdCB1aW50OF90ICpEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgQUJJX2VudW1fc2l6ZShBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmT2Zmc2V0KTsKKyAgdm9pZCBBQklfSGFyZEZQX3VzZShBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgQUJJX1ZGUF9hcmdzKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgQUJJX1dNTVhfYXJncyhBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmT2Zmc2V0KTsKKyAgdm9pZCBBQklfb3B0aW1pemF0aW9uX2dvYWxzKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIEFCSV9GUF9vcHRpbWl6YXRpb25fZ29hbHMoQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgVGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqRGF0YSwgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgY29tcGF0aWJpbGl0eShBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmT2Zmc2V0KTsKKyAgdm9pZCBDUFVfdW5hbGlnbmVkX2FjY2VzcyhBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgRlBfSFBfZXh0ZW5zaW9uKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgQUJJX0ZQXzE2Yml0X2Zvcm1hdChBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmT2Zmc2V0KTsKKyAgdm9pZCBNUGV4dGVuc2lvbl91c2UoQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgVGFnLCBjb25zdCB1aW50OF90ICpEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCAmT2Zmc2V0KTsKKyAgdm9pZCBESVZfdXNlKEFSTUJ1aWxkQXR0cnM6OkF0dHJUeXBlIFRhZywgY29uc3QgdWludDhfdCAqRGF0YSwKKyAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIERTUF9leHRlbnNpb24oQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgVGFnLCBjb25zdCB1aW50OF90ICpEYXRhLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisgIHZvaWQgVDJFRV91c2UoQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgVGFnLCBjb25zdCB1aW50OF90ICpEYXRhLAorICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIFZpcnR1YWxpemF0aW9uX3VzZShBUk1CdWlsZEF0dHJzOjpBdHRyVHlwZSBUYWcsIGNvbnN0IHVpbnQ4X3QgKkRhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90ICZPZmZzZXQpOworICB2b2lkIG5vZGVmYXVsdHMoQVJNQnVpbGRBdHRyczo6QXR0clR5cGUgVGFnLCBjb25zdCB1aW50OF90ICpEYXRhLAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgJk9mZnNldCk7CisKKyAgdm9pZCBQYXJzZUF0dHJpYnV0ZUxpc3QoY29uc3QgdWludDhfdCAqRGF0YSwgdWludDMyX3QgJk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTGVuZ3RoKTsKKyAgdm9pZCBQYXJzZUluZGV4TGlzdChjb25zdCB1aW50OF90ICpEYXRhLCB1aW50MzJfdCAmT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDx1aW50OF90PiAmSW5kZXhMaXN0KTsKKyAgdm9pZCBQYXJzZVN1YnNlY3Rpb24oY29uc3QgdWludDhfdCAqRGF0YSwgdWludDMyX3QgTGVuZ3RoKTsKK3B1YmxpYzoKKyAgQVJNQXR0cmlidXRlUGFyc2VyKFNjb3BlZFByaW50ZXIgKlNXKSA6IFNXKFNXKSB7fQorCisgIEFSTUF0dHJpYnV0ZVBhcnNlcigpIDogU1cobnVsbHB0cikgeyB9CisKKyAgdm9pZCBQYXJzZShBcnJheVJlZjx1aW50OF90PiBTZWN0aW9uLCBib29sIGlzTGl0dGxlKTsKKworICBib29sIGhhc0F0dHJpYnV0ZSh1bnNpZ25lZCBUYWcpIGNvbnN0IHsKKyAgICByZXR1cm4gQXR0cmlidXRlcy5jb3VudChUYWcpOworICB9CisKKyAgdW5zaWduZWQgZ2V0QXR0cmlidXRlVmFsdWUodW5zaWduZWQgVGFnKSBjb25zdCB7CisgICAgcmV0dXJuIEF0dHJpYnV0ZXMuZmluZChUYWcpLT5zZWNvbmQ7CisgIH0KK307CisKK30KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BUk1CdWlsZEF0dHJpYnV0ZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BUk1CdWlsZEF0dHJpYnV0ZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzgzZTQ0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FSTUJ1aWxkQXR0cmlidXRlcy5oCkBAIC0wLDAgKzEsMjQ2IEBACisvLz09PS0tIEFSTUJ1aWxkQXR0cmlidXRlcy5oIC0gQVJNIEJ1aWxkIEF0dHJpYnV0ZXMgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBlbnVtZXJhdGlvbnMgYW5kIHN1cHBvcnQgcm91dGluZXMgZm9yIEFSTSBidWlsZCBhdHRyaWJ1dGVzCisvLyBhcyBkZWZpbmVkIGluIEFSTSBBQkkgYWRkZW5kYSBkb2N1bWVudCAoQUJJIHJlbGVhc2UgMi4wOCkuCisvLworLy8gRUxGIGZvciB0aGUgQVJNIEFyY2hpdGVjdHVyZSByMi4wOSAtIE5vdmVtYmVyIDMwLCAyMDEyCisvLworLy8gaHR0cDovL2luZm9jZW50ZXIuYXJtLmNvbS9oZWxwL3RvcGljL2NvbS5hcm0uZG9jLmloaTAwNDRlL0lISTAwNDRFX2FhZWxmLnBkZgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0FSTUJVSUxEQVRUUklCVVRFU19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9BUk1CVUlMREFUVFJJQlVURVNfSAorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBTdHJpbmdSZWY7CisKK25hbWVzcGFjZSBBUk1CdWlsZEF0dHJzIHsKKworZW51bSBTcGVjaWFsQXR0ciB7CisgIC8vIFRoaXMgaXMgZm9yIHRoZSAuY3B1IGFzbSBhdHRyLiBJdCB0cmFuc2xhdGVzIGludG8gb25lIG9yIG1vcmUKKyAgLy8gQXR0clR5cGUgKGJlbG93KSBlbnRyaWVzIGluIHRoZSAuQVJNLmF0dHJpYnV0ZXMgc2VjdGlvbiBpbiB0aGUgRUxGLgorICBTRUxfQ1BVCit9OworCitlbnVtIEF0dHJUeXBlIHsKKyAgLy8gUmVzdCBjb3JyZXNwb25kIHRvIEVMRi8uQVJNLmF0dHJpYnV0ZXMKKyAgRmlsZSAgICAgICAgICAgICAgICAgICAgICA9IDEsCisgIENQVV9yYXdfbmFtZSAgICAgICAgICAgICAgPSA0LAorICBDUFVfbmFtZSAgICAgICAgICAgICAgICAgID0gNSwKKyAgQ1BVX2FyY2ggICAgICAgICAgICAgICAgICA9IDYsCisgIENQVV9hcmNoX3Byb2ZpbGUgICAgICAgICAgPSA3LAorICBBUk1fSVNBX3VzZSAgICAgICAgICAgICAgID0gOCwKKyAgVEhVTUJfSVNBX3VzZSAgICAgICAgICAgICA9IDksCisgIEZQX2FyY2ggICAgICAgICAgICAgICAgICAgPSAxMCwKKyAgV01NWF9hcmNoICAgICAgICAgICAgICAgICA9IDExLAorICBBZHZhbmNlZF9TSU1EX2FyY2ggICAgICAgID0gMTIsCisgIFBDU19jb25maWcgICAgICAgICAgICAgICAgPSAxMywKKyAgQUJJX1BDU19SOV91c2UgICAgICAgICAgICA9IDE0LAorICBBQklfUENTX1JXX2RhdGEgICAgICAgICAgID0gMTUsCisgIEFCSV9QQ1NfUk9fZGF0YSAgICAgICAgICAgPSAxNiwKKyAgQUJJX1BDU19HT1RfdXNlICAgICAgICAgICA9IDE3LAorICBBQklfUENTX3djaGFyX3QgICAgICAgICAgID0gMTgsCisgIEFCSV9GUF9yb3VuZGluZyAgICAgICAgICAgPSAxOSwKKyAgQUJJX0ZQX2Rlbm9ybWFsICAgICAgICAgICA9IDIwLAorICBBQklfRlBfZXhjZXB0aW9ucyAgICAgICAgID0gMjEsCisgIEFCSV9GUF91c2VyX2V4Y2VwdGlvbnMgICAgPSAyMiwKKyAgQUJJX0ZQX251bWJlcl9tb2RlbCAgICAgICA9IDIzLAorICBBQklfYWxpZ25fbmVlZGVkICAgICAgICAgID0gMjQsCisgIEFCSV9hbGlnbl9wcmVzZXJ2ZWQgICAgICAgPSAyNSwKKyAgQUJJX2VudW1fc2l6ZSAgICAgICAgICAgICA9IDI2LAorICBBQklfSGFyZEZQX3VzZSAgICAgICAgICAgID0gMjcsCisgIEFCSV9WRlBfYXJncyAgICAgICAgICAgICAgPSAyOCwKKyAgQUJJX1dNTVhfYXJncyAgICAgICAgICAgICA9IDI5LAorICBBQklfb3B0aW1pemF0aW9uX2dvYWxzICAgID0gMzAsCisgIEFCSV9GUF9vcHRpbWl6YXRpb25fZ29hbHMgPSAzMSwKKyAgY29tcGF0aWJpbGl0eSAgICAgICAgICAgICA9IDMyLAorICBDUFVfdW5hbGlnbmVkX2FjY2VzcyAgICAgID0gMzQsCisgIEZQX0hQX2V4dGVuc2lvbiAgICAgICAgICAgPSAzNiwKKyAgQUJJX0ZQXzE2Yml0X2Zvcm1hdCAgICAgICA9IDM4LAorICBNUGV4dGVuc2lvbl91c2UgICAgICAgICAgID0gNDIsIC8vIHJlY29kZWQgZnJvbSA3MCAoQUJJIHIyLjA4KQorICBESVZfdXNlICAgICAgICAgICAgICAgICAgID0gNDQsCisgIERTUF9leHRlbnNpb24gICAgICAgICAgICAgPSA0NiwKKyAgYWxzb19jb21wYXRpYmxlX3dpdGggICAgICA9IDY1LAorICBjb25mb3JtYW5jZSAgICAgICAgICAgICAgID0gNjcsCisgIFZpcnR1YWxpemF0aW9uX3VzZSAgICAgICAgPSA2OCwKKworICAvLy8gTGVnYWN5IFRhZ3MKKyAgU2VjdGlvbiAgICAgICAgICAgICAgICAgICA9IDIsICAvLyBkZXByZWNhdGVkIChBQkkgcjIuMDkpCisgIFN5bWJvbCAgICAgICAgICAgICAgICAgICAgPSAzLCAgLy8gZGVwcmVjYXRlZCAoQUJJIHIyLjA5KQorICBBQklfYWxpZ244X25lZWRlZCAgICAgICAgID0gMjQsIC8vIHJlbmFtZWQgdG8gQUJJX2FsaWduX25lZWRlZCAoQUJJIHIyLjA5KQorICBBQklfYWxpZ244X3ByZXNlcnZlZCAgICAgID0gMjUsIC8vIHJlbmFtZWQgdG8gQUJJX2FsaWduX3ByZXNlcnZlZCAoQUJJIHIyLjA5KQorICBub2RlZmF1bHRzICAgICAgICAgICAgICAgID0gNjQsIC8vIGRlcHJlY2F0ZWQgKEFCSSByMi4wOSkKKyAgVDJFRV91c2UgICAgICAgICAgICAgICAgICA9IDY2LCAvLyBkZXByZWNhdGVkIChBQkkgcjIuMDkpCisgIE1QZXh0ZW5zaW9uX3VzZV9vbGQgICAgICAgPSA3MCAgLy8gcmVjb2RlZCB0byBNUGV4dGVuc2lvbl91c2UgKEFCSSByMi4wOCkKK307CisKK1N0cmluZ1JlZiBBdHRyVHlwZUFzU3RyaW5nKHVuc2lnbmVkIEF0dHIsIGJvb2wgSGFzVGFnUHJlZml4ID0gdHJ1ZSk7CitTdHJpbmdSZWYgQXR0clR5cGVBc1N0cmluZyhBdHRyVHlwZSBBdHRyLCBib29sIEhhc1RhZ1ByZWZpeCA9IHRydWUpOworaW50IEF0dHJUeXBlRnJvbVN0cmluZyhTdHJpbmdSZWYgVGFnKTsKKworLy8gTWFnaWMgbnVtYmVycyBmb3IgLkFSTS5hdHRyaWJ1dGVzCitlbnVtIEF0dHJNYWdpYyB7CisgIEZvcm1hdF9WZXJzaW9uICA9IDB4NDEKK307CisKKy8vIExlZ2FsIFZhbHVlcyBmb3IgQ1BVX2FyY2gsICg9NiksIHVsZWIxMjgKK2VudW0gQ1BVQXJjaCB7CisgIFByZV92NCAgID0gMCwKKyAgdjQgICAgICAgPSAxLCAgIC8vIGUuZy4gU0ExMTAKKyAgdjRUICAgICAgPSAyLCAgIC8vIGUuZy4gQVJNN1RETUkKKyAgdjVUICAgICAgPSAzLCAgIC8vIGUuZy4gQVJNOVRETUkKKyAgdjVURSAgICAgPSA0LCAgIC8vIGUuZy4gQVJNOTQ2RV9TCisgIHY1VEVKICAgID0gNSwgICAvLyBlLmcuIEFSTTkyNkVKX1MKKyAgdjYgICAgICAgPSA2LCAgIC8vIGUuZy4gQVJNMTEzNkpfUworICB2NktaICAgICA9IDcsICAgLy8gZS5nLiBBUk0xMTc2SlpfUworICB2NlQyICAgICA9IDgsICAgLy8gZS5nLiBBUk0xMTU2VDJfUworICB2NksgICAgICA9IDksICAgLy8gZS5nLiBBUk0xMTc2SlpfUworICB2NyAgICAgICA9IDEwLCAgLy8gZS5nLiBDb3J0ZXggQTgsIENvcnRleCBNMworICB2Nl9NICAgICA9IDExLCAgLy8gZS5nLiBDb3J0ZXggTTEKKyAgdjZTX00gICAgPSAxMiwgIC8vIHY2X00gd2l0aCB0aGUgU3lzdGVtIGV4dGVuc2lvbnMKKyAgdjdFX00gICAgPSAxMywgIC8vIHY3X00gd2l0aCBEU1AgZXh0ZW5zaW9ucworICB2OF9BICAgICA9IDE0LCAgLy8gdjhfQSBBQXJjaDMyCisgIHY4X1IgICAgID0gMTUsICAvLyBlLmcuIENvcnRleCBSNTIKKyAgdjhfTV9CYXNlPSAxNiwgIC8vIHY4X01fQmFzZSBBQXJjaDMyCisgIHY4X01fTWFpbj0gMTcsICAvLyB2OF9NX01haW4gQUFyY2gzMgorfTsKKworZW51bSBDUFVBcmNoUHJvZmlsZSB7ICAgICAgICAgICAgICAgLy8gKD03KSwgdWxlYjEyOAorICBOb3RfQXBwbGljYWJsZSAgICAgICAgICA9IDAsICAgICAgLy8gcHJlIHY3LCBvciBjcm9zcy1wcm9maWxlIGNvZGUKKyAgQXBwbGljYXRpb25Qcm9maWxlICAgICAgPSAoMHg0MSksIC8vICdBJyAoZS5nLiBmb3IgQ29ydGV4IEE4KQorICBSZWFsVGltZVByb2ZpbGUgICAgICAgICA9ICgweDUyKSwgLy8gJ1InIChlLmcuIGZvciBDb3J0ZXggUjQpCisgIE1pY3JvQ29udHJvbGxlclByb2ZpbGUgID0gKDB4NEQpLCAvLyAnTScgKGUuZy4gZm9yIENvcnRleCBNMykKKyAgU3lzdGVtUHJvZmlsZSAgICAgICAgICAgPSAoMHg1MykgIC8vICdTJyBBcHBsaWNhdGlvbiBvciByZWFsLXRpbWUgcHJvZmlsZQorfTsKKworLy8gVGhlIGZvbGxvd2luZyBoYXZlIGEgbG90IG9mIGNvbW1vbiB1c2UgY2FzZXMKK2VudW0geworICBOb3RfQWxsb3dlZCA9IDAsCisgIEFsbG93ZWQgPSAxLAorCisgIC8vIFRhZ19BUk1fSVNBX3VzZSAoPTgpLCB1bGViMTI4CisKKyAgLy8gVGFnX1RIVU1CX0lTQV91c2UsICg9OSksIHVsZWIxMjgKKyAgQWxsb3dUaHVtYjMyID0gMiwgLy8gMzItYml0IFRodW1iIChpbXBsaWVzIDE2LWJpdCBpbnN0cnVjdGlvbnMpCisgIEFsbG93VGh1bWJEZXJpdmVkID0gMywgLy8gVGh1bWIgYWxsb3dlZCwgZGVyaXZlZCBmcm9tIGFyY2gvcHJvZmlsZQorCisgIC8vIFRhZ19GUF9hcmNoICg9MTApLCB1bGViMTI4IChmb3JtZXJseSBUYWdfVkZQX2FyY2ggPSAxMCkKKyAgQWxsb3dGUHYyICA9IDIsICAgICAvLyB2MiBGUCBJU0EgcGVybWl0dGVkIChpbXBsaWVzIHVzZSBvZiB0aGUgdjEgRlAgSVNBKQorICBBbGxvd0ZQdjNBID0gMywgICAgIC8vIHYzIEZQIElTQSBwZXJtaXR0ZWQgKGltcGxpZXMgdXNlIG9mIHRoZSB2MiBGUCBJU0EpCisgIEFsbG93RlB2M0IgPSA0LCAgICAgLy8gdjMgRlAgSVNBIHBlcm1pdHRlZCwgYnV0IG9ubHkgRDAtRDE1LCBTMC1TMzEKKyAgQWxsb3dGUHY0QSA9IDUsICAgICAvLyB2NCBGUCBJU0EgcGVybWl0dGVkIChpbXBsaWVzIHVzZSBvZiB2MyBGUCBJU0EpCisgIEFsbG93RlB2NEIgPSA2LCAgICAgLy8gdjQgRlAgSVNBIHdhcyBwZXJtaXR0ZWQsIGJ1dCBvbmx5IEQwLUQxNSwgUzAtUzMxCisgIEFsbG93RlBBUk12OEEgPSA3LCAgLy8gVXNlIG9mIHRoZSBBUk0gdjgtQSBGUCBJU0Egd2FzIHBlcm1pdHRlZAorICBBbGxvd0ZQQVJNdjhCID0gOCwgIC8vIFVzZSBvZiB0aGUgQVJNIHY4LUEgRlAgSVNBIHdhcyBwZXJtaXR0ZWQsIGJ1dCBvbmx5CisgICAgICAgICAgICAgICAgICAgICAgLy8gRDAtRDE1LCBTMC1TMzEKKworICAvLyBUYWdfV01NWF9hcmNoLCAoPTExKSwgdWxlYjEyOAorICBBbGxvd1dNTVh2MSA9IDEsICAvLyBUaGUgdXNlciBwZXJtaXR0ZWQgdGhpcyBlbnRpdHkgdG8gdXNlIFdNTVggdjEKKyAgQWxsb3dXTU1YdjIgPSAyLCAgLy8gVGhlIHVzZXIgcGVybWl0dGVkIHRoaXMgZW50aXR5IHRvIHVzZSBXTU1YIHYyCisKKyAgLy8gVGFnX0FkdmFuY2VkX1NJTURfYXJjaCwgKD0xMiksIHVsZWIxMjgKKyAgQWxsb3dOZW9uID0gMSwgICAgICAvLyBTSU1EdjEgd2FzIHBlcm1pdHRlZAorICBBbGxvd05lb24yID0gMiwgICAgIC8vIFNJTUR2MiB3YXMgcGVybWl0dGVkIChIYWxmLXByZWNpc2lvbiBGUCwgTUFDIG9wZXJhdGlvbnMpCisgIEFsbG93TmVvbkFSTXY4ID0gMywgLy8gQVJNIHY4LUEgU0lNRCB3YXMgcGVybWl0dGVkCisgIEFsbG93TmVvbkFSTXY4XzFhID0gNCwvLyBBUk0gdjguMS1BIFNJTUQgd2FzIHBlcm1pdHRlZCAoUkRNQSkKKworICAvLyBUYWdfQUJJX1BDU19SOV91c2UsICg9MTQpLCB1bGViMTI4CisgIFI5SXNHUFIgPSAwLCAgICAgICAgLy8gUjkgdXNlZCBhcyB2NiAoanVzdCBhbm90aGVyIGNhbGxlZS1zYXZlZCByZWdpc3RlcikKKyAgUjlJc1NCID0gMSwgICAgICAgICAvLyBSOSB1c2VkIGFzIGEgZ2xvYmFsIHN0YXRpYyBiYXNlIHJnaXN0ZXIKKyAgUjlJc1RMU1BvaW50ZXIgPSAyLCAvLyBSOSB1c2VkIGFzIGEgdGhyZWFkIGxvY2FsIHN0b3JhZ2UgcG9pbnRlcgorICBSOVJlc2VydmVkID0gMywgICAgIC8vIFI5IG5vdCB1c2VkIGJ5IGNvZGUgYXNzb2NpYXRlZCB3aXRoIGF0dHJpYnV0ZWQgZW50aXR5CisKKyAgLy8gVGFnX0FCSV9QQ1NfUldfZGF0YSwgKD0xNSksIHVsZWIxMjgKKyAgQWRkcmVzc1JXUENSZWwgPSAxLCAvLyBBZGRyZXNzIFJXIHN0YXRpYyBkYXRhIFBDLXJlbGF0aXZlCisgIEFkZHJlc3NSV1NCUmVsID0gMiwgLy8gQWRkcmVzcyBSVyBzdGF0aWMgZGF0YSBTQi1yZWxhdGl2ZQorICBBZGRyZXNzUldOb25lID0gMywgLy8gTm8gUlcgc3RhdGljIGRhdGEgcGVybWl0dGVkCisKKyAgLy8gVGFnX0FCSV9QQ1NfUk9fZGF0YSwgKD0xNCksIHVsZWIxMjgKKyAgQWRkcmVzc1JPUENSZWwgPSAxLCAvLyBBZGRyZXNzIFJPIHN0YXRpYyBkYXRhIFBDLXJlbGF0aXZlCisgIEFkZHJlc3NST05vbmUgPSAyLCAvLyBObyBSTyBzdGF0aWMgZGF0YSBwZXJtaXR0ZWQKKworICAvLyBUYWdfQUJJX1BDU19HT1RfdXNlLCAoPTE3KSwgdWxlYjEyOAorICBBZGRyZXNzRGlyZWN0ID0gMSwgLy8gQWRkcmVzcyBpbXBvcnRlZCBkYXRhIGRpcmVjdGx5CisgIEFkZHJlc3NHT1QgPSAyLCAvLyBBZGRyZXNzIGltcG9ydGVkIGRhdGEgaW5kaXJlY3RseSAodmlhIEdPVCkKKworICAvLyBUYWdfQUJJX1BDU193Y2hhcl90LCAoPTE4KSwgdWxlYjEyOAorICBXQ2hhclByb2hpYml0ZWQgPSAwLCAgLy8gd2NoYXJfdCBpcyBub3QgdXNlZAorICBXQ2hhcldpZHRoMkJ5dGVzID0gMiwgLy8gc2l6ZW9mKHdjaGFyX3QpID09IDIKKyAgV0NoYXJXaWR0aDRCeXRlcyA9IDQsIC8vIHNpemVvZih3Y2hhcl90KSA9PSA0CisKKyAgLy8gVGFnX0FCSV9hbGlnbl9uZWVkZWQsICg9MjQpLCB1bGViMTI4CisgIEFsaWduOEJ5dGUgPSAxLAorICBBbGlnbjRCeXRlID0gMiwKKyAgQWxpZ25SZXNlcnZlZCA9IDMsCisKKyAgLy8gVGFnX0FCSV9hbGlnbl9uZWVkZWQsICg9MjUpLCB1bGViMTI4CisgIEFsaWduTm90UHJlc2VydmVkID0gMCwKKyAgQWxpZ25QcmVzZXJ2ZThCeXRlID0gMSwKKyAgQWxpZ25QcmVzZXJ2ZUFsbCA9IDIsCisKKyAgLy8gVGFnX0FCSV9GUF9kZW5vcm1hbCwgKD0yMCksIHVsZWIxMjgKKyAgUG9zaXRpdmVaZXJvID0gMCwKKyAgSUVFRURlbm9ybWFscyA9IDEsCisgIFByZXNlcnZlRlBTaWduID0gMiwgLy8gc2lnbiB3aGVuIGZsdXNoZWQtdG8temVybyBpcyBwcmVzZXJ2ZWQKKworICAvLyBUYWdfQUJJX0ZQX251bWJlcl9tb2RlbCwgKD0yMyksIHVsZWIxMjgKKyAgQWxsb3dJRUVFTm9ybWFsID0gMSwKKyAgQWxsb3dSVEFCSSA9IDIsICAvLyBudW1iZXJzLCBpbmZpbml0aWVzLCBhbmQgb25lIHF1aWV0IE5hTiAoc2VlIFtSVEFCSV0pCisgIEFsbG93SUVFRTc1NCA9IDMsIC8vIHRoaXMgY29kZSB0byB1c2UgYWxsIHRoZSBJRUVFIDc1NC1kZWZpbmVkIEZQIGVuY29kaW5ncworCisgIC8vIFRhZ19BQklfZW51bV9zaXplLCAoPTI2KSwgdWxlYjEyOAorICBFbnVtUHJvaGliaXRlZCA9IDAsIC8vIFRoZSB1c2VyIHByb2hpYml0ZWQgdGhlIHVzZSBvZiBlbnVtcyB3aGVuIGJ1aWxkaW5nCisgICAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBlbnRpdHkuCisgIEVudW1TbWFsbGVzdCA9IDEsICAgLy8gRW51bSBpcyBzbWFsbGVzdCBjb250YWluZXIgYmlnIGVub3VnaCB0byBob2xkIGFsbAorICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlcy4KKyAgRW51bTMyQml0ID0gMiwgICAgICAvLyBFbnVtIGlzIGF0IGxlYXN0IDMyIGJpdHMuCisgIEVudW0zMkJpdEFCSSA9IDMsICAgLy8gRXZlcnkgZW51bWVyYXRpb24gdmlzaWJsZSBhY3Jvc3MgYW4gQUJJLWNvbXBseWluZworICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVyZmFjZSBjb250YWlucyBhIHZhbHVlIG5lZWRpbmcgMzIgYml0cyB0byBlbmNvZGUKKyAgICAgICAgICAgICAgICAgICAgICAvLyBpdDsgb3RoZXIgZW51bXMgY2FuIGJlIGNvbnRhaW5lcml6ZWQuCisKKyAgLy8gVGFnX0FCSV9IYXJkRlBfdXNlLCAoPTI3KSwgdWxlYjEyOAorICBIYXJkRlBJbXBsaWVkID0gMCwgICAgICAgICAgLy8gRlAgdXNlIHNob3VsZCBiZSBpbXBsaWVkIGJ5IFRhZ19GUF9hcmNoCisgIEhhcmRGUFNpbmdsZVByZWNpc2lvbiA9IDEsICAvLyBTaW5nbGUtcHJlY2lzaW9uIG9ubHkKKworICAvLyBUYWdfQUJJX1ZGUF9hcmdzLCAoPTI4KSwgdWxlYjEyOAorICBCYXNlQUFQQ1MgPSAwLAorICBIYXJkRlBBQVBDUyA9IDEsCisKKyAgLy8gVGFnX0ZQX0hQX2V4dGVuc2lvbiwgKD0zNiksIHVsZWIxMjgKKyAgQWxsb3dIUEZQID0gMSwgLy8gQWxsb3cgdXNlIG9mIEhhbGYgUHJlY2lzaW9uIEZQCisKKyAgLy8gVGFnX0ZQXzE2Yml0X2Zvcm1hdCwgKD0zOCksIHVsZWIxMjgKKyAgRlAxNkZvcm1hdElFRUUgPSAxLAorICBGUDE2VkZQMyA9IDIsCisKKyAgLy8gVGFnX01QZXh0ZW5zaW9uX3VzZSwgKD00MiksIHVsZWIxMjgKKyAgQWxsb3dNUCA9IDEsIC8vIEFsbG93IHVzZSBvZiBNUCBleHRlbnNpb25zCisKKyAgLy8gVGFnX0RJVl91c2UsICg9NDQpLCB1bGViMTI4CisgIC8vIE5vdGU6IEFsbG93RElWRXh0IG11c3QgYmUgZW1pdHRlZCBpZiBhbmQgb25seSBpZiB0aGUgcGVybWlzc2lvbiB0byB1c2UKKyAgLy8gaGFyZHdhcmUgZGl2aWRlIGNhbm5vdCBiZSBjb252ZXllZCB1c2luZyBBbGxvd0RJVklmRXhpc3RzIG9yIERpc2FsbG93RElWCisgIEFsbG93RElWSWZFeGlzdHMgPSAwLCAvLyBBbGxvdyBoYXJkd2FyZSBkaXZpZGUgaWYgYXZhaWxhYmxlIGluIGFyY2gsIG9yIG5vCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmZvIGV4aXN0cy4KKyAgRGlzYWxsb3dESVYgPSAxLCAgICAgIC8vIEhhcmR3YXJlIGRpdmlkZSBleHBsaWNpdGx5IGRpc2FsbG93ZWQuCisgIEFsbG93RElWRXh0ID0gMiwgICAgICAvLyBBbGxvdyBoYXJkd2FyZSBkaXZpZGUgYXMgb3B0aW9uYWwgYXJjaGl0ZWN0dXJlCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBleHRlbnNpb24gYWJvdmUgdGhlIGJhc2UgYXJjaCBzcGVjaWZpZWQgYnkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhZ19DUFVfYXJjaCBhbmQgVGFnX0NQVV9hcmNoX3Byb2ZpbGUuCisKKyAgLy8gVGFnX1ZpcnR1YWxpemF0aW9uX3VzZSwgKD02OCksIHVsZWIxMjgKKyAgQWxsb3dUWiA9IDEsCisgIEFsbG93VmlydHVhbGl6YXRpb24gPSAyLAorICBBbGxvd1RaVmlydHVhbGl6YXRpb24gPSAzCit9OworCit9IC8vIG5hbWVzcGFjZSBBUk1CdWlsZEF0dHJzCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FSTUVIQUJJLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQVJNRUhBQkkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjA1MmRmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FSTUVIQUJJLmgKQEAgLTAsMCArMSwxMzQgQEAKKy8vPT09LS0tIEFSTUVIQUJJLmggLSBBUk0gRXhjZXB0aW9uIEhhbmRsaW5nIEFCSSAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGNvbnN0YW50cyBmb3IgdGhlIEFSTSB1bndpbmQgb3Bjb2RlcyBhbmQgZXhjZXB0aW9uCisvLyBoYW5kbGluZyB0YWJsZSBlbnRyeSBraW5kcy4KKy8vCisvLyBUaGUgZW51bWVyYXRpb25zIGFuZCBjb25zdGFudHMgaW4gdGhpcyBmaWxlIHJlZmxlY3QgdGhlIEFSTSBFSEFCSQorLy8gU3BlY2lmaWNhdGlvbiBhcyBwdWJsaXNoZWQgYnkgQVJNLgorLy8KKy8vIEV4Y2VwdGlvbiBIYW5kbGluZyBBQkkgZm9yIHRoZSBBUk0gQXJjaGl0ZWN0dXJlIHIyLjA5IC0gTm92ZW1iZXIgMzAsIDIwMTIKKy8vCisvLyBodHRwOi8vaW5mb2NlbnRlci5hcm0uY29tL2hlbHAvdG9waWMvY29tLmFybS5kb2MuaWhpMDAzOGEvSUhJMDAzOEFfZWhhYmkucGRmCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQVJNRUhBQklfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQVJNRUhBQklfSAorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgQVJNIHsKK25hbWVzcGFjZSBFSEFCSSB7CisgIC8vLyBBUk0gZXhjZXB0aW9uIGhhbmRsaW5nIHRhYmxlIGVudHJ5IGtpbmRzCisgIGVudW0gRUhURW50cnlLaW5kIHsKKyAgICBFSFRfR0VORVJJQyA9IDB4MDAsCisgICAgRUhUX0NPTVBBQ1QgPSAweDgwCisgIH07CisKKyAgZW51bSB7CisgICAgLy8vIFNwZWNpYWwgZW50cnkgZm9yIHRoZSBmdW5jdGlvbiBuZXZlciB1bndpbmQKKyAgICBFWElEWF9DQU5UVU5XSU5EID0gMHgxCisgIH07CisKKyAgLy8vIEFSTS1kZWZpbmVkIGZyYW1lIHVud2luZGluZyBvcGNvZGVzCisgIGVudW0gVW53aW5kT3Bjb2RlcyB7CisgICAgLy8gRm9ybWF0OiAwMHh4eHh4eAorICAgIC8vIFB1cnBvc2U6IHZzcCA9IHZzcCArICgoeCA8PCAyKSArIDQpCisgICAgVU5XSU5EX09QQ09ERV9JTkNfVlNQID0gMHgwMCwKKworICAgIC8vIEZvcm1hdDogMDF4eHh4eHgKKyAgICAvLyBQdXJwb3NlOiB2c3AgPSB2c3AgLSAoKHggPDwgMikgKyA0KQorICAgIFVOV0lORF9PUENPREVfREVDX1ZTUCA9IDB4NDAsCisKKyAgICAvLyBGb3JtYXQ6IDEwMDAwMDAwIDAwMDAwMDAwCisgICAgLy8gUHVycG9zZTogcmVmdXNlIHRvIHVud2luZAorICAgIFVOV0lORF9PUENPREVfUkVGVVNFID0gMHg4MDAwLAorCisgICAgLy8gRm9ybWF0OiAxMDAweHh4eCB4eHh4eHh4eAorICAgIC8vIFB1cnBvc2U6IHBvcCByWzE1OjEyXSwgclsxMTo0XQorICAgIC8vIENvbnN0cmFpbnQ6IHggIT0gMAorICAgIFVOV0lORF9PUENPREVfUE9QX1JFR19NQVNLX1I0ID0gMHg4MDAwLAorCisgICAgLy8gRm9ybWF0OiAxMDAxeHh4eAorICAgIC8vIFB1cnBvc2U6IHZzcCA9IHJbeF0KKyAgICAvLyBDb25zdHJhaW50OiB4ICE9IDEzICYmIHggIT0gMTUKKyAgICBVTldJTkRfT1BDT0RFX1NFVF9WU1AgPSAweDkwLAorCisgICAgLy8gRm9ybWF0OiAxMDEwMHh4eAorICAgIC8vIFB1cnBvc2U6IHBvcCByWyg0K3gpOjRdCisgICAgVU5XSU5EX09QQ09ERV9QT1BfUkVHX1JBTkdFX1I0ID0gMHhhMCwKKworICAgIC8vIEZvcm1hdDogMTAxMDF4eHgKKyAgICAvLyBQdXJwb3NlOiBwb3AgcjE0LCByWyg0K3gpOjRdCisgICAgVU5XSU5EX09QQ09ERV9QT1BfUkVHX1JBTkdFX1I0X1IxNCA9IDB4YTgsCisKKyAgICAvLyBGb3JtYXQ6IDEwMTEwMDAwCisgICAgLy8gUHVycG9zZTogZmluaXNoCisgICAgVU5XSU5EX09QQ09ERV9GSU5JU0ggPSAweGIwLAorCisgICAgLy8gRm9ybWF0OiAxMDExMDAwMSAwMDAweHh4eAorICAgIC8vIFB1cnBvc2U6IHBvcCByWzM6MF0KKyAgICAvLyBDb25zdHJhaW50OiB4ICE9IDAKKyAgICBVTldJTkRfT1BDT0RFX1BPUF9SRUdfTUFTSyA9IDB4YjEwMCwKKworICAgIC8vIEZvcm1hdDogMTAxMTAwMTAgeCh1bGViMTI4KQorICAgIC8vIFB1cnBvc2U6IHZzcCA9IHZzcCArICgoeCA8PCAyKSArIDB4MjA0KQorICAgIFVOV0lORF9PUENPREVfSU5DX1ZTUF9VTEVCMTI4ID0gMHhiMiwKKworICAgIC8vIEZvcm1hdDogMTAxMTAwMTEgeHh4eHl5eXkKKyAgICAvLyBQdXJwb3NlOiBwb3AgZFsoeCt5KTp4XQorICAgIFVOV0lORF9PUENPREVfUE9QX1ZGUF9SRUdfUkFOR0VfRlNUTUZEWCA9IDB4YjMwMCwKKworICAgIC8vIEZvcm1hdDogMTAxMTF4eHgKKyAgICAvLyBQdXJwb3NlOiBwb3AgZFsoOCt4KTo4XQorICAgIFVOV0lORF9PUENPREVfUE9QX1ZGUF9SRUdfUkFOR0VfRlNUTUZEWF9EOCA9IDB4YjgsCisKKyAgICAvLyBGb3JtYXQ6IDExMDAweHh4CisgICAgLy8gUHVycG9zZTogcG9wIHdSWygxMCt4KToxMF0KKyAgICBVTldJTkRfT1BDT0RFX1BPUF9XSVJFTEVTU19NTVhfUkVHX1JBTkdFX1dSMTAgPSAweGMwLAorCisgICAgLy8gRm9ybWF0OiAxMTAwMDExMCB4eHh4eXl5eQorICAgIC8vIFB1cnBvc2U6IHBvcCB3UlsoeCt5KTp4XQorICAgIFVOV0lORF9PUENPREVfUE9QX1dJUkVMRVNTX01NWF9SRUdfUkFOR0UgPSAweGM2MDAsCisKKyAgICAvLyBGb3JtYXQ6IDExMDAwMTExIDAwMDB4eHh4CisgICAgLy8gUHVycG9zZTogcG9wIHdDR1JbMzowXQorICAgIC8vIENvbnN0cmFpbnQ6IHggIT0gMAorICAgIFVOV0lORF9PUENPREVfUE9QX1dJUkVMRVNTX01NWF9SRUdfTUFTSyA9IDB4YzcwMCwKKworICAgIC8vIEZvcm1hdDogMTEwMDEwMDAgeHh4eHl5eXkKKyAgICAvLyBQdXJwb3NlOiBwb3AgZFsoMTYreCt5KTooMTYreCldCisgICAgVU5XSU5EX09QQ09ERV9QT1BfVkZQX1JFR19SQU5HRV9GU1RNRkREX0QxNiA9IDB4YzgwMCwKKworICAgIC8vIEZvcm1hdDogMTEwMDEwMDEgeHh4eHl5eXkKKyAgICAvLyBQdXJwb3NlOiBwb3AgZFsoeCt5KTp4XQorICAgIFVOV0lORF9PUENPREVfUE9QX1ZGUF9SRUdfUkFOR0VfRlNUTUZERCA9IDB4YzkwMCwKKworICAgIC8vIEZvcm1hdDogMTEwMTB4eHgKKyAgICAvLyBQdXJwb3NlOiBwb3AgZFsoOCt4KTo4XQorICAgIFVOV0lORF9PUENPREVfUE9QX1ZGUF9SRUdfUkFOR0VfRlNUTUZERF9EOCA9IDB4ZDAKKyAgfTsKKworICAvLy8gQVJNLWRlZmluZWQgUGVyc29uYWxpdHkgUm91dGluZSBJbmRleAorICBlbnVtIFBlcnNvbmFsaXR5Um91dGluZUluZGV4IHsKKyAgICAvLyBUbyBtYWtlIHRoZSBleGNlcHRpb24gaGFuZGxpbmcgdGFibGUgYmVjb21lIG1vcmUgY29tcGFjdCwgQVJNIGRlZmluZWQKKyAgICAvLyBzZXZlcmFsIHBlcnNvbmFsaXR5IHJvdXRpbmVzIGluIEVIQUJJLiAgVGhlcmUgYXJlIDMgZGlmZmVyZW50CisgICAgLy8gcGVyc29uYWxpdHkgcm91dGluZXMgaW4gQVJNIEVIQUJJIGN1cnJlbnRseS4gIEl0IGlzIHBvc3NpYmxlIHRvIGhhdmUgMTYKKyAgICAvLyBwcmUtZGVmaW5lZCBwZXJzb25hbGl0eSByb3V0aW5lcyBhdCBtb3N0LgorICAgIEFFQUJJX1VOV0lORF9DUFBfUFIwID0gMCwKKyAgICBBRUFCSV9VTldJTkRfQ1BQX1BSMSA9IDEsCisgICAgQUVBQklfVU5XSU5EX0NQUF9QUjIgPSAyLAorCisgICAgTlVNX1BFUlNPTkFMSVRZX0lOREVYCisgIH07Cit9Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FSTVRhcmdldFBhcnNlci5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQVJNVGFyZ2V0UGFyc2VyLmRlZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YzhlZmYxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FSTVRhcmdldFBhcnNlci5kZWYKQEAgLTAsMCArMSwyNjQgQEAKKy8vPT09LSBBUk1UYXJnZXRQYXJzZXIuZGVmIC0gQVJNIHRhcmdldCBwYXJzaW5nIGRlZmluZXMgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGVzIGRlZmluZXMgdG8gYnVpbGQgdXAgdGhlIEFSTSB0YXJnZXQgcGFyc2VyJ3MgbG9naWMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gTk9URTogTk8gSU5DTFVERSBHVUFSRCBERVNJUkVEIQorCisjaWZuZGVmIEFSTV9GUFUKKyNkZWZpbmUgQVJNX0ZQVShOQU1FLCBLSU5ELCBWRVJTSU9OLCBORU9OX1NVUFBPUlQsIFJFU1RSSUNUSU9OKQorI2VuZGlmCitBUk1fRlBVKCJpbnZhbGlkIiwgRktfSU5WQUxJRCwgRlBVVmVyc2lvbjo6Tk9ORSwgTmVvblN1cHBvcnRMZXZlbDo6Tm9uZSwgRlBVUmVzdHJpY3Rpb246Ok5vbmUpCitBUk1fRlBVKCJub25lIiwgRktfTk9ORSwgRlBVVmVyc2lvbjo6Tk9ORSwgTmVvblN1cHBvcnRMZXZlbDo6Tm9uZSwgRlBVUmVzdHJpY3Rpb246Ok5vbmUpCitBUk1fRlBVKCJ2ZnAiLCBGS19WRlAsIEZQVVZlcnNpb246OlZGUFYyLCBOZW9uU3VwcG9ydExldmVsOjpOb25lLCBGUFVSZXN0cmljdGlvbjo6Tm9uZSkKK0FSTV9GUFUoInZmcHYyIiwgRktfVkZQVjIsIEZQVVZlcnNpb246OlZGUFYyLCBOZW9uU3VwcG9ydExldmVsOjpOb25lLCBGUFVSZXN0cmljdGlvbjo6Tm9uZSkKK0FSTV9GUFUoInZmcHYzIiwgRktfVkZQVjMsIEZQVVZlcnNpb246OlZGUFYzLCBOZW9uU3VwcG9ydExldmVsOjpOb25lLCBGUFVSZXN0cmljdGlvbjo6Tm9uZSkKK0FSTV9GUFUoInZmcHYzLWZwMTYiLCBGS19WRlBWM19GUDE2LCBGUFVWZXJzaW9uOjpWRlBWM19GUDE2LCBOZW9uU3VwcG9ydExldmVsOjpOb25lLCBGUFVSZXN0cmljdGlvbjo6Tm9uZSkKK0FSTV9GUFUoInZmcHYzLWQxNiIsIEZLX1ZGUFYzX0QxNiwgRlBVVmVyc2lvbjo6VkZQVjMsIE5lb25TdXBwb3J0TGV2ZWw6Ok5vbmUsIEZQVVJlc3RyaWN0aW9uOjpEMTYpCitBUk1fRlBVKCJ2ZnB2My1kMTYtZnAxNiIsIEZLX1ZGUFYzX0QxNl9GUDE2LCBGUFVWZXJzaW9uOjpWRlBWM19GUDE2LCBOZW9uU3VwcG9ydExldmVsOjpOb25lLCBGUFVSZXN0cmljdGlvbjo6RDE2KQorQVJNX0ZQVSgidmZwdjN4ZCIsIEZLX1ZGUFYzWEQsIEZQVVZlcnNpb246OlZGUFYzLCBOZW9uU3VwcG9ydExldmVsOjpOb25lLCBGUFVSZXN0cmljdGlvbjo6U1BfRDE2KQorQVJNX0ZQVSgidmZwdjN4ZC1mcDE2IiwgRktfVkZQVjNYRF9GUDE2LCBGUFVWZXJzaW9uOjpWRlBWM19GUDE2LCBOZW9uU3VwcG9ydExldmVsOjpOb25lLCBGUFVSZXN0cmljdGlvbjo6U1BfRDE2KQorQVJNX0ZQVSgidmZwdjQiLCBGS19WRlBWNCwgRlBVVmVyc2lvbjo6VkZQVjQsIE5lb25TdXBwb3J0TGV2ZWw6Ok5vbmUsIEZQVVJlc3RyaWN0aW9uOjpOb25lKQorQVJNX0ZQVSgidmZwdjQtZDE2IiwgRktfVkZQVjRfRDE2LCBGUFVWZXJzaW9uOjpWRlBWNCwgTmVvblN1cHBvcnRMZXZlbDo6Tm9uZSwgRlBVUmVzdHJpY3Rpb246OkQxNikKK0FSTV9GUFUoImZwdjQtc3AtZDE2IiwgRktfRlBWNF9TUF9EMTYsIEZQVVZlcnNpb246OlZGUFY0LCBOZW9uU3VwcG9ydExldmVsOjpOb25lLCBGUFVSZXN0cmljdGlvbjo6U1BfRDE2KQorQVJNX0ZQVSgiZnB2NS1kMTYiLCBGS19GUFY1X0QxNiwgRlBVVmVyc2lvbjo6VkZQVjUsIE5lb25TdXBwb3J0TGV2ZWw6Ok5vbmUsIEZQVVJlc3RyaWN0aW9uOjpEMTYpCitBUk1fRlBVKCJmcHY1LXNwLWQxNiIsIEZLX0ZQVjVfU1BfRDE2LCBGUFVWZXJzaW9uOjpWRlBWNSwgTmVvblN1cHBvcnRMZXZlbDo6Tm9uZSwgRlBVUmVzdHJpY3Rpb246OlNQX0QxNikKK0FSTV9GUFUoImZwLWFybXY4IiwgRktfRlBfQVJNVjgsIEZQVVZlcnNpb246OlZGUFY1LCBOZW9uU3VwcG9ydExldmVsOjpOb25lLCBGUFVSZXN0cmljdGlvbjo6Tm9uZSkKK0FSTV9GUFUoIm5lb24iLCBGS19ORU9OLCBGUFVWZXJzaW9uOjpWRlBWMywgTmVvblN1cHBvcnRMZXZlbDo6TmVvbiwgRlBVUmVzdHJpY3Rpb246Ok5vbmUpCitBUk1fRlBVKCJuZW9uLWZwMTYiLCBGS19ORU9OX0ZQMTYsIEZQVVZlcnNpb246OlZGUFYzX0ZQMTYsIE5lb25TdXBwb3J0TGV2ZWw6Ok5lb24sIEZQVVJlc3RyaWN0aW9uOjpOb25lKQorQVJNX0ZQVSgibmVvbi12ZnB2NCIsIEZLX05FT05fVkZQVjQsIEZQVVZlcnNpb246OlZGUFY0LCBOZW9uU3VwcG9ydExldmVsOjpOZW9uLCBGUFVSZXN0cmljdGlvbjo6Tm9uZSkKK0FSTV9GUFUoIm5lb24tZnAtYXJtdjgiLCBGS19ORU9OX0ZQX0FSTVY4LCBGUFVWZXJzaW9uOjpWRlBWNSwgTmVvblN1cHBvcnRMZXZlbDo6TmVvbiwgRlBVUmVzdHJpY3Rpb246Ok5vbmUpCitBUk1fRlBVKCJjcnlwdG8tbmVvbi1mcC1hcm12OCIsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LCBGUFVWZXJzaW9uOjpWRlBWNSwgTmVvblN1cHBvcnRMZXZlbDo6Q3J5cHRvLAorICAgICAgICBGUFVSZXN0cmljdGlvbjo6Tm9uZSkKK0FSTV9GUFUoInNvZnR2ZnAiLCBGS19TT0ZUVkZQLCBGUFVWZXJzaW9uOjpOT05FLCBOZW9uU3VwcG9ydExldmVsOjpOb25lLCBGUFVSZXN0cmljdGlvbjo6Tm9uZSkKKyN1bmRlZiBBUk1fRlBVCisKKyNpZm5kZWYgQVJNX0FSQ0gKKyNkZWZpbmUgQVJNX0FSQ0goTkFNRSwgSUQsIENQVV9BVFRSLCBTVUJfQVJDSCwgQVJDSF9BVFRSLCBBUkNIX0ZQVSwgQVJDSF9CQVNFX0VYVCkKKyNlbmRpZgorQVJNX0FSQ0goImludmFsaWQiLCBJTlZBTElELCAiIiwgIiIsCisgICAgICAgICAgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6UHJlX3Y0LCBGS19OT05FLCBBUk06OkFFS19OT05FKQorQVJNX0FSQ0goImFybXYyIiwgQVJNVjIsICIyIiwgInYyIiwgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6UHJlX3Y0LAorICAgICAgICAgIEZLX05PTkUsIEFSTTo6QUVLX05PTkUpCitBUk1fQVJDSCgiYXJtdjJhIiwgQVJNVjJBLCAiMkEiLCAidjJhIiwgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6UHJlX3Y0LAorICAgICAgICAgIEZLX05PTkUsIEFSTTo6QUVLX05PTkUpCitBUk1fQVJDSCgiYXJtdjMiLCBBUk1WMywgIjMiLCAidjMiLCBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjpQcmVfdjQsCisgICAgICAgICAgRktfTk9ORSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9BUkNIKCJhcm12M20iLCBBUk1WM00sICIzTSIsICJ2M20iLCBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjpQcmVfdjQsCisgICAgICAgICAgRktfTk9ORSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9BUkNIKCJhcm12NCIsIEFSTVY0LCAiNCIsICJ2NCIsIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OnY0LAorICAgICAgICAgIEZLX05PTkUsIEFSTTo6QUVLX05PTkUpCitBUk1fQVJDSCgiYXJtdjR0IiwgQVJNVjRULCAiNFQiLCAidjR0IiwgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djRULAorICAgICAgICAgIEZLX05PTkUsIEFSTTo6QUVLX05PTkUpCitBUk1fQVJDSCgiYXJtdjV0IiwgQVJNVjVULCAiNVQiLCAidjUiLCBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2NVQsCisgICAgICAgICAgRktfTk9ORSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9BUkNIKCJhcm12NXRlIiwgQVJNVjVURSwgIjVURSIsICJ2NWUiLCBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2NVRFLAorICAgICAgICAgIEZLX05PTkUsIEFSTTo6QUVLX0RTUCkKK0FSTV9BUkNIKCJhcm12NXRlaiIsIEFSTVY1VEVKLCAiNVRFSiIsICJ2NWUiLCBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2NVRFSiwKKyAgICAgICAgICBGS19OT05FLCBBUk06OkFFS19EU1ApCitBUk1fQVJDSCgiYXJtdjYiLCBBUk1WNiwgIjYiLCAidjYiLCBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2NiwKKyAgICAgICAgICBGS19WRlBWMiwgQVJNOjpBRUtfRFNQKQorQVJNX0FSQ0goImFybXY2ayIsIEFSTVY2SywgIjZLIiwgInY2ayIsIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OnY2SywKKyAgICAgICAgICBGS19WRlBWMiwgQVJNOjpBRUtfRFNQKQorQVJNX0FSQ0goImFybXY2dDIiLCBBUk1WNlQyLCAiNlQyIiwgInY2dDIiLCBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2NlQyLAorICAgICAgICAgIEZLX05PTkUsIEFSTTo6QUVLX0RTUCkKK0FSTV9BUkNIKCJhcm12Nmt6IiwgQVJNVjZLWiwgIjZLWiIsICJ2Nmt6IiwgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djZLWiwKKyAgICAgICAgICBGS19WRlBWMiwgKEFSTTo6QUVLX1NFQyB8IEFSTTo6QUVLX0RTUCkpCitBUk1fQVJDSCgiYXJtdjYtbSIsIEFSTVY2TSwgIjYtTSIsICJ2Nm0iLCBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2Nl9NLAorICAgICAgICAgIEZLX05PTkUsIEFSTTo6QUVLX05PTkUpCitBUk1fQVJDSCgiYXJtdjctYSIsIEFSTVY3QSwgIjctQSIsICJ2NyIsIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OnY3LAorICAgICAgICAgIEZLX05FT04sIEFSTTo6QUVLX0RTUCkKK0FSTV9BUkNIKCJhcm12N3ZlIiwgQVJNVjdWRSwgIjdWRSIsICJ2N3ZlIiwgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djcsCisgICAgICAgICAgRktfTkVPTiwgKEFSTTo6QUVLX1NFQyB8IEFSTTo6QUVLX01QIHwgQVJNOjpBRUtfVklSVCB8CisgICAgICAgICAgQVJNOjpBRUtfSFdESVZBUk0gfCBBUk06OkFFS19IV0RJVlRIVU1CIHwgQVJNOjpBRUtfRFNQKSkKK0FSTV9BUkNIKCJhcm12Ny1yIiwgQVJNVjdSLCAiNy1SIiwgInY3ciIsIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OnY3LAorICAgICAgICAgIEZLX05PTkUsIChBUk06OkFFS19IV0RJVlRIVU1CIHwgQVJNOjpBRUtfRFNQKSkKK0FSTV9BUkNIKCJhcm12Ny1tIiwgQVJNVjdNLCAiNy1NIiwgInY3bSIsIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OnY3LAorICAgICAgICAgIEZLX05PTkUsIEFSTTo6QUVLX0hXRElWVEhVTUIpCitBUk1fQVJDSCgiYXJtdjdlLW0iLCBBUk1WN0VNLCAiN0UtTSIsICJ2N2VtIiwgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djdFX00sCisgICAgICAgICAgRktfTk9ORSwgKEFSTTo6QUVLX0hXRElWVEhVTUIgfCBBUk06OkFFS19EU1ApKQorQVJNX0FSQ0goImFybXY4LWEiLCBBUk1WOEEsICI4LUEiLCAidjgiLCBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2OF9BLAorICAgICAgICAgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsCisgICAgICAgICAoQVJNOjpBRUtfU0VDIHwgQVJNOjpBRUtfTVAgfCBBUk06OkFFS19WSVJUIHwgQVJNOjpBRUtfSFdESVZBUk0gfAorICAgICAgICAgIEFSTTo6QUVLX0hXRElWVEhVTUIgfCBBUk06OkFFS19EU1AgfCBBUk06OkFFS19DUkMpKQorQVJNX0FSQ0goImFybXY4LjEtYSIsIEFSTVY4XzFBLCAiOC4xLUEiLCAidjguMWEiLAorICAgICAgICAgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djhfQSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsCisgICAgICAgICAoQVJNOjpBRUtfU0VDIHwgQVJNOjpBRUtfTVAgfCBBUk06OkFFS19WSVJUIHwgQVJNOjpBRUtfSFdESVZBUk0gfAorICAgICAgICAgIEFSTTo6QUVLX0hXRElWVEhVTUIgfCBBUk06OkFFS19EU1AgfCBBUk06OkFFS19DUkMpKQorQVJNX0FSQ0goImFybXY4LjItYSIsIEFSTVY4XzJBLCAiOC4yLUEiLCAidjguMmEiLAorICAgICAgICAgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djhfQSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsCisgICAgICAgICAoQVJNOjpBRUtfU0VDIHwgQVJNOjpBRUtfTVAgfCBBUk06OkFFS19WSVJUIHwgQVJNOjpBRUtfSFdESVZBUk0gfAorICAgICAgICAgIEFSTTo6QUVLX0hXRElWVEhVTUIgfCBBUk06OkFFS19EU1AgfCBBUk06OkFFS19DUkMgfCBBUk06OkFFS19SQVMpKQorQVJNX0FSQ0goImFybXY4LjMtYSIsIEFSTVY4XzNBLCAiOC4zLUEiLCAidjguM2EiLAorICAgICAgICAgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djhfQSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsCisgICAgICAgICAoQVJNOjpBRUtfU0VDIHwgQVJNOjpBRUtfTVAgfCBBUk06OkFFS19WSVJUIHwgQVJNOjpBRUtfSFdESVZBUk0gfAorICAgICAgICAgIEFSTTo6QUVLX0hXRElWVEhVTUIgfCBBUk06OkFFS19EU1AgfCBBUk06OkFFS19DUkMgfCBBUk06OkFFS19SQVMpKQorQVJNX0FSQ0goImFybXY4LXIiLCBBUk1WOFIsICI4LVIiLCAidjhyIiwgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djhfUiwKKyAgICAgICAgICBGS19ORU9OX0ZQX0FSTVY4LAorICAgICAgICAgIChBUk06OkFFS19NUCB8IEFSTTo6QUVLX1ZJUlQgfCBBUk06OkFFS19IV0RJVkFSTSB8IEFSTTo6QUVLX0hXRElWVEhVTUIgfAorICAgICAgICAgICBBUk06OkFFS19EU1AgfCBBUk06OkFFS19DUkMpKQorQVJNX0FSQ0goImFybXY4LW0uYmFzZSIsIEFSTVY4TUJhc2VsaW5lLCAiOC1NLkJhc2VsaW5lIiwgInY4bS5iYXNlIiwKKyAgICAgICAgICBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2OF9NX0Jhc2UsIEZLX05PTkUsIEFSTTo6QUVLX0hXRElWVEhVTUIpCitBUk1fQVJDSCgiYXJtdjgtbS5tYWluIiwgQVJNVjhNTWFpbmxpbmUsICI4LU0uTWFpbmxpbmUiLCAidjhtLm1haW4iLAorICAgICAgICAgIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OnY4X01fTWFpbiwgRktfRlBWNV9EMTYsIEFSTTo6QUVLX0hXRElWVEhVTUIpCisvLyBOb24tc3RhbmRhcmQgQXJjaCBuYW1lcy4KK0FSTV9BUkNIKCJpd21teHQiLCBJV01NWFQsICJpd21teHQiLCAiIiwgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djVURSwKKyAgICAgICAgICBGS19OT05FLCBBUk06OkFFS19OT05FKQorQVJNX0FSQ0goIml3bW14dDIiLCBJV01NWFQyLCAiaXdtbXh0MiIsICIiLCBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2NVRFLAorICAgICAgICAgIEZLX05PTkUsIEFSTTo6QUVLX05PTkUpCitBUk1fQVJDSCgieHNjYWxlIiwgWFNDQUxFLCAieHNjYWxlIiwgInY1ZSIsIEFSTUJ1aWxkQXR0cnM6OkNQVUFyY2g6OnY1VEUsCisgICAgICAgICAgRktfTk9ORSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9BUkNIKCJhcm12N3MiLCBBUk1WN1MsICI3LVMiLCAidjdzIiwgQVJNQnVpbGRBdHRyczo6Q1BVQXJjaDo6djcsCisgICAgICAgICAgRktfTkVPTl9WRlBWNCwgQVJNOjpBRUtfRFNQKQorQVJNX0FSQ0goImFybXY3ayIsIEFSTVY3SywgIjctSyIsICJ2N2siLCBBUk1CdWlsZEF0dHJzOjpDUFVBcmNoOjp2NywKKyAgICAgICAgICBGS19OT05FLCBBUk06OkFFS19EU1ApCisjdW5kZWYgQVJNX0FSQ0gKKworI2lmbmRlZiBBUk1fQVJDSF9FWFRfTkFNRQorI2RlZmluZSBBUk1fQVJDSF9FWFRfTkFNRShOQU1FLCBJRCwgRkVBVFVSRSwgTkVHRkVBVFVSRSkKKyNlbmRpZgorLy8gRklYTUU6IFRoaXMgd291bGQgYmUgbmljZXIgd2VyZSBpdCB0YWJsZWdlbgorQVJNX0FSQ0hfRVhUX05BTUUoImludmFsaWQiLCAgQVJNOjpBRUtfSU5WQUxJRCwgIG51bGxwdHIsICBudWxscHRyKQorQVJNX0FSQ0hfRVhUX05BTUUoIm5vbmUiLCAgICAgQVJNOjpBRUtfTk9ORSwgICAgIG51bGxwdHIsICBudWxscHRyKQorQVJNX0FSQ0hfRVhUX05BTUUoImNyYyIsICAgICAgQVJNOjpBRUtfQ1JDLCAgICAgICIrY3JjIiwgICAiLWNyYyIpCitBUk1fQVJDSF9FWFRfTkFNRSgiY3J5cHRvIiwgICBBUk06OkFFS19DUllQVE8sICAgIitjcnlwdG8iLCItY3J5cHRvIikKK0FSTV9BUkNIX0VYVF9OQU1FKCJkb3Rwcm9kIiwgIEFSTTo6QUVLX0RPVFBST0QsICAiK2RvdHByb2QiLCItZG90cHJvZCIpCitBUk1fQVJDSF9FWFRfTkFNRSgiZHNwIiwgICAgICBBUk06OkFFS19EU1AsICAgICAgIitkc3AiLCAgICItZHNwIikKK0FSTV9BUkNIX0VYVF9OQU1FKCJmcCIsICAgICAgIEFSTTo6QUVLX0ZQLCAgICAgICBudWxscHRyLCAgbnVsbHB0cikKK0FSTV9BUkNIX0VYVF9OQU1FKCJpZGl2IiwgICAgIChBUk06OkFFS19IV0RJVkFSTSB8IEFSTTo6QUVLX0hXRElWVEhVTUIpLCBudWxscHRyLCBudWxscHRyKQorQVJNX0FSQ0hfRVhUX05BTUUoIm1wIiwgICAgICAgQVJNOjpBRUtfTVAsICAgICAgIG51bGxwdHIsICBudWxscHRyKQorQVJNX0FSQ0hfRVhUX05BTUUoInNpbWQiLCAgICAgQVJNOjpBRUtfU0lNRCwgICAgIG51bGxwdHIsICBudWxscHRyKQorQVJNX0FSQ0hfRVhUX05BTUUoInNlYyIsICAgICAgQVJNOjpBRUtfU0VDLCAgICAgIG51bGxwdHIsICBudWxscHRyKQorQVJNX0FSQ0hfRVhUX05BTUUoInZpcnQiLCAgICAgQVJNOjpBRUtfVklSVCwgICAgIG51bGxwdHIsICBudWxscHRyKQorQVJNX0FSQ0hfRVhUX05BTUUoImZwMTYiLCAgICAgQVJNOjpBRUtfRlAxNiwgICAgICIrZnVsbGZwMTYiLCAgIi1mdWxsZnAxNiIpCitBUk1fQVJDSF9FWFRfTkFNRSgicmFzIiwgICAgICBBUk06OkFFS19SQVMsICAgICAgIityYXMiLCAiLXJhcyIpCitBUk1fQVJDSF9FWFRfTkFNRSgib3MiLCAgICAgICBBUk06OkFFS19PUywgICAgICAgbnVsbHB0ciwgIG51bGxwdHIpCitBUk1fQVJDSF9FWFRfTkFNRSgiaXdtbXh0IiwgICBBUk06OkFFS19JV01NWFQsICAgbnVsbHB0ciwgIG51bGxwdHIpCitBUk1fQVJDSF9FWFRfTkFNRSgiaXdtbXh0MiIsICBBUk06OkFFS19JV01NWFQyLCAgbnVsbHB0ciwgIG51bGxwdHIpCitBUk1fQVJDSF9FWFRfTkFNRSgibWF2ZXJpY2siLCBBUk06OkFFS19NQVZFUklDSywgbnVsbHB0ciwgIG51bGxwdHIpCitBUk1fQVJDSF9FWFRfTkFNRSgieHNjYWxlIiwgICBBUk06OkFFS19YU0NBTEUsICAgbnVsbHB0ciwgIG51bGxwdHIpCisjdW5kZWYgQVJNX0FSQ0hfRVhUX05BTUUKKworI2lmbmRlZiBBUk1fSFdfRElWX05BTUUKKyNkZWZpbmUgQVJNX0hXX0RJVl9OQU1FKE5BTUUsIElEKQorI2VuZGlmCitBUk1fSFdfRElWX05BTUUoImludmFsaWQiLCBBUk06OkFFS19JTlZBTElEKQorQVJNX0hXX0RJVl9OQU1FKCJub25lIiwgQVJNOjpBRUtfTk9ORSkKK0FSTV9IV19ESVZfTkFNRSgidGh1bWIiLCBBUk06OkFFS19IV0RJVlRIVU1CKQorQVJNX0hXX0RJVl9OQU1FKCJhcm0iLCBBUk06OkFFS19IV0RJVkFSTSkKK0FSTV9IV19ESVZfTkFNRSgiYXJtLHRodW1iIiwgKEFSTTo6QUVLX0hXRElWQVJNIHwgQVJNOjpBRUtfSFdESVZUSFVNQikpCisjdW5kZWYgQVJNX0hXX0RJVl9OQU1FCisKKyNpZm5kZWYgQVJNX0NQVV9OQU1FCisjZGVmaW5lIEFSTV9DUFVfTkFNRShOQU1FLCBJRCwgREVGQVVMVF9GUFUsIElTX0RFRkFVTFQsIERFRkFVTFRfRVhUKQorI2VuZGlmCitBUk1fQ1BVX05BTUUoImFybTIiLCBBUk1WMiwgRktfTk9ORSwgdHJ1ZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtMyIsIEFSTVYyQSwgRktfTk9ORSwgdHJ1ZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtNiIsIEFSTVYzLCBGS19OT05FLCB0cnVlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJhcm03bSIsIEFSTVYzTSwgRktfTk9ORSwgdHJ1ZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtOCIsIEFSTVY0LCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtODEwIiwgQVJNVjQsIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJzdHJvbmdhcm0iLCBBUk1WNCwgRktfTk9ORSwgdHJ1ZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgic3Ryb25nYXJtMTEwIiwgQVJNVjQsIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJzdHJvbmdhcm0xMTAwIiwgQVJNVjQsIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJzdHJvbmdhcm0xMTEwIiwgQVJNVjQsIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJhcm03dGRtaSIsIEFSTVY0VCwgRktfTk9ORSwgdHJ1ZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtN3RkbWktcyIsIEFSTVY0VCwgRktfTk9ORSwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTcxMHQiLCBBUk1WNFQsIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJhcm03MjB0IiwgQVJNVjRULCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtOSIsIEFSTVY0VCwgRktfTk9ORSwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTl0ZG1pIiwgQVJNVjRULCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtOTIwIiwgQVJNVjRULCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtOTIwdCIsIEFSTVY0VCwgRktfTk9ORSwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTkyMnQiLCBBUk1WNFQsIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJhcm05MzEyIiwgQVJNVjRULCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtOTQwdCIsIEFSTVY0VCwgRktfTk9ORSwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImVwOTMxMiIsIEFSTVY0VCwgRktfTk9ORSwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTEwdGRtaSIsIEFSTVY1VCwgRktfTk9ORSwgdHJ1ZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtMTAyMHQiLCBBUk1WNVQsIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJhcm05ZSIsIEFSTVY1VEUsIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJhcm05NDZlLXMiLCBBUk1WNVRFLCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtOTY2ZS1zIiwgQVJNVjVURSwgRktfTk9ORSwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTk2OGUtcyIsIEFSTVY1VEUsIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJhcm0xMGUiLCBBUk1WNVRFLCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtMTAyMGUiLCBBUk1WNVRFLCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtMTAyMmUiLCBBUk1WNVRFLCBGS19OT05FLCB0cnVlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJhcm05MjZlai1zIiwgQVJNVjVURUosIEZLX05PTkUsIHRydWUsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTExMzZqLXMiLCBBUk1WNiwgRktfTk9ORSwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTExMzZqZi1zIiwgQVJNVjYsIEZLX1ZGUFYyLCB0cnVlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJhcm0xMTM2anotcyIsIEFSTVY2LCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtMTE3NmotcyIsIEFSTVY2SywgRktfTk9ORSwgdHJ1ZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtMTE3Nmp6LXMiLCBBUk1WNktaLCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgibXBjb3JlIiwgQVJNVjZLLCBGS19WRlBWMiwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoIm1wY29yZW5vdmZwIiwgQVJNVjZLLCBGS19OT05FLCBmYWxzZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtMTE3Nmp6Zi1zIiwgQVJNVjZLWiwgRktfVkZQVjIsIHRydWUsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImFybTExNTZ0Mi1zIiwgQVJNVjZUMiwgRktfTk9ORSwgdHJ1ZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgiYXJtMTE1NnQyZi1zIiwgQVJNVjZUMiwgRktfVkZQVjIsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtbTAiLCBBUk1WNk0sIEZLX05PTkUsIHRydWUsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImNvcnRleC1tMHBsdXMiLCBBUk1WNk0sIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtbTEiLCBBUk1WNk0sIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJzYzAwMCIsIEFSTVY2TSwgRktfTk9ORSwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImNvcnRleC1hNSIsIEFSTVY3QSwgRktfTkVPTl9WRlBWNCwgZmFsc2UsCisgICAgICAgICAgICAgKEFSTTo6QUVLX1NFQyB8IEFSTTo6QUVLX01QKSkKK0FSTV9DUFVfTkFNRSgiY29ydGV4LWE3IiwgQVJNVjdBLCBGS19ORU9OX1ZGUFY0LCBmYWxzZSwKKyAgICAgICAgICAgICAoQVJNOjpBRUtfU0VDIHwgQVJNOjpBRUtfTVAgfCBBUk06OkFFS19WSVJUIHwgQVJNOjpBRUtfSFdESVZBUk0gfAorICAgICAgICAgICAgICBBUk06OkFFS19IV0RJVlRIVU1CKSkKK0FSTV9DUFVfTkFNRSgiY29ydGV4LWE4IiwgQVJNVjdBLCBGS19ORU9OLCBmYWxzZSwgQVJNOjpBRUtfU0VDKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtYTkiLCBBUk1WN0EsIEZLX05FT05fRlAxNiwgZmFsc2UsIChBUk06OkFFS19TRUMgfCBBUk06OkFFS19NUCkpCitBUk1fQ1BVX05BTUUoImNvcnRleC1hMTIiLCBBUk1WN0EsIEZLX05FT05fVkZQVjQsIGZhbHNlLAorICAgICAgICAgICAgIChBUk06OkFFS19TRUMgfCBBUk06OkFFS19NUCB8IEFSTTo6QUVLX1ZJUlQgfCBBUk06OkFFS19IV0RJVkFSTSB8CisgICAgICAgICAgICAgIEFSTTo6QUVLX0hXRElWVEhVTUIpKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtYTE1IiwgQVJNVjdBLCBGS19ORU9OX1ZGUFY0LCBmYWxzZSwKKyAgICAgICAgICAgICAoQVJNOjpBRUtfU0VDIHwgQVJNOjpBRUtfTVAgfCBBUk06OkFFS19WSVJUIHwgQVJNOjpBRUtfSFdESVZBUk0gfAorICAgICAgICAgICAgICBBUk06OkFFS19IV0RJVlRIVU1CKSkKK0FSTV9DUFVfTkFNRSgiY29ydGV4LWExNyIsIEFSTVY3QSwgRktfTkVPTl9WRlBWNCwgZmFsc2UsCisgICAgICAgICAgICAgKEFSTTo6QUVLX1NFQyB8IEFSTTo6QUVLX01QIHwgQVJNOjpBRUtfVklSVCB8IEFSTTo6QUVLX0hXRElWQVJNIHwKKyAgICAgICAgICAgICAgQVJNOjpBRUtfSFdESVZUSFVNQikpCitBUk1fQ1BVX05BTUUoImtyYWl0IiwgQVJNVjdBLCBGS19ORU9OX1ZGUFY0LCBmYWxzZSwKKyAgICAgICAgICAgICAoQVJNOjpBRUtfSFdESVZBUk0gfCBBUk06OkFFS19IV0RJVlRIVU1CKSkKK0FSTV9DUFVfTkFNRSgiY29ydGV4LXI0IiwgQVJNVjdSLCBGS19OT05FLCB0cnVlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtcjRmIiwgQVJNVjdSLCBGS19WRlBWM19EMTYsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtcjUiLCBBUk1WN1IsIEZLX1ZGUFYzX0QxNiwgZmFsc2UsCisgICAgICAgICAgICAgKEFSTTo6QUVLX01QIHwgQVJNOjpBRUtfSFdESVZBUk0pKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtcjciLCBBUk1WN1IsIEZLX1ZGUFYzX0QxNl9GUDE2LCBmYWxzZSwKKyAgICAgICAgICAgICAoQVJNOjpBRUtfTVAgfCBBUk06OkFFS19IV0RJVkFSTSkpCitBUk1fQ1BVX05BTUUoImNvcnRleC1yOCIsIEFSTVY3UiwgRktfVkZQVjNfRDE2X0ZQMTYsIGZhbHNlLAorICAgICAgICAgICAgIChBUk06OkFFS19NUCB8IEFSTTo6QUVLX0hXRElWQVJNKSkKK0FSTV9DUFVfTkFNRSgiY29ydGV4LXI1MiIsIEFSTVY4UiwgRktfTkVPTl9GUF9BUk1WOCwgdHJ1ZSwgQVJNOjpBRUtfTk9ORSkKK0FSTV9DUFVfTkFNRSgic2MzMDAiLCBBUk1WN00sIEZLX05PTkUsIGZhbHNlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtbTMiLCBBUk1WN00sIEZLX05PTkUsIHRydWUsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImNvcnRleC1tNCIsIEFSTVY3RU0sIEZLX0ZQVjRfU1BfRDE2LCB0cnVlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtbTciLCBBUk1WN0VNLCBGS19GUFY1X0QxNiwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImNvcnRleC1tMjMiLCBBUk1WOE1CYXNlbGluZSwgRktfTk9ORSwgZmFsc2UsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoImNvcnRleC1tMzMiLCBBUk1WOE1NYWlubGluZSwgRktfRlBWNV9TUF9EMTYsIGZhbHNlLCBBUk06OkFFS19EU1ApCitBUk1fQ1BVX05BTUUoImNvcnRleC1hMzIiLCBBUk1WOEEsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LCBmYWxzZSwgQVJNOjpBRUtfQ1JDKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtYTM1IiwgQVJNVjhBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgZmFsc2UsIEFSTTo6QUVLX0NSQykKK0FSTV9DUFVfTkFNRSgiY29ydGV4LWE1MyIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLCBBUk06OkFFS19DUkMpCitBUk1fQ1BVX05BTUUoImNvcnRleC1hNTUiLCBBUk1WOF8yQSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLAorICAgICAgICAgICAgKEFSTTo6QUVLX0ZQMTYgfCBBUk06OkFFS19ET1RQUk9EKSkKK0FSTV9DUFVfTkFNRSgiY29ydGV4LWE1NyIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLCBBUk06OkFFS19DUkMpCitBUk1fQ1BVX05BTUUoImNvcnRleC1hNzIiLCBBUk1WOEEsIEZLX0NSWVBUT19ORU9OX0ZQX0FSTVY4LCBmYWxzZSwgQVJNOjpBRUtfQ1JDKQorQVJNX0NQVV9OQU1FKCJjb3J0ZXgtYTczIiwgQVJNVjhBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgZmFsc2UsIEFSTTo6QUVLX0NSQykKK0FSTV9DUFVfTkFNRSgiY29ydGV4LWE3NSIsIEFSTVY4XzJBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgZmFsc2UsCisgICAgICAgICAgICAoQVJNOjpBRUtfRlAxNiB8IEFSTTo6QUVLX0RPVFBST0QpKQorQVJNX0NQVV9OQU1FKCJjeWNsb25lIiwgQVJNVjhBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgZmFsc2UsIEFSTTo6QUVLX0NSQykKK0FSTV9DUFVfTkFNRSgiZXh5bm9zLW0xIiwgQVJNVjhBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgZmFsc2UsIEFSTTo6QUVLX0NSQykKK0FSTV9DUFVfTkFNRSgiZXh5bm9zLW0yIiwgQVJNVjhBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgZmFsc2UsIEFSTTo6QUVLX0NSQykKK0FSTV9DUFVfTkFNRSgiZXh5bm9zLW0zIiwgQVJNVjhBLCBGS19DUllQVE9fTkVPTl9GUF9BUk1WOCwgZmFsc2UsIEFSTTo6QUVLX0NSQykKK0FSTV9DUFVfTkFNRSgia3J5byIsIEFSTVY4QSwgRktfQ1JZUFRPX05FT05fRlBfQVJNVjgsIGZhbHNlLCBBUk06OkFFS19DUkMpCisvLyBOb24tc3RhbmRhcmQgQXJjaCBuYW1lcy4KK0FSTV9DUFVfTkFNRSgiaXdtbXh0IiwgSVdNTVhULCBGS19OT05FLCB0cnVlLCBBUk06OkFFS19OT05FKQorQVJNX0NQVV9OQU1FKCJ4c2NhbGUiLCBYU0NBTEUsIEZLX05PTkUsIHRydWUsIEFSTTo6QUVLX05PTkUpCitBUk1fQ1BVX05BTUUoInN3aWZ0IiwgQVJNVjdTLCBGS19ORU9OX1ZGUFY0LCB0cnVlLAorICAgICAgICAgICAgIChBUk06OkFFS19IV0RJVkFSTSB8IEFSTTo6QUVLX0hXRElWVEhVTUIpKQorLy8gSW52YWxpZCBDUFUKK0FSTV9DUFVfTkFNRSgiaW52YWxpZCIsIElOVkFMSUQsIEZLX0lOVkFMSUQsIHRydWUsIEFSTTo6QUVLX0lOVkFMSUQpCisjdW5kZWYgQVJNX0NQVV9OQU1FCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQVJNV2luRUguaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BUk1XaW5FSC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0NjM2MjkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQVJNV2luRUguaApAQCAtMCwwICsxLDM4MiBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvV2luQVJNRUguaCAtIFdpbmRvd3Mgb24gQVJNIEVIIENvbnN0YW50cyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQVJNV0lORUhfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQVJNV0lORUhfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBBUk0geworbmFtZXNwYWNlIFdpbkVIIHsKK2VudW0gY2xhc3MgUnVudGltZUZ1bmN0aW9uRmxhZyB7CisgIFJGRl9VbnBhY2tlZCwgICAgICAgLy8vIHVucGFja2VkIGVudHJ5CisgIFJGRl9QYWNrZWQsICAgICAgICAgLy8vIHBhY2tlZCBlbnRyeQorICBSRkZfUGFja2VkRnJhZ21lbnQsIC8vLyBwYWNrZWQgZW50cnkgcmVwcmVzZW50aW5nIGEgZnJhZ21lbnQKKyAgUkZGX1Jlc2VydmVkLCAgICAgICAvLy8gcmVzZXJ2ZWQKK307CisKK2VudW0gY2xhc3MgUmV0dXJuVHlwZSB7CisgIFJUX1BPUCwgICAgICAgICAgICAgLy8vIHJldHVybiB2aWEgcG9wIHtwY30gKEwgZmxhZyBtdXN0IGJlIHNldCkKKyAgUlRfQiwgICAgICAgICAgICAgICAvLy8gMTYtYml0IGJyYW5jaAorICBSVF9CVywgICAgICAgICAgICAgIC8vLyAzMi1iaXQgYnJhbmNoCisgIFJUX05vRXBpbG9ndWUsICAgICAgLy8vIG5vIGVwaWxvZ3VlIChmcmFnbWVudCkKK307CisKKy8vLyBSdW50aW1lRnVuY3Rpb24gLSBBbiBlbnRyeSBpbiB0aGUgdGFibGUgb2YgcHJvY2VkdXJlIGRhdGEgKC5wZGF0YSkKKy8vLworLy8vICAzIDMgMiAyIDIgMiAyIDIgMiAyIDIgMiAxIDEgMSAxIDEgMSAxIDEgMSAxIDAgMCAwIDAgMCAwIDAgMCAwIDAKKy8vLyAgMSAwIDkgOCA3IDYgNSA0IDMgMiAxIDAgOSA4IDcgNiA1IDQgMyAyIDEgMCA5IDggNyA2IDUgNCAzIDIgMSAwCisvLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vLyB8ICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gU3RhcnQgUlZBICAgICAgICAgICAgICAgICAgICAgICAgfAorLy8vICstLS0tLS0tLS0tLS0tLS0tLS0tKy0rLSstKy0tLS0tKy0rLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0rCisvLy8gfCAgICBTdGFjayBBZGp1c3QgICB8Q3xMfFJ8IFJlZyB8SHxSZXR8ICAgRnVuY3Rpb24gTGVuZ3RoICAgfEZsZ3wKKy8vLyArLS0tLS0tLS0tLS0tLS0tLS0tLSstKy0rLSstLS0tLSstKy0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tKworLy8vCisvLy8gRmxhZyA6IDItYml0IGZpZWxkIHdpdGggdGhlIGZvbGxvd2luZyBtZWFuaW5nczoKKy8vLyAgIC0gMDAgPSBwYWNrZWQgdW53aW5kIGRhdGEgbm90IHVzZWQ7IHJlYW1pbmluZyBiaXRzIHBvaW50IHRvIC54ZGF0YSByZWNvcmQKKy8vLyAgIC0gMDEgPSBwYWNrZWQgdW53aW5kIGRhdGEKKy8vLyAgIC0gMTAgPSBwYWNrZWQgdW53aW5kIGRhdGEsIGZ1bmN0aW9uIGFzc3VtZWQgdG8gaGF2ZSBubyBwcm9sb2d1ZTsgdXNlZnVsCisvLy8gICAgICAgICAgZm9yIGZ1bmN0aW9uIGZyYWdtZW50cyB0aGF0IGFyZSBkaXNjb250aWd1b3VzIHdpdGggdGhlIHN0YXJ0IG9mIHRoZQorLy8vICAgICAgICAgIGZ1bmN0aW9uCisvLy8gICAtIDExID0gcmVzZXJ2ZWQKKy8vLyBGdW5jdGlvbiBMZW5ndGggOiAxMS1iaXQgZmllbGQgcHJvdmlkaW5nIHRoZSBsZW5ndGggb2YgdGhlIGVudGlyZSBmdW5jdGlvbgorLy8vICAgICAgICAgICAgICAgICAgIGluIGJ5dGVzLCBkaXZpZGVkIGJ5IDI7IGlmIHRoZSBmdW5jdGlvbiBpcyBncmVhdGVyIHRoYW4KKy8vLyAgICAgICAgICAgICAgICAgICA0S0IsIGEgZnVsbCAueGRhdGEgcmVjb3JkIG11c3QgYmUgdXNlZCBpbnN0ZWFkCisvLy8gUmV0IDogMi1iaXQgZmllbGQgaW5kaWNhdGluZyBob3cgdGhlIGZ1bmN0aW9uIHJldHVybnMKKy8vLyAgIC0gMDAgPSByZXR1cm4gdmlhIHBvcCB7cGN9ICh0aGUgTCBiaXQgbXVzdCBiZSBzZXQpCisvLy8gICAtIDAxID0gcmV0dXJuIHZpYSAxNi1iaXQgYnJhbmNoCisvLy8gICAtIDEwID0gcmV0dXJuIHZpYSAzMi1iaXQgYnJhbmNoCisvLy8gICAtIDExID0gbm8gZXBpbG9ndWU7IHVzZWZ1bCBmb3IgZnVuY3Rpb24gZnJhZ21lbnRzIHRoYXQgbWF5IG9ubHkgY29udGFpbiBhCisvLy8gICAgICAgICAgcHJvbG9ndWUgYnV0IHRoZSBlcGlsb2d1ZSBpcyBlbHNld2hlcmUKKy8vLyBIIDogMS1iaXQgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZ1bmN0aW9uICJob21lcyIgdGhlIGludGVnZXIgcGFyYW1ldGVyCisvLy8gICAgIHJlZ2lzdGVycyAocjAtcjMpLCBhbGxvY2F0aW5nIDE2LWJ5dGVzIG9uIHRoZSBzdGFjaworLy8vIFJlZyA6IDMtYml0IGZpZWxkIGluZGljYXRpbmcgdGhlIGluZGV4IG9mIHRoZSBsYXN0IHNhdmVkIG5vbi12b2xhdGlsZQorLy8vICAgICAgIHJlZ2lzdGVyLiAgSWYgdGhlIFIgYml0IGlzIHNldCB0byAwLCB0aGVuIG9ubHkgaW50ZWdlciByZWdpc3RlcnMgYXJlCisvLy8gICAgICAgc2F2ZWQgKHI0LXJOLCB3aGVyZSBOIGlzIDQgKyBSZWcpLiAgSWYgdGhlIFIgYml0IGlzIHNldCB0byAxLCB0aGVuCisvLy8gICAgICAgb25seSBmbG9hdGluZy1wb2ludCByZWdpc3RlcnMgYXJlIGJlaW5nIHNhdmVkIChkOC1kTiwgd2hlcmUgTiBpcworLy8vICAgICAgIDggKyBSZWcpLiAgVGhlIHNwZWNpYWwgY2FzZSBvZiB0aGUgUiBiaXQgYmVpbmcgc2V0IHRvIDEgYW5kIFJlZyBlcXVhbAorLy8vICAgICAgIHRvIDcgaW5kaWNhdGVzIHRoYXQgbm8gcmVnaXN0ZXJzIGFyZSBzYXZlZC4KKy8vLyBSIDogMS1iaXQgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIG5vbi12b2xhdGlsZSByZWdpc3RlcnMgYXJlIGludGVnZXIgb3IKKy8vLyAgICAgZmxvYXRpbmctcG9pbnQuICAwIGluZGljYXRlcyBpbnRlZ2VyLCAxIGluZGljYXRlcyBmbG9hdGluZy1wb2ludC4gIFRoZQorLy8vICAgICBzcGVjaWFsIGNhc2Ugb2YgdGhlIFItZmxhZyBiZWluZyBzZXQgYW5kIFJlZyBiZWluZyBzZXQgdG8gNyBpbmRpY2F0ZXMKKy8vLyAgICAgdGhhdCBubyBub24tdm9sYXRpbGUgcmVnaXN0ZXJzIGFyZSBzYXZlZC4KKy8vLyBMIDogMS1iaXQgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIHNhdmVzL3Jlc3RvcmVzIHRoZSBsaW5rCisvLy8gICAgIHJlZ2lzdGVyIChMUikKKy8vLyBDIDogMS1iaXQgZmxhZyBpbmRpY2F0aW5nIHdoZXRoZXIgdGhlIGZ1bmN0aW9uIGluY2x1ZGVzIGV4dHJhIGluc3RydWN0aW9ucworLy8vICAgICB0byBzZXR1cCBhIGZyYW1lIGNoYWluIGZvciBmYXN0IHdhbGtpbmcuICBJZiB0aGlzIGZsYWcgaXMgc2V0LCByMTEgaXMKKy8vLyAgICAgaW1wbGljaXRseSBhZGRlZCB0byB0aGUgbGlzdCBvZiBzYXZlZCBub24tdm9sYXRpbGUgaW50ZWdlciByZWdpc3RlcnMuCisvLy8gU3RhY2sgQWRqdXN0IDogMTAtYml0IGZpZWxkIGluZGljYXRpbmcgdGhlIG51bWJlciBvZiBieXRlcyBvZiBzdGFjayB0aGF0IGFyZQorLy8vICAgICAgICAgICAgICAgIGFsbG9jYXRlZCBmb3IgdGhpcyBmdW5jdGlvbi4gIE9ubHkgdmFsdWVzIGJldHdlZW4gMHgwMDAgYW5kCisvLy8gICAgICAgICAgICAgICAgMHgzZjMgY2FuIGJlIGRpcmVjdGx5IGVuY29kZWQuICBJZiB0aGUgdmFsdWUgaXMgMHgzZjQgb3IKKy8vLyAgICAgICAgICAgICAgICBncmVhdGVyLCB0aGVuIHRoZSBsb3cgNCBiaXRzIGhhdmUgc3BlY2lhbCBtZWFuaW5nIGFzIGZvbGxvd3M6CisvLy8gICAgICAgICAgICAgICAgLSBCaXQgMC0xCisvLy8gICAgICAgICAgICAgICAgICBpbmRpY2F0ZSB0aGUgbnVtYmVyIG9mIHdvcmRzJyBvZiBhZGp1c3RtZW50ICgxLTQpLCBtaW51cyAxCisvLy8gICAgICAgICAgICAgICAgLSBCaXQgMgorLy8vICAgICAgICAgICAgICAgICAgaW5kaWNhdGVzIGlmIHRoZSBwcm9sb2d1ZSBjb21iaW5lZCBhZGp1c3RtZW50IGludG8gcHVzaAorLy8vICAgICAgICAgICAgICAgIC0gQml0IDMKKy8vLyAgICAgICAgICAgICAgICAgIGluZGljYXRlcyBpZiB0aGUgZXBpbG9ndWUgY29tYmluZWQgYWRqdXN0bWVudCBpbnRvIHBvcAorLy8vCisvLy8gUkVTVFJJQ1RJT05TOgorLy8vICAgLSBJRiBDIGlzIFNFVDoKKy8vLyAgICAgKyBMIGZsYWcgbXVzdCBiZSBzZXQgc2luY2UgZnJhbWUgY2hhaW5pbmcgcmVxdWlyZXMgcjExIGFuZCBscgorLy8vICAgICArIHIxMSBtdXN0IE5PVCBiZSBpbmNsdWRlZCBpbiB0aGUgc2V0IG9mIHJlZ2lzdGVycyBkZXNjcmliZWQgYnkgUmVnCisvLy8gICAtIElGIFJldCBpcyAwOgorLy8vICAgICArIEwgZmxhZyBtdXN0IGJlIHNldAorCisvLyBOT1RFOiBSdW50aW1lRnVuY3Rpb24gaXMgbWVhbnQgdG8gYmUgYSBzaW1wbGUgY2xhc3MgdGhhdCBwcm92aWRlcyByYXcgYWNjZXNzCisvLyB0byBhbGwgZmllbGRzIGluIHRoZSBzdHJ1Y3R1cmUuICBUaGUgYWNjZXNzb3IgbWV0aG9kcyByZWZsZWN0IHRoZSBuYW1lcyBvZgorLy8gdGhlIGJpdGZpZWxkcyB0aGF0IHRoZXkgY29ycmVzcG9uZCB0by4gIEFsdGhvdWdoIHNvbWUgb2J2aW91cyBzaW1wbGlmaWNhdGlvbnMKKy8vIGFyZSBwb3NzaWJsZSB2aWEgbWVyZ2luZyBvZiBtZXRob2RzLCBpdCB3b3VsZCBwcmV2ZW50IHRoZSB1c2Ugb2YgdGhpcyBjbGFzcworLy8gdG8gZnVsbHkgaW5zcGVjdCB0aGUgY29udGVudHMgb2YgdGhlIGRhdGEgc3RydWN0dXJlIHdoaWNoIGlzIHBhcnRpY3VsYXJseQorLy8gdXNlZnVsIGZvciBzY2VuYXJpb3Mgc3VjaCBhcyBsbHZtLXJlYWRvYmogdG8gYWlkIGluIHRlc3RpbmcuCisKK2NsYXNzIFJ1bnRpbWVGdW5jdGlvbiB7CitwdWJsaWM6CisgIGNvbnN0IHN1cHBvcnQ6OnVsaXR0bGUzMl90IEJlZ2luQWRkcmVzczsKKyAgY29uc3Qgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVW53aW5kRGF0YTsKKworICBSdW50aW1lRnVuY3Rpb24oY29uc3Qgc3VwcG9ydDo6dWxpdHRsZTMyX3QgKkRhdGEpCisgICAgOiBCZWdpbkFkZHJlc3MoRGF0YVswXSksIFVud2luZERhdGEoRGF0YVsxXSkge30KKworICBSdW50aW1lRnVuY3Rpb24oY29uc3Qgc3VwcG9ydDo6dWxpdHRsZTMyX3QgQmVnaW5BZGRyZXNzLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3VwcG9ydDo6dWxpdHRsZTMyX3QgVW53aW5kRGF0YSkKKyAgICA6IEJlZ2luQWRkcmVzcyhCZWdpbkFkZHJlc3MpLCBVbndpbmREYXRhKFVud2luZERhdGEpIHt9CisKKyAgUnVudGltZUZ1bmN0aW9uRmxhZyBGbGFnKCkgY29uc3QgeworICAgIHJldHVybiBSdW50aW1lRnVuY3Rpb25GbGFnKFVud2luZERhdGEgJiAweDMpOworICB9CisKKyAgdWludDMyX3QgRXhjZXB0aW9uSW5mb3JtYXRpb25SVkEoKSBjb25zdCB7CisgICAgYXNzZXJ0KEZsYWcoKSA9PSBSdW50aW1lRnVuY3Rpb25GbGFnOjpSRkZfVW5wYWNrZWQgJiYKKyAgICAgICAgICAgInVucGFja2VkIGZvcm0gcmVxdWlyZWQgZm9yIHRoaXMgb3BlcmF0aW9uIik7CisgICAgcmV0dXJuIChVbndpbmREYXRhICYgfjB4Myk7CisgIH0KKworICB1aW50MzJfdCBQYWNrZWRVbndpbmREYXRhKCkgY29uc3QgeworICAgIGFzc2VydCgoRmxhZygpID09IFJ1bnRpbWVGdW5jdGlvbkZsYWc6OlJGRl9QYWNrZWQgfHwKKyAgICAgICAgICAgIEZsYWcoKSA9PSBSdW50aW1lRnVuY3Rpb25GbGFnOjpSRkZfUGFja2VkRnJhZ21lbnQpICYmCisgICAgICAgICAgICJwYWNrZWQgZm9ybSByZXF1aXJlZCBmb3IgdGhpcyBvcGVyYXRpb24iKTsKKyAgICByZXR1cm4gKFVud2luZERhdGEgJiB+MHgzKTsKKyAgfQorICB1aW50MzJfdCBGdW5jdGlvbkxlbmd0aCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoKEZsYWcoKSA9PSBSdW50aW1lRnVuY3Rpb25GbGFnOjpSRkZfUGFja2VkIHx8CisgICAgICAgICAgICBGbGFnKCkgPT0gUnVudGltZUZ1bmN0aW9uRmxhZzo6UkZGX1BhY2tlZEZyYWdtZW50KSAmJgorICAgICAgICAgICAicGFja2VkIGZvcm0gcmVxdWlyZWQgZm9yIHRoaXMgb3BlcmF0aW9uIik7CisgICAgcmV0dXJuICgoKFVud2luZERhdGEgJiAweDAwMDAxZmZjKSA+PiAyKSA8PCAxKTsKKyAgfQorICBSZXR1cm5UeXBlIFJldCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoKEZsYWcoKSA9PSBSdW50aW1lRnVuY3Rpb25GbGFnOjpSRkZfUGFja2VkIHx8CisgICAgICAgICAgICBGbGFnKCkgPT0gUnVudGltZUZ1bmN0aW9uRmxhZzo6UkZGX1BhY2tlZEZyYWdtZW50KSAmJgorICAgICAgICAgICAicGFja2VkIGZvcm0gcmVxdWlyZWQgZm9yIHRoaXMgb3BlcmF0aW9uIik7CisgICAgYXNzZXJ0KCgoVW53aW5kRGF0YSAmIDB4MDAwMDYwMDApIHx8IEwoKSkgJiYgIkwgbXVzdCBiZSBzZXQgdG8gMSIpOworICAgIHJldHVybiBSZXR1cm5UeXBlKChVbndpbmREYXRhICYgMHgwMDAwNjAwMCkgPj4gMTMpOworICB9CisgIGJvb2wgSCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoKEZsYWcoKSA9PSBSdW50aW1lRnVuY3Rpb25GbGFnOjpSRkZfUGFja2VkIHx8CisgICAgICAgICAgICBGbGFnKCkgPT0gUnVudGltZUZ1bmN0aW9uRmxhZzo6UkZGX1BhY2tlZEZyYWdtZW50KSAmJgorICAgICAgICAgICAicGFja2VkIGZvcm0gcmVxdWlyZWQgZm9yIHRoaXMgb3BlcmF0aW9uIik7CisgICAgcmV0dXJuICgoVW53aW5kRGF0YSAmIDB4MDAwMDgwMDApID4+IDE1KTsKKyAgfQorICB1aW50OF90IFJlZygpIGNvbnN0IHsKKyAgICBhc3NlcnQoKEZsYWcoKSA9PSBSdW50aW1lRnVuY3Rpb25GbGFnOjpSRkZfUGFja2VkIHx8CisgICAgICAgICAgICBGbGFnKCkgPT0gUnVudGltZUZ1bmN0aW9uRmxhZzo6UkZGX1BhY2tlZEZyYWdtZW50KSAmJgorICAgICAgICAgICAicGFja2VkIGZvcm0gcmVxdWlyZWQgZm9yIHRoaXMgb3BlcmF0aW9uIik7CisgICAgcmV0dXJuICgoVW53aW5kRGF0YSAmIDB4MDAwNzAwMDApID4+IDE2KTsKKyAgfQorICBib29sIFIoKSBjb25zdCB7CisgICAgYXNzZXJ0KChGbGFnKCkgPT0gUnVudGltZUZ1bmN0aW9uRmxhZzo6UkZGX1BhY2tlZCB8fAorICAgICAgICAgICAgRmxhZygpID09IFJ1bnRpbWVGdW5jdGlvbkZsYWc6OlJGRl9QYWNrZWRGcmFnbWVudCkgJiYKKyAgICAgICAgICAgInBhY2tlZCBmb3JtIHJlcXVpcmVkIGZvciB0aGlzIG9wZXJhdGlvbiIpOworICAgIHJldHVybiAoKFVud2luZERhdGEgJiAweDAwMDgwMDAwKSA+PiAxOSk7CisgIH0KKyAgYm9vbCBMKCkgY29uc3QgeworICAgIGFzc2VydCgoRmxhZygpID09IFJ1bnRpbWVGdW5jdGlvbkZsYWc6OlJGRl9QYWNrZWQgfHwKKyAgICAgICAgICAgIEZsYWcoKSA9PSBSdW50aW1lRnVuY3Rpb25GbGFnOjpSRkZfUGFja2VkRnJhZ21lbnQpICYmCisgICAgICAgICAgICJwYWNrZWQgZm9ybSByZXF1aXJlZCBmb3IgdGhpcyBvcGVyYXRpb24iKTsKKyAgICByZXR1cm4gKChVbndpbmREYXRhICYgMHgwMDEwMDAwMCkgPj4gMjApOworICB9CisgIGJvb2wgQygpIGNvbnN0IHsKKyAgICBhc3NlcnQoKEZsYWcoKSA9PSBSdW50aW1lRnVuY3Rpb25GbGFnOjpSRkZfUGFja2VkIHx8CisgICAgICAgICAgICBGbGFnKCkgPT0gUnVudGltZUZ1bmN0aW9uRmxhZzo6UkZGX1BhY2tlZEZyYWdtZW50KSAmJgorICAgICAgICAgICAicGFja2VkIGZvcm0gcmVxdWlyZWQgZm9yIHRoaXMgb3BlcmF0aW9uIik7CisgICAgYXNzZXJ0KCgoflVud2luZERhdGEgJiAweDAwMjAwMDAwKSB8fCBMKCkpICYmCisgICAgICAgICAgICJMIGZsYWcgbXVzdCBiZSBzZXQsIGNoYWluaW5nIHJlcXVpcmVzIHIxMSBhbmQgTFIiKTsKKyAgICBhc3NlcnQoKCh+VW53aW5kRGF0YSAmIDB4MDAyMDAwMDApIHx8IChSZWcoKSA8IDcpIHx8IFIoKSkgJiYKKyAgICAgICAgICAgInIxMSBtdXN0IG5vdCBiZSBpbmNsdWRlZCBpbiBSZWc7IEMgaW1wbGllcyByMTEiKTsKKyAgICByZXR1cm4gKChVbndpbmREYXRhICYgMHgwMDIwMDAwMCkgPj4gMjEpOworICB9CisgIHVpbnQxNl90IFN0YWNrQWRqdXN0KCkgY29uc3QgeworICAgIGFzc2VydCgoRmxhZygpID09IFJ1bnRpbWVGdW5jdGlvbkZsYWc6OlJGRl9QYWNrZWQgfHwKKyAgICAgICAgICAgIEZsYWcoKSA9PSBSdW50aW1lRnVuY3Rpb25GbGFnOjpSRkZfUGFja2VkRnJhZ21lbnQpICYmCisgICAgICAgICAgICJwYWNrZWQgZm9ybSByZXF1aXJlZCBmb3IgdGhpcyBvcGVyYXRpb24iKTsKKyAgICByZXR1cm4gKChVbndpbmREYXRhICYgMHhmZmMwMDAwMCkgPj4gMjIpOworICB9Cit9OworCisvLy8gUHJvbG9ndWVGb2xkaW5nIC0gcHNldWRvLWZsYWcgZGVyaXZlZCBmcm9tIFN0YWNrIEFkanVzdCBpbmRpY2F0aW5nIHRoYXQgdGhlCisvLy8gcHJvbG9ndWUgaGFzIHN0YWNrIGFkanVzdG1lbnQgY29tYmluZWQgaW50byB0aGUgcHVzaAoraW5saW5lIGJvb2wgUHJvbG9ndWVGb2xkaW5nKGNvbnN0IFJ1bnRpbWVGdW5jdGlvbiAmUkYpIHsKKyAgcmV0dXJuIFJGLlN0YWNrQWRqdXN0KCkgPj0gMHgzZjQgJiYgKFJGLlN0YWNrQWRqdXN0KCkgJiAweDQpOworfQorLy8vIEVwaWxvZ3VlIC0gcHNldWRvLWZsYWcgZGVyaXZlZCBmcm9tIFN0YWNrIEFkanVzdCBpbmRpY2F0aW5nIHRoYXQgdGhlCisvLy8gZXBpbG9ndWUgaGFzIHN0YWNrIGFkanVzdG1lbnQgY29tYmluZWQgaW50byB0aGUgcG9wCitpbmxpbmUgYm9vbCBFcGlsb2d1ZUZvbGRpbmcoY29uc3QgUnVudGltZUZ1bmN0aW9uICZSRikgeworICByZXR1cm4gUkYuU3RhY2tBZGp1c3QoKSA+PSAweDNmNCAmJiAoUkYuU3RhY2tBZGp1c3QoKSAmIDB4OCk7Cit9CisvLy8gU3RhY2tBZGp1c3RtZW50IC0gY2FsY3VsYXRlZCBzdGFjayBhZGp1c3RtZW50IGluIHdvcmRzLiAgVGhlIHN0YWNrCisvLy8gYWRqdXN0bWVudCBzaG91bGQgYmUgZGV0ZXJtaW5lZCB2aWEgdGhpcyBmdW5jdGlvbiB0byBhY2NvdW50IGZvciB0aGUgc3BlY2lhbAorLy8vIGhhbmRsaW5nIHRoZSBzcGVjaWFsIGVuY29kaW5nIHdoZW4gdGhlIHZhbHVlIGlzID49IDB4M2Y0LgoraW5saW5lIHVpbnQxNl90IFN0YWNrQWRqdXN0bWVudChjb25zdCBSdW50aW1lRnVuY3Rpb24gJlJGKSB7CisgIHVpbnQxNl90IEFkanVzdG1lbnQgPSBSRi5TdGFja0FkanVzdCgpOworICBpZiAoQWRqdXN0bWVudCA+PSAweDNmNCkKKyAgICByZXR1cm4gKEFkanVzdG1lbnQgJiAweDMpID8gKChBZGp1c3RtZW50ICYgMHgzKSA8PCAyKSAtIDEgOiAwOworICByZXR1cm4gQWRqdXN0bWVudDsKK30KKworLy8vIFNhdmVkUmVnaXN0ZXJNYXNrIC0gVXRpbGl0eSBmdW5jdGlvbiB0byBjYWxjdWxhdGUgdGhlIHNldCBvZiBzYXZlZCBnZW5lcmFsCisvLy8gcHVycG9zZSAocjAtcjE1KSBhbmQgVkZQIChkMC1kMzEpIHJlZ2lzdGVycy4KK3N0ZDo6cGFpcjx1aW50MTZfdCwgdWludDMyX3Q+IFNhdmVkUmVnaXN0ZXJNYXNrKGNvbnN0IFJ1bnRpbWVGdW5jdGlvbiAmUkYpOworCisvLy8gRXhjZXB0aW9uRGF0YVJlY29yZCAtIEFuIGVudHJ5IGluIHRoZSB0YWJsZSBvZiBleGNlcHRpb24gZGF0YSAoLnhkYXRhKQorLy8vCisvLy8gIDMgMyAyIDIgMiAyIDIgMiAyIDIgMiAyIDEgMSAxIDEgMSAxIDEgMSAxIDEgMCAwIDAgMCAwIDAgMCAwIDAgMAorLy8vICAxIDAgOSA4IDcgNiA1IDQgMyAyIDEgMCA5IDggNyA2IDUgNCAzIDIgMSAwIDkgOCA3IDYgNSA0IDMgMiAxIDAKKy8vLyArLS0tLS0tLSstLS0tLS0tLS0rLSstKy0rLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8vIHwgQyBXcmQgfCBFcGkgQ250IHxGfEV8WHxWZXJ8ICAgICAgICAgRnVuY3Rpb24gTGVuZ3RoICAgICAgICAgICB8CisvLy8gKy0tLS0tLS0rLS0tLS0tLS0rJy0nLSctJy0tLSctLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vLyB8ICAgIFJlc2VydmVkICAgIHxFeC4gQ29kZSBXb3Jkc3wgICAoRXh0ZW5kZWQgRXBpbG9ndWUgQ291bnQpICAgfAorLy8vICstLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLy8KKy8vLyBGdW5jdGlvbiBMZW5ndGggOiAxOC1iaXQgZmllbGQgaW5kaWNhdGluZyB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBmdW5jdGlvbgorLy8vICAgICAgICAgICAgICAgICAgIGluIGJ5dGVzIGRpdmlkZWQgYnkgMi4gIElmIGEgZnVuY3Rpb24gaXMgbGFyZ2VyIHRoYW4KKy8vLyAgICAgICAgICAgICAgICAgICA1MTJLQiwgdGhlbiBtdWx0aXBsZSBwZGF0YSBhbmQgeGRhdGEgcmVjb3JkcyBtdXN0IGJlIHVzZWQuCisvLy8gVmVycyA6IDItYml0IGZpZWxkIGRlc2NyaWJpbmcgdGhlIHZlcnNpb24gb2YgdGhlIHJlbWFpbmluZyBzdHJ1Y3R1cmUuICBPbmx5CisvLy8gICAgICAgIHZlcnNpb24gMCBpcyBjdXJyZW50bHkgZGVmaW5lZCAodmFsdWVzIDEtMyBhcmUgbm90IHBlcm1pdHRlZCkuCisvLy8gWCA6IDEtYml0IGZpZWxkIGluZGljYXRpbmcgdGhlIHByZXNlbmNlIG9mIGV4Y2VwdGlvbiBkYXRhCisvLy8gRSA6IDEtYml0IGZpZWxkIGluZGljYXRpbmcgdGhhdCB0aGUgc2luZ2xlIGVwaWxvZ3VlIGlzIHBhY2tlZCBpbnRvIHRoZQorLy8vICAgICBoZWFkZXIKKy8vLyBGIDogMS1iaXQgZmllbGQgaW5kaWNhdGluZyB0aGF0IHRoZSByZWNvcmQgZGVzY3JpYmVzIGEgZnVuY3Rpb24gZnJhZ21lbnQKKy8vLyAgICAgKGltcGxpZXMgdGhhdCBubyBwcm9sb2d1ZSBpcyBwcmVzZW50LCBhbmQgcHJvbG9ndWUgcHJvY2Vzc2luZyBzaG91bGQgYmUKKy8vLyAgICAgc2tpcHBlZCkKKy8vLyBFcGlsb2d1ZSBDb3VudCA6IDUtYml0IGZpZWxkIHRoYXQgZGlmZmVycyBpbiBtZWFuaW5nIGJhc2VkIG9uIHRoZSBFIGZpZWxkLgorLy8vCisvLy8gICAgICAgICAgICAgICAgICBJZiBFIGlzIHNldCwgdGhlbiB0aGlzIGZpZWxkIHNwZWNpZmllcyB0aGUgaW5kZXggb2YgdGhlCisvLy8gICAgICAgICAgICAgICAgICBmaXJzdCB1bndpbmQgY29kZSBkZXNjcmliaW5nIHRoZSAob25seSkgZXBpbG9ndWUuCisvLy8KKy8vLyAgICAgICAgICAgICAgICAgIE90aGVyd2lzZSwgdGhpcyBmaWVsZCBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBleGNlcHRpb24KKy8vLyAgICAgICAgICAgICAgICAgIHNjb3Blcy4gIElmIG1vcmUgdGhhbiAzMSBzY29wZXMgZXhpc3QsIHRoZW4gdGhpcyBmaWVsZCBhbmQKKy8vLyAgICAgICAgICAgICAgICAgIHRoZSBDb2RlIFdvcmRzIGZpZWxkIG11c3QgYm90aCBiZSBzZXQgdG8gMCB0byBpbmRpY2F0ZSB0aGF0CisvLy8gICAgICAgICAgICAgICAgICBhbiBleHRlbnNpb24gd29yZCBpcyByZXF1aXJlZC4KKy8vLyBDb2RlIFdvcmRzIDogNC1iaXQgZmllbGQgdGhhdCBzcGVjaWVzIHRoZSBudW1iZXIgb2YgMzItYml0IHdvcmRzIG5lZWRlZCB0bworLy8vICAgICAgICAgICAgICBjb250YWluIGFsbCB0aGUgdW53aW5kIGNvZGVzLiAgSWYgbW9yZSB0aGFuIDE1IHdvcmRzICg2MyBjb2RlCisvLy8gICAgICAgICAgICAgIGJ5dGVzKSBhcmUgcmVxdWlyZWQsIHRoZW4gdGhpcyBmaWVsZCBhbmQgdGhlIEVwaWxvZ3VlIENvdW50CisvLy8gICAgICAgICAgICAgIGZpZWxkIG11c3QgYm90aCBiZSBzZXQgdG8gMCB0byBpbmRpY2F0ZSB0aGF0IGFuIGV4dGVuc2lvbiB3b3JkCisvLy8gICAgICAgICAgICAgIGlzIHJlcXVpcmVkLgorLy8vIEV4dGVuZGVkIEVwaWxvZ3VlIENvdW50LCBFeHRlbmRlZCBDb2RlIFdvcmRzIDoKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWQgb25seSBpZiBFcGlsb2cgQ291bnQgYW5kIENvZGUgV29yZHMgYXJlIGJvdGgKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IHRvIDAuICBQcm92aWRlcyBhbiA4LWJpdCBleHRlbmRlZCBjb2RlIHdvcmQKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQgYW5kIDE2LWJpdHMgZm9yIGVwaWxvZ3VlIGNvdW50CisvLy8KKy8vLyAgMyAzIDIgMiAyIDIgMiAyIDIgMiAyIDIgMSAxIDEgMSAxIDEgMSAxIDEgMSAwIDAgMCAwIDAgMCAwIDAgMCAwCisvLy8gIDEgMCA5IDggNyA2IDUgNCAzIDIgMSAwIDkgOCA3IDYgNSA0IDMgMiAxIDAgOSA4IDcgNiA1IDQgMyAyIDEgMAorLy8vICstLS0tLS0tLS0tLS0tLS0tKy0tLS0tLSstLS0rLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLy8gfCAgRXAgU3RhcnQgSWR4ICB8IENvbmQgfFJlc3wgICAgICAgRXBpbG9ndWUgU3RhcnQgT2Zmc2V0ICAgICAgIHwKKy8vLyArLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0rLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8vCisvLy8gSWYgdGhlIEUgYml0IGlzIHVuc2V0IGluIHRoZSBoZWFkZXIsIHRoZSBoZWFkZXIgaXMgZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2YKKy8vLyBlcGlsb2d1ZSBzY29wZXMsIHdoaWNoIGFyZSBzb3J0ZWQgYnkgdGhlaXIgb2Zmc2V0LgorLy8vCisvLy8gRXBpbG9ndWUgU3RhcnQgT2Zmc2V0OiAxOC1iaXQgZmllbGQgZW5jb2RpbmcgdGhlIG9mZnNldCBvZiBlcGlsb2d1ZSByZWxhdGl2ZQorLy8vICAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIHN0YXJ0IG9mIHRoZSBmdW5jdGlvbiBpbiBieXRlcyBkaXZpZGVkIGJ5IHR3bworLy8vIFJlcyA6IDItYml0IGZpZWxkIHJlc2VydmVkIGZvciBmdXR1cmUgZXhwYW5zaW9uIChtdXN0IGJlIHNldCB0byAwKQorLy8vIENvbmRpdGlvbiA6IDQtYml0IGZpZWxkIHByb3ZpZGluZyB0aGUgY29uZGl0aW9uIHVuZGVyIHdoaWNoIHRoZSBlcGlsb2d1ZSBpcworLy8vICAgICAgICAgICAgIGV4ZWN1dGVkLiAgVW5jb25kaXRpb25hbCBlcGlsb2d1ZXMgc2hvdWxkIHNldCB0aGlzIGZpZWxkIHRvIDB4ZS4KKy8vLyAgICAgICAgICAgICBFcGlsb2d1ZXMgbXVzdCBiZSBlbnRpcmVseSBjb25kaXRpb25hbCBvciB1bmNvbmRpdGlvbmFsLCBhbmQgaW4KKy8vLyAgICAgICAgICAgICBUaHVtYi0yIG1vZGUuICBUaGUgZXBpbG9ndWUgYmVpbmdzIHdpdGggdGhlIGZpcnN0IGluc3RydWN0aW9uCisvLy8gICAgICAgICAgICAgYWZ0ZXIgdGhlIElUIG9wY29kZS4KKy8vLyBFcGlsb2d1ZSBTdGFydCBJbmRleCA6IDgtYml0IGZpZWxkIGluZGljYXRpbmcgdGhlIGJ5dGUgaW5kZXggb2YgdGhlIGZpcnN0CisvLy8gICAgICAgICAgICAgICAgICAgICAgICB1bndpbmQgY29kZSBkZXNjcmliaW5nIHRoZSBlcGlsb2d1ZQorLy8vCisvLy8gIDMgMyAyIDIgMiAyIDIgMiAyIDIgMiAyIDEgMSAxIDEgMSAxIDEgMSAxIDEgMCAwIDAgMCAwIDAgMCAwIDAgMAorLy8vICAxIDAgOSA4IDcgNiA1IDQgMyAyIDEgMCA5IDggNyA2IDUgNCAzIDIgMSAwIDkgOCA3IDYgNSA0IDMgMiAxIDAKKy8vLyArLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKworLy8vIHwgVW53aW5kIENvZGUgMyB8IFVud2luZCBDb2RlIDIgfCBVbndpbmQgQ29kZSAxIHwgVW53aW5kIENvZGUgMCB8CisvLy8gKy0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLSsKKy8vLworLy8vIEZvbGxvd2luZyB0aGUgZXBpbG9ndWUgc2NvcGVzLCB0aGUgYnl0ZSBjb2RlIGRlc2NyaWJpbmcgdGhlIHVud2luZGluZworLy8vIGZvbGxvd3MuICBUaGlzIGlzIHBhZGRlZCB0byBhbGlnbiB1cCB0byB3b3JkIGFsaWdubWVudC4gIEJ5dGVzIGFyZSBzdG9yZWQgaW4KKy8vLyBsaXR0bGUgZW5kaWFuLgorLy8vCisvLy8gIDMgMyAyIDIgMiAyIDIgMiAyIDIgMiAyIDEgMSAxIDEgMSAxIDEgMSAxIDEgMCAwIDAgMCAwIDAgMCAwIDAgMAorLy8vICAxIDAgOSA4IDcgNiA1IDQgMyAyIDEgMCA5IDggNyA2IDUgNCAzIDIgMSAwIDkgOCA3IDYgNSA0IDMgMiAxIDAKKy8vLyArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworLy8vIHwgICAgICAgICAgIEV4Y2VwdGlvbiBIYW5kbGVyIFJWQSAocmVxdWlyZXMgWCA9IDEpICAgICAgICAgICAgICB8CisvLy8gKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKy8vLyB8ICAocG9zc2libHkgZm9sbG93ZWQgYnkgZGF0YSByZXF1aXJlZCBmb3IgZXhjZXB0aW9uIGhhbmRsZXIpICAgfAorLy8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisvLy8KKy8vLyBJZiB0aGUgWCBiaXQgaXMgc2V0IGluIHRoZSBoZWFkZXIsIHRoZSB1bndpbmQgYnl0ZSBjb2RlIGlzIGZvbGxvd2VkIGJ5IHRoZQorLy8vIGV4Y2VwdGlvbiBoYW5kbGVyIGluZm9ybWF0aW9uLiAgVGhpcyBjb25zdGFudHMgb2Ygb25lIEV4Y2VwdGlvbiBIYW5kbGVyIFJWQQorLy8vIHdoaWNoIGlzIHRoZSBhZGRyZXNzIHRvIHRoZSBleGNlcHRpb24gaGFuZGxlciwgZm9sbG93ZWQgaW1tZWRpYXRlbHkgYnkgdGhlCisvLy8gdmFyaWFibGUgbGVuZ3RoIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHRoZSBleGNlcHRpb24gaGFuZGxlci4KKy8vLworCitzdHJ1Y3QgRXBpbG9ndWVTY29wZSB7CisgIGNvbnN0IHN1cHBvcnQ6OnVsaXR0bGUzMl90IEVTOworCisgIEVwaWxvZ3VlU2NvcGUoY29uc3Qgc3VwcG9ydDo6dWxpdHRsZTMyX3QgRGF0YSkgOiBFUyhEYXRhKSB7fQorICB1aW50MzJfdCBFcGlsb2d1ZVN0YXJ0T2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiAoRVMgJiAweDAwMDNmZmZmKTsKKyAgfQorICB1aW50OF90IFJlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gKChFUyAmIDB4MDAwYzAwMDApID4+IDE4KTsKKyAgfQorICB1aW50OF90IENvbmRpdGlvbigpIGNvbnN0IHsKKyAgICByZXR1cm4gKChFUyAmIDB4MDBmMDAwMDApID4+IDIwKTsKKyAgfQorICB1aW50OF90IEVwaWxvZ3VlU3RhcnRJbmRleCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKChFUyAmIDB4ZmYwMDAwMDApID4+IDI0KTsKKyAgfQorfTsKKworc3RydWN0IEV4Y2VwdGlvbkRhdGFSZWNvcmQ7CitpbmxpbmUgc2l6ZV90IEhlYWRlcldvcmRzKGNvbnN0IEV4Y2VwdGlvbkRhdGFSZWNvcmQgJlhSKTsKKworc3RydWN0IEV4Y2VwdGlvbkRhdGFSZWNvcmQgeworICBjb25zdCBzdXBwb3J0Ojp1bGl0dGxlMzJfdCAqRGF0YTsKKworICBFeGNlcHRpb25EYXRhUmVjb3JkKGNvbnN0IHN1cHBvcnQ6OnVsaXR0bGUzMl90ICpEYXRhKSA6IERhdGEoRGF0YSkge30KKworICB1aW50MzJfdCBGdW5jdGlvbkxlbmd0aCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKERhdGFbMF0gJiAweDAwMDNmZmZmKTsKKyAgfQorCisgIHVpbnQ4X3QgVmVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gKERhdGFbMF0gJiAweDAwMEMwMDAwKSA+PiAxODsKKyAgfQorCisgIGJvb2wgWCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKChEYXRhWzBdICYgMHgwMDEwMDAwMCkgPj4gMjApOworICB9CisKKyAgYm9vbCBFKCkgY29uc3QgeworICAgIHJldHVybiAoKERhdGFbMF0gJiAweDAwMjAwMDAwKSA+PiAyMSk7CisgIH0KKworICBib29sIEYoKSBjb25zdCB7CisgICAgcmV0dXJuICgoRGF0YVswXSAmIDB4MDA0MDAwMDApID4+IDIyKTsKKyAgfQorCisgIHVpbnQ4X3QgRXBpbG9ndWVDb3VudCgpIGNvbnN0IHsKKyAgICBpZiAoSGVhZGVyV29yZHMoKnRoaXMpID09IDEpCisgICAgICByZXR1cm4gKERhdGFbMF0gJiAweDBmODAwMDAwKSA+PiAyMzsKKyAgICByZXR1cm4gRGF0YVsxXSAmIDB4MDAwMGZmZmY7CisgIH0KKworICB1aW50OF90IENvZGVXb3JkcygpIGNvbnN0IHsKKyAgICBpZiAoSGVhZGVyV29yZHMoKnRoaXMpID09IDEpCisgICAgICByZXR1cm4gKERhdGFbMF0gJiAweGYwMDAwMDAwKSA+PiAyODsKKyAgICByZXR1cm4gKERhdGFbMV0gJiAweDAwZmYwMDAwKSA+PiAxNjsKKyAgfQorCisgIEFycmF5UmVmPHN1cHBvcnQ6OnVsaXR0bGUzMl90PiBFcGlsb2d1ZVNjb3BlcygpIGNvbnN0IHsKKyAgICBhc3NlcnQoRSgpID09IDAgJiYgImVwaWxvZ3VlIHNjb3BlcyBhcmUgb25seSBwcmVzZW50IHdoZW4gdGhlIEUgYml0IGlzIDAiKTsKKyAgICBzaXplX3QgT2Zmc2V0ID0gSGVhZGVyV29yZHMoKnRoaXMpOworICAgIHJldHVybiBtYWtlQXJyYXlSZWYoJkRhdGFbT2Zmc2V0XSwgRXBpbG9ndWVDb3VudCgpKTsKKyAgfQorCisgIEFycmF5UmVmPHVpbnQ4X3Q+IFVud2luZEJ5dGVDb2RlKCkgY29uc3QgeworICAgIGNvbnN0IHNpemVfdCBPZmZzZXQgPSBIZWFkZXJXb3JkcygqdGhpcykKKyAgICAgICAgICAgICAgICAgICAgICAgICsgKEUoKSA/IDAgOiAgRXBpbG9ndWVDb3VudCgpKTsKKyAgICBjb25zdCB1aW50OF90ICpCeXRlQ29kZSA9CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oJkRhdGFbT2Zmc2V0XSk7CisgICAgcmV0dXJuIG1ha2VBcnJheVJlZihCeXRlQ29kZSwgQ29kZVdvcmRzKCkgKiBzaXplb2YodWludDMyX3QpKTsKKyAgfQorCisgIHVpbnQzMl90IEV4Y2VwdGlvbkhhbmRsZXJSVkEoKSBjb25zdCB7CisgICAgYXNzZXJ0KFgoKSAmJiAiRXhjZXB0aW9uIEhhbmRsZXIgUlZBIGlzIG9ubHkgdmFsaWQgaWYgdGhlIFggYml0IGlzIHNldCIpOworICAgIHJldHVybiBEYXRhW0hlYWRlcldvcmRzKCp0aGlzKSArIEVwaWxvZ3VlQ291bnQoKSArIENvZGVXb3JkcygpXTsKKyAgfQorCisgIHVpbnQzMl90IEV4Y2VwdGlvbkhhbmRsZXJQYXJhbWV0ZXIoKSBjb25zdCB7CisgICAgYXNzZXJ0KFgoKSAmJiAiRXhjZXB0aW9uIEhhbmRsZXIgUlZBIGlzIG9ubHkgdmFsaWQgaWYgdGhlIFggYml0IGlzIHNldCIpOworICAgIHJldHVybiBEYXRhW0hlYWRlcldvcmRzKCp0aGlzKSArIEVwaWxvZ3VlQ291bnQoKSArIENvZGVXb3JkcygpICsgMV07CisgIH0KK307CisKK2lubGluZSBzaXplX3QgSGVhZGVyV29yZHMoY29uc3QgRXhjZXB0aW9uRGF0YVJlY29yZCAmWFIpIHsKKyAgcmV0dXJuIChYUi5EYXRhWzBdICYgMHhmZjgwMDAwMCkgPyAxIDogMjsKK30KK30KK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQWxpZ25PZi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FsaWduT2YuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmQxOWFmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FsaWduT2YuaApAQCAtMCwwICsxLDE0NiBAQAorLy89PT0tLS0gQWxpZ25PZi5oIC0gUG9ydGFibGUgY2FsY3VsYXRpb24gb2YgdHlwZSBhbGlnbm1lbnQgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgQWxpZ25lZENoYXJBcnJheSBhbmQgQWxpZ25lZENoYXJBcnJheVVuaW9uIGNsYXNzZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQUxJR05PRl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9BTElHTk9GX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgPGNzdGRkZWY+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFxzdHJ1Y3QgQWxpZ25lZENoYXJBcnJheQorLy8vIFxicmllZiBIZWxwZXIgZm9yIGJ1aWxkaW5nIGFuIGFsaWduZWQgY2hhcmFjdGVyIGFycmF5IHR5cGUuCisvLy8KKy8vLyBUaGlzIHRlbXBsYXRlIGlzIHVzZWQgdG8gZXhwbGljaXRseSBidWlsZCB1cCBhIGNvbGxlY3Rpb24gb2YgYWxpZ25lZAorLy8vIGNoYXJhY3RlciBhcnJheSB0eXBlcy4gV2UgaGF2ZSB0byBidWlsZCB0aGVzZSB1cCB1c2luZyBhIG1hY3JvIGFuZCBleHBsaWNpdAorLy8vIHNwZWNpYWxpemF0aW9uIHRvIGNvcGUgd2l0aCBNU1ZDIChhdCBsZWFzdCB0aWxsIDIwMTUpIHdoZXJlIG9ubHkgYW4KKy8vLyBpbnRlZ2VyIGxpdGVyYWwgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhbiBhbGlnbm1lbnQgY29uc3RyYWludC4gT25jZSBidWlsdAorLy8vIHVwIGhlcmUsIHdlIGNhbiB0aGVuIGJlZ2luIHRvIGluZGlyZWN0IGJldHdlZW4gdGhlc2UgdXNpbmcgbm9ybWFsIEMrKworLy8vIHRlbXBsYXRlIHBhcmFtZXRlcnMuCisKKy8vIE1TVkMgcmVxdWlyZXMgc3BlY2lhbCBoYW5kbGluZyBoZXJlLgorI2lmbmRlZiBfTVNDX1ZFUgorCit0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBBbGlnbm1lbnQsIHN0ZDo6c2l6ZV90IFNpemU+CitzdHJ1Y3QgQWxpZ25lZENoYXJBcnJheSB7CisgIExMVk1fQUxJR05BUyhBbGlnbm1lbnQpIGNoYXIgYnVmZmVyW1NpemVdOworfTsKKworI2Vsc2UgLy8gX01TQ19WRVIKKworLy8vIFxicmllZiBDcmVhdGUgYSB0eXBlIHdpdGggYW4gYWxpZ25lZCBjaGFyIGJ1ZmZlci4KK3RlbXBsYXRlPHN0ZDo6c2l6ZV90IEFsaWdubWVudCwgc3RkOjpzaXplX3QgU2l6ZT4KK3N0cnVjdCBBbGlnbmVkQ2hhckFycmF5OworCisvLyBXZSBwcm92aWRlIHNwZWNpYWwgdmFyaWF0aW9ucyBvZiB0aGlzIHRlbXBsYXRlIGZvciB0aGUgbW9zdCBjb21tb24KKy8vIGFsaWdubWVudHMgYmVjYXVzZSBfX2RlY2xzcGVjKGFsaWduKC4uLikpIGRvZXNuJ3QgYWN0dWFsbHkgd29yayB3aGVuIGl0IGlzCisvLyBhIG1lbWJlciBvZiBhIGJ5LXZhbHVlIGZ1bmN0aW9uIGFyZ3VtZW50IGluIE1TVkMsIGV2ZW4gaWYgdGhlIGFsaWdubWVudAorLy8gcmVxdWVzdCBpcyBzb21ldGhpbmcgcmVhc29uYWJseSBsaWtlIDgtYnl0ZSBvciAxNi1ieXRlLiBOb3RlIHRoYXQgd2UgY2FuJ3QKKy8vIGV2ZW4gaW5jbHVkZSB0aGUgZGVjbHNwZWMgd2l0aCB0aGUgdW5pb24gdGhhdCBmb3JjZXMgdGhlIGFsaWdubWVudCBiZWNhdXNlCisvLyBNU1ZDIHdhcm5zIG9uIHRoZSBleGlzdGVuY2Ugb2YgdGhlIGRlY2xzcGVjIGRlc3BpdGUgdGhlIHVuaW9uIG1lbWJlciBmb3JjaW5nCisvLyBwcm9wZXIgYWxpZ25tZW50LgorCit0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBTaXplPgorc3RydWN0IEFsaWduZWRDaGFyQXJyYXk8MSwgU2l6ZT4geworICB1bmlvbiB7CisgICAgY2hhciBhbGlnbmVkOworICAgIGNoYXIgYnVmZmVyW1NpemVdOworICB9OworfTsKKwordGVtcGxhdGU8c3RkOjpzaXplX3QgU2l6ZT4KK3N0cnVjdCBBbGlnbmVkQ2hhckFycmF5PDIsIFNpemU+IHsKKyAgdW5pb24geworICAgIHNob3J0IGFsaWduZWQ7CisgICAgY2hhciBidWZmZXJbU2l6ZV07CisgIH07Cit9OworCit0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBTaXplPgorc3RydWN0IEFsaWduZWRDaGFyQXJyYXk8NCwgU2l6ZT4geworICB1bmlvbiB7CisgICAgaW50IGFsaWduZWQ7CisgICAgY2hhciBidWZmZXJbU2l6ZV07CisgIH07Cit9OworCit0ZW1wbGF0ZTxzdGQ6OnNpemVfdCBTaXplPgorc3RydWN0IEFsaWduZWRDaGFyQXJyYXk8OCwgU2l6ZT4geworICB1bmlvbiB7CisgICAgZG91YmxlIGFsaWduZWQ7CisgICAgY2hhciBidWZmZXJbU2l6ZV07CisgIH07Cit9OworCisKKy8vIFRoZSByZXN0IG9mIHRoZXNlIGFyZSBwcm92aWRlZCB3aXRoIGEgX19kZWNsc3BlYyhhbGlnbiguLi4pKSBhbmQgd2Ugc2ltcGx5CisvLyBjYW4ndCBwYXNzIHRoZW0gYnktdmFsdWUgYXMgZnVuY3Rpb24gYXJndW1lbnRzIG9uIE1TVkMuCisKKyNkZWZpbmUgTExWTV9BTElHTkVEQ0hBUkFSUkFZX1RFTVBMQVRFX0FMSUdOTUVOVCh4KSBcCisgIHRlbXBsYXRlPHN0ZDo6c2l6ZV90IFNpemU+IFwKKyAgc3RydWN0IEFsaWduZWRDaGFyQXJyYXk8eCwgU2l6ZT4geyBcCisgICAgX19kZWNsc3BlYyhhbGlnbih4KSkgY2hhciBidWZmZXJbU2l6ZV07IFwKKyAgfTsKKworTExWTV9BTElHTkVEQ0hBUkFSUkFZX1RFTVBMQVRFX0FMSUdOTUVOVCgxNikKK0xMVk1fQUxJR05FRENIQVJBUlJBWV9URU1QTEFURV9BTElHTk1FTlQoMzIpCitMTFZNX0FMSUdORURDSEFSQVJSQVlfVEVNUExBVEVfQUxJR05NRU5UKDY0KQorTExWTV9BTElHTkVEQ0hBUkFSUkFZX1RFTVBMQVRFX0FMSUdOTUVOVCgxMjgpCisKKyN1bmRlZiBMTFZNX0FMSUdORURDSEFSQVJSQVlfVEVNUExBVEVfQUxJR05NRU5UCisKKyNlbmRpZiAvLyBfTVNDX1ZFUgorCituYW1lc3BhY2UgZGV0YWlsIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwKKyAgICAgICAgICB0eXBlbmFtZSBUMiA9IGNoYXIsIHR5cGVuYW1lIFQzID0gY2hhciwgdHlwZW5hbWUgVDQgPSBjaGFyLAorICAgICAgICAgIHR5cGVuYW1lIFQ1ID0gY2hhciwgdHlwZW5hbWUgVDYgPSBjaGFyLCB0eXBlbmFtZSBUNyA9IGNoYXIsCisgICAgICAgICAgdHlwZW5hbWUgVDggPSBjaGFyLCB0eXBlbmFtZSBUOSA9IGNoYXIsIHR5cGVuYW1lIFQxMCA9IGNoYXI+CitjbGFzcyBBbGlnbmVySW1wbCB7CisgIFQxIHQxOyBUMiB0MjsgVDMgdDM7IFQ0IHQ0OyBUNSB0NTsgVDYgdDY7IFQ3IHQ3OyBUOCB0ODsgVDkgdDk7IFQxMCB0MTA7CisKKyAgQWxpZ25lckltcGwoKSA9IGRlbGV0ZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwKKyAgICAgICAgICB0eXBlbmFtZSBUMiA9IGNoYXIsIHR5cGVuYW1lIFQzID0gY2hhciwgdHlwZW5hbWUgVDQgPSBjaGFyLAorICAgICAgICAgIHR5cGVuYW1lIFQ1ID0gY2hhciwgdHlwZW5hbWUgVDYgPSBjaGFyLCB0eXBlbmFtZSBUNyA9IGNoYXIsCisgICAgICAgICAgdHlwZW5hbWUgVDggPSBjaGFyLCB0eXBlbmFtZSBUOSA9IGNoYXIsIHR5cGVuYW1lIFQxMCA9IGNoYXI+Cit1bmlvbiBTaXplckltcGwgeworICBjaGFyIGFycjFbc2l6ZW9mKFQxKV0sIGFycjJbc2l6ZW9mKFQyKV0sIGFycjNbc2l6ZW9mKFQzKV0sIGFycjRbc2l6ZW9mKFQ0KV0sCisgICAgICAgYXJyNVtzaXplb2YoVDUpXSwgYXJyNltzaXplb2YoVDYpXSwgYXJyN1tzaXplb2YoVDcpXSwgYXJyOFtzaXplb2YoVDgpXSwKKyAgICAgICBhcnI5W3NpemVvZihUOSldLCBhcnIxMFtzaXplb2YoVDEwKV07Cit9OworfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAorCisvLy8gXGJyaWVmIFRoaXMgdW5pb24gdGVtcGxhdGUgZXhwb3NlcyBhIHN1aXRhYmx5IGFsaWduZWQgYW5kIHNpemVkIGNoYXJhY3RlcgorLy8vIGFycmF5IG1lbWJlciB3aGljaCBjYW4gaG9sZCBlbGVtZW50cyBvZiBhbnkgb2YgdXAgdG8gdGVuIHR5cGVzLgorLy8vCisvLy8gVGhlc2UgdHlwZXMgbWF5IGJlIGFycmF5cywgc3RydWN0cywgb3IgYW55IG90aGVyIHR5cGVzLiBUaGUgZ29hbCBpcyB0bworLy8vIGV4cG9zZSBhIGNoYXIgYXJyYXkgYnVmZmVyIG1lbWJlciB3aGljaCBjYW4gYmUgdXNlZCBhcyBzdWl0YWJsZSBzdG9yYWdlIGZvcgorLy8vIGEgcGxhY2VtZW50IG5ldyBvZiBhbnkgb2YgdGhlc2UgdHlwZXMuIFN1cHBvcnQgZm9yIG1vcmUgdGhhbiB0ZW4gdHlwZXMgY2FuCisvLy8gYmUgYWRkZWQgYXQgdGhlIGNvc3Qgb2YgbW9yZSBib2lsZXJwbGF0ZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUMSwKKyAgICAgICAgICB0eXBlbmFtZSBUMiA9IGNoYXIsIHR5cGVuYW1lIFQzID0gY2hhciwgdHlwZW5hbWUgVDQgPSBjaGFyLAorICAgICAgICAgIHR5cGVuYW1lIFQ1ID0gY2hhciwgdHlwZW5hbWUgVDYgPSBjaGFyLCB0eXBlbmFtZSBUNyA9IGNoYXIsCisgICAgICAgICAgdHlwZW5hbWUgVDggPSBjaGFyLCB0eXBlbmFtZSBUOSA9IGNoYXIsIHR5cGVuYW1lIFQxMCA9IGNoYXI+CitzdHJ1Y3QgQWxpZ25lZENoYXJBcnJheVVuaW9uIDogbGx2bTo6QWxpZ25lZENoYXJBcnJheTwKKyAgICBhbGlnbm9mKGxsdm06OmRldGFpbDo6QWxpZ25lckltcGw8VDEsIFQyLCBUMywgVDQsIFQ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUNiwgVDcsIFQ4LCBUOSwgVDEwPiksCisgICAgc2l6ZW9mKDo6bGx2bTo6ZGV0YWlsOjpTaXplckltcGw8VDEsIFQyLCBUMywgVDQsIFQ1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQ2LCBUNywgVDgsIFQ5LCBUMTA+KT4geworfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfQUxJR05PRl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkNDEwOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaApAQCAtMCwwICsxLDQ5NCBAQAorLy89PT0tIEFsbG9jYXRvci5oIC0gU2ltcGxlIG1lbW9yeSBhbGxvY2F0aW9uIGFic3RyYWN0aW9uIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vCisvLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIE1hbGxvY0FsbG9jYXRvciBhbmQgQnVtcFB0ckFsbG9jYXRvciBpbnRlcmZhY2VzLiBCb3RoCisvLy8gb2YgdGhlc2UgY29uZm9ybSB0byBhbiBMTFZNICJBbGxvY2F0b3IiIGNvbmNlcHQgd2hpY2ggY29uc2lzdHMgb2YgYW4KKy8vLyBBbGxvY2F0ZSBtZXRob2QgYWNjZXB0aW5nIGEgc2l6ZSBhbmQgYWxpZ25tZW50LCBhbmQgYSBEZWFsbG9jYXRlIGFjY2VwdGluZworLy8vIGEgcG9pbnRlciBhbmQgc2l6ZS4gRnVydGhlciwgdGhlIExMVk0gIkFsbG9jYXRvciIgY29uY2VwdCBoYXMgb3ZlcmxvYWRzIG9mCisvLy8gQWxsb2NhdGUgYW5kIERlYWxsb2NhdGUgZm9yIHNldHRpbmcgc2l6ZSBhbmQgYWxpZ25tZW50IGJhc2VkIG9uIHRoZSBmaW5hbAorLy8vIHR5cGUuIFRoZXNlIG92ZXJsb2FkcyBhcmUgdHlwaWNhbGx5IHByb3ZpZGVkIGJ5IGEgYmFzZSBjbGFzcyB0ZW1wbGF0ZSBcYworLy8vIEFsbG9jYXRvckJhc2UuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0FMTE9DQVRPUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9BTExPQ0FUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gXGJyaWVmIENSVFAgYmFzZSBjbGFzcyBwcm92aWRpbmcgb2J2aW91cyBvdmVybG9hZHMgZm9yIHRoZSBjb3JlIFxjCisvLy8gQWxsb2NhdGUoKSBtZXRob2RzIG9mIExMVk0tc3R5bGUgYWxsb2NhdG9ycy4KKy8vLworLy8vIFRoaXMgYmFzZSBjbGFzcyBib3RoIGRvY3VtZW50cyB0aGUgZnVsbCBwdWJsaWMgaW50ZXJmYWNlIGV4cG9zZWQgYnkgYWxsCisvLy8gTExWTS1zdHlsZSBhbGxvY2F0b3JzLCBhbmQgcmVkaXJlY3RzIGFsbCBvZiB0aGUgb3ZlcmxvYWRzIHRvIGEgc2luZ2xlIGNvcmUKKy8vLyBzZXQgb2YgbWV0aG9kcyB3aGljaCB0aGUgZGVyaXZlZCBjbGFzcyBtdXN0IGRlZmluZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXJpdmVkVD4gY2xhc3MgQWxsb2NhdG9yQmFzZSB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgQWxsb2NhdGUgXGEgU2l6ZSBieXRlcyBvZiBcYSBBbGlnbm1lbnQgYWxpZ25lZCBtZW1vcnkuIFRoaXMgbWV0aG9kCisgIC8vLyBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IFxjIERlcml2ZWRULgorICB2b2lkICpBbGxvY2F0ZShzaXplX3QgU2l6ZSwgc2l6ZV90IEFsaWdubWVudCkgeworI2lmZGVmIF9fY2xhbmdfXworICAgIHN0YXRpY19hc3NlcnQoc3RhdGljX2Nhc3Q8dm9pZCAqKEFsbG9jYXRvckJhc2U6OiopKHNpemVfdCwgc2l6ZV90KT4oCisgICAgICAgICAgICAgICAgICAgICAgJkFsbG9jYXRvckJhc2U6OkFsbG9jYXRlKSAhPQorICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHZvaWQgKihEZXJpdmVkVDo6Kikoc2l6ZV90LCBzaXplX3QpPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJkRlcml2ZWRUOjpBbGxvY2F0ZSksCisgICAgICAgICAgICAgICAgICAiQ2xhc3MgZGVyaXZlcyBmcm9tIEFsbG9jYXRvckJhc2Ugd2l0aG91dCBpbXBsZW1lbnRpbmcgdGhlICIKKyAgICAgICAgICAgICAgICAgICJjb3JlIEFsbG9jYXRlKHNpemVfdCwgc2l6ZV90KSBvdmVybG9hZCEiKTsKKyNlbmRpZgorICAgIHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkVCAqPih0aGlzKS0+QWxsb2NhdGUoU2l6ZSwgQWxpZ25tZW50KTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGVhbGxvY2F0ZSBcYSBQdHIgdG8gXGEgU2l6ZSBieXRlcyBvZiBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoaXMKKyAgLy8vIGFsbG9jYXRvci4KKyAgdm9pZCBEZWFsbG9jYXRlKGNvbnN0IHZvaWQgKlB0ciwgc2l6ZV90IFNpemUpIHsKKyNpZmRlZiBfX2NsYW5nX18KKyAgICBzdGF0aWNfYXNzZXJ0KHN0YXRpY19jYXN0PHZvaWQgKEFsbG9jYXRvckJhc2U6OiopKGNvbnN0IHZvaWQgKiwgc2l6ZV90KT4oCisgICAgICAgICAgICAgICAgICAgICAgJkFsbG9jYXRvckJhc2U6OkRlYWxsb2NhdGUpICE9CisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZCAoRGVyaXZlZFQ6OiopKGNvbnN0IHZvaWQgKiwgc2l6ZV90KT4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICZEZXJpdmVkVDo6RGVhbGxvY2F0ZSksCisgICAgICAgICAgICAgICAgICAiQ2xhc3MgZGVyaXZlcyBmcm9tIEFsbG9jYXRvckJhc2Ugd2l0aG91dCBpbXBsZW1lbnRpbmcgdGhlICIKKyAgICAgICAgICAgICAgICAgICJjb3JlIERlYWxsb2NhdGUodm9pZCAqKSBvdmVybG9hZCEiKTsKKyNlbmRpZgorICAgIHJldHVybiBzdGF0aWNfY2FzdDxEZXJpdmVkVCAqPih0aGlzKS0+RGVhbGxvY2F0ZShQdHIsIFNpemUpOworICB9CisKKyAgLy8gVGhlIHJlc3Qgb2YgdGhlc2UgbWV0aG9kcyBhcmUgaGVscGVycyB0aGF0IHJlZGlyZWN0IHRvIG9uZSBvZiB0aGUgYWJvdmUKKyAgLy8gY29yZSBtZXRob2RzLgorCisgIC8vLyBcYnJpZWYgQWxsb2NhdGUgc3BhY2UgZm9yIGEgc2VxdWVuY2Ugb2Ygb2JqZWN0cyB3aXRob3V0IGNvbnN0cnVjdGluZyB0aGVtLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCAqQWxsb2NhdGUoc2l6ZV90IE51bSA9IDEpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCAqPihBbGxvY2F0ZShOdW0gKiBzaXplb2YoVCksIGFsaWdub2YoVCkpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRGVhbGxvY2F0ZSBzcGFjZSBmb3IgYSBzZXF1ZW5jZSBvZiBvYmplY3RzIHdpdGhvdXQgY29uc3RydWN0aW5nIHRoZW0uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICFzdGQ6OmlzX3NhbWU8dHlwZW5hbWUgc3RkOjpyZW1vdmVfY3Y8VD46OnR5cGUsIHZvaWQ+Ojp2YWx1ZSwgdm9pZD46OnR5cGUKKyAgRGVhbGxvY2F0ZShUICpQdHIsIHNpemVfdCBOdW0gPSAxKSB7CisgICAgRGVhbGxvY2F0ZShzdGF0aWNfY2FzdDxjb25zdCB2b2lkICo+KFB0ciksIE51bSAqIHNpemVvZihUKSk7CisgIH0KK307CisKK2NsYXNzIE1hbGxvY0FsbG9jYXRvciA6IHB1YmxpYyBBbGxvY2F0b3JCYXNlPE1hbGxvY0FsbG9jYXRvcj4geworcHVibGljOgorICB2b2lkIFJlc2V0KCkge30KKworICBMTFZNX0FUVFJJQlVURV9SRVRVUk5TX05PTk5VTEwgdm9pZCAqQWxsb2NhdGUoc2l6ZV90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgLypBbGlnbm1lbnQqLykgeworICAgIHZvaWQqIG1lbVB0ciA9ICBtYWxsb2MoU2l6ZSk7CisgICAgaWYgKG1lbVB0ciA9PSBudWxscHRyKSAKKyAgICAgIHJlcG9ydF9iYWRfYWxsb2NfZXJyb3IoIkFsbG9jYXRpb24gaW4gTWFsbG9jQWxsb2NhdG9yIGZhaWxlZC4iKTsKKworICAgIHJldHVybiBtZW1QdHI7CisgIH0KKworICAvLyBQdWxsIGluIGJhc2UgY2xhc3Mgb3ZlcmxvYWRzLgorICB1c2luZyBBbGxvY2F0b3JCYXNlPE1hbGxvY0FsbG9jYXRvcj46OkFsbG9jYXRlOworCisgIHZvaWQgRGVhbGxvY2F0ZShjb25zdCB2b2lkICpQdHIsIHNpemVfdCAvKlNpemUqLykgeworICAgIGZyZWUoY29uc3RfY2FzdDx2b2lkICo+KFB0cikpOworICB9CisKKyAgLy8gUHVsbCBpbiBiYXNlIGNsYXNzIG92ZXJsb2Fkcy4KKyAgdXNpbmcgQWxsb2NhdG9yQmFzZTxNYWxsb2NBbGxvY2F0b3I+OjpEZWFsbG9jYXRlOworCisgIHZvaWQgUHJpbnRTdGF0cygpIGNvbnN0IHt9Cit9OworCituYW1lc3BhY2UgZGV0YWlsIHsKKworLy8gV2UgY2FsbCBvdXQgdG8gYW4gZXh0ZXJuYWwgZnVuY3Rpb24gdG8gYWN0dWFsbHkgcHJpbnQgdGhlIG1lc3NhZ2UgYXMgdGhlCisvLyBwcmludGluZyBjb2RlIHVzZXMgQWxsb2NhdG9yLmggaW4gaXRzIGltcGxlbWVudGF0aW9uLgordm9pZCBwcmludEJ1bXBQdHJBbGxvY2F0b3JTdGF0cyh1bnNpZ25lZCBOdW1TbGFicywgc2l6ZV90IEJ5dGVzQWxsb2NhdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgVG90YWxNZW1vcnkpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgZGV0YWlsCisKKy8vLyBcYnJpZWYgQWxsb2NhdGUgbWVtb3J5IGluIGFuIGV2ZXIgZ3Jvd2luZyBwb29sLCBhcyBpZiBieSBidW1wLXBvaW50ZXIuCisvLy8KKy8vLyBUaGlzIGlzbid0IHN0cmljdGx5IGEgYnVtcC1wb2ludGVyIGFsbG9jYXRvciBhcyBpdCB1c2VzIGJhY2tpbmcgc2xhYnMgb2YKKy8vLyBtZW1vcnkgcmF0aGVyIHRoYW4gcmVseWluZyBvbiBhIGJvdW5kbGVzcyBjb250aWd1b3VzIGhlYXAuIEhvd2V2ZXIsIGl0IGhhcworLy8vIGJ1bXAtcG9pbnRlciBzZW1hbnRpY3MgaW4gdGhhdCBpdCBpcyBhIG1vbm90b25pY2FsbHkgZ3Jvd2luZyBwb29sIG9mIG1lbW9yeQorLy8vIHdoZXJlIGV2ZXJ5IGFsbG9jYXRpb24gaXMgZm91bmQgYnkgbWVyZWx5IGFsbG9jYXRpbmcgdGhlIG5leHQgTiBieXRlcyBpbgorLy8vIHRoZSBzbGFiLCBvciB0aGUgbmV4dCBOIGJ5dGVzIGluIHRoZSBuZXh0IHNsYWIuCisvLy8KKy8vLyBOb3RlIHRoYXQgdGhpcyBhbHNvIGhhcyBhIHRocmVzaG9sZCBmb3IgZm9yY2luZyBhbGxvY2F0aW9ucyBhYm92ZSBhIGNlcnRhaW4KKy8vLyBzaXplIGludG8gdGhlaXIgb3duIHNsYWIuCisvLy8KKy8vLyBUaGUgQnVtcFB0ckFsbG9jYXRvckltcGwgdGVtcGxhdGUgZGVmYXVsdHMgdG8gdXNpbmcgYSBNYWxsb2NBbGxvY2F0b3IKKy8vLyBvYmplY3QsIHdoaWNoIHdyYXBzIG1hbGxvYywgdG8gYWxsb2NhdGUgbWVtb3J5LCBidXQgaXQgY2FuIGJlIGNoYW5nZWQgdG8KKy8vLyB1c2UgYSBjdXN0b20gYWxsb2NhdG9yLgordGVtcGxhdGUgPHR5cGVuYW1lIEFsbG9jYXRvclQgPSBNYWxsb2NBbGxvY2F0b3IsIHNpemVfdCBTbGFiU2l6ZSA9IDQwOTYsCisgICAgICAgICAgc2l6ZV90IFNpemVUaHJlc2hvbGQgPSBTbGFiU2l6ZT4KK2NsYXNzIEJ1bXBQdHJBbGxvY2F0b3JJbXBsCisgICAgOiBwdWJsaWMgQWxsb2NhdG9yQmFzZTwKKyAgICAgICAgICBCdW1wUHRyQWxsb2NhdG9ySW1wbDxBbGxvY2F0b3JULCBTbGFiU2l6ZSwgU2l6ZVRocmVzaG9sZD4+IHsKK3B1YmxpYzoKKyAgc3RhdGljX2Fzc2VydChTaXplVGhyZXNob2xkIDw9IFNsYWJTaXplLAorICAgICAgICAgICAgICAgICJUaGUgU2l6ZVRocmVzaG9sZCBtdXN0IGJlIGF0IG1vc3QgdGhlIFNsYWJTaXplIHRvIGVuc3VyZSAiCisgICAgICAgICAgICAgICAgInRoYXQgb2JqZWN0cyBsYXJnZXIgdGhhbiBhIHNsYWIgZ28gaW50byB0aGVpciBvd24gbWVtb3J5ICIKKyAgICAgICAgICAgICAgICAiYWxsb2NhdGlvbi4iKTsKKworICBCdW1wUHRyQWxsb2NhdG9ySW1wbCgpID0gZGVmYXVsdDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgQnVtcFB0ckFsbG9jYXRvckltcGwoVCAmJkFsbG9jYXRvcikKKyAgICAgIDogQWxsb2NhdG9yKHN0ZDo6Zm9yd2FyZDxUICYmPihBbGxvY2F0b3IpKSB7fQorCisgIC8vIE1hbnVhbGx5IGltcGxlbWVudCBhIG1vdmUgY29uc3RydWN0b3IgYXMgd2UgbXVzdCBjbGVhciB0aGUgb2xkIGFsbG9jYXRvcidzCisgIC8vIHNsYWJzIGFzIGEgbWF0dGVyIG9mIGNvcnJlY3RuZXNzLgorICBCdW1wUHRyQWxsb2NhdG9ySW1wbChCdW1wUHRyQWxsb2NhdG9ySW1wbCAmJk9sZCkKKyAgICAgIDogQ3VyUHRyKE9sZC5DdXJQdHIpLCBFbmQoT2xkLkVuZCksIFNsYWJzKHN0ZDo6bW92ZShPbGQuU2xhYnMpKSwKKyAgICAgICAgQ3VzdG9tU2l6ZWRTbGFicyhzdGQ6Om1vdmUoT2xkLkN1c3RvbVNpemVkU2xhYnMpKSwKKyAgICAgICAgQnl0ZXNBbGxvY2F0ZWQoT2xkLkJ5dGVzQWxsb2NhdGVkKSwgUmVkWm9uZVNpemUoT2xkLlJlZFpvbmVTaXplKSwKKyAgICAgICAgQWxsb2NhdG9yKHN0ZDo6bW92ZShPbGQuQWxsb2NhdG9yKSkgeworICAgIE9sZC5DdXJQdHIgPSBPbGQuRW5kID0gbnVsbHB0cjsKKyAgICBPbGQuQnl0ZXNBbGxvY2F0ZWQgPSAwOworICAgIE9sZC5TbGFicy5jbGVhcigpOworICAgIE9sZC5DdXN0b21TaXplZFNsYWJzLmNsZWFyKCk7CisgIH0KKworICB+QnVtcFB0ckFsbG9jYXRvckltcGwoKSB7CisgICAgRGVhbGxvY2F0ZVNsYWJzKFNsYWJzLmJlZ2luKCksIFNsYWJzLmVuZCgpKTsKKyAgICBEZWFsbG9jYXRlQ3VzdG9tU2l6ZWRTbGFicygpOworICB9CisKKyAgQnVtcFB0ckFsbG9jYXRvckltcGwgJm9wZXJhdG9yPShCdW1wUHRyQWxsb2NhdG9ySW1wbCAmJlJIUykgeworICAgIERlYWxsb2NhdGVTbGFicyhTbGFicy5iZWdpbigpLCBTbGFicy5lbmQoKSk7CisgICAgRGVhbGxvY2F0ZUN1c3RvbVNpemVkU2xhYnMoKTsKKworICAgIEN1clB0ciA9IFJIUy5DdXJQdHI7CisgICAgRW5kID0gUkhTLkVuZDsKKyAgICBCeXRlc0FsbG9jYXRlZCA9IFJIUy5CeXRlc0FsbG9jYXRlZDsKKyAgICBSZWRab25lU2l6ZSA9IFJIUy5SZWRab25lU2l6ZTsKKyAgICBTbGFicyA9IHN0ZDo6bW92ZShSSFMuU2xhYnMpOworICAgIEN1c3RvbVNpemVkU2xhYnMgPSBzdGQ6Om1vdmUoUkhTLkN1c3RvbVNpemVkU2xhYnMpOworICAgIEFsbG9jYXRvciA9IHN0ZDo6bW92ZShSSFMuQWxsb2NhdG9yKTsKKworICAgIFJIUy5DdXJQdHIgPSBSSFMuRW5kID0gbnVsbHB0cjsKKyAgICBSSFMuQnl0ZXNBbGxvY2F0ZWQgPSAwOworICAgIFJIUy5TbGFicy5jbGVhcigpOworICAgIFJIUy5DdXN0b21TaXplZFNsYWJzLmNsZWFyKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8vIFxicmllZiBEZWFsbG9jYXRlIGFsbCBidXQgdGhlIGN1cnJlbnQgc2xhYiBhbmQgcmVzZXQgdGhlIGN1cnJlbnQgcG9pbnRlcgorICAvLy8gdG8gdGhlIGJlZ2lubmluZyBvZiBpdCwgZnJlZWluZyBhbGwgbWVtb3J5IGFsbG9jYXRlZCBzbyBmYXIuCisgIHZvaWQgUmVzZXQoKSB7CisgICAgLy8gRGVhbGxvY2F0ZSBhbGwgYnV0IHRoZSBmaXJzdCBzbGFiLCBhbmQgZGVhbGxvY2F0ZSBhbGwgY3VzdG9tLXNpemVkIHNsYWJzLgorICAgIERlYWxsb2NhdGVDdXN0b21TaXplZFNsYWJzKCk7CisgICAgQ3VzdG9tU2l6ZWRTbGFicy5jbGVhcigpOworCisgICAgaWYgKFNsYWJzLmVtcHR5KCkpCisgICAgICByZXR1cm47CisKKyAgICAvLyBSZXNldCB0aGUgc3RhdGUuCisgICAgQnl0ZXNBbGxvY2F0ZWQgPSAwOworICAgIEN1clB0ciA9IChjaGFyICopU2xhYnMuZnJvbnQoKTsKKyAgICBFbmQgPSBDdXJQdHIgKyBTbGFiU2l6ZTsKKworICAgIF9fYXNhbl9wb2lzb25fbWVtb3J5X3JlZ2lvbigqU2xhYnMuYmVnaW4oKSwgY29tcHV0ZVNsYWJTaXplKDApKTsKKyAgICBEZWFsbG9jYXRlU2xhYnMoc3RkOjpuZXh0KFNsYWJzLmJlZ2luKCkpLCBTbGFicy5lbmQoKSk7CisgICAgU2xhYnMuZXJhc2Uoc3RkOjpuZXh0KFNsYWJzLmJlZ2luKCkpLCBTbGFicy5lbmQoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIEFsbG9jYXRlIHNwYWNlIGF0IHRoZSBzcGVjaWZpZWQgYWxpZ25tZW50LgorICBMTFZNX0FUVFJJQlVURV9SRVRVUk5TX05PTk5VTEwgTExWTV9BVFRSSUJVVEVfUkVUVVJOU19OT0FMSUFTIHZvaWQgKgorICBBbGxvY2F0ZShzaXplX3QgU2l6ZSwgc2l6ZV90IEFsaWdubWVudCkgeworICAgIGFzc2VydChBbGlnbm1lbnQgPiAwICYmICIwLWJ5dGUgYWxpZ25ubWVudCBpcyBub3QgYWxsb3dlZC4gVXNlIDEgaW5zdGVhZC4iKTsKKworICAgIC8vIEtlZXAgdHJhY2sgb2YgaG93IG1hbnkgYnl0ZXMgd2UndmUgYWxsb2NhdGVkLgorICAgIEJ5dGVzQWxsb2NhdGVkICs9IFNpemU7CisKKyAgICBzaXplX3QgQWRqdXN0bWVudCA9IGFsaWdubWVudEFkanVzdG1lbnQoQ3VyUHRyLCBBbGlnbm1lbnQpOworICAgIGFzc2VydChBZGp1c3RtZW50ICsgU2l6ZSA+PSBTaXplICYmICJBZGp1c3RtZW50ICsgU2l6ZSBtdXN0IG5vdCBvdmVyZmxvdyIpOworCisgICAgc2l6ZV90IFNpemVUb0FsbG9jYXRlID0gU2l6ZTsKKyNpZiBMTFZNX0FERFJFU1NfU0FOSVRJWkVSX0JVSUxECisgICAgLy8gQWRkIHRyYWlsaW5nIGJ5dGVzIGFzIGEgInJlZCB6b25lIiB1bmRlciBBU2FuLgorICAgIFNpemVUb0FsbG9jYXRlICs9IFJlZFpvbmVTaXplOworI2VuZGlmCisKKyAgICAvLyBDaGVjayBpZiB3ZSBoYXZlIGVub3VnaCBzcGFjZS4KKyAgICBpZiAoQWRqdXN0bWVudCArIFNpemVUb0FsbG9jYXRlIDw9IHNpemVfdChFbmQgLSBDdXJQdHIpKSB7CisgICAgICBjaGFyICpBbGlnbmVkUHRyID0gQ3VyUHRyICsgQWRqdXN0bWVudDsKKyAgICAgIEN1clB0ciA9IEFsaWduZWRQdHIgKyBTaXplVG9BbGxvY2F0ZTsKKyAgICAgIC8vIFVwZGF0ZSB0aGUgYWxsb2NhdGlvbiBwb2ludCBvZiB0aGlzIG1lbW9yeSBibG9jayBpbiBNZW1vcnlTYW5pdGl6ZXIuCisgICAgICAvLyBXaXRob3V0IHRoaXMsIE1lbW9yeVNhbml0aXplciBtZXNzYWdlcyBmb3IgdmFsdWVzIG9yaWdpbmF0ZWQgZnJvbSBoZXJlCisgICAgICAvLyB3aWxsIHBvaW50IHRvIHRoZSBhbGxvY2F0aW9uIG9mIHRoZSBlbnRpcmUgc2xhYi4KKyAgICAgIF9fbXNhbl9hbGxvY2F0ZWRfbWVtb3J5KEFsaWduZWRQdHIsIFNpemUpOworICAgICAgLy8gU2ltaWxhcmx5LCB0ZWxsIEFTYW4gYWJvdXQgdGhpcyBzcGFjZS4KKyAgICAgIF9fYXNhbl91bnBvaXNvbl9tZW1vcnlfcmVnaW9uKEFsaWduZWRQdHIsIFNpemUpOworICAgICAgcmV0dXJuIEFsaWduZWRQdHI7CisgICAgfQorCisgICAgLy8gSWYgU2l6ZSBpcyByZWFsbHkgYmlnLCBhbGxvY2F0ZSBhIHNlcGFyYXRlIHNsYWIgZm9yIGl0LgorICAgIHNpemVfdCBQYWRkZWRTaXplID0gU2l6ZVRvQWxsb2NhdGUgKyBBbGlnbm1lbnQgLSAxOworICAgIGlmIChQYWRkZWRTaXplID4gU2l6ZVRocmVzaG9sZCkgeworICAgICAgdm9pZCAqTmV3U2xhYiA9IEFsbG9jYXRvci5BbGxvY2F0ZShQYWRkZWRTaXplLCAwKTsKKyAgICAgIC8vIFdlIG93biB0aGUgbmV3IHNsYWIgYW5kIGRvbid0IHdhbnQgYW55b25lIHJlYWRpbmcgYW55dGluZyBvdGhlciB0aGFuCisgICAgICAvLyBwaWVjZXMgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZC4gIFNvIHBvaXNvbiB0aGUgd2hvbGUgc2xhYi4KKyAgICAgIF9fYXNhbl9wb2lzb25fbWVtb3J5X3JlZ2lvbihOZXdTbGFiLCBQYWRkZWRTaXplKTsKKyAgICAgIEN1c3RvbVNpemVkU2xhYnMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKE5ld1NsYWIsIFBhZGRlZFNpemUpKTsKKworICAgICAgdWludHB0cl90IEFsaWduZWRBZGRyID0gYWxpZ25BZGRyKE5ld1NsYWIsIEFsaWdubWVudCk7CisgICAgICBhc3NlcnQoQWxpZ25lZEFkZHIgKyBTaXplIDw9ICh1aW50cHRyX3QpTmV3U2xhYiArIFBhZGRlZFNpemUpOworICAgICAgY2hhciAqQWxpZ25lZFB0ciA9IChjaGFyKilBbGlnbmVkQWRkcjsKKyAgICAgIF9fbXNhbl9hbGxvY2F0ZWRfbWVtb3J5KEFsaWduZWRQdHIsIFNpemUpOworICAgICAgX19hc2FuX3VucG9pc29uX21lbW9yeV9yZWdpb24oQWxpZ25lZFB0ciwgU2l6ZSk7CisgICAgICByZXR1cm4gQWxpZ25lZFB0cjsKKyAgICB9CisKKyAgICAvLyBPdGhlcndpc2UsIHN0YXJ0IGEgbmV3IHNsYWIgYW5kIHRyeSBhZ2Fpbi4KKyAgICBTdGFydE5ld1NsYWIoKTsKKyAgICB1aW50cHRyX3QgQWxpZ25lZEFkZHIgPSBhbGlnbkFkZHIoQ3VyUHRyLCBBbGlnbm1lbnQpOworICAgIGFzc2VydChBbGlnbmVkQWRkciArIFNpemVUb0FsbG9jYXRlIDw9ICh1aW50cHRyX3QpRW5kICYmCisgICAgICAgICAgICJVbmFibGUgdG8gYWxsb2NhdGUgbWVtb3J5ISIpOworICAgIGNoYXIgKkFsaWduZWRQdHIgPSAoY2hhciopQWxpZ25lZEFkZHI7CisgICAgQ3VyUHRyID0gQWxpZ25lZFB0ciArIFNpemVUb0FsbG9jYXRlOworICAgIF9fbXNhbl9hbGxvY2F0ZWRfbWVtb3J5KEFsaWduZWRQdHIsIFNpemUpOworICAgIF9fYXNhbl91bnBvaXNvbl9tZW1vcnlfcmVnaW9uKEFsaWduZWRQdHIsIFNpemUpOworICAgIHJldHVybiBBbGlnbmVkUHRyOworICB9CisKKyAgLy8gUHVsbCBpbiBiYXNlIGNsYXNzIG92ZXJsb2Fkcy4KKyAgdXNpbmcgQWxsb2NhdG9yQmFzZTxCdW1wUHRyQWxsb2NhdG9ySW1wbD46OkFsbG9jYXRlOworCisgIC8vIEJ1bXAgcG9pbnRlciBhbGxvY2F0b3JzIGFyZSBleHBlY3RlZCB0byBuZXZlciBmcmVlIHRoZWlyIHN0b3JhZ2U7IGFuZAorICAvLyBjbGllbnRzIGV4cGVjdCBwb2ludGVycyB0byByZW1haW4gdmFsaWQgZm9yIG5vbi1kZXJlZmVyZW5jaW5nIHVzZXMgZXZlbgorICAvLyBhZnRlciBkZWFsbG9jYXRpb24uCisgIHZvaWQgRGVhbGxvY2F0ZShjb25zdCB2b2lkICpQdHIsIHNpemVfdCBTaXplKSB7CisgICAgX19hc2FuX3BvaXNvbl9tZW1vcnlfcmVnaW9uKFB0ciwgU2l6ZSk7CisgIH0KKworICAvLyBQdWxsIGluIGJhc2UgY2xhc3Mgb3ZlcmxvYWRzLgorICB1c2luZyBBbGxvY2F0b3JCYXNlPEJ1bXBQdHJBbGxvY2F0b3JJbXBsPjo6RGVhbGxvY2F0ZTsKKworICBzaXplX3QgR2V0TnVtU2xhYnMoKSBjb25zdCB7IHJldHVybiBTbGFicy5zaXplKCkgKyBDdXN0b21TaXplZFNsYWJzLnNpemUoKTsgfQorCisgIHNpemVfdCBnZXRUb3RhbE1lbW9yeSgpIGNvbnN0IHsKKyAgICBzaXplX3QgVG90YWxNZW1vcnkgPSAwOworICAgIGZvciAoYXV0byBJID0gU2xhYnMuYmVnaW4oKSwgRSA9IFNsYWJzLmVuZCgpOyBJICE9IEU7ICsrSSkKKyAgICAgIFRvdGFsTWVtb3J5ICs9IGNvbXB1dGVTbGFiU2l6ZShzdGQ6OmRpc3RhbmNlKFNsYWJzLmJlZ2luKCksIEkpKTsKKyAgICBmb3IgKGF1dG8gJlB0ckFuZFNpemUgOiBDdXN0b21TaXplZFNsYWJzKQorICAgICAgVG90YWxNZW1vcnkgKz0gUHRyQW5kU2l6ZS5zZWNvbmQ7CisgICAgcmV0dXJuIFRvdGFsTWVtb3J5OworICB9CisKKyAgc2l6ZV90IGdldEJ5dGVzQWxsb2NhdGVkKCkgY29uc3QgeyByZXR1cm4gQnl0ZXNBbGxvY2F0ZWQ7IH0KKworICB2b2lkIHNldFJlZFpvbmVTaXplKHNpemVfdCBOZXdTaXplKSB7CisgICAgUmVkWm9uZVNpemUgPSBOZXdTaXplOworICB9CisKKyAgdm9pZCBQcmludFN0YXRzKCkgY29uc3QgeworICAgIGRldGFpbDo6cHJpbnRCdW1wUHRyQWxsb2NhdG9yU3RhdHMoU2xhYnMuc2l6ZSgpLCBCeXRlc0FsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRvdGFsTWVtb3J5KCkpOworICB9CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgVGhlIGN1cnJlbnQgcG9pbnRlciBpbnRvIHRoZSBjdXJyZW50IHNsYWIuCisgIC8vLworICAvLy8gVGhpcyBwb2ludHMgdG8gdGhlIG5leHQgZnJlZSBieXRlIGluIHRoZSBzbGFiLgorICBjaGFyICpDdXJQdHIgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlIGVuZCBvZiB0aGUgY3VycmVudCBzbGFiLgorICBjaGFyICpFbmQgPSBudWxscHRyOworCisgIC8vLyBcYnJpZWYgVGhlIHNsYWJzIGFsbG9jYXRlZCBzbyBmYXIuCisgIFNtYWxsVmVjdG9yPHZvaWQgKiwgND4gU2xhYnM7CisKKyAgLy8vIFxicmllZiBDdXN0b20tc2l6ZWQgc2xhYnMgYWxsb2NhdGVkIGZvciB0b28tbGFyZ2UgYWxsb2NhdGlvbiByZXF1ZXN0cy4KKyAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPHZvaWQgKiwgc2l6ZV90PiwgMD4gQ3VzdG9tU2l6ZWRTbGFiczsKKworICAvLy8gXGJyaWVmIEhvdyBtYW55IGJ5dGVzIHdlJ3ZlIGFsbG9jYXRlZC4KKyAgLy8vCisgIC8vLyBVc2VkIHNvIHRoYXQgd2UgY2FuIGNvbXB1dGUgaG93IG11Y2ggc3BhY2Ugd2FzIHdhc3RlZC4KKyAgc2l6ZV90IEJ5dGVzQWxsb2NhdGVkID0gMDsKKworICAvLy8gXGJyaWVmIFRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcHV0IGJldHdlZW4gYWxsb2NhdGlvbnMgd2hlbiBydW5uaW5nIHVuZGVyCisgIC8vLyBhIHNhbml0aXplci4KKyAgc2l6ZV90IFJlZFpvbmVTaXplID0gMTsKKworICAvLy8gXGJyaWVmIFRoZSBhbGxvY2F0b3IgaW5zdGFuY2Ugd2UgdXNlIHRvIGdldCBzbGFicyBvZiBtZW1vcnkuCisgIEFsbG9jYXRvclQgQWxsb2NhdG9yOworCisgIHN0YXRpYyBzaXplX3QgY29tcHV0ZVNsYWJTaXplKHVuc2lnbmVkIFNsYWJJZHgpIHsKKyAgICAvLyBTY2FsZSB0aGUgYWN0dWFsIGFsbG9jYXRlZCBzbGFiIHNpemUgYmFzZWQgb24gdGhlIG51bWJlciBvZiBzbGFicworICAgIC8vIGFsbG9jYXRlZC4gRXZlcnkgMTI4IHNsYWJzIGFsbG9jYXRlZCwgd2UgZG91YmxlIHRoZSBhbGxvY2F0ZWQgc2l6ZSB0bworICAgIC8vIHJlZHVjZSBhbGxvY2F0aW9uIGZyZXF1ZW5jeSwgYnV0IHNhdHVyYXRlIGF0IG11bHRpcGx5aW5nIHRoZSBzbGFiIHNpemUgYnkKKyAgICAvLyAyXjMwLgorICAgIHJldHVybiBTbGFiU2l6ZSAqICgoc2l6ZV90KTEgPDwgc3RkOjptaW48c2l6ZV90PigzMCwgU2xhYklkeCAvIDEyOCkpOworICB9CisKKyAgLy8vIFxicmllZiBBbGxvY2F0ZSBhIG5ldyBzbGFiIGFuZCBtb3ZlIHRoZSBidW1wIHBvaW50ZXJzIG92ZXIgaW50byB0aGUgbmV3CisgIC8vLyBzbGFiLCBtb2RpZnlpbmcgQ3VyUHRyIGFuZCBFbmQuCisgIHZvaWQgU3RhcnROZXdTbGFiKCkgeworICAgIHNpemVfdCBBbGxvY2F0ZWRTbGFiU2l6ZSA9IGNvbXB1dGVTbGFiU2l6ZShTbGFicy5zaXplKCkpOworCisgICAgdm9pZCAqTmV3U2xhYiA9IEFsbG9jYXRvci5BbGxvY2F0ZShBbGxvY2F0ZWRTbGFiU2l6ZSwgMCk7CisgICAgLy8gV2Ugb3duIHRoZSBuZXcgc2xhYiBhbmQgZG9uJ3Qgd2FudCBhbnlvbmUgcmVhZGluZyBhbnl0aGluZyBvdGhlciB0aGFuCisgICAgLy8gcGllY2VzIHJldHVybmVkIGZyb20gdGhpcyBtZXRob2QuICBTbyBwb2lzb24gdGhlIHdob2xlIHNsYWIuCisgICAgX19hc2FuX3BvaXNvbl9tZW1vcnlfcmVnaW9uKE5ld1NsYWIsIEFsbG9jYXRlZFNsYWJTaXplKTsKKworICAgIFNsYWJzLnB1c2hfYmFjayhOZXdTbGFiKTsKKyAgICBDdXJQdHIgPSAoY2hhciAqKShOZXdTbGFiKTsKKyAgICBFbmQgPSAoKGNoYXIgKilOZXdTbGFiKSArIEFsbG9jYXRlZFNsYWJTaXplOworICB9CisKKyAgLy8vIFxicmllZiBEZWFsbG9jYXRlIGEgc2VxdWVuY2Ugb2Ygc2xhYnMuCisgIHZvaWQgRGVhbGxvY2F0ZVNsYWJzKFNtYWxsVmVjdG9ySW1wbDx2b2lkICo+OjppdGVyYXRvciBJLAorICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8dm9pZCAqPjo6aXRlcmF0b3IgRSkgeworICAgIGZvciAoOyBJICE9IEU7ICsrSSkgeworICAgICAgc2l6ZV90IEFsbG9jYXRlZFNsYWJTaXplID0KKyAgICAgICAgICBjb21wdXRlU2xhYlNpemUoc3RkOjpkaXN0YW5jZShTbGFicy5iZWdpbigpLCBJKSk7CisgICAgICBBbGxvY2F0b3IuRGVhbGxvY2F0ZSgqSSwgQWxsb2NhdGVkU2xhYlNpemUpOworICAgIH0KKyAgfQorCisgIC8vLyBcYnJpZWYgRGVhbGxvY2F0ZSBhbGwgbWVtb3J5IGZvciBjdXN0b20gc2l6ZWQgc2xhYnMuCisgIHZvaWQgRGVhbGxvY2F0ZUN1c3RvbVNpemVkU2xhYnMoKSB7CisgICAgZm9yIChhdXRvICZQdHJBbmRTaXplIDogQ3VzdG9tU2l6ZWRTbGFicykgeworICAgICAgdm9pZCAqUHRyID0gUHRyQW5kU2l6ZS5maXJzdDsKKyAgICAgIHNpemVfdCBTaXplID0gUHRyQW5kU2l6ZS5zZWNvbmQ7CisgICAgICBBbGxvY2F0b3IuRGVhbGxvY2F0ZShQdHIsIFNpemUpOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3MgU3BlY2lmaWNCdW1wUHRyQWxsb2NhdG9yOworfTsKKworLy8vIFxicmllZiBUaGUgc3RhbmRhcmQgQnVtcFB0ckFsbG9jYXRvciB3aGljaCBqdXN0IHVzZXMgdGhlIGRlZmF1bHQgdGVtcGxhdGUKKy8vLyBwYXJhbWV0ZXJzLgordHlwZWRlZiBCdW1wUHRyQWxsb2NhdG9ySW1wbDw+IEJ1bXBQdHJBbGxvY2F0b3I7CisKKy8vLyBcYnJpZWYgQSBCdW1wUHRyQWxsb2NhdG9yIHRoYXQgYWxsb3dzIG9ubHkgZWxlbWVudHMgb2YgYSBzcGVjaWZpYyB0eXBlIHRvIGJlCisvLy8gYWxsb2NhdGVkLgorLy8vCisvLy8gVGhpcyBhbGxvd3MgY2FsbGluZyB0aGUgZGVzdHJ1Y3RvciBpbiBEZXN0cm95QWxsKCkgYW5kIHdoZW4gdGhlIGFsbG9jYXRvciBpcworLy8vIGRlc3Ryb3llZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBTcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3IgeworICBCdW1wUHRyQWxsb2NhdG9yIEFsbG9jYXRvcjsKKworcHVibGljOgorICBTcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3IoKSB7CisgICAgLy8gQmVjYXVzZSBTcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3Igd2Fsa3MgdGhlIG1lbW9yeSB0byBjYWxsIGRlc3RydWN0b3JzLAorICAgIC8vIGl0IGNhbid0IGhhdmUgcmVkIHpvbmVzIGJldHdlZW4gYWxsb2NhdGlvbnMuCisgICAgQWxsb2NhdG9yLnNldFJlZFpvbmVTaXplKDApOworICB9CisgIFNwZWNpZmljQnVtcFB0ckFsbG9jYXRvcihTcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3IgJiZPbGQpCisgICAgICA6IEFsbG9jYXRvcihzdGQ6Om1vdmUoT2xkLkFsbG9jYXRvcikpIHt9CisgIH5TcGVjaWZpY0J1bXBQdHJBbGxvY2F0b3IoKSB7IERlc3Ryb3lBbGwoKTsgfQorCisgIFNwZWNpZmljQnVtcFB0ckFsbG9jYXRvciAmb3BlcmF0b3I9KFNwZWNpZmljQnVtcFB0ckFsbG9jYXRvciAmJlJIUykgeworICAgIEFsbG9jYXRvciA9IHN0ZDo6bW92ZShSSFMuQWxsb2NhdG9yKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gQ2FsbCB0aGUgZGVzdHJ1Y3RvciBvZiBlYWNoIGFsbG9jYXRlZCBvYmplY3QgYW5kIGRlYWxsb2NhdGUgYWxsIGJ1dCB0aGUKKyAgLy8vIGN1cnJlbnQgc2xhYiBhbmQgcmVzZXQgdGhlIGN1cnJlbnQgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGl0LCBmcmVlaW5nCisgIC8vLyBhbGwgbWVtb3J5IGFsbG9jYXRlZCBzbyBmYXIuCisgIHZvaWQgRGVzdHJveUFsbCgpIHsKKyAgICBhdXRvIERlc3Ryb3lFbGVtZW50cyA9IFtdKGNoYXIgKkJlZ2luLCBjaGFyICpFbmQpIHsKKyAgICAgIGFzc2VydChCZWdpbiA9PSAoY2hhciAqKWFsaWduQWRkcihCZWdpbiwgYWxpZ25vZihUKSkpOworICAgICAgZm9yIChjaGFyICpQdHIgPSBCZWdpbjsgUHRyICsgc2l6ZW9mKFQpIDw9IEVuZDsgUHRyICs9IHNpemVvZihUKSkKKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxUICo+KFB0ciktPn5UKCk7CisgICAgfTsKKworICAgIGZvciAoYXV0byBJID0gQWxsb2NhdG9yLlNsYWJzLmJlZ2luKCksIEUgPSBBbGxvY2F0b3IuU2xhYnMuZW5kKCk7IEkgIT0gRTsKKyAgICAgICAgICsrSSkgeworICAgICAgc2l6ZV90IEFsbG9jYXRlZFNsYWJTaXplID0gQnVtcFB0ckFsbG9jYXRvcjo6Y29tcHV0ZVNsYWJTaXplKAorICAgICAgICAgIHN0ZDo6ZGlzdGFuY2UoQWxsb2NhdG9yLlNsYWJzLmJlZ2luKCksIEkpKTsKKyAgICAgIGNoYXIgKkJlZ2luID0gKGNoYXIgKilhbGlnbkFkZHIoKkksIGFsaWdub2YoVCkpOworICAgICAgY2hhciAqRW5kID0gKkkgPT0gQWxsb2NhdG9yLlNsYWJzLmJhY2soKSA/IEFsbG9jYXRvci5DdXJQdHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoY2hhciAqKSpJICsgQWxsb2NhdGVkU2xhYlNpemU7CisKKyAgICAgIERlc3Ryb3lFbGVtZW50cyhCZWdpbiwgRW5kKTsKKyAgICB9CisKKyAgICBmb3IgKGF1dG8gJlB0ckFuZFNpemUgOiBBbGxvY2F0b3IuQ3VzdG9tU2l6ZWRTbGFicykgeworICAgICAgdm9pZCAqUHRyID0gUHRyQW5kU2l6ZS5maXJzdDsKKyAgICAgIHNpemVfdCBTaXplID0gUHRyQW5kU2l6ZS5zZWNvbmQ7CisgICAgICBEZXN0cm95RWxlbWVudHMoKGNoYXIgKilhbGlnbkFkZHIoUHRyLCBhbGlnbm9mKFQpKSwgKGNoYXIgKilQdHIgKyBTaXplKTsKKyAgICB9CisKKyAgICBBbGxvY2F0b3IuUmVzZXQoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWxsb2NhdGUgc3BhY2UgZm9yIGFuIGFycmF5IG9mIG9iamVjdHMgd2l0aG91dCBjb25zdHJ1Y3RpbmcgdGhlbS4KKyAgVCAqQWxsb2NhdGUoc2l6ZV90IG51bSA9IDEpIHsgcmV0dXJuIEFsbG9jYXRvci5BbGxvY2F0ZTxUPihudW0pOyB9Cit9OworCisvLy8gXHsKKy8vLyBDb3VudGVycGFydHMgb2YgYWxsb2NhdGlvbiBmdW5jdGlvbnMgZGVmaW5lZCBpbiBuYW1lc3BhY2UgJ3N0ZCcsIHdoaWNoIGNyYXNoCisvLy8gb24gYWxsb2NhdGlvbiBmYWlsdXJlIGluc3RlYWQgb2YgcmV0dXJuaW5nIG51bGwgcG9pbnRlci4KKworTExWTV9BVFRSSUJVVEVfUkVUVVJOU19OT05OVUxMIGlubGluZSB2b2lkICpzYWZlX21hbGxvYyhzaXplX3QgU3opIHsKKyAgdm9pZCAqUmVzdWx0ID0gc3RkOjptYWxsb2MoU3opOworICBpZiAoUmVzdWx0ID09IG51bGxwdHIpCisgICAgcmVwb3J0X2JhZF9hbGxvY19lcnJvcigiQWxsb2NhdGlvbiBmYWlsZWQuIik7CisgIHJldHVybiBSZXN1bHQ7Cit9CisKK0xMVk1fQVRUUklCVVRFX1JFVFVSTlNfTk9OTlVMTCBpbmxpbmUgdm9pZCAqc2FmZV9jYWxsb2Moc2l6ZV90IENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgU3opIHsKKyAgdm9pZCAqUmVzdWx0ID0gc3RkOjpjYWxsb2MoQ291bnQsIFN6KTsKKyAgaWYgKFJlc3VsdCA9PSBudWxscHRyKQorICAgIHJlcG9ydF9iYWRfYWxsb2NfZXJyb3IoIkFsbG9jYXRpb24gZmFpbGVkLiIpOworICByZXR1cm4gUmVzdWx0OworfQorCitMTFZNX0FUVFJJQlVURV9SRVRVUk5TX05PTk5VTEwgaW5saW5lIHZvaWQgKnNhZmVfcmVhbGxvYyh2b2lkICpQdHIsIHNpemVfdCBTeikgeworICB2b2lkICpSZXN1bHQgPSBzdGQ6OnJlYWxsb2MoUHRyLCBTeik7CisgIGlmIChSZXN1bHQgPT0gbnVsbHB0cikKKyAgICByZXBvcnRfYmFkX2FsbG9jX2Vycm9yKCJBbGxvY2F0aW9uIGZhaWxlZC4iKTsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworLy8vIFx9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBBbGxvY2F0b3JULCBzaXplX3QgU2xhYlNpemUsIHNpemVfdCBTaXplVGhyZXNob2xkPgordm9pZCAqb3BlcmF0b3IgbmV3KHNpemVfdCBTaXplLAorICAgICAgICAgICAgICAgICAgIGxsdm06OkJ1bXBQdHJBbGxvY2F0b3JJbXBsPEFsbG9jYXRvclQsIFNsYWJTaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpemVUaHJlc2hvbGQ+ICZBbGxvY2F0b3IpIHsKKyAgc3RydWN0IFMgeworICAgIGNoYXIgYzsKKyAgICB1bmlvbiB7CisgICAgICBkb3VibGUgRDsKKyAgICAgIGxvbmcgZG91YmxlIExEOworICAgICAgbG9uZyBsb25nIEw7CisgICAgICB2b2lkICpQOworICAgIH0geDsKKyAgfTsKKyAgcmV0dXJuIEFsbG9jYXRvci5BbGxvY2F0ZSgKKyAgICAgIFNpemUsIHN0ZDo6bWluKChzaXplX3QpbGx2bTo6TmV4dFBvd2VyT2YyKFNpemUpLCBvZmZzZXRvZihTLCB4KSkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQWxsb2NhdG9yVCwgc2l6ZV90IFNsYWJTaXplLCBzaXplX3QgU2l6ZVRocmVzaG9sZD4KK3ZvaWQgb3BlcmF0b3IgZGVsZXRlKAorICAgIHZvaWQgKiwgbGx2bTo6QnVtcFB0ckFsbG9jYXRvckltcGw8QWxsb2NhdG9yVCwgU2xhYlNpemUsIFNpemVUaHJlc2hvbGQ+ICYpIHsKK30KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9BTExPQ0FUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0FycmF5UmVjeWNsZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BcnJheVJlY3ljbGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg2OTZiZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BcnJheVJlY3ljbGVyLmgKQEAgLTAsMCArMSwxNDUgQEAKKy8vPT0tIGxsdm0vU3VwcG9ydC9BcnJheVJlY3ljbGVyLmggLSBSZWN5Y2xpbmcgb2YgQXJyYXlzIC0tLS0tLS0tLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIEFycmF5UmVjeWNsZXIgY2xhc3MgdGVtcGxhdGUgd2hpY2ggY2FuIHJlY3ljbGUgc21hbGwKKy8vIGFycmF5cyBhbGxvY2F0ZWQgZnJvbSBvbmUgb2YgdGhlIGFsbG9jYXRvcnMgaW4gQWxsb2NhdG9yLmgKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9BUlJBWVJFQ1lDTEVSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0FSUkFZUkVDWUNMRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L01hdGhFeHRyYXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gUmVjeWNsZSBzbWFsbCBhcnJheXMgYWxsb2NhdGVkIGZyb20gYSBCdW1wUHRyQWxsb2NhdG9yLgorLy8vCisvLy8gQXJyYXlzIGFyZSBhbGxvY2F0ZWQgaW4gYSBzbWFsbCBudW1iZXIgb2YgZml4ZWQgc2l6ZXMuIEZvciBlYWNoIHN1cHBvcnRlZAorLy8vIGFycmF5IHNpemUsIHRoZSBBcnJheVJlY3ljbGVyIGtlZXBzIGEgZnJlZSBsaXN0IG9mIGF2YWlsYWJsZSBhcnJheXMuCisvLy8KK3RlbXBsYXRlIDxjbGFzcyBULCBzaXplX3QgQWxpZ24gPSBhbGlnbm9mKFQpPiBjbGFzcyBBcnJheVJlY3ljbGVyIHsKKyAgLy8gVGhlIGZyZWUgbGlzdCBmb3IgYSBnaXZlbiBhcnJheSBzaXplIGlzIGEgc2ltcGxlIHNpbmdseSBsaW5rZWQgbGlzdC4KKyAgLy8gV2UgY2FuJ3QgdXNlIGlwbGlzdCBvciBSZWN5Y2xlciBoZXJlIHNpbmNlIHRob3NlIGNsYXNzZXMgY2FuJ3QgYmUgY29waWVkLgorICBzdHJ1Y3QgRnJlZUxpc3QgeworICAgIEZyZWVMaXN0ICpOZXh0OworICB9OworCisgIHN0YXRpY19hc3NlcnQoQWxpZ24gPj0gYWxpZ25vZihGcmVlTGlzdCksICJPYmplY3QgdW5kZXJhbGlnbmVkIik7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKFQpID49IHNpemVvZihGcmVlTGlzdCksICJPYmplY3RzIGFyZSB0b28gc21hbGwiKTsKKworICAvLyBLZWVwIGEgZnJlZSBsaXN0IGZvciBlYWNoIGFycmF5IHNpemUuCisgIFNtYWxsVmVjdG9yPEZyZWVMaXN0KiwgOD4gQnVja2V0OworCisgIC8vIFJlbW92ZSBhbiBlbnRyeSBmcm9tIHRoZSBmcmVlIGxpc3QgaW4gQnVja2V0W0lkeF0gYW5kIHJldHVybiBpdC4KKyAgLy8gUmV0dXJuIE5VTEwgaWYgbm8gZW50cmllcyBhcmUgYXZhaWxhYmxlLgorICBUICpwb3AodW5zaWduZWQgSWR4KSB7CisgICAgaWYgKElkeCA+PSBCdWNrZXQuc2l6ZSgpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgRnJlZUxpc3QgKkVudHJ5ID0gQnVja2V0W0lkeF07CisgICAgaWYgKCFFbnRyeSkKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIF9fYXNhbl91bnBvaXNvbl9tZW1vcnlfcmVnaW9uKEVudHJ5LCBDYXBhY2l0eTo6Z2V0KElkeCkuZ2V0U2l6ZSgpKTsKKyAgICBCdWNrZXRbSWR4XSA9IEVudHJ5LT5OZXh0OworICAgIF9fbXNhbl9hbGxvY2F0ZWRfbWVtb3J5KEVudHJ5LCBDYXBhY2l0eTo6Z2V0KElkeCkuZ2V0U2l6ZSgpKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUKj4oRW50cnkpOworICB9CisKKyAgLy8gQWRkIGFuIGVudHJ5IHRvIHRoZSBmcmVlIGxpc3QgYXQgQnVja2V0W0lkeF0uCisgIHZvaWQgcHVzaCh1bnNpZ25lZCBJZHgsIFQgKlB0cikgeworICAgIGFzc2VydChQdHIgJiYgIkNhbm5vdCByZWN5Y2xlIE5VTEwgcG9pbnRlciIpOworICAgIEZyZWVMaXN0ICpFbnRyeSA9IHJlaW50ZXJwcmV0X2Nhc3Q8RnJlZUxpc3QqPihQdHIpOworICAgIGlmIChJZHggPj0gQnVja2V0LnNpemUoKSkKKyAgICAgIEJ1Y2tldC5yZXNpemUoc2l6ZV90KElkeCkgKyAxKTsKKyAgICBFbnRyeS0+TmV4dCA9IEJ1Y2tldFtJZHhdOworICAgIEJ1Y2tldFtJZHhdID0gRW50cnk7CisgICAgX19hc2FuX3BvaXNvbl9tZW1vcnlfcmVnaW9uKFB0ciwgQ2FwYWNpdHk6OmdldChJZHgpLmdldFNpemUoKSk7CisgIH0KKworcHVibGljOgorICAvLy8gVGhlIHNpemUgb2YgYW4gYWxsb2NhdGVkIGFycmF5IGlzIHJlcHJlc2VudGVkIGJ5IGEgQ2FwYWNpdHkgaW5zdGFuY2UuCisgIC8vLworICAvLy8gVGhpcyBjbGFzcyBpcyBtdWNoIHNtYWxsZXIgdGhhbiBhIHNpemVfdCwgYW5kIGl0IHByb3ZpZGVzIG1ldGhvZHMgdG8gd29yaworICAvLy8gd2l0aCB0aGUgc2V0IG9mIGxlZ2FsIGFycmF5IGNhcGFjaXRpZXMuCisgIGNsYXNzIENhcGFjaXR5IHsKKyAgICB1aW50OF90IEluZGV4OworICAgIGV4cGxpY2l0IENhcGFjaXR5KHVpbnQ4X3QgaWR4KSA6IEluZGV4KGlkeCkge30KKworICBwdWJsaWM6CisgICAgQ2FwYWNpdHkoKSA6IEluZGV4KDApIHt9CisKKyAgICAvLy8gR2V0IHRoZSBjYXBhY2l0eSBvZiBhbiBhcnJheSB0aGF0IGNhbiBob2xkIGF0IGxlYXN0IE4gZWxlbWVudHMuCisgICAgc3RhdGljIENhcGFjaXR5IGdldChzaXplX3QgTikgeworICAgICAgcmV0dXJuIENhcGFjaXR5KE4gPyBMb2cyXzY0X0NlaWwoTikgOiAwKTsKKyAgICB9CisKKyAgICAvLy8gR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYW4gYXJyYXkgd2l0aCB0aGlzIGNhcGFjaXR5LgorICAgIHNpemVfdCBnZXRTaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV90KDF1KSA8PCBJbmRleDsgfQorCisgICAgLy8vIEdldCB0aGUgYnVja2V0IG51bWJlciBmb3IgdGhpcyBjYXBhY2l0eS4KKyAgICB1bnNpZ25lZCBnZXRCdWNrZXQoKSBjb25zdCB7IHJldHVybiBJbmRleDsgfQorCisgICAgLy8vIEdldCB0aGUgbmV4dCBsYXJnZXIgY2FwYWNpdHkuIExhcmdlIGNhcGFjaXRpZXMgZ3JvdyBleHBvbmVudGlhbGx5LCBzbworICAgIC8vLyB0aGlzIGZ1bmN0aW9uIGNhbiBiZSB1c2VkIHRvIHJlYWxsb2NhdGUgaW5jcmVtZW50YWxseSBncm93aW5nIHZlY3RvcnMKKyAgICAvLy8gaW4gYW1vcnRpemVkIGxpbmVhciB0aW1lLgorICAgIENhcGFjaXR5IGdldE5leHQoKSBjb25zdCB7IHJldHVybiBDYXBhY2l0eShJbmRleCArIDEpOyB9CisgIH07CisKKyAgfkFycmF5UmVjeWNsZXIoKSB7CisgICAgLy8gVGhlIGNsaWVudCBzaG91bGQgYWx3YXlzIGNhbGwgY2xlYXIoKSBzbyByZWN5Y2xlZCBhcnJheXMgY2FuIGJlIHJldHVybmVkCisgICAgLy8gdG8gdGhlIGFsbG9jYXRvci4KKyAgICBhc3NlcnQoQnVja2V0LmVtcHR5KCkgJiYgIk5vbi1lbXB0eSBBcnJheVJlY3ljbGVyIGRlbGV0ZWQhIik7CisgIH0KKworICAvLy8gUmVsZWFzZSBhbGwgdGhlIHRyYWNrZWQgYWxsb2NhdGlvbnMgdG8gdGhlIGFsbG9jYXRvci4gVGhlIHJlY3ljbGVyIG11c3QKKyAgLy8vIGJlIGZyZWUgb2YgYW55IHRyYWNrZWQgYWxsb2NhdGlvbnMgYmVmb3JlIGJlaW5nIGRlbGV0ZWQuCisgIHRlbXBsYXRlPGNsYXNzIEFsbG9jYXRvclR5cGU+CisgIHZvaWQgY2xlYXIoQWxsb2NhdG9yVHlwZSAmQWxsb2NhdG9yKSB7CisgICAgZm9yICg7ICFCdWNrZXQuZW1wdHkoKTsgQnVja2V0LnBvcF9iYWNrKCkpCisgICAgICB3aGlsZSAoVCAqUHRyID0gcG9wKEJ1Y2tldC5zaXplKCkgLSAxKSkKKyAgICAgICAgQWxsb2NhdG9yLkRlYWxsb2NhdGUoUHRyKTsKKyAgfQorCisgIC8vLyBTcGVjaWFsIGNhc2UgZm9yIEJ1bXBQdHJBbGxvY2F0b3Igd2hpY2ggaGFzIGFuIGVtcHR5IERlYWxsb2NhdGUoKQorICAvLy8gZnVuY3Rpb24uCisgIC8vLworICAvLy8gVGhlcmUgaXMgbm8gbmVlZCB0byB0cmF2ZXJzZSB0aGUgZnJlZSBsaXN0cywgcHVsbGluZyBhbGwgdGhlIG9iamVjdHMgaW50bworICAvLy8gY2FjaGUuCisgIHZvaWQgY2xlYXIoQnVtcFB0ckFsbG9jYXRvciYpIHsKKyAgICBCdWNrZXQuY2xlYXIoKTsKKyAgfQorCisgIC8vLyBBbGxvY2F0ZSBhbiBhcnJheSBvZiBhdCBsZWFzdCB0aGUgcmVxdWVzdGVkIGNhcGFjaXR5LgorICAvLy8KKyAgLy8vIFJldHVybiBhbiBleGlzdGluZyByZWN5Y2xlZCBhcnJheSwgb3IgYWxsb2NhdGUgb25lIGZyb20gQWxsb2NhdG9yIGlmCisgIC8vLyBub25lIGFyZSBhdmFpbGFibGUgZm9yIHJlY3ljbGluZy4KKyAgLy8vCisgIHRlbXBsYXRlPGNsYXNzIEFsbG9jYXRvclR5cGU+CisgIFQgKmFsbG9jYXRlKENhcGFjaXR5IENhcCwgQWxsb2NhdG9yVHlwZSAmQWxsb2NhdG9yKSB7CisgICAgLy8gVHJ5IHRvIHJlY3ljbGUgYW4gZXhpc3RpbmcgYXJyYXkuCisgICAgaWYgKFQgKlB0ciA9IHBvcChDYXAuZ2V0QnVja2V0KCkpKQorICAgICAgcmV0dXJuIFB0cjsKKyAgICAvLyBOb3BlLCBnZXQgbW9yZSBtZW1vcnkuCisgICAgcmV0dXJuIHN0YXRpY19jYXN0PFQqPihBbGxvY2F0b3IuQWxsb2NhdGUoc2l6ZW9mKFQpKkNhcC5nZXRTaXplKCksIEFsaWduKSk7CisgIH0KKworICAvLy8gRGVhbGxvY2F0ZSBhbiBhcnJheSB3aXRoIHRoZSBzcGVjaWZpZWQgQ2FwYWNpdHkuCisgIC8vLworICAvLy8gQ2FwIG11c3QgYmUgdGhlIHNhbWUgY2FwYWNpdHkgdGhhdCB3YXMgZ2l2ZW4gdG8gYWxsb2NhdGUoKS4KKyAgLy8vCisgIHZvaWQgZGVhbGxvY2F0ZShDYXBhY2l0eSBDYXAsIFQgKlB0cikgeworICAgIHB1c2goQ2FwLmdldEJ1Y2tldCgpLCBQdHIpOworICB9Cit9OworCit9IC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BdG9taWMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BdG9taWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTIzMTNmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0F0b21pYy5oCkBAIC0wLDAgKzEsNDMgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvQXRvbWljLmggLSBBdG9taWMgT3BlcmF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgbGx2bTo6c3lzIGF0b21pYyBvcGVyYXRpb25zLgorLy8KKy8vIERPIE5PVCBVU0UgSU4gTkVXIENPREUhCisvLworLy8gTmV3IGNvZGUgc2hvdWxkIGFsd2F5cyByZWx5IG9uIHRoZSBzdGQ6OmF0b21pYyBmYWNpbGl0aWVzIGluIEMrKzExLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0FUT01JQ19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9BVE9NSUNfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorCisvLyBXaW5kb3dzIHdpbGwgYXQgdGltZXMgZGVmaW5lIE1lbW9yeUZlbmNlLgorI2lmZGVmIE1lbW9yeUZlbmNlCisjdW5kZWYgTWVtb3J5RmVuY2UKKyNlbmRpZgorCituYW1lc3BhY2UgbGx2bSB7CisgIG5hbWVzcGFjZSBzeXMgeworICAgIHZvaWQgTWVtb3J5RmVuY2UoKTsKKworI2lmZGVmIF9NU0NfVkVSCisgICAgdHlwZWRlZiBsb25nIGNhc19mbGFnOworI2Vsc2UKKyAgICB0eXBlZGVmIHVpbnQzMl90IGNhc19mbGFnOworI2VuZGlmCisgICAgY2FzX2ZsYWcgQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgY2FzX2ZsYWcqIHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNfZmxhZyBuZXdfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzX2ZsYWcgb2xkX3ZhbHVlKTsKKyAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BdG9taWNPcmRlcmluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0F0b21pY09yZGVyaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTkzYjc1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9BdG9taWNPcmRlcmluZy5oCkBAIC0wLDAgKzEsMTUyIEBACisvLz09PS0tIGxsdm0vU3VwcG9ydC9BdG9taWNPcmRlcmluZy5oIC0tLUF0b21pYyBPcmRlcmluZy0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgQXRvbWljIG9yZGVyaW5nIGNvbnN0YW50cy4KKy8vLworLy8vIFRoZXNlIHZhbHVlcyBhcmUgdXNlZCBieSBMTFZNIHRvIHJlcHJlc2VudCBhdG9taWMgb3JkZXJpbmcgZm9yIEMrKzExJ3MKKy8vLyBtZW1vcnkgbW9kZWwgYW5kIG1vcmUsIGFzIGRldGFpbGVkIGluIGRvY3MvQXRvbWljcy5yc3QuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0FUT01JQ09SREVSSU5HX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0FUT01JQ09SREVSSU5HX0gKKworI2luY2x1ZGUgPGNzdGRkZWY+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEF0b21pYyBvcmRlcmluZyBmb3IgQzExIC8gQysrMTEncyBtZW1vZHkgbW9kZWxzLgorLy8vCisvLy8gVGhlc2UgdmFsdWVzIGNhbm5vdCBjaGFuZ2UgYmVjYXVzZSB0aGV5IGFyZSBzaGFyZWQgd2l0aCBzdGFuZGFyZCBsaWJyYXJ5CisvLy8gaW1wbGVtZW50YXRpb25zIGFzIHdlbGwgYXMgd2l0aCBvdGhlciBjb21waWxlcnMuCitlbnVtIGNsYXNzIEF0b21pY09yZGVyaW5nQ0FCSSB7CisgIHJlbGF4ZWQgPSAwLAorICBjb25zdW1lID0gMSwKKyAgYWNxdWlyZSA9IDIsCisgIHJlbGVhc2UgPSAzLAorICBhY3FfcmVsID0gNCwKKyAgc2VxX2NzdCA9IDUsCit9OworCitib29sIG9wZXJhdG9yPChBdG9taWNPcmRlcmluZ0NBQkksIEF0b21pY09yZGVyaW5nQ0FCSSkgPSBkZWxldGU7Citib29sIG9wZXJhdG9yPihBdG9taWNPcmRlcmluZ0NBQkksIEF0b21pY09yZGVyaW5nQ0FCSSkgPSBkZWxldGU7Citib29sIG9wZXJhdG9yPD0oQXRvbWljT3JkZXJpbmdDQUJJLCBBdG9taWNPcmRlcmluZ0NBQkkpID0gZGVsZXRlOworYm9vbCBvcGVyYXRvcj49KEF0b21pY09yZGVyaW5nQ0FCSSwgQXRvbWljT3JkZXJpbmdDQUJJKSA9IGRlbGV0ZTsKKworLy8gVmFsaWRhdGUgYW4gaW50ZWdyYWwgdmFsdWUgd2hpY2ggaXNuJ3Qga25vd24gdG8gZml0IHdpdGhpbiB0aGUgZW51bSdzIHJhbmdlCisvLyBpcyBhIHZhbGlkIEF0b21pY09yZGVyaW5nQ0FCSS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbnQ+IGlubGluZSBib29sIGlzVmFsaWRBdG9taWNPcmRlcmluZ0NBQkkoSW50IEkpIHsKKyAgcmV0dXJuIChJbnQpQXRvbWljT3JkZXJpbmdDQUJJOjpyZWxheGVkIDw9IEkgJiYKKyAgICAgICAgIEkgPD0gKEludClBdG9taWNPcmRlcmluZ0NBQkk6OnNlcV9jc3Q7Cit9CisKKy8vLyBBdG9taWMgb3JkZXJpbmcgZm9yIExMVk0ncyBtZW1vcnkgbW9kZWwuCisvLy8KKy8vLyBDKysgZGVmaW5lcyBvcmRlcmluZyBhcyBhIGxhdHRpY2UuIExMVk0gc3VwcGxlbWVudHMgdGhpcyB3aXRoIE5vdEF0b21pYyBhbmQKKy8vLyBVbm9yZGVyZWQsIHdoaWNoIGFyZSBib3RoIGJlbG93IHRoZSBDKysgb3JkZXJzLgorLy8vCisvLy8gbm90X2F0b21pYy0tPnVub3JkZXJlZC0tPnJlbGF4ZWQtLT5yZWxlYXNlLS0tLS0tLS0tLS0tLS0tPmFjcV9yZWwtLT5zZXFfY3N0CisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwtLT5jb25zdW1lLS0+YWNxdWlyZS0tLworZW51bSBjbGFzcyBBdG9taWNPcmRlcmluZyB7CisgIE5vdEF0b21pYyA9IDAsCisgIFVub3JkZXJlZCA9IDEsCisgIE1vbm90b25pYyA9IDIsIC8vIEVxdWl2YWxlbnQgdG8gQysrJ3MgcmVsYXhlZC4KKyAgLy8gQ29uc3VtZSA9IDMsICAvLyBOb3Qgc3BlY2lmaWVkIHlldC4KKyAgQWNxdWlyZSA9IDQsCisgIFJlbGVhc2UgPSA1LAorICBBY3F1aXJlUmVsZWFzZSA9IDYsCisgIFNlcXVlbnRpYWxseUNvbnNpc3RlbnQgPSA3Cit9OworCitib29sIG9wZXJhdG9yPChBdG9taWNPcmRlcmluZywgQXRvbWljT3JkZXJpbmcpID0gZGVsZXRlOworYm9vbCBvcGVyYXRvcj4oQXRvbWljT3JkZXJpbmcsIEF0b21pY09yZGVyaW5nKSA9IGRlbGV0ZTsKK2Jvb2wgb3BlcmF0b3I8PShBdG9taWNPcmRlcmluZywgQXRvbWljT3JkZXJpbmcpID0gZGVsZXRlOworYm9vbCBvcGVyYXRvcj49KEF0b21pY09yZGVyaW5nLCBBdG9taWNPcmRlcmluZykgPSBkZWxldGU7CisKKy8vIFZhbGlkYXRlIGFuIGludGVncmFsIHZhbHVlIHdoaWNoIGlzbid0IGtub3duIHRvIGZpdCB3aXRoaW4gdGhlIGVudW0ncyByYW5nZQorLy8gaXMgYSB2YWxpZCBBdG9taWNPcmRlcmluZy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBJbnQ+IGlubGluZSBib29sIGlzVmFsaWRBdG9taWNPcmRlcmluZyhJbnQgSSkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8SW50PihBdG9taWNPcmRlcmluZzo6Tm90QXRvbWljKSA8PSBJICYmCisgICAgICAgICBJIDw9IHN0YXRpY19jYXN0PEludD4oQXRvbWljT3JkZXJpbmc6OlNlcXVlbnRpYWxseUNvbnNpc3RlbnQpOworfQorCisvLy8gU3RyaW5nIHVzZWQgYnkgTExWTSBJUiB0byByZXByZXNlbnQgYXRvbWljIG9yZGVyaW5nLgoraW5saW5lIGNvbnN0IGNoYXIgKnRvSVJTdHJpbmcoQXRvbWljT3JkZXJpbmcgYW8pIHsKKyAgc3RhdGljIGNvbnN0IGNoYXIgKm5hbWVzWzhdID0geyJub3RfYXRvbWljIiwgInVub3JkZXJlZCIsICJtb25vdG9uaWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnN1bWUiLCAgICAiYWNxdWlyZSIsICAgInJlbGVhc2UiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFjcV9yZWwiLCAgICAic2VxX2NzdCJ9OworICByZXR1cm4gbmFtZXNbc3RhdGljX2Nhc3Q8c2l6ZV90PihhbyldOworfQorCisvLy8gUmV0dXJucyB0cnVlIGlmIGFvIGlzIHN0cm9uZ2VyIHRoYW4gb3RoZXIgYXMgZGVmaW5lZCBieSB0aGUgQXRvbWljT3JkZXJpbmcKKy8vLyBsYXR0aWNlLCB3aGljaCBpcyBiYXNlZCBvbiBDKysncyBkZWZpbml0aW9uLgoraW5saW5lIGJvb2wgaXNTdHJvbmdlclRoYW4oQXRvbWljT3JkZXJpbmcgYW8sIEF0b21pY09yZGVyaW5nIG90aGVyKSB7CisgIHN0YXRpYyBjb25zdCBib29sIGxvb2t1cFs4XVs4XSA9IHsKKyAgICAgIC8vICAgICAgICAgICAgICAgTkEgICAgIFVOICAgICBSWCAgICAgQ08gICAgIEFDICAgICBSRSAgICAgQVIgICAgIFNDCisgICAgICAvKiBOb3RBdG9taWMgKi8ge2ZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX0sCisgICAgICAvKiBVbm9yZGVyZWQgKi8geyB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX0sCisgICAgICAvKiByZWxheGVkICAgKi8geyB0cnVlLCAgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX0sCisgICAgICAvKiBjb25zdW1lICAgKi8geyB0cnVlLCAgdHJ1ZSwgIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX0sCisgICAgICAvKiBhY3F1aXJlICAgKi8geyB0cnVlLCAgdHJ1ZSwgIHRydWUsICB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX0sCisgICAgICAvKiByZWxlYXNlICAgKi8geyB0cnVlLCAgdHJ1ZSwgIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX0sCisgICAgICAvKiBhY3FfcmVsICAgKi8geyB0cnVlLCAgdHJ1ZSwgIHRydWUsICB0cnVlLCAgdHJ1ZSwgIHRydWUsIGZhbHNlLCBmYWxzZX0sCisgICAgICAvKiBzZXFfY3N0ICAgKi8geyB0cnVlLCAgdHJ1ZSwgIHRydWUsICB0cnVlLCAgdHJ1ZSwgIHRydWUsICB0cnVlLCBmYWxzZX0sCisgIH07CisgIHJldHVybiBsb29rdXBbc3RhdGljX2Nhc3Q8c2l6ZV90PihhbyldW3N0YXRpY19jYXN0PHNpemVfdD4ob3RoZXIpXTsKK30KKworaW5saW5lIGJvb2wgaXNBdExlYXN0T3JTdHJvbmdlclRoYW4oQXRvbWljT3JkZXJpbmcgYW8sIEF0b21pY09yZGVyaW5nIG90aGVyKSB7CisgIHN0YXRpYyBjb25zdCBib29sIGxvb2t1cFs4XVs4XSA9IHsKKyAgICAgIC8vICAgICAgICAgICAgICAgTkEgICAgIFVOICAgICBSWCAgICAgQ08gICAgIEFDICAgICBSRSAgICAgQVIgICAgIFNDCisgICAgICAvKiBOb3RBdG9taWMgKi8geyB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX0sCisgICAgICAvKiBVbm9yZGVyZWQgKi8geyB0cnVlLCAgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX0sCisgICAgICAvKiByZWxheGVkICAgKi8geyB0cnVlLCAgdHJ1ZSwgIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX0sCisgICAgICAvKiBjb25zdW1lICAgKi8geyB0cnVlLCAgdHJ1ZSwgIHRydWUsICB0cnVlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX0sCisgICAgICAvKiBhY3F1aXJlICAgKi8geyB0cnVlLCAgdHJ1ZSwgIHRydWUsICB0cnVlLCAgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZX0sCisgICAgICAvKiByZWxlYXNlICAgKi8geyB0cnVlLCAgdHJ1ZSwgIHRydWUsIGZhbHNlLCBmYWxzZSwgIHRydWUsIGZhbHNlLCBmYWxzZX0sCisgICAgICAvKiBhY3FfcmVsICAgKi8geyB0cnVlLCAgdHJ1ZSwgIHRydWUsICB0cnVlLCAgdHJ1ZSwgIHRydWUsICB0cnVlLCBmYWxzZX0sCisgICAgICAvKiBzZXFfY3N0ICAgKi8geyB0cnVlLCAgdHJ1ZSwgIHRydWUsICB0cnVlLCAgdHJ1ZSwgIHRydWUsICB0cnVlLCAgdHJ1ZX0sCisgIH07CisgIHJldHVybiBsb29rdXBbc3RhdGljX2Nhc3Q8c2l6ZV90PihhbyldW3N0YXRpY19jYXN0PHNpemVfdD4ob3RoZXIpXTsKK30KKworaW5saW5lIGJvb2wgaXNTdHJvbmdlclRoYW5Vbm9yZGVyZWQoQXRvbWljT3JkZXJpbmcgYW8pIHsKKyAgcmV0dXJuIGlzU3Ryb25nZXJUaGFuKGFvLCBBdG9taWNPcmRlcmluZzo6VW5vcmRlcmVkKTsKK30KKworaW5saW5lIGJvb2wgaXNTdHJvbmdlclRoYW5Nb25vdG9uaWMoQXRvbWljT3JkZXJpbmcgYW8pIHsKKyAgcmV0dXJuIGlzU3Ryb25nZXJUaGFuKGFvLCBBdG9taWNPcmRlcmluZzo6TW9ub3RvbmljKTsKK30KKworaW5saW5lIGJvb2wgaXNBY3F1aXJlT3JTdHJvbmdlcihBdG9taWNPcmRlcmluZyBhbykgeworICByZXR1cm4gaXNBdExlYXN0T3JTdHJvbmdlclRoYW4oYW8sIEF0b21pY09yZGVyaW5nOjpBY3F1aXJlKTsKK30KKworaW5saW5lIGJvb2wgaXNSZWxlYXNlT3JTdHJvbmdlcihBdG9taWNPcmRlcmluZyBhbykgeworICByZXR1cm4gaXNBdExlYXN0T3JTdHJvbmdlclRoYW4oYW8sIEF0b21pY09yZGVyaW5nOjpSZWxlYXNlKTsKK30KKworaW5saW5lIEF0b21pY09yZGVyaW5nQ0FCSSB0b0NBQkkoQXRvbWljT3JkZXJpbmcgYW8pIHsKKyAgc3RhdGljIGNvbnN0IEF0b21pY09yZGVyaW5nQ0FCSSBsb29rdXBbOF0gPSB7CisgICAgICAvKiBOb3RBdG9taWMgKi8gQXRvbWljT3JkZXJpbmdDQUJJOjpyZWxheGVkLAorICAgICAgLyogVW5vcmRlcmVkICovIEF0b21pY09yZGVyaW5nQ0FCSTo6cmVsYXhlZCwKKyAgICAgIC8qIHJlbGF4ZWQgICAqLyBBdG9taWNPcmRlcmluZ0NBQkk6OnJlbGF4ZWQsCisgICAgICAvKiBjb25zdW1lICAgKi8gQXRvbWljT3JkZXJpbmdDQUJJOjpjb25zdW1lLAorICAgICAgLyogYWNxdWlyZSAgICovIEF0b21pY09yZGVyaW5nQ0FCSTo6YWNxdWlyZSwKKyAgICAgIC8qIHJlbGVhc2UgICAqLyBBdG9taWNPcmRlcmluZ0NBQkk6OnJlbGVhc2UsCisgICAgICAvKiBhY3FfcmVsICAgKi8gQXRvbWljT3JkZXJpbmdDQUJJOjphY3FfcmVsLAorICAgICAgLyogc2VxX2NzdCAgICovIEF0b21pY09yZGVyaW5nQ0FCSTo6c2VxX2NzdCwKKyAgfTsKKyAgcmV0dXJuIGxvb2t1cFtzdGF0aWNfY2FzdDxzaXplX3Q+KGFvKV07Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfQVRPTUlDT1JERVJJTkdfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0JpbmFyeUJ5dGVTdHJlYW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CaW5hcnlCeXRlU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGIxY2NiYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CaW5hcnlCeXRlU3RyZWFtLmgKQEAgLTAsMCArMSwyNjIgQEAKKy8vPT09LSBCaW5hcnlCeXRlU3RyZWFtLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEEgQmluYXJ5U3RyZWFtIHdoaWNoIHN0b3JlcyBkYXRhIGluIGEgc2luZ2xlIGNvbnRpbmd1b3VzIG1lbW9yeSBidWZmZXIuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9CSU5BUllCWVRFU1RSRUFNX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0JJTkFSWUJZVEVTVFJFQU1fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbUVycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0ZpbGVPdXRwdXRCdWZmZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFxicmllZiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBCaW5hcnlTdHJlYW0gd2hpY2ggaG9sZHMgaXRzIGVudGlyZSBkYXRhIHNldAorLy8vIGluIGEgc2luZ2xlIGNvbnRpZ3VvdXMgYnVmZmVyLiAgQmluYXJ5Qnl0ZVN0cmVhbSBndWFyYW50ZWVzIHRoYXQgbm8gcmVhZAorLy8vIG9wZXJhdGlvbiB3aWxsIGV2ZXIgaW5jdXIgYSBjb3B5LiAgTm90ZSB0aGF0IEJpbmFyeUJ5dGVTdHJlYW0gZG9lcyBub3QKKy8vLyBvd24gdGhlIHVuZGVybHlpbmcgYnVmZmVyLgorY2xhc3MgQmluYXJ5Qnl0ZVN0cmVhbSA6IHB1YmxpYyBCaW5hcnlTdHJlYW0geworcHVibGljOgorICBCaW5hcnlCeXRlU3RyZWFtKCkgPSBkZWZhdWx0OworICBCaW5hcnlCeXRlU3RyZWFtKEFycmF5UmVmPHVpbnQ4X3Q+IERhdGEsIGxsdm06OnN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFuKQorICAgICAgOiBFbmRpYW4oRW5kaWFuKSwgRGF0YShEYXRhKSB7fQorICBCaW5hcnlCeXRlU3RyZWFtKFN0cmluZ1JlZiBEYXRhLCBsbHZtOjpzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbikKKyAgICAgIDogRW5kaWFuKEVuZGlhbiksIERhdGEoRGF0YS5ieXRlc19iZWdpbigpLCBEYXRhLmJ5dGVzX2VuZCgpKSB7fQorCisgIGxsdm06OnN1cHBvcnQ6OmVuZGlhbm5lc3MgZ2V0RW5kaWFuKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gRW5kaWFuOyB9CisKKyAgRXJyb3IgcmVhZEJ5dGVzKHVpbnQzMl90IE9mZnNldCwgdWludDMyX3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+ICZCdWZmZXIpIG92ZXJyaWRlIHsKKyAgICBpZiAoYXV0byBFQyA9IGNoZWNrT2Zmc2V0Rm9yUmVhZChPZmZzZXQsIFNpemUpKQorICAgICAgcmV0dXJuIEVDOworICAgIEJ1ZmZlciA9IERhdGEuc2xpY2UoT2Zmc2V0LCBTaXplKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIEVycm9yIHJlYWRMb25nZXN0Q29udGlndW91c0NodW5rKHVpbnQzMl90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gJkJ1ZmZlcikgb3ZlcnJpZGUgeworICAgIGlmIChhdXRvIEVDID0gY2hlY2tPZmZzZXRGb3JSZWFkKE9mZnNldCwgMSkpCisgICAgICByZXR1cm4gRUM7CisgICAgQnVmZmVyID0gRGF0YS5zbGljZShPZmZzZXQpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgdWludDMyX3QgZ2V0TGVuZ3RoKCkgb3ZlcnJpZGUgeyByZXR1cm4gRGF0YS5zaXplKCk7IH0KKworICBBcnJheVJlZjx1aW50OF90PiBkYXRhKCkgY29uc3QgeyByZXR1cm4gRGF0YTsgfQorCisgIFN0cmluZ1JlZiBzdHIoKSBjb25zdCB7CisgICAgY29uc3QgY2hhciAqQ2hhckRhdGEgPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIgKj4oRGF0YS5kYXRhKCkpOworICAgIHJldHVybiBTdHJpbmdSZWYoQ2hhckRhdGEsIERhdGEuc2l6ZSgpKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIGxsdm06OnN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFuOworICBBcnJheVJlZjx1aW50OF90PiBEYXRhOworfTsKKworLy8vIFxicmllZiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBCaW5hcnlTdHJlYW0gd2hvc2UgZGF0YSBpcyBiYWNrZWQgYnkgYW4gbGx2bQorLy8vIE1lbW9yeUJ1ZmZlciBvYmplY3QuICBNZW1vcnlCdWZmZXJCeXRlU3RyZWFtIG93bnMgdGhlIE1lbW9yeUJ1ZmZlciBpbgorLy8vIHF1ZXN0aW9uLiAgQXMgd2l0aCBCaW5hcnlCeXRlU3RyZWFtLCByZWFkaW5nIGZyb20gYSBNZW1vcnlCdWZmZXJCeXRlU3RyZWFtCisvLy8gd2lsbCBuZXZlciBjYXVzZSBhIGNvcHkuCitjbGFzcyBNZW1vcnlCdWZmZXJCeXRlU3RyZWFtIDogcHVibGljIEJpbmFyeUJ5dGVTdHJlYW0geworcHVibGljOgorICBNZW1vcnlCdWZmZXJCeXRlU3RyZWFtKHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbikKKyAgICAgIDogQmluYXJ5Qnl0ZVN0cmVhbShCdWZmZXItPmdldEJ1ZmZlcigpLCBFbmRpYW4pLAorICAgICAgICBNZW1CdWZmZXIoc3RkOjptb3ZlKEJ1ZmZlcikpIHt9CisKKyAgc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gTWVtQnVmZmVyOworfTsKKworLy8vIFxicmllZiBBbiBpbXBsZW1lbnRhdGlvbiBvZiBCaW5hcnlTdHJlYW0gd2hpY2ggaG9sZHMgaXRzIGVudGlyZSBkYXRhIHNldAorLy8vIGluIGEgc2luZ2xlIGNvbnRpZ3VvdXMgYnVmZmVyLiAgQXMgd2l0aCBCaW5hcnlCeXRlU3RyZWFtLCB0aGUgbXV0YWJsZQorLy8vIHZlcnNpb24gYWxzbyBndWFyYW50ZWVzIHRoYXQgbm8gcmVhZCBvcGVyYXRpb24gd2lsbCBldmVyIGluY3VyIGEgY29weSwKKy8vLyBhbmQgc2ltaWxhcmx5IGl0IGRvZXMgbm90IG93biB0aGUgdW5kZXJseWluZyBidWZmZXIuCitjbGFzcyBNdXRhYmxlQmluYXJ5Qnl0ZVN0cmVhbSA6IHB1YmxpYyBXcml0YWJsZUJpbmFyeVN0cmVhbSB7CitwdWJsaWM6CisgIE11dGFibGVCaW5hcnlCeXRlU3RyZWFtKCkgPSBkZWZhdWx0OworICBNdXRhYmxlQmluYXJ5Qnl0ZVN0cmVhbShNdXRhYmxlQXJyYXlSZWY8dWludDhfdD4gRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW4pCisgICAgICA6IERhdGEoRGF0YSksIEltbXV0YWJsZVN0cmVhbShEYXRhLCBFbmRpYW4pIHt9CisKKyAgbGx2bTo6c3VwcG9ydDo6ZW5kaWFubmVzcyBnZXRFbmRpYW4oKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltbXV0YWJsZVN0cmVhbS5nZXRFbmRpYW4oKTsKKyAgfQorCisgIEVycm9yIHJlYWRCeXRlcyh1aW50MzJfdCBPZmZzZXQsIHVpbnQzMl90IFNpemUsCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiAmQnVmZmVyKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltbXV0YWJsZVN0cmVhbS5yZWFkQnl0ZXMoT2Zmc2V0LCBTaXplLCBCdWZmZXIpOworICB9CisKKyAgRXJyb3IgcmVhZExvbmdlc3RDb250aWd1b3VzQ2h1bmsodWludDMyX3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiAmQnVmZmVyKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltbXV0YWJsZVN0cmVhbS5yZWFkTG9uZ2VzdENvbnRpZ3VvdXNDaHVuayhPZmZzZXQsIEJ1ZmZlcik7CisgIH0KKworICB1aW50MzJfdCBnZXRMZW5ndGgoKSBvdmVycmlkZSB7IHJldHVybiBJbW11dGFibGVTdHJlYW0uZ2V0TGVuZ3RoKCk7IH0KKworICBFcnJvciB3cml0ZUJ5dGVzKHVpbnQzMl90IE9mZnNldCwgQXJyYXlSZWY8dWludDhfdD4gQnVmZmVyKSBvdmVycmlkZSB7CisgICAgaWYgKEJ1ZmZlci5lbXB0eSgpKQorICAgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisKKyAgICBpZiAoYXV0byBFQyA9IGNoZWNrT2Zmc2V0Rm9yV3JpdGUoT2Zmc2V0LCBCdWZmZXIuc2l6ZSgpKSkKKyAgICAgIHJldHVybiBFQzsKKworICAgIHVpbnQ4X3QgKkRhdGFQdHIgPSBjb25zdF9jYXN0PHVpbnQ4X3QgKj4oRGF0YS5kYXRhKCkpOworICAgIDo6bWVtY3B5KERhdGFQdHIgKyBPZmZzZXQsIEJ1ZmZlci5kYXRhKCksIEJ1ZmZlci5zaXplKCkpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXJyb3IgY29tbWl0KCkgb3ZlcnJpZGUgeyByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsgfQorCisgIE11dGFibGVBcnJheVJlZjx1aW50OF90PiBkYXRhKCkgY29uc3QgeyByZXR1cm4gRGF0YTsgfQorCitwcml2YXRlOgorICBNdXRhYmxlQXJyYXlSZWY8dWludDhfdD4gRGF0YTsKKyAgQmluYXJ5Qnl0ZVN0cmVhbSBJbW11dGFibGVTdHJlYW07Cit9OworCisvLy8gXGJyaWVmIEFuIGltcGxlbWVudGF0aW9uIG9mIFdyaXRhYmxlQmluYXJ5U3RyZWFtIHdoaWNoIGNhbiB3cml0ZSBhdCBpdHMgZW5kCisvLy8gY2F1c2luZyB0aGUgdW5kZXJseWluZyBkYXRhIHRvIGdyb3cuICBUaGlzIGNsYXNzIG93bnMgdGhlIHVuZGVybHlpbmcgZGF0YS4KK2NsYXNzIEFwcGVuZGluZ0JpbmFyeUJ5dGVTdHJlYW0gOiBwdWJsaWMgV3JpdGFibGVCaW5hcnlTdHJlYW0geworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBEYXRhOworICBsbHZtOjpzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbiA9IGxsdm06OnN1cHBvcnQ6OmxpdHRsZTsKKworcHVibGljOgorICBBcHBlbmRpbmdCaW5hcnlCeXRlU3RyZWFtKCkgPSBkZWZhdWx0OworICBBcHBlbmRpbmdCaW5hcnlCeXRlU3RyZWFtKGxsdm06OnN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFuKQorICAgICAgOiBFbmRpYW4oRW5kaWFuKSB7fQorCisgIHZvaWQgY2xlYXIoKSB7IERhdGEuY2xlYXIoKTsgfQorCisgIGxsdm06OnN1cHBvcnQ6OmVuZGlhbm5lc3MgZ2V0RW5kaWFuKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gRW5kaWFuOyB9CisKKyAgRXJyb3IgcmVhZEJ5dGVzKHVpbnQzMl90IE9mZnNldCwgdWludDMyX3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+ICZCdWZmZXIpIG92ZXJyaWRlIHsKKyAgICBpZiAoYXV0byBFQyA9IGNoZWNrT2Zmc2V0Rm9yV3JpdGUoT2Zmc2V0LCBCdWZmZXIuc2l6ZSgpKSkKKyAgICAgIHJldHVybiBFQzsKKworICAgIEJ1ZmZlciA9IG1ha2VBcnJheVJlZihEYXRhKS5zbGljZShPZmZzZXQsIFNpemUpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgdm9pZCBpbnNlcnQodWludDMyX3QgT2Zmc2V0LCBBcnJheVJlZjx1aW50OF90PiBCeXRlcykgeworICAgIERhdGEuaW5zZXJ0KERhdGEuYmVnaW4oKSArIE9mZnNldCwgQnl0ZXMuYmVnaW4oKSwgQnl0ZXMuZW5kKCkpOworICB9CisKKyAgRXJyb3IgcmVhZExvbmdlc3RDb250aWd1b3VzQ2h1bmsodWludDMyX3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiAmQnVmZmVyKSBvdmVycmlkZSB7CisgICAgaWYgKGF1dG8gRUMgPSBjaGVja09mZnNldEZvcldyaXRlKE9mZnNldCwgMSkpCisgICAgICByZXR1cm4gRUM7CisKKyAgICBCdWZmZXIgPSBtYWtlQXJyYXlSZWYoRGF0YSkuc2xpY2UoT2Zmc2V0KTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIHVpbnQzMl90IGdldExlbmd0aCgpIG92ZXJyaWRlIHsgcmV0dXJuIERhdGEuc2l6ZSgpOyB9CisKKyAgRXJyb3Igd3JpdGVCeXRlcyh1aW50MzJfdCBPZmZzZXQsIEFycmF5UmVmPHVpbnQ4X3Q+IEJ1ZmZlcikgb3ZlcnJpZGUgeworICAgIGlmIChCdWZmZXIuZW1wdHkoKSkKKyAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworCisgICAgLy8gVGhpcyBpcyB3ZWxsLWRlZmluZWQgZm9yIGFueSBjYXNlIGV4Y2VwdCB3aGVyZSBvZmZzZXQgaXMgc3RyaWN0bHkKKyAgICAvLyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgbGVuZ3RoLiAgSWYgb2Zmc2V0IGlzIGVxdWFsIHRvIHRoZSBjdXJyZW50CisgICAgLy8gbGVuZ3RoLCB3ZSBjYW4gc3RpbGwgZ3Jvdy4gIElmIG9mZnNldCBpcyBiZXlvbmQgdGhlIGN1cnJlbnQgbGVuZ3RoLCB3ZQorICAgIC8vIHdvdWxkIGhhdmUgdG8gZGVjaWRlIGhvdyB0byBkZWFsIHdpdGggdGhlIGludGVybWVkaWF0ZSB1bmluaXRpYWxpemVkCisgICAgLy8gYnl0ZXMuICBTbyB3ZSBwdW50IG9uIHRoYXQgY2FzZSBmb3Igc2ltcGxpY2l0eSBhbmQganVzdCBzYXkgaXQncyBhbgorICAgIC8vIGVycm9yLgorICAgIGlmIChPZmZzZXQgPiBnZXRMZW5ndGgoKSkKKyAgICAgIHJldHVybiBtYWtlX2Vycm9yPEJpbmFyeVN0cmVhbUVycm9yPihzdHJlYW1fZXJyb3JfY29kZTo6aW52YWxpZF9vZmZzZXQpOworCisgICAgdWludDMyX3QgUmVxdWlyZWRTaXplID0gT2Zmc2V0ICsgQnVmZmVyLnNpemUoKTsKKyAgICBpZiAoUmVxdWlyZWRTaXplID4gRGF0YS5zaXplKCkpCisgICAgICBEYXRhLnJlc2l6ZShSZXF1aXJlZFNpemUpOworCisgICAgOjptZW1jcHkoRGF0YS5kYXRhKCkgKyBPZmZzZXQsIEJ1ZmZlci5kYXRhKCksIEJ1ZmZlci5zaXplKCkpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgRXJyb3IgY29tbWl0KCkgb3ZlcnJpZGUgeyByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRoZSBwcm9wZXJ0aWVzIG9mIHRoaXMgc3RyZWFtLgorICB2aXJ0dWFsIEJpbmFyeVN0cmVhbUZsYWdzIGdldEZsYWdzKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBCU0ZfV3JpdGUgfCBCU0ZfQXBwZW5kOworICB9CisKKyAgTXV0YWJsZUFycmF5UmVmPHVpbnQ4X3Q+IGRhdGEoKSB7IHJldHVybiBEYXRhOyB9Cit9OworCisvLy8gXGJyaWVmIEFuIGltcGxlbWVudGF0aW9uIG9mIFdyaXRhYmxlQmluYXJ5U3RyZWFtIGJhY2tlZCBieSBhbiBsbHZtCisvLy8gRmlsZU91dHB1dEJ1ZmZlci4KK2NsYXNzIEZpbGVCdWZmZXJCeXRlU3RyZWFtIDogcHVibGljIFdyaXRhYmxlQmluYXJ5U3RyZWFtIHsKK3ByaXZhdGU6CisgIGNsYXNzIFN0cmVhbUltcGwgOiBwdWJsaWMgTXV0YWJsZUJpbmFyeUJ5dGVTdHJlYW0geworICBwdWJsaWM6CisgICAgU3RyZWFtSW1wbChzdGQ6OnVuaXF1ZV9wdHI8RmlsZU91dHB1dEJ1ZmZlcj4gQnVmZmVyLAorICAgICAgICAgICAgICAgbGx2bTo6c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW4pCisgICAgICAgIDogTXV0YWJsZUJpbmFyeUJ5dGVTdHJlYW0oCisgICAgICAgICAgICAgIE11dGFibGVBcnJheVJlZjx1aW50OF90PihCdWZmZXItPmdldEJ1ZmZlclN0YXJ0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXItPmdldEJ1ZmZlckVuZCgpKSwKKyAgICAgICAgICAgICAgRW5kaWFuKSwKKyAgICAgICAgICBGaWxlQnVmZmVyKHN0ZDo6bW92ZShCdWZmZXIpKSB7fQorCisgICAgRXJyb3IgY29tbWl0KCkgb3ZlcnJpZGUgeworICAgICAgaWYgKEZpbGVCdWZmZXItPmNvbW1pdCgpKQorICAgICAgICByZXR1cm4gbWFrZV9lcnJvcjxCaW5hcnlTdHJlYW1FcnJvcj4oCisgICAgICAgICAgICBzdHJlYW1fZXJyb3JfY29kZTo6ZmlsZXN5c3RlbV9lcnJvcik7CisgICAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgICB9CisKKyAgcHJpdmF0ZToKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8RmlsZU91dHB1dEJ1ZmZlcj4gRmlsZUJ1ZmZlcjsKKyAgfTsKKworcHVibGljOgorICBGaWxlQnVmZmVyQnl0ZVN0cmVhbShzdGQ6OnVuaXF1ZV9wdHI8RmlsZU91dHB1dEJ1ZmZlcj4gQnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbikKKyAgICAgIDogSW1wbChzdGQ6Om1vdmUoQnVmZmVyKSwgRW5kaWFuKSB7fQorCisgIGxsdm06OnN1cHBvcnQ6OmVuZGlhbm5lc3MgZ2V0RW5kaWFuKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBJbXBsLmdldEVuZGlhbigpOworICB9CisKKyAgRXJyb3IgcmVhZEJ5dGVzKHVpbnQzMl90IE9mZnNldCwgdWludDMyX3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+ICZCdWZmZXIpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSW1wbC5yZWFkQnl0ZXMoT2Zmc2V0LCBTaXplLCBCdWZmZXIpOworICB9CisKKyAgRXJyb3IgcmVhZExvbmdlc3RDb250aWd1b3VzQ2h1bmsodWludDMyX3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiAmQnVmZmVyKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwucmVhZExvbmdlc3RDb250aWd1b3VzQ2h1bmsoT2Zmc2V0LCBCdWZmZXIpOworICB9CisKKyAgdWludDMyX3QgZ2V0TGVuZ3RoKCkgb3ZlcnJpZGUgeyByZXR1cm4gSW1wbC5nZXRMZW5ndGgoKTsgfQorCisgIEVycm9yIHdyaXRlQnl0ZXModWludDMyX3QgT2Zmc2V0LCBBcnJheVJlZjx1aW50OF90PiBEYXRhKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEltcGwud3JpdGVCeXRlcyhPZmZzZXQsIERhdGEpOworICB9CisKKyAgRXJyb3IgY29tbWl0KCkgb3ZlcnJpZGUgeyByZXR1cm4gSW1wbC5jb21taXQoKTsgfQorCitwcml2YXRlOgorICBTdHJlYW1JbXBsIEltcGw7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0JZVEVTVFJFQU1fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0JpbmFyeUl0ZW1TdHJlYW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CaW5hcnlJdGVtU3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc4NzIzZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CaW5hcnlJdGVtU3RyZWFtLmgKQEAgLTAsMCArMSwxMDggQEAKKy8vPT09LSBCaW5hcnlJdGVtU3RyZWFtLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0JJTkFSWUlURU1TVFJFQU1fSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQklOQVJZSVRFTVNUUkVBTV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBCaW5hcnlJdGVtVHJhaXRzIHsKKyAgc3RhdGljIHNpemVfdCBsZW5ndGgoY29uc3QgVCAmSXRlbSkgPSBkZWxldGU7CisgIHN0YXRpYyBBcnJheVJlZjx1aW50OF90PiBieXRlcyhjb25zdCBUICZJdGVtKSA9IGRlbGV0ZTsKK307CisKKy8vLyBCaW5hcnlJdGVtU3RyZWFtIHJlcHJlc2VudHMgYSBzZXF1ZW5jZSBvZiBvYmplY3RzIHN0b3JlZCBpbiBzb21lIGtpbmQgb2YKKy8vLyBleHRlcm5hbCBjb250YWluZXIgYnV0IGZvciB3aGljaCBpdCBpcyB1c2VmdWwgdG8gdmlldyBhcyBhIHN0cmVhbSBvZgorLy8vIGNvbnRpZ3VvdXMgYnl0ZXMuICBBbiBleGFtcGxlIG9mIHRoaXMgbWlnaHQgYmUgaWYgeW91IGhhdmUgYSBjb2xsZWN0aW9uIG9mCisvLy8gcmVjb3JkcyBhbmQgeW91IHNlcmlhbGl6ZSBlYWNoIG9uZSBpbnRvIGEgYnVmZmVyLCBhbmQgc3RvcmUgdGhlc2Ugc2VyaWFsaXplZAorLy8vIHJlY29yZHMgaW4gYSBjb250YWluZXIuICBUaGUgcG9pbnRlcnMgdGhlbXNlbHZlcyBhcmUgbm90IGxhaWQgb3V0CisvLy8gY29udGlndW91c2x5IGluIG1lbW9yeSwgYnV0IHdlIG1heSB3aXNoIHRvIHJlYWQgZnJvbSBvciB3cml0ZSB0byB0aGVzZQorLy8vIHJlY29yZHMgYXMgaWYgdGhleSB3ZXJlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFRyYWl0cyA9IEJpbmFyeUl0ZW1UcmFpdHM8VD4+CitjbGFzcyBCaW5hcnlJdGVtU3RyZWFtIDogcHVibGljIEJpbmFyeVN0cmVhbSB7CitwdWJsaWM6CisgIGV4cGxpY2l0IEJpbmFyeUl0ZW1TdHJlYW0obGx2bTo6c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW4pCisgICAgICA6IEVuZGlhbihFbmRpYW4pIHt9CisKKyAgbGx2bTo6c3VwcG9ydDo6ZW5kaWFubmVzcyBnZXRFbmRpYW4oKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBFbmRpYW47IH0KKworICBFcnJvciByZWFkQnl0ZXModWludDMyX3QgT2Zmc2V0LCB1aW50MzJfdCBTaXplLAorICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gJkJ1ZmZlcikgb3ZlcnJpZGUgeworICAgIGF1dG8gRXhwZWN0ZWRJbmRleCA9IHRyYW5zbGF0ZU9mZnNldEluZGV4KE9mZnNldCk7CisgICAgaWYgKCFFeHBlY3RlZEluZGV4KQorICAgICAgcmV0dXJuIEV4cGVjdGVkSW5kZXgudGFrZUVycm9yKCk7CisgICAgY29uc3QgYXV0byAmSXRlbSA9IEl0ZW1zWypFeHBlY3RlZEluZGV4XTsKKyAgICBpZiAoYXV0byBFQyA9IGNoZWNrT2Zmc2V0Rm9yUmVhZChPZmZzZXQsIFNpemUpKQorICAgICAgcmV0dXJuIEVDOworICAgIGlmIChTaXplID4gVHJhaXRzOjpsZW5ndGgoSXRlbSkpCisgICAgICByZXR1cm4gbWFrZV9lcnJvcjxCaW5hcnlTdHJlYW1FcnJvcj4oc3RyZWFtX2Vycm9yX2NvZGU6OnN0cmVhbV90b29fc2hvcnQpOworICAgIEJ1ZmZlciA9IFRyYWl0czo6Ynl0ZXMoSXRlbSkudGFrZV9mcm9udChTaXplKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIEVycm9yIHJlYWRMb25nZXN0Q29udGlndW91c0NodW5rKHVpbnQzMl90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dWludDhfdD4gJkJ1ZmZlcikgb3ZlcnJpZGUgeworICAgIGF1dG8gRXhwZWN0ZWRJbmRleCA9IHRyYW5zbGF0ZU9mZnNldEluZGV4KE9mZnNldCk7CisgICAgaWYgKCFFeHBlY3RlZEluZGV4KQorICAgICAgcmV0dXJuIEV4cGVjdGVkSW5kZXgudGFrZUVycm9yKCk7CisgICAgQnVmZmVyID0gVHJhaXRzOjpieXRlcyhJdGVtc1sqRXhwZWN0ZWRJbmRleF0pOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgdm9pZCBzZXRJdGVtcyhBcnJheVJlZjxUPiBJdGVtQXJyYXkpIHsKKyAgICBJdGVtcyA9IEl0ZW1BcnJheTsKKyAgICBjb21wdXRlSXRlbU9mZnNldHMoKTsKKyAgfQorCisgIHVpbnQzMl90IGdldExlbmd0aCgpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gSXRlbUVuZE9mZnNldHMuZW1wdHkoKSA/IDAgOiBJdGVtRW5kT2Zmc2V0cy5iYWNrKCk7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBjb21wdXRlSXRlbU9mZnNldHMoKSB7CisgICAgSXRlbUVuZE9mZnNldHMuY2xlYXIoKTsKKyAgICBJdGVtRW5kT2Zmc2V0cy5yZXNlcnZlKEl0ZW1zLnNpemUoKSk7CisgICAgdWludDMyX3QgQ3VycmVudE9mZnNldCA9IDA7CisgICAgZm9yIChjb25zdCBhdXRvICZJdGVtIDogSXRlbXMpIHsKKyAgICAgIHVpbnQzMl90IExlbiA9IFRyYWl0czo6bGVuZ3RoKEl0ZW0pOworICAgICAgYXNzZXJ0KExlbiA+IDAgJiYgIm5vIGVtcHR5IGl0ZW1zIik7CisgICAgICBDdXJyZW50T2Zmc2V0ICs9IExlbjsKKyAgICAgIEl0ZW1FbmRPZmZzZXRzLnB1c2hfYmFjayhDdXJyZW50T2Zmc2V0KTsKKyAgICB9CisgIH0KKworICBFeHBlY3RlZDx1aW50MzJfdD4gdHJhbnNsYXRlT2Zmc2V0SW5kZXgodWludDMyX3QgT2Zmc2V0KSB7CisgICAgLy8gTWFrZSBzdXJlIHRoZSBvZmZzZXQgaXMgc29tZXdoZXJlIGluIG91ciBpdGVtcyBhcnJheS4KKyAgICBpZiAoT2Zmc2V0ID49IGdldExlbmd0aCgpKQorICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8QmluYXJ5U3RyZWFtRXJyb3I+KHN0cmVhbV9lcnJvcl9jb2RlOjpzdHJlYW1fdG9vX3Nob3J0KTsKKyAgICArK09mZnNldDsKKyAgICBhdXRvIEl0ZXIgPQorICAgICAgICBzdGQ6Omxvd2VyX2JvdW5kKEl0ZW1FbmRPZmZzZXRzLmJlZ2luKCksIEl0ZW1FbmRPZmZzZXRzLmVuZCgpLCBPZmZzZXQpOworICAgIHNpemVfdCBJZHggPSBzdGQ6OmRpc3RhbmNlKEl0ZW1FbmRPZmZzZXRzLmJlZ2luKCksIEl0ZXIpOworICAgIGFzc2VydChJZHggPCBJdGVtcy5zaXplKCkgJiYgImJpbmFyeSBzZWFyY2ggZm9yIG9mZnNldCBmYWlsZWQiKTsKKyAgICByZXR1cm4gSWR4OworICB9CisKKyAgbGx2bTo6c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW47CisgIEFycmF5UmVmPFQ+IEl0ZW1zOworCisgIC8vIFNvcnRlZCB2ZWN0b3Igb2Ygb2Zmc2V0cyB0byBhY2NlbGVyYXRlIGxvb2t1cC4KKyAgc3RkOjp2ZWN0b3I8dWludDMyX3Q+IEl0ZW1FbmRPZmZzZXRzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9CSU5BUllJVEVNU1RSRUFNX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNjlhMDNlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbS5oCkBAIC0wLDAgKzEsMTAyIEBACisvLz09PS0gQmluYXJ5U3RyZWFtLmggLSBCYXNlIGludGVyZmFjZSBmb3IgYSBzdHJlYW0gb2YgZGF0YSAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9CSU5BUllTVFJFQU1fSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQklOQVJZU1RSRUFNX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvQml0bWFza0VudW0uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtRXJyb3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCitlbnVtIEJpbmFyeVN0cmVhbUZsYWdzIHsKKyAgQlNGX05vbmUgPSAwLAorICBCU0ZfV3JpdGUgPSAxLCAgLy8gU3RyZWFtIHN1cHBvcnRzIHdyaXRpbmcuCisgIEJTRl9BcHBlbmQgPSAyLCAvLyBXcml0aW5nIGNhbiBvY2N1ciBhdCBvZmZzZXQgPT0gbGVuZ3RoLgorICBMTFZNX01BUktfQVNfQklUTUFTS19FTlVNKC8qIExhcmdlc3RWYWx1ZSA9ICovIEJTRl9BcHBlbmQpCit9OworCisvLy8gXGJyaWVmIEFuIGludGVyZmFjZSBmb3IgYWNjZXNzaW5nIGRhdGEgaW4gYSBzdHJlYW0tbGlrZSBmb3JtYXQsIGJ1dCB3aGljaAorLy8vIGRpc2NvdXJhZ2VzIGNvcHlpbmcuICBJbnN0ZWFkIG9mIHNwZWNpZnlpbmcgYSBidWZmZXIgaW4gd2hpY2ggdG8gY29weQorLy8vIGRhdGEgb24gYSByZWFkLCB0aGUgQVBJIHJldHVybnMgYW4gQXJyYXlSZWYgdG8gZGF0YSBvd25lZCBieSB0aGUgc3RyZWFtJ3MKKy8vLyBpbXBsZW1lbnRhdGlvbi4gIFNpbmNlIGltcGxlbWVudGF0aW9ucyBtYXkgbm90IG5lY2Vzc2FyaWx5IHN0b3JlIGRhdGEgaW4gYQorLy8vIHNpbmdsZSBjb250aWd1b3VzIGJ1ZmZlciAob3IgZXZlbiBpbiBtZW1vcnkgYXQgYWxsKSwgaW4gc3VjaCBjYXNlcyBhIGl0IG1heQorLy8vIGJlIG5lY2Vzc2FyeSBmb3IgYW4gaW1wbGVtZW50YXRpb24gdG8gY2FjaGUgc3VjaCBhIGJ1ZmZlciBzbyB0aGF0IGl0IGNhbgorLy8vIHJldHVybiBpdC4KK2NsYXNzIEJpbmFyeVN0cmVhbSB7CitwdWJsaWM6CisgIHZpcnR1YWwgfkJpbmFyeVN0cmVhbSgpID0gZGVmYXVsdDsKKworICB2aXJ0dWFsIGxsdm06OnN1cHBvcnQ6OmVuZGlhbm5lc3MgZ2V0RW5kaWFuKCkgY29uc3QgPSAwOworCisgIC8vLyBcYnJpZWYgR2l2ZW4gYW4gb2Zmc2V0IGludG8gdGhlIHN0cmVhbSBhbmQgYSBudW1iZXIgb2YgYnl0ZXMsIGF0dGVtcHQgdG8KKyAgLy8vIHJlYWQgdGhlIGJ5dGVzIGFuZCBzZXQgdGhlIG91dHB1dCBBcnJheVJlZiB0byBwb2ludCB0byBkYXRhIG93bmVkIGJ5IHRoZQorICAvLy8gc3RyZWFtLgorICB2aXJ0dWFsIEVycm9yIHJlYWRCeXRlcyh1aW50MzJfdCBPZmZzZXQsIHVpbnQzMl90IFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+ICZCdWZmZXIpID0gMDsKKworICAvLy8gXGJyaWVmIEdpdmVuIGFuIG9mZnNldCBpbnRvIHRoZSBzdHJlYW0sIHJlYWQgYXMgbXVjaCBhcyBwb3NzaWJsZSB3aXRob3V0CisgIC8vLyBjb3B5aW5nIGFueSBkYXRhLgorICB2aXJ0dWFsIEVycm9yIHJlYWRMb25nZXN0Q29udGlndW91c0NodW5rKHVpbnQzMl90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiAmQnVmZmVyKSA9IDA7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIG51bWJlciBvZiBieXRlcyBvZiBkYXRhIGluIHRoaXMgc3RyZWFtLgorICB2aXJ0dWFsIHVpbnQzMl90IGdldExlbmd0aCgpID0gMDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgcHJvcGVydGllcyBvZiB0aGlzIHN0cmVhbS4KKyAgdmlydHVhbCBCaW5hcnlTdHJlYW1GbGFncyBnZXRGbGFncygpIGNvbnN0IHsgcmV0dXJuIEJTRl9Ob25lOyB9CisKK3Byb3RlY3RlZDoKKyAgRXJyb3IgY2hlY2tPZmZzZXRGb3JSZWFkKHVpbnQzMl90IE9mZnNldCwgdWludDMyX3QgRGF0YVNpemUpIHsKKyAgICBpZiAoT2Zmc2V0ID4gZ2V0TGVuZ3RoKCkpCisgICAgICByZXR1cm4gbWFrZV9lcnJvcjxCaW5hcnlTdHJlYW1FcnJvcj4oc3RyZWFtX2Vycm9yX2NvZGU6OmludmFsaWRfb2Zmc2V0KTsKKyAgICBpZiAoZ2V0TGVuZ3RoKCkgPCBEYXRhU2l6ZSArIE9mZnNldCkKKyAgICAgIHJldHVybiBtYWtlX2Vycm9yPEJpbmFyeVN0cmVhbUVycm9yPihzdHJlYW1fZXJyb3JfY29kZTo6c3RyZWFtX3Rvb19zaG9ydCk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgQSBCaW5hcnlTdHJlYW0gd2hpY2ggY2FuIGJlIHJlYWQgZnJvbSBhcyB3ZWxsIGFzIHdyaXR0ZW4gdG8uICBOb3RlCisvLy8gdGhhdCB3cml0aW5nIHRvIGEgQmluYXJ5U3RyZWFtIGFsd2F5cyBuZWNlc3NpdGF0ZXMgY29weWluZyBmcm9tIHRoZSBpbnB1dAorLy8vIGJ1ZmZlciB0byB0aGUgc3RyZWFtJ3MgYmFja2luZyBzdG9yZS4gIFN0cmVhbXMgYXJlIGFzc3VtZWQgdG8gYmUgYnVmZmVyZWQKKy8vLyBzbyB0aGF0IHRvIGJlIHBvcnRhYmxlIGl0IGlzIG5lY2Vzc2FyeSB0byBjYWxsIGNvbW1pdCgpIG9uIHRoZSBzdHJlYW0gd2hlbgorLy8vIGFsbCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4uCitjbGFzcyBXcml0YWJsZUJpbmFyeVN0cmVhbSA6IHB1YmxpYyBCaW5hcnlTdHJlYW0geworcHVibGljOgorICB+V3JpdGFibGVCaW5hcnlTdHJlYW0oKSBvdmVycmlkZSA9IGRlZmF1bHQ7CisKKyAgLy8vIFxicmllZiBBdHRlbXB0IHRvIHdyaXRlIHRoZSBnaXZlbiBieXRlcyBpbnRvIHRoZSBzdHJlYW0gYXQgdGhlIGRlc2lyZWQKKyAgLy8vIG9mZnNldC4gVGhpcyB3aWxsIGFsd2F5cyBuZWNlc3NpdGF0ZSBhIGNvcHkuICBDYW5ub3Qgc2hyaW5rIG9yIGdyb3cgdGhlCisgIC8vLyBzdHJlYW0sIG9ubHkgd3JpdGVzIGludG8gZXhpc3RpbmcgYWxsb2NhdGVkIHNwYWNlLgorICB2aXJ0dWFsIEVycm9yIHdyaXRlQnl0ZXModWludDMyX3QgT2Zmc2V0LCBBcnJheVJlZjx1aW50OF90PiBEYXRhKSA9IDA7CisKKyAgLy8vIFxicmllZiBGb3IgYnVmZmVyZWQgc3RyZWFtcywgY29tbWl0cyBjaGFuZ2VzIHRvIHRoZSBiYWNraW5nIHN0b3JlLgorICB2aXJ0dWFsIEVycm9yIGNvbW1pdCgpID0gMDsKKworICAvLy8gXGJyaWVmIFJldHVybiB0aGUgcHJvcGVydGllcyBvZiB0aGlzIHN0cmVhbS4KKyAgQmluYXJ5U3RyZWFtRmxhZ3MgZ2V0RmxhZ3MoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBCU0ZfV3JpdGU7IH0KKworcHJvdGVjdGVkOgorICBFcnJvciBjaGVja09mZnNldEZvcldyaXRlKHVpbnQzMl90IE9mZnNldCwgdWludDMyX3QgRGF0YVNpemUpIHsKKyAgICBpZiAoIShnZXRGbGFncygpICYgQlNGX0FwcGVuZCkpCisgICAgICByZXR1cm4gY2hlY2tPZmZzZXRGb3JSZWFkKE9mZnNldCwgRGF0YVNpemUpOworCisgICAgaWYgKE9mZnNldCA+IGdldExlbmd0aCgpKQorICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8QmluYXJ5U3RyZWFtRXJyb3I+KHN0cmVhbV9lcnJvcl9jb2RlOjppbnZhbGlkX29mZnNldCk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfQklOQVJZU1RSRUFNX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1BcnJheS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbUFycmF5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2Y1NTYyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1BcnJheS5oCkBAIC0wLDAgKzEsMzU4IEBACisvLz09PS0gQmluYXJ5U3RyZWFtQXJyYXkuaCAtIEFycmF5IGJhY2tlZCBieSBhbiBhcmJpdHJhcnkgc3RyZWFtICotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9CSU5BUllTVFJFQU1BUlJBWV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9CSU5BUllTVFJFQU1BUlJBWV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGludD4KKworLy8vIExpZ2h0d2VpZ2h0IGFycmF5cyB0aGF0IGFyZSBiYWNrZWQgYnkgYW4gYXJiaXRyYXJ5IEJpbmFyeVN0cmVhbS4gIFRoaXMgZmlsZQorLy8vIHByb3ZpZGVzIHR3byBkaWZmZXJlbnQgYXJyYXkgaW1wbGVtZW50YXRpb25zLgorLy8vCisvLy8gICAgIFZhclN0cmVhbUFycmF5IC0gQXJyYXlzIG9mIHZhcmlhYmxlIGxlbmd0aCByZWNvcmRzLiAgVGhlIHVzZXIgc3BlY2lmaWVzCisvLy8gICAgICAgYW4gRXh0cmFjdG9yIHR5cGUgdGhhdCBjYW4gZXh0cmFjdCBhIHJlY29yZCBmcm9tIGEgZ2l2ZW4gb2Zmc2V0IGFuZAorLy8vICAgICAgIHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIGNvbnN1bWVkIGJ5IHRoZSByZWNvcmQuCisvLy8KKy8vLyAgICAgRml4ZWRTdHJlYW1BcnJheSAtIEFycmF5cyBvZiBmaXhlZCBsZW5ndGggcmVjb3Jkcy4gIFRoaXMgaXMgc2ltaWxhciBpbgorLy8vICAgICAgIHNwaXJpdCB0byBBcnJheVJlZjxUPiwgYnV0IHNpbmNlIGl0IGlzIGJhY2tlZCBieSBhIEJpbmFyeVN0cmVhbSwgdGhlCisvLy8gICAgICAgZWxlbWVudHMgb2YgdGhlIGFycmF5IG5lZWQgbm90IGJlIGxhaWQgb3V0IGluIGNvbnRpZ3VvdXMgbWVtb3J5LgorbmFtZXNwYWNlIGxsdm0geworCisvLy8gVmFyU3RyZWFtQXJyYXlFeHRyYWN0b3IgaXMgaW50ZW5kZWQgdG8gYmUgc3BlY2lhbGl6ZWQgdG8gcHJvdmlkZSBjdXN0b21pemVkCisvLy8gZXh0cmFjdGlvbiBsb2dpYy4gIE9uIGlucHV0IGl0IHJlY2VpdmVzIGEgQmluYXJ5U3RyZWFtUmVmIHBvaW50aW5nIHRvIHRoZQorLy8vIGJlZ2lubmluZyBvZiB0aGUgbmV4dCByZWNvcmQsIGJ1dCB3aGVyZSB0aGUgbGVuZ3RoIG9mIHRoZSByZWNvcmQgaXMgbm90IHlldAorLy8vIGtub3duLiAgVXBvbiBjb21wbGV0aW9uLCBpdCBzaG91bGQgcmV0dXJuIGFuIGFwcHJvcHJpYXRlIEVycm9yIGluc3RhbmNlIGlmCisvLy8gYSByZWNvcmQgY291bGQgbm90IGJlIGV4dHJhY3RlZCwgb3IgaWYgb25lIGNvdWxkIGJlIGV4dHJhY3RlZCBpdCBzaG91bGQKKy8vLyByZXR1cm4gc3VjY2VzcyBhbmQgc2V0IExlbiB0byB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoaXMgcmVjb3JkIG9jY3VwaWVkIGluCisvLy8gdGhlIHVuZGVybHlpbmcgc3RyZWFtLCBhbmQgaXQgc2hvdWxkIGZpbGwgb3V0IHRoZSBmaWVsZHMgb2YgdGhlIHZhbHVlIHR5cGUKKy8vLyBJdGVtIGFwcHJvcHJpYXRlbHkgdG8gcmVwcmVzZW50IHRoZSBjdXJyZW50IHJlY29yZC4KKy8vLworLy8vIFlvdSBjYW4gc3BlY2lhbGl6ZSB0aGlzIHRlbXBsYXRlIGZvciB5b3VyIG93biBjdXN0b20gdmFsdWUgdHlwZXMgdG8gYXZvaWQKKy8vLyBoYXZpbmcgdG8gc3BlY2lmeSBhIHNlY29uZCB0ZW1wbGF0ZSBhcmd1bWVudCB0byBWYXJTdHJlYW1BcnJheSAoZG9jdW1lbnRlZAorLy8vIGJlbG93KS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgVmFyU3RyZWFtQXJyYXlFeHRyYWN0b3IgeworICAvLyBNZXRob2QgaW50ZW50aW9uYWxseSBkZWxldGVkLiAgWW91IG11c3QgcHJvdmlkZSBhbiBleHBsaWNpdCBzcGVjaWFsaXphdGlvbgorICAvLyB3aXRoIHRoZSBmb2xsb3dpbmcgbWV0aG9kIGltcGxlbWVudGVkLgorICBFcnJvciBvcGVyYXRvcigpKEJpbmFyeVN0cmVhbVJlZiBTdHJlYW0sIHVpbnQzMl90ICZMZW4sCisgICAgICAgICAgICAgICAgICAgVCAmSXRlbSkgY29uc3QgPSBkZWxldGU7Cit9OworCisvLy8gVmFyU3RyZWFtQXJyYXkgcmVwcmVzZW50cyBhbiBhcnJheSBvZiB2YXJpYWJsZSBsZW5ndGggcmVjb3JkcyBiYWNrZWQgYnkgYQorLy8vIHN0cmVhbS4gIFRoaXMgY291bGQgYmUgYSBjb250aWd1b3VzIHNlcXVlbmNlIG9mIGJ5dGVzIGluIG1lbW9yeSwgaXQgY291bGQKKy8vLyBiZSBhIGZpbGUgb24gZGlzaywgb3IgaXQgY291bGQgYmUgYSBQREIgc3RyZWFtIHdoZXJlIGJ5dGVzIGFyZSBzdG9yZWQgYXMKKy8vLyBkaXNjb250aWd1b3VzIGJsb2NrcyBpbiBhIGZpbGUuICBVc3VhbGx5IGl0IGlzIGRlc2lyYWJsZSB0byB0cmVhdCBhcnJheXMKKy8vLyBhcyBjb250aWd1b3VzIGJsb2NrcyBvZiBtZW1vcnksIGJ1dCBkb2luZyBzbyB3aXRoIGxhcmdlIFBEQiBmaWxlcywgZm9yCisvLy8gZXhhbXBsZSwgY291bGQgbWVhbiBhbGxvY2F0aW5nIGh1Z2UgYW1vdW50cyBvZiBtZW1vcnkganVzdCB0byBhbGxvdworLy8vIHJlLW9yZGVyaW5nIG9mIHN0cmVhbSBkYXRhIHRvIGJlIGNvbnRpZ3VvdXMgYmVmb3JlIGl0ZXJhdGluZyBvdmVyIGl0LiAgQnkKKy8vLyBhYnN0cmFjdGluZyB0aGlzIG91dCwgd2UgbmVlZCBub3QgZHVwbGljYXRlIHRoaXMgbWVtb3J5LCBhbmQgd2UgY2FuCisvLy8gaXRlcmF0ZSBvdmVyIGFycmF5cyBpbiBhcmJpdHJhcmlseSBmb3JtYXR0ZWQgc3RyZWFtcy4gIEVsZW1lbnRzIGFyZSBwYXJzZWQKKy8vLyBsYXppbHkgb24gaXRlcmF0aW9uLCBzbyB0aGVyZSBpcyBubyB1cGZyb250IGNvc3QgYXNzb2NpYXRlZCB3aXRoIGJ1aWxkaW5nCisvLy8gb3IgY29weWluZyBhIFZhclN0cmVhbUFycmF5LCBubyBtYXR0ZXIgaG93IGxhcmdlIGl0IG1heSBiZS4KKy8vLworLy8vIFlvdSBjcmVhdGUgYSBWYXJTdHJlYW1BcnJheSBieSBzcGVjaWZ5aW5nIGEgVmFsdWVUeXBlIGFuZCBhbiBFeHRyYWN0b3IgdHlwZS4KKy8vLyBJZiB5b3UgZG8gbm90IHNwZWNpZnkgYW4gRXh0cmFjdG9yIHR5cGUsIHlvdSBhcmUgZXhwZWN0ZWQgdG8gc3BlY2lhbGl6ZQorLy8vIFZhclN0cmVhbUFycmF5RXh0cmFjdG9yPFQ+IGZvciB5b3VyIFZhbHVlVHlwZS4KKy8vLworLy8vIEJ5IGRlZmF1bHQgYW4gRXh0cmFjdG9yIGlzIGRlZmF1bHQgY29uc3RydWN0ZWQgaW4gdGhlIGNsYXNzLCBidXQgaW4gc29tZQorLy8vIGNhc2VzIHlvdSBtaWdodCBmaW5kIGl0IHVzZWZ1bCBmb3IgYW4gRXh0cmFjdG9yIHRvIG1haW50YWluIHN0YXRlIGFjcm9zcworLy8vIGV4dHJhY3Rpb25zLiAgSW4gdGhpcyBjYXNlIHlvdSBjYW4gcHJvdmlkZSB5b3VyIG93biBFeHRyYWN0b3IgdGhyb3VnaCBhCisvLy8gc2Vjb25kYXJ5IGNvbnN0cnVjdG9yLiAgVGhlIGZvbGxvd2luZyBleGFtcGxlcyBzaG93IHZhcmlvdXMgd2F5cyBvZgorLy8vIGNyZWF0aW5nIGEgVmFyU3RyZWFtQXJyYXkuCisvLy8KKy8vLyAgICAgICAvLyBXaWxsIHVzZSBWYXJTdHJlYW1BcnJheUV4dHJhY3RvcjxNeVR5cGU+IGFzIHRoZSBleHRyYWN0b3IuCisvLy8gICAgICAgVmFyU3RyZWFtQXJyYXk8TXlUeXBlPiBNeVR5cGVBcnJheTsKKy8vLworLy8vICAgICAgIC8vIFdpbGwgdXNlIGEgZGVmYXVsdC1jb25zdHJ1Y3RlZCBNeUV4dHJhY3RvciBhcyB0aGUgZXh0cmFjdG9yLgorLy8vICAgICAgIFZhclN0cmVhbUFycmF5PE15VHlwZSwgTXlFeHRyYWN0b3I+IE15VHlwZUFycmF5MjsKKy8vLworLy8vICAgICAgIC8vIFdpbGwgdXNlIHRoZSBzcGVjaWZpYyBpbnN0YW5jZSBvZiBNeUV4dHJhY3RvciBwcm92aWRlZC4KKy8vLyAgICAgICAvLyBNeUV4dHJhY3RvciBuZWVkIG5vdCBiZSBkZWZhdWx0LWNvbnN0cnVjdGlibGUgaW4gdGhpcyBjYXNlLgorLy8vICAgICAgIE15RXh0cmFjdG9yIEUoU29tZUNvbnRleHQpOworLy8vICAgICAgIFZhclN0cmVhbUFycmF5PE15VHlwZSwgTXlFeHRyYWN0b3I+IE15VHlwZUFycmF5MyhFKTsKKy8vLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWVUeXBlLCB0eXBlbmFtZSBFeHRyYWN0b3I+IGNsYXNzIFZhclN0cmVhbUFycmF5SXRlcmF0b3I7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZVR5cGUsCisgICAgICAgICAgdHlwZW5hbWUgRXh0cmFjdG9yID0gVmFyU3RyZWFtQXJyYXlFeHRyYWN0b3I8VmFsdWVUeXBlPj4KK2NsYXNzIFZhclN0cmVhbUFycmF5IHsKKyAgZnJpZW5kIGNsYXNzIFZhclN0cmVhbUFycmF5SXRlcmF0b3I8VmFsdWVUeXBlLCBFeHRyYWN0b3I+OworCitwdWJsaWM6CisgIHR5cGVkZWYgVmFyU3RyZWFtQXJyYXlJdGVyYXRvcjxWYWx1ZVR5cGUsIEV4dHJhY3Rvcj4gSXRlcmF0b3I7CisKKyAgVmFyU3RyZWFtQXJyYXkoKSA9IGRlZmF1bHQ7CisKKyAgZXhwbGljaXQgVmFyU3RyZWFtQXJyYXkoY29uc3QgRXh0cmFjdG9yICZFKSA6IEUoRSkge30KKworICBleHBsaWNpdCBWYXJTdHJlYW1BcnJheShCaW5hcnlTdHJlYW1SZWYgU3RyZWFtKSA6IFN0cmVhbShTdHJlYW0pIHt9CisKKyAgVmFyU3RyZWFtQXJyYXkoQmluYXJ5U3RyZWFtUmVmIFN0cmVhbSwgY29uc3QgRXh0cmFjdG9yICZFKQorICAgICAgOiBTdHJlYW0oU3RyZWFtKSwgRShFKSB7fQorCisgIEl0ZXJhdG9yIGJlZ2luKGJvb2wgKkhhZEVycm9yID0gbnVsbHB0cikgY29uc3QgeworICAgIHJldHVybiBJdGVyYXRvcigqdGhpcywgRSwgSGFkRXJyb3IpOworICB9CisKKyAgYm9vbCB2YWxpZCgpIGNvbnN0IHsgcmV0dXJuIFN0cmVhbS52YWxpZCgpOyB9CisKKyAgSXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gSXRlcmF0b3IoRSk7IH0KKworICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gU3RyZWFtLmdldExlbmd0aCgpID09IDA7IH0KKworICAvLy8gXGJyaWVmIGdpdmVuIGFuIG9mZnNldCBpbnRvIHRoZSBhcnJheSdzIHVuZGVybHlpbmcgc3RyZWFtLCByZXR1cm4gYW4KKyAgLy8vIGl0ZXJhdG9yIHRvIHRoZSByZWNvcmQgYXQgdGhhdCBvZmZzZXQuICBUaGlzIGlzIGNvbnNpZGVyZWQgdW5zYWZlCisgIC8vLyBzaW5jZSB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkIGlmIFxwIE9mZnNldCBkb2VzIG5vdCByZWZlciB0byB0aGUKKyAgLy8vIGJlZ2lubmluZyBvZiBhIHZhbGlkIHJlY29yZC4KKyAgSXRlcmF0b3IgYXQodWludDMyX3QgT2Zmc2V0KSBjb25zdCB7CisgICAgcmV0dXJuIEl0ZXJhdG9yKCp0aGlzLCBFLCBPZmZzZXQsIG51bGxwdHIpOworICB9CisKKyAgY29uc3QgRXh0cmFjdG9yICZnZXRFeHRyYWN0b3IoKSBjb25zdCB7IHJldHVybiBFOyB9CisgIEV4dHJhY3RvciAmZ2V0RXh0cmFjdG9yKCkgeyByZXR1cm4gRTsgfQorCisgIEJpbmFyeVN0cmVhbVJlZiBnZXRVbmRlcmx5aW5nU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gU3RyZWFtOyB9CisgIHZvaWQgc2V0VW5kZXJseWluZ1N0cmVhbShCaW5hcnlTdHJlYW1SZWYgUykgeyBTdHJlYW0gPSBTOyB9CisKK3ByaXZhdGU6CisgIEJpbmFyeVN0cmVhbVJlZiBTdHJlYW07CisgIEV4dHJhY3RvciBFOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlVHlwZSwgdHlwZW5hbWUgRXh0cmFjdG9yPgorY2xhc3MgVmFyU3RyZWFtQXJyYXlJdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yX2ZhY2FkZV9iYXNlPFZhclN0cmVhbUFycmF5SXRlcmF0b3I8VmFsdWVUeXBlLCBFeHRyYWN0b3I+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIFZhbHVlVHlwZT4geworICB0eXBlZGVmIFZhclN0cmVhbUFycmF5SXRlcmF0b3I8VmFsdWVUeXBlLCBFeHRyYWN0b3I+IEl0ZXJUeXBlOworICB0eXBlZGVmIFZhclN0cmVhbUFycmF5PFZhbHVlVHlwZSwgRXh0cmFjdG9yPiBBcnJheVR5cGU7CisKK3B1YmxpYzoKKyAgVmFyU3RyZWFtQXJyYXlJdGVyYXRvcihjb25zdCBBcnJheVR5cGUgJkFycmF5LCBjb25zdCBFeHRyYWN0b3IgJkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqSGFkRXJyb3IpCisgICAgICA6IFZhclN0cmVhbUFycmF5SXRlcmF0b3IoQXJyYXksIEUsIDAsIEhhZEVycm9yKSB7fQorCisgIFZhclN0cmVhbUFycmF5SXRlcmF0b3IoY29uc3QgQXJyYXlUeXBlICZBcnJheSwgY29uc3QgRXh0cmFjdG9yICZFLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE9mZnNldCwgYm9vbCAqSGFkRXJyb3IpCisgICAgICA6IEl0ZXJSZWYoQXJyYXkuU3RyZWFtLmRyb3BfZnJvbnQoT2Zmc2V0KSksIEV4dHJhY3QoRSksCisgICAgICAgIEFycmF5KCZBcnJheSksIEFic09mZnNldChPZmZzZXQpLCBIYWRFcnJvcihIYWRFcnJvcikgeworICAgIGlmIChJdGVyUmVmLmdldExlbmd0aCgpID09IDApCisgICAgICBtb3ZlVG9FbmQoKTsKKyAgICBlbHNlIHsKKyAgICAgIGF1dG8gRUMgPSBFeHRyYWN0KEl0ZXJSZWYsIFRoaXNMZW4sIFRoaXNWYWx1ZSk7CisgICAgICBpZiAoRUMpIHsKKyAgICAgICAgY29uc3VtZUVycm9yKHN0ZDo6bW92ZShFQykpOworICAgICAgICBtYXJrRXJyb3IoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBWYXJTdHJlYW1BcnJheUl0ZXJhdG9yKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBWYXJTdHJlYW1BcnJheUl0ZXJhdG9yKGNvbnN0IEV4dHJhY3RvciAmRSkgOiBFeHRyYWN0KEUpIHt9CisgIH5WYXJTdHJlYW1BcnJheUl0ZXJhdG9yKCkgPSBkZWZhdWx0OworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJdGVyVHlwZSAmUikgY29uc3QgeworICAgIGlmIChBcnJheSAmJiBSLkFycmF5KSB7CisgICAgICAvLyBCb3RoIGhhdmUgYSB2YWxpZCBhcnJheSwgbWFrZSBzdXJlIHRoZXkncmUgc2FtZS4KKyAgICAgIGFzc2VydChBcnJheSA9PSBSLkFycmF5KTsKKyAgICAgIHJldHVybiBJdGVyUmVmID09IFIuSXRlclJlZjsKKyAgICB9CisKKyAgICAvLyBCb3RoIGl0ZXJhdG9ycyBhcmUgYXQgdGhlIGVuZC4KKyAgICBpZiAoIUFycmF5ICYmICFSLkFycmF5KQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAvLyBPbmUgaXMgbm90IGF0IHRoZSBlbmQgYW5kIG9uZSBpcy4KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBjb25zdCBWYWx1ZVR5cGUgJm9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICBhc3NlcnQoQXJyYXkgJiYgIUhhc0Vycm9yKTsKKyAgICByZXR1cm4gVGhpc1ZhbHVlOworICB9CisKKyAgVmFsdWVUeXBlICZvcGVyYXRvciooKSB7CisgICAgYXNzZXJ0KEFycmF5ICYmICFIYXNFcnJvcik7CisgICAgcmV0dXJuIFRoaXNWYWx1ZTsKKyAgfQorCisgIEl0ZXJUeXBlICZvcGVyYXRvcis9KHVuc2lnbmVkIE4pIHsKKyAgICBmb3IgKHVuc2lnbmVkIEkgPSAwOyBJIDwgTjsgKytJKSB7CisgICAgICAvLyBXZSBhcmUgZG9uZSB3aXRoIHRoZSBjdXJyZW50IHJlY29yZCwgZGlzY2FyZCBpdCBzbyB0aGF0IHdlIGFyZQorICAgICAgLy8gcG9zaXRpb25lZCBhdCB0aGUgbmV4dCByZWNvcmQuCisgICAgICBBYnNPZmZzZXQgKz0gVGhpc0xlbjsKKyAgICAgIEl0ZXJSZWYgPSBJdGVyUmVmLmRyb3BfZnJvbnQoVGhpc0xlbik7CisgICAgICBpZiAoSXRlclJlZi5nZXRMZW5ndGgoKSA9PSAwKSB7CisgICAgICAgIC8vIFRoZXJlIGlzIG5vdGhpbmcgYWZ0ZXIgdGhlIGN1cnJlbnQgcmVjb3JkLCB3ZSBtdXN0IG1ha2UgdGhpcyBhbiBlbmQKKyAgICAgICAgLy8gaXRlcmF0b3IuCisgICAgICAgIG1vdmVUb0VuZCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gVGhlcmUgaXMgc29tZSBkYXRhIGFmdGVyIHRoZSBjdXJyZW50IHJlY29yZC4KKyAgICAgICAgYXV0byBFQyA9IEV4dHJhY3QoSXRlclJlZiwgVGhpc0xlbiwgVGhpc1ZhbHVlKTsKKyAgICAgICAgaWYgKEVDKSB7CisgICAgICAgICAgY29uc3VtZUVycm9yKHN0ZDo6bW92ZShFQykpOworICAgICAgICAgIG1hcmtFcnJvcigpOworICAgICAgICB9IGVsc2UgaWYgKFRoaXNMZW4gPT0gMCkgeworICAgICAgICAgIC8vIEFuIGVtcHR5IHJlY29yZD8gTWFrZSB0aGlzIGFuIGVuZCBpdGVyYXRvci4KKyAgICAgICAgICBtb3ZlVG9FbmQoKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB1aW50MzJfdCBvZmZzZXQoKSBjb25zdCB7IHJldHVybiBBYnNPZmZzZXQ7IH0KKyAgdWludDMyX3QgZ2V0UmVjb3JkTGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gVGhpc0xlbjsgfQorCitwcml2YXRlOgorICB2b2lkIG1vdmVUb0VuZCgpIHsKKyAgICBBcnJheSA9IG51bGxwdHI7CisgICAgVGhpc0xlbiA9IDA7CisgIH0KKyAgdm9pZCBtYXJrRXJyb3IoKSB7CisgICAgbW92ZVRvRW5kKCk7CisgICAgSGFzRXJyb3IgPSB0cnVlOworICAgIGlmIChIYWRFcnJvciAhPSBudWxscHRyKQorICAgICAgKkhhZEVycm9yID0gdHJ1ZTsKKyAgfQorCisgIFZhbHVlVHlwZSBUaGlzVmFsdWU7CisgIEJpbmFyeVN0cmVhbVJlZiBJdGVyUmVmOworICBFeHRyYWN0b3IgRXh0cmFjdDsKKyAgY29uc3QgQXJyYXlUeXBlICpBcnJheXtudWxscHRyfTsKKyAgdWludDMyX3QgVGhpc0xlbnswfTsKKyAgdWludDMyX3QgQWJzT2Zmc2V0ezB9OworICBib29sIEhhc0Vycm9ye2ZhbHNlfTsKKyAgYm9vbCAqSGFkRXJyb3J7bnVsbHB0cn07Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgRml4ZWRTdHJlYW1BcnJheUl0ZXJhdG9yOworCisvLy8gRml4ZWRTdHJlYW1BcnJheSBpcyBzaW1pbGFyIHRvIFZhclN0cmVhbUFycmF5LCBleGNlcHQgd2l0aCBlYWNoIHJlY29yZAorLy8vIGhhdmluZyBhIGZpeGVkLWxlbmd0aC4gIEFzIHdpdGggVmFyU3RyZWFtQXJyYXksIHRoZXJlIGlzIG5vIHVwZnJvbnQKKy8vLyBjb3N0IGFzc29jaWF0ZWQgd2l0aCBidWlsZGluZyBvciBjb3B5aW5nIGEgRml4ZWRTdHJlYW1BcnJheSwgYXMgdGhlCisvLy8gbWVtb3J5IGZvciBlYWNoIGVsZW1lbnQgaXMgbm90IHJlYWQgZnJvbSB0aGUgYmFja2luZyBzdHJlYW0gdW50aWwgdGhhdAorLy8vIGVsZW1lbnQgaXMgaXRlcmF0ZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgRml4ZWRTdHJlYW1BcnJheSB7CisgIGZyaWVuZCBjbGFzcyBGaXhlZFN0cmVhbUFycmF5SXRlcmF0b3I8VD47CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBGaXhlZFN0cmVhbUFycmF5SXRlcmF0b3I8VD4gSXRlcmF0b3I7CisKKyAgRml4ZWRTdHJlYW1BcnJheSgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgRml4ZWRTdHJlYW1BcnJheShCaW5hcnlTdHJlYW1SZWYgU3RyZWFtKSA6IFN0cmVhbShTdHJlYW0pIHsKKyAgICBhc3NlcnQoU3RyZWFtLmdldExlbmd0aCgpICUgc2l6ZW9mKFQpID09IDApOworICB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZpeGVkU3RyZWFtQXJyYXk8VD4gJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIFN0cmVhbSA9PSBPdGhlci5TdHJlYW07CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgRml4ZWRTdHJlYW1BcnJheTxUPiAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSBPdGhlcik7CisgIH0KKworICBGaXhlZFN0cmVhbUFycmF5ICZvcGVyYXRvcj0oY29uc3QgRml4ZWRTdHJlYW1BcnJheSAmKSA9IGRlZmF1bHQ7CisKKyAgY29uc3QgVCAmb3BlcmF0b3JbXSh1aW50MzJfdCBJbmRleCkgY29uc3QgeworICAgIGFzc2VydChJbmRleCA8IHNpemUoKSk7CisgICAgdWludDMyX3QgT2ZmID0gSW5kZXggKiBzaXplb2YoVCk7CisgICAgQXJyYXlSZWY8dWludDhfdD4gRGF0YTsKKyAgICBpZiAoYXV0byBFQyA9IFN0cmVhbS5yZWFkQnl0ZXMoT2ZmLCBzaXplb2YoVCksIERhdGEpKSB7CisgICAgICBhc3NlcnQoZmFsc2UgJiYgIlVuZXhwZWN0ZWQgZmFpbHVyZSByZWFkaW5nIGZyb20gc3RyZWFtIik7CisgICAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4gc2luY2Ugd2UgYXNzZXJ0ZWQgdGhhdCB0aGUgc3RyZWFtIGxlbmd0aCB3YXMKKyAgICAgIC8vIGFuIGV4YWN0IG11bHRpcGxlIG9mIHRoZSBlbGVtZW50IHNpemUuCisgICAgICBjb25zdW1lRXJyb3Ioc3RkOjptb3ZlKEVDKSk7CisgICAgfQorICAgIGFzc2VydChsbHZtOjphbGlnbm1lbnRBZGp1c3RtZW50KERhdGEuZGF0YSgpLCBhbGlnbm9mKFQpKSA9PSAwKTsKKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCAqPihEYXRhLmRhdGEoKSk7CisgIH0KKworICB1aW50MzJfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gU3RyZWFtLmdldExlbmd0aCgpIC8gc2l6ZW9mKFQpOyB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIHNpemUoKSA9PSAwOyB9CisKKyAgRml4ZWRTdHJlYW1BcnJheUl0ZXJhdG9yPFQ+IGJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBGaXhlZFN0cmVhbUFycmF5SXRlcmF0b3I8VD4oKnRoaXMsIDApOworICB9CisKKyAgRml4ZWRTdHJlYW1BcnJheUl0ZXJhdG9yPFQ+IGVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gRml4ZWRTdHJlYW1BcnJheUl0ZXJhdG9yPFQ+KCp0aGlzLCBzaXplKCkpOworICB9CisKKyAgY29uc3QgVCAmZnJvbnQoKSBjb25zdCB7IHJldHVybiAqYmVnaW4oKTsgfQorICBjb25zdCBUICZiYWNrKCkgY29uc3QgeworICAgIEZpeGVkU3RyZWFtQXJyYXlJdGVyYXRvcjxUPiBJID0gZW5kKCk7CisgICAgcmV0dXJuICooLS1JKTsKKyAgfQorCisgIEJpbmFyeVN0cmVhbVJlZiBnZXRVbmRlcmx5aW5nU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gU3RyZWFtOyB9CisKK3ByaXZhdGU6CisgIEJpbmFyeVN0cmVhbVJlZiBTdHJlYW07Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2NsYXNzIEZpeGVkU3RyZWFtQXJyYXlJdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yX2ZhY2FkZV9iYXNlPEZpeGVkU3RyZWFtQXJyYXlJdGVyYXRvcjxUPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBjb25zdCBUPiB7CisKK3B1YmxpYzoKKyAgRml4ZWRTdHJlYW1BcnJheUl0ZXJhdG9yKGNvbnN0IEZpeGVkU3RyZWFtQXJyYXk8VD4gJkFycmF5LCB1aW50MzJfdCBJbmRleCkKKyAgICAgIDogQXJyYXkoQXJyYXkpLCBJbmRleChJbmRleCkge30KKworICBGaXhlZFN0cmVhbUFycmF5SXRlcmF0b3I8VD4gJgorICBvcGVyYXRvcj0oY29uc3QgRml4ZWRTdHJlYW1BcnJheUl0ZXJhdG9yPFQ+ICZPdGhlcikgeworICAgIEFycmF5ID0gT3RoZXIuQXJyYXk7CisgICAgSW5kZXggPSBPdGhlci5JbmRleDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBjb25zdCBUICZvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBBcnJheVtJbmRleF07IH0KKyAgY29uc3QgVCAmb3BlcmF0b3IqKCkgeyByZXR1cm4gQXJyYXlbSW5kZXhdOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEZpeGVkU3RyZWFtQXJyYXlJdGVyYXRvcjxUPiAmUikgY29uc3QgeworICAgIGFzc2VydChBcnJheSA9PSBSLkFycmF5KTsKKyAgICByZXR1cm4gKEluZGV4ID09IFIuSW5kZXgpICYmIChBcnJheSA9PSBSLkFycmF5KTsKKyAgfQorCisgIEZpeGVkU3RyZWFtQXJyYXlJdGVyYXRvcjxUPiAmb3BlcmF0b3IrPShzdGQ6OnB0cmRpZmZfdCBOKSB7CisgICAgSW5kZXggKz0gTjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBGaXhlZFN0cmVhbUFycmF5SXRlcmF0b3I8VD4gJm9wZXJhdG9yLT0oc3RkOjpwdHJkaWZmX3QgTikgeworICAgIGFzc2VydChzdGQ6OnB0cmRpZmZfdChJbmRleCkgPj0gTik7CisgICAgSW5kZXggLT0gTjsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBzdGQ6OnB0cmRpZmZfdCBvcGVyYXRvci0oY29uc3QgRml4ZWRTdHJlYW1BcnJheUl0ZXJhdG9yPFQ+ICZSKSBjb25zdCB7CisgICAgYXNzZXJ0KEFycmF5ID09IFIuQXJyYXkpOworICAgIGFzc2VydChJbmRleCA+PSBSLkluZGV4KTsKKyAgICByZXR1cm4gSW5kZXggLSBSLkluZGV4OworICB9CisKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgRml4ZWRTdHJlYW1BcnJheUl0ZXJhdG9yPFQ+ICZSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoQXJyYXkgPT0gUkhTLkFycmF5KTsKKyAgICByZXR1cm4gSW5kZXggPCBSSFMuSW5kZXg7CisgIH0KKworcHJpdmF0ZToKKyAgRml4ZWRTdHJlYW1BcnJheTxUPiBBcnJheTsKKyAgdWludDMyX3QgSW5kZXg7Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfQklOQVJZU1RSRUFNQVJSQVlfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbUVycm9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtRXJyb3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZDk2OTlkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbUVycm9yLmgKQEAgLTAsMCArMSw0OCBAQAorLy89PT0tIEJpbmFyeVN0cmVhbUVycm9yLmggLSBFcnJvciBleHRlbnNpb25zIGZvciBCaW5hcnkgU3RyZWFtcyAqLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQklOQVJZU1RSRUFNRVJST1JfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQklOQVJZU1RSRUFNRVJST1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKK2VudW0gY2xhc3Mgc3RyZWFtX2Vycm9yX2NvZGUgeworICB1bnNwZWNpZmllZCwKKyAgc3RyZWFtX3Rvb19zaG9ydCwKKyAgaW52YWxpZF9hcnJheV9zaXplLAorICBpbnZhbGlkX29mZnNldCwKKyAgZmlsZXN5c3RlbV9lcnJvcgorfTsKKworLy8vIEJhc2UgY2xhc3MgZm9yIGVycm9ycyBvcmlnaW5hdGluZyB3aGVuIHBhcnNpbmcgcmF3IFBEQiBmaWxlcworY2xhc3MgQmluYXJ5U3RyZWFtRXJyb3IgOiBwdWJsaWMgRXJyb3JJbmZvPEJpbmFyeVN0cmVhbUVycm9yPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworICBleHBsaWNpdCBCaW5hcnlTdHJlYW1FcnJvcihzdHJlYW1fZXJyb3JfY29kZSBDKTsKKyAgZXhwbGljaXQgQmluYXJ5U3RyZWFtRXJyb3IoU3RyaW5nUmVmIENvbnRleHQpOworICBCaW5hcnlTdHJlYW1FcnJvcihzdHJlYW1fZXJyb3JfY29kZSBDLCBTdHJpbmdSZWYgQ29udGV4dCk7CisKKyAgdm9pZCBsb2cocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZTsKKyAgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0IG92ZXJyaWRlOworCisgIFN0cmluZ1JlZiBnZXRFcnJvck1lc3NhZ2UoKSBjb25zdDsKKworICBzdHJlYW1fZXJyb3JfY29kZSBnZXRFcnJvckNvZGUoKSBjb25zdCB7IHJldHVybiBDb2RlOyB9CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIEVyck1zZzsKKyAgc3RyZWFtX2Vycm9yX2NvZGUgQ29kZTsKK307Cit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfQklOQVJZU1RSRUFNRVJST1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlYWRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlNWViYjIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVhZGVyLmgKQEAgLTAsMCArMSwyNzAgQEAKKy8vPT09LSBCaW5hcnlTdHJlYW1SZWFkZXIuaCAtIFJlYWRzIG9iamVjdHMgZnJvbSBhIGJpbmFyeSBzdHJlYW0gKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0JJTkFSWVNUUkVBTVJFQURFUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9CSU5BUllTVFJFQU1SRUFERVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtQXJyYXkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbnZlcnRVVEYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFxicmllZiBQcm92aWRlcyByZWFkIG9ubHkgYWNjZXNzIHRvIGEgc3ViY2xhc3Mgb2YgYEJpbmFyeVN0cmVhbWAuICBQcm92aWRlcworLy8vIGJvdW5kcyBjaGVja2luZyBhbmQgaGVscGVycyBmb3Igd3JpdGluZyBjZXJ0YWluIGNvbW1vbiBkYXRhIHR5cGVzIHN1Y2ggYXMKKy8vLyBudWxsLXRlcm1pbmF0ZWQgc3RyaW5ncywgaW50ZWdlcnMgaW4gdmFyaW91cyBmbGF2b3JzIG9mIGVuZGlhbm5lc3MsIGV0Yy4KKy8vLyBDYW4gYmUgc3ViY2xhc3NlZCB0byBwcm92aWRlIHJlYWRpbmcgb2YgY3VzdG9tIGRhdGF0eXBlcywgYWx0aG91Z2ggbm8KKy8vLyBhcmUgb3ZlcnJpZGFibGUuCitjbGFzcyBCaW5hcnlTdHJlYW1SZWFkZXIgeworcHVibGljOgorICBCaW5hcnlTdHJlYW1SZWFkZXIoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IEJpbmFyeVN0cmVhbVJlYWRlcihCaW5hcnlTdHJlYW1SZWYgUmVmKTsKKyAgZXhwbGljaXQgQmluYXJ5U3RyZWFtUmVhZGVyKEJpbmFyeVN0cmVhbSAmU3RyZWFtKTsKKyAgZXhwbGljaXQgQmluYXJ5U3RyZWFtUmVhZGVyKEFycmF5UmVmPHVpbnQ4X3Q+IERhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbik7CisgIGV4cGxpY2l0IEJpbmFyeVN0cmVhbVJlYWRlcihTdHJpbmdSZWYgRGF0YSwgbGx2bTo6c3VwcG9ydDo6ZW5kaWFubmVzcyBFbmRpYW4pOworCisgIEJpbmFyeVN0cmVhbVJlYWRlcihjb25zdCBCaW5hcnlTdHJlYW1SZWFkZXIgJk90aGVyKQorICAgICAgOiBTdHJlYW0oT3RoZXIuU3RyZWFtKSwgT2Zmc2V0KE90aGVyLk9mZnNldCkge30KKworICBCaW5hcnlTdHJlYW1SZWFkZXIgJm9wZXJhdG9yPShjb25zdCBCaW5hcnlTdHJlYW1SZWFkZXIgJk90aGVyKSB7CisgICAgU3RyZWFtID0gT3RoZXIuU3RyZWFtOworICAgIE9mZnNldCA9IE90aGVyLk9mZnNldDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB2aXJ0dWFsIH5CaW5hcnlTdHJlYW1SZWFkZXIoKSB7fQorCisgIC8vLyBSZWFkIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJpbmcgYXQgdGhlIGN1cnJlbnQgb2Zmc2V0CisgIC8vLyB3aXRob3V0IGludm9raW5nIGEgY29weSwgYW5kIHNldCBccCBCdWZmZXIgdG8gdGhlIHJlc3VsdGluZyBkYXRhIHNsaWNlLgorICAvLy8gVXBkYXRlcyB0aGUgc3RyZWFtJ3Mgb2Zmc2V0IHRvIHBvaW50IGFmdGVyIHRoZSBuZXdseSByZWFkIGRhdGEuCisgIC8vLworICAvLy8gXHJldHVybnMgYSBzdWNjZXNzIGVycm9yIGNvZGUgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZWFkLCBvdGhlcndpc2UKKyAgLy8vIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAgRXJyb3IgcmVhZExvbmdlc3RDb250aWd1b3VzQ2h1bmsoQXJyYXlSZWY8dWludDhfdD4gJkJ1ZmZlcik7CisKKyAgLy8vIFJlYWQgXHAgU2l6ZSBieXRlcyBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBhdCB0aGUgY3VycmVudCBvZmZzZXQgYW5kCisgIC8vLyBhbmQgc2V0IFxwIEJ1ZmZlciB0byB0aGUgcmVzdWx0aW5nIGRhdGEgc2xpY2UuICBXaGV0aGVyIGEgY29weSBvY2N1cnMKKyAgLy8vIGRlcGVuZHMgb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4gIFVwZGF0ZXMgdGhlCisgIC8vLyBzdHJlYW0ncyBvZmZzZXQgdG8gcG9pbnQgYWZ0ZXIgdGhlIG5ld2x5IHJlYWQgZGF0YS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHN1Y2Nlc3MgZXJyb3IgY29kZSBpZiB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHJlYWQsIG90aGVyd2lzZQorICAvLy8gcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICBFcnJvciByZWFkQnl0ZXMoQXJyYXlSZWY8dWludDhfdD4gJkJ1ZmZlciwgdWludDMyX3QgU2l6ZSk7CisKKyAgLy8vIFJlYWQgYW4gaW50ZWdlciBvZiB0aGUgc3BlY2lmaWVkIGVuZGlhbm5lc3MgaW50byBccCBEZXN0IGFuZCB1cGRhdGUgdGhlCisgIC8vLyBzdHJlYW0ncyBvZmZzZXQuICBUaGUgZGF0YSBpcyBhbHdheXMgY29waWVkIGZyb20gdGhlIHN0cmVhbSdzIHVuZGVybHlpbmcKKyAgLy8vIGJ1ZmZlciBpbnRvIFxwIERlc3QuIFVwZGF0ZXMgdGhlIHN0cmVhbSdzIG9mZnNldCB0byBwb2ludCBhZnRlciB0aGUgbmV3bHkKKyAgLy8vIHJlYWQgZGF0YS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHN1Y2Nlc3MgZXJyb3IgY29kZSBpZiB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHJlYWQsIG90aGVyd2lzZQorICAvLy8gcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gRXJyb3IgcmVhZEludGVnZXIoVCAmRGVzdCkgeworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNhbGwgcmVhZEludGVnZXIgd2l0aCBub24taW50ZWdyYWwgdmFsdWUhIik7CisKKyAgICBBcnJheVJlZjx1aW50OF90PiBCeXRlczsKKyAgICBpZiAoYXV0byBFQyA9IHJlYWRCeXRlcyhCeXRlcywgc2l6ZW9mKFQpKSkKKyAgICAgIHJldHVybiBFQzsKKworICAgIERlc3QgPSBsbHZtOjpzdXBwb3J0OjplbmRpYW46OnJlYWQ8VCwgbGx2bTo6c3VwcG9ydDo6dW5hbGlnbmVkPigKKyAgICAgICAgQnl0ZXMuZGF0YSgpLCBTdHJlYW0uZ2V0RW5kaWFuKCkpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgLy8vIFNpbWlsYXIgdG8gcmVhZEludGVnZXIuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBFcnJvciByZWFkRW51bShUICZEZXN0KSB7CisgICAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX2VudW08VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIkNhbm5vdCBjYWxsIHJlYWRFbnVtIHdpdGggbm9uLWVudW0gdmFsdWUhIik7CisgICAgdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8VD46OnR5cGUgTjsKKyAgICBpZiAoYXV0byBFQyA9IHJlYWRJbnRlZ2VyKE4pKQorICAgICAgcmV0dXJuIEVDOworICAgIERlc3QgPSBzdGF0aWNfY2FzdDxUPihOKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIC8vLyBSZWFkIGEgbnVsbCB0ZXJtaW5hdGVkIHN0cmluZyBmcm9tIFxwIERlc3QuICBXaGV0aGVyIGEgY29weSBvY2N1cnMgZGVwZW5kcworICAvLy8gb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4gIFVwZGF0ZXMgdGhlIHN0cmVhbSdzCisgIC8vLyBvZmZzZXQgdG8gcG9pbnQgYWZ0ZXIgdGhlIG5ld2x5IHJlYWQgZGF0YS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHN1Y2Nlc3MgZXJyb3IgY29kZSBpZiB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHJlYWQsIG90aGVyd2lzZQorICAvLy8gcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICBFcnJvciByZWFkQ1N0cmluZyhTdHJpbmdSZWYgJkRlc3QpOworCisgIC8vLyBTaW1pbGFyIHRvIHJlYWRDU3RyaW5nLCBob3dldmVyIHJlYWQgYSBudWxsLXRlcm1pbmF0ZWQgVVRGMTYgc3RyaW5nCisgIC8vLyBpbnN0ZWFkLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgc3VjY2VzcyBlcnJvciBjb2RlIGlmIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgcmVhZCwgb3RoZXJ3aXNlCisgIC8vLyByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgIEVycm9yIHJlYWRXaWRlU3RyaW5nKEFycmF5UmVmPFVURjE2PiAmRGVzdCk7CisKKyAgLy8vIFJlYWQgYSBccCBMZW5ndGggYnl0ZSBzdHJpbmcgaW50byBccCBEZXN0LiAgV2hldGhlciBhIGNvcHkgb2NjdXJzIGRlcGVuZHMKKyAgLy8vIG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdW5kZXJseWluZyBzdHJlYW0uICBVcGRhdGVzIHRoZSBzdHJlYW0ncworICAvLy8gb2Zmc2V0IHRvIHBvaW50IGFmdGVyIHRoZSBuZXdseSByZWFkIGRhdGEuCisgIC8vLworICAvLy8gXHJldHVybnMgYSBzdWNjZXNzIGVycm9yIGNvZGUgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZWFkLCBvdGhlcndpc2UKKyAgLy8vIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAgRXJyb3IgcmVhZEZpeGVkU3RyaW5nKFN0cmluZ1JlZiAmRGVzdCwgdWludDMyX3QgTGVuZ3RoKTsKKworICAvLy8gUmVhZCB0aGUgZW50aXJlIHJlbWFpbmRlciBvZiB0aGUgdW5kZXJseWluZyBzdHJlYW0gaW50byBccCBSZWYuICBUaGlzIGlzCisgIC8vLyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgZ2V0VW5kZXJseWluZ1N0cmVhbSgpLnNsaWNlKE9mZnNldCkuICBVcGRhdGVzIHRoZQorICAvLy8gc3RyZWFtJ3Mgb2Zmc2V0IHRvIHBvaW50IHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4gIE5ldmVyIGNhdXNlcyBhIGNvcHkuCisgIC8vLworICAvLy8gXHJldHVybnMgYSBzdWNjZXNzIGVycm9yIGNvZGUgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZWFkLCBvdGhlcndpc2UKKyAgLy8vIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAgRXJyb3IgcmVhZFN0cmVhbVJlZihCaW5hcnlTdHJlYW1SZWYgJlJlZik7CisKKyAgLy8vIFJlYWQgXHAgTGVuZ3RoIGJ5dGVzIGZyb20gdGhlIHVuZGVybHlpbmcgc3RyZWFtIGludG8gXHAgUmVmLiAgVGhpcyBpcworICAvLy8gZXF1aXZhbGVudCB0byBjYWxsaW5nIGdldFVuZGVybHlpbmdTdHJlYW0oKS5zbGljZShPZmZzZXQsIExlbmd0aCkuCisgIC8vLyBVcGRhdGVzIHRoZSBzdHJlYW0ncyBvZmZzZXQgdG8gcG9pbnQgYWZ0ZXIgdGhlIG5ld2x5IHJlYWQgb2JqZWN0LiAgTmV2ZXIKKyAgLy8vIGNhdXNlcyBhIGNvcHkuCisgIC8vLworICAvLy8gXHJldHVybnMgYSBzdWNjZXNzIGVycm9yIGNvZGUgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZWFkLCBvdGhlcndpc2UKKyAgLy8vIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAgRXJyb3IgcmVhZFN0cmVhbVJlZihCaW5hcnlTdHJlYW1SZWYgJlJlZiwgdWludDMyX3QgTGVuZ3RoKTsKKworICAvLy8gUmVhZCBccCBMZW5ndGggYnl0ZXMgZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0gaW50byBccCBTdHJlYW0uICBUaGlzIGlzCisgIC8vLyBlcXVpdmFsZW50IHRvIGNhbGxpbmcgZ2V0VW5kZXJseWluZ1N0cmVhbSgpLnNsaWNlKE9mZnNldCwgTGVuZ3RoKS4KKyAgLy8vIFVwZGF0ZXMgdGhlIHN0cmVhbSdzIG9mZnNldCB0byBwb2ludCBhZnRlciB0aGUgbmV3bHkgcmVhZCBvYmplY3QuICBOZXZlcgorICAvLy8gY2F1c2VzIGEgY29weS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHN1Y2Nlc3MgZXJyb3IgY29kZSBpZiB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHJlYWQsIG90aGVyd2lzZQorICAvLy8gcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICBFcnJvciByZWFkU3Vic3RyZWFtKEJpbmFyeVN1YnN0cmVhbVJlZiAmU3RyZWFtLCB1aW50MzJfdCBTaXplKTsKKworICAvLy8gR2V0IGEgcG9pbnRlciB0byBhbiBvYmplY3Qgb2YgdHlwZSBUIGZyb20gdGhlIHVuZGVybHlpbmcgc3RyZWFtLCBhcyBpZiBieQorICAvLy8gbWVtY3B5LCBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbnRvIFxwIERlc3QuICBJdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvCisgIC8vLyBlbnN1cmUgdGhhdCBvYmplY3RzIG9mIHR5cGUgVCBjYW4gYmUgc2FmZWx5IHRyZWF0ZWQgaW4gdGhpcyBtYW5uZXIuCisgIC8vLyBVcGRhdGVzIHRoZSBzdHJlYW0ncyBvZmZzZXQgdG8gcG9pbnQgYWZ0ZXIgdGhlIG5ld2x5IHJlYWQgb2JqZWN0LiAgV2hldGhlcgorICAvLy8gYSBjb3B5IG9jY3VycyBkZXBlbmRzIHVwb24gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nCisgIC8vLyBzdHJlYW0uCisgIC8vLworICAvLy8gXHJldHVybnMgYSBzdWNjZXNzIGVycm9yIGNvZGUgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZWFkLCBvdGhlcndpc2UKKyAgLy8vIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEVycm9yIHJlYWRPYmplY3QoY29uc3QgVCAqJkRlc3QpIHsKKyAgICBBcnJheVJlZjx1aW50OF90PiBCdWZmZXI7CisgICAgaWYgKGF1dG8gRUMgPSByZWFkQnl0ZXMoQnVmZmVyLCBzaXplb2YoVCkpKQorICAgICAgcmV0dXJuIEVDOworICAgIERlc3QgPSByZWludGVycHJldF9jYXN0PGNvbnN0IFQgKj4oQnVmZmVyLmRhdGEoKSk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICAvLy8gR2V0IGEgcmVmZXJlbmNlIHRvIGEgXHAgTnVtRWxlbWVudHMgZWxlbWVudCBhcnJheSBvZiBvYmplY3RzIG9mIHR5cGUgVAorICAvLy8gZnJvbSB0aGUgdW5kZXJseWluZyBzdHJlYW0gYXMgaWYgYnkgbWVtY3B5LCBhbmQgc3RvcmUgdGhlIHJlc3VsdGluZyBhcnJheQorICAvLy8gc2xpY2UgaW50byBccCBhcnJheS4gIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gZW5zdXJlIHRoYXQgb2JqZWN0cyBvZgorICAvLy8gdHlwZSBUIGNhbiBiZSBzYWZlbHkgdHJlYXRlZCBpbiB0aGlzIG1hbm5lci4gIFVwZGF0ZXMgdGhlIHN0cmVhbSdzIG9mZnNldAorICAvLy8gdG8gcG9pbnQgYWZ0ZXIgdGhlIG5ld2x5IHJlYWQgb2JqZWN0LiAgV2hldGhlciBhIGNvcHkgb2NjdXJzIGRlcGVuZHMgdXBvbgorICAvLy8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHN1Y2Nlc3MgZXJyb3IgY29kZSBpZiB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHJlYWQsIG90aGVyd2lzZQorICAvLy8gcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgRXJyb3IgcmVhZEFycmF5KEFycmF5UmVmPFQ+ICZBcnJheSwgdWludDMyX3QgTnVtRWxlbWVudHMpIHsKKyAgICBBcnJheVJlZjx1aW50OF90PiBCeXRlczsKKyAgICBpZiAoTnVtRWxlbWVudHMgPT0gMCkgeworICAgICAgQXJyYXkgPSBBcnJheVJlZjxUPigpOworICAgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgICAgfQorCisgICAgaWYgKE51bUVsZW1lbnRzID4gVUlOVDMyX01BWCAvIHNpemVvZihUKSkKKyAgICAgIHJldHVybiBtYWtlX2Vycm9yPEJpbmFyeVN0cmVhbUVycm9yPigKKyAgICAgICAgICBzdHJlYW1fZXJyb3JfY29kZTo6aW52YWxpZF9hcnJheV9zaXplKTsKKworICAgIGlmIChhdXRvIEVDID0gcmVhZEJ5dGVzKEJ5dGVzLCBOdW1FbGVtZW50cyAqIHNpemVvZihUKSkpCisgICAgICByZXR1cm4gRUM7CisKKyAgICBhc3NlcnQoYWxpZ25tZW50QWRqdXN0bWVudChCeXRlcy5kYXRhKCksIGFsaWdub2YoVCkpID09IDAgJiYKKyAgICAgICAgICAgIlJlYWRpbmcgYXQgaW52YWxpZCBhbGlnbm1lbnQhIik7CisKKyAgICBBcnJheSA9IEFycmF5UmVmPFQ+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCAqPihCeXRlcy5kYXRhKCkpLCBOdW1FbGVtZW50cyk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICAvLy8gUmVhZCBhIFZhclN0cmVhbUFycmF5IG9mIHNpemUgXHAgU2l6ZSBieXRlcyBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbnRvCisgIC8vLyBccCBBcnJheS4gIFVwZGF0ZXMgdGhlIHN0cmVhbSdzIG9mZnNldCB0byBwb2ludCBhZnRlciB0aGUgbmV3bHkgcmVhZAorICAvLy8gYXJyYXkuICBOZXZlciBjYXVzZXMgYSBjb3B5IChhbHRob3VnaCBpdGVyYXRpbmcgdGhlIGVsZW1lbnRzIG9mIHRoZQorICAvLy8gVmFyU3RyZWFtQXJyYXkgbWF5LCBkZXBlbmRpbmcgdXBvbiB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHVuZGVybHlpbmcKKyAgLy8vIHN0cmVhbSkuCisgIC8vLworICAvLy8gXHJldHVybnMgYSBzdWNjZXNzIGVycm9yIGNvZGUgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSByZWFkLCBvdGhlcndpc2UKKyAgLy8vIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CisgIEVycm9yIHJlYWRBcnJheShWYXJTdHJlYW1BcnJheTxULCBVPiAmQXJyYXksIHVpbnQzMl90IFNpemUpIHsKKyAgICBCaW5hcnlTdHJlYW1SZWYgUzsKKyAgICBpZiAoYXV0byBFQyA9IHJlYWRTdHJlYW1SZWYoUywgU2l6ZSkpCisgICAgICByZXR1cm4gRUM7CisgICAgQXJyYXkuc2V0VW5kZXJseWluZ1N0cmVhbShTKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorCisgIC8vLyBSZWFkIGEgRml4ZWRTdHJlYW1BcnJheSBvZiBccCBOdW1JdGVtcyBlbGVtZW50cyBhbmQgc3RvcmUgdGhlIHJlc3VsdCBpbnRvCisgIC8vLyBccCBBcnJheS4gIFVwZGF0ZXMgdGhlIHN0cmVhbSdzIG9mZnNldCB0byBwb2ludCBhZnRlciB0aGUgbmV3bHkgcmVhZAorICAvLy8gYXJyYXkuICBOZXZlciBjYXVzZXMgYSBjb3B5IChhbHRob3VnaCBpdGVyYXRpbmcgdGhlIGVsZW1lbnRzIG9mIHRoZQorICAvLy8gRml4ZWRTdHJlYW1BcnJheSBtYXksIGRlcGVuZGluZyB1cG9uIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgdW5kZXJseWluZworICAvLy8gc3RyZWFtKS4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHN1Y2Nlc3MgZXJyb3IgY29kZSBpZiB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHJlYWQsIG90aGVyd2lzZQorICAvLy8gcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgRXJyb3IgcmVhZEFycmF5KEZpeGVkU3RyZWFtQXJyYXk8VD4gJkFycmF5LCB1aW50MzJfdCBOdW1JdGVtcykgeworICAgIGlmIChOdW1JdGVtcyA9PSAwKSB7CisgICAgICBBcnJheSA9IEZpeGVkU3RyZWFtQXJyYXk8VD4oKTsKKyAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICAgIH0KKworICAgIGlmIChOdW1JdGVtcyA+IFVJTlQzMl9NQVggLyBzaXplb2YoVCkpCisgICAgICByZXR1cm4gbWFrZV9lcnJvcjxCaW5hcnlTdHJlYW1FcnJvcj4oCisgICAgICAgICAgc3RyZWFtX2Vycm9yX2NvZGU6OmludmFsaWRfYXJyYXlfc2l6ZSk7CisKKyAgICBCaW5hcnlTdHJlYW1SZWYgVmlldzsKKyAgICBpZiAoYXV0byBFQyA9IHJlYWRTdHJlYW1SZWYoVmlldywgTnVtSXRlbXMgKiBzaXplb2YoVCkpKQorICAgICAgcmV0dXJuIEVDOworCisgICAgQXJyYXkgPSBGaXhlZFN0cmVhbUFycmF5PFQ+KFZpZXcpOworICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICB9CisKKyAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIGJ5dGVzUmVtYWluaW5nKCkgPT0gMDsgfQorICB2b2lkIHNldE9mZnNldCh1aW50MzJfdCBPZmYpIHsgT2Zmc2V0ID0gT2ZmOyB9CisgIHVpbnQzMl90IGdldE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIE9mZnNldDsgfQorICB1aW50MzJfdCBnZXRMZW5ndGgoKSBjb25zdCB7IHJldHVybiBTdHJlYW0uZ2V0TGVuZ3RoKCk7IH0KKyAgdWludDMyX3QgYnl0ZXNSZW1haW5pbmcoKSBjb25zdCB7IHJldHVybiBnZXRMZW5ndGgoKSAtIGdldE9mZnNldCgpOyB9CisKKyAgLy8vIEFkdmFuY2UgdGhlIHN0cmVhbSdzIG9mZnNldCBieSBccCBBbW91bnQgYnl0ZXMuCisgIC8vLworICAvLy8gXHJldHVybnMgYSBzdWNjZXNzIGVycm9yIGNvZGUgaWYgYXQgbGVhc3QgXHAgQW1vdW50IGJ5dGVzIHJlbWFpbiBpbiB0aGUKKyAgLy8vIHN0cmVhbSwgb3RoZXJ3aXNlIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAgRXJyb3Igc2tpcCh1aW50MzJfdCBBbW91bnQpOworCisgIC8vLyBFeGFtaW5lIHRoZSBuZXh0IGJ5dGUgb2YgdGhlIHVuZGVybHlpbmcgc3RyZWFtIHdpdGhvdXQgYWR2YW5jaW5nIHRoZQorICAvLy8gc3RyZWFtJ3Mgb2Zmc2V0LiAgSWYgdGhlIHN0cmVhbSBpcyBlbXB0eSB0aGUgYmVoYXZpb3IgaXMgdW5kZWZpbmVkLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIHRoZSBuZXh0IGJ5dGUgaW4gdGhlIHN0cmVhbS4KKyAgdWludDhfdCBwZWVrKCkgY29uc3Q7CisKKyAgRXJyb3IgcGFkVG9BbGlnbm1lbnQodWludDMyX3QgQWxpZ24pOworCisgIHN0ZDo6cGFpcjxCaW5hcnlTdHJlYW1SZWFkZXIsIEJpbmFyeVN0cmVhbVJlYWRlcj4KKyAgc3BsaXQodWludDMyX3QgT2Zmc2V0KSBjb25zdDsKKworcHJpdmF0ZToKKyAgQmluYXJ5U3RyZWFtUmVmIFN0cmVhbTsKKyAgdWludDMyX3QgT2Zmc2V0ID0gMDsKK307Cit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfQklOQVJZU1RSRUFNUkVBREVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWYuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWYuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2YzNTViCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbVJlZi5oCkBAIC0wLDAgKzEsMjc1IEBACisvLz09PS0gQmluYXJ5U3RyZWFtUmVmLmggLSBBIGNvcHlhYmxlIHJlZmVyZW5jZSB0byBhIHN0cmVhbSAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9CSU5BUllTVFJFQU1SRUZfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQklOQVJZU1RSRUFNUkVGX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0JpbmFyeVN0cmVhbUVycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBDb21tb24gc3R1ZmYgZm9yIG11dGFibGUgYW5kIGltbXV0YWJsZSBTdHJlYW1SZWZzLgordGVtcGxhdGUgPGNsYXNzIFJlZlR5cGUsIGNsYXNzIFN0cmVhbVR5cGU+IGNsYXNzIEJpbmFyeVN0cmVhbVJlZkJhc2UgeworcHJvdGVjdGVkOgorICBCaW5hcnlTdHJlYW1SZWZCYXNlKCkgPSBkZWZhdWx0OworICBleHBsaWNpdCBCaW5hcnlTdHJlYW1SZWZCYXNlKFN0cmVhbVR5cGUgJkJvcnJvd2VkSW1wbCkKKyAgICAgIDogQm9ycm93ZWRJbXBsKCZCb3Jyb3dlZEltcGwpLCBWaWV3T2Zmc2V0KDApIHsKKyAgICBpZiAoIShCb3Jyb3dlZEltcGwuZ2V0RmxhZ3MoKSAmIEJTRl9BcHBlbmQpKQorICAgICAgTGVuZ3RoID0gQm9ycm93ZWRJbXBsLmdldExlbmd0aCgpOworICB9CisKKyAgQmluYXJ5U3RyZWFtUmVmQmFzZShzdGQ6OnNoYXJlZF9wdHI8U3RyZWFtVHlwZT4gU2hhcmVkSW1wbCwgdWludDMyX3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHVpbnQzMl90PiBMZW5ndGgpCisgICAgICA6IFNoYXJlZEltcGwoU2hhcmVkSW1wbCksIEJvcnJvd2VkSW1wbChTaGFyZWRJbXBsLmdldCgpKSwKKyAgICAgICAgVmlld09mZnNldChPZmZzZXQpLCBMZW5ndGgoTGVuZ3RoKSB7fQorICBCaW5hcnlTdHJlYW1SZWZCYXNlKFN0cmVhbVR5cGUgJkJvcnJvd2VkSW1wbCwgdWludDMyX3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHVpbnQzMl90PiBMZW5ndGgpCisgICAgICA6IEJvcnJvd2VkSW1wbCgmQm9ycm93ZWRJbXBsKSwgVmlld09mZnNldChPZmZzZXQpLCBMZW5ndGgoTGVuZ3RoKSB7fQorICBCaW5hcnlTdHJlYW1SZWZCYXNlKGNvbnN0IEJpbmFyeVN0cmVhbVJlZkJhc2UgJk90aGVyKSA9IGRlZmF1bHQ7CisgIEJpbmFyeVN0cmVhbVJlZkJhc2UgJm9wZXJhdG9yPShjb25zdCBCaW5hcnlTdHJlYW1SZWZCYXNlICZPdGhlcikgPSBkZWZhdWx0OworCisgIEJpbmFyeVN0cmVhbVJlZkJhc2UgJm9wZXJhdG9yPShCaW5hcnlTdHJlYW1SZWZCYXNlICYmT3RoZXIpID0gZGVmYXVsdDsKKyAgQmluYXJ5U3RyZWFtUmVmQmFzZShCaW5hcnlTdHJlYW1SZWZCYXNlICYmT3RoZXIpID0gZGVmYXVsdDsKKworcHVibGljOgorICBsbHZtOjpzdXBwb3J0OjplbmRpYW5uZXNzIGdldEVuZGlhbigpIGNvbnN0IHsKKyAgICByZXR1cm4gQm9ycm93ZWRJbXBsLT5nZXRFbmRpYW4oKTsKKyAgfQorCisgIHVpbnQzMl90IGdldExlbmd0aCgpIGNvbnN0IHsKKyAgICBpZiAoTGVuZ3RoLmhhc1ZhbHVlKCkpCisgICAgICByZXR1cm4gKkxlbmd0aDsKKworICAgIHJldHVybiBCb3Jyb3dlZEltcGwgPyAoQm9ycm93ZWRJbXBsLT5nZXRMZW5ndGgoKSAtIFZpZXdPZmZzZXQpIDogMDsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSBuZXcgQmluYXJ5U3RyZWFtUmVmIHdpdGggdGhlIGZpcnN0IFxwIE4gZWxlbWVudHMgcmVtb3ZlZC4gIElmCisgIC8vLyB0aGlzIEJpbmFyeVN0cmVhbVJlZiBpcyBsZW5ndGgtdHJhY2tpbmcsIHRoZW4gdGhlIHJlc3VsdGluZyBvbmUgd2lsbCBiZQorICAvLy8gdG9vLgorICBSZWZUeXBlIGRyb3BfZnJvbnQodWludDMyX3QgTikgY29uc3QgeworICAgIGlmICghQm9ycm93ZWRJbXBsKQorICAgICAgcmV0dXJuIFJlZlR5cGUoKTsKKworICAgIE4gPSBzdGQ6Om1pbihOLCBnZXRMZW5ndGgoKSk7CisgICAgUmVmVHlwZSBSZXN1bHQoc3RhdGljX2Nhc3Q8Y29uc3QgUmVmVHlwZSAmPigqdGhpcykpOworICAgIGlmIChOID09IDApCisgICAgICByZXR1cm4gUmVzdWx0OworCisgICAgUmVzdWx0LlZpZXdPZmZzZXQgKz0gTjsKKyAgICBpZiAoUmVzdWx0Lkxlbmd0aC5oYXNWYWx1ZSgpKQorICAgICAgKlJlc3VsdC5MZW5ndGggLT0gTjsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgLy8vIFJldHVybiBhIG5ldyBCaW5hcnlTdHJlYW1SZWYgd2l0aCB0aGUgbGFzdCBccCBOIGVsZW1lbnRzIHJlbW92ZWQuICBJZgorICAvLy8gdGhpcyBCaW5hcnlTdHJlYW1SZWYgaXMgbGVuZ3RoLXRyYWNraW5nIGFuZCBccCBOIGlzIGdyZWF0ZXIgdGhhbiAwLCB0aGVuCisgIC8vLyB0aGlzIEJpbmFyeVN0cmVhbVJlZiB3aWxsIG5vIGxvbmdlciBsZW5ndGgtdHJhY2suCisgIFJlZlR5cGUgZHJvcF9iYWNrKHVpbnQzMl90IE4pIGNvbnN0IHsKKyAgICBpZiAoIUJvcnJvd2VkSW1wbCkKKyAgICAgIHJldHVybiBSZWZUeXBlKCk7CisKKyAgICBSZWZUeXBlIFJlc3VsdChzdGF0aWNfY2FzdDxjb25zdCBSZWZUeXBlICY+KCp0aGlzKSk7CisgICAgTiA9IHN0ZDo6bWluKE4sIGdldExlbmd0aCgpKTsKKworICAgIGlmIChOID09IDApCisgICAgICByZXR1cm4gUmVzdWx0OworCisgICAgLy8gU2luY2Ugd2UncmUgZHJvcHBpbmcgbm9uLXplcm8gYnl0ZXMgZnJvbSB0aGUgZW5kLCBzdG9wIGxlbmd0aC10cmFja2luZworICAgIC8vIGJ5IHNldHRpbmcgdGhlIGxlbmd0aCBvZiB0aGUgcmVzdWx0aW5nIFN0cmVhbVJlZiB0byBhbiBleHBsaWNpdCB2YWx1ZS4KKyAgICBpZiAoIVJlc3VsdC5MZW5ndGguaGFzVmFsdWUoKSkKKyAgICAgIFJlc3VsdC5MZW5ndGggPSBnZXRMZW5ndGgoKTsKKworICAgICpSZXN1bHQuTGVuZ3RoIC09IE47CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSBuZXcgQmluYXJ5U3RyZWFtUmVmIHdpdGggb25seSB0aGUgZmlyc3QgXHAgTiBlbGVtZW50cyByZW1haW5pbmcuCisgIFJlZlR5cGUga2VlcF9mcm9udCh1aW50MzJfdCBOKSBjb25zdCB7CisgICAgYXNzZXJ0KE4gPD0gZ2V0TGVuZ3RoKCkpOworICAgIHJldHVybiBkcm9wX2JhY2soZ2V0TGVuZ3RoKCkgLSBOKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYSBuZXcgQmluYXJ5U3RyZWFtUmVmIHdpdGggb25seSB0aGUgbGFzdCBccCBOIGVsZW1lbnRzIHJlbWFpbmluZy4KKyAgUmVmVHlwZSBrZWVwX2JhY2sodWludDMyX3QgTikgY29uc3QgeworICAgIGFzc2VydChOIDw9IGdldExlbmd0aCgpKTsKKyAgICByZXR1cm4gZHJvcF9mcm9udChnZXRMZW5ndGgoKSAtIE4pOworICB9CisKKyAgLy8vIFJldHVybiBhIG5ldyBCaW5hcnlTdHJlYW1SZWYgd2l0aCB0aGUgZmlyc3QgYW5kIGxhc3QgXHAgTiBlbGVtZW50cworICAvLy8gcmVtb3ZlZC4KKyAgUmVmVHlwZSBkcm9wX3N5bW1ldHJpYyh1aW50MzJfdCBOKSBjb25zdCB7CisgICAgcmV0dXJuIGRyb3BfZnJvbnQoTikuZHJvcF9iYWNrKE4pOworICB9CisKKyAgLy8vIFJldHVybiBhIG5ldyBCaW5hcnlTdHJlYW1SZWYgd2l0aCB0aGUgZmlyc3QgXHAgT2Zmc2V0IGVsZW1lbnRzIHJlbW92ZWQsCisgIC8vLyBhbmQgcmV0YWluaW5nIGV4YWN0bHkgXHAgTGVuIGVsZW1lbnRzLgorICBSZWZUeXBlIHNsaWNlKHVpbnQzMl90IE9mZnNldCwgdWludDMyX3QgTGVuKSBjb25zdCB7CisgICAgcmV0dXJuIGRyb3BfZnJvbnQoT2Zmc2V0KS5rZWVwX2Zyb250KExlbik7CisgIH0KKworICBib29sIHZhbGlkKCkgY29uc3QgeyByZXR1cm4gQm9ycm93ZWRJbXBsICE9IG51bGxwdHI7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgUmVmVHlwZSAmT3RoZXIpIGNvbnN0IHsKKyAgICBpZiAoQm9ycm93ZWRJbXBsICE9IE90aGVyLkJvcnJvd2VkSW1wbCkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoVmlld09mZnNldCAhPSBPdGhlci5WaWV3T2Zmc2V0KQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChMZW5ndGggIT0gT3RoZXIuTGVuZ3RoKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworICB9CisKK3Byb3RlY3RlZDoKKyAgRXJyb3IgY2hlY2tPZmZzZXRGb3JSZWFkKHVpbnQzMl90IE9mZnNldCwgdWludDMyX3QgRGF0YVNpemUpIGNvbnN0IHsKKyAgICBpZiAoT2Zmc2V0ID4gZ2V0TGVuZ3RoKCkpCisgICAgICByZXR1cm4gbWFrZV9lcnJvcjxCaW5hcnlTdHJlYW1FcnJvcj4oc3RyZWFtX2Vycm9yX2NvZGU6OmludmFsaWRfb2Zmc2V0KTsKKyAgICBpZiAoZ2V0TGVuZ3RoKCkgPCBEYXRhU2l6ZSArIE9mZnNldCkKKyAgICAgIHJldHVybiBtYWtlX2Vycm9yPEJpbmFyeVN0cmVhbUVycm9yPihzdHJlYW1fZXJyb3JfY29kZTo6c3RyZWFtX3Rvb19zaG9ydCk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICBzdGQ6OnNoYXJlZF9wdHI8U3RyZWFtVHlwZT4gU2hhcmVkSW1wbDsKKyAgU3RyZWFtVHlwZSAqQm9ycm93ZWRJbXBsID0gbnVsbHB0cjsKKyAgdWludDMyX3QgVmlld09mZnNldCA9IDA7CisgIE9wdGlvbmFsPHVpbnQzMl90PiBMZW5ndGg7Cit9OworCisvLy8gXGJyaWVmIEJpbmFyeVN0cmVhbVJlZiBpcyB0byBCaW5hcnlTdHJlYW0gd2hhdCBBcnJheVJlZiBpcyB0byBhbiBBcnJheS4gIEl0CisvLy8gcHJvdmlkZXMgY29weS1zZW1hbnRpY3MgYW5kIHJlYWQgb25seSBhY2Nlc3MgdG8gYSAid2luZG93IiBvZiB0aGUgdW5kZXJseWluZworLy8vIEJpbmFyeVN0cmVhbS4gTm90ZSB0aGF0IEJpbmFyeVN0cmVhbVJlZiBpcyAqbm90KiBhIEJpbmFyeVN0cmVhbS4gIFRoYXQgaXMgdG8KKy8vLyBzYXksIGl0IGRvZXMgbm90IGluaGVyaXQgYW5kIG92ZXJyaWRlIHRoZSBtZXRob2RzIG9mIEJpbmFyeVN0cmVhbS4gIEluCisvLy8gZ2VuZXJhbCwgeW91IHNob3VsZCBub3QgcGFzcyBhcm91bmQgcG9pbnRlcnMgb3IgcmVmZXJlbmNlcyB0byBCaW5hcnlTdHJlYW1zCisvLy8gYW5kIHVzZSBpbmhlcml0YW5jZSB0byBhY2hpZXZlIHBvbHltb3JwaGlzbS4gIEluc3RlYWQsIHlvdSBzaG91bGQgcGFzcworLy8vIGFyb3VuZCBCaW5hcnlTdHJlYW1SZWZzIGJ5IHZhbHVlIGFuZCBhY2hpZXZlIHBvbHltb3JwaGlzbSB0aGF0IHdheS4KK2NsYXNzIEJpbmFyeVN0cmVhbVJlZgorICAgIDogcHVibGljIEJpbmFyeVN0cmVhbVJlZkJhc2U8QmluYXJ5U3RyZWFtUmVmLCBCaW5hcnlTdHJlYW0+IHsKKyAgZnJpZW5kIEJpbmFyeVN0cmVhbVJlZkJhc2U8QmluYXJ5U3RyZWFtUmVmLCBCaW5hcnlTdHJlYW0+OworICBmcmllbmQgY2xhc3MgV3JpdGFibGVCaW5hcnlTdHJlYW1SZWY7CisgIEJpbmFyeVN0cmVhbVJlZihzdGQ6OnNoYXJlZF9wdHI8QmluYXJ5U3RyZWFtPiBJbXBsLCB1aW50MzJfdCBWaWV3T2Zmc2V0LAorICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8dWludDMyX3Q+IExlbmd0aCkKKyAgICAgIDogQmluYXJ5U3RyZWFtUmVmQmFzZShJbXBsLCBWaWV3T2Zmc2V0LCBMZW5ndGgpIHt9CisKK3B1YmxpYzoKKyAgQmluYXJ5U3RyZWFtUmVmKCkgPSBkZWZhdWx0OworICBCaW5hcnlTdHJlYW1SZWYoQmluYXJ5U3RyZWFtICZTdHJlYW0pOworICBCaW5hcnlTdHJlYW1SZWYoQmluYXJ5U3RyZWFtICZTdHJlYW0sIHVpbnQzMl90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHVpbnQzMl90PiBMZW5ndGgpOworICBleHBsaWNpdCBCaW5hcnlTdHJlYW1SZWYoQXJyYXlSZWY8dWludDhfdD4gRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OnN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFuKTsKKyAgZXhwbGljaXQgQmluYXJ5U3RyZWFtUmVmKFN0cmluZ1JlZiBEYXRhLCBsbHZtOjpzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbik7CisKKyAgQmluYXJ5U3RyZWFtUmVmKGNvbnN0IEJpbmFyeVN0cmVhbVJlZiAmT3RoZXIpID0gZGVmYXVsdDsKKyAgQmluYXJ5U3RyZWFtUmVmICZvcGVyYXRvcj0oY29uc3QgQmluYXJ5U3RyZWFtUmVmICZPdGhlcikgPSBkZWZhdWx0OworICBCaW5hcnlTdHJlYW1SZWYoQmluYXJ5U3RyZWFtUmVmICYmT3RoZXIpID0gZGVmYXVsdDsKKyAgQmluYXJ5U3RyZWFtUmVmICZvcGVyYXRvcj0oQmluYXJ5U3RyZWFtUmVmICYmT3RoZXIpID0gZGVmYXVsdDsKKworICAvLyBVc2UgQmluYXJ5U3RyZWFtUmVmLnNsaWNlKCkgaW5zdGVhZC4KKyAgQmluYXJ5U3RyZWFtUmVmKEJpbmFyeVN0cmVhbVJlZiAmUywgdWludDMyX3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgdWludDMyX3QgTGVuZ3RoKSA9IGRlbGV0ZTsKKworICAvLy8gR2l2ZW4gYW4gT2Zmc2V0IGludG8gdGhpcyBTdHJlYW1SZWYgYW5kIGEgU2l6ZSwgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIGEKKyAgLy8vIGJ1ZmZlciBvd25lZCBieSB0aGUgc3RyZWFtLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgc3VjY2VzcyBlcnJvciBjb2RlIGlmIHRoZSBlbnRpcmUgcmFuZ2Ugb2YgZGF0YSBpcyB3aXRoaW4gdGhlCisgIC8vLyBib3VuZHMgb2YgdGhpcyBCaW5hcnlTdHJlYW1SZWYncyB2aWV3IGFuZCB0aGUgaW1wbGVtZW50YXRpb24gY291bGQgcmVhZAorICAvLy8gdGhlIGRhdGEsIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgRXJyb3IgcmVhZEJ5dGVzKHVpbnQzMl90IE9mZnNldCwgdWludDMyX3QgU2l6ZSwKKyAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+ICZCdWZmZXIpIGNvbnN0OworCisgIC8vLyBHaXZlbiBhbiBPZmZzZXQgaW50byB0aGlzIEJpbmFyeVN0cmVhbVJlZiwgcmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZQorICAvLy8gbGFyZ2VzdCBidWZmZXIgdGhlIHN0cmVhbSBjb3VsZCBzdXBwb3J0IHdpdGhvdXQgbmVjZXNzaXRhdGluZyBhIGNvcHkuCisgIC8vLworICAvLy8gXHJldHVybnMgYSBzdWNjZXNzIGVycm9yIGNvZGUgaWYgaW1wbGVtZW50YXRpb24gY291bGQgcmVhZCB0aGUgZGF0YSwKKyAgLy8vIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgRXJyb3IgcmVhZExvbmdlc3RDb250aWd1b3VzQ2h1bmsodWludDMyX3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjx1aW50OF90PiAmQnVmZmVyKSBjb25zdDsKK307CisKK3N0cnVjdCBCaW5hcnlTdWJzdHJlYW1SZWYgeworICB1aW50MzJfdCBPZmZzZXQ7ICAgICAgICAgICAgLy8gT2Zmc2V0IGluIHRoZSBwYXJlbnQgc3RyZWFtCisgIEJpbmFyeVN0cmVhbVJlZiBTdHJlYW1EYXRhOyAvLyBTdHJlYW0gRGF0YQorCisgIEJpbmFyeVN1YnN0cmVhbVJlZiBzbGljZSh1aW50MzJfdCBPZmYsIHVpbnQzMl90IFNpemUpIGNvbnN0IHsKKyAgICBCaW5hcnlTdHJlYW1SZWYgU3ViU3ViID0gU3RyZWFtRGF0YS5zbGljZShPZmYsIFNpemUpOworICAgIHJldHVybiB7T2ZmICsgT2Zmc2V0LCBTdWJTdWJ9OworICB9CisgIEJpbmFyeVN1YnN0cmVhbVJlZiBkcm9wX2Zyb250KHVpbnQzMl90IE4pIGNvbnN0IHsKKyAgICByZXR1cm4gc2xpY2UoTiwgc2l6ZSgpIC0gTik7CisgIH0KKyAgQmluYXJ5U3Vic3RyZWFtUmVmIGtlZXBfZnJvbnQodWludDMyX3QgTikgY29uc3QgeyByZXR1cm4gc2xpY2UoMCwgTik7IH0KKworICBzdGQ6OnBhaXI8QmluYXJ5U3Vic3RyZWFtUmVmLCBCaW5hcnlTdWJzdHJlYW1SZWY+CisgIHNwbGl0KHVpbnQzMl90IE9mZnNldCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihrZWVwX2Zyb250KE9mZnNldCksIGRyb3BfZnJvbnQoT2Zmc2V0KSk7CisgIH0KKworICB1aW50MzJfdCBzaXplKCkgY29uc3QgeyByZXR1cm4gU3RyZWFtRGF0YS5nZXRMZW5ndGgoKTsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gc2l6ZSgpID09IDA7IH0KK307CisKK2NsYXNzIFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmCisgICAgOiBwdWJsaWMgQmluYXJ5U3RyZWFtUmVmQmFzZTxXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdyaXRhYmxlQmluYXJ5U3RyZWFtPiB7CisgIGZyaWVuZCBCaW5hcnlTdHJlYW1SZWZCYXNlPFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmLCBXcml0YWJsZUJpbmFyeVN0cmVhbT47CisgIFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmKHN0ZDo6c2hhcmVkX3B0cjxXcml0YWJsZUJpbmFyeVN0cmVhbT4gSW1wbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgVmlld09mZnNldCwgT3B0aW9uYWw8dWludDMyX3Q+IExlbmd0aCkKKyAgICAgIDogQmluYXJ5U3RyZWFtUmVmQmFzZShJbXBsLCBWaWV3T2Zmc2V0LCBMZW5ndGgpIHt9CisKKyAgRXJyb3IgY2hlY2tPZmZzZXRGb3JXcml0ZSh1aW50MzJfdCBPZmZzZXQsIHVpbnQzMl90IERhdGFTaXplKSBjb25zdCB7CisgICAgaWYgKCEoQm9ycm93ZWRJbXBsLT5nZXRGbGFncygpICYgQlNGX0FwcGVuZCkpCisgICAgICByZXR1cm4gY2hlY2tPZmZzZXRGb3JSZWFkKE9mZnNldCwgRGF0YVNpemUpOworCisgICAgaWYgKE9mZnNldCA+IGdldExlbmd0aCgpKQorICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8QmluYXJ5U3RyZWFtRXJyb3I+KHN0cmVhbV9lcnJvcl9jb2RlOjppbnZhbGlkX29mZnNldCk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworcHVibGljOgorICBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZigpID0gZGVmYXVsdDsKKyAgV3JpdGFibGVCaW5hcnlTdHJlYW1SZWYoV3JpdGFibGVCaW5hcnlTdHJlYW0gJlN0cmVhbSk7CisgIFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmKFdyaXRhYmxlQmluYXJ5U3RyZWFtICZTdHJlYW0sIHVpbnQzMl90IE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8dWludDMyX3Q+IExlbmd0aCk7CisgIGV4cGxpY2l0IFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmKE11dGFibGVBcnJheVJlZjx1aW50OF90PiBEYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsbHZtOjpzdXBwb3J0OjplbmRpYW5uZXNzIEVuZGlhbik7CisgIFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmKGNvbnN0IFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmICZPdGhlcikgPSBkZWZhdWx0OworICBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiAmCisgIG9wZXJhdG9yPShjb25zdCBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiAmT3RoZXIpID0gZGVmYXVsdDsKKworICBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZihXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiAmJk90aGVyKSA9IGRlZmF1bHQ7CisgIFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmICZvcGVyYXRvcj0oV3JpdGFibGVCaW5hcnlTdHJlYW1SZWYgJiZPdGhlcikgPSBkZWZhdWx0OworCisgIC8vIFVzZSBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZi5zbGljZSgpIGluc3RlYWQuCisgIFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmKFdyaXRhYmxlQmluYXJ5U3RyZWFtUmVmICZTLCB1aW50MzJfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IExlbmd0aCkgPSBkZWxldGU7CisKKyAgLy8vIEdpdmVuIGFuIE9mZnNldCBpbnRvIHRoaXMgV3JpdGFibGVCaW5hcnlTdHJlYW1SZWYgYW5kIHNvbWUgaW5wdXQgZGF0YSwKKyAgLy8vIHdyaXRlcyB0aGUgZGF0YSB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgIC8vLworICAvLy8gXHJldHVybnMgYSBzdWNjZXNzIGVycm9yIGNvZGUgaWYgdGhlIGRhdGEgY291bGQgZml0IHdpdGhpbiB0aGUgdW5kZXJseWluZworICAvLy8gc3RyZWFtIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gYW5kIHRoZSBpbXBsZW1lbnRhdGlvbiBjb3VsZCB3cml0ZSB0aGUKKyAgLy8vIGRhdGEsIGFuZCBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlIG90aGVyd2lzZS4KKyAgRXJyb3Igd3JpdGVCeXRlcyh1aW50MzJfdCBPZmZzZXQsIEFycmF5UmVmPHVpbnQ4X3Q+IERhdGEpIGNvbnN0OworCisgIC8vLyBDb252ZXIgdGhpcyBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiB0byBhIHJlYWQtb25seSBCaW5hcnlTdHJlYW1SZWYuCisgIG9wZXJhdG9yIEJpbmFyeVN0cmVhbVJlZigpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgRm9yIGJ1ZmZlcmVkIHN0cmVhbXMsIGNvbW1pdHMgY2hhbmdlcyB0byB0aGUgYmFja2luZyBzdG9yZS4KKyAgRXJyb3IgY29tbWl0KCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0JJTkFSWVNUUkVBTVJFRl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtV3JpdGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQmluYXJ5U3RyZWFtV3JpdGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjMxZGI4NwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1Xcml0ZXIuaApAQCAtMCwwICsxLDE4MyBAQAorLy89PT0tIEJpbmFyeVN0cmVhbVdyaXRlci5oIC0gV3JpdGVzIG9iamVjdHMgdG8gYSBCaW5hcnlTdHJlYW0gLS0tKi0gQysrLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQklOQVJZU1RSRUFNV1JJVEVSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0JJTkFSWVNUUkVBTVdSSVRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1BcnJheS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9CaW5hcnlTdHJlYW1SZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBcYnJpZWYgUHJvdmlkZXMgd3JpdGUgb25seSBhY2Nlc3MgdG8gYSBzdWJjbGFzcyBvZiBgV3JpdGFibGVCaW5hcnlTdHJlYW1gLgorLy8vIFByb3ZpZGVzIGJvdW5kcyBjaGVja2luZyBhbmQgaGVscGVycyBmb3Igd3JpdGluZyBjZXJ0YWluIGNvbW1vbiBkYXRhIHR5cGVzCisvLy8gc3VjaCBhcyBudWxsLXRlcm1pbmF0ZWQgc3RyaW5ncywgaW50ZWdlcnMgaW4gdmFyaW91cyBmbGF2b3JzIG9mIGVuZGlhbm5lc3MsCisvLy8gZXRjLiAgQ2FuIGJlIHN1YmNsYXNzZWQgdG8gcHJvdmlkZSByZWFkaW5nIGFuZCB3cml0aW5nIG9mIGN1c3RvbSBkYXRhdHlwZXMsCisvLy8gYWx0aG91Z2ggbm8gbWV0aG9kcyBhcmUgb3ZlcnJpZGFibGUuCitjbGFzcyBCaW5hcnlTdHJlYW1Xcml0ZXIgeworcHVibGljOgorICBCaW5hcnlTdHJlYW1Xcml0ZXIoKSA9IGRlZmF1bHQ7CisgIGV4cGxpY2l0IEJpbmFyeVN0cmVhbVdyaXRlcihXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiBSZWYpOworICBleHBsaWNpdCBCaW5hcnlTdHJlYW1Xcml0ZXIoV3JpdGFibGVCaW5hcnlTdHJlYW0gJlN0cmVhbSk7CisgIGV4cGxpY2l0IEJpbmFyeVN0cmVhbVdyaXRlcihNdXRhYmxlQXJyYXlSZWY8dWludDhfdD4gRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxsdm06OnN1cHBvcnQ6OmVuZGlhbm5lc3MgRW5kaWFuKTsKKworICBCaW5hcnlTdHJlYW1Xcml0ZXIoY29uc3QgQmluYXJ5U3RyZWFtV3JpdGVyICZPdGhlcikKKyAgICAgIDogU3RyZWFtKE90aGVyLlN0cmVhbSksIE9mZnNldChPdGhlci5PZmZzZXQpIHt9CisKKyAgQmluYXJ5U3RyZWFtV3JpdGVyICZvcGVyYXRvcj0oY29uc3QgQmluYXJ5U3RyZWFtV3JpdGVyICZPdGhlcikgeworICAgIFN0cmVhbSA9IE90aGVyLlN0cmVhbTsKKyAgICBPZmZzZXQgPSBPdGhlci5PZmZzZXQ7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdmlydHVhbCB+QmluYXJ5U3RyZWFtV3JpdGVyKCkge30KKworICAvLy8gV3JpdGUgdGhlIGJ5dGVzIHNwZWNpZmllZCBpbiBccCBCdWZmZXIgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAvLy8gT24gc3VjY2VzcywgdXBkYXRlcyB0aGUgb2Zmc2V0IHNvIHRoYXQgc3Vic2VxdWVudCB3cml0ZXMgd2lsbCBvY2N1cgorICAvLy8gYXQgdGhlIG5leHQgdW53cml0dGVuIHBvc2l0aW9uLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgc3VjY2VzcyBlcnJvciBjb2RlIGlmIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgd3JpdHRlbiwKKyAgLy8vIG90aGVyd2lzZSByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgIEVycm9yIHdyaXRlQnl0ZXMoQXJyYXlSZWY8dWludDhfdD4gQnVmZmVyKTsKKworICAvLy8gV3JpdGUgdGhlIGludGVnZXIgXHAgVmFsdWUgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtIGluIHRoZQorICAvLy8gc3BlY2lmaWVkIGVuZGlhbm5lc3MuICBPbiBzdWNjZXNzLCB1cGRhdGVzIHRoZSBvZmZzZXQgc28gdGhhdAorICAvLy8gc3Vic2VxdWVudCB3cml0ZXMgb2NjdXIgYXQgdGhlIG5leHQgdW53cml0dGVuIHBvc2l0aW9uLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgc3VjY2VzcyBlcnJvciBjb2RlIGlmIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgd3JpdHRlbiwKKyAgLy8vIG90aGVyd2lzZSByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBFcnJvciB3cml0ZUludGVnZXIoVCBWYWx1ZSkgeworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19pbnRlZ3JhbDxUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAiQ2Fubm90IGNhbGwgd3JpdGVJbnRlZ2VyIHdpdGggbm9uLWludGVncmFsIHZhbHVlISIpOworICAgIHVpbnQ4X3QgQnVmZmVyW3NpemVvZihUKV07CisgICAgbGx2bTo6c3VwcG9ydDo6ZW5kaWFuOjp3cml0ZTxULCBsbHZtOjpzdXBwb3J0Ojp1bmFsaWduZWQ+KAorICAgICAgICBCdWZmZXIsIFZhbHVlLCBTdHJlYW0uZ2V0RW5kaWFuKCkpOworICAgIHJldHVybiB3cml0ZUJ5dGVzKEJ1ZmZlcik7CisgIH0KKworICAvLy8gU2ltaWxhciB0byB3cml0ZUludGVnZXIKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEVycm9yIHdyaXRlRW51bShUIE51bSkgeworICAgIHN0YXRpY19hc3NlcnQoc3RkOjppc19lbnVtPFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICJDYW5ub3QgY2FsbCB3cml0ZUVudW0gd2l0aCBub24tRW51bSB0eXBlIik7CisKKyAgICB1c2luZyBVID0gdHlwZW5hbWUgc3RkOjp1bmRlcmx5aW5nX3R5cGU8VD46OnR5cGU7CisgICAgcmV0dXJuIHdyaXRlSW50ZWdlcjxVPihzdGF0aWNfY2FzdDxVPihOdW0pKTsKKyAgfQorCisgIC8vLyBXcml0ZSB0aGUgc3RyaW5nIFxwIFN0ciB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0gZm9sbG93ZWQgYnkgYSBudWxsCisgIC8vLyB0ZXJtaW5hdG9yLiAgT24gc3VjY2VzcywgdXBkYXRlcyB0aGUgb2Zmc2V0IHNvIHRoYXQgc3Vic2VxdWVudCB3cml0ZXMKKyAgLy8vIG9jY3VyIGF0IHRoZSBuZXh0IHVud3JpdHRlbiBwb3NpdGlvbi4gIFxwIFN0ciBuZWVkIG5vdCBiZSBudWxsIHRlcm1pbmF0ZWQKKyAgLy8vIG9uIGlucHV0LgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgc3VjY2VzcyBlcnJvciBjb2RlIGlmIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgd3JpdHRlbiwKKyAgLy8vIG90aGVyd2lzZSByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgIEVycm9yIHdyaXRlQ1N0cmluZyhTdHJpbmdSZWYgU3RyKTsKKworICAvLy8gV3JpdGUgdGhlIHN0cmluZyBccCBTdHIgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtIHdpdGhvdXQgYSBudWxsCisgIC8vLyB0ZXJtaW5hdG9yLiAgT24gc3VjY2VzcywgdXBkYXRlcyB0aGUgb2Zmc2V0IHNvIHRoYXQgc3Vic2VxdWVudCB3cml0ZXMKKyAgLy8vIG9jY3VyIGF0IHRoZSBuZXh0IHVud3JpdHRlbiBwb3NpdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHN1Y2Nlc3MgZXJyb3IgY29kZSBpZiB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4sCisgIC8vLyBvdGhlcndpc2UgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICBFcnJvciB3cml0ZUZpeGVkU3RyaW5nKFN0cmluZ1JlZiBTdHIpOworCisgIC8vLyBFZmZpY2llbnRseSByZWFkcyBhbGwgZGF0YSBmcm9tIFxwIFJlZiwgYW5kIHdyaXRlcyBpdCB0byB0aGlzIHN0cmVhbS4KKyAgLy8vIFRoaXMgb3BlcmF0aW9uIHdpbGwgbm90IGludm9rZSBhbnkgY29waWVzIG9mIHRoZSBzb3VyY2UgZGF0YSwgcmVnYXJkbGVzcworICAvLy8gb2YgdGhlIHNvdXJjZSBzdHJlYW0ncyBpbXBsZW1lbnRhdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHN1Y2Nlc3MgZXJyb3IgY29kZSBpZiB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4sCisgIC8vLyBvdGhlcndpc2UgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICBFcnJvciB3cml0ZVN0cmVhbVJlZihCaW5hcnlTdHJlYW1SZWYgUmVmKTsKKworICAvLy8gRWZmaWNpZW50bHkgcmVhZHMgXHAgU2l6ZSBieXRlcyBmcm9tIFxwIFJlZiwgYW5kIHdyaXRlcyBpdCB0byB0aGlzIHN0cmVhbS4KKyAgLy8vIFRoaXMgb3BlcmF0aW9uIHdpbGwgbm90IGludm9rZSBhbnkgY29waWVzIG9mIHRoZSBzb3VyY2UgZGF0YSwgcmVnYXJkbGVzcworICAvLy8gb2YgdGhlIHNvdXJjZSBzdHJlYW0ncyBpbXBsZW1lbnRhdGlvbi4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBhIHN1Y2Nlc3MgZXJyb3IgY29kZSBpZiB0aGUgZGF0YSB3YXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4sCisgIC8vLyBvdGhlcndpc2UgcmV0dXJucyBhbiBhcHByb3ByaWF0ZSBlcnJvciBjb2RlLgorICBFcnJvciB3cml0ZVN0cmVhbVJlZihCaW5hcnlTdHJlYW1SZWYgUmVmLCB1aW50MzJfdCBTaXplKTsKKworICAvLy8gV3JpdGVzIHRoZSBvYmplY3QgXHAgT2JqIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSwgYXMgaWYgYnkgdXNpbmcgbWVtY3B5LgorICAvLy8gSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0byBlbnN1cmUgdGhhdCB0eXBlIG9mIFxwIE9iaiBjYW4gYmUgc2FmZWx5IGNvcGllZAorICAvLy8gaW4gdGhpcyBmYXNoaW9uLCBhcyBubyBjaGVja3MgYXJlIG1hZGUgdG8gZW5zdXJlIHRoYXQgdGhpcyBpcyBzYWZlLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgc3VjY2VzcyBlcnJvciBjb2RlIGlmIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgd3JpdHRlbiwKKyAgLy8vIG90aGVyd2lzZSByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBFcnJvciB3cml0ZU9iamVjdChjb25zdCBUICZPYmopIHsKKyAgICBzdGF0aWNfYXNzZXJ0KCFzdGQ6OmlzX3BvaW50ZXI8VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIndyaXRlT2JqZWN0IHNob3VsZCBub3QgYmUgdXNlZCB3aXRoIHBvaW50ZXJzLCB0byB3cml0ZSAiCisgICAgICAgICAgICAgICAgICAidGhlIHBvaW50ZWQtdG8gdmFsdWUgZGVyZWZlcmVuY2UgdGhlIHBvaW50ZXIgYmVmb3JlIGNhbGxpbmcgIgorICAgICAgICAgICAgICAgICAgIndyaXRlT2JqZWN0Iik7CisgICAgcmV0dXJuIHdyaXRlQnl0ZXMoCisgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPigmT2JqKSwgc2l6ZW9mKFQpKSk7CisgIH0KKworICAvLy8gV3JpdGVzIGFuIGFycmF5IG9mIG9iamVjdHMgb2YgdHlwZSBUIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSwgYXMgaWYgYnkKKyAgLy8vIHVzaW5nIG1lbWNweS4gIEl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gZW5zdXJlIHRoYXQgdHlwZSBvZiBccCBPYmogY2FuCisgIC8vLyBiZSBzYWZlbHkgY29waWVkIGluIHRoaXMgZmFzaGlvbiwgYXMgbm8gY2hlY2tzIGFyZSBtYWRlIHRvIGVuc3VyZSB0aGF0CisgIC8vLyB0aGlzIGlzIHNhZmUuCisgIC8vLworICAvLy8gXHJldHVybnMgYSBzdWNjZXNzIGVycm9yIGNvZGUgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSB3cml0dGVuLAorICAvLy8gb3RoZXJ3aXNlIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEVycm9yIHdyaXRlQXJyYXkoQXJyYXlSZWY8VD4gQXJyYXkpIHsKKyAgICBpZiAoQXJyYXkuZW1wdHkoKSkKKyAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworICAgIGlmIChBcnJheS5zaXplKCkgPiBVSU5UMzJfTUFYIC8gc2l6ZW9mKFQpKQorICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8QmluYXJ5U3RyZWFtRXJyb3I+KAorICAgICAgICAgIHN0cmVhbV9lcnJvcl9jb2RlOjppbnZhbGlkX2FycmF5X3NpemUpOworCisgICAgcmV0dXJuIHdyaXRlQnl0ZXMoCisgICAgICAgIEFycmF5UmVmPHVpbnQ4X3Q+KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihBcnJheS5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5zaXplKCkgKiBzaXplb2YoVCkpKTsKKyAgfQorCisgIC8vLyBXcml0ZXMgYWxsIGRhdGEgZnJvbSB0aGUgYXJyYXkgXHAgQXJyYXkgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtLgorICAvLy8KKyAgLy8vIFxyZXR1cm5zIGEgc3VjY2VzcyBlcnJvciBjb2RlIGlmIHRoZSBkYXRhIHdhcyBzdWNjZXNzZnVsbHkgd3JpdHRlbiwKKyAgLy8vIG90aGVyd2lzZSByZXR1cm5zIGFuIGFwcHJvcHJpYXRlIGVycm9yIGNvZGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBVPgorICBFcnJvciB3cml0ZUFycmF5KFZhclN0cmVhbUFycmF5PFQsIFU+IEFycmF5KSB7CisgICAgcmV0dXJuIHdyaXRlU3RyZWFtUmVmKEFycmF5LmdldFVuZGVybHlpbmdTdHJlYW0oKSk7CisgIH0KKworICAvLy8gV3JpdGVzIGFsbCBlbGVtZW50cyBmcm9tIHRoZSBhcnJheSBccCBBcnJheSB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgIC8vLworICAvLy8gXHJldHVybnMgYSBzdWNjZXNzIGVycm9yIGNvZGUgaWYgdGhlIGRhdGEgd2FzIHN1Y2Nlc3NmdWxseSB3cml0dGVuLAorICAvLy8gb3RoZXJ3aXNlIHJldHVybnMgYW4gYXBwcm9wcmlhdGUgZXJyb3IgY29kZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEVycm9yIHdyaXRlQXJyYXkoRml4ZWRTdHJlYW1BcnJheTxUPiBBcnJheSkgeworICAgIHJldHVybiB3cml0ZVN0cmVhbVJlZihBcnJheS5nZXRVbmRlcmx5aW5nU3RyZWFtKCkpOworICB9CisKKyAgLy8vIFNwbGl0cyB0aGUgV3JpdGVyIGludG8gdHdvIFdyaXRlcnMgYXQgYSBnaXZlbiBvZmZzZXQuCisgIHN0ZDo6cGFpcjxCaW5hcnlTdHJlYW1Xcml0ZXIsIEJpbmFyeVN0cmVhbVdyaXRlcj4gc3BsaXQodWludDMyX3QgT2ZmKSBjb25zdDsKKworICB2b2lkIHNldE9mZnNldCh1aW50MzJfdCBPZmYpIHsgT2Zmc2V0ID0gT2ZmOyB9CisgIHVpbnQzMl90IGdldE9mZnNldCgpIGNvbnN0IHsgcmV0dXJuIE9mZnNldDsgfQorICB1aW50MzJfdCBnZXRMZW5ndGgoKSBjb25zdCB7IHJldHVybiBTdHJlYW0uZ2V0TGVuZ3RoKCk7IH0KKyAgdWludDMyX3QgYnl0ZXNSZW1haW5pbmcoKSBjb25zdCB7IHJldHVybiBnZXRMZW5ndGgoKSAtIGdldE9mZnNldCgpOyB9CisgIEVycm9yIHBhZFRvQWxpZ25tZW50KHVpbnQzMl90IEFsaWduKTsKKworcHJvdGVjdGVkOgorICBXcml0YWJsZUJpbmFyeVN0cmVhbVJlZiBTdHJlYW07CisgIHVpbnQzMl90IE9mZnNldCA9IDA7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0JJTkFSWVNUUkVBTVdSSVRFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQmxvY2tGcmVxdWVuY3kuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CbG9ja0ZyZXF1ZW5jeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNzVjYmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQmxvY2tGcmVxdWVuY3kuaApAQCAtMCwwICsxLDgyIEBACisvLz09PS0tLS0tLS0tIEJsb2NrRnJlcXVlbmN5LmggLSBCbG9jayBGcmVxdWVuY3kgV3JhcHBlciAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIEJsb2NrIEZyZXF1ZW5jeSBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9CTE9DS0ZSRVFVRU5DWV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9CTE9DS0ZSRVFVRU5DWV9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQnJhbmNoUHJvYmFiaWxpdHkuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBCbG9jayBGcmVxdWVuY3kgYXMgYSA2NC1iaXQgdmFsdWUuCitjbGFzcyBCbG9ja0ZyZXF1ZW5jeSB7CisgIHVpbnQ2NF90IEZyZXF1ZW5jeTsKKworcHVibGljOgorICBCbG9ja0ZyZXF1ZW5jeSh1aW50NjRfdCBGcmVxID0gMCkgOiBGcmVxdWVuY3koRnJlcSkgeyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBtYXhpbXVtIHBvc3NpYmxlIGZyZXF1ZW5jeSwgdGhlIHNhdHVyYXRpb24gdmFsdWUuCisgIHN0YXRpYyB1aW50NjRfdCBnZXRNYXhGcmVxdWVuY3koKSB7IHJldHVybiAtMVVMTDsgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyB0aGUgZnJlcXVlbmN5IGFzIGEgZml4cG9pbnQgbnVtYmVyIHNjYWxlZCBieSB0aGUgZW50cnkKKyAgLy8vIGZyZXF1ZW5jeS4KKyAgdWludDY0X3QgZ2V0RnJlcXVlbmN5KCkgY29uc3QgeyByZXR1cm4gRnJlcXVlbmN5OyB9CisKKyAgLy8vIFxicmllZiBNdWx0aXBsaWVzIHdpdGggYSBicmFuY2ggcHJvYmFiaWxpdHkuIFRoZSBjb21wdXRhdGlvbiB3aWxsIG5ldmVyCisgIC8vLyBvdmVyZmxvdy4KKyAgQmxvY2tGcmVxdWVuY3kgJm9wZXJhdG9yKj0oQnJhbmNoUHJvYmFiaWxpdHkgUHJvYik7CisgIEJsb2NrRnJlcXVlbmN5IG9wZXJhdG9yKihCcmFuY2hQcm9iYWJpbGl0eSBQcm9iKSBjb25zdDsKKworICAvLy8gXGJyaWVmIERpdmlkZSBieSBhIG5vbi16ZXJvIGJyYW5jaCBwcm9iYWJpbGl0eSB1c2luZyBzYXR1cmF0aW5nCisgIC8vLyBhcml0aG1ldGljLgorICBCbG9ja0ZyZXF1ZW5jeSAmb3BlcmF0b3IvPShCcmFuY2hQcm9iYWJpbGl0eSBQcm9iKTsKKyAgQmxvY2tGcmVxdWVuY3kgb3BlcmF0b3IvKEJyYW5jaFByb2JhYmlsaXR5IFByb2IpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgQWRkcyBhbm90aGVyIGJsb2NrIGZyZXF1ZW5jeSB1c2luZyBzYXR1cmF0aW5nIGFyaXRobWV0aWMuCisgIEJsb2NrRnJlcXVlbmN5ICZvcGVyYXRvcis9KEJsb2NrRnJlcXVlbmN5IEZyZXEpOworICBCbG9ja0ZyZXF1ZW5jeSBvcGVyYXRvcisoQmxvY2tGcmVxdWVuY3kgRnJlcSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBTdWJ0cmFjdHMgYW5vdGhlciBibG9jayBmcmVxdWVuY3kgdXNpbmcgc2F0dXJhdGluZyBhcml0aG1ldGljLgorICBCbG9ja0ZyZXF1ZW5jeSAmb3BlcmF0b3ItPShCbG9ja0ZyZXF1ZW5jeSBGcmVxKTsKKyAgQmxvY2tGcmVxdWVuY3kgb3BlcmF0b3ItKEJsb2NrRnJlcXVlbmN5IEZyZXEpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgU2hpZnQgYmxvY2sgZnJlcXVlbmN5IHRvIHRoZSByaWdodCBieSBjb3VudCBkaWdpdHMgc2F0dXJhdGluZyB0byAxLgorICBCbG9ja0ZyZXF1ZW5jeSAmb3BlcmF0b3I+Pj0oY29uc3QgdW5zaWduZWQgY291bnQpOworCisgIGJvb2wgb3BlcmF0b3I8KEJsb2NrRnJlcXVlbmN5IFJIUykgY29uc3QgeworICAgIHJldHVybiBGcmVxdWVuY3kgPCBSSFMuRnJlcXVlbmN5OworICB9CisKKyAgYm9vbCBvcGVyYXRvcjw9KEJsb2NrRnJlcXVlbmN5IFJIUykgY29uc3QgeworICAgIHJldHVybiBGcmVxdWVuY3kgPD0gUkhTLkZyZXF1ZW5jeTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I+KEJsb2NrRnJlcXVlbmN5IFJIUykgY29uc3QgeworICAgIHJldHVybiBGcmVxdWVuY3kgPiBSSFMuRnJlcXVlbmN5OworICB9CisKKyAgYm9vbCBvcGVyYXRvcj49KEJsb2NrRnJlcXVlbmN5IFJIUykgY29uc3QgeworICAgIHJldHVybiBGcmVxdWVuY3kgPj0gUkhTLkZyZXF1ZW5jeTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShCbG9ja0ZyZXF1ZW5jeSBSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gRnJlcXVlbmN5ID09IFJIUy5GcmVxdWVuY3k7CisgIH0KK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQnJhbmNoUHJvYmFiaWxpdHkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9CcmFuY2hQcm9iYWJpbGl0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0MDNkN2YKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQnJhbmNoUHJvYmFiaWxpdHkuaApAQCAtMCwwICsxLDIzMSBAQAorLy89PT0tIEJyYW5jaFByb2JhYmlsaXR5LmggLSBCcmFuY2ggUHJvYmFiaWxpdHkgV3JhcHBlciAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEZWZpbml0aW9uIG9mIEJyYW5jaFByb2JhYmlsaXR5IHNoYXJlZCBieSBJUiBhbmQgTWFjaGluZSBJbnN0cnVjdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQlJBTkNIUFJPQkFCSUxJVFlfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQlJBTkNIUFJPQkFCSUxJVFlfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNsaW1pdHM+CisjaW5jbHVkZSA8bnVtZXJpYz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworLy8gVGhpcyBjbGFzcyByZXByZXNlbnRzIEJyYW5jaCBQcm9iYWJpbGl0eSBhcyBhIG5vbi1uZWdhdGl2ZSBmcmFjdGlvbiB0aGF0IGlzCisvLyBubyBncmVhdGVyIHRoYW4gMS4gSXQgdXNlcyBhIGZpeGVkLXBvaW50LWxpa2UgaW1wbGVtZW50YXRpb24sIGluIHdoaWNoIHRoZQorLy8gZGVub21pbmF0b3IgaXMgYWx3YXlzIGEgY29uc3RhbnQgdmFsdWUgKGhlcmUgd2UgdXNlIDE8PDMxIGZvciBtYXhpbXVtCisvLyBwcmVjaXNpb24pLgorY2xhc3MgQnJhbmNoUHJvYmFiaWxpdHkgeworICAvLyBOdW1lcmF0b3IKKyAgdWludDMyX3QgTjsKKworICAvLyBEZW5vbWluYXRvciwgd2hpY2ggaXMgYSBjb25zdGFudCB2YWx1ZS4KKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IEQgPSAxdSA8PCAzMTsKKyAgc3RhdGljIGNvbnN0IHVpbnQzMl90IFVua25vd25OID0gVUlOVDMyX01BWDsKKworICAvLyBDb25zdHJ1Y3QgYSBCcmFuY2hQcm9iYWJpbGl0eSB3aXRoIG9ubHkgbnVtZXJhdG9yIGFzc3VtaW5nIHRoZSBkZW5vbWluYXRvcgorICAvLyBpcyAxPDwzMS4gRm9yIGludGVybmFsIHVzZSBvbmx5LgorICBleHBsaWNpdCBCcmFuY2hQcm9iYWJpbGl0eSh1aW50MzJfdCBuKSA6IE4obikge30KKworcHVibGljOgorICBCcmFuY2hQcm9iYWJpbGl0eSgpIDogTihVbmtub3duTikge30KKyAgQnJhbmNoUHJvYmFiaWxpdHkodWludDMyX3QgTnVtZXJhdG9yLCB1aW50MzJfdCBEZW5vbWluYXRvcik7CisKKyAgYm9vbCBpc1plcm8oKSBjb25zdCB7IHJldHVybiBOID09IDA7IH0KKyAgYm9vbCBpc1Vua25vd24oKSBjb25zdCB7IHJldHVybiBOID09IFVua25vd25OOyB9CisKKyAgc3RhdGljIEJyYW5jaFByb2JhYmlsaXR5IGdldFplcm8oKSB7IHJldHVybiBCcmFuY2hQcm9iYWJpbGl0eSgwKTsgfQorICBzdGF0aWMgQnJhbmNoUHJvYmFiaWxpdHkgZ2V0T25lKCkgeyByZXR1cm4gQnJhbmNoUHJvYmFiaWxpdHkoRCk7IH0KKyAgc3RhdGljIEJyYW5jaFByb2JhYmlsaXR5IGdldFVua25vd24oKSB7IHJldHVybiBCcmFuY2hQcm9iYWJpbGl0eShVbmtub3duTik7IH0KKyAgLy8gQ3JlYXRlIGEgQnJhbmNoUHJvYmFiaWxpdHkgb2JqZWN0IHdpdGggdGhlIGdpdmVuIG51bWVyYXRvciBhbmQgMTw8MzEKKyAgLy8gYXMgZGVub21pbmF0b3IuCisgIHN0YXRpYyBCcmFuY2hQcm9iYWJpbGl0eSBnZXRSYXcodWludDMyX3QgTikgeyByZXR1cm4gQnJhbmNoUHJvYmFiaWxpdHkoTik7IH0KKyAgLy8gQ3JlYXRlIGEgQnJhbmNoUHJvYmFiaWxpdHkgb2JqZWN0IGZyb20gNjQtYml0IGludGVnZXJzLgorICBzdGF0aWMgQnJhbmNoUHJvYmFiaWxpdHkgZ2V0QnJhbmNoUHJvYmFiaWxpdHkodWludDY0X3QgTnVtZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgRGVub21pbmF0b3IpOworCisgIC8vIE5vcm1hbGl6ZSBnaXZlbiBwcm9iYWJpbHRpZXMgc28gdGhhdCB0aGUgc3VtIG9mIHRoZW0gYmVjb21lcyBhcHByb3hpbWF0ZQorICAvLyBvbmUuCisgIHRlbXBsYXRlIDxjbGFzcyBQcm9iYWJpbGl0eUl0ZXI+CisgIHN0YXRpYyB2b2lkIG5vcm1hbGl6ZVByb2JhYmlsaXRpZXMoUHJvYmFiaWxpdHlJdGVyIEJlZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb2JhYmlsaXR5SXRlciBFbmQpOworCisgIHVpbnQzMl90IGdldE51bWVyYXRvcigpIGNvbnN0IHsgcmV0dXJuIE47IH0KKyAgc3RhdGljIHVpbnQzMl90IGdldERlbm9taW5hdG9yKCkgeyByZXR1cm4gRDsgfQorCisgIC8vIFJldHVybiAoMSAtIFByb2JhYmlsaXR5KS4KKyAgQnJhbmNoUHJvYmFiaWxpdHkgZ2V0Q29tcGwoKSBjb25zdCB7IHJldHVybiBCcmFuY2hQcm9iYWJpbGl0eShEIC0gTik7IH0KKworICByYXdfb3N0cmVhbSAmcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFNjYWxlIGEgbGFyZ2UgaW50ZWdlci4KKyAgLy8vCisgIC8vLyBTY2FsZXMgXGMgTnVtLiAgR3VhcmFudGVlcyBmdWxsIHByZWNpc2lvbi4gIFJldHVybnMgdGhlIGZsb29yIG9mIHRoZQorICAvLy8gcmVzdWx0LgorICAvLy8KKyAgLy8vIFxyZXR1cm4gXGMgTnVtIHRpbWVzIFxjIHRoaXMuCisgIHVpbnQ2NF90IHNjYWxlKHVpbnQ2NF90IE51bSkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBTY2FsZSBhIGxhcmdlIGludGVnZXIgYnkgdGhlIGludmVyc2UuCisgIC8vLworICAvLy8gU2NhbGVzIFxjIE51bSBieSB0aGUgaW52ZXJzZSBvZiBcYyB0aGlzLiAgR3VhcmFudGVlcyBmdWxsIHByZWNpc2lvbi4KKyAgLy8vIFJldHVybnMgdGhlIGZsb29yIG9mIHRoZSByZXN1bHQuCisgIC8vLworICAvLy8gXHJldHVybiBcYyBOdW0gZGl2aWRlZCBieSBcYyB0aGlzLgorICB1aW50NjRfdCBzY2FsZUJ5SW52ZXJzZSh1aW50NjRfdCBOdW0pIGNvbnN0OworCisgIEJyYW5jaFByb2JhYmlsaXR5ICZvcGVyYXRvcis9KEJyYW5jaFByb2JhYmlsaXR5IFJIUykgeworICAgIGFzc2VydChOICE9IFVua25vd25OICYmIFJIUy5OICE9IFVua25vd25OICYmCisgICAgICAgICAgICJVbmtub3duIHByb2JhYmlsaXR5IGNhbm5vdCBwYXJ0aWNpcGF0ZSBpbiBhcml0aG1ldGljcy4iKTsKKyAgICAvLyBTYXR1cmF0ZSB0aGUgcmVzdWx0IGluIGNhc2Ugb2Ygb3ZlcmZsb3cuCisgICAgTiA9ICh1aW50NjRfdChOKSArIFJIUy5OID4gRCkgPyBEIDogTiArIFJIUy5OOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEJyYW5jaFByb2JhYmlsaXR5ICZvcGVyYXRvci09KEJyYW5jaFByb2JhYmlsaXR5IFJIUykgeworICAgIGFzc2VydChOICE9IFVua25vd25OICYmIFJIUy5OICE9IFVua25vd25OICYmCisgICAgICAgICAgICJVbmtub3duIHByb2JhYmlsaXR5IGNhbm5vdCBwYXJ0aWNpcGF0ZSBpbiBhcml0aG1ldGljcy4iKTsKKyAgICAvLyBTYXR1cmF0ZSB0aGUgcmVzdWx0IGluIGNhc2Ugb2YgdW5kZXJmbG93LgorICAgIE4gPSBOIDwgUkhTLk4gPyAwIDogTiAtIFJIUy5OOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIEJyYW5jaFByb2JhYmlsaXR5ICZvcGVyYXRvcio9KEJyYW5jaFByb2JhYmlsaXR5IFJIUykgeworICAgIGFzc2VydChOICE9IFVua25vd25OICYmIFJIUy5OICE9IFVua25vd25OICYmCisgICAgICAgICAgICJVbmtub3duIHByb2JhYmlsaXR5IGNhbm5vdCBwYXJ0aWNpcGF0ZSBpbiBhcml0aG1ldGljcy4iKTsKKyAgICBOID0gKHN0YXRpY19jYXN0PHVpbnQ2NF90PihOKSAqIFJIUy5OICsgRCAvIDIpIC8gRDsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBCcmFuY2hQcm9iYWJpbGl0eSAmb3BlcmF0b3IqPSh1aW50MzJfdCBSSFMpIHsKKyAgICBhc3NlcnQoTiAhPSBVbmtub3duTiAmJgorICAgICAgICAgICAiVW5rbm93biBwcm9iYWJpbGl0eSBjYW5ub3QgcGFydGljaXBhdGUgaW4gYXJpdGhtZXRpY3MuIik7CisgICAgTiA9ICh1aW50NjRfdChOKSAqIFJIUyA+IEQpID8gRCA6IE4gKiBSSFM7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQnJhbmNoUHJvYmFiaWxpdHkgJm9wZXJhdG9yLz0odWludDMyX3QgUkhTKSB7CisgICAgYXNzZXJ0KE4gIT0gVW5rbm93bk4gJiYKKyAgICAgICAgICAgIlVua25vd24gcHJvYmFiaWxpdHkgY2Fubm90IHBhcnRpY2lwYXRlIGluIGFyaXRobWV0aWNzLiIpOworICAgIGFzc2VydChSSFMgPiAwICYmICJUaGUgZGl2aWRlciBjYW5ub3QgYmUgemVyby4iKTsKKyAgICBOIC89IFJIUzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBCcmFuY2hQcm9iYWJpbGl0eSBvcGVyYXRvcisoQnJhbmNoUHJvYmFiaWxpdHkgUkhTKSBjb25zdCB7CisgICAgQnJhbmNoUHJvYmFiaWxpdHkgUHJvYigqdGhpcyk7CisgICAgcmV0dXJuIFByb2IgKz0gUkhTOworICB9CisKKyAgQnJhbmNoUHJvYmFiaWxpdHkgb3BlcmF0b3ItKEJyYW5jaFByb2JhYmlsaXR5IFJIUykgY29uc3QgeworICAgIEJyYW5jaFByb2JhYmlsaXR5IFByb2IoKnRoaXMpOworICAgIHJldHVybiBQcm9iIC09IFJIUzsKKyAgfQorCisgIEJyYW5jaFByb2JhYmlsaXR5IG9wZXJhdG9yKihCcmFuY2hQcm9iYWJpbGl0eSBSSFMpIGNvbnN0IHsKKyAgICBCcmFuY2hQcm9iYWJpbGl0eSBQcm9iKCp0aGlzKTsKKyAgICByZXR1cm4gUHJvYiAqPSBSSFM7CisgIH0KKworICBCcmFuY2hQcm9iYWJpbGl0eSBvcGVyYXRvcioodWludDMyX3QgUkhTKSBjb25zdCB7CisgICAgQnJhbmNoUHJvYmFiaWxpdHkgUHJvYigqdGhpcyk7CisgICAgcmV0dXJuIFByb2IgKj0gUkhTOworICB9CisKKyAgQnJhbmNoUHJvYmFiaWxpdHkgb3BlcmF0b3IvKHVpbnQzMl90IFJIUykgY29uc3QgeworICAgIEJyYW5jaFByb2JhYmlsaXR5IFByb2IoKnRoaXMpOworICAgIHJldHVybiBQcm9iIC89IFJIUzsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3I9PShCcmFuY2hQcm9iYWJpbGl0eSBSSFMpIGNvbnN0IHsgcmV0dXJuIE4gPT0gUkhTLk47IH0KKyAgYm9vbCBvcGVyYXRvciE9KEJyYW5jaFByb2JhYmlsaXR5IFJIUykgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBSSFMpOyB9CisKKyAgYm9vbCBvcGVyYXRvcjwoQnJhbmNoUHJvYmFiaWxpdHkgUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KE4gIT0gVW5rbm93bk4gJiYgUkhTLk4gIT0gVW5rbm93bk4gJiYKKyAgICAgICAgICAgIlVua25vd24gcHJvYmFiaWxpdHkgY2Fubm90IHBhcnRpY2lwYXRlIGluIGNvbXBhcmlzb25zLiIpOworICAgIHJldHVybiBOIDwgUkhTLk47CisgIH0KKworICBib29sIG9wZXJhdG9yPihCcmFuY2hQcm9iYWJpbGl0eSBSSFMpIGNvbnN0IHsKKyAgICBhc3NlcnQoTiAhPSBVbmtub3duTiAmJiBSSFMuTiAhPSBVbmtub3duTiAmJgorICAgICAgICAgICAiVW5rbm93biBwcm9iYWJpbGl0eSBjYW5ub3QgcGFydGljaXBhdGUgaW4gY29tcGFyaXNvbnMuIik7CisgICAgcmV0dXJuIFJIUyA8ICp0aGlzOworICB9CisKKyAgYm9vbCBvcGVyYXRvcjw9KEJyYW5jaFByb2JhYmlsaXR5IFJIUykgY29uc3QgeworICAgIGFzc2VydChOICE9IFVua25vd25OICYmIFJIUy5OICE9IFVua25vd25OICYmCisgICAgICAgICAgICJVbmtub3duIHByb2JhYmlsaXR5IGNhbm5vdCBwYXJ0aWNpcGF0ZSBpbiBjb21wYXJpc29ucy4iKTsKKyAgICByZXR1cm4gIShSSFMgPCAqdGhpcyk7CisgIH0KKworICBib29sIG9wZXJhdG9yPj0oQnJhbmNoUHJvYmFiaWxpdHkgUkhTKSBjb25zdCB7CisgICAgYXNzZXJ0KE4gIT0gVW5rbm93bk4gJiYgUkhTLk4gIT0gVW5rbm93bk4gJiYKKyAgICAgICAgICAgIlVua25vd24gcHJvYmFiaWxpdHkgY2Fubm90IHBhcnRpY2lwYXRlIGluIGNvbXBhcmlzb25zLiIpOworICAgIHJldHVybiAhKCp0aGlzIDwgUkhTKTsKKyAgfQorfTsKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgQnJhbmNoUHJvYmFiaWxpdHkgUHJvYikgeworICByZXR1cm4gUHJvYi5wcmludChPUyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBQcm9iYWJpbGl0eUl0ZXI+Cit2b2lkIEJyYW5jaFByb2JhYmlsaXR5Ojpub3JtYWxpemVQcm9iYWJpbGl0aWVzKFByb2JhYmlsaXR5SXRlciBCZWdpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvYmFiaWxpdHlJdGVyIEVuZCkgeworICBpZiAoQmVnaW4gPT0gRW5kKQorICAgIHJldHVybjsKKworICB1bnNpZ25lZCBVbmtub3duUHJvYkNvdW50ID0gMDsKKyAgdWludDY0X3QgU3VtID0gc3RkOjphY2N1bXVsYXRlKEJlZ2luLCBFbmQsIHVpbnQ2NF90KDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWyZdKHVpbnQ2NF90IFMsIGNvbnN0IEJyYW5jaFByb2JhYmlsaXR5ICZCUCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUJQLmlzVW5rbm93bigpKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBTICsgQlAuTjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93blByb2JDb3VudCsrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gUzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pOworCisgIGlmIChVbmtub3duUHJvYkNvdW50ID4gMCkgeworICAgIEJyYW5jaFByb2JhYmlsaXR5IFByb2JGb3JVbmtub3duID0gQnJhbmNoUHJvYmFiaWxpdHk6OmdldFplcm8oKTsKKyAgICAvLyBJZiB0aGUgc3VtIG9mIGFsbCBrbm93biBwcm9iYWJpbGl0aWVzIGlzIGxlc3MgdGhhbiBvbmUsIGV2ZW5seSBkaXN0cmlidXRlCisgICAgLy8gdGhlIGNvbXBsZW1lbnQgb2Ygc3VtIHRvIHVua25vd24gcHJvYmFiaWxpdGllcy4gT3RoZXJ3aXNlLCBzZXQgdW5rbm93bgorICAgIC8vIHByb2JhYmlsaXRpZXMgdG8gemVyb3MgYW5kIGNvbnRpbnVlIHRvIG5vcm1hbGl6ZSBrbm93biBwcm9iYWJpbGl0aWVzLgorICAgIGlmIChTdW0gPCBCcmFuY2hQcm9iYWJpbGl0eTo6Z2V0RGVub21pbmF0b3IoKSkKKyAgICAgIFByb2JGb3JVbmtub3duID0gQnJhbmNoUHJvYmFiaWxpdHk6OmdldFJhdygKKyAgICAgICAgICAoQnJhbmNoUHJvYmFiaWxpdHk6OmdldERlbm9taW5hdG9yKCkgLSBTdW0pIC8gVW5rbm93blByb2JDb3VudCk7CisKKyAgICBzdGQ6OnJlcGxhY2VfaWYoQmVnaW4sIEVuZCwKKyAgICAgICAgICAgICAgICAgICAgW10oY29uc3QgQnJhbmNoUHJvYmFiaWxpdHkgJkJQKSB7IHJldHVybiBCUC5pc1Vua25vd24oKTsgfSwKKyAgICAgICAgICAgICAgICAgICAgUHJvYkZvclVua25vd24pOworCisgICAgaWYgKFN1bSA8PSBCcmFuY2hQcm9iYWJpbGl0eTo6Z2V0RGVub21pbmF0b3IoKSkKKyAgICAgIHJldHVybjsKKyAgfQorCisgIGlmIChTdW0gPT0gMCkgeworICAgIEJyYW5jaFByb2JhYmlsaXR5IEJQKDEsIHN0ZDo6ZGlzdGFuY2UoQmVnaW4sIEVuZCkpOworICAgIHN0ZDo6ZmlsbChCZWdpbiwgRW5kLCBCUCk7CisgICAgcmV0dXJuOworICB9CisKKyAgZm9yIChhdXRvIEkgPSBCZWdpbjsgSSAhPSBFbmQ7ICsrSSkKKyAgICBJLT5OID0gKEktPk4gKiB1aW50NjRfdChEKSArIFN1bSAvIDIpIC8gU3VtOworfQorCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NCaW5kaW5nV3JhcHBpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DQmluZGluZ1dyYXBwaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjYwZjk5ZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DQmluZGluZ1dyYXBwaW5nLmgKQEAgLTAsMCArMSw0NyBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9DQmluZGluZ1dyYXBwaC5oIC0gQyBJbnRlcmZhY2UgV3JhcHBpbmcgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIHdyYXBwaW5nIG1hY3JvcyBmb3IgdGhlIEMgaW50ZXJmYWNlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0NCSU5ESU5HV1JBUFBJTkdfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQ0JJTkRJTkdXUkFQUElOR19ICisKKyNpbmNsdWRlICJsbHZtLWMvVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorCisjZGVmaW5lIERFRklORV9TSU1QTEVfQ09OVkVSU0lPTl9GVU5DVElPTlModHksIHJlZikgICAgIFwKKyAgaW5saW5lIHR5ICp1bndyYXAocmVmIFApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHR5Kj4oUCk7ICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgcmVmIHdyYXAoY29uc3QgdHkgKlApIHsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8cmVmPihjb25zdF9jYXN0PHR5Kj4oUCkpOyAgIFwKKyAgfQorCisjZGVmaW5lIERFRklORV9JU0FfQ09OVkVSU0lPTl9GVU5DVElPTlModHksIHJlZikgICAgICAgIFwKKyAgREVGSU5FX1NJTVBMRV9DT05WRVJTSU9OX0ZVTkNUSU9OUyh0eSwgcmVmKSAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIFQgKnVud3JhcChyZWYgUCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiBjYXN0PFQ+KHVud3JhcChQKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBERUZJTkVfU1REQ1hYX0NPTlZFUlNJT05fRlVOQ1RJT05TKHR5LCByZWYpICAgICBcCisgIERFRklORV9TSU1QTEVfQ09OVkVSU0lPTl9GVU5DVElPTlModHksIHJlZikgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSBUICp1bndyYXAocmVmIFApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUICpRID0gKFQqKXVud3JhcChQKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGFzc2VydChRICYmICJJbnZhbGlkIGNhc3QhIik7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIFE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DT00uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DT00uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmQ1YTdhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NPTS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvQ09NLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLworLy8vIFByb3ZpZGVzIGEgbGlicmFyeSBmb3IgYWNjZXNzaW5nIENPTSBmdW5jdGlvbmFsaXR5IG9mIHRoZSBIb3N0IE9TLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9DT01fSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQ09NX0gKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHN5cyB7CisKK2VudW0gY2xhc3MgQ09NVGhyZWFkaW5nTW9kZSB7IFNpbmdsZVRocmVhZGVkLCBNdWx0aVRocmVhZGVkIH07CisKK2NsYXNzIEluaXRpYWxpemVDT01SQUlJIHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgSW5pdGlhbGl6ZUNPTVJBSUkoQ09NVGhyZWFkaW5nTW9kZSBUaHJlYWRpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU3BlZWRPdmVyTWVtb3J5ID0gZmFsc2UpOworICB+SW5pdGlhbGl6ZUNPTVJBSUkoKTsKKworcHJpdmF0ZToKKyAgSW5pdGlhbGl6ZUNPTVJBSUkoY29uc3QgSW5pdGlhbGl6ZUNPTVJBSUkgJikgPSBkZWxldGU7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEluaXRpYWxpemVDT01SQUlJICYpID0gZGVsZXRlOworfTsKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ2FjaGVQcnVuaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ2FjaGVQcnVuaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjM4Y2UxNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DYWNoZVBydW5pbmcuaApAQCAtMCwwICsxLDc4IEBACisvLz0tIENhY2hlUHJ1bmluZy5oIC0gSGVscGVyIHRvIG1hbmFnZSB0aGUgcHJ1bmluZyBvZiBhIGNhY2hlIGRpciAtKi0gQysrIC0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHBydW5pbmcgb2YgYSBkaXJlY3RvcnkgaW50ZW5kZWQgZm9yIGNhY2hlIHN0b3JhZ2UsIHVzaW5nCisvLyB2YXJpb3VzIHBvbGljaWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0NBQ0hFX1BSVU5JTkdfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQ0FDSEVfUFJVTklOR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxjaHJvbm8+CisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEV4cGVjdGVkOworCisvLy8gUG9saWN5IGZvciB0aGUgcHJ1bmVDYWNoZSgpIGZ1bmN0aW9uLiBBIGRlZmF1bHQgY29uc3RydWN0ZWQKKy8vLyBDYWNoZVBydW5pbmdQb2xpY3kgcHJvdmlkZXMgYSByZWFzb25hYmxlIGRlZmF1bHQgcG9saWN5Lgorc3RydWN0IENhY2hlUHJ1bmluZ1BvbGljeSB7CisgIC8vLyBUaGUgcHJ1bmluZyBpbnRlcnZhbC4gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIHRvIGF2b2lkIHNjYW5uaW5nIHRoZQorICAvLy8gZGlyZWN0b3J5IHRvbyBvZnRlbi4gSXQgZG9lcyBub3QgaW1wYWN0IHRoZSBkZWNpc2lvbiBvZiB3aGljaCBmaWxlIHRvCisgIC8vLyBwcnVuZS4gQSB2YWx1ZSBvZiAwIGZvcmNlcyB0aGUgc2NhbiB0byBvY2N1ci4gQSB2YWx1ZSBvZiBOb25lIGRpc2FibGVzCisgIC8vLyBwcnVuaW5nLgorICBsbHZtOjpPcHRpb25hbDxzdGQ6OmNocm9ubzo6c2Vjb25kcz4gSW50ZXJ2YWwgPSBzdGQ6OmNocm9ubzo6c2Vjb25kcygxMjAwKTsKKworICAvLy8gVGhlIGV4cGlyYXRpb24gZm9yIGEgZmlsZS4gV2hlbiBhIGZpbGUgaGFzbid0IGJlZW4gYWNjZXNzZWQgZm9yIEV4cGlyYXRpb24KKyAgLy8vIHNlY29uZHMsIGl0IGlzIHJlbW92ZWQgZnJvbSB0aGUgY2FjaGUuIEEgdmFsdWUgb2YgMCBkaXNhYmxlcyB0aGUKKyAgLy8vIGV4cGlyYXRpb24tYmFzZWQgcHJ1bmluZy4KKyAgc3RkOjpjaHJvbm86OnNlY29uZHMgRXhwaXJhdGlvbiA9IHN0ZDo6Y2hyb25vOjpob3Vycyg3ICogMjQpOyAvLyAxdworCisgIC8vLyBUaGUgbWF4aW11bSBzaXplIGZvciB0aGUgY2FjaGUgZGlyZWN0b3J5LCBpbiB0ZXJtcyBvZiBwZXJjZW50YWdlIG9mIHRoZQorICAvLy8gYXZhaWxhYmxlIHNwYWNlIG9uIHRoZSBkaXNrLiBTZXQgdG8gMTAwIHRvIGluZGljYXRlIG5vIGxpbWl0LCA1MCB0bworICAvLy8gaW5kaWNhdGUgdGhhdCB0aGUgY2FjaGUgc2l6ZSB3aWxsIG5vdCBiZSBsZWZ0IG92ZXIgaGFsZiB0aGUgYXZhaWxhYmxlIGRpc2sKKyAgLy8vIHNwYWNlLiBBIHZhbHVlIG92ZXIgMTAwIHdpbGwgYmUgcmVkdWNlZCB0byAxMDAuIEEgdmFsdWUgb2YgMCBkaXNhYmxlcyB0aGUKKyAgLy8vIHBlcmNlbnRhZ2Ugc2l6ZS1iYXNlZCBwcnVuaW5nLgorICB1bnNpZ25lZCBNYXhTaXplUGVyY2VudGFnZU9mQXZhaWxhYmxlU3BhY2UgPSA3NTsKKworICAvLy8gVGhlIG1heGltdW0gc2l6ZSBmb3IgdGhlIGNhY2hlIGRpcmVjdG9yeSBpbiBieXRlcy4gQSB2YWx1ZSBvdmVyIHRoZSBhbW91bnQKKyAgLy8vIG9mIGF2YWlsYWJsZSBzcGFjZSBvbiB0aGUgZGlzayB3aWxsIGJlIHJlZHVjZWQgdG8gdGhlIGFtb3VudCBvZiBhdmFpbGFibGUKKyAgLy8vIHNwYWNlLiBBIHZhbHVlIG9mIDAgZGlzYWJsZXMgdGhlIGFic29sdXRlIHNpemUtYmFzZWQgcHJ1bmluZy4KKyAgdWludDY0X3QgTWF4U2l6ZUJ5dGVzID0gMDsKKworICAvLy8gVGhlIG1heGltdW0gbnVtYmVyIG9mIGZpbGVzIGluIHRoZSBjYWNoZSBkaXJlY3RvcnkuIEEgdmFsdWUgb2YgMCBkaXNhYmxlcworICAvLy8gdGhlIG51bWJlciBvZiBmaWxlcyBiYXNlZCBwcnVuaW5nLgorICAvLy8KKyAgLy8vIFRoaXMgZGVmYXVsdHMgdG8gMTAwMDAwMCBiZWNhdXNlIHdpdGggdGhhdCBtYW55IGZpbGVzIHRoZXJlIGFyZQorICAvLy8gZGltaW5pc2hpbmcgcmV0dXJucyBvbiB0aGUgZWZmZWN0aXZlbmVzcyBvZiB0aGUgY2FjaGUsIGFuZCBzb21lIGZpbGUKKyAgLy8vIHN5c3RlbXMgaGF2ZSBhIGxpbWl0IG9uIGhvdyBtYW55IGZpbGVzIGNhbiBiZSBjb250YWluZWQgaW4gYSBkaXJlY3RvcnkKKyAgLy8vIChub3RhYmx5IGV4dDQsIHdoaWNoIGlzIGxpbWl0ZWQgdG8gYXJvdW5kIDYwMDAwMDAgZmlsZXMpLgorICB1aW50NjRfdCBNYXhTaXplRmlsZXMgPSAxMDAwMDAwOworfTsKKworLy8vIFBhcnNlIHRoZSBnaXZlbiBzdHJpbmcgYXMgYSBjYWNoZSBwcnVuaW5nIHBvbGljeS4gRGVmYXVsdHMgYXJlIHRha2VuIGZyb20gYQorLy8vIGRlZmF1bHQgY29uc3RydWN0ZWQgQ2FjaGVQcnVuaW5nUG9saWN5IG9iamVjdC4KKy8vLyBGb3IgZXhhbXBsZTogInBydW5lX2ludGVydmFsPTMwczpwcnVuZV9hZnRlcj0yNGg6Y2FjaGVfc2l6ZT01MCUiCisvLy8gd2hpY2ggbWVhbnMgYSBwcnVuaW5nIGludGVydmFsIG9mIDMwIHNlY29uZHMsIGV4cGlyYXRpb24gdGltZSBvZiAyNCBob3VycworLy8vIGFuZCBtYXhpbXVtIGNhY2hlIHNpemUgb2YgNTAlIG9mIGF2YWlsYWJsZSBkaXNrIHNwYWNlLgorRXhwZWN0ZWQ8Q2FjaGVQcnVuaW5nUG9saWN5PiBwYXJzZUNhY2hlUHJ1bmluZ1BvbGljeShTdHJpbmdSZWYgUG9saWN5U3RyKTsKKworLy8vIFBlZm9ybSBwcnVuaW5nIHVzaW5nIHRoZSBzdXBwbGllZCBwb2xpY3ksIHJldHVybnMgdHJ1ZSBpZiBwcnVuaW5nCisvLy8gb2NjdXJyZWQsIGkuZS4gaWYgUG9saWN5LkludGVydmFsIHdhcyBleHBpcmVkLgorLy8vCisvLy8gQXMgYSBzYWZlZ3VhcmQgYWdhaW5zdCBkYXRhIGxvc3MgaWYgdGhlIHVzZXIgc3BlY2lmaWVzIHRoZSB3cm9uZyBkaXJlY3RvcnkKKy8vLyBhcyB0aGVpciBjYWNoZSBkaXJlY3RvcnksIHRoaXMgZnVuY3Rpb24gd2lsbCBpZ25vcmUgZmlsZXMgbm90IG1hdGNoaW5nIHRoZQorLy8vIHBhdHRlcm4gImxsdm1jYWNoZS0qIi4KK2Jvb2wgcHJ1bmVDYWNoZShTdHJpbmdSZWYgUGF0aCwgQ2FjaGVQcnVuaW5nUG9saWN5IFBvbGljeSk7CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ2FwYWNpdHkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DYXBhY2l0eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc0NjBmOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ2FwYWNpdHkuaApAQCAtMCwwICsxLDMyIEBACisvLz09PS0tLSBDYXBhY2l0eS5oIC0gR2VuZXJpYyBjb21wdXRhdGlvbiBvZiBBRFQgbWVtb3J5IHVzZSAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBjYXBhY2l0eSBmdW5jdGlvbiB0aGF0IGNvbXB1dGVzIHRoZSBhbW91bnQgb2YKKy8vIG1lbW9yeSB1c2VkIGJ5IGFuIEFEVC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9DQVBBQ0lUWV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9DQVBBQ0lUWV9ICisKKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RhdGljIGlubGluZSBzaXplX3QgY2FwYWNpdHlfaW5fYnl0ZXMoY29uc3QgVCAmeCkgeworICAvLyBUaGlzIGRlZmF1bHQgZGVmaW5pdGlvbiBvZiBjYXBhY2l0eSBzaG91bGQgd29yayBmb3IgdGhpbmdzIGxpa2Ugc3RkOjp2ZWN0b3IKKyAgLy8gYW5kIGZyaWVuZHMuICBNb3JlIHNwZWNpYWxpemVkIHZlcnNpb25zIHdpbGwgd29yayBmb3Igb3RoZXJzLgorICByZXR1cm4geC5jYXBhY2l0eSgpICogc2l6ZW9mKHR5cGVuYW1lIFQ6OnZhbHVlX3R5cGUpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DYXN0aW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFhMmE4MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DYXN0aW5nLmgKQEAgLTAsMCArMSwzOTkgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIC0gQWxsb3cgZmxleGlibGUsIGNoZWNrZWQsIGNhc3RzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIGlzYTxYPigpLCBjYXN0PFg+KCksIGR5bl9jYXN0PFg+KCksIGNhc3Rfb3JfbnVsbDxYPigpLAorLy8gYW5kIGR5bl9jYXN0X29yX251bGw8WD4oKSB0ZW1wbGF0ZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQ0FTVElOR19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9DQVNUSU5HX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgaXNhPHg+IFN1cHBvcnQgVGVtcGxhdGVzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBEZWZpbmUgYSB0ZW1wbGF0ZSB0aGF0IGNhbiBiZSBzcGVjaWFsaXplZCBieSBzbWFydCBwb2ludGVycyB0byByZWZsZWN0IHRoZQorLy8gZmFjdCB0aGF0IHRoZXkgYXJlIGF1dG9tYXRpY2FsbHkgZGVyZWZlcmVuY2VkLCBhbmQgYXJlIG5vdCBpbnZvbHZlZCB3aXRoIHRoZQorLy8gdGVtcGxhdGUgc2VsZWN0aW9uIHByb2Nlc3MuLi4gIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGEgbm9vcC4KKy8vCit0ZW1wbGF0ZTx0eXBlbmFtZSBGcm9tPiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZSB7CisgIHVzaW5nIFNpbXBsZVR5cGUgPSBGcm9tOyAvLyBUaGUgcmVhbCB0eXBlIHRoaXMgcmVwcmVzZW50cy4uLgorCisgIC8vIEFuIGFjY2Vzc29yIHRvIGdldCB0aGUgcmVhbCB2YWx1ZS4uLgorICBzdGF0aWMgU2ltcGxlVHlwZSAmZ2V0U2ltcGxpZmllZFZhbHVlKEZyb20gJlZhbCkgeyByZXR1cm4gVmFsOyB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBGcm9tPiBzdHJ1Y3Qgc2ltcGxpZnlfdHlwZTxjb25zdCBGcm9tPiB7CisgIHVzaW5nIE5vbkNvbnN0U2ltcGxlVHlwZSA9IHR5cGVuYW1lIHNpbXBsaWZ5X3R5cGU8RnJvbT46OlNpbXBsZVR5cGU7CisgIHVzaW5nIFNpbXBsZVR5cGUgPQorICAgICAgdHlwZW5hbWUgYWRkX2NvbnN0X3Bhc3RfcG9pbnRlcjxOb25Db25zdFNpbXBsZVR5cGU+Ojp0eXBlOworICB1c2luZyBSZXRUeXBlID0KKyAgICAgIHR5cGVuYW1lIGFkZF9sdmFsdWVfcmVmZXJlbmNlX2lmX25vdF9wb2ludGVyPFNpbXBsZVR5cGU+Ojp0eXBlOworCisgIHN0YXRpYyBSZXRUeXBlIGdldFNpbXBsaWZpZWRWYWx1ZShjb25zdCBGcm9tJiBWYWwpIHsKKyAgICByZXR1cm4gc2ltcGxpZnlfdHlwZTxGcm9tPjo6Z2V0U2ltcGxpZmllZFZhbHVlKGNvbnN0X2Nhc3Q8RnJvbSY+KFZhbCkpOworICB9Cit9OworCisvLyBUaGUgY29yZSBvZiB0aGUgaW1wbGVtZW50YXRpb24gb2YgaXNhPFg+IGlzIGhlcmU7IFRvIGFuZCBGcm9tIHNob3VsZCBiZQorLy8gdGhlIG5hbWVzIG9mIGNsYXNzZXMuICBUaGlzIHRlbXBsYXRlIGNhbiBiZSBzcGVjaWFsaXplZCB0byBjdXN0b21pemUgdGhlCisvLyBpbXBsZW1lbnRhdGlvbiBvZiBpc2E8PiB3aXRob3V0IHJld3JpdGluZyBpdCBmcm9tIHNjcmF0Y2guCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20sIHR5cGVuYW1lIEVuYWJsZXIgPSB2b2lkPgorc3RydWN0IGlzYV9pbXBsIHsKKyAgc3RhdGljIGlubGluZSBib29sIGRvaXQoY29uc3QgRnJvbSAmVmFsKSB7CisgICAgcmV0dXJuIFRvOjpjbGFzc29mKCZWYWwpOworICB9Cit9OworCisvLy8gXGJyaWVmIEFsd2F5cyBhbGxvdyB1cGNhc3RzLCBhbmQgcGVyZm9ybSBubyBkeW5hbWljIGNoZWNrIGZvciB0aGVtLgordGVtcGxhdGUgPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPgorc3RydWN0IGlzYV9pbXBsPAorICAgIFRvLCBGcm9tLCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Jhc2Vfb2Y8VG8sIEZyb20+Ojp2YWx1ZT46OnR5cGU+IHsKKyAgc3RhdGljIGlubGluZSBib29sIGRvaXQoY29uc3QgRnJvbSAmKSB7IHJldHVybiB0cnVlOyB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+IHN0cnVjdCBpc2FfaW1wbF9jbCB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0KGNvbnN0IEZyb20gJlZhbCkgeworICAgIHJldHVybiBpc2FfaW1wbDxUbywgRnJvbT46OmRvaXQoVmFsKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPiBzdHJ1Y3QgaXNhX2ltcGxfY2w8VG8sIGNvbnN0IEZyb20+IHsKKyAgc3RhdGljIGlubGluZSBib29sIGRvaXQoY29uc3QgRnJvbSAmVmFsKSB7CisgICAgcmV0dXJuIGlzYV9pbXBsPFRvLCBGcm9tPjo6ZG9pdChWYWwpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+CitzdHJ1Y3QgaXNhX2ltcGxfY2w8VG8sIGNvbnN0IHN0ZDo6dW5pcXVlX3B0cjxGcm9tPj4geworICBzdGF0aWMgaW5saW5lIGJvb2wgZG9pdChjb25zdCBzdGQ6OnVuaXF1ZV9wdHI8RnJvbT4gJlZhbCkgeworICAgIGFzc2VydChWYWwgJiYgImlzYTw+IHVzZWQgb24gYSBudWxsIHBvaW50ZXIiKTsKKyAgICByZXR1cm4gaXNhX2ltcGxfY2w8VG8sIEZyb20+Ojpkb2l0KCpWYWwpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+IHN0cnVjdCBpc2FfaW1wbF9jbDxUbywgRnJvbSo+IHsKKyAgc3RhdGljIGlubGluZSBib29sIGRvaXQoY29uc3QgRnJvbSAqVmFsKSB7CisgICAgYXNzZXJ0KFZhbCAmJiAiaXNhPD4gdXNlZCBvbiBhIG51bGwgcG9pbnRlciIpOworICAgIHJldHVybiBpc2FfaW1wbDxUbywgRnJvbT46OmRvaXQoKlZhbCk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4gc3RydWN0IGlzYV9pbXBsX2NsPFRvLCBGcm9tKmNvbnN0PiB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0KGNvbnN0IEZyb20gKlZhbCkgeworICAgIGFzc2VydChWYWwgJiYgImlzYTw+IHVzZWQgb24gYSBudWxsIHBvaW50ZXIiKTsKKyAgICByZXR1cm4gaXNhX2ltcGw8VG8sIEZyb20+Ojpkb2l0KCpWYWwpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+IHN0cnVjdCBpc2FfaW1wbF9jbDxUbywgY29uc3QgRnJvbSo+IHsKKyAgc3RhdGljIGlubGluZSBib29sIGRvaXQoY29uc3QgRnJvbSAqVmFsKSB7CisgICAgYXNzZXJ0KFZhbCAmJiAiaXNhPD4gdXNlZCBvbiBhIG51bGwgcG9pbnRlciIpOworICAgIHJldHVybiBpc2FfaW1wbDxUbywgRnJvbT46OmRvaXQoKlZhbCk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4gc3RydWN0IGlzYV9pbXBsX2NsPFRvLCBjb25zdCBGcm9tKmNvbnN0PiB7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBkb2l0KGNvbnN0IEZyb20gKlZhbCkgeworICAgIGFzc2VydChWYWwgJiYgImlzYTw+IHVzZWQgb24gYSBudWxsIHBvaW50ZXIiKTsKKyAgICByZXR1cm4gaXNhX2ltcGw8VG8sIEZyb20+Ojpkb2l0KCpWYWwpOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbSwgdHlwZW5hbWUgU2ltcGxlRnJvbT4KK3N0cnVjdCBpc2FfaW1wbF93cmFwIHsKKyAgLy8gV2hlbiBGcm9tICE9IFNpbXBsaWZpZWRUeXBlLCB3ZSBjYW4gc2ltcGxpZnkgdGhlIHR5cGUgc29tZSBtb3JlIGJ5IHVzaW5nCisgIC8vIHRoZSBzaW1wbGlmeV90eXBlIHRlbXBsYXRlLgorICBzdGF0aWMgYm9vbCBkb2l0KGNvbnN0IEZyb20gJlZhbCkgeworICAgIHJldHVybiBpc2FfaW1wbF93cmFwPFRvLCBTaW1wbGVGcm9tLAorICAgICAgdHlwZW5hbWUgc2ltcGxpZnlfdHlwZTxTaW1wbGVGcm9tPjo6U2ltcGxlVHlwZT46OmRvaXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsaWZ5X3R5cGU8Y29uc3QgRnJvbT46OmdldFNpbXBsaWZpZWRWYWx1ZShWYWwpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb21UeT4KK3N0cnVjdCBpc2FfaW1wbF93cmFwPFRvLCBGcm9tVHksIEZyb21UeT4geworICAvLyBXaGVuIEZyb20gPT0gU2ltcGxlVHlwZSwgd2UgYXJlIGFzIHNpbXBsZSBhcyB3ZSBhcmUgZ29pbmcgdG8gZ2V0LgorICBzdGF0aWMgYm9vbCBkb2l0KGNvbnN0IEZyb21UeSAmVmFsKSB7CisgICAgcmV0dXJuIGlzYV9pbXBsX2NsPFRvLEZyb21UeT46OmRvaXQoVmFsKTsKKyAgfQorfTsKKworLy8gaXNhPFg+IC0gUmV0dXJuIHRydWUgaWYgdGhlIHBhcmFtZXRlciB0byB0aGUgdGVtcGxhdGUgaXMgYW4gaW5zdGFuY2Ugb2YgdGhlCisvLyB0ZW1wbGF0ZSB0eXBlIGFyZ3VtZW50LiAgVXNlZCBsaWtlIHRoaXM6CisvLworLy8gIGlmIChpc2E8VHlwZT4obXlWYWwpKSB7IC4uLiB9CisvLwordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+IExMVk1fTk9ESVNDQVJEIGlubGluZSBib29sIGlzYShjb25zdCBZICZWYWwpIHsKKyAgcmV0dXJuIGlzYV9pbXBsX3dyYXA8WCwgY29uc3QgWSwKKyAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgc2ltcGxpZnlfdHlwZTxjb25zdCBZPjo6U2ltcGxlVHlwZT46OmRvaXQoVmFsKTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICBjYXN0PHg+IFN1cHBvcnQgVGVtcGxhdGVzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCit0ZW1wbGF0ZTxjbGFzcyBUbywgY2xhc3MgRnJvbT4gc3RydWN0IGNhc3RfcmV0dHk7CisKKy8vIENhbGN1bGF0ZSB3aGF0IHR5cGUgdGhlICdjYXN0JyBmdW5jdGlvbiBzaG91bGQgcmV0dXJuLCBiYXNlZCBvbiBhIHJlcXVlc3RlZAorLy8gdHlwZSBvZiBUbyBhbmQgYSBzb3VyY2UgdHlwZSBvZiBGcm9tLgordGVtcGxhdGU8Y2xhc3MgVG8sIGNsYXNzIEZyb20+IHN0cnVjdCBjYXN0X3JldHR5X2ltcGwgeworICB1c2luZyByZXRfdHlwZSA9IFRvICY7ICAgICAgIC8vIE5vcm1hbCBjYXNlLCByZXR1cm4gVHkmCit9OwordGVtcGxhdGU8Y2xhc3MgVG8sIGNsYXNzIEZyb20+IHN0cnVjdCBjYXN0X3JldHR5X2ltcGw8VG8sIGNvbnN0IEZyb20+IHsKKyAgdXNpbmcgcmV0X3R5cGUgPSBjb25zdCBUbyAmOyAvLyBOb3JtYWwgY2FzZSwgcmV0dXJuIFR5JgorfTsKKwordGVtcGxhdGU8Y2xhc3MgVG8sIGNsYXNzIEZyb20+IHN0cnVjdCBjYXN0X3JldHR5X2ltcGw8VG8sIEZyb20qPiB7CisgIHVzaW5nIHJldF90eXBlID0gVG8gKjsgICAgICAgLy8gUG9pbnRlciBhcmcgY2FzZSwgcmV0dXJuIFR5KgorfTsKKwordGVtcGxhdGU8Y2xhc3MgVG8sIGNsYXNzIEZyb20+IHN0cnVjdCBjYXN0X3JldHR5X2ltcGw8VG8sIGNvbnN0IEZyb20qPiB7CisgIHVzaW5nIHJldF90eXBlID0gY29uc3QgVG8gKjsgLy8gQ29uc3RhbnQgcG9pbnRlciBhcmcgY2FzZSwgcmV0dXJuIGNvbnN0IFR5KgorfTsKKwordGVtcGxhdGU8Y2xhc3MgVG8sIGNsYXNzIEZyb20+IHN0cnVjdCBjYXN0X3JldHR5X2ltcGw8VG8sIGNvbnN0IEZyb20qY29uc3Q+IHsKKyAgdXNpbmcgcmV0X3R5cGUgPSBjb25zdCBUbyAqOyAvLyBDb25zdGFudCBwb2ludGVyIGFyZyBjYXNlLCByZXR1cm4gY29uc3QgVHkqCit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVG8sIGNsYXNzIEZyb20+CitzdHJ1Y3QgY2FzdF9yZXR0eV9pbXBsPFRvLCBzdGQ6OnVuaXF1ZV9wdHI8RnJvbT4+IHsKK3ByaXZhdGU6CisgIHVzaW5nIFBvaW50ZXJUeXBlID0gdHlwZW5hbWUgY2FzdF9yZXR0eV9pbXBsPFRvLCBGcm9tICo+OjpyZXRfdHlwZTsKKyAgdXNpbmcgUmVzdWx0VHlwZSA9IHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3BvaW50ZXI8UG9pbnRlclR5cGU+Ojp0eXBlOworCitwdWJsaWM6CisgIHVzaW5nIHJldF90eXBlID0gc3RkOjp1bmlxdWVfcHRyPFJlc3VsdFR5cGU+OworfTsKKwordGVtcGxhdGU8Y2xhc3MgVG8sIGNsYXNzIEZyb20sIGNsYXNzIFNpbXBsZUZyb20+CitzdHJ1Y3QgY2FzdF9yZXR0eV93cmFwIHsKKyAgLy8gV2hlbiB0aGUgc2ltcGxpZmllZCB0eXBlIGFuZCB0aGUgZnJvbSB0eXBlIGFyZSBub3QgdGhlIHNhbWUsIHVzZSB0aGUgdHlwZQorICAvLyBzaW1wbGlmaWVyIHRvIHJlZHVjZSB0aGUgdHlwZSwgdGhlbiByZXVzZSBjYXN0X3JldHR5X2ltcGwgdG8gZ2V0IHRoZQorICAvLyByZXN1bHRhbnQgdHlwZS4KKyAgdXNpbmcgcmV0X3R5cGUgPSB0eXBlbmFtZSBjYXN0X3JldHR5PFRvLCBTaW1wbGVGcm9tPjo6cmV0X3R5cGU7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBUbywgY2xhc3MgRnJvbVR5Pgorc3RydWN0IGNhc3RfcmV0dHlfd3JhcDxUbywgRnJvbVR5LCBGcm9tVHk+IHsKKyAgLy8gV2hlbiB0aGUgc2ltcGxpZmllZCB0eXBlIGlzIGVxdWFsIHRvIHRoZSBmcm9tIHR5cGUsIHVzZSBpdCBkaXJlY3RseS4KKyAgdXNpbmcgcmV0X3R5cGUgPSB0eXBlbmFtZSBjYXN0X3JldHR5X2ltcGw8VG8sRnJvbVR5Pjo6cmV0X3R5cGU7Cit9OworCit0ZW1wbGF0ZTxjbGFzcyBUbywgY2xhc3MgRnJvbT4KK3N0cnVjdCBjYXN0X3JldHR5IHsKKyAgdXNpbmcgcmV0X3R5cGUgPSB0eXBlbmFtZSBjYXN0X3JldHR5X3dyYXA8CisgICAgICBUbywgRnJvbSwgdHlwZW5hbWUgc2ltcGxpZnlfdHlwZTxGcm9tPjo6U2ltcGxlVHlwZT46OnJldF90eXBlOworfTsKKworLy8gRW5zdXJlIHRoZSBub24tc2ltcGxlIHZhbHVlcyBhcmUgY29udmVydGVkIHVzaW5nIHRoZSBzaW1wbGlmeV90eXBlIHRlbXBsYXRlCisvLyB0aGF0IG1heSBiZSBzcGVjaWFsaXplZCBieSBzbWFydCBwb2ludGVycy4uLgorLy8KK3RlbXBsYXRlPGNsYXNzIFRvLCBjbGFzcyBGcm9tLCBjbGFzcyBTaW1wbGVGcm9tPiBzdHJ1Y3QgY2FzdF9jb252ZXJ0X3ZhbCB7CisgIC8vIFRoaXMgaXMgbm90IGEgc2ltcGxlIHR5cGUsIHVzZSB0aGUgdGVtcGxhdGUgdG8gc2ltcGxpZnkgaXQuLi4KKyAgc3RhdGljIHR5cGVuYW1lIGNhc3RfcmV0dHk8VG8sIEZyb20+OjpyZXRfdHlwZSBkb2l0KEZyb20gJlZhbCkgeworICAgIHJldHVybiBjYXN0X2NvbnZlcnRfdmFsPFRvLCBTaW1wbGVGcm9tLAorICAgICAgdHlwZW5hbWUgc2ltcGxpZnlfdHlwZTxTaW1wbGVGcm9tPjo6U2ltcGxlVHlwZT46OmRvaXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNpbXBsaWZ5X3R5cGU8RnJvbT46OmdldFNpbXBsaWZpZWRWYWx1ZShWYWwpKTsKKyAgfQorfTsKKwordGVtcGxhdGU8Y2xhc3MgVG8sIGNsYXNzIEZyb21UeT4gc3RydWN0IGNhc3RfY29udmVydF92YWw8VG8sRnJvbVR5LEZyb21UeT4geworICAvLyBUaGlzIF9pc18gYSBzaW1wbGUgdHlwZSwganVzdCBjYXN0IGl0LgorICBzdGF0aWMgdHlwZW5hbWUgY2FzdF9yZXR0eTxUbywgRnJvbVR5Pjo6cmV0X3R5cGUgZG9pdChjb25zdCBGcm9tVHkgJlZhbCkgeworICAgIHR5cGVuYW1lIGNhc3RfcmV0dHk8VG8sIEZyb21UeT46OnJldF90eXBlIFJlczIKKyAgICAgPSAodHlwZW5hbWUgY2FzdF9yZXR0eTxUbywgRnJvbVR5Pjo6cmV0X3R5cGUpY29uc3RfY2FzdDxGcm9tVHkmPihWYWwpOworICAgIHJldHVybiBSZXMyOworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgWD4gc3RydWN0IGlzX3NpbXBsZV90eXBlIHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPQorICAgICAgc3RkOjppc19zYW1lPFgsIHR5cGVuYW1lIHNpbXBsaWZ5X3R5cGU8WD46OlNpbXBsZVR5cGU+Ojp2YWx1ZTsKK307CisKKy8vIGNhc3Q8WD4gLSBSZXR1cm4gdGhlIGFyZ3VtZW50IHBhcmFtZXRlciBjYXN0IHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4gIFRoaXMKKy8vIGNhc3Rpbmcgb3BlcmF0b3IgYXNzZXJ0cyB0aGF0IHRoZSB0eXBlIGlzIGNvcnJlY3QsIHNvIGl0IGRvZXMgbm90IHJldHVybiBudWxsCisvLyBvbiBmYWlsdXJlLiAgSXQgZG9lcyBub3QgYWxsb3cgYSBudWxsIGFyZ3VtZW50ICh1c2UgY2FzdF9vcl9udWxsIGZvciB0aGF0KS4KKy8vIEl0IGlzIHR5cGljYWxseSB1c2VkIGxpa2UgdGhpczoKKy8vCisvLyAgY2FzdDxJbnN0cnVjdGlvbj4obXlWYWwpLT5nZXRQYXJlbnQoKQorLy8KK3RlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgoraW5saW5lIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFpc19zaW1wbGVfdHlwZTxZPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgY2FzdF9yZXR0eTxYLCBjb25zdCBZPjo6cmV0X3R5cGU+Ojp0eXBlCitjYXN0KGNvbnN0IFkgJlZhbCkgeworICBhc3NlcnQoaXNhPFg+KFZhbCkgJiYgImNhc3Q8VHk+KCkgYXJndW1lbnQgb2YgaW5jb21wYXRpYmxlIHR5cGUhIik7CisgIHJldHVybiBjYXN0X2NvbnZlcnRfdmFsPAorICAgICAgWCwgY29uc3QgWSwgdHlwZW5hbWUgc2ltcGxpZnlfdHlwZTxjb25zdCBZPjo6U2ltcGxlVHlwZT46OmRvaXQoVmFsKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitpbmxpbmUgdHlwZW5hbWUgY2FzdF9yZXR0eTxYLCBZPjo6cmV0X3R5cGUgY2FzdChZICZWYWwpIHsKKyAgYXNzZXJ0KGlzYTxYPihWYWwpICYmICJjYXN0PFR5PigpIGFyZ3VtZW50IG9mIGluY29tcGF0aWJsZSB0eXBlISIpOworICByZXR1cm4gY2FzdF9jb252ZXJ0X3ZhbDxYLCBZLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzaW1wbGlmeV90eXBlPFk+OjpTaW1wbGVUeXBlPjo6ZG9pdChWYWwpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgWCwgY2xhc3MgWT4KK2lubGluZSB0eXBlbmFtZSBjYXN0X3JldHR5PFgsIFkgKj46OnJldF90eXBlIGNhc3QoWSAqVmFsKSB7CisgIGFzc2VydChpc2E8WD4oVmFsKSAmJiAiY2FzdDxUeT4oKSBhcmd1bWVudCBvZiBpbmNvbXBhdGlibGUgdHlwZSEiKTsKKyAgcmV0dXJuIGNhc3RfY29udmVydF92YWw8WCwgWSosCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHNpbXBsaWZ5X3R5cGU8WSo+OjpTaW1wbGVUeXBlPjo6ZG9pdChWYWwpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgWCwgY2xhc3MgWT4KK2lubGluZSB0eXBlbmFtZSBjYXN0X3JldHR5PFgsIHN0ZDo6dW5pcXVlX3B0cjxZPj46OnJldF90eXBlCitjYXN0KHN0ZDo6dW5pcXVlX3B0cjxZPiAmJlZhbCkgeworICBhc3NlcnQoaXNhPFg+KFZhbC5nZXQoKSkgJiYgImNhc3Q8VHk+KCkgYXJndW1lbnQgb2YgaW5jb21wYXRpYmxlIHR5cGUhIik7CisgIHVzaW5nIHJldF90eXBlID0gdHlwZW5hbWUgY2FzdF9yZXR0eTxYLCBzdGQ6OnVuaXF1ZV9wdHI8WT4+OjpyZXRfdHlwZTsKKyAgcmV0dXJuIHJldF90eXBlKAorICAgICAgY2FzdF9jb252ZXJ0X3ZhbDxYLCBZICosIHR5cGVuYW1lIHNpbXBsaWZ5X3R5cGU8WSAqPjo6U2ltcGxlVHlwZT46OmRvaXQoCisgICAgICAgICAgVmFsLnJlbGVhc2UoKSkpOworfQorCisvLyBjYXN0X29yX251bGw8WD4gLSBGdW5jdGlvbmFsbHkgaWRlbnRpY2FsIHRvIGNhc3QsIGV4Y2VwdCB0aGF0IGEgbnVsbCB2YWx1ZSBpcworLy8gYWNjZXB0ZWQuCisvLwordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitMTFZNX05PRElTQ0FSRCBpbmxpbmUKKyAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhaXNfc2ltcGxlX3R5cGU8WT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGNhc3RfcmV0dHk8WCwgY29uc3QgWT46OnJldF90eXBlPjo6dHlwZQorICAgIGNhc3Rfb3JfbnVsbChjb25zdCBZICZWYWwpIHsKKyAgaWYgKCFWYWwpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIGFzc2VydChpc2E8WD4oVmFsKSAmJiAiY2FzdF9vcl9udWxsPFR5PigpIGFyZ3VtZW50IG9mIGluY29tcGF0aWJsZSB0eXBlISIpOworICByZXR1cm4gY2FzdDxYPihWYWwpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgWCwgY2xhc3MgWT4KK0xMVk1fTk9ESVNDQVJEIGlubGluZQorICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPCFpc19zaW1wbGVfdHlwZTxZPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgY2FzdF9yZXR0eTxYLCBZPjo6cmV0X3R5cGU+Ojp0eXBlCisgICAgY2FzdF9vcl9udWxsKFkgJlZhbCkgeworICBpZiAoIVZhbCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgYXNzZXJ0KGlzYTxYPihWYWwpICYmICJjYXN0X29yX251bGw8VHk+KCkgYXJndW1lbnQgb2YgaW5jb21wYXRpYmxlIHR5cGUhIik7CisgIHJldHVybiBjYXN0PFg+KFZhbCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgorTExWTV9OT0RJU0NBUkQgaW5saW5lIHR5cGVuYW1lIGNhc3RfcmV0dHk8WCwgWSAqPjo6cmV0X3R5cGUKK2Nhc3Rfb3JfbnVsbChZICpWYWwpIHsKKyAgaWYgKCFWYWwpIHJldHVybiBudWxscHRyOworICBhc3NlcnQoaXNhPFg+KFZhbCkgJiYgImNhc3Rfb3JfbnVsbDxUeT4oKSBhcmd1bWVudCBvZiBpbmNvbXBhdGlibGUgdHlwZSEiKTsKKyAgcmV0dXJuIGNhc3Q8WD4oVmFsKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitpbmxpbmUgdHlwZW5hbWUgY2FzdF9yZXR0eTxYLCBzdGQ6OnVuaXF1ZV9wdHI8WT4+OjpyZXRfdHlwZQorY2FzdF9vcl9udWxsKHN0ZDo6dW5pcXVlX3B0cjxZPiAmJlZhbCkgeworICBpZiAoIVZhbCkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIGNhc3Q8WD4oc3RkOjptb3ZlKFZhbCkpOworfQorCisvLyBkeW5fY2FzdDxYPiAtIFJldHVybiB0aGUgYXJndW1lbnQgcGFyYW1ldGVyIGNhc3QgdG8gdGhlIHNwZWNpZmllZCB0eXBlLiAgVGhpcworLy8gY2FzdGluZyBvcGVyYXRvciByZXR1cm5zIG51bGwgaWYgdGhlIGFyZ3VtZW50IGlzIG9mIHRoZSB3cm9uZyB0eXBlLCBzbyBpdCBjYW4KKy8vIGJlIHVzZWQgdG8gdGVzdCBmb3IgYSB0eXBlIGFzIHdlbGwgYXMgY2FzdCBpZiBzdWNjZXNzZnVsLiAgVGhpcyBzaG91bGQgYmUKKy8vIHVzZWQgaW4gdGhlIGNvbnRleHQgb2YgYW4gaWYgc3RhdGVtZW50IGxpa2UgdGhpczoKKy8vCisvLyAgaWYgKGNvbnN0IEluc3RydWN0aW9uICpJID0gZHluX2Nhc3Q8SW5zdHJ1Y3Rpb24+KG15VmFsKSkgeyAuLi4gfQorLy8KKwordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitMTFZNX05PRElTQ0FSRCBpbmxpbmUKKyAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhaXNfc2ltcGxlX3R5cGU8WT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGNhc3RfcmV0dHk8WCwgY29uc3QgWT46OnJldF90eXBlPjo6dHlwZQorICAgIGR5bl9jYXN0KGNvbnN0IFkgJlZhbCkgeworICByZXR1cm4gaXNhPFg+KFZhbCkgPyBjYXN0PFg+KFZhbCkgOiBudWxscHRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgWCwgY2xhc3MgWT4KK0xMVk1fTk9ESVNDQVJEIGlubGluZSB0eXBlbmFtZSBjYXN0X3JldHR5PFgsIFk+OjpyZXRfdHlwZSBkeW5fY2FzdChZICZWYWwpIHsKKyAgcmV0dXJuIGlzYTxYPihWYWwpID8gY2FzdDxYPihWYWwpIDogbnVsbHB0cjsKK30KKwordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitMTFZNX05PRElTQ0FSRCBpbmxpbmUgdHlwZW5hbWUgY2FzdF9yZXR0eTxYLCBZICo+OjpyZXRfdHlwZSBkeW5fY2FzdChZICpWYWwpIHsKKyAgcmV0dXJuIGlzYTxYPihWYWwpID8gY2FzdDxYPihWYWwpIDogbnVsbHB0cjsKK30KKworLy8gZHluX2Nhc3Rfb3JfbnVsbDxYPiAtIEZ1bmN0aW9uYWxseSBpZGVudGljYWwgdG8gZHluX2Nhc3QsIGV4Y2VwdCB0aGF0IGEgbnVsbAorLy8gdmFsdWUgaXMgYWNjZXB0ZWQuCisvLwordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitMTFZNX05PRElTQ0FSRCBpbmxpbmUKKyAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhaXNfc2ltcGxlX3R5cGU8WT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGNhc3RfcmV0dHk8WCwgY29uc3QgWT46OnJldF90eXBlPjo6dHlwZQorICAgIGR5bl9jYXN0X29yX251bGwoY29uc3QgWSAmVmFsKSB7CisgIHJldHVybiAoVmFsICYmIGlzYTxYPihWYWwpKSA/IGNhc3Q8WD4oVmFsKSA6IG51bGxwdHI7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgorTExWTV9OT0RJU0NBUkQgaW5saW5lCisgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IWlzX3NpbXBsZV90eXBlPFk+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBjYXN0X3JldHR5PFgsIFk+OjpyZXRfdHlwZT46OnR5cGUKKyAgICBkeW5fY2FzdF9vcl9udWxsKFkgJlZhbCkgeworICByZXR1cm4gKFZhbCAmJiBpc2E8WD4oVmFsKSkgPyBjYXN0PFg+KFZhbCkgOiBudWxscHRyOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgWCwgY2xhc3MgWT4KK0xMVk1fTk9ESVNDQVJEIGlubGluZSB0eXBlbmFtZSBjYXN0X3JldHR5PFgsIFkgKj46OnJldF90eXBlCitkeW5fY2FzdF9vcl9udWxsKFkgKlZhbCkgeworICByZXR1cm4gKFZhbCAmJiBpc2E8WD4oVmFsKSkgPyBjYXN0PFg+KFZhbCkgOiBudWxscHRyOworfQorCisvLyB1bmlxdWVfZHluX2Nhc3Q8WD4gLSBHaXZlbiBhIHVuaXF1ZV9wdHI8WT4sIHRyeSB0byByZXR1cm4gYSB1bmlxdWVfcHRyPFg+LAorLy8gdGFraW5nIG93bmVyc2hpcCBvZiB0aGUgaW5wdXQgcG9pbnRlciBpZmYgaXNhPFg+KFZhbCkgaXMgdHJ1ZS4gIElmIHRoZQorLy8gY2FzdCBpcyBzdWNjZXNzZnVsLCBGcm9tIHJlZmVycyB0byBudWxscHRyIG9uIGV4aXQgYW5kIHRoZSBjYXN0ZWQgdmFsdWUKKy8vIGlzIHJldHVybmVkLiAgSWYgdGhlIGNhc3QgaXMgdW5zdWNjZXNzZnVsLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBudWxscHRyCisvLyBhbmQgRnJvbSBpcyB1bmNoYW5nZWQuCit0ZW1wbGF0ZSA8Y2xhc3MgWCwgY2xhc3MgWT4KK0xMVk1fTk9ESVNDQVJEIGlubGluZSBhdXRvIHVuaXF1ZV9keW5fY2FzdChzdGQ6OnVuaXF1ZV9wdHI8WT4gJlZhbCkKKyAgICAtPiBkZWNsdHlwZShjYXN0PFg+KFZhbCkpIHsKKyAgaWYgKCFpc2E8WD4oVmFsKSkKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgcmV0dXJuIGNhc3Q8WD4oc3RkOjptb3ZlKFZhbCkpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgWCwgY2xhc3MgWT4KK0xMVk1fTk9ESVNDQVJEIGlubGluZSBhdXRvIHVuaXF1ZV9keW5fY2FzdChzdGQ6OnVuaXF1ZV9wdHI8WT4gJiZWYWwpCisgICAgLT4gZGVjbHR5cGUoY2FzdDxYPihWYWwpKSB7CisgIHJldHVybiB1bmlxdWVfZHluX2Nhc3Q8WCwgWT4oVmFsKTsKK30KKworLy8gZHluX2Nhc3Rfb3JfbnVsbDxYPiAtIEZ1bmN0aW9uYWxseSBpZGVudGljYWwgdG8gdW5pcXVlX2R5bl9jYXN0LCBleGNlcHQgdGhhdAorLy8gYSBudWxsIHZhbHVlIGlzIGFjY2VwdGVkLgordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitMTFZNX05PRElTQ0FSRCBpbmxpbmUgYXV0byB1bmlxdWVfZHluX2Nhc3Rfb3JfbnVsbChzdGQ6OnVuaXF1ZV9wdHI8WT4gJlZhbCkKKyAgICAtPiBkZWNsdHlwZShjYXN0PFg+KFZhbCkpIHsKKyAgaWYgKCFWYWwpCisgICAgcmV0dXJuIG51bGxwdHI7CisgIHJldHVybiB1bmlxdWVfZHluX2Nhc3Q8WCwgWT4oVmFsKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFgsIGNsYXNzIFk+CitMTFZNX05PRElTQ0FSRCBpbmxpbmUgYXV0byB1bmlxdWVfZHluX2Nhc3Rfb3JfbnVsbChzdGQ6OnVuaXF1ZV9wdHI8WT4gJiZWYWwpCisgICAgLT4gZGVjbHR5cGUoY2FzdDxYPihWYWwpKSB7CisgIHJldHVybiB1bmlxdWVfZHluX2Nhc3Rfb3JfbnVsbDxYLCBZPihWYWwpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0NBU1RJTkdfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NoZWNrZWRBcml0aG1ldGljLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ2hlY2tlZEFyaXRobWV0aWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OGJjZTA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NoZWNrZWRBcml0aG1ldGljLmgKQEAgLTAsMCArMSw4MyBAQAorLy89PS0tIGxsdm0vU3VwcG9ydC9DaGVja2VkQXJpdGhtZXRpYy5oIC0gU2FmZSBhcml0aG1ldGljYWwgb3BlcmF0aW9ucyAqLSBDKysgLy8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgZ2VuZXJpYyBmdW5jdGlvbnMgZm9yIG9wZXJhdGluZyBvbiBpbnRlZ2VycyB3aGljaAorLy8gZ2l2ZSB0aGUgaW5kaWNhdGlvbiBvbiB3aGV0aGVyIHRoZSBvcGVyYXRpb24gaGFzIG92ZXJmbG93bi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9DSEVDS0VEQVJJVEhNRVRJQ19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9DSEVDS0VEQVJJVEhNRVRJQ19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BUEludC5oIgorCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSB7CisKKy8vLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGFwcGx5IGEgZ2l2ZW4gbWV0aG9kIG9mIFxjIEFQSW50IFxwIEYgdG8gXHAgTEhTIGFuZAorLy8vIFxwIFJIUywgYW5kIHdyaXRlIHRoZSBvdXRwdXQgaW50byBccCBSZXMuCisvLy8gXHJldHVybiBXaGV0aGVyIHRoZSBvcGVyYXRpb24gb3ZlcmZsb3dzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEY+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2ludGVncmFsPFQ+Ojp2YWx1ZSAmJiBzaXplb2YoVCkgKiA4IDw9IDY0LAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbD46OnR5cGUKK2NoZWNrZWRPcChUIExIUywgVCBSSFMsIEYgT3AsIFQgKlJlcyA9IG51bGxwdHIsIGJvb2wgU2lnbmVkID0gdHJ1ZSkgeworICBsbHZtOjpBUEludCBBTEhTKC8qQml0U2l6ZT0qL3NpemVvZihUKSAqIDgsIExIUywgU2lnbmVkKTsKKyAgbGx2bTo6QVBJbnQgQVJIUygvKkJpdFNpemU9Ki9zaXplb2YoVCkgKiA4LCBSSFMsIFNpZ25lZCk7CisgIGJvb2wgT3ZlcmZsb3c7CisgIGxsdm06OkFQSW50IE91dCA9IChBTEhTLipPcCkoQVJIUywgT3ZlcmZsb3cpOworICBpZiAoUmVzKQorICAgICpSZXMgPSBTaWduZWQgPyBPdXQuZ2V0U0V4dFZhbHVlKCkgOiBPdXQuZ2V0WkV4dFZhbHVlKCk7CisgIHJldHVybiBPdmVyZmxvdzsKK30KK30KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQWRkIHR3byBzaWduZWQgaW50ZWdlcnMgXHAgTEhTIGFuZCBccCBSSFMsIHdyaXRlIGludG8gXHAgUmVzIGlmIG5vbi1udWxsLgorLy8vIERvZXMgbm90IGd1YXJhbnRlZSBzYXR1cmF0aW5nIGFyaXRobWV0aWMuCisvLy8gXHJldHVybiBXaGV0aGVyIHRoZSByZXN1bHQgb3ZlcmZsb3dzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NpZ25lZDxUPjo6dmFsdWUsIGJvb2w+Ojp0eXBlCitjaGVja2VkQWRkKFQgTEhTLCBUIFJIUywgVCAqUmVzID0gbnVsbHB0cikgeworICByZXR1cm4gY2hlY2tlZE9wKExIUywgUkhTLCAmbGx2bTo6QVBJbnQ6OnNhZGRfb3YsIFJlcyk7Cit9CisKKy8vLyBNdWx0aXBseSB0d28gc2lnbmVkIGludGVnZXJzIFxwIExIUyBhbmQgXHAgUkhTLCB3cml0ZSBpbnRvIFxwIFJlcyBpZgorLy8vIG5vbi1udWxsLgorLy8vIERvZXMgbm90IGd1YXJhbnRlZSBzYXR1cmF0aW5nIGFyaXRobWV0aWMuCisvLy8gXHJldHVybiBXaGV0aGVyIHRoZSByZXN1bHQgb3ZlcmZsb3dzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3NpZ25lZDxUPjo6dmFsdWUsIGJvb2w+Ojp0eXBlCitjaGVja2VkTXVsKFQgTEhTLCBUIFJIUywgVCAqUmVzID0gbnVsbHB0cikgeworICByZXR1cm4gY2hlY2tlZE9wKExIUywgUkhTLCAmbGx2bTo6QVBJbnQ6OnNtdWxfb3YsIFJlcyk7Cit9CisKKy8vLyBBZGQgdHdvIHVuc2lnbmVkIGludGVnZXJzIFxwIExIUyBhbmQgXHAgUkhTLCB3cml0ZSBpbnRvIFxwIFJlcyBpZiBub24tbnVsbC4KKy8vLyBEb2VzIG5vdCBndWFyYW50ZWUgc2F0dXJhdGluZyBhcml0aG1ldGljLgorLy8vIFxyZXR1cm4gV2hldGhlciB0aGUgcmVzdWx0IG92ZXJmbG93cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc191bnNpZ25lZDxUPjo6dmFsdWUsIGJvb2w+Ojp0eXBlCitjaGVja2VkQWRkVW5zaWduZWQoVCBMSFMsIFQgUkhTLCBUICpSZXMgPSBudWxscHRyKSB7CisgIHJldHVybiBjaGVja2VkT3AoTEhTLCBSSFMsICZsbHZtOjpBUEludDo6dWFkZF9vdiwgUmVzLCAvKlNpZ25lZD0qL2ZhbHNlKTsKK30KKworLy8vIE11bHRpcGx5IHR3byB1bnNpZ25lZCBpbnRlZ2VycyBccCBMSFMgYW5kIFxwIFJIUywgd3JpdGUgaW50byBccCBSZXMgaWYKKy8vLyBub24tbnVsbC4KKy8vLyBEb2VzIG5vdCBndWFyYW50ZWUgc2F0dXJhdGluZyBhcml0aG1ldGljLgorLy8vIFxyZXR1cm4gV2hldGhlciB0aGUgcmVzdWx0IG92ZXJmbG93cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc191bnNpZ25lZDxUPjo6dmFsdWUsIGJvb2w+Ojp0eXBlCitjaGVja2VkTXVsVW5zaWduZWQoVCBMSFMsIFQgUkhTLCBUICpSZXMgPSBudWxscHRyKSB7CisgIHJldHVybiBjaGVja2VkT3AoTEhTLCBSSFMsICZsbHZtOjpBUEludDo6dW11bF9vdiwgUmVzLCAvKlNpZ25lZD0qL2ZhbHNlKTsKK30KKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ2hyb25vLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ2hyb25vLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTk0MDY4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DaHJvbm8uaApAQCAtMCwwICsxLDE2NCBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9DaHJvbm8uaCAtIFV0aWxpdGllcyBmb3IgVGltaW5nIE1hbmlwdWxhdGlvbi0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQ0hST05PX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0NIUk9OT19ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0UHJvdmlkZXJzLmgiCisKKyNpbmNsdWRlIDxjaHJvbm8+CisjaW5jbHVkZSA8Y3RpbWU+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBzeXMgeworCisvLy8gQSB0aW1lIHBvaW50IG9uIHRoZSBzeXN0ZW0gY2xvY2suIFRoaXMgaXMgcHJvdmlkZWQgZm9yIHR3byByZWFzb25zOgorLy8vIC0gdG8gaW5zdWxhdGUgdXMgYWdhaW5zIHN1YnRsZSBkaWZmZXJlbmNlcyBpbiBiZWhhdm9pciB0byBkaWZmZXJlbmNlcyBpbgorLy8vICAgc3lzdGVtIGNsb2NrIHByZWNpc2lvbiAod2hpY2ggaXMgaW1wbGVtZW50YXRpb24tZGVmaW5lZCBhbmQgZGlmZmVycyBiZXR3ZWVuCisvLy8gICBwbGF0Zm9ybXMpLgorLy8vIC0gdG8gc2hvcnRlbiB0aGUgdHlwZSBuYW1lCisvLy8gVGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlzIG5hbm9zZWNvbmRzLiBJZiBuZWVkIGEgc3BlY2lmaWMgcHJlY2lzaW9uIHNwZWNpZnkKKy8vLyBpdCBleHBsaWNpdGx5LiBJZiB1bnN1cmUsIHVzZSB0aGUgZGVmYXVsdC4gSWYgeW91IG5lZWQgYSB0aW1lIHBvaW50IG9uIGEKKy8vLyBjbG9jayBvdGhlciB0aGFuIHRoZSBzeXN0ZW1fY2xvY2ssIHVzZSBzdGQ6OmNocm9ubyBkaXJlY3RseS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBEID0gc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzPgordXNpbmcgVGltZVBvaW50ID0gc3RkOjpjaHJvbm86OnRpbWVfcG9pbnQ8c3RkOjpjaHJvbm86OnN5c3RlbV9jbG9jaywgRD47CisKKy8vLyBDb252ZXJ0IGEgVGltZVBvaW50IHRvIHN0ZDo6dGltZV90CitMTFZNX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIGlubGluZSBzdGQ6OnRpbWVfdCB0b1RpbWVUKFRpbWVQb2ludDw+IFRQKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ubzsKKyAgcmV0dXJuIHN5c3RlbV9jbG9jazo6dG9fdGltZV90KAorICAgICAgdGltZV9wb2ludF9jYXN0PHN5c3RlbV9jbG9jazo6dGltZV9wb2ludDo6ZHVyYXRpb24+KFRQKSk7Cit9CisKKy8vLyBDb252ZXJ0IGEgc3RkOjp0aW1lX3QgdG8gYSBUaW1lUG9pbnQKK0xMVk1fQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgaW5saW5lIFRpbWVQb2ludDxzdGQ6OmNocm9ubzo6c2Vjb25kcz4KK3RvVGltZVBvaW50KHN0ZDo6dGltZV90IFQpIHsKKyAgdXNpbmcgbmFtZXNwYWNlIHN0ZDo6Y2hyb25vOworICByZXR1cm4gdGltZV9wb2ludF9jYXN0PHNlY29uZHM+KHN5c3RlbV9jbG9jazo6ZnJvbV90aW1lX3QoVCkpOworfQorCit9IC8vIG5hbWVzcGFjZSBzeXMKKworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBzeXM6OlRpbWVQb2ludDw+IFRQKTsKKworLy8vIEZvcm1hdCBwcm92aWRlciBmb3IgVGltZVBvaW50PD4KKy8vLworLy8vIFRoZSBvcHRpb25zIHN0cmluZyBpcyBhIHN0cmZ0aW1lIGZvcm1hdCBzdHJpbmcsIHdpdGggZXh0ZW5zaW9uczoKKy8vLyAgIC0gJUwgaXMgbWlsbGlzOiAwMDAtOTk5CisvLy8gICAtICVmIGlzIG1pY3JvczogMDAwMDAwLTk5OTk5OQorLy8vICAgLSAlTiBpcyBuYW5vczogMDAwMDAwMDAwIC0gOTk5OTk5OTk5CisvLy8KKy8vLyBJZiBubyBvcHRpb25zIGFyZSBnaXZlbiwgdGhlIGRlZmF1bHQgZm9ybWF0IGlzICIlWS0lbS0lZCAlSDolTTolUy4lTiIuCit0ZW1wbGF0ZSA8Pgorc3RydWN0IGZvcm1hdF9wcm92aWRlcjxzeXM6OlRpbWVQb2ludDw+PiB7CisgIHN0YXRpYyB2b2lkIGZvcm1hdChjb25zdCBzeXM6OlRpbWVQb2ludDw+ICZUUCwgbGx2bTo6cmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFN0eWxlKTsKK307CisKKy8vLyBJbXBsZW1lbnRhdGlvbiBvZiBmb3JtYXRfcHJvdmlkZXI8VD4gZm9yIGR1cmF0aW9uIHR5cGVzLgorLy8vCisvLy8gVGhlIG9wdGlvbnMgc3RyaW5nIG9mIGEgZHVyYXRpb24gIHR5cGUgaGFzIHRoZSBncmFtbWFyOgorLy8vCisvLy8gICBkdXJhdGlvbl9vcHRpb25zICA6Oj0gW3VuaXRdW3Nob3dfdW5pdCBbbnVtYmVyX29wdGlvbnNdXQorLy8vICAgdW5pdCAgICAgICAgICAgICAgOjo9IGBoYHxgbWB8YHNgfGBtc3xgdXNgfGBuc2AKKy8vLyAgIHNob3dfdW5pdCAgICAgICAgIDo6PSBgK2AgfCBgLWAKKy8vLyAgIG51bWJlcl9vcHRpb25zICAgIDo6PSBvcHRpb25zIHN0cmluZyBmb3IgYSBpbnRlZ3JhbCBvciBmbG9hdGluZyBwb2ludCB0eXBlCisvLy8KKy8vLyAgIEV4YW1wbGVzCisvLy8gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vLyAgIHwgIG9wdGlvbnMgIHwgSW5wdXQgfCBPdXRwdXQgICAgfAorLy8vICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLy8gICB8ICIiICAgICAgICB8IDFzICAgIHwgMSBzICAgICAgIHwKKy8vLyAgIHwgIm1zIiAgICAgIHwgMXMgICAgfCAxMDAwIG1zICAgfAorLy8vICAgfCAibXMtIiAgICAgfCAxcyAgICB8IDEwMDAgICAgICB8CisvLy8gICB8ICJtcy1uIiAgICB8IDFzICAgIHwgMSwwMDAgICAgIHwKKy8vLyAgIHwgIiIgICAgICAgIHwgMS4wcyAgfCAxLjAwIHMgICAgfAorLy8vICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLy8KKy8vLyAgSWYgdGhlIHVuaXQgb2YgdGhlIGR1cmF0aW9uIHR5cGUgaXMgbm90IG9uZSBvZiB0aGUgdW5pdHMgc3BlY2lmaWVkIGFib3ZlLAorLy8vICBpdCBpcyBzdGlsbCBwb3NzaWJsZSB0byBmb3JtYXQgaXQsIHByb3ZpZGVkIHlvdSBleHBsaWNpdGx5IHJlcXVlc3QgYQorLy8vICBkaXNwbGF5IHVuaXQgb3IgeW91IHJlcXVlc3QgdGhhdCB0aGUgdW5pdCBpcyBub3QgZGlzcGxheWVkLgorCituYW1lc3BhY2UgZGV0YWlsIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBQZXJpb2Q+IHN0cnVjdCB1bml0IHsgc3RhdGljIGNvbnN0IGNoYXIgdmFsdWVbXTsgfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBQZXJpb2Q+IGNvbnN0IGNoYXIgdW5pdDxQZXJpb2Q+Ojp2YWx1ZVtdID0gIiI7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCB1bml0PHN0ZDo6cmF0aW88MzYwMD4+IHsgc3RhdGljIGNvbnN0IGNoYXIgdmFsdWVbXTsgfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCB1bml0PHN0ZDo6cmF0aW88NjA+PiB7IHN0YXRpYyBjb25zdCBjaGFyIHZhbHVlW107IH07Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgdW5pdDxzdGQ6OnJhdGlvPDE+PiB7IHN0YXRpYyBjb25zdCBjaGFyIHZhbHVlW107IH07Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgdW5pdDxzdGQ6Om1pbGxpPiB7IHN0YXRpYyBjb25zdCBjaGFyIHZhbHVlW107IH07Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgdW5pdDxzdGQ6Om1pY3JvPiB7IHN0YXRpYyBjb25zdCBjaGFyIHZhbHVlW107IH07Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgdW5pdDxzdGQ6Om5hbm8+IHsgc3RhdGljIGNvbnN0IGNoYXIgdmFsdWVbXTsgfTsKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUmVwLCB0eXBlbmFtZSBQZXJpb2Q+CitzdHJ1Y3QgZm9ybWF0X3Byb3ZpZGVyPHN0ZDo6Y2hyb25vOjpkdXJhdGlvbjxSZXAsIFBlcmlvZD4+IHsKK3ByaXZhdGU6CisgIHR5cGVkZWYgc3RkOjpjaHJvbm86OmR1cmF0aW9uPFJlcCwgUGVyaW9kPiBEdXI7CisgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDwKKyAgICAgIHN0ZDo6Y2hyb25vOjp0cmVhdF9hc19mbG9hdGluZ19wb2ludDxSZXA+Ojp2YWx1ZSwgZG91YmxlLCBpbnRtYXhfdD46OnR5cGUKKyAgICAgIEludGVybmFsUmVwOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBc1BlcmlvZD4gc3RhdGljIEludGVybmFsUmVwIGdldEFzKGNvbnN0IER1ciAmRCkgeworICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ6OmNocm9ubzsKKyAgICByZXR1cm4gZHVyYXRpb25fY2FzdDxkdXJhdGlvbjxJbnRlcm5hbFJlcCwgQXNQZXJpb2Q+PihEKS5jb3VudCgpOworICB9CisKKyAgc3RhdGljIHN0ZDo6cGFpcjxJbnRlcm5hbFJlcCwgU3RyaW5nUmVmPiBjb25zdW1lVW5pdChTdHJpbmdSZWYgJlN0eWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEdXIgJkQpIHsKKyAgICB1c2luZyBuYW1lc3BhY2Ugc3RkOjpjaHJvbm87CisgICAgaWYgKFN0eWxlLmNvbnN1bWVfZnJvbnQoIm5zIikpCisgICAgICByZXR1cm4ge2dldEFzPHN0ZDo6bmFubz4oRCksICJucyJ9OworICAgIGlmIChTdHlsZS5jb25zdW1lX2Zyb250KCJ1cyIpKQorICAgICAgcmV0dXJuIHtnZXRBczxzdGQ6Om1pY3JvPihEKSwgInVzIn07CisgICAgaWYgKFN0eWxlLmNvbnN1bWVfZnJvbnQoIm1zIikpCisgICAgICByZXR1cm4ge2dldEFzPHN0ZDo6bWlsbGk+KEQpLCAibXMifTsKKyAgICBpZiAoU3R5bGUuY29uc3VtZV9mcm9udCgicyIpKQorICAgICAgcmV0dXJuIHtnZXRBczxzdGQ6OnJhdGlvPDE+PihEKSwgInMifTsKKyAgICBpZiAoU3R5bGUuY29uc3VtZV9mcm9udCgibSIpKQorICAgICAgcmV0dXJuIHtnZXRBczxzdGQ6OnJhdGlvPDYwPj4oRCksICJtIn07CisgICAgaWYgKFN0eWxlLmNvbnN1bWVfZnJvbnQoImgiKSkKKyAgICAgIHJldHVybiB7Z2V0QXM8c3RkOjpyYXRpbzwzNjAwPj4oRCksICJoIn07CisgICAgcmV0dXJuIHtELmNvdW50KCksIGRldGFpbDo6dW5pdDxQZXJpb2Q+Ojp2YWx1ZX07CisgIH0KKworICBzdGF0aWMgYm9vbCBjb25zdW1lU2hvd1VuaXQoU3RyaW5nUmVmICZTdHlsZSkgeworICAgIGlmIChTdHlsZS5lbXB0eSgpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgaWYgKFN0eWxlLmNvbnN1bWVfZnJvbnQoIi0iKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBpZiAoU3R5bGUuY29uc3VtZV9mcm9udCgiKyIpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgYXNzZXJ0KDAgJiYgIlVucmVjb2duaXNlZCBkdXJhdGlvbiBmb3JtYXQiKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCitwdWJsaWM6CisgIHN0YXRpYyB2b2lkIGZvcm1hdChjb25zdCBEdXIgJkQsIGxsdm06OnJhd19vc3RyZWFtICZTdHJlYW0sIFN0cmluZ1JlZiBTdHlsZSkgeworICAgIEludGVybmFsUmVwIGNvdW50OworICAgIFN0cmluZ1JlZiB1bml0OworICAgIHN0ZDo6dGllKGNvdW50LCB1bml0KSA9IGNvbnN1bWVVbml0KFN0eWxlLCBEKTsKKyAgICBib29sIHNob3dfdW5pdCA9IGNvbnN1bWVTaG93VW5pdChTdHlsZSk7CisKKyAgICBmb3JtYXRfcHJvdmlkZXI8SW50ZXJuYWxSZXA+Ojpmb3JtYXQoY291bnQsIFN0cmVhbSwgU3R5bGUpOworCisgICAgaWYgKHNob3dfdW5pdCkgeworICAgICAgYXNzZXJ0KCF1bml0LmVtcHR5KCkpOworICAgICAgU3RyZWFtIDw8ICIgIiA8PCB1bml0OworICAgIH0KKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0NIUk9OT19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ29kZUdlbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NvZGVHZW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjllMzMxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NvZGVHZW4uaApAQCAtMCwwICsxLDYyIEBACisvLz09PS0tIGxsdm0vU3VwcG9ydC9Db2RlR2VuLmggLSBDb2RlR2VuIENvbmNlcHRzIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmUgc29tZSB0eXBlcyB3aGljaCBkZWZpbmUgY29kZSBnZW5lcmF0aW9uIGNvbmNlcHRzLiBGb3IKKy8vIGV4YW1wbGUsIHJlbG9jYXRpb24gbW9kZWwuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQ09ERUdFTl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9DT0RFR0VOX0gKKworbmFtZXNwYWNlIGxsdm0geworCisgIC8vIFJlbG9jYXRpb24gbW9kZWwgdHlwZXMuCisgIG5hbWVzcGFjZSBSZWxvYyB7CisgIGVudW0gTW9kZWwgeyBTdGF0aWMsIFBJQ18sIER5bmFtaWNOb1BJQywgUk9QSSwgUldQSSwgUk9QSV9SV1BJIH07CisgIH0KKworICAvLyBDb2RlIG1vZGVsIHR5cGVzLgorICBuYW1lc3BhY2UgQ29kZU1vZGVsIHsKKyAgICAvLyBTeW5jIGNoYW5nZXMgd2l0aCBDb2RlR2VuQ1dyYXBwZXJzLmguCisgIGVudW0gTW9kZWwgeyBTbWFsbCwgS2VybmVsLCBNZWRpdW0sIExhcmdlIH07CisgIH0KKworICBuYW1lc3BhY2UgUElDTGV2ZWwgeworICAgIC8vIFRoaXMgaXMgdXNlZCB0byBtYXAgLWZwaWMvLWZQSUMuCisgICAgZW51bSBMZXZlbCB7IE5vdFBJQz0wLCBTbWFsbFBJQz0xLCBCaWdQSUM9MiB9OworICB9CisKKyAgbmFtZXNwYWNlIFBJRUxldmVsIHsKKyAgICBlbnVtIExldmVsIHsgRGVmYXVsdD0wLCBTbWFsbD0xLCBMYXJnZT0yIH07CisgIH0KKworICAvLyBUTFMgbW9kZWxzLgorICBuYW1lc3BhY2UgVExTTW9kZWwgeworICAgIGVudW0gTW9kZWwgeworICAgICAgR2VuZXJhbER5bmFtaWMsCisgICAgICBMb2NhbER5bmFtaWMsCisgICAgICBJbml0aWFsRXhlYywKKyAgICAgIExvY2FsRXhlYworICAgIH07CisgIH0KKworICAvLyBDb2RlIGdlbmVyYXRpb24gb3B0aW1pemF0aW9uIGxldmVsLgorICBuYW1lc3BhY2UgQ29kZUdlbk9wdCB7CisgICAgZW51bSBMZXZlbCB7CisgICAgICBOb25lLCAgICAgICAgLy8gLU8wCisgICAgICBMZXNzLCAgICAgICAgLy8gLU8xCisgICAgICBEZWZhdWx0LCAgICAgLy8gLU8yLCAtT3MKKyAgICAgIEFnZ3Jlc3NpdmUgICAvLyAtTzMKKyAgICB9OworICB9CisKK30gIC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Db2RlR2VuQ292ZXJhZ2UuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Db2RlR2VuQ292ZXJhZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNWJkODM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NvZGVHZW5Db3ZlcmFnZS5oCkBAIC0wLDAgKzEsMzcgQEAKKy8vPT0gbGx2bS9TdXBwb3J0L0NvZGVHZW5Db3ZlcmFnZS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUgVGhpcyBmaWxlIHByb3ZpZGVzIHJ1bGUgY292ZXJhZ2UgdHJhY2tpbmcgZm9yIHRhYmxlZ2VuLWVyYXRlZCBDb2RlR2VuLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQ09ERUdFTkNPVkVSQUdFX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0NPREVHRU5DT1ZFUkFHRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9CaXRWZWN0b3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTExWTUNvbnRleHQ7CitjbGFzcyBNZW1vcnlCdWZmZXI7CisKK2NsYXNzIENvZGVHZW5Db3ZlcmFnZSB7Citwcm90ZWN0ZWQ6CisgIEJpdFZlY3RvciBSdWxlQ292ZXJhZ2U7CisKK3B1YmxpYzoKKyAgQ29kZUdlbkNvdmVyYWdlKCk7CisKKyAgdm9pZCBzZXRDb3ZlcmVkKHVpbnQ2NF90IFJ1bGVJRCk7CisgIGJvb2wgaXNDb3ZlcmVkKHVpbnQ2NF90IFJ1bGVJRCk7CisKKyAgYm9vbCBwYXJzZShNZW1vcnlCdWZmZXIgJkJ1ZmZlciwgU3RyaW5nUmVmIEJhY2tlbmROYW1lKTsKKyAgYm9vbCBlbWl0KFN0cmluZ1JlZiBGaWxlUHJlZml4LCBTdHJpbmdSZWYgQmFja2VuZE5hbWUpIGNvbnN0OworICB2b2lkIHJlc2V0KCk7Cit9OworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIGlmbmRlZiBMTFZNX1NVUFBPUlRfQ09ERUdFTkNPVkVSQUdFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NvbW1hbmRMaW5lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjA0M2MxMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oCkBAIC0wLDAgKzEsMTk0NyBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIC0gQ29tbWFuZCBsaW5lIGhhbmRsZXIgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBjb21tYW5kIGxpbmUgYXJndW1lbnQgcHJvY2Vzc29yIHRoYXQgaXMgdXNlZnVsIHdoZW4KKy8vIGNyZWF0aW5nIGEgdG9vbC4gIEl0IHByb3ZpZGVzIGEgc2ltcGxlLCBtaW5pbWFsaXN0aWMgaW50ZXJmYWNlIHRoYXQgaXMgZWFzaWx5CisvLyBleHRlbnNpYmxlIGFuZCBzdXBwb3J0cyBub25sb2NhbCAobGlicmFyeSkgY29tbWFuZCBsaW5lIG9wdGlvbnMuCisvLworLy8gTm90ZSB0aGF0IHJhdGhlciB0aGFuIHRyeWluZyB0byBmaWd1cmUgb3V0IHdoYXQgdGhpcyBjb2RlIGRvZXMsIHlvdSBzaG91bGQKKy8vIHJlYWQgdGhlIGxpYnJhcnkgZG9jdW1lbnRhdGlvbiBsb2NhdGVkIGluIGRvY3MvQ29tbWFuZExpbmUuaHRtbCBvciBsb29rcyBhdAorLy8gdGhlIG1hbnkgZXhhbXBsZSB1c2FnZXMgaW4gdG9vbHMvKi8qLmNwcAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0NPTU1BTkRMSU5FX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0NPTU1BTkRMSU5FX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3JfcmFuZ2UuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYW5hZ2VkU3RhdGljLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgU3RyaW5nU2F2ZXI7CitjbGFzcyByYXdfb3N0cmVhbTsKKworLy8vIGNsIE5hbWVzcGFjZSAtIFRoaXMgbmFtZXNwYWNlIGNvbnRhaW5zIGFsbCBvZiB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbgorLy8vIHByb2Nlc3NpbmcgbWFjaGluZXJ5LiAgSXQgaXMgaW50ZW50aW9uYWxseSBhIHNob3J0IG5hbWUgdG8gbWFrZSBxdWFsaWZpZWQKKy8vLyB1c2FnZSBjb25jaXNlLgorbmFtZXNwYWNlIGNsIHsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFBhcnNlQ29tbWFuZExpbmVPcHRpb25zIC0gQ29tbWFuZCBsaW5lIG9wdGlvbiBwcm9jZXNzaW5nIGVudHJ5IHBvaW50LgorLy8KKy8vIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLiBPdGhlcndpc2UsIHRoaXMgd2lsbCBwcmludCB0aGUgZXJyb3IgbWVzc2FnZSB0bworLy8gc3RkZXJyIGFuZCBleGl0IGlmIFxwIEVycnMgaXMgbm90IHNldCAobnVsbHB0ciBieSBkZWZhdWx0KSwgb3IgcHJpbnQgdGhlCisvLyBlcnJvciBtZXNzYWdlIHRvIFxwIEVycnMgYW5kIHJldHVybiBmYWxzZSBpZiBccCBFcnJzIGlzIHByb3ZpZGVkLgorYm9vbCBQYXJzZUNvbW1hbmRMaW5lT3B0aW9ucyhpbnQgYXJnYywgY29uc3QgY2hhciAqY29uc3QgKmFyZ3YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBPdmVydmlldyA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfb3N0cmVhbSAqRXJycyA9IG51bGxwdHIpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUGFyc2VFbnZpcm9ubWVudE9wdGlvbnMgLSBFbnZpcm9ubWVudCB2YXJpYWJsZSBvcHRpb24gcHJvY2Vzc2luZyBhbHRlcm5hdGUKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnkgcG9pbnQuCisvLwordm9pZCBQYXJzZUVudmlyb25tZW50T3B0aW9ucyhjb25zdCBjaGFyICpwcm9nTmFtZSwgY29uc3QgY2hhciAqZW52dmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpPdmVydmlldyA9ICIiKTsKKworLy8gRnVuY3Rpb24gcG9pbnRlciB0eXBlIGZvciBwcmludGluZyB2ZXJzaW9uIGluZm9ybWF0aW9uLgordXNpbmcgVmVyc2lvblByaW50ZXJUeSA9IHN0ZDo6ZnVuY3Rpb248dm9pZChyYXdfb3N0cmVhbSAmKT47CisKKy8vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gU2V0VmVyc2lvblByaW50ZXIgLSBPdmVycmlkZSB0aGUgZGVmYXVsdCAoTExWTSBzcGVjaWZpYykgdmVyc2lvbiBwcmludGVyCisvLy8gICAgICAgICAgICAgICAgICAgICB1c2VkIHRvIHByaW50IG91dCB0aGUgdmVyc2lvbiB3aGVuIC0tdmVyc2lvbiBpcyBnaXZlbgorLy8vICAgICAgICAgICAgICAgICAgICAgb24gdGhlIGNvbW1hbmQgbGluZS4gVGhpcyBhbGxvd3Mgb3RoZXIgc3lzdGVtcyB1c2luZyB0aGUKKy8vLyAgICAgICAgICAgICAgICAgICAgIENvbW1hbmRMaW5lIHV0aWxpdGllcyB0byBwcmludCB0aGVpciBvd24gdmVyc2lvbiBzdHJpbmcuCit2b2lkIFNldFZlcnNpb25QcmludGVyKFZlcnNpb25QcmludGVyVHkgZnVuYyk7CisKKy8vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gQWRkRXh0cmFWZXJzaW9uUHJpbnRlciAtIEFkZCBhbiBleHRyYSBwcmludGVyIHRvIHVzZSBpbiBhZGRpdGlvbiB0byB0aGUKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdCBvbmUuIFRoaXMgY2FuIGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcywKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgYW5kIGVhY2ggdGltZSBpdCBhZGRzIGEgbmV3IGZ1bmN0aW9uIHRvIHRoZSBsaXN0CisvLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgY2FsbGVkIGFmdGVyIHRoZSBiYXNpYyBMTFZNIHZlcnNpb24KKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRpbmcgaXMgY29tcGxldGUuIEVhY2ggY2FuIHRoZW4gYWRkIGFkZGl0aW9uYWwKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgaW5mb3JtYXRpb24gc3BlY2lmaWMgdG8gdGhlIHRvb2wuCit2b2lkIEFkZEV4dHJhVmVyc2lvblByaW50ZXIoVmVyc2lvblByaW50ZXJUeSBmdW5jKTsKKworLy8gUHJpbnRPcHRpb25WYWx1ZXMgLSBQcmludCBvcHRpb24gdmFsdWVzLgorLy8gV2l0aCAtcHJpbnQtb3B0aW9ucyBwcmludCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9wdGlvbiB2YWx1ZXMgYW5kIGRlZmF1bHRzLgorLy8gV2l0aCAtcHJpbnQtYWxsLW9wdGlvbnMgcHJpbnQgYWxsIG9wdGlvbiB2YWx1ZXMuCisvLyAoQ3VycmVudGx5IG5vdCBwZXJmZWN0LCBidXQgYmVzdC1lZmZvcnQuKQordm9pZCBQcmludE9wdGlvblZhbHVlcygpOworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9uIC0gQWRkTGl0ZXJhbE9wdGlvbiBuZWVkcyB0byBiZSB1cCBoZXJlIHRvIG1ha2UgZ2NjIGhhcHB5LgorY2xhc3MgT3B0aW9uOworCisvLy8gXGJyaWVmIEFkZHMgYSBuZXcgb3B0aW9uIGZvciBwYXJzaW5nIGFuZCBwcm92aWRlcyB0aGUgb3B0aW9uIGl0IHJlZmVycyB0by4KKy8vLworLy8vIFxwYXJhbSBPIHBvaW50ZXIgdG8gdGhlIG9wdGlvbgorLy8vIFxwYXJhbSBOYW1lIHRoZSBzdHJpbmcgbmFtZSBmb3IgdGhlIG9wdGlvbiB0byBoYW5kbGUgZHVyaW5nIHBhcnNpbmcKKy8vLworLy8vIExpdGVyYWwgb3B0aW9ucyBhcmUgdXNlZCBieSBzb21lIHBhcnNlcnMgdG8gcmVnaXN0ZXIgc3BlY2lhbCBvcHRpb24gdmFsdWVzLgorLy8vIFRoaXMgaXMgaG93IHRoZSBQYXNzTmFtZVBhcnNlciByZWdpc3RlcnMgcGFzcyBuYW1lcyBmb3Igb3B0Lgordm9pZCBBZGRMaXRlcmFsT3B0aW9uKE9wdGlvbiAmTywgU3RyaW5nUmVmIE5hbWUpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRmxhZ3MgcGVybWl0dGVkIHRvIGJlIHBhc3NlZCB0byBjb21tYW5kIGxpbmUgYXJndW1lbnRzCisvLworCitlbnVtIE51bU9jY3VycmVuY2VzRmxhZyB7IC8vIEZsYWdzIGZvciB0aGUgbnVtYmVyIG9mIG9jY3VycmVuY2VzIGFsbG93ZWQKKyAgT3B0aW9uYWwgPSAweDAwLCAgICAgICAgLy8gWmVybyBvciBPbmUgb2NjdXJyZW5jZQorICBaZXJvT3JNb3JlID0gMHgwMSwgICAgICAvLyBaZXJvIG9yIG1vcmUgb2NjdXJyZW5jZXMgYWxsb3dlZAorICBSZXF1aXJlZCA9IDB4MDIsICAgICAgICAvLyBPbmUgb2NjdXJyZW5jZSByZXF1aXJlZAorICBPbmVPck1vcmUgPSAweDAzLCAgICAgICAvLyBPbmUgb3IgbW9yZSBvY2N1cnJlbmNlcyByZXF1aXJlZAorCisgIC8vIENvbnN1bWVBZnRlciAtIEluZGljYXRlcyB0aGF0IHRoaXMgb3B0aW9uIGlzIGZlZCBhbnl0aGluZyB0aGF0IGZvbGxvd3MgdGhlCisgIC8vIGxhc3QgcG9zaXRpb25hbCBhcmd1bWVudCByZXF1aXJlZCBieSB0aGUgYXBwbGljYXRpb24gKGl0IGlzIGFuIGVycm9yIGlmCisgIC8vIHRoZXJlIGFyZSB6ZXJvIHBvc2l0aW9uYWwgYXJndW1lbnRzLCBhbmQgYSBDb25zdW1lQWZ0ZXIgb3B0aW9uIGlzIHVzZWQpLgorICAvLyBUaHVzLCBmb3IgZXhhbXBsZSwgYWxsIGFyZ3VtZW50cyB0byBMTEkgYXJlIHByb2Nlc3NlZCB1bnRpbCBhIGZpbGVuYW1lIGlzCisgIC8vIGZvdW5kLiAgT25jZSBhIGZpbGVuYW1lIGlzIGZvdW5kLCBhbGwgb2YgdGhlIHN1Y2NlZWRpbmcgYXJndW1lbnRzIGFyZQorICAvLyBwYXNzZWQsIHVucHJvY2Vzc2VkLCB0byB0aGUgQ29uc3VtZUFmdGVyIG9wdGlvbi4KKyAgLy8KKyAgQ29uc3VtZUFmdGVyID0gMHgwNAorfTsKKworZW51bSBWYWx1ZUV4cGVjdGVkIHsgLy8gSXMgYSB2YWx1ZSByZXF1aXJlZCBmb3IgdGhlIG9wdGlvbj8KKyAgLy8gemVybyByZXNlcnZlZCBmb3IgdGhlIHVuc3BlY2lmaWVkIHZhbHVlCisgIFZhbHVlT3B0aW9uYWwgPSAweDAxLCAgLy8gVGhlIHZhbHVlIGNhbiBhcHBlYXIuLi4gb3Igbm90CisgIFZhbHVlUmVxdWlyZWQgPSAweDAyLCAgLy8gVGhlIHZhbHVlIGlzIHJlcXVpcmVkIHRvIGFwcGVhciEKKyAgVmFsdWVEaXNhbGxvd2VkID0gMHgwMyAvLyBBIHZhbHVlIG1heSBub3QgYmUgc3BlY2lmaWVkIChmb3IgZmxhZ3MpCit9OworCitlbnVtIE9wdGlvbkhpZGRlbiB7ICAgLy8gQ29udHJvbCB3aGV0aGVyIC1oZWxwIHNob3dzIHRoaXMgb3B0aW9uCisgIE5vdEhpZGRlbiA9IDB4MDAsICAgLy8gT3B0aW9uIGluY2x1ZGVkIGluIC1oZWxwICYgLWhlbHAtaGlkZGVuCisgIEhpZGRlbiA9IDB4MDEsICAgICAgLy8gLWhlbHAgZG9lc24ndCwgYnV0IC1oZWxwLWhpZGRlbiBkb2VzCisgIFJlYWxseUhpZGRlbiA9IDB4MDIgLy8gTmVpdGhlciAtaGVscCBub3IgLWhlbHAtaGlkZGVuIHNob3cgdGhpcyBhcmcKK307CisKKy8vIEZvcm1hdHRpbmcgZmxhZ3MgLSBUaGlzIGNvbnRyb2xzIHNwZWNpYWwgZmVhdHVyZXMgdGhhdCB0aGUgb3B0aW9uIG1pZ2h0IGhhdmUKKy8vIHRoYXQgY2F1c2UgaXQgdG8gYmUgcGFyc2VkIGRpZmZlcmVudGx5Li4uCisvLworLy8gUHJlZml4IC0gVGhpcyBvcHRpb24gYWxsb3dzIGFyZ3VtZW50cyB0aGF0IGFyZSBvdGhlcndpc2UgdW5yZWNvZ25pemVkIHRvIGJlCisvLyBtYXRjaGVkIGJ5IG9wdGlvbnMgdGhhdCBhcmUgYSBwcmVmaXggb2YgdGhlIGFjdHVhbCB2YWx1ZS4gIFRoaXMgaXMgdXNlZnVsIGZvcgorLy8gY2FzZXMgbGlrZSBhIGxpbmtlciwgd2hlcmUgb3B0aW9ucyBhcmUgdHlwaWNhbGx5IG9mIHRoZSBmb3JtICctbGZvbycgb3IKKy8vICctTC4uLy4uL2luY2x1ZGUnIHdoZXJlIC1sIG9yIC1MIGFyZSB0aGUgYWN0dWFsIGZsYWdzLiAgV2hlbiBwcmVmaXggaXMKKy8vIGVuYWJsZWQsIGFuZCB1c2VkLCB0aGUgdmFsdWUgZm9yIHRoZSBmbGFnIGNvbWVzIGZyb20gdGhlIHN1ZmZpeCBvZiB0aGUKKy8vIGFyZ3VtZW50LgorLy8KKy8vIEdyb3VwaW5nIC0gV2l0aCB0aGlzIG9wdGlvbiBlbmFibGVkLCBtdWx0aXBsZSBsZXR0ZXIgb3B0aW9ucyBhcmUgYWxsb3dlZCB0bworLy8gYnVuY2ggdG9nZXRoZXIgd2l0aCBvbmx5IGEgc2luZ2xlIGh5cGhlbiBmb3IgdGhlIHdob2xlIGdyb3VwLiAgVGhpcyBhbGxvd3MKKy8vIGVtdWxhdGlvbiBvZiB0aGUgYmVoYXZpb3IgdGhhdCBscyB1c2VzIGZvciBleGFtcGxlOiBscyAtbGEgPT09IGxzIC1sIC1hCisvLworCitlbnVtIEZvcm1hdHRpbmdGbGFncyB7CisgIE5vcm1hbEZvcm1hdHRpbmcgPSAweDAwLCAvLyBOb3RoaW5nIHNwZWNpYWwKKyAgUG9zaXRpb25hbCA9IDB4MDEsICAgICAgIC8vIElzIGEgcG9zaXRpb25hbCBhcmd1bWVudCwgbm8gJy0nIHJlcXVpcmVkCisgIFByZWZpeCA9IDB4MDIsICAgICAgICAgICAvLyBDYW4gdGhpcyBvcHRpb24gZGlyZWN0bHkgcHJlZml4IGl0cyB2YWx1ZT8KKyAgR3JvdXBpbmcgPSAweDAzICAgICAgICAgIC8vIENhbiB0aGlzIG9wdGlvbiBncm91cCB3aXRoIG90aGVyIG9wdGlvbnM/Cit9OworCitlbnVtIE1pc2NGbGFncyB7ICAgICAgICAgICAgIC8vIE1pc2NlbGxhbmVvdXMgZmxhZ3MgdG8gYWRqdXN0IGFyZ3VtZW50CisgIENvbW1hU2VwYXJhdGVkID0gMHgwMSwgICAgIC8vIFNob3VsZCB0aGlzIGNsOjpsaXN0IHNwbGl0IGJldHdlZW4gY29tbWFzPworICBQb3NpdGlvbmFsRWF0c0FyZ3MgPSAweDAyLCAvLyBTaG91bGQgdGhpcyBwb3NpdGlvbmFsIGNsOjpsaXN0IGVhdCAtYXJncz8KKyAgU2luayA9IDB4MDQgICAgICAgICAgICAgICAgLy8gU2hvdWxkIHRoaXMgY2w6Omxpc3QgZWF0IGFsbCB1bmtub3duIG9wdGlvbnM/Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gT3B0aW9uIENhdGVnb3J5IGNsYXNzCisvLworY2xhc3MgT3B0aW9uQ2F0ZWdvcnkgeworcHJpdmF0ZToKKyAgU3RyaW5nUmVmIGNvbnN0IE5hbWU7CisgIFN0cmluZ1JlZiBjb25zdCBEZXNjcmlwdGlvbjsKKworICB2b2lkIHJlZ2lzdGVyQ2F0ZWdvcnkoKTsKKworcHVibGljOgorICBPcHRpb25DYXRlZ29yeShTdHJpbmdSZWYgY29uc3QgTmFtZSwKKyAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIGNvbnN0IERlc2NyaXB0aW9uID0gIiIpCisgICAgICA6IE5hbWUoTmFtZSksIERlc2NyaXB0aW9uKERlc2NyaXB0aW9uKSB7CisgICAgcmVnaXN0ZXJDYXRlZ29yeSgpOworICB9CisKKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisgIFN0cmluZ1JlZiBnZXREZXNjcmlwdGlvbigpIGNvbnN0IHsgcmV0dXJuIERlc2NyaXB0aW9uOyB9Cit9OworCisvLyBUaGUgZ2VuZXJhbCBPcHRpb24gQ2F0ZWdvcnkgKHVzZWQgYXMgZGVmYXVsdCBjYXRlZ29yeSkuCitleHRlcm4gT3B0aW9uQ2F0ZWdvcnkgR2VuZXJhbENhdGVnb3J5OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU3ViQ29tbWFuZCBjbGFzcworLy8KK2NsYXNzIFN1YkNvbW1hbmQgeworcHJpdmF0ZToKKyAgU3RyaW5nUmVmIE5hbWU7CisgIFN0cmluZ1JlZiBEZXNjcmlwdGlvbjsKKworcHJvdGVjdGVkOgorICB2b2lkIHJlZ2lzdGVyU3ViQ29tbWFuZCgpOworICB2b2lkIHVucmVnaXN0ZXJTdWJDb21tYW5kKCk7CisKK3B1YmxpYzoKKyAgU3ViQ29tbWFuZChTdHJpbmdSZWYgTmFtZSwgU3RyaW5nUmVmIERlc2NyaXB0aW9uID0gIiIpCisgICAgICA6IE5hbWUoTmFtZSksIERlc2NyaXB0aW9uKERlc2NyaXB0aW9uKSB7CisgICAgICAgIHJlZ2lzdGVyU3ViQ29tbWFuZCgpOworICB9CisgIFN1YkNvbW1hbmQoKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCByZXNldCgpOworCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSBjb25zdDsKKworICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKyAgU3RyaW5nUmVmIGdldERlc2NyaXB0aW9uKCkgY29uc3QgeyByZXR1cm4gRGVzY3JpcHRpb247IH0KKworICBTbWFsbFZlY3RvcjxPcHRpb24gKiwgND4gUG9zaXRpb25hbE9wdHM7CisgIFNtYWxsVmVjdG9yPE9wdGlvbiAqLCA0PiBTaW5rT3B0czsKKyAgU3RyaW5nTWFwPE9wdGlvbiAqPiBPcHRpb25zTWFwOworCisgIE9wdGlvbiAqQ29uc3VtZUFmdGVyT3B0ID0gbnVsbHB0cjsgLy8gVGhlIENvbnN1bWVBZnRlciBvcHRpb24gaWYgaXQgZXhpc3RzLgorfTsKKworLy8gQSBzcGVjaWFsIHN1YmNvbW1hbmQgcmVwcmVzZW50aW5nIG5vIHN1YmNvbW1hbmQKK2V4dGVybiBNYW5hZ2VkU3RhdGljPFN1YkNvbW1hbmQ+IFRvcExldmVsU3ViQ29tbWFuZDsKKworLy8gQSBzcGVjaWFsIHN1YmNvbW1hbmQgdGhhdCBjYW4gYmUgdXNlZCB0byBwdXQgYW4gb3B0aW9uIGludG8gYWxsIHN1YmNvbW1hbmRzLgorZXh0ZXJuIE1hbmFnZWRTdGF0aWM8U3ViQ29tbWFuZD4gQWxsU3ViQ29tbWFuZHM7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBPcHRpb24gQmFzZSBjbGFzcworLy8KK2NsYXNzIE9wdGlvbiB7CisgIGZyaWVuZCBjbGFzcyBhbGlhczsKKworICAvLyBoYW5kbGVPY2N1cnJlbmNlcyAtIE92ZXJyaWRlbiBieSBzdWJjbGFzc2VzIHRvIGhhbmRsZSB0aGUgdmFsdWUgcGFzc2VkIGludG8KKyAgLy8gYW4gYXJndW1lbnQuICBTaG91bGQgcmV0dXJuIHRydWUgaWYgdGhlcmUgd2FzIGFuIGVycm9yIHByb2Nlc3NpbmcgdGhlCisgIC8vIGFyZ3VtZW50IGFuZCB0aGUgcHJvZ3JhbSBzaG91bGQgZXhpdC4KKyAgLy8KKyAgdmlydHVhbCBib29sIGhhbmRsZU9jY3VycmVuY2UodW5zaWduZWQgcG9zLCBTdHJpbmdSZWYgQXJnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEFyZykgPSAwOworCisgIHZpcnR1YWwgZW51bSBWYWx1ZUV4cGVjdGVkIGdldFZhbHVlRXhwZWN0ZWRGbGFnRGVmYXVsdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWVPcHRpb25hbDsKKyAgfQorCisgIC8vIE91dCBvZiBsaW5lIHZpcnR1YWwgZnVuY3Rpb24gdG8gcHJvdmlkZSBob21lIGZvciB0aGUgY2xhc3MuCisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworICBpbnQgTnVtT2NjdXJyZW5jZXMgPSAwOyAvLyBUaGUgbnVtYmVyIG9mIHRpbWVzIHNwZWNpZmllZAorICAvLyBPY2N1cnJlbmNlcywgSGlkZGVuRmxhZywgYW5kIEZvcm1hdHRpbmcgYXJlIGFsbCBlbnVtIHR5cGVzIGJ1dCB0byBhdm9pZAorICAvLyBwcm9ibGVtcyB3aXRoIHNpZ25lZCBlbnVtcyBpbiBiaXRmaWVsZHMuCisgIHVuc2lnbmVkIE9jY3VycmVuY2VzIDogMzsgLy8gZW51bSBOdW1PY2N1cnJlbmNlc0ZsYWcKKyAgLy8gbm90IHVzaW5nIHRoZSBlbnVtIHR5cGUgZm9yICdWYWx1ZScgYmVjYXVzZSB6ZXJvIGlzIGFuIGltcGxlbWVudGF0aW9uCisgIC8vIGRldGFpbCByZXByZXNlbnRpbmcgdGhlIG5vbi12YWx1ZQorICB1bnNpZ25lZCBWYWx1ZSA6IDI7CisgIHVuc2lnbmVkIEhpZGRlbkZsYWcgOiAyOyAvLyBlbnVtIE9wdGlvbkhpZGRlbgorICB1bnNpZ25lZCBGb3JtYXR0aW5nIDogMjsgLy8gZW51bSBGb3JtYXR0aW5nRmxhZ3MKKyAgdW5zaWduZWQgTWlzYyA6IDM7CisgIHVuc2lnbmVkIFBvc2l0aW9uID0gMDsgICAgICAgLy8gUG9zaXRpb24gb2YgbGFzdCBvY2N1cnJlbmNlIG9mIHRoZSBvcHRpb24KKyAgdW5zaWduZWQgQWRkaXRpb25hbFZhbHMgPSAwOyAvLyBHcmVhdGVyIHRoYW4gMCBmb3IgbXVsdGktdmFsdWVkIG9wdGlvbi4KKworcHVibGljOgorICBTdHJpbmdSZWYgQXJnU3RyOyAgIC8vIFRoZSBhcmd1bWVudCBzdHJpbmcgaXRzZWxmIChleDogImhlbHAiLCAibyIpCisgIFN0cmluZ1JlZiBIZWxwU3RyOyAgLy8gVGhlIGRlc2NyaXB0aXZlIHRleHQgbWVzc2FnZSBmb3IgLWhlbHAKKyAgU3RyaW5nUmVmIFZhbHVlU3RyOyAvLyBTdHJpbmcgZGVzY3JpYmluZyB3aGF0IHRoZSB2YWx1ZSBvZiB0aGlzIG9wdGlvbiBpcworICBPcHRpb25DYXRlZ29yeSAqQ2F0ZWdvcnk7IC8vIFRoZSBDYXRlZ29yeSB0aGlzIG9wdGlvbiBiZWxvbmdzIHRvCisgIFNtYWxsUHRyU2V0PFN1YkNvbW1hbmQgKiwgND4gU3ViczsgLy8gVGhlIHN1YmNvbW1hbmRzIHRoaXMgb3B0aW9uIGJlbG9uZ3MgdG8uCisgIGJvb2wgRnVsbHlJbml0aWFsaXplZCA9IGZhbHNlOyAvLyBIYXMgYWRkQXJndW1lbnQgYmVlbiBjYWxsZWQ/CisKKyAgaW5saW5lIGVudW0gTnVtT2NjdXJyZW5jZXNGbGFnIGdldE51bU9jY3VycmVuY2VzRmxhZygpIGNvbnN0IHsKKyAgICByZXR1cm4gKGVudW0gTnVtT2NjdXJyZW5jZXNGbGFnKU9jY3VycmVuY2VzOworICB9CisKKyAgaW5saW5lIGVudW0gVmFsdWVFeHBlY3RlZCBnZXRWYWx1ZUV4cGVjdGVkRmxhZygpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWUgPyAoKGVudW0gVmFsdWVFeHBlY3RlZClWYWx1ZSkgOiBnZXRWYWx1ZUV4cGVjdGVkRmxhZ0RlZmF1bHQoKTsKKyAgfQorCisgIGlubGluZSBlbnVtIE9wdGlvbkhpZGRlbiBnZXRPcHRpb25IaWRkZW5GbGFnKCkgY29uc3QgeworICAgIHJldHVybiAoZW51bSBPcHRpb25IaWRkZW4pSGlkZGVuRmxhZzsKKyAgfQorCisgIGlubGluZSBlbnVtIEZvcm1hdHRpbmdGbGFncyBnZXRGb3JtYXR0aW5nRmxhZygpIGNvbnN0IHsKKyAgICByZXR1cm4gKGVudW0gRm9ybWF0dGluZ0ZsYWdzKUZvcm1hdHRpbmc7CisgIH0KKworICBpbmxpbmUgdW5zaWduZWQgZ2V0TWlzY0ZsYWdzKCkgY29uc3QgeyByZXR1cm4gTWlzYzsgfQorICBpbmxpbmUgdW5zaWduZWQgZ2V0UG9zaXRpb24oKSBjb25zdCB7IHJldHVybiBQb3NpdGlvbjsgfQorICBpbmxpbmUgdW5zaWduZWQgZ2V0TnVtQWRkaXRpb25hbFZhbHMoKSBjb25zdCB7IHJldHVybiBBZGRpdGlvbmFsVmFsczsgfQorCisgIC8vIGhhc0FyZ1N0ciAtIFJldHVybiB0cnVlIGlmIHRoZSBhcmdzdHIgIT0gIiIKKyAgYm9vbCBoYXNBcmdTdHIoKSBjb25zdCB7IHJldHVybiAhQXJnU3RyLmVtcHR5KCk7IH0KKyAgYm9vbCBpc1Bvc2l0aW9uYWwoKSBjb25zdCB7IHJldHVybiBnZXRGb3JtYXR0aW5nRmxhZygpID09IGNsOjpQb3NpdGlvbmFsOyB9CisgIGJvb2wgaXNTaW5rKCkgY29uc3QgeyByZXR1cm4gZ2V0TWlzY0ZsYWdzKCkgJiBjbDo6U2luazsgfQorCisgIGJvb2wgaXNDb25zdW1lQWZ0ZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE51bU9jY3VycmVuY2VzRmxhZygpID09IGNsOjpDb25zdW1lQWZ0ZXI7CisgIH0KKworICBib29sIGlzSW5BbGxTdWJDb21tYW5kcygpIGNvbnN0IHsKKyAgICByZXR1cm4gYW55X29mKFN1YnMsIFtdKGNvbnN0IFN1YkNvbW1hbmQgKlNDKSB7CisgICAgICByZXR1cm4gU0MgPT0gJipBbGxTdWJDb21tYW5kczsKKyAgICB9KTsKKyAgfQorCisgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICAvLyBBY2Nlc3NvciBmdW5jdGlvbnMgc2V0IGJ5IE9wdGlvbk1vZGlmaWVycworICAvLworICB2b2lkIHNldEFyZ1N0cihTdHJpbmdSZWYgUyk7CisgIHZvaWQgc2V0RGVzY3JpcHRpb24oU3RyaW5nUmVmIFMpIHsgSGVscFN0ciA9IFM7IH0KKyAgdm9pZCBzZXRWYWx1ZVN0cihTdHJpbmdSZWYgUykgeyBWYWx1ZVN0ciA9IFM7IH0KKyAgdm9pZCBzZXROdW1PY2N1cnJlbmNlc0ZsYWcoZW51bSBOdW1PY2N1cnJlbmNlc0ZsYWcgVmFsKSB7IE9jY3VycmVuY2VzID0gVmFsOyB9CisgIHZvaWQgc2V0VmFsdWVFeHBlY3RlZEZsYWcoZW51bSBWYWx1ZUV4cGVjdGVkIFZhbCkgeyBWYWx1ZSA9IFZhbDsgfQorICB2b2lkIHNldEhpZGRlbkZsYWcoZW51bSBPcHRpb25IaWRkZW4gVmFsKSB7IEhpZGRlbkZsYWcgPSBWYWw7IH0KKyAgdm9pZCBzZXRGb3JtYXR0aW5nRmxhZyhlbnVtIEZvcm1hdHRpbmdGbGFncyBWKSB7IEZvcm1hdHRpbmcgPSBWOyB9CisgIHZvaWQgc2V0TWlzY0ZsYWcoZW51bSBNaXNjRmxhZ3MgTSkgeyBNaXNjIHw9IE07IH0KKyAgdm9pZCBzZXRQb3NpdGlvbih1bnNpZ25lZCBwb3MpIHsgUG9zaXRpb24gPSBwb3M7IH0KKyAgdm9pZCBzZXRDYXRlZ29yeShPcHRpb25DYXRlZ29yeSAmQykgeyBDYXRlZ29yeSA9ICZDOyB9CisgIHZvaWQgYWRkU3ViQ29tbWFuZChTdWJDb21tYW5kICZTKSB7IFN1YnMuaW5zZXJ0KCZTKTsgfQorCitwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IE9wdGlvbihlbnVtIE51bU9jY3VycmVuY2VzRmxhZyBPY2N1cnJlbmNlc0ZsYWcsCisgICAgICAgICAgICAgICAgICBlbnVtIE9wdGlvbkhpZGRlbiBIaWRkZW4pCisgICAgICA6IE9jY3VycmVuY2VzKE9jY3VycmVuY2VzRmxhZyksIFZhbHVlKDApLCBIaWRkZW5GbGFnKEhpZGRlbiksCisgICAgICAgIEZvcm1hdHRpbmcoTm9ybWFsRm9ybWF0dGluZyksIE1pc2MoMCksIENhdGVnb3J5KCZHZW5lcmFsQ2F0ZWdvcnkpIHt9CisKKyAgaW5saW5lIHZvaWQgc2V0TnVtQWRkaXRpb25hbFZhbHModW5zaWduZWQgbikgeyBBZGRpdGlvbmFsVmFscyA9IG47IH0KKworcHVibGljOgorICB2aXJ0dWFsIH5PcHRpb24oKSA9IGRlZmF1bHQ7CisKKyAgLy8gYWRkQXJndW1lbnQgLSBSZWdpc3RlciB0aGlzIGFyZ3VtZW50IHdpdGggdGhlIGNvbW1hbmRsaW5lIHN5c3RlbS4KKyAgLy8KKyAgdm9pZCBhZGRBcmd1bWVudCgpOworCisgIC8vLyBVbnJlZ2lzdGVycyB0aGlzIG9wdGlvbiBmcm9tIHRoZSBDb21tYW5kTGluZSBzeXN0ZW0uCisgIC8vLworICAvLy8gVGhpcyBvcHRpb24gbXVzdCBoYXZlIGJlZW4gdGhlIGxhc3Qgb3B0aW9uIHJlZ2lzdGVyZWQuCisgIC8vLyBGb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LgorICB2b2lkIHJlbW92ZUFyZ3VtZW50KCk7CisKKyAgLy8gUmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgb3B0aW9uIHRhZyBmb3IgcHJpbnRpbmcuLi4KKyAgdmlydHVhbCBzaXplX3QgZ2V0T3B0aW9uV2lkdGgoKSBjb25zdCA9IDA7CisKKyAgLy8gcHJpbnRPcHRpb25JbmZvIC0gUHJpbnQgb3V0IGluZm9ybWF0aW9uIGFib3V0IHRoaXMgb3B0aW9uLiAgVGhlCisgIC8vIHRvLWJlLW1haW50YWluZWQgd2lkdGggaXMgc3BlY2lmaWVkLgorICAvLworICB2aXJ0dWFsIHZvaWQgcHJpbnRPcHRpb25JbmZvKHNpemVfdCBHbG9iYWxXaWR0aCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgdm9pZCBwcmludE9wdGlvblZhbHVlKHNpemVfdCBHbG9iYWxXaWR0aCwgYm9vbCBGb3JjZSkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgdm9pZCBzZXREZWZhdWx0KCkgPSAwOworCisgIHN0YXRpYyB2b2lkIHByaW50SGVscFN0cihTdHJpbmdSZWYgSGVscFN0ciwgc2l6ZV90IEluZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBGaXJzdExpbmVJbmRlbnRlZEJ5KTsKKworICB2aXJ0dWFsIHZvaWQgZ2V0RXh0cmFPcHRpb25OYW1lcyhTbWFsbFZlY3RvckltcGw8U3RyaW5nUmVmPiAmKSB7fQorCisgIC8vIGFkZE9jY3VycmVuY2UgLSBXcmFwcGVyIGFyb3VuZCBoYW5kbGVPY2N1cnJlbmNlIHRoYXQgZW5mb3JjZXMgRmxhZ3MuCisgIC8vCisgIHZpcnR1YWwgYm9vbCBhZGRPY2N1cnJlbmNlKHVuc2lnbmVkIHBvcywgU3RyaW5nUmVmIEFyZ05hbWUsIFN0cmluZ1JlZiBWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBNdWx0aUFyZyA9IGZhbHNlKTsKKworICAvLyBQcmludHMgb3B0aW9uIG5hbWUgZm9sbG93ZWQgYnkgbWVzc2FnZS4gIEFsd2F5cyByZXR1cm5zIHRydWUuCisgIGJvb2wgZXJyb3IoY29uc3QgVHdpbmUgJk1lc3NhZ2UsIFN0cmluZ1JlZiBBcmdOYW1lID0gU3RyaW5nUmVmKCkpOworCisgIGlubGluZSBpbnQgZ2V0TnVtT2NjdXJyZW5jZXMoKSBjb25zdCB7IHJldHVybiBOdW1PY2N1cnJlbmNlczsgfQorICBpbmxpbmUgdm9pZCByZXNldCgpIHsgTnVtT2NjdXJyZW5jZXMgPSAwOyB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ29tbWFuZCBsaW5lIG9wdGlvbiBtb2RpZmllcnMgdGhhdCBjYW4gYmUgdXNlZCB0byBtb2RpZnkgdGhlIGJlaGF2aW9yIG9mCisvLyBjb21tYW5kIGxpbmUgb3B0aW9uIHBhcnNlcnMuLi4KKy8vCisKKy8vIGRlc2MgLSBNb2RpZmllciB0byBzZXQgdGhlIGRlc2NyaXB0aW9uIHNob3duIGluIHRoZSAtaGVscCBvdXRwdXQuLi4KK3N0cnVjdCBkZXNjIHsKKyAgU3RyaW5nUmVmIERlc2M7CisKKyAgZGVzYyhTdHJpbmdSZWYgU3RyKSA6IERlc2MoU3RyKSB7fQorCisgIHZvaWQgYXBwbHkoT3B0aW9uICZPKSBjb25zdCB7IE8uc2V0RGVzY3JpcHRpb24oRGVzYyk7IH0KK307CisKKy8vIHZhbHVlX2Rlc2MgLSBNb2RpZmllciB0byBzZXQgdGhlIHZhbHVlIGRlc2NyaXB0aW9uIHNob3duIGluIHRoZSAtaGVscAorLy8gb3V0cHV0Li4uCitzdHJ1Y3QgdmFsdWVfZGVzYyB7CisgIFN0cmluZ1JlZiBEZXNjOworCisgIHZhbHVlX2Rlc2MoU3RyaW5nUmVmIFN0cikgOiBEZXNjKFN0cikge30KKworICB2b2lkIGFwcGx5KE9wdGlvbiAmTykgY29uc3QgeyBPLnNldFZhbHVlU3RyKERlc2MpOyB9Cit9OworCisvLyBpbml0IC0gU3BlY2lmeSBhIGRlZmF1bHQgKGluaXRpYWwpIHZhbHVlIGZvciB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50LCBpZgorLy8gdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgZm9yIHRoZSBhcmd1bWVudCB0eXBlIGRvZXMgbm90IGdpdmUgeW91IHdoYXQgeW91CisvLyB3YW50LiAgVGhpcyBpcyBvbmx5IHZhbGlkIG9uICJvcHQiIGFyZ3VtZW50cywgbm90IG9uICJsaXN0IiBhcmd1bWVudHMuCisvLwordGVtcGxhdGUgPGNsYXNzIFR5PiBzdHJ1Y3QgaW5pdGlhbGl6ZXIgeworICBjb25zdCBUeSAmSW5pdDsKKyAgaW5pdGlhbGl6ZXIoY29uc3QgVHkgJlZhbCkgOiBJbml0KFZhbCkge30KKworICB0ZW1wbGF0ZSA8Y2xhc3MgT3B0PiB2b2lkIGFwcGx5KE9wdCAmTykgY29uc3QgeyBPLnNldEluaXRpYWxWYWx1ZShJbml0KTsgfQorfTsKKwordGVtcGxhdGUgPGNsYXNzIFR5PiBpbml0aWFsaXplcjxUeT4gaW5pdChjb25zdCBUeSAmVmFsKSB7CisgIHJldHVybiBpbml0aWFsaXplcjxUeT4oVmFsKTsKK30KKworLy8gbG9jYXRpb24gLSBBbGxvdyB0aGUgdXNlciB0byBzcGVjaWZ5IHdoaWNoIGV4dGVybmFsIHZhcmlhYmxlIHRoZXkgd2FudCB0bworLy8gc3RvcmUgdGhlIHJlc3VsdHMgb2YgdGhlIGNvbW1hbmQgbGluZSBhcmd1bWVudCBwcm9jZXNzaW5nIGludG8sIGlmIHRoZXkgZG9uJ3QKKy8vIHdhbnQgdG8gc3RvcmUgaXQgaW4gdGhlIG9wdGlvbiBpdHNlbGYuCisvLwordGVtcGxhdGUgPGNsYXNzIFR5PiBzdHJ1Y3QgTG9jYXRpb25DbGFzcyB7CisgIFR5ICZMb2M7CisKKyAgTG9jYXRpb25DbGFzcyhUeSAmTCkgOiBMb2MoTCkge30KKworICB0ZW1wbGF0ZSA8Y2xhc3MgT3B0PiB2b2lkIGFwcGx5KE9wdCAmTykgY29uc3QgeyBPLnNldExvY2F0aW9uKE8sIExvYyk7IH0KK307CisKK3RlbXBsYXRlIDxjbGFzcyBUeT4gTG9jYXRpb25DbGFzczxUeT4gbG9jYXRpb24oVHkgJkwpIHsKKyAgcmV0dXJuIExvY2F0aW9uQ2xhc3M8VHk+KEwpOworfQorCisvLyBjYXQgLSBTcGVjaWZpeSB0aGUgT3B0aW9uIGNhdGVnb3J5IGZvciB0aGUgY29tbWFuZCBsaW5lIGFyZ3VtZW50IHRvIGJlbG9uZworLy8gdG8uCitzdHJ1Y3QgY2F0IHsKKyAgT3B0aW9uQ2F0ZWdvcnkgJkNhdGVnb3J5OworCisgIGNhdChPcHRpb25DYXRlZ29yeSAmYykgOiBDYXRlZ29yeShjKSB7fQorCisgIHRlbXBsYXRlIDxjbGFzcyBPcHQ+IHZvaWQgYXBwbHkoT3B0ICZPKSBjb25zdCB7IE8uc2V0Q2F0ZWdvcnkoQ2F0ZWdvcnkpOyB9Cit9OworCisvLyBzdWIgLSBTcGVjaWZ5IHRoZSBzdWJjb21tYW5kIHRoYXQgdGhpcyBvcHRpb24gYmVsb25ncyB0by4KK3N0cnVjdCBzdWIgeworICBTdWJDb21tYW5kICZTdWI7CisKKyAgc3ViKFN1YkNvbW1hbmQgJlMpIDogU3ViKFMpIHt9CisKKyAgdGVtcGxhdGUgPGNsYXNzIE9wdD4gdm9pZCBhcHBseShPcHQgJk8pIGNvbnN0IHsgTy5hZGRTdWJDb21tYW5kKFN1Yik7IH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBPcHRpb25WYWx1ZSBjbGFzcworCisvLyBTdXBwb3J0IHZhbHVlIGNvbXBhcmlzb24gb3V0c2lkZSB0aGUgdGVtcGxhdGUuCitzdHJ1Y3QgR2VuZXJpY09wdGlvblZhbHVlIHsKKyAgdmlydHVhbCBib29sIGNvbXBhcmUoY29uc3QgR2VuZXJpY09wdGlvblZhbHVlICZWKSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgR2VuZXJpY09wdGlvblZhbHVlKCkgPSBkZWZhdWx0OworICBHZW5lcmljT3B0aW9uVmFsdWUoY29uc3QgR2VuZXJpY09wdGlvblZhbHVlJikgPSBkZWZhdWx0OworICBHZW5lcmljT3B0aW9uVmFsdWUgJm9wZXJhdG9yPShjb25zdCBHZW5lcmljT3B0aW9uVmFsdWUgJikgPSBkZWZhdWx0OworICB+R2VuZXJpY09wdGlvblZhbHVlKCkgPSBkZWZhdWx0OworCitwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgRGF0YVR5cGU+IHN0cnVjdCBPcHRpb25WYWx1ZTsKKworLy8gVGhlIGRlZmF1bHQgdmFsdWUgc2FmZWx5IGRvZXMgbm90aGluZy4gT3B0aW9uIHZhbHVlIHByaW50aW5nIGlzIG9ubHkKKy8vIGJlc3QtZWZmb3J0LgordGVtcGxhdGUgPGNsYXNzIERhdGFUeXBlLCBib29sIGlzQ2xhc3M+CitzdHJ1Y3QgT3B0aW9uVmFsdWVCYXNlIDogcHVibGljIEdlbmVyaWNPcHRpb25WYWx1ZSB7CisgIC8vIFRlbXBvcmFyeSBzdG9yYWdlIGZvciBhcmd1bWVudCBwYXNzaW5nLgorICB1c2luZyBXcmFwcGVyVHlwZSA9IE9wdGlvblZhbHVlPERhdGFUeXBlPjsKKworICBib29sIGhhc1ZhbHVlKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICBjb25zdCBEYXRhVHlwZSAmZ2V0VmFsdWUoKSBjb25zdCB7IGxsdm1fdW5yZWFjaGFibGUoIm5vIGRlZmF1bHQgdmFsdWUiKTsgfQorCisgIC8vIFNvbWUgb3B0aW9ucyBtYXkgdGFrZSB0aGVpciB2YWx1ZSBmcm9tIGEgZGlmZmVyZW50IGRhdGEgdHlwZS4KKyAgdGVtcGxhdGUgPGNsYXNzIERUPiB2b2lkIHNldFZhbHVlKGNvbnN0IERUICYgLypWKi8pIHt9CisKKyAgYm9vbCBjb21wYXJlKGNvbnN0IERhdGFUeXBlICYgLypWKi8pIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgYm9vbCBjb21wYXJlKGNvbnN0IEdlbmVyaWNPcHRpb25WYWx1ZSAmIC8qViovKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKK3Byb3RlY3RlZDoKKyAgfk9wdGlvblZhbHVlQmFzZSgpID0gZGVmYXVsdDsKK307CisKKy8vIFNpbXBsZSBjb3B5IG9mIHRoZSBvcHRpb24gdmFsdWUuCit0ZW1wbGF0ZSA8Y2xhc3MgRGF0YVR5cGU+IGNsYXNzIE9wdGlvblZhbHVlQ29weSA6IHB1YmxpYyBHZW5lcmljT3B0aW9uVmFsdWUgeworICBEYXRhVHlwZSBWYWx1ZTsKKyAgYm9vbCBWYWxpZCA9IGZhbHNlOworCitwcm90ZWN0ZWQ6CisgIE9wdGlvblZhbHVlQ29weShjb25zdCBPcHRpb25WYWx1ZUNvcHkmKSA9IGRlZmF1bHQ7CisgIE9wdGlvblZhbHVlQ29weSAmb3BlcmF0b3I9KGNvbnN0IE9wdGlvblZhbHVlQ29weSAmKSA9IGRlZmF1bHQ7CisgIH5PcHRpb25WYWx1ZUNvcHkoKSA9IGRlZmF1bHQ7CisKK3B1YmxpYzoKKyAgT3B0aW9uVmFsdWVDb3B5KCkgPSBkZWZhdWx0OworCisgIGJvb2wgaGFzVmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWxpZDsgfQorCisgIGNvbnN0IERhdGFUeXBlICZnZXRWYWx1ZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoVmFsaWQgJiYgImludmFsaWQgb3B0aW9uIHZhbHVlIik7CisgICAgcmV0dXJuIFZhbHVlOworICB9CisKKyAgdm9pZCBzZXRWYWx1ZShjb25zdCBEYXRhVHlwZSAmVikgeworICAgIFZhbGlkID0gdHJ1ZTsKKyAgICBWYWx1ZSA9IFY7CisgIH0KKworICBib29sIGNvbXBhcmUoY29uc3QgRGF0YVR5cGUgJlYpIGNvbnN0IHsgcmV0dXJuIFZhbGlkICYmIChWYWx1ZSAhPSBWKTsgfQorCisgIGJvb2wgY29tcGFyZShjb25zdCBHZW5lcmljT3B0aW9uVmFsdWUgJlYpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBjb25zdCBPcHRpb25WYWx1ZUNvcHk8RGF0YVR5cGU+ICZWQyA9CisgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IE9wdGlvblZhbHVlQ29weTxEYXRhVHlwZT4gJj4oVik7CisgICAgaWYgKCFWQy5oYXNWYWx1ZSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBjb21wYXJlKFZDLmdldFZhbHVlKCkpOworICB9Cit9OworCisvLyBOb24tY2xhc3Mgb3B0aW9uIHZhbHVlcy4KK3RlbXBsYXRlIDxjbGFzcyBEYXRhVHlwZT4KK3N0cnVjdCBPcHRpb25WYWx1ZUJhc2U8RGF0YVR5cGUsIGZhbHNlPiA6IE9wdGlvblZhbHVlQ29weTxEYXRhVHlwZT4geworICB1c2luZyBXcmFwcGVyVHlwZSA9IERhdGFUeXBlOworCitwcm90ZWN0ZWQ6CisgIE9wdGlvblZhbHVlQmFzZSgpID0gZGVmYXVsdDsKKyAgT3B0aW9uVmFsdWVCYXNlKGNvbnN0IE9wdGlvblZhbHVlQmFzZSYpID0gZGVmYXVsdDsKKyAgT3B0aW9uVmFsdWVCYXNlICZvcGVyYXRvcj0oY29uc3QgT3B0aW9uVmFsdWVCYXNlICYpID0gZGVmYXVsdDsKKyAgfk9wdGlvblZhbHVlQmFzZSgpID0gZGVmYXVsdDsKK307CisKKy8vIFRvcC1sZXZlbCBvcHRpb24gY2xhc3MuCit0ZW1wbGF0ZSA8Y2xhc3MgRGF0YVR5cGU+CitzdHJ1Y3QgT3B0aW9uVmFsdWUgZmluYWwKKyAgICA6IE9wdGlvblZhbHVlQmFzZTxEYXRhVHlwZSwgc3RkOjppc19jbGFzczxEYXRhVHlwZT46OnZhbHVlPiB7CisgIE9wdGlvblZhbHVlKCkgPSBkZWZhdWx0OworCisgIE9wdGlvblZhbHVlKGNvbnN0IERhdGFUeXBlICZWKSB7IHRoaXMtPnNldFZhbHVlKFYpOyB9CisKKyAgLy8gU29tZSBvcHRpb25zIG1heSB0YWtlIHRoZWlyIHZhbHVlIGZyb20gYSBkaWZmZXJlbnQgZGF0YSB0eXBlLgorICB0ZW1wbGF0ZSA8Y2xhc3MgRFQ+IE9wdGlvblZhbHVlPERhdGFUeXBlPiAmb3BlcmF0b3I9KGNvbnN0IERUICZWKSB7CisgICAgdGhpcy0+c2V0VmFsdWUoVik7CisgICAgcmV0dXJuICp0aGlzOworICB9Cit9OworCisvLyBPdGhlciBzYWZlLXRvLWNvcHktYnktdmFsdWUgY29tbW9uIG9wdGlvbiB0eXBlcy4KK2VudW0gYm9vbE9yRGVmYXVsdCB7IEJPVV9VTlNFVCwgQk9VX1RSVUUsIEJPVV9GQUxTRSB9OwordGVtcGxhdGUgPD4KK3N0cnVjdCBPcHRpb25WYWx1ZTxjbDo6Ym9vbE9yRGVmYXVsdD4gZmluYWwKKyAgICA6IE9wdGlvblZhbHVlQ29weTxjbDo6Ym9vbE9yRGVmYXVsdD4geworICB1c2luZyBXcmFwcGVyVHlwZSA9IGNsOjpib29sT3JEZWZhdWx0OworCisgIE9wdGlvblZhbHVlKCkgPSBkZWZhdWx0OworCisgIE9wdGlvblZhbHVlKGNvbnN0IGNsOjpib29sT3JEZWZhdWx0ICZWKSB7IHRoaXMtPnNldFZhbHVlKFYpOyB9CisKKyAgT3B0aW9uVmFsdWU8Y2w6OmJvb2xPckRlZmF1bHQ+ICZvcGVyYXRvcj0oY29uc3QgY2w6OmJvb2xPckRlZmF1bHQgJlYpIHsKKyAgICBzZXRWYWx1ZShWKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKK307CisKK3RlbXBsYXRlIDw+CitzdHJ1Y3QgT3B0aW9uVmFsdWU8c3RkOjpzdHJpbmc+IGZpbmFsIDogT3B0aW9uVmFsdWVDb3B5PHN0ZDo6c3RyaW5nPiB7CisgIHVzaW5nIFdyYXBwZXJUeXBlID0gU3RyaW5nUmVmOworCisgIE9wdGlvblZhbHVlKCkgPSBkZWZhdWx0OworCisgIE9wdGlvblZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nICZWKSB7IHRoaXMtPnNldFZhbHVlKFYpOyB9CisKKyAgT3B0aW9uVmFsdWU8c3RkOjpzdHJpbmc+ICZvcGVyYXRvcj0oY29uc3Qgc3RkOjpzdHJpbmcgJlYpIHsKKyAgICBzZXRWYWx1ZShWKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBFbnVtIHZhbHVlZCBjb21tYW5kIGxpbmUgb3B0aW9uCisvLworCisvLyBUaGlzIHJlcHJlc2VudHMgYSBzaW5nbGUgZW51bSB2YWx1ZSwgdXNpbmcgImludCIgYXMgdGhlIHVuZGVybHlpbmcgdHlwZS4KK3N0cnVjdCBPcHRpb25FbnVtVmFsdWUgeworICBTdHJpbmdSZWYgTmFtZTsKKyAgaW50IFZhbHVlOworICBTdHJpbmdSZWYgRGVzY3JpcHRpb247Cit9OworCisjZGVmaW5lIGNsRW51bVZhbChFTlVNVkFMLCBERVNDKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBsbHZtOjpjbDo6T3B0aW9uRW51bVZhbHVlIHsgI0VOVU1WQUwsIGludChFTlVNVkFMKSwgREVTQyB9CisjZGVmaW5lIGNsRW51bVZhbE4oRU5VTVZBTCwgRkxBR05BTUUsIERFU0MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBsbHZtOjpjbDo6T3B0aW9uRW51bVZhbHVlIHsgRkxBR05BTUUsIGludChFTlVNVkFMKSwgREVTQyB9CisKKy8vIHZhbHVlcyAtIEZvciBjdXN0b20gZGF0YSB0eXBlcywgYWxsb3cgc3BlY2lmeWluZyBhIGdyb3VwIG9mIHZhbHVlcyB0b2dldGhlcgorLy8gYXMgdGhlIHZhbHVlcyB0aGF0IGdvIGludG8gdGhlIG1hcHBpbmcgdGhhdCB0aGUgb3B0aW9uIGhhbmRsZXIgdXNlcy4KKy8vCitjbGFzcyBWYWx1ZXNDbGFzcyB7CisgIC8vIFVzZSBhIHZlY3RvciBpbnN0ZWFkIG9mIGEgbWFwLCBiZWNhdXNlIHRoZSBsaXN0cyBzaG91bGQgYmUgc2hvcnQsCisgIC8vIHRoZSBvdmVyaGVhZCBpcyBsZXNzLCBhbmQgbW9zdCBpbXBvcnRhbnRseSwgaXQga2VlcHMgdGhlbSBpbiB0aGUgb3JkZXIKKyAgLy8gaW5zZXJ0ZWQgc28gd2UgY2FuIHByaW50IG91ciBvcHRpb24gb3V0IG5pY2VseS4KKyAgU21hbGxWZWN0b3I8T3B0aW9uRW51bVZhbHVlLCA0PiBWYWx1ZXM7CisKK3B1YmxpYzoKKyAgVmFsdWVzQ2xhc3Moc3RkOjppbml0aWFsaXplcl9saXN0PE9wdGlvbkVudW1WYWx1ZT4gT3B0aW9ucykKKyAgICAgIDogVmFsdWVzKE9wdGlvbnMpIHt9CisKKyAgdGVtcGxhdGUgPGNsYXNzIE9wdD4gdm9pZCBhcHBseShPcHQgJk8pIGNvbnN0IHsKKyAgICBmb3IgKGF1dG8gVmFsdWUgOiBWYWx1ZXMpCisgICAgICBPLmdldFBhcnNlcigpLmFkZExpdGVyYWxPcHRpb24oVmFsdWUuTmFtZSwgVmFsdWUuVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUuRGVzY3JpcHRpb24pOworICB9Cit9OworCisvLy8gSGVscGVyIHRvIGJ1aWxkIGEgVmFsdWVzQ2xhc3MgYnkgZm9yd2FyZGluZyBhIHZhcmlhYmxlIG51bWJlciBvZiBhcmd1bWVudHMKKy8vLyBhcyBhbiBpbml0aWFsaXplciBsaXN0IHRvIHRoZSBWYWx1ZXNDbGFzcyBjb25zdHJ1Y3Rvci4KK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBPcHRzVHk+IFZhbHVlc0NsYXNzIHZhbHVlcyhPcHRzVHkuLi4gT3B0aW9ucykgeworICByZXR1cm4gVmFsdWVzQ2xhc3Moe09wdGlvbnMuLi59KTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIHBhcnNlciBjbGFzcyAtIFBhcmFtZXRlcml6YWJsZSBwYXJzZXIgZm9yIGRpZmZlcmVudCBkYXRhIHR5cGVzLiAgQnkgZGVmYXVsdCwKKy8vIGtub3duIGRhdGEgdHlwZXMgKHN0cmluZywgaW50LCBib29sKSBoYXZlIHNwZWNpYWxpemVkIHBhcnNlcnMsIHRoYXQgZG8gd2hhdAorLy8geW91IHdvdWxkIGV4cGVjdC4gIFRoZSBkZWZhdWx0IHBhcnNlciwgdXNlZCBmb3IgZGF0YSB0eXBlcyB0aGF0IGFyZSBub3QKKy8vIGJ1aWx0LWluLCB1c2VzIGEgbWFwcGluZyB0YWJsZSB0byBtYXAgc3BlY2lmaWMgb3B0aW9ucyB0byB2YWx1ZXMsIHdoaWNoIGlzCisvLyB1c2VkLCBhbW9uZyBvdGhlciB0aGluZ3MsIHRvIGhhbmRsZSBlbnVtIHR5cGVzLgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBnZW5lcmljX3BhcnNlcl9iYXNlIC0gVGhpcyBjbGFzcyBob2xkcyBhbGwgdGhlIG5vbi1nZW5lcmljIGNvZGUgdGhhdCB3ZSBkbworLy8gbm90IG5lZWQgcmVwbGljYXRlZCBmb3IgZXZlcnkgaW5zdGFuY2Ugb2YgdGhlIGdlbmVyaWMgcGFyc2VyLiAgVGhpcyBhbHNvCisvLyBhbGxvd3MgdXMgdG8gcHV0IHN0dWZmIGludG8gQ29tbWFuZExpbmUuY3BwCisvLworY2xhc3MgZ2VuZXJpY19wYXJzZXJfYmFzZSB7Citwcm90ZWN0ZWQ6CisgIGNsYXNzIEdlbmVyaWNPcHRpb25JbmZvIHsKKyAgcHVibGljOgorICAgIEdlbmVyaWNPcHRpb25JbmZvKFN0cmluZ1JlZiBuYW1lLCBTdHJpbmdSZWYgaGVscFN0cikKKyAgICAgICAgOiBOYW1lKG5hbWUpLCBIZWxwU3RyKGhlbHBTdHIpIHt9CisgICAgU3RyaW5nUmVmIE5hbWU7CisgICAgU3RyaW5nUmVmIEhlbHBTdHI7CisgIH07CisKK3B1YmxpYzoKKyAgZ2VuZXJpY19wYXJzZXJfYmFzZShPcHRpb24gJk8pIDogT3duZXIoTykge30KKworICB2aXJ0dWFsIH5nZW5lcmljX3BhcnNlcl9iYXNlKCkgPSBkZWZhdWx0OworICAvLyBCYXNlIGNsYXNzIHNob3VsZCBoYXZlIHZpcnR1YWwtZGVzdHJ1Y3RvcgorCisgIC8vIGdldE51bU9wdGlvbnMgLSBWaXJ0dWFsIGZ1bmN0aW9uIGltcGxlbWVudGVkIGJ5IGdlbmVyaWMgc3ViY2xhc3MgdG8KKyAgLy8gaW5kaWNhdGUgaG93IG1hbnkgZW50cmllcyBhcmUgaW4gVmFsdWVzLgorICAvLworICB2aXJ0dWFsIHVuc2lnbmVkIGdldE51bU9wdGlvbnMoKSBjb25zdCA9IDA7CisKKyAgLy8gZ2V0T3B0aW9uIC0gUmV0dXJuIG9wdGlvbiBuYW1lIE4uCisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldE9wdGlvbih1bnNpZ25lZCBOKSBjb25zdCA9IDA7CisKKyAgLy8gZ2V0RGVzY3JpcHRpb24gLSBSZXR1cm4gZGVzY3JpcHRpb24gTgorICB2aXJ0dWFsIFN0cmluZ1JlZiBnZXREZXNjcmlwdGlvbih1bnNpZ25lZCBOKSBjb25zdCA9IDA7CisKKyAgLy8gUmV0dXJuIHRoZSB3aWR0aCBvZiB0aGUgb3B0aW9uIHRhZyBmb3IgcHJpbnRpbmcuLi4KKyAgdmlydHVhbCBzaXplX3QgZ2V0T3B0aW9uV2lkdGgoY29uc3QgT3B0aW9uICZPKSBjb25zdDsKKworICB2aXJ0dWFsIGNvbnN0IEdlbmVyaWNPcHRpb25WYWx1ZSAmZ2V0T3B0aW9uVmFsdWUodW5zaWduZWQgTikgY29uc3QgPSAwOworCisgIC8vIHByaW50T3B0aW9uSW5mbyAtIFByaW50IG91dCBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIG9wdGlvbi4gIFRoZQorICAvLyB0by1iZS1tYWludGFpbmVkIHdpZHRoIGlzIHNwZWNpZmllZC4KKyAgLy8KKyAgdmlydHVhbCB2b2lkIHByaW50T3B0aW9uSW5mbyhjb25zdCBPcHRpb24gJk8sIHNpemVfdCBHbG9iYWxXaWR0aCkgY29uc3Q7CisKKyAgdm9pZCBwcmludEdlbmVyaWNPcHRpb25EaWZmKGNvbnN0IE9wdGlvbiAmTywgY29uc3QgR2VuZXJpY09wdGlvblZhbHVlICZWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR2VuZXJpY09wdGlvblZhbHVlICZEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEdsb2JhbFdpZHRoKSBjb25zdDsKKworICAvLyBwcmludE9wdGlvbkRpZmYgLSBwcmludCB0aGUgdmFsdWUgb2YgYW4gb3B0aW9uIGFuZCBpdCdzIGRlZmF1bHQuCisgIC8vCisgIC8vIFRlbXBsYXRlIGRlZmluaXRpb24gZW5zdXJlcyB0aGF0IHRoZSBvcHRpb24gYW5kIGRlZmF1bHQgaGF2ZSB0aGUgc2FtZQorICAvLyBEYXRhVHlwZSAodmlhIHRoZSBzYW1lIEFueU9wdGlvblZhbHVlKS4KKyAgdGVtcGxhdGUgPGNsYXNzIEFueU9wdGlvblZhbHVlPgorICB2b2lkIHByaW50T3B0aW9uRGlmZihjb25zdCBPcHRpb24gJk8sIGNvbnN0IEFueU9wdGlvblZhbHVlICZWLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbnlPcHRpb25WYWx1ZSAmRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEdsb2JhbFdpZHRoKSBjb25zdCB7CisgICAgcHJpbnRHZW5lcmljT3B0aW9uRGlmZihPLCBWLCBEZWZhdWx0LCBHbG9iYWxXaWR0aCk7CisgIH0KKworICB2b2lkIGluaXRpYWxpemUoKSB7fQorCisgIHZvaWQgZ2V0RXh0cmFPcHRpb25OYW1lcyhTbWFsbFZlY3RvckltcGw8U3RyaW5nUmVmPiAmT3B0aW9uTmFtZXMpIHsKKyAgICAvLyBJZiB0aGVyZSBoYXMgYmVlbiBubyBhcmdzdHIgc3BlY2lmaWVkLCB0aGF0IG1lYW5zIHRoYXQgd2UgbmVlZCB0byBhZGQgYW4KKyAgICAvLyBhcmd1bWVudCBmb3IgZXZlcnkgcG9zc2libGUgb3B0aW9uLiAgVGhpcyBlbnN1cmVzIHRoYXQgb3VyIG9wdGlvbnMgYXJlCisgICAgLy8gdmVjdG9yZWQgdG8gdXMuCisgICAgaWYgKCFPd25lci5oYXNBcmdTdHIoKSkKKyAgICAgIGZvciAodW5zaWduZWQgaSA9IDAsIGUgPSBnZXROdW1PcHRpb25zKCk7IGkgIT0gZTsgKytpKQorICAgICAgICBPcHRpb25OYW1lcy5wdXNoX2JhY2soZ2V0T3B0aW9uKGkpKTsKKyAgfQorCisgIGVudW0gVmFsdWVFeHBlY3RlZCBnZXRWYWx1ZUV4cGVjdGVkRmxhZ0RlZmF1bHQoKSBjb25zdCB7CisgICAgLy8gSWYgdGhlcmUgaXMgYW4gQXJnU3RyIHNwZWNpZmllZCwgdGhlbiB3ZSBhcmUgb2YgdGhlIGZvcm06CisgICAgLy8KKyAgICAvLyAgICAtb3B0PU8yICAgb3IgICAtb3B0IE8yICBvciAgLW9wdE8yCisgICAgLy8KKyAgICAvLyBJbiB3aGljaCBjYXNlLCB0aGUgdmFsdWUgaXMgcmVxdWlyZWQuICBPdGhlcndpc2UgaWYgYW4gYXJnIHN0ciBoYXMgbm90CisgICAgLy8gYmVlbiBzcGVjaWZpZWQsIHdlIGFyZSBvZiB0aGUgZm9ybToKKyAgICAvLworICAgIC8vICAgIC1PMiBvciBPMiBvciAtbGEgKHdoZXJlIC1sIGFuZCAtYSBhcmUgc2VwYXJhdGUgb3B0aW9ucykKKyAgICAvLworICAgIC8vIElmIHRoaXMgaXMgdGhlIGNhc2UsIHdlIGNhbm5vdCBhbGxvdyBhIHZhbHVlLgorICAgIC8vCisgICAgaWYgKE93bmVyLmhhc0FyZ1N0cigpKQorICAgICAgcmV0dXJuIFZhbHVlUmVxdWlyZWQ7CisgICAgZWxzZQorICAgICAgcmV0dXJuIFZhbHVlRGlzYWxsb3dlZDsKKyAgfQorCisgIC8vIGZpbmRPcHRpb24gLSBSZXR1cm4gdGhlIG9wdGlvbiBudW1iZXIgY29ycmVzcG9uZGluZyB0byB0aGUgc3BlY2lmaWVkCisgIC8vIGFyZ3VtZW50IHN0cmluZy4gIElmIHRoZSBvcHRpb24gaXMgbm90IGZvdW5kLCBnZXROdW1PcHRpb25zKCkgaXMgcmV0dXJuZWQuCisgIC8vCisgIHVuc2lnbmVkIGZpbmRPcHRpb24oU3RyaW5nUmVmIE5hbWUpOworCitwcm90ZWN0ZWQ6CisgIE9wdGlvbiAmT3duZXI7Cit9OworCisvLyBEZWZhdWx0IHBhcnNlciBpbXBsZW1lbnRhdGlvbiAtIFRoaXMgaW1wbGVtZW50YXRpb24gZGVwZW5kcyBvbiBoYXZpbmcgYQorLy8gbWFwcGluZyBvZiByZWNvZ25pemVkIG9wdGlvbnMgdG8gdmFsdWVzIG9mIHNvbWUgc29ydC4gIEluIGFkZGl0aW9uIHRvIHRoaXMsCisvLyBlYWNoIGVudHJ5IGluIHRoZSBtYXBwaW5nIGFsc28gdHJhY2tzIGEgaGVscCBtZXNzYWdlIHRoYXQgaXMgcHJpbnRlZCB3aXRoIHRoZQorLy8gY29tbWFuZCBsaW5lIG9wdGlvbiBmb3IgLWhlbHAuICBCZWNhdXNlIHRoaXMgaXMgYSBzaW1wbGUgbWFwcGluZyBwYXJzZXIsIHRoZQorLy8gZGF0YSB0eXBlIGNhbiBiZSBhbnkgdW5zdXBwb3J0ZWQgdHlwZS4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgRGF0YVR5cGU+IGNsYXNzIHBhcnNlciA6IHB1YmxpYyBnZW5lcmljX3BhcnNlcl9iYXNlIHsKK3Byb3RlY3RlZDoKKyAgY2xhc3MgT3B0aW9uSW5mbyA6IHB1YmxpYyBHZW5lcmljT3B0aW9uSW5mbyB7CisgIHB1YmxpYzoKKyAgICBPcHRpb25JbmZvKFN0cmluZ1JlZiBuYW1lLCBEYXRhVHlwZSB2LCBTdHJpbmdSZWYgaGVscFN0cikKKyAgICAgICAgOiBHZW5lcmljT3B0aW9uSW5mbyhuYW1lLCBoZWxwU3RyKSwgVih2KSB7fQorCisgICAgT3B0aW9uVmFsdWU8RGF0YVR5cGU+IFY7CisgIH07CisgIFNtYWxsVmVjdG9yPE9wdGlvbkluZm8sIDg+IFZhbHVlczsKKworcHVibGljOgorICBwYXJzZXIoT3B0aW9uICZPKSA6IGdlbmVyaWNfcGFyc2VyX2Jhc2UoTykge30KKworICB1c2luZyBwYXJzZXJfZGF0YV90eXBlID0gRGF0YVR5cGU7CisKKyAgLy8gSW1wbGVtZW50IHZpcnR1YWwgZnVuY3Rpb25zIG5lZWRlZCBieSBnZW5lcmljX3BhcnNlcl9iYXNlCisgIHVuc2lnbmVkIGdldE51bU9wdGlvbnMoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB1bnNpZ25lZChWYWx1ZXMuc2l6ZSgpKTsgfQorICBTdHJpbmdSZWYgZ2V0T3B0aW9uKHVuc2lnbmVkIE4pIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIFZhbHVlc1tOXS5OYW1lOyB9CisgIFN0cmluZ1JlZiBnZXREZXNjcmlwdGlvbih1bnNpZ25lZCBOKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIFZhbHVlc1tOXS5IZWxwU3RyOworICB9CisKKyAgLy8gZ2V0T3B0aW9uVmFsdWUgLSBSZXR1cm4gdGhlIHZhbHVlIG9mIG9wdGlvbiBuYW1lIE4uCisgIGNvbnN0IEdlbmVyaWNPcHRpb25WYWx1ZSAmZ2V0T3B0aW9uVmFsdWUodW5zaWduZWQgTikgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBWYWx1ZXNbTl0uVjsKKyAgfQorCisgIC8vIHBhcnNlIC0gUmV0dXJuIHRydWUgb24gZXJyb3IuCisgIGJvb2wgcGFyc2UoT3B0aW9uICZPLCBTdHJpbmdSZWYgQXJnTmFtZSwgU3RyaW5nUmVmIEFyZywgRGF0YVR5cGUgJlYpIHsKKyAgICBTdHJpbmdSZWYgQXJnVmFsOworICAgIGlmIChPd25lci5oYXNBcmdTdHIoKSkKKyAgICAgIEFyZ1ZhbCA9IEFyZzsKKyAgICBlbHNlCisgICAgICBBcmdWYWwgPSBBcmdOYW1lOworCisgICAgZm9yIChzaXplX3QgaSA9IDAsIGUgPSBWYWx1ZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkKKyAgICAgIGlmIChWYWx1ZXNbaV0uTmFtZSA9PSBBcmdWYWwpIHsKKyAgICAgICAgViA9IFZhbHVlc1tpXS5WLmdldFZhbHVlKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgIHJldHVybiBPLmVycm9yKCJDYW5ub3QgZmluZCBvcHRpb24gbmFtZWQgJyIgKyBBcmdWYWwgKyAiJyEiKTsKKyAgfQorCisgIC8vLyBhZGRMaXRlcmFsT3B0aW9uIC0gQWRkIGFuIGVudHJ5IHRvIHRoZSBtYXBwaW5nIHRhYmxlLgorICAvLy8KKyAgdGVtcGxhdGUgPGNsYXNzIERUPgorICB2b2lkIGFkZExpdGVyYWxPcHRpb24oU3RyaW5nUmVmIE5hbWUsIGNvbnN0IERUICZWLCBTdHJpbmdSZWYgSGVscFN0cikgeworICAgIGFzc2VydChmaW5kT3B0aW9uKE5hbWUpID09IFZhbHVlcy5zaXplKCkgJiYgIk9wdGlvbiBhbHJlYWR5IGV4aXN0cyEiKTsKKyAgICBPcHRpb25JbmZvIFgoTmFtZSwgc3RhdGljX2Nhc3Q8RGF0YVR5cGU+KFYpLCBIZWxwU3RyKTsKKyAgICBWYWx1ZXMucHVzaF9iYWNrKFgpOworICAgIEFkZExpdGVyYWxPcHRpb24oT3duZXIsIE5hbWUpOworICB9CisKKyAgLy8vIHJlbW92ZUxpdGVyYWxPcHRpb24gLSBSZW1vdmUgdGhlIHNwZWNpZmllZCBvcHRpb24uCisgIC8vLworICB2b2lkIHJlbW92ZUxpdGVyYWxPcHRpb24oU3RyaW5nUmVmIE5hbWUpIHsKKyAgICB1bnNpZ25lZCBOID0gZmluZE9wdGlvbihOYW1lKTsKKyAgICBhc3NlcnQoTiAhPSBWYWx1ZXMuc2l6ZSgpICYmICJPcHRpb24gbm90IGZvdW5kISIpOworICAgIFZhbHVlcy5lcmFzZShWYWx1ZXMuYmVnaW4oKSArIE4pOworICB9Cit9OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBiYXNpY19wYXJzZXIgLSBTdXBlciBjbGFzcyBvZiBwYXJzZXJzIHRvIHByb3ZpZGUgYm9pbGVycGxhdGUgY29kZQorLy8KK2NsYXNzIGJhc2ljX3BhcnNlcl9pbXBsIHsgLy8gbm9uLXRlbXBsYXRlIGltcGxlbWVudGF0aW9uIG9mIGJhc2ljX3BhcnNlcjx0PgorcHVibGljOgorICBiYXNpY19wYXJzZXJfaW1wbChPcHRpb24gJikge30KKworICBlbnVtIFZhbHVlRXhwZWN0ZWQgZ2V0VmFsdWVFeHBlY3RlZEZsYWdEZWZhdWx0KCkgY29uc3QgeworICAgIHJldHVybiBWYWx1ZVJlcXVpcmVkOworICB9CisKKyAgdm9pZCBnZXRFeHRyYU9wdGlvbk5hbWVzKFNtYWxsVmVjdG9ySW1wbDxTdHJpbmdSZWY+ICYpIHt9CisKKyAgdm9pZCBpbml0aWFsaXplKCkge30KKworICAvLyBSZXR1cm4gdGhlIHdpZHRoIG9mIHRoZSBvcHRpb24gdGFnIGZvciBwcmludGluZy4uLgorICBzaXplX3QgZ2V0T3B0aW9uV2lkdGgoY29uc3QgT3B0aW9uICZPKSBjb25zdDsKKworICAvLyBwcmludE9wdGlvbkluZm8gLSBQcmludCBvdXQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBvcHRpb24uICBUaGUKKyAgLy8gdG8tYmUtbWFpbnRhaW5lZCB3aWR0aCBpcyBzcGVjaWZpZWQuCisgIC8vCisgIHZvaWQgcHJpbnRPcHRpb25JbmZvKGNvbnN0IE9wdGlvbiAmTywgc2l6ZV90IEdsb2JhbFdpZHRoKSBjb25zdDsKKworICAvLyBwcmludE9wdGlvbk5vVmFsdWUgLSBQcmludCBhIHBsYWNlaG9sZGVyIGZvciBvcHRpb25zIHRoYXQgZG9uJ3QgeWV0IHN1cHBvcnQKKyAgLy8gcHJpbnRPcHRpb25EaWZmKCkuCisgIHZvaWQgcHJpbnRPcHRpb25Ob1ZhbHVlKGNvbnN0IE9wdGlvbiAmTywgc2l6ZV90IEdsb2JhbFdpZHRoKSBjb25zdDsKKworICAvLyBnZXRWYWx1ZU5hbWUgLSBPdmVybG9hZCBpbiBzdWJjbGFzcyB0byBwcm92aWRlIGEgYmV0dGVyIGRlZmF1bHQgdmFsdWUuCisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldFZhbHVlTmFtZSgpIGNvbnN0IHsgcmV0dXJuICJ2YWx1ZSI7IH0KKworICAvLyBBbiBvdXQtb2YtbGluZSB2aXJ0dWFsIG1ldGhvZCB0byBwcm92aWRlIGEgJ2hvbWUnIGZvciB0aGlzIGNsYXNzLgorICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3Byb3RlY3RlZDoKKyAgfmJhc2ljX3BhcnNlcl9pbXBsKCkgPSBkZWZhdWx0OworCisgIC8vIEEgaGVscGVyIGZvciBiYXNpY19wYXJzZXI6OnByaW50T3B0aW9uRGlmZi4KKyAgdm9pZCBwcmludE9wdGlvbk5hbWUoY29uc3QgT3B0aW9uICZPLCBzaXplX3QgR2xvYmFsV2lkdGgpIGNvbnN0OworfTsKKworLy8gYmFzaWNfcGFyc2VyIC0gVGhlIHJlYWwgYmFzaWMgcGFyc2VyIGlzIGp1c3QgYSB0ZW1wbGF0ZSB3cmFwcGVyIHRoYXQgcHJvdmlkZXMKKy8vIGEgdHlwZWRlZiBmb3IgdGhlIHByb3ZpZGVkIGRhdGEgdHlwZS4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgRGF0YVR5cGU+IGNsYXNzIGJhc2ljX3BhcnNlciA6IHB1YmxpYyBiYXNpY19wYXJzZXJfaW1wbCB7CitwdWJsaWM6CisgIHVzaW5nIHBhcnNlcl9kYXRhX3R5cGUgPSBEYXRhVHlwZTsKKyAgdXNpbmcgT3B0VmFsID0gT3B0aW9uVmFsdWU8RGF0YVR5cGU+OworCisgIGJhc2ljX3BhcnNlcihPcHRpb24gJk8pIDogYmFzaWNfcGFyc2VyX2ltcGwoTykge30KKworcHJvdGVjdGVkOgorICB+YmFzaWNfcGFyc2VyKCkgPSBkZWZhdWx0OworfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcGFyc2VyPGJvb2w+CisvLwordGVtcGxhdGUgPD4gY2xhc3MgcGFyc2VyPGJvb2w+IGZpbmFsIDogcHVibGljIGJhc2ljX3BhcnNlcjxib29sPiB7CitwdWJsaWM6CisgIHBhcnNlcihPcHRpb24gJk8pIDogYmFzaWNfcGFyc2VyKE8pIHt9CisKKyAgLy8gcGFyc2UgLSBSZXR1cm4gdHJ1ZSBvbiBlcnJvci4KKyAgYm9vbCBwYXJzZShPcHRpb24gJk8sIFN0cmluZ1JlZiBBcmdOYW1lLCBTdHJpbmdSZWYgQXJnLCBib29sICZWYWwpOworCisgIHZvaWQgaW5pdGlhbGl6ZSgpIHt9CisKKyAgZW51bSBWYWx1ZUV4cGVjdGVkIGdldFZhbHVlRXhwZWN0ZWRGbGFnRGVmYXVsdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsdWVPcHRpb25hbDsKKyAgfQorCisgIC8vIGdldFZhbHVlTmFtZSAtIERvIG5vdCBwcmludCA9PHZhbHVlPiBhdCBhbGwuCisgIFN0cmluZ1JlZiBnZXRWYWx1ZU5hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiBTdHJpbmdSZWYoKTsgfQorCisgIHZvaWQgcHJpbnRPcHRpb25EaWZmKGNvbnN0IE9wdGlvbiAmTywgYm9vbCBWLCBPcHRWYWwgRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEdsb2JhbFdpZHRoKSBjb25zdDsKKworICAvLyBBbiBvdXQtb2YtbGluZSB2aXJ0dWFsIG1ldGhvZCB0byBwcm92aWRlIGEgJ2hvbWUnIGZvciB0aGlzIGNsYXNzLgorICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworfTsKKworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX3BhcnNlcjxib29sPjsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcGFyc2VyPGJvb2xPckRlZmF1bHQ+Cit0ZW1wbGF0ZSA8PgorY2xhc3MgcGFyc2VyPGJvb2xPckRlZmF1bHQ+IGZpbmFsIDogcHVibGljIGJhc2ljX3BhcnNlcjxib29sT3JEZWZhdWx0PiB7CitwdWJsaWM6CisgIHBhcnNlcihPcHRpb24gJk8pIDogYmFzaWNfcGFyc2VyKE8pIHt9CisKKyAgLy8gcGFyc2UgLSBSZXR1cm4gdHJ1ZSBvbiBlcnJvci4KKyAgYm9vbCBwYXJzZShPcHRpb24gJk8sIFN0cmluZ1JlZiBBcmdOYW1lLCBTdHJpbmdSZWYgQXJnLCBib29sT3JEZWZhdWx0ICZWYWwpOworCisgIGVudW0gVmFsdWVFeHBlY3RlZCBnZXRWYWx1ZUV4cGVjdGVkRmxhZ0RlZmF1bHQoKSBjb25zdCB7CisgICAgcmV0dXJuIFZhbHVlT3B0aW9uYWw7CisgIH0KKworICAvLyBnZXRWYWx1ZU5hbWUgLSBEbyBub3QgcHJpbnQgPTx2YWx1ZT4gYXQgYWxsLgorICBTdHJpbmdSZWYgZ2V0VmFsdWVOYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gU3RyaW5nUmVmKCk7IH0KKworICB2b2lkIHByaW50T3B0aW9uRGlmZihjb25zdCBPcHRpb24gJk8sIGJvb2xPckRlZmF1bHQgViwgT3B0VmFsIERlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBHbG9iYWxXaWR0aCkgY29uc3Q7CisKKyAgLy8gQW4gb3V0LW9mLWxpbmUgdmlydHVhbCBtZXRob2QgdG8gcHJvdmlkZSBhICdob21lJyBmb3IgdGhpcyBjbGFzcy4KKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKK307CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19wYXJzZXI8Ym9vbE9yRGVmYXVsdD47CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHBhcnNlcjxpbnQ+CisvLwordGVtcGxhdGUgPD4gY2xhc3MgcGFyc2VyPGludD4gZmluYWwgOiBwdWJsaWMgYmFzaWNfcGFyc2VyPGludD4geworcHVibGljOgorICBwYXJzZXIoT3B0aW9uICZPKSA6IGJhc2ljX3BhcnNlcihPKSB7fQorCisgIC8vIHBhcnNlIC0gUmV0dXJuIHRydWUgb24gZXJyb3IuCisgIGJvb2wgcGFyc2UoT3B0aW9uICZPLCBTdHJpbmdSZWYgQXJnTmFtZSwgU3RyaW5nUmVmIEFyZywgaW50ICZWYWwpOworCisgIC8vIGdldFZhbHVlTmFtZSAtIE92ZXJsb2FkIGluIHN1YmNsYXNzIHRvIHByb3ZpZGUgYSBiZXR0ZXIgZGVmYXVsdCB2YWx1ZS4KKyAgU3RyaW5nUmVmIGdldFZhbHVlTmFtZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJpbnQiOyB9CisKKyAgdm9pZCBwcmludE9wdGlvbkRpZmYoY29uc3QgT3B0aW9uICZPLCBpbnQgViwgT3B0VmFsIERlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBHbG9iYWxXaWR0aCkgY29uc3Q7CisKKyAgLy8gQW4gb3V0LW9mLWxpbmUgdmlydHVhbCBtZXRob2QgdG8gcHJvdmlkZSBhICdob21lJyBmb3IgdGhpcyBjbGFzcy4KKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKK307CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19wYXJzZXI8aW50PjsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcGFyc2VyPHVuc2lnbmVkPgorLy8KK3RlbXBsYXRlIDw+IGNsYXNzIHBhcnNlcjx1bnNpZ25lZD4gZmluYWwgOiBwdWJsaWMgYmFzaWNfcGFyc2VyPHVuc2lnbmVkPiB7CitwdWJsaWM6CisgIHBhcnNlcihPcHRpb24gJk8pIDogYmFzaWNfcGFyc2VyKE8pIHt9CisKKyAgLy8gcGFyc2UgLSBSZXR1cm4gdHJ1ZSBvbiBlcnJvci4KKyAgYm9vbCBwYXJzZShPcHRpb24gJk8sIFN0cmluZ1JlZiBBcmdOYW1lLCBTdHJpbmdSZWYgQXJnLCB1bnNpZ25lZCAmVmFsKTsKKworICAvLyBnZXRWYWx1ZU5hbWUgLSBPdmVybG9hZCBpbiBzdWJjbGFzcyB0byBwcm92aWRlIGEgYmV0dGVyIGRlZmF1bHQgdmFsdWUuCisgIFN0cmluZ1JlZiBnZXRWYWx1ZU5hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAidWludCI7IH0KKworICB2b2lkIHByaW50T3B0aW9uRGlmZihjb25zdCBPcHRpb24gJk8sIHVuc2lnbmVkIFYsIE9wdFZhbCBEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgR2xvYmFsV2lkdGgpIGNvbnN0OworCisgIC8vIEFuIG91dC1vZi1saW5lIHZpcnR1YWwgbWV0aG9kIHRvIHByb3ZpZGUgYSAnaG9tZScgZm9yIHRoaXMgY2xhc3MuCisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7Cit9OworCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfcGFyc2VyPHVuc2lnbmVkPjsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcGFyc2VyPHVuc2lnbmVkIGxvbmcgbG9uZz4KKy8vCit0ZW1wbGF0ZSA8PgorY2xhc3MgcGFyc2VyPHVuc2lnbmVkIGxvbmcgbG9uZz4gZmluYWwKKyAgICA6IHB1YmxpYyBiYXNpY19wYXJzZXI8dW5zaWduZWQgbG9uZyBsb25nPiB7CitwdWJsaWM6CisgIHBhcnNlcihPcHRpb24gJk8pIDogYmFzaWNfcGFyc2VyKE8pIHt9CisKKyAgLy8gcGFyc2UgLSBSZXR1cm4gdHJ1ZSBvbiBlcnJvci4KKyAgYm9vbCBwYXJzZShPcHRpb24gJk8sIFN0cmluZ1JlZiBBcmdOYW1lLCBTdHJpbmdSZWYgQXJnLAorICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAmVmFsKTsKKworICAvLyBnZXRWYWx1ZU5hbWUgLSBPdmVybG9hZCBpbiBzdWJjbGFzcyB0byBwcm92aWRlIGEgYmV0dGVyIGRlZmF1bHQgdmFsdWUuCisgIFN0cmluZ1JlZiBnZXRWYWx1ZU5hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAidWludCI7IH0KKworICB2b2lkIHByaW50T3B0aW9uRGlmZihjb25zdCBPcHRpb24gJk8sIHVuc2lnbmVkIGxvbmcgbG9uZyBWLCBPcHRWYWwgRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEdsb2JhbFdpZHRoKSBjb25zdDsKKworICAvLyBBbiBvdXQtb2YtbGluZSB2aXJ0dWFsIG1ldGhvZCB0byBwcm92aWRlIGEgJ2hvbWUnIGZvciB0aGlzIGNsYXNzLgorICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworfTsKKworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX3BhcnNlcjx1bnNpZ25lZCBsb25nIGxvbmc+OworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBwYXJzZXI8ZG91YmxlPgorLy8KK3RlbXBsYXRlIDw+IGNsYXNzIHBhcnNlcjxkb3VibGU+IGZpbmFsIDogcHVibGljIGJhc2ljX3BhcnNlcjxkb3VibGU+IHsKK3B1YmxpYzoKKyAgcGFyc2VyKE9wdGlvbiAmTykgOiBiYXNpY19wYXJzZXIoTykge30KKworICAvLyBwYXJzZSAtIFJldHVybiB0cnVlIG9uIGVycm9yLgorICBib29sIHBhcnNlKE9wdGlvbiAmTywgU3RyaW5nUmVmIEFyZ05hbWUsIFN0cmluZ1JlZiBBcmcsIGRvdWJsZSAmVmFsKTsKKworICAvLyBnZXRWYWx1ZU5hbWUgLSBPdmVybG9hZCBpbiBzdWJjbGFzcyB0byBwcm92aWRlIGEgYmV0dGVyIGRlZmF1bHQgdmFsdWUuCisgIFN0cmluZ1JlZiBnZXRWYWx1ZU5hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAibnVtYmVyIjsgfQorCisgIHZvaWQgcHJpbnRPcHRpb25EaWZmKGNvbnN0IE9wdGlvbiAmTywgZG91YmxlIFYsIE9wdFZhbCBEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgR2xvYmFsV2lkdGgpIGNvbnN0OworCisgIC8vIEFuIG91dC1vZi1saW5lIHZpcnR1YWwgbWV0aG9kIHRvIHByb3ZpZGUgYSAnaG9tZScgZm9yIHRoaXMgY2xhc3MuCisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7Cit9OworCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfcGFyc2VyPGRvdWJsZT47CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHBhcnNlcjxmbG9hdD4KKy8vCit0ZW1wbGF0ZSA8PiBjbGFzcyBwYXJzZXI8ZmxvYXQ+IGZpbmFsIDogcHVibGljIGJhc2ljX3BhcnNlcjxmbG9hdD4geworcHVibGljOgorICBwYXJzZXIoT3B0aW9uICZPKSA6IGJhc2ljX3BhcnNlcihPKSB7fQorCisgIC8vIHBhcnNlIC0gUmV0dXJuIHRydWUgb24gZXJyb3IuCisgIGJvb2wgcGFyc2UoT3B0aW9uICZPLCBTdHJpbmdSZWYgQXJnTmFtZSwgU3RyaW5nUmVmIEFyZywgZmxvYXQgJlZhbCk7CisKKyAgLy8gZ2V0VmFsdWVOYW1lIC0gT3ZlcmxvYWQgaW4gc3ViY2xhc3MgdG8gcHJvdmlkZSBhIGJldHRlciBkZWZhdWx0IHZhbHVlLgorICBTdHJpbmdSZWYgZ2V0VmFsdWVOYW1lKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gIm51bWJlciI7IH0KKworICB2b2lkIHByaW50T3B0aW9uRGlmZihjb25zdCBPcHRpb24gJk8sIGZsb2F0IFYsIE9wdFZhbCBEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgR2xvYmFsV2lkdGgpIGNvbnN0OworCisgIC8vIEFuIG91dC1vZi1saW5lIHZpcnR1YWwgbWV0aG9kIHRvIHByb3ZpZGUgYSAnaG9tZScgZm9yIHRoaXMgY2xhc3MuCisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7Cit9OworCitleHRlcm4gdGVtcGxhdGUgY2xhc3MgYmFzaWNfcGFyc2VyPGZsb2F0PjsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gcGFyc2VyPHN0ZDo6c3RyaW5nPgorLy8KK3RlbXBsYXRlIDw+IGNsYXNzIHBhcnNlcjxzdGQ6OnN0cmluZz4gZmluYWwgOiBwdWJsaWMgYmFzaWNfcGFyc2VyPHN0ZDo6c3RyaW5nPiB7CitwdWJsaWM6CisgIHBhcnNlcihPcHRpb24gJk8pIDogYmFzaWNfcGFyc2VyKE8pIHt9CisKKyAgLy8gcGFyc2UgLSBSZXR1cm4gdHJ1ZSBvbiBlcnJvci4KKyAgYm9vbCBwYXJzZShPcHRpb24gJiwgU3RyaW5nUmVmLCBTdHJpbmdSZWYgQXJnLCBzdGQ6OnN0cmluZyAmVmFsdWUpIHsKKyAgICBWYWx1ZSA9IEFyZy5zdHIoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBnZXRWYWx1ZU5hbWUgLSBPdmVybG9hZCBpbiBzdWJjbGFzcyB0byBwcm92aWRlIGEgYmV0dGVyIGRlZmF1bHQgdmFsdWUuCisgIFN0cmluZ1JlZiBnZXRWYWx1ZU5hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAic3RyaW5nIjsgfQorCisgIHZvaWQgcHJpbnRPcHRpb25EaWZmKGNvbnN0IE9wdGlvbiAmTywgU3RyaW5nUmVmIFYsIGNvbnN0IE9wdFZhbCAmRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEdsb2JhbFdpZHRoKSBjb25zdDsKKworICAvLyBBbiBvdXQtb2YtbGluZSB2aXJ0dWFsIG1ldGhvZCB0byBwcm92aWRlIGEgJ2hvbWUnIGZvciB0aGlzIGNsYXNzLgorICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworfTsKKworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIGJhc2ljX3BhcnNlcjxzdGQ6OnN0cmluZz47CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHBhcnNlcjxjaGFyPgorLy8KK3RlbXBsYXRlIDw+IGNsYXNzIHBhcnNlcjxjaGFyPiBmaW5hbCA6IHB1YmxpYyBiYXNpY19wYXJzZXI8Y2hhcj4geworcHVibGljOgorICBwYXJzZXIoT3B0aW9uICZPKSA6IGJhc2ljX3BhcnNlcihPKSB7fQorCisgIC8vIHBhcnNlIC0gUmV0dXJuIHRydWUgb24gZXJyb3IuCisgIGJvb2wgcGFyc2UoT3B0aW9uICYsIFN0cmluZ1JlZiwgU3RyaW5nUmVmIEFyZywgY2hhciAmVmFsdWUpIHsKKyAgICBWYWx1ZSA9IEFyZ1swXTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBnZXRWYWx1ZU5hbWUgLSBPdmVybG9hZCBpbiBzdWJjbGFzcyB0byBwcm92aWRlIGEgYmV0dGVyIGRlZmF1bHQgdmFsdWUuCisgIFN0cmluZ1JlZiBnZXRWYWx1ZU5hbWUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAiY2hhciI7IH0KKworICB2b2lkIHByaW50T3B0aW9uRGlmZihjb25zdCBPcHRpb24gJk8sIGNoYXIgViwgT3B0VmFsIERlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBHbG9iYWxXaWR0aCkgY29uc3Q7CisKKyAgLy8gQW4gb3V0LW9mLWxpbmUgdmlydHVhbCBtZXRob2QgdG8gcHJvdmlkZSBhICdob21lJyBmb3IgdGhpcyBjbGFzcy4KKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKK307CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBiYXNpY19wYXJzZXI8Y2hhcj47CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFByaW50T3B0aW9uRGlmZgorLy8KKy8vIFRoaXMgY29sbGVjdGlvbiBvZiB3cmFwcGVycyBpcyB0aGUgaW50ZXJtZWRpYXJ5IGJldHdlZW4gY2xhc3Mgb3B0IGFuZCBjbGFzcworLy8gcGFyc2VyIHRvIGhhbmRsZSBhbGwgdGhlIHRlbXBsYXRlIG5hc3RpbmVzcy4KKworLy8gVGhpcyBvdmVybG9hZGVkIGZ1bmN0aW9uIGlzIHNlbGVjdGVkIGJ5IHRoZSBnZW5lcmljIHBhcnNlci4KK3RlbXBsYXRlIDxjbGFzcyBQYXJzZXJDbGFzcywgY2xhc3MgRFQ+Cit2b2lkIHByaW50T3B0aW9uRGlmZihjb25zdCBPcHRpb24gJk8sIGNvbnN0IGdlbmVyaWNfcGFyc2VyX2Jhc2UgJlAsIGNvbnN0IERUICZWLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uVmFsdWU8RFQ+ICZEZWZhdWx0LCBzaXplX3QgR2xvYmFsV2lkdGgpIHsKKyAgT3B0aW9uVmFsdWU8RFQ+IE9WID0gVjsKKyAgUC5wcmludE9wdGlvbkRpZmYoTywgT1YsIERlZmF1bHQsIEdsb2JhbFdpZHRoKTsKK30KKworLy8gVGhpcyBpcyBpbnN0YW50aWF0ZWQgZm9yIGJhc2ljIHBhcnNlcnMgd2hlbiB0aGUgcGFyc2VkIHZhbHVlIGhhcyBhIGRpZmZlcmVudAorLy8gdHlwZSB0aGFuIHRoZSBvcHRpb24gdmFsdWUuIGUuZy4gSGVscFByaW50ZXIuCit0ZW1wbGF0ZSA8Y2xhc3MgUGFyc2VyRFQsIGNsYXNzIFZhbERUPiBzdHJ1Y3QgT3B0aW9uRGlmZlByaW50ZXIgeworICB2b2lkIHByaW50KGNvbnN0IE9wdGlvbiAmTywgY29uc3QgcGFyc2VyPFBhcnNlckRUPiAmUCwgY29uc3QgVmFsRFQgJiAvKlYqLywKKyAgICAgICAgICAgICBjb25zdCBPcHRpb25WYWx1ZTxWYWxEVD4gJiAvKkRlZmF1bHQqLywgc2l6ZV90IEdsb2JhbFdpZHRoKSB7CisgICAgUC5wcmludE9wdGlvbk5vVmFsdWUoTywgR2xvYmFsV2lkdGgpOworICB9Cit9OworCisvLyBUaGlzIGlzIGluc3RhbnRpYXRlZCBmb3IgYmFzaWMgcGFyc2VycyB3aGVuIHRoZSBwYXJzZWQgdmFsdWUgaGFzIHRoZSBzYW1lCisvLyB0eXBlIGFzIHRoZSBvcHRpb24gdmFsdWUuCit0ZW1wbGF0ZSA8Y2xhc3MgRFQ+IHN0cnVjdCBPcHRpb25EaWZmUHJpbnRlcjxEVCwgRFQ+IHsKKyAgdm9pZCBwcmludChjb25zdCBPcHRpb24gJk8sIGNvbnN0IHBhcnNlcjxEVD4gJlAsIGNvbnN0IERUICZWLAorICAgICAgICAgICAgIGNvbnN0IE9wdGlvblZhbHVlPERUPiAmRGVmYXVsdCwgc2l6ZV90IEdsb2JhbFdpZHRoKSB7CisgICAgUC5wcmludE9wdGlvbkRpZmYoTywgViwgRGVmYXVsdCwgR2xvYmFsV2lkdGgpOworICB9Cit9OworCisvLyBUaGlzIG92ZXJsb2FkZWQgZnVuY3Rpb24gaXMgc2VsZWN0ZWQgYnkgdGhlIGJhc2ljIHBhcnNlciwgd2hpY2ggbWF5IHBhcnNlIGEKKy8vIGRpZmZlcmVudCB0eXBlIHRoYW4gdGhlIG9wdGlvbiB0eXBlLgordGVtcGxhdGUgPGNsYXNzIFBhcnNlckNsYXNzLCBjbGFzcyBWYWxEVD4KK3ZvaWQgcHJpbnRPcHRpb25EaWZmKAorICAgIGNvbnN0IE9wdGlvbiAmTywKKyAgICBjb25zdCBiYXNpY19wYXJzZXI8dHlwZW5hbWUgUGFyc2VyQ2xhc3M6OnBhcnNlcl9kYXRhX3R5cGU+ICZQLAorICAgIGNvbnN0IFZhbERUICZWLCBjb25zdCBPcHRpb25WYWx1ZTxWYWxEVD4gJkRlZmF1bHQsIHNpemVfdCBHbG9iYWxXaWR0aCkgeworCisgIE9wdGlvbkRpZmZQcmludGVyPHR5cGVuYW1lIFBhcnNlckNsYXNzOjpwYXJzZXJfZGF0YV90eXBlLCBWYWxEVD4gcHJpbnRlcjsKKyAgcHJpbnRlci5wcmludChPLCBzdGF0aWNfY2FzdDxjb25zdCBQYXJzZXJDbGFzcyAmPihQKSwgViwgRGVmYXVsdCwKKyAgICAgICAgICAgICAgICBHbG9iYWxXaWR0aCk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBhcHBsaWNhdG9yIGNsYXNzIC0gVGhpcyBjbGFzcyBpcyB1c2VkIGJlY2F1c2Ugd2UgbXVzdCB1c2UgcGFydGlhbAorLy8gc3BlY2lhbGl6YXRpb24gdG8gaGFuZGxlIGxpdGVyYWwgc3RyaW5nIGFyZ3VtZW50cyBzcGVjaWFsbHkgKGNvbnN0IGNoYXIqIGRvZXMKKy8vIG5vdCBjb3JyZWN0bHkgcmVzcG9uZCB0byB0aGUgYXBwbHkgbWV0aG9kKS4gIEJlY2F1c2UgdGhlIHN5bnRheCB0byB1c2UgdGhpcworLy8gaXMgYSBwYWluLCB3ZSBoYXZlIHRoZSAnYXBwbHknIG1ldGhvZCBiZWxvdyB0byBoYW5kbGUgdGhlIG5hc3RpbmVzcy4uLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBNb2Q+IHN0cnVjdCBhcHBsaWNhdG9yIHsKKyAgdGVtcGxhdGUgPGNsYXNzIE9wdD4gc3RhdGljIHZvaWQgb3B0KGNvbnN0IE1vZCAmTSwgT3B0ICZPKSB7IE0uYXBwbHkoTyk7IH0KK307CisKKy8vIEhhbmRsZSBjb25zdCBjaGFyKiBhcyBhIHNwZWNpYWwgY2FzZS4uLgordGVtcGxhdGUgPHVuc2lnbmVkIG4+IHN0cnVjdCBhcHBsaWNhdG9yPGNoYXJbbl0+IHsKKyAgdGVtcGxhdGUgPGNsYXNzIE9wdD4gc3RhdGljIHZvaWQgb3B0KFN0cmluZ1JlZiBTdHIsIE9wdCAmTykgeworICAgIE8uc2V0QXJnU3RyKFN0cik7CisgIH0KK307Cit0ZW1wbGF0ZSA8dW5zaWduZWQgbj4gc3RydWN0IGFwcGxpY2F0b3I8Y29uc3QgY2hhcltuXT4geworICB0ZW1wbGF0ZSA8Y2xhc3MgT3B0PiBzdGF0aWMgdm9pZCBvcHQoU3RyaW5nUmVmIFN0ciwgT3B0ICZPKSB7CisgICAgTy5zZXRBcmdTdHIoU3RyKTsKKyAgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBhcHBsaWNhdG9yPFN0cmluZ1JlZiA+IHsKKyAgdGVtcGxhdGUgPGNsYXNzIE9wdD4gc3RhdGljIHZvaWQgb3B0KFN0cmluZ1JlZiBTdHIsIE9wdCAmTykgeworICAgIE8uc2V0QXJnU3RyKFN0cik7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBhcHBsaWNhdG9yPE51bU9jY3VycmVuY2VzRmxhZz4geworICBzdGF0aWMgdm9pZCBvcHQoTnVtT2NjdXJyZW5jZXNGbGFnIE4sIE9wdGlvbiAmTykgeworICAgIE8uc2V0TnVtT2NjdXJyZW5jZXNGbGFnKE4pOworICB9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgYXBwbGljYXRvcjxWYWx1ZUV4cGVjdGVkPiB7CisgIHN0YXRpYyB2b2lkIG9wdChWYWx1ZUV4cGVjdGVkIFZFLCBPcHRpb24gJk8pIHsgTy5zZXRWYWx1ZUV4cGVjdGVkRmxhZyhWRSk7IH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBhcHBsaWNhdG9yPE9wdGlvbkhpZGRlbj4geworICBzdGF0aWMgdm9pZCBvcHQoT3B0aW9uSGlkZGVuIE9ILCBPcHRpb24gJk8pIHsgTy5zZXRIaWRkZW5GbGFnKE9IKTsgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGFwcGxpY2F0b3I8Rm9ybWF0dGluZ0ZsYWdzPiB7CisgIHN0YXRpYyB2b2lkIG9wdChGb3JtYXR0aW5nRmxhZ3MgRkYsIE9wdGlvbiAmTykgeyBPLnNldEZvcm1hdHRpbmdGbGFnKEZGKTsgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IGFwcGxpY2F0b3I8TWlzY0ZsYWdzPiB7CisgIHN0YXRpYyB2b2lkIG9wdChNaXNjRmxhZ3MgTUYsIE9wdGlvbiAmTykgeyBPLnNldE1pc2NGbGFnKE1GKTsgfQorfTsKKworLy8gYXBwbHkgbWV0aG9kIC0gQXBwbHkgbW9kaWZpZXJzIHRvIGFuIG9wdGlvbiBpbiBhIHR5cGUgc2FmZSB3YXkuCit0ZW1wbGF0ZSA8Y2xhc3MgT3B0LCBjbGFzcyBNb2QsIGNsYXNzLi4uIE1vZHM+Cit2b2lkIGFwcGx5KE9wdCAqTywgY29uc3QgTW9kICZNLCBjb25zdCBNb2RzICYuLi4gTXMpIHsKKyAgYXBwbGljYXRvcjxNb2Q+OjpvcHQoTSwgKk8pOworICBhcHBseShPLCBNcy4uLik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBPcHQsIGNsYXNzIE1vZD4gdm9pZCBhcHBseShPcHQgKk8sIGNvbnN0IE1vZCAmTSkgeworICBhcHBsaWNhdG9yPE1vZD46Om9wdChNLCAqTyk7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBvcHRfc3RvcmFnZSBjbGFzcworCisvLyBEZWZhdWx0IHN0b3JhZ2UgY2xhc3MgZGVmaW5pdGlvbjogZXh0ZXJuYWwgc3RvcmFnZS4gIFRoaXMgaW1wbGVtZW50YXRpb24KKy8vIGFzc3VtZXMgdGhlIHVzZXIgd2lsbCBzcGVjaWZ5IGEgdmFyaWFibGUgdG8gc3RvcmUgdGhlIGRhdGEgaW50byB3aXRoIHRoZQorLy8gY2w6OmxvY2F0aW9uKHgpIG1vZGlmaWVyLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBEYXRhVHlwZSwgYm9vbCBFeHRlcm5hbFN0b3JhZ2UsIGJvb2wgaXNDbGFzcz4KK2NsYXNzIG9wdF9zdG9yYWdlIHsKKyAgRGF0YVR5cGUgKkxvY2F0aW9uID0gbnVsbHB0cjsgLy8gV2hlcmUgdG8gc3RvcmUgdGhlIG9iamVjdC4uLgorICBPcHRpb25WYWx1ZTxEYXRhVHlwZT4gRGVmYXVsdDsKKworICB2b2lkIGNoZWNrX2xvY2F0aW9uKCkgY29uc3QgeworICAgIGFzc2VydChMb2NhdGlvbiAmJiAiY2w6OmxvY2F0aW9uKC4uLikgbm90IHNwZWNpZmllZCBmb3IgYSBjb21tYW5kICIKKyAgICAgICAgICAgICAgICAgICAgICAgImxpbmUgb3B0aW9uIHdpdGggZXh0ZXJuYWwgc3RvcmFnZSwgIgorICAgICAgICAgICAgICAgICAgICAgICAib3IgY2w6OmluaXQgc3BlY2lmaWVkIGJlZm9yZSBjbDo6bG9jYXRpb24oKSEhIik7CisgIH0KKworcHVibGljOgorICBvcHRfc3RvcmFnZSgpID0gZGVmYXVsdDsKKworICBib29sIHNldExvY2F0aW9uKE9wdGlvbiAmTywgRGF0YVR5cGUgJkwpIHsKKyAgICBpZiAoTG9jYXRpb24pCisgICAgICByZXR1cm4gTy5lcnJvcigiY2w6OmxvY2F0aW9uKHgpIHNwZWNpZmllZCBtb3JlIHRoYW4gb25jZSEiKTsKKyAgICBMb2NhdGlvbiA9ICZMOworICAgIERlZmF1bHQgPSBMOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIHNldFZhbHVlKGNvbnN0IFQgJlYsIGJvb2wgaW5pdGlhbCA9IGZhbHNlKSB7CisgICAgY2hlY2tfbG9jYXRpb24oKTsKKyAgICAqTG9jYXRpb24gPSBWOworICAgIGlmIChpbml0aWFsKQorICAgICAgRGVmYXVsdCA9IFY7CisgIH0KKworICBEYXRhVHlwZSAmZ2V0VmFsdWUoKSB7CisgICAgY2hlY2tfbG9jYXRpb24oKTsKKyAgICByZXR1cm4gKkxvY2F0aW9uOworICB9CisgIGNvbnN0IERhdGFUeXBlICZnZXRWYWx1ZSgpIGNvbnN0IHsKKyAgICBjaGVja19sb2NhdGlvbigpOworICAgIHJldHVybiAqTG9jYXRpb247CisgIH0KKworICBvcGVyYXRvciBEYXRhVHlwZSgpIGNvbnN0IHsgcmV0dXJuIHRoaXMtPmdldFZhbHVlKCk7IH0KKworICBjb25zdCBPcHRpb25WYWx1ZTxEYXRhVHlwZT4gJmdldERlZmF1bHQoKSBjb25zdCB7IHJldHVybiBEZWZhdWx0OyB9Cit9OworCisvLyBEZWZpbmUgaG93IHRvIGhvbGQgYSBjbGFzcyB0eXBlIG9iamVjdCwgc3VjaCBhcyBhIHN0cmluZy4gIFNpbmNlIHdlIGNhbgorLy8gaW5oZXJpdCBmcm9tIGEgY2xhc3MsIHdlIGRvIHNvLiAgVGhpcyBtYWtlcyB1cyBleGFjdGx5IGNvbXBhdGlibGUgd2l0aCB0aGUKKy8vIG9iamVjdCBpbiBhbGwgY2FzZXMgdGhhdCBpdCBpcyB1c2VkLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBEYXRhVHlwZT4KK2NsYXNzIG9wdF9zdG9yYWdlPERhdGFUeXBlLCBmYWxzZSwgdHJ1ZT4gOiBwdWJsaWMgRGF0YVR5cGUgeworcHVibGljOgorICBPcHRpb25WYWx1ZTxEYXRhVHlwZT4gRGVmYXVsdDsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBzZXRWYWx1ZShjb25zdCBUICZWLCBib29sIGluaXRpYWwgPSBmYWxzZSkgeworICAgIERhdGFUeXBlOjpvcGVyYXRvcj0oVik7CisgICAgaWYgKGluaXRpYWwpCisgICAgICBEZWZhdWx0ID0gVjsKKyAgfQorCisgIERhdGFUeXBlICZnZXRWYWx1ZSgpIHsgcmV0dXJuICp0aGlzOyB9CisgIGNvbnN0IERhdGFUeXBlICZnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuICp0aGlzOyB9CisKKyAgY29uc3QgT3B0aW9uVmFsdWU8RGF0YVR5cGU+ICZnZXREZWZhdWx0KCkgY29uc3QgeyByZXR1cm4gRGVmYXVsdDsgfQorfTsKKworLy8gRGVmaW5lIGEgcGFydGlhbCBzcGVjaWFsaXphdGlvbiB0byBoYW5kbGUgdGhpbmdzIHdlIGNhbm5vdCBpbmhlcml0IGZyb20uICBJbgorLy8gdGhpcyBjYXNlLCB3ZSBzdG9yZSBhbiBpbnN0YW5jZSB0aHJvdWdoIGNvbnRhaW5tZW50LCBhbmQgb3ZlcmxvYWQgb3BlcmF0b3JzCisvLyB0byBnZXQgYXQgdGhlIHZhbHVlLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBEYXRhVHlwZT4gY2xhc3Mgb3B0X3N0b3JhZ2U8RGF0YVR5cGUsIGZhbHNlLCBmYWxzZT4geworcHVibGljOgorICBEYXRhVHlwZSBWYWx1ZTsKKyAgT3B0aW9uVmFsdWU8RGF0YVR5cGU+IERlZmF1bHQ7CisKKyAgLy8gTWFrZSBzdXJlIHdlIGluaXRpYWxpemUgdGhlIHZhbHVlIHdpdGggdGhlIGRlZmF1bHQgY29uc3RydWN0b3IgZm9yIHRoZQorICAvLyB0eXBlLgorICBvcHRfc3RvcmFnZSgpIDogVmFsdWUoRGF0YVR5cGUoKSksIERlZmF1bHQoRGF0YVR5cGUoKSkge30KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBzZXRWYWx1ZShjb25zdCBUICZWLCBib29sIGluaXRpYWwgPSBmYWxzZSkgeworICAgIFZhbHVlID0gVjsKKyAgICBpZiAoaW5pdGlhbCkKKyAgICAgIERlZmF1bHQgPSBWOworICB9CisgIERhdGFUeXBlICZnZXRWYWx1ZSgpIHsgcmV0dXJuIFZhbHVlOyB9CisgIERhdGFUeXBlIGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKworICBjb25zdCBPcHRpb25WYWx1ZTxEYXRhVHlwZT4gJmdldERlZmF1bHQoKSBjb25zdCB7IHJldHVybiBEZWZhdWx0OyB9CisKKyAgb3BlcmF0b3IgRGF0YVR5cGUoKSBjb25zdCB7IHJldHVybiBnZXRWYWx1ZSgpOyB9CisKKyAgLy8gSWYgdGhlIGRhdGF0eXBlIGlzIGEgcG9pbnRlciwgc3VwcG9ydCAtPiBvbiBpdC4KKyAgRGF0YVR5cGUgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gb3B0IC0gQSBzY2FsYXIgY29tbWFuZCBsaW5lIG9wdGlvbi4KKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgRGF0YVR5cGUsIGJvb2wgRXh0ZXJuYWxTdG9yYWdlID0gZmFsc2UsCisgICAgICAgICAgY2xhc3MgUGFyc2VyQ2xhc3MgPSBwYXJzZXI8RGF0YVR5cGU+PgorY2xhc3Mgb3B0IDogcHVibGljIE9wdGlvbiwKKyAgICAgICAgICAgIHB1YmxpYyBvcHRfc3RvcmFnZTxEYXRhVHlwZSwgRXh0ZXJuYWxTdG9yYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfY2xhc3M8RGF0YVR5cGU+Ojp2YWx1ZT4geworICBQYXJzZXJDbGFzcyBQYXJzZXI7CisKKyAgYm9vbCBoYW5kbGVPY2N1cnJlbmNlKHVuc2lnbmVkIHBvcywgU3RyaW5nUmVmIEFyZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQXJnKSBvdmVycmlkZSB7CisgICAgdHlwZW5hbWUgUGFyc2VyQ2xhc3M6OnBhcnNlcl9kYXRhX3R5cGUgVmFsID0KKyAgICAgICAgdHlwZW5hbWUgUGFyc2VyQ2xhc3M6OnBhcnNlcl9kYXRhX3R5cGUoKTsKKyAgICBpZiAoUGFyc2VyLnBhcnNlKCp0aGlzLCBBcmdOYW1lLCBBcmcsIFZhbCkpCisgICAgICByZXR1cm4gdHJ1ZTsgLy8gUGFyc2UgZXJyb3IhCisgICAgdGhpcy0+c2V0VmFsdWUoVmFsKTsKKyAgICB0aGlzLT5zZXRQb3NpdGlvbihwb3MpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGVudW0gVmFsdWVFeHBlY3RlZCBnZXRWYWx1ZUV4cGVjdGVkRmxhZ0RlZmF1bHQoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIFBhcnNlci5nZXRWYWx1ZUV4cGVjdGVkRmxhZ0RlZmF1bHQoKTsKKyAgfQorCisgIHZvaWQgZ2V0RXh0cmFPcHRpb25OYW1lcyhTbWFsbFZlY3RvckltcGw8U3RyaW5nUmVmPiAmT3B0aW9uTmFtZXMpIG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUGFyc2VyLmdldEV4dHJhT3B0aW9uTmFtZXMoT3B0aW9uTmFtZXMpOworICB9CisKKyAgLy8gRm9yd2FyZCBwcmludGluZyBzdHVmZiB0byB0aGUgcGFyc2VyLi4uCisgIHNpemVfdCBnZXRPcHRpb25XaWR0aCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUGFyc2VyLmdldE9wdGlvbldpZHRoKCp0aGlzKTsKKyAgfQorCisgIHZvaWQgcHJpbnRPcHRpb25JbmZvKHNpemVfdCBHbG9iYWxXaWR0aCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIFBhcnNlci5wcmludE9wdGlvbkluZm8oKnRoaXMsIEdsb2JhbFdpZHRoKTsKKyAgfQorCisgIHZvaWQgcHJpbnRPcHRpb25WYWx1ZShzaXplX3QgR2xvYmFsV2lkdGgsIGJvb2wgRm9yY2UpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBpZiAoRm9yY2UgfHwgdGhpcy0+Z2V0RGVmYXVsdCgpLmNvbXBhcmUodGhpcy0+Z2V0VmFsdWUoKSkpIHsKKyAgICAgIGNsOjpwcmludE9wdGlvbkRpZmY8UGFyc2VyQ2xhc3M+KCp0aGlzLCBQYXJzZXIsIHRoaXMtPmdldFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLT5nZXREZWZhdWx0KCksIEdsb2JhbFdpZHRoKTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgIHN0ZDo6aXNfYXNzaWduYWJsZTxUJiwgVD46OnZhbHVlPjo6dHlwZT4KKyAgdm9pZCBzZXREZWZhdWx0SW1wbCgpIHsKKyAgICBjb25zdCBPcHRpb25WYWx1ZTxEYXRhVHlwZT4gJlYgPSB0aGlzLT5nZXREZWZhdWx0KCk7CisgICAgaWYgKFYuaGFzVmFsdWUoKSkKKyAgICAgIHRoaXMtPnNldFZhbHVlKFYuZ2V0VmFsdWUoKSk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAgICFzdGQ6OmlzX2Fzc2lnbmFibGU8VCYsIFQ+Ojp2YWx1ZT46OnR5cGU+CisgIHZvaWQgc2V0RGVmYXVsdEltcGwoLi4uKSB7fQorCisgIHZvaWQgc2V0RGVmYXVsdCgpIG92ZXJyaWRlIHsgc2V0RGVmYXVsdEltcGw8RGF0YVR5cGU+KCk7IH0KKworICB2b2lkIGRvbmUoKSB7CisgICAgYWRkQXJndW1lbnQoKTsKKyAgICBQYXJzZXIuaW5pdGlhbGl6ZSgpOworICB9CisKK3B1YmxpYzoKKyAgLy8gQ29tbWFuZCBsaW5lIG9wdGlvbnMgc2hvdWxkIG5vdCBiZSBjb3B5YWJsZQorICBvcHQoY29uc3Qgb3B0ICYpID0gZGVsZXRlOworICBvcHQgJm9wZXJhdG9yPShjb25zdCBvcHQgJikgPSBkZWxldGU7CisKKyAgLy8gc2V0SW5pdGlhbFZhbHVlIC0gVXNlZCBieSB0aGUgY2w6OmluaXQgbW9kaWZpZXIuLi4KKyAgdm9pZCBzZXRJbml0aWFsVmFsdWUoY29uc3QgRGF0YVR5cGUgJlYpIHsgdGhpcy0+c2V0VmFsdWUoViwgdHJ1ZSk7IH0KKworICBQYXJzZXJDbGFzcyAmZ2V0UGFyc2VyKCkgeyByZXR1cm4gUGFyc2VyOyB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IERhdGFUeXBlICZvcGVyYXRvcj0oY29uc3QgVCAmVmFsKSB7CisgICAgdGhpcy0+c2V0VmFsdWUoVmFsKTsKKyAgICByZXR1cm4gdGhpcy0+Z2V0VmFsdWUoKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcy4uLiBNb2RzPgorICBleHBsaWNpdCBvcHQoY29uc3QgTW9kcyAmLi4uIE1zKQorICAgICAgOiBPcHRpb24oT3B0aW9uYWwsIE5vdEhpZGRlbiksIFBhcnNlcigqdGhpcykgeworICAgIGFwcGx5KHRoaXMsIE1zLi4uKTsKKyAgICBkb25lKCk7CisgIH0KK307CisKK2V4dGVybiB0ZW1wbGF0ZSBjbGFzcyBvcHQ8dW5zaWduZWQ+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIG9wdDxpbnQ+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIG9wdDxzdGQ6OnN0cmluZz47CitleHRlcm4gdGVtcGxhdGUgY2xhc3Mgb3B0PGNoYXI+OworZXh0ZXJuIHRlbXBsYXRlIGNsYXNzIG9wdDxib29sPjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIGxpc3Rfc3RvcmFnZSBjbGFzcworCisvLyBEZWZhdWx0IHN0b3JhZ2UgY2xhc3MgZGVmaW5pdGlvbjogZXh0ZXJuYWwgc3RvcmFnZS4gIFRoaXMgaW1wbGVtZW50YXRpb24KKy8vIGFzc3VtZXMgdGhlIHVzZXIgd2lsbCBzcGVjaWZ5IGEgdmFyaWFibGUgdG8gc3RvcmUgdGhlIGRhdGEgaW50byB3aXRoIHRoZQorLy8gY2w6OmxvY2F0aW9uKHgpIG1vZGlmaWVyLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBEYXRhVHlwZSwgY2xhc3MgU3RvcmFnZUNsYXNzPiBjbGFzcyBsaXN0X3N0b3JhZ2UgeworICBTdG9yYWdlQ2xhc3MgKkxvY2F0aW9uID0gbnVsbHB0cjsgLy8gV2hlcmUgdG8gc3RvcmUgdGhlIG9iamVjdC4uLgorCitwdWJsaWM6CisgIGxpc3Rfc3RvcmFnZSgpID0gZGVmYXVsdDsKKworICBib29sIHNldExvY2F0aW9uKE9wdGlvbiAmTywgU3RvcmFnZUNsYXNzICZMKSB7CisgICAgaWYgKExvY2F0aW9uKQorICAgICAgcmV0dXJuIE8uZXJyb3IoImNsOjpsb2NhdGlvbih4KSBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UhIik7CisgICAgTG9jYXRpb24gPSAmTDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBhZGRWYWx1ZShjb25zdCBUICZWKSB7CisgICAgYXNzZXJ0KExvY2F0aW9uICE9IDAgJiYgImNsOjpsb2NhdGlvbiguLi4pIG5vdCBzcGVjaWZpZWQgZm9yIGEgY29tbWFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpbmUgb3B0aW9uIHdpdGggZXh0ZXJuYWwgc3RvcmFnZSEiKTsKKyAgICBMb2NhdGlvbi0+cHVzaF9iYWNrKFYpOworICB9Cit9OworCisvLyBEZWZpbmUgaG93IHRvIGhvbGQgYSBjbGFzcyB0eXBlIG9iamVjdCwgc3VjaCBhcyBhIHN0cmluZy4KKy8vIE9yaWdpbmFsbHkgdGhpcyBjb2RlIGluaGVyaXRlZCBmcm9tIHN0ZDo6dmVjdG9yLiBJbiB0cmFuc2l0aW9uaW5nIHRvIGEgbmV3CisvLyBBUEkgZm9yIGNvbW1hbmQgbGluZSBvcHRpb25zIHdlIHNob3VsZCBjaGFuZ2UgdGhpcy4gVGhlIG5ldyBpbXBsZW1lbnRhdGlvbgorLy8gb2YgdGhpcyBsaXN0X3N0b3JhZ2Ugc3BlY2lhbGl6YXRpb24gaW1wbGVtZW50cyB0aGUgbWluaW11bSBzdWJzZXQgb2YgdGhlCisvLyBzdGQ6OnZlY3RvciBBUEkgcmVxdWlyZWQgZm9yIGFsbCB0aGUgY3VycmVudCBjbGllbnRzLgorLy8KKy8vIEZJWE1FOiBSZWR1Y2UgdGhpcyBBUEkgdG8gYSBtb3JlIG5hcnJvdyBzdWJzZXQgb2Ygc3RkOjp2ZWN0b3IKKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgRGF0YVR5cGU+IGNsYXNzIGxpc3Rfc3RvcmFnZTxEYXRhVHlwZSwgYm9vbD4geworICBzdGQ6OnZlY3RvcjxEYXRhVHlwZT4gU3RvcmFnZTsKKworcHVibGljOgorICB1c2luZyBpdGVyYXRvciA9IHR5cGVuYW1lIHN0ZDo6dmVjdG9yPERhdGFUeXBlPjo6aXRlcmF0b3I7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBTdG9yYWdlLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gU3RvcmFnZS5lbmQoKTsgfQorCisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gdHlwZW5hbWUgc3RkOjp2ZWN0b3I8RGF0YVR5cGU+Ojpjb25zdF9pdGVyYXRvcjsKKworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFN0b3JhZ2UuYmVnaW4oKTsgfQorICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBTdG9yYWdlLmVuZCgpOyB9CisKKyAgdXNpbmcgc2l6ZV90eXBlID0gdHlwZW5hbWUgc3RkOjp2ZWN0b3I8RGF0YVR5cGU+OjpzaXplX3R5cGU7CisKKyAgc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBTdG9yYWdlLnNpemUoKTsgfQorCisgIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBTdG9yYWdlLmVtcHR5KCk7IH0KKworICB2b2lkIHB1c2hfYmFjayhjb25zdCBEYXRhVHlwZSAmdmFsdWUpIHsgU3RvcmFnZS5wdXNoX2JhY2sodmFsdWUpOyB9CisgIHZvaWQgcHVzaF9iYWNrKERhdGFUeXBlICYmdmFsdWUpIHsgU3RvcmFnZS5wdXNoX2JhY2sodmFsdWUpOyB9CisKKyAgdXNpbmcgcmVmZXJlbmNlID0gdHlwZW5hbWUgc3RkOjp2ZWN0b3I8RGF0YVR5cGU+OjpyZWZlcmVuY2U7CisgIHVzaW5nIGNvbnN0X3JlZmVyZW5jZSA9IHR5cGVuYW1lIHN0ZDo6dmVjdG9yPERhdGFUeXBlPjo6Y29uc3RfcmVmZXJlbmNlOworCisgIHJlZmVyZW5jZSBvcGVyYXRvcltdKHNpemVfdHlwZSBwb3MpIHsgcmV0dXJuIFN0b3JhZ2VbcG9zXTsgfQorICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3JbXShzaXplX3R5cGUgcG9zKSBjb25zdCB7IHJldHVybiBTdG9yYWdlW3Bvc107IH0KKworICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBwb3MpIHsgcmV0dXJuIFN0b3JhZ2UuZXJhc2UocG9zKTsgfQorICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBmaXJzdCwgY29uc3RfaXRlcmF0b3IgbGFzdCkgeworICAgIHJldHVybiBTdG9yYWdlLmVyYXNlKGZpcnN0LCBsYXN0KTsKKyAgfQorCisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIHBvcykgeyByZXR1cm4gU3RvcmFnZS5lcmFzZShwb3MpOyB9CisgIGl0ZXJhdG9yIGVyYXNlKGl0ZXJhdG9yIGZpcnN0LCBpdGVyYXRvciBsYXN0KSB7CisgICAgcmV0dXJuIFN0b3JhZ2UuZXJhc2UoZmlyc3QsIGxhc3QpOworICB9CisKKyAgaXRlcmF0b3IgaW5zZXJ0KGNvbnN0X2l0ZXJhdG9yIHBvcywgY29uc3QgRGF0YVR5cGUgJnZhbHVlKSB7CisgICAgcmV0dXJuIFN0b3JhZ2UuaW5zZXJ0KHBvcywgdmFsdWUpOworICB9CisgIGl0ZXJhdG9yIGluc2VydChjb25zdF9pdGVyYXRvciBwb3MsIERhdGFUeXBlICYmdmFsdWUpIHsKKyAgICByZXR1cm4gU3RvcmFnZS5pbnNlcnQocG9zLCB2YWx1ZSk7CisgIH0KKworICBpdGVyYXRvciBpbnNlcnQoaXRlcmF0b3IgcG9zLCBjb25zdCBEYXRhVHlwZSAmdmFsdWUpIHsKKyAgICByZXR1cm4gU3RvcmFnZS5pbnNlcnQocG9zLCB2YWx1ZSk7CisgIH0KKyAgaXRlcmF0b3IgaW5zZXJ0KGl0ZXJhdG9yIHBvcywgRGF0YVR5cGUgJiZ2YWx1ZSkgeworICAgIHJldHVybiBTdG9yYWdlLmluc2VydChwb3MsIHZhbHVlKTsKKyAgfQorCisgIHJlZmVyZW5jZSBmcm9udCgpIHsgcmV0dXJuIFN0b3JhZ2UuZnJvbnQoKTsgfQorICBjb25zdF9yZWZlcmVuY2UgZnJvbnQoKSBjb25zdCB7IHJldHVybiBTdG9yYWdlLmZyb250KCk7IH0KKworICBvcGVyYXRvciBzdGQ6OnZlY3RvcjxEYXRhVHlwZT4mKCkgeyByZXR1cm4gU3RvcmFnZTsgfQorICBvcGVyYXRvciBBcnJheVJlZjxEYXRhVHlwZT4oKSB7IHJldHVybiBTdG9yYWdlOyB9CisgIHN0ZDo6dmVjdG9yPERhdGFUeXBlPiAqb3BlcmF0b3ImKCkgeyByZXR1cm4gJlN0b3JhZ2U7IH0KKyAgY29uc3Qgc3RkOjp2ZWN0b3I8RGF0YVR5cGU+ICpvcGVyYXRvciYoKSBjb25zdCB7IHJldHVybiAmU3RvcmFnZTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIGFkZFZhbHVlKGNvbnN0IFQgJlYpIHsgU3RvcmFnZS5wdXNoX2JhY2soVik7IH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBsaXN0IC0gQSBsaXN0IG9mIGNvbW1hbmQgbGluZSBvcHRpb25zLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBEYXRhVHlwZSwgY2xhc3MgU3RvcmFnZUNsYXNzID0gYm9vbCwKKyAgICAgICAgICBjbGFzcyBQYXJzZXJDbGFzcyA9IHBhcnNlcjxEYXRhVHlwZT4+CitjbGFzcyBsaXN0IDogcHVibGljIE9wdGlvbiwgcHVibGljIGxpc3Rfc3RvcmFnZTxEYXRhVHlwZSwgU3RvcmFnZUNsYXNzPiB7CisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBQb3NpdGlvbnM7CisgIFBhcnNlckNsYXNzIFBhcnNlcjsKKworICBlbnVtIFZhbHVlRXhwZWN0ZWQgZ2V0VmFsdWVFeHBlY3RlZEZsYWdEZWZhdWx0KCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBQYXJzZXIuZ2V0VmFsdWVFeHBlY3RlZEZsYWdEZWZhdWx0KCk7CisgIH0KKworICB2b2lkIGdldEV4dHJhT3B0aW9uTmFtZXMoU21hbGxWZWN0b3JJbXBsPFN0cmluZ1JlZj4gJk9wdGlvbk5hbWVzKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIFBhcnNlci5nZXRFeHRyYU9wdGlvbk5hbWVzKE9wdGlvbk5hbWVzKTsKKyAgfQorCisgIGJvb2wgaGFuZGxlT2NjdXJyZW5jZSh1bnNpZ25lZCBwb3MsIFN0cmluZ1JlZiBBcmdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEFyZykgb3ZlcnJpZGUgeworICAgIHR5cGVuYW1lIFBhcnNlckNsYXNzOjpwYXJzZXJfZGF0YV90eXBlIFZhbCA9CisgICAgICAgIHR5cGVuYW1lIFBhcnNlckNsYXNzOjpwYXJzZXJfZGF0YV90eXBlKCk7CisgICAgaWYgKFBhcnNlci5wYXJzZSgqdGhpcywgQXJnTmFtZSwgQXJnLCBWYWwpKQorICAgICAgcmV0dXJuIHRydWU7IC8vIFBhcnNlIEVycm9yIQorICAgIGxpc3Rfc3RvcmFnZTxEYXRhVHlwZSwgU3RvcmFnZUNsYXNzPjo6YWRkVmFsdWUoVmFsKTsKKyAgICBzZXRQb3NpdGlvbihwb3MpOworICAgIFBvc2l0aW9ucy5wdXNoX2JhY2socG9zKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBGb3J3YXJkIHByaW50aW5nIHN0dWZmIHRvIHRoZSBwYXJzZXIuLi4KKyAgc2l6ZV90IGdldE9wdGlvbldpZHRoKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBQYXJzZXIuZ2V0T3B0aW9uV2lkdGgoKnRoaXMpOworICB9CisKKyAgdm9pZCBwcmludE9wdGlvbkluZm8oc2l6ZV90IEdsb2JhbFdpZHRoKSBjb25zdCBvdmVycmlkZSB7CisgICAgUGFyc2VyLnByaW50T3B0aW9uSW5mbygqdGhpcywgR2xvYmFsV2lkdGgpOworICB9CisKKyAgLy8gVW5pbXBsZW1lbnRlZDogbGlzdCBvcHRpb25zIGRvbid0IGN1cnJlbnRseSBzdG9yZSB0aGVpciBkZWZhdWx0IHZhbHVlLgorICB2b2lkIHByaW50T3B0aW9uVmFsdWUoc2l6ZV90IC8qR2xvYmFsV2lkdGgqLywgYm9vbCAvKkZvcmNlKi8pIGNvbnN0IG92ZXJyaWRlIHsKKyAgfQorCisgIHZvaWQgc2V0RGVmYXVsdCgpIG92ZXJyaWRlIHt9CisKKyAgdm9pZCBkb25lKCkgeworICAgIGFkZEFyZ3VtZW50KCk7CisgICAgUGFyc2VyLmluaXRpYWxpemUoKTsKKyAgfQorCitwdWJsaWM6CisgIC8vIENvbW1hbmQgbGluZSBvcHRpb25zIHNob3VsZCBub3QgYmUgY29weWFibGUKKyAgbGlzdChjb25zdCBsaXN0ICYpID0gZGVsZXRlOworICBsaXN0ICZvcGVyYXRvcj0oY29uc3QgbGlzdCAmKSA9IGRlbGV0ZTsKKworICBQYXJzZXJDbGFzcyAmZ2V0UGFyc2VyKCkgeyByZXR1cm4gUGFyc2VyOyB9CisKKyAgdW5zaWduZWQgZ2V0UG9zaXRpb24odW5zaWduZWQgb3B0bnVtKSBjb25zdCB7CisgICAgYXNzZXJ0KG9wdG51bSA8IHRoaXMtPnNpemUoKSAmJiAiSW52YWxpZCBvcHRpb24gaW5kZXgiKTsKKyAgICByZXR1cm4gUG9zaXRpb25zW29wdG51bV07CisgIH0KKworICB2b2lkIHNldE51bUFkZGl0aW9uYWxWYWxzKHVuc2lnbmVkIG4pIHsgT3B0aW9uOjpzZXROdW1BZGRpdGlvbmFsVmFscyhuKTsgfQorCisgIHRlbXBsYXRlIDxjbGFzcy4uLiBNb2RzPgorICBleHBsaWNpdCBsaXN0KGNvbnN0IE1vZHMgJi4uLiBNcykKKyAgICAgIDogT3B0aW9uKFplcm9Pck1vcmUsIE5vdEhpZGRlbiksIFBhcnNlcigqdGhpcykgeworICAgIGFwcGx5KHRoaXMsIE1zLi4uKTsKKyAgICBkb25lKCk7CisgIH0KK307CisKKy8vIG11bHRpX3ZhbCAtIE1vZGlmaWVyIHRvIHNldCB0aGUgbnVtYmVyIG9mIGFkZGl0aW9uYWwgdmFsdWVzLgorc3RydWN0IG11bHRpX3ZhbCB7CisgIHVuc2lnbmVkIEFkZGl0aW9uYWxWYWxzOworICBleHBsaWNpdCBtdWx0aV92YWwodW5zaWduZWQgTikgOiBBZGRpdGlvbmFsVmFscyhOKSB7fQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBELCB0eXBlbmFtZSBTLCB0eXBlbmFtZSBQPgorICB2b2lkIGFwcGx5KGxpc3Q8RCwgUywgUD4gJkwpIGNvbnN0IHsKKyAgICBMLnNldE51bUFkZGl0aW9uYWxWYWxzKEFkZGl0aW9uYWxWYWxzKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIGJpdHNfc3RvcmFnZSBjbGFzcworCisvLyBEZWZhdWx0IHN0b3JhZ2UgY2xhc3MgZGVmaW5pdGlvbjogZXh0ZXJuYWwgc3RvcmFnZS4gIFRoaXMgaW1wbGVtZW50YXRpb24KKy8vIGFzc3VtZXMgdGhlIHVzZXIgd2lsbCBzcGVjaWZ5IGEgdmFyaWFibGUgdG8gc3RvcmUgdGhlIGRhdGEgaW50byB3aXRoIHRoZQorLy8gY2w6OmxvY2F0aW9uKHgpIG1vZGlmaWVyLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBEYXRhVHlwZSwgY2xhc3MgU3RvcmFnZUNsYXNzPiBjbGFzcyBiaXRzX3N0b3JhZ2UgeworICB1bnNpZ25lZCAqTG9jYXRpb24gPSBudWxscHRyOyAvLyBXaGVyZSB0byBzdG9yZSB0aGUgYml0cy4uLgorCisgIHRlbXBsYXRlIDxjbGFzcyBUPiBzdGF0aWMgdW5zaWduZWQgQml0KGNvbnN0IFQgJlYpIHsKKyAgICB1bnNpZ25lZCBCaXRQb3MgPSByZWludGVycHJldF9jYXN0PHVuc2lnbmVkPihWKTsKKyAgICBhc3NlcnQoQml0UG9zIDwgc2l6ZW9mKHVuc2lnbmVkKSAqIENIQVJfQklUICYmCisgICAgICAgICAgICJlbnVtIGV4Y2VlZHMgd2lkdGggb2YgYml0IHZlY3RvciEiKTsKKyAgICByZXR1cm4gMSA8PCBCaXRQb3M7CisgIH0KKworcHVibGljOgorICBiaXRzX3N0b3JhZ2UoKSA9IGRlZmF1bHQ7CisKKyAgYm9vbCBzZXRMb2NhdGlvbihPcHRpb24gJk8sIHVuc2lnbmVkICZMKSB7CisgICAgaWYgKExvY2F0aW9uKQorICAgICAgcmV0dXJuIE8uZXJyb3IoImNsOjpsb2NhdGlvbih4KSBzcGVjaWZpZWQgbW9yZSB0aGFuIG9uY2UhIik7CisgICAgTG9jYXRpb24gPSAmTDsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gdm9pZCBhZGRWYWx1ZShjb25zdCBUICZWKSB7CisgICAgYXNzZXJ0KExvY2F0aW9uICE9IDAgJiYgImNsOjpsb2NhdGlvbiguLi4pIG5vdCBzcGVjaWZpZWQgZm9yIGEgY29tbWFuZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpbmUgb3B0aW9uIHdpdGggZXh0ZXJuYWwgc3RvcmFnZSEiKTsKKyAgICAqTG9jYXRpb24gfD0gQml0KFYpOworICB9CisKKyAgdW5zaWduZWQgZ2V0Qml0cygpIHsgcmV0dXJuICpMb2NhdGlvbjsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBUPiBib29sIGlzU2V0KGNvbnN0IFQgJlYpIHsKKyAgICByZXR1cm4gKCpMb2NhdGlvbiAmIEJpdChWKSkgIT0gMDsKKyAgfQorfTsKKworLy8gRGVmaW5lIGhvdyB0byBob2xkIGJpdHMuICBTaW5jZSB3ZSBjYW4gaW5oZXJpdCBmcm9tIGEgY2xhc3MsIHdlIGRvIHNvLgorLy8gVGhpcyBtYWtlcyB1cyBleGFjdGx5IGNvbXBhdGlibGUgd2l0aCB0aGUgYml0cyBpbiBhbGwgY2FzZXMgdGhhdCBpdCBpcyB1c2VkLgorLy8KK3RlbXBsYXRlIDxjbGFzcyBEYXRhVHlwZT4gY2xhc3MgYml0c19zdG9yYWdlPERhdGFUeXBlLCBib29sPiB7CisgIHVuc2lnbmVkIEJpdHM7IC8vIFdoZXJlIHRvIHN0b3JlIHRoZSBiaXRzLi4uCisKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+IHN0YXRpYyB1bnNpZ25lZCBCaXQoY29uc3QgVCAmVikgeworICAgIHVuc2lnbmVkIEJpdFBvcyA9ICh1bnNpZ25lZClWOworICAgIGFzc2VydChCaXRQb3MgPCBzaXplb2YodW5zaWduZWQpICogQ0hBUl9CSVQgJiYKKyAgICAgICAgICAgImVudW0gZXhjZWVkcyB3aWR0aCBvZiBiaXQgdmVjdG9yISIpOworICAgIHJldHVybiAxIDw8IEJpdFBvczsKKyAgfQorCitwdWJsaWM6CisgIHRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIGFkZFZhbHVlKGNvbnN0IFQgJlYpIHsgQml0cyB8PSBCaXQoVik7IH0KKworICB1bnNpZ25lZCBnZXRCaXRzKCkgeyByZXR1cm4gQml0czsgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBUPiBib29sIGlzU2V0KGNvbnN0IFQgJlYpIHsgcmV0dXJuIChCaXRzICYgQml0KFYpKSAhPSAwOyB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gYml0cyAtIEEgYml0IHZlY3RvciBvZiBjb21tYW5kIG9wdGlvbnMuCisvLwordGVtcGxhdGUgPGNsYXNzIERhdGFUeXBlLCBjbGFzcyBTdG9yYWdlID0gYm9vbCwKKyAgICAgICAgICBjbGFzcyBQYXJzZXJDbGFzcyA9IHBhcnNlcjxEYXRhVHlwZT4+CitjbGFzcyBiaXRzIDogcHVibGljIE9wdGlvbiwgcHVibGljIGJpdHNfc3RvcmFnZTxEYXRhVHlwZSwgU3RvcmFnZT4geworICBzdGQ6OnZlY3Rvcjx1bnNpZ25lZD4gUG9zaXRpb25zOworICBQYXJzZXJDbGFzcyBQYXJzZXI7CisKKyAgZW51bSBWYWx1ZUV4cGVjdGVkIGdldFZhbHVlRXhwZWN0ZWRGbGFnRGVmYXVsdCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUGFyc2VyLmdldFZhbHVlRXhwZWN0ZWRGbGFnRGVmYXVsdCgpOworICB9CisKKyAgdm9pZCBnZXRFeHRyYU9wdGlvbk5hbWVzKFNtYWxsVmVjdG9ySW1wbDxTdHJpbmdSZWY+ICZPcHRpb25OYW1lcykgb3ZlcnJpZGUgeworICAgIHJldHVybiBQYXJzZXIuZ2V0RXh0cmFPcHRpb25OYW1lcyhPcHRpb25OYW1lcyk7CisgIH0KKworICBib29sIGhhbmRsZU9jY3VycmVuY2UodW5zaWduZWQgcG9zLCBTdHJpbmdSZWYgQXJnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBBcmcpIG92ZXJyaWRlIHsKKyAgICB0eXBlbmFtZSBQYXJzZXJDbGFzczo6cGFyc2VyX2RhdGFfdHlwZSBWYWwgPQorICAgICAgICB0eXBlbmFtZSBQYXJzZXJDbGFzczo6cGFyc2VyX2RhdGFfdHlwZSgpOworICAgIGlmIChQYXJzZXIucGFyc2UoKnRoaXMsIEFyZ05hbWUsIEFyZywgVmFsKSkKKyAgICAgIHJldHVybiB0cnVlOyAvLyBQYXJzZSBFcnJvciEKKyAgICB0aGlzLT5hZGRWYWx1ZShWYWwpOworICAgIHNldFBvc2l0aW9uKHBvcyk7CisgICAgUG9zaXRpb25zLnB1c2hfYmFjayhwb3MpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIEZvcndhcmQgcHJpbnRpbmcgc3R1ZmYgdG8gdGhlIHBhcnNlci4uLgorICBzaXplX3QgZ2V0T3B0aW9uV2lkdGgoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIFBhcnNlci5nZXRPcHRpb25XaWR0aCgqdGhpcyk7CisgIH0KKworICB2b2lkIHByaW50T3B0aW9uSW5mbyhzaXplX3QgR2xvYmFsV2lkdGgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBQYXJzZXIucHJpbnRPcHRpb25JbmZvKCp0aGlzLCBHbG9iYWxXaWR0aCk7CisgIH0KKworICAvLyBVbmltcGxlbWVudGVkOiBiaXRzIG9wdGlvbnMgZG9uJ3QgY3VycmVudGx5IHN0b3JlIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgorICB2b2lkIHByaW50T3B0aW9uVmFsdWUoc2l6ZV90IC8qR2xvYmFsV2lkdGgqLywgYm9vbCAvKkZvcmNlKi8pIGNvbnN0IG92ZXJyaWRlIHsKKyAgfQorCisgIHZvaWQgc2V0RGVmYXVsdCgpIG92ZXJyaWRlIHt9CisKKyAgdm9pZCBkb25lKCkgeworICAgIGFkZEFyZ3VtZW50KCk7CisgICAgUGFyc2VyLmluaXRpYWxpemUoKTsKKyAgfQorCitwdWJsaWM6CisgIC8vIENvbW1hbmQgbGluZSBvcHRpb25zIHNob3VsZCBub3QgYmUgY29weWFibGUKKyAgYml0cyhjb25zdCBiaXRzICYpID0gZGVsZXRlOworICBiaXRzICZvcGVyYXRvcj0oY29uc3QgYml0cyAmKSA9IGRlbGV0ZTsKKworICBQYXJzZXJDbGFzcyAmZ2V0UGFyc2VyKCkgeyByZXR1cm4gUGFyc2VyOyB9CisKKyAgdW5zaWduZWQgZ2V0UG9zaXRpb24odW5zaWduZWQgb3B0bnVtKSBjb25zdCB7CisgICAgYXNzZXJ0KG9wdG51bSA8IHRoaXMtPnNpemUoKSAmJiAiSW52YWxpZCBvcHRpb24gaW5kZXgiKTsKKyAgICByZXR1cm4gUG9zaXRpb25zW29wdG51bV07CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gTW9kcz4KKyAgZXhwbGljaXQgYml0cyhjb25zdCBNb2RzICYuLi4gTXMpCisgICAgICA6IE9wdGlvbihaZXJvT3JNb3JlLCBOb3RIaWRkZW4pLCBQYXJzZXIoKnRoaXMpIHsKKyAgICBhcHBseSh0aGlzLCBNcy4uLik7CisgICAgZG9uZSgpOworICB9Cit9OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQWxpYXNlZCBjb21tYW5kIGxpbmUgb3B0aW9uIChhbGlhcyB0aGlzIG5hbWUgdG8gYSBwcmVleGlzdGluZyBuYW1lKQorLy8KKworY2xhc3MgYWxpYXMgOiBwdWJsaWMgT3B0aW9uIHsKKyAgT3B0aW9uICpBbGlhc0ZvcjsKKworICBib29sIGhhbmRsZU9jY3VycmVuY2UodW5zaWduZWQgcG9zLCBTdHJpbmdSZWYgLypBcmdOYW1lKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQXJnKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEFsaWFzRm9yLT5oYW5kbGVPY2N1cnJlbmNlKHBvcywgQWxpYXNGb3ItPkFyZ1N0ciwgQXJnKTsKKyAgfQorCisgIGJvb2wgYWRkT2NjdXJyZW5jZSh1bnNpZ25lZCBwb3MsIFN0cmluZ1JlZiAvKkFyZ05hbWUqLywgU3RyaW5nUmVmIFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBNdWx0aUFyZyA9IGZhbHNlKSBvdmVycmlkZSB7CisgICAgcmV0dXJuIEFsaWFzRm9yLT5hZGRPY2N1cnJlbmNlKHBvcywgQWxpYXNGb3ItPkFyZ1N0ciwgVmFsdWUsIE11bHRpQXJnKTsKKyAgfQorCisgIC8vIEhhbmRsZSBwcmludGluZyBzdHVmZi4uLgorICBzaXplX3QgZ2V0T3B0aW9uV2lkdGgoKSBjb25zdCBvdmVycmlkZTsKKyAgdm9pZCBwcmludE9wdGlvbkluZm8oc2l6ZV90IEdsb2JhbFdpZHRoKSBjb25zdCBvdmVycmlkZTsKKworICAvLyBBbGlhc2VzIGRvIG5vdCBuZWVkIHRvIHByaW50IHRoZWlyIHZhbHVlcy4KKyAgdm9pZCBwcmludE9wdGlvblZhbHVlKHNpemVfdCAvKkdsb2JhbFdpZHRoKi8sIGJvb2wgLypGb3JjZSovKSBjb25zdCBvdmVycmlkZSB7CisgIH0KKworICB2b2lkIHNldERlZmF1bHQoKSBvdmVycmlkZSB7IEFsaWFzRm9yLT5zZXREZWZhdWx0KCk7IH0KKworICBWYWx1ZUV4cGVjdGVkIGdldFZhbHVlRXhwZWN0ZWRGbGFnRGVmYXVsdCgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gQWxpYXNGb3ItPmdldFZhbHVlRXhwZWN0ZWRGbGFnKCk7CisgIH0KKworICB2b2lkIGRvbmUoKSB7CisgICAgaWYgKCFoYXNBcmdTdHIoKSkKKyAgICAgIGVycm9yKCJjbDo6YWxpYXMgbXVzdCBoYXZlIGFyZ3VtZW50IG5hbWUgc3BlY2lmaWVkISIpOworICAgIGlmICghQWxpYXNGb3IpCisgICAgICBlcnJvcigiY2w6OmFsaWFzIG11c3QgaGF2ZSBhbiBjbDo6YWxpYXNvcHQob3B0aW9uKSBzcGVjaWZpZWQhIik7CisgICAgU3VicyA9IEFsaWFzRm9yLT5TdWJzOworICAgIGFkZEFyZ3VtZW50KCk7CisgIH0KKworcHVibGljOgorICAvLyBDb21tYW5kIGxpbmUgb3B0aW9ucyBzaG91bGQgbm90IGJlIGNvcHlhYmxlCisgIGFsaWFzKGNvbnN0IGFsaWFzICYpID0gZGVsZXRlOworICBhbGlhcyAmb3BlcmF0b3I9KGNvbnN0IGFsaWFzICYpID0gZGVsZXRlOworCisgIHZvaWQgc2V0QWxpYXNGb3IoT3B0aW9uICZPKSB7CisgICAgaWYgKEFsaWFzRm9yKQorICAgICAgZXJyb3IoImNsOjphbGlhcyBtdXN0IG9ubHkgaGF2ZSBvbmUgY2w6OmFsaWFzb3B0KC4uLikgc3BlY2lmaWVkISIpOworICAgIEFsaWFzRm9yID0gJk87CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MuLi4gTW9kcz4KKyAgZXhwbGljaXQgYWxpYXMoY29uc3QgTW9kcyAmLi4uIE1zKQorICAgICAgOiBPcHRpb24oT3B0aW9uYWwsIEhpZGRlbiksIEFsaWFzRm9yKG51bGxwdHIpIHsKKyAgICBhcHBseSh0aGlzLCBNcy4uLik7CisgICAgZG9uZSgpOworICB9Cit9OworCisvLyBhbGlhc2ZvciAtIE1vZGlmaWVyIHRvIHNldCB0aGUgb3B0aW9uIGFuIGFsaWFzIGFsaWFzZXMuCitzdHJ1Y3QgYWxpYXNvcHQgeworICBPcHRpb24gJk9wdDsKKworICBleHBsaWNpdCBhbGlhc29wdChPcHRpb24gJk8pIDogT3B0KE8pIHt9CisKKyAgdm9pZCBhcHBseShhbGlhcyAmQSkgY29uc3QgeyBBLnNldEFsaWFzRm9yKE9wdCk7IH0KK307CisKKy8vIGV4dHJhaGVscCAtIHByb3ZpZGUgYWRkaXRpb25hbCBoZWxwIGF0IHRoZSBlbmQgb2YgdGhlIG5vcm1hbCBoZWxwCisvLyBvdXRwdXQuIEFsbCBvY2N1cnJlbmNlcyBvZiBjbDo6ZXh0cmFoZWxwIHdpbGwgYmUgYWNjdW11bGF0ZWQgYW5kCisvLyBwcmludGVkIHRvIHN0ZGVyciBhdCB0aGUgZW5kIG9mIHRoZSByZWd1bGFyIGhlbHAsIGp1c3QgYmVmb3JlCisvLyBleGl0IGlzIGNhbGxlZC4KK3N0cnVjdCBleHRyYWhlbHAgeworICBTdHJpbmdSZWYgbW9yZWhlbHA7CisKKyAgZXhwbGljaXQgZXh0cmFoZWxwKFN0cmluZ1JlZiBoZWxwKTsKK307CisKK3ZvaWQgUHJpbnRWZXJzaW9uTWVzc2FnZSgpOworCisvLy8gVGhpcyBmdW5jdGlvbiBqdXN0IHByaW50cyB0aGUgaGVscCBtZXNzYWdlLCBleGFjdGx5IHRoZSBzYW1lIHdheSBhcyBpZiB0aGUKKy8vLyAtaGVscCBvciAtaGVscC1oaWRkZW4gb3B0aW9uIGhhZCBiZWVuIGdpdmVuIG9uIHRoZSBjb21tYW5kIGxpbmUuCisvLy8KKy8vLyBccGFyYW0gSGlkZGVuIGlmIHRydWUgd2lsbCBwcmludCBoaWRkZW4gb3B0aW9ucworLy8vIFxwYXJhbSBDYXRlZ29yaXplZCBpZiB0cnVlIHByaW50IG9wdGlvbnMgaW4gY2F0ZWdvcmllcwordm9pZCBQcmludEhlbHBNZXNzYWdlKGJvb2wgSGlkZGVuID0gZmFsc2UsIGJvb2wgQ2F0ZWdvcml6ZWQgPSBmYWxzZSk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQdWJsaWMgaW50ZXJmYWNlIGZvciBhY2Nlc3NpbmcgcmVnaXN0ZXJlZCBvcHRpb25zLgorLy8KKworLy8vIFxicmllZiBVc2UgdGhpcyB0byBnZXQgYSBTdHJpbmdNYXAgdG8gYWxsIHJlZ2lzdGVyZWQgbmFtZWQgb3B0aW9ucworLy8vIChlLmcuIC1oZWxwKS4gTm90ZSBccCBNYXAgU2hvdWxkIGJlIGFuIGVtcHR5IFN0cmluZ01hcC4KKy8vLworLy8vIFxyZXR1cm4gQSByZWZlcmVuY2UgdG8gdGhlIFN0cmluZ01hcCB1c2VkIGJ5IHRoZSBjbCBBUElzIHRvIHBhcnNlIG9wdGlvbnMuCisvLy8KKy8vLyBBY2Nlc3MgdG8gdW5uYW1lZCBhcmd1bWVudHMgKGkuZS4gcG9zaXRpb25hbCkgYXJlIG5vdCBwcm92aWRlZCBiZWNhdXNlCisvLy8gaXQgaXMgZXhwZWN0ZWQgdGhhdCB0aGUgY2xpZW50IGFscmVhZHkgaGFzIGFjY2VzcyB0byB0aGVzZS4KKy8vLworLy8vIFR5cGljYWwgdXNhZ2U6CisvLy8gXGNvZGUKKy8vLyBtYWluKGludCBhcmdjLGNoYXIqIGFyZ3ZbXSkgeworLy8vIFN0cmluZ01hcDxsbHZtOjpjbDo6T3B0aW9uKj4gJm9wdHMgPSBsbHZtOjpjbDo6Z2V0UmVnaXN0ZXJlZE9wdGlvbnMoKTsKKy8vLyBhc3NlcnQob3B0cy5jb3VudCgiaGVscCIpID09IDEpCisvLy8gb3B0c1siaGVscCJdLT5zZXREZXNjcmlwdGlvbigiU2hvdyBhbHBoYWJldGljYWwgaGVscCBpbmZvcm1hdGlvbiIpCisvLy8gLy8gTW9yZSBjb2RlCisvLy8gbGx2bTo6Y2w6OlBhcnNlQ29tbWFuZExpbmVPcHRpb25zKGFyZ2MsYXJndik7CisvLy8gLy9Nb3JlIGNvZGUKKy8vLyB9CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFRoaXMgaW50ZXJmYWNlIGlzIHVzZWZ1bCBmb3IgbW9kaWZ5aW5nIG9wdGlvbnMgaW4gbGlicmFyaWVzIHRoYXQgYXJlIG91dCBvZgorLy8vIHRoZSBjb250cm9sIG9mIHRoZSBjbGllbnQuIFRoZSBvcHRpb25zIHNob3VsZCBiZSBtb2RpZmllZCBiZWZvcmUgY2FsbGluZworLy8vIGxsdm06OmNsOjpQYXJzZUNvbW1hbmRMaW5lT3B0aW9ucygpLgorLy8vCisvLy8gSG9wZWZ1bGx5IHRoaXMgQVBJIGNhbiBiZSBkZXByZWNhdGVkIHNvb24uIEFueSBzaXR1YXRpb24gd2hlcmUgb3B0aW9ucyBuZWVkCisvLy8gdG8gYmUgbW9kaWZpZWQgYnkgdG9vbHMgb3IgbGlicmFyaWVzIHNob3VsZCBiZSBoYW5kbGVkIGJ5IHNhbmUgQVBJcyByYXRoZXIKKy8vLyB0aGFuIGp1c3QgaGFuZGluZyBhcm91bmQgYSBnbG9iYWwgbGlzdC4KK1N0cmluZ01hcDxPcHRpb24gKj4gJmdldFJlZ2lzdGVyZWRPcHRpb25zKFN1YkNvbW1hbmQgJlN1YiA9ICpUb3BMZXZlbFN1YkNvbW1hbmQpOworCisvLy8gXGJyaWVmIFVzZSB0aGlzIHRvIGdldCBhbGwgcmVnaXN0ZXJlZCBTdWJDb21tYW5kcyBmcm9tIHRoZSBwcm92aWRlZCBwYXJzZXIuCisvLy8KKy8vLyBccmV0dXJuIEEgcmFuZ2Ugb2YgYWxsIFN1YkNvbW1hbmQgcG9pbnRlcnMgcmVnaXN0ZXJlZCB3aXRoIHRoZSBwYXJzZXIuCisvLy8KKy8vLyBUeXBpY2FsIHVzYWdlOgorLy8vIFxjb2RlCisvLy8gbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CisvLy8gICBsbHZtOjpjbDo6UGFyc2VDb21tYW5kTGluZU9wdGlvbnMoYXJnYywgYXJndik7CisvLy8gICBmb3IgKGF1dG8qIFMgOiBsbHZtOjpjbDo6Z2V0UmVnaXN0ZXJlZFN1YmNvbW1hbmRzKCkpIHsKKy8vLyAgICAgaWYgKCpTKSB7CisvLy8gICAgICAgc3RkOjpjb3V0IDw8ICJFeGVjdXRpbmcgc3ViY29tbWFuZDogIiA8PCBTLT5nZXROYW1lKCkgPDwgc3RkOjplbmRsOworLy8vICAgICAgIC8vIEV4ZWN1dGUgc29tZSBmdW5jdGlvbiBiYXNlZCBvbiB0aGUgbmFtZS4uLgorLy8vICAgICB9CisvLy8gICB9CisvLy8gfQorLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUaGlzIGludGVyZmFjZSBpcyB1c2VmdWwgZm9yIGRlZmluaW5nIHN1YmNvbW1hbmRzIGluIGxpYnJhcmllcyBhbmQKKy8vLyB0aGUgZGlzcGF0Y2ggZnJvbSBhIHNpbmdsZSBwb2ludCAobGlrZSBpbiB0aGUgbWFpbiBmdW5jdGlvbikuCitpdGVyYXRvcl9yYW5nZTx0eXBlbmFtZSBTbWFsbFB0clNldDxTdWJDb21tYW5kICosIDQ+OjppdGVyYXRvcj4KK2dldFJlZ2lzdGVyZWRTdWJjb21tYW5kcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU3RhbmRhbG9uZSBjb21tYW5kIGxpbmUgcHJvY2Vzc2luZyB1dGlsaXRpZXMuCisvLworCisvLy8gXGJyaWVmIFRva2VuaXplcyBhIGNvbW1hbmQgbGluZSB0aGF0IGNhbiBjb250YWluIGVzY2FwZXMgYW5kIHF1b3Rlcy4KKy8vCisvLy8gVGhlIHF1b3RpbmcgcnVsZXMgbWF0Y2ggdGhvc2UgdXNlZCBieSBHQ0MgYW5kIG90aGVyIHRvb2xzIHRoYXQgdXNlCisvLy8gbGliaWJlcnR5J3MgYnVpbGRhcmd2KCkgb3IgZXhwYW5kYXJndigpIHV0aWxpdGllcywgYW5kIGRvIG5vdCBtYXRjaCBiYXNoLgorLy8vIFRoZXkgZGlmZmVyIGZyb20gYnVpbGRhcmd2KCkgb24gdHJlYXRtZW50IG9mIGJhY2tzbGFzaGVzIHRoYXQgZG8gbm90IGVzY2FwZQorLy8vIGEgc3BlY2lhbCBjaGFyYWN0ZXIgdG8gbWFrZSBpdCBwb3NzaWJsZSB0byBhY2NlcHQgbW9zdCBXaW5kb3dzIGZpbGUgcGF0aHMuCisvLy8KKy8vLyBccGFyYW0gW2luXSBTb3VyY2UgVGhlIHN0cmluZyB0byBiZSBzcGxpdCBvbiB3aGl0ZXNwYWNlIHdpdGggcXVvdGVzLgorLy8vIFxwYXJhbSBbaW5dIFNhdmVyIERlbGVnYXRlcyBiYWNrIHRvIHRoZSBjYWxsZXIgZm9yIHNhdmluZyBwYXJzZWQgc3RyaW5ncy4KKy8vLyBccGFyYW0gW2luXSBNYXJrRU9McyB0cnVlIGlmIHRva2VuaXppbmcgYSByZXNwb25zZSBmaWxlIGFuZCB5b3Ugd2FudCBlbmQgb2YKKy8vLyBsaW5lcyBhbmQgZW5kIG9mIHRoZSByZXNwb25zZSBmaWxlIHRvIGJlIG1hcmtlZCB3aXRoIGEgbnVsbHB0ciBzdHJpbmcuCisvLy8gXHBhcmFtIFtvdXRdIE5ld0FyZ3YgQWxsIHBhcnNlZCBzdHJpbmdzIGFyZSBhcHBlbmRlZCB0byBOZXdBcmd2Lgordm9pZCBUb2tlbml6ZUdOVUNvbW1hbmRMaW5lKFN0cmluZ1JlZiBTb3VyY2UsIFN0cmluZ1NhdmVyICZTYXZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgY2hhciAqPiAmTmV3QXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE1hcmtFT0xzID0gZmFsc2UpOworCisvLy8gXGJyaWVmIFRva2VuaXplcyBhIFdpbmRvd3MgY29tbWFuZCBsaW5lIHdoaWNoIG1heSBjb250YWluIHF1b3RlcyBhbmQgZXNjYXBlZAorLy8vIHF1b3Rlcy4KKy8vLworLy8vIFNlZSBNU0ROIGRvY3MgZm9yIENvbW1hbmRMaW5lVG9Bcmd2VyBmb3IgaW5mb3JtYXRpb24gb24gdGhlIHF1b3RpbmcgcnVsZXMuCisvLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC8xN3c1eWtmdCh2PXZzLjg1KS5hc3B4CisvLy8KKy8vLyBccGFyYW0gW2luXSBTb3VyY2UgVGhlIHN0cmluZyB0byBiZSBzcGxpdCBvbiB3aGl0ZXNwYWNlIHdpdGggcXVvdGVzLgorLy8vIFxwYXJhbSBbaW5dIFNhdmVyIERlbGVnYXRlcyBiYWNrIHRvIHRoZSBjYWxsZXIgZm9yIHNhdmluZyBwYXJzZWQgc3RyaW5ncy4KKy8vLyBccGFyYW0gW2luXSBNYXJrRU9McyB0cnVlIGlmIHRva2VuaXppbmcgYSByZXNwb25zZSBmaWxlIGFuZCB5b3Ugd2FudCBlbmQgb2YKKy8vLyBsaW5lcyBhbmQgZW5kIG9mIHRoZSByZXNwb25zZSBmaWxlIHRvIGJlIG1hcmtlZCB3aXRoIGEgbnVsbHB0ciBzdHJpbmcuCisvLy8gXHBhcmFtIFtvdXRdIE5ld0FyZ3YgQWxsIHBhcnNlZCBzdHJpbmdzIGFyZSBhcHBlbmRlZCB0byBOZXdBcmd2Lgordm9pZCBUb2tlbml6ZVdpbmRvd3NDb21tYW5kTGluZShTdHJpbmdSZWYgU291cmNlLCBTdHJpbmdTYXZlciAmU2F2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjb25zdCBjaGFyICo+ICZOZXdBcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE1hcmtFT0xzID0gZmFsc2UpOworCisvLy8gXGJyaWVmIFN0cmluZyB0b2tlbml6YXRpb24gZnVuY3Rpb24gdHlwZS4gIFNob3VsZCBiZSBjb21wYXRpYmxlIHdpdGggZWl0aGVyCisvLy8gV2luZG93cyBvciBVbml4IGNvbW1hbmQgbGluZSB0b2tlbml6ZXJzLgordXNpbmcgVG9rZW5pemVyQ2FsbGJhY2sgPSB2b2lkICgqKShTdHJpbmdSZWYgU291cmNlLCBTdHJpbmdTYXZlciAmU2F2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjb25zdCBjaGFyICo+ICZOZXdBcmd2LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE1hcmtFT0xzKTsKKworLy8vIFRva2VuaXplcyBjb250ZW50IG9mIGNvbmZpZ3VyYXRpb24gZmlsZS4KKy8vLworLy8vIFxwYXJhbSBbaW5dIFNvdXJjZSBUaGUgc3RyaW5nIHJlcHJlc2VudGluZyBjb250ZW50IG9mIGNvbmZpZyBmaWxlLgorLy8vIFxwYXJhbSBbaW5dIFNhdmVyIERlbGVnYXRlcyBiYWNrIHRvIHRoZSBjYWxsZXIgZm9yIHNhdmluZyBwYXJzZWQgc3RyaW5ncy4KKy8vLyBccGFyYW0gW291dF0gTmV3QXJndiBBbGwgcGFyc2VkIHN0cmluZ3MgYXJlIGFwcGVuZGVkIHRvIE5ld0FyZ3YuCisvLy8gXHBhcmFtIFtpbl0gTWFya0VPTHMgQWRkZWQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBUb2tlbml6ZXJDYWxsYmFjay4KKy8vLworLy8vIEl0IHdvcmtzIGxpa2UgVG9rZW5pemVHTlVDb21tYW5kTGluZSB3aXRoIGFiaWxpdHkgdG8gc2tpcCBjb21tZW50IGxpbmVzLgorLy8vCit2b2lkIHRva2VuaXplQ29uZmlnRmlsZShTdHJpbmdSZWYgU291cmNlLCBTdHJpbmdTYXZlciAmU2F2ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgY2hhciAqPiAmTmV3QXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTWFya0VPTHMgPSBmYWxzZSk7CisKKy8vLyBSZWFkcyBjb21tYW5kIGxpbmUgb3B0aW9ucyBmcm9tIHRoZSBnaXZlbiBjb25maWd1cmF0aW9uIGZpbGUuCisvLy8KKy8vLyBccGFyYW0gW2luXSBDZmdGaWxlTmFtZSBQYXRoIHRvIGNvbmZpZ3VyYXRpb24gZmlsZS4KKy8vLyBccGFyYW0gW2luXSBTYXZlciAgT2JqZWN0cyB0aGF0IHNhdmVzIGFsbG9jYXRlZCBzdHJpbmdzLgorLy8vIFxwYXJhbSBbb3V0XSBBcmd2IEFycmF5IHRvIHdoaWNoIHRoZSByZWFkIG9wdGlvbnMgYXJlIGFkZGVkLgorLy8vIFxyZXR1cm4gdHJ1ZSBpZiB0aGUgZmlsZSB3YXMgc3VjY2Vzc2Z1bGx5IHJlYWQuCisvLy8KKy8vLyBJdCByZWFkcyBjb250ZW50IG9mIHRoZSBzcGVjaWZpZWQgZmlsZSwgdG9rZW5pemVzIGl0IGFuZCBleHBhbmRzICJAZmlsZSIKKy8vLyBjb21tYW5kcyByZXNvbHZpbmcgZmlsZSBuYW1lcyBpbiB0aGVtIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3Rvcnkgd2hlcmUKKy8vLyBDZmdGaWxlbmFtZSByZXNpZGVzLgorLy8vCitib29sIHJlYWRDb25maWdGaWxlKFN0cmluZ1JlZiBDZmdGaWxlTmFtZSwgU3RyaW5nU2F2ZXIgJlNhdmVyLAorICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgY2hhciAqPiAmQXJndik7CisKKy8vLyBcYnJpZWYgRXhwYW5kIHJlc3BvbnNlIGZpbGVzIG9uIGEgY29tbWFuZCBsaW5lIHJlY3Vyc2l2ZWx5IHVzaW5nIHRoZSBnaXZlbgorLy8vIFN0cmluZ1NhdmVyIGFuZCB0b2tlbml6YXRpb24gc3RyYXRlZ3kuICBBcmd2IHNob3VsZCBjb250YWluIHRoZSBjb21tYW5kIGxpbmUKKy8vLyBiZWZvcmUgZXhwYW5zaW9uIGFuZCB3aWxsIGJlIG1vZGlmaWVkIGluIHBsYWNlLiBJZiByZXF1ZXN0ZWQsIEFyZ3Ygd2lsbAorLy8vIGFsc28gYmUgcG9wdWxhdGVkIHdpdGggbnVsbHB0cnMgaW5kaWNhdGluZyB3aGVyZSBlYWNoIHJlc3BvbnNlIGZpbGUgbGluZQorLy8vIGVuZHMsIHdoaWNoIGlzIHVzZWZ1bCBmb3IgdGhlICIvbGluayIgYXJndW1lbnQgdGhhdCBuZWVkcyB0byBjb25zdW1lIGFsbAorLy8vIHJlbWFpbmluZyBhcmd1bWVudHMgb25seSB1bnRpbCB0aGUgbmV4dCBlbmQgb2YgbGluZSwgd2hlbiBpbiBhIHJlc3BvbnNlCisvLy8gZmlsZS4KKy8vLworLy8vIFxwYXJhbSBbaW5dIFNhdmVyIERlbGVnYXRlcyBiYWNrIHRvIHRoZSBjYWxsZXIgZm9yIHNhdmluZyBwYXJzZWQgc3RyaW5ncy4KKy8vLyBccGFyYW0gW2luXSBUb2tlbml6ZXIgVG9rZW5pemF0aW9uIHN0cmF0ZWd5LiBUeXBpY2FsbHkgVW5peCBvciBXaW5kb3dzLgorLy8vIFxwYXJhbSBbaW4sb3V0XSBBcmd2IENvbW1hbmQgbGluZSBpbnRvIHdoaWNoIHRvIGV4cGFuZCByZXNwb25zZSBmaWxlcy4KKy8vLyBccGFyYW0gW2luXSBNYXJrRU9McyBNYXJrIGVuZCBvZiBsaW5lcyBhbmQgdGhlIGVuZCBvZiB0aGUgcmVzcG9uc2UgZmlsZQorLy8vIHdpdGggbnVsbHB0cnMgaW4gdGhlIEFyZ3YgdmVjdG9yLgorLy8vIFxwYXJhbSBbaW5dIFJlbGF0aXZlTmFtZXMgdHJ1ZSBpZiBuYW1lcyBvZiBuZXN0ZWQgcmVzcG9uc2UgZmlsZXMgbXVzdCBiZQorLy8vIHJlc29sdmVkIHJlbGF0aXZlIHRvIGluY2x1ZGluZyBmaWxlLgorLy8vIFxyZXR1cm4gdHJ1ZSBpZiBhbGwgQGZpbGVzIHdlcmUgZXhwYW5kZWQgc3VjY2Vzc2Z1bGx5IG9yIHRoZXJlIHdlcmUgbm9uZS4KK2Jvb2wgRXhwYW5kUmVzcG9uc2VGaWxlcyhTdHJpbmdTYXZlciAmU2F2ZXIsIFRva2VuaXplckNhbGxiYWNrIFRva2VuaXplciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y29uc3QgY2hhciAqPiAmQXJndiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE1hcmtFT0xzID0gZmFsc2UsIGJvb2wgUmVsYXRpdmVOYW1lcyA9IGZhbHNlKTsKKworLy8vIFxicmllZiBNYXJrIGFsbCBvcHRpb25zIG5vdCBwYXJ0IG9mIHRoaXMgY2F0ZWdvcnkgYXMgY2w6OlJlYWxseUhpZGRlbi4KKy8vLworLy8vIFxwYXJhbSBDYXRlZ29yeSB0aGUgY2F0ZWdvcnkgb2Ygb3B0aW9ucyB0byBrZWVwIGRpc3BsYXlpbmcKKy8vLworLy8vIFNvbWUgdG9vbHMgKGxpa2UgY2xhbmctZm9ybWF0KSBsaWtlIHRvIGJlIGFibGUgdG8gaGlkZSBhbGwgb3B0aW9ucyB0aGF0IGFyZQorLy8vIG5vdCBzcGVjaWZpYyB0byB0aGUgdG9vbC4gVGhpcyBmdW5jdGlvbiBhbGxvd3MgYSB0b29sIHRvIHNwZWNpZnkgYSBzaW5nbGUKKy8vLyBvcHRpb24gY2F0ZWdvcnkgdG8gZGlzcGxheSBpbiB0aGUgLWhlbHAgb3V0cHV0Lgordm9pZCBIaWRlVW5yZWxhdGVkT3B0aW9ucyhjbDo6T3B0aW9uQ2F0ZWdvcnkgJkNhdGVnb3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBTdWJDb21tYW5kICZTdWIgPSAqVG9wTGV2ZWxTdWJDb21tYW5kKTsKKworLy8vIFxicmllZiBNYXJrIGFsbCBvcHRpb25zIG5vdCBwYXJ0IG9mIHRoZSBjYXRlZ29yaWVzIGFzIGNsOjpSZWFsbHlIaWRkZW4uCisvLy8KKy8vLyBccGFyYW0gQ2F0ZWdvcmllcyB0aGUgY2F0ZWdvcmllcyBvZiBvcHRpb25zIHRvIGtlZXAgZGlzcGxheWluZy4KKy8vLworLy8vIFNvbWUgdG9vbHMgKGxpa2UgY2xhbmctZm9ybWF0KSBsaWtlIHRvIGJlIGFibGUgdG8gaGlkZSBhbGwgb3B0aW9ucyB0aGF0IGFyZQorLy8vIG5vdCBzcGVjaWZpYyB0byB0aGUgdG9vbC4gVGhpcyBmdW5jdGlvbiBhbGxvd3MgYSB0b29sIHRvIHNwZWNpZnkgYSBzaW5nbGUKKy8vLyBvcHRpb24gY2F0ZWdvcnkgdG8gZGlzcGxheSBpbiB0aGUgLWhlbHAgb3V0cHV0Lgordm9pZCBIaWRlVW5yZWxhdGVkT3B0aW9ucyhBcnJheVJlZjxjb25zdCBjbDo6T3B0aW9uQ2F0ZWdvcnkgKj4gQ2F0ZWdvcmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3ViQ29tbWFuZCAmU3ViID0gKlRvcExldmVsU3ViQ29tbWFuZCk7CisKKy8vLyBcYnJpZWYgUmVzZXQgYWxsIGNvbW1hbmQgbGluZSBvcHRpb25zIHRvIGEgc3RhdGUgdGhhdCBsb29rcyBhcyBpZiB0aGV5IGhhdmUKKy8vLyBuZXZlciBhcHBlYXJlZCBvbiB0aGUgY29tbWFuZCBsaW5lLiAgVGhpcyBpcyB1c2VmdWwgZm9yIGJlaW5nIGFibGUgdG8gcGFyc2UKKy8vLyBhIGNvbW1hbmQgbGluZSBtdWx0aXBsZSB0aW1lcyAoZXNwZWNpYWxseSB1c2VmdWwgZm9yIHdyaXRpbmcgdGVzdHMpLgordm9pZCBSZXNldEFsbE9wdGlvbk9jY3VycmVuY2VzKCk7CisKKy8vLyBcYnJpZWYgUmVzZXQgdGhlIGNvbW1hbmQgbGluZSBwYXJzZXIgYmFjayB0byBpdHMgaW5pdGlhbCBzdGF0ZS4gIFRoaXMKKy8vLyByZW1vdmVzCisvLy8gYWxsIG9wdGlvbnMsIGNhdGVnb3JpZXMsIGFuZCBzdWJjb21tYW5kcyBhbmQgcmV0dXJucyB0aGUgcGFyc2VyIHRvIGEgc3RhdGUKKy8vLyB3aGVyZSBubyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQuCit2b2lkIFJlc2V0Q29tbWFuZExpbmVQYXJzZXIoKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGNsCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfQ09NTUFORExJTkVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NvbXBpbGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ29tcGlsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2E5NmU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgKQEAgLTAsMCArMSwxOSBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCAtIENvbXBpbGVyIGFic3RyYWN0aW9uIHN1cHBvcnQgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEdWUgdG8gbGF5ZXJpbmcgY29uc3RyYWludHMgKFN1cHBvcnQgZGVwZW5kcyBvbiBEZW1hbmdsZXIpIHRoaXMgaXMgYSB0aGluCisvLyB3cmFwcGVyIGFyb3VuZCB0aGUgaW1wbGVtZW50YXRpb24gdGhhdCBsaXZlcyBpbiBsbHZtLWMsIHRob3VnaCBtb3N0IGNsaWVudHMKKy8vIGNhbi9zaG91bGQgdGhpbmsgb2YgdGhpcyBhcyBiZWluZyBwcm92aWRlZCBieSBTdXBwb3J0IGZvciBzaW1wbGljaXR5IChub3QKKy8vIG1hbnkgY2xpZW50cyBhcmUgYXdhcmUgb2YgdGhlaXIgZGVwZW5kZW5jeSBvbiBEZW1hbmdsZXIvaXQncyBhIHdlaXJkIHBsYWNlIHRvCisvLyBvd24gdGhpcyAtIGJ1dCBkaWRuJ3Qgc2VlbSB0byBqdXN0aWZ5IHNwbGl0dGluZyBTdXBwb3J0IGludG8gImxvd2VyIHN1cHBvcnQiCisvLyBhbmQgInVwcGVyIHN1cHBvcnQiKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAibGx2bS9EZW1hbmdsZS9Db21waWxlci5oIgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NvbXByZXNzaW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ29tcHJlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZDE5MWFiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NvbXByZXNzaW9uLmgKQEAgLTAsMCArMSw1MiBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvQ29tcHJlc3Npb24uaCAtLS1Db21wcmVzc2lvbi0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgYmFzaWMgZnVuY3Rpb25zIGZvciBjb21wcmVzc2lvbi91bmNvbXByZXNzaW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0NPTVBSRVNTSU9OX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0NPTVBSRVNTSU9OX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0gewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIFNtYWxsVmVjdG9ySW1wbDsKK2NsYXNzIEVycm9yOworY2xhc3MgU3RyaW5nUmVmOworCituYW1lc3BhY2UgemxpYiB7CisKK2VudW0gQ29tcHJlc3Npb25MZXZlbCB7CisgIE5vQ29tcHJlc3Npb24sCisgIERlZmF1bHRDb21wcmVzc2lvbiwKKyAgQmVzdFNwZWVkQ29tcHJlc3Npb24sCisgIEJlc3RTaXplQ29tcHJlc3Npb24KK307CisKK2Jvb2wgaXNBdmFpbGFibGUoKTsKKworRXJyb3IgY29tcHJlc3MoU3RyaW5nUmVmIElucHV0QnVmZmVyLCBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJkNvbXByZXNzZWRCdWZmZXIsCisgICAgICAgICAgICAgICBDb21wcmVzc2lvbkxldmVsIExldmVsID0gRGVmYXVsdENvbXByZXNzaW9uKTsKKworRXJyb3IgdW5jb21wcmVzcyhTdHJpbmdSZWYgSW5wdXRCdWZmZXIsIGNoYXIgKlVuY29tcHJlc3NlZEJ1ZmZlciwKKyAgICAgICAgICAgICAgICAgc2l6ZV90ICZVbmNvbXByZXNzZWRTaXplKTsKKworRXJyb3IgdW5jb21wcmVzcyhTdHJpbmdSZWYgSW5wdXRCdWZmZXIsCisgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmVW5jb21wcmVzc2VkQnVmZmVyLAorICAgICAgICAgICAgICAgICBzaXplX3QgVW5jb21wcmVzc2VkU2l6ZSk7CisKK3VpbnQzMl90IGNyYzMyKFN0cmluZ1JlZiBCdWZmZXIpOworCit9ICAvLyBFbmQgb2YgbmFtZXNwYWNlIHpsaWIKKworfSAvLyBFbmQgb2YgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Db252ZXJ0VVRGLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ29udmVydFVURi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk5YWUxNzEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvQ29udmVydFVURi5oCkBAIC0wLDAgKzEsMjkxIEBACisvKj09PS0tLSBDb252ZXJ0VVRGLmggLSBVbml2ZXJzYWwgQ2hhcmFjdGVyIE5hbWVzIGNvbnZlcnNpb25zIC0tLS0tLS0tLS0tLS0tLT09PQorICoKKyAqICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyAqCisgKiBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKyAqIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKyAqCisgKj09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT0qLworLyoKKyAqIENvcHlyaWdodCAyMDAxLTIwMDQgVW5pY29kZSwgSW5jLgorICoKKyAqIERpc2NsYWltZXIKKyAqCisgKiBUaGlzIHNvdXJjZSBjb2RlIGlzIHByb3ZpZGVkIGFzIGlzIGJ5IFVuaWNvZGUsIEluYy4gTm8gY2xhaW1zIGFyZQorICogbWFkZSBhcyB0byBmaXRuZXNzIGZvciBhbnkgcGFydGljdWxhciBwdXJwb3NlLiBObyB3YXJyYW50aWVzIG9mIGFueQorICoga2luZCBhcmUgZXhwcmVzc2VkIG9yIGltcGxpZWQuIFRoZSByZWNpcGllbnQgYWdyZWVzIHRvIGRldGVybWluZQorICogYXBwbGljYWJpbGl0eSBvZiBpbmZvcm1hdGlvbiBwcm92aWRlZC4gSWYgdGhpcyBmaWxlIGhhcyBiZWVuCisgKiBwdXJjaGFzZWQgb24gbWFnbmV0aWMgb3Igb3B0aWNhbCBtZWRpYSBmcm9tIFVuaWNvZGUsIEluYy4sIHRoZQorICogc29sZSByZW1lZHkgZm9yIGFueSBjbGFpbSB3aWxsIGJlIGV4Y2hhbmdlIG9mIGRlZmVjdGl2ZSBtZWRpYQorICogd2l0aGluIDkwIGRheXMgb2YgcmVjZWlwdC4KKyAqCisgKiBMaW1pdGF0aW9ucyBvbiBSaWdodHMgdG8gUmVkaXN0cmlidXRlIFRoaXMgQ29kZQorICoKKyAqIFVuaWNvZGUsIEluYy4gaGVyZWJ5IGdyYW50cyB0aGUgcmlnaHQgdG8gZnJlZWx5IHVzZSB0aGUgaW5mb3JtYXRpb24KKyAqIHN1cHBsaWVkIGluIHRoaXMgZmlsZSBpbiB0aGUgY3JlYXRpb24gb2YgcHJvZHVjdHMgc3VwcG9ydGluZyB0aGUKKyAqIFVuaWNvZGUgU3RhbmRhcmQsIGFuZCB0byBtYWtlIGNvcGllcyBvZiB0aGlzIGZpbGUgaW4gYW55IGZvcm0KKyAqIGZvciBpbnRlcm5hbCBvciBleHRlcm5hbCBkaXN0cmlidXRpb24gYXMgbG9uZyBhcyB0aGlzIG5vdGljZQorICogcmVtYWlucyBhdHRhY2hlZC4KKyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIENvbnZlcnNpb25zIGJldHdlZW4gVVRGMzIsIFVURi0xNiwgYW5kIFVURi04LiAgSGVhZGVyIGZpbGUuCisKKyAgICBTZXZlcmFsIGZ1bnRpb25zIGFyZSBpbmNsdWRlZCBoZXJlLCBmb3JtaW5nIGEgY29tcGxldGUgc2V0IG9mCisgICAgY29udmVyc2lvbnMgYmV0d2VlbiB0aGUgdGhyZWUgZm9ybWF0cy4gIFVURi03IGlzIG5vdCBpbmNsdWRlZAorICAgIGhlcmUsIGJ1dCBpcyBoYW5kbGVkIGluIGEgc2VwYXJhdGUgc291cmNlIGZpbGUuCisKKyAgICBFYWNoIG9mIHRoZXNlIHJvdXRpbmVzIHRha2VzIHBvaW50ZXJzIHRvIGlucHV0IGJ1ZmZlcnMgYW5kIG91dHB1dAorICAgIGJ1ZmZlcnMuICBUaGUgaW5wdXQgYnVmZmVycyBhcmUgY29uc3QuCisKKyAgICBFYWNoIHJvdXRpbmUgY29udmVydHMgdGhlIHRleHQgYmV0d2VlbiAqc291cmNlU3RhcnQgYW5kIHNvdXJjZUVuZCwKKyAgICBwdXR0aW5nIHRoZSByZXN1bHQgaW50byB0aGUgYnVmZmVyIGJldHdlZW4gKnRhcmdldFN0YXJ0IGFuZAorICAgIHRhcmdldEVuZC4gTm90ZTogdGhlIGVuZCBwb2ludGVycyBhcmUgKmFmdGVyKiB0aGUgbGFzdCBpdGVtOiBlLmcuCisgICAgKihzb3VyY2VFbmQgLSAxKSBpcyB0aGUgbGFzdCBpdGVtLgorCisgICAgVGhlIHJldHVybiByZXN1bHQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGNvbnZlcnNpb24gd2FzIHN1Y2Nlc3NmdWwsCisgICAgYW5kIGlmIG5vdCwgd2hldGhlciB0aGUgcHJvYmxlbSB3YXMgaW4gdGhlIHNvdXJjZSBvciB0YXJnZXQgYnVmZmVycy4KKyAgICAoT25seSB0aGUgZmlyc3QgZW5jb3VudGVyZWQgcHJvYmxlbSBpcyBpbmRpY2F0ZWQuKQorCisgICAgQWZ0ZXIgdGhlIGNvbnZlcnNpb24sICpzb3VyY2VTdGFydCBhbmQgKnRhcmdldFN0YXJ0IGFyZSBib3RoCisgICAgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgZW5kIG9mIGxhc3QgdGV4dCBzdWNjZXNzZnVsbHkgY29udmVydGVkIGluCisgICAgdGhlIHJlc3BlY3RpdmUgYnVmZmVycy4KKworICAgIElucHV0IHBhcmFtZXRlcnM6CisgICAgICAgIHNvdXJjZVN0YXJ0IC0gcG9pbnRlciB0byBhIHBvaW50ZXIgdG8gdGhlIHNvdXJjZSBidWZmZXIuCisgICAgICAgICAgICAgICAgVGhlIGNvbnRlbnRzIG9mIHRoaXMgYXJlIG1vZGlmaWVkIG9uIHJldHVybiBzbyB0aGF0CisgICAgICAgICAgICAgICAgaXQgcG9pbnRzIGF0IHRoZSBuZXh0IHRoaW5nIHRvIGJlIGNvbnZlcnRlZC4KKyAgICAgICAgdGFyZ2V0U3RhcnQgLSBzaW1pbGFybHksIHBvaW50ZXIgdG8gcG9pbnRlciB0byB0aGUgdGFyZ2V0IGJ1ZmZlci4KKyAgICAgICAgc291cmNlRW5kLCB0YXJnZXRFbmQgLSByZXNwZWN0aXZlbHkgcG9pbnRlcnMgdG8gdGhlIGVuZHMgb2YgdGhlCisgICAgICAgICAgICAgICAgdHdvIGJ1ZmZlcnMsIGZvciBvdmVyZmxvdyBjaGVja2luZyBvbmx5LgorCisgICAgVGhlc2UgY29udmVyc2lvbiBmdW5jdGlvbnMgdGFrZSBhIENvbnZlcnNpb25GbGFncyBhcmd1bWVudC4gV2hlbiB0aGlzCisgICAgZmxhZyBpcyBzZXQgdG8gc3RyaWN0LCBib3RoIGlycmVndWxhciBzZXF1ZW5jZXMgYW5kIGlzb2xhdGVkIHN1cnJvZ2F0ZXMKKyAgICB3aWxsIGNhdXNlIGFuIGVycm9yLiAgV2hlbiB0aGUgZmxhZyBpcyBzZXQgdG8gbGVuaWVudCwgYm90aCBpcnJlZ3VsYXIKKyAgICBzZXF1ZW5jZXMgYW5kIGlzb2xhdGVkIHN1cnJvZ2F0ZXMgYXJlIGNvbnZlcnRlZC4KKworICAgIFdoZXRoZXIgdGhlIGZsYWcgaXMgc3RyaWN0IG9yIGxlbmllbnQsIGFsbCBpbGxlZ2FsIHNlcXVlbmNlcyB3aWxsIGNhdXNlCisgICAgYW4gZXJyb3IgcmV0dXJuLiBUaGlzIGluY2x1ZGVzIHNlcXVlbmNlcyBzdWNoIGFzOiA8RjQgOTAgODAgODA+LCA8QzAgODA+LAorICAgIG9yIDxBMD4gaW4gVVRGLTgsIGFuZCB2YWx1ZXMgYWJvdmUgMHgxMEZGRkYgaW4gVVRGLTMyLiBDb25mb3JtYW50IGNvZGUKKyAgICBtdXN0IGNoZWNrIGZvciBpbGxlZ2FsIHNlcXVlbmNlcy4KKworICAgIFdoZW4gdGhlIGZsYWcgaXMgc2V0IHRvIGxlbmllbnQsIGNoYXJhY3RlcnMgb3ZlciAweDEwRkZGRiBhcmUgY29udmVydGVkCisgICAgdG8gdGhlIHJlcGxhY2VtZW50IGNoYXJhY3Rlcjsgb3RoZXJ3aXNlICh3aGVuIHRoZSBmbGFnIGlzIHNldCB0byBzdHJpY3QpCisgICAgdGhleSBjb25zdGl0dXRlIGFuIGVycm9yLgorCisgICAgT3V0cHV0IHBhcmFtZXRlcnM6CisgICAgICAgIFRoZSB2YWx1ZSAic291cmNlSWxsZWdhbCIgaXMgcmV0dXJuZWQgZnJvbSBzb21lIHJvdXRpbmVzIGlmIHRoZSBpbnB1dAorICAgICAgICBzZXF1ZW5jZSBpcyBtYWxmb3JtZWQuICBXaGVuICJzb3VyY2VJbGxlZ2FsIiBpcyByZXR1cm5lZCwgdGhlIHNvdXJjZQorICAgICAgICB2YWx1ZSB3aWxsIHBvaW50IHRvIHRoZSBpbGxlZ2FsIHZhbHVlIHRoYXQgY2F1c2VkIHRoZSBwcm9ibGVtLiBFLmcuLAorICAgICAgICBpbiBVVEYtOCB3aGVuIGEgc2VxdWVuY2UgaXMgbWFsZm9ybWVkLCBpdCBwb2ludHMgdG8gdGhlIHN0YXJ0IG9mIHRoZQorICAgICAgICBtYWxmb3JtZWQgc2VxdWVuY2UuCisKKyAgICBBdXRob3I6IE1hcmsgRS4gRGF2aXMsIDE5OTQuCisgICAgUmV2IEhpc3Rvcnk6IFJpY2sgTWNHb3dhbiwgZml4ZXMgJiB1cGRhdGVzIE1heSAyMDAxLgorICAgICAgICAgRml4ZXMgJiB1cGRhdGVzLCBTZXB0IDIwMDEuCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9DT05WRVJUVVRGX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0NPTlZFUlRVVEZfSAorCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKy8vIFdyYXAgZXZlcnl0aGluZyBpbiBuYW1lc3BhY2UgbGx2bSBzbyB0aGF0IHByb2dyYW1zIGNhbiBsaW5rIHdpdGggbGx2bSBhbmQKKy8vIHRoZWlyIG93biB2ZXJzaW9uIG9mIHRoZSB1bmljb2RlIGxpYnJhcmllcy4KKworbmFtZXNwYWNlIGxsdm0geworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBUaGUgZm9sbG93aW5nIDQgZGVmaW5pdGlvbnMgYXJlIGNvbXBpbGVyLXNwZWNpZmljLgorICAgIFRoZSBDIHN0YW5kYXJkIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IHdjaGFyX3QgaGFzIGF0IGxlYXN0CisgICAgMTYgYml0cywgc28gd2NoYXJfdCBpcyBubyBsZXNzIHBvcnRhYmxlIHRoYW4gdW5zaWduZWQgc2hvcnQhCisgICAgQWxsIHNob3VsZCBiZSB1bnNpZ25lZCB2YWx1ZXMgdG8gYXZvaWQgc2lnbiBleHRlbnNpb24gZHVyaW5nCisgICAgYml0IG1hc2sgJiBzaGlmdCBvcGVyYXRpb25zLgorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3R5cGVkZWYgdW5zaWduZWQgaW50ICAgIFVURjMyOyAgLyogYXQgbGVhc3QgMzIgYml0cyAqLwordHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgVVRGMTY7ICAvKiBhdCBsZWFzdCAxNiBiaXRzICovCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICBVVEY4OyAgIC8qIHR5cGljYWxseSA4IGJpdHMgKi8KK3R5cGVkZWYgdW5zaWduZWQgY2hhciAgIEJvb2xlYW47IC8qIDAgb3IgMSAqLworCisvKiBTb21lIGZ1bmRhbWVudGFsIGNvbnN0YW50cyAqLworI2RlZmluZSBVTklfUkVQTEFDRU1FTlRfQ0hBUiAoVVRGMzIpMHgwMDAwRkZGRAorI2RlZmluZSBVTklfTUFYX0JNUCAoVVRGMzIpMHgwMDAwRkZGRgorI2RlZmluZSBVTklfTUFYX1VURjE2IChVVEYzMikweDAwMTBGRkZGCisjZGVmaW5lIFVOSV9NQVhfVVRGMzIgKFVURjMyKTB4N0ZGRkZGRkYKKyNkZWZpbmUgVU5JX01BWF9MRUdBTF9VVEYzMiAoVVRGMzIpMHgwMDEwRkZGRgorCisjZGVmaW5lIFVOSV9NQVhfVVRGOF9CWVRFU19QRVJfQ09ERV9QT0lOVCA0CisKKyNkZWZpbmUgVU5JX1VURjE2X0JZVEVfT1JERVJfTUFSS19OQVRJVkUgIDB4RkVGRgorI2RlZmluZSBVTklfVVRGMTZfQllURV9PUkRFUl9NQVJLX1NXQVBQRUQgMHhGRkZFCisKK3R5cGVkZWYgZW51bSB7CisgIGNvbnZlcnNpb25PSywgICAgICAgICAgIC8qIGNvbnZlcnNpb24gc3VjY2Vzc2Z1bCAqLworICBzb3VyY2VFeGhhdXN0ZWQsICAgICAgICAvKiBwYXJ0aWFsIGNoYXJhY3RlciBpbiBzb3VyY2UsIGJ1dCBoaXQgZW5kICovCisgIHRhcmdldEV4aGF1c3RlZCwgICAgICAgIC8qIGluc3VmZi4gcm9vbSBpbiB0YXJnZXQgZm9yIGNvbnZlcnNpb24gKi8KKyAgc291cmNlSWxsZWdhbCAgICAgICAgICAgLyogc291cmNlIHNlcXVlbmNlIGlzIGlsbGVnYWwvbWFsZm9ybWVkICovCit9IENvbnZlcnNpb25SZXN1bHQ7CisKK3R5cGVkZWYgZW51bSB7CisgIHN0cmljdENvbnZlcnNpb24gPSAwLAorICBsZW5pZW50Q29udmVyc2lvbgorfSBDb252ZXJzaW9uRmxhZ3M7CisKK0NvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjh0b1VURjE2ICgKKyAgY29uc3QgVVRGOCoqIHNvdXJjZVN0YXJ0LCBjb25zdCBVVEY4KiBzb3VyY2VFbmQsCisgIFVURjE2KiogdGFyZ2V0U3RhcnQsIFVURjE2KiB0YXJnZXRFbmQsIENvbnZlcnNpb25GbGFncyBmbGFncyk7CisKKy8qKgorICogQ29udmVydCBhIHBhcnRpYWwgVVRGOCBzZXF1ZW5jZSB0byBVVEYzMi4gIElmIHRoZSBzZXF1ZW5jZSBlbmRzIGluIGFuCisgKiBpbmNvbXBsZXRlIGNvZGUgdW5pdCBzZXF1ZW5jZSwgcmV0dXJucyBcYyBzb3VyY2VFeGhhdXN0ZWQuCisgKi8KK0NvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjh0b1VURjMyUGFydGlhbCgKKyAgY29uc3QgVVRGOCoqIHNvdXJjZVN0YXJ0LCBjb25zdCBVVEY4KiBzb3VyY2VFbmQsCisgIFVURjMyKiogdGFyZ2V0U3RhcnQsIFVURjMyKiB0YXJnZXRFbmQsIENvbnZlcnNpb25GbGFncyBmbGFncyk7CisKKy8qKgorICogQ29udmVydCBhIHBhcnRpYWwgVVRGOCBzZXF1ZW5jZSB0byBVVEYzMi4gIElmIHRoZSBzZXF1ZW5jZSBlbmRzIGluIGFuCisgKiBpbmNvbXBsZXRlIGNvZGUgdW5pdCBzZXF1ZW5jZSwgcmV0dXJucyBcYyBzb3VyY2VJbGxlZ2FsLgorICovCitDb252ZXJzaW9uUmVzdWx0IENvbnZlcnRVVEY4dG9VVEYzMigKKyAgY29uc3QgVVRGOCoqIHNvdXJjZVN0YXJ0LCBjb25zdCBVVEY4KiBzb3VyY2VFbmQsCisgIFVURjMyKiogdGFyZ2V0U3RhcnQsIFVURjMyKiB0YXJnZXRFbmQsIENvbnZlcnNpb25GbGFncyBmbGFncyk7CisKK0NvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjE2dG9VVEY4ICgKKyAgY29uc3QgVVRGMTYqKiBzb3VyY2VTdGFydCwgY29uc3QgVVRGMTYqIHNvdXJjZUVuZCwKKyAgVVRGOCoqIHRhcmdldFN0YXJ0LCBVVEY4KiB0YXJnZXRFbmQsIENvbnZlcnNpb25GbGFncyBmbGFncyk7CisKK0NvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjMydG9VVEY4ICgKKyAgY29uc3QgVVRGMzIqKiBzb3VyY2VTdGFydCwgY29uc3QgVVRGMzIqIHNvdXJjZUVuZCwKKyAgVVRGOCoqIHRhcmdldFN0YXJ0LCBVVEY4KiB0YXJnZXRFbmQsIENvbnZlcnNpb25GbGFncyBmbGFncyk7CisKK0NvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjE2dG9VVEYzMiAoCisgIGNvbnN0IFVURjE2Kiogc291cmNlU3RhcnQsIGNvbnN0IFVURjE2KiBzb3VyY2VFbmQsCisgIFVURjMyKiogdGFyZ2V0U3RhcnQsIFVURjMyKiB0YXJnZXRFbmQsIENvbnZlcnNpb25GbGFncyBmbGFncyk7CisKK0NvbnZlcnNpb25SZXN1bHQgQ29udmVydFVURjMydG9VVEYxNiAoCisgIGNvbnN0IFVURjMyKiogc291cmNlU3RhcnQsIGNvbnN0IFVURjMyKiBzb3VyY2VFbmQsCisgIFVURjE2KiogdGFyZ2V0U3RhcnQsIFVURjE2KiB0YXJnZXRFbmQsIENvbnZlcnNpb25GbGFncyBmbGFncyk7CisKK0Jvb2xlYW4gaXNMZWdhbFVURjhTZXF1ZW5jZShjb25zdCBVVEY4ICpzb3VyY2UsIGNvbnN0IFVURjggKnNvdXJjZUVuZCk7CisKK0Jvb2xlYW4gaXNMZWdhbFVURjhTdHJpbmcoY29uc3QgVVRGOCAqKnNvdXJjZSwgY29uc3QgVVRGOCAqc291cmNlRW5kKTsKKwordW5zaWduZWQgZ2V0TnVtQnl0ZXNGb3JVVEY4KFVURjggZmlyc3RCeXRlKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBCZWxvdyBhcmUgTExWTS1zcGVjaWZpYyB3cmFwcGVycyBvZiB0aGUgZnVuY3Rpb25zIGFib3ZlLiAqLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgU21hbGxWZWN0b3JJbXBsOworY2xhc3MgU3RyaW5nUmVmOworCisvKioKKyAqIENvbnZlcnQgYW4gVVRGOCBTdHJpbmdSZWYgdG8gVVRGOCwgVVRGMTYsIG9yIFVURjMyIGRlcGVuZGluZyBvbgorICogV2lkZUNoYXJXaWR0aC4gVGhlIGNvbnZlcnRlZCBkYXRhIGlzIHdyaXR0ZW4gdG8gUmVzdWx0UHRyLCB3aGljaCBuZWVkcyB0bworICogcG9pbnQgdG8gYXQgbGVhc3QgV2lkZUNoYXJXaWR0aCAqIChTb3VyY2UuU2l6ZSgpICsgMSkgYnl0ZXMuIE9uIHN1Y2Nlc3MsCisgKiBSZXN1bHRQdHIgd2lsbCBwb2ludCBvbmUgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgY29waWVkIHN0cmluZy4gT24gZmFpbHVyZSwKKyAqIFJlc3VsdFB0ciB3aWxsIG5vdCBiZSBjaGFuZ2VkLCBhbmQgRXJyb3JQdHIgd2lsbCBiZSBzZXQgdG8gdGhlIGxvY2F0aW9uIG9mCisgKiB0aGUgZmlyc3QgY2hhcmFjdGVyIHdoaWNoIGNvdWxkIG5vdCBiZSBjb252ZXJ0ZWQuCisgKiBccmV0dXJuIHRydWUgb24gc3VjY2Vzcy4KKyAqLworYm9vbCBDb252ZXJ0VVRGOHRvV2lkZSh1bnNpZ25lZCBXaWRlQ2hhcldpZHRoLCBsbHZtOjpTdHJpbmdSZWYgU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICBjaGFyIComUmVzdWx0UHRyLCBjb25zdCBVVEY4IComRXJyb3JQdHIpOworCisvKioKKyogQ29udmVydHMgYSBVVEYtOCBTdHJpbmdSZWYgdG8gYSBzdGQ6OndzdHJpbmcuCisqIFxyZXR1cm4gdHJ1ZSBvbiBzdWNjZXNzLgorKi8KK2Jvb2wgQ29udmVydFVURjh0b1dpZGUobGx2bTo6U3RyaW5nUmVmIFNvdXJjZSwgc3RkOjp3c3RyaW5nICZSZXN1bHQpOworCisvKioKKyogQ29udmVydHMgYSBVVEYtOCBDLXN0cmluZyB0byBhIHN0ZDo6d3N0cmluZy4KKyogXHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MuCisqLworYm9vbCBDb252ZXJ0VVRGOHRvV2lkZShjb25zdCBjaGFyICpTb3VyY2UsIHN0ZDo6d3N0cmluZyAmUmVzdWx0KTsKKworLyoqCisqIENvbnZlcnRzIGEgc3RkOjp3c3RyaW5nIHRvIGEgVVRGLTggZW5jb2RlZCBzdGQ6OnN0cmluZy4KKyogXHJldHVybiB0cnVlIG9uIHN1Y2Nlc3MuCisqLworYm9vbCBjb252ZXJ0V2lkZVRvVVRGOChjb25zdCBzdGQ6OndzdHJpbmcgJlNvdXJjZSwgc3RkOjpzdHJpbmcgJlJlc3VsdCk7CisKKworLyoqCisgKiBDb252ZXJ0IGFuIFVuaWNvZGUgY29kZSBwb2ludCB0byBVVEY4IHNlcXVlbmNlLgorICoKKyAqIFxwYXJhbSBTb3VyY2UgYSBVbmljb2RlIGNvZGUgcG9pbnQuCisgKiBccGFyYW0gW2luLG91dF0gUmVzdWx0UHRyIHBvaW50ZXIgdG8gdGhlIG91dHB1dCBidWZmZXIsIG5lZWRzIHRvIGJlIGF0IGxlYXN0CisgKiBcYyBVTklfTUFYX1VURjhfQllURVNfUEVSX0NPREVfUE9JTlQgYnl0ZXMuICBPbiBzdWNjZXNzIFxjIFJlc3VsdFB0ciBpcworICogdXBkYXRlZCBvbmUgcGFzdCBlbmQgb2YgdGhlIGNvbnZlcnRlZCBzZXF1ZW5jZS4KKyAqCisgKiBccmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCisgKi8KK2Jvb2wgQ29udmVydENvZGVQb2ludFRvVVRGOCh1bnNpZ25lZCBTb3VyY2UsIGNoYXIgKiZSZXN1bHRQdHIpOworCisvKioKKyAqIENvbnZlcnQgdGhlIGZpcnN0IFVURjggc2VxdWVuY2UgaW4gdGhlIGdpdmVuIHNvdXJjZSBidWZmZXIgdG8gYSBVVEYzMgorICogY29kZSBwb2ludC4KKyAqCisgKiBccGFyYW0gW2luLG91dF0gc291cmNlIEEgcG9pbnRlciB0byB0aGUgc291cmNlIGJ1ZmZlci4gSWYgdGhlIGNvbnZlcnNpb24KKyAqIHN1Y2NlZWRzLCB0aGlzIHBvaW50ZXIgd2lsbCBiZSB1cGRhdGVkIHRvIHBvaW50IHRvIHRoZSBieXRlIGp1c3QgcGFzdCB0aGUKKyAqIGVuZCBvZiB0aGUgY29udmVydGVkIHNlcXVlbmNlLgorICogXHBhcmFtIHNvdXJjZUVuZCBBIHBvaW50ZXIganVzdCBwYXN0IHRoZSBlbmQgb2YgdGhlIHNvdXJjZSBidWZmZXIuCisgKiBccGFyYW0gW291dF0gdGFyZ2V0IFRoZSBjb252ZXJ0ZWQgY29kZQorICogXHBhcmFtIGZsYWdzIFdoZXRoZXIgdGhlIGNvbnZlcnNpb24gaXMgc3RyaWN0IG9yIGxlbmllbnQuCisgKgorICogXHJldHVybnMgY29udmVyc2lvbk9LIG9uIHN1Y2Nlc3MKKyAqCisgKiBcc2EgQ29udmVydFVURjh0b1VURjMyCisgKi8KK2lubGluZSBDb252ZXJzaW9uUmVzdWx0IGNvbnZlcnRVVEY4U2VxdWVuY2UoY29uc3QgVVRGOCAqKnNvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVVRGOCAqc291cmNlRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVVEYzMiAqdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb252ZXJzaW9uRmxhZ3MgZmxhZ3MpIHsKKyAgaWYgKCpzb3VyY2UgPT0gc291cmNlRW5kKQorICAgIHJldHVybiBzb3VyY2VFeGhhdXN0ZWQ7CisgIHVuc2lnbmVkIHNpemUgPSBnZXROdW1CeXRlc0ZvclVURjgoKipzb3VyY2UpOworICBpZiAoKHB0cmRpZmZfdClzaXplID4gc291cmNlRW5kIC0gKnNvdXJjZSkKKyAgICByZXR1cm4gc291cmNlRXhoYXVzdGVkOworICByZXR1cm4gQ29udmVydFVURjh0b1VURjMyKHNvdXJjZSwgKnNvdXJjZSArIHNpemUsICZ0YXJnZXQsIHRhcmdldCArIDEsIGZsYWdzKTsKK30KKworLyoqCisgKiBSZXR1cm5zIHRydWUgaWYgYSBibG9iIG9mIHRleHQgc3RhcnRzIHdpdGggYSBVVEYtMTYgYmlnIG9yIGxpdHRsZSBlbmRpYW4gYnl0ZQorICogb3JkZXIgbWFyay4KKyAqLworYm9vbCBoYXNVVEYxNkJ5dGVPcmRlck1hcmsoQXJyYXlSZWY8Y2hhcj4gU3JjQnl0ZXMpOworCisvKioKKyAqIENvbnZlcnRzIGEgc3RyZWFtIG9mIHJhdyBieXRlcyBhc3N1bWVkIHRvIGJlIFVURjE2IGludG8gYSBVVEY4IHN0ZDo6c3RyaW5nLgorICoKKyAqIFxwYXJhbSBbaW5dIFNyY0J5dGVzIEEgYnVmZmVyIG9mIHdoYXQgaXMgYXNzdW1lZCB0byBiZSBVVEYtMTYgZW5jb2RlZCB0ZXh0LgorICogXHBhcmFtIFtvdXRdIE91dCBDb252ZXJ0ZWQgVVRGLTggaXMgc3RvcmVkIGhlcmUgb24gc3VjY2Vzcy4KKyAqIFxyZXR1cm5zIHRydWUgb24gc3VjY2VzcworICovCitib29sIGNvbnZlcnRVVEYxNlRvVVRGOFN0cmluZyhBcnJheVJlZjxjaGFyPiBTcmNCeXRlcywgc3RkOjpzdHJpbmcgJk91dCk7CisKKy8qKgorKiBDb252ZXJ0cyBhIFVURjE2IHN0cmluZyBpbnRvIGEgVVRGOCBzdGQ6OnN0cmluZy4KKyoKKyogXHBhcmFtIFtpbl0gU3JjIEEgYnVmZmVyIG9mIFVURi0xNiBlbmNvZGVkIHRleHQuCisqIFxwYXJhbSBbb3V0XSBPdXQgQ29udmVydGVkIFVURi04IGlzIHN0b3JlZCBoZXJlIG9uIHN1Y2Nlc3MuCisqIFxyZXR1cm5zIHRydWUgb24gc3VjY2VzcworKi8KK2Jvb2wgY29udmVydFVURjE2VG9VVEY4U3RyaW5nKEFycmF5UmVmPFVURjE2PiBTcmMsIHN0ZDo6c3RyaW5nICZPdXQpOworCisvKioKKyAqIENvbnZlcnRzIGEgVVRGLTggc3RyaW5nIGludG8gYSBVVEYtMTYgc3RyaW5nIHdpdGggbmF0aXZlIGVuZGlhbm5lc3MuCisgKgorICogXHJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzCisgKi8KK2Jvb2wgY29udmVydFVURjhUb1VURjE2U3RyaW5nKFN0cmluZ1JlZiBTcmNVVEY4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPFVURjE2PiAmRHN0VVRGMTYpOworCit9IC8qIGVuZCBuYW1lc3BhY2UgbGx2bSAqLworCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DcmFzaFJlY292ZXJ5Q29udGV4dC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0NyYXNoUmVjb3ZlcnlDb250ZXh0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAyNjIzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9DcmFzaFJlY292ZXJ5Q29udGV4dC5oCkBAIC0wLDAgKzEsMjU4IEBACisvLz09PS0tLSBDcmFzaFJlY292ZXJ5Q29udGV4dC5oIC0gQ3Jhc2ggUmVjb3ZlcnkgLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9DUkFTSFJFQ09WRVJZQ09OVEVYVF9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9DUkFTSFJFQ09WRVJZQ09OVEVYVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgQ3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwOworCisvLy8gQ3Jhc2ggcmVjb3ZlcnkgaGVscGVyIG9iamVjdC4KKy8vLworLy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBzdXBwb3J0IGZvciBydW5uaW5nIG9wZXJhdGlvbnMgaW4gYSBzYWZlIGNvbnRleHQgc28KKy8vLyB0aGF0IGNyYXNoZXMgKG1lbW9yeSBlcnJvcnMsIHN0YWNrIG92ZXJmbG93LCBhc3NlcnRpb24gdmlvbGF0aW9ucykgY2FuIGJlCisvLy8gZGV0ZWN0ZWQgYW5kIGNvbnRyb2wgcmVzdG9yZWQgdG8gdGhlIGNyYXNoaW5nIHRocmVhZC4gQ3Jhc2ggZGV0ZWN0aW9uIGlzCisvLy8gcHVyZWx5ICJiZXN0IGVmZm9ydCIsIHRoZSBleGFjdCBzZXQgb2YgZmFpbHVyZXMgd2hpY2ggY2FuIGJlIHJlY292ZXJlZCBmcm9tCisvLy8gaXMgcGxhdGZvcm0gZGVwZW5kZW50LgorLy8vCisvLy8gQ2xpZW50cyBtYWtlIHVzZSBvZiB0aGlzIGNvZGUgYnkgZmlyc3QgY2FsbGluZworLy8vIENyYXNoUmVjb3ZlcnlDb250ZXh0OjpFbmFibGUoKSwgYW5kIHRoZW4gZXhlY3V0aW5nIHVuc2FmZSBvcGVyYXRpb25zIHZpYSBhCisvLy8gQ3Jhc2hSZWNvdmVyeUNvbnRleHQgb2JqZWN0LiBGb3IgZXhhbXBsZToKKy8vLworLy8vIFxjb2RlCisvLy8gICAgdm9pZCBhY3R1YWxfd29yayh2b2lkICopOworLy8vCisvLy8gICAgdm9pZCBmb28oKSB7CisvLy8gICAgICBDcmFzaFJlY292ZXJ5Q29udGV4dCBDUkM7CisvLy8KKy8vLyAgICAgIGlmICghQ1JDLlJ1blNhZmVseShhY3R1YWxfd29yaywgMCkpIHsKKy8vLyAgICAgICAgIC4uLiBhIGNyYXNoIHdhcyBkZXRlY3RlZCwgcmVwb3J0IGVycm9yIHRvIHVzZXIgLi4uCisvLy8gICAgICB9CisvLy8KKy8vLyAgICAgIC4uLiBubyBjcmFzaCB3YXMgZGV0ZWN0ZWQgLi4uCisvLy8gICAgfQorLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBUbyBhc3Npc3QgcmVjb3ZlcnkgdGhlIGNsYXNzIGFsbG93cyBzcGVjaWZ5aW5nIHNldCBvZiBhY3Rpb25zIHRoYXQgd2lsbCBiZQorLy8vIGV4ZWN1dGVkIGluIGFueSBjYXNlLCB3aGV0aGVyIGNyYXNoIG9jY3VycyBvciBub3QuIFRoZXNlIGFjdGlvbnMgbWF5IGJlIHVzZWQKKy8vLyB0byByZWNsYWltIHJlc291cmNlcyBpbiB0aGUgY2FzZSBvZiBjcmFzaC4KK2NsYXNzIENyYXNoUmVjb3ZlcnlDb250ZXh0IHsKKyAgdm9pZCAqSW1wbDsKKyAgQ3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwICpoZWFkOworCitwdWJsaWM6CisgIENyYXNoUmVjb3ZlcnlDb250ZXh0KCkgOiBJbXBsKG51bGxwdHIpLCBoZWFkKG51bGxwdHIpIHt9CisgIH5DcmFzaFJlY292ZXJ5Q29udGV4dCgpOworCisgIC8vLyBSZWdpc3RlciBjbGVhbnVwIGhhbmRsZXIsIHdoaWNoIGlzIHVzZWQgd2hlbiB0aGUgcmVjb3ZlcnkgY29udGV4dCBpcworICAvLy8gZmluaXNoZWQuCisgIC8vLyBUaGUgcmVjb3ZlcnkgY29udGV4dCBvd25zIHRoZSB0aGUgaGFuZGxlci4KKyAgdm9pZCByZWdpc3RlckNsZWFudXAoQ3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwICpjbGVhbnVwKTsKKworICB2b2lkIHVucmVnaXN0ZXJDbGVhbnVwKENyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cCAqY2xlYW51cCk7CisKKyAgLy8vIEVuYWJsZSBjcmFzaCByZWNvdmVyeS4KKyAgc3RhdGljIHZvaWQgRW5hYmxlKCk7CisKKyAgLy8vIERpc2FibGUgY3Jhc2ggcmVjb3ZlcnkuCisgIHN0YXRpYyB2b2lkIERpc2FibGUoKTsKKworICAvLy8gUmV0dXJuIHRoZSBhY3RpdmUgY29udGV4dCwgaWYgdGhlIGNvZGUgaXMgY3VycmVudGx5IGV4ZWN1dGluZyBpbiBhCisgIC8vLyB0aHJlYWQgd2hpY2ggaXMgaW4gYSBwcm90ZWN0ZWQgY29udGV4dC4KKyAgc3RhdGljIENyYXNoUmVjb3ZlcnlDb250ZXh0ICpHZXRDdXJyZW50KCk7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBjdXJyZW50IHRocmVhZCBpcyByZWNvdmVyaW5nIGZyb20gYSBjcmFzaC4KKyAgc3RhdGljIGJvb2wgaXNSZWNvdmVyaW5nRnJvbUNyYXNoKCk7CisKKyAgLy8vIEV4ZWN1dGUgdGhlIHByb3ZpZGVkIGNhbGxiYWNrIGZ1bmN0aW9uICh3aXRoIHRoZSBnaXZlbiBhcmd1bWVudHMpIGluCisgIC8vLyBhIHByb3RlY3RlZCBjb250ZXh0LgorICAvLy8KKyAgLy8vIFxyZXR1cm4gVHJ1ZSBpZiB0aGUgZnVuY3Rpb24gY29tcGxldGVkIHN1Y2Nlc3NmdWxseSwgYW5kIGZhbHNlIGlmIHRoZQorICAvLy8gZnVuY3Rpb24gY3Jhc2hlZCAob3IgSGFuZGxlQ3Jhc2ggd2FzIGNhbGxlZCBleHBsaWNpdGx5KS4gQ2xpZW50cyBzaG91bGQKKyAgLy8vIG1ha2UgYXMgbGl0dGxlIGFzc3VtcHRpb25zIGFzIHBvc3NpYmxlIGFib3V0IHRoZSBwcm9ncmFtIHN0YXRlIHdoZW4KKyAgLy8vIFJ1blNhZmVseSBoYXMgcmV0dXJuZWQgZmFsc2UuCisgIGJvb2wgUnVuU2FmZWx5KGZ1bmN0aW9uX3JlZjx2b2lkKCk+IEZuKTsKKyAgYm9vbCBSdW5TYWZlbHkodm9pZCAoKkZuKSh2b2lkKiksIHZvaWQgKlVzZXJEYXRhKSB7CisgICAgcmV0dXJuIFJ1blNhZmVseShbJl0oKSB7IEZuKFVzZXJEYXRhKTsgfSk7CisgIH0KKworICAvLy8gRXhlY3V0ZSB0aGUgcHJvdmlkZSBjYWxsYmFjayBmdW5jdGlvbiAod2l0aCB0aGUgZ2l2ZW4gYXJndW1lbnRzKSBpbgorICAvLy8gYSBwcm90ZWN0ZWQgY29udGV4dCB3aGljaCBpcyBydW4gaW4gYW5vdGhlciB0aHJlYWQgKG9wdGlvbmFsbHkgd2l0aCBhCisgIC8vLyByZXF1ZXN0ZWQgc3RhY2sgc2l6ZSkuCisgIC8vLworICAvLy8gU2VlIFJ1blNhZmVseSgpIGFuZCBsbHZtX2V4ZWN1dGVfb25fdGhyZWFkKCkuCisgIC8vLworICAvLy8gT24gRGFyd2luLCBpZiBQUklPX0RBUldJTl9CRyBpcyBzZXQgb24gdGhlIGNhbGxpbmcgdGhyZWFkLCBpdCB3aWxsIGJlCisgIC8vLyBwcm9wYWdhdGVkIHRvIHRoZSBuZXcgdGhyZWFkIGFzIHdlbGwuCisgIGJvb2wgUnVuU2FmZWx5T25UaHJlYWQoZnVuY3Rpb25fcmVmPHZvaWQoKT4sIHVuc2lnbmVkIFJlcXVlc3RlZFN0YWNrU2l6ZSA9IDApOworICBib29sIFJ1blNhZmVseU9uVGhyZWFkKHZvaWQgKCpGbikodm9pZCopLCB2b2lkICpVc2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZXF1ZXN0ZWRTdGFja1NpemUgPSAwKSB7CisgICAgcmV0dXJuIFJ1blNhZmVseU9uVGhyZWFkKFsmXSgpIHsgRm4oVXNlckRhdGEpOyB9LCBSZXF1ZXN0ZWRTdGFja1NpemUpOworICB9CisKKyAgLy8vIEV4cGxpY2l0bHkgdHJpZ2dlciBhIGNyYXNoIHJlY292ZXJ5IGluIHRoZSBjdXJyZW50IHByb2Nlc3MsIGFuZAorICAvLy8gcmV0dXJuIGZhaWx1cmUgZnJvbSBSdW5TYWZlbHkoKS4gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCByZXR1cm4uCisgIHZvaWQgSGFuZGxlQ3Jhc2goKTsKK307CisKKy8vLyBBYnN0cmFjdCBiYXNlIGNsYXNzIG9mIGNsZWFudXAgaGFuZGxlcnMuCisvLy8KKy8vLyBEZXJpdmVkIGNsYXNzZXMgb3ZlcnJpZGUgbWV0aG9kIHJlY292ZXJSZXNvdXJjZXMsIHdoaWNoIG1ha2VzIGFjdHVhbCB3b3JrIG9uCisvLy8gcmVzb3VyY2UgcmVjb3ZlcnkuCisvLy8KKy8vLyBDbGVhbnVwIGhhbmRsZXJzIGFyZSBzdG9yZWQgaW4gYSBkb3VibGUgbGlzdCwgd2hpY2ggaXMgb3duZWQgYW5kIG1hbmFnZWQgYnkKKy8vLyBhIGNyYXNoIHJlY292ZXJ5IGNvbnRleHQuCitjbGFzcyBDcmFzaFJlY292ZXJ5Q29udGV4dENsZWFudXAgeworcHJvdGVjdGVkOgorICBDcmFzaFJlY292ZXJ5Q29udGV4dCAqY29udGV4dDsKKyAgQ3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwKENyYXNoUmVjb3ZlcnlDb250ZXh0ICpjb250ZXh0KQorICAgICAgOiBjb250ZXh0KGNvbnRleHQpLCBjbGVhbnVwRmlyZWQoZmFsc2UpIHt9CisKK3B1YmxpYzoKKyAgYm9vbCBjbGVhbnVwRmlyZWQ7CisKKyAgdmlydHVhbCB+Q3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwKCk7CisgIHZpcnR1YWwgdm9pZCByZWNvdmVyUmVzb3VyY2VzKCkgPSAwOworCisgIENyYXNoUmVjb3ZlcnlDb250ZXh0ICpnZXRDb250ZXh0KCkgY29uc3QgeworICAgIHJldHVybiBjb250ZXh0OworICB9CisKK3ByaXZhdGU6CisgIGZyaWVuZCBjbGFzcyBDcmFzaFJlY292ZXJ5Q29udGV4dDsKKyAgQ3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwICpwcmV2LCAqbmV4dDsKK307CisKKy8vLyBCYXNlIGNsYXNzIG9mIGNsZWFudXAgaGFuZGxlciB0aGF0IGNvbnRyb2xzIHJlY292ZXJ5IG9mIHJlc291cmNlcyBvZiB0aGUKKy8vLyBnaXZlbiB0eXBlLgorLy8vCisvLy8gXHRwYXJhbSBEZXJpdmVkIENsYXNzIHRoYXQgdXNlcyB0aGlzIGNsYXNzIGFzIGEgYmFzZS4KKy8vLyBcdHBhcmFtIFQgVHlwZSBvZiBjb250cm9sbGVkIHJlc291cmNlLgorLy8vCisvLy8gVGhpcyBjbGFzcyBzZXJ2ZXMgYXMgYSBiYXNlIGZvciBpdHMgdGVtcGxhdGUgcGFyYW1ldGVyIGFzIGltcGxpZWQgYnkKKy8vLyBDdXJpb3VzbHkgUmVjdXJyaW5nIFRlbXBsYXRlIFBhdHRlcm4uCisvLy8KKy8vLyBUaGlzIGNsYXNzIGZhY3RvcnMgb3V0IGNyZWF0aW9uIG9mIGEgY2xlYW51cCBoYW5kbGVyLiBUaGUgbGF0dGVyIHJlcXVpcmVzCisvLy8ga25vd2xlZGdlIG9mIHRoZSBjdXJyZW50IHJlY292ZXJ5IGNvbnRleHQsIHdoaWNoIGlzIHByb3ZpZGVkIGJ5IHRoaXMgY2xhc3MuCit0ZW1wbGF0ZTx0eXBlbmFtZSBEZXJpdmVkLCB0eXBlbmFtZSBUPgorY2xhc3MgQ3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwQmFzZSA6IHB1YmxpYyBDcmFzaFJlY292ZXJ5Q29udGV4dENsZWFudXAgeworcHJvdGVjdGVkOgorICBUICpyZXNvdXJjZTsKKyAgQ3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwQmFzZShDcmFzaFJlY292ZXJ5Q29udGV4dCAqY29udGV4dCwgVCAqcmVzb3VyY2UpCisgICAgICA6IENyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cChjb250ZXh0KSwgcmVzb3VyY2UocmVzb3VyY2UpIHt9CisKK3B1YmxpYzoKKyAgLy8vIENyZWF0ZXMgY2xlYW51cCBoYW5kbGVyLgorICAvLy8gXHBhcmFtIHggUG9pbnRlciB0byB0aGUgcmVzb3VyY2UgcmVjb3ZlcmVkIGJ5IHRoaXMgaGFuZGxlci4KKyAgLy8vIFxyZXR1cm4gTmV3IGhhbmRsZXIgb3IgbnVsbCBpZiB0aGUgbWV0aG9kIHdhcyBjYWxsZWQgb3V0c2lkZSBhIHJlY292ZXJ5CisgIC8vLyAgICAgICAgIGNvbnRleHQuCisgIHN0YXRpYyBEZXJpdmVkICpjcmVhdGUoVCAqeCkgeworICAgIGlmICh4KSB7CisgICAgICBpZiAoQ3Jhc2hSZWNvdmVyeUNvbnRleHQgKmNvbnRleHQgPSBDcmFzaFJlY292ZXJ5Q29udGV4dDo6R2V0Q3VycmVudCgpKQorICAgICAgICByZXR1cm4gbmV3IERlcml2ZWQoY29udGV4dCwgeCk7CisgICAgfQorICAgIHJldHVybiBudWxscHRyOworICB9Cit9OworCisvLy8gQ2xlYW51cCBoYW5kbGVyIHRoYXQgcmVjbGFpbXMgcmVzb3VyY2UgYnkgY2FsbGluZyBkZXN0cnVjdG9yIG9uIGl0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBDcmFzaFJlY292ZXJ5Q29udGV4dERlc3RydWN0b3JDbGVhbnVwIDogcHVibGljCisgIENyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cEJhc2U8Q3Jhc2hSZWNvdmVyeUNvbnRleHREZXN0cnVjdG9yQ2xlYW51cDxUPiwgVD4geworcHVibGljOgorICBDcmFzaFJlY292ZXJ5Q29udGV4dERlc3RydWN0b3JDbGVhbnVwKENyYXNoUmVjb3ZlcnlDb250ZXh0ICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgKnJlc291cmNlKQorICAgICAgOiBDcmFzaFJlY292ZXJ5Q29udGV4dENsZWFudXBCYXNlPAorICAgICAgICAgICAgQ3Jhc2hSZWNvdmVyeUNvbnRleHREZXN0cnVjdG9yQ2xlYW51cDxUPiwgVD4oY29udGV4dCwgcmVzb3VyY2UpIHt9CisKKyAgdmlydHVhbCB2b2lkIHJlY292ZXJSZXNvdXJjZXMoKSB7CisgICAgdGhpcy0+cmVzb3VyY2UtPn5UKCk7CisgIH0KK307CisKKy8vLyBDbGVhbnVwIGhhbmRsZXIgdGhhdCByZWNsYWltcyByZXNvdXJjZSBieSBjYWxsaW5nICdkZWxldGUnIG9uIGl0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBDcmFzaFJlY292ZXJ5Q29udGV4dERlbGV0ZUNsZWFudXAgOiBwdWJsaWMKKyAgQ3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwQmFzZTxDcmFzaFJlY292ZXJ5Q29udGV4dERlbGV0ZUNsZWFudXA8VD4sIFQ+IHsKK3B1YmxpYzoKKyAgQ3Jhc2hSZWNvdmVyeUNvbnRleHREZWxldGVDbGVhbnVwKENyYXNoUmVjb3ZlcnlDb250ZXh0ICpjb250ZXh0LCBUICpyZXNvdXJjZSkKKyAgICA6IENyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cEJhc2U8CisgICAgICAgIENyYXNoUmVjb3ZlcnlDb250ZXh0RGVsZXRlQ2xlYW51cDxUPiwgVD4oY29udGV4dCwgcmVzb3VyY2UpIHt9CisKKyAgdm9pZCByZWNvdmVyUmVzb3VyY2VzKCkgb3ZlcnJpZGUgeyBkZWxldGUgdGhpcy0+cmVzb3VyY2U7IH0KK307CisKKy8vLyBDbGVhbnVwIGhhbmRsZXIgdGhhdCByZWNsYWltcyByZXNvdXJjZSBieSBjYWxsaW5nIGl0cyBtZXRob2QgJ1JlbGVhc2UnLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBDcmFzaFJlY292ZXJ5Q29udGV4dFJlbGVhc2VSZWZDbGVhbnVwIDogcHVibGljCisgIENyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cEJhc2U8Q3Jhc2hSZWNvdmVyeUNvbnRleHRSZWxlYXNlUmVmQ2xlYW51cDxUPiwgVD4geworcHVibGljOgorICBDcmFzaFJlY292ZXJ5Q29udGV4dFJlbGVhc2VSZWZDbGVhbnVwKENyYXNoUmVjb3ZlcnlDb250ZXh0ICpjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgKnJlc291cmNlKQorICAgIDogQ3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwQmFzZTxDcmFzaFJlY292ZXJ5Q29udGV4dFJlbGVhc2VSZWZDbGVhbnVwPFQ+LAorICAgICAgICAgIFQ+KGNvbnRleHQsIHJlc291cmNlKSB7fQorCisgIHZvaWQgcmVjb3ZlclJlc291cmNlcygpIG92ZXJyaWRlIHsgdGhpcy0+cmVzb3VyY2UtPlJlbGVhc2UoKTsgfQorfTsKKworLy8vIEhlbHBlciBjbGFzcyBmb3IgbWFuYWdpbmcgcmVzb3VyY2UgY2xlYW51cHMuCisvLy8KKy8vLyBcdHBhcmFtIFQgVHlwZSBvZiByZXNvdXJjZSBiZWVuIHJlY2xhaW1lZC4KKy8vLyBcdHBhcmFtIENsZWFudXAgQ2xhc3MgdGhhdCBkZWZpbmVzIGhvdyB0aGUgcmVzb3VyY2UgaXMgcmVjbGFpbWVkLgorLy8vCisvLy8gQ2xpZW50cyBjcmVhdGUgb2JqZWN0cyBvZiB0aGlzIHR5cGUgaW4gdGhlIGNvZGUgZXhlY3V0ZWQgaW4gYSBjcmFzaCByZWNvdmVyeQorLy8vIGNvbnRleHQgdG8gZW5zdXJlIHRoYXQgdGhlIHJlc291cmNlIHdpbGwgYmUgcmVjbGFpbWVkIGV2ZW4gaW4gdGhlIGNhc2Ugb2YKKy8vLyBjcmFzaC4gRm9yIGV4YW1wbGU6CisvLy8KKy8vLyBcY29kZQorLy8vICAgIHZvaWQgYWN0dWFsX3dvcmsodm9pZCAqKSB7CisvLy8gICAgICAuLi4KKy8vLyAgICAgIHN0ZDo6dW5pcXVlX3B0cjxSZXNvdXJjZT4gUihuZXcgUmVzb3VyY2UoKSk7CisvLy8gICAgICBDcmFzaFJlY292ZXJ5Q29udGV4dENsZWFudXBSZWdpc3RyYXIgRChSLmdldCgpKTsKKy8vLyAgICAgIC4uLgorLy8vICAgIH0KKy8vLworLy8vICAgIHZvaWQgZm9vKCkgeworLy8vICAgICAgQ3Jhc2hSZWNvdmVyeUNvbnRleHQgQ1JDOworLy8vCisvLy8gICAgICBpZiAoIUNSQy5SdW5TYWZlbHkoYWN0dWFsX3dvcmssIDApKSB7CisvLy8gICAgICAgICAuLi4gYSBjcmFzaCB3YXMgZGV0ZWN0ZWQsIHJlcG9ydCBlcnJvciB0byB1c2VyIC4uLgorLy8vICAgICAgfQorLy8vIFxlbmRjb2RlCisvLy8KKy8vLyBJZiB0aGUgY29kZSBvZiBgYWN0dWFsX3dvcmtgIGluIHRoZSBleGFtcGxlIGFib3ZlIGRvZXMgbm90IGNyYXNoLCB0aGUKKy8vLyBkZXN0cnVjdG9yIG9mIENyYXNoUmVjb3ZlcnlDb250ZXh0Q2xlYW51cFJlZ2lzdHJhciByZW1vdmVzIGNsZWFudXAgY29kZSBmcm9tCisvLy8gdGhlIGN1cnJlbnQgQ3Jhc2hSZWNvdmVyeUNvbnRleHQgYW5kIHRoZSByZXNvdXJjZSBpcyByZWNsYWltZWQgYnkgdGhlCisvLy8gZGVzdHJ1Y3RvciBvZiBzdGQ6OnVuaXF1ZV9wdHIuIElmIGNyYXNoIGhhcHBlbnMsIGRlc3RydWN0b3JzIGFyZSBub3QgY2FsbGVkCisvLy8gYW5kIHRoZSByZXNvdXJjZSBpcyByZWNsYWltZWQgYnkgY2xlYW51cCBvYmplY3QgcmVnaXN0ZXJlZCBpbiB0aGUgcmVjb3ZlcnkKKy8vLyBjb250ZXh0IGJ5IHRoZSBjb25zdHJ1Y3RvciBvZiBDcmFzaFJlY292ZXJ5Q29udGV4dENsZWFudXBSZWdpc3RyYXIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ2xlYW51cCA9IENyYXNoUmVjb3ZlcnlDb250ZXh0RGVsZXRlQ2xlYW51cDxUPiA+CitjbGFzcyBDcmFzaFJlY292ZXJ5Q29udGV4dENsZWFudXBSZWdpc3RyYXIgeworICBDcmFzaFJlY292ZXJ5Q29udGV4dENsZWFudXAgKmNsZWFudXA7CisKK3B1YmxpYzoKKyAgQ3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwUmVnaXN0cmFyKFQgKngpCisgICAgOiBjbGVhbnVwKENsZWFudXA6OmNyZWF0ZSh4KSkgeworICAgIGlmIChjbGVhbnVwKQorICAgICAgY2xlYW51cC0+Z2V0Q29udGV4dCgpLT5yZWdpc3RlckNsZWFudXAoY2xlYW51cCk7CisgIH0KKworICB+Q3Jhc2hSZWNvdmVyeUNvbnRleHRDbGVhbnVwUmVnaXN0cmFyKCkgeyB1bnJlZ2lzdGVyKCk7IH0KKworICB2b2lkIHVucmVnaXN0ZXIoKSB7CisgICAgaWYgKGNsZWFudXAgJiYgIWNsZWFudXAtPmNsZWFudXBGaXJlZCkKKyAgICAgIGNsZWFudXAtPmdldENvbnRleHQoKS0+dW5yZWdpc3RlckNsZWFudXAoY2xlYW51cCk7CisgICAgY2xlYW51cCA9IG51bGxwdHI7CisgIH0KK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0NSQVNIUkVDT1ZFUllDT05URVhUX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9ESkIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9ESkIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDMxMTE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0RKQi5oCkBAIC0wLDAgKzEsMzMgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L0RKQi5oIC0tLURKQiBIYXNoIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHN1cHBvcnQgZm9yIHRoZSBESiBCZXJuc3RlaW4gaGFzaCBmdW5jdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9ESkJfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfREpCX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBUaGUgQmVybnN0ZWluIGhhc2ggZnVuY3Rpb24gdXNlZCBieSB0aGUgRFdBUkYgYWNjZWxlcmF0b3IgdGFibGVzLgoraW5saW5lIHVpbnQzMl90IGRqYkhhc2goU3RyaW5nUmVmIEJ1ZmZlciwgdWludDMyX3QgSCA9IDUzODEpIHsKKyAgZm9yICh1bnNpZ25lZCBjaGFyIEMgOiBCdWZmZXIuYnl0ZXMoKSkKKyAgICBIID0gKEggPDwgNSkgKyBIICsgQzsKKyAgcmV0dXJuIEg7Cit9CisKKy8vLyBDb21wdXRlcyB0aGUgQmVybnN0ZWluIGhhc2ggYWZ0ZXIgZm9sZGluZyB0aGUgaW5wdXQgYWNjb3JkaW5nIHRvIHRoZSBEd2FyZiA1CisvLy8gc3RhbmRhcmQgY2FzZSBmb2xkaW5nIHJ1bGVzLgordWludDMyX3QgY2FzZUZvbGRpbmdEamJIYXNoKFN0cmluZ1JlZiBCdWZmZXIsIHVpbnQzMl90IEggPSA1MzgxKTsKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9ESkJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0RPVEdyYXBoVHJhaXRzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRE9UR3JhcGhUcmFpdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzgxYjViCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0RPVEdyYXBoVHJhaXRzLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L0RvdEdyYXBoVHJhaXRzLmggLSBDdXN0b21pemUgLmRvdCBvdXRwdXQgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSB0ZW1wbGF0ZSBjbGFzcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGN1c3RvbWl6ZSBkb3Qgb3V0cHV0CisvLyBncmFwaHMgZ2VuZXJhdGVkIGJ5IHRoZSBHcmFwaFdyaXRlci5oIGZpbGUuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZgorLy8gdGhpcyBmaWxlIHdpbGwgcHJvZHVjZSBhIHNpbXBsZSwgYnV0IG5vdCB2ZXJ5IHBvbGlzaGVkIGdyYXBoLiAgQnkKKy8vIHNwZWNpYWxpemluZyB0aGlzIHRlbXBsYXRlLCBsb3RzIG9mIGN1c3RvbWl6YXRpb24gb3Bwb3J0dW5pdGllcyBhcmUgcG9zc2libGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfRE9UR1JBUEhUUkFJVFNfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfRE9UR1JBUEhUUkFJVFNfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBEZWZhdWx0RE9UR3JhcGhUcmFpdHMgLSBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9ucyBvZgorLy8vIGFsbCBvZiB0aGUgRE9UR3JhcGhUcmFpdHMgbWV0aG9kcy4gIElmIGEgc3BlY2lhbGl6YXRpb24gZG9lcyBub3QgbmVlZCB0bworLy8vIG92ZXJyaWRlIGFsbCBtZXRob2RzIGhlcmUgaXQgc2hvdWxkIGluaGVyaXQgc28gdGhhdCBpdCBjYW4gZ2V0IHRoZSBkZWZhdWx0CisvLy8gaW1wbGVtZW50YXRpb25zLgorLy8vCitzdHJ1Y3QgRGVmYXVsdERPVEdyYXBoVHJhaXRzIHsKK3ByaXZhdGU6CisgIGJvb2wgSXNTaW1wbGU7CisKK3Byb3RlY3RlZDoKKyAgYm9vbCBpc1NpbXBsZSgpIHsKKyAgICByZXR1cm4gSXNTaW1wbGU7CisgIH0KKworcHVibGljOgorICBleHBsaWNpdCBEZWZhdWx0RE9UR3JhcGhUcmFpdHMoYm9vbCBzaW1wbGU9ZmFsc2UpIDogSXNTaW1wbGUgKHNpbXBsZSkge30KKworICAvLy8gZ2V0R3JhcGhOYW1lIC0gUmV0dXJuIHRoZSBsYWJlbCBmb3IgdGhlIGdyYXBoIGFzIGEgd2hvbGUuICBQcmludGVkIGF0IHRoZQorICAvLy8gdG9wIG9mIHRoZSBncmFwaC4KKyAgLy8vCisgIHRlbXBsYXRlPHR5cGVuYW1lIEdyYXBoVHlwZT4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldEdyYXBoTmFtZShjb25zdCBHcmFwaFR5cGUgJikgeyByZXR1cm4gIiI7IH0KKworICAvLy8gZ2V0R3JhcGhQcm9wZXJ0aWVzIC0gUmV0dXJuIGFueSBjdXN0b20gcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZAorICAvLy8gaW4gdGhlIHRvcCBsZXZlbCBncmFwaCBzdHJ1Y3R1cmUgZm9yIGRvdC4KKyAgLy8vCisgIHRlbXBsYXRlPHR5cGVuYW1lIEdyYXBoVHlwZT4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldEdyYXBoUHJvcGVydGllcyhjb25zdCBHcmFwaFR5cGUgJikgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIC8vLyByZW5kZXJHcmFwaEZyb21Cb3R0b21VcCAtIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCB0aGUgZ3JhcGggaXMKKyAgLy8vIGVtaXR0ZWQgYm90dG9tLXVwIGluc3RlYWQgb2YgdG9wLWRvd24uICBUaGlzIHJlcXVpcmVzIGdyYXBodml6IDIuMCB0byB3b3JrCisgIC8vLyB0aG91Z2guCisgIHN0YXRpYyBib29sIHJlbmRlckdyYXBoRnJvbUJvdHRvbVVwKCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBpc05vZGVIaWRkZW4gLSBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCB0aGUgZ2l2ZW4gbm9kZSBpcyBub3QKKyAgLy8vIGRpc3BsYXllZCBpbiB0aGUgZ3JhcGguCisgIHN0YXRpYyBib29sIGlzTm9kZUhpZGRlbihjb25zdCB2b2lkICopIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gZ2V0Tm9kZUxhYmVsIC0gR2l2ZW4gYSBub2RlIGFuZCBhIHBvaW50ZXIgdG8gdGhlIHRvcCBsZXZlbCBncmFwaCwgcmV0dXJuCisgIC8vLyB0aGUgbGFiZWwgdG8gcHJpbnQgaW4gdGhlIG5vZGUuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEdyYXBoVHlwZT4KKyAgc3RkOjpzdHJpbmcgZ2V0Tm9kZUxhYmVsKGNvbnN0IHZvaWQgKiwgY29uc3QgR3JhcGhUeXBlICYpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICAvLyBnZXROb2RlSWRlbnRpZmllckxhYmVsIC0gUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgdGhlCisgIC8vIGFkZHJlc3Mgb3Igb3RoZXIgdW5pcXVlIGlkZW50aWZpZXIgb2YgdGhlIG5vZGUuIChPbmx5IHVzZWQgaWYKKyAgLy8gbm9uLWVtcHR5LikKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEdyYXBoVHlwZT4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldE5vZGVJZGVudGlmaWVyTGFiZWwoY29uc3Qgdm9pZCAqLCBjb25zdCBHcmFwaFR5cGUgJikgeworICAgIHJldHVybiAiIjsKKyAgfQorCisgIHRlbXBsYXRlPHR5cGVuYW1lIEdyYXBoVHlwZT4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldE5vZGVEZXNjcmlwdGlvbihjb25zdCB2b2lkICosIGNvbnN0IEdyYXBoVHlwZSAmKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgLy8vIElmIHlvdSB3YW50IHRvIHNwZWNpZnkgY3VzdG9tIG5vZGUgYXR0cmlidXRlcywgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZG8gc28KKyAgLy8vCisgIHRlbXBsYXRlPHR5cGVuYW1lIEdyYXBoVHlwZT4KKyAgc3RhdGljIHN0ZDo6c3RyaW5nIGdldE5vZGVBdHRyaWJ1dGVzKGNvbnN0IHZvaWQgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdyYXBoVHlwZSAmKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgLy8vIElmIHlvdSB3YW50IHRvIG92ZXJyaWRlIHRoZSBkb3QgYXR0cmlidXRlcyBwcmludGVkIGZvciBhIHBhcnRpY3VsYXIgZWRnZSwKKyAgLy8vIG92ZXJyaWRlIHRoaXMgbWV0aG9kLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBFZGdlSXRlciwgdHlwZW5hbWUgR3JhcGhUeXBlPgorICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RWRnZUF0dHJpYnV0ZXMoY29uc3Qgdm9pZCAqLCBFZGdlSXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdyYXBoVHlwZSAmKSB7CisgICAgcmV0dXJuICIiOworICB9CisKKyAgLy8vIGdldEVkZ2VTb3VyY2VMYWJlbCAtIElmIHlvdSB3YW50IHRvIGxhYmVsIHRoZSBlZGdlIHNvdXJjZSBpdHNlbGYsCisgIC8vLyBpbXBsZW1lbnQgdGhpcyBtZXRob2QuCisgIHRlbXBsYXRlPHR5cGVuYW1lIEVkZ2VJdGVyPgorICBzdGF0aWMgc3RkOjpzdHJpbmcgZ2V0RWRnZVNvdXJjZUxhYmVsKGNvbnN0IHZvaWQgKiwgRWRnZUl0ZXIpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICAvLy8gZWRnZVRhcmdldHNFZGdlU291cmNlIC0gVGhpcyBtZXRob2QgcmV0dXJucyB0cnVlIGlmIHRoaXMgb3V0Z29pbmcgZWRnZQorICAvLy8gc2hvdWxkIGFjdHVhbGx5IHRhcmdldCBhbm90aGVyIGVkZ2Ugc291cmNlLCBub3QgYSBub2RlLiAgSWYgdGhpcyBtZXRob2QgaXMKKyAgLy8vIGltcGxlbWVudGVkLCBnZXRFZGdlVGFyZ2V0IHNob3VsZCBiZSBpbXBsZW1lbnRlZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgRWRnZUl0ZXI+CisgIHN0YXRpYyBib29sIGVkZ2VUYXJnZXRzRWRnZVNvdXJjZShjb25zdCB2b2lkICosIEVkZ2VJdGVyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIGdldEVkZ2VUYXJnZXQgLSBJZiBlZGdlVGFyZ2V0c0VkZ2VTb3VyY2UgcmV0dXJucyB0cnVlLCB0aGlzIG1ldGhvZCBpcworICAvLy8gY2FsbGVkIHRvIGRldGVybWluZSB3aGljaCBvdXRnb2luZyBlZGdlIG9mIE5vZGUgaXMgdGhlIHRhcmdldCBvZiB0aGlzCisgIC8vLyBlZGdlLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBFZGdlSXRlcj4KKyAgc3RhdGljIEVkZ2VJdGVyIGdldEVkZ2VUYXJnZXQoY29uc3Qgdm9pZCAqLCBFZGdlSXRlciBJKSB7CisgICAgcmV0dXJuIEk7CisgIH0KKworICAvLy8gaGFzRWRnZURlc3RMYWJlbHMgLSBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgdGhlIGdyYXBoIGlzIGFibGUKKyAgLy8vIHRvIHByb3ZpZGUgbGFiZWxzIGZvciBlZGdlIGRlc3RpbmF0aW9ucy4KKyAgc3RhdGljIGJvb2wgaGFzRWRnZURlc3RMYWJlbHMoKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8vIG51bUVkZ2VEZXN0TGFiZWxzIC0gSWYgaGFzRWRnZURlc3RMYWJlbHMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUKKyAgLy8vIG51bWJlciBvZiBpbmNvbWluZyBlZGdlIGxhYmVscyB0aGUgZ2l2ZW4gbm9kZSBoYXMuCisgIHN0YXRpYyB1bnNpZ25lZCBudW1FZGdlRGVzdExhYmVscyhjb25zdCB2b2lkICopIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIC8vLyBnZXRFZGdlRGVzdExhYmVsIC0gSWYgaGFzRWRnZURlc3RMYWJlbHMsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUKKyAgLy8vIGluY29taW5nIGVkZ2UgbGFiZWwgd2l0aCB0aGUgZ2l2ZW4gaW5kZXggaW4gdGhlIGdpdmVuIG5vZGUuCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBnZXRFZGdlRGVzdExhYmVsKGNvbnN0IHZvaWQgKiwgdW5zaWduZWQpIHsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICAvLy8gYWRkQ3VzdG9tR3JhcGhGZWF0dXJlcyAtIElmIGEgZ3JhcGggaXMgbWFkZSB1cCBvZiBtb3JlIHRoYW4ganVzdAorICAvLy8gc3RyYWlnaHQtZm9yd2FyZCBub2RlcyBhbmQgZWRnZXMsIHRoaXMgaXMgdGhlIHBsYWNlIHRvIHB1dCBhbGwgb2YgdGhlCisgIC8vLyBjdXN0b20gc3R1ZmYgbmVjZXNzYXJ5LiAgVGhlIEdyYXBoV3JpdGVyIG9iamVjdCwgaW5zdGFudGlhdGVkIHdpdGggeW91cgorICAvLy8gR3JhcGhUeXBlIGlzIHBhc3NlZCBpbiBhcyBhbiBhcmd1bWVudC4gIFlvdSBtYXkgY2FsbCBhcmJpdHJhcnkgbWV0aG9kcyBvbgorICAvLy8gaXQgdG8gYWRkIHRoaW5ncyB0byB0aGUgb3V0cHV0IGdyYXBoLgorICAvLy8KKyAgdGVtcGxhdGU8dHlwZW5hbWUgR3JhcGhUeXBlLCB0eXBlbmFtZSBHcmFwaFdyaXRlcj4KKyAgc3RhdGljIHZvaWQgYWRkQ3VzdG9tR3JhcGhGZWF0dXJlcyhjb25zdCBHcmFwaFR5cGUgJiwgR3JhcGhXcml0ZXIgJikge30KK307CisKKworLy8vIERPVEdyYXBoVHJhaXRzIC0gVGVtcGxhdGUgY2xhc3MgdGhhdCBjYW4gYmUgc3BlY2lhbGl6ZWQgdG8gY3VzdG9taXplIGhvdworLy8vIGdyYXBocyBhcmUgY29udmVydGVkIHRvICdkb3QnIGdyYXBocy4gIFdoZW4gc3BlY2lhbGl6aW5nLCB5b3UgbWF5IGluaGVyaXQKKy8vLyBmcm9tIERlZmF1bHRET1RHcmFwaFRyYWl0cyBpZiB5b3UgZG9uJ3QgbmVlZCB0byBvdmVycmlkZSBldmVyeXRoaW5nLgorLy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHk+CitzdHJ1Y3QgRE9UR3JhcGhUcmFpdHMgOiBwdWJsaWMgRGVmYXVsdERPVEdyYXBoVHJhaXRzIHsKKyAgRE9UR3JhcGhUcmFpdHMgKGJvb2wgc2ltcGxlPWZhbHNlKSA6IERlZmF1bHRET1RHcmFwaFRyYWl0cyAoc2ltcGxlKSB7fQorfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRGF0YUV4dHJhY3Rvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0RhdGFFeHRyYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTQ0Nzg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0RhdGFFeHRyYWN0b3IuaApAQCAtMCwwICsxLDQyOCBAQAorLy89PT0tLSBEYXRhRXh0cmFjdG9yLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfREFUQUVYVFJBQ1RPUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9EQVRBRVhUUkFDVE9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQW4gYXV4aWxpYXJ5IHR5cGUgdG8gZmFjaWxpdGF0ZSBleHRyYWN0aW9uIG9mIDMtYnl0ZSBlbnRpdGllcy4gCitzdHJ1Y3QgVWludDI0IHsKKyAgdWludDhfdCBCeXRlc1szXTsKKyAgVWludDI0KHVpbnQ4X3QgVSkgeworICAgIEJ5dGVzWzBdID0gQnl0ZXNbMV0gPSBCeXRlc1syXSA9IFU7CisgIH0KKyAgVWludDI0KHVpbnQ4X3QgVTAsIHVpbnQ4X3QgVTEsIHVpbnQ4X3QgVTIpIHsKKyAgICBCeXRlc1swXSA9IFUwOyBCeXRlc1sxXSA9IFUxOyBCeXRlc1syXSA9IFUyOworICB9CisgIHVpbnQzMl90IGdldEFzVWludDMyKGJvb2wgSXNMaXR0bGVFbmRpYW4pIGNvbnN0IHsKKyAgICBpbnQgTG9JeCA9IElzTGl0dGxlRW5kaWFuID8gMCA6IDI7CisgICAgcmV0dXJuIEJ5dGVzW0xvSXhdICsgKEJ5dGVzWzFdIDw8IDgpICsgKEJ5dGVzWzItTG9JeF0gPDwgMTYpOworICB9Cit9OworCit1c2luZyB1aW50MjRfdCA9IFVpbnQyNDsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHVpbnQyNF90KSA9PSAzLCAic2l6ZW9mKHVpbnQyNF90KSAhPSAzIik7CisKKy8vLyBOZWVkZWQgYnkgc3dhcEJ5dGVPcmRlcigpLgoraW5saW5lIHVpbnQyNF90IGdldFN3YXBwZWRCeXRlcyh1aW50MjRfdCBDKSB7CisgIHJldHVybiB1aW50MjRfdChDLkJ5dGVzWzJdLCBDLkJ5dGVzWzFdLCBDLkJ5dGVzWzBdKTsKK30KKworY2xhc3MgRGF0YUV4dHJhY3RvciB7CisgIFN0cmluZ1JlZiBEYXRhOworICB1aW50OF90IElzTGl0dGxlRW5kaWFuOworICB1aW50OF90IEFkZHJlc3NTaXplOworcHVibGljOgorICAvLy8gQ29uc3RydWN0IHdpdGggYSBidWZmZXIgdGhhdCBpcyBvd25lZCBieSB0aGUgY2FsbGVyLgorICAvLy8KKyAgLy8vIFRoaXMgY29uc3RydWN0b3IgYWxsb3dzIHVzIHRvIHVzZSBkYXRhIHRoYXQgaXMgb3duZWQgYnkgdGhlCisgIC8vLyBjYWxsZXIuIFRoZSBkYXRhIG11c3Qgc3RheSBhcm91bmQgYXMgbG9uZyBhcyB0aGlzIG9iamVjdCBpcworICAvLy8gdmFsaWQuCisgIERhdGFFeHRyYWN0b3IoU3RyaW5nUmVmIERhdGEsIGJvb2wgSXNMaXR0bGVFbmRpYW4sIHVpbnQ4X3QgQWRkcmVzc1NpemUpCisgICAgOiBEYXRhKERhdGEpLCBJc0xpdHRsZUVuZGlhbihJc0xpdHRsZUVuZGlhbiksIEFkZHJlc3NTaXplKEFkZHJlc3NTaXplKSB7fQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBkYXRhIHBvaW50ZWQgdG8gYnkgdGhpcyBleHRyYWN0b3IuCisgIFN0cmluZ1JlZiBnZXREYXRhKCkgY29uc3QgeyByZXR1cm4gRGF0YTsgfQorICAvLy8gXGJyaWVmIEdldCB0aGUgZW5kaWFubmVzcyBmb3IgdGhpcyBleHRyYWN0b3IuCisgIGJvb2wgaXNMaXR0bGVFbmRpYW4oKSBjb25zdCB7IHJldHVybiBJc0xpdHRsZUVuZGlhbjsgfQorICAvLy8gXGJyaWVmIEdldCB0aGUgYWRkcmVzcyBzaXplIGZvciB0aGlzIGV4dHJhY3Rvci4KKyAgdWludDhfdCBnZXRBZGRyZXNzU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEFkZHJlc3NTaXplOyB9CisgIC8vLyBcYnJpZWYgU2V0IHRoZSBhZGRyZXNzIHNpemUgZm9yIHRoaXMgZXh0cmFjdG9yLgorICB2b2lkIHNldEFkZHJlc3NTaXplKHVpbnQ4X3QgU2l6ZSkgeyBBZGRyZXNzU2l6ZSA9IFNpemU7IH0KKworICAvLy8gRXh0cmFjdCBhIEMgc3RyaW5nIGZyb20gXGEgKm9mZnNldF9wdHIuCisgIC8vLworICAvLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gYSBDIFN0cmluZyBmcm9tIHRoZSBkYXRhIGF0IHRoZSBvZmZzZXQKKyAgLy8vIHBvaW50ZWQgdG8gYnkgXGEgb2Zmc2V0X3B0ci4gQSB2YXJpYWJsZSBsZW5ndGggTlVMTCB0ZXJtaW5hdGVkIEMKKyAgLy8vIHN0cmluZyB3aWxsIGJlIGV4dHJhY3RlZCBhbmQgdGhlIFxhIG9mZnNldF9wdHIgd2lsbCBiZQorICAvLy8gdXBkYXRlZCB3aXRoIHRoZSBvZmZzZXQgb2YgdGhlIGJ5dGUgdGhhdCBmb2xsb3dzIHRoZSBOVUxMCisgIC8vLyB0ZXJtaW5hdG9yIGJ5dGUuCisgIC8vLworICAvLy8gQHBhcmFtW2luLG91dF0gb2Zmc2V0X3B0cgorICAvLy8gICAgIEEgcG9pbnRlciB0byBhbiBvZmZzZXQgd2l0aGluIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSBhZHZhbmNlZAorICAvLy8gICAgIGJ5IHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYnl0ZXMgaWYgdGhlIHZhbHVlIGlzIGV4dHJhY3RlZAorICAvLy8gICAgIGNvcnJlY3RseS4gSWYgdGhlIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzIG9yIHRoZXJlIGFyZSBub3QKKyAgLy8vICAgICBlbm91Z2ggYnl0ZXMgdG8gZXh0cmFjdCB0aGlzIHZhbHVlLCB0aGUgb2Zmc2V0IHdpbGwgYmUgbGVmdAorICAvLy8gICAgIHVubW9kaWZpZWQuCisgIC8vLworICAvLy8gQHJldHVybgorICAvLy8gICAgIEEgcG9pbnRlciB0byB0aGUgQyBzdHJpbmcgdmFsdWUgaW4gdGhlIGRhdGEuIElmIHRoZSBvZmZzZXQKKyAgLy8vICAgICBwb2ludGVkIHRvIGJ5IFxhIG9mZnNldF9wdHIgaXMgb3V0IG9mIGJvdW5kcywgb3IgaWYgdGhlCisgIC8vLyAgICAgb2Zmc2V0IHBsdXMgdGhlIGxlbmd0aCBvZiB0aGUgQyBzdHJpbmcgaXMgb3V0IG9mIGJvdW5kcywKKyAgLy8vICAgICBOVUxMIHdpbGwgYmUgcmV0dXJuZWQuCisgIGNvbnN0IGNoYXIgKmdldENTdHIodWludDMyX3QgKm9mZnNldF9wdHIpIGNvbnN0OworCisgIC8vLyBFeHRyYWN0IGEgQyBzdHJpbmcgZnJvbSBcYSAqT2Zmc2V0UHRyLgorICAvLy8KKyAgLy8vIFJldHVybnMgYSBTdHJpbmdSZWYgZm9yIHRoZSBDIFN0cmluZyBmcm9tIHRoZSBkYXRhIGF0IHRoZSBvZmZzZXQKKyAgLy8vIHBvaW50ZWQgdG8gYnkgXGEgT2Zmc2V0UHRyLiBBIHZhcmlhYmxlIGxlbmd0aCBOVUxMIHRlcm1pbmF0ZWQgQworICAvLy8gc3RyaW5nIHdpbGwgYmUgZXh0cmFjdGVkIGFuZCB0aGUgXGEgT2Zmc2V0UHRyIHdpbGwgYmUKKyAgLy8vIHVwZGF0ZWQgd2l0aCB0aGUgb2Zmc2V0IG9mIHRoZSBieXRlIHRoYXQgZm9sbG93cyB0aGUgTlVMTAorICAvLy8gdGVybWluYXRvciBieXRlLgorICAvLy8KKyAgLy8vIFxwYXJhbVtpbixvdXRdIE9mZnNldFB0cgorICAvLy8gICAgIEEgcG9pbnRlciB0byBhbiBvZmZzZXQgd2l0aGluIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSBhZHZhbmNlZAorICAvLy8gICAgIGJ5IHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYnl0ZXMgaWYgdGhlIHZhbHVlIGlzIGV4dHJhY3RlZAorICAvLy8gICAgIGNvcnJlY3RseS4gSWYgdGhlIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzIG9yIHRoZXJlIGFyZSBub3QKKyAgLy8vICAgICBlbm91Z2ggYnl0ZXMgdG8gZXh0cmFjdCB0aGlzIHZhbHVlLCB0aGUgb2Zmc2V0IHdpbGwgYmUgbGVmdAorICAvLy8gICAgIHVubW9kaWZpZWQuCisgIC8vLworICAvLy8gXHJldHVybgorICAvLy8gICAgIEEgU3RyaW5nUmVmIGZvciB0aGUgQyBzdHJpbmcgdmFsdWUgaW4gdGhlIGRhdGEuIElmIHRoZSBvZmZzZXQKKyAgLy8vICAgICBwb2ludGVkIHRvIGJ5IFxhIE9mZnNldFB0ciBpcyBvdXQgb2YgYm91bmRzLCBvciBpZiB0aGUKKyAgLy8vICAgICBvZmZzZXQgcGx1cyB0aGUgbGVuZ3RoIG9mIHRoZSBDIHN0cmluZyBpcyBvdXQgb2YgYm91bmRzLAorICAvLy8gICAgIGEgZGVmYXVsdC1pbml0aWFsaXplZCBTdHJpbmdSZWYgd2lsbCBiZSByZXR1cm5lZC4KKyAgU3RyaW5nUmVmIGdldENTdHJSZWYodWludDMyX3QgKk9mZnNldFB0cikgY29uc3Q7CisKKyAgLy8vIEV4dHJhY3QgYW4gdW5zaWduZWQgaW50ZWdlciBvZiBzaXplIFxhIGJ5dGVfc2l6ZSBmcm9tIFxhCisgIC8vLyAqb2Zmc2V0X3B0ci4KKyAgLy8vCisgIC8vLyBFeHRyYWN0IGEgc2luZ2xlIHVuc2lnbmVkIGludGVnZXIgdmFsdWUgYW5kIHVwZGF0ZSB0aGUgb2Zmc2V0CisgIC8vLyBwb2ludGVkIHRvIGJ5IFxhIG9mZnNldF9wdHIuIFRoZSBzaXplIG9mIHRoZSBleHRyYWN0ZWQgaW50ZWdlcgorICAvLy8gaXMgc3BlY2lmaWVkIGJ5IHRoZSBcYSBieXRlX3NpemUgYXJndW1lbnQuIFxhIGJ5dGVfc2l6ZSBzaG91bGQKKyAgLy8vIGhhdmUgYSB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gb25lIGFuZCBsZXNzIHRoYW4gb3IgZXF1YWwKKyAgLy8vIHRvIGVpZ2h0IHNpbmNlIHRoZSByZXR1cm4gdmFsdWUgaXMgNjQgYml0cyB3aWRlLiBBbnkKKyAgLy8vIFxhIGJ5dGVfc2l6ZSB2YWx1ZXMgbGVzcyB0aGFuIDEgb3IgZ3JlYXRlciB0aGFuIDggd2lsbCByZXN1bHQgaW4KKyAgLy8vIG5vdGhpbmcgYmVpbmcgZXh0cmFjdGVkLCBhbmQgemVybyBiZWluZyByZXR1cm5lZC4KKyAgLy8vCisgIC8vLyBAcGFyYW1baW4sb3V0XSBvZmZzZXRfcHRyCisgIC8vLyAgICAgQSBwb2ludGVyIHRvIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRhdGEgdGhhdCB3aWxsIGJlIGFkdmFuY2VkCisgIC8vLyAgICAgYnkgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBieXRlcyBpZiB0aGUgdmFsdWUgaXMgZXh0cmFjdGVkCisgIC8vLyAgICAgY29ycmVjdGx5LiBJZiB0aGUgb2Zmc2V0IGlzIG91dCBvZiBib3VuZHMgb3IgdGhlcmUgYXJlIG5vdAorICAvLy8gICAgIGVub3VnaCBieXRlcyB0byBleHRyYWN0IHRoaXMgdmFsdWUsIHRoZSBvZmZzZXQgd2lsbCBiZSBsZWZ0CisgIC8vLyAgICAgdW5tb2RpZmllZC4KKyAgLy8vCisgIC8vLyBAcGFyYW1baW5dIGJ5dGVfc2l6ZQorICAvLy8gICAgIFRoZSBzaXplIGluIGJ5dGUgb2YgdGhlIGludGVnZXIgdG8gZXh0cmFjdC4KKyAgLy8vCisgIC8vLyBAcmV0dXJuCisgIC8vLyAgICAgVGhlIHVuc2lnbmVkIGludGVnZXIgdmFsdWUgdGhhdCB3YXMgZXh0cmFjdGVkLCBvciB6ZXJvIG9uCisgIC8vLyAgICAgZmFpbHVyZS4KKyAgdWludDY0X3QgZ2V0VW5zaWduZWQodWludDMyX3QgKm9mZnNldF9wdHIsIHVpbnQzMl90IGJ5dGVfc2l6ZSkgY29uc3Q7CisKKyAgLy8vIEV4dHJhY3QgYW4gc2lnbmVkIGludGVnZXIgb2Ygc2l6ZSBcYSBieXRlX3NpemUgZnJvbSBcYSAqb2Zmc2V0X3B0ci4KKyAgLy8vCisgIC8vLyBFeHRyYWN0IGEgc2luZ2xlIHNpZ25lZCBpbnRlZ2VyIHZhbHVlIChzaWduIGV4dGVuZGluZyBpZiByZXF1aXJlZCkKKyAgLy8vIGFuZCB1cGRhdGUgdGhlIG9mZnNldCBwb2ludGVkIHRvIGJ5IFxhIG9mZnNldF9wdHIuIFRoZSBzaXplIG9mCisgIC8vLyB0aGUgZXh0cmFjdGVkIGludGVnZXIgaXMgc3BlY2lmaWVkIGJ5IHRoZSBcYSBieXRlX3NpemUgYXJndW1lbnQuCisgIC8vLyBcYSBieXRlX3NpemUgc2hvdWxkIGhhdmUgYSB2YWx1ZSBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gb25lCisgIC8vLyBhbmQgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGVpZ2h0IHNpbmNlIHRoZSByZXR1cm4gdmFsdWUgaXMgNjQKKyAgLy8vIGJpdHMgd2lkZS4gQW55IFxhIGJ5dGVfc2l6ZSB2YWx1ZXMgbGVzcyB0aGFuIDEgb3IgZ3JlYXRlciB0aGFuCisgIC8vLyA4IHdpbGwgcmVzdWx0IGluIG5vdGhpbmcgYmVpbmcgZXh0cmFjdGVkLCBhbmQgemVybyBiZWluZyByZXR1cm5lZC4KKyAgLy8vCisgIC8vLyBAcGFyYW1baW4sb3V0XSBvZmZzZXRfcHRyCisgIC8vLyAgICAgQSBwb2ludGVyIHRvIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRhdGEgdGhhdCB3aWxsIGJlIGFkdmFuY2VkCisgIC8vLyAgICAgYnkgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBieXRlcyBpZiB0aGUgdmFsdWUgaXMgZXh0cmFjdGVkCisgIC8vLyAgICAgY29ycmVjdGx5LiBJZiB0aGUgb2Zmc2V0IGlzIG91dCBvZiBib3VuZHMgb3IgdGhlcmUgYXJlIG5vdAorICAvLy8gICAgIGVub3VnaCBieXRlcyB0byBleHRyYWN0IHRoaXMgdmFsdWUsIHRoZSBvZmZzZXQgd2lsbCBiZSBsZWZ0CisgIC8vLyAgICAgdW5tb2RpZmllZC4KKyAgLy8vCisgIC8vLyBAcGFyYW1baW5dIHNpemUKKyAgLy8vICAgICBUaGUgc2l6ZSBpbiBieXRlcyBvZiB0aGUgaW50ZWdlciB0byBleHRyYWN0LgorICAvLy8KKyAgLy8vIEByZXR1cm4KKyAgLy8vICAgICBUaGUgc2lnbiBleHRlbmRlZCBzaWduZWQgaW50ZWdlciB2YWx1ZSB0aGF0IHdhcyBleHRyYWN0ZWQsCisgIC8vLyAgICAgb3IgemVybyBvbiBmYWlsdXJlLgorICBpbnQ2NF90IGdldFNpZ25lZCh1aW50MzJfdCAqb2Zmc2V0X3B0ciwgdWludDMyX3Qgc2l6ZSkgY29uc3Q7CisKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8vIEV4dHJhY3QgYW4gcG9pbnRlciBmcm9tIFxhICpvZmZzZXRfcHRyLgorICAvLy8KKyAgLy8vIEV4dHJhY3QgYSBzaW5nbGUgcG9pbnRlciBmcm9tIHRoZSBkYXRhIGFuZCB1cGRhdGUgdGhlIG9mZnNldAorICAvLy8gcG9pbnRlZCB0byBieSBcYSBvZmZzZXRfcHRyLiBUaGUgc2l6ZSBvZiB0aGUgZXh0cmFjdGVkIHBvaW50ZXIKKyAgLy8vIGlzIFxhIGdldEFkZHJlc3NTaXplKCksIHNvIHRoZSBhZGRyZXNzIHNpemUgaGFzIHRvIGJlCisgIC8vLyBzZXQgY29ycmVjdGx5IHByaW9yIHRvIGV4dHJhY3RpbmcgYW55IHBvaW50ZXIgdmFsdWVzLgorICAvLy8KKyAgLy8vIEBwYXJhbVtpbixvdXRdIG9mZnNldF9wdHIKKyAgLy8vICAgICBBIHBvaW50ZXIgdG8gYW4gb2Zmc2V0IHdpdGhpbiB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgYWR2YW5jZWQKKyAgLy8vICAgICBieSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGJ5dGVzIGlmIHRoZSB2YWx1ZSBpcyBleHRyYWN0ZWQKKyAgLy8vICAgICBjb3JyZWN0bHkuIElmIHRoZSBvZmZzZXQgaXMgb3V0IG9mIGJvdW5kcyBvciB0aGVyZSBhcmUgbm90CisgIC8vLyAgICAgZW5vdWdoIGJ5dGVzIHRvIGV4dHJhY3QgdGhpcyB2YWx1ZSwgdGhlIG9mZnNldCB3aWxsIGJlIGxlZnQKKyAgLy8vICAgICB1bm1vZGlmaWVkLgorICAvLy8KKyAgLy8vIEByZXR1cm4KKyAgLy8vICAgICBUaGUgZXh0cmFjdGVkIHBvaW50ZXIgdmFsdWUgYXMgYSA2NCBpbnRlZ2VyLgorICB1aW50NjRfdCBnZXRBZGRyZXNzKHVpbnQzMl90ICpvZmZzZXRfcHRyKSBjb25zdCB7CisgICAgcmV0dXJuIGdldFVuc2lnbmVkKG9mZnNldF9wdHIsIEFkZHJlc3NTaXplKTsKKyAgfQorCisgIC8vLyBFeHRyYWN0IGEgdWludDhfdCB2YWx1ZSBmcm9tIFxhICpvZmZzZXRfcHRyLgorICAvLy8KKyAgLy8vIEV4dHJhY3QgYSBzaW5nbGUgdWludDhfdCBmcm9tIHRoZSBiaW5hcnkgZGF0YSBhdCB0aGUgb2Zmc2V0CisgIC8vLyBwb2ludGVkIHRvIGJ5IFxhIG9mZnNldF9wdHIsIGFuZCBhZHZhbmNlIHRoZSBvZmZzZXQgb24gc3VjY2Vzcy4KKyAgLy8vCisgIC8vLyBAcGFyYW1baW4sb3V0XSBvZmZzZXRfcHRyCisgIC8vLyAgICAgQSBwb2ludGVyIHRvIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRhdGEgdGhhdCB3aWxsIGJlIGFkdmFuY2VkCisgIC8vLyAgICAgYnkgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBieXRlcyBpZiB0aGUgdmFsdWUgaXMgZXh0cmFjdGVkCisgIC8vLyAgICAgY29ycmVjdGx5LiBJZiB0aGUgb2Zmc2V0IGlzIG91dCBvZiBib3VuZHMgb3IgdGhlcmUgYXJlIG5vdAorICAvLy8gICAgIGVub3VnaCBieXRlcyB0byBleHRyYWN0IHRoaXMgdmFsdWUsIHRoZSBvZmZzZXQgd2lsbCBiZSBsZWZ0CisgIC8vLyAgICAgdW5tb2RpZmllZC4KKyAgLy8vCisgIC8vLyBAcmV0dXJuCisgIC8vLyAgICAgVGhlIGV4dHJhY3RlZCB1aW50OF90IHZhbHVlLgorICB1aW50OF90IGdldFU4KHVpbnQzMl90ICpvZmZzZXRfcHRyKSBjb25zdDsKKworICAvLy8gRXh0cmFjdCBcYSBjb3VudCB1aW50OF90IHZhbHVlcyBmcm9tIFxhICpvZmZzZXRfcHRyLgorICAvLy8KKyAgLy8vIEV4dHJhY3QgXGEgY291bnQgdWludDhfdCB2YWx1ZXMgZnJvbSB0aGUgYmluYXJ5IGRhdGEgYXQgdGhlCisgIC8vLyBvZmZzZXQgcG9pbnRlZCB0byBieSBcYSBvZmZzZXRfcHRyLCBhbmQgYWR2YW5jZSB0aGUgb2Zmc2V0IG9uCisgIC8vLyBzdWNjZXNzLiBUaGUgZXh0cmFjdGVkIHZhbHVlcyBhcmUgY29waWVkIGludG8gXGEgZHN0LgorICAvLy8KKyAgLy8vIEBwYXJhbVtpbixvdXRdIG9mZnNldF9wdHIKKyAgLy8vICAgICBBIHBvaW50ZXIgdG8gYW4gb2Zmc2V0IHdpdGhpbiB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgYWR2YW5jZWQKKyAgLy8vICAgICBieSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGJ5dGVzIGlmIHRoZSB2YWx1ZSBpcyBleHRyYWN0ZWQKKyAgLy8vICAgICBjb3JyZWN0bHkuIElmIHRoZSBvZmZzZXQgaXMgb3V0IG9mIGJvdW5kcyBvciB0aGVyZSBhcmUgbm90CisgIC8vLyAgICAgZW5vdWdoIGJ5dGVzIHRvIGV4dHJhY3QgdGhpcyB2YWx1ZSwgdGhlIG9mZnNldCB3aWxsIGJlIGxlZnQKKyAgLy8vICAgICB1bm1vZGlmaWVkLgorICAvLy8KKyAgLy8vIEBwYXJhbVtvdXRdIGRzdAorICAvLy8gICAgIEEgYnVmZmVyIHRvIGNvcHkgXGEgY291bnQgdWludDhfdCB2YWx1ZXMgaW50by4gXGEgZHN0IG11c3QKKyAgLy8vICAgICBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgcmVxdWVzdGVkIGRhdGEuCisgIC8vLworICAvLy8gQHBhcmFtW2luXSBjb3VudAorICAvLy8gICAgIFRoZSBudW1iZXIgb2YgdWludDhfdCB2YWx1ZXMgdG8gZXh0cmFjdC4KKyAgLy8vCisgIC8vLyBAcmV0dXJuCisgIC8vLyAgICAgXGEgZHN0IGlmIGFsbCB2YWx1ZXMgd2VyZSBwcm9wZXJseSBleHRyYWN0ZWQgYW5kIGNvcGllZCwKKyAgLy8vICAgICBOVUxMIG90aGVyaXNlLgorICB1aW50OF90ICpnZXRVOCh1aW50MzJfdCAqb2Zmc2V0X3B0ciwgdWludDhfdCAqZHN0LCB1aW50MzJfdCBjb3VudCkgY29uc3Q7CisKKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8vIEV4dHJhY3QgYSB1aW50MTZfdCB2YWx1ZSBmcm9tIFxhICpvZmZzZXRfcHRyLgorICAvLy8KKyAgLy8vIEV4dHJhY3QgYSBzaW5nbGUgdWludDE2X3QgZnJvbSB0aGUgYmluYXJ5IGRhdGEgYXQgdGhlIG9mZnNldAorICAvLy8gcG9pbnRlZCB0byBieSBcYSBvZmZzZXRfcHRyLCBhbmQgdXBkYXRlIHRoZSBvZmZzZXQgb24gc3VjY2Vzcy4KKyAgLy8vCisgIC8vLyBAcGFyYW1baW4sb3V0XSBvZmZzZXRfcHRyCisgIC8vLyAgICAgQSBwb2ludGVyIHRvIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRhdGEgdGhhdCB3aWxsIGJlIGFkdmFuY2VkCisgIC8vLyAgICAgYnkgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBieXRlcyBpZiB0aGUgdmFsdWUgaXMgZXh0cmFjdGVkCisgIC8vLyAgICAgY29ycmVjdGx5LiBJZiB0aGUgb2Zmc2V0IGlzIG91dCBvZiBib3VuZHMgb3IgdGhlcmUgYXJlIG5vdAorICAvLy8gICAgIGVub3VnaCBieXRlcyB0byBleHRyYWN0IHRoaXMgdmFsdWUsIHRoZSBvZmZzZXQgd2lsbCBiZSBsZWZ0CisgIC8vLyAgICAgdW5tb2RpZmllZC4KKyAgLy8vCisgIC8vLyBAcmV0dXJuCisgIC8vLyAgICAgVGhlIGV4dHJhY3RlZCB1aW50MTZfdCB2YWx1ZS4KKyAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdWludDE2X3QgZ2V0VTE2KHVpbnQzMl90ICpvZmZzZXRfcHRyKSBjb25zdDsKKworICAvLy8gRXh0cmFjdCBcYSBjb3VudCB1aW50MTZfdCB2YWx1ZXMgZnJvbSBcYSAqb2Zmc2V0X3B0ci4KKyAgLy8vCisgIC8vLyBFeHRyYWN0IFxhIGNvdW50IHVpbnQxNl90IHZhbHVlcyBmcm9tIHRoZSBiaW5hcnkgZGF0YSBhdCB0aGUKKyAgLy8vIG9mZnNldCBwb2ludGVkIHRvIGJ5IFxhIG9mZnNldF9wdHIsIGFuZCBhZHZhbmNlIHRoZSBvZmZzZXQgb24KKyAgLy8vIHN1Y2Nlc3MuIFRoZSBleHRyYWN0ZWQgdmFsdWVzIGFyZSBjb3BpZWQgaW50byBcYSBkc3QuCisgIC8vLworICAvLy8gQHBhcmFtW2luLG91dF0gb2Zmc2V0X3B0cgorICAvLy8gICAgIEEgcG9pbnRlciB0byBhbiBvZmZzZXQgd2l0aGluIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSBhZHZhbmNlZAorICAvLy8gICAgIGJ5IHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYnl0ZXMgaWYgdGhlIHZhbHVlIGlzIGV4dHJhY3RlZAorICAvLy8gICAgIGNvcnJlY3RseS4gSWYgdGhlIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzIG9yIHRoZXJlIGFyZSBub3QKKyAgLy8vICAgICBlbm91Z2ggYnl0ZXMgdG8gZXh0cmFjdCB0aGlzIHZhbHVlLCB0aGUgb2Zmc2V0IHdpbGwgYmUgbGVmdAorICAvLy8gICAgIHVubW9kaWZpZWQuCisgIC8vLworICAvLy8gQHBhcmFtW291dF0gZHN0CisgIC8vLyAgICAgQSBidWZmZXIgdG8gY29weSBcYSBjb3VudCB1aW50MTZfdCB2YWx1ZXMgaW50by4gXGEgZHN0IG11c3QKKyAgLy8vICAgICBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgcmVxdWVzdGVkIGRhdGEuCisgIC8vLworICAvLy8gQHBhcmFtW2luXSBjb3VudAorICAvLy8gICAgIFRoZSBudW1iZXIgb2YgdWludDE2X3QgdmFsdWVzIHRvIGV4dHJhY3QuCisgIC8vLworICAvLy8gQHJldHVybgorICAvLy8gICAgIFxhIGRzdCBpZiBhbGwgdmFsdWVzIHdlcmUgcHJvcGVybHkgZXh0cmFjdGVkIGFuZCBjb3BpZWQsCisgIC8vLyAgICAgTlVMTCBvdGhlcmlzZS4KKyAgdWludDE2X3QgKmdldFUxNih1aW50MzJfdCAqb2Zmc2V0X3B0ciwgdWludDE2X3QgKmRzdCwgdWludDMyX3QgY291bnQpIGNvbnN0OworCisgIC8vLyBFeHRyYWN0IGEgMjQtYml0IHVuc2lnbmVkIHZhbHVlIGZyb20gXGEgKm9mZnNldF9wdHIgYW5kIHJldHVybiBpdAorICAvLy8gaW4gYSB1aW50MzJfdC4KKyAgLy8vCisgIC8vLyBFeHRyYWN0IDMgYnl0ZXMgZnJvbSB0aGUgYmluYXJ5IGRhdGEgYXQgdGhlIG9mZnNldCBwb2ludGVkIHRvIGJ5CisgIC8vLyBcYSBvZmZzZXRfcHRyLCBjb25zdHJ1Y3QgYSB1aW50MzJfdCBmcm9tIHRoZW0gYW5kIHVwZGF0ZSB0aGUgb2Zmc2V0CisgIC8vLyBvbiBzdWNjZXNzLgorICAvLy8KKyAgLy8vIEBwYXJhbVtpbixvdXRdIG9mZnNldF9wdHIKKyAgLy8vICAgICBBIHBvaW50ZXIgdG8gYW4gb2Zmc2V0IHdpdGhpbiB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgYWR2YW5jZWQKKyAgLy8vICAgICBieSB0aGUgMyBieXRlcyBpZiB0aGUgdmFsdWUgaXMgZXh0cmFjdGVkIGNvcnJlY3RseS4gSWYgdGhlIG9mZnNldAorICAvLy8gICAgIGlzIG91dCBvZiBib3VuZHMgb3IgdGhlcmUgYXJlIG5vdCBlbm91Z2ggYnl0ZXMgdG8gZXh0cmFjdCB0aGlzIHZhbHVlLAorICAvLy8gICAgIHRoZSBvZmZzZXQgd2lsbCBiZSBsZWZ0IHVubW9kaWZpZWQuCisgIC8vLworICAvLy8gQHJldHVybgorICAvLy8gICAgIFRoZSBleHRyYWN0ZWQgMjQtYml0IHZhbHVlIHJlcHJlc2VudGVkIGluIGEgdWludDMyX3QuCisgIHVpbnQzMl90IGdldFUyNCh1aW50MzJfdCAqb2Zmc2V0X3B0cikgY29uc3Q7CisKKyAgLy8vIEV4dHJhY3QgYSB1aW50MzJfdCB2YWx1ZSBmcm9tIFxhICpvZmZzZXRfcHRyLgorICAvLy8KKyAgLy8vIEV4dHJhY3QgYSBzaW5nbGUgdWludDMyX3QgZnJvbSB0aGUgYmluYXJ5IGRhdGEgYXQgdGhlIG9mZnNldAorICAvLy8gcG9pbnRlZCB0byBieSBcYSBvZmZzZXRfcHRyLCBhbmQgdXBkYXRlIHRoZSBvZmZzZXQgb24gc3VjY2Vzcy4KKyAgLy8vCisgIC8vLyBAcGFyYW1baW4sb3V0XSBvZmZzZXRfcHRyCisgIC8vLyAgICAgQSBwb2ludGVyIHRvIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRhdGEgdGhhdCB3aWxsIGJlIGFkdmFuY2VkCisgIC8vLyAgICAgYnkgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBieXRlcyBpZiB0aGUgdmFsdWUgaXMgZXh0cmFjdGVkCisgIC8vLyAgICAgY29ycmVjdGx5LiBJZiB0aGUgb2Zmc2V0IGlzIG91dCBvZiBib3VuZHMgb3IgdGhlcmUgYXJlIG5vdAorICAvLy8gICAgIGVub3VnaCBieXRlcyB0byBleHRyYWN0IHRoaXMgdmFsdWUsIHRoZSBvZmZzZXQgd2lsbCBiZSBsZWZ0CisgIC8vLyAgICAgdW5tb2RpZmllZC4KKyAgLy8vCisgIC8vLyBAcmV0dXJuCisgIC8vLyAgICAgVGhlIGV4dHJhY3RlZCB1aW50MzJfdCB2YWx1ZS4KKyAgdWludDMyX3QgZ2V0VTMyKHVpbnQzMl90ICpvZmZzZXRfcHRyKSBjb25zdDsKKworICAvLy8gRXh0cmFjdCBcYSBjb3VudCB1aW50MzJfdCB2YWx1ZXMgZnJvbSBcYSAqb2Zmc2V0X3B0ci4KKyAgLy8vCisgIC8vLyBFeHRyYWN0IFxhIGNvdW50IHVpbnQzMl90IHZhbHVlcyBmcm9tIHRoZSBiaW5hcnkgZGF0YSBhdCB0aGUKKyAgLy8vIG9mZnNldCBwb2ludGVkIHRvIGJ5IFxhIG9mZnNldF9wdHIsIGFuZCBhZHZhbmNlIHRoZSBvZmZzZXQgb24KKyAgLy8vIHN1Y2Nlc3MuIFRoZSBleHRyYWN0ZWQgdmFsdWVzIGFyZSBjb3BpZWQgaW50byBcYSBkc3QuCisgIC8vLworICAvLy8gQHBhcmFtW2luLG91dF0gb2Zmc2V0X3B0cgorICAvLy8gICAgIEEgcG9pbnRlciB0byBhbiBvZmZzZXQgd2l0aGluIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSBhZHZhbmNlZAorICAvLy8gICAgIGJ5IHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYnl0ZXMgaWYgdGhlIHZhbHVlIGlzIGV4dHJhY3RlZAorICAvLy8gICAgIGNvcnJlY3RseS4gSWYgdGhlIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzIG9yIHRoZXJlIGFyZSBub3QKKyAgLy8vICAgICBlbm91Z2ggYnl0ZXMgdG8gZXh0cmFjdCB0aGlzIHZhbHVlLCB0aGUgb2Zmc2V0IHdpbGwgYmUgbGVmdAorICAvLy8gICAgIHVubW9kaWZpZWQuCisgIC8vLworICAvLy8gQHBhcmFtW291dF0gZHN0CisgIC8vLyAgICAgQSBidWZmZXIgdG8gY29weSBcYSBjb3VudCB1aW50MzJfdCB2YWx1ZXMgaW50by4gXGEgZHN0IG11c3QKKyAgLy8vICAgICBiZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgcmVxdWVzdGVkIGRhdGEuCisgIC8vLworICAvLy8gQHBhcmFtW2luXSBjb3VudAorICAvLy8gICAgIFRoZSBudW1iZXIgb2YgdWludDMyX3QgdmFsdWVzIHRvIGV4dHJhY3QuCisgIC8vLworICAvLy8gQHJldHVybgorICAvLy8gICAgIFxhIGRzdCBpZiBhbGwgdmFsdWVzIHdlcmUgcHJvcGVybHkgZXh0cmFjdGVkIGFuZCBjb3BpZWQsCisgIC8vLyAgICAgTlVMTCBvdGhlcmlzZS4KKyAgdWludDMyX3QgKmdldFUzMih1aW50MzJfdCAqb2Zmc2V0X3B0ciwgdWludDMyX3QgKmRzdCwgdWludDMyX3QgY291bnQpIGNvbnN0OworCisgIC8vLyBFeHRyYWN0IGEgdWludDY0X3QgdmFsdWUgZnJvbSBcYSAqb2Zmc2V0X3B0ci4KKyAgLy8vCisgIC8vLyBFeHRyYWN0IGEgc2luZ2xlIHVpbnQ2NF90IGZyb20gdGhlIGJpbmFyeSBkYXRhIGF0IHRoZSBvZmZzZXQKKyAgLy8vIHBvaW50ZWQgdG8gYnkgXGEgb2Zmc2V0X3B0ciwgYW5kIHVwZGF0ZSB0aGUgb2Zmc2V0IG9uIHN1Y2Nlc3MuCisgIC8vLworICAvLy8gQHBhcmFtW2luLG91dF0gb2Zmc2V0X3B0cgorICAvLy8gICAgIEEgcG9pbnRlciB0byBhbiBvZmZzZXQgd2l0aGluIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSBhZHZhbmNlZAorICAvLy8gICAgIGJ5IHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYnl0ZXMgaWYgdGhlIHZhbHVlIGlzIGV4dHJhY3RlZAorICAvLy8gICAgIGNvcnJlY3RseS4gSWYgdGhlIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzIG9yIHRoZXJlIGFyZSBub3QKKyAgLy8vICAgICBlbm91Z2ggYnl0ZXMgdG8gZXh0cmFjdCB0aGlzIHZhbHVlLCB0aGUgb2Zmc2V0IHdpbGwgYmUgbGVmdAorICAvLy8gICAgIHVubW9kaWZpZWQuCisgIC8vLworICAvLy8gQHJldHVybgorICAvLy8gICAgIFRoZSBleHRyYWN0ZWQgdWludDY0X3QgdmFsdWUuCisgIHVpbnQ2NF90IGdldFU2NCh1aW50MzJfdCAqb2Zmc2V0X3B0cikgY29uc3Q7CisKKyAgLy8vIEV4dHJhY3QgXGEgY291bnQgdWludDY0X3QgdmFsdWVzIGZyb20gXGEgKm9mZnNldF9wdHIuCisgIC8vLworICAvLy8gRXh0cmFjdCBcYSBjb3VudCB1aW50NjRfdCB2YWx1ZXMgZnJvbSB0aGUgYmluYXJ5IGRhdGEgYXQgdGhlCisgIC8vLyBvZmZzZXQgcG9pbnRlZCB0byBieSBcYSBvZmZzZXRfcHRyLCBhbmQgYWR2YW5jZSB0aGUgb2Zmc2V0IG9uCisgIC8vLyBzdWNjZXNzLiBUaGUgZXh0cmFjdGVkIHZhbHVlcyBhcmUgY29waWVkIGludG8gXGEgZHN0LgorICAvLy8KKyAgLy8vIEBwYXJhbVtpbixvdXRdIG9mZnNldF9wdHIKKyAgLy8vICAgICBBIHBvaW50ZXIgdG8gYW4gb2Zmc2V0IHdpdGhpbiB0aGUgZGF0YSB0aGF0IHdpbGwgYmUgYWR2YW5jZWQKKyAgLy8vICAgICBieSB0aGUgYXBwcm9wcmlhdGUgbnVtYmVyIG9mIGJ5dGVzIGlmIHRoZSB2YWx1ZSBpcyBleHRyYWN0ZWQKKyAgLy8vICAgICBjb3JyZWN0bHkuIElmIHRoZSBvZmZzZXQgaXMgb3V0IG9mIGJvdW5kcyBvciB0aGVyZSBhcmUgbm90CisgIC8vLyAgICAgZW5vdWdoIGJ5dGVzIHRvIGV4dHJhY3QgdGhpcyB2YWx1ZSwgdGhlIG9mZnNldCB3aWxsIGJlIGxlZnQKKyAgLy8vICAgICB1bm1vZGlmaWVkLgorICAvLy8KKyAgLy8vIEBwYXJhbVtvdXRdIGRzdAorICAvLy8gICAgIEEgYnVmZmVyIHRvIGNvcHkgXGEgY291bnQgdWludDY0X3QgdmFsdWVzIGludG8uIFxhIGRzdCBtdXN0CisgIC8vLyAgICAgYmUgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgYWxsIHJlcXVlc3RlZCBkYXRhLgorICAvLy8KKyAgLy8vIEBwYXJhbVtpbl0gY291bnQKKyAgLy8vICAgICBUaGUgbnVtYmVyIG9mIHVpbnQ2NF90IHZhbHVlcyB0byBleHRyYWN0LgorICAvLy8KKyAgLy8vIEByZXR1cm4KKyAgLy8vICAgICBcYSBkc3QgaWYgYWxsIHZhbHVlcyB3ZXJlIHByb3Blcmx5IGV4dHJhY3RlZCBhbmQgY29waWVkLAorICAvLy8gICAgIE5VTEwgb3RoZXJpc2UuCisgIHVpbnQ2NF90ICpnZXRVNjQodWludDMyX3QgKm9mZnNldF9wdHIsIHVpbnQ2NF90ICpkc3QsIHVpbnQzMl90IGNvdW50KSBjb25zdDsKKworICAvLy8gRXh0cmFjdCBhIHNpZ25lZCBMRUIxMjggdmFsdWUgZnJvbSBcYSAqb2Zmc2V0X3B0ci4KKyAgLy8vCisgIC8vLyBFeHRyYWN0cyBhbiBzaWduZWQgTEVCMTI4IG51bWJlciBmcm9tIHRoaXMgb2JqZWN0J3MgZGF0YQorICAvLy8gc3RhcnRpbmcgYXQgdGhlIG9mZnNldCBwb2ludGVkIHRvIGJ5IFxhIG9mZnNldF9wdHIuIFRoZSBvZmZzZXQKKyAgLy8vIHBvaW50ZWQgdG8gYnkgXGEgb2Zmc2V0X3B0ciB3aWxsIGJlIHVwZGF0ZWQgd2l0aCB0aGUgb2Zmc2V0IG9mCisgIC8vLyB0aGUgYnl0ZSBmb2xsb3dpbmcgdGhlIGxhc3QgZXh0cmFjdGVkIGJ5dGUuCisgIC8vLworICAvLy8gQHBhcmFtW2luLG91dF0gb2Zmc2V0X3B0cgorICAvLy8gICAgIEEgcG9pbnRlciB0byBhbiBvZmZzZXQgd2l0aGluIHRoZSBkYXRhIHRoYXQgd2lsbCBiZSBhZHZhbmNlZAorICAvLy8gICAgIGJ5IHRoZSBhcHByb3ByaWF0ZSBudW1iZXIgb2YgYnl0ZXMgaWYgdGhlIHZhbHVlIGlzIGV4dHJhY3RlZAorICAvLy8gICAgIGNvcnJlY3RseS4gSWYgdGhlIG9mZnNldCBpcyBvdXQgb2YgYm91bmRzIG9yIHRoZXJlIGFyZSBub3QKKyAgLy8vICAgICBlbm91Z2ggYnl0ZXMgdG8gZXh0cmFjdCB0aGlzIHZhbHVlLCB0aGUgb2Zmc2V0IHdpbGwgYmUgbGVmdAorICAvLy8gICAgIHVubW9kaWZpZWQuCisgIC8vLworICAvLy8gQHJldHVybgorICAvLy8gICAgIFRoZSBleHRyYWN0ZWQgc2lnbmVkIGludGVnZXIgdmFsdWUuCisgIGludDY0X3QgZ2V0U0xFQjEyOCh1aW50MzJfdCAqb2Zmc2V0X3B0cikgY29uc3Q7CisKKyAgLy8vIEV4dHJhY3QgYSB1bnNpZ25lZCBMRUIxMjggdmFsdWUgZnJvbSBcYSAqb2Zmc2V0X3B0ci4KKyAgLy8vCisgIC8vLyBFeHRyYWN0cyBhbiB1bnNpZ25lZCBMRUIxMjggbnVtYmVyIGZyb20gdGhpcyBvYmplY3QncyBkYXRhCisgIC8vLyBzdGFydGluZyBhdCB0aGUgb2Zmc2V0IHBvaW50ZWQgdG8gYnkgXGEgb2Zmc2V0X3B0ci4gVGhlIG9mZnNldAorICAvLy8gcG9pbnRlZCB0byBieSBcYSBvZmZzZXRfcHRyIHdpbGwgYmUgdXBkYXRlZCB3aXRoIHRoZSBvZmZzZXQgb2YKKyAgLy8vIHRoZSBieXRlIGZvbGxvd2luZyB0aGUgbGFzdCBleHRyYWN0ZWQgYnl0ZS4KKyAgLy8vCisgIC8vLyBAcGFyYW1baW4sb3V0XSBvZmZzZXRfcHRyCisgIC8vLyAgICAgQSBwb2ludGVyIHRvIGFuIG9mZnNldCB3aXRoaW4gdGhlIGRhdGEgdGhhdCB3aWxsIGJlIGFkdmFuY2VkCisgIC8vLyAgICAgYnkgdGhlIGFwcHJvcHJpYXRlIG51bWJlciBvZiBieXRlcyBpZiB0aGUgdmFsdWUgaXMgZXh0cmFjdGVkCisgIC8vLyAgICAgY29ycmVjdGx5LiBJZiB0aGUgb2Zmc2V0IGlzIG91dCBvZiBib3VuZHMgb3IgdGhlcmUgYXJlIG5vdAorICAvLy8gICAgIGVub3VnaCBieXRlcyB0byBleHRyYWN0IHRoaXMgdmFsdWUsIHRoZSBvZmZzZXQgd2lsbCBiZSBsZWZ0CisgIC8vLyAgICAgdW5tb2RpZmllZC4KKyAgLy8vCisgIC8vLyBAcmV0dXJuCisgIC8vLyAgICAgVGhlIGV4dHJhY3RlZCB1bnNpZ25lZCBpbnRlZ2VyIHZhbHVlLgorICB1aW50NjRfdCBnZXRVTEVCMTI4KHVpbnQzMl90ICpvZmZzZXRfcHRyKSBjb25zdDsKKworICAvLy8gVGVzdCB0aGUgdmFsaWRpdHkgb2YgXGEgb2Zmc2V0LgorICAvLy8KKyAgLy8vIEByZXR1cm4KKyAgLy8vICAgICBcYiB0cnVlIGlmIFxhIG9mZnNldCBpcyBhIHZhbGlkIG9mZnNldCBpbnRvIHRoZSBkYXRhIGluIHRoaXMKKyAgLy8vICAgICBvYmplY3QsIFxiIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBpc1ZhbGlkT2Zmc2V0KHVpbnQzMl90IG9mZnNldCkgY29uc3QgeyByZXR1cm4gRGF0YS5zaXplKCkgPiBvZmZzZXQ7IH0KKworICAvLy8gVGVzdCB0aGUgYXZhaWxhYmlsaXR5IG9mIFxhIGxlbmd0aCBieXRlcyBvZiBkYXRhIGZyb20gXGEgb2Zmc2V0LgorICAvLy8KKyAgLy8vIEByZXR1cm4KKyAgLy8vICAgICBcYiB0cnVlIGlmIFxhIG9mZnNldCBpcyBhIHZhbGlkIG9mZnNldCBhbmQgdGhlcmUgYXJlIFxhCisgIC8vLyAgICAgbGVuZ3RoIGJ5dGVzIGF2YWlsYWJsZSBhdCB0aGF0IG9mZnNldCwgXGIgZmFsc2Ugb3RoZXJ3aXNlLgorICBib29sIGlzVmFsaWRPZmZzZXRGb3JEYXRhT2ZTaXplKHVpbnQzMl90IG9mZnNldCwgdWludDMyX3QgbGVuZ3RoKSBjb25zdCB7CisgICAgcmV0dXJuIG9mZnNldCArIGxlbmd0aCA+PSBvZmZzZXQgJiYgaXNWYWxpZE9mZnNldChvZmZzZXQgKyBsZW5ndGggLSAxKTsKKyAgfQorCisgIC8vLyBUZXN0IHRoZSBhdmFpbGFiaWxpdHkgb2YgZW5vdWdoIGJ5dGVzIG9mIGRhdGEgZm9yIGEgcG9pbnRlciBmcm9tCisgIC8vLyBcYSBvZmZzZXQuIFRoZSBzaXplIG9mIGEgcG9pbnRlciBpcyBcYSBnZXRBZGRyZXNzU2l6ZSgpLgorICAvLy8KKyAgLy8vIEByZXR1cm4KKyAgLy8vICAgICBcYiB0cnVlIGlmIFxhIG9mZnNldCBpcyBhIHZhbGlkIG9mZnNldCBhbmQgdGhlcmUgYXJlIGVub3VnaAorICAvLy8gICAgIGJ5dGVzIGZvciBhIHBvaW50ZXIgYXZhaWxhYmxlIGF0IHRoYXQgb2Zmc2V0LCBcYiBmYWxzZQorICAvLy8gICAgIG90aGVyd2lzZS4KKyAgYm9vbCBpc1ZhbGlkT2Zmc2V0Rm9yQWRkcmVzcyh1aW50MzJfdCBvZmZzZXQpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNWYWxpZE9mZnNldEZvckRhdGFPZlNpemUob2Zmc2V0LCBBZGRyZXNzU2l6ZSk7CisgIH0KK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ2MGE1YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaApAQCAtMCwwICsxLDE3IEBACisvLz09PS0tIGxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCAtIERlZmluZSBmaXhlZCBzaXplIHR5cGVzIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIER1ZSB0byBsYXllcmluZyBjb25zdHJhaW50cyAoU3VwcG9ydCBkZXBlbmRzIG9uIGxsdm0tYykgdGhpcyBpcyBhIHRoaW4KKy8vIHdyYXBwZXIgYXJvdW5kIHRoZSBpbXBsZW1lbnRhdGlvbiB0aGF0IGxpdmVzIGluIGxsdm0tYywgdGhvdWdoIG1vc3QgY2xpZW50cworLy8gY2FuL3Nob3VsZCB0aGluayBvZiB0aGlzIGFzIGJlaW5nIHByb3ZpZGVkIGJ5IFN1cHBvcnQgZm9yIHNpbXBsaWNpdHkgKG5vdAorLy8gbWFueSBjbGllbnRzIGFyZSBhd2FyZSBvZiB0aGVpciBkZXBlbmRlbmN5IG9uIGxsdm0tYykuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgImxsdm0tYy9EYXRhVHlwZXMuaCIKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9EZWJ1Zy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhlOWUxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9EZWJ1Zy5oCkBAIC0wLDAgKzEsMTIyIEBACisvLz09PS0gbGx2bS9TdXBwb3J0L0RlYnVnLmggLSBFYXN5IHdheSB0byBhZGQgZGVidWcgb3V0cHV0IC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgaGFuZHkgd2F5IG9mIGFkZGluZyBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gdG8geW91cgorLy8gY29kZSwgd2l0aG91dCBpdCBiZWluZyBlbmFibGVkIGFsbCBvZiB0aGUgdGltZSwgYW5kIHdpdGhvdXQgaGF2aW5nIHRvIGFkZAorLy8gY29tbWFuZCBsaW5lIG9wdGlvbnMgdG8gZW5hYmxlIGl0LgorLy8KKy8vIEluIHBhcnRpY3VsYXIsIGp1c3Qgd3JhcCB5b3VyIGNvZGUgd2l0aCB0aGUgREVCVUcoKSBtYWNybywgYW5kIGl0IHdpbGwgYmUKKy8vIGVuYWJsZWQgYXV0b21hdGljYWxseSBpZiB5b3Ugc3BlY2lmeSAnLWRlYnVnJyBvbiB0aGUgY29tbWFuZC1saW5lLgorLy8gREVCVUcoKSByZXF1aXJlcyB0aGUgREVCVUdfVFlQRSBtYWNybyB0byBiZSBkZWZpbmVkLiBTZXQgaXQgdG8gImZvbyIgc3BlY2lmeQorLy8gdGhhdCB5b3VyIGRlYnVnIGNvZGUgYmVsb25ncyB0byBjbGFzcyAiZm9vIi4gQmUgY2FyZWZ1bCB0aGF0IHlvdSBvbmx5IGRvCisvLyB0aGlzIGFmdGVyIGluY2x1ZGluZyBEZWJ1Zy5oIGFuZCBub3QgYXJvdW5kIGFueSAjaW5jbHVkZSBvZiBoZWFkZXJzLiBIZWFkZXJzCisvLyBzaG91bGQgZGVmaW5lIGFuZCB1bmRlZiB0aGUgbWFjcm8gYWNyb3VuZCB0aGUgY29kZSB0aGF0IG5lZWRzIHRvIHVzZSB0aGUKKy8vIERFQlVHKCkgbWFjcm8uIFRoZW4sIG9uIHRoZSBjb21tYW5kIGxpbmUsIHlvdSBjYW4gc3BlY2lmeSAnLWRlYnVnLW9ubHk9Zm9vJworLy8gdG8gZW5hYmxlIEpVU1QgdGhlIGRlYnVnIGluZm9ybWF0aW9uIGZvciB0aGUgZm9vIGNsYXNzLgorLy8KKy8vIFdoZW4gY29tcGlsaW5nIHdpdGhvdXQgYXNzZXJ0aW9ucywgdGhlIC1kZWJ1Zy0qIG9wdGlvbnMgYW5kIGFsbCBjb2RlIGluCisvLyBERUJVRygpIHN0YXRlbWVudHMgZGlzYXBwZWFycywgc28gaXQgZG9lcyBub3QgYWZmZWN0IHRoZSBydW50aW1lIG9mIHRoZSBjb2RlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0RFQlVHX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0RFQlVHX0gKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKKworI2lmbmRlZiBOREVCVUcKKworLy8vIGlzQ3VycmVudERlYnVnVHlwZSAtIFJldHVybiB0cnVlIGlmIHRoZSBzcGVjaWZpZWQgc3RyaW5nIGlzIHRoZSBkZWJ1ZyB0eXBlCisvLy8gc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUsIG9yIGlmIG5vbmUgd2FzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lCisvLy8gd2l0aCB0aGUgLWRlYnVnLW9ubHk9WCBvcHRpb24uCisvLy8KK2Jvb2wgaXNDdXJyZW50RGVidWdUeXBlKGNvbnN0IGNoYXIgKlR5cGUpOworCisvLy8gc2V0Q3VycmVudERlYnVnVHlwZSAtIFNldCB0aGUgY3VycmVudCBkZWJ1ZyB0eXBlLCBhcyBpZiB0aGUgLWRlYnVnLW9ubHk9WAorLy8vIG9wdGlvbiB3ZXJlIHNwZWNpZmllZC4gIE5vdGUgdGhhdCBEZWJ1Z0ZsYWcgYWxzbyBuZWVkcyB0byBiZSBzZXQgdG8gdHJ1ZSBmb3IKKy8vLyBkZWJ1ZyBvdXRwdXQgdG8gYmUgcHJvZHVjZWQuCisvLy8KK3ZvaWQgc2V0Q3VycmVudERlYnVnVHlwZShjb25zdCBjaGFyICpUeXBlKTsKKworLy8vIHNldEN1cnJlbnREZWJ1Z1R5cGVzIC0gU2V0IHRoZSBjdXJyZW50IGRlYnVnIHR5cGUsIGFzIGlmIHRoZQorLy8vIC1kZWJ1Zy1vbmx5PVgsWSxaIG9wdGlvbiB3ZXJlIHNwZWNpZmllZC4gTm90ZSB0aGF0IERlYnVnRmxhZworLy8vIGFsc28gbmVlZHMgdG8gYmUgc2V0IHRvIHRydWUgZm9yIGRlYnVnIG91dHB1dCB0byBiZSBwcm9kdWNlZC4KKy8vLwordm9pZCBzZXRDdXJyZW50RGVidWdUeXBlcyhjb25zdCBjaGFyICoqVHlwZXMsIHVuc2lnbmVkIENvdW50KTsKKworLy8vIERFQlVHX1dJVEhfVFlQRSBtYWNybyAtIFRoaXMgbWFjcm8gc2hvdWxkIGJlIHVzZWQgYnkgcGFzc2VzIHRvIGVtaXQgZGVidWcKKy8vLyBpbmZvcm1hdGlvbi4gIEluIHRoZSAnLWRlYnVnJyBvcHRpb24gaXMgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kbGluZSwgYW5kIGlmCisvLy8gdGhpcyBpcyBhIGRlYnVnIGJ1aWxkLCB0aGVuIHRoZSBjb2RlIHNwZWNpZmllZCBhcyB0aGUgb3B0aW9uIHRvIHRoZSBtYWNybworLy8vIHdpbGwgYmUgZXhlY3V0ZWQuICBPdGhlcndpc2UgaXQgd2lsbCBub3QgYmUuICBFeGFtcGxlOgorLy8vCisvLy8gREVCVUdfV0lUSF9UWVBFKCJiaXRzZXQiLCBkYmdzKCkgPDwgIkJpdHNldCBjb250YWluczogIiA8PCBCaXRzZXQgPDwgIlxuIik7CisvLy8KKy8vLyBUaGlzIHdpbGwgZW1pdCB0aGUgZGVidWcgaW5mb3JtYXRpb24gaWYgLWRlYnVnIGlzIHByZXNlbnQsIGFuZCAtZGVidWctb25seQorLy8vIGlzIG5vdCBzcGVjaWZpZWQsIG9yIGlzIHNwZWNpZmllZCBhcyAiYml0c2V0Ii4KKyNkZWZpbmUgREVCVUdfV0lUSF9UWVBFKFRZUEUsIFgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZG8geyBpZiAoOjpsbHZtOjpEZWJ1Z0ZsYWcgJiYgOjpsbHZtOjppc0N1cnJlbnREZWJ1Z1R5cGUoVFlQRSkpIHsgWDsgfSBcCisgIH0gd2hpbGUgKGZhbHNlKQorCisjZWxzZQorI2RlZmluZSBpc0N1cnJlbnREZWJ1Z1R5cGUoWCkgKGZhbHNlKQorI2RlZmluZSBzZXRDdXJyZW50RGVidWdUeXBlKFgpCisjZGVmaW5lIHNldEN1cnJlbnREZWJ1Z1R5cGVzKFgsIE4pCisjZGVmaW5lIERFQlVHX1dJVEhfVFlQRShUWVBFLCBYKSBkbyB7IH0gd2hpbGUgKGZhbHNlKQorI2VuZGlmCisKKy8vLyBUaGlzIGJvb2xlYW4gaXMgc2V0IHRvIHRydWUgaWYgdGhlICctZGVidWcnIGNvbW1hbmQgbGluZSBvcHRpb24KKy8vLyBpcyBzcGVjaWZpZWQuICBUaGlzIHNob3VsZCBwcm9iYWJseSBub3QgYmUgcmVmZXJlbmNlZCBkaXJlY3RseSwgaW5zdGVhZCwgdXNlCisvLy8gdGhlIERFQlVHIG1hY3JvIGJlbG93LgorLy8vCitleHRlcm4gYm9vbCBEZWJ1Z0ZsYWc7CisKKy8vLyBcbmFtZSBWZXJpZmljYXRpb24gZmxhZ3MuCisvLy8KKy8vLyBUaGVzZSBmbGFncyB0dXJucyBvbi9vZmYgdGhhdCBhcmUgZXhwZW5zaXZlIGFuZCBhcmUgdHVybmVkIG9mZiBieSBkZWZhdWx0LAorLy8vIHVubGVzcyBtYWNybyBFWFBFTlNJVkVfQ0hFQ0tTIGlzIGRlZmluZWQuIFRoZSBmbGFncyBhbGxvdyBzZWxlY3RpdmVseQorLy8vIHR1cm5pbmcgdGhlIGNoZWNrcyBvbiB3aXRob3V0IG5lZWQgdG8gcmVjb21waWxlLgorLy8vIFx7CisKKy8vLyBFbmFibGVzIHZlcmlmaWNhdGlvbiBvZiBkb21pbmF0b3IgdHJlZXMuCisvLy8KK2V4dGVybiBib29sIFZlcmlmeURvbUluZm87CisKKy8vLyBFbmFibGVzIHZlcmlmaWNhdGlvbiBvZiBsb29wIGluZm8uCisvLy8KK2V4dGVybiBib29sIFZlcmlmeUxvb3BJbmZvOworCisvLy9cfQorCisvLy8gRW5hYmxlRGVidWdCdWZmZXJpbmcgLSBUaGlzIGRlZmF1bHRzIHRvIGZhbHNlLiAgSWYgdHJ1ZSwgdGhlIGRlYnVnCisvLy8gc3RyZWFtIHdpbGwgaW5zdGFsbCBzaWduYWwgaGFuZGxlcnMgdG8gZHVtcCBhbnkgYnVmZmVyZWQgZGVidWcKKy8vLyBvdXRwdXQuICBJdCBhbGxvd3MgY2xpZW50cyB0byBzZWxlY3RpdmVseSBhbGxvdyB0aGUgZGVidWcgc3RyZWFtCisvLy8gdG8gaW5zdGFsbCBzaWduYWwgaGFuZGxlcnMgaWYgdGhleSBhcmUgY2VydGFpbiB0aGVyZSB3aWxsIGJlIG5vCisvLy8gY29uZmxpY3QuCisvLy8KK2V4dGVybiBib29sIEVuYWJsZURlYnVnQnVmZmVyaW5nOworCisvLy8gZGJncygpIC0gVGhpcyByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgcmF3X29zdHJlYW0gZm9yIGRlYnVnZ2luZworLy8vIG1lc3NhZ2VzLiAgSWYgZGVidWdnaW5nIGlzIGRpc2FibGVkIGl0IHJldHVybnMgZXJycygpLiAgVXNlIGl0CisvLy8gbGlrZTogZGJncygpIDw8ICJmb28iIDw8ICJiYXIiOworcmF3X29zdHJlYW0gJmRiZ3MoKTsKKworLy8gREVCVUcgbWFjcm8gLSBUaGlzIG1hY3JvIHNob3VsZCBiZSB1c2VkIGJ5IHBhc3NlcyB0byBlbWl0IGRlYnVnIGluZm9ybWF0aW9uLgorLy8gSW4gdGhlICctZGVidWcnIG9wdGlvbiBpcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmRsaW5lLCBhbmQgaWYgdGhpcyBpcyBhCisvLyBkZWJ1ZyBidWlsZCwgdGhlbiB0aGUgY29kZSBzcGVjaWZpZWQgYXMgdGhlIG9wdGlvbiB0byB0aGUgbWFjcm8gd2lsbCBiZQorLy8gZXhlY3V0ZWQuICBPdGhlcndpc2UgaXQgd2lsbCBub3QgYmUuICBFeGFtcGxlOgorLy8KKy8vIERFQlVHKGRiZ3MoKSA8PCAiQml0c2V0IGNvbnRhaW5zOiAiIDw8IEJpdHNldCA8PCAiXG4iKTsKKy8vCisjZGVmaW5lIERFQlVHKFgpIERFQlVHX1dJVEhfVFlQRShERUJVR19UWVBFLCBYKQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0RFQlVHX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9EZWJ1Z0NvdW50ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9EZWJ1Z0NvdW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MmUxYmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0RlYnVnQ291bnRlci5oCkBAIC0wLDAgKzEsMTY1IEBACisvLz09PS0gbGx2bS9TdXBwb3J0L0RlYnVnQ291bnRlci5oIC0gRGVidWcgY291bnRlciBzdXBwb3J0IC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gXGJyaWVmIFRoaXMgZmlsZSBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBkZWJ1ZyBjb3VudGVycy4gIERlYnVnCisvLy8gY291bnRlcnMgYXJlIGEgdG9vbCB0aGF0IGxldCB5b3UgbmFycm93IGRvd24gYSBtaXNjb21waWxhdGlvbiB0byBhIHNwZWNpZmljCisvLy8gdGhpbmcgaGFwcGVuaW5nLgorLy8vCisvLy8gVG8gZ2l2ZSBhIHVzZSBjYXNlOiBJbWFnaW5lIHlvdSBoYXZlIGEgZmlsZSwgdmVyeSBsYXJnZSwgYW5kIHlvdQorLy8vIGFyZSB0cnlpbmcgdG8gdW5kZXJzdGFuZCB0aGUgbWluaW1hbCB0cmFuc2Zvcm1hdGlvbiB0aGF0IGJyZWFrcyBpdC4gQnVncG9pbnQKKy8vLyBhbmQgYmlzZWN0aW9uIGlzIG9mdGVuIGhlbHBmdWwgaGVyZSBpbiBuYXJyb3dpbmcgaXQgZG93biB0byBhIHNwZWNpZmljIHBhc3MsCisvLy8gYnV0IGl0J3Mgc3RpbGwgYSB2ZXJ5IGxhcmdlIGZpbGUsIGFuZCBhIHZlcnkgY29tcGxpY2F0ZWQgcGFzcyB0byB0cnkgdG8KKy8vLyBkZWJ1Zy4gIFRoYXQgaXMgd2hlcmUgZGVidWcgY291bnRpbmcgc3RlcHMgaW4uICBZb3UgY2FuIGluc3RydW1lbnQgdGhlIHBhc3MKKy8vLyB3aXRoIGEgZGVidWcgY291bnRlciBiZWZvcmUgaXQgZG9lcyBhIGNlcnRhaW4gdGhpbmcsIGFuZCBkZXBlbmRpbmcgb24gdGhlCisvLy8gY291bnRzLCBpdCB3aWxsIGVpdGhlciBleGVjdXRlIHRoYXQgdGhpbmcgb3Igbm90LiAgVGhlIGRlYnVnIGNvdW50ZXIgaXRzZWxmCisvLy8gY29uc2lzdHMgb2YgYSBza2lwIGFuZCBhIGNvdW50LiAgU2tpcCBpcyB0aGUgbnVtYmVyIG9mIHRpbWVzIHNob3VsZEV4ZWN1dGUKKy8vLyBuZWVkcyB0byBiZSBjYWxsZWQgYmVmb3JlIGl0IHJldHVybnMgdHJ1ZS4gIENvdW50IGlzIHRoZSBudW1iZXIgb2YgdGltZXMgdG8KKy8vLyByZXR1cm4gdHJ1ZSBvbmNlIFNraXAgaXMgMC4gIFNvIGEgc2tpcD00NywgY291bnQ9MiAsd291bGQgc2tpcCB0aGUgZmlyc3QgNDcKKy8vLyBleGVjdXRpb25zIGJ5IHJldHVybmluZyBmYWxzZSBmcm9tIHNob3VsZEV4ZWN1dGUsIHRoZW4gZXhlY3V0ZSB0d2ljZSwgYW5kCisvLy8gdGhlbiByZXR1cm4gZmFsc2UgYWdhaW4uCisvLy8gTm90ZSB0aGF0IGEgY291bnRlciBzZXQgdG8gYSBuZWdhdGl2ZSBudW1iZXIgd2lsbCBhbHdheXMgZXhlY3V0ZS4KKy8vLyBGb3IgYSBjb25jcmV0ZSBleGFtcGxlLCBkdXJpbmcgcHJlZGljYXRlaW5mbyBjcmVhdGlvbiwgdGhlIHJlbmFtaW5nIHBhc3MKKy8vLyByZXBsYWNlcyBlYWNoIHVzZSB3aXRoIGEgcmVuYW1lZCB1c2UuCisvLy8vCisvLy8gSWYgSSB1c2UgREVCVUdfQ09VTlRFUiB0byBjcmVhdGUgYSBjb3VudGVyIGNhbGxlZCAicHJlZGljYXRlaW5mbyIsIGFuZAorLy8vIHZhcmlhYmxlIG5hbWUgUmVuYW1lQ291bnRlciwgYW5kIHRoZW4gaW5zdHJ1bWVudCB0aGlzIHJlbmFtaW5nIHdpdGggYSBkZWJ1ZworLy8vIGNvdW50ZXIsIGxpa2Ugc286CisvLy8KKy8vLyBpZiAoIURlYnVnQ291bnRlcjo6c2hvdWxkRXhlY3V0ZShSZW5hbWVDb3VudGVyKQorLy8vIDxjb250aW51ZSBvciByZXR1cm4gb3Igd2hhdGV2ZXIgbm90IGV4ZWN1dGluZyBsb29rcyBsaWtlPgorLy8vCisvLy8gTm93IEkgY2FuLCBmcm9tIHRoZSBjb21tYW5kIGxpbmUsIG1ha2UgaXQgcmVuYW1lIG9yIG5vdCByZW5hbWUgY2VydGFpbiB1c2VzCisvLy8gYnkgc2V0dGluZyB0aGUgc2tpcCBhbmQgY291bnQuCisvLy8gU28gZm9yIGV4YW1wbGUKKy8vLyBiaW4vb3B0IC1kZWJ1Zy1jb3VudGVyPXByZWRpY2F0ZWluZm8tc2tpcD00NyxwcmVkaWNhdGVpbmZvLWNvdW50PTEKKy8vLyB3aWxsIHNraXAgcmVuYW1pbmcgdGhlIGZpcnN0IDQ3IHVzZXMsIHRoZW4gcmVuYW1lIG9uZSwgdGhlbiBza2lwIHRoZSByZXN0LgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfREVCVUdDT1VOVEVSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0RFQlVHQ09VTlRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1VuaXF1ZVZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBEZWJ1Z0NvdW50ZXIgeworcHVibGljOgorICAvLy8gXGJyaWVmIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHNpbmdsZXRvbiBpbnN0YW5jZS4KKyAgc3RhdGljIERlYnVnQ291bnRlciAmaW5zdGFuY2UoKTsKKworICAvLyBVc2VkIGJ5IHRoZSBjb21tYW5kIGxpbmUgb3B0aW9uIHBhcnNlciB0byBwdXNoIGEgbmV3IHZhbHVlIGl0IHBhcnNlZC4KKyAgdm9pZCBwdXNoX2JhY2soY29uc3Qgc3RkOjpzdHJpbmcgJik7CisKKyAgLy8gUmVnaXN0ZXIgYSBjb3VudGVyIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgorICAvLworICAvLyBGSVhNRTogQ3VycmVudGx5LCBjb3VudGVyIHJlZ2lzdHJhdGlvbiBpcyByZXF1aXJlZCB0byBoYXBwZW4gYmVmb3JlIGNvbW1hbmQKKyAgLy8gbGluZSBvcHRpb24gcGFyc2luZy4gVGhlIG1haW4gcmVhc29uIHRvIHJlZ2lzdGVyIGNvdW50ZXJzIGlzIHRvIHByb2R1Y2UgYQorICAvLyBuaWNlIGxpc3Qgb2YgdGhlbSBvbiB0aGUgY29tbWFuZCBsaW5lLCBidXQgaSdtIG5vdCBzdXJlIHRoaXMgaXMgd29ydGggaXQuCisgIHN0YXRpYyB1bnNpZ25lZCByZWdpc3RlckNvdW50ZXIoU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBEZXNjKSB7CisgICAgcmV0dXJuIGluc3RhbmNlKCkuYWRkQ291bnRlcihOYW1lLCBEZXNjKTsKKyAgfQorICBpbmxpbmUgc3RhdGljIGJvb2wgc2hvdWxkRXhlY3V0ZSh1bnNpZ25lZCBDb3VudGVyTmFtZSkgeworLy8gQ29tcGlsZSB0byBub3RoaW5nIHdoZW4gZGVidWdnaW5nIGlzIG9mZgorI2lmZGVmIE5ERUJVRworICAgIHJldHVybiB0cnVlOworI2Vsc2UKKyAgICBhdXRvICZVcyA9IGluc3RhbmNlKCk7CisgICAgYXV0byBSZXN1bHQgPSBVcy5Db3VudGVycy5maW5kKENvdW50ZXJOYW1lKTsKKyAgICBpZiAoUmVzdWx0ICE9IFVzLkNvdW50ZXJzLmVuZCgpKSB7CisgICAgICBhdXRvICZDb3VudGVyUGFpciA9IFJlc3VsdC0+c2Vjb25kOworICAgICAgLy8gV2Ugb25seSBleGVjdXRlIHdoaWxlIHRoZSBza2lwIChmaXJzdCkgaXMgemVybyBhbmQgdGhlIGNvdW50IChzZWNvbmQpCisgICAgICAvLyBpcyBub24temVyby4KKyAgICAgIC8vIE5lZ2F0aXZlIGNvdW50ZXJzIGFsd2F5cyBleGVjdXRlLgorICAgICAgaWYgKENvdW50ZXJQYWlyLmZpcnN0IDwgMCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBpZiAoQ291bnRlclBhaXIuZmlyc3QgIT0gMCkgeworICAgICAgICAtLUNvdW50ZXJQYWlyLmZpcnN0OworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoQ291bnRlclBhaXIuc2Vjb25kIDwgMCkKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBpZiAoQ291bnRlclBhaXIuc2Vjb25kICE9IDApIHsKKyAgICAgICAgLS1Db3VudGVyUGFpci5zZWNvbmQ7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBEaWRuJ3QgZmluZCB0aGUgY291bnRlciwgc2hvdWxkIHdlIHdhcm4/CisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYgLy8gTkRFQlVHCisgIH0KKworICAvLyBSZXR1cm4gdHJ1ZSBpZiBhIGdpdmVuIGNvdW50ZXIgaGFkIHZhbHVlcyBzZXQgKGVpdGhlciBwcm9ncmFtYXRpY2FsbHkgb3Igb24KKyAgLy8gdGhlIGNvbW1hbmQgbGluZSkuICBUaGlzIHdpbGwgcmV0dXJuIHRydWUgZXZlbiBpZiB0aG9zZSB2YWx1ZXMgYXJlCisgIC8vIGN1cnJlbnRseSBpbiBhIHN0YXRlIHdoZXJlIHRoZSBjb3VudGVyIHdpbGwgYWx3YXlzIGV4ZWN1dGUuCisgIHN0YXRpYyBib29sIGlzQ291bnRlclNldCh1bnNpZ25lZCBJRCkgeworICAgIHJldHVybiBpbnN0YW5jZSgpLkNvdW50ZXJzLmNvdW50KElEKTsKKyAgfQorCisgIC8vIFJldHVybiB0aGUgc2tpcCBhbmQgY291bnQgZm9yIGEgY291bnRlci4gVGhpcyBvbmx5IHdvcmtzIGZvciBzZXQgY291bnRlcnMuCisgIHN0YXRpYyBzdGQ6OnBhaXI8aW50LCBpbnQ+IGdldENvdW50ZXJWYWx1ZSh1bnNpZ25lZCBJRCkgeworICAgIGF1dG8gJlVzID0gaW5zdGFuY2UoKTsKKyAgICBhdXRvIFJlc3VsdCA9IFVzLkNvdW50ZXJzLmZpbmQoSUQpOworICAgIGFzc2VydChSZXN1bHQgIT0gVXMuQ291bnRlcnMuZW5kKCkgJiYgIkFza2luZyBhYm91dCBhIG5vbi1zZXQgY291bnRlciIpOworICAgIHJldHVybiBSZXN1bHQtPnNlY29uZDsKKyAgfQorCisgIC8vIFNldCBhIHJlZ2lzdGVyZWQgY291bnRlciB0byBhIGdpdmVuIHZhbHVlLgorICBzdGF0aWMgdm9pZCBzZXRDb3VudGVyVmFsdWUodW5zaWduZWQgSUQsIGNvbnN0IHN0ZDo6cGFpcjxpbnQsIGludD4gJlZhbCkgeworICAgIGF1dG8gJlVzID0gaW5zdGFuY2UoKTsKKyAgICBVcy5Db3VudGVyc1tJRF0gPSBWYWw7CisgIH0KKworICAvLyBEdW1wIG9yIHByaW50IHRoZSBjdXJyZW50IGNvdW50ZXIgc2V0IGludG8gbGx2bTo6ZGJncygpLgorICBMTFZNX0RVTVBfTUVUSE9EIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdDsKKworICAvLyBHZXQgdGhlIGNvdW50ZXIgSUQgZm9yIGEgZ2l2ZW4gbmFtZWQgY291bnRlciwgb3IgcmV0dXJuIDAgaWYgbm9uZSBpcyBmb3VuZC4KKyAgdW5zaWduZWQgZ2V0Q291bnRlcklkKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIFJlZ2lzdGVyZWRDb3VudGVycy5pZEZvcihOYW1lKTsKKyAgfQorCisgIC8vIFJldHVybiB0aGUgbnVtYmVyIG9mIHJlZ2lzdGVyZWQgY291bnRlcnMuCisgIHVuc2lnbmVkIGludCBnZXROdW1Db3VudGVycygpIGNvbnN0IHsgcmV0dXJuIFJlZ2lzdGVyZWRDb3VudGVycy5zaXplKCk7IH0KKworICAvLyBSZXR1cm4gdGhlIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHRoZSBjb3VudGVyIHdpdGggdGhlIGdpdmVuIElELgorICBzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBnZXRDb3VudGVySW5mbyh1bnNpZ25lZCBJRCkgY29uc3QgeworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihSZWdpc3RlcmVkQ291bnRlcnNbSURdLCBDb3VudGVyRGVzYy5sb29rdXAoSUQpKTsKKyAgfQorCisgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgcmVnaXN0ZXJlZCBjb3VudGVycworICB0eXBlZGVmIFVuaXF1ZVZlY3RvcjxzdGQ6OnN0cmluZz4gQ291bnRlclZlY3RvcjsKKyAgQ291bnRlclZlY3Rvcjo6Y29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIFJlZ2lzdGVyZWRDb3VudGVycy5iZWdpbigpOworICB9CisgIENvdW50ZXJWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIFJlZ2lzdGVyZWRDb3VudGVycy5lbmQoKTsgfQorCitwcml2YXRlOgorICB1bnNpZ25lZCBhZGRDb3VudGVyKGNvbnN0IHN0ZDo6c3RyaW5nICZOYW1lLCBjb25zdCBzdGQ6OnN0cmluZyAmRGVzYykgeworICAgIHVuc2lnbmVkIFJlc3VsdCA9IFJlZ2lzdGVyZWRDb3VudGVycy5pbnNlcnQoTmFtZSk7CisgICAgQ291bnRlckRlc2NbUmVzdWx0XSA9IERlc2M7CisgICAgcmV0dXJuIFJlc3VsdDsKKyAgfQorICBEZW5zZU1hcDx1bnNpZ25lZCwgc3RkOjpwYWlyPGxvbmcsIGxvbmc+PiBDb3VudGVyczsKKyAgRGVuc2VNYXA8dW5zaWduZWQsIHN0ZDo6c3RyaW5nPiBDb3VudGVyRGVzYzsKKyAgQ291bnRlclZlY3RvciBSZWdpc3RlcmVkQ291bnRlcnM7Cit9OworCisjZGVmaW5lIERFQlVHX0NPVU5URVIoVkFSTkFNRSwgQ09VTlRFUk5BTUUsIERFU0MpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgVkFSTkFNRSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIERlYnVnQ291bnRlcjo6cmVnaXN0ZXJDb3VudGVyKENPVU5URVJOQU1FLCBERVNDKQorCit9IC8vIG5hbWVzcGFjZSBsbHZtCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9EeW5hbWljTGlicmFyeS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0R5bmFtaWNMaWJyYXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDY5ZDVkZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9EeW5hbWljTGlicmFyeS5oCkBAIC0wLDAgKzEsMTMzIEBACisvLz09PS0tIGxsdm0vU3VwcG9ydC9EeW5hbWljTGlicmFyeS5oIC0gUG9ydGFibGUgRHluYW1pYyBMaWJyYXJ5IC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIHN5czo6RHluYW1pY0xpYnJhcnkgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfRFlOQU1JQ0xJQlJBUllfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfRFlOQU1JQ0xJQlJBUllfSAorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIFN0cmluZ1JlZjsKKworbmFtZXNwYWNlIHN5cyB7CisKKyAgLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgYSBwb3J0YWJsZSBpbnRlcmZhY2UgdG8gZHluYW1pYyBsaWJyYXJpZXMgd2hpY2ggYWxzbworICAvLy8gbWlnaHQgYmUga25vd24gYXMgc2hhcmVkIGxpYnJhcmllcywgc2hhcmVkIG9iamVjdHMsIGR5bmFtaWMgc2hhcmVkCisgIC8vLyBvYmplY3RzLCBvciBkeW5hbWljIGxpbmsgbGlicmFyaWVzLiBSZWdhcmRsZXNzIG9mIHRoZSB0ZXJtaW5vbG9neSBvciB0aGUKKyAgLy8vIG9wZXJhdGluZyBzeXN0ZW0gaW50ZXJmYWNlLCB0aGlzIGNsYXNzIHByb3ZpZGVzIGEgcG9ydGFibGUgaW50ZXJmYWNlIHRoYXQKKyAgLy8vIGFsbG93cyBkeW5hbWljIGxpYnJhcmllcyB0byBiZSBsb2FkZWQgYW5kIHNlYXJjaGVkIGZvciBleHRlcm5hbGx5CisgIC8vLyBkZWZpbmVkIHN5bWJvbHMuIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgdG8gcHJvdmlkZSAicGx1Zy1pbiIgc3VwcG9ydC4KKyAgLy8vIEl0IGFsc28gYWxsb3dzIGZvciBzeW1ib2xzIHRvIGJlIGRlZmluZWQgd2hpY2ggZG9uJ3QgbGl2ZSBpbiBhbnkgbGlicmFyeSwKKyAgLy8vIGJ1dCByYXRoZXIgdGhlIG1haW4gcHJvZ3JhbSBpdHNlbGYsIHVzZWZ1bCBvbiBXaW5kb3dzIHdoZXJlIHRoZSBtYWluCisgIC8vLyBleGVjdXRhYmxlIGNhbm5vdCBiZSBzZWFyY2hlZC4KKyAgLy8vCisgIC8vLyBOb3RlOiB0aGVyZSBpcyBjdXJyZW50bHkgbm8gaW50ZXJmYWNlIGZvciB0ZW1wb3JhcmlseSBsb2FkaW5nIGEgbGlicmFyeSwKKyAgLy8vIG9yIGZvciB1bmxvYWRpbmcgbGlicmFyaWVzIHdoZW4gdGhlIExMVk0gbGlicmFyeSBpcyB1bmxvYWRlZC4KKyAgY2xhc3MgRHluYW1pY0xpYnJhcnkgeworICAgIC8vIFBsYWNlaG9sZGVyIHdob3NlIGFkZHJlc3MgcmVwcmVzZW50cyBhbiBpbnZhbGlkIGxpYnJhcnkuCisgICAgLy8gV2UgdXNlIHRoaXMgaW5zdGVhZCBvZiBOVUxMIG9yIGEgcG9pbnRlci1pbnQgcGFpciBiZWNhdXNlIHRoZSBPUyBsaWJyYXJ5CisgICAgLy8gbWlnaHQgZGVmaW5lIDAgb3IgMSB0byBiZSAic3BlY2lhbCIgaGFuZGxlcywgc3VjaCBhcyAic2VhcmNoIGFsbCIuCisgICAgc3RhdGljIGNoYXIgSW52YWxpZDsKKworICAgIC8vIE9wYXF1ZSBkYXRhIHVzZWQgdG8gaW50ZXJmYWNlIHdpdGggT1Mtc3BlY2lmaWMgZHluYW1pYyBsaWJyYXJ5IGhhbmRsaW5nLgorICAgIHZvaWQgKkRhdGE7CisKKyAgcHVibGljOgorICAgIGV4cGxpY2l0IER5bmFtaWNMaWJyYXJ5KHZvaWQgKmRhdGEgPSAmSW52YWxpZCkgOiBEYXRhKGRhdGEpIHt9CisKKyAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgcmVmZXJzIHRvIGEgdmFsaWQgbGlicmFyeS4KKyAgICBib29sIGlzVmFsaWQoKSBjb25zdCB7IHJldHVybiBEYXRhICE9ICZJbnZhbGlkOyB9CisKKyAgICAvLy8gU2VhcmNoZXMgdGhyb3VnaCB0aGUgbGlicmFyeSBmb3IgdGhlIHN5bWJvbCBccCBzeW1ib2xOYW1lLiBJZiBpdCBpcworICAgIC8vLyBmb3VuZCwgdGhlIGFkZHJlc3Mgb2YgdGhhdCBzeW1ib2wgaXMgcmV0dXJuZWQuIElmIG5vdCwgTlVMTCBpcyByZXR1cm5lZC4KKyAgICAvLy8gTm90ZSB0aGF0IE5VTEwgd2lsbCBhbHNvIGJlIHJldHVybmVkIGlmIHRoZSBsaWJyYXJ5IGZhaWxlZCB0byBsb2FkLgorICAgIC8vLyBVc2UgaXNWYWxpZCgpIHRvIGRpc3Rpbmd1aXNoIHRoZXNlIGNhc2VzIGlmIGl0IGlzIGltcG9ydGFudC4KKyAgICAvLy8gTm90ZSB0aGF0IHRoaXMgd2lsbCBcZSBub3Qgc2VhcmNoIHN5bWJvbHMgZXhwbGljaXRseSByZWdpc3RlcmVkIGJ5CisgICAgLy8vIEFkZFN5bWJvbCgpLgorICAgIHZvaWQgKmdldEFkZHJlc3NPZlN5bWJvbChjb25zdCBjaGFyICpzeW1ib2xOYW1lKTsKKworICAgIC8vLyBUaGlzIGZ1bmN0aW9uIHBlcm1hbmVudGx5IGxvYWRzIHRoZSBkeW5hbWljIGxpYnJhcnkgYXQgdGhlIGdpdmVuIHBhdGguCisgICAgLy8vIFRoZSBsaWJyYXJ5IHdpbGwgb25seSBiZSB1bmxvYWRlZCB3aGVuIGxsdm1fc2h1dGRvd24oKSBpcyBjYWxsZWQuCisgICAgLy8vIFRoaXMgcmV0dXJucyBhIHZhbGlkIER5bmFtaWNMaWJyYXJ5IGluc3RhbmNlIG9uIHN1Y2Nlc3MgYW5kIGFuIGludmFsaWQKKyAgICAvLy8gaW5zdGFuY2Ugb24gZmFpbHVyZSAoc2VlIGlzVmFsaWQoKSkuIFxwICplcnJNc2cgd2lsbCBvbmx5IGJlIG1vZGlmaWVkCisgICAgLy8vIGlmIHRoZSBsaWJyYXJ5IGZhaWxzIHRvIGxvYWQuCisgICAgLy8vCisgICAgLy8vIEl0IGlzIHNhZmUgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uIG11bHRpcGxlIHRpbWVzIGZvciB0aGUgc2FtZSBsaWJyYXJ5LgorICAgIC8vLyBAYnJpZWYgT3BlbiBhIGR5bmFtaWMgbGlicmFyeSBwZXJtYW5lbnRseS4KKyAgICBzdGF0aWMgRHluYW1pY0xpYnJhcnkgZ2V0UGVybWFuZW50TGlicmFyeShjb25zdCBjaGFyICpmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqZXJyTXNnID0gbnVsbHB0cik7CisKKyAgICAvLy8gUmVnaXN0ZXJzIGFuIGV4dGVybmFsbHkgbG9hZGVkIGxpYnJhcnkuIFRoZSBsaWJyYXJ5IHdpbGwgYmUgdW5sb2FkZWQKKyAgICAvLy8gd2hlbiB0aGUgcHJvZ3JhbSB0ZXJtaW5hdGVzLgorICAgIC8vLworICAgIC8vLyBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZSB0aW1lcyBmb3IgdGhlIHNhbWUgbGlicmFyeSwKKyAgICAvLy8gdGhvdWdoIG93bmVyc2hpcCBpcyBvbmx5IHRha2VuIGlmIHRoZXJlIHdhcyBubyBlcnJvci4KKyAgICAvLy8KKyAgICAvLy8gXHJldHVybnMgQW4gZW1wdHkgXHAgRHluYW1pY0xpYnJhcnkgaWYgdGhlIGxpYnJhcnkgd2FzIGFscmVhZHkgbG9hZGVkLgorICAgIHN0YXRpYyBEeW5hbWljTGlicmFyeSBhZGRQZXJtYW5lbnRMaWJyYXJ5KHZvaWQgKmhhbmRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqZXJyTXNnID0gbnVsbHB0cik7CisKKyAgICAvLy8gVGhpcyBmdW5jdGlvbiBwZXJtYW5lbnRseSBsb2FkcyB0aGUgZHluYW1pYyBsaWJyYXJ5IGF0IHRoZSBnaXZlbiBwYXRoLgorICAgIC8vLyBVc2UgdGhpcyBpbnN0ZWFkIG9mIGdldFBlcm1hbmVudExpYnJhcnkoKSB3aGVuIHlvdSB3b24ndCBuZWVkIHRvIGdldAorICAgIC8vLyBzeW1ib2xzIGZyb20gdGhlIGxpYnJhcnkgaXRzZWxmLgorICAgIC8vLworICAgIC8vLyBJdCBpcyBzYWZlIHRvIGNhbGwgdGhpcyBmdW5jdGlvbiBtdWx0aXBsZSB0aW1lcyBmb3IgdGhlIHNhbWUgbGlicmFyeS4KKyAgICBzdGF0aWMgYm9vbCBMb2FkTGlicmFyeVBlcm1hbmVudGx5KGNvbnN0IGNoYXIgKkZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKkVyck1zZyA9IG51bGxwdHIpIHsKKyAgICAgIHJldHVybiAhZ2V0UGVybWFuZW50TGlicmFyeShGaWxlbmFtZSwgRXJyTXNnKS5pc1ZhbGlkKCk7CisgICAgfQorCisgICAgZW51bSBTZWFyY2hPcmRlcmluZyB7CisgICAgICAvLy8gU09fTGlua2VyIC0gU2VhcmNoIGFzIGEgY2FsbCB0byBkbHN5bShkbG9wZW4oTlVMTCkpIHdvdWxkIHdoZW4KKyAgICAgIC8vLyBEeW5hbWljTGlicmFyeTo6Z2V0UGVybWFuZW50TGlicmFyeShOVUxMKSBoYXMgYmVlbiBjYWxsZWQgb3IKKyAgICAgIC8vLyBzZWFyY2ggdGhlIGxpc3Qgb2YgZXhwbGNpdGx5IGxvYWRlZCBzeW1ib2xzIGlmIG5vdC4KKyAgICAgIFNPX0xpbmtlciwKKyAgICAgIC8vLyBTT19Mb2FkZWRGaXJzdCAtIFNlYXJjaCBhbGwgbG9hZGVkIGxpYnJhcmllcywgdGhlbiBhcyBTT19MaW5rZXIgd291bGQuCisgICAgICBTT19Mb2FkZWRGaXJzdCwKKyAgICAgIC8vLyBTT19Mb2FkZWRMYXN0IC0gU2VhcmNoIGFzIFNPX0xpbmtlciB3b3VsZCwgdGhlbiBsb2FkZWQgbGlicmFyaWVzLgorICAgICAgLy8vIE9ubHkgdXNlZnVsIHRvIHNlYXJjaCBpZiBsaWJyYXJpZXMgd2l0aCBSVExEX0xPQ0FMIGhhdmUgYmVlbiBhZGRlZC4KKyAgICAgIFNPX0xvYWRlZExhc3QsCisgICAgICAvLy8gU09fTG9hZE9yZGVyIC0gT3IgdGhpcyBpbiB0byBzZWFyY2ggbGlicmFyaWVzIGluIHRoZSBvcmRlcmVkIGxvYWRlZC4KKyAgICAgIC8vLyBUaGUgZGVmYXVsdCBiYWhhdmlvdXIgaXMgdG8gc2VhcmNoIGxvYWRlZCBsaWJyYXJpZXMgaW4gcmV2ZXJzZS4KKyAgICAgIFNPX0xvYWRPcmRlciA9IDQKKyAgICB9OworICAgIHN0YXRpYyBTZWFyY2hPcmRlcmluZyBTZWFyY2hPcmRlcjsgLy8gPSBTT19MaW5rZXIKKworICAgIC8vLyBUaGlzIGZ1bmN0aW9uIHdpbGwgc2VhcmNoIHRocm91Z2ggYWxsIHByZXZpb3VzbHkgbG9hZGVkIGR5bmFtaWMKKyAgICAvLy8gbGlicmFyaWVzIGZvciB0aGUgc3ltYm9sIFxwIHN5bWJvbE5hbWUuIElmIGl0IGlzIGZvdW5kLCB0aGUgYWRkcmVzcyBvZgorICAgIC8vLyB0aGF0IHN5bWJvbCBpcyByZXR1cm5lZC4gSWYgbm90LCBudWxsIGlzIHJldHVybmVkLiBOb3RlIHRoYXQgdGhpcyB3aWxsCisgICAgLy8vIHNlYXJjaCBwZXJtYW5lbnRseSBsb2FkZWQgbGlicmFyaWVzIChnZXRQZXJtYW5lbnRMaWJyYXJ5KCkpIGFzIHdlbGwKKyAgICAvLy8gYXMgZXhwbGljaXRseSByZWdpc3RlcmVkIHN5bWJvbHMgKEFkZFN5bWJvbCgpKS4KKyAgICAvLy8gQHRocm93cyBzdGQ6OnN0cmluZyBvbiBlcnJvci4KKyAgICAvLy8gQGJyaWVmIFNlYXJjaCB0aHJvdWdoIGxpYnJhcmllcyBmb3IgYWRkcmVzcyBvZiBhIHN5bWJvbAorICAgIHN0YXRpYyB2b2lkICpTZWFyY2hGb3JBZGRyZXNzT2ZTeW1ib2woY29uc3QgY2hhciAqc3ltYm9sTmFtZSk7CisKKyAgICAvLy8gQGJyaWVmIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciBDKytvcGhpbGVzLgorICAgIHN0YXRpYyB2b2lkICpTZWFyY2hGb3JBZGRyZXNzT2ZTeW1ib2woY29uc3Qgc3RkOjpzdHJpbmcgJnN5bWJvbE5hbWUpIHsKKyAgICAgIHJldHVybiBTZWFyY2hGb3JBZGRyZXNzT2ZTeW1ib2woc3ltYm9sTmFtZS5jX3N0cigpKTsKKyAgICB9CisKKyAgICAvLy8gVGhpcyBmdW5jdGlvbnMgcGVybWFuZW50bHkgYWRkcyB0aGUgc3ltYm9sIFxwIHN5bWJvbE5hbWUgd2l0aCB0aGUKKyAgICAvLy8gdmFsdWUgXHAgc3ltYm9sVmFsdWUuICBUaGVzZSBzeW1ib2xzIGFyZSBzZWFyY2hlZCBiZWZvcmUgYW55CisgICAgLy8vIGxpYnJhcmllcy4KKyAgICAvLy8gQGJyaWVmIEFkZCBzZWFyY2hhYmxlIHN5bWJvbC92YWx1ZSBwYWlyLgorICAgIHN0YXRpYyB2b2lkIEFkZFN5bWJvbChTdHJpbmdSZWYgc3ltYm9sTmFtZSwgdm9pZCAqc3ltYm9sVmFsdWUpOworCisgICAgY2xhc3MgSGFuZGxlU2V0OworICB9OworCit9IC8vIEVuZCBzeXMgbmFtZXNwYWNlCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9FbmRpYW4uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9FbmRpYW4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNTBkOWI1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0VuZGlhbi5oCkBAIC0wLDAgKzEsNDE1IEBACisvLz09PS0gRW5kaWFuLmggLSBVdGlsaXRpZXMgZm9yIElPIHdpdGggZW5kaWFuIHNwZWNpZmljIGRhdGEgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyBnZW5lcmljIGZ1bmN0aW9ucyB0byByZWFkIGFuZCB3cml0ZSBlbmRpYW4gc3BlY2lmaWMgZGF0YS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9FTkRJQU5fSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfRU5ESUFOX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGlnbk9mLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0hvc3QuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU3dhcEJ5dGVPcmRlci5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBzdXBwb3J0IHsKKworZW51bSBlbmRpYW5uZXNzIHtiaWcsIGxpdHRsZSwgbmF0aXZlfTsKKworLy8gVGhlc2UgYXJlIG5hbWVkIHZhbHVlcyBmb3IgY29tbW9uIGFsaWdubWVudHMuCitlbnVtIHthbGlnbmVkID0gMCwgdW5hbGlnbmVkID0gMX07CisKK25hbWVzcGFjZSBkZXRhaWwgeworCisvLy8gXGJyaWVmIDo6dmFsdWUgaXMgZWl0aGVyIGFsaWdubWVudCwgb3IgYWxpZ25vZihUKSBpZiBhbGlnbm1lbnQgaXMgMC4KK3RlbXBsYXRlPGNsYXNzIFQsIGludCBhbGlnbm1lbnQ+CitzdHJ1Y3QgUGlja0FsaWdubWVudCB7CisgZW51bSB7IHZhbHVlID0gYWxpZ25tZW50ID09IDAgPyBhbGlnbm9mKFQpIDogYWxpZ25tZW50IH07Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgZGV0YWlsCisKK25hbWVzcGFjZSBlbmRpYW4geworCitjb25zdGV4cHIgZW5kaWFubmVzcyBzeXN0ZW1fZW5kaWFubmVzcygpIHsKKyAgcmV0dXJuIHN5czo6SXNCaWdFbmRpYW5Ib3N0ID8gYmlnIDogbGl0dGxlOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgdmFsdWVfdHlwZT4KK2lubGluZSB2YWx1ZV90eXBlIGJ5dGVfc3dhcCh2YWx1ZV90eXBlIHZhbHVlLCBlbmRpYW5uZXNzIGVuZGlhbikgeworICBpZiAoKGVuZGlhbiAhPSBuYXRpdmUpICYmIChlbmRpYW4gIT0gc3lzdGVtX2VuZGlhbm5lc3MoKSkpCisgICAgc3lzOjpzd2FwQnl0ZU9yZGVyKHZhbHVlKTsKKyAgcmV0dXJuIHZhbHVlOworfQorCisvLy8gU3dhcCB0aGUgYnl0ZXMgb2YgdmFsdWUgdG8gbWF0Y2ggdGhlIGdpdmVuIGVuZGlhbm5lc3MuCit0ZW1wbGF0ZTx0eXBlbmFtZSB2YWx1ZV90eXBlLCBlbmRpYW5uZXNzIGVuZGlhbj4KK2lubGluZSB2YWx1ZV90eXBlIGJ5dGVfc3dhcCh2YWx1ZV90eXBlIHZhbHVlKSB7CisgIHJldHVybiBieXRlX3N3YXAodmFsdWUsIGVuZGlhbik7Cit9CisKKy8vLyBSZWFkIGEgdmFsdWUgb2YgYSBwYXJ0aWN1bGFyIGVuZGlhbm5lc3MgZnJvbSBtZW1vcnkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgdmFsdWVfdHlwZSwgc3RkOjpzaXplX3QgYWxpZ25tZW50PgoraW5saW5lIHZhbHVlX3R5cGUgcmVhZChjb25zdCB2b2lkICptZW1vcnksIGVuZGlhbm5lc3MgZW5kaWFuKSB7CisgIHZhbHVlX3R5cGUgcmV0OworCisgIG1lbWNweSgmcmV0LAorICAgICAgICAgTExWTV9BU1NVTUVfQUxJR05FRCgKKyAgICAgICAgICAgICBtZW1vcnksIChkZXRhaWw6OlBpY2tBbGlnbm1lbnQ8dmFsdWVfdHlwZSwgYWxpZ25tZW50Pjo6dmFsdWUpKSwKKyAgICAgICAgIHNpemVvZih2YWx1ZV90eXBlKSk7CisgIHJldHVybiBieXRlX3N3YXA8dmFsdWVfdHlwZT4ocmV0LCBlbmRpYW4pOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSB2YWx1ZV90eXBlLAorICAgICAgICAgZW5kaWFubmVzcyBlbmRpYW4sCisgICAgICAgICBzdGQ6OnNpemVfdCBhbGlnbm1lbnQ+CitpbmxpbmUgdmFsdWVfdHlwZSByZWFkKGNvbnN0IHZvaWQgKm1lbW9yeSkgeworICByZXR1cm4gcmVhZDx2YWx1ZV90eXBlLCBhbGlnbm1lbnQ+KG1lbW9yeSwgZW5kaWFuKTsKK30KKworLy8vIFJlYWQgYSB2YWx1ZSBvZiBhIHBhcnRpY3VsYXIgZW5kaWFubmVzcyBmcm9tIGEgYnVmZmVyLCBhbmQgaW5jcmVtZW50IHRoZQorLy8vIGJ1ZmZlciBwYXN0IHRoYXQgdmFsdWUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgdmFsdWVfdHlwZSwgc3RkOjpzaXplX3QgYWxpZ25tZW50LCB0eXBlbmFtZSBDaGFyVD4KK2lubGluZSB2YWx1ZV90eXBlIHJlYWROZXh0KGNvbnN0IENoYXJUICombWVtb3J5LCBlbmRpYW5uZXNzIGVuZGlhbikgeworICB2YWx1ZV90eXBlIHJldCA9IHJlYWQ8dmFsdWVfdHlwZSwgYWxpZ25tZW50PihtZW1vcnksIGVuZGlhbik7CisgIG1lbW9yeSArPSBzaXplb2YodmFsdWVfdHlwZSk7CisgIHJldHVybiByZXQ7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIHZhbHVlX3R5cGUsIGVuZGlhbm5lc3MgZW5kaWFuLCBzdGQ6OnNpemVfdCBhbGlnbm1lbnQsCisgICAgICAgICB0eXBlbmFtZSBDaGFyVD4KK2lubGluZSB2YWx1ZV90eXBlIHJlYWROZXh0KGNvbnN0IENoYXJUICombWVtb3J5KSB7CisgIHJldHVybiByZWFkTmV4dDx2YWx1ZV90eXBlLCBhbGlnbm1lbnQsIENoYXJUPihtZW1vcnksIGVuZGlhbik7Cit9CisKKy8vLyBXcml0ZSBhIHZhbHVlIHRvIG1lbW9yeSB3aXRoIGEgcGFydGljdWxhciBlbmRpYW5uZXNzLgordGVtcGxhdGUgPHR5cGVuYW1lIHZhbHVlX3R5cGUsIHN0ZDo6c2l6ZV90IGFsaWdubWVudD4KK2lubGluZSB2b2lkIHdyaXRlKHZvaWQgKm1lbW9yeSwgdmFsdWVfdHlwZSB2YWx1ZSwgZW5kaWFubmVzcyBlbmRpYW4pIHsKKyAgdmFsdWUgPSBieXRlX3N3YXA8dmFsdWVfdHlwZT4odmFsdWUsIGVuZGlhbik7CisgIG1lbWNweShMTFZNX0FTU1VNRV9BTElHTkVEKAorICAgICAgICAgICAgIG1lbW9yeSwgKGRldGFpbDo6UGlja0FsaWdubWVudDx2YWx1ZV90eXBlLCBhbGlnbm1lbnQ+Ojp2YWx1ZSkpLAorICAgICAgICAgJnZhbHVlLCBzaXplb2YodmFsdWVfdHlwZSkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSB2YWx1ZV90eXBlLAorICAgICAgICAgZW5kaWFubmVzcyBlbmRpYW4sCisgICAgICAgICBzdGQ6OnNpemVfdCBhbGlnbm1lbnQ+CitpbmxpbmUgdm9pZCB3cml0ZSh2b2lkICptZW1vcnksIHZhbHVlX3R5cGUgdmFsdWUpIHsKKyAgd3JpdGU8dmFsdWVfdHlwZSwgYWxpZ25tZW50PihtZW1vcnksIHZhbHVlLCBlbmRpYW4pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgdmFsdWVfdHlwZT4KK3VzaW5nIG1ha2VfdW5zaWduZWRfdCA9IHR5cGVuYW1lIHN0ZDo6bWFrZV91bnNpZ25lZDx2YWx1ZV90eXBlPjo6dHlwZTsKKworLy8vIFJlYWQgYSB2YWx1ZSBvZiBhIHBhcnRpY3VsYXIgZW5kaWFubmVzcyBmcm9tIG1lbW9yeSwgZm9yIGEgbG9jYXRpb24KKy8vLyB0aGF0IHN0YXJ0cyBhdCB0aGUgZ2l2ZW4gYml0IG9mZnNldCB3aXRoaW4gdGhlIGZpcnN0IGJ5dGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgdmFsdWVfdHlwZSwgZW5kaWFubmVzcyBlbmRpYW4sIHN0ZDo6c2l6ZV90IGFsaWdubWVudD4KK2lubGluZSB2YWx1ZV90eXBlIHJlYWRBdEJpdEFsaWdubWVudChjb25zdCB2b2lkICptZW1vcnksIHVpbnQ2NF90IHN0YXJ0Qml0KSB7CisgIGFzc2VydChzdGFydEJpdCA8IDgpOworICBpZiAoc3RhcnRCaXQgPT0gMCkKKyAgICByZXR1cm4gcmVhZDx2YWx1ZV90eXBlLCBlbmRpYW4sIGFsaWdubWVudD4obWVtb3J5KTsKKyAgZWxzZSB7CisgICAgLy8gUmVhZCB0d28gdmFsdWVzIGFuZCBjb21wb3NlIHRoZSByZXN1bHQgZnJvbSB0aGVtLgorICAgIHZhbHVlX3R5cGUgdmFsWzJdOworICAgIG1lbWNweSgmdmFsWzBdLAorICAgICAgICAgICBMTFZNX0FTU1VNRV9BTElHTkVEKAorICAgICAgICAgICAgICAgbWVtb3J5LCAoZGV0YWlsOjpQaWNrQWxpZ25tZW50PHZhbHVlX3R5cGUsIGFsaWdubWVudD46OnZhbHVlKSksCisgICAgICAgICAgIHNpemVvZih2YWx1ZV90eXBlKSAqIDIpOworICAgIHZhbFswXSA9IGJ5dGVfc3dhcDx2YWx1ZV90eXBlLCBlbmRpYW4+KHZhbFswXSk7CisgICAgdmFsWzFdID0gYnl0ZV9zd2FwPHZhbHVlX3R5cGUsIGVuZGlhbj4odmFsWzFdKTsKKworICAgIC8vIFNoaWZ0IGJpdHMgZnJvbSB0aGUgbG93ZXIgdmFsdWUgaW50byBwbGFjZS4KKyAgICBtYWtlX3Vuc2lnbmVkX3Q8dmFsdWVfdHlwZT4gbG93ZXJWYWwgPSB2YWxbMF0gPj4gc3RhcnRCaXQ7CisgICAgLy8gTWFzayBvZmYgdXBwZXIgYml0cyBhZnRlciByaWdodCBzaGlmdCBpbiBjYXNlIG9mIHNpZ25lZCB0eXBlLgorICAgIG1ha2VfdW5zaWduZWRfdDx2YWx1ZV90eXBlPiBudW1CaXRzRmlyc3RWYWwgPQorICAgICAgICAoc2l6ZW9mKHZhbHVlX3R5cGUpICogOCkgLSBzdGFydEJpdDsKKyAgICBsb3dlclZhbCAmPSAoKG1ha2VfdW5zaWduZWRfdDx2YWx1ZV90eXBlPikxIDw8IG51bUJpdHNGaXJzdFZhbCkgLSAxOworCisgICAgLy8gR2V0IHRoZSBiaXRzIGZyb20gdGhlIHVwcGVyIHZhbHVlLgorICAgIG1ha2VfdW5zaWduZWRfdDx2YWx1ZV90eXBlPiB1cHBlclZhbCA9CisgICAgICAgIHZhbFsxXSAmICgoKG1ha2VfdW5zaWduZWRfdDx2YWx1ZV90eXBlPikxIDw8IHN0YXJ0Qml0KSAtIDEpOworICAgIC8vIFNoaWZ0IHRoZW0gaW4gdG8gcGxhY2UuCisgICAgdXBwZXJWYWwgPDw9IG51bUJpdHNGaXJzdFZhbDsKKworICAgIHJldHVybiBsb3dlclZhbCB8IHVwcGVyVmFsOworICB9Cit9CisKKy8vLyBXcml0ZSBhIHZhbHVlIHRvIG1lbW9yeSB3aXRoIGEgcGFydGljdWxhciBlbmRpYW5uZXNzLCBmb3IgYSBsb2NhdGlvbgorLy8vIHRoYXQgc3RhcnRzIGF0IHRoZSBnaXZlbiBiaXQgb2Zmc2V0IHdpdGhpbiB0aGUgZmlyc3QgYnl0ZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSB2YWx1ZV90eXBlLCBlbmRpYW5uZXNzIGVuZGlhbiwgc3RkOjpzaXplX3QgYWxpZ25tZW50PgoraW5saW5lIHZvaWQgd3JpdGVBdEJpdEFsaWdubWVudCh2b2lkICptZW1vcnksIHZhbHVlX3R5cGUgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHN0YXJ0Qml0KSB7CisgIGFzc2VydChzdGFydEJpdCA8IDgpOworICBpZiAoc3RhcnRCaXQgPT0gMCkKKyAgICB3cml0ZTx2YWx1ZV90eXBlLCBlbmRpYW4sIGFsaWdubWVudD4obWVtb3J5LCB2YWx1ZSk7CisgIGVsc2UgeworICAgIC8vIFJlYWQgdHdvIHZhbHVlcyBhbmQgc2hpZnQgdGhlIHJlc3VsdCBpbnRvIHRoZW0uCisgICAgdmFsdWVfdHlwZSB2YWxbMl07CisgICAgbWVtY3B5KCZ2YWxbMF0sCisgICAgICAgICAgIExMVk1fQVNTVU1FX0FMSUdORUQoCisgICAgICAgICAgICAgICBtZW1vcnksIChkZXRhaWw6OlBpY2tBbGlnbm1lbnQ8dmFsdWVfdHlwZSwgYWxpZ25tZW50Pjo6dmFsdWUpKSwKKyAgICAgICAgICAgc2l6ZW9mKHZhbHVlX3R5cGUpICogMik7CisgICAgdmFsWzBdID0gYnl0ZV9zd2FwPHZhbHVlX3R5cGUsIGVuZGlhbj4odmFsWzBdKTsKKyAgICB2YWxbMV0gPSBieXRlX3N3YXA8dmFsdWVfdHlwZSwgZW5kaWFuPih2YWxbMV0pOworCisgICAgLy8gTWFzayBvZmYgYW55IGV4aXN0aW5nIGJpdHMgaW4gdGhlIHVwcGVyIHBhcnQgb2YgdGhlIGxvd2VyIHZhbHVlIHRoYXQKKyAgICAvLyB3ZSB3YW50IHRvIHJlcGxhY2UuCisgICAgdmFsWzBdICY9ICgobWFrZV91bnNpZ25lZF90PHZhbHVlX3R5cGU+KTEgPDwgc3RhcnRCaXQpIC0gMTsKKyAgICBtYWtlX3Vuc2lnbmVkX3Q8dmFsdWVfdHlwZT4gbnVtQml0c0ZpcnN0VmFsID0KKyAgICAgICAgKHNpemVvZih2YWx1ZV90eXBlKSAqIDgpIC0gc3RhcnRCaXQ7CisgICAgbWFrZV91bnNpZ25lZF90PHZhbHVlX3R5cGU+IGxvd2VyVmFsID0gdmFsdWU7CisgICAgaWYgKHN0YXJ0Qml0ID4gMCkgeworICAgICAgLy8gTWFzayBvZmYgdGhlIHVwcGVyIGJpdHMgaW4gdGhlIG5ldyB2YWx1ZSB0aGF0IGFyZSBub3QgZ29pbmcgdG8gZ28gaW50bworICAgICAgLy8gdGhlIGxvd2VyIHZhbHVlLiBUaGlzIGF2b2lkcyBhIGxlZnQgc2hpZnQgb2YgYSBuZWdhdGl2ZSB2YWx1ZSwgd2hpY2gKKyAgICAgIC8vIGlzIHVuZGVmaW5lZCBiZWhhdmlvci4KKyAgICAgIGxvd2VyVmFsICY9ICgoKG1ha2VfdW5zaWduZWRfdDx2YWx1ZV90eXBlPikxIDw8IG51bUJpdHNGaXJzdFZhbCkgLSAxKTsKKyAgICAgIC8vIE5vdyBzaGlmdCB0aGUgbmV3IGJpdHMgaW50byBwbGFjZQorICAgICAgbG93ZXJWYWwgPDw9IHN0YXJ0Qml0OworICAgIH0KKyAgICB2YWxbMF0gfD0gbG93ZXJWYWw7CisKKyAgICAvLyBNYXNrIG9mZiBhbnkgZXhpc3RpbmcgYml0cyBpbiB0aGUgbG93ZXIgcGFydCBvZiB0aGUgdXBwZXIgdmFsdWUgdGhhdAorICAgIC8vIHdlIHdhbnQgdG8gcmVwbGFjZS4KKyAgICB2YWxbMV0gJj0gfigoKG1ha2VfdW5zaWduZWRfdDx2YWx1ZV90eXBlPikxIDw8IHN0YXJ0Qml0KSAtIDEpOworICAgIC8vIE5leHQgc2hpZnQgdGhlIGJpdHMgdGhhdCBnbyBpbnRvIHRoZSB1cHBlciB2YWx1ZSBpbnRvIHBvc2l0aW9uLgorICAgIG1ha2VfdW5zaWduZWRfdDx2YWx1ZV90eXBlPiB1cHBlclZhbCA9IHZhbHVlID4+IG51bUJpdHNGaXJzdFZhbDsKKyAgICAvLyBNYXNrIG9mZiB1cHBlciBiaXRzIGFmdGVyIHJpZ2h0IHNoaWZ0IGluIGNhc2Ugb2Ygc2lnbmVkIHR5cGUuCisgICAgdXBwZXJWYWwgJj0gKChtYWtlX3Vuc2lnbmVkX3Q8dmFsdWVfdHlwZT4pMSA8PCBzdGFydEJpdCkgLSAxOworICAgIHZhbFsxXSB8PSB1cHBlclZhbDsKKworICAgIC8vIEZpbmFsbHksIHJld3JpdGUgdmFsdWVzLgorICAgIHZhbFswXSA9IGJ5dGVfc3dhcDx2YWx1ZV90eXBlLCBlbmRpYW4+KHZhbFswXSk7CisgICAgdmFsWzFdID0gYnl0ZV9zd2FwPHZhbHVlX3R5cGUsIGVuZGlhbj4odmFsWzFdKTsKKyAgICBtZW1jcHkoTExWTV9BU1NVTUVfQUxJR05FRCgKKyAgICAgICAgICAgICAgIG1lbW9yeSwgKGRldGFpbDo6UGlja0FsaWdubWVudDx2YWx1ZV90eXBlLCBhbGlnbm1lbnQ+Ojp2YWx1ZSkpLAorICAgICAgICAgICAmdmFsWzBdLCBzaXplb2YodmFsdWVfdHlwZSkgKiAyKTsKKyAgfQorfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgZW5kaWFuCisKK25hbWVzcGFjZSBkZXRhaWwgeworCit0ZW1wbGF0ZTx0eXBlbmFtZSB2YWx1ZV90eXBlLAorICAgICAgICAgZW5kaWFubmVzcyBlbmRpYW4sCisgICAgICAgICBzdGQ6OnNpemVfdCBhbGlnbm1lbnQ+CitzdHJ1Y3QgcGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbCB7CisgIHBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWwoKSA9IGRlZmF1bHQ7CisKKyAgZXhwbGljaXQgcGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbCh2YWx1ZV90eXBlIHZhbCkgeyAqdGhpcyA9IHZhbDsgfQorCisgIG9wZXJhdG9yIHZhbHVlX3R5cGUoKSBjb25zdCB7CisgICAgcmV0dXJuIGVuZGlhbjo6cmVhZDx2YWx1ZV90eXBlLCBlbmRpYW4sIGFsaWdubWVudD4oCisgICAgICAoY29uc3Qgdm9pZCopVmFsdWUuYnVmZmVyKTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3I9KHZhbHVlX3R5cGUgbmV3VmFsdWUpIHsKKyAgICBlbmRpYW46OndyaXRlPHZhbHVlX3R5cGUsIGVuZGlhbiwgYWxpZ25tZW50PigKKyAgICAgICh2b2lkKilWYWx1ZS5idWZmZXIsIG5ld1ZhbHVlKTsKKyAgfQorCisgIHBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWwgJm9wZXJhdG9yKz0odmFsdWVfdHlwZSBuZXdWYWx1ZSkgeworICAgICp0aGlzID0gKnRoaXMgKyBuZXdWYWx1ZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsICZvcGVyYXRvci09KHZhbHVlX3R5cGUgbmV3VmFsdWUpIHsKKyAgICAqdGhpcyA9ICp0aGlzIC0gbmV3VmFsdWU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgcGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbCAmb3BlcmF0b3J8PSh2YWx1ZV90eXBlIG5ld1ZhbHVlKSB7CisgICAgKnRoaXMgPSAqdGhpcyB8IG5ld1ZhbHVlOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWwgJm9wZXJhdG9yJj0odmFsdWVfdHlwZSBuZXdWYWx1ZSkgeworICAgICp0aGlzID0gKnRoaXMgJiBuZXdWYWx1ZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworcHJpdmF0ZToKKyAgQWxpZ25lZENoYXJBcnJheTxQaWNrQWxpZ25tZW50PHZhbHVlX3R5cGUsIGFsaWdubWVudD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgIHNpemVvZih2YWx1ZV90eXBlKT4gVmFsdWU7CisKK3B1YmxpYzoKKyAgc3RydWN0IHJlZiB7CisgICAgZXhwbGljaXQgcmVmKHZvaWQgKlB0cikgOiBQdHIoUHRyKSB7fQorCisgICAgb3BlcmF0b3IgdmFsdWVfdHlwZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBlbmRpYW46OnJlYWQ8dmFsdWVfdHlwZSwgZW5kaWFuLCBhbGlnbm1lbnQ+KFB0cik7CisgICAgfQorCisgICAgdm9pZCBvcGVyYXRvcj0odmFsdWVfdHlwZSBOZXdWYWx1ZSkgeworICAgICAgZW5kaWFuOjp3cml0ZTx2YWx1ZV90eXBlLCBlbmRpYW4sIGFsaWdubWVudD4oUHRyLCBOZXdWYWx1ZSk7CisgICAgfQorCisgIHByaXZhdGU6CisgICAgdm9pZCAqUHRyOworICB9OworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAorCit1c2luZyB1bGl0dGxlMTZfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPHVpbnQxNl90LCBsaXR0bGUsIHVuYWxpZ25lZD47Cit1c2luZyB1bGl0dGxlMzJfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPHVpbnQzMl90LCBsaXR0bGUsIHVuYWxpZ25lZD47Cit1c2luZyB1bGl0dGxlNjRfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPHVpbnQ2NF90LCBsaXR0bGUsIHVuYWxpZ25lZD47CisKK3VzaW5nIGxpdHRsZTE2X3QgPQorICAgIGRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDxpbnQxNl90LCBsaXR0bGUsIHVuYWxpZ25lZD47Cit1c2luZyBsaXR0bGUzMl90ID0KKyAgICBkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8aW50MzJfdCwgbGl0dGxlLCB1bmFsaWduZWQ+OwordXNpbmcgbGl0dGxlNjRfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPGludDY0X3QsIGxpdHRsZSwgdW5hbGlnbmVkPjsKKwordXNpbmcgYWxpZ25lZF91bGl0dGxlMTZfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPHVpbnQxNl90LCBsaXR0bGUsIGFsaWduZWQ+OwordXNpbmcgYWxpZ25lZF91bGl0dGxlMzJfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPHVpbnQzMl90LCBsaXR0bGUsIGFsaWduZWQ+OwordXNpbmcgYWxpZ25lZF91bGl0dGxlNjRfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPHVpbnQ2NF90LCBsaXR0bGUsIGFsaWduZWQ+OworCit1c2luZyBhbGlnbmVkX2xpdHRsZTE2X3QgPQorICAgIGRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDxpbnQxNl90LCBsaXR0bGUsIGFsaWduZWQ+OwordXNpbmcgYWxpZ25lZF9saXR0bGUzMl90ID0KKyAgICBkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8aW50MzJfdCwgbGl0dGxlLCBhbGlnbmVkPjsKK3VzaW5nIGFsaWduZWRfbGl0dGxlNjRfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPGludDY0X3QsIGxpdHRsZSwgYWxpZ25lZD47CisKK3VzaW5nIHViaWcxNl90ID0KKyAgICBkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8dWludDE2X3QsIGJpZywgdW5hbGlnbmVkPjsKK3VzaW5nIHViaWczMl90ID0KKyAgICBkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8dWludDMyX3QsIGJpZywgdW5hbGlnbmVkPjsKK3VzaW5nIHViaWc2NF90ID0KKyAgICBkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8dWludDY0X3QsIGJpZywgdW5hbGlnbmVkPjsKKwordXNpbmcgYmlnMTZfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPGludDE2X3QsIGJpZywgdW5hbGlnbmVkPjsKK3VzaW5nIGJpZzMyX3QgPQorICAgIGRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDxpbnQzMl90LCBiaWcsIHVuYWxpZ25lZD47Cit1c2luZyBiaWc2NF90ID0KKyAgICBkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8aW50NjRfdCwgYmlnLCB1bmFsaWduZWQ+OworCit1c2luZyBhbGlnbmVkX3ViaWcxNl90ID0KKyAgICBkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8dWludDE2X3QsIGJpZywgYWxpZ25lZD47Cit1c2luZyBhbGlnbmVkX3ViaWczMl90ID0KKyAgICBkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8dWludDMyX3QsIGJpZywgYWxpZ25lZD47Cit1c2luZyBhbGlnbmVkX3ViaWc2NF90ID0KKyAgICBkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8dWludDY0X3QsIGJpZywgYWxpZ25lZD47CisKK3VzaW5nIGFsaWduZWRfYmlnMTZfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPGludDE2X3QsIGJpZywgYWxpZ25lZD47Cit1c2luZyBhbGlnbmVkX2JpZzMyX3QgPQorICAgIGRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDxpbnQzMl90LCBiaWcsIGFsaWduZWQ+OwordXNpbmcgYWxpZ25lZF9iaWc2NF90ID0KKyAgICBkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8aW50NjRfdCwgYmlnLCBhbGlnbmVkPjsKKwordXNpbmcgdW5hbGlnbmVkX3VpbnQxNl90ID0KKyAgICBkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8dWludDE2X3QsIG5hdGl2ZSwgdW5hbGlnbmVkPjsKK3VzaW5nIHVuYWxpZ25lZF91aW50MzJfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPHVpbnQzMl90LCBuYXRpdmUsIHVuYWxpZ25lZD47Cit1c2luZyB1bmFsaWduZWRfdWludDY0X3QgPQorICAgIGRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDx1aW50NjRfdCwgbmF0aXZlLCB1bmFsaWduZWQ+OworCit1c2luZyB1bmFsaWduZWRfaW50MTZfdCA9CisgICAgZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPGludDE2X3QsIG5hdGl2ZSwgdW5hbGlnbmVkPjsKK3VzaW5nIHVuYWxpZ25lZF9pbnQzMl90ID0KKyAgICBkZXRhaWw6OnBhY2tlZF9lbmRpYW5fc3BlY2lmaWNfaW50ZWdyYWw8aW50MzJfdCwgbmF0aXZlLCB1bmFsaWduZWQ+OwordXNpbmcgdW5hbGlnbmVkX2ludDY0X3QgPQorICAgIGRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDxpbnQ2NF90LCBuYXRpdmUsIHVuYWxpZ25lZD47CisKK25hbWVzcGFjZSBlbmRpYW4geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gaW5saW5lIFQgcmVhZChjb25zdCB2b2lkICpQLCBlbmRpYW5uZXNzIEUpIHsKKyAgcmV0dXJuIHJlYWQ8VCwgdW5hbGlnbmVkPihQLCBFKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIGVuZGlhbm5lc3MgRT4gaW5saW5lIFQgcmVhZChjb25zdCB2b2lkICpQKSB7CisgIHJldHVybiAqKGNvbnN0IGRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDxULCBFLCB1bmFsaWduZWQ+ICopUDsKK30KKworaW5saW5lIHVpbnQxNl90IHJlYWQxNihjb25zdCB2b2lkICpQLCBlbmRpYW5uZXNzIEUpIHsKKyAgcmV0dXJuIHJlYWQ8dWludDE2X3Q+KFAsIEUpOworfQoraW5saW5lIHVpbnQzMl90IHJlYWQzMihjb25zdCB2b2lkICpQLCBlbmRpYW5uZXNzIEUpIHsKKyAgcmV0dXJuIHJlYWQ8dWludDMyX3Q+KFAsIEUpOworfQoraW5saW5lIHVpbnQ2NF90IHJlYWQ2NChjb25zdCB2b2lkICpQLCBlbmRpYW5uZXNzIEUpIHsKKyAgcmV0dXJuIHJlYWQ8dWludDY0X3Q+KFAsIEUpOworfQorCit0ZW1wbGF0ZSA8ZW5kaWFubmVzcyBFPiBpbmxpbmUgdWludDE2X3QgcmVhZDE2KGNvbnN0IHZvaWQgKlApIHsKKyAgcmV0dXJuIHJlYWQ8dWludDE2X3QsIEU+KFApOworfQordGVtcGxhdGUgPGVuZGlhbm5lc3MgRT4gaW5saW5lIHVpbnQzMl90IHJlYWQzMihjb25zdCB2b2lkICpQKSB7CisgIHJldHVybiByZWFkPHVpbnQzMl90LCBFPihQKTsKK30KK3RlbXBsYXRlIDxlbmRpYW5uZXNzIEU+IGlubGluZSB1aW50NjRfdCByZWFkNjQoY29uc3Qgdm9pZCAqUCkgeworICByZXR1cm4gcmVhZDx1aW50NjRfdCwgRT4oUCk7Cit9CisKK2lubGluZSB1aW50MTZfdCByZWFkMTZsZShjb25zdCB2b2lkICpQKSB7IHJldHVybiByZWFkMTY8bGl0dGxlPihQKTsgfQoraW5saW5lIHVpbnQzMl90IHJlYWQzMmxlKGNvbnN0IHZvaWQgKlApIHsgcmV0dXJuIHJlYWQzMjxsaXR0bGU+KFApOyB9CitpbmxpbmUgdWludDY0X3QgcmVhZDY0bGUoY29uc3Qgdm9pZCAqUCkgeyByZXR1cm4gcmVhZDY0PGxpdHRsZT4oUCk7IH0KK2lubGluZSB1aW50MTZfdCByZWFkMTZiZShjb25zdCB2b2lkICpQKSB7IHJldHVybiByZWFkMTY8YmlnPihQKTsgfQoraW5saW5lIHVpbnQzMl90IHJlYWQzMmJlKGNvbnN0IHZvaWQgKlApIHsgcmV0dXJuIHJlYWQzMjxiaWc+KFApOyB9CitpbmxpbmUgdWludDY0X3QgcmVhZDY0YmUoY29uc3Qgdm9pZCAqUCkgeyByZXR1cm4gcmVhZDY0PGJpZz4oUCk7IH0KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGlubGluZSB2b2lkIHdyaXRlKHZvaWQgKlAsIFQgViwgZW5kaWFubmVzcyBFKSB7CisgIHdyaXRlPFQsIHVuYWxpZ25lZD4oUCwgViwgRSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBlbmRpYW5uZXNzIEU+IGlubGluZSB2b2lkIHdyaXRlKHZvaWQgKlAsIFQgVikgeworICAqKGRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDxULCBFLCB1bmFsaWduZWQ+ICopUCA9IFY7Cit9CisKK2lubGluZSB2b2lkIHdyaXRlMTYodm9pZCAqUCwgdWludDE2X3QgViwgZW5kaWFubmVzcyBFKSB7CisgIHdyaXRlPHVpbnQxNl90PihQLCBWLCBFKTsKK30KK2lubGluZSB2b2lkIHdyaXRlMzIodm9pZCAqUCwgdWludDMyX3QgViwgZW5kaWFubmVzcyBFKSB7CisgIHdyaXRlPHVpbnQzMl90PihQLCBWLCBFKTsKK30KK2lubGluZSB2b2lkIHdyaXRlNjQodm9pZCAqUCwgdWludDY0X3QgViwgZW5kaWFubmVzcyBFKSB7CisgIHdyaXRlPHVpbnQ2NF90PihQLCBWLCBFKTsKK30KKwordGVtcGxhdGUgPGVuZGlhbm5lc3MgRT4gaW5saW5lIHZvaWQgd3JpdGUxNih2b2lkICpQLCB1aW50MTZfdCBWKSB7CisgIHdyaXRlPHVpbnQxNl90LCBFPihQLCBWKTsKK30KK3RlbXBsYXRlIDxlbmRpYW5uZXNzIEU+IGlubGluZSB2b2lkIHdyaXRlMzIodm9pZCAqUCwgdWludDMyX3QgVikgeworICB3cml0ZTx1aW50MzJfdCwgRT4oUCwgVik7Cit9Cit0ZW1wbGF0ZSA8ZW5kaWFubmVzcyBFPiBpbmxpbmUgdm9pZCB3cml0ZTY0KHZvaWQgKlAsIHVpbnQ2NF90IFYpIHsKKyAgd3JpdGU8dWludDY0X3QsIEU+KFAsIFYpOworfQorCitpbmxpbmUgdm9pZCB3cml0ZTE2bGUodm9pZCAqUCwgdWludDE2X3QgVikgeyB3cml0ZTE2PGxpdHRsZT4oUCwgVik7IH0KK2lubGluZSB2b2lkIHdyaXRlMzJsZSh2b2lkICpQLCB1aW50MzJfdCBWKSB7IHdyaXRlMzI8bGl0dGxlPihQLCBWKTsgfQoraW5saW5lIHZvaWQgd3JpdGU2NGxlKHZvaWQgKlAsIHVpbnQ2NF90IFYpIHsgd3JpdGU2NDxsaXR0bGU+KFAsIFYpOyB9CitpbmxpbmUgdm9pZCB3cml0ZTE2YmUodm9pZCAqUCwgdWludDE2X3QgVikgeyB3cml0ZTE2PGJpZz4oUCwgVik7IH0KK2lubGluZSB2b2lkIHdyaXRlMzJiZSh2b2lkICpQLCB1aW50MzJfdCBWKSB7IHdyaXRlMzI8YmlnPihQLCBWKTsgfQoraW5saW5lIHZvaWQgd3JpdGU2NGJlKHZvaWQgKlAsIHVpbnQ2NF90IFYpIHsgd3JpdGU2NDxiaWc+KFAsIFYpOyB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBlbmRpYW4KKworfSAvLyBlbmQgbmFtZXNwYWNlIHN1cHBvcnQKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfRU5ESUFOX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9FbmRpYW5TdHJlYW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9FbmRpYW5TdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40M2VjZDRhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0VuZGlhblN0cmVhbS5oCkBAIC0wLDAgKzEsNjkgQEAKKy8vPT09LSBFbmRpYW5TdHJlYW0uaCAtIFN0cmVhbSBvcHMgd2l0aCBlbmRpYW4gc3BlY2lmaWMgZGF0YSAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdXRpbGl0aWVzIGZvciBvcGVyYXRpbmcgb24gc3RyZWFtcyB0aGF0IGhhdmUgZW5kaWFuCisvLyBzcGVjaWZpYyBkYXRhLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0VORElBTlNUUkVBTV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9FTkRJQU5TVFJFQU1fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBzdXBwb3J0IHsKKworbmFtZXNwYWNlIGVuZGlhbiB7CisvLy8gQWRhcHRlciB0byB3cml0ZSB2YWx1ZXMgdG8gYSBzdHJlYW0gaW4gYSBwYXJ0aWN1bGFyIGJ5dGUgb3JkZXIuCit0ZW1wbGF0ZSA8ZW5kaWFubmVzcyBlbmRpYW4+IHN0cnVjdCBXcml0ZXIgeworICByYXdfb3N0cmVhbSAmT1M7CisgIFdyaXRlcihyYXdfb3N0cmVhbSAmT1MpIDogT1MoT1MpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSB2YWx1ZV90eXBlPiB2b2lkIHdyaXRlKEFycmF5UmVmPHZhbHVlX3R5cGU+IFZhbHMpIHsKKyAgICBmb3IgKHZhbHVlX3R5cGUgViA6IFZhbHMpCisgICAgICB3cml0ZShWKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgdmFsdWVfdHlwZT4gdm9pZCB3cml0ZSh2YWx1ZV90eXBlIFZhbCkgeworICAgIFZhbCA9IGJ5dGVfc3dhcDx2YWx1ZV90eXBlLCBlbmRpYW4+KFZhbCk7CisgICAgT1Mud3JpdGUoKGNvbnN0IGNoYXIgKikmVmFsLCBzaXplb2YodmFsdWVfdHlwZSkpOworICB9Cit9OworCit0ZW1wbGF0ZSA8PgordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFdyaXRlcjxsaXR0bGU+Ojp3cml0ZTxmbG9hdD4oZmxvYXQgVmFsKSB7CisgIHdyaXRlKEZsb2F0VG9CaXRzKFZhbCkpOworfQorCit0ZW1wbGF0ZSA8PgordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFdyaXRlcjxsaXR0bGU+Ojp3cml0ZTxkb3VibGU+KGRvdWJsZSBWYWwpIHsKKyAgd3JpdGUoRG91YmxlVG9CaXRzKFZhbCkpOworfQorCit0ZW1wbGF0ZSA8PgordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFdyaXRlcjxiaWc+Ojp3cml0ZTxmbG9hdD4oZmxvYXQgVmFsKSB7CisgIHdyaXRlKEZsb2F0VG9CaXRzKFZhbCkpOworfQorCit0ZW1wbGF0ZSA8PgordGVtcGxhdGUgPD4KK2lubGluZSB2b2lkIFdyaXRlcjxiaWc+Ojp3cml0ZTxkb3VibGU+KGRvdWJsZSBWYWwpIHsKKyAgd3JpdGUoRG91YmxlVG9CaXRzKFZhbCkpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgZW5kaWFuCisKK30gLy8gZW5kIG5hbWVzcGFjZSBzdXBwb3J0Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9FcnJjLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRXJyYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwYmZlMmEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRXJyYy5oCkBAIC0wLDAgKzEsODYgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvRXJyYy5oIC0gRGVmaW5lcyB0aGUgbGx2bTo6ZXJyYyBlbnVtIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gV2hpbGUgc3RkOjplcnJvcl9jb2RlIHdvcmtzIE9LIG9uIGFsbCBwbGF0Zm9ybXMgd2UgdXNlLCB0aGVyZSBhcmUgc29tZQorLy8gc29tZSBwcm9ibGVtcyB3aXRoIHN0ZDo6ZXJyYyB0aGF0IGNhbiBiZSBhdm9pZGVkIGJ5IHVzaW5nIG91ciBvd24KKy8vIGVudW1lcmF0aW9uOgorLy8KKy8vICogc3RkOjplcnJjIGlzIGEgbmFtZXNwYWNlIGluIHNvbWUgaW1wbGVtZW50YXRpb25zLiBUaGF0IG1lYXMgdGhhdCBBREwKKy8vICAgZG9lc24ndCB3b3JrIGFuZCBpdCBpcyBzb21ldGltZXMgbmVjZXNzYXJ5IHRvIHdyaXRlIHN0ZDo6bWFrZV9lcnJvcl9jb2RlCisvLyAgIG9yIGluIHRlbXBsYXRlczoKKy8vICAgdXNpbmcgc3RkOjptYWtlX2Vycm9yX2NvZGU7CisvLyAgIG1ha2VfZXJyb3JfY29kZSguLi4pOworLy8KKy8vICAgd2l0aCB0aGlzIGVudW0gaXQgaXMgc2FmZSB0byBhbHdheXMganVzdCB1c2UgbWFrZV9lcnJvcl9jb2RlLgorLy8KKy8vICogU29tZSBpbXBsZW1lbnRhdGlvbnMgZGVmaW5lIGZld2VyIG5hbWVzIHRoYW4gb3RoZXJzLiBUaGlzIGhlYWRlciBoYXMKKy8vICAgdGhlIGludGVyc2VjdGlvbiBvZiBhbGwgdGhlIG9uZXMgd2Ugc3VwcG9ydC4KKy8vCisvLyAqIHN0ZDo6ZXJyYyBpcyBqdXN0IG1hcmtlZCB3aXRoIGlzX2Vycm9yX2NvbmRpdGlvbl9lbnVtLiBUaGlzIG1lYW5zIHRoYXQKKy8vICAgY29tbW9uIHBhdHRlcnMgbGlrZSBBbkVycm9yQ29kZSA9PSBlcnJjOjpub19zdWNoX2ZpbGVfb3JfZGlyZWN0b3J5IHRha2UKKy8vICAgNCB2aXJ0dWFsIGNhbGxzIGluc3RlYWQgb2YgdHdvIGNvbXBhcmlzb25zLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfRVJSQ19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9FUlJDX0gKKworI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKworbmFtZXNwYWNlIGxsdm0geworZW51bSBjbGFzcyBlcnJjIHsKKyAgYXJndW1lbnRfbGlzdF90b29fbG9uZyA9IGludChzdGQ6OmVycmM6OmFyZ3VtZW50X2xpc3RfdG9vX2xvbmcpLAorICBhcmd1bWVudF9vdXRfb2ZfZG9tYWluID0gaW50KHN0ZDo6ZXJyYzo6YXJndW1lbnRfb3V0X29mX2RvbWFpbiksCisgIGJhZF9hZGRyZXNzID0gaW50KHN0ZDo6ZXJyYzo6YmFkX2FkZHJlc3MpLAorICBiYWRfZmlsZV9kZXNjcmlwdG9yID0gaW50KHN0ZDo6ZXJyYzo6YmFkX2ZpbGVfZGVzY3JpcHRvciksCisgIGJyb2tlbl9waXBlID0gaW50KHN0ZDo6ZXJyYzo6YnJva2VuX3BpcGUpLAorICBkZXZpY2Vfb3JfcmVzb3VyY2VfYnVzeSA9IGludChzdGQ6OmVycmM6OmRldmljZV9vcl9yZXNvdXJjZV9idXN5KSwKKyAgZGlyZWN0b3J5X25vdF9lbXB0eSA9IGludChzdGQ6OmVycmM6OmRpcmVjdG9yeV9ub3RfZW1wdHkpLAorICBleGVjdXRhYmxlX2Zvcm1hdF9lcnJvciA9IGludChzdGQ6OmVycmM6OmV4ZWN1dGFibGVfZm9ybWF0X2Vycm9yKSwKKyAgZmlsZV9leGlzdHMgPSBpbnQoc3RkOjplcnJjOjpmaWxlX2V4aXN0cyksCisgIGZpbGVfdG9vX2xhcmdlID0gaW50KHN0ZDo6ZXJyYzo6ZmlsZV90b29fbGFyZ2UpLAorICBmaWxlbmFtZV90b29fbG9uZyA9IGludChzdGQ6OmVycmM6OmZpbGVuYW1lX3Rvb19sb25nKSwKKyAgZnVuY3Rpb25fbm90X3N1cHBvcnRlZCA9IGludChzdGQ6OmVycmM6OmZ1bmN0aW9uX25vdF9zdXBwb3J0ZWQpLAorICBpbGxlZ2FsX2J5dGVfc2VxdWVuY2UgPSBpbnQoc3RkOjplcnJjOjppbGxlZ2FsX2J5dGVfc2VxdWVuY2UpLAorICBpbmFwcHJvcHJpYXRlX2lvX2NvbnRyb2xfb3BlcmF0aW9uID0KKyAgICAgIGludChzdGQ6OmVycmM6OmluYXBwcm9wcmlhdGVfaW9fY29udHJvbF9vcGVyYXRpb24pLAorICBpbnRlcnJ1cHRlZCA9IGludChzdGQ6OmVycmM6OmludGVycnVwdGVkKSwKKyAgaW52YWxpZF9hcmd1bWVudCA9IGludChzdGQ6OmVycmM6OmludmFsaWRfYXJndW1lbnQpLAorICBpbnZhbGlkX3NlZWsgPSBpbnQoc3RkOjplcnJjOjppbnZhbGlkX3NlZWspLAorICBpb19lcnJvciA9IGludChzdGQ6OmVycmM6OmlvX2Vycm9yKSwKKyAgaXNfYV9kaXJlY3RvcnkgPSBpbnQoc3RkOjplcnJjOjppc19hX2RpcmVjdG9yeSksCisgIG5vX2NoaWxkX3Byb2Nlc3MgPSBpbnQoc3RkOjplcnJjOjpub19jaGlsZF9wcm9jZXNzKSwKKyAgbm9fbG9ja19hdmFpbGFibGUgPSBpbnQoc3RkOjplcnJjOjpub19sb2NrX2F2YWlsYWJsZSksCisgIG5vX3NwYWNlX29uX2RldmljZSA9IGludChzdGQ6OmVycmM6Om5vX3NwYWNlX29uX2RldmljZSksCisgIG5vX3N1Y2hfZGV2aWNlX29yX2FkZHJlc3MgPSBpbnQoc3RkOjplcnJjOjpub19zdWNoX2RldmljZV9vcl9hZGRyZXNzKSwKKyAgbm9fc3VjaF9kZXZpY2UgPSBpbnQoc3RkOjplcnJjOjpub19zdWNoX2RldmljZSksCisgIG5vX3N1Y2hfZmlsZV9vcl9kaXJlY3RvcnkgPSBpbnQoc3RkOjplcnJjOjpub19zdWNoX2ZpbGVfb3JfZGlyZWN0b3J5KSwKKyAgbm9fc3VjaF9wcm9jZXNzID0gaW50KHN0ZDo6ZXJyYzo6bm9fc3VjaF9wcm9jZXNzKSwKKyAgbm90X2FfZGlyZWN0b3J5ID0gaW50KHN0ZDo6ZXJyYzo6bm90X2FfZGlyZWN0b3J5KSwKKyAgbm90X2Vub3VnaF9tZW1vcnkgPSBpbnQoc3RkOjplcnJjOjpub3RfZW5vdWdoX21lbW9yeSksCisgIG9wZXJhdGlvbl9ub3RfcGVybWl0dGVkID0gaW50KHN0ZDo6ZXJyYzo6b3BlcmF0aW9uX25vdF9wZXJtaXR0ZWQpLAorICBwZXJtaXNzaW9uX2RlbmllZCA9IGludChzdGQ6OmVycmM6OnBlcm1pc3Npb25fZGVuaWVkKSwKKyAgcmVhZF9vbmx5X2ZpbGVfc3lzdGVtID0gaW50KHN0ZDo6ZXJyYzo6cmVhZF9vbmx5X2ZpbGVfc3lzdGVtKSwKKyAgcmVzb3VyY2VfZGVhZGxvY2tfd291bGRfb2NjdXIgPSBpbnQoc3RkOjplcnJjOjpyZXNvdXJjZV9kZWFkbG9ja193b3VsZF9vY2N1ciksCisgIHJlc291cmNlX3VuYXZhaWxhYmxlX3RyeV9hZ2FpbiA9CisgICAgICBpbnQoc3RkOjplcnJjOjpyZXNvdXJjZV91bmF2YWlsYWJsZV90cnlfYWdhaW4pLAorICByZXN1bHRfb3V0X29mX3JhbmdlID0gaW50KHN0ZDo6ZXJyYzo6cmVzdWx0X291dF9vZl9yYW5nZSksCisgIHRvb19tYW55X2ZpbGVzX29wZW5faW5fc3lzdGVtID0gaW50KHN0ZDo6ZXJyYzo6dG9vX21hbnlfZmlsZXNfb3Blbl9pbl9zeXN0ZW0pLAorICB0b29fbWFueV9maWxlc19vcGVuID0gaW50KHN0ZDo6ZXJyYzo6dG9vX21hbnlfZmlsZXNfb3BlbiksCisgIHRvb19tYW55X2xpbmtzID0gaW50KHN0ZDo6ZXJyYzo6dG9vX21hbnlfbGlua3MpCit9OworCitpbmxpbmUgc3RkOjplcnJvcl9jb2RlIG1ha2VfZXJyb3JfY29kZShlcnJjIEUpIHsKKyAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZShzdGF0aWNfY2FzdDxpbnQ+KEUpLCBzdGQ6OmdlbmVyaWNfY2F0ZWdvcnkoKSk7Cit9Cit9CisKK25hbWVzcGFjZSBzdGQgewordGVtcGxhdGUgPD4gc3RydWN0IGlzX2Vycm9yX2NvZGVfZW51bTxsbHZtOjplcnJjPiA6IHN0ZDo6dHJ1ZV90eXBlIHt9OworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRXJybm8uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9FcnJuby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1ZGMxZWEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRXJybm8uaApAQCAtMCwwICsxLDQ2IEBACisvLz09PS0gbGx2bS9TdXBwb3J0L0Vycm5vLmggLSBQb3J0YWJsZStjb252ZW5pZW50IGVycm5vIGhhbmRsaW5nIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgc29tZSBwb3J0YWJsZSBhbmQgY29udmVuaWVudCBmdW5jdGlvbnMgdG8gZGVhbCB3aXRoIGVycm5vLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0VSUk5PX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0VSUk5PX0gKKworI2luY2x1ZGUgPGNlcnJubz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBzeXMgeworCisvLy8gUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgZXJybm8gdmFsdWUsIHVzaW5nIHdoYXRldmVyCisvLy8gdGhyZWFkLXNhZmUgdmFyaWFudCBvZiBzdHJlcnJvcigpIGlzIGF2YWlsYWJsZS4gIEJlIHN1cmUgdG8gY2FsbCB0aGlzCisvLy8gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIGZ1bmN0aW9uIHRoYXQgc2V0IGVycm5vLCBvciBlcnJubyBtYXkgaGF2ZSBiZWVuCisvLy8gb3ZlcndyaXR0ZW4gYnkgYW4gaW50ZXJ2ZW5pbmcgY2FsbC4KK3N0ZDo6c3RyaW5nIFN0ckVycm9yKCk7CisKKy8vLyBMaWtlIHRoZSBuby1hcmd1bWVudCB2ZXJzaW9uIGFib3ZlLCBidXQgdXNlcyBccCBlcnJudW0gaW5zdGVhZCBvZiBlcnJuby4KK3N0ZDo6c3RyaW5nIFN0ckVycm9yKGludCBlcnJudW0pOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRmFpbFQsIHR5cGVuYW1lIEZ1biwgdHlwZW5hbWUuLi4gQXJncz4KK2lubGluZSBhdXRvIFJldHJ5QWZ0ZXJTaWduYWwoY29uc3QgRmFpbFQgJkZhaWwsIGNvbnN0IEZ1biAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJncyAmLi4uIEFzKSAtPiBkZWNsdHlwZShGKEFzLi4uKSkgeworICBkZWNsdHlwZShGKEFzLi4uKSkgUmVzOworICBkbworICAgIFJlcyA9IEYoQXMuLi4pOworICB3aGlsZSAoUmVzID09IEZhaWwgJiYgZXJybm8gPT0gRUlOVFIpOworICByZXR1cm4gUmVzOworfQorCit9ICAvLyBuYW1lc3BhY2Ugc3lzCit9ICAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgIC8vIExMVk1fU1lTVEVNX0VSUk5PX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9FcnJvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjUyN2Y4OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9FcnJvci5oCkBAIC0wLDAgKzEsMTE2NyBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9FcnJvci5oIC0gUmVjb3ZlcmFibGUgZXJyb3IgaGFuZGxpbmcgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhbiBBUEkgdXNlZCB0byByZXBvcnQgcmVjb3ZlcmFibGUgZXJyb3JzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0VSUk9SX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0VSUk9SX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9hYmktYnJlYWtpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxpZ25PZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yT3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGNzdGRsaWI+CisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRXJyb3JTdWNjZXNzOworCisvLy8gQmFzZSBjbGFzcyBmb3IgZXJyb3IgaW5mbyBjbGFzc2VzLiBEbyBub3QgZXh0ZW5kIHRoaXMgZGlyZWN0bHk6IEV4dGVuZAorLy8vIHRoZSBFcnJvckluZm8gdGVtcGxhdGUgc3ViY2xhc3MgaW5zdGVhZC4KK2NsYXNzIEVycm9ySW5mb0Jhc2UgeworcHVibGljOgorICB2aXJ0dWFsIH5FcnJvckluZm9CYXNlKCkgPSBkZWZhdWx0OworCisgIC8vLyBQcmludCBhbiBlcnJvciBtZXNzYWdlIHRvIGFuIG91dHB1dCBzdHJlYW0uCisgIHZpcnR1YWwgdm9pZCBsb2cocmF3X29zdHJlYW0gJk9TKSBjb25zdCA9IDA7CisKKyAgLy8vIFJldHVybiB0aGUgZXJyb3IgbWVzc2FnZSBhcyBhIHN0cmluZy4KKyAgdmlydHVhbCBzdGQ6OnN0cmluZyBtZXNzYWdlKCkgY29uc3QgeworICAgIHN0ZDo6c3RyaW5nIE1zZzsKKyAgICByYXdfc3RyaW5nX29zdHJlYW0gT1MoTXNnKTsKKyAgICBsb2coT1MpOworICAgIHJldHVybiBPUy5zdHIoKTsKKyAgfQorCisgIC8vLyBDb252ZXJ0IHRoaXMgZXJyb3IgdG8gYSBzdGQ6OmVycm9yX2NvZGUuCisgIC8vLworICAvLy8gVGhpcyBpcyBhIHRlbXBvcmFyeSBjcnV0Y2ggdG8gZW5hYmxlIGludGVyYWN0aW9uIHdpdGggY29kZSBzdGlsbAorICAvLy8gdXNpbmcgc3RkOjplcnJvcl9jb2RlLiBJdCB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlIGZ1dHVyZS4KKyAgdmlydHVhbCBzdGQ6OmVycm9yX2NvZGUgY29udmVydFRvRXJyb3JDb2RlKCkgY29uc3QgPSAwOworCisgIC8vIFJldHVybnMgdGhlIGNsYXNzIElEIGZvciB0aGlzIHR5cGUuCisgIHN0YXRpYyBjb25zdCB2b2lkICpjbGFzc0lEKCkgeyByZXR1cm4gJklEOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgY2xhc3MgSUQgZm9yIHRoZSBkeW5hbWljIHR5cGUgb2YgdGhpcyBFcnJvckluZm9CYXNlIGluc3RhbmNlLgorICB2aXJ0dWFsIGNvbnN0IHZvaWQgKmR5bmFtaWNDbGFzc0lEKCkgY29uc3QgPSAwOworCisgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyBpbnN0YW5jZSBpcyBhIHN1YmNsYXNzIG9mIHRoZSBjbGFzcyBpZGVudGlmaWVkIGJ5CisgIC8vIENsYXNzSUQuCisgIHZpcnR1YWwgYm9vbCBpc0EoY29uc3Qgdm9pZCAqY29uc3QgQ2xhc3NJRCkgY29uc3QgeworICAgIHJldHVybiBDbGFzc0lEID09IGNsYXNzSUQoKTsKKyAgfQorCisgIC8vIENoZWNrIHdoZXRoZXIgdGhpcyBpbnN0YW5jZSBpcyBhIHN1YmNsYXNzIG9mIEVycm9ySW5mb1QuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBFcnJvckluZm9UPiBib29sIGlzQSgpIGNvbnN0IHsKKyAgICByZXR1cm4gaXNBKEVycm9ySW5mb1Q6OmNsYXNzSUQoKSk7CisgIH0KKworcHJpdmF0ZToKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCisgIHN0YXRpYyBjaGFyIElEOworfTsKKworLy8vIExpZ2h0d2VpZ2h0IGVycm9yIGNsYXNzIHdpdGggZXJyb3IgY29udGV4dCBhbmQgbWFuZGF0b3J5IGNoZWNraW5nLgorLy8vCisvLy8gSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3Mgd3JhcCBhIEVycm9ySW5mb0Jhc2UgcG9pbnRlci4gRmFpbHVyZSBzdGF0ZXMKKy8vLyBhcmUgcmVwcmVzZW50ZWQgYnkgc2V0dGluZyB0aGUgcG9pbnRlciB0byBhIEVycm9ySW5mb0Jhc2Ugc3ViY2xhc3MKKy8vLyBpbnN0YW5jZSBjb250YWluaW5nIGluZm9ybWF0aW9uIGRlc2NyaWJpbmcgdGhlIGZhaWx1cmUuIFN1Y2Nlc3MgaXMKKy8vLyByZXByZXNlbnRlZCBieSBhIG51bGwgcG9pbnRlciB2YWx1ZS4KKy8vLworLy8vIEluc3RhbmNlcyBvZiBFcnJvciBhbHNvIGNvbnRhaW5zIGEgJ0NoZWNrZWQnIGZsYWcsIHdoaWNoIG11c3QgYmUgc2V0CisvLy8gYmVmb3JlIHRoZSBkZXN0cnVjdG9yIGlzIGNhbGxlZCwgb3RoZXJ3aXNlIHRoZSBkZXN0cnVjdG9yIHdpbGwgdHJpZ2dlciBhCisvLy8gcnVudGltZSBlcnJvci4gVGhpcyBlbmZvcmNlcyBhdCBydW50aW1lIHRoZSByZXF1aXJlbWVudCB0aGF0IGFsbCBFcnJvcgorLy8vIGluc3RhbmNlcyBiZSBjaGVja2VkIG9yIHJldHVybmVkIHRvIHRoZSBjYWxsZXIuCisvLy8KKy8vLyBUaGVyZSBhcmUgdHdvIHdheXMgdG8gc2V0IHRoZSBjaGVja2VkIGZsYWcsIGRlcGVuZGluZyBvbiB3aGF0IHN0YXRlIHRoZQorLy8vIEVycm9yIGluc3RhbmNlIGlzIGluLiBGb3IgRXJyb3IgaW5zdGFuY2VzIGluZGljYXRpbmcgc3VjY2VzcywgaXQKKy8vLyBpcyBzdWZmaWNpZW50IHRvIGludm9rZSB0aGUgYm9vbGVhbiBjb252ZXJzaW9uIG9wZXJhdG9yLiBFLmcuOgorLy8vCisvLy8gICBAY29kZXsuY3BwfQorLy8vICAgRXJyb3IgZm9vKDwuLi4+KTsKKy8vLworLy8vICAgaWYgKGF1dG8gRSA9IGZvbyg8Li4uPikpCisvLy8gICAgIHJldHVybiBFOyAvLyA8LSBSZXR1cm4gRSBpZiBpdCBpcyBpbiB0aGUgZXJyb3Igc3RhdGUuCisvLy8gICAvLyBXZSBoYXZlIHZlcmlmaWVkIHRoYXQgRSB3YXMgaW4gdGhlIHN1Y2Nlc3Mgc3RhdGUuIEl0IGNhbiBub3cgYmUgc2FmZWx5CisvLy8gICAvLyBkZXN0cm95ZWQuCisvLy8gICBAZW5kY29kZQorLy8vCisvLy8gQSBzdWNjZXNzIHZhbHVlICpjYW4gbm90KiBiZSBkcm9wcGVkLiBGb3IgZXhhbXBsZSwganVzdCBjYWxsaW5nICdmb28oPC4uLj4pJworLy8vIHdpdGhvdXQgdGVzdGluZyB0aGUgcmV0dXJuIHZhbHVlIHdpbGwgcmFpc2UgYSBydW50aW1lIGVycm9yLCBldmVuIGlmIGZvbworLy8vIHJldHVybnMgc3VjY2Vzcy4KKy8vLworLy8vIEZvciBFcnJvciBpbnN0YW5jZXMgcmVwcmVzZW50aW5nIGZhaWx1cmUsIHlvdSBtdXN0IHVzZSBlaXRoZXIgdGhlCisvLy8gaGFuZGxlRXJyb3JzIG9yIGhhbmRsZUFsbEVycm9ycyBmdW5jdGlvbiB3aXRoIGEgdHlwZWQgaGFuZGxlci4gRS5nLjoKKy8vLworLy8vICAgQGNvZGV7LmNwcH0KKy8vLyAgIGNsYXNzIE15RXJyb3JJbmZvIDogcHVibGljIEVycm9ySW5mbzxNeUVycm9ySW5mbz4geworLy8vICAgICAvLyBDdXN0b20gZXJyb3IgaW5mby4KKy8vLyAgIH07CisvLy8KKy8vLyAgIEVycm9yIGZvbyg8Li4uPikgeyByZXR1cm4gbWFrZV9lcnJvcjxNeUVycm9ySW5mbz4oLi4uKTsgfQorLy8vCisvLy8gICBhdXRvIEUgPSBmb28oPC4uLj4pOyAvLyA8LSBmb28gcmV0dXJucyBmYWlsdXJlIHdpdGggTXlFcnJvckluZm8uCisvLy8gICBhdXRvIE5ld0UgPQorLy8vICAgICBoYW5kbGVFcnJvcnMoRSwKKy8vLyAgICAgICBbXShjb25zdCBNeUVycm9ySW5mbyAmTSkgeworLy8vICAgICAgICAgLy8gRGVhbCB3aXRoIHRoZSBlcnJvci4KKy8vLyAgICAgICB9LAorLy8vICAgICAgIFtdKHN0ZDo6dW5pcXVlX3B0cjxPdGhlckVycm9yPiBNKSAtPiBFcnJvciB7CisvLy8gICAgICAgICBpZiAoY2FuSGFuZGxlKCpNKSkgeworLy8vICAgICAgICAgICAvLyBoYW5kbGUgZXJyb3IuCisvLy8gICAgICAgICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworLy8vICAgICAgICAgfQorLy8vICAgICAgICAgLy8gQ291bGRuJ3QgaGFuZGxlIHRoaXMgZXJyb3IgaW5zdGFuY2UuIFBhc3MgaXQgdXAgdGhlIHN0YWNrLgorLy8vICAgICAgICAgcmV0dXJuIEVycm9yKHN0ZDo6bW92ZShNKSk7CisvLy8gICAgICAgKTsKKy8vLyAgIC8vIE5vdGUgLSB3ZSBtdXN0IGNoZWNrIG9yIHJldHVybiBOZXdFIGluIGNhc2UgYW55IG9mIHRoZSBoYW5kbGVycworLy8vICAgLy8gcmV0dXJuZWQgYSBuZXcgZXJyb3IuCisvLy8gICBAZW5kY29kZQorLy8vCisvLy8gVGhlIGhhbmRsZUFsbEVycm9ycyBmdW5jdGlvbiBpcyBpZGVudGljYWwgdG8gaGFuZGxlRXJyb3JzLCBleGNlcHQKKy8vLyB0aGF0IGl0IGhhcyBhIHZvaWQgcmV0dXJuIHR5cGUsIGFuZCByZXF1aXJlcyBhbGwgZXJyb3JzIHRvIGJlIGhhbmRsZWQgYW5kCisvLy8gbm8gbmV3IGVycm9ycyBiZSByZXR1cm5lZC4gSXQgcHJldmVudHMgZXJyb3JzIChhc3N1bWluZyB0aGV5IGNhbiBhbGwgYmUKKy8vLyBoYW5kbGVkKSBmcm9tIGhhdmluZyB0byBiZSBidWJibGVkIGFsbCB0aGUgd2F5IHRvIHRoZSB0b3AtbGV2ZWwuCisvLy8KKy8vLyAqQWxsKiBFcnJvciBpbnN0YW5jZXMgbXVzdCBiZSBjaGVja2VkIGJlZm9yZSBkZXN0cnVjdGlvbiwgZXZlbiBpZgorLy8vIHRoZXkncmUgbW92ZWQtYXNzaWduZWQgb3IgY29uc3RydWN0ZWQgZnJvbSBTdWNjZXNzIHZhbHVlcyB0aGF0IGhhdmUgYWxyZWFkeQorLy8vIGJlZW4gY2hlY2tlZC4gVGhpcyBlbmZvcmNlcyBjaGVja2luZyB0aHJvdWdoIGFsbCBsZXZlbHMgb2YgdGhlIGNhbGwgc3RhY2suCitjbGFzcyBMTFZNX05PRElTQ0FSRCBFcnJvciB7CisgIC8vIEVycm9yTGlzdCBuZWVkcyB0byBiZSBhYmxlIHRvIHlhbmsgRXJyb3JJbmZvQmFzZSBwb2ludGVycyBvdXQgb2YgdGhpcworICAvLyBjbGFzcyB0byBhZGQgdG8gdGhlIGVycm9yIGxpc3QuCisgIGZyaWVuZCBjbGFzcyBFcnJvckxpc3Q7CisKKyAgLy8gaGFuZGxlRXJyb3JzIG5lZWRzIHRvIGJlIGFibGUgdG8gc2V0IHRoZSBDaGVja2VkIGZsYWcuCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBIYW5kbGVyVHM+CisgIGZyaWVuZCBFcnJvciBoYW5kbGVFcnJvcnMoRXJyb3IgRSwgSGFuZGxlclRzICYmLi4uIEhhbmRsZXJzKTsKKworICAvLyBFeHBlY3RlZDxUPiBuZWVkcyB0byBiZSBhYmxlIHRvIHN0ZWFsIHRoZSBwYXlsb2FkIHdoZW4gY29uc3RydWN0ZWQgZnJvbSBhbgorICAvLyBlcnJvci4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyBFeHBlY3RlZDsKKworcHJvdGVjdGVkOgorICAvLy8gQ3JlYXRlIGEgc3VjY2VzcyB2YWx1ZS4gUHJlZmVyIHVzaW5nICdFcnJvcjo6c3VjY2VzcygpJyBmb3IgcmVhZGFiaWxpdHkKKyAgRXJyb3IoKSB7CisgICAgc2V0UHRyKG51bGxwdHIpOworICAgIHNldENoZWNrZWQoZmFsc2UpOworICB9CisKK3B1YmxpYzoKKyAgLy8vIENyZWF0ZSBhIHN1Y2Nlc3MgdmFsdWUuCisgIHN0YXRpYyBFcnJvclN1Y2Nlc3Mgc3VjY2VzcygpOworCisgIC8vIEVycm9ycyBhcmUgbm90IGNvcHktY29uc3RydWN0YWJsZS4KKyAgRXJyb3IoY29uc3QgRXJyb3IgJk90aGVyKSA9IGRlbGV0ZTsKKworICAvLy8gTW92ZS1jb25zdHJ1Y3QgYW4gZXJyb3IgdmFsdWUuIFRoZSBuZXdseSBjb25zdHJ1Y3RlZCBlcnJvciBpcyBjb25zaWRlcmVkCisgIC8vLyB1bmNoZWNrZWQsIGV2ZW4gaWYgdGhlIHNvdXJjZSBlcnJvciBoYWQgYmVlbiBjaGVja2VkLiBUaGUgb3JpZ2luYWwgZXJyb3IKKyAgLy8vIGJlY29tZXMgYSBjaGVja2VkIFN1Y2Nlc3MgdmFsdWUsIHJlZ2FyZGxlc3Mgb2YgaXRzIG9yaWdpbmFsIHN0YXRlLgorICBFcnJvcihFcnJvciAmJk90aGVyKSB7CisgICAgc2V0Q2hlY2tlZCh0cnVlKTsKKyAgICAqdGhpcyA9IHN0ZDo6bW92ZShPdGhlcik7CisgIH0KKworICAvLy8gQ3JlYXRlIGFuIGVycm9yIHZhbHVlLiBQcmVmZXIgdXNpbmcgdGhlICdtYWtlX2Vycm9yJyBmdW5jdGlvbiwgYnV0CisgIC8vLyB0aGlzIGNvbnN0cnVjdG9yIGNhbiBiZSB1c2VmdWwgd2hlbiAicmUtdGhyb3dpbmciIGVycm9ycyBmcm9tIGhhbmRsZXJzLgorICBFcnJvcihzdGQ6OnVuaXF1ZV9wdHI8RXJyb3JJbmZvQmFzZT4gUGF5bG9hZCkgeworICAgIHNldFB0cihQYXlsb2FkLnJlbGVhc2UoKSk7CisgICAgc2V0Q2hlY2tlZChmYWxzZSk7CisgIH0KKworICAvLyBFcnJvcnMgYXJlIG5vdCBjb3B5LWFzc2lnbmFibGUuCisgIEVycm9yICZvcGVyYXRvcj0oY29uc3QgRXJyb3IgJk90aGVyKSA9IGRlbGV0ZTsKKworICAvLy8gTW92ZS1hc3NpZ24gYW4gZXJyb3IgdmFsdWUuIFRoZSBjdXJyZW50IGVycm9yIG11c3QgcmVwcmVzZW50IHN1Y2Nlc3MsIHlvdQorICAvLy8geW91IGNhbm5vdCBvdmVyd3JpdGUgYW4gdW5oYW5kbGVkIGVycm9yLiBUaGUgY3VycmVudCBlcnJvciBpcyB0aGVuCisgIC8vLyBjb25zaWRlcmVkIHVuY2hlY2tlZC4gVGhlIHNvdXJjZSBlcnJvciBiZWNvbWVzIGEgY2hlY2tlZCBzdWNjZXNzIHZhbHVlLAorICAvLy8gcmVnYXJkbGVzcyBvZiBpdHMgb3JpZ2luYWwgc3RhdGUuCisgIEVycm9yICZvcGVyYXRvcj0oRXJyb3IgJiZPdGhlcikgeworICAgIC8vIERvbid0IGFsbG93IG92ZXJ3cml0aW5nIG9mIHVuY2hlY2tlZCB2YWx1ZXMuCisgICAgYXNzZXJ0SXNDaGVja2VkKCk7CisgICAgc2V0UHRyKE90aGVyLmdldFB0cigpKTsKKworICAgIC8vIFRoaXMgRXJyb3IgaXMgdW5jaGVja2VkLCBldmVuIGlmIHRoZSBzb3VyY2UgZXJyb3Igd2FzIGNoZWNrZWQuCisgICAgc2V0Q2hlY2tlZChmYWxzZSk7CisKKyAgICAvLyBOdWxsIG91dCBPdGhlcidzIHBheWxvYWQgYW5kIHNldCBpdHMgY2hlY2tlZCBiaXQuCisgICAgT3RoZXIuc2V0UHRyKG51bGxwdHIpOworICAgIE90aGVyLnNldENoZWNrZWQodHJ1ZSk7CisKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gRGVzdHJveSBhIEVycm9yLiBGYWlscyB3aXRoIGEgY2FsbCB0byBhYm9ydCgpIGlmIHRoZSBlcnJvciBpcworICAvLy8gdW5jaGVja2VkLgorICB+RXJyb3IoKSB7CisgICAgYXNzZXJ0SXNDaGVja2VkKCk7CisgICAgZGVsZXRlIGdldFB0cigpOworICB9CisKKyAgLy8vIEJvb2wgY29udmVyc2lvbi4gUmV0dXJucyB0cnVlIGlmIHRoaXMgRXJyb3IgaXMgaW4gYSBmYWlsdXJlIHN0YXRlLAorICAvLy8gYW5kIGZhbHNlIGlmIGl0IGlzIGluIGFuIGFjY2VwdCBzdGF0ZS4gSWYgdGhlIGVycm9yIGlzIGluIGEgU3VjY2VzcyBzdGF0ZQorICAvLy8gaXQgd2lsbCBiZSBjb25zaWRlcmVkIGNoZWNrZWQuCisgIGV4cGxpY2l0IG9wZXJhdG9yIGJvb2woKSB7CisgICAgc2V0Q2hlY2tlZChnZXRQdHIoKSA9PSBudWxscHRyKTsKKyAgICByZXR1cm4gZ2V0UHRyKCkgIT0gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBDaGVjayB3aGV0aGVyIG9uZSBlcnJvciBpcyBhIHN1YmNsYXNzIG9mIGFub3RoZXIuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBFcnJUPiBib29sIGlzQSgpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0UHRyKCkgJiYgZ2V0UHRyKCktPmlzQShFcnJUOjpjbGFzc0lEKCkpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIGR5bmFtaWMgY2xhc3MgaWQgb2YgdGhpcyBlcnJvciwgb3IgbnVsbCBpZiB0aGlzIGlzIGEgc3VjY2VzcworICAvLy8gdmFsdWUuCisgIGNvbnN0IHZvaWQqIGR5bmFtaWNDbGFzc0lEKCkgY29uc3QgeworICAgIGlmICghZ2V0UHRyKCkpCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gZ2V0UHRyKCktPmR5bmFtaWNDbGFzc0lEKCk7CisgIH0KKworcHJpdmF0ZToKKyNpZiBMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTCisgIC8vIGFzc2VydElzQ2hlY2tlZCgpIGhhcHBlbnMgdmVyeSBmcmVxdWVudGx5LCBidXQgdW5kZXIgbm9ybWFsIGNpcmN1bXN0YW5jZXMKKyAgLy8gaXMgc3VwcG9zZWQgdG8gYmUgYSBuby1vcC4gIFNvIHdlIHdhbnQgaXQgdG8gYmUgaW5saW5lZCwgYnV0IGhhdmluZyBhIGJ1bmNoCisgIC8vIG9mIGRlYnVnIHByaW50cyBjYW4gY2F1c2UgdGhlIGZ1bmN0aW9uIHRvIGJlIHRvbyBsYXJnZSBmb3IgaW5saW5pbmcuICBTbworICAvLyBpdCdzIGltcG9ydGFudCB0aGF0IHdlIGRlZmluZSB0aGlzIGZ1bmN0aW9uIG91dCBvZiBsaW5lIHNvIHRoYXQgaXQgY2FuJ3QgYmUKKyAgLy8gaW5saW5lZC4KKyAgTExWTV9BVFRSSUJVVEVfTk9SRVRVUk4KKyAgdm9pZCBmYXRhbFVuY2hlY2tlZEVycm9yKCkgY29uc3Q7CisjZW5kaWYKKworICB2b2lkIGFzc2VydElzQ2hlY2tlZCgpIHsKKyNpZiBMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTCisgICAgaWYgKExMVk1fVU5MSUtFTFkoIWdldENoZWNrZWQoKSB8fCBnZXRQdHIoKSkpCisgICAgICBmYXRhbFVuY2hlY2tlZEVycm9yKCk7CisjZW5kaWYKKyAgfQorCisgIEVycm9ySW5mb0Jhc2UgKmdldFB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxFcnJvckluZm9CYXNlKj4oCisgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFBheWxvYWQpICYKKyAgICAgICAgICAgICB+c3RhdGljX2Nhc3Q8dWludHB0cl90PigweDEpKTsKKyAgfQorCisgIHZvaWQgc2V0UHRyKEVycm9ySW5mb0Jhc2UgKkVJKSB7CisjaWYgTExWTV9FTkFCTEVfQUJJX0JSRUFLSU5HX0NIRUNLUworICAgIFBheWxvYWQgPSByZWludGVycHJldF9jYXN0PEVycm9ySW5mb0Jhc2UqPigKKyAgICAgICAgICAgICAgICAocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KEVJKSAmCisgICAgICAgICAgICAgICAgIH5zdGF0aWNfY2FzdDx1aW50cHRyX3Q+KDB4MSkpIHwKKyAgICAgICAgICAgICAgICAocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KFBheWxvYWQpICYgMHgxKSk7CisjZWxzZQorICAgIFBheWxvYWQgPSBFSTsKKyNlbmRpZgorICB9CisKKyAgYm9vbCBnZXRDaGVja2VkKCkgY29uc3QgeworI2lmIExMVk1fRU5BQkxFX0FCSV9CUkVBS0lOR19DSEVDS1MKKyAgICByZXR1cm4gKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihQYXlsb2FkKSAmIDB4MSkgPT0gMDsKKyNlbHNlCisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKKyAgfQorCisgIHZvaWQgc2V0Q2hlY2tlZChib29sIFYpIHsKKyAgICBQYXlsb2FkID0gcmVpbnRlcnByZXRfY2FzdDxFcnJvckluZm9CYXNlKj4oCisgICAgICAgICAgICAgICAgKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihQYXlsb2FkKSAmCisgICAgICAgICAgICAgICAgICB+c3RhdGljX2Nhc3Q8dWludHB0cl90PigweDEpKSB8CisgICAgICAgICAgICAgICAgICAoViA/IDAgOiAxKSk7CisgIH0KKworICBzdGQ6OnVuaXF1ZV9wdHI8RXJyb3JJbmZvQmFzZT4gdGFrZVBheWxvYWQoKSB7CisgICAgc3RkOjp1bmlxdWVfcHRyPEVycm9ySW5mb0Jhc2U+IFRtcChnZXRQdHIoKSk7CisgICAgc2V0UHRyKG51bGxwdHIpOworICAgIHNldENoZWNrZWQodHJ1ZSk7CisgICAgcmV0dXJuIFRtcDsKKyAgfQorCisgIEVycm9ySW5mb0Jhc2UgKlBheWxvYWQgPSBudWxscHRyOworfTsKKworLy8vIFN1YmNsYXNzIG9mIEVycm9yIGZvciB0aGUgc29sZSBwdXJwb3NlIG9mIGlkZW50aWZ5aW5nIHRoZSBzdWNjZXNzIHBhdGggaW4KKy8vLyB0aGUgdHlwZSBzeXN0ZW0uIFRoaXMgYWxsb3dzIHRvIGNhdGNoIGludmFsaWQgY29udmVyc2lvbiB0byBFeHBlY3RlZDxUPiBhdAorLy8vIGNvbXBpbGUgdGltZS4KK2NsYXNzIEVycm9yU3VjY2VzcyA6IHB1YmxpYyBFcnJvciB7fTsKKworaW5saW5lIEVycm9yU3VjY2VzcyBFcnJvcjo6c3VjY2VzcygpIHsgcmV0dXJuIEVycm9yU3VjY2VzcygpOyB9CisKKy8vLyBNYWtlIGEgRXJyb3IgaW5zdGFuY2UgcmVwcmVzZW50aW5nIGZhaWx1cmUgdXNpbmcgdGhlIGdpdmVuIGVycm9yIGluZm8KKy8vLyB0eXBlLgordGVtcGxhdGUgPHR5cGVuYW1lIEVyclQsIHR5cGVuYW1lLi4uIEFyZ1RzPiBFcnJvciBtYWtlX2Vycm9yKEFyZ1RzICYmLi4uIEFyZ3MpIHsKKyAgcmV0dXJuIEVycm9yKGxsdm06Om1ha2VfdW5pcXVlPEVyclQ+KHN0ZDo6Zm9yd2FyZDxBcmdUcz4oQXJncykuLi4pKTsKK30KKworLy8vIEJhc2UgY2xhc3MgZm9yIHVzZXIgZXJyb3IgdHlwZXMuIFVzZXJzIHNob3VsZCBkZWNsYXJlIHRoZWlyIGVycm9yIHR5cGVzCisvLy8gbGlrZToKKy8vLworLy8vIGNsYXNzIE15RXJyb3IgOiBwdWJsaWMgRXJyb3JJbmZvPE15RXJyb3I+IHsKKy8vLyAgIC4uLi4KKy8vLyB9OworLy8vCisvLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRXJyb3JJbmZvQmFzZTo6a2luZAorLy8vIG1ldGhvZCwgd2hpY2ggaXMgdXNlZCBieSB0aGUgRXJyb3IgUlRUSSBzeXN0ZW0uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVGhpc0VyclQsIHR5cGVuYW1lIFBhcmVudEVyclQgPSBFcnJvckluZm9CYXNlPgorY2xhc3MgRXJyb3JJbmZvIDogcHVibGljIFBhcmVudEVyclQgeworcHVibGljOgorICBzdGF0aWMgY29uc3Qgdm9pZCAqY2xhc3NJRCgpIHsgcmV0dXJuICZUaGlzRXJyVDo6SUQ7IH0KKworICBjb25zdCB2b2lkICpkeW5hbWljQ2xhc3NJRCgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICZUaGlzRXJyVDo6SUQ7IH0KKworICBib29sIGlzQShjb25zdCB2b2lkICpjb25zdCBDbGFzc0lEKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIENsYXNzSUQgPT0gY2xhc3NJRCgpIHx8IFBhcmVudEVyclQ6OmlzQShDbGFzc0lEKTsKKyAgfQorfTsKKworLy8vIFNwZWNpYWwgRXJyb3JJbmZvIHN1YmNsYXNzIHJlcHJlc2VudGluZyBhIGxpc3Qgb2YgRXJyb3JJbmZvcy4KKy8vLyBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgY29uc3RydWN0ZWQgYnkgam9pbkVycm9yLgorY2xhc3MgRXJyb3JMaXN0IGZpbmFsIDogcHVibGljIEVycm9ySW5mbzxFcnJvckxpc3Q+IHsKKyAgLy8gaGFuZGxlRXJyb3JzIG5lZWRzIHRvIGJlIGFibGUgdG8gaXRlcmF0ZSB0aGUgcGF5bG9hZCBsaXN0IG9mIGFuCisgIC8vIEVycm9yTGlzdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIEhhbmRsZXJUcz4KKyAgZnJpZW5kIEVycm9yIGhhbmRsZUVycm9ycyhFcnJvciBFLCBIYW5kbGVyVHMgJiYuLi4gSGFuZGxlcnMpOworCisgIC8vIGpvaW5FcnJvcnMgaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2Ygam9pbi4KKyAgZnJpZW5kIEVycm9yIGpvaW5FcnJvcnMoRXJyb3IsIEVycm9yKTsKKworcHVibGljOgorICB2b2lkIGxvZyhyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBPUyA8PCAiTXVsdGlwbGUgZXJyb3JzOlxuIjsKKyAgICBmb3IgKGF1dG8gJkVyclBheWxvYWQgOiBQYXlsb2FkcykgeworICAgICAgRXJyUGF5bG9hZC0+bG9nKE9TKTsKKyAgICAgIE9TIDw8ICJcbiI7CisgICAgfQorICB9CisKKyAgc3RkOjplcnJvcl9jb2RlIGNvbnZlcnRUb0Vycm9yQ29kZSgpIGNvbnN0IG92ZXJyaWRlOworCisgIC8vIFVzZWQgYnkgRXJyb3JJbmZvOjpjbGFzc0lELgorICBzdGF0aWMgY2hhciBJRDsKKworcHJpdmF0ZToKKyAgRXJyb3JMaXN0KHN0ZDo6dW5pcXVlX3B0cjxFcnJvckluZm9CYXNlPiBQYXlsb2FkMSwKKyAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxFcnJvckluZm9CYXNlPiBQYXlsb2FkMikgeworICAgIGFzc2VydCghUGF5bG9hZDEtPmlzQTxFcnJvckxpc3Q+KCkgJiYgIVBheWxvYWQyLT5pc0E8RXJyb3JMaXN0PigpICYmCisgICAgICAgICAgICJFcnJvckxpc3QgY29uc3RydWN0b3IgcGF5bG9hZHMgc2hvdWxkIGJlIHNpbmdsZXRvbiBlcnJvcnMiKTsKKyAgICBQYXlsb2Fkcy5wdXNoX2JhY2soc3RkOjptb3ZlKFBheWxvYWQxKSk7CisgICAgUGF5bG9hZHMucHVzaF9iYWNrKHN0ZDo6bW92ZShQYXlsb2FkMikpOworICB9CisKKyAgc3RhdGljIEVycm9yIGpvaW4oRXJyb3IgRTEsIEVycm9yIEUyKSB7CisgICAgaWYgKCFFMSkKKyAgICAgIHJldHVybiBFMjsKKyAgICBpZiAoIUUyKQorICAgICAgcmV0dXJuIEUxOworICAgIGlmIChFMS5pc0E8RXJyb3JMaXN0PigpKSB7CisgICAgICBhdXRvICZFMUxpc3QgPSBzdGF0aWNfY2FzdDxFcnJvckxpc3QgJj4oKkUxLmdldFB0cigpKTsKKyAgICAgIGlmIChFMi5pc0E8RXJyb3JMaXN0PigpKSB7CisgICAgICAgIGF1dG8gRTJQYXlsb2FkID0gRTIudGFrZVBheWxvYWQoKTsKKyAgICAgICAgYXV0byAmRTJMaXN0ID0gc3RhdGljX2Nhc3Q8RXJyb3JMaXN0ICY+KCpFMlBheWxvYWQpOworICAgICAgICBmb3IgKGF1dG8gJlBheWxvYWQgOiBFMkxpc3QuUGF5bG9hZHMpCisgICAgICAgICAgRTFMaXN0LlBheWxvYWRzLnB1c2hfYmFjayhzdGQ6Om1vdmUoUGF5bG9hZCkpOworICAgICAgfSBlbHNlCisgICAgICAgIEUxTGlzdC5QYXlsb2Fkcy5wdXNoX2JhY2soRTIudGFrZVBheWxvYWQoKSk7CisKKyAgICAgIHJldHVybiBFMTsKKyAgICB9CisgICAgaWYgKEUyLmlzQTxFcnJvckxpc3Q+KCkpIHsKKyAgICAgIGF1dG8gJkUyTGlzdCA9IHN0YXRpY19jYXN0PEVycm9yTGlzdCAmPigqRTIuZ2V0UHRyKCkpOworICAgICAgRTJMaXN0LlBheWxvYWRzLmluc2VydChFMkxpc3QuUGF5bG9hZHMuYmVnaW4oKSwgRTEudGFrZVBheWxvYWQoKSk7CisgICAgICByZXR1cm4gRTI7CisgICAgfQorICAgIHJldHVybiBFcnJvcihzdGQ6OnVuaXF1ZV9wdHI8RXJyb3JMaXN0PigKKyAgICAgICAgbmV3IEVycm9yTGlzdChFMS50YWtlUGF5bG9hZCgpLCBFMi50YWtlUGF5bG9hZCgpKSkpOworICB9CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEVycm9ySW5mb0Jhc2U+PiBQYXlsb2FkczsKK307CisKKy8vLyBDb25jYXRlbmF0ZSBlcnJvcnMuIFRoZSByZXN1bHRpbmcgRXJyb3IgaXMgdW5jaGVja2VkLCBhbmQgY29udGFpbnMgdGhlCisvLy8gRXJyb3JJbmZvKHMpLCBpZiBhbnksIGNvbnRhaW5lZCBpbiBFMSwgZm9sbG93ZWQgYnkgdGhlCisvLy8gRXJyb3JJbmZvKHMpLCBpZiBhbnksIGNvbnRhaW5lZCBpbiBFMi4KK2lubGluZSBFcnJvciBqb2luRXJyb3JzKEVycm9yIEUxLCBFcnJvciBFMikgeworICByZXR1cm4gRXJyb3JMaXN0Ojpqb2luKHN0ZDo6bW92ZShFMSksIHN0ZDo6bW92ZShFMikpOworfQorCisvLy8gVGFnZ2VkIHVuaW9uIGhvbGRpbmcgZWl0aGVyIGEgVCBvciBhIEVycm9yLgorLy8vCisvLy8gVGhpcyBjbGFzcyBwYXJhbGxlbHMgRXJyb3JPciwgYnV0IHJlcGxhY2VzIGVycm9yX2NvZGUgd2l0aCBFcnJvci4gU2luY2UKKy8vLyBFcnJvciBjYW5ub3QgYmUgY29waWVkLCB0aGlzIGNsYXNzIHJlcGxhY2VzIGdldEVycm9yKCkgd2l0aAorLy8vIHRha2VFcnJvcigpLiBJdCBhbHNvIGFkZHMgYW4gYm9vbCBlcnJvcklzQTxFcnJUPigpIG1ldGhvZCBmb3IgdGVzdGluZyB0aGUKKy8vLyBlcnJvciBjbGFzcyB0eXBlLgordGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIExMVk1fTk9ESVNDQVJEIEV4cGVjdGVkIHsKKyAgdGVtcGxhdGUgPGNsYXNzIFQxPiBmcmllbmQgY2xhc3MgRXhwZWN0ZWRBc091dFBhcmFtZXRlcjsKKyAgdGVtcGxhdGUgPGNsYXNzIE90aGVyVD4gZnJpZW5kIGNsYXNzIEV4cGVjdGVkOworCisgIHN0YXRpYyBjb25zdCBib29sIGlzUmVmID0gc3RkOjppc19yZWZlcmVuY2U8VD46OnZhbHVlOworCisgIHVzaW5nIHdyYXAgPSBSZWZlcmVuY2VTdG9yYWdlPHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxUPjo6dHlwZT47CisKKyAgdXNpbmcgZXJyb3JfdHlwZSA9IHN0ZDo6dW5pcXVlX3B0cjxFcnJvckluZm9CYXNlPjsKKworcHVibGljOgorICB1c2luZyBzdG9yYWdlX3R5cGUgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPGlzUmVmLCB3cmFwLCBUPjo6dHlwZTsKKyAgdXNpbmcgdmFsdWVfdHlwZSA9IFQ7CisKK3ByaXZhdGU6CisgIHVzaW5nIHJlZmVyZW5jZSA9IHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxUPjo6dHlwZSAmOworICB1c2luZyBjb25zdF9yZWZlcmVuY2UgPSBjb25zdCB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGUgJjsKKyAgdXNpbmcgcG9pbnRlciA9IHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxUPjo6dHlwZSAqOworICB1c2luZyBjb25zdF9wb2ludGVyID0gY29uc3QgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlICo7CisKK3B1YmxpYzoKKyAgLy8vIENyZWF0ZSBhbiBFeHBlY3RlZDxUPiBlcnJvciB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBFcnJvci4KKyAgRXhwZWN0ZWQoRXJyb3IgRXJyKQorICAgICAgOiBIYXNFcnJvcih0cnVlKQorI2lmIExMVk1fRU5BQkxFX0FCSV9CUkVBS0lOR19DSEVDS1MKKyAgICAgICAgLy8gRXhwZWN0ZWQgaXMgdW5jaGVja2VkIHVwb24gY29uc3RydWN0aW9uIGluIERlYnVnIGJ1aWxkcy4KKyAgICAgICAgLCBVbmNoZWNrZWQodHJ1ZSkKKyNlbmRpZgorICB7CisgICAgYXNzZXJ0KEVyciAmJiAiQ2Fubm90IGNyZWF0ZSBFeHBlY3RlZDxUPiBmcm9tIEVycm9yIHN1Y2Nlc3MgdmFsdWUuIik7CisgICAgbmV3IChnZXRFcnJvclN0b3JhZ2UoKSkgZXJyb3JfdHlwZShFcnIudGFrZVBheWxvYWQoKSk7CisgIH0KKworICAvLy8gRm9yYmlkIHRvIGNvbnZlcnQgZnJvbSBFcnJvcjo6c3VjY2VzcygpIGltcGxpY2l0bHksIHRoaXMgYXZvaWRzIGhhdmluZworICAvLy8gRXhwZWN0ZWQ8VD4gZm9vKCkgeyByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsgfSB3aGljaCBjb21waWxlcyBvdGhlcndpc2UKKyAgLy8vIGJ1dCB0cmlnZ2VycyB0aGUgYXNzZXJ0aW9uIGFib3ZlLgorICBFeHBlY3RlZChFcnJvclN1Y2Nlc3MpID0gZGVsZXRlOworCisgIC8vLyBDcmVhdGUgYW4gRXhwZWN0ZWQ8VD4gc3VjY2VzcyB2YWx1ZSBmcm9tIHRoZSBnaXZlbiBPdGhlclQgdmFsdWUsIHdoaWNoCisgIC8vLyBtdXN0IGJlIGNvbnZlcnRpYmxlIHRvIFQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBPdGhlclQ+CisgIEV4cGVjdGVkKE90aGVyVCAmJlZhbCwKKyAgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxPdGhlclQsIFQ+Ojp2YWx1ZT46OnR5cGUKKyAgICAgICAgICAgICAgICogPSBudWxscHRyKQorICAgICAgOiBIYXNFcnJvcihmYWxzZSkKKyNpZiBMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTCisgICAgICAgIC8vIEV4cGVjdGVkIGlzIHVuY2hlY2tlZCB1cG9uIGNvbnN0cnVjdGlvbiBpbiBEZWJ1ZyBidWlsZHMuCisgICAgICAgICwgVW5jaGVja2VkKHRydWUpCisjZW5kaWYKKyAgeworICAgIG5ldyAoZ2V0U3RvcmFnZSgpKSBzdG9yYWdlX3R5cGUoc3RkOjpmb3J3YXJkPE90aGVyVD4oVmFsKSk7CisgIH0KKworICAvLy8gTW92ZSBjb25zdHJ1Y3QgYW4gRXhwZWN0ZWQ8VD4gdmFsdWUuCisgIEV4cGVjdGVkKEV4cGVjdGVkICYmT3RoZXIpIHsgbW92ZUNvbnN0cnVjdChzdGQ6Om1vdmUoT3RoZXIpKTsgfQorCisgIC8vLyBNb3ZlIGNvbnN0cnVjdCBhbiBFeHBlY3RlZDxUPiB2YWx1ZSBmcm9tIGFuIEV4cGVjdGVkPE90aGVyVD4sIHdoZXJlIE90aGVyVAorICAvLy8gbXVzdCBiZSBjb252ZXJ0aWJsZSB0byBULgorICB0ZW1wbGF0ZSA8Y2xhc3MgT3RoZXJUPgorICBFeHBlY3RlZChFeHBlY3RlZDxPdGhlclQ+ICYmT3RoZXIsCisgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfY29udmVydGlibGU8T3RoZXJULCBUPjo6dmFsdWU+Ojp0eXBlCisgICAgICAgICAgICAgICAqID0gbnVsbHB0cikgeworICAgIG1vdmVDb25zdHJ1Y3Qoc3RkOjptb3ZlKE90aGVyKSk7CisgIH0KKworICAvLy8gTW92ZSBjb25zdHJ1Y3QgYW4gRXhwZWN0ZWQ8VD4gdmFsdWUgZnJvbSBhbiBFeHBlY3RlZDxPdGhlclQ+LCB3aGVyZSBPdGhlclQKKyAgLy8vIGlzbid0IGNvbnZlcnRpYmxlIHRvIFQuCisgIHRlbXBsYXRlIDxjbGFzcyBPdGhlclQ+CisgIGV4cGxpY2l0IEV4cGVjdGVkKAorICAgICAgRXhwZWN0ZWQ8T3RoZXJUPiAmJk90aGVyLAorICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IXN0ZDo6aXNfY29udmVydGlibGU8T3RoZXJULCBUPjo6dmFsdWU+Ojp0eXBlICogPQorICAgICAgICAgIG51bGxwdHIpIHsKKyAgICBtb3ZlQ29uc3RydWN0KHN0ZDo6bW92ZShPdGhlcikpOworICB9CisKKyAgLy8vIE1vdmUtYXNzaWduIGZyb20gYW5vdGhlciBFeHBlY3RlZDxUPi4KKyAgRXhwZWN0ZWQgJm9wZXJhdG9yPShFeHBlY3RlZCAmJk90aGVyKSB7CisgICAgbW92ZUFzc2lnbihzdGQ6Om1vdmUoT3RoZXIpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICAvLy8gRGVzdHJveSBhbiBFeHBlY3RlZDxUPi4KKyAgfkV4cGVjdGVkKCkgeworICAgIGFzc2VydElzQ2hlY2tlZCgpOworICAgIGlmICghSGFzRXJyb3IpCisgICAgICBnZXRTdG9yYWdlKCktPn5zdG9yYWdlX3R5cGUoKTsKKyAgICBlbHNlCisgICAgICBnZXRFcnJvclN0b3JhZ2UoKS0+fmVycm9yX3R5cGUoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGZhbHNlIGlmIHRoZXJlIGlzIGFuIGVycm9yLgorICBleHBsaWNpdCBvcGVyYXRvciBib29sKCkgeworI2lmIExMVk1fRU5BQkxFX0FCSV9CUkVBS0lOR19DSEVDS1MKKyAgICBVbmNoZWNrZWQgPSBIYXNFcnJvcjsKKyNlbmRpZgorICAgIHJldHVybiAhSGFzRXJyb3I7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgYSByZWZlcmVuY2UgdG8gdGhlIHN0b3JlZCBUIHZhbHVlLgorICByZWZlcmVuY2UgZ2V0KCkgeworICAgIGFzc2VydElzQ2hlY2tlZCgpOworICAgIHJldHVybiAqZ2V0U3RvcmFnZSgpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgY29uc3QgcmVmZXJlbmNlIHRvIHRoZSBzdG9yZWQgVCB2YWx1ZS4KKyAgY29uc3RfcmVmZXJlbmNlIGdldCgpIGNvbnN0IHsKKyAgICBhc3NlcnRJc0NoZWNrZWQoKTsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxFeHBlY3RlZDxUPiAqPih0aGlzKS0+Z2V0KCk7CisgIH0KKworICAvLy8gXGJyaWVmIENoZWNrIHRoYXQgdGhpcyBFeHBlY3RlZDxUPiBpcyBhbiBlcnJvciBvZiB0eXBlIEVyclQuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBFcnJUPiBib29sIGVycm9ySXNBKCkgY29uc3QgeworICAgIHJldHVybiBIYXNFcnJvciAmJiAoKmdldEVycm9yU3RvcmFnZSgpKS0+dGVtcGxhdGUgaXNBPEVyclQ+KCk7CisgIH0KKworICAvLy8gXGJyaWVmIFRha2Ugb3duZXJzaGlwIG9mIHRoZSBzdG9yZWQgZXJyb3IuCisgIC8vLyBBZnRlciBjYWxsaW5nIHRoaXMgdGhlIEV4cGVjdGVkPFQ+IGlzIGluIGFuIGluZGV0ZXJtaW5hdGUgc3RhdGUgdGhhdCBjYW4KKyAgLy8vIG9ubHkgYmUgc2FmZWx5IGRlc3RydWN0ZWQuIE5vIGZ1cnRoZXIgY2FsbHMgKGJlc2lkZSB0aGUgZGVzdHJ1Y3Rvcikgc2hvdWxkCisgIC8vLyBiZSBtYWRlIG9uIHRoZSBFeHBlY3RlZDxUPiB2YXVsZS4KKyAgRXJyb3IgdGFrZUVycm9yKCkgeworI2lmIExMVk1fRU5BQkxFX0FCSV9CUkVBS0lOR19DSEVDS1MKKyAgICBVbmNoZWNrZWQgPSBmYWxzZTsKKyNlbmRpZgorICAgIHJldHVybiBIYXNFcnJvciA/IEVycm9yKHN0ZDo6bW92ZSgqZ2V0RXJyb3JTdG9yYWdlKCkpKSA6IEVycm9yOjpzdWNjZXNzKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBzdG9yZWQgVCB2YWx1ZS4KKyAgcG9pbnRlciBvcGVyYXRvci0+KCkgeworICAgIGFzc2VydElzQ2hlY2tlZCgpOworICAgIHJldHVybiB0b1BvaW50ZXIoZ2V0U3RvcmFnZSgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhIGNvbnN0IHBvaW50ZXIgdG8gdGhlIHN0b3JlZCBUIHZhbHVlLgorICBjb25zdF9wb2ludGVyIG9wZXJhdG9yLT4oKSBjb25zdCB7CisgICAgYXNzZXJ0SXNDaGVja2VkKCk7CisgICAgcmV0dXJuIHRvUG9pbnRlcihnZXRTdG9yYWdlKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzdG9yZWQgVCB2YWx1ZS4KKyAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIHsKKyAgICBhc3NlcnRJc0NoZWNrZWQoKTsKKyAgICByZXR1cm4gKmdldFN0b3JhZ2UoKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJucyBhIGNvbnN0IHJlZmVyZW5jZSB0byB0aGUgc3RvcmVkIFQgdmFsdWUuCisgIGNvbnN0X3JlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7CisgICAgYXNzZXJ0SXNDaGVja2VkKCk7CisgICAgcmV0dXJuICpnZXRTdG9yYWdlKCk7CisgIH0KKworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPGNsYXNzIFQxPgorICBzdGF0aWMgYm9vbCBjb21wYXJlVGhpc0lmU2FtZVR5cGUoY29uc3QgVDEgJmEsIGNvbnN0IFQxICZiKSB7CisgICAgcmV0dXJuICZhID09ICZiOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KKyAgc3RhdGljIGJvb2wgY29tcGFyZVRoaXNJZlNhbWVUeXBlKGNvbnN0IFQxICZhLCBjb25zdCBUMiAmYikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBPdGhlclQ+IHZvaWQgbW92ZUNvbnN0cnVjdChFeHBlY3RlZDxPdGhlclQ+ICYmT3RoZXIpIHsKKyAgICBIYXNFcnJvciA9IE90aGVyLkhhc0Vycm9yOworI2lmIExMVk1fRU5BQkxFX0FCSV9CUkVBS0lOR19DSEVDS1MKKyAgICBVbmNoZWNrZWQgPSB0cnVlOworICAgIE90aGVyLlVuY2hlY2tlZCA9IGZhbHNlOworI2VuZGlmCisKKyAgICBpZiAoIUhhc0Vycm9yKQorICAgICAgbmV3IChnZXRTdG9yYWdlKCkpIHN0b3JhZ2VfdHlwZShzdGQ6Om1vdmUoKk90aGVyLmdldFN0b3JhZ2UoKSkpOworICAgIGVsc2UKKyAgICAgIG5ldyAoZ2V0RXJyb3JTdG9yYWdlKCkpIGVycm9yX3R5cGUoc3RkOjptb3ZlKCpPdGhlci5nZXRFcnJvclN0b3JhZ2UoKSkpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIE90aGVyVD4gdm9pZCBtb3ZlQXNzaWduKEV4cGVjdGVkPE90aGVyVD4gJiZPdGhlcikgeworICAgIGFzc2VydElzQ2hlY2tlZCgpOworCisgICAgaWYgKGNvbXBhcmVUaGlzSWZTYW1lVHlwZSgqdGhpcywgT3RoZXIpKQorICAgICAgcmV0dXJuOworCisgICAgdGhpcy0+fkV4cGVjdGVkKCk7CisgICAgbmV3ICh0aGlzKSBFeHBlY3RlZChzdGQ6Om1vdmUoT3RoZXIpKTsKKyAgfQorCisgIHBvaW50ZXIgdG9Qb2ludGVyKHBvaW50ZXIgVmFsKSB7IHJldHVybiBWYWw7IH0KKworICBjb25zdF9wb2ludGVyIHRvUG9pbnRlcihjb25zdF9wb2ludGVyIFZhbCkgY29uc3QgeyByZXR1cm4gVmFsOyB9CisKKyAgcG9pbnRlciB0b1BvaW50ZXIod3JhcCAqVmFsKSB7IHJldHVybiAmVmFsLT5nZXQoKTsgfQorCisgIGNvbnN0X3BvaW50ZXIgdG9Qb2ludGVyKGNvbnN0IHdyYXAgKlZhbCkgY29uc3QgeyByZXR1cm4gJlZhbC0+Z2V0KCk7IH0KKworICBzdG9yYWdlX3R5cGUgKmdldFN0b3JhZ2UoKSB7CisgICAgYXNzZXJ0KCFIYXNFcnJvciAmJiAiQ2Fubm90IGdldCB2YWx1ZSB3aGVuIGFuIGVycm9yIGV4aXN0cyEiKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxzdG9yYWdlX3R5cGUgKj4oVFN0b3JhZ2UuYnVmZmVyKTsKKyAgfQorCisgIGNvbnN0IHN0b3JhZ2VfdHlwZSAqZ2V0U3RvcmFnZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIUhhc0Vycm9yICYmICJDYW5ub3QgZ2V0IHZhbHVlIHdoZW4gYW4gZXJyb3IgZXhpc3RzISIpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHN0b3JhZ2VfdHlwZSAqPihUU3RvcmFnZS5idWZmZXIpOworICB9CisKKyAgZXJyb3JfdHlwZSAqZ2V0RXJyb3JTdG9yYWdlKCkgeworICAgIGFzc2VydChIYXNFcnJvciAmJiAiQ2Fubm90IGdldCBlcnJvciB3aGVuIGEgdmFsdWUgZXhpc3RzISIpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGVycm9yX3R5cGUgKj4oRXJyb3JTdG9yYWdlLmJ1ZmZlcik7CisgIH0KKworICBjb25zdCBlcnJvcl90eXBlICpnZXRFcnJvclN0b3JhZ2UoKSBjb25zdCB7CisgICAgYXNzZXJ0KEhhc0Vycm9yICYmICJDYW5ub3QgZ2V0IGVycm9yIHdoZW4gYSB2YWx1ZSBleGlzdHMhIik7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgZXJyb3JfdHlwZSAqPihFcnJvclN0b3JhZ2UuYnVmZmVyKTsKKyAgfQorCisgIC8vIFVzZWQgYnkgRXhwZWN0ZWRBc091dFBhcmFtZXRlciB0byByZXNldCB0aGUgY2hlY2tlZCBmbGFnLgorICB2b2lkIHNldFVuY2hlY2tlZCgpIHsKKyNpZiBMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTCisgICAgVW5jaGVja2VkID0gdHJ1ZTsKKyNlbmRpZgorICB9CisKKyNpZiBMTFZNX0VOQUJMRV9BQklfQlJFQUtJTkdfQ0hFQ0tTCisgIExMVk1fQVRUUklCVVRFX05PUkVUVVJOCisgIExMVk1fQVRUUklCVVRFX05PSU5MSU5FCisgIHZvaWQgZmF0YWxVbmNoZWNrZWRFeHBlY3RlZCgpIGNvbnN0IHsKKyAgICBkYmdzKCkgPDwgIkV4cGVjdGVkPFQ+IG11c3QgYmUgY2hlY2tlZCBiZWZvcmUgYWNjZXNzIG9yIGRlc3RydWN0aW9uLlxuIjsKKyAgICBpZiAoSGFzRXJyb3IpIHsKKyAgICAgIGRiZ3MoKSA8PCAiVW5jaGVja2VkIEV4cGVjdGVkPFQ+IGNvbnRhaW5lZCBlcnJvcjpcbiI7CisgICAgICAoKmdldEVycm9yU3RvcmFnZSgpKS0+bG9nKGRiZ3MoKSk7CisgICAgfSBlbHNlCisgICAgICBkYmdzKCkgPDwgIkV4cGVjdGVkPFQ+IHZhbHVlIHdhcyBpbiBzdWNjZXNzIHN0YXRlLiAoTm90ZTogRXhwZWN0ZWQ8VD4gIgorICAgICAgICAgICAgICAgICJ2YWx1ZXMgaW4gc3VjY2VzcyBtb2RlIG11c3Qgc3RpbGwgYmUgY2hlY2tlZCBwcmlvciB0byBiZWluZyAiCisgICAgICAgICAgICAgICAgImRlc3Ryb3llZCkuXG4iOworICAgIGFib3J0KCk7CisgIH0KKyNlbmRpZgorCisgIHZvaWQgYXNzZXJ0SXNDaGVja2VkKCkgeworI2lmIExMVk1fRU5BQkxFX0FCSV9CUkVBS0lOR19DSEVDS1MKKyAgICBpZiAoTExWTV9VTkxJS0VMWShVbmNoZWNrZWQpKQorICAgICAgZmF0YWxVbmNoZWNrZWRFeHBlY3RlZCgpOworI2VuZGlmCisgIH0KKworICB1bmlvbiB7CisgICAgQWxpZ25lZENoYXJBcnJheVVuaW9uPHN0b3JhZ2VfdHlwZT4gVFN0b3JhZ2U7CisgICAgQWxpZ25lZENoYXJBcnJheVVuaW9uPGVycm9yX3R5cGU+IEVycm9yU3RvcmFnZTsKKyAgfTsKKyAgYm9vbCBIYXNFcnJvciA6IDE7CisjaWYgTExWTV9FTkFCTEVfQUJJX0JSRUFLSU5HX0NIRUNLUworICBib29sIFVuY2hlY2tlZCA6IDE7CisjZW5kaWYKK307CisKKy8vLyBSZXBvcnQgYSBzZXJpb3VzIGVycm9yLCBjYWxsaW5nIGFueSBpbnN0YWxsZWQgZXJyb3IgaGFuZGxlci4gU2VlCisvLy8gRXJyb3JIYW5kbGluZy5oLgorTExWTV9BVFRSSUJVVEVfTk9SRVRVUk4gdm9pZCByZXBvcnRfZmF0YWxfZXJyb3IoRXJyb3IgRXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBnZW5fY3Jhc2hfZGlhZyA9IHRydWUpOworCisvLy8gUmVwb3J0IGEgZmF0YWwgZXJyb3IgaWYgRXJyIGlzIGEgZmFpbHVyZSB2YWx1ZS4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gd3JhcCBjYWxscyB0byBmYWxsaWJsZSBmdW5jdGlvbnMgT05MWSB3aGVuIGl0CisvLy8gaXMga25vd24gdGhhdCB0aGUgRXJyb3Igd2lsbCBhbHdheXMgYmUgYSBzdWNjZXNzIHZhbHVlLiBFLmcuCisvLy8KKy8vLyAgIEBjb2Rley5jcHB9CisvLy8gICAvLyBmb28gb25seSBhdHRlbXB0cyB0aGUgZmFsbGlibGUgb3BlcmF0aW9uIGlmIERvRmFsbGlibGVPcGVyYXRpb24gaXMKKy8vLyAgIC8vIHRydWUuIElmIERvRmFsbGlibGVPcGVyYXRpb24gaXMgZmFsc2UgdGhlbiBmb28gYWx3YXlzIHJldHVybnMKKy8vLyAgIC8vIEVycm9yOjpzdWNjZXNzKCkuCisvLy8gICBFcnJvciBmb28oYm9vbCBEb0ZhbGxpYmxlT3BlcmF0aW9uKTsKKy8vLworLy8vICAgY2FudEZhaWwoZm9vKGZhbHNlKSk7CisvLy8gICBAZW5kY29kZQoraW5saW5lIHZvaWQgY2FudEZhaWwoRXJyb3IgRXJyLCBjb25zdCBjaGFyICpNc2cgPSBudWxscHRyKSB7CisgIGlmIChFcnIpIHsKKyAgICBpZiAoIU1zZykKKyAgICAgIE1zZyA9ICJGYWlsdXJlIHZhbHVlIHJldHVybmVkIGZyb20gY2FudEZhaWwgd3JhcHBlZCBjYWxsIjsKKyAgICBsbHZtX3VucmVhY2hhYmxlKE1zZyk7CisgIH0KK30KKworLy8vIFJlcG9ydCBhIGZhdGFsIGVycm9yIGlmIFZhbE9yRXJyIGlzIGEgZmFpbHVyZSB2YWx1ZSwgb3RoZXJ3aXNlIHVud3JhcHMgYW5kCisvLy8gcmV0dXJucyB0aGUgY29udGFpbmVkIHZhbHVlLgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiBjYW4gYmUgdXNlZCB0byB3cmFwIGNhbGxzIHRvIGZhbGxpYmxlIGZ1bmN0aW9ucyBPTkxZIHdoZW4gaXQKKy8vLyBpcyBrbm93biB0aGF0IHRoZSBFcnJvciB3aWxsIGFsd2F5cyBiZSBhIHN1Y2Nlc3MgdmFsdWUuIEUuZy4KKy8vLworLy8vICAgQGNvZGV7LmNwcH0KKy8vLyAgIC8vIGZvbyBvbmx5IGF0dGVtcHRzIHRoZSBmYWxsaWJsZSBvcGVyYXRpb24gaWYgRG9GYWxsaWJsZU9wZXJhdGlvbiBpcworLy8vICAgLy8gdHJ1ZS4gSWYgRG9GYWxsaWJsZU9wZXJhdGlvbiBpcyBmYWxzZSB0aGVuIGZvbyBhbHdheXMgcmV0dXJucyBhbiBpbnQuCisvLy8gICBFeHBlY3RlZDxpbnQ+IGZvbyhib29sIERvRmFsbGlibGVPcGVyYXRpb24pOworLy8vCisvLy8gICBpbnQgWCA9IGNhbnRGYWlsKGZvbyhmYWxzZSkpOworLy8vICAgQGVuZGNvZGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCBjYW50RmFpbChFeHBlY3RlZDxUPiBWYWxPckVyciwgY29uc3QgY2hhciAqTXNnID0gbnVsbHB0cikgeworICBpZiAoVmFsT3JFcnIpCisgICAgcmV0dXJuIHN0ZDo6bW92ZSgqVmFsT3JFcnIpOworICBlbHNlIHsKKyAgICBpZiAoIU1zZykKKyAgICAgIE1zZyA9ICJGYWlsdXJlIHZhbHVlIHJldHVybmVkIGZyb20gY2FudEZhaWwgd3JhcHBlZCBjYWxsIjsKKyAgICBsbHZtX3VucmVhY2hhYmxlKE1zZyk7CisgIH0KK30KKworLy8vIFJlcG9ydCBhIGZhdGFsIGVycm9yIGlmIFZhbE9yRXJyIGlzIGEgZmFpbHVyZSB2YWx1ZSwgb3RoZXJ3aXNlIHVud3JhcHMgYW5kCisvLy8gcmV0dXJucyB0aGUgY29udGFpbmVkIHJlZmVyZW5jZS4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gY2FuIGJlIHVzZWQgdG8gd3JhcCBjYWxscyB0byBmYWxsaWJsZSBmdW5jdGlvbnMgT05MWSB3aGVuIGl0CisvLy8gaXMga25vd24gdGhhdCB0aGUgRXJyb3Igd2lsbCBhbHdheXMgYmUgYSBzdWNjZXNzIHZhbHVlLiBFLmcuCisvLy8KKy8vLyAgIEBjb2Rley5jcHB9CisvLy8gICAvLyBmb28gb25seSBhdHRlbXB0cyB0aGUgZmFsbGlibGUgb3BlcmF0aW9uIGlmIERvRmFsbGlibGVPcGVyYXRpb24gaXMKKy8vLyAgIC8vIHRydWUuIElmIERvRmFsbGlibGVPcGVyYXRpb24gaXMgZmFsc2UgdGhlbiBmb28gYWx3YXlzIHJldHVybnMgYSBCYXImLgorLy8vICAgRXhwZWN0ZWQ8QmFyJj4gZm9vKGJvb2wgRG9GYWxsaWJsZU9wZXJhdGlvbik7CisvLy8KKy8vLyAgIEJhciAmWCA9IGNhbnRGYWlsKGZvbyhmYWxzZSkpOworLy8vICAgQGVuZGNvZGUKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCYgY2FudEZhaWwoRXhwZWN0ZWQ8VCY+IFZhbE9yRXJyLCBjb25zdCBjaGFyICpNc2cgPSBudWxscHRyKSB7CisgIGlmIChWYWxPckVycikKKyAgICByZXR1cm4gKlZhbE9yRXJyOworICBlbHNlIHsKKyAgICBpZiAoIU1zZykKKyAgICAgIE1zZyA9ICJGYWlsdXJlIHZhbHVlIHJldHVybmVkIGZyb20gY2FudEZhaWwgd3JhcHBlZCBjYWxsIjsKKyAgICBsbHZtX3VucmVhY2hhYmxlKE1zZyk7CisgIH0KK30KKworLy8vIEhlbHBlciBmb3IgdGVzdGluZyBhcHBsaWNhYmlsaXR5IG9mLCBhbmQgYXBwbHlpbmcsIGhhbmRsZXJzIGZvcgorLy8vIEVycm9ySW5mbyB0eXBlcy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBIYW5kbGVyVD4KK2NsYXNzIEVycm9ySGFuZGxlclRyYWl0cworICAgIDogcHVibGljIEVycm9ySGFuZGxlclRyYWl0czxkZWNsdHlwZSgKKyAgICAgICAgICAmc3RkOjpyZW1vdmVfcmVmZXJlbmNlPEhhbmRsZXJUPjo6dHlwZTo6b3BlcmF0b3IoKSk+IHt9OworCisvLyBTcGVjaWFsaXphdGlvbiBmdW5jdGlvbnMgb2YgdGhlIGZvcm0gJ0Vycm9yIChjb25zdCBFcnJUJiknLgordGVtcGxhdGUgPHR5cGVuYW1lIEVyclQ+IGNsYXNzIEVycm9ySGFuZGxlclRyYWl0czxFcnJvciAoJikoRXJyVCAmKT4geworcHVibGljOgorICBzdGF0aWMgYm9vbCBhcHBsaWVzVG8oY29uc3QgRXJyb3JJbmZvQmFzZSAmRSkgeworICAgIHJldHVybiBFLnRlbXBsYXRlIGlzQTxFcnJUPigpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXJUPgorICBzdGF0aWMgRXJyb3IgYXBwbHkoSGFuZGxlclQgJiZILCBzdGQ6OnVuaXF1ZV9wdHI8RXJyb3JJbmZvQmFzZT4gRSkgeworICAgIGFzc2VydChhcHBsaWVzVG8oKkUpICYmICJBcHBseWluZyBpbmNvcnJlY3QgaGFuZGxlciIpOworICAgIHJldHVybiBIKHN0YXRpY19jYXN0PEVyclQgJj4oKkUpKTsKKyAgfQorfTsKKworLy8gU3BlY2lhbGl6YXRpb24gZnVuY3Rpb25zIG9mIHRoZSBmb3JtICd2b2lkIChjb25zdCBFcnJUJiknLgordGVtcGxhdGUgPHR5cGVuYW1lIEVyclQ+IGNsYXNzIEVycm9ySGFuZGxlclRyYWl0czx2b2lkICgmKShFcnJUICYpPiB7CitwdWJsaWM6CisgIHN0YXRpYyBib29sIGFwcGxpZXNUbyhjb25zdCBFcnJvckluZm9CYXNlICZFKSB7CisgICAgcmV0dXJuIEUudGVtcGxhdGUgaXNBPEVyclQ+KCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlclQ+CisgIHN0YXRpYyBFcnJvciBhcHBseShIYW5kbGVyVCAmJkgsIHN0ZDo6dW5pcXVlX3B0cjxFcnJvckluZm9CYXNlPiBFKSB7CisgICAgYXNzZXJ0KGFwcGxpZXNUbygqRSkgJiYgIkFwcGx5aW5nIGluY29ycmVjdCBoYW5kbGVyIik7CisgICAgSChzdGF0aWNfY2FzdDxFcnJUICY+KCpFKSk7CisgICAgcmV0dXJuIEVycm9yOjpzdWNjZXNzKCk7CisgIH0KK307CisKKy8vLyBTcGVjaWFsaXphdGlvbiBmb3IgZnVuY3Rpb25zIG9mIHRoZSBmb3JtICdFcnJvciAoc3RkOjp1bmlxdWVfcHRyPEVyclQ+KScuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRXJyVD4KK2NsYXNzIEVycm9ySGFuZGxlclRyYWl0czxFcnJvciAoJikoc3RkOjp1bmlxdWVfcHRyPEVyclQ+KT4geworcHVibGljOgorICBzdGF0aWMgYm9vbCBhcHBsaWVzVG8oY29uc3QgRXJyb3JJbmZvQmFzZSAmRSkgeworICAgIHJldHVybiBFLnRlbXBsYXRlIGlzQTxFcnJUPigpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEhhbmRsZXJUPgorICBzdGF0aWMgRXJyb3IgYXBwbHkoSGFuZGxlclQgJiZILCBzdGQ6OnVuaXF1ZV9wdHI8RXJyb3JJbmZvQmFzZT4gRSkgeworICAgIGFzc2VydChhcHBsaWVzVG8oKkUpICYmICJBcHBseWluZyBpbmNvcnJlY3QgaGFuZGxlciIpOworICAgIHN0ZDo6dW5pcXVlX3B0cjxFcnJUPiBTdWJFKHN0YXRpY19jYXN0PEVyclQgKj4oRS5yZWxlYXNlKCkpKTsKKyAgICByZXR1cm4gSChzdGQ6Om1vdmUoU3ViRSkpOworICB9Cit9OworCisvLy8gU3BlY2lhbGl6YXRpb24gZm9yIGZ1bmN0aW9ucyBvZiB0aGUgZm9ybSAndm9pZCAoc3RkOjp1bmlxdWVfcHRyPEVyclQ+KScuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRXJyVD4KK2NsYXNzIEVycm9ySGFuZGxlclRyYWl0czx2b2lkICgmKShzdGQ6OnVuaXF1ZV9wdHI8RXJyVD4pPiB7CitwdWJsaWM6CisgIHN0YXRpYyBib29sIGFwcGxpZXNUbyhjb25zdCBFcnJvckluZm9CYXNlICZFKSB7CisgICAgcmV0dXJuIEUudGVtcGxhdGUgaXNBPEVyclQ+KCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlclQ+CisgIHN0YXRpYyBFcnJvciBhcHBseShIYW5kbGVyVCAmJkgsIHN0ZDo6dW5pcXVlX3B0cjxFcnJvckluZm9CYXNlPiBFKSB7CisgICAgYXNzZXJ0KGFwcGxpZXNUbygqRSkgJiYgIkFwcGx5aW5nIGluY29ycmVjdCBoYW5kbGVyIik7CisgICAgc3RkOjp1bmlxdWVfcHRyPEVyclQ+IFN1YkUoc3RhdGljX2Nhc3Q8RXJyVCAqPihFLnJlbGVhc2UoKSkpOworICAgIEgoc3RkOjptb3ZlKFN1YkUpKTsKKyAgICByZXR1cm4gRXJyb3I6OnN1Y2Nlc3MoKTsKKyAgfQorfTsKKworLy8gU3BlY2lhbGl6YXRpb24gZm9yIG1lbWJlciBmdW5jdGlvbnMgb2YgdGhlIGZvcm0gJ1JldFQgKGNvbnN0IEVyclQmKScuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQywgdHlwZW5hbWUgUmV0VCwgdHlwZW5hbWUgRXJyVD4KK2NsYXNzIEVycm9ySGFuZGxlclRyYWl0czxSZXRUIChDOjoqKShFcnJUICYpPgorICAgIDogcHVibGljIEVycm9ySGFuZGxlclRyYWl0czxSZXRUICgmKShFcnJUICYpPiB7fTsKKworLy8gU3BlY2lhbGl6YXRpb24gZm9yIG1lbWJlciBmdW5jdGlvbnMgb2YgdGhlIGZvcm0gJ1JldFQgKGNvbnN0IEVyclQmKSBjb25zdCcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQywgdHlwZW5hbWUgUmV0VCwgdHlwZW5hbWUgRXJyVD4KK2NsYXNzIEVycm9ySGFuZGxlclRyYWl0czxSZXRUIChDOjoqKShFcnJUICYpIGNvbnN0PgorICAgIDogcHVibGljIEVycm9ySGFuZGxlclRyYWl0czxSZXRUICgmKShFcnJUICYpPiB7fTsKKworLy8gU3BlY2lhbGl6YXRpb24gZm9yIG1lbWJlciBmdW5jdGlvbnMgb2YgdGhlIGZvcm0gJ1JldFQgKGNvbnN0IEVyclQmKScuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQywgdHlwZW5hbWUgUmV0VCwgdHlwZW5hbWUgRXJyVD4KK2NsYXNzIEVycm9ySGFuZGxlclRyYWl0czxSZXRUIChDOjoqKShjb25zdCBFcnJUICYpPgorICAgIDogcHVibGljIEVycm9ySGFuZGxlclRyYWl0czxSZXRUICgmKShFcnJUICYpPiB7fTsKKworLy8gU3BlY2lhbGl6YXRpb24gZm9yIG1lbWJlciBmdW5jdGlvbnMgb2YgdGhlIGZvcm0gJ1JldFQgKGNvbnN0IEVyclQmKSBjb25zdCcuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQywgdHlwZW5hbWUgUmV0VCwgdHlwZW5hbWUgRXJyVD4KK2NsYXNzIEVycm9ySGFuZGxlclRyYWl0czxSZXRUIChDOjoqKShjb25zdCBFcnJUICYpIGNvbnN0PgorICAgIDogcHVibGljIEVycm9ySGFuZGxlclRyYWl0czxSZXRUICgmKShFcnJUICYpPiB7fTsKKworLy8vIFNwZWNpYWxpemF0aW9uIGZvciBtZW1iZXIgZnVuY3Rpb25zIG9mIHRoZSBmb3JtCisvLy8gJ1JldFQgKHN0ZDo6dW5pcXVlX3B0cjxFcnJUPiknLgordGVtcGxhdGUgPHR5cGVuYW1lIEMsIHR5cGVuYW1lIFJldFQsIHR5cGVuYW1lIEVyclQ+CitjbGFzcyBFcnJvckhhbmRsZXJUcmFpdHM8UmV0VCAoQzo6Kikoc3RkOjp1bmlxdWVfcHRyPEVyclQ+KT4KKyAgICA6IHB1YmxpYyBFcnJvckhhbmRsZXJUcmFpdHM8UmV0VCAoJikoc3RkOjp1bmlxdWVfcHRyPEVyclQ+KT4ge307CisKKy8vLyBTcGVjaWFsaXphdGlvbiBmb3IgbWVtYmVyIGZ1bmN0aW9ucyBvZiB0aGUgZm9ybQorLy8vICdSZXRUIChzdGQ6OnVuaXF1ZV9wdHI8RXJyVD4pIGNvbnN0Jy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBDLCB0eXBlbmFtZSBSZXRULCB0eXBlbmFtZSBFcnJUPgorY2xhc3MgRXJyb3JIYW5kbGVyVHJhaXRzPFJldFQgKEM6OiopKHN0ZDo6dW5pcXVlX3B0cjxFcnJUPikgY29uc3Q+CisgICAgOiBwdWJsaWMgRXJyb3JIYW5kbGVyVHJhaXRzPFJldFQgKCYpKHN0ZDo6dW5pcXVlX3B0cjxFcnJUPik+IHt9OworCitpbmxpbmUgRXJyb3IgaGFuZGxlRXJyb3JJbXBsKHN0ZDo6dW5pcXVlX3B0cjxFcnJvckluZm9CYXNlPiBQYXlsb2FkKSB7CisgIHJldHVybiBFcnJvcihzdGQ6Om1vdmUoUGF5bG9hZCkpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSGFuZGxlclQsIHR5cGVuYW1lLi4uIEhhbmRsZXJUcz4KK0Vycm9yIGhhbmRsZUVycm9ySW1wbChzdGQ6OnVuaXF1ZV9wdHI8RXJyb3JJbmZvQmFzZT4gUGF5bG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyVCAmJkhhbmRsZXIsIEhhbmRsZXJUcyAmJi4uLiBIYW5kbGVycykgeworICBpZiAoRXJyb3JIYW5kbGVyVHJhaXRzPEhhbmRsZXJUPjo6YXBwbGllc1RvKCpQYXlsb2FkKSkKKyAgICByZXR1cm4gRXJyb3JIYW5kbGVyVHJhaXRzPEhhbmRsZXJUPjo6YXBwbHkoc3RkOjpmb3J3YXJkPEhhbmRsZXJUPihIYW5kbGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKFBheWxvYWQpKTsKKyAgcmV0dXJuIGhhbmRsZUVycm9ySW1wbChzdGQ6Om1vdmUoUGF5bG9hZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkPEhhbmRsZXJUcz4oSGFuZGxlcnMpLi4uKTsKK30KKworLy8vIFBhc3MgdGhlIEVycm9ySW5mbyhzKSBjb250YWluZWQgaW4gRSB0byB0aGVpciByZXNwZWN0aXZlIGhhbmRsZXJzLiBBbnkKKy8vLyB1bmhhbmRsZWQgZXJyb3JzIChvciBFcnJvcnMgcmV0dXJuZWQgYnkgaGFuZGxlcnMpIGFyZSByZS1jb25jYXRlbmF0ZWQgYW5kCisvLy8gcmV0dXJuZWQuCisvLy8gQmVjYXVzZSB0aGlzIGZ1bmN0aW9uIHJldHVybnMgYW4gZXJyb3IsIGl0cyByZXN1bHQgbXVzdCBhbHNvIGJlIGNoZWNrZWQKKy8vLyBvciByZXR1cm5lZC4gSWYgeW91IGludGVuZCB0byBoYW5kbGUgYWxsIGVycm9ycyB1c2UgaGFuZGxlQWxsRXJyb3JzCisvLy8gKHdoaWNoIHJldHVybnMgdm9pZCwgYW5kIHdpbGwgYWJvcnQoKSBvbiB1bmhhbmRsZWQgZXJyb3JzKSBpbnN0ZWFkLgordGVtcGxhdGUgPHR5cGVuYW1lLi4uIEhhbmRsZXJUcz4KK0Vycm9yIGhhbmRsZUVycm9ycyhFcnJvciBFLCBIYW5kbGVyVHMgJiYuLi4gSHMpIHsKKyAgaWYgKCFFKQorICAgIHJldHVybiBFcnJvcjo6c3VjY2VzcygpOworCisgIHN0ZDo6dW5pcXVlX3B0cjxFcnJvckluZm9CYXNlPiBQYXlsb2FkID0gRS50YWtlUGF5bG9hZCgpOworCisgIGlmIChQYXlsb2FkLT5pc0E8RXJyb3JMaXN0PigpKSB7CisgICAgRXJyb3JMaXN0ICZMaXN0ID0gc3RhdGljX2Nhc3Q8RXJyb3JMaXN0ICY+KCpQYXlsb2FkKTsKKyAgICBFcnJvciBSOworICAgIGZvciAoYXV0byAmUCA6IExpc3QuUGF5bG9hZHMpCisgICAgICBSID0gRXJyb3JMaXN0Ojpqb2luKAorICAgICAgICAgIHN0ZDo6bW92ZShSKSwKKyAgICAgICAgICBoYW5kbGVFcnJvckltcGwoc3RkOjptb3ZlKFApLCBzdGQ6OmZvcndhcmQ8SGFuZGxlclRzPihIcykuLi4pKTsKKyAgICByZXR1cm4gUjsKKyAgfQorCisgIHJldHVybiBoYW5kbGVFcnJvckltcGwoc3RkOjptb3ZlKFBheWxvYWQpLCBzdGQ6OmZvcndhcmQ8SGFuZGxlclRzPihIcykuLi4pOworfQorCisvLy8gQmVoYXZlcyB0aGUgc2FtZSBhcyBoYW5kbGVFcnJvcnMsIGV4Y2VwdCB0aGF0IGJ5IGNvbnRyYWN0IGFsbCBlcnJvcnMKKy8vLyAqbXVzdCogYmUgaGFuZGxlZCBieSB0aGUgZ2l2ZW4gaGFuZGxlcnMgKGkuZS4gdGhlcmUgbXVzdCBiZSBubyByZW1haW5pbmcKKy8vLyBlcnJvcnMgYWZ0ZXIgcnVubmluZyB0aGUgaGFuZGxlcnMsIG9yIGxsdm1fdW5yZWFjaGFibGUgaXMgY2FsbGVkKS4KK3RlbXBsYXRlIDx0eXBlbmFtZS4uLiBIYW5kbGVyVHM+Cit2b2lkIGhhbmRsZUFsbEVycm9ycyhFcnJvciBFLCBIYW5kbGVyVHMgJiYuLi4gSGFuZGxlcnMpIHsKKyAgY2FudEZhaWwoaGFuZGxlRXJyb3JzKHN0ZDo6bW92ZShFKSwgc3RkOjpmb3J3YXJkPEhhbmRsZXJUcz4oSGFuZGxlcnMpLi4uKSk7Cit9CisKKy8vLyBDaGVjayB0aGF0IEUgaXMgYSBub24tZXJyb3IsIHRoZW4gZHJvcCBpdC4KKy8vLyBJZiBFIGlzIGFuIGVycm9yLCBsbHZtX3VucmVhY2hhYmxlIHdpbGwgYmUgY2FsbGVkLgoraW5saW5lIHZvaWQgaGFuZGxlQWxsRXJyb3JzKEVycm9yIEUpIHsKKyAgY2FudEZhaWwoc3RkOjptb3ZlKEUpKTsKK30KKworLy8vIEhhbmRsZSBhbnkgZXJyb3JzIChpZiBwcmVzZW50KSBpbiBhbiBFeHBlY3RlZDxUPiwgdGhlbiB0cnkgYSByZWNvdmVyeSBwYXRoLgorLy8vCisvLy8gSWYgdGhlIGluY29taW5nIHZhbHVlIGlzIGEgc3VjY2VzcyB2YWx1ZSBpdCBpcyByZXR1cm5lZCB1bm1vZGlmaWVkLiBJZiBpdAorLy8vIGlzIGEgZmFpbHVyZSB2YWx1ZSB0aGVuIGl0IHRoZSBjb250YWluZWQgZXJyb3IgaXMgcGFzc2VkIHRvIGhhbmRsZUVycm9ycy4KKy8vLyBJZiBoYW5kbGVFcnJvcnMgaXMgYWJsZSB0byBoYW5kbGUgdGhlIGVycm9yIHRoZW4gdGhlIFJlY292ZXJ5UGF0aCBmdW5jdG9yCisvLy8gaXMgY2FsbGVkIHRvIHN1cHBseSB0aGUgZmluYWwgcmVzdWx0LiBJZiBoYW5kbGVFcnJvcnMgaXMgbm90IGFibGUgdG8KKy8vLyBoYW5kbGUgYWxsIGVycm9ycyB0aGVuIHRoZSB1bmhhbmRsZWQgZXJyb3JzIGFyZSByZXR1cm5lZC4KKy8vLworLy8vIFRoaXMgdXRpbGl0eSBlbmFibGVzIHRoZSBmb2xsb3cgcGF0dGVybjoKKy8vLworLy8vICAgQGNvZGV7LmNwcH0KKy8vLyAgIGVudW0gRm9vU3RyYXRlZ3kgeyBBZ2dyZXNzaXZlLCBDb25zZXJ2YXRpdmUgfTsKKy8vLyAgIEV4cGVjdGVkPEZvbz4gZm9vKEZvb1N0cmF0ZWd5IFMpOworLy8vCisvLy8gICBhdXRvIFJlc3VsdE9yRXJyID0KKy8vLyAgICAgaGFuZGxlRXhwZWN0ZWQoCisvLy8gICAgICAgZm9vKEFnZ3Jlc3NpdmUpLAorLy8vICAgICAgIFtdKCkgeyByZXR1cm4gZm9vKENvbnNlcnZhdGl2ZSk7IH0sCisvLy8gICAgICAgW10oQWdncmVzc2l2ZVN0cmF0ZWd5RXJyb3ImKSB7CisvLy8gICAgICAgICAvLyBJbXBsaWNpdGx5IGNvbnVzbWUgdGhpcyAtIHdlJ2xsIHJlY292ZXIgYnkgdXNpbmcgYSBjb25zZXJ2YXRpdmUKKy8vLyAgICAgICAgIC8vIHN0cmF0ZWd5LgorLy8vICAgICAgIH0pOworLy8vCisvLy8gICBAZW5kY29kZQordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFJlY292ZXJ5RnRvciwgdHlwZW5hbWUuLi4gSGFuZGxlclRzPgorRXhwZWN0ZWQ8VD4gaGFuZGxlRXhwZWN0ZWQoRXhwZWN0ZWQ8VD4gVmFsT3JFcnIsIFJlY292ZXJ5RnRvciAmJlJlY292ZXJ5UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJUcyAmJi4uLiBIYW5kbGVycykgeworICBpZiAoVmFsT3JFcnIpCisgICAgcmV0dXJuIFZhbE9yRXJyOworCisgIGlmIChhdXRvIEVyciA9IGhhbmRsZUVycm9ycyhWYWxPckVyci50YWtlRXJyb3IoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Zm9yd2FyZDxIYW5kbGVyVHM+KEhhbmRsZXJzKS4uLikpCisgICAgcmV0dXJuIHN0ZDo6bW92ZShFcnIpOworCisgIHJldHVybiBSZWNvdmVyeVBhdGgoKTsKK30KKworLy8vIExvZyBhbGwgZXJyb3JzIChpZiBhbnkpIGluIEUgdG8gT1MuIElmIHRoZXJlIGFyZSBhbnkgZXJyb3JzLCBFcnJvckJhbm5lcgorLy8vIHdpbGwgYmUgcHJpbnRlZCBiZWZvcmUgdGhlIGZpcnN0IG9uZSBpcyBsb2dnZWQuIEEgbmV3bGluZSB3aWxsIGJlIHByaW50ZWQKKy8vLyBhZnRlciBlYWNoIGVycm9yLgorLy8vCisvLy8gVGhpcyBpcyB1c2VmdWwgaW4gdGhlIGJhc2UgbGV2ZWwgb2YgeW91ciBwcm9ncmFtIHRvIGFsbG93IGNsZWFuIHRlcm1pbmF0aW9uCisvLy8gKGFsbG93aW5nIGNsZWFuIGRlYWxsb2NhdGlvbiBvZiByZXNvdXJjZXMsIGV0Yy4pLCB3aGlsZSByZXBvcnRpbmcgZXJyb3IKKy8vLyBpbmZvcm1hdGlvbiB0byB0aGUgdXNlci4KK3ZvaWQgbG9nQWxsVW5oYW5kbGVkRXJyb3JzKEVycm9yIEUsIHJhd19vc3RyZWFtICZPUywgVHdpbmUgRXJyb3JCYW5uZXIpOworCisvLy8gV3JpdGUgYWxsIGVycm9yIG1lc3NhZ2VzIChpZiBhbnkpIGluIEUgdG8gYSBzdHJpbmcuIFRoZSBuZXdsaW5lIGNoYXJhY3RlcgorLy8vIGlzIHVzZWQgdG8gc2VwYXJhdGUgZXJyb3IgbWVzc2FnZXMuCitpbmxpbmUgc3RkOjpzdHJpbmcgdG9TdHJpbmcoRXJyb3IgRSkgeworICBTbWFsbFZlY3RvcjxzdGQ6OnN0cmluZywgMj4gRXJyb3JzOworICBoYW5kbGVBbGxFcnJvcnMoc3RkOjptb3ZlKEUpLCBbJkVycm9yc10oY29uc3QgRXJyb3JJbmZvQmFzZSAmRUkpIHsKKyAgICBFcnJvcnMucHVzaF9iYWNrKEVJLm1lc3NhZ2UoKSk7CisgIH0pOworICByZXR1cm4gam9pbihFcnJvcnMuYmVnaW4oKSwgRXJyb3JzLmVuZCgpLCAiXG4iKTsKK30KKworLy8vIENvbnN1bWUgYSBFcnJvciB3aXRob3V0IGRvaW5nIGFueXRoaW5nLiBUaGlzIG1ldGhvZCBzaG91bGQgYmUgdXNlZAorLy8vIG9ubHkgd2hlcmUgYW4gZXJyb3IgY2FuIGJlIGNvbnNpZGVyZWQgYSByZWFzb25hYmxlIGFuZCBleHBlY3RlZCByZXR1cm4KKy8vLyB2YWx1ZS4KKy8vLworLy8vIFVzZXMgb2YgdGhpcyBtZXRob2QgYXJlIHBvdGVudGlhbGx5IGluZGljYXRpdmUgb2YgZGVzaWduIHByb2JsZW1zOiBJZiBpdCdzCisvLy8gbGVnaXRpbWF0ZSB0byBkbyBub3RoaW5nIHdoaWxlIHByb2Nlc3NpbmcgYW4gImVycm9yIiwgdGhlIGVycm9yLXByb2R1Y2VyCisvLy8gbWlnaHQgYmUgbW9yZSBjbGVhcmx5IHJlZmFjdG9yZWQgdG8gcmV0dXJuIGFuIE9wdGlvbmFsPFQ+LgoraW5saW5lIHZvaWQgY29uc3VtZUVycm9yKEVycm9yIEVycikgeworICBoYW5kbGVBbGxFcnJvcnMoc3RkOjptb3ZlKEVyciksIFtdKGNvbnN0IEVycm9ySW5mb0Jhc2UgJikge30pOworfQorCisvLy8gSGVscGVyIGZvciBjb252ZXJ0aW5nIGFuIEVycm9yIHRvIGEgYm9vbC4KKy8vLworLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiBFcnIgaXMgaW4gYW4gZXJyb3Igc3RhdGUsIG9yIGZhbHNlIGlmIGl0IGlzCisvLy8gaW4gYSBzdWNjZXNzIHN0YXRlLiAgUHV0cyBFcnIgaW4gYSBjaGVja2VkIHN0YXRlIGluIGJvdGggY2FzZXMgKHVubGlrZQorLy8vIEVycm9yOjpvcGVyYXRvciBib29sKCksIHdoaWNoIG9ubHkgZG9lcyB0aGlzIGZvciBzdWNjZXNzIHN0YXRlcykuCitpbmxpbmUgYm9vbCBlcnJvclRvQm9vbChFcnJvciBFcnIpIHsKKyAgYm9vbCBJc0Vycm9yID0gc3RhdGljX2Nhc3Q8Ym9vbD4oRXJyKTsKKyAgaWYgKElzRXJyb3IpCisgICAgY29uc3VtZUVycm9yKHN0ZDo6bW92ZShFcnIpKTsKKyAgcmV0dXJuIElzRXJyb3I7Cit9CisKKy8vLyBIZWxwZXIgZm9yIEVycm9ycyB1c2VkIGFzIG91dC1wYXJhbWV0ZXJzLgorLy8vCisvLy8gVGhpcyBoZWxwZXIgaXMgZm9yIHVzZSB3aXRoIHRoZSBFcnJvci1hcy1vdXQtcGFyYW1ldGVyIGlkaW9tLCB3aGVyZSBhbiBlcnJvcgorLy8vIGlzIHBhc3NlZCB0byBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBieSByZWZlcmVuY2UsIHJhdGhlciB0aGFuIGJlaW5nIHJldHVybmVkLgorLy8vIEluIHN1Y2ggY2FzZXMgaXQgaXMgaGVscGZ1bCB0byBzZXQgdGhlIGNoZWNrZWQgYml0IG9uIGVudHJ5IHRvIHRoZSBmdW5jdGlvbgorLy8vIHNvIHRoYXQgdGhlIGVycm9yIGNhbiBiZSB3cml0dGVuIHRvICh1bmNoZWNrZWQgRXJyb3JzIGFib3J0IG9uIGFzc2lnbm1lbnQpCisvLy8gYW5kIGNsZWFyIHRoZSBjaGVja2VkIGJpdCBvbiBleGl0IHNvIHRoYXQgY2xpZW50cyBjYW5ub3QgYWNjaWRlbnRhbGx5IGZvcmdldAorLy8vIHRvIGNoZWNrIHRoZSByZXN1bHQuIFRoaXMgaGVscGVyIHBlcmZvcm1zIHRoZXNlIGFjdGlvbnMgYXV0b21hdGljYWxseSB1c2luZworLy8vIFJBSUk6CisvLy8KKy8vLyAgIEBjb2Rley5jcHB9CisvLy8gICBSZXN1bHQgZm9vKEVycm9yICZFcnIpIHsKKy8vLyAgICAgRXJyb3JBc091dFBhcmFtZXRlciBFcnJBc091dFBhcmFtKCZFcnIpOyAvLyAnQ2hlY2tlZCcgZmxhZyBzZXQKKy8vLyAgICAgLy8gPGJvZHkgb2YgZm9vPgorLy8vICAgICAvLyA8LSAnQ2hlY2tlZCcgZmxhZyBhdXRvLWNsZWFyZWQgd2hlbiBFcnJBc091dFBhcmFtIGlzIGRlc3RydWN0ZWQuCisvLy8gICB9CisvLy8gICBAZW5kY29kZQorLy8vCisvLy8gRXJyb3JBc091dFBhcmFtZXRlciB0YWtlcyBhbiBFcnJvciogcmF0aGVyIHRoYW4gRXJyb3ImIHNvIHRoYXQgaXQgY2FuIGJlCisvLy8gdXNlZCB3aXRoIG9wdGlvbmFsIEVycm9ycyAoRXJyb3IgcG9pbnRlcnMgdGhhdCBhcmUgYWxsb3dlZCB0byBiZSBudWxsKS4gSWYKKy8vLyBFcnJvckFzT3V0UGFyYW1ldGVyIHRvb2sgYW4gRXJyb3IgcmVmZXJlbmNlLCBhbiBpbnN0YW5jZSB3b3VsZCBoYXZlIHRvIGJlCisvLy8gY3JlYXRlZCBpbnNpZGUgZXZlcnkgY29uZGl0aW9uIHRoYXQgdmVyaWZpZWQgdGhhdCBFcnJvciB3YXMgbm9uLW51bGwuIEJ5CisvLy8gdGFraW5nIGFuIEVycm9yIHBvaW50ZXIgd2UgY2FuIGp1c3QgY3JlYXRlIG9uZSBpbnN0YW5jZSBhdCB0aGUgdG9wIG9mIHRoZQorLy8vIGZ1bmN0aW9uLgorY2xhc3MgRXJyb3JBc091dFBhcmFtZXRlciB7CitwdWJsaWM6CisgIEVycm9yQXNPdXRQYXJhbWV0ZXIoRXJyb3IgKkVycikgOiBFcnIoRXJyKSB7CisgICAgLy8gUmFpc2UgdGhlIGNoZWNrZWQgYml0IGlmIEVyciBpcyBzdWNjZXNzLgorICAgIGlmIChFcnIpCisgICAgICAodm9pZCkhISpFcnI7CisgIH0KKworICB+RXJyb3JBc091dFBhcmFtZXRlcigpIHsKKyAgICAvLyBDbGVhciB0aGUgY2hlY2tlZCBiaXQuCisgICAgaWYgKEVyciAmJiAhKkVycikKKyAgICAgICpFcnIgPSBFcnJvcjo6c3VjY2VzcygpOworICB9CisKK3ByaXZhdGU6CisgIEVycm9yICpFcnI7Cit9OworCisvLy8gSGVscGVyIGZvciBFeHBlY3RlZDxUPnMgdXNlZCBhcyBvdXQtcGFyYW1ldGVycy4KKy8vLworLy8vIFNlZSBFcnJvckFzT3V0UGFyYW1ldGVyLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBFeHBlY3RlZEFzT3V0UGFyYW1ldGVyIHsKK3B1YmxpYzoKKyAgRXhwZWN0ZWRBc091dFBhcmFtZXRlcihFeHBlY3RlZDxUPiAqVmFsT3JFcnIpCisgICAgOiBWYWxPckVycihWYWxPckVycikgeworICAgIGlmIChWYWxPckVycikKKyAgICAgICh2b2lkKSEhKlZhbE9yRXJyOworICB9CisKKyAgfkV4cGVjdGVkQXNPdXRQYXJhbWV0ZXIoKSB7CisgICAgaWYgKFZhbE9yRXJyKQorICAgICAgVmFsT3JFcnItPnNldFVuY2hlY2tlZCgpOworICB9CisKK3ByaXZhdGU6CisgIEV4cGVjdGVkPFQ+ICpWYWxPckVycjsKK307CisKKy8vLyBUaGlzIGNsYXNzIHdyYXBzIGEgc3RkOjplcnJvcl9jb2RlIGluIGEgRXJyb3IuCisvLy8KKy8vLyBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UncmUgd3JpdGluZyBhbiBpbnRlcmZhY2UgdGhhdCByZXR1cm5zIGEgRXJyb3IKKy8vLyAob3IgRXhwZWN0ZWQpIGFuZCB5b3Ugd2FudCB0byBjYWxsIGNvZGUgdGhhdCBzdGlsbCByZXR1cm5zCisvLy8gc3RkOjplcnJvcl9jb2Rlcy4KK2NsYXNzIEVDRXJyb3IgOiBwdWJsaWMgRXJyb3JJbmZvPEVDRXJyb3I+IHsKKyAgZnJpZW5kIEVycm9yIGVycm9yQ29kZVRvRXJyb3Ioc3RkOjplcnJvcl9jb2RlKTsKKworcHVibGljOgorICB2b2lkIHNldEVycm9yQ29kZShzdGQ6OmVycm9yX2NvZGUgRUMpIHsgdGhpcy0+RUMgPSBFQzsgfQorICBzdGQ6OmVycm9yX2NvZGUgY29udmVydFRvRXJyb3JDb2RlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gRUM7IH0KKyAgdm9pZCBsb2cocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZSB7IE9TIDw8IEVDLm1lc3NhZ2UoKTsgfQorCisgIC8vIFVzZWQgYnkgRXJyb3JJbmZvOjpjbGFzc0lELgorICBzdGF0aWMgY2hhciBJRDsKKworcHJvdGVjdGVkOgorICBFQ0Vycm9yKCkgPSBkZWZhdWx0OworICBFQ0Vycm9yKHN0ZDo6ZXJyb3JfY29kZSBFQykgOiBFQyhFQykge30KKworICBzdGQ6OmVycm9yX2NvZGUgRUM7Cit9OworCisvLy8gVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgZnVuY3Rpb24gY2FuIGJlIHJldHVybmVkIGZyb20gY29udmVydFRvRXJyb3JDb2RlCisvLy8gZm9yIEVycm9yIHZhbHVlcyB3aGVyZSBubyBzZW5zaWJsZSB0cmFuc2xhdGlvbiB0byBzdGQ6OmVycm9yX2NvZGUgZXhpc3RzLgorLy8vIEl0IHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gdGhpcyBzaXR1YXRpb24sIGFuZCBzaG91bGQgbmV2ZXIgYmUgdXNlZCB3aGVyZSBhCisvLy8gc2Vuc2libGUgY29udmVyc2lvbiB0byBzdGQ6OmVycm9yX2NvZGUgaXMgYXZhaWxhYmxlLCBhcyBhdHRlbXB0cyB0byBjb252ZXJ0CisvLy8gdG8vZnJvbSB0aGlzIGVycm9yIHdpbGwgcmVzdWx0IGluIGEgZmF0YWwgZXJyb3IuIChpLmUuIGl0IGlzIGEgcHJvZ3JhbW1hdGljCisvLy9lcnJvciB0byB0cnkgdG8gY29udmVydCBzdWNoIGEgdmFsdWUpLgorc3RkOjplcnJvcl9jb2RlIGluY29udmVydGlibGVFcnJvckNvZGUoKTsKKworLy8vIEhlbHBlciBmb3IgY29udmVydGluZyBhbiBzdGQ6OmVycm9yX2NvZGUgdG8gYSBFcnJvci4KK0Vycm9yIGVycm9yQ29kZVRvRXJyb3Ioc3RkOjplcnJvcl9jb2RlIEVDKTsKKworLy8vIEhlbHBlciBmb3IgY29udmVydGluZyBhbiBFQ0Vycm9yIHRvIGEgc3RkOjplcnJvcl9jb2RlLgorLy8vCisvLy8gVGhpcyBtZXRob2QgcmVxdWlyZXMgdGhhdCBFcnIgYmUgRXJyb3IoKSBvciBhbiBFQ0Vycm9yLCBvdGhlcndpc2UgaXQKKy8vLyB3aWxsIHRyaWdnZXIgYSBjYWxsIHRvIGFib3J0KCkuCitzdGQ6OmVycm9yX2NvZGUgZXJyb3JUb0Vycm9yQ29kZShFcnJvciBFcnIpOworCisvLy8gQ29udmVydCBhbiBFcnJvck9yPFQ+IHRvIGFuIEV4cGVjdGVkPFQ+LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEV4cGVjdGVkPFQ+IGVycm9yT3JUb0V4cGVjdGVkKEVycm9yT3I8VD4gJiZFTykgeworICBpZiAoYXV0byBFQyA9IEVPLmdldEVycm9yKCkpCisgICAgcmV0dXJuIGVycm9yQ29kZVRvRXJyb3IoRUMpOworICByZXR1cm4gc3RkOjptb3ZlKCpFTyk7Cit9CisKKy8vLyBDb252ZXJ0IGFuIEV4cGVjdGVkPFQ+IHRvIGFuIEVycm9yT3I8VD4uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gRXJyb3JPcjxUPiBleHBlY3RlZFRvRXJyb3JPcihFeHBlY3RlZDxUPiAmJkUpIHsKKyAgaWYgKGF1dG8gRXJyID0gRS50YWtlRXJyb3IoKSkKKyAgICByZXR1cm4gZXJyb3JUb0Vycm9yQ29kZShzdGQ6Om1vdmUoRXJyKSk7CisgIHJldHVybiBzdGQ6Om1vdmUoKkUpOworfQorCisvLy8gVGhpcyBjbGFzcyB3cmFwcyBhIHN0cmluZyBpbiBhbiBFcnJvci4KKy8vLworLy8vIFN0cmluZ0Vycm9yIGlzIHVzZWZ1bCBpbiBjYXNlcyB3aGVyZSB0aGUgY2xpZW50IGlzIG5vdCBleHBlY3RlZCB0byBiZSBhYmxlCisvLy8gdG8gY29uc3VtZSB0aGUgc3BlY2lmaWMgZXJyb3IgbWVzc2FnZSBwcm9ncmFtbWF0aWNhbGx5IChmb3IgZXhhbXBsZSwgaWYgdGhlCisvLy8gZXJyb3IgbWVzc2FnZSBpcyB0byBiZSBwcmVzZW50ZWQgdG8gdGhlIHVzZXIpLgorY2xhc3MgU3RyaW5nRXJyb3IgOiBwdWJsaWMgRXJyb3JJbmZvPFN0cmluZ0Vycm9yPiB7CitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOworCisgIFN0cmluZ0Vycm9yKGNvbnN0IFR3aW5lICZTLCBzdGQ6OmVycm9yX2NvZGUgRUMpOworCisgIHZvaWQgbG9nKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6ZXJyb3JfY29kZSBjb252ZXJ0VG9FcnJvckNvZGUoKSBjb25zdCBvdmVycmlkZTsKKworICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0TWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIE1zZzsgfQorCitwcml2YXRlOgorICBzdGQ6OnN0cmluZyBNc2c7CisgIHN0ZDo6ZXJyb3JfY29kZSBFQzsKK307CisKKy8vLyBIZWxwZXIgZm9yIGNoZWNrLWFuZC1leGl0IGVycm9yIGhhbmRsaW5nLgorLy8vCisvLy8gRm9yIHRvb2wgdXNlIG9ubHkuIE5PVCBGT1IgVVNFIElOIExJQlJBUlkgQ09ERS4KKy8vLworY2xhc3MgRXhpdE9uRXJyb3IgeworcHVibGljOgorICAvLy8gQ3JlYXRlIGFuIGVycm9yIG9uIGV4aXQgaGVscGVyLgorICBFeGl0T25FcnJvcihzdGQ6OnN0cmluZyBCYW5uZXIgPSAiIiwgaW50IERlZmF1bHRFcnJvckV4aXRDb2RlID0gMSkKKyAgICAgIDogQmFubmVyKHN0ZDo6bW92ZShCYW5uZXIpKSwKKyAgICAgICAgR2V0RXhpdENvZGUoWz1dKGNvbnN0IEVycm9yICYpIHsgcmV0dXJuIERlZmF1bHRFcnJvckV4aXRDb2RlOyB9KSB7fQorCisgIC8vLyBTZXQgdGhlIGJhbm5lciBzdHJpbmcgZm9yIGFueSBlcnJvcnMgY2F1Z2h0IGJ5IG9wZXJhdG9yKCkuCisgIHZvaWQgc2V0QmFubmVyKHN0ZDo6c3RyaW5nIEJhbm5lcikgeyB0aGlzLT5CYW5uZXIgPSBzdGQ6Om1vdmUoQmFubmVyKTsgfQorCisgIC8vLyBTZXQgdGhlIGV4aXQtY29kZSBtYXBwZXIgZnVuY3Rpb24uCisgIHZvaWQgc2V0RXhpdENvZGVNYXBwZXIoc3RkOjpmdW5jdGlvbjxpbnQoY29uc3QgRXJyb3IgJik+IEdldEV4aXRDb2RlKSB7CisgICAgdGhpcy0+R2V0RXhpdENvZGUgPSBzdGQ6Om1vdmUoR2V0RXhpdENvZGUpOworICB9CisKKyAgLy8vIENoZWNrIEVyci4gSWYgaXQncyBpbiBhIGZhaWx1cmUgc3RhdGUgbG9nIHRoZSBlcnJvcihzKSBhbmQgZXhpdC4KKyAgdm9pZCBvcGVyYXRvcigpKEVycm9yIEVycikgY29uc3QgeyBjaGVja0Vycm9yKHN0ZDo6bW92ZShFcnIpKTsgfQorCisgIC8vLyBDaGVjayBFLiBJZiBpdCdzIGluIGEgc3VjY2VzcyBzdGF0ZSB0aGVuIHJldHVybiB0aGUgY29udGFpbmVkIHZhbHVlLiBJZgorICAvLy8gaXQncyBpbiBhIGZhaWx1cmUgc3RhdGUgbG9nIHRoZSBlcnJvcihzKSBhbmQgZXhpdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgb3BlcmF0b3IoKShFeHBlY3RlZDxUPiAmJkUpIGNvbnN0IHsKKyAgICBjaGVja0Vycm9yKEUudGFrZUVycm9yKCkpOworICAgIHJldHVybiBzdGQ6Om1vdmUoKkUpOworICB9CisKKyAgLy8vIENoZWNrIEUuIElmIGl0J3MgaW4gYSBzdWNjZXNzIHN0YXRlIHRoZW4gcmV0dXJuIHRoZSBjb250YWluZWQgcmVmZXJlbmNlLiBJZgorICAvLy8gaXQncyBpbiBhIGZhaWx1cmUgc3RhdGUgbG9nIHRoZSBlcnJvcihzKSBhbmQgZXhpdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQmIG9wZXJhdG9yKCkoRXhwZWN0ZWQ8VCY+ICYmRSkgY29uc3QgeworICAgIGNoZWNrRXJyb3IoRS50YWtlRXJyb3IoKSk7CisgICAgcmV0dXJuICpFOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgY2hlY2tFcnJvcihFcnJvciBFcnIpIGNvbnN0IHsKKyAgICBpZiAoRXJyKSB7CisgICAgICBpbnQgRXhpdENvZGUgPSBHZXRFeGl0Q29kZShFcnIpOworICAgICAgbG9nQWxsVW5oYW5kbGVkRXJyb3JzKHN0ZDo6bW92ZShFcnIpLCBlcnJzKCksIEJhbm5lcik7CisgICAgICBleGl0KEV4aXRDb2RlKTsKKyAgICB9CisgIH0KKworICBzdGQ6OnN0cmluZyBCYW5uZXI7CisgIHN0ZDo6ZnVuY3Rpb248aW50KGNvbnN0IEVycm9yICYpPiBHZXRFeGl0Q29kZTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfRVJST1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzljYmZlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgKQEAgLTAsMCArMSwxNDQgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIC0gRmF0YWwgZXJyb3IgaGFuZGxpbmcgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYW4gQVBJIHVzZWQgdG8gaW5kaWNhdGUgZmF0YWwgZXJyb3IgY29uZGl0aW9ucy4gIE5vbi1mYXRhbAorLy8gZXJyb3JzIChtb3N0IG9mIHRoZW0pIHNob3VsZCBiZSBoYW5kbGVkIHRocm91Z2ggTExWTUNvbnRleHQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfRVJST1JIQU5ETElOR19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9FUlJPUkhBTkRMSU5HX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgU3RyaW5nUmVmOworICBjbGFzcyBUd2luZTsKKworICAvLy8gQW4gZXJyb3IgaGFuZGxlciBjYWxsYmFjay4KKyAgdHlwZWRlZiB2b2lkICgqZmF0YWxfZXJyb3JfaGFuZGxlcl90KSh2b2lkICp1c2VyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGdlbl9jcmFzaF9kaWFnKTsKKworICAvLy8gaW5zdGFsbF9mYXRhbF9lcnJvcl9oYW5kbGVyIC0gSW5zdGFsbHMgYSBuZXcgZXJyb3IgaGFuZGxlciB0byBiZSB1c2VkCisgIC8vLyB3aGVuZXZlciBhIHNlcmlvdXMgKG5vbi1yZWNvdmVyYWJsZSkgZXJyb3IgaXMgZW5jb3VudGVyZWQgYnkgTExWTS4KKyAgLy8vCisgIC8vLyBJZiBubyBlcnJvciBoYW5kbGVyIGlzIGluc3RhbGxlZCB0aGUgZGVmYXVsdCBpcyB0byBwcmludCB0aGUgZXJyb3IgbWVzc2FnZQorICAvLy8gdG8gc3RkZXJyLCBhbmQgY2FsbCBleGl0KDEpLiAgSWYgYW4gZXJyb3IgaGFuZGxlciBpcyBpbnN0YWxsZWQgdGhlbiBpdCBpcworICAvLy8gdGhlIGhhbmRsZXIncyByZXNwb25zaWJpbGl0eSB0byBsb2cgdGhlIG1lc3NhZ2UsIGl0IHdpbGwgbm8gbG9uZ2VyIGJlCisgIC8vLyBwcmludGVkIHRvIHN0ZGVyci4gIElmIHRoZSBlcnJvciBoYW5kbGVyIHJldHVybnMsIHRoZW4gZXhpdCgxKSB3aWxsIGJlCisgIC8vLyBjYWxsZWQuCisgIC8vLworICAvLy8gSXQgaXMgZGFuZ2Vyb3VzIHRvIG5haXZlbHkgdXNlIGFuIGVycm9yIGhhbmRsZXIgd2hpY2ggdGhyb3dzIGFuIGV4Y2VwdGlvbi4KKyAgLy8vIEV2ZW4gdGhvdWdoIHNvbWUgYXBwbGljYXRpb25zIGRlc2lyZSB0byBncmFjZWZ1bGx5IHJlY292ZXIgZnJvbSBhcmJpdHJhcnkKKyAgLy8vIGZhdWx0cywgYmxpbmRseSB0aHJvd2luZyBleGNlcHRpb25zIHRocm91Z2ggdW5mYW1pbGlhciBjb2RlIGlzbid0IGEgd2F5IHRvCisgIC8vLyBhY2hpZXZlIHRoaXMuCisgIC8vLworICAvLy8gXHBhcmFtIHVzZXJfZGF0YSAtIEFuIGFyZ3VtZW50IHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBpbnN0YWxsIGVycm9yCisgIC8vLyBoYW5kbGVyLgorICB2b2lkIGluc3RhbGxfZmF0YWxfZXJyb3JfaGFuZGxlcihmYXRhbF9lcnJvcl9oYW5kbGVyX3QgaGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdXNlcl9kYXRhID0gbnVsbHB0cik7CisKKyAgLy8vIFJlc3RvcmVzIGRlZmF1bHQgZXJyb3IgaGFuZGxpbmcgYmVoYXZpb3VyLgorICB2b2lkIHJlbW92ZV9mYXRhbF9lcnJvcl9oYW5kbGVyKCk7CisKKyAgLy8vIFNjb3BlZEZhdGFsRXJyb3JIYW5kbGVyIC0gVGhpcyBpcyBhIHNpbXBsZSBoZWxwZXIgY2xhc3Mgd2hpY2gganVzdAorICAvLy8gY2FsbHMgaW5zdGFsbF9mYXRhbF9lcnJvcl9oYW5kbGVyIGluIGl0cyBjb25zdHJ1Y3RvciBhbmQKKyAgLy8vIHJlbW92ZV9mYXRhbF9lcnJvcl9oYW5kbGVyIGluIGl0cyBkZXN0cnVjdG9yLgorICBzdHJ1Y3QgU2NvcGVkRmF0YWxFcnJvckhhbmRsZXIgeworICAgIGV4cGxpY2l0IFNjb3BlZEZhdGFsRXJyb3JIYW5kbGVyKGZhdGFsX2Vycm9yX2hhbmRsZXJfdCBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSA9IG51bGxwdHIpIHsKKyAgICAgIGluc3RhbGxfZmF0YWxfZXJyb3JfaGFuZGxlcihoYW5kbGVyLCB1c2VyX2RhdGEpOworICAgIH0KKworICAgIH5TY29wZWRGYXRhbEVycm9ySGFuZGxlcigpIHsgcmVtb3ZlX2ZhdGFsX2Vycm9yX2hhbmRsZXIoKTsgfQorICB9OworCisvLy8gUmVwb3J0cyBhIHNlcmlvdXMgZXJyb3IsIGNhbGxpbmcgYW55IGluc3RhbGxlZCBlcnJvciBoYW5kbGVyLiBUaGVzZQorLy8vIGZ1bmN0aW9ucyBhcmUgaW50ZW5kZWQgdG8gYmUgdXNlZCBmb3IgZXJyb3IgY29uZGl0aW9ucyB3aGljaCBhcmUgb3V0c2lkZQorLy8vIHRoZSBjb250cm9sIG9mIHRoZSBjb21waWxlciAoSS9PIGVycm9ycywgaW52YWxpZCB1c2VyIGlucHV0LCBldGMuKQorLy8vCisvLy8gSWYgbm8gZXJyb3IgaGFuZGxlciBpcyBpbnN0YWxsZWQgdGhlIGRlZmF1bHQgaXMgdG8gcHJpbnQgdGhlIG1lc3NhZ2UgdG8KKy8vLyBzdGFuZGFyZCBlcnJvciwgZm9sbG93ZWQgYnkgYSBuZXdsaW5lLgorLy8vIEFmdGVyIHRoZSBlcnJvciBoYW5kbGVyIGlzIGNhbGxlZCB0aGlzIGZ1bmN0aW9uIHdpbGwgY2FsbCBleGl0KDEpLCBpdAorLy8vIGRvZXMgbm90IHJldHVybi4KK0xMVk1fQVRUUklCVVRFX05PUkVUVVJOIHZvaWQgcmVwb3J0X2ZhdGFsX2Vycm9yKGNvbnN0IGNoYXIgKnJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZ2VuX2NyYXNoX2RpYWcgPSB0cnVlKTsKK0xMVk1fQVRUUklCVVRFX05PUkVUVVJOIHZvaWQgcmVwb3J0X2ZhdGFsX2Vycm9yKGNvbnN0IHN0ZDo6c3RyaW5nICZyZWFzb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGdlbl9jcmFzaF9kaWFnID0gdHJ1ZSk7CitMTFZNX0FUVFJJQlVURV9OT1JFVFVSTiB2b2lkIHJlcG9ydF9mYXRhbF9lcnJvcihTdHJpbmdSZWYgcmVhc29uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBnZW5fY3Jhc2hfZGlhZyA9IHRydWUpOworTExWTV9BVFRSSUJVVEVfTk9SRVRVUk4gdm9pZCByZXBvcnRfZmF0YWxfZXJyb3IoY29uc3QgVHdpbmUgJnJlYXNvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZ2VuX2NyYXNoX2RpYWcgPSB0cnVlKTsKKworLy8vIEluc3RhbGxzIGEgbmV3IGJhZCBhbGxvYyBlcnJvciBoYW5kbGVyIHRoYXQgc2hvdWxkIGJlIHVzZWQgd2hlbmV2ZXIgYQorLy8vIGJhZCBhbGxvYyBlcnJvciwgZS5nLiBmYWlsaW5nIG1hbGxvYy9jYWxsb2MsIGlzIGVuY291bnRlcmVkIGJ5IExMVk0uCisvLy8KKy8vLyBUaGUgdXNlciBjYW4gaW5zdGFsbCBhIGJhZCBhbGxvYyBoYW5kbGVyLCBpbiBvcmRlciB0byBkZWZpbmUgdGhlIGJlaGF2aW9yCisvLy8gaW4gY2FzZSBvZiBmYWlsaW5nIGFsbG9jYXRpb25zLCBlLmcuIHRocm93aW5nIGFuIGV4Y2VwdGlvbi4gTm90ZSB0aGF0IHRoaXMKKy8vLyBoYW5kbGVyIG11c3Qgbm90IHRyaWdnZXIgYW55IGFkZGl0aW9uYWwgYWxsb2NhdGlvbnMgaXRzZWxmLgorLy8vCisvLy8gSWYgbm8gZXJyb3IgaGFuZGxlciBpcyBpbnN0YWxsZWQgdGhlIGRlZmF1bHQgaXMgdG8gcHJpbnQgdGhlIGVycm9yIG1lc3NhZ2UKKy8vLyB0byBzdGRlcnIsIGFuZCBjYWxsIGV4aXQoMSkuICBJZiBhbiBlcnJvciBoYW5kbGVyIGlzIGluc3RhbGxlZCB0aGVuIGl0IGlzCisvLy8gdGhlIGhhbmRsZXIncyByZXNwb25zaWJpbGl0eSB0byBsb2cgdGhlIG1lc3NhZ2UsIGl0IHdpbGwgbm8gbG9uZ2VyIGJlCisvLy8gcHJpbnRlZCB0byBzdGRlcnIuICBJZiB0aGUgZXJyb3IgaGFuZGxlciByZXR1cm5zLCB0aGVuIGV4aXQoMSkgd2lsbCBiZQorLy8vIGNhbGxlZC4KKy8vLworLy8vCisvLy8gXHBhcmFtIHVzZXJfZGF0YSAtIEFuIGFyZ3VtZW50IHdoaWNoIHdpbGwgYmUgcGFzc2VkIHRvIHRoZSBpbnN0YWxsZWQgZXJyb3IKKy8vLyBoYW5kbGVyLgordm9pZCBpbnN0YWxsX2JhZF9hbGxvY19lcnJvcl9oYW5kbGVyKGZhdGFsX2Vycm9yX2hhbmRsZXJfdCBoYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVzZXJfZGF0YSA9IG51bGxwdHIpOworCisvLy8gUmVzdG9yZXMgZGVmYXVsdCBiYWQgYWxsb2MgZXJyb3IgaGFuZGxpbmcgYmVoYXZpb3IuCit2b2lkIHJlbW92ZV9iYWRfYWxsb2NfZXJyb3JfaGFuZGxlcigpOworCit2b2lkIGluc3RhbGxfb3V0X29mX21lbW9yeV9uZXdfaGFuZGxlcigpOworCisvLy8gUmVwb3J0cyBhIGJhZCBhbGxvYyBlcnJvciwgY2FsbGluZyBhbnkgdXNlciBkZWZpbmVkIGJhZCBhbGxvYworLy8vIGVycm9yIGhhbmRsZXIuIEluIGNvbnRyYXN0IHRvIHRoZSBnZW5lcmljICdyZXBvcnRfZmF0YWxfZXJyb3InCisvLy8gZnVuY3Rpb25zLCB0aGlzIGZ1bmN0aW9uIGlzIGV4cGVjdGVkIHRvIHJldHVybiwgZS5nLiB0aGUgdXNlcgorLy8vIGRlZmluZWQgZXJyb3IgaGFuZGxlciB0aHJvd3MgYW4gZXhjZXB0aW9uLgorLy8vCisvLy8gTm90ZTogV2hlbiB0aHJvd2luZyBhbiBleGNlcHRpb24gaW4gdGhlIGJhZCBhbGxvYyBoYW5kbGVyLCBtYWtlIHN1cmUgdGhhdAorLy8vIHRoZSBmb2xsb3dpbmcgdW53aW5kIHN1Y2NlZWRzLCBlLmcuIGRvIG5vdCB0cmlnZ2VyIGFkZGl0aW9uYWwgYWxsb2NhdGlvbnMKKy8vLyBpbiB0aGUgdW53aW5kIGNoYWluLgorLy8vCisvLy8gSWYgbm8gZXJyb3IgaGFuZGxlciBpcyBpbnN0YWxsZWQgKGRlZmF1bHQpLCB0aGVuIGEgYmFkX2FsbG9jIGV4Y2VwdGlvbgorLy8vIGlzIHRocm93biwgaWYgTExWTSBpcyBjb21waWxlZCB3aXRoIGV4Y2VwdGlvbiBzdXBwb3J0LCBvdGhlcndpc2UgYW4gYXNzZXJ0aW9uCisvLy8gaXMgY2FsbGVkLgordm9pZCByZXBvcnRfYmFkX2FsbG9jX2Vycm9yKGNvbnN0IGNoYXIgKlJlYXNvbiwgYm9vbCBHZW5DcmFzaERpYWcgPSB0cnVlKTsKKworLy8vIFRoaXMgZnVuY3Rpb24gY2FsbHMgYWJvcnQoKSwgYW5kIHByaW50cyB0aGUgb3B0aW9uYWwgbWVzc2FnZSB0byBzdGRlcnIuCisvLy8gVXNlIHRoZSBsbHZtX3VucmVhY2hhYmxlIG1hY3JvICh0aGF0IGFkZHMgbG9jYXRpb24gaW5mbyksIGluc3RlYWQgb2YKKy8vLyBjYWxsaW5nIHRoaXMgZnVuY3Rpb24gZGlyZWN0bHkuCitMTFZNX0FUVFJJQlVURV9OT1JFVFVSTiB2b2lkCitsbHZtX3VucmVhY2hhYmxlX2ludGVybmFsKGNvbnN0IGNoYXIgKm1zZyA9IG51bGxwdHIsIGNvbnN0IGNoYXIgKmZpbGUgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsaW5lID0gMCk7Cit9CisKKy8vLyBNYXJrcyB0aGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uIGlzIG5vdCBzdXBwb3NlZCB0byBiZSByZWFjaGFibGUuCisvLy8gSW4gIU5ERUJVRyBidWlsZHMsIHByaW50cyB0aGUgbWVzc2FnZSBhbmQgbG9jYXRpb24gaW5mbyB0byBzdGRlcnIuCisvLy8gSW4gTkRFQlVHIGJ1aWxkcywgYmVjb21lcyBhbiBvcHRpbWl6ZXIgaGludCB0aGF0IHRoZSBjdXJyZW50IGxvY2F0aW9uCisvLy8gaXMgbm90IHN1cHBvc2VkIHRvIGJlIHJlYWNoYWJsZS4gIE9uIGNvbXBpbGVycyB0aGF0IGRvbid0IHN1cHBvcnQKKy8vLyBzdWNoIGhpbnRzLCBwcmludHMgYSByZWR1Y2VkIG1lc3NhZ2UgaW5zdGVhZC4KKy8vLworLy8vIFVzZSB0aGlzIGluc3RlYWQgb2YgYXNzZXJ0KDApLiAgSXQgY29udmV5cyBpbnRlbnQgbW9yZSBjbGVhcmx5IGFuZAorLy8vIGFsbG93cyBjb21waWxlcnMgdG8gb21pdCBzb21lIHVubmVjZXNzYXJ5IGNvZGUuCisjaWZuZGVmIE5ERUJVRworI2RlZmluZSBsbHZtX3VucmVhY2hhYmxlKG1zZykgXAorICA6Omxsdm06Omxsdm1fdW5yZWFjaGFibGVfaW50ZXJuYWwobXNnLCBfX0ZJTEVfXywgX19MSU5FX18pCisjZWxpZiBkZWZpbmVkKExMVk1fQlVJTFRJTl9VTlJFQUNIQUJMRSkKKyNkZWZpbmUgbGx2bV91bnJlYWNoYWJsZShtc2cpIExMVk1fQlVJTFRJTl9VTlJFQUNIQUJMRQorI2Vsc2UKKyNkZWZpbmUgbGx2bV91bnJlYWNoYWJsZShtc2cpIDo6bGx2bTo6bGx2bV91bnJlYWNoYWJsZV9pbnRlcm5hbCgpCisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRXJyb3JPci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Vycm9yT3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjFmYjY1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Vycm9yT3IuaApAQCAtMCwwICsxLDI5MSBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9FcnJvck9yLmggLSBFcnJvciBTbWFydCBQb2ludGVyIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gTGlua2VyCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8KKy8vLyBQcm92aWRlcyBFcnJvck9yPFQ+IHNtYXJ0IHBvaW50ZXIuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0VSUk9ST1JfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfRVJST1JPUl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxpZ25PZi5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFxicmllZiBTdG9yZXMgYSByZWZlcmVuY2UgdGhhdCBjYW4gYmUgY2hhbmdlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3MgUmVmZXJlbmNlU3RvcmFnZSB7CisgIFQgKlN0b3JhZ2U7CisKK3B1YmxpYzoKKyAgUmVmZXJlbmNlU3RvcmFnZShUICZSZWYpIDogU3RvcmFnZSgmUmVmKSB7fQorCisgIG9wZXJhdG9yIFQgJigpIGNvbnN0IHsgcmV0dXJuICpTdG9yYWdlOyB9CisgIFQgJmdldCgpIGNvbnN0IHsgcmV0dXJuICpTdG9yYWdlOyB9Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgZWl0aGVyIGFuIGVycm9yIG9yIGEgdmFsdWUgVC4KKy8vLworLy8vIEVycm9yT3I8VD4gaXMgYSBwb2ludGVyLWxpa2UgY2xhc3MgdGhhdCByZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgYW4KKy8vLyBvcGVyYXRpb24uIFRoZSByZXN1bHQgaXMgZWl0aGVyIGFuIGVycm9yLCBvciBhIHZhbHVlIG9mIHR5cGUgVC4gVGhpcyBpcworLy8vIGRlc2lnbmVkIHRvIGVtdWxhdGUgdGhlIHVzYWdlIG9mIHJldHVybmluZyBhIHBvaW50ZXIgd2hlcmUgbnVsbHB0ciBpbmRpY2F0ZXMKKy8vLyBmYWlsdXJlLiBIb3dldmVyIGluc3RlYWQgb2YganVzdCBrbm93aW5nIHRoYXQgdGhlIG9wZXJhdGlvbiBmYWlsZWQsIHdlIGFsc28KKy8vLyBoYXZlIGFuIGVycm9yX2NvZGUgYW5kIG9wdGlvbmFsIHVzZXIgZGF0YSB0aGF0IGRlc2NyaWJlcyB3aHkgaXQgZmFpbGVkLgorLy8vCisvLy8gSXQgaXMgdXNlZCBsaWtlIHRoZSBmb2xsb3dpbmcuCisvLy8gXGNvZGUKKy8vLyAgIEVycm9yT3I8QnVmZmVyPiBnZXRCdWZmZXIoKTsKKy8vLworLy8vICAgYXV0byBidWZmZXIgPSBnZXRCdWZmZXIoKTsKKy8vLyAgIGlmIChlcnJvcl9jb2RlIGVjID0gYnVmZmVyLmdldEVycm9yKCkpCisvLy8gICAgIHJldHVybiBlYzsKKy8vLyAgIGJ1ZmZlci0+d3JpdGUoImFkZW5hIik7CisvLy8gXGVuZGNvZGUKKy8vLworLy8vCisvLy8gSW1wbGljaXQgY29udmVyc2lvbiB0byBib29sIHJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBhIHVzYWJsZSB2YWx1ZS4gVGhlCisvLy8gdW5hcnkgKiBhbmQgLT4gb3BlcmF0b3JzIHByb3ZpZGUgcG9pbnRlciBsaWtlIGFjY2VzcyB0byB0aGUgdmFsdWUuIEFjY2Vzc2luZworLy8vIHRoZSB2YWx1ZSB3aGVuIHRoZXJlIGlzIGFuIGVycm9yIGhhcyB1bmRlZmluZWQgYmVoYXZpb3IuCisvLy8KKy8vLyBXaGVuIFQgaXMgYSByZWZlcmVuY2UgdHlwZSB0aGUgYmVoYXZpb3IgaXMgc2xpZ2h0bHkgZGlmZmVyZW50LiBUaGUgcmVmZXJlbmNlCisvLy8gaXMgaGVsZCBpbiBhIHN0ZDo6cmVmZXJlbmNlX3dyYXBwZXI8c3RkOjpyZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlPiwgYW5kCisvLy8gdGhlcmUgaXMgc3BlY2lhbCBoYW5kbGluZyB0byBtYWtlIG9wZXJhdG9yIC0+IHdvcmsgYXMgaWYgVCB3YXMgbm90IGEKKy8vLyByZWZlcmVuY2UuCisvLy8KKy8vLyBUIGNhbm5vdCBiZSBhIHJ2YWx1ZSByZWZlcmVuY2UuCit0ZW1wbGF0ZTxjbGFzcyBUPgorY2xhc3MgRXJyb3JPciB7CisgIHRlbXBsYXRlIDxjbGFzcyBPdGhlclQ+IGZyaWVuZCBjbGFzcyBFcnJvck9yOworCisgIHN0YXRpYyBjb25zdCBib29sIGlzUmVmID0gc3RkOjppc19yZWZlcmVuY2U8VD46OnZhbHVlOworCisgIHVzaW5nIHdyYXAgPSBSZWZlcmVuY2VTdG9yYWdlPHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxUPjo6dHlwZT47CisKK3B1YmxpYzoKKyAgdXNpbmcgc3RvcmFnZV90eXBlID0gdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxpc1JlZiwgd3JhcCwgVD46OnR5cGU7CisKK3ByaXZhdGU6CisgIHVzaW5nIHJlZmVyZW5jZSA9IHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxUPjo6dHlwZSAmOworICB1c2luZyBjb25zdF9yZWZlcmVuY2UgPSBjb25zdCB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGUgJjsKKyAgdXNpbmcgcG9pbnRlciA9IHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxUPjo6dHlwZSAqOworICB1c2luZyBjb25zdF9wb2ludGVyID0gY29uc3QgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcmVmZXJlbmNlPFQ+Ojp0eXBlICo7CisKK3B1YmxpYzoKKyAgdGVtcGxhdGUgPGNsYXNzIEU+CisgIEVycm9yT3IoRSBFcnJvckNvZGUsCisgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19lcnJvcl9jb2RlX2VudW08RT46OnZhbHVlIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfZXJyb3JfY29uZGl0aW9uX2VudW08RT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKj46OnR5cGUgPSBudWxscHRyKQorICAgICAgOiBIYXNFcnJvcih0cnVlKSB7CisgICAgbmV3IChnZXRFcnJvclN0b3JhZ2UoKSkgc3RkOjplcnJvcl9jb2RlKG1ha2VfZXJyb3JfY29kZShFcnJvckNvZGUpKTsKKyAgfQorCisgIEVycm9yT3Ioc3RkOjplcnJvcl9jb2RlIEVDKSA6IEhhc0Vycm9yKHRydWUpIHsKKyAgICBuZXcgKGdldEVycm9yU3RvcmFnZSgpKSBzdGQ6OmVycm9yX2NvZGUoRUMpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIE90aGVyVD4KKyAgRXJyb3JPcihPdGhlclQgJiZWYWwsCisgICAgICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxPdGhlclQsIFQ+Ojp2YWx1ZT46OnR5cGUKKyAgICAgICAgICAgICAgKiA9IG51bGxwdHIpCisgICAgICA6IEhhc0Vycm9yKGZhbHNlKSB7CisgICAgbmV3IChnZXRTdG9yYWdlKCkpIHN0b3JhZ2VfdHlwZShzdGQ6OmZvcndhcmQ8T3RoZXJUPihWYWwpKTsKKyAgfQorCisgIEVycm9yT3IoY29uc3QgRXJyb3JPciAmT3RoZXIpIHsKKyAgICBjb3B5Q29uc3RydWN0KE90aGVyKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBPdGhlclQ+CisgIEVycm9yT3IoCisgICAgICBjb25zdCBFcnJvck9yPE90aGVyVD4gJk90aGVyLAorICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxPdGhlclQsIFQ+Ojp2YWx1ZT46OnR5cGUgKiA9CisgICAgICAgICAgbnVsbHB0cikgeworICAgIGNvcHlDb25zdHJ1Y3QoT3RoZXIpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIE90aGVyVD4KKyAgZXhwbGljaXQgRXJyb3JPcigKKyAgICAgIGNvbnN0IEVycm9yT3I8T3RoZXJUPiAmT3RoZXIsCisgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwKKyAgICAgICAgICAhc3RkOjppc19jb252ZXJ0aWJsZTxPdGhlclQsIGNvbnN0IFQgJj46OnZhbHVlPjo6dHlwZSAqID0gbnVsbHB0cikgeworICAgIGNvcHlDb25zdHJ1Y3QoT3RoZXIpOworICB9CisKKyAgRXJyb3JPcihFcnJvck9yICYmT3RoZXIpIHsKKyAgICBtb3ZlQ29uc3RydWN0KHN0ZDo6bW92ZShPdGhlcikpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIE90aGVyVD4KKyAgRXJyb3JPcigKKyAgICAgIEVycm9yT3I8T3RoZXJUPiAmJk90aGVyLAorICAgICAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc19jb252ZXJ0aWJsZTxPdGhlclQsIFQ+Ojp2YWx1ZT46OnR5cGUgKiA9CisgICAgICAgICAgbnVsbHB0cikgeworICAgIG1vdmVDb25zdHJ1Y3Qoc3RkOjptb3ZlKE90aGVyKSk7CisgIH0KKworICAvLyBUaGlzIG1pZ2h0IGV2ZW50dWFsbHkgbmVlZCBTRklOQUUgYnV0IGl0J3MgbW9yZSBjb21wbGV4IHRoYW4gaXNfY29udmVydGlibGUKKyAgLy8gJiBJJ20gdG9vIGxhenkgdG8gd3JpdGUgaXQgcmlnaHQgbm93LgorICB0ZW1wbGF0ZSA8Y2xhc3MgT3RoZXJUPgorICBleHBsaWNpdCBFcnJvck9yKAorICAgICAgRXJyb3JPcjxPdGhlclQ+ICYmT3RoZXIsCisgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjwhc3RkOjppc19jb252ZXJ0aWJsZTxPdGhlclQsIFQ+Ojp2YWx1ZT46OnR5cGUgKiA9CisgICAgICAgICAgbnVsbHB0cikgeworICAgIG1vdmVDb25zdHJ1Y3Qoc3RkOjptb3ZlKE90aGVyKSk7CisgIH0KKworICBFcnJvck9yICZvcGVyYXRvcj0oY29uc3QgRXJyb3JPciAmT3RoZXIpIHsKKyAgICBjb3B5QXNzaWduKE90aGVyKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBFcnJvck9yICZvcGVyYXRvcj0oRXJyb3JPciAmJk90aGVyKSB7CisgICAgbW92ZUFzc2lnbihzdGQ6Om1vdmUoT3RoZXIpKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICB+RXJyb3JPcigpIHsKKyAgICBpZiAoIUhhc0Vycm9yKQorICAgICAgZ2V0U3RvcmFnZSgpLT5+c3RvcmFnZV90eXBlKCk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBmYWxzZSBpZiB0aGVyZSBpcyBhbiBlcnJvci4KKyAgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gIUhhc0Vycm9yOworICB9CisKKyAgcmVmZXJlbmNlIGdldCgpIHsgcmV0dXJuICpnZXRTdG9yYWdlKCk7IH0KKyAgY29uc3RfcmVmZXJlbmNlIGdldCgpIGNvbnN0IHsgcmV0dXJuIGNvbnN0X2Nhc3Q8RXJyb3JPcjxUPiAqPih0aGlzKS0+Z2V0KCk7IH0KKworICBzdGQ6OmVycm9yX2NvZGUgZ2V0RXJyb3IoKSBjb25zdCB7CisgICAgcmV0dXJuIEhhc0Vycm9yID8gKmdldEVycm9yU3RvcmFnZSgpIDogc3RkOjplcnJvcl9jb2RlKCk7CisgIH0KKworICBwb2ludGVyIG9wZXJhdG9yIC0+KCkgeworICAgIHJldHVybiB0b1BvaW50ZXIoZ2V0U3RvcmFnZSgpKTsKKyAgfQorCisgIGNvbnN0X3BvaW50ZXIgb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuIHRvUG9pbnRlcihnZXRTdG9yYWdlKCkpOyB9CisKKyAgcmVmZXJlbmNlIG9wZXJhdG9yICooKSB7CisgICAgcmV0dXJuICpnZXRTdG9yYWdlKCk7CisgIH0KKworICBjb25zdF9yZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKmdldFN0b3JhZ2UoKTsgfQorCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8Y2xhc3MgT3RoZXJUPgorICB2b2lkIGNvcHlDb25zdHJ1Y3QoY29uc3QgRXJyb3JPcjxPdGhlclQ+ICZPdGhlcikgeworICAgIGlmICghT3RoZXIuSGFzRXJyb3IpIHsKKyAgICAgIC8vIEdldCB0aGUgb3RoZXIgdmFsdWUuCisgICAgICBIYXNFcnJvciA9IGZhbHNlOworICAgICAgbmV3IChnZXRTdG9yYWdlKCkpIHN0b3JhZ2VfdHlwZSgqT3RoZXIuZ2V0U3RvcmFnZSgpKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gR2V0IG90aGVyJ3MgZXJyb3IuCisgICAgICBIYXNFcnJvciA9IHRydWU7CisgICAgICBuZXcgKGdldEVycm9yU3RvcmFnZSgpKSBzdGQ6OmVycm9yX2NvZGUoT3RoZXIuZ2V0RXJyb3IoKSk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQxPgorICBzdGF0aWMgYm9vbCBjb21wYXJlVGhpc0lmU2FtZVR5cGUoY29uc3QgVDEgJmEsIGNvbnN0IFQxICZiKSB7CisgICAgcmV0dXJuICZhID09ICZiOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KKyAgc3RhdGljIGJvb2wgY29tcGFyZVRoaXNJZlNhbWVUeXBlKGNvbnN0IFQxICZhLCBjb25zdCBUMiAmYikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBPdGhlclQ+CisgIHZvaWQgY29weUFzc2lnbihjb25zdCBFcnJvck9yPE90aGVyVD4gJk90aGVyKSB7CisgICAgaWYgKGNvbXBhcmVUaGlzSWZTYW1lVHlwZSgqdGhpcywgT3RoZXIpKQorICAgICAgcmV0dXJuOworCisgICAgdGhpcy0+fkVycm9yT3IoKTsKKyAgICBuZXcgKHRoaXMpIEVycm9yT3IoT3RoZXIpOworICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIE90aGVyVD4KKyAgdm9pZCBtb3ZlQ29uc3RydWN0KEVycm9yT3I8T3RoZXJUPiAmJk90aGVyKSB7CisgICAgaWYgKCFPdGhlci5IYXNFcnJvcikgeworICAgICAgLy8gR2V0IHRoZSBvdGhlciB2YWx1ZS4KKyAgICAgIEhhc0Vycm9yID0gZmFsc2U7CisgICAgICBuZXcgKGdldFN0b3JhZ2UoKSkgc3RvcmFnZV90eXBlKHN0ZDo6bW92ZSgqT3RoZXIuZ2V0U3RvcmFnZSgpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEdldCBvdGhlcidzIGVycm9yLgorICAgICAgSGFzRXJyb3IgPSB0cnVlOworICAgICAgbmV3IChnZXRFcnJvclN0b3JhZ2UoKSkgc3RkOjplcnJvcl9jb2RlKE90aGVyLmdldEVycm9yKCkpOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBPdGhlclQ+CisgIHZvaWQgbW92ZUFzc2lnbihFcnJvck9yPE90aGVyVD4gJiZPdGhlcikgeworICAgIGlmIChjb21wYXJlVGhpc0lmU2FtZVR5cGUoKnRoaXMsIE90aGVyKSkKKyAgICAgIHJldHVybjsKKworICAgIHRoaXMtPn5FcnJvck9yKCk7CisgICAgbmV3ICh0aGlzKSBFcnJvck9yKHN0ZDo6bW92ZShPdGhlcikpOworICB9CisKKyAgcG9pbnRlciB0b1BvaW50ZXIocG9pbnRlciBWYWwpIHsKKyAgICByZXR1cm4gVmFsOworICB9CisKKyAgY29uc3RfcG9pbnRlciB0b1BvaW50ZXIoY29uc3RfcG9pbnRlciBWYWwpIGNvbnN0IHsgcmV0dXJuIFZhbDsgfQorCisgIHBvaW50ZXIgdG9Qb2ludGVyKHdyYXAgKlZhbCkgeworICAgIHJldHVybiAmVmFsLT5nZXQoKTsKKyAgfQorCisgIGNvbnN0X3BvaW50ZXIgdG9Qb2ludGVyKGNvbnN0IHdyYXAgKlZhbCkgY29uc3QgeyByZXR1cm4gJlZhbC0+Z2V0KCk7IH0KKworICBzdG9yYWdlX3R5cGUgKmdldFN0b3JhZ2UoKSB7CisgICAgYXNzZXJ0KCFIYXNFcnJvciAmJiAiQ2Fubm90IGdldCB2YWx1ZSB3aGVuIGFuIGVycm9yIGV4aXN0cyEiKTsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxzdG9yYWdlX3R5cGUqPihUU3RvcmFnZS5idWZmZXIpOworICB9CisKKyAgY29uc3Qgc3RvcmFnZV90eXBlICpnZXRTdG9yYWdlKCkgY29uc3QgeworICAgIGFzc2VydCghSGFzRXJyb3IgJiYgIkNhbm5vdCBnZXQgdmFsdWUgd2hlbiBhbiBlcnJvciBleGlzdHMhIik7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3Qgc3RvcmFnZV90eXBlKj4oVFN0b3JhZ2UuYnVmZmVyKTsKKyAgfQorCisgIHN0ZDo6ZXJyb3JfY29kZSAqZ2V0RXJyb3JTdG9yYWdlKCkgeworICAgIGFzc2VydChIYXNFcnJvciAmJiAiQ2Fubm90IGdldCBlcnJvciB3aGVuIGEgdmFsdWUgZXhpc3RzISIpOworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHN0ZDo6ZXJyb3JfY29kZSAqPihFcnJvclN0b3JhZ2UuYnVmZmVyKTsKKyAgfQorCisgIGNvbnN0IHN0ZDo6ZXJyb3JfY29kZSAqZ2V0RXJyb3JTdG9yYWdlKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9jYXN0PEVycm9yT3I8VD4gKj4odGhpcyktPmdldEVycm9yU3RvcmFnZSgpOworICB9CisKKyAgdW5pb24geworICAgIEFsaWduZWRDaGFyQXJyYXlVbmlvbjxzdG9yYWdlX3R5cGU+IFRTdG9yYWdlOworICAgIEFsaWduZWRDaGFyQXJyYXlVbmlvbjxzdGQ6OmVycm9yX2NvZGU+IEVycm9yU3RvcmFnZTsKKyAgfTsKKyAgYm9vbCBIYXNFcnJvciA6IDE7Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgRT4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfZXJyb3JfY29kZV9lbnVtPEU+Ojp2YWx1ZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6aXNfZXJyb3JfY29uZGl0aW9uX2VudW08RT46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbD46OnR5cGUKK29wZXJhdG9yPT0oY29uc3QgRXJyb3JPcjxUPiAmRXJyLCBFIENvZGUpIHsKKyAgcmV0dXJuIEVyci5nZXRFcnJvcigpID09IENvZGU7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfRVJST1JPUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRmlsZU91dHB1dEJ1ZmZlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0ZpbGVPdXRwdXRCdWZmZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YWVkNDIzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0ZpbGVPdXRwdXRCdWZmZXIuaApAQCAtMCwwICsxLDc0IEBACisvLz09PSBGaWxlT3V0cHV0QnVmZmVyLmggLSBGaWxlIE91dHB1dCBCdWZmZXIgLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFV0aWxpdHkgZm9yIGNyZWF0aW5nIGEgaW4tbWVtb3J5IGJ1ZmZlciB0aGF0IHdpbGwgYmUgd3JpdHRlbiB0byBhIGZpbGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfRklMRU9VVFBVVEJVRkZFUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9GSUxFT1VUUFVUQlVGRkVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKy8vLyBGaWxlT3V0cHV0QnVmZmVyIC0gVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgc2ltcGxlIHdheSB0byBjcmVhdGUgYW4gaW4tbWVtb3J5CisvLy8gYnVmZmVyIHdoaWNoIHdpbGwgYmUgd3JpdHRlbiB0byBhIGZpbGUuIER1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlc2UKKy8vLyBvYmplY3RzLCB0aGUgY29udGVudCBvciBleGlzdGVuY2Ugb2YgdGhlIHNwZWNpZmllZCBmaWxlIGlzIHVuZGVmaW5lZC4gVGhhdAorLy8vIGlzLCBjcmVhdGluZyBhbiBPdXRwdXRCdWZmZXIgZm9yIGEgZmlsZSBtYXkgaW1tZWRpYXRlbHkgcmVtb3ZlIHRoZSBmaWxlLgorLy8vIElmIHRoZSBGaWxlT3V0cHV0QnVmZmVyIGlzIGNvbW1pdHRlZCwgdGhlIHRhcmdldCBmaWxlJ3MgY29udGVudCB3aWxsIGJlY29tZQorLy8vIHRoZSBidWZmZXIgY29udGVudCBhdCB0aGUgdGltZSBvZiB0aGUgY29tbWl0LiAgSWYgdGhlIEZpbGVPdXRwdXRCdWZmZXIgaXMKKy8vLyBub3QgY29tbWl0dGVkLCB0aGUgZmlsZSB3aWxsIGJlIGRlbGV0ZWQgaW4gdGhlIEZpbGVPdXRwdXRCdWZmZXIgZGVzdHJ1Y3Rvci4KK2NsYXNzIEZpbGVPdXRwdXRCdWZmZXIgeworcHVibGljOgorICBlbnVtICB7CisgICAgRl9leGVjdXRhYmxlID0gMSAgLy8vIHNldCB0aGUgJ3gnIGJpdCBvbiB0aGUgcmVzdWx0aW5nIGZpbGUKKyAgfTsKKworICAvLy8gRmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGFuIE91dHB1dEJ1ZmZlciBvYmplY3Qgd2hpY2ggbWFuYWdlcyBhIHJlYWQvd3JpdGUKKyAgLy8vIGJ1ZmZlciBvZiB0aGUgc3BlY2lmaWVkIHNpemUuIFdoZW4gY29tbWl0dGVkLCB0aGUgYnVmZmVyIHdpbGwgYmUgd3JpdHRlbgorICAvLy8gdG8gdGhlIGZpbGUgYXQgdGhlIHNwZWNpZmllZCBwYXRoLgorICBzdGF0aWMgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPEZpbGVPdXRwdXRCdWZmZXI+PgorICBjcmVhdGUoU3RyaW5nUmVmIEZpbGVQYXRoLCBzaXplX3QgU2l6ZSwgdW5zaWduZWQgRmxhZ3MgPSAwKTsKKworICAvLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHN0YXJ0IG9mIHRoZSBidWZmZXIuCisgIHZpcnR1YWwgdWludDhfdCAqZ2V0QnVmZmVyU3RhcnQoKSBjb25zdCA9IDA7CisKKyAgLy8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKyAgdmlydHVhbCB1aW50OF90ICpnZXRCdWZmZXJFbmQoKSBjb25zdCA9IDA7CisKKyAgLy8vIFJldHVybnMgc2l6ZSBvZiB0aGUgYnVmZmVyLgorICB2aXJ0dWFsIHNpemVfdCBnZXRCdWZmZXJTaXplKCkgY29uc3QgPSAwOworCisgIC8vLyBSZXR1cm5zIHBhdGggd2hlcmUgZmlsZSB3aWxsIHNob3cgdXAgaWYgYnVmZmVyIGlzIGNvbW1pdHRlZC4KKyAgU3RyaW5nUmVmIGdldFBhdGgoKSBjb25zdCB7IHJldHVybiBGaW5hbFBhdGg7IH0KKworICAvLy8gRmx1c2hlcyB0aGUgY29udGVudCBvZiB0aGUgYnVmZmVyIHRvIGl0cyBmaWxlIGFuZCBkZWFsbG9jYXRlcyB0aGUKKyAgLy8vIGJ1ZmZlci4gIElmIGNvbW1pdCgpIGlzIG5vdCBjYWxsZWQgYmVmb3JlIHRoaXMgb2JqZWN0J3MgZGVzdHJ1Y3RvcgorICAvLy8gaXMgY2FsbGVkLCB0aGUgZmlsZSBpcyBkZWxldGVkIGluIHRoZSBkZXN0cnVjdG9yLiBUaGUgb3B0aW9uYWwgcGFyYW1ldGVyCisgIC8vLyBpcyB1c2VkIGlmIGl0IHR1cm5zIG91dCB5b3Ugd2FudCB0aGUgZmlsZSBzaXplIHRvIGJlIHNtYWxsZXIgdGhhbgorICAvLy8gaW5pdGlhbGx5IHJlcXVlc3RlZC4KKyAgdmlydHVhbCBFcnJvciBjb21taXQoKSA9IDA7CisKKyAgLy8vIElmIHRoaXMgb2JqZWN0IHdhcyBwcmV2aW91c2x5IGNvbW1pdHRlZCwgdGhlIGRlc3RydWN0b3IganVzdCBkZWxldGVzCisgIC8vLyB0aGlzIG9iamVjdC4gIElmIHRoaXMgb2JqZWN0IHdhcyBub3QgY29tbWl0dGVkLCB0aGUgZGVzdHJ1Y3RvcgorICAvLy8gZGVhbGxvY2F0ZXMgdGhlIGJ1ZmZlciBhbmQgdGhlIHRhcmdldCBmaWxlIGlzIG5ldmVyIHdyaXR0ZW4uCisgIHZpcnR1YWwgfkZpbGVPdXRwdXRCdWZmZXIoKSB7fQorCitwcm90ZWN0ZWQ6CisgIEZpbGVPdXRwdXRCdWZmZXIoU3RyaW5nUmVmIFBhdGgpIDogRmluYWxQYXRoKFBhdGgpIHt9CisKKyAgc3RkOjpzdHJpbmcgRmluYWxQYXRoOworfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0ZpbGVTeXN0ZW0uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTliMDJkOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmgKQEAgLTAsMCArMSwxMTEwIEBACisvLz09PS0gbGx2bS9TdXBwb3J0L0ZpbGVTeXN0ZW0uaCAtIEZpbGUgU3lzdGVtIE9TIENvbmNlcHQgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgbGx2bTo6c3lzOjpmcyBuYW1lc3BhY2UuIEl0IGlzIGRlc2lnbmVkIGFmdGVyCisvLyBUUjIvYm9vc3QgZmlsZXN5c3RlbSAodjMpLCBidXQgbW9kaWZpZWQgdG8gcmVtb3ZlIGV4Y2VwdGlvbiBoYW5kbGluZyBhbmQgdGhlCisvLyBwYXRoIGNsYXNzLgorLy8KKy8vIEFsbCBmdW5jdGlvbnMgcmV0dXJuIGFuIGVycm9yX2NvZGUgYW5kIHRoZWlyIGFjdHVhbCB3b3JrIHZpYSB0aGUgbGFzdCBvdXQKKy8vIGFyZ3VtZW50LiBUaGUgb3V0IGFyZ3VtZW50IGlzIGRlZmluZWQgaWYgYW5kIG9ubHkgaWYgZXJyYzo6c3VjY2VzcyBpcworLy8gcmV0dXJuZWQuIEEgZnVuY3Rpb24gbWF5IHJldHVybiBhbnkgZXJyb3IgY29kZSBpbiB0aGUgZ2VuZXJpYyBvciBzeXN0ZW0KKy8vIGNhdGVnb3J5LiBIb3dldmVyLCB0aGV5IHNoYWxsIGJlIGVxdWl2YWxlbnQgdG8gYW55IGVycm9yIGNvbmRpdGlvbnMgbGlzdGVkCisvLyBpbiBlYWNoIGZ1bmN0aW9ucyByZXNwZWN0aXZlIGRvY3VtZW50YXRpb24gaWYgdGhlIGNvbmRpdGlvbiBhcHBsaWVzLiBbIG5vdGU6CisvLyB0aGlzIGRvZXMgbm90IGd1YXJhbnRlZSB0aGF0IGVycm9yX2NvZGUgd2lsbCBiZSBpbiB0aGUgc2V0IG9mIGV4cGxpY2l0bHkKKy8vIGxpc3RlZCBjb2RlcywgYnV0IGl0IGRvZXMgZ3VhcmFudGVlIHRoYXQgaWYgYW55IG9mIHRoZSBleHBsaWNpdGx5IGxpc3RlZAorLy8gZXJyb3JzIG9jY3VyLCB0aGUgY29ycmVjdCBlcnJvcl9jb2RlIHdpbGwgYmUgdXNlZCBdLiBBbGwgZnVuY3Rpb25zIG1heQorLy8gcmV0dXJuIGVycmM6Om5vdF9lbm91Z2hfbWVtb3J5IGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIGNvbXBsZXRlIHRoZQorLy8gb3BlcmF0aW9uLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0ZJTEVTWVNURU1fSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfRklMRVNZU1RFTV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nocm9uby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yT3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTUQ1LmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGN0aW1lPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdGFjaz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorI2luY2x1ZGUgPHR1cGxlPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2lmZGVmIEhBVkVfU1lTX1NUQVRfSAorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHN5cyB7CituYW1lc3BhY2UgZnMgeworCisvLy8gQW4gZW51bWVyYXRpb24gZm9yIHRoZSBmaWxlIHN5c3RlbSdzIHZpZXcgb2YgdGhlIHR5cGUuCitlbnVtIGNsYXNzIGZpbGVfdHlwZSB7CisgIHN0YXR1c19lcnJvciwKKyAgZmlsZV9ub3RfZm91bmQsCisgIHJlZ3VsYXJfZmlsZSwKKyAgZGlyZWN0b3J5X2ZpbGUsCisgIHN5bWxpbmtfZmlsZSwKKyAgYmxvY2tfZmlsZSwKKyAgY2hhcmFjdGVyX2ZpbGUsCisgIGZpZm9fZmlsZSwKKyAgc29ja2V0X2ZpbGUsCisgIHR5cGVfdW5rbm93bgorfTsKKworLy8vIHNwYWNlX2luZm8gLSBTZWxmIGV4cGxhbmF0b3J5Lgorc3RydWN0IHNwYWNlX2luZm8geworICB1aW50NjRfdCBjYXBhY2l0eTsKKyAgdWludDY0X3QgZnJlZTsKKyAgdWludDY0X3QgYXZhaWxhYmxlOworfTsKKworZW51bSBwZXJtcyB7CisgIG5vX3Blcm1zID0gMCwKKyAgb3duZXJfcmVhZCA9IDA0MDAsCisgIG93bmVyX3dyaXRlID0gMDIwMCwKKyAgb3duZXJfZXhlID0gMDEwMCwKKyAgb3duZXJfYWxsID0gb3duZXJfcmVhZCB8IG93bmVyX3dyaXRlIHwgb3duZXJfZXhlLAorICBncm91cF9yZWFkID0gMDQwLAorICBncm91cF93cml0ZSA9IDAyMCwKKyAgZ3JvdXBfZXhlID0gMDEwLAorICBncm91cF9hbGwgPSBncm91cF9yZWFkIHwgZ3JvdXBfd3JpdGUgfCBncm91cF9leGUsCisgIG90aGVyc19yZWFkID0gMDQsCisgIG90aGVyc193cml0ZSA9IDAyLAorICBvdGhlcnNfZXhlID0gMDEsCisgIG90aGVyc19hbGwgPSBvdGhlcnNfcmVhZCB8IG90aGVyc193cml0ZSB8IG90aGVyc19leGUsCisgIGFsbF9yZWFkID0gb3duZXJfcmVhZCB8IGdyb3VwX3JlYWQgfCBvdGhlcnNfcmVhZCwKKyAgYWxsX3dyaXRlID0gb3duZXJfd3JpdGUgfCBncm91cF93cml0ZSB8IG90aGVyc193cml0ZSwKKyAgYWxsX2V4ZSA9IG93bmVyX2V4ZSB8IGdyb3VwX2V4ZSB8IG90aGVyc19leGUsCisgIGFsbF9hbGwgPSBvd25lcl9hbGwgfCBncm91cF9hbGwgfCBvdGhlcnNfYWxsLAorICBzZXRfdWlkX29uX2V4ZSA9IDA0MDAwLAorICBzZXRfZ2lkX29uX2V4ZSA9IDAyMDAwLAorICBzdGlja3lfYml0ID0gMDEwMDAsCisgIGFsbF9wZXJtcyA9IGFsbF9hbGwgfCBzZXRfdWlkX29uX2V4ZSB8IHNldF9naWRfb25fZXhlIHwgc3RpY2t5X2JpdCwKKyAgcGVybXNfbm90X2tub3duID0gMHhGRkZGCit9OworCisvLyBIZWxwZXIgZnVuY3Rpb25zIHNvIHRoYXQgeW91IGNhbiB1c2UgJiBhbmQgfCB0byBtYW5pcHVsYXRlIHBlcm1zIGJpdHM6CitpbmxpbmUgcGVybXMgb3BlcmF0b3J8KHBlcm1zIGwsIHBlcm1zIHIpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHBlcm1zPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4obCkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihyKSk7Cit9CitpbmxpbmUgcGVybXMgb3BlcmF0b3ImKHBlcm1zIGwsIHBlcm1zIHIpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHBlcm1zPihzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4obCkgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0PihyKSk7Cit9CitpbmxpbmUgcGVybXMgJm9wZXJhdG9yfD0ocGVybXMgJmwsIHBlcm1zIHIpIHsKKyAgbCA9IGwgfCByOworICByZXR1cm4gbDsKK30KK2lubGluZSBwZXJtcyAmb3BlcmF0b3ImPShwZXJtcyAmbCwgcGVybXMgcikgeworICBsID0gbCAmIHI7CisgIHJldHVybiBsOworfQoraW5saW5lIHBlcm1zIG9wZXJhdG9yfihwZXJtcyB4KSB7CisgIC8vIEF2b2lkIFVCIGJ5IGV4cGxpY2l0bHkgdHJ1bmNhdGluZyB0aGUgKHVuc2lnbmVkKSB+IHJlc3VsdC4KKyAgcmV0dXJuIHN0YXRpY19jYXN0PHBlcm1zPigKKyAgICAgIHN0YXRpY19jYXN0PHVuc2lnbmVkIHNob3J0Pih+c3RhdGljX2Nhc3Q8dW5zaWduZWQgc2hvcnQ+KHgpKSk7Cit9CisKK2NsYXNzIFVuaXF1ZUlEIHsKKyAgdWludDY0X3QgRGV2aWNlOworICB1aW50NjRfdCBGaWxlOworCitwdWJsaWM6CisgIFVuaXF1ZUlEKCkgPSBkZWZhdWx0OworICBVbmlxdWVJRCh1aW50NjRfdCBEZXZpY2UsIHVpbnQ2NF90IEZpbGUpIDogRGV2aWNlKERldmljZSksIEZpbGUoRmlsZSkge30KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgVW5pcXVlSUQgJk90aGVyKSBjb25zdCB7CisgICAgcmV0dXJuIERldmljZSA9PSBPdGhlci5EZXZpY2UgJiYgRmlsZSA9PSBPdGhlci5GaWxlOworICB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBVbmlxdWVJRCAmT3RoZXIpIGNvbnN0IHsgcmV0dXJuICEoKnRoaXMgPT0gT3RoZXIpOyB9CisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFVuaXF1ZUlEICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiBzdGQ6OnRpZShEZXZpY2UsIEZpbGUpIDwgc3RkOjp0aWUoT3RoZXIuRGV2aWNlLCBPdGhlci5GaWxlKTsKKyAgfQorCisgIHVpbnQ2NF90IGdldERldmljZSgpIGNvbnN0IHsgcmV0dXJuIERldmljZTsgfQorICB1aW50NjRfdCBnZXRGaWxlKCkgY29uc3QgeyByZXR1cm4gRmlsZTsgfQorfTsKKworLy8vIFJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBhIGNhbGwgdG8gZGlyZWN0b3J5X2l0ZXJhdG9yOjpzdGF0dXMoKS4gVGhpcyBpcyBhCisvLy8gc3Vic2V0IG9mIHRoZSBpbmZvcm1hdGlvbiByZXR1cm5lZCBieSBhIHJlZ3VsYXIgc3lzOjpmczo6c3RhdHVzKCkgY2FsbCwgYW5kCisvLy8gcmVwcmVzZW50cyB0aGUgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgV2luZG93cyBGaWxlRmlyc3RGaWxlL0ZpbmROZXh0RmlsZS4KK2NsYXNzIGJhc2ljX2ZpbGVfc3RhdHVzIHsKK3Byb3RlY3RlZDoKKyAgI2lmIGRlZmluZWQoTExWTV9PTl9VTklYKQorICB0aW1lX3QgZnNfc3RfYXRpbWUgPSAwOworICB0aW1lX3QgZnNfc3RfbXRpbWUgPSAwOworICB1aWRfdCBmc19zdF91aWQgPSAwOworICBnaWRfdCBmc19zdF9naWQgPSAwOworICBvZmZfdCBmc19zdF9zaXplID0gMDsKKyAgI2VsaWYgZGVmaW5lZCAoTExWTV9PTl9XSU4zMikKKyAgdWludDMyX3QgTGFzdEFjY2Vzc2VkVGltZUhpZ2ggPSAwOworICB1aW50MzJfdCBMYXN0QWNjZXNzZWRUaW1lTG93ID0gMDsKKyAgdWludDMyX3QgTGFzdFdyaXRlVGltZUhpZ2ggPSAwOworICB1aW50MzJfdCBMYXN0V3JpdGVUaW1lTG93ID0gMDsKKyAgdWludDMyX3QgRmlsZVNpemVIaWdoID0gMDsKKyAgdWludDMyX3QgRmlsZVNpemVMb3cgPSAwOworICAjZW5kaWYKKyAgZmlsZV90eXBlIFR5cGUgPSBmaWxlX3R5cGU6OnN0YXR1c19lcnJvcjsKKyAgcGVybXMgUGVybXMgPSBwZXJtc19ub3Rfa25vd247CisKK3B1YmxpYzoKKyAgYmFzaWNfZmlsZV9zdGF0dXMoKSA9IGRlZmF1bHQ7CisKKyAgZXhwbGljaXQgYmFzaWNfZmlsZV9zdGF0dXMoZmlsZV90eXBlIFR5cGUpIDogVHlwZShUeXBlKSB7fQorCisgICNpZiBkZWZpbmVkKExMVk1fT05fVU5JWCkKKyAgYmFzaWNfZmlsZV9zdGF0dXMoZmlsZV90eXBlIFR5cGUsIHBlcm1zIFBlcm1zLCB0aW1lX3QgQVRpbWUsIHRpbWVfdCBNVGltZSwKKyAgICAgICAgICAgICAgICAgICAgdWlkX3QgVUlELCBnaWRfdCBHSUQsIG9mZl90IFNpemUpCisgICAgICA6IGZzX3N0X2F0aW1lKEFUaW1lKSwgZnNfc3RfbXRpbWUoTVRpbWUpLCBmc19zdF91aWQoVUlEKSwgZnNfc3RfZ2lkKEdJRCksCisgICAgICAgIGZzX3N0X3NpemUoU2l6ZSksIFR5cGUoVHlwZSksIFBlcm1zKFBlcm1zKSB7fQorI2VsaWYgZGVmaW5lZChMTFZNX09OX1dJTjMyKQorICBiYXNpY19maWxlX3N0YXR1cyhmaWxlX3R5cGUgVHlwZSwgcGVybXMgUGVybXMsIHVpbnQzMl90IExhc3RBY2Nlc3NUaW1lSGlnaCwKKyAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTGFzdEFjY2Vzc1RpbWVMb3csIHVpbnQzMl90IExhc3RXcml0ZVRpbWVIaWdoLAorICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBMYXN0V3JpdGVUaW1lTG93LCB1aW50MzJfdCBGaWxlU2l6ZUhpZ2gsCisgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IEZpbGVTaXplTG93KQorICAgICAgOiBMYXN0QWNjZXNzZWRUaW1lSGlnaChMYXN0QWNjZXNzVGltZUhpZ2gpLAorICAgICAgICBMYXN0QWNjZXNzZWRUaW1lTG93KExhc3RBY2Nlc3NUaW1lTG93KSwKKyAgICAgICAgTGFzdFdyaXRlVGltZUhpZ2goTGFzdFdyaXRlVGltZUhpZ2gpLAorICAgICAgICBMYXN0V3JpdGVUaW1lTG93KExhc3RXcml0ZVRpbWVMb3cpLCBGaWxlU2l6ZUhpZ2goRmlsZVNpemVIaWdoKSwKKyAgICAgICAgRmlsZVNpemVMb3coRmlsZVNpemVMb3cpLCBUeXBlKFR5cGUpLCBQZXJtcyhQZXJtcykge30KKyAgI2VuZGlmCisKKyAgLy8gZ2V0dGVycworICBmaWxlX3R5cGUgdHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5cGU7IH0KKyAgcGVybXMgcGVybWlzc2lvbnMoKSBjb25zdCB7IHJldHVybiBQZXJtczsgfQorICBUaW1lUG9pbnQ8PiBnZXRMYXN0QWNjZXNzZWRUaW1lKCkgY29uc3Q7CisgIFRpbWVQb2ludDw+IGdldExhc3RNb2RpZmljYXRpb25UaW1lKCkgY29uc3Q7CisKKyAgI2lmIGRlZmluZWQoTExWTV9PTl9VTklYKQorICB1aW50MzJfdCBnZXRVc2VyKCkgY29uc3QgeyByZXR1cm4gZnNfc3RfdWlkOyB9CisgIHVpbnQzMl90IGdldEdyb3VwKCkgY29uc3QgeyByZXR1cm4gZnNfc3RfZ2lkOyB9CisgIHVpbnQ2NF90IGdldFNpemUoKSBjb25zdCB7IHJldHVybiBmc19zdF9zaXplOyB9CisgICNlbGlmIGRlZmluZWQgKExMVk1fT05fV0lOMzIpCisgIHVpbnQzMl90IGdldFVzZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIDk5OTk7IC8vIE5vdCBhcHBsaWNhYmxlIHRvIFdpbmRvd3MsIHNvLi4uCisgIH0KKworICB1aW50MzJfdCBnZXRHcm91cCgpIGNvbnN0IHsKKyAgICByZXR1cm4gOTk5OTsgLy8gTm90IGFwcGxpY2FibGUgdG8gV2luZG93cywgc28uLi4KKyAgfQorCisgIHVpbnQ2NF90IGdldFNpemUoKSBjb25zdCB7CisgICAgcmV0dXJuICh1aW50NjRfdChGaWxlU2l6ZUhpZ2gpIDw8IDMyKSArIEZpbGVTaXplTG93OworICB9CisgICNlbmRpZgorCisgIC8vIHNldHRlcnMKKyAgdm9pZCB0eXBlKGZpbGVfdHlwZSB2KSB7IFR5cGUgPSB2OyB9CisgIHZvaWQgcGVybWlzc2lvbnMocGVybXMgcCkgeyBQZXJtcyA9IHA7IH0KK307CisKKy8vLyBSZXByZXNlbnRzIHRoZSByZXN1bHQgb2YgYSBjYWxsIHRvIHN5czo6ZnM6OnN0YXR1cygpLgorY2xhc3MgZmlsZV9zdGF0dXMgOiBwdWJsaWMgYmFzaWNfZmlsZV9zdGF0dXMgeworICBmcmllbmQgYm9vbCBlcXVpdmFsZW50KGZpbGVfc3RhdHVzIEEsIGZpbGVfc3RhdHVzIEIpOworCisgICNpZiBkZWZpbmVkKExMVk1fT05fVU5JWCkKKyAgZGV2X3QgZnNfc3RfZGV2ID0gMDsKKyAgbmxpbmtfdCBmc19zdF9ubGlua3MgPSAwOworICBpbm9fdCBmc19zdF9pbm8gPSAwOworICAjZWxpZiBkZWZpbmVkIChMTFZNX09OX1dJTjMyKQorICB1aW50MzJfdCBOdW1MaW5rcyA9IDA7CisgIHVpbnQzMl90IFZvbHVtZVNlcmlhbE51bWJlciA9IDA7CisgIHVpbnQzMl90IEZpbGVJbmRleEhpZ2ggPSAwOworICB1aW50MzJfdCBGaWxlSW5kZXhMb3cgPSAwOworICAjZW5kaWYKKworcHVibGljOgorICBmaWxlX3N0YXR1cygpID0gZGVmYXVsdDsKKworICBleHBsaWNpdCBmaWxlX3N0YXR1cyhmaWxlX3R5cGUgVHlwZSkgOiBiYXNpY19maWxlX3N0YXR1cyhUeXBlKSB7fQorCisgICNpZiBkZWZpbmVkKExMVk1fT05fVU5JWCkKKyAgZmlsZV9zdGF0dXMoZmlsZV90eXBlIFR5cGUsIHBlcm1zIFBlcm1zLCBkZXZfdCBEZXYsIG5saW5rX3QgTGlua3MsIGlub190IElubywKKyAgICAgICAgICAgICAgdGltZV90IEFUaW1lLCB0aW1lX3QgTVRpbWUsIHVpZF90IFVJRCwgZ2lkX3QgR0lELCBvZmZfdCBTaXplKQorICAgICAgOiBiYXNpY19maWxlX3N0YXR1cyhUeXBlLCBQZXJtcywgQVRpbWUsIE1UaW1lLCBVSUQsIEdJRCwgU2l6ZSksCisgICAgICAgIGZzX3N0X2RldihEZXYpLCBmc19zdF9ubGlua3MoTGlua3MpLCBmc19zdF9pbm8oSW5vKSB7fQorICAjZWxpZiBkZWZpbmVkKExMVk1fT05fV0lOMzIpCisgIGZpbGVfc3RhdHVzKGZpbGVfdHlwZSBUeXBlLCBwZXJtcyBQZXJtcywgdWludDMyX3QgTGlua0NvdW50LAorICAgICAgICAgICAgICB1aW50MzJfdCBMYXN0QWNjZXNzVGltZUhpZ2gsIHVpbnQzMl90IExhc3RBY2Nlc3NUaW1lTG93LAorICAgICAgICAgICAgICB1aW50MzJfdCBMYXN0V3JpdGVUaW1lSGlnaCwgdWludDMyX3QgTGFzdFdyaXRlVGltZUxvdywKKyAgICAgICAgICAgICAgdWludDMyX3QgVm9sdW1lU2VyaWFsTnVtYmVyLCB1aW50MzJfdCBGaWxlU2l6ZUhpZ2gsCisgICAgICAgICAgICAgIHVpbnQzMl90IEZpbGVTaXplTG93LCB1aW50MzJfdCBGaWxlSW5kZXhIaWdoLAorICAgICAgICAgICAgICB1aW50MzJfdCBGaWxlSW5kZXhMb3cpCisgICAgICA6IGJhc2ljX2ZpbGVfc3RhdHVzKFR5cGUsIFBlcm1zLCBMYXN0QWNjZXNzVGltZUhpZ2gsIExhc3RBY2Nlc3NUaW1lTG93LAorICAgICAgICAgICAgICAgICAgICAgICAgICBMYXN0V3JpdGVUaW1lSGlnaCwgTGFzdFdyaXRlVGltZUxvdywgRmlsZVNpemVIaWdoLAorICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlU2l6ZUxvdyksCisgICAgICAgIE51bUxpbmtzKExpbmtDb3VudCksIFZvbHVtZVNlcmlhbE51bWJlcihWb2x1bWVTZXJpYWxOdW1iZXIpLAorICAgICAgICBGaWxlSW5kZXhIaWdoKEZpbGVJbmRleEhpZ2gpLCBGaWxlSW5kZXhMb3coRmlsZUluZGV4TG93KSB7fQorICAjZW5kaWYKKworICBVbmlxdWVJRCBnZXRVbmlxdWVJRCgpIGNvbnN0OworICB1aW50MzJfdCBnZXRMaW5rQ291bnQoKSBjb25zdDsKK307CisKKy8vLyBAfQorLy8vIEBuYW1lIFBoeXNpY2FsIE9wZXJhdG9ycworLy8vIEB7CisKKy8vLyBAYnJpZWYgTWFrZSBcYSBwYXRoIGFuIGFic29sdXRlIHBhdGguCisvLy8KKy8vLyBNYWtlcyBcYSBwYXRoIGFic29sdXRlIHVzaW5nIHRoZSBcYSBjdXJyZW50X2RpcmVjdG9yeSBpZiBpdCBpcyBub3QgYWxyZWFkeS4KKy8vLyBBbiBlbXB0eSBcYSBwYXRoIHdpbGwgcmVzdWx0IGluIHRoZSBcYSBjdXJyZW50X2RpcmVjdG9yeS4KKy8vLworLy8vIC9hYnNvbHV0ZS9wYXRoICAgPT4gL2Fic29sdXRlL3BhdGgKKy8vLyByZWxhdGl2ZS8uLi9wYXRoID0+IDxjdXJyZW50LWRpcmVjdG9yeT4vcmVsYXRpdmUvLi4vcGF0aAorLy8vCisvLy8gQHBhcmFtIHBhdGggQSBwYXRoIHRoYXQgaXMgbW9kaWZpZWQgdG8gYmUgYW4gYWJzb2x1dGUgcGF0aC4KKy8vLyBAcmV0dXJucyBlcnJjOjpzdWNjZXNzIGlmIFxhIHBhdGggaGFzIGJlZW4gbWFkZSBhYnNvbHV0ZSwgb3RoZXJ3aXNlIGEKKy8vLyAgICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvcl9jb2RlLgorc3RkOjplcnJvcl9jb2RlIG1ha2VfYWJzb2x1dGUoY29uc3QgVHdpbmUgJmN1cnJlbnRfZGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZwYXRoKTsKKworLy8vIEBicmllZiBNYWtlIFxhIHBhdGggYW4gYWJzb2x1dGUgcGF0aC4KKy8vLworLy8vIE1ha2VzIFxhIHBhdGggYWJzb2x1dGUgdXNpbmcgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IGlmIGl0IGlzIG5vdCBhbHJlYWR5LiBBbgorLy8vIGVtcHR5IFxhIHBhdGggd2lsbCByZXN1bHQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorLy8vCisvLy8gL2Fic29sdXRlL3BhdGggICA9PiAvYWJzb2x1dGUvcGF0aAorLy8vIHJlbGF0aXZlLy4uL3BhdGggPT4gPGN1cnJlbnQtZGlyZWN0b3J5Pi9yZWxhdGl2ZS8uLi9wYXRoCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBBIHBhdGggdGhhdCBpcyBtb2RpZmllZCB0byBiZSBhbiBhYnNvbHV0ZSBwYXRoLgorLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgXGEgcGF0aCBoYXMgYmVlbiBtYWRlIGFic29sdXRlLCBvdGhlcndpc2UgYQorLy8vICAgICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIGVycm9yX2NvZGUuCitzdGQ6OmVycm9yX2NvZGUgbWFrZV9hYnNvbHV0ZShTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnBhdGgpOworCisvLy8gQGJyaWVmIENyZWF0ZSBhbGwgdGhlIG5vbi1leGlzdGVudCBkaXJlY3RvcmllcyBpbiBwYXRoLgorLy8vCisvLy8gQHBhcmFtIHBhdGggRGlyZWN0b3JpZXMgdG8gY3JlYXRlLgorLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgaXNfZGlyZWN0b3J5KHBhdGgpLCBvdGhlcndpc2UgYSBwbGF0Zm9ybQorLy8vICAgICAgICAgIHNwZWNpZmljIGVycm9yX2NvZGUuIElmIElnbm9yZUV4aXN0aW5nIGlzIGZhbHNlLCBhbHNvIHJldHVybnMKKy8vLyAgICAgICAgICBlcnJvciBpZiB0aGUgZGlyZWN0b3J5IGFscmVhZHkgZXhpc3RlZC4KK3N0ZDo6ZXJyb3JfY29kZSBjcmVhdGVfZGlyZWN0b3JpZXMoY29uc3QgVHdpbmUgJnBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSWdub3JlRXhpc3RpbmcgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwZXJtcyBQZXJtcyA9IG93bmVyX2FsbCB8IGdyb3VwX2FsbCk7CisKKy8vLyBAYnJpZWYgQ3JlYXRlIHRoZSBkaXJlY3RvcnkgaW4gcGF0aC4KKy8vLworLy8vIEBwYXJhbSBwYXRoIERpcmVjdG9yeSB0byBjcmVhdGUuCisvLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiBpc19kaXJlY3RvcnkocGF0aCksIG90aGVyd2lzZSBhIHBsYXRmb3JtCisvLy8gICAgICAgICAgc3BlY2lmaWMgZXJyb3JfY29kZS4gSWYgSWdub3JlRXhpc3RpbmcgaXMgZmFsc2UsIGFsc28gcmV0dXJucworLy8vICAgICAgICAgIGVycm9yIGlmIHRoZSBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdGVkLgorc3RkOjplcnJvcl9jb2RlIGNyZWF0ZV9kaXJlY3RvcnkoY29uc3QgVHdpbmUgJnBhdGgsIGJvb2wgSWdub3JlRXhpc3RpbmcgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGVybXMgUGVybXMgPSBvd25lcl9hbGwgfCBncm91cF9hbGwpOworCisvLy8gQGJyaWVmIENyZWF0ZSBhIGxpbmsgZnJvbSBcYSBmcm9tIHRvIFxhIHRvLgorLy8vCisvLy8gVGhlIGxpbmsgbWF5IGJlIGEgc29mdCBvciBhIGhhcmQgbGluaywgZGVwZW5kaW5nIG9uIHRoZSBwbGF0Zm9ybS4gVGhlIGNhbGxlcgorLy8vIG1heSBub3QgYXNzdW1lIHdoaWNoIG9uZS4gQ3VycmVudGx5IG9uIHdpbmRvd3MgaXQgY3JlYXRlcyBhIGhhcmQgbGluayBzaW5jZQorLy8vIHNvZnQgbGlua3MgcmVxdWlyZSBleHRyYSBwcml2aWxlZ2VzLiBPbiB1bml4LCBpdCBjcmVhdGVzIGEgc29mdCBsaW5rIHNpbmNlCisvLy8gaGFyZCBsaW5rcyBkb24ndCB3b3JrIG9uIFNNQiBmaWxlIHN5c3RlbXMuCisvLy8KKy8vLyBAcGFyYW0gdG8gVGhlIHBhdGggdG8gaGFyZCBsaW5rIHRvLgorLy8vIEBwYXJhbSBmcm9tIFRoZSBwYXRoIHRvIGhhcmQgbGluayBmcm9tLiBUaGlzIGlzIGNyZWF0ZWQuCisvLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiB0aGUgbGluayB3YXMgY3JlYXRlZCwgb3RoZXJ3aXNlIGEgcGxhdGZvcm0KKy8vLyBzcGVjaWZpYyBlcnJvcl9jb2RlLgorc3RkOjplcnJvcl9jb2RlIGNyZWF0ZV9saW5rKGNvbnN0IFR3aW5lICZ0bywgY29uc3QgVHdpbmUgJmZyb20pOworCisvLy8gQ3JlYXRlIGEgaGFyZCBsaW5rIGZyb20gXGEgZnJvbSB0byBcYSB0bywgb3IgcmV0dXJuIGFuIGVycm9yLgorLy8vCisvLy8gQHBhcmFtIHRvIFRoZSBwYXRoIHRvIGhhcmQgbGluayB0by4KKy8vLyBAcGFyYW0gZnJvbSBUaGUgcGF0aCB0byBoYXJkIGxpbmsgZnJvbS4gVGhpcyBpcyBjcmVhdGVkLgorLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgdGhlIGxpbmsgd2FzIGNyZWF0ZWQsIG90aGVyd2lzZSBhIHBsYXRmb3JtCisvLy8gc3BlY2lmaWMgZXJyb3JfY29kZS4KK3N0ZDo6ZXJyb3JfY29kZSBjcmVhdGVfaGFyZF9saW5rKGNvbnN0IFR3aW5lICZ0bywgY29uc3QgVHdpbmUgJmZyb20pOworCisvLy8gQGJyaWVmIENvbGxhcHNlIGFsbCAuIGFuZCAuLiBwYXR0ZXJucywgcmVzb2x2ZSBhbGwgc3ltbGlua3MsIGFuZCBvcHRpb25hbGx5CisvLy8gICAgICAgIGV4cGFuZCB+IGV4cHJlc3Npb25zIHRvIHRoZSB1c2VyJ3MgaG9tZSBkaXJlY3RvcnkuCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBUaGUgcGF0aCB0byByZXNvbHZlLgorLy8vIEBwYXJhbSBvdXRwdXQgVGhlIGxvY2F0aW9uIHRvIHN0b3JlIHRoZSByZXNvbHZlZCBwYXRoLgorLy8vIEBwYXJhbSBleHBhbmRfdGlsZGUgSWYgdHJ1ZSwgcmVzb2x2ZXMgfiBleHByZXNzaW9ucyB0byB0aGUgdXNlcidzIGhvbWUKKy8vLyAgICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeS4KK3N0ZDo6ZXJyb3JfY29kZSByZWFsX3BhdGgoY29uc3QgVHdpbmUgJnBhdGgsIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGV4cGFuZF90aWxkZSA9IGZhbHNlKTsKKworLy8vIEBicmllZiBHZXQgdGhlIGN1cnJlbnQgcGF0aC4KKy8vLworLy8vIEBwYXJhbSByZXN1bHQgSG9sZHMgdGhlIGN1cnJlbnQgcGF0aCBvbiByZXR1cm4uCisvLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiB0aGUgY3VycmVudCBwYXRoIGhhcyBiZWVuIHN0b3JlZCBpbiByZXN1bHQsCisvLy8gICAgICAgICAgb3RoZXJ3aXNlIGEgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3JfY29kZS4KK3N0ZDo6ZXJyb3JfY29kZSBjdXJyZW50X3BhdGgoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZyZXN1bHQpOworCisvLy8gQGJyaWVmIFNldCB0aGUgY3VycmVudCBwYXRoLgorLy8vCisvLy8gQHBhcmFtIHBhdGggVGhlIHBhdGggdG8gc2V0LgorLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgdGhlIGN1cnJlbnQgcGF0aCB3YXMgc3VjY2Vzc2Z1bGx5IHNldCwKKy8vLyAgICAgICAgICBvdGhlcndpc2UgYSBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvcl9jb2RlLgorc3RkOjplcnJvcl9jb2RlIHNldF9jdXJyZW50X3BhdGgoY29uc3QgVHdpbmUgJnBhdGgpOworCisvLy8gQGJyaWVmIFJlbW92ZSBwYXRoLiBFcXVpdmFsZW50IHRvIFBPU0lYIHJlbW92ZSgpLgorLy8vCisvLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmV0dXJucyBlcnJjOjpzdWNjZXNzIGlmIHBhdGggaGFzIGJlZW4gcmVtb3ZlZCBvciBkaWRuJ3QgZXhpc3QsIG90aGVyd2lzZSBhCisvLy8gICAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3IgY29kZS4gSWYgSWdub3JlTm9uRXhpc3RpbmcgaXMgZmFsc2UsIGFsc28KKy8vLyAgICAgICAgICByZXR1cm5zIGVycm9yIGlmIHRoZSBmaWxlIGRpZG4ndCBleGlzdC4KK3N0ZDo6ZXJyb3JfY29kZSByZW1vdmUoY29uc3QgVHdpbmUgJnBhdGgsIGJvb2wgSWdub3JlTm9uRXhpc3RpbmcgPSB0cnVlKTsKKworLy8vIEBicmllZiBSZWN1cnNpdmVseSBkZWxldGUgYSBkaXJlY3RvcnkuCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgcGF0aCBoYXMgYmVlbiByZW1vdmVkIG9yIGRpZG4ndCBleGlzdCwgb3RoZXJ3aXNlIGEKKy8vLyAgICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvciBjb2RlLgorc3RkOjplcnJvcl9jb2RlIHJlbW92ZV9kaXJlY3Rvcmllcyhjb25zdCBUd2luZSAmcGF0aCwgYm9vbCBJZ25vcmVFcnJvcnMgPSB0cnVlKTsKKworLy8vIEBicmllZiBSZW5hbWUgXGEgZnJvbSB0byBcYSB0by4KKy8vLworLy8vIEZpbGVzIGFyZSByZW5hbWVkIGFzIGlmIGJ5IFBPU0lYIHJlbmFtZSgpLCBleGNlcHQgdGhhdCBvbiBXaW5kb3dzIHRoZXJlIG1heQorLy8vIGJlIGEgc2hvcnQgaW50ZXJ2YWwgb2YgdGltZSBkdXJpbmcgd2hpY2ggdGhlIGRlc3RpbmF0aW9uIGZpbGUgZG9lcyBub3QKKy8vLyBleGlzdC4KKy8vLworLy8vIEBwYXJhbSBmcm9tIFRoZSBwYXRoIHRvIHJlbmFtZSBmcm9tLgorLy8vIEBwYXJhbSB0byBUaGUgcGF0aCB0byByZW5hbWUgdG8uIFRoaXMgaXMgY3JlYXRlZC4KK3N0ZDo6ZXJyb3JfY29kZSByZW5hbWUoY29uc3QgVHdpbmUgJmZyb20sIGNvbnN0IFR3aW5lICZ0byk7CisKKy8vLyBAYnJpZWYgQ29weSB0aGUgY29udGVudHMgb2YgXGEgRnJvbSB0byBcYSBUby4KKy8vLworLy8vIEBwYXJhbSBGcm9tIFRoZSBwYXRoIHRvIGNvcHkgZnJvbS4KKy8vLyBAcGFyYW0gVG8gVGhlIHBhdGggdG8gY29weSB0by4gVGhpcyBpcyBjcmVhdGVkLgorc3RkOjplcnJvcl9jb2RlIGNvcHlfZmlsZShjb25zdCBUd2luZSAmRnJvbSwgY29uc3QgVHdpbmUgJlRvKTsKKworLy8vIEBicmllZiBSZXNpemUgcGF0aCB0byBzaXplLiBGaWxlIGlzIHJlc2l6ZWQgYXMgaWYgYnkgUE9TSVggdHJ1bmNhdGUoKS4KKy8vLworLy8vIEBwYXJhbSBGRCBJbnB1dCBmaWxlIGRlc2NyaXB0b3IuCisvLy8gQHBhcmFtIFNpemUgU2l6ZSB0byByZXNpemUgdG8uCisvLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiBcYSBwYXRoIGhhcyBiZWVuIHJlc2l6ZWQgdG8gXGEgc2l6ZSwgb3RoZXJ3aXNlIGEKKy8vLyAgICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvcl9jb2RlLgorc3RkOjplcnJvcl9jb2RlIHJlc2l6ZV9maWxlKGludCBGRCwgdWludDY0X3QgU2l6ZSk7CisKKy8vLyBAYnJpZWYgQ29tcHV0ZSBhbiBNRDUgaGFzaCBvZiBhIGZpbGUncyBjb250ZW50cy4KKy8vLworLy8vIEBwYXJhbSBGRCBJbnB1dCBmaWxlIGRlc2NyaXB0b3IuCisvLy8gQHJldHVybnMgQW4gTUQ1UmVzdWx0IHdpdGggdGhlIGhhc2ggY29tcHV0ZWQsIGlmIHN1Y2Nlc3NmdWwsIG90aGVyd2lzZSBhCisvLy8gICAgICAgICAgc3RkOjplcnJvcl9jb2RlLgorRXJyb3JPcjxNRDU6Ok1ENVJlc3VsdD4gbWQ1X2NvbnRlbnRzKGludCBGRCk7CisKKy8vLyBAYnJpZWYgVmVyc2lvbiBvZiBjb21wdXRlX21kNSB0aGF0IGRvZXNuJ3QgcmVxdWlyZSBhbiBvcGVuIGZpbGUgZGVzY3JpcHRvci4KK0Vycm9yT3I8TUQ1OjpNRDVSZXN1bHQ+IG1kNV9jb250ZW50cyhjb25zdCBUd2luZSAmUGF0aCk7CisKKy8vLyBAfQorLy8vIEBuYW1lIFBoeXNpY2FsIE9ic2VydmVycworLy8vIEB7CisKKy8vLyBAYnJpZWYgRG9lcyBmaWxlIGV4aXN0PworLy8vCisvLy8gQHBhcmFtIHN0YXR1cyBBIGJhc2ljX2ZpbGVfc3RhdHVzIHByZXZpb3VzbHkgcmV0dXJuZWQgZnJvbSBzdGF0LgorLy8vIEByZXR1cm5zIFRydWUgaWYgdGhlIGZpbGUgcmVwcmVzZW50ZWQgYnkgc3RhdHVzIGV4aXN0cywgZmFsc2UgaWYgaXQgZG9lcworLy8vICAgICAgICAgIG5vdC4KK2Jvb2wgZXhpc3RzKGNvbnN0IGJhc2ljX2ZpbGVfc3RhdHVzICZzdGF0dXMpOworCitlbnVtIGNsYXNzIEFjY2Vzc01vZGUgeyBFeGlzdCwgV3JpdGUsIEV4ZWN1dGUgfTsKKworLy8vIEBicmllZiBDYW4gdGhlIGZpbGUgYmUgYWNjZXNzZWQ/CisvLy8KKy8vLyBAcGFyYW0gUGF0aCBJbnB1dCBwYXRoLgorLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgdGhlIHBhdGggY2FuIGJlIGFjY2Vzc2VkLCBvdGhlcndpc2UgYQorLy8vICAgICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIGVycm9yX2NvZGUuCitzdGQ6OmVycm9yX2NvZGUgYWNjZXNzKGNvbnN0IFR3aW5lICZQYXRoLCBBY2Nlc3NNb2RlIE1vZGUpOworCisvLy8gQGJyaWVmIERvZXMgZmlsZSBleGlzdD8KKy8vLworLy8vIEBwYXJhbSBQYXRoIElucHV0IHBhdGguCisvLy8gQHJldHVybnMgVHJ1ZSBpZiBpdCBleGlzdHMsIGZhbHNlIG90aGVyd2lzZS4KK2lubGluZSBib29sIGV4aXN0cyhjb25zdCBUd2luZSAmUGF0aCkgeworICByZXR1cm4gIWFjY2VzcyhQYXRoLCBBY2Nlc3NNb2RlOjpFeGlzdCk7Cit9CisKKy8vLyBAYnJpZWYgQ2FuIHdlIGV4ZWN1dGUgdGhpcyBmaWxlPworLy8vCisvLy8gQHBhcmFtIFBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmV0dXJucyBUcnVlIGlmIHdlIGNhbiBleGVjdXRlIGl0LCBmYWxzZSBvdGhlcndpc2UuCitib29sIGNhbl9leGVjdXRlKGNvbnN0IFR3aW5lICZQYXRoKTsKKworLy8vIEBicmllZiBDYW4gd2Ugd3JpdGUgdGhpcyBmaWxlPworLy8vCisvLy8gQHBhcmFtIFBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmV0dXJucyBUcnVlIGlmIHdlIGNhbiB3cml0ZSB0byBpdCwgZmFsc2Ugb3RoZXJ3aXNlLgoraW5saW5lIGJvb2wgY2FuX3dyaXRlKGNvbnN0IFR3aW5lICZQYXRoKSB7CisgIHJldHVybiAhYWNjZXNzKFBhdGgsIEFjY2Vzc01vZGU6OldyaXRlKTsKK30KKworLy8vIEBicmllZiBEbyBmaWxlX3N0YXR1cydzIHJlcHJlc2VudCB0aGUgc2FtZSB0aGluZz8KKy8vLworLy8vIEBwYXJhbSBBIElucHV0IGZpbGVfc3RhdHVzLgorLy8vIEBwYXJhbSBCIElucHV0IGZpbGVfc3RhdHVzLgorLy8vCisvLy8gYXNzZXJ0KHN0YXR1c19rbm93bihBKSB8fCBzdGF0dXNfa25vd24oQikpOworLy8vCisvLy8gQHJldHVybnMgVHJ1ZSBpZiBBIGFuZCBCIGJvdGggcmVwcmVzZW50IHRoZSBzYW1lIGZpbGUgc3lzdGVtIGVudGl0eSwgZmFsc2UKKy8vLyAgICAgICAgICBvdGhlcndpc2UuCitib29sIGVxdWl2YWxlbnQoZmlsZV9zdGF0dXMgQSwgZmlsZV9zdGF0dXMgQik7CisKKy8vLyBAYnJpZWYgRG8gcGF0aHMgcmVwcmVzZW50IHRoZSBzYW1lIHRoaW5nPworLy8vCisvLy8gYXNzZXJ0KHN0YXR1c19rbm93bihBKSB8fCBzdGF0dXNfa25vd24oQikpOworLy8vCisvLy8gQHBhcmFtIEEgSW5wdXQgcGF0aCBBLgorLy8vIEBwYXJhbSBCIElucHV0IHBhdGggQi4KKy8vLyBAcGFyYW0gcmVzdWx0IFNldCB0byB0cnVlIGlmIHN0YXQoQSkgYW5kIHN0YXQoQikgaGF2ZSB0aGUgc2FtZSBkZXZpY2UgYW5kCisvLy8gICAgICAgICAgICAgICBpbm9kZSAob3IgZXF1aXZhbGVudCkuCisvLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiByZXN1bHQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNldCwgb3RoZXJ3aXNlIGEKKy8vLyAgICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvcl9jb2RlLgorc3RkOjplcnJvcl9jb2RlIGVxdWl2YWxlbnQoY29uc3QgVHdpbmUgJkEsIGNvbnN0IFR3aW5lICZCLCBib29sICZyZXN1bHQpOworCisvLy8gQGJyaWVmIFNpbXBsZXIgdmVyc2lvbiBvZiBlcXVpdmFsZW50IGZvciBjbGllbnRzIHRoYXQgZG9uJ3QgbmVlZCB0bworLy8vICAgICAgICBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYW4gZXJyb3IgYW5kIGZhbHNlLgoraW5saW5lIGJvb2wgZXF1aXZhbGVudChjb25zdCBUd2luZSAmQSwgY29uc3QgVHdpbmUgJkIpIHsKKyAgYm9vbCByZXN1bHQ7CisgIHJldHVybiAhZXF1aXZhbGVudChBLCBCLCByZXN1bHQpICYmIHJlc3VsdDsKK30KKworLy8vIEBicmllZiBJcyB0aGUgZmlsZSBtb3VudGVkIG9uIGEgbG9jYWwgZmlsZXN5c3RlbT8KKy8vLworLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHBhcmFtIHJlc3VsdCBTZXQgdG8gdHJ1ZSBpZiBcYSBwYXRoIGlzIG9uIGZpeGVkIG1lZGlhIHN1Y2ggYXMgYSBoYXJkIGRpc2ssCisvLy8gICAgICAgICAgICAgICBmYWxzZSBpZiBpdCBpcyBub3QuCisvLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiByZXN1bHQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNldCwgb3RoZXJ3aXNlIGEKKy8vLyAgICAgICAgICBwbGF0Zm9ybSBzcGVjaWZpYyBlcnJvcl9jb2RlLgorc3RkOjplcnJvcl9jb2RlIGlzX2xvY2FsKGNvbnN0IFR3aW5lICZwYXRoLCBib29sICZyZXN1bHQpOworCisvLy8gQGJyaWVmIFZlcnNpb24gb2YgaXNfbG9jYWwgYWNjZXB0aW5nIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yLgorc3RkOjplcnJvcl9jb2RlIGlzX2xvY2FsKGludCBGRCwgYm9vbCAmcmVzdWx0KTsKKworLy8vIEBicmllZiBTaW1wbGVyIHZlcnNpb24gb2YgaXNfbG9jYWwgZm9yIGNsaWVudHMgdGhhdCBkb24ndCBuZWVkIHRvCisvLy8gICAgICAgIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhbiBlcnJvciBhbmQgZmFsc2UuCitpbmxpbmUgYm9vbCBpc19sb2NhbChjb25zdCBUd2luZSAmUGF0aCkgeworICBib29sIFJlc3VsdDsKKyAgcmV0dXJuICFpc19sb2NhbChQYXRoLCBSZXN1bHQpICYmIFJlc3VsdDsKK30KKworLy8vIEBicmllZiBTaW1wbGVyIHZlcnNpb24gb2YgaXNfbG9jYWwgYWNjZXB0aW5nIGFuIG9wZW4gZmlsZSBkZXNjcmlwdG9yIGZvcgorLy8vICAgICAgICBjbGllbnRzIHRoYXQgZG9uJ3QgbmVlZCB0byBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYW4gZXJyb3IgYW5kIGZhbHNlLgoraW5saW5lIGJvb2wgaXNfbG9jYWwoaW50IEZEKSB7CisgIGJvb2wgUmVzdWx0OworICByZXR1cm4gIWlzX2xvY2FsKEZELCBSZXN1bHQpICYmIFJlc3VsdDsKK30KKworLy8vIEBicmllZiBEb2VzIHN0YXR1cyByZXByZXNlbnQgYSBkaXJlY3Rvcnk/CisvLy8KKy8vLyBAcGFyYW0gUGF0aCBUaGUgcGF0aCB0byBnZXQgdGhlIHR5cGUgb2YuCisvLy8gQHBhcmFtIEZvbGxvdyBGb3Igc3ltYm9saWMgbGlua3MsIGluZGljYXRlcyB3aGV0aGVyIHRvIHJldHVybiB0aGUgZmlsZSB0eXBlCisvLy8gICAgICAgICAgICAgICBvZiB0aGUgbGluayBpdHNlbGYsIG9yIG9mIHRoZSB0YXJnZXQuCisvLy8gQHJldHVybnMgQSB2YWx1ZSBmcm9tIHRoZSBmaWxlX3R5cGUgZW51bWVyYXRpb24gaW5kaWNhdGluZyB0aGUgdHlwZSBvZiBmaWxlLgorZmlsZV90eXBlIGdldF9maWxlX3R5cGUoY29uc3QgVHdpbmUgJlBhdGgsIGJvb2wgRm9sbG93ID0gdHJ1ZSk7CisKKy8vLyBAYnJpZWYgRG9lcyBzdGF0dXMgcmVwcmVzZW50IGEgZGlyZWN0b3J5PworLy8vCisvLy8gQHBhcmFtIHN0YXR1cyBBIGJhc2ljX2ZpbGVfc3RhdHVzIHByZXZpb3VzbHkgcmV0dXJuZWQgZnJvbSBzdGF0dXMuCisvLy8gQHJldHVybnMgc3RhdHVzLnR5cGUoKSA9PSBmaWxlX3R5cGU6OmRpcmVjdG9yeV9maWxlLgorYm9vbCBpc19kaXJlY3RvcnkoY29uc3QgYmFzaWNfZmlsZV9zdGF0dXMgJnN0YXR1cyk7CisKKy8vLyBAYnJpZWYgSXMgcGF0aCBhIGRpcmVjdG9yeT8KKy8vLworLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHBhcmFtIHJlc3VsdCBTZXQgdG8gdHJ1ZSBpZiBcYSBwYXRoIGlzIGEgZGlyZWN0b3J5IChhZnRlciBmb2xsb3dpbmcKKy8vLyAgICAgICAgICAgICAgIHN5bWxpbmtzLCBmYWxzZSBpZiBpdCBpcyBub3QuIFVuZGVmaW5lZCBvdGhlcndpc2UuCisvLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiByZXN1bHQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNldCwgb3RoZXJ3aXNlIGEKKy8vLyAgICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvcl9jb2RlLgorc3RkOjplcnJvcl9jb2RlIGlzX2RpcmVjdG9yeShjb25zdCBUd2luZSAmcGF0aCwgYm9vbCAmcmVzdWx0KTsKKworLy8vIEBicmllZiBTaW1wbGVyIHZlcnNpb24gb2YgaXNfZGlyZWN0b3J5IGZvciBjbGllbnRzIHRoYXQgZG9uJ3QgbmVlZCB0bworLy8vICAgICAgICBkaWZmZXJlbnRpYXRlIGJldHdlZW4gYW4gZXJyb3IgYW5kIGZhbHNlLgoraW5saW5lIGJvb2wgaXNfZGlyZWN0b3J5KGNvbnN0IFR3aW5lICZQYXRoKSB7CisgIGJvb2wgUmVzdWx0OworICByZXR1cm4gIWlzX2RpcmVjdG9yeShQYXRoLCBSZXN1bHQpICYmIFJlc3VsdDsKK30KKworLy8vIEBicmllZiBEb2VzIHN0YXR1cyByZXByZXNlbnQgYSByZWd1bGFyIGZpbGU/CisvLy8KKy8vLyBAcGFyYW0gc3RhdHVzIEEgYmFzaWNfZmlsZV9zdGF0dXMgcHJldmlvdXNseSByZXR1cm5lZCBmcm9tIHN0YXR1cy4KKy8vLyBAcmV0dXJucyBzdGF0dXNfa25vd24oc3RhdHVzKSAmJiBzdGF0dXMudHlwZSgpID09IGZpbGVfdHlwZTo6cmVndWxhcl9maWxlLgorYm9vbCBpc19yZWd1bGFyX2ZpbGUoY29uc3QgYmFzaWNfZmlsZV9zdGF0dXMgJnN0YXR1cyk7CisKKy8vLyBAYnJpZWYgSXMgcGF0aCBhIHJlZ3VsYXIgZmlsZT8KKy8vLworLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHBhcmFtIHJlc3VsdCBTZXQgdG8gdHJ1ZSBpZiBcYSBwYXRoIGlzIGEgcmVndWxhciBmaWxlIChhZnRlciBmb2xsb3dpbmcKKy8vLyAgICAgICAgICAgICAgIHN5bWxpbmtzKSwgZmFsc2UgaWYgaXQgaXMgbm90LiBVbmRlZmluZWQgb3RoZXJ3aXNlLgorLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgcmVzdWx0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzZXQsIG90aGVyd2lzZSBhCisvLy8gICAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3JfY29kZS4KK3N0ZDo6ZXJyb3JfY29kZSBpc19yZWd1bGFyX2ZpbGUoY29uc3QgVHdpbmUgJnBhdGgsIGJvb2wgJnJlc3VsdCk7CisKKy8vLyBAYnJpZWYgU2ltcGxlciB2ZXJzaW9uIG9mIGlzX3JlZ3VsYXJfZmlsZSBmb3IgY2xpZW50cyB0aGF0IGRvbid0IG5lZWQgdG8KKy8vLyAgICAgICAgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGFuIGVycm9yIGFuZCBmYWxzZS4KK2lubGluZSBib29sIGlzX3JlZ3VsYXJfZmlsZShjb25zdCBUd2luZSAmUGF0aCkgeworICBib29sIFJlc3VsdDsKKyAgaWYgKGlzX3JlZ3VsYXJfZmlsZShQYXRoLCBSZXN1bHQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworLy8vIEBicmllZiBEb2VzIHN0YXR1cyByZXByZXNlbnQgYSBzeW1saW5rIGZpbGU/CisvLy8KKy8vLyBAcGFyYW0gc3RhdHVzIEEgYmFzaWNfZmlsZV9zdGF0dXMgcHJldmlvdXNseSByZXR1cm5lZCBmcm9tIHN0YXR1cy4KKy8vLyBAcmV0dXJucyBzdGF0dXNfa25vd24oc3RhdHVzKSAmJiBzdGF0dXMudHlwZSgpID09IGZpbGVfdHlwZTo6c3ltbGlua19maWxlLgorYm9vbCBpc19zeW1saW5rX2ZpbGUoY29uc3QgYmFzaWNfZmlsZV9zdGF0dXMgJnN0YXR1cyk7CisKKy8vLyBAYnJpZWYgSXMgcGF0aCBhIHN5bWxpbmsgZmlsZT8KKy8vLworLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHBhcmFtIHJlc3VsdCBTZXQgdG8gdHJ1ZSBpZiBcYSBwYXRoIGlzIGEgc3ltbGluayBmaWxlLCBmYWxzZSBpZiBpdCBpcyBub3QuCisvLy8gICAgICAgICAgICAgICBVbmRlZmluZWQgb3RoZXJ3aXNlLgorLy8vIEByZXR1cm5zIGVycmM6OnN1Y2Nlc3MgaWYgcmVzdWx0IGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzZXQsIG90aGVyd2lzZSBhCisvLy8gICAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3JfY29kZS4KK3N0ZDo6ZXJyb3JfY29kZSBpc19zeW1saW5rX2ZpbGUoY29uc3QgVHdpbmUgJnBhdGgsIGJvb2wgJnJlc3VsdCk7CisKKy8vLyBAYnJpZWYgU2ltcGxlciB2ZXJzaW9uIG9mIGlzX3N5bWxpbmtfZmlsZSBmb3IgY2xpZW50cyB0aGF0IGRvbid0IG5lZWQgdG8KKy8vLyAgICAgICAgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGFuIGVycm9yIGFuZCBmYWxzZS4KK2lubGluZSBib29sIGlzX3N5bWxpbmtfZmlsZShjb25zdCBUd2luZSAmUGF0aCkgeworICBib29sIFJlc3VsdDsKKyAgaWYgKGlzX3N5bWxpbmtfZmlsZShQYXRoLCBSZXN1bHQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIFJlc3VsdDsKK30KKworLy8vIEBicmllZiBEb2VzIHRoaXMgc3RhdHVzIHJlcHJlc2VudCBzb21ldGhpbmcgdGhhdCBleGlzdHMgYnV0IGlzIG5vdCBhCisvLy8gICAgICAgIGRpcmVjdG9yeSBvciByZWd1bGFyIGZpbGU/CisvLy8KKy8vLyBAcGFyYW0gc3RhdHVzIEEgYmFzaWNfZmlsZV9zdGF0dXMgcHJldmlvdXNseSByZXR1cm5lZCBmcm9tIHN0YXR1cy4KKy8vLyBAcmV0dXJucyBleGlzdHMocykgJiYgIWlzX3JlZ3VsYXJfZmlsZShzKSAmJiAhaXNfZGlyZWN0b3J5KHMpCitib29sIGlzX290aGVyKGNvbnN0IGJhc2ljX2ZpbGVfc3RhdHVzICZzdGF0dXMpOworCisvLy8gQGJyaWVmIElzIHBhdGggc29tZXRoaW5nIHRoYXQgZXhpc3RzIGJ1dCBpcyBub3QgYSBkaXJlY3RvcnksCisvLy8gICAgICAgIHJlZ3VsYXIgZmlsZSwgb3Igc3ltbGluaz8KKy8vLworLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHBhcmFtIHJlc3VsdCBTZXQgdG8gdHJ1ZSBpZiBcYSBwYXRoIGV4aXN0cywgYnV0IGlzIG5vdCBhIGRpcmVjdG9yeSwgcmVndWxhcgorLy8vICAgICAgICAgICAgICAgZmlsZSwgb3IgYSBzeW1saW5rLCBmYWxzZSBpZiBpdCBkb2VzIG5vdC4gVW5kZWZpbmVkIG90aGVyd2lzZS4KKy8vLyBAcmV0dXJucyBlcnJjOjpzdWNjZXNzIGlmIHJlc3VsdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc2V0LCBvdGhlcndpc2UgYQorLy8vICAgICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIGVycm9yX2NvZGUuCitzdGQ6OmVycm9yX2NvZGUgaXNfb3RoZXIoY29uc3QgVHdpbmUgJnBhdGgsIGJvb2wgJnJlc3VsdCk7CisKKy8vLyBAYnJpZWYgR2V0IGZpbGUgc3RhdHVzIGFzIGlmIGJ5IFBPU0lYIHN0YXQoKS4KKy8vLworLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHBhcmFtIHJlc3VsdCBTZXQgdG8gdGhlIGZpbGUgc3RhdHVzLgorLy8vIEBwYXJhbSBmb2xsb3cgV2hlbiB0cnVlLCBmb2xsb3dzIHN5bWxpbmtzLiAgT3RoZXJ3aXNlLCB0aGUgc3ltbGluayBpdHNlbGYgaXMKKy8vLyAgICAgICAgICAgICAgIHN0YXR0ZWQuCisvLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiByZXN1bHQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNldCwgb3RoZXJ3aXNlIGEKKy8vLyAgICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvcl9jb2RlLgorc3RkOjplcnJvcl9jb2RlIHN0YXR1cyhjb25zdCBUd2luZSAmcGF0aCwgZmlsZV9zdGF0dXMgJnJlc3VsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb2xsb3cgPSB0cnVlKTsKKworLy8vIEBicmllZiBBIHZlcnNpb24gZm9yIHdoZW4gYSBmaWxlIGRlc2NyaXB0b3IgaXMgYWxyZWFkeSBhdmFpbGFibGUuCitzdGQ6OmVycm9yX2NvZGUgc3RhdHVzKGludCBGRCwgZmlsZV9zdGF0dXMgJlJlc3VsdCk7CisKKy8vLyBAYnJpZWYgU2V0IGZpbGUgcGVybWlzc2lvbnMuCisvLy8KKy8vLyBAcGFyYW0gUGF0aCBGaWxlIHRvIHNldCBwZXJtaXNzaW9ucyBvbi4KKy8vLyBAcGFyYW0gUGVybWlzc2lvbnMgTmV3IGZpbGUgcGVybWlzc2lvbnMuCisvLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiB0aGUgcGVybWlzc2lvbnMgd2VyZSBzdWNjZXNzZnVsbHkgc2V0LCBvdGhlcndpc2UKKy8vLyAgICAgICAgICBhIHBsYXRmb3JtLXNwZWNpZmljIGVycm9yX2NvZGUuCisvLy8gQG5vdGUgT24gV2luZG93cywgYWxsIHBlcm1pc3Npb25zIGV4Y2VwdCAqX3dyaXRlIGFyZSBpZ25vcmVkLiBVc2luZyBhbnkgb2YKKy8vLyAgICAgICBvd25lcl93cml0ZSwgZ3JvdXBfd3JpdGUsIG9yIGFsbF93cml0ZSB3aWxsIG1ha2UgdGhlIGZpbGUgd3JpdGFibGUuCisvLy8gICAgICAgT3RoZXJ3aXNlLCB0aGUgZmlsZSB3aWxsIGJlIG1hcmtlZCBhcyByZWFkLW9ubHkuCitzdGQ6OmVycm9yX2NvZGUgc2V0UGVybWlzc2lvbnMoY29uc3QgVHdpbmUgJlBhdGgsIHBlcm1zIFBlcm1pc3Npb25zKTsKKworLy8vIEBicmllZiBHZXQgZmlsZSBwZXJtaXNzaW9ucy4KKy8vLworLy8vIEBwYXJhbSBQYXRoIEZpbGUgdG8gZ2V0IHBlcm1pc3Npb25zIGZyb20uCisvLy8gQHJldHVybnMgdGhlIHBlcm1pc3Npb25zIGlmIHRoZXkgd2VyZSBzdWNjZXNzZnVsbHkgcmV0cmlldmVkLCBvdGhlcndpc2UgYQorLy8vICAgICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIGVycm9yX2NvZGUuCisvLy8gQG5vdGUgT24gV2luZG93cywgaWYgdGhlIGZpbGUgZG9lcyBub3QgaGF2ZSB0aGUgRklMRV9BVFRSSUJVVEVfUkVBRE9OTFkKKy8vLyAgICAgICBhdHRyaWJ1dGUsIGFsbF9hbGwgd2lsbCBiZSByZXR1cm5lZC4gT3RoZXJ3aXNlLCBhbGxfcmVhZCB8IGFsbF9leGUKKy8vLyAgICAgICB3aWxsIGJlIHJldHVybmVkLgorRXJyb3JPcjxwZXJtcz4gZ2V0UGVybWlzc2lvbnMoY29uc3QgVHdpbmUgJlBhdGgpOworCisvLy8gQGJyaWVmIEdldCBmaWxlIHNpemUuCisvLy8KKy8vLyBAcGFyYW0gUGF0aCBJbnB1dCBwYXRoLgorLy8vIEBwYXJhbSBSZXN1bHQgU2V0IHRvIHRoZSBzaXplIG9mIHRoZSBmaWxlIGluIFxhIFBhdGguCisvLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiByZXN1bHQgaGFzIGJlZW4gc3VjY2Vzc2Z1bGx5IHNldCwgb3RoZXJ3aXNlIGEKKy8vLyAgICAgICAgICBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvcl9jb2RlLgoraW5saW5lIHN0ZDo6ZXJyb3JfY29kZSBmaWxlX3NpemUoY29uc3QgVHdpbmUgJlBhdGgsIHVpbnQ2NF90ICZSZXN1bHQpIHsKKyAgZmlsZV9zdGF0dXMgU3RhdHVzOworICBzdGQ6OmVycm9yX2NvZGUgRUMgPSBzdGF0dXMoUGF0aCwgU3RhdHVzKTsKKyAgaWYgKEVDKQorICAgIHJldHVybiBFQzsKKyAgUmVzdWx0ID0gU3RhdHVzLmdldFNpemUoKTsKKyAgcmV0dXJuIHN0ZDo6ZXJyb3JfY29kZSgpOworfQorCisvLy8gQGJyaWVmIFNldCB0aGUgZmlsZSBtb2RpZmljYXRpb24gYW5kIGFjY2VzcyB0aW1lLgorLy8vCisvLy8gQHJldHVybnMgZXJyYzo6c3VjY2VzcyBpZiB0aGUgZmlsZSB0aW1lcyB3ZXJlIHN1Y2Nlc3NmdWxseSBzZXQsIG90aGVyd2lzZSBhCisvLy8gICAgICAgICAgcGxhdGZvcm0tc3BlY2lmaWMgZXJyb3JfY29kZSBvciBlcnJjOjpmdW5jdGlvbl9ub3Rfc3VwcG9ydGVkIG9uCisvLy8gICAgICAgICAgcGxhdGZvcm1zIHdoZXJlIHRoZSBmdW5jdGlvbmFsaXR5IGlzbid0IGF2YWlsYWJsZS4KK3N0ZDo6ZXJyb3JfY29kZSBzZXRMYXN0TW9kaWZpY2F0aW9uQW5kQWNjZXNzVGltZShpbnQgRkQsIFRpbWVQb2ludDw+IFRpbWUpOworCisvLy8gQGJyaWVmIElzIHN0YXR1cyBhdmFpbGFibGU/CisvLy8KKy8vLyBAcGFyYW0gcyBJbnB1dCBmaWxlIHN0YXR1cy4KKy8vLyBAcmV0dXJucyBUcnVlIGlmIHN0YXR1cygpICE9IHN0YXR1c19lcnJvci4KK2Jvb2wgc3RhdHVzX2tub3duKGNvbnN0IGJhc2ljX2ZpbGVfc3RhdHVzICZzKTsKKworLy8vIEBicmllZiBJcyBzdGF0dXMgYXZhaWxhYmxlPworLy8vCisvLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcGFyYW0gcmVzdWx0IFNldCB0byB0cnVlIGlmIHN0YXR1cygpICE9IHN0YXR1c19lcnJvci4KKy8vLyBAcmV0dXJucyBlcnJjOjpzdWNjZXNzIGlmIHJlc3VsdCBoYXMgYmVlbiBzdWNjZXNzZnVsbHkgc2V0LCBvdGhlcndpc2UgYQorLy8vICAgICAgICAgIHBsYXRmb3JtLXNwZWNpZmljIGVycm9yX2NvZGUuCitzdGQ6OmVycm9yX2NvZGUgc3RhdHVzX2tub3duKGNvbnN0IFR3aW5lICZwYXRoLCBib29sICZyZXN1bHQpOworCitlbnVtIE9wZW5GbGFncyA6IHVuc2lnbmVkIHsKKyAgRl9Ob25lID0gMCwKKworICAvLy8gRl9FeGNsIC0gV2hlbiBvcGVuaW5nIGEgZmlsZSwgdGhpcyBmbGFnIG1ha2VzIHJhd19mZF9vc3RyZWFtCisgIC8vLyByZXBvcnQgYW4gZXJyb3IgaWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMuCisgIEZfRXhjbCA9IDEsCisKKyAgLy8vIEZfQXBwZW5kIC0gV2hlbiBvcGVuaW5nIGEgZmlsZSwgaWYgaXQgYWxyZWFkeSBleGlzdHMgYXBwZW5kIHRvIHRoZQorICAvLy8gZXhpc3RpbmcgZmlsZSBpbnN0ZWFkIG9mIHJldHVybmluZyBhbiBlcnJvci4gIFRoaXMgbWF5IG5vdCBiZSBzcGVjaWZpZWQKKyAgLy8vIHdpdGggRl9FeGNsLgorICBGX0FwcGVuZCA9IDIsCisKKyAgLy8vIEZfTm9UcnVuYyAtIFdoZW4gb3BlbmluZyBhIGZpbGUsIGlmIGl0IGFscmVhZHkgZXhpc3RzIGRvbid0IHRydW5jYXRlCisgIC8vLyB0aGUgZmlsZSBjb250ZW50cy4gIEZfQXBwZW5kIGltcGxpZXMgRl9Ob1RydW5jLCBidXQgRl9BcHBlbmQgc2Vla3MgdG8KKyAgLy8vIHRoZSBlbmQgb2YgdGhlIGZpbGUsIHdoaWNoIEZfTm9UcnVuYyBkb2Vzbid0LgorICBGX05vVHJ1bmMgPSA0LAorCisgIC8vLyBUaGUgZmlsZSBzaG91bGQgYmUgb3BlbmVkIGluIHRleHQgbW9kZSBvbiBwbGF0Zm9ybXMgdGhhdCBtYWtlIHRoaXMKKyAgLy8vIGRpc3RpbmN0aW9uLgorICBGX1RleHQgPSA4LAorCisgIC8vLyBPcGVuIHRoZSBmaWxlIGZvciByZWFkIGFuZCB3cml0ZS4KKyAgRl9SVyA9IDE2LAorCisgIC8vLyBEZWxldGUgdGhlIGZpbGUgb24gY2xvc2UuIE9ubHkgbWFrZXMgYSBkaWZmZXJlbmNlIG9uIHdpbmRvd3MuCisgIEZfRGVsZXRlID0gMzIKK307CisKKy8vLyBAYnJpZWYgQ3JlYXRlIGEgdW5pcXVlbHkgbmFtZWQgZmlsZS4KKy8vLworLy8vIEdlbmVyYXRlcyBhIHVuaXF1ZSBwYXRoIHN1aXRhYmxlIGZvciBhIHRlbXBvcmFyeSBmaWxlIGFuZCB0aGVuIG9wZW5zIGl0IGFzIGEKKy8vLyBmaWxlLiBUaGUgbmFtZSBpcyBiYXNlZCBvbiBcYSBtb2RlbCB3aXRoICclJyByZXBsYWNlZCBieSBhIHJhbmRvbSBjaGFyIGluCisvLy8gWzAtOWEtZl0uIElmIFxhIG1vZGVsIGlzIG5vdCBhbiBhYnNvbHV0ZSBwYXRoLCB0aGUgdGVtcG9yYXJ5IGZpbGUgd2lsbCBiZQorLy8vIGNyZWF0ZWQgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgorLy8vCisvLy8gRXhhbXBsZTogY2xhbmctJSUtJSUtJSUtJSUtJSUucyA9PiBjbGFuZy1hMC1iMS1jMi1kMy1lNC5zCisvLy8KKy8vLyBUaGlzIGlzIGFuIGF0b21pYyBvcGVyYXRpb24uIEVpdGhlciB0aGUgZmlsZSBpcyBjcmVhdGVkIGFuZCBvcGVuZWQsIG9yIHRoZQorLy8vIGZpbGUgc3lzdGVtIGlzIGxlZnQgdW50b3VjaGVkLgorLy8vCisvLy8gVGhlIGludGVuZGVkIHVzZSBpcyBmb3IgZmlsZXMgdGhhdCBhcmUgdG8gYmUga2VwdCwgcG9zc2libHkgYWZ0ZXIKKy8vLyByZW5hbWluZyB0aGVtLiBGb3IgZXhhbXBsZSwgd2hlbiBydW5uaW5nICdjbGFuZyAtYyBmb28ubycsIHRoZSBmaWxlIGNhbgorLy8vIGJlIGZpcnN0IGNyZWF0ZWQgYXMgZm9vLWFiYzEyMy5vIGFuZCB0aGVuIHJlbmFtZWQuCisvLy8KKy8vLyBAcGFyYW0gTW9kZWwgTmFtZSB0byBiYXNlIHVuaXF1ZSBwYXRoIG9mZiBvZi4KKy8vLyBAcGFyYW0gUmVzdWx0RkQgU2V0IHRvIHRoZSBvcGVuZWQgZmlsZSdzIGZpbGUgZGVzY3JpcHRvci4KKy8vLyBAcGFyYW0gUmVzdWx0UGF0aCBTZXQgdG8gdGhlIG9wZW5lZCBmaWxlJ3MgYWJzb2x1dGUgcGF0aC4KKy8vLyBAcmV0dXJucyBlcnJjOjpzdWNjZXNzIGlmIFJlc3VsdHtGRCxQYXRofSBoYXZlIGJlZW4gc3VjY2Vzc2Z1bGx5IHNldCwKKy8vLyAgICAgICAgICBvdGhlcndpc2UgYSBwbGF0Zm9ybS1zcGVjaWZpYyBlcnJvcl9jb2RlLgorc3RkOjplcnJvcl9jb2RlIGNyZWF0ZVVuaXF1ZUZpbGUoY29uc3QgVHdpbmUgJk1vZGVsLCBpbnQgJlJlc3VsdEZELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZSZXN1bHRQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTW9kZSA9IGFsbF9yZWFkIHwgYWxsX3dyaXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzOjpmczo6T3BlbkZsYWdzIEZsYWdzID0gc3lzOjpmczo6Rl9SVyk7CisKKy8vLyBAYnJpZWYgU2ltcGxlciB2ZXJzaW9uIGZvciBjbGllbnRzIHRoYXQgZG9uJ3Qgd2FudCBhbiBvcGVuIGZpbGUuIEFuIGVtcHR5CisvLy8gZmlsZSB3aWxsIHN0aWxsIGJlIGNyZWF0ZWQuCitzdGQ6OmVycm9yX2NvZGUgY3JlYXRlVW5pcXVlRmlsZShjb25zdCBUd2luZSAmTW9kZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlJlc3VsdFBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNb2RlID0gYWxsX3JlYWQgfCBhbGxfd3JpdGUpOworCisvLy8gUmVwcmVzZW50cyBhIHRlbXBvcmFyeSBmaWxlLgorLy8vCisvLy8gVGhlIHRlbXBvcmFyeSBmaWxlIG11c3QgYmUgZXZlbnR1YWxseSBkaXNjYXJkZWQgb3IgZ2l2ZW4gYSBmaW5hbCBuYW1lIGFuZAorLy8vIGtlcHQuCisvLy8KKy8vLyBUaGUgZGVzdHJ1Y3RvciBkb2Vzbid0IGltcGxpY2l0bHkgZGlzY2FyZCBiZWNhdXNlIHRoZXJlIGlzIG5vIHdheSB0bworLy8vIHByb3Blcmx5IGhhbmRsZSBlcnJvcnMgaW4gYSBkZXN0cnVjdG9yLgorY2xhc3MgVGVtcEZpbGUgeworICBib29sIERvbmUgPSBmYWxzZTsKKyAgVGVtcEZpbGUoU3RyaW5nUmVmIE5hbWUsIGludCBGRCk7CisKK3B1YmxpYzoKKyAgLy8vIFRoaXMgY3JlYXRlcyBhIHRlbXBvcmFyeSBmaWxlIHdpdGggY3JlYXRlVW5pcXVlRmlsZSBhbmQgc2NoZWR1bGVzIGl0IGZvcgorICAvLy8gZGVsZXRpb24gd2l0aCBzeXM6OlJlbW92ZUZpbGVPblNpZ25hbC4KKyAgc3RhdGljIEV4cGVjdGVkPFRlbXBGaWxlPiBjcmVhdGUoY29uc3QgVHdpbmUgJk1vZGVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNb2RlID0gYWxsX3JlYWQgfCBhbGxfd3JpdGUpOworICBUZW1wRmlsZShUZW1wRmlsZSAmJk90aGVyKTsKKyAgVGVtcEZpbGUgJm9wZXJhdG9yPShUZW1wRmlsZSAmJk90aGVyKTsKKworICAvLyBOYW1lIG9mIHRoZSB0ZW1wb3JhcnkgZmlsZS4KKyAgc3RkOjpzdHJpbmcgVG1wTmFtZTsKKworICAvLyBUaGUgb3BlbiBmaWxlIGRlc2NyaXB0b3IuCisgIGludCBGRCA9IC0xOworCisgIC8vIEtlZXAgdGhpcyB3aXRoIHRoZSBnaXZlbiBuYW1lLgorICBFcnJvciBrZWVwKGNvbnN0IFR3aW5lICZOYW1lKTsKKworICAvLyBLZWVwIHRoaXMgd2l0aCB0aGUgdGVtcG9yYXJ5IG5hbWUuCisgIEVycm9yIGtlZXAoKTsKKworICAvLyBEZWxldGUgdGhlIGZpbGUuCisgIEVycm9yIGRpc2NhcmQoKTsKKworICAvLyBUaGlzIGNoZWNrcyB0aGF0IGtlZXAgb3IgZGVsZXRlIHdhcyBjYWxsZWQuCisgIH5UZW1wRmlsZSgpOworfTsKKworLy8vIEBicmllZiBDcmVhdGUgYSBmaWxlIGluIHRoZSBzeXN0ZW0gdGVtcG9yYXJ5IGRpcmVjdG9yeS4KKy8vLworLy8vIFRoZSBmaWxlbmFtZSBpcyBvZiB0aGUgZm9ybSBwcmVmaXgtcmFuZG9tX2NoYXJzLnN1ZmZpeC4gU2luY2UgdGhlIGRpcmVjdG9yeQorLy8vIGlzIG5vdCBrbm93IHRvIHRoZSBjYWxsZXIsIFByZWZpeCBhbmQgU3VmZml4IGNhbm5vdCBoYXZlIHBhdGggc2VwYXJhdG9ycy4KKy8vLyBUaGUgZmlsZXMgYXJlIGNyZWF0ZWQgd2l0aCBtb2RlIDA2MDAuCisvLy8KKy8vLyBUaGlzIHNob3VsZCBiZSB1c2VkIGZvciB0aGluZ3MgbGlrZSBhIHRlbXBvcmFyeSAucyB0aGF0IGlzIHJlbW92ZWQgYWZ0ZXIKKy8vLyBydW5uaW5nIHRoZSBhc3NlbWJsZXIuCitzdGQ6OmVycm9yX2NvZGUgY3JlYXRlVGVtcG9yYXJ5RmlsZShjb25zdCBUd2luZSAmUHJlZml4LCBTdHJpbmdSZWYgU3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICZSZXN1bHRGRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzdWx0UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5czo6ZnM6Ok9wZW5GbGFncyBGbGFncyA9IHN5czo6ZnM6OkZfUlcpOworCisvLy8gQGJyaWVmIFNpbXBsZXIgdmVyc2lvbiBmb3IgY2xpZW50cyB0aGF0IGRvbid0IHdhbnQgYW4gb3BlbiBmaWxlLiBBbiBlbXB0eQorLy8vIGZpbGUgd2lsbCBzdGlsbCBiZSBjcmVhdGVkLgorc3RkOjplcnJvcl9jb2RlIGNyZWF0ZVRlbXBvcmFyeUZpbGUoY29uc3QgVHdpbmUgJlByZWZpeCwgU3RyaW5nUmVmIFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzdWx0UGF0aCk7CisKK3N0ZDo6ZXJyb3JfY29kZSBjcmVhdGVVbmlxdWVEaXJlY3RvcnkoY29uc3QgVHdpbmUgJlByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZSZXN1bHRQYXRoKTsKKworLy8vIEBicmllZiBHZXQgYSB1bmlxdWUgbmFtZSwgbm90IGN1cnJlbnRseSBleGlzaXRpbmcgaW4gdGhlIGZpbGVzeXN0ZW0uIFN1YmplY3QKKy8vLyB0byByYWNlIGNvbmRpdGlvbnMsIHByZWZlciB0byB1c2UgY3JlYXRlVW5pcXVlRmlsZSBpbnN0ZWFkLgorLy8vCisvLy8gU2ltaWxhciB0byBjcmVhdGVVbmlxdWVGaWxlLCBidXQgaW5zdGVhZCBvZiBjcmVhdGluZyBhIGZpbGUgb25seQorLy8vIGNoZWNrcyBpZiBpdCBleGlzdHMuIFRoaXMgZnVuY3Rpb24gaXMgc3ViamVjdCB0byByYWNlIGNvbmRpdGlvbnMsIGlmIHlvdQorLy8vIHdhbnQgdG8gdXNlIHRoZSByZXR1cm5lZCBuYW1lIHRvIGFjdHVhbGx5IGNyZWF0ZSBhIGZpbGUsIHVzZQorLy8vIGNyZWF0ZVVuaXF1ZUZpbGUgaW5zdGVhZC4KK3N0ZDo6ZXJyb3JfY29kZSBnZXRQb3RlbnRpYWxseVVuaXF1ZUZpbGVOYW1lKGNvbnN0IFR3aW5lICZNb2RlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzdWx0UGF0aCk7CisKKy8vLyBAYnJpZWYgR2V0IGEgdW5pcXVlIHRlbXBvcmFyeSBmaWxlIG5hbWUsIG5vdCBjdXJyZW50bHkgZXhpc2l0aW5nIGluIHRoZQorLy8vIGZpbGVzeXN0ZW0uIFN1YmplY3QgdG8gcmFjZSBjb25kaXRpb25zLCBwcmVmZXIgdG8gdXNlIGNyZWF0ZVRlbXBvcmFyeUZpbGUKKy8vLyBpbnN0ZWFkLgorLy8vCisvLy8gU2ltaWxhciB0byBjcmVhdGVUZW1wb3JhcnlGaWxlLCBidXQgaW5zdGVhZCBvZiBjcmVhdGluZyBhIGZpbGUgb25seQorLy8vIGNoZWNrcyBpZiBpdCBleGlzdHMuIFRoaXMgZnVuY3Rpb24gaXMgc3ViamVjdCB0byByYWNlIGNvbmRpdGlvbnMsIGlmIHlvdQorLy8vIHdhbnQgdG8gdXNlIHRoZSByZXR1cm5lZCBuYW1lIHRvIGFjdHVhbGx5IGNyZWF0ZSBhIGZpbGUsIHVzZQorLy8vIGNyZWF0ZVRlbXBvcmFyeUZpbGUgaW5zdGVhZC4KK3N0ZDo6ZXJyb3JfY29kZQorZ2V0UG90ZW50aWFsbHlVbmlxdWVUZW1wRmlsZU5hbWUoY29uc3QgVHdpbmUgJlByZWZpeCwgU3RyaW5nUmVmIFN1ZmZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmUmVzdWx0UGF0aCk7CisKK2lubGluZSBPcGVuRmxhZ3Mgb3BlcmF0b3J8KE9wZW5GbGFncyBBLCBPcGVuRmxhZ3MgQikgeworICByZXR1cm4gT3BlbkZsYWdzKHVuc2lnbmVkKEEpIHwgdW5zaWduZWQoQikpOworfQorCitpbmxpbmUgT3BlbkZsYWdzICZvcGVyYXRvcnw9KE9wZW5GbGFncyAmQSwgT3BlbkZsYWdzIEIpIHsKKyAgQSA9IEEgfCBCOworICByZXR1cm4gQTsKK30KKworc3RkOjplcnJvcl9jb2RlIG9wZW5GaWxlRm9yV3JpdGUoY29uc3QgVHdpbmUgJk5hbWUsIGludCAmUmVzdWx0RkQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVuRmxhZ3MgRmxhZ3MsIHVuc2lnbmVkIE1vZGUgPSAwNjY2KTsKKworc3RkOjplcnJvcl9jb2RlIG9wZW5GaWxlRm9yUmVhZChjb25zdCBUd2luZSAmTmFtZSwgaW50ICZSZXN1bHRGRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICpSZWFsUGF0aCA9IG51bGxwdHIpOworCitzdGQ6OmVycm9yX2NvZGUgZ2V0VW5pcXVlSUQoY29uc3QgVHdpbmUgUGF0aCwgVW5pcXVlSUQgJlJlc3VsdCk7CisKKy8vLyBAYnJpZWYgR2V0IGRpc2sgc3BhY2UgdXNhZ2UgaW5mb3JtYXRpb24uCisvLy8KKy8vLyBOb3RlOiBVc2VycyBtdXN0IGJlIGNhcmVmdWwgYWJvdXQgIlRpbWUgT2YgQ2hlY2ssIFRpbWUgT2YgVXNlIiBraW5kIG9mIGJ1Zy4KKy8vLyBOb3RlOiBXaW5kb3dzIHJlcG9ydHMgcmVzdWx0cyBhY2NvcmRpbmcgdG8gdGhlIHF1b3RhIGFsbG9jYXRlZCB0byB0aGUgdXNlci4KKy8vLworLy8vIEBwYXJhbSBQYXRoIElucHV0IHBhdGguCisvLy8gQHJldHVybnMgYSBzcGFjZV9pbmZvIHN0cnVjdHVyZSBmaWxsZWQgd2l0aCB0aGUgY2FwYWNpdHksIGZyZWUsIGFuZAorLy8vIGF2YWlsYWJsZSBzcGFjZSBvbiB0aGUgZGV2aWNlIFxhIFBhdGggaXMgb24uIEEgcGxhdGZvcm0gc3BlY2lmaWMgZXJyb3JfY29kZQorLy8vIGlzIHJldHVybmVkIG9uIGVycm9yLgorRXJyb3JPcjxzcGFjZV9pbmZvPiBkaXNrX3NwYWNlKGNvbnN0IFR3aW5lICZQYXRoKTsKKworLy8vIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBhIG1lbW9yeSBtYXBwZWQgZmlsZS4gSXQgaXMgYmFzZWQgb24KKy8vLyBib29zdDo6aW9zdHJlYW1zOjptYXBwZWRfZmlsZS4KK2NsYXNzIG1hcHBlZF9maWxlX3JlZ2lvbiB7CitwdWJsaWM6CisgIGVudW0gbWFwbW9kZSB7CisgICAgcmVhZG9ubHksIC8vLzwgTWF5IG9ubHkgYWNjZXNzIG1hcCB2aWEgY29uc3RfZGF0YSBhcyByZWFkIG9ubHkuCisgICAgcmVhZHdyaXRlLCAvLy88IE1heSBhY2Nlc3MgbWFwIHZpYSBkYXRhIGFuZCBtb2RpZnkgaXQuIFdyaXR0ZW4gdG8gcGF0aC4KKyAgICBwcml2IC8vLzwgTWF5IG1vZGlmeSB2aWEgZGF0YSwgYnV0IGNoYW5nZXMgYXJlIGxvc3Qgb24gZGVzdHJ1Y3Rpb24uCisgIH07CisKK3ByaXZhdGU6CisgIC8vLyBQbGF0Zm9ybS1zcGVjaWZpYyBtYXBwaW5nIHN0YXRlLgorICBzaXplX3QgU2l6ZTsKKyAgdm9pZCAqTWFwcGluZzsKKyAgaW50IEZEOworICBtYXBtb2RlIE1vZGU7CisKKyAgc3RkOjplcnJvcl9jb2RlIGluaXQoaW50IEZELCB1aW50NjRfdCBPZmZzZXQsIG1hcG1vZGUgTW9kZSk7CisKK3B1YmxpYzoKKyAgbWFwcGVkX2ZpbGVfcmVnaW9uKCkgPSBkZWxldGU7CisgIG1hcHBlZF9maWxlX3JlZ2lvbihtYXBwZWRfZmlsZV9yZWdpb24mKSA9IGRlbGV0ZTsKKyAgbWFwcGVkX2ZpbGVfcmVnaW9uICZvcGVyYXRvciA9KG1hcHBlZF9maWxlX3JlZ2lvbiYpID0gZGVsZXRlOworCisgIC8vLyBccGFyYW0gZmQgQW4gb3BlbiBmaWxlIGRlc2NyaXB0b3IgdG8gbWFwLiBtYXBwZWRfZmlsZV9yZWdpb24gdGFrZXMKKyAgLy8vICAgb3duZXJzaGlwIGlmIGNsb3NlZmQgaXMgdHJ1ZS4gSXQgbXVzdCBoYXZlIGJlZW4gb3BlbmRlZCBpbiB0aGUgY29ycmVjdAorICAvLy8gICBtb2RlLgorICBtYXBwZWRfZmlsZV9yZWdpb24oaW50IGZkLCBtYXBtb2RlIG1vZGUsIHNpemVfdCBsZW5ndGgsIHVpbnQ2NF90IG9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZXJyb3JfY29kZSAmZWMpOworCisgIH5tYXBwZWRfZmlsZV9yZWdpb24oKTsKKworICBzaXplX3Qgc2l6ZSgpIGNvbnN0OworICBjaGFyICpkYXRhKCkgY29uc3Q7CisKKyAgLy8vIEdldCBhIGNvbnN0IHZpZXcgb2YgdGhlIGRhdGEuIE1vZGlmeWluZyB0aGlzIG1lbW9yeSBoYXMgdW5kZWZpbmVkCisgIC8vLyBiZWhhdmlvci4KKyAgY29uc3QgY2hhciAqY29uc3RfZGF0YSgpIGNvbnN0OworCisgIC8vLyBccmV0dXJucyBUaGUgbWluaW11bSBhbGlnbm1lbnQgb2Zmc2V0IG11c3QgYmUuCisgIHN0YXRpYyBpbnQgYWxpZ25tZW50KCk7Cit9OworCisvLy8gUmV0dXJuIHRoZSBwYXRoIHRvIHRoZSBtYWluIGV4ZWN1dGFibGUsIGdpdmVuIHRoZSB2YWx1ZSBvZiBhcmd2WzBdIGZyb20KKy8vLyBwcm9ncmFtIHN0YXJ0dXAgYW5kIHRoZSBhZGRyZXNzIG9mIG1haW4gaXRzZWxmLiBJbiBleHRyZW1pcywgdGhpcyBmdW5jdGlvbgorLy8vIG1heSBmYWlsIGFuZCByZXR1cm4gYW4gZW1wdHkgcGF0aC4KK3N0ZDo6c3RyaW5nIGdldE1haW5FeGVjdXRhYmxlKGNvbnN0IGNoYXIgKmFyZ3YwLCB2b2lkICpNYWluRXhlY0FkZHIpOworCisvLy8gQH0KKy8vLyBAbmFtZSBJdGVyYXRvcnMKKy8vLyBAeworCisvLy8gZGlyZWN0b3J5X2VudHJ5IC0gQSBzaW5nbGUgZW50cnkgaW4gYSBkaXJlY3RvcnkuIENhY2hlcyB0aGUgc3RhdHVzIGVpdGhlcgorLy8vIGZyb20gdGhlIHJlc3VsdCBvZiB0aGUgaXRlcmF0aW9uIHN5c2NhbGwsIG9yIHRoZSBmaXJzdCB0aW1lIHN0YXR1cyBpcworLy8vIGNhbGxlZC4KK2NsYXNzIGRpcmVjdG9yeV9lbnRyeSB7CisgIHN0ZDo6c3RyaW5nIFBhdGg7CisgIGJvb2wgRm9sbG93U3ltbGlua3M7CisgIGJhc2ljX2ZpbGVfc3RhdHVzIFN0YXR1czsKKworcHVibGljOgorICBleHBsaWNpdCBkaXJlY3RvcnlfZW50cnkoY29uc3QgVHdpbmUgJnBhdGgsIGJvb2wgZm9sbG93X3N5bWxpbmtzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2ljX2ZpbGVfc3RhdHVzIHN0ID0gYmFzaWNfZmlsZV9zdGF0dXMoKSkKKyAgICAgIDogUGF0aChwYXRoLnN0cigpKSwgRm9sbG93U3ltbGlua3MoZm9sbG93X3N5bWxpbmtzKSwgU3RhdHVzKHN0KSB7fQorCisgIGRpcmVjdG9yeV9lbnRyeSgpID0gZGVmYXVsdDsKKworICB2b2lkIGFzc2lnbihjb25zdCBUd2luZSAmcGF0aCwgYmFzaWNfZmlsZV9zdGF0dXMgc3QgPSBiYXNpY19maWxlX3N0YXR1cygpKSB7CisgICAgUGF0aCA9IHBhdGguc3RyKCk7CisgICAgU3RhdHVzID0gc3Q7CisgIH0KKworICB2b2lkIHJlcGxhY2VfZmlsZW5hbWUoY29uc3QgVHdpbmUgJmZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgYmFzaWNfZmlsZV9zdGF0dXMgc3QgPSBiYXNpY19maWxlX3N0YXR1cygpKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyAmcGF0aCgpIGNvbnN0IHsgcmV0dXJuIFBhdGg7IH0KKyAgRXJyb3JPcjxiYXNpY19maWxlX3N0YXR1cz4gc3RhdHVzKCkgY29uc3Q7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGRpcmVjdG9yeV9lbnRyeSYgcmhzKSBjb25zdCB7IHJldHVybiBQYXRoID09IHJocy5QYXRoOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBkaXJlY3RvcnlfZW50cnkmIHJocykgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSByaHMpOyB9CisgIGJvb2wgb3BlcmF0b3I8IChjb25zdCBkaXJlY3RvcnlfZW50cnkmIHJocykgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3I8PShjb25zdCBkaXJlY3RvcnlfZW50cnkmIHJocykgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3I+IChjb25zdCBkaXJlY3RvcnlfZW50cnkmIHJocykgY29uc3Q7CisgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBkaXJlY3RvcnlfZW50cnkmIHJocykgY29uc3Q7Cit9OworCituYW1lc3BhY2UgZGV0YWlsIHsKKworICBzdHJ1Y3QgRGlySXRlclN0YXRlOworCisgIHN0ZDo6ZXJyb3JfY29kZSBkaXJlY3RvcnlfaXRlcmF0b3JfY29uc3RydWN0KERpckl0ZXJTdGF0ZSAmLCBTdHJpbmdSZWYsIGJvb2wpOworICBzdGQ6OmVycm9yX2NvZGUgZGlyZWN0b3J5X2l0ZXJhdG9yX2luY3JlbWVudChEaXJJdGVyU3RhdGUgJik7CisgIHN0ZDo6ZXJyb3JfY29kZSBkaXJlY3RvcnlfaXRlcmF0b3JfZGVzdHJ1Y3QoRGlySXRlclN0YXRlICYpOworCisgIC8vLyBLZWVwcyBzdGF0ZSBmb3IgdGhlIGRpcmVjdG9yeV9pdGVyYXRvci4KKyAgc3RydWN0IERpckl0ZXJTdGF0ZSB7CisgICAgfkRpckl0ZXJTdGF0ZSgpIHsKKyAgICAgIGRpcmVjdG9yeV9pdGVyYXRvcl9kZXN0cnVjdCgqdGhpcyk7CisgICAgfQorCisgICAgaW50cHRyX3QgSXRlcmF0aW9uSGFuZGxlID0gMDsKKyAgICBkaXJlY3RvcnlfZW50cnkgQ3VycmVudEVudHJ5OworICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgZGV0YWlsCisKKy8vLyBkaXJlY3RvcnlfaXRlcmF0b3IgLSBJdGVyYXRlcyB0aHJvdWdoIHRoZSBlbnRyaWVzIGluIHBhdGguIFRoZXJlIGlzIG5vCisvLy8gb3BlcmF0b3IrKyBiZWNhdXNlIHdlIG5lZWQgYW4gZXJyb3JfY29kZS4gSWYgaXQncyByZWFsbHkgbmVlZGVkIHdlIGNhbiBtYWtlCisvLy8gaXQgY2FsbCByZXBvcnRfZmF0YWxfZXJyb3Igb24gZXJyb3IuCitjbGFzcyBkaXJlY3RvcnlfaXRlcmF0b3IgeworICBzdGQ6OnNoYXJlZF9wdHI8ZGV0YWlsOjpEaXJJdGVyU3RhdGU+IFN0YXRlOworICBib29sIEZvbGxvd1N5bWxpbmtzID0gdHJ1ZTsKKworcHVibGljOgorICBleHBsaWNpdCBkaXJlY3RvcnlfaXRlcmF0b3IoY29uc3QgVHdpbmUgJnBhdGgsIHN0ZDo6ZXJyb3JfY29kZSAmZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvbGxvd19zeW1saW5rcyA9IHRydWUpCisgICAgICA6IEZvbGxvd1N5bWxpbmtzKGZvbGxvd19zeW1saW5rcykgeworICAgIFN0YXRlID0gc3RkOjptYWtlX3NoYXJlZDxkZXRhaWw6OkRpckl0ZXJTdGF0ZT4oKTsKKyAgICBTbWFsbFN0cmluZzwxMjg+IHBhdGhfc3RvcmFnZTsKKyAgICBlYyA9IGRldGFpbDo6ZGlyZWN0b3J5X2l0ZXJhdG9yX2NvbnN0cnVjdCgKKyAgICAgICAgKlN0YXRlLCBwYXRoLnRvU3RyaW5nUmVmKHBhdGhfc3RvcmFnZSksIEZvbGxvd1N5bWxpbmtzKTsKKyAgfQorCisgIGV4cGxpY2l0IGRpcmVjdG9yeV9pdGVyYXRvcihjb25zdCBkaXJlY3RvcnlfZW50cnkgJmRlLCBzdGQ6OmVycm9yX2NvZGUgJmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBmb2xsb3dfc3ltbGlua3MgPSB0cnVlKQorICAgICAgOiBGb2xsb3dTeW1saW5rcyhmb2xsb3dfc3ltbGlua3MpIHsKKyAgICBTdGF0ZSA9IHN0ZDo6bWFrZV9zaGFyZWQ8ZGV0YWlsOjpEaXJJdGVyU3RhdGU+KCk7CisgICAgZWMgPQorICAgICAgICBkZXRhaWw6OmRpcmVjdG9yeV9pdGVyYXRvcl9jb25zdHJ1Y3QoKlN0YXRlLCBkZS5wYXRoKCksIEZvbGxvd1N5bWxpbmtzKTsKKyAgfQorCisgIC8vLyBDb25zdHJ1Y3QgZW5kIGl0ZXJhdG9yLgorICBkaXJlY3RvcnlfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgLy8gTm8gb3BlcmF0b3IrKyBiZWNhdXNlIHdlIG5lZWQgZXJyb3JfY29kZS4KKyAgZGlyZWN0b3J5X2l0ZXJhdG9yICZpbmNyZW1lbnQoc3RkOjplcnJvcl9jb2RlICZlYykgeworICAgIGVjID0gZGlyZWN0b3J5X2l0ZXJhdG9yX2luY3JlbWVudCgqU3RhdGUpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IGRpcmVjdG9yeV9lbnRyeSAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gU3RhdGUtPkN1cnJlbnRFbnRyeTsgfQorICBjb25zdCBkaXJlY3RvcnlfZW50cnkgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmU3RhdGUtPkN1cnJlbnRFbnRyeTsgfQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBkaXJlY3RvcnlfaXRlcmF0b3IgJlJIUykgY29uc3QgeworICAgIGlmIChTdGF0ZSA9PSBSSFMuU3RhdGUpCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICBpZiAoIVJIUy5TdGF0ZSkKKyAgICAgIHJldHVybiBTdGF0ZS0+Q3VycmVudEVudHJ5ID09IGRpcmVjdG9yeV9lbnRyeSgpOworICAgIGlmICghU3RhdGUpCisgICAgICByZXR1cm4gUkhTLlN0YXRlLT5DdXJyZW50RW50cnkgPT0gZGlyZWN0b3J5X2VudHJ5KCk7CisgICAgcmV0dXJuIFN0YXRlLT5DdXJyZW50RW50cnkgPT0gUkhTLlN0YXRlLT5DdXJyZW50RW50cnk7CisgIH0KKworICBib29sIG9wZXJhdG9yIT0oY29uc3QgZGlyZWN0b3J5X2l0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSBSSFMpOworICB9CisgIC8vIE90aGVyIG1lbWJlcnMgYXMgcmVxdWlyZWQgYnkKKyAgLy8gQysrIFN0ZCwgMjQuMS4xIElucHV0IGl0ZXJhdG9ycyBbaW5wdXQuaXRlcmF0b3JzXQorfTsKKworbmFtZXNwYWNlIGRldGFpbCB7CisKKyAgLy8vIEtlZXBzIHN0YXRlIGZvciB0aGUgcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvci4KKyAgc3RydWN0IFJlY0Rpckl0ZXJTdGF0ZSB7CisgICAgc3RkOjpzdGFjazxkaXJlY3RvcnlfaXRlcmF0b3IsIHN0ZDo6dmVjdG9yPGRpcmVjdG9yeV9pdGVyYXRvcj4+IFN0YWNrOworICAgIHVpbnQxNl90IExldmVsID0gMDsKKyAgICBib29sIEhhc05vUHVzaFJlcXVlc3QgPSBmYWxzZTsKKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGRldGFpbAorCisvLy8gcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvciAtIFNhbWUgYXMgZGlyZWN0b3J5X2l0ZXJhdG9yIGV4Y2VwdCBmb3IgaXQKKy8vLyByZWN1cnNlcyBkb3duIGludG8gY2hpbGQgZGlyZWN0b3JpZXMuCitjbGFzcyByZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yIHsKKyAgc3RkOjpzaGFyZWRfcHRyPGRldGFpbDo6UmVjRGlySXRlclN0YXRlPiBTdGF0ZTsKKyAgYm9vbCBGb2xsb3c7CisKK3B1YmxpYzoKKyAgcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvcihjb25zdCBUd2luZSAmcGF0aCwgc3RkOjplcnJvcl9jb2RlICZlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZvbGxvd19zeW1saW5rcyA9IHRydWUpCisgICAgICA6IFN0YXRlKHN0ZDo6bWFrZV9zaGFyZWQ8ZGV0YWlsOjpSZWNEaXJJdGVyU3RhdGU+KCkpLAorICAgICAgICBGb2xsb3coZm9sbG93X3N5bWxpbmtzKSB7CisgICAgU3RhdGUtPlN0YWNrLnB1c2goZGlyZWN0b3J5X2l0ZXJhdG9yKHBhdGgsIGVjLCBGb2xsb3cpKTsKKyAgICBpZiAoU3RhdGUtPlN0YWNrLnRvcCgpID09IGRpcmVjdG9yeV9pdGVyYXRvcigpKQorICAgICAgU3RhdGUucmVzZXQoKTsKKyAgfQorCisgIC8vIE5vIG9wZXJhdG9yKysgYmVjYXVzZSB3ZSBuZWVkIGVycm9yX2NvZGUuCisgIHJlY3Vyc2l2ZV9kaXJlY3RvcnlfaXRlcmF0b3IgJmluY3JlbWVudChzdGQ6OmVycm9yX2NvZGUgJmVjKSB7CisgICAgY29uc3QgZGlyZWN0b3J5X2l0ZXJhdG9yIGVuZF9pdHIgPSB7fTsKKworICAgIGlmIChTdGF0ZS0+SGFzTm9QdXNoUmVxdWVzdCkKKyAgICAgIFN0YXRlLT5IYXNOb1B1c2hSZXF1ZXN0ID0gZmFsc2U7CisgICAgZWxzZSB7CisgICAgICBFcnJvck9yPGJhc2ljX2ZpbGVfc3RhdHVzPiBzdCA9IFN0YXRlLT5TdGFjay50b3AoKS0+c3RhdHVzKCk7CisgICAgICBpZiAoIXN0KSByZXR1cm4gKnRoaXM7CisgICAgICBpZiAoaXNfZGlyZWN0b3J5KCpzdCkpIHsKKyAgICAgICAgU3RhdGUtPlN0YWNrLnB1c2goZGlyZWN0b3J5X2l0ZXJhdG9yKCpTdGF0ZS0+U3RhY2sudG9wKCksIGVjLCBGb2xsb3cpKTsKKyAgICAgICAgaWYgKGVjKSByZXR1cm4gKnRoaXM7CisgICAgICAgIGlmIChTdGF0ZS0+U3RhY2sudG9wKCkgIT0gZW5kX2l0cikgeworICAgICAgICAgICsrU3RhdGUtPkxldmVsOworICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorICAgICAgICBTdGF0ZS0+U3RhY2sucG9wKCk7CisgICAgICB9CisgICAgfQorCisgICAgd2hpbGUgKCFTdGF0ZS0+U3RhY2suZW1wdHkoKQorICAgICAgICAgICAmJiBTdGF0ZS0+U3RhY2sudG9wKCkuaW5jcmVtZW50KGVjKSA9PSBlbmRfaXRyKSB7CisgICAgICBTdGF0ZS0+U3RhY2sucG9wKCk7CisgICAgICAtLVN0YXRlLT5MZXZlbDsKKyAgICB9CisKKyAgICAvLyBDaGVjayBpZiB3ZSBhcmUgZG9uZS4gSWYgc28sIGNyZWF0ZSBhbiBlbmQgaXRlcmF0b3IuCisgICAgaWYgKFN0YXRlLT5TdGFjay5lbXB0eSgpKQorICAgICAgU3RhdGUucmVzZXQoKTsKKworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGNvbnN0IGRpcmVjdG9yeV9lbnRyeSAmb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKlN0YXRlLT5TdGFjay50b3AoKTsgfQorICBjb25zdCBkaXJlY3RvcnlfZW50cnkgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmKlN0YXRlLT5TdGFjay50b3AoKTsgfQorCisgIC8vIG9ic2VydmVycworICAvLy8gR2V0cyB0aGUgY3VycmVudCBsZXZlbC4gU3RhcnRpbmcgcGF0aCBpcyBhdCBsZXZlbCAwLgorICBpbnQgbGV2ZWwoKSBjb25zdCB7IHJldHVybiBTdGF0ZS0+TGV2ZWw7IH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIG5vX3B1c2ggaGFzIGJlZW4gY2FsbGVkIGZvciB0aGlzIGRpcmVjdG9yeV9lbnRyeS4KKyAgYm9vbCBub19wdXNoX3JlcXVlc3QoKSBjb25zdCB7IHJldHVybiBTdGF0ZS0+SGFzTm9QdXNoUmVxdWVzdDsgfQorCisgIC8vIG1vZGlmaWVycworICAvLy8gR29lcyB1cCBvbmUgbGV2ZWwgaWYgTGV2ZWwgPiAwLgorICB2b2lkIHBvcCgpIHsKKyAgICBhc3NlcnQoU3RhdGUgJiYgIkNhbm5vdCBwb3AgYW4gZW5kIGl0ZXJhdG9yISIpOworICAgIGFzc2VydChTdGF0ZS0+TGV2ZWwgPiAwICYmICJDYW5ub3QgcG9wIGFuIGl0ZXJhdG9yIHdpdGggbGV2ZWwgPCAxIik7CisKKyAgICBjb25zdCBkaXJlY3RvcnlfaXRlcmF0b3IgZW5kX2l0ciA9IHt9OworICAgIHN0ZDo6ZXJyb3JfY29kZSBlYzsKKyAgICBkbyB7CisgICAgICBpZiAoZWMpCisgICAgICAgIHJlcG9ydF9mYXRhbF9lcnJvcigiRXJyb3IgaW5jcmVtZW50aW5nIGRpcmVjdG9yeSBpdGVyYXRvci4iKTsKKyAgICAgIFN0YXRlLT5TdGFjay5wb3AoKTsKKyAgICAgIC0tU3RhdGUtPkxldmVsOworICAgIH0gd2hpbGUgKCFTdGF0ZS0+U3RhY2suZW1wdHkoKQorICAgICAgICAgICAgICYmIFN0YXRlLT5TdGFjay50b3AoKS5pbmNyZW1lbnQoZWMpID09IGVuZF9pdHIpOworCisgICAgLy8gQ2hlY2sgaWYgd2UgYXJlIGRvbmUuIElmIHNvLCBjcmVhdGUgYW4gZW5kIGl0ZXJhdG9yLgorICAgIGlmIChTdGF0ZS0+U3RhY2suZW1wdHkoKSkKKyAgICAgIFN0YXRlLnJlc2V0KCk7CisgIH0KKworICAvLy8gRG9lcyBub3QgZ28gZG93biBpbnRvIHRoZSBjdXJyZW50IGRpcmVjdG9yeV9lbnRyeS4KKyAgdm9pZCBub19wdXNoKCkgeyBTdGF0ZS0+SGFzTm9QdXNoUmVxdWVzdCA9IHRydWU7IH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgcmVjdXJzaXZlX2RpcmVjdG9yeV9pdGVyYXRvciAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIFN0YXRlID09IFJIUy5TdGF0ZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCByZWN1cnNpdmVfZGlyZWN0b3J5X2l0ZXJhdG9yICZSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gISgqdGhpcyA9PSBSSFMpOworICB9CisgIC8vIE90aGVyIG1lbWJlcnMgYXMgcmVxdWlyZWQgYnkKKyAgLy8gQysrIFN0ZCwgMjQuMS4xIElucHV0IGl0ZXJhdG9ycyBbaW5wdXQuaXRlcmF0b3JzXQorfTsKKworLy8vIEB9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBmcworfSAvLyBlbmQgbmFtZXNwYWNlIHN5cworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9GSUxFU1lTVEVNX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9GaWxlVXRpbGl0aWVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRmlsZVV0aWxpdGllcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlZTJjNjAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRmlsZVV0aWxpdGllcy5oCkBAIC0wLDAgKzEsNzggQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvRmlsZVV0aWxpdGllcy5oIC0gRmlsZSBTeXN0ZW0gVXRpbGl0aWVzIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSBmYW1pbHkgb2YgdXRpbGl0eSBmdW5jdGlvbnMgd2hpY2ggYXJlIHVzZWZ1bCBmb3IgZG9pbmcKKy8vIHZhcmlvdXMgdGhpbmdzIHdpdGggZmlsZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfRklMRVVUSUxJVElFU19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9GSUxFVVRJTElUSUVTX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1BhdGguaCIKKworbmFtZXNwYWNlIGxsdm0geworCisgIC8vLyBEaWZmRmlsZXNXaXRoVG9sZXJhbmNlIC0gQ29tcGFyZSB0aGUgdHdvIGZpbGVzIHNwZWNpZmllZCwgcmV0dXJuaW5nIDAgaWYKKyAgLy8vIHRoZSBmaWxlcyBtYXRjaCwgMSBpZiB0aGV5IGFyZSBkaWZmZXJlbnQsIGFuZCAyIGlmIHRoZXJlIGlzIGEgZmlsZSBlcnJvci4KKyAgLy8vIFRoaXMgZnVuY3Rpb24gYWxsb3dzIHlvdSB0byBzcGVjaWZ5IGFuIGFic29sdXRlIGFuZCByZWxhdGl2ZSBGUCBlcnJvciB0aGF0CisgIC8vLyBpcyBhbGxvd2VkIHRvIGV4aXN0LiAgSWYgeW91IHNwZWNpZnkgYSBzdHJpbmcgdG8gZmlsbCBpbiBmb3IgdGhlIGVycm9yCisgIC8vLyBvcHRpb24sIGl0IHdpbGwgc2V0IHRoZSBzdHJpbmcgdG8gYW4gZXJyb3IgbWVzc2FnZSBpZiBhbiBlcnJvciBvY2N1cnMsIG9yCisgIC8vLyBpZiB0aGUgZmlsZXMgYXJlIGRpZmZlcmVudC4KKyAgLy8vCisgIGludCBEaWZmRmlsZXNXaXRoVG9sZXJhbmNlKFN0cmluZ1JlZiBGaWxlQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgQWJzVG9sLCBkb3VibGUgUmVsVG9sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAqRXJyb3IgPSBudWxscHRyKTsKKworCisgIC8vLyBGaWxlUmVtb3ZlciAtIFRoaXMgY2xhc3MgaXMgYSBzaW1wbGUgb2JqZWN0IG1lYW50IHRvIGJlIHN0YWNrIGFsbG9jYXRlZC4KKyAgLy8vIElmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gZnJvbSBhIHJlZ2lvbiwgdGhlIG9iamVjdCByZW1vdmVzIHRoZSBmaWxlbmFtZQorICAvLy8gc3BlY2lmaWVkIChpZiBkZWxldGVJdCBpcyB0cnVlKS4KKyAgLy8vCisgIGNsYXNzIEZpbGVSZW1vdmVyIHsKKyAgICBTbWFsbFN0cmluZzwxMjg+IEZpbGVuYW1lOworICAgIGJvb2wgRGVsZXRlSXQ7CisgIHB1YmxpYzoKKyAgICBGaWxlUmVtb3ZlcigpIDogRGVsZXRlSXQoZmFsc2UpIHt9CisKKyAgICBleHBsaWNpdCBGaWxlUmVtb3Zlcihjb25zdCBUd2luZSYgZmlsZW5hbWUsIGJvb2wgZGVsZXRlSXQgPSB0cnVlKQorICAgICAgOiBEZWxldGVJdChkZWxldGVJdCkgeworICAgICAgZmlsZW5hbWUudG9WZWN0b3IoRmlsZW5hbWUpOworICAgIH0KKworICAgIH5GaWxlUmVtb3ZlcigpIHsKKyAgICAgIGlmIChEZWxldGVJdCkgeworICAgICAgICAvLyBJZ25vcmUgcHJvYmxlbXMgZGVsZXRpbmcgdGhlIGZpbGUuCisgICAgICAgIHN5czo6ZnM6OnJlbW92ZShGaWxlbmFtZSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8vIHNldEZpbGUgLSBHaXZlIG93bmVyc2hpcCBvZiB0aGUgZmlsZSB0byB0aGUgRmlsZVJlbW92ZXIgc28gaXQgd2lsbAorICAgIC8vLyBiZSByZW1vdmVkIHdoZW4gdGhlIG9iamVjdCBpcyBkZXN0cm95ZWQuICBJZiB0aGUgRmlsZVJlbW92ZXIgYWxyZWFkeQorICAgIC8vLyBoYWQgb3duZXJzaGlwIG9mIGEgZmlsZSwgcmVtb3ZlIGl0IGZpcnN0LgorICAgIHZvaWQgc2V0RmlsZShjb25zdCBUd2luZSYgZmlsZW5hbWUsIGJvb2wgZGVsZXRlSXQgPSB0cnVlKSB7CisgICAgICBpZiAoRGVsZXRlSXQpIHsKKyAgICAgICAgLy8gSWdub3JlIHByb2JsZW1zIGRlbGV0aW5nIHRoZSBmaWxlLgorICAgICAgICBzeXM6OmZzOjpyZW1vdmUoRmlsZW5hbWUpOworICAgICAgfQorCisgICAgICBGaWxlbmFtZS5jbGVhcigpOworICAgICAgZmlsZW5hbWUudG9WZWN0b3IoRmlsZW5hbWUpOworICAgICAgRGVsZXRlSXQgPSBkZWxldGVJdDsKKyAgICB9CisKKyAgICAvLy8gcmVsZWFzZUZpbGUgLSBUYWtlIG93bmVyc2hpcCBvZiB0aGUgZmlsZSBhd2F5IGZyb20gdGhlIEZpbGVSZW1vdmVyIHNvIGl0CisgICAgLy8vIHdpbGwgbm90IGJlIHJlbW92ZWQgd2hlbiB0aGUgb2JqZWN0IGlzIGRlc3Ryb3llZC4KKyAgICB2b2lkIHJlbGVhc2VGaWxlKCkgeyBEZWxldGVJdCA9IGZhbHNlOyB9CisgIH07Cit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Gb3JtYXQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Gb3JtYXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2JkMmJlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Zvcm1hdC5oCkBAIC0wLDAgKzEsMjU3IEBACisvLz09PS0gRm9ybWF0LmggLSBFZmZpY2llbnQgcHJpbnRmLXN0eWxlIGZvcm1hdHRpbmcgZm9yIHN0cmVhbXMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBmb3JtYXQoKSBmdW5jdGlvbiwgd2hpY2ggY2FuIGJlIHVzZWQgd2l0aCBvdGhlcgorLy8gTExWTSBzdWJzeXN0ZW1zIHRvIHByb3ZpZGUgcHJpbnRmLXN0eWxlIGZvcm1hdHRpbmcuICBUaGlzIGdpdmVzIGFsbCB0aGUgcG93ZXIKKy8vIGFuZCByaXNrIG9mIHByaW50Zi4gIFRoaXMgY2FuIGJlIHVzZWQgbGlrZSB0aGlzICh3aXRoIHJhd19vc3RyZWFtcyBhcyBhbgorLy8gZXhhbXBsZSk6CisvLworLy8gICAgT1MgPDwgIm15bnVtYmVyOiAiIDw8IGZvcm1hdCgiJTQuNWYiLCAxMjM0LjQxMikgPDwgJ1xuJzsKKy8vCisvLyBPciBpZiB5b3UgcHJlZmVyOgorLy8KKy8vICBPUyA8PCBmb3JtYXQoIm15bnVtYmVyOiAlNC41ZlxuIiwgMTIzNC40MTIpOworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0ZPUk1BVF9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9GT1JNQVRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW8+CisjaW5jbHVkZSA8dHVwbGU+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFRoaXMgaXMgYSBoZWxwZXIgY2xhc3MgdXNlZCBmb3IgaGFuZGxpbmcgZm9ybWF0dGVkIG91dHB1dC4gIEl0IGlzIHRoZQorLy8vIGFic3RyYWN0IGJhc2UgY2xhc3Mgb2YgYSB0ZW1wbGF0ZWQgZGVyaXZlZCBjbGFzcy4KK2NsYXNzIGZvcm1hdF9vYmplY3RfYmFzZSB7Citwcm90ZWN0ZWQ6CisgIGNvbnN0IGNoYXIgKkZtdDsKKyAgfmZvcm1hdF9vYmplY3RfYmFzZSgpID0gZGVmYXVsdDsgLy8gRGlzYWxsb3cgcG9seW1vcnBoaWMgZGVsZXRpb24uCisgIGZvcm1hdF9vYmplY3RfYmFzZShjb25zdCBmb3JtYXRfb2JqZWN0X2Jhc2UgJikgPSBkZWZhdWx0OworICB2aXJ0dWFsIHZvaWQgaG9tZSgpOyAvLyBPdXQgb2YgbGluZSB2aXJ0dWFsIG1ldGhvZC4KKworICAvLy8gQ2FsbCBzbnByaW50ZigpIGZvciB0aGlzIG9iamVjdCwgb24gdGhlIGdpdmVuIGJ1ZmZlciBhbmQgc2l6ZS4KKyAgdmlydHVhbCBpbnQgc25wcmludChjaGFyICpCdWZmZXIsIHVuc2lnbmVkIEJ1ZmZlclNpemUpIGNvbnN0ID0gMDsKKworcHVibGljOgorICBmb3JtYXRfb2JqZWN0X2Jhc2UoY29uc3QgY2hhciAqZm10KSA6IEZtdChmbXQpIHt9CisKKyAgLy8vIEZvcm1hdCB0aGUgb2JqZWN0IGludG8gdGhlIHNwZWNpZmllZCBidWZmZXIuICBPbiBzdWNjZXNzLCB0aGlzIHJldHVybnMKKyAgLy8vIHRoZSBsZW5ndGggb2YgdGhlIGZvcm1hdHRlZCBzdHJpbmcuICBJZiB0aGUgYnVmZmVyIGlzIHRvbyBzbWFsbCwgdGhpcworICAvLy8gcmV0dXJucyBhIGxlbmd0aCB0byByZXRyeSB3aXRoLCB3aGljaCB3aWxsIGJlIGxhcmdlciB0aGFuIEJ1ZmZlclNpemUuCisgIHVuc2lnbmVkIHByaW50KGNoYXIgKkJ1ZmZlciwgdW5zaWduZWQgQnVmZmVyU2l6ZSkgY29uc3QgeworICAgIGFzc2VydChCdWZmZXJTaXplICYmICJJbnZhbGlkIGJ1ZmZlciBzaXplISIpOworCisgICAgLy8gUHJpbnQgdGhlIHN0cmluZywgbGVhdmluZyByb29tIGZvciB0aGUgdGVybWluYXRpbmcgbnVsbC4KKyAgICBpbnQgTiA9IHNucHJpbnQoQnVmZmVyLCBCdWZmZXJTaXplKTsKKworICAgIC8vIFZDKysgYW5kIG9sZCBHbGliQyByZXR1cm4gbmVnYXRpdmUgb24gb3ZlcmZsb3csIGp1c3QgZG91YmxlIHRoZSBzaXplLgorICAgIGlmIChOIDwgMCkKKyAgICAgIHJldHVybiBCdWZmZXJTaXplICogMjsKKworICAgIC8vIE90aGVyIGltcGxlbWVudGF0aW9ucyB5aWVsZCBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkLCBub3QgaW5jbHVkaW5nIHRoZQorICAgIC8vIGZpbmFsICdcMCcuCisgICAgaWYgKHVuc2lnbmVkKE4pID49IEJ1ZmZlclNpemUpCisgICAgICByZXR1cm4gTiArIDE7CisKKyAgICAvLyBPdGhlcndpc2UgTiBpcyB0aGUgbGVuZ3RoIG9mIG91dHB1dCAobm90IGluY2x1ZGluZyB0aGUgZmluYWwgJ1wwJykuCisgICAgcmV0dXJuIE47CisgIH0KK307CisKKy8vLyBUaGVzZSBhcmUgdGVtcGxhdGVkIGhlbHBlciBjbGFzc2VzIHVzZWQgYnkgdGhlIGZvcm1hdCBmdW5jdGlvbiB0aGF0CisvLy8gY2FwdHVyZSB0aGUgb2JqZWN0IHRvIGJlIGZvcm1hdHRlZCBhbmQgdGhlIGZvcm1hdCBzdHJpbmcuIFdoZW4gYWN0dWFsbHkKKy8vLyBwcmludGVkLCB0aGlzIHN5bnRoZXNpemVzIHRoZSBzdHJpbmcgaW50byBhIHRlbXBvcmFyeSBidWZmZXIgcHJvdmlkZWQgYW5kCisvLy8gcmV0dXJucyB3aGV0aGVyIG9yIG5vdCBpdCBpcyBiaWcgZW5vdWdoLgorCisvLyBIZWxwZXIgdG8gdmFsaWRhdGUgdGhhdCBmb3JtYXQoKSBwYXJhbWV0ZXJzIGFyZSBzY2FsYXJzIG9yIHBvaW50ZXJzLgordGVtcGxhdGUgPHR5cGVuYW1lLi4uIEFyZ3M+IHN0cnVjdCB2YWxpZGF0ZV9mb3JtYXRfcGFyYW1ldGVyczsKK3RlbXBsYXRlIDx0eXBlbmFtZSBBcmcsIHR5cGVuYW1lLi4uIEFyZ3M+CitzdHJ1Y3QgdmFsaWRhdGVfZm9ybWF0X3BhcmFtZXRlcnM8QXJnLCBBcmdzLi4uPiB7CisgIHN0YXRpY19hc3NlcnQoc3RkOjppc19zY2FsYXI8QXJnPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgImZvcm1hdCBjYW4ndCBiZSB1c2VkIHdpdGggbm9uIGZ1bmRhbWVudGFsIC8gbm9uIHBvaW50ZXIgdHlwZSIpOworICB2YWxpZGF0ZV9mb3JtYXRfcGFyYW1ldGVycygpIHsgdmFsaWRhdGVfZm9ybWF0X3BhcmFtZXRlcnM8QXJncy4uLj4oKTsgfQorfTsKK3RlbXBsYXRlIDw+IHN0cnVjdCB2YWxpZGF0ZV9mb3JtYXRfcGFyYW1ldGVyczw+IHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVHM+CitjbGFzcyBmb3JtYXRfb2JqZWN0IGZpbmFsIDogcHVibGljIGZvcm1hdF9vYmplY3RfYmFzZSB7CisgIHN0ZDo6dHVwbGU8VHMuLi4+IFZhbHM7CisKKyAgdGVtcGxhdGUgPHN0ZDo6c2l6ZV90Li4uIElzPgorICBpbnQgc25wcmludF90dXBsZShjaGFyICpCdWZmZXIsIHVuc2lnbmVkIEJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgIGluZGV4X3NlcXVlbmNlPElzLi4uPikgY29uc3QgeworI2lmZGVmIF9NU0NfVkVSCisgICAgcmV0dXJuIF9zbnByaW50ZihCdWZmZXIsIEJ1ZmZlclNpemUsIEZtdCwgc3RkOjpnZXQ8SXM+KFZhbHMpLi4uKTsKKyNlbHNlCisgICAgcmV0dXJuIHNucHJpbnRmKEJ1ZmZlciwgQnVmZmVyU2l6ZSwgRm10LCBzdGQ6OmdldDxJcz4oVmFscykuLi4pOworI2VuZGlmCisgIH0KKworcHVibGljOgorICBmb3JtYXRfb2JqZWN0KGNvbnN0IGNoYXIgKmZtdCwgY29uc3QgVHMgJi4uLiB2YWxzKQorICAgICAgOiBmb3JtYXRfb2JqZWN0X2Jhc2UoZm10KSwgVmFscyh2YWxzLi4uKSB7CisgICAgdmFsaWRhdGVfZm9ybWF0X3BhcmFtZXRlcnM8VHMuLi4+KCk7CisgIH0KKworICBpbnQgc25wcmludChjaGFyICpCdWZmZXIsIHVuc2lnbmVkIEJ1ZmZlclNpemUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gc25wcmludF90dXBsZShCdWZmZXIsIEJ1ZmZlclNpemUsIGluZGV4X3NlcXVlbmNlX2ZvcjxUcy4uLj4oKSk7CisgIH0KK307CisKKy8vLyBUaGVzZSBhcmUgaGVscGVyIGZ1bmN0aW9ucyB1c2VkIHRvIHByb2R1Y2UgZm9ybWF0dGVkIG91dHB1dC4gIFRoZXkgdXNlCisvLy8gdGVtcGxhdGUgdHlwZSBkZWR1Y3Rpb24gdG8gY29uc3RydWN0IHRoZSBhcHByb3ByaWF0ZSBpbnN0YW5jZSBvZiB0aGUKKy8vLyBmb3JtYXRfb2JqZWN0IGNsYXNzIHRvIHNpbXBsaWZ5IHRoZWlyIGNvbnN0cnVjdGlvbi4KKy8vLworLy8vIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgbGlrZToKKy8vLyBcY29kZQorLy8vICAgT1MgPDwgZm9ybWF0KCIlMC40ZiIsIG15ZmxvYXQpIDw8ICdcbic7CisvLy8gXGVuZGNvZGUKKwordGVtcGxhdGUgPHR5cGVuYW1lLi4uIFRzPgoraW5saW5lIGZvcm1hdF9vYmplY3Q8VHMuLi4+IGZvcm1hdChjb25zdCBjaGFyICpGbXQsIGNvbnN0IFRzICYuLi4gVmFscykgeworICByZXR1cm4gZm9ybWF0X29iamVjdDxUcy4uLj4oRm10LCBWYWxzLi4uKTsKK30KKworLy8vIFRoaXMgaXMgYSBoZWxwZXIgY2xhc3MgZm9yIGxlZnRfanVzdGlmeSwgcmlnaHRfanVzdGlmeSwgYW5kIGNlbnRlcl9qdXN0aWZ5LgorY2xhc3MgRm9ybWF0dGVkU3RyaW5nIHsKK3B1YmxpYzoKKyAgZW51bSBKdXN0aWZpY2F0aW9uIHsgSnVzdGlmeU5vbmUsIEp1c3RpZnlMZWZ0LCBKdXN0aWZ5UmlnaHQsIEp1c3RpZnlDZW50ZXIgfTsKKyAgRm9ybWF0dGVkU3RyaW5nKFN0cmluZ1JlZiBTLCB1bnNpZ25lZCBXLCBKdXN0aWZpY2F0aW9uIEopCisgICAgICA6IFN0cihTKSwgV2lkdGgoVyksIEp1c3RpZnkoSikge30KKworcHJpdmF0ZToKKyAgU3RyaW5nUmVmIFN0cjsKKyAgdW5zaWduZWQgV2lkdGg7CisgIEp1c3RpZmljYXRpb24gSnVzdGlmeTsKKyAgZnJpZW5kIGNsYXNzIHJhd19vc3RyZWFtOworfTsKKworLy8vIGxlZnRfanVzdGlmeSAtIGFwcGVuZCBzcGFjZXMgYWZ0ZXIgc3RyaW5nIHNvIHRvdGFsIG91dHB1dCBpcworLy8vIFxwIFdpZHRoIGNoYXJhY3RlcnMuICBJZiBccCBTdHIgaXMgbGFyZ2VyIHRoYXQgXHAgV2lkdGgsIGZ1bGwgc3RyaW5nCisvLy8gaXMgd3JpdHRlbiB3aXRoIG5vIHBhZGRpbmcuCitpbmxpbmUgRm9ybWF0dGVkU3RyaW5nIGxlZnRfanVzdGlmeShTdHJpbmdSZWYgU3RyLCB1bnNpZ25lZCBXaWR0aCkgeworICByZXR1cm4gRm9ybWF0dGVkU3RyaW5nKFN0ciwgV2lkdGgsIEZvcm1hdHRlZFN0cmluZzo6SnVzdGlmeUxlZnQpOworfQorCisvLy8gcmlnaHRfanVzdGlmeSAtIGFkZCBzcGFjZXMgYmVmb3JlIHN0cmluZyBzbyB0b3RhbCBvdXRwdXQgaXMKKy8vLyBccCBXaWR0aCBjaGFyYWN0ZXJzLiAgSWYgXHAgU3RyIGlzIGxhcmdlciB0aGF0IFxwIFdpZHRoLCBmdWxsIHN0cmluZworLy8vIGlzIHdyaXR0ZW4gd2l0aCBubyBwYWRkaW5nLgoraW5saW5lIEZvcm1hdHRlZFN0cmluZyByaWdodF9qdXN0aWZ5KFN0cmluZ1JlZiBTdHIsIHVuc2lnbmVkIFdpZHRoKSB7CisgIHJldHVybiBGb3JtYXR0ZWRTdHJpbmcoU3RyLCBXaWR0aCwgRm9ybWF0dGVkU3RyaW5nOjpKdXN0aWZ5UmlnaHQpOworfQorCisvLy8gY2VudGVyX2p1c3RpZnkgLSBhZGQgc3BhY2VzIGJlZm9yZSBhbmQgYWZ0ZXIgc3RyaW5nIHNvIHRvdGFsIG91dHB1dCBpcworLy8vIFxwIFdpZHRoIGNoYXJhY3RlcnMuICBJZiBccCBTdHIgaXMgbGFyZ2VyIHRoYXQgXHAgV2lkdGgsIGZ1bGwgc3RyaW5nCisvLy8gaXMgd3JpdHRlbiB3aXRoIG5vIHBhZGRpbmcuCitpbmxpbmUgRm9ybWF0dGVkU3RyaW5nIGNlbnRlcl9qdXN0aWZ5KFN0cmluZ1JlZiBTdHIsIHVuc2lnbmVkIFdpZHRoKSB7CisgIHJldHVybiBGb3JtYXR0ZWRTdHJpbmcoU3RyLCBXaWR0aCwgRm9ybWF0dGVkU3RyaW5nOjpKdXN0aWZ5Q2VudGVyKTsKK30KKworLy8vIFRoaXMgaXMgYSBoZWxwZXIgY2xhc3MgdXNlZCBmb3IgZm9ybWF0X2hleCgpIGFuZCBmb3JtYXRfZGVjaW1hbCgpLgorY2xhc3MgRm9ybWF0dGVkTnVtYmVyIHsKKyAgdWludDY0X3QgSGV4VmFsdWU7CisgIGludDY0X3QgRGVjVmFsdWU7CisgIHVuc2lnbmVkIFdpZHRoOworICBib29sIEhleDsKKyAgYm9vbCBVcHBlcjsKKyAgYm9vbCBIZXhQcmVmaXg7CisgIGZyaWVuZCBjbGFzcyByYXdfb3N0cmVhbTsKKworcHVibGljOgorICBGb3JtYXR0ZWROdW1iZXIodWludDY0X3QgSFYsIGludDY0X3QgRFYsIHVuc2lnbmVkIFcsIGJvb2wgSCwgYm9vbCBVLAorICAgICAgICAgICAgICAgICAgYm9vbCBQcmVmaXgpCisgICAgICA6IEhleFZhbHVlKEhWKSwgRGVjVmFsdWUoRFYpLCBXaWR0aChXKSwgSGV4KEgpLCBVcHBlcihVKSwKKyAgICAgICAgSGV4UHJlZml4KFByZWZpeCkge30KK307CisKKy8vLyBmb3JtYXRfaGV4IC0gT3V0cHV0IFxwIE4gYXMgYSBmaXhlZCB3aWR0aCBoZXhhZGVjaW1hbC4gSWYgbnVtYmVyIHdpbGwgbm90CisvLy8gZml0IGluIHdpZHRoLCBmdWxsIG51bWJlciBpcyBzdGlsbCBwcmludGVkLiAgRXhhbXBsZXM6CisvLy8gICBPUyA8PCBmb3JtYXRfaGV4KDI1NSwgNCkgICAgICAgICAgICAgID0+IDB4ZmYKKy8vLyAgIE9TIDw8IGZvcm1hdF9oZXgoMjU1LCA0LCB0cnVlKSAgICAgICAgPT4gMHhGRgorLy8vICAgT1MgPDwgZm9ybWF0X2hleCgyNTUsIDYpICAgICAgICAgICAgICA9PiAweDAwZmYKKy8vLyAgIE9TIDw8IGZvcm1hdF9oZXgoMjU1LCAyKSAgICAgICAgICAgICAgPT4gMHhmZgoraW5saW5lIEZvcm1hdHRlZE51bWJlciBmb3JtYXRfaGV4KHVpbnQ2NF90IE4sIHVuc2lnbmVkIFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVXBwZXIgPSBmYWxzZSkgeworICBhc3NlcnQoV2lkdGggPD0gMTggJiYgImhleCB3aWR0aCBtdXN0IGJlIDw9IDE4Iik7CisgIHJldHVybiBGb3JtYXR0ZWROdW1iZXIoTiwgMCwgV2lkdGgsIHRydWUsIFVwcGVyLCB0cnVlKTsKK30KKworLy8vIGZvcm1hdF9oZXhfbm9fcHJlZml4IC0gT3V0cHV0IFxwIE4gYXMgYSBmaXhlZCB3aWR0aCBoZXhhZGVjaW1hbC4gRG9lcyBub3QKKy8vLyBwcmVwZW5kICcweCcgdG8gdGhlIG91dHB1dHRlZCBzdHJpbmcuICBJZiBudW1iZXIgd2lsbCBub3QgZml0IGluIHdpZHRoLAorLy8vIGZ1bGwgbnVtYmVyIGlzIHN0aWxsIHByaW50ZWQuICBFeGFtcGxlczoKKy8vLyAgIE9TIDw8IGZvcm1hdF9oZXhfbm9fcHJlZml4KDI1NSwgMikgICAgICAgICAgICAgID0+IGZmCisvLy8gICBPUyA8PCBmb3JtYXRfaGV4X25vX3ByZWZpeCgyNTUsIDIsIHRydWUpICAgICAgICA9PiBGRgorLy8vICAgT1MgPDwgZm9ybWF0X2hleF9ub19wcmVmaXgoMjU1LCA0KSAgICAgICAgICAgICAgPT4gMDBmZgorLy8vICAgT1MgPDwgZm9ybWF0X2hleF9ub19wcmVmaXgoMjU1LCAxKSAgICAgICAgICAgICAgPT4gZmYKK2lubGluZSBGb3JtYXR0ZWROdW1iZXIgZm9ybWF0X2hleF9ub19wcmVmaXgodWludDY0X3QgTiwgdW5zaWduZWQgV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgVXBwZXIgPSBmYWxzZSkgeworICBhc3NlcnQoV2lkdGggPD0gMTYgJiYgImhleCB3aWR0aCBtdXN0IGJlIDw9IDE2Iik7CisgIHJldHVybiBGb3JtYXR0ZWROdW1iZXIoTiwgMCwgV2lkdGgsIHRydWUsIFVwcGVyLCBmYWxzZSk7Cit9CisKKy8vLyBmb3JtYXRfZGVjaW1hbCAtIE91dHB1dCBccCBOIGFzIGEgcmlnaHQganVzdGlmaWVkLCBmaXhlZC13aWR0aCBkZWNpbWFsLiBJZgorLy8vIG51bWJlciB3aWxsIG5vdCBmaXQgaW4gd2lkdGgsIGZ1bGwgbnVtYmVyIGlzIHN0aWxsIHByaW50ZWQuICBFeGFtcGxlczoKKy8vLyAgIE9TIDw8IGZvcm1hdF9kZWNpbWFsKDAsIDUpICAgICA9PiAiICAgIDAiCisvLy8gICBPUyA8PCBmb3JtYXRfZGVjaW1hbCgyNTUsIDUpICAgPT4gIiAgMjU1IgorLy8vICAgT1MgPDwgZm9ybWF0X2RlY2ltYWwoLTEsIDMpICAgID0+ICIgLTEiCisvLy8gICBPUyA8PCBmb3JtYXRfZGVjaW1hbCgxMjM0NSwgMykgPT4gIjEyMzQ1IgoraW5saW5lIEZvcm1hdHRlZE51bWJlciBmb3JtYXRfZGVjaW1hbChpbnQ2NF90IE4sIHVuc2lnbmVkIFdpZHRoKSB7CisgIHJldHVybiBGb3JtYXR0ZWROdW1iZXIoMCwgTiwgV2lkdGgsIGZhbHNlLCBmYWxzZSwgZmFsc2UpOworfQorCitjbGFzcyBGb3JtYXR0ZWRCeXRlcyB7CisgIEFycmF5UmVmPHVpbnQ4X3Q+IEJ5dGVzOworCisgIC8vIElmIG5vdCBOb25lLCBkaXNwbGF5IG9mZnNldHMgZm9yIGVhY2ggbGluZSByZWxhdGl2ZSB0byBzdGFydGluZyB2YWx1ZS4KKyAgT3B0aW9uYWw8dWludDY0X3Q+IEZpcnN0Qnl0ZU9mZnNldDsKKyAgdWludDMyX3QgSW5kZW50TGV2ZWw7ICAvLyBOdW1iZXIgb2YgY2hhcmFjdGVycyB0byBpbmRlbnQgZWFjaCBsaW5lLgorICB1aW50MzJfdCBOdW1QZXJMaW5lOyAgIC8vIE51bWJlciBvZiBieXRlcyB0byBzaG93IHBlciBsaW5lLgorICB1aW50OF90IEJ5dGVHcm91cFNpemU7IC8vIEhvdyBtYW55IGhleCBieXRlcyBhcmUgZ3JvdXBlZCB3aXRob3V0IHNwYWNlcworICBib29sIFVwcGVyOyAgICAgICAgICAgIC8vIFNob3cgb2Zmc2V0IGFuZCBoZXggYnl0ZXMgYXMgdXBwZXIgY2FzZS4KKyAgYm9vbCBBU0NJSTsgICAgICAgICAgICAvLyBTaG93IHRoZSBBU0NJSSBieXRlcyBmb3IgdGhlIGhleCBieXRlcyB0byB0aGUgcmlnaHQuCisgIGZyaWVuZCBjbGFzcyByYXdfb3N0cmVhbTsKKworcHVibGljOgorICBGb3JtYXR0ZWRCeXRlcyhBcnJheVJlZjx1aW50OF90PiBCLCB1aW50MzJfdCBJTCwgT3B0aW9uYWw8dWludDY0X3Q+IE8sCisgICAgICAgICAgICAgICAgIHVpbnQzMl90IE5QTCwgdWludDhfdCBCR1MsIGJvb2wgVSwgYm9vbCBBKQorICAgICAgOiBCeXRlcyhCKSwgRmlyc3RCeXRlT2Zmc2V0KE8pLCBJbmRlbnRMZXZlbChJTCksIE51bVBlckxpbmUoTlBMKSwKKyAgICAgICAgQnl0ZUdyb3VwU2l6ZShCR1MpLCBVcHBlcihVKSwgQVNDSUkoQSkgeworCisgICAgaWYgKEJ5dGVHcm91cFNpemUgPiBOdW1QZXJMaW5lKQorICAgICAgQnl0ZUdyb3VwU2l6ZSA9IE51bVBlckxpbmU7CisgIH0KK307CisKK2lubGluZSBGb3JtYXR0ZWRCeXRlcworZm9ybWF0X2J5dGVzKEFycmF5UmVmPHVpbnQ4X3Q+IEJ5dGVzLCBPcHRpb25hbDx1aW50NjRfdD4gRmlyc3RCeXRlT2Zmc2V0ID0gTm9uZSwKKyAgICAgICAgICAgICB1aW50MzJfdCBOdW1QZXJMaW5lID0gMTYsIHVpbnQ4X3QgQnl0ZUdyb3VwU2l6ZSA9IDQsCisgICAgICAgICAgICAgdWludDMyX3QgSW5kZW50TGV2ZWwgPSAwLCBib29sIFVwcGVyID0gZmFsc2UpIHsKKyAgcmV0dXJuIEZvcm1hdHRlZEJ5dGVzKEJ5dGVzLCBJbmRlbnRMZXZlbCwgRmlyc3RCeXRlT2Zmc2V0LCBOdW1QZXJMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUdyb3VwU2l6ZSwgVXBwZXIsIGZhbHNlKTsKK30KKworaW5saW5lIEZvcm1hdHRlZEJ5dGVzCitmb3JtYXRfYnl0ZXNfd2l0aF9hc2NpaShBcnJheVJlZjx1aW50OF90PiBCeXRlcywKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wdGlvbmFsPHVpbnQ2NF90PiBGaXJzdEJ5dGVPZmZzZXQgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTnVtUGVyTGluZSA9IDE2LCB1aW50OF90IEJ5dGVHcm91cFNpemUgPSA0LAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgSW5kZW50TGV2ZWwgPSAwLCBib29sIFVwcGVyID0gZmFsc2UpIHsKKyAgcmV0dXJuIEZvcm1hdHRlZEJ5dGVzKEJ5dGVzLCBJbmRlbnRMZXZlbCwgRmlyc3RCeXRlT2Zmc2V0LCBOdW1QZXJMaW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZUdyb3VwU2l6ZSwgVXBwZXIsIHRydWUpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Gb3JtYXRBZGFwdGVycy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Zvcm1hdEFkYXB0ZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk3YmViNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Gb3JtYXRBZGFwdGVycy5oCkBAIC0wLDAgKzEsOTMgQEAKKy8vPT09LSBGb3JtYXRBZGFwdGVycy5oIC0gRm9ybWF0dGVycyBmb3IgY29tbW9uIExMVk0gdHlwZXMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfRk9STUFUQURBUFRFUlNfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfRk9STUFUQURBUFRFUlNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0Q29tbW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdFZhcmlhZGljRGV0YWlscy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCituYW1lc3BhY2UgbGx2bSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgRm9ybWF0QWRhcHRlciA6IHB1YmxpYyBkZXRhaWw6OmZvcm1hdF9hZGFwdGVyIHsKK3Byb3RlY3RlZDoKKyAgZXhwbGljaXQgRm9ybWF0QWRhcHRlcihUICYmSXRlbSkgOiBJdGVtKEl0ZW0pIHt9CisKKyAgVCBJdGVtOworfTsKKworbmFtZXNwYWNlIGRldGFpbCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQWxpZ25BZGFwdGVyIGZpbmFsIDogcHVibGljIEZvcm1hdEFkYXB0ZXI8VD4geworICBBbGlnblN0eWxlIFdoZXJlOworICBzaXplX3QgQW1vdW50OworICBjaGFyIEZpbGw7CisKK3B1YmxpYzoKKyAgQWxpZ25BZGFwdGVyKFQgJiZJdGVtLCBBbGlnblN0eWxlIFdoZXJlLCBzaXplX3QgQW1vdW50LCBjaGFyIEZpbGwpCisgICAgICA6IEZvcm1hdEFkYXB0ZXI8VD4oc3RkOjpmb3J3YXJkPFQ+KEl0ZW0pKSwgV2hlcmUoV2hlcmUpLCBBbW91bnQoQW1vdW50KSwKKyAgICAgICAgRmlsbChGaWxsKSB7fQorCisgIHZvaWQgZm9ybWF0KGxsdm06OnJhd19vc3RyZWFtICZTdHJlYW0sIFN0cmluZ1JlZiBTdHlsZSkgeworICAgIGF1dG8gQWRhcHRlciA9IGRldGFpbDo6YnVpbGRfZm9ybWF0X2FkYXB0ZXIoc3RkOjpmb3J3YXJkPFQ+KHRoaXMtPkl0ZW0pKTsKKyAgICBGbXRBbGlnbihBZGFwdGVyLCBXaGVyZSwgQW1vdW50LCBGaWxsKS5mb3JtYXQoU3RyZWFtLCBTdHlsZSk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBQYWRBZGFwdGVyIGZpbmFsIDogcHVibGljIEZvcm1hdEFkYXB0ZXI8VD4geworICBzaXplX3QgTGVmdDsKKyAgc2l6ZV90IFJpZ2h0OworCitwdWJsaWM6CisgIFBhZEFkYXB0ZXIoVCAmJkl0ZW0sIHNpemVfdCBMZWZ0LCBzaXplX3QgUmlnaHQpCisgICAgICA6IEZvcm1hdEFkYXB0ZXI8VD4oc3RkOjpmb3J3YXJkPFQ+KEl0ZW0pKSwgTGVmdChMZWZ0KSwgUmlnaHQoUmlnaHQpIHt9CisKKyAgdm9pZCBmb3JtYXQobGx2bTo6cmF3X29zdHJlYW0gJlN0cmVhbSwgU3RyaW5nUmVmIFN0eWxlKSB7CisgICAgYXV0byBBZGFwdGVyID0gZGV0YWlsOjpidWlsZF9mb3JtYXRfYWRhcHRlcihzdGQ6OmZvcndhcmQ8VD4odGhpcy0+SXRlbSkpOworICAgIFN0cmVhbS5pbmRlbnQoTGVmdCk7CisgICAgQWRhcHRlci5mb3JtYXQoU3RyZWFtLCBTdHlsZSk7CisgICAgU3RyZWFtLmluZGVudChSaWdodCk7CisgIH0KK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBSZXBlYXRBZGFwdGVyIGZpbmFsIDogcHVibGljIEZvcm1hdEFkYXB0ZXI8VD4geworICBzaXplX3QgQ291bnQ7CisKK3B1YmxpYzoKKyAgUmVwZWF0QWRhcHRlcihUICYmSXRlbSwgc2l6ZV90IENvdW50KQorICAgICAgOiBGb3JtYXRBZGFwdGVyPFQ+KHN0ZDo6Zm9yd2FyZDxUPihJdGVtKSksIENvdW50KENvdW50KSB7fQorCisgIHZvaWQgZm9ybWF0KGxsdm06OnJhd19vc3RyZWFtICZTdHJlYW0sIFN0cmluZ1JlZiBTdHlsZSkgeworICAgIGF1dG8gQWRhcHRlciA9IGRldGFpbDo6YnVpbGRfZm9ybWF0X2FkYXB0ZXIoc3RkOjpmb3J3YXJkPFQ+KHRoaXMtPkl0ZW0pKTsKKyAgICBmb3IgKHNpemVfdCBJID0gMDsgSSA8IENvdW50OyArK0kpIHsKKyAgICAgIEFkYXB0ZXIuZm9ybWF0KFN0cmVhbSwgU3R5bGUpOworICAgIH0KKyAgfQorfTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitkZXRhaWw6OkFsaWduQWRhcHRlcjxUPiBmbXRfYWxpZ24oVCAmJkl0ZW0sIEFsaWduU3R5bGUgV2hlcmUsIHNpemVfdCBBbW91bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBGaWxsID0gJyAnKSB7CisgIHJldHVybiBkZXRhaWw6OkFsaWduQWRhcHRlcjxUPihzdGQ6OmZvcndhcmQ8VD4oSXRlbSksIFdoZXJlLCBBbW91bnQsIEZpbGwpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2RldGFpbDo6UGFkQWRhcHRlcjxUPiBmbXRfcGFkKFQgJiZJdGVtLCBzaXplX3QgTGVmdCwgc2l6ZV90IFJpZ2h0KSB7CisgIHJldHVybiBkZXRhaWw6OlBhZEFkYXB0ZXI8VD4oc3RkOjpmb3J3YXJkPFQ+KEl0ZW0pLCBMZWZ0LCBSaWdodCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorZGV0YWlsOjpSZXBlYXRBZGFwdGVyPFQ+IGZtdF9yZXBlYXQoVCAmJkl0ZW0sIHNpemVfdCBDb3VudCkgeworICByZXR1cm4gZGV0YWlsOjpSZXBlYXRBZGFwdGVyPFQ+KHN0ZDo6Zm9yd2FyZDxUPihJdGVtKSwgQ291bnQpOworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Gb3JtYXRDb21tb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Gb3JtYXRDb21tb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmZiYWQyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Zvcm1hdENvbW1vbi5oCkBAIC0wLDAgKzEsNzcgQEAKKy8vPT09LSBGb3JtYXRBZGFwdGVycy5oIC0gRm9ybWF0dGVycyBmb3IgY29tbW9uIExMVk0gdHlwZXMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfRk9STUFUQ09NTU9OX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0ZPUk1BVENPTU1PTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXRWYXJpYWRpY0RldGFpbHMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworbmFtZXNwYWNlIGxsdm0geworZW51bSBjbGFzcyBBbGlnblN0eWxlIHsgTGVmdCwgQ2VudGVyLCBSaWdodCB9OworCitzdHJ1Y3QgRm10QWxpZ24geworICBkZXRhaWw6OmZvcm1hdF9hZGFwdGVyICZBZGFwdGVyOworICBBbGlnblN0eWxlIFdoZXJlOworICBzaXplX3QgQW1vdW50OworICBjaGFyIEZpbGw7CisKKyAgRm10QWxpZ24oZGV0YWlsOjpmb3JtYXRfYWRhcHRlciAmQWRhcHRlciwgQWxpZ25TdHlsZSBXaGVyZSwgc2l6ZV90IEFtb3VudCwKKyAgICAgICAgICAgY2hhciBGaWxsID0gJyAnKQorICAgICAgOiBBZGFwdGVyKEFkYXB0ZXIpLCBXaGVyZShXaGVyZSksIEFtb3VudChBbW91bnQpLCBGaWxsKEZpbGwpIHt9CisKKyAgdm9pZCBmb3JtYXQocmF3X29zdHJlYW0gJlMsIFN0cmluZ1JlZiBPcHRpb25zKSB7CisgICAgLy8gSWYgd2UgZG9uJ3QgbmVlZCB0byBhbGlnbiwgd2UgY2FuIGZvcm1hdCBzdHJhaWdodCBpbnRvIHRoZSB1bmRlcmx5aW5nCisgICAgLy8gc3RyZWFtLiAgT3RoZXJ3aXNlIHdlIGhhdmUgdG8gZ28gdGhyb3VnaCBhbiBpbnRlcm1lZGlhdGUgc3RyZWFtIGZpcnN0CisgICAgLy8gaW4gb3JkZXIgdG8gY2FsY3VsYXRlIGhvdyBsb25nIHRoZSBvdXRwdXQgaXMgc28gd2UgY2FuIGFsaWduIGl0LgorICAgIC8vIFRPRE86IE1ha2UgdGhlIGZvcm1hdCBtZXRob2QgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiwgdGhhdAorICAgIC8vIHdheSB3ZSBjYW4gYWxzbyBza2lwIHRoZSBpbnRlcm1lZGlhdGUgc3RyZWFtIGZvciBsZWZ0LWFsaWduZWQgb3V0cHV0LgorICAgIGlmIChBbW91bnQgPT0gMCkgeworICAgICAgQWRhcHRlci5mb3JtYXQoUywgT3B0aW9ucyk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIFNtYWxsU3RyaW5nPDY0PiBJdGVtOworICAgIHJhd19zdmVjdG9yX29zdHJlYW0gU3RyZWFtKEl0ZW0pOworCisgICAgQWRhcHRlci5mb3JtYXQoU3RyZWFtLCBPcHRpb25zKTsKKyAgICBpZiAoQW1vdW50IDw9IEl0ZW0uc2l6ZSgpKSB7CisgICAgICBTIDw8IEl0ZW07CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgc2l6ZV90IFBhZEFtb3VudCA9IEFtb3VudCAtIEl0ZW0uc2l6ZSgpOworICAgIHN3aXRjaCAoV2hlcmUpIHsKKyAgICBjYXNlIEFsaWduU3R5bGU6OkxlZnQ6CisgICAgICBTIDw8IEl0ZW07CisgICAgICBmaWxsKFMsIFBhZEFtb3VudCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIEFsaWduU3R5bGU6OkNlbnRlcjogeworICAgICAgc2l6ZV90IFggPSBQYWRBbW91bnQgLyAyOworICAgICAgZmlsbChTLCBYKTsKKyAgICAgIFMgPDwgSXRlbTsKKyAgICAgIGZpbGwoUywgUGFkQW1vdW50IC0gWCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGZpbGwoUywgUGFkQW1vdW50KTsKKyAgICAgIFMgPDwgSXRlbTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICB2b2lkIGZpbGwobGx2bTo6cmF3X29zdHJlYW0gJlMsIHVpbnQzMl90IENvdW50KSB7CisgICAgZm9yICh1aW50MzJfdCBJID0gMDsgSSA8IENvdW50OyArK0kpCisgICAgICBTIDw8IEZpbGw7CisgIH0KK307Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Zvcm1hdFByb3ZpZGVycy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Zvcm1hdFByb3ZpZGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNTcwMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRm9ybWF0UHJvdmlkZXJzLmgKQEAgLTAsMCArMSw0MjMgQEAKKy8vPT09LSBGb3JtYXRQcm92aWRlcnMuaCAtIEZvcm1hdHRlcnMgZm9yIGNvbW1vbiBMTFZNIHR5cGVzIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgZm9ybWF0IHByb3ZpZGVycyBmb3IgbWFueSBjb21tb24gTExWTSB0eXBlcywgZm9yIGV4YW1wbGUKKy8vIGFsbG93aW5nIHByZWNpc2lvbiBhbmQgd2lkdGggc3BlY2lmaWVycyBmb3Igc2NhbGFyIGFuZCBzdHJpbmcgdHlwZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfRk9STUFUUFJPVklERVJTX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0ZPUk1BVFBST1ZJREVSU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1N3aXRjaC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdFZhcmlhZGljRGV0YWlscy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9OYXRpdmVGb3JtYXR0aW5nLmgiCisKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBkZXRhaWwgewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgdXNlX2ludGVncmFsX2Zvcm1hdHRlcgorICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8CisgICAgICAgICAgYm9vbCwgaXNfb25lX29mPFQsIHVpbnQ4X3QsIGludDE2X3QsIHVpbnQxNl90LCBpbnQzMl90LCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCwgdWludDY0X3QsIGludCwgdW5zaWduZWQsIGxvbmcsIHVuc2lnbmVkIGxvbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxvbmcgbG9uZywgdW5zaWduZWQgbG9uZyBsb25nPjo6dmFsdWU+IHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCB1c2VfY2hhcl9mb3JtYXR0ZXIKKyAgICA6IHB1YmxpYyBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIHN0ZDo6aXNfc2FtZTxULCBjaGFyPjo6dmFsdWU+IHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBpc19jc3RyaW5nCisgICAgOiBwdWJsaWMgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfb25lX29mPFQsIGNoYXIgKiwgY29uc3QgY2hhciAqPjo6dmFsdWU+IHsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IHVzZV9zdHJpbmdfZm9ybWF0dGVyCisgICAgOiBwdWJsaWMgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppc19jb252ZXJ0aWJsZTxULCBsbHZtOjpTdHJpbmdSZWY+Ojp2YWx1ZT4ge307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IHVzZV9wb2ludGVyX2Zvcm1hdHRlcgorICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgc3RkOjppc19wb2ludGVyPFQ+Ojp2YWx1ZSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFpc19jc3RyaW5nPFQ+Ojp2YWx1ZT4ge307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IHVzZV9kb3VibGVfZm9ybWF0dGVyCisgICAgOiBwdWJsaWMgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCBzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFQ+Ojp2YWx1ZT4ge307CisKK2NsYXNzIEhlbHBlckZ1bmN0aW9ucyB7Citwcm90ZWN0ZWQ6CisgIHN0YXRpYyBPcHRpb25hbDxzaXplX3Q+IHBhcnNlTnVtZXJpY1ByZWNpc2lvbihTdHJpbmdSZWYgU3RyKSB7CisgICAgc2l6ZV90IFByZWM7CisgICAgT3B0aW9uYWw8c2l6ZV90PiBSZXN1bHQ7CisgICAgaWYgKFN0ci5lbXB0eSgpKQorICAgICAgUmVzdWx0ID0gTm9uZTsKKyAgICBlbHNlIGlmIChTdHIuZ2V0QXNJbnRlZ2VyKDEwLCBQcmVjKSkgeworICAgICAgYXNzZXJ0KGZhbHNlICYmICJJbnZhbGlkIHByZWNpc2lvbiBzcGVjaWZpZXIiKTsKKyAgICAgIFJlc3VsdCA9IE5vbmU7CisgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChQcmVjIDwgMTAwICYmICJQcmVjaXNpb24gb3V0IG9mIHJhbmdlIik7CisgICAgICBSZXN1bHQgPSBzdGQ6Om1pbjxzaXplX3Q+KDk5dSwgUHJlYyk7CisgICAgfQorICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICBzdGF0aWMgYm9vbCBjb25zdW1lSGV4U3R5bGUoU3RyaW5nUmVmICZTdHIsIEhleFByaW50U3R5bGUgJlN0eWxlKSB7CisgICAgaWYgKCFTdHIuc3RhcnRzd2l0aF9sb3dlcigieCIpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgaWYgKFN0ci5jb25zdW1lX2Zyb250KCJ4LSIpKQorICAgICAgU3R5bGUgPSBIZXhQcmludFN0eWxlOjpMb3dlcjsKKyAgICBlbHNlIGlmIChTdHIuY29uc3VtZV9mcm9udCgiWC0iKSkKKyAgICAgIFN0eWxlID0gSGV4UHJpbnRTdHlsZTo6VXBwZXI7CisgICAgZWxzZSBpZiAoU3RyLmNvbnN1bWVfZnJvbnQoIngrIikgfHwgU3RyLmNvbnN1bWVfZnJvbnQoIngiKSkKKyAgICAgIFN0eWxlID0gSGV4UHJpbnRTdHlsZTo6UHJlZml4TG93ZXI7CisgICAgZWxzZSBpZiAoU3RyLmNvbnN1bWVfZnJvbnQoIlgrIikgfHwgU3RyLmNvbnN1bWVfZnJvbnQoIlgiKSkKKyAgICAgIFN0eWxlID0gSGV4UHJpbnRTdHlsZTo6UHJlZml4VXBwZXI7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBzdGF0aWMgc2l6ZV90IGNvbnN1bWVOdW1IZXhEaWdpdHMoU3RyaW5nUmVmICZTdHIsIEhleFByaW50U3R5bGUgU3R5bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgRGVmYXVsdCkgeworICAgIFN0ci5jb25zdW1lSW50ZWdlcigxMCwgRGVmYXVsdCk7CisgICAgaWYgKGlzUHJlZml4ZWRIZXhTdHlsZShTdHlsZSkpCisgICAgICBEZWZhdWx0ICs9IDI7CisgICAgcmV0dXJuIERlZmF1bHQ7CisgIH0KK307Cit9CisKKy8vLyBJbXBsZW1lbnRhdGlvbiBvZiBmb3JtYXRfcHJvdmlkZXI8VD4gZm9yIGludGVncmFsIGFyaXRobWV0aWMgdHlwZXMuCisvLy8KKy8vLyBUaGUgb3B0aW9ucyBzdHJpbmcgb2YgYW4gaW50ZWdyYWwgdHlwZSBoYXMgdGhlIGdyYW1tYXI6CisvLy8KKy8vLyAgIGludGVnZXJfb3B0aW9ucyAgIDo6IFtzdHlsZV1bZGlnaXRzXQorLy8vICAgc3R5bGUgICAgICAgICAgICAgOjogPHNlZSB0YWJsZSBiZWxvdz4KKy8vLyAgIGRpZ2l0cyAgICAgICAgICAgIDo6IDxub24tbmVnYXRpdmUgaW50ZWdlcj4gMC05OQorLy8vCisvLy8gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8vICAgfCAgc3R5bGUgIHwgICAgIE1lYW5pbmcgICAgICAgICAgfCAgICAgIEV4YW1wbGUgICAgIHwgRGlnaXRzIE1lYW5pbmcgICAgIHwKKy8vLyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8gICB8ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICB8ICBJbnB1dCB8ICBPdXRwdXQgfCAgICAgICAgICAgICAgICAgICAgfAorLy8vICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vLyAgIHwgICB4LSAgICB8IEhleCBubyBwcmVmaXgsIGxvd2VyIHwgICA0MiAgIHwgICAgMmEgICB8IE1pbmltdW0gIyBkaWdpdHMgICB8CisvLy8gICB8ICAgWC0gICAgfCBIZXggbm8gcHJlZml4LCB1cHBlciB8ICAgNDIgICB8ICAgIDJBICAgfCBNaW5pbXVtICMgZGlnaXRzICAgfAorLy8vICAgfCB4KyAvIHggIHwgSGV4ICsgcHJlZml4LCBsb3dlciAgfCAgIDQyICAgfCAgIDB4MmEgIHwgTWluaW11bSAjIGRpZ2l0cyAgIHwKKy8vLyAgIHwgWCsgLyBYICB8IEhleCArIHByZWZpeCwgdXBwZXIgIHwgICA0MiAgIHwgICAweDJBICB8IE1pbmltdW0gIyBkaWdpdHMgICB8CisvLy8gICB8IE4gLyBuICAgfCBEaWdpdCBncm91cGVkIG51bWJlciB8IDEyMzQ1NiB8IDEyMyw0NTYgfCBJZ25vcmVkICAgICAgICAgICAgfAorLy8vICAgfCBEIC8gZCAgIHwgSW50ZWdlciAgICAgICAgICAgICAgfCAxMDAwMDAgfCAxMDAwMDAgIHwgSWdub3JlZCAgICAgICAgICAgIHwKKy8vLyAgIHwgKGVtcHR5KSB8IFNhbWUgYXMgRCAvIGQgICAgICAgIHwgICAgICAgIHwgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICB8CisvLy8gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8vCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGZvcm1hdF9wcm92aWRlcjwKKyAgICBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxkZXRhaWw6OnVzZV9pbnRlZ3JhbF9mb3JtYXR0ZXI8VD46OnZhbHVlPjo6dHlwZT4KKyAgICA6IHB1YmxpYyBkZXRhaWw6OkhlbHBlckZ1bmN0aW9ucyB7Citwcml2YXRlOgorcHVibGljOgorICBzdGF0aWMgdm9pZCBmb3JtYXQoY29uc3QgVCAmViwgbGx2bTo6cmF3X29zdHJlYW0gJlN0cmVhbSwgU3RyaW5nUmVmIFN0eWxlKSB7CisgICAgSGV4UHJpbnRTdHlsZSBIUzsKKyAgICBzaXplX3QgRGlnaXRzID0gMDsKKyAgICBpZiAoY29uc3VtZUhleFN0eWxlKFN0eWxlLCBIUykpIHsKKyAgICAgIERpZ2l0cyA9IGNvbnN1bWVOdW1IZXhEaWdpdHMoU3R5bGUsIEhTLCAwKTsKKyAgICAgIHdyaXRlX2hleChTdHJlYW0sIFYsIEhTLCBEaWdpdHMpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEludGVnZXJTdHlsZSBJUyA9IEludGVnZXJTdHlsZTo6SW50ZWdlcjsKKyAgICBpZiAoU3R5bGUuY29uc3VtZV9mcm9udCgiTiIpIHx8IFN0eWxlLmNvbnN1bWVfZnJvbnQoIm4iKSkKKyAgICAgIElTID0gSW50ZWdlclN0eWxlOjpOdW1iZXI7CisgICAgZWxzZSBpZiAoU3R5bGUuY29uc3VtZV9mcm9udCgiRCIpIHx8IFN0eWxlLmNvbnN1bWVfZnJvbnQoImQiKSkKKyAgICAgIElTID0gSW50ZWdlclN0eWxlOjpJbnRlZ2VyOworCisgICAgU3R5bGUuY29uc3VtZUludGVnZXIoMTAsIERpZ2l0cyk7CisgICAgYXNzZXJ0KFN0eWxlLmVtcHR5KCkgJiYgIkludmFsaWQgaW50ZWdyYWwgZm9ybWF0IHN0eWxlISIpOworICAgIHdyaXRlX2ludGVnZXIoU3RyZWFtLCBWLCBEaWdpdHMsIElTKTsKKyAgfQorfTsKKworLy8vIEltcGxlbWVudGF0aW9uIG9mIGZvcm1hdF9wcm92aWRlcjxUPiBmb3IgaW50ZWdyYWwgcG9pbnRlciB0eXBlcy4KKy8vLworLy8vIFRoZSBvcHRpb25zIHN0cmluZyBvZiBhIHBvaW50ZXIgdHlwZSBoYXMgdGhlIGdyYW1tYXI6CisvLy8KKy8vLyAgIHBvaW50ZXJfb3B0aW9ucyAgIDo6IFtzdHlsZV1bcHJlY2lzaW9uXQorLy8vICAgc3R5bGUgICAgICAgICAgICAgOjogPHNlZSB0YWJsZSBiZWxvdz4KKy8vLyAgIGRpZ2l0cyAgICAgICAgICAgIDo6IDxub24tbmVnYXRpdmUgaW50ZWdlcj4gMC1zaXplb2Yodm9pZCopCisvLy8KKy8vLyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLy8gICB8ICAgUyAgICAgfCAgICAgTWVhbmluZyAgICAgICAgICB8ICAgICAgICAgICAgICAgIEV4YW1wbGUgICAgICAgICAgICAgICAgfAorLy8vICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vLyAgIHwgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgSW5wdXQgICAgICAgfCAgICAgIE91dHB1dCAgICAgICB8CisvLy8gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8vICAgfCAgIHgtICAgIHwgSGV4IG5vIHByZWZpeCwgbG93ZXIgfCAgICAweERFQURCRUVGICAgICB8ICAgICBkZWFkYmVlZiAgICAgIHwKKy8vLyAgIHwgICBYLSAgICB8IEhleCBubyBwcmVmaXgsIHVwcGVyIHwgICAgMHhERUFEQkVFRiAgICAgfCAgICAgREVBREJFRUYgICAgICB8CisvLy8gICB8IHgrIC8geCAgfCBIZXggKyBwcmVmaXgsIGxvd2VyICB8ICAgIDB4REVBREJFRUYgICAgIHwgICAgMHhkZWFkYmVlZiAgICAgfAorLy8vICAgfCBYKyAvIFggIHwgSGV4ICsgcHJlZml4LCB1cHBlciAgfCAgICAweERFQURCRUVGICAgICB8ICAgIDB4REVBREJFRUYgICAgIHwKKy8vLyAgIHwgKGVtcHR5KSB8IFNhbWUgYXMgWCsgLyBYICAgICAgIHwgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICB8CisvLy8gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8vCisvLy8gVGhlIGRlZmF1bHQgcHJlY2lzaW9uIGlzIHRoZSBudW1iZXIgb2YgbmliYmxlcyBpbiBhIG1hY2hpbmUgd29yZCwgYW5kIGluIGFsbAorLy8vIGNhc2VzIGluZGljYXRlcyB0aGUgbWluaW11bSBudW1iZXIgb2YgbmliYmxlcyB0byBwcmludC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGZvcm1hdF9wcm92aWRlcjwKKyAgICBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxkZXRhaWw6OnVzZV9wb2ludGVyX2Zvcm1hdHRlcjxUPjo6dmFsdWU+Ojp0eXBlPgorICAgIDogcHVibGljIGRldGFpbDo6SGVscGVyRnVuY3Rpb25zIHsKK3ByaXZhdGU6CitwdWJsaWM6CisgIHN0YXRpYyB2b2lkIGZvcm1hdChjb25zdCBUICZWLCBsbHZtOjpyYXdfb3N0cmVhbSAmU3RyZWFtLCBTdHJpbmdSZWYgU3R5bGUpIHsKKyAgICBIZXhQcmludFN0eWxlIEhTID0gSGV4UHJpbnRTdHlsZTo6UHJlZml4VXBwZXI7CisgICAgY29uc3VtZUhleFN0eWxlKFN0eWxlLCBIUyk7CisgICAgc2l6ZV90IERpZ2l0cyA9IGNvbnN1bWVOdW1IZXhEaWdpdHMoU3R5bGUsIEhTLCBzaXplb2Yodm9pZCAqKSAqIDIpOworICAgIHdyaXRlX2hleChTdHJlYW0sIHJlaW50ZXJwcmV0X2Nhc3Q8c3RkOjp1aW50cHRyX3Q+KFYpLCBIUywgRGlnaXRzKTsKKyAgfQorfTsKKworLy8vIEltcGxlbWVudGF0aW9uIG9mIGZvcm1hdF9wcm92aWRlcjxUPiBmb3IgYy1zdHlsZSBzdHJpbmdzIGFuZCBzdHJpbmcKKy8vLyBvYmplY3RzIHN1Y2ggYXMgc3RkOjpzdHJpbmcgYW5kIGxsdm06OlN0cmluZ1JlZi4KKy8vLworLy8vIFRoZSBvcHRpb25zIHN0cmluZyBvZiBhIHN0cmluZyB0eXBlIGhhcyB0aGUgZ3JhbW1hcjoKKy8vLworLy8vICAgc3RyaW5nX29wdGlvbnMgOjogW2xlbmd0aF0KKy8vLworLy8vIHdoZXJlIGBsZW5ndGhgIGlzIGFuIG9wdGlvbmFsIGludGVnZXIgc3BlY2lmeWluZyB0aGUgbWF4aW11bSBudW1iZXIgb2YKKy8vLyBjaGFyYWN0ZXJzIGluIHRoZSBzdHJpbmcgdG8gcHJpbnQuICBJZiBgbGVuZ3RoYCBpcyBvbWl0dGVkLCB0aGUgc3RyaW5nIGlzCisvLy8gcHJpbnRlZCB1cCB0byB0aGUgbnVsbCB0ZXJtaW5hdG9yLgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBmb3JtYXRfcHJvdmlkZXI8CisgICAgVCwgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8ZGV0YWlsOjp1c2Vfc3RyaW5nX2Zvcm1hdHRlcjxUPjo6dmFsdWU+Ojp0eXBlPiB7CisgIHN0YXRpYyB2b2lkIGZvcm1hdChjb25zdCBUICZWLCBsbHZtOjpyYXdfb3N0cmVhbSAmU3RyZWFtLCBTdHJpbmdSZWYgU3R5bGUpIHsKKyAgICBzaXplX3QgTiA9IFN0cmluZ1JlZjo6bnBvczsKKyAgICBpZiAoIVN0eWxlLmVtcHR5KCkgJiYgU3R5bGUuZ2V0QXNJbnRlZ2VyKDEwLCBOKSkgeworICAgICAgYXNzZXJ0KGZhbHNlICYmICJTdHlsZSBpcyBub3QgYSB2YWxpZCBpbnRlZ2VyIik7CisgICAgfQorICAgIGxsdm06OlN0cmluZ1JlZiBTID0gVjsKKyAgICBTdHJlYW0gPDwgUy5zdWJzdHIoMCwgTik7CisgIH0KK307CisKKy8vLyBJbXBsZW1lbnRhdGlvbiBvZiBmb3JtYXRfcHJvdmlkZXI8VD4gZm9yIGxsdm06OlR3aW5lLgorLy8vCisvLy8gVGhpcyBmb2xsb3dzIHRoZSBzYW1lIHJ1bGVzIGFzIHRoZSBzdHJpbmcgZm9ybWF0dGVyLgorCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgZm9ybWF0X3Byb3ZpZGVyPFR3aW5lPiB7CisgIHN0YXRpYyB2b2lkIGZvcm1hdChjb25zdCBUd2luZSAmViwgbGx2bTo6cmF3X29zdHJlYW0gJlN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTdHlsZSkgeworICAgIGZvcm1hdF9wcm92aWRlcjxzdGQ6OnN0cmluZz46OmZvcm1hdChWLnN0cigpLCBTdHJlYW0sIFN0eWxlKTsKKyAgfQorfTsKKworLy8vIEltcGxlbWVudGF0aW9uIG9mIGZvcm1hdF9wcm92aWRlcjxUPiBmb3IgY2hhcmFjdGVycy4KKy8vLworLy8vIFRoZSBvcHRpb25zIHN0cmluZyBvZiBhIGNoYXJhY3RlciB0eXBlIGhhcyB0aGUgZ3JhbW1hcjoKKy8vLworLy8vICAgY2hhcl9vcHRpb25zIDo6IChlbXB0eSkgfCBbaW50ZWdlcl9vcHRpb25zXQorLy8vCisvLy8gSWYgYGNoYXJfb3B0aW9uc2AgaXMgZW1wdHksIHRoZSBjaGFyYWN0ZXIgaXMgZGlzcGxheWVkIGFzIGFuIEFTQ0lJCisvLy8gY2hhcmFjdGVyLiAgT3RoZXJ3aXNlLCBpdCBpcyB0cmVhdGVkIGFzIGFuIGludGVnZXIgb3B0aW9ucyBzdHJpbmcuCisvLy8KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGZvcm1hdF9wcm92aWRlcjwKKyAgICBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxkZXRhaWw6OnVzZV9jaGFyX2Zvcm1hdHRlcjxUPjo6dmFsdWU+Ojp0eXBlPiB7CisgIHN0YXRpYyB2b2lkIGZvcm1hdChjb25zdCBjaGFyICZWLCBsbHZtOjpyYXdfb3N0cmVhbSAmU3RyZWFtLAorICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFN0eWxlKSB7CisgICAgaWYgKFN0eWxlLmVtcHR5KCkpCisgICAgICBTdHJlYW0gPDwgVjsKKyAgICBlbHNlIHsKKyAgICAgIGludCBYID0gc3RhdGljX2Nhc3Q8aW50PihWKTsKKyAgICAgIGZvcm1hdF9wcm92aWRlcjxpbnQ+Ojpmb3JtYXQoWCwgU3RyZWFtLCBTdHlsZSk7CisgICAgfQorICB9Cit9OworCisvLy8gSW1wbGVtZW50YXRpb24gb2YgZm9ybWF0X3Byb3ZpZGVyPFQ+IGZvciB0eXBlIGBib29sYAorLy8vCisvLy8gVGhlIG9wdGlvbnMgc3RyaW5nIG9mIGEgYm9vbGVhbiB0eXBlIGhhcyB0aGUgZ3JhbW1hcjoKKy8vLworLy8vICAgYm9vbF9vcHRpb25zIDo6ICIiIHwgIlkiIHwgInkiIHwgIkQiIHwgImQiIHwgIlQiIHwgInQiCisvLy8KKy8vLyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vLyAgIHwgICAgQyAgICB8ICAgICBNZWFuaW5nICAgICAgICAgIHwKKy8vLyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vLyAgIHwgICAgWSAgICB8ICAgICAgIFlFUyAvIE5PICAgICAgIHwKKy8vLyAgIHwgICAgeSAgICB8ICAgICAgIHllcyAvIG5vICAgICAgIHwKKy8vLyAgIHwgIEQgLyBkICB8ICAgIEludGVnZXIgMCBvciAxICAgIHwKKy8vLyAgIHwgICAgVCAgICB8ICAgICBUUlVFIC8gRkFMU0UgICAgIHwKKy8vLyAgIHwgICAgdCAgICB8ICAgICB0cnVlIC8gZmFsc2UgICAgIHwKKy8vLyAgIHwgKGVtcHR5KSB8ICAgRXF1aXZhbGVudCB0byAndCcgIHwKKy8vLyAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK3RlbXBsYXRlIDw+IHN0cnVjdCBmb3JtYXRfcHJvdmlkZXI8Ym9vbD4geworICBzdGF0aWMgdm9pZCBmb3JtYXQoY29uc3QgYm9vbCAmQiwgbGx2bTo6cmF3X29zdHJlYW0gJlN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTdHlsZSkgeworICAgIFN0cmVhbSA8PCBTdHJpbmdTd2l0Y2g8Y29uc3QgY2hhciAqPihTdHlsZSkKKyAgICAgICAgICAgICAgICAgIC5DYXNlKCJZIiwgQiA/ICJZRVMiIDogIk5PIikKKyAgICAgICAgICAgICAgICAgIC5DYXNlKCJ5IiwgQiA/ICJ5ZXMiIDogIm5vIikKKyAgICAgICAgICAgICAgICAgIC5DYXNlTG93ZXIoIkQiLCBCID8gIjEiIDogIjAiKQorICAgICAgICAgICAgICAgICAgLkNhc2UoIlQiLCBCID8gIlRSVUUiIDogIkZBTFNFIikKKyAgICAgICAgICAgICAgICAgIC5DYXNlcygidCIsICIiLCBCID8gInRydWUiIDogImZhbHNlIikKKyAgICAgICAgICAgICAgICAgIC5EZWZhdWx0KEIgPyAiMSIgOiAiMCIpOworICB9Cit9OworCisvLy8gSW1wbGVtZW50YXRpb24gb2YgZm9ybWF0X3Byb3ZpZGVyPFQ+IGZvciBmbG9hdGluZyBwb2ludCB0eXBlcy4KKy8vLworLy8vIFRoZSBvcHRpb25zIHN0cmluZyBvZiBhIGZsb2F0aW5nIHBvaW50IHR5cGUgaGFzIHRoZSBmb3JtYXQ6CisvLy8KKy8vLyAgIGZsb2F0X29wdGlvbnMgICA6OiBbc3R5bGVdW3ByZWNpc2lvbl0KKy8vLyAgIHN0eWxlICAgICAgICAgICA6OiA8c2VlIHRhYmxlIGJlbG93PgorLy8vICAgcHJlY2lzaW9uICAgICAgIDo6IDxub24tbmVnYXRpdmUgaW50ZWdlcj4gMC05OQorLy8vCisvLy8gICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8vICAgfCAgc3R5bGUgIHwgICAgIE1lYW5pbmcgICAgICAgICAgfCAgICAgIEV4YW1wbGUgICAgIHwKKy8vLyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8gICB8ICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICB8ICBJbnB1dCB8ICBPdXRwdXQgfAorLy8vICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vLyAgIHwgUCAvIHAgICB8IFBlcmNlbnRhZ2UgICAgICAgICAgIHwgIDAuMDUgIHwgIDUuMDAlICB8CisvLy8gICB8IEYgLyBmICAgfCBGaXhlZCBwb2ludCAgICAgICAgICB8ICAgMS4wICB8ICAxLjAwICAgfAorLy8vICAgfCAgIEUgICAgIHwgRXhwb25lbnRpYWwgd2l0aCBFICAgfCAxMDAwMDAgfCAxLjBFKzA1IHwKKy8vLyAgIHwgICBlICAgICB8IEV4cG9uZW50aWFsIHdpdGggZSAgIHwgMTAwMDAwIHwgMS4wZSswNSB8CisvLy8gICB8IChlbXB0eSkgfCBTYW1lIGFzIEYgLyBmICAgICAgICB8ICAgICAgICB8ICAgICAgICAgfAorLy8vICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vLworLy8vIFRoZSBkZWZhdWx0IHByZWNpc2lvbiBpcyA2IGZvciBleHBvbmVudGlhbCAoRSAvIGUpIGFuZCAyIGZvciBldmVyeXRoaW5nCisvLy8gZWxzZS4KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgZm9ybWF0X3Byb3ZpZGVyPAorICAgIFQsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGRldGFpbDo6dXNlX2RvdWJsZV9mb3JtYXR0ZXI8VD46OnZhbHVlPjo6dHlwZT4KKyAgICA6IHB1YmxpYyBkZXRhaWw6OkhlbHBlckZ1bmN0aW9ucyB7CisgIHN0YXRpYyB2b2lkIGZvcm1hdChjb25zdCBUICZWLCBsbHZtOjpyYXdfb3N0cmVhbSAmU3RyZWFtLCBTdHJpbmdSZWYgU3R5bGUpIHsKKyAgICBGbG9hdFN0eWxlIFM7CisgICAgaWYgKFN0eWxlLmNvbnN1bWVfZnJvbnQoIlAiKSB8fCBTdHlsZS5jb25zdW1lX2Zyb250KCJwIikpCisgICAgICBTID0gRmxvYXRTdHlsZTo6UGVyY2VudDsKKyAgICBlbHNlIGlmIChTdHlsZS5jb25zdW1lX2Zyb250KCJGIikgfHwgU3R5bGUuY29uc3VtZV9mcm9udCgiZiIpKQorICAgICAgUyA9IEZsb2F0U3R5bGU6OkZpeGVkOworICAgIGVsc2UgaWYgKFN0eWxlLmNvbnN1bWVfZnJvbnQoIkUiKSkKKyAgICAgIFMgPSBGbG9hdFN0eWxlOjpFeHBvbmVudFVwcGVyOworICAgIGVsc2UgaWYgKFN0eWxlLmNvbnN1bWVfZnJvbnQoImUiKSkKKyAgICAgIFMgPSBGbG9hdFN0eWxlOjpFeHBvbmVudDsKKyAgICBlbHNlCisgICAgICBTID0gRmxvYXRTdHlsZTo6Rml4ZWQ7CisKKyAgICBPcHRpb25hbDxzaXplX3Q+IFByZWNpc2lvbiA9IHBhcnNlTnVtZXJpY1ByZWNpc2lvbihTdHlsZSk7CisgICAgaWYgKCFQcmVjaXNpb24uaGFzVmFsdWUoKSkKKyAgICAgIFByZWNpc2lvbiA9IGdldERlZmF1bHRQcmVjaXNpb24oUyk7CisKKyAgICB3cml0ZV9kb3VibGUoU3RyZWFtLCBzdGF0aWNfY2FzdDxkb3VibGU+KFYpLCBTLCBQcmVjaXNpb24pOworICB9Cit9OworCituYW1lc3BhY2UgZGV0YWlsIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBJdGVyVD4KK3VzaW5nIEl0ZXJWYWx1ZSA9IHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXJUPjo6dmFsdWVfdHlwZTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJUPgorc3RydWN0IHJhbmdlX2l0ZW1faGFzX3Byb3ZpZGVyCisgICAgOiBwdWJsaWMgc3RkOjppbnRlZ3JhbF9jb25zdGFudDwKKyAgICAgICAgICBib29sLCAhdXNlc19taXNzaW5nX3Byb3ZpZGVyPEl0ZXJWYWx1ZTxJdGVyVD4+Ojp2YWx1ZT4ge307Cit9CisKKy8vLyBJbXBsZW1lbnRhdGlvbiBvZiBmb3JtYXRfcHJvdmlkZXI8VD4gZm9yIHJhbmdlcy4KKy8vLworLy8vIFRoaXMgd2lsbCBwcmludCBhbiBhcmJpdHJhcnkgcmFuZ2UgYXMgYSBkZWxpbWl0ZWQgc2VxdWVuY2Ugb2YgaXRlbXMuCisvLy8KKy8vLyBUaGUgb3B0aW9ucyBzdHJpbmcgb2YgYSByYW5nZSB0eXBlIGhhcyB0aGUgZ3JhbW1hcjoKKy8vLworLy8vICAgcmFuZ2Vfc3R5bGUgICAgICAgOjo9IFtzZXBhcmF0b3JdIFtlbGVtZW50X3N0eWxlXQorLy8vICAgc2VwYXJhdG9yICAgICAgICAgOjo9ICIkIiBkZWxpbWV0ZWRfZXhwcgorLy8vICAgZWxlbWVudF9zdHlsZSAgICAgOjo9ICJAIiBkZWxpbWV0ZWRfZXhwcgorLy8vICAgZGVsaW1ldGVkX2V4cHIgICAgOjo9ICJbIiBleHByICJdIiB8ICIoIiBleHByICIpIiB8ICI8IiBleHByICI+IgorLy8vICAgZXhwciAgICAgICAgICAgICAgOjo9IDxhbnkgc3RyaW5nIG5vdCBjb250YWluaW5nIGRlbGltZXRlcj4KKy8vLworLy8vIHdoZXJlIHRoZSBzZXBhcmF0b3IgZXhwcmVzc2lvbiBpcyB0aGUgc3RyaW5nIHRvIGluc2VydCBiZXR3ZWVuIGNvbnNlY3V0aXZlCisvLy8gaXRlbXMgaW4gdGhlIHJhbmdlIGFuZCB0aGUgYXJndW1lbnQgZXhwcmVzc2lvbiBpcyB0aGUgU3R5bGUgc3BlY2lmaWNhdGlvbiB0bworLy8vIGJlIHVzZWQgd2hlbiBmb3JtYXR0aW5nIHRoZSB1bmRlcmx5aW5nIHR5cGUuICBUaGUgZGVmYXVsdCBzZXBhcmF0b3IgaWYKKy8vLyB1bnNwZWNpZmllZCBpcyAnICcgKHNwYWNlKS4gIFRoZSBzeW50YXggb2YgdGhlIGFyZ3VtZW50IGV4cHJlc3Npb24gZm9sbG93cworLy8vIHdoYXRldmVyIGdyYW1tYXIgaXMgZGljdGF0ZWQgYnkgdGhlIGZvcm1hdCBwcm92aWRlciBvciBmb3JtYXQgYWRhcHRlciB1c2VkCisvLy8gdG8gZm9ybWF0IHRoZSB2YWx1ZSB0eXBlLgorLy8vCisvLy8gTm90ZSB0aGF0IGF0dGVtcHRpbmcgdG8gZm9ybWF0IGFuIGBpdGVyYXRvcl9yYW5nZTxUPmAgd2hlcmUgbm8gZm9ybWF0CisvLy8gcHJvdmlkZXIgY2FuIGJlIGZvdW5kIGZvciBUIHdpbGwgcmVzdWx0IGluIGEgY29tcGlsZSBlcnJvci4KKy8vLworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlclQ+IGNsYXNzIGZvcm1hdF9wcm92aWRlcjxsbHZtOjppdGVyYXRvcl9yYW5nZTxJdGVyVD4+IHsKKyAgdXNpbmcgdmFsdWUgPSB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyVD46OnZhbHVlX3R5cGU7CisgIHVzaW5nIHJlZmVyZW5jZSA9IHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEl0ZXJUPjo6cmVmZXJlbmNlOworCisgIHN0YXRpYyBTdHJpbmdSZWYgY29uc3VtZU9uZU9wdGlvbihTdHJpbmdSZWYgJlN0eWxlLCBjaGFyIEluZGljYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBEZWZhdWx0KSB7CisgICAgaWYgKFN0eWxlLmVtcHR5KCkpCisgICAgICByZXR1cm4gRGVmYXVsdDsKKyAgICBpZiAoU3R5bGUuZnJvbnQoKSAhPSBJbmRpY2F0b3IpCisgICAgICByZXR1cm4gRGVmYXVsdDsKKyAgICBTdHlsZSA9IFN0eWxlLmRyb3BfZnJvbnQoKTsKKyAgICBpZiAoU3R5bGUuZW1wdHkoKSkgeworICAgICAgYXNzZXJ0KGZhbHNlICYmICJJbnZhbGlkIHJhbmdlIHN0eWxlIik7CisgICAgICByZXR1cm4gRGVmYXVsdDsKKyAgICB9CisKKyAgICBmb3IgKGNvbnN0IGNoYXIgKkQgOiB7IltdIiwgIjw+IiwgIigpIn0pIHsKKyAgICAgIGlmIChTdHlsZS5mcm9udCgpICE9IERbMF0pCisgICAgICAgIGNvbnRpbnVlOworICAgICAgc2l6ZV90IEVuZCA9IFN0eWxlLmZpbmRfZmlyc3Rfb2YoRFsxXSk7CisgICAgICBpZiAoRW5kID09IFN0cmluZ1JlZjo6bnBvcykgeworICAgICAgICBhc3NlcnQoZmFsc2UgJiYgIk1pc3NpbmcgcmFuZ2Ugb3B0aW9uIGVuZCBkZWxpbWV0ZXIhIik7CisgICAgICAgIHJldHVybiBEZWZhdWx0OworICAgICAgfQorICAgICAgU3RyaW5nUmVmIFJlc3VsdCA9IFN0eWxlLnNsaWNlKDEsIEVuZCk7CisgICAgICBTdHlsZSA9IFN0eWxlLmRyb3BfZnJvbnQoRW5kICsgMSk7CisgICAgICByZXR1cm4gUmVzdWx0OworICAgIH0KKyAgICBhc3NlcnQoZmFsc2UgJiYgIkludmFsaWQgcmFuZ2Ugc3R5bGUhIik7CisgICAgcmV0dXJuIERlZmF1bHQ7CisgIH0KKworICBzdGF0aWMgc3RkOjpwYWlyPFN0cmluZ1JlZiwgU3RyaW5nUmVmPiBwYXJzZU9wdGlvbnMoU3RyaW5nUmVmIFN0eWxlKSB7CisgICAgU3RyaW5nUmVmIFNlcCA9IGNvbnN1bWVPbmVPcHRpb24oU3R5bGUsICckJywgIiwgIik7CisgICAgU3RyaW5nUmVmIEFyZ3MgPSBjb25zdW1lT25lT3B0aW9uKFN0eWxlLCAnQCcsICIiKTsKKyAgICBhc3NlcnQoU3R5bGUuZW1wdHkoKSAmJiAiVW5leHBlY3RlZCB0ZXh0IGluIHJhbmdlIG9wdGlvbiBzdHJpbmchIik7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKFNlcCwgQXJncyk7CisgIH0KKworcHVibGljOgorICBzdGF0aWNfYXNzZXJ0KGRldGFpbDo6cmFuZ2VfaXRlbV9oYXNfcHJvdmlkZXI8SXRlclQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAiUmFuZ2UgdmFsdWVfdHlwZSBkb2VzIG5vdCBoYXZlIGEgZm9ybWF0IHByb3ZpZGVyISIpOworICBzdGF0aWMgdm9pZCBmb3JtYXQoY29uc3QgbGx2bTo6aXRlcmF0b3JfcmFuZ2U8SXRlclQ+ICZWLAorICAgICAgICAgICAgICAgICAgICAgbGx2bTo6cmF3X29zdHJlYW0gJlN0cmVhbSwgU3RyaW5nUmVmIFN0eWxlKSB7CisgICAgU3RyaW5nUmVmIFNlcDsKKyAgICBTdHJpbmdSZWYgQXJnU3R5bGU7CisgICAgc3RkOjp0aWUoU2VwLCBBcmdTdHlsZSkgPSBwYXJzZU9wdGlvbnMoU3R5bGUpOworICAgIGF1dG8gQmVnaW4gPSBWLmJlZ2luKCk7CisgICAgYXV0byBFbmQgPSBWLmVuZCgpOworICAgIGlmIChCZWdpbiAhPSBFbmQpIHsKKyAgICAgIGF1dG8gQWRhcHRlciA9CisgICAgICAgICAgZGV0YWlsOjpidWlsZF9mb3JtYXRfYWRhcHRlcihzdGQ6OmZvcndhcmQ8cmVmZXJlbmNlPigqQmVnaW4pKTsKKyAgICAgIEFkYXB0ZXIuZm9ybWF0KFN0cmVhbSwgQXJnU3R5bGUpOworICAgICAgKytCZWdpbjsKKyAgICB9CisgICAgd2hpbGUgKEJlZ2luICE9IEVuZCkgeworICAgICAgU3RyZWFtIDw8IFNlcDsKKyAgICAgIGF1dG8gQWRhcHRlciA9CisgICAgICAgICAgZGV0YWlsOjpidWlsZF9mb3JtYXRfYWRhcHRlcihzdGQ6OmZvcndhcmQ8cmVmZXJlbmNlPigqQmVnaW4pKTsKKyAgICAgIEFkYXB0ZXIuZm9ybWF0KFN0cmVhbSwgQXJnU3R5bGUpOworICAgICAgKytCZWdpbjsKKyAgICB9CisgIH0KK307Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Zvcm1hdFZhcmlhZGljLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRm9ybWF0VmFyaWFkaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YzA4YTdkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Zvcm1hdFZhcmlhZGljLmgKQEAgLTAsMCArMSwyNzAgQEAKKy8vPT09LSBGb3JtYXRWYXJpYWRpYy5oIC0gRWZmaWNpZW50IHR5cGUtc2FmZSBzdHJpbmcgZm9ybWF0dGluZyAtLSotIEMrKy0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIGZvcm1hdHYoKSBmdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB3aXRoIG90aGVyIExMVk0KKy8vIHN1YnN5c3RlbXMgdG8gcHJvdmlkZSBwcmludGYtbGlrZSBmb3JtYXR0aW5nLCBidXQgd2l0aCBpbXByb3ZlZCBzYWZldHkgYW5kCisvLyBmbGV4aWJpbGl0eS4gIFRoZSByZXN1bHQgb2YgYGZvcm1hdHZgIGlzIGFuIG9iamVjdCB3aGljaCBjYW4gYmUgc3RyZWFtZWQgdG8KKy8vIGEgcmF3X29zdHJlYW0gb3IgY29udmVydGVkIHRvIGEgc3RkOjpzdHJpbmcgb3IgbGx2bTo6U21hbGxTdHJpbmcuCisvLworLy8gICAvLyBDb252ZXJ0IHRvIHN0ZDo6c3RyaW5nLgorLy8gICBzdGQ6OnN0cmluZyBTID0gZm9ybWF0digiezB9IHsxfSIsIDEyMzQuNDEyLCAidGVzdCIpLnN0cigpOworLy8KKy8vICAgLy8gQ29udmVydCB0byBsbHZtOjpTbWFsbFN0cmluZworLy8gICBTbWFsbFN0cmluZzw4PiBTID0gZm9ybWF0digiezB9IHsxfSIsIDEyMzQuNDEyLCAidGVzdCIpLnNzdHI8OD4oKTsKKy8vCisvLyAgIC8vIFN0cmVhbSB0byBhbiBleGlzdGluZyByYXdfb3N0cmVhbS4KKy8vICAgT1MgPDwgZm9ybWF0digiezB9IHsxfSIsIDEyMzQuNDEyLCAidGVzdCIpOworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0ZPUk1BVFZBUklBRElDX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0ZPUk1BVFZBUklBRElDX0gKKworI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxTdHJpbmcuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0Q29tbW9uLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Zvcm1hdFByb3ZpZGVycy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Gb3JtYXRWYXJpYWRpY0RldGFpbHMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0dXBsZT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitlbnVtIGNsYXNzIFJlcGxhY2VtZW50VHlwZSB7IEVtcHR5LCBGb3JtYXQsIExpdGVyYWwgfTsKKworc3RydWN0IFJlcGxhY2VtZW50SXRlbSB7CisgIFJlcGxhY2VtZW50SXRlbSgpID0gZGVmYXVsdDsKKyAgZXhwbGljaXQgUmVwbGFjZW1lbnRJdGVtKFN0cmluZ1JlZiBMaXRlcmFsKQorICAgICAgOiBUeXBlKFJlcGxhY2VtZW50VHlwZTo6TGl0ZXJhbCksIFNwZWMoTGl0ZXJhbCkge30KKyAgUmVwbGFjZW1lbnRJdGVtKFN0cmluZ1JlZiBTcGVjLCBzaXplX3QgSW5kZXgsIHNpemVfdCBBbGlnbiwgQWxpZ25TdHlsZSBXaGVyZSwKKyAgICAgICAgICAgICAgICAgIGNoYXIgUGFkLCBTdHJpbmdSZWYgT3B0aW9ucykKKyAgICAgIDogVHlwZShSZXBsYWNlbWVudFR5cGU6OkZvcm1hdCksIFNwZWMoU3BlYyksIEluZGV4KEluZGV4KSwgQWxpZ24oQWxpZ24pLAorICAgICAgICBXaGVyZShXaGVyZSksIFBhZChQYWQpLCBPcHRpb25zKE9wdGlvbnMpIHt9CisKKyAgUmVwbGFjZW1lbnRUeXBlIFR5cGUgPSBSZXBsYWNlbWVudFR5cGU6OkVtcHR5OworICBTdHJpbmdSZWYgU3BlYzsKKyAgc2l6ZV90IEluZGV4ID0gMDsKKyAgc2l6ZV90IEFsaWduID0gMDsKKyAgQWxpZ25TdHlsZSBXaGVyZSA9IEFsaWduU3R5bGU6OlJpZ2h0OworICBjaGFyIFBhZDsKKyAgU3RyaW5nUmVmIE9wdGlvbnM7Cit9OworCitjbGFzcyBmb3JtYXR2X29iamVjdF9iYXNlIHsKK3Byb3RlY3RlZDoKKyAgLy8gVGhlIHBhcmFtZXRlcnMgYXJlIHN0b3JlZCBpbiBhIHN0ZDo6dHVwbGUsIHdoaWNoIGRvZXMgbm90IHByb3ZpZGUgcnVudGltZQorICAvLyBpbmRleGluZyBjYXBhYmlsaXRpZXMuICBJbiBvcmRlciB0byBlbmFibGUgcnVudGltZSBpbmRleGluZywgd2UgdXNlIHRoaXMKKyAgLy8gc3RydWN0dXJlIHRvIHB1dCB0aGUgcGFyYW1ldGVycyBpbnRvIGEgc3RkOjp2ZWN0b3IuICBTaW5jZSB0aGUgcGFyYW1ldGVycworICAvLyBhcmUgbm90IGFsbCB0aGUgc2FtZSB0eXBlLCB3ZSB1c2Ugc29tZSB0eXBlLWVyYXN1cmUgYnkgd3JhcHBpbmcgdGhlCisgIC8vIHBhcmFtZXRlcnMgaW4gYSB0ZW1wbGF0ZSBjbGFzcyB0aGF0IGRlcml2ZXMgZnJvbSBhIG5vbi10ZW1wbGF0ZSBzdXBlcmNsYXNzLgorICAvLyBFc3NlbnRpYWxseSwgd2UgYXJlIGNvbnZlcnRpbmcgYSBzdGQ6OnR1cGxlPERlcml2ZWQ8VHMuLi4+PiB0byBhCisgIC8vIHN0ZDo6dmVjdG9yPEJhc2UqPi4KKyAgc3RydWN0IGNyZWF0ZV9hZGFwdGVycyB7CisgICAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFRzPgorICAgIHN0ZDo6dmVjdG9yPGRldGFpbDo6Zm9ybWF0X2FkYXB0ZXIgKj4gb3BlcmF0b3IoKShUcyAmLi4uIEl0ZW1zKSB7CisgICAgICByZXR1cm4gc3RkOjp2ZWN0b3I8ZGV0YWlsOjpmb3JtYXRfYWRhcHRlciAqPnsmSXRlbXMuLi59OworICAgIH0KKyAgfTsKKworICBTdHJpbmdSZWYgRm10OworICBzdGQ6OnZlY3RvcjxkZXRhaWw6OmZvcm1hdF9hZGFwdGVyICo+IEFkYXB0ZXJzOworICBzdGQ6OnZlY3RvcjxSZXBsYWNlbWVudEl0ZW0+IFJlcGxhY2VtZW50czsKKworICBzdGF0aWMgYm9vbCBjb25zdW1lRmllbGRMYXlvdXQoU3RyaW5nUmVmICZTcGVjLCBBbGlnblN0eWxlICZXaGVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCAmQWxpZ24sIGNoYXIgJlBhZCk7CisKKyAgc3RhdGljIHN0ZDo6cGFpcjxSZXBsYWNlbWVudEl0ZW0sIFN0cmluZ1JlZj4KKyAgc3BsaXRMaXRlcmFsQW5kUmVwbGFjZW1lbnQoU3RyaW5nUmVmIEZtdCk7CisKK3B1YmxpYzoKKyAgZm9ybWF0dl9vYmplY3RfYmFzZShTdHJpbmdSZWYgRm10LCBzdGQ6OnNpemVfdCBQYXJhbUNvdW50KQorICAgICAgOiBGbXQoRm10KSwgUmVwbGFjZW1lbnRzKHBhcnNlRm9ybWF0U3RyaW5nKEZtdCkpIHsKKyAgICBBZGFwdGVycy5yZXNlcnZlKFBhcmFtQ291bnQpOworICB9CisKKyAgZm9ybWF0dl9vYmplY3RfYmFzZShmb3JtYXR2X29iamVjdF9iYXNlIGNvbnN0ICZyaHMpID0gZGVsZXRlOworCisgIGZvcm1hdHZfb2JqZWN0X2Jhc2UoZm9ybWF0dl9vYmplY3RfYmFzZSAmJnJocykKKyAgICAgIDogRm10KHN0ZDo6bW92ZShyaHMuRm10KSksCisgICAgICAgIEFkYXB0ZXJzKCksIC8vIEFkYXB0ZXJzIGFyZSBpbml0aWFsaXplZCBieSBmb3JtYXR2X29iamVjdAorICAgICAgICBSZXBsYWNlbWVudHMoc3RkOjptb3ZlKHJocy5SZXBsYWNlbWVudHMpKSB7CisgICAgQWRhcHRlcnMucmVzZXJ2ZShyaHMuQWRhcHRlcnMuc2l6ZSgpKTsKKyAgfTsKKworICB2b2lkIGZvcm1hdChyYXdfb3N0cmVhbSAmUykgY29uc3QgeworICAgIGZvciAoYXV0byAmUiA6IFJlcGxhY2VtZW50cykgeworICAgICAgaWYgKFIuVHlwZSA9PSBSZXBsYWNlbWVudFR5cGU6OkVtcHR5KQorICAgICAgICBjb250aW51ZTsKKyAgICAgIGlmIChSLlR5cGUgPT0gUmVwbGFjZW1lbnRUeXBlOjpMaXRlcmFsKSB7CisgICAgICAgIFMgPDwgUi5TcGVjOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIGlmIChSLkluZGV4ID49IEFkYXB0ZXJzLnNpemUoKSkgeworICAgICAgICBTIDw8IFIuU3BlYzsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIGF1dG8gVyA9IEFkYXB0ZXJzW1IuSW5kZXhdOworCisgICAgICBGbXRBbGlnbiBBbGlnbigqVywgUi5XaGVyZSwgUi5BbGlnbik7CisgICAgICBBbGlnbi5mb3JtYXQoUywgUi5PcHRpb25zKTsKKyAgICB9CisgIH0KKyAgc3RhdGljIHN0ZDo6dmVjdG9yPFJlcGxhY2VtZW50SXRlbT4gcGFyc2VGb3JtYXRTdHJpbmcoU3RyaW5nUmVmIEZtdCk7CisKKyAgc3RhdGljIE9wdGlvbmFsPFJlcGxhY2VtZW50SXRlbT4gcGFyc2VSZXBsYWNlbWVudEl0ZW0oU3RyaW5nUmVmIFNwZWMpOworCisgIHN0ZDo6c3RyaW5nIHN0cigpIGNvbnN0IHsKKyAgICBzdGQ6OnN0cmluZyBSZXN1bHQ7CisgICAgcmF3X3N0cmluZ19vc3RyZWFtIFN0cmVhbShSZXN1bHQpOworICAgIFN0cmVhbSA8PCAqdGhpczsKKyAgICBTdHJlYW0uZmx1c2goKTsKKyAgICByZXR1cm4gUmVzdWx0OworICB9CisKKyAgdGVtcGxhdGUgPHVuc2lnbmVkIE4+IFNtYWxsU3RyaW5nPE4+IHNzdHIoKSBjb25zdCB7CisgICAgU21hbGxTdHJpbmc8Tj4gUmVzdWx0OworICAgIHJhd19zdmVjdG9yX29zdHJlYW0gU3RyZWFtKFJlc3VsdCk7CisgICAgU3RyZWFtIDw8ICp0aGlzOworICAgIHJldHVybiBSZXN1bHQ7CisgIH0KKworICB0ZW1wbGF0ZSA8dW5zaWduZWQgTj4gb3BlcmF0b3IgU21hbGxTdHJpbmc8Tj4oKSBjb25zdCB7IHJldHVybiBzc3RyPE4+KCk7IH0KKworICBvcGVyYXRvciBzdGQ6OnN0cmluZygpIGNvbnN0IHsgcmV0dXJuIHN0cigpOyB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHVwbGU+IGNsYXNzIGZvcm1hdHZfb2JqZWN0IDogcHVibGljIGZvcm1hdHZfb2JqZWN0X2Jhc2UgeworICAvLyBTdG9yYWdlIGZvciB0aGUgcGFyYW1ldGVyIGFkYXB0ZXJzLiAgU2luY2UgdGhlIGJhc2UgY2xhc3MgZXJhc2VzIHRoZSB0eXBlCisgIC8vIG9mIHRoZSBwYXJhbWV0ZXJzLCB3ZSBoYXZlIHRvIG93biB0aGUgc3RvcmFnZSBmb3IgdGhlIHBhcmFtZXRlcnMgaGVyZSwgYW5kCisgIC8vIGhhdmUgdGhlIGJhc2UgY2xhc3Mgc3RvcmUgdHlwZS1lcmFzZWQgcG9pbnRlcnMgaW50byB0aGlzIHR1cGxlLgorICBUdXBsZSBQYXJhbWV0ZXJzOworCitwdWJsaWM6CisgIGZvcm1hdHZfb2JqZWN0KFN0cmluZ1JlZiBGbXQsIFR1cGxlICYmUGFyYW1zKQorICAgICAgOiBmb3JtYXR2X29iamVjdF9iYXNlKEZtdCwgc3RkOjp0dXBsZV9zaXplPFR1cGxlPjo6dmFsdWUpLAorICAgICAgICBQYXJhbWV0ZXJzKHN0ZDo6bW92ZShQYXJhbXMpKSB7CisgICAgQWRhcHRlcnMgPSBhcHBseV90dXBsZShjcmVhdGVfYWRhcHRlcnMoKSwgUGFyYW1ldGVycyk7CisgIH0KKworICBmb3JtYXR2X29iamVjdChmb3JtYXR2X29iamVjdCBjb25zdCAmcmhzKSA9IGRlbGV0ZTsKKworICBmb3JtYXR2X29iamVjdChmb3JtYXR2X29iamVjdCAmJnJocykKKyAgICAgIDogZm9ybWF0dl9vYmplY3RfYmFzZShzdGQ6Om1vdmUocmhzKSksCisgICAgICAgIFBhcmFtZXRlcnMoc3RkOjptb3ZlKHJocy5QYXJhbWV0ZXJzKSkgeworICAgIEFkYXB0ZXJzID0gYXBwbHlfdHVwbGUoY3JlYXRlX2FkYXB0ZXJzKCksIFBhcmFtZXRlcnMpOworICB9Cit9OworCisvLyBcYnJpZWYgRm9ybWF0IHRleHQgZ2l2ZW4gYSBmb3JtYXQgc3RyaW5nIGFuZCByZXBsYWNlbWVudCBwYXJhbWV0ZXJzLgorLy8KKy8vID09PUdlbmVyYWwgRGVzY3JpcHRpb249PT0KKy8vCisvLyBGb3JtYXRzIHRleHR1YWwgb3V0cHV0LiAgYEZtdGAgaXMgYSBzdHJpbmcgY29uc2lzdGluZyBvZiBvbmUgb3IgbW9yZQorLy8gcmVwbGFjZW1lbnQgc2VxdWVuY2VzIHdpdGggdGhlIGZvbGxvd2luZyBncmFtbWFyOgorLy8KKy8vIHJlcF9maWVsZCA6Oj0gInsiIFtpbmRleF0gWyIsIiBsYXlvdXRdIFsiOiIgZm9ybWF0XSAifSIKKy8vIGluZGV4ICAgICA6Oj0gPG5vbi1uZWdhdGl2ZSBpbnRlZ2VyPgorLy8gbGF5b3V0ICAgIDo6PSBbW1tjaGFyXWxvY113aWR0aF0KKy8vIGZvcm1hdCAgICA6Oj0gPGFueSBzdHJpbmcgbm90IGNvbnRhaW5pbmcgInsiIG9yICJ9Ij4KKy8vIGNoYXIgICAgICA6Oj0gPGFueSBjaGFyYWN0ZXIgZXhjZXB0ICJ7IiBvciAifSI+CisvLyBsb2MgICAgICAgOjo9ICItIiB8ICI9IiB8ICIrIgorLy8gd2lkdGggICAgIDo6PSA8cG9zaXRpdmUgaW50ZWdlcj4KKy8vCisvLyBpbmRleCAgIC0gQSBub24tbmVnYXRpdmUgaW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBpbmRleCBvZiB0aGUgaXRlbSBpbiB0aGUKKy8vICAgICAgICAgICBwYXJhbWV0ZXIgcGFjayB0byBwcmludC4gIEFueSBvdGhlciB2YWx1ZSBpcyBpbnZhbGlkLgorLy8gbGF5b3V0ICAtIEEgc3RyaW5nIGNvbnRyb2xsaW5nIGhvdyB0aGUgZmllbGQgaXMgbGFpZCBvdXQgd2l0aGluIHRoZSBhdmFpbGFibGUKKy8vICAgICAgICAgICBzcGFjZS4KKy8vIGZvcm1hdCAgLSBBIHR5cGUtZGVwZW5kZW50IHN0cmluZyB1c2VkIHRvIHByb3ZpZGUgYWRkaXRpb25hbCBvcHRpb25zIHRvCisvLyAgICAgICAgICAgdGhlIGZvcm1hdHRpbmcgb3BlcmF0aW9uLiAgUmVmZXIgdG8gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlCisvLyAgICAgICAgICAgdmFyaW91cyBpbmRpdmlkdWFsIGZvcm1hdCBwcm92aWRlcnMgZm9yIHBlci10eXBlIG9wdGlvbnMuCisvLyBjaGFyICAgIC0gVGhlIHBhZGRpbmcgY2hhcmFjdGVyLiAgRGVmYXVsdHMgdG8gJyAnIChzcGFjZSkuICBPbmx5IHZhbGlkIGlmCisvLyAgICAgICAgICAgYGxvY2AgaXMgYWxzbyBzcGVjaWZpZWQuCisvLyBsb2MgICAgIC0gV2hlcmUgdG8gcHJpbnQgdGhlIGZvcm1hdHRlZCB0ZXh0IHdpdGhpbiB0aGUgZmllbGQuICBPbmx5IHZhbGlkIGlmCisvLyAgICAgICAgICAgYHdpZHRoYCBpcyBhbHNvIHNwZWNpZmllZC4KKy8vICAgICAgICAgICAnLScgOiBUaGUgZmllbGQgaXMgbGVmdCBhbGlnbmVkIHdpdGhpbiB0aGUgYXZhaWxhYmxlIHNwYWNlLgorLy8gICAgICAgICAgICc9JyA6IFRoZSBmaWVsZCBpcyBjZW50ZXJlZCB3aXRoaW4gdGhlIGF2YWlsYWJsZSBzcGFjZS4KKy8vICAgICAgICAgICAnKycgOiBUaGUgZmllbGQgaXMgcmlnaHQgYWxpZ25lZCB3aXRoaW4gdGhlIGF2YWlsYWJsZSBzcGFjZSAodGhpcworLy8gICAgICAgICAgICAgICAgIGlzIHRoZSBkZWZhdWx0KS4KKy8vIHdpZHRoICAgLSBUaGUgd2lkdGggb2YgdGhlIGZpZWxkIHdpdGhpbiB3aGljaCB0byBwcmludCB0aGUgZm9ybWF0dGVkIHRleHQuCisvLyAgICAgICAgICAgSWYgdGhpcyBpcyBsZXNzIHRoYW4gdGhlIHJlcXVpcmVkIGxlbmd0aCB0aGVuIHRoZSBgY2hhcmAgYW5kIGBsb2NgCisvLyAgICAgICAgICAgZmllbGRzIGFyZSBpZ25vcmVkLCBhbmQgdGhlIGZpZWxkIGlzIHByaW50ZWQgd2l0aCBubyBsZWFkaW5nIG9yCisvLyAgICAgICAgICAgdHJhaWxpbmcgcGFkZGluZy4gIElmIHRoaXMgaXMgZ3JlYXRlciB0aGFuIHRoZSByZXF1aXJlZCBsZW5ndGgsCisvLyAgICAgICAgICAgdGhlbiB0aGUgdGV4dCBpcyBvdXRwdXQgYWNjb3JkaW5nIHRvIHRoZSB2YWx1ZSBvZiBgbG9jYCwgYW5kIHBhZGRlZAorLy8gICAgICAgICAgIGFzIGFwcHJvcHJpYXRlIG9uIHRoZSBsZWZ0IGFuZC9vciByaWdodCBieSBgY2hhcmAuCisvLworLy8gPT09U3BlY2lhbCBDaGFyYWN0ZXJzPT09CisvLworLy8gVGhlIGNoYXJhY3RlcnMgJ3snIGFuZCAnfScgYXJlIHJlc2VydmVkIGFuZCBjYW5ub3QgYXBwZWFyIGFueXdoZXJlIHdpdGhpbiBhCisvLyByZXBsYWNlbWVudCBzZXF1ZW5jZS4gIE91dHNpZGUgb2YgYSByZXBsYWNlbWVudCBzZXF1ZW5jZSwgaW4gb3JkZXIgdG8gcHJpbnQKKy8vIGEgbGl0ZXJhbCAneycgb3IgJ30nIGl0IG11c3QgYmUgZG91YmxlZCAtLSAie3siIHRvIHByaW50IGEgbGl0ZXJhbCAneycgYW5kCisvLyAifX0iIHRvIHByaW50IGEgbGl0ZXJhbCAnfScuCisvLworLy8gPT09UGFyYW1ldGVyIEluZGV4aW5nPT09CisvLyBgaW5kZXhgIHNwZWNpZmllcyB0aGUgaW5kZXggb2YgdGhlIHBhcmFtZXRlciBpbiB0aGUgcGFyYW1ldGVyIHBhY2sgdG8gZm9ybWF0CisvLyBpbnRvIHRoZSBvdXRwdXQuICBOb3RlIHRoYXQgaXQgaXMgcG9zc2libGUgdG8gcmVmZXIgdG8gdGhlIHNhbWUgcGFyYW1ldGVyCisvLyBpbmRleCBtdWx0aXBsZSB0aW1lcyBpbiBhIGdpdmVuIGZvcm1hdCBzdHJpbmcuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlIHRvCisvLyBvdXRwdXQgdGhlIHNhbWUgdmFsdWUgbXVsdGlwbGUgdGltZXMgd2l0aG91dCBwYXNzaW5nIGl0IG11bHRpcGxlIHRpbWVzIHRvIHRoZQorLy8gZnVuY3Rpb24uIEZvciBleGFtcGxlOgorLy8KKy8vICAgZm9ybWF0digiezB9IHsxfSB7MH0iLCAiYSIsICJiYiIpCisvLworLy8gd291bGQgeWllbGQgdGhlIHN0cmluZyAiYWJiYSIuICBUaGlzIGNhbiBiZSBjb252ZW5pZW50IHdoZW4gaXQgaXMgZXhwZW5zaXZlCisvLyB0byBjb21wdXRlIHRoZSB2YWx1ZSBvZiB0aGUgcGFyYW1ldGVyLCBhbmQgeW91IHdvdWxkIG90aGVyd2lzZSBoYXZlIGhhZCB0bworLy8gc2F2ZSBpdCB0byBhIHRlbXBvcmFyeS4KKy8vCisvLyA9PT1Gb3JtYXR0ZXIgU2VhcmNoPT09CisvLworLy8gRm9yIGEgZ2l2ZW4gcGFyYW1ldGVyIG9mIHR5cGUgVCwgdGhlIGZvbGxvd2luZyBzdGVwcyBhcmUgZXhlY3V0ZWQgaW4gb3JkZXIKKy8vIHVudGlsIGEgbWF0Y2ggaXMgZm91bmQ6CisvLworLy8gICAxLiBJZiB0aGUgcGFyYW1ldGVyIGlzIG9mIGNsYXNzIHR5cGUsIGFuZCBpbmhlcml0cyBmcm9tIGZvcm1hdF9hZGFwdGVyLAorLy8gICAgICBUaGVuIGZvcm1hdCgpIGlzIGludm9rZWQgb24gaXQgdG8gcHJvZHVjZSB0aGUgZm9ybWF0dGVkIG91dHB1dC4gIFRoZQorLy8gICAgICBpbXBsZW1lbnRhdGlvbiBzaG91bGQgd3JpdGUgdGhlIGZvcm1hdHRlZCB0ZXh0IGludG8gYFN0cmVhbWAuCisvLyAgIDIuIElmIHRoZXJlIGlzIGEgc3VpdGFibGUgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gb2YgZm9ybWF0X3Byb3ZpZGVyPD4KKy8vICAgICAgZm9yIHR5cGUgVCBjb250YWluaW5nIGEgbWV0aG9kIHdob3NlIHNpZ25hdHVyZSBpczoKKy8vICAgICAgdm9pZCBmb3JtYXQoY29uc3QgVCAmT2JqLCByYXdfb3N0cmVhbSAmU3RyZWFtLCBTdHJpbmdSZWYgT3B0aW9ucykKKy8vICAgICAgVGhlbiB0aGlzIG1ldGhvZCBpcyBpbnZva2VkIGFzIGRlc2NyaWJlZCBpbiBTdGVwIDEuCisvLworLy8gSWYgYSBtYXRjaCBjYW5ub3QgYmUgZm91bmQgdGhyb3VnaCBlaXRoZXIgb2YgdGhlIGFib3ZlIG1ldGhvZHMsIGEgY29tcGlsZXIKKy8vIGVycm9yIGlzIGdlbmVyYXRlZC4KKy8vCisvLyA9PT1JbnZhbGlkIEZvcm1hdCBTdHJpbmcgSGFuZGxpbmc9PT0KKy8vCisvLyBJbiB0aGUgY2FzZSBvZiBhIGZvcm1hdCBzdHJpbmcgd2hpY2ggZG9lcyBub3QgbWF0Y2ggdGhlIGdyYW1tYXIgZGVzY3JpYmVkCisvLyBhYm92ZSwgdGhlIG91dHB1dCBpcyB1bmRlZmluZWQuICBXaXRoIGFzc2VydHMgZW5hYmxlZCwgTExWTSB3aWxsIHRyaWdnZXIgYW4KKy8vIGFzc2VydGlvbi4gIE90aGVyd2lzZSwgaXQgd2lsbCB0cnkgdG8gZG8gc29tZXRoaW5nIHJlYXNvbmFibGUsIGJ1dCBpbiBnZW5lcmFsCisvLyB0aGUgZGV0YWlscyBvZiB3aGF0IHRoYXQgaXMgYXJlIHVuZGVmaW5lZC4KKy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVHM+CitpbmxpbmUgYXV0byBmb3JtYXR2KGNvbnN0IGNoYXIgKkZtdCwgVHMgJiYuLi4gVmFscykgLT4gZm9ybWF0dl9vYmplY3Q8ZGVjbHR5cGUoCisgICAgc3RkOjptYWtlX3R1cGxlKGRldGFpbDo6YnVpbGRfZm9ybWF0X2FkYXB0ZXIoc3RkOjpmb3J3YXJkPFRzPihWYWxzKSkuLi4pKT4geworICB1c2luZyBQYXJhbVR1cGxlID0gZGVjbHR5cGUoCisgICAgICBzdGQ6Om1ha2VfdHVwbGUoZGV0YWlsOjpidWlsZF9mb3JtYXRfYWRhcHRlcihzdGQ6OmZvcndhcmQ8VHM+KFZhbHMpKS4uLikpOworICByZXR1cm4gZm9ybWF0dl9vYmplY3Q8UGFyYW1UdXBsZT4oCisgICAgICBGbXQsCisgICAgICBzdGQ6Om1ha2VfdHVwbGUoZGV0YWlsOjpidWlsZF9mb3JtYXRfYWRhcHRlcihzdGQ6OmZvcndhcmQ8VHM+KFZhbHMpKS4uLikpOworfQorCisvLyBBbGxvdyBhIGZvcm1hdHZfb2JqZWN0IHRvIGJlIGZvcm1hdHRlZCAobm8gb3B0aW9ucyBzdXBwb3J0ZWQpLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBmb3JtYXRfcHJvdmlkZXI8Zm9ybWF0dl9vYmplY3Q8VD4+IHsKKyAgc3RhdGljIHZvaWQgZm9ybWF0KGNvbnN0IGZvcm1hdHZfb2JqZWN0PFQ+ICZWLCByYXdfb3N0cmVhbSAmT1MsIFN0cmluZ1JlZikgeworICAgIE9TIDw8IFY7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfRk9STUFUVkFSSUFESUNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Zvcm1hdFZhcmlhZGljRGV0YWlscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Zvcm1hdFZhcmlhZGljRGV0YWlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjliNjA0NjIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRm9ybWF0VmFyaWFkaWNEZXRhaWxzLmgKQEAgLTAsMCArMSwxMTIgQEAKKy8vPT09LSBGb3JtYXRWYXJpYWRpY0RldGFpbHMuaCAtIEhlbHBlcnMgZm9yIEZvcm1hdFZhcmlhZGljLmggLS0tLSotIEMrKy0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0ZPUk1BVFZBUklBRElDX0RFVEFJTFNfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfRk9STUFUVkFSSUFESUNfREVUQUlMU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgbGx2bSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRW5hYmxlID0gdm9pZD4gc3RydWN0IGZvcm1hdF9wcm92aWRlciB7fTsKKworbmFtZXNwYWNlIGRldGFpbCB7CitjbGFzcyBmb3JtYXRfYWRhcHRlciB7Citwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgfmZvcm1hdF9hZGFwdGVyKCkge30KKworcHVibGljOgorICB2aXJ0dWFsIHZvaWQgZm9ybWF0KHJhd19vc3RyZWFtICZTLCBTdHJpbmdSZWYgT3B0aW9ucykgPSAwOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIHByb3ZpZGVyX2Zvcm1hdF9hZGFwdGVyIDogcHVibGljIGZvcm1hdF9hZGFwdGVyIHsKKyAgVCBJdGVtOworCitwdWJsaWM6CisgIGV4cGxpY2l0IHByb3ZpZGVyX2Zvcm1hdF9hZGFwdGVyKFQgJiZJdGVtKSA6IEl0ZW0oc3RkOjpmb3J3YXJkPFQ+KEl0ZW0pKSB7fQorCisgIHZvaWQgZm9ybWF0KGxsdm06OnJhd19vc3RyZWFtICZTLCBTdHJpbmdSZWYgT3B0aW9ucykgb3ZlcnJpZGUgeworICAgIGZvcm1hdF9wcm92aWRlcjx0eXBlbmFtZSBzdGQ6OmRlY2F5PFQ+Ojp0eXBlPjo6Zm9ybWF0KEl0ZW0sIFMsIE9wdGlvbnMpOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgbWlzc2luZ19mb3JtYXRfYWRhcHRlcjsKKworLy8gVGVzdCBpZiBmb3JtYXRfcHJvdmlkZXI8VD4gaXMgZGVmaW5lZCBvbiBUIGFuZCBjb250YWlucyBhIG1lbWJlciBmdW5jdGlvbgorLy8gd2l0aCB0aGUgc2lnbmF0dXJlOgorLy8gICBzdGF0aWMgdm9pZCBmb3JtYXQoY29uc3QgVCYsIHJhd19zdHJlYW0gJiwgU3RyaW5nUmVmKTsKKy8vCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgaGFzX0Zvcm1hdFByb3ZpZGVyIHsKK3B1YmxpYzoKKyAgdXNpbmcgRGVjYXllZCA9IHR5cGVuYW1lIHN0ZDo6ZGVjYXk8VD46OnR5cGU7CisgIHR5cGVkZWYgdm9pZCAoKlNpZ25hdHVyZV9mb3JtYXQpKGNvbnN0IERlY2F5ZWQgJiwgbGx2bTo6cmF3X29zdHJlYW0gJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgc3RhdGljIGNoYXIgdGVzdChTYW1lVHlwZTxTaWduYXR1cmVfZm9ybWF0LCAmVTo6Zm9ybWF0PiAqKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gc3RhdGljIGRvdWJsZSB0ZXN0KC4uLik7CisKKyAgc3RhdGljIGJvb2wgY29uc3QgdmFsdWUgPQorICAgICAgKHNpemVvZih0ZXN0PGxsdm06OmZvcm1hdF9wcm92aWRlcjxEZWNheWVkPj4obnVsbHB0cikpID09IDEpOworfTsKKworLy8gU2ltcGxlIHRlbXBsYXRlIHRoYXQgZGVjaWRlcyB3aGV0aGVyIGEgdHlwZSBUIHNob3VsZCB1c2UgdGhlIG1lbWJlci1mdW5jdGlvbgorLy8gYmFzZWQgZm9ybWF0KCkgaW52b2NhdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IHVzZXNfZm9ybWF0X21lbWJlcgorICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8CisgICAgICAgICAgYm9vbCwKKyAgICAgICAgICBzdGQ6OmlzX2Jhc2Vfb2Y8Zm9ybWF0X2FkYXB0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6cmVtb3ZlX3JlZmVyZW5jZTxUPjo6dHlwZT46OnZhbHVlPiB7fTsKKworLy8gU2ltcGxlIHRlbXBsYXRlIHRoYXQgZGVjaWRlcyB3aGV0aGVyIGEgdHlwZSBUIHNob3VsZCB1c2UgdGhlIGZvcm1hdF9wcm92aWRlcgorLy8gYmFzZWQgZm9ybWF0KCkgaW52b2NhdGlvbi4gIFRoZSBtZW1iZXIgZnVuY3Rpb24gdGFrZXMgcHJpb3JpdHksIHNvIHRoaXMgdGVzdAorLy8gd2lsbCBvbmx5IGJlIHRydWUgaWYgdGhlcmUgaXMgbm90IEFMU08gYSBmb3JtYXQgbWVtYmVyLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgdXNlc19mb3JtYXRfcHJvdmlkZXIKKyAgICA6IHB1YmxpYyBzdGQ6OmludGVncmFsX2NvbnN0YW50PAorICAgICAgICAgIGJvb2wsICF1c2VzX2Zvcm1hdF9tZW1iZXI8VD46OnZhbHVlICYmIGhhc19Gb3JtYXRQcm92aWRlcjxUPjo6dmFsdWU+IHsKK307CisKKy8vIFNpbXBsZSB0ZW1wbGF0ZSB0aGF0IGRlY2lkZXMgd2hldGhlciBhIHR5cGUgVCBoYXMgbmVpdGhlciBhIG1lbWJlci1mdW5jdGlvbgorLy8gbm9yIGZvcm1hdF9wcm92aWRlciBiYXNlZCBpbXBsZW1lbnRhdGlvbiB0aGF0IGl0IGNhbiB1c2UuICBNb3N0bHkgdXNlZCBzbworLy8gdGhhdCB0aGUgY29tcGlsZXIgc3BpdHMgb3V0IGEgbmljZSBkaWFnbm9zdGljIHdoZW4gYSB0eXBlIHdpdGggbm8gZm9ybWF0CisvLyBpbXBsZW1lbnRhdGlvbiBjYW4gYmUgbG9jYXRlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IHVzZXNfbWlzc2luZ19wcm92aWRlcgorICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICF1c2VzX2Zvcm1hdF9tZW1iZXI8VD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXVzZXNfZm9ybWF0X3Byb3ZpZGVyPFQ+Ojp2YWx1ZT4ge307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8dXNlc19mb3JtYXRfbWVtYmVyPFQ+Ojp2YWx1ZSwgVD46OnR5cGUKK2J1aWxkX2Zvcm1hdF9hZGFwdGVyKFQgJiZJdGVtKSB7CisgIHJldHVybiBzdGQ6OmZvcndhcmQ8VD4oSXRlbSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8dXNlc19mb3JtYXRfcHJvdmlkZXI8VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXJfZm9ybWF0X2FkYXB0ZXI8VD4+Ojp0eXBlCitidWlsZF9mb3JtYXRfYWRhcHRlcihUICYmSXRlbSkgeworICByZXR1cm4gcHJvdmlkZXJfZm9ybWF0X2FkYXB0ZXI8VD4oc3RkOjpmb3J3YXJkPFQ+KEl0ZW0pKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjx1c2VzX21pc3NpbmdfcHJvdmlkZXI8VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgbWlzc2luZ19mb3JtYXRfYWRhcHRlcjxUPj46OnR5cGUKK2J1aWxkX2Zvcm1hdF9hZGFwdGVyKFQgJiZJdGVtKSB7CisgIHJldHVybiBtaXNzaW5nX2Zvcm1hdF9hZGFwdGVyPFQ+KCk7Cit9Cit9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Zvcm1hdHRlZFN0cmVhbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0Zvcm1hdHRlZFN0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMTM1Y2QKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvRm9ybWF0dGVkU3RyZWFtLmgKQEAgLTAsMCArMSwxNjIgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L0Zvcm1hdHRlZFN0cmVhbS5oIC0gRm9ybWF0dGVkIHN0cmVhbXMgLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHJhd19vc3RyZWFtIGltcGxlbWVudGF0aW9ucyBmb3Igc3RyZWFtcyB0byBkbworLy8gdGhpbmdzIGxpa2UgcHJldHR5LXByaW50IGNvbW1lbnRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0ZPUk1BVFRFRFNUUkVBTV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9GT1JNQVRURURTVFJFQU1fSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gZm9ybWF0dGVkX3Jhd19vc3RyZWFtIC0gQSByYXdfb3N0cmVhbSB0aGF0IHdyYXBzIGFub3RoZXIgb25lIGFuZCBrZWVwcyB0cmFjaworLy8vIG9mIGxpbmUgYW5kIGNvbHVtbiBwb3NpdGlvbiwgYWxsb3dpbmcgcGFkZGluZyBvdXQgdG8gc3BlY2lmaWMgY29sdW1uCisvLy8gYm91bmRhcmllcyBhbmQgcXVlcnlpbmcgdGhlIG51bWJlciBvZiBsaW5lcyB3cml0dGVuIHRvIHRoZSBzdHJlYW0uCisvLy8KK2NsYXNzIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSA6IHB1YmxpYyByYXdfb3N0cmVhbSB7CisgIC8vLyBUaGVTdHJlYW0gLSBUaGUgcmVhbCBzdHJlYW0gd2Ugb3V0cHV0IHRvLiBXZSBzZXQgaXQgdG8gYmUKKyAgLy8vIHVuYnVmZmVyZWQsIHNpbmNlIHdlJ3JlIGFscmVhZHkgZG9pbmcgb3VyIG93biBidWZmZXJpbmcuCisgIC8vLworICByYXdfb3N0cmVhbSAqVGhlU3RyZWFtOworCisgIC8vLyBQb3NpdGlvbiAtIFRoZSBjdXJyZW50IG91dHB1dCBjb2x1bW4gYW5kIGxpbmUgb2YgdGhlIGRhdGEgdGhhdCdzCisgIC8vLyBiZWVuIGZsdXNoZWQgYW5kIHRoZSBwb3J0aW9uIG9mIHRoZSBidWZmZXIgdGhhdCdzIGJlZW4KKyAgLy8vIHNjYW5uZWQuICBUaGUgbGluZSBhbmQgY29sdW1uIHNjaGVtZSBpcyB6ZXJvLWJhc2VkLgorICAvLy8KKyAgc3RkOjpwYWlyPHVuc2lnbmVkLCB1bnNpZ25lZD4gUG9zaXRpb247CisKKyAgLy8vIFNjYW5uZWQgLSBUaGlzIHBvaW50cyB0byBvbmUgcGFzdCB0aGUgbGFzdCBjaGFyYWN0ZXIgaW4gdGhlCisgIC8vLyBidWZmZXIgd2UndmUgc2Nhbm5lZC4KKyAgLy8vCisgIGNvbnN0IGNoYXIgKlNjYW5uZWQ7CisKKyAgdm9pZCB3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUpIG92ZXJyaWRlOworCisgIC8vLyBjdXJyZW50X3BvcyAtIFJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIHN0cmVhbSwKKyAgLy8vIG5vdCBjb3VudGluZyB0aGUgYnl0ZXMgY3VycmVudGx5IGluIHRoZSBidWZmZXIuCisgIHVpbnQ2NF90IGN1cnJlbnRfcG9zKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIC8vIE91ciBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0gaXMgYWxsIHRoZSBjb250ZW50cyB3aGljaCBoYXZlIGJlZW4KKyAgICAvLyB3cml0dGVuIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSAoKm5vdCogdGhlIGN1cnJlbnQgcG9zaXRpb24gb2YgdGhlCisgICAgLy8gdW5kZXJseWluZyBzdHJlYW0pLgorICAgIHJldHVybiBUaGVTdHJlYW0tPnRlbGwoKTsKKyAgfQorCisgIC8vLyBDb21wdXRlUG9zaXRpb24gLSBFeGFtaW5lIHRoZSBnaXZlbiBvdXRwdXQgYnVmZmVyIGFuZCBmaWd1cmUgb3V0IHRoZSBuZXcKKyAgLy8vIHBvc2l0aW9uIGFmdGVyIG91dHB1dC4KKyAgLy8vCisgIHZvaWQgQ29tcHV0ZVBvc2l0aW9uKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IHNpemUpOworCisgIHZvaWQgc2V0U3RyZWFtKHJhd19vc3RyZWFtICZTdHJlYW0pIHsKKyAgICByZWxlYXNlU3RyZWFtKCk7CisKKyAgICBUaGVTdHJlYW0gPSAmU3RyZWFtOworCisgICAgLy8gVGhpcyBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gaW5oZXJpdHMgZnJvbSByYXdfb3N0cmVhbSwgc28gaXQnbGwgZG8gaXRzCisgICAgLy8gb3duIGJ1ZmZlcmluZywgYW5kIGl0IGRvZXNuJ3QgbmVlZCBvciB3YW50IFRoZVN0cmVhbSB0byBkbyBhbm90aGVyCisgICAgLy8gbGF5ZXIgb2YgYnVmZmVyaW5nIHVuZGVybmVhdGguIFJlc2l6ZSB0aGUgYnVmZmVyIHRvIHdoYXQgVGhlU3RyZWFtCisgICAgLy8gaGFkIGJlZW4gdXNpbmcsIGFuZCB0ZWxsIFRoZVN0cmVhbSBub3QgdG8gZG8gaXRzIG93biBidWZmZXJpbmcuCisgICAgaWYgKHNpemVfdCBCdWZmZXJTaXplID0gVGhlU3RyZWFtLT5HZXRCdWZmZXJTaXplKCkpCisgICAgICBTZXRCdWZmZXJTaXplKEJ1ZmZlclNpemUpOworICAgIGVsc2UKKyAgICAgIFNldFVuYnVmZmVyZWQoKTsKKyAgICBUaGVTdHJlYW0tPlNldFVuYnVmZmVyZWQoKTsKKworICAgIFNjYW5uZWQgPSBudWxscHRyOworICB9CisKK3B1YmxpYzoKKyAgLy8vIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSAtIE9wZW4gdGhlIHNwZWNpZmllZCBmaWxlIGZvcgorICAvLy8gd3JpdGluZy4gSWYgYW4gZXJyb3Igb2NjdXJzLCBpbmZvcm1hdGlvbiBhYm91dCB0aGUgZXJyb3IgaXMKKyAgLy8vIHB1dCBpbnRvIEVycm9ySW5mbywgYW5kIHRoZSBzdHJlYW0gc2hvdWxkIGJlIGltbWVkaWF0ZWx5CisgIC8vLyBkZXN0cm95ZWQ7IHRoZSBzdHJpbmcgd2lsbCBiZSBlbXB0eSBpZiBubyBlcnJvciBvY2N1cnJlZC4KKyAgLy8vCisgIC8vLyBBcyBhIHNpZGUgZWZmZWN0LCB0aGUgZ2l2ZW4gU3RyZWFtIGlzIHNldCB0byBiZSBVbmJ1ZmZlcmVkLgorICAvLy8gVGhpcyBpcyBiZWNhdXNlIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSBkb2VzIGl0cyBvd24gYnVmZmVyaW5nLAorICAvLy8gc28gaXQgZG9lc24ndCB3YW50IGFub3RoZXIgbGF5ZXIgb2YgYnVmZmVyaW5nIHRvIGJlIGhhcHBlbmluZworICAvLy8gdW5kZXJuZWF0aCBpdC4KKyAgLy8vCisgIGZvcm1hdHRlZF9yYXdfb3N0cmVhbShyYXdfb3N0cmVhbSAmU3RyZWFtKQorICAgICAgOiBUaGVTdHJlYW0obnVsbHB0ciksIFBvc2l0aW9uKDAsIDApIHsKKyAgICBzZXRTdHJlYW0oU3RyZWFtKTsKKyAgfQorICBleHBsaWNpdCBmb3JtYXR0ZWRfcmF3X29zdHJlYW0oKSA6IFRoZVN0cmVhbShudWxscHRyKSwgUG9zaXRpb24oMCwgMCkgeworICAgIFNjYW5uZWQgPSBudWxscHRyOworICB9CisKKyAgfmZvcm1hdHRlZF9yYXdfb3N0cmVhbSgpIG92ZXJyaWRlIHsKKyAgICBmbHVzaCgpOworICAgIHJlbGVhc2VTdHJlYW0oKTsKKyAgfQorCisgIC8vLyBQYWRUb0NvbHVtbiAtIEFsaWduIHRoZSBvdXRwdXQgdG8gc29tZSBjb2x1bW4gbnVtYmVyLiAgSWYgdGhlIGN1cnJlbnQKKyAgLy8vIGNvbHVtbiBpcyBhbHJlYWR5IGVxdWFsIHRvIG9yIG1vcmUgdGhhbiBOZXdDb2wsIFBhZFRvQ29sdW1uIGluc2VydHMgb25lCisgIC8vLyBzcGFjZS4KKyAgLy8vCisgIC8vLyBccGFyYW0gTmV3Q29sIC0gVGhlIGNvbHVtbiB0byBtb3ZlIHRvLgorICBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJlBhZFRvQ29sdW1uKHVuc2lnbmVkIE5ld0NvbCk7CisKKyAgLy8vIGdldENvbHVtbiAtIFJldHVybiB0aGUgY29sdW1uIG51bWJlcgorICB1bnNpZ25lZCBnZXRDb2x1bW4oKSB7IHJldHVybiBQb3NpdGlvbi5maXJzdDsgfQorCisgIC8vLyBnZXRMaW5lIC0gUmV0dXJuIHRoZSBsaW5lIG51bWJlcgorICB1bnNpZ25lZCBnZXRMaW5lKCkgeyByZXR1cm4gUG9zaXRpb24uc2Vjb25kOyB9CisKKyAgcmF3X29zdHJlYW0gJnJlc2V0Q29sb3IoKSBvdmVycmlkZSB7CisgICAgVGhlU3RyZWFtLT5yZXNldENvbG9yKCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgcmF3X29zdHJlYW0gJnJldmVyc2VDb2xvcigpIG92ZXJyaWRlIHsKKyAgICBUaGVTdHJlYW0tPnJldmVyc2VDb2xvcigpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHJhd19vc3RyZWFtICZjaGFuZ2VDb2xvcihlbnVtIENvbG9ycyBDb2xvciwgYm9vbCBCb2xkLCBib29sIEJHKSBvdmVycmlkZSB7CisgICAgVGhlU3RyZWFtLT5jaGFuZ2VDb2xvcihDb2xvciwgQm9sZCwgQkcpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGJvb2wgaXNfZGlzcGxheWVkKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBUaGVTdHJlYW0tPmlzX2Rpc3BsYXllZCgpOworICB9CisKK3ByaXZhdGU6CisgIHZvaWQgcmVsZWFzZVN0cmVhbSgpIHsKKyAgICAvLyBUcmFuc2ZlciB0aGUgYnVmZmVyIHNldHRpbmdzIGZyb20gdGhpcyByYXdfb3N0cmVhbSBiYWNrIHRvIHRoZSB1bmRlcmx5aW5nCisgICAgLy8gc3RyZWFtLgorICAgIGlmICghVGhlU3RyZWFtKQorICAgICAgcmV0dXJuOworICAgIGlmIChzaXplX3QgQnVmZmVyU2l6ZSA9IEdldEJ1ZmZlclNpemUoKSkKKyAgICAgIFRoZVN0cmVhbS0+U2V0QnVmZmVyU2l6ZShCdWZmZXJTaXplKTsKKyAgICBlbHNlCisgICAgICBUaGVTdHJlYW0tPlNldFVuYnVmZmVyZWQoKTsKKyAgfQorfTsKKworLy8vIGZvdXRzKCkgLSBUaGlzIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gZm9yCisvLy8gc3RhbmRhcmQgb3V0cHV0LiAgVXNlIGl0IGxpa2U6IGZvdXRzKCkgPDwgImZvbyIgPDwgImJhciI7Citmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJmZvdXRzKCk7CisKKy8vLyBmZXJycygpIC0gVGhpcyByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgZm9ybWF0dGVkX3Jhd19vc3RyZWFtIGZvcgorLy8vIHN0YW5kYXJkIGVycm9yLiAgVXNlIGl0IGxpa2U6IGZlcnJzKCkgPDwgImZvbyIgPDwgImJhciI7Citmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJmZlcnJzKCk7CisKKy8vLyBmZGJncygpIC0gVGhpcyByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgZm9ybWF0dGVkX3Jhd19vc3RyZWFtIGZvcgorLy8vIGRlYnVnIG91dHB1dC4gIFVzZSBpdCBsaWtlOiBmZGJncygpIDw8ICJmb28iIDw8ICJiYXIiOworZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZmZGJncygpOworCit9IC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0dlbmVyaWNEb21UcmVlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvR2VuZXJpY0RvbVRyZWUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2FhYzZiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0dlbmVyaWNEb21UcmVlLmgKQEAgLTAsMCArMSw5MDcgQEAKKy8vPT09LSBHZW5lcmljRG9tVHJlZS5oIC0gR2VuZXJpYyBkb21pbmF0b3IgdHJlZXMgZm9yIGdyYXBocyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLworLy8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgc2V0IG9mIHRlbXBsYXRlcyB0aGF0IGVmZmljaWVudGx5IGNvbXB1dGUgYSBkb21pbmF0b3IKKy8vLyB0cmVlIG92ZXIgYSBnZW5lcmljIGdyYXBoLiBUaGlzIGlzIHVzZWQgdHlwaWNhbGx5IGluIExMVk0gZm9yIGZhc3QKKy8vLyBkb21pbmFuY2UgcXVlcmllcyBvbiB0aGUgQ0ZHLCBidXQgaXMgZnVsbHkgZ2VuZXJpYyB3LnIudC4gdGhlIHVuZGVybHlpbmcKKy8vLyBncmFwaCB0eXBlcy4KKy8vLworLy8vIFVubGlrZSBBRFQvKiBncmFwaCBhbGdvcml0aG1zLCBnZW5lcmljIGRvbWluYXRvciB0cmVlIGhhcyBtb3JlIHJlcXVpcmVtZW50cworLy8vIG9uIHRoZSBncmFwaCdzIE5vZGVSZWYuIFRoZSBOb2RlUmVmIHNob3VsZCBiZSBhIHBvaW50ZXIgYW5kLAorLy8vIE5vZGVSZWYtPmdldFBhcmVudCgpIG11c3QgcmV0dXJuIHRoZSBwYXJlbnQgbm9kZSB0aGF0IGlzIGFsc28gYSBwb2ludGVyLgorLy8vCisvLy8gRklYTUU6IE1heWJlIEdlbmVyaWNEb21UcmVlIG5lZWRzIGEgVHJlZVRyYWl0cywgaW5zdGVhZCBvZiBHcmFwaFRyYWl0cy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfR0VORVJJQ0RPTVRSRUVfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfR0VORVJJQ0RPTVRSRUVfSAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9HcmFwaFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1BvaW50ZXJJbnRQYWlyLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBOb2RlVCwgYm9vbCBJc1Bvc3REb20+CitjbGFzcyBEb21pbmF0b3JUcmVlQmFzZTsKKworbmFtZXNwYWNlIERvbVRyZWVCdWlsZGVyIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBEb21UcmVlVD4KK3N0cnVjdCBTZW1pTkNBSW5mbzsKK30gIC8vIG5hbWVzcGFjZSBEb21UcmVlQnVpbGRlcgorCisvLy8gXGJyaWVmIEJhc2UgY2xhc3MgZm9yIHRoZSBhY3R1YWwgZG9taW5hdG9yIHRyZWUgbm9kZS4KK3RlbXBsYXRlIDxjbGFzcyBOb2RlVD4gY2xhc3MgRG9tVHJlZU5vZGVCYXNlIHsKKyAgZnJpZW5kIGNsYXNzIFBvc3REb21pbmF0b3JUcmVlOworICBmcmllbmQgY2xhc3MgRG9taW5hdG9yVHJlZUJhc2U8Tm9kZVQsIGZhbHNlPjsKKyAgZnJpZW5kIGNsYXNzIERvbWluYXRvclRyZWVCYXNlPE5vZGVULCB0cnVlPjsKKyAgZnJpZW5kIHN0cnVjdCBEb21UcmVlQnVpbGRlcjo6U2VtaU5DQUluZm88RG9taW5hdG9yVHJlZUJhc2U8Tm9kZVQsIGZhbHNlPj47CisgIGZyaWVuZCBzdHJ1Y3QgRG9tVHJlZUJ1aWxkZXI6OlNlbWlOQ0FJbmZvPERvbWluYXRvclRyZWVCYXNlPE5vZGVULCB0cnVlPj47CisKKyAgTm9kZVQgKlRoZUJCOworICBEb21UcmVlTm9kZUJhc2UgKklEb207CisgIHVuc2lnbmVkIExldmVsOworICBzdGQ6OnZlY3RvcjxEb21UcmVlTm9kZUJhc2UgKj4gQ2hpbGRyZW47CisgIG11dGFibGUgdW5zaWduZWQgREZTTnVtSW4gPSB+MDsKKyAgbXV0YWJsZSB1bnNpZ25lZCBERlNOdW1PdXQgPSB+MDsKKworIHB1YmxpYzoKKyAgRG9tVHJlZU5vZGVCYXNlKE5vZGVUICpCQiwgRG9tVHJlZU5vZGVCYXNlICppRG9tKQorICAgICAgOiBUaGVCQihCQiksIElEb20oaURvbSksIExldmVsKElEb20gPyBJRG9tLT5MZXZlbCArIDEgOiAwKSB7fQorCisgIHVzaW5nIGl0ZXJhdG9yID0gdHlwZW5hbWUgc3RkOjp2ZWN0b3I8RG9tVHJlZU5vZGVCYXNlICo+OjppdGVyYXRvcjsKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPQorICAgICAgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8RG9tVHJlZU5vZGVCYXNlICo+Ojpjb25zdF9pdGVyYXRvcjsKKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIENoaWxkcmVuLmJlZ2luKCk7IH0KKyAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gQ2hpbGRyZW4uZW5kKCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBDaGlsZHJlbi5iZWdpbigpOyB9CisgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIENoaWxkcmVuLmVuZCgpOyB9CisKKyAgTm9kZVQgKmdldEJsb2NrKCkgY29uc3QgeyByZXR1cm4gVGhlQkI7IH0KKyAgRG9tVHJlZU5vZGVCYXNlICpnZXRJRG9tKCkgY29uc3QgeyByZXR1cm4gSURvbTsgfQorICB1bnNpZ25lZCBnZXRMZXZlbCgpIGNvbnN0IHsgcmV0dXJuIExldmVsOyB9CisKKyAgY29uc3Qgc3RkOjp2ZWN0b3I8RG9tVHJlZU5vZGVCYXNlICo+ICZnZXRDaGlsZHJlbigpIGNvbnN0IHsgcmV0dXJuIENoaWxkcmVuOyB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPERvbVRyZWVOb2RlQmFzZT4gYWRkQ2hpbGQoCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8RG9tVHJlZU5vZGVCYXNlPiBDKSB7CisgICAgQ2hpbGRyZW4ucHVzaF9iYWNrKEMuZ2V0KCkpOworICAgIHJldHVybiBDOworICB9CisKKyAgc2l6ZV90IGdldE51bUNoaWxkcmVuKCkgY29uc3QgeyByZXR1cm4gQ2hpbGRyZW4uc2l6ZSgpOyB9CisKKyAgdm9pZCBjbGVhckFsbENoaWxkcmVuKCkgeyBDaGlsZHJlbi5jbGVhcigpOyB9CisKKyAgYm9vbCBjb21wYXJlKGNvbnN0IERvbVRyZWVOb2RlQmFzZSAqT3RoZXIpIGNvbnN0IHsKKyAgICBpZiAoZ2V0TnVtQ2hpbGRyZW4oKSAhPSBPdGhlci0+Z2V0TnVtQ2hpbGRyZW4oKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgaWYgKExldmVsICE9IE90aGVyLT5MZXZlbCkgcmV0dXJuIHRydWU7CisKKyAgICBTbWFsbFB0clNldDxjb25zdCBOb2RlVCAqLCA0PiBPdGhlckNoaWxkcmVuOworICAgIGZvciAoY29uc3QgRG9tVHJlZU5vZGVCYXNlICpJIDogKk90aGVyKSB7CisgICAgICBjb25zdCBOb2RlVCAqTmQgPSBJLT5nZXRCbG9jaygpOworICAgICAgT3RoZXJDaGlsZHJlbi5pbnNlcnQoTmQpOworICAgIH0KKworICAgIGZvciAoY29uc3QgRG9tVHJlZU5vZGVCYXNlICpJIDogKnRoaXMpIHsKKyAgICAgIGNvbnN0IE5vZGVUICpOID0gSS0+Z2V0QmxvY2soKTsKKyAgICAgIGlmIChPdGhlckNoaWxkcmVuLmNvdW50KE4pID09IDApCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2b2lkIHNldElEb20oRG9tVHJlZU5vZGVCYXNlICpOZXdJRG9tKSB7CisgICAgYXNzZXJ0KElEb20gJiYgIk5vIGltbWVkaWF0ZSBkb21pbmF0b3I/Iik7CisgICAgaWYgKElEb20gPT0gTmV3SURvbSkgcmV0dXJuOworCisgICAgYXV0byBJID0gZmluZChJRG9tLT5DaGlsZHJlbiwgdGhpcyk7CisgICAgYXNzZXJ0KEkgIT0gSURvbS0+Q2hpbGRyZW4uZW5kKCkgJiYKKyAgICAgICAgICAgIk5vdCBpbiBpbW1lZGlhdGUgZG9taW5hdG9yIGNoaWxkcmVuIHNldCEiKTsKKyAgICAvLyBJIGFtIG5vIGxvbmdlciB5b3VyIGNoaWxkLi4uCisgICAgSURvbS0+Q2hpbGRyZW4uZXJhc2UoSSk7CisKKyAgICAvLyBTd2l0Y2ggdG8gbmV3IGRvbWluYXRvcgorICAgIElEb20gPSBOZXdJRG9tOworICAgIElEb20tPkNoaWxkcmVuLnB1c2hfYmFjayh0aGlzKTsKKworICAgIFVwZGF0ZUxldmVsKCk7CisgIH0KKworICAvLy8gZ2V0REZTTnVtSW4vZ2V0REZTTnVtT3V0IC0gVGhlc2UgcmV0dXJuIHRoZSBERlMgdmlzaXRhdGlvbiBvcmRlciBmb3Igbm9kZXMKKyAgLy8vIGluIHRoZSBkb21pbmF0b3IgdHJlZS4gVGhleSBhcmUgb25seSBndWFyYW50ZWVkIHZhbGlkIGlmCisgIC8vLyB1cGRhdGVERlNOdW1iZXJzKCkgaGFzIGJlZW4gY2FsbGVkLgorICB1bnNpZ25lZCBnZXRERlNOdW1JbigpIGNvbnN0IHsgcmV0dXJuIERGU051bUluOyB9CisgIHVuc2lnbmVkIGdldERGU051bU91dCgpIGNvbnN0IHsgcmV0dXJuIERGU051bU91dDsgfQorCitwcml2YXRlOgorICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIG5vZGUgaXMgZG9taW5hdGVkIGJ5IG90aGVyLiBVc2UgdGhpcyBvbmx5IGlmIERGUyBpbmZvCisgIC8vIGlzIHZhbGlkLgorICBib29sIERvbWluYXRlZEJ5KGNvbnN0IERvbVRyZWVOb2RlQmFzZSAqb3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+REZTTnVtSW4gPj0gb3RoZXItPkRGU051bUluICYmCisgICAgICAgICAgIHRoaXMtPkRGU051bU91dCA8PSBvdGhlci0+REZTTnVtT3V0OworICB9CisKKyAgdm9pZCBVcGRhdGVMZXZlbCgpIHsKKyAgICBhc3NlcnQoSURvbSk7CisgICAgaWYgKExldmVsID09IElEb20tPkxldmVsICsgMSkgcmV0dXJuOworCisgICAgU21hbGxWZWN0b3I8RG9tVHJlZU5vZGVCYXNlICosIDY0PiBXb3JrU3RhY2sgPSB7dGhpc307CisKKyAgICB3aGlsZSAoIVdvcmtTdGFjay5lbXB0eSgpKSB7CisgICAgICBEb21UcmVlTm9kZUJhc2UgKkN1cnJlbnQgPSBXb3JrU3RhY2sucG9wX2JhY2tfdmFsKCk7CisgICAgICBDdXJyZW50LT5MZXZlbCA9IEN1cnJlbnQtPklEb20tPkxldmVsICsgMTsKKworICAgICAgZm9yIChEb21UcmVlTm9kZUJhc2UgKkMgOiAqQ3VycmVudCkgeworICAgICAgICBhc3NlcnQoQy0+SURvbSk7CisgICAgICAgIGlmIChDLT5MZXZlbCAhPSBDLT5JRG9tLT5MZXZlbCArIDEpIFdvcmtTdGFjay5wdXNoX2JhY2soQyk7CisgICAgICB9CisgICAgfQorICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgTm9kZVQ+CityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmTywgY29uc3QgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqTm9kZSkgeworICBpZiAoTm9kZS0+Z2V0QmxvY2soKSkKKyAgICBOb2RlLT5nZXRCbG9jaygpLT5wcmludEFzT3BlcmFuZChPLCBmYWxzZSk7CisgIGVsc2UKKyAgICBPIDw8ICIgPDxleGl0IG5vZGU+PiI7CisKKyAgTyA8PCAiIHsiIDw8IE5vZGUtPmdldERGU051bUluKCkgPDwgIiwiIDw8IE5vZGUtPmdldERGU051bU91dCgpIDw8ICJ9IFsiCisgICAgPDwgTm9kZS0+Z2V0TGV2ZWwoKSA8PCAiXVxuIjsKKworICByZXR1cm4gTzsKK30KKwordGVtcGxhdGUgPGNsYXNzIE5vZGVUPgordm9pZCBQcmludERvbVRyZWUoY29uc3QgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqTiwgcmF3X29zdHJlYW0gJk8sCisgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBMZXYpIHsKKyAgTy5pbmRlbnQoMiAqIExldikgPDwgIlsiIDw8IExldiA8PCAiXSAiIDw8IE47CisgIGZvciAodHlwZW5hbWUgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPjo6Y29uc3RfaXRlcmF0b3IgSSA9IE4tPmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRSA9IE4tPmVuZCgpOworICAgICAgIEkgIT0gRTsgKytJKQorICAgIFByaW50RG9tVHJlZTxOb2RlVD4oKkksIE8sIExldiArIDEpOworfQorCituYW1lc3BhY2UgRG9tVHJlZUJ1aWxkZXIgeworLy8gVGhlIHJvdXRpbmVzIGJlbG93IGFyZSBwcm92aWRlZCBpbiBhIHNlcGFyYXRlIGhlYWRlciBidXQgcmVmZXJlbmNlZCBoZXJlLgordGVtcGxhdGUgPHR5cGVuYW1lIERvbVRyZWVUPgordm9pZCBDYWxjdWxhdGUoRG9tVHJlZVQgJkRUKTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIERvbVRyZWVUPgordm9pZCBJbnNlcnRFZGdlKERvbVRyZWVUICZEVCwgdHlwZW5hbWUgRG9tVHJlZVQ6Ok5vZGVQdHIgRnJvbSwKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBEb21UcmVlVDo6Tm9kZVB0ciBUbyk7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEb21UcmVlVD4KK3ZvaWQgRGVsZXRlRWRnZShEb21UcmVlVCAmRFQsIHR5cGVuYW1lIERvbVRyZWVUOjpOb2RlUHRyIEZyb20sCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgRG9tVHJlZVQ6Ok5vZGVQdHIgVG8pOworCisvLyBVcGRhdGVLaW5kIGFuZCBVcGRhdGUgYXJlIHVzZWQgYnkgdGhlIGJhdGNoIHVwZGF0ZSBBUEkgYW5kIGl0J3MgZWFzaWVzdCB0bworLy8gZGVmaW5lIHRoZW0gaGVyZS4KK2VudW0gY2xhc3MgVXBkYXRlS2luZCA6IHVuc2lnbmVkIGNoYXIgeyBJbnNlcnQsIERlbGV0ZSB9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTm9kZVB0cj4KK3N0cnVjdCBVcGRhdGUgeworICB1c2luZyBOb2RlS2luZFBhaXIgPSBQb2ludGVySW50UGFpcjxOb2RlUHRyLCAxLCBVcGRhdGVLaW5kPjsKKworICBOb2RlUHRyIEZyb207CisgIE5vZGVLaW5kUGFpciBUb0FuZEtpbmQ7CisKKyAgVXBkYXRlKFVwZGF0ZUtpbmQgS2luZCwgTm9kZVB0ciBGcm9tLCBOb2RlUHRyIFRvKQorICAgICAgOiBGcm9tKEZyb20pLCBUb0FuZEtpbmQoVG8sIEtpbmQpIHt9CisKKyAgVXBkYXRlS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gVG9BbmRLaW5kLmdldEludCgpOyB9CisgIE5vZGVQdHIgZ2V0RnJvbSgpIGNvbnN0IHsgcmV0dXJuIEZyb207IH0KKyAgTm9kZVB0ciBnZXRUbygpIGNvbnN0IHsgcmV0dXJuIFRvQW5kS2luZC5nZXRQb2ludGVyKCk7IH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFVwZGF0ZSAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIEZyb20gPT0gUkhTLkZyb20gJiYgVG9BbmRLaW5kID09IFJIUy5Ub0FuZEtpbmQ7CisgIH0KKworICBmcmllbmQgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBVcGRhdGUgJlUpIHsKKyAgICBPUyA8PCAoVS5nZXRLaW5kKCkgPT0gVXBkYXRlS2luZDo6SW5zZXJ0ID8gIkluc2VydCAiIDogIkRlbGV0ZSAiKTsKKyAgICBVLmdldEZyb20oKS0+cHJpbnRBc09wZXJhbmQoT1MsIGZhbHNlKTsKKyAgICBPUyA8PCAiIC0+ICI7CisgICAgVS5nZXRUbygpLT5wcmludEFzT3BlcmFuZChPUywgZmFsc2UpOworICAgIHJldHVybiBPUzsKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIERvbVRyZWVUPgordm9pZCBBcHBseVVwZGF0ZXMoRG9tVHJlZVQgJkRULAorICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8dHlwZW5hbWUgRG9tVHJlZVQ6OlVwZGF0ZVR5cGU+IFVwZGF0ZXMpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRG9tVHJlZVQ+Citib29sIFZlcmlmeShjb25zdCBEb21UcmVlVCAmRFQsIHR5cGVuYW1lIERvbVRyZWVUOjpWZXJpZmljYXRpb25MZXZlbCBWTCk7Cit9ICAvLyBuYW1lc3BhY2UgRG9tVHJlZUJ1aWxkZXIKKworLy8vIFxicmllZiBDb3JlIGRvbWluYXRvciB0cmVlIGJhc2UgY2xhc3MuCisvLy8KKy8vLyBUaGlzIGNsYXNzIGlzIGEgZ2VuZXJpYyB0ZW1wbGF0ZSBvdmVyIGdyYXBoIG5vZGVzLiBJdCBpcyBpbnN0YW50aWF0ZWQgZm9yCisvLy8gdmFyaW91cyBncmFwaHMgaW4gdGhlIExMVk0gSVIgb3IgaW4gdGhlIGNvZGUgZ2VuZXJhdG9yLgordGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVULCBib29sIElzUG9zdERvbT4KK2NsYXNzIERvbWluYXRvclRyZWVCYXNlIHsKKyBwdWJsaWM6CisgIHN0YXRpY19hc3NlcnQoc3RkOjppc19wb2ludGVyPHR5cGVuYW1lIEdyYXBoVHJhaXRzPE5vZGVUICo+OjpOb2RlUmVmPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgIkN1cnJlbnRseSBEb21pbmF0b3JUcmVlQmFzZSBzdXBwb3J0cyBvbmx5IHBvaW50ZXIgbm9kZXMiKTsKKyAgdXNpbmcgTm9kZVR5cGUgPSBOb2RlVDsKKyAgdXNpbmcgTm9kZVB0ciA9IE5vZGVUICo7CisgIHVzaW5nIFBhcmVudFB0ciA9IGRlY2x0eXBlKHN0ZDo6ZGVjbHZhbDxOb2RlVCAqPigpLT5nZXRQYXJlbnQoKSk7CisgIHN0YXRpY19hc3NlcnQoc3RkOjppc19wb2ludGVyPFBhcmVudFB0cj46OnZhbHVlLAorICAgICAgICAgICAgICAgICJDdXJyZW50bHkgTm9kZVQncyBwYXJlbnQgbXVzdCBiZSBhIHBvaW50ZXIgdHlwZSIpOworICB1c2luZyBQYXJlbnRUeXBlID0gdHlwZW5hbWUgc3RkOjpyZW1vdmVfcG9pbnRlcjxQYXJlbnRQdHI+Ojp0eXBlOworICBzdGF0aWMgY29uc3RleHByIGJvb2wgSXNQb3N0RG9taW5hdG9yID0gSXNQb3N0RG9tOworCisgIHVzaW5nIFVwZGF0ZVR5cGUgPSBEb21UcmVlQnVpbGRlcjo6VXBkYXRlPE5vZGVQdHI+OworICB1c2luZyBVcGRhdGVLaW5kID0gRG9tVHJlZUJ1aWxkZXI6OlVwZGF0ZUtpbmQ7CisgIHN0YXRpYyBjb25zdGV4cHIgVXBkYXRlS2luZCBJbnNlcnQgPSBVcGRhdGVLaW5kOjpJbnNlcnQ7CisgIHN0YXRpYyBjb25zdGV4cHIgVXBkYXRlS2luZCBEZWxldGUgPSBVcGRhdGVLaW5kOjpEZWxldGU7CisKKyAgZW51bSBjbGFzcyBWZXJpZmljYXRpb25MZXZlbCB7IEZhc3QsIEJhc2ljLCBGdWxsIH07CisKK3Byb3RlY3RlZDoKKyAgLy8gRG9taW5hdG9ycyBhbHdheXMgaGF2ZSBhIHNpbmdsZSByb290LCBwb3N0ZG9taW5hdG9ycyBjYW4gaGF2ZSBtb3JlLgorICBTbWFsbFZlY3RvcjxOb2RlVCAqLCBJc1Bvc3REb20gPyA0IDogMT4gUm9vdHM7CisKKyAgdXNpbmcgRG9tVHJlZU5vZGVNYXBUeXBlID0KKyAgICAgRGVuc2VNYXA8Tm9kZVQgKiwgc3RkOjp1bmlxdWVfcHRyPERvbVRyZWVOb2RlQmFzZTxOb2RlVD4+PjsKKyAgRG9tVHJlZU5vZGVNYXBUeXBlIERvbVRyZWVOb2RlczsKKyAgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqUm9vdE5vZGU7CisgIFBhcmVudFB0ciBQYXJlbnQgPSBudWxscHRyOworCisgIG11dGFibGUgYm9vbCBERlNJbmZvVmFsaWQgPSBmYWxzZTsKKyAgbXV0YWJsZSB1bnNpZ25lZCBpbnQgU2xvd1F1ZXJpZXMgPSAwOworCisgIGZyaWVuZCBzdHJ1Y3QgRG9tVHJlZUJ1aWxkZXI6OlNlbWlOQ0FJbmZvPERvbWluYXRvclRyZWVCYXNlPjsKKworIHB1YmxpYzoKKyAgRG9taW5hdG9yVHJlZUJhc2UoKSB7fQorCisgIERvbWluYXRvclRyZWVCYXNlKERvbWluYXRvclRyZWVCYXNlICYmQXJnKQorICAgICAgOiBSb290cyhzdGQ6Om1vdmUoQXJnLlJvb3RzKSksCisgICAgICAgIERvbVRyZWVOb2RlcyhzdGQ6Om1vdmUoQXJnLkRvbVRyZWVOb2RlcykpLAorICAgICAgICBSb290Tm9kZShBcmcuUm9vdE5vZGUpLAorICAgICAgICBQYXJlbnQoQXJnLlBhcmVudCksCisgICAgICAgIERGU0luZm9WYWxpZChBcmcuREZTSW5mb1ZhbGlkKSwKKyAgICAgICAgU2xvd1F1ZXJpZXMoQXJnLlNsb3dRdWVyaWVzKSB7CisgICAgQXJnLndpcGUoKTsKKyAgfQorCisgIERvbWluYXRvclRyZWVCYXNlICZvcGVyYXRvcj0oRG9taW5hdG9yVHJlZUJhc2UgJiZSSFMpIHsKKyAgICBSb290cyA9IHN0ZDo6bW92ZShSSFMuUm9vdHMpOworICAgIERvbVRyZWVOb2RlcyA9IHN0ZDo6bW92ZShSSFMuRG9tVHJlZU5vZGVzKTsKKyAgICBSb290Tm9kZSA9IFJIUy5Sb290Tm9kZTsKKyAgICBQYXJlbnQgPSBSSFMuUGFyZW50OworICAgIERGU0luZm9WYWxpZCA9IFJIUy5ERlNJbmZvVmFsaWQ7CisgICAgU2xvd1F1ZXJpZXMgPSBSSFMuU2xvd1F1ZXJpZXM7CisgICAgUkhTLndpcGUoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBEb21pbmF0b3JUcmVlQmFzZShjb25zdCBEb21pbmF0b3JUcmVlQmFzZSAmKSA9IGRlbGV0ZTsKKyAgRG9taW5hdG9yVHJlZUJhc2UgJm9wZXJhdG9yPShjb25zdCBEb21pbmF0b3JUcmVlQmFzZSAmKSA9IGRlbGV0ZTsKKworICAvLy8gZ2V0Um9vdHMgLSBSZXR1cm4gdGhlIHJvb3QgYmxvY2tzIG9mIHRoZSBjdXJyZW50IENGRy4gIFRoaXMgbWF5IGluY2x1ZGUKKyAgLy8vIG11bHRpcGxlIGJsb2NrcyBpZiB3ZSBhcmUgY29tcHV0aW5nIHBvc3QgZG9taW5hdG9ycy4gIEZvciBmb3J3YXJkCisgIC8vLyBkb21pbmF0b3JzLCB0aGlzIHdpbGwgYWx3YXlzIGJlIGEgc2luZ2xlIGJsb2NrICh0aGUgZW50cnkgbm9kZSkuCisgIC8vLworICBjb25zdCBTbWFsbFZlY3RvckltcGw8Tm9kZVQgKj4gJmdldFJvb3RzKCkgY29uc3QgeyByZXR1cm4gUm9vdHM7IH0KKworICAvLy8gaXNQb3N0RG9taW5hdG9yIC0gUmV0dXJucyB0cnVlIGlmIGFuYWx5c2lzIGJhc2VkIG9mIHBvc3Rkb21zCisgIC8vLworICBib29sIGlzUG9zdERvbWluYXRvcigpIGNvbnN0IHsgcmV0dXJuIElzUG9zdERvbWluYXRvcjsgfQorCisgIC8vLyBjb21wYXJlIC0gUmV0dXJuIGZhbHNlIGlmIHRoZSBvdGhlciBkb21pbmF0b3IgdHJlZSBiYXNlIG1hdGNoZXMgdGhpcworICAvLy8gZG9taW5hdG9yIHRyZWUgYmFzZS4gT3RoZXJ3aXNlIHJldHVybiB0cnVlLgorICBib29sIGNvbXBhcmUoY29uc3QgRG9taW5hdG9yVHJlZUJhc2UgJk90aGVyKSBjb25zdCB7CisgICAgaWYgKFBhcmVudCAhPSBPdGhlci5QYXJlbnQpIHJldHVybiB0cnVlOworCisgICAgaWYgKFJvb3RzLnNpemUoKSAhPSBPdGhlci5Sb290cy5zaXplKCkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGlmICghc3RkOjppc19wZXJtdXRhdGlvbihSb290cy5iZWdpbigpLCBSb290cy5lbmQoKSwgT3RoZXIuUm9vdHMuYmVnaW4oKSkpCisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNvbnN0IERvbVRyZWVOb2RlTWFwVHlwZSAmT3RoZXJEb21UcmVlTm9kZXMgPSBPdGhlci5Eb21UcmVlTm9kZXM7CisgICAgaWYgKERvbVRyZWVOb2Rlcy5zaXplKCkgIT0gT3RoZXJEb21UcmVlTm9kZXMuc2l6ZSgpKQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkRvbVRyZWVOb2RlIDogRG9tVHJlZU5vZGVzKSB7CisgICAgICBOb2RlVCAqQkIgPSBEb21UcmVlTm9kZS5maXJzdDsKKyAgICAgIHR5cGVuYW1lIERvbVRyZWVOb2RlTWFwVHlwZTo6Y29uc3RfaXRlcmF0b3IgT0kgPQorICAgICAgICAgIE90aGVyRG9tVHJlZU5vZGVzLmZpbmQoQkIpOworICAgICAgaWYgKE9JID09IE90aGVyRG9tVHJlZU5vZGVzLmVuZCgpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAmTXlOZCA9ICpEb21UcmVlTm9kZS5zZWNvbmQ7CisgICAgICBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICZPdGhlck5kID0gKk9JLT5zZWNvbmQ7CisKKyAgICAgIGlmIChNeU5kLmNvbXBhcmUoJk90aGVyTmQpKQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICB2b2lkIHJlbGVhc2VNZW1vcnkoKSB7IHJlc2V0KCk7IH0KKworICAvLy8gZ2V0Tm9kZSAtIHJldHVybiB0aGUgKFBvc3QpRG9taW5hdG9yVHJlZSBub2RlIGZvciB0aGUgc3BlY2lmaWVkIGJhc2ljCisgIC8vLyBibG9jay4gIFRoaXMgaXMgdGhlIHNhbWUgYXMgdXNpbmcgb3BlcmF0b3JbXSBvbiB0aGlzIGNsYXNzLiAgVGhlIHJlc3VsdAorICAvLy8gbWF5IChidXQgaXMgbm90IHJlcXVpcmVkIHRvKSBiZSBudWxsIGZvciBhIGZvcndhcmQgKGJhY2t3YXJkcykKKyAgLy8vIHN0YXRpY2FsbHkgdW5yZWFjaGFibGUgYmxvY2suCisgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKmdldE5vZGUoTm9kZVQgKkJCKSBjb25zdCB7CisgICAgYXV0byBJID0gRG9tVHJlZU5vZGVzLmZpbmQoQkIpOworICAgIGlmIChJICE9IERvbVRyZWVOb2Rlcy5lbmQoKSkKKyAgICAgIHJldHVybiBJLT5zZWNvbmQuZ2V0KCk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gU2VlIGdldE5vZGUuCisgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKm9wZXJhdG9yW10oTm9kZVQgKkJCKSBjb25zdCB7IHJldHVybiBnZXROb2RlKEJCKTsgfQorCisgIC8vLyBnZXRSb290Tm9kZSAtIFRoaXMgcmV0dXJucyB0aGUgZW50cnkgbm9kZSBmb3IgdGhlIENGRyBvZiB0aGUgZnVuY3Rpb24uICBJZgorICAvLy8gdGhpcyB0cmVlIHJlcHJlc2VudHMgdGhlIHBvc3QtZG9taW5hbmNlIHJlbGF0aW9ucyBmb3IgYSBmdW5jdGlvbiwgaG93ZXZlciwKKyAgLy8vIHRoaXMgcm9vdCBtYXkgYmUgYSBub2RlIHdpdGggdGhlIGJsb2NrID09IE5VTEwuICBUaGlzIGlzIHRoZSBjYXNlIHdoZW4KKyAgLy8vIHRoZXJlIGFyZSBtdWx0aXBsZSBleGl0IG5vZGVzIGZyb20gYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uLiAgQ29uc3VtZXJzIG9mCisgIC8vLyBwb3N0LWRvbWluYW5jZSBpbmZvcm1hdGlvbiBtdXN0IGJlIGNhcGFibGUgb2YgZGVhbGluZyB3aXRoIHRoaXMKKyAgLy8vIHBvc3NpYmlsaXR5LgorICAvLy8KKyAgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqZ2V0Um9vdE5vZGUoKSB7IHJldHVybiBSb290Tm9kZTsgfQorICBjb25zdCBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpnZXRSb290Tm9kZSgpIGNvbnN0IHsgcmV0dXJuIFJvb3ROb2RlOyB9CisKKyAgLy8vIEdldCBhbGwgbm9kZXMgZG9taW5hdGVkIGJ5IFIsIGluY2x1ZGluZyBSIGl0c2VsZi4KKyAgdm9pZCBnZXREZXNjZW5kYW50cyhOb2RlVCAqUiwgU21hbGxWZWN0b3JJbXBsPE5vZGVUICo+ICZSZXN1bHQpIGNvbnN0IHsKKyAgICBSZXN1bHQuY2xlYXIoKTsKKyAgICBjb25zdCBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpSTiA9IGdldE5vZGUoUik7CisgICAgaWYgKCFSTikKKyAgICAgIHJldHVybjsgLy8gSWYgUiBpcyB1bnJlYWNoYWJsZSwgaXQgd2lsbCBub3QgYmUgcHJlc2VudCBpbiB0aGUgRE9NIHRyZWUuCisgICAgU21hbGxWZWN0b3I8Y29uc3QgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqLCA4PiBXTDsKKyAgICBXTC5wdXNoX2JhY2soUk4pOworCisgICAgd2hpbGUgKCFXTC5lbXB0eSgpKSB7CisgICAgICBjb25zdCBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpOID0gV0wucG9wX2JhY2tfdmFsKCk7CisgICAgICBSZXN1bHQucHVzaF9iYWNrKE4tPmdldEJsb2NrKCkpOworICAgICAgV0wuYXBwZW5kKE4tPmJlZ2luKCksIE4tPmVuZCgpKTsKKyAgICB9CisgIH0KKworICAvLy8gcHJvcGVybHlEb21pbmF0ZXMgLSBSZXR1cm5zIHRydWUgaWZmIEEgZG9taW5hdGVzIEIgYW5kIEEgIT0gQi4KKyAgLy8vIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBhIGNvbnN0YW50IHRpbWUgb3BlcmF0aW9uIQorICAvLy8KKyAgYm9vbCBwcm9wZXJseURvbWluYXRlcyhjb25zdCBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpBLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKkIpIGNvbnN0IHsKKyAgICBpZiAoIUEgfHwgIUIpCisgICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKEEgPT0gQikKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICByZXR1cm4gZG9taW5hdGVzKEEsIEIpOworICB9CisKKyAgYm9vbCBwcm9wZXJseURvbWluYXRlcyhjb25zdCBOb2RlVCAqQSwgY29uc3QgTm9kZVQgKkIpIGNvbnN0OworCisgIC8vLyBpc1JlYWNoYWJsZUZyb21FbnRyeSAtIFJldHVybiB0cnVlIGlmIEEgaXMgZG9taW5hdGVkIGJ5IHRoZSBlbnRyeQorICAvLy8gYmxvY2sgb2YgdGhlIGZ1bmN0aW9uIGNvbnRhaW5pbmcgaXQuCisgIGJvb2wgaXNSZWFjaGFibGVGcm9tRW50cnkoY29uc3QgTm9kZVQgKkEpIGNvbnN0IHsKKyAgICBhc3NlcnQoIXRoaXMtPmlzUG9zdERvbWluYXRvcigpICYmCisgICAgICAgICAgICJUaGlzIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgcG9zdCBkb21pbmF0b3JzIik7CisgICAgcmV0dXJuIGlzUmVhY2hhYmxlRnJvbUVudHJ5KGdldE5vZGUoY29uc3RfY2FzdDxOb2RlVCAqPihBKSkpOworICB9CisKKyAgYm9vbCBpc1JlYWNoYWJsZUZyb21FbnRyeShjb25zdCBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpBKSBjb25zdCB7IHJldHVybiBBOyB9CisKKyAgLy8vIGRvbWluYXRlcyAtIFJldHVybnMgdHJ1ZSBpZmYgQSBkb21pbmF0ZXMgQi4gIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCBhCisgIC8vLyBjb25zdGFudCB0aW1lIG9wZXJhdGlvbiEKKyAgLy8vCisgIGJvb2wgZG9taW5hdGVzKGNvbnN0IERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKkEsCisgICAgICAgICAgICAgICAgIGNvbnN0IERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKkIpIGNvbnN0IHsKKyAgICAvLyBBIG5vZGUgdHJpdmlhbGx5IGRvbWluYXRlcyBpdHNlbGYuCisgICAgaWYgKEIgPT0gQSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gQW4gdW5yZWFjaGFibGUgbm9kZSBpcyBkb21pbmF0ZWQgYnkgYW55dGhpbmcuCisgICAgaWYgKCFpc1JlYWNoYWJsZUZyb21FbnRyeShCKSkKKyAgICAgIHJldHVybiB0cnVlOworCisgICAgLy8gQW5kIGRvbWluYXRlcyBub3RoaW5nLgorICAgIGlmICghaXNSZWFjaGFibGVGcm9tRW50cnkoQSkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICBpZiAoQi0+Z2V0SURvbSgpID09IEEpIHJldHVybiB0cnVlOworCisgICAgaWYgKEEtPmdldElEb20oKSA9PSBCKSByZXR1cm4gZmFsc2U7CisKKyAgICAvLyBBIGNhbiBvbmx5IGRvbWluYXRlIEIgaWYgaXQgaXMgaGlnaGVyIGluIHRoZSB0cmVlLgorICAgIGlmIChBLT5nZXRMZXZlbCgpID49IEItPmdldExldmVsKCkpIHJldHVybiBmYWxzZTsKKworICAgIC8vIENvbXBhcmUgdGhlIHJlc3VsdCBvZiB0aGUgdHJlZSB3YWxrIGFuZCB0aGUgZGZzIG51bWJlcnMsIGlmIGV4cGVuc2l2ZQorICAgIC8vIGNoZWNrcyBhcmUgZW5hYmxlZC4KKyNpZmRlZiBFWFBFTlNJVkVfQ0hFQ0tTCisgICAgYXNzZXJ0KCghREZTSW5mb1ZhbGlkIHx8CisgICAgICAgICAgICAoZG9taW5hdGVkQnlTbG93VHJlZVdhbGsoQSwgQikgPT0gQi0+RG9taW5hdGVkQnkoQSkpKSAmJgorICAgICAgICAgICAiVHJlZSB3YWxrIGRpc2FncmVlcyB3aXRoIGRmcyBudW1iZXJzISIpOworI2VuZGlmCisKKyAgICBpZiAoREZTSW5mb1ZhbGlkKQorICAgICAgcmV0dXJuIEItPkRvbWluYXRlZEJ5KEEpOworCisgICAgLy8gSWYgd2UgZW5kIHVwIHdpdGggdG9vIG1hbnkgc2xvdyBxdWVyaWVzLCBqdXN0IHVwZGF0ZSB0aGUKKyAgICAvLyBERlMgbnVtYmVycyBvbiB0aGUgdGhlb3J5IHRoYXQgd2UgYXJlIGdvaW5nIHRvIGtlZXAgcXVlcnlpbmcuCisgICAgU2xvd1F1ZXJpZXMrKzsKKyAgICBpZiAoU2xvd1F1ZXJpZXMgPiAzMikgeworICAgICAgdXBkYXRlREZTTnVtYmVycygpOworICAgICAgcmV0dXJuIEItPkRvbWluYXRlZEJ5KEEpOworICAgIH0KKworICAgIHJldHVybiBkb21pbmF0ZWRCeVNsb3dUcmVlV2FsayhBLCBCKTsKKyAgfQorCisgIGJvb2wgZG9taW5hdGVzKGNvbnN0IE5vZGVUICpBLCBjb25zdCBOb2RlVCAqQikgY29uc3Q7CisKKyAgTm9kZVQgKmdldFJvb3QoKSBjb25zdCB7CisgICAgYXNzZXJ0KHRoaXMtPlJvb3RzLnNpemUoKSA9PSAxICYmICJTaG91bGQgYWx3YXlzIGhhdmUgZW50cnkgbm9kZSEiKTsKKyAgICByZXR1cm4gdGhpcy0+Um9vdHNbMF07CisgIH0KKworICAvLy8gZmluZE5lYXJlc3RDb21tb25Eb21pbmF0b3IgLSBGaW5kIG5lYXJlc3QgY29tbW9uIGRvbWluYXRvciBiYXNpYyBibG9jaworICAvLy8gZm9yIGJhc2ljIGJsb2NrIEEgYW5kIEIuIElmIHRoZXJlIGlzIG5vIHN1Y2ggYmxvY2sgdGhlbiByZXR1cm4gbnVsbHB0ci4KKyAgTm9kZVQgKmZpbmROZWFyZXN0Q29tbW9uRG9taW5hdG9yKE5vZGVUICpBLCBOb2RlVCAqQikgY29uc3QgeworICAgIGFzc2VydChBICYmIEIgJiYgIlBvaW50ZXJzIGFyZSBub3QgdmFsaWQiKTsKKyAgICBhc3NlcnQoQS0+Z2V0UGFyZW50KCkgPT0gQi0+Z2V0UGFyZW50KCkgJiYKKyAgICAgICAgICAgIlR3byBibG9ja3MgYXJlIG5vdCBpbiBzYW1lIGZ1bmN0aW9uIik7CisKKyAgICAvLyBJZiBlaXRoZXIgQSBvciBCIGlzIGEgZW50cnkgYmxvY2sgdGhlbiBpdCBpcyBuZWFyZXN0IGNvbW1vbiBkb21pbmF0b3IKKyAgICAvLyAoZm9yIGZvcndhcmQtZG9taW5hdG9ycykuCisgICAgaWYgKCFpc1Bvc3REb21pbmF0b3IoKSkgeworICAgICAgTm9kZVQgJkVudHJ5ID0gQS0+Z2V0UGFyZW50KCktPmZyb250KCk7CisgICAgICBpZiAoQSA9PSAmRW50cnkgfHwgQiA9PSAmRW50cnkpCisgICAgICAgIHJldHVybiAmRW50cnk7CisgICAgfQorCisgICAgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqTm9kZUEgPSBnZXROb2RlKEEpOworICAgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKk5vZGVCID0gZ2V0Tm9kZShCKTsKKworICAgIGlmICghTm9kZUEgfHwgIU5vZGVCKSByZXR1cm4gbnVsbHB0cjsKKworICAgIC8vIFVzZSBsZXZlbCBpbmZvcm1hdGlvbiB0byBnbyB1cCB0aGUgdHJlZSB1bnRpbCB0aGUgbGV2ZWxzIG1hdGNoLiBUaGVuCisgICAgLy8gY29udGludWUgZ29pbmcgdXAgdGlsIHdlIGFycml2ZSBhdCB0aGUgc2FtZSBub2RlLgorICAgIHdoaWxlIChOb2RlQSAmJiBOb2RlQSAhPSBOb2RlQikgeworICAgICAgaWYgKE5vZGVBLT5nZXRMZXZlbCgpIDwgTm9kZUItPmdldExldmVsKCkpIHN0ZDo6c3dhcChOb2RlQSwgTm9kZUIpOworCisgICAgICBOb2RlQSA9IE5vZGVBLT5JRG9tOworICAgIH0KKworICAgIHJldHVybiBOb2RlQSA/IE5vZGVBLT5nZXRCbG9jaygpIDogbnVsbHB0cjsKKyAgfQorCisgIGNvbnN0IE5vZGVUICpmaW5kTmVhcmVzdENvbW1vbkRvbWluYXRvcihjb25zdCBOb2RlVCAqQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5vZGVUICpCKSBjb25zdCB7CisgICAgLy8gQ2FzdCBhd2F5IHRoZSBjb25zdCBxdWFsaWZpZXJzIGhlcmUuIFRoaXMgaXMgb2sgc2luY2UKKyAgICAvLyBjb25zdCBpcyByZS1pbnRyb2R1Y2VkIG9uIHRoZSByZXR1cm4gdHlwZS4KKyAgICByZXR1cm4gZmluZE5lYXJlc3RDb21tb25Eb21pbmF0b3IoY29uc3RfY2FzdDxOb2RlVCAqPihBKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxOb2RlVCAqPihCKSk7CisgIH0KKworICBib29sIGlzVmlydHVhbFJvb3QoY29uc3QgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqQSkgY29uc3QgeworICAgIHJldHVybiBpc1Bvc3REb21pbmF0b3IoKSAmJiAhQS0+Z2V0QmxvY2soKTsKKyAgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBBUEkgdG8gdXBkYXRlIChQb3N0KURvbWluYXRvclRyZWUgaW5mb3JtYXRpb24gYmFzZWQgb24gbW9kaWZpY2F0aW9ucyB0bworICAvLyB0aGUgQ0ZHLi4uCisKKyAgLy8vIEluZm9ybSB0aGUgZG9taW5hdG9yIHRyZWUgYWJvdXQgYSBzZXF1ZW5jZSBvZiBDRkcgZWRnZSBpbnNlcnRpb25zIGFuZAorICAvLy8gZGVsZXRpb25zIGFuZCBwZXJmb3JtIGEgYmF0Y2ggdXBkYXRlIG9uIHRoZSB0cmVlLgorICAvLy8KKyAgLy8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGVyZSB3ZXJlIG11bHRpcGxlIENGRyB1cGRhdGVzIGFmdGVyCisgIC8vLyB0aGUgbGFzdCBkb21pbmF0b3IgdHJlZSB1cGRhdGUuIEl0IHRha2VzIGNhcmUgb2YgcGVyZm9ybWluZyB0aGUgdXBkYXRlcworICAvLy8gaW4gc3luYyB3aXRoIHRoZSBDRkcgYW5kIG9wdGltaXplcyBhd2F5IHRoZSByZWR1bmRhbnQgb3BlcmF0aW9ucyB0aGF0CisgIC8vLyBjYW5jZWwgZWFjaCBvdGhlci4KKyAgLy8vIFRoZSBmdW5jdGlvbnMgZXhwZWN0cyB0aGUgc2VxdWVuY2Ugb2YgdXBkYXRlcyB0byBiZSBiYWxhbmNlZC4gRWcuOgorICAvLy8gIC0ge3tJbnNlcnQsIEEsIEJ9LCB7RGVsZXRlLCBBLCBCfSwge0luc2VydCwgQSwgQn19IGlzIGZpbmUsIGJlY2F1c2UKKyAgLy8vICAgIGxvZ2ljYWxseSBpdCByZXN1bHRzIGluIGEgc2luZ2xlIGluc2VydGlvbnMuCisgIC8vLyAgLSB7e0luc2VydCwgQSwgQn0sIHtJbnNlcnQsIEEsIEJ9fSBpcyBpbnZhbGlkLCBiZWNhdXNlIGl0IGRvZXNuJ3QgbWFrZQorICAvLy8gICAgc2Vuc2UgdG8gaW5zZXJ0IHRoZSBzYW1lIGVkZ2UgdHdpY2UuCisgIC8vLworICAvLy8gV2hhdCdzIG1vcmUsIHRoZSBmdW5jdGlvbnMgYXNzdW1lcyB0aGF0IGl0J3Mgc2FmZSB0byBhc2sgZXZlcnkgbm9kZSBpbiB0aGUKKyAgLy8vIENGRyBhYm91dCBpdHMgY2hpbGRyZW4gYW5kIGludmVyc2UgY2hpbGRyZW4uIFRoaXMgaW1wbGllcyB0aGF0IGRlbGV0aW9ucworICAvLy8gb2YgQ0ZHIGVkZ2VzIG11c3Qgbm90IGRlbGV0ZSB0aGUgQ0ZHIG5vZGVzIGJlZm9yZSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uCisgIC8vLworICAvLy8gQmF0Y2ggdXBkYXRlcyBzaG91bGQgYmUgZ2VuZXJhbGx5IGZhc3RlciB3aGVuIHBlcmZvcm1pbmcgbG9uZ2VyIHNlcXVlbmNlcworICAvLy8gb2YgdXBkYXRlcyB0aGFuIGNhbGxpbmcgaW5zZXJ0RWRnZS9kZWxldGVFZGdlIG1hbnVhbGx5IG11bHRpcGxlIHRpbWVzLCBhcworICAvLy8gaXQgY2FuIHJlb3JkZXIgdGhlIHVwZGF0ZXMgYW5kIHJlbW92ZSByZWR1bmRhbnQgb25lcyBpbnRlcm5hbGx5LgorICAvLy8gVGhlIGJhdGNoIHVwZGF0ZXIgaXMgYWxzbyBhYmxlIHRvIGRldGVjdCBzZXF1ZW5jZXMgb2YgemVybyBhbmQgZXhhY3RseSBvbmUKKyAgLy8vIHVwZGF0ZSAtLSBpdCdzIG9wdGltaXplZCB0byBkbyBsZXNzIHdvcmsgaW4gdGhlc2UgY2FzZXMuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IGZvciBwb3N0ZG9taW5hdG9ycyBpdCBhdXRvbWF0aWNhbGx5IHRha2VzIGNhcmUgb2YgYXBwbHlpbmcKKyAgLy8vIHVwZGF0ZXMgb24gcmV2ZXJzZSBlZGdlcyBpbnRlcm5hbGx5IChzbyB0aGVyZSdzIG5vIG5lZWQgdG8gc3dhcCB0aGUKKyAgLy8vIEZyb20gYW5kIFRvIHBvaW50ZXJzIHdoZW4gY29uc3RydWN0aW5nIERvbWluYXRvclRyZWU6OlVwZGF0ZVR5cGUpLgorICAvLy8gVGhlIHR5cGUgb2YgdXBkYXRlcyBpcyB0aGUgc2FtZSBmb3IgRG9tVHJlZUJhc2U8VD4gYW5kIFBvc3REb21UcmVlQmFzZTxUPgorICAvLy8gd2l0aCB0aGUgc2FtZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgVC4KKyAgLy8vCisgIC8vLyBccGFyYW0gVXBkYXRlcyBBbiB1bm9yZGVyZWQgc2VxdWVuY2Ugb2YgdXBkYXRlcyB0byBwZXJmb3JtLgorICAvLy8KKyAgdm9pZCBhcHBseVVwZGF0ZXMoQXJyYXlSZWY8VXBkYXRlVHlwZT4gVXBkYXRlcykgeworICAgIERvbVRyZWVCdWlsZGVyOjpBcHBseVVwZGF0ZXMoKnRoaXMsIFVwZGF0ZXMpOworICB9CisKKyAgLy8vIEluZm9ybSB0aGUgZG9taW5hdG9yIHRyZWUgYWJvdXQgYSBDRkcgZWRnZSBpbnNlcnRpb24gYW5kIHVwZGF0ZSB0aGUgdHJlZS4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGhhcyB0byBiZSBjYWxsZWQganVzdCBiZWZvcmUgb3IganVzdCBhZnRlciBtYWtpbmcgdGhlIHVwZGF0ZQorICAvLy8gb24gdGhlIGFjdHVhbCBDRkcuIFRoZXJlIGNhbm5vdCBiZSBhbnkgb3RoZXIgdXBkYXRlcyB0aGF0IHRoZSBkb21pbmF0b3IKKyAgLy8vIHRyZWUgZG9lc24ndCBrbm93IGFib3V0LgorICAvLy8KKyAgLy8vIE5vdGUgdGhhdCBmb3IgcG9zdGRvbWluYXRvcnMgaXQgYXV0b21hdGljYWxseSB0YWtlcyBjYXJlIG9mIGluc2VydGluZworICAvLy8gYSByZXZlcnNlIGVkZ2UgaW50ZXJuYWxseSAoc28gdGhlcmUncyBubyBuZWVkIHRvIHN3YXAgdGhlIHBhcmFtZXRlcnMpLgorICAvLy8KKyAgdm9pZCBpbnNlcnRFZGdlKE5vZGVUICpGcm9tLCBOb2RlVCAqVG8pIHsKKyAgICBhc3NlcnQoRnJvbSk7CisgICAgYXNzZXJ0KFRvKTsKKyAgICBhc3NlcnQoRnJvbS0+Z2V0UGFyZW50KCkgPT0gUGFyZW50KTsKKyAgICBhc3NlcnQoVG8tPmdldFBhcmVudCgpID09IFBhcmVudCk7CisgICAgRG9tVHJlZUJ1aWxkZXI6Okluc2VydEVkZ2UoKnRoaXMsIEZyb20sIFRvKTsKKyAgfQorCisgIC8vLyBJbmZvcm0gdGhlIGRvbWluYXRvciB0cmVlIGFib3V0IGEgQ0ZHIGVkZ2UgZGVsZXRpb24gYW5kIHVwZGF0ZSB0aGUgdHJlZS4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGhhcyB0byBiZSBjYWxsZWQganVzdCBhZnRlciBtYWtpbmcgdGhlIHVwZGF0ZSBvbiB0aGUgYWN0dWFsCisgIC8vLyBDRkcuIEFuIGludGVybmFsIGZ1bmN0aW9ucyBjaGVja3MgaWYgdGhlIGVkZ2UgZG9lc24ndCBleGlzdCBpbiB0aGUgQ0ZHIGluCisgIC8vLyBERUJVRyBtb2RlLiBUaGVyZSBjYW5ub3QgYmUgYW55IG90aGVyIHVwZGF0ZXMgdGhhdCB0aGUKKyAgLy8vIGRvbWluYXRvciB0cmVlIGRvZXNuJ3Qga25vdyBhYm91dC4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgZm9yIHBvc3Rkb21pbmF0b3JzIGl0IGF1dG9tYXRpY2FsbHkgdGFrZXMgY2FyZSBvZiBkZWxldGluZworICAvLy8gYSByZXZlcnNlIGVkZ2UgaW50ZXJuYWxseSAoc28gdGhlcmUncyBubyBuZWVkIHRvIHN3YXAgdGhlIHBhcmFtZXRlcnMpLgorICAvLy8KKyAgdm9pZCBkZWxldGVFZGdlKE5vZGVUICpGcm9tLCBOb2RlVCAqVG8pIHsKKyAgICBhc3NlcnQoRnJvbSk7CisgICAgYXNzZXJ0KFRvKTsKKyAgICBhc3NlcnQoRnJvbS0+Z2V0UGFyZW50KCkgPT0gUGFyZW50KTsKKyAgICBhc3NlcnQoVG8tPmdldFBhcmVudCgpID09IFBhcmVudCk7CisgICAgRG9tVHJlZUJ1aWxkZXI6OkRlbGV0ZUVkZ2UoKnRoaXMsIEZyb20sIFRvKTsKKyAgfQorCisgIC8vLyBBZGQgYSBuZXcgbm9kZSB0byB0aGUgZG9taW5hdG9yIHRyZWUgaW5mb3JtYXRpb24uCisgIC8vLworICAvLy8gVGhpcyBjcmVhdGVzIGEgbmV3IG5vZGUgYXMgYSBjaGlsZCBvZiBEb21CQiBkb21pbmF0b3Igbm9kZSwgbGlua2luZyBpdAorICAvLy8gaW50byB0aGUgY2hpbGRyZW4gbGlzdCBvZiB0aGUgaW1tZWRpYXRlIGRvbWluYXRvci4KKyAgLy8vCisgIC8vLyBccGFyYW0gQkIgTmV3IG5vZGUgaW4gQ0ZHLgorICAvLy8gXHBhcmFtIERvbUJCIENGRyBub2RlIHRoYXQgaXMgZG9taW5hdG9yIGZvciBCQi4KKyAgLy8vIFxyZXR1cm5zIE5ldyBkb21pbmF0b3IgdHJlZSBub2RlIHRoYXQgcmVwcmVzZW50cyBuZXcgQ0ZHIG5vZGUuCisgIC8vLworICBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICphZGROZXdCbG9jayhOb2RlVCAqQkIsIE5vZGVUICpEb21CQikgeworICAgIGFzc2VydChnZXROb2RlKEJCKSA9PSBudWxscHRyICYmICJCbG9jayBhbHJlYWR5IGluIGRvbWluYXRvciB0cmVlISIpOworICAgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKklEb21Ob2RlID0gZ2V0Tm9kZShEb21CQik7CisgICAgYXNzZXJ0KElEb21Ob2RlICYmICJOb3QgaW1tZWRpYXRlIGRvbWluYXRvciBzcGVjaWZpZWQgZm9yIGJsb2NrISIpOworICAgIERGU0luZm9WYWxpZCA9IGZhbHNlOworICAgIHJldHVybiAoRG9tVHJlZU5vZGVzW0JCXSA9IElEb21Ob2RlLT5hZGRDaGlsZCgKKyAgICAgICAgICAgICAgICBsbHZtOjptYWtlX3VuaXF1ZTxEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+PihCQiwgSURvbU5vZGUpKSkuZ2V0KCk7CisgIH0KKworICAvLy8gQWRkIGEgbmV3IG5vZGUgdG8gdGhlIGZvcndhcmQgZG9taW5hdG9yIHRyZWUgYW5kIG1ha2UgaXQgYSBuZXcgcm9vdC4KKyAgLy8vCisgIC8vLyBccGFyYW0gQkIgTmV3IG5vZGUgaW4gQ0ZHLgorICAvLy8gXHJldHVybnMgTmV3IGRvbWluYXRvciB0cmVlIG5vZGUgdGhhdCByZXByZXNlbnRzIG5ldyBDRkcgbm9kZS4KKyAgLy8vCisgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKnNldE5ld1Jvb3QoTm9kZVQgKkJCKSB7CisgICAgYXNzZXJ0KGdldE5vZGUoQkIpID09IG51bGxwdHIgJiYgIkJsb2NrIGFscmVhZHkgaW4gZG9taW5hdG9yIHRyZWUhIik7CisgICAgYXNzZXJ0KCF0aGlzLT5pc1Bvc3REb21pbmF0b3IoKSAmJgorICAgICAgICAgICAiQ2Fubm90IGNoYW5nZSByb290IG9mIHBvc3QtZG9taW5hdG9yIHRyZWUiKTsKKyAgICBERlNJbmZvVmFsaWQgPSBmYWxzZTsKKyAgICBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpOZXdOb2RlID0gKERvbVRyZWVOb2Rlc1tCQl0gPQorICAgICAgbGx2bTo6bWFrZV91bmlxdWU8RG9tVHJlZU5vZGVCYXNlPE5vZGVUPj4oQkIsIG51bGxwdHIpKS5nZXQoKTsKKyAgICBpZiAoUm9vdHMuZW1wdHkoKSkgeworICAgICAgYWRkUm9vdChCQik7CisgICAgfSBlbHNlIHsKKyAgICAgIGFzc2VydChSb290cy5zaXplKCkgPT0gMSk7CisgICAgICBOb2RlVCAqT2xkUm9vdCA9IFJvb3RzLmZyb250KCk7CisgICAgICBhdXRvICZPbGROb2RlID0gRG9tVHJlZU5vZGVzW09sZFJvb3RdOworICAgICAgT2xkTm9kZSA9IE5ld05vZGUtPmFkZENoaWxkKHN0ZDo6bW92ZShEb21UcmVlTm9kZXNbT2xkUm9vdF0pKTsKKyAgICAgIE9sZE5vZGUtPklEb20gPSBOZXdOb2RlOworICAgICAgT2xkTm9kZS0+VXBkYXRlTGV2ZWwoKTsKKyAgICAgIFJvb3RzWzBdID0gQkI7CisgICAgfQorICAgIHJldHVybiBSb290Tm9kZSA9IE5ld05vZGU7CisgIH0KKworICAvLy8gY2hhbmdlSW1tZWRpYXRlRG9taW5hdG9yIC0gVGhpcyBtZXRob2QgaXMgdXNlZCB0byB1cGRhdGUgdGhlIGRvbWluYXRvcgorICAvLy8gdHJlZSBpbmZvcm1hdGlvbiB3aGVuIGEgbm9kZSdzIGltbWVkaWF0ZSBkb21pbmF0b3IgY2hhbmdlcy4KKyAgLy8vCisgIHZvaWQgY2hhbmdlSW1tZWRpYXRlRG9taW5hdG9yKERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKk5ld0lEb20pIHsKKyAgICBhc3NlcnQoTiAmJiBOZXdJRG9tICYmICJDYW5ub3QgY2hhbmdlIG51bGwgbm9kZSBwb2ludGVycyEiKTsKKyAgICBERlNJbmZvVmFsaWQgPSBmYWxzZTsKKyAgICBOLT5zZXRJRG9tKE5ld0lEb20pOworICB9CisKKyAgdm9pZCBjaGFuZ2VJbW1lZGlhdGVEb21pbmF0b3IoTm9kZVQgKkJCLCBOb2RlVCAqTmV3QkIpIHsKKyAgICBjaGFuZ2VJbW1lZGlhdGVEb21pbmF0b3IoZ2V0Tm9kZShCQiksIGdldE5vZGUoTmV3QkIpKTsKKyAgfQorCisgIC8vLyBlcmFzZU5vZGUgLSBSZW1vdmVzIGEgbm9kZSBmcm9tIHRoZSBkb21pbmF0b3IgdHJlZS4gQmxvY2sgbXVzdCBub3QKKyAgLy8vIGRvbWluYXRlIGFueSBvdGhlciBibG9ja3MuIFJlbW92ZXMgbm9kZSBmcm9tIGl0cyBpbW1lZGlhdGUgZG9taW5hdG9yJ3MKKyAgLy8vIGNoaWxkcmVuIGxpc3QuIERlbGV0ZXMgZG9taW5hdG9yIG5vZGUgYXNzb2NpYXRlZCB3aXRoIGJhc2ljIGJsb2NrIEJCLgorICB2b2lkIGVyYXNlTm9kZShOb2RlVCAqQkIpIHsKKyAgICBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpOb2RlID0gZ2V0Tm9kZShCQik7CisgICAgYXNzZXJ0KE5vZGUgJiYgIlJlbW92aW5nIG5vZGUgdGhhdCBpc24ndCBpbiBkb21pbmF0b3IgdHJlZS4iKTsKKyAgICBhc3NlcnQoTm9kZS0+Z2V0Q2hpbGRyZW4oKS5lbXB0eSgpICYmICJOb2RlIGlzIG5vdCBhIGxlYWYgbm9kZS4iKTsKKworICAgIERGU0luZm9WYWxpZCA9IGZhbHNlOworCisgICAgLy8gUmVtb3ZlIG5vZGUgZnJvbSBpbW1lZGlhdGUgZG9taW5hdG9yJ3MgY2hpbGRyZW4gbGlzdC4KKyAgICBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpJRG9tID0gTm9kZS0+Z2V0SURvbSgpOworICAgIGlmIChJRG9tKSB7CisgICAgICBjb25zdCBhdXRvIEkgPSBmaW5kKElEb20tPkNoaWxkcmVuLCBOb2RlKTsKKyAgICAgIGFzc2VydChJICE9IElEb20tPkNoaWxkcmVuLmVuZCgpICYmCisgICAgICAgICAgICAgIk5vdCBpbiBpbW1lZGlhdGUgZG9taW5hdG9yIGNoaWxkcmVuIHNldCEiKTsKKyAgICAgIC8vIEkgYW0gbm8gbG9uZ2VyIHlvdXIgY2hpbGQuLi4KKyAgICAgIElEb20tPkNoaWxkcmVuLmVyYXNlKEkpOworICAgIH0KKworICAgIERvbVRyZWVOb2Rlcy5lcmFzZShCQik7CisKKyAgICBpZiAoIUlzUG9zdERvbSkgcmV0dXJuOworCisgICAgLy8gUmVtZW1iZXIgdG8gdXBkYXRlIFBvc3REb21pbmF0b3JUcmVlIHJvb3RzLgorICAgIGF1dG8gUkl0ID0gbGx2bTo6ZmluZChSb290cywgQkIpOworICAgIGlmIChSSXQgIT0gUm9vdHMuZW5kKCkpIHsKKyAgICAgIHN0ZDo6c3dhcCgqUkl0LCBSb290cy5iYWNrKCkpOworICAgICAgUm9vdHMucG9wX2JhY2soKTsKKyAgICB9CisgIH0KKworICAvLy8gc3BsaXRCbG9jayAtIEJCIGlzIHNwbGl0IGFuZCBub3cgaXQgaGFzIG9uZSBzdWNjZXNzb3IuIFVwZGF0ZSBkb21pbmF0b3IKKyAgLy8vIHRyZWUgdG8gcmVmbGVjdCB0aGlzIGNoYW5nZS4KKyAgdm9pZCBzcGxpdEJsb2NrKE5vZGVUICpOZXdCQikgeworICAgIGlmIChJc1Bvc3REb21pbmF0b3IpCisgICAgICBTcGxpdDxJbnZlcnNlPE5vZGVUICo+PihOZXdCQik7CisgICAgZWxzZQorICAgICAgU3BsaXQ8Tm9kZVQgKj4oTmV3QkIpOworICB9CisKKyAgLy8vIHByaW50IC0gQ29udmVydCB0byBodW1hbiByZWFkYWJsZSBmb3JtCisgIC8vLworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPKSBjb25zdCB7CisgICAgTyA8PCAiPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKKyAgICBpZiAoSXNQb3N0RG9taW5hdG9yKQorICAgICAgTyA8PCAiSW5vcmRlciBQb3N0RG9taW5hdG9yIFRyZWU6ICI7CisgICAgZWxzZQorICAgICAgTyA8PCAiSW5vcmRlciBEb21pbmF0b3IgVHJlZTogIjsKKyAgICBpZiAoIURGU0luZm9WYWxpZCkKKyAgICAgIE8gPDwgIkRGU051bWJlcnMgaW52YWxpZDogIiA8PCBTbG93UXVlcmllcyA8PCAiIHNsb3cgcXVlcmllcy4iOworICAgIE8gPDwgIlxuIjsKKworICAgIC8vIFRoZSBwb3N0ZG9tIHRyZWUgY2FuIGhhdmUgYSBudWxsIHJvb3QgaWYgdGhlcmUgYXJlIG5vIHJldHVybnMuCisgICAgaWYgKGdldFJvb3ROb2RlKCkpIFByaW50RG9tVHJlZTxOb2RlVD4oZ2V0Um9vdE5vZGUoKSwgTywgMSk7CisgICAgaWYgKElzUG9zdERvbWluYXRvcikgeworICAgICAgTyA8PCAiUm9vdHM6ICI7CisgICAgICBmb3IgKGNvbnN0IE5vZGVQdHIgQmxvY2sgOiBSb290cykgeworICAgICAgICBCbG9jay0+cHJpbnRBc09wZXJhbmQoTywgZmFsc2UpOworICAgICAgICBPIDw8ICIgIjsKKyAgICAgIH0KKyAgICAgIE8gPDwgIlxuIjsKKyAgICB9CisgIH0KKworcHVibGljOgorICAvLy8gdXBkYXRlREZTTnVtYmVycyAtIEFzc2lnbiBJbiBhbmQgT3V0IG51bWJlcnMgdG8gdGhlIG5vZGVzIHdoaWxlIHdhbGtpbmcKKyAgLy8vIGRvbWluYXRvciB0cmVlIGluIGRmcyBvcmRlci4KKyAgdm9pZCB1cGRhdGVERlNOdW1iZXJzKCkgY29uc3QgeworICAgIGlmIChERlNJbmZvVmFsaWQpIHsKKyAgICAgIFNsb3dRdWVyaWVzID0gMDsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8Y29uc3QgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+Ojpjb25zdF9pdGVyYXRvcj4sCisgICAgICAgICAgICAgICAgMzI+IFdvcmtTdGFjazsKKworICAgIGNvbnN0IERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKlRoaXNSb290ID0gZ2V0Um9vdE5vZGUoKTsKKyAgICBhc3NlcnQoKCFQYXJlbnQgfHwgVGhpc1Jvb3QpICYmICJFbXB0eSBjb25zdHJ1Y3RlZCBEb21UcmVlIik7CisgICAgaWYgKCFUaGlzUm9vdCkKKyAgICAgIHJldHVybjsKKworICAgIC8vIEJvdGggZG9taW5hdG9ycyBhbmQgcG9zdGRvbWluYXRvcnMgaGF2ZSBhIHNpbmdsZSByb290IG5vZGUuIEluIHRoZSBjYXNlCisgICAgLy8gY2FzZSBvZiBQb3N0RG9taW5hdG9yVHJlZSwgdGhpcyBub2RlIGlzIGEgdmlydHVhbCByb290LgorICAgIFdvcmtTdGFjay5wdXNoX2JhY2soe1RoaXNSb290LCBUaGlzUm9vdC0+YmVnaW4oKX0pOworCisgICAgdW5zaWduZWQgREZTTnVtID0gMDsKKyAgICBUaGlzUm9vdC0+REZTTnVtSW4gPSBERlNOdW0rKzsKKworICAgIHdoaWxlICghV29ya1N0YWNrLmVtcHR5KCkpIHsKKyAgICAgIGNvbnN0IERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKk5vZGUgPSBXb3JrU3RhY2suYmFjaygpLmZpcnN0OworICAgICAgY29uc3QgYXV0byBDaGlsZEl0ID0gV29ya1N0YWNrLmJhY2soKS5zZWNvbmQ7CisKKyAgICAgIC8vIElmIHdlIHZpc2l0ZWQgYWxsIG9mIHRoZSBjaGlsZHJlbiBvZiB0aGlzIG5vZGUsICJyZWN1cnNlIiBiYWNrIHVwIHRoZQorICAgICAgLy8gc3RhY2sgc2V0dGluZyB0aGUgREZPdXROdW0uCisgICAgICBpZiAoQ2hpbGRJdCA9PSBOb2RlLT5lbmQoKSkgeworICAgICAgICBOb2RlLT5ERlNOdW1PdXQgPSBERlNOdW0rKzsKKyAgICAgICAgV29ya1N0YWNrLnBvcF9iYWNrKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBPdGhlcndpc2UsIHJlY3Vyc2l2ZWx5IHZpc2l0IHRoaXMgY2hpbGQuCisgICAgICAgIGNvbnN0IERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKkNoaWxkID0gKkNoaWxkSXQ7CisgICAgICAgICsrV29ya1N0YWNrLmJhY2soKS5zZWNvbmQ7CisKKyAgICAgICAgV29ya1N0YWNrLnB1c2hfYmFjayh7Q2hpbGQsIENoaWxkLT5iZWdpbigpfSk7CisgICAgICAgIENoaWxkLT5ERlNOdW1JbiA9IERGU051bSsrOworICAgICAgfQorICAgIH0KKworICAgIFNsb3dRdWVyaWVzID0gMDsKKyAgICBERlNJbmZvVmFsaWQgPSB0cnVlOworICB9CisKKyAgLy8vIHJlY2FsY3VsYXRlIC0gY29tcHV0ZSBhIGRvbWluYXRvciB0cmVlIGZvciB0aGUgZ2l2ZW4gZnVuY3Rpb24KKyAgdm9pZCByZWNhbGN1bGF0ZShQYXJlbnRUeXBlICZGdW5jKSB7CisgICAgUGFyZW50ID0gJkZ1bmM7CisgICAgRG9tVHJlZUJ1aWxkZXI6OkNhbGN1bGF0ZSgqdGhpcyk7CisgIH0KKworICAvLy8gdmVyaWZ5IC0gY2hlY2tzIGlmIHRoZSB0cmVlIGlzIGNvcnJlY3QuIFRoZXJlIGFyZSAzIGxldmVsIG9mIHZlcmlmaWNhdGlvbjoKKyAgLy8vICAtIEZ1bGwgLS0gIHZlcmlmaWVzIGlmIHRoZSB0cmVlIGlzIGNvcnJlY3QgYnkgbWFraW5nIHN1cmUgYWxsIHRoZQorICAvLy8gICAgICAgICAgICAgcHJvcGVydGllcyAoaW5jbHVkaW5nIHRoZSBwYXJlbnQgYW5kIHRoZSBzaWJsaW5nIHByb3BlcnR5KQorICAvLy8gICAgICAgICAgICAgaG9sZC4KKyAgLy8vICAgICAgICAgICAgIFRha2VzIE8oTl4zKSB0aW1lLgorICAvLy8KKyAgLy8vICAtIEJhc2ljIC0tIGNoZWNrcyBpZiB0aGUgdHJlZSBpcyBjb3JyZWN0LCBidXQgY29tcGFyZXMgaXQgdG8gYSBmcmVzaGx5CisgIC8vLyAgICAgICAgICAgICBjb25zdHJ1Y3RlZCB0cmVlIGluc3RlYWQgb2YgY2hlY2tpbmcgdGhlIHNpYmxpbmcgcHJvcGVydHkuCisgIC8vLyAgICAgICAgICAgICBUYWtlcyBPKE5eMikgdGltZS4KKyAgLy8vCisgIC8vLyAgLSBGYXN0ICAtLSBjaGVja3MgYmFzaWMgdHJlZSBzdHJ1Y3R1cmUgYW5kIGNvbXBhcmVzIGl0IHdpdGggYSBmcmVzaGx5CisgIC8vLyAgICAgICAgICAgICBjb25zdHJ1Y3RlZCB0cmVlLgorICAvLy8gICAgICAgICAgICAgVGFrZXMgTyhOXjIpIHRpbWUgd29yc3QgY2FzZSwgYnV0IGlzIGZhc3RlciBpbiBwcmFjdGlzZSAoc2FtZQorICAvLy8gICAgICAgICAgICAgYXMgdHJlZSBjb25zdHJ1Y3Rpb24pLgorICBib29sIHZlcmlmeShWZXJpZmljYXRpb25MZXZlbCBWTCA9IFZlcmlmaWNhdGlvbkxldmVsOjpGdWxsKSBjb25zdCB7CisgICAgcmV0dXJuIERvbVRyZWVCdWlsZGVyOjpWZXJpZnkoKnRoaXMsIFZMKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIHZvaWQgYWRkUm9vdChOb2RlVCAqQkIpIHsgdGhpcy0+Um9vdHMucHVzaF9iYWNrKEJCKTsgfQorCisgIHZvaWQgcmVzZXQoKSB7CisgICAgRG9tVHJlZU5vZGVzLmNsZWFyKCk7CisgICAgUm9vdHMuY2xlYXIoKTsKKyAgICBSb290Tm9kZSA9IG51bGxwdHI7CisgICAgUGFyZW50ID0gbnVsbHB0cjsKKyAgICBERlNJbmZvVmFsaWQgPSBmYWxzZTsKKyAgICBTbG93UXVlcmllcyA9IDA7CisgIH0KKworICAvLyBOZXdCQiBpcyBzcGxpdCBhbmQgbm93IGl0IGhhcyBvbmUgc3VjY2Vzc29yLiBVcGRhdGUgZG9taW5hdG9yIHRyZWUgdG8KKyAgLy8gcmVmbGVjdCB0aGlzIGNoYW5nZS4KKyAgdGVtcGxhdGUgPGNsYXNzIE4+CisgIHZvaWQgU3BsaXQodHlwZW5hbWUgR3JhcGhUcmFpdHM8Tj46Ok5vZGVSZWYgTmV3QkIpIHsKKyAgICB1c2luZyBHcmFwaFQgPSBHcmFwaFRyYWl0czxOPjsKKyAgICB1c2luZyBOb2RlUmVmID0gdHlwZW5hbWUgR3JhcGhUOjpOb2RlUmVmOworICAgIGFzc2VydChzdGQ6OmRpc3RhbmNlKEdyYXBoVDo6Y2hpbGRfYmVnaW4oTmV3QkIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIEdyYXBoVDo6Y2hpbGRfZW5kKE5ld0JCKSkgPT0gMSAmJgorICAgICAgICAgICAiTmV3QkIgc2hvdWxkIGhhdmUgYSBzaW5nbGUgc3VjY2Vzc29yISIpOworICAgIE5vZGVSZWYgTmV3QkJTdWNjID0gKkdyYXBoVDo6Y2hpbGRfYmVnaW4oTmV3QkIpOworCisgICAgc3RkOjp2ZWN0b3I8Tm9kZVJlZj4gUHJlZEJsb2NrczsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJlByZWQgOiBjaGlsZHJlbjxJbnZlcnNlPE4+PihOZXdCQikpCisgICAgICBQcmVkQmxvY2tzLnB1c2hfYmFjayhQcmVkKTsKKworICAgIGFzc2VydCghUHJlZEJsb2Nrcy5lbXB0eSgpICYmICJObyBwcmVkYmxvY2tzPyIpOworCisgICAgYm9vbCBOZXdCQkRvbWluYXRlc05ld0JCU3VjYyA9IHRydWU7CisgICAgZm9yIChjb25zdCBhdXRvICZQcmVkIDogY2hpbGRyZW48SW52ZXJzZTxOPj4oTmV3QkJTdWNjKSkgeworICAgICAgaWYgKFByZWQgIT0gTmV3QkIgJiYgIWRvbWluYXRlcyhOZXdCQlN1Y2MsIFByZWQpICYmCisgICAgICAgICAgaXNSZWFjaGFibGVGcm9tRW50cnkoUHJlZCkpIHsKKyAgICAgICAgTmV3QkJEb21pbmF0ZXNOZXdCQlN1Y2MgPSBmYWxzZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgLy8gRmluZCBOZXdCQidzIGltbWVkaWF0ZSBkb21pbmF0b3IgYW5kIGNyZWF0ZSBuZXcgZG9taW5hdG9yIHRyZWUgbm9kZSBmb3IKKyAgICAvLyBOZXdCQi4KKyAgICBOb2RlVCAqTmV3QkJJRG9tID0gbnVsbHB0cjsKKyAgICB1bnNpZ25lZCBpID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgUHJlZEJsb2Nrcy5zaXplKCk7ICsraSkKKyAgICAgIGlmIChpc1JlYWNoYWJsZUZyb21FbnRyeShQcmVkQmxvY2tzW2ldKSkgeworICAgICAgICBOZXdCQklEb20gPSBQcmVkQmxvY2tzW2ldOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgIC8vIEl0J3MgcG9zc2libGUgdGhhdCBub25lIG9mIHRoZSBwcmVkZWNlc3NvcnMgb2YgTmV3QkIgYXJlIHJlYWNoYWJsZTsKKyAgICAvLyBpbiB0aGF0IGNhc2UsIE5ld0JCIGl0c2VsZiBpcyB1bnJlYWNoYWJsZSwgc28gbm90aGluZyBuZWVkcyB0byBiZQorICAgIC8vIGNoYW5nZWQuCisgICAgaWYgKCFOZXdCQklEb20pIHJldHVybjsKKworICAgIGZvciAoaSA9IGkgKyAxOyBpIDwgUHJlZEJsb2Nrcy5zaXplKCk7ICsraSkgeworICAgICAgaWYgKGlzUmVhY2hhYmxlRnJvbUVudHJ5KFByZWRCbG9ja3NbaV0pKQorICAgICAgICBOZXdCQklEb20gPSBmaW5kTmVhcmVzdENvbW1vbkRvbWluYXRvcihOZXdCQklEb20sIFByZWRCbG9ja3NbaV0pOworICAgIH0KKworICAgIC8vIENyZWF0ZSB0aGUgbmV3IGRvbWluYXRvciB0cmVlIG5vZGUuLi4gYW5kIHNldCB0aGUgaWRvbSBvZiBOZXdCQi4KKyAgICBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpOZXdCQk5vZGUgPSBhZGROZXdCbG9jayhOZXdCQiwgTmV3QkJJRG9tKTsKKworICAgIC8vIElmIE5ld0JCIHN0cmljdGx5IGRvbWluYXRlcyBvdGhlciBibG9ja3MsIHRoZW4gaXQgaXMgbm93IHRoZSBpbW1lZGlhdGUKKyAgICAvLyBkb21pbmF0b3Igb2YgTmV3QkJTdWNjLiAgVXBkYXRlIHRoZSBkb21pbmF0b3IgdHJlZSBhcyBhcHByb3ByaWF0ZS4KKyAgICBpZiAoTmV3QkJEb21pbmF0ZXNOZXdCQlN1Y2MpIHsKKyAgICAgIERvbVRyZWVOb2RlQmFzZTxOb2RlVD4gKk5ld0JCU3VjY05vZGUgPSBnZXROb2RlKE5ld0JCU3VjYyk7CisgICAgICBjaGFuZ2VJbW1lZGlhdGVEb21pbmF0b3IoTmV3QkJTdWNjTm9kZSwgTmV3QkJOb2RlKTsKKyAgICB9CisgIH0KKworIHByaXZhdGU6CisgIGJvb2wgZG9taW5hdGVkQnlTbG93VHJlZVdhbGsoY29uc3QgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqQSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+ICpCKSBjb25zdCB7CisgICAgYXNzZXJ0KEEgIT0gQik7CisgICAgYXNzZXJ0KGlzUmVhY2hhYmxlRnJvbUVudHJ5KEIpKTsKKyAgICBhc3NlcnQoaXNSZWFjaGFibGVGcm9tRW50cnkoQSkpOworCisgICAgY29uc3QgRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqSURvbTsKKyAgICB3aGlsZSAoKElEb20gPSBCLT5nZXRJRG9tKCkpICE9IG51bGxwdHIgJiYgSURvbSAhPSBBICYmIElEb20gIT0gQikKKyAgICAgIEIgPSBJRG9tOyAgLy8gV2FsayB1cCB0aGUgdHJlZQorICAgIHJldHVybiBJRG9tICE9IG51bGxwdHI7CisgIH0KKworICAvLy8gXGJyaWVmIFdpcGUgdGhpcyB0cmVlJ3Mgc3RhdGUgd2l0aG91dCByZWxlYXNpbmcgYW55IHJlc291cmNlcy4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIGVzc2VudGlhbGx5IGEgcG9zdC1tb3ZlIGhlbHBlciBvbmx5LiBJdCBsZWF2ZXMgdGhlIG9iamVjdCBpbiBhbgorICAvLy8gYXNzaWduYWJsZSBhbmQgZGVzdHJveWFibGUgc3RhdGUsIGJ1dCBvdGhlcndpc2UgaW52YWxpZC4KKyAgdm9pZCB3aXBlKCkgeworICAgIERvbVRyZWVOb2Rlcy5jbGVhcigpOworICAgIFJvb3ROb2RlID0gbnVsbHB0cjsKKyAgICBQYXJlbnQgPSBudWxscHRyOworICB9Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3VzaW5nIERvbVRyZWVCYXNlID0gRG9taW5hdG9yVHJlZUJhc2U8VCwgZmFsc2U+OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3VzaW5nIFBvc3REb21UcmVlQmFzZSA9IERvbWluYXRvclRyZWVCYXNlPFQsIHRydWU+OworCisvLyBUaGVzZSB0d28gZnVuY3Rpb25zIGFyZSBkZWNsYXJlZCBvdXQgb2YgbGluZSBhcyBhIHdvcmthcm91bmQgZm9yIGJ1aWxkaW5nCisvLyB3aXRoIG9sZCAoPCByMTQ3Mjk1KSB2ZXJzaW9ucyBvZiBjbGFuZyBiZWNhdXNlIG9mIHByMTE2NDIuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTm9kZVQsIGJvb2wgSXNQb3N0RG9tPgorYm9vbCBEb21pbmF0b3JUcmVlQmFzZTxOb2RlVCwgSXNQb3N0RG9tPjo6ZG9taW5hdGVzKGNvbnN0IE5vZGVUICpBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5vZGVUICpCKSBjb25zdCB7CisgIGlmIChBID09IEIpCisgICAgcmV0dXJuIHRydWU7CisKKyAgLy8gQ2FzdCBhd2F5IHRoZSBjb25zdCBxdWFsaWZpZXJzIGhlcmUuIFRoaXMgaXMgb2sgc2luY2UKKyAgLy8gdGhpcyBmdW5jdGlvbiBkb2Vzbid0IGFjdHVhbGx5IHJldHVybiB0aGUgdmFsdWVzIHJldHVybmVkCisgIC8vIGZyb20gZ2V0Tm9kZS4KKyAgcmV0dXJuIGRvbWluYXRlcyhnZXROb2RlKGNvbnN0X2Nhc3Q8Tm9kZVQgKj4oQSkpLAorICAgICAgICAgICAgICAgICAgIGdldE5vZGUoY29uc3RfY2FzdDxOb2RlVCAqPihCKSkpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIE5vZGVULCBib29sIElzUG9zdERvbT4KK2Jvb2wgRG9taW5hdG9yVHJlZUJhc2U8Tm9kZVQsIElzUG9zdERvbT46OnByb3Blcmx5RG9taW5hdGVzKAorICAgIGNvbnN0IE5vZGVUICpBLCBjb25zdCBOb2RlVCAqQikgY29uc3QgeworICBpZiAoQSA9PSBCKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBDYXN0IGF3YXkgdGhlIGNvbnN0IHF1YWxpZmllcnMgaGVyZS4gVGhpcyBpcyBvayBzaW5jZQorICAvLyB0aGlzIGZ1bmN0aW9uIGRvZXNuJ3QgYWN0dWFsbHkgcmV0dXJuIHRoZSB2YWx1ZXMgcmV0dXJuZWQKKyAgLy8gZnJvbSBnZXROb2RlLgorICByZXR1cm4gZG9taW5hdGVzKGdldE5vZGUoY29uc3RfY2FzdDxOb2RlVCAqPihBKSksCisgICAgICAgICAgICAgICAgICAgZ2V0Tm9kZShjb25zdF9jYXN0PE5vZGVUICo+KEIpKSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfR0VORVJJQ0RPTVRSRUVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0dlbmVyaWNEb21UcmVlQ29uc3RydWN0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvR2VuZXJpY0RvbVRyZWVDb25zdHJ1Y3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZWMwNjM4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0dlbmVyaWNEb21UcmVlQ29uc3RydWN0aW9uLmgKQEAgLTAsMCArMSwxNjc0IEBACisvLz09PS0gR2VuZXJpY0RvbVRyZWVDb25zdHJ1Y3Rpb24uaCAtIERvbWluYXRvciBDYWxjdWxhdGlvbiAtLS0tLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8KKy8vLyBHZW5lcmljIGRvbWluYXRvciB0cmVlIGNvbnN0cnVjdGlvbiAtIFRoaXMgZmlsZSBwcm92aWRlcyByb3V0aW5lcyB0bworLy8vIGNvbnN0cnVjdCBpbW1lZGlhdGUgZG9taW5hdG9yIGluZm9ybWF0aW9uIGZvciBhIGZsb3ctZ3JhcGggYmFzZWQgb24gdGhlCisvLy8gU2VtaS1OQ0EgYWxnb3JpdGhtIGRlc2NyaWJlZCBpbiB0aGlzIGRpc3NlcnRhdGlvbjoKKy8vLworLy8vICAgTGluZWFyLVRpbWUgQWxnb3JpdGhtcyBmb3IgRG9taW5hdG9ycyBhbmQgUmVsYXRlZCBQcm9ibGVtcworLy8vICAgTG91a2FzIEdlb3JnaWFkaXMsIFByaW5jZXRvbiBVbml2ZXJzaXR5LCBOb3ZlbWJlciAyMDA1LCBwcC4gMjEtMjM6CisvLy8gICBmdHA6Ly9mdHAuY3MucHJpbmNldG9uLmVkdS9yZXBvcnRzLzIwMDUvNzM3LnBkZgorLy8vCisvLy8gVGhpcyBpbXBsZW1lbnRzIHRoZSBPKG4qbG9nKG4pKSB2ZXJzaW9ucyBvZiBFVkFMIGFuZCBMSU5LLCBiZWNhdXNlIGl0IHR1cm5zCisvLy8gb3V0IHRoYXQgdGhlIHRoZW9yZXRpY2FsbHkgc2xvd2VyIE8obipsb2cobikpIGltcGxlbWVudGF0aW9uIGlzIGFjdHVhbGx5CisvLy8gZmFzdGVyIHRoYW4gdGhlIGFsbW9zdC1saW5lYXIgTyhuKmFscGhhKG4pKSB2ZXJzaW9uLCBldmVuIGZvciBsYXJnZSBDRkdzLgorLy8vCisvLy8gVGhlIGZpbGUgdXNlcyB0aGUgRGVwdGggQmFzZWQgU2VhcmNoIGFsZ29yaXRobSB0byBwZXJmb3JtIGluY3JlbWVudGFsCisvLy8gdXBkYXRlcyAoaW5zZXJ0aW9uIGFuZCBkZWxldGlvbnMpLiBUaGUgaW1wbGVtZW50ZWQgYWxnb3JpdGhtIGlzIGJhc2VkIG9uCisvLy8gdGhpcyBwdWJsaWNhdGlvbjoKKy8vLworLy8vICAgQW4gRXhwZXJpbWVudGFsIFN0dWR5IG9mIER5bmFtaWMgRG9taW5hdG9ycworLy8vICAgTG91a2FzIEdlb3JnaWFkaXMsIGV0IGFsLiwgQXByaWwgMTIgMjAxNiwgcHAuIDUtNywgOS0xMDoKKy8vLyAgIGh0dHBzOi8vYXJ4aXYub3JnL3BkZi8xNjA0LjAyNzExLnBkZgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9HRU5FUklDRE9NVFJFRUNPTlNUUlVDVElPTl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9HRU5FUklDRE9NVFJFRUNPTlNUUlVDVElPTl9ICisKKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVwdGhGaXJzdEl0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9pbnRlckludFBhaXIuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EZWJ1Zy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9HZW5lcmljRG9tVHJlZS5oIgorCisjZGVmaW5lIERFQlVHX1RZUEUgImRvbS10cmVlLWJ1aWxkZXIiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBEb21UcmVlQnVpbGRlciB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBEb21UcmVlVD4KK3N0cnVjdCBTZW1pTkNBSW5mbyB7CisgIHVzaW5nIE5vZGVQdHIgPSB0eXBlbmFtZSBEb21UcmVlVDo6Tm9kZVB0cjsKKyAgdXNpbmcgTm9kZVQgPSB0eXBlbmFtZSBEb21UcmVlVDo6Tm9kZVR5cGU7CisgIHVzaW5nIFRyZWVOb2RlUHRyID0gRG9tVHJlZU5vZGVCYXNlPE5vZGVUPiAqOworICB1c2luZyBSb290c1QgPSBkZWNsdHlwZShEb21UcmVlVDo6Um9vdHMpOworICBzdGF0aWMgY29uc3RleHByIGJvb2wgSXNQb3N0RG9tID0gRG9tVHJlZVQ6OklzUG9zdERvbWluYXRvcjsKKworICAvLyBJbmZvcm1hdGlvbiByZWNvcmQgdXNlZCBieSBTZW1pLU5DQSBkdXJpbmcgdHJlZSBjb25zdHJ1Y3Rpb24uCisgIHN0cnVjdCBJbmZvUmVjIHsKKyAgICB1bnNpZ25lZCBERlNOdW0gPSAwOworICAgIHVuc2lnbmVkIFBhcmVudCA9IDA7CisgICAgdW5zaWduZWQgU2VtaSA9IDA7CisgICAgTm9kZVB0ciBMYWJlbCA9IG51bGxwdHI7CisgICAgTm9kZVB0ciBJRG9tID0gbnVsbHB0cjsKKyAgICBTbWFsbFZlY3RvcjxOb2RlUHRyLCAyPiBSZXZlcnNlQ2hpbGRyZW47CisgIH07CisKKyAgLy8gTnVtYmVyIHRvIG5vZGUgbWFwcGluZyBpcyAxLWJhc2VkLiBJbml0aWFsaXplIHRoZSBtYXBwaW5nIHRvIHN0YXJ0IHdpdGgKKyAgLy8gYSBkdW1teSBlbGVtZW50LgorICBzdGQ6OnZlY3RvcjxOb2RlUHRyPiBOdW1Ub05vZGUgPSB7bnVsbHB0cn07CisgIERlbnNlTWFwPE5vZGVQdHIsIEluZm9SZWM+IE5vZGVUb0luZm87CisKKyAgdXNpbmcgVXBkYXRlVCA9IHR5cGVuYW1lIERvbVRyZWVUOjpVcGRhdGVUeXBlOworICBzdHJ1Y3QgQmF0Y2hVcGRhdGVJbmZvIHsKKyAgICBTbWFsbFZlY3RvcjxVcGRhdGVULCA0PiBVcGRhdGVzOworICAgIHVzaW5nIE5vZGVQdHJBbmRLaW5kID0gUG9pbnRlckludFBhaXI8Tm9kZVB0ciwgMSwgVXBkYXRlS2luZD47CisKKyAgICAvLyBJbiBvcmRlciB0byBiZSBhYmxlIHRvIHdhbGsgYSBDRkcgdGhhdCBpcyBvdXQgb2Ygc3luYyB3aXRoIHRoZSBDRkcKKyAgICAvLyBEb21pbmF0b3JUcmVlIGxhc3Qga25ldyBhYm91dCwgdXNlIHRoZSBsaXN0IG9mIHVwZGF0ZXMgdG8gcmVjb25zdHJ1Y3QKKyAgICAvLyBwcmV2aW91cyBDRkcgdmVyc2lvbnMgb2YgdGhlIGN1cnJlbnQgQ0ZHLiBGb3IgZWFjaCBub2RlLCB3ZSBzdG9yZSBhIHNldAorICAgIC8vIG9mIGl0cyB2aXJ0dWFsbHkgYWRkZWQvZGVsZXRlZCBmdXR1cmUgc3VjY2Vzc29ycyBhbmQgcHJlZGVjZXNzb3JzLgorICAgIC8vIE5vdGUgdGhhdCB0aGVzZSBjaGlsZHJlbiBhcmUgZnJvbSB0aGUgZnV0dXJlIHJlbGF0aXZlIHRvIHdoYXQgdGhlCisgICAgLy8gRG9taW5hdG9yVHJlZSBrbm93cyBhYm91dCAtLSB1c2luZyB0aGVtIHRvIGdldHMgdXMgc29tZSBzbmFwc2hvdCBvZiB0aGUKKyAgICAvLyBDRkcgZnJvbSB0aGUgcGFzdCAocmVsYXRpdmUgdG8gdGhlIHN0YXRlIG9mIHRoZSBDRkcpLgorICAgIERlbnNlTWFwPE5vZGVQdHIsIFNtYWxsRGVuc2VTZXQ8Tm9kZVB0ckFuZEtpbmQsIDQ+PiBGdXR1cmVTdWNjZXNzb3JzOworICAgIERlbnNlTWFwPE5vZGVQdHIsIFNtYWxsRGVuc2VTZXQ8Tm9kZVB0ckFuZEtpbmQsIDQ+PiBGdXR1cmVQcmVkZWNlc3NvcnM7CisgICAgLy8gUmVtZW1iZXJzIGlmIHRoZSB3aG9sZSB0cmVlIHdhcyByZWNhbGN1bGF0ZWQgYXQgc29tZSBwb2ludCBkdXJpbmcgdGhlCisgICAgLy8gY3VycmVudCBiYXRjaCB1cGRhdGUuCisgICAgYm9vbCBJc1JlY2FsY3VsYXRlZCA9IGZhbHNlOworICB9OworCisgIEJhdGNoVXBkYXRlSW5mbyAqQmF0Y2hVcGRhdGVzOworICB1c2luZyBCYXRjaFVwZGF0ZVB0ciA9IEJhdGNoVXBkYXRlSW5mbyAqOworCisgIC8vIElmIEJVSSBpcyBhIG51bGxwdHIsIHRoZW4gdGhlcmUncyBubyBiYXRjaCB1cGRhdGUgaW4gcHJvZ3Jlc3MuCisgIFNlbWlOQ0FJbmZvKEJhdGNoVXBkYXRlUHRyIEJVSSkgOiBCYXRjaFVwZGF0ZXMoQlVJKSB7fQorCisgIHZvaWQgY2xlYXIoKSB7CisgICAgTnVtVG9Ob2RlID0ge251bGxwdHJ9OyAvLyBSZXN0b3JlIHRvIGluaXRpYWwgc3RhdGUgd2l0aCBhIGR1bW15IHN0YXJ0IG5vZGUuCisgICAgTm9kZVRvSW5mby5jbGVhcigpOworICAgIC8vIERvbid0IHJlc2V0IHRoZSBwb2ludGVyIHRvIEJhdGNoVXBkYXRlSW5mbyBoZXJlIC0tIGlmIHRoZXJlJ3MgYW4gdXBkYXRlCisgICAgLy8gaW4gcHJvZ3Jlc3MsIHdlIG5lZWQgdGhpcyBpbmZvcm1hdGlvbiB0byBjb250aW51ZSBpdC4KKyAgfQorCisgIHRlbXBsYXRlIDxib29sIEludmVyc2U+CisgIHN0cnVjdCBDaGlsZHJlbkdldHRlciB7CisgICAgdXNpbmcgUmVzdWx0VHkgPSBTbWFsbFZlY3RvcjxOb2RlUHRyLCA4PjsKKworICAgIHN0YXRpYyBSZXN1bHRUeSBHZXQoTm9kZVB0ciBOLCBzdGQ6OmludGVncmFsX2NvbnN0YW50PGJvb2wsIGZhbHNlPikgeworICAgICAgYXV0byBSQ2hpbGRyZW4gPSByZXZlcnNlKGNoaWxkcmVuPE5vZGVQdHI+KE4pKTsKKyAgICAgIHJldHVybiBSZXN1bHRUeShSQ2hpbGRyZW4uYmVnaW4oKSwgUkNoaWxkcmVuLmVuZCgpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgUmVzdWx0VHkgR2V0KE5vZGVQdHIgTiwgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLCB0cnVlPikgeworICAgICAgYXV0byBJQ2hpbGRyZW4gPSBpbnZlcnNlX2NoaWxkcmVuPE5vZGVQdHI+KE4pOworICAgICAgcmV0dXJuIFJlc3VsdFR5KElDaGlsZHJlbi5iZWdpbigpLCBJQ2hpbGRyZW4uZW5kKCkpOworICAgIH0KKworICAgIHVzaW5nIFRhZyA9IHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwgSW52ZXJzZT47CisKKyAgICAvLyBUaGUgZnVuY3Rpb24gYmVsb3cgaXMgdGhlIGNvcmUgcGFydCBvZiB0aGUgYmF0Y2ggdXBkYXRlci4gSXQgYWxsb3dzIHRoZQorICAgIC8vIERlcHRoIEJhc2VkIFNlYXJjaCBhbGdvcml0aG0gdG8gcGVyZm9ybSBpbmNyZW1lbnRhbCB1cGRhdGVzIGluIGxvY2tzdGVwCisgICAgLy8gd2l0aCB1cGRhdGVzIHRvIHRoZSBDRkcuIFdlIGVtdWxhdGVkIGxvY2tzdGVwIENGRyB1cGRhdGVzIGJ5IGdldHRpbmcgaXRzCisgICAgLy8gbmV4dCBzbmFwc2hvdHMgYnkgcmV2ZXJzZS1hcHBseWluZyBmdXR1cmUgdXBkYXRlcy4KKyAgICBzdGF0aWMgUmVzdWx0VHkgR2V0KE5vZGVQdHIgTiwgQmF0Y2hVcGRhdGVQdHIgQlVJKSB7CisgICAgICBSZXN1bHRUeSBSZXMgPSBHZXQoTiwgVGFnKCkpOworICAgICAgLy8gSWYgdGhlcmUncyBubyBiYXRjaCB1cGRhdGUgaW4gcHJvZ3Jlc3MsIHNpbXBseSByZXR1cm4gbm9kZSdzIGNoaWxkcmVuLgorICAgICAgaWYgKCFCVUkpIHJldHVybiBSZXM7CisKKyAgICAgIC8vIENGRyBjaGlsZHJlbiBhcmUgYWN0dWFsbHkgaXRzICptb3N0IGN1cnJlbnQqIGNoaWxkcmVuLCBhbmQgd2UgaGF2ZSB0bworICAgICAgLy8gcmV2ZXJzZS1hcHBseSB0aGUgZnV0dXJlIHVwZGF0ZXMgdG8gZ2V0IHRoZSBub2RlJ3MgY2hpbGRyZW4gYXQgdGhlCisgICAgICAvLyBwb2ludCBpbiB0aW1lIHRoZSB1cGRhdGUgd2FzIHBlcmZvcm1lZC4KKyAgICAgIGF1dG8gJkZ1dHVyZUNoaWxkcmVuID0gKEludmVyc2UgIT0gSXNQb3N0RG9tKSA/IEJVSS0+RnV0dXJlUHJlZGVjZXNzb3JzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBCVUktPkZ1dHVyZVN1Y2Nlc3NvcnM7CisgICAgICBhdXRvIEZDSXQgPSBGdXR1cmVDaGlsZHJlbi5maW5kKE4pOworICAgICAgaWYgKEZDSXQgPT0gRnV0dXJlQ2hpbGRyZW4uZW5kKCkpIHJldHVybiBSZXM7CisKKyAgICAgIGZvciAoYXV0byBDaGlsZEFuZEtpbmQgOiBGQ0l0LT5zZWNvbmQpIHsKKyAgICAgICAgY29uc3QgTm9kZVB0ciBDaGlsZCA9IENoaWxkQW5kS2luZC5nZXRQb2ludGVyKCk7CisgICAgICAgIGNvbnN0IFVwZGF0ZUtpbmQgVUsgPSBDaGlsZEFuZEtpbmQuZ2V0SW50KCk7CisKKyAgICAgICAgLy8gUmV2ZXJzZS1hcHBseSB0aGUgZnV0dXJlIHVwZGF0ZS4KKyAgICAgICAgaWYgKFVLID09IFVwZGF0ZUtpbmQ6Okluc2VydCkgeworICAgICAgICAgIC8vIElmIHRoZXJlJ3MgYW4gaW5zZXJ0aW9uIGluIHRoZSBmdXR1cmUsIGl0IG1lYW5zIHRoYXQgdGhlIGVkZ2UgbXVzdAorICAgICAgICAgIC8vIGV4aXN0IGluIHRoZSBjdXJyZW50IENGRywgYnV0IHdhcyBub3QgcHJlc2VudCBpbiBpdCBiZWZvcmUuCisgICAgICAgICAgYXNzZXJ0KGxsdm06OmZpbmQoUmVzLCBDaGlsZCkgIT0gUmVzLmVuZCgpCisgICAgICAgICAgICAgICAgICYmICJFeHBlY3RlZCBjaGlsZCBub3QgZm91bmQgaW4gdGhlIENGRyIpOworICAgICAgICAgIFJlcy5lcmFzZShzdGQ6OnJlbW92ZShSZXMuYmVnaW4oKSwgUmVzLmVuZCgpLCBDaGlsZCksIFJlcy5lbmQoKSk7CisgICAgICAgICAgREVCVUcoZGJncygpIDw8ICJcdEhpZGluZyBlZGdlICIgPDwgQmxvY2tOYW1lUHJpbnRlcihOKSA8PCAiIC0+ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgQmxvY2tOYW1lUHJpbnRlcihDaGlsZCkgPDwgIlxuIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgLy8gSWYgdGhlcmUncyBhbiBkZWxldGlvbiBpbiB0aGUgZnV0dXJlLCBpdCBtZWFucyB0aGF0IHRoZSBlZGdlIGNhbm5vdAorICAgICAgICAgIC8vIGV4aXN0IGluIHRoZSBjdXJyZW50IENGRywgYnV0IGV4aXN0ZWQgaW4gaXQgYmVmb3JlLgorICAgICAgICAgIGFzc2VydChsbHZtOjpmaW5kKFJlcywgQ2hpbGQpID09IFJlcy5lbmQoKSAmJgorICAgICAgICAgICAgICAgICAiVW5leHBlY3RlZCBjaGlsZCBmb3VuZCBpbiB0aGUgQ0ZHIik7CisgICAgICAgICAgREVCVUcoZGJncygpIDw8ICJcdFNob3dpbmcgdmlydHVhbCBlZGdlICIgPDwgQmxvY2tOYW1lUHJpbnRlcihOKQorICAgICAgICAgICAgICAgICAgICAgICA8PCAiIC0+ICIgPDwgQmxvY2tOYW1lUHJpbnRlcihDaGlsZCkgPDwgIlxuIik7CisgICAgICAgICAgUmVzLnB1c2hfYmFjayhDaGlsZCk7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgcmV0dXJuIFJlczsKKyAgICB9CisgIH07CisKKyAgTm9kZVB0ciBnZXRJRG9tKE5vZGVQdHIgQkIpIGNvbnN0IHsKKyAgICBhdXRvIEluZm9JdCA9IE5vZGVUb0luZm8uZmluZChCQik7CisgICAgaWYgKEluZm9JdCA9PSBOb2RlVG9JbmZvLmVuZCgpKSByZXR1cm4gbnVsbHB0cjsKKworICAgIHJldHVybiBJbmZvSXQtPnNlY29uZC5JRG9tOworICB9CisKKyAgVHJlZU5vZGVQdHIgZ2V0Tm9kZUZvckJsb2NrKE5vZGVQdHIgQkIsIERvbVRyZWVUICZEVCkgeworICAgIGlmIChUcmVlTm9kZVB0ciBOb2RlID0gRFQuZ2V0Tm9kZShCQikpIHJldHVybiBOb2RlOworCisgICAgLy8gSGF2ZW4ndCBjYWxjdWxhdGVkIHRoaXMgbm9kZSB5ZXQ/ICBHZXQgb3IgY2FsY3VsYXRlIHRoZSBub2RlIGZvciB0aGUKKyAgICAvLyBpbW1lZGlhdGUgZG9taW5hdG9yLgorICAgIE5vZGVQdHIgSURvbSA9IGdldElEb20oQkIpOworCisgICAgYXNzZXJ0KElEb20gfHwgRFQuRG9tVHJlZU5vZGVzW251bGxwdHJdKTsKKyAgICBUcmVlTm9kZVB0ciBJRG9tTm9kZSA9IGdldE5vZGVGb3JCbG9jayhJRG9tLCBEVCk7CisKKyAgICAvLyBBZGQgYSBuZXcgdHJlZSBub2RlIGZvciB0aGlzIE5vZGVULCBhbmQgbGluayBpdCBhcyBhIGNoaWxkIG9mCisgICAgLy8gSURvbU5vZGUKKyAgICByZXR1cm4gKERULkRvbVRyZWVOb2Rlc1tCQl0gPSBJRG9tTm9kZS0+YWRkQ2hpbGQoCisgICAgICAgIGxsdm06Om1ha2VfdW5pcXVlPERvbVRyZWVOb2RlQmFzZTxOb2RlVD4+KEJCLCBJRG9tTm9kZSkpKQorICAgICAgICAuZ2V0KCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBBbHdheXNEZXNjZW5kKE5vZGVQdHIsIE5vZGVQdHIpIHsgcmV0dXJuIHRydWU7IH0KKworICBzdHJ1Y3QgQmxvY2tOYW1lUHJpbnRlciB7CisgICAgTm9kZVB0ciBOOworCisgICAgQmxvY2tOYW1lUHJpbnRlcihOb2RlUHRyIEJsb2NrKSA6IE4oQmxvY2spIHt9CisgICAgQmxvY2tOYW1lUHJpbnRlcihUcmVlTm9kZVB0ciBUTikgOiBOKFROID8gVE4tPmdldEJsb2NrKCkgOiBudWxscHRyKSB7fQorCisgICAgZnJpZW5kIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPLCBjb25zdCBCbG9ja05hbWVQcmludGVyICZCUCkgeworICAgICAgaWYgKCFCUC5OKQorICAgICAgICBPIDw8ICJudWxscHRyIjsKKyAgICAgIGVsc2UKKyAgICAgICAgQlAuTi0+cHJpbnRBc09wZXJhbmQoTywgZmFsc2UpOworCisgICAgICByZXR1cm4gTzsKKyAgICB9CisgIH07CisKKyAgLy8gQ3VzdG9tIERGUyBpbXBsZW1lbnRhdGlvbiB3aGljaCBjYW4gc2tpcCBub2RlcyBiYXNlZCBvbiBhIHByb3ZpZGVkCisgIC8vIHByZWRpY2F0ZS4gSXQgYWxzbyBjb2xsZWN0cyBSZXZlcnNlQ2hpbGRyZW4gc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHNwZW5kCisgIC8vIHRpbWUgZ2V0dGluZyBwcmVkZWNlc3NvcnMgaW4gU2VtaU5DQS4KKyAgLy8KKyAgLy8gSWYgSXNSZXZlcnNlIGlzIHNldCB0byB0cnVlLCB0aGUgREZTIHdhbGsgd2lsbCBiZSBwZXJmb3JtZWQgYmFja3dhcmRzCisgIC8vIHJlbGF0aXZlIHRvIElzUG9zdERvbSAtLSB1c2luZyByZXZlcnNlIGVkZ2VzIGZvciBkb21pbmF0b3JzIGFuZCBmb3J3YXJkCisgIC8vIGVkZ2VzIGZvciBwb3N0ZG9taW5hdG9ycy4KKyAgdGVtcGxhdGUgPGJvb2wgSXNSZXZlcnNlID0gZmFsc2UsIHR5cGVuYW1lIERlc2NlbmRDb25kaXRpb24+CisgIHVuc2lnbmVkIHJ1bkRGUyhOb2RlUHRyIFYsIHVuc2lnbmVkIExhc3ROdW0sIERlc2NlbmRDb25kaXRpb24gQ29uZGl0aW9uLAorICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQXR0YWNoVG9OdW0pIHsKKyAgICBhc3NlcnQoVik7CisgICAgU21hbGxWZWN0b3I8Tm9kZVB0ciwgNjQ+IFdvcmtMaXN0ID0ge1Z9OworICAgIGlmIChOb2RlVG9JbmZvLmNvdW50KFYpICE9IDApIE5vZGVUb0luZm9bVl0uUGFyZW50ID0gQXR0YWNoVG9OdW07CisKKyAgICB3aGlsZSAoIVdvcmtMaXN0LmVtcHR5KCkpIHsKKyAgICAgIGNvbnN0IE5vZGVQdHIgQkIgPSBXb3JrTGlzdC5wb3BfYmFja192YWwoKTsKKyAgICAgIGF1dG8gJkJCSW5mbyA9IE5vZGVUb0luZm9bQkJdOworCisgICAgICAvLyBWaXNpdGVkIG5vZGVzIGFsd2F5cyBoYXZlIHBvc2l0aXZlIERGUyBudW1iZXJzLgorICAgICAgaWYgKEJCSW5mby5ERlNOdW0gIT0gMCkgY29udGludWU7CisgICAgICBCQkluZm8uREZTTnVtID0gQkJJbmZvLlNlbWkgPSArK0xhc3ROdW07CisgICAgICBCQkluZm8uTGFiZWwgPSBCQjsKKyAgICAgIE51bVRvTm9kZS5wdXNoX2JhY2soQkIpOworCisgICAgICBjb25zdGV4cHIgYm9vbCBEaXJlY3Rpb24gPSBJc1JldmVyc2UgIT0gSXNQb3N0RG9tOyAgLy8gWE9SLgorICAgICAgZm9yIChjb25zdCBOb2RlUHRyIFN1Y2MgOgorICAgICAgICAgICBDaGlsZHJlbkdldHRlcjxEaXJlY3Rpb24+OjpHZXQoQkIsIEJhdGNoVXBkYXRlcykpIHsKKyAgICAgICAgY29uc3QgYXV0byBTSVQgPSBOb2RlVG9JbmZvLmZpbmQoU3VjYyk7CisgICAgICAgIC8vIERvbid0IHZpc2l0IG5vZGVzIG1vcmUgdGhhbiBvbmNlIGJ1dCByZW1lbWJlciB0byBjb2xsZWN0CisgICAgICAgIC8vIFJldmVyc2VDaGlsZHJlbi4KKyAgICAgICAgaWYgKFNJVCAhPSBOb2RlVG9JbmZvLmVuZCgpICYmIFNJVC0+c2Vjb25kLkRGU051bSAhPSAwKSB7CisgICAgICAgICAgaWYgKFN1Y2MgIT0gQkIpIFNJVC0+c2Vjb25kLlJldmVyc2VDaGlsZHJlbi5wdXNoX2JhY2soQkIpOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCFDb25kaXRpb24oQkIsIFN1Y2MpKSBjb250aW51ZTsKKworICAgICAgICAvLyBJdCdzIGZpbmUgdG8gYWRkIFN1Y2MgdG8gdGhlIG1hcCwgYmVjYXVzZSB3ZSBrbm93IHRoYXQgaXQgd2lsbCBiZQorICAgICAgICAvLyB2aXNpdGVkIGxhdGVyLgorICAgICAgICBhdXRvICZTdWNjSW5mbyA9IE5vZGVUb0luZm9bU3VjY107CisgICAgICAgIFdvcmtMaXN0LnB1c2hfYmFjayhTdWNjKTsKKyAgICAgICAgU3VjY0luZm8uUGFyZW50ID0gTGFzdE51bTsKKyAgICAgICAgU3VjY0luZm8uUmV2ZXJzZUNoaWxkcmVuLnB1c2hfYmFjayhCQik7CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIExhc3ROdW07CisgIH0KKworICBOb2RlUHRyIGV2YWwoTm9kZVB0ciBWSW4sIHVuc2lnbmVkIExhc3RMaW5rZWQpIHsKKyAgICBhdXRvICZWSW5JbmZvID0gTm9kZVRvSW5mb1tWSW5dOworICAgIGlmIChWSW5JbmZvLkRGU051bSA8IExhc3RMaW5rZWQpCisgICAgICByZXR1cm4gVkluOworCisgICAgU21hbGxWZWN0b3I8Tm9kZVB0ciwgMzI+IFdvcms7CisgICAgU21hbGxQdHJTZXQ8Tm9kZVB0ciwgMzI+IFZpc2l0ZWQ7CisKKyAgICBpZiAoVkluSW5mby5QYXJlbnQgPj0gTGFzdExpbmtlZCkKKyAgICAgIFdvcmsucHVzaF9iYWNrKFZJbik7CisKKyAgICB3aGlsZSAoIVdvcmsuZW1wdHkoKSkgeworICAgICAgTm9kZVB0ciBWID0gV29yay5iYWNrKCk7CisgICAgICBhdXRvICZWSW5mbyA9IE5vZGVUb0luZm9bVl07CisgICAgICBOb2RlUHRyIFZBbmNlc3RvciA9IE51bVRvTm9kZVtWSW5mby5QYXJlbnRdOworCisgICAgICAvLyBQcm9jZXNzIEFuY2VzdG9yIGZpcnN0CisgICAgICBpZiAoVmlzaXRlZC5pbnNlcnQoVkFuY2VzdG9yKS5zZWNvbmQgJiYgVkluZm8uUGFyZW50ID49IExhc3RMaW5rZWQpIHsKKyAgICAgICAgV29yay5wdXNoX2JhY2soVkFuY2VzdG9yKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBXb3JrLnBvcF9iYWNrKCk7CisKKyAgICAgIC8vIFVwZGF0ZSBWSW5mbyBiYXNlZCBvbiBBbmNlc3RvciBpbmZvCisgICAgICBpZiAoVkluZm8uUGFyZW50IDwgTGFzdExpbmtlZCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIGF1dG8gJlZBSW5mbyA9IE5vZGVUb0luZm9bVkFuY2VzdG9yXTsKKyAgICAgIE5vZGVQdHIgVkFuY2VzdG9yTGFiZWwgPSBWQUluZm8uTGFiZWw7CisgICAgICBOb2RlUHRyIFZMYWJlbCA9IFZJbmZvLkxhYmVsOworICAgICAgaWYgKE5vZGVUb0luZm9bVkFuY2VzdG9yTGFiZWxdLlNlbWkgPCBOb2RlVG9JbmZvW1ZMYWJlbF0uU2VtaSkKKyAgICAgICAgVkluZm8uTGFiZWwgPSBWQW5jZXN0b3JMYWJlbDsKKyAgICAgIFZJbmZvLlBhcmVudCA9IFZBSW5mby5QYXJlbnQ7CisgICAgfQorCisgICAgcmV0dXJuIFZJbkluZm8uTGFiZWw7CisgIH0KKworICAvLyBUaGlzIGZ1bmN0aW9uIHJlcXVpcmVzIERGUyB0byBiZSBydW4gYmVmb3JlIGNhbGxpbmcgaXQuCisgIHZvaWQgcnVuU2VtaU5DQShEb21UcmVlVCAmRFQsIGNvbnN0IHVuc2lnbmVkIE1pbkxldmVsID0gMCkgeworICAgIGNvbnN0IHVuc2lnbmVkIE5leHRERlNOdW0oTnVtVG9Ob2RlLnNpemUoKSk7CisgICAgLy8gSW5pdGlhbGl6ZSBJRG9tcyB0byBzcGFubmluZyB0cmVlIHBhcmVudHMuCisgICAgZm9yICh1bnNpZ25lZCBpID0gMTsgaSA8IE5leHRERlNOdW07ICsraSkgeworICAgICAgY29uc3QgTm9kZVB0ciBWID0gTnVtVG9Ob2RlW2ldOworICAgICAgYXV0byAmVkluZm8gPSBOb2RlVG9JbmZvW1ZdOworICAgICAgVkluZm8uSURvbSA9IE51bVRvTm9kZVtWSW5mby5QYXJlbnRdOworICAgIH0KKworICAgIC8vIFN0ZXAgIzE6IENhbGN1bGF0ZSB0aGUgc2VtaWRvbWluYXRvcnMgb2YgYWxsIHZlcnRpY2VzLgorICAgIGZvciAodW5zaWduZWQgaSA9IE5leHRERlNOdW0gLSAxOyBpID49IDI7IC0taSkgeworICAgICAgTm9kZVB0ciBXID0gTnVtVG9Ob2RlW2ldOworICAgICAgYXV0byAmV0luZm8gPSBOb2RlVG9JbmZvW1ddOworCisgICAgICAvLyBJbml0aWFsaXplIHRoZSBzZW1pIGRvbWluYXRvciB0byBwb2ludCB0byB0aGUgcGFyZW50IG5vZGUuCisgICAgICBXSW5mby5TZW1pID0gV0luZm8uUGFyZW50OworICAgICAgZm9yIChjb25zdCBhdXRvICZOIDogV0luZm8uUmV2ZXJzZUNoaWxkcmVuKSB7CisgICAgICAgIGlmIChOb2RlVG9JbmZvLmNvdW50KE4pID09IDApICAvLyBTa2lwIHVucmVhY2hhYmxlIHByZWRlY2Vzc29ycy4KKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICBjb25zdCBUcmVlTm9kZVB0ciBUTiA9IERULmdldE5vZGUoTik7CisgICAgICAgIC8vIFNraXAgcHJlZGVjZXNzb3JzIHdob3NlIGxldmVsIGlzIGFib3ZlIHRoZSBzdWJ0cmVlIHdlIGFyZSBwcm9jZXNzaW5nLgorICAgICAgICBpZiAoVE4gJiYgVE4tPmdldExldmVsKCkgPCBNaW5MZXZlbCkKKyAgICAgICAgICBjb250aW51ZTsKKworICAgICAgICB1bnNpZ25lZCBTZW1pVSA9IE5vZGVUb0luZm9bZXZhbChOLCBpICsgMSldLlNlbWk7CisgICAgICAgIGlmIChTZW1pVSA8IFdJbmZvLlNlbWkpIFdJbmZvLlNlbWkgPSBTZW1pVTsKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBTdGVwICMyOiBFeHBsaWNpdGx5IGRlZmluZSB0aGUgaW1tZWRpYXRlIGRvbWluYXRvciBvZiBlYWNoIHZlcnRleC4KKyAgICAvLyAgICAgICAgICBJRG9tW2ldID0gTkNBKFNEb21baV0sIFNwYW5uaW5nVHJlZVBhcmVudChpKSkuCisgICAgLy8gTm90ZSB0aGF0IHRoZSBwYXJlbnRzIHdlcmUgc3RvcmVkIGluIElEb21zIGFuZCBsYXRlciBnb3QgaW52YWxpZGF0ZWQKKyAgICAvLyBkdXJpbmcgcGF0aCBjb21wcmVzc2lvbiBpbiBFdmFsLgorICAgIGZvciAodW5zaWduZWQgaSA9IDI7IGkgPCBOZXh0REZTTnVtOyArK2kpIHsKKyAgICAgIGNvbnN0IE5vZGVQdHIgVyA9IE51bVRvTm9kZVtpXTsKKyAgICAgIGF1dG8gJldJbmZvID0gTm9kZVRvSW5mb1tXXTsKKyAgICAgIGNvbnN0IHVuc2lnbmVkIFNEb21OdW0gPSBOb2RlVG9JbmZvW051bVRvTm9kZVtXSW5mby5TZW1pXV0uREZTTnVtOworICAgICAgTm9kZVB0ciBXSURvbUNhbmRpZGF0ZSA9IFdJbmZvLklEb207CisgICAgICB3aGlsZSAoTm9kZVRvSW5mb1tXSURvbUNhbmRpZGF0ZV0uREZTTnVtID4gU0RvbU51bSkKKyAgICAgICAgV0lEb21DYW5kaWRhdGUgPSBOb2RlVG9JbmZvW1dJRG9tQ2FuZGlkYXRlXS5JRG9tOworCisgICAgICBXSW5mby5JRG9tID0gV0lEb21DYW5kaWRhdGU7CisgICAgfQorICB9CisKKyAgLy8gUG9zdERvbWluYXRvclRyZWUgYWx3YXlzIGhhcyBhIHZpcnR1YWwgcm9vdCB0aGF0IHJlcHJlc2VudHMgYSB2aXJ0dWFsIENGRworICAvLyBub2RlIHRoYXQgc2VydmVzIGFzIGEgc2luZ2xlIGV4aXQgZnJvbSB0aGUgZnVuY3Rpb24uIEFsbCB0aGUgb3RoZXIgZXhpdHMKKyAgLy8gKENGRyBub2RlcyB3aXRoIHRlcm1pbmF0b3JzIGFuZCBub2RlcyBpbiBpbmZpbml0ZSBsb29wcyBhcmUgbG9naWNhbGx5CisgIC8vIGNvbm5lY3RlZCB0byB0aGlzIHZpcnR1YWwgQ0ZHIGV4aXQgbm9kZSkuCisgIC8vIFRoaXMgZnVuY3Rpb25zIG1hcHMgYSBudWxscHRyIENGRyBub2RlIHRvIHRoZSB2aXJ0dWFsIHJvb3QgdHJlZSBub2RlLgorICB2b2lkIGFkZFZpcnR1YWxSb290KCkgeworICAgIGFzc2VydChJc1Bvc3REb20gJiYgIk9ubHkgcG9zdGRvbWluYXRvcnMgaGF2ZSBhIHZpcnR1YWwgcm9vdCIpOworICAgIGFzc2VydChOdW1Ub05vZGUuc2l6ZSgpID09IDEgJiYgIlNOQ0FJbmZvIG11c3QgYmUgZnJlc2hseSBjb25zdHJ1Y3RlZCIpOworCisgICAgYXV0byAmQkJJbmZvID0gTm9kZVRvSW5mb1tudWxscHRyXTsKKyAgICBCQkluZm8uREZTTnVtID0gQkJJbmZvLlNlbWkgPSAxOworICAgIEJCSW5mby5MYWJlbCA9IG51bGxwdHI7CisKKyAgICBOdW1Ub05vZGUucHVzaF9iYWNrKG51bGxwdHIpOyAgLy8gTnVtVG9Ob2RlWzFdID0gbnVsbHB0cjsKKyAgfQorCisgIC8vIEZvciBwb3N0ZG9taW5hdG9ycywgbm9kZXMgd2l0aCBubyBmb3J3YXJkIHN1Y2Nlc3NvcnMgYXJlIHRyaXZpYWwgcm9vdHMgdGhhdAorICAvLyBhcmUgYWx3YXlzIHNlbGVjdGVkIGFzIHRyZWUgcm9vdHMuIFJvb3RzIHdpdGggZm9yd2FyZCBzdWNjZXNzb3JzIGNvcnJlc3BvbmQKKyAgLy8gdG8gQ0ZHIG5vZGVzIHdpdGhpbiBpbmZpbml0ZSBsb29wcy4KKyAgc3RhdGljIGJvb2wgSGFzRm9yd2FyZFN1Y2Nlc3NvcnMoY29uc3QgTm9kZVB0ciBOLCBCYXRjaFVwZGF0ZVB0ciBCVUkpIHsKKyAgICBhc3NlcnQoTiAmJiAiTiBtdXN0IGJlIGEgdmFsaWQgbm9kZSIpOworICAgIHJldHVybiAhQ2hpbGRyZW5HZXR0ZXI8ZmFsc2U+OjpHZXQoTiwgQlVJKS5lbXB0eSgpOworICB9CisKKyAgc3RhdGljIE5vZGVQdHIgR2V0RW50cnlOb2RlKGNvbnN0IERvbVRyZWVUICZEVCkgeworICAgIGFzc2VydChEVC5QYXJlbnQgJiYgIlBhcmVudCBub3Qgc2V0Iik7CisgICAgcmV0dXJuIEdyYXBoVHJhaXRzPHR5cGVuYW1lIERvbVRyZWVUOjpQYXJlbnRQdHI+OjpnZXRFbnRyeU5vZGUoRFQuUGFyZW50KTsKKyAgfQorCisgIC8vIEZpbmRzIGFsbCByb290cyB3aXRob3V0IHJlbGF5aW5nIG9uIHRoZSBzZXQgb2Ygcm9vdHMgYWxyZWFkeSBzdG9yZWQgaW4gdGhlCisgIC8vIHRyZWUuCisgIC8vIFdlIGRlZmluZSByb290cyB0byBiZSBzb21lIG5vbi1yZWR1bmRhbnQgc2V0IG9mIHRoZSBDRkcgbm9kZXMKKyAgc3RhdGljIFJvb3RzVCBGaW5kUm9vdHMoY29uc3QgRG9tVHJlZVQgJkRULCBCYXRjaFVwZGF0ZVB0ciBCVUkpIHsKKyAgICBhc3NlcnQoRFQuUGFyZW50ICYmICJQYXJlbnQgcG9pbnRlciBpcyBub3Qgc2V0Iik7CisgICAgUm9vdHNUIFJvb3RzOworCisgICAgLy8gRm9yIGRvbWluYXRvcnMsIGZ1bmN0aW9uIGVudHJ5IENGRyBub2RlIGlzIGFsd2F5cyBhIHRyZWUgcm9vdCBub2RlLgorICAgIGlmICghSXNQb3N0RG9tKSB7CisgICAgICBSb290cy5wdXNoX2JhY2soR2V0RW50cnlOb2RlKERUKSk7CisgICAgICByZXR1cm4gUm9vdHM7CisgICAgfQorCisgICAgU2VtaU5DQUluZm8gU05DQShCVUkpOworCisgICAgLy8gUG9zdERvbWluYXRvclRyZWUgYWx3YXlzIGhhcyBhIHZpcnR1YWwgcm9vdC4KKyAgICBTTkNBLmFkZFZpcnR1YWxSb290KCk7CisgICAgdW5zaWduZWQgTnVtID0gMTsKKworICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRcdExvb2tpbmcgZm9yIHRyaXZpYWwgcm9vdHNcbiIpOworCisgICAgLy8gU3RlcCAjMTogRmluZCBhbGwgdGhlIHRyaXZpYWwgcm9vdHMgdGhhdCBhcmUgZ29pbmcgdG8gd2lsbCBkZWZpbml0ZWx5CisgICAgLy8gcmVtYWluIHRyZWUgcm9vdHMuCisgICAgdW5zaWduZWQgVG90YWwgPSAwOworICAgIC8vIEl0IG1heSBoYXBwZW4gdGhhdCB0aGVyZSBhcmUgc29tZSBuZXcgbm9kZXMgaW4gdGhlIENGRyB0aGF0IGFyZSByZXN1bHQgb2YKKyAgICAvLyB0aGUgb25nb2luZyBiYXRjaCB1cGRhdGUsIGJ1dCB3ZSBjYW5ub3QgcmVhbGx5IHByZXRlbmQgdGhhdCB0aGV5IGRvbid0CisgICAgLy8gZXhpc3QgLS0gd2Ugd29uJ3Qgc2VlIGFueSBvdXRnb2luZyBvciBpbmNvbWluZyBlZGdlcyB0byB0aGVtLCBzbyBpdCdzCisgICAgLy8gZmluZSB0byBkaXNjb3ZlciB0aGVtIGhlcmUsIGFzIHRoZXkgd291bGQgZW5kIHVwIGFwcGVhcmluZyBpbiB0aGUgQ0ZHIGF0CisgICAgLy8gc29tZSBwb2ludCBhbnl3YXkuCisgICAgZm9yIChjb25zdCBOb2RlUHRyIE4gOiBub2RlcyhEVC5QYXJlbnQpKSB7CisgICAgICArK1RvdGFsOworICAgICAgLy8gSWYgaXQgaGFzIG5vICpzdWNjZXNzb3JzKiwgaXQgaXMgZGVmaW5pdGVseSBhIHJvb3QuCisgICAgICBpZiAoIUhhc0ZvcndhcmRTdWNjZXNzb3JzKE4sIEJVSSkpIHsKKyAgICAgICAgUm9vdHMucHVzaF9iYWNrKE4pOworICAgICAgICAvLyBSdW4gREZTIG5vdCB0byB3YWxrIHRoaXMgcGFydCBvZiBDRkcgbGF0ZXIuCisgICAgICAgIE51bSA9IFNOQ0EucnVuREZTKE4sIE51bSwgQWx3YXlzRGVzY2VuZCwgMSk7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiRm91bmQgYSBuZXcgdHJpdmlhbCByb290OiAiIDw8IEJsb2NrTmFtZVByaW50ZXIoTikKKyAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIpOworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIkxhc3QgdmlzaXRlZCBub2RlOiAiCisgICAgICAgICAgICAgICAgICAgICA8PCBCbG9ja05hbWVQcmludGVyKFNOQ0EuTnVtVG9Ob2RlW051bV0pIDw8ICJcbiIpOworICAgICAgfQorICAgIH0KKworICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRcdExvb2tpbmcgZm9yIG5vbi10cml2aWFsIHJvb3RzXG4iKTsKKworICAgIC8vIFN0ZXAgIzI6IEZpbmQgYWxsIG5vbi10cml2aWFsIHJvb3QgY2FuZGlkYXRlcy4gVGhvc2UgYXJlIENGRyBub2RlcyB0aGF0CisgICAgLy8gYXJlIHJldmVyc2UtdW5yZWFjaGFibGUgd2VyZSBub3QgdmlzaXRlZCBieSBwcmV2aW91cyBERlMgd2Fsa3MgKGkuZS4gQ0ZHCisgICAgLy8gbm9kZXMgaW4gaW5maW5pdGUgbG9vcHMpLgorICAgIGJvb2wgSGFzTm9uVHJpdmlhbFJvb3RzID0gZmFsc2U7CisgICAgLy8gQWNjb3VudGluZyBmb3IgdGhlIHZpcnR1YWwgZXhpdCwgc2VlIGlmIHdlIGhhZCBhbnkgcmV2ZXJzZS11bnJlYWNoYWJsZQorICAgIC8vIG5vZGVzLgorICAgIGlmIChUb3RhbCArIDEgIT0gTnVtKSB7CisgICAgICBIYXNOb25Ucml2aWFsUm9vdHMgPSB0cnVlOworICAgICAgLy8gTWFrZSBhbm90aGVyIERGUyBwYXNzIG92ZXIgYWxsIG90aGVyIG5vZGVzIHRvIGZpbmQgdGhlCisgICAgICAvLyByZXZlcnNlLXVucmVhY2hhYmxlIGJsb2NrcywgYW5kIGZpbmQgdGhlIGZ1cnRoZXN0IHBhdGhzIHdlJ2xsIGJlIGFibGUKKyAgICAgIC8vIHRvIG1ha2UuCisgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBsb29rcyBOXjIsIGJ1dCBpdCdzIHJlYWxseSAyTiB3b3JzdCBjYXNlLCBpZiBldmVyeSBub2RlCisgICAgICAvLyBpcyB1bnJlYWNoYWJsZS4gVGhpcyBpcyBiZWNhdXNlIHdlIGFyZSBzdGlsbCBnb2luZyB0byBvbmx5IHZpc2l0IGVhY2gKKyAgICAgIC8vIHVucmVhY2hhYmxlIG5vZGUgb25jZSwgd2UgbWF5IGp1c3QgdmlzaXQgaXQgaW4gdHdvIGRpcmVjdGlvbnMsCisgICAgICAvLyBkZXBlbmRpbmcgb24gaG93IGx1Y2t5IHdlIGdldC4KKyAgICAgIFNtYWxsUHRyU2V0PE5vZGVQdHIsIDQ+IENvbm5lY3RUb0V4aXRCbG9jazsKKyAgICAgIGZvciAoY29uc3QgTm9kZVB0ciBJIDogbm9kZXMoRFQuUGFyZW50KSkgeworICAgICAgICBpZiAoU05DQS5Ob2RlVG9JbmZvLmNvdW50KEkpID09IDApIHsKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0XHRcdFZpc2l0aW5nIG5vZGUgIiA8PCBCbG9ja05hbWVQcmludGVyKEkpCisgICAgICAgICAgICAgICAgICAgICAgIDw8ICJcbiIpOworICAgICAgICAgIC8vIEZpbmQgdGhlIGZ1cnRoZXN0IGF3YXkgd2UgY2FuIGdldCBieSBmb2xsb3dpbmcgc3VjY2Vzc29ycywgdGhlbgorICAgICAgICAgIC8vIGZvbGxvdyB0aGVtIGluIHJldmVyc2UuICBUaGlzIGdpdmVzIHVzIHNvbWUgcmVhc29uYWJsZSBhbnN3ZXIgYWJvdXQKKyAgICAgICAgICAvLyB0aGUgcG9zdC1kb20gdHJlZSBpbnNpZGUgYW55IGluZmluaXRlIGxvb3AuIEluIHBhcnRpY3VsYXIsIGl0CisgICAgICAgICAgLy8gZ3VhcmFudGVlcyB3ZSBnZXQgdG8gdGhlIGZhcnRoZXN0IGF3YXkgcG9pbnQgYWxvbmcgKnNvbWUqCisgICAgICAgICAgLy8gcGF0aC4gVGhpcyBhbHNvIG1hdGNoZXMgdGhlIEdDQydzIGJlaGF2aW9yLgorICAgICAgICAgIC8vIElmIHdlIHJlYWxseSB3YW50ZWQgYSB0b3RhbGx5IGNvbXBsZXRlIHBpY3R1cmUgb2YgZG9taW5hbmNlIGluc2lkZQorICAgICAgICAgIC8vIHRoaXMgaW5maW5pdGUgbG9vcCwgd2UgY291bGQgZG8gaXQgd2l0aCBTQ0MtbGlrZSBhbGdvcml0aG1zIHRvIGZpbmQKKyAgICAgICAgICAvLyB0aGUgbG93ZXN0IGFuZCBoaWdoZXN0IHBvaW50cyBpbiB0aGUgaW5maW5pdGUgbG9vcC4gIEluIHRoZW9yeSwgaXQKKyAgICAgICAgICAvLyB3b3VsZCBiZSBuaWNlIHRvIGdpdmUgdGhlIGNhbm9uaWNhbCBiYWNrZWRnZSBmb3IgdGhlIGxvb3AsIGJ1dCBpdCdzCisgICAgICAgICAgLy8gZXhwZW5zaXZlIGFuZCBkb2VzIG5vdCBhbHdheXMgbGVhZCB0byBhIG1pbmltYWwgc2V0IG9mIHJvb3RzLgorICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRcdFx0UnVubmluZyBmb3J3YXJkIERGU1xuIik7CisKKyAgICAgICAgICBjb25zdCB1bnNpZ25lZCBOZXdOdW0gPSBTTkNBLnJ1bkRGUzx0cnVlPihJLCBOdW0sIEFsd2F5c0Rlc2NlbmQsIE51bSk7CisgICAgICAgICAgY29uc3QgTm9kZVB0ciBGdXJ0aGVzdEF3YXkgPSBTTkNBLk51bVRvTm9kZVtOZXdOdW1dOworICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRcdFx0Rm91bmQgYSBuZXcgZnVydGhlc3QgYXdheSBub2RlICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgIihub24tdHJpdmlhbCByb290KTogIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBCbG9ja05hbWVQcmludGVyKEZ1cnRoZXN0QXdheSkgPDwgIlxuIik7CisgICAgICAgICAgQ29ubmVjdFRvRXhpdEJsb2NrLmluc2VydChGdXJ0aGVzdEF3YXkpOworICAgICAgICAgIFJvb3RzLnB1c2hfYmFjayhGdXJ0aGVzdEF3YXkpOworICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRcdFx0UHJldiBERlNOdW06ICIgPDwgTnVtIDw8ICIsIG5ldyBERlNOdW06ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgTmV3TnVtIDw8ICJcblx0XHRcdFJlbW92aW5nIERGUyBpbmZvXG4iKTsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBOZXdOdW07IGkgPiBOdW07IC0taSkgeworICAgICAgICAgICAgY29uc3QgTm9kZVB0ciBOID0gU05DQS5OdW1Ub05vZGVbaV07CisgICAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0XHRcdFx0UmVtb3ZpbmcgREZTIGluZm8gZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBCbG9ja05hbWVQcmludGVyKE4pIDw8ICJcbiIpOworICAgICAgICAgICAgU05DQS5Ob2RlVG9JbmZvLmVyYXNlKE4pOworICAgICAgICAgICAgU05DQS5OdW1Ub05vZGUucG9wX2JhY2soKTsKKyAgICAgICAgICB9CisgICAgICAgICAgY29uc3QgdW5zaWduZWQgUHJldk51bSA9IE51bTsKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0XHRcdFJ1bm5pbmcgcmV2ZXJzZSBERlNcbiIpOworICAgICAgICAgIE51bSA9IFNOQ0EucnVuREZTKEZ1cnRoZXN0QXdheSwgTnVtLCBBbHdheXNEZXNjZW5kLCAxKTsKKyAgICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSBQcmV2TnVtICsgMTsgaSA8PSBOdW07ICsraSkKKyAgICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRcdFx0XHRmb3VuZCBub2RlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBCbG9ja05hbWVQcmludGVyKFNOQ0EuTnVtVG9Ob2RlW2ldKSA8PCAiXG4iKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIERFQlVHKGRiZ3MoKSA8PCAiVG90YWw6ICIgPDwgVG90YWwgPDwgIiwgTnVtOiAiIDw8IE51bSA8PCAiXG4iKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIkRpc2NvdmVyZWQgQ0ZHIG5vZGVzOlxuIik7CisgICAgREVCVUcoZm9yIChzaXplX3QgaSA9IDA7IGkgPD0gTnVtOyArK2kpIGRiZ3MoKQorICAgICAgICAgIDw8IGkgPDwgIjogIiA8PCBCbG9ja05hbWVQcmludGVyKFNOQ0EuTnVtVG9Ob2RlW2ldKSA8PCAiXG4iKTsKKworICAgIGFzc2VydCgoVG90YWwgKyAxID09IE51bSkgJiYgIkV2ZXJ5dGhpbmcgc2hvdWxkIGhhdmUgYmVlbiB2aXNpdGVkIik7CisKKyAgICAvLyBTdGVwICMzOiBJZiB3ZSBmb3VuZCBzb21lIG5vbi10cml2aWFsIHJvb3RzLCBtYWtlIHRoZW0gbm9uLXJlZHVuZGFudC4KKyAgICBpZiAoSGFzTm9uVHJpdmlhbFJvb3RzKSBSZW1vdmVSZWR1bmRhbnRSb290cyhEVCwgQlVJLCBSb290cyk7CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIkZvdW5kIHJvb3RzOiAiKTsKKyAgICBERUJVRyhmb3IgKGF1dG8gKlJvb3QgOiBSb290cykgZGJncygpIDw8IEJsb2NrTmFtZVByaW50ZXIoUm9vdCkgPDwgIiAiKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlxuIik7CisKKyAgICByZXR1cm4gUm9vdHM7CisgIH0KKworICAvLyBUaGlzIGZ1bmN0aW9uIG9ubHkgbWFrZXMgc2Vuc2UgZm9yIHBvc3Rkb21pbmF0b3JzLgorICAvLyBXZSBkZWZpbmUgcm9vdHMgdG8gYmUgc29tZSBzZXQgb2YgQ0ZHIG5vZGVzIHdoZXJlIChyZXZlcnNlKSBERlMgd2Fsa3MgaGF2ZQorICAvLyB0byBzdGFydCBpbiBvcmRlciB0byB2aXNpdCBhbGwgdGhlIENGRyBub2RlcyAoaW5jbHVkaW5nIHRoZQorICAvLyByZXZlcnNlLXVucmVhY2hhYmxlIG9uZXMpLgorICAvLyBXaGVuIHRoZSBzZWFyY2ggZm9yIG5vbi10cml2aWFsIHJvb3RzIGlzIGRvbmUgaXQgbWF5IGhhcHBlbiB0aGF0IHNvbWUgb2YKKyAgLy8gdGhlIG5vbi10cml2aWFsIHJvb3RzIGFyZSByZXZlcnNlLXJlYWNoYWJsZSBmcm9tIG90aGVyIG5vbi10cml2aWFsIHJvb3RzLAorICAvLyB3aGljaCBtYWtlcyB0aGVtIHJlZHVuZGFudC4gVGhpcyBmdW5jdGlvbiByZW1vdmVzIHRoZW0gZnJvbSB0aGUgc2V0IG9mCisgIC8vIGlucHV0IHJvb3RzLgorICBzdGF0aWMgdm9pZCBSZW1vdmVSZWR1bmRhbnRSb290cyhjb25zdCBEb21UcmVlVCAmRFQsIEJhdGNoVXBkYXRlUHRyIEJVSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUm9vdHNUICZSb290cykgeworICAgIGFzc2VydChJc1Bvc3REb20gJiYgIlRoaXMgZnVuY3Rpb24gaXMgZm9yIHBvc3Rkb21pbmF0b3JzIG9ubHkiKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlJlbW92aW5nIHJlZHVuZGFudCByb290c1xuIik7CisKKyAgICBTZW1pTkNBSW5mbyBTTkNBKEJVSSk7CisKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgUm9vdHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIGF1dG8gJlJvb3QgPSBSb290c1tpXTsKKyAgICAgIC8vIFRyaXZpYWwgcm9vdHMgYXJlIGFsd2F5cyBub24tcmVkdW5kYW50LgorICAgICAgaWYgKCFIYXNGb3J3YXJkU3VjY2Vzc29ycyhSb290LCBCVUkpKSBjb250aW51ZTsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRDaGVja2luZyBpZiAiIDw8IEJsb2NrTmFtZVByaW50ZXIoUm9vdCkKKyAgICAgICAgICAgICAgICAgICA8PCAiIHJlbWFpbnMgYSByb290XG4iKTsKKyAgICAgIFNOQ0EuY2xlYXIoKTsKKyAgICAgIC8vIERvIGEgZm9yd2FyZCB3YWxrIGxvb2tpbmcgZm9yIHRoZSBvdGhlciByb290cy4KKyAgICAgIGNvbnN0IHVuc2lnbmVkIE51bSA9IFNOQ0EucnVuREZTPHRydWU+KFJvb3QsIDAsIEFsd2F5c0Rlc2NlbmQsIDApOworICAgICAgLy8gU2tpcCB0aGUgc3RhcnQgbm9kZSBhbmQgYmVnaW4gZnJvbSB0aGUgc2Vjb25kIG9uZSAobm90ZSB0aGF0IERGUyB1c2VzCisgICAgICAvLyAxLWJhc2VkIGluZGV4aW5nKS4KKyAgICAgIGZvciAodW5zaWduZWQgeCA9IDI7IHggPD0gTnVtOyArK3gpIHsKKyAgICAgICAgY29uc3QgTm9kZVB0ciBOID0gU05DQS5OdW1Ub05vZGVbeF07CisgICAgICAgIC8vIElmIHdlIHdvdW5kIGFub3RoZXIgcm9vdCBpbiBhIChmb3J3YXJkKSBERlMgd2FsaywgcmVtb3ZlIHRoZSBjdXJyZW50CisgICAgICAgIC8vIHJvb3QgZnJvbSB0aGUgc2V0IG9mIHJvb3RzLCBhcyBpdCBpcyByZXZlcnNlLXJlYWNoYWJsZSBmcm9tIHRoZSBvdGhlcgorICAgICAgICAvLyBvbmUuCisgICAgICAgIGlmIChsbHZtOjpmaW5kKFJvb3RzLCBOKSAhPSBSb290cy5lbmQoKSkgeworICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRGb3J3YXJkIERGUyB3YWxrIGZvdW5kIGFub3RoZXIgcm9vdCAiCisgICAgICAgICAgICAgICAgICAgICAgIDw8IEJsb2NrTmFtZVByaW50ZXIoTikgPDwgIlxuXHRSZW1vdmluZyByb290ICIKKyAgICAgICAgICAgICAgICAgICAgICAgPDwgQmxvY2tOYW1lUHJpbnRlcihSb290KSA8PCAiXG4iKTsKKyAgICAgICAgICBzdGQ6OnN3YXAoUm9vdCwgUm9vdHMuYmFjaygpKTsKKyAgICAgICAgICBSb290cy5wb3BfYmFjaygpOworCisgICAgICAgICAgLy8gUm9vdCBhdCB0aGUgYmFjayB0YWtlcyB0aGUgY3VycmVudCByb290J3MgcGxhY2UuCisgICAgICAgICAgLy8gU3RhcnQgdGhlIG5leHQgbG9vcCBpdGVyYXRpb24gd2l0aCB0aGUgc2FtZSBpbmRleC4KKyAgICAgICAgICAtLWk7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY2VuZENvbmRpdGlvbj4KKyAgdm9pZCBkb0Z1bGxERlNXYWxrKGNvbnN0IERvbVRyZWVUICZEVCwgRGVzY2VuZENvbmRpdGlvbiBEQykgeworICAgIGlmICghSXNQb3N0RG9tKSB7CisgICAgICBhc3NlcnQoRFQuUm9vdHMuc2l6ZSgpID09IDEgJiYgIkRvbWluYXRvcnMgc2hvdWxkIGhhdmUgYSBzaW5nZSByb290Iik7CisgICAgICBydW5ERlMoRFQuUm9vdHNbMF0sIDAsIERDLCAwKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBhZGRWaXJ0dWFsUm9vdCgpOworICAgIHVuc2lnbmVkIE51bSA9IDE7CisgICAgZm9yIChjb25zdCBOb2RlUHRyIFJvb3QgOiBEVC5Sb290cykgTnVtID0gcnVuREZTKFJvb3QsIE51bSwgREMsIDApOworICB9CisKKyAgc3RhdGljIHZvaWQgQ2FsY3VsYXRlRnJvbVNjcmF0Y2goRG9tVHJlZVQgJkRULCBCYXRjaFVwZGF0ZVB0ciBCVUkpIHsKKyAgICBhdXRvICpQYXJlbnQgPSBEVC5QYXJlbnQ7CisgICAgRFQucmVzZXQoKTsKKyAgICBEVC5QYXJlbnQgPSBQYXJlbnQ7CisgICAgU2VtaU5DQUluZm8gU05DQShudWxscHRyKTsgIC8vIFNpbmNlIHdlIGFyZSByZWJ1aWxkaW5nIHRoZSB3aG9sZSB0cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGVyZSdzIG5vIHBvaW50IGRvaW5nIGl0IGluY3JlbWVudGFsbHkuCisKKyAgICAvLyBTdGVwICMwOiBOdW1iZXIgYmxvY2tzIGluIGRlcHRoLWZpcnN0IG9yZGVyIGFuZCBpbml0aWFsaXplIHZhcmlhYmxlcyB1c2VkCisgICAgLy8gaW4gbGF0ZXIgc3RhZ2VzIG9mIHRoZSBhbGdvcml0aG0uCisgICAgRFQuUm9vdHMgPSBGaW5kUm9vdHMoRFQsIG51bGxwdHIpOworICAgIFNOQ0EuZG9GdWxsREZTV2FsayhEVCwgQWx3YXlzRGVzY2VuZCk7CisKKyAgICBTTkNBLnJ1blNlbWlOQ0EoRFQpOworICAgIGlmIChCVUkpIHsKKyAgICAgIEJVSS0+SXNSZWNhbGN1bGF0ZWQgPSB0cnVlOworICAgICAgREVCVUcoZGJncygpIDw8ICJEb21UcmVlIHJlY2FsY3VsYXRlZCwgc2tpcHBpbmcgZnV0dXJlIGJhdGNoIHVwZGF0ZXNcbiIpOworICAgIH0KKworICAgIGlmIChEVC5Sb290cy5lbXB0eSgpKSByZXR1cm47CisKKyAgICAvLyBBZGQgYSBub2RlIGZvciB0aGUgcm9vdC4gSWYgdGhlIHRyZWUgaXMgYSBQb3N0RG9taW5hdG9yVHJlZSBpdCB3aWxsIGJlCisgICAgLy8gdGhlIHZpcnR1YWwgZXhpdCAoZGVub3RlZCBieSAoQmFzaWNCbG9jayAqKSBudWxscHRyKSB3aGljaCBwb3N0ZG9taW5hdGVzCisgICAgLy8gYWxsIHJlYWwgZXhpdHMgKGluY2x1ZGluZyBtdWx0aXBsZSBleGl0IGJsb2NrcywgaW5maW5pdGUgbG9vcHMpLgorICAgIE5vZGVQdHIgUm9vdCA9IElzUG9zdERvbSA/IG51bGxwdHIgOiBEVC5Sb290c1swXTsKKworICAgIERULlJvb3ROb2RlID0gKERULkRvbVRyZWVOb2Rlc1tSb290XSA9CisgICAgICAgICAgICAgICAgICAgICAgIGxsdm06Om1ha2VfdW5pcXVlPERvbVRyZWVOb2RlQmFzZTxOb2RlVD4+KFJvb3QsIG51bGxwdHIpKQorICAgICAgICAuZ2V0KCk7CisgICAgU05DQS5hdHRhY2hOZXdTdWJ0cmVlKERULCBEVC5Sb290Tm9kZSk7CisgIH0KKworICB2b2lkIGF0dGFjaE5ld1N1YnRyZWUoRG9tVHJlZVQmIERULCBjb25zdCBUcmVlTm9kZVB0ciBBdHRhY2hUbykgeworICAgIC8vIEF0dGFjaCB0aGUgZmlyc3QgdW5yZWFjaGFibGUgYmxvY2sgdG8gQXR0YWNoVG8uCisgICAgTm9kZVRvSW5mb1tOdW1Ub05vZGVbMV1dLklEb20gPSBBdHRhY2hUby0+Z2V0QmxvY2soKTsKKyAgICAvLyBMb29wIG92ZXIgYWxsIG9mIHRoZSBkaXNjb3ZlcmVkIGJsb2NrcyBpbiB0aGUgZnVuY3Rpb24uLi4KKyAgICBmb3IgKHNpemVfdCBpID0gMSwgZSA9IE51bVRvTm9kZS5zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBOb2RlUHRyIFcgPSBOdW1Ub05vZGVbaV07CisgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0ZGlzY292ZXJlZCBhIG5ldyByZWFjaGFibGUgbm9kZSAiCisgICAgICAgICAgICAgICAgICAgPDwgQmxvY2tOYW1lUHJpbnRlcihXKSA8PCAiXG4iKTsKKworICAgICAgLy8gRG9uJ3QgcmVwbGFjZSB0aGlzIHdpdGggJ2NvdW50JywgdGhlIGluc2VydGlvbiBzaWRlIGVmZmVjdCBpcyBpbXBvcnRhbnQKKyAgICAgIGlmIChEVC5Eb21UcmVlTm9kZXNbV10pIGNvbnRpbnVlOyAgLy8gSGF2ZW4ndCBjYWxjdWxhdGVkIHRoaXMgbm9kZSB5ZXQ/CisKKyAgICAgIE5vZGVQdHIgSW1tRG9tID0gZ2V0SURvbShXKTsKKworICAgICAgLy8gR2V0IG9yIGNhbGN1bGF0ZSB0aGUgbm9kZSBmb3IgdGhlIGltbWVkaWF0ZSBkb21pbmF0b3IuCisgICAgICBUcmVlTm9kZVB0ciBJRG9tTm9kZSA9IGdldE5vZGVGb3JCbG9jayhJbW1Eb20sIERUKTsKKworICAgICAgLy8gQWRkIGEgbmV3IHRyZWUgbm9kZSBmb3IgdGhpcyBCYXNpY0Jsb2NrLCBhbmQgbGluayBpdCBhcyBhIGNoaWxkIG9mCisgICAgICAvLyBJRG9tTm9kZS4KKyAgICAgIERULkRvbVRyZWVOb2Rlc1tXXSA9IElEb21Ob2RlLT5hZGRDaGlsZCgKKyAgICAgICAgICBsbHZtOjptYWtlX3VuaXF1ZTxEb21UcmVlTm9kZUJhc2U8Tm9kZVQ+PihXLCBJRG9tTm9kZSkpOworICAgIH0KKyAgfQorCisgIHZvaWQgcmVhdHRhY2hFeGlzdGluZ1N1YnRyZWUoRG9tVHJlZVQgJkRULCBjb25zdCBUcmVlTm9kZVB0ciBBdHRhY2hUbykgeworICAgIE5vZGVUb0luZm9bTnVtVG9Ob2RlWzFdXS5JRG9tID0gQXR0YWNoVG8tPmdldEJsb2NrKCk7CisgICAgZm9yIChzaXplX3QgaSA9IDEsIGUgPSBOdW1Ub05vZGUuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgY29uc3QgTm9kZVB0ciBOID0gTnVtVG9Ob2RlW2ldOworICAgICAgY29uc3QgVHJlZU5vZGVQdHIgVE4gPSBEVC5nZXROb2RlKE4pOworICAgICAgYXNzZXJ0KFROKTsKKyAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIE5ld0lEb20gPSBEVC5nZXROb2RlKE5vZGVUb0luZm9bTl0uSURvbSk7CisgICAgICBUTi0+c2V0SURvbShOZXdJRG9tKTsKKyAgICB9CisgIH0KKworICAvLyBIZWxwZXIgc3RydWN0IHVzZWQgZHVyaW5nIGVkZ2UgaW5zZXJ0aW9ucy4KKyAgc3RydWN0IEluc2VydGlvbkluZm8geworICAgIHVzaW5nIEJ1Y2tldEVsZW1lbnRUeSA9IHN0ZDo6cGFpcjx1bnNpZ25lZCwgVHJlZU5vZGVQdHI+OworICAgIHN0cnVjdCBEZWNyZWFzaW5nTGV2ZWwgeworICAgICAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEJ1Y2tldEVsZW1lbnRUeSAmRmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVja2V0RWxlbWVudFR5ICZTZWNvbmQpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEZpcnN0LmZpcnN0ID4gU2Vjb25kLmZpcnN0OworICAgICAgfQorICAgIH07CisKKyAgICBzdGQ6OnByaW9yaXR5X3F1ZXVlPEJ1Y2tldEVsZW1lbnRUeSwgU21hbGxWZWN0b3I8QnVja2V0RWxlbWVudFR5LCA4PiwKKyAgICAgICAgRGVjcmVhc2luZ0xldmVsPgorICAgICAgICBCdWNrZXQ7ICAvLyBRdWV1ZSBvZiB0cmVlIG5vZGVzIHNvcnRlZCBieSBsZXZlbCBpbiBkZXNjZW5kaW5nIG9yZGVyLgorICAgIFNtYWxsRGVuc2VTZXQ8VHJlZU5vZGVQdHIsIDg+IEFmZmVjdGVkOworICAgIFNtYWxsRGVuc2VNYXA8VHJlZU5vZGVQdHIsIHVuc2lnbmVkLCA4PiBWaXNpdGVkOworICAgIFNtYWxsVmVjdG9yPFRyZWVOb2RlUHRyLCA4PiBBZmZlY3RlZFF1ZXVlOworICAgIFNtYWxsVmVjdG9yPFRyZWVOb2RlUHRyLCA4PiBWaXNpdGVkTm90QWZmZWN0ZWRRdWV1ZTsKKyAgfTsKKworICBzdGF0aWMgdm9pZCBJbnNlcnRFZGdlKERvbVRyZWVUICZEVCwgY29uc3QgQmF0Y2hVcGRhdGVQdHIgQlVJLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5vZGVQdHIgRnJvbSwgY29uc3QgTm9kZVB0ciBUbykgeworICAgIGFzc2VydCgoRnJvbSB8fCBJc1Bvc3REb20pICYmCisgICAgICAgICAgICJGcm9tIGhhcyB0byBiZSBhIHZhbGlkIENGRyBub2RlIG9yIGEgdmlydHVhbCByb290Iik7CisgICAgYXNzZXJ0KFRvICYmICJDYW5ub3QgYmUgYSBudWxscHRyIik7CisgICAgREVCVUcoZGJncygpIDw8ICJJbnNlcnRpbmcgZWRnZSAiIDw8IEJsb2NrTmFtZVByaW50ZXIoRnJvbSkgPDwgIiAtPiAiCisgICAgICAgICAgICAgICAgIDw8IEJsb2NrTmFtZVByaW50ZXIoVG8pIDw8ICJcbiIpOworICAgIFRyZWVOb2RlUHRyIEZyb21UTiA9IERULmdldE5vZGUoRnJvbSk7CisKKyAgICBpZiAoIUZyb21UTikgeworICAgICAgLy8gSWdub3JlIGVkZ2VzIGZyb20gdW5yZWFjaGFibGUgbm9kZXMgZm9yIChmb3J3YXJkKSBkb21pbmF0b3JzLgorICAgICAgaWYgKCFJc1Bvc3REb20pIHJldHVybjsKKworICAgICAgLy8gVGhlIHVucmVhY2hhYmxlIG5vZGUgYmVjb21lcyBhIG5ldyByb290IC0tIGEgdHJlZSBub2RlIGZvciBpdC4KKyAgICAgIFRyZWVOb2RlUHRyIFZpcnR1YWxSb290ID0gRFQuZ2V0Tm9kZShudWxscHRyKTsKKyAgICAgIEZyb21UTiA9CisgICAgICAgICAgKERULkRvbVRyZWVOb2Rlc1tGcm9tXSA9IFZpcnR1YWxSb290LT5hZGRDaGlsZCgKKyAgICAgICAgICAgICAgIGxsdm06Om1ha2VfdW5pcXVlPERvbVRyZWVOb2RlQmFzZTxOb2RlVD4+KEZyb20sIFZpcnR1YWxSb290KSkpCisgICAgICAgICAgICAgIC5nZXQoKTsKKyAgICAgIERULlJvb3RzLnB1c2hfYmFjayhGcm9tKTsKKyAgICB9CisKKyAgICBEVC5ERlNJbmZvVmFsaWQgPSBmYWxzZTsKKworICAgIGNvbnN0IFRyZWVOb2RlUHRyIFRvVE4gPSBEVC5nZXROb2RlKFRvKTsKKyAgICBpZiAoIVRvVE4pCisgICAgICBJbnNlcnRVbnJlYWNoYWJsZShEVCwgQlVJLCBGcm9tVE4sIFRvKTsKKyAgICBlbHNlCisgICAgICBJbnNlcnRSZWFjaGFibGUoRFQsIEJVSSwgRnJvbVROLCBUb1ROKTsKKyAgfQorCisgIC8vIERldGVybWluZXMgaWYgc29tZSBleGlzdGluZyByb290IGJlY29tZXMgcmV2ZXJzZS1yZWFjaGFibGUgYWZ0ZXIgdGhlCisgIC8vIGluc2VydGlvbi4gUmVidWlsZHMgdGhlIHdob2xlIHRyZWUgaWYgdGhhdCBzaXR1YXRpb24gaGFwcGVucy4KKyAgc3RhdGljIGJvb2wgVXBkYXRlUm9vdHNCZWZvcmVJbnNlcnRpb24oRG9tVHJlZVQgJkRULCBjb25zdCBCYXRjaFVwZGF0ZVB0ciBCVUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIEZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIFRvKSB7CisgICAgYXNzZXJ0KElzUG9zdERvbSAmJiAiVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGZvciBwb3N0ZG9taW5hdG9ycyIpOworICAgIC8vIERlc3RpbmF0aW9uIG5vZGUgaXMgbm90IGF0dGFjaGVkIHRvIHRoZSB2aXJ0dWFsIHJvb3QsIHNvIGl0IGNhbm5vdCBiZSBhCisgICAgLy8gcm9vdC4KKyAgICBpZiAoIURULmlzVmlydHVhbFJvb3QoVG8tPmdldElEb20oKSkpIHJldHVybiBmYWxzZTsKKworICAgIGF1dG8gUkl0ID0gbGx2bTo6ZmluZChEVC5Sb290cywgVG8tPmdldEJsb2NrKCkpOworICAgIGlmIChSSXQgPT0gRFQuUm9vdHMuZW5kKCkpCisgICAgICByZXR1cm4gZmFsc2U7ICAvLyBUbyBpcyBub3QgYSByb290LCBub3RoaW5nIHRvIHVwZGF0ZS4KKworICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRcdEFmdGVyIHRoZSBpbnNlcnRpb24sICIgPDwgQmxvY2tOYW1lUHJpbnRlcihUbykKKyAgICAgICAgICAgICAgICAgPDwgIiBpcyBubyBsb25nZXIgYSByb290XG5cdFx0UmVidWlsZGluZyB0aGUgdHJlZSEhIVxuIik7CisKKyAgICBDYWxjdWxhdGVGcm9tU2NyYXRjaChEVCwgQlVJKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFVwZGF0ZXMgdGhlIHNldCBvZiByb290cyBhZnRlciBpbnNlcnRpb24gb3IgZGVsZXRpb24uIFRoaXMgZW5zdXJlcyB0aGF0CisgIC8vIHJvb3RzIGFyZSB0aGUgc2FtZSB3aGVuIGFmdGVyIGEgc2VyaWVzIG9mIHVwZGF0ZXMgYW5kIHdoZW4gdGhlIHRyZWUgd291bGQKKyAgLy8gYmUgYnVpbHQgZnJvbSBzY3JhdGNoLgorICBzdGF0aWMgdm9pZCBVcGRhdGVSb290c0FmdGVyVXBkYXRlKERvbVRyZWVUICZEVCwgY29uc3QgQmF0Y2hVcGRhdGVQdHIgQlVJKSB7CisgICAgYXNzZXJ0KElzUG9zdERvbSAmJiAiVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGZvciBwb3N0ZG9taW5hdG9ycyIpOworCisgICAgLy8gVGhlIHRyZWUgaGFzIG9ubHkgdHJpdmlhbCByb290cyAtLSBub3RoaW5nIHRvIHVwZGF0ZS4KKyAgICBpZiAoc3RkOjpub25lX29mKERULlJvb3RzLmJlZ2luKCksIERULlJvb3RzLmVuZCgpLCBbQlVJXShjb25zdCBOb2RlUHRyIE4pIHsKKyAgICAgICAgICByZXR1cm4gSGFzRm9yd2FyZFN1Y2Nlc3NvcnMoTiwgQlVJKTsKKyAgICAgICAgfSkpCisgICAgICByZXR1cm47CisKKyAgICAvLyBSZWNhbGN1bGF0ZSB0aGUgc2V0IG9mIHJvb3RzLgorICAgIGF1dG8gUm9vdHMgPSBGaW5kUm9vdHMoRFQsIEJVSSk7CisgICAgaWYgKERULlJvb3RzLnNpemUoKSAhPSBSb290cy5zaXplKCkgfHwKKyAgICAgICAgIXN0ZDo6aXNfcGVybXV0YXRpb24oRFQuUm9vdHMuYmVnaW4oKSwgRFQuUm9vdHMuZW5kKCksIFJvb3RzLmJlZ2luKCkpKSB7CisgICAgICAvLyBUaGUgcm9vdHMgY2hvc2VuIGluIHRoZSBDRkcgaGF2ZSBjaGFuZ2VkLiBUaGlzIGlzIGJlY2F1c2UgdGhlCisgICAgICAvLyBpbmNyZW1lbnRhbCBhbGdvcml0aG0gZG9lcyBub3QgcmVhbGx5IGtub3cgb3IgdXNlIHRoZSBzZXQgb2Ygcm9vdHMgYW5kCisgICAgICAvLyBjYW4gbWFrZSBhIGRpZmZlcmVudCAoaW1wbGljaXQpIGRlY2lzaW9uIGFib3V0IHdoaWNoIG5vZGUgd2l0aGluIGFuCisgICAgICAvLyBpbmZpbml0ZSBsb29wIGJlY29tZXMgYSByb290LgorCisgICAgICBERUJVRyhkYmdzKCkgPDwgIlJvb3RzIGFyZSBkaWZmZXJlbnQgaW4gdXBkYXRlZCB0cmVlc1xuIgorICAgICAgICAgICAgICAgICAgIDw8ICJUaGUgZW50aXJlIHRyZWUgbmVlZHMgdG8gYmUgcmVidWlsdFxuIik7CisgICAgICAvLyBJdCBtYXkgYmUgcG9zc2libGUgdG8gdXBkYXRlIHRoZSB0cmVlIHdpdGhvdXQgcmVjYWxjdWxhdGluZyBpdCwgYnV0CisgICAgICAvLyB3ZSBkbyBub3Qga25vdyB5ZXQgaG93IHRvIGRvIGl0LCBhbmQgaXQgaGFwcGVucyByYXJlbHkgaW4gcHJhY3Rpc2UuCisgICAgICBDYWxjdWxhdGVGcm9tU2NyYXRjaChEVCwgQlVJKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvLyBIYW5kbGVzIGluc2VydGlvbiB0byBhIG5vZGUgYWxyZWFkeSBpbiB0aGUgZG9taW5hdG9yIHRyZWUuCisgIHN0YXRpYyB2b2lkIEluc2VydFJlYWNoYWJsZShEb21UcmVlVCAmRFQsIGNvbnN0IEJhdGNoVXBkYXRlUHRyIEJVSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIEZyb20sIGNvbnN0IFRyZWVOb2RlUHRyIFRvKSB7CisgICAgREVCVUcoZGJncygpIDw8ICJcdFJlYWNoYWJsZSAiIDw8IEJsb2NrTmFtZVByaW50ZXIoRnJvbS0+Z2V0QmxvY2soKSkKKyAgICAgICAgICAgICAgICAgPDwgIiAtPiAiIDw8IEJsb2NrTmFtZVByaW50ZXIoVG8tPmdldEJsb2NrKCkpIDw8ICJcbiIpOworICAgIGlmIChJc1Bvc3REb20gJiYgVXBkYXRlUm9vdHNCZWZvcmVJbnNlcnRpb24oRFQsIEJVSSwgRnJvbSwgVG8pKSByZXR1cm47CisgICAgLy8gRFQuZmluZE5DRCBleHBlY3RzIGJvdGggcG9pbnRlcnMgdG8gYmUgdmFsaWQuIFdoZW4gRnJvbSBpcyBhIHZpcnR1YWwKKyAgICAvLyByb290LCB0aGVuIGl0cyBDRkcgYmxvY2sgcG9pbnRlciBpcyBhIG51bGxwdHIsIHNvIHdlIGhhdmUgdG8gJ2NvbXB1dGUnCisgICAgLy8gdGhlIE5DRCBtYW51YWxseS4KKyAgICBjb25zdCBOb2RlUHRyIE5DREJsb2NrID0KKyAgICAgICAgKEZyb20tPmdldEJsb2NrKCkgJiYgVG8tPmdldEJsb2NrKCkpCisgICAgICAgICAgICA/IERULmZpbmROZWFyZXN0Q29tbW9uRG9taW5hdG9yKEZyb20tPmdldEJsb2NrKCksIFRvLT5nZXRCbG9jaygpKQorICAgICAgICAgICAgOiBudWxscHRyOworICAgIGFzc2VydChOQ0RCbG9jayB8fCBEVC5pc1Bvc3REb21pbmF0b3IoKSk7CisgICAgY29uc3QgVHJlZU5vZGVQdHIgTkNEID0gRFQuZ2V0Tm9kZShOQ0RCbG9jayk7CisgICAgYXNzZXJ0KE5DRCk7CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIlx0XHROQ0EgPT0gIiA8PCBCbG9ja05hbWVQcmludGVyKE5DRCkgPDwgIlxuIik7CisgICAgY29uc3QgVHJlZU5vZGVQdHIgVG9JRG9tID0gVG8tPmdldElEb20oKTsKKworICAgIC8vIE5vdGhpbmcgYWZmZWN0ZWQgLS0gTkNBIHByb3BlcnR5IGhvbGRzLgorICAgIC8vIChCYXNlZCBvbiB0aGUgbGVtbWEgMi41IGZyb20gdGhlIHNlY29uZCBwYXBlci4pCisgICAgaWYgKE5DRCA9PSBUbyB8fCBOQ0QgPT0gVG9JRG9tKSByZXR1cm47CisKKyAgICAvLyBJZGVudGlmeSBhbmQgY29sbGVjdCBhZmZlY3RlZCBub2Rlcy4KKyAgICBJbnNlcnRpb25JbmZvIElJOworICAgIERFQlVHKGRiZ3MoKSA8PCAiTWFya2luZyAiIDw8IEJsb2NrTmFtZVByaW50ZXIoVG8pIDw8ICIgYXMgYWZmZWN0ZWRcbiIpOworICAgIElJLkFmZmVjdGVkLmluc2VydChUbyk7CisgICAgY29uc3QgdW5zaWduZWQgVG9MZXZlbCA9IFRvLT5nZXRMZXZlbCgpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiUHV0dGluZyAiIDw8IEJsb2NrTmFtZVByaW50ZXIoVG8pIDw8ICIgaW50byBhIEJ1Y2tldFxuIik7CisgICAgSUkuQnVja2V0LnB1c2goe1RvTGV2ZWwsIFRvfSk7CisKKyAgICB3aGlsZSAoIUlJLkJ1Y2tldC5lbXB0eSgpKSB7CisgICAgICBjb25zdCBUcmVlTm9kZVB0ciBDdXJyZW50Tm9kZSA9IElJLkJ1Y2tldC50b3AoKS5zZWNvbmQ7CisgICAgICBjb25zdCB1bnNpZ25lZCAgQ3VycmVudExldmVsID0gQ3VycmVudE5vZGUtPmdldExldmVsKCk7CisgICAgICBJSS5CdWNrZXQucG9wKCk7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0QWRkaW5nIHRvIFZpc2l0ZWQgYW5kIEFmZmVjdGVkUXVldWU6ICIKKyAgICAgICAgICAgICAgICAgICA8PCBCbG9ja05hbWVQcmludGVyKEN1cnJlbnROb2RlKSA8PCAiXG4iKTsKKworICAgICAgSUkuVmlzaXRlZC5pbnNlcnQoe0N1cnJlbnROb2RlLCBDdXJyZW50TGV2ZWx9KTsKKyAgICAgIElJLkFmZmVjdGVkUXVldWUucHVzaF9iYWNrKEN1cnJlbnROb2RlKTsKKworICAgICAgLy8gRGlzY292ZXIgYW5kIGNvbGxlY3QgYWZmZWN0ZWQgc3VjY2Vzc29ycyBvZiB0aGUgY3VycmVudCBub2RlLgorICAgICAgVmlzaXRJbnNlcnRpb24oRFQsIEJVSSwgQ3VycmVudE5vZGUsIEN1cnJlbnRMZXZlbCwgTkNELCBJSSk7CisgICAgfQorCisgICAgLy8gRmluaXNoIGJ5IHVwZGF0aW5nIGltbWVkaWF0ZSBkb21pbmF0b3JzIGFuZCBsZXZlbHMuCisgICAgVXBkYXRlSW5zZXJ0aW9uKERULCBCVUksIE5DRCwgSUkpOworICB9CisKKyAgLy8gVmlzaXRzIGFuIGFmZmVjdGVkIG5vZGUgYW5kIGNvbGxlY3QgaXRzIGFmZmVjdGVkIHN1Y2Nlc3NvcnMuCisgIHN0YXRpYyB2b2lkIFZpc2l0SW5zZXJ0aW9uKERvbVRyZWVUICZEVCwgY29uc3QgQmF0Y2hVcGRhdGVQdHIgQlVJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmVlTm9kZVB0ciBUTiwgY29uc3QgdW5zaWduZWQgUm9vdExldmVsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmVlTm9kZVB0ciBOQ0QsIEluc2VydGlvbkluZm8gJklJKSB7CisgICAgY29uc3QgdW5zaWduZWQgTkNETGV2ZWwgPSBOQ0QtPmdldExldmVsKCk7CisgICAgREVCVUcoZGJncygpIDw8ICJWaXNpdGluZyAiIDw8IEJsb2NrTmFtZVByaW50ZXIoVE4pIDw8ICIsICBSb290TGV2ZWwgIgorICAgICAgICAgICAgICAgICA8PCBSb290TGV2ZWwgPDwgIlxuIik7CisKKyAgICBTbWFsbFZlY3RvcjxUcmVlTm9kZVB0ciwgOD4gU3RhY2sgPSB7VE59OworICAgIGFzc2VydChUTi0+Z2V0QmxvY2soKSAmJiBJSS5WaXNpdGVkLmNvdW50KFROKSAmJiAiUHJlY29uZGl0aW9ucyEiKTsKKworICAgIFNtYWxsUHRyU2V0PFRyZWVOb2RlUHRyLCA4PiBQcm9jZXNzZWQ7CisKKyAgICBkbyB7CisgICAgICBUcmVlTm9kZVB0ciBOZXh0ID0gU3RhY2sucG9wX2JhY2tfdmFsKCk7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIiBOZXh0OiAiIDw8IEJsb2NrTmFtZVByaW50ZXIoTmV4dCkgPDwgIlxuIik7CisKKyAgICAgIGZvciAoY29uc3QgTm9kZVB0ciBTdWNjIDoKKyAgICAgICAgICAgQ2hpbGRyZW5HZXR0ZXI8SXNQb3N0RG9tPjo6R2V0KE5leHQtPmdldEJsb2NrKCksIEJVSSkpIHsKKyAgICAgICAgY29uc3QgVHJlZU5vZGVQdHIgU3VjY1ROID0gRFQuZ2V0Tm9kZShTdWNjKTsKKyAgICAgICAgYXNzZXJ0KFN1Y2NUTiAmJiAiVW5yZWFjaGFibGUgc3VjY2Vzc29yIGZvdW5kIGF0IHJlYWNoYWJsZSBpbnNlcnRpb24iKTsKKyAgICAgICAgY29uc3QgdW5zaWduZWQgU3VjY0xldmVsID0gU3VjY1ROLT5nZXRMZXZlbCgpOworCisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRTdWNjZXNzb3IgIiA8PCBCbG9ja05hbWVQcmludGVyKFN1Y2MpIDw8ICIsIGxldmVsID0gIgorICAgICAgICAgICAgICAgICAgICAgPDwgU3VjY0xldmVsIDw8ICJcbiIpOworCisgICAgICAgIC8vIERvIG5vdCBwcm9jZXNzIHRoZSBzYW1lIG5vZGUgbXVsdGlwbGUgdGltZXMuCisgICAgICAgIGlmIChQcm9jZXNzZWQuY291bnQoTmV4dCkgPiAwKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIFN1Y2MgZG9taW5hdGVkIGJ5IHN1YnRyZWUgRnJvbSAtLSBub3QgYWZmZWN0ZWQuCisgICAgICAgIC8vIChCYXNlZCBvbiB0aGUgbGVtbWEgMi41IGZyb20gdGhlIHNlY29uZCBwYXBlci4pCisgICAgICAgIGlmIChTdWNjTGV2ZWwgPiBSb290TGV2ZWwpIHsKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0XHREb21pbmF0ZWQgYnkgc3VidHJlZSBGcm9tXG4iKTsKKyAgICAgICAgICBpZiAoSUkuVmlzaXRlZC5jb3VudChTdWNjVE4pICE9IDApIHsKKyAgICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRcdFx0YWxyZWFkeSB2aXNpdGVkIGF0IGxldmVsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICA8PCBJSS5WaXNpdGVkW1N1Y2NUTl0gPDwgIlxuXHRcdFx0Y3VycmVudCBsZXZlbCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgPDwgUm9vdExldmVsIDw8ICIpXG4iKTsKKworICAgICAgICAgICAgLy8gQSBub2RlIGNhbiBiZSBuZWNlc3NhcnkgdG8gdmlzaXQgYWdhaW4gaWYgd2Ugc2VlIGl0IGFnYWluIGF0CisgICAgICAgICAgICAvLyBhIGxvd2VyIGxldmVsIHRoYW4gYmVmb3JlLgorICAgICAgICAgICAgaWYgKElJLlZpc2l0ZWRbU3VjY1ROXSA+PSBSb290TGV2ZWwpCisgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIH0KKworICAgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRcdE1hcmtpbmcgdmlzaXRlZCBub3QgYWZmZWN0ZWQgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBCbG9ja05hbWVQcmludGVyKFN1Y2MpIDw8ICJcbiIpOworICAgICAgICAgIElJLlZpc2l0ZWQuaW5zZXJ0KHtTdWNjVE4sIFJvb3RMZXZlbH0pOworICAgICAgICAgIElJLlZpc2l0ZWROb3RBZmZlY3RlZFF1ZXVlLnB1c2hfYmFjayhTdWNjVE4pOworICAgICAgICAgIFN0YWNrLnB1c2hfYmFjayhTdWNjVE4pOworICAgICAgICB9IGVsc2UgaWYgKChTdWNjTGV2ZWwgPiBOQ0RMZXZlbCArIDEpICYmCisgICAgICAgICAgICBJSS5BZmZlY3RlZC5jb3VudChTdWNjVE4pID09IDApIHsKKyAgICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0XHRNYXJraW5nIGFmZmVjdGVkIGFuZCBhZGRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICA8PCBCbG9ja05hbWVQcmludGVyKFN1Y2MpIDw8ICIgdG8gYSBCdWNrZXRcbiIpOworICAgICAgICAgIElJLkFmZmVjdGVkLmluc2VydChTdWNjVE4pOworICAgICAgICAgIElJLkJ1Y2tldC5wdXNoKHtTdWNjTGV2ZWwsIFN1Y2NUTn0pOworICAgICAgICB9CisgICAgICB9CisKKyAgICAgIFByb2Nlc3NlZC5pbnNlcnQoTmV4dCk7CisgICAgfSB3aGlsZSAoIVN0YWNrLmVtcHR5KCkpOworICB9CisKKyAgLy8gVXBkYXRlcyBpbW1lZGlhdGUgZG9taW5hdG9ycyBhbmQgbGV2ZWxzIGFmdGVyIGluc2VydGlvbi4KKyAgc3RhdGljIHZvaWQgVXBkYXRlSW5zZXJ0aW9uKERvbVRyZWVUICZEVCwgY29uc3QgQmF0Y2hVcGRhdGVQdHIgQlVJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJlZU5vZGVQdHIgTkNELCBJbnNlcnRpb25JbmZvICZJSSkgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiVXBkYXRpbmcgTkNEID0gIiA8PCBCbG9ja05hbWVQcmludGVyKE5DRCkgPDwgIlxuIik7CisKKyAgICBmb3IgKGNvbnN0IFRyZWVOb2RlUHRyIFROIDogSUkuQWZmZWN0ZWRRdWV1ZSkgeworICAgICAgREVCVUcoZGJncygpIDw8ICJcdElEb20oIiA8PCBCbG9ja05hbWVQcmludGVyKFROKQorICAgICAgICAgICAgICAgICAgIDw8ICIpID0gIiA8PCBCbG9ja05hbWVQcmludGVyKE5DRCkgPDwgIlxuIik7CisgICAgICBUTi0+c2V0SURvbShOQ0QpOworICAgIH0KKworICAgIFVwZGF0ZUxldmVsc0FmdGVySW5zZXJ0aW9uKElJKTsKKyAgICBpZiAoSXNQb3N0RG9tKSBVcGRhdGVSb290c0FmdGVyVXBkYXRlKERULCBCVUkpOworICB9CisKKyAgc3RhdGljIHZvaWQgVXBkYXRlTGV2ZWxzQWZ0ZXJJbnNlcnRpb24oSW5zZXJ0aW9uSW5mbyAmSUkpIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIlVwZGF0aW5nIGxldmVscyBmb3IgdmlzaXRlZCBidXQgbm90IGFmZmVjdGVkIG5vZGVzXG4iKTsKKworICAgIGZvciAoY29uc3QgVHJlZU5vZGVQdHIgVE4gOiBJSS5WaXNpdGVkTm90QWZmZWN0ZWRRdWV1ZSkgeworICAgICAgREVCVUcoZGJncygpIDw8ICJcdGxldmVsKCIgPDwgQmxvY2tOYW1lUHJpbnRlcihUTikgPDwgIikgPSAoIgorICAgICAgICAgICAgICAgICAgIDw8IEJsb2NrTmFtZVByaW50ZXIoVE4tPmdldElEb20oKSkgPDwgIikgIgorICAgICAgICAgICAgICAgICAgIDw8IFROLT5nZXRJRG9tKCktPmdldExldmVsKCkgPDwgIiArIDFcbiIpOworICAgICAgVE4tPlVwZGF0ZUxldmVsKCk7CisgICAgfQorICB9CisKKyAgLy8gSGFuZGxlcyBpbnNlcnRpb24gdG8gcHJldmlvdXNseSB1bnJlYWNoYWJsZSBub2Rlcy4KKyAgc3RhdGljIHZvaWQgSW5zZXJ0VW5yZWFjaGFibGUoRG9tVHJlZVQgJkRULCBjb25zdCBCYXRjaFVwZGF0ZVB0ciBCVUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIEZyb20sIGNvbnN0IE5vZGVQdHIgVG8pIHsKKyAgICBERUJVRyhkYmdzKCkgPDwgIkluc2VydGluZyAiIDw8IEJsb2NrTmFtZVByaW50ZXIoRnJvbSkKKyAgICAgICAgICAgICAgICAgPDwgIiAtPiAodW5yZWFjaGFibGUpICIgPDwgQmxvY2tOYW1lUHJpbnRlcihUbykgPDwgIlxuIik7CisKKyAgICAvLyBDb2xsZWN0IGRpc2NvdmVyZWQgZWRnZXMgdG8gYWxyZWFkeSByZWFjaGFibGUgbm9kZXMuCisgICAgU21hbGxWZWN0b3I8c3RkOjpwYWlyPE5vZGVQdHIsIFRyZWVOb2RlUHRyPiwgOD4gRGlzY292ZXJlZEVkZ2VzVG9SZWFjaGFibGU7CisgICAgLy8gRGlzY292ZXIgYW5kIGNvbm5lY3Qgbm9kZXMgdGhhdCBiZWNhbWUgcmVhY2hhYmxlIHdpdGggdGhlIGluc2VydGlvbi4KKyAgICBDb21wdXRlVW5yZWFjaGFibGVEb21pbmF0b3JzKERULCBCVUksIFRvLCBGcm9tLCBEaXNjb3ZlcmVkRWRnZXNUb1JlYWNoYWJsZSk7CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIkluc2VydGVkICIgPDwgQmxvY2tOYW1lUHJpbnRlcihGcm9tKQorICAgICAgICAgICAgICAgICA8PCAiIC0+IChwcmV2IHVucmVhY2hhYmxlKSAiIDw8IEJsb2NrTmFtZVByaW50ZXIoVG8pIDw8ICJcbiIpOworCisgICAgLy8gVXNlZCB0aGUgZGlzY292ZXJlZCBlZGdlcyBhbmQgaW5zZXQgZGlzY292ZXJlZCBjb25uZWN0aW5nIChpbmNvbWluZykKKyAgICAvLyBlZGdlcy4KKyAgICBmb3IgKGNvbnN0IGF1dG8gJkVkZ2UgOiBEaXNjb3ZlcmVkRWRnZXNUb1JlYWNoYWJsZSkgeworICAgICAgREVCVUcoZGJncygpIDw8ICJcdEluc2VydGluZyBkaXNjb3ZlcmVkIGNvbm5lY3RpbmcgZWRnZSAiCisgICAgICAgICAgICAgICAgICAgPDwgQmxvY2tOYW1lUHJpbnRlcihFZGdlLmZpcnN0KSA8PCAiIC0+ICIKKyAgICAgICAgICAgICAgICAgICA8PCBCbG9ja05hbWVQcmludGVyKEVkZ2Uuc2Vjb25kKSA8PCAiXG4iKTsKKyAgICAgIEluc2VydFJlYWNoYWJsZShEVCwgQlVJLCBEVC5nZXROb2RlKEVkZ2UuZmlyc3QpLCBFZGdlLnNlY29uZCk7CisgICAgfQorICB9CisKKyAgLy8gQ29ubmVjdHMgbm9kZXMgdGhhdCBiZWNvbWUgcmVhY2hhYmxlIHdpdGggYW4gaW5zZXJ0aW9uLgorICBzdGF0aWMgdm9pZCBDb21wdXRlVW5yZWFjaGFibGVEb21pbmF0b3JzKAorICAgICAgRG9tVHJlZVQgJkRULCBjb25zdCBCYXRjaFVwZGF0ZVB0ciBCVUksIGNvbnN0IE5vZGVQdHIgUm9vdCwKKyAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIEluY29taW5nLAorICAgICAgU21hbGxWZWN0b3JJbXBsPHN0ZDo6cGFpcjxOb2RlUHRyLCBUcmVlTm9kZVB0cj4+CisgICAgICAgICAgJkRpc2NvdmVyZWRDb25uZWN0aW5nRWRnZXMpIHsKKyAgICBhc3NlcnQoIURULmdldE5vZGUoUm9vdCkgJiYgIlJvb3QgbXVzdCBub3QgYmUgcmVhY2hhYmxlIik7CisKKyAgICAvLyBWaXNpdCBvbmx5IHByZXZpb3VzbHkgdW5yZWFjaGFibGUgbm9kZXMuCisgICAgYXV0byBVbnJlYWNoYWJsZURlc2NlbmRlciA9IFsmRFQsICZEaXNjb3ZlcmVkQ29ubmVjdGluZ0VkZ2VzXShOb2RlUHRyIEZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb2RlUHRyIFRvKSB7CisgICAgICBjb25zdCBUcmVlTm9kZVB0ciBUb1ROID0gRFQuZ2V0Tm9kZShUbyk7CisgICAgICBpZiAoIVRvVE4pIHJldHVybiB0cnVlOworCisgICAgICBEaXNjb3ZlcmVkQ29ubmVjdGluZ0VkZ2VzLnB1c2hfYmFjayh7RnJvbSwgVG9UTn0pOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH07CisKKyAgICBTZW1pTkNBSW5mbyBTTkNBKEJVSSk7CisgICAgU05DQS5ydW5ERlMoUm9vdCwgMCwgVW5yZWFjaGFibGVEZXNjZW5kZXIsIDApOworICAgIFNOQ0EucnVuU2VtaU5DQShEVCk7CisgICAgU05DQS5hdHRhY2hOZXdTdWJ0cmVlKERULCBJbmNvbWluZyk7CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIkFmdGVyIGFkZGluZyB1bnJlYWNoYWJsZSBub2Rlc1xuIik7CisgIH0KKworICBzdGF0aWMgdm9pZCBEZWxldGVFZGdlKERvbVRyZWVUICZEVCwgY29uc3QgQmF0Y2hVcGRhdGVQdHIgQlVJLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE5vZGVQdHIgRnJvbSwgY29uc3QgTm9kZVB0ciBUbykgeworICAgIGFzc2VydChGcm9tICYmIFRvICYmICJDYW5ub3QgZGlzY29ubmVjdCBudWxscHRycyIpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiRGVsZXRpbmcgZWRnZSAiIDw8IEJsb2NrTmFtZVByaW50ZXIoRnJvbSkgPDwgIiAtPiAiCisgICAgICAgICAgICAgICAgIDw8IEJsb2NrTmFtZVByaW50ZXIoVG8pIDw8ICJcbiIpOworCisjaWZuZGVmIE5ERUJVRworICAgIC8vIEVuc3VyZSB0aGF0IHRoZSBlZGdlIHdhcyBpbiBmYWN0IGRlbGV0ZWQgZnJvbSB0aGUgQ0ZHIGJlZm9yZSBpbmZvcm1pbmcKKyAgICAvLyB0aGUgRG9tVHJlZSBhYm91dCBpdC4KKyAgICAvLyBUaGUgY2hlY2sgaXMgTyhOKSwgc28gcnVuIGl0IG9ubHkgaW4gZGVidWcgY29uZmlndXJhdGlvbi4KKyAgICBhdXRvIElzU3VjY2Vzc29yID0gW0JVSV0oY29uc3QgTm9kZVB0ciBTdWNjQ2FuZGlkYXRlLCBjb25zdCBOb2RlUHRyIE9mKSB7CisgICAgICBhdXRvIFN1Y2Nlc3NvcnMgPSBDaGlsZHJlbkdldHRlcjxJc1Bvc3REb20+OjpHZXQoT2YsIEJVSSk7CisgICAgICByZXR1cm4gbGx2bTo6ZmluZChTdWNjZXNzb3JzLCBTdWNjQ2FuZGlkYXRlKSAhPSBTdWNjZXNzb3JzLmVuZCgpOworICAgIH07CisgICAgKHZvaWQpSXNTdWNjZXNzb3I7CisgICAgYXNzZXJ0KCFJc1N1Y2Nlc3NvcihUbywgRnJvbSkgJiYgIkRlbGV0ZWQgZWRnZSBzdGlsbCBleGlzdHMgaW4gdGhlIENGRyEiKTsKKyNlbmRpZgorCisgICAgY29uc3QgVHJlZU5vZGVQdHIgRnJvbVROID0gRFQuZ2V0Tm9kZShGcm9tKTsKKyAgICAvLyBEZWxldGlvbiBpbiBhbiB1bnJlYWNoYWJsZSBzdWJ0cmVlIC0tIG5vdGhpbmcgdG8gZG8uCisgICAgaWYgKCFGcm9tVE4pIHJldHVybjsKKworICAgIGNvbnN0IFRyZWVOb2RlUHRyIFRvVE4gPSBEVC5nZXROb2RlKFRvKTsKKyAgICBpZiAoIVRvVE4pIHsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRUbyAoIiA8PCBCbG9ja05hbWVQcmludGVyKFRvKQorICAgICAgICAgICAgICAgICAgIDw8ICIpIGFscmVhZHkgdW5yZWFjaGFibGUgLS0gdGhlcmUgaXMgbm8gZWRnZSB0byBkZWxldGVcbiIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGNvbnN0IE5vZGVQdHIgTkNEQmxvY2sgPSBEVC5maW5kTmVhcmVzdENvbW1vbkRvbWluYXRvcihGcm9tLCBUbyk7CisgICAgY29uc3QgVHJlZU5vZGVQdHIgTkNEID0gRFQuZ2V0Tm9kZShOQ0RCbG9jayk7CisKKyAgICAvLyBJZiBUbyBkb21pbmF0ZXMgRnJvbSAtLSBub3RoaW5nIHRvIGRvLgorICAgIGlmIChUb1ROICE9IE5DRCkgeworICAgICAgRFQuREZTSW5mb1ZhbGlkID0gZmFsc2U7CisKKyAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIFRvSURvbSA9IFRvVE4tPmdldElEb20oKTsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiXHROQ0QgIiA8PCBCbG9ja05hbWVQcmludGVyKE5DRCkgPDwgIiwgVG9JRG9tICIKKyAgICAgICAgICAgICAgICAgICA8PCBCbG9ja05hbWVQcmludGVyKFRvSURvbSkgPDwgIlxuIik7CisKKyAgICAgIC8vIFRvIHJlbWFpbnMgcmVhY2hhYmxlIGFmdGVyIGRlbGV0aW9uLgorICAgICAgLy8gKEJhc2VkIG9uIHRoZSBjYXB0aW9uIHVuZGVyIEZpZ3VyZSA0LiBmcm9tIHRoZSBzZWNvbmQgcGFwZXIuKQorICAgICAgaWYgKEZyb21UTiAhPSBUb0lEb20gfHwgSGFzUHJvcGVyU3VwcG9ydChEVCwgQlVJLCBUb1ROKSkKKyAgICAgICAgRGVsZXRlUmVhY2hhYmxlKERULCBCVUksIEZyb21UTiwgVG9UTik7CisgICAgICBlbHNlCisgICAgICAgIERlbGV0ZVVucmVhY2hhYmxlKERULCBCVUksIFRvVE4pOworICAgIH0KKworICAgIGlmIChJc1Bvc3REb20pIFVwZGF0ZVJvb3RzQWZ0ZXJVcGRhdGUoRFQsIEJVSSk7CisgIH0KKworICAvLyBIYW5kbGVzIGRlbGV0aW9ucyB0aGF0IGxlYXZlIGRlc3RpbmF0aW9uIG5vZGVzIHJlYWNoYWJsZS4KKyAgc3RhdGljIHZvaWQgRGVsZXRlUmVhY2hhYmxlKERvbVRyZWVUICZEVCwgY29uc3QgQmF0Y2hVcGRhdGVQdHIgQlVJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJlZU5vZGVQdHIgRnJvbVROLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJlZU5vZGVQdHIgVG9UTikgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiRGVsZXRpbmcgcmVhY2hhYmxlICIgPDwgQmxvY2tOYW1lUHJpbnRlcihGcm9tVE4pIDw8ICIgLT4gIgorICAgICAgICAgICAgICAgICA8PCBCbG9ja05hbWVQcmludGVyKFRvVE4pIDw8ICJcbiIpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRSZWJ1aWxkaW5nIHN1YnRyZWVcbiIpOworCisgICAgLy8gRmluZCB0aGUgdG9wIG9mIHRoZSBzdWJ0cmVlIHRoYXQgbmVlZHMgdG8gYmUgcmVidWlsdC4KKyAgICAvLyAoQmFzZWQgb24gdGhlIGxlbW1hIDIuNiBmcm9tIHRoZSBzZWNvbmQgcGFwZXIuKQorICAgIGNvbnN0IE5vZGVQdHIgVG9JRG9tID0KKyAgICAgICAgRFQuZmluZE5lYXJlc3RDb21tb25Eb21pbmF0b3IoRnJvbVROLT5nZXRCbG9jaygpLCBUb1ROLT5nZXRCbG9jaygpKTsKKyAgICBhc3NlcnQoVG9JRG9tIHx8IERULmlzUG9zdERvbWluYXRvcigpKTsKKyAgICBjb25zdCBUcmVlTm9kZVB0ciBUb0lEb21UTiA9IERULmdldE5vZGUoVG9JRG9tKTsKKyAgICBhc3NlcnQoVG9JRG9tVE4pOworICAgIGNvbnN0IFRyZWVOb2RlUHRyIFByZXZJRG9tU3ViVHJlZSA9IFRvSURvbVROLT5nZXRJRG9tKCk7CisgICAgLy8gVG9wIG9mIHRoZSBzdWJ0cmVlIHRvIHJlYnVpbGQgaXMgdGhlIHJvb3Qgbm9kZS4gUmVidWlsZCB0aGUgdHJlZSBmcm9tCisgICAgLy8gc2NyYXRjaC4KKyAgICBpZiAoIVByZXZJRG9tU3ViVHJlZSkgeworICAgICAgREVCVUcoZGJncygpIDw8ICJUaGUgZW50aXJlIHRyZWUgbmVlZHMgdG8gYmUgcmVidWlsdFxuIik7CisgICAgICBDYWxjdWxhdGVGcm9tU2NyYXRjaChEVCwgQlVJKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBPbmx5IHZpc2l0IG5vZGVzIGluIHRoZSBzdWJ0cmVlIHN0YXJ0aW5nIGF0IFRvLgorICAgIGNvbnN0IHVuc2lnbmVkIExldmVsID0gVG9JRG9tVE4tPmdldExldmVsKCk7CisgICAgYXV0byBEZXNjZW5kQmVsb3cgPSBbTGV2ZWwsICZEVF0oTm9kZVB0ciwgTm9kZVB0ciBUbykgeworICAgICAgcmV0dXJuIERULmdldE5vZGUoVG8pLT5nZXRMZXZlbCgpID4gTGV2ZWw7CisgICAgfTsKKworICAgIERFQlVHKGRiZ3MoKSA8PCAiXHRUb3Agb2Ygc3VidHJlZTogIiA8PCBCbG9ja05hbWVQcmludGVyKFRvSURvbVROKSA8PCAiXG4iKTsKKworICAgIFNlbWlOQ0FJbmZvIFNOQ0EoQlVJKTsKKyAgICBTTkNBLnJ1bkRGUyhUb0lEb20sIDAsIERlc2NlbmRCZWxvdywgMCk7CisgICAgREVCVUcoZGJncygpIDw8ICJcdFJ1bm5pbmcgU2VtaS1OQ0FcbiIpOworICAgIFNOQ0EucnVuU2VtaU5DQShEVCwgTGV2ZWwpOworICAgIFNOQ0EucmVhdHRhY2hFeGlzdGluZ1N1YnRyZWUoRFQsIFByZXZJRG9tU3ViVHJlZSk7CisgIH0KKworICAvLyBDaGVja3MgaWYgYSBub2RlIGhhcyBwcm9wZXIgc3VwcG9ydCwgYXMgZGVmaW5lZCBvbiB0aGUgcGFnZSAzIGFuZCBsYXRlcgorICAvLyBleHBsYWluZWQgb24gdGhlIHBhZ2UgNyBvZiB0aGUgc2Vjb25kIHBhcGVyLgorICBzdGF0aWMgYm9vbCBIYXNQcm9wZXJTdXBwb3J0KERvbVRyZWVUICZEVCwgY29uc3QgQmF0Y2hVcGRhdGVQdHIgQlVJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIFROKSB7CisgICAgREVCVUcoZGJncygpIDw8ICJJc1JlYWNoYWJsZUZyb21JRG9tICIgPDwgQmxvY2tOYW1lUHJpbnRlcihUTikgPDwgIlxuIik7CisgICAgZm9yIChjb25zdCBOb2RlUHRyIFByZWQgOgorICAgICAgICAgQ2hpbGRyZW5HZXR0ZXI8IUlzUG9zdERvbT46OkdldChUTi0+Z2V0QmxvY2soKSwgQlVJKSkgeworICAgICAgREVCVUcoZGJncygpIDw8ICJcdFByZWQgIiA8PCBCbG9ja05hbWVQcmludGVyKFByZWQpIDw8ICJcbiIpOworICAgICAgaWYgKCFEVC5nZXROb2RlKFByZWQpKSBjb250aW51ZTsKKworICAgICAgY29uc3QgTm9kZVB0ciBTdXBwb3J0ID0KKyAgICAgICAgICBEVC5maW5kTmVhcmVzdENvbW1vbkRvbWluYXRvcihUTi0+Z2V0QmxvY2soKSwgUHJlZCk7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0U3VwcG9ydCAiIDw8IEJsb2NrTmFtZVByaW50ZXIoU3VwcG9ydCkgPDwgIlxuIik7CisgICAgICBpZiAoU3VwcG9ydCAhPSBUTi0+Z2V0QmxvY2soKSkgeworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0IiA8PCBCbG9ja05hbWVQcmludGVyKFROKQorICAgICAgICAgICAgICAgICAgICAgPDwgIiBpcyByZWFjaGFibGUgZnJvbSBzdXBwb3J0ICIKKyAgICAgICAgICAgICAgICAgICAgIDw8IEJsb2NrTmFtZVByaW50ZXIoU3VwcG9ydCkgPDwgIlxuIik7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIEhhbmRsZSBkZWxldGlvbnMgdGhhdCBtYWtlIGRlc3RpbmF0aW9uIG5vZGUgdW5yZWFjaGFibGUuCisgIC8vIChCYXNlZCBvbiB0aGUgbGVtbWEgMi43IGZyb20gdGhlIHNlY29uZCBwYXBlci4pCisgIHN0YXRpYyB2b2lkIERlbGV0ZVVucmVhY2hhYmxlKERvbVRyZWVUICZEVCwgY29uc3QgQmF0Y2hVcGRhdGVQdHIgQlVJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUcmVlTm9kZVB0ciBUb1ROKSB7CisgICAgREVCVUcoZGJncygpIDw8ICJEZWxldGluZyB1bnJlYWNoYWJsZSBzdWJ0cmVlICIgPDwgQmxvY2tOYW1lUHJpbnRlcihUb1ROKQorICAgICAgICAgICAgICAgICA8PCAiXG4iKTsKKyAgICBhc3NlcnQoVG9UTik7CisgICAgYXNzZXJ0KFRvVE4tPmdldEJsb2NrKCkpOworCisgICAgaWYgKElzUG9zdERvbSkgeworICAgICAgLy8gRGVsZXRpb24gbWFrZXMgYSByZWdpb24gcmV2ZXJzZS11bnJlYWNoYWJsZSBhbmQgY3JlYXRlcyBhIG5ldyByb290LgorICAgICAgLy8gU2ltdWxhdGUgdGhhdCBieSBpbnNlcnRpbmcgYW4gZWRnZSBmcm9tIHRoZSB2aXJ0dWFsIHJvb3QgdG8gVG9UTiBhbmQKKyAgICAgIC8vIGFkZGluZyBpdCBhcyBhIG5ldyByb290LgorICAgICAgREVCVUcoZGJncygpIDw8ICJcdERlbGV0aW9uIG1hZGUgYSByZWdpb24gcmV2ZXJzZS11bnJlYWNoYWJsZVxuIik7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIlx0QWRkaW5nIG5ldyByb290ICIgPDwgQmxvY2tOYW1lUHJpbnRlcihUb1ROKSA8PCAiXG4iKTsKKyAgICAgIERULlJvb3RzLnB1c2hfYmFjayhUb1ROLT5nZXRCbG9jaygpKTsKKyAgICAgIEluc2VydFJlYWNoYWJsZShEVCwgQlVJLCBEVC5nZXROb2RlKG51bGxwdHIpLCBUb1ROKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBTbWFsbFZlY3RvcjxOb2RlUHRyLCAxNj4gQWZmZWN0ZWRRdWV1ZTsKKyAgICBjb25zdCB1bnNpZ25lZCBMZXZlbCA9IFRvVE4tPmdldExldmVsKCk7CisKKyAgICAvLyBUcmF2ZXJzZSBkZXN0aW5hdGlvbiBub2RlJ3MgZGVzY2VuZGFudHMgd2l0aCBncmVhdGVyIGxldmVsIGluIHRoZSB0cmVlCisgICAgLy8gYW5kIGNvbGxlY3QgdmlzaXRlZCBub2Rlcy4KKyAgICBhdXRvIERlc2NlbmRBbmRDb2xsZWN0ID0gW0xldmVsLCAmQWZmZWN0ZWRRdWV1ZSwgJkRUXShOb2RlUHRyLCBOb2RlUHRyIFRvKSB7CisgICAgICBjb25zdCBUcmVlTm9kZVB0ciBUTiA9IERULmdldE5vZGUoVG8pOworICAgICAgYXNzZXJ0KFROKTsKKyAgICAgIGlmIChUTi0+Z2V0TGV2ZWwoKSA+IExldmVsKSByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmIChsbHZtOjpmaW5kKEFmZmVjdGVkUXVldWUsIFRvKSA9PSBBZmZlY3RlZFF1ZXVlLmVuZCgpKQorICAgICAgICBBZmZlY3RlZFF1ZXVlLnB1c2hfYmFjayhUbyk7CisKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9OworCisgICAgU2VtaU5DQUluZm8gU05DQShCVUkpOworICAgIHVuc2lnbmVkIExhc3RERlNOdW0gPQorICAgICAgICBTTkNBLnJ1bkRGUyhUb1ROLT5nZXRCbG9jaygpLCAwLCBEZXNjZW5kQW5kQ29sbGVjdCwgMCk7CisKKyAgICBUcmVlTm9kZVB0ciBNaW5Ob2RlID0gVG9UTjsKKworICAgIC8vIElkZW50aWZ5IHRoZSB0b3Agb2YgdGhlIHN1YnRyZWUgdG8gcmVidWlsZCBieSBmaW5kaW5nIHRoZSBOQ0Qgb2YgYWxsCisgICAgLy8gdGhlIGFmZmVjdGVkIG5vZGVzLgorICAgIGZvciAoY29uc3QgTm9kZVB0ciBOIDogQWZmZWN0ZWRRdWV1ZSkgeworICAgICAgY29uc3QgVHJlZU5vZGVQdHIgVE4gPSBEVC5nZXROb2RlKE4pOworICAgICAgY29uc3QgTm9kZVB0ciBOQ0RCbG9jayA9CisgICAgICAgICAgRFQuZmluZE5lYXJlc3RDb21tb25Eb21pbmF0b3IoVE4tPmdldEJsb2NrKCksIFRvVE4tPmdldEJsb2NrKCkpOworICAgICAgYXNzZXJ0KE5DREJsb2NrIHx8IERULmlzUG9zdERvbWluYXRvcigpKTsKKyAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIE5DRCA9IERULmdldE5vZGUoTkNEQmxvY2spOworICAgICAgYXNzZXJ0KE5DRCk7CisKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiUHJvY2Vzc2luZyBhZmZlY3RlZCBub2RlICIgPDwgQmxvY2tOYW1lUHJpbnRlcihUTikKKyAgICAgICAgICAgICAgICAgICA8PCAiIHdpdGggTkNEID0gIiA8PCBCbG9ja05hbWVQcmludGVyKE5DRCkKKyAgICAgICAgICAgICAgICAgICA8PCAiLCBNaW5Ob2RlID0iIDw8IEJsb2NrTmFtZVByaW50ZXIoTWluTm9kZSkgPDwgIlxuIik7CisgICAgICBpZiAoTkNEICE9IFROICYmIE5DRC0+Z2V0TGV2ZWwoKSA8IE1pbk5vZGUtPmdldExldmVsKCkpIE1pbk5vZGUgPSBOQ0Q7CisgICAgfQorCisgICAgLy8gUm9vdCByZWFjaGVkLCByZWJ1aWxkIHRoZSB3aG9sZSB0cmVlIGZyb20gc2NyYXRjaC4KKyAgICBpZiAoIU1pbk5vZGUtPmdldElEb20oKSkgeworICAgICAgREVCVUcoZGJncygpIDw8ICJUaGUgZW50aXJlIHRyZWUgbmVlZHMgdG8gYmUgcmVidWlsdFxuIik7CisgICAgICBDYWxjdWxhdGVGcm9tU2NyYXRjaChEVCwgQlVJKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBFcmFzZSB0aGUgdW5yZWFjaGFibGUgc3VidHJlZSBpbiByZXZlcnNlIHByZW9yZGVyIHRvIHByb2Nlc3MgYWxsIGNoaWxkcmVuCisgICAgLy8gYmVmb3JlIGRlbGV0aW5nIHRoZWlyIHBhcmVudC4KKyAgICBmb3IgKHVuc2lnbmVkIGkgPSBMYXN0REZTTnVtOyBpID4gMDsgLS1pKSB7CisgICAgICBjb25zdCBOb2RlUHRyIE4gPSBTTkNBLk51bVRvTm9kZVtpXTsKKyAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIFROID0gRFQuZ2V0Tm9kZShOKTsKKyAgICAgIERFQlVHKGRiZ3MoKSA8PCAiRXJhc2luZyBub2RlICIgPDwgQmxvY2tOYW1lUHJpbnRlcihUTikgPDwgIlxuIik7CisKKyAgICAgIEVyYXNlTm9kZShEVCwgVE4pOworICAgIH0KKworICAgIC8vIFRoZSBhZmZlY3RlZCBzdWJ0cmVlIHN0YXJ0IGF0IHRoZSBUbyBub2RlIC0tIHRoZXJlJ3Mgbm8gZXh0cmEgd29yayB0byBkby4KKyAgICBpZiAoTWluTm9kZSA9PSBUb1ROKSByZXR1cm47CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIkRlbGV0ZVVucmVhY2hhYmxlOiBydW5uaW5nIERGUyB3aXRoIE1pbk5vZGUgPSAiCisgICAgICAgICAgICAgICAgIDw8IEJsb2NrTmFtZVByaW50ZXIoTWluTm9kZSkgPDwgIlxuIik7CisgICAgY29uc3QgdW5zaWduZWQgTWluTGV2ZWwgPSBNaW5Ob2RlLT5nZXRMZXZlbCgpOworICAgIGNvbnN0IFRyZWVOb2RlUHRyIFByZXZJRG9tID0gTWluTm9kZS0+Z2V0SURvbSgpOworICAgIGFzc2VydChQcmV2SURvbSk7CisgICAgU05DQS5jbGVhcigpOworCisgICAgLy8gSWRlbnRpZnkgbm9kZXMgdGhhdCByZW1haW4gaW4gdGhlIGFmZmVjdGVkIHN1YnRyZWUuCisgICAgYXV0byBEZXNjZW5kQmVsb3cgPSBbTWluTGV2ZWwsICZEVF0oTm9kZVB0ciwgTm9kZVB0ciBUbykgeworICAgICAgY29uc3QgVHJlZU5vZGVQdHIgVG9UTiA9IERULmdldE5vZGUoVG8pOworICAgICAgcmV0dXJuIFRvVE4gJiYgVG9UTi0+Z2V0TGV2ZWwoKSA+IE1pbkxldmVsOworICAgIH07CisgICAgU05DQS5ydW5ERlMoTWluTm9kZS0+Z2V0QmxvY2soKSwgMCwgRGVzY2VuZEJlbG93LCAwKTsKKworICAgIERFQlVHKGRiZ3MoKSA8PCAiUHJldmlvdXMgSURvbShNaW5Ob2RlKSA9ICIgPDwgQmxvY2tOYW1lUHJpbnRlcihQcmV2SURvbSkKKyAgICAgICAgICAgICAgICAgPDwgIlxuUnVubmluZyBTZW1pLU5DQVxuIik7CisKKyAgICAvLyBSZWJ1aWxkIHRoZSByZW1haW5pbmcgcGFydCBvZiBhZmZlY3RlZCBzdWJ0cmVlLgorICAgIFNOQ0EucnVuU2VtaU5DQShEVCwgTWluTGV2ZWwpOworICAgIFNOQ0EucmVhdHRhY2hFeGlzdGluZ1N1YnRyZWUoRFQsIFByZXZJRG9tKTsKKyAgfQorCisgIC8vIFJlbW92ZXMgbGVhZiB0cmVlIG5vZGVzIGZyb20gdGhlIGRvbWluYXRvciB0cmVlLgorICBzdGF0aWMgdm9pZCBFcmFzZU5vZGUoRG9tVHJlZVQgJkRULCBjb25zdCBUcmVlTm9kZVB0ciBUTikgeworICAgIGFzc2VydChUTik7CisgICAgYXNzZXJ0KFROLT5nZXROdW1DaGlsZHJlbigpID09IDAgJiYgIk5vdCBhIHRyZWUgbGVhZiIpOworCisgICAgY29uc3QgVHJlZU5vZGVQdHIgSURvbSA9IFROLT5nZXRJRG9tKCk7CisgICAgYXNzZXJ0KElEb20pOworCisgICAgYXV0byBDaEl0ID0gbGx2bTo6ZmluZChJRG9tLT5DaGlsZHJlbiwgVE4pOworICAgIGFzc2VydChDaEl0ICE9IElEb20tPkNoaWxkcmVuLmVuZCgpKTsKKyAgICBzdGQ6OnN3YXAoKkNoSXQsIElEb20tPkNoaWxkcmVuLmJhY2soKSk7CisgICAgSURvbS0+Q2hpbGRyZW4ucG9wX2JhY2soKTsKKworICAgIERULkRvbVRyZWVOb2Rlcy5lcmFzZShUTi0+Z2V0QmxvY2soKSk7CisgIH0KKworICAvL35+CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tIERvbVRyZWUgQmF0Y2ggVXBkYXRlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICAvL35+CisKKyAgc3RhdGljIHZvaWQgQXBwbHlVcGRhdGVzKERvbVRyZWVUICZEVCwgQXJyYXlSZWY8VXBkYXRlVD4gVXBkYXRlcykgeworICAgIGNvbnN0IHNpemVfdCBOdW1VcGRhdGVzID0gVXBkYXRlcy5zaXplKCk7CisgICAgaWYgKE51bVVwZGF0ZXMgPT0gMCkKKyAgICAgIHJldHVybjsKKworICAgIC8vIFRha2UgdGhlIGZhc3QgcGF0aCBmb3IgYSBzaW5nbGUgdXBkYXRlIGFuZCBhdm9pZCBydW5uaW5nIHRoZSBiYXRjaCB1cGRhdGUKKyAgICAvLyBtYWNoaW5lcnkuCisgICAgaWYgKE51bVVwZGF0ZXMgPT0gMSkgeworICAgICAgY29uc3QgYXV0byAmVXBkYXRlID0gVXBkYXRlcy5mcm9udCgpOworICAgICAgaWYgKFVwZGF0ZS5nZXRLaW5kKCkgPT0gVXBkYXRlS2luZDo6SW5zZXJ0KQorICAgICAgICBEVC5pbnNlcnRFZGdlKFVwZGF0ZS5nZXRGcm9tKCksIFVwZGF0ZS5nZXRUbygpKTsKKyAgICAgIGVsc2UKKyAgICAgICAgRFQuZGVsZXRlRWRnZShVcGRhdGUuZ2V0RnJvbSgpLCBVcGRhdGUuZ2V0VG8oKSk7CisKKyAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBCYXRjaFVwZGF0ZUluZm8gQlVJOworICAgIExlZ2FsaXplVXBkYXRlcyhVcGRhdGVzLCBCVUkuVXBkYXRlcyk7CisKKyAgICBjb25zdCBzaXplX3QgTnVtTGVnYWxpemVkID0gQlVJLlVwZGF0ZXMuc2l6ZSgpOworICAgIEJVSS5GdXR1cmVTdWNjZXNzb3JzLnJlc2VydmUoTnVtTGVnYWxpemVkKTsKKyAgICBCVUkuRnV0dXJlUHJlZGVjZXNzb3JzLnJlc2VydmUoTnVtTGVnYWxpemVkKTsKKworICAgIC8vIFVzZSB0aGUgbGVnYWxpemVkIGZ1dHVyZSB1cGRhdGVzIHRvIGluaXRpYWxpemUgZnV0dXJlIHN1Y2Nlc3NvcnMgYW5kCisgICAgLy8gcHJlZGVjZXNzb3JzLiBOb3RlIHRoYXQgdGhlc2Ugc2V0cyB3aWxsIG9ubHkgZGVjcmVhc2Ugc2l6ZSBvdmVyIHRpbWUsIGFzCisgICAgLy8gdGhlIG5leHQgQ0ZHIHNuYXBzaG90cyBzbG93bHkgYXBwcm9hY2ggdGhlIGFjdHVhbCAoY3VycmVudCkgQ0ZHLgorICAgIGZvciAoVXBkYXRlVCAmVSA6IEJVSS5VcGRhdGVzKSB7CisgICAgICBCVUkuRnV0dXJlU3VjY2Vzc29yc1tVLmdldEZyb20oKV0uaW5zZXJ0KHtVLmdldFRvKCksIFUuZ2V0S2luZCgpfSk7CisgICAgICBCVUkuRnV0dXJlUHJlZGVjZXNzb3JzW1UuZ2V0VG8oKV0uaW5zZXJ0KHtVLmdldEZyb20oKSwgVS5nZXRLaW5kKCl9KTsKKyAgICB9CisKKyAgICBERUJVRyhkYmdzKCkgPDwgIkFib3V0IHRvIGFwcGx5ICIgPDwgTnVtTGVnYWxpemVkIDw8ICIgdXBkYXRlc1xuIik7CisgICAgREVCVUcoaWYgKE51bUxlZ2FsaXplZCA8IDMyKSBmb3IgKGNvbnN0IGF1dG8gJlUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiByZXZlcnNlKEJVSS5VcGRhdGVzKSkgZGJncygpCisgICAgICAgICAgPDwgJ1x0JyA8PCBVIDw8ICJcbiIpOworICAgIERFQlVHKGRiZ3MoKSA8PCAiXG4iKTsKKworICAgIC8vIElmIHRoZSBEb21pbmF0b3JUcmVlIHdhcyByZWNhbGN1bGF0ZWQgYXQgc29tZSBwb2ludCwgc3RvcCB0aGUgYmF0Y2gKKyAgICAvLyB1cGRhdGVzLiBGdWxsIHJlY2FsY3VsYXRpb25zIGlnbm9yZSBiYXRjaCB1cGRhdGVzIGFuZCBsb29rIGF0IHRoZSBhY3R1YWwKKyAgICAvLyBDRkcuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBOdW1MZWdhbGl6ZWQgJiYgIUJVSS5Jc1JlY2FsY3VsYXRlZDsgKytpKQorICAgICAgQXBwbHlOZXh0VXBkYXRlKERULCBCVUkpOworICB9CisKKyAgLy8gVGhpcyBmdW5jdGlvbiBzZXJ2ZXMgZG91YmxlIHB1cnBvc2U6CisgIC8vIGEpIEl0IHJlbW92ZXMgcmVkdW5kYW50IHVwZGF0ZXMsIHdoaWNoIG1ha2VzIGl0IGVhc2llciB0byByZXZlcnNlLWFwcGx5CisgIC8vICAgIHRoZW0gd2hlbiB0cmF2ZXJzaW5nIENGRy4KKyAgLy8gYikgSXQgb3B0aW1pemVzIGF3YXkgdXBkYXRlcyB0aGF0IGNhbmNlbCBlYWNoIG90aGVyIG91dCwgYXMgdGhlIGVuZCByZXN1bHQKKyAgLy8gICAgaXMgdGhlIHNhbWUuCisgIC8vCisgIC8vIEl0IHJlbGllcyBvbiB0aGUgcHJvcGVydHkgb2YgdGhlIGluY3JlbWVudGFsIHVwZGF0ZXMgdGhhdCBzYXlzIHRoYXQgdGhlCisgIC8vIG9yZGVyIG9mIHVwZGF0ZXMgZG9lc24ndCBtYXR0ZXIuIFRoaXMgYWxsb3dzIHVzIHRvIHJlb3JkZXIgdGhlbSBhbmQgZW5kIHVwCisgIC8vIHdpdGggdGhlIGV4YWN0IHNhbWUgRG9tVHJlZSBldmVyeSB0aW1lLgorICAvLworICAvLyBGb2xsb3dpbmcgdGhlIHNhbWUgbG9naWMsIHRoZSBmdW5jdGlvbiBkb2Vzbid0IGNhcmUgYWJvdXQgdGhlIG9yZGVyIG9mCisgIC8vIGlucHV0IHVwZGF0ZXMsIHNvIGl0J3MgT0sgdG8gcGFzcyBpdCBhbiB1bm9yZGVyZWQgc2VxdWVuY2Ugb2YgdXBkYXRlcywgdGhhdAorICAvLyBkb2Vzbid0IG1ha2Ugc2Vuc2Ugd2hlbiBhcHBsaWVkIHNlcXVlbnRpYWxseSwgZWcuIHBlcmZvcm1pbmcgZG91YmxlCisgIC8vIGluc2VydGlvbnMgb3IgZGVsZXRpb25zIGFuZCB0aGVuIGRvaW5nIGFuIG9wcG9zaXRlIHVwZGF0ZS4KKyAgLy8KKyAgLy8gSW4gdGhlIGZ1dHVyZSwgaXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHNjaGVkdWxlIHVwZGF0ZXMgaW4gd2F5IHRoYXQKKyAgLy8gbWluaW1pemVzIHRoZSBhbW91bnQgb2Ygd29yayBuZWVkZWQgZG9uZSBkdXJpbmcgaW5jcmVtZW50YWwgdXBkYXRlcy4KKyAgc3RhdGljIHZvaWQgTGVnYWxpemVVcGRhdGVzKEFycmF5UmVmPFVwZGF0ZVQ+IEFsbFVwZGF0ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8VXBkYXRlVD4gJlJlc3VsdCkgeworICAgIERFQlVHKGRiZ3MoKSA8PCAiTGVnYWxpemluZyAiIDw8IEFsbFVwZGF0ZXMuc2l6ZSgpIDw8ICIgdXBkYXRlc1xuIik7CisgICAgLy8gQ291bnQgdGhlIHRvdGFsIG51bWJlciBvZiBpbnNlcmlvbnMgb2YgZWFjaCBlZGdlLgorICAgIC8vIEVhY2ggaW5zZXJ0aW9uIGFkZHMgMSBhbmQgZGVsZXRpb24gc3VidHJhY3RzIDEuIFRoZSBlbmQgbnVtYmVyIHNob3VsZCBiZQorICAgIC8vIG9uZSBvZiB7LTEgKGRlbGV0aW9uKSwgMCAoTk9QKSwgKzEgKGluc2VydGlvbil9LiBPdGhlcndpc2UsIHRoZSBzZXF1ZW5jZQorICAgIC8vIG9mIHVwZGF0ZXMgY29udGFpbnMgbXVsdGlwbGUgdXBkYXRlcyBvZiB0aGUgc2FtZSBraW5kIGFuZCB3ZSBhc3NlcnQgZm9yCisgICAgLy8gdGhhdCBjYXNlLgorICAgIFNtYWxsRGVuc2VNYXA8c3RkOjpwYWlyPE5vZGVQdHIsIE5vZGVQdHI+LCBpbnQsIDQ+IE9wZXJhdGlvbnM7CisgICAgT3BlcmF0aW9ucy5yZXNlcnZlKEFsbFVwZGF0ZXMuc2l6ZSgpKTsKKworICAgIGZvciAoY29uc3QgYXV0byAmVSA6IEFsbFVwZGF0ZXMpIHsKKyAgICAgIE5vZGVQdHIgRnJvbSA9IFUuZ2V0RnJvbSgpOworICAgICAgTm9kZVB0ciBUbyA9IFUuZ2V0VG8oKTsKKyAgICAgIGlmIChJc1Bvc3REb20pIHN0ZDo6c3dhcChGcm9tLCBUbyk7ICAvLyBSZXZlcnNlIGVkZ2UgZm9yIHBvc3Rkb21pbmF0b3JzLgorCisgICAgICBPcGVyYXRpb25zW3tGcm9tLCBUb31dICs9IChVLmdldEtpbmQoKSA9PSBVcGRhdGVLaW5kOjpJbnNlcnQgPyAxIDogLTEpOworICAgIH0KKworICAgIFJlc3VsdC5jbGVhcigpOworICAgIFJlc3VsdC5yZXNlcnZlKE9wZXJhdGlvbnMuc2l6ZSgpKTsKKyAgICBmb3IgKGF1dG8gJk9wIDogT3BlcmF0aW9ucykgeworICAgICAgY29uc3QgaW50IE51bUluc2VydGlvbnMgPSBPcC5zZWNvbmQ7CisgICAgICBhc3NlcnQoc3RkOjphYnMoTnVtSW5zZXJ0aW9ucykgPD0gMSAmJiAiVW5iYWxhbmNlZCBvcGVyYXRpb25zISIpOworICAgICAgaWYgKE51bUluc2VydGlvbnMgPT0gMCkgY29udGludWU7CisgICAgICBjb25zdCBVcGRhdGVLaW5kIFVLID0KKyAgICAgICAgICBOdW1JbnNlcnRpb25zID4gMCA/IFVwZGF0ZUtpbmQ6Okluc2VydCA6IFVwZGF0ZUtpbmQ6OkRlbGV0ZTsKKyAgICAgIFJlc3VsdC5wdXNoX2JhY2soe1VLLCBPcC5maXJzdC5maXJzdCwgT3AuZmlyc3Quc2Vjb25kfSk7CisgICAgfQorCisgICAgLy8gTWFrZSB0aGUgb3JkZXIgY29uc2lzdGVudCBieSBub3QgcmVseWluZyBvbiBwb2ludGVyIHZhbHVlcyB3aXRoaW4gdGhlCisgICAgLy8gc2V0LiBSZXVzZSB0aGUgb2xkIE9wZXJhdGlvbnMgbWFwLgorICAgIC8vIEluIHRoZSBmdXR1cmUsIHdlIHNob3VsZCBzb3J0IGJ5IHNvbWV0aGluZyBlbHNlIHRvIG1pbmltaXplIHRoZSBhbW91bnQKKyAgICAvLyBvZiB3b3JrIG5lZWRlZCB0byBwZXJmb3JtIHRoZSBzZXJpZXMgb2YgdXBkYXRlcy4KKyAgICBmb3IgKHNpemVfdCBpID0gMCwgZSA9IEFsbFVwZGF0ZXMuc2l6ZSgpOyBpICE9IGU7ICsraSkgeworICAgICAgY29uc3QgYXV0byAmVSA9IEFsbFVwZGF0ZXNbaV07CisgICAgICBpZiAoIUlzUG9zdERvbSkKKyAgICAgICAgT3BlcmF0aW9uc1t7VS5nZXRGcm9tKCksIFUuZ2V0VG8oKX1dID0gaW50KGkpOworICAgICAgZWxzZQorICAgICAgICBPcGVyYXRpb25zW3tVLmdldFRvKCksIFUuZ2V0RnJvbSgpfV0gPSBpbnQoaSk7CisgICAgfQorCisgICAgc3RkOjpzb3J0KFJlc3VsdC5iZWdpbigpLCBSZXN1bHQuZW5kKCksCisgICAgICAgICAgICAgIFsmT3BlcmF0aW9uc10oY29uc3QgVXBkYXRlVCAmQSwgY29uc3QgVXBkYXRlVCAmQikgeworICAgICAgICAgICAgICAgIHJldHVybiBPcGVyYXRpb25zW3tBLmdldEZyb20oKSwgQS5nZXRUbygpfV0gPgorICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb25zW3tCLmdldEZyb20oKSwgQi5nZXRUbygpfV07CisgICAgICAgICAgICAgIH0pOworICB9CisKKyAgc3RhdGljIHZvaWQgQXBwbHlOZXh0VXBkYXRlKERvbVRyZWVUICZEVCwgQmF0Y2hVcGRhdGVJbmZvICZCVUkpIHsKKyAgICBhc3NlcnQoIUJVSS5VcGRhdGVzLmVtcHR5KCkgJiYgIk5vIHVwZGF0ZXMgdG8gYXBwbHkhIik7CisgICAgVXBkYXRlVCBDdXJyZW50VXBkYXRlID0gQlVJLlVwZGF0ZXMucG9wX2JhY2tfdmFsKCk7CisgICAgREVCVUcoZGJncygpIDw8ICJBcHBseWluZyB1cGRhdGU6ICIgPDwgQ3VycmVudFVwZGF0ZSA8PCAiXG4iKTsKKworICAgIC8vIE1vdmUgdG8gdGhlIG5leHQgc25hcHNob3Qgb2YgdGhlIENGRyBieSByZW1vdmluZyB0aGUgcmV2ZXJzZS1hcHBsaWVkCisgICAgLy8gY3VycmVudCB1cGRhdGUuCisgICAgYXV0byAmRlMgPSBCVUkuRnV0dXJlU3VjY2Vzc29yc1tDdXJyZW50VXBkYXRlLmdldEZyb20oKV07CisgICAgRlMuZXJhc2Uoe0N1cnJlbnRVcGRhdGUuZ2V0VG8oKSwgQ3VycmVudFVwZGF0ZS5nZXRLaW5kKCl9KTsKKyAgICBpZiAoRlMuZW1wdHkoKSkgQlVJLkZ1dHVyZVN1Y2Nlc3NvcnMuZXJhc2UoQ3VycmVudFVwZGF0ZS5nZXRGcm9tKCkpOworCisgICAgYXV0byAmRlAgPSBCVUkuRnV0dXJlUHJlZGVjZXNzb3JzW0N1cnJlbnRVcGRhdGUuZ2V0VG8oKV07CisgICAgRlAuZXJhc2Uoe0N1cnJlbnRVcGRhdGUuZ2V0RnJvbSgpLCBDdXJyZW50VXBkYXRlLmdldEtpbmQoKX0pOworICAgIGlmIChGUC5lbXB0eSgpKSBCVUkuRnV0dXJlUHJlZGVjZXNzb3JzLmVyYXNlKEN1cnJlbnRVcGRhdGUuZ2V0VG8oKSk7CisKKyAgICBpZiAoQ3VycmVudFVwZGF0ZS5nZXRLaW5kKCkgPT0gVXBkYXRlS2luZDo6SW5zZXJ0KQorICAgICAgSW5zZXJ0RWRnZShEVCwgJkJVSSwgQ3VycmVudFVwZGF0ZS5nZXRGcm9tKCksIEN1cnJlbnRVcGRhdGUuZ2V0VG8oKSk7CisgICAgZWxzZQorICAgICAgRGVsZXRlRWRnZShEVCwgJkJVSSwgQ3VycmVudFVwZGF0ZS5nZXRGcm9tKCksIEN1cnJlbnRVcGRhdGUuZ2V0VG8oKSk7CisgIH0KKworICAvL35+CisgIC8vPT09LS0tLS0tLS0tLS0tLS0tIERvbVRyZWUgY29ycmVjdG5lc3MgdmVyaWZpY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PQorICAvL35+CisKKyAgLy8gQ2hlY2sgaWYgdGhlIHRyZWUgaGFzIGNvcnJlY3Qgcm9vdHMuIEEgRG9taW5hdG9yVHJlZSBhbHdheXMgaGFzIGEgc2luZ2xlCisgIC8vIHJvb3Qgd2hpY2ggaXMgdGhlIGZ1bmN0aW9uJ3MgZW50cnkgbm9kZS4gQSBQb3N0RG9taW5hdG9yVHJlZSBjYW4gaGF2ZQorICAvLyBtdWx0aXBsZSByb290cyAtIG9uZSBmb3IgZWFjaCBub2RlIHdpdGggbm8gc3VjY2Vzc29ycyBhbmQgZm9yIGluZmluaXRlCisgIC8vIGxvb3BzLgorICAvLyBSdW5uaW5nIHRpbWU6IE8oTikuCisgIGJvb2wgdmVyaWZ5Um9vdHMoY29uc3QgRG9tVHJlZVQgJkRUKSB7CisgICAgaWYgKCFEVC5QYXJlbnQgJiYgIURULlJvb3RzLmVtcHR5KCkpIHsKKyAgICAgIGVycnMoKSA8PCAiVHJlZSBoYXMgbm8gcGFyZW50IGJ1dCBoYXMgcm9vdHMhXG4iOworICAgICAgZXJycygpLmZsdXNoKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKCFJc1Bvc3REb20pIHsKKyAgICAgIGlmIChEVC5Sb290cy5lbXB0eSgpKSB7CisgICAgICAgIGVycnMoKSA8PCAiVHJlZSBkb2Vzbid0IGhhdmUgYSByb290IVxuIjsKKyAgICAgICAgZXJycygpLmZsdXNoKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgaWYgKERULmdldFJvb3QoKSAhPSBHZXRFbnRyeU5vZGUoRFQpKSB7CisgICAgICAgIGVycnMoKSA8PCAiVHJlZSdzIHJvb3QgaXMgbm90IGl0cyBwYXJlbnQncyBlbnRyeSBub2RlIVxuIjsKKyAgICAgICAgZXJycygpLmZsdXNoKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBSb290c1QgQ29tcHV0ZWRSb290cyA9IEZpbmRSb290cyhEVCwgbnVsbHB0cik7CisgICAgaWYgKERULlJvb3RzLnNpemUoKSAhPSBDb21wdXRlZFJvb3RzLnNpemUoKSB8fAorICAgICAgICAhc3RkOjppc19wZXJtdXRhdGlvbihEVC5Sb290cy5iZWdpbigpLCBEVC5Sb290cy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcHV0ZWRSb290cy5iZWdpbigpKSkgeworICAgICAgZXJycygpIDw8ICJUcmVlIGhhcyBkaWZmZXJlbnQgcm9vdHMgdGhhbiBmcmVzaGx5IGNvbXB1dGVkIG9uZXMhXG4iOworICAgICAgZXJycygpIDw8ICJcdFBEVCByb290czogIjsKKyAgICAgIGZvciAoY29uc3QgTm9kZVB0ciBOIDogRFQuUm9vdHMpIGVycnMoKSA8PCBCbG9ja05hbWVQcmludGVyKE4pIDw8ICIsICI7CisgICAgICBlcnJzKCkgPDwgIlxuXHRDb21wdXRlZCByb290czogIjsKKyAgICAgIGZvciAoY29uc3QgTm9kZVB0ciBOIDogQ29tcHV0ZWRSb290cykKKyAgICAgICAgZXJycygpIDw8IEJsb2NrTmFtZVByaW50ZXIoTikgPDwgIiwgIjsKKyAgICAgIGVycnMoKSA8PCAiXG4iOworICAgICAgZXJycygpLmZsdXNoKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBDaGVja3MgaWYgdGhlIHRyZWUgY29udGFpbnMgYWxsIHJlYWNoYWJsZSBub2RlcyBpbiB0aGUgaW5wdXQgZ3JhcGguCisgIC8vIFJ1bm5pbmcgdGltZTogTyhOKS4KKyAgYm9vbCB2ZXJpZnlSZWFjaGFiaWxpdHkoY29uc3QgRG9tVHJlZVQgJkRUKSB7CisgICAgY2xlYXIoKTsKKyAgICBkb0Z1bGxERlNXYWxrKERULCBBbHdheXNEZXNjZW5kKTsKKworICAgIGZvciAoYXV0byAmTm9kZVRvVE4gOiBEVC5Eb21UcmVlTm9kZXMpIHsKKyAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIFROID0gTm9kZVRvVE4uc2Vjb25kLmdldCgpOworICAgICAgY29uc3QgTm9kZVB0ciBCQiA9IFROLT5nZXRCbG9jaygpOworCisgICAgICAvLyBWaXJ0dWFsIHJvb3QgaGFzIGEgY29ycmVzcG9uZGluZyB2aXJ0dWFsIENGRyBub2RlLgorICAgICAgaWYgKERULmlzVmlydHVhbFJvb3QoVE4pKSBjb250aW51ZTsKKworICAgICAgaWYgKE5vZGVUb0luZm8uY291bnQoQkIpID09IDApIHsKKyAgICAgICAgZXJycygpIDw8ICJEb21UcmVlIG5vZGUgIiA8PCBCbG9ja05hbWVQcmludGVyKEJCKQorICAgICAgICAgICAgICAgPDwgIiBub3QgZm91bmQgYnkgREZTIHdhbGshXG4iOworICAgICAgICBlcnJzKCkuZmx1c2goKTsKKworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChjb25zdCBOb2RlUHRyIE4gOiBOdW1Ub05vZGUpIHsKKyAgICAgIGlmIChOICYmICFEVC5nZXROb2RlKE4pKSB7CisgICAgICAgIGVycnMoKSA8PCAiQ0ZHIG5vZGUgIiA8PCBCbG9ja05hbWVQcmludGVyKE4pCisgICAgICAgICAgICAgICA8PCAiIG5vdCBmb3VuZCBpbiB0aGUgRG9tVHJlZSFcbiI7CisgICAgICAgIGVycnMoKS5mbHVzaCgpOworCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIENoZWNrIGlmIGZvciBldmVyeSBwYXJlbnQgd2l0aCBhIGxldmVsIEwgaW4gdGhlIHRyZWUgYWxsIG9mIGl0cyBjaGlsZHJlbgorICAvLyBoYXZlIGxldmVsIEwgKyAxLgorICAvLyBSdW5uaW5nIHRpbWU6IE8oTikuCisgIHN0YXRpYyBib29sIFZlcmlmeUxldmVscyhjb25zdCBEb21UcmVlVCAmRFQpIHsKKyAgICBmb3IgKGF1dG8gJk5vZGVUb1ROIDogRFQuRG9tVHJlZU5vZGVzKSB7CisgICAgICBjb25zdCBUcmVlTm9kZVB0ciBUTiA9IE5vZGVUb1ROLnNlY29uZC5nZXQoKTsKKyAgICAgIGNvbnN0IE5vZGVQdHIgQkIgPSBUTi0+Z2V0QmxvY2soKTsKKyAgICAgIGlmICghQkIpIGNvbnRpbnVlOworCisgICAgICBjb25zdCBUcmVlTm9kZVB0ciBJRG9tID0gVE4tPmdldElEb20oKTsKKyAgICAgIGlmICghSURvbSAmJiBUTi0+Z2V0TGV2ZWwoKSAhPSAwKSB7CisgICAgICAgIGVycnMoKSA8PCAiTm9kZSB3aXRob3V0IGFuIElEb20gIiA8PCBCbG9ja05hbWVQcmludGVyKEJCKQorICAgICAgICAgICAgICAgPDwgIiBoYXMgYSBub256ZXJvIGxldmVsICIgPDwgVE4tPmdldExldmVsKCkgPDwgIiFcbiI7CisgICAgICAgIGVycnMoKS5mbHVzaCgpOworCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgaWYgKElEb20gJiYgVE4tPmdldExldmVsKCkgIT0gSURvbS0+Z2V0TGV2ZWwoKSArIDEpIHsKKyAgICAgICAgZXJycygpIDw8ICJOb2RlICIgPDwgQmxvY2tOYW1lUHJpbnRlcihCQikgPDwgIiBoYXMgbGV2ZWwgIgorICAgICAgICAgICAgICAgPDwgVE4tPmdldExldmVsKCkgPDwgIiB3aGlsZSBpdHMgSURvbSAiCisgICAgICAgICAgICAgICA8PCBCbG9ja05hbWVQcmludGVyKElEb20tPmdldEJsb2NrKCkpIDw8ICIgaGFzIGxldmVsICIKKyAgICAgICAgICAgICAgIDw8IElEb20tPmdldExldmVsKCkgPDwgIiFcbiI7CisgICAgICAgIGVycnMoKS5mbHVzaCgpOworCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIENoZWNrIGlmIHRoZSBjb21wdXRlZCBERlMgbnVtYmVycyBhcmUgY29ycmVjdC4gTm90ZSB0aGF0IERGUyBpbmZvIG1heSBub3QKKyAgLy8gYmUgdmFsaWQsIGFuZCB3aGVuIHRoYXQgaXMgdGhlIGNhc2UsIHdlIGRvbid0IHZlcmlmeSB0aGUgbnVtYmVycy4KKyAgLy8gUnVubmluZyB0aW1lOiBPKE4gbG9nKE4pKS4KKyAgc3RhdGljIGJvb2wgVmVyaWZ5REZTTnVtYmVycyhjb25zdCBEb21UcmVlVCAmRFQpIHsKKyAgICBpZiAoIURULkRGU0luZm9WYWxpZCB8fCAhRFQuUGFyZW50KQorICAgICAgcmV0dXJuIHRydWU7CisKKyAgICBjb25zdCBOb2RlUHRyIFJvb3RCQiA9IElzUG9zdERvbSA/IG51bGxwdHIgOiBEVC5nZXRSb290cygpWzBdOworICAgIGNvbnN0IFRyZWVOb2RlUHRyIFJvb3QgPSBEVC5nZXROb2RlKFJvb3RCQik7CisKKyAgICBhdXRvIFByaW50Tm9kZUFuZERGU051bXMgPSBbXShjb25zdCBUcmVlTm9kZVB0ciBUTikgeworICAgICAgZXJycygpIDw8IEJsb2NrTmFtZVByaW50ZXIoVE4pIDw8ICIgeyIgPDwgVE4tPmdldERGU051bUluKCkgPDwgIiwgIgorICAgICAgICAgICAgIDw8IFROLT5nZXRERlNOdW1PdXQoKSA8PCAnfSc7CisgICAgfTsKKworICAgIC8vIFZlcmlmeSB0aGUgcm9vdCdzIERGUyBJbiBudW1iZXIuIEFsdGhvdWdoIERGUyBudW1iZXJpbmcgd291bGQgYWxzbyB3b3JrCisgICAgLy8gaWYgd2Ugc3RhcnRlZCBmcm9tIHNvbWUgb3RoZXIgdmFsdWUsIHdlIGFzc3VtZSAwLWJhc2VkIG51bWJlcmluZy4KKyAgICBpZiAoUm9vdC0+Z2V0REZTTnVtSW4oKSAhPSAwKSB7CisgICAgICBlcnJzKCkgPDwgIkRGU0luIG51bWJlciBmb3IgdGhlIHRyZWUgcm9vdCBpcyBub3Q6XG5cdCI7CisgICAgICBQcmludE5vZGVBbmRERlNOdW1zKFJvb3QpOworICAgICAgZXJycygpIDw8ICdcbic7CisgICAgICBlcnJzKCkuZmx1c2goKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBGb3IgZWFjaCB0cmVlIG5vZGUgdmVyaWZ5IGlmIGNoaWxkcmVuJ3MgREZTIG51bWJlcnMgY292ZXIgdGhlaXIgcGFyZW50J3MKKyAgICAvLyBERlMgbnVtYmVycyB3aXRoIG5vIGdhcHMuCisgICAgZm9yIChjb25zdCBhdXRvICZOb2RlVG9UTiA6IERULkRvbVRyZWVOb2RlcykgeworICAgICAgY29uc3QgVHJlZU5vZGVQdHIgTm9kZSA9IE5vZGVUb1ROLnNlY29uZC5nZXQoKTsKKworICAgICAgLy8gSGFuZGxlIHRyZWUgbGVhdmVzLgorICAgICAgaWYgKE5vZGUtPmdldENoaWxkcmVuKCkuZW1wdHkoKSkgeworICAgICAgICBpZiAoTm9kZS0+Z2V0REZTTnVtSW4oKSArIDEgIT0gTm9kZS0+Z2V0REZTTnVtT3V0KCkpIHsKKyAgICAgICAgICBlcnJzKCkgPDwgIlRyZWUgbGVhZiBzaG91bGQgaGF2ZSBERlNPdXQgPSBERlNJbiArIDE6XG5cdCI7CisgICAgICAgICAgUHJpbnROb2RlQW5kREZTTnVtcyhOb2RlKTsKKyAgICAgICAgICBlcnJzKCkgPDwgJ1xuJzsKKyAgICAgICAgICBlcnJzKCkuZmx1c2goKTsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gTWFrZSBhIGNvcHkgYW5kIHNvcnQgaXQgc3VjaCB0aGF0IGl0IGlzIHBvc3NpYmxlIHRvIGNoZWNrIGlmIHRoZXJlIGFyZQorICAgICAgLy8gbm8gZ2FwcyBiZXR3ZWVuIERGUyBudW1iZXJzIG9mIGFkamFjZW50IGNoaWxkcmVuLgorICAgICAgU21hbGxWZWN0b3I8VHJlZU5vZGVQdHIsIDg+IENoaWxkcmVuKE5vZGUtPmJlZ2luKCksIE5vZGUtPmVuZCgpKTsKKyAgICAgIHN0ZDo6c29ydChDaGlsZHJlbi5iZWdpbigpLCBDaGlsZHJlbi5lbmQoKSwKKyAgICAgICAgICAgICAgICBbXShjb25zdCBUcmVlTm9kZVB0ciBDaDEsIGNvbnN0IFRyZWVOb2RlUHRyIENoMikgeworICAgICAgICAgICAgICAgICAgcmV0dXJuIENoMS0+Z2V0REZTTnVtSW4oKSA8IENoMi0+Z2V0REZTTnVtSW4oKTsKKyAgICAgICAgICAgICAgICB9KTsKKworICAgICAgYXV0byBQcmludENoaWxkcmVuRXJyb3IgPSBbTm9kZSwgJkNoaWxkcmVuLCBQcmludE5vZGVBbmRERlNOdW1zXSgKKyAgICAgICAgICBjb25zdCBUcmVlTm9kZVB0ciBGaXJzdENoLCBjb25zdCBUcmVlTm9kZVB0ciBTZWNvbmRDaCkgeworICAgICAgICBhc3NlcnQoRmlyc3RDaCk7CisKKyAgICAgICAgZXJycygpIDw8ICJJbmNvcnJlY3QgREZTIG51bWJlcnMgZm9yOlxuXHRQYXJlbnQgIjsKKyAgICAgICAgUHJpbnROb2RlQW5kREZTTnVtcyhOb2RlKTsKKworICAgICAgICBlcnJzKCkgPDwgIlxuXHRDaGlsZCAiOworICAgICAgICBQcmludE5vZGVBbmRERlNOdW1zKEZpcnN0Q2gpOworCisgICAgICAgIGlmIChTZWNvbmRDaCkgeworICAgICAgICAgIGVycnMoKSA8PCAiXG5cdFNlY29uZCBjaGlsZCAiOworICAgICAgICAgIFByaW50Tm9kZUFuZERGU051bXMoU2Vjb25kQ2gpOworICAgICAgICB9CisKKyAgICAgICAgZXJycygpIDw8ICJcbkFsbCBjaGlsZHJlbjogIjsKKyAgICAgICAgZm9yIChjb25zdCBUcmVlTm9kZVB0ciBDaCA6IENoaWxkcmVuKSB7CisgICAgICAgICAgUHJpbnROb2RlQW5kREZTTnVtcyhDaCk7CisgICAgICAgICAgZXJycygpIDw8ICIsICI7CisgICAgICAgIH0KKworICAgICAgICBlcnJzKCkgPDwgJ1xuJzsKKyAgICAgICAgZXJycygpLmZsdXNoKCk7CisgICAgICB9OworCisgICAgICBpZiAoQ2hpbGRyZW4uZnJvbnQoKS0+Z2V0REZTTnVtSW4oKSAhPSBOb2RlLT5nZXRERlNOdW1JbigpICsgMSkgeworICAgICAgICBQcmludENoaWxkcmVuRXJyb3IoQ2hpbGRyZW4uZnJvbnQoKSwgbnVsbHB0cik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKworICAgICAgaWYgKENoaWxkcmVuLmJhY2soKS0+Z2V0REZTTnVtT3V0KCkgKyAxICE9IE5vZGUtPmdldERGU051bU91dCgpKSB7CisgICAgICAgIFByaW50Q2hpbGRyZW5FcnJvcihDaGlsZHJlbi5iYWNrKCksIG51bGxwdHIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisKKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwLCBlID0gQ2hpbGRyZW4uc2l6ZSgpIC0gMTsgaSAhPSBlOyArK2kpIHsKKyAgICAgICAgaWYgKENoaWxkcmVuW2ldLT5nZXRERlNOdW1PdXQoKSArIDEgIT0gQ2hpbGRyZW5baSArIDFdLT5nZXRERlNOdW1JbigpKSB7CisgICAgICAgICAgUHJpbnRDaGlsZHJlbkVycm9yKENoaWxkcmVuW2ldLCBDaGlsZHJlbltpICsgMV0pOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gVGhlIGJlbG93IHJvdXRpbmVzIHZlcmlmeSB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGRvbWluYXRvciB0cmVlIHJlbGF0aXZlIHRvCisgIC8vIHRoZSBDRkcgaXQncyBjb21pbmcgZnJvbS4gIEEgdHJlZSBpcyBhIGRvbWluYXRvciB0cmVlIGlmZiBpdCBoYXMgdHdvCisgIC8vIHByb3BlcnRpZXMsIGNhbGxlZCB0aGUgcGFyZW50IHByb3BlcnR5IGFuZCB0aGUgc2libGluZyBwcm9wZXJ0eS4gIFRhcmphbgorICAvLyBhbmQgTGVuZ2F1ZXIgcHJvdmUgKGJ1dCBkb24ndCBleHBsaWNpdGx5IG5hbWUpIHRoZSBwcm9wZXJ0aWVzIGFzIHBhcnQgb2YKKyAgLy8gdGhlIHByb29mcyBpbiB0aGVpciAxOTcyIHBhcGVyLCBidXQgdGhlIHByb29mcyBhcmUgbW9zdGx5IHBhcnQgb2YgcHJvdmluZworICAvLyB0aGluZ3MgYWJvdXQgc2VtaWRvbWluYXRvcnMgYW5kIGlkb21zLCBhbmQgc29tZSBvZiB0aGVtIGFyZSBzaW1wbHkgYXNzZXJ0ZWQKKyAgLy8gYmFzZWQgb24gZXZlbiBlYXJsaWVyIHBhcGVycyAoc2VlLCBlLmcuLCBsZW1tYSAyKS4gIFNvbWUgcGFwZXJzIHJlZmVyIHRvCisgIC8vIHRoZXNlIHByb3BlcnRpZXMgYXMgInZhbGlkIiBhbmQgImNvLXZhbGlkIi4gIFNlZSwgZS5nLiwgIkRvbWluYXRvcnMsCisgIC8vIGRpcmVjdGVkIGJpcG9sYXIgb3JkZXJzLCBhbmQgaW5kZXBlbmRlbnQgc3Bhbm5pbmcgdHJlZXMiIGJ5IExvdWthcworICAvLyBHZW9yZ2lhZGlzIGFuZCBSb2JlcnQgRS4gVGFyamFuLCBhcyB3ZWxsIGFzICJEb21pbmF0b3IgVHJlZSBWZXJpZmljYXRpb24KKyAgLy8gYW5kIFZlcnRleC1EaXNqb2ludCBQYXRocyAiIGJ5IHRoZSBzYW1lIGF1dGhvcnMuCisKKyAgLy8gQSB2ZXJ5IHNpbXBsZSBhbmQgZGlyZWN0IGV4cGxhbmF0aW9uIG9mIHRoZXNlIHByb3BlcnRpZXMgY2FuIGJlIGZvdW5kIGluCisgIC8vICJBbiBFeHBlcmltZW50YWwgU3R1ZHkgb2YgRHluYW1pYyBEb21pbmF0b3JzIiwgZm91bmQgYXQKKyAgLy8gaHR0cHM6Ly9hcnhpdi5vcmcvYWJzLzE2MDQuMDI3MTEKKworICAvLyBUaGUgZWFzaWVzdCB3YXkgdG8gdGhpbmsgb2YgdGhlIHBhcmVudCBwcm9wZXJ0eSBpcyB0aGF0IGl0J3MgYSByZXF1aXJlbWVudAorICAvLyBvZiBiZWluZyBhIGRvbWluYXRvci4gIExldCdzIGp1c3QgdGFrZSBpbW1lZGlhdGUgZG9taW5hdG9ycy4gIEZvciBQQVJFTlQgdG8KKyAgLy8gYmUgYW4gaW1tZWRpYXRlIGRvbWluYXRvciBvZiBDSElMRCwgYWxsIHBhdGhzIGluIHRoZSBDRkcgbXVzdCBnbyB0aHJvdWdoCisgIC8vIFBBUkVOVCBiZWZvcmUgdGhleSBoaXQgQ0hJTEQuICBUaGlzIGltcGxpZXMgdGhhdCBpZiB5b3Ugd2VyZSB0byBjdXQgUEFSRU5UCisgIC8vIG91dCBvZiB0aGUgQ0ZHLCB0aGVyZSBzaG91bGQgYmUgbm8gcGF0aHMgdG8gQ0hJTEQgdGhhdCBhcmUgcmVhY2hhYmxlLiAgSWYKKyAgLy8gdGhlcmUgYXJlLCB0aGVuIHlvdSBub3cgaGF2ZSBhIHBhdGggZnJvbSBQQVJFTlQgdG8gQ0hJTEQgdGhhdCBnb2VzIGFyb3VuZAorICAvLyBQQVJFTlQgYW5kIHN0aWxsIHJlYWNoZXMgQ0hJTEQsIHdoaWNoIGJ5IGRlZmluaXRpb24sIG1lYW5zIFBBUkVOVCBjYW4ndCBiZQorICAvLyBhIGRvbWluYXRvciBvZiBDSElMRCAobGV0IGFsb25lIGFuIGltbWVkaWF0ZSBvbmUpLgorCisgIC8vIFRoZSBzaWJsaW5nIHByb3BlcnR5IGlzIHNpbWlsYXIuICBJdCBzYXlzIHRoYXQgZm9yIGVhY2ggcGFpciBvZiBzaWJsaW5nCisgIC8vIG5vZGVzIGluIHRoZSBkb21pbmF0b3IgdHJlZSAoTEVGVCBhbmQgUklHSFQpICwgdGhleSBtdXN0IG5vdCBkb21pbmF0ZSBlYWNoCisgIC8vIG90aGVyLiAgSWYgc2libGluZyBMRUZUIGRvbWluYXRlZCBzaWJsaW5nIFJJR0hULCBpdCBtZWFucyB0aGVyZSBhcmUgbm8KKyAgLy8gcGF0aHMgaW4gdGhlIENGRyBmcm9tIHNpYmxpbmcgTEVGVCB0byBzaWJsaW5nIFJJR0hUIHRoYXQgZG8gbm90IGdvIHRocm91Z2gKKyAgLy8gTEVGVCwgYW5kIHRodXMsIExFRlQgaXMgcmVhbGx5IGFuIGFuY2VzdG9yIChpbiB0aGUgZG9taW5hdG9yIHRyZWUpIG9mCisgIC8vIFJJR0hULCBub3QgYSBzaWJsaW5nLgorCisgIC8vIEl0IGlzIHBvc3NpYmxlIHRvIHZlcmlmeSB0aGUgcGFyZW50IGFuZCBzaWJsaW5nIHByb3BlcnRpZXMgaW4KKyAgLy8gbGluZWFyIHRpbWUsIGJ1dCB0aGUgYWxnb3JpdGhtcyBhcmUgY29tcGxleC4gSW5zdGVhZCwgd2UgZG8gaXQgaW4gYQorICAvLyBzdHJhaWdodGZvcndhcmQgTl4yIGFuZCBOXjMgd2F5IGJlbG93LCB1c2luZyBkaXJlY3QgcGF0aCByZWFjaGFiaWxpdHkuCisKKyAgLy8gQ2hlY2tzIGlmIHRoZSB0cmVlIGhhcyB0aGUgcGFyZW50IHByb3BlcnR5OiBpZiBmb3IgYWxsIGVkZ2VzIGZyb20gViB0byBXIGluCisgIC8vIHRoZSBpbnB1dCBncmFwaCwgc3VjaCB0aGF0IFYgaXMgcmVhY2hhYmxlLCB0aGUgcGFyZW50IG9mIFcgaW4gdGhlIHRyZWUgaXMKKyAgLy8gYW4gYW5jZXN0b3Igb2YgViBpbiB0aGUgdHJlZS4KKyAgLy8gUnVubmluZyB0aW1lOiBPKE5eMikuCisgIC8vCisgIC8vIFRoaXMgbWVhbnMgdGhhdCBpZiBhIG5vZGUgZ2V0cyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgZ3JhcGgsIHRoZW4gYWxsIG9mCisgIC8vIHRoZSBub2RlcyBpdCBkb21pbmF0ZWQgcHJldmlvdXNseSB3aWxsIG5vdyBiZWNvbWUgdW5yZWFjaGFibGUuCisgIGJvb2wgdmVyaWZ5UGFyZW50UHJvcGVydHkoY29uc3QgRG9tVHJlZVQgJkRUKSB7CisgICAgZm9yIChhdXRvICZOb2RlVG9UTiA6IERULkRvbVRyZWVOb2RlcykgeworICAgICAgY29uc3QgVHJlZU5vZGVQdHIgVE4gPSBOb2RlVG9UTi5zZWNvbmQuZ2V0KCk7CisgICAgICBjb25zdCBOb2RlUHRyIEJCID0gVE4tPmdldEJsb2NrKCk7CisgICAgICBpZiAoIUJCIHx8IFROLT5nZXRDaGlsZHJlbigpLmVtcHR5KCkpIGNvbnRpbnVlOworCisgICAgICBERUJVRyhkYmdzKCkgPDwgIlZlcmlmeWluZyBwYXJlbnQgcHJvcGVydHkgb2Ygbm9kZSAiCisgICAgICAgICAgICAgICAgICAgPDwgQmxvY2tOYW1lUHJpbnRlcihUTikgPDwgIlxuIik7CisgICAgICBjbGVhcigpOworICAgICAgZG9GdWxsREZTV2FsayhEVCwgW0JCXShOb2RlUHRyIEZyb20sIE5vZGVQdHIgVG8pIHsKKyAgICAgICAgcmV0dXJuIEZyb20gIT0gQkIgJiYgVG8gIT0gQkI7CisgICAgICB9KTsKKworICAgICAgZm9yIChUcmVlTm9kZVB0ciBDaGlsZCA6IFROLT5nZXRDaGlsZHJlbigpKQorICAgICAgICBpZiAoTm9kZVRvSW5mby5jb3VudChDaGlsZC0+Z2V0QmxvY2soKSkgIT0gMCkgeworICAgICAgICAgIGVycnMoKSA8PCAiQ2hpbGQgIiA8PCBCbG9ja05hbWVQcmludGVyKENoaWxkKQorICAgICAgICAgICAgICAgICA8PCAiIHJlYWNoYWJsZSBhZnRlciBpdHMgcGFyZW50ICIgPDwgQmxvY2tOYW1lUHJpbnRlcihCQikKKyAgICAgICAgICAgICAgICAgPDwgIiBpcyByZW1vdmVkIVxuIjsKKyAgICAgICAgICBlcnJzKCkuZmx1c2goKTsKKworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gQ2hlY2sgaWYgdGhlIHRyZWUgaGFzIHNpYmxpbmcgcHJvcGVydHk6IGlmIGEgbm9kZSBWIGRvZXMgbm90IGRvbWluYXRlIGEKKyAgLy8gbm9kZSBXIGZvciBhbGwgc2libGluZ3MgViBhbmQgVyBpbiB0aGUgdHJlZS4KKyAgLy8gUnVubmluZyB0aW1lOiBPKE5eMykuCisgIC8vCisgIC8vIFRoaXMgbWVhbnMgdGhhdCBpZiBhIG5vZGUgZ2V0cyBkaXNjb25uZWN0ZWQgZnJvbSB0aGUgZ3JhcGgsIHRoZW4gYWxsIG9mIGl0cworICAvLyBzaWJsaW5ncyB3aWxsIG5vdyBzdGlsbCBiZSByZWFjaGFibGUuCisgIGJvb2wgdmVyaWZ5U2libGluZ1Byb3BlcnR5KGNvbnN0IERvbVRyZWVUICZEVCkgeworICAgIGZvciAoYXV0byAmTm9kZVRvVE4gOiBEVC5Eb21UcmVlTm9kZXMpIHsKKyAgICAgIGNvbnN0IFRyZWVOb2RlUHRyIFROID0gTm9kZVRvVE4uc2Vjb25kLmdldCgpOworICAgICAgY29uc3QgTm9kZVB0ciBCQiA9IFROLT5nZXRCbG9jaygpOworICAgICAgaWYgKCFCQiB8fCBUTi0+Z2V0Q2hpbGRyZW4oKS5lbXB0eSgpKSBjb250aW51ZTsKKworICAgICAgY29uc3QgYXV0byAmU2libGluZ3MgPSBUTi0+Z2V0Q2hpbGRyZW4oKTsKKyAgICAgIGZvciAoY29uc3QgVHJlZU5vZGVQdHIgTiA6IFNpYmxpbmdzKSB7CisgICAgICAgIGNsZWFyKCk7CisgICAgICAgIE5vZGVQdHIgQkJOID0gTi0+Z2V0QmxvY2soKTsKKyAgICAgICAgZG9GdWxsREZTV2FsayhEVCwgW0JCTl0oTm9kZVB0ciBGcm9tLCBOb2RlUHRyIFRvKSB7CisgICAgICAgICAgcmV0dXJuIEZyb20gIT0gQkJOICYmIFRvICE9IEJCTjsKKyAgICAgICAgfSk7CisKKyAgICAgICAgZm9yIChjb25zdCBUcmVlTm9kZVB0ciBTIDogU2libGluZ3MpIHsKKyAgICAgICAgICBpZiAoUyA9PSBOKSBjb250aW51ZTsKKworICAgICAgICAgIGlmIChOb2RlVG9JbmZvLmNvdW50KFMtPmdldEJsb2NrKCkpID09IDApIHsKKyAgICAgICAgICAgIGVycnMoKSA8PCAiTm9kZSAiIDw8IEJsb2NrTmFtZVByaW50ZXIoUykKKyAgICAgICAgICAgICAgICAgICA8PCAiIG5vdCByZWFjaGFibGUgd2hlbiBpdHMgc2libGluZyAiIDw8IEJsb2NrTmFtZVByaW50ZXIoTikKKyAgICAgICAgICAgICAgICAgICA8PCAiIGlzIHJlbW92ZWQhXG4iOworICAgICAgICAgICAgZXJycygpLmZsdXNoKCk7CisKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIENoZWNrIGlmIHRoZSBnaXZlbiB0cmVlIGlzIHRoZSBzYW1lIGFzIGEgZnJlc2hseSBjb21wdXRlZCBvbmUgZm9yIHRoZSBzYW1lCisgIC8vIFBhcmVudC4KKyAgLy8gUnVubmluZyB0aW1lOiBPKE5eMiksIGJ1dCBmYXN0ZXIgaW4gcHJhY3Rpc2UgKHNhbWUgYXMgdHJlZSBjb25zdHJ1Y3Rpb24pLgorICAvLworICAvLyBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBjaGVjayBpZiB0aGF0IHRoZSB0cmVlIGNvbnN0cnVjdGlvbiBhbGdvcml0aG0gaXMKKyAgLy8gY29ycmVjdCBhbmQgc2hvdWxkIGJlIG9ubHkgdXNlZCBmb3IgZmFzdCAoYnV0IHBvc3NpYmx5IHVuc291bmQpCisgIC8vIHZlcmlmaWNhdGlvbi4KKyAgc3RhdGljIGJvb2wgSXNTYW1lQXNGcmVzaFRyZWUoY29uc3QgRG9tVHJlZVQgJkRUKSB7CisgICAgRG9tVHJlZVQgRnJlc2hUcmVlOworICAgIEZyZXNoVHJlZS5yZWNhbGN1bGF0ZSgqRFQuUGFyZW50KTsKKyAgICBjb25zdCBib29sIERpZmZlcmVudCA9IERULmNvbXBhcmUoRnJlc2hUcmVlKTsKKworICAgIGlmIChEaWZmZXJlbnQpIHsKKyAgICAgIGVycnMoKSA8PCAoRFQuaXNQb3N0RG9taW5hdG9yKCkgPyAiUG9zdCIgOiAiIikKKyAgICAgICAgICAgICA8PCAiRG9taW5hdG9yVHJlZSBpcyBkaWZmZXJlbnQgdGhhbiBhIGZyZXNobHkgY29tcHV0ZWQgb25lIVxuIgorICAgICAgICAgICAgIDw8ICJcdEN1cnJlbnQ6XG4iOworICAgICAgRFQucHJpbnQoZXJycygpKTsKKyAgICAgIGVycnMoKSA8PCAiXG5cdEZyZXNobHkgY29tcHV0ZWQgdHJlZTpcbiI7CisgICAgICBGcmVzaFRyZWUucHJpbnQoZXJycygpKTsKKyAgICAgIGVycnMoKS5mbHVzaCgpOworICAgIH0KKworICAgIHJldHVybiAhRGlmZmVyZW50OworICB9Cit9OworCit0ZW1wbGF0ZSA8Y2xhc3MgRG9tVHJlZVQ+Cit2b2lkIENhbGN1bGF0ZShEb21UcmVlVCAmRFQpIHsKKyAgU2VtaU5DQUluZm88RG9tVHJlZVQ+OjpDYWxjdWxhdGVGcm9tU2NyYXRjaChEVCwgbnVsbHB0cik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBEb21UcmVlVD4KK3ZvaWQgSW5zZXJ0RWRnZShEb21UcmVlVCAmRFQsIHR5cGVuYW1lIERvbVRyZWVUOjpOb2RlUHRyIEZyb20sCisgICAgICAgICAgICAgICAgdHlwZW5hbWUgRG9tVHJlZVQ6Ok5vZGVQdHIgVG8pIHsKKyAgaWYgKERULmlzUG9zdERvbWluYXRvcigpKSBzdGQ6OnN3YXAoRnJvbSwgVG8pOworICBTZW1pTkNBSW5mbzxEb21UcmVlVD46Okluc2VydEVkZ2UoRFQsIG51bGxwdHIsIEZyb20sIFRvKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIERvbVRyZWVUPgordm9pZCBEZWxldGVFZGdlKERvbVRyZWVUICZEVCwgdHlwZW5hbWUgRG9tVHJlZVQ6Ok5vZGVQdHIgRnJvbSwKKyAgICAgICAgICAgICAgICB0eXBlbmFtZSBEb21UcmVlVDo6Tm9kZVB0ciBUbykgeworICBpZiAoRFQuaXNQb3N0RG9taW5hdG9yKCkpIHN0ZDo6c3dhcChGcm9tLCBUbyk7CisgIFNlbWlOQ0FJbmZvPERvbVRyZWVUPjo6RGVsZXRlRWRnZShEVCwgbnVsbHB0ciwgRnJvbSwgVG8pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRG9tVHJlZVQ+Cit2b2lkIEFwcGx5VXBkYXRlcyhEb21UcmVlVCAmRFQsCisgICAgICAgICAgICAgICAgICBBcnJheVJlZjx0eXBlbmFtZSBEb21UcmVlVDo6VXBkYXRlVHlwZT4gVXBkYXRlcykgeworICBTZW1pTkNBSW5mbzxEb21UcmVlVD46OkFwcGx5VXBkYXRlcyhEVCwgVXBkYXRlcyk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBEb21UcmVlVD4KK2Jvb2wgVmVyaWZ5KGNvbnN0IERvbVRyZWVUICZEVCwgdHlwZW5hbWUgRG9tVHJlZVQ6OlZlcmlmaWNhdGlvbkxldmVsIFZMKSB7CisgIFNlbWlOQ0FJbmZvPERvbVRyZWVUPiBTTkNBKG51bGxwdHIpOworCisgIC8vIFNpbXBsaXN0IGNoZWNrIGlzIHRvIGNvbXBhcmUgYWdhaW5zdCBhIG5ldyB0cmVlLiBUaGlzIHdpbGwgYWxzbworICAvLyB1c2VmdWxseSBwcmludCB0aGUgb2xkIGFuZCBuZXcgdHJlZXMsIGlmIHRoZXkgYXJlIGRpZmZlcmVudC4KKyAgaWYgKCFTTkNBLklzU2FtZUFzRnJlc2hUcmVlKERUKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgLy8gQ29tbW9uIGNoZWNrcyB0byB2ZXJpZnkgdGhlIHByb3BlcnRpZXMgb2YgdGhlIHRyZWUuIE8oTiBsb2cgTikgYXQgd29yc3QKKyAgaWYgKCFTTkNBLnZlcmlmeVJvb3RzKERUKSB8fCAhU05DQS52ZXJpZnlSZWFjaGFiaWxpdHkoRFQpIHx8CisgICAgICAhU05DQS5WZXJpZnlMZXZlbHMoRFQpIHx8ICFTTkNBLlZlcmlmeURGU051bWJlcnMoRFQpKQorICAgIHJldHVybiBmYWxzZTsKKworICAvLyBFeHRyYSBjaGVja3MgZGVwZW5kaW5nIG9uIFZlcmlmaWNhdGlvbkxldmVsLiBVcCB0byBPKE5eMykKKyAgaWYgKFZMID09IERvbVRyZWVUOjpWZXJpZmljYXRpb25MZXZlbDo6QmFzaWMgfHwKKyAgICAgIFZMID09IERvbVRyZWVUOjpWZXJpZmljYXRpb25MZXZlbDo6RnVsbCkKKyAgICBpZiAoIVNOQ0EudmVyaWZ5UGFyZW50UHJvcGVydHkoRFQpKQorICAgICAgcmV0dXJuIGZhbHNlOworICBpZiAoVkwgPT0gRG9tVHJlZVQ6OlZlcmlmaWNhdGlvbkxldmVsOjpGdWxsKQorICAgIGlmICghU05DQS52ZXJpZnlTaWJsaW5nUHJvcGVydHkoRFQpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgIHJldHVybiB0cnVlOworfQorCit9ICAvLyBuYW1lc3BhY2UgRG9tVHJlZUJ1aWxkZXIKK30gIC8vIG5hbWVzcGFjZSBsbHZtCisKKyN1bmRlZiBERUJVR19UWVBFCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0dsb2JQYXR0ZXJuLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvR2xvYlBhdHRlcm4uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOTQzNmExCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0dsb2JQYXR0ZXJuLmgKQEAgLTAsMCArMSw0OCBAQAorLy89PT0tLSBHbG9iUGF0dGVybi5oIC0gZ2xvYiBwYXR0ZXJuIG1hdGNoZXIgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIGdsb2IgcGF0dGVybiBtYXRjaGVyLiBUaGUgZ2xvYiBwYXR0ZXJuIGlzIHRoZQorLy8gcnVsZSB1c2VkIGJ5IHRoZSBzaGVsbC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9HTE9CX1BBVFRFUk5fSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfR0xPQl9QQVRURVJOX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0JpdFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCisvLyBUaGlzIGNsYXNzIHJlcHJlc2VudHMgYSBnbG9iIHBhdHRlcm4uIFN1cHBvcnRlZCBtZXRhY2hhcmFjdGVycworLy8gYXJlICIqIiwgIj8iLCAiWzxjaGFycz5dIiBhbmQgIltePGNoYXJzPl0iLgorbmFtZXNwYWNlIGxsdm0geworY2xhc3MgQml0VmVjdG9yOwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEFycmF5UmVmOworCitjbGFzcyBHbG9iUGF0dGVybiB7CitwdWJsaWM6CisgIHN0YXRpYyBFeHBlY3RlZDxHbG9iUGF0dGVybj4gY3JlYXRlKFN0cmluZ1JlZiBQYXQpOworICBib29sIG1hdGNoKFN0cmluZ1JlZiBTKSBjb25zdDsKKworcHJpdmF0ZToKKyAgYm9vbCBtYXRjaE9uZShBcnJheVJlZjxCaXRWZWN0b3I+IFBhdCwgU3RyaW5nUmVmIFMpIGNvbnN0OworCisgIC8vIFBhcnNlZCBnbG9iIHBhdHRlcm4uCisgIHN0ZDo6dmVjdG9yPEJpdFZlY3Rvcj4gVG9rZW5zOworCisgIC8vIFRoZSBmb2xsb3dpbmcgbWVtYmVycyBhcmUgZm9yIG9wdGltaXphdGlvbi4KKyAgT3B0aW9uYWw8U3RyaW5nUmVmPiBFeGFjdDsKKyAgT3B0aW9uYWw8U3RyaW5nUmVmPiBQcmVmaXg7CisgIE9wdGlvbmFsPFN0cmluZ1JlZj4gU3VmZml4OworfTsKK30KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9HTE9CX1BBVFRFUk5fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0dyYXBoV3JpdGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvR3JhcGhXcml0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGY1Yzg2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0dyYXBoV3JpdGVyLmgKQEAgLTAsMCArMSwzNjEgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvR3JhcGhXcml0ZXIuaCAtIFdyaXRlIGdyYXBoIHRvIGEgLmRvdCBmaWxlIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSBzaW1wbGUgaW50ZXJmYWNlIHRoYXQgY2FuIGJlIHVzZWQgdG8gcHJpbnQgb3V0IGdlbmVyaWMKKy8vIExMVk0gZ3JhcGhzIHRvICIuZG90IiBmaWxlcy4gICJkb3QiIGlzIGEgdG9vbCB0aGF0IGlzIHBhcnQgb2YgdGhlIEFUJlQKKy8vIGdyYXBodml6IHBhY2thZ2UgKGh0dHA6Ly93d3cucmVzZWFyY2guYXR0LmNvbS9zdy90b29scy9ncmFwaHZpei8pIHdoaWNoIGNhbgorLy8gYmUgdXNlZCB0byB0dXJuIHRoZSBmaWxlcyBvdXRwdXQgYnkgdGhpcyBpbnRlcmZhY2UgaW50byBhIHZhcmlldHkgb2YKKy8vIGRpZmZlcmVudCBncmFwaGljcyBmb3JtYXRzLgorLy8KKy8vIEdyYXBocyBkbyBub3QgbmVlZCB0byBpbXBsZW1lbnQgYW55IGludGVyZmFjZSBwYXN0IHdoYXQgaXMgYWxyZWFkeSByZXF1aXJlZAorLy8gYnkgdGhlIEdyYXBoVHJhaXRzIHRlbXBsYXRlLCBidXQgdGhleSBjYW4gY2hvb3NlIHRvIGltcGxlbWVudCBzcGVjaWFsaXphdGlvbnMKKy8vIG9mIHRoZSBET1RHcmFwaFRyYWl0cyB0ZW1wbGF0ZSBpZiB0aGV5IHdhbnQgdG8gY3VzdG9taXplIHRoZSBncmFwaHMgb3V0cHV0IGluCisvLyBhbnkgd2F5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0dSQVBIV1JJVEVSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0dSQVBIV1JJVEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0dyYXBoVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRE9UR3JhcGhUcmFpdHMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBET1QgeyAgLy8gUHJpdmF0ZSBmdW5jdGlvbnMuLi4KKworc3RkOjpzdHJpbmcgRXNjYXBlU3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZMYWJlbCk7CisKKy8vLyBcYnJpZWYgR2V0IGEgY29sb3Igc3RyaW5nIGZvciB0aGlzIG5vZGUgbnVtYmVyLiBTaW1wbHkgcm91bmQtcm9iaW4gc2VsZWN0cworLy8vIGZyb20gYSByZWFzb25hYmxlIG51bWJlciBvZiBjb2xvcnMuCitTdHJpbmdSZWYgZ2V0Q29sb3JTdHJpbmcodW5zaWduZWQgTm9kZU51bWJlcik7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBET1QKKworbmFtZXNwYWNlIEdyYXBoUHJvZ3JhbSB7CisKK2VudW0gTmFtZSB7CisgIERPVCwKKyAgRkRQLAorICBORUFUTywKKyAgVFdPUEksCisgIENJUkNPCit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgR3JhcGhQcm9ncmFtCisKK2Jvb2wgRGlzcGxheUdyYXBoKFN0cmluZ1JlZiBGaWxlbmFtZSwgYm9vbCB3YWl0ID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgIEdyYXBoUHJvZ3JhbTo6TmFtZSBwcm9ncmFtID0gR3JhcGhQcm9ncmFtOjpET1QpOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBHcmFwaFR5cGU+CitjbGFzcyBHcmFwaFdyaXRlciB7CisgIHJhd19vc3RyZWFtICZPOworICBjb25zdCBHcmFwaFR5cGUgJkc7CisKKyAgdXNpbmcgRE9UVHJhaXRzID0gRE9UR3JhcGhUcmFpdHM8R3JhcGhUeXBlPjsKKyAgdXNpbmcgR1RyYWl0cyA9IEdyYXBoVHJhaXRzPEdyYXBoVHlwZT47CisgIHVzaW5nIE5vZGVSZWYgPSB0eXBlbmFtZSBHVHJhaXRzOjpOb2RlUmVmOworICB1c2luZyBub2RlX2l0ZXJhdG9yID0gdHlwZW5hbWUgR1RyYWl0czo6bm9kZXNfaXRlcmF0b3I7CisgIHVzaW5nIGNoaWxkX2l0ZXJhdG9yID0gdHlwZW5hbWUgR1RyYWl0czo6Q2hpbGRJdGVyYXRvclR5cGU7CisgIERPVFRyYWl0cyBEVHJhaXRzOworCisgIHN0YXRpY19hc3NlcnQoc3RkOjppc19wb2ludGVyPE5vZGVSZWY+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAiRklYTUU6IEN1cnJlbnRseSBHcmFwaFdyaXRlciByZXF1aXJlcyB0aGUgTm9kZVJlZiB0eXBlIHRvIGJlICIKKyAgICAgICAgICAgICAgICAiYSBwb2ludGVyLlxuVGhlIHBvaW50ZXIgdXNhZ2Ugc2hvdWxkIGJlIG1vdmVkIHRvICIKKyAgICAgICAgICAgICAgICAiRE9UR3JhcGhUcmFpdHMsIGFuZCByZW1vdmVkIGZyb20gR3JhcGhXcml0ZXIgaXRzZWxmLiIpOworCisgIC8vIFdyaXRlcyB0aGUgZWRnZSBsYWJlbHMgb2YgdGhlIG5vZGUgdG8gTyBhbmQgcmV0dXJucyB0cnVlIGlmIHRoZXJlIGFyZSBhbnkKKyAgLy8gZWRnZSBsYWJlbHMgbm90IGVxdWFsIHRvIHRoZSBlbXB0eSBzdHJpbmcgIiIuCisgIGJvb2wgZ2V0RWRnZVNvdXJjZUxhYmVscyhyYXdfb3N0cmVhbSAmTywgTm9kZVJlZiBOb2RlKSB7CisgICAgY2hpbGRfaXRlcmF0b3IgRUkgPSBHVHJhaXRzOjpjaGlsZF9iZWdpbihOb2RlKTsKKyAgICBjaGlsZF9pdGVyYXRvciBFRSA9IEdUcmFpdHM6OmNoaWxkX2VuZChOb2RlKTsKKyAgICBib29sIGhhc0VkZ2VTb3VyY2VMYWJlbHMgPSBmYWxzZTsKKworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IEVJICE9IEVFICYmIGkgIT0gNjQ7ICsrRUksICsraSkgeworICAgICAgc3RkOjpzdHJpbmcgbGFiZWwgPSBEVHJhaXRzLmdldEVkZ2VTb3VyY2VMYWJlbChOb2RlLCBFSSk7CisKKyAgICAgIGlmIChsYWJlbC5lbXB0eSgpKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgaGFzRWRnZVNvdXJjZUxhYmVscyA9IHRydWU7CisKKyAgICAgIGlmIChpKQorICAgICAgICBPIDw8ICJ8IjsKKworICAgICAgTyA8PCAiPHMiIDw8IGkgPDwgIj4iIDw8IERPVDo6RXNjYXBlU3RyaW5nKGxhYmVsKTsKKyAgICB9CisKKyAgICBpZiAoRUkgIT0gRUUgJiYgaGFzRWRnZVNvdXJjZUxhYmVscykKKyAgICAgIE8gPDwgInw8czY0PnRydW5jYXRlZC4uLiI7CisKKyAgICByZXR1cm4gaGFzRWRnZVNvdXJjZUxhYmVsczsKKyAgfQorCitwdWJsaWM6CisgIEdyYXBoV3JpdGVyKHJhd19vc3RyZWFtICZvLCBjb25zdCBHcmFwaFR5cGUgJmcsIGJvb2wgU04pIDogTyhvKSwgRyhnKSB7CisgICAgRFRyYWl0cyA9IERPVFRyYWl0cyhTTik7CisgIH0KKworICB2b2lkIHdyaXRlR3JhcGgoY29uc3Qgc3RkOjpzdHJpbmcgJlRpdGxlID0gIiIpIHsKKyAgICAvLyBPdXRwdXQgdGhlIGhlYWRlciBmb3IgdGhlIGdyYXBoLi4uCisgICAgd3JpdGVIZWFkZXIoVGl0bGUpOworCisgICAgLy8gRW1pdCBhbGwgb2YgdGhlIG5vZGVzIGluIHRoZSBncmFwaC4uLgorICAgIHdyaXRlTm9kZXMoKTsKKworICAgIC8vIE91dHB1dCBhbnkgY3VzdG9taXphdGlvbnMgb24gdGhlIGdyYXBoCisgICAgRE9UR3JhcGhUcmFpdHM8R3JhcGhUeXBlPjo6YWRkQ3VzdG9tR3JhcGhGZWF0dXJlcyhHLCAqdGhpcyk7CisKKyAgICAvLyBPdXRwdXQgdGhlIGVuZCBvZiB0aGUgZ3JhcGgKKyAgICB3cml0ZUZvb3RlcigpOworICB9CisKKyAgdm9pZCB3cml0ZUhlYWRlcihjb25zdCBzdGQ6OnN0cmluZyAmVGl0bGUpIHsKKyAgICBzdGQ6OnN0cmluZyBHcmFwaE5hbWUgPSBEVHJhaXRzLmdldEdyYXBoTmFtZShHKTsKKworICAgIGlmICghVGl0bGUuZW1wdHkoKSkKKyAgICAgIE8gPDwgImRpZ3JhcGggXCIiIDw8IERPVDo6RXNjYXBlU3RyaW5nKFRpdGxlKSA8PCAiXCIge1xuIjsKKyAgICBlbHNlIGlmICghR3JhcGhOYW1lLmVtcHR5KCkpCisgICAgICBPIDw8ICJkaWdyYXBoIFwiIiA8PCBET1Q6OkVzY2FwZVN0cmluZyhHcmFwaE5hbWUpIDw8ICJcIiB7XG4iOworICAgIGVsc2UKKyAgICAgIE8gPDwgImRpZ3JhcGggdW5uYW1lZCB7XG4iOworCisgICAgaWYgKERUcmFpdHMucmVuZGVyR3JhcGhGcm9tQm90dG9tVXAoKSkKKyAgICAgIE8gPDwgIlx0cmFua2Rpcj1cIkJUXCI7XG4iOworCisgICAgaWYgKCFUaXRsZS5lbXB0eSgpKQorICAgICAgTyA8PCAiXHRsYWJlbD1cIiIgPDwgRE9UOjpFc2NhcGVTdHJpbmcoVGl0bGUpIDw8ICJcIjtcbiI7CisgICAgZWxzZSBpZiAoIUdyYXBoTmFtZS5lbXB0eSgpKQorICAgICAgTyA8PCAiXHRsYWJlbD1cIiIgPDwgRE9UOjpFc2NhcGVTdHJpbmcoR3JhcGhOYW1lKSA8PCAiXCI7XG4iOworICAgIE8gPDwgRFRyYWl0cy5nZXRHcmFwaFByb3BlcnRpZXMoRyk7CisgICAgTyA8PCAiXG4iOworICB9CisKKyAgdm9pZCB3cml0ZUZvb3RlcigpIHsKKyAgICAvLyBGaW5pc2ggb2ZmIHRoZSBncmFwaAorICAgIE8gPDwgIn1cbiI7CisgIH0KKworICB2b2lkIHdyaXRlTm9kZXMoKSB7CisgICAgLy8gTG9vcCBvdmVyIHRoZSBncmFwaCwgcHJpbnRpbmcgaXQgb3V0Li4uCisgICAgZm9yIChjb25zdCBhdXRvIE5vZGUgOiBub2RlczxHcmFwaFR5cGU+KEcpKQorICAgICAgaWYgKCFpc05vZGVIaWRkZW4oTm9kZSkpCisgICAgICAgIHdyaXRlTm9kZShOb2RlKTsKKyAgfQorCisgIGJvb2wgaXNOb2RlSGlkZGVuKE5vZGVSZWYgTm9kZSkgeworICAgIHJldHVybiBEVHJhaXRzLmlzTm9kZUhpZGRlbihOb2RlKTsKKyAgfQorCisgIHZvaWQgd3JpdGVOb2RlKE5vZGVSZWYgTm9kZSkgeworICAgIHN0ZDo6c3RyaW5nIE5vZGVBdHRyaWJ1dGVzID0gRFRyYWl0cy5nZXROb2RlQXR0cmlidXRlcyhOb2RlLCBHKTsKKworICAgIE8gPDwgIlx0Tm9kZSIgPDwgc3RhdGljX2Nhc3Q8Y29uc3Qgdm9pZCo+KE5vZGUpIDw8ICIgW3NoYXBlPXJlY29yZCwiOworICAgIGlmICghTm9kZUF0dHJpYnV0ZXMuZW1wdHkoKSkgTyA8PCBOb2RlQXR0cmlidXRlcyA8PCAiLCI7CisgICAgTyA8PCAibGFiZWw9XCJ7IjsKKworICAgIGlmICghRFRyYWl0cy5yZW5kZXJHcmFwaEZyb21Cb3R0b21VcCgpKSB7CisgICAgICBPIDw8IERPVDo6RXNjYXBlU3RyaW5nKERUcmFpdHMuZ2V0Tm9kZUxhYmVsKE5vZGUsIEcpKTsKKworICAgICAgLy8gSWYgd2Ugc2hvdWxkIGluY2x1ZGUgdGhlIGFkZHJlc3Mgb2YgdGhlIG5vZGUgaW4gdGhlIGxhYmVsLCBkbyBzbyBub3cuCisgICAgICBzdGQ6OnN0cmluZyBJZCA9IERUcmFpdHMuZ2V0Tm9kZUlkZW50aWZpZXJMYWJlbChOb2RlLCBHKTsKKyAgICAgIGlmICghSWQuZW1wdHkoKSkKKyAgICAgICAgTyA8PCAifCIgPDwgRE9UOjpFc2NhcGVTdHJpbmcoSWQpOworCisgICAgICBzdGQ6OnN0cmluZyBOb2RlRGVzYyA9IERUcmFpdHMuZ2V0Tm9kZURlc2NyaXB0aW9uKE5vZGUsIEcpOworICAgICAgaWYgKCFOb2RlRGVzYy5lbXB0eSgpKQorICAgICAgICBPIDw8ICJ8IiA8PCBET1Q6OkVzY2FwZVN0cmluZyhOb2RlRGVzYyk7CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgZWRnZVNvdXJjZUxhYmVsczsKKyAgICByYXdfc3RyaW5nX29zdHJlYW0gRWRnZVNvdXJjZUxhYmVscyhlZGdlU291cmNlTGFiZWxzKTsKKyAgICBib29sIGhhc0VkZ2VTb3VyY2VMYWJlbHMgPSBnZXRFZGdlU291cmNlTGFiZWxzKEVkZ2VTb3VyY2VMYWJlbHMsIE5vZGUpOworCisgICAgaWYgKGhhc0VkZ2VTb3VyY2VMYWJlbHMpIHsKKyAgICAgIGlmICghRFRyYWl0cy5yZW5kZXJHcmFwaEZyb21Cb3R0b21VcCgpKSBPIDw8ICJ8IjsKKworICAgICAgTyA8PCAieyIgPDwgRWRnZVNvdXJjZUxhYmVscy5zdHIoKSA8PCAifSI7CisKKyAgICAgIGlmIChEVHJhaXRzLnJlbmRlckdyYXBoRnJvbUJvdHRvbVVwKCkpIE8gPDwgInwiOworICAgIH0KKworICAgIGlmIChEVHJhaXRzLnJlbmRlckdyYXBoRnJvbUJvdHRvbVVwKCkpIHsKKyAgICAgIE8gPDwgRE9UOjpFc2NhcGVTdHJpbmcoRFRyYWl0cy5nZXROb2RlTGFiZWwoTm9kZSwgRykpOworCisgICAgICAvLyBJZiB3ZSBzaG91bGQgaW5jbHVkZSB0aGUgYWRkcmVzcyBvZiB0aGUgbm9kZSBpbiB0aGUgbGFiZWwsIGRvIHNvIG5vdy4KKyAgICAgIHN0ZDo6c3RyaW5nIElkID0gRFRyYWl0cy5nZXROb2RlSWRlbnRpZmllckxhYmVsKE5vZGUsIEcpOworICAgICAgaWYgKCFJZC5lbXB0eSgpKQorICAgICAgICBPIDw8ICJ8IiA8PCBET1Q6OkVzY2FwZVN0cmluZyhJZCk7CisKKyAgICAgIHN0ZDo6c3RyaW5nIE5vZGVEZXNjID0gRFRyYWl0cy5nZXROb2RlRGVzY3JpcHRpb24oTm9kZSwgRyk7CisgICAgICBpZiAoIU5vZGVEZXNjLmVtcHR5KCkpCisgICAgICAgIE8gPDwgInwiIDw8IERPVDo6RXNjYXBlU3RyaW5nKE5vZGVEZXNjKTsKKyAgICB9CisKKyAgICBpZiAoRFRyYWl0cy5oYXNFZGdlRGVzdExhYmVscygpKSB7CisgICAgICBPIDw8ICJ8eyI7CisKKyAgICAgIHVuc2lnbmVkIGkgPSAwLCBlID0gRFRyYWl0cy5udW1FZGdlRGVzdExhYmVscyhOb2RlKTsKKyAgICAgIGZvciAoOyBpICE9IGUgJiYgaSAhPSA2NDsgKytpKSB7CisgICAgICAgIGlmIChpKSBPIDw8ICJ8IjsKKyAgICAgICAgTyA8PCAiPGQiIDw8IGkgPDwgIj4iCisgICAgICAgICAgPDwgRE9UOjpFc2NhcGVTdHJpbmcoRFRyYWl0cy5nZXRFZGdlRGVzdExhYmVsKE5vZGUsIGkpKTsKKyAgICAgIH0KKworICAgICAgaWYgKGkgIT0gZSkKKyAgICAgICAgTyA8PCAifDxkNjQ+dHJ1bmNhdGVkLi4uIjsKKyAgICAgIE8gPDwgIn0iOworICAgIH0KKworICAgIE8gPDwgIn1cIl07XG4iOyAgIC8vIEZpbmlzaCBwcmludGluZyB0aGUgIm5vZGUiIGxpbmUKKworICAgIC8vIE91dHB1dCBhbGwgb2YgdGhlIGVkZ2VzIG5vdworICAgIGNoaWxkX2l0ZXJhdG9yIEVJID0gR1RyYWl0czo6Y2hpbGRfYmVnaW4oTm9kZSk7CisgICAgY2hpbGRfaXRlcmF0b3IgRUUgPSBHVHJhaXRzOjpjaGlsZF9lbmQoTm9kZSk7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgRUkgIT0gRUUgJiYgaSAhPSA2NDsgKytFSSwgKytpKQorICAgICAgaWYgKCFEVHJhaXRzLmlzTm9kZUhpZGRlbigqRUkpKQorICAgICAgICB3cml0ZUVkZ2UoTm9kZSwgaSwgRUkpOworICAgIGZvciAoOyBFSSAhPSBFRTsgKytFSSkKKyAgICAgIGlmICghRFRyYWl0cy5pc05vZGVIaWRkZW4oKkVJKSkKKyAgICAgICAgd3JpdGVFZGdlKE5vZGUsIDY0LCBFSSk7CisgIH0KKworICB2b2lkIHdyaXRlRWRnZShOb2RlUmVmIE5vZGUsIHVuc2lnbmVkIGVkZ2VpZHgsIGNoaWxkX2l0ZXJhdG9yIEVJKSB7CisgICAgaWYgKE5vZGVSZWYgVGFyZ2V0Tm9kZSA9ICpFSSkgeworICAgICAgaW50IERlc3RQb3J0ID0gLTE7CisgICAgICBpZiAoRFRyYWl0cy5lZGdlVGFyZ2V0c0VkZ2VTb3VyY2UoTm9kZSwgRUkpKSB7CisgICAgICAgIGNoaWxkX2l0ZXJhdG9yIFRhcmdldEl0ID0gRFRyYWl0cy5nZXRFZGdlVGFyZ2V0KE5vZGUsIEVJKTsKKworICAgICAgICAvLyBGaWd1cmUgb3V0IHdoaWNoIGVkZ2UgdGhpcyB0YXJnZXRzLi4uCisgICAgICAgIHVuc2lnbmVkIE9mZnNldCA9CisgICAgICAgICAgKHVuc2lnbmVkKXN0ZDo6ZGlzdGFuY2UoR1RyYWl0czo6Y2hpbGRfYmVnaW4oVGFyZ2V0Tm9kZSksIFRhcmdldEl0KTsKKyAgICAgICAgRGVzdFBvcnQgPSBzdGF0aWNfY2FzdDxpbnQ+KE9mZnNldCk7CisgICAgICB9CisKKyAgICAgIGlmIChEVHJhaXRzLmdldEVkZ2VTb3VyY2VMYWJlbChOb2RlLCBFSSkuZW1wdHkoKSkKKyAgICAgICAgZWRnZWlkeCA9IC0xOworCisgICAgICBlbWl0RWRnZShzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4oTm9kZSksIGVkZ2VpZHgsCisgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCB2b2lkKj4oVGFyZ2V0Tm9kZSksIERlc3RQb3J0LAorICAgICAgICAgICAgICAgRFRyYWl0cy5nZXRFZGdlQXR0cmlidXRlcyhOb2RlLCBFSSwgRykpOworICAgIH0KKyAgfQorCisgIC8vLyBlbWl0U2ltcGxlTm9kZSAtIE91dHB1dHMgYSBzaW1wbGUgKG5vbi1yZWNvcmQpIG5vZGUKKyAgdm9pZCBlbWl0U2ltcGxlTm9kZShjb25zdCB2b2lkICpJRCwgY29uc3Qgc3RkOjpzdHJpbmcgJkF0dHIsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkxhYmVsLCB1bnNpZ25lZCBOdW1FZGdlU291cmNlcyA9IDAsCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICpFZGdlU291cmNlTGFiZWxzID0gbnVsbHB0cikgeworICAgIE8gPDwgIlx0Tm9kZSIgPDwgSUQgPDwgIlsgIjsKKyAgICBpZiAoIUF0dHIuZW1wdHkoKSkKKyAgICAgIE8gPDwgQXR0ciA8PCAiLCI7CisgICAgTyA8PCAiIGxhYmVsID1cIiI7CisgICAgaWYgKE51bUVkZ2VTb3VyY2VzKSBPIDw8ICJ7IjsKKyAgICBPIDw8IERPVDo6RXNjYXBlU3RyaW5nKExhYmVsKTsKKyAgICBpZiAoTnVtRWRnZVNvdXJjZXMpIHsKKyAgICAgIE8gPDwgInx7IjsKKworICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBOdW1FZGdlU291cmNlczsgKytpKSB7CisgICAgICAgIGlmIChpKSBPIDw8ICJ8IjsKKyAgICAgICAgTyA8PCAiPHMiIDw8IGkgPDwgIj4iOworICAgICAgICBpZiAoRWRnZVNvdXJjZUxhYmVscykgTyA8PCBET1Q6OkVzY2FwZVN0cmluZygoKkVkZ2VTb3VyY2VMYWJlbHMpW2ldKTsKKyAgICAgIH0KKyAgICAgIE8gPDwgIn19IjsKKyAgICB9CisgICAgTyA8PCAiXCJdO1xuIjsKKyAgfQorCisgIC8vLyBlbWl0RWRnZSAtIE91dHB1dCBhbiBlZGdlIGZyb20gYSBzaW1wbGUgbm9kZSBpbnRvIHRoZSBncmFwaC4uLgorICB2b2lkIGVtaXRFZGdlKGNvbnN0IHZvaWQgKlNyY05vZGVJRCwgaW50IFNyY05vZGVQb3J0LAorICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKkRlc3ROb2RlSUQsIGludCBEZXN0Tm9kZVBvcnQsCisgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcgJkF0dHJzKSB7CisgICAgaWYgKFNyY05vZGVQb3J0ICA+IDY0KSByZXR1cm47ICAgICAgICAgICAgIC8vIEVtaW5hdGluZyBmcm9tIHRydW5jYXRlZCBwYXJ0PworICAgIGlmIChEZXN0Tm9kZVBvcnQgPiA2NCkgRGVzdE5vZGVQb3J0ID0gNjQ7ICAvLyBUYXJnZXRpbmcgdGhlIHRydW5jYXRlZCBwYXJ0PworCisgICAgTyA8PCAiXHROb2RlIiA8PCBTcmNOb2RlSUQ7CisgICAgaWYgKFNyY05vZGVQb3J0ID49IDApCisgICAgICBPIDw8ICI6cyIgPDwgU3JjTm9kZVBvcnQ7CisgICAgTyA8PCAiIC0+IE5vZGUiIDw8IERlc3ROb2RlSUQ7CisgICAgaWYgKERlc3ROb2RlUG9ydCA+PSAwICYmIERUcmFpdHMuaGFzRWRnZURlc3RMYWJlbHMoKSkKKyAgICAgIE8gPDwgIjpkIiA8PCBEZXN0Tm9kZVBvcnQ7CisKKyAgICBpZiAoIUF0dHJzLmVtcHR5KCkpCisgICAgICBPIDw8ICJbIiA8PCBBdHRycyA8PCAiXSI7CisgICAgTyA8PCAiO1xuIjsKKyAgfQorCisgIC8vLyBnZXRPU3RyZWFtIC0gR2V0IHRoZSByYXcgb3V0cHV0IHN0cmVhbSBpbnRvIHRoZSBncmFwaCBmaWxlLiBVc2VmdWwgdG8KKyAgLy8vIHdyaXRlIGZhbmN5IHRoaW5ncyB1c2luZyBhZGRDdXN0b21HcmFwaEZlYXR1cmVzKCkuCisgIHJhd19vc3RyZWFtICZnZXRPU3RyZWFtKCkgeworICAgIHJldHVybiBPOworICB9Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBHcmFwaFR5cGU+CityYXdfb3N0cmVhbSAmV3JpdGVHcmFwaChyYXdfb3N0cmVhbSAmTywgY29uc3QgR3JhcGhUeXBlICZHLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG9ydE5hbWVzID0gZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmVGl0bGUgPSAiIikgeworICAvLyBTdGFydCB0aGUgZ3JhcGggZW1pc3Npb24gcHJvY2Vzcy4uLgorICBHcmFwaFdyaXRlcjxHcmFwaFR5cGU+IFcoTywgRywgU2hvcnROYW1lcyk7CisKKyAgLy8gRW1pdCB0aGUgZ3JhcGguCisgIFcud3JpdGVHcmFwaChUaXRsZS5zdHIoKSk7CisKKyAgcmV0dXJuIE87Cit9CisKK3N0ZDo6c3RyaW5nIGNyZWF0ZUdyYXBoRmlsZW5hbWUoY29uc3QgVHdpbmUgJk5hbWUsIGludCAmRkQpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgR3JhcGhUeXBlPgorc3RkOjpzdHJpbmcgV3JpdGVHcmFwaChjb25zdCBHcmFwaFR5cGUgJkcsIGNvbnN0IFR3aW5lICZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3J0TmFtZXMgPSBmYWxzZSwgY29uc3QgVHdpbmUgJlRpdGxlID0gIiIpIHsKKyAgaW50IEZEOworICAvLyBXaW5kb3dzIGNhbid0IGFsd2F5cyBoYW5kbGUgbG9uZyBwYXRocywgc28gbGltaXQgdGhlIGxlbmd0aCBvZiB0aGUgbmFtZS4KKyAgc3RkOjpzdHJpbmcgTiA9IE5hbWUuc3RyKCk7CisgIE4gPSBOLnN1YnN0cigwLCBzdGQ6Om1pbjxzdGQ6OnNpemVfdD4oTi5zaXplKCksIDE0MCkpOworICBzdGQ6OnN0cmluZyBGaWxlbmFtZSA9IGNyZWF0ZUdyYXBoRmlsZW5hbWUoTiwgRkQpOworICByYXdfZmRfb3N0cmVhbSBPKEZELCAvKnNob3VsZENsb3NlPSovIHRydWUpOworCisgIGlmIChGRCA9PSAtMSkgeworICAgIGVycnMoKSA8PCAiZXJyb3Igb3BlbmluZyBmaWxlICciIDw8IEZpbGVuYW1lIDw8ICInIGZvciB3cml0aW5nIVxuIjsKKyAgICByZXR1cm4gIiI7CisgIH0KKworICBsbHZtOjpXcml0ZUdyYXBoKE8sIEcsIFNob3J0TmFtZXMsIFRpdGxlKTsKKyAgZXJycygpIDw8ICIgZG9uZS4gXG4iOworCisgIHJldHVybiBGaWxlbmFtZTsKK30KKworLy8vIFZpZXdHcmFwaCAtIEVtaXQgYSBkb3QgZ3JhcGgsIHJ1biAnZG90JywgcnVuIGd2IG9uIHRoZSBwb3N0c2NyaXB0IGZpbGUsCisvLy8gdGhlbiBjbGVhbnVwLiAgRm9yIHVzZSBmcm9tIHRoZSBkZWJ1Z2dlci4KKy8vLwordGVtcGxhdGU8dHlwZW5hbWUgR3JhcGhUeXBlPgordm9pZCBWaWV3R3JhcGgoY29uc3QgR3JhcGhUeXBlICZHLCBjb25zdCBUd2luZSAmTmFtZSwKKyAgICAgICAgICAgICAgIGJvb2wgU2hvcnROYW1lcyA9IGZhbHNlLCBjb25zdCBUd2luZSAmVGl0bGUgPSAiIiwKKyAgICAgICAgICAgICAgIEdyYXBoUHJvZ3JhbTo6TmFtZSBQcm9ncmFtID0gR3JhcGhQcm9ncmFtOjpET1QpIHsKKyAgc3RkOjpzdHJpbmcgRmlsZW5hbWUgPSBsbHZtOjpXcml0ZUdyYXBoKEcsIE5hbWUsIFNob3J0TmFtZXMsIFRpdGxlKTsKKworICBpZiAoRmlsZW5hbWUuZW1wdHkoKSkKKyAgICByZXR1cm47CisKKyAgRGlzcGxheUdyYXBoKEZpbGVuYW1lLCBmYWxzZSwgUHJvZ3JhbSk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfR1JBUEhXUklURVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0hvc3QuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Ib3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGRjNWZhNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Ib3N0LmgKQEAgLTAsMCArMSw5OSBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9Ib3N0LmggLSBIb3N0IG1hY2hpbmUgY2hhcmFjdGVyaXN0aWNzIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTWV0aG9kcyBmb3IgcXVlcnlpbmcgdGhlIG5hdHVyZSBvZiB0aGUgaG9zdCBtYWNoaW5lLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0hPU1RfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfSE9TVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKworI2lmIGRlZmluZWQoX19saW51eF9fKSB8fCBkZWZpbmVkKF9fR05VX18pIHx8IGRlZmluZWQoX19IQUlLVV9fKQorI2luY2x1ZGUgPGVuZGlhbi5oPgorI2VsaWYgZGVmaW5lZChfQUlYKQorI2luY2x1ZGUgPHN5cy9tYWNoaW5lLmg+CisjZWxpZiBkZWZpbmVkKF9fc3VuKQorLyogU29sYXJpcyBwcm92aWRlcyBfQklHX0VORElBTi9fTElUVExFX0VORElBTiBzZWxlY3RvciBpbiBzeXMvdHlwZXMuaCAqLworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2RlZmluZSBCSUdfRU5ESUFOIDQzMjEKKyNkZWZpbmUgTElUVExFX0VORElBTiAxMjM0CisjaWYgZGVmaW5lZChfQklHX0VORElBTikKKyNkZWZpbmUgQllURV9PUkRFUiBCSUdfRU5ESUFOCisjZWxzZQorI2RlZmluZSBCWVRFX09SREVSIExJVFRMRV9FTkRJQU4KKyNlbmRpZgorI2Vsc2UKKyNpZiAhZGVmaW5lZChCWVRFX09SREVSKSAmJiAhZGVmaW5lZChMTFZNX09OX1dJTjMyKQorI2luY2x1ZGUgPG1hY2hpbmUvZW5kaWFuLmg+CisjZW5kaWYKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugc3lzIHsKKworI2lmIGRlZmluZWQoQllURV9PUkRFUikgJiYgZGVmaW5lZChCSUdfRU5ESUFOKSAmJiBCWVRFX09SREVSID09IEJJR19FTkRJQU4KK2NvbnN0ZXhwciBib29sIElzQmlnRW5kaWFuSG9zdCA9IHRydWU7CisjZWxzZQorY29uc3RleHByIGJvb2wgSXNCaWdFbmRpYW5Ib3N0ID0gZmFsc2U7CisjZW5kaWYKKworICBzdGF0aWMgY29uc3QgYm9vbCBJc0xpdHRsZUVuZGlhbkhvc3QgPSAhSXNCaWdFbmRpYW5Ib3N0OworCisgIC8vLyBnZXREZWZhdWx0VGFyZ2V0VHJpcGxlKCkgLSBSZXR1cm4gdGhlIGRlZmF1bHQgdGFyZ2V0IHRyaXBsZSB0aGUgY29tcGlsZXIKKyAgLy8vIGhhcyBiZWVuIGNvbmZpZ3VyZWQgdG8gcHJvZHVjZSBjb2RlIGZvci4KKyAgLy8vCisgIC8vLyBUaGUgdGFyZ2V0IHRyaXBsZSBpcyBhIHN0cmluZyBpbiB0aGUgZm9ybWF0IG9mOgorICAvLy8gICBDUFVfVFlQRS1WRU5ET1ItT1BFUkFUSU5HX1NZU1RFTQorICAvLy8gb3IKKyAgLy8vICAgQ1BVX1RZUEUtVkVORE9SLUtFUk5FTC1PUEVSQVRJTkdfU1lTVEVNCisgIHN0ZDo6c3RyaW5nIGdldERlZmF1bHRUYXJnZXRUcmlwbGUoKTsKKworICAvLy8gZ2V0UHJvY2Vzc1RyaXBsZSgpIC0gUmV0dXJuIGFuIGFwcHJvcHJpYXRlIHRhcmdldCB0cmlwbGUgZm9yIGdlbmVyYXRpbmcKKyAgLy8vIGNvZGUgdG8gYmUgbG9hZGVkIGludG8gdGhlIGN1cnJlbnQgcHJvY2VzcywgZS5nLiB3aGVuIHVzaW5nIHRoZSBKSVQuCisgIHN0ZDo6c3RyaW5nIGdldFByb2Nlc3NUcmlwbGUoKTsKKworICAvLy8gZ2V0SG9zdENQVU5hbWUgLSBHZXQgdGhlIExMVk0gbmFtZSBmb3IgdGhlIGhvc3QgQ1BVLiBUaGUgcGFydGljdWxhciBmb3JtYXQKKyAgLy8vIG9mIHRoZSBuYW1lIGlzIHRhcmdldCBkZXBlbmRlbnQsIGFuZCBzdWl0YWJsZSBmb3IgcGFzc2luZyBhcyAtbWNwdSB0byB0aGUKKyAgLy8vIHRhcmdldCB3aGljaCBtYXRjaGVzIHRoZSBob3N0LgorICAvLy8KKyAgLy8vIFxyZXR1cm4gLSBUaGUgaG9zdCBDUFUgbmFtZSwgb3IgZW1wdHkgaWYgdGhlIENQVSBjb3VsZCBub3QgYmUgZGV0ZXJtaW5lZC4KKyAgU3RyaW5nUmVmIGdldEhvc3RDUFVOYW1lKCk7CisKKyAgLy8vIGdldEhvc3RDUFVGZWF0dXJlcyAtIEdldCB0aGUgTExWTSBuYW1lcyBmb3IgdGhlIGhvc3QgQ1BVIGZlYXR1cmVzLgorICAvLy8gVGhlIHBhcnRpY3VsYXIgZm9ybWF0IG9mIHRoZSBuYW1lcyBhcmUgdGFyZ2V0IGRlcGVuZGVudCwgYW5kIHN1aXRhYmxlIGZvcgorICAvLy8gcGFzc2luZyBhcyAtbWF0dHIgdG8gdGhlIHRhcmdldCB3aGljaCBtYXRjaGVzIHRoZSBob3N0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBGZWF0dXJlcyAtIEEgc3RyaW5nIG1hcHBpbmcgZmVhdHVyZSBuYW1lcyB0byBlaXRoZXIKKyAgLy8vIHRydWUgKGlmIGVuYWJsZWQpIG9yIGZhbHNlIChpZiBkaXNhYmxlZCkuIFRoaXMgcm91dGluZSBtYWtlcyBubyBndWFyYW50ZWVzCisgIC8vLyBhYm91dCBleGFjdGx5IHdoaWNoIGZlYXR1cmVzIG1heSBhcHBlYXIgaW4gdGhpcyBtYXAsIGV4Y2VwdCB0aGF0IHRoZXkgYXJlCisgIC8vLyBhbGwgdmFsaWQgTExWTSBmZWF0dXJlIG5hbWVzLgorICAvLy8KKyAgLy8vIFxyZXR1cm4gLSBUcnVlIG9uIHN1Y2Nlc3MuCisgIGJvb2wgZ2V0SG9zdENQVUZlYXR1cmVzKFN0cmluZ01hcDxib29sPiAmRmVhdHVyZXMpOworCisgIC8vLyBHZXQgdGhlIG51bWJlciBvZiBwaHlzaWNhbCBjb3JlcyAoYXMgb3Bwb3NlZCB0byBsb2dpY2FsIGNvcmVzIHJldHVybmVkCisgIC8vLyBmcm9tIHRocmVhZDo6aGFyZHdhcmVfY29uY3VycmVuY3koKSwgd2hpY2ggaW5jbHVkZXMgaHlwZXJ0aHJlYWRzKS4KKyAgLy8vIFJldHVybnMgLTEgaWYgdW5rbm93biBmb3IgdGhlIGN1cnJlbnQgaG9zdCBzeXN0ZW0uCisgIGludCBnZXRIb3N0TnVtUGh5c2ljYWxDb3JlcygpOworCisgIG5hbWVzcGFjZSBkZXRhaWwgeworICAvLy8gSGVscGVyIGZ1bmN0aW9ucyB0byBleHRyYWN0IEhvc3RDUFVOYW1lIGZyb20gL3Byb2MvY3B1aW5mbyBvbiBsaW51eC4KKyAgU3RyaW5nUmVmIGdldEhvc3RDUFVOYW1lRm9yUG93ZXJQQyhTdHJpbmdSZWYgUHJvY0NwdWluZm9Db250ZW50KTsKKyAgU3RyaW5nUmVmIGdldEhvc3RDUFVOYW1lRm9yQVJNKFN0cmluZ1JlZiBQcm9jQ3B1aW5mb0NvbnRlbnQpOworICBTdHJpbmdSZWYgZ2V0SG9zdENQVU5hbWVGb3JTMzkweChTdHJpbmdSZWYgUHJvY0NwdWluZm9Db250ZW50KTsKKyAgU3RyaW5nUmVmIGdldEhvc3RDUFVOYW1lRm9yQlBGKCk7CisgIH0KK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvSmFtQ1JDLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvSmFtQ1JDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI2OGJiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9KYW1DUkMuaApAQCAtMCwwICsxLDQ5IEBACisvLz09PS0tIGxsdm0vU3VwcG9ydC9KYW1DUkMuaCAtIEN5Y2xpYyBSZWR1bmRhbmN5IENoZWNrIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiBKYW1DUkMuCisvLworLy8gV2Ugd2lsbCB1c2UgdGhlICJSb2Nrc29mdF50bSBNb2RlbCBDUkMgQWxnb3JpdGhtIiB0byBkZXNjcmliZSB0aGUgcHJvcGVydGllcworLy8gb2YgdGhpcyBDUkM6CisvLyAgIFdpZHRoICA6IDMyCisvLyAgIFBvbHkgICA6IDA0QzExREI3CisvLyAgIEluaXQgICA6IEZGRkZGRkZGCisvLyAgIFJlZkluICA6IFRydWUKKy8vICAgUmVmT3V0IDogVHJ1ZQorLy8gICBYb3JPdXQgOiAwMDAwMDAwMAorLy8gICBDaGVjayAgOiAzNDBCQzZEOSAocmVzdWx0IG9mIENSQyBmb3IgIjEyMzQ1Njc4OSIpCisvLworLy8gTi5CLiAgV2UgcGVybWl0IGZsZXhpYmlsaXR5IG9mIHRoZSAiSW5pdCIgdmFsdWUuICBTb21lIGNvbnN1bWVycyBvZiB0aGlzIG5lZWQKKy8vICAgICAgIGl0IHRvIGJlIHplcm8uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfSkFNQ1JDX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX0pBTUNSQ19ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheVJlZjsKKworY2xhc3MgSmFtQ1JDIHsKK3B1YmxpYzoKKyAgSmFtQ1JDKHVpbnQzMl90IEluaXQgPSAweEZGRkZGRkZGVSkgOiBDUkMoSW5pdCkge30KKworICAvLyBcYnJpZWYgVXBkYXRlIHRoZSBDUkMgY2FsY3VsYXRpb24gd2l0aCBEYXRhLgorICB2b2lkIHVwZGF0ZShBcnJheVJlZjxjaGFyPiBEYXRhKTsKKworICB1aW50MzJfdCBnZXRDUkMoKSBjb25zdCB7IHJldHVybiBDUkM7IH0KKworcHJpdmF0ZToKKyAgdWludDMyX3QgQ1JDOworfTsKK30gLy8gRW5kIG9mIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0tub3duQml0cy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0tub3duQml0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3ZTczYjEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvS25vd25CaXRzLmgKQEAgLTAsMCArMSwyMDIgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvS25vd25CaXRzLmggLSBTdG9yZXMga25vd24gemVyb3Mvb25lcyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGEgY2xhc3MgZm9yIHJlcHJlc2VudGluZyBrbm93biB6ZXJvcyBhbmQgb25lcyB1c2VkIGJ5CisvLyBjb21wdXRlS25vd25CaXRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0tOT1dOQklUU19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9LTk9XTkJJVFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQVBJbnQuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLyBTdHJ1Y3QgZm9yIHRyYWNraW5nIHRoZSBrbm93biB6ZXJvcyBhbmQgb25lcyBvZiBhIHZhbHVlLgorc3RydWN0IEtub3duQml0cyB7CisgIEFQSW50IFplcm87CisgIEFQSW50IE9uZTsKKworcHJpdmF0ZToKKyAgLy8gSW50ZXJuYWwgY29uc3RydWN0b3IgZm9yIGNyZWF0aW5nIGEgS25vd25CaXRzIGZyb20gdHdvIEFQSW50cy4KKyAgS25vd25CaXRzKEFQSW50IFplcm8sIEFQSW50IE9uZSkKKyAgICAgIDogWmVybyhzdGQ6Om1vdmUoWmVybykpLCBPbmUoc3RkOjptb3ZlKE9uZSkpIHt9CisKK3B1YmxpYzoKKyAgLy8gRGVmYXVsdCBjb25zdHJ1Y3QgWmVybyBhbmQgT25lLgorICBLbm93bkJpdHMoKSB7fQorCisgIC8vLyBDcmVhdGUgYSBrbm93biBiaXRzIG9iamVjdCBvZiBCaXRXaWR0aCBiaXRzIGluaXRpYWxpemVkIHRvIHVua25vd24uCisgIEtub3duQml0cyh1bnNpZ25lZCBCaXRXaWR0aCkgOiBaZXJvKEJpdFdpZHRoLCAwKSwgT25lKEJpdFdpZHRoLCAwKSB7fQorCisgIC8vLyBHZXQgdGhlIGJpdCB3aWR0aCBvZiB0aGlzIHZhbHVlLgorICB1bnNpZ25lZCBnZXRCaXRXaWR0aCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoWmVyby5nZXRCaXRXaWR0aCgpID09IE9uZS5nZXRCaXRXaWR0aCgpICYmCisgICAgICAgICAgICJaZXJvIGFuZCBPbmUgc2hvdWxkIGhhdmUgdGhlIHNhbWUgd2lkdGghIik7CisgICAgcmV0dXJuIFplcm8uZ2V0Qml0V2lkdGgoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlcmUgaXMgY29uZmxpY3RpbmcgaW5mb3JtYXRpb24uCisgIGJvb2wgaGFzQ29uZmxpY3QoKSBjb25zdCB7IHJldHVybiBaZXJvLmludGVyc2VjdHMoT25lKTsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgd2Uga25vdyB0aGUgdmFsdWUgb2YgYWxsIGJpdHMuCisgIGJvb2wgaXNDb25zdGFudCgpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWhhc0NvbmZsaWN0KCkgJiYgIktub3duQml0cyBjb25mbGljdCEiKTsKKyAgICByZXR1cm4gWmVyby5jb3VudFBvcHVsYXRpb24oKSArIE9uZS5jb3VudFBvcHVsYXRpb24oKSA9PSBnZXRCaXRXaWR0aCgpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHZhbHVlIHdoZW4gYWxsIGJpdHMgaGF2ZSBhIGtub3duIHZhbHVlLiBUaGlzIGp1c3QgcmV0dXJucyBPbmUKKyAgLy8vIHdpdGggYSBwcm90ZWN0aXZlIGFzc2VydGlvbi4KKyAgY29uc3QgQVBJbnQgJmdldENvbnN0YW50KCkgY29uc3QgeworICAgIGFzc2VydChpc0NvbnN0YW50KCkgJiYgIkNhbiBvbmx5IGdldCB2YWx1ZSB3aGVuIGFsbCBiaXRzIGFyZSBrbm93biIpOworICAgIHJldHVybiBPbmU7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHdlIGRvbid0IGtub3cgYW55IGJpdHMuCisgIGJvb2wgaXNVbmtub3duKCkgY29uc3QgeyByZXR1cm4gWmVyby5pc051bGxWYWx1ZSgpICYmIE9uZS5pc051bGxWYWx1ZSgpOyB9CisKKyAgLy8vIFJlc2V0cyB0aGUga25vd24gc3RhdGUgb2YgYWxsIGJpdHMuCisgIHZvaWQgcmVzZXRBbGwoKSB7CisgICAgWmVyby5jbGVhckFsbEJpdHMoKTsKKyAgICBPbmUuY2xlYXJBbGxCaXRzKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHZhbHVlIGlzIGFsbCB6ZXJvLgorICBib29sIGlzWmVybygpIGNvbnN0IHsKKyAgICBhc3NlcnQoIWhhc0NvbmZsaWN0KCkgJiYgIktub3duQml0cyBjb25mbGljdCEiKTsKKyAgICByZXR1cm4gWmVyby5pc0FsbE9uZXNWYWx1ZSgpOworICB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB2YWx1ZSBpcyBhbGwgb25lIGJpdHMuCisgIGJvb2wgaXNBbGxPbmVzKCkgY29uc3QgeworICAgIGFzc2VydCghaGFzQ29uZmxpY3QoKSAmJiAiS25vd25CaXRzIGNvbmZsaWN0ISIpOworICAgIHJldHVybiBPbmUuaXNBbGxPbmVzVmFsdWUoKTsKKyAgfQorCisgIC8vLyBNYWtlIGFsbCBiaXRzIGtub3duIHRvIGJlIHplcm8gYW5kIGRpc2NhcmQgYW55IHByZXZpb3VzIGluZm9ybWF0aW9uLgorICB2b2lkIHNldEFsbFplcm8oKSB7CisgICAgWmVyby5zZXRBbGxCaXRzKCk7CisgICAgT25lLmNsZWFyQWxsQml0cygpOworICB9CisKKyAgLy8vIE1ha2UgYWxsIGJpdHMga25vd24gdG8gYmUgb25lIGFuZCBkaXNjYXJkIGFueSBwcmV2aW91cyBpbmZvcm1hdGlvbi4KKyAgdm9pZCBzZXRBbGxPbmVzKCkgeworICAgIFplcm8uY2xlYXJBbGxCaXRzKCk7CisgICAgT25lLnNldEFsbEJpdHMoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhpcyB2YWx1ZSBpcyBrbm93biB0byBiZSBuZWdhdGl2ZS4KKyAgYm9vbCBpc05lZ2F0aXZlKCkgY29uc3QgeyByZXR1cm4gT25lLmlzU2lnbkJpdFNldCgpOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHZhbHVlIGlzIGtub3duIHRvIGJlIG5vbi1uZWdhdGl2ZS4KKyAgYm9vbCBpc05vbk5lZ2F0aXZlKCkgY29uc3QgeyByZXR1cm4gWmVyby5pc1NpZ25CaXRTZXQoKTsgfQorCisgIC8vLyBNYWtlIHRoaXMgdmFsdWUgbmVnYXRpdmUuCisgIHZvaWQgbWFrZU5lZ2F0aXZlKCkgeworICAgIE9uZS5zZXRTaWduQml0KCk7CisgIH0KKworICAvLy8gTWFrZSB0aGlzIHZhbHVlIG5lZ2F0aXZlLgorICB2b2lkIG1ha2VOb25OZWdhdGl2ZSgpIHsKKyAgICBaZXJvLnNldFNpZ25CaXQoKTsKKyAgfQorCisgIC8vLyBUcnVuY2F0ZSB0aGUgdW5kZXJseWluZyBrbm93biBaZXJvIGFuZCBPbmUgYml0cy4gVGhpcyBpcyBlcXVpdmFsZW50CisgIC8vLyB0byB0cnVuY2F0aW5nIHRoZSB2YWx1ZSB3ZSdyZSB0cmFja2luZy4KKyAgS25vd25CaXRzIHRydW5jKHVuc2lnbmVkIEJpdFdpZHRoKSB7CisgICAgcmV0dXJuIEtub3duQml0cyhaZXJvLnRydW5jKEJpdFdpZHRoKSwgT25lLnRydW5jKEJpdFdpZHRoKSk7CisgIH0KKworICAvLy8gWmVybyBleHRlbmRzIHRoZSB1bmRlcmx5aW5nIGtub3duIFplcm8gYW5kIE9uZSBiaXRzLiBUaGlzIGlzIGVxdWl2YWxlbnQKKyAgLy8vIHRvIHplcm8gZXh0ZW5kaW5nIHRoZSB2YWx1ZSB3ZSdyZSB0cmFja2luZy4KKyAgS25vd25CaXRzIHpleHQodW5zaWduZWQgQml0V2lkdGgpIHsKKyAgICByZXR1cm4gS25vd25CaXRzKFplcm8uemV4dChCaXRXaWR0aCksIE9uZS56ZXh0KEJpdFdpZHRoKSk7CisgIH0KKworICAvLy8gU2lnbiBleHRlbmRzIHRoZSB1bmRlcmx5aW5nIGtub3duIFplcm8gYW5kIE9uZSBiaXRzLiBUaGlzIGlzIGVxdWl2YWxlbnQKKyAgLy8vIHRvIHNpZ24gZXh0ZW5kaW5nIHRoZSB2YWx1ZSB3ZSdyZSB0cmFja2luZy4KKyAgS25vd25CaXRzIHNleHQodW5zaWduZWQgQml0V2lkdGgpIHsKKyAgICByZXR1cm4gS25vd25CaXRzKFplcm8uc2V4dChCaXRXaWR0aCksIE9uZS5zZXh0KEJpdFdpZHRoKSk7CisgIH0KKworICAvLy8gWmVybyBleHRlbmRzIG9yIHRydW5jYXRlcyB0aGUgdW5kZXJseWluZyBrbm93biBaZXJvIGFuZCBPbmUgYml0cy4gVGhpcyBpcworICAvLy8gZXF1aXZhbGVudCB0byB6ZXJvIGV4dGVuZGluZyBvciB0cnVuY2F0aW5nIHRoZSB2YWx1ZSB3ZSdyZSB0cmFja2luZy4KKyAgS25vd25CaXRzIHpleHRPclRydW5jKHVuc2lnbmVkIEJpdFdpZHRoKSB7CisgICAgcmV0dXJuIEtub3duQml0cyhaZXJvLnpleHRPclRydW5jKEJpdFdpZHRoKSwgT25lLnpleHRPclRydW5jKEJpdFdpZHRoKSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbWluaW11bSBudW1iZXIgb2YgdHJhaWxpbmcgemVybyBiaXRzLgorICB1bnNpZ25lZCBjb3VudE1pblRyYWlsaW5nWmVyb3MoKSBjb25zdCB7CisgICAgcmV0dXJuIFplcm8uY291bnRUcmFpbGluZ09uZXMoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBtaW5pbXVtIG51bWJlciBvZiB0cmFpbGluZyBvbmUgYml0cy4KKyAgdW5zaWduZWQgY291bnRNaW5UcmFpbGluZ09uZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIE9uZS5jb3VudFRyYWlsaW5nT25lcygpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIG1pbmltdW0gbnVtYmVyIG9mIGxlYWRpbmcgemVybyBiaXRzLgorICB1bnNpZ25lZCBjb3VudE1pbkxlYWRpbmdaZXJvcygpIGNvbnN0IHsKKyAgICByZXR1cm4gWmVyby5jb3VudExlYWRpbmdPbmVzKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbWluaW11bSBudW1iZXIgb2YgbGVhZGluZyBvbmUgYml0cy4KKyAgdW5zaWduZWQgY291bnRNaW5MZWFkaW5nT25lcygpIGNvbnN0IHsKKyAgICByZXR1cm4gT25lLmNvdW50TGVhZGluZ09uZXMoKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIHNpZ24gYml0IGlzIHJlcGxpY2F0ZWQgaW50byB0aGUgb3RoZXIKKyAgLy8vIGJpdHMuCisgIHVuc2lnbmVkIGNvdW50TWluU2lnbkJpdHMoKSBjb25zdCB7CisgICAgaWYgKGlzTm9uTmVnYXRpdmUoKSkKKyAgICAgIHJldHVybiBjb3VudE1pbkxlYWRpbmdaZXJvcygpOworICAgIGlmIChpc05lZ2F0aXZlKCkpCisgICAgICByZXR1cm4gY291bnRNaW5MZWFkaW5nT25lcygpOworICAgIHJldHVybiAwOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRyYWlsaW5nIHplcm8gYml0cyBwb3NzaWJsZS4KKyAgdW5zaWduZWQgY291bnRNYXhUcmFpbGluZ1plcm9zKCkgY29uc3QgeworICAgIHJldHVybiBPbmUuY291bnRUcmFpbGluZ1plcm9zKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgdHJhaWxpbmcgb25lIGJpdHMgcG9zc2libGUuCisgIHVuc2lnbmVkIGNvdW50TWF4VHJhaWxpbmdPbmVzKCkgY29uc3QgeworICAgIHJldHVybiBaZXJvLmNvdW50VHJhaWxpbmdaZXJvcygpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxlYWRpbmcgemVybyBiaXRzIHBvc3NpYmxlLgorICB1bnNpZ25lZCBjb3VudE1heExlYWRpbmdaZXJvcygpIGNvbnN0IHsKKyAgICByZXR1cm4gT25lLmNvdW50TGVhZGluZ1plcm9zKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgbGVhZGluZyBvbmUgYml0cyBwb3NzaWJsZS4KKyAgdW5zaWduZWQgY291bnRNYXhMZWFkaW5nT25lcygpIGNvbnN0IHsKKyAgICByZXR1cm4gWmVyby5jb3VudExlYWRpbmdaZXJvcygpOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBiaXRzIGtub3duIHRvIGJlIG9uZS4KKyAgdW5zaWduZWQgY291bnRNaW5Qb3B1bGF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBPbmUuY291bnRQb3B1bGF0aW9uKCk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYml0cyB0aGF0IGNvdWxkIGJlIG9uZS4KKyAgdW5zaWduZWQgY291bnRNYXhQb3B1bGF0aW9uKCkgY29uc3QgeworICAgIHJldHVybiBnZXRCaXRXaWR0aCgpIC0gWmVyby5jb3VudFBvcHVsYXRpb24oKTsKKyAgfQorCisgIC8vLyBDb21wdXRlIGtub3duIGJpdHMgcmVzdWx0aW5nIGZyb20gYWRkaW5nIExIUyBhbmQgUkhTLgorICBzdGF0aWMgS25vd25CaXRzIGNvbXB1dGVGb3JBZGRTdWIoYm9vbCBBZGQsIGJvb2wgTlNXLCBjb25zdCBLbm93bkJpdHMgJkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtub3duQml0cyBSSFMpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTEVCMTI4LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTEVCMTI4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZlYjA3MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9MRUIxMjguaApAQCAtMCwwICsxLDE5NyBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9MRUIxMjguaCAtIFtTVV1MRUIxMjggdXRpbGl0eSBmdW5jdGlvbnMgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgc29tZSB1dGlsaXR5IGZ1bmN0aW9ucyBmb3IgZW5jb2RpbmcgU0xFQjEyOCBhbmQKKy8vIFVMRUIxMjggdmFsdWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0xFQjEyOF9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9MRUIxMjhfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gZW5jb2RlIGEgU0xFQjEyOCB2YWx1ZSB0byBhbiBvdXRwdXQgc3RyZWFtLiBSZXR1cm5zCisvLy8gdGhlIGxlbmd0aCBpbiBieXRlcyBvZiB0aGUgZW5jb2RlZCB2YWx1ZS4KK2lubGluZSB1bnNpZ25lZCBlbmNvZGVTTEVCMTI4KGludDY0X3QgVmFsdWUsIHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFBhZFRvID0gMCkgeworICBib29sIE1vcmU7CisgIHVuc2lnbmVkIENvdW50ID0gMDsKKyAgZG8geworICAgIHVpbnQ4X3QgQnl0ZSA9IFZhbHVlICYgMHg3ZjsKKyAgICAvLyBOT1RFOiB0aGlzIGFzc3VtZXMgdGhhdCB0aGlzIHNpZ25lZCBzaGlmdCBpcyBhbiBhcml0aG1ldGljIHJpZ2h0IHNoaWZ0LgorICAgIFZhbHVlID4+PSA3OworICAgIE1vcmUgPSAhKCgoKFZhbHVlID09IDAgKSAmJiAoKEJ5dGUgJiAweDQwKSA9PSAwKSkgfHwKKyAgICAgICAgICAgICAgKChWYWx1ZSA9PSAtMSkgJiYgKChCeXRlICYgMHg0MCkgIT0gMCkpKSk7CisgICAgQ291bnQrKzsKKyAgICBpZiAoTW9yZSB8fCBDb3VudCA8IFBhZFRvKQorICAgICAgQnl0ZSB8PSAweDgwOyAvLyBNYXJrIHRoaXMgYnl0ZSB0byBzaG93IHRoYXQgbW9yZSBieXRlcyB3aWxsIGZvbGxvdy4KKyAgICBPUyA8PCBjaGFyKEJ5dGUpOworICB9IHdoaWxlIChNb3JlKTsKKworICAvLyBQYWQgd2l0aCAweDgwIGFuZCBlbWl0IGEgdGVybWluYXRpbmcgYnl0ZSBhdCB0aGUgZW5kLgorICBpZiAoQ291bnQgPCBQYWRUbykgeworICAgIHVpbnQ4X3QgUGFkVmFsdWUgPSBWYWx1ZSA8IDAgPyAweDdmIDogMHgwMDsKKyAgICBmb3IgKDsgQ291bnQgPCBQYWRUbyAtIDE7ICsrQ291bnQpCisgICAgICBPUyA8PCBjaGFyKFBhZFZhbHVlIHwgMHg4MCk7CisgICAgT1MgPDwgY2hhcihQYWRWYWx1ZSk7CisgICAgQ291bnQrKzsKKyAgfQorICByZXR1cm4gQ291bnQ7Cit9CisKKy8vLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGVuY29kZSBhIFNMRUIxMjggdmFsdWUgdG8gYSBidWZmZXIuIFJldHVybnMKKy8vLyB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBlbmNvZGVkIHZhbHVlLgoraW5saW5lIHVuc2lnbmVkIGVuY29kZVNMRUIxMjgoaW50NjRfdCBWYWx1ZSwgdWludDhfdCAqcCwgdW5zaWduZWQgUGFkVG8gPSAwKSB7CisgIHVpbnQ4X3QgKm9yaWdfcCA9IHA7CisgIHVuc2lnbmVkIENvdW50ID0gMDsKKyAgYm9vbCBNb3JlOworICBkbyB7CisgICAgdWludDhfdCBCeXRlID0gVmFsdWUgJiAweDdmOworICAgIC8vIE5PVEU6IHRoaXMgYXNzdW1lcyB0aGF0IHRoaXMgc2lnbmVkIHNoaWZ0IGlzIGFuIGFyaXRobWV0aWMgcmlnaHQgc2hpZnQuCisgICAgVmFsdWUgPj49IDc7CisgICAgTW9yZSA9ICEoKCgoVmFsdWUgPT0gMCApICYmICgoQnl0ZSAmIDB4NDApID09IDApKSB8fAorICAgICAgICAgICAgICAoKFZhbHVlID09IC0xKSAmJiAoKEJ5dGUgJiAweDQwKSAhPSAwKSkpKTsKKyAgICBDb3VudCsrOworICAgIGlmIChNb3JlIHx8IENvdW50IDwgUGFkVG8pCisgICAgICBCeXRlIHw9IDB4ODA7IC8vIE1hcmsgdGhpcyBieXRlIHRvIHNob3cgdGhhdCBtb3JlIGJ5dGVzIHdpbGwgZm9sbG93LgorICAgICpwKysgPSBCeXRlOworICB9IHdoaWxlIChNb3JlKTsKKworICAvLyBQYWQgd2l0aCAweDgwIGFuZCBlbWl0IGEgdGVybWluYXRpbmcgYnl0ZSBhdCB0aGUgZW5kLgorICBpZiAoQ291bnQgPCBQYWRUbykgeworICAgIHVpbnQ4X3QgUGFkVmFsdWUgPSBWYWx1ZSA8IDAgPyAweDdmIDogMHgwMDsKKyAgICBmb3IgKDsgQ291bnQgPCBQYWRUbyAtIDE7ICsrQ291bnQpCisgICAgICAqcCsrID0gKFBhZFZhbHVlIHwgMHg4MCk7CisgICAgKnArKyA9IFBhZFZhbHVlOworICB9CisgIHJldHVybiAodW5zaWduZWQpKHAgLSBvcmlnX3ApOworfQorCisvLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBlbmNvZGUgYSBVTEVCMTI4IHZhbHVlIHRvIGFuIG91dHB1dCBzdHJlYW0uIFJldHVybnMKKy8vLyB0aGUgbGVuZ3RoIGluIGJ5dGVzIG9mIHRoZSBlbmNvZGVkIHZhbHVlLgoraW5saW5lIHVuc2lnbmVkIGVuY29kZVVMRUIxMjgodWludDY0X3QgVmFsdWUsIHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFBhZFRvID0gMCkgeworICB1bnNpZ25lZCBDb3VudCA9IDA7CisgIGRvIHsKKyAgICB1aW50OF90IEJ5dGUgPSBWYWx1ZSAmIDB4N2Y7CisgICAgVmFsdWUgPj49IDc7CisgICAgQ291bnQrKzsKKyAgICBpZiAoVmFsdWUgIT0gMCB8fCBDb3VudCA8IFBhZFRvKQorICAgICAgQnl0ZSB8PSAweDgwOyAvLyBNYXJrIHRoaXMgYnl0ZSB0byBzaG93IHRoYXQgbW9yZSBieXRlcyB3aWxsIGZvbGxvdy4KKyAgICBPUyA8PCBjaGFyKEJ5dGUpOworICB9IHdoaWxlIChWYWx1ZSAhPSAwKTsKKworICAvLyBQYWQgd2l0aCAweDgwIGFuZCBlbWl0IGEgbnVsbCBieXRlIGF0IHRoZSBlbmQuCisgIGlmIChDb3VudCA8IFBhZFRvKSB7CisgICAgZm9yICg7IENvdW50IDwgUGFkVG8gLSAxOyArK0NvdW50KQorICAgICAgT1MgPDwgJ1x4ODAnOworICAgIE9TIDw8ICdceDAwJzsKKyAgICBDb3VudCsrOworICB9CisgIHJldHVybiBDb3VudDsKK30KKworLy8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gZW5jb2RlIGEgVUxFQjEyOCB2YWx1ZSB0byBhIGJ1ZmZlci4gUmV0dXJucworLy8vIHRoZSBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGVuY29kZWQgdmFsdWUuCitpbmxpbmUgdW5zaWduZWQgZW5jb2RlVUxFQjEyOCh1aW50NjRfdCBWYWx1ZSwgdWludDhfdCAqcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFBhZFRvID0gMCkgeworICB1aW50OF90ICpvcmlnX3AgPSBwOworICB1bnNpZ25lZCBDb3VudCA9IDA7CisgIGRvIHsKKyAgICB1aW50OF90IEJ5dGUgPSBWYWx1ZSAmIDB4N2Y7CisgICAgVmFsdWUgPj49IDc7CisgICAgQ291bnQrKzsKKyAgICBpZiAoVmFsdWUgIT0gMCB8fCBDb3VudCA8IFBhZFRvKQorICAgICAgQnl0ZSB8PSAweDgwOyAvLyBNYXJrIHRoaXMgYnl0ZSB0byBzaG93IHRoYXQgbW9yZSBieXRlcyB3aWxsIGZvbGxvdy4KKyAgICAqcCsrID0gQnl0ZTsKKyAgfSB3aGlsZSAoVmFsdWUgIT0gMCk7CisKKyAgLy8gUGFkIHdpdGggMHg4MCBhbmQgZW1pdCBhIG51bGwgYnl0ZSBhdCB0aGUgZW5kLgorICBpZiAoQ291bnQgPCBQYWRUbykgeworICAgIGZvciAoOyBDb3VudCA8IFBhZFRvIC0gMTsgKytDb3VudCkKKyAgICAgICpwKysgPSAnXHg4MCc7CisgICAgKnArKyA9ICdceDAwJzsKKyAgfQorCisgIHJldHVybiAodW5zaWduZWQpKHAgLSBvcmlnX3ApOworfQorCisvLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBkZWNvZGUgYSBVTEVCMTI4IHZhbHVlLgoraW5saW5lIHVpbnQ2NF90IGRlY29kZVVMRUIxMjgoY29uc3QgdWludDhfdCAqcCwgdW5zaWduZWQgKm4gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCAqZW5kID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiplcnJvciA9IG51bGxwdHIpIHsKKyAgY29uc3QgdWludDhfdCAqb3JpZ19wID0gcDsKKyAgdWludDY0X3QgVmFsdWUgPSAwOworICB1bnNpZ25lZCBTaGlmdCA9IDA7CisgIGlmIChlcnJvcikKKyAgICAqZXJyb3IgPSBudWxscHRyOworICBkbyB7CisgICAgaWYgKGVuZCAmJiBwID09IGVuZCkgeworICAgICAgaWYgKGVycm9yKQorICAgICAgICAqZXJyb3IgPSAibWFsZm9ybWVkIHVsZWIxMjgsIGV4dGVuZHMgcGFzdCBlbmQiOworICAgICAgaWYgKG4pCisgICAgICAgICpuID0gKHVuc2lnbmVkKShwIC0gb3JpZ19wKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICB1aW50NjRfdCBTbGljZSA9ICpwICYgMHg3ZjsKKyAgICBpZiAoU2hpZnQgPj0gNjQgfHwgU2xpY2UgPDwgU2hpZnQgPj4gU2hpZnQgIT0gU2xpY2UpIHsKKyAgICAgIGlmIChlcnJvcikKKyAgICAgICAgKmVycm9yID0gInVsZWIxMjggdG9vIGJpZyBmb3IgdWludDY0IjsKKyAgICAgIGlmIChuKQorICAgICAgICAqbiA9ICh1bnNpZ25lZCkocCAtIG9yaWdfcCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgVmFsdWUgKz0gdWludDY0X3QoKnAgJiAweDdmKSA8PCBTaGlmdDsKKyAgICBTaGlmdCArPSA3OworICB9IHdoaWxlICgqcCsrID49IDEyOCk7CisgIGlmIChuKQorICAgICpuID0gKHVuc2lnbmVkKShwIC0gb3JpZ19wKTsKKyAgcmV0dXJuIFZhbHVlOworfQorCisvLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBkZWNvZGUgYSBTTEVCMTI4IHZhbHVlLgoraW5saW5lIGludDY0X3QgZGVjb2RlU0xFQjEyOChjb25zdCB1aW50OF90ICpwLCB1bnNpZ25lZCAqbiA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmVuZCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiplcnJvciA9IG51bGxwdHIpIHsKKyAgY29uc3QgdWludDhfdCAqb3JpZ19wID0gcDsKKyAgaW50NjRfdCBWYWx1ZSA9IDA7CisgIHVuc2lnbmVkIFNoaWZ0ID0gMDsKKyAgdWludDhfdCBCeXRlOworICBkbyB7CisgICAgaWYgKGVuZCAmJiBwID09IGVuZCkgeworICAgICAgaWYgKGVycm9yKQorICAgICAgICAqZXJyb3IgPSAibWFsZm9ybWVkIHNsZWIxMjgsIGV4dGVuZHMgcGFzdCBlbmQiOworICAgICAgaWYgKG4pCisgICAgICAgICpuID0gKHVuc2lnbmVkKShwIC0gb3JpZ19wKTsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBCeXRlID0gKnArKzsKKyAgICBWYWx1ZSB8PSAoaW50NjRfdChCeXRlICYgMHg3ZikgPDwgU2hpZnQpOworICAgIFNoaWZ0ICs9IDc7CisgIH0gd2hpbGUgKEJ5dGUgPj0gMTI4KTsKKyAgLy8gU2lnbiBleHRlbmQgbmVnYXRpdmUgbnVtYmVycy4KKyAgaWYgKEJ5dGUgJiAweDQwKQorICAgIFZhbHVlIHw9ICgtMVVMTCkgPDwgU2hpZnQ7CisgIGlmIChuKQorICAgICpuID0gKHVuc2lnbmVkKShwIC0gb3JpZ19wKTsKKyAgcmV0dXJuIFZhbHVlOworfQorCisvLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBnZXQgdGhlIHNpemUgb2YgdGhlIFVMRUIxMjgtZW5jb2RlZCB2YWx1ZS4KK2V4dGVybiB1bnNpZ25lZCBnZXRVTEVCMTI4U2l6ZSh1aW50NjRfdCBWYWx1ZSk7CisKKy8vLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGdldCB0aGUgc2l6ZSBvZiB0aGUgU0xFQjEyOC1lbmNvZGVkIHZhbHVlLgorZXh0ZXJuIHVuc2lnbmVkIGdldFNMRUIxMjhTaXplKGludDY0X3QgVmFsdWUpOworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NZU1RFTV9MRUIxMjhfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0xJQ0VOU0UuVFhUIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0xJQ0VOU0UuVFhUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NzliM2YKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTElDRU5TRS5UWFQKQEAgLTAsMCArMSw2IEBACitMTFZNIFN5c3RlbSBJbnRlcmZhY2UgTGlicmFyeQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorVGhlIExMVk0gU3lzdGVtIEludGVyZmFjZSBMaWJyYXJ5IGlzIGxpY2Vuc2VkIHVuZGVyIHRoZSBJbGxpbm9pcyBPcGVuIFNvdXJjZQorTGljZW5zZSBhbmQgaGFzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBjb3B5cmlnaHQ6CisKK0NvcHlyaWdodCAoQykgMjAwNCBlWHRlbnNpYmxlIFN5c3RlbXMsIEluYy4KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9MaW5lSXRlcmF0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9MaW5lSXRlcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZDRjZDNiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0xpbmVJdGVyYXRvci5oCkBAIC0wLDAgKzEsODggQEAKKy8vPT09LSBMaW5lSXRlcmF0b3IuaCAtIEl0ZXJhdG9yIHRvIHJlYWQgYSB0ZXh0IGJ1ZmZlcidzIGxpbmVzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX0xJTkVJVEVSQVRPUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9MSU5FSVRFUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPGl0ZXJhdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1lbW9yeUJ1ZmZlcjsKKworLy8vIFxicmllZiBBIGZvcndhcmQgaXRlcmF0b3Igd2hpY2ggcmVhZHMgdGV4dCBsaW5lcyBmcm9tIGEgYnVmZmVyLgorLy8vCisvLy8gVGhpcyBjbGFzcyBwcm92aWRlcyBhIGZvcndhcmQgaXRlcmF0b3IgaW50ZXJmYWNlIGZvciByZWFkaW5nIG9uZSBsaW5lIGF0CisvLy8gYSB0aW1lIGZyb20gYSBidWZmZXIuIFdoZW4gZGVmYXVsdCBjb25zdHJ1Y3RlZCB0aGUgaXRlcmF0b3Igd2lsbCBiZSB0aGUKKy8vLyAiZW5kIiBpdGVyYXRvci4KKy8vLworLy8vIFRoZSBpdGVyYXRvciBpcyBhd2FyZSBvZiB3aGF0IGxpbmUgbnVtYmVyIGl0IGlzIGN1cnJlbnRseSBwcm9jZXNzaW5nLiBJdAorLy8vIHN0cmlwcyBibGFuayBsaW5lcyBieSBkZWZhdWx0LCBhbmQgY29tbWVudCBsaW5lcyBnaXZlbiBhIGNvbW1lbnQtc3RhcnRpbmcKKy8vLyBjaGFyYWN0ZXIuCisvLy8KKy8vLyBOb3RlIHRoYXQgdGhpcyBpdGVyYXRvciByZXF1aXJlcyB0aGUgYnVmZmVyIHRvIGJlIG51bCB0ZXJtaW5hdGVkLgorY2xhc3MgbGluZV9pdGVyYXRvcgorICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgU3RyaW5nUmVmPiB7CisgIGNvbnN0IE1lbW9yeUJ1ZmZlciAqQnVmZmVyOworICBjaGFyIENvbW1lbnRNYXJrZXI7CisgIGJvb2wgU2tpcEJsYW5rczsKKworICB1bnNpZ25lZCBMaW5lTnVtYmVyOworICBTdHJpbmdSZWYgQ3VycmVudExpbmU7CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBEZWZhdWx0IGNvbnN0cnVjdCBhbiAiZW5kIiBpdGVyYXRvci4KKyAgbGluZV9pdGVyYXRvcigpIDogQnVmZmVyKG51bGxwdHIpIHt9CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgYSBuZXcgaXRlcmF0b3IgYXJvdW5kIHNvbWUgbWVtb3J5IGJ1ZmZlci4KKyAgZXhwbGljaXQgbGluZV9pdGVyYXRvcihjb25zdCBNZW1vcnlCdWZmZXIgJkJ1ZmZlciwgYm9vbCBTa2lwQmxhbmtzID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIENvbW1lbnRNYXJrZXIgPSAnXDAnKTsKKworICAvLy8gXGJyaWVmIFJldHVybiB0cnVlIGlmIHdlJ3ZlIHJlYWNoZWQgRU9GIG9yIGFyZSBhbiAiZW5kIiBpdGVyYXRvci4KKyAgYm9vbCBpc19hdF9lb2YoKSBjb25zdCB7IHJldHVybiAhQnVmZmVyOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB3ZSdyZSBhbiAiZW5kIiBpdGVyYXRvciBvciBoYXZlIHJlYWNoZWQgRU9GLgorICBib29sIGlzX2F0X2VuZCgpIGNvbnN0IHsgcmV0dXJuIGlzX2F0X2VvZigpOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGN1cnJlbnQgbGluZSBudW1iZXIuIE1heSByZXR1cm4gYW55IG51bWJlciBhdCBFT0YuCisgIGludDY0X3QgbGluZV9udW1iZXIoKSBjb25zdCB7IHJldHVybiBMaW5lTnVtYmVyOyB9CisKKyAgLy8vIFxicmllZiBBZHZhbmNlIHRvIHRoZSBuZXh0IChub24tZW1wdHksIG5vbi1jb21tZW50KSBsaW5lLgorICBsaW5lX2l0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgIGFkdmFuY2UoKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgbGluZV9pdGVyYXRvciBvcGVyYXRvcisrKGludCkgeworICAgIGxpbmVfaXRlcmF0b3IgdG1wKCp0aGlzKTsKKyAgICBhZHZhbmNlKCk7CisgICAgcmV0dXJuIHRtcDsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IHRoZSBjdXJyZW50IGxpbmUgYXMgYSBcYyBTdHJpbmdSZWYuCisgIFN0cmluZ1JlZiBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBDdXJyZW50TGluZTsgfQorICBjb25zdCBTdHJpbmdSZWYgKm9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmQ3VycmVudExpbmU7IH0KKworICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGxpbmVfaXRlcmF0b3IgJkxIUywgY29uc3QgbGluZV9pdGVyYXRvciAmUkhTKSB7CisgICAgcmV0dXJuIExIUy5CdWZmZXIgPT0gUkhTLkJ1ZmZlciAmJgorICAgICAgICAgICBMSFMuQ3VycmVudExpbmUuYmVnaW4oKSA9PSBSSFMuQ3VycmVudExpbmUuYmVnaW4oKTsKKyAgfQorCisgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgbGluZV9pdGVyYXRvciAmTEhTLCBjb25zdCBsaW5lX2l0ZXJhdG9yICZSSFMpIHsKKyAgICByZXR1cm4gIShMSFMgPT0gUkhTKTsKKyAgfQorCitwcml2YXRlOgorICAvLy8gXGJyaWVmIEFkdmFuY2UgdGhlIGl0ZXJhdG9yIHRvIHRoZSBuZXh0IGxpbmUuCisgIHZvaWQgYWR2YW5jZSgpOworfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTG9jYWxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTG9jYWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjdhMmMwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Mb2NhbGUuaApAQCAtMCwwICsxLDE3IEBACisjaWZuZGVmIExMVk1fU1VQUE9SVF9MT0NBTEVfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfTE9DQUxFX0gKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgU3RyaW5nUmVmOworCituYW1lc3BhY2Ugc3lzIHsKK25hbWVzcGFjZSBsb2NhbGUgeworCitpbnQgY29sdW1uV2lkdGgoU3RyaW5nUmVmIHMpOworYm9vbCBpc1ByaW50KGludCBjKTsKKworfQorfQorfQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX0xPQ0FMRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTG9ja0ZpbGVNYW5hZ2VyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTG9ja0ZpbGVNYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU0MTdiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Mb2NrRmlsZU1hbmFnZXIuaApAQCAtMCwwICsxLDEwMCBAQAorLy89PT0tLS0gTG9ja0ZpbGVNYW5hZ2VyLmggLSBGaWxlLWxldmVsIGxvY2tpbmcgdXRpbGl0eSAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9TVVBQT1JUX0xPQ0tGSUxFTUFOQUdFUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9MT0NLRklMRU1BTkFHRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmgiCisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorI2luY2x1ZGUgPHV0aWxpdHk+IC8vIGZvciBzdGQ6OnBhaXIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgU3RyaW5nUmVmOworCisvLy8gXGJyaWVmIENsYXNzIHRoYXQgbWFuYWdlcyB0aGUgY3JlYXRpb24gb2YgYSBsb2NrIGZpbGUgdG8gYWlkCisvLy8gaW1wbGljaXQgY29vcmRpbmF0aW9uIGJldHdlZW4gZGlmZmVyZW50IHByb2Nlc3Nlcy4KKy8vLworLy8vIFRoZSBpbXBsaWNpdCBjb29yZGluYXRpb24gd29ya3MgYnkgY3JlYXRpbmcgYSAiLmxvY2siIGZpbGUgYWxvbmdzaWRlCisvLy8gdGhlIGZpbGUgdGhhdCB3ZSdyZSBjb29yZGluYXRpbmcgZm9yLCB1c2luZyB0aGUgYXRvbWljaXR5IG9mIHRoZSBmaWxlCisvLy8gc3lzdGVtIHRvIGVuc3VyZSB0aGF0IG9ubHkgYSBzaW5nbGUgcHJvY2VzcyBjYW4gY3JlYXRlIHRoYXQgIi5sb2NrIiBmaWxlLgorLy8vIFdoZW4gdGhlIGxvY2sgZmlsZSBpcyByZW1vdmVkLCB0aGUgb3duaW5nIHByb2Nlc3MgaGFzIGZpbmlzaGVkIHRoZQorLy8vIG9wZXJhdGlvbi4KK2NsYXNzIExvY2tGaWxlTWFuYWdlciB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgRGVzY3JpYmVzIHRoZSBzdGF0ZSBvZiBhIGxvY2sgZmlsZS4KKyAgZW51bSBMb2NrRmlsZVN0YXRlIHsKKyAgICAvLy8gXGJyaWVmIFRoZSBsb2NrIGZpbGUgaGFzIGJlZW4gY3JlYXRlZCBhbmQgaXMgb3duZWQgYnkgdGhpcyBpbnN0YW5jZQorICAgIC8vLyBvZiB0aGUgb2JqZWN0LgorICAgIExGU19Pd25lZCwKKyAgICAvLy8gXGJyaWVmIFRoZSBsb2NrIGZpbGUgYWxyZWFkeSBleGlzdHMgYW5kIGlzIG93bmVkIGJ5IHNvbWUgb3RoZXIKKyAgICAvLy8gaW5zdGFuY2UuCisgICAgTEZTX1NoYXJlZCwKKyAgICAvLy8gXGJyaWVmIEFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBjcmVhdGUgb3IgZmluZCB0aGUgbG9jaworICAgIC8vLyBmaWxlLgorICAgIExGU19FcnJvcgorICB9OworCisgIC8vLyBcYnJpZWYgRGVzY3JpYmVzIHRoZSByZXN1bHQgb2Ygd2FpdGluZyBmb3IgdGhlIG93bmVyIHRvIHJlbGVhc2UgdGhlIGxvY2suCisgIGVudW0gV2FpdEZvclVubG9ja1Jlc3VsdCB7CisgICAgLy8vIFxicmllZiBUaGUgbG9jayB3YXMgcmVsZWFzZWQgc3VjY2Vzc2Z1bGx5LgorICAgIFJlc19TdWNjZXNzLAorICAgIC8vLyBcYnJpZWYgT3duZXIgZGllZCB3aGlsZSBob2xkaW5nIHRoZSBsb2NrLgorICAgIFJlc19Pd25lckRpZWQsCisgICAgLy8vIFxicmllZiBSZWFjaGVkIHRpbWVvdXQgd2hpbGUgd2FpdGluZyBmb3IgdGhlIG93bmVyIHRvIHJlbGVhc2UgdGhlIGxvY2suCisgICAgUmVzX1RpbWVvdXQKKyAgfTsKKworcHJpdmF0ZToKKyAgU21hbGxTdHJpbmc8MTI4PiBGaWxlTmFtZTsKKyAgU21hbGxTdHJpbmc8MTI4PiBMb2NrRmlsZU5hbWU7CisgIE9wdGlvbmFsPHN5czo6ZnM6OlRlbXBGaWxlPiBVbmlxdWVMb2NrRmlsZTsKKworICBPcHRpb25hbDxzdGQ6OnBhaXI8c3RkOjpzdHJpbmcsIGludD4gPiBPd25lcjsKKyAgc3RkOjplcnJvcl9jb2RlIEVycm9yQ29kZTsKKyAgc3RkOjpzdHJpbmcgRXJyb3JEaWFnTXNnOworCisgIExvY2tGaWxlTWFuYWdlcihjb25zdCBMb2NrRmlsZU1hbmFnZXIgJikgPSBkZWxldGU7CisgIExvY2tGaWxlTWFuYWdlciAmb3BlcmF0b3I9KGNvbnN0IExvY2tGaWxlTWFuYWdlciAmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgT3B0aW9uYWw8c3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBpbnQ+ID4KKyAgcmVhZExvY2tGaWxlKFN0cmluZ1JlZiBMb2NrRmlsZU5hbWUpOworCisgIHN0YXRpYyBib29sIHByb2Nlc3NTdGlsbEV4ZWN1dGluZyhTdHJpbmdSZWYgSG9zdG5hbWUsIGludCBQSUQpOworCitwdWJsaWM6CisKKyAgTG9ja0ZpbGVNYW5hZ2VyKFN0cmluZ1JlZiBGaWxlTmFtZSk7CisgIH5Mb2NrRmlsZU1hbmFnZXIoKTsKKworICAvLy8gXGJyaWVmIERldGVybWluZSB0aGUgc3RhdGUgb2YgdGhlIGxvY2sgZmlsZS4KKyAgTG9ja0ZpbGVTdGF0ZSBnZXRTdGF0ZSgpIGNvbnN0OworCisgIG9wZXJhdG9yIExvY2tGaWxlU3RhdGUoKSBjb25zdCB7IHJldHVybiBnZXRTdGF0ZSgpOyB9CisKKyAgLy8vIFxicmllZiBGb3IgYSBzaGFyZWQgbG9jaywgd2FpdCB1bnRpbCB0aGUgb3duZXIgcmVsZWFzZXMgdGhlIGxvY2suCisgIFdhaXRGb3JVbmxvY2tSZXN1bHQgd2FpdEZvclVubG9jaygpOworCisgIC8vLyBcYnJpZWYgUmVtb3ZlIHRoZSBsb2NrIGZpbGUuICBUaGlzIG1heSBkZWxldGUgYSBkaWZmZXJlbnQgbG9jayBmaWxlIHRoYW4KKyAgLy8vIHRoZSBvbmUgcHJldmlvdXNseSByZWFkIGlmIHRoZXJlIGlzIGEgcmFjZS4KKyAgc3RkOjplcnJvcl9jb2RlIHVuc2FmZVJlbW92ZUxvY2tGaWxlKCk7CisKKyAgLy8vIFxicmllZiBHZXQgZXJyb3IgbWVzc2FnZSwgb3IgIiIgaWYgdGhlcmUgaXMgbm8gZXJyb3IuCisgIHN0ZDo6c3RyaW5nIGdldEVycm9yTWVzc2FnZSgpIGNvbnN0OworCisgIC8vLyBcYnJpZWYgU2V0IGVycm9yIGFuZCBlcnJvciBtZXNzYWdlCisgIHZvaWQgc2V0RXJyb3IoY29uc3Qgc3RkOjplcnJvcl9jb2RlICZFQywgU3RyaW5nUmVmIEVycm9yTXNnID0gIiIpIHsKKyAgICBFcnJvckNvZGUgPSBFQzsKKyAgICBFcnJvckRpYWdNc2cgPSBFcnJvck1zZy5zdHIoKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9MT0NLRklMRU1BTkFHRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L0xvd0xldmVsVHlwZUltcGwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Mb3dMZXZlbFR5cGVJbXBsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBhNWE1MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Mb3dMZXZlbFR5cGVJbXBsLmgKQEAgLTAsMCArMSwyNjQgQEAKKy8vPT0gbGx2bS9TdXBwb3J0L0xvd0xldmVsVHlwZUltcGwuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIEltcGxlbWVudCBhIGxvdy1sZXZlbCB0eXBlIHN1aXRhYmxlIGZvciBNYWNoaW5lSW5zdHIgbGV2ZWwgaW5zdHJ1Y3Rpb24KKy8vLyBzZWxlY3Rpb24uCisvLy8KKy8vLyBGb3IgYSB0eXBlIGF0dGFjaGVkIHRvIGEgTWFjaGluZUluc3RyLCB3ZSBvbmx5IGNhcmUgYWJvdXQgMiBkZXRhaWxzOiB0b3RhbAorLy8vIHNpemUgYW5kIHRoZSBudW1iZXIgb2YgdmVjdG9yIGxhbmVzIChpZiBhbnkpLiBBY2NvcmRpbmdseSwgdGhlcmUgYXJlIDQKKy8vLyBwb3NzaWJsZSB2YWxpZCB0eXBlLWtpbmRzOgorLy8vCisvLy8gICAgKiBgc05gIGZvciBzY2FsYXJzIGFuZCBhZ2dyZWdhdGVzCisvLy8gICAgKiBgPE4geCBzTT5gIGZvciB2ZWN0b3JzLCB3aGljaCBtdXN0IGhhdmUgYXQgbGVhc3QgMiBlbGVtZW50cy4KKy8vLyAgICAqIGBwTmAgZm9yIHBvaW50ZXJzCisvLy8KKy8vLyBPdGhlciBpbmZvcm1hdGlvbiByZXF1aXJlZCBmb3IgY29ycmVjdCBzZWxlY3Rpb24gaXMgZXhwZWN0ZWQgdG8gYmUgY2FycmllZAorLy8vIGJ5IHRoZSBvcGNvZGUsIG9yIG5vbi10eXBlIGZsYWdzLiBGb3IgZXhhbXBsZSB0aGUgZGlzdGluY3Rpb24gYmV0d2VlbiBHX0FERAorLy8vIGFuZCBHX0ZBREQgZm9yIGludC9mbG9hdCBvciBmYXN0LW1hdGggZmxhZ3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfTE9XTEVWRUxUWVBFSU1QTF9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9MT1dMRVZFTFRZUEVJTVBMX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwSW5mby5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYWNoaW5lVmFsdWVUeXBlLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBEYXRhTGF5b3V0OworY2xhc3MgVHlwZTsKK2NsYXNzIHJhd19vc3RyZWFtOworCitjbGFzcyBMTFQgeworcHVibGljOgorICAvLy8gR2V0IGEgbG93LWxldmVsIHNjYWxhciBvciBhZ2dyZWdhdGUgImJhZyBvZiBiaXRzIi4KKyAgc3RhdGljIExMVCBzY2FsYXIodW5zaWduZWQgU2l6ZUluQml0cykgeworICAgIGFzc2VydChTaXplSW5CaXRzID4gMCAmJiAiaW52YWxpZCBzY2FsYXIgc2l6ZSIpOworICAgIHJldHVybiBMTFR7Lyppc1BvaW50ZXI9Ki9mYWxzZSwgLyppc1ZlY3Rvcj0qL2ZhbHNlLCAvKk51bUVsZW1lbnRzPSovMCwKKyAgICAgICAgICAgICAgIFNpemVJbkJpdHMsIC8qQWRkcmVzc1NwYWNlPSovMH07CisgIH0KKworICAvLy8gR2V0IGEgbG93LWxldmVsIHBvaW50ZXIgaW4gdGhlIGdpdmVuIGFkZHJlc3Mgc3BhY2UgKGRlZmF1bHRpbmcgdG8gMCkuCisgIHN0YXRpYyBMTFQgcG9pbnRlcih1aW50MTZfdCBBZGRyZXNzU3BhY2UsIHVuc2lnbmVkIFNpemVJbkJpdHMpIHsKKyAgICBhc3NlcnQoU2l6ZUluQml0cyA+IDAgJiYgImludmFsaWQgcG9pbnRlciBzaXplIik7CisgICAgcmV0dXJuIExMVHsvKmlzUG9pbnRlcj0qL3RydWUsIC8qaXNWZWN0b3I9Ki9mYWxzZSwgLypOdW1FbGVtZW50cz0qLzAsCisgICAgICAgICAgICAgICBTaXplSW5CaXRzLCBBZGRyZXNzU3BhY2V9OworICB9CisKKyAgLy8vIEdldCBhIGxvdy1sZXZlbCB2ZWN0b3Igb2Ygc29tZSBudW1iZXIgb2YgZWxlbWVudHMgYW5kIGVsZW1lbnQgd2lkdGguCisgIC8vLyBccCBOdW1FbGVtZW50cyBtdXN0IGJlIGF0IGxlYXN0IDIuCisgIHN0YXRpYyBMTFQgdmVjdG9yKHVpbnQxNl90IE51bUVsZW1lbnRzLCB1bnNpZ25lZCBTY2FsYXJTaXplSW5CaXRzKSB7CisgICAgYXNzZXJ0KE51bUVsZW1lbnRzID4gMSAmJiAiaW52YWxpZCBudW1iZXIgb2YgdmVjdG9yIGVsZW1lbnRzIik7CisgICAgYXNzZXJ0KFNjYWxhclNpemVJbkJpdHMgPiAwICYmICJpbnZhbGlkIHZlY3RvciBlbGVtZW50IHNpemUiKTsKKyAgICByZXR1cm4gTExUey8qaXNQb2ludGVyPSovZmFsc2UsIC8qaXNWZWN0b3I9Ki90cnVlLCBOdW1FbGVtZW50cywKKyAgICAgICAgICAgICAgIFNjYWxhclNpemVJbkJpdHMsIC8qQWRkcmVzc1NwYWNlPSovMH07CisgIH0KKworICAvLy8gR2V0IGEgbG93LWxldmVsIHZlY3RvciBvZiBzb21lIG51bWJlciBvZiBlbGVtZW50cyBhbmQgZWxlbWVudCB0eXBlLgorICBzdGF0aWMgTExUIHZlY3Rvcih1aW50MTZfdCBOdW1FbGVtZW50cywgTExUIFNjYWxhclR5KSB7CisgICAgYXNzZXJ0KE51bUVsZW1lbnRzID4gMSAmJiAiaW52YWxpZCBudW1iZXIgb2YgdmVjdG9yIGVsZW1lbnRzIik7CisgICAgYXNzZXJ0KCFTY2FsYXJUeS5pc1ZlY3RvcigpICYmICJpbnZhbGlkIHZlY3RvciBlbGVtZW50IHR5cGUiKTsKKyAgICByZXR1cm4gTExUe1NjYWxhclR5LmlzUG9pbnRlcigpLCAvKmlzVmVjdG9yPSovdHJ1ZSwgTnVtRWxlbWVudHMsCisgICAgICAgICAgICAgICBTY2FsYXJUeS5nZXRTaXplSW5CaXRzKCksCisgICAgICAgICAgICAgICBTY2FsYXJUeS5pc1BvaW50ZXIoKSA/IFNjYWxhclR5LmdldEFkZHJlc3NTcGFjZSgpIDogMH07CisgIH0KKworICBleHBsaWNpdCBMTFQoYm9vbCBpc1BvaW50ZXIsIGJvb2wgaXNWZWN0b3IsIHVpbnQxNl90IE51bUVsZW1lbnRzLAorICAgICAgICAgICAgICAgdW5zaWduZWQgU2l6ZUluQml0cywgdW5zaWduZWQgQWRkcmVzc1NwYWNlKSB7CisgICAgaW5pdChpc1BvaW50ZXIsIGlzVmVjdG9yLCBOdW1FbGVtZW50cywgU2l6ZUluQml0cywgQWRkcmVzc1NwYWNlKTsKKyAgfQorICBleHBsaWNpdCBMTFQoKSA6IElzUG9pbnRlcihmYWxzZSksIElzVmVjdG9yKGZhbHNlKSwgUmF3RGF0YSgwKSB7fQorCisgIGV4cGxpY2l0IExMVChNVlQgVlQpOworCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIFJhd0RhdGEgIT0gMDsgfQorCisgIGJvb2wgaXNTY2FsYXIoKSBjb25zdCB7IHJldHVybiBpc1ZhbGlkKCkgJiYgIUlzUG9pbnRlciAmJiAhSXNWZWN0b3I7IH0KKworICBib29sIGlzUG9pbnRlcigpIGNvbnN0IHsgcmV0dXJuIGlzVmFsaWQoKSAmJiBJc1BvaW50ZXIgJiYgIUlzVmVjdG9yOyB9CisKKyAgYm9vbCBpc1ZlY3RvcigpIGNvbnN0IHsgcmV0dXJuIGlzVmFsaWQoKSAmJiBJc1ZlY3RvcjsgfQorCisgIC8vLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSB2ZWN0b3IgTExULiBNdXN0IG9ubHkgYmUgY2FsbGVkIG9uCisgIC8vLyB2ZWN0b3IgdHlwZXMuCisgIHVpbnQxNl90IGdldE51bUVsZW1lbnRzKCkgY29uc3QgeworICAgIGFzc2VydChJc1ZlY3RvciAmJiAiY2Fubm90IGdldCBudW1iZXIgb2YgZWxlbWVudHMgb24gc2NhbGFyL2FnZ3JlZ2F0ZSIpOworICAgIGlmICghSXNQb2ludGVyKQorICAgICAgcmV0dXJuIGdldEZpZWxkVmFsdWUoVmVjdG9yRWxlbWVudHNGaWVsZEluZm8pOworICAgIGVsc2UKKyAgICAgIHJldHVybiBnZXRGaWVsZFZhbHVlKFBvaW50ZXJWZWN0b3JFbGVtZW50c0ZpZWxkSW5mbyk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgdG90YWwgc2l6ZSBvZiB0aGUgdHlwZS4gTXVzdCBvbmx5IGJlIGNhbGxlZCBvbiBzaXplZCB0eXBlcy4KKyAgdW5zaWduZWQgZ2V0U2l6ZUluQml0cygpIGNvbnN0IHsKKyAgICBpZiAoaXNQb2ludGVyKCkgfHwgaXNTY2FsYXIoKSkKKyAgICAgIHJldHVybiBnZXRTY2FsYXJTaXplSW5CaXRzKCk7CisgICAgcmV0dXJuIGdldFNjYWxhclNpemVJbkJpdHMoKSAqIGdldE51bUVsZW1lbnRzKCk7CisgIH0KKworICB1bnNpZ25lZCBnZXRTY2FsYXJTaXplSW5CaXRzKCkgY29uc3QgeworICAgIGFzc2VydChSYXdEYXRhICE9IDAgJiYgIkludmFsaWQgVHlwZSIpOworICAgIGlmICghSXNWZWN0b3IpIHsKKyAgICAgIGlmICghSXNQb2ludGVyKQorICAgICAgICByZXR1cm4gZ2V0RmllbGRWYWx1ZShTY2FsYXJTaXplRmllbGRJbmZvKTsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIGdldEZpZWxkVmFsdWUoUG9pbnRlclNpemVGaWVsZEluZm8pOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoIUlzUG9pbnRlcikKKyAgICAgICAgcmV0dXJuIGdldEZpZWxkVmFsdWUoVmVjdG9yU2l6ZUZpZWxkSW5mbyk7CisgICAgICBlbHNlCisgICAgICAgIHJldHVybiBnZXRGaWVsZFZhbHVlKFBvaW50ZXJWZWN0b3JTaXplRmllbGRJbmZvKTsKKyAgICB9CisgIH0KKworICB1bnNpZ25lZCBnZXRBZGRyZXNzU3BhY2UoKSBjb25zdCB7CisgICAgYXNzZXJ0KFJhd0RhdGEgIT0gMCAmJiAiSW52YWxpZCBUeXBlIik7CisgICAgYXNzZXJ0KElzUG9pbnRlciAmJiAiY2Fubm90IGdldCBhZGRyZXNzIHNwYWNlIG9mIG5vbi1wb2ludGVyIHR5cGUiKTsKKyAgICBpZiAoIUlzVmVjdG9yKQorICAgICAgcmV0dXJuIGdldEZpZWxkVmFsdWUoUG9pbnRlckFkZHJlc3NTcGFjZUZpZWxkSW5mbyk7CisgICAgZWxzZQorICAgICAgcmV0dXJuIGdldEZpZWxkVmFsdWUoUG9pbnRlclZlY3RvckFkZHJlc3NTcGFjZUZpZWxkSW5mbyk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgdmVjdG9yJ3MgZWxlbWVudCB0eXBlLiBPbmx5IHZhbGlkIGZvciB2ZWN0b3IgdHlwZXMuCisgIExMVCBnZXRFbGVtZW50VHlwZSgpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNWZWN0b3IoKSAmJiAiY2Fubm90IGdldCBlbGVtZW50IHR5cGUgb2Ygc2NhbGFyL2FnZ3JlZ2F0ZSIpOworICAgIGlmIChJc1BvaW50ZXIpCisgICAgICByZXR1cm4gcG9pbnRlcihnZXRBZGRyZXNzU3BhY2UoKSwgZ2V0U2NhbGFyU2l6ZUluQml0cygpKTsKKyAgICBlbHNlCisgICAgICByZXR1cm4gc2NhbGFyKGdldFNjYWxhclNpemVJbkJpdHMoKSk7CisgIH0KKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IExMVCAmUkhTKSBjb25zdCB7CisgICAgcmV0dXJuIElzUG9pbnRlciA9PSBSSFMuSXNQb2ludGVyICYmIElzVmVjdG9yID09IFJIUy5Jc1ZlY3RvciAmJgorICAgICAgICAgICBSSFMuUmF3RGF0YSA9PSBSYXdEYXRhOworICB9CisKKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IExMVCAmUkhTKSBjb25zdCB7IHJldHVybiAhKCp0aGlzID09IFJIUyk7IH0KKworICBmcmllbmQgc3RydWN0IERlbnNlTWFwSW5mbzxMTFQ+OworCitwcml2YXRlOgorICAvLy8gTExUIGlzIHBhY2tlZCBpbnRvIDY0IGJpdHMgYXMgZm9sbG93czoKKyAgLy8vIGlzUG9pbnRlciA6IDEKKyAgLy8vIGlzVmVjdG9yICA6IDEKKyAgLy8vIHdpdGggNjIgYml0cyByZW1haW5pbmcgZm9yIEtpbmQtc3BlY2lmaWMgZGF0YSwgcGFja2VkIGluIGJpdGZpZWxkcworICAvLy8gYXMgZGVzY3JpYmVkIGJlbG93LiBBcyB0aGVyZSBpc24ndCBhIHNpbXBsZSBwb3J0YWJsZSB3YXkgdG8gcGFjayBiaXRzCisgIC8vLyBpbnRvIGJpdGZpZWxkcywgaGVyZSB0aGUgZGlmZmVyZW50IGZpZWxkcyBpbiB0aGUgcGFja2VkIHN0cnVjdHVyZSBpcworICAvLy8gZGVzY3JpYmVkIGluIHN0YXRpYyBjb25zdCAqRmllbGQgdmFyaWFibGVzLiBFYWNoIG9mIHRoZXNlIHZhcmlhYmxlcworICAvLy8gaXMgYSAyLWVsZW1lbnQgYXJyYXksIHdpdGggdGhlIGZpcnN0IGVsZW1lbnQgZGVzY3JpYmluZyB0aGUgYml0ZmllbGQgc2l6ZQorICAvLy8gYW5kIHRoZSBzZWNvbmQgZWxlbWVudCBkZXNjcmliaW5nIHRoZSBiaXRmaWVsZCBvZmZzZXQuCisgIHR5cGVkZWYgaW50IEJpdEZpZWxkSW5mb1syXTsKKyAgLy8vCisgIC8vLyBUaGlzIGlzIGhvdyB0aGUgYml0ZmllbGRzIGFyZSBwYWNrZWQgcGVyIEtpbmQ6CisgIC8vLyAqIEludmFsaWQ6CisgIC8vLyAgIGdldHMgZW5jb2RlZCBhcyBSYXdEYXRhID09IDAsIGFzIHRoYXQgaXMgYW4gaW52YWxpZCBlbmNvZGluZywgc2luY2UgZm9yCisgIC8vLyAgIHZhbGlkIGVuY29kaW5ncywgU2l6ZUluQml0cy9TaXplT2ZFbGVtZW50IG11c3QgYmUgbGFyZ2VyIHRoYW4gMC4KKyAgLy8vICogTm9uLXBvaW50ZXIgc2NhbGFyIChpc1BvaW50ZXIgPT0gMCAmJiBpc1ZlY3RvciA9PSAwKToKKyAgLy8vICAgU2l6ZUluQml0czogMzI7CisgIHN0YXRpYyBjb25zdCBjb25zdGV4cHIgQml0RmllbGRJbmZvIFNjYWxhclNpemVGaWVsZEluZm97MzIsIDB9OworICAvLy8gKiBQb2ludGVyIChpc1BvaW50ZXIgPT0gMSAmJiBpc1ZlY3RvciA9PSAwKToKKyAgLy8vICAgU2l6ZUluQml0czogMTY7CisgIC8vLyAgIEFkZHJlc3NTcGFjZTogMjM7CisgIHN0YXRpYyBjb25zdCBjb25zdGV4cHIgQml0RmllbGRJbmZvIFBvaW50ZXJTaXplRmllbGRJbmZvezE2LCAwfTsKKyAgc3RhdGljIGNvbnN0IGNvbnN0ZXhwciBCaXRGaWVsZEluZm8gUG9pbnRlckFkZHJlc3NTcGFjZUZpZWxkSW5mb3sKKyAgICAgIDIzLCBQb2ludGVyU2l6ZUZpZWxkSW5mb1swXSArIFBvaW50ZXJTaXplRmllbGRJbmZvWzFdfTsKKyAgLy8vICogVmVjdG9yLW9mLW5vbi1wb2ludGVyIChpc1BvaW50ZXIgPT0gMCAmJiBpc1ZlY3RvciA9PSAxKToKKyAgLy8vICAgTnVtRWxlbWVudHM6IDE2OworICAvLy8gICBTaXplT2ZFbGVtZW50OiAzMjsKKyAgc3RhdGljIGNvbnN0IGNvbnN0ZXhwciBCaXRGaWVsZEluZm8gVmVjdG9yRWxlbWVudHNGaWVsZEluZm97MTYsIDB9OworICBzdGF0aWMgY29uc3QgY29uc3RleHByIEJpdEZpZWxkSW5mbyBWZWN0b3JTaXplRmllbGRJbmZveworICAgICAgMzIsIFZlY3RvckVsZW1lbnRzRmllbGRJbmZvWzBdICsgVmVjdG9yRWxlbWVudHNGaWVsZEluZm9bMV19OworICAvLy8gKiBWZWN0b3Itb2YtcG9pbnRlciAoaXNQb2ludGVyID09IDEgJiYgaXNWZWN0b3IgPT0gMSk6CisgIC8vLyAgIE51bUVsZW1lbnRzOiAxNjsKKyAgLy8vICAgU2l6ZU9mRWxlbWVudDogMTY7CisgIC8vLyAgIEFkZHJlc3NTcGFjZTogMjM7CisgIHN0YXRpYyBjb25zdCBjb25zdGV4cHIgQml0RmllbGRJbmZvIFBvaW50ZXJWZWN0b3JFbGVtZW50c0ZpZWxkSW5mb3sxNiwgMH07CisgIHN0YXRpYyBjb25zdCBjb25zdGV4cHIgQml0RmllbGRJbmZvIFBvaW50ZXJWZWN0b3JTaXplRmllbGRJbmZveworICAgICAgMTYsCisgICAgICBQb2ludGVyVmVjdG9yRWxlbWVudHNGaWVsZEluZm9bMV0gKyBQb2ludGVyVmVjdG9yRWxlbWVudHNGaWVsZEluZm9bMF19OworICBzdGF0aWMgY29uc3QgY29uc3RleHByIEJpdEZpZWxkSW5mbyBQb2ludGVyVmVjdG9yQWRkcmVzc1NwYWNlRmllbGRJbmZveworICAgICAgMjMsIFBvaW50ZXJWZWN0b3JTaXplRmllbGRJbmZvWzFdICsgUG9pbnRlclZlY3RvclNpemVGaWVsZEluZm9bMF19OworCisgIHVpbnQ2NF90IElzUG9pbnRlciA6IDE7CisgIHVpbnQ2NF90IElzVmVjdG9yIDogMTsKKyAgdWludDY0X3QgUmF3RGF0YSA6IDYyOworCisgIHN0YXRpYyB1aW50NjRfdCBnZXRNYXNrKGNvbnN0IEJpdEZpZWxkSW5mbyBGaWVsZEluZm8pIHsKKyAgICBjb25zdCBpbnQgRmllbGRTaXplSW5CaXRzID0gRmllbGRJbmZvWzBdOworICAgIHJldHVybiAoKCh1aW50NjRfdCkxKSA8PCBGaWVsZFNpemVJbkJpdHMpIC0gMTsKKyAgfQorICBzdGF0aWMgdWludDY0X3QgbWFza0FuZFNoaWZ0KHVpbnQ2NF90IFZhbCwgdWludDY0X3QgTWFzaywgdWludDhfdCBTaGlmdCkgeworICAgIGFzc2VydChWYWwgPD0gTWFzayAmJiAiVmFsdWUgdG9vIGxhcmdlIGZvciBmaWVsZCIpOworICAgIHJldHVybiAoVmFsICYgTWFzaykgPDwgU2hpZnQ7CisgIH0KKyAgc3RhdGljIHVpbnQ2NF90IG1hc2tBbmRTaGlmdCh1aW50NjRfdCBWYWwsIGNvbnN0IEJpdEZpZWxkSW5mbyBGaWVsZEluZm8pIHsKKyAgICByZXR1cm4gbWFza0FuZFNoaWZ0KFZhbCwgZ2V0TWFzayhGaWVsZEluZm8pLCBGaWVsZEluZm9bMV0pOworICB9CisgIHVpbnQ2NF90IGdldEZpZWxkVmFsdWUoY29uc3QgQml0RmllbGRJbmZvIEZpZWxkSW5mbykgY29uc3QgeworICAgIHJldHVybiBnZXRNYXNrKEZpZWxkSW5mbykgJiAoUmF3RGF0YSA+PiBGaWVsZEluZm9bMV0pOworICB9CisKKyAgdm9pZCBpbml0KGJvb2wgSXNQb2ludGVyLCBib29sIElzVmVjdG9yLCB1aW50MTZfdCBOdW1FbGVtZW50cywKKyAgICAgICAgICAgIHVuc2lnbmVkIFNpemVJbkJpdHMsIHVuc2lnbmVkIEFkZHJlc3NTcGFjZSkgeworICAgIHRoaXMtPklzUG9pbnRlciA9IElzUG9pbnRlcjsKKyAgICB0aGlzLT5Jc1ZlY3RvciA9IElzVmVjdG9yOworICAgIGlmICghSXNWZWN0b3IpIHsKKyAgICAgIGlmICghSXNQb2ludGVyKQorICAgICAgICBSYXdEYXRhID0gbWFza0FuZFNoaWZ0KFNpemVJbkJpdHMsIFNjYWxhclNpemVGaWVsZEluZm8pOworICAgICAgZWxzZQorICAgICAgICBSYXdEYXRhID0gbWFza0FuZFNoaWZ0KFNpemVJbkJpdHMsIFBvaW50ZXJTaXplRmllbGRJbmZvKSB8CisgICAgICAgICAgICAgICAgICBtYXNrQW5kU2hpZnQoQWRkcmVzc1NwYWNlLCBQb2ludGVyQWRkcmVzc1NwYWNlRmllbGRJbmZvKTsKKyAgICB9IGVsc2UgeworICAgICAgYXNzZXJ0KE51bUVsZW1lbnRzID4gMSAmJiAiaW52YWxpZCBudW1iZXIgb2YgdmVjdG9yIGVsZW1lbnRzIik7CisgICAgICBpZiAoIUlzUG9pbnRlcikKKyAgICAgICAgUmF3RGF0YSA9IG1hc2tBbmRTaGlmdChOdW1FbGVtZW50cywgVmVjdG9yRWxlbWVudHNGaWVsZEluZm8pIHwKKyAgICAgICAgICAgICAgICAgIG1hc2tBbmRTaGlmdChTaXplSW5CaXRzLCBWZWN0b3JTaXplRmllbGRJbmZvKTsKKyAgICAgIGVsc2UKKyAgICAgICAgUmF3RGF0YSA9CisgICAgICAgICAgICBtYXNrQW5kU2hpZnQoTnVtRWxlbWVudHMsIFBvaW50ZXJWZWN0b3JFbGVtZW50c0ZpZWxkSW5mbykgfAorICAgICAgICAgICAgbWFza0FuZFNoaWZ0KFNpemVJbkJpdHMsIFBvaW50ZXJWZWN0b3JTaXplRmllbGRJbmZvKSB8CisgICAgICAgICAgICBtYXNrQW5kU2hpZnQoQWRkcmVzc1NwYWNlLCBQb2ludGVyVmVjdG9yQWRkcmVzc1NwYWNlRmllbGRJbmZvKTsKKyAgICB9CisgIH0KK307CisKK2lubGluZSByYXdfb3N0cmVhbSYgb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IExMVCAmVHkpIHsKKyAgVHkucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKK3RlbXBsYXRlPD4gc3RydWN0IERlbnNlTWFwSW5mbzxMTFQ+IHsKKyAgc3RhdGljIGlubGluZSBMTFQgZ2V0RW1wdHlLZXkoKSB7CisgICAgTExUIEludmFsaWQ7CisgICAgSW52YWxpZC5Jc1BvaW50ZXIgPSB0cnVlOworICAgIHJldHVybiBJbnZhbGlkOworICB9CisgIHN0YXRpYyBpbmxpbmUgTExUIGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICBMTFQgSW52YWxpZDsKKyAgICBJbnZhbGlkLklzVmVjdG9yID0gdHJ1ZTsKKyAgICByZXR1cm4gSW52YWxpZDsKKyAgfQorICBzdGF0aWMgaW5saW5lIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBMTFQgJlR5KSB7CisgICAgdWludDY0X3QgVmFsID0gKCh1aW50NjRfdClUeS5SYXdEYXRhKSA8PCAyIHwgKCh1aW50NjRfdClUeS5Jc1BvaW50ZXIpIDw8IDEgfAorICAgICAgICAgICAgICAgICAgICgodWludDY0X3QpVHkuSXNWZWN0b3IpOworICAgIHJldHVybiBEZW5zZU1hcEluZm88dWludDY0X3Q+OjpnZXRIYXNoVmFsdWUoVmFsKTsKKyAgfQorICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IExMVCAmTEhTLCBjb25zdCBMTFQgJlJIUykgeworICAgIHJldHVybiBMSFMgPT0gUkhTOworICB9Cit9OworCit9CisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfTE9XTEVWRUxUWVBFSU1QTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTUQ1LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTUQ1LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmMwZGM3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NRDUuaApAQCAtMCwwICsxLDEyMiBAQAorLyogLSotIEMrKyAtKi0KKyAqIFRoaXMgY29kZSBpcyBkZXJpdmVkIGZyb20gKG9yaWdpbmFsIGxpY2Vuc2UgZm9sbG93cyk6CisgKgorICogVGhpcyBpcyBhbiBPcGVuU1NMLWNvbXBhdGlibGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIFJTQSBEYXRhIFNlY3VyaXR5LCBJbmMuCisgKiBNRDUgTWVzc2FnZS1EaWdlc3QgQWxnb3JpdGhtIChSRkMgMTMyMSkuCisgKgorICogSG9tZXBhZ2U6CisgKiBodHRwOi8vb3BlbndhbGwuaW5mby93aWtpL3Blb3BsZS9zb2xhci9zb2Z0d2FyZS9wdWJsaWMtZG9tYWluLXNvdXJjZS1jb2RlL21kNQorICoKKyAqIEF1dGhvcjoKKyAqIEFsZXhhbmRlciBQZXNseWFrLCBiZXR0ZXIga25vd24gYXMgU29sYXIgRGVzaWduZXIgPHNvbGFyIGF0IG9wZW53YWxsLmNvbT4KKyAqCisgKiBUaGlzIHNvZnR3YXJlIHdhcyB3cml0dGVuIGJ5IEFsZXhhbmRlciBQZXNseWFrIGluIDIwMDEuICBObyBjb3B5cmlnaHQgaXMKKyAqIGNsYWltZWQsIGFuZCB0aGUgc29mdHdhcmUgaXMgaGVyZWJ5IHBsYWNlZCBpbiB0aGUgcHVibGljIGRvbWFpbi4KKyAqIEluIGNhc2UgdGhpcyBhdHRlbXB0IHRvIGRpc2NsYWltIGNvcHlyaWdodCBhbmQgcGxhY2UgdGhlIHNvZnR3YXJlIGluIHRoZQorICogcHVibGljIGRvbWFpbiBpcyBkZWVtZWQgbnVsbCBhbmQgdm9pZCwgdGhlbiB0aGUgc29mdHdhcmUgaXMKKyAqIENvcHlyaWdodCAoYykgMjAwMSBBbGV4YW5kZXIgUGVzbHlhayBhbmQgaXQgaXMgaGVyZWJ5IHJlbGVhc2VkIHRvIHRoZQorICogZ2VuZXJhbCBwdWJsaWMgdW5kZXIgdGhlIGZvbGxvd2luZyB0ZXJtczoKKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZC4KKyAqCisgKiBUaGVyZSdzIEFCU09MVVRFTFkgTk8gV0FSUkFOVFksIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqCisgKiBTZWUgbWQ1LmMgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgKi8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfTUQ1X0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX01ENV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFN0cmluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FbmRpYW4uaCIKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheVJlZjsKKworY2xhc3MgTUQ1IHsKKyAgLy8gQW55IDMyLWJpdCBvciB3aWRlciB1bnNpZ25lZCBpbnRlZ2VyIGRhdGEgdHlwZSB3aWxsIGRvLgorICB0eXBlZGVmIHVpbnQzMl90IE1ENV91MzJwbHVzOworCisgIE1ENV91MzJwbHVzIGEgPSAweDY3NDUyMzAxOworICBNRDVfdTMycGx1cyBiID0gMHhlZmNkYWI4OTsKKyAgTUQ1X3UzMnBsdXMgYyA9IDB4OThiYWRjZmU7CisgIE1ENV91MzJwbHVzIGQgPSAweDEwMzI1NDc2OworICBNRDVfdTMycGx1cyBoaSA9IDA7CisgIE1ENV91MzJwbHVzIGxvID0gMDsKKyAgdWludDhfdCBidWZmZXJbNjRdOworICBNRDVfdTMycGx1cyBibG9ja1sxNl07CisKK3B1YmxpYzoKKyAgc3RydWN0IE1ENVJlc3VsdCB7CisgICAgc3RkOjphcnJheTx1aW50OF90LCAxNj4gQnl0ZXM7CisKKyAgICBvcGVyYXRvciBzdGQ6OmFycmF5PHVpbnQ4X3QsIDE2PigpIGNvbnN0IHsgcmV0dXJuIEJ5dGVzOyB9CisKKyAgICBjb25zdCB1aW50OF90ICZvcGVyYXRvcltdKHNpemVfdCBJKSBjb25zdCB7IHJldHVybiBCeXRlc1tJXTsgfQorICAgIHVpbnQ4X3QgJm9wZXJhdG9yW10oc2l6ZV90IEkpIHsgcmV0dXJuIEJ5dGVzW0ldOyB9CisKKyAgICBTbWFsbFN0cmluZzwzMj4gZGlnZXN0KCkgY29uc3Q7CisKKyAgICB1aW50NjRfdCBsb3coKSBjb25zdCB7CisgICAgICAvLyBPdXIgTUQ1IGltcGxlbWVudGF0aW9uIHJldHVybnMgdGhlIHJlc3VsdCBpbiBsaXR0bGUgZW5kaWFuLCBzbyB0aGUgbG93CisgICAgICAvLyB3b3JkIGlzIGZpcnN0LgorICAgICAgdXNpbmcgbmFtZXNwYWNlIHN1cHBvcnQ7CisgICAgICByZXR1cm4gZW5kaWFuOjpyZWFkPHVpbnQ2NF90LCBsaXR0bGUsIHVuYWxpZ25lZD4oQnl0ZXMuZGF0YSgpKTsKKyAgICB9CisKKyAgICB1aW50NjRfdCBoaWdoKCkgY29uc3QgeworICAgICAgdXNpbmcgbmFtZXNwYWNlIHN1cHBvcnQ7CisgICAgICByZXR1cm4gZW5kaWFuOjpyZWFkPHVpbnQ2NF90LCBsaXR0bGUsIHVuYWxpZ25lZD4oQnl0ZXMuZGF0YSgpICsgOCk7CisgICAgfQorICAgIHN0ZDo6cGFpcjx1aW50NjRfdCwgdWludDY0X3Q+IHdvcmRzKCkgY29uc3QgeworICAgICAgdXNpbmcgbmFtZXNwYWNlIHN1cHBvcnQ7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoaGlnaCgpLCBsb3coKSk7CisgICAgfQorICB9OworCisgIE1ENSgpOworCisgIC8vLyBcYnJpZWYgVXBkYXRlcyB0aGUgaGFzaCBmb3IgdGhlIGJ5dGUgc3RyZWFtIHByb3ZpZGVkLgorICB2b2lkIHVwZGF0ZShBcnJheVJlZjx1aW50OF90PiBEYXRhKTsKKworICAvLy8gXGJyaWVmIFVwZGF0ZXMgdGhlIGhhc2ggZm9yIHRoZSBTdHJpbmdSZWYgcHJvdmlkZWQuCisgIHZvaWQgdXBkYXRlKFN0cmluZ1JlZiBTdHIpOworCisgIC8vLyBcYnJpZWYgRmluaXNoZXMgb2ZmIHRoZSBoYXNoIGFuZCBwdXRzIHRoZSByZXN1bHQgaW4gcmVzdWx0LgorICB2b2lkIGZpbmFsKE1ENVJlc3VsdCAmUmVzdWx0KTsKKworICAvLy8gXGJyaWVmIFRyYW5zbGF0ZXMgdGhlIGJ5dGVzIGluIFxwIFJlcyB0byBhIGhleCBzdHJpbmcgdGhhdCBpcworICAvLy8gZGVwb3NpdGVkIGludG8gXHAgU3RyLiBUaGUgcmVzdWx0IHdpbGwgYmUgb2YgbGVuZ3RoIDMyLgorICBzdGF0aWMgdm9pZCBzdHJpbmdpZnlSZXN1bHQoTUQ1UmVzdWx0ICZSZXN1bHQsIFNtYWxsU3RyaW5nPDMyPiAmU3RyKTsKKworICAvLy8gXGJyaWVmIENvbXB1dGVzIHRoZSBoYXNoIGZvciBhIGdpdmVuIGJ5dGVzLgorICBzdGF0aWMgc3RkOjphcnJheTx1aW50OF90LCAxNj4gaGFzaChBcnJheVJlZjx1aW50OF90PiBEYXRhKTsKKworcHJpdmF0ZToKKyAgY29uc3QgdWludDhfdCAqYm9keShBcnJheVJlZjx1aW50OF90PiBEYXRhKTsKK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3QgTUQ1OjpNRDVSZXN1bHQgJkxIUywgY29uc3QgTUQ1OjpNRDVSZXN1bHQgJlJIUykgeworICByZXR1cm4gTEhTLkJ5dGVzID09IFJIUy5CeXRlczsKK30KKworLy8vIEhlbHBlciB0byBjb21wdXRlIGFuZCByZXR1cm4gbG93ZXIgNjQgYml0cyBvZiB0aGUgZ2l2ZW4gc3RyaW5nJ3MgTUQ1IGhhc2guCitpbmxpbmUgdWludDY0X3QgTUQ1SGFzaChTdHJpbmdSZWYgU3RyKSB7CisgIHVzaW5nIG5hbWVzcGFjZSBzdXBwb3J0OworCisgIE1ENSBIYXNoOworICBIYXNoLnVwZGF0ZShTdHIpOworICBNRDU6Ok1ENVJlc3VsdCBSZXN1bHQ7CisgIEhhc2guZmluYWwoUmVzdWx0KTsKKyAgLy8gUmV0dXJuIHRoZSBsZWFzdCBzaWduaWZpY2FudCB3b3JkLgorICByZXR1cm4gUmVzdWx0LmxvdygpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX01ENV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTWFjaGluZVZhbHVlVHlwZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L01hY2hpbmVWYWx1ZVR5cGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTJkZWEwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L01hY2hpbmVWYWx1ZVR5cGUuaApAQCAtMCwwICsxLDEwNTggQEAKKy8vPT09LSBTdXBwb3J0L01hY2hpbmVWYWx1ZVR5cGUuaCAtIE1hY2hpbmUtTGV2ZWwgdHlwZXMgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIHNldCBvZiBtYWNoaW5lLWxldmVsIHRhcmdldCBpbmRlcGVuZGVudCB0eXBlcyB3aGljaAorLy8gbGVnYWwgdmFsdWVzIGluIHRoZSBjb2RlIGdlbmVyYXRvciB1c2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfTUFDSElORVZBTFVFVFlQRV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9NQUNISU5FVkFMVUVUWVBFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworICBjbGFzcyBUeXBlOworCisgIC8vLyBNYWNoaW5lIFZhbHVlIFR5cGUuIEV2ZXJ5IHR5cGUgdGhhdCBpcyBzdXBwb3J0ZWQgbmF0aXZlbHkgYnkgc29tZQorICAvLy8gcHJvY2Vzc29yIHRhcmdldGVkIGJ5IExMVk0gb2NjdXJzIGhlcmUuIFRoaXMgbWVhbnMgdGhhdCBhbnkgbGVnYWwgdmFsdWUKKyAgLy8vIHR5cGUgY2FuIGJlIHJlcHJlc2VudGVkIGJ5IGFuIE1WVC4KKyAgY2xhc3MgTVZUIHsKKyAgcHVibGljOgorICAgIGVudW0gU2ltcGxlVmFsdWVUeXBlIDogdWludDhfdCB7CisgICAgICAvLyBTaW1wbGUgdmFsdWUgdHlwZXMgdGhhdCBhcmVuJ3QgZXhwbGljaXRseSBwYXJ0IG9mIHRoaXMgZW51bWVyYXRpb24KKyAgICAgIC8vIGFyZSBjb25zaWRlcmVkIGV4dGVuZGVkIHZhbHVlIHR5cGVzLgorICAgICAgSU5WQUxJRF9TSU1QTEVfVkFMVUVfVFlQRSA9IDAsCisKKyAgICAgIC8vIElmIHlvdSBjaGFuZ2UgdGhpcyBudW1iZXJpbmcsIHlvdSBtdXN0IGNoYW5nZSB0aGUgdmFsdWVzIGluCisgICAgICAvLyBWYWx1ZVR5cGVzLnRkIGFzIHdlbGwhCisgICAgICBPdGhlciAgICAgICAgICA9ICAgMSwgICAvLyBUaGlzIGlzIGEgbm9uLXN0YW5kYXJkIHZhbHVlCisgICAgICBpMSAgICAgICAgICAgICA9ICAgMiwgICAvLyBUaGlzIGlzIGEgMSBiaXQgaW50ZWdlciB2YWx1ZQorICAgICAgaTggICAgICAgICAgICAgPSAgIDMsICAgLy8gVGhpcyBpcyBhbiA4IGJpdCBpbnRlZ2VyIHZhbHVlCisgICAgICBpMTYgICAgICAgICAgICA9ICAgNCwgICAvLyBUaGlzIGlzIGEgMTYgYml0IGludGVnZXIgdmFsdWUKKyAgICAgIGkzMiAgICAgICAgICAgID0gICA1LCAgIC8vIFRoaXMgaXMgYSAzMiBiaXQgaW50ZWdlciB2YWx1ZQorICAgICAgaTY0ICAgICAgICAgICAgPSAgIDYsICAgLy8gVGhpcyBpcyBhIDY0IGJpdCBpbnRlZ2VyIHZhbHVlCisgICAgICBpMTI4ICAgICAgICAgICA9ICAgNywgICAvLyBUaGlzIGlzIGEgMTI4IGJpdCBpbnRlZ2VyIHZhbHVlCisKKyAgICAgIEZJUlNUX0lOVEVHRVJfVkFMVUVUWVBFID0gaTEsCisgICAgICBMQVNUX0lOVEVHRVJfVkFMVUVUWVBFICA9IGkxMjgsCisKKyAgICAgIGYxNiAgICAgICAgICAgID0gICA4LCAgIC8vIFRoaXMgaXMgYSAxNiBiaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUKKyAgICAgIGYzMiAgICAgICAgICAgID0gICA5LCAgIC8vIFRoaXMgaXMgYSAzMiBiaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUKKyAgICAgIGY2NCAgICAgICAgICAgID0gIDEwLCAgIC8vIFRoaXMgaXMgYSA2NCBiaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUKKyAgICAgIGY4MCAgICAgICAgICAgID0gIDExLCAgIC8vIFRoaXMgaXMgYSA4MCBiaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUKKyAgICAgIGYxMjggICAgICAgICAgID0gIDEyLCAgIC8vIFRoaXMgaXMgYSAxMjggYml0IGZsb2F0aW5nIHBvaW50IHZhbHVlCisgICAgICBwcGNmMTI4ICAgICAgICA9ICAxMywgICAvLyBUaGlzIGlzIGEgUFBDIDEyOC1iaXQgZmxvYXRpbmcgcG9pbnQgdmFsdWUKKworICAgICAgRklSU1RfRlBfVkFMVUVUWVBFID0gZjE2LAorICAgICAgTEFTVF9GUF9WQUxVRVRZUEUgID0gcHBjZjEyOCwKKworICAgICAgdjFpMSAgICAgICAgICAgPSAgMTQsICAgLy8gICAgMSB4IGkxCisgICAgICB2MmkxICAgICAgICAgICA9ICAxNSwgICAvLyAgICAyIHggaTEKKyAgICAgIHY0aTEgICAgICAgICAgID0gIDE2LCAgIC8vICAgIDQgeCBpMQorICAgICAgdjhpMSAgICAgICAgICAgPSAgMTcsICAgLy8gICAgOCB4IGkxCisgICAgICB2MTZpMSAgICAgICAgICA9ICAxOCwgICAvLyAgIDE2IHggaTEKKyAgICAgIHYzMmkxICAgICAgICAgID0gIDE5LCAgIC8vICAgMzIgeCBpMQorICAgICAgdjY0aTEgICAgICAgICAgPSAgMjAsICAgLy8gICA2NCB4IGkxCisgICAgICB2MTI4aTEgICAgICAgICA9ICAyMSwgICAvLyAgMTI4IHggaTEKKyAgICAgIHY1MTJpMSAgICAgICAgID0gIDIyLCAgIC8vICA1MTIgeCBpMQorICAgICAgdjEwMjRpMSAgICAgICAgPSAgMjMsICAgLy8gMTAyNCB4IGkxCisKKyAgICAgIHYxaTggICAgICAgICAgID0gIDI0LCAgIC8vICAxIHggaTgKKyAgICAgIHYyaTggICAgICAgICAgID0gIDI1LCAgIC8vICAyIHggaTgKKyAgICAgIHY0aTggICAgICAgICAgID0gIDI2LCAgIC8vICA0IHggaTgKKyAgICAgIHY4aTggICAgICAgICAgID0gIDI3LCAgIC8vICA4IHggaTgKKyAgICAgIHYxNmk4ICAgICAgICAgID0gIDI4LCAgIC8vIDE2IHggaTgKKyAgICAgIHYzMmk4ICAgICAgICAgID0gIDI5LCAgIC8vIDMyIHggaTgKKyAgICAgIHY2NGk4ICAgICAgICAgID0gIDMwLCAgIC8vIDY0IHggaTgKKyAgICAgIHYxMjhpOCAgICAgICAgID0gIDMxLCAgIC8vMTI4IHggaTgKKyAgICAgIHYyNTZpOCAgICAgICAgID0gIDMyLCAgIC8vMjU2IHggaTgKKworICAgICAgdjFpMTYgICAgICAgICAgPSAgMzMsICAgLy8gIDEgeCBpMTYKKyAgICAgIHYyaTE2ICAgICAgICAgID0gIDM0LCAgIC8vICAyIHggaTE2CisgICAgICB2NGkxNiAgICAgICAgICA9ICAzNSwgICAvLyAgNCB4IGkxNgorICAgICAgdjhpMTYgICAgICAgICAgPSAgMzYsICAgLy8gIDggeCBpMTYKKyAgICAgIHYxNmkxNiAgICAgICAgID0gIDM3LCAgIC8vIDE2IHggaTE2CisgICAgICB2MzJpMTYgICAgICAgICA9ICAzOCwgICAvLyAzMiB4IGkxNgorICAgICAgdjY0aTE2ICAgICAgICAgPSAgMzksICAgLy8gNjQgeCBpMTYKKyAgICAgIHYxMjhpMTYgICAgICAgID0gIDQwLCAgIC8vMTI4IHggaTE2CisKKyAgICAgIHYxaTMyICAgICAgICAgID0gIDQxLCAgIC8vICAxIHggaTMyCisgICAgICB2MmkzMiAgICAgICAgICA9ICA0MiwgICAvLyAgMiB4IGkzMgorICAgICAgdjRpMzIgICAgICAgICAgPSAgNDMsICAgLy8gIDQgeCBpMzIKKyAgICAgIHY4aTMyICAgICAgICAgID0gIDQ0LCAgIC8vICA4IHggaTMyCisgICAgICB2MTZpMzIgICAgICAgICA9ICA0NSwgICAvLyAxNiB4IGkzMgorICAgICAgdjMyaTMyICAgICAgICAgPSAgNDYsICAgLy8gMzIgeCBpMzIKKyAgICAgIHY2NGkzMiAgICAgICAgID0gIDQ3LCAgIC8vIDY0IHggaTMyCisKKyAgICAgIHYxaTY0ICAgICAgICAgID0gIDQ4LCAgIC8vICAxIHggaTY0CisgICAgICB2Mmk2NCAgICAgICAgICA9ICA0OSwgICAvLyAgMiB4IGk2NAorICAgICAgdjRpNjQgICAgICAgICAgPSAgNTAsICAgLy8gIDQgeCBpNjQKKyAgICAgIHY4aTY0ICAgICAgICAgID0gIDUxLCAgIC8vICA4IHggaTY0CisgICAgICB2MTZpNjQgICAgICAgICA9ICA1MiwgICAvLyAxNiB4IGk2NAorICAgICAgdjMyaTY0ICAgICAgICAgPSAgNTMsICAgLy8gMzIgeCBpNjQKKworICAgICAgdjFpMTI4ICAgICAgICAgPSAgNTQsICAgLy8gIDEgeCBpMTI4CisKKyAgICAgIC8vIFNjYWxhYmxlIGludGVnZXIgdHlwZXMKKyAgICAgIG54djFpMSAgICAgICAgID0gIDU1LCAgIC8vIG4geCAgMSB4IGkxCisgICAgICBueHYyaTEgICAgICAgICA9ICA1NiwgICAvLyBuIHggIDIgeCBpMQorICAgICAgbnh2NGkxICAgICAgICAgPSAgNTcsICAgLy8gbiB4ICA0IHggaTEKKyAgICAgIG54djhpMSAgICAgICAgID0gIDU4LCAgIC8vIG4geCAgOCB4IGkxCisgICAgICBueHYxNmkxICAgICAgICA9ICA1OSwgICAvLyBuIHggMTYgeCBpMQorICAgICAgbnh2MzJpMSAgICAgICAgPSAgNjAsICAgLy8gbiB4IDMyIHggaTEKKworICAgICAgbnh2MWk4ICAgICAgICAgPSAgNjEsICAgLy8gbiB4ICAxIHggaTgKKyAgICAgIG54djJpOCAgICAgICAgID0gIDYyLCAgIC8vIG4geCAgMiB4IGk4CisgICAgICBueHY0aTggICAgICAgICA9ICA2MywgICAvLyBuIHggIDQgeCBpOAorICAgICAgbnh2OGk4ICAgICAgICAgPSAgNjQsICAgLy8gbiB4ICA4IHggaTgKKyAgICAgIG54djE2aTggICAgICAgID0gIDY1LCAgIC8vIG4geCAxNiB4IGk4CisgICAgICBueHYzMmk4ICAgICAgICA9ICA2NiwgICAvLyBuIHggMzIgeCBpOAorCisgICAgICBueHYxaTE2ICAgICAgICA9ICA2NywgICAvLyBuIHggIDEgeCBpMTYKKyAgICAgIG54djJpMTYgICAgICAgID0gIDY4LCAgIC8vIG4geCAgMiB4IGkxNgorICAgICAgbnh2NGkxNiAgICAgICAgPSAgNjksICAgLy8gbiB4ICA0IHggaTE2CisgICAgICBueHY4aTE2ICAgICAgICA9ICA3MCwgICAvLyBuIHggIDggeCBpMTYKKyAgICAgIG54djE2aTE2ICAgICAgID0gIDcxLCAgIC8vIG4geCAxNiB4IGkxNgorICAgICAgbnh2MzJpMTYgICAgICAgPSAgNzIsICAgLy8gbiB4IDMyIHggaTE2CisKKyAgICAgIG54djFpMzIgICAgICAgID0gIDczLCAgIC8vIG4geCAgMSB4IGkzMgorICAgICAgbnh2MmkzMiAgICAgICAgPSAgNzQsICAgLy8gbiB4ICAyIHggaTMyCisgICAgICBueHY0aTMyICAgICAgICA9ICA3NSwgICAvLyBuIHggIDQgeCBpMzIKKyAgICAgIG54djhpMzIgICAgICAgID0gIDc2LCAgIC8vIG4geCAgOCB4IGkzMgorICAgICAgbnh2MTZpMzIgICAgICAgPSAgNzcsICAgLy8gbiB4IDE2IHggaTMyCisgICAgICBueHYzMmkzMiAgICAgICA9ICA3OCwgICAvLyBuIHggMzIgeCBpMzIKKworICAgICAgbnh2MWk2NCAgICAgICAgPSAgNzksICAgLy8gbiB4ICAxIHggaTY0CisgICAgICBueHYyaTY0ICAgICAgICA9ICA4MCwgICAvLyBuIHggIDIgeCBpNjQKKyAgICAgIG54djRpNjQgICAgICAgID0gIDgxLCAgIC8vIG4geCAgNCB4IGk2NAorICAgICAgbnh2OGk2NCAgICAgICAgPSAgODIsICAgLy8gbiB4ICA4IHggaTY0CisgICAgICBueHYxNmk2NCAgICAgICA9ICA4MywgICAvLyBuIHggMTYgeCBpNjQKKyAgICAgIG54djMyaTY0ICAgICAgID0gIDg0LCAgIC8vIG4geCAzMiB4IGk2NAorCisgICAgICBGSVJTVF9JTlRFR0VSX1ZFQ1RPUl9WQUxVRVRZUEUgPSB2MWkxLAorICAgICAgTEFTVF9JTlRFR0VSX1ZFQ1RPUl9WQUxVRVRZUEUgPSBueHYzMmk2NCwKKworICAgICAgRklSU1RfSU5URUdFUl9TQ0FMQUJMRV9WQUxVRVRZUEUgPSBueHYxaTEsCisgICAgICBMQVNUX0lOVEVHRVJfU0NBTEFCTEVfVkFMVUVUWVBFID0gbnh2MzJpNjQsCisKKyAgICAgIHYyZjE2ICAgICAgICAgID0gIDg1LCAgIC8vICAyIHggZjE2CisgICAgICB2NGYxNiAgICAgICAgICA9ICA4NiwgICAvLyAgNCB4IGYxNgorICAgICAgdjhmMTYgICAgICAgICAgPSAgODcsICAgLy8gIDggeCBmMTYKKyAgICAgIHYxZjMyICAgICAgICAgID0gIDg4LCAgIC8vICAxIHggZjMyCisgICAgICB2MmYzMiAgICAgICAgICA9ICA4OSwgICAvLyAgMiB4IGYzMgorICAgICAgdjRmMzIgICAgICAgICAgPSAgOTAsICAgLy8gIDQgeCBmMzIKKyAgICAgIHY4ZjMyICAgICAgICAgID0gIDkxLCAgIC8vICA4IHggZjMyCisgICAgICB2MTZmMzIgICAgICAgICA9ICA5MiwgICAvLyAxNiB4IGYzMgorICAgICAgdjFmNjQgICAgICAgICAgPSAgOTMsICAgLy8gIDEgeCBmNjQKKyAgICAgIHYyZjY0ICAgICAgICAgID0gIDk0LCAgIC8vICAyIHggZjY0CisgICAgICB2NGY2NCAgICAgICAgICA9ICA5NSwgICAvLyAgNCB4IGY2NAorICAgICAgdjhmNjQgICAgICAgICAgPSAgOTYsICAgLy8gIDggeCBmNjQKKworICAgICAgbnh2MmYxNiAgICAgICAgPSAgOTcsICAgLy8gbiB4ICAyIHggZjE2CisgICAgICBueHY0ZjE2ICAgICAgICA9ICA5OCwgICAvLyBuIHggIDQgeCBmMTYKKyAgICAgIG54djhmMTYgICAgICAgID0gIDk5LCAgIC8vIG4geCAgOCB4IGYxNgorICAgICAgbnh2MWYzMiAgICAgICAgPSAxMDAsICAgLy8gbiB4ICAxIHggZjMyCisgICAgICBueHYyZjMyICAgICAgICA9IDEwMSwgICAvLyBuIHggIDIgeCBmMzIKKyAgICAgIG54djRmMzIgICAgICAgID0gMTAyLCAgIC8vIG4geCAgNCB4IGYzMgorICAgICAgbnh2OGYzMiAgICAgICAgPSAxMDMsICAgLy8gbiB4ICA4IHggZjMyCisgICAgICBueHYxNmYzMiAgICAgICA9IDEwNCwgICAvLyBuIHggMTYgeCBmMzIKKyAgICAgIG54djFmNjQgICAgICAgID0gMTA1LCAgIC8vIG4geCAgMSB4IGY2NAorICAgICAgbnh2MmY2NCAgICAgICAgPSAxMDYsICAgLy8gbiB4ICAyIHggZjY0CisgICAgICBueHY0ZjY0ICAgICAgICA9IDEwNywgICAvLyBuIHggIDQgeCBmNjQKKyAgICAgIG54djhmNjQgICAgICAgID0gMTA4LCAgIC8vIG4geCAgOCB4IGY2NAorCisgICAgICBGSVJTVF9GUF9WRUNUT1JfVkFMVUVUWVBFID0gdjJmMTYsCisgICAgICBMQVNUX0ZQX1ZFQ1RPUl9WQUxVRVRZUEUgPSBueHY4ZjY0LAorCisgICAgICBGSVJTVF9GUF9TQ0FMQUJMRV9WQUxVRVRZUEUgPSBueHYyZjE2LAorICAgICAgTEFTVF9GUF9TQ0FMQUJMRV9WQUxVRVRZUEUgPSBueHY4ZjY0LAorCisgICAgICBGSVJTVF9WRUNUT1JfVkFMVUVUWVBFID0gdjFpMSwKKyAgICAgIExBU1RfVkVDVE9SX1ZBTFVFVFlQRSAgPSBueHY4ZjY0LAorCisgICAgICB4ODZtbXggICAgICAgICA9ICAxMDksICAgLy8gVGhpcyBpcyBhbiBYODYgTU1YIHZhbHVlCisKKyAgICAgIEdsdWUgICAgICAgICAgID0gIDExMCwgICAvLyBUaGlzIGdsdWVzIG5vZGVzIHRvZ2V0aGVyIGR1cmluZyBwcmUtUkEgc2NoZWQKKworICAgICAgaXNWb2lkICAgICAgICAgPSAgMTExLCAgIC8vIFRoaXMgaGFzIG5vIHZhbHVlCisKKyAgICAgIFVudHlwZWQgICAgICAgID0gIDExMiwgICAvLyBUaGlzIHZhbHVlIHRha2VzIGEgcmVnaXN0ZXIsIGJ1dCBoYXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bnNwZWNpZmllZCB0eXBlLiAgVGhlIHJlZ2lzdGVyIGNsYXNzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBiZSBkZXRlcm1pbmVkIGJ5IHRoZSBvcGNvZGUuCisKKyAgICAgIEV4Y2VwdFJlZiAgICAgID0gMTEzLCAgICAvLyBXZWJBc3NlbWJseSdzIGV4Y2VwdF9yZWYgdHlwZQorCisgICAgICBGSVJTVF9WQUxVRVRZUEUgPSAxLCAgICAgLy8gVGhpcyBpcyBhbHdheXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdC4KKyAgICAgIExBU1RfVkFMVUVUWVBFID0gIDExNCwgICAvLyBUaGlzIGFsd2F5cyByZW1haW5zIGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QuCisKKyAgICAgIC8vIFRoaXMgaXMgdGhlIGN1cnJlbnQgbWF4aW11bSBmb3IgTEFTVF9WQUxVRVRZUEUuCisgICAgICAvLyBNVlQ6Ok1BWF9BTExPV0VEX1ZBTFVFVFlQRSBpcyB1c2VkIGZvciBhc3NlcnRzIGFuZCB0byBzaXplIGJpdCB2ZWN0b3JzCisgICAgICAvLyBUaGlzIHZhbHVlIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi4KKyAgICAgIE1BWF9BTExPV0VEX1ZBTFVFVFlQRSA9IDEyOCwKKworICAgICAgLy8gQSB2YWx1ZSBvZiB0eXBlIGxsdm06OlRva2VuVHkKKyAgICAgIHRva2VuICAgICAgICAgID0gMjQ4LAorCisgICAgICAvLyBUaGlzIGlzIE1ETm9kZSBvciBNRFN0cmluZy4KKyAgICAgIE1ldGFkYXRhICAgICAgID0gMjQ5LAorCisgICAgICAvLyBBbiBpbnQgdmFsdWUgdGhlIHNpemUgb2YgdGhlIHBvaW50ZXIgb2YgdGhlIGN1cnJlbnQKKyAgICAgIC8vIHRhcmdldCB0byBhbnkgYWRkcmVzcyBzcGFjZS4gVGhpcyBtdXN0IG9ubHkgYmUgdXNlZCBpbnRlcm5hbCB0bworICAgICAgLy8gdGJsZ2VuLiBPdGhlciB0aGFuIGZvciBvdmVybG9hZGluZywgd2UgdHJlYXQgaVBUUkFueSB0aGUgc2FtZSBhcyBpUFRSLgorICAgICAgaVBUUkFueSAgICAgICAgPSAyNTAsCisKKyAgICAgIC8vIEEgdmVjdG9yIHdpdGggYW55IGxlbmd0aCBhbmQgZWxlbWVudCBzaXplLiBUaGlzIGlzIHVzZWQKKyAgICAgIC8vIGZvciBpbnRyaW5zaWNzIHRoYXQgaGF2ZSBvdmVybG9hZGluZ3MgYmFzZWQgb24gdmVjdG9yIHR5cGVzLgorICAgICAgLy8gVGhpcyBpcyBvbmx5IGZvciB0YmxnZW4ncyBjb25zdW1wdGlvbiEKKyAgICAgIHZBbnkgICAgICAgICAgID0gMjUxLAorCisgICAgICAvLyBBbnkgZmxvYXRpbmctcG9pbnQgb3IgdmVjdG9yIGZsb2F0aW5nLXBvaW50IHZhbHVlLiBUaGlzIGlzIHVzZWQKKyAgICAgIC8vIGZvciBpbnRyaW5zaWNzIHRoYXQgaGF2ZSBvdmVybG9hZGluZ3MgYmFzZWQgb24gZmxvYXRpbmctcG9pbnQgdHlwZXMuCisgICAgICAvLyBUaGlzIGlzIG9ubHkgZm9yIHRibGdlbidzIGNvbnN1bXB0aW9uIQorICAgICAgZkFueSAgICAgICAgICAgPSAyNTIsCisKKyAgICAgIC8vIEFuIGludGVnZXIgb3IgdmVjdG9yIGludGVnZXIgdmFsdWUgb2YgYW55IGJpdCB3aWR0aC4gVGhpcyBpcworICAgICAgLy8gdXNlZCBmb3IgaW50cmluc2ljcyB0aGF0IGhhdmUgb3ZlcmxvYWRpbmdzIGJhc2VkIG9uIGludGVnZXIgYml0IHdpZHRocy4KKyAgICAgIC8vIFRoaXMgaXMgb25seSBmb3IgdGJsZ2VuJ3MgY29uc3VtcHRpb24hCisgICAgICBpQW55ICAgICAgICAgICA9IDI1MywKKworICAgICAgLy8gQW4gaW50IHZhbHVlIHRoZSBzaXplIG9mIHRoZSBwb2ludGVyIG9mIHRoZSBjdXJyZW50CisgICAgICAvLyB0YXJnZXQuICBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgaW50ZXJuYWwgdG8gdGJsZ2VuIQorICAgICAgaVBUUiAgICAgICAgICAgPSAyNTQsCisKKyAgICAgIC8vIEFueSB0eXBlLiBUaGlzIGlzIHVzZWQgZm9yIGludHJpbnNpY3MgdGhhdCBoYXZlIG92ZXJsb2FkaW5ncy4KKyAgICAgIC8vIFRoaXMgaXMgb25seSBmb3IgdGJsZ2VuJ3MgY29uc3VtcHRpb24hCisgICAgICBBbnkgICAgICAgICAgICA9IDI1NQorICAgIH07CisKKyAgICBTaW1wbGVWYWx1ZVR5cGUgU2ltcGxlVHkgPSBJTlZBTElEX1NJTVBMRV9WQUxVRV9UWVBFOworCisgICAgLy8gQSBjbGFzcyB0byByZXByZXNlbnQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHZlY3RvcgorICAgIC8vCisgICAgLy8gRm9yIGZpeGVkLWxlbmd0aCB2ZWN0b3JzLCB0aGUgdG90YWwgbnVtYmVyIG9mIGVsZW1lbnRzIGlzIGVxdWFsIHRvICdNaW4nCisgICAgLy8gRm9yIHNjYWxhYmxlIHZlY3RvcnMsIHRoZSB0b3RhbCBudW1iZXIgb2YgZWxlbWVudHMgaXMgYSBtdWx0aXBsZSBvZiAnTWluJworICAgIGNsYXNzIEVsZW1lbnRDb3VudCB7CisgICAgcHVibGljOgorICAgICAgdW5zaWduZWQgTWluOworICAgICAgYm9vbCBTY2FsYWJsZTsKKworICAgICAgRWxlbWVudENvdW50KHVuc2lnbmVkIE1pbiwgYm9vbCBTY2FsYWJsZSkKKyAgICAgIDogTWluKE1pbiksIFNjYWxhYmxlKFNjYWxhYmxlKSB7fQorCisgICAgICBFbGVtZW50Q291bnQgb3BlcmF0b3IqKHVuc2lnbmVkIFJIUykgeworICAgICAgICByZXR1cm4geyBNaW4gKiBSSFMsIFNjYWxhYmxlIH07CisgICAgICB9CisKKyAgICAgIEVsZW1lbnRDb3VudCYgb3BlcmF0b3IqPSh1bnNpZ25lZCBSSFMpIHsKKyAgICAgICAgTWluICo9IFJIUzsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBFbGVtZW50Q291bnQgb3BlcmF0b3IvKHVuc2lnbmVkIFJIUykgeworICAgICAgICByZXR1cm4geyBNaW4gLyBSSFMsIFNjYWxhYmxlIH07CisgICAgICB9CisKKyAgICAgIEVsZW1lbnRDb3VudCYgb3BlcmF0b3IvPSh1bnNpZ25lZCBSSFMpIHsKKyAgICAgICAgTWluIC89IFJIUzsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgICAgfQorCisgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgRWxlbWVudENvdW50JiBSSFMpIHsKKyAgICAgICAgcmV0dXJuIE1pbiA9PSBSSFMuTWluICYmIFNjYWxhYmxlID09IFJIUy5TY2FsYWJsZTsKKyAgICAgIH0KKyAgICB9OworCisgICAgY29uc3RleHByIE1WVCgpID0gZGVmYXVsdDsKKyAgICBjb25zdGV4cHIgTVZUKFNpbXBsZVZhbHVlVHlwZSBTVlQpIDogU2ltcGxlVHkoU1ZUKSB7fQorCisgICAgYm9vbCBvcGVyYXRvcj4oY29uc3QgTVZUJiBTKSAgY29uc3QgeyByZXR1cm4gU2ltcGxlVHkgPiAgUy5TaW1wbGVUeTsgfQorICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IE1WVCYgUykgIGNvbnN0IHsgcmV0dXJuIFNpbXBsZVR5IDwgIFMuU2ltcGxlVHk7IH0KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTVZUJiBTKSBjb25zdCB7IHJldHVybiBTaW1wbGVUeSA9PSBTLlNpbXBsZVR5OyB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1WVCYgUykgY29uc3QgeyByZXR1cm4gU2ltcGxlVHkgIT0gUy5TaW1wbGVUeTsgfQorICAgIGJvb2wgb3BlcmF0b3I+PShjb25zdCBNVlQmIFMpIGNvbnN0IHsgcmV0dXJuIFNpbXBsZVR5ID49IFMuU2ltcGxlVHk7IH0KKyAgICBib29sIG9wZXJhdG9yPD0oY29uc3QgTVZUJiBTKSBjb25zdCB7IHJldHVybiBTaW1wbGVUeSA8PSBTLlNpbXBsZVR5OyB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHZhbGlkIHNpbXBsZSB2YWx1ZXR5cGUuCisgICAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeworICAgICAgcmV0dXJuIChTaW1wbGVUeSA+PSBNVlQ6OkZJUlNUX1ZBTFVFVFlQRSAmJgorICAgICAgICAgICAgICBTaW1wbGVUeSA8IE1WVDo6TEFTVF9WQUxVRVRZUEUpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgRlAgb3IgYSB2ZWN0b3IgRlAgdHlwZS4KKyAgICBib29sIGlzRmxvYXRpbmdQb2ludCgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoKFNpbXBsZVR5ID49IE1WVDo6RklSU1RfRlBfVkFMVUVUWVBFICYmCisgICAgICAgICAgICAgICBTaW1wbGVUeSA8PSBNVlQ6OkxBU1RfRlBfVkFMVUVUWVBFKSB8fAorICAgICAgICAgICAgICAoU2ltcGxlVHkgPj0gTVZUOjpGSVJTVF9GUF9WRUNUT1JfVkFMVUVUWVBFICYmCisgICAgICAgICAgICAgICBTaW1wbGVUeSA8PSBNVlQ6OkxBU1RfRlBfVkVDVE9SX1ZBTFVFVFlQRSkpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIGludGVnZXIgb3IgYSB2ZWN0b3IgaW50ZWdlciB0eXBlLgorICAgIGJvb2wgaXNJbnRlZ2VyKCkgY29uc3QgeworICAgICAgcmV0dXJuICgoU2ltcGxlVHkgPj0gTVZUOjpGSVJTVF9JTlRFR0VSX1ZBTFVFVFlQRSAmJgorICAgICAgICAgICAgICAgU2ltcGxlVHkgPD0gTVZUOjpMQVNUX0lOVEVHRVJfVkFMVUVUWVBFKSB8fAorICAgICAgICAgICAgICAoU2ltcGxlVHkgPj0gTVZUOjpGSVJTVF9JTlRFR0VSX1ZFQ1RPUl9WQUxVRVRZUEUgJiYKKyAgICAgICAgICAgICAgIFNpbXBsZVR5IDw9IE1WVDo6TEFTVF9JTlRFR0VSX1ZFQ1RPUl9WQUxVRVRZUEUpKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhbiBpbnRlZ2VyLCBub3QgaW5jbHVkaW5nIHZlY3RvcnMuCisgICAgYm9vbCBpc1NjYWxhckludGVnZXIoKSBjb25zdCB7CisgICAgICByZXR1cm4gKFNpbXBsZVR5ID49IE1WVDo6RklSU1RfSU5URUdFUl9WQUxVRVRZUEUgJiYKKyAgICAgICAgICAgICAgU2ltcGxlVHkgPD0gTVZUOjpMQVNUX0lOVEVHRVJfVkFMVUVUWVBFKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIHZlY3RvciB2YWx1ZSB0eXBlLgorICAgIGJvb2wgaXNWZWN0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gKFNpbXBsZVR5ID49IE1WVDo6RklSU1RfVkVDVE9SX1ZBTFVFVFlQRSAmJgorICAgICAgICAgICAgICBTaW1wbGVUeSA8PSBNVlQ6OkxBU1RfVkVDVE9SX1ZBTFVFVFlQRSk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSB2ZWN0b3IgdmFsdWUgdHlwZSB3aGVyZSB0aGUKKyAgICAvLy8gcnVudGltZSBsZW5ndGggaXMgbWFjaGluZSBkZXBlbmRlbnQKKyAgICBib29sIGlzU2NhbGFibGVWZWN0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gKChTaW1wbGVUeSA+PSBNVlQ6OkZJUlNUX0lOVEVHRVJfU0NBTEFCTEVfVkFMVUVUWVBFICYmCisgICAgICAgICAgICAgICBTaW1wbGVUeSA8PSBNVlQ6OkxBU1RfSU5URUdFUl9TQ0FMQUJMRV9WQUxVRVRZUEUpIHx8CisgICAgICAgICAgICAgIChTaW1wbGVUeSA+PSBNVlQ6OkZJUlNUX0ZQX1NDQUxBQkxFX1ZBTFVFVFlQRSAmJgorICAgICAgICAgICAgICAgU2ltcGxlVHkgPD0gTVZUOjpMQVNUX0ZQX1NDQUxBQkxFX1ZBTFVFVFlQRSkpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgMTYtYml0IHZlY3RvciB0eXBlLgorICAgIGJvb2wgaXMxNkJpdFZlY3RvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoU2ltcGxlVHkgPT0gTVZUOjp2Mmk4ICB8fCBTaW1wbGVUeSA9PSBNVlQ6OnYxaTE2IHx8CisgICAgICAgICAgICAgIFNpbXBsZVR5ID09IE1WVDo6djE2aTEpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgMzItYml0IHZlY3RvciB0eXBlLgorICAgIGJvb2wgaXMzMkJpdFZlY3RvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoU2ltcGxlVHkgPT0gTVZUOjp2MzJpMSB8fCBTaW1wbGVUeSA9PSBNVlQ6OnY0aTggIHx8CisgICAgICAgICAgICAgIFNpbXBsZVR5ID09IE1WVDo6djJpMTYgfHwgU2ltcGxlVHkgPT0gTVZUOjp2MWkzMiB8fAorICAgICAgICAgICAgICBTaW1wbGVUeSA9PSBNVlQ6OnYyZjE2IHx8IFNpbXBsZVR5ID09IE1WVDo6djFmMzIpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgNjQtYml0IHZlY3RvciB0eXBlLgorICAgIGJvb2wgaXM2NEJpdFZlY3RvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoU2ltcGxlVHkgPT0gTVZUOjp2NjRpMSB8fCBTaW1wbGVUeSA9PSBNVlQ6OnY4aTggIHx8CisgICAgICAgICAgICAgIFNpbXBsZVR5ID09IE1WVDo6djRpMTYgfHwgU2ltcGxlVHkgPT0gTVZUOjp2MmkzMiB8fAorICAgICAgICAgICAgICBTaW1wbGVUeSA9PSBNVlQ6OnYxaTY0IHx8IFNpbXBsZVR5ID09IE1WVDo6djRmMTYgfHwKKyAgICAgICAgICAgICAgU2ltcGxlVHkgPT0gTVZUOjp2MmYzMiB8fCBTaW1wbGVUeSA9PSBNVlQ6OnYxZjY0KTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIDEyOC1iaXQgdmVjdG9yIHR5cGUuCisgICAgYm9vbCBpczEyOEJpdFZlY3RvcigpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoU2ltcGxlVHkgPT0gTVZUOjp2MTI4aTEgfHwgU2ltcGxlVHkgPT0gTVZUOjp2MTZpOCAgfHwKKyAgICAgICAgICAgICAgU2ltcGxlVHkgPT0gTVZUOjp2OGkxNiAgfHwgU2ltcGxlVHkgPT0gTVZUOjp2NGkzMiAgfHwKKyAgICAgICAgICAgICAgU2ltcGxlVHkgPT0gTVZUOjp2Mmk2NCAgfHwgU2ltcGxlVHkgPT0gTVZUOjp2MWkxMjggfHwKKyAgICAgICAgICAgICAgU2ltcGxlVHkgPT0gTVZUOjp2OGYxNiAgfHwgU2ltcGxlVHkgPT0gTVZUOjp2NGYzMiAgfHwKKyAgICAgICAgICAgICAgU2ltcGxlVHkgPT0gTVZUOjp2MmY2NCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaXMgYSAyNTYtYml0IHZlY3RvciB0eXBlLgorICAgIGJvb2wgaXMyNTZCaXRWZWN0b3IoKSBjb25zdCB7CisgICAgICByZXR1cm4gKFNpbXBsZVR5ID09IE1WVDo6djhmMzIgfHwgU2ltcGxlVHkgPT0gTVZUOjp2NGY2NCAgfHwKKyAgICAgICAgICAgICAgU2ltcGxlVHkgPT0gTVZUOjp2MzJpOCB8fCBTaW1wbGVUeSA9PSBNVlQ6OnYxNmkxNiB8fAorICAgICAgICAgICAgICBTaW1wbGVUeSA9PSBNVlQ6OnY4aTMyIHx8IFNpbXBsZVR5ID09IE1WVDo6djRpNjQpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGEgNTEyLWJpdCB2ZWN0b3IgdHlwZS4KKyAgICBib29sIGlzNTEyQml0VmVjdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIChTaW1wbGVUeSA9PSBNVlQ6OnYxNmYzMiB8fCBTaW1wbGVUeSA9PSBNVlQ6OnY4ZjY0ICB8fAorICAgICAgICAgICAgICBTaW1wbGVUeSA9PSBNVlQ6OnY1MTJpMSB8fCBTaW1wbGVUeSA9PSBNVlQ6OnY2NGk4ICB8fAorICAgICAgICAgICAgICBTaW1wbGVUeSA9PSBNVlQ6OnYzMmkxNiB8fCBTaW1wbGVUeSA9PSBNVlQ6OnYxNmkzMiB8fAorICAgICAgICAgICAgICBTaW1wbGVUeSA9PSBNVlQ6OnY4aTY0KTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIDEwMjQtYml0IHZlY3RvciB0eXBlLgorICAgIGJvb2wgaXMxMDI0Qml0VmVjdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIChTaW1wbGVUeSA9PSBNVlQ6OnYxMDI0aTEgfHwgU2ltcGxlVHkgPT0gTVZUOjp2MTI4aTggfHwKKyAgICAgICAgICAgICAgU2ltcGxlVHkgPT0gTVZUOjp2NjRpMTYgIHx8IFNpbXBsZVR5ID09IE1WVDo6djMyaTMyIHx8CisgICAgICAgICAgICAgIFNpbXBsZVR5ID09IE1WVDo6djE2aTY0KTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBpcyBhIDIwNDgtYml0IHZlY3RvciB0eXBlLgorICAgIGJvb2wgaXMyMDQ4Qml0VmVjdG9yKCkgY29uc3QgeworICAgICAgcmV0dXJuIChTaW1wbGVUeSA9PSBNVlQ6OnYyNTZpOCB8fCBTaW1wbGVUeSA9PSBNVlQ6OnYxMjhpMTYgfHwKKyAgICAgICAgICAgICAgU2ltcGxlVHkgPT0gTVZUOjp2NjRpMzIgfHwgU2ltcGxlVHkgPT0gTVZUOjp2MzJpNjQpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGlzIGFuIG92ZXJsb2FkZWQgdHlwZSBmb3IgVGFibGVHZW4uCisgICAgYm9vbCBpc092ZXJsb2FkZWQoKSBjb25zdCB7CisgICAgICByZXR1cm4gKFNpbXBsZVR5PT1NVlQ6OkFueSAgfHwKKyAgICAgICAgICAgICAgU2ltcGxlVHk9PU1WVDo6aUFueSB8fCBTaW1wbGVUeT09TVZUOjpmQW55IHx8CisgICAgICAgICAgICAgIFNpbXBsZVR5PT1NVlQ6OnZBbnkgfHwgU2ltcGxlVHk9PU1WVDo6aVBUUkFueSk7CisgICAgfQorCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gdmVjdG9yIGlzIGEgcG93ZXIgb2YgMi4KKyAgICBib29sIGlzUG93MlZlY3RvclR5cGUoKSBjb25zdCB7CisgICAgICB1bnNpZ25lZCBORWx0cyA9IGdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgICAgICByZXR1cm4gIShORWx0cyAmIChORWx0cyAtIDEpKTsKKyAgICB9CisKKyAgICAvLy8gV2lkZW5zIHRoZSBsZW5ndGggb2YgdGhlIGdpdmVuIHZlY3RvciBNVlQgdXAgdG8gdGhlIG5lYXJlc3QgcG93ZXIgb2YgMgorICAgIC8vLyBhbmQgcmV0dXJucyB0aGF0IHR5cGUuCisgICAgTVZUIGdldFBvdzJWZWN0b3JUeXBlKCkgY29uc3QgeworICAgICAgaWYgKGlzUG93MlZlY3RvclR5cGUoKSkKKyAgICAgICAgcmV0dXJuICp0aGlzOworCisgICAgICB1bnNpZ25lZCBORWx0cyA9IGdldFZlY3Rvck51bUVsZW1lbnRzKCk7CisgICAgICB1bnNpZ25lZCBQb3cyTkVsdHMgPSAxIDw8IExvZzJfMzJfQ2VpbChORWx0cyk7CisgICAgICByZXR1cm4gTVZUOjpnZXRWZWN0b3JWVChnZXRWZWN0b3JFbGVtZW50VHlwZSgpLCBQb3cyTkVsdHMpOworICAgIH0KKworICAgIC8vLyBJZiB0aGlzIGlzIGEgdmVjdG9yLCByZXR1cm4gdGhlIGVsZW1lbnQgdHlwZSwgb3RoZXJ3aXNlIHJldHVybiB0aGlzLgorICAgIE1WVCBnZXRTY2FsYXJUeXBlKCkgY29uc3QgeworICAgICAgcmV0dXJuIGlzVmVjdG9yKCkgPyBnZXRWZWN0b3JFbGVtZW50VHlwZSgpIDogKnRoaXM7CisgICAgfQorCisgICAgTVZUIGdldFZlY3RvckVsZW1lbnRUeXBlKCkgY29uc3QgeworICAgICAgc3dpdGNoIChTaW1wbGVUeSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiTm90IGEgdmVjdG9yIE1WVCEiKTsKKyAgICAgIGNhc2UgdjFpMToKKyAgICAgIGNhc2UgdjJpMToKKyAgICAgIGNhc2UgdjRpMToKKyAgICAgIGNhc2UgdjhpMToKKyAgICAgIGNhc2UgdjE2aTE6CisgICAgICBjYXNlIHYzMmkxOgorICAgICAgY2FzZSB2NjRpMToKKyAgICAgIGNhc2UgdjEyOGkxOgorICAgICAgY2FzZSB2NTEyaTE6CisgICAgICBjYXNlIHYxMDI0aTE6CisgICAgICBjYXNlIG54djFpMToKKyAgICAgIGNhc2Ugbnh2MmkxOgorICAgICAgY2FzZSBueHY0aTE6CisgICAgICBjYXNlIG54djhpMToKKyAgICAgIGNhc2Ugbnh2MTZpMToKKyAgICAgIGNhc2Ugbnh2MzJpMTogcmV0dXJuIGkxOworICAgICAgY2FzZSB2MWk4OgorICAgICAgY2FzZSB2Mmk4OgorICAgICAgY2FzZSB2NGk4OgorICAgICAgY2FzZSB2OGk4OgorICAgICAgY2FzZSB2MTZpODoKKyAgICAgIGNhc2UgdjMyaTg6CisgICAgICBjYXNlIHY2NGk4OgorICAgICAgY2FzZSB2MTI4aTg6CisgICAgICBjYXNlIHYyNTZpODoKKyAgICAgIGNhc2Ugbnh2MWk4OgorICAgICAgY2FzZSBueHYyaTg6CisgICAgICBjYXNlIG54djRpODoKKyAgICAgIGNhc2Ugbnh2OGk4OgorICAgICAgY2FzZSBueHYxNmk4OgorICAgICAgY2FzZSBueHYzMmk4OiByZXR1cm4gaTg7CisgICAgICBjYXNlIHYxaTE2OgorICAgICAgY2FzZSB2MmkxNjoKKyAgICAgIGNhc2UgdjRpMTY6CisgICAgICBjYXNlIHY4aTE2OgorICAgICAgY2FzZSB2MTZpMTY6CisgICAgICBjYXNlIHYzMmkxNjoKKyAgICAgIGNhc2UgdjY0aTE2OgorICAgICAgY2FzZSB2MTI4aTE2OgorICAgICAgY2FzZSBueHYxaTE2OgorICAgICAgY2FzZSBueHYyaTE2OgorICAgICAgY2FzZSBueHY0aTE2OgorICAgICAgY2FzZSBueHY4aTE2OgorICAgICAgY2FzZSBueHYxNmkxNjoKKyAgICAgIGNhc2Ugbnh2MzJpMTY6IHJldHVybiBpMTY7CisgICAgICBjYXNlIHYxaTMyOgorICAgICAgY2FzZSB2MmkzMjoKKyAgICAgIGNhc2UgdjRpMzI6CisgICAgICBjYXNlIHY4aTMyOgorICAgICAgY2FzZSB2MTZpMzI6CisgICAgICBjYXNlIHYzMmkzMjoKKyAgICAgIGNhc2UgdjY0aTMyOgorICAgICAgY2FzZSBueHYxaTMyOgorICAgICAgY2FzZSBueHYyaTMyOgorICAgICAgY2FzZSBueHY0aTMyOgorICAgICAgY2FzZSBueHY4aTMyOgorICAgICAgY2FzZSBueHYxNmkzMjoKKyAgICAgIGNhc2Ugbnh2MzJpMzI6IHJldHVybiBpMzI7CisgICAgICBjYXNlIHYxaTY0OgorICAgICAgY2FzZSB2Mmk2NDoKKyAgICAgIGNhc2UgdjRpNjQ6CisgICAgICBjYXNlIHY4aTY0OgorICAgICAgY2FzZSB2MTZpNjQ6CisgICAgICBjYXNlIHYzMmk2NDoKKyAgICAgIGNhc2Ugbnh2MWk2NDoKKyAgICAgIGNhc2Ugbnh2Mmk2NDoKKyAgICAgIGNhc2Ugbnh2NGk2NDoKKyAgICAgIGNhc2Ugbnh2OGk2NDoKKyAgICAgIGNhc2Ugbnh2MTZpNjQ6CisgICAgICBjYXNlIG54djMyaTY0OiByZXR1cm4gaTY0OworICAgICAgY2FzZSB2MWkxMjg6IHJldHVybiBpMTI4OworICAgICAgY2FzZSB2MmYxNjoKKyAgICAgIGNhc2UgdjRmMTY6CisgICAgICBjYXNlIHY4ZjE2OgorICAgICAgY2FzZSBueHYyZjE2OgorICAgICAgY2FzZSBueHY0ZjE2OgorICAgICAgY2FzZSBueHY4ZjE2OiByZXR1cm4gZjE2OworICAgICAgY2FzZSB2MWYzMjoKKyAgICAgIGNhc2UgdjJmMzI6CisgICAgICBjYXNlIHY0ZjMyOgorICAgICAgY2FzZSB2OGYzMjoKKyAgICAgIGNhc2UgdjE2ZjMyOgorICAgICAgY2FzZSBueHYxZjMyOgorICAgICAgY2FzZSBueHYyZjMyOgorICAgICAgY2FzZSBueHY0ZjMyOgorICAgICAgY2FzZSBueHY4ZjMyOgorICAgICAgY2FzZSBueHYxNmYzMjogcmV0dXJuIGYzMjsKKyAgICAgIGNhc2UgdjFmNjQ6CisgICAgICBjYXNlIHYyZjY0OgorICAgICAgY2FzZSB2NGY2NDoKKyAgICAgIGNhc2UgdjhmNjQ6CisgICAgICBjYXNlIG54djFmNjQ6CisgICAgICBjYXNlIG54djJmNjQ6CisgICAgICBjYXNlIG54djRmNjQ6CisgICAgICBjYXNlIG54djhmNjQ6IHJldHVybiBmNjQ7CisgICAgICB9CisgICAgfQorCisgICAgdW5zaWduZWQgZ2V0VmVjdG9yTnVtRWxlbWVudHMoKSBjb25zdCB7CisgICAgICBzd2l0Y2ggKFNpbXBsZVR5KSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJOb3QgYSB2ZWN0b3IgTVZUISIpOworICAgICAgY2FzZSB2MTAyNGkxOiByZXR1cm4gMTAyNDsKKyAgICAgIGNhc2UgdjUxMmkxOiByZXR1cm4gNTEyOworICAgICAgY2FzZSB2MjU2aTg6IHJldHVybiAyNTY7CisgICAgICBjYXNlIHYxMjhpMToKKyAgICAgIGNhc2UgdjEyOGk4OgorICAgICAgY2FzZSB2MTI4aTE2OiByZXR1cm4gMTI4OworICAgICAgY2FzZSB2NjRpMToKKyAgICAgIGNhc2UgdjY0aTg6CisgICAgICBjYXNlIHY2NGkxNjoKKyAgICAgIGNhc2UgdjY0aTMyOiByZXR1cm4gNjQ7CisgICAgICBjYXNlIHYzMmkxOgorICAgICAgY2FzZSB2MzJpODoKKyAgICAgIGNhc2UgdjMyaTE2OgorICAgICAgY2FzZSB2MzJpMzI6CisgICAgICBjYXNlIHYzMmk2NDoKKyAgICAgIGNhc2Ugbnh2MzJpMToKKyAgICAgIGNhc2Ugbnh2MzJpODoKKyAgICAgIGNhc2Ugbnh2MzJpMTY6CisgICAgICBjYXNlIG54djMyaTMyOgorICAgICAgY2FzZSBueHYzMmk2NDogcmV0dXJuIDMyOworICAgICAgY2FzZSB2MTZpMToKKyAgICAgIGNhc2UgdjE2aTg6CisgICAgICBjYXNlIHYxNmkxNjoKKyAgICAgIGNhc2UgdjE2aTMyOgorICAgICAgY2FzZSB2MTZpNjQ6CisgICAgICBjYXNlIHYxNmYzMjoKKyAgICAgIGNhc2Ugbnh2MTZpMToKKyAgICAgIGNhc2Ugbnh2MTZpODoKKyAgICAgIGNhc2Ugbnh2MTZpMTY6CisgICAgICBjYXNlIG54djE2aTMyOgorICAgICAgY2FzZSBueHYxNmk2NDoKKyAgICAgIGNhc2Ugbnh2MTZmMzI6IHJldHVybiAxNjsKKyAgICAgIGNhc2UgdjhpMToKKyAgICAgIGNhc2UgdjhpODoKKyAgICAgIGNhc2UgdjhpMTY6CisgICAgICBjYXNlIHY4aTMyOgorICAgICAgY2FzZSB2OGk2NDoKKyAgICAgIGNhc2UgdjhmMTY6CisgICAgICBjYXNlIHY4ZjMyOgorICAgICAgY2FzZSB2OGY2NDoKKyAgICAgIGNhc2Ugbnh2OGkxOgorICAgICAgY2FzZSBueHY4aTg6CisgICAgICBjYXNlIG54djhpMTY6CisgICAgICBjYXNlIG54djhpMzI6CisgICAgICBjYXNlIG54djhpNjQ6CisgICAgICBjYXNlIG54djhmMTY6CisgICAgICBjYXNlIG54djhmMzI6CisgICAgICBjYXNlIG54djhmNjQ6IHJldHVybiA4OworICAgICAgY2FzZSB2NGkxOgorICAgICAgY2FzZSB2NGk4OgorICAgICAgY2FzZSB2NGkxNjoKKyAgICAgIGNhc2UgdjRpMzI6CisgICAgICBjYXNlIHY0aTY0OgorICAgICAgY2FzZSB2NGYxNjoKKyAgICAgIGNhc2UgdjRmMzI6CisgICAgICBjYXNlIHY0ZjY0OgorICAgICAgY2FzZSBueHY0aTE6CisgICAgICBjYXNlIG54djRpODoKKyAgICAgIGNhc2Ugbnh2NGkxNjoKKyAgICAgIGNhc2Ugbnh2NGkzMjoKKyAgICAgIGNhc2Ugbnh2NGk2NDoKKyAgICAgIGNhc2Ugbnh2NGYxNjoKKyAgICAgIGNhc2Ugbnh2NGYzMjoKKyAgICAgIGNhc2Ugbnh2NGY2NDogcmV0dXJuIDQ7CisgICAgICBjYXNlIHYyaTE6CisgICAgICBjYXNlIHYyaTg6CisgICAgICBjYXNlIHYyaTE2OgorICAgICAgY2FzZSB2MmkzMjoKKyAgICAgIGNhc2UgdjJpNjQ6CisgICAgICBjYXNlIHYyZjE2OgorICAgICAgY2FzZSB2MmYzMjoKKyAgICAgIGNhc2UgdjJmNjQ6CisgICAgICBjYXNlIG54djJpMToKKyAgICAgIGNhc2Ugbnh2Mmk4OgorICAgICAgY2FzZSBueHYyaTE2OgorICAgICAgY2FzZSBueHYyaTMyOgorICAgICAgY2FzZSBueHYyaTY0OgorICAgICAgY2FzZSBueHYyZjE2OgorICAgICAgY2FzZSBueHYyZjMyOgorICAgICAgY2FzZSBueHYyZjY0OiByZXR1cm4gMjsKKyAgICAgIGNhc2UgdjFpMToKKyAgICAgIGNhc2UgdjFpODoKKyAgICAgIGNhc2UgdjFpMTY6CisgICAgICBjYXNlIHYxaTMyOgorICAgICAgY2FzZSB2MWk2NDoKKyAgICAgIGNhc2UgdjFpMTI4OgorICAgICAgY2FzZSB2MWYzMjoKKyAgICAgIGNhc2UgdjFmNjQ6CisgICAgICBjYXNlIG54djFpMToKKyAgICAgIGNhc2Ugbnh2MWk4OgorICAgICAgY2FzZSBueHYxaTE2OgorICAgICAgY2FzZSBueHYxaTMyOgorICAgICAgY2FzZSBueHYxaTY0OgorICAgICAgY2FzZSBueHYxZjMyOgorICAgICAgY2FzZSBueHYxZjY0OiByZXR1cm4gMTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBNVlQ6OkVsZW1lbnRDb3VudCBnZXRWZWN0b3JFbGVtZW50Q291bnQoKSBjb25zdCB7CisgICAgICByZXR1cm4geyBnZXRWZWN0b3JOdW1FbGVtZW50cygpLCBpc1NjYWxhYmxlVmVjdG9yKCkgfTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBnZXRTaXplSW5CaXRzKCkgY29uc3QgeworICAgICAgc3dpdGNoIChTaW1wbGVUeSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiZ2V0U2l6ZUluQml0cyBjYWxsZWQgb24gZXh0ZW5kZWQgTVZULiIpOworICAgICAgY2FzZSBPdGhlcjoKKyAgICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVmFsdWUgdHlwZSBpcyBub24tc3RhbmRhcmQgdmFsdWUsIE90aGVyLiIpOworICAgICAgY2FzZSBpUFRSOgorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJWYWx1ZSB0eXBlIHNpemUgaXMgdGFyZ2V0LWRlcGVuZGVudC4gQXNrIFRMSS4iKTsKKyAgICAgIGNhc2UgaVBUUkFueToKKyAgICAgIGNhc2UgaUFueToKKyAgICAgIGNhc2UgZkFueToKKyAgICAgIGNhc2UgdkFueToKKyAgICAgIGNhc2UgQW55OgorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJWYWx1ZSB0eXBlIGlzIG92ZXJsb2FkZWQuIik7CisgICAgICBjYXNlIHRva2VuOgorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJUb2tlbiB0eXBlIGlzIGEgc2VudGluZWwgdGhhdCBjYW5ub3QgYmUgdXNlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgImluIGNvZGVnZW4gYW5kIGhhcyBubyBzaXplIik7CisgICAgICBjYXNlIE1ldGFkYXRhOgorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJWYWx1ZSB0eXBlIGlzIG1ldGFkYXRhLiIpOworICAgICAgY2FzZSBpMToKKyAgICAgIGNhc2UgdjFpMToKKyAgICAgIGNhc2Ugbnh2MWkxOiByZXR1cm4gMTsKKyAgICAgIGNhc2UgdjJpMToKKyAgICAgIGNhc2Ugbnh2MmkxOiByZXR1cm4gMjsKKyAgICAgIGNhc2UgdjRpMToKKyAgICAgIGNhc2Ugbnh2NGkxOiByZXR1cm4gNDsKKyAgICAgIGNhc2UgaTggIDoKKyAgICAgIGNhc2UgdjFpODoKKyAgICAgIGNhc2UgdjhpMToKKyAgICAgIGNhc2Ugbnh2MWk4OgorICAgICAgY2FzZSBueHY4aTE6IHJldHVybiA4OworICAgICAgY2FzZSBpMTYgOgorICAgICAgY2FzZSBmMTY6CisgICAgICBjYXNlIHYxNmkxOgorICAgICAgY2FzZSB2Mmk4OgorICAgICAgY2FzZSB2MWkxNjoKKyAgICAgIGNhc2Ugbnh2MTZpMToKKyAgICAgIGNhc2Ugbnh2Mmk4OgorICAgICAgY2FzZSBueHYxaTE2OiByZXR1cm4gMTY7CisgICAgICBjYXNlIGYzMiA6CisgICAgICBjYXNlIGkzMiA6CisgICAgICBjYXNlIHYzMmkxOgorICAgICAgY2FzZSB2NGk4OgorICAgICAgY2FzZSB2MmkxNjoKKyAgICAgIGNhc2UgdjJmMTY6CisgICAgICBjYXNlIHYxZjMyOgorICAgICAgY2FzZSB2MWkzMjoKKyAgICAgIGNhc2Ugbnh2MzJpMToKKyAgICAgIGNhc2Ugbnh2NGk4OgorICAgICAgY2FzZSBueHYyaTE2OgorICAgICAgY2FzZSBueHYxaTMyOgorICAgICAgY2FzZSBueHYyZjE2OgorICAgICAgY2FzZSBueHYxZjMyOiByZXR1cm4gMzI7CisgICAgICBjYXNlIHg4Nm1teDoKKyAgICAgIGNhc2UgZjY0IDoKKyAgICAgIGNhc2UgaTY0IDoKKyAgICAgIGNhc2UgdjY0aTE6CisgICAgICBjYXNlIHY4aTg6CisgICAgICBjYXNlIHY0aTE2OgorICAgICAgY2FzZSB2MmkzMjoKKyAgICAgIGNhc2UgdjFpNjQ6CisgICAgICBjYXNlIHY0ZjE2OgorICAgICAgY2FzZSB2MmYzMjoKKyAgICAgIGNhc2UgdjFmNjQ6CisgICAgICBjYXNlIG54djhpODoKKyAgICAgIGNhc2Ugbnh2NGkxNjoKKyAgICAgIGNhc2Ugbnh2MmkzMjoKKyAgICAgIGNhc2Ugbnh2MWk2NDoKKyAgICAgIGNhc2Ugbnh2NGYxNjoKKyAgICAgIGNhc2Ugbnh2MmYzMjoKKyAgICAgIGNhc2Ugbnh2MWY2NDogcmV0dXJuIDY0OworICAgICAgY2FzZSBmODAgOiAgcmV0dXJuIDgwOworICAgICAgY2FzZSBmMTI4OgorICAgICAgY2FzZSBwcGNmMTI4OgorICAgICAgY2FzZSBpMTI4OgorICAgICAgY2FzZSB2MTI4aTE6CisgICAgICBjYXNlIHYxNmk4OgorICAgICAgY2FzZSB2OGkxNjoKKyAgICAgIGNhc2UgdjRpMzI6CisgICAgICBjYXNlIHYyaTY0OgorICAgICAgY2FzZSB2MWkxMjg6CisgICAgICBjYXNlIHY4ZjE2OgorICAgICAgY2FzZSB2NGYzMjoKKyAgICAgIGNhc2UgdjJmNjQ6CisgICAgICBjYXNlIG54djE2aTg6CisgICAgICBjYXNlIG54djhpMTY6CisgICAgICBjYXNlIG54djRpMzI6CisgICAgICBjYXNlIG54djJpNjQ6CisgICAgICBjYXNlIG54djhmMTY6CisgICAgICBjYXNlIG54djRmMzI6CisgICAgICBjYXNlIG54djJmNjQ6IHJldHVybiAxMjg7CisgICAgICBjYXNlIHYzMmk4OgorICAgICAgY2FzZSB2MTZpMTY6CisgICAgICBjYXNlIHY4aTMyOgorICAgICAgY2FzZSB2NGk2NDoKKyAgICAgIGNhc2UgdjhmMzI6CisgICAgICBjYXNlIHY0ZjY0OgorICAgICAgY2FzZSBueHYzMmk4OgorICAgICAgY2FzZSBueHYxNmkxNjoKKyAgICAgIGNhc2Ugbnh2OGkzMjoKKyAgICAgIGNhc2Ugbnh2NGk2NDoKKyAgICAgIGNhc2Ugbnh2OGYzMjoKKyAgICAgIGNhc2Ugbnh2NGY2NDogcmV0dXJuIDI1NjsKKyAgICAgIGNhc2UgdjUxMmkxOgorICAgICAgY2FzZSB2NjRpODoKKyAgICAgIGNhc2UgdjMyaTE2OgorICAgICAgY2FzZSB2MTZpMzI6CisgICAgICBjYXNlIHY4aTY0OgorICAgICAgY2FzZSB2MTZmMzI6CisgICAgICBjYXNlIHY4ZjY0OgorICAgICAgY2FzZSBueHYzMmkxNjoKKyAgICAgIGNhc2Ugbnh2MTZpMzI6CisgICAgICBjYXNlIG54djhpNjQ6CisgICAgICBjYXNlIG54djE2ZjMyOgorICAgICAgY2FzZSBueHY4ZjY0OiByZXR1cm4gNTEyOworICAgICAgY2FzZSB2MTAyNGkxOgorICAgICAgY2FzZSB2MTI4aTg6CisgICAgICBjYXNlIHY2NGkxNjoKKyAgICAgIGNhc2UgdjMyaTMyOgorICAgICAgY2FzZSB2MTZpNjQ6CisgICAgICBjYXNlIG54djMyaTMyOgorICAgICAgY2FzZSBueHYxNmk2NDogcmV0dXJuIDEwMjQ7CisgICAgICBjYXNlIHYyNTZpODoKKyAgICAgIGNhc2UgdjEyOGkxNjoKKyAgICAgIGNhc2UgdjY0aTMyOgorICAgICAgY2FzZSB2MzJpNjQ6CisgICAgICBjYXNlIG54djMyaTY0OiByZXR1cm4gMjA0ODsKKyAgICAgIGNhc2UgRXhjZXB0UmVmOiByZXR1cm4gMDsgLy8gb3BhcXVlIHR5cGUKKyAgICAgIH0KKyAgICB9CisKKyAgICB1bnNpZ25lZCBnZXRTY2FsYXJTaXplSW5CaXRzKCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldFNjYWxhclR5cGUoKS5nZXRTaXplSW5CaXRzKCk7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIG92ZXJ3cml0dGVuIGJ5IGEgc3RvcmUgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZQorICAgIC8vLyB0eXBlLgorICAgIHVuc2lnbmVkIGdldFN0b3JlU2l6ZSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiAoZ2V0U2l6ZUluQml0cygpICsgNykgLyA4OworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIG92ZXJ3cml0dGVuIGJ5IGEgc3RvcmUgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZQorICAgIC8vLyB0eXBlLgorICAgIHVuc2lnbmVkIGdldFN0b3JlU2l6ZUluQml0cygpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRTdG9yZVNpemUoKSAqIDg7CisgICAgfQorCisgICAgLy8vIFJldHVybiB0cnVlIGlmIHRoaXMgaGFzIG1vcmUgYml0cyB0aGFuIFZULgorICAgIGJvb2wgYml0c0dUKE1WVCBWVCkgY29uc3QgeworICAgICAgcmV0dXJuIGdldFNpemVJbkJpdHMoKSA+IFZULmdldFNpemVJbkJpdHMoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBoYXMgbm8gbGVzcyBiaXRzIHRoYW4gVlQuCisgICAgYm9vbCBiaXRzR0UoTVZUIFZUKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0U2l6ZUluQml0cygpID49IFZULmdldFNpemVJbkJpdHMoKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBoYXMgbGVzcyBiaXRzIHRoYW4gVlQuCisgICAgYm9vbCBiaXRzTFQoTVZUIFZUKSBjb25zdCB7CisgICAgICByZXR1cm4gZ2V0U2l6ZUluQml0cygpIDwgVlQuZ2V0U2l6ZUluQml0cygpOworICAgIH0KKworICAgIC8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGlzIGhhcyBubyBtb3JlIGJpdHMgdGhhbiBWVC4KKyAgICBib29sIGJpdHNMRShNVlQgVlQpIGNvbnN0IHsKKyAgICAgIHJldHVybiBnZXRTaXplSW5CaXRzKCkgPD0gVlQuZ2V0U2l6ZUluQml0cygpOworICAgIH0KKworICAgIHN0YXRpYyBNVlQgZ2V0RmxvYXRpbmdQb2ludFZUKHVuc2lnbmVkIEJpdFdpZHRoKSB7CisgICAgICBzd2l0Y2ggKEJpdFdpZHRoKSB7CisgICAgICBkZWZhdWx0OgorICAgICAgICBsbHZtX3VucmVhY2hhYmxlKCJCYWQgYml0IHdpZHRoISIpOworICAgICAgY2FzZSAxNjoKKyAgICAgICAgcmV0dXJuIE1WVDo6ZjE2OworICAgICAgY2FzZSAzMjoKKyAgICAgICAgcmV0dXJuIE1WVDo6ZjMyOworICAgICAgY2FzZSA2NDoKKyAgICAgICAgcmV0dXJuIE1WVDo6ZjY0OworICAgICAgY2FzZSA4MDoKKyAgICAgICAgcmV0dXJuIE1WVDo6ZjgwOworICAgICAgY2FzZSAxMjg6CisgICAgICAgIHJldHVybiBNVlQ6OmYxMjg7CisgICAgICB9CisgICAgfQorCisgICAgc3RhdGljIE1WVCBnZXRJbnRlZ2VyVlQodW5zaWduZWQgQml0V2lkdGgpIHsKKyAgICAgIHN3aXRjaCAoQml0V2lkdGgpIHsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpKE1WVDo6SU5WQUxJRF9TSU1QTEVfVkFMVUVfVFlQRSk7CisgICAgICBjYXNlIDE6CisgICAgICAgIHJldHVybiBNVlQ6OmkxOworICAgICAgY2FzZSA4OgorICAgICAgICByZXR1cm4gTVZUOjppODsKKyAgICAgIGNhc2UgMTY6CisgICAgICAgIHJldHVybiBNVlQ6OmkxNjsKKyAgICAgIGNhc2UgMzI6CisgICAgICAgIHJldHVybiBNVlQ6OmkzMjsKKyAgICAgIGNhc2UgNjQ6CisgICAgICAgIHJldHVybiBNVlQ6Omk2NDsKKyAgICAgIGNhc2UgMTI4OgorICAgICAgICByZXR1cm4gTVZUOjppMTI4OworICAgICAgfQorICAgIH0KKworICAgIHN0YXRpYyBNVlQgZ2V0VmVjdG9yVlQoTVZUIFZULCB1bnNpZ25lZCBOdW1FbGVtZW50cykgeworICAgICAgc3dpdGNoIChWVC5TaW1wbGVUeSkgeworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1WVDo6aTE6CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAxKSAgICByZXR1cm4gTVZUOjp2MWkxOworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMikgICAgcmV0dXJuIE1WVDo6djJpMTsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDQpICAgIHJldHVybiBNVlQ6OnY0aTE7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA4KSAgICByZXR1cm4gTVZUOjp2OGkxOworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMTYpICAgcmV0dXJuIE1WVDo6djE2aTE7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAzMikgICByZXR1cm4gTVZUOjp2MzJpMTsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDY0KSAgIHJldHVybiBNVlQ6OnY2NGkxOworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMTI4KSAgcmV0dXJuIE1WVDo6djEyOGkxOworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gNTEyKSAgcmV0dXJuIE1WVDo6djUxMmkxOworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMTAyNCkgcmV0dXJuIE1WVDo6djEwMjRpMTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1WVDo6aTg6CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAxKSAgIHJldHVybiBNVlQ6OnYxaTg7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAyKSAgIHJldHVybiBNVlQ6OnYyaTg7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA0KSAgIHJldHVybiBNVlQ6OnY0aTg7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA4KSAgIHJldHVybiBNVlQ6OnY4aTg7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAxNikgIHJldHVybiBNVlQ6OnYxNmk4OworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMzIpICByZXR1cm4gTVZUOjp2MzJpODsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDY0KSAgcmV0dXJuIE1WVDo6djY0aTg7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAxMjgpIHJldHVybiBNVlQ6OnYxMjhpODsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDI1NikgcmV0dXJuIE1WVDo6djI1Nmk4OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVZUOjppMTY6CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAxKSAgIHJldHVybiBNVlQ6OnYxaTE2OworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMikgICByZXR1cm4gTVZUOjp2MmkxNjsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDQpICAgcmV0dXJuIE1WVDo6djRpMTY7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA4KSAgIHJldHVybiBNVlQ6OnY4aTE2OworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMTYpICByZXR1cm4gTVZUOjp2MTZpMTY7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAzMikgIHJldHVybiBNVlQ6OnYzMmkxNjsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDY0KSAgcmV0dXJuIE1WVDo6djY0aTE2OworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMTI4KSByZXR1cm4gTVZUOjp2MTI4aTE2OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVZUOjppMzI6CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAxKSAgcmV0dXJuIE1WVDo6djFpMzI7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAyKSAgcmV0dXJuIE1WVDo6djJpMzI7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA0KSAgcmV0dXJuIE1WVDo6djRpMzI7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA4KSAgcmV0dXJuIE1WVDo6djhpMzI7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAxNikgcmV0dXJuIE1WVDo6djE2aTMyOworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMzIpIHJldHVybiBNVlQ6OnYzMmkzMjsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDY0KSByZXR1cm4gTVZUOjp2NjRpMzI7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBNVlQ6Omk2NDoKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDEpICByZXR1cm4gTVZUOjp2MWk2NDsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDIpICByZXR1cm4gTVZUOjp2Mmk2NDsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDQpICByZXR1cm4gTVZUOjp2NGk2NDsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDgpICByZXR1cm4gTVZUOjp2OGk2NDsKKyAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDE2KSByZXR1cm4gTVZUOjp2MTZpNjQ7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAzMikgcmV0dXJuIE1WVDo6djMyaTY0OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVZUOjppMTI4OgorICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMSkgIHJldHVybiBNVlQ6OnYxaTEyODsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIE1WVDo6ZjE2OgorICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMikgIHJldHVybiBNVlQ6OnYyZjE2OworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gNCkgIHJldHVybiBNVlQ6OnY0ZjE2OworICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gOCkgIHJldHVybiBNVlQ6OnY4ZjE2OworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVZUOjpmMzI6CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAxKSAgcmV0dXJuIE1WVDo6djFmMzI7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAyKSAgcmV0dXJuIE1WVDo6djJmMzI7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA0KSAgcmV0dXJuIE1WVDo6djRmMzI7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA4KSAgcmV0dXJuIE1WVDo6djhmMzI7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAxNikgcmV0dXJuIE1WVDo6djE2ZjMyOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTVZUOjpmNjQ6CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAxKSAgcmV0dXJuIE1WVDo6djFmNjQ7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAyKSAgcmV0dXJuIE1WVDo6djJmNjQ7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA0KSAgcmV0dXJuIE1WVDo6djRmNjQ7CisgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA4KSAgcmV0dXJuIE1WVDo6djhmNjQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgcmV0dXJuIChNVlQ6OlNpbXBsZVZhbHVlVHlwZSkoTVZUOjpJTlZBTElEX1NJTVBMRV9WQUxVRV9UWVBFKTsKKyAgICB9CisKKyAgICBzdGF0aWMgTVZUIGdldFNjYWxhYmxlVmVjdG9yVlQoTVZUIFZULCB1bnNpZ25lZCBOdW1FbGVtZW50cykgeworICAgICAgc3dpdGNoKFZULlNpbXBsZVR5KSB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVZUOjppMToKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMSkgIHJldHVybiBNVlQ6Om54djFpMTsKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMikgIHJldHVybiBNVlQ6Om54djJpMTsKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gNCkgIHJldHVybiBNVlQ6Om54djRpMTsKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gOCkgIHJldHVybiBNVlQ6Om54djhpMTsKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMTYpIHJldHVybiBNVlQ6Om54djE2aTE7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDMyKSByZXR1cm4gTVZUOjpueHYzMmkxOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1WVDo6aTg6CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDEpICByZXR1cm4gTVZUOjpueHYxaTg7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDIpICByZXR1cm4gTVZUOjpueHYyaTg7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDQpICByZXR1cm4gTVZUOjpueHY0aTg7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDgpICByZXR1cm4gTVZUOjpueHY4aTg7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDE2KSByZXR1cm4gTVZUOjpueHYxNmk4OworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAzMikgcmV0dXJuIE1WVDo6bnh2MzJpODsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVlQ6OmkxNjoKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMSkgIHJldHVybiBNVlQ6Om54djFpMTY7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDIpICByZXR1cm4gTVZUOjpueHYyaTE2OworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA0KSAgcmV0dXJuIE1WVDo6bnh2NGkxNjsKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gOCkgIHJldHVybiBNVlQ6Om54djhpMTY7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDE2KSByZXR1cm4gTVZUOjpueHYxNmkxNjsKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMzIpIHJldHVybiBNVlQ6Om54djMyaTE2OworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIE1WVDo6aTMyOgorICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAxKSAgcmV0dXJuIE1WVDo6bnh2MWkzMjsKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMikgIHJldHVybiBNVlQ6Om54djJpMzI7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDQpICByZXR1cm4gTVZUOjpueHY0aTMyOworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA4KSAgcmV0dXJuIE1WVDo6bnh2OGkzMjsKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMTYpIHJldHVybiBNVlQ6Om54djE2aTMyOworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAzMikgcmV0dXJuIE1WVDo6bnh2MzJpMzI7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgTVZUOjppNjQ6CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDEpICByZXR1cm4gTVZUOjpueHYxaTY0OworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAyKSAgcmV0dXJuIE1WVDo6bnh2Mmk2NDsKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gNCkgIHJldHVybiBNVlQ6Om54djRpNjQ7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDgpICByZXR1cm4gTVZUOjpueHY4aTY0OworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSAxNikgcmV0dXJuIE1WVDo6bnh2MTZpNjQ7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDMyKSByZXR1cm4gTVZUOjpueHYzMmk2NDsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVlQ6OmYxNjoKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMikgIHJldHVybiBNVlQ6Om54djJmMTY7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDQpICByZXR1cm4gTVZUOjpueHY0ZjE2OworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA4KSAgcmV0dXJuIE1WVDo6bnh2OGYxNjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVlQ6OmYzMjoKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMSkgIHJldHVybiBNVlQ6Om54djFmMzI7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDIpICByZXR1cm4gTVZUOjpueHYyZjMyOworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA0KSAgcmV0dXJuIE1WVDo6bnh2NGYzMjsKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gOCkgIHJldHVybiBNVlQ6Om54djhmMzI7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDE2KSByZXR1cm4gTVZUOjpueHYxNmYzMjsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBNVlQ6OmY2NDoKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gMSkgIHJldHVybiBNVlQ6Om54djFmNjQ7CisgICAgICAgICAgaWYgKE51bUVsZW1lbnRzID09IDIpICByZXR1cm4gTVZUOjpueHYyZjY0OworICAgICAgICAgIGlmIChOdW1FbGVtZW50cyA9PSA0KSAgcmV0dXJuIE1WVDo6bnh2NGY2NDsKKyAgICAgICAgICBpZiAoTnVtRWxlbWVudHMgPT0gOCkgIHJldHVybiBNVlQ6Om54djhmNjQ7CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgICByZXR1cm4gKE1WVDo6U2ltcGxlVmFsdWVUeXBlKShNVlQ6OklOVkFMSURfU0lNUExFX1ZBTFVFX1RZUEUpOworICAgIH0KKworICAgIHN0YXRpYyBNVlQgZ2V0VmVjdG9yVlQoTVZUIFZULCB1bnNpZ25lZCBOdW1FbGVtZW50cywgYm9vbCBJc1NjYWxhYmxlKSB7CisgICAgICBpZiAoSXNTY2FsYWJsZSkKKyAgICAgICAgcmV0dXJuIGdldFNjYWxhYmxlVmVjdG9yVlQoVlQsIE51bUVsZW1lbnRzKTsKKyAgICAgIHJldHVybiBnZXRWZWN0b3JWVChWVCwgTnVtRWxlbWVudHMpOworICAgIH0KKworICAgIHN0YXRpYyBNVlQgZ2V0VmVjdG9yVlQoTVZUIFZULCBNVlQ6OkVsZW1lbnRDb3VudCBFQykgeworICAgICAgaWYgKEVDLlNjYWxhYmxlKQorICAgICAgICByZXR1cm4gZ2V0U2NhbGFibGVWZWN0b3JWVChWVCwgRUMuTWluKTsKKyAgICAgIHJldHVybiBnZXRWZWN0b3JWVChWVCwgRUMuTWluKTsKKyAgICB9CisKKyAgICAvLy8gUmV0dXJuIHRoZSB2YWx1ZSB0eXBlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHNwZWNpZmllZCB0eXBlLiAgVGhpcyByZXR1cm5zCisgICAgLy8vIGFsbCBwb2ludGVycyBhcyBpUFRSLiAgSWYgSGFuZGxlVW5rbm93biBpcyB0cnVlLCB1bmtub3duIHR5cGVzIGFyZQorICAgIC8vLyByZXR1cm5lZCBhcyBPdGhlciwgb3RoZXJ3aXNlIHRoZXkgYXJlIGludmFsaWQuCisgICAgc3RhdGljIE1WVCBnZXRWVChUeXBlICpUeSwgYm9vbCBIYW5kbGVVbmtub3duID0gZmFsc2UpOworCisgIHByaXZhdGU6CisgICAgLy8vIEEgc2ltcGxlIGl0ZXJhdG9yIG92ZXIgdGhlIE1WVDo6U2ltcGxlVmFsdWVUeXBlIGVudW0uCisgICAgc3RydWN0IG12dF9pdGVyYXRvciB7CisgICAgICBTaW1wbGVWYWx1ZVR5cGUgVlQ7CisKKyAgICAgIG12dF9pdGVyYXRvcihTaW1wbGVWYWx1ZVR5cGUgVlQpIDogVlQoVlQpIHt9CisKKyAgICAgIE1WVCBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiBWVDsgfQorICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IG12dF9pdGVyYXRvciAmTEhTKSBjb25zdCB7IHJldHVybiBWVCAhPSBMSFMuVlQ7IH0KKworICAgICAgbXZ0X2l0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeworICAgICAgICBWVCA9IChNVlQ6OlNpbXBsZVZhbHVlVHlwZSkoKGludClWVCArIDEpOworICAgICAgICBhc3NlcnQoKGludClWVCA8PSBNVlQ6Ok1BWF9BTExPV0VEX1ZBTFVFVFlQRSAmJgorICAgICAgICAgICAgICAgIk1WVCBpdGVyYXRvciBvdmVyZmxvd2VkLiIpOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgICB9CisgICAgfTsKKworICAgIC8vLyBBIHJhbmdlIG9mIHRoZSBNVlQ6OlNpbXBsZVZhbHVlVHlwZSBlbnVtLgorICAgIHVzaW5nIG12dF9yYW5nZSA9IGl0ZXJhdG9yX3JhbmdlPG12dF9pdGVyYXRvcj47CisKKyAgcHVibGljOgorICAgIC8vLyBTaW1wbGVWYWx1ZVR5cGUgSXRlcmF0aW9uCisgICAgLy8vIEB7CisgICAgc3RhdGljIG12dF9yYW5nZSBhbGxfdmFsdWV0eXBlcygpIHsKKyAgICAgIHJldHVybiBtdnRfcmFuZ2UoTVZUOjpGSVJTVF9WQUxVRVRZUEUsIE1WVDo6TEFTVF9WQUxVRVRZUEUpOworICAgIH0KKworICAgIHN0YXRpYyBtdnRfcmFuZ2UgaW50ZWdlcl92YWx1ZXR5cGVzKCkgeworICAgICAgcmV0dXJuIG12dF9yYW5nZShNVlQ6OkZJUlNUX0lOVEVHRVJfVkFMVUVUWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpKE1WVDo6TEFTVF9JTlRFR0VSX1ZBTFVFVFlQRSArIDEpKTsKKyAgICB9CisKKyAgICBzdGF0aWMgbXZ0X3JhbmdlIGZwX3ZhbHVldHlwZXMoKSB7CisgICAgICByZXR1cm4gbXZ0X3JhbmdlKE1WVDo6RklSU1RfRlBfVkFMVUVUWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpKE1WVDo6TEFTVF9GUF9WQUxVRVRZUEUgKyAxKSk7CisgICAgfQorCisgICAgc3RhdGljIG12dF9yYW5nZSB2ZWN0b3JfdmFsdWV0eXBlcygpIHsKKyAgICAgIHJldHVybiBtdnRfcmFuZ2UoTVZUOjpGSVJTVF9WRUNUT1JfVkFMVUVUWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpKE1WVDo6TEFTVF9WRUNUT1JfVkFMVUVUWVBFICsgMSkpOworICAgIH0KKworICAgIHN0YXRpYyBtdnRfcmFuZ2UgaW50ZWdlcl92ZWN0b3JfdmFsdWV0eXBlcygpIHsKKyAgICAgIHJldHVybiBtdnRfcmFuZ2UoCisgICAgICAgICAgTVZUOjpGSVJTVF9JTlRFR0VSX1ZFQ1RPUl9WQUxVRVRZUEUsCisgICAgICAgICAgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKShNVlQ6OkxBU1RfSU5URUdFUl9WRUNUT1JfVkFMVUVUWVBFICsgMSkpOworICAgIH0KKworICAgIHN0YXRpYyBtdnRfcmFuZ2UgZnBfdmVjdG9yX3ZhbHVldHlwZXMoKSB7CisgICAgICByZXR1cm4gbXZ0X3JhbmdlKAorICAgICAgICAgIE1WVDo6RklSU1RfRlBfVkVDVE9SX1ZBTFVFVFlQRSwKKyAgICAgICAgICAoTVZUOjpTaW1wbGVWYWx1ZVR5cGUpKE1WVDo6TEFTVF9GUF9WRUNUT1JfVkFMVUVUWVBFICsgMSkpOworICAgIH0KKworICAgIHN0YXRpYyBtdnRfcmFuZ2UgaW50ZWdlcl9zY2FsYWJsZV92ZWN0b3JfdmFsdWV0eXBlcygpIHsKKyAgICAgIHJldHVybiBtdnRfcmFuZ2UoTVZUOjpGSVJTVF9JTlRFR0VSX1NDQUxBQkxFX1ZBTFVFVFlQRSwKKyAgICAgICAgICAgICAgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKShNVlQ6OkxBU1RfSU5URUdFUl9TQ0FMQUJMRV9WQUxVRVRZUEUgKyAxKSk7CisgICAgfQorCisgICAgc3RhdGljIG12dF9yYW5nZSBmcF9zY2FsYWJsZV92ZWN0b3JfdmFsdWV0eXBlcygpIHsKKyAgICAgIHJldHVybiBtdnRfcmFuZ2UoTVZUOjpGSVJTVF9GUF9TQ0FMQUJMRV9WQUxVRVRZUEUsCisgICAgICAgICAgICAgICAgICAgKE1WVDo6U2ltcGxlVmFsdWVUeXBlKShNVlQ6OkxBU1RfRlBfU0NBTEFCTEVfVkFMVUVUWVBFICsgMSkpOworICAgIH0KKyAgICAvLy8gQH0KKyAgfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fQ09ERUdFTl9NQUNISU5FVkFMVUVUWVBFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NYW5hZ2VkU3RhdGljLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTWFuYWdlZFN0YXRpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI0YmYzMjEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTWFuYWdlZFN0YXRpYy5oCkBAIC0wLDAgKzEsOTcgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L01hbmFnZWRTdGF0aWMuaCAtIFN0YXRpYyBHbG9iYWwgd3JhcHBlciAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIE1hbmFnZWRTdGF0aWMgY2xhc3MgYW5kIHRoZSBsbHZtX3NodXRkb3duKCkgZnVuY3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfTUFOQUdFRFNUQVRJQ19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9NQU5BR0VEU1RBVElDX0gKKworI2luY2x1ZGUgPGF0b21pYz4KKyNpbmNsdWRlIDxjc3RkZGVmPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBvYmplY3RfY3JlYXRvciAtIEhlbHBlciBtZXRob2QgZm9yIE1hbmFnZWRTdGF0aWMuCit0ZW1wbGF0ZSA8Y2xhc3MgQz4gc3RydWN0IG9iamVjdF9jcmVhdG9yIHsKKyAgc3RhdGljIHZvaWQgKmNhbGwoKSB7IHJldHVybiBuZXcgQygpOyB9Cit9OworCisvLy8gb2JqZWN0X2RlbGV0ZXIgLSBIZWxwZXIgbWV0aG9kIGZvciBNYW5hZ2VkU3RhdGljLgorLy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IG9iamVjdF9kZWxldGVyIHsKKyAgc3RhdGljIHZvaWQgY2FsbCh2b2lkICpQdHIpIHsgZGVsZXRlIChUICopUHRyOyB9Cit9OwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHNpemVfdCBOPiBzdHJ1Y3Qgb2JqZWN0X2RlbGV0ZXI8VFtOXT4geworICBzdGF0aWMgdm9pZCBjYWxsKHZvaWQgKlB0cikgeyBkZWxldGVbXShUICopUHRyOyB9Cit9OworCisvLy8gTWFuYWdlZFN0YXRpY0Jhc2UgLSBDb21tb24gYmFzZSBjbGFzcyBmb3IgTWFuYWdlZFN0YXRpYyBpbnN0YW5jZXMuCitjbGFzcyBNYW5hZ2VkU3RhdGljQmFzZSB7Citwcm90ZWN0ZWQ6CisgIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgdXNlZCBhcyBhIHN0YXRpYyB2YXJpYWJsZSwgd2hpY2ggZ3VhcmFudGVlcyB0aGF0IHRoaXMKKyAgLy8gd2lsbCBiZSB6ZXJvIGluaXRpYWxpemVkLgorICBtdXRhYmxlIHN0ZDo6YXRvbWljPHZvaWQgKj4gUHRyOworICBtdXRhYmxlIHZvaWQgKCpEZWxldGVyRm4pKHZvaWQqKTsKKyAgbXV0YWJsZSBjb25zdCBNYW5hZ2VkU3RhdGljQmFzZSAqTmV4dDsKKworICB2b2lkIFJlZ2lzdGVyTWFuYWdlZFN0YXRpYyh2b2lkICooKmNyZWF0b3IpKCksIHZvaWQgKCpkZWxldGVyKSh2b2lkKikpIGNvbnN0OworCitwdWJsaWM6CisgIC8vLyBpc0NvbnN0cnVjdGVkIC0gUmV0dXJuIHRydWUgaWYgdGhpcyBvYmplY3QgaGFzIG5vdCBiZWVuIGNyZWF0ZWQgeWV0LgorICBib29sIGlzQ29uc3RydWN0ZWQoKSBjb25zdCB7IHJldHVybiBQdHIgIT0gbnVsbHB0cjsgfQorCisgIHZvaWQgZGVzdHJveSgpIGNvbnN0OworfTsKKworLy8vIE1hbmFnZWRTdGF0aWMgLSBUaGlzIHRyYW5zcGFyZW50bHkgY2hhbmdlcyB0aGUgYmVoYXZpb3Igb2YgZ2xvYmFsIHN0YXRpY3MgdG8KKy8vLyBiZSBsYXppbHkgY29uc3RydWN0ZWQgb24gZGVtYW5kIChnb29kIGZvciByZWR1Y2luZyBzdGFydHVwIHRpbWVzIG9mIGR5bmFtaWMKKy8vLyBsaWJyYXJpZXMgdGhhdCBsaW5rIGluIExMVk0gY29tcG9uZW50cykgYW5kIGZvciBtYWtpbmcgZGVzdHJ1Y3Rpb24gYmUKKy8vLyBleHBsaWNpdCB0aHJvdWdoIHRoZSBsbHZtX3NodXRkb3duKCkgZnVuY3Rpb24gY2FsbC4KKy8vLwordGVtcGxhdGUgPGNsYXNzIEMsIGNsYXNzIENyZWF0b3IgPSBvYmplY3RfY3JlYXRvcjxDPiwKKyAgICAgICAgICBjbGFzcyBEZWxldGVyID0gb2JqZWN0X2RlbGV0ZXI8Qz4+CitjbGFzcyBNYW5hZ2VkU3RhdGljIDogcHVibGljIE1hbmFnZWRTdGF0aWNCYXNlIHsKK3B1YmxpYzoKKyAgLy8gQWNjZXNzb3JzLgorICBDICZvcGVyYXRvciooKSB7CisgICAgdm9pZCAqVG1wID0gUHRyLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgICAgaWYgKCFUbXApCisgICAgICBSZWdpc3Rlck1hbmFnZWRTdGF0aWMoQ3JlYXRvcjo6Y2FsbCwgRGVsZXRlcjo6Y2FsbCk7CisKKyAgICByZXR1cm4gKnN0YXRpY19jYXN0PEMgKj4oUHRyLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpOworICB9CisKKyAgQyAqb3BlcmF0b3ItPigpIHsgcmV0dXJuICYqKnRoaXM7IH0KKworICBjb25zdCBDICZvcGVyYXRvciooKSBjb25zdCB7CisgICAgdm9pZCAqVG1wID0gUHRyLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSk7CisgICAgaWYgKCFUbXApCisgICAgICBSZWdpc3Rlck1hbmFnZWRTdGF0aWMoQ3JlYXRvcjo6Y2FsbCwgRGVsZXRlcjo6Y2FsbCk7CisKKyAgICByZXR1cm4gKnN0YXRpY19jYXN0PEMgKj4oUHRyLmxvYWQoc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCkpOworICB9CisKKyAgY29uc3QgQyAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICYqKnRoaXM7IH0KK307CisKKy8vLyBsbHZtX3NodXRkb3duIC0gRGVhbGxvY2F0ZSBhbmQgZGVzdHJveSBhbGwgTWFuYWdlZFN0YXRpYyB2YXJpYWJsZXMuCit2b2lkIGxsdm1fc2h1dGRvd24oKTsKKworLy8vIGxsdm1fc2h1dGRvd25fb2JqIC0gVGhpcyBpcyBhIHNpbXBsZSBoZWxwZXIgY2xhc3MgdGhhdCBjYWxscworLy8vIGxsdm1fc2h1dGRvd24oKSB3aGVuIGl0IGlzIGRlc3Ryb3llZC4KK3N0cnVjdCBsbHZtX3NodXRkb3duX29iaiB7CisgIGxsdm1fc2h1dGRvd25fb2JqKCkgPSBkZWZhdWx0OworICB+bGx2bV9zaHV0ZG93bl9vYmooKSB7IGxsdm1fc2h1dGRvd24oKTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9NQU5BR0VEU1RBVElDX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzN2ExNjcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oCkBAIC0wLDAgKzEsODQ2IEBACisvLz09PS0tIGxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmggLSBVc2VmdWwgbWF0aCBmdW5jdGlvbnMgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBzb21lIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VmdWwgZm9yIG1hdGggc3R1ZmYuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfTUFUSEVYVFJBU19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9NQVRIRVhUUkFTX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Td2FwQnl0ZU9yZGVyLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y2xpbWl0cz4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKworI2lmZGVmIF9NU0NfVkVSCisjaW5jbHVkZSA8aW50cmluLmg+CisjZW5kaWYKKworI2lmZGVmIF9fQU5EUk9JRF9OREtfXworI2luY2x1ZGUgPGFuZHJvaWQvYXBpLWxldmVsLmg+CisjZW5kaWYKKworbmFtZXNwYWNlIGxsdm0geworLy8vIFxicmllZiBUaGUgYmVoYXZpb3IgYW4gb3BlcmF0aW9uIGhhcyBvbiBhbiBpbnB1dCBvZiAwLgorZW51bSBaZXJvQmVoYXZpb3IgeworICAvLy8gXGJyaWVmIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyB1bmRlZmluZWQuCisgIFpCX1VuZGVmaW5lZCwKKyAgLy8vIFxicmllZiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgbnVtZXJpY19saW1pdHM8VD46Om1heCgpCisgIFpCX01heCwKKyAgLy8vIFxicmllZiBUaGUgcmV0dXJuZWQgdmFsdWUgaXMgbnVtZXJpY19saW1pdHM8VD46OmRpZ2l0cworICBaQl9XaWR0aAorfTsKKworbmFtZXNwYWNlIGRldGFpbCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgU2l6ZU9mVD4gc3RydWN0IFRyYWlsaW5nWmVyb3NDb3VudGVyIHsKKyAgc3RhdGljIHN0ZDo6c2l6ZV90IGNvdW50KFQgVmFsLCBaZXJvQmVoYXZpb3IpIHsKKyAgICBpZiAoIVZhbCkKKyAgICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjpkaWdpdHM7CisgICAgaWYgKFZhbCAmIDB4MSkKKyAgICAgIHJldHVybiAwOworCisgICAgLy8gQmlzZWN0aW9uIG1ldGhvZC4KKyAgICBzdGQ6OnNpemVfdCBaZXJvQml0cyA9IDA7CisgICAgVCBTaGlmdCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmRpZ2l0cyA+PiAxOworICAgIFQgTWFzayA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpID4+IFNoaWZ0OworICAgIHdoaWxlIChTaGlmdCkgeworICAgICAgaWYgKChWYWwgJiBNYXNrKSA9PSAwKSB7CisgICAgICAgIFZhbCA+Pj0gU2hpZnQ7CisgICAgICAgIFplcm9CaXRzIHw9IFNoaWZ0OworICAgICAgfQorICAgICAgU2hpZnQgPj49IDE7CisgICAgICBNYXNrID4+PSBTaGlmdDsKKyAgICB9CisgICAgcmV0dXJuIFplcm9CaXRzOworICB9Cit9OworCisjaWYgX19HTlVDX18gPj0gNCB8fCBkZWZpbmVkKF9NU0NfVkVSKQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBUcmFpbGluZ1plcm9zQ291bnRlcjxULCA0PiB7CisgIHN0YXRpYyBzdGQ6OnNpemVfdCBjb3VudChUIFZhbCwgWmVyb0JlaGF2aW9yIFpCKSB7CisgICAgaWYgKFpCICE9IFpCX1VuZGVmaW5lZCAmJiBWYWwgPT0gMCkKKyAgICAgIHJldHVybiAzMjsKKworI2lmIF9faGFzX2J1aWx0aW4oX19idWlsdGluX2N0eikgfHwgTExWTV9HTlVDX1BSRVJFUSg0LCAwLCAwKQorICAgIHJldHVybiBfX2J1aWx0aW5fY3R6KFZhbCk7CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAgIHVuc2lnbmVkIGxvbmcgSW5kZXg7CisgICAgX0JpdFNjYW5Gb3J3YXJkKCZJbmRleCwgVmFsKTsKKyAgICByZXR1cm4gSW5kZXg7CisjZW5kaWYKKyAgfQorfTsKKworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBkZWZpbmVkKF9NX1g2NCkKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgVHJhaWxpbmdaZXJvc0NvdW50ZXI8VCwgOD4geworICBzdGF0aWMgc3RkOjpzaXplX3QgY291bnQoVCBWYWwsIFplcm9CZWhhdmlvciBaQikgeworICAgIGlmIChaQiAhPSBaQl9VbmRlZmluZWQgJiYgVmFsID09IDApCisgICAgICByZXR1cm4gNjQ7CisKKyNpZiBfX2hhc19idWlsdGluKF9fYnVpbHRpbl9jdHpsbCkgfHwgTExWTV9HTlVDX1BSRVJFUSg0LCAwLCAwKQorICAgIHJldHVybiBfX2J1aWx0aW5fY3R6bGwoVmFsKTsKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgICAgdW5zaWduZWQgbG9uZyBJbmRleDsKKyAgICBfQml0U2NhbkZvcndhcmQ2NCgmSW5kZXgsIFZhbCk7CisgICAgcmV0dXJuIEluZGV4OworI2VuZGlmCisgIH0KK307CisjZW5kaWYKKyNlbmRpZgorfSAvLyBuYW1lc3BhY2UgZGV0YWlsCisKKy8vLyBcYnJpZWYgQ291bnQgbnVtYmVyIG9mIDAncyBmcm9tIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXQgdG8gdGhlIG1vc3QKKy8vLyAgIHN0b3BwaW5nIGF0IHRoZSBmaXJzdCAxLgorLy8vCisvLy8gT25seSB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBhcmUgYWxsb3dlZC4KKy8vLworLy8vIFxwYXJhbSBaQiB0aGUgYmVoYXZpb3Igb24gYW4gaW5wdXQgb2YgMC4gT25seSBaQl9XaWR0aCBhbmQgWkJfVW5kZWZpbmVkIGFyZQorLy8vICAgdmFsaWQgYXJndW1lbnRzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnNpemVfdCBjb3VudFRyYWlsaW5nWmVyb3MoVCBWYWwsIFplcm9CZWhhdmlvciBaQiA9IFpCX1dpZHRoKSB7CisgIHN0YXRpY19hc3NlcnQoc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfaW50ZWdlciAmJgorICAgICAgICAgICAgICAgICAgICAhc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkLAorICAgICAgICAgICAgICAgICJPbmx5IHVuc2lnbmVkIGludGVncmFsIHR5cGVzIGFyZSBhbGxvd2VkLiIpOworICByZXR1cm4gbGx2bTo6ZGV0YWlsOjpUcmFpbGluZ1plcm9zQ291bnRlcjxULCBzaXplb2YoVCk+Ojpjb3VudChWYWwsIFpCKTsKK30KKworbmFtZXNwYWNlIGRldGFpbCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgU2l6ZU9mVD4gc3RydWN0IExlYWRpbmdaZXJvc0NvdW50ZXIgeworICBzdGF0aWMgc3RkOjpzaXplX3QgY291bnQoVCBWYWwsIFplcm9CZWhhdmlvcikgeworICAgIGlmICghVmFsKQorICAgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmRpZ2l0czsKKworICAgIC8vIEJpc2VjdGlvbiBtZXRob2QuCisgICAgc3RkOjpzaXplX3QgWmVyb0JpdHMgPSAwOworICAgIGZvciAoVCBTaGlmdCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmRpZ2l0cyA+PiAxOyBTaGlmdDsgU2hpZnQgPj49IDEpIHsKKyAgICAgIFQgVG1wID0gVmFsID4+IFNoaWZ0OworICAgICAgaWYgKFRtcCkKKyAgICAgICAgVmFsID0gVG1wOworICAgICAgZWxzZQorICAgICAgICBaZXJvQml0cyB8PSBTaGlmdDsKKyAgICB9CisgICAgcmV0dXJuIFplcm9CaXRzOworICB9Cit9OworCisjaWYgX19HTlVDX18gPj0gNCB8fCBkZWZpbmVkKF9NU0NfVkVSKQordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBMZWFkaW5nWmVyb3NDb3VudGVyPFQsIDQ+IHsKKyAgc3RhdGljIHN0ZDo6c2l6ZV90IGNvdW50KFQgVmFsLCBaZXJvQmVoYXZpb3IgWkIpIHsKKyAgICBpZiAoWkIgIT0gWkJfVW5kZWZpbmVkICYmIFZhbCA9PSAwKQorICAgICAgcmV0dXJuIDMyOworCisjaWYgX19oYXNfYnVpbHRpbihfX2J1aWx0aW5fY2x6KSB8fCBMTFZNX0dOVUNfUFJFUkVRKDQsIDAsIDApCisgICAgcmV0dXJuIF9fYnVpbHRpbl9jbHooVmFsKTsKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgICAgdW5zaWduZWQgbG9uZyBJbmRleDsKKyAgICBfQml0U2NhblJldmVyc2UoJkluZGV4LCBWYWwpOworICAgIHJldHVybiBJbmRleCBeIDMxOworI2VuZGlmCisgIH0KK307CisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgZGVmaW5lZChfTV9YNjQpCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IExlYWRpbmdaZXJvc0NvdW50ZXI8VCwgOD4geworICBzdGF0aWMgc3RkOjpzaXplX3QgY291bnQoVCBWYWwsIFplcm9CZWhhdmlvciBaQikgeworICAgIGlmIChaQiAhPSBaQl9VbmRlZmluZWQgJiYgVmFsID09IDApCisgICAgICByZXR1cm4gNjQ7CisKKyNpZiBfX2hhc19idWlsdGluKF9fYnVpbHRpbl9jbHpsbCkgfHwgTExWTV9HTlVDX1BSRVJFUSg0LCAwLCAwKQorICAgIHJldHVybiBfX2J1aWx0aW5fY2x6bGwoVmFsKTsKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpCisgICAgdW5zaWduZWQgbG9uZyBJbmRleDsKKyAgICBfQml0U2NhblJldmVyc2U2NCgmSW5kZXgsIFZhbCk7CisgICAgcmV0dXJuIEluZGV4IF4gNjM7CisjZW5kaWYKKyAgfQorfTsKKyNlbmRpZgorI2VuZGlmCit9IC8vIG5hbWVzcGFjZSBkZXRhaWwKKworLy8vIFxicmllZiBDb3VudCBudW1iZXIgb2YgMCdzIGZyb20gdGhlIG1vc3Qgc2lnbmlmaWNhbnQgYml0IHRvIHRoZSBsZWFzdAorLy8vICAgc3RvcHBpbmcgYXQgdGhlIGZpcnN0IDEuCisvLy8KKy8vLyBPbmx5IHVuc2lnbmVkIGludGVncmFsIHR5cGVzIGFyZSBhbGxvd2VkLgorLy8vCisvLy8gXHBhcmFtIFpCIHRoZSBiZWhhdmlvciBvbiBhbiBpbnB1dCBvZiAwLiBPbmx5IFpCX1dpZHRoIGFuZCBaQl9VbmRlZmluZWQgYXJlCisvLy8gICB2YWxpZCBhcmd1bWVudHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0ZDo6c2l6ZV90IGNvdW50TGVhZGluZ1plcm9zKFQgVmFsLCBaZXJvQmVoYXZpb3IgWkIgPSBaQl9XaWR0aCkgeworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX2ludGVnZXIgJiYKKyAgICAgICAgICAgICAgICAgICAgIXN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCwKKyAgICAgICAgICAgICAgICAiT25seSB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBhcmUgYWxsb3dlZC4iKTsKKyAgcmV0dXJuIGxsdm06OmRldGFpbDo6TGVhZGluZ1plcm9zQ291bnRlcjxULCBzaXplb2YoVCk+Ojpjb3VudChWYWwsIFpCKTsKK30KKworLy8vIFxicmllZiBHZXQgdGhlIGluZGV4IG9mIHRoZSBmaXJzdCBzZXQgYml0IHN0YXJ0aW5nIGZyb20gdGhlIGxlYXN0CisvLy8gICBzaWduaWZpY2FudCBiaXQuCisvLy8KKy8vLyBPbmx5IHVuc2lnbmVkIGludGVncmFsIHR5cGVzIGFyZSBhbGxvd2VkLgorLy8vCisvLy8gXHBhcmFtIFpCIHRoZSBiZWhhdmlvciBvbiBhbiBpbnB1dCBvZiAwLiBPbmx5IFpCX01heCBhbmQgWkJfVW5kZWZpbmVkIGFyZQorLy8vICAgdmFsaWQgYXJndW1lbnRzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgZmluZEZpcnN0U2V0KFQgVmFsLCBaZXJvQmVoYXZpb3IgWkIgPSBaQl9NYXgpIHsKKyAgaWYgKFpCID09IFpCX01heCAmJiBWYWwgPT0gMCkKKyAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCk7CisKKyAgcmV0dXJuIGNvdW50VHJhaWxpbmdaZXJvcyhWYWwsIFpCX1VuZGVmaW5lZCk7Cit9CisKKy8vLyBcYnJpZWYgQ3JlYXRlIGEgYml0bWFzayB3aXRoIHRoZSBOIHJpZ2h0LW1vc3QgYml0cyBzZXQgdG8gMSwgYW5kIGFsbCBvdGhlcgorLy8vIGJpdHMgc2V0IHRvIDAuICBPbmx5IHVuc2lnbmVkIHR5cGVzIGFyZSBhbGxvd2VkLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgbWFza1RyYWlsaW5nT25lcyh1bnNpZ25lZCBOKSB7CisgIHN0YXRpY19hc3NlcnQoc3RkOjppc191bnNpZ25lZDxUPjo6dmFsdWUsICJJbnZhbGlkIHR5cGUhIik7CisgIGNvbnN0IHVuc2lnbmVkIEJpdHMgPSBDSEFSX0JJVCAqIHNpemVvZihUKTsKKyAgYXNzZXJ0KE4gPD0gQml0cyAmJiAiSW52YWxpZCBiaXQgaW5kZXgiKTsKKyAgcmV0dXJuIE4gPT0gMCA/IDAgOiAoVCgtMSkgPj4gKEJpdHMgLSBOKSk7Cit9CisKKy8vLyBcYnJpZWYgQ3JlYXRlIGEgYml0bWFzayB3aXRoIHRoZSBOIGxlZnQtbW9zdCBiaXRzIHNldCB0byAxLCBhbmQgYWxsIG90aGVyCisvLy8gYml0cyBzZXQgdG8gMC4gIE9ubHkgdW5zaWduZWQgdHlwZXMgYXJlIGFsbG93ZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBtYXNrTGVhZGluZ09uZXModW5zaWduZWQgTikgeworICByZXR1cm4gfm1hc2tUcmFpbGluZ09uZXM8VD4oQ0hBUl9CSVQgKiBzaXplb2YoVCkgLSBOKTsKK30KKworLy8vIFxicmllZiBDcmVhdGUgYSBiaXRtYXNrIHdpdGggdGhlIE4gcmlnaHQtbW9zdCBiaXRzIHNldCB0byAwLCBhbmQgYWxsIG90aGVyCisvLy8gYml0cyBzZXQgdG8gMS4gIE9ubHkgdW5zaWduZWQgdHlwZXMgYXJlIGFsbG93ZWQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gVCBtYXNrVHJhaWxpbmdaZXJvcyh1bnNpZ25lZCBOKSB7CisgIHJldHVybiBtYXNrTGVhZGluZ09uZXM8VD4oQ0hBUl9CSVQgKiBzaXplb2YoVCkgLSBOKTsKK30KKworLy8vIFxicmllZiBDcmVhdGUgYSBiaXRtYXNrIHdpdGggdGhlIE4gbGVmdC1tb3N0IGJpdHMgc2V0IHRvIDAsIGFuZCBhbGwgb3RoZXIKKy8vLyBiaXRzIHNldCB0byAxLiAgT25seSB1bnNpZ25lZCB0eXBlcyBhcmUgYWxsb3dlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIG1hc2tMZWFkaW5nWmVyb3ModW5zaWduZWQgTikgeworICByZXR1cm4gbWFza1RyYWlsaW5nT25lczxUPihDSEFSX0JJVCAqIHNpemVvZihUKSAtIE4pOworfQorCisvLy8gXGJyaWVmIEdldCB0aGUgaW5kZXggb2YgdGhlIGxhc3Qgc2V0IGJpdCBzdGFydGluZyBmcm9tIHRoZSBsZWFzdAorLy8vICAgc2lnbmlmaWNhbnQgYml0LgorLy8vCisvLy8gT25seSB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBhcmUgYWxsb3dlZC4KKy8vLworLy8vIFxwYXJhbSBaQiB0aGUgYmVoYXZpb3Igb24gYW4gaW5wdXQgb2YgMC4gT25seSBaQl9NYXggYW5kIFpCX1VuZGVmaW5lZCBhcmUKKy8vLyAgIHZhbGlkIGFyZ3VtZW50cy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBUIGZpbmRMYXN0U2V0KFQgVmFsLCBaZXJvQmVoYXZpb3IgWkIgPSBaQl9NYXgpIHsKKyAgaWYgKFpCID09IFpCX01heCAmJiBWYWwgPT0gMCkKKyAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxUPjo6bWF4KCk7CisKKyAgLy8gVXNlIF4gaW5zdGVhZCBvZiAtIGJlY2F1c2UgYm90aCBnY2MgYW5kIGxsdm0gY2FuIHJlbW92ZSB0aGUgYXNzb2NpYXRlZCBeCisgIC8vIGluIHRoZSBfX2J1aWx0aW5fY2x6IGludHJpbnNpYyBvbiB4ODYuCisgIHJldHVybiBjb3VudExlYWRpbmdaZXJvcyhWYWwsIFpCX1VuZGVmaW5lZCkgXgorICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmRpZ2l0cyAtIDEpOworfQorCisvLy8gXGJyaWVmIE1hY3JvIGNvbXByZXNzZWQgYml0IHJldmVyc2FsIHRhYmxlIGZvciAyNTYgYml0cy4KKy8vLworLy8vIGh0dHA6Ly9ncmFwaGljcy5zdGFuZm9yZC5lZHUvfnNlYW5kZXIvYml0aGFja3MuaHRtbCNCaXRSZXZlcnNlVGFibGUKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIEJpdFJldmVyc2VUYWJsZTI1NlsyNTZdID0geworI2RlZmluZSBSMihuKSBuLCBuICsgMiAqIDY0LCBuICsgMSAqIDY0LCBuICsgMyAqIDY0CisjZGVmaW5lIFI0KG4pIFIyKG4pLCBSMihuICsgMiAqIDE2KSwgUjIobiArIDEgKiAxNiksIFIyKG4gKyAzICogMTYpCisjZGVmaW5lIFI2KG4pIFI0KG4pLCBSNChuICsgMiAqIDQpLCBSNChuICsgMSAqIDQpLCBSNChuICsgMyAqIDQpCisgIFI2KDApLCBSNigyKSwgUjYoMSksIFI2KDMpCisjdW5kZWYgUjIKKyN1bmRlZiBSNAorI3VuZGVmIFI2Cit9OworCisvLy8gXGJyaWVmIFJldmVyc2UgdGhlIGJpdHMgaW4gXHAgVmFsLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUIHJldmVyc2VCaXRzKFQgVmFsKSB7CisgIHVuc2lnbmVkIGNoYXIgaW5bc2l6ZW9mKFZhbCldOworICB1bnNpZ25lZCBjaGFyIG91dFtzaXplb2YoVmFsKV07CisgIHN0ZDo6bWVtY3B5KGluLCAmVmFsLCBzaXplb2YoVmFsKSk7CisgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgPCBzaXplb2YoVmFsKTsgKytpKQorICAgIG91dFsoc2l6ZW9mKFZhbCkgLSBpKSAtIDFdID0gQml0UmV2ZXJzZVRhYmxlMjU2W2luW2ldXTsKKyAgc3RkOjptZW1jcHkoJlZhbCwgb3V0LCBzaXplb2YoVmFsKSk7CisgIHJldHVybiBWYWw7Cit9CisKKy8vIE5PVEU6IFRoZSBmb2xsb3dpbmcgc3VwcG9ydCBmdW5jdGlvbnMgdXNlIHRoZSBfMzIvXzY0IGV4dGVuc2lvbnMgaW5zdGVhZCBvZgorLy8gdHlwZSBvdmVybG9hZGluZyBzbyB0aGF0IHNpZ25lZCBhbmQgdW5zaWduZWQgaW50ZWdlcnMgY2FuIGJlIHVzZWQgd2l0aG91dAorLy8gYW1iaWd1aXR5LgorCisvLy8gUmV0dXJuIHRoZSBoaWdoIDMyIGJpdHMgb2YgYSA2NCBiaXQgdmFsdWUuCitjb25zdGV4cHIgaW5saW5lIHVpbnQzMl90IEhpXzMyKHVpbnQ2NF90IFZhbHVlKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oVmFsdWUgPj4gMzIpOworfQorCisvLy8gUmV0dXJuIHRoZSBsb3cgMzIgYml0cyBvZiBhIDY0IGJpdCB2YWx1ZS4KK2NvbnN0ZXhwciBpbmxpbmUgdWludDMyX3QgTG9fMzIodWludDY0X3QgVmFsdWUpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMl90PihWYWx1ZSk7Cit9CisKKy8vLyBNYWtlIGEgNjQtYml0IGludGVnZXIgZnJvbSBhIGhpZ2ggLyBsb3cgcGFpciBvZiAzMi1iaXQgaW50ZWdlcnMuCitjb25zdGV4cHIgaW5saW5lIHVpbnQ2NF90IE1ha2VfNjQodWludDMyX3QgSGlnaCwgdWludDMyX3QgTG93KSB7CisgIHJldHVybiAoKHVpbnQ2NF90KUhpZ2ggPDwgMzIpIHwgKHVpbnQ2NF90KUxvdzsKK30KKworLy8vIENoZWNrcyBpZiBhbiBpbnRlZ2VyIGZpdHMgaW50byB0aGUgZ2l2ZW4gYml0IHdpZHRoLgordGVtcGxhdGUgPHVuc2lnbmVkIE4+IGNvbnN0ZXhwciBpbmxpbmUgYm9vbCBpc0ludChpbnQ2NF90IHgpIHsKKyAgcmV0dXJuIE4gPj0gNjQgfHwgKC0oSU5UNjRfQygxKTw8KE4tMSkpIDw9IHggJiYgeCA8IChJTlQ2NF9DKDEpPDwoTi0xKSkpOworfQorLy8gVGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIHRvIGdldCBiZXR0ZXIgY29kZSBmb3IgY29tbW9uIGNhc2VzLgordGVtcGxhdGUgPD4gY29uc3RleHByIGlubGluZSBib29sIGlzSW50PDg+KGludDY0X3QgeCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50OF90Pih4KSA9PSB4OworfQordGVtcGxhdGUgPD4gY29uc3RleHByIGlubGluZSBib29sIGlzSW50PDE2PihpbnQ2NF90IHgpIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludDE2X3Q+KHgpID09IHg7Cit9Cit0ZW1wbGF0ZSA8PiBjb25zdGV4cHIgaW5saW5lIGJvb2wgaXNJbnQ8MzI+KGludDY0X3QgeCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4oeCkgPT0geDsKK30KKworLy8vIENoZWNrcyBpZiBhIHNpZ25lZCBpbnRlZ2VyIGlzIGFuIE4gYml0IG51bWJlciBzaGlmdGVkIGxlZnQgYnkgUy4KK3RlbXBsYXRlIDx1bnNpZ25lZCBOLCB1bnNpZ25lZCBTPgorY29uc3RleHByIGlubGluZSBib29sIGlzU2hpZnRlZEludChpbnQ2NF90IHgpIHsKKyAgc3RhdGljX2Fzc2VydCgKKyAgICAgIE4gPiAwLCAiaXNTaGlmdGVkSW50PDA+IGRvZXNuJ3QgbWFrZSBzZW5zZSAocmVmZXJzIHRvIGEgMC1iaXQgbnVtYmVyLiIpOworICBzdGF0aWNfYXNzZXJ0KE4gKyBTIDw9IDY0LCAiaXNTaGlmdGVkSW50PE4sIFM+IHdpdGggTiArIFMgPiA2NCBpcyB0b28gd2lkZS4iKTsKKyAgcmV0dXJuIGlzSW50PE4gKyBTPih4KSAmJiAoeCAlIChVSU5UNjRfQygxKSA8PCBTKSA9PSAwKTsKK30KKworLy8vIENoZWNrcyBpZiBhbiB1bnNpZ25lZCBpbnRlZ2VyIGZpdHMgaW50byB0aGUgZ2l2ZW4gYml0IHdpZHRoLgorLy8vCisvLy8gVGhpcyBpcyB3cml0dGVuIGFzIHR3byBmdW5jdGlvbnMgcmF0aGVyIHRoYW4gYXMgc2ltcGx5CisvLy8KKy8vLyAgIHJldHVybiBOID49IDY0IHx8IFggPCAoVUlOVDY0X0MoMSkgPDwgTik7CisvLy8KKy8vLyB0byBrZWVwIE1TVkMgZnJvbSAoaW5jb3JyZWN0bHkpIHdhcm5pbmcgb24gaXNVSW50PDY0PiB0aGF0IHdlJ3JlIHNoaWZ0aW5nCisvLy8gbGVmdCB0b28gbWFueSBwbGFjZXMuCit0ZW1wbGF0ZSA8dW5zaWduZWQgTj4KK2NvbnN0ZXhwciBpbmxpbmUgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8KE4gPCA2NCksIGJvb2w+Ojp0eXBlCitpc1VJbnQodWludDY0X3QgWCkgeworICBzdGF0aWNfYXNzZXJ0KE4gPiAwLCAiaXNVSW50PDA+IGRvZXNuJ3QgbWFrZSBzZW5zZSIpOworICByZXR1cm4gWCA8IChVSU5UNjRfQygxKSA8PCAoTikpOworfQordGVtcGxhdGUgPHVuc2lnbmVkIE4+Citjb25zdGV4cHIgaW5saW5lIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPE4gPj0gNjQsIGJvb2w+Ojp0eXBlCitpc1VJbnQodWludDY0X3QgWCkgeworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVGVtcGxhdGUgc3BlY2lhbGl6YXRpb25zIHRvIGdldCBiZXR0ZXIgY29kZSBmb3IgY29tbW9uIGNhc2VzLgordGVtcGxhdGUgPD4gY29uc3RleHByIGlubGluZSBib29sIGlzVUludDw4Pih1aW50NjRfdCB4KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50OF90Pih4KSA9PSB4OworfQordGVtcGxhdGUgPD4gY29uc3RleHByIGlubGluZSBib29sIGlzVUludDwxNj4odWludDY0X3QgeCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDE2X3Q+KHgpID09IHg7Cit9Cit0ZW1wbGF0ZSA8PiBjb25zdGV4cHIgaW5saW5lIGJvb2wgaXNVSW50PDMyPih1aW50NjRfdCB4KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzJfdD4oeCkgPT0geDsKK30KKworLy8vIENoZWNrcyBpZiBhIHVuc2lnbmVkIGludGVnZXIgaXMgYW4gTiBiaXQgbnVtYmVyIHNoaWZ0ZWQgbGVmdCBieSBTLgordGVtcGxhdGUgPHVuc2lnbmVkIE4sIHVuc2lnbmVkIFM+Citjb25zdGV4cHIgaW5saW5lIGJvb2wgaXNTaGlmdGVkVUludCh1aW50NjRfdCB4KSB7CisgIHN0YXRpY19hc3NlcnQoCisgICAgICBOID4gMCwgImlzU2hpZnRlZFVJbnQ8MD4gZG9lc24ndCBtYWtlIHNlbnNlIChyZWZlcnMgdG8gYSAwLWJpdCBudW1iZXIpIik7CisgIHN0YXRpY19hc3NlcnQoTiArIFMgPD0gNjQsCisgICAgICAgICAgICAgICAgImlzU2hpZnRlZFVJbnQ8TiwgUz4gd2l0aCBOICsgUyA+IDY0IGlzIHRvbyB3aWRlLiIpOworICAvLyBQZXIgdGhlIHR3byBzdGF0aWNfYXNzZXJ0cyBhYm92ZSwgUyBtdXN0IGJlIHN0cmljdGx5IGxlc3MgdGhhbiA2NC4gIFNvCisgIC8vIDEgPDwgUyBpcyBub3QgdW5kZWZpbmVkIGJlaGF2aW9yLgorICByZXR1cm4gaXNVSW50PE4gKyBTPih4KSAmJiAoeCAlIChVSU5UNjRfQygxKSA8PCBTKSA9PSAwKTsKK30KKworLy8vIEdldHMgdGhlIG1heGltdW0gdmFsdWUgZm9yIGEgTi1iaXQgdW5zaWduZWQgaW50ZWdlci4KK2lubGluZSB1aW50NjRfdCBtYXhVSW50Tih1aW50NjRfdCBOKSB7CisgIGFzc2VydChOID4gMCAmJiBOIDw9IDY0ICYmICJpbnRlZ2VyIHdpZHRoIG91dCBvZiByYW5nZSIpOworCisgIC8vIHVpbnQ2NF90KDEpIDw8IDY0IGlzIHVuZGVmaW5lZCBiZWhhdmlvciwgc28gd2UgY2FuJ3QgZG8KKyAgLy8gICAodWludDY0X3QoMSkgPDwgTikgLSAxCisgIC8vIHdpdGhvdXQgY2hlY2tpbmcgZmlyc3QgdGhhdCBOICE9IDY0LiAgQnV0IHRoaXMgd29ya3MgYW5kIGRvZXNuJ3QgaGF2ZSBhCisgIC8vIGJyYW5jaC4KKyAgcmV0dXJuIFVJTlQ2NF9NQVggPj4gKDY0IC0gTik7Cit9CisKKy8vLyBHZXRzIHRoZSBtaW5pbXVtIHZhbHVlIGZvciBhIE4tYml0IHNpZ25lZCBpbnRlZ2VyLgoraW5saW5lIGludDY0X3QgbWluSW50TihpbnQ2NF90IE4pIHsKKyAgYXNzZXJ0KE4gPiAwICYmIE4gPD0gNjQgJiYgImludGVnZXIgd2lkdGggb3V0IG9mIHJhbmdlIik7CisKKyAgcmV0dXJuIC0oVUlOVDY0X0MoMSk8PChOLTEpKTsKK30KKworLy8vIEdldHMgdGhlIG1heGltdW0gdmFsdWUgZm9yIGEgTi1iaXQgc2lnbmVkIGludGVnZXIuCitpbmxpbmUgaW50NjRfdCBtYXhJbnROKGludDY0X3QgTikgeworICBhc3NlcnQoTiA+IDAgJiYgTiA8PSA2NCAmJiAiaW50ZWdlciB3aWR0aCBvdXQgb2YgcmFuZ2UiKTsKKworICAvLyBUaGlzIHJlbGllcyBvbiB0d28ncyBjb21wbGVtZW50IHdyYXBhcm91bmQgd2hlbiBOID09IDY0LCBzbyB3ZSBjb252ZXJ0IHRvCisgIC8vIGludDY0X3Qgb25seSBhdCB0aGUgdmVyeSBlbmQgdG8gYXZvaWQgVUIuCisgIHJldHVybiAoVUlOVDY0X0MoMSkgPDwgKE4gLSAxKSkgLSAxOworfQorCisvLy8gQ2hlY2tzIGlmIGFuIHVuc2lnbmVkIGludGVnZXIgZml0cyBpbnRvIHRoZSBnaXZlbiAoZHluYW1pYykgYml0IHdpZHRoLgoraW5saW5lIGJvb2wgaXNVSW50Tih1bnNpZ25lZCBOLCB1aW50NjRfdCB4KSB7CisgIHJldHVybiBOID49IDY0IHx8IHggPD0gbWF4VUludE4oTik7Cit9CisKKy8vLyBDaGVja3MgaWYgYW4gc2lnbmVkIGludGVnZXIgZml0cyBpbnRvIHRoZSBnaXZlbiAoZHluYW1pYykgYml0IHdpZHRoLgoraW5saW5lIGJvb2wgaXNJbnROKHVuc2lnbmVkIE4sIGludDY0X3QgeCkgeworICByZXR1cm4gTiA+PSA2NCB8fCAobWluSW50TihOKSA8PSB4ICYmIHggPD0gbWF4SW50TihOKSk7Cit9CisKKy8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBub24tZW1wdHkgc2VxdWVuY2Ugb2Ygb25lcyBzdGFydGluZyBhdCB0aGUKKy8vLyBsZWFzdCBzaWduaWZpY2FudCBiaXQgd2l0aCB0aGUgcmVtYWluZGVyIHplcm8gKDMyIGJpdCB2ZXJzaW9uKS4KKy8vLyBFeC4gaXNNYXNrXzMyKDB4MDAwMEZGRkZVKSA9PSB0cnVlLgorY29uc3RleHByIGlubGluZSBib29sIGlzTWFza18zMih1aW50MzJfdCBWYWx1ZSkgeworICByZXR1cm4gVmFsdWUgJiYgKChWYWx1ZSArIDEpICYgVmFsdWUpID09IDA7Cit9CisKKy8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBub24tZW1wdHkgc2VxdWVuY2Ugb2Ygb25lcyBzdGFydGluZyBhdCB0aGUKKy8vLyBsZWFzdCBzaWduaWZpY2FudCBiaXQgd2l0aCB0aGUgcmVtYWluZGVyIHplcm8gKDY0IGJpdCB2ZXJzaW9uKS4KK2NvbnN0ZXhwciBpbmxpbmUgYm9vbCBpc01hc2tfNjQodWludDY0X3QgVmFsdWUpIHsKKyAgcmV0dXJuIFZhbHVlICYmICgoVmFsdWUgKyAxKSAmIFZhbHVlKSA9PSAwOworfQorCisvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGFyZ3VtZW50IGNvbnRhaW5zIGEgbm9uLWVtcHR5IHNlcXVlbmNlIG9mIG9uZXMgd2l0aCB0aGUKKy8vLyByZW1haW5kZXIgemVybyAoMzIgYml0IHZlcnNpb24uKSBFeC4gaXNTaGlmdGVkTWFza18zMigweDAwMDBGRjAwVSkgPT0gdHJ1ZS4KK2NvbnN0ZXhwciBpbmxpbmUgYm9vbCBpc1NoaWZ0ZWRNYXNrXzMyKHVpbnQzMl90IFZhbHVlKSB7CisgIHJldHVybiBWYWx1ZSAmJiBpc01hc2tfMzIoKFZhbHVlIC0gMSkgfCBWYWx1ZSk7Cit9CisKKy8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXJndW1lbnQgY29udGFpbnMgYSBub24tZW1wdHkgc2VxdWVuY2Ugb2Ygb25lcyB3aXRoIHRoZQorLy8vIHJlbWFpbmRlciB6ZXJvICg2NCBiaXQgdmVyc2lvbi4pCitjb25zdGV4cHIgaW5saW5lIGJvb2wgaXNTaGlmdGVkTWFza182NCh1aW50NjRfdCBWYWx1ZSkgeworICByZXR1cm4gVmFsdWUgJiYgaXNNYXNrXzY0KChWYWx1ZSAtIDEpIHwgVmFsdWUpOworfQorCisvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGFyZ3VtZW50IGlzIGEgcG93ZXIgb2YgdHdvID4gMC4KKy8vLyBFeC4gaXNQb3dlck9mMl8zMigweDAwMTAwMDAwVSkgPT0gdHJ1ZSAoMzIgYml0IGVkaXRpb24uKQorY29uc3RleHByIGlubGluZSBib29sIGlzUG93ZXJPZjJfMzIodWludDMyX3QgVmFsdWUpIHsKKyAgcmV0dXJuIFZhbHVlICYmICEoVmFsdWUgJiAoVmFsdWUgLSAxKSk7Cit9CisKKy8vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgYXJndW1lbnQgaXMgYSBwb3dlciBvZiB0d28gPiAwICg2NCBiaXQgZWRpdGlvbi4pCitjb25zdGV4cHIgaW5saW5lIGJvb2wgaXNQb3dlck9mMl82NCh1aW50NjRfdCBWYWx1ZSkgeworICByZXR1cm4gVmFsdWUgJiYgIShWYWx1ZSAmIChWYWx1ZSAtIDEpKTsKK30KKworLy8vIFJldHVybiBhIGJ5dGUtc3dhcHBlZCByZXByZXNlbnRhdGlvbiBvZiB0aGUgMTYtYml0IGFyZ3VtZW50LgoraW5saW5lIHVpbnQxNl90IEJ5dGVTd2FwXzE2KHVpbnQxNl90IFZhbHVlKSB7CisgIHJldHVybiBzeXM6OlN3YXBCeXRlT3JkZXJfMTYoVmFsdWUpOworfQorCisvLy8gUmV0dXJuIGEgYnl0ZS1zd2FwcGVkIHJlcHJlc2VudGF0aW9uIG9mIHRoZSAzMi1iaXQgYXJndW1lbnQuCitpbmxpbmUgdWludDMyX3QgQnl0ZVN3YXBfMzIodWludDMyX3QgVmFsdWUpIHsKKyAgcmV0dXJuIHN5czo6U3dhcEJ5dGVPcmRlcl8zMihWYWx1ZSk7Cit9CisKKy8vLyBSZXR1cm4gYSBieXRlLXN3YXBwZWQgcmVwcmVzZW50YXRpb24gb2YgdGhlIDY0LWJpdCBhcmd1bWVudC4KK2lubGluZSB1aW50NjRfdCBCeXRlU3dhcF82NCh1aW50NjRfdCBWYWx1ZSkgeworICByZXR1cm4gc3lzOjpTd2FwQnl0ZU9yZGVyXzY0KFZhbHVlKTsKK30KKworLy8vIFxicmllZiBDb3VudCB0aGUgbnVtYmVyIG9mIG9uZXMgZnJvbSB0aGUgbW9zdCBzaWduaWZpY2FudCBiaXQgdG8gdGhlIGZpcnN0CisvLy8gemVybyBiaXQuCisvLy8KKy8vLyBFeC4gY291bnRMZWFkaW5nT25lcygweEZGMEZGRjAwKSA9PSA4LgorLy8vIE9ubHkgdW5zaWduZWQgaW50ZWdyYWwgdHlwZXMgYXJlIGFsbG93ZWQuCisvLy8KKy8vLyBccGFyYW0gWkIgdGhlIGJlaGF2aW9yIG9uIGFuIGlucHV0IG9mIGFsbCBvbmVzLiBPbmx5IFpCX1dpZHRoIGFuZAorLy8vIFpCX1VuZGVmaW5lZCBhcmUgdmFsaWQgYXJndW1lbnRzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnNpemVfdCBjb3VudExlYWRpbmdPbmVzKFQgVmFsdWUsIFplcm9CZWhhdmlvciBaQiA9IFpCX1dpZHRoKSB7CisgIHN0YXRpY19hc3NlcnQoc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfaW50ZWdlciAmJgorICAgICAgICAgICAgICAgICAgICAhc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkLAorICAgICAgICAgICAgICAgICJPbmx5IHVuc2lnbmVkIGludGVncmFsIHR5cGVzIGFyZSBhbGxvd2VkLiIpOworICByZXR1cm4gY291bnRMZWFkaW5nWmVyb3MoflZhbHVlLCBaQik7Cit9CisKKy8vLyBcYnJpZWYgQ291bnQgdGhlIG51bWJlciBvZiBvbmVzIGZyb20gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdCB0byB0aGUgZmlyc3QKKy8vLyB6ZXJvIGJpdC4KKy8vLworLy8vIEV4LiBjb3VudFRyYWlsaW5nT25lcygweDAwRkYwMEZGKSA9PSA4LgorLy8vIE9ubHkgdW5zaWduZWQgaW50ZWdyYWwgdHlwZXMgYXJlIGFsbG93ZWQuCisvLy8KKy8vLyBccGFyYW0gWkIgdGhlIGJlaGF2aW9yIG9uIGFuIGlucHV0IG9mIGFsbCBvbmVzLiBPbmx5IFpCX1dpZHRoIGFuZAorLy8vIFpCX1VuZGVmaW5lZCBhcmUgdmFsaWQgYXJndW1lbnRzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdGQ6OnNpemVfdCBjb3VudFRyYWlsaW5nT25lcyhUIFZhbHVlLCBaZXJvQmVoYXZpb3IgWkIgPSBaQl9XaWR0aCkgeworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX2ludGVnZXIgJiYKKyAgICAgICAgICAgICAgICAgICAgIXN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCwKKyAgICAgICAgICAgICAgICAiT25seSB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBhcmUgYWxsb3dlZC4iKTsKKyAgcmV0dXJuIGNvdW50VHJhaWxpbmdaZXJvcyh+VmFsdWUsIFpCKTsKK30KKworbmFtZXNwYWNlIGRldGFpbCB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgc3RkOjpzaXplX3QgU2l6ZU9mVD4gc3RydWN0IFBvcHVsYXRpb25Db3VudGVyIHsKKyAgc3RhdGljIHVuc2lnbmVkIGNvdW50KFQgVmFsdWUpIHsKKyAgICAvLyBHZW5lcmljIHZlcnNpb24sIGZvcndhcmQgdG8gMzIgYml0cy4KKyAgICBzdGF0aWNfYXNzZXJ0KFNpemVPZlQgPD0gNCwgIk5vdCBpbXBsZW1lbnRlZCEiKTsKKyNpZiBfX0dOVUNfXyA+PSA0CisgICAgcmV0dXJuIF9fYnVpbHRpbl9wb3Bjb3VudChWYWx1ZSk7CisjZWxzZQorICAgIHVpbnQzMl90IHYgPSBWYWx1ZTsKKyAgICB2ID0gdiAtICgodiA+PiAxKSAmIDB4NTU1NTU1NTUpOworICAgIHYgPSAodiAmIDB4MzMzMzMzMzMpICsgKCh2ID4+IDIpICYgMHgzMzMzMzMzMyk7CisgICAgcmV0dXJuICgodiArICh2ID4+IDQpICYgMHhGMEYwRjBGKSAqIDB4MTAxMDEwMSkgPj4gMjQ7CisjZW5kaWYKKyAgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBQb3B1bGF0aW9uQ291bnRlcjxULCA4PiB7CisgIHN0YXRpYyB1bnNpZ25lZCBjb3VudChUIFZhbHVlKSB7CisjaWYgX19HTlVDX18gPj0gNAorICAgIHJldHVybiBfX2J1aWx0aW5fcG9wY291bnRsbChWYWx1ZSk7CisjZWxzZQorICAgIHVpbnQ2NF90IHYgPSBWYWx1ZTsKKyAgICB2ID0gdiAtICgodiA+PiAxKSAmIDB4NTU1NTU1NTU1NTU1NTU1NVVMTCk7CisgICAgdiA9ICh2ICYgMHgzMzMzMzMzMzMzMzMzMzMzVUxMKSArICgodiA+PiAyKSAmIDB4MzMzMzMzMzMzMzMzMzMzM1VMTCk7CisgICAgdiA9ICh2ICsgKHYgPj4gNCkpICYgMHgwRjBGMEYwRjBGMEYwRjBGVUxMOworICAgIHJldHVybiB1bnNpZ25lZCgodWludDY0X3QpKHYgKiAweDAxMDEwMTAxMDEwMTAxMDFVTEwpID4+IDU2KTsKKyNlbmRpZgorICB9Cit9OworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCisKKy8vLyBcYnJpZWYgQ291bnQgdGhlIG51bWJlciBvZiBzZXQgYml0cyBpbiBhIHZhbHVlLgorLy8vIEV4LiBjb3VudFBvcHVsYXRpb24oMHhGMDAwRjAwMCkgPSA4CisvLy8gUmV0dXJucyAwIGlmIHRoZSB3b3JkIGlzIHplcm8uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZSB1bnNpZ25lZCBjb3VudFBvcHVsYXRpb24oVCBWYWx1ZSkgeworICBzdGF0aWNfYXNzZXJ0KHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX2ludGVnZXIgJiYKKyAgICAgICAgICAgICAgICAgICAgIXN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCwKKyAgICAgICAgICAgICAgICAiT25seSB1bnNpZ25lZCBpbnRlZ3JhbCB0eXBlcyBhcmUgYWxsb3dlZC4iKTsKKyAgcmV0dXJuIGRldGFpbDo6UG9wdWxhdGlvbkNvdW50ZXI8VCwgc2l6ZW9mKFQpPjo6Y291bnQoVmFsdWUpOworfQorCisvLy8gUmV0dXJuIHRoZSBsb2cgYmFzZSAyIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUuCitpbmxpbmUgZG91YmxlIExvZzIoZG91YmxlIFZhbHVlKSB7CisjaWYgZGVmaW5lZChfX0FORFJPSURfQVBJX18pICYmIF9fQU5EUk9JRF9BUElfXyA8IDE4CisgIHJldHVybiBfX2J1aWx0aW5fbG9nKFZhbHVlKSAvIF9fYnVpbHRpbl9sb2coMi4wKTsKKyNlbHNlCisgIHJldHVybiBsb2cyKFZhbHVlKTsKKyNlbmRpZgorfQorCisvLy8gUmV0dXJuIHRoZSBmbG9vciBsb2cgYmFzZSAyIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUsIC0xIGlmIHRoZSB2YWx1ZSBpcyB6ZXJvLgorLy8vICgzMiBiaXQgZWRpdGlvbi4pCisvLy8gRXguIExvZzJfMzIoMzIpID09IDUsIExvZzJfMzIoMSkgPT0gMCwgTG9nMl8zMigwKSA9PSAtMSwgTG9nMl8zMig2KSA9PSAyCitpbmxpbmUgdW5zaWduZWQgTG9nMl8zMih1aW50MzJfdCBWYWx1ZSkgeworICByZXR1cm4gMzEgLSBjb3VudExlYWRpbmdaZXJvcyhWYWx1ZSk7Cit9CisKKy8vLyBSZXR1cm4gdGhlIGZsb29yIGxvZyBiYXNlIDIgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZSwgLTEgaWYgdGhlIHZhbHVlIGlzIHplcm8uCisvLy8gKDY0IGJpdCBlZGl0aW9uLikKK2lubGluZSB1bnNpZ25lZCBMb2cyXzY0KHVpbnQ2NF90IFZhbHVlKSB7CisgIHJldHVybiA2MyAtIGNvdW50TGVhZGluZ1plcm9zKFZhbHVlKTsKK30KKworLy8vIFJldHVybiB0aGUgY2VpbCBsb2cgYmFzZSAyIG9mIHRoZSBzcGVjaWZpZWQgdmFsdWUsIDMyIGlmIHRoZSB2YWx1ZSBpcyB6ZXJvLgorLy8vICgzMiBiaXQgZWRpdGlvbikuCisvLy8gRXguIExvZzJfMzJfQ2VpbCgzMikgPT0gNSwgTG9nMl8zMl9DZWlsKDEpID09IDAsIExvZzJfMzJfQ2VpbCg2KSA9PSAzCitpbmxpbmUgdW5zaWduZWQgTG9nMl8zMl9DZWlsKHVpbnQzMl90IFZhbHVlKSB7CisgIHJldHVybiAzMiAtIGNvdW50TGVhZGluZ1plcm9zKFZhbHVlIC0gMSk7Cit9CisKKy8vLyBSZXR1cm4gdGhlIGNlaWwgbG9nIGJhc2UgMiBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlLCA2NCBpZiB0aGUgdmFsdWUgaXMgemVyby4KKy8vLyAoNjQgYml0IGVkaXRpb24uKQoraW5saW5lIHVuc2lnbmVkIExvZzJfNjRfQ2VpbCh1aW50NjRfdCBWYWx1ZSkgeworICByZXR1cm4gNjQgLSBjb3VudExlYWRpbmdaZXJvcyhWYWx1ZSAtIDEpOworfQorCisvLy8gUmV0dXJuIHRoZSBncmVhdGVzdCBjb21tb24gZGl2aXNvciBvZiB0aGUgdmFsdWVzIHVzaW5nIEV1Y2xpZCdzIGFsZ29yaXRobS4KK2lubGluZSB1aW50NjRfdCBHcmVhdGVzdENvbW1vbkRpdmlzb3I2NCh1aW50NjRfdCBBLCB1aW50NjRfdCBCKSB7CisgIHdoaWxlIChCKSB7CisgICAgdWludDY0X3QgVCA9IEI7CisgICAgQiA9IEEgJSBCOworICAgIEEgPSBUOworICB9CisgIHJldHVybiBBOworfQorCisvLy8gVGhpcyBmdW5jdGlvbiB0YWtlcyBhIDY0LWJpdCBpbnRlZ2VyIGFuZCByZXR1cm5zIHRoZSBiaXQgZXF1aXZhbGVudCBkb3VibGUuCitpbmxpbmUgZG91YmxlIEJpdHNUb0RvdWJsZSh1aW50NjRfdCBCaXRzKSB7CisgIGRvdWJsZSBEOworICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1aW50NjRfdCkgPT0gc2l6ZW9mKGRvdWJsZSksICJVbmV4cGVjdGVkIHR5cGUgc2l6ZXMiKTsKKyAgbWVtY3B5KCZELCAmQml0cywgc2l6ZW9mKEJpdHMpKTsKKyAgcmV0dXJuIEQ7Cit9CisKKy8vLyBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgMzItYml0IGludGVnZXIgYW5kIHJldHVybnMgdGhlIGJpdCBlcXVpdmFsZW50IGZsb2F0LgoraW5saW5lIGZsb2F0IEJpdHNUb0Zsb2F0KHVpbnQzMl90IEJpdHMpIHsKKyAgZmxvYXQgRjsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YodWludDMyX3QpID09IHNpemVvZihmbG9hdCksICJVbmV4cGVjdGVkIHR5cGUgc2l6ZXMiKTsKKyAgbWVtY3B5KCZGLCAmQml0cywgc2l6ZW9mKEJpdHMpKTsKKyAgcmV0dXJuIEY7Cit9CisKKy8vLyBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgZG91YmxlIGFuZCByZXR1cm5zIHRoZSBiaXQgZXF1aXZhbGVudCA2NC1iaXQgaW50ZWdlci4KKy8vLyBOb3RlIHRoYXQgY29weWluZyBkb3VibGVzIGFyb3VuZCBjaGFuZ2VzIHRoZSBiaXRzIG9mIE5hTnMgb24gc29tZSBob3N0cywKKy8vLyBub3RhYmx5IHg4Niwgc28gdGhpcyByb3V0aW5lIGNhbm5vdCBiZSB1c2VkIGlmIHRoZXNlIGJpdHMgYXJlIG5lZWRlZC4KK2lubGluZSB1aW50NjRfdCBEb3VibGVUb0JpdHMoZG91YmxlIERvdWJsZSkgeworICB1aW50NjRfdCBCaXRzOworICBzdGF0aWNfYXNzZXJ0KHNpemVvZih1aW50NjRfdCkgPT0gc2l6ZW9mKGRvdWJsZSksICJVbmV4cGVjdGVkIHR5cGUgc2l6ZXMiKTsKKyAgbWVtY3B5KCZCaXRzLCAmRG91YmxlLCBzaXplb2YoRG91YmxlKSk7CisgIHJldHVybiBCaXRzOworfQorCisvLy8gVGhpcyBmdW5jdGlvbiB0YWtlcyBhIGZsb2F0IGFuZCByZXR1cm5zIHRoZSBiaXQgZXF1aXZhbGVudCAzMi1iaXQgaW50ZWdlci4KKy8vLyBOb3RlIHRoYXQgY29weWluZyBmbG9hdHMgYXJvdW5kIGNoYW5nZXMgdGhlIGJpdHMgb2YgTmFOcyBvbiBzb21lIGhvc3RzLAorLy8vIG5vdGFibHkgeDg2LCBzbyB0aGlzIHJvdXRpbmUgY2Fubm90IGJlIHVzZWQgaWYgdGhlc2UgYml0cyBhcmUgbmVlZGVkLgoraW5saW5lIHVpbnQzMl90IEZsb2F0VG9CaXRzKGZsb2F0IEZsb2F0KSB7CisgIHVpbnQzMl90IEJpdHM7CisgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKHVpbnQzMl90KSA9PSBzaXplb2YoZmxvYXQpLCAiVW5leHBlY3RlZCB0eXBlIHNpemVzIik7CisgIG1lbWNweSgmQml0cywgJkZsb2F0LCBzaXplb2YoRmxvYXQpKTsKKyAgcmV0dXJuIEJpdHM7Cit9CisKKy8vLyBBIGFuZCBCIGFyZSBlaXRoZXIgYWxpZ25tZW50cyBvciBvZmZzZXRzLiBSZXR1cm4gdGhlIG1pbmltdW0gYWxpZ25tZW50IHRoYXQKKy8vLyBtYXkgYmUgYXNzdW1lZCBhZnRlciBhZGRpbmcgdGhlIHR3byB0b2dldGhlci4KK2NvbnN0ZXhwciBpbmxpbmUgdWludDY0X3QgTWluQWxpZ24odWludDY0X3QgQSwgdWludDY0X3QgQikgeworICAvLyBUaGUgbGFyZ2VzdCBwb3dlciBvZiAyIHRoYXQgZGl2aWRlcyBib3RoIEEgYW5kIEIuCisgIC8vCisgIC8vIFJlcGxhY2UgIi1WYWx1ZSIgYnkgIjErflZhbHVlIiBpbiB0aGUgZm9sbG93aW5nIGNvbW1lbnRlZCBjb2RlIHRvIGF2b2lkCisgIC8vIE1TVkMgd2FybmluZyBDNDE0NgorICAvLyAgICByZXR1cm4gKEEgfCBCKSAmIC0oQSB8IEIpOworICByZXR1cm4gKEEgfCBCKSAmICgxICsgfihBIHwgQikpOworfQorCisvLy8gXGJyaWVmIEFsaWducyBcYyBBZGRyIHRvIFxjIEFsaWdubWVudCBieXRlcywgcm91bmRpbmcgdXAuCisvLy8KKy8vLyBBbGlnbm1lbnQgc2hvdWxkIGJlIGEgcG93ZXIgb2YgdHdvLiAgVGhpcyBtZXRob2Qgcm91bmRzIHVwLCBzbworLy8vIGFsaWduQWRkcig3LCA0KSA9PSA4IGFuZCBhbGlnbkFkZHIoOCwgNCkgPT0gOC4KK2lubGluZSB1aW50cHRyX3QgYWxpZ25BZGRyKGNvbnN0IHZvaWQgKkFkZHIsIHNpemVfdCBBbGlnbm1lbnQpIHsKKyAgYXNzZXJ0KEFsaWdubWVudCAmJiBpc1Bvd2VyT2YyXzY0KCh1aW50NjRfdClBbGlnbm1lbnQpICYmCisgICAgICAgICAiQWxpZ25tZW50IGlzIG5vdCBhIHBvd2VyIG9mIHR3byEiKTsKKworICBhc3NlcnQoKHVpbnRwdHJfdClBZGRyICsgQWxpZ25tZW50IC0gMSA+PSAodWludHB0cl90KUFkZHIpOworCisgIHJldHVybiAoKCh1aW50cHRyX3QpQWRkciArIEFsaWdubWVudCAtIDEpICYgfih1aW50cHRyX3QpKEFsaWdubWVudCAtIDEpKTsKK30KKworLy8vIFxicmllZiBSZXR1cm5zIHRoZSBuZWNlc3NhcnkgYWRqdXN0bWVudCBmb3IgYWxpZ25pbmcgXGMgUHRyIHRvIFxjIEFsaWdubWVudAorLy8vIGJ5dGVzLCByb3VuZGluZyB1cC4KK2lubGluZSBzaXplX3QgYWxpZ25tZW50QWRqdXN0bWVudChjb25zdCB2b2lkICpQdHIsIHNpemVfdCBBbGlnbm1lbnQpIHsKKyAgcmV0dXJuIGFsaWduQWRkcihQdHIsIEFsaWdubWVudCkgLSAodWludHB0cl90KVB0cjsKK30KKworLy8vIFJldHVybnMgdGhlIG5leHQgcG93ZXIgb2YgdHdvIChpbiA2NC1iaXRzKSB0aGF0IGlzIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiBBLgorLy8vIFJldHVybnMgemVybyBvbiBvdmVyZmxvdy4KK2lubGluZSB1aW50NjRfdCBOZXh0UG93ZXJPZjIodWludDY0X3QgQSkgeworICBBIHw9IChBID4+IDEpOworICBBIHw9IChBID4+IDIpOworICBBIHw9IChBID4+IDQpOworICBBIHw9IChBID4+IDgpOworICBBIHw9IChBID4+IDE2KTsKKyAgQSB8PSAoQSA+PiAzMik7CisgIHJldHVybiBBICsgMTsKK30KKworLy8vIFJldHVybnMgdGhlIHBvd2VyIG9mIHR3byB3aGljaCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIHZhbHVlLgorLy8vIEVzc2VudGlhbGx5LCBpdCBpcyBhIGZsb29yIG9wZXJhdGlvbiBhY3Jvc3MgdGhlIGRvbWFpbiBvZiBwb3dlcnMgb2YgdHdvLgoraW5saW5lIHVpbnQ2NF90IFBvd2VyT2YyRmxvb3IodWludDY0X3QgQSkgeworICBpZiAoIUEpIHJldHVybiAwOworICByZXR1cm4gMXVsbCA8PCAoNjMgLSBjb3VudExlYWRpbmdaZXJvcyhBLCBaQl9VbmRlZmluZWQpKTsKK30KKworLy8vIFJldHVybnMgdGhlIHBvd2VyIG9mIHR3byB3aGljaCBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGdpdmVuIHZhbHVlLgorLy8vIEVzc2VudGlhbGx5LCBpdCBpcyBhIGNlaWwgb3BlcmF0aW9uIGFjcm9zcyB0aGUgZG9tYWluIG9mIHBvd2VycyBvZiB0d28uCitpbmxpbmUgdWludDY0X3QgUG93ZXJPZjJDZWlsKHVpbnQ2NF90IEEpIHsKKyAgaWYgKCFBKQorICAgIHJldHVybiAwOworICByZXR1cm4gTmV4dFBvd2VyT2YyKEEgLSAxKTsKK30KKworLy8vIFJldHVybnMgdGhlIG5leHQgaW50ZWdlciAobW9kIDIqKjY0KSB0aGF0IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bworLy8vIFxwIFZhbHVlIGFuZCBpcyBhIG11bHRpcGxlIG9mIFxwIEFsaWduLiBccCBBbGlnbiBtdXN0IGJlIG5vbi16ZXJvLgorLy8vCisvLy8gSWYgbm9uLXplcm8gXHAgU2tldyBpcyBzcGVjaWZpZWQsIHRoZSByZXR1cm4gdmFsdWUgd2lsbCBiZSBhIG1pbmltYWwKKy8vLyBpbnRlZ2VyIHRoYXQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIFxwIFZhbHVlIGFuZCBlcXVhbCB0bworLy8vIFxwIEFsaWduICogTiArIFxwIFNrZXcgZm9yIHNvbWUgaW50ZWdlciBOLiBJZiBccCBTa2V3IGlzIGxhcmdlciB0aGFuCisvLy8gXHAgQWxpZ24sIGl0cyB2YWx1ZSBpcyBhZGp1c3RlZCB0byAnXHAgU2tldyBtb2QgXHAgQWxpZ24nLgorLy8vCisvLy8gRXhhbXBsZXM6CisvLy8gXGNvZGUKKy8vLyAgIGFsaWduVG8oNSwgOCkgPSA4CisvLy8gICBhbGlnblRvKDE3LCA4KSA9IDI0CisvLy8gICBhbGlnblRvKH4wTEwsIDgpID0gMAorLy8vICAgYWxpZ25UbygzMjEsIDI1NSkgPSA1MTAKKy8vLworLy8vICAgYWxpZ25Ubyg1LCA4LCA3KSA9IDcKKy8vLyAgIGFsaWduVG8oMTcsIDgsIDEpID0gMTcKKy8vLyAgIGFsaWduVG8ofjBMTCwgOCwgMykgPSAzCisvLy8gICBhbGlnblRvKDMyMSwgMjU1LCA0MikgPSA1NTIKKy8vLyBcZW5kY29kZQoraW5saW5lIHVpbnQ2NF90IGFsaWduVG8odWludDY0X3QgVmFsdWUsIHVpbnQ2NF90IEFsaWduLCB1aW50NjRfdCBTa2V3ID0gMCkgeworICBhc3NlcnQoQWxpZ24gIT0gMHUgJiYgIkFsaWduIGNhbid0IGJlIDAuIik7CisgIFNrZXcgJT0gQWxpZ247CisgIHJldHVybiAoVmFsdWUgKyBBbGlnbiAtIDEgLSBTa2V3KSAvIEFsaWduICogQWxpZ24gKyBTa2V3OworfQorCisvLy8gUmV0dXJucyB0aGUgbmV4dCBpbnRlZ2VyIChtb2QgMioqNjQpIHRoYXQgaXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvCisvLy8gXHAgVmFsdWUgYW5kIGlzIGEgbXVsdGlwbGUgb2YgXGMgQWxpZ24uIFxjIEFsaWduIG11c3QgYmUgbm9uLXplcm8uCit0ZW1wbGF0ZSA8dWludDY0X3QgQWxpZ24+IGNvbnN0ZXhwciBpbmxpbmUgdWludDY0X3QgYWxpZ25Ubyh1aW50NjRfdCBWYWx1ZSkgeworICBzdGF0aWNfYXNzZXJ0KEFsaWduICE9IDB1LCAiQWxpZ24gbXVzdCBiZSBub24temVybyIpOworICByZXR1cm4gKFZhbHVlICsgQWxpZ24gLSAxKSAvIEFsaWduICogQWxpZ247Cit9CisKKy8vLyBSZXR1cm5zIHRoZSBpbnRlZ2VyIGNlaWwoTnVtZXJhdG9yIC8gRGVub21pbmF0b3IpLgoraW5saW5lIHVpbnQ2NF90IGRpdmlkZUNlaWwodWludDY0X3QgTnVtZXJhdG9yLCB1aW50NjRfdCBEZW5vbWluYXRvcikgeworICByZXR1cm4gYWxpZ25UbyhOdW1lcmF0b3IsIERlbm9taW5hdG9yKSAvIERlbm9taW5hdG9yOworfQorCisvLy8gXGMgYWxpZ25UbyBmb3IgY29udGV4dHMgd2hlcmUgYSBjb25zdGFudCBleHByZXNzaW9uIGlzIHJlcXVpcmVkLgorLy8vIFxzYSBhbGlnblRvCisvLy8KKy8vLyBcdG9kbyBGSVhNRTogcmVtb3ZlIHdoZW4gXGMgY29uc3RleHByIGJlY29tZXMgcmVhbGx5IFxjIGNvbnN0ZXhwcgordGVtcGxhdGUgPHVpbnQ2NF90IEFsaWduPgorc3RydWN0IEFsaWduVG8geworICBzdGF0aWNfYXNzZXJ0KEFsaWduICE9IDB1LCAiQWxpZ24gbXVzdCBiZSBub24temVybyIpOworICB0ZW1wbGF0ZSA8dWludDY0X3QgVmFsdWU+CisgIHN0cnVjdCBmcm9tX3ZhbHVlIHsKKyAgICBzdGF0aWMgY29uc3QgdWludDY0X3QgdmFsdWUgPSAoVmFsdWUgKyBBbGlnbiAtIDEpIC8gQWxpZ24gKiBBbGlnbjsKKyAgfTsKK307CisKKy8vLyBSZXR1cm5zIHRoZSBsYXJnZXN0IHVpbnQ2NF90IGxlc3MgdGhhbiBvciBlcXVhbCB0byBccCBWYWx1ZSBhbmQgaXMKKy8vLyBccCBTa2V3IG1vZCBccCBBbGlnbi4gXHAgQWxpZ24gbXVzdCBiZSBub24temVybworaW5saW5lIHVpbnQ2NF90IGFsaWduRG93bih1aW50NjRfdCBWYWx1ZSwgdWludDY0X3QgQWxpZ24sIHVpbnQ2NF90IFNrZXcgPSAwKSB7CisgIGFzc2VydChBbGlnbiAhPSAwdSAmJiAiQWxpZ24gY2FuJ3QgYmUgMC4iKTsKKyAgU2tldyAlPSBBbGlnbjsKKyAgcmV0dXJuIChWYWx1ZSAtIFNrZXcpIC8gQWxpZ24gKiBBbGlnbiArIFNrZXc7Cit9CisKKy8vLyBSZXR1cm5zIHRoZSBvZmZzZXQgdG8gdGhlIG5leHQgaW50ZWdlciAobW9kIDIqKjY0KSB0aGF0IGlzIGdyZWF0ZXIgdGhhbgorLy8vIG9yIGVxdWFsIHRvIFxwIFZhbHVlIGFuZCBpcyBhIG11bHRpcGxlIG9mIFxwIEFsaWduLiBccCBBbGlnbiBtdXN0IGJlCisvLy8gbm9uLXplcm8uCitpbmxpbmUgdWludDY0X3QgT2Zmc2V0VG9BbGlnbm1lbnQodWludDY0X3QgVmFsdWUsIHVpbnQ2NF90IEFsaWduKSB7CisgIHJldHVybiBhbGlnblRvKFZhbHVlLCBBbGlnbikgLSBWYWx1ZTsKK30KKworLy8vIFNpZ24tZXh0ZW5kIHRoZSBudW1iZXIgaW4gdGhlIGJvdHRvbSBCIGJpdHMgb2YgWCB0byBhIDMyLWJpdCBpbnRlZ2VyLgorLy8vIFJlcXVpcmVzIDAgPCBCIDw9IDMyLgordGVtcGxhdGUgPHVuc2lnbmVkIEI+IGNvbnN0ZXhwciBpbmxpbmUgaW50MzJfdCBTaWduRXh0ZW5kMzIodWludDMyX3QgWCkgeworICBzdGF0aWNfYXNzZXJ0KEIgPiAwLCAiQml0IHdpZHRoIGNhbid0IGJlIDAuIik7CisgIHN0YXRpY19hc3NlcnQoQiA8PSAzMiwgIkJpdCB3aWR0aCBvdXQgb2YgcmFuZ2UuIik7CisgIHJldHVybiBpbnQzMl90KFggPDwgKDMyIC0gQikpID4+ICgzMiAtIEIpOworfQorCisvLy8gU2lnbi1leHRlbmQgdGhlIG51bWJlciBpbiB0aGUgYm90dG9tIEIgYml0cyBvZiBYIHRvIGEgMzItYml0IGludGVnZXIuCisvLy8gUmVxdWlyZXMgMCA8IEIgPCAzMi4KK2lubGluZSBpbnQzMl90IFNpZ25FeHRlbmQzMih1aW50MzJfdCBYLCB1bnNpZ25lZCBCKSB7CisgIGFzc2VydChCID4gMCAmJiAiQml0IHdpZHRoIGNhbid0IGJlIDAuIik7CisgIGFzc2VydChCIDw9IDMyICYmICJCaXQgd2lkdGggb3V0IG9mIHJhbmdlLiIpOworICByZXR1cm4gaW50MzJfdChYIDw8ICgzMiAtIEIpKSA+PiAoMzIgLSBCKTsKK30KKworLy8vIFNpZ24tZXh0ZW5kIHRoZSBudW1iZXIgaW4gdGhlIGJvdHRvbSBCIGJpdHMgb2YgWCB0byBhIDY0LWJpdCBpbnRlZ2VyLgorLy8vIFJlcXVpcmVzIDAgPCBCIDwgNjQuCit0ZW1wbGF0ZSA8dW5zaWduZWQgQj4gY29uc3RleHByIGlubGluZSBpbnQ2NF90IFNpZ25FeHRlbmQ2NCh1aW50NjRfdCB4KSB7CisgIHN0YXRpY19hc3NlcnQoQiA+IDAsICJCaXQgd2lkdGggY2FuJ3QgYmUgMC4iKTsKKyAgc3RhdGljX2Fzc2VydChCIDw9IDY0LCAiQml0IHdpZHRoIG91dCBvZiByYW5nZS4iKTsKKyAgcmV0dXJuIGludDY0X3QoeCA8PCAoNjQgLSBCKSkgPj4gKDY0IC0gQik7Cit9CisKKy8vLyBTaWduLWV4dGVuZCB0aGUgbnVtYmVyIGluIHRoZSBib3R0b20gQiBiaXRzIG9mIFggdG8gYSA2NC1iaXQgaW50ZWdlci4KKy8vLyBSZXF1aXJlcyAwIDwgQiA8IDY0LgoraW5saW5lIGludDY0X3QgU2lnbkV4dGVuZDY0KHVpbnQ2NF90IFgsIHVuc2lnbmVkIEIpIHsKKyAgYXNzZXJ0KEIgPiAwICYmICJCaXQgd2lkdGggY2FuJ3QgYmUgMC4iKTsKKyAgYXNzZXJ0KEIgPD0gNjQgJiYgIkJpdCB3aWR0aCBvdXQgb2YgcmFuZ2UuIik7CisgIHJldHVybiBpbnQ2NF90KFggPDwgKDY0IC0gQikpID4+ICg2NCAtIEIpOworfQorCisvLy8gU3VidHJhY3QgdHdvIHVuc2lnbmVkIGludGVnZXJzLCBYIGFuZCBZLCBvZiB0eXBlIFQgYW5kIHJldHVybiB0aGUgYWJzb2x1dGUKKy8vLyB2YWx1ZSBvZiB0aGUgcmVzdWx0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3Vuc2lnbmVkPFQ+Ojp2YWx1ZSwgVD46OnR5cGUKK0Fic29sdXRlRGlmZmVyZW5jZShUIFgsIFQgWSkgeworICByZXR1cm4gc3RkOjptYXgoWCwgWSkgLSBzdGQ6Om1pbihYLCBZKTsKK30KKworLy8vIEFkZCB0d28gdW5zaWduZWQgaW50ZWdlcnMsIFggYW5kIFksIG9mIHR5cGUgVC4gIENsYW1wIHRoZSByZXN1bHQgdG8gdGhlCisvLy8gbWF4aW11bSByZXByZXNlbnRhYmxlIHZhbHVlIG9mIFQgb24gb3ZlcmZsb3cuICBSZXN1bHRPdmVyZmxvd2VkIGluZGljYXRlcyBpZgorLy8vIHRoZSByZXN1bHQgaXMgbGFyZ2VyIHRoYW4gdGhlIG1heGltdW0gcmVwcmVzZW50YWJsZSB2YWx1ZSBvZiB0eXBlIFQuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfdW5zaWduZWQ8VD46OnZhbHVlLCBUPjo6dHlwZQorU2F0dXJhdGluZ0FkZChUIFgsIFQgWSwgYm9vbCAqUmVzdWx0T3ZlcmZsb3dlZCA9IG51bGxwdHIpIHsKKyAgYm9vbCBEdW1teTsKKyAgYm9vbCAmT3ZlcmZsb3dlZCA9IFJlc3VsdE92ZXJmbG93ZWQgPyAqUmVzdWx0T3ZlcmZsb3dlZCA6IER1bW15OworICAvLyBIYWNrZXIncyBEZWxpZ2h0LCBwLiAyOQorICBUIFogPSBYICsgWTsKKyAgT3ZlcmZsb3dlZCA9IChaIDwgWCB8fCBaIDwgWSk7CisgIGlmIChPdmVyZmxvd2VkKQorICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPFQ+OjptYXgoKTsKKyAgZWxzZQorICAgIHJldHVybiBaOworfQorCisvLy8gTXVsdGlwbHkgdHdvIHVuc2lnbmVkIGludGVnZXJzLCBYIGFuZCBZLCBvZiB0eXBlIFQuICBDbGFtcCB0aGUgcmVzdWx0IHRvIHRoZQorLy8vIG1heGltdW0gcmVwcmVzZW50YWJsZSB2YWx1ZSBvZiBUIG9uIG92ZXJmbG93LiAgUmVzdWx0T3ZlcmZsb3dlZCBpbmRpY2F0ZXMgaWYKKy8vLyB0aGUgcmVzdWx0IGlzIGxhcmdlciB0aGFuIHRoZSBtYXhpbXVtIHJlcHJlc2VudGFibGUgdmFsdWUgb2YgdHlwZSBULgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3Vuc2lnbmVkPFQ+Ojp2YWx1ZSwgVD46OnR5cGUKK1NhdHVyYXRpbmdNdWx0aXBseShUIFgsIFQgWSwgYm9vbCAqUmVzdWx0T3ZlcmZsb3dlZCA9IG51bGxwdHIpIHsKKyAgYm9vbCBEdW1teTsKKyAgYm9vbCAmT3ZlcmZsb3dlZCA9IFJlc3VsdE92ZXJmbG93ZWQgPyAqUmVzdWx0T3ZlcmZsb3dlZCA6IER1bW15OworCisgIC8vIEhhY2tlcidzIERlbGlnaHQsIHAuIDMwIGhhcyBhIGRpZmZlcmVudCBhbGdvcml0aG0sIGJ1dCB3ZSBkb24ndCB1c2UgdGhhdAorICAvLyBiZWNhdXNlIGl0IGZhaWxzIGZvciB1aW50MTZfdCAod2hlcmUgbXVsdGlwbGljYXRpb24gY2FuIGhhdmUgdW5kZWZpbmVkCisgIC8vIGJlaGF2aW9yIGR1ZSB0byBwcm9tb3Rpb24gdG8gaW50KSwgYW5kIHJlcXVpcmVzIGEgZGl2aXNpb24gaW4gYWRkaXRpb24KKyAgLy8gdG8gdGhlIG11bHRpcGxpY2F0aW9uLgorCisgIE92ZXJmbG93ZWQgPSBmYWxzZTsKKworICAvLyBMb2cyKFopIHdvdWxkIGJlIGVpdGhlciBMb2cyWiBvciBMb2cyWiArIDEuCisgIC8vIFNwZWNpYWwgY2FzZTogaWYgWCBvciBZIGlzIDAsIExvZzJfNjQgZ2l2ZXMgLTEsIGFuZCBMb2cyWgorICAvLyB3aWxsIG5lY2Vzc2FyaWx5IGJlIGxlc3MgdGhhbiBMb2cyTWF4IGFzIGRlc2lyZWQuCisgIGludCBMb2cyWiA9IExvZzJfNjQoWCkgKyBMb2cyXzY0KFkpOworICBjb25zdCBUIE1heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8VD46Om1heCgpOworICBpbnQgTG9nMk1heCA9IExvZzJfNjQoTWF4KTsKKyAgaWYgKExvZzJaIDwgTG9nMk1heCkgeworICAgIHJldHVybiBYICogWTsKKyAgfQorICBpZiAoTG9nMlogPiBMb2cyTWF4KSB7CisgICAgT3ZlcmZsb3dlZCA9IHRydWU7CisgICAgcmV0dXJuIE1heDsKKyAgfQorCisgIC8vIFdlJ3JlIGdvaW5nIHRvIHVzZSB0aGUgdG9wIGJpdCwgYW5kIG1heWJlIG92ZXJmbG93IG9uZQorICAvLyBiaXQgcGFzdCBpdC4gTXVsdGlwbHkgYWxsIGJ1dCB0aGUgYm90dG9tIGJpdCB0aGVuIGFkZAorICAvLyB0aGF0IG9uIGF0IHRoZSBlbmQuCisgIFQgWiA9IChYID4+IDEpICogWTsKKyAgaWYgKFogJiB+KE1heCA+PiAxKSkgeworICAgIE92ZXJmbG93ZWQgPSB0cnVlOworICAgIHJldHVybiBNYXg7CisgIH0KKyAgWiA8PD0gMTsKKyAgaWYgKFggJiAxKQorICAgIHJldHVybiBTYXR1cmF0aW5nQWRkKFosIFksIFJlc3VsdE92ZXJmbG93ZWQpOworCisgIHJldHVybiBaOworfQorCisvLy8gTXVsdGlwbHkgdHdvIHVuc2lnbmVkIGludGVnZXJzLCBYIGFuZCBZLCBhbmQgYWRkIHRoZSB1bnNpZ25lZCBpbnRlZ2VyLCBBIHRvCisvLy8gdGhlIHByb2R1Y3QuIENsYW1wIHRoZSByZXN1bHQgdG8gdGhlIG1heGltdW0gcmVwcmVzZW50YWJsZSB2YWx1ZSBvZiBUIG9uCisvLy8gb3ZlcmZsb3cuIFJlc3VsdE92ZXJmbG93ZWQgaW5kaWNhdGVzIGlmIHRoZSByZXN1bHQgaXMgbGFyZ2VyIHRoYW4gdGhlCisvLy8gbWF4aW11bSByZXByZXNlbnRhYmxlIHZhbHVlIG9mIHR5cGUgVC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8c3RkOjppc191bnNpZ25lZDxUPjo6dmFsdWUsIFQ+Ojp0eXBlCitTYXR1cmF0aW5nTXVsdGlwbHlBZGQoVCBYLCBUIFksIFQgQSwgYm9vbCAqUmVzdWx0T3ZlcmZsb3dlZCA9IG51bGxwdHIpIHsKKyAgYm9vbCBEdW1teTsKKyAgYm9vbCAmT3ZlcmZsb3dlZCA9IFJlc3VsdE92ZXJmbG93ZWQgPyAqUmVzdWx0T3ZlcmZsb3dlZCA6IER1bW15OworCisgIFQgUHJvZHVjdCA9IFNhdHVyYXRpbmdNdWx0aXBseShYLCBZLCAmT3ZlcmZsb3dlZCk7CisgIGlmIChPdmVyZmxvd2VkKQorICAgIHJldHVybiBQcm9kdWN0OworCisgIHJldHVybiBTYXR1cmF0aW5nQWRkKEEsIFByb2R1Y3QsICZPdmVyZmxvd2VkKTsKK30KKworLy8vIFVzZSB0aGlzIHJhdGhlciB0aGFuIEhVR0VfVkFMRjsgdGhlIGxhdHRlciBjYXVzZXMgd2FybmluZ3Mgb24gTVNWQy4KK2V4dGVybiBjb25zdCBmbG9hdCBodWdlX3ZhbGY7Cit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NZW1vcnkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NZW1vcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTQwZGM2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L01lbW9yeS5oCkBAIC0wLDAgKzEsMTQ1IEBACisvLz09PS0gbGx2bS9TdXBwb3J0L01lbW9yeS5oIC0gTWVtb3J5IFN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgbGx2bTo6c3lzOjpNZW1vcnkgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfTUVNT1JZX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX01FTU9SWV9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHN5cyB7CisKKyAgLy8vIFRoaXMgY2xhc3MgZW5jYXBzdWxhdGVzIHRoZSBub3Rpb24gb2YgYSBtZW1vcnkgYmxvY2sgd2hpY2ggaGFzIGFuIGFkZHJlc3MKKyAgLy8vIGFuZCBhIHNpemUuIEl0IGlzIHVzZWQgYnkgdGhlIE1lbW9yeSBjbGFzcyAoYSBmcmllbmQpIGFzIHRoZSByZXN1bHQgb2YKKyAgLy8vIHZhcmlvdXMgbWVtb3J5IGFsbG9jYXRpb24gb3BlcmF0aW9ucy4KKyAgLy8vIEBzZWUgTWVtb3J5CisgIC8vLyBAYnJpZWYgTWVtb3J5IGJsb2NrIGFic3RyYWN0aW9uLgorICBjbGFzcyBNZW1vcnlCbG9jayB7CisgIHB1YmxpYzoKKyAgICBNZW1vcnlCbG9jaygpIDogQWRkcmVzcyhudWxscHRyKSwgU2l6ZSgwKSB7IH0KKyAgICBNZW1vcnlCbG9jayh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkgOiBBZGRyZXNzKGFkZHIpLCBTaXplKHNpemUpIHsgfQorICAgIHZvaWQgKmJhc2UoKSBjb25zdCB7IHJldHVybiBBZGRyZXNzOyB9CisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBTaXplOyB9CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkICpBZGRyZXNzOyAgICAvLy88IEFkZHJlc3Mgb2YgZmlyc3QgYnl0ZSBvZiBtZW1vcnkgYXJlYQorICAgIHNpemVfdCBTaXplOyAgICAgIC8vLzwgU2l6ZSwgaW4gYnl0ZXMgb2YgdGhlIG1lbW9yeSBhcmVhCisgICAgZnJpZW5kIGNsYXNzIE1lbW9yeTsKKyAgfTsKKworICAvLy8gVGhpcyBjbGFzcyBwcm92aWRlcyB2YXJpb3VzIG1lbW9yeSBoYW5kbGluZyBmdW5jdGlvbnMgdGhhdCBtYW5pcHVsYXRlCisgIC8vLyBNZW1vcnlCbG9jayBpbnN0YW5jZXMuCisgIC8vLyBAc2luY2UgMS40CisgIC8vLyBAYnJpZWYgQW4gYWJzdHJhY3Rpb24gZm9yIG1lbW9yeSBvcGVyYXRpb25zLgorICBjbGFzcyBNZW1vcnkgeworICBwdWJsaWM6CisgICAgZW51bSBQcm90ZWN0aW9uRmxhZ3MgeworICAgICAgTUZfUkVBRCAgPSAweDEwMDAwMDAsCisgICAgICBNRl9XUklURSA9IDB4MjAwMDAwMCwKKyAgICAgIE1GX0VYRUMgID0gMHg0MDAwMDAwCisgICAgfTsKKworICAgIC8vLyBUaGlzIG1ldGhvZCBhbGxvY2F0ZXMgYSBibG9jayBvZiBtZW1vcnkgdGhhdCBpcyBzdWl0YWJsZSBmb3IgbG9hZGluZworICAgIC8vLyBkeW5hbWljYWxseSBnZW5lcmF0ZWQgY29kZSAoZS5nLiBKSVQpLiBBbiBhdHRlbXB0IHRvIGFsbG9jYXRlCisgICAgLy8vIFxwIE51bUJ5dGVzIGJ5dGVzIG9mIHZpcnR1YWwgbWVtb3J5IGlzIG1hZGUuCisgICAgLy8vIFxwIE5lYXJCbG9jayBtYXkgcG9pbnQgdG8gYW4gZXhpc3RpbmcgYWxsb2NhdGlvbiBpbiB3aGljaCBjYXNlCisgICAgLy8vIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhbGxvY2F0ZSBtb3JlIG1lbW9yeSBuZWFyIHRoZSBleGlzdGluZyBibG9jay4KKyAgICAvLy8gVGhlIGFjdHVhbCBhbGxvY2F0ZWQgYWRkcmVzcyBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBuZWFyIHRoZSByZXF1ZXN0ZWQKKyAgICAvLy8gYWRkcmVzcy4KKyAgICAvLy8gXHAgRmxhZ3MgaXMgdXNlZCB0byBzZXQgdGhlIGluaXRpYWwgcHJvdGVjdGlvbiBmbGFncyBmb3IgdGhlIGJsb2NrCisgICAgLy8vIG9mIHRoZSBtZW1vcnkuCisgICAgLy8vIFxwIEVDIFtvdXRdIHJldHVybnMgYW4gb2JqZWN0IGRlc2NyaWJpbmcgYW55IGVycm9yIHRoYXQgb2NjdXJzLgorICAgIC8vLworICAgIC8vLyBUaGlzIG1ldGhvZCBtYXkgYWxsb2NhdGUgbW9yZSB0aGFuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWVzdGVkLiAgVGhlCisgICAgLy8vIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgYWxsb2NhdGVkIGlzIGluZGljYXRlZCBpbiB0aGUgcmV0dXJuZWQKKyAgICAvLy8gTWVtb3J5QmxvY2suCisgICAgLy8vCisgICAgLy8vIFRoZSBzdGFydCBvZiB0aGUgYWxsb2NhdGVkIGJsb2NrIG11c3QgYmUgYWxpZ25lZCB3aXRoIHRoZQorICAgIC8vLyBzeXN0ZW0gYWxsb2NhdGlvbiBncmFudWxhcml0eSAoNjRLIG9uIFdpbmRvd3MsIHBhZ2Ugc2l6ZSBvbiBMaW51eCkuCisgICAgLy8vIElmIHRoZSBhZGRyZXNzIGZvbGxvd2luZyBccCBOZWFyQmxvY2sgaXMgbm90IHNvIGFsaWduZWQsIGl0IHdpbGwgYmUKKyAgICAvLy8gcm91bmRlZCB1cCB0byB0aGUgbmV4dCBhbGxvY2F0aW9uIGdyYW51bGFyaXR5IGJvdW5kYXJ5LgorICAgIC8vLworICAgIC8vLyBcciBhIG5vbi1udWxsIE1lbW9yeUJsb2NrIGlmIHRoZSBmdW5jdGlvbiB3YXMgc3VjY2Vzc2Z1bCwKKyAgICAvLy8gb3RoZXJ3aXNlIGEgbnVsbCBNZW1vcnlCbG9jayBpcyB3aXRoIFxwIEVDIGRlc2NyaWJpbmcgdGhlIGVycm9yLgorICAgIC8vLworICAgIC8vLyBAYnJpZWYgQWxsb2NhdGUgbWFwcGVkIG1lbW9yeS4KKyAgICBzdGF0aWMgTWVtb3J5QmxvY2sgYWxsb2NhdGVNYXBwZWRNZW1vcnkoc2l6ZV90IE51bUJ5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZW1vcnlCbG9jayAqY29uc3QgTmVhckJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBGbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjplcnJvcl9jb2RlICZFQyk7CisKKyAgICAvLy8gVGhpcyBtZXRob2QgcmVsZWFzZXMgYSBibG9jayBvZiBtZW1vcnkgdGhhdCB3YXMgYWxsb2NhdGVkIHdpdGggdGhlCisgICAgLy8vIGFsbG9jYXRlTWFwcGVkTWVtb3J5IG1ldGhvZC4gSXQgc2hvdWxkIG5vdCBiZSB1c2VkIHRvIHJlbGVhc2UgYW55CisgICAgLy8vIG1lbW9yeSBibG9jayBhbGxvY2F0ZWQgYW55IG90aGVyIHdheS4KKyAgICAvLy8gXHAgQmxvY2sgZGVzY3JpYmVzIHRoZSBtZW1vcnkgdG8gYmUgcmVsZWFzZWQuCisgICAgLy8vCisgICAgLy8vIFxyIGVycm9yX3N1Y2Nlc3MgaWYgdGhlIGZ1bmN0aW9uIHdhcyBzdWNjZXNzZnVsLCBvciBhbiBlcnJvcl9jb2RlCisgICAgLy8vIGRlc2NyaWJpbmcgdGhlIGZhaWx1cmUgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgICAgLy8vCisgICAgLy8vIEBicmllZiBSZWxlYXNlIG1hcHBlZCBtZW1vcnkuCisgICAgc3RhdGljIHN0ZDo6ZXJyb3JfY29kZSByZWxlYXNlTWFwcGVkTWVtb3J5KE1lbW9yeUJsb2NrICZCbG9jayk7CisKKyAgICAvLy8gVGhpcyBtZXRob2Qgc2V0cyB0aGUgcHJvdGVjdGlvbiBmbGFncyBmb3IgYSBibG9jayBvZiBtZW1vcnkgdG8gdGhlCisgICAgLy8vIHN0YXRlIHNwZWNpZmllZCBieSAvcCBGbGFncy4gIFRoZSBiZWhhdmlvciBpcyBub3Qgc3BlY2lmaWVkIGlmIHRoZQorICAgIC8vLyBtZW1vcnkgd2FzIG5vdCBhbGxvY2F0ZWQgdXNpbmcgdGhlIGFsbG9jYXRlTWFwcGVkTWVtb3J5IG1ldGhvZC4KKyAgICAvLy8gXHAgQmxvY2sgZGVzY3JpYmVzIHRoZSBtZW1vcnkgYmxvY2sgdG8gYmUgcHJvdGVjdGVkLgorICAgIC8vLyBccCBGbGFncyBzcGVjaWZpZXMgdGhlIG5ldyBwcm90ZWN0aW9uIHN0YXRlIHRvIGJlIGFzc2lnbmVkIHRvIHRoZSBibG9jay4KKyAgICAvLy8gXHAgRXJyTXNnIFtvdXRdIHJldHVybnMgYSBzdHJpbmcgZGVzY3JpYmluZyBhbnkgZXJyb3IgdGhhdCBvY2N1cnJlZC4KKyAgICAvLy8KKyAgICAvLy8gSWYgXHAgRmxhZ3MgaXMgTUZfV1JJVEUsIHRoZSBhY3R1YWwgYmVoYXZpb3IgdmFyaWVzCisgICAgLy8vIHdpdGggdGhlIG9wZXJhdGluZyBzeXN0ZW0gKGkuZS4gTUZfUkVBRCB8IE1GX1dSSVRFIG9uIFdpbmRvd3MpIGFuZCB0aGUKKyAgICAvLy8gdGFyZ2V0IGFyY2hpdGVjdHVyZSAoaS5lLiBNRl9XUklURSAtPiBNRl9SRUFEIHwgTUZfV1JJVEUgb24gaTM4NikuCisgICAgLy8vCisgICAgLy8vIFxyIGVycm9yX3N1Y2Nlc3MgaWYgdGhlIGZ1bmN0aW9uIHdhcyBzdWNjZXNzZnVsLCBvciBhbiBlcnJvcl9jb2RlCisgICAgLy8vIGRlc2NyaWJpbmcgdGhlIGZhaWx1cmUgaWYgYW4gZXJyb3Igb2NjdXJyZWQuCisgICAgLy8vCisgICAgLy8vIEBicmllZiBTZXQgbWVtb3J5IHByb3RlY3Rpb24gc3RhdGUuCisgICAgc3RhdGljIHN0ZDo6ZXJyb3JfY29kZSBwcm90ZWN0TWFwcGVkTWVtb3J5KGNvbnN0IE1lbW9yeUJsb2NrICZCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgRmxhZ3MpOworCisgICAgLy8vIEludmFsaWRhdGVJbnN0cnVjdGlvbkNhY2hlIC0gQmVmb3JlIHRoZSBKSVQgY2FuIHJ1biBhIGJsb2NrIG9mIGNvZGUKKyAgICAvLy8gdGhhdCBoYXMgYmVlbiBlbWl0dGVkIGl0IG11c3QgaW52YWxpZGF0ZSB0aGUgaW5zdHJ1Y3Rpb24gY2FjaGUgb24gc29tZQorICAgIC8vLyBwbGF0Zm9ybXMuCisgICAgc3RhdGljIHZvaWQgSW52YWxpZGF0ZUluc3RydWN0aW9uQ2FjaGUoY29uc3Qgdm9pZCAqQWRkciwgc2l6ZV90IExlbik7CisgIH07CisKKyAgLy8vIE93bmluZyB2ZXJzaW9uIG9mIE1lbW9yeUJsb2NrLgorICBjbGFzcyBPd25pbmdNZW1vcnlCbG9jayB7CisgIHB1YmxpYzoKKyAgICBPd25pbmdNZW1vcnlCbG9jaygpID0gZGVmYXVsdDsKKyAgICBleHBsaWNpdCBPd25pbmdNZW1vcnlCbG9jayhNZW1vcnlCbG9jayBNKSA6IE0oTSkge30KKyAgICBPd25pbmdNZW1vcnlCbG9jayhPd25pbmdNZW1vcnlCbG9jayAmJk90aGVyKSB7CisgICAgICBNID0gT3RoZXIuTTsKKyAgICAgIE90aGVyLk0gPSBNZW1vcnlCbG9jaygpOworICAgIH0KKyAgICBPd25pbmdNZW1vcnlCbG9jayYgb3BlcmF0b3I9KE93bmluZ01lbW9yeUJsb2NrICYmT3RoZXIpIHsKKyAgICAgIE0gPSBPdGhlci5NOworICAgICAgT3RoZXIuTSA9IE1lbW9yeUJsb2NrKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIH5Pd25pbmdNZW1vcnlCbG9jaygpIHsKKyAgICAgIE1lbW9yeTo6cmVsZWFzZU1hcHBlZE1lbW9yeShNKTsKKyAgICB9CisgICAgdm9pZCAqYmFzZSgpIGNvbnN0IHsgcmV0dXJuIE0uYmFzZSgpOyB9CisgICAgc2l6ZV90IHNpemUoKSBjb25zdCB7IHJldHVybiBNLnNpemUoKTsgfQorICAgIE1lbW9yeUJsb2NrIGdldE1lbW9yeUJsb2NrKCkgY29uc3QgeyByZXR1cm4gTTsgfQorICBwcml2YXRlOgorICAgIE1lbW9yeUJsb2NrIE07CisgIH07CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5N2FlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NZW1vcnlCdWZmZXIuaApAQCAtMCwwICsxLDI4OCBAQAorLy89PT0tLS0gTWVtb3J5QnVmZmVyLmggLSBNZW1vcnkgQnVmZmVyIEludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIE1lbW9yeUJ1ZmZlciBpbnRlcmZhY2UuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfTUVNT1JZQlVGRkVSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX01FTU9SWUJVRkZFUl9ICisKKyNpbmNsdWRlICJsbHZtLWMvVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NCaW5kaW5nV3JhcHBpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JPci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9GaWxlU3lzdGVtLmgiCisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPG1lbW9yeT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNZW1vcnlCdWZmZXJSZWY7CisKKy8vLyBUaGlzIGludGVyZmFjZSBwcm92aWRlcyBzaW1wbGUgcmVhZC1vbmx5IGFjY2VzcyB0byBhIGJsb2NrIG9mIG1lbW9yeSwgYW5kCisvLy8gcHJvdmlkZXMgc2ltcGxlIG1ldGhvZHMgZm9yIHJlYWRpbmcgZmlsZXMgYW5kIHN0YW5kYXJkIGlucHV0IGludG8gYSBtZW1vcnkKKy8vLyBidWZmZXIuICBJbiBhZGRpdGlvbiB0byBiYXNpYyBhY2Nlc3MgdG8gdGhlIGNoYXJhY3RlcnMgaW4gdGhlIGZpbGUsIHRoaXMKKy8vLyBpbnRlcmZhY2UgZ3VhcmFudGVlcyB5b3UgY2FuIHJlYWQgb25lIGNoYXJhY3RlciBwYXN0IHRoZSBlbmQgb2YgdGhlIGZpbGUsCisvLy8gYW5kIHRoYXQgdGhpcyBjaGFyYWN0ZXIgd2lsbCByZWFkIGFzICdcMCcuCisvLy8KKy8vLyBUaGUgJ1wwJyBndWFyYW50ZWUgaXMgbmVlZGVkIHRvIHN1cHBvcnQgYW4gb3B0aW1pemF0aW9uIC0tIGl0J3MgaW50ZW5kZWQgdG8KKy8vLyBiZSBtb3JlIGVmZmljaWVudCBmb3IgY2xpZW50cyB3aGljaCBhcmUgcmVhZGluZyBhbGwgdGhlIGRhdGEgdG8gc3RvcAorLy8vIHJlYWRpbmcgd2hlbiB0aGV5IGVuY291bnRlciBhICdcMCcgdGhhbiB0byBjb250aW51YWxseSBjaGVjayB0aGUgZmlsZQorLy8vIHBvc2l0aW9uIHRvIHNlZSBpZiBpdCBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBmaWxlLgorY2xhc3MgTWVtb3J5QnVmZmVyIHsKKyAgY29uc3QgY2hhciAqQnVmZmVyU3RhcnQ7IC8vIFN0YXJ0IG9mIHRoZSBidWZmZXIuCisgIGNvbnN0IGNoYXIgKkJ1ZmZlckVuZDsgICAvLyBFbmQgb2YgdGhlIGJ1ZmZlci4KKworCitwcm90ZWN0ZWQ6CisgIE1lbW9yeUJ1ZmZlcigpID0gZGVmYXVsdDsKKworICB2b2lkIGluaXQoY29uc3QgY2hhciAqQnVmU3RhcnQsIGNvbnN0IGNoYXIgKkJ1ZkVuZCwKKyAgICAgICAgICAgIGJvb2wgUmVxdWlyZXNOdWxsVGVybWluYXRvcik7CisKKyAgc3RhdGljIGNvbnN0ZXhwciBzeXM6OmZzOjptYXBwZWRfZmlsZV9yZWdpb246Om1hcG1vZGUgTWFwbW9kZSA9CisgICAgICBzeXM6OmZzOjptYXBwZWRfZmlsZV9yZWdpb246OnJlYWRvbmx5OworCitwdWJsaWM6CisgIE1lbW9yeUJ1ZmZlcihjb25zdCBNZW1vcnlCdWZmZXIgJikgPSBkZWxldGU7CisgIE1lbW9yeUJ1ZmZlciAmb3BlcmF0b3I9KGNvbnN0IE1lbW9yeUJ1ZmZlciAmKSA9IGRlbGV0ZTsKKyAgdmlydHVhbCB+TWVtb3J5QnVmZmVyKCk7CisKKyAgY29uc3QgY2hhciAqZ2V0QnVmZmVyU3RhcnQoKSBjb25zdCB7IHJldHVybiBCdWZmZXJTdGFydDsgfQorICBjb25zdCBjaGFyICpnZXRCdWZmZXJFbmQoKSBjb25zdCAgIHsgcmV0dXJuIEJ1ZmZlckVuZDsgfQorICBzaXplX3QgZ2V0QnVmZmVyU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEJ1ZmZlckVuZC1CdWZmZXJTdGFydDsgfQorCisgIFN0cmluZ1JlZiBnZXRCdWZmZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIFN0cmluZ1JlZihCdWZmZXJTdGFydCwgZ2V0QnVmZmVyU2l6ZSgpKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYW4gaWRlbnRpZmllciBmb3IgdGhpcyBidWZmZXIsIHR5cGljYWxseSB0aGUgZmlsZW5hbWUgaXQgd2FzIHJlYWQKKyAgLy8vIGZyb20uCisgIHZpcnR1YWwgU3RyaW5nUmVmIGdldEJ1ZmZlcklkZW50aWZpZXIoKSBjb25zdCB7IHJldHVybiAiVW5rbm93biBidWZmZXIiOyB9CisKKyAgLy8vIE9wZW4gdGhlIHNwZWNpZmllZCBmaWxlIGFzIGEgTWVtb3J5QnVmZmVyLCByZXR1cm5pbmcgYSBuZXcgTWVtb3J5QnVmZmVyCisgIC8vLyBpZiBzdWNjZXNzZnVsLCBvdGhlcndpc2UgcmV0dXJuaW5nIG51bGwuIElmIEZpbGVTaXplIGlzIHNwZWNpZmllZCwgdGhpcworICAvLy8gbWVhbnMgdGhhdCB0aGUgY2xpZW50IGtub3dzIHRoYXQgdGhlIGZpbGUgZXhpc3RzIGFuZCB0aGF0IGl0IGhhcyB0aGUKKyAgLy8vIHNwZWNpZmllZCBzaXplLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJc1ZvbGF0aWxlIFNldCB0byB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlCisgIC8vLyBjYW4gY2hhbmdlIG91dHNpZGUgdGhlIHVzZXIncyBjb250cm9sLCBlLmcuIHdoZW4gbGliY2xhbmcgdHJpZXMgdG8gcGFyc2UKKyAgLy8vIHdoaWxlIHRoZSB1c2VyIGlzIGVkaXRpbmcvdXBkYXRpbmcgdGhlIGZpbGUgb3IgaWYgdGhlIGZpbGUgaXMgb24gYW4gTkZTLgorICBzdGF0aWMgRXJyb3JPcjxzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPj4KKyAgZ2V0RmlsZShjb25zdCBUd2luZSAmRmlsZW5hbWUsIGludDY0X3QgRmlsZVNpemUgPSAtMSwKKyAgICAgICAgICBib29sIFJlcXVpcmVzTnVsbFRlcm1pbmF0b3IgPSB0cnVlLCBib29sIElzVm9sYXRpbGUgPSBmYWxzZSk7CisKKyAgLy8vIFJlYWQgYWxsIG9mIHRoZSBzcGVjaWZpZWQgZmlsZSBpbnRvIGEgTWVtb3J5QnVmZmVyIGFzIGEgc3RyZWFtCisgIC8vLyAoaS5lLiB1bnRpbCBFT0YgcmVhY2hlZCkuIFRoaXMgaXMgdXNlZnVsIGZvciBzcGVjaWFsIGZpbGVzIHRoYXQKKyAgLy8vIGxvb2sgbGlrZSBhIHJlZ3VsYXIgZmlsZSBidXQgaGF2ZSAwIHNpemUgKGUuZy4gL3Byb2MvY3B1aW5mbyBvbiBMaW51eCkuCisgIHN0YXRpYyBFcnJvck9yPHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+PgorICBnZXRGaWxlQXNTdHJlYW0oY29uc3QgVHdpbmUgJkZpbGVuYW1lKTsKKworICAvLy8gR2l2ZW4gYW4gYWxyZWFkeS1vcGVuIGZpbGUgZGVzY3JpcHRvciwgbWFwIHNvbWUgc2xpY2Ugb2YgaXQgaW50byBhCisgIC8vLyBNZW1vcnlCdWZmZXIuIFRoZSBzbGljZSBpcyBzcGVjaWZpZWQgYnkgYW4gXHAgT2Zmc2V0IGFuZCBccCBNYXBTaXplLgorICAvLy8gU2luY2UgdGhpcyBpcyBpbiB0aGUgbWlkZGxlIG9mIGEgZmlsZSwgdGhlIGJ1ZmZlciBpcyBub3QgbnVsbCB0ZXJtaW5hdGVkLgorICBzdGF0aWMgRXJyb3JPcjxzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPj4KKyAgZ2V0T3BlbkZpbGVTbGljZShpbnQgRkQsIGNvbnN0IFR3aW5lICZGaWxlbmFtZSwgdWludDY0X3QgTWFwU2l6ZSwKKyAgICAgICAgICAgICAgICAgICBpbnQ2NF90IE9mZnNldCwgYm9vbCBJc1ZvbGF0aWxlID0gZmFsc2UpOworCisgIC8vLyBHaXZlbiBhbiBhbHJlYWR5LW9wZW4gZmlsZSBkZXNjcmlwdG9yLCByZWFkIHRoZSBmaWxlIGFuZCByZXR1cm4gYQorICAvLy8gTWVtb3J5QnVmZmVyLgorICAvLy8KKyAgLy8vIFxwYXJhbSBJc1ZvbGF0aWxlIFNldCB0byB0cnVlIHRvIGluZGljYXRlIHRoYXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBmaWxlCisgIC8vLyBjYW4gY2hhbmdlIG91dHNpZGUgdGhlIHVzZXIncyBjb250cm9sLCBlLmcuIHdoZW4gbGliY2xhbmcgdHJpZXMgdG8gcGFyc2UKKyAgLy8vIHdoaWxlIHRoZSB1c2VyIGlzIGVkaXRpbmcvdXBkYXRpbmcgdGhlIGZpbGUgb3IgaWYgdGhlIGZpbGUgaXMgb24gYW4gTkZTLgorICBzdGF0aWMgRXJyb3JPcjxzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPj4KKyAgZ2V0T3BlbkZpbGUoaW50IEZELCBjb25zdCBUd2luZSAmRmlsZW5hbWUsIHVpbnQ2NF90IEZpbGVTaXplLAorICAgICAgICAgICAgICBib29sIFJlcXVpcmVzTnVsbFRlcm1pbmF0b3IgPSB0cnVlLCBib29sIElzVm9sYXRpbGUgPSBmYWxzZSk7CisKKyAgLy8vIE9wZW4gdGhlIHNwZWNpZmllZCBtZW1vcnkgcmFuZ2UgYXMgYSBNZW1vcnlCdWZmZXIuIE5vdGUgdGhhdCBJbnB1dERhdGEKKyAgLy8vIG11c3QgYmUgbnVsbCB0ZXJtaW5hdGVkIGlmIFJlcXVpcmVzTnVsbFRlcm1pbmF0b3IgaXMgdHJ1ZS4KKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+CisgIGdldE1lbUJ1ZmZlcihTdHJpbmdSZWYgSW5wdXREYXRhLCBTdHJpbmdSZWYgQnVmZmVyTmFtZSA9ICIiLAorICAgICAgICAgICAgICAgYm9vbCBSZXF1aXJlc051bGxUZXJtaW5hdG9yID0gdHJ1ZSk7CisKKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+CisgIGdldE1lbUJ1ZmZlcihNZW1vcnlCdWZmZXJSZWYgUmVmLCBib29sIFJlcXVpcmVzTnVsbFRlcm1pbmF0b3IgPSB0cnVlKTsKKworICAvLy8gT3BlbiB0aGUgc3BlY2lmaWVkIG1lbW9yeSByYW5nZSBhcyBhIE1lbW9yeUJ1ZmZlciwgY29weWluZyB0aGUgY29udGVudHMKKyAgLy8vIGFuZCB0YWtpbmcgb3duZXJzaGlwIG9mIGl0LiBJbnB1dERhdGEgZG9lcyBub3QgaGF2ZSB0byBiZSBudWxsIHRlcm1pbmF0ZWQuCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPgorICBnZXRNZW1CdWZmZXJDb3B5KFN0cmluZ1JlZiBJbnB1dERhdGEsIGNvbnN0IFR3aW5lICZCdWZmZXJOYW1lID0gIiIpOworCisgIC8vLyBSZWFkIGFsbCBvZiBzdGRpbiBpbnRvIGEgZmlsZSBidWZmZXIsIGFuZCByZXR1cm4gaXQuCisgIHN0YXRpYyBFcnJvck9yPHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+PiBnZXRTVERJTigpOworCisgIC8vLyBPcGVuIHRoZSBzcGVjaWZpZWQgZmlsZSBhcyBhIE1lbW9yeUJ1ZmZlciwgb3Igb3BlbiBzdGRpbiBpZiB0aGUgRmlsZW5hbWUKKyAgLy8vIGlzICItIi4KKyAgc3RhdGljIEVycm9yT3I8c3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4+CisgIGdldEZpbGVPclNURElOKGNvbnN0IFR3aW5lICZGaWxlbmFtZSwgaW50NjRfdCBGaWxlU2l6ZSA9IC0xLAorICAgICAgICAgICAgICAgICBib29sIFJlcXVpcmVzTnVsbFRlcm1pbmF0b3IgPSB0cnVlKTsKKworICAvLy8gTWFwIGEgc3VicmFuZ2Ugb2YgdGhlIHNwZWNpZmllZCBmaWxlIGFzIGEgTWVtb3J5QnVmZmVyLgorICBzdGF0aWMgRXJyb3JPcjxzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPj4KKyAgZ2V0RmlsZVNsaWNlKGNvbnN0IFR3aW5lICZGaWxlbmFtZSwgdWludDY0X3QgTWFwU2l6ZSwgdWludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgYm9vbCBJc1ZvbGF0aWxlID0gZmFsc2UpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBQcm92aWRlZCBmb3IgcGVyZm9ybWFuY2UgYW5hbHlzaXMuCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisgIC8vLyBUaGUga2luZCBvZiBtZW1vcnkgYmFja2luZyB1c2VkIHRvIHN1cHBvcnQgdGhlIE1lbW9yeUJ1ZmZlci4KKyAgZW51bSBCdWZmZXJLaW5kIHsKKyAgICBNZW1vcnlCdWZmZXJfTWFsbG9jLAorICAgIE1lbW9yeUJ1ZmZlcl9NTWFwCisgIH07CisKKyAgLy8vIFJldHVybiBpbmZvcm1hdGlvbiBvbiB0aGUgbWVtb3J5IG1lY2hhbmlzbSB1c2VkIHRvIHN1cHBvcnQgdGhlCisgIC8vLyBNZW1vcnlCdWZmZXIuCisgIHZpcnR1YWwgQnVmZmVyS2luZCBnZXRCdWZmZXJLaW5kKCkgY29uc3QgPSAwOworCisgIE1lbW9yeUJ1ZmZlclJlZiBnZXRNZW1CdWZmZXJSZWYoKSBjb25zdDsKK307CisKKy8vLyBUaGlzIGNsYXNzIGlzIGFuIGV4dGVuc2lvbiBvZiBNZW1vcnlCdWZmZXIsIHdoaWNoIGFsbG93cyBjb3B5LW9uLXdyaXRlCisvLy8gYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnRzLiAgSXQgb25seSBzdXBwb3J0cyBjcmVhdGlvbiBtZXRob2RzIHRoYXQKKy8vLyBhcmUgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgd3JpdGFibGUgYnVmZmVyLiAgRm9yIGV4YW1wbGUsIG1hcHBpbmcgYSBmaWxlCisvLy8gcmVhZC1vbmx5IGlzIG5vdCBzdXBwb3J0ZWQuCitjbGFzcyBXcml0YWJsZU1lbW9yeUJ1ZmZlciA6IHB1YmxpYyBNZW1vcnlCdWZmZXIgeworcHJvdGVjdGVkOgorICBXcml0YWJsZU1lbW9yeUJ1ZmZlcigpID0gZGVmYXVsdDsKKworICBzdGF0aWMgY29uc3RleHByIHN5czo6ZnM6Om1hcHBlZF9maWxlX3JlZ2lvbjo6bWFwbW9kZSBNYXBtb2RlID0KKyAgICAgIHN5czo6ZnM6Om1hcHBlZF9maWxlX3JlZ2lvbjo6cHJpdjsKKworcHVibGljOgorICB1c2luZyBNZW1vcnlCdWZmZXI6OmdldEJ1ZmZlcjsKKyAgdXNpbmcgTWVtb3J5QnVmZmVyOjpnZXRCdWZmZXJFbmQ7CisgIHVzaW5nIE1lbW9yeUJ1ZmZlcjo6Z2V0QnVmZmVyU3RhcnQ7CisKKyAgLy8gY29uc3RfY2FzdCBpcyB3ZWxsLWRlZmluZWQgaGVyZSwgYmVjYXVzZSB0aGUgdW5kZXJseWluZyBidWZmZXIgaXMKKyAgLy8gZ3VhcmFudGVlZCB0byBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgd2l0aCBhIG11dGFibGUgYnVmZmVyLgorICBjaGFyICpnZXRCdWZmZXJTdGFydCgpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxjaGFyICo+KE1lbW9yeUJ1ZmZlcjo6Z2V0QnVmZmVyU3RhcnQoKSk7CisgIH0KKyAgY2hhciAqZ2V0QnVmZmVyRW5kKCkgeworICAgIHJldHVybiBjb25zdF9jYXN0PGNoYXIgKj4oTWVtb3J5QnVmZmVyOjpnZXRCdWZmZXJFbmQoKSk7CisgIH0KKyAgTXV0YWJsZUFycmF5UmVmPGNoYXI+IGdldEJ1ZmZlcigpIHsKKyAgICByZXR1cm4ge2dldEJ1ZmZlclN0YXJ0KCksIGdldEJ1ZmZlckVuZCgpfTsKKyAgfQorCisgIHN0YXRpYyBFcnJvck9yPHN0ZDo6dW5pcXVlX3B0cjxXcml0YWJsZU1lbW9yeUJ1ZmZlcj4+CisgIGdldEZpbGUoY29uc3QgVHdpbmUgJkZpbGVuYW1lLCBpbnQ2NF90IEZpbGVTaXplID0gLTEsCisgICAgICAgICAgYm9vbCBJc1ZvbGF0aWxlID0gZmFsc2UpOworCisgIC8vLyBNYXAgYSBzdWJyYW5nZSBvZiB0aGUgc3BlY2lmaWVkIGZpbGUgYXMgYSBXcml0YWJsZU1lbW9yeUJ1ZmZlci4KKyAgc3RhdGljIEVycm9yT3I8c3RkOjp1bmlxdWVfcHRyPFdyaXRhYmxlTWVtb3J5QnVmZmVyPj4KKyAgZ2V0RmlsZVNsaWNlKGNvbnN0IFR3aW5lICZGaWxlbmFtZSwgdWludDY0X3QgTWFwU2l6ZSwgdWludDY0X3QgT2Zmc2V0LAorICAgICAgICAgICAgICAgYm9vbCBJc1ZvbGF0aWxlID0gZmFsc2UpOworCisgIC8vLyBBbGxvY2F0ZSBhIG5ldyBNZW1vcnlCdWZmZXIgb2YgdGhlIHNwZWNpZmllZCBzaXplIHRoYXQgaXMgbm90IGluaXRpYWxpemVkLgorICAvLy8gTm90ZSB0aGF0IHRoZSBjYWxsZXIgc2hvdWxkIGluaXRpYWxpemUgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhpcworICAvLy8gbWV0aG9kLiBUaGUgbWVtb3J5IGlzIG93bmVkIGJ5IHRoZSBNZW1vcnlCdWZmZXIgb2JqZWN0LgorICBzdGF0aWMgc3RkOjp1bmlxdWVfcHRyPFdyaXRhYmxlTWVtb3J5QnVmZmVyPgorICBnZXROZXdVbmluaXRNZW1CdWZmZXIoc2l6ZV90IFNpemUsIGNvbnN0IFR3aW5lICZCdWZmZXJOYW1lID0gIiIpOworCisgIC8vLyBBbGxvY2F0ZSBhIG5ldyB6ZXJvLWluaXRpYWxpemVkIE1lbW9yeUJ1ZmZlciBvZiB0aGUgc3BlY2lmaWVkIHNpemUuIE5vdGUKKyAgLy8vIHRoYXQgdGhlIGNhbGxlciBuZWVkIG5vdCBpbml0aWFsaXplIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoaXMgbWV0aG9kLgorICAvLy8gVGhlIG1lbW9yeSBpcyBvd25lZCBieSB0aGUgTWVtb3J5QnVmZmVyIG9iamVjdC4KKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxXcml0YWJsZU1lbW9yeUJ1ZmZlcj4KKyAgZ2V0TmV3TWVtQnVmZmVyKHNpemVfdCBTaXplLCBjb25zdCBUd2luZSAmQnVmZmVyTmFtZSA9ICIiKTsKKworcHJpdmF0ZToKKyAgLy8gSGlkZSB0aGVzZSBiYXNlIGNsYXNzIGZhY3RvcnkgZnVuY3Rpb24gc28gb25lIGNhbid0IHdyaXRlCisgIC8vICAgV3JpdGFibGVNZW1vcnlCdWZmZXI6OmdldFhYWCgpCisgIC8vIGFuZCBiZSBzdXJwcmlzZWQgdGhhdCBoZSBnb3QgYSByZWFkLW9ubHkgQnVmZmVyLgorICB1c2luZyBNZW1vcnlCdWZmZXI6OmdldEZpbGVBc1N0cmVhbTsKKyAgdXNpbmcgTWVtb3J5QnVmZmVyOjpnZXRGaWxlT3JTVERJTjsKKyAgdXNpbmcgTWVtb3J5QnVmZmVyOjpnZXRNZW1CdWZmZXI7CisgIHVzaW5nIE1lbW9yeUJ1ZmZlcjo6Z2V0TWVtQnVmZmVyQ29weTsKKyAgdXNpbmcgTWVtb3J5QnVmZmVyOjpnZXRPcGVuRmlsZTsKKyAgdXNpbmcgTWVtb3J5QnVmZmVyOjpnZXRPcGVuRmlsZVNsaWNlOworICB1c2luZyBNZW1vcnlCdWZmZXI6OmdldFNURElOOworfTsKKworLy8vIFRoaXMgY2xhc3MgaXMgYW4gZXh0ZW5zaW9uIG9mIE1lbW9yeUJ1ZmZlciwgd2hpY2ggYWxsb3dzIHdyaXRlIGFjY2VzcyB0bworLy8vIHRoZSB1bmRlcmx5aW5nIGNvbnRlbnRzIGFuZCBjb21taXR0aW5nIHRob3NlIGNoYW5nZXMgdG8gdGhlIG9yaWdpbmFsIHNvdXJjZS4KKy8vLyBJdCBvbmx5IHN1cHBvcnRzIGNyZWF0aW9uIG1ldGhvZHMgdGhhdCBhcmUgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgd3JpdGFibGUKKy8vLyBidWZmZXIuICBGb3IgZXhhbXBsZSwgbWFwcGluZyBhIGZpbGUgcmVhZC1vbmx5IGlzIG5vdCBzdXBwb3J0ZWQuCitjbGFzcyBXcml0ZVRocm91Z2hNZW1vcnlCdWZmZXIgOiBwdWJsaWMgTWVtb3J5QnVmZmVyIHsKK3Byb3RlY3RlZDoKKyAgV3JpdGVUaHJvdWdoTWVtb3J5QnVmZmVyKCkgPSBkZWZhdWx0OworCisgIHN0YXRpYyBjb25zdGV4cHIgc3lzOjpmczo6bWFwcGVkX2ZpbGVfcmVnaW9uOjptYXBtb2RlIE1hcG1vZGUgPQorICAgICAgc3lzOjpmczo6bWFwcGVkX2ZpbGVfcmVnaW9uOjpyZWFkd3JpdGU7CisKK3B1YmxpYzoKKyAgdXNpbmcgTWVtb3J5QnVmZmVyOjpnZXRCdWZmZXI7CisgIHVzaW5nIE1lbW9yeUJ1ZmZlcjo6Z2V0QnVmZmVyRW5kOworICB1c2luZyBNZW1vcnlCdWZmZXI6OmdldEJ1ZmZlclN0YXJ0OworCisgIC8vIGNvbnN0X2Nhc3QgaXMgd2VsbC1kZWZpbmVkIGhlcmUsIGJlY2F1c2UgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlzCisgIC8vIGd1YXJhbnRlZWQgdG8gaGF2ZSBiZWVuIGluaXRpYWxpemVkIHdpdGggYSBtdXRhYmxlIGJ1ZmZlci4KKyAgY2hhciAqZ2V0QnVmZmVyU3RhcnQoKSB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8Y2hhciAqPihNZW1vcnlCdWZmZXI6OmdldEJ1ZmZlclN0YXJ0KCkpOworICB9CisgIGNoYXIgKmdldEJ1ZmZlckVuZCgpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxjaGFyICo+KE1lbW9yeUJ1ZmZlcjo6Z2V0QnVmZmVyRW5kKCkpOworICB9CisgIE11dGFibGVBcnJheVJlZjxjaGFyPiBnZXRCdWZmZXIoKSB7CisgICAgcmV0dXJuIHtnZXRCdWZmZXJTdGFydCgpLCBnZXRCdWZmZXJFbmQoKX07CisgIH0KKworICBzdGF0aWMgRXJyb3JPcjxzdGQ6OnVuaXF1ZV9wdHI8V3JpdGVUaHJvdWdoTWVtb3J5QnVmZmVyPj4KKyAgZ2V0RmlsZShjb25zdCBUd2luZSAmRmlsZW5hbWUsIGludDY0X3QgRmlsZVNpemUgPSAtMSk7CisKKyAgLy8vIE1hcCBhIHN1YnJhbmdlIG9mIHRoZSBzcGVjaWZpZWQgZmlsZSBhcyBhIFJlYWRXcml0ZU1lbW9yeUJ1ZmZlci4KKyAgc3RhdGljIEVycm9yT3I8c3RkOjp1bmlxdWVfcHRyPFdyaXRlVGhyb3VnaE1lbW9yeUJ1ZmZlcj4+CisgIGdldEZpbGVTbGljZShjb25zdCBUd2luZSAmRmlsZW5hbWUsIHVpbnQ2NF90IE1hcFNpemUsIHVpbnQ2NF90IE9mZnNldCk7CisKK3ByaXZhdGU6CisgIC8vIEhpZGUgdGhlc2UgYmFzZSBjbGFzcyBmYWN0b3J5IGZ1bmN0aW9uIHNvIG9uZSBjYW4ndCB3cml0ZQorICAvLyAgIFdyaXRhYmxlTWVtb3J5QnVmZmVyOjpnZXRYWFgoKQorICAvLyBhbmQgYmUgc3VycHJpc2VkIHRoYXQgaGUgZ290IGEgcmVhZC1vbmx5IEJ1ZmZlci4KKyAgdXNpbmcgTWVtb3J5QnVmZmVyOjpnZXRGaWxlQXNTdHJlYW07CisgIHVzaW5nIE1lbW9yeUJ1ZmZlcjo6Z2V0RmlsZU9yU1RESU47CisgIHVzaW5nIE1lbW9yeUJ1ZmZlcjo6Z2V0TWVtQnVmZmVyOworICB1c2luZyBNZW1vcnlCdWZmZXI6OmdldE1lbUJ1ZmZlckNvcHk7CisgIHVzaW5nIE1lbW9yeUJ1ZmZlcjo6Z2V0T3BlbkZpbGU7CisgIHVzaW5nIE1lbW9yeUJ1ZmZlcjo6Z2V0T3BlbkZpbGVTbGljZTsKKyAgdXNpbmcgTWVtb3J5QnVmZmVyOjpnZXRTVERJTjsKK307CisKK2NsYXNzIE1lbW9yeUJ1ZmZlclJlZiB7CisgIFN0cmluZ1JlZiBCdWZmZXI7CisgIFN0cmluZ1JlZiBJZGVudGlmaWVyOworCitwdWJsaWM6CisgIE1lbW9yeUJ1ZmZlclJlZigpID0gZGVmYXVsdDsKKyAgTWVtb3J5QnVmZmVyUmVmKE1lbW9yeUJ1ZmZlciYgQnVmZmVyKQorICAgICAgOiBCdWZmZXIoQnVmZmVyLmdldEJ1ZmZlcigpKSwgSWRlbnRpZmllcihCdWZmZXIuZ2V0QnVmZmVySWRlbnRpZmllcigpKSB7fQorICBNZW1vcnlCdWZmZXJSZWYoU3RyaW5nUmVmIEJ1ZmZlciwgU3RyaW5nUmVmIElkZW50aWZpZXIpCisgICAgICA6IEJ1ZmZlcihCdWZmZXIpLCBJZGVudGlmaWVyKElkZW50aWZpZXIpIHt9CisKKyAgU3RyaW5nUmVmIGdldEJ1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIEJ1ZmZlcjsgfQorCisgIFN0cmluZ1JlZiBnZXRCdWZmZXJJZGVudGlmaWVyKCkgY29uc3QgeyByZXR1cm4gSWRlbnRpZmllcjsgfQorCisgIGNvbnN0IGNoYXIgKmdldEJ1ZmZlclN0YXJ0KCkgY29uc3QgeyByZXR1cm4gQnVmZmVyLmJlZ2luKCk7IH0KKyAgY29uc3QgY2hhciAqZ2V0QnVmZmVyRW5kKCkgY29uc3QgeyByZXR1cm4gQnVmZmVyLmVuZCgpOyB9CisgIHNpemVfdCBnZXRCdWZmZXJTaXplKCkgY29uc3QgeyByZXR1cm4gQnVmZmVyLnNpemUoKTsgfQorfTsKKworLy8gQ3JlYXRlIHdyYXBwZXJzIGZvciBDIEJpbmRpbmcgdHlwZXMgKHNlZSBDQmluZGluZ1dyYXBwaW5nLmgpLgorREVGSU5FX1NJTVBMRV9DT05WRVJTSU9OX0ZVTkNUSU9OUyhNZW1vcnlCdWZmZXIsIExMVk1NZW1vcnlCdWZmZXJSZWYpCisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfTUVNT1JZQlVGRkVSX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NaXBzQUJJRmxhZ3MuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NaXBzQUJJRmxhZ3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGU2MmU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L01pcHNBQklGbGFncy5oCkBAIC0wLDAgKzEsMTAzIEBACisvLz09PS0tLSBNaXBzQUJJRmxhZ3MuaCAtIE1JUFMgQUJJIGZsYWdzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBjb25zdGFudHMgZm9yIHRoZSBBQkkgZmxhZ3Mgc3RydWN0dXJlIGNvbnRhaW5lZAorLy8gaW4gdGhlIC5NSVBTLmFiaWZsYWdzIHNlY3Rpb24uCisvLworLy8gaHR0cHM6Ly9kbXotcG9ydGFsLm1pcHMuY29tL3dpa2kvTUlQU19PMzJfQUJJXy1fRlIwX2FuZF9GUjFfSW50ZXJsaW5raW5nCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfTUlQU0FCSUZMQUdTX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX01JUFNBQklGTEFHU19ICisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBNaXBzIHsKKworLy8gVmFsdWVzIGZvciB0aGUgeHh4X3NpemUgYnl0ZXMgb2YgYW4gQUJJIGZsYWdzIHN0cnVjdHVyZS4KK2VudW0gQUZMX1JFRyB7CisgIEFGTF9SRUdfTk9ORSA9IDB4MDAsIC8vIE5vIHJlZ2lzdGVycworICBBRkxfUkVHXzMyID0gMHgwMSwgICAvLyAzMi1iaXQgcmVnaXN0ZXJzCisgIEFGTF9SRUdfNjQgPSAweDAyLCAgIC8vIDY0LWJpdCByZWdpc3RlcnMKKyAgQUZMX1JFR18xMjggPSAweDAzICAgLy8gMTI4LWJpdCByZWdpc3RlcnMKK307CisKKy8vIE1hc2tzIGZvciB0aGUgYXNlcyB3b3JkIG9mIGFuIEFCSSBmbGFncyBzdHJ1Y3R1cmUuCitlbnVtIEFGTF9BU0UgeworICBBRkxfQVNFX0RTUCA9IDB4MDAwMDAwMDEsICAgICAgIC8vIERTUCBBU0UKKyAgQUZMX0FTRV9EU1BSMiA9IDB4MDAwMDAwMDIsICAgICAvLyBEU1AgUjIgQVNFCisgIEFGTF9BU0VfRVZBID0gMHgwMDAwMDAwNCwgICAgICAgLy8gRW5oYW5jZWQgVkEgU2NoZW1lCisgIEFGTF9BU0VfTUNVID0gMHgwMDAwMDAwOCwgICAgICAgLy8gTUNVIChNaWNyb0NvbnRyb2xsZXIpIEFTRQorICBBRkxfQVNFX01ETVggPSAweDAwMDAwMDEwLCAgICAgIC8vIE1ETVggQVNFCisgIEFGTF9BU0VfTUlQUzNEID0gMHgwMDAwMDAyMCwgICAgLy8gTUlQUy0zRCBBU0UKKyAgQUZMX0FTRV9NVCA9IDB4MDAwMDAwNDAsICAgICAgICAvLyBNVCBBU0UKKyAgQUZMX0FTRV9TTUFSVE1JUFMgPSAweDAwMDAwMDgwLCAvLyBTbWFydE1JUFMgQVNFCisgIEFGTF9BU0VfVklSVCA9IDB4MDAwMDAxMDAsICAgICAgLy8gVlogQVNFCisgIEFGTF9BU0VfTVNBID0gMHgwMDAwMDIwMCwgICAgICAgLy8gTVNBIEFTRQorICBBRkxfQVNFX01JUFMxNiA9IDB4MDAwMDA0MDAsICAgIC8vIE1JUFMxNiBBU0UKKyAgQUZMX0FTRV9NSUNST01JUFMgPSAweDAwMDAwODAwLCAvLyBNSUNST01JUFMgQVNFCisgIEFGTF9BU0VfWFBBID0gMHgwMDAwMTAwMCwgICAgICAgLy8gWFBBIEFTRQorICBBRkxfQVNFX0NSQyA9IDB4MDAwMDgwMDAgICAgICAgIC8vIENSQyBBU0UKK307CisKKy8vIFZhbHVlcyBmb3IgdGhlIGlzYV9leHQgd29yZCBvZiBhbiBBQkkgZmxhZ3Mgc3RydWN0dXJlLgorZW51bSBBRkxfRVhUIHsKKyAgQUZMX0VYVF9OT05FID0gMCwgICAgICAgICAvLyBOb25lCisgIEFGTF9FWFRfWExSID0gMSwgICAgICAgICAgLy8gUk1JIFhsciBpbnN0cnVjdGlvbgorICBBRkxfRVhUX09DVEVPTjIgPSAyLCAgICAgIC8vIENhdml1bSBOZXR3b3JrcyBPY3Rlb24yCisgIEFGTF9FWFRfT0NURU9OUCA9IDMsICAgICAgLy8gQ2F2aXVtIE5ldHdvcmtzIE9jdGVvblAKKyAgQUZMX0VYVF9MT09OR1NPTl8zQSA9IDQsICAvLyBMb29uZ3NvbiAzQQorICBBRkxfRVhUX09DVEVPTiA9IDUsICAgICAgIC8vIENhdml1bSBOZXR3b3JrcyBPY3Rlb24KKyAgQUZMX0VYVF81OTAwID0gNiwgICAgICAgICAvLyBNSVBTIFI1OTAwIGluc3RydWN0aW9uCisgIEFGTF9FWFRfNDY1MCA9IDcsICAgICAgICAgLy8gTUlQUyBSNDY1MCBpbnN0cnVjdGlvbgorICBBRkxfRVhUXzQwMTAgPSA4LCAgICAgICAgIC8vIExTSSBSNDAxMCBpbnN0cnVjdGlvbgorICBBRkxfRVhUXzQxMDAgPSA5LCAgICAgICAgIC8vIE5FQyBWUjQxMDAgaW5zdHJ1Y3Rpb24KKyAgQUZMX0VYVF8zOTAwID0gMTAsICAgICAgICAvLyBUb3NoaWJhIFIzOTAwIGluc3RydWN0aW9uCisgIEFGTF9FWFRfMTAwMDAgPSAxMSwgICAgICAgLy8gTUlQUyBSMTAwMDAgaW5zdHJ1Y3Rpb24KKyAgQUZMX0VYVF9TQjEgPSAxMiwgICAgICAgICAvLyBCcm9hZGNvbSBTQi0xIGluc3RydWN0aW9uCisgIEFGTF9FWFRfNDExMSA9IDEzLCAgICAgICAgLy8gTkVDIFZSNDExMS9WUjQxODEgaW5zdHJ1Y3Rpb24KKyAgQUZMX0VYVF80MTIwID0gMTQsICAgICAgICAvLyBORUMgVlI0MTIwIGluc3RydWN0aW9uCisgIEFGTF9FWFRfNTQwMCA9IDE1LCAgICAgICAgLy8gTkVDIFZSNTQwMCBpbnN0cnVjdGlvbgorICBBRkxfRVhUXzU1MDAgPSAxNiwgICAgICAgIC8vIE5FQyBWUjU1MDAgaW5zdHJ1Y3Rpb24KKyAgQUZMX0VYVF9MT09OR1NPTl8yRSA9IDE3LCAvLyBTVCBNaWNyb2VsZWN0cm9uaWNzIExvb25nc29uIDJFCisgIEFGTF9FWFRfTE9PTkdTT05fMkYgPSAxOCwgLy8gU1QgTWljcm9lbGVjdHJvbmljcyBMb29uZ3NvbiAyRgorICBBRkxfRVhUX09DVEVPTjMgPSAxOSAgICAgIC8vIENhdml1bSBOZXR3b3JrcyBPY3Rlb24zCit9OworCisvLyBWYWx1ZXMgZm9yIHRoZSBmbGFnczEgd29yZCBvZiBhbiBBQkkgZmxhZ3Mgc3RydWN0dXJlLgorZW51bSBBRkxfRkxBR1MxIHsgQUZMX0ZMQUdTMV9PRERTUFJFRyA9IDEgfTsKKworLy8gTUlQUyBvYmplY3QgYXR0cmlidXRlIHRhZ3MKK2VudW0geworICBUYWdfR05VX01JUFNfQUJJX0ZQID0gNCwgIC8vIEZsb2F0aW5nLXBvaW50IEFCSSB1c2VkIGJ5IHRoaXMgb2JqZWN0IGZpbGUKKyAgVGFnX0dOVV9NSVBTX0FCSV9NU0EgPSA4LCAvLyBNU0EgQUJJIHVzZWQgYnkgdGhpcyBvYmplY3QgZmlsZQorfTsKKworLy8gVmFsdWVzIGZvciB0aGUgZnBfYWJpIHdvcmQgb2YgYW4gQUJJIGZsYWdzIHN0cnVjdHVyZQorLy8gYW5kIGZvciB0aGUgVGFnX0dOVV9NSVBTX0FCSV9GUCBhdHRyaWJ1dGUgdGFnLgorZW51bSBWYWxfR05VX01JUFNfQUJJX0ZQIHsKKyAgVmFsX0dOVV9NSVBTX0FCSV9GUF9BTlkgPSAwLCAgICAvLyBub3QgdGFnZ2VkCisgIFZhbF9HTlVfTUlQU19BQklfRlBfRE9VQkxFID0gMSwgLy8gaGFyZCBmbG9hdCAvIC1tZG91YmxlLWZsb2F0CisgIFZhbF9HTlVfTUlQU19BQklfRlBfU0lOR0xFID0gMiwgLy8gaGFyZCBmbG9hdCAvIC1tc2luZ2xlLWZsb2F0CisgIFZhbF9HTlVfTUlQU19BQklfRlBfU09GVCA9IDMsICAgLy8gc29mdCBmbG9hdAorICBWYWxfR05VX01JUFNfQUJJX0ZQX09MRF82NCA9IDQsIC8vIC1taXBzMzJyMiAtbWZwNjQKKyAgVmFsX0dOVV9NSVBTX0FCSV9GUF9YWCA9IDUsICAgICAvLyAtbWZweHgKKyAgVmFsX0dOVV9NSVBTX0FCSV9GUF82NCA9IDYsICAgICAvLyAtbWlwczMycjIgLW1mcDY0CisgIFZhbF9HTlVfTUlQU19BQklfRlBfNjRBID0gNyAgICAgLy8gLW1pcHMzMnIyIC1tZnA2NCAtbW5vLW9kZC1zcHJlZworfTsKKworLy8gVmFsdWVzIGZvciB0aGUgVGFnX0dOVV9NSVBTX0FCSV9NU0EgYXR0cmlidXRlIHRhZy4KK2VudW0gVmFsX0dOVV9NSVBTX0FCSV9NU0EgeworICBWYWxfR05VX01JUFNfQUJJX01TQV9BTlkgPSAwLCAvLyBub3QgdGFnZ2VkCisgIFZhbF9HTlVfTUlQU19BQklfTVNBXzEyOCA9IDEgIC8vIDEyOC1iaXQgTVNBCit9OworfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NdXRleC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L011dGV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGY0ZTYxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NdXRleC5oCkBAIC0wLDAgKzEsMTU4IEBACisvLz09PS0gbGx2bS9TdXBwb3J0L011dGV4LmggLSBNdXRleCBPcGVyYXRpbmcgU3lzdGVtIENvbmNlcHQgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGxsdm06OnN5czo6TXV0ZXggY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfTVVURVhfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfTVVURVhfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1RocmVhZGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtCit7CisgIG5hbWVzcGFjZSBzeXMKKyAgeworICAgIC8vLyBAYnJpZWYgUGxhdGZvcm0gYWdub3N0aWMgTXV0ZXggY2xhc3MuCisgICAgY2xhc3MgTXV0ZXhJbXBsCisgICAgeworICAgIC8vLyBAbmFtZSBDb25zdHJ1Y3RvcnMKKyAgICAvLy8gQHsKKyAgICBwdWJsaWM6CisKKyAgICAgIC8vLyBJbml0aWFsaXplcyB0aGUgbG9jayBidXQgZG9lc24ndCBhY3F1aXJlIGl0LiBpZiBccCByZWN1cnNpdmUgaXMgc2V0CisgICAgICAvLy8gdG8gZmFsc2UsIHRoZSBsb2NrIHdpbGwgbm90IGJlIHJlY3Vyc2l2ZSB3aGljaCBtYWtlcyBpdCBjaGVhcGVyIGJ1dAorICAgICAgLy8vIGFsc28gbW9yZSBsaWtlbHkgdG8gZGVhZGxvY2sgKHNhbWUgdGhyZWFkIGNhbid0IGFjcXVpcmUgbW9yZSB0aGFuCisgICAgICAvLy8gb25jZSkuCisgICAgICAvLy8gQGJyaWVmIERlZmF1bHQgQ29uc3RydWN0b3IuCisgICAgICBleHBsaWNpdCBNdXRleEltcGwoYm9vbCByZWN1cnNpdmUgPSB0cnVlKTsKKworICAgICAgLy8vIFJlbGVhc2VzIGFuZCByZW1vdmVzIHRoZSBsb2NrCisgICAgICAvLy8gQGJyaWVmIERlc3RydWN0b3IKKyAgICAgIH5NdXRleEltcGwoKTsKKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBNZXRob2RzCisgICAgLy8vIEB7CisgICAgcHVibGljOgorCisgICAgICAvLy8gQXR0ZW1wdHMgdG8gdW5jb25kaXRpb25hbGx5IGFjcXVpcmUgdGhlIGxvY2suIElmIHRoZSBsb2NrIGlzIGhlbGQgYnkKKyAgICAgIC8vLyBhbm90aGVyIHRocmVhZCwgdGhpcyBtZXRob2Qgd2lsbCB3YWl0IHVudGlsIGl0IGNhbiBhY3F1aXJlIHRoZSBsb2NrLgorICAgICAgLy8vIEByZXR1cm5zIGZhbHNlIGlmIGFueSBraW5kIG9mIGVycm9yIG9jY3VycywgdHJ1ZSBvdGhlcndpc2UuCisgICAgICAvLy8gQGJyaWVmIFVuY29uZGl0aW9uYWxseSBhY3F1aXJlIHRoZSBsb2NrLgorICAgICAgYm9vbCBhY3F1aXJlKCk7CisKKyAgICAgIC8vLyBBdHRlbXB0cyB0byByZWxlYXNlIHRoZSBsb2NrLiBJZiB0aGUgbG9jayBpcyBoZWxkIGJ5IHRoZSBjdXJyZW50CisgICAgICAvLy8gdGhyZWFkLCB0aGUgbG9jayBpcyByZWxlYXNlZCBhbGxvd2luZyBvdGhlciB0aHJlYWRzIHRvIGFjcXVpcmUgdGhlCisgICAgICAvLy8gbG9jay4KKyAgICAgIC8vLyBAcmV0dXJucyBmYWxzZSBpZiBhbnkga2luZCBvZiBlcnJvciBvY2N1cnMsIHRydWUgb3RoZXJ3aXNlLgorICAgICAgLy8vIEBicmllZiBVbmNvbmRpdGlvbmFsbHkgcmVsZWFzZSB0aGUgbG9jay4KKyAgICAgIGJvb2wgcmVsZWFzZSgpOworCisgICAgICAvLy8gQXR0ZW1wdHMgdG8gYWNxdWlyZSB0aGUgbG9jayB3aXRob3V0IGJsb2NraW5nLiBJZiB0aGUgbG9jayBpcyBub3QKKyAgICAgIC8vLyBhdmFpbGFibGUsIHRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBxdWlja2x5ICh3aXRob3V0IGJsb2NraW5nKS4gSWYKKyAgICAgIC8vLyB0aGUgbG9jayBpcyBhdmFpbGFibGUsIGl0IGlzIGFjcXVpcmVkLgorICAgICAgLy8vIEByZXR1cm5zIGZhbHNlIGlmIGFueSBraW5kIG9mIGVycm9yIG9jY3VycyBvciB0aGUgbG9jayBpcyBub3QKKyAgICAgIC8vLyBhdmFpbGFibGUsIHRydWUgb3RoZXJ3aXNlLgorICAgICAgLy8vIEBicmllZiBUcnkgdG8gYWNxdWlyZSB0aGUgbG9jay4KKyAgICAgIGJvb2wgdHJ5YWNxdWlyZSgpOworCisgICAgLy9AfQorICAgIC8vLyBAbmFtZSBQbGF0Zm9ybSBEZXBlbmRlbnQgRGF0YQorICAgIC8vLyBAeworICAgIHByaXZhdGU6CisjaWYgZGVmaW5lZChMTFZNX0VOQUJMRV9USFJFQURTKSAmJiBMTFZNX0VOQUJMRV9USFJFQURTICE9IDAKKyAgICAgIHZvaWQqIGRhdGFfOyAvLy88IFdlIGRvbid0IGtub3cgd2hhdCB0aGUgZGF0YSB3aWxsIGJlCisjZW5kaWYKKworICAgIC8vLyBAfQorICAgIC8vLyBAbmFtZSBEbyBOb3QgSW1wbGVtZW50CisgICAgLy8vIEB7CisgICAgcHJpdmF0ZToKKyAgICAgIE11dGV4SW1wbChjb25zdCBNdXRleEltcGwgJikgPSBkZWxldGU7CisgICAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBNdXRleEltcGwgJikgPSBkZWxldGU7CisgICAgLy8vIEB9CisgICAgfTsKKworCisgICAgLy8vIFNtYXJ0TXV0ZXggLSBBIG11dGV4IHdpdGggYSBjb21waWxlIHRpbWUgY29uc3RhbnQgcGFyYW1ldGVyIHRoYXQKKyAgICAvLy8gaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBtdXRleCBzaG91bGQgYmVjb21lIGEgbm8tb3Agd2hlbiB3ZSdyZSBub3QKKyAgICAvLy8gcnVubmluZyBpbiBtdWx0aXRocmVhZGVkIG1vZGUuCisgICAgdGVtcGxhdGU8Ym9vbCBtdF9vbmx5PgorICAgIGNsYXNzIFNtYXJ0TXV0ZXggeworICAgICAgTXV0ZXhJbXBsIGltcGw7CisgICAgICB1bnNpZ25lZCBhY3F1aXJlZDsKKyAgICAgIGJvb2wgcmVjdXJzaXZlOworICAgIHB1YmxpYzoKKyAgICAgIGV4cGxpY2l0IFNtYXJ0TXV0ZXgoYm9vbCByZWMgPSB0cnVlKSA6CisgICAgICAgIGltcGwocmVjKSwgYWNxdWlyZWQoMCksIHJlY3Vyc2l2ZShyZWMpIHsgfQorCisgICAgICBib29sIGxvY2soKSB7CisgICAgICAgIGlmICghbXRfb25seSB8fCBsbHZtX2lzX211bHRpdGhyZWFkZWQoKSkgeworICAgICAgICAgIHJldHVybiBpbXBsLmFjcXVpcmUoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBTaW5nbGUtdGhyZWFkZWQgZGVidWdnaW5nIGNvZGUuICBUaGlzIHdvdWxkIGJlIHJhY3kgaW4KKyAgICAgICAgICAvLyBtdWx0aXRocmVhZGVkIG1vZGUsIGJ1dCBwcm92aWRlcyBub3Qgc2FuaXR5IGNoZWNrcyBpbiBzaW5nbGUKKyAgICAgICAgICAvLyB0aHJlYWRlZCBtb2RlLgorICAgICAgICAgIGFzc2VydCgocmVjdXJzaXZlIHx8IGFjcXVpcmVkID09IDApICYmICJMb2NrIGFscmVhZHkgYWNxdWlyZWQhISIpOworICAgICAgICAgICsrYWNxdWlyZWQ7CisgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKworICAgICAgYm9vbCB1bmxvY2soKSB7CisgICAgICAgIGlmICghbXRfb25seSB8fCBsbHZtX2lzX211bHRpdGhyZWFkZWQoKSkgeworICAgICAgICAgIHJldHVybiBpbXBsLnJlbGVhc2UoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBTaW5nbGUtdGhyZWFkZWQgZGVidWdnaW5nIGNvZGUuICBUaGlzIHdvdWxkIGJlIHJhY3kgaW4KKyAgICAgICAgICAvLyBtdWx0aXRocmVhZGVkIG1vZGUsIGJ1dCBwcm92aWRlcyBub3Qgc2FuaXR5IGNoZWNrcyBpbiBzaW5nbGUKKyAgICAgICAgICAvLyB0aHJlYWRlZCBtb2RlLgorICAgICAgICAgIGFzc2VydCgoKHJlY3Vyc2l2ZSAmJiBhY3F1aXJlZCkgfHwgKGFjcXVpcmVkID09IDEpKSAmJgorICAgICAgICAgICAgICAgICAiTG9jayBub3QgYWNxdWlyZWQgYmVmb3JlIHJlbGVhc2UhIik7CisgICAgICAgICAgLS1hY3F1aXJlZDsKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBib29sIHRyeV9sb2NrKCkgeworICAgICAgICBpZiAoIW10X29ubHkgfHwgbGx2bV9pc19tdWx0aXRocmVhZGVkKCkpCisgICAgICAgICAgcmV0dXJuIGltcGwudHJ5YWNxdWlyZSgpOworICAgICAgICBlbHNlIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBwcml2YXRlOgorICAgICAgICBTbWFydE11dGV4KGNvbnN0IFNtYXJ0TXV0ZXg8bXRfb25seT4gJiBvcmlnaW5hbCk7CisgICAgICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFNtYXJ0TXV0ZXg8bXRfb25seT4gJik7CisgICAgfTsKKworICAgIC8vLyBNdXRleCAtIEEgc3RhbmRhcmQsIGFsd2F5cyBlbmZvcmNlZCBtdXRleC4KKyAgICB0eXBlZGVmIFNtYXJ0TXV0ZXg8ZmFsc2U+IE11dGV4OworCisgICAgdGVtcGxhdGU8Ym9vbCBtdF9vbmx5PgorICAgIGNsYXNzIFNtYXJ0U2NvcGVkTG9jayAgeworICAgICAgU21hcnRNdXRleDxtdF9vbmx5PiYgbXR4OworCisgICAgcHVibGljOgorICAgICAgU21hcnRTY29wZWRMb2NrKFNtYXJ0TXV0ZXg8bXRfb25seT4mIG0pIDogbXR4KG0pIHsKKyAgICAgICAgbXR4LmxvY2soKTsKKyAgICAgIH0KKworICAgICAgflNtYXJ0U2NvcGVkTG9jaygpIHsKKyAgICAgICAgbXR4LnVubG9jaygpOworICAgICAgfQorICAgIH07CisKKyAgICB0eXBlZGVmIFNtYXJ0U2NvcGVkTG9jazxmYWxzZT4gU2NvcGVkTG9jazsKKyAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9NdXRleEd1YXJkLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTXV0ZXhHdWFyZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3YjY0YjYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvTXV0ZXhHdWFyZC5oCkBAIC0wLDAgKzEsNDEgQEAKKy8vPT09LS0gU3VwcG9ydC9NdXRleEd1YXJkLmggLSBBY3F1aXJlL1JlbGVhc2UgTXV0ZXggSW4gU2NvcGUgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgYSBndWFyZCBmb3IgYSBibG9jayBvZiBjb2RlIHRoYXQgZW5zdXJlcyBhIE11dGV4IGlzIGxvY2tlZAorLy8gdXBvbiBjb25zdHJ1Y3Rpb24gYW5kIHJlbGVhc2VkIHVwb24gZGVzdHJ1Y3Rpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfTVVURVhHVUFSRF9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9NVVRFWEdVQVJEX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NdXRleC5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIC8vLyBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhY3F1aXJlIGEgZ2l2ZW4gTXV0ZXggTG9jayB3aGVuIGNvbnN0cnVjdGVkIGFuZAorICAvLy8gaG9sZCB0aGF0IGxvY2sgdW50aWwgZGVzdHJ1Y3Rpb24uIFRoZSBpbnRlbnRpb24gaXMgdG8gaW5zdGFudGlhdGUgb25lIG9mCisgIC8vLyB0aGVzZSBvbiB0aGUgc3RhY2sgYXQgdGhlIHRvcCBvZiBzb21lIHNjb3BlIHRvIGJlIGFzc3VyZWQgdGhhdCBDKysKKyAgLy8vIGRlc3RydWN0aW9uIG9mIHRoZSBvYmplY3Qgd2lsbCBhbHdheXMgcmVsZWFzZSB0aGUgTXV0ZXggYW5kIHRodXMgYXZvaWQKKyAgLy8vIGEgaG9zdCBvZiBuYXN0eSBtdWx0aS10aHJlYWRpbmcgcHJvYmxlbXMgaW4gdGhlIGZhY2Ugb2YgZXhjZXB0aW9ucywgZXRjLgorICAvLy8gQGJyaWVmIEd1YXJkIGEgc2VjdGlvbiBvZiBjb2RlIHdpdGggYSBNdXRleC4KKyAgY2xhc3MgTXV0ZXhHdWFyZCB7CisgICAgc3lzOjpNdXRleCAmTTsKKyAgICBNdXRleEd1YXJkKGNvbnN0IE11dGV4R3VhcmQgJikgPSBkZWxldGU7CisgICAgdm9pZCBvcGVyYXRvcj0oY29uc3QgTXV0ZXhHdWFyZCAmKSA9IGRlbGV0ZTsKKyAgcHVibGljOgorICAgIE11dGV4R3VhcmQoc3lzOjpNdXRleCAmbSkgOiBNKG0pIHsgTS5sb2NrKCk7IH0KKyAgICB+TXV0ZXhHdWFyZCgpIHsgTS51bmxvY2soKTsgfQorICAgIC8vLyBob2xkcyAtIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGxvY2tlciBpbnN0YW5jZSBob2xkcyB0aGUgc3BlY2lmaWVkIGxvY2suCisgICAgLy8vIFRoaXMgaXMgbW9zdGx5IHVzZWQgaW4gYXNzZXJ0aW9ucyB0byB2YWxpZGF0ZSB0aGF0IHRoZSBjb3JyZWN0IG11dGV4CisgICAgLy8vIGlzIGhlbGQuCisgICAgYm9vbCBob2xkcyhjb25zdCBzeXM6Ok11dGV4JiBsb2NrKSBjb25zdCB7IHJldHVybiAmTSA9PSAmbG9jazsgfQorICB9OworfQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX01VVEVYR1VBUkRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L05hdGl2ZUZvcm1hdHRpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9OYXRpdmVGb3JtYXR0aW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQxZGQ3YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9OYXRpdmVGb3JtYXR0aW5nLmgKQEAgLTAsMCArMSw0OSBAQAorLy89PT0tIE5hdGl2ZUZvcm1hdHRpbmcuaCAtIExvdyBsZXZlbCBmb3JtYXR0aW5nIGhlbHBlcnMgLS0tLS0tLS0tKi0gQysrLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfTkFUSVZFX0ZPUk1BVFRJTkdfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfTkFUSVZFX0ZPUk1BVFRJTkdfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKK2VudW0gY2xhc3MgRmxvYXRTdHlsZSB7IEV4cG9uZW50LCBFeHBvbmVudFVwcGVyLCBGaXhlZCwgUGVyY2VudCB9OworZW51bSBjbGFzcyBJbnRlZ2VyU3R5bGUgeworICBJbnRlZ2VyLAorICBOdW1iZXIsCit9OworZW51bSBjbGFzcyBIZXhQcmludFN0eWxlIHsgVXBwZXIsIExvd2VyLCBQcmVmaXhVcHBlciwgUHJlZml4TG93ZXIgfTsKKworc2l6ZV90IGdldERlZmF1bHRQcmVjaXNpb24oRmxvYXRTdHlsZSBTdHlsZSk7CisKK2Jvb2wgaXNQcmVmaXhlZEhleFN0eWxlKEhleFByaW50U3R5bGUgUyk7CisKK3ZvaWQgd3JpdGVfaW50ZWdlcihyYXdfb3N0cmVhbSAmUywgdW5zaWduZWQgaW50IE4sIHNpemVfdCBNaW5EaWdpdHMsCisgICAgICAgICAgICAgICAgICAgSW50ZWdlclN0eWxlIFN0eWxlKTsKK3ZvaWQgd3JpdGVfaW50ZWdlcihyYXdfb3N0cmVhbSAmUywgaW50IE4sIHNpemVfdCBNaW5EaWdpdHMsIEludGVnZXJTdHlsZSBTdHlsZSk7Cit2b2lkIHdyaXRlX2ludGVnZXIocmF3X29zdHJlYW0gJlMsIHVuc2lnbmVkIGxvbmcgTiwgc2l6ZV90IE1pbkRpZ2l0cywKKyAgICAgICAgICAgICAgICAgICBJbnRlZ2VyU3R5bGUgU3R5bGUpOwordm9pZCB3cml0ZV9pbnRlZ2VyKHJhd19vc3RyZWFtICZTLCBsb25nIE4sIHNpemVfdCBNaW5EaWdpdHMsCisgICAgICAgICAgICAgICAgICAgSW50ZWdlclN0eWxlIFN0eWxlKTsKK3ZvaWQgd3JpdGVfaW50ZWdlcihyYXdfb3N0cmVhbSAmUywgdW5zaWduZWQgbG9uZyBsb25nIE4sIHNpemVfdCBNaW5EaWdpdHMsCisgICAgICAgICAgICAgICAgICAgSW50ZWdlclN0eWxlIFN0eWxlKTsKK3ZvaWQgd3JpdGVfaW50ZWdlcihyYXdfb3N0cmVhbSAmUywgbG9uZyBsb25nIE4sIHNpemVfdCBNaW5EaWdpdHMsCisgICAgICAgICAgICAgICAgICAgSW50ZWdlclN0eWxlIFN0eWxlKTsKKwordm9pZCB3cml0ZV9oZXgocmF3X29zdHJlYW0gJlMsIHVpbnQ2NF90IE4sIEhleFByaW50U3R5bGUgU3R5bGUsCisgICAgICAgICAgICAgICBPcHRpb25hbDxzaXplX3Q+IFdpZHRoID0gTm9uZSk7Cit2b2lkIHdyaXRlX2RvdWJsZShyYXdfb3N0cmVhbSAmUywgZG91YmxlIEQsIEZsb2F0U3R5bGUgU3R5bGUsCisgICAgICAgICAgICAgICAgICBPcHRpb25hbDxzaXplX3Q+IFByZWNpc2lvbiA9IE5vbmUpOworfQorCisjZW5kaWYKKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L09uRGlza0hhc2hUYWJsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L09uRGlza0hhc2hUYWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNlZjAwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvT25EaXNrSGFzaFRhYmxlLmgKQEAgLTAsMCArMSw2MTYgQEAKKy8vPT09LS0tIE9uRGlza0hhc2hUYWJsZS5oIC0gT24tRGlzayBIYXNoIFRhYmxlIEltcGxlbWVudGF0aW9uIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFxicmllZiBEZWZpbmVzIGZhY2lsaXRpZXMgZm9yIHJlYWRpbmcgYW5kIHdyaXRpbmcgb24tZGlzayBoYXNoIHRhYmxlcy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9TVVBQT1JUX09ORElTS0hBU0hUQUJMRV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9PTkRJU0tIQVNIVEFCTEVfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRW5kaWFuU3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0hvc3QuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGxpYj4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gXGJyaWVmIEdlbmVyYXRlcyBhbiBvbiBkaXNrIGhhc2ggdGFibGUuCisvLy8KKy8vLyBUaGlzIG5lZWRzIGFuIFxjIEluZm8gdGhhdCBoYW5kbGVzIHN0b3JpbmcgdmFsdWVzIGludG8gdGhlIGhhc2ggdGFibGUncworLy8vIHBheWxvYWQgYW5kIGNvbXB1dGVzIHRoZSBoYXNoIGZvciBhIGdpdmVuIGtleS4gVGhpcyBzaG91bGQgcHJvdmlkZSB0aGUKKy8vLyBmb2xsb3dpbmcgaW50ZXJmYWNlOgorLy8vCisvLy8gXGNvZGUKKy8vLyBjbGFzcyBFeGFtcGxlSW5mbyB7CisvLy8gcHVibGljOgorLy8vICAgdHlwZWRlZiBFeGFtcGxlS2V5IGtleV90eXBlOyAgIC8vIE11c3QgYmUgY29weSBjb25zdHJ1Y3RpYmxlCisvLy8gICB0eXBlZGVmIEV4YW1wbGVLZXkgJmtleV90eXBlX3JlZjsKKy8vLyAgIHR5cGVkZWYgRXhhbXBsZURhdGEgZGF0YV90eXBlOyAvLyBNdXN0IGJlIGNvcHkgY29uc3RydWN0aWJsZQorLy8vICAgdHlwZWRlZiBFeGFtcGxlRGF0YSAmZGF0YV90eXBlX3JlZjsKKy8vLyAgIHR5cGVkZWYgdWludDMyX3QgaGFzaF92YWx1ZV90eXBlOyAvLyBUaGUgdHlwZSB0aGUgaGFzaCBmdW5jdGlvbiByZXR1cm5zLgorLy8vICAgdHlwZWRlZiB1aW50MzJfdCBvZmZzZXRfdHlwZTsgLy8gVGhlIHR5cGUgZm9yIG9mZnNldHMgaW50byB0aGUgdGFibGUuCisvLy8KKy8vLyAgIC8vLyBDYWxjdWxhdGUgdGhlIGhhc2ggZm9yIEtleQorLy8vICAgc3RhdGljIGhhc2hfdmFsdWVfdHlwZSBDb21wdXRlSGFzaChrZXlfdHlwZV9yZWYgS2V5KTsKKy8vLyAgIC8vLyBSZXR1cm4gdGhlIGxlbmd0aHMsIGluIGJ5dGVzLCBvZiB0aGUgZ2l2ZW4gS2V5L0RhdGEgcGFpci4KKy8vLyAgIHN0YXRpYyBzdGQ6OnBhaXI8b2Zmc2V0X3R5cGUsIG9mZnNldF90eXBlPgorLy8vICAgRW1pdEtleURhdGFMZW5ndGgocmF3X29zdHJlYW0gJk91dCwga2V5X3R5cGVfcmVmIEtleSwgZGF0YV90eXBlX3JlZiBEYXRhKTsKKy8vLyAgIC8vLyBXcml0ZSBLZXkgdG8gT3V0LiAgS2V5TGVuIGlzIHRoZSBsZW5ndGggZnJvbSBFbWl0S2V5RGF0YUxlbmd0aC4KKy8vLyAgIHN0YXRpYyB2b2lkIEVtaXRLZXkocmF3X29zdHJlYW0gJk91dCwga2V5X3R5cGVfcmVmIEtleSwKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3R5cGUgS2V5TGVuKTsKKy8vLyAgIC8vLyBXcml0ZSBEYXRhIHRvIE91dC4gIERhdGFMZW4gaXMgdGhlIGxlbmd0aCBmcm9tIEVtaXRLZXlEYXRhTGVuZ3RoLgorLy8vICAgc3RhdGljIHZvaWQgRW1pdERhdGEocmF3X29zdHJlYW0gJk91dCwga2V5X3R5cGVfcmVmIEtleSwKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFfdHlwZV9yZWYgRGF0YSwgb2Zmc2V0X3R5cGUgRGF0YUxlbik7CisvLy8gICAvLy8gRGV0ZXJtaW5lIGlmIHR3byBrZXlzIGFyZSBlcXVhbC4gT3B0aW9uYWwsIG9ubHkgbmVlZGVkIGJ5IGNvbnRhaW5zLgorLy8vICAgc3RhdGljIGJvb2wgRXF1YWxLZXkoa2V5X3R5cGVfcmVmIEtleTEsIGtleV90eXBlX3JlZiBLZXkyKTsKKy8vLyB9OworLy8vIFxlbmRjb2RlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSW5mbz4gY2xhc3MgT25EaXNrQ2hhaW5lZEhhc2hUYWJsZUdlbmVyYXRvciB7CisgIC8vLyBcYnJpZWYgQSBzaW5nbGUgaXRlbSBpbiB0aGUgaGFzaCB0YWJsZS4KKyAgY2xhc3MgSXRlbSB7CisgIHB1YmxpYzoKKyAgICB0eXBlbmFtZSBJbmZvOjprZXlfdHlwZSBLZXk7CisgICAgdHlwZW5hbWUgSW5mbzo6ZGF0YV90eXBlIERhdGE7CisgICAgSXRlbSAqTmV4dDsKKyAgICBjb25zdCB0eXBlbmFtZSBJbmZvOjpoYXNoX3ZhbHVlX3R5cGUgSGFzaDsKKworICAgIEl0ZW0odHlwZW5hbWUgSW5mbzo6a2V5X3R5cGVfcmVmIEtleSwgdHlwZW5hbWUgSW5mbzo6ZGF0YV90eXBlX3JlZiBEYXRhLAorICAgICAgICAgSW5mbyAmSW5mb09iaikKKyAgICAgICAgOiBLZXkoS2V5KSwgRGF0YShEYXRhKSwgTmV4dChudWxscHRyKSwgSGFzaChJbmZvT2JqLkNvbXB1dGVIYXNoKEtleSkpIHt9CisgIH07CisKKyAgdHlwZWRlZiB0eXBlbmFtZSBJbmZvOjpvZmZzZXRfdHlwZSBvZmZzZXRfdHlwZTsKKyAgb2Zmc2V0X3R5cGUgTnVtQnVja2V0czsKKyAgb2Zmc2V0X3R5cGUgTnVtRW50cmllczsKKyAgbGx2bTo6U3BlY2lmaWNCdW1wUHRyQWxsb2NhdG9yPEl0ZW0+IEJBOworCisgIC8vLyBcYnJpZWYgQSBsaW5rZWQgbGlzdCBvZiB2YWx1ZXMgaW4gYSBwYXJ0aWN1bGFyIGhhc2ggYnVja2V0LgorICBzdHJ1Y3QgQnVja2V0IHsKKyAgICBvZmZzZXRfdHlwZSBPZmY7CisgICAgdW5zaWduZWQgTGVuZ3RoOworICAgIEl0ZW0gKkhlYWQ7CisgIH07CisKKyAgQnVja2V0ICpCdWNrZXRzOworCitwcml2YXRlOgorICAvLy8gXGJyaWVmIEluc2VydCBhbiBpdGVtIGludG8gdGhlIGFwcHJvcHJpYXRlIGhhc2ggYnVja2V0LgorICB2b2lkIGluc2VydChCdWNrZXQgKkJ1Y2tldHMsIHNpemVfdCBTaXplLCBJdGVtICpFKSB7CisgICAgQnVja2V0ICZCID0gQnVja2V0c1tFLT5IYXNoICYgKFNpemUgLSAxKV07CisgICAgRS0+TmV4dCA9IEIuSGVhZDsKKyAgICArK0IuTGVuZ3RoOworICAgIEIuSGVhZCA9IEU7CisgIH0KKworICAvLy8gXGJyaWVmIFJlc2l6ZSB0aGUgaGFzaCB0YWJsZSwgbW92aW5nIHRoZSBvbGQgZW50cmllcyBpbnRvIHRoZSBuZXcgYnVja2V0cy4KKyAgdm9pZCByZXNpemUoc2l6ZV90IE5ld1NpemUpIHsKKyAgICBCdWNrZXQgKk5ld0J1Y2tldHMgPSBzdGF0aWNfY2FzdDxCdWNrZXQgKj4oCisgICAgICAgIHNhZmVfY2FsbG9jKE5ld1NpemUsIHNpemVvZihCdWNrZXQpKSk7CisgICAgLy8gUG9wdWxhdGUgTmV3QnVja2V0cyB3aXRoIHRoZSBvbGQgZW50cmllcy4KKyAgICBmb3IgKHNpemVfdCBJID0gMDsgSSA8IE51bUJ1Y2tldHM7ICsrSSkKKyAgICAgIGZvciAoSXRlbSAqRSA9IEJ1Y2tldHNbSV0uSGVhZDsgRTspIHsKKyAgICAgICAgSXRlbSAqTiA9IEUtPk5leHQ7CisgICAgICAgIEUtPk5leHQgPSBudWxscHRyOworICAgICAgICBpbnNlcnQoTmV3QnVja2V0cywgTmV3U2l6ZSwgRSk7CisgICAgICAgIEUgPSBOOworICAgICAgfQorCisgICAgZnJlZShCdWNrZXRzKTsKKyAgICBOdW1CdWNrZXRzID0gTmV3U2l6ZTsKKyAgICBCdWNrZXRzID0gTmV3QnVja2V0czsKKyAgfQorCitwdWJsaWM6CisgIC8vLyBcYnJpZWYgSW5zZXJ0IGFuIGVudHJ5IGludG8gdGhlIHRhYmxlLgorICB2b2lkIGluc2VydCh0eXBlbmFtZSBJbmZvOjprZXlfdHlwZV9yZWYgS2V5LAorICAgICAgICAgICAgICB0eXBlbmFtZSBJbmZvOjpkYXRhX3R5cGVfcmVmIERhdGEpIHsKKyAgICBJbmZvIEluZm9PYmo7CisgICAgaW5zZXJ0KEtleSwgRGF0YSwgSW5mb09iaik7CisgIH0KKworICAvLy8gXGJyaWVmIEluc2VydCBhbiBlbnRyeSBpbnRvIHRoZSB0YWJsZS4KKyAgLy8vCisgIC8vLyBVc2VzIHRoZSBwcm92aWRlZCBJbmZvIGluc3RlYWQgb2YgYSBzdGFjayBhbGxvY2F0ZWQgb25lLgorICB2b2lkIGluc2VydCh0eXBlbmFtZSBJbmZvOjprZXlfdHlwZV9yZWYgS2V5LAorICAgICAgICAgICAgICB0eXBlbmFtZSBJbmZvOjpkYXRhX3R5cGVfcmVmIERhdGEsIEluZm8gJkluZm9PYmopIHsKKyAgICArK051bUVudHJpZXM7CisgICAgaWYgKDQgKiBOdW1FbnRyaWVzID49IDMgKiBOdW1CdWNrZXRzKQorICAgICAgcmVzaXplKE51bUJ1Y2tldHMgKiAyKTsKKyAgICBpbnNlcnQoQnVja2V0cywgTnVtQnVja2V0cywgbmV3IChCQS5BbGxvY2F0ZSgpKSBJdGVtKEtleSwgRGF0YSwgSW5mb09iaikpOworICB9CisKKyAgLy8vIFxicmllZiBEZXRlcm1pbmUgd2hldGhlciBhbiBlbnRyeSBoYXMgYmVlbiBpbnNlcnRlZC4KKyAgYm9vbCBjb250YWlucyh0eXBlbmFtZSBJbmZvOjprZXlfdHlwZV9yZWYgS2V5LCBJbmZvICZJbmZvT2JqKSB7CisgICAgdW5zaWduZWQgSGFzaCA9IEluZm9PYmouQ29tcHV0ZUhhc2goS2V5KTsKKyAgICBmb3IgKEl0ZW0gKkkgPSBCdWNrZXRzW0hhc2ggJiAoTnVtQnVja2V0cyAtIDEpXS5IZWFkOyBJOyBJID0gSS0+TmV4dCkKKyAgICAgIGlmIChJLT5IYXNoID09IEhhc2ggJiYgSW5mb09iai5FcXVhbEtleShJLT5LZXksIEtleSkpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vLyBcYnJpZWYgRW1pdCB0aGUgdGFibGUgdG8gT3V0LCB3aGljaCBtdXN0IG5vdCBiZSBhdCBvZmZzZXQgMC4KKyAgb2Zmc2V0X3R5cGUgRW1pdChyYXdfb3N0cmVhbSAmT3V0KSB7CisgICAgSW5mbyBJbmZvT2JqOworICAgIHJldHVybiBFbWl0KE91dCwgSW5mb09iaik7CisgIH0KKworICAvLy8gXGJyaWVmIEVtaXQgdGhlIHRhYmxlIHRvIE91dCwgd2hpY2ggbXVzdCBub3QgYmUgYXQgb2Zmc2V0IDAuCisgIC8vLworICAvLy8gVXNlcyB0aGUgcHJvdmlkZWQgSW5mbyBpbnN0ZWFkIG9mIGEgc3RhY2sgYWxsb2NhdGVkIG9uZS4KKyAgb2Zmc2V0X3R5cGUgRW1pdChyYXdfb3N0cmVhbSAmT3V0LCBJbmZvICZJbmZvT2JqKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN1cHBvcnQ7CisgICAgZW5kaWFuOjpXcml0ZXI8bGl0dGxlPiBMRShPdXQpOworCisgICAgLy8gTm93IHdlJ3JlIGRvbmUgYWRkaW5nIGVudHJpZXMsIHJlc2l6ZSB0aGUgYnVja2V0IGxpc3QgaWYgaXQncworICAgIC8vIHNpZ25pZmljYW50bHkgdG9vIGxhcmdlLiAoVGhpcyBvbmx5IGhhcHBlbnMgaWYgdGhlIG51bWJlciBvZgorICAgIC8vIGVudHJpZXMgaXMgc21hbGwgYW5kIHdlJ3JlIHdpdGhpbiBvdXIgaW5pdGlhbCBhbGxvY2F0aW9uIG9mCisgICAgLy8gNjQgYnVja2V0cy4pIFdlIGFpbSBmb3IgYW4gb2NjdXBhbmN5IHJhdGlvIGluIFszLzgsIDMvNCkuCisgICAgLy8KKyAgICAvLyBBcyBhIHNwZWNpYWwgY2FzZSwgaWYgdGhlcmUgYXJlIHR3byBvciBmZXdlciBlbnRyaWVzLCBqdXN0CisgICAgLy8gZm9ybSBhIHNpbmdsZSBidWNrZXQuIEEgbGluZWFyIHNjYW4gaXMgZmluZSBpbiB0aGF0IGNhc2UsIGFuZAorICAgIC8vIHRoaXMgaXMgdmVyeSBjb21tb24gaW4gQysrIGNsYXNzIGxvb2t1cCB0YWJsZXMuIFRoaXMgYWxzbworICAgIC8vIGd1YXJhbnRlZXMgd2UgcHJvZHVjZSBhdCBsZWFzdCBvbmUgYnVja2V0IGZvciBhbiBlbXB0eSB0YWJsZS4KKyAgICAvLworICAgIC8vIEZJWE1FOiBUcnkgY29tcHV0aW5nIGEgcGVyZmVjdCBoYXNoIGZ1bmN0aW9uIGF0IHRoaXMgcG9pbnQuCisgICAgdW5zaWduZWQgVGFyZ2V0TnVtQnVja2V0cyA9CisgICAgICAgIE51bUVudHJpZXMgPD0gMiA/IDEgOiBOZXh0UG93ZXJPZjIoTnVtRW50cmllcyAqIDQgLyAzKTsKKyAgICBpZiAoVGFyZ2V0TnVtQnVja2V0cyAhPSBOdW1CdWNrZXRzKQorICAgICAgcmVzaXplKFRhcmdldE51bUJ1Y2tldHMpOworCisgICAgLy8gRW1pdCB0aGUgcGF5bG9hZCBvZiB0aGUgdGFibGUuCisgICAgZm9yIChvZmZzZXRfdHlwZSBJID0gMDsgSSA8IE51bUJ1Y2tldHM7ICsrSSkgeworICAgICAgQnVja2V0ICZCID0gQnVja2V0c1tJXTsKKyAgICAgIGlmICghQi5IZWFkKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgLy8gU3RvcmUgdGhlIG9mZnNldCBmb3IgdGhlIGRhdGEgb2YgdGhpcyBidWNrZXQuCisgICAgICBCLk9mZiA9IE91dC50ZWxsKCk7CisgICAgICBhc3NlcnQoQi5PZmYgJiYgIkNhbm5vdCB3cml0ZSBhIGJ1Y2tldCBhdCBvZmZzZXQgMC4gUGxlYXNlIGFkZCBwYWRkaW5nLiIpOworCisgICAgICAvLyBXcml0ZSBvdXQgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgYnVja2V0LgorICAgICAgTEUud3JpdGU8dWludDE2X3Q+KEIuTGVuZ3RoKTsKKyAgICAgIGFzc2VydChCLkxlbmd0aCAhPSAwICYmICJCdWNrZXQgaGFzIGEgaGVhZCBidXQgemVybyBsZW5ndGg/Iik7CisKKyAgICAgIC8vIFdyaXRlIG91dCB0aGUgZW50cmllcyBpbiB0aGUgYnVja2V0LgorICAgICAgZm9yIChJdGVtICpJID0gQi5IZWFkOyBJOyBJID0gSS0+TmV4dCkgeworICAgICAgICBMRS53cml0ZTx0eXBlbmFtZSBJbmZvOjpoYXNoX3ZhbHVlX3R5cGU+KEktPkhhc2gpOworICAgICAgICBjb25zdCBzdGQ6OnBhaXI8b2Zmc2V0X3R5cGUsIG9mZnNldF90eXBlPiAmTGVuID0KKyAgICAgICAgICAgIEluZm9PYmouRW1pdEtleURhdGFMZW5ndGgoT3V0LCBJLT5LZXksIEktPkRhdGEpOworI2lmZGVmIE5ERUJVRworICAgICAgICBJbmZvT2JqLkVtaXRLZXkoT3V0LCBJLT5LZXksIExlbi5maXJzdCk7CisgICAgICAgIEluZm9PYmouRW1pdERhdGEoT3V0LCBJLT5LZXksIEktPkRhdGEsIExlbi5zZWNvbmQpOworI2Vsc2UKKyAgICAgICAgLy8gSW4gYXNzZXJ0cyBtb2RlLCBjaGVjayB0aGF0IHRoZSB1c2VycyBsZW5ndGggbWF0Y2hlcyB0aGUgZGF0YSB0aGV5CisgICAgICAgIC8vIHdyb3RlLgorICAgICAgICB1aW50NjRfdCBLZXlTdGFydCA9IE91dC50ZWxsKCk7CisgICAgICAgIEluZm9PYmouRW1pdEtleShPdXQsIEktPktleSwgTGVuLmZpcnN0KTsKKyAgICAgICAgdWludDY0X3QgRGF0YVN0YXJ0ID0gT3V0LnRlbGwoKTsKKyAgICAgICAgSW5mb09iai5FbWl0RGF0YShPdXQsIEktPktleSwgSS0+RGF0YSwgTGVuLnNlY29uZCk7CisgICAgICAgIHVpbnQ2NF90IEVuZCA9IE91dC50ZWxsKCk7CisgICAgICAgIGFzc2VydChvZmZzZXRfdHlwZShEYXRhU3RhcnQgLSBLZXlTdGFydCkgPT0gTGVuLmZpcnN0ICYmCisgICAgICAgICAgICAgICAia2V5IGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBieXRlcyB3cml0dGVuIik7CisgICAgICAgIGFzc2VydChvZmZzZXRfdHlwZShFbmQgLSBEYXRhU3RhcnQpID09IExlbi5zZWNvbmQgJiYKKyAgICAgICAgICAgICAgICJkYXRhIGxlbmd0aCBkb2VzIG5vdCBtYXRjaCBieXRlcyB3cml0dGVuIik7CisjZW5kaWYKKyAgICAgIH0KKyAgICB9CisKKyAgICAvLyBQYWQgd2l0aCB6ZXJvcyBzbyB0aGF0IHdlIGNhbiBzdGFydCB0aGUgaGFzaHRhYmxlIGF0IGFuIGFsaWduZWQgYWRkcmVzcy4KKyAgICBvZmZzZXRfdHlwZSBUYWJsZU9mZiA9IE91dC50ZWxsKCk7CisgICAgdWludDY0X3QgTiA9IGxsdm06Ok9mZnNldFRvQWxpZ25tZW50KFRhYmxlT2ZmLCBhbGlnbm9mKG9mZnNldF90eXBlKSk7CisgICAgVGFibGVPZmYgKz0gTjsKKyAgICB3aGlsZSAoTi0tKQorICAgICAgTEUud3JpdGU8dWludDhfdD4oMCk7CisKKyAgICAvLyBFbWl0IHRoZSBoYXNodGFibGUgaXRzZWxmLgorICAgIExFLndyaXRlPG9mZnNldF90eXBlPihOdW1CdWNrZXRzKTsKKyAgICBMRS53cml0ZTxvZmZzZXRfdHlwZT4oTnVtRW50cmllcyk7CisgICAgZm9yIChvZmZzZXRfdHlwZSBJID0gMDsgSSA8IE51bUJ1Y2tldHM7ICsrSSkKKyAgICAgIExFLndyaXRlPG9mZnNldF90eXBlPihCdWNrZXRzW0ldLk9mZik7CisKKyAgICByZXR1cm4gVGFibGVPZmY7CisgIH0KKworICBPbkRpc2tDaGFpbmVkSGFzaFRhYmxlR2VuZXJhdG9yKCkgeworICAgIE51bUVudHJpZXMgPSAwOworICAgIE51bUJ1Y2tldHMgPSA2NDsKKyAgICAvLyBOb3RlIHRoYXQgd2UgZG8gbm90IG5lZWQgdG8gcnVuIHRoZSBjb25zdHJ1Y3RvcnMgb2YgdGhlIGluZGl2aWR1YWwKKyAgICAvLyBCdWNrZXQgb2JqZWN0cyBzaW5jZSAnY2FsbG9jJyByZXR1cm5zIGJ5dGVzIHRoYXQgYXJlIGFsbCAwLgorICAgIEJ1Y2tldHMgPSBzdGF0aWNfY2FzdDxCdWNrZXQgKj4oc2FmZV9jYWxsb2MoTnVtQnVja2V0cywgc2l6ZW9mKEJ1Y2tldCkpKTsKKyAgfQorCisgIH5PbkRpc2tDaGFpbmVkSGFzaFRhYmxlR2VuZXJhdG9yKCkgeyBzdGQ6OmZyZWUoQnVja2V0cyk7IH0KK307CisKKy8vLyBcYnJpZWYgUHJvdmlkZXMgbG9va3VwIG9uIGFuIG9uIGRpc2sgaGFzaCB0YWJsZS4KKy8vLworLy8vIFRoaXMgbmVlZHMgYW4gXGMgSW5mbyB0aGF0IGhhbmRsZXMgcmVhZGluZyB2YWx1ZXMgZnJvbSB0aGUgaGFzaCB0YWJsZSdzCisvLy8gcGF5bG9hZCBhbmQgY29tcHV0ZXMgdGhlIGhhc2ggZm9yIGEgZ2l2ZW4ga2V5LiBUaGlzIHNob3VsZCBwcm92aWRlIHRoZQorLy8vIGZvbGxvd2luZyBpbnRlcmZhY2U6CisvLy8KKy8vLyBcY29kZQorLy8vIGNsYXNzIEV4YW1wbGVMb29rdXBJbmZvIHsKKy8vLyBwdWJsaWM6CisvLy8gICB0eXBlZGVmIEV4YW1wbGVEYXRhIGRhdGFfdHlwZTsKKy8vLyAgIHR5cGVkZWYgRXhhbXBsZUludGVybmFsS2V5IGludGVybmFsX2tleV90eXBlOyAvLyBUaGUgc3RvcmVkIGtleSB0eXBlLgorLy8vICAgdHlwZWRlZiBFeGFtcGxlS2V5IGV4dGVybmFsX2tleV90eXBlOyAvLyBUaGUgdHlwZSB0byBwYXNzIHRvIGZpbmQoKS4KKy8vLyAgIHR5cGVkZWYgdWludDMyX3QgaGFzaF92YWx1ZV90eXBlOyAvLyBUaGUgdHlwZSB0aGUgaGFzaCBmdW5jdGlvbiByZXR1cm5zLgorLy8vICAgdHlwZWRlZiB1aW50MzJfdCBvZmZzZXRfdHlwZTsgLy8gVGhlIHR5cGUgZm9yIG9mZnNldHMgaW50byB0aGUgdGFibGUuCisvLy8KKy8vLyAgIC8vLyBDb21wYXJlIHR3byBrZXlzIGZvciBlcXVhbGl0eS4KKy8vLyAgIHN0YXRpYyBib29sIEVxdWFsS2V5KGludGVybmFsX2tleV90eXBlICZLZXkxLCBpbnRlcm5hbF9rZXlfdHlwZSAmS2V5Mik7CisvLy8gICAvLy8gQ2FsY3VsYXRlIHRoZSBoYXNoIGZvciB0aGUgZ2l2ZW4ga2V5LgorLy8vICAgc3RhdGljIGhhc2hfdmFsdWVfdHlwZSBDb21wdXRlSGFzaChpbnRlcm5hbF9rZXlfdHlwZSAmSUtleSk7CisvLy8gICAvLy8gVHJhbnNsYXRlIGZyb20gdGhlIHNlbWFudGljIHR5cGUgb2YgYSBrZXkgaW4gdGhlIGhhc2ggdGFibGUgdG8gdGhlCisvLy8gICAvLy8gdHlwZSB0aGF0IGlzIGFjdHVhbGx5IHN0b3JlZCBhbmQgdXNlZCBmb3IgaGFzaGluZyBhbmQgY29tcGFyaXNvbnMuCisvLy8gICAvLy8gVGhlIGludGVybmFsIGFuZCBleHRlcm5hbCB0eXBlcyBhcmUgb2Z0ZW4gdGhlIHNhbWUsIGluIHdoaWNoIGNhc2UgdGhpcworLy8vICAgLy8vIGNhbiBzaW1wbHkgcmV0dXJuIHRoZSBwYXNzZWQgaW4gdmFsdWUuCisvLy8gICBzdGF0aWMgY29uc3QgaW50ZXJuYWxfa2V5X3R5cGUgJkdldEludGVybmFsS2V5KGV4dGVybmFsX2tleV90eXBlICZFS2V5KTsKKy8vLyAgIC8vLyBSZWFkIHRoZSBrZXkgYW5kIGRhdGEgbGVuZ3RoIGZyb20gQnVmZmVyLCBsZWF2aW5nIGl0IHBvaW50aW5nIGF0IHRoZQorLy8vICAgLy8vIGZvbGxvd2luZyBieXRlLgorLy8vICAgc3RhdGljIHN0ZDo6cGFpcjxvZmZzZXRfdHlwZSwgb2Zmc2V0X3R5cGU+CisvLy8gICBSZWFkS2V5RGF0YUxlbmd0aChjb25zdCB1bnNpZ25lZCBjaGFyIComQnVmZmVyKTsKKy8vLyAgIC8vLyBSZWFkIHRoZSBrZXkgZnJvbSBCdWZmZXIsIGdpdmVuIHRoZSBLZXlMZW4gYXMgcmVwb3J0ZWQgZnJvbQorLy8vICAgLy8vIFJlYWRLZXlEYXRhTGVuZ3RoLgorLy8vICAgY29uc3QgaW50ZXJuYWxfa2V5X3R5cGUgJlJlYWRLZXkoY29uc3QgdW5zaWduZWQgY2hhciAqQnVmZmVyLAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3R5cGUgS2V5TGVuKTsKKy8vLyAgIC8vLyBSZWFkIHRoZSBkYXRhIGZvciBLZXkgZnJvbSBCdWZmZXIsIGdpdmVuIHRoZSBEYXRhTGVuIGFzIHJlcG9ydGVkIGZyb20KKy8vLyAgIC8vLyBSZWFkS2V5RGF0YUxlbmd0aC4KKy8vLyAgIGRhdGFfdHlwZSBSZWFkRGF0YShTdHJpbmdSZWYgS2V5LCBjb25zdCB1bnNpZ25lZCBjaGFyICpCdWZmZXIsCisvLy8gICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0X3R5cGUgRGF0YUxlbik7CisvLy8gfTsKKy8vLyBcZW5kY29kZQordGVtcGxhdGUgPHR5cGVuYW1lIEluZm8+IGNsYXNzIE9uRGlza0NoYWluZWRIYXNoVGFibGUgeworICBjb25zdCB0eXBlbmFtZSBJbmZvOjpvZmZzZXRfdHlwZSBOdW1CdWNrZXRzOworICBjb25zdCB0eXBlbmFtZSBJbmZvOjpvZmZzZXRfdHlwZSBOdW1FbnRyaWVzOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCBCdWNrZXRzOworICBjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCBCYXNlOworICBJbmZvIEluZm9PYmo7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBJbmZvIEluZm9UeXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEluZm86OmludGVybmFsX2tleV90eXBlIGludGVybmFsX2tleV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEluZm86OmV4dGVybmFsX2tleV90eXBlIGV4dGVybmFsX2tleV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIEluZm86OmRhdGFfdHlwZSBkYXRhX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgSW5mbzo6aGFzaF92YWx1ZV90eXBlIGhhc2hfdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBJbmZvOjpvZmZzZXRfdHlwZSBvZmZzZXRfdHlwZTsKKworICBPbkRpc2tDaGFpbmVkSGFzaFRhYmxlKG9mZnNldF90eXBlIE51bUJ1Y2tldHMsIG9mZnNldF90eXBlIE51bUVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqQnVja2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpCYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluZm8gJkluZm9PYmogPSBJbmZvKCkpCisgICAgICA6IE51bUJ1Y2tldHMoTnVtQnVja2V0cyksIE51bUVudHJpZXMoTnVtRW50cmllcyksIEJ1Y2tldHMoQnVja2V0cyksCisgICAgICAgIEJhc2UoQmFzZSksIEluZm9PYmooSW5mb09iaikgeworICAgIGFzc2VydCgocmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KEJ1Y2tldHMpICYgMHgzKSA9PSAwICYmCisgICAgICAgICAgICInYnVja2V0cycgbXVzdCBoYXZlIGEgNC1ieXRlIGFsaWdubWVudCIpOworICB9CisKKyAgLy8vIFJlYWQgdGhlIG51bWJlciBvZiBidWNrZXRzIGFuZCB0aGUgbnVtYmVyIG9mIGVudHJpZXMgZnJvbSBhIGhhc2ggdGFibGUKKyAgLy8vIHByb2R1Y2VkIGJ5IE9uRGlza0hhc2hUYWJsZUdlbmVyYXRvcjo6RW1pdCwgYW5kIGFkdmFuY2UgdGhlIEJ1Y2tldHMKKyAgLy8vIHBvaW50ZXIgcGFzdCB0aGVtLgorICBzdGF0aWMgc3RkOjpwYWlyPG9mZnNldF90eXBlLCBvZmZzZXRfdHlwZT4KKyAgcmVhZE51bUJ1Y2tldHNBbmRFbnRyaWVzKGNvbnN0IHVuc2lnbmVkIGNoYXIgKiZCdWNrZXRzKSB7CisgICAgYXNzZXJ0KChyZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oQnVja2V0cykgJiAweDMpID09IDAgJiYKKyAgICAgICAgICAgImJ1Y2tldHMgc2hvdWxkIGJlIDQtYnl0ZSBhbGlnbmVkLiIpOworICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OworICAgIG9mZnNldF90eXBlIE51bUJ1Y2tldHMgPQorICAgICAgICBlbmRpYW46OnJlYWROZXh0PG9mZnNldF90eXBlLCBsaXR0bGUsIGFsaWduZWQ+KEJ1Y2tldHMpOworICAgIG9mZnNldF90eXBlIE51bUVudHJpZXMgPQorICAgICAgICBlbmRpYW46OnJlYWROZXh0PG9mZnNldF90eXBlLCBsaXR0bGUsIGFsaWduZWQ+KEJ1Y2tldHMpOworICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihOdW1CdWNrZXRzLCBOdW1FbnRyaWVzKTsKKyAgfQorCisgIG9mZnNldF90eXBlIGdldE51bUJ1Y2tldHMoKSBjb25zdCB7IHJldHVybiBOdW1CdWNrZXRzOyB9CisgIG9mZnNldF90eXBlIGdldE51bUVudHJpZXMoKSBjb25zdCB7IHJldHVybiBOdW1FbnRyaWVzOyB9CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmdldEJhc2UoKSBjb25zdCB7IHJldHVybiBCYXNlOyB9CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmdldEJ1Y2tldHMoKSBjb25zdCB7IHJldHVybiBCdWNrZXRzOyB9CisKKyAgYm9vbCBpc0VtcHR5KCkgY29uc3QgeyByZXR1cm4gTnVtRW50cmllcyA9PSAwOyB9CisKKyAgY2xhc3MgaXRlcmF0b3IgeworICAgIGludGVybmFsX2tleV90eXBlIEtleTsKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCBEYXRhOworICAgIGNvbnN0IG9mZnNldF90eXBlIExlbjsKKyAgICBJbmZvICpJbmZvT2JqOworCisgIHB1YmxpYzoKKyAgICBpdGVyYXRvcigpIDogS2V5KCksIERhdGEobnVsbHB0ciksIExlbigwKSwgSW5mb09iaihudWxscHRyKSB7fQorICAgIGl0ZXJhdG9yKGNvbnN0IGludGVybmFsX2tleV90eXBlIEssIGNvbnN0IHVuc2lnbmVkIGNoYXIgKkQsIG9mZnNldF90eXBlIEwsCisgICAgICAgICAgICAgSW5mbyAqSW5mb09iaikKKyAgICAgICAgOiBLZXkoSyksIERhdGEoRCksIExlbihMKSwgSW5mb09iaihJbmZvT2JqKSB7fQorCisgICAgZGF0YV90eXBlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIEluZm9PYmotPlJlYWREYXRhKEtleSwgRGF0YSwgTGVuKTsgfQorCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZ2V0RGF0YVB0cigpIGNvbnN0IHsgcmV0dXJuIERhdGE7IH0KKyAgICBvZmZzZXRfdHlwZSBnZXREYXRhTGVuKCkgY29uc3QgeyByZXR1cm4gTGVuOyB9CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3IgJlgpIGNvbnN0IHsgcmV0dXJuIFguRGF0YSA9PSBEYXRhOyB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yICZYKSBjb25zdCB7IHJldHVybiBYLkRhdGEgIT0gRGF0YTsgfQorICB9OworCisgIC8vLyBcYnJpZWYgTG9vayB1cCB0aGUgc3RvcmVkIGRhdGEgZm9yIGEgcGFydGljdWxhciBrZXkuCisgIGl0ZXJhdG9yIGZpbmQoY29uc3QgZXh0ZXJuYWxfa2V5X3R5cGUgJkVLZXksIEluZm8gKkluZm9QdHIgPSBudWxscHRyKSB7CisgICAgY29uc3QgaW50ZXJuYWxfa2V5X3R5cGUgJklLZXkgPSBJbmZvT2JqLkdldEludGVybmFsS2V5KEVLZXkpOworICAgIGhhc2hfdmFsdWVfdHlwZSBLZXlIYXNoID0gSW5mb09iai5Db21wdXRlSGFzaChJS2V5KTsKKyAgICByZXR1cm4gZmluZF9oYXNoZWQoSUtleSwgS2V5SGFzaCwgSW5mb1B0cik7CisgIH0KKworICAvLy8gXGJyaWVmIExvb2sgdXAgdGhlIHN0b3JlZCBkYXRhIGZvciBhIHBhcnRpY3VsYXIga2V5IHdpdGggYSBrbm93biBoYXNoLgorICBpdGVyYXRvciBmaW5kX2hhc2hlZChjb25zdCBpbnRlcm5hbF9rZXlfdHlwZSAmSUtleSwgaGFzaF92YWx1ZV90eXBlIEtleUhhc2gsCisgICAgICAgICAgICAgICAgICAgICAgIEluZm8gKkluZm9QdHIgPSBudWxscHRyKSB7CisgICAgdXNpbmcgbmFtZXNwYWNlIGxsdm06OnN1cHBvcnQ7CisKKyAgICBpZiAoIUluZm9QdHIpCisgICAgICBJbmZvUHRyID0gJkluZm9PYmo7CisKKyAgICAvLyBFYWNoIGJ1Y2tldCBpcyBqdXN0IGFuIG9mZnNldCBpbnRvIHRoZSBoYXNoIHRhYmxlIGZpbGUuCisgICAgb2Zmc2V0X3R5cGUgSWR4ID0gS2V5SGFzaCAmIChOdW1CdWNrZXRzIC0gMSk7CisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqQnVja2V0ID0gQnVja2V0cyArIHNpemVvZihvZmZzZXRfdHlwZSkgKiBJZHg7CisKKyAgICBvZmZzZXRfdHlwZSBPZmZzZXQgPSBlbmRpYW46OnJlYWROZXh0PG9mZnNldF90eXBlLCBsaXR0bGUsIGFsaWduZWQ+KEJ1Y2tldCk7CisgICAgaWYgKE9mZnNldCA9PSAwKQorICAgICAgcmV0dXJuIGl0ZXJhdG9yKCk7IC8vIEVtcHR5IGJ1Y2tldC4KKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpJdGVtcyA9IEJhc2UgKyBPZmZzZXQ7CisKKyAgICAvLyAnSXRlbXMnIHN0YXJ0cyB3aXRoIGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZQorICAgIC8vIG51bWJlciBvZiBpdGVtcyBpbiB0aGlzIGJ1Y2tldC4KKyAgICB1bnNpZ25lZCBMZW4gPSBlbmRpYW46OnJlYWROZXh0PHVpbnQxNl90LCBsaXR0bGUsIHVuYWxpZ25lZD4oSXRlbXMpOworCisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IExlbjsgKytpKSB7CisgICAgICAvLyBSZWFkIHRoZSBoYXNoLgorICAgICAgaGFzaF92YWx1ZV90eXBlIEl0ZW1IYXNoID0KKyAgICAgICAgICBlbmRpYW46OnJlYWROZXh0PGhhc2hfdmFsdWVfdHlwZSwgbGl0dGxlLCB1bmFsaWduZWQ+KEl0ZW1zKTsKKworICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBsZW5ndGggb2YgdGhlIGtleSBhbmQgdGhlIGRhdGEuCisgICAgICBjb25zdCBzdGQ6OnBhaXI8b2Zmc2V0X3R5cGUsIG9mZnNldF90eXBlPiAmTCA9CisgICAgICAgICAgSW5mbzo6UmVhZEtleURhdGFMZW5ndGgoSXRlbXMpOworICAgICAgb2Zmc2V0X3R5cGUgSXRlbUxlbiA9IEwuZmlyc3QgKyBMLnNlY29uZDsKKworICAgICAgLy8gQ29tcGFyZSB0aGUgaGFzaGVzLiAgSWYgdGhleSBhcmUgbm90IHRoZSBzYW1lLCBza2lwIHRoZSBlbnRyeSBlbnRpcmVseS4KKyAgICAgIGlmIChJdGVtSGFzaCAhPSBLZXlIYXNoKSB7CisgICAgICAgIEl0ZW1zICs9IEl0ZW1MZW47CisgICAgICAgIGNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvLyBSZWFkIHRoZSBrZXkuCisgICAgICBjb25zdCBpbnRlcm5hbF9rZXlfdHlwZSAmWCA9CisgICAgICAgICAgSW5mb1B0ci0+UmVhZEtleSgoY29uc3QgdW5zaWduZWQgY2hhciAqY29uc3QpSXRlbXMsIEwuZmlyc3QpOworCisgICAgICAvLyBJZiB0aGUga2V5IGRvZXNuJ3QgbWF0Y2gganVzdCBza2lwIHJlYWRpbmcgdGhlIHZhbHVlLgorICAgICAgaWYgKCFJbmZvUHRyLT5FcXVhbEtleShYLCBJS2V5KSkgeworICAgICAgICBJdGVtcyArPSBJdGVtTGVuOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gVGhlIGtleSBtYXRjaGVzIQorICAgICAgcmV0dXJuIGl0ZXJhdG9yKFgsIEl0ZW1zICsgTC5maXJzdCwgTC5zZWNvbmQsIEluZm9QdHIpOworICAgIH0KKworICAgIHJldHVybiBpdGVyYXRvcigpOworICB9CisKKyAgaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gaXRlcmF0b3IoKTsgfQorCisgIEluZm8gJmdldEluZm9PYmooKSB7IHJldHVybiBJbmZvT2JqOyB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgdGhlIGhhc2ggdGFibGUuCisgIC8vLworICAvLy8gXHBhcmFtIEJ1Y2tldHMgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgaGFzaCB0YWJsZSBpdHNlbGYsIHdoaWNoIGZvbGxvd3MKKyAgLy8vIHRoZSBwYXlsb2FkIG9mIGVudGlyZSBzdHJ1Y3R1cmUuIFRoaXMgaXMgdGhlIHZhbHVlIHJldHVybmVkIGJ5CisgIC8vLyBPbkRpc2tIYXNoVGFibGVHZW5lcmF0b3I6OkVtaXQuCisgIC8vLworICAvLy8gXHBhcmFtIEJhc2UgaXMgdGhlIHBvaW50IGZyb20gd2hpY2ggYWxsIG9mZnNldHMgaW50byB0aGUgc3RydWN0dXJlIGFyZQorICAvLy8gYmFzZWQuIFRoaXMgaXMgb2Zmc2V0IDAgaW4gdGhlIHN0cmVhbSB0aGF0IHdhcyB1c2VkIHdoZW4gRW1pdHRpbmcgdGhlCisgIC8vLyB0YWJsZS4KKyAgc3RhdGljIE9uRGlza0NoYWluZWRIYXNoVGFibGUgKkNyZWF0ZShjb25zdCB1bnNpZ25lZCBjaGFyICpCdWNrZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnN0IEJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5mbyAmSW5mb09iaiA9IEluZm8oKSkgeworICAgIGFzc2VydChCdWNrZXRzID4gQmFzZSk7CisgICAgYXV0byBOdW1CdWNrZXRzQW5kRW50cmllcyA9IHJlYWROdW1CdWNrZXRzQW5kRW50cmllcyhCdWNrZXRzKTsKKyAgICByZXR1cm4gbmV3IE9uRGlza0NoYWluZWRIYXNoVGFibGU8SW5mbz4oTnVtQnVja2V0c0FuZEVudHJpZXMuZmlyc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE51bUJ1Y2tldHNBbmRFbnRyaWVzLnNlY29uZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVja2V0cywgQmFzZSwgSW5mb09iaik7CisgIH0KK307CisKKy8vLyBcYnJpZWYgUHJvdmlkZXMgbG9va3VwIGFuZCBpdGVyYXRpb24gb3ZlciBhbiBvbiBkaXNrIGhhc2ggdGFibGUuCisvLy8KKy8vLyBcY29weWRldGFpbHMgbGx2bTo6T25EaXNrQ2hhaW5lZEhhc2hUYWJsZQordGVtcGxhdGUgPHR5cGVuYW1lIEluZm8+CitjbGFzcyBPbkRpc2tJdGVyYWJsZUNoYWluZWRIYXNoVGFibGUgOiBwdWJsaWMgT25EaXNrQ2hhaW5lZEhhc2hUYWJsZTxJbmZvPiB7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKlBheWxvYWQ7CisKK3B1YmxpYzoKKyAgdHlwZWRlZiBPbkRpc2tDaGFpbmVkSGFzaFRhYmxlPEluZm8+ICAgICAgICAgIGJhc2VfdHlwZTsKKyAgdHlwZWRlZiB0eXBlbmFtZSBiYXNlX3R5cGU6OmludGVybmFsX2tleV90eXBlIGludGVybmFsX2tleV90eXBlOworICB0eXBlZGVmIHR5cGVuYW1lIGJhc2VfdHlwZTo6ZXh0ZXJuYWxfa2V5X3R5cGUgZXh0ZXJuYWxfa2V5X3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpkYXRhX3R5cGUgICAgICAgICBkYXRhX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpoYXNoX3ZhbHVlX3R5cGUgICBoYXNoX3ZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdHlwZW5hbWUgYmFzZV90eXBlOjpvZmZzZXRfdHlwZSAgICAgICBvZmZzZXRfdHlwZTsKKworcHJpdmF0ZToKKyAgLy8vIFxicmllZiBJdGVyYXRlcyBvdmVyIGFsbCBvZiB0aGUga2V5cyBpbiB0aGUgdGFibGUuCisgIGNsYXNzIGl0ZXJhdG9yX2Jhc2UgeworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKlB0cjsKKyAgICBvZmZzZXRfdHlwZSBOdW1JdGVtc0luQnVja2V0TGVmdDsKKyAgICBvZmZzZXRfdHlwZSBOdW1FbnRyaWVzTGVmdDsKKworICBwdWJsaWM6CisgICAgdHlwZWRlZiBleHRlcm5hbF9rZXlfdHlwZSB2YWx1ZV90eXBlOworCisgICAgaXRlcmF0b3JfYmFzZShjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCBQdHIsIG9mZnNldF90eXBlIE51bUVudHJpZXMpCisgICAgICAgIDogUHRyKFB0ciksIE51bUl0ZW1zSW5CdWNrZXRMZWZ0KDApLCBOdW1FbnRyaWVzTGVmdChOdW1FbnRyaWVzKSB7fQorICAgIGl0ZXJhdG9yX2Jhc2UoKQorICAgICAgICA6IFB0cihudWxscHRyKSwgTnVtSXRlbXNJbkJ1Y2tldExlZnQoMCksIE51bUVudHJpZXNMZWZ0KDApIHt9CisKKyAgICBmcmllbmQgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yX2Jhc2UgJlgsIGNvbnN0IGl0ZXJhdG9yX2Jhc2UgJlkpIHsKKyAgICAgIHJldHVybiBYLk51bUVudHJpZXNMZWZ0ID09IFkuTnVtRW50cmllc0xlZnQ7CisgICAgfQorICAgIGZyaWVuZCBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3JfYmFzZSAmWCwgY29uc3QgaXRlcmF0b3JfYmFzZSAmWSkgeworICAgICAgcmV0dXJuIFguTnVtRW50cmllc0xlZnQgIT0gWS5OdW1FbnRyaWVzTGVmdDsKKyAgICB9CisKKyAgICAvLy8gTW92ZSB0byB0aGUgbmV4dCBpdGVtLgorICAgIHZvaWQgYWR2YW5jZSgpIHsKKyAgICAgIHVzaW5nIG5hbWVzcGFjZSBsbHZtOjpzdXBwb3J0OworICAgICAgaWYgKCFOdW1JdGVtc0luQnVja2V0TGVmdCkgeworICAgICAgICAvLyAnSXRlbXMnIHN0YXJ0cyB3aXRoIGEgMTYtYml0IHVuc2lnbmVkIGludGVnZXIgcmVwcmVzZW50aW5nIHRoZQorICAgICAgICAvLyBudW1iZXIgb2YgaXRlbXMgaW4gdGhpcyBidWNrZXQuCisgICAgICAgIE51bUl0ZW1zSW5CdWNrZXRMZWZ0ID0KKyAgICAgICAgICAgIGVuZGlhbjo6cmVhZE5leHQ8dWludDE2X3QsIGxpdHRsZSwgdW5hbGlnbmVkPihQdHIpOworICAgICAgfQorICAgICAgUHRyICs9IHNpemVvZihoYXNoX3ZhbHVlX3R5cGUpOyAvLyBTa2lwIHRoZSBoYXNoLgorICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBsZW5ndGggb2YgdGhlIGtleSBhbmQgdGhlIGRhdGEuCisgICAgICBjb25zdCBzdGQ6OnBhaXI8b2Zmc2V0X3R5cGUsIG9mZnNldF90eXBlPiAmTCA9CisgICAgICAgICAgSW5mbzo6UmVhZEtleURhdGFMZW5ndGgoUHRyKTsKKyAgICAgIFB0ciArPSBMLmZpcnN0ICsgTC5zZWNvbmQ7CisgICAgICBhc3NlcnQoTnVtSXRlbXNJbkJ1Y2tldExlZnQpOworICAgICAgLS1OdW1JdGVtc0luQnVja2V0TGVmdDsKKyAgICAgIGFzc2VydChOdW1FbnRyaWVzTGVmdCk7CisgICAgICAtLU51bUVudHJpZXNMZWZ0OworICAgIH0KKworICAgIC8vLyBHZXQgdGhlIHN0YXJ0IG9mIHRoZSBpdGVtIGFzIHdyaXR0ZW4gYnkgdGhlIHRyYWl0IChhZnRlciB0aGUgaGFzaCBhbmQKKyAgICAvLy8gaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBrZXkgYW5kIHZhbHVlIGxlbmd0aCkuCisgICAgY29uc3QgdW5zaWduZWQgY2hhciAqZ2V0SXRlbSgpIGNvbnN0IHsKKyAgICAgIHJldHVybiBQdHIgKyAoTnVtSXRlbXNJbkJ1Y2tldExlZnQgPyAwIDogMikgKyBzaXplb2YoaGFzaF92YWx1ZV90eXBlKTsKKyAgICB9CisgIH07CisKK3B1YmxpYzoKKyAgT25EaXNrSXRlcmFibGVDaGFpbmVkSGFzaFRhYmxlKG9mZnNldF90eXBlIE51bUJ1Y2tldHMsIG9mZnNldF90eXBlIE51bUVudHJpZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyICpCdWNrZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciAqUGF5bG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBJbmZvICZJbmZvT2JqID0gSW5mbygpKQorICAgICAgOiBiYXNlX3R5cGUoTnVtQnVja2V0cywgTnVtRW50cmllcywgQnVja2V0cywgQmFzZSwgSW5mb09iaiksCisgICAgICAgIFBheWxvYWQoUGF5bG9hZCkge30KKworICAvLy8gXGJyaWVmIEl0ZXJhdGVzIG92ZXIgYWxsIG9mIHRoZSBrZXlzIGluIHRoZSB0YWJsZS4KKyAgY2xhc3Mga2V5X2l0ZXJhdG9yIDogcHVibGljIGl0ZXJhdG9yX2Jhc2UgeworICAgIEluZm8gKkluZm9PYmo7CisKKyAgcHVibGljOgorICAgIHR5cGVkZWYgZXh0ZXJuYWxfa2V5X3R5cGUgdmFsdWVfdHlwZTsKKworICAgIGtleV9pdGVyYXRvcihjb25zdCB1bnNpZ25lZCBjaGFyICpjb25zdCBQdHIsIG9mZnNldF90eXBlIE51bUVudHJpZXMsCisgICAgICAgICAgICAgICAgIEluZm8gKkluZm9PYmopCisgICAgICAgIDogaXRlcmF0b3JfYmFzZShQdHIsIE51bUVudHJpZXMpLCBJbmZvT2JqKEluZm9PYmopIHt9CisgICAga2V5X2l0ZXJhdG9yKCkgOiBpdGVyYXRvcl9iYXNlKCksIEluZm9PYmooKSB7fQorCisgICAga2V5X2l0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgICAgdGhpcy0+YWR2YW5jZSgpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBrZXlfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgLy8gUG9zdGluY3JlbWVudAorICAgICAga2V5X2l0ZXJhdG9yIHRtcCA9ICp0aGlzOworICAgICAgKysqdGhpczsKKyAgICAgIHJldHVybiB0bXA7CisgICAgfQorCisgICAgaW50ZXJuYWxfa2V5X3R5cGUgZ2V0SW50ZXJuYWxLZXkoKSBjb25zdCB7CisgICAgICBhdXRvICpMb2NhbFB0ciA9IHRoaXMtPmdldEl0ZW0oKTsKKworICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBsZW5ndGggb2YgdGhlIGtleSBhbmQgdGhlIGRhdGEuCisgICAgICBhdXRvIEwgPSBJbmZvOjpSZWFkS2V5RGF0YUxlbmd0aChMb2NhbFB0cik7CisKKyAgICAgIC8vIFJlYWQgdGhlIGtleS4KKyAgICAgIHJldHVybiBJbmZvT2JqLT5SZWFkS2V5KExvY2FsUHRyLCBMLmZpcnN0KTsKKyAgICB9CisKKyAgICB2YWx1ZV90eXBlIG9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBJbmZvT2JqLT5HZXRFeHRlcm5hbEtleShnZXRJbnRlcm5hbEtleSgpKTsKKyAgICB9CisgIH07CisKKyAga2V5X2l0ZXJhdG9yIGtleV9iZWdpbigpIHsKKyAgICByZXR1cm4ga2V5X2l0ZXJhdG9yKFBheWxvYWQsIHRoaXMtPmdldE51bUVudHJpZXMoKSwgJnRoaXMtPmdldEluZm9PYmooKSk7CisgIH0KKyAga2V5X2l0ZXJhdG9yIGtleV9lbmQoKSB7IHJldHVybiBrZXlfaXRlcmF0b3IoKTsgfQorCisgIGl0ZXJhdG9yX3JhbmdlPGtleV9pdGVyYXRvcj4ga2V5cygpIHsKKyAgICByZXR1cm4gbWFrZV9yYW5nZShrZXlfYmVnaW4oKSwga2V5X2VuZCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgSXRlcmF0ZXMgb3ZlciBhbGwgdGhlIGVudHJpZXMgaW4gdGhlIHRhYmxlLCByZXR1cm5pbmcgdGhlIGRhdGEuCisgIGNsYXNzIGRhdGFfaXRlcmF0b3IgOiBwdWJsaWMgaXRlcmF0b3JfYmFzZSB7CisgICAgSW5mbyAqSW5mb09iajsKKworICBwdWJsaWM6CisgICAgdHlwZWRlZiBkYXRhX3R5cGUgdmFsdWVfdHlwZTsKKworICAgIGRhdGFfaXRlcmF0b3IoY29uc3QgdW5zaWduZWQgY2hhciAqY29uc3QgUHRyLCBvZmZzZXRfdHlwZSBOdW1FbnRyaWVzLAorICAgICAgICAgICAgICAgICAgSW5mbyAqSW5mb09iaikKKyAgICAgICAgOiBpdGVyYXRvcl9iYXNlKFB0ciwgTnVtRW50cmllcyksIEluZm9PYmooSW5mb09iaikge30KKyAgICBkYXRhX2l0ZXJhdG9yKCkgOiBpdGVyYXRvcl9iYXNlKCksIEluZm9PYmooKSB7fQorCisgICAgZGF0YV9pdGVyYXRvciAmb3BlcmF0b3IrKygpIHsgLy8gUHJlaW5jcmVtZW50CisgICAgICB0aGlzLT5hZHZhbmNlKCk7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIGRhdGFfaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgLy8gUG9zdGluY3JlbWVudAorICAgICAgZGF0YV9pdGVyYXRvciB0bXAgPSAqdGhpczsKKyAgICAgICsrKnRoaXM7CisgICAgICByZXR1cm4gdG1wOworICAgIH0KKworICAgIHZhbHVlX3R5cGUgb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgYXV0byAqTG9jYWxQdHIgPSB0aGlzLT5nZXRJdGVtKCk7CisKKyAgICAgIC8vIERldGVybWluZSB0aGUgbGVuZ3RoIG9mIHRoZSBrZXkgYW5kIHRoZSBkYXRhLgorICAgICAgYXV0byBMID0gSW5mbzo6UmVhZEtleURhdGFMZW5ndGgoTG9jYWxQdHIpOworCisgICAgICAvLyBSZWFkIHRoZSBrZXkuCisgICAgICBjb25zdCBpbnRlcm5hbF9rZXlfdHlwZSAmS2V5ID0gSW5mb09iai0+UmVhZEtleShMb2NhbFB0ciwgTC5maXJzdCk7CisgICAgICByZXR1cm4gSW5mb09iai0+UmVhZERhdGEoS2V5LCBMb2NhbFB0ciArIEwuZmlyc3QsIEwuc2Vjb25kKTsKKyAgICB9CisgIH07CisKKyAgZGF0YV9pdGVyYXRvciBkYXRhX2JlZ2luKCkgeworICAgIHJldHVybiBkYXRhX2l0ZXJhdG9yKFBheWxvYWQsIHRoaXMtPmdldE51bUVudHJpZXMoKSwgJnRoaXMtPmdldEluZm9PYmooKSk7CisgIH0KKyAgZGF0YV9pdGVyYXRvciBkYXRhX2VuZCgpIHsgcmV0dXJuIGRhdGFfaXRlcmF0b3IoKTsgfQorCisgIGl0ZXJhdG9yX3JhbmdlPGRhdGFfaXRlcmF0b3I+IGRhdGEoKSB7CisgICAgcmV0dXJuIG1ha2VfcmFuZ2UoZGF0YV9iZWdpbigpLCBkYXRhX2VuZCgpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgQ3JlYXRlIHRoZSBoYXNoIHRhYmxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBCdWNrZXRzIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGhhc2ggdGFibGUgaXRzZWxmLCB3aGljaCBmb2xsb3dzCisgIC8vLyB0aGUgcGF5bG9hZCBvZiBlbnRpcmUgc3RydWN0dXJlLiBUaGlzIGlzIHRoZSB2YWx1ZSByZXR1cm5lZCBieQorICAvLy8gT25EaXNrSGFzaFRhYmxlR2VuZXJhdG9yOjpFbWl0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBQYXlsb2FkIGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGRhdGEgY29udGFpbmVkIGluIHRoZSB0YWJsZS4gIFRoaXMKKyAgLy8vIGlzIEJhc2UgcGx1cyBhbnkgcGFkZGluZyBvciBoZWFkZXIgZGF0YSB0aGF0IHdhcyBzdG9yZWQsIGllLCB0aGUgb2Zmc2V0CisgIC8vLyB0aGF0IHRoZSBzdHJlYW0gd2FzIGF0IHdoZW4gY2FsbGluZyBFbWl0LgorICAvLy8KKyAgLy8vIFxwYXJhbSBCYXNlIGlzIHRoZSBwb2ludCBmcm9tIHdoaWNoIGFsbCBvZmZzZXRzIGludG8gdGhlIHN0cnVjdHVyZSBhcmUKKyAgLy8vIGJhc2VkLiBUaGlzIGlzIG9mZnNldCAwIGluIHRoZSBzdHJlYW0gdGhhdCB3YXMgdXNlZCB3aGVuIEVtaXR0aW5nIHRoZQorICAvLy8gdGFibGUuCisgIHN0YXRpYyBPbkRpc2tJdGVyYWJsZUNoYWluZWRIYXNoVGFibGUgKgorICBDcmVhdGUoY29uc3QgdW5zaWduZWQgY2hhciAqQnVja2V0cywgY29uc3QgdW5zaWduZWQgY2hhciAqY29uc3QgUGF5bG9hZCwKKyAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmNvbnN0IEJhc2UsIGNvbnN0IEluZm8gJkluZm9PYmogPSBJbmZvKCkpIHsKKyAgICBhc3NlcnQoQnVja2V0cyA+IEJhc2UpOworICAgIGF1dG8gTnVtQnVja2V0c0FuZEVudHJpZXMgPQorICAgICAgICBPbkRpc2tJdGVyYWJsZUNoYWluZWRIYXNoVGFibGU8SW5mbz46OnJlYWROdW1CdWNrZXRzQW5kRW50cmllcyhCdWNrZXRzKTsKKyAgICByZXR1cm4gbmV3IE9uRGlza0l0ZXJhYmxlQ2hhaW5lZEhhc2hUYWJsZTxJbmZvPigKKyAgICAgICAgTnVtQnVja2V0c0FuZEVudHJpZXMuZmlyc3QsIE51bUJ1Y2tldHNBbmRFbnRyaWVzLnNlY29uZCwKKyAgICAgICAgQnVja2V0cywgUGF5bG9hZCwgQmFzZSwgSW5mb09iaik7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L09wdGlvbnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9PcHRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTAxOTgwNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9PcHRpb25zLmgKQEAgLTAsMCArMSwxMjAgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvT3B0aW9ucy5oIC0gRGVidWcgb3B0aW9ucyBzdXBwb3J0IC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgZGVjbGFyZXMgaGVscGVyIG9iamVjdHMgZm9yIGRlZmluaW5nIGRlYnVnIG9wdGlvbnMgdGhhdCBjYW4gYmUKKy8vLyBjb25maWd1cmVkIHZpYSB0aGUgY29tbWFuZCBsaW5lLiBUaGUgbmV3IEFQSSBjdXJyZW50bHkgYnVpbGRzIG9uIHRoZSBjbDo6b3B0CisvLy8gQVBJLCBidXQgZG9lcyBub3QgcmVxdWlyZSB0aGUgdXNlIG9mIHN0YXRpYyBnbG9iYWxzLgorLy8vCisvLy8gV2l0aCB0aGlzIEFQSSBvcHRpb25zIGFyZSByZWdpc3RlcmVkIGR1cmluZyBpbml0aWFsaXphdGlvbi4gRm9yIHBhc3NlcywgdGhpcworLy8vIGhhcHBlbnMgZHVyaW5nIHBhc3MgaW5pdGlhbGl6YXRpb24uIFBhc3NlcyB3aXRoIG9wdGlvbnMgd2lsbCBjYWxsIGEgc3RhdGljCisvLy8gcmVnaXN0ZXJPcHRpb25zIG1ldGhvZCBkdXJpbmcgaW5pdGlhbGl6YXRpb24gdGhhdCByZWdpc3RlcnMgb3B0aW9ucyB3aXRoIHRoZQorLy8vIE9wdGlvblJlZ2lzdHJ5LiBBbiBleGFtcGxlIGltcGxlbWVudGF0aW9uIG9mIHJlZ2lzdGVyT3B0aW9ucyBpczoKKy8vLworLy8vIHN0YXRpYyB2b2lkIHJlZ2lzdGVyT3B0aW9ucygpIHsKKy8vLyAgIE9wdGlvblJlZ2lzdHJ5OjpyZWdpc3Rlck9wdGlvbjxib29sLCBTY2FsYXJpemVyLAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU2NhbGFyaXplcjo6U2NhbGFyaXplTG9hZFN0b3JlPigKKy8vLyAgICAgICAic2NhbGFyaXplLWxvYWQtc3RvcmUiLAorLy8vICAgICAgICJBbGxvdyB0aGUgc2NhbGFyaXplciBwYXNzIHRvIHNjYWxhcml6ZSBsb2FkcyBhbmQgc3RvcmUiLCBmYWxzZSk7CisvLy8gfQorLy8vCisvLy8gV2hlbiByZWFkaW5nIGRhdGEgZm9yIG9wdGlvbnMgdGhlIGludGVyZmFjZSBpcyB2aWEgdGhlIExMVk1Db250ZXh0LiBPcHRpb24KKy8vLyBkYXRhIGZvciBwYXNzZXMgc2hvdWxkIGJlIHJlYWQgZnJvbSB0aGUgY29udGV4dCBkdXJpbmcgZG9Jbml0aWFsaXphdGlvbi4gQW4KKy8vLyBleGFtcGxlIG9mIHJlYWRpbmcgdGhlIGFib3ZlIG9wdGlvbiB3b3VsZCBiZToKKy8vLworLy8vIFNjYWxhcml6ZUxvYWRTdG9yZSA9CisvLy8gICBNLmdldENvbnRleHQoKS5nZXRPcHRpb248Ym9vbCwKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJpemVyLAorLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICZTY2FsYXJpemVyOjpTY2FsYXJpemVMb2FkU3RvcmU+KCk7CisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX09QVElPTlNfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfT1BUSU9OU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSBkZXRhaWwgeworCisvLyBPcHRpb25zIGFyZSBrZXllZCBvZiB0aGUgdW5pcXVlIGFkZHJlc3Mgb2YgYSBzdGF0aWMgY2hhcmFjdGVyIHN5bnRoZXNpemVkCisvLyBiYXNlZCBvbiB0ZW1wbGF0ZSBhcmd1bWVudHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsVCwgdHlwZW5hbWUgQmFzZSwgVmFsVChCYXNlOjoqTWVtKT4gY2xhc3MgT3B0aW9uS2V5IHsKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7Cit9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsVCwgdHlwZW5hbWUgQmFzZSwgVmFsVChCYXNlOjoqTWVtKT4KK2NoYXIgT3B0aW9uS2V5PFZhbFQsIEJhc2UsIE1lbT46OklEID0gMDsKKworfSAvLyBuYW1lc3BhY2UgZGV0YWlsCisKKy8vLyBcYnJpZWYgU2luZ2xldG9uIGNsYXNzIHVzZWQgdG8gcmVnaXN0ZXIgZGVidWcgb3B0aW9ucy4KKy8vLworLy8vIFRoZSBPcHRpb25SZWdpc3RyeSBpcyByZXNwb25zaWJsZSBmb3IgbWFuYWdpbmcgbGlmZXRpbWVzIG9mIHRoZSBvcHRpb25zIGFuZAorLy8vIHByb3ZpZGVzIGludGVyZmFjZXMgZm9yIG9wdGlvbiByZWdpc3RyYXRpb24gYW5kIHJlYWRpbmcgdmFsdWVzIGZyb20gb3B0aW9ucy4KKy8vLyBUaGlzIG9iamVjdCBpcyBhIHNpbmdsZXRvbiwgb25seSBvbmUgaW5zdGFuY2Ugc2hvdWxkIGV2ZXIgZXhpc3Qgc28gdGhhdCBhbGwKKy8vLyBvcHRpb25zIGFyZSByZWdpc3RlcmVkIGluIHRoZSBzYW1lIHBsYWNlLgorY2xhc3MgT3B0aW9uUmVnaXN0cnkgeworcHJpdmF0ZToKKyAgRGVuc2VNYXA8dm9pZCAqLCBjbDo6T3B0aW9uICo+IE9wdGlvbnM7CisKKyAgLy8vIFxicmllZiBBZGRzIGEgY2w6Ok9wdGlvbiB0byB0aGUgcmVnaXN0cnkuCisgIC8vLworICAvLy8gXHBhcmFtIEtleSB1bmlxdWUga2V5IGZvciBvcHRpb24KKyAgLy8vIFxwYXJhbSBPIG9wdGlvbiB0byBtYXAgdG8gXHAgS2V5CisgIC8vLworICAvLy8gQWxsb2NhdGVkIGNsOjpPcHRpb25zIGFyZSBvd25lZCBieSB0aGUgT3B0aW9uUmVnaXN0cnkgYW5kIGFyZSBkZWFsbG9jYXRlZAorICAvLy8gb24gZGVzdHJ1Y3Rpb24gb3IgcmVtb3ZhbAorICB2b2lkIGFkZE9wdGlvbih2b2lkICpLZXksIGNsOjpPcHRpb24gKk8pOworCitwdWJsaWM6CisgIH5PcHRpb25SZWdpc3RyeSgpOworICBPcHRpb25SZWdpc3RyeSgpIHt9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBzaW5nbGV0b24gaW5zdGFuY2UuCisgIHN0YXRpYyBPcHRpb25SZWdpc3RyeSAmaW5zdGFuY2UoKTsKKworICAvLy8gXGJyaWVmIFJlZ2lzdGVycyBhbiBvcHRpb24gd2l0aCB0aGUgT3B0aW9uUmVnaXN0cnkgc2luZ2xldG9uLgorICAvLy8KKyAgLy8vIFx0cGFyYW0gVmFsVCB0eXBlIG9mIHRoZSBvcHRpb24ncyBkYXRhCisgIC8vLyBcdHBhcmFtIEJhc2UgY2xhc3MgdXNlZCB0byBrZXkgdGhlIG9wdGlvbgorICAvLy8gXHRwYXJhbSBNZW0gbWVtYmVyIG9mIFxwIEJhc2UgdXNlZCBmb3Iga2V5aW5nIHRoZSBvcHRpb24KKyAgLy8vCisgIC8vLyBPcHRpb25zIGFyZSBrZXllZCBvZmYgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgdG8gZ2VuZXJhdGUgdW5pcXVlIHN0YXRpYworICAvLy8gY2hhcmFjdGVycy4gVGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMgYXJlICgxKSB0aGUgdHlwZSBvZiB0aGUgZGF0YSB0aGUKKyAgLy8vIG9wdGlvbiBzdG9yZXMgKFxwIFZhbFQpLCB0aGUgY2xhc3MgdGhhdCB3aWxsIHJlYWQgdGhlIG9wdGlvbiAoXHAgQmFzZSksCisgIC8vLyBhbmQgdGhlIG1lbWJlciB0aGF0IHRoZSBjbGFzcyB3aWxsIHN0b3JlIHRoZSBkYXRhIGludG8gKFxwIE1lbSkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBWYWxULCB0eXBlbmFtZSBCYXNlLCBWYWxUKEJhc2U6OipNZW0pPgorICBzdGF0aWMgdm9pZCByZWdpc3Rlck9wdGlvbihTdHJpbmdSZWYgQXJnU3RyLCBTdHJpbmdSZWYgRGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsVCAmSW5pdFZhbHVlKSB7CisgICAgY2w6Om9wdDxWYWxUPiAqT3B0aW9uID0gbmV3IGNsOjpvcHQ8VmFsVD4oQXJnU3RyLCBjbDo6ZGVzYyhEZXNjKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbDo6SGlkZGVuLCBjbDo6aW5pdChJbml0VmFsdWUpKTsKKyAgICBpbnN0YW5jZSgpLmFkZE9wdGlvbigmZGV0YWlsOjpPcHRpb25LZXk8VmFsVCwgQmFzZSwgTWVtPjo6SUQsIE9wdGlvbik7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybnMgdGhlIHZhbHVlIG9mIHRoZSBvcHRpb24uCisgIC8vLworICAvLy8gXHRwYXJhbSBWYWxUIHR5cGUgb2YgdGhlIG9wdGlvbidzIGRhdGEKKyAgLy8vIFx0cGFyYW0gQmFzZSBjbGFzcyB1c2VkIHRvIGtleSB0aGUgb3B0aW9uCisgIC8vLyBcdHBhcmFtIE1lbSBtZW1iZXIgb2YgXHAgQmFzZSB1c2VkIGZvciBrZXlpbmcgdGhlIG9wdGlvbgorICAvLy8KKyAgLy8vIFJlYWRzIG9wdGlvbiB2YWx1ZXMgYmFzZWQgb24gdGhlIGtleSBnZW5lcmF0ZWQgYnkgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMuCisgIC8vLyBLZXlpbmcgZm9yIGdldCgpIGlzIHRoZSBzYW1lIGFzIGtleWluZyBmb3IgcmVnaXN0ZXJPcHRpb24uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBWYWxULCB0eXBlbmFtZSBCYXNlLCBWYWxUKEJhc2U6OipNZW0pPiBWYWxUIGdldCgpIGNvbnN0IHsKKyAgICBhdXRvIEl0ID0gT3B0aW9ucy5maW5kKCZkZXRhaWw6Ok9wdGlvbktleTxWYWxULCBCYXNlLCBNZW0+OjpJRCk7CisgICAgYXNzZXJ0KEl0ICE9IE9wdGlvbnMuZW5kKCkgJiYgIk9wdGlvbiBub3QgaW4gT3B0aW9uUmVnaXN0cnkiKTsKKyAgICByZXR1cm4gKihjbDo6b3B0PFZhbFQ+ICopSXQtPnNlY29uZDsKKyAgfQorfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9QYXJhbGxlbC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1BhcmFsbGVsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiMmJjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9QYXJhbGxlbC5oCkBAIC0wLDAgKzEsMjQ3IEBACisvLz09PS0gbGx2bS9TdXBwb3J0L1BhcmFsbGVsLmggLSBQYXJhbGxlbCBhbGdvcml0aG1zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9QQVJBTExFTF9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9QQVJBTExFTF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9sbHZtLWNvbmZpZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y29uZGl0aW9uX3ZhcmlhYmxlPgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bXV0ZXg+CisKKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBMTFZNX0VOQUJMRV9USFJFQURTCisjcHJhZ21hIHdhcm5pbmcocHVzaCkKKyNwcmFnbWEgd2FybmluZyhkaXNhYmxlIDogNDUzMCkKKyNpbmNsdWRlIDxjb25jcnQuaD4KKyNpbmNsdWRlIDxwcGwuaD4KKyNwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYKKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgcGFyYWxsZWwgeworc3RydWN0IHNlcXVlbnRpYWxfZXhlY3V0aW9uX3BvbGljeSB7fTsKK3N0cnVjdCBwYXJhbGxlbF9leGVjdXRpb25fcG9saWN5IHt9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBpc19leGVjdXRpb25fcG9saWN5CisgICAgOiBwdWJsaWMgc3RkOjppbnRlZ3JhbF9jb25zdGFudDwKKyAgICAgICAgICBib29sLCBsbHZtOjppc19vbmVfb2Y8VCwgc2VxdWVudGlhbF9leGVjdXRpb25fcG9saWN5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJhbGxlbF9leGVjdXRpb25fcG9saWN5Pjo6dmFsdWU+IHt9OworCitjb25zdGV4cHIgc2VxdWVudGlhbF9leGVjdXRpb25fcG9saWN5IHNlcXt9OworY29uc3RleHByIHBhcmFsbGVsX2V4ZWN1dGlvbl9wb2xpY3kgcGFye307CisKK25hbWVzcGFjZSBkZXRhaWwgeworCisjaWYgTExWTV9FTkFCTEVfVEhSRUFEUworCitjbGFzcyBMYXRjaCB7CisgIHVpbnQzMl90IENvdW50OworICBtdXRhYmxlIHN0ZDo6bXV0ZXggTXV0ZXg7CisgIG11dGFibGUgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgQ29uZDsKKworcHVibGljOgorICBleHBsaWNpdCBMYXRjaCh1aW50MzJfdCBDb3VudCA9IDApIDogQ291bnQoQ291bnQpIHt9CisgIH5MYXRjaCgpIHsgc3luYygpOyB9CisKKyAgdm9pZCBpbmMoKSB7CisgICAgc3RkOjpsb2NrX2d1YXJkPHN0ZDo6bXV0ZXg+IGxvY2soTXV0ZXgpOworICAgICsrQ291bnQ7CisgIH0KKworICB2b2lkIGRlYygpIHsKKyAgICBzdGQ6OmxvY2tfZ3VhcmQ8c3RkOjptdXRleD4gbG9jayhNdXRleCk7CisgICAgaWYgKC0tQ291bnQgPT0gMCkKKyAgICAgIENvbmQubm90aWZ5X2FsbCgpOworICB9CisKKyAgdm9pZCBzeW5jKCkgY29uc3QgeworICAgIHN0ZDo6dW5pcXVlX2xvY2s8c3RkOjptdXRleD4gbG9jayhNdXRleCk7CisgICAgQ29uZC53YWl0KGxvY2ssIFsmXSB7IHJldHVybiBDb3VudCA9PSAwOyB9KTsKKyAgfQorfTsKKworY2xhc3MgVGFza0dyb3VwIHsKKyAgTGF0Y2ggTDsKKworcHVibGljOgorICB2b2lkIHNwYXduKHN0ZDo6ZnVuY3Rpb248dm9pZCgpPiBmKTsKKworICB2b2lkIHN5bmMoKSBjb25zdCB7IEwuc3luYygpOyB9Cit9OworCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKK3RlbXBsYXRlIDxjbGFzcyBSYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgQ29tcGFyYXRvcj4KK3ZvaWQgcGFyYWxsZWxfc29ydChSYW5kb21BY2Nlc3NJdGVyYXRvciBTdGFydCwgUmFuZG9tQWNjZXNzSXRlcmF0b3IgRW5kLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbXBhcmF0b3IgJkNvbXApIHsKKyAgY29uY3VycmVuY3k6OnBhcmFsbGVsX3NvcnQoU3RhcnQsIEVuZCwgQ29tcCk7Cit9Cit0ZW1wbGF0ZSA8Y2xhc3MgSXRlclR5LCBjbGFzcyBGdW5jVHk+Cit2b2lkIHBhcmFsbGVsX2Zvcl9lYWNoKEl0ZXJUeSBCZWdpbiwgSXRlclR5IEVuZCwgRnVuY1R5IEZuKSB7CisgIGNvbmN1cnJlbmN5OjpwYXJhbGxlbF9mb3JfZWFjaChCZWdpbiwgRW5kLCBGbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBJbmRleFR5LCBjbGFzcyBGdW5jVHk+Cit2b2lkIHBhcmFsbGVsX2Zvcl9lYWNoX24oSW5kZXhUeSBCZWdpbiwgSW5kZXhUeSBFbmQsIEZ1bmNUeSBGbikgeworICBjb25jdXJyZW5jeTo6cGFyYWxsZWxfZm9yKEJlZ2luLCBFbmQsIEZuKTsKK30KKworI2Vsc2UKK2NvbnN0IHB0cmRpZmZfdCBNaW5QYXJhbGxlbFNpemUgPSAxMDI0OworCisvLy8gXGJyaWVmIEluY2x1c2l2ZSBtZWRpYW4uCit0ZW1wbGF0ZSA8Y2xhc3MgUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIENvbXBhcmF0b3I+CitSYW5kb21BY2Nlc3NJdGVyYXRvciBtZWRpYW5PZjMoUmFuZG9tQWNjZXNzSXRlcmF0b3IgU3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmFuZG9tQWNjZXNzSXRlcmF0b3IgRW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbXBhcmF0b3IgJkNvbXApIHsKKyAgUmFuZG9tQWNjZXNzSXRlcmF0b3IgTWlkID0gU3RhcnQgKyAoc3RkOjpkaXN0YW5jZShTdGFydCwgRW5kKSAvIDIpOworICByZXR1cm4gQ29tcCgqU3RhcnQsICooRW5kIC0gMSkpCisgICAgICAgICAgICAgPyAoQ29tcCgqTWlkLCAqKEVuZCAtIDEpKSA/IChDb21wKCpTdGFydCwgKk1pZCkgPyBNaWQgOiBTdGFydCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRW5kIC0gMSkKKyAgICAgICAgICAgICA6IChDb21wKCpNaWQsICpTdGFydCkgPyAoQ29tcCgqKEVuZCAtIDEpLCAqTWlkKSA/IE1pZCA6IEVuZCAtIDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogU3RhcnQpOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgUmFuZG9tQWNjZXNzSXRlcmF0b3IsIGNsYXNzIENvbXBhcmF0b3I+Cit2b2lkIHBhcmFsbGVsX3F1aWNrX3NvcnQoUmFuZG9tQWNjZXNzSXRlcmF0b3IgU3RhcnQsIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIEVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDb21wYXJhdG9yICZDb21wLCBUYXNrR3JvdXAgJlRHLCBzaXplX3QgRGVwdGgpIHsKKyAgLy8gRG8gYSBzZXF1ZW50aWFsIHNvcnQgZm9yIHNtYWxsIGlucHV0cy4KKyAgaWYgKHN0ZDo6ZGlzdGFuY2UoU3RhcnQsIEVuZCkgPCBkZXRhaWw6Ok1pblBhcmFsbGVsU2l6ZSB8fCBEZXB0aCA9PSAwKSB7CisgICAgc3RkOjpzb3J0KFN0YXJ0LCBFbmQsIENvbXApOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFBhcnRpdGlvbi4KKyAgYXV0byBQaXZvdCA9IG1lZGlhbk9mMyhTdGFydCwgRW5kLCBDb21wKTsKKyAgLy8gTW92ZSBQaXZvdCB0byBFbmQuCisgIHN0ZDo6c3dhcCgqKEVuZCAtIDEpLCAqUGl2b3QpOworICBQaXZvdCA9IHN0ZDo6cGFydGl0aW9uKFN0YXJ0LCBFbmQgLSAxLCBbJkNvbXAsIEVuZF0oZGVjbHR5cGUoKlN0YXJ0KSBWKSB7CisgICAgcmV0dXJuIENvbXAoViwgKihFbmQgLSAxKSk7CisgIH0pOworICAvLyBNb3ZlIFBpdm90IHRvIG1pZGRsZSBvZiBwYXJ0aXRpb24uCisgIHN0ZDo6c3dhcCgqUGl2b3QsICooRW5kIC0gMSkpOworCisgIC8vIFJlY3Vyc2UuCisgIFRHLnNwYXduKFs9LCAmQ29tcCwgJlRHXSB7CisgICAgcGFyYWxsZWxfcXVpY2tfc29ydChTdGFydCwgUGl2b3QsIENvbXAsIFRHLCBEZXB0aCAtIDEpOworICB9KTsKKyAgcGFyYWxsZWxfcXVpY2tfc29ydChQaXZvdCArIDEsIEVuZCwgQ29tcCwgVEcsIERlcHRoIC0gMSk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBSYW5kb21BY2Nlc3NJdGVyYXRvciwgY2xhc3MgQ29tcGFyYXRvcj4KK3ZvaWQgcGFyYWxsZWxfc29ydChSYW5kb21BY2Nlc3NJdGVyYXRvciBTdGFydCwgUmFuZG9tQWNjZXNzSXRlcmF0b3IgRW5kLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IENvbXBhcmF0b3IgJkNvbXApIHsKKyAgVGFza0dyb3VwIFRHOworICBwYXJhbGxlbF9xdWlja19zb3J0KFN0YXJ0LCBFbmQsIENvbXAsIFRHLAorICAgICAgICAgICAgICAgICAgICAgIGxsdm06OkxvZzJfNjQoc3RkOjpkaXN0YW5jZShTdGFydCwgRW5kKSkgKyAxKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIEl0ZXJUeSwgY2xhc3MgRnVuY1R5Pgordm9pZCBwYXJhbGxlbF9mb3JfZWFjaChJdGVyVHkgQmVnaW4sIEl0ZXJUeSBFbmQsIEZ1bmNUeSBGbikgeworICAvLyBUYXNrR3JvdXAgaGFzIGEgcmVsYXRpdmVseSBoaWdoIG92ZXJoZWFkLCBzbyB3ZSB3YW50IHRvIHJlZHVjZQorICAvLyB0aGUgbnVtYmVyIG9mIHNwYXduKCkgY2FsbHMuIFdlJ2xsIGNyZWF0ZSB1cCB0byAxMDI0IHRhc2tzIGhlcmUuCisgIC8vIChOb3RlIHRoYXQgMTAyNCBpcyBhbiBhcmJpdHJhcnkgbnVtYmVyLiBUaGlzIGNvZGUgcHJvYmFibHkgbmVlZHMKKyAgLy8gaW1wcm92aW5nIHRvIHRha2UgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgY29yZXMgaW50byBhY2NvdW50LikKKyAgcHRyZGlmZl90IFRhc2tTaXplID0gc3RkOjpkaXN0YW5jZShCZWdpbiwgRW5kKSAvIDEwMjQ7CisgIGlmIChUYXNrU2l6ZSA9PSAwKQorICAgIFRhc2tTaXplID0gMTsKKworICBUYXNrR3JvdXAgVEc7CisgIHdoaWxlIChUYXNrU2l6ZSA8IHN0ZDo6ZGlzdGFuY2UoQmVnaW4sIEVuZCkpIHsKKyAgICBURy5zcGF3bihbPSwgJkZuXSB7IHN0ZDo6Zm9yX2VhY2goQmVnaW4sIEJlZ2luICsgVGFza1NpemUsIEZuKTsgfSk7CisgICAgQmVnaW4gKz0gVGFza1NpemU7CisgIH0KKyAgc3RkOjpmb3JfZWFjaChCZWdpbiwgRW5kLCBGbik7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBJbmRleFR5LCBjbGFzcyBGdW5jVHk+Cit2b2lkIHBhcmFsbGVsX2Zvcl9lYWNoX24oSW5kZXhUeSBCZWdpbiwgSW5kZXhUeSBFbmQsIEZ1bmNUeSBGbikgeworICBwdHJkaWZmX3QgVGFza1NpemUgPSAoRW5kIC0gQmVnaW4pIC8gMTAyNDsKKyAgaWYgKFRhc2tTaXplID09IDApCisgICAgVGFza1NpemUgPSAxOworCisgIFRhc2tHcm91cCBURzsKKyAgSW5kZXhUeSBJID0gQmVnaW47CisgIGZvciAoOyBJICsgVGFza1NpemUgPCBFbmQ7IEkgKz0gVGFza1NpemUpIHsKKyAgICBURy5zcGF3bihbPSwgJkZuXSB7CisgICAgICBmb3IgKEluZGV4VHkgSiA9IEksIEUgPSBJICsgVGFza1NpemU7IEogIT0gRTsgKytKKQorICAgICAgICBGbihKKTsKKyAgICB9KTsKKyAgfQorICBmb3IgKEluZGV4VHkgSiA9IEk7IEogPCBFbmQ7ICsrSikKKyAgICBGbihKKTsKK30KKworI2VuZGlmCisKKyNlbmRpZgorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcj4KK3VzaW5nIERlZkNvbXBhcmF0b3IgPQorICAgIHN0ZDo6bGVzczx0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyPjo6dmFsdWVfdHlwZT47CisKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorCisvLyBzZXF1ZW50aWFsIGFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbnMuCit0ZW1wbGF0ZSA8Y2xhc3MgUG9saWN5LCBjbGFzcyBSYW5kb21BY2Nlc3NJdGVyYXRvciwKKyAgICAgICAgICBjbGFzcyBDb21wYXJhdG9yID0gZGV0YWlsOjpEZWZDb21wYXJhdG9yPFJhbmRvbUFjY2Vzc0l0ZXJhdG9yPj4KK3ZvaWQgc29ydChQb2xpY3kgcG9saWN5LCBSYW5kb21BY2Nlc3NJdGVyYXRvciBTdGFydCwgUmFuZG9tQWNjZXNzSXRlcmF0b3IgRW5kLAorICAgICAgICAgIGNvbnN0IENvbXBhcmF0b3IgJkNvbXAgPSBDb21wYXJhdG9yKCkpIHsKKyAgc3RhdGljX2Fzc2VydChpc19leGVjdXRpb25fcG9saWN5PFBvbGljeT46OnZhbHVlLAorICAgICAgICAgICAgICAgICJJbnZhbGlkIGV4ZWN1dGlvbiBwb2xpY3khIik7CisgIHN0ZDo6c29ydChTdGFydCwgRW5kLCBDb21wKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFBvbGljeSwgY2xhc3MgSXRlclR5LCBjbGFzcyBGdW5jVHk+Cit2b2lkIGZvcl9lYWNoKFBvbGljeSBwb2xpY3ksIEl0ZXJUeSBCZWdpbiwgSXRlclR5IEVuZCwgRnVuY1R5IEZuKSB7CisgIHN0YXRpY19hc3NlcnQoaXNfZXhlY3V0aW9uX3BvbGljeTxQb2xpY3k+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAiSW52YWxpZCBleGVjdXRpb24gcG9saWN5ISIpOworICBzdGQ6OmZvcl9lYWNoKEJlZ2luLCBFbmQsIEZuKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIFBvbGljeSwgY2xhc3MgSW5kZXhUeSwgY2xhc3MgRnVuY1R5Pgordm9pZCBmb3JfZWFjaF9uKFBvbGljeSBwb2xpY3ksIEluZGV4VHkgQmVnaW4sIEluZGV4VHkgRW5kLCBGdW5jVHkgRm4pIHsKKyAgc3RhdGljX2Fzc2VydChpc19leGVjdXRpb25fcG9saWN5PFBvbGljeT46OnZhbHVlLAorICAgICAgICAgICAgICAgICJJbnZhbGlkIGV4ZWN1dGlvbiBwb2xpY3khIik7CisgIGZvciAoSW5kZXhUeSBJID0gQmVnaW47IEkgIT0gRW5kOyArK0kpCisgICAgRm4oSSk7Cit9CisKKy8vIFBhcmFsbGVsIGFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbnMsIG9ubHkgYXZhaWxhYmxlIHdoZW4gTExWTV9FTkFCTEVfVEhSRUFEUworLy8gaXMgdHJ1ZS4KKyNpZiBMTFZNX0VOQUJMRV9USFJFQURTCit0ZW1wbGF0ZSA8Y2xhc3MgUmFuZG9tQWNjZXNzSXRlcmF0b3IsCisgICAgICAgICAgY2xhc3MgQ29tcGFyYXRvciA9IGRldGFpbDo6RGVmQ29tcGFyYXRvcjxSYW5kb21BY2Nlc3NJdGVyYXRvcj4+Cit2b2lkIHNvcnQocGFyYWxsZWxfZXhlY3V0aW9uX3BvbGljeSBwb2xpY3ksIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIFN0YXJ0LAorICAgICAgICAgIFJhbmRvbUFjY2Vzc0l0ZXJhdG9yIEVuZCwgY29uc3QgQ29tcGFyYXRvciAmQ29tcCA9IENvbXBhcmF0b3IoKSkgeworICBkZXRhaWw6OnBhcmFsbGVsX3NvcnQoU3RhcnQsIEVuZCwgQ29tcCk7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBJdGVyVHksIGNsYXNzIEZ1bmNUeT4KK3ZvaWQgZm9yX2VhY2gocGFyYWxsZWxfZXhlY3V0aW9uX3BvbGljeSBwb2xpY3ksIEl0ZXJUeSBCZWdpbiwgSXRlclR5IEVuZCwKKyAgICAgICAgICAgICAgRnVuY1R5IEZuKSB7CisgIGRldGFpbDo6cGFyYWxsZWxfZm9yX2VhY2goQmVnaW4sIEVuZCwgRm4pOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgSW5kZXhUeSwgY2xhc3MgRnVuY1R5Pgordm9pZCBmb3JfZWFjaF9uKHBhcmFsbGVsX2V4ZWN1dGlvbl9wb2xpY3kgcG9saWN5LCBJbmRleFR5IEJlZ2luLCBJbmRleFR5IEVuZCwKKyAgICAgICAgICAgICAgICBGdW5jVHkgRm4pIHsKKyAgZGV0YWlsOjpwYXJhbGxlbF9mb3JfZWFjaF9uKEJlZ2luLCBFbmQsIEZuKTsKK30KKyNlbmRpZgorCit9IC8vIG5hbWVzcGFjZSBwYXJhbGxlbAorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX1BBUkFMTEVMX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9QYXRoLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUGF0aC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU1OTc5NjcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUGF0aC5oCkBAIC0wLDAgKzEsNDc0IEBACisvLz09PS0gbGx2bS9TdXBwb3J0L1BhdGguaCAtIFBhdGggT3BlcmF0aW5nIFN5c3RlbSBDb25jZXB0IC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgbGx2bTo6c3lzOjpwYXRoIG5hbWVzcGFjZS4gSXQgaXMgZGVzaWduZWQgYWZ0ZXIKKy8vIFRSMi9ib29zdCBmaWxlc3lzdGVtICh2MyksIGJ1dCBtb2RpZmllZCB0byByZW1vdmUgZXhjZXB0aW9uIGhhbmRsaW5nIGFuZCB0aGUKKy8vIHBhdGggY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfUEFUSF9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9QQVRIX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisjaW5jbHVkZSA8aXRlcmF0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBzeXMgeworbmFtZXNwYWNlIHBhdGggeworCitlbnVtIGNsYXNzIFN0eWxlIHsgd2luZG93cywgcG9zaXgsIG5hdGl2ZSB9OworCisvLy8gQG5hbWUgTGV4aWNhbCBDb21wb25lbnQgSXRlcmF0b3IKKy8vLyBAeworCisvLy8gQGJyaWVmIFBhdGggaXRlcmF0b3IuCisvLy8KKy8vLyBUaGlzIGlzIGFuIGlucHV0IGl0ZXJhdG9yIHRoYXQgaXRlcmF0ZXMgb3ZlciB0aGUgaW5kaXZpZHVhbCBjb21wb25lbnRzIGluCisvLy8gXGEgcGF0aC4gVGhlIHRyYXZlcnNhbCBvcmRlciBpcyBhcyBmb2xsb3dzOgorLy8vICogVGhlIHJvb3QtbmFtZSBlbGVtZW50LCBpZiBwcmVzZW50LgorLy8vICogVGhlIHJvb3QtZGlyZWN0b3J5IGVsZW1lbnQsIGlmIHByZXNlbnQuCisvLy8gKiBFYWNoIHN1Y2Nlc3NpdmUgZmlsZW5hbWUgZWxlbWVudCwgaWYgcHJlc2VudC4KKy8vLyAqIERvdCwgaWYgb25lIG9yIG1vcmUgdHJhaWxpbmcgbm9uLXJvb3Qgc2xhc2ggY2hhcmFjdGVycyBhcmUgcHJlc2VudC4KKy8vLyBUcmF2ZXJzaW5nIGJhY2t3YXJkcyBpcyBwb3NzaWJsZSB3aXRoIFxhIHJldmVyc2VfaXRlcmF0b3IKKy8vLworLy8vIEl0ZXJhdGlvbiBleGFtcGxlcy4gRWFjaCBjb21wb25lbnQgaXMgc2VwYXJhdGVkIGJ5ICcsJzoKKy8vLyBAY29kZQorLy8vICAgLyAgICAgICAgICA9PiAvCisvLy8gICAvZm9vICAgICAgID0+IC8sZm9vCisvLy8gICBmb28vICAgICAgID0+IGZvbywuCisvLy8gICAvZm9vL2JhciAgID0+IC8sZm9vLGJhcgorLy8vICAgLi4vICAgICAgICA9PiAuLiwuCisvLy8gICBDOlxmb29cYmFyID0+IEM6LC8sZm9vLGJhcgorLy8vIEBlbmRjb2RlCitjbGFzcyBjb25zdF9pdGVyYXRvcgorICAgIDogcHVibGljIGl0ZXJhdG9yX2ZhY2FkZV9iYXNlPGNvbnN0X2l0ZXJhdG9yLCBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdSZWY+IHsKKyAgU3RyaW5nUmVmIFBhdGg7ICAgICAgLy8vPCBUaGUgZW50aXJlIHBhdGguCisgIFN0cmluZ1JlZiBDb21wb25lbnQ7IC8vLzwgVGhlIGN1cnJlbnQgY29tcG9uZW50LiBOb3QgbmVjZXNzYXJpbHkgaW4gUGF0aC4KKyAgc2l6ZV90ICAgIFBvc2l0aW9uOyAgLy8vPCBUaGUgaXRlcmF0b3JzIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIFBhdGguCisgIFN0eWxlIFM7ICAgICAgICAgICAgIC8vLzwgVGhlIHBhdGggc3R5bGUgdG8gdXNlLgorCisgIC8vIEFuIGVuZCBpdGVyYXRvciBoYXMgUG9zaXRpb24gPSBQYXRoLnNpemUoKSArIDEuCisgIGZyaWVuZCBjb25zdF9pdGVyYXRvciBiZWdpbihTdHJpbmdSZWYgcGF0aCwgU3R5bGUgc3R5bGUpOworICBmcmllbmQgY29uc3RfaXRlcmF0b3IgZW5kKFN0cmluZ1JlZiBwYXRoKTsKKworcHVibGljOgorICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gQ29tcG9uZW50OyB9CisgIGNvbnN0X2l0ZXJhdG9yICZvcGVyYXRvcisrKCk7ICAgIC8vIHByZWluY3JlbWVudAorICBib29sIG9wZXJhdG9yPT0oY29uc3QgY29uc3RfaXRlcmF0b3IgJlJIUykgY29uc3Q7CisKKyAgLy8vIEBicmllZiBEaWZmZXJlbmNlIGluIGJ5dGVzIGJldHdlZW4gdGhpcyBhbmQgUkhTLgorICBwdHJkaWZmX3Qgb3BlcmF0b3ItKGNvbnN0IGNvbnN0X2l0ZXJhdG9yICZSSFMpIGNvbnN0OworfTsKKworLy8vIEBicmllZiBSZXZlcnNlIHBhdGggaXRlcmF0b3IuCisvLy8KKy8vLyBUaGlzIGlzIGFuIGlucHV0IGl0ZXJhdG9yIHRoYXQgaXRlcmF0ZXMgb3ZlciB0aGUgaW5kaXZpZHVhbCBjb21wb25lbnRzIGluCisvLy8gXGEgcGF0aCBpbiByZXZlcnNlIG9yZGVyLiBUaGUgdHJhdmVyc2FsIG9yZGVyIGlzIGV4YWN0bHkgcmV2ZXJzZWQgZnJvbSB0aGF0CisvLy8gb2YgXGEgY29uc3RfaXRlcmF0b3IKK2NsYXNzIHJldmVyc2VfaXRlcmF0b3IKKyAgICA6IHB1YmxpYyBpdGVyYXRvcl9mYWNhZGVfYmFzZTxyZXZlcnNlX2l0ZXJhdG9yLCBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdSZWY+IHsKKyAgU3RyaW5nUmVmIFBhdGg7ICAgICAgLy8vPCBUaGUgZW50aXJlIHBhdGguCisgIFN0cmluZ1JlZiBDb21wb25lbnQ7IC8vLzwgVGhlIGN1cnJlbnQgY29tcG9uZW50LiBOb3QgbmVjZXNzYXJpbHkgaW4gUGF0aC4KKyAgc2l6ZV90ICAgIFBvc2l0aW9uOyAgLy8vPCBUaGUgaXRlcmF0b3JzIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIFBhdGguCisgIFN0eWxlIFM7ICAgICAgICAgICAgIC8vLzwgVGhlIHBhdGggc3R5bGUgdG8gdXNlLgorCisgIGZyaWVuZCByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbihTdHJpbmdSZWYgcGF0aCwgU3R5bGUgc3R5bGUpOworICBmcmllbmQgcmV2ZXJzZV9pdGVyYXRvciByZW5kKFN0cmluZ1JlZiBwYXRoKTsKKworcHVibGljOgorICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gQ29tcG9uZW50OyB9CisgIHJldmVyc2VfaXRlcmF0b3IgJm9wZXJhdG9yKysoKTsgICAgLy8gcHJlaW5jcmVtZW50CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCByZXZlcnNlX2l0ZXJhdG9yICZSSFMpIGNvbnN0OworCisgIC8vLyBAYnJpZWYgRGlmZmVyZW5jZSBpbiBieXRlcyBiZXR3ZWVuIHRoaXMgYW5kIFJIUy4KKyAgcHRyZGlmZl90IG9wZXJhdG9yLShjb25zdCByZXZlcnNlX2l0ZXJhdG9yICZSSFMpIGNvbnN0OworfTsKKworLy8vIEBicmllZiBHZXQgYmVnaW4gaXRlcmF0b3Igb3ZlciBcYSBwYXRoLgorLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHJldHVybnMgSXRlcmF0b3IgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZmlyc3QgY29tcG9uZW50IG9mIFxhIHBhdGguCitjb25zdF9pdGVyYXRvciBiZWdpbihTdHJpbmdSZWYgcGF0aCwgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIEBicmllZiBHZXQgZW5kIGl0ZXJhdG9yIG92ZXIgXGEgcGF0aC4KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEByZXR1cm5zIEl0ZXJhdG9yIGluaXRpYWxpemVkIHRvIHRoZSBlbmQgb2YgXGEgcGF0aC4KK2NvbnN0X2l0ZXJhdG9yIGVuZChTdHJpbmdSZWYgcGF0aCk7CisKKy8vLyBAYnJpZWYgR2V0IHJldmVyc2UgYmVnaW4gaXRlcmF0b3Igb3ZlciBcYSBwYXRoLgorLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHJldHVybnMgSXRlcmF0b3IgaW5pdGlhbGl6ZWQgd2l0aCB0aGUgZmlyc3QgcmV2ZXJzZSBjb21wb25lbnQgb2YgXGEgcGF0aC4KK3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKFN0cmluZ1JlZiBwYXRoLCBTdHlsZSBzdHlsZSA9IFN0eWxlOjpuYXRpdmUpOworCisvLy8gQGJyaWVmIEdldCByZXZlcnNlIGVuZCBpdGVyYXRvciBvdmVyIFxhIHBhdGguCisvLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmV0dXJucyBJdGVyYXRvciBpbml0aWFsaXplZCB0byB0aGUgcmV2ZXJzZSBlbmQgb2YgXGEgcGF0aC4KK3JldmVyc2VfaXRlcmF0b3IgcmVuZChTdHJpbmdSZWYgcGF0aCk7CisKKy8vLyBAfQorLy8vIEBuYW1lIExleGljYWwgTW9kaWZpZXJzCisvLy8gQHsKKworLy8vIEBicmllZiBSZW1vdmUgdGhlIGxhc3QgY29tcG9uZW50IGZyb20gXGEgcGF0aCB1bmxlc3MgaXQgaXMgdGhlIHJvb3QgZGlyLgorLy8vCisvLy8gQGNvZGUKKy8vLyAgIGRpcmVjdG9yeS9maWxlbmFtZS5jcHAgPT4gZGlyZWN0b3J5LworLy8vICAgZGlyZWN0b3J5LyAgICAgICAgICAgICA9PiBkaXJlY3RvcnkKKy8vLyAgIGZpbGVuYW1lLmNwcCAgICAgICAgICAgPT4gPGVtcHR5PgorLy8vICAgLyAgICAgICAgICAgICAgICAgICAgICA9PiAvCisvLy8gQGVuZGNvZGUKKy8vLworLy8vIEBwYXJhbSBwYXRoIEEgcGF0aCB0aGF0IGlzIG1vZGlmaWVkIHRvIG5vdCBoYXZlIGEgZmlsZSBjb21wb25lbnQuCit2b2lkIHJlbW92ZV9maWxlbmFtZShTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnBhdGgsIFN0eWxlIHN0eWxlID0gU3R5bGU6Om5hdGl2ZSk7CisKKy8vLyBAYnJpZWYgUmVwbGFjZSB0aGUgZmlsZSBleHRlbnNpb24gb2YgXGEgcGF0aCB3aXRoIFxhIGV4dGVuc2lvbi4KKy8vLworLy8vIEBjb2RlCisvLy8gICAuL2ZpbGVuYW1lLmNwcCA9PiAuL2ZpbGVuYW1lLmV4dGVuc2lvbgorLy8vICAgLi9maWxlbmFtZSAgICAgPT4gLi9maWxlbmFtZS5leHRlbnNpb24KKy8vLyAgIC4vICAgICAgICAgICAgID0+IC4vLmV4dGVuc2lvbgorLy8vIEBlbmRjb2RlCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBBIHBhdGggdGhhdCBoYXMgaXRzIGV4dGVuc2lvbiByZXBsYWNlZCB3aXRoIFxhIGV4dGVuc2lvbi4KKy8vLyBAcGFyYW0gZXh0ZW5zaW9uIFRoZSBleHRlbnNpb24gdG8gYmUgYWRkZWQuIEl0IG1heSBiZSBlbXB0eS4gSXQgbWF5IGFsc28KKy8vLyAgICAgICAgICAgICAgICAgIG9wdGlvbmFsbHkgc3RhcnQgd2l0aCBhICcuJywgaWYgaXQgZG9lcyBub3QsIG9uZSB3aWxsIGJlCisvLy8gICAgICAgICAgICAgICAgICBwcmVwZW5kZWQuCit2b2lkIHJlcGxhY2VfZXh0ZW5zaW9uKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmcGF0aCwgY29uc3QgVHdpbmUgJmV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIEBicmllZiBSZXBsYWNlIG1hdGNoaW5nIHBhdGggcHJlZml4IHdpdGggYW5vdGhlciBwYXRoLgorLy8vCisvLy8gQGNvZGUKKy8vLyAgIC9mb28sIC9vbGQsIC9uZXcgPT4gL2ZvbworLy8vICAgL29sZC9mb28sIC9vbGQsIC9uZXcgPT4gL25ldy9mb28KKy8vLyAgIC9mb28sIDxlbXB0eT4sIC9uZXcgPT4gL25ldy9mb28KKy8vLyAgIC9vbGQvZm9vLCAvb2xkLCA8ZW1wdHk+ID0+IC9mb28KKy8vLyBAZW5kY29kZQorLy8vCisvLy8gQHBhcmFtIFBhdGggSWYgXGEgUGF0aCBzdGFydHMgd2l0aCBcYSBPbGRQcmVmaXggbW9kaWZ5IHRvIGluc3RlYWQKKy8vLyAgICAgICAgc3RhcnQgd2l0aCBcYSBOZXdQcmVmaXguCisvLy8gQHBhcmFtIE9sZFByZWZpeCBUaGUgcGF0aCBwcmVmaXggdG8gc3RyaXAgZnJvbSBcYSBQYXRoLgorLy8vIEBwYXJhbSBOZXdQcmVmaXggVGhlIHBhdGggcHJlZml4IHRvIHJlcGxhY2UgXGEgTmV3UHJlZml4IHdpdGguCit2b2lkIHJlcGxhY2VfcGF0aF9wcmVmaXgoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZQYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0cmluZ1JlZiAmT2xkUHJlZml4LCBjb25zdCBTdHJpbmdSZWYgJk5ld1ByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBTdHlsZSBzdHlsZSA9IFN0eWxlOjpuYXRpdmUpOworCisvLy8gQGJyaWVmIEFwcGVuZCB0byBwYXRoLgorLy8vCisvLy8gQGNvZGUKKy8vLyAgIC9mb28gICsgYmFyL2YgPT4gL2Zvby9iYXIvZgorLy8vICAgL2Zvby8gKyBiYXIvZiA9PiAvZm9vL2Jhci9mCisvLy8gICBmb28gICArIGJhci9mID0+IGZvby9iYXIvZgorLy8vIEBlbmRjb2RlCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBTZXQgdG8gXGEgcGF0aCArIFxhIGNvbXBvbmVudC4KKy8vLyBAcGFyYW0gYSBUaGUgY29tcG9uZW50IHRvIGJlIGFwcGVuZGVkIHRvIFxhIHBhdGguCit2b2lkIGFwcGVuZChTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnBhdGgsIGNvbnN0IFR3aW5lICZhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmYiA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmYyA9ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmZCA9ICIiKTsKKwordm9pZCBhcHBlbmQoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZwYXRoLCBTdHlsZSBzdHlsZSwgY29uc3QgVHdpbmUgJmEsCisgICAgICAgICAgICBjb25zdCBUd2luZSAmYiA9ICIiLCBjb25zdCBUd2luZSAmYyA9ICIiLCBjb25zdCBUd2luZSAmZCA9ICIiKTsKKworLy8vIEBicmllZiBBcHBlbmQgdG8gcGF0aC4KKy8vLworLy8vIEBjb2RlCisvLy8gICAvZm9vICArIFtiYXIsZl0gPT4gL2Zvby9iYXIvZgorLy8vICAgL2Zvby8gKyBbYmFyLGZdID0+IC9mb28vYmFyL2YKKy8vLyAgIGZvbyAgICsgW2JhcixmXSA9PiBmb28vYmFyL2YKKy8vLyBAZW5kY29kZQorLy8vCisvLy8gQHBhcmFtIHBhdGggU2V0IHRvIFxhIHBhdGggKyBbXGEgYmVnaW4sIFxhIGVuZCkuCisvLy8gQHBhcmFtIGJlZ2luIFN0YXJ0IG9mIGNvbXBvbmVudHMgdG8gYXBwZW5kLgorLy8vIEBwYXJhbSBlbmQgT25lIHBhc3QgdGhlIGVuZCBvZiBjb21wb25lbnRzIHRvIGFwcGVuZC4KK3ZvaWQgYXBwZW5kKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmcGF0aCwgY29uc3RfaXRlcmF0b3IgYmVnaW4sCisgICAgICAgICAgICBjb25zdF9pdGVyYXRvciBlbmQsIFN0eWxlIHN0eWxlID0gU3R5bGU6Om5hdGl2ZSk7CisKKy8vLyBAfQorLy8vIEBuYW1lIFRyYW5zZm9ybXMgKG9yIHNvbWUgb3RoZXIgYmV0dGVyIG5hbWUpCisvLy8gQHsKKworLy8vIENvbnZlcnQgcGF0aCB0byB0aGUgbmF0aXZlIGZvcm0uIFRoaXMgaXMgdXNlZCB0byBnaXZlIHBhdGhzIHRvIHVzZXJzIGFuZAorLy8vIG9wZXJhdGluZyBzeXN0ZW0gY2FsbHMgaW4gdGhlIHBsYXRmb3JtJ3Mgbm9ybWFsIHdheS4gRm9yIGV4YW1wbGUsIG9uIFdpbmRvd3MKKy8vLyBhbGwgJy8nIGFyZSBjb252ZXJ0ZWQgdG8gJ1wnLgorLy8vCisvLy8gQHBhcmFtIHBhdGggQSBwYXRoIHRoYXQgaXMgdHJhbnNmb3JtZWQgdG8gbmF0aXZlIGZvcm1hdC4KKy8vLyBAcGFyYW0gcmVzdWx0IEhvbGRzIHRoZSByZXN1bHQgb2YgdGhlIHRyYW5zZm9ybWF0aW9uLgordm9pZCBuYXRpdmUoY29uc3QgVHdpbmUgJnBhdGgsIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmcmVzdWx0LAorICAgICAgICAgICAgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIENvbnZlcnQgcGF0aCB0byB0aGUgbmF0aXZlIGZvcm0gaW4gcGxhY2UuIFRoaXMgaXMgdXNlZCB0byBnaXZlIHBhdGhzIHRvCisvLy8gdXNlcnMgYW5kIG9wZXJhdGluZyBzeXN0ZW0gY2FsbHMgaW4gdGhlIHBsYXRmb3JtJ3Mgbm9ybWFsIHdheS4gRm9yIGV4YW1wbGUsCisvLy8gb24gV2luZG93cyBhbGwgJy8nIGFyZSBjb252ZXJ0ZWQgdG8gJ1wnLgorLy8vCisvLy8gQHBhcmFtIHBhdGggQSBwYXRoIHRoYXQgaXMgdHJhbnNmb3JtZWQgdG8gbmF0aXZlIGZvcm1hdC4KK3ZvaWQgbmF0aXZlKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmcGF0aCwgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIEBicmllZiBSZXBsYWNlcyBiYWNrc2xhc2hlcyB3aXRoIHNsYXNoZXMgaWYgV2luZG93cy4KKy8vLworLy8vIEBwYXJhbSBwYXRoIHByb2Nlc3NlZCBwYXRoCisvLy8gQHJlc3VsdCBUaGUgcmVzdWx0IG9mIHJlcGxhY2luZyBiYWNrc2xhc2hlcyB3aXRoIGZvcndhcmQgc2xhc2hlcyBpZiBXaW5kb3dzLgorLy8vIE9uIFVuaXgsIHRoaXMgZnVuY3Rpb24gaXMgYSBuby1vcCBiZWNhdXNlIGJhY2tzbGFzaGVzIGFyZSB2YWxpZCBwYXRoCisvLy8gY2hyYWN0ZXJzLgorc3RkOjpzdHJpbmcgY29udmVydF90b19zbGFzaChTdHJpbmdSZWYgcGF0aCwgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIEB9CisvLy8gQG5hbWUgTGV4aWNhbCBPYnNlcnZlcnMKKy8vLyBAeworCisvLy8gQGJyaWVmIEdldCByb290IG5hbWUuCisvLy8KKy8vLyBAY29kZQorLy8vICAgLy9uZXQvaGVsbG8gPT4gLy9uZXQKKy8vLyAgIGM6L2hlbGxvICAgID0+IGM6IChvbiBXaW5kb3dzLCBvbiBvdGhlciBwbGF0Zm9ybXMgbm90aGluZykKKy8vLyAgIC9oZWxsbyAgICAgID0+IDxlbXB0eT4KKy8vLyBAZW5kY29kZQorLy8vCisvLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmVzdWx0IFRoZSByb290IG5hbWUgb2YgXGEgcGF0aCBpZiBpdCBoYXMgb25lLCBvdGhlcndpc2UgIiIuCitTdHJpbmdSZWYgcm9vdF9uYW1lKFN0cmluZ1JlZiBwYXRoLCBTdHlsZSBzdHlsZSA9IFN0eWxlOjpuYXRpdmUpOworCisvLy8gQGJyaWVmIEdldCByb290IGRpcmVjdG9yeS4KKy8vLworLy8vIEBjb2RlCisvLy8gICAvZ29vL2hlbGxvID0+IC8KKy8vLyAgIGM6L2hlbGxvICAgPT4gLworLy8vICAgZC9maWxlLnR4dCA9PiA8ZW1wdHk+CisvLy8gQGVuZGNvZGUKKy8vLworLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHJlc3VsdCBUaGUgcm9vdCBkaXJlY3Rvcnkgb2YgXGEgcGF0aCBpZiBpdCBoYXMgb25lLCBvdGhlcndpc2UKKy8vLyAgICAgICAgICAgICAgICIiLgorU3RyaW5nUmVmIHJvb3RfZGlyZWN0b3J5KFN0cmluZ1JlZiBwYXRoLCBTdHlsZSBzdHlsZSA9IFN0eWxlOjpuYXRpdmUpOworCisvLy8gQGJyaWVmIEdldCByb290IHBhdGguCisvLy8KKy8vLyBFcXVpdmFsZW50IHRvIHJvb3RfbmFtZSArIHJvb3RfZGlyZWN0b3J5LgorLy8vCisvLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmVzdWx0IFRoZSByb290IHBhdGggb2YgXGEgcGF0aCBpZiBpdCBoYXMgb25lLCBvdGhlcndpc2UgIiIuCitTdHJpbmdSZWYgcm9vdF9wYXRoKFN0cmluZ1JlZiBwYXRoLCBTdHlsZSBzdHlsZSA9IFN0eWxlOjpuYXRpdmUpOworCisvLy8gQGJyaWVmIEdldCByZWxhdGl2ZSBwYXRoLgorLy8vCisvLy8gQGNvZGUKKy8vLyAgIEM6XGhlbGxvXHdvcmxkID0+IGhlbGxvXHdvcmxkCisvLy8gICBmb28vYmFyICAgICAgICA9PiBmb28vYmFyCisvLy8gICAvZm9vL2JhciAgICAgICA9PiBmb28vYmFyCisvLy8gQGVuZGNvZGUKKy8vLworLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHJlc3VsdCBUaGUgcGF0aCBzdGFydGluZyBhZnRlciByb290X3BhdGggaWYgb25lIGV4aXN0cywgb3RoZXJ3aXNlICIiLgorU3RyaW5nUmVmIHJlbGF0aXZlX3BhdGgoU3RyaW5nUmVmIHBhdGgsIFN0eWxlIHN0eWxlID0gU3R5bGU6Om5hdGl2ZSk7CisKKy8vLyBAYnJpZWYgR2V0IHBhcmVudCBwYXRoLgorLy8vCisvLy8gQGNvZGUKKy8vLyAgIC8gICAgICAgICAgPT4gPGVtcHR5PgorLy8vICAgL2ZvbyAgICAgICA9PiAvCisvLy8gICBmb28vLi4vYmFyID0+IGZvby8uLgorLy8vIEBlbmRjb2RlCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEByZXN1bHQgVGhlIHBhcmVudCBwYXRoIG9mIFxhIHBhdGggaWYgb25lIGV4aXN0cywgb3RoZXJ3aXNlICIiLgorU3RyaW5nUmVmIHBhcmVudF9wYXRoKFN0cmluZ1JlZiBwYXRoLCBTdHlsZSBzdHlsZSA9IFN0eWxlOjpuYXRpdmUpOworCisvLy8gQGJyaWVmIEdldCBmaWxlbmFtZS4KKy8vLworLy8vIEBjb2RlCisvLy8gICAvZm9vLnR4dCAgICA9PiBmb28udHh0CisvLy8gICAuICAgICAgICAgID0+IC4KKy8vLyAgIC4uICAgICAgICAgPT4gLi4KKy8vLyAgIC8gICAgICAgICAgPT4gLworLy8vIEBlbmRjb2RlCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEByZXN1bHQgVGhlIGZpbGVuYW1lIHBhcnQgb2YgXGEgcGF0aC4gVGhpcyBpcyBkZWZpbmVkIGFzIHRoZSBsYXN0IGNvbXBvbmVudAorLy8vICAgICAgICAgb2YgXGEgcGF0aC4KK1N0cmluZ1JlZiBmaWxlbmFtZShTdHJpbmdSZWYgcGF0aCwgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIEBicmllZiBHZXQgc3RlbS4KKy8vLworLy8vIElmIGZpbGVuYW1lIGNvbnRhaW5zIGEgZG90IGJ1dCBub3Qgc29sZWx5IG9uZSBvciB0d28gZG90cywgcmVzdWx0IGlzIHRoZQorLy8vIHN1YnN0cmluZyBvZiBmaWxlbmFtZSBlbmRpbmcgYXQgKGJ1dCBub3QgaW5jbHVkaW5nKSB0aGUgbGFzdCBkb3QuIE90aGVyd2lzZQorLy8vIGl0IGlzIGZpbGVuYW1lLgorLy8vCisvLy8gQGNvZGUKKy8vLyAgIC9mb28vYmFyLnR4dCA9PiBiYXIKKy8vLyAgIC9mb28vYmFyICAgICA9PiBiYXIKKy8vLyAgIC9mb28vLnR4dCAgICA9PiA8ZW1wdHk+CisvLy8gICAvZm9vLy4gICAgICAgPT4gLgorLy8vICAgL2Zvby8uLiAgICAgID0+IC4uCisvLy8gQGVuZGNvZGUKKy8vLworLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHJlc3VsdCBUaGUgc3RlbSBvZiBcYSBwYXRoLgorU3RyaW5nUmVmIHN0ZW0oU3RyaW5nUmVmIHBhdGgsIFN0eWxlIHN0eWxlID0gU3R5bGU6Om5hdGl2ZSk7CisKKy8vLyBAYnJpZWYgR2V0IGV4dGVuc2lvbi4KKy8vLworLy8vIElmIGZpbGVuYW1lIGNvbnRhaW5zIGEgZG90IGJ1dCBub3Qgc29sZWx5IG9uZSBvciB0d28gZG90cywgcmVzdWx0IGlzIHRoZQorLy8vIHN1YnN0cmluZyBvZiBmaWxlbmFtZSBzdGFydGluZyBhdCAoYW5kIGluY2x1ZGluZykgdGhlIGxhc3QgZG90LCBhbmQgZW5kaW5nCisvLy8gYXQgdGhlIGVuZCBvZiBcYSBwYXRoLiBPdGhlcndpc2UgIiIuCisvLy8KKy8vLyBAY29kZQorLy8vICAgL2Zvby9iYXIudHh0ID0+IC50eHQKKy8vLyAgIC9mb28vYmFyICAgICA9PiA8ZW1wdHk+CisvLy8gICAvZm9vLy50eHQgICAgPT4gLnR4dAorLy8vIEBlbmRjb2RlCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEByZXN1bHQgVGhlIGV4dGVuc2lvbiBvZiBcYSBwYXRoLgorU3RyaW5nUmVmIGV4dGVuc2lvbihTdHJpbmdSZWYgcGF0aCwgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIEBicmllZiBDaGVjayB3aGV0aGVyIHRoZSBnaXZlbiBjaGFyIGlzIGEgcGF0aCBzZXBhcmF0b3Igb24gdGhlIGhvc3QgT1MuCisvLy8KKy8vLyBAcGFyYW0gdmFsdWUgYSBjaGFyYWN0ZXIKKy8vLyBAcmVzdWx0IHRydWUgaWYgXGEgdmFsdWUgaXMgYSBwYXRoIHNlcGFyYXRvciBjaGFyYWN0ZXIgb24gdGhlIGhvc3QgT1MKK2Jvb2wgaXNfc2VwYXJhdG9yKGNoYXIgdmFsdWUsIFN0eWxlIHN0eWxlID0gU3R5bGU6Om5hdGl2ZSk7CisKKy8vLyBAYnJpZWYgUmV0dXJuIHRoZSBwcmVmZXJyZWQgc2VwYXJhdG9yIGZvciB0aGlzIHBsYXRmb3JtLgorLy8vCisvLy8gQHJlc3VsdCBTdHJpbmdSZWYgb2YgdGhlIHByZWZlcnJlZCBzZXBhcmF0b3IsIG51bGwtdGVybWluYXRlZC4KK1N0cmluZ1JlZiBnZXRfc2VwYXJhdG9yKFN0eWxlIHN0eWxlID0gU3R5bGU6Om5hdGl2ZSk7CisKKy8vLyBAYnJpZWYgR2V0IHRoZSB0eXBpY2FsIHRlbXBvcmFyeSBkaXJlY3RvcnkgZm9yIHRoZSBzeXN0ZW0sIGUuZy4sCisvLy8gIi92YXIvdG1wIiBvciAiQzovVEVNUCIKKy8vLworLy8vIEBwYXJhbSBlcmFzZWRPblJlYm9vdCBXaGV0aGVyIHRvIGZhdm9yIGEgcGF0aCB0aGF0IGlzIGVyYXNlZCBvbiByZWJvb3QKKy8vLyByYXRoZXIgdGhhbiBvbmUgdGhhdCBwb3RlbnRpYWxseSBwZXJzaXN0cyBsb25nZXIuIFRoaXMgcGFyYW1ldGVyIHdpbGwgYmUKKy8vLyBpZ25vcmVkIGlmIHRoZSB1c2VyIG9yIHN5c3RlbSBoYXMgc2V0IHRoZSB0eXBpY2FsIGVudmlyb25tZW50IHZhcmlhYmxlCisvLy8gKGUuZy4sIFRFTVAgb24gV2luZG93cywgVE1QRElSIG9uICpuaXgpIHRvIHNwZWNpZnkgYSB0ZW1wb3JhcnkgZGlyZWN0b3J5LgorLy8vCisvLy8gQHBhcmFtIHJlc3VsdCBIb2xkcyB0aGUgcmVzdWx0aW5nIHBhdGggbmFtZS4KK3ZvaWQgc3lzdGVtX3RlbXBfZGlyZWN0b3J5KGJvb2wgZXJhc2VkT25SZWJvb3QsIFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmcmVzdWx0KTsKKworLy8vIEBicmllZiBHZXQgdGhlIHVzZXIncyBob21lIGRpcmVjdG9yeS4KKy8vLworLy8vIEBwYXJhbSByZXN1bHQgSG9sZHMgdGhlIHJlc3VsdGluZyBwYXRoIG5hbWUuCisvLy8gQHJlc3VsdCBUcnVlIGlmIGEgaG9tZSBkaXJlY3RvcnkgaXMgc2V0LCBmYWxzZSBvdGhlcndpc2UuCitib29sIGhvbWVfZGlyZWN0b3J5KFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmcmVzdWx0KTsKKworLy8vIEBicmllZiBHZXQgdGhlIHVzZXIncyBjYWNoZSBkaXJlY3RvcnkuCisvLy8KKy8vLyBFeHBlY3QgdGhlIHJlc3VsdGluZyBwYXRoIHRvIGJlIGEgZGlyZWN0b3J5IHNoYXJlZCB3aXRoIG90aGVyCisvLy8gYXBwbGljYXRpb25zL3NlcnZpY2VzIHVzZWQgYnkgdGhlIHVzZXIuIFBhcmFtcyBccCBQYXRoMSB0byBccCBQYXRoMyBjYW4gYmUKKy8vLyB1c2VkIHRvIGFwcGVuZCBhZGRpdGlvbmFsIGRpcmVjdG9yeSBuYW1lcyB0byB0aGUgcmVzdWx0aW5nIHBhdGguIFJlY29tbWVuZGVkCisvLy8gcGF0dGVybiBpcyA8dXNlcl9jYWNoZV9kaXJlY3Rvcnk+Lzx2ZW5kb3I+LzxhcHBsaWNhdGlvbj4uCisvLy8KKy8vLyBAcGFyYW0gUmVzdWx0IEhvbGRzIHRoZSByZXN1bHRpbmcgcGF0aC4KKy8vLyBAcGFyYW0gUGF0aDEgQWRkaXRpb25hbCBwYXRoIHRvIGJlIGFwcGVuZGVkIHRvIHRoZSB1c2VyJ3MgY2FjaGUgZGlyZWN0b3J5CisvLy8gcGF0aC4gIiIgY2FuIGJlIHVzZWQgdG8gYXBwZW5kIG5vdGhpbmcuCisvLy8gQHBhcmFtIFBhdGgyIFNlY29uZCBhZGRpdGlvbmFsIHBhdGggdG8gYmUgYXBwZW5kZWQuCisvLy8gQHBhcmFtIFBhdGgzIFRoaXJkIGFkZGl0aW9uYWwgcGF0aCB0byBiZSBhcHBlbmRlZC4KKy8vLyBAcmVzdWx0IFRydWUgaWYgYSBjYWNoZSBkaXJlY3RvcnkgcGF0aCBpcyBzZXQsIGZhbHNlIG90aGVyd2lzZS4KK2Jvb2wgdXNlcl9jYWNoZV9kaXJlY3RvcnkoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZSZXN1bHQsIGNvbnN0IFR3aW5lICZQYXRoMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJlBhdGgyID0gIiIsIGNvbnN0IFR3aW5lICZQYXRoMyA9ICIiKTsKKworLy8vIEBicmllZiBIYXMgcm9vdCBuYW1lPworLy8vCisvLy8gcm9vdF9uYW1lICE9ICIiCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEByZXN1bHQgVHJ1ZSBpZiB0aGUgcGF0aCBoYXMgYSByb290IG5hbWUsIGZhbHNlIG90aGVyd2lzZS4KK2Jvb2wgaGFzX3Jvb3RfbmFtZShjb25zdCBUd2luZSAmcGF0aCwgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIEBicmllZiBIYXMgcm9vdCBkaXJlY3Rvcnk/CisvLy8KKy8vLyByb290X2RpcmVjdG9yeSAhPSAiIgorLy8vCisvLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmVzdWx0IFRydWUgaWYgdGhlIHBhdGggaGFzIGEgcm9vdCBkaXJlY3RvcnksIGZhbHNlIG90aGVyd2lzZS4KK2Jvb2wgaGFzX3Jvb3RfZGlyZWN0b3J5KGNvbnN0IFR3aW5lICZwYXRoLCBTdHlsZSBzdHlsZSA9IFN0eWxlOjpuYXRpdmUpOworCisvLy8gQGJyaWVmIEhhcyByb290IHBhdGg/CisvLy8KKy8vLyByb290X3BhdGggIT0gIiIKKy8vLworLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHJlc3VsdCBUcnVlIGlmIHRoZSBwYXRoIGhhcyBhIHJvb3QgcGF0aCwgZmFsc2Ugb3RoZXJ3aXNlLgorYm9vbCBoYXNfcm9vdF9wYXRoKGNvbnN0IFR3aW5lICZwYXRoLCBTdHlsZSBzdHlsZSA9IFN0eWxlOjpuYXRpdmUpOworCisvLy8gQGJyaWVmIEhhcyByZWxhdGl2ZSBwYXRoPworLy8vCisvLy8gcmVsYXRpdmVfcGF0aCAhPSAiIgorLy8vCisvLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmVzdWx0IFRydWUgaWYgdGhlIHBhdGggaGFzIGEgcmVsYXRpdmUgcGF0aCwgZmFsc2Ugb3RoZXJ3aXNlLgorYm9vbCBoYXNfcmVsYXRpdmVfcGF0aChjb25zdCBUd2luZSAmcGF0aCwgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIEBicmllZiBIYXMgcGFyZW50IHBhdGg/CisvLy8KKy8vLyBwYXJlbnRfcGF0aCAhPSAiIgorLy8vCisvLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmVzdWx0IFRydWUgaWYgdGhlIHBhdGggaGFzIGEgcGFyZW50IHBhdGgsIGZhbHNlIG90aGVyd2lzZS4KK2Jvb2wgaGFzX3BhcmVudF9wYXRoKGNvbnN0IFR3aW5lICZwYXRoLCBTdHlsZSBzdHlsZSA9IFN0eWxlOjpuYXRpdmUpOworCisvLy8gQGJyaWVmIEhhcyBmaWxlbmFtZT8KKy8vLworLy8vIGZpbGVuYW1lICE9ICIiCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEByZXN1bHQgVHJ1ZSBpZiB0aGUgcGF0aCBoYXMgYSBmaWxlbmFtZSwgZmFsc2Ugb3RoZXJ3aXNlLgorYm9vbCBoYXNfZmlsZW5hbWUoY29uc3QgVHdpbmUgJnBhdGgsIFN0eWxlIHN0eWxlID0gU3R5bGU6Om5hdGl2ZSk7CisKKy8vLyBAYnJpZWYgSGFzIHN0ZW0/CisvLy8KKy8vLyBzdGVtICE9ICIiCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEByZXN1bHQgVHJ1ZSBpZiB0aGUgcGF0aCBoYXMgYSBzdGVtLCBmYWxzZSBvdGhlcndpc2UuCitib29sIGhhc19zdGVtKGNvbnN0IFR3aW5lICZwYXRoLCBTdHlsZSBzdHlsZSA9IFN0eWxlOjpuYXRpdmUpOworCisvLy8gQGJyaWVmIEhhcyBleHRlbnNpb24/CisvLy8KKy8vLyBleHRlbnNpb24gIT0gIiIKKy8vLworLy8vIEBwYXJhbSBwYXRoIElucHV0IHBhdGguCisvLy8gQHJlc3VsdCBUcnVlIGlmIHRoZSBwYXRoIGhhcyBhIGV4dGVuc2lvbiwgZmFsc2Ugb3RoZXJ3aXNlLgorYm9vbCBoYXNfZXh0ZW5zaW9uKGNvbnN0IFR3aW5lICZwYXRoLCBTdHlsZSBzdHlsZSA9IFN0eWxlOjpuYXRpdmUpOworCisvLy8gQGJyaWVmIElzIHBhdGggYWJzb2x1dGU/CisvLy8KKy8vLyBAcGFyYW0gcGF0aCBJbnB1dCBwYXRoLgorLy8vIEByZXN1bHQgVHJ1ZSBpZiB0aGUgcGF0aCBpcyBhYnNvbHV0ZSwgZmFsc2UgaWYgaXQgaXMgbm90LgorYm9vbCBpc19hYnNvbHV0ZShjb25zdCBUd2luZSAmcGF0aCwgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworLy8vIEBicmllZiBJcyBwYXRoIHJlbGF0aXZlPworLy8vCisvLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmVzdWx0IFRydWUgaWYgdGhlIHBhdGggaXMgcmVsYXRpdmUsIGZhbHNlIGlmIGl0IGlzIG5vdC4KK2Jvb2wgaXNfcmVsYXRpdmUoY29uc3QgVHdpbmUgJnBhdGgsIFN0eWxlIHN0eWxlID0gU3R5bGU6Om5hdGl2ZSk7CisKKy8vLyBAYnJpZWYgUmVtb3ZlIHJlZHVuZGFudCBsZWFkaW5nICIuLyIgcGllY2VzIGFuZCBjb25zZWN1dGl2ZSBzZXBhcmF0b3JzLgorLy8vCisvLy8gQHBhcmFtIHBhdGggSW5wdXQgcGF0aC4KKy8vLyBAcmVzdWx0IFRoZSBjbGVhbmVkLXVwIFxhIHBhdGguCitTdHJpbmdSZWYgcmVtb3ZlX2xlYWRpbmdfZG90c2xhc2goU3RyaW5nUmVmIHBhdGgsIFN0eWxlIHN0eWxlID0gU3R5bGU6Om5hdGl2ZSk7CisKKy8vLyBAYnJpZWYgSW4tcGxhY2UgcmVtb3ZlIGFueSAnLi8nIGFuZCBvcHRpb25hbGx5ICcuLi8nIGNvbXBvbmVudHMgZnJvbSBhIHBhdGguCisvLy8KKy8vLyBAcGFyYW0gcGF0aCBwcm9jZXNzZWQgcGF0aAorLy8vIEBwYXJhbSByZW1vdmVfZG90X2RvdCBzcGVjaWZ5IGlmICcuLi8nIChleGNlcHQgZm9yIGxlYWRpbmcgIi4uLyIpIHNob3VsZCBiZQorLy8vIHJlbW92ZWQKKy8vLyBAcmVzdWx0IFRydWUgaWYgcGF0aCB3YXMgY2hhbmdlZAorYm9vbCByZW1vdmVfZG90cyhTbWFsbFZlY3RvckltcGw8Y2hhcj4gJnBhdGgsIGJvb2wgcmVtb3ZlX2RvdF9kb3QgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgU3R5bGUgc3R5bGUgPSBTdHlsZTo6bmF0aXZlKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHBhdGgKK30gLy8gZW5kIG5hbWVzcGFjZSBzeXMKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1BsdWdpbkxvYWRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1BsdWdpbkxvYWRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkYmIxMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUGx1Z2luTG9hZGVyLmgKQEAgLTAsMCArMSwzNyBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvUGx1Z2luTG9hZGVyLmggLSBQbHVnaW4gTG9hZGVyIGZvciBUb29scyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBBIHRvb2wgY2FuICNpbmNsdWRlIHRoaXMgZmlsZSB0byBnZXQgYSAtbG9hZCBvcHRpb24gdGhhdCBhbGxvd3MgdGhlIHVzZXIgdG8KKy8vIGxvYWQgYXJiaXRyYXJ5IHNoYXJlZCBvYmplY3RzIGludG8gdGhlIHRvb2wncyBhZGRyZXNzIHNwYWNlLiAgTm90ZSB0aGF0IHRoaXMKKy8vIGhlYWRlciBjYW4gb25seSBiZSBpbmNsdWRlZCBieSBhIHByb2dyYW0gT05DRSwgc28gaXQgc2hvdWxkIG5ldmVyIHRvIHVzZWQgYnkKKy8vIGxpYnJhcnkgYXV0aG9ycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9QTFVHSU5MT0FERVJfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfUExVR0lOTE9BREVSX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21tYW5kTGluZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIHN0cnVjdCBQbHVnaW5Mb2FkZXIgeworICAgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHN0ZDo6c3RyaW5nICZGaWxlbmFtZSk7CisgICAgc3RhdGljIHVuc2lnbmVkIGdldE51bVBsdWdpbnMoKTsKKyAgICBzdGF0aWMgc3RkOjpzdHJpbmcmIGdldFBsdWdpbih1bnNpZ25lZCBudW0pOworICB9OworCisjaWZuZGVmIERPTlRfR0VUX1BMVUdJTl9MT0FERVJfT1BUSU9OCisgIC8vIFRoaXMgY2F1c2VzIG9wZXJhdG9yPSBhYm92ZSB0byBiZSBpbnZva2VkIGZvciBldmVyeSAtbG9hZCBvcHRpb24uCisgIHN0YXRpYyBjbDo6b3B0PFBsdWdpbkxvYWRlciwgZmFsc2UsIGNsOjpwYXJzZXI8c3RkOjpzdHJpbmc+ID4KKyAgICBMb2FkT3B0KCJsb2FkIiwgY2w6Olplcm9Pck1vcmUsIGNsOjp2YWx1ZV9kZXNjKCJwbHVnaW5maWxlbmFtZSIpLAorICAgICAgICAgICAgY2w6OmRlc2MoIkxvYWQgdGhlIHNwZWNpZmllZCBwbHVnaW4iKSk7CisjZW5kaWYKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUG9pbnRlckxpa2VUeXBlVHJhaXRzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUG9pbnRlckxpa2VUeXBlVHJhaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk0MjMwZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Qb2ludGVyTGlrZVR5cGVUcmFpdHMuaApAQCAtMCwwICsxLDExNiBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9Qb2ludGVyTGlrZVR5cGVUcmFpdHMuaCAtIFBvaW50ZXIgVHJhaXRzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgUG9pbnRlckxpa2VUeXBlVHJhaXRzIGNsYXNzLiAgVGhpcyBhbGxvd3MgZGF0YQorLy8gc3RydWN0dXJlcyB0byByZWFzb24gYWJvdXQgcG9pbnRlcnMgYW5kIG90aGVyIHRoaW5ncyB0aGF0IGFyZSBwb2ludGVyIHNpemVkLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1BPSU5URVJMSUtFVFlQRVRSQUlUU19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9QT0lOVEVSTElLRVRZUEVUUkFJVFNfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBIHRyYWl0cyB0eXBlIHRoYXQgaXMgdXNlZCB0byBoYW5kbGUgcG9pbnRlciB0eXBlcyBhbmQgdGhpbmdzIHRoYXQgYXJlIGp1c3QKKy8vLyB3cmFwcGVycyBmb3IgcG9pbnRlcnMgYXMgYSB1bmlmb3JtIGVudGl0eS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgUG9pbnRlckxpa2VUeXBlVHJhaXRzOworCituYW1lc3BhY2UgZGV0YWlsIHsKKy8vLyBBIHRpbnkgbWV0YSBmdW5jdGlvbiB0byBjb21wdXRlIHRoZSBsb2cyIG9mIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50LgordGVtcGxhdGUgPHNpemVfdCBOPgorc3RydWN0IENvbnN0YW50TG9nMgorICAgIDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIENvbnN0YW50TG9nMjxOIC8gMj46OnZhbHVlICsgMT4ge307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgQ29uc3RhbnRMb2cyPDE+IDogc3RkOjppbnRlZ3JhbF9jb25zdGFudDxzaXplX3QsIDA+IHt9OworCisvLyBQcm92aWRlIGEgdHJhaXQgdG8gY2hlY2sgaWYgVCBpcyBwb2ludGVyLWxpa2UuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVSA9IHZvaWQ+IHN0cnVjdCBIYXNQb2ludGVyTGlrZVR5cGVUcmFpdHMgeworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGZhbHNlOworfTsKKworLy8gc2l6ZW9mKFQpIGlzIHZhbGlkIG9ubHkgZm9yIGEgY29tcGxldGUgVC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgSGFzUG9pbnRlckxpa2VUeXBlVHJhaXRzPAorICBULCBkZWNsdHlwZSgoc2l6ZW9mKFBvaW50ZXJMaWtlVHlwZVRyYWl0czxUPikgKyBzaXplb2YoVCkpLCB2b2lkKCkpPiB7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgSXNQb2ludGVyTGlrZSB7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gSGFzUG9pbnRlckxpa2VUeXBlVHJhaXRzPFQ+Ojp2YWx1ZTsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgSXNQb2ludGVyTGlrZTxUICo+IHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSB0cnVlOworfTsKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorCisvLyBQcm92aWRlIFBvaW50ZXJMaWtlVHlwZVRyYWl0cyBmb3Igbm9uLWN2ciBwb2ludGVycy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgUG9pbnRlckxpa2VUeXBlVHJhaXRzPFQgKj4geworICBzdGF0aWMgaW5saW5lIHZvaWQgKmdldEFzVm9pZFBvaW50ZXIoVCAqUCkgeyByZXR1cm4gUDsgfQorICBzdGF0aWMgaW5saW5lIFQgKmdldEZyb21Wb2lkUG9pbnRlcih2b2lkICpQKSB7IHJldHVybiBzdGF0aWNfY2FzdDxUICo+KFApOyB9CisKKyAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSBkZXRhaWw6OkNvbnN0YW50TG9nMjxhbGlnbm9mKFQpPjo6dmFsdWUgfTsKK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBQb2ludGVyTGlrZVR5cGVUcmFpdHM8dm9pZCAqPiB7CisgIHN0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0QXNWb2lkUG9pbnRlcih2b2lkICpQKSB7IHJldHVybiBQOyB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCAqZ2V0RnJvbVZvaWRQb2ludGVyKHZvaWQgKlApIHsgcmV0dXJuIFA7IH0KKworICAvLy8gTm90ZSwgd2UgYXNzdW1lIGhlcmUgdGhhdCB2b2lkKiBpcyByZWxhdGVkIHRvIHJhdyBtYWxsb2MnZWQgbWVtb3J5IGFuZAorICAvLy8gdGhhdCBtYWxsb2MgcmV0dXJucyBvYmplY3RzIGF0IGxlYXN0IDQtYnl0ZSBhbGlnbmVkLiBIb3dldmVyLCB0aGlzIG1heSBiZQorICAvLy8gd3JvbmcsIG9yIHBvaW50ZXJzIG1heSBiZSBmcm9tIHNvbWV0aGluZyBvdGhlciB0aGFuIG1hbGxvYy4gSW4gdGhpcyBjYXNlLAorICAvLy8geW91IHNob3VsZCBzcGVjaWZ5IGEgcmVhbCB0eXBlZCBwb2ludGVyIG9yIGF2b2lkIHRoaXMgdGVtcGxhdGUuCisgIC8vLworICAvLy8gQWxsIGNsaWVudHMgc2hvdWxkIHVzZSBhc3NlcnRpb25zIHRvIGRvIGEgcnVuLXRpbWUgY2hlY2sgdG8gZW5zdXJlIHRoYXQKKyAgLy8vIHRoaXMgaXMgYWN0dWFsbHkgdHJ1ZS4KKyAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSAyIH07Cit9OworCisvLyBQcm92aWRlIFBvaW50ZXJMaWtlVHlwZVRyYWl0cyBmb3IgY29uc3QgdGhpbmdzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBQb2ludGVyTGlrZVR5cGVUcmFpdHM8Y29uc3QgVD4geworICB0eXBlZGVmIFBvaW50ZXJMaWtlVHlwZVRyYWl0czxUPiBOb25Db25zdDsKKworICBzdGF0aWMgaW5saW5lIGNvbnN0IHZvaWQgKmdldEFzVm9pZFBvaW50ZXIoY29uc3QgVCBQKSB7CisgICAgcmV0dXJuIE5vbkNvbnN0OjpnZXRBc1ZvaWRQb2ludGVyKFApOworICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgVCBnZXRGcm9tVm9pZFBvaW50ZXIoY29uc3Qgdm9pZCAqUCkgeworICAgIHJldHVybiBOb25Db25zdDo6Z2V0RnJvbVZvaWRQb2ludGVyKGNvbnN0X2Nhc3Q8dm9pZCAqPihQKSk7CisgIH0KKyAgZW51bSB7IE51bUxvd0JpdHNBdmFpbGFibGUgPSBOb25Db25zdDo6TnVtTG93Qml0c0F2YWlsYWJsZSB9OworfTsKKworLy8gUHJvdmlkZSBQb2ludGVyTGlrZVR5cGVUcmFpdHMgZm9yIGNvbnN0IHBvaW50ZXJzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBQb2ludGVyTGlrZVR5cGVUcmFpdHM8Y29uc3QgVCAqPiB7CisgIHR5cGVkZWYgUG9pbnRlckxpa2VUeXBlVHJhaXRzPFQgKj4gTm9uQ29uc3Q7CisKKyAgc3RhdGljIGlubGluZSBjb25zdCB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKGNvbnN0IFQgKlApIHsKKyAgICByZXR1cm4gTm9uQ29uc3Q6OmdldEFzVm9pZFBvaW50ZXIoY29uc3RfY2FzdDxUICo+KFApKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IFQgKmdldEZyb21Wb2lkUG9pbnRlcihjb25zdCB2b2lkICpQKSB7CisgICAgcmV0dXJuIE5vbkNvbnN0OjpnZXRGcm9tVm9pZFBvaW50ZXIoY29uc3RfY2FzdDx2b2lkICo+KFApKTsKKyAgfQorICBlbnVtIHsgTnVtTG93Qml0c0F2YWlsYWJsZSA9IE5vbkNvbnN0OjpOdW1Mb3dCaXRzQXZhaWxhYmxlIH07Cit9OworCisvLyBQcm92aWRlIFBvaW50ZXJMaWtlVHlwZVRyYWl0cyBmb3IgdWludHB0cl90LgordGVtcGxhdGUgPD4gc3RydWN0IFBvaW50ZXJMaWtlVHlwZVRyYWl0czx1aW50cHRyX3Q+IHsKKyAgc3RhdGljIGlubGluZSB2b2lkICpnZXRBc1ZvaWRQb2ludGVyKHVpbnRwdHJfdCBQKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPihQKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIHVpbnRwdHJfdCBnZXRGcm9tVm9pZFBvaW50ZXIodm9pZCAqUCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oUCk7CisgIH0KKyAgLy8gTm8gYml0cyBhcmUgYXZhaWxhYmxlIQorICBlbnVtIHsgTnVtTG93Qml0c0F2YWlsYWJsZSA9IDAgfTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1ByZXR0eVN0YWNrVHJhY2UuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9QcmV0dHlTdGFja1RyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQ2NGZlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9QcmV0dHlTdGFja1RyYWNlLmgKQEAgLTAsMCArMSw5NiBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9QcmV0dHlTdGFja1RyYWNlLmggLSBQcmV0dHkgQ3Jhc2ggSGFuZGxpbmcgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgUHJldHR5U3RhY2tUcmFjZUVudHJ5IGNsYXNzLCB3aGljaCBpcyB1c2VkIHRvIG1ha2UKKy8vIGNyYXNoZXMgZ2l2ZSBtb3JlIGNvbnRleHR1YWwgaW5mb3JtYXRpb24gYWJvdXQgd2hhdCB0aGUgcHJvZ3JhbSB3YXMgZG9pbmcKKy8vIHdoZW4gaXQgY3Jhc2hlZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9QUkVUVFlTVEFDS1RSQUNFX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1BSRVRUWVNUQUNLVFJBQ0VfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyByYXdfb3N0cmVhbTsKKworICB2b2lkIEVuYWJsZVByZXR0eVN0YWNrVHJhY2UoKTsKKworICAvLy8gUHJldHR5U3RhY2tUcmFjZUVudHJ5IC0gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlcHJlc2VudCBhIGZyYW1lIG9mIHRoZQorICAvLy8gInByZXR0eSIgc3RhY2sgdHJhY2UgdGhhdCBpcyBkdW1wZWQgd2hlbiBhIHByb2dyYW0gY3Jhc2hlcy4gWW91IGNhbiBkZWZpbmUKKyAgLy8vIHN1YmNsYXNzZXMgb2YgdGhpcyBhbmQgZGVjbGFyZSB0aGVtIG9uIHRoZSBwcm9ncmFtIHN0YWNrOiB3aGVuIHRoZXkgYXJlCisgIC8vLyBjb25zdHJ1Y3RlZCBhbmQgZGVzdHJ1Y3RlZCwgdGhleSB3aWxsIGFkZCB0aGVpciBzeW1ib2xpYyBmcmFtZXMgdG8gYQorICAvLy8gdmlydHVhbCBzdGFjayB0cmFjZS4gIFRoaXMgZ2V0cyBkdW1wZWQgb3V0IGlmIHRoZSBwcm9ncmFtIGNyYXNoZXMuCisgIGNsYXNzIFByZXR0eVN0YWNrVHJhY2VFbnRyeSB7CisgICAgZnJpZW5kIFByZXR0eVN0YWNrVHJhY2VFbnRyeSAqUmV2ZXJzZVN0YWNrVHJhY2UoUHJldHR5U3RhY2tUcmFjZUVudHJ5ICopOworCisgICAgUHJldHR5U3RhY2tUcmFjZUVudHJ5ICpOZXh0RW50cnk7CisgICAgUHJldHR5U3RhY2tUcmFjZUVudHJ5KGNvbnN0IFByZXR0eVN0YWNrVHJhY2VFbnRyeSAmKSA9IGRlbGV0ZTsKKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBQcmV0dHlTdGFja1RyYWNlRW50cnkgJikgPSBkZWxldGU7CisgIHB1YmxpYzoKKyAgICBQcmV0dHlTdGFja1RyYWNlRW50cnkoKTsKKyAgICB2aXJ0dWFsIH5QcmV0dHlTdGFja1RyYWNlRW50cnkoKTsKKworICAgIC8vLyBwcmludCAtIEVtaXQgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzdGFjayBmcmFtZSB0byBPUy4KKyAgICB2aXJ0dWFsIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCA9IDA7CisKKyAgICAvLy8gZ2V0TmV4dEVudHJ5IC0gUmV0dXJuIHRoZSBuZXh0IGVudHJ5IGluIHRoZSBsaXN0IG9mIGZyYW1lcy4KKyAgICBjb25zdCBQcmV0dHlTdGFja1RyYWNlRW50cnkgKmdldE5leHRFbnRyeSgpIGNvbnN0IHsgcmV0dXJuIE5leHRFbnRyeTsgfQorICB9OworCisgIC8vLyBQcmV0dHlTdGFja1RyYWNlU3RyaW5nIC0gVGhpcyBvYmplY3QgcHJpbnRzIGEgc3BlY2lmaWVkIHN0cmluZyAod2hpY2gKKyAgLy8vIHNob3VsZCBub3QgY29udGFpbiBuZXdsaW5lcykgdG8gdGhlIHN0cmVhbSBhcyB0aGUgc3RhY2sgdHJhY2Ugd2hlbiBhIGNyYXNoCisgIC8vLyBvY2N1cnMuCisgIGNsYXNzIFByZXR0eVN0YWNrVHJhY2VTdHJpbmcgOiBwdWJsaWMgUHJldHR5U3RhY2tUcmFjZUVudHJ5IHsKKyAgICBjb25zdCBjaGFyICpTdHI7CisgIHB1YmxpYzoKKyAgICBQcmV0dHlTdGFja1RyYWNlU3RyaW5nKGNvbnN0IGNoYXIgKnN0cikgOiBTdHIoc3RyKSB7fQorICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZTsKKyAgfTsKKworICAvLy8gUHJldHR5U3RhY2tUcmFjZUZvcm1hdCAtIFRoaXMgb2JqZWN0IHByaW50cyBhIHN0cmluZyAod2hpY2ggbWF5IHVzZQorICAvLy8gcHJpbnRmLXN0eWxlIGZvcm1hdHRpbmcgYnV0IHNob3VsZCBub3QgY29udGFpbiBuZXdsaW5lcykgdG8gdGhlIHN0cmVhbQorICAvLy8gYXMgdGhlIHN0YWNrIHRyYWNlIHdoZW4gYSBjcmFzaCBvY2N1cnMuCisgIGNsYXNzIFByZXR0eVN0YWNrVHJhY2VGb3JtYXQgOiBwdWJsaWMgUHJldHR5U3RhY2tUcmFjZUVudHJ5IHsKKyAgICBsbHZtOjpTbWFsbFZlY3RvcjxjaGFyLCAzMj4gU3RyOworICBwdWJsaWM6CisgICAgUHJldHR5U3RhY2tUcmFjZUZvcm1hdChjb25zdCBjaGFyICpGb3JtYXQsIC4uLik7CisgICAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0IG92ZXJyaWRlOworICB9OworCisgIC8vLyBQcmV0dHlTdGFja1RyYWNlUHJvZ3JhbSAtIFRoaXMgb2JqZWN0IHByaW50cyBhIHNwZWNpZmllZCBwcm9ncmFtIGFyZ3VtZW50cworICAvLy8gdG8gdGhlIHN0cmVhbSBhcyB0aGUgc3RhY2sgdHJhY2Ugd2hlbiBhIGNyYXNoIG9jY3Vycy4KKyAgY2xhc3MgUHJldHR5U3RhY2tUcmFjZVByb2dyYW0gOiBwdWJsaWMgUHJldHR5U3RhY2tUcmFjZUVudHJ5IHsKKyAgICBpbnQgQXJnQzsKKyAgICBjb25zdCBjaGFyICpjb25zdCAqQXJnVjsKKyAgcHVibGljOgorICAgIFByZXR0eVN0YWNrVHJhY2VQcm9ncmFtKGludCBhcmdjLCBjb25zdCBjaGFyICogY29uc3QqYXJndikKKyAgICAgIDogQXJnQyhhcmdjKSwgQXJnVihhcmd2KSB7CisgICAgICBFbmFibGVQcmV0dHlTdGFja1RyYWNlKCk7CisgICAgfQorICAgIHZvaWQgcHJpbnQocmF3X29zdHJlYW0gJk9TKSBjb25zdCBvdmVycmlkZTsKKyAgfTsKKworICAvLy8gUmV0dXJucyB0aGUgdG9wbW9zdCBlbGVtZW50IG9mIHRoZSAicHJldHR5IiBzdGFjayBzdGF0ZS4KKyAgY29uc3Qgdm9pZCAqU2F2ZVByZXR0eVN0YWNrU3RhdGUoKTsKKworICAvLy8gUmVzdG9yZXMgdGhlIHRvcG1vc3QgZWxlbWVudCBvZiB0aGUgInByZXR0eSIgc3RhY2sgc3RhdGUgdG8gU3RhdGUsIHdoaWNoCisgIC8vLyBzaG91bGQgY29tZSBmcm9tIGEgcHJldmlvdXMgY2FsbCB0byBTYXZlUHJldHR5U3RhY2tTdGF0ZSgpLiAgVGhpcyBpcworICAvLy8gdXNlZnVsIHdoZW4gdXNpbmcgYSBDcmFzaFJlY292ZXJ5Q29udGV4dCBpbiBjb2RlIHRoYXQgYWxzbyB1c2VzCisgIC8vLyBQcmV0dHlTdGFja1RyYWNlRW50cmllcywgdG8gbWFrZSBzdXJlIHRoZSBzdGFjayB0aGF0J3MgcHJpbnRlZCBpZiBhIGNyYXNoCisgIC8vLyBoYXBwZW5zIGFmdGVyIGEgY3Jhc2ggdGhhdCdzIGJlZW4gcmVjb3ZlcmVkIGJ5IENyYXNoUmVjb3ZlcnlDb250ZXh0CisgIC8vLyBkb2Vzbid0IGhhdmUgZnJhbWVzIG9uIGl0IHRoYXQgd2VyZSBhZGRlZCBpbiBjb2RlIHVud291bmQgYnkgdGhlCisgIC8vLyBDcmFzaFJlY292ZXJ5Q29udGV4dC4KKyAgdm9pZCBSZXN0b3JlUHJldHR5U3RhY2tTdGF0ZShjb25zdCB2b2lkICpTdGF0ZSk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1ByaW50YWJsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1ByaW50YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNTVkNDEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUHJpbnRhYmxlLmgKQEAgLTAsMCArMSw1MiBAQAorLy89PT0tLS0gUHJpbnRhYmxlLmggLSBQcmludCBmdW5jdGlvbiBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIFByaW50YWJsZSBzdHJ1Y3QuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfUFJJTlRBQkxFX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1BSSU5UQUJMRV9ICisKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gU2ltcGxlIHdyYXBwZXIgYXJvdW5kIHN0ZDo6ZnVuY3Rpb248dm9pZChyYXdfb3N0cmVhbSYpPi4KKy8vLyBUaGlzIGNsYXNzIGlzIHVzZWZ1bCB0byBjb25zdHJ1Y3QgcHJpbnQgaGVscGVycyBmb3IgcmF3X29zdHJlYW0uCisvLy8KKy8vLyBFeGFtcGxlOgorLy8vICAgICBQcmludGFibGUgUHJpbnRSZWdpc3Rlcih1bnNpZ25lZCBSZWdpc3RlcikgeworLy8vICAgICAgIHJldHVybiBQcmludGFibGUoW1JlZ2lzdGVyXShyYXdfb3N0cmVhbSAmT1MpIHsKKy8vLyAgICAgICAgIE9TIDw8IGdldFJlZ2lzdGVyTmFtZShSZWdpc3Rlcik7CisvLy8gICAgICAgfQorLy8vICAgICB9CisvLy8gICAgIC4uLiBPUyA8PCBQcmludFJlZ2lzdGVyKFJlZ2lzdGVyKTsgLi4uCisvLy8KKy8vLyBJbXBsZW1lbnRhdGlvbiBub3RlOiBJZGVhbGx5IHRoaXMgd291bGQganVzdCBiZSBhIHR5cGVkZWYsIGJ1dCBkb2luZyBzbworLy8vIGxlYWRzIHRvIG9wZXJhdG9yIDw8IGJlaW5nIGFtYmlndW91cyBhcyBmdW5jdGlvbiBoYXMgbWF0Y2hpbmcgY29uc3RydWN0b3JzCisvLy8gaW4gc29tZSBTVEwgdmVyc2lvbnMuIEkgaGF2ZSBzZWVuIHRoZSBwcm9ibGVtIG9uIGdjYyA0LjYgbGlic3RkYysrIGFuZAorLy8vIG1pY3Jvc29mdCBTVEwuCitjbGFzcyBQcmludGFibGUgeworcHVibGljOgorICBzdGQ6OmZ1bmN0aW9uPHZvaWQocmF3X29zdHJlYW0gJk9TKT4gUHJpbnQ7CisgIFByaW50YWJsZShzdGQ6OmZ1bmN0aW9uPHZvaWQocmF3X29zdHJlYW0gJk9TKT4gUHJpbnQpCisgICAgICA6IFByaW50KHN0ZDo6bW92ZShQcmludCkpIHt9Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBQcmludGFibGUgJlApIHsKKyAgUC5QcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Qcm9jZXNzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUHJvY2Vzcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgyYjBkOWYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUHJvY2Vzcy5oCkBAIC0wLDAgKzEsMjAwIEBACisvLz09PS0gbGx2bS9TdXBwb3J0L1Byb2Nlc3MuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8KKy8vLyBQcm92aWRlcyBhIGxpYnJhcnkgZm9yIGFjY2Vzc2luZyBpbmZvcm1hdGlvbiBhYm91dCB0aGlzIHByb2Nlc3MgYW5kIG90aGVyCisvLy8gcHJvY2Vzc2VzIG9uIHRoZSBvcGVyYXRpbmcgc3lzdGVtLiBBbHNvIHByb3ZpZGVzIG1lYW5zIG9mIHNwYXduaW5nCisvLy8gc3VicHJvY2VzcyBmb3IgY29tbWFuZHMuIFRoZSBkZXNpZ24gb2YgdGhpcyBsaWJyYXJ5IGlzIG1vZGVsZWQgYWZ0ZXIgdGhlCisvLy8gcHJvcG9zZWQgZGVzaWduIG9mIHRoZSBCb29zdC5Qcm9jZXNzIGxpYnJhcnksIGFuZCBpcyBkZXNpZ24gc3BlY2lmaWNhbGx5IHRvCisvLy8gZm9sbG93IHRoZSBzdHlsZSBvZiBzdGFuZGFyZCBsaWJyYXJpZXMgYW5kIHBvdGVudGlhbGx5IGJlY29tZSBhIHByb3Bvc2FsCisvLy8gZm9yIGEgc3RhbmRhcmQgbGlicmFyeS4KKy8vLworLy8vIFRoaXMgZmlsZSBkZWNsYXJlcyB0aGUgbGx2bTo6c3lzOjpQcm9jZXNzIGNsYXNzIHdoaWNoIGNvbnRhaW5zIGEgY29sbGVjdGlvbgorLy8vIG9mIGxlZ2FjeSBzdGF0aWMgaW50ZXJmYWNlcyBmb3IgZXh0cmFjdGluZyB2YXJpb3VzIGluZm9ybWF0aW9uIGFib3V0IHRoZQorLy8vIGN1cnJlbnQgcHJvY2Vzcy4gVGhlIGdvYWwgaXMgdG8gbWlncmF0ZSB1c2VycyBvZiB0aGlzIEFQSSBvdmVyIHRvIHRoZSBuZXcKKy8vLyBpbnRlcmZhY2VzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9QUk9DRVNTX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1BST0NFU1NfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9sbHZtLWNvbmZpZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2hyb25vLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKworbmFtZXNwYWNlIGxsdm0gewordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEFycmF5UmVmOworY2xhc3MgU3RyaW5nUmVmOworCituYW1lc3BhY2Ugc3lzIHsKKworCisvLy8gXGJyaWVmIEEgY29sbGVjdGlvbiBvZiBsZWdhY3kgaW50ZXJmYWNlcyBmb3IgcXVlcnlpbmcgaW5mb3JtYXRpb24gYWJvdXQgdGhlCisvLy8gY3VycmVudCBleGVjdXRpbmcgcHJvY2Vzcy4KK2NsYXNzIFByb2Nlc3MgeworcHVibGljOgorICBzdGF0aWMgdW5zaWduZWQgZ2V0UGFnZVNpemUoKTsKKworICAvLy8gXGJyaWVmIFJldHVybiBwcm9jZXNzIG1lbW9yeSB1c2FnZS4KKyAgLy8vIFRoaXMgc3RhdGljIGZ1bmN0aW9uIHdpbGwgcmV0dXJuIHRoZSB0b3RhbCBhbW91bnQgb2YgbWVtb3J5IGFsbG9jYXRlZAorICAvLy8gYnkgdGhlIHByb2Nlc3MuIFRoaXMgb25seSBjb3VudHMgdGhlIG1lbW9yeSBhbGxvY2F0ZWQgdmlhIHRoZSBtYWxsb2MsCisgIC8vLyBjYWxsb2MgYW5kIHJlYWxsb2MgZnVuY3Rpb25zIGFuZCBpbmNsdWRlcyBhbnkgImZyZWUiIGhvbGVzIGluIHRoZQorICAvLy8gYWxsb2NhdGVkIHNwYWNlLgorICBzdGF0aWMgc2l6ZV90IEdldE1hbGxvY1VzYWdlKCk7CisKKyAgLy8vIFRoaXMgc3RhdGljIGZ1bmN0aW9uIHdpbGwgc2V0IFxwIHVzZXJfdGltZSB0byB0aGUgYW1vdW50IG9mIENQVSB0aW1lCisgIC8vLyBzcGVudCBpbiB1c2VyIChub24ta2VybmVsKSBtb2RlIGFuZCBccCBzeXNfdGltZSB0byB0aGUgYW1vdW50IG9mIENQVQorICAvLy8gdGltZSBzcGVudCBpbiBzeXN0ZW0gKGtlcm5lbCkgbW9kZS4gIElmIHRoZSBvcGVyYXRpbmcgc3lzdGVtIGRvZXMgbm90CisgIC8vLyBzdXBwb3J0IGNvbGxlY3Rpb24gb2YgdGhlc2UgbWV0cmljcywgYSB6ZXJvIGR1cmF0aW9uIHdpbGwgYmUgZm9yIGJvdGgKKyAgLy8vIHZhbHVlcy4KKyAgLy8vIFxwYXJhbSBlbGFwc2VkIFJldHVybnMgdGhlIHN5c3RlbV9jbG9jazo6bm93KCkgZ2l2aW5nIGN1cnJlbnQgdGltZQorICAvLy8gXHBhcmFtIHVzZXJfdGltZSBSZXR1cm5zIHRoZSBjdXJyZW50IGFtb3VudCBvZiB1c2VyIHRpbWUgZm9yIHRoZSBwcm9jZXNzCisgIC8vLyBccGFyYW0gc3lzX3RpbWUgUmV0dXJucyB0aGUgY3VycmVudCBhbW91bnQgb2Ygc3lzdGVtIHRpbWUgZm9yIHRoZSBwcm9jZXNzCisgIHN0YXRpYyB2b2lkIEdldFRpbWVVc2FnZShUaW1lUG9pbnQ8PiAmZWxhcHNlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6Y2hyb25vOjpuYW5vc2Vjb25kcyAmdXNlcl90aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpjaHJvbm86Om5hbm9zZWNvbmRzICZzeXNfdGltZSk7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gbWFrZXMgdGhlIG5lY2Vzc2FyeSBjYWxscyB0byB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0bworICAvLy8gcHJldmVudCBjb3JlIGZpbGVzIG9yIGFueSBvdGhlciBraW5kIG9mIGxhcmdlIG1lbW9yeSBkdW1wcyB0aGF0IGNhbgorICAvLy8gb2NjdXIgd2hlbiBhIHByb2dyYW0gZmFpbHMuCisgIC8vLyBAYnJpZWYgUHJldmVudCBjb3JlIGZpbGUgZ2VuZXJhdGlvbi4KKyAgc3RhdGljIHZvaWQgUHJldmVudENvcmVGaWxlcygpOworCisgIC8vLyBcYnJpZWYgdHJ1ZSBpZiBQcmV2ZW50Q29yZUZpbGVzIGhhcyBiZWVuIGNhbGxlZCwgZmFsc2Ugb3RoZXJ3aXNlLgorICBzdGF0aWMgYm9vbCBBcmVDb3JlRmlsZXNQcmV2ZW50ZWQoKTsKKworICAvLyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIFxhcmcgbmFtZSdzIHZhbHVlIGFzIGEgVVRGLTgKKyAgLy8gc3RyaW5nLiBcYXJnIE5hbWUgaXMgYXNzdW1lZCB0byBiZSBpbiBVVEYtOCBlbmNvZGluZyB0b28uCisgIHN0YXRpYyBPcHRpb25hbDxzdGQ6OnN0cmluZz4gR2V0RW52KFN0cmluZ1JlZiBuYW1lKTsKKworICAvLy8gVGhpcyBmdW5jdGlvbiBzZWFyY2hlcyBmb3IgYW4gZXhpc3RpbmcgZmlsZSBpbiB0aGUgbGlzdCBvZiBkaXJlY3RvcmllcworICAvLy8gaW4gYSBQQVRIIGxpa2UgZW52aXJvbm1lbnQgdmFyaWFibGUsIGFuZCByZXR1cm5zIHRoZSBmaXJzdCBmaWxlIGZvdW5kLAorICAvLy8gYWNjb3JkaW5nIHRvIHRoZSBvcmRlciBvZiB0aGUgZW50cmllcyBpbiB0aGUgUEFUSCBsaWtlIGVudmlyb25tZW50CisgIC8vLyB2YXJpYWJsZS4gIElmIGFuIGlnbm9yZSBsaXN0IGlzIHNwZWNpZmllZCwgdGhlbiBhbnkgZm9sZGVyIHdoaWNoIGlzIGluCisgIC8vLyB0aGUgUEFUSCBsaWtlIGVudmlyb25tZW50IHZhcmlhYmxlIGJ1dCBpcyBhbHNvIGluIElnbm9yZUxpc3QgaXMgbm90CisgIC8vLyBjb25zaWRlcmVkLgorICBzdGF0aWMgT3B0aW9uYWw8c3RkOjpzdHJpbmc+IEZpbmRJbkVudlBhdGgoU3RyaW5nUmVmIEVudk5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgRmlsZU5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxzdGQ6OnN0cmluZz4gSWdub3JlTGlzdCk7CisKKyAgc3RhdGljIE9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBGaW5kSW5FbnZQYXRoKFN0cmluZ1JlZiBFbnZOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZpbGVOYW1lKTsKKworICAvLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgU21hbGxWZWN0b3IgY29udGFpbmluZyB0aGUgYXJndW1lbnRzIHBhc3NlZCBmcm9tCisgIC8vLyB0aGUgb3BlcmF0aW5nIHN5c3RlbSB0byB0aGUgcHJvZ3JhbS4gIFRoaXMgZnVuY3Rpb24gZXhwZWN0cyB0byBiZSBoYW5kZWQKKyAgLy8vIHRoZSB2ZWN0b3IgcGFzc2VkIGluIGZyb20gbWFpbi4KKyAgc3RhdGljIHN0ZDo6ZXJyb3JfY29kZQorICBHZXRBcmd1bWVudFZlY3RvcihTbWFsbFZlY3RvckltcGw8Y29uc3QgY2hhciAqPiAmQXJncywKKyAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Y29uc3QgY2hhciAqPiBBcmdzRnJvbU1haW4sCisgICAgICAgICAgICAgICAgICAgIFNwZWNpZmljQnVtcFB0ckFsbG9jYXRvcjxjaGFyPiAmQXJnQWxsb2NhdG9yKTsKKworICAvLyBUaGlzIGZ1bmN0aW9ucyBlbnN1cmVzIHRoYXQgdGhlIHN0YW5kYXJkIGZpbGUgZGVzY3JpcHRvcnMgKGlucHV0LCBvdXRwdXQsCisgIC8vIGFuZCBlcnJvcikgYXJlIHByb3Blcmx5IG1hcHBlZCB0byBhIGZpbGUgZGVzY3JpcHRvciBiZWZvcmUgd2UgdXNlIGFueSBvZgorICAvLyB0aGVtLiAgVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgc3RhbmRhbG9uZSBwcm9ncmFtcywgbGlicmFyeQorICAvLyBjb21wb25lbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzLgorICBzdGF0aWMgc3RkOjplcnJvcl9jb2RlIEZpeHVwU3RhbmRhcmRGaWxlRGVzY3JpcHRvcnMoKTsKKworICAvLyBUaGlzIGZ1bmN0aW9uIHNhZmVseSBjbG9zZXMgYSBmaWxlIGRlc2NyaXB0b3IuICBJdCBpcyBub3Qgc2FmZSB0byByZXRyeQorICAvLyBjbG9zZSgyKSB3aGVuIGl0IHJldHVybnMgd2l0aCBlcnJubyBlcXVpdmFsZW50IHRvIEVJTlRSOyB0aGlzIGlzIGJlY2F1c2UKKyAgLy8gKm5peGVuIGNhbm5vdCBhZ3JlZSBpZiB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzLCBpbiBmYWN0LCBjbG9zZWQgd2hlbiB0aGlzCisgIC8vIG9jY3Vycy4KKyAgLy8KKyAgLy8gTi5CLiBTb21lIG9wZXJhdGluZyBzeXN0ZW1zLCBkdWUgdG8gdGhyZWFkIGNhbmNlbGxhdGlvbiwgY2Fubm90IHByb3Blcmx5CisgIC8vIGd1YXJhbnRlZSB0aGF0IGl0IHdpbGwgb3Igd2lsbCBub3QgYmUgY2xvc2VkIG9uZSB3YXkgb3IgdGhlIG90aGVyIQorICBzdGF0aWMgc3RkOjplcnJvcl9jb2RlIFNhZmVseUNsb3NlRmlsZURlc2NyaXB0b3IoaW50IEZEKTsKKworICAvLy8gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoZSBzdGFuZGFyZCBpbnB1dCBpcyBjb25uZWN0ZWQgZGlyZWN0bHkKKyAgLy8vIHRvIGEgdXNlcidzIGlucHV0IChrZXlib2FyZCBwcm9iYWJseSksIHJhdGhlciB0aGFuIGNvbWluZyBmcm9tIGEgZmlsZQorICAvLy8gb3IgcGlwZS4KKyAgc3RhdGljIGJvb2wgU3RhbmRhcmRJbklzVXNlcklucHV0KCk7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgc3RhbmRhcmQgb3V0cHV0IGlzIGNvbm5lY3RlZCB0byBhCisgIC8vLyAidHR5IiBvciAiY29uc29sZSIgd2luZG93LiBUaGF0IGlzLCB0aGUgb3V0cHV0IHdvdWxkIGJlIGRpc3BsYXllZCB0bworICAvLy8gdGhlIHVzZXIgcmF0aGVyIHRoYW4gYmVpbmcgcHV0IG9uIGEgcGlwZSBvciBzdG9yZWQgaW4gYSBmaWxlLgorICBzdGF0aWMgYm9vbCBTdGFuZGFyZE91dElzRGlzcGxheWVkKCk7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyBpZiB0aGUgc3RhbmRhcmQgZXJyb3IgaXMgY29ubmVjdGVkIHRvIGEKKyAgLy8vICJ0dHkiIG9yICJjb25zb2xlIiB3aW5kb3cuIFRoYXQgaXMsIHRoZSBvdXRwdXQgd291bGQgYmUgZGlzcGxheWVkIHRvCisgIC8vLyB0aGUgdXNlciByYXRoZXIgdGhhbiBiZWluZyBwdXQgb24gYSBwaXBlIG9yIHN0b3JlZCBpbiBhIGZpbGUuCisgIHN0YXRpYyBib29sIFN0YW5kYXJkRXJySXNEaXNwbGF5ZWQoKTsKKworICAvLy8gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IgaXMgY29ubmVjdGVkIHRvCisgIC8vLyBhICJ0dHkiIG9yICJjb25zb2xlIiB3aW5kb3cuIFRoYXQgaXMsIHRoZSBvdXRwdXQgd291bGQgYmUgZGlzcGxheWVkIHRvCisgIC8vLyB0aGUgdXNlciByYXRoZXIgdGhhbiBiZWluZyBwdXQgb24gYSBwaXBlIG9yIHN0b3JlZCBpbiBhIGZpbGUuCisgIHN0YXRpYyBib29sIEZpbGVEZXNjcmlwdG9ySXNEaXNwbGF5ZWQoaW50IGZkKTsKKworICAvLy8gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IgaXMgZGlzcGxheWQgYW5kCisgIC8vLyBzdXBwb3J0cyBjb2xvcnMuCisgIHN0YXRpYyBib29sIEZpbGVEZXNjcmlwdG9ySGFzQ29sb3JzKGludCBmZCk7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4gdGhlIHdpbmRvdworICAvLy8gaWYgc3RhbmRhcmQgb3V0cHV0IGlzIGNvbm5lY3RlZCB0byBhICJ0dHkiIG9yICJjb25zb2xlIgorICAvLy8gd2luZG93LiBJZiBzdGFuZGFyZCBvdXRwdXQgaXMgbm90IGNvbm5lY3RlZCB0byBhIHR0eSBvcgorICAvLy8gY29uc29sZSwgb3IgaWYgdGhlIG51bWJlciBvZiBjb2x1bW5zIGNhbm5vdCBiZSBkZXRlcm1pbmVkLAorICAvLy8gdGhpcyByb3V0aW5lIHJldHVybnMgemVyby4KKyAgc3RhdGljIHVuc2lnbmVkIFN0YW5kYXJkT3V0Q29sdW1ucygpOworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgdGhlIG51bWJlciBvZiBjb2x1bW5zIGluIHRoZSB3aW5kb3cKKyAgLy8vIGlmIHN0YW5kYXJkIGVycm9yIGlzIGNvbm5lY3RlZCB0byBhICJ0dHkiIG9yICJjb25zb2xlIgorICAvLy8gd2luZG93LiBJZiBzdGFuZGFyZCBlcnJvciBpcyBub3QgY29ubmVjdGVkIHRvIGEgdHR5IG9yCisgIC8vLyBjb25zb2xlLCBvciBpZiB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgY2Fubm90IGJlIGRldGVybWluZWQsCisgIC8vLyB0aGlzIHJvdXRpbmUgcmV0dXJucyB6ZXJvLgorICBzdGF0aWMgdW5zaWduZWQgU3RhbmRhcmRFcnJDb2x1bW5zKCk7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0ZXJtaW5hbCBjb25uZWN0ZWQgdG8gc3RhbmRhcmQKKyAgLy8vIG91dHB1dCBzdXBwb3J0cyBjb2xvcnMuIElmIHN0YW5kYXJkIG91dHB1dCBpcyBub3QgY29ubmVjdGVkIHRvIGEKKyAgLy8vIHRlcm1pbmFsLCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UuCisgIHN0YXRpYyBib29sIFN0YW5kYXJkT3V0SGFzQ29sb3JzKCk7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gZGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSB0ZXJtaW5hbCBjb25uZWN0ZWQgdG8gc3RhbmRhcmQKKyAgLy8vIGVycm9yIHN1cHBvcnRzIGNvbG9ycy4gSWYgc3RhbmRhcmQgZXJyb3IgaXMgbm90IGNvbm5lY3RlZCB0byBhCisgIC8vLyB0ZXJtaW5hbCwgdGhpcyBmdW5jdGlvbiByZXR1cm5zIGZhbHNlLgorICBzdGF0aWMgYm9vbCBTdGFuZGFyZEVyckhhc0NvbG9ycygpOworCisgIC8vLyBFbmFibGVzIG9yIGRpc2FibGVzIHdoZXRoZXIgQU5TSSBlc2NhcGUgc2VxdWVuY2VzIGFyZSB1c2VkIHRvIG91dHB1dAorICAvLy8gY29sb3JzLiBUaGlzIG9ubHkgaGFzIGFuIGVmZmVjdCBvbiBXaW5kb3dzLgorICAvLy8gTm90ZTogU2V0dGluZyB0aGlzIG9wdGlvbiBpcyBub3QgdGhyZWFkLXNhZmUgYW5kIHNob3VsZCBvbmx5IGJlIGRvbmUKKyAgLy8vIGR1cmluZyBpbml0aWFsaXphdGlvbi4KKyAgc3RhdGljIHZvaWQgVXNlQU5TSUVzY2FwZUNvZGVzKGJvb2wgZW5hYmxlKTsKKworICAvLy8gV2hldGhlciBjaGFuZ2luZyBjb2xvcnMgcmVxdWlyZXMgdGhlIG91dHB1dCB0byBiZSBmbHVzaGVkLgorICAvLy8gVGhpcyBpcyBuZWVkZWQgb24gc3lzdGVtcyB0aGF0IGRvbid0IHN1cHBvcnQgZXNjYXBlIHNlcXVlbmNlcyBmb3IKKyAgLy8vIGNoYW5naW5nIGNvbG9ycy4KKyAgc3RhdGljIGJvb2wgQ29sb3JOZWVkc0ZsdXNoKCk7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgY29sb3Jjb2RlIGVzY2FwZSBzZXF1ZW5jZXMuCisgIC8vLyBJZiBDb2xvck5lZWRzRmx1c2goKSBpcyB0cnVlIHRoZW4gdGhpcyBmdW5jdGlvbiB3aWxsIGNoYW5nZSB0aGUgY29sb3JzCisgIC8vLyBhbmQgcmV0dXJuIGFuIGVtcHR5IGVzY2FwZSBzZXF1ZW5jZS4gSW4gdGhhdCBjYXNlIGl0IGlzIHRoZQorICAvLy8gcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNsaWVudCB0byBmbHVzaCB0aGUgb3V0cHV0IHN0cmVhbSBwcmlvciB0bworICAvLy8gY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgorICBzdGF0aWMgY29uc3QgY2hhciAqT3V0cHV0Q29sb3IoY2hhciBjLCBib29sIGJvbGQsIGJvb2wgYmcpOworCisgIC8vLyBTYW1lIGFzIE91dHB1dENvbG9yLCBidXQgb25seSBlbmFibGVzIHRoZSBib2xkIGF0dHJpYnV0ZS4KKyAgc3RhdGljIGNvbnN0IGNoYXIgKk91dHB1dEJvbGQoYm9vbCBiZyk7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgZXNjYXBlIHNlcXVlbmNlIHRvIHJldmVyc2UgZm9yZ3JvdW5kIGFuZAorICAvLy8gYmFja2dyb3VuZCBjb2xvcnMuCisgIHN0YXRpYyBjb25zdCBjaGFyICpPdXRwdXRSZXZlcnNlKCk7CisKKyAgLy8vIFJlc2V0cyB0aGUgdGVybWluYWxzIGNvbG9ycywgb3IgcmV0dXJucyBhbiBlc2NhcGUgc2VxdWVuY2UgdG8gZG8gc28uCisgIHN0YXRpYyBjb25zdCBjaGFyICpSZXNldENvbG9yKCk7CisKKyAgLy8vIEdldCB0aGUgcmVzdWx0IG9mIGEgcHJvY2VzcyB3aWRlIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yLiBUaGUKKyAgLy8vIGdlbmVyYXRvciB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgc2VlZGVkIGluIG5vbi1kZXRlcm1pbmlzdGljIGZhc2hpb24uCisgIHN0YXRpYyB1bnNpZ25lZCBHZXRSYW5kb21OdW1iZXIoKTsKK307CisKK30KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUHJvZ3JhbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1Byb2dyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmZkMzUwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1Byb2dyYW0uaApAQCAtMCwwICsxLDE5NyBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9Qcm9ncmFtLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBsbHZtOjpzeXM6OlByb2dyYW0gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfUFJPR1JBTV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9QUk9HUkFNX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JPci5oIgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHN5cyB7CisKKyAgLy8vIFRoaXMgaXMgdGhlIE9TLXNwZWNpZmljIHNlcGFyYXRvciBmb3IgUEFUSCBsaWtlIGVudmlyb25tZW50IHZhcmlhYmxlczoKKyAgLy8gYSBjb2xvbiBvbiBVbml4IG9yIGEgc2VtaWNvbG9uIG9uIFdpbmRvd3MuCisjaWYgZGVmaW5lZChMTFZNX09OX1VOSVgpCisgIGNvbnN0IGNoYXIgRW52UGF0aFNlcGFyYXRvciA9ICc6JzsKKyNlbGlmIGRlZmluZWQgKExMVk1fT05fV0lOMzIpCisgIGNvbnN0IGNoYXIgRW52UGF0aFNlcGFyYXRvciA9ICc7JzsKKyNlbmRpZgorCisvLy8gQGJyaWVmIFRoaXMgc3RydWN0IGVuY2Fwc3VsYXRlcyBpbmZvcm1hdGlvbiBhYm91dCBhIHByb2Nlc3MuCitzdHJ1Y3QgUHJvY2Vzc0luZm8geworI2lmIGRlZmluZWQoTExWTV9PTl9VTklYKQorICB0eXBlZGVmIHBpZF90IFByb2Nlc3NJZDsKKyNlbGlmIGRlZmluZWQoTExWTV9PTl9XSU4zMikKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIFByb2Nlc3NJZDsgLy8gTXVzdCBtYXRjaCB0aGUgdHlwZSBvZiBEV09SRCBvbiBXaW5kb3dzLgorICB0eXBlZGVmIHZvaWQgKiBIQU5ETEU7IC8vIE11c3QgbWF0Y2ggdGhlIHR5cGUgb2YgSEFORExFIG9uIFdpbmRvd3MuCisgIC8vLyBUaGUgaGFuZGxlIHRvIHRoZSBwcm9jZXNzIChhdmFpbGFibGUgb24gV2luZG93cyBvbmx5KS4KKyAgSEFORExFIFByb2Nlc3NIYW5kbGU7CisjZWxzZQorI2Vycm9yICJQcm9jZXNzSW5mbyBpcyBub3QgZGVmaW5lZCBmb3IgdGhpcyBwbGF0Zm9ybSEiCisjZW5kaWYKKworICBlbnVtIDogUHJvY2Vzc0lkIHsgSW52YWxpZFBpZCA9IDAgfTsKKworICAvLy8gVGhlIHByb2Nlc3MgaWRlbnRpZmllci4KKyAgUHJvY2Vzc0lkIFBpZDsKKworICAvLy8gVGhlIHJldHVybiBjb2RlLCBzZXQgYWZ0ZXIgZXhlY3V0aW9uLgorICBpbnQgUmV0dXJuQ29kZTsKKworICBQcm9jZXNzSW5mbygpOworfTsKKworICAvLy8gXGJyaWVmIEZpbmQgdGhlIGZpcnN0IGV4ZWN1dGFibGUgZmlsZSBccCBOYW1lIGluIFxwIFBhdGhzLgorICAvLy8KKyAgLy8vIFRoaXMgZG9lcyBub3QgcGVyZm9ybSBoYXNoaW5nIGFzIGEgc2hlbGwgd291bGQgYnV0IGluc3RlYWQgc3RhdHMgZWFjaCBQQVRICisgIC8vLyBlbnRyeSBpbmRpdmlkdWFsbHkgc28gc2hvdWxkIGdlbmVyYWxseSBiZSBhdm9pZGVkLiBDb3JlIExMVk0gbGlicmFyeQorICAvLy8gZnVuY3Rpb25zIGFuZCBvcHRpb25zIHNob3VsZCBpbnN0ZWFkIHJlcXVpcmUgZnVsbHkgc3BlY2lmaWVkIHBhdGhzLgorICAvLy8KKyAgLy8vIFxwYXJhbSBOYW1lIG5hbWUgb2YgdGhlIGV4ZWN1dGFibGUgdG8gZmluZC4gSWYgaXQgY29udGFpbnMgYW55IHN5c3RlbQorICAvLy8gICBzbGFzaGVzLCBpdCB3aWxsIGJlIHJldHVybmVkIGFzIGlzLgorICAvLy8gXHBhcmFtIFBhdGhzIG9wdGlvbmFsIGxpc3Qgb2YgcGF0aHMgdG8gc2VhcmNoIGZvciBccCBOYW1lLiBJZiBlbXB0eSBpdAorICAvLy8gICB3aWxsIHVzZSB0aGUgc3lzdGVtIFBBVEggZW52aXJvbm1lbnQgaW5zdGVhZC4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBUaGUgZnVsbHkgcXVhbGlmaWVkIHBhdGggdG8gdGhlIGZpcnN0IFxwIE5hbWUgaW4gXHAgUGF0aHMgaWYgaXQKKyAgLy8vICAgZXhpc3RzLiBccCBOYW1lIGlmIFxwIE5hbWUgaGFzIHNsYXNoZXMgaW4gaXQuIE90aGVyd2lzZSBhbiBlcnJvci4KKyAgRXJyb3JPcjxzdGQ6OnN0cmluZz4KKyAgZmluZFByb2dyYW1CeU5hbWUoU3RyaW5nUmVmIE5hbWUsIEFycmF5UmVmPFN0cmluZ1JlZj4gUGF0aHMgPSB7fSk7CisKKyAgLy8gVGhlc2UgZnVuY3Rpb25zIGNoYW5nZSB0aGUgc3BlY2lmaWVkIHN0YW5kYXJkIHN0cmVhbSAoc3RkaW4gb3Igc3Rkb3V0KSB0bworICAvLyBiaW5hcnkgbW9kZS4gVGhleSByZXR1cm4gZXJyYzo6c3VjY2VzcyBpZiB0aGUgc3BlY2lmaWVkIHN0cmVhbQorICAvLyB3YXMgY2hhbmdlZC4gT3RoZXJ3aXNlIGEgcGxhdGZvcm0gZGVwZW5kZW50IGVycm9yIGlzIHJldHVybmVkLgorICBzdGQ6OmVycm9yX2NvZGUgQ2hhbmdlU3RkaW5Ub0JpbmFyeSgpOworICBzdGQ6OmVycm9yX2NvZGUgQ2hhbmdlU3Rkb3V0VG9CaW5hcnkoKTsKKworICAvLy8gVGhpcyBmdW5jdGlvbiBleGVjdXRlcyB0aGUgcHJvZ3JhbSB1c2luZyB0aGUgYXJndW1lbnRzIHByb3ZpZGVkLiAgVGhlCisgIC8vLyBpbnZva2VkIHByb2dyYW0gd2lsbCBpbmhlcml0IHRoZSBzdGRpbiwgc3Rkb3V0LCBhbmQgc3RkZXJyIGZpbGUKKyAgLy8vIGRlc2NyaXB0b3JzLCB0aGUgZW52aXJvbm1lbnQgYW5kIG90aGVyIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3Mgb2YgdGhlCisgIC8vLyBpbnZva2luZyBwcm9ncmFtLgorICAvLy8gVGhpcyBmdW5jdGlvbiB3YWl0cyBmb3IgdGhlIHByb2dyYW0gdG8gZmluaXNoLCBzbyBzaG91bGQgYmUgYXZvaWRlZCBpbgorICAvLy8gbGlicmFyeSBmdW5jdGlvbnMgdGhhdCBhcmVuJ3QgZXhwZWN0ZWQgdG8gYmxvY2suIENvbnNpZGVyIHVzaW5nCisgIC8vLyBFeGVjdXRlTm9XYWl0KCkgaW5zdGVhZC4KKyAgLy8vIFxyZXR1cm5zIGFuIGludGVnZXIgcmVzdWx0IGNvZGUgaW5kaWNhdGluZyB0aGUgc3RhdHVzIG9mIHRoZSBwcm9ncmFtLgorICAvLy8gQSB6ZXJvIG9yIHBvc2l0aXZlIHZhbHVlIGluZGljYXRlcyB0aGUgcmVzdWx0IGNvZGUgb2YgdGhlIHByb2dyYW0uCisgIC8vLyAtMSBpbmRpY2F0ZXMgZmFpbHVyZSB0byBleGVjdXRlCisgIC8vLyAtMiBpbmRpY2F0ZXMgYSBjcmFzaCBkdXJpbmcgZXhlY3V0aW9uIG9yIHRpbWVvdXQKKyAgaW50IEV4ZWN1dGVBbmRXYWl0KAorICAgICAgU3RyaW5nUmVmIFByb2dyYW0sIC8vLzwgUGF0aCBvZiB0aGUgcHJvZ3JhbSB0byBiZSBleGVjdXRlZC4gSXQgaXMKKyAgICAgIC8vLzwgcHJlc3VtZWQgdGhpcyBpcyB0aGUgcmVzdWx0IG9mIHRoZSBmaW5kUHJvZ3JhbUJ5TmFtZSBtZXRob2QuCisgICAgICBjb25zdCBjaGFyICoqQXJncywgLy8vPCBBIHZlY3RvciBvZiBzdHJpbmdzIHRoYXQgYXJlIHBhc3NlZCB0byB0aGUKKyAgICAgIC8vLzwgcHJvZ3JhbS4gIFRoZSBmaXJzdCBlbGVtZW50IHNob3VsZCBiZSB0aGUgbmFtZSBvZiB0aGUgcHJvZ3JhbS4KKyAgICAgIC8vLzwgVGhlIGxpc3QgKm11c3QqIGJlIHRlcm1pbmF0ZWQgYnkgYSBudWxsIGNoYXIqIGVudHJ5LgorICAgICAgY29uc3QgY2hhciAqKkVudiA9IG51bGxwdHIsIC8vLzwgQW4gb3B0aW9uYWwgdmVjdG9yIG9mIHN0cmluZ3MgdG8gdXNlIGZvcgorICAgICAgLy8vPCB0aGUgcHJvZ3JhbSdzIGVudmlyb25tZW50LiBJZiBub3QgcHJvdmlkZWQsIHRoZSBjdXJyZW50IHByb2dyYW0ncworICAgICAgLy8vPCBlbnZpcm9ubWVudCB3aWxsIGJlIHVzZWQuCisgICAgICBBcnJheVJlZjxPcHRpb25hbDxTdHJpbmdSZWY+PiBSZWRpcmVjdHMgPSB7fSwgLy8vPAorICAgICAgLy8vPCBBbiBhcnJheSBvZiBvcHRpb25hbCBwYXRocy4gU2hvdWxkIGhhdmUgYSBzaXplIG9mIHplcm8gb3IgdGhyZWUuCisgICAgICAvLy88IElmIHRoZSBhcnJheSBpcyBlbXB0eSwgbm8gcmVkaXJlY3Rpb25zIGFyZSBwZXJmb3JtZWQuCisgICAgICAvLy88IE90aGVyd2lzZSwgdGhlIGluZmVyaW9yIHByb2Nlc3MncyBzdGRpbigwKSwgc3Rkb3V0KDEpLCBhbmQgc3RkZXJyKDIpCisgICAgICAvLy88IHdpbGwgYmUgcmVkaXJlY3RlZCB0byB0aGUgY29ycmVzcG9uZGluZyBwYXRocywgaWYgdGhlIG9wdGlvbmFsIHBhdGgKKyAgICAgIC8vLzwgaXMgcHJlc2VudCAobm90IFxjIGxsdm06Ok5vbmUpLgorICAgICAgLy8vPCBXaGVuIGFuIGVtcHR5IHBhdGggaXMgcGFzc2VkIGluLCB0aGUgY29ycmVzcG9uZGluZyBmaWxlIGRlc2NyaXB0b3IKKyAgICAgIC8vLzwgd2lsbCBiZSBkaXNjb25uZWN0ZWQgKGllLCAvZGV2L251bGwnZCkgaW4gYSBwb3J0YWJsZSB3YXkuCisgICAgICB1bnNpZ25lZCBTZWNvbmRzVG9XYWl0ID0gMCwgLy8vPCBJZiBub24temVybywgdGhpcyBzcGVjaWZpZXMgdGhlIGFtb3VudAorICAgICAgLy8vPCBvZiB0aW1lIHRvIHdhaXQgZm9yIHRoZSBjaGlsZCBwcm9jZXNzIHRvIGV4aXQuIElmIHRoZSB0aW1lCisgICAgICAvLy88IGV4cGlyZXMsIHRoZSBjaGlsZCBpcyBraWxsZWQgYW5kIHRoaXMgY2FsbCByZXR1cm5zLiBJZiB6ZXJvLAorICAgICAgLy8vPCB0aGlzIGZ1bmN0aW9uIHdpbGwgd2FpdCB1bnRpbCB0aGUgY2hpbGQgZmluaXNoZXMgb3IgZm9yZXZlciBpZgorICAgICAgLy8vPCBpdCBkb2Vzbid0LgorICAgICAgdW5zaWduZWQgTWVtb3J5TGltaXQgPSAwLCAvLy88IElmIG5vbi16ZXJvLCB0aGlzIHNwZWNpZmllcyBtYXguIGFtb3VudAorICAgICAgLy8vPCBvZiBtZW1vcnkgY2FuIGJlIGFsbG9jYXRlZCBieSBwcm9jZXNzLiBJZiBtZW1vcnkgdXNhZ2Ugd2lsbCBiZQorICAgICAgLy8vPCBoaWdoZXIgbGltaXQsIHRoZSBjaGlsZCBpcyBraWxsZWQgYW5kIHRoaXMgY2FsbCByZXR1cm5zLiBJZiB6ZXJvCisgICAgICAvLy88IC0gbm8gbWVtb3J5IGxpbWl0LgorICAgICAgc3RkOjpzdHJpbmcgKkVyck1zZyA9IG51bGxwdHIsIC8vLzwgSWYgbm9uLXplcm8sIHByb3ZpZGVzIGEgcG9pbnRlciB0byBhCisgICAgICAvLy88IHN0cmluZyBpbnN0YW5jZSBpbiB3aGljaCBlcnJvciBtZXNzYWdlcyB3aWxsIGJlIHJldHVybmVkLiBJZiB0aGUKKyAgICAgIC8vLzwgc3RyaW5nIGlzIG5vbi1lbXB0eSB1cG9uIHJldHVybiBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBpbnZva2luZyB0aGUKKyAgICAgIC8vLzwgcHJvZ3JhbS4KKyAgICAgIGJvb2wgKkV4ZWN1dGlvbkZhaWxlZCA9IG51bGxwdHIpOworCisgIC8vLyBTaW1pbGFyIHRvIEV4ZWN1dGVBbmRXYWl0LCBidXQgcmV0dXJucyBpbW1lZGlhdGVseS4KKyAgLy8vIEByZXR1cm5zIFRoZSBcc2VlIFByb2Nlc3NJbmZvIG9mIHRoZSBuZXdseSBsYXVuY2VkIHByb2Nlc3MuCisgIC8vLyBcbm90ZSBPbiBNaWNyb3NvZnQgV2luZG93cyBzeXN0ZW1zLCB1c2VycyB3aWxsIG5lZWQgdG8gZWl0aGVyIGNhbGwKKyAgLy8vIFxzZWUgV2FpdCB1bnRpbCB0aGUgcHJvY2VzcyBmaW5pc2hlZCBleGVjdXRpb24gb3Igd2luMzIgQ2xvc2VIYW5kbGUoKSBBUEkKKyAgLy8vIG9uIFByb2Nlc3NJbmZvLlByb2Nlc3NIYW5kbGUgdG8gYXZvaWQgbWVtb3J5IGxlYWtzLgorICBQcm9jZXNzSW5mbyBFeGVjdXRlTm9XYWl0KFN0cmluZ1JlZiBQcm9ncmFtLCBjb25zdCBjaGFyICoqQXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICoqRW52ID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxPcHRpb25hbDxTdHJpbmdSZWY+PiBSZWRpcmVjdHMgPSB7fSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNZW1vcnlMaW1pdCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgKkVyck1zZyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAqRXhlY3V0aW9uRmFpbGVkID0gbnVsbHB0cik7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiBhcmd1bWVudHMgZml0IHdpdGhpbiBzeXN0ZW0tc3BlY2lmaWMKKyAgLy8vIGFyZ3VtZW50IGxlbmd0aCBsaW1pdHMuCisgIGJvb2wgY29tbWFuZExpbmVGaXRzV2l0aGluU3lzdGVtTGltaXRzKFN0cmluZ1JlZiBQcm9ncmFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxjb25zdCBjaGFyICo+IEFyZ3MpOworCisgIC8vLyBGaWxlIGVuY29kaW5nIG9wdGlvbnMgd2hlbiB3cml0aW5nIGNvbnRlbnRzIHRoYXQgYSBub24tVVRGOCB0b29sIHdpbGwKKyAgLy8vIHJlYWQgKG9uIFdpbmRvd3Mgc3lzdGVtcykuIEZvciBVTklYLCB3ZSBhbHdheXMgdXNlIFVURi04LgorICBlbnVtIFdpbmRvd3NFbmNvZGluZ01ldGhvZCB7CisgICAgLy8vIFVURi04IGlzIHRoZSBMTFZNIG5hdGl2ZSBlbmNvZGluZywgYmVpbmcgdGhlIHNhbWUgYXMgImRvIG5vdCBwZXJmb3JtCisgICAgLy8vIGVuY29kaW5nIGNvbnZlcnNpb24iLgorICAgIFdFTV9VVEY4LAorICAgIFdFTV9DdXJyZW50Q29kZVBhZ2UsCisgICAgV0VNX1VURjE2CisgIH07CisKKyAgLy8vIFNhdmVzIHRoZSBVVEY4LWVuY29kZWQgXHAgY29udGVudHMgc3RyaW5nIGludG8gdGhlIGZpbGUgXHAgRmlsZU5hbWUKKyAgLy8vIHVzaW5nIGEgc3BlY2lmaWMgZW5jb2RpbmcuCisgIC8vLworICAvLy8gVGhpcyB3cml0ZSBmaWxlIGZ1bmN0aW9uIGFkZHMgdGhlIHBvc3NpYmlsaXR5IHRvIGNob29zZSB3aGljaCBlbmNvZGluZworICAvLy8gdG8gdXNlIHdoZW4gd3JpdGluZyBhIHRleHQgZmlsZS4gT24gV2luZG93cywgdGhpcyBpcyBpbXBvcnRhbnQgd2hlbgorICAvLy8gd3JpdGluZyBmaWxlcyB3aXRoIGludGVybmF0aW9uYWxpemF0aW9uIHN1cHBvcnQgd2l0aCBhbiBlbmNvZGluZyB0aGF0IGlzCisgIC8vLyBkaWZmZXJlbnQgZnJvbSB0aGUgb25lIHVzZWQgaW4gTExWTSAoVVRGLTgpLiBXZSB1c2UgdGhpcyB3aGVuIHdyaXRpbmcKKyAgLy8vIHJlc3BvbnNlIGZpbGVzLCBzaW5jZSBHQ0MgdG9vbHMgb24gTWluR1cgb25seSB1bmRlcnN0YW5kIGxlZ2FjeSBjb2RlCisgIC8vLyBwYWdlcywgYW5kIFZpc3VhbFN0dWRpbyB0b29scyBvbmx5IHVuZGVyc3RhbmQgVVRGLTE2LgorICAvLy8gRm9yIFVOSVgsIHVzaW5nIGRpZmZlcmVudCBlbmNvZGluZ3MgaXMgc2lsZW50bHkgaWdub3JlZCwgc2luY2UgYWxsIHRvb2xzCisgIC8vLyB3b3JrIHdlbGwgd2l0aCBVVEYtOC4KKyAgLy8vIFRoaXMgZnVuY3Rpb24gYXNzdW1lcyB0aGF0IHlvdSBvbmx5IHVzZSBVVEYtOCAqdGV4dCogZGF0YSBhbmQgd2lsbCBjb252ZXJ0CisgIC8vLyBpdCB0byB5b3VyIGRlc2lyZWQgZW5jb2RpbmcgYmVmb3JlIHdyaXRpbmcgdG8gdGhlIGZpbGUuCisgIC8vLworICAvLy8gRklYTUU6IFdlIHVzZSBFTV9DdXJyZW50Q29kZVBhZ2UgdG8gd3JpdGUgcmVzcG9uc2UgZmlsZXMgZm9yIEdOVSB0b29scyBpbgorICAvLy8gYSBNaW5HVy9NaW5HVy13NjQgZW52aXJvbm1lbnQsIHdoaWNoIGhhcyBzZXJpb3VzIGZsYXdzIGJ1dCBjdXJyZW50bHkgaXMKKyAgLy8vIG91ciBiZXN0IHNob3QgdG8gbWFrZSBnY2MvbGQgdW5kZXJzdGFuZCBpbnRlcm5hdGlvbmFsIGNoYXJhY3RlcnMuIFRoaXMKKyAgLy8vIHNob3VsZCBiZSBjaGFuZ2VkIGFzIHNvb24gYXMgYmludXRpbHMgZml4IHRoaXMgdG8gc3VwcG9ydCBVVEYxNiBvbiBtaW5ndy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBub24temVybyBlcnJvcl9jb2RlIGlmIGZhaWxlZAorICBzdGQ6OmVycm9yX2NvZGUKKyAgd3JpdGVGaWxlV2l0aEVuY29kaW5nKFN0cmluZ1JlZiBGaWxlTmFtZSwgU3RyaW5nUmVmIENvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgV2luZG93c0VuY29kaW5nTWV0aG9kIEVuY29kaW5nID0gV0VNX1VURjgpOworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHdhaXRzIGZvciB0aGUgcHJvY2VzcyBzcGVjaWZpZWQgYnkgXHAgUEkgdG8gZmluaXNoLgorICAvLy8gXHJldHVybnMgQSBcc2VlIFByb2Nlc3NJbmZvIHN0cnVjdCB3aXRoIFBpZCBzZXQgdG86CisgIC8vLyBcbGkgVGhlIHByb2Nlc3MgaWQgb2YgdGhlIGNoaWxkIHByb2Nlc3MgaWYgdGhlIGNoaWxkIHByb2Nlc3MgaGFzIGNoYW5nZWQKKyAgLy8vIHN0YXRlLgorICAvLy8gXGxpIDAgaWYgdGhlIGNoaWxkIHByb2Nlc3MgaGFzIG5vdCBjaGFuZ2VkIHN0YXRlLgorICAvLy8gXG5vdGUgVXNlcnMgb2YgdGhpcyBmdW5jdGlvbiBzaG91bGQgYWx3YXlzIGNoZWNrIHRoZSBSZXR1cm5Db2RlIG1lbWJlciBvZgorICAvLy8gdGhlIFxzZWUgUHJvY2Vzc0luZm8gcmV0dXJuZWQgZnJvbSB0aGlzIGZ1bmN0aW9uLgorICBQcm9jZXNzSW5mbyBXYWl0KAorICAgICAgY29uc3QgUHJvY2Vzc0luZm8gJlBJLCAvLy88IFRoZSBjaGlsZCBwcm9jZXNzIHRoYXQgc2hvdWxkIGJlIHdhaXRlZCBvbi4KKyAgICAgIHVuc2lnbmVkIFNlY29uZHNUb1dhaXQsIC8vLzwgSWYgbm9uLXplcm8sIHRoaXMgc3BlY2lmaWVzIHRoZSBhbW91bnQgb2YKKyAgICAgIC8vLzwgdGltZSB0byB3YWl0IGZvciB0aGUgY2hpbGQgcHJvY2VzcyB0byBleGl0LiBJZiB0aGUgdGltZSBleHBpcmVzLCB0aGUKKyAgICAgIC8vLzwgY2hpbGQgaXMga2lsbGVkIGFuZCB0aGlzIGZ1bmN0aW9uIHJldHVybnMuIElmIHplcm8sIHRoaXMgZnVuY3Rpb24KKyAgICAgIC8vLzwgd2lsbCBwZXJmb3JtIGEgbm9uLWJsb2NraW5nIHdhaXQgb24gdGhlIGNoaWxkIHByb2Nlc3MuCisgICAgICBib29sIFdhaXRVbnRpbFRlcm1pbmF0ZXMsIC8vLzwgSWYgdHJ1ZSwgaWdub3JlcyBccCBTZWNvbmRzVG9XYWl0IGFuZCB3YWl0cworICAgICAgLy8vPCB1bnRpbCBjaGlsZCBoYXMgdGVybWluYXRlZC4KKyAgICAgIHN0ZDo6c3RyaW5nICpFcnJNc2cgPSBudWxscHRyIC8vLzwgSWYgbm9uLXplcm8sIHByb3ZpZGVzIGEgcG9pbnRlciB0byBhCisgICAgICAvLy88IHN0cmluZyBpbnN0YW5jZSBpbiB3aGljaCBlcnJvciBtZXNzYWdlcyB3aWxsIGJlIHJldHVybmVkLiBJZiB0aGUKKyAgICAgIC8vLzwgc3RyaW5nIGlzIG5vbi1lbXB0eSB1cG9uIHJldHVybiBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSBpbnZva2luZyB0aGUKKyAgICAgIC8vLzwgcHJvZ3JhbS4KKyAgICAgICk7CisgIH0KK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUldNdXRleC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JXTXV0ZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWY0ZmMwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JXTXV0ZXguaApAQCAtMCwwICsxLDE3OSBAQAorLy89PT0tIFJXTXV0ZXguaCAtIFJlYWRlci9Xcml0ZXIgTXV0dWFsIEV4Y2x1c2lvbiBMb2NrIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIGxsdm06OnN5czo6UldNdXRleCBjbGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9SV01VVEVYX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1JXTVVURVhfSAorCisjaW5jbHVkZSAibGx2bS9Db25maWcvbGx2bS1jb25maWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVGhyZWFkaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHN5cyB7CisKKyAgICAvLy8gQGJyaWVmIFBsYXRmb3JtIGFnbm9zdGljIFJXTXV0ZXggY2xhc3MuCisgICAgY2xhc3MgUldNdXRleEltcGwKKyAgICB7CisgICAgLy8vIEBuYW1lIENvbnN0cnVjdG9ycworICAgIC8vLyBAeworICAgIHB1YmxpYzoKKworICAgICAgLy8vIEluaXRpYWxpemVzIHRoZSBsb2NrIGJ1dCBkb2Vzbid0IGFjcXVpcmUgaXQuCisgICAgICAvLy8gQGJyaWVmIERlZmF1bHQgQ29uc3RydWN0b3IuCisgICAgICBleHBsaWNpdCBSV011dGV4SW1wbCgpOworCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIERvIE5vdCBJbXBsZW1lbnQKKyAgICAvLy8gQHsKKyAgICAgIFJXTXV0ZXhJbXBsKGNvbnN0IFJXTXV0ZXhJbXBsICYgb3JpZ2luYWwpID0gZGVsZXRlOworICAgICAgUldNdXRleEltcGwgJm9wZXJhdG9yPShjb25zdCBSV011dGV4SW1wbCAmKSA9IGRlbGV0ZTsKKyAgICAvLy8gQH0KKworICAgICAgLy8vIFJlbGVhc2VzIGFuZCByZW1vdmVzIHRoZSBsb2NrCisgICAgICAvLy8gQGJyaWVmIERlc3RydWN0b3IKKyAgICAgIH5SV011dGV4SW1wbCgpOworCisgICAgLy8vIEB9CisgICAgLy8vIEBuYW1lIE1ldGhvZHMKKyAgICAvLy8gQHsKKyAgICBwdWJsaWM6CisKKyAgICAgIC8vLyBBdHRlbXB0cyB0byB1bmNvbmRpdGlvbmFsbHkgYWNxdWlyZSB0aGUgbG9jayBpbiByZWFkZXIgbW9kZS4gSWYgdGhlCisgICAgICAvLy8gbG9jayBpcyBoZWxkIGJ5IGEgd3JpdGVyLCB0aGlzIG1ldGhvZCB3aWxsIHdhaXQgdW50aWwgaXQgY2FuIGFjcXVpcmUKKyAgICAgIC8vLyB0aGUgbG9jay4KKyAgICAgIC8vLyBAcmV0dXJucyBmYWxzZSBpZiBhbnkga2luZCBvZiBlcnJvciBvY2N1cnMsIHRydWUgb3RoZXJ3aXNlLgorICAgICAgLy8vIEBicmllZiBVbmNvbmRpdGlvbmFsbHkgYWNxdWlyZSB0aGUgbG9jayBpbiByZWFkZXIgbW9kZS4KKyAgICAgIGJvb2wgcmVhZGVyX2FjcXVpcmUoKTsKKworICAgICAgLy8vIEF0dGVtcHRzIHRvIHJlbGVhc2UgdGhlIGxvY2sgaW4gcmVhZGVyIG1vZGUuCisgICAgICAvLy8gQHJldHVybnMgZmFsc2UgaWYgYW55IGtpbmQgb2YgZXJyb3Igb2NjdXJzLCB0cnVlIG90aGVyd2lzZS4KKyAgICAgIC8vLyBAYnJpZWYgVW5jb25kaXRpb25hbGx5IHJlbGVhc2UgdGhlIGxvY2sgaW4gcmVhZGVyIG1vZGUuCisgICAgICBib29sIHJlYWRlcl9yZWxlYXNlKCk7CisKKyAgICAgIC8vLyBBdHRlbXB0cyB0byB1bmNvbmRpdGlvbmFsbHkgYWNxdWlyZSB0aGUgbG9jayBpbiByZWFkZXIgbW9kZS4gSWYgdGhlCisgICAgICAvLy8gbG9jayBpcyBoZWxkIGJ5IGFueSByZWFkZXJzLCB0aGlzIG1ldGhvZCB3aWxsIHdhaXQgdW50aWwgaXQgY2FuCisgICAgICAvLy8gYWNxdWlyZSB0aGUgbG9jay4KKyAgICAgIC8vLyBAcmV0dXJucyBmYWxzZSBpZiBhbnkga2luZCBvZiBlcnJvciBvY2N1cnMsIHRydWUgb3RoZXJ3aXNlLgorICAgICAgLy8vIEBicmllZiBVbmNvbmRpdGlvbmFsbHkgYWNxdWlyZSB0aGUgbG9jayBpbiB3cml0ZXIgbW9kZS4KKyAgICAgIGJvb2wgd3JpdGVyX2FjcXVpcmUoKTsKKworICAgICAgLy8vIEF0dGVtcHRzIHRvIHJlbGVhc2UgdGhlIGxvY2sgaW4gd3JpdGVyIG1vZGUuCisgICAgICAvLy8gQHJldHVybnMgZmFsc2UgaWYgYW55IGtpbmQgb2YgZXJyb3Igb2NjdXJzLCB0cnVlIG90aGVyd2lzZS4KKyAgICAgIC8vLyBAYnJpZWYgVW5jb25kaXRpb25hbGx5IHJlbGVhc2UgdGhlIGxvY2sgaW4gd3JpdGUgbW9kZS4KKyAgICAgIGJvb2wgd3JpdGVyX3JlbGVhc2UoKTsKKworICAgIC8vQH0KKyAgICAvLy8gQG5hbWUgUGxhdGZvcm0gRGVwZW5kZW50IERhdGEKKyAgICAvLy8gQHsKKyAgICBwcml2YXRlOgorI2lmIGRlZmluZWQoTExWTV9FTkFCTEVfVEhSRUFEUykgJiYgTExWTV9FTkFCTEVfVEhSRUFEUyAhPSAwCisgICAgICB2b2lkKiBkYXRhXyA9IG51bGxwdHI7IC8vLzwgV2UgZG9uJ3Qga25vdyB3aGF0IHRoZSBkYXRhIHdpbGwgYmUKKyNlbmRpZgorICAgIH07CisKKyAgICAvLy8gU21hcnRNdXRleCAtIEFuIFIvVyBtdXRleCB3aXRoIGEgY29tcGlsZSB0aW1lIGNvbnN0YW50IHBhcmFtZXRlciB0aGF0CisgICAgLy8vIGluZGljYXRlcyB3aGV0aGVyIHRoaXMgbXV0ZXggc2hvdWxkIGJlY29tZSBhIG5vLW9wIHdoZW4gd2UncmUgbm90CisgICAgLy8vIHJ1bm5pbmcgaW4gbXVsdGl0aHJlYWRlZCBtb2RlLgorICAgIHRlbXBsYXRlPGJvb2wgbXRfb25seT4KKyAgICBjbGFzcyBTbWFydFJXTXV0ZXggeworICAgICAgUldNdXRleEltcGwgaW1wbDsKKyAgICAgIHVuc2lnbmVkIHJlYWRlcnMgPSAwOworICAgICAgdW5zaWduZWQgd3JpdGVycyA9IDA7CisKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdCBTbWFydFJXTXV0ZXgoKSA9IGRlZmF1bHQ7CisgICAgICBTbWFydFJXTXV0ZXgoY29uc3QgU21hcnRSV011dGV4PG10X29ubHk+ICYgb3JpZ2luYWwpID0gZGVsZXRlOworICAgICAgU21hcnRSV011dGV4PG10X29ubHk+ICZvcGVyYXRvcj0oY29uc3QgU21hcnRSV011dGV4PG10X29ubHk+ICYpID0gZGVsZXRlOworCisgICAgICBib29sIGxvY2tfc2hhcmVkKCkgeworICAgICAgICBpZiAoIW10X29ubHkgfHwgbGx2bV9pc19tdWx0aXRocmVhZGVkKCkpCisgICAgICAgICAgcmV0dXJuIGltcGwucmVhZGVyX2FjcXVpcmUoKTsKKworICAgICAgICAvLyBTaW5nbGUtdGhyZWFkZWQgZGVidWdnaW5nIGNvZGUuICBUaGlzIHdvdWxkIGJlIHJhY3kgaW4gbXVsdGl0aHJlYWRlZAorICAgICAgICAvLyBtb2RlLCBidXQgcHJvdmlkZXMgbm90IHNhbml0eSBjaGVja3MgaW4gc2luZ2xlIHRocmVhZGVkIG1vZGUuCisgICAgICAgICsrcmVhZGVyczsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIGJvb2wgdW5sb2NrX3NoYXJlZCgpIHsKKyAgICAgICAgaWYgKCFtdF9vbmx5IHx8IGxsdm1faXNfbXVsdGl0aHJlYWRlZCgpKQorICAgICAgICAgIHJldHVybiBpbXBsLnJlYWRlcl9yZWxlYXNlKCk7CisKKyAgICAgICAgLy8gU2luZ2xlLXRocmVhZGVkIGRlYnVnZ2luZyBjb2RlLiAgVGhpcyB3b3VsZCBiZSByYWN5IGluIG11bHRpdGhyZWFkZWQKKyAgICAgICAgLy8gbW9kZSwgYnV0IHByb3ZpZGVzIG5vdCBzYW5pdHkgY2hlY2tzIGluIHNpbmdsZSB0aHJlYWRlZCBtb2RlLgorICAgICAgICBhc3NlcnQocmVhZGVycyA+IDAgJiYgIlJlYWRlciBsb2NrIG5vdCBhY3F1aXJlZCBiZWZvcmUgcmVsZWFzZSEiKTsKKyAgICAgICAgLS1yZWFkZXJzOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKworICAgICAgYm9vbCBsb2NrKCkgeworICAgICAgICBpZiAoIW10X29ubHkgfHwgbGx2bV9pc19tdWx0aXRocmVhZGVkKCkpCisgICAgICAgICAgcmV0dXJuIGltcGwud3JpdGVyX2FjcXVpcmUoKTsKKworICAgICAgICAvLyBTaW5nbGUtdGhyZWFkZWQgZGVidWdnaW5nIGNvZGUuICBUaGlzIHdvdWxkIGJlIHJhY3kgaW4gbXVsdGl0aHJlYWRlZAorICAgICAgICAvLyBtb2RlLCBidXQgcHJvdmlkZXMgbm90IHNhbml0eSBjaGVja3MgaW4gc2luZ2xlIHRocmVhZGVkIG1vZGUuCisgICAgICAgIGFzc2VydCh3cml0ZXJzID09IDAgJiYgIldyaXRlciBsb2NrIGFscmVhZHkgYWNxdWlyZWQhIik7CisgICAgICAgICsrd3JpdGVyczsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisKKyAgICAgIGJvb2wgdW5sb2NrKCkgeworICAgICAgICBpZiAoIW10X29ubHkgfHwgbGx2bV9pc19tdWx0aXRocmVhZGVkKCkpCisgICAgICAgICAgcmV0dXJuIGltcGwud3JpdGVyX3JlbGVhc2UoKTsKKworICAgICAgICAvLyBTaW5nbGUtdGhyZWFkZWQgZGVidWdnaW5nIGNvZGUuICBUaGlzIHdvdWxkIGJlIHJhY3kgaW4gbXVsdGl0aHJlYWRlZAorICAgICAgICAvLyBtb2RlLCBidXQgcHJvdmlkZXMgbm90IHNhbml0eSBjaGVja3MgaW4gc2luZ2xlIHRocmVhZGVkIG1vZGUuCisgICAgICAgIGFzc2VydCh3cml0ZXJzID09IDEgJiYgIldyaXRlciBsb2NrIG5vdCBhY3F1aXJlZCBiZWZvcmUgcmVsZWFzZSEiKTsKKyAgICAgICAgLS13cml0ZXJzOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9OworCisgICAgdHlwZWRlZiBTbWFydFJXTXV0ZXg8ZmFsc2U+IFJXTXV0ZXg7CisKKyAgICAvLy8gU2NvcGVkUmVhZGVyIC0gUkFJSSBhY3F1aXNpdGlvbiBvZiBhIHJlYWRlciBsb2NrCisgICAgdGVtcGxhdGU8Ym9vbCBtdF9vbmx5PgorICAgIHN0cnVjdCBTbWFydFNjb3BlZFJlYWRlciB7CisgICAgICBTbWFydFJXTXV0ZXg8bXRfb25seT4mIG11dGV4OworCisgICAgICBleHBsaWNpdCBTbWFydFNjb3BlZFJlYWRlcihTbWFydFJXTXV0ZXg8bXRfb25seT4mIG0pIDogbXV0ZXgobSkgeworICAgICAgICBtdXRleC5sb2NrX3NoYXJlZCgpOworICAgICAgfQorCisgICAgICB+U21hcnRTY29wZWRSZWFkZXIoKSB7CisgICAgICAgIG11dGV4LnVubG9ja19zaGFyZWQoKTsKKyAgICAgIH0KKyAgICB9OworCisgICAgdHlwZWRlZiBTbWFydFNjb3BlZFJlYWRlcjxmYWxzZT4gU2NvcGVkUmVhZGVyOworCisgICAgLy8vIFNjb3BlZFdyaXRlciAtIFJBSUkgYWNxdWlzaXRpb24gb2YgYSB3cml0ZXIgbG9jaworICAgIHRlbXBsYXRlPGJvb2wgbXRfb25seT4KKyAgICBzdHJ1Y3QgU21hcnRTY29wZWRXcml0ZXIgeworICAgICAgU21hcnRSV011dGV4PG10X29ubHk+JiBtdXRleDsKKworICAgICAgZXhwbGljaXQgU21hcnRTY29wZWRXcml0ZXIoU21hcnRSV011dGV4PG10X29ubHk+JiBtKSA6IG11dGV4KG0pIHsKKyAgICAgICAgbXV0ZXgubG9jaygpOworICAgICAgfQorCisgICAgICB+U21hcnRTY29wZWRXcml0ZXIoKSB7CisgICAgICAgIG11dGV4LnVubG9jaygpOworICAgICAgfQorICAgIH07CisKKyAgICB0eXBlZGVmIFNtYXJ0U2NvcGVkV3JpdGVyPGZhbHNlPiBTY29wZWRXcml0ZXI7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBzeXMKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfUldNVVRFWF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUmFuZG9tTnVtYmVyR2VuZXJhdG9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUmFuZG9tTnVtYmVyR2VuZXJhdG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM5OWRhYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9SYW5kb21OdW1iZXJHZW5lcmF0b3IuaApAQCAtMCwwICsxLDcwIEBACisvLz09LSBsbHZtL1N1cHBvcnQvUmFuZG9tTnVtYmVyR2VuZXJhdG9yLmggLSBSTkcgZm9yIGRpdmVyc2l0eSAtLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFuIGFic3RyYWN0aW9uIGZvciBkZXRlcm1pbmlzdGljIHJhbmRvbSBudW1iZXIKKy8vIGdlbmVyYXRpb24gKFJORykuICBOb3RlIHRoYXQgdGhlIGN1cnJlbnQgaW1wbGVtZW50YXRpb24gaXMgbm90CisvLyBjcnlwdG9ncmFwaGljYWxseSBzZWN1cmUgYXMgaXQgdXNlcyB0aGUgQysrMTEgPHJhbmRvbT4gZmFjaWxpdGllcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9SQU5ET01OVU1CRVJHRU5FUkFUT1JfSF8KKyNkZWZpbmUgTExWTV9TVVBQT1JUX1JBTkRPTU5VTUJFUkdFTkVSQVRPUl9IXworCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIiAvLyBOZWVkZWQgZm9yIHVpbnQ2NF90IG9uIFdpbmRvd3MuCisjaW5jbHVkZSA8cmFuZG9tPgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgU3RyaW5nUmVmOworCisvLy8gQSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4KKy8vLworLy8vIEluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHNob3VsZCBub3QgYmUgc2hhcmVkIGFjcm9zcyB0aHJlYWRzLiBUaGUKKy8vLyBzZWVkIHNob3VsZCBiZSBzZXQgYnkgcGFzc2luZyB0aGUgLXJuZy1zZWVkPTx1aW50NjQ+IG9wdGlvbi4gVXNlCisvLy8gTW9kdWxlOjpjcmVhdGVSTkcgdG8gY3JlYXRlIGEgbmV3IFJORyBpbnN0YW5jZSBmb3IgdXNlIHdpdGggdGhhdAorLy8vIG1vZHVsZS4KK2NsYXNzIFJhbmRvbU51bWJlckdlbmVyYXRvciB7CisKKyAgLy8gNjQtYml0IE1lcnNlbm5lIFR3aXN0ZXIgYnkgTWF0c3Vtb3RvIGFuZCBOaXNoaW11cmEsIDIwMDAKKyAgLy8gaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvbnVtZXJpYy9yYW5kb20vbWVyc2VubmVfdHdpc3Rlcl9lbmdpbmUKKyAgLy8gVGhpcyBSTkcgaXMgZGV0ZXJtaW5pc3RpY2FsbHkgcG9ydGFibGUgYWNyb3NzIEMrKzExCisgIC8vIGltcGxlbWVudGF0aW9ucy4KKyAgdXNpbmcgZ2VuZXJhdG9yX3R5cGUgPSBzdGQ6Om10MTk5MzdfNjQ7CisKK3B1YmxpYzoKKyAgdXNpbmcgcmVzdWx0X3R5cGUgPSBnZW5lcmF0b3JfdHlwZTo6cmVzdWx0X3R5cGU7CisKKyAgLy8vIFJldHVybnMgYSByYW5kb20gbnVtYmVyIGluIHRoZSByYW5nZSBbMCwgTWF4KS4KKyAgcmVzdWx0X3R5cGUgb3BlcmF0b3IoKSgpOworCisgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgbWluKCkgeyByZXR1cm4gZ2VuZXJhdG9yX3R5cGU6Om1pbigpOyB9CisgIHN0YXRpYyBjb25zdGV4cHIgcmVzdWx0X3R5cGUgbWF4KCkgeyByZXR1cm4gZ2VuZXJhdG9yX3R5cGU6Om1heCgpOyB9CisKK3ByaXZhdGU6CisgIC8vLyBTZWVkcyBhbmQgc2FsdHMgdGhlIHVuZGVybHlpbmcgUk5HIGVuZ2luZS4KKyAgLy8vCisgIC8vLyBUaGlzIGNvbnN0cnVjdG9yIHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseS4gSW5zdGVhZCB1c2UKKyAgLy8vIE1vZHVsZTo6Y3JlYXRlUk5HIHRvIGNyZWF0ZSBhIG5ldyBSTkcgc2FsdGVkIHdpdGggdGhlIE1vZHVsZSBJRC4KKyAgUmFuZG9tTnVtYmVyR2VuZXJhdG9yKFN0cmluZ1JlZiBTYWx0KTsKKworICBnZW5lcmF0b3JfdHlwZSBHZW5lcmF0b3I7CisKKyAgLy8gTm9uY29weWFibGUuCisgIFJhbmRvbU51bWJlckdlbmVyYXRvcihjb25zdCBSYW5kb21OdW1iZXJHZW5lcmF0b3IgJm90aGVyKSA9IGRlbGV0ZTsKKyAgUmFuZG9tTnVtYmVyR2VuZXJhdG9yICZvcGVyYXRvcj0oY29uc3QgUmFuZG9tTnVtYmVyR2VuZXJhdG9yICZvdGhlcikgPSBkZWxldGU7CisKKyAgZnJpZW5kIGNsYXNzIE1vZHVsZTsKK307CisKKy8vIEdldCByYW5kb20gdmVjdG9yIG9mIHNwZWNpZmllZCBzaXplCitzdGQ6OmVycm9yX2NvZGUgZ2V0UmFuZG9tQnl0ZXModm9pZCAqQnVmZmVyLCBzaXplX3QgU2l6ZSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JlY3ljbGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUmVjeWNsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2RiMmU4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JlY3ljbGVyLmgKQEAgLTAsMCArMSwxMTYgQEAKKy8vPT0tIGxsdm0vU3VwcG9ydC9SZWN5Y2xlci5oIC0gUmVjeWNsaW5nIEFsbG9jYXRvciAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIFJlY3ljbGVyIGNsYXNzIHRlbXBsYXRlLiAgU2VlIHRoZSBkb3h5Z2VuIGNvbW1lbnQgZm9yCisvLyBSZWN5Y2xlciBmb3IgbW9yZSBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1JFQ1lDTEVSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1JFQ1lDTEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvckhhbmRsaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gUHJpbnRSZWN5Y2xpbmdBbGxvY2F0b3JTdGF0cyAtIEhlbHBlciBmb3IgUmVjeWNsaW5nQWxsb2NhdG9yIGZvcgorLy8vIHByaW50aW5nIHN0YXRpc3RpY3MuCisvLy8KK3ZvaWQgUHJpbnRSZWN5Y2xlclN0YXRzKHNpemVfdCBTaXplLCBzaXplX3QgQWxpZ24sIHNpemVfdCBGcmVlTGlzdFNpemUpOworCisvLy8gUmVjeWNsZXIgLSBUaGlzIGNsYXNzIG1hbmFnZXMgYSBsaW5rZWQtbGlzdCBvZiBkZWFsbG9jYXRlZCBub2RlcworLy8vIGFuZCBmYWNpbGl0YXRlcyByZXVzaW5nIGRlYWxsb2NhdGVkIG1lbW9yeSBpbiBwbGFjZSBvZiBhbGxvY2F0aW5nCisvLy8gbmV3IG1lbW9yeS4KKy8vLwordGVtcGxhdGUgPGNsYXNzIFQsIHNpemVfdCBTaXplID0gc2l6ZW9mKFQpLCBzaXplX3QgQWxpZ24gPSBhbGlnbm9mKFQpPgorY2xhc3MgUmVjeWNsZXIgeworICBzdHJ1Y3QgRnJlZU5vZGUgeworICAgIEZyZWVOb2RlICpOZXh0OworICB9OworCisgIC8vLyBMaXN0IG9mIG5vZGVzIHRoYXQgaGF2ZSBkZWxldGVkIGNvbnRlbnRzIGFuZCBhcmUgbm90IGluIGFjdGl2ZSB1c2UuCisgIEZyZWVOb2RlICpGcmVlTGlzdCA9IG51bGxwdHI7CisKKyAgRnJlZU5vZGUgKnBvcF92YWwoKSB7CisgICAgYXV0byAqVmFsID0gRnJlZUxpc3Q7CisgICAgX19hc2FuX3VucG9pc29uX21lbW9yeV9yZWdpb24oVmFsLCBTaXplKTsKKyAgICBGcmVlTGlzdCA9IEZyZWVMaXN0LT5OZXh0OworICAgIF9fbXNhbl9hbGxvY2F0ZWRfbWVtb3J5KFZhbCwgU2l6ZSk7CisgICAgcmV0dXJuIFZhbDsKKyAgfQorCisgIHZvaWQgcHVzaChGcmVlTm9kZSAqTikgeworICAgIE4tPk5leHQgPSBGcmVlTGlzdDsKKyAgICBGcmVlTGlzdCA9IE47CisgICAgX19hc2FuX3BvaXNvbl9tZW1vcnlfcmVnaW9uKE4sIFNpemUpOworICB9CisKK3B1YmxpYzoKKyAgflJlY3ljbGVyKCkgeworICAgIC8vIElmIHRoaXMgZmFpbHMsIGVpdGhlciB0aGUgY2FsbGVlIGhhcyBsb3N0IHRyYWNrIG9mIHNvbWUgYWxsb2NhdGlvbiwKKyAgICAvLyBvciB0aGUgY2FsbGVlIGlzbid0IHRyYWNraW5nIGFsbG9jYXRpb25zIGFuZCBzaG91bGQganVzdCBjYWxsCisgICAgLy8gY2xlYXIoKSBiZWZvcmUgZGVsZXRpbmcgdGhlIFJlY3ljbGVyLgorICAgIGFzc2VydCghRnJlZUxpc3QgJiYgIk5vbi1lbXB0eSByZWN5Y2xlciBkZWxldGVkISIpOworICB9CisKKyAgLy8vIGNsZWFyIC0gUmVsZWFzZSBhbGwgdGhlIHRyYWNrZWQgYWxsb2NhdGlvbnMgdG8gdGhlIGFsbG9jYXRvci4gVGhlCisgIC8vLyByZWN5Y2xlciBtdXN0IGJlIGZyZWUgb2YgYW55IHRyYWNrZWQgYWxsb2NhdGlvbnMgYmVmb3JlIGJlaW5nCisgIC8vLyBkZWxldGVkOyBjYWxsaW5nIGNsZWFyIGlzIG9uZSB3YXkgdG8gZW5zdXJlIHRoaXMuCisgIHRlbXBsYXRlPGNsYXNzIEFsbG9jYXRvclR5cGU+CisgIHZvaWQgY2xlYXIoQWxsb2NhdG9yVHlwZSAmQWxsb2NhdG9yKSB7CisgICAgd2hpbGUgKEZyZWVMaXN0KSB7CisgICAgICBUICp0ID0gcmVpbnRlcnByZXRfY2FzdDxUICo+KHBvcF92YWwoKSk7CisgICAgICBBbGxvY2F0b3IuRGVhbGxvY2F0ZSh0KTsKKyAgICB9CisgIH0KKworICAvLy8gU3BlY2lhbCBjYXNlIGZvciBCdW1wUHRyQWxsb2NhdG9yIHdoaWNoIGhhcyBhbiBlbXB0eSBEZWFsbG9jYXRlKCkKKyAgLy8vIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gdHJhdmVyc2UgdGhlIGZyZWUgbGlzdCwgcHVsbGluZyBhbGwgdGhlIG9iamVjdHMgaW50bworICAvLy8gY2FjaGUuCisgIHZvaWQgY2xlYXIoQnVtcFB0ckFsbG9jYXRvciAmKSB7IEZyZWVMaXN0ID0gbnVsbHB0cjsgfQorCisgIHRlbXBsYXRlPGNsYXNzIFN1YkNsYXNzLCBjbGFzcyBBbGxvY2F0b3JUeXBlPgorICBTdWJDbGFzcyAqQWxsb2NhdGUoQWxsb2NhdG9yVHlwZSAmQWxsb2NhdG9yKSB7CisgICAgc3RhdGljX2Fzc2VydChhbGlnbm9mKFN1YkNsYXNzKSA8PSBBbGlnbiwKKyAgICAgICAgICAgICAgICAgICJSZWN5Y2xlciBhbGxvY2F0aW9uIGFsaWdubWVudCBpcyBsZXNzIHRoYW4gb2JqZWN0IGFsaWduISIpOworICAgIHN0YXRpY19hc3NlcnQoc2l6ZW9mKFN1YkNsYXNzKSA8PSBTaXplLAorICAgICAgICAgICAgICAgICAgIlJlY3ljbGVyIGFsbG9jYXRpb24gc2l6ZSBpcyBsZXNzIHRoYW4gb2JqZWN0IHNpemUhIik7CisgICAgcmV0dXJuIEZyZWVMaXN0ID8gcmVpbnRlcnByZXRfY2FzdDxTdWJDbGFzcyAqPihwb3BfdmFsKCkpCisgICAgICAgICAgICAgICAgICAgIDogc3RhdGljX2Nhc3Q8U3ViQ2xhc3MgKj4oQWxsb2NhdG9yLkFsbG9jYXRlKFNpemUsIEFsaWduKSk7CisgIH0KKworICB0ZW1wbGF0ZTxjbGFzcyBBbGxvY2F0b3JUeXBlPgorICBUICpBbGxvY2F0ZShBbGxvY2F0b3JUeXBlICZBbGxvY2F0b3IpIHsKKyAgICByZXR1cm4gQWxsb2NhdGU8VD4oQWxsb2NhdG9yKTsKKyAgfQorCisgIHRlbXBsYXRlPGNsYXNzIFN1YkNsYXNzLCBjbGFzcyBBbGxvY2F0b3JUeXBlPgorICB2b2lkIERlYWxsb2NhdGUoQWxsb2NhdG9yVHlwZSAmIC8qQWxsb2NhdG9yKi8sIFN1YkNsYXNzKiBFbGVtZW50KSB7CisgICAgcHVzaChyZWludGVycHJldF9jYXN0PEZyZWVOb2RlICo+KEVsZW1lbnQpKTsKKyAgfQorCisgIHZvaWQgUHJpbnRTdGF0cygpOworfTsKKwordGVtcGxhdGUgPGNsYXNzIFQsIHNpemVfdCBTaXplLCBzaXplX3QgQWxpZ24+Cit2b2lkIFJlY3ljbGVyPFQsIFNpemUsIEFsaWduPjo6UHJpbnRTdGF0cygpIHsKKyAgc2l6ZV90IFMgPSAwOworICBmb3IgKGF1dG8gKkkgPSBGcmVlTGlzdDsgSTsgSSA9IEktPk5leHQpCisgICAgKytTOworICBQcmludFJlY3ljbGVyU3RhdHMoU2l6ZSwgQWxpZ24sIFMpOworfQorCit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JlY3ljbGluZ0FsbG9jYXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JlY3ljbGluZ0FsbG9jYXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyYjAzM2IKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUmVjeWNsaW5nQWxsb2NhdG9yLmgKQEAgLTAsMCArMSw3NyBAQAorLy89PS0gbGx2bS9TdXBwb3J0L1JlY3ljbGluZ0FsbG9jYXRvci5oIC0gUmVjeWNsaW5nIEFsbG9jYXRvciAtLS0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgUmVjeWNsaW5nQWxsb2NhdG9yIGNsYXNzLiAgU2VlIHRoZSBkb3h5Z2VuIGNvbW1lbnQgZm9yCisvLyBSZWN5Y2xpbmdBbGxvY2F0b3IgZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUgaW1wbGVtZW50YXRpb24uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfUkVDWUNMSU5HQUxMT0NBVE9SX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1JFQ1lDTElOR0FMTE9DQVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUmVjeWNsZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gUmVjeWNsaW5nQWxsb2NhdG9yIC0gVGhpcyBjbGFzcyB3cmFwcyBhbiBBbGxvY2F0b3IsIGFkZGluZyB0aGUKKy8vLyBmdW5jdGlvbmFsaXR5IG9mIHJlY3ljbGluZyBkZWxldGVkIG9iamVjdHMuCisvLy8KK3RlbXBsYXRlIDxjbGFzcyBBbGxvY2F0b3JUeXBlLCBjbGFzcyBULCBzaXplX3QgU2l6ZSA9IHNpemVvZihUKSwKKyAgICAgICAgICBzaXplX3QgQWxpZ24gPSBhbGlnbm9mKFQpPgorY2xhc3MgUmVjeWNsaW5nQWxsb2NhdG9yIHsKK3ByaXZhdGU6CisgIC8vLyBCYXNlIC0gSW1wbGVtZW50YXRpb24gZGV0YWlscy4KKyAgLy8vCisgIFJlY3ljbGVyPFQsIFNpemUsIEFsaWduPiBCYXNlOworCisgIC8vLyBBbGxvY2F0b3IgLSBUaGUgd3JhcHBlZCBhbGxvY2F0b3IuCisgIC8vLworICBBbGxvY2F0b3JUeXBlIEFsbG9jYXRvcjsKKworcHVibGljOgorICB+UmVjeWNsaW5nQWxsb2NhdG9yKCkgeyBCYXNlLmNsZWFyKEFsbG9jYXRvcik7IH0KKworICAvLy8gQWxsb2NhdGUgLSBSZXR1cm4gYSBwb2ludGVyIHRvIHN0b3JhZ2UgZm9yIGFuIG9iamVjdCBvZiB0eXBlCisgIC8vLyBTdWJDbGFzcy4gVGhlIHN0b3JhZ2UgbWF5IGJlIGVpdGhlciBuZXdseSBhbGxvY2F0ZWQgb3IgcmVjeWNsZWQuCisgIC8vLworICB0ZW1wbGF0ZTxjbGFzcyBTdWJDbGFzcz4KKyAgU3ViQ2xhc3MgKkFsbG9jYXRlKCkgeyByZXR1cm4gQmFzZS50ZW1wbGF0ZSBBbGxvY2F0ZTxTdWJDbGFzcz4oQWxsb2NhdG9yKTsgfQorCisgIFQgKkFsbG9jYXRlKCkgeyByZXR1cm4gQmFzZS5BbGxvY2F0ZShBbGxvY2F0b3IpOyB9CisKKyAgLy8vIERlYWxsb2NhdGUgLSBSZWxlYXNlIHN0b3JhZ2UgZm9yIHRoZSBwb2ludGVkLXRvIG9iamVjdC4gVGhlCisgIC8vLyBzdG9yYWdlIHdpbGwgYmUga2VwdCB0cmFjayBvZiBhbmQgbWF5IGJlIHJlY3ljbGVkLgorICAvLy8KKyAgdGVtcGxhdGU8Y2xhc3MgU3ViQ2xhc3M+CisgIHZvaWQgRGVhbGxvY2F0ZShTdWJDbGFzcyogRSkgeyByZXR1cm4gQmFzZS5EZWFsbG9jYXRlKEFsbG9jYXRvciwgRSk7IH0KKworICB2b2lkIFByaW50U3RhdHMoKSB7CisgICAgQWxsb2NhdG9yLlByaW50U3RhdHMoKTsKKyAgICBCYXNlLlByaW50U3RhdHMoKTsKKyAgfQorfTsKKworfQorCit0ZW1wbGF0ZTxjbGFzcyBBbGxvY2F0b3JUeXBlLCBjbGFzcyBULCBzaXplX3QgU2l6ZSwgc2l6ZV90IEFsaWduPgoraW5saW5lIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6UmVjeWNsaW5nQWxsb2NhdG9yPEFsbG9jYXRvclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBULCBTaXplLCBBbGlnbj4gJkFsbG9jYXRvcikgeworICBhc3NlcnQoc2l6ZSA8PSBTaXplICYmICJhbGxvY2F0aW9uIHNpemUgZXhjZWVkZWQiKTsKKyAgcmV0dXJuIEFsbG9jYXRvci5BbGxvY2F0ZSgpOworfQorCit0ZW1wbGF0ZTxjbGFzcyBBbGxvY2F0b3JUeXBlLCBjbGFzcyBULCBzaXplX3QgU2l6ZSwgc2l6ZV90IEFsaWduPgoraW5saW5lIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGx2bTo6UmVjeWNsaW5nQWxsb2NhdG9yPEFsbG9jYXRvclR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQsIFNpemUsIEFsaWduPiAmQSkgeworICBBLkRlYWxsb2NhdGUoRSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JlZ2V4LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUmVnZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDk4ODM1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1JlZ2V4LmgKQEAgLTAsMCArMSwxMDIgQEAKKy8vPT09LS0gUmVnZXguaCAtIFJlZ3VsYXIgRXhwcmVzc2lvbiBtYXRjaGVyIGltcGxlbWVudGF0aW9uIC0qLSBDKysgLSotLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSBQT1NJWCByZWd1bGFyIGV4cHJlc3Npb24gbWF0Y2hlci4gIEJvdGggQmFzaWMgYW5kCisvLyBFeHRlbmRlZCBQT1NJWCByZWd1bGFyIGV4cHJlc3Npb25zIChFUkUpIGFyZSBzdXBwb3J0ZWQuICBFUkVzIHdlcmUgZXh0ZW5kZWQKKy8vIHRvIHN1cHBvcnQgYmFja3JlZmVyZW5jZXMgaW4gbWF0Y2hlcy4KKy8vIFRoaXMgaW1wbGVtZW50YXRpb24gYWxzbyBzdXBwb3J0cyBtYXRjaGluZyBzdHJpbmdzIHdpdGggZW1iZWRkZWQgTlVMIGNoYXJzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1JFR0VYX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1JFR0VYX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKworc3RydWN0IGxsdm1fcmVnZXg7CisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgU3RyaW5nUmVmOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBTbWFsbFZlY3RvckltcGw7CisKKyAgY2xhc3MgUmVnZXggeworICBwdWJsaWM6CisgICAgZW51bSB7CisgICAgICBOb0ZsYWdzPTAsCisgICAgICAvLy8gQ29tcGlsZSBmb3IgbWF0Y2hpbmcgdGhhdCBpZ25vcmVzIHVwcGVyL2xvd2VyIGNhc2UgZGlzdGluY3Rpb25zLgorICAgICAgSWdub3JlQ2FzZT0xLAorICAgICAgLy8vIENvbXBpbGUgZm9yIG5ld2xpbmUtc2Vuc2l0aXZlIG1hdGNoaW5nLiBXaXRoIHRoaXMgZmxhZyAnW14nIGJyYWNrZXQKKyAgICAgIC8vLyBleHByZXNzaW9ucyBhbmQgJy4nIG5ldmVyIG1hdGNoIG5ld2xpbmUuIEEgXiBhbmNob3IgbWF0Y2hlcyB0aGUKKyAgICAgIC8vLyBudWxsIHN0cmluZyBhZnRlciBhbnkgbmV3bGluZSBpbiB0aGUgc3RyaW5nIGluIGFkZGl0aW9uIHRvIGl0cyBub3JtYWwKKyAgICAgIC8vLyBmdW5jdGlvbiwgYW5kIHRoZSAkIGFuY2hvciBtYXRjaGVzIHRoZSBudWxsIHN0cmluZyBiZWZvcmUgYW55CisgICAgICAvLy8gbmV3bGluZSBpbiB0aGUgc3RyaW5nIGluIGFkZGl0aW9uIHRvIGl0cyBub3JtYWwgZnVuY3Rpb24uCisgICAgICBOZXdsaW5lPTIsCisgICAgICAvLy8gQnkgZGVmYXVsdCwgdGhlIFBPU0lYIGV4dGVuZGVkIHJlZ3VsYXIgZXhwcmVzc2lvbiAoRVJFKSBzeW50YXggaXMKKyAgICAgIC8vLyBhc3N1bWVkLiBQYXNzIHRoaXMgZmxhZyB0byB0dXJuIG9uIGJhc2ljIHJlZ3VsYXIgZXhwcmVzc2lvbnMgKEJSRSkKKyAgICAgIC8vLyBpbnN0ZWFkLgorICAgICAgQmFzaWNSZWdleD00CisgICAgfTsKKworICAgIFJlZ2V4KCk7CisgICAgLy8vIENvbXBpbGVzIHRoZSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24gXHAgUmVnZXguCisgICAgUmVnZXgoU3RyaW5nUmVmIFJlZ2V4LCB1bnNpZ25lZCBGbGFncyA9IE5vRmxhZ3MpOworICAgIFJlZ2V4KGNvbnN0IFJlZ2V4ICYpID0gZGVsZXRlOworICAgIFJlZ2V4ICZvcGVyYXRvcj0oUmVnZXggcmVnZXgpIHsKKyAgICAgIHN0ZDo6c3dhcChwcmVnLCByZWdleC5wcmVnKTsKKyAgICAgIHN0ZDo6c3dhcChlcnJvciwgcmVnZXguZXJyb3IpOworICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBSZWdleChSZWdleCAmJnJlZ2V4KTsKKyAgICB+UmVnZXgoKTsKKworICAgIC8vLyBpc1ZhbGlkIC0gcmV0dXJucyB0aGUgZXJyb3IgZW5jb3VudGVyZWQgZHVyaW5nIHJlZ2V4IGNvbXBpbGF0aW9uLCBvcgorICAgIC8vLyBtYXRjaGluZywgaWYgYW55LgorICAgIGJvb2wgaXNWYWxpZChzdGQ6OnN0cmluZyAmRXJyb3IpIGNvbnN0OworCisgICAgLy8vIGdldE51bU1hdGNoZXMgLSBJbiBhIHZhbGlkIHJlZ2V4LCByZXR1cm4gdGhlIG51bWJlciBvZiBwYXJlbnRoZXNpemVkCisgICAgLy8vIG1hdGNoZXMgaXQgY29udGFpbnMuICBUaGUgbnVtYmVyIGZpbGxlZCBpbiBieSBtYXRjaCB3aWxsIGluY2x1ZGUgdGhpcworICAgIC8vLyBtYW55IGVudHJpZXMgcGx1cyBvbmUgZm9yIHRoZSB3aG9sZSByZWdleCAoYXMgZWxlbWVudCAwKS4KKyAgICB1bnNpZ25lZCBnZXROdW1NYXRjaGVzKCkgY29uc3Q7CisKKyAgICAvLy8gbWF0Y2hlcyAtIE1hdGNoIHRoZSByZWdleCBhZ2FpbnN0IGEgZ2l2ZW4gXHAgU3RyaW5nLgorICAgIC8vLworICAgIC8vLyBccGFyYW0gTWF0Y2hlcyAtIElmIGdpdmVuLCBvbiBhIHN1Y2Nlc3NmdWwgbWF0Y2ggdGhpcyB3aWxsIGJlIGZpbGxlZCBpbgorICAgIC8vLyB3aXRoIHJlZmVyZW5jZXMgdG8gdGhlIG1hdGNoZWQgZ3JvdXAgZXhwcmVzc2lvbnMgKGluc2lkZSBccCBTdHJpbmcpLAorICAgIC8vLyB0aGUgZmlyc3QgZ3JvdXAgaXMgYWx3YXlzIHRoZSBlbnRpcmUgcGF0dGVybi4KKyAgICAvLy8KKyAgICAvLy8gVGhpcyByZXR1cm5zIHRydWUgb24gYSBzdWNjZXNzZnVsIG1hdGNoLgorICAgIGJvb2wgbWF0Y2goU3RyaW5nUmVmIFN0cmluZywgU21hbGxWZWN0b3JJbXBsPFN0cmluZ1JlZj4gKk1hdGNoZXMgPSBudWxscHRyKTsKKworICAgIC8vLyBzdWIgLSBSZXR1cm4gdGhlIHJlc3VsdCBvZiByZXBsYWNpbmcgdGhlIGZpcnN0IG1hdGNoIG9mIHRoZSByZWdleCBpbgorICAgIC8vLyBccCBTdHJpbmcgd2l0aCB0aGUgXHAgUmVwbCBzdHJpbmcuIEJhY2tyZWZlcmVuY2VzIGxpa2UgIlwwIiBpbiB0aGUKKyAgICAvLy8gcmVwbGFjZW1lbnQgc3RyaW5nIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBhcHByb3ByaWF0ZSBtYXRjaCBzdWJzdHJpbmcuCisgICAgLy8vCisgICAgLy8vIE5vdGUgdGhhdCB0aGUgcmVwbGFjZW1lbnQgc3RyaW5nIGhhcyBiYWNrc2xhc2ggZXNjYXBpbmcgcGVyZm9ybWVkIG9uCisgICAgLy8vIGl0LiBJbnZhbGlkIGJhY2tyZWZlcmVuY2VzIGFyZSBpZ25vcmVkIChyZXBsYWNlZCBieSBlbXB0eSBzdHJpbmdzKS4KKyAgICAvLy8KKyAgICAvLy8gXHBhcmFtIEVycm9yIElmIG5vbi1udWxsLCBhbnkgZXJyb3JzIGluIHRoZSBzdWJzdGl0dXRpb24gKGludmFsaWQKKyAgICAvLy8gYmFja3JlZmVyZW5jZXMsIHRyYWlsaW5nIGJhY2tzbGFzaGVzKSB3aWxsIGJlIHJlY29yZGVkIGFzIGEgbm9uLWVtcHR5CisgICAgLy8vIHN0cmluZy4KKyAgICBzdGQ6OnN0cmluZyBzdWIoU3RyaW5nUmVmIFJlcGwsIFN0cmluZ1JlZiBTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICpFcnJvciA9IG51bGxwdHIpOworCisgICAgLy8vIFxicmllZiBJZiB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSwgXlN0ciQgaXMgYW4gZXh0ZW5kZWQgcmVndWxhcgorICAgIC8vLyBleHByZXNzaW9uIHRoYXQgbWF0Y2hlcyBTdHIgYW5kIG9ubHkgU3RyLgorICAgIHN0YXRpYyBib29sIGlzTGl0ZXJhbEVSRShTdHJpbmdSZWYgU3RyKTsKKworICAgIC8vLyBcYnJpZWYgVHVybiBTdHJpbmcgaW50byBhIHJlZ2V4IGJ5IGVzY2FwaW5nIGl0cyBzcGVjaWFsIGNoYXJhY3RlcnMuCisgICAgc3RhdGljIHN0ZDo6c3RyaW5nIGVzY2FwZShTdHJpbmdSZWYgU3RyaW5nKTsKKworICBwcml2YXRlOgorICAgIHN0cnVjdCBsbHZtX3JlZ2V4ICpwcmVnOworICAgIGludCBlcnJvcjsKKyAgfTsKK30KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9SRUdFWF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUmVnaXN0cnkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9SZWdpc3RyeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyZmQ1YjkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUmVnaXN0cnkuaApAQCAtMCwwICsxLDE2MCBAQAorLy89PT0gUmVnaXN0cnkuaCAtIExpbmtlci1zdXBwb3J0ZWQgcGx1Z2luIHJlZ2lzdHJpZXMgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEZWZpbmVzIGEgcmVnaXN0cnkgdGVtcGxhdGUgZm9yIGRpc2NvdmVyaW5nIHBsdWdnYWJsZSBtb2R1bGVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1JFR0lTVFJZX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1JFR0lTVFJZX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NUTEV4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0R5bmFtaWNMaWJyYXJ5LmgiCisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisgIC8vLyBBIHNpbXBsZSByZWdpc3RyeSBlbnRyeSB3aGljaCBwcm92aWRlcyBvbmx5IGEgbmFtZSwgZGVzY3JpcHRpb24sIGFuZAorICAvLy8gbm8tYXJndW1lbnQgY29uc3RydWN0b3IuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBjbGFzcyBTaW1wbGVSZWdpc3RyeUVudHJ5IHsKKyAgICBTdHJpbmdSZWYgTmFtZSwgRGVzYzsKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gKCpDdG9yKSgpOworCisgIHB1YmxpYzoKKyAgICBTaW1wbGVSZWdpc3RyeUVudHJ5KFN0cmluZ1JlZiBOLCBTdHJpbmdSZWYgRCwgc3RkOjp1bmlxdWVfcHRyPFQ+ICgqQykoKSkKKyAgICAgICAgOiBOYW1lKE4pLCBEZXNjKEQpLCBDdG9yKEMpIHt9CisKKyAgICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKyAgICBTdHJpbmdSZWYgZ2V0RGVzYygpIGNvbnN0IHsgcmV0dXJuIERlc2M7IH0KKyAgICBzdGQ6OnVuaXF1ZV9wdHI8VD4gaW5zdGFudGlhdGUoKSBjb25zdCB7IHJldHVybiBDdG9yKCk7IH0KKyAgfTsKKworICAvLy8gQSBnbG9iYWwgcmVnaXN0cnkgdXNlZCBpbiBjb25qdW5jdGlvbiB3aXRoIHN0YXRpYyBjb25zdHJ1Y3RvcnMgdG8gbWFrZQorICAvLy8gcGx1Z2dhYmxlIGNvbXBvbmVudHMgKGxpa2UgdGFyZ2V0cyBvciBnYXJiYWdlIGNvbGxlY3RvcnMpICJqdXN0IHdvcmsiIHdoZW4KKyAgLy8vIGxpbmtlZCB3aXRoIGFuIGV4ZWN1dGFibGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBjbGFzcyBSZWdpc3RyeSB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIFQgdHlwZTsKKyAgICB0eXBlZGVmIFNpbXBsZVJlZ2lzdHJ5RW50cnk8VD4gZW50cnk7CisKKyAgICBjbGFzcyBub2RlOworICAgIGNsYXNzIGl0ZXJhdG9yOworCisgIHByaXZhdGU6CisgICAgUmVnaXN0cnkoKSA9IGRlbGV0ZTsKKworICAgIGZyaWVuZCBjbGFzcyBub2RlOworICAgIHN0YXRpYyBub2RlICpIZWFkLCAqVGFpbDsKKworICBwdWJsaWM6CisgICAgLy8vIE5vZGUgaW4gbGlua2VkIGxpc3Qgb2YgZW50cmllcy4KKyAgICAvLy8KKyAgICBjbGFzcyBub2RlIHsKKyAgICAgIGZyaWVuZCBjbGFzcyBpdGVyYXRvcjsKKyAgICAgIGZyaWVuZCBSZWdpc3RyeTxUPjsKKworICAgICAgbm9kZSAqTmV4dDsKKyAgICAgIGNvbnN0IGVudHJ5JiBWYWw7CisKKyAgICBwdWJsaWM6CisgICAgICBub2RlKGNvbnN0IGVudHJ5ICZWKSA6IE5leHQobnVsbHB0ciksIFZhbChWKSB7fQorICAgIH07CisKKyAgICAvLy8gQWRkIGEgbm9kZSB0byB0aGUgUmVnaXN0cnk6IHRoaXMgaXMgdGhlIGludGVyZmFjZSBiZXR3ZWVuIHRoZSBwbHVnaW4gYW5kCisgICAgLy8vIHRoZSBleGVjdXRhYmxlLgorICAgIC8vLworICAgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIGV4cG9ydGVkIGJ5IHRoZSBleGVjdXRhYmxlIGFuZCBjYWxsZWQgYnkgdGhlIHBsdWdpbiB0bworICAgIC8vLyBhZGQgYSBub2RlIHRvIHRoZSBleGVjdXRhYmxlJ3MgcmVnaXN0cnkuIFRoZXJlZm9yZSBpdCdzIG5vdCBkZWZpbmVkIGhlcmUKKyAgICAvLy8gdG8gYXZvaWQgaXQgYmVpbmcgaW5zdGFudGlhdGVkIGluIHRoZSBwbHVnaW4gYW5kIGlzIGluc3RlYWQgZGVmaW5lZCBpbgorICAgIC8vLyB0aGUgZXhlY3V0YWJsZSAoc2VlIExMVk1fSU5TVEFOVElBVEVfUkVHSVNUUlkgYmVsb3cpLgorICAgIHN0YXRpYyB2b2lkIGFkZF9ub2RlKG5vZGUgKk4pOworCisgICAgLy8vIEl0ZXJhdG9ycyBmb3IgcmVnaXN0cnkgZW50cmllcy4KKyAgICAvLy8KKyAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICBjb25zdCBub2RlICpDdXI7CisKKyAgICBwdWJsaWM6CisgICAgICBleHBsaWNpdCBpdGVyYXRvcihjb25zdCBub2RlICpOKSA6IEN1cihOKSB7fQorCisgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3IgJlRoYXQpIGNvbnN0IHsgcmV0dXJuIEN1ciA9PSBUaGF0LkN1cjsgfQorICAgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yICZUaGF0KSBjb25zdCB7IHJldHVybiBDdXIgIT0gVGhhdC5DdXI7IH0KKyAgICAgIGl0ZXJhdG9yICZvcGVyYXRvcisrKCkgeyBDdXIgPSBDdXItPk5leHQ7IHJldHVybiAqdGhpczsgfQorICAgICAgY29uc3QgZW50cnkgJm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIEN1ci0+VmFsOyB9CisgICAgICBjb25zdCBlbnRyeSAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICZDdXItPlZhbDsgfQorICAgIH07CisKKyAgICAvLyBiZWdpbiBpcyBub3QgZGVmaW5lZCBoZXJlIGluIG9yZGVyIHRvIGF2b2lkIHVzYWdlIG9mIGFuIHVuZGVmaW5lZCBzdGF0aWMKKyAgICAvLyBkYXRhIG1lbWJlciwgaW5zdGVhZCBpdCdzIGluc3RhbnRpYXRlZCBieSBMTFZNX0lOU1RBTlRJQVRFX1JFR0lTVFJZLgorICAgIHN0YXRpYyBpdGVyYXRvciBiZWdpbigpOworICAgIHN0YXRpYyBpdGVyYXRvciBlbmQoKSAgIHsgcmV0dXJuIGl0ZXJhdG9yKG51bGxwdHIpOyB9CisKKyAgICBzdGF0aWMgaXRlcmF0b3JfcmFuZ2U8aXRlcmF0b3I+IGVudHJpZXMoKSB7CisgICAgICByZXR1cm4gbWFrZV9yYW5nZShiZWdpbigpLCBlbmQoKSk7CisgICAgfQorCisgICAgLy8vIEEgc3RhdGljIHJlZ2lzdHJhdGlvbiB0ZW1wbGF0ZS4gVXNlIGxpa2Ugc3VjaDoKKyAgICAvLy8KKyAgICAvLy8gICBSZWdpc3RyeTxDb2xsZWN0b3I+OjpBZGQ8RmFuY3lHQz4KKyAgICAvLy8gICBYKCJmYW5jeS1nYyIsICJOZXdmYW5nbGVkIGdhcmJhZ2UgY29sbGVjdG9yLiIpOworICAgIC8vLworICAgIC8vLyBVc2Ugb2YgdGhpcyB0ZW1wbGF0ZSByZXF1aXJlcyB0aGF0OgorICAgIC8vLworICAgIC8vLyAgMS4gVGhlIHJlZ2lzdGVyZWQgc3ViY2xhc3MgaGFzIGEgZGVmYXVsdCBjb25zdHJ1Y3Rvci4KKyAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVj4KKyAgICBjbGFzcyBBZGQgeworICAgICAgZW50cnkgRW50cnk7CisgICAgICBub2RlIE5vZGU7CisKKyAgICAgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8VD4gQ3RvckZuKCkgeyByZXR1cm4gbWFrZV91bmlxdWU8Vj4oKTsgfQorCisgICAgcHVibGljOgorICAgICAgQWRkKFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgRGVzYykKKyAgICAgICAgICA6IEVudHJ5KE5hbWUsIERlc2MsIEN0b3JGbiksIE5vZGUoRW50cnkpIHsKKyAgICAgICAgYWRkX25vZGUoJk5vZGUpOworICAgICAgfQorICAgIH07CisgIH07Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisvLy8gSW5zdGFudGlhdGUgYSByZWdpc3RyeSBjbGFzcy4KKy8vLworLy8vIFRoaXMgcHJvdmlkZXMgdGVtcGxhdGUgZGVmaW5pdGlvbnMgb2YgYWRkX25vZGUsIGJlZ2luLCBhbmQgdGhlIEhlYWQgYW5kIFRhaWwKKy8vLyBwb2ludGVycywgdGhlbiBleHBsaWNpdGx5IGluc3RhbnRpYXRlcyB0aGVtLiBXZSBjb3VsZCBleHBsaWNpdGx5IHNwZWNpYWxpemUKKy8vLyB0aGVtLCBpbnN0ZWFkIG9mIHRoZSB0d28tc3RlcCBwcm9jZXNzIG9mIGRlZmluZSB0aGVuIGluc3RhbnRpYXRlLCBidXQKKy8vLyBzdHJpY3RseSBzcGVha2luZyB0aGF0J3Mgbm90IGFsbG93ZWQgYnkgdGhlIEMrKyBzdGFuZGFyZCAod2Ugd291bGQgbmVlZCB0bworLy8vIGhhdmUgZXhwbGljaXQgc3BlY2lhbGl6YXRpb24gZGVjbGFyYXRpb25zIGluIGFsbCB0cmFuc2xhdGlvbiB1bml0cyB3aGVyZSB0aGUKKy8vLyBzcGVjaWFsaXphdGlvbiBpcyB1c2VkKSBzbyB3ZSBkb24ndC4KKyNkZWZpbmUgTExWTV9JTlNUQU5USUFURV9SRUdJU1RSWShSRUdJU1RSWV9DTEFTUykgXAorICBuYW1lc3BhY2UgbGx2bSB7IFwKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gdHlwZW5hbWUgUmVnaXN0cnk8VD46Om5vZGUgKlJlZ2lzdHJ5PFQ+OjpIZWFkID0gbnVsbHB0cjtcCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHR5cGVuYW1lIFJlZ2lzdHJ5PFQ+Ojpub2RlICpSZWdpc3RyeTxUPjo6VGFpbCA9IG51bGxwdHI7XAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBcCisgIHZvaWQgUmVnaXN0cnk8VD46OmFkZF9ub2RlKHR5cGVuYW1lIFJlZ2lzdHJ5PFQ+Ojpub2RlICpOKSB7IFwKKyAgICBpZiAoVGFpbCkgXAorICAgICAgVGFpbC0+TmV4dCA9IE47IFwKKyAgICBlbHNlIFwKKyAgICAgIEhlYWQgPSBOOyBcCisgICAgVGFpbCA9IE47IFwKKyAgfSBcCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IHR5cGVuYW1lIFJlZ2lzdHJ5PFQ+OjppdGVyYXRvciBSZWdpc3RyeTxUPjo6YmVnaW4oKSB7IFwKKyAgICByZXR1cm4gaXRlcmF0b3IoSGVhZCk7IFwKKyAgfSBcCisgIHRlbXBsYXRlIFJFR0lTVFJZX0NMQVNTOjpub2RlICpSZWdpc3RyeTxSRUdJU1RSWV9DTEFTUzo6dHlwZT46OkhlYWQ7IFwKKyAgdGVtcGxhdGUgUkVHSVNUUllfQ0xBU1M6Om5vZGUgKlJlZ2lzdHJ5PFJFR0lTVFJZX0NMQVNTOjp0eXBlPjo6VGFpbDsgXAorICB0ZW1wbGF0ZSBcCisgIHZvaWQgUmVnaXN0cnk8UkVHSVNUUllfQ0xBU1M6OnR5cGU+OjphZGRfbm9kZShSRUdJU1RSWV9DTEFTUzo6bm9kZSopOyBcCisgIHRlbXBsYXRlIFJFR0lTVFJZX0NMQVNTOjppdGVyYXRvciBSZWdpc3RyeTxSRUdJU1RSWV9DTEFTUzo6dHlwZT46OmJlZ2luKCk7IFwKKyAgfQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX1JFR0lTVFJZX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9SZXZlcnNlSXRlcmF0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUmV2ZXJzZUl0ZXJhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlMDIzOGQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvUmV2ZXJzZUl0ZXJhdGlvbi5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1JFVkVSU0VJVEVSQVRJT05fSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfUkVWRVJTRUlURVJBVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9hYmktYnJlYWtpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvUG9pbnRlckxpa2VUeXBlVHJhaXRzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGU8Y2xhc3MgVCA9IHZvaWQgKj4KK2Jvb2wgc2hvdWxkUmV2ZXJzZUl0ZXJhdGUoKSB7CisjaWYgTExWTV9FTkFCTEVfUkVWRVJTRV9JVEVSQVRJT04KKyAgcmV0dXJuIGRldGFpbDo6SXNQb2ludGVyTGlrZTxUPjo6dmFsdWU7CisjZWxzZQorICByZXR1cm4gZmFsc2U7CisjZW5kaWYKK30KKworfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU0hBMS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1NIQTEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZmM2MGE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1NIQTEuaApAQCAtMCwwICsxLDg5IEBACisvLz09LSBTSEExLmggLSBTSEExIGltcGxlbWVudGF0aW9uIGZvciBMTFZNICAgICAgICAgICAgICAgICAgICAgLS0qLSBDKysgLSotPT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGhpcyBjb2RlIGlzIHRha2VuIGZyb20gcHVibGljIGRvbWFpbgorLy8gKGh0dHA6Ly9vYXV0aC5nb29nbGVjb2RlLmNvbS9zdm4vY29kZS9jL2xpYm9hdXRoL3NyYy9zaGExLmMpCisvLyBhbmQgbW9kaWZpZWQgYnkgd3JhcHBpbmcgaXQgaW4gYSBDKysgaW50ZXJmYWNlIGZvciBMTFZNLAorLy8gYW5kIHJlbW92aW5nIHVubmVjZXNzYXJ5IGNvZGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfU0hBMV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9TSEExX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisKKyNpbmNsdWRlIDxhcnJheT4KKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgQXJyYXlSZWY7CitjbGFzcyBTdHJpbmdSZWY7CisKKy8vLyBBIGNsYXNzIHRoYXQgd3JhcCB0aGUgU0hBMSBhbGdvcml0aG0uCitjbGFzcyBTSEExIHsKK3B1YmxpYzoKKyAgU0hBMSgpIHsgaW5pdCgpOyB9CisKKyAgLy8vIFJlaW5pdGlhbGl6ZSB0aGUgaW50ZXJuYWwgc3RhdGUKKyAgdm9pZCBpbml0KCk7CisKKyAgLy8vIERpZ2VzdCBtb3JlIGRhdGEuCisgIHZvaWQgdXBkYXRlKEFycmF5UmVmPHVpbnQ4X3Q+IERhdGEpOworCisgIC8vLyBEaWdlc3QgbW9yZSBkYXRhLgorICB2b2lkIHVwZGF0ZShTdHJpbmdSZWYgU3RyKSB7CisgICAgdXBkYXRlKEFycmF5UmVmPHVpbnQ4X3Q+KCh1aW50OF90ICopY29uc3RfY2FzdDxjaGFyICo+KFN0ci5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHIuc2l6ZSgpKSk7CisgIH0KKworICAvLy8gUmV0dXJuIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IHJhdyAxNjAtYml0cyBTSEExIGZvciB0aGUgZGlnZXN0ZWQgZGF0YQorICAvLy8gc2luY2UgdGhlIGxhc3QgY2FsbCB0byBpbml0KCkuIFRoaXMgY2FsbCB3aWxsIGFkZCBkYXRhIHRvIHRoZSBpbnRlcm5hbAorICAvLy8gc3RhdGUgYW5kIGFzIHN1Y2ggaXMgbm90IHN1aXRlZCBmb3IgZ2V0dGluZyBhbiBpbnRlcm1lZGlhdGUgcmVzdWx0CisgIC8vLyAoc2VlIHJlc3VsdCgpKS4KKyAgU3RyaW5nUmVmIGZpbmFsKCk7CisKKyAgLy8vIFJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCByYXcgMTYwLWJpdHMgU0hBMSBmb3IgdGhlIGRpZ2VzdGVkIGRhdGEKKyAgLy8vIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gaW5pdCgpLiBUaGlzIGlzIHN1aXRhYmxlIGZvciBnZXR0aW5nIHRoZSBTSEExIGF0CisgIC8vLyBhbnkgdGltZSB3aXRob3V0IGludmFsaWRhdGluZyB0aGUgaW50ZXJuYWwgc3RhdGUgc28gdGhhdCBtb3JlIGNhbGxzIGNhbiBiZQorICAvLy8gbWFkZSBpbnRvIHVwZGF0ZS4KKyAgU3RyaW5nUmVmIHJlc3VsdCgpOworCisgIC8vLyBSZXR1cm5zIGEgcmF3IDE2MC1iaXQgU0hBMSBoYXNoIGZvciB0aGUgZ2l2ZW4gZGF0YS4KKyAgc3RhdGljIHN0ZDo6YXJyYXk8dWludDhfdCwgMjA+IGhhc2goQXJyYXlSZWY8dWludDhfdD4gRGF0YSk7CisKK3ByaXZhdGU6CisgIC8vLyBEZWZpbmUgc29tZSBjb25zdGFudHMuCisgIC8vLyAic3RhdGljIGNvbnN0ZXhwciIgd291bGQgYmUgY2xlYW5lciBidXQgTVNWQyBkb2VzIG5vdCBzdXBwb3J0IGl0IHlldC4KKyAgZW51bSB7IEJMT0NLX0xFTkdUSCA9IDY0IH07CisgIGVudW0geyBIQVNIX0xFTkdUSCA9IDIwIH07CisKKyAgLy8gSW50ZXJuYWwgU3RhdGUKKyAgc3RydWN0IHsKKyAgICB1bmlvbiB7CisgICAgICB1aW50OF90IENbQkxPQ0tfTEVOR1RIXTsKKyAgICAgIHVpbnQzMl90IExbQkxPQ0tfTEVOR1RIIC8gNF07CisgICAgfSBCdWZmZXI7CisgICAgdWludDMyX3QgU3RhdGVbSEFTSF9MRU5HVEggLyA0XTsKKyAgICB1aW50MzJfdCBCeXRlQ291bnQ7CisgICAgdWludDhfdCBCdWZmZXJPZmZzZXQ7CisgIH0gSW50ZXJuYWxTdGF0ZTsKKworICAvLyBJbnRlcm5hbCBjb3B5IG9mIHRoZSBoYXNoLCBwb3B1bGF0ZWQgYW5kIGFjY2Vzc2VkIG9uIGNhbGxzIHRvIHJlc3VsdCgpCisgIHVpbnQzMl90IEhhc2hSZXN1bHRbSEFTSF9MRU5HVEggLyA0XTsKKworICAvLyBIZWxwZXIKKyAgdm9pZCB3cml0ZWJ5dGUodWludDhfdCBkYXRhKTsKKyAgdm9pZCBoYXNoQmxvY2soKTsKKyAgdm9pZCBhZGRVbmNvdW50ZWQodWludDhfdCBkYXRhKTsKKyAgdm9pZCBwYWQoKTsKK307CisKK30gLy8gZW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1NNTG9jLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU01Mb2MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YjhiZTU1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1NNTG9jLmgKQEAgLTAsMCArMSw2NSBAQAorLy89PT0tIFNNTG9jLmggLSBTb3VyY2UgbG9jYXRpb24gZm9yIHVzZSB3aXRoIGRpYWdub3N0aWNzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFNNTG9jIGNsYXNzLiAgVGhpcyBjbGFzcyBlbmNhcHN1bGF0ZXMgYSBsb2NhdGlvbiBpbgorLy8gc291cmNlIGNvZGUgZm9yIHVzZSBpbiBkaWFnbm9zdGljcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9TTUxPQ19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9TTUxPQ19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9Ob25lLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gUmVwcmVzZW50cyBhIGxvY2F0aW9uIGluIHNvdXJjZSBjb2RlLgorY2xhc3MgU01Mb2MgeworICBjb25zdCBjaGFyICpQdHIgPSBudWxscHRyOworCitwdWJsaWM6CisgIFNNTG9jKCkgPSBkZWZhdWx0OworCisgIGJvb2wgaXNWYWxpZCgpIGNvbnN0IHsgcmV0dXJuIFB0ciAhPSBudWxscHRyOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFNNTG9jICZSSFMpIGNvbnN0IHsgcmV0dXJuIFJIUy5QdHIgPT0gUHRyOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBTTUxvYyAmUkhTKSBjb25zdCB7IHJldHVybiBSSFMuUHRyICE9IFB0cjsgfQorCisgIGNvbnN0IGNoYXIgKmdldFBvaW50ZXIoKSBjb25zdCB7IHJldHVybiBQdHI7IH0KKworICBzdGF0aWMgU01Mb2MgZ2V0RnJvbVBvaW50ZXIoY29uc3QgY2hhciAqUHRyKSB7CisgICAgU01Mb2MgTDsKKyAgICBMLlB0ciA9IFB0cjsKKyAgICByZXR1cm4gTDsKKyAgfQorfTsKKworLy8vIFJlcHJlc2VudHMgYSByYW5nZSBpbiBzb3VyY2UgY29kZS4KKy8vLworLy8vIFNNUmFuZ2UgaXMgaW1wbGVtZW50ZWQgdXNpbmcgYSBoYWxmLW9wZW4gcmFuZ2UsIGFzIGlzIHRoZSBjb252ZW50aW9uIGluIEMrKy4KKy8vLyBJbiB0aGUgc3RyaW5nICJhYmMiLCB0aGUgcmFuZ2UgKDEsM10gcmVwcmVzZW50cyB0aGUgc3Vic3RyaW5nICJiYyIsIGFuZCB0aGUKKy8vLyByYW5nZSAoMiwyXSByZXByZXNlbnRzIGFuIGVtcHR5IHJhbmdlIGJldHdlZW4gdGhlIGNoYXJhY3RlcnMgImIiIGFuZCAiYyIuCitjbGFzcyBTTVJhbmdlIHsKK3B1YmxpYzoKKyAgU01Mb2MgU3RhcnQsIEVuZDsKKworICBTTVJhbmdlKCkgPSBkZWZhdWx0OworICBTTVJhbmdlKE5vbmVUeXBlKSB7fQorICBTTVJhbmdlKFNNTG9jIFN0LCBTTUxvYyBFbikgOiBTdGFydChTdCksIEVuZChFbikgeworICAgIGFzc2VydChTdGFydC5pc1ZhbGlkKCkgPT0gRW5kLmlzVmFsaWQoKSAmJgorICAgICAgICAgICAiU3RhcnQgYW5kIGVuZCBzaG91bGQgZWl0aGVyIGJvdGggYmUgdmFsaWQgb3IgYm90aCBiZSBpbnZhbGlkISIpOworICB9CisKKyAgYm9vbCBpc1ZhbGlkKCkgY29uc3QgeyByZXR1cm4gU3RhcnQuaXNWYWxpZCgpOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX1NNTE9DX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9TYXZlQW5kUmVzdG9yZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1NhdmVBbmRSZXN0b3JlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYxNTRhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9TYXZlQW5kUmVzdG9yZS5oCkBAIC0wLDAgKzEsNDkgQEAKKy8vPT09LS0gU2F2ZUFuZFJlc3RvcmUuaCAtIFV0aWxpdHkgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBcZmlsZQorLy8vIFRoaXMgZmlsZSBwcm92aWRlcyB1dGlsaXR5IGNsYXNzZXMgdGhhdCB1c2UgUkFJSSB0byBzYXZlIGFuZCByZXN0b3JlCisvLy8gdmFsdWVzLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9TQVZFQU5EUkVTVE9SRV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9TQVZFQU5EUkVTVE9SRV9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEEgdXRpbGl0eSBjbGFzcyB0aGF0IHVzZXMgUkFJSSB0byBzYXZlIGFuZCByZXN0b3JlIHRoZSB2YWx1ZSBvZiBhIHZhcmlhYmxlLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBTYXZlQW5kUmVzdG9yZSB7CisgIFNhdmVBbmRSZXN0b3JlKFQgJlgpIDogWChYKSwgT2xkVmFsdWUoWCkge30KKyAgU2F2ZUFuZFJlc3RvcmUoVCAmWCwgY29uc3QgVCAmTmV3VmFsdWUpIDogWChYKSwgT2xkVmFsdWUoWCkgeworICAgIFggPSBOZXdWYWx1ZTsKKyAgfQorICB+U2F2ZUFuZFJlc3RvcmUoKSB7IFggPSBPbGRWYWx1ZTsgfQorICBUIGdldCgpIHsgcmV0dXJuIE9sZFZhbHVlOyB9CisKK3ByaXZhdGU6CisgIFQgJlg7CisgIFQgT2xkVmFsdWU7Cit9OworCisvLy8gU2ltaWxhciB0byBcYyBTYXZlQW5kUmVzdG9yZS4gIE9wZXJhdGVzIG9ubHkgb24gYm9vbHM7IHRoZSBvbGQgdmFsdWUgb2YgYQorLy8vIHZhcmlhYmxlIGlzIHNhdmVkLCBhbmQgZHVyaW5nIHRoZSBkc3RvciB0aGUgb2xkIHZhbHVlIGlzIG9yJ2VkIHdpdGggdGhlIG5ldworLy8vIHZhbHVlLgorc3RydWN0IFNhdmVPciB7CisgIFNhdmVPcihib29sICZYKSA6IFgoWCksIE9sZFZhbHVlKFgpIHsgWCA9IGZhbHNlOyB9CisgIH5TYXZlT3IoKSB7IFggfD0gT2xkVmFsdWU7IH0KKworcHJpdmF0ZToKKyAgYm9vbCAmWDsKKyAgY29uc3QgYm9vbCBPbGRWYWx1ZTsKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU2NhbGVkTnVtYmVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU2NhbGVkTnVtYmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZiZGJjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9TY2FsZWROdW1iZXIuaApAQCAtMCwwICsxLDg5NyBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9TY2FsZWROdW1iZXIuaCAtIFN1cHBvcnQgZm9yIHNjYWxlZCBudW1iZXJzIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgZnVuY3Rpb25zIChhbmQgYSBjbGFzcykgdXNlZnVsIGZvciB3b3JraW5nIHdpdGggc2NhbGVkCisvLyBudW1iZXJzIC0tIGluIHBhcnRpY3VsYXIsIHBhaXJzIG9mIGludGVnZXJzIHdoZXJlIG9uZSByZXByZXNlbnRzIGRpZ2l0cyBhbmQKKy8vIGFub3RoZXIgcmVwcmVzZW50cyBhIHNjYWxlLiAgVGhlIGZ1bmN0aW9ucyBhcmUgaGVscGVycyBhbmQgbGl2ZSBpbiB0aGUKKy8vIG5hbWVzcGFjZSBTY2FsZWROdW1iZXJzLiAgVGhlIGNsYXNzIFNjYWxlZE51bWJlciBpcyB1c2VmdWwgZm9yIG1vZGVsbGluZworLy8gY2VydGFpbiBjb3N0IG1ldHJpY3MgdGhhdCBuZWVkIHNpbXBsZSwgaW50ZWdlci1saWtlIHNlbWFudGljcyB0aGF0IGFyZSBlYXN5CisvLyB0byByZWFzb24gYWJvdXQuCisvLworLy8gVGhlc2UgbWlnaHQgcmVtaW5kIHlvdSBvZiBzb2Z0LWZsb2F0cy4gIElmIHlvdSB3YW50IG9uZSBvZiB0aG9zZSwgeW91J3JlIGluCisvLyB0aGUgd3JvbmcgcGxhY2UuICBMb29rIGF0IGluY2x1ZGUvbGx2bS9BRFQvQVBGbG9hdC5oIGluc3RlYWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfU0NBTEVETlVNQkVSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1NDQUxFRE5VTUJFUl9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWF0aEV4dHJhcy5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dHVwbGU+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIFNjYWxlZE51bWJlcnMgeworCisvLy8gXGJyaWVmIE1heGltdW0gc2NhbGU7IHNhbWUgYXMgQVBGbG9hdCBmb3IgZWFzeSBkZWJ1ZyBwcmludGluZy4KK2NvbnN0IGludDMyX3QgTWF4U2NhbGUgPSAxNjM4MzsKKworLy8vIFxicmllZiBNYXhpbXVtIHNjYWxlOyBzYW1lIGFzIEFQRmxvYXQgZm9yIGVhc3kgZGVidWcgcHJpbnRpbmcuCitjb25zdCBpbnQzMl90IE1pblNjYWxlID0gLTE2MzgyOworCisvLy8gXGJyaWVmIEdldCB0aGUgd2lkdGggb2YgYSBudW1iZXIuCit0ZW1wbGF0ZSA8Y2xhc3MgRGlnaXRzVD4gaW5saW5lIGludCBnZXRXaWR0aCgpIHsgcmV0dXJuIHNpemVvZihEaWdpdHNUKSAqIDg7IH0KKworLy8vIFxicmllZiBDb25kaXRpb25hbGx5IHJvdW5kIHVwIGEgc2NhbGVkIG51bWJlci4KKy8vLworLy8vIEdpdmVuIFxjIERpZ2l0cyBhbmQgXGMgU2NhbGUsIHJvdW5kIHVwIGlmZiBcYyBTaG91bGRSb3VuZCBpcyBcYyB0cnVlLgorLy8vIEFsd2F5cyByZXR1cm5zIFxjIFNjYWxlIHVubGVzcyB0aGVyZSdzIGFuIG92ZXJmbG93LCBpbiB3aGljaCBjYXNlIGl0CisvLy8gcmV0dXJucyBcYyAxK1NjYWxlLgorLy8vCisvLy8gXHByZSBhZGRpbmcgMSB0byBcYyBTY2FsZSB3aWxsIG5vdCBvdmVyZmxvdyBJTlQxNl9NQVguCit0ZW1wbGF0ZSA8Y2xhc3MgRGlnaXRzVD4KK2lubGluZSBzdGQ6OnBhaXI8RGlnaXRzVCwgaW50MTZfdD4gZ2V0Um91bmRlZChEaWdpdHNUIERpZ2l0cywgaW50MTZfdCBTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNob3VsZFJvdW5kKSB7CisgIHN0YXRpY19hc3NlcnQoIXN0ZDo6bnVtZXJpY19saW1pdHM8RGlnaXRzVD46OmlzX3NpZ25lZCwgImV4cGVjdGVkIHVuc2lnbmVkIik7CisKKyAgaWYgKFNob3VsZFJvdW5kKQorICAgIGlmICghKytEaWdpdHMpCisgICAgICAvLyBPdmVyZmxvdy4KKyAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihEaWdpdHNUKDEpIDw8IChnZXRXaWR0aDxEaWdpdHNUPigpIC0gMSksIFNjYWxlICsgMSk7CisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihEaWdpdHMsIFNjYWxlKTsKK30KKworLy8vIFxicmllZiBDb252ZW5pZW5jZSBoZWxwZXIgZm9yIDMyLWJpdCByb3VuZGluZy4KK2lubGluZSBzdGQ6OnBhaXI8dWludDMyX3QsIGludDE2X3Q+IGdldFJvdW5kZWQzMih1aW50MzJfdCBEaWdpdHMsIGludDE2X3QgU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTaG91bGRSb3VuZCkgeworICByZXR1cm4gZ2V0Um91bmRlZChEaWdpdHMsIFNjYWxlLCBTaG91bGRSb3VuZCk7Cit9CisKKy8vLyBcYnJpZWYgQ29udmVuaWVuY2UgaGVscGVyIGZvciA2NC1iaXQgcm91bmRpbmcuCitpbmxpbmUgc3RkOjpwYWlyPHVpbnQ2NF90LCBpbnQxNl90PiBnZXRSb3VuZGVkNjQodWludDY0X3QgRGlnaXRzLCBpbnQxNl90IFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvdWxkUm91bmQpIHsKKyAgcmV0dXJuIGdldFJvdW5kZWQoRGlnaXRzLCBTY2FsZSwgU2hvdWxkUm91bmQpOworfQorCisvLy8gXGJyaWVmIEFkanVzdCBhIDY0LWJpdCBzY2FsZWQgbnVtYmVyIGRvd24gdG8gdGhlIGFwcHJvcHJpYXRlIHdpZHRoLgorLy8vCisvLy8gXHByZSBBZGRpbmcgNjQgdG8gXGMgU2NhbGUgd2lsbCBub3Qgb3ZlcmZsb3cgSU5UMTZfTUFYLgordGVtcGxhdGUgPGNsYXNzIERpZ2l0c1Q+CitpbmxpbmUgc3RkOjpwYWlyPERpZ2l0c1QsIGludDE2X3Q+IGdldEFkanVzdGVkKHVpbnQ2NF90IERpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBTY2FsZSA9IDApIHsKKyAgc3RhdGljX2Fzc2VydCghc3RkOjpudW1lcmljX2xpbWl0czxEaWdpdHNUPjo6aXNfc2lnbmVkLCAiZXhwZWN0ZWQgdW5zaWduZWQiKTsKKworICBjb25zdCBpbnQgV2lkdGggPSBnZXRXaWR0aDxEaWdpdHNUPigpOworICBpZiAoV2lkdGggPT0gNjQgfHwgRGlnaXRzIDw9IHN0ZDo6bnVtZXJpY19saW1pdHM8RGlnaXRzVD46Om1heCgpKQorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihEaWdpdHMsIFNjYWxlKTsKKworICAvLyBTaGlmdCByaWdodCBhbmQgcm91bmQuCisgIGludCBTaGlmdCA9IDY0IC0gV2lkdGggLSBjb3VudExlYWRpbmdaZXJvcyhEaWdpdHMpOworICByZXR1cm4gZ2V0Um91bmRlZDxEaWdpdHNUPihEaWdpdHMgPj4gU2hpZnQsIFNjYWxlICsgU2hpZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpZ2l0cyAmIChVSU5UNjRfQygxKSA8PCAoU2hpZnQgLSAxKSkpOworfQorCisvLy8gXGJyaWVmIENvbnZlbmllbmNlIGhlbHBlciBmb3IgYWRqdXN0aW5nIHRvIDMyIGJpdHMuCitpbmxpbmUgc3RkOjpwYWlyPHVpbnQzMl90LCBpbnQxNl90PiBnZXRBZGp1c3RlZDMyKHVpbnQ2NF90IERpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBTY2FsZSA9IDApIHsKKyAgcmV0dXJuIGdldEFkanVzdGVkPHVpbnQzMl90PihEaWdpdHMsIFNjYWxlKTsKK30KKworLy8vIFxicmllZiBDb252ZW5pZW5jZSBoZWxwZXIgZm9yIGFkanVzdGluZyB0byA2NCBiaXRzLgoraW5saW5lIHN0ZDo6cGFpcjx1aW50NjRfdCwgaW50MTZfdD4gZ2V0QWRqdXN0ZWQ2NCh1aW50NjRfdCBEaWdpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgU2NhbGUgPSAwKSB7CisgIHJldHVybiBnZXRBZGp1c3RlZDx1aW50NjRfdD4oRGlnaXRzLCBTY2FsZSk7Cit9CisKKy8vLyBcYnJpZWYgTXVsdGlwbHkgdHdvIDY0LWJpdCBpbnRlZ2VycyB0byBjcmVhdGUgYSA2NC1iaXQgc2NhbGVkIG51bWJlci4KKy8vLworLy8vIEltcGxlbWVudGVkIHdpdGggZm91ciA2NC1iaXQgaW50ZWdlciBtdWx0aXBsaWVzLgorc3RkOjpwYWlyPHVpbnQ2NF90LCBpbnQxNl90PiBtdWx0aXBseTY0KHVpbnQ2NF90IExIUywgdWludDY0X3QgUkhTKTsKKworLy8vIFxicmllZiBNdWx0aXBseSB0d28gMzItYml0IGludGVnZXJzIHRvIGNyZWF0ZSBhIDMyLWJpdCBzY2FsZWQgbnVtYmVyLgorLy8vCisvLy8gSW1wbGVtZW50ZWQgd2l0aCBvbmUgNjQtYml0IGludGVnZXIgbXVsdGlwbHkuCit0ZW1wbGF0ZSA8Y2xhc3MgRGlnaXRzVD4KK2lubGluZSBzdGQ6OnBhaXI8RGlnaXRzVCwgaW50MTZfdD4gZ2V0UHJvZHVjdChEaWdpdHNUIExIUywgRGlnaXRzVCBSSFMpIHsKKyAgc3RhdGljX2Fzc2VydCghc3RkOjpudW1lcmljX2xpbWl0czxEaWdpdHNUPjo6aXNfc2lnbmVkLCAiZXhwZWN0ZWQgdW5zaWduZWQiKTsKKworICBpZiAoZ2V0V2lkdGg8RGlnaXRzVD4oKSA8PSAzMiB8fCAoTEhTIDw9IFVJTlQzMl9NQVggJiYgUkhTIDw9IFVJTlQzMl9NQVgpKQorICAgIHJldHVybiBnZXRBZGp1c3RlZDxEaWdpdHNUPih1aW50NjRfdChMSFMpICogUkhTKTsKKworICByZXR1cm4gbXVsdGlwbHk2NChMSFMsIFJIUyk7Cit9CisKKy8vLyBcYnJpZWYgQ29udmVuaWVuY2UgaGVscGVyIGZvciAzMi1iaXQgcHJvZHVjdC4KK2lubGluZSBzdGQ6OnBhaXI8dWludDMyX3QsIGludDE2X3Q+IGdldFByb2R1Y3QzMih1aW50MzJfdCBMSFMsIHVpbnQzMl90IFJIUykgeworICByZXR1cm4gZ2V0UHJvZHVjdChMSFMsIFJIUyk7Cit9CisKKy8vLyBcYnJpZWYgQ29udmVuaWVuY2UgaGVscGVyIGZvciA2NC1iaXQgcHJvZHVjdC4KK2lubGluZSBzdGQ6OnBhaXI8dWludDY0X3QsIGludDE2X3Q+IGdldFByb2R1Y3Q2NCh1aW50NjRfdCBMSFMsIHVpbnQ2NF90IFJIUykgeworICByZXR1cm4gZ2V0UHJvZHVjdChMSFMsIFJIUyk7Cit9CisKKy8vLyBcYnJpZWYgRGl2aWRlIHR3byA2NC1iaXQgaW50ZWdlcnMgdG8gY3JlYXRlIGEgNjQtYml0IHNjYWxlZCBudW1iZXIuCisvLy8KKy8vLyBJbXBsZW1lbnRlZCB3aXRoIGxvbmcgZGl2aXNpb24uCisvLy8KKy8vLyBccHJlIFxjIERpdmlkZW5kIGFuZCBcYyBEaXZpc29yIGFyZSBub24temVyby4KK3N0ZDo6cGFpcjx1aW50NjRfdCwgaW50MTZfdD4gZGl2aWRlNjQodWludDY0X3QgRGl2aWRlbmQsIHVpbnQ2NF90IERpdmlzb3IpOworCisvLy8gXGJyaWVmIERpdmlkZSB0d28gMzItYml0IGludGVnZXJzIHRvIGNyZWF0ZSBhIDMyLWJpdCBzY2FsZWQgbnVtYmVyLgorLy8vCisvLy8gSW1wbGVtZW50ZWQgd2l0aCBvbmUgNjQtYml0IGludGVnZXIgZGl2aWRlL3JlbWFpbmRlciBwYWlyLgorLy8vCisvLy8gXHByZSBcYyBEaXZpZGVuZCBhbmQgXGMgRGl2aXNvciBhcmUgbm9uLXplcm8uCitzdGQ6OnBhaXI8dWludDMyX3QsIGludDE2X3Q+IGRpdmlkZTMyKHVpbnQzMl90IERpdmlkZW5kLCB1aW50MzJfdCBEaXZpc29yKTsKKworLy8vIFxicmllZiBEaXZpZGUgdHdvIDMyLWJpdCBudW1iZXJzIHRvIGNyZWF0ZSBhIDMyLWJpdCBzY2FsZWQgbnVtYmVyLgorLy8vCisvLy8gSW1wbGVtZW50ZWQgd2l0aCBvbmUgNjQtYml0IGludGVnZXIgZGl2aWRlL3JlbWFpbmRlciBwYWlyLgorLy8vCisvLy8gUmV0dXJucyBcYyAoRGlnaXRzVF9NQVgsIE1heFNjYWxlKSBmb3IgZGl2aWRlLWJ5LXplcm8gKDAgZm9yIDAvMCkuCit0ZW1wbGF0ZSA8Y2xhc3MgRGlnaXRzVD4KK3N0ZDo6cGFpcjxEaWdpdHNULCBpbnQxNl90PiBnZXRRdW90aWVudChEaWdpdHNUIERpdmlkZW5kLCBEaWdpdHNUIERpdmlzb3IpIHsKKyAgc3RhdGljX2Fzc2VydCghc3RkOjpudW1lcmljX2xpbWl0czxEaWdpdHNUPjo6aXNfc2lnbmVkLCAiZXhwZWN0ZWQgdW5zaWduZWQiKTsKKyAgc3RhdGljX2Fzc2VydChzaXplb2YoRGlnaXRzVCkgPT0gNCB8fCBzaXplb2YoRGlnaXRzVCkgPT0gOCwKKyAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgMzItYml0IG9yIDY0LWJpdCBkaWdpdHMiKTsKKworICAvLyBDaGVjayBmb3IgemVyby4KKyAgaWYgKCFEaXZpZGVuZCkKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoMCwgMCk7CisgIGlmICghRGl2aXNvcikKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoc3RkOjpudW1lcmljX2xpbWl0czxEaWdpdHNUPjo6bWF4KCksIE1heFNjYWxlKTsKKworICBpZiAoZ2V0V2lkdGg8RGlnaXRzVD4oKSA9PSA2NCkKKyAgICByZXR1cm4gZGl2aWRlNjQoRGl2aWRlbmQsIERpdmlzb3IpOworICByZXR1cm4gZGl2aWRlMzIoRGl2aWRlbmQsIERpdmlzb3IpOworfQorCisvLy8gXGJyaWVmIENvbnZlbmllbmNlIGhlbHBlciBmb3IgMzItYml0IHF1b3RpZW50LgoraW5saW5lIHN0ZDo6cGFpcjx1aW50MzJfdCwgaW50MTZfdD4gZ2V0UXVvdGllbnQzMih1aW50MzJfdCBEaXZpZGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgRGl2aXNvcikgeworICByZXR1cm4gZ2V0UXVvdGllbnQoRGl2aWRlbmQsIERpdmlzb3IpOworfQorCisvLy8gXGJyaWVmIENvbnZlbmllbmNlIGhlbHBlciBmb3IgNjQtYml0IHF1b3RpZW50LgoraW5saW5lIHN0ZDo6cGFpcjx1aW50NjRfdCwgaW50MTZfdD4gZ2V0UXVvdGllbnQ2NCh1aW50NjRfdCBEaXZpZGVuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgRGl2aXNvcikgeworICByZXR1cm4gZ2V0UXVvdGllbnQoRGl2aWRlbmQsIERpdmlzb3IpOworfQorCisvLy8gXGJyaWVmIEltcGxlbWVudGF0aW9uIG9mIGdldExnKCkgYW5kIGZyaWVuZHMuCisvLy8KKy8vLyBSZXR1cm5zIHRoZSByb3VuZGVkIGxnIG9mIFxjIERpZ2l0cyoyXlNjYWxlIGFuZCBhbiBpbnQgc3BlY2lmeWluZyB3aGV0aGVyCisvLy8gdGhpcyB3YXMgcm91bmRlZCB1cCAoMSksIGRvd24gKC0xKSwgb3IgZXhhY3QgKDApLgorLy8vCisvLy8gUmV0dXJucyBcYyBJTlQzMl9NSU4gd2hlbiBcYyBEaWdpdHMgaXMgemVyby4KK3RlbXBsYXRlIDxjbGFzcyBEaWdpdHNUPgoraW5saW5lIHN0ZDo6cGFpcjxpbnQzMl90LCBpbnQ+IGdldExnSW1wbChEaWdpdHNUIERpZ2l0cywgaW50MTZfdCBTY2FsZSkgeworICBzdGF0aWNfYXNzZXJ0KCFzdGQ6Om51bWVyaWNfbGltaXRzPERpZ2l0c1Q+Ojppc19zaWduZWQsICJleHBlY3RlZCB1bnNpZ25lZCIpOworCisgIGlmICghRGlnaXRzKQorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihJTlQzMl9NSU4sIDApOworCisgIC8vIEdldCB0aGUgZmxvb3Igb2YgdGhlIGxnIG9mIERpZ2l0cy4KKyAgaW50MzJfdCBMb2NhbEZsb29yID0gc2l6ZW9mKERpZ2l0cykgKiA4IC0gY291bnRMZWFkaW5nWmVyb3MoRGlnaXRzKSAtIDE7CisKKyAgLy8gR2V0IHRoZSBhY3R1YWwgZmxvb3IuCisgIGludDMyX3QgRmxvb3IgPSBTY2FsZSArIExvY2FsRmxvb3I7CisgIGlmIChEaWdpdHMgPT0gVUlOVDY0X0MoMSkgPDwgTG9jYWxGbG9vcikKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoRmxvb3IsIDApOworCisgIC8vIFJvdW5kIGJhc2VkIG9uIHRoZSBuZXh0IGRpZ2l0LgorICBhc3NlcnQoTG9jYWxGbG9vciA+PSAxKTsKKyAgYm9vbCBSb3VuZCA9IERpZ2l0cyAmIFVJTlQ2NF9DKDEpIDw8IChMb2NhbEZsb29yIC0gMSk7CisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihGbG9vciArIFJvdW5kLCBSb3VuZCA/IDEgOiAtMSk7Cit9CisKKy8vLyBcYnJpZWYgR2V0IHRoZSBsZyAocm91bmRlZCkgb2YgYSBzY2FsZWQgbnVtYmVyLgorLy8vCisvLy8gR2V0IHRoZSBsZyBvZiBcYyBEaWdpdHMqMl5TY2FsZS4KKy8vLworLy8vIFJldHVybnMgXGMgSU5UMzJfTUlOIHdoZW4gXGMgRGlnaXRzIGlzIHplcm8uCit0ZW1wbGF0ZSA8Y2xhc3MgRGlnaXRzVD4gaW50MzJfdCBnZXRMZyhEaWdpdHNUIERpZ2l0cywgaW50MTZfdCBTY2FsZSkgeworICByZXR1cm4gZ2V0TGdJbXBsKERpZ2l0cywgU2NhbGUpLmZpcnN0OworfQorCisvLy8gXGJyaWVmIEdldCB0aGUgbGcgZmxvb3Igb2YgYSBzY2FsZWQgbnVtYmVyLgorLy8vCisvLy8gR2V0IHRoZSBmbG9vciBvZiB0aGUgbGcgb2YgXGMgRGlnaXRzKjJeU2NhbGUuCisvLy8KKy8vLyBSZXR1cm5zIFxjIElOVDMyX01JTiB3aGVuIFxjIERpZ2l0cyBpcyB6ZXJvLgordGVtcGxhdGUgPGNsYXNzIERpZ2l0c1Q+IGludDMyX3QgZ2V0TGdGbG9vcihEaWdpdHNUIERpZ2l0cywgaW50MTZfdCBTY2FsZSkgeworICBhdXRvIExnID0gZ2V0TGdJbXBsKERpZ2l0cywgU2NhbGUpOworICByZXR1cm4gTGcuZmlyc3QgLSAoTGcuc2Vjb25kID4gMCk7Cit9CisKKy8vLyBcYnJpZWYgR2V0IHRoZSBsZyBjZWlsaW5nIG9mIGEgc2NhbGVkIG51bWJlci4KKy8vLworLy8vIEdldCB0aGUgY2VpbGluZyBvZiB0aGUgbGcgb2YgXGMgRGlnaXRzKjJeU2NhbGUuCisvLy8KKy8vLyBSZXR1cm5zIFxjIElOVDMyX01JTiB3aGVuIFxjIERpZ2l0cyBpcyB6ZXJvLgordGVtcGxhdGUgPGNsYXNzIERpZ2l0c1Q+IGludDMyX3QgZ2V0TGdDZWlsaW5nKERpZ2l0c1QgRGlnaXRzLCBpbnQxNl90IFNjYWxlKSB7CisgIGF1dG8gTGcgPSBnZXRMZ0ltcGwoRGlnaXRzLCBTY2FsZSk7CisgIHJldHVybiBMZy5maXJzdCArIChMZy5zZWNvbmQgPCAwKTsKK30KKworLy8vIFxicmllZiBJbXBsZW1lbnRhdGlvbiBmb3IgY29tcGFyaW5nIHNjYWxlZCBudW1iZXJzLgorLy8vCisvLy8gQ29tcGFyZSB0d28gNjQtYml0IG51bWJlcnMgd2l0aCBkaWZmZXJlbnQgc2NhbGVzLiAgR2l2ZW4gdGhhdCB0aGUgc2NhbGUgb2YKKy8vLyBcYyBMIGlzIGhpZ2hlciB0aGFuIHRoYXQgb2YgXGMgUiBieSBcYyBTY2FsZURpZmYsIGNvbXBhcmUgdGhlbS4gIFJldHVybiAtMSwKKy8vLyAxLCBhbmQgMCBmb3IgbGVzcyB0aGFuLCBncmVhdGVyIHRoYW4sIGFuZCBlcXVhbCwgcmVzcGVjdGl2ZWx5LgorLy8vCisvLy8gXHByZSAwIDw9IFNjYWxlRGlmZiA8IDY0LgoraW50IGNvbXBhcmVJbXBsKHVpbnQ2NF90IEwsIHVpbnQ2NF90IFIsIGludCBTY2FsZURpZmYpOworCisvLy8gXGJyaWVmIENvbXBhcmUgdHdvIHNjYWxlZCBudW1iZXJzLgorLy8vCisvLy8gQ29tcGFyZSB0d28gc2NhbGVkIG51bWJlcnMuICBSZXR1cm5zIDAgZm9yIGVxdWFsLCAtMSBmb3IgbGVzcyB0aGFuLCBhbmQgMQorLy8vIGZvciBncmVhdGVyIHRoYW4uCit0ZW1wbGF0ZSA8Y2xhc3MgRGlnaXRzVD4KK2ludCBjb21wYXJlKERpZ2l0c1QgTERpZ2l0cywgaW50MTZfdCBMU2NhbGUsIERpZ2l0c1QgUkRpZ2l0cywgaW50MTZfdCBSU2NhbGUpIHsKKyAgc3RhdGljX2Fzc2VydCghc3RkOjpudW1lcmljX2xpbWl0czxEaWdpdHNUPjo6aXNfc2lnbmVkLCAiZXhwZWN0ZWQgdW5zaWduZWQiKTsKKworICAvLyBDaGVjayBmb3IgemVyby4KKyAgaWYgKCFMRGlnaXRzKQorICAgIHJldHVybiBSRGlnaXRzID8gLTEgOiAwOworICBpZiAoIVJEaWdpdHMpCisgICAgcmV0dXJuIDE7CisKKyAgLy8gQ2hlY2sgZm9yIHRoZSBzY2FsZS4gIFVzZSBnZXRMZ0Zsb29yIHRvIGJlIHN1cmUgdGhhdCB0aGUgc2NhbGUgZGlmZmVyZW5jZQorICAvLyBpcyBhbHdheXMgbG93ZXIgdGhhbiA2NC4KKyAgaW50MzJfdCBsZ0wgPSBnZXRMZ0Zsb29yKExEaWdpdHMsIExTY2FsZSksIGxnUiA9IGdldExnRmxvb3IoUkRpZ2l0cywgUlNjYWxlKTsKKyAgaWYgKGxnTCAhPSBsZ1IpCisgICAgcmV0dXJuIGxnTCA8IGxnUiA/IC0xIDogMTsKKworICAvLyBDb21wYXJlIGRpZ2l0cy4KKyAgaWYgKExTY2FsZSA8IFJTY2FsZSkKKyAgICByZXR1cm4gY29tcGFyZUltcGwoTERpZ2l0cywgUkRpZ2l0cywgUlNjYWxlIC0gTFNjYWxlKTsKKworICByZXR1cm4gLWNvbXBhcmVJbXBsKFJEaWdpdHMsIExEaWdpdHMsIExTY2FsZSAtIFJTY2FsZSk7Cit9CisKKy8vLyBcYnJpZWYgTWF0Y2ggc2NhbGVzIG9mIHR3byBudW1iZXJzLgorLy8vCisvLy8gR2l2ZW4gdHdvIHNjYWxlZCBudW1iZXJzLCBtYXRjaCB1cCB0aGVpciBzY2FsZXMuICBDaGFuZ2UgdGhlIGRpZ2l0cyBhbmQKKy8vLyBzY2FsZXMgaW4gcGxhY2UuICBTaGlmdCB0aGUgZGlnaXRzIGFzIG5lY2Vzc2FyeSB0byBmb3JtIGVxdWl2YWxlbnQgbnVtYmVycywKKy8vLyBsb3NpbmcgcHJlY2lzaW9uIG9ubHkgd2hlbiBuZWNlc3NhcnkuCisvLy8KKy8vLyBJZiB0aGUgb3V0cHV0IHZhbHVlIG9mIFxjIExEaWdpdHMgKFxjIFJEaWdpdHMpIGlzIFxjIDAsIHRoZSBvdXRwdXQgdmFsdWUgb2YKKy8vLyBcYyBMU2NhbGUgKFxjIFJTY2FsZSkgaXMgdW5zcGVjaWZpZWQuCisvLy8KKy8vLyBBcyBhIGNvbnZlbmllbmNlLCByZXR1cm5zIHRoZSBtYXRjaGluZyBzY2FsZS4gIElmIHRoZSBvdXRwdXQgdmFsdWUgb2Ygb25lCisvLy8gbnVtYmVyIGlzIHplcm8sIHJldHVybnMgdGhlIHNjYWxlIG9mIHRoZSBvdGhlci4gIElmIGJvdGggYXJlIHplcm8sIHdoaWNoCisvLy8gc2NhbGUgaXMgcmV0dXJuZWQgaXMgdW5zcGVjaWZpZWQuCit0ZW1wbGF0ZSA8Y2xhc3MgRGlnaXRzVD4KK2ludDE2X3QgbWF0Y2hTY2FsZXMoRGlnaXRzVCAmTERpZ2l0cywgaW50MTZfdCAmTFNjYWxlLCBEaWdpdHNUICZSRGlnaXRzLAorICAgICAgICAgICAgICAgICAgICBpbnQxNl90ICZSU2NhbGUpIHsKKyAgc3RhdGljX2Fzc2VydCghc3RkOjpudW1lcmljX2xpbWl0czxEaWdpdHNUPjo6aXNfc2lnbmVkLCAiZXhwZWN0ZWQgdW5zaWduZWQiKTsKKworICBpZiAoTFNjYWxlIDwgUlNjYWxlKQorICAgIC8vIFN3YXAgYXJndW1lbnRzLgorICAgIHJldHVybiBtYXRjaFNjYWxlcyhSRGlnaXRzLCBSU2NhbGUsIExEaWdpdHMsIExTY2FsZSk7CisgIGlmICghTERpZ2l0cykKKyAgICByZXR1cm4gUlNjYWxlOworICBpZiAoIVJEaWdpdHMgfHwgTFNjYWxlID09IFJTY2FsZSkKKyAgICByZXR1cm4gTFNjYWxlOworCisgIC8vIE5vdyBMU2NhbGUgPiBSU2NhbGUuICBHZXQgdGhlIGRpZmZlcmVuY2UuCisgIGludDMyX3QgU2NhbGVEaWZmID0gaW50MzJfdChMU2NhbGUpIC0gUlNjYWxlOworICBpZiAoU2NhbGVEaWZmID49IDIgKiBnZXRXaWR0aDxEaWdpdHNUPigpKSB7CisgICAgLy8gRG9uJ3QgYm90aGVyIHNoaWZ0aW5nLiAgUkRpZ2l0cyB3aWxsIGdldCB6ZXJvLWVkIG91dCBhbnl3YXkuCisgICAgUkRpZ2l0cyA9IDA7CisgICAgcmV0dXJuIExTY2FsZTsKKyAgfQorCisgIC8vIFNoaWZ0IExEaWdpdHMgbGVmdCBhcyBtdWNoIGFzIHBvc3NpYmxlLCB0aGVuIHNoaWZ0IFJEaWdpdHMgcmlnaHQuCisgIGludDMyX3QgU2hpZnRMID0gc3RkOjptaW48aW50MzJfdD4oY291bnRMZWFkaW5nWmVyb3MoTERpZ2l0cyksIFNjYWxlRGlmZik7CisgIGFzc2VydChTaGlmdEwgPCBnZXRXaWR0aDxEaWdpdHNUPigpICYmICJjYW4ndCBzaGlmdCBtb3JlIHRoYW4gd2lkdGgiKTsKKworICBpbnQzMl90IFNoaWZ0UiA9IFNjYWxlRGlmZiAtIFNoaWZ0TDsKKyAgaWYgKFNoaWZ0UiA+PSBnZXRXaWR0aDxEaWdpdHNUPigpKSB7CisgICAgLy8gRG9uJ3QgYm90aGVyIHNoaWZ0aW5nLiAgUkRpZ2l0cyB3aWxsIGdldCB6ZXJvLWVkIG91dCBhbnl3YXkuCisgICAgUkRpZ2l0cyA9IDA7CisgICAgcmV0dXJuIExTY2FsZTsKKyAgfQorCisgIExEaWdpdHMgPDw9IFNoaWZ0TDsKKyAgUkRpZ2l0cyA+Pj0gU2hpZnRSOworCisgIExTY2FsZSAtPSBTaGlmdEw7CisgIFJTY2FsZSArPSBTaGlmdFI7CisgIGFzc2VydChMU2NhbGUgPT0gUlNjYWxlICYmICJzY2FsZXMgc2hvdWxkIG1hdGNoIik7CisgIHJldHVybiBMU2NhbGU7Cit9CisKKy8vLyBcYnJpZWYgR2V0IHRoZSBzdW0gb2YgdHdvIHNjYWxlZCBudW1iZXJzLgorLy8vCisvLy8gR2V0IHRoZSBzdW0gb2YgdHdvIHNjYWxlZCBudW1iZXJzIHdpdGggYXMgbXVjaCBwcmVjaXNpb24gYXMgcG9zc2libGUuCisvLy8KKy8vLyBccHJlIEFkZGluZyAxIHRvIFxjIExTY2FsZSAob3IgXGMgUlNjYWxlKSB3aWxsIG5vdCBvdmVyZmxvdyBJTlQxNl9NQVguCit0ZW1wbGF0ZSA8Y2xhc3MgRGlnaXRzVD4KK3N0ZDo6cGFpcjxEaWdpdHNULCBpbnQxNl90PiBnZXRTdW0oRGlnaXRzVCBMRGlnaXRzLCBpbnQxNl90IExTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGlnaXRzVCBSRGlnaXRzLCBpbnQxNl90IFJTY2FsZSkgeworICBzdGF0aWNfYXNzZXJ0KCFzdGQ6Om51bWVyaWNfbGltaXRzPERpZ2l0c1Q+Ojppc19zaWduZWQsICJleHBlY3RlZCB1bnNpZ25lZCIpOworCisgIC8vIENoZWNrIGlucHV0cyB1cCBmcm9udC4gIFRoaXMgaXMgb25seSByZWxldmFudCBpZiBhZGRpdGlvbiBvdmVyZmxvd3MsIGJ1dAorICAvLyB0ZXN0aW5nIGhlcmUgc2hvdWxkIGNhdGNoIG1vcmUgYnVncy4KKyAgYXNzZXJ0KExTY2FsZSA8IElOVDE2X01BWCAmJiAic2NhbGUgdG9vIGxhcmdlIik7CisgIGFzc2VydChSU2NhbGUgPCBJTlQxNl9NQVggJiYgInNjYWxlIHRvbyBsYXJnZSIpOworCisgIC8vIE5vcm1hbGl6ZSBkaWdpdHMgdG8gbWF0Y2ggc2NhbGVzLgorICBpbnQxNl90IFNjYWxlID0gbWF0Y2hTY2FsZXMoTERpZ2l0cywgTFNjYWxlLCBSRGlnaXRzLCBSU2NhbGUpOworCisgIC8vIENvbXB1dGUgc3VtLgorICBEaWdpdHNUIFN1bSA9IExEaWdpdHMgKyBSRGlnaXRzOworICBpZiAoU3VtID49IFJEaWdpdHMpCisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKFN1bSwgU2NhbGUpOworCisgIC8vIEFkanVzdCBzdW0gYWZ0ZXIgYXJpdGhtZXRpYyBvdmVyZmxvdy4KKyAgRGlnaXRzVCBIaWdoQml0ID0gRGlnaXRzVCgxKSA8PCAoZ2V0V2lkdGg8RGlnaXRzVD4oKSAtIDEpOworICByZXR1cm4gc3RkOjptYWtlX3BhaXIoSGlnaEJpdCB8IFN1bSA+PiAxLCBTY2FsZSArIDEpOworfQorCisvLy8gXGJyaWVmIENvbnZlbmllbmNlIGhlbHBlciBmb3IgMzItYml0IHN1bS4KK2lubGluZSBzdGQ6OnBhaXI8dWludDMyX3QsIGludDE2X3Q+IGdldFN1bTMyKHVpbnQzMl90IExEaWdpdHMsIGludDE2X3QgTFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgUkRpZ2l0cywgaW50MTZfdCBSU2NhbGUpIHsKKyAgcmV0dXJuIGdldFN1bShMRGlnaXRzLCBMU2NhbGUsIFJEaWdpdHMsIFJTY2FsZSk7Cit9CisKKy8vLyBcYnJpZWYgQ29udmVuaWVuY2UgaGVscGVyIGZvciA2NC1iaXQgc3VtLgoraW5saW5lIHN0ZDo6cGFpcjx1aW50NjRfdCwgaW50MTZfdD4gZ2V0U3VtNjQodWludDY0X3QgTERpZ2l0cywgaW50MTZfdCBMU2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBSRGlnaXRzLCBpbnQxNl90IFJTY2FsZSkgeworICByZXR1cm4gZ2V0U3VtKExEaWdpdHMsIExTY2FsZSwgUkRpZ2l0cywgUlNjYWxlKTsKK30KKworLy8vIFxicmllZiBHZXQgdGhlIGRpZmZlcmVuY2Ugb2YgdHdvIHNjYWxlZCBudW1iZXJzLgorLy8vCisvLy8gR2V0IExIUyBtaW51cyBSSFMgd2l0aCBhcyBtdWNoIHByZWNpc2lvbiBhcyBwb3NzaWJsZS4KKy8vLworLy8vIFJldHVybnMgXGMgKDAsIDApIGlmIHRoZSBSSFMgaXMgbGFyZ2VyIHRoYW4gdGhlIExIUy4KK3RlbXBsYXRlIDxjbGFzcyBEaWdpdHNUPgorc3RkOjpwYWlyPERpZ2l0c1QsIGludDE2X3Q+IGdldERpZmZlcmVuY2UoRGlnaXRzVCBMRGlnaXRzLCBpbnQxNl90IExTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERpZ2l0c1QgUkRpZ2l0cywgaW50MTZfdCBSU2NhbGUpIHsKKyAgc3RhdGljX2Fzc2VydCghc3RkOjpudW1lcmljX2xpbWl0czxEaWdpdHNUPjo6aXNfc2lnbmVkLCAiZXhwZWN0ZWQgdW5zaWduZWQiKTsKKworICAvLyBOb3JtYWxpemUgZGlnaXRzIHRvIG1hdGNoIHNjYWxlcy4KKyAgY29uc3QgRGlnaXRzVCBTYXZlZFJEaWdpdHMgPSBSRGlnaXRzOworICBjb25zdCBpbnQxNl90IFNhdmVkUlNjYWxlID0gUlNjYWxlOworICBtYXRjaFNjYWxlcyhMRGlnaXRzLCBMU2NhbGUsIFJEaWdpdHMsIFJTY2FsZSk7CisKKyAgLy8gQ29tcHV0ZSBkaWZmZXJlbmNlLgorICBpZiAoTERpZ2l0cyA8PSBSRGlnaXRzKQorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigwLCAwKTsKKyAgaWYgKFJEaWdpdHMgfHwgIVNhdmVkUkRpZ2l0cykKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoTERpZ2l0cyAtIFJEaWdpdHMsIExTY2FsZSk7CisKKyAgLy8gQ2hlY2sgaWYgUkRpZ2l0cyBqdXN0IGJhcmVseSBsb3N0IGl0cyBsYXN0IGJpdC4gIEUuZy4sIGZvciAzMi1iaXQ6CisgIC8vCisgIC8vICAgMSoyXjMyIC0gMSoyXjAgPT0gMHhmZmZmZmZmZiAhPSAxKjJeMzIKKyAgY29uc3QgYXV0byBSTGdGbG9vciA9IGdldExnRmxvb3IoU2F2ZWRSRGlnaXRzLCBTYXZlZFJTY2FsZSk7CisgIGlmICghY29tcGFyZShMRGlnaXRzLCBMU2NhbGUsIERpZ2l0c1QoMSksIFJMZ0Zsb29yICsgZ2V0V2lkdGg8RGlnaXRzVD4oKSkpCisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHN0ZDo6bnVtZXJpY19saW1pdHM8RGlnaXRzVD46Om1heCgpLCBSTGdGbG9vcik7CisKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKExEaWdpdHMsIExTY2FsZSk7Cit9CisKKy8vLyBcYnJpZWYgQ29udmVuaWVuY2UgaGVscGVyIGZvciAzMi1iaXQgZGlmZmVyZW5jZS4KK2lubGluZSBzdGQ6OnBhaXI8dWludDMyX3QsIGludDE2X3Q+IGdldERpZmZlcmVuY2UzMih1aW50MzJfdCBMRGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgTFNjYWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IFJEaWdpdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBSU2NhbGUpIHsKKyAgcmV0dXJuIGdldERpZmZlcmVuY2UoTERpZ2l0cywgTFNjYWxlLCBSRGlnaXRzLCBSU2NhbGUpOworfQorCisvLy8gXGJyaWVmIENvbnZlbmllbmNlIGhlbHBlciBmb3IgNjQtYml0IGRpZmZlcmVuY2UuCitpbmxpbmUgc3RkOjpwYWlyPHVpbnQ2NF90LCBpbnQxNl90PiBnZXREaWZmZXJlbmNlNjQodWludDY0X3QgTERpZ2l0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQxNl90IExTY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBSRGlnaXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgUlNjYWxlKSB7CisgIHJldHVybiBnZXREaWZmZXJlbmNlKExEaWdpdHMsIExTY2FsZSwgUkRpZ2l0cywgUlNjYWxlKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIFNjYWxlZE51bWJlcnMKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBTY2FsZWROdW1iZXJCYXNlIHsKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGludCBEZWZhdWx0UHJlY2lzaW9uID0gMTA7CisKKyAgc3RhdGljIHZvaWQgZHVtcCh1aW50NjRfdCBELCBpbnQxNl90IEUsIGludCBXaWR0aCk7CisgIHN0YXRpYyByYXdfb3N0cmVhbSAmcHJpbnQocmF3X29zdHJlYW0gJk9TLCB1aW50NjRfdCBELCBpbnQxNl90IEUsIGludCBXaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQcmVjaXNpb24pOworICBzdGF0aWMgc3RkOjpzdHJpbmcgdG9TdHJpbmcodWludDY0X3QgRCwgaW50MTZfdCBFLCBpbnQgV2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBQcmVjaXNpb24pOworICBzdGF0aWMgaW50IGNvdW50TGVhZGluZ1plcm9zMzIodWludDMyX3QgTikgeyByZXR1cm4gY291bnRMZWFkaW5nWmVyb3MoTik7IH0KKyAgc3RhdGljIGludCBjb3VudExlYWRpbmdaZXJvczY0KHVpbnQ2NF90IE4pIHsgcmV0dXJuIGNvdW50TGVhZGluZ1plcm9zKE4pOyB9CisgIHN0YXRpYyB1aW50NjRfdCBnZXRIYWxmKHVpbnQ2NF90IE4pIHsgcmV0dXJuIChOID4+IDEpICsgKE4gJiAxKTsgfQorCisgIHN0YXRpYyBzdGQ6OnBhaXI8dWludDY0X3QsIGJvb2w+IHNwbGl0U2lnbmVkKGludDY0X3QgTikgeworICAgIGlmIChOID49IDApCisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoTiwgZmFsc2UpOworICAgIHVpbnQ2NF90IFVuc2lnbmVkID0gTiA9PSBJTlQ2NF9NSU4gPyBVSU5UNjRfQygxKSA8PCA2MyA6IHVpbnQ2NF90KC1OKTsKKyAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoVW5zaWduZWQsIHRydWUpOworICB9CisgIHN0YXRpYyBpbnQ2NF90IGpvaW5TaWduZWQodWludDY0X3QgVSwgYm9vbCBJc05lZykgeworICAgIGlmIChVID4gdWludDY0X3QoSU5UNjRfTUFYKSkKKyAgICAgIHJldHVybiBJc05lZyA/IElOVDY0X01JTiA6IElOVDY0X01BWDsKKyAgICByZXR1cm4gSXNOZWcgPyAtaW50NjRfdChVKSA6IGludDY0X3QoVSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgU2ltcGxlIHJlcHJlc2VudGF0aW9uIG9mIGEgc2NhbGVkIG51bWJlci4KKy8vLworLy8vIFNjYWxlZE51bWJlciBpcyBhIG51bWJlciByZXByZXNlbnRlZCBieSBkaWdpdHMgYW5kIGEgc2NhbGUuICBJdCB1c2VzIHNpbXBsZQorLy8vIHNhdHVyYXRpb24gYXJpdGhtZXRpYyBhbmQgZXZlcnkgb3BlcmF0aW9uIGlzIHdlbGwtZGVmaW5lZCBmb3IgZXZlcnkgdmFsdWUuCisvLy8gSXQncyBzb21ld2hhdCBzaW1pbGFyIGluIGJlaGF2aW91ciB0byBhIHNvZnQtZmxvYXQsIGJ1dCBpcyAqbm90KiBhCisvLy8gcmVwbGFjZW1lbnQgZm9yIG9uZS4gIElmIHlvdSdyZSBkb2luZyBudW1lcmljcywgbG9vayBhdCBcYSBBUEZsb2F0IGluc3RlYWQuCisvLy8gTmV2ZXJ0aGVsZXNzLCB3ZSd2ZSBmb3VuZCB0aGVzZSBzZW1hbnRpY3MgdXNlZnVsIGZvciBtb2RlbGxpbmcgY2VydGFpbiBjb3N0CisvLy8gbWV0cmljcy4KKy8vLworLy8vIFRoZSBudW1iZXIgaXMgc3BsaXQgaW50byBhIHNpZ25lZCBzY2FsZSBhbmQgdW5zaWduZWQgZGlnaXRzLiAgVGhlIG51bWJlcgorLy8vIHJlcHJlc2VudGVkIGlzIFxjIGdldERpZ2l0cygpKjJeZ2V0U2NhbGUoKS4gIEluIHRoaXMgd2F5LCB0aGUgZGlnaXRzIGFyZQorLy8vIG11Y2ggbGlrZSB0aGUgbWFudGlzc2EgaW4gdGhlIHg4NyBsb25nIGRvdWJsZSwgYnV0IHRoZXJlIGlzIG5vIGNhbm9uaWNhbAorLy8vIGZvcm0gc28gdGhlIHNhbWUgbnVtYmVyIGNhbiBiZSByZXByZXNlbnRlZCBieSBtYW55IGJpdCByZXByZXNlbnRhdGlvbnMuCisvLy8KKy8vLyBTY2FsZWROdW1iZXIgaXMgdGVtcGxhdGVkIG9uIHRoZSB1bmRlcmx5aW5nIGludGVnZXIgdHlwZSBmb3IgZGlnaXRzLCB3aGljaAorLy8vIGlzIGV4cGVjdGVkIHRvIGJlIHVuc2lnbmVkLgorLy8vCisvLy8gVW5saWtlIEFQRmxvYXQsIFNjYWxlZE51bWJlciBkb2VzIG5vdCBtb2RlbCBhcmNoaXRlY3R1cmUgZmxvYXRpbmcgcG9pbnQKKy8vLyBiZWhhdmlvdXIgLS0gd2hpbGUgdGhpcyBtaWdodCBtYWtlIGl0IGEgbGl0dGxlIGZhc3RlciBhbmQgZWFzaWVyIHRvIHJlYXNvbgorLy8vIGFib3V0LCBpdCBjZXJ0YWlubHkgbWFrZXMgaXQgbW9yZSBkYW5nZXJvdXMgZm9yIGdlbmVyYWwgbnVtZXJpY3MuCisvLy8KKy8vLyBTY2FsZWROdW1iZXIgaXMgdG90YWxseSBvcmRlcmVkLiAgSG93ZXZlciwgdGhlcmUgaXMgbm8gY2Fub25pY2FsIGZvcm0sIHNvCisvLy8gdGhlcmUgYXJlIG11bHRpcGxlIHJlcHJlc2VudGF0aW9ucyBvZiBtb3N0IHNjYWxhcnMuICBFLmcuOgorLy8vCisvLy8gICAgIFNjYWxlZE51bWJlcig4dSwgMCkgPT0gU2NhbGVkTnVtYmVyKDR1LCAxKQorLy8vICAgICBTY2FsZWROdW1iZXIoNHUsIDEpID09IFNjYWxlZE51bWJlcigydSwgMikKKy8vLyAgICAgU2NhbGVkTnVtYmVyKDJ1LCAyKSA9PSBTY2FsZWROdW1iZXIoMXUsIDMpCisvLy8KKy8vLyBTY2FsZWROdW1iZXIgaW1wbGVtZW50cyBtb3N0IGFyaXRobWV0aWMgb3BlcmF0aW9ucy4gIFByZWNpc2lvbiBpcyBrZXB0CisvLy8gd2hlcmUgcG9zc2libGUuICBVc2VzIHNpbXBsZSBzYXR1cmF0aW9uIGFyaXRobWV0aWMsIHNvIHRoYXQgb3BlcmF0aW9ucworLy8vIHNhdHVyYXRlIHRvIDAuMCBvciBnZXRMYXJnZXN0KCkgcmF0aGVyIHRoYW4gdW5kZXIgb3Igb3ZlcmZsb3dpbmcuICBJdCBoYXMKKy8vLyBzb21lIGV4dHJhIGFyaXRobWV0aWMgZm9yIHVuaXQgaW52ZXJzaW9uLiAgMC4wLzAuMCBpcyBkZWZpbmVkIHRvIGJlIDAuMC4KKy8vLyBBbnkgb3RoZXIgZGl2aXNpb24gYnkgMC4wIGlzIGRlZmluZWQgdG8gYmUgZ2V0TGFyZ2VzdCgpLgorLy8vCisvLy8gQXMgYSBjb252ZW5pZW5jZSBmb3IgbW9kaWZ5aW5nIHRoZSBleHBvbmVudCwgbGVmdCBhbmQgcmlnaHQgc2hpZnRpbmcgYXJlCisvLy8gYm90aCBpbXBsZW1lbnRlZCwgYW5kIGJvdGggaW50ZXJwcmV0IG5lZ2F0aXZlIHNoaWZ0cyBhcyBwb3NpdGl2ZSBzaGlmdHMgaW4KKy8vLyB0aGUgb3Bwb3NpdGUgZGlyZWN0aW9uLgorLy8vCisvLy8gU2NhbGVzIGFyZSBsaW1pdGVkIHRvIHRoZSByYW5nZSBhY2NlcHRlZCBieSB4ODcgbG9uZyBkb3VibGUuICBUaGlzIG1ha2VzCisvLy8gaXQgdHJpdmlhbCB0byBhZGQgZnVuY3Rpb25hbGl0eSB0byBjb252ZXJ0IHRvIEFQRmxvYXQgKHRoaXMgaXMgYWxyZWFkeQorLy8vIHJlbGllZCBvbiBmb3IgdGhlIGltcGxlbWVudGF0aW9uIG9mIHByaW50aW5nKS4KKy8vLworLy8vIFBvc3NpYmxlIChhbmQgY29uZmxpY3RpbmcpIGZ1dHVyZSBkaXJlY3Rpb25zOgorLy8vCisvLy8gIDEuIFR1cm4gdGhpcyBpbnRvIGEgd3JhcHBlciBhcm91bmQgXGEgQVBGbG9hdC4KKy8vLyAgMi4gU2hhcmUgdGhlIGFsZ29yaXRobSBpbXBsZW1lbnRhdGlvbnMgd2l0aCBcYSBBUEZsb2F0LgorLy8vICAzLiBBbGxvdyBcYSBTY2FsZWROdW1iZXIgdG8gcmVwcmVzZW50IGEgc2lnbmVkIG51bWJlci4KK3RlbXBsYXRlIDxjbGFzcyBEaWdpdHNUPiBjbGFzcyBTY2FsZWROdW1iZXIgOiBTY2FsZWROdW1iZXJCYXNlIHsKK3B1YmxpYzoKKyAgc3RhdGljX2Fzc2VydCghc3RkOjpudW1lcmljX2xpbWl0czxEaWdpdHNUPjo6aXNfc2lnbmVkLAorICAgICAgICAgICAgICAgICJvbmx5IHVuc2lnbmVkIGZsb2F0cyBzdXBwb3J0ZWQiKTsKKworICB0eXBlZGVmIERpZ2l0c1QgRGlnaXRzVHlwZTsKKworcHJpdmF0ZToKKyAgdHlwZWRlZiBzdGQ6Om51bWVyaWNfbGltaXRzPERpZ2l0c1R5cGU+IERpZ2l0c0xpbWl0czsKKworICBzdGF0aWMgY29uc3QgaW50IFdpZHRoID0gc2l6ZW9mKERpZ2l0c1R5cGUpICogODsKKyAgc3RhdGljX2Fzc2VydChXaWR0aCA8PSA2NCwgImludmFsaWQgaW50ZWdlciB3aWR0aCBmb3IgZGlnaXRzIik7CisKK3ByaXZhdGU6CisgIERpZ2l0c1R5cGUgRGlnaXRzID0gMDsKKyAgaW50MTZfdCBTY2FsZSA9IDA7CisKK3B1YmxpYzoKKyAgU2NhbGVkTnVtYmVyKCkgPSBkZWZhdWx0OworCisgIGNvbnN0ZXhwciBTY2FsZWROdW1iZXIoRGlnaXRzVHlwZSBEaWdpdHMsIGludDE2X3QgU2NhbGUpCisgICAgICA6IERpZ2l0cyhEaWdpdHMpLCBTY2FsZShTY2FsZSkge30KKworcHJpdmF0ZToKKyAgU2NhbGVkTnVtYmVyKGNvbnN0IHN0ZDo6cGFpcjxEaWdpdHNULCBpbnQxNl90PiAmWCkKKyAgICAgIDogRGlnaXRzKFguZmlyc3QpLCBTY2FsZShYLnNlY29uZCkge30KKworcHVibGljOgorICBzdGF0aWMgU2NhbGVkTnVtYmVyIGdldFplcm8oKSB7IHJldHVybiBTY2FsZWROdW1iZXIoMCwgMCk7IH0KKyAgc3RhdGljIFNjYWxlZE51bWJlciBnZXRPbmUoKSB7IHJldHVybiBTY2FsZWROdW1iZXIoMSwgMCk7IH0KKyAgc3RhdGljIFNjYWxlZE51bWJlciBnZXRMYXJnZXN0KCkgeworICAgIHJldHVybiBTY2FsZWROdW1iZXIoRGlnaXRzTGltaXRzOjptYXgoKSwgU2NhbGVkTnVtYmVyczo6TWF4U2NhbGUpOworICB9CisgIHN0YXRpYyBTY2FsZWROdW1iZXIgZ2V0KHVpbnQ2NF90IE4pIHsgcmV0dXJuIGFkanVzdFRvV2lkdGgoTiwgMCk7IH0KKyAgc3RhdGljIFNjYWxlZE51bWJlciBnZXRJbnZlcnNlKHVpbnQ2NF90IE4pIHsKKyAgICByZXR1cm4gZ2V0KE4pLmludmVydCgpOworICB9CisgIHN0YXRpYyBTY2FsZWROdW1iZXIgZ2V0RnJhY3Rpb24oRGlnaXRzVHlwZSBOLCBEaWdpdHNUeXBlIEQpIHsKKyAgICByZXR1cm4gZ2V0UXVvdGllbnQoTiwgRCk7CisgIH0KKworICBpbnQxNl90IGdldFNjYWxlKCkgY29uc3QgeyByZXR1cm4gU2NhbGU7IH0KKyAgRGlnaXRzVHlwZSBnZXREaWdpdHMoKSBjb25zdCB7IHJldHVybiBEaWdpdHM7IH0KKworICAvLy8gXGJyaWVmIENvbnZlcnQgdG8gdGhlIGdpdmVuIGludGVnZXIgdHlwZS4KKyAgLy8vCisgIC8vLyBDb252ZXJ0IHRvIFxjIEludFQgdXNpbmcgc2ltcGxlIHNhdHVyYXRpbmcgYXJpdGhtZXRpYywgdHJ1bmNhdGluZyBpZgorICAvLy8gbmVjZXNzYXJ5LgorICB0ZW1wbGF0ZSA8Y2xhc3MgSW50VD4gSW50VCB0b0ludCgpIGNvbnN0OworCisgIGJvb2wgaXNaZXJvKCkgY29uc3QgeyByZXR1cm4gIURpZ2l0czsgfQorICBib29sIGlzTGFyZ2VzdCgpIGNvbnN0IHsgcmV0dXJuICp0aGlzID09IGdldExhcmdlc3QoKTsgfQorICBib29sIGlzT25lKCkgY29uc3QgeworICAgIGlmIChTY2FsZSA+IDAgfHwgU2NhbGUgPD0gLVdpZHRoKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiBEaWdpdHMgPT0gRGlnaXRzVHlwZSgxKSA8PCAtU2NhbGU7CisgIH0KKworICAvLy8gXGJyaWVmIFRoZSBsb2cgYmFzZSAyLCByb3VuZGVkLgorICAvLy8KKyAgLy8vIEdldCB0aGUgbGcgb2YgdGhlIHNjYWxhci4gIGxnIDAgaXMgZGVmaW5lZCB0byBiZSBJTlQzMl9NSU4uCisgIGludDMyX3QgbGcoKSBjb25zdCB7IHJldHVybiBTY2FsZWROdW1iZXJzOjpnZXRMZyhEaWdpdHMsIFNjYWxlKTsgfQorCisgIC8vLyBcYnJpZWYgVGhlIGxvZyBiYXNlIDIsIHJvdW5kZWQgdG93YXJkcyBJTlQzMl9NSU4uCisgIC8vLworICAvLy8gR2V0IHRoZSBsZyBmbG9vci4gIGxnIDAgaXMgZGVmaW5lZCB0byBiZSBJTlQzMl9NSU4uCisgIGludDMyX3QgbGdGbG9vcigpIGNvbnN0IHsgcmV0dXJuIFNjYWxlZE51bWJlcnM6OmdldExnRmxvb3IoRGlnaXRzLCBTY2FsZSk7IH0KKworICAvLy8gXGJyaWVmIFRoZSBsb2cgYmFzZSAyLCByb3VuZGVkIHRvd2FyZHMgSU5UMzJfTUFYLgorICAvLy8KKyAgLy8vIEdldCB0aGUgbGcgY2VpbGluZy4gIGxnIDAgaXMgZGVmaW5lZCB0byBiZSBJTlQzMl9NSU4uCisgIGludDMyX3QgbGdDZWlsaW5nKCkgY29uc3QgeworICAgIHJldHVybiBTY2FsZWROdW1iZXJzOjpnZXRMZ0NlaWxpbmcoRGlnaXRzLCBTY2FsZSk7CisgIH0KKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgU2NhbGVkTnVtYmVyICZYKSBjb25zdCB7IHJldHVybiBjb21wYXJlKFgpID09IDA7IH0KKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgU2NhbGVkTnVtYmVyICZYKSBjb25zdCB7IHJldHVybiBjb21wYXJlKFgpIDwgMDsgfQorICBib29sIG9wZXJhdG9yIT0oY29uc3QgU2NhbGVkTnVtYmVyICZYKSBjb25zdCB7IHJldHVybiBjb21wYXJlKFgpICE9IDA7IH0KKyAgYm9vbCBvcGVyYXRvcj4oY29uc3QgU2NhbGVkTnVtYmVyICZYKSBjb25zdCB7IHJldHVybiBjb21wYXJlKFgpID4gMDsgfQorICBib29sIG9wZXJhdG9yPD0oY29uc3QgU2NhbGVkTnVtYmVyICZYKSBjb25zdCB7IHJldHVybiBjb21wYXJlKFgpIDw9IDA7IH0KKyAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IFNjYWxlZE51bWJlciAmWCkgY29uc3QgeyByZXR1cm4gY29tcGFyZShYKSA+PSAwOyB9CisKKyAgYm9vbCBvcGVyYXRvciEoKSBjb25zdCB7IHJldHVybiBpc1plcm8oKTsgfQorCisgIC8vLyBcYnJpZWYgQ29udmVydCB0byBhIGRlY2ltYWwgcmVwcmVzZW50YXRpb24gaW4gYSBzdHJpbmcuCisgIC8vLworICAvLy8gQ29udmVydCB0byBhIHN0cmluZy4gIFVzZXMgc2NpZW50aWZpYyBub3RhdGlvbiBmb3IgdmVyeSBsYXJnZS9zbWFsbAorICAvLy8gbnVtYmVycy4gIFNjaWVudGlmaWMgbm90YXRpb24gaXMgdXNlZCByb3VnaGx5IGZvciBudW1iZXJzIG91dHNpZGUgb2YgdGhlCisgIC8vLyByYW5nZSAyXi02NCB0aHJvdWdoIDJeNjQuCisgIC8vLworICAvLy8gXGMgUHJlY2lzaW9uIGluZGljYXRlcyB0aGUgbnVtYmVyIG9mIGRlY2ltYWwgZGlnaXRzIG9mIHByZWNpc2lvbiB0byB1c2U7CisgIC8vLyAwIHJlcXVlc3RzIHRoZSBtYXhpbXVtIGF2YWlsYWJsZS4KKyAgLy8vCisgIC8vLyBBcyBhIHNwZWNpYWwgY2FzZSB0byBtYWtlIGRlYnVnZ2luZyBlYXNpZXIsIGlmIHRoZSBudW1iZXIgaXMgc21hbGwgZW5vdWdoCisgIC8vLyB0byBjb252ZXJ0IHdpdGhvdXQgc2NpZW50aWZpYyBub3RhdGlvbiBhbmQgaGFzIG1vcmUgdGhhbiBcYyBQcmVjaXNpb24KKyAgLy8vIGRpZ2l0cyBiZWZvcmUgdGhlIGRlY2ltYWwgcGxhY2UsIGl0J3MgcHJpbnRlZCBhY2N1cmF0ZWx5IHRvIHRoZSBmaXJzdAorICAvLy8gZGlnaXQgcGFzdCB6ZXJvLiAgRS5nLiwgYXNzdW1pbmcgMTAgZGlnaXRzIG9mIHByZWNpc2lvbjoKKyAgLy8vCisgIC8vLyAgICAgOTg3NjU0MzIxOTguNzY1NC4uLiA9PiA5ODc2NTQzMjE5OC44CisgIC8vLyAgICAgIDg3NjU0MzIxOTguNzY1NC4uLiA9PiAgODc2NTQzMjE5OC44CisgIC8vLyAgICAgICA3NjU0MzIxOTguNzY1NC4uLiA9PiAgIDc2NTQzMjE5OC44CisgIC8vLyAgICAgICAgNjU0MzIxOTguNzY1NC4uLiA9PiAgICA2NTQzMjE5OC43NworICAvLy8gICAgICAgICA1NDMyMTk4Ljc2NTQuLi4gPT4gICAgIDU0MzIxOTguNzY1CisgIHN0ZDo6c3RyaW5nIHRvU3RyaW5nKHVuc2lnbmVkIFByZWNpc2lvbiA9IERlZmF1bHRQcmVjaXNpb24pIHsKKyAgICByZXR1cm4gU2NhbGVkTnVtYmVyQmFzZTo6dG9TdHJpbmcoRGlnaXRzLCBTY2FsZSwgV2lkdGgsIFByZWNpc2lvbik7CisgIH0KKworICAvLy8gXGJyaWVmIFByaW50IGEgZGVjaW1hbCByZXByZXNlbnRhdGlvbi4KKyAgLy8vCisgIC8vLyBQcmludCBhIHN0cmluZy4gIFNlZSB0b1N0cmluZyBmb3IgZG9jdW1lbnRhdGlvbi4KKyAgcmF3X29zdHJlYW0gJnByaW50KHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFByZWNpc2lvbiA9IERlZmF1bHRQcmVjaXNpb24pIGNvbnN0IHsKKyAgICByZXR1cm4gU2NhbGVkTnVtYmVyQmFzZTo6cHJpbnQoT1MsIERpZ2l0cywgU2NhbGUsIFdpZHRoLCBQcmVjaXNpb24pOworICB9CisgIHZvaWQgZHVtcCgpIGNvbnN0IHsgcmV0dXJuIFNjYWxlZE51bWJlckJhc2U6OmR1bXAoRGlnaXRzLCBTY2FsZSwgV2lkdGgpOyB9CisKKyAgU2NhbGVkTnVtYmVyICZvcGVyYXRvcis9KGNvbnN0IFNjYWxlZE51bWJlciAmWCkgeworICAgIHN0ZDo6dGllKERpZ2l0cywgU2NhbGUpID0KKyAgICAgICAgU2NhbGVkTnVtYmVyczo6Z2V0U3VtKERpZ2l0cywgU2NhbGUsIFguRGlnaXRzLCBYLlNjYWxlKTsKKyAgICAvLyBDaGVjayBmb3IgZXhwb25lbnQgcGFzdCBNYXhTY2FsZS4KKyAgICBpZiAoU2NhbGUgPiBTY2FsZWROdW1iZXJzOjpNYXhTY2FsZSkKKyAgICAgICp0aGlzID0gZ2V0TGFyZ2VzdCgpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBTY2FsZWROdW1iZXIgJm9wZXJhdG9yLT0oY29uc3QgU2NhbGVkTnVtYmVyICZYKSB7CisgICAgc3RkOjp0aWUoRGlnaXRzLCBTY2FsZSkgPQorICAgICAgICBTY2FsZWROdW1iZXJzOjpnZXREaWZmZXJlbmNlKERpZ2l0cywgU2NhbGUsIFguRGlnaXRzLCBYLlNjYWxlKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgU2NhbGVkTnVtYmVyICZvcGVyYXRvcio9KGNvbnN0IFNjYWxlZE51bWJlciAmWCk7CisgIFNjYWxlZE51bWJlciAmb3BlcmF0b3IvPShjb25zdCBTY2FsZWROdW1iZXIgJlgpOworICBTY2FsZWROdW1iZXIgJm9wZXJhdG9yPDw9KGludDE2X3QgU2hpZnQpIHsKKyAgICBzaGlmdExlZnQoU2hpZnQpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBTY2FsZWROdW1iZXIgJm9wZXJhdG9yPj49KGludDE2X3QgU2hpZnQpIHsKKyAgICBzaGlmdFJpZ2h0KFNoaWZ0KTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworcHJpdmF0ZToKKyAgdm9pZCBzaGlmdExlZnQoaW50MzJfdCBTaGlmdCk7CisgIHZvaWQgc2hpZnRSaWdodChpbnQzMl90IFNoaWZ0KTsKKworICAvLy8gXGJyaWVmIEFkanVzdCB0d28gZmxvYXRzIHRvIGhhdmUgbWF0Y2hpbmcgZXhwb25lbnRzLgorICAvLy8KKyAgLy8vIEFkanVzdCBcYyB0aGlzIGFuZCBcYyBYIHRvIGhhdmUgbWF0Y2hpbmcgZXhwb25lbnRzLiAgUmV0dXJucyB0aGUgbmV3IFxjIFgKKyAgLy8vIGJ5IHZhbHVlLiAgRG9lcyBub3RoaW5nIGlmIFxhIGlzWmVybygpIGZvciBlaXRoZXIuCisgIC8vLworICAvLy8gVGhlIHZhbHVlIHRoYXQgY29tcGFyZXMgc21hbGxlciB3aWxsIGxvc2UgcHJlY2lzaW9uLCBhbmQgcG9zc2libHkgYmVjb21lCisgIC8vLyBcYSBpc1plcm8oKS4KKyAgU2NhbGVkTnVtYmVyIG1hdGNoU2NhbGVzKFNjYWxlZE51bWJlciBYKSB7CisgICAgU2NhbGVkTnVtYmVyczo6bWF0Y2hTY2FsZXMoRGlnaXRzLCBTY2FsZSwgWC5EaWdpdHMsIFguU2NhbGUpOworICAgIHJldHVybiBYOworICB9CisKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBTY2FsZSBhIGxhcmdlIG51bWJlciBhY2N1cmF0ZWx5LgorICAvLy8KKyAgLy8vIFNjYWxlIE4gKG11bHRpcGx5IGl0IGJ5IHRoaXMpLiAgVXNlcyBmdWxsIHByZWNpc2lvbiBtdWx0aXBsaWNhdGlvbiwgZXZlbgorICAvLy8gaWYgV2lkdGggaXMgc21hbGxlciB0aGFuIDY0LCBzbyBpbmZvcm1hdGlvbiBpcyBub3QgbG9zdC4KKyAgdWludDY0X3Qgc2NhbGUodWludDY0X3QgTikgY29uc3Q7CisgIHVpbnQ2NF90IHNjYWxlQnlJbnZlcnNlKHVpbnQ2NF90IE4pIGNvbnN0IHsKKyAgICAvLyBUT0RPOiBpbXBsZW1lbnQgZGlyZWN0bHksIHJhdGhlciB0aGFuIHJlbHlpbmcgb24gaW52ZXJzZS4gIEludmVyc2UgaXMKKyAgICAvLyBleHBlbnNpdmUuCisgICAgcmV0dXJuIGludmVyc2UoKS5zY2FsZShOKTsKKyAgfQorICBpbnQ2NF90IHNjYWxlKGludDY0X3QgTikgY29uc3QgeworICAgIHN0ZDo6cGFpcjx1aW50NjRfdCwgYm9vbD4gVW5zaWduZWQgPSBzcGxpdFNpZ25lZChOKTsKKyAgICByZXR1cm4gam9pblNpZ25lZChzY2FsZShVbnNpZ25lZC5maXJzdCksIFVuc2lnbmVkLnNlY29uZCk7CisgIH0KKyAgaW50NjRfdCBzY2FsZUJ5SW52ZXJzZShpbnQ2NF90IE4pIGNvbnN0IHsKKyAgICBzdGQ6OnBhaXI8dWludDY0X3QsIGJvb2w+IFVuc2lnbmVkID0gc3BsaXRTaWduZWQoTik7CisgICAgcmV0dXJuIGpvaW5TaWduZWQoc2NhbGVCeUludmVyc2UoVW5zaWduZWQuZmlyc3QpLCBVbnNpZ25lZC5zZWNvbmQpOworICB9CisKKyAgaW50IGNvbXBhcmUoY29uc3QgU2NhbGVkTnVtYmVyICZYKSBjb25zdCB7CisgICAgcmV0dXJuIFNjYWxlZE51bWJlcnM6OmNvbXBhcmUoRGlnaXRzLCBTY2FsZSwgWC5EaWdpdHMsIFguU2NhbGUpOworICB9CisgIGludCBjb21wYXJlVG8odWludDY0X3QgTikgY29uc3QgeworICAgIHJldHVybiBTY2FsZWROdW1iZXJzOjpjb21wYXJlPHVpbnQ2NF90PihEaWdpdHMsIFNjYWxlLCBOLCAwKTsKKyAgfQorICBpbnQgY29tcGFyZVRvKGludDY0X3QgTikgY29uc3QgeyByZXR1cm4gTiA8IDAgPyAxIDogY29tcGFyZVRvKHVpbnQ2NF90KE4pKTsgfQorCisgIFNjYWxlZE51bWJlciAmaW52ZXJ0KCkgeyByZXR1cm4gKnRoaXMgPSBTY2FsZWROdW1iZXI6OmdldCgxKSAvICp0aGlzOyB9CisgIFNjYWxlZE51bWJlciBpbnZlcnNlKCkgY29uc3QgeyByZXR1cm4gU2NhbGVkTnVtYmVyKCp0aGlzKS5pbnZlcnQoKTsgfQorCitwcml2YXRlOgorICBzdGF0aWMgU2NhbGVkTnVtYmVyIGdldFByb2R1Y3QoRGlnaXRzVHlwZSBMSFMsIERpZ2l0c1R5cGUgUkhTKSB7CisgICAgcmV0dXJuIFNjYWxlZE51bWJlcnM6OmdldFByb2R1Y3QoTEhTLCBSSFMpOworICB9CisgIHN0YXRpYyBTY2FsZWROdW1iZXIgZ2V0UXVvdGllbnQoRGlnaXRzVHlwZSBEaXZpZGVuZCwgRGlnaXRzVHlwZSBEaXZpc29yKSB7CisgICAgcmV0dXJuIFNjYWxlZE51bWJlcnM6OmdldFF1b3RpZW50KERpdmlkZW5kLCBEaXZpc29yKTsKKyAgfQorCisgIHN0YXRpYyBpbnQgY291bnRMZWFkaW5nWmVyb3NXaWR0aChEaWdpdHNUeXBlIERpZ2l0cykgeworICAgIGlmIChXaWR0aCA9PSA2NCkKKyAgICAgIHJldHVybiBjb3VudExlYWRpbmdaZXJvczY0KERpZ2l0cyk7CisgICAgaWYgKFdpZHRoID09IDMyKQorICAgICAgcmV0dXJuIGNvdW50TGVhZGluZ1plcm9zMzIoRGlnaXRzKTsKKyAgICByZXR1cm4gY291bnRMZWFkaW5nWmVyb3MzMihEaWdpdHMpICsgV2lkdGggLSAzMjsKKyAgfQorCisgIC8vLyBcYnJpZWYgQWRqdXN0IGEgbnVtYmVyIHRvIHdpZHRoLCByb3VuZGluZyB1cCBpZiBuZWNlc3NhcnkuCisgIC8vLworICAvLy8gU2hvdWxkIG9ubHkgYmUgY2FsbGVkIGZvciBcYyBTaGlmdCBjbG9zZSB0byB6ZXJvLgorICAvLy8KKyAgLy8vIFxwcmUgU2hpZnQgPj0gTWluU2NhbGUgJiYgU2hpZnQgKyA2NCA8PSBNYXhTY2FsZS4KKyAgc3RhdGljIFNjYWxlZE51bWJlciBhZGp1c3RUb1dpZHRoKHVpbnQ2NF90IE4sIGludDMyX3QgU2hpZnQpIHsKKyAgICBhc3NlcnQoU2hpZnQgPj0gU2NhbGVkTnVtYmVyczo6TWluU2NhbGUgJiYgIlNoaWZ0IHNob3VsZCBiZSBjbG9zZSB0byAwIik7CisgICAgYXNzZXJ0KFNoaWZ0IDw9IFNjYWxlZE51bWJlcnM6Ok1heFNjYWxlIC0gNjQgJiYKKyAgICAgICAgICAgIlNoaWZ0IHNob3VsZCBiZSBjbG9zZSB0byAwIik7CisgICAgYXV0byBBZGp1c3RlZCA9IFNjYWxlZE51bWJlcnM6OmdldEFkanVzdGVkPERpZ2l0c1Q+KE4sIFNoaWZ0KTsKKyAgICByZXR1cm4gQWRqdXN0ZWQ7CisgIH0KKworICBzdGF0aWMgU2NhbGVkTnVtYmVyIGdldFJvdW5kZWQoU2NhbGVkTnVtYmVyIFAsIGJvb2wgUm91bmQpIHsKKyAgICAvLyBTYXR1cmF0ZS4KKyAgICBpZiAoUC5pc0xhcmdlc3QoKSkKKyAgICAgIHJldHVybiBQOworCisgICAgcmV0dXJuIFNjYWxlZE51bWJlcnM6OmdldFJvdW5kZWQoUC5EaWdpdHMsIFAuU2NhbGUsIFJvdW5kKTsKKyAgfQorfTsKKworI2RlZmluZSBTQ0FMRURfTlVNQkVSX0JPUChvcCwgYmFzZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPGNsYXNzIERpZ2l0c1Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNjYWxlZE51bWJlcjxEaWdpdHNUPiBvcGVyYXRvciBvcChjb25zdCBTY2FsZWROdW1iZXI8RGlnaXRzVD4gJkwsICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2NhbGVkTnVtYmVyPERpZ2l0c1Q+ICZSKSB7ICAgICAgICAgIFwKKyAgICByZXR1cm4gU2NhbGVkTnVtYmVyPERpZ2l0c1Q+KEwpIGJhc2UgUjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KK1NDQUxFRF9OVU1CRVJfQk9QKCssICs9ICkKK1NDQUxFRF9OVU1CRVJfQk9QKC0sIC09ICkKK1NDQUxFRF9OVU1CRVJfQk9QKCosICo9ICkKK1NDQUxFRF9OVU1CRVJfQk9QKC8sIC89ICkKKyN1bmRlZiBTQ0FMRURfTlVNQkVSX0JPUAorCit0ZW1wbGF0ZSA8Y2xhc3MgRGlnaXRzVD4KK1NjYWxlZE51bWJlcjxEaWdpdHNUPiBvcGVyYXRvcjw8KGNvbnN0IFNjYWxlZE51bWJlcjxEaWdpdHNUPiAmTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDE2X3QgU2hpZnQpIHsKKyAgcmV0dXJuIFNjYWxlZE51bWJlcjxEaWdpdHNUPihMKSA8PD0gU2hpZnQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBEaWdpdHNUPgorU2NhbGVkTnVtYmVyPERpZ2l0c1Q+IG9wZXJhdG9yPj4oY29uc3QgU2NhbGVkTnVtYmVyPERpZ2l0c1Q+ICZMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MTZfdCBTaGlmdCkgeworICByZXR1cm4gU2NhbGVkTnVtYmVyPERpZ2l0c1Q+KEwpID4+PSBTaGlmdDsKK30KKwordGVtcGxhdGUgPGNsYXNzIERpZ2l0c1Q+CityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFNjYWxlZE51bWJlcjxEaWdpdHNUPiAmWCkgeworICByZXR1cm4gWC5wcmludChPUywgMTApOworfQorCisjZGVmaW5lIFNDQUxFRF9OVU1CRVJfQ09NUEFSRV9UT19UWVBFKG9wLCBUMSwgVDIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8Y2xhc3MgRGlnaXRzVD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgYm9vbCBvcGVyYXRvciBvcChjb25zdCBTY2FsZWROdW1iZXI8RGlnaXRzVD4gJkwsIFQxIFIpIHsgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIEwuY29tcGFyZVRvKFQyKFIpKSBvcCAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPGNsYXNzIERpZ2l0c1Q+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGJvb2wgb3BlcmF0b3Igb3AoVDEgTCwgY29uc3QgU2NhbGVkTnVtYmVyPERpZ2l0c1Q+ICZSKSB7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAwIG9wIFIuY29tcGFyZVRvKFQyKEwpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorI2RlZmluZSBTQ0FMRURfTlVNQkVSX0NPTVBBUkVfVE8ob3ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU0NBTEVEX05VTUJFUl9DT01QQVJFX1RPX1RZUEUob3AsIHVpbnQ2NF90LCB1aW50NjRfdCkgICAgICAgICAgICAgICAgICAgICAgICBcCisgIFNDQUxFRF9OVU1CRVJfQ09NUEFSRV9UT19UWVBFKG9wLCB1aW50MzJfdCwgdWludDY0X3QpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBTQ0FMRURfTlVNQkVSX0NPTVBBUkVfVE9fVFlQRShvcCwgaW50NjRfdCwgaW50NjRfdCkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgU0NBTEVEX05VTUJFUl9DT01QQVJFX1RPX1RZUEUob3AsIGludDMyX3QsIGludDY0X3QpCitTQ0FMRURfTlVNQkVSX0NPTVBBUkVfVE8oPCApCitTQ0FMRURfTlVNQkVSX0NPTVBBUkVfVE8oPiApCitTQ0FMRURfTlVNQkVSX0NPTVBBUkVfVE8oPT0gKQorU0NBTEVEX05VTUJFUl9DT01QQVJFX1RPKCE9ICkKK1NDQUxFRF9OVU1CRVJfQ09NUEFSRV9UTyg8PSApCitTQ0FMRURfTlVNQkVSX0NPTVBBUkVfVE8oPj0gKQorI3VuZGVmIFNDQUxFRF9OVU1CRVJfQ09NUEFSRV9UTworI3VuZGVmIFNDQUxFRF9OVU1CRVJfQ09NUEFSRV9UT19UWVBFCisKK3RlbXBsYXRlIDxjbGFzcyBEaWdpdHNUPgordWludDY0X3QgU2NhbGVkTnVtYmVyPERpZ2l0c1Q+OjpzY2FsZSh1aW50NjRfdCBOKSBjb25zdCB7CisgIGlmIChXaWR0aCA9PSA2NCB8fCBOIDw9IERpZ2l0c0xpbWl0czo6bWF4KCkpCisgICAgcmV0dXJuIChnZXQoTikgKiAqdGhpcykudGVtcGxhdGUgdG9JbnQ8dWludDY0X3Q+KCk7CisKKyAgLy8gRGVmZXIgdG8gdGhlIDY0LWJpdCB2ZXJzaW9uLgorICByZXR1cm4gU2NhbGVkTnVtYmVyPHVpbnQ2NF90PihEaWdpdHMsIFNjYWxlKS5zY2FsZShOKTsKK30KKwordGVtcGxhdGUgPGNsYXNzIERpZ2l0c1Q+Cit0ZW1wbGF0ZSA8Y2xhc3MgSW50VD4KK0ludFQgU2NhbGVkTnVtYmVyPERpZ2l0c1Q+Ojp0b0ludCgpIGNvbnN0IHsKKyAgdHlwZWRlZiBzdGQ6Om51bWVyaWNfbGltaXRzPEludFQ+IExpbWl0czsKKyAgaWYgKCp0aGlzIDwgMSkKKyAgICByZXR1cm4gMDsKKyAgaWYgKCp0aGlzID49IExpbWl0czo6bWF4KCkpCisgICAgcmV0dXJuIExpbWl0czo6bWF4KCk7CisKKyAgSW50VCBOID0gRGlnaXRzOworICBpZiAoU2NhbGUgPiAwKSB7CisgICAgYXNzZXJ0KHNpemVfdChTY2FsZSkgPCBzaXplb2YoSW50VCkgKiA4KTsKKyAgICByZXR1cm4gTiA8PCBTY2FsZTsKKyAgfQorICBpZiAoU2NhbGUgPCAwKSB7CisgICAgYXNzZXJ0KHNpemVfdCgtU2NhbGUpIDwgc2l6ZW9mKEludFQpICogOCk7CisgICAgcmV0dXJuIE4gPj4gLVNjYWxlOworICB9CisgIHJldHVybiBOOworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgRGlnaXRzVD4KK1NjYWxlZE51bWJlcjxEaWdpdHNUPiAmU2NhbGVkTnVtYmVyPERpZ2l0c1Q+OjoKK29wZXJhdG9yKj0oY29uc3QgU2NhbGVkTnVtYmVyICZYKSB7CisgIGlmIChpc1plcm8oKSkKKyAgICByZXR1cm4gKnRoaXM7CisgIGlmIChYLmlzWmVybygpKQorICAgIHJldHVybiAqdGhpcyA9IFg7CisKKyAgLy8gU2F2ZSB0aGUgZXhwb25lbnRzLgorICBpbnQzMl90IFNjYWxlcyA9IGludDMyX3QoU2NhbGUpICsgaW50MzJfdChYLlNjYWxlKTsKKworICAvLyBHZXQgdGhlIHJhdyBwcm9kdWN0LgorICAqdGhpcyA9IGdldFByb2R1Y3QoRGlnaXRzLCBYLkRpZ2l0cyk7CisKKyAgLy8gQ29tYmluZSB3aXRoIGV4cG9uZW50cy4KKyAgcmV0dXJuICp0aGlzIDw8PSBTY2FsZXM7Cit9Cit0ZW1wbGF0ZSA8Y2xhc3MgRGlnaXRzVD4KK1NjYWxlZE51bWJlcjxEaWdpdHNUPiAmU2NhbGVkTnVtYmVyPERpZ2l0c1Q+OjoKK29wZXJhdG9yLz0oY29uc3QgU2NhbGVkTnVtYmVyICZYKSB7CisgIGlmIChpc1plcm8oKSkKKyAgICByZXR1cm4gKnRoaXM7CisgIGlmIChYLmlzWmVybygpKQorICAgIHJldHVybiAqdGhpcyA9IGdldExhcmdlc3QoKTsKKworICAvLyBTYXZlIHRoZSBleHBvbmVudHMuCisgIGludDMyX3QgU2NhbGVzID0gaW50MzJfdChTY2FsZSkgLSBpbnQzMl90KFguU2NhbGUpOworCisgIC8vIEdldCB0aGUgcmF3IHF1b3RpZW50LgorICAqdGhpcyA9IGdldFF1b3RpZW50KERpZ2l0cywgWC5EaWdpdHMpOworCisgIC8vIENvbWJpbmUgd2l0aCBleHBvbmVudHMuCisgIHJldHVybiAqdGhpcyA8PD0gU2NhbGVzOworfQordGVtcGxhdGUgPGNsYXNzIERpZ2l0c1Q+IHZvaWQgU2NhbGVkTnVtYmVyPERpZ2l0c1Q+OjpzaGlmdExlZnQoaW50MzJfdCBTaGlmdCkgeworICBpZiAoIVNoaWZ0IHx8IGlzWmVybygpKQorICAgIHJldHVybjsKKyAgYXNzZXJ0KFNoaWZ0ICE9IElOVDMyX01JTik7CisgIGlmIChTaGlmdCA8IDApIHsKKyAgICBzaGlmdFJpZ2h0KC1TaGlmdCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gU2hpZnQgYXMgbXVjaCBhcyB3ZSBjYW4gaW4gdGhlIGV4cG9uZW50LgorICBpbnQzMl90IFNjYWxlU2hpZnQgPSBzdGQ6Om1pbihTaGlmdCwgU2NhbGVkTnVtYmVyczo6TWF4U2NhbGUgLSBTY2FsZSk7CisgIFNjYWxlICs9IFNjYWxlU2hpZnQ7CisgIGlmIChTY2FsZVNoaWZ0ID09IFNoaWZ0KQorICAgIHJldHVybjsKKworICAvLyBDaGVjayB0aGlzIGxhdGUsIHNpbmNlIGl0J3MgcmFyZS4KKyAgaWYgKGlzTGFyZ2VzdCgpKQorICAgIHJldHVybjsKKworICAvLyBTaGlmdCB0aGUgZGlnaXRzIHRoZW1zZWx2ZXMuCisgIFNoaWZ0IC09IFNjYWxlU2hpZnQ7CisgIGlmIChTaGlmdCA+IGNvdW50TGVhZGluZ1plcm9zV2lkdGgoRGlnaXRzKSkgeworICAgIC8vIFNhdHVyYXRlLgorICAgICp0aGlzID0gZ2V0TGFyZ2VzdCgpOworICAgIHJldHVybjsKKyAgfQorCisgIERpZ2l0cyA8PD0gU2hpZnQ7Cit9CisKK3RlbXBsYXRlIDxjbGFzcyBEaWdpdHNUPiB2b2lkIFNjYWxlZE51bWJlcjxEaWdpdHNUPjo6c2hpZnRSaWdodChpbnQzMl90IFNoaWZ0KSB7CisgIGlmICghU2hpZnQgfHwgaXNaZXJvKCkpCisgICAgcmV0dXJuOworICBhc3NlcnQoU2hpZnQgIT0gSU5UMzJfTUlOKTsKKyAgaWYgKFNoaWZ0IDwgMCkgeworICAgIHNoaWZ0TGVmdCgtU2hpZnQpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFNoaWZ0IGFzIG11Y2ggYXMgd2UgY2FuIGluIHRoZSBleHBvbmVudC4KKyAgaW50MzJfdCBTY2FsZVNoaWZ0ID0gc3RkOjptaW4oU2hpZnQsIFNjYWxlIC0gU2NhbGVkTnVtYmVyczo6TWluU2NhbGUpOworICBTY2FsZSAtPSBTY2FsZVNoaWZ0OworICBpZiAoU2NhbGVTaGlmdCA9PSBTaGlmdCkKKyAgICByZXR1cm47CisKKyAgLy8gU2hpZnQgdGhlIGRpZ2l0cyB0aGVtc2VsdmVzLgorICBTaGlmdCAtPSBTY2FsZVNoaWZ0OworICBpZiAoU2hpZnQgPj0gV2lkdGgpIHsKKyAgICAvLyBTYXR1cmF0ZS4KKyAgICAqdGhpcyA9IGdldFplcm8oKTsKKyAgICByZXR1cm47CisgIH0KKworICBEaWdpdHMgPj49IFNoaWZ0OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IGlzUG9kTGlrZTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBzdHJ1Y3QgaXNQb2RMaWtlPFNjYWxlZE51bWJlcjxUPj4geworICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHRydWU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX1NDQUxFRE5VTUJFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU2NvcGVkUHJpbnRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1Njb3BlZFByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NjRkMjU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1Njb3BlZFByaW50ZXIuaApAQCAtMCwwICsxLDM4OSBAQAorLy89PT0tLSBTY29wZWRQcmludGVyLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfU0NPUEVEUFJJTlRFUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9TQ09QRURQUklOVEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FQU0ludC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IEVudW1FbnRyeSB7CisgIFN0cmluZ1JlZiBOYW1lOworICAvLyBXaGlsZSBOYW1lIHN1ZmZpY2VzIGluIG1vc3Qgb2YgdGhlIGNhc2VzLCBpbiBjZXJ0YWluIGNhc2VzCisgIC8vIEdOVSBzdHlsZSBhbmQgTExWTSBzdHlsZSBvZiBFTEZEdW1wZXIgZG8gbm90CisgIC8vIGRpc3BsYXkgc2FtZSBzdHJpbmcgZm9yIHNhbWUgZW51bS4gVGhlIEFsdE5hbWUgaWYgaW5pdGlhbGl6ZWQgYXBwcm9wcmlhdGVseQorICAvLyB3aWxsIGhvbGQgdGhlIHN0cmluZyB0aGF0IEdOVSBzdHlsZSBlbWl0cy4KKyAgLy8gRXhhbXBsZToKKyAgLy8gIkVNX1g4Nl82NCIgc3RyaW5nIG9uIExMVk0gc3R5bGUgZm9yIEVsZl9FaGRyLT5lX21hY2hpbmUgY29ycmVzcG9uZHMgdG8KKyAgLy8gIkFkdmFuY2VkIE1pY3JvIERldmljZXMgWDg2LTY0IiBvbiBHTlUgc3R5bGUKKyAgU3RyaW5nUmVmIEFsdE5hbWU7CisgIFQgVmFsdWU7CisgIEVudW1FbnRyeShTdHJpbmdSZWYgTiwgU3RyaW5nUmVmIEEsIFQgVikgOiBOYW1lKE4pLCBBbHROYW1lKEEpLCBWYWx1ZShWKSB7fQorICBFbnVtRW50cnkoU3RyaW5nUmVmIE4sIFQgVikgOiBOYW1lKE4pLCBBbHROYW1lKE4pLCBWYWx1ZShWKSB7fQorfTsKKworc3RydWN0IEhleE51bWJlciB7CisgIC8vIFRvIGF2b2lkIHNpZ24tZXh0ZW5zaW9uIHdlIGhhdmUgdG8gZXhwbGljaXRseSBjYXN0IHRvIHRoZSBhcHByb3ByaWF0ZQorICAvLyB1bnNpZ25lZCB0eXBlLiBUaGUgb3ZlcmxvYWRzIGFyZSBoZXJlIHNvIHRoYXQgZXZlcnkgdHlwZSB0aGF0IGlzIGltcGxpY2l0bHkKKyAgLy8gY29udmVydGlibGUgdG8gYW4gaW50ZWdlciAoaW5jbHVkaW5nIGVudW1zIGFuZCBlbmRpYW4gaGVscGVycykgY2FuIGJlIHVzZWQKKyAgLy8gd2l0aG91dCByZXF1aXJpbmcgdHlwZSB0cmFpdHMgb3IgY2FsbC1zaXRlIGNoYW5nZXMuCisgIEhleE51bWJlcihjaGFyIFZhbHVlKSA6IFZhbHVlKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KFZhbHVlKSkge30KKyAgSGV4TnVtYmVyKHNpZ25lZCBjaGFyIFZhbHVlKSA6IFZhbHVlKHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KFZhbHVlKSkge30KKyAgSGV4TnVtYmVyKHNpZ25lZCBzaG9ydCBWYWx1ZSkgOiBWYWx1ZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBzaG9ydD4oVmFsdWUpKSB7fQorICBIZXhOdW1iZXIoc2lnbmVkIGludCBWYWx1ZSkgOiBWYWx1ZShzdGF0aWNfY2FzdDx1bnNpZ25lZCBpbnQ+KFZhbHVlKSkge30KKyAgSGV4TnVtYmVyKHNpZ25lZCBsb25nIFZhbHVlKSA6IFZhbHVlKHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KFZhbHVlKSkge30KKyAgSGV4TnVtYmVyKHNpZ25lZCBsb25nIGxvbmcgVmFsdWUpCisgICAgICA6IFZhbHVlKHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmcgbG9uZz4oVmFsdWUpKSB7fQorICBIZXhOdW1iZXIodW5zaWduZWQgY2hhciBWYWx1ZSkgOiBWYWx1ZShWYWx1ZSkge30KKyAgSGV4TnVtYmVyKHVuc2lnbmVkIHNob3J0IFZhbHVlKSA6IFZhbHVlKFZhbHVlKSB7fQorICBIZXhOdW1iZXIodW5zaWduZWQgaW50IFZhbHVlKSA6IFZhbHVlKFZhbHVlKSB7fQorICBIZXhOdW1iZXIodW5zaWduZWQgbG9uZyBWYWx1ZSkgOiBWYWx1ZShWYWx1ZSkge30KKyAgSGV4TnVtYmVyKHVuc2lnbmVkIGxvbmcgbG9uZyBWYWx1ZSkgOiBWYWx1ZShWYWx1ZSkge30KKyAgdWludDY0X3QgVmFsdWU7Cit9OworCityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IEhleE51bWJlciAmVmFsdWUpOworY29uc3Qgc3RkOjpzdHJpbmcgdG9faGV4U3RyaW5nKHVpbnQ2NF90IFZhbHVlLCBib29sIFVwcGVyQ2FzZSA9IHRydWUpOworCit0ZW1wbGF0ZSA8Y2xhc3MgVD4gY29uc3Qgc3RkOjpzdHJpbmcgdG9fc3RyaW5nKGNvbnN0IFQgJlZhbHVlKSB7CisgIHN0ZDo6c3RyaW5nIG51bWJlcjsKKyAgbGx2bTo6cmF3X3N0cmluZ19vc3RyZWFtIHN0cmVhbShudW1iZXIpOworICBzdHJlYW0gPDwgVmFsdWU7CisgIHJldHVybiBzdHJlYW0uc3RyKCk7Cit9CisKK2NsYXNzIFNjb3BlZFByaW50ZXIgeworcHVibGljOgorICBTY29wZWRQcmludGVyKHJhd19vc3RyZWFtICZPUykgOiBPUyhPUyksIEluZGVudExldmVsKDApIHt9CisKKyAgdm9pZCBmbHVzaCgpIHsgT1MuZmx1c2goKTsgfQorCisgIHZvaWQgaW5kZW50KGludCBMZXZlbHMgPSAxKSB7IEluZGVudExldmVsICs9IExldmVsczsgfQorCisgIHZvaWQgdW5pbmRlbnQoaW50IExldmVscyA9IDEpIHsKKyAgICBJbmRlbnRMZXZlbCA9IHN0ZDo6bWF4KDAsIEluZGVudExldmVsIC0gTGV2ZWxzKTsKKyAgfQorCisgIHZvaWQgcmVzZXRJbmRlbnQoKSB7IEluZGVudExldmVsID0gMDsgfQorCisgIGludCBnZXRJbmRlbnRMZXZlbCgpIHsgcmV0dXJuIEluZGVudExldmVsOyB9CisKKyAgdm9pZCBzZXRQcmVmaXgoU3RyaW5nUmVmIFApIHsgUHJlZml4ID0gUDsgfQorCisgIHZvaWQgcHJpbnRJbmRlbnQoKSB7CisgICAgT1MgPDwgUHJlZml4OworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgSW5kZW50TGV2ZWw7ICsraSkKKyAgICAgIE9TIDw8ICIgICI7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gSGV4TnVtYmVyIGhleChUIFZhbHVlKSB7IHJldHVybiBIZXhOdW1iZXIoVmFsdWUpOyB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFRFbnVtPgorICB2b2lkIHByaW50RW51bShTdHJpbmdSZWYgTGFiZWwsIFQgVmFsdWUsCisgICAgICAgICAgICAgICAgIEFycmF5UmVmPEVudW1FbnRyeTxURW51bT4+IEVudW1WYWx1ZXMpIHsKKyAgICBTdHJpbmdSZWYgTmFtZTsKKyAgICBib29sIEZvdW5kID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvICZFbnVtSXRlbSA6IEVudW1WYWx1ZXMpIHsKKyAgICAgIGlmIChFbnVtSXRlbS5WYWx1ZSA9PSBWYWx1ZSkgeworICAgICAgICBOYW1lID0gRW51bUl0ZW0uTmFtZTsKKyAgICAgICAgRm91bmQgPSB0cnVlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoRm91bmQpIHsKKyAgICAgIHN0YXJ0TGluZSgpIDw8IExhYmVsIDw8ICI6ICIgPDwgTmFtZSA8PCAiICgiIDw8IGhleChWYWx1ZSkgPDwgIilcbiI7CisgICAgfSBlbHNlIHsKKyAgICAgIHN0YXJ0TGluZSgpIDw8IExhYmVsIDw8ICI6ICIgPDwgaGV4KFZhbHVlKSA8PCAiXG4iOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBURmxhZz4KKyAgdm9pZCBwcmludEZsYWdzKFN0cmluZ1JlZiBMYWJlbCwgVCBWYWx1ZSwgQXJyYXlSZWY8RW51bUVudHJ5PFRGbGFnPj4gRmxhZ3MsCisgICAgICAgICAgICAgICAgICBURmxhZyBFbnVtTWFzazEgPSB7fSwgVEZsYWcgRW51bU1hc2syID0ge30sCisgICAgICAgICAgICAgICAgICBURmxhZyBFbnVtTWFzazMgPSB7fSkgeworICAgIHR5cGVkZWYgRW51bUVudHJ5PFRGbGFnPiBGbGFnRW50cnk7CisgICAgdHlwZWRlZiBTbWFsbFZlY3RvcjxGbGFnRW50cnksIDEwPiBGbGFnVmVjdG9yOworICAgIEZsYWdWZWN0b3IgU2V0RmxhZ3M7CisKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkZsYWcgOiBGbGFncykgeworICAgICAgaWYgKEZsYWcuVmFsdWUgPT0gMCkKKyAgICAgICAgY29udGludWU7CisKKyAgICAgIFRGbGFnIEVudW1NYXNre307CisgICAgICBpZiAoRmxhZy5WYWx1ZSAmIEVudW1NYXNrMSkKKyAgICAgICAgRW51bU1hc2sgPSBFbnVtTWFzazE7CisgICAgICBlbHNlIGlmIChGbGFnLlZhbHVlICYgRW51bU1hc2syKQorICAgICAgICBFbnVtTWFzayA9IEVudW1NYXNrMjsKKyAgICAgIGVsc2UgaWYgKEZsYWcuVmFsdWUgJiBFbnVtTWFzazMpCisgICAgICAgIEVudW1NYXNrID0gRW51bU1hc2szOworICAgICAgYm9vbCBJc0VudW0gPSAoRmxhZy5WYWx1ZSAmIEVudW1NYXNrKSAhPSAwOworICAgICAgaWYgKCghSXNFbnVtICYmIChWYWx1ZSAmIEZsYWcuVmFsdWUpID09IEZsYWcuVmFsdWUpIHx8CisgICAgICAgICAgKElzRW51bSAmJiAoVmFsdWUgJiBFbnVtTWFzaykgPT0gRmxhZy5WYWx1ZSkpIHsKKyAgICAgICAgU2V0RmxhZ3MucHVzaF9iYWNrKEZsYWcpOworICAgICAgfQorICAgIH0KKworICAgIHN0ZDo6c29ydChTZXRGbGFncy5iZWdpbigpLCBTZXRGbGFncy5lbmQoKSwgJmZsYWdOYW1lPFRGbGFnPik7CisKKyAgICBzdGFydExpbmUoKSA8PCBMYWJlbCA8PCAiIFsgKCIgPDwgaGV4KFZhbHVlKSA8PCAiKVxuIjsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJkZsYWcgOiBTZXRGbGFncykgeworICAgICAgc3RhcnRMaW5lKCkgPDwgIiAgIiA8PCBGbGFnLk5hbWUgPDwgIiAoIiA8PCBoZXgoRmxhZy5WYWx1ZSkgPDwgIilcbiI7CisgICAgfQorICAgIHN0YXJ0TGluZSgpIDw8ICJdXG4iOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgcHJpbnRGbGFncyhTdHJpbmdSZWYgTGFiZWwsIFQgVmFsdWUpIHsKKyAgICBzdGFydExpbmUoKSA8PCBMYWJlbCA8PCAiIFsgKCIgPDwgaGV4KFZhbHVlKSA8PCAiKVxuIjsKKyAgICB1aW50NjRfdCBGbGFnID0gMTsKKyAgICB1aW50NjRfdCBDdXJyID0gVmFsdWU7CisgICAgd2hpbGUgKEN1cnIgPiAwKSB7CisgICAgICBpZiAoQ3VyciAmIDEpCisgICAgICAgIHN0YXJ0TGluZSgpIDw8ICIgICIgPDwgaGV4KEZsYWcpIDw8ICJcbiI7CisgICAgICBDdXJyID4+PSAxOworICAgICAgRmxhZyA8PD0gMTsKKyAgICB9CisgICAgc3RhcnRMaW5lKCkgPDwgIl1cbiI7CisgIH0KKworICB2b2lkIHByaW50TnVtYmVyKFN0cmluZ1JlZiBMYWJlbCwgdWludDY0X3QgVmFsdWUpIHsKKyAgICBzdGFydExpbmUoKSA8PCBMYWJlbCA8PCAiOiAiIDw8IFZhbHVlIDw8ICJcbiI7CisgIH0KKworICB2b2lkIHByaW50TnVtYmVyKFN0cmluZ1JlZiBMYWJlbCwgdWludDMyX3QgVmFsdWUpIHsKKyAgICBzdGFydExpbmUoKSA8PCBMYWJlbCA8PCAiOiAiIDw8IFZhbHVlIDw8ICJcbiI7CisgIH0KKworICB2b2lkIHByaW50TnVtYmVyKFN0cmluZ1JlZiBMYWJlbCwgdWludDE2X3QgVmFsdWUpIHsKKyAgICBzdGFydExpbmUoKSA8PCBMYWJlbCA8PCAiOiAiIDw8IFZhbHVlIDw8ICJcbiI7CisgIH0KKworICB2b2lkIHByaW50TnVtYmVyKFN0cmluZ1JlZiBMYWJlbCwgdWludDhfdCBWYWx1ZSkgeworICAgIHN0YXJ0TGluZSgpIDw8IExhYmVsIDw8ICI6ICIgPDwgdW5zaWduZWQoVmFsdWUpIDw8ICJcbiI7CisgIH0KKworICB2b2lkIHByaW50TnVtYmVyKFN0cmluZ1JlZiBMYWJlbCwgaW50NjRfdCBWYWx1ZSkgeworICAgIHN0YXJ0TGluZSgpIDw8IExhYmVsIDw8ICI6ICIgPDwgVmFsdWUgPDwgIlxuIjsKKyAgfQorCisgIHZvaWQgcHJpbnROdW1iZXIoU3RyaW5nUmVmIExhYmVsLCBpbnQzMl90IFZhbHVlKSB7CisgICAgc3RhcnRMaW5lKCkgPDwgTGFiZWwgPDwgIjogIiA8PCBWYWx1ZSA8PCAiXG4iOworICB9CisKKyAgdm9pZCBwcmludE51bWJlcihTdHJpbmdSZWYgTGFiZWwsIGludDE2X3QgVmFsdWUpIHsKKyAgICBzdGFydExpbmUoKSA8PCBMYWJlbCA8PCAiOiAiIDw8IFZhbHVlIDw8ICJcbiI7CisgIH0KKworICB2b2lkIHByaW50TnVtYmVyKFN0cmluZ1JlZiBMYWJlbCwgaW50OF90IFZhbHVlKSB7CisgICAgc3RhcnRMaW5lKCkgPDwgTGFiZWwgPDwgIjogIiA8PCBpbnQoVmFsdWUpIDw8ICJcbiI7CisgIH0KKworICB2b2lkIHByaW50TnVtYmVyKFN0cmluZ1JlZiBMYWJlbCwgY29uc3QgQVBTSW50ICZWYWx1ZSkgeworICAgIHN0YXJ0TGluZSgpIDw8IExhYmVsIDw8ICI6ICIgPDwgVmFsdWUgPDwgIlxuIjsKKyAgfQorCisgIHZvaWQgcHJpbnRCb29sZWFuKFN0cmluZ1JlZiBMYWJlbCwgYm9vbCBWYWx1ZSkgeworICAgIHN0YXJ0TGluZSgpIDw8IExhYmVsIDw8ICI6ICIgPDwgKFZhbHVlID8gIlllcyIgOiAiTm8iKSA8PCAnXG4nOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFQ+IHZvaWQgcHJpbnRWZXJzaW9uKFN0cmluZ1JlZiBMYWJlbCwgVC4uLiBWZXJzaW9uKSB7CisgICAgc3RhcnRMaW5lKCkgPDwgTGFiZWwgPDwgIjogIjsKKyAgICBwcmludFZlcnNpb25JbnRlcm5hbChWZXJzaW9uLi4uKTsKKyAgICBnZXRPU3RyZWFtKCkgPDwgIlxuIjsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHByaW50TGlzdChTdHJpbmdSZWYgTGFiZWwsIGNvbnN0IFQgJkxpc3QpIHsKKyAgICBzdGFydExpbmUoKSA8PCBMYWJlbCA8PCAiOiBbIjsKKyAgICBib29sIENvbW1hID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvICZJdGVtIDogTGlzdCkgeworICAgICAgaWYgKENvbW1hKQorICAgICAgICBPUyA8PCAiLCAiOworICAgICAgT1MgPDwgSXRlbTsKKyAgICAgIENvbW1hID0gdHJ1ZTsKKyAgICB9CisgICAgT1MgPDwgIl1cbiI7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KKyAgdm9pZCBwcmludExpc3QoU3RyaW5nUmVmIExhYmVsLCBjb25zdCBUICZMaXN0LCBjb25zdCBVICZQcmludGVyKSB7CisgICAgc3RhcnRMaW5lKCkgPDwgTGFiZWwgPDwgIjogWyI7CisgICAgYm9vbCBDb21tYSA9IGZhbHNlOworICAgIGZvciAoY29uc3QgYXV0byAmSXRlbSA6IExpc3QpIHsKKyAgICAgIGlmIChDb21tYSkKKyAgICAgICAgT1MgPDwgIiwgIjsKKyAgICAgIFByaW50ZXIoT1MsIEl0ZW0pOworICAgICAgQ29tbWEgPSB0cnVlOworICAgIH0KKyAgICBPUyA8PCAiXVxuIjsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHByaW50SGV4TGlzdChTdHJpbmdSZWYgTGFiZWwsIGNvbnN0IFQgJkxpc3QpIHsKKyAgICBzdGFydExpbmUoKSA8PCBMYWJlbCA8PCAiOiBbIjsKKyAgICBib29sIENvbW1hID0gZmFsc2U7CisgICAgZm9yIChjb25zdCBhdXRvICZJdGVtIDogTGlzdCkgeworICAgICAgaWYgKENvbW1hKQorICAgICAgICBPUyA8PCAiLCAiOworICAgICAgT1MgPDwgaGV4KEl0ZW0pOworICAgICAgQ29tbWEgPSB0cnVlOworICAgIH0KKyAgICBPUyA8PCAiXVxuIjsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHByaW50SGV4KFN0cmluZ1JlZiBMYWJlbCwgVCBWYWx1ZSkgeworICAgIHN0YXJ0TGluZSgpIDw8IExhYmVsIDw8ICI6ICIgPDwgaGV4KFZhbHVlKSA8PCAiXG4iOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgcHJpbnRIZXgoU3RyaW5nUmVmIExhYmVsLCBTdHJpbmdSZWYgU3RyLCBUIFZhbHVlKSB7CisgICAgc3RhcnRMaW5lKCkgPDwgTGFiZWwgPDwgIjogIiA8PCBTdHIgPDwgIiAoIiA8PCBoZXgoVmFsdWUpIDw8ICIpXG4iOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgcHJpbnRTeW1ib2xPZmZzZXQoU3RyaW5nUmVmIExhYmVsLCBTdHJpbmdSZWYgU3ltYm9sLCBUIFZhbHVlKSB7CisgICAgc3RhcnRMaW5lKCkgPDwgTGFiZWwgPDwgIjogIiA8PCBTeW1ib2wgPDwgJysnIDw8IGhleChWYWx1ZSkgPDwgJ1xuJzsKKyAgfQorCisgIHZvaWQgcHJpbnRTdHJpbmcoU3RyaW5nUmVmIFZhbHVlKSB7IHN0YXJ0TGluZSgpIDw8IFZhbHVlIDw8ICJcbiI7IH0KKworICB2b2lkIHByaW50U3RyaW5nKFN0cmluZ1JlZiBMYWJlbCwgU3RyaW5nUmVmIFZhbHVlKSB7CisgICAgc3RhcnRMaW5lKCkgPDwgTGFiZWwgPDwgIjogIiA8PCBWYWx1ZSA8PCAiXG4iOworICB9CisKKyAgdm9pZCBwcmludFN0cmluZyhTdHJpbmdSZWYgTGFiZWwsIGNvbnN0IHN0ZDo6c3RyaW5nICZWYWx1ZSkgeworICAgIHByaW50U3RyaW5nKExhYmVsLCBTdHJpbmdSZWYoVmFsdWUpKTsKKyAgfQorCisgIHZvaWQgcHJpbnRTdHJpbmcoU3RyaW5nUmVmIExhYmVsLCBjb25zdCBjaGFyKiBWYWx1ZSkgeworICAgIHByaW50U3RyaW5nKExhYmVsLCBTdHJpbmdSZWYoVmFsdWUpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIHByaW50TnVtYmVyKFN0cmluZ1JlZiBMYWJlbCwgU3RyaW5nUmVmIFN0ciwgVCBWYWx1ZSkgeworICAgIHN0YXJ0TGluZSgpIDw8IExhYmVsIDw8ICI6ICIgPDwgU3RyIDw8ICIgKCIgPDwgVmFsdWUgPDwgIilcbiI7CisgIH0KKworICB2b2lkIHByaW50QmluYXJ5KFN0cmluZ1JlZiBMYWJlbCwgU3RyaW5nUmVmIFN0ciwgQXJyYXlSZWY8dWludDhfdD4gVmFsdWUpIHsKKyAgICBwcmludEJpbmFyeUltcGwoTGFiZWwsIFN0ciwgVmFsdWUsIGZhbHNlKTsKKyAgfQorCisgIHZvaWQgcHJpbnRCaW5hcnkoU3RyaW5nUmVmIExhYmVsLCBTdHJpbmdSZWYgU3RyLCBBcnJheVJlZjxjaGFyPiBWYWx1ZSkgeworICAgIGF1dG8gViA9IG1ha2VBcnJheVJlZihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oVmFsdWUuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUuc2l6ZSgpKTsKKyAgICBwcmludEJpbmFyeUltcGwoTGFiZWwsIFN0ciwgViwgZmFsc2UpOworICB9CisKKyAgdm9pZCBwcmludEJpbmFyeShTdHJpbmdSZWYgTGFiZWwsIEFycmF5UmVmPHVpbnQ4X3Q+IFZhbHVlKSB7CisgICAgcHJpbnRCaW5hcnlJbXBsKExhYmVsLCBTdHJpbmdSZWYoKSwgVmFsdWUsIGZhbHNlKTsKKyAgfQorCisgIHZvaWQgcHJpbnRCaW5hcnkoU3RyaW5nUmVmIExhYmVsLCBBcnJheVJlZjxjaGFyPiBWYWx1ZSkgeworICAgIGF1dG8gViA9IG1ha2VBcnJheVJlZihyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4X3QgKj4oVmFsdWUuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUuc2l6ZSgpKTsKKyAgICBwcmludEJpbmFyeUltcGwoTGFiZWwsIFN0cmluZ1JlZigpLCBWLCBmYWxzZSk7CisgIH0KKworICB2b2lkIHByaW50QmluYXJ5KFN0cmluZ1JlZiBMYWJlbCwgU3RyaW5nUmVmIFZhbHVlKSB7CisgICAgYXV0byBWID0gbWFrZUFycmF5UmVmKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDhfdCAqPihWYWx1ZS5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZS5zaXplKCkpOworICAgIHByaW50QmluYXJ5SW1wbChMYWJlbCwgU3RyaW5nUmVmKCksIFYsIGZhbHNlKTsKKyAgfQorCisgIHZvaWQgcHJpbnRCaW5hcnlCbG9jayhTdHJpbmdSZWYgTGFiZWwsIEFycmF5UmVmPHVpbnQ4X3Q+IFZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgU3RhcnRPZmZzZXQpIHsKKyAgICBwcmludEJpbmFyeUltcGwoTGFiZWwsIFN0cmluZ1JlZigpLCBWYWx1ZSwgdHJ1ZSwgU3RhcnRPZmZzZXQpOworICB9CisKKyAgdm9pZCBwcmludEJpbmFyeUJsb2NrKFN0cmluZ1JlZiBMYWJlbCwgQXJyYXlSZWY8dWludDhfdD4gVmFsdWUpIHsKKyAgICBwcmludEJpbmFyeUltcGwoTGFiZWwsIFN0cmluZ1JlZigpLCBWYWx1ZSwgdHJ1ZSk7CisgIH0KKworICB2b2lkIHByaW50QmluYXJ5QmxvY2soU3RyaW5nUmVmIExhYmVsLCBTdHJpbmdSZWYgVmFsdWUpIHsKKyAgICBhdXRvIFYgPSBtYWtlQXJyYXlSZWYocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90ICo+KFZhbHVlLmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlLnNpemUoKSk7CisgICAgcHJpbnRCaW5hcnlJbXBsKExhYmVsLCBTdHJpbmdSZWYoKSwgViwgdHJ1ZSk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBwcmludE9iamVjdChTdHJpbmdSZWYgTGFiZWwsIGNvbnN0IFQgJlZhbHVlKSB7CisgICAgc3RhcnRMaW5lKCkgPDwgTGFiZWwgPDwgIjogIiA8PCBWYWx1ZSA8PCAiXG4iOworICB9CisKKyAgcmF3X29zdHJlYW0gJnN0YXJ0TGluZSgpIHsKKyAgICBwcmludEluZGVudCgpOworICAgIHJldHVybiBPUzsKKyAgfQorCisgIHJhd19vc3RyZWFtICZnZXRPU3RyZWFtKCkgeyByZXR1cm4gT1M7IH0KKworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgcHJpbnRWZXJzaW9uSW50ZXJuYWwoVCBWYWx1ZSkgeworICAgIGdldE9TdHJlYW0oKSA8PCBWYWx1ZTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTLCB0eXBlbmFtZSBULCB0eXBlbmFtZS4uLiBUQXJncz4KKyAgdm9pZCBwcmludFZlcnNpb25JbnRlcm5hbChTIFZhbHVlLCBUIFZhbHVlMiwgVEFyZ3MuLi4gQXJncykgeworICAgIGdldE9TdHJlYW0oKSA8PCBWYWx1ZSA8PCAiLiI7CisgICAgcHJpbnRWZXJzaW9uSW50ZXJuYWwoVmFsdWUyLCBBcmdzLi4uKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgYm9vbCBmbGFnTmFtZShjb25zdCBFbnVtRW50cnk8VD4gJmxocywgY29uc3QgRW51bUVudHJ5PFQ+ICZyaHMpIHsKKyAgICByZXR1cm4gbGhzLk5hbWUgPCByaHMuTmFtZTsKKyAgfQorCisgIHZvaWQgcHJpbnRCaW5hcnlJbXBsKFN0cmluZ1JlZiBMYWJlbCwgU3RyaW5nUmVmIFN0ciwgQXJyYXlSZWY8dWludDhfdD4gVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQmxvY2ssIHVpbnQzMl90IFN0YXJ0T2Zmc2V0ID0gMCk7CisKKyAgcmF3X29zdHJlYW0gJk9TOworICBpbnQgSW5kZW50TGV2ZWw7CisgIFN0cmluZ1JlZiBQcmVmaXg7Cit9OworCit0ZW1wbGF0ZSA8PgoraW5saW5lIHZvaWQKK1Njb3BlZFByaW50ZXI6OnByaW50SGV4PHN1cHBvcnQ6OnVsaXR0bGUxNl90PihTdHJpbmdSZWYgTGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgVmFsdWUpIHsKKyAgc3RhcnRMaW5lKCkgPDwgTGFiZWwgPDwgIjogIiA8PCBoZXgoVmFsdWUpIDw8ICJcbiI7Cit9CisKK3RlbXBsYXRlPGNoYXIgT3BlbiwgY2hhciBDbG9zZT4KK3N0cnVjdCBEZWxpbWl0ZWRTY29wZSB7CisgIGV4cGxpY2l0IERlbGltaXRlZFNjb3BlKFNjb3BlZFByaW50ZXIgJlcpIDogVyhXKSB7CisgICAgVy5zdGFydExpbmUoKSA8PCBPcGVuIDw8ICdcbic7CisgICAgVy5pbmRlbnQoKTsKKyAgfQorCisgIERlbGltaXRlZFNjb3BlKFNjb3BlZFByaW50ZXIgJlcsIFN0cmluZ1JlZiBOKSA6IFcoVykgeworICAgIFcuc3RhcnRMaW5lKCkgPDwgTjsKKyAgICBpZiAoIU4uZW1wdHkoKSkKKyAgICAgIFcuZ2V0T1N0cmVhbSgpIDw8ICcgJzsKKyAgICBXLmdldE9TdHJlYW0oKSA8PCBPcGVuIDw8ICdcbic7CisgICAgVy5pbmRlbnQoKTsKKyAgfQorCisgIH5EZWxpbWl0ZWRTY29wZSgpIHsKKyAgICBXLnVuaW5kZW50KCk7CisgICAgVy5zdGFydExpbmUoKSA8PCBDbG9zZSA8PCAnXG4nOworICB9CisKKyAgU2NvcGVkUHJpbnRlciAmVzsKK307CisKK3VzaW5nIERpY3RTY29wZSA9IERlbGltaXRlZFNjb3BlPCd7JywgJ30nPjsKK3VzaW5nIExpc3RTY29wZSA9IERlbGltaXRlZFNjb3BlPCdbJywgJ10nPjsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9TaWduYWxzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU2lnbmFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlYzVmNTgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU2lnbmFscy5oCkBAIC0wLDAgKzEsNzcgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvU2lnbmFscy5oIC0gU2lnbmFsIEhhbmRsaW5nIHN1cHBvcnQgLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHNvbWUgaGVscGZ1bCBmdW5jdGlvbnMgZm9yIGRlYWxpbmcgd2l0aCB0aGUgcG9zc2liaWxpdHkgb2YKKy8vIHVuaXggc2lnbmFscyBvY2N1cnJpbmcgd2hpbGUgeW91ciBwcm9ncmFtIGlzIHJ1bm5pbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfU0lHTkFMU19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9TSUdOQUxTX0gKKworI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgU3RyaW5nUmVmOworY2xhc3MgcmF3X29zdHJlYW07CisKK25hbWVzcGFjZSBzeXMgeworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJ1bnMgYWxsIHRoZSByZWdpc3RlcmVkIGludGVycnVwdCBoYW5kbGVycywgaW5jbHVkaW5nIHRoZQorICAvLy8gcmVtb3ZhbCBvZiBmaWxlcyByZWdpc3RlcmVkIGJ5IFJlbW92ZUZpbGVPblNpZ25hbC4KKyAgdm9pZCBSdW5JbnRlcnJ1cHRIYW5kbGVycygpOworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyBzaWduYWwgaGFuZGxlcnMgdG8gZW5zdXJlIHRoYXQgaWYgYSBzaWduYWwgZ2V0cworICAvLy8gZGVsaXZlcmVkIHRoYXQgdGhlIG5hbWVkIGZpbGUgaXMgcmVtb3ZlZC4KKyAgLy8vIEBicmllZiBSZW1vdmUgYSBmaWxlIGlmIGEgZmF0YWwgc2lnbmFsIG9jY3Vycy4KKyAgYm9vbCBSZW1vdmVGaWxlT25TaWduYWwoU3RyaW5nUmVmIEZpbGVuYW1lLCBzdGQ6OnN0cmluZyogRXJyTXNnID0gbnVsbHB0cik7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyBhIGZpbGUgZnJvbSB0aGUgbGlzdCBvZiBmaWxlcyB0byBiZSByZW1vdmVkIG9uCisgIC8vLyBzaWduYWwgZGVsaXZlcnkuCisgIHZvaWQgRG9udFJlbW92ZUZpbGVPblNpZ25hbChTdHJpbmdSZWYgRmlsZW5hbWUpOworCisgIC8vLyBXaGVuIGFuIGVycm9yIHNpZ25hbCAoc3VjaCBhcyBTSUdBQlJUIG9yIFNJR1NFR1YpIGlzIGRlbGl2ZXJlZCB0byB0aGUKKyAgLy8vIHByb2Nlc3MsIHByaW50IGEgc3RhY2sgdHJhY2UgYW5kIHRoZW4gZXhpdC4KKyAgLy8vIFxicmllZiBQcmludCBhIHN0YWNrIHRyYWNlIGlmIGEgZmF0YWwgc2lnbmFsIG9jY3Vycy4KKyAgLy8vIFxwYXJhbSBBcmd2MCB0aGUgY3VycmVudCBiaW5hcnkgbmFtZSwgdXNlZCB0byBmaW5kIHRoZSBzeW1ib2xpemVyCisgIC8vLyAgICAgICAgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgYmluYXJ5IGJlZm9yZSBzZWFyY2hpbmcgJFBBVEg7IGNhbiBiZQorICAvLy8gICAgICAgIFN0cmluZ1JlZigpLCBpbiB3aGljaCBjYXNlIHdlIHdpbGwgb25seSBzZWFyY2ggJFBBVEguCisgIC8vLyBccGFyYW0gRGlzYWJsZUNyYXNoUmVwb3J0aW5nIGlmIFxjIHRydWUsIGRpc2FibGUgdGhlIG5vcm1hbCBjcmFzaAorICAvLy8gICAgICAgIHJlcG9ydGluZyBtZWNoYW5pc21zIG9uIHRoZSB1bmRlcmx5aW5nIG9wZXJhdGluZyBzeXN0ZW0uCisgIHZvaWQgUHJpbnRTdGFja1RyYWNlT25FcnJvclNpZ25hbChTdHJpbmdSZWYgQXJndjAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIERpc2FibGVDcmFzaFJlcG9ydGluZyA9IGZhbHNlKTsKKworICAvLy8gRGlzYWJsZSBhbGwgc3lzdGVtIGRpYWxvZyBib3hlcyB0aGF0IGFwcGVhciB3aGVuIHRoZSBwcm9jZXNzIGNyYXNoZXMuCisgIHZvaWQgRGlzYWJsZVN5c3RlbURpYWxvZ3NPbkNyYXNoKCk7CisKKyAgLy8vIFxicmllZiBQcmludCB0aGUgc3RhY2sgdHJhY2UgdXNpbmcgdGhlIGdpdmVuIFxjIHJhd19vc3RyZWFtIG9iamVjdC4KKyAgdm9pZCBQcmludFN0YWNrVHJhY2UocmF3X29zdHJlYW0gJk9TKTsKKworICAvLyBSdW4gYWxsIHJlZ2lzdGVyZWQgc2lnbmFsIGhhbmRsZXJzLgorICB2b2lkIFJ1blNpZ25hbEhhbmRsZXJzKCk7CisKKyAgLy8vIEFkZFNpZ25hbEhhbmRsZXIgLSBBZGQgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBhbiBhYm9ydC9raWxsIHNpZ25hbAorICAvLy8gaXMgZGVsaXZlcmVkIHRvIHRoZSBwcm9jZXNzLiAgVGhlIGhhbmRsZXIgY2FuIGhhdmUgYSBjb29raWUgcGFzc2VkIHRvIGl0CisgIC8vLyB0byBpZGVudGlmeSB3aGF0IGluc3RhbmNlIG9mIHRoZSBoYW5kbGVyIGl0IGlzLgorICB2b2lkIEFkZFNpZ25hbEhhbmRsZXIodm9pZCAoKkZuUHRyKSh2b2lkICopLCB2b2lkICpDb29raWUpOworCisgIC8vLyBUaGlzIGZ1bmN0aW9uIHJlZ2lzdGVycyBhIGZ1bmN0aW9uIHRvIGJlIGNhbGxlZCB3aGVuIHRoZSB1c2VyICJpbnRlcnJ1cHRzIgorICAvLy8gdGhlIHByb2dyYW0gKHR5cGljYWxseSBieSBwcmVzc2luZyBjdHJsLWMpLiAgV2hlbiB0aGUgdXNlciBpbnRlcnJ1cHRzIHRoZQorICAvLy8gcHJvZ3JhbSwgdGhlIHNwZWNpZmllZCBpbnRlcnJ1cHQgZnVuY3Rpb24gaXMgY2FsbGVkIGluc3RlYWQgb2YgdGhlIHByb2dyYW0KKyAgLy8vIGJlaW5nIGtpbGxlZCwgYW5kIHRoZSBpbnRlcnJ1cHQgZnVuY3Rpb24gYXV0b21hdGljYWxseSBkaXNhYmxlZC4gIE5vdGUKKyAgLy8vIHRoYXQgaW50ZXJydXB0IGZ1bmN0aW9ucyBhcmUgbm90IGFsbG93ZWQgdG8gY2FsbCBhbnkgbm9uLXJlZW50cmFudAorICAvLy8gZnVuY3Rpb25zLiAgQW4gbnVsbCBpbnRlcnJ1cHQgZnVuY3Rpb24gcG9pbnRlciBkaXNhYmxlcyB0aGUgY3VycmVudAorICAvLy8gaW5zdGFsbGVkIGZ1bmN0aW9uLiAgTm90ZSBhbHNvIHRoYXQgdGhlIGhhbmRsZXIgbWF5IGJlIGV4ZWN1dGVkIG9uIGEKKyAgLy8vIGRpZmZlcmVudCB0aHJlYWQgb24gc29tZSBwbGF0Zm9ybXMuCisgIC8vLyBAYnJpZWYgUmVnaXN0ZXIgYSBmdW5jdGlvbiB0byBiZSBjYWxsZWQgd2hlbiBjdHJsLWMgaXMgcHJlc3NlZC4KKyAgdm9pZCBTZXRJbnRlcnJ1cHRGdW5jdGlvbih2b2lkICgqSUYpKCkpOworfSAvLyBFbmQgc3lzIG5hbWVzcGFjZQorfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU29sYXJpcy9zeXMvcmVnc2V0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU29sYXJpcy9zeXMvcmVnc2V0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2OWViZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Tb2xhcmlzL3N5cy9yZWdzZXQuaApAQCAtMCwwICsxLDM5IEBACisvKj09PS0gbGx2bS9TdXBwb3J0L1NvbGFyaXMvc3lzL3JlZ3NldC5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0qCisgKgorICogICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorICoKKyAqIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorICogTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSoKKyAqCisgKiBUaGlzIGZpbGUgd29ya3MgYXJvdW5kIGV4Y2Vzc2l2ZSBuYW1lIHNwYWNlIHBvbGx1dGlvbiBmcm9tIHRoZSBzeXN0ZW0gaGVhZGVyCisgKiBvbiBTb2xhcmlzIGhvc3RzLgorICoKKyAqPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PSovCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1NPTEFSSVNfU1lTX1JFR1NFVF9ICisKKyNpbmNsdWRlX25leHQgPHN5cy9yZWdzZXQuaD4KKworI3VuZGVmIENTCisjdW5kZWYgRFMKKyN1bmRlZiBFUworI3VuZGVmIEZTCisjdW5kZWYgR1MKKyN1bmRlZiBTUworI3VuZGVmIEVBWAorI3VuZGVmIEVDWAorI3VuZGVmIEVEWAorI3VuZGVmIEVCWAorI3VuZGVmIEVTUAorI3VuZGVmIEVCUAorI3VuZGVmIEVTSQorI3VuZGVmIEVESQorI3VuZGVmIEVJUAorI3VuZGVmIFVFU1AKKyN1bmRlZiBFRkwKKyN1bmRlZiBFUlIKKyN1bmRlZiBUUkFQTk8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU291cmNlTWdyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU291cmNlTWdyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA4YmY4NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Tb3VyY2VNZ3IuaApAQCAtMCwwICsxLDI4MiBAQAorLy89PT0tIFNvdXJjZU1nci5oIC0gTWFuYWdlciBmb3IgU291cmNlIEJ1ZmZlcnMgJiBEaWFnbm9zdGljcyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFNNRGlhZ25vc3RpYyBhbmQgU291cmNlTWdyIGNsYXNzZXMuICBUaGlzCisvLyBwcm92aWRlcyBhIHNpbXBsZSBzdWJzdHJhdGUgZm9yIGRpYWdub3N0aWNzLCAjaW5jbHVkZSBoYW5kbGluZywgYW5kIG90aGVyIGxvdworLy8gbGV2ZWwgdGhpbmdzIGZvciBzaW1wbGUgcGFyc2Vycy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9TT1VSQ0VNR1JfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfU09VUkNFTUdSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTm9uZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHdpbmUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTWVtb3J5QnVmZmVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1NNTG9jLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIFNNRGlhZ25vc3RpYzsKK2NsYXNzIFNNRml4SXQ7CisKKy8vLyBUaGlzIG93bnMgdGhlIGZpbGVzIHJlYWQgYnkgYSBwYXJzZXIsIGhhbmRsZXMgaW5jbHVkZSBzdGFja3MsCisvLy8gYW5kIGhhbmRsZXMgZGlhZ25vc3RpYyB3cmFuZ2xpbmcuCitjbGFzcyBTb3VyY2VNZ3IgeworcHVibGljOgorICBlbnVtIERpYWdLaW5kIHsKKyAgICBES19FcnJvciwKKyAgICBES19XYXJuaW5nLAorICAgIERLX1JlbWFyaywKKyAgICBES19Ob3RlLAorICB9OworCisgIC8vLyBDbGllbnRzIHRoYXQgd2FudCB0byBoYW5kbGUgdGhlaXIgb3duIGRpYWdub3N0aWNzIGluIGEgY3VzdG9tIHdheSBjYW4KKyAgLy8vIHJlZ2lzdGVyIGEgZnVuY3Rpb24gcG9pbnRlcitjb250ZXh0IGFzIGEgZGlhZ25vc3RpYyBoYW5kbGVyLgorICAvLy8gSXQgZ2V0cyBjYWxsZWQgZWFjaCB0aW1lIFByaW50TWVzc2FnZSBpcyBpbnZva2VkLgorICB1c2luZyBEaWFnSGFuZGxlclR5ID0gdm9pZCAoKikoY29uc3QgU01EaWFnbm9zdGljICYsIHZvaWQgKkNvbnRleHQpOworCitwcml2YXRlOgorICBzdHJ1Y3QgU3JjQnVmZmVyIHsKKyAgICAvLy8gVGhlIG1lbW9yeSBidWZmZXIgZm9yIHRoZSBmaWxlLgorICAgIHN0ZDo6dW5pcXVlX3B0cjxNZW1vcnlCdWZmZXI+IEJ1ZmZlcjsKKworICAgIC8vLyBUaGlzIGlzIHRoZSBsb2NhdGlvbiBvZiB0aGUgcGFyZW50IGluY2x1ZGUsIG9yIG51bGwgaWYgYXQgdGhlIHRvcCBsZXZlbC4KKyAgICBTTUxvYyBJbmNsdWRlTG9jOworICB9OworCisgIC8vLyBUaGlzIGlzIGFsbCBvZiB0aGUgYnVmZmVycyB0aGF0IHdlIGFyZSByZWFkaW5nIGZyb20uCisgIHN0ZDo6dmVjdG9yPFNyY0J1ZmZlcj4gQnVmZmVyczsKKworICAvLyBUaGlzIGlzIHRoZSBsaXN0IG9mIGRpcmVjdG9yaWVzIHdlIHNob3VsZCBzZWFyY2ggZm9yIGluY2x1ZGUgZmlsZXMgaW4uCisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBJbmNsdWRlRGlyZWN0b3JpZXM7CisKKyAgLy8vIFRoaXMgaXMgYSBjYWNoZSBmb3IgbGluZSBudW1iZXIgcXVlcmllcywgaXRzIGltcGxlbWVudGF0aW9uIGlzIHJlYWxseQorICAvLy8gcHJpdmF0ZSB0byBTb3VyY2VNZ3IuY3BwLgorICBtdXRhYmxlIHZvaWQgKkxpbmVOb0NhY2hlID0gbnVsbHB0cjsKKworICBEaWFnSGFuZGxlclR5IERpYWdIYW5kbGVyID0gbnVsbHB0cjsKKyAgdm9pZCAqRGlhZ0NvbnRleHQgPSBudWxscHRyOworCisgIGJvb2wgaXNWYWxpZEJ1ZmZlcklEKHVuc2lnbmVkIGkpIGNvbnN0IHsgcmV0dXJuIGkgJiYgaSA8PSBCdWZmZXJzLnNpemUoKTsgfQorCitwdWJsaWM6CisgIFNvdXJjZU1ncigpID0gZGVmYXVsdDsKKyAgU291cmNlTWdyKGNvbnN0IFNvdXJjZU1nciAmKSA9IGRlbGV0ZTsKKyAgU291cmNlTWdyICZvcGVyYXRvcj0oY29uc3QgU291cmNlTWdyICYpID0gZGVsZXRlOworICB+U291cmNlTWdyKCk7CisKKyAgdm9pZCBzZXRJbmNsdWRlRGlycyhjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJkRpcnMpIHsKKyAgICBJbmNsdWRlRGlyZWN0b3JpZXMgPSBEaXJzOworICB9CisKKyAgLy8vIFNwZWNpZnkgYSBkaWFnbm9zdGljIGhhbmRsZXIgdG8gYmUgaW52b2tlZCBldmVyeSB0aW1lIFByaW50TWVzc2FnZSBpcworICAvLy8gY2FsbGVkLiBccCBDdHggaXMgcGFzc2VkIGludG8gdGhlIGhhbmRsZXIgd2hlbiBpdCBpcyBpbnZva2VkLgorICB2b2lkIHNldERpYWdIYW5kbGVyKERpYWdIYW5kbGVyVHkgREgsIHZvaWQgKkN0eCA9IG51bGxwdHIpIHsKKyAgICBEaWFnSGFuZGxlciA9IERIOworICAgIERpYWdDb250ZXh0ID0gQ3R4OworICB9CisKKyAgRGlhZ0hhbmRsZXJUeSBnZXREaWFnSGFuZGxlcigpIGNvbnN0IHsgcmV0dXJuIERpYWdIYW5kbGVyOyB9CisgIHZvaWQgKmdldERpYWdDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gRGlhZ0NvbnRleHQ7IH0KKworICBjb25zdCBTcmNCdWZmZXIgJmdldEJ1ZmZlckluZm8odW5zaWduZWQgaSkgY29uc3QgeworICAgIGFzc2VydChpc1ZhbGlkQnVmZmVySUQoaSkpOworICAgIHJldHVybiBCdWZmZXJzW2kgLSAxXTsKKyAgfQorCisgIGNvbnN0IE1lbW9yeUJ1ZmZlciAqZ2V0TWVtb3J5QnVmZmVyKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaXNWYWxpZEJ1ZmZlcklEKGkpKTsKKyAgICByZXR1cm4gQnVmZmVyc1tpIC0gMV0uQnVmZmVyLmdldCgpOworICB9CisKKyAgdW5zaWduZWQgZ2V0TnVtQnVmZmVycygpIGNvbnN0IHsKKyAgICByZXR1cm4gQnVmZmVycy5zaXplKCk7CisgIH0KKworICB1bnNpZ25lZCBnZXRNYWluRmlsZUlEKCkgY29uc3QgeworICAgIGFzc2VydChnZXROdW1CdWZmZXJzKCkpOworICAgIHJldHVybiAxOworICB9CisKKyAgU01Mb2MgZ2V0UGFyZW50SW5jbHVkZUxvYyh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGlzVmFsaWRCdWZmZXJJRChpKSk7CisgICAgcmV0dXJuIEJ1ZmZlcnNbaSAtIDFdLkluY2x1ZGVMb2M7CisgIH0KKworICAvLy8gQWRkIGEgbmV3IHNvdXJjZSBidWZmZXIgdG8gdGhpcyBzb3VyY2UgbWFuYWdlci4gVGhpcyB0YWtlcyBvd25lcnNoaXAgb2YKKyAgLy8vIHRoZSBtZW1vcnkgYnVmZmVyLgorICB1bnNpZ25lZCBBZGROZXdTb3VyY2VCdWZmZXIoc3RkOjp1bmlxdWVfcHRyPE1lbW9yeUJ1ZmZlcj4gRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNNTG9jIEluY2x1ZGVMb2MpIHsKKyAgICBTcmNCdWZmZXIgTkI7CisgICAgTkIuQnVmZmVyID0gc3RkOjptb3ZlKEYpOworICAgIE5CLkluY2x1ZGVMb2MgPSBJbmNsdWRlTG9jOworICAgIEJ1ZmZlcnMucHVzaF9iYWNrKHN0ZDo6bW92ZShOQikpOworICAgIHJldHVybiBCdWZmZXJzLnNpemUoKTsKKyAgfQorCisgIC8vLyBTZWFyY2ggZm9yIGEgZmlsZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSBpbiB0aGUgY3VycmVudCBkaXJlY3Rvcnkgb3IgaW4KKyAgLy8vIG9uZSBvZiB0aGUgSW5jbHVkZURpcnMuCisgIC8vLworICAvLy8gSWYgbm8gZmlsZSBpcyBmb3VuZCwgdGhpcyByZXR1cm5zIDAsIG90aGVyd2lzZSBpdCByZXR1cm5zIHRoZSBidWZmZXIgSUQKKyAgLy8vIG9mIHRoZSBzdGFja2VkIGZpbGUuIFRoZSBmdWxsIHBhdGggdG8gdGhlIGluY2x1ZGVkIGZpbGUgY2FuIGJlIGZvdW5kIGluCisgIC8vLyBccCBJbmNsdWRlZEZpbGUuCisgIHVuc2lnbmVkIEFkZEluY2x1ZGVGaWxlKGNvbnN0IHN0ZDo6c3RyaW5nICZGaWxlbmFtZSwgU01Mb2MgSW5jbHVkZUxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcgJkluY2x1ZGVkRmlsZSk7CisKKyAgLy8vIFJldHVybiB0aGUgSUQgb2YgdGhlIGJ1ZmZlciBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24uCisgIC8vLworICAvLy8gMCBpcyByZXR1cm5lZCBpZiB0aGUgYnVmZmVyIGlzIG5vdCBmb3VuZC4KKyAgdW5zaWduZWQgRmluZEJ1ZmZlckNvbnRhaW5pbmdMb2MoU01Mb2MgTG9jKSBjb25zdDsKKworICAvLy8gRmluZCB0aGUgbGluZSBudW1iZXIgZm9yIHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gaW4gdGhlIHNwZWNpZmllZCBmaWxlLgorICAvLy8gVGhpcyBpcyBub3QgYSBmYXN0IG1ldGhvZC4KKyAgdW5zaWduZWQgRmluZExpbmVOdW1iZXIoU01Mb2MgTG9jLCB1bnNpZ25lZCBCdWZmZXJJRCA9IDApIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TGluZUFuZENvbHVtbihMb2MsIEJ1ZmZlcklEKS5maXJzdDsKKyAgfQorCisgIC8vLyBGaW5kIHRoZSBsaW5lIGFuZCBjb2x1bW4gbnVtYmVyIGZvciB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIGluIHRoZQorICAvLy8gc3BlY2lmaWVkIGZpbGUuIFRoaXMgaXMgbm90IGEgZmFzdCBtZXRob2QuCisgIHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+IGdldExpbmVBbmRDb2x1bW4oU01Mb2MgTG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEJ1ZmZlcklEID0gMCkgY29uc3Q7CisKKyAgLy8vIEVtaXQgYSBtZXNzYWdlIGFib3V0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkIHN0cmluZy4KKyAgLy8vCisgIC8vLyBccGFyYW0gU2hvd0NvbG9ycyBEaXNwbGF5IGNvbG9yZWQgbWVzc2FnZXMgaWYgb3V0cHV0IGlzIGEgdGVybWluYWwgYW5kCisgIC8vLyB0aGUgZGVmYXVsdCBlcnJvciBoYW5kbGVyIGlzIHVzZWQuCisgIHZvaWQgUHJpbnRNZXNzYWdlKHJhd19vc3RyZWFtICZPUywgU01Mb2MgTG9jLCBEaWFnS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTXNnLAorICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTTVJhbmdlPiBSYW5nZXMgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTTUZpeEl0PiBGaXhJdHMgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICBib29sIFNob3dDb2xvcnMgPSB0cnVlKSBjb25zdDsKKworICAvLy8gRW1pdHMgYSBkaWFnbm9zdGljIHRvIGxsdm06OmVycnMoKS4KKyAgdm9pZCBQcmludE1lc3NhZ2UoU01Mb2MgTG9jLCBEaWFnS2luZCBLaW5kLCBjb25zdCBUd2luZSAmTXNnLAorICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTTVJhbmdlPiBSYW5nZXMgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTTUZpeEl0PiBGaXhJdHMgPSBOb25lLAorICAgICAgICAgICAgICAgICAgICBib29sIFNob3dDb2xvcnMgPSB0cnVlKSBjb25zdDsKKworICAvLy8gRW1pdHMgYSBtYW51YWxseS1jb25zdHJ1Y3RlZCBkaWFnbm9zdGljIHRvIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtLgorICAvLy8KKyAgLy8vIFxwYXJhbSBTaG93Q29sb3JzIERpc3BsYXkgY29sb3JlZCBtZXNzYWdlcyBpZiBvdXRwdXQgaXMgYSB0ZXJtaW5hbCBhbmQKKyAgLy8vIHRoZSBkZWZhdWx0IGVycm9yIGhhbmRsZXIgaXMgdXNlZC4KKyAgdm9pZCBQcmludE1lc3NhZ2UocmF3X29zdHJlYW0gJk9TLCBjb25zdCBTTURpYWdub3N0aWMgJkRpYWdub3N0aWMsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgU2hvd0NvbG9ycyA9IHRydWUpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gYW4gU01EaWFnbm9zdGljIGF0IHRoZSBzcGVjaWZpZWQgbG9jYXRpb24gd2l0aCB0aGUgc3BlY2lmaWVkCisgIC8vLyBzdHJpbmcuCisgIC8vLworICAvLy8gXHBhcmFtIE1zZyBJZiBub24tbnVsbCwgdGhlIGtpbmQgb2YgbWVzc2FnZSAoZS5nLiwgImVycm9yIikgd2hpY2ggaXMKKyAgLy8vIHByZWZpeGVkIHRvIHRoZSBtZXNzYWdlLgorICBTTURpYWdub3N0aWMgR2V0TWVzc2FnZShTTUxvYyBMb2MsIERpYWdLaW5kIEtpbmQsIGNvbnN0IFR3aW5lICZNc2csCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNNUmFuZ2U+IFJhbmdlcyA9IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFNNRml4SXQ+IEZpeEl0cyA9IE5vbmUpIGNvbnN0OworCisgIC8vLyBQcmludHMgdGhlIG5hbWVzIG9mIGluY2x1ZGVkIGZpbGVzIGFuZCB0aGUgbGluZSBvZiB0aGUgZmlsZSB0aGV5IHdlcmUKKyAgLy8vIGluY2x1ZGVkIGZyb20uIEEgZGlhZ25vc3RpYyBoYW5kbGVyIGNhbiB1c2UgdGhpcyBiZWZvcmUgcHJpbnRpbmcgaXRzCisgIC8vLyBjdXN0b20gZm9ybWF0dGVkIG1lc3NhZ2UuCisgIC8vLworICAvLy8gXHBhcmFtIEluY2x1ZGVMb2MgVGhlIGxvY2F0aW9uIG9mIHRoZSBpbmNsdWRlLgorICAvLy8gXHBhcmFtIE9TIHRoZSByYXdfb3N0cmVhbSB0byBwcmludCBvbi4KKyAgdm9pZCBQcmludEluY2x1ZGVTdGFjayhTTUxvYyBJbmNsdWRlTG9jLCByYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworfTsKKworLy8vIFJlcHJlc2VudHMgYSBzaW5nbGUgZml4aXQsIGEgcmVwbGFjZW1lbnQgb2Ygb25lIHJhbmdlIG9mIHRleHQgd2l0aCBhbm90aGVyLgorY2xhc3MgU01GaXhJdCB7CisgIFNNUmFuZ2UgUmFuZ2U7CisKKyAgc3RkOjpzdHJpbmcgVGV4dDsKKworcHVibGljOgorICAvLyBGSVhNRTogVHdpbmUuc3RyKCkgaXMgbm90IHZlcnkgZWZmaWNpZW50LgorICBTTUZpeEl0KFNNTG9jIExvYywgY29uc3QgVHdpbmUgJkluc2VydGlvbikKKyAgICA6IFJhbmdlKExvYywgTG9jKSwgVGV4dChJbnNlcnRpb24uc3RyKCkpIHsKKyAgICBhc3NlcnQoTG9jLmlzVmFsaWQoKSk7CisgIH0KKworICAvLyBGSVhNRTogVHdpbmUuc3RyKCkgaXMgbm90IHZlcnkgZWZmaWNpZW50LgorICBTTUZpeEl0KFNNUmFuZ2UgUiwgY29uc3QgVHdpbmUgJlJlcGxhY2VtZW50KQorICAgIDogUmFuZ2UoUiksIFRleHQoUmVwbGFjZW1lbnQuc3RyKCkpIHsKKyAgICBhc3NlcnQoUi5pc1ZhbGlkKCkpOworICB9CisKKyAgU3RyaW5nUmVmIGdldFRleHQoKSBjb25zdCB7IHJldHVybiBUZXh0OyB9CisgIFNNUmFuZ2UgZ2V0UmFuZ2UoKSBjb25zdCB7IHJldHVybiBSYW5nZTsgfQorCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFNNRml4SXQgJk90aGVyKSBjb25zdCB7CisgICAgaWYgKFJhbmdlLlN0YXJ0LmdldFBvaW50ZXIoKSAhPSBPdGhlci5SYW5nZS5TdGFydC5nZXRQb2ludGVyKCkpCisgICAgICByZXR1cm4gUmFuZ2UuU3RhcnQuZ2V0UG9pbnRlcigpIDwgT3RoZXIuUmFuZ2UuU3RhcnQuZ2V0UG9pbnRlcigpOworICAgIGlmIChSYW5nZS5FbmQuZ2V0UG9pbnRlcigpICE9IE90aGVyLlJhbmdlLkVuZC5nZXRQb2ludGVyKCkpCisgICAgICByZXR1cm4gUmFuZ2UuRW5kLmdldFBvaW50ZXIoKSA8IE90aGVyLlJhbmdlLkVuZC5nZXRQb2ludGVyKCk7CisgICAgcmV0dXJuIFRleHQgPCBPdGhlci5UZXh0OworICB9Cit9OworCisvLy8gSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgZW5jYXBzdWxhdGUgb25lIGRpYWdub3N0aWMgcmVwb3J0LCBhbGxvd2luZworLy8vIHByaW50aW5nIHRvIGEgcmF3X29zdHJlYW0gYXMgYSBjYXJldCBkaWFnbm9zdGljLgorY2xhc3MgU01EaWFnbm9zdGljIHsKKyAgY29uc3QgU291cmNlTWdyICpTTSA9IG51bGxwdHI7CisgIFNNTG9jIExvYzsKKyAgc3RkOjpzdHJpbmcgRmlsZW5hbWU7CisgIGludCBMaW5lTm8gPSAwOworICBpbnQgQ29sdW1uTm8gPSAwOworICBTb3VyY2VNZ3I6OkRpYWdLaW5kIEtpbmQgPSBTb3VyY2VNZ3I6OkRLX0Vycm9yOworICBzdGQ6OnN0cmluZyBNZXNzYWdlLCBMaW5lQ29udGVudHM7CisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjx1bnNpZ25lZCwgdW5zaWduZWQ+PiBSYW5nZXM7CisgIFNtYWxsVmVjdG9yPFNNRml4SXQsIDQ+IEZpeEl0czsKKworcHVibGljOgorICAvLyBOdWxsIGRpYWdub3N0aWMuCisgIFNNRGlhZ25vc3RpYygpID0gZGVmYXVsdDsKKyAgLy8gRGlhZ25vc3RpYyB3aXRoIG5vIGxvY2F0aW9uIChlLmcuIGZpbGUgbm90IGZvdW5kLCBjb21tYW5kIGxpbmUgYXJnIGVycm9yKS4KKyAgU01EaWFnbm9zdGljKFN0cmluZ1JlZiBmaWxlbmFtZSwgU291cmNlTWdyOjpEaWFnS2luZCBLbmQsIFN0cmluZ1JlZiBNc2cpCisgICAgOiBGaWxlbmFtZShmaWxlbmFtZSksIExpbmVObygtMSksIENvbHVtbk5vKC0xKSwgS2luZChLbmQpLCBNZXNzYWdlKE1zZykge30KKworICAvLyBEaWFnbm9zdGljIHdpdGggYSBsb2NhdGlvbi4KKyAgU01EaWFnbm9zdGljKGNvbnN0IFNvdXJjZU1nciAmc20sIFNNTG9jIEwsIFN0cmluZ1JlZiBGTiwKKyAgICAgICAgICAgICAgIGludCBMaW5lLCBpbnQgQ29sLCBTb3VyY2VNZ3I6OkRpYWdLaW5kIEtpbmQsCisgICAgICAgICAgICAgICBTdHJpbmdSZWYgTXNnLCBTdHJpbmdSZWYgTGluZVN0ciwKKyAgICAgICAgICAgICAgIEFycmF5UmVmPHN0ZDo6cGFpcjx1bnNpZ25lZCx1bnNpZ25lZD4+IFJhbmdlcywKKyAgICAgICAgICAgICAgIEFycmF5UmVmPFNNRml4SXQ+IEZpeEl0cyA9IE5vbmUpOworCisgIGNvbnN0IFNvdXJjZU1nciAqZ2V0U291cmNlTWdyKCkgY29uc3QgeyByZXR1cm4gU007IH0KKyAgU01Mb2MgZ2V0TG9jKCkgY29uc3QgeyByZXR1cm4gTG9jOyB9CisgIFN0cmluZ1JlZiBnZXRGaWxlbmFtZSgpIGNvbnN0IHsgcmV0dXJuIEZpbGVuYW1lOyB9CisgIGludCBnZXRMaW5lTm8oKSBjb25zdCB7IHJldHVybiBMaW5lTm87IH0KKyAgaW50IGdldENvbHVtbk5vKCkgY29uc3QgeyByZXR1cm4gQ29sdW1uTm87IH0KKyAgU291cmNlTWdyOjpEaWFnS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gS2luZDsgfQorICBTdHJpbmdSZWYgZ2V0TWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIE1lc3NhZ2U7IH0KKyAgU3RyaW5nUmVmIGdldExpbmVDb250ZW50cygpIGNvbnN0IHsgcmV0dXJuIExpbmVDb250ZW50czsgfQorICBBcnJheVJlZjxzdGQ6OnBhaXI8dW5zaWduZWQsIHVuc2lnbmVkPj4gZ2V0UmFuZ2VzKCkgY29uc3QgeyByZXR1cm4gUmFuZ2VzOyB9CisKKyAgdm9pZCBhZGRGaXhJdChjb25zdCBTTUZpeEl0ICZIaW50KSB7CisgICAgRml4SXRzLnB1c2hfYmFjayhIaW50KTsKKyAgfQorCisgIEFycmF5UmVmPFNNRml4SXQ+IGdldEZpeEl0cygpIGNvbnN0IHsKKyAgICByZXR1cm4gRml4SXRzOworICB9CisKKyAgdm9pZCBwcmludChjb25zdCBjaGFyICpQcm9nTmFtZSwgcmF3X29zdHJlYW0gJlMsIGJvb2wgU2hvd0NvbG9ycyA9IHRydWUsCisgICAgICAgICAgICAgYm9vbCBTaG93S2luZExhYmVsID0gdHJ1ZSkgY29uc3Q7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX1NPVVJDRU1HUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU3BlY2lhbENhc2VMaXN0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU3BlY2lhbENhc2VMaXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQ2MmZjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9TcGVjaWFsQ2FzZUxpc3QuaApAQCAtMCwwICsxLDE1NSBAQAorLy89PT0tLSBTcGVjaWFsQ2FzZUxpc3QuaCAtIHNwZWNpYWwgY2FzZSBsaXN0IGZvciBzYW5pdGl6ZXJzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaXMgYSB1dGlsaXR5IGNsYXNzIHVzZWQgdG8gcGFyc2UgdXNlci1wcm92aWRlZCB0ZXh0IGZpbGVzIHdpdGgKKy8vICJzcGVjaWFsIGNhc2UgbGlzdHMiIGZvciBjb2RlIHNhbml0aXplcnMuIFN1Y2ggZmlsZXMgYXJlIHVzZWQgdG8KKy8vIGRlZmluZSBhbiAiQUJJIGxpc3QiIGZvciBEYXRhRmxvd1Nhbml0aXplciBhbmQgYmxhY2tsaXN0cyBmb3Igc2FuaXRpemVycworLy8gbGlrZSBBZGRyZXNzU2FuaXRpemVyIG9yIFVuZGVmaW5lZEJlaGF2aW9yU2FuaXRpemVyLgorLy8KKy8vIEVtcHR5IGxpbmVzIGFuZCBsaW5lcyBzdGFydGluZyB3aXRoICIjIiBhcmUgaWdub3JlZC4gU2VjdGlvbnMgYXJlIGRlZmluZWQKKy8vIHVzaW5nIGEgJ1tzZWN0aW9uX25hbWVdJyBoZWFkZXIgYW5kIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgc2FuaXRpemVycyB0aGUKKy8vIGVudHJpZXMgYmVsb3cgaXQgYXBwbHkgdG8uIFNlY3Rpb24gbmFtZXMgYXJlIHJlZ3VsYXIgZXhwcmVzc2lvbnMsIGFuZAorLy8gZW50cmllcyB3aXRob3V0IGEgc2VjdGlvbiBoZWFkZXIgbWF0Y2ggYWxsIHNlY3Rpb25zIChlLmcuIGFuICdbKl0nIGhlYWRlcgorLy8gaXMgYXNzdW1lZC4pCisvLyBUaGUgcmVtYWluaW5nIGxpbmVzIHNob3VsZCBoYXZlIHRoZSBmb3JtOgorLy8gICBwcmVmaXg6d2lsZGNhcmRfZXhwcmVzc2lvbls9Y2F0ZWdvcnldCisvLyBJZiBjYXRlZ29yeSBpcyBub3Qgc3BlY2lmaWVkLCBpdCBpcyBhc3N1bWVkIHRvIGJlIGVtcHR5IHN0cmluZy4KKy8vIERlZmluaXRpb25zIG9mICJwcmVmaXgiIGFuZCAiY2F0ZWdvcnkiIGFyZSBzYW5pdGl6ZXItc3BlY2lmaWMuIEZvciBleGFtcGxlLAorLy8gc2FuaXRpemVyIGJsYWNrbGlzdHMgc3VwcG9ydCBwcmVmaXhlcyAic3JjIiwgImZ1biIgYW5kICJnbG9iYWwiLgorLy8gV2lsZGNhcmQgZXhwcmVzc2lvbnMgZGVmaW5lLCByZXNwZWN0aXZlbHksIHNvdXJjZSBmaWxlcywgZnVuY3Rpb25zIG9yCisvLyBnbG9iYWxzIHdoaWNoIHNob3VsZG4ndCBiZSBpbnN0cnVtZW50ZWQuCisvLyBFeGFtcGxlcyBvZiBjYXRlZ29yaWVzOgorLy8gICAiZnVuY3Rpb25hbCI6IHVzZWQgaW4gREZTYW4gdG8gbGlzdCBmdW5jdGlvbnMgd2l0aCBwdXJlIGZ1bmN0aW9uYWwKKy8vICAgICAgICAgICAgICAgICBzZW1hbnRpY3MuCisvLyAgICJpbml0IjogdXNlZCBpbiBBU2FuIGJsYWNrbGlzdCB0byBkaXNhYmxlIGluaXRpYWxpemF0aW9uLW9yZGVyIGJ1Z3MKKy8vICAgICAgICAgICBkZXRlY3Rpb24gZm9yIGNlcnRhaW4gZ2xvYmFscyBvciBzb3VyY2UgZmlsZXMuCisvLyBGdWxsIHNwZWNpYWwgY2FzZSBsaXN0IGZpbGUgZXhhbXBsZToKKy8vIC0tLQorLy8gW2FkZHJlc3NdCisvLyAjIEJsYWNrbGlzdGVkIGl0ZW1zOgorLy8gZnVuOipfWk40YmFzZTZzdWJ0bGUqCisvLyBnbG9iYWw6Kmdsb2JhbF93aXRoX2JhZF9hY2Nlc3Nfb3JfaW5pdGlhbGl6YXRpb24qCisvLyBnbG9iYWw6Kmdsb2JhbF93aXRoX2luaXRpYWxpemF0aW9uX2lzc3Vlcyo9aW5pdAorLy8gdHlwZToqTmFtZXNwYWNlOjpDbGFzc05hbWUqPWluaXQKKy8vIHNyYzpmaWxlX3dpdGhfdHJpY2t5X2NvZGUuY2MKKy8vIHNyYzppZ25vcmUtZ2xvYmFsLWluaXRpYWxpemVycy1pc3N1ZXMuY2M9aW5pdAorLy8KKy8vIFtkYXRhZmxvd10KKy8vICMgRnVuY3Rpb25zIHdpdGggcHVyZSBmdW5jdGlvbmFsIHNlbWFudGljczoKKy8vIGZ1bjpjb3M9ZnVuY3Rpb25hbAorLy8gZnVuOnNpbj1mdW5jdGlvbmFsCisvLyAtLS0KKy8vIE5vdGUgdGhhdCB0aGUgd2lsZCBjYXJkIGlzIGluIGZhY3QgYW4gbGx2bTo6UmVnZXgsIGJ1dCAqIGlzIGF1dG9tYXRpY2FsbHkKKy8vIHJlcGxhY2VkIHdpdGggLioKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9TUEVDSUFMQ0FTRUxJU1RfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfU1BFQ0lBTENBU0VMSVNUX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9SZWdleC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9UcmlncmFtSW5kZXguaCIKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBNZW1vcnlCdWZmZXI7CitjbGFzcyBSZWdleDsKK2NsYXNzIFN0cmluZ1JlZjsKKworY2xhc3MgU3BlY2lhbENhc2VMaXN0IHsKK3B1YmxpYzoKKyAgLy8vIFBhcnNlcyB0aGUgc3BlY2lhbCBjYXNlIGxpc3QgZW50cmllcyBmcm9tIGZpbGVzLiBPbiBmYWlsdXJlLCByZXR1cm5zCisgIC8vLyAwIGFuZCB3cml0ZXMgYW4gZXJyb3IgbWVzc2FnZSB0byBzdHJpbmcuCisgIHN0YXRpYyBzdGQ6OnVuaXF1ZV9wdHI8U3BlY2lhbENhc2VMaXN0PgorICBjcmVhdGUoY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ICZQYXRocywgc3RkOjpzdHJpbmcgJkVycm9yKTsKKyAgLy8vIFBhcnNlcyB0aGUgc3BlY2lhbCBjYXNlIGxpc3QgZnJvbSBhIG1lbW9yeSBidWZmZXIuIE9uIGZhaWx1cmUsIHJldHVybnMKKyAgLy8vIDAgYW5kIHdyaXRlcyBhbiBlcnJvciBtZXNzYWdlIHRvIHN0cmluZy4KKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxTcGVjaWFsQ2FzZUxpc3Q+IGNyZWF0ZShjb25zdCBNZW1vcnlCdWZmZXIgKk1CLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZFcnJvcik7CisgIC8vLyBQYXJzZXMgdGhlIHNwZWNpYWwgY2FzZSBsaXN0IGVudHJpZXMgZnJvbSBmaWxlcy4gT24gZmFpbHVyZSwgcmVwb3J0cyBhCisgIC8vLyBmYXRhbCBlcnJvci4KKyAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxTcGVjaWFsQ2FzZUxpc3Q+CisgIGNyZWF0ZU9yRGllKGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmUGF0aHMpOworCisgIH5TcGVjaWFsQ2FzZUxpc3QoKTsKKworICAvLy8gUmV0dXJucyB0cnVlLCBpZiBzcGVjaWFsIGNhc2UgbGlzdCBjb250YWlucyBhIGxpbmUKKyAgLy8vIFxjb2RlCisgIC8vLyAgIEBQcmVmaXg6PEU+PUBDYXRlZ29yeQorICAvLy8gXGVuZGNvZGUKKyAgLy8vIHdoZXJlIEBRdWVyeSBzYXRpc2ZpZXMgd2lsZGNhcmQgZXhwcmVzc2lvbiA8RT4gaW4gYSBnaXZlbiBAU2VjdGlvbi4KKyAgYm9vbCBpblNlY3Rpb24oU3RyaW5nUmVmIFNlY3Rpb24sIFN0cmluZ1JlZiBQcmVmaXgsIFN0cmluZ1JlZiBRdWVyeSwKKyAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIENhdGVnb3J5ID0gU3RyaW5nUmVmKCkpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSBsaW5lIG51bWJlciBjb3JyZXNwb25kaW5nIHRvIHRoZSBzcGVjaWFsIGNhc2UgbGlzdCBlbnRyeSBpZgorICAvLy8gdGhlIHNwZWNpYWwgY2FzZSBsaXN0IGNvbnRhaW5zIGEgbGluZQorICAvLy8gXGNvZGUKKyAgLy8vICAgQFByZWZpeDo8RT49QENhdGVnb3J5CisgIC8vLyBcZW5kY29kZQorICAvLy8gd2hlcmUgQFF1ZXJ5IHNhdGlzZmllcyB3aWxkY2FyZCBleHByZXNzaW9uIDxFPiBpbiBhIGdpdmVuIEBTZWN0aW9uLgorICAvLy8gUmV0dXJucyB6ZXJvIGlmIHRoZXJlIGlzIG5vIGJsYWNrbGlzdCBlbnRyeSBjb3JyZXNwb25kaW5nIHRvIHRoaXMKKyAgLy8vIGV4cHJlc3Npb24uCisgIHVuc2lnbmVkIGluU2VjdGlvbkJsYW1lKFN0cmluZ1JlZiBTZWN0aW9uLCBTdHJpbmdSZWYgUHJlZml4LCBTdHJpbmdSZWYgUXVlcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBDYXRlZ29yeSA9IFN0cmluZ1JlZigpKSBjb25zdDsKKworcHJvdGVjdGVkOgorICAvLyBJbXBsZW1lbnRhdGlvbnMgb2YgdGhlIGNyZWF0ZSooKSBmdW5jdGlvbnMgdGhhdCBjYW4gYWxzbyBiZSB1c2VkIGJ5IGRlcml2ZWQKKyAgLy8gY2xhc3Nlcy4KKyAgYm9vbCBjcmVhdGVJbnRlcm5hbChjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gJlBhdGhzLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nICZFcnJvcik7CisgIGJvb2wgY3JlYXRlSW50ZXJuYWwoY29uc3QgTWVtb3J5QnVmZmVyICpNQiwgc3RkOjpzdHJpbmcgJkVycm9yKTsKKworICBTcGVjaWFsQ2FzZUxpc3QoKSA9IGRlZmF1bHQ7CisgIFNwZWNpYWxDYXNlTGlzdChTcGVjaWFsQ2FzZUxpc3QgY29uc3QgJikgPSBkZWxldGU7CisgIFNwZWNpYWxDYXNlTGlzdCAmb3BlcmF0b3I9KFNwZWNpYWxDYXNlTGlzdCBjb25zdCAmKSA9IGRlbGV0ZTsKKworICAvLy8gUmVwcmVzZW50cyBhIHNldCBvZiByZWd1bGFyIGV4cHJlc3Npb25zLiAgUmVndWxhciBleHByZXNzaW9ucyB3aGljaCBhcmUKKyAgLy8vICJsaXRlcmFsIiAoaS5lLiBubyByZWdleCBtZXRhY2hhcmFjdGVycykgYXJlIHN0b3JlZCBpbiBTdHJpbmdzLiAgVGhlCisgIC8vLyByZWFzb24gZm9yIGRvaW5nIHNvIGlzIGVmZmljaWVuY3k7IFN0cmluZ01hcCBpcyBtdWNoIGZhc3RlciBhdCBtYXRjaGluZworICAvLy8gbGl0ZXJhbCBzdHJpbmdzIHRoYW4gUmVnZXguCisgIGNsYXNzIE1hdGNoZXIgeworICBwdWJsaWM6CisgICAgYm9vbCBpbnNlcnQoc3RkOjpzdHJpbmcgUmVnZXhwLCB1bnNpZ25lZCBMaW5lTnVtYmVyLCBzdGQ6OnN0cmluZyAmUkVFcnJvcik7CisgICAgLy8gUmV0dXJucyB0aGUgbGluZSBudW1iZXIgaW4gdGhlIHNvdXJjZSBmaWxlIHRoYXQgdGhpcyBxdWVyeSBtYXRjaGVzIHRvLgorICAgIC8vIFJldHVybnMgemVybyBpZiBubyBtYXRjaCBpcyBmb3VuZC4KKyAgICB1bnNpZ25lZCBtYXRjaChTdHJpbmdSZWYgUXVlcnkpIGNvbnN0OworCisgIHByaXZhdGU6CisgICAgU3RyaW5nTWFwPHVuc2lnbmVkPiBTdHJpbmdzOworICAgIFRyaWdyYW1JbmRleCBUcmlncmFtczsKKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8c3RkOjp1bmlxdWVfcHRyPFJlZ2V4PiwgdW5zaWduZWQ+PiBSZWdFeGVzOworICB9OworCisgIHVzaW5nIFNlY3Rpb25FbnRyaWVzID0gU3RyaW5nTWFwPFN0cmluZ01hcDxNYXRjaGVyPj47CisKKyAgc3RydWN0IFNlY3Rpb24geworICAgIFNlY3Rpb24oc3RkOjp1bmlxdWVfcHRyPE1hdGNoZXI+IE0pIDogU2VjdGlvbk1hdGNoZXIoc3RkOjptb3ZlKE0pKXt9OworCisgICAgc3RkOjp1bmlxdWVfcHRyPE1hdGNoZXI+IFNlY3Rpb25NYXRjaGVyOworICAgIFNlY3Rpb25FbnRyaWVzIEVudHJpZXM7CisgIH07CisKKyAgc3RkOjp2ZWN0b3I8U2VjdGlvbj4gU2VjdGlvbnM7CisKKyAgLy8vIFBhcnNlcyBqdXN0LWNvbnN0cnVjdGVkIFNwZWNpYWxDYXNlTGlzdCBlbnRyaWVzIGZyb20gYSBtZW1vcnkgYnVmZmVyLgorICBib29sIHBhcnNlKGNvbnN0IE1lbW9yeUJ1ZmZlciAqTUIsIFN0cmluZ01hcDxzaXplX3Q+ICZTZWN0aW9uc01hcCwKKyAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmRXJyb3IpOworCisgIC8vIEhlbHBlciBtZXRob2QgZm9yIGRlcml2ZWQgY2xhc3NlcyB0byBzZWFyY2ggYnkgUHJlZml4LCBRdWVyeSwgYW5kIENhdGVnb3J5CisgIC8vIG9uY2UgdGhleSBoYXZlIGFscmVhZHkgcmVzb2x2ZWQgYSBzZWN0aW9uIGVudHJ5LgorICB1bnNpZ25lZCBpblNlY3Rpb25CbGFtZShjb25zdCBTZWN0aW9uRW50cmllcyAmRW50cmllcywgU3RyaW5nUmVmIFByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFF1ZXJ5LCBTdHJpbmdSZWYgQ2F0ZWdvcnkpIGNvbnN0OworfTsKKworfSAgLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmICAvLyBMTFZNX1NVUFBPUlRfU1BFQ0lBTENBU0VMSVNUX0gKKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1N0cmluZ1Bvb2wuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9TdHJpbmdQb29sLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI1ZmQwNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9TdHJpbmdQb29sLmgKQEAgLTAsMCArMSwxNDAgQEAKKy8vPT09LSBTdHJpbmdQb29sLmggLSBJbnRlcm5lZCBzdHJpbmcgcG9vbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIGFuIGludGVybmVkIHN0cmluZyBwb29sLCB3aGljaCBoZWxwcyByZWR1Y2UgdGhlIGNvc3Qgb2YKKy8vIHN0cmluZ3MgYnkgdXNpbmcgdGhlIHNhbWUgc3RvcmFnZSBmb3IgaWRlbnRpY2FsIHN0cmluZ3MuCisvLworLy8gVG8gaW50ZXJuIGEgc3RyaW5nOgorLy8KKy8vICAgU3RyaW5nUG9vbCBQb29sOworLy8gICBQb29sZWRTdHJpbmdQdHIgU3RyID0gUG9vbC5pbnRlcm4oIndha2thIHdha2thIik7CisvLworLy8gVG8gdXNlIHRoZSB2YWx1ZSBvZiBhbiBpbnRlcm5lZCBzdHJpbmcsIHVzZSBvcGVyYXRvciBib29sIGFuZCBvcGVyYXRvcio6CisvLworLy8gICBpZiAoU3RyKQorLy8gICAgIGNlcnIgPDwgInRoZSBzdHJpbmcgaXMiIDw8ICpTdHIgPDwgIlxuIjsKKy8vCisvLyBQb29sZWQgc3RyaW5ncyBhcmUgaW1tdXRhYmxlLCBidXQgeW91IGNhbiBjaGFuZ2UgYSBQb29sZWRTdHJpbmdQdHIgdG8gcG9pbnQKKy8vIHRvIGFub3RoZXIgaW5zdGFuY2UuIFNvIHRoYXQgaW50ZXJuZWQgc3RyaW5ncyBjYW4gZXZlbnR1YWxseSBiZSBmcmVlZCwKKy8vIHN0cmluZ3MgaW4gdGhlIHN0cmluZyBwb29sIGFyZSByZWZlcmVuY2UtY291bnRlZCAoYXV0b21hdGljYWxseSkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfU1RSSU5HUE9PTF9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9TVFJJTkdQT09MX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworICBjbGFzcyBQb29sZWRTdHJpbmdQdHI7CisKKyAgLy8vIFN0cmluZ1Bvb2wgLSBBbiBpbnRlcm5lZCBzdHJpbmcgcG9vbC4gVXNlIHRoZSBpbnRlcm4gbWV0aG9kIHRvIGFkZCBhCisgIC8vLyBzdHJpbmcuIFN0cmluZ3MgYXJlIHJlbW92ZWQgYXV0b21hdGljYWxseSBhcyBQb29sZWRTdHJpbmdQdHJzIGFyZQorICAvLy8gZGVzdHJveWVkLgorICBjbGFzcyBTdHJpbmdQb29sIHsKKyAgICAvLy8gUG9vbGVkU3RyaW5nIC0gVGhpcyBpcyB0aGUgdmFsdWUgb2YgYW4gZW50cnkgaW4gdGhlIHBvb2wncyBpbnRlcm5pbmcKKyAgICAvLy8gdGFibGUuCisgICAgc3RydWN0IFBvb2xlZFN0cmluZyB7CisgICAgICBTdHJpbmdQb29sICpQb29sID0gbnVsbHB0cjsgIC8vLzwgU28gdGhlIHN0cmluZyBjYW4gcmVtb3ZlIGl0c2VsZi4KKyAgICAgIHVuc2lnbmVkIFJlZmNvdW50ID0gMDsgICAgICAgLy8vPCBOdW1iZXIgb2YgcmVmZXJlbmNpbmcgUG9vbGVkU3RyaW5nUHRycy4KKworICAgIHB1YmxpYzoKKyAgICAgIFBvb2xlZFN0cmluZygpID0gZGVmYXVsdDsKKyAgICB9OworCisgICAgZnJpZW5kIGNsYXNzIFBvb2xlZFN0cmluZ1B0cjsKKworICAgIHVzaW5nIHRhYmxlX3QgPSBTdHJpbmdNYXA8UG9vbGVkU3RyaW5nPjsKKyAgICB1c2luZyBlbnRyeV90ID0gU3RyaW5nTWFwRW50cnk8UG9vbGVkU3RyaW5nPjsKKyAgICB0YWJsZV90IEludGVyblRhYmxlOworCisgIHB1YmxpYzoKKyAgICBTdHJpbmdQb29sKCk7CisgICAgflN0cmluZ1Bvb2woKTsKKworICAgIC8vLyBpbnRlcm4gLSBBZGRzIGEgc3RyaW5nIHRvIHRoZSBwb29sIGFuZCByZXR1cm5zIGEgcmVmZXJlbmNlLWNvdW50ZWQKKyAgICAvLy8gcG9pbnRlciB0byBpdC4gTm8gYWRkaXRpb25hbCBtZW1vcnkgaXMgYWxsb2NhdGVkIGlmIHRoZSBzdHJpbmcgYWxyZWFkeQorICAgIC8vLyBleGlzdHMgaW4gdGhlIHBvb2wuCisgICAgUG9vbGVkU3RyaW5nUHRyIGludGVybihTdHJpbmdSZWYgU3RyKTsKKworICAgIC8vLyBlbXB0eSAtIENoZWNrcyB3aGV0aGVyIHRoZSBwb29sIGlzIGVtcHR5LiBSZXR1cm5zIHRydWUgaWYgc28uCisgICAgLy8vCisgICAgaW5saW5lIGJvb2wgZW1wdHkoKSBjb25zdCB7IHJldHVybiBJbnRlcm5UYWJsZS5lbXB0eSgpOyB9CisgIH07CisKKyAgLy8vIFBvb2xlZFN0cmluZ1B0ciAtIEEgcG9pbnRlciB0byBhbiBpbnRlcm5lZCBzdHJpbmcuIFVzZSBvcGVyYXRvciBib29sIHRvCisgIC8vLyB0ZXN0IHdoZXRoZXIgdGhlIHBvaW50ZXIgaXMgdmFsaWQsIGFuZCBvcGVyYXRvciAqIHRvIGdldCB0aGUgc3RyaW5nIGlmIHNvLgorICAvLy8gVGhpcyBpcyBhIGxpZ2h0d2VpZ2h0IHZhbHVlIGNsYXNzIHdpdGggc3RvcmFnZSByZXF1aXJlbWVudHMgZXF1aXZhbGVudCB0bworICAvLy8gYSBzaW5nbGUgcG9pbnRlciwgYnV0IGl0IGRvZXMgaGF2ZSByZWZlcmVuY2UtY291bnRpbmcgb3ZlcmhlYWQgd2hlbgorICAvLy8gY29waWVkLgorICBjbGFzcyBQb29sZWRTdHJpbmdQdHIgeworICAgIHVzaW5nIGVudHJ5X3QgPSBTdHJpbmdQb29sOjplbnRyeV90OworCisgICAgZW50cnlfdCAqUyA9IG51bGxwdHI7CisKKyAgcHVibGljOgorICAgIFBvb2xlZFN0cmluZ1B0cigpID0gZGVmYXVsdDsKKworICAgIGV4cGxpY2l0IFBvb2xlZFN0cmluZ1B0cihlbnRyeV90ICpFKSA6IFMoRSkgeworICAgICAgaWYgKFMpICsrUy0+Z2V0VmFsdWUoKS5SZWZjb3VudDsKKyAgICB9CisKKyAgICBQb29sZWRTdHJpbmdQdHIoY29uc3QgUG9vbGVkU3RyaW5nUHRyICZUaGF0KSA6IFMoVGhhdC5TKSB7CisgICAgICBpZiAoUykgKytTLT5nZXRWYWx1ZSgpLlJlZmNvdW50OworICAgIH0KKworICAgIFBvb2xlZFN0cmluZ1B0ciAmb3BlcmF0b3I9KGNvbnN0IFBvb2xlZFN0cmluZ1B0ciAmVGhhdCkgeworICAgICAgaWYgKFMgIT0gVGhhdC5TKSB7CisgICAgICAgIGNsZWFyKCk7CisgICAgICAgIFMgPSBUaGF0LlM7CisgICAgICAgIGlmIChTKSArK1MtPmdldFZhbHVlKCkuUmVmY291bnQ7CisgICAgICB9CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorCisgICAgdm9pZCBjbGVhcigpIHsKKyAgICAgIGlmICghUykKKyAgICAgICAgcmV0dXJuOworICAgICAgaWYgKC0tUy0+Z2V0VmFsdWUoKS5SZWZjb3VudCA9PSAwKSB7CisgICAgICAgIFMtPmdldFZhbHVlKCkuUG9vbC0+SW50ZXJuVGFibGUucmVtb3ZlKFMpOworICAgICAgICBTLT5EZXN0cm95KCk7CisgICAgICB9CisgICAgICBTID0gbnVsbHB0cjsKKyAgICB9CisKKyAgICB+UG9vbGVkU3RyaW5nUHRyKCkgeyBjbGVhcigpOyB9CisKKyAgICBpbmxpbmUgY29uc3QgY2hhciAqYmVnaW4oKSBjb25zdCB7CisgICAgICBhc3NlcnQoKnRoaXMgJiYgIkF0dGVtcHQgdG8gZGVyZWZlcmVuY2UgZW1wdHkgUG9vbGVkU3RyaW5nUHRyISIpOworICAgICAgcmV0dXJuIFMtPmdldEtleURhdGEoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgY29uc3QgY2hhciAqZW5kKCkgY29uc3QgeworICAgICAgYXNzZXJ0KCp0aGlzICYmICJBdHRlbXB0IHRvIGRlcmVmZXJlbmNlIGVtcHR5IFBvb2xlZFN0cmluZ1B0ciEiKTsKKyAgICAgIHJldHVybiBTLT5nZXRLZXlEYXRhKCkgKyBTLT5nZXRLZXlMZW5ndGgoKTsKKyAgICB9CisKKyAgICBpbmxpbmUgdW5zaWduZWQgc2l6ZSgpIGNvbnN0IHsKKyAgICAgIGFzc2VydCgqdGhpcyAmJiAiQXR0ZW1wdCB0byBkZXJlZmVyZW5jZSBlbXB0eSBQb29sZWRTdHJpbmdQdHIhIik7CisgICAgICByZXR1cm4gUy0+Z2V0S2V5TGVuZ3RoKCk7CisgICAgfQorCisgICAgaW5saW5lIGNvbnN0IGNoYXIgKm9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuIGJlZ2luKCk7IH0KKyAgICBpbmxpbmUgZXhwbGljaXQgb3BlcmF0b3IgYm9vbCgpIGNvbnN0IHsgcmV0dXJuIFMgIT0gbnVsbHB0cjsgfQorCisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3I9PShjb25zdCBQb29sZWRTdHJpbmdQdHIgJlRoYXQpIGNvbnN0IHsgcmV0dXJuIFMgPT0gVGhhdC5TOyB9CisgICAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBQb29sZWRTdHJpbmdQdHIgJlRoYXQpIGNvbnN0IHsgcmV0dXJuIFMgIT0gVGhhdC5TOyB9CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfU1RSSU5HUE9PTF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU3RyaW5nU2F2ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9TdHJpbmdTYXZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4NWIyODkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvU3RyaW5nU2F2ZXIuaApAQCAtMCwwICsxLDMyIEBACisvLz09PS0gbGx2bS9TdXBwb3J0L1N0cmluZ1NhdmVyLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9TVFJJTkdTQVZFUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9TVFJJTkdTQVZFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BbGxvY2F0b3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gXGJyaWVmIFNhdmVzIHN0cmluZ3MgaW4gdGhlIGluaGVyaXRvcidzIHN0YWJsZSBzdG9yYWdlIGFuZCByZXR1cm5zIGEKKy8vLyBTdHJpbmdSZWYgd2l0aCBhIHN0YWJsZSBjaGFyYWN0ZXIgcG9pbnRlci4KK2NsYXNzIFN0cmluZ1NhdmVyIGZpbmFsIHsKKyAgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2M7CisKK3B1YmxpYzoKKyAgU3RyaW5nU2F2ZXIoQnVtcFB0ckFsbG9jYXRvciAmQWxsb2MpIDogQWxsb2MoQWxsb2MpIHt9CisgIFN0cmluZ1JlZiBzYXZlKGNvbnN0IGNoYXIgKlMpIHsgcmV0dXJuIHNhdmUoU3RyaW5nUmVmKFMpKTsgfQorICBTdHJpbmdSZWYgc2F2ZShTdHJpbmdSZWYgUyk7CisgIFN0cmluZ1JlZiBzYXZlKGNvbnN0IFR3aW5lICZTKSB7IHJldHVybiBzYXZlKFN0cmluZ1JlZihTLnN0cigpKSk7IH0KKyAgU3RyaW5nUmVmIHNhdmUoY29uc3Qgc3RkOjpzdHJpbmcgJlMpIHsgcmV0dXJuIHNhdmUoU3RyaW5nUmVmKFMpKTsgfQorfTsKK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1N3YXBCeXRlT3JkZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Td2FwQnl0ZU9yZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFkMzcyNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Td2FwQnl0ZU9yZGVyLmgKQEAgLTAsMCArMSwxMjcgQEAKKy8vPT09LSBTd2FwQnl0ZU9yZGVyLmggLSBHZW5lcmljIGFuZCBvcHRpbWl6ZWQgYnl0ZSBzd2FwcyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIGdlbmVyaWMgYW5kIG9wdGltaXplZCBmdW5jdGlvbnMgdG8gc3dhcCB0aGUgYnl0ZSBvcmRlciBvZgorLy8gYW4gaW50ZWdyYWwgdHlwZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9TV0FQQllURU9SREVSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1NXQVBCWVRFT1JERVJfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX0RFQlVHKQorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2VuZGlmCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBzeXMgeworCisvLy8gU3dhcEJ5dGVPcmRlcl8xNiAtIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGJ5dGUtc3dhcHBlZCByZXByZXNlbnRhdGlvbiBvZgorLy8vIHRoZSAxNi1iaXQgYXJndW1lbnQuCitpbmxpbmUgdWludDE2X3QgU3dhcEJ5dGVPcmRlcl8xNih1aW50MTZfdCB2YWx1ZSkgeworI2lmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9ERUJVRykKKyAgLy8gVGhlIERMTCB2ZXJzaW9uIG9mIHRoZSBydW50aW1lIGxhY2tzIHRoZXNlIGZ1bmN0aW9ucyAoYnVnIT8pLCBidXQgaW4gYQorICAvLyByZWxlYXNlIGJ1aWxkIHRoZXkncmUgcmVwbGFjZWQgd2l0aCBCU1dBUCBpbnN0cnVjdGlvbnMgYW55d2F5LgorICByZXR1cm4gX2J5dGVzd2FwX3VzaG9ydCh2YWx1ZSk7CisjZWxzZQorICB1aW50MTZfdCBIaSA9IHZhbHVlIDw8IDg7CisgIHVpbnQxNl90IExvID0gdmFsdWUgPj4gODsKKyAgcmV0dXJuIEhpIHwgTG87CisjZW5kaWYKK30KKworLy8vIFN3YXBCeXRlT3JkZXJfMzIgLSBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYSBieXRlLXN3YXBwZWQgcmVwcmVzZW50YXRpb24gb2YKKy8vLyB0aGUgMzItYml0IGFyZ3VtZW50LgoraW5saW5lIHVpbnQzMl90IFN3YXBCeXRlT3JkZXJfMzIodWludDMyX3QgdmFsdWUpIHsKKyNpZiBkZWZpbmVkKF9fbGx2bV9fKSB8fCAoTExWTV9HTlVDX1BSRVJFUSg0LCAzLCAwKSAmJiAhZGVmaW5lZChfX0lDQykpCisgIHJldHVybiBfX2J1aWx0aW5fYnN3YXAzMih2YWx1ZSk7CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfREVCVUcpCisgIHJldHVybiBfYnl0ZXN3YXBfdWxvbmcodmFsdWUpOworI2Vsc2UKKyAgdWludDMyX3QgQnl0ZTAgPSB2YWx1ZSAmIDB4MDAwMDAwRkY7CisgIHVpbnQzMl90IEJ5dGUxID0gdmFsdWUgJiAweDAwMDBGRjAwOworICB1aW50MzJfdCBCeXRlMiA9IHZhbHVlICYgMHgwMEZGMDAwMDsKKyAgdWludDMyX3QgQnl0ZTMgPSB2YWx1ZSAmIDB4RkYwMDAwMDA7CisgIHJldHVybiAoQnl0ZTAgPDwgMjQpIHwgKEJ5dGUxIDw8IDgpIHwgKEJ5dGUyID4+IDgpIHwgKEJ5dGUzID4+IDI0KTsKKyNlbmRpZgorfQorCisvLy8gU3dhcEJ5dGVPcmRlcl82NCAtIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIGJ5dGUtc3dhcHBlZCByZXByZXNlbnRhdGlvbiBvZgorLy8vIHRoZSA2NC1iaXQgYXJndW1lbnQuCitpbmxpbmUgdWludDY0X3QgU3dhcEJ5dGVPcmRlcl82NCh1aW50NjRfdCB2YWx1ZSkgeworI2lmIGRlZmluZWQoX19sbHZtX18pIHx8IChMTFZNX0dOVUNfUFJFUkVRKDQsIDMsIDApICYmICFkZWZpbmVkKF9fSUNDKSkKKyAgcmV0dXJuIF9fYnVpbHRpbl9ic3dhcDY0KHZhbHVlKTsKKyNlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9ERUJVRykKKyAgcmV0dXJuIF9ieXRlc3dhcF91aW50NjQodmFsdWUpOworI2Vsc2UKKyAgdWludDY0X3QgSGkgPSBTd2FwQnl0ZU9yZGVyXzMyKHVpbnQzMl90KHZhbHVlKSk7CisgIHVpbnQzMl90IExvID0gU3dhcEJ5dGVPcmRlcl8zMih1aW50MzJfdCh2YWx1ZSA+PiAzMikpOworICByZXR1cm4gKEhpIDw8IDMyKSB8IExvOworI2VuZGlmCit9CisKK2lubGluZSB1bnNpZ25lZCBjaGFyICBnZXRTd2FwcGVkQnl0ZXModW5zaWduZWQgY2hhciBDKSB7IHJldHVybiBDOyB9CitpbmxpbmUgICBzaWduZWQgY2hhciAgZ2V0U3dhcHBlZEJ5dGVzKHNpZ25lZCBjaGFyIEMpIHsgcmV0dXJuIEM7IH0KK2lubGluZSAgICAgICAgICBjaGFyICBnZXRTd2FwcGVkQnl0ZXMoY2hhciBDKSB7IHJldHVybiBDOyB9CisKK2lubGluZSB1bnNpZ25lZCBzaG9ydCBnZXRTd2FwcGVkQnl0ZXModW5zaWduZWQgc2hvcnQgQykgeyByZXR1cm4gU3dhcEJ5dGVPcmRlcl8xNihDKTsgfQoraW5saW5lICAgc2lnbmVkIHNob3J0IGdldFN3YXBwZWRCeXRlcyggIHNpZ25lZCBzaG9ydCBDKSB7IHJldHVybiBTd2FwQnl0ZU9yZGVyXzE2KEMpOyB9CisKK2lubGluZSB1bnNpZ25lZCBpbnQgICBnZXRTd2FwcGVkQnl0ZXModW5zaWduZWQgaW50ICAgQykgeyByZXR1cm4gU3dhcEJ5dGVPcmRlcl8zMihDKTsgfQoraW5saW5lICAgc2lnbmVkIGludCAgIGdldFN3YXBwZWRCeXRlcyggIHNpZ25lZCBpbnQgICBDKSB7IHJldHVybiBTd2FwQnl0ZU9yZGVyXzMyKEMpOyB9CisKKyNpZiBfX0xPTkdfTUFYX18gPT0gX19JTlRfTUFYX18KK2lubGluZSB1bnNpZ25lZCBsb25nICBnZXRTd2FwcGVkQnl0ZXModW5zaWduZWQgbG9uZyAgQykgeyByZXR1cm4gU3dhcEJ5dGVPcmRlcl8zMihDKTsgfQoraW5saW5lICAgc2lnbmVkIGxvbmcgIGdldFN3YXBwZWRCeXRlcyggIHNpZ25lZCBsb25nICBDKSB7IHJldHVybiBTd2FwQnl0ZU9yZGVyXzMyKEMpOyB9CisjZWxpZiBfX0xPTkdfTUFYX18gPT0gX19MT05HX0xPTkdfTUFYX18KK2lubGluZSB1bnNpZ25lZCBsb25nICBnZXRTd2FwcGVkQnl0ZXModW5zaWduZWQgbG9uZyAgQykgeyByZXR1cm4gU3dhcEJ5dGVPcmRlcl82NChDKTsgfQoraW5saW5lICAgc2lnbmVkIGxvbmcgIGdldFN3YXBwZWRCeXRlcyggIHNpZ25lZCBsb25nICBDKSB7IHJldHVybiBTd2FwQnl0ZU9yZGVyXzY0KEMpOyB9CisjZWxzZQorI2Vycm9yICJVbmtub3duIGxvbmcgc2l6ZSEiCisjZW5kaWYKKworaW5saW5lIHVuc2lnbmVkIGxvbmcgbG9uZyBnZXRTd2FwcGVkQnl0ZXModW5zaWduZWQgbG9uZyBsb25nIEMpIHsKKyAgcmV0dXJuIFN3YXBCeXRlT3JkZXJfNjQoQyk7Cit9CitpbmxpbmUgc2lnbmVkIGxvbmcgbG9uZyBnZXRTd2FwcGVkQnl0ZXMoc2lnbmVkIGxvbmcgbG9uZyBDKSB7CisgIHJldHVybiBTd2FwQnl0ZU9yZGVyXzY0KEMpOworfQorCitpbmxpbmUgZmxvYXQgZ2V0U3dhcHBlZEJ5dGVzKGZsb2F0IEMpIHsKKyAgdW5pb24geworICAgIHVpbnQzMl90IGk7CisgICAgZmxvYXQgZjsKKyAgfSBpbiwgb3V0OworICBpbi5mID0gQzsKKyAgb3V0LmkgPSBTd2FwQnl0ZU9yZGVyXzMyKGluLmkpOworICByZXR1cm4gb3V0LmY7Cit9CisKK2lubGluZSBkb3VibGUgZ2V0U3dhcHBlZEJ5dGVzKGRvdWJsZSBDKSB7CisgIHVuaW9uIHsKKyAgICB1aW50NjRfdCBpOworICAgIGRvdWJsZSBkOworICB9IGluLCBvdXQ7CisgIGluLmQgPSBDOworICBvdXQuaSA9IFN3YXBCeXRlT3JkZXJfNjQoaW4uaSk7CisgIHJldHVybiBvdXQuZDsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2lubGluZSB2b2lkIHN3YXBCeXRlT3JkZXIoVCAmVmFsdWUpIHsKKyAgVmFsdWUgPSBnZXRTd2FwcGVkQnl0ZXMoVmFsdWUpOworfQorCit9IC8vIGVuZCBuYW1lc3BhY2Ugc3lzCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9TeXN0ZW1VdGlscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1N5c3RlbVV0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk5N2IxYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9TeXN0ZW1VdGlscy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vPT09LSBTeXN0ZW1VdGlscy5oIC0gVXRpbGl0aWVzIHRvIGRvIGxvdy1sZXZlbCBzeXN0ZW0gc3R1ZmYgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIGZ1bmN0aW9ucyB1c2VkIHRvIGRvIGEgdmFyaWV0eSBvZiBsb3ctbGV2ZWwsIG9mdGVuCisvLyBzeXN0ZW0tc3BlY2lmaWMsIHRhc2tzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1NZU1RFTVVUSUxTX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1NZU1RFTVVUSUxTX0gKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyByYXdfb3N0cmVhbTsKKworLy8vIERldGVybWluZSBpZiB0aGUgcmF3X29zdHJlYW0gcHJvdmlkZWQgaXMgY29ubmVjdGVkIHRvIGEgdGVybWluYWwuIElmIHNvLAorLy8vIGdlbmVyYXRlIGEgd2FybmluZyBtZXNzYWdlIHRvIGVycnMoKSBhZHZpc2luZyBhZ2FpbnN0IGRpc3BsYXkgb2YgYml0Y29kZQorLy8vIGFuZCByZXR1cm4gdHJ1ZS4gT3RoZXJ3aXNlIGp1c3QgcmV0dXJuIGZhbHNlLgorLy8vIEBicmllZiBDaGVjayBmb3Igb3V0cHV0IHdyaXR0ZW4gdG8gYSBjb25zb2xlCitib29sIENoZWNrQml0Y29kZU91dHB1dFRvQ29uc29sZSgKKyAgcmF3X29zdHJlYW0gJnN0cmVhbV90b19jaGVjaywgLy8vPCBUaGUgc3RyZWFtIHRvIGJlIGNoZWNrZWQKKyAgYm9vbCBwcmludF93YXJuaW5nID0gdHJ1ZSAgICAgLy8vPCBDb250cm9sIHdoZXRoZXIgd2FybmluZ3MgYXJlIHByaW50ZWQKKyk7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RhcldyaXRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RhcldyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOWY2MWIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVGFyV3JpdGVyLmgKQEAgLTAsMCArMSwzNCBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvVGFyV3JpdGVyLmggLSBUYXIgYXJjaGl2ZSBmaWxlIGNyZWF0b3IgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfVEFSX1dSSVRFUl9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9UQVJfV1JJVEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCituYW1lc3BhY2UgbGx2bSB7CitjbGFzcyBUYXJXcml0ZXIgeworcHVibGljOgorICBzdGF0aWMgRXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPFRhcldyaXRlcj4+IGNyZWF0ZShTdHJpbmdSZWYgT3V0cHV0UGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEJhc2VEaXIpOworCisgIHZvaWQgYXBwZW5kKFN0cmluZ1JlZiBQYXRoLCBTdHJpbmdSZWYgRGF0YSk7CisKK3ByaXZhdGU6CisgIFRhcldyaXRlcihpbnQgRkQsIFN0cmluZ1JlZiBCYXNlRGlyKTsKKyAgcmF3X2ZkX29zdHJlYW0gT1M7CisgIHN0ZDo6c3RyaW5nIEJhc2VEaXI7CisgIFN0cmluZ1NldDw+IEZpbGVzOworfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVGFyZ2V0T3Bjb2Rlcy5kZWYgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVGFyZ2V0T3Bjb2Rlcy5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxNGEwMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UYXJnZXRPcGNvZGVzLmRlZgpAQCAtMCwwICsxLDQ2NiBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvVGFyZ2V0T3Bjb2Rlcy5kZWYgLSBUYXJnZXQgSW5kZXAgT3Bjb2RlcyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgdGFyZ2V0IGluZGVwZW5kZW50IGluc3RydWN0aW9uIG9wY29kZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gTk9URTogTk8gSU5DTFVERSBHVUFSRCBERVNJUkVEIQorCisvLy8gSEFORExFX1RBUkdFVF9PUENPREUgZGVmaW5lcyBhbiBvcGNvZGUgYW5kIGl0cyBhc3NvY2lhdGVkIGVudW0gdmFsdWUuCisvLy8KKyNpZm5kZWYgSEFORExFX1RBUkdFVF9PUENPREUKKyNkZWZpbmUgSEFORExFX1RBUkdFVF9PUENPREUoT1BDLCBOVU0pCisjZW5kaWYKKworLy8vIEhBTkRMRV9UQVJHRVRfT1BDT0RFX01BUktFUiBkZWZpbmVzIGFuIGFsdGVybmF0aXZlIGlkZW50aWZpZXIgZm9yIGFuIG9wY29kZS4KKy8vLworI2lmbmRlZiBIQU5ETEVfVEFSR0VUX09QQ09ERV9NQVJLRVIKKyNkZWZpbmUgSEFORExFX1RBUkdFVF9PUENPREVfTUFSS0VSKElERU5ULCBPUEMpCisjZW5kaWYKKworLy8vIEV2ZXJ5IGluc3RydWN0aW9uIGRlZmluZWQgaGVyZSBtdXN0IGFsc28gYXBwZWFyIGluIFRhcmdldC50ZC4KKy8vLworSEFORExFX1RBUkdFVF9PUENPREUoUEhJKQorSEFORExFX1RBUkdFVF9PUENPREUoSU5MSU5FQVNNKQorSEFORExFX1RBUkdFVF9PUENPREUoQ0ZJX0lOU1RSVUNUSU9OKQorSEFORExFX1RBUkdFVF9PUENPREUoRUhfTEFCRUwpCitIQU5ETEVfVEFSR0VUX09QQ09ERShHQ19MQUJFTCkKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEFOTk9UQVRJT05fTEFCRUwpCisKKy8vLyBLSUxMIC0gVGhpcyBpbnN0cnVjdGlvbiBpcyBhIG5vb3AgdGhhdCBpcyB1c2VkIG9ubHkgdG8gYWRqdXN0IHRoZQorLy8vIGxpdmVuZXNzIG9mIHJlZ2lzdGVycy4gVGhpcyBjYW4gYmUgdXNlZnVsIHdoZW4gZGVhbGluZyB3aXRoCisvLy8gc3ViLXJlZ2lzdGVycy4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEtJTEwpCisKKy8vLyBFWFRSQUNUX1NVQlJFRyAtIFRoaXMgaW5zdHJ1Y3Rpb24gdGFrZXMgdHdvIG9wZXJhbmRzOiBhIHJlZ2lzdGVyCisvLy8gdGhhdCBoYXMgc3VicmVnaXN0ZXJzLCBhbmQgYSBzdWJyZWdpc3RlciBpbmRleC4gSXQgcmV0dXJucyB0aGUKKy8vLyBleHRyYWN0ZWQgc3VicmVnaXN0ZXIgdmFsdWUuIFRoaXMgaXMgY29tbW9ubHkgdXNlZCB0byBpbXBsZW1lbnQKKy8vLyB0cnVuY2F0aW9uIG9wZXJhdGlvbnMgb24gdGFyZ2V0IGFyY2hpdGVjdHVyZXMgd2hpY2ggc3VwcG9ydCBpdC4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEVYVFJBQ1RfU1VCUkVHKQorCisvLy8gSU5TRVJUX1NVQlJFRyAtIFRoaXMgaW5zdHJ1Y3Rpb24gdGFrZXMgdGhyZWUgb3BlcmFuZHM6IGEgcmVnaXN0ZXIgdGhhdAorLy8vIGhhcyBzdWJyZWdpc3RlcnMsIGEgcmVnaXN0ZXIgcHJvdmlkaW5nIGFuIGluc2VydCB2YWx1ZSwgYW5kIGEKKy8vLyBzdWJyZWdpc3RlciBpbmRleC4gSXQgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGZpcnN0IHJlZ2lzdGVyIHdpdGggdGhlCisvLy8gdmFsdWUgb2YgdGhlIHNlY29uZCByZWdpc3RlciBpbnNlcnRlZC4gVGhlIGZpcnN0IHJlZ2lzdGVyIGlzIG9mdGVuCisvLy8gZGVmaW5lZCBieSBhbiBJTVBMSUNJVF9ERUYsIGJlY2F1c2UgaXQgaXMgY29tbW9ubHkgdXNlZCB0byBpbXBsZW1lbnQKKy8vLyBhbnlleHQgb3BlcmF0aW9ucyBvbiB0YXJnZXQgYXJjaGl0ZWN0dXJlcyB3aGljaCBzdXBwb3J0IGl0LgorSEFORExFX1RBUkdFVF9PUENPREUoSU5TRVJUX1NVQlJFRykKKworLy8vIElNUExJQ0lUX0RFRiAtIFRoaXMgaXMgdGhlIE1hY2hpbmVJbnN0ci1sZXZlbCBlcXVpdmFsZW50IG9mIHVuZGVmLgorSEFORExFX1RBUkdFVF9PUENPREUoSU1QTElDSVRfREVGKQorCisvLy8gU1VCUkVHX1RPX1JFRyAtIEFzc2VydCB0aGUgdmFsdWUgb2YgYml0cyBpbiBhIHN1cGVyIHJlZ2lzdGVyLgorLy8vIFRoZSByZXN1bHQgb2YgdGhpcyBpbnN0cnVjdGlvbiBpcyB0aGUgdmFsdWUgb2YgdGhlIHNlY29uZCBvcGVyYW5kIGluc2VydGVkCisvLy8gaW50byB0aGUgc3VicmVnaXN0ZXIgc3BlY2lmaWVkIGJ5IHRoZSB0aGlyZCBvcGVyYW5kLiBBbGwgb3RoZXIgYml0cyBhcmUKKy8vLyBhc3N1bWVkIHRvIGJlIGVxdWFsIHRvIHRoZSBiaXRzIGluIHRoZSBpbW1lZGlhdGUgaW50ZWdlciBjb25zdGFudCBpbiB0aGUKKy8vLyBmaXJzdCBvcGVyYW5kLiBUaGlzIGluc3RydWN0aW9uIGp1c3QgY29tbXVuaWNhdGVzIGluZm9ybWF0aW9uOyBObyBjb2RlCisvLy8gc2hvdWxkIGJlIGdlbmVyYXRlZC4KKy8vLyBUaGlzIGlzIHR5cGljYWxseSB1c2VkIGFmdGVyIGFuIGluc3RydWN0aW9uIHdoZXJlIHRoZSB3cml0ZSB0byBhIHN1YnJlZ2lzdGVyCisvLy8gaW1wbGljaXRseSBjbGVhcmVkIHRoZSBiaXRzIGluIHRoZSBzdXBlciByZWdpc3RlcnMuCitIQU5ETEVfVEFSR0VUX09QQ09ERShTVUJSRUdfVE9fUkVHKQorCisvLy8gQ09QWV9UT19SRUdDTEFTUyAtIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgYSBwbGFjZWhvbGRlciBmb3IgYSBwbGFpbgorLy8vIHJlZ2lzdGVyLXRvLXJlZ2lzdGVyIGNvcHkgaW50byBhIHNwZWNpZmljIHJlZ2lzdGVyIGNsYXNzLiBUaGlzIGlzIG9ubHkKKy8vLyB1c2VkIGJldHdlZW4gaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIGFuZCBNYWNoaW5lSW5zdHIgY3JlYXRpb24sIGJlZm9yZQorLy8vIHZpcnR1YWwgcmVnaXN0ZXJzIGhhdmUgYmVlbiBjcmVhdGVkIGZvciBhbGwgdGhlIGluc3RydWN0aW9ucywgYW5kIGl0J3MKKy8vLyBvbmx5IG5lZWRlZCBpbiBjYXNlcyB3aGVyZSB0aGUgcmVnaXN0ZXIgY2xhc3NlcyBpbXBsaWVkIGJ5IHRoZQorLy8vIGluc3RydWN0aW9ucyBhcmUgaW5zdWZmaWNpZW50LiBJdCBpcyBlbWl0dGVkIGFzIGEgQ09QWSBNYWNoaW5lSW5zdHIuCisgIEhBTkRMRV9UQVJHRVRfT1BDT0RFKENPUFlfVE9fUkVHQ0xBU1MpCisKKy8vLyBEQkdfVkFMVUUgLSBhIG1hcHBpbmcgb2YgdGhlIGxsdm0uZGJnLnZhbHVlIGludHJpbnNpYworSEFORExFX1RBUkdFVF9PUENPREUoREJHX1ZBTFVFKQorCisvLy8gUkVHX1NFUVVFTkNFIC0gVGhpcyB2YXJpYWRpYyBpbnN0cnVjdGlvbiBpcyB1c2VkIHRvIGZvcm0gYSByZWdpc3RlciB0aGF0CisvLy8gcmVwcmVzZW50cyBhIGNvbnNlY3V0aXZlIHNlcXVlbmNlIG9mIHN1Yi1yZWdpc3RlcnMuIEl0J3MgdXNlZCBhcyBhCisvLy8gcmVnaXN0ZXIgY29hbGVzY2luZyAvIGFsbG9jYXRpb24gYWlkIGFuZCBtdXN0IGJlIGVsaW1pbmF0ZWQgYmVmb3JlIGNvZGUKKy8vLyBlbWlzc2lvbi4KKy8vIEluIFNETm9kZSBmb3JtLCB0aGUgZmlyc3Qgb3BlcmFuZCBlbmNvZGVzIHRoZSByZWdpc3RlciBjbGFzcyBjcmVhdGVkIGJ5CisvLyB0aGUgUkVHX1NFUVVFTkNFLCB3aGlsZSBlYWNoIHN1YnNlcXVlbnQgcGFpciBuYW1lcyBhIHZyZWcgKyBzdWJyZWcgaW5kZXgKKy8vIHBhaXIuICBPbmNlIGl0IGhhcyBiZWVuIGxvd2VyZWQgdG8gYSBNYWNoaW5lSW5zdHIsIHRoZSByZWdjbGFzcyBvcGVyYW5kCisvLyBpcyBubyBsb25nZXIgcHJlc2VudC4KKy8vLyBlLmcuIHYxMDI3ID0gUkVHX1NFUVVFTkNFIHYxMDI0LCAzLCB2MTAyNSwgNCwgdjEwMjYsIDUKKy8vLyBBZnRlciByZWdpc3RlciBjb2FsZXNjaW5nIHJlZmVyZW5jZXMgb2YgdjEwMjQgc2hvdWxkIGJlIHJlcGxhY2Ugd2l0aAorLy8vIHYxMDI3OjMsIHYxMDI1IHdpdGggdjEwMjc6NCwgZXRjLgorICBIQU5ETEVfVEFSR0VUX09QQ09ERShSRUdfU0VRVUVOQ0UpCisKKy8vLyBDT1BZIC0gVGFyZ2V0LWluZGVwZW5kZW50IHJlZ2lzdGVyIGNvcHkuIFRoaXMgaW5zdHJ1Y3Rpb24gY2FuIGFsc28gYmUKKy8vLyB1c2VkIHRvIGNvcHkgYmV0d2VlbiBzdWJyZWdpc3RlcnMgb2YgdmlydHVhbCByZWdpc3RlcnMuCisgIEhBTkRMRV9UQVJHRVRfT1BDT0RFKENPUFkpCisKKy8vLyBCVU5ETEUgLSBUaGlzIGluc3RydWN0aW9uIHJlcHJlc2VudHMgYW4gaW5zdHJ1Y3Rpb24gYnVuZGxlLiBJbnN0cnVjdGlvbnMKKy8vLyB3aGljaCBpbW1lZGlhdGVseSBmb2xsb3cgYSBCVU5ETEUgaW5zdHJ1Y3Rpb24gd2hpY2ggYXJlIG1hcmtlZCB3aXRoCisvLy8gJ0luc2lkZUJ1bmRsZScgZmxhZyBhcmUgaW5zaWRlIHRoZSBidW5kbGUuCitIQU5ETEVfVEFSR0VUX09QQ09ERShCVU5ETEUpCisKKy8vLyBMaWZldGltZSBtYXJrZXJzLgorSEFORExFX1RBUkdFVF9PUENPREUoTElGRVRJTUVfU1RBUlQpCitIQU5ETEVfVEFSR0VUX09QQ09ERShMSUZFVElNRV9FTkQpCisKKy8vLyBBIFN0YWNrbWFwIGluc3RydWN0aW9uIGNhcHR1cmVzIHRoZSBsb2NhdGlvbiBvZiBsaXZlIHZhcmlhYmxlcyBhdCBpdHMKKy8vLyBwb3NpdGlvbiBpbiB0aGUgaW5zdHJ1Y3Rpb24gc3RyZWFtLiBJdCBpcyBmb2xsb3dlZCBieSBhIHNoYWRvdyBvZiBieXRlcworLy8vIHRoYXQgbXVzdCBsaWUgd2l0aGluIHRoZSBmdW5jdGlvbiBhbmQgbm90IGNvbnRhaW4gYW5vdGhlciBzdGFja21hcC4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKFNUQUNLTUFQKQorCisvLy8gRkVudHJ5IGFsbCAtIFRoaXMgaXMgYSBtYXJrZXIgaW5zdHJ1Y3Rpb24gd2hpY2ggZ2V0cyB0cmFuc2xhdGVkIGludG8gYSByYXcgZmVudHJ5IGNhbGwuCitIQU5ETEVfVEFSR0VUX09QQ09ERShGRU5UUllfQ0FMTCkKKworLy8vIFBhdGNoYWJsZSBjYWxsIGluc3RydWN0aW9uIC0gdGhpcyBpbnN0cnVjdGlvbiByZXByZXNlbnRzIGEgY2FsbCB0byBhCisvLy8gY29uc3RhbnQgYWRkcmVzcywgZm9sbG93ZWQgYnkgYSBzZXJpZXMgb2YgTk9Qcy4gSXQgaXMgaW50ZW5kZWQgdG8KKy8vLyBzdXBwb3J0IG9wdGltaXphdGlvbnMgZm9yIGR5bmFtaWMgbGFuZ3VhZ2VzIChzdWNoIGFzIGphdmFzY3JpcHQpIHRoYXQKKy8vLyByZXdyaXRlIGNhbGxzIHRvIHJ1bnRpbWVzIHdpdGggbW9yZSBlZmZpY2llbnQgY29kZSBzZXF1ZW5jZXMuCisvLy8gVGhpcyBhbHNvIGltcGxpZXMgYSBzdGFjayBtYXAuCitIQU5ETEVfVEFSR0VUX09QQ09ERShQQVRDSFBPSU5UKQorCisvLy8gVGhpcyBwc2V1ZG8taW5zdHJ1Y3Rpb24gbG9hZHMgdGhlIHN0YWNrIGd1YXJkIHZhbHVlLiBUYXJnZXRzIHdoaWNoIG5lZWQKKy8vLyB0byBwcmV2ZW50IHRoZSBzdGFjayBndWFyZCB2YWx1ZSBvciBhZGRyZXNzIGZyb20gYmVpbmcgc3BpbGxlZCB0byB0aGUKKy8vLyBzdGFjayBzaG91bGQgb3ZlcnJpZGUgVGFyZ2V0TG93ZXJpbmc6OmVtaXRMb2FkU3RhY2tHdWFyZE5vZGUgYW5kCisvLy8gYWRkaXRpb25hbGx5IGV4cGFuZCB0aGlzIHBzZXVkbyBhZnRlciByZWdpc3RlciBhbGxvY2F0aW9uLgorSEFORExFX1RBUkdFVF9PUENPREUoTE9BRF9TVEFDS19HVUFSRCkKKworLy8vIENhbGwgaW5zdHJ1Y3Rpb24gd2l0aCBhc3NvY2lhdGVkIHZtIHN0YXRlIGZvciBkZW9wdGltaXphdGlvbiBhbmQgbGlzdAorLy8vIG9mIGxpdmUgcG9pbnRlcnMgZm9yIHJlbG9jYXRpb24gYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yLiAgSXQgaXMKKy8vLyBpbnRlbmRlZCB0byBzdXBwb3J0IGdhcmJhZ2UgY29sbGVjdGlvbiB3aXRoIGZ1bGx5IHByZWNpc2UgcmVsb2NhdGluZworLy8vIGNvbGxlY3RvcnMgYW5kIGRlb3B0aW1pemF0aW9ucyBpbiBlaXRoZXIgdGhlIGNhbGxlZSBvciBjYWxsZXIuCitIQU5ETEVfVEFSR0VUX09QQ09ERShTVEFURVBPSU5UKQorCisvLy8gSW5zdHJ1Y3Rpb24gdGhhdCByZWNvcmRzIHRoZSBvZmZzZXQgb2YgYSBsb2NhbCBzdGFjayBhbGxvY2F0aW9uIHBhc3NlZCB0bworLy8vIGxsdm0ubG9jYWxlc2NhcGUuIEl0IGhhcyB0d28gYXJndW1lbnRzOiB0aGUgc3ltYm9sIGZvciB0aGUgbGFiZWwgYW5kIHRoZQorLy8vIGZyYW1lIGluZGV4IG9mIHRoZSBsb2NhbCBzdGFjayBhbGxvY2F0aW9uLgorSEFORExFX1RBUkdFVF9PUENPREUoTE9DQUxfRVNDQVBFKQorCisvLy8gV3JhcHMgYSBtYWNoaW5lIGluc3RydWN0aW9uIHdoaWNoIGNhbiBmYXVsdCwgYnVuZGxlZCB3aXRoIGFzc29jaWF0ZWQKKy8vLyBpbmZvcm1hdGlvbiBvbiBob3cgdG8gaGFuZGxlIHN1Y2ggYSBmYXVsdC4KKy8vLyBGb3IgZXhhbXBsZSBsb2FkaW5nIGluc3RydWN0aW9uIHRoYXQgbWF5IHBhZ2UgZmF1bHQsIGJ1bmRsZWQgd2l0aCBhc3NvY2lhdGVkCisvLy8gaW5mb3JtYXRpb24gb24gaG93IHRvIGhhbmRsZSBzdWNoIGEgcGFnZSBmYXVsdC4gIEl0IGlzIGludGVuZGVkIHRvIHN1cHBvcnQKKy8vLyAiemVybyBjb3N0IiBudWxsIGNoZWNrcyBpbiBtYW5hZ2VkIGxhbmd1YWdlcyBieSBhbGxvd2luZyBMTFZNIHRvIGZvbGQKKy8vLyBjb21wYXJpc29ucyBpbnRvIGV4aXN0aW5nIG1lbW9yeSBvcGVyYXRpb25zLgorSEFORExFX1RBUkdFVF9PUENPREUoRkFVTFRJTkdfT1ApCisKKy8vLyBXcmFwcyBhIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gdG8gYWRkIHBhdGNoYWJpbGl0eSBjb25zdHJhaW50cy4gIEFuCisvLy8gaW5zdHJ1Y3Rpb24gd3JhcHBlZCBpbiBQQVRDSEFCTEVfT1AgaGFzIHRvIGVpdGhlciBoYXZlIGEgbWluaW11bQorLy8vIHNpemUgb3IgYmUgcHJlY2VkZWQgd2l0aCBhIG5vcCBvZiB0aGF0IHNpemUuICBUaGUgZmlyc3Qgb3BlcmFuZCBpcworLy8vIGFuIGltbWVkaWF0ZSBkZW5vdGluZyB0aGUgbWluaW11bSBzaXplIG9mIHRoZSBpbnN0cnVjdGlvbiwgdGhlCisvLy8gc2Vjb25kIG9wZXJhbmQgaXMgYW4gaW1tZWRpYXRlIGRlbm90aW5nIHRoZSBvcGNvZGUgb2YgdGhlIG9yaWdpbmFsCisvLy8gaW5zdHJ1Y3Rpb24uICBUaGUgcmVzdCBvZiB0aGUgb3BlcmFuZHMgYXJlIHRoZSBvcGVyYW5kcyBvZiB0aGUKKy8vLyBvcmlnaW5hbCBpbnN0cnVjdGlvbi4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKFBBVENIQUJMRV9PUCkKKworLy8vIFRoaXMgaXMgYSBtYXJrZXIgaW5zdHJ1Y3Rpb24gd2hpY2ggZ2V0cyB0cmFuc2xhdGVkIGludG8gYSBub3Agc2xlZCwgdXNlZnVsCisvLy8gZm9yIGluc2VydGluZyBpbnN0cnVtZW50YXRpb24gaW5zdHJ1Y3Rpb25zIGF0IHJ1bnRpbWUuCitIQU5ETEVfVEFSR0VUX09QQ09ERShQQVRDSEFCTEVfRlVOQ1RJT05fRU5URVIpCisKKy8vLyBXcmFwcyBhIHJldHVybiBpbnN0cnVjdGlvbiBhbmQgaXRzIG9wZXJhbmRzIHRvIGVuYWJsZSBhZGRpbmcgbm9wIHNsZWRzCisvLy8gZWl0aGVyIGJlZm9yZSBvciBhZnRlciB0aGUgcmV0dXJuLiBUaGUgbm9wIHNsZWRzIGFyZSB1c2VmdWwgZm9yIGluc2VydGluZworLy8vIGluc3RydW1lbnRhdGlvbiBpbnN0cnVjdGlvbnMgYXQgcnVudGltZS4KKy8vLyBUaGUgcGF0Y2ggaGVyZSByZXBsYWNlcyB0aGUgcmV0dXJuIGluc3RydWN0aW9uLgorSEFORExFX1RBUkdFVF9PUENPREUoUEFUQ0hBQkxFX1JFVCkKKworLy8vIFRoaXMgaXMgYSBtYXJrZXIgaW5zdHJ1Y3Rpb24gd2hpY2ggZ2V0cyB0cmFuc2xhdGVkIGludG8gYSBub3Agc2xlZCwgdXNlZnVsCisvLy8gZm9yIGluc2VydGluZyBpbnN0cnVtZW50YXRpb24gaW5zdHJ1Y3Rpb25zIGF0IHJ1bnRpbWUuCisvLy8gVGhlIHBhdGNoIGhlcmUgcHJlcGVuZHMgdGhlIHJldHVybiBpbnN0cnVjdGlvbi4KKy8vLyBUaGUgc2FtZSB0aGluZyBhcyBpbiB4ODZfNjQgaXMgbm90IHBvc3NpYmxlIGZvciBBUk0gYmVjYXVzZSBpdCBoYXMgbXVsdGlwbGUKKy8vLyByZXR1cm4gaW5zdHJ1Y3Rpb25zLiBGdXJ0aGVybW9yZSwgQ1BVIGFsbG93cyBwYXJhbWV0cml6ZWQgYW5kIGV2ZW4KKy8vLyBjb25kaXRpb25hbCByZXR1cm4gaW5zdHJ1Y3Rpb25zLiBJbiB0aGUgY3VycmVudCBBUk0gaW1wbGVtZW50YXRpb24gd2UgYXJlCisvLy8gbWFraW5nIHVzZSBvZiB0aGUgZmFjdCB0aGF0IGN1cnJlbnRseSBMTFZNIGRvZXNuJ3Qgc2VlbSB0byBnZW5lcmF0ZQorLy8vIGNvbmRpdGlvbmFsIHJldHVybiBpbnN0cnVjdGlvbnMuCisvLy8gT24gQVJNLCB0aGUgc2FtZSBpbnN0cnVjdGlvbiBjYW4gYmUgdXNlZCBmb3IgcG9wcGluZyBtdWx0aXBsZSByZWdpc3RlcnMKKy8vLyBmcm9tIHRoZSBzdGFjayBhbmQgcmV0dXJuaW5nIChpdCBqdXN0IHBvcHMgcGMgcmVnaXN0ZXIgdG9vKSwgYW5kIExMVk0KKy8vLyBnZW5lcmF0ZXMgaXQgc29tZXRpbWVzLiBTbyB3ZSBjYW4ndCBpbnNlcnQgdGhlIHNsZWQgYmV0d2VlbiB0aGlzIHN0YWNrCisvLy8gYWRqdXN0bWVudCBhbmQgdGhlIHJldHVybiB3aXRob3V0IHNwbGl0dGluZyB0aGUgb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gaW50byAyCisvLy8gaW5zdHJ1Y3Rpb25zLiBTbyBvbiBBUk0sIHJhdGhlciB0aGFuIGp1bXBpbmcgaW50byB0aGUgZXhpdCB0cmFtcG9saW5lLCB3ZQorLy8vIGNhbGwgaXQsIGl0IGRvZXMgdGhlIHRyYWNpbmcsIHByZXNlcnZlcyB0aGUgc3RhY2sgYW5kIHJldHVybnMuCitIQU5ETEVfVEFSR0VUX09QQ09ERShQQVRDSEFCTEVfRlVOQ1RJT05fRVhJVCkKKworLy8vIFdyYXBzIGEgdGFpbCBjYWxsIGluc3RydWN0aW9uIGFuZCBpdHMgb3BlcmFuZHMgdG8gZW5hYmxlIGFkZGluZyBub3Agc2xlZHMKKy8vLyBlaXRoZXIgYmVmb3JlIG9yIGFmdGVyIHRoZSB0YWlsIGV4aXQuIFdlIHVzZSB0aGlzIGFzIGEgZGlzYW1iaWd1YXRpb24gZnJvbQorLy8vIFBBVENIQUJMRV9SRVQgd2hpY2ggc3BlY2lmaWNhbGx5IG9ubHkgd29ya3MgZm9yIHJldHVybiBpbnN0cnVjdGlvbnMuCitIQU5ETEVfVEFSR0VUX09QQ09ERShQQVRDSEFCTEVfVEFJTF9DQUxMKQorCisvLy8gV3JhcHMgYSBsb2dnaW5nIGNhbGwgYW5kIGl0cyBhcmd1bWVudHMgd2l0aCBub3Agc2xlZHMuIEF0IHJ1bnRpbWUsIHRoaXMgY2FuIGJlCisvLy8gcGF0Y2hlZCB0byBpbnNlcnQgaW5zdHJ1bWVudGF0aW9uIGluc3RydWN0aW9ucy4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKFBBVENIQUJMRV9FVkVOVF9DQUxMKQorCitIQU5ETEVfVEFSR0VUX09QQ09ERShJQ0FMTF9CUkFOQ0hfRlVOTkVMKQorCisvLy8gVGhlIGZvbGxvd2luZyBnZW5lcmljIG9wY29kZXMgYXJlIG5vdCBzdXBwb3NlZCB0byBhcHBlYXIgYWZ0ZXIgSVNlbC4KKy8vLyBUaGlzIGlzIHNvbWV0aGluZyB3ZSBtaWdodCB3YW50IHRvIHJlbGF4LCBidXQgZm9yIG5vdywgdGhpcyBpcyBjb252ZW5pZW50CisvLy8gdG8gcHJvZHVjZSBkaWFnbm9zdGljcy4KKworLy8vIEdlbmVyaWMgQUREIGluc3RydWN0aW9uLiBUaGlzIGlzIGFuIGludGVnZXIgYWRkLgorSEFORExFX1RBUkdFVF9PUENPREUoR19BREQpCitIQU5ETEVfVEFSR0VUX09QQ09ERV9NQVJLRVIoUFJFX0lTRUxfR0VORVJJQ19PUENPREVfU1RBUlQsIEdfQUREKQorCisvLy8gR2VuZXJpYyBTVUIgaW5zdHJ1Y3Rpb24uIFRoaXMgaXMgYW4gaW50ZWdlciBzdWIuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX1NVQikKKworLy8gR2VuZXJpYyBtdWx0aXBseSBpbnN0cnVjdGlvbi4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfTVVMKQorCisvLyBHZW5lcmljIHNpZ25lZCBkaXZpc2lvbiBpbnN0cnVjdGlvbi4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfU0RJVikKKworLy8gR2VuZXJpYyB1bnNpZ25lZCBkaXZpc2lvbiBpbnN0cnVjdGlvbi4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfVURJVikKKworLy8gR2VuZXJpYyBzaWduZWQgcmVtYWluZGVyIGluc3RydWN0aW9uLgorSEFORExFX1RBUkdFVF9PUENPREUoR19TUkVNKQorCisvLyBHZW5lcmljIHVuc2lnbmVkIHJlbWFpbmRlciBpbnN0cnVjdGlvbi4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfVVJFTSkKKworLy8vIEdlbmVyaWMgYml0d2lzZSBhbmQgaW5zdHJ1Y3Rpb24uCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0FORCkKKworLy8vIEdlbmVyaWMgYml0d2lzZSBvciBpbnN0cnVjdGlvbi4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfT1IpCisKKy8vLyBHZW5lcmljIGJpdHdpc2UgZXhjbHVzaXZlLW9yIGluc3RydWN0aW9uLgorSEFORExFX1RBUkdFVF9PUENPREUoR19YT1IpCisKKworSEFORExFX1RBUkdFVF9PUENPREUoR19JTVBMSUNJVF9ERUYpCisKKy8vLyBHZW5lcmljIFBISSBpbnN0cnVjdGlvbiB3aXRoIHR5cGVzLgorSEFORExFX1RBUkdFVF9PUENPREUoR19QSEkpCisKKy8vLyBHZW5lcmljIGluc3RydWN0aW9uIHRvIG1hdGVyaWFsaXplIHRoZSBhZGRyZXNzIG9mIGFuIGFsbG9jYSBvciBvdGhlcgorLy8vIHN0YWNrLWJhc2VkIG9iamVjdC4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfRlJBTUVfSU5ERVgpCisKKy8vLyBHZW5lcmljIHJlZmVyZW5jZSB0byBnbG9iYWwgdmFsdWUuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0dMT0JBTF9WQUxVRSkKKworLy8vIEdlbmVyaWMgaW5zdHJ1Y3Rpb24gdG8gZXh0cmFjdCBibG9ja3Mgb2YgYml0cyBmcm9tIHRoZSByZWdpc3RlciBnaXZlbgorLy8vICh0eXBpY2FsbHkgYSBzdWItcmVnaXN0ZXIgQ09QWSBhZnRlciBpbnN0cnVjdGlvbiBzZWxlY3Rpb24pLgorSEFORExFX1RBUkdFVF9PUENPREUoR19FWFRSQUNUKQorCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX1VOTUVSR0VfVkFMVUVTKQorCisvLy8gR2VuZXJpYyBpbnN0cnVjdGlvbiB0byBpbnNlcnQgYmxvY2tzIG9mIGJpdHMgZnJvbSB0aGUgcmVnaXN0ZXJzIGdpdmVuIGludG8KKy8vLyB0aGUgc291cmNlLgorSEFORExFX1RBUkdFVF9PUENPREUoR19JTlNFUlQpCisKKy8vLyBHZW5lcmljIGluc3RydWN0aW9uIHRvIHBhc3RlIGEgdmFyaWFibGUgbnVtYmVyIG9mIGNvbXBvbmVudHMgdG9nZXRoZXIgaW50byBhCisvLy8gbGFyZ2VyIHJlZ2lzdGVyLgorSEFORExFX1RBUkdFVF9PUENPREUoR19NRVJHRV9WQUxVRVMpCisKKy8vLyBHZW5lcmljIHBvaW50ZXIgdG8gaW50IGNvbnZlcnNpb24uCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX1BUUlRPSU5UKQorCisvLy8gR2VuZXJpYyBpbnQgdG8gcG9pbnRlciBjb252ZXJzaW9uLgorSEFORExFX1RBUkdFVF9PUENPREUoR19JTlRUT1BUUikKKworLy8vIEdlbmVyaWMgYml0Y2FzdC4gVGhlIHNvdXJjZSBhbmQgZGVzdGluYXRpb24gdHlwZXMgbXVzdCBiZSBkaWZmZXJlbnQsIG9yIGEKKy8vLyBDT1BZIGlzIHRoZSByZWxldmFudCBpbnN0cnVjdGlvbi4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfQklUQ0FTVCkKKworLy8vIEdlbmVyaWMgbG9hZC4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfTE9BRCkKKworLy8vIEdlbmVyaWMgc3RvcmUuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX1NUT1JFKQorCisvLy8gR2VuZXJpYyBhdG9taWMgY21weGNoZyB3aXRoIGludGVybmFsIHN1Y2Nlc3MgY2hlY2suCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0FUT01JQ19DTVBYQ0hHX1dJVEhfU1VDQ0VTUykKKworLy8vIEdlbmVyaWMgYXRvbWljIGNtcHhjaGcuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0FUT01JQ19DTVBYQ0hHKQorCisvLy8gR2VuZXJpYyBhdG9taWNybXcuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0FUT01JQ1JNV19YQ0hHKQorSEFORExFX1RBUkdFVF9PUENPREUoR19BVE9NSUNSTVdfQUREKQorSEFORExFX1RBUkdFVF9PUENPREUoR19BVE9NSUNSTVdfU1VCKQorSEFORExFX1RBUkdFVF9PUENPREUoR19BVE9NSUNSTVdfQU5EKQorSEFORExFX1RBUkdFVF9PUENPREUoR19BVE9NSUNSTVdfTkFORCkKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfQVRPTUlDUk1XX09SKQorSEFORExFX1RBUkdFVF9PUENPREUoR19BVE9NSUNSTVdfWE9SKQorSEFORExFX1RBUkdFVF9PUENPREUoR19BVE9NSUNSTVdfTUFYKQorSEFORExFX1RBUkdFVF9PUENPREUoR19BVE9NSUNSTVdfTUlOKQorSEFORExFX1RBUkdFVF9PUENPREUoR19BVE9NSUNSTVdfVU1BWCkKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfQVRPTUlDUk1XX1VNSU4pCisKKy8vLyBHZW5lcmljIGNvbmRpdGlvbmFsIGJyYW5jaCBpbnN0cnVjdGlvbi4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfQlJDT05EKQorCisvLy8gR2VuZXJpYyBpbmRpcmVjdCBicmFuY2ggaW5zdHJ1Y3Rpb24uCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0JSSU5ESVJFQ1QpCisKKy8vLyBHZW5lcmljIGludHJpbnNpYyB1c2UgKHdpdGhvdXQgc2lkZSBlZmZlY3RzKS4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfSU5UUklOU0lDKQorCisvLy8gR2VuZXJpYyBpbnRyaW5zaWMgdXNlICh3aXRoIHNpZGUgZWZmZWN0cykuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0lOVFJJTlNJQ19XX1NJREVfRUZGRUNUUykKKworLy8vIEdlbmVyaWMgZXh0ZW5zaW9uIGFsbG93aW5nIHJ1YmJpc2ggaW4gaGlnaCBiaXRzLgorSEFORExFX1RBUkdFVF9PUENPREUoR19BTllFWFQpCisKKy8vLyBHZW5lcmljIGluc3RydWN0aW9uIHRvIGRpc2NhcmQgdGhlIGhpZ2ggYml0cyBvZiBhIHJlZ2lzdGVyLiBUaGlzIGRpZmZlcnMKKy8vLyBmcm9tIChHX0VYVFJBQ1QgdmFsLCAwKSBvbiBpdHMgYWN0aW9uIG9uIHZlY3RvcnM6IEdfVFJVTkMgd2lsbCB0cnVuY2F0ZQorLy8vIGVhY2ggZWxlbWVudCBpbmRpdmlkdWFsbHksIEdfRVhUUkFDVCB3aWxsIHR5cGljYWxseSBkaXNjYXJkIHRoZSBoaWdoCisvLy8gZWxlbWVudHMgb2YgdGhlIHZlY3Rvci4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfVFJVTkMpCisKKy8vLyBHZW5lcmljIGludGVnZXIgY29uc3RhbnQuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0NPTlNUQU5UKQorCisvLy8gR2VuZXJpYyBmbG9hdGluZyBjb25zdGFudC4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfRkNPTlNUQU5UKQorCisvLy8gR2VuZXJpYyB2YV9zdGFydCBpbnN0cnVjdGlvbi4gU3RvcmVzIHRvIGl0cyBvbmUgcG9pbnRlciBvcGVyYW5kLgorSEFORExFX1RBUkdFVF9PUENPREUoR19WQVNUQVJUKQorCisvLy8gR2VuZXJpYyB2YV9zdGFydCBpbnN0cnVjdGlvbi4gU3RvcmVzIHRvIGl0cyBvbmUgcG9pbnRlciBvcGVyYW5kLgorSEFORExFX1RBUkdFVF9PUENPREUoR19WQUFSRykKKworLy8gR2VuZXJpYyBzaWduIGV4dGVuZAorSEFORExFX1RBUkdFVF9PUENPREUoR19TRVhUKQorCisvLyBHZW5lcmljIHplcm8gZXh0ZW5kCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX1pFWFQpCisKKy8vIEdlbmVyaWMgbGVmdC1zaGlmdAorSEFORExFX1RBUkdFVF9PUENPREUoR19TSEwpCisKKy8vIEdlbmVyaWMgbG9naWNhbCByaWdodC1zaGlmdAorSEFORExFX1RBUkdFVF9PUENPREUoR19MU0hSKQorCisvLyBHZW5lcmljIGFyaXRobWV0aWMgcmlnaHQtc2hpZnQKK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfQVNIUikKKworLy8vIEdlbmVyaWMgaW50ZWdlci1iYXNlIGNvbXBhcmlzb24sIGFsc28gYXBwbGljYWJsZSB0byB2ZWN0b3JzIG9mIGludGVnZXJzLgorSEFORExFX1RBUkdFVF9PUENPREUoR19JQ01QKQorCisvLy8gR2VuZXJpYyBmbG9hdGluZy1wb2ludCBjb21wYXJpc29uLCBhbHNvIGFwcGxpY2FibGUgdG8gdmVjdG9ycy4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfRkNNUCkKKworLy8vIEdlbmVyaWMgc2VsZWN0LgorSEFORExFX1RBUkdFVF9PUENPREUoR19TRUxFQ1QpCisKKy8vLyBHZW5lcmljIHVuc2lnbmVkIGFkZCBpbnN0cnVjdGlvbiwgY29uc3VtaW5nIHRoZSBub3JtYWwgb3BlcmFuZHMgcGx1cyBhIGNhcnJ5CisvLy8gZmxhZywgYW5kIHNpbWlsYXJseSBwcm9kdWNpbmcgdGhlIHJlc3VsdCBhbmQgYSBjYXJyeSBmbGFnLgorSEFORExFX1RBUkdFVF9PUENPREUoR19VQURERSkKKworLy8vIEdlbmVyaWMgdW5zaWduZWQgc3VidHJhY3QgaW5zdHJ1Y3Rpb24sIGNvbnN1bWluZyB0aGUgbm9ybWFsIG9wZXJhbmRzIHBsdXMgYQorLy8vIGNhcnJ5IGZsYWcsIGFuZCBzaW1pbGFybHkgcHJvZHVjaW5nIHRoZSByZXN1bHQgYW5kIGEgY2FycnkgZmxhZy4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfVVNVQkUpCisKKy8vLyBHZW5lcmljIHNpZ25lZCBhZGQgaW5zdHJ1Y3Rpb24sIHByb2R1Y2luZyB0aGUgcmVzdWx0IGFuZCBhIHNpZ25lZCBvdmVyZmxvdworLy8vIGZsYWcuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX1NBRERPKQorCisvLy8gR2VuZXJpYyBzaWduZWQgc3VidHJhY3QgaW5zdHJ1Y3Rpb24sIHByb2R1Y2luZyB0aGUgcmVzdWx0IGFuZCBhIHNpZ25lZAorLy8vIG92ZXJmbG93IGZsYWcuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX1NTVUJPKQorCisvLy8gR2VuZXJpYyB1bnNpZ25lZCBtdWx0aXBseSBpbnN0cnVjdGlvbiwgcHJvZHVjaW5nIHRoZSByZXN1bHQgYW5kIGEgc2lnbmVkCisvLy8gb3ZlcmZsb3cgZmxhZy4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfVU1VTE8pCisKKy8vLyBHZW5lcmljIHNpZ25lZCBtdWx0aXBseSBpbnN0cnVjdGlvbiwgcHJvZHVjaW5nIHRoZSByZXN1bHQgYW5kIGEgc2lnbmVkCisvLy8gb3ZlcmZsb3cgZmxhZy4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfU01VTE8pCisKKy8vIE11bHRpcGx5IHR3byBudW1iZXJzIGF0IHR3aWNlIHRoZSBpbmNvbWluZyBiaXQgd2lkdGggKHVuc2lnbmVkKSBhbmQgcmV0dXJuCisvLyB0aGUgaGlnaCBoYWxmIG9mIHRoZSByZXN1bHQuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX1VNVUxIKQorCisvLyBNdWx0aXBseSB0d28gbnVtYmVycyBhdCB0d2ljZSB0aGUgaW5jb21pbmcgYml0IHdpZHRoIChzaWduZWQpIGFuZCByZXR1cm4KKy8vIHRoZSBoaWdoIGhhbGYgb2YgdGhlIHJlc3VsdC4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfU01VTEgpCisKKy8vLyBHZW5lcmljIEZQIGFkZGl0aW9uLgorSEFORExFX1RBUkdFVF9PUENPREUoR19GQUREKQorCisvLy8gR2VuZXJpYyBGUCBzdWJ0cmFjdGlvbi4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfRlNVQikKKworLy8vIEdlbmVyaWMgRlAgbXVsdGlwbGljYXRpb24uCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0ZNVUwpCisKKy8vLyBHZW5lcmljIEZNQSBtdWx0aXBsaWNhdGlvbi4gQmVoYXZlcyBsaWtlIGxsdm0gZm1hIGludHJpbnNpYworSEFORExFX1RBUkdFVF9PUENPREUoR19GTUEpCisKKy8vLyBHZW5lcmljIEZQIGRpdmlzaW9uLgorSEFORExFX1RBUkdFVF9PUENPREUoR19GRElWKQorCisvLy8gR2VuZXJpYyBGUCByZW1haW5kZXIuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0ZSRU0pCisKKy8vLyBHZW5lcmljIEZQIGV4cG9uZW50aWF0aW9uLgorSEFORExFX1RBUkdFVF9PUENPREUoR19GUE9XKQorCisvLy8gR2VuZXJpYyBiYXNlLWUgZXhwb25lbnRpYWwgb2YgYSB2YWx1ZS4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfRkVYUCkKKworLy8vIEdlbmVyaWMgYmFzZS0yIGV4cG9uZW50aWFsIG9mIGEgdmFsdWUuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0ZFWFAyKQorCisvLy8gRmxvYXRpbmcgcG9pbnQgYmFzZS1lIGxvZ2FyaXRobSBvZiBhIHZhbHVlLgorSEFORExFX1RBUkdFVF9PUENPREUoR19GTE9HKQorCisvLy8gRmxvYXRpbmcgcG9pbnQgYmFzZS0yIGxvZ2FyaXRobSBvZiBhIHZhbHVlLgorSEFORExFX1RBUkdFVF9PUENPREUoR19GTE9HMikKKworLy8vIEdlbmVyaWMgRlAgbmVnYXRpb24uCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0ZORUcpCisKKy8vLyBHZW5lcmljIEZQIGV4dGVuc2lvbi4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfRlBFWFQpCisKKy8vLyBHZW5lcmljIGZsb2F0IHRvIHNpZ25lZC1pbnQgY29udmVyc2lvbgorSEFORExFX1RBUkdFVF9PUENPREUoR19GUFRSVU5DKQorCisvLy8gR2VuZXJpYyBmbG9hdCB0byBzaWduZWQtaW50IGNvbnZlcnNpb24KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfRlBUT1NJKQorCisvLy8gR2VuZXJpYyBmbG9hdCB0byB1bnNpZ25lZC1pbnQgY29udmVyc2lvbgorSEFORExFX1RBUkdFVF9PUENPREUoR19GUFRPVUkpCisKKy8vLyBHZW5lcmljIHNpZ25lZC1pbnQgdG8gZmxvYXQgY29udmVyc2lvbgorSEFORExFX1RBUkdFVF9PUENPREUoR19TSVRPRlApCisKKy8vLyBHZW5lcmljIHVuc2lnbmVkLWludCB0byBmbG9hdCBjb252ZXJzaW9uCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX1VJVE9GUCkKKworLy8vIEdlbmVyaWMgRlAgYWJzb2x1dGUgdmFsdWUuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0ZBQlMpCisKKy8vLyBHZW5lcmljIHBvaW50ZXIgb2Zmc2V0CitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0dFUCkKKworLy8vIENsZWFyIHRoZSBzcGVjaWZpZWQgbnVtYmVyIG9mIGxvdyBiaXRzIGluIGEgcG9pbnRlci4gVGhpcyByb3VuZHMgdGhlIHZhbHVlCisvLy8gKmRvd24qIHRvIHRoZSBnaXZlbiBhbGlnbm1lbnQuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX1BUUl9NQVNLKQorCisvLy8gR2VuZXJpYyBCUkFOQ0ggaW5zdHJ1Y3Rpb24uIFRoaXMgaXMgYW4gdW5jb25kaXRpb25hbCBicmFuY2guCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0JSKQorCisvLy8gR2VuZXJpYyBpbnNlcnRlbGVtZW50LgorSEFORExFX1RBUkdFVF9PUENPREUoR19JTlNFUlRfVkVDVE9SX0VMVCkKKworLy8vIEdlbmVyaWMgZXh0cmFjdGVsZW1lbnQuCitIQU5ETEVfVEFSR0VUX09QQ09ERShHX0VYVFJBQ1RfVkVDVE9SX0VMVCkKKworLy8vIEdlbmVyaWMgc2h1ZmZsZXZlY3Rvci4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfU0hVRkZMRV9WRUNUT1IpCisKKy8vLyBHZW5lcmljIGJ5dGUgc3dhcC4KK0hBTkRMRV9UQVJHRVRfT1BDT0RFKEdfQlNXQVApCisKKy8vIFRPRE86IEFkZCBtb3JlIGdlbmVyaWMgb3Bjb2RlcyBhcyB3ZSBtb3ZlIGFsb25nLgorCisvLy8gTWFya2VyIGZvciB0aGUgZW5kIG9mIHRoZSBnZW5lcmljIG9wY29kZS4KKy8vLyBUaGlzIGlzIHVzZWQgdG8gY2hlY2sgaWYgYW4gb3Bjb2RlIGlzIGluIHRoZSByYW5nZSBvZiB0aGUKKy8vLyBnZW5lcmljIG9wY29kZXMuCitIQU5ETEVfVEFSR0VUX09QQ09ERV9NQVJLRVIoUFJFX0lTRUxfR0VORVJJQ19PUENPREVfRU5ELCBHX0JTV0FQKQorCisvLy8gQlVJTFRJTl9PUF9FTkQgLSBUaGlzIG11c3QgYmUgdGhlIGxhc3QgZW51bSB2YWx1ZSBpbiB0aGlzIGxpc3QuCisvLy8gVGhlIHRhcmdldC1zcGVjaWZpYyBwb3N0LWlzZWwgb3Bjb2RlIHZhbHVlcyBzdGFydCBoZXJlLgorSEFORExFX1RBUkdFVF9PUENPREVfTUFSS0VSKEdFTkVSSUNfT1BfRU5ELCBQUkVfSVNFTF9HRU5FUklDX09QQ09ERV9FTkQpCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVGFyZ2V0UGFyc2VyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVGFyZ2V0UGFyc2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGZiYTk5NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UYXJnZXRQYXJzZXIuaApAQCAtMCwwICsxLDI2MiBAQAorLy89PT0tLSBUYXJnZXRQYXJzZXIgLSBQYXJzZXIgZm9yIHRhcmdldCBmZWF0dXJlcyAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIHRhcmdldCBwYXJzZXIgdG8gcmVjb2duaXNlIGhhcmR3YXJlIGZlYXR1cmVzIHN1Y2ggYXMKKy8vIEZQVS9DUFUvQVJDSCBuYW1lcyBhcyB3ZWxsIGFzIHNwZWNpZmljIHN1cHBvcnQgc3VjaCBhcyBIRElWLCBldGMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfVEFSR0VUUEFSU0VSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1RBUkdFVFBBUlNFUl9ICisKKy8vIEZJWE1FOiB2ZWN0b3IgaXMgdXNlZCBiZWNhdXNlIHRoYXQncyB3aGF0IGNsYW5nIHVzZXMgZm9yIHN1YnRhcmdldCBmZWF0dXJlCisvLyBsaXN0cywgYnV0IFNtYWxsVmVjdG9yIHdvdWxkIHByb2JhYmx5IGJlIGJldHRlcgorI2luY2x1ZGUgImxsdm0vQURUL1RyaXBsZS5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgU3RyaW5nUmVmOworCisvLyBUYXJnZXQgc3BlY2lmaWMgaW5mb3JtYXRpb24gaW50byB0aGVpciBvd24gbmFtZXNwYWNlcy4gVGhlc2Ugc2hvdWxkIGJlCisvLyBnZW5lcmF0ZWQgZnJvbSBUYWJsZUdlbiBiZWNhdXNlIHRoZSBpbmZvcm1hdGlvbiBpcyBhbHJlYWR5IHRoZXJlLCBhbmQgdGhlcmUKKy8vIGlzIHdoZXJlIG5ldyBpbmZvcm1hdGlvbiBhYm91dCB0YXJnZXRzIHdpbGwgYmUgYWRkZWQuCisvLyBGSVhNRTogVG8gVGFibGVHZW4gdGhpcyB3ZSBuZWVkIHRvIG1ha2Ugc29tZSB0YWJsZSBnZW5lcmF0ZWQgZmlsZXMgYXZhaWxhYmxlCisvLyBldmVuIGlmIHRoZSBiYWNrLWVuZCBpcyBub3QgY29tcGlsZWQgd2l0aCBMTFZNLCBwbHVzIHdlIG5lZWQgdG8gY3JlYXRlIGEgbmV3CisvLyBiYWNrLWVuZCB0byBUYWJsZUdlbiB0byBjcmVhdGUgdGhlc2UgY2xlYW4gdGFibGVzLgorbmFtZXNwYWNlIEFSTSB7CisKKy8vIEZQVSBWZXJzaW9uCitlbnVtIGNsYXNzIEZQVVZlcnNpb24geworICBOT05FLAorICBWRlBWMiwKKyAgVkZQVjMsCisgIFZGUFYzX0ZQMTYsCisgIFZGUFY0LAorICBWRlBWNQorfTsKKworLy8gQW4gRlBVIG5hbWUgcmVzdHJpY3RzIHRoZSBGUFUgaW4gb25lIG9mIHRocmVlIHdheXM6CitlbnVtIGNsYXNzIEZQVVJlc3RyaWN0aW9uIHsKKyAgTm9uZSA9IDAsIC8vLzwgTm8gcmVzdHJpY3Rpb24KKyAgRDE2LCAgICAgIC8vLzwgT25seSAxNiBEIHJlZ2lzdGVycworICBTUF9EMTYgICAgLy8vPCBPbmx5IHNpbmdsZS1wcmVjaXNpb24gaW5zdHJ1Y3Rpb25zLCB3aXRoIDE2IEQgcmVnaXN0ZXJzCit9OworCisvLyBBbiBGUFUgbmFtZSBpbXBsaWVzIG9uZSBvZiB0aHJlZSBsZXZlbHMgb2YgTmVvbiBzdXBwb3J0OgorZW51bSBjbGFzcyBOZW9uU3VwcG9ydExldmVsIHsKKyAgTm9uZSA9IDAsIC8vLzwgTm8gTmVvbgorICBOZW9uLCAgICAgLy8vPCBOZW9uCisgIENyeXB0byAgICAvLy88IE5lb24gd2l0aCBDcnlwdG8KK307CisKKy8vIEZQVSBuYW1lcy4KK2VudW0gRlBVS2luZCB7CisjZGVmaW5lIEFSTV9GUFUoTkFNRSwgS0lORCwgVkVSU0lPTiwgTkVPTl9TVVBQT1JULCBSRVNUUklDVElPTikgS0lORCwKKyNpbmNsdWRlICJBUk1UYXJnZXRQYXJzZXIuZGVmIgorICBGS19MQVNUCit9OworCisvLyBBcmNoIG5hbWVzLgorZW51bSBjbGFzcyBBcmNoS2luZCB7CisjZGVmaW5lIEFSTV9BUkNIKE5BTUUsIElELCBDUFVfQVRUUiwgU1VCX0FSQ0gsIEFSQ0hfQVRUUiwgQVJDSF9GUFUsIEFSQ0hfQkFTRV9FWFQpIElELAorI2luY2x1ZGUgIkFSTVRhcmdldFBhcnNlci5kZWYiCit9OworCisvLyBBcmNoIGV4dGVuc2lvbiBtb2RpZmllcnMgZm9yIENQVXMuCitlbnVtIEFyY2hFeHRLaW5kIDogdW5zaWduZWQgeworICBBRUtfSU5WQUxJRCA9ICAgICAwLAorICBBRUtfTk9ORSA9ICAgICAgICAxLAorICBBRUtfQ1JDID0gICAgICAgICAxIDw8IDEsCisgIEFFS19DUllQVE8gPSAgICAgIDEgPDwgMiwKKyAgQUVLX0ZQID0gICAgICAgICAgMSA8PCAzLAorICBBRUtfSFdESVZUSFVNQiA9ICAxIDw8IDQsCisgIEFFS19IV0RJVkFSTSA9ICAgIDEgPDwgNSwKKyAgQUVLX01QID0gICAgICAgICAgMSA8PCA2LAorICBBRUtfU0lNRCA9ICAgICAgICAxIDw8IDcsCisgIEFFS19TRUMgPSAgICAgICAgIDEgPDwgOCwKKyAgQUVLX1ZJUlQgPSAgICAgICAgMSA8PCA5LAorICBBRUtfRFNQID0gICAgICAgICAxIDw8IDEwLAorICBBRUtfRlAxNiA9ICAgICAgICAxIDw8IDExLAorICBBRUtfUkFTID0gICAgICAgICAxIDw8IDEyLAorICBBRUtfU1ZFID0gICAgICAgICAxIDw8IDEzLAorICBBRUtfRE9UUFJPRCA9ICAgICAxIDw8IDE0LAorICAvLyBVbnN1cHBvcnRlZCBleHRlbnNpb25zLgorICBBRUtfT1MgPSAweDgwMDAwMDAsCisgIEFFS19JV01NWFQgPSAweDEwMDAwMDAwLAorICBBRUtfSVdNTVhUMiA9IDB4MjAwMDAwMDAsCisgIEFFS19NQVZFUklDSyA9IDB4NDAwMDAwMDAsCisgIEFFS19YU0NBTEUgPSAweDgwMDAwMDAwLAorfTsKKworLy8gSVNBIGtpbmRzLgorZW51bSBjbGFzcyBJU0FLaW5kIHsgSU5WQUxJRCA9IDAsIEFSTSwgVEhVTUIsIEFBUkNINjQgfTsKKworLy8gRW5kaWFubmVzcworLy8gRklYTUU6IEJFOCB2cy4gQkUzMj8KK2VudW0gY2xhc3MgRW5kaWFuS2luZCB7IElOVkFMSUQgPSAwLCBMSVRUTEUsIEJJRyB9OworCisvLyB2Ni92Ny92OCBQcm9maWxlCitlbnVtIGNsYXNzIFByb2ZpbGVLaW5kIHsgSU5WQUxJRCA9IDAsIEEsIFIsIE0gfTsKKworU3RyaW5nUmVmIGdldENhbm9uaWNhbEFyY2hOYW1lKFN0cmluZ1JlZiBBcmNoKTsKKworLy8gSW5mb3JtYXRpb24gYnkgSUQKK1N0cmluZ1JlZiBnZXRGUFVOYW1lKHVuc2lnbmVkIEZQVUtpbmQpOworRlBVVmVyc2lvbiBnZXRGUFVWZXJzaW9uKHVuc2lnbmVkIEZQVUtpbmQpOworTmVvblN1cHBvcnRMZXZlbCBnZXRGUFVOZW9uU3VwcG9ydExldmVsKHVuc2lnbmVkIEZQVUtpbmQpOworRlBVUmVzdHJpY3Rpb24gZ2V0RlBVUmVzdHJpY3Rpb24odW5zaWduZWQgRlBVS2luZCk7CisKKy8vIEZJWE1FOiBUaGVzZSBzaG91bGQgYmUgbW92ZWQgdG8gVGFyZ2V0VHVwbGUgb25jZSBpdCBleGlzdHMKK2Jvb2wgZ2V0RlBVRmVhdHVyZXModW5zaWduZWQgRlBVS2luZCwgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiAmRmVhdHVyZXMpOworYm9vbCBnZXRIV0RpdkZlYXR1cmVzKHVuc2lnbmVkIEhXRGl2S2luZCwgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiAmRmVhdHVyZXMpOworYm9vbCBnZXRFeHRlbnNpb25GZWF0dXJlcyh1bnNpZ25lZCBFeHRlbnNpb25zLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+ICZGZWF0dXJlcyk7CisKK1N0cmluZ1JlZiBnZXRBcmNoTmFtZShBcmNoS2luZCBBSyk7Cit1bnNpZ25lZCBnZXRBcmNoQXR0cihBcmNoS2luZCBBSyk7CitTdHJpbmdSZWYgZ2V0Q1BVQXR0cihBcmNoS2luZCBBSyk7CitTdHJpbmdSZWYgZ2V0U3ViQXJjaChBcmNoS2luZCBBSyk7CitTdHJpbmdSZWYgZ2V0QXJjaEV4dE5hbWUodW5zaWduZWQgQXJjaEV4dEtpbmQpOworU3RyaW5nUmVmIGdldEFyY2hFeHRGZWF0dXJlKFN0cmluZ1JlZiBBcmNoRXh0KTsKK1N0cmluZ1JlZiBnZXRIV0Rpdk5hbWUodW5zaWduZWQgSFdEaXZLaW5kKTsKKworLy8gSW5mb3JtYXRpb24gYnkgTmFtZQordW5zaWduZWQgIGdldERlZmF1bHRGUFUoU3RyaW5nUmVmIENQVSwgQXJjaEtpbmQgQUspOwordW5zaWduZWQgIGdldERlZmF1bHRFeHRlbnNpb25zKFN0cmluZ1JlZiBDUFUsIEFyY2hLaW5kIEFLKTsKK1N0cmluZ1JlZiBnZXREZWZhdWx0Q1BVKFN0cmluZ1JlZiBBcmNoKTsKKworLy8gUGFyc2VyCit1bnNpZ25lZCBwYXJzZUhXRGl2KFN0cmluZ1JlZiBIV0Rpdik7Cit1bnNpZ25lZCBwYXJzZUZQVShTdHJpbmdSZWYgRlBVKTsKK0FyY2hLaW5kIHBhcnNlQXJjaChTdHJpbmdSZWYgQXJjaCk7Cit1bnNpZ25lZCBwYXJzZUFyY2hFeHQoU3RyaW5nUmVmIEFyY2hFeHQpOworQXJjaEtpbmQgcGFyc2VDUFVBcmNoKFN0cmluZ1JlZiBDUFUpOwordm9pZCBmaWxsVmFsaWRDUFVBcmNoTGlzdChTbWFsbFZlY3RvckltcGw8U3RyaW5nUmVmPiAmVmFsdWVzKTsKK0lTQUtpbmQgcGFyc2VBcmNoSVNBKFN0cmluZ1JlZiBBcmNoKTsKK0VuZGlhbktpbmQgcGFyc2VBcmNoRW5kaWFuKFN0cmluZ1JlZiBBcmNoKTsKK1Byb2ZpbGVLaW5kIHBhcnNlQXJjaFByb2ZpbGUoU3RyaW5nUmVmIEFyY2gpOwordW5zaWduZWQgcGFyc2VBcmNoVmVyc2lvbihTdHJpbmdSZWYgQXJjaCk7CisKK1N0cmluZ1JlZiBjb21wdXRlRGVmYXVsdFRhcmdldEFCSShjb25zdCBUcmlwbGUgJlRULCBTdHJpbmdSZWYgQ1BVKTsKKworfSAvLyBuYW1lc3BhY2UgQVJNCisKKy8vIEZJWE1FOlRoaXMgc2hvdWxkIGJlIG1hZGUgaW50byBjbGFzcyBkZXNpZ24sdG8gYXZvaWQgZHVwcGxpY2F0aW9uLgorbmFtZXNwYWNlIEFBcmNoNjQgeworCisvLyBBcmNoIG5hbWVzLgorZW51bSBjbGFzcyBBcmNoS2luZCB7CisjZGVmaW5lIEFBUkNINjRfQVJDSChOQU1FLCBJRCwgQ1BVX0FUVFIsIFNVQl9BUkNILCBBUkNIX0FUVFIsIEFSQ0hfRlBVLCBBUkNIX0JBU0VfRVhUKSBJRCwKKyNpbmNsdWRlICJBQXJjaDY0VGFyZ2V0UGFyc2VyLmRlZiIKK307CisKKy8vIEFyY2ggZXh0ZW5zaW9uIG1vZGlmaWVycyBmb3IgQ1BVcy4KK2VudW0gQXJjaEV4dEtpbmQgOiB1bnNpZ25lZCB7CisgIEFFS19JTlZBTElEID0gICAgIDAsCisgIEFFS19OT05FID0gICAgICAgIDEsCisgIEFFS19DUkMgPSAgICAgICAgIDEgPDwgMSwKKyAgQUVLX0NSWVBUTyA9ICAgICAgMSA8PCAyLAorICBBRUtfRlAgPSAgICAgICAgICAxIDw8IDMsCisgIEFFS19TSU1EID0gICAgICAgIDEgPDwgNCwKKyAgQUVLX0ZQMTYgPSAgICAgICAgMSA8PCA1LAorICBBRUtfUFJPRklMRSA9ICAgICAxIDw8IDYsCisgIEFFS19SQVMgPSAgICAgICAgIDEgPDwgNywKKyAgQUVLX0xTRSA9ICAgICAgICAgMSA8PCA4LAorICBBRUtfU1ZFID0gICAgICAgICAxIDw8IDksCisgIEFFS19ET1RQUk9EID0gICAgIDEgPDwgMTAsCisgIEFFS19SQ1BDID0gICAgICAgIDEgPDwgMTEsCisgIEFFS19SRE0gPSAgICAgICAgIDEgPDwgMTIKK307CisKK1N0cmluZ1JlZiBnZXRDYW5vbmljYWxBcmNoTmFtZShTdHJpbmdSZWYgQXJjaCk7CisKKy8vIEluZm9ybWF0aW9uIGJ5IElECitTdHJpbmdSZWYgZ2V0RlBVTmFtZSh1bnNpZ25lZCBGUFVLaW5kKTsKK0FSTTo6RlBVVmVyc2lvbiBnZXRGUFVWZXJzaW9uKHVuc2lnbmVkIEZQVUtpbmQpOworQVJNOjpOZW9uU3VwcG9ydExldmVsIGdldEZQVU5lb25TdXBwb3J0TGV2ZWwodW5zaWduZWQgRlBVS2luZCk7CitBUk06OkZQVVJlc3RyaWN0aW9uIGdldEZQVVJlc3RyaWN0aW9uKHVuc2lnbmVkIEZQVUtpbmQpOworCisvLyBGSVhNRTogVGhlc2Ugc2hvdWxkIGJlIG1vdmVkIHRvIFRhcmdldFR1cGxlIG9uY2UgaXQgZXhpc3RzCitib29sIGdldEZQVUZlYXR1cmVzKHVuc2lnbmVkIEZQVUtpbmQsIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gJkZlYXR1cmVzKTsKK2Jvb2wgZ2V0RXh0ZW5zaW9uRmVhdHVyZXModW5zaWduZWQgRXh0ZW5zaW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiAmRmVhdHVyZXMpOworYm9vbCBnZXRBcmNoRmVhdHVyZXMoQXJjaEtpbmQgQUssIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gJkZlYXR1cmVzKTsKKworU3RyaW5nUmVmIGdldEFyY2hOYW1lKEFyY2hLaW5kIEFLKTsKK3Vuc2lnbmVkIGdldEFyY2hBdHRyKEFyY2hLaW5kIEFLKTsKK1N0cmluZ1JlZiBnZXRDUFVBdHRyKEFyY2hLaW5kIEFLKTsKK1N0cmluZ1JlZiBnZXRTdWJBcmNoKEFyY2hLaW5kIEFLKTsKK1N0cmluZ1JlZiBnZXRBcmNoRXh0TmFtZSh1bnNpZ25lZCBBcmNoRXh0S2luZCk7CitTdHJpbmdSZWYgZ2V0QXJjaEV4dEZlYXR1cmUoU3RyaW5nUmVmIEFyY2hFeHQpOwordW5zaWduZWQgY2hlY2tBcmNoVmVyc2lvbihTdHJpbmdSZWYgQXJjaCk7CisKKy8vIEluZm9ybWF0aW9uIGJ5IE5hbWUKK3Vuc2lnbmVkICBnZXREZWZhdWx0RlBVKFN0cmluZ1JlZiBDUFUsIEFyY2hLaW5kIEFLKTsKK3Vuc2lnbmVkICBnZXREZWZhdWx0RXh0ZW5zaW9ucyhTdHJpbmdSZWYgQ1BVLCBBcmNoS2luZCBBSyk7CitTdHJpbmdSZWYgZ2V0RGVmYXVsdENQVShTdHJpbmdSZWYgQXJjaCk7CisKKy8vIFBhcnNlcgordW5zaWduZWQgcGFyc2VGUFUoU3RyaW5nUmVmIEZQVSk7CitBQXJjaDY0OjpBcmNoS2luZCBwYXJzZUFyY2goU3RyaW5nUmVmIEFyY2gpOworQXJjaEV4dEtpbmQgcGFyc2VBcmNoRXh0KFN0cmluZ1JlZiBBcmNoRXh0KTsKK0FyY2hLaW5kIHBhcnNlQ1BVQXJjaChTdHJpbmdSZWYgQ1BVKTsKK3ZvaWQgZmlsbFZhbGlkQ1BVQXJjaExpc3QoU21hbGxWZWN0b3JJbXBsPFN0cmluZ1JlZj4gJlZhbHVlcyk7CitBUk06OklTQUtpbmQgcGFyc2VBcmNoSVNBKFN0cmluZ1JlZiBBcmNoKTsKK0FSTTo6RW5kaWFuS2luZCBwYXJzZUFyY2hFbmRpYW4oU3RyaW5nUmVmIEFyY2gpOworQVJNOjpQcm9maWxlS2luZCBwYXJzZUFyY2hQcm9maWxlKFN0cmluZ1JlZiBBcmNoKTsKK3Vuc2lnbmVkIHBhcnNlQXJjaFZlcnNpb24oU3RyaW5nUmVmIEFyY2gpOworCit9IC8vIG5hbWVzcGFjZSBBQXJjaDY0CisKK25hbWVzcGFjZSBYODYgeworCisvLyBUaGlzIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBsaWJjYy9jb21waWxlci1ydCBhcyBpdHMgaW5jbHVkZWQgYnkgY2xhbmcKKy8vIGFzIGEgcHJveHkgZm9yIHdoYXQncyBpbiBsaWJnY2MvY29tcGlsZXItcnQuCitlbnVtIFByb2Nlc3NvclZlbmRvcnMgOiB1bnNpZ25lZCB7CisgIFZFTkRPUl9EVU1NWSwKKyNkZWZpbmUgWDg2X1ZFTkRPUihFTlVNLCBTVFJJTkcpIFwKKyAgRU5VTSwKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvWDg2VGFyZ2V0UGFyc2VyLmRlZiIKKyAgVkVORE9SX09USEVSCit9OworCisvLyBUaGlzIHNob3VsZCBiZSBrZXB0IGluIHN5bmMgd2l0aCBsaWJjYy9jb21waWxlci1ydCBhcyBpdHMgaW5jbHVkZWQgYnkgY2xhbmcKKy8vIGFzIGEgcHJveHkgZm9yIHdoYXQncyBpbiBsaWJnY2MvY29tcGlsZXItcnQuCitlbnVtIFByb2Nlc3NvclR5cGVzIDogdW5zaWduZWQgeworICBDUFVfVFlQRV9EVU1NWSwKKyNkZWZpbmUgWDg2X0NQVV9UWVBFKEFSQ0hOQU1FLCBFTlVNKSBcCisgIEVOVU0sCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L1g4NlRhcmdldFBhcnNlci5kZWYiCisgIENQVV9UWVBFX01BWAorfTsKKworLy8gVGhpcyBzaG91bGQgYmUga2VwdCBpbiBzeW5jIHdpdGggbGliY2MvY29tcGlsZXItcnQgYXMgaXRzIGluY2x1ZGVkIGJ5IGNsYW5nCisvLyBhcyBhIHByb3h5IGZvciB3aGF0J3MgaW4gbGliZ2NjL2NvbXBpbGVyLXJ0LgorZW51bSBQcm9jZXNzb3JTdWJ0eXBlcyA6IHVuc2lnbmVkIHsKKyAgQ1BVX1NVQlRZUEVfRFVNTVksCisjZGVmaW5lIFg4Nl9DUFVfU1VCVFlQRShBUkNITkFNRSwgRU5VTSkgXAorICBFTlVNLAorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9YODZUYXJnZXRQYXJzZXIuZGVmIgorICBDUFVfU1VCVFlQRV9NQVgKK307CisKKy8vIFRoaXMgc2hvdWxkIGJlIGtlcHQgaW4gc3luYyB3aXRoIGxpYmNjL2NvbXBpbGVyLXJ0IGFzIGl0IHNob3VsZCBiZSB1c2VkCisvLyBieSBjbGFuZyBhcyBhIHByb3h5IGZvciB3aGF0J3MgaW4gbGliZ2NjL2NvbXBpbGVyLXJ0LgorZW51bSBQcm9jZXNzb3JGZWF0dXJlcyB7CisjZGVmaW5lIFg4Nl9GRUFUVVJFKFZBTCwgRU5VTSkgXAorICBFTlVNID0gVkFMLAorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9YODZUYXJnZXRQYXJzZXIuZGVmIgorCit9OworCit9IC8vIG5hbWVzcGFjZSBYODYKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UYXJnZXRSZWdpc3RyeS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RhcmdldFJlZ2lzdHJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGZjOGMzOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UYXJnZXRSZWdpc3RyeS5oCkBAIC0wLDAgKzEsMTE3NyBAQAorLy89PT0tIFN1cHBvcnQvVGFyZ2V0UmVnaXN0cnkuaCAtIFRhcmdldCBSZWdpc3RyYXRpb24gLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZXhwb3NlcyB0aGUgVGFyZ2V0UmVnaXN0cnkgaW50ZXJmYWNlLCB3aGljaCB0b29scyBjYW4gdXNlIHRvIGFjY2VzcworLy8gdGhlIGFwcHJvcHJpYXRlIHRhcmdldCBzcGVjaWZpYyBjbGFzc2VzIChUYXJnZXRNYWNoaW5lLCBBc21QcmludGVyLCBldGMuKQorLy8gd2hpY2ggaGF2ZSBiZWVuIHJlZ2lzdGVyZWQuCisvLworLy8gVGFyZ2V0IHNwZWNpZmljIGNsYXNzIGltcGxlbWVudGF0aW9ucyBzaG91bGQgcmVnaXN0ZXIgdGhlbXNlbHZlcyB1c2luZyB0aGUKKy8vIGFwcHJvcHJpYXRlIFRhcmdldFJlZ2lzdHJ5IGludGVyZmFjZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfVEFSR0VUUkVHSVNUUllfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfVEFSR0VUUkVHSVNUUllfSAorCisjaW5jbHVkZSAibGx2bS1jL0Rpc2Fzc2VtYmxlclR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9UcmlwbGUuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9pdGVyYXRvcl9yYW5nZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db2RlR2VuLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9ySGFuZGxpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRm9ybWF0dGVkU3RyZWFtLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFzbVByaW50ZXI7CitjbGFzcyBNQ0FzbUJhY2tlbmQ7CitjbGFzcyBNQ0FzbUluZm87CitjbGFzcyBNQ0FzbVBhcnNlcjsKK2NsYXNzIE1DQ29kZUVtaXR0ZXI7CitjbGFzcyBNQ0NvbnRleHQ7CitjbGFzcyBNQ0Rpc2Fzc2VtYmxlcjsKK2NsYXNzIE1DSW5zdFByaW50ZXI7CitjbGFzcyBNQ0luc3RyQW5hbHlzaXM7CitjbGFzcyBNQ0luc3RySW5mbzsKK2NsYXNzIE1DUmVnaXN0ZXJJbmZvOworY2xhc3MgTUNSZWxvY2F0aW9uSW5mbzsKK2NsYXNzIE1DU3RyZWFtZXI7CitjbGFzcyBNQ1N1YnRhcmdldEluZm87CitjbGFzcyBNQ1N5bWJvbGl6ZXI7CitjbGFzcyBNQ1RhcmdldEFzbVBhcnNlcjsKK2NsYXNzIE1DVGFyZ2V0T3B0aW9uczsKK2NsYXNzIE1DVGFyZ2V0U3RyZWFtZXI7CitjbGFzcyByYXdfb3N0cmVhbTsKK2NsYXNzIHJhd19wd3JpdGVfc3RyZWFtOworY2xhc3MgVGFyZ2V0TWFjaGluZTsKK2NsYXNzIFRhcmdldE9wdGlvbnM7CisKK01DU3RyZWFtZXIgKmNyZWF0ZU51bGxTdHJlYW1lcihNQ0NvbnRleHQgJkN0eCk7CitNQ1N0cmVhbWVyICpjcmVhdGVBc21TdHJlYW1lcihNQ0NvbnRleHQgJkN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxmb3JtYXR0ZWRfcmF3X29zdHJlYW0+IE9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc1ZlcmJvc2VBc20sIGJvb2wgdXNlRHdhcmZEaXJlY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0luc3RQcmludGVyICpJbnN0UHJpbnQsIE1DQ29kZUVtaXR0ZXIgKkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNBc21CYWNrZW5kICpUQUIsIGJvb2wgU2hvd0luc3QpOworCisvLy8gVGFrZXMgb3duZXJzaGlwIG9mIFxwIFRBQiBhbmQgXHAgQ0UuCitNQ1N0cmVhbWVyICpjcmVhdGVFTEZTdHJlYW1lcihNQ0NvbnRleHQgJkN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNQ0FzbUJhY2tlbmQ+ICYmVEFCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X3B3cml0ZV9zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1DQ29kZUVtaXR0ZXI+ICYmQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFJlbGF4QWxsKTsKK01DU3RyZWFtZXIgKmNyZWF0ZU1hY2hPU3RyZWFtZXIoTUNDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNQ0FzbUJhY2tlbmQ+ICYmVEFCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfcHdyaXRlX3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNQ0NvZGVFbWl0dGVyPiAmJkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFJlbGF4QWxsLCBib29sIERXQVJGTXVzdEJlQXRUaGVFbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTGFiZWxTZWN0aW9ucyA9IGZhbHNlKTsKK01DU3RyZWFtZXIgKmNyZWF0ZVdhc21TdHJlYW1lcihNQ0NvbnRleHQgJkN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TUNBc21CYWNrZW5kPiAmJlRBQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdfcHdyaXRlX3N0cmVhbSAmT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1DQ29kZUVtaXR0ZXI+ICYmQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZWxheEFsbCk7CisKK01DUmVsb2NhdGlvbkluZm8gKmNyZWF0ZU1DUmVsb2NhdGlvbkluZm8oY29uc3QgVHJpcGxlICZUVCwgTUNDb250ZXh0ICZDdHgpOworCitNQ1N5bWJvbGl6ZXIgKmNyZWF0ZU1DU3ltYm9saXplcihjb25zdCBUcmlwbGUgJlRULCBMTFZNT3BJbmZvQ2FsbGJhY2sgR2V0T3BJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTExWTVN5bWJvbExvb2t1cENhbGxiYWNrIFN5bWJvbExvb2tVcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKkRpc0luZm8sIE1DQ29udGV4dCAqQ3R4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1DUmVsb2NhdGlvbkluZm8+ICYmUmVsSW5mbyk7CisKKy8vLyBUYXJnZXQgLSBXcmFwcGVyIGZvciBUYXJnZXQgc3BlY2lmaWMgaW5mb3JtYXRpb24uCisvLy8KKy8vLyBGb3IgcmVnaXN0cmF0aW9uIHB1cnBvc2VzLCB0aGlzIGlzIGEgUE9EIHR5cGUgc28gdGhhdCB0YXJnZXRzIGNhbiBiZQorLy8vIHJlZ2lzdGVyZWQgd2l0aG91dCB0aGUgdXNlIG9mIHN0YXRpYyBjb25zdHJ1Y3RvcnMuCisvLy8KKy8vLyBUYXJnZXRzIHNob3VsZCBpbXBsZW1lbnQgYSBzaW5nbGUgZ2xvYmFsIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgKHdoaWNoCisvLy8gd2lsbCBiZSB6ZXJvIGluaXRpYWxpemVkKSwgYW5kIHBhc3MgdGhhdCBpbnN0YW5jZSB0byB0aGUgVGFyZ2V0UmVnaXN0cnkgYXMKKy8vLyBwYXJ0IG9mIHRoZWlyIGluaXRpYWxpemF0aW9uLgorY2xhc3MgVGFyZ2V0IHsKK3B1YmxpYzoKKyAgZnJpZW5kIHN0cnVjdCBUYXJnZXRSZWdpc3RyeTsKKworICB1c2luZyBBcmNoTWF0Y2hGblR5ID0gYm9vbCAoKikoVHJpcGxlOjpBcmNoVHlwZSBBcmNoKTsKKworICB1c2luZyBNQ0FzbUluZm9DdG9yRm5UeSA9IE1DQXNtSW5mbyAqKCopKGNvbnN0IE1DUmVnaXN0ZXJJbmZvICZNUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJpcGxlICZUVCk7CisgIHVzaW5nIE1DSW5zdHJJbmZvQ3RvckZuVHkgPSBNQ0luc3RySW5mbyAqKCopKCk7CisgIHVzaW5nIE1DSW5zdHJBbmFseXNpc0N0b3JGblR5ID0gTUNJbnN0ckFuYWx5c2lzICooKikoY29uc3QgTUNJbnN0ckluZm8gKkluZm8pOworICB1c2luZyBNQ1JlZ0luZm9DdG9yRm5UeSA9IE1DUmVnaXN0ZXJJbmZvICooKikoY29uc3QgVHJpcGxlICZUVCk7CisgIHVzaW5nIE1DU3VidGFyZ2V0SW5mb0N0b3JGblR5ID0gTUNTdWJ0YXJnZXRJbmZvICooKikoY29uc3QgVHJpcGxlICZUVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgQ1BVLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGZWF0dXJlcyk7CisgIHVzaW5nIFRhcmdldE1hY2hpbmVDdG9yVHkgPSBUYXJnZXRNYWNoaW5lCisgICAgICAqKCopKGNvbnN0IFRhcmdldCAmVCwgY29uc3QgVHJpcGxlICZUVCwgU3RyaW5nUmVmIENQVSwgU3RyaW5nUmVmIEZlYXR1cmVzLAorICAgICAgICAgICBjb25zdCBUYXJnZXRPcHRpb25zICZPcHRpb25zLCBPcHRpb25hbDxSZWxvYzo6TW9kZWw+IFJNLAorICAgICAgICAgICBPcHRpb25hbDxDb2RlTW9kZWw6Ok1vZGVsPiBDTSwgQ29kZUdlbk9wdDo6TGV2ZWwgT0wsIGJvb2wgSklUKTsKKyAgLy8gSWYgaXQgd2VyZW4ndCBmb3IgbGF5ZXJpbmcgaXNzdWVzICh0aGlzIGhlYWRlciBpcyBpbiBsbHZtL1N1cHBvcnQsIGJ1dAorICAvLyBkZXBlbmRzIG9uIE1DPykgdGhpcyBzaG91bGQgdGFrZSB0aGUgU3RyZWFtZXIgYnkgdmFsdWUgcmF0aGVyIHRoYW4gcnZhbHVlCisgIC8vIHJlZmVyZW5jZS4KKyAgdXNpbmcgQXNtUHJpbnRlckN0b3JUeSA9IEFzbVByaW50ZXIgKigqKSgKKyAgICAgIFRhcmdldE1hY2hpbmUgJlRNLCBzdGQ6OnVuaXF1ZV9wdHI8TUNTdHJlYW1lcj4gJiZTdHJlYW1lcik7CisgIHVzaW5nIE1DQXNtQmFja2VuZEN0b3JUeSA9IE1DQXNtQmFja2VuZCAqKCopKGNvbnN0IFRhcmdldCAmVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZTVEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICZNUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DVGFyZ2V0T3B0aW9ucyAmT3B0aW9ucyk7CisgIHVzaW5nIE1DQXNtUGFyc2VyQ3RvclR5ID0gTUNUYXJnZXRBc21QYXJzZXIgKigqKSgKKyAgICAgIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU1RJLCBNQ0FzbVBhcnNlciAmUCwgY29uc3QgTUNJbnN0ckluZm8gJk1JSSwKKyAgICAgIGNvbnN0IE1DVGFyZ2V0T3B0aW9ucyAmT3B0aW9ucyk7CisgIHVzaW5nIE1DRGlzYXNzZW1ibGVyQ3RvclR5ID0gTUNEaXNhc3NlbWJsZXIgKigqKShjb25zdCBUYXJnZXQgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N1YnRhcmdldEluZm8gJlNUSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KTsKKyAgdXNpbmcgTUNJbnN0UHJpbnRlckN0b3JUeSA9IE1DSW5zdFByaW50ZXIgKigqKShjb25zdCBUcmlwbGUgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3ludGF4VmFyaWFudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0FzbUluZm8gJk1BSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0luc3RySW5mbyAmTUlJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICZNUkkpOworICB1c2luZyBNQ0NvZGVFbWl0dGVyQ3RvclR5ID0gTUNDb2RlRW1pdHRlciAqKCopKGNvbnN0IE1DSW5zdHJJbmZvICZJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1JlZ2lzdGVySW5mbyAmTVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KTsKKyAgdXNpbmcgRUxGU3RyZWFtZXJDdG9yVHkgPQorICAgICAgTUNTdHJlYW1lciAqKCopKGNvbnN0IFRyaXBsZSAmVCwgTUNDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1DQXNtQmFja2VuZD4gJiZUQUIsCisgICAgICAgICAgICAgICAgICAgICAgcmF3X3B3cml0ZV9zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNQ0NvZGVFbWl0dGVyPiAmJkVtaXR0ZXIsIGJvb2wgUmVsYXhBbGwpOworICB1c2luZyBNYWNoT1N0cmVhbWVyQ3RvclR5ID0KKyAgICAgIE1DU3RyZWFtZXIgKigqKShNQ0NvbnRleHQgJkN0eCwgc3RkOjp1bmlxdWVfcHRyPE1DQXNtQmFja2VuZD4gJiZUQUIsCisgICAgICAgICAgICAgICAgICAgICAgcmF3X3B3cml0ZV9zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNQ0NvZGVFbWl0dGVyPiAmJkVtaXR0ZXIsIGJvb2wgUmVsYXhBbGwsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEV0FSRk11c3RCZUF0VGhlRW5kKTsKKyAgdXNpbmcgQ09GRlN0cmVhbWVyQ3RvclR5ID0KKyAgICAgIE1DU3RyZWFtZXIgKigqKShNQ0NvbnRleHQgJkN0eCwgc3RkOjp1bmlxdWVfcHRyPE1DQXNtQmFja2VuZD4gJiZUQUIsCisgICAgICAgICAgICAgICAgICAgICAgcmF3X3B3cml0ZV9zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNQ0NvZGVFbWl0dGVyPiAmJkVtaXR0ZXIsIGJvb2wgUmVsYXhBbGwsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNyZW1lbnRhbExpbmtlckNvbXBhdGlibGUpOworICB1c2luZyBXYXNtU3RyZWFtZXJDdG9yVHkgPQorICAgICAgTUNTdHJlYW1lciAqKCopKGNvbnN0IFRyaXBsZSAmVCwgTUNDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1DQXNtQmFja2VuZD4gJiZUQUIsCisgICAgICAgICAgICAgICAgICAgICAgcmF3X3B3cml0ZV9zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNQ0NvZGVFbWl0dGVyPiAmJkVtaXR0ZXIsIGJvb2wgUmVsYXhBbGwpOworICB1c2luZyBOdWxsVGFyZ2V0U3RyZWFtZXJDdG9yVHkgPSBNQ1RhcmdldFN0cmVhbWVyICooKikoTUNTdHJlYW1lciAmUyk7CisgIHVzaW5nIEFzbVRhcmdldFN0cmVhbWVyQ3RvclR5ID0gTUNUYXJnZXRTdHJlYW1lciAqKCopKAorICAgICAgTUNTdHJlYW1lciAmUywgZm9ybWF0dGVkX3Jhd19vc3RyZWFtICZPUywgTUNJbnN0UHJpbnRlciAqSW5zdFByaW50LAorICAgICAgYm9vbCBJc1ZlcmJvc2VBc20pOworICB1c2luZyBPYmplY3RUYXJnZXRTdHJlYW1lckN0b3JUeSA9IE1DVGFyZ2V0U3RyZWFtZXIgKigqKSgKKyAgICAgIE1DU3RyZWFtZXIgJlMsIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU1RJKTsKKyAgdXNpbmcgTUNSZWxvY2F0aW9uSW5mb0N0b3JUeSA9IE1DUmVsb2NhdGlvbkluZm8gKigqKShjb25zdCBUcmlwbGUgJlRULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KTsKKyAgdXNpbmcgTUNTeW1ib2xpemVyQ3RvclR5ID0gTUNTeW1ib2xpemVyICooKikoCisgICAgICBjb25zdCBUcmlwbGUgJlRULCBMTFZNT3BJbmZvQ2FsbGJhY2sgR2V0T3BJbmZvLAorICAgICAgTExWTVN5bWJvbExvb2t1cENhbGxiYWNrIFN5bWJvbExvb2tVcCwgdm9pZCAqRGlzSW5mbywgTUNDb250ZXh0ICpDdHgsCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8TUNSZWxvY2F0aW9uSW5mbz4gJiZSZWxJbmZvKTsKKworcHJpdmF0ZToKKyAgLy8vIE5leHQgLSBUaGUgbmV4dCByZWdpc3RlcmVkIHRhcmdldCBpbiB0aGUgbGlua2VkIGxpc3QsIG1haW50YWluZWQgYnkgdGhlCisgIC8vLyBUYXJnZXRSZWdpc3RyeS4KKyAgVGFyZ2V0ICpOZXh0OworCisgIC8vLyBUaGUgdGFyZ2V0IGZ1bmN0aW9uIGZvciBjaGVja2luZyBpZiBhbiBhcmNoaXRlY3R1cmUgaXMgc3VwcG9ydGVkLgorICBBcmNoTWF0Y2hGblR5IEFyY2hNYXRjaEZuOworCisgIC8vLyBOYW1lIC0gVGhlIHRhcmdldCBuYW1lLgorICBjb25zdCBjaGFyICpOYW1lOworCisgIC8vLyBTaG9ydERlc2MgLSBBIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSB0YXJnZXQuCisgIGNvbnN0IGNoYXIgKlNob3J0RGVzYzsKKworICAvLy8gQmFja2VuZE5hbWUgLSBUaGUgbmFtZSBvZiB0aGUgYmFja2VuZCBpbXBsZW1lbnRhdGlvbi4gVGhpcyBtdXN0IG1hdGNoIHRoZQorICAvLy8gbmFtZSBvZiB0aGUgJ2RlZiBYIDogVGFyZ2V0IC4uLicgaW4gVGFibGVHZW4uCisgIGNvbnN0IGNoYXIgKkJhY2tlbmROYW1lOworCisgIC8vLyBIYXNKSVQgLSBXaGV0aGVyIHRoaXMgdGFyZ2V0IHN1cHBvcnRzIHRoZSBKSVQuCisgIGJvb2wgSGFzSklUOworCisgIC8vLyBNQ0FzbUluZm9DdG9yRm4gLSBDb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgdGhpcyB0YXJnZXQncyBNQ0FzbUluZm8sIGlmCisgIC8vLyByZWdpc3RlcmVkLgorICBNQ0FzbUluZm9DdG9yRm5UeSBNQ0FzbUluZm9DdG9yRm47CisKKyAgLy8vIE1DSW5zdHJJbmZvQ3RvckZuIC0gQ29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIHRoaXMgdGFyZ2V0J3MgTUNJbnN0ckluZm8sCisgIC8vLyBpZiByZWdpc3RlcmVkLgorICBNQ0luc3RySW5mb0N0b3JGblR5IE1DSW5zdHJJbmZvQ3RvckZuOworCisgIC8vLyBNQ0luc3RyQW5hbHlzaXNDdG9yRm4gLSBDb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgdGhpcyB0YXJnZXQncworICAvLy8gTUNJbnN0ckFuYWx5c2lzLCBpZiByZWdpc3RlcmVkLgorICBNQ0luc3RyQW5hbHlzaXNDdG9yRm5UeSBNQ0luc3RyQW5hbHlzaXNDdG9yRm47CisKKyAgLy8vIE1DUmVnSW5mb0N0b3JGbiAtIENvbnN0cnVjdG9yIGZ1bmN0aW9uIGZvciB0aGlzIHRhcmdldCdzIE1DUmVnaXN0ZXJJbmZvLAorICAvLy8gaWYgcmVnaXN0ZXJlZC4KKyAgTUNSZWdJbmZvQ3RvckZuVHkgTUNSZWdJbmZvQ3RvckZuOworCisgIC8vLyBNQ1N1YnRhcmdldEluZm9DdG9yRm4gLSBDb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgdGhpcyB0YXJnZXQncworICAvLy8gTUNTdWJ0YXJnZXRJbmZvLCBpZiByZWdpc3RlcmVkLgorICBNQ1N1YnRhcmdldEluZm9DdG9yRm5UeSBNQ1N1YnRhcmdldEluZm9DdG9yRm47CisKKyAgLy8vIFRhcmdldE1hY2hpbmVDdG9yRm4gLSBDb25zdHJ1Y3Rpb24gZnVuY3Rpb24gZm9yIHRoaXMgdGFyZ2V0J3MKKyAgLy8vIFRhcmdldE1hY2hpbmUsIGlmIHJlZ2lzdGVyZWQuCisgIFRhcmdldE1hY2hpbmVDdG9yVHkgVGFyZ2V0TWFjaGluZUN0b3JGbjsKKworICAvLy8gTUNBc21CYWNrZW5kQ3RvckZuIC0gQ29uc3RydWN0aW9uIGZ1bmN0aW9uIGZvciB0aGlzIHRhcmdldCdzCisgIC8vLyBNQ0FzbUJhY2tlbmQsIGlmIHJlZ2lzdGVyZWQuCisgIE1DQXNtQmFja2VuZEN0b3JUeSBNQ0FzbUJhY2tlbmRDdG9yRm47CisKKyAgLy8vIE1DQXNtUGFyc2VyQ3RvckZuIC0gQ29uc3RydWN0aW9uIGZ1bmN0aW9uIGZvciB0aGlzIHRhcmdldCdzCisgIC8vLyBNQ1RhcmdldEFzbVBhcnNlciwgaWYgcmVnaXN0ZXJlZC4KKyAgTUNBc21QYXJzZXJDdG9yVHkgTUNBc21QYXJzZXJDdG9yRm47CisKKyAgLy8vIEFzbVByaW50ZXJDdG9yRm4gLSBDb25zdHJ1Y3Rpb24gZnVuY3Rpb24gZm9yIHRoaXMgdGFyZ2V0J3MgQXNtUHJpbnRlciwKKyAgLy8vIGlmIHJlZ2lzdGVyZWQuCisgIEFzbVByaW50ZXJDdG9yVHkgQXNtUHJpbnRlckN0b3JGbjsKKworICAvLy8gTUNEaXNhc3NlbWJsZXJDdG9yRm4gLSBDb25zdHJ1Y3Rpb24gZnVuY3Rpb24gZm9yIHRoaXMgdGFyZ2V0J3MKKyAgLy8vIE1DRGlzYXNzZW1ibGVyLCBpZiByZWdpc3RlcmVkLgorICBNQ0Rpc2Fzc2VtYmxlckN0b3JUeSBNQ0Rpc2Fzc2VtYmxlckN0b3JGbjsKKworICAvLy8gTUNJbnN0UHJpbnRlckN0b3JGbiAtIENvbnN0cnVjdGlvbiBmdW5jdGlvbiBmb3IgdGhpcyB0YXJnZXQncworICAvLy8gTUNJbnN0UHJpbnRlciwgaWYgcmVnaXN0ZXJlZC4KKyAgTUNJbnN0UHJpbnRlckN0b3JUeSBNQ0luc3RQcmludGVyQ3RvckZuOworCisgIC8vLyBNQ0NvZGVFbWl0dGVyQ3RvckZuIC0gQ29uc3RydWN0aW9uIGZ1bmN0aW9uIGZvciB0aGlzIHRhcmdldCdzCisgIC8vLyBDb2RlRW1pdHRlciwgaWYgcmVnaXN0ZXJlZC4KKyAgTUNDb2RlRW1pdHRlckN0b3JUeSBNQ0NvZGVFbWl0dGVyQ3RvckZuOworCisgIC8vIENvbnN0cnVjdGlvbiBmdW5jdGlvbnMgZm9yIHRoZSB2YXJpb3VzIG9iamVjdCBmb3JtYXRzLCBpZiByZWdpc3RlcmVkLgorICBDT0ZGU3RyZWFtZXJDdG9yVHkgQ09GRlN0cmVhbWVyQ3RvckZuID0gbnVsbHB0cjsKKyAgTWFjaE9TdHJlYW1lckN0b3JUeSBNYWNoT1N0cmVhbWVyQ3RvckZuID0gbnVsbHB0cjsKKyAgRUxGU3RyZWFtZXJDdG9yVHkgRUxGU3RyZWFtZXJDdG9yRm4gPSBudWxscHRyOworICBXYXNtU3RyZWFtZXJDdG9yVHkgV2FzbVN0cmVhbWVyQ3RvckZuID0gbnVsbHB0cjsKKworICAvLy8gQ29uc3RydWN0aW9uIGZ1bmN0aW9uIGZvciB0aGlzIHRhcmdldCdzIG51bGwgVGFyZ2V0U3RyZWFtZXIsIGlmCisgIC8vLyByZWdpc3RlcmVkIChkZWZhdWx0ID0gbnVsbHB0cikuCisgIE51bGxUYXJnZXRTdHJlYW1lckN0b3JUeSBOdWxsVGFyZ2V0U3RyZWFtZXJDdG9yRm4gPSBudWxscHRyOworCisgIC8vLyBDb25zdHJ1Y3Rpb24gZnVuY3Rpb24gZm9yIHRoaXMgdGFyZ2V0J3MgYXNtIFRhcmdldFN0cmVhbWVyLCBpZgorICAvLy8gcmVnaXN0ZXJlZCAoZGVmYXVsdCA9IG51bGxwdHIpLgorICBBc21UYXJnZXRTdHJlYW1lckN0b3JUeSBBc21UYXJnZXRTdHJlYW1lckN0b3JGbiA9IG51bGxwdHI7CisKKyAgLy8vIENvbnN0cnVjdGlvbiBmdW5jdGlvbiBmb3IgdGhpcyB0YXJnZXQncyBvYmogVGFyZ2V0U3RyZWFtZXIsIGlmCisgIC8vLyByZWdpc3RlcmVkIChkZWZhdWx0ID0gbnVsbHB0cikuCisgIE9iamVjdFRhcmdldFN0cmVhbWVyQ3RvclR5IE9iamVjdFRhcmdldFN0cmVhbWVyQ3RvckZuID0gbnVsbHB0cjsKKworICAvLy8gTUNSZWxvY2F0aW9uSW5mb0N0b3JGbiAtIENvbnN0cnVjdGlvbiBmdW5jdGlvbiBmb3IgdGhpcyB0YXJnZXQncworICAvLy8gTUNSZWxvY2F0aW9uSW5mbywgaWYgcmVnaXN0ZXJlZCAoZGVmYXVsdCA9IGxsdm06OmNyZWF0ZU1DUmVsb2NhdGlvbkluZm8pCisgIE1DUmVsb2NhdGlvbkluZm9DdG9yVHkgTUNSZWxvY2F0aW9uSW5mb0N0b3JGbiA9IG51bGxwdHI7CisKKyAgLy8vIE1DU3ltYm9saXplckN0b3JGbiAtIENvbnN0cnVjdGlvbiBmdW5jdGlvbiBmb3IgdGhpcyB0YXJnZXQncworICAvLy8gTUNTeW1ib2xpemVyLCBpZiByZWdpc3RlcmVkIChkZWZhdWx0ID0gbGx2bTo6Y3JlYXRlTUNTeW1ib2xpemVyKQorICBNQ1N5bWJvbGl6ZXJDdG9yVHkgTUNTeW1ib2xpemVyQ3RvckZuID0gbnVsbHB0cjsKKworcHVibGljOgorICBUYXJnZXQoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIEBuYW1lIFRhcmdldCBJbmZvcm1hdGlvbgorICAvLy8gQHsKKworICAvLyBnZXROZXh0IC0gUmV0dXJuIHRoZSBuZXh0IHJlZ2lzdGVyZWQgdGFyZ2V0LgorICBjb25zdCBUYXJnZXQgKmdldE5leHQoKSBjb25zdCB7IHJldHVybiBOZXh0OyB9CisKKyAgLy8vIGdldE5hbWUgLSBHZXQgdGhlIHRhcmdldCBuYW1lLgorICBjb25zdCBjaGFyICpnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorCisgIC8vLyBnZXRTaG9ydERlc2NyaXB0aW9uIC0gR2V0IGEgc2hvcnQgZGVzY3JpcHRpb24gb2YgdGhlIHRhcmdldC4KKyAgY29uc3QgY2hhciAqZ2V0U2hvcnREZXNjcmlwdGlvbigpIGNvbnN0IHsgcmV0dXJuIFNob3J0RGVzYzsgfQorCisgIC8vLyBnZXRCYWNrZW5kTmFtZSAtIEdldCB0aGUgYmFja2VuZCBuYW1lLgorICBjb25zdCBjaGFyICpnZXRCYWNrZW5kTmFtZSgpIGNvbnN0IHsgcmV0dXJuIEJhY2tlbmROYW1lOyB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBGZWF0dXJlIFByZWRpY2F0ZXMKKyAgLy8vIEB7CisKKyAgLy8vIGhhc0pJVCAtIENoZWNrIGlmIHRoaXMgdGFyZ2V0cyBzdXBwb3J0cyB0aGUganVzdC1pbi10aW1lIGNvbXBpbGF0aW9uLgorICBib29sIGhhc0pJVCgpIGNvbnN0IHsgcmV0dXJuIEhhc0pJVDsgfQorCisgIC8vLyBoYXNUYXJnZXRNYWNoaW5lIC0gQ2hlY2sgaWYgdGhpcyB0YXJnZXQgc3VwcG9ydHMgY29kZSBnZW5lcmF0aW9uLgorICBib29sIGhhc1RhcmdldE1hY2hpbmUoKSBjb25zdCB7IHJldHVybiBUYXJnZXRNYWNoaW5lQ3RvckZuICE9IG51bGxwdHI7IH0KKworICAvLy8gaGFzTUNBc21CYWNrZW5kIC0gQ2hlY2sgaWYgdGhpcyB0YXJnZXQgc3VwcG9ydHMgLm8gZ2VuZXJhdGlvbi4KKyAgYm9vbCBoYXNNQ0FzbUJhY2tlbmQoKSBjb25zdCB7IHJldHVybiBNQ0FzbUJhY2tlbmRDdG9yRm4gIT0gbnVsbHB0cjsgfQorCisgIC8vLyBoYXNNQ0FzbVBhcnNlciAtIENoZWNrIGlmIHRoaXMgdGFyZ2V0IHN1cHBvcnRzIGFzc2VtYmx5IHBhcnNpbmcuCisgIGJvb2wgaGFzTUNBc21QYXJzZXIoKSBjb25zdCB7IHJldHVybiBNQ0FzbVBhcnNlckN0b3JGbiAhPSBudWxscHRyOyB9CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBGZWF0dXJlIENvbnN0cnVjdG9ycworICAvLy8gQHsKKworICAvLy8gY3JlYXRlTUNBc21JbmZvIC0gQ3JlYXRlIGEgTUNBc21JbmZvIGltcGxlbWVudGF0aW9uIGZvciB0aGUgc3BlY2lmaWVkCisgIC8vLyB0YXJnZXQgdHJpcGxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUaGVUcmlwbGUgVGhpcyBhcmd1bWVudCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgdGFyZ2V0IG1hY2hpbmUKKyAgLy8vIGZlYXR1cmUgc2V0OyBpdCBzaG91bGQgYWx3YXlzIGJlIHByb3ZpZGVkLiBHZW5lcmFsbHkgdGhpcyBzaG91bGQgYmUKKyAgLy8vIGVpdGhlciB0aGUgdGFyZ2V0IHRyaXBsZSBmcm9tIHRoZSBtb2R1bGUsIG9yIHRoZSB0YXJnZXQgdHJpcGxlIG9mIHRoZQorICAvLy8gaG9zdCBpZiB0aGF0IGRvZXMgbm90IGV4aXN0LgorICBNQ0FzbUluZm8gKmNyZWF0ZU1DQXNtSW5mbyhjb25zdCBNQ1JlZ2lzdGVySW5mbyAmTVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgVGhlVHJpcGxlKSBjb25zdCB7CisgICAgaWYgKCFNQ0FzbUluZm9DdG9yRm4pCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gTUNBc21JbmZvQ3RvckZuKE1SSSwgVHJpcGxlKFRoZVRyaXBsZSkpOworICB9CisKKyAgLy8vIGNyZWF0ZU1DSW5zdHJJbmZvIC0gQ3JlYXRlIGEgTUNJbnN0ckluZm8gaW1wbGVtZW50YXRpb24uCisgIC8vLworICBNQ0luc3RySW5mbyAqY3JlYXRlTUNJbnN0ckluZm8oKSBjb25zdCB7CisgICAgaWYgKCFNQ0luc3RySW5mb0N0b3JGbikKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBNQ0luc3RySW5mb0N0b3JGbigpOworICB9CisKKyAgLy8vIGNyZWF0ZU1DSW5zdHJBbmFseXNpcyAtIENyZWF0ZSBhIE1DSW5zdHJBbmFseXNpcyBpbXBsZW1lbnRhdGlvbi4KKyAgLy8vCisgIE1DSW5zdHJBbmFseXNpcyAqY3JlYXRlTUNJbnN0ckFuYWx5c2lzKGNvbnN0IE1DSW5zdHJJbmZvICpJbmZvKSBjb25zdCB7CisgICAgaWYgKCFNQ0luc3RyQW5hbHlzaXNDdG9yRm4pCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gTUNJbnN0ckFuYWx5c2lzQ3RvckZuKEluZm8pOworICB9CisKKyAgLy8vIGNyZWF0ZU1DUmVnSW5mbyAtIENyZWF0ZSBhIE1DUmVnaXN0ZXJJbmZvIGltcGxlbWVudGF0aW9uLgorICAvLy8KKyAgTUNSZWdpc3RlckluZm8gKmNyZWF0ZU1DUmVnSW5mbyhTdHJpbmdSZWYgVFQpIGNvbnN0IHsKKyAgICBpZiAoIU1DUmVnSW5mb0N0b3JGbikKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBNQ1JlZ0luZm9DdG9yRm4oVHJpcGxlKFRUKSk7CisgIH0KKworICAvLy8gY3JlYXRlTUNTdWJ0YXJnZXRJbmZvIC0gQ3JlYXRlIGEgTUNTdWJ0YXJnZXRJbmZvIGltcGxlbWVudGF0aW9uLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUaGVUcmlwbGUgVGhpcyBhcmd1bWVudCBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgdGFyZ2V0IG1hY2hpbmUKKyAgLy8vIGZlYXR1cmUgc2V0OyBpdCBzaG91bGQgYWx3YXlzIGJlIHByb3ZpZGVkLiBHZW5lcmFsbHkgdGhpcyBzaG91bGQgYmUKKyAgLy8vIGVpdGhlciB0aGUgdGFyZ2V0IHRyaXBsZSBmcm9tIHRoZSBtb2R1bGUsIG9yIHRoZSB0YXJnZXQgdHJpcGxlIG9mIHRoZQorICAvLy8gaG9zdCBpZiB0aGF0IGRvZXMgbm90IGV4aXN0LgorICAvLy8gXHBhcmFtIENQVSBUaGlzIHNwZWNpZmllcyB0aGUgbmFtZSBvZiB0aGUgdGFyZ2V0IENQVS4KKyAgLy8vIFxwYXJhbSBGZWF0dXJlcyBUaGlzIHNwZWNpZmllcyB0aGUgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZQorICAvLy8gYWRkaXRpb25hbCB0YXJnZXQgZmVhdHVyZXMuCisgIE1DU3VidGFyZ2V0SW5mbyAqY3JlYXRlTUNTdWJ0YXJnZXRJbmZvKFN0cmluZ1JlZiBUaGVUcmlwbGUsIFN0cmluZ1JlZiBDUFUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBGZWF0dXJlcykgY29uc3QgeworICAgIGlmICghTUNTdWJ0YXJnZXRJbmZvQ3RvckZuKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIE1DU3VidGFyZ2V0SW5mb0N0b3JGbihUcmlwbGUoVGhlVHJpcGxlKSwgQ1BVLCBGZWF0dXJlcyk7CisgIH0KKworICAvLy8gY3JlYXRlVGFyZ2V0TWFjaGluZSAtIENyZWF0ZSBhIHRhcmdldCBzcGVjaWZpYyBtYWNoaW5lIGltcGxlbWVudGF0aW9uCisgIC8vLyBmb3IgdGhlIHNwZWNpZmllZCBccCBUcmlwbGUuCisgIC8vLworICAvLy8gXHBhcmFtIFRUIFRoaXMgYXJndW1lbnQgaXMgdXNlZCB0byBkZXRlcm1pbmUgdGhlIHRhcmdldCBtYWNoaW5lCisgIC8vLyBmZWF0dXJlIHNldDsgaXQgc2hvdWxkIGFsd2F5cyBiZSBwcm92aWRlZC4gR2VuZXJhbGx5IHRoaXMgc2hvdWxkIGJlCisgIC8vLyBlaXRoZXIgdGhlIHRhcmdldCB0cmlwbGUgZnJvbSB0aGUgbW9kdWxlLCBvciB0aGUgdGFyZ2V0IHRyaXBsZSBvZiB0aGUKKyAgLy8vIGhvc3QgaWYgdGhhdCBkb2VzIG5vdCBleGlzdC4KKyAgVGFyZ2V0TWFjaGluZSAqY3JlYXRlVGFyZ2V0TWFjaGluZShTdHJpbmdSZWYgVFQsIFN0cmluZ1JlZiBDUFUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIEZlYXR1cmVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE9wdGlvbnMgJk9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0aW9uYWw8UmVsb2M6Ok1vZGVsPiBSTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25hbDxDb2RlTW9kZWw6Ok1vZGVsPiBDTSA9IE5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbk9wdDo6TGV2ZWwgT0wgPSBDb2RlR2VuT3B0OjpEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSklUID0gZmFsc2UpIGNvbnN0IHsKKyAgICBpZiAoIVRhcmdldE1hY2hpbmVDdG9yRm4pCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gVGFyZ2V0TWFjaGluZUN0b3JGbigqdGhpcywgVHJpcGxlKFRUKSwgQ1BVLCBGZWF0dXJlcywgT3B0aW9ucywgUk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ00sIE9MLCBKSVQpOworICB9CisKKyAgLy8vIGNyZWF0ZU1DQXNtQmFja2VuZCAtIENyZWF0ZSBhIHRhcmdldCBzcGVjaWZpYyBhc3NlbWJseSBwYXJzZXIuCisgIE1DQXNtQmFja2VuZCAqY3JlYXRlTUNBc21CYWNrZW5kKGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU1RJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1JlZ2lzdGVySW5mbyAmTVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1RhcmdldE9wdGlvbnMgJk9wdGlvbnMpIGNvbnN0IHsKKyAgICBpZiAoIU1DQXNtQmFja2VuZEN0b3JGbikKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBNQ0FzbUJhY2tlbmRDdG9yRm4oKnRoaXMsIFNUSSwgTVJJLCBPcHRpb25zKTsKKyAgfQorCisgIC8vLyBjcmVhdGVNQ0FzbVBhcnNlciAtIENyZWF0ZSBhIHRhcmdldCBzcGVjaWZpYyBhc3NlbWJseSBwYXJzZXIuCisgIC8vLworICAvLy8gXHBhcmFtIFBhcnNlciBUaGUgdGFyZ2V0IGluZGVwZW5kZW50IHBhcnNlciBpbXBsZW1lbnRhdGlvbiB0byB1c2UgZm9yCisgIC8vLyBwYXJzaW5nIGFuZCBsZXhpbmcuCisgIE1DVGFyZ2V0QXNtUGFyc2VyICpjcmVhdGVNQ0FzbVBhcnNlcihjb25zdCBNQ1N1YnRhcmdldEluZm8gJlNUSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQXNtUGFyc2VyICZQYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ0luc3RySW5mbyAmTUlJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNUYXJnZXRPcHRpb25zICZPcHRpb25zKSBjb25zdCB7CisgICAgaWYgKCFNQ0FzbVBhcnNlckN0b3JGbikKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBNQ0FzbVBhcnNlckN0b3JGbihTVEksIFBhcnNlciwgTUlJLCBPcHRpb25zKTsKKyAgfQorCisgIC8vLyBjcmVhdGVBc21QcmludGVyIC0gQ3JlYXRlIGEgdGFyZ2V0IHNwZWNpZmljIGFzc2VtYmx5IHByaW50ZXIgcGFzcy4gIFRoaXMKKyAgLy8vIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgTUNTdHJlYW1lciBvYmplY3QuCisgIEFzbVByaW50ZXIgKmNyZWF0ZUFzbVByaW50ZXIoVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1DU3RyZWFtZXI+ICYmU3RyZWFtZXIpIGNvbnN0IHsKKyAgICBpZiAoIUFzbVByaW50ZXJDdG9yRm4pCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gQXNtUHJpbnRlckN0b3JGbihUTSwgc3RkOjptb3ZlKFN0cmVhbWVyKSk7CisgIH0KKworICBNQ0Rpc2Fzc2VtYmxlciAqY3JlYXRlTUNEaXNhc3NlbWJsZXIoY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZTVEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgJkN0eCkgY29uc3QgeworICAgIGlmICghTUNEaXNhc3NlbWJsZXJDdG9yRm4pCisgICAgICByZXR1cm4gbnVsbHB0cjsKKyAgICByZXR1cm4gTUNEaXNhc3NlbWJsZXJDdG9yRm4oKnRoaXMsIFNUSSwgQ3R4KTsKKyAgfQorCisgIE1DSW5zdFByaW50ZXIgKmNyZWF0ZU1DSW5zdFByaW50ZXIoY29uc3QgVHJpcGxlICZULCB1bnNpZ25lZCBTeW50YXhWYXJpYW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DQXNtSW5mbyAmTUFJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DSW5zdHJJbmZvICZNSUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNSZWdpc3RlckluZm8gJk1SSSkgY29uc3QgeworICAgIGlmICghTUNJbnN0UHJpbnRlckN0b3JGbikKKyAgICAgIHJldHVybiBudWxscHRyOworICAgIHJldHVybiBNQ0luc3RQcmludGVyQ3RvckZuKFQsIFN5bnRheFZhcmlhbnQsIE1BSSwgTUlJLCBNUkkpOworICB9CisKKyAgLy8vIGNyZWF0ZU1DQ29kZUVtaXR0ZXIgLSBDcmVhdGUgYSB0YXJnZXQgc3BlY2lmaWMgY29kZSBlbWl0dGVyLgorICBNQ0NvZGVFbWl0dGVyICpjcmVhdGVNQ0NvZGVFbWl0dGVyKGNvbnN0IE1DSW5zdHJJbmZvICZJSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1JlZ2lzdGVySW5mbyAmTVJJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmQ3R4KSBjb25zdCB7CisgICAgaWYgKCFNQ0NvZGVFbWl0dGVyQ3RvckZuKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIE1DQ29kZUVtaXR0ZXJDdG9yRm4oSUksIE1SSSwgQ3R4KTsKKyAgfQorCisgIC8vLyBDcmVhdGUgYSB0YXJnZXQgc3BlY2lmaWMgTUNTdHJlYW1lci4KKyAgLy8vCisgIC8vLyBccGFyYW0gVCBUaGUgdGFyZ2V0IHRyaXBsZS4KKyAgLy8vIFxwYXJhbSBDdHggVGhlIHRhcmdldCBjb250ZXh0LgorICAvLy8gXHBhcmFtIFRBQiBUaGUgdGFyZ2V0IGFzc2VtYmxlciBiYWNrZW5kIG9iamVjdC4gVGFrZXMgb3duZXJzaGlwLgorICAvLy8gXHBhcmFtIE9TIFRoZSBzdHJlYW0gb2JqZWN0LgorICAvLy8gXHBhcmFtIEVtaXR0ZXIgVGhlIHRhcmdldCBpbmRlcGVuZGVudCBhc3NlbWJsZXIgb2JqZWN0LlRha2VzIG93bmVyc2hpcC4KKyAgLy8vIFxwYXJhbSBSZWxheEFsbCBSZWxheCBhbGwgZml4dXBzPworICBNQ1N0cmVhbWVyICpjcmVhdGVNQ09iamVjdFN0cmVhbWVyKGNvbnN0IFRyaXBsZSAmVCwgTUNDb250ZXh0ICZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPE1DQXNtQmFja2VuZD4gJiZUQUIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X3B3cml0ZV9zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNQ0NvZGVFbWl0dGVyPiAmJkVtaXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICZTVEksIGJvb2wgUmVsYXhBbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJbmNyZW1lbnRhbExpbmtlckNvbXBhdGlibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEV0FSRk11c3RCZUF0VGhlRW5kKSBjb25zdCB7CisgICAgTUNTdHJlYW1lciAqUzsKKyAgICBzd2l0Y2ggKFQuZ2V0T2JqZWN0Rm9ybWF0KCkpIHsKKyAgICBkZWZhdWx0OgorICAgICAgbGx2bV91bnJlYWNoYWJsZSgiVW5rbm93biBvYmplY3QgZm9ybWF0Iik7CisgICAgY2FzZSBUcmlwbGU6OkNPRkY6CisgICAgICBhc3NlcnQoVC5pc09TV2luZG93cygpICYmICJvbmx5IFdpbmRvd3MgQ09GRiBpcyBzdXBwb3J0ZWQiKTsKKyAgICAgIFMgPSBDT0ZGU3RyZWFtZXJDdG9yRm4oQ3R4LCBzdGQ6Om1vdmUoVEFCKSwgT1MsIHN0ZDo6bW92ZShFbWl0dGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXhBbGwsIEluY3JlbWVudGFsTGlua2VyQ29tcGF0aWJsZSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRyaXBsZTo6TWFjaE86CisgICAgICBpZiAoTWFjaE9TdHJlYW1lckN0b3JGbikKKyAgICAgICAgUyA9IE1hY2hPU3RyZWFtZXJDdG9yRm4oQ3R4LCBzdGQ6Om1vdmUoVEFCKSwgT1MsIHN0ZDo6bW92ZShFbWl0dGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsYXhBbGwsIERXQVJGTXVzdEJlQXRUaGVFbmQpOworICAgICAgZWxzZQorICAgICAgICBTID0gY3JlYXRlTWFjaE9TdHJlYW1lcihDdHgsIHN0ZDo6bW92ZShUQUIpLCBPUywgc3RkOjptb3ZlKEVtaXR0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxheEFsbCwgRFdBUkZNdXN0QmVBdFRoZUVuZCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRyaXBsZTo6RUxGOgorICAgICAgaWYgKEVMRlN0cmVhbWVyQ3RvckZuKQorICAgICAgICBTID0gRUxGU3RyZWFtZXJDdG9yRm4oVCwgQ3R4LCBzdGQ6Om1vdmUoVEFCKSwgT1MsIHN0ZDo6bW92ZShFbWl0dGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbGF4QWxsKTsKKyAgICAgIGVsc2UKKyAgICAgICAgUyA9IGNyZWF0ZUVMRlN0cmVhbWVyKEN0eCwgc3RkOjptb3ZlKFRBQiksIE9TLCBzdGQ6Om1vdmUoRW1pdHRlciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxheEFsbCk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFRyaXBsZTo6V2FzbToKKyAgICAgIGlmIChXYXNtU3RyZWFtZXJDdG9yRm4pCisgICAgICAgIFMgPSBXYXNtU3RyZWFtZXJDdG9yRm4oVCwgQ3R4LCBzdGQ6Om1vdmUoVEFCKSwgT1MsIHN0ZDo6bW92ZShFbWl0dGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxheEFsbCk7CisgICAgICBlbHNlCisgICAgICAgIFMgPSBjcmVhdGVXYXNtU3RyZWFtZXIoQ3R4LCBzdGQ6Om1vdmUoVEFCKSwgT1MsIHN0ZDo6bW92ZShFbWl0dGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWxheEFsbCk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgaWYgKE9iamVjdFRhcmdldFN0cmVhbWVyQ3RvckZuKQorICAgICAgT2JqZWN0VGFyZ2V0U3RyZWFtZXJDdG9yRm4oKlMsIFNUSSk7CisgICAgcmV0dXJuIFM7CisgIH0KKworICBNQ1N0cmVhbWVyICpjcmVhdGVBc21TdHJlYW1lcihNQ0NvbnRleHQgJkN0eCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPGZvcm1hdHRlZF9yYXdfb3N0cmVhbT4gT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNWZXJib3NlQXNtLCBib29sIFVzZUR3YXJmRGlyZWN0b3J5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0luc3RQcmludGVyICpJbnN0UHJpbnQsIE1DQ29kZUVtaXR0ZXIgKkNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FzbUJhY2tlbmQgKlRBQiwgYm9vbCBTaG93SW5zdCkgY29uc3QgeworICAgIGZvcm1hdHRlZF9yYXdfb3N0cmVhbSAmT1NSZWYgPSAqT1M7CisgICAgTUNTdHJlYW1lciAqUyA9IGxsdm06OmNyZWF0ZUFzbVN0cmVhbWVyKEN0eCwgc3RkOjptb3ZlKE9TKSwgSXNWZXJib3NlQXNtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVc2VEd2FyZkRpcmVjdG9yeSwgSW5zdFByaW50LCBDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVEFCLCBTaG93SW5zdCk7CisgICAgY3JlYXRlQXNtVGFyZ2V0U3RyZWFtZXIoKlMsIE9TUmVmLCBJbnN0UHJpbnQsIElzVmVyYm9zZUFzbSk7CisgICAgcmV0dXJuIFM7CisgIH0KKworICBNQ1RhcmdldFN0cmVhbWVyICpjcmVhdGVBc21UYXJnZXRTdHJlYW1lcihNQ1N0cmVhbWVyICZTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JtYXR0ZWRfcmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0luc3RQcmludGVyICpJbnN0UHJpbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgSXNWZXJib3NlQXNtKSBjb25zdCB7CisgICAgaWYgKEFzbVRhcmdldFN0cmVhbWVyQ3RvckZuKQorICAgICAgcmV0dXJuIEFzbVRhcmdldFN0cmVhbWVyQ3RvckZuKFMsIE9TLCBJbnN0UHJpbnQsIElzVmVyYm9zZUFzbSk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICBNQ1N0cmVhbWVyICpjcmVhdGVOdWxsU3RyZWFtZXIoTUNDb250ZXh0ICZDdHgpIGNvbnN0IHsKKyAgICBNQ1N0cmVhbWVyICpTID0gbGx2bTo6Y3JlYXRlTnVsbFN0cmVhbWVyKEN0eCk7CisgICAgY3JlYXRlTnVsbFRhcmdldFN0cmVhbWVyKCpTKTsKKyAgICByZXR1cm4gUzsKKyAgfQorCisgIE1DVGFyZ2V0U3RyZWFtZXIgKmNyZWF0ZU51bGxUYXJnZXRTdHJlYW1lcihNQ1N0cmVhbWVyICZTKSBjb25zdCB7CisgICAgaWYgKE51bGxUYXJnZXRTdHJlYW1lckN0b3JGbikKKyAgICAgIHJldHVybiBOdWxsVGFyZ2V0U3RyZWFtZXJDdG9yRm4oUyk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gY3JlYXRlTUNSZWxvY2F0aW9uSW5mbyAtIENyZWF0ZSBhIHRhcmdldCBzcGVjaWZpYyBNQ1JlbG9jYXRpb25JbmZvLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUVCBUaGUgdGFyZ2V0IHRyaXBsZS4KKyAgLy8vIFxwYXJhbSBDdHggVGhlIHRhcmdldCBjb250ZXh0LgorICBNQ1JlbG9jYXRpb25JbmZvICpjcmVhdGVNQ1JlbG9jYXRpb25JbmZvKFN0cmluZ1JlZiBUVCwgTUNDb250ZXh0ICZDdHgpIGNvbnN0IHsKKyAgICBNQ1JlbG9jYXRpb25JbmZvQ3RvclR5IEZuID0gTUNSZWxvY2F0aW9uSW5mb0N0b3JGbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBNQ1JlbG9jYXRpb25JbmZvQ3RvckZuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGxsdm06OmNyZWF0ZU1DUmVsb2NhdGlvbkluZm87CisgICAgcmV0dXJuIEZuKFRyaXBsZShUVCksIEN0eCk7CisgIH0KKworICAvLy8gY3JlYXRlTUNTeW1ib2xpemVyIC0gQ3JlYXRlIGEgdGFyZ2V0IHNwZWNpZmljIE1DU3ltYm9saXplci4KKyAgLy8vCisgIC8vLyBccGFyYW0gVFQgVGhlIHRhcmdldCB0cmlwbGUuCisgIC8vLyBccGFyYW0gR2V0T3BJbmZvIFRoZSBmdW5jdGlvbiB0byBnZXQgdGhlIHN5bWJvbGljIGluZm9ybWF0aW9uIGZvcgorICAvLy8gb3BlcmFuZHMuCisgIC8vLyBccGFyYW0gU3ltYm9sTG9va1VwIFRoZSBmdW5jdGlvbiB0byBsb29rdXAgYSBzeW1ib2wgbmFtZS4KKyAgLy8vIFxwYXJhbSBEaXNJbmZvIFRoZSBwb2ludGVyIHRvIHRoZSBibG9jayBvZiBzeW1ib2xpYyBpbmZvcm1hdGlvbiBmb3IgYWJvdmUKKyAgLy8vIGNhbGwKKyAgLy8vIGJhY2suCisgIC8vLyBccGFyYW0gQ3R4IFRoZSB0YXJnZXQgY29udGV4dC4KKyAgLy8vIFxwYXJhbSBSZWxJbmZvIFRoZSByZWxvY2F0aW9uIGluZm9ybWF0aW9uIGZvciB0aGlzIHRhcmdldC4gVGFrZXMKKyAgLy8vIG93bmVyc2hpcC4KKyAgTUNTeW1ib2xpemVyICoKKyAgY3JlYXRlTUNTeW1ib2xpemVyKFN0cmluZ1JlZiBUVCwgTExWTU9wSW5mb0NhbGxiYWNrIEdldE9wSW5mbywKKyAgICAgICAgICAgICAgICAgICAgIExMVk1TeW1ib2xMb29rdXBDYWxsYmFjayBTeW1ib2xMb29rVXAsIHZvaWQgKkRpc0luZm8sCisgICAgICAgICAgICAgICAgICAgICBNQ0NvbnRleHQgKkN0eCwKKyAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNQ1JlbG9jYXRpb25JbmZvPiAmJlJlbEluZm8pIGNvbnN0IHsKKyAgICBNQ1N5bWJvbGl6ZXJDdG9yVHkgRm4gPQorICAgICAgICBNQ1N5bWJvbGl6ZXJDdG9yRm4gPyBNQ1N5bWJvbGl6ZXJDdG9yRm4gOiBsbHZtOjpjcmVhdGVNQ1N5bWJvbGl6ZXI7CisgICAgcmV0dXJuIEZuKFRyaXBsZShUVCksIEdldE9wSW5mbywgU3ltYm9sTG9va1VwLCBEaXNJbmZvLCBDdHgsCisgICAgICAgICAgICAgIHN0ZDo6bW92ZShSZWxJbmZvKSk7CisgIH0KKworICAvLy8gQH0KK307CisKKy8vLyBUYXJnZXRSZWdpc3RyeSAtIEdlbmVyaWMgaW50ZXJmYWNlIHRvIHRhcmdldCBzcGVjaWZpYyBmZWF0dXJlcy4KK3N0cnVjdCBUYXJnZXRSZWdpc3RyeSB7CisgIC8vIEZJWE1FOiBNYWtlIHRoaXMgYSBuYW1lc3BhY2UsIHByb2JhYmx5IGp1c3QgbW92ZSBhbGwgdGhlIFJlZ2lzdGVyKgorICAvLyBmdW5jdGlvbnMgaW50byBUYXJnZXQgKGN1cnJlbnRseSB0aGV5IGFsbCBqdXN0IHNldCBtZW1iZXJzIG9uIHRoZSBUYXJnZXQKKyAgLy8gYW55d2F5LCBhbmQgVGFyZ2V0IGZyaWVuZHMgdGhpcyBjbGFzcyBzbyB0aG9zZSBmdW5jdGlvbnMgY2FuLi4uCisgIC8vIGZ1bmN0aW9uKS4KKyAgVGFyZ2V0UmVnaXN0cnkoKSA9IGRlbGV0ZTsKKworICBjbGFzcyBpdGVyYXRvcgorICAgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBUYXJnZXQsIHB0cmRpZmZfdD4geworICAgIGZyaWVuZCBzdHJ1Y3QgVGFyZ2V0UmVnaXN0cnk7CisKKyAgICBjb25zdCBUYXJnZXQgKkN1cnJlbnQgPSBudWxscHRyOworCisgICAgZXhwbGljaXQgaXRlcmF0b3IoVGFyZ2V0ICpUKSA6IEN1cnJlbnQoVCkge30KKworICBwdWJsaWM6CisgICAgaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisKKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3IgJngpIGNvbnN0IHsgcmV0dXJuIEN1cnJlbnQgPT0geC5DdXJyZW50OyB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yICZ4KSBjb25zdCB7IHJldHVybiAhb3BlcmF0b3I9PSh4KTsgfQorCisgICAgLy8gSXRlcmF0b3IgdHJhdmVyc2FsOiBmb3J3YXJkIGl0ZXJhdGlvbiBvbmx5CisgICAgaXRlcmF0b3IgJm9wZXJhdG9yKysoKSB7IC8vIFByZWluY3JlbWVudAorICAgICAgYXNzZXJ0KEN1cnJlbnQgJiYgIkNhbm5vdCBpbmNyZW1lbnQgZW5kIGl0ZXJhdG9yISIpOworICAgICAgQ3VycmVudCA9IEN1cnJlbnQtPmdldE5leHQoKTsKKyAgICAgIHJldHVybiAqdGhpczsKKyAgICB9CisgICAgaXRlcmF0b3Igb3BlcmF0b3IrKyhpbnQpIHsgLy8gUG9zdGluY3JlbWVudAorICAgICAgaXRlcmF0b3IgdG1wID0gKnRoaXM7CisgICAgICArKyp0aGlzOworICAgICAgcmV0dXJuIHRtcDsKKyAgICB9CisKKyAgICBjb25zdCBUYXJnZXQgJm9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICAgIGFzc2VydChDdXJyZW50ICYmICJDYW5ub3QgZGVyZWZlcmVuY2UgZW5kIGl0ZXJhdG9yISIpOworICAgICAgcmV0dXJuICpDdXJyZW50OworICAgIH0KKworICAgIGNvbnN0IFRhcmdldCAqb3BlcmF0b3ItPigpIGNvbnN0IHsgcmV0dXJuICZvcGVyYXRvciooKTsgfQorICB9OworCisgIC8vLyBwcmludFJlZ2lzdGVyZWRUYXJnZXRzRm9yVmVyc2lvbiAtIFByaW50IHRoZSByZWdpc3RlcmVkIHRhcmdldHMKKyAgLy8vIGFwcHJvcHJpYXRlbHkgZm9yIGluY2x1c2lvbiBpbiBhIHRvb2wncyB2ZXJzaW9uIG91dHB1dC4KKyAgc3RhdGljIHZvaWQgcHJpbnRSZWdpc3RlcmVkVGFyZ2V0c0ZvclZlcnNpb24ocmF3X29zdHJlYW0gJk9TKTsKKworICAvLy8gQG5hbWUgUmVnaXN0cnkgQWNjZXNzCisgIC8vLyBAeworCisgIHN0YXRpYyBpdGVyYXRvcl9yYW5nZTxpdGVyYXRvcj4gdGFyZ2V0cygpOworCisgIC8vLyBsb29rdXBUYXJnZXQgLSBMb29rdXAgYSB0YXJnZXQgYmFzZWQgb24gYSB0YXJnZXQgdHJpcGxlLgorICAvLy8KKyAgLy8vIFxwYXJhbSBUcmlwbGUgLSBUaGUgdHJpcGxlIHRvIHVzZSBmb3IgZmluZGluZyBhIHRhcmdldC4KKyAgLy8vIFxwYXJhbSBFcnJvciAtIE9uIGZhaWx1cmUsIGFuIGVycm9yIHN0cmluZyBkZXNjcmliaW5nIHdoeSBubyB0YXJnZXQgd2FzCisgIC8vLyBmb3VuZC4KKyAgc3RhdGljIGNvbnN0IFRhcmdldCAqbG9va3VwVGFyZ2V0KGNvbnN0IHN0ZDo6c3RyaW5nICZUcmlwbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyAmRXJyb3IpOworCisgIC8vLyBsb29rdXBUYXJnZXQgLSBMb29rdXAgYSB0YXJnZXQgYmFzZWQgb24gYW4gYXJjaGl0ZWN0dXJlIG5hbWUKKyAgLy8vIGFuZCBhIHRhcmdldCB0cmlwbGUuICBJZiB0aGUgYXJjaGl0ZWN0dXJlIG5hbWUgaXMgbm9uLWVtcHR5LAorICAvLy8gdGhlbiB0aGUgbG9va3VwIGlzIGRvbmUgYnkgYXJjaGl0ZWN0dXJlLiAgT3RoZXJ3aXNlLCB0aGUgdGFyZ2V0CisgIC8vLyB0cmlwbGUgaXMgdXNlZC4KKyAgLy8vCisgIC8vLyBccGFyYW0gQXJjaE5hbWUgLSBUaGUgYXJjaGl0ZWN0dXJlIHRvIHVzZSBmb3IgZmluZGluZyBhIHRhcmdldC4KKyAgLy8vIFxwYXJhbSBUaGVUcmlwbGUgLSBUaGUgdHJpcGxlIHRvIHVzZSBmb3IgZmluZGluZyBhIHRhcmdldC4gIFRoZQorICAvLy8gdHJpcGxlIGlzIHVwZGF0ZWQgd2l0aCBjYW5vbmljYWwgYXJjaGl0ZWN0dXJlIG5hbWUgaWYgYSBsb29rdXAKKyAgLy8vIGJ5IGFyY2hpdGVjdHVyZSBpcyBkb25lLgorICAvLy8gXHBhcmFtIEVycm9yIC0gT24gZmFpbHVyZSwgYW4gZXJyb3Igc3RyaW5nIGRlc2NyaWJpbmcgd2h5IG5vIHRhcmdldCB3YXMKKyAgLy8vIGZvdW5kLgorICBzdGF0aWMgY29uc3QgVGFyZ2V0ICpsb29rdXBUYXJnZXQoY29uc3Qgc3RkOjpzdHJpbmcgJkFyY2hOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHJpcGxlICZUaGVUcmlwbGUsIHN0ZDo6c3RyaW5nICZFcnJvcik7CisKKyAgLy8vIEB9CisgIC8vLyBAbmFtZSBUYXJnZXQgUmVnaXN0cmF0aW9uCisgIC8vLyBAeworCisgIC8vLyBSZWdpc3RlclRhcmdldCAtIFJlZ2lzdGVyIHRoZSBnaXZlbiB0YXJnZXQuIEF0dGVtcHRzIHRvIHJlZ2lzdGVyIGEKKyAgLy8vIHRhcmdldCB3aGljaCBoYXMgYWxyZWFkeSBiZWVuIHJlZ2lzdGVyZWQgd2lsbCBiZSBpZ25vcmVkLgorICAvLy8KKyAgLy8vIENsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHJlZ2lzdHJhdGlvbiBkb2Vzbid0IG9jY3VyCisgIC8vLyB3aGlsZSBhbm90aGVyIHRocmVhZCBpcyBhdHRlbXB0aW5nIHRvIGFjY2VzcyB0aGUgcmVnaXN0cnkuIFR5cGljYWxseQorICAvLy8gdGhpcyBpcyBkb25lIGJ5IGluaXRpYWxpemluZyBhbGwgdGFyZ2V0cyBhdCBwcm9ncmFtIHN0YXJ0dXAuCisgIC8vLworICAvLy8gQHBhcmFtIFQgLSBUaGUgdGFyZ2V0IGJlaW5nIHJlZ2lzdGVyZWQuCisgIC8vLyBAcGFyYW0gTmFtZSAtIFRoZSB0YXJnZXQgbmFtZS4gVGhpcyBzaG91bGQgYmUgYSBzdGF0aWMgc3RyaW5nLgorICAvLy8gQHBhcmFtIFNob3J0RGVzYyAtIEEgc2hvcnQgdGFyZ2V0IGRlc2NyaXB0aW9uLiBUaGlzIHNob3VsZCBiZSBhIHN0YXRpYworICAvLy8gc3RyaW5nLgorICAvLy8gQHBhcmFtIEJhY2tlbmROYW1lIC0gVGhlIG5hbWUgb2YgdGhlIGJhY2tlbmQuIFRoaXMgc2hvdWxkIGJlIGEgc3RhdGljCisgIC8vLyBzdHJpbmcgdGhhdCBpcyB0aGUgc2FtZSBmb3IgYWxsIHRhcmdldHMgdGhhdCBzaGFyZSBhIGJhY2tlbmQKKyAgLy8vIGltcGxlbWVudGF0aW9uIGFuZCBtdXN0IG1hdGNoIHRoZSBuYW1lIHVzZWQgaW4gdGhlICdkZWYgWCA6IFRhcmdldCAuLi4nIGluCisgIC8vLyBUYWJsZUdlbi4KKyAgLy8vIEBwYXJhbSBBcmNoTWF0Y2hGbiAtIFRoZSBhcmNoIG1hdGNoIGNoZWNraW5nIGZ1bmN0aW9uIGZvciB0aGlzIHRhcmdldC4KKyAgLy8vIEBwYXJhbSBIYXNKSVQgLSBXaGV0aGVyIHRoZSB0YXJnZXQgc3VwcG9ydHMgSklUIGNvZGUKKyAgLy8vIGdlbmVyYXRpb24uCisgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyVGFyZ2V0KFRhcmdldCAmVCwgY29uc3QgY2hhciAqTmFtZSwgY29uc3QgY2hhciAqU2hvcnREZXNjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpCYWNrZW5kTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0OjpBcmNoTWF0Y2hGblR5IEFyY2hNYXRjaEZuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEhhc0pJVCA9IGZhbHNlKTsKKworICAvLy8gUmVnaXN0ZXJNQ0FzbUluZm8gLSBSZWdpc3RlciBhIE1DQXNtSW5mbyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlCisgIC8vLyBnaXZlbiB0YXJnZXQuCisgIC8vLworICAvLy8gQ2xpZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgcmVnaXN0cmF0aW9uIGRvZXNuJ3Qgb2NjdXIKKyAgLy8vIHdoaWxlIGFub3RoZXIgdGhyZWFkIGlzIGF0dGVtcHRpbmcgdG8gYWNjZXNzIHRoZSByZWdpc3RyeS4gVHlwaWNhbGx5CisgIC8vLyB0aGlzIGlzIGRvbmUgYnkgaW5pdGlhbGl6aW5nIGFsbCB0YXJnZXRzIGF0IHByb2dyYW0gc3RhcnR1cC4KKyAgLy8vCisgIC8vLyBAcGFyYW0gVCAtIFRoZSB0YXJnZXQgYmVpbmcgcmVnaXN0ZXJlZC4KKyAgLy8vIEBwYXJhbSBGbiAtIEEgZnVuY3Rpb24gdG8gY29uc3RydWN0IGEgTUNBc21JbmZvIGZvciB0aGUgdGFyZ2V0LgorICBzdGF0aWMgdm9pZCBSZWdpc3Rlck1DQXNtSW5mbyhUYXJnZXQgJlQsIFRhcmdldDo6TUNBc21JbmZvQ3RvckZuVHkgRm4pIHsKKyAgICBULk1DQXNtSW5mb0N0b3JGbiA9IEZuOworICB9CisKKyAgLy8vIFJlZ2lzdGVyTUNJbnN0ckluZm8gLSBSZWdpc3RlciBhIE1DSW5zdHJJbmZvIGltcGxlbWVudGF0aW9uIGZvciB0aGUKKyAgLy8vIGdpdmVuIHRhcmdldC4KKyAgLy8vCisgIC8vLyBDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCByZWdpc3RyYXRpb24gZG9lc24ndCBvY2N1cgorICAvLy8gd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgYXR0ZW1wdGluZyB0byBhY2Nlc3MgdGhlIHJlZ2lzdHJ5LiBUeXBpY2FsbHkKKyAgLy8vIHRoaXMgaXMgZG9uZSBieSBpbml0aWFsaXppbmcgYWxsIHRhcmdldHMgYXQgcHJvZ3JhbSBzdGFydHVwLgorICAvLy8KKyAgLy8vIEBwYXJhbSBUIC0gVGhlIHRhcmdldCBiZWluZyByZWdpc3RlcmVkLgorICAvLy8gQHBhcmFtIEZuIC0gQSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYSBNQ0luc3RySW5mbyBmb3IgdGhlIHRhcmdldC4KKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJNQ0luc3RySW5mbyhUYXJnZXQgJlQsIFRhcmdldDo6TUNJbnN0ckluZm9DdG9yRm5UeSBGbikgeworICAgIFQuTUNJbnN0ckluZm9DdG9yRm4gPSBGbjsKKyAgfQorCisgIC8vLyBSZWdpc3Rlck1DSW5zdHJBbmFseXNpcyAtIFJlZ2lzdGVyIGEgTUNJbnN0ckFuYWx5c2lzIGltcGxlbWVudGF0aW9uIGZvcgorICAvLy8gdGhlIGdpdmVuIHRhcmdldC4KKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJNQ0luc3RyQW5hbHlzaXMoVGFyZ2V0ICZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQ6Ok1DSW5zdHJBbmFseXNpc0N0b3JGblR5IEZuKSB7CisgICAgVC5NQ0luc3RyQW5hbHlzaXNDdG9yRm4gPSBGbjsKKyAgfQorCisgIC8vLyBSZWdpc3Rlck1DUmVnSW5mbyAtIFJlZ2lzdGVyIGEgTUNSZWdpc3RlckluZm8gaW1wbGVtZW50YXRpb24gZm9yIHRoZQorICAvLy8gZ2l2ZW4gdGFyZ2V0LgorICAvLy8KKyAgLy8vIENsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHJlZ2lzdHJhdGlvbiBkb2Vzbid0IG9jY3VyCisgIC8vLyB3aGlsZSBhbm90aGVyIHRocmVhZCBpcyBhdHRlbXB0aW5nIHRvIGFjY2VzcyB0aGUgcmVnaXN0cnkuIFR5cGljYWxseQorICAvLy8gdGhpcyBpcyBkb25lIGJ5IGluaXRpYWxpemluZyBhbGwgdGFyZ2V0cyBhdCBwcm9ncmFtIHN0YXJ0dXAuCisgIC8vLworICAvLy8gQHBhcmFtIFQgLSBUaGUgdGFyZ2V0IGJlaW5nIHJlZ2lzdGVyZWQuCisgIC8vLyBAcGFyYW0gRm4gLSBBIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCBhIE1DUmVnaXN0ZXJJbmZvIGZvciB0aGUgdGFyZ2V0LgorICBzdGF0aWMgdm9pZCBSZWdpc3Rlck1DUmVnSW5mbyhUYXJnZXQgJlQsIFRhcmdldDo6TUNSZWdJbmZvQ3RvckZuVHkgRm4pIHsKKyAgICBULk1DUmVnSW5mb0N0b3JGbiA9IEZuOworICB9CisKKyAgLy8vIFJlZ2lzdGVyTUNTdWJ0YXJnZXRJbmZvIC0gUmVnaXN0ZXIgYSBNQ1N1YnRhcmdldEluZm8gaW1wbGVtZW50YXRpb24gZm9yCisgIC8vLyB0aGUgZ2l2ZW4gdGFyZ2V0LgorICAvLy8KKyAgLy8vIENsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHJlZ2lzdHJhdGlvbiBkb2Vzbid0IG9jY3VyCisgIC8vLyB3aGlsZSBhbm90aGVyIHRocmVhZCBpcyBhdHRlbXB0aW5nIHRvIGFjY2VzcyB0aGUgcmVnaXN0cnkuIFR5cGljYWxseQorICAvLy8gdGhpcyBpcyBkb25lIGJ5IGluaXRpYWxpemluZyBhbGwgdGFyZ2V0cyBhdCBwcm9ncmFtIHN0YXJ0dXAuCisgIC8vLworICAvLy8gQHBhcmFtIFQgLSBUaGUgdGFyZ2V0IGJlaW5nIHJlZ2lzdGVyZWQuCisgIC8vLyBAcGFyYW0gRm4gLSBBIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCBhIE1DU3VidGFyZ2V0SW5mbyBmb3IgdGhlIHRhcmdldC4KKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJNQ1N1YnRhcmdldEluZm8oVGFyZ2V0ICZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQ6Ok1DU3VidGFyZ2V0SW5mb0N0b3JGblR5IEZuKSB7CisgICAgVC5NQ1N1YnRhcmdldEluZm9DdG9yRm4gPSBGbjsKKyAgfQorCisgIC8vLyBSZWdpc3RlclRhcmdldE1hY2hpbmUgLSBSZWdpc3RlciBhIFRhcmdldE1hY2hpbmUgaW1wbGVtZW50YXRpb24gZm9yIHRoZQorICAvLy8gZ2l2ZW4gdGFyZ2V0LgorICAvLy8KKyAgLy8vIENsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHJlZ2lzdHJhdGlvbiBkb2Vzbid0IG9jY3VyCisgIC8vLyB3aGlsZSBhbm90aGVyIHRocmVhZCBpcyBhdHRlbXB0aW5nIHRvIGFjY2VzcyB0aGUgcmVnaXN0cnkuIFR5cGljYWxseQorICAvLy8gdGhpcyBpcyBkb25lIGJ5IGluaXRpYWxpemluZyBhbGwgdGFyZ2V0cyBhdCBwcm9ncmFtIHN0YXJ0dXAuCisgIC8vLworICAvLy8gQHBhcmFtIFQgLSBUaGUgdGFyZ2V0IGJlaW5nIHJlZ2lzdGVyZWQuCisgIC8vLyBAcGFyYW0gRm4gLSBBIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCBhIFRhcmdldE1hY2hpbmUgZm9yIHRoZSB0YXJnZXQuCisgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyVGFyZ2V0TWFjaGluZShUYXJnZXQgJlQsIFRhcmdldDo6VGFyZ2V0TWFjaGluZUN0b3JUeSBGbikgeworICAgIFQuVGFyZ2V0TWFjaGluZUN0b3JGbiA9IEZuOworICB9CisKKyAgLy8vIFJlZ2lzdGVyTUNBc21CYWNrZW5kIC0gUmVnaXN0ZXIgYSBNQ0FzbUJhY2tlbmQgaW1wbGVtZW50YXRpb24gZm9yIHRoZQorICAvLy8gZ2l2ZW4gdGFyZ2V0LgorICAvLy8KKyAgLy8vIENsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHJlZ2lzdHJhdGlvbiBkb2Vzbid0IG9jY3VyCisgIC8vLyB3aGlsZSBhbm90aGVyIHRocmVhZCBpcyBhdHRlbXB0aW5nIHRvIGFjY2VzcyB0aGUgcmVnaXN0cnkuIFR5cGljYWxseQorICAvLy8gdGhpcyBpcyBkb25lIGJ5IGluaXRpYWxpemluZyBhbGwgdGFyZ2V0cyBhdCBwcm9ncmFtIHN0YXJ0dXAuCisgIC8vLworICAvLy8gQHBhcmFtIFQgLSBUaGUgdGFyZ2V0IGJlaW5nIHJlZ2lzdGVyZWQuCisgIC8vLyBAcGFyYW0gRm4gLSBBIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCBhbiBBc21CYWNrZW5kIGZvciB0aGUgdGFyZ2V0LgorICBzdGF0aWMgdm9pZCBSZWdpc3Rlck1DQXNtQmFja2VuZChUYXJnZXQgJlQsIFRhcmdldDo6TUNBc21CYWNrZW5kQ3RvclR5IEZuKSB7CisgICAgVC5NQ0FzbUJhY2tlbmRDdG9yRm4gPSBGbjsKKyAgfQorCisgIC8vLyBSZWdpc3Rlck1DQXNtUGFyc2VyIC0gUmVnaXN0ZXIgYSBNQ1RhcmdldEFzbVBhcnNlciBpbXBsZW1lbnRhdGlvbiBmb3IKKyAgLy8vIHRoZSBnaXZlbiB0YXJnZXQuCisgIC8vLworICAvLy8gQ2xpZW50cyBhcmUgcmVzcG9uc2libGUgZm9yIGVuc3VyaW5nIHRoYXQgcmVnaXN0cmF0aW9uIGRvZXNuJ3Qgb2NjdXIKKyAgLy8vIHdoaWxlIGFub3RoZXIgdGhyZWFkIGlzIGF0dGVtcHRpbmcgdG8gYWNjZXNzIHRoZSByZWdpc3RyeS4gVHlwaWNhbGx5CisgIC8vLyB0aGlzIGlzIGRvbmUgYnkgaW5pdGlhbGl6aW5nIGFsbCB0YXJnZXRzIGF0IHByb2dyYW0gc3RhcnR1cC4KKyAgLy8vCisgIC8vLyBAcGFyYW0gVCAtIFRoZSB0YXJnZXQgYmVpbmcgcmVnaXN0ZXJlZC4KKyAgLy8vIEBwYXJhbSBGbiAtIEEgZnVuY3Rpb24gdG8gY29uc3RydWN0IGFuIE1DVGFyZ2V0QXNtUGFyc2VyIGZvciB0aGUgdGFyZ2V0LgorICBzdGF0aWMgdm9pZCBSZWdpc3Rlck1DQXNtUGFyc2VyKFRhcmdldCAmVCwgVGFyZ2V0OjpNQ0FzbVBhcnNlckN0b3JUeSBGbikgeworICAgIFQuTUNBc21QYXJzZXJDdG9yRm4gPSBGbjsKKyAgfQorCisgIC8vLyBSZWdpc3RlckFzbVByaW50ZXIgLSBSZWdpc3RlciBhbiBBc21QcmludGVyIGltcGxlbWVudGF0aW9uIGZvciB0aGUgZ2l2ZW4KKyAgLy8vIHRhcmdldC4KKyAgLy8vCisgIC8vLyBDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCByZWdpc3RyYXRpb24gZG9lc24ndCBvY2N1cgorICAvLy8gd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgYXR0ZW1wdGluZyB0byBhY2Nlc3MgdGhlIHJlZ2lzdHJ5LiBUeXBpY2FsbHkKKyAgLy8vIHRoaXMgaXMgZG9uZSBieSBpbml0aWFsaXppbmcgYWxsIHRhcmdldHMgYXQgcHJvZ3JhbSBzdGFydHVwLgorICAvLy8KKyAgLy8vIEBwYXJhbSBUIC0gVGhlIHRhcmdldCBiZWluZyByZWdpc3RlcmVkLgorICAvLy8gQHBhcmFtIEZuIC0gQSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYW4gQXNtUHJpbnRlciBmb3IgdGhlIHRhcmdldC4KKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJBc21QcmludGVyKFRhcmdldCAmVCwgVGFyZ2V0OjpBc21QcmludGVyQ3RvclR5IEZuKSB7CisgICAgVC5Bc21QcmludGVyQ3RvckZuID0gRm47CisgIH0KKworICAvLy8gUmVnaXN0ZXJNQ0Rpc2Fzc2VtYmxlciAtIFJlZ2lzdGVyIGEgTUNEaXNhc3NlbWJsZXIgaW1wbGVtZW50YXRpb24gZm9yCisgIC8vLyB0aGUgZ2l2ZW4gdGFyZ2V0LgorICAvLy8KKyAgLy8vIENsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHJlZ2lzdHJhdGlvbiBkb2Vzbid0IG9jY3VyCisgIC8vLyB3aGlsZSBhbm90aGVyIHRocmVhZCBpcyBhdHRlbXB0aW5nIHRvIGFjY2VzcyB0aGUgcmVnaXN0cnkuIFR5cGljYWxseQorICAvLy8gdGhpcyBpcyBkb25lIGJ5IGluaXRpYWxpemluZyBhbGwgdGFyZ2V0cyBhdCBwcm9ncmFtIHN0YXJ0dXAuCisgIC8vLworICAvLy8gQHBhcmFtIFQgLSBUaGUgdGFyZ2V0IGJlaW5nIHJlZ2lzdGVyZWQuCisgIC8vLyBAcGFyYW0gRm4gLSBBIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCBhbiBNQ0Rpc2Fzc2VtYmxlciBmb3IgdGhlIHRhcmdldC4KKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJNQ0Rpc2Fzc2VtYmxlcihUYXJnZXQgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0OjpNQ0Rpc2Fzc2VtYmxlckN0b3JUeSBGbikgeworICAgIFQuTUNEaXNhc3NlbWJsZXJDdG9yRm4gPSBGbjsKKyAgfQorCisgIC8vLyBSZWdpc3Rlck1DSW5zdFByaW50ZXIgLSBSZWdpc3RlciBhIE1DSW5zdFByaW50ZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoZQorICAvLy8gZ2l2ZW4gdGFyZ2V0LgorICAvLy8KKyAgLy8vIENsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHJlZ2lzdHJhdGlvbiBkb2Vzbid0IG9jY3VyCisgIC8vLyB3aGlsZSBhbm90aGVyIHRocmVhZCBpcyBhdHRlbXB0aW5nIHRvIGFjY2VzcyB0aGUgcmVnaXN0cnkuIFR5cGljYWxseQorICAvLy8gdGhpcyBpcyBkb25lIGJ5IGluaXRpYWxpemluZyBhbGwgdGFyZ2V0cyBhdCBwcm9ncmFtIHN0YXJ0dXAuCisgIC8vLworICAvLy8gQHBhcmFtIFQgLSBUaGUgdGFyZ2V0IGJlaW5nIHJlZ2lzdGVyZWQuCisgIC8vLyBAcGFyYW0gRm4gLSBBIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCBhbiBNQ0luc3RQcmludGVyIGZvciB0aGUgdGFyZ2V0LgorICBzdGF0aWMgdm9pZCBSZWdpc3Rlck1DSW5zdFByaW50ZXIoVGFyZ2V0ICZULCBUYXJnZXQ6Ok1DSW5zdFByaW50ZXJDdG9yVHkgRm4pIHsKKyAgICBULk1DSW5zdFByaW50ZXJDdG9yRm4gPSBGbjsKKyAgfQorCisgIC8vLyBSZWdpc3Rlck1DQ29kZUVtaXR0ZXIgLSBSZWdpc3RlciBhIE1DQ29kZUVtaXR0ZXIgaW1wbGVtZW50YXRpb24gZm9yIHRoZQorICAvLy8gZ2l2ZW4gdGFyZ2V0LgorICAvLy8KKyAgLy8vIENsaWVudHMgYXJlIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHJlZ2lzdHJhdGlvbiBkb2Vzbid0IG9jY3VyCisgIC8vLyB3aGlsZSBhbm90aGVyIHRocmVhZCBpcyBhdHRlbXB0aW5nIHRvIGFjY2VzcyB0aGUgcmVnaXN0cnkuIFR5cGljYWxseQorICAvLy8gdGhpcyBpcyBkb25lIGJ5IGluaXRpYWxpemluZyBhbGwgdGFyZ2V0cyBhdCBwcm9ncmFtIHN0YXJ0dXAuCisgIC8vLworICAvLy8gQHBhcmFtIFQgLSBUaGUgdGFyZ2V0IGJlaW5nIHJlZ2lzdGVyZWQuCisgIC8vLyBAcGFyYW0gRm4gLSBBIGZ1bmN0aW9uIHRvIGNvbnN0cnVjdCBhbiBNQ0NvZGVFbWl0dGVyIGZvciB0aGUgdGFyZ2V0LgorICBzdGF0aWMgdm9pZCBSZWdpc3Rlck1DQ29kZUVtaXR0ZXIoVGFyZ2V0ICZULCBUYXJnZXQ6Ok1DQ29kZUVtaXR0ZXJDdG9yVHkgRm4pIHsKKyAgICBULk1DQ29kZUVtaXR0ZXJDdG9yRm4gPSBGbjsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyQ09GRlN0cmVhbWVyKFRhcmdldCAmVCwgVGFyZ2V0OjpDT0ZGU3RyZWFtZXJDdG9yVHkgRm4pIHsKKyAgICBULkNPRkZTdHJlYW1lckN0b3JGbiA9IEZuOworICB9CisKKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJNYWNoT1N0cmVhbWVyKFRhcmdldCAmVCwgVGFyZ2V0OjpNYWNoT1N0cmVhbWVyQ3RvclR5IEZuKSB7CisgICAgVC5NYWNoT1N0cmVhbWVyQ3RvckZuID0gRm47CisgIH0KKworICBzdGF0aWMgdm9pZCBSZWdpc3RlckVMRlN0cmVhbWVyKFRhcmdldCAmVCwgVGFyZ2V0OjpFTEZTdHJlYW1lckN0b3JUeSBGbikgeworICAgIFQuRUxGU3RyZWFtZXJDdG9yRm4gPSBGbjsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFJlZ2lzdGVyV2FzbVN0cmVhbWVyKFRhcmdldCAmVCwgVGFyZ2V0OjpXYXNtU3RyZWFtZXJDdG9yVHkgRm4pIHsKKyAgICBULldhc21TdHJlYW1lckN0b3JGbiA9IEZuOworICB9CisKKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJOdWxsVGFyZ2V0U3RyZWFtZXIoVGFyZ2V0ICZULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQ6Ok51bGxUYXJnZXRTdHJlYW1lckN0b3JUeSBGbikgeworICAgIFQuTnVsbFRhcmdldFN0cmVhbWVyQ3RvckZuID0gRm47CisgIH0KKworICBzdGF0aWMgdm9pZCBSZWdpc3RlckFzbVRhcmdldFN0cmVhbWVyKFRhcmdldCAmVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXQ6OkFzbVRhcmdldFN0cmVhbWVyQ3RvclR5IEZuKSB7CisgICAgVC5Bc21UYXJnZXRTdHJlYW1lckN0b3JGbiA9IEZuOworICB9CisKKyAgc3RhdGljIHZvaWQKKyAgUmVnaXN0ZXJPYmplY3RUYXJnZXRTdHJlYW1lcihUYXJnZXQgJlQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0OjpPYmplY3RUYXJnZXRTdHJlYW1lckN0b3JUeSBGbikgeworICAgIFQuT2JqZWN0VGFyZ2V0U3RyZWFtZXJDdG9yRm4gPSBGbjsKKyAgfQorCisgIC8vLyBSZWdpc3Rlck1DUmVsb2NhdGlvbkluZm8gLSBSZWdpc3RlciBhbiBNQ1JlbG9jYXRpb25JbmZvCisgIC8vLyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGdpdmVuIHRhcmdldC4KKyAgLy8vCisgIC8vLyBDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCByZWdpc3RyYXRpb24gZG9lc24ndCBvY2N1cgorICAvLy8gd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgYXR0ZW1wdGluZyB0byBhY2Nlc3MgdGhlIHJlZ2lzdHJ5LiBUeXBpY2FsbHkKKyAgLy8vIHRoaXMgaXMgZG9uZSBieSBpbml0aWFsaXppbmcgYWxsIHRhcmdldHMgYXQgcHJvZ3JhbSBzdGFydHVwLgorICAvLy8KKyAgLy8vIEBwYXJhbSBUIC0gVGhlIHRhcmdldCBiZWluZyByZWdpc3RlcmVkLgorICAvLy8gQHBhcmFtIEZuIC0gQSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYW4gTUNSZWxvY2F0aW9uSW5mbyBmb3IgdGhlIHRhcmdldC4KKyAgc3RhdGljIHZvaWQgUmVnaXN0ZXJNQ1JlbG9jYXRpb25JbmZvKFRhcmdldCAmVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldDo6TUNSZWxvY2F0aW9uSW5mb0N0b3JUeSBGbikgeworICAgIFQuTUNSZWxvY2F0aW9uSW5mb0N0b3JGbiA9IEZuOworICB9CisKKyAgLy8vIFJlZ2lzdGVyTUNTeW1ib2xpemVyIC0gUmVnaXN0ZXIgYW4gTUNTeW1ib2xpemVyCisgIC8vLyBpbXBsZW1lbnRhdGlvbiBmb3IgdGhlIGdpdmVuIHRhcmdldC4KKyAgLy8vCisgIC8vLyBDbGllbnRzIGFyZSByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCByZWdpc3RyYXRpb24gZG9lc24ndCBvY2N1cgorICAvLy8gd2hpbGUgYW5vdGhlciB0aHJlYWQgaXMgYXR0ZW1wdGluZyB0byBhY2Nlc3MgdGhlIHJlZ2lzdHJ5LiBUeXBpY2FsbHkKKyAgLy8vIHRoaXMgaXMgZG9uZSBieSBpbml0aWFsaXppbmcgYWxsIHRhcmdldHMgYXQgcHJvZ3JhbSBzdGFydHVwLgorICAvLy8KKyAgLy8vIEBwYXJhbSBUIC0gVGhlIHRhcmdldCBiZWluZyByZWdpc3RlcmVkLgorICAvLy8gQHBhcmFtIEZuIC0gQSBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgYW4gTUNTeW1ib2xpemVyIGZvciB0aGUgdGFyZ2V0LgorICBzdGF0aWMgdm9pZCBSZWdpc3Rlck1DU3ltYm9saXplcihUYXJnZXQgJlQsIFRhcmdldDo6TUNTeW1ib2xpemVyQ3RvclR5IEZuKSB7CisgICAgVC5NQ1N5bWJvbGl6ZXJDdG9yRm4gPSBGbjsKKyAgfQorCisgIC8vLyBAfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vLyBSZWdpc3RlclRhcmdldCAtIEhlbHBlciB0ZW1wbGF0ZSBmb3IgcmVnaXN0ZXJpbmcgYSB0YXJnZXQsIGZvciB1c2UgaW4gdGhlCisvLy8gdGFyZ2V0J3MgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb24uIFVzYWdlOgorLy8vCisvLy8KKy8vLyBUYXJnZXQgJmdldFRoZUZvb1RhcmdldCgpIHsgLy8gVGhlIGdsb2JhbCB0YXJnZXQgaW5zdGFuY2UuCisvLy8gICBzdGF0aWMgVGFyZ2V0IFRoZUZvb1RhcmdldDsKKy8vLyAgIHJldHVybiBUaGVGb29UYXJnZXQ7CisvLy8gfQorLy8vIGV4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUZvb1RhcmdldEluZm8oKSB7CisvLy8gICBSZWdpc3RlclRhcmdldDxUcmlwbGU6OmZvbz4gWChnZXRUaGVGb29UYXJnZXQoKSwgImZvbyIsICJGb28KKy8vLyAgIGRlc2NyaXB0aW9uIiwgIkZvbyIgLyogQmFja2VuZCBOYW1lICovKTsKKy8vLyB9Cit0ZW1wbGF0ZSA8VHJpcGxlOjpBcmNoVHlwZSBUYXJnZXRBcmNoVHlwZSA9IFRyaXBsZTo6VW5rbm93bkFyY2gsCisgICAgICAgICAgYm9vbCBIYXNKSVQgPSBmYWxzZT4KK3N0cnVjdCBSZWdpc3RlclRhcmdldCB7CisgIFJlZ2lzdGVyVGFyZ2V0KFRhcmdldCAmVCwgY29uc3QgY2hhciAqTmFtZSwgY29uc3QgY2hhciAqRGVzYywKKyAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqQmFja2VuZE5hbWUpIHsKKyAgICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJUYXJnZXQoVCwgTmFtZSwgRGVzYywgQmFja2VuZE5hbWUsICZnZXRBcmNoTWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhc0pJVCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBnZXRBcmNoTWF0Y2goVHJpcGxlOjpBcmNoVHlwZSBBcmNoKSB7CisgICAgcmV0dXJuIEFyY2ggPT0gVGFyZ2V0QXJjaFR5cGU7CisgIH0KK307CisKKy8vLyBSZWdpc3Rlck1DQXNtSW5mbyAtIEhlbHBlciB0ZW1wbGF0ZSBmb3IgcmVnaXN0ZXJpbmcgYSB0YXJnZXQgYXNzZW1ibHkgaW5mbworLy8vIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpbnZva2VzIHRoZSBzdGF0aWMgIkNyZWF0ZSIgbWV0aG9kIG9uIHRoZSBjbGFzcyB0bworLy8vIGFjdHVhbGx5IGRvIHRoZSBjb25zdHJ1Y3Rpb24uICBVc2FnZToKKy8vLworLy8vIGV4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUZvb1RhcmdldCgpIHsKKy8vLyAgIGV4dGVybiBUYXJnZXQgVGhlRm9vVGFyZ2V0OworLy8vICAgUmVnaXN0ZXJNQ0FzbUluZm88Rm9vTUNBc21JbmZvPiBYKFRoZUZvb1RhcmdldCk7CisvLy8gfQordGVtcGxhdGUgPGNsYXNzIE1DQXNtSW5mb0ltcGw+IHN0cnVjdCBSZWdpc3Rlck1DQXNtSW5mbyB7CisgIFJlZ2lzdGVyTUNBc21JbmZvKFRhcmdldCAmVCkgeworICAgIFRhcmdldFJlZ2lzdHJ5OjpSZWdpc3Rlck1DQXNtSW5mbyhULCAmQWxsb2NhdG9yKTsKKyAgfQorCitwcml2YXRlOgorICBzdGF0aWMgTUNBc21JbmZvICpBbGxvY2F0b3IoY29uc3QgTUNSZWdpc3RlckluZm8gJiAvKk1SSSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHJpcGxlICZUVCkgeworICAgIHJldHVybiBuZXcgTUNBc21JbmZvSW1wbChUVCk7CisgIH0KK307CisKKy8vLyBSZWdpc3Rlck1DQXNtSW5mb0ZuIC0gSGVscGVyIHRlbXBsYXRlIGZvciByZWdpc3RlcmluZyBhIHRhcmdldCBhc3NlbWJseSBpbmZvCisvLy8gaW1wbGVtZW50YXRpb24uICBUaGlzIGludm9rZXMgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiB0byBkbyB0aGUKKy8vLyBjb25zdHJ1Y3Rpb24uICBVc2FnZToKKy8vLworLy8vIGV4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUZvb1RhcmdldCgpIHsKKy8vLyAgIGV4dGVybiBUYXJnZXQgVGhlRm9vVGFyZ2V0OworLy8vICAgUmVnaXN0ZXJNQ0FzbUluZm9GbiBYKFRoZUZvb1RhcmdldCwgVGhlRnVuY3Rpb24pOworLy8vIH0KK3N0cnVjdCBSZWdpc3Rlck1DQXNtSW5mb0ZuIHsKKyAgUmVnaXN0ZXJNQ0FzbUluZm9GbihUYXJnZXQgJlQsIFRhcmdldDo6TUNBc21JbmZvQ3RvckZuVHkgRm4pIHsKKyAgICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJNQ0FzbUluZm8oVCwgRm4pOworICB9Cit9OworCisvLy8gUmVnaXN0ZXJNQ0luc3RySW5mbyAtIEhlbHBlciB0ZW1wbGF0ZSBmb3IgcmVnaXN0ZXJpbmcgYSB0YXJnZXQgaW5zdHJ1Y3Rpb24KKy8vLyBpbmZvIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpbnZva2VzIHRoZSBzdGF0aWMgIkNyZWF0ZSIgbWV0aG9kIG9uIHRoZSBjbGFzcworLy8vIHRvIGFjdHVhbGx5IGRvIHRoZSBjb25zdHJ1Y3Rpb24uICBVc2FnZToKKy8vLworLy8vIGV4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUZvb1RhcmdldCgpIHsKKy8vLyAgIGV4dGVybiBUYXJnZXQgVGhlRm9vVGFyZ2V0OworLy8vICAgUmVnaXN0ZXJNQ0luc3RySW5mbzxGb29NQ0luc3RySW5mbz4gWChUaGVGb29UYXJnZXQpOworLy8vIH0KK3RlbXBsYXRlIDxjbGFzcyBNQ0luc3RySW5mb0ltcGw+IHN0cnVjdCBSZWdpc3Rlck1DSW5zdHJJbmZvIHsKKyAgUmVnaXN0ZXJNQ0luc3RySW5mbyhUYXJnZXQgJlQpIHsKKyAgICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJNQ0luc3RySW5mbyhULCAmQWxsb2NhdG9yKTsKKyAgfQorCitwcml2YXRlOgorICBzdGF0aWMgTUNJbnN0ckluZm8gKkFsbG9jYXRvcigpIHsgcmV0dXJuIG5ldyBNQ0luc3RySW5mb0ltcGwoKTsgfQorfTsKKworLy8vIFJlZ2lzdGVyTUNJbnN0ckluZm9GbiAtIEhlbHBlciB0ZW1wbGF0ZSBmb3IgcmVnaXN0ZXJpbmcgYSB0YXJnZXQKKy8vLyBpbnN0cnVjdGlvbiBpbmZvIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpbnZva2VzIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24gdG8KKy8vLyBkbyB0aGUgY29uc3RydWN0aW9uLiAgVXNhZ2U6CisvLy8KKy8vLyBleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVGb29UYXJnZXQoKSB7CisvLy8gICBleHRlcm4gVGFyZ2V0IFRoZUZvb1RhcmdldDsKKy8vLyAgIFJlZ2lzdGVyTUNJbnN0ckluZm9GbiBYKFRoZUZvb1RhcmdldCwgVGhlRnVuY3Rpb24pOworLy8vIH0KK3N0cnVjdCBSZWdpc3Rlck1DSW5zdHJJbmZvRm4geworICBSZWdpc3Rlck1DSW5zdHJJbmZvRm4oVGFyZ2V0ICZULCBUYXJnZXQ6Ok1DSW5zdHJJbmZvQ3RvckZuVHkgRm4pIHsKKyAgICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJNQ0luc3RySW5mbyhULCBGbik7CisgIH0KK307CisKKy8vLyBSZWdpc3Rlck1DSW5zdHJBbmFseXNpcyAtIEhlbHBlciB0ZW1wbGF0ZSBmb3IgcmVnaXN0ZXJpbmcgYSB0YXJnZXQKKy8vLyBpbnN0cnVjdGlvbiBhbmFseXplciBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgaW52b2tlcyB0aGUgc3RhdGljICJDcmVhdGUiCisvLy8gbWV0aG9kIG9uIHRoZSBjbGFzcyB0byBhY3R1YWxseSBkbyB0aGUgY29uc3RydWN0aW9uLiAgVXNhZ2U6CisvLy8KKy8vLyBleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVGb29UYXJnZXQoKSB7CisvLy8gICBleHRlcm4gVGFyZ2V0IFRoZUZvb1RhcmdldDsKKy8vLyAgIFJlZ2lzdGVyTUNJbnN0ckFuYWx5c2lzPEZvb01DSW5zdHJBbmFseXNpcz4gWChUaGVGb29UYXJnZXQpOworLy8vIH0KK3RlbXBsYXRlIDxjbGFzcyBNQ0luc3RyQW5hbHlzaXNJbXBsPiBzdHJ1Y3QgUmVnaXN0ZXJNQ0luc3RyQW5hbHlzaXMgeworICBSZWdpc3Rlck1DSW5zdHJBbmFseXNpcyhUYXJnZXQgJlQpIHsKKyAgICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJNQ0luc3RyQW5hbHlzaXMoVCwgJkFsbG9jYXRvcik7CisgIH0KKworcHJpdmF0ZToKKyAgc3RhdGljIE1DSW5zdHJBbmFseXNpcyAqQWxsb2NhdG9yKGNvbnN0IE1DSW5zdHJJbmZvICpJbmZvKSB7CisgICAgcmV0dXJuIG5ldyBNQ0luc3RyQW5hbHlzaXNJbXBsKEluZm8pOworICB9Cit9OworCisvLy8gUmVnaXN0ZXJNQ0luc3RyQW5hbHlzaXNGbiAtIEhlbHBlciB0ZW1wbGF0ZSBmb3IgcmVnaXN0ZXJpbmcgYSB0YXJnZXQKKy8vLyBpbnN0cnVjdGlvbiBhbmFseXplciBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgaW52b2tlcyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uCisvLy8gdG8gZG8gdGhlIGNvbnN0cnVjdGlvbi4gIFVzYWdlOgorLy8vCisvLy8gZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplRm9vVGFyZ2V0KCkgeworLy8vICAgZXh0ZXJuIFRhcmdldCBUaGVGb29UYXJnZXQ7CisvLy8gICBSZWdpc3Rlck1DSW5zdHJBbmFseXNpc0ZuIFgoVGhlRm9vVGFyZ2V0LCBUaGVGdW5jdGlvbik7CisvLy8gfQorc3RydWN0IFJlZ2lzdGVyTUNJbnN0ckFuYWx5c2lzRm4geworICBSZWdpc3Rlck1DSW5zdHJBbmFseXNpc0ZuKFRhcmdldCAmVCwgVGFyZ2V0OjpNQ0luc3RyQW5hbHlzaXNDdG9yRm5UeSBGbikgeworICAgIFRhcmdldFJlZ2lzdHJ5OjpSZWdpc3Rlck1DSW5zdHJBbmFseXNpcyhULCBGbik7CisgIH0KK307CisKKy8vLyBSZWdpc3Rlck1DUmVnSW5mbyAtIEhlbHBlciB0ZW1wbGF0ZSBmb3IgcmVnaXN0ZXJpbmcgYSB0YXJnZXQgcmVnaXN0ZXIgaW5mbworLy8vIGltcGxlbWVudGF0aW9uLiAgVGhpcyBpbnZva2VzIHRoZSBzdGF0aWMgIkNyZWF0ZSIgbWV0aG9kIG9uIHRoZSBjbGFzcyB0bworLy8vIGFjdHVhbGx5IGRvIHRoZSBjb25zdHJ1Y3Rpb24uICBVc2FnZToKKy8vLworLy8vIGV4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUZvb1RhcmdldCgpIHsKKy8vLyAgIGV4dGVybiBUYXJnZXQgVGhlRm9vVGFyZ2V0OworLy8vICAgUmVnaXN0ZXJNQ1JlZ0luZm88Rm9vTUNSZWdJbmZvPiBYKFRoZUZvb1RhcmdldCk7CisvLy8gfQordGVtcGxhdGUgPGNsYXNzIE1DUmVnaXN0ZXJJbmZvSW1wbD4gc3RydWN0IFJlZ2lzdGVyTUNSZWdJbmZvIHsKKyAgUmVnaXN0ZXJNQ1JlZ0luZm8oVGFyZ2V0ICZUKSB7CisgICAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyTUNSZWdJbmZvKFQsICZBbGxvY2F0b3IpOworICB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyBNQ1JlZ2lzdGVySW5mbyAqQWxsb2NhdG9yKGNvbnN0IFRyaXBsZSAmIC8qVFQqLykgeworICAgIHJldHVybiBuZXcgTUNSZWdpc3RlckluZm9JbXBsKCk7CisgIH0KK307CisKKy8vLyBSZWdpc3Rlck1DUmVnSW5mb0ZuIC0gSGVscGVyIHRlbXBsYXRlIGZvciByZWdpc3RlcmluZyBhIHRhcmdldCByZWdpc3RlcgorLy8vIGluZm8gaW1wbGVtZW50YXRpb24uICBUaGlzIGludm9rZXMgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiB0byBkbyB0aGUKKy8vLyBjb25zdHJ1Y3Rpb24uICBVc2FnZToKKy8vLworLy8vIGV4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUZvb1RhcmdldCgpIHsKKy8vLyAgIGV4dGVybiBUYXJnZXQgVGhlRm9vVGFyZ2V0OworLy8vICAgUmVnaXN0ZXJNQ1JlZ0luZm9GbiBYKFRoZUZvb1RhcmdldCwgVGhlRnVuY3Rpb24pOworLy8vIH0KK3N0cnVjdCBSZWdpc3Rlck1DUmVnSW5mb0ZuIHsKKyAgUmVnaXN0ZXJNQ1JlZ0luZm9GbihUYXJnZXQgJlQsIFRhcmdldDo6TUNSZWdJbmZvQ3RvckZuVHkgRm4pIHsKKyAgICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJNQ1JlZ0luZm8oVCwgRm4pOworICB9Cit9OworCisvLy8gUmVnaXN0ZXJNQ1N1YnRhcmdldEluZm8gLSBIZWxwZXIgdGVtcGxhdGUgZm9yIHJlZ2lzdGVyaW5nIGEgdGFyZ2V0CisvLy8gc3VidGFyZ2V0IGluZm8gaW1wbGVtZW50YXRpb24uICBUaGlzIGludm9rZXMgdGhlIHN0YXRpYyAiQ3JlYXRlIiBtZXRob2QKKy8vLyBvbiB0aGUgY2xhc3MgdG8gYWN0dWFsbHkgZG8gdGhlIGNvbnN0cnVjdGlvbi4gIFVzYWdlOgorLy8vCisvLy8gZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplRm9vVGFyZ2V0KCkgeworLy8vICAgZXh0ZXJuIFRhcmdldCBUaGVGb29UYXJnZXQ7CisvLy8gICBSZWdpc3Rlck1DU3VidGFyZ2V0SW5mbzxGb29NQ1N1YnRhcmdldEluZm8+IFgoVGhlRm9vVGFyZ2V0KTsKKy8vLyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgTUNTdWJ0YXJnZXRJbmZvSW1wbD4gc3RydWN0IFJlZ2lzdGVyTUNTdWJ0YXJnZXRJbmZvIHsKKyAgUmVnaXN0ZXJNQ1N1YnRhcmdldEluZm8oVGFyZ2V0ICZUKSB7CisgICAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyTUNTdWJ0YXJnZXRJbmZvKFQsICZBbGxvY2F0b3IpOworICB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyBNQ1N1YnRhcmdldEluZm8gKkFsbG9jYXRvcihjb25zdCBUcmlwbGUgJiAvKlRUKi8sIFN0cmluZ1JlZiAvKkNQVSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIC8qRlMqLykgeworICAgIHJldHVybiBuZXcgTUNTdWJ0YXJnZXRJbmZvSW1wbCgpOworICB9Cit9OworCisvLy8gUmVnaXN0ZXJNQ1N1YnRhcmdldEluZm9GbiAtIEhlbHBlciB0ZW1wbGF0ZSBmb3IgcmVnaXN0ZXJpbmcgYSB0YXJnZXQKKy8vLyBzdWJ0YXJnZXQgaW5mbyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgaW52b2tlcyB0aGUgc3BlY2lmaWVkIGZ1bmN0aW9uIHRvCisvLy8gZG8gdGhlIGNvbnN0cnVjdGlvbi4gIFVzYWdlOgorLy8vCisvLy8gZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplRm9vVGFyZ2V0KCkgeworLy8vICAgZXh0ZXJuIFRhcmdldCBUaGVGb29UYXJnZXQ7CisvLy8gICBSZWdpc3Rlck1DU3VidGFyZ2V0SW5mb0ZuIFgoVGhlRm9vVGFyZ2V0LCBUaGVGdW5jdGlvbik7CisvLy8gfQorc3RydWN0IFJlZ2lzdGVyTUNTdWJ0YXJnZXRJbmZvRm4geworICBSZWdpc3Rlck1DU3VidGFyZ2V0SW5mb0ZuKFRhcmdldCAmVCwgVGFyZ2V0OjpNQ1N1YnRhcmdldEluZm9DdG9yRm5UeSBGbikgeworICAgIFRhcmdldFJlZ2lzdHJ5OjpSZWdpc3Rlck1DU3VidGFyZ2V0SW5mbyhULCBGbik7CisgIH0KK307CisKKy8vLyBSZWdpc3RlclRhcmdldE1hY2hpbmUgLSBIZWxwZXIgdGVtcGxhdGUgZm9yIHJlZ2lzdGVyaW5nIGEgdGFyZ2V0IG1hY2hpbmUKKy8vLyBpbXBsZW1lbnRhdGlvbiwgZm9yIHVzZSBpbiB0aGUgdGFyZ2V0IG1hY2hpbmUgaW5pdGlhbGl6YXRpb24KKy8vLyBmdW5jdGlvbi4gVXNhZ2U6CisvLy8KKy8vLyBleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVGb29UYXJnZXQoKSB7CisvLy8gICBleHRlcm4gVGFyZ2V0IFRoZUZvb1RhcmdldDsKKy8vLyAgIFJlZ2lzdGVyVGFyZ2V0TWFjaGluZTxGb29UYXJnZXRNYWNoaW5lPiBYKFRoZUZvb1RhcmdldCk7CisvLy8gfQordGVtcGxhdGUgPGNsYXNzIFRhcmdldE1hY2hpbmVJbXBsPiBzdHJ1Y3QgUmVnaXN0ZXJUYXJnZXRNYWNoaW5lIHsKKyAgUmVnaXN0ZXJUYXJnZXRNYWNoaW5lKFRhcmdldCAmVCkgeworICAgIFRhcmdldFJlZ2lzdHJ5OjpSZWdpc3RlclRhcmdldE1hY2hpbmUoVCwgJkFsbG9jYXRvcik7CisgIH0KKworcHJpdmF0ZToKKyAgc3RhdGljIFRhcmdldE1hY2hpbmUgKgorICBBbGxvY2F0b3IoY29uc3QgVGFyZ2V0ICZULCBjb25zdCBUcmlwbGUgJlRULCBTdHJpbmdSZWYgQ1BVLCBTdHJpbmdSZWYgRlMsCisgICAgICAgICAgICBjb25zdCBUYXJnZXRPcHRpb25zICZPcHRpb25zLCBPcHRpb25hbDxSZWxvYzo6TW9kZWw+IFJNLAorICAgICAgICAgICAgT3B0aW9uYWw8Q29kZU1vZGVsOjpNb2RlbD4gQ00sIENvZGVHZW5PcHQ6OkxldmVsIE9MLCBib29sIEpJVCkgeworICAgIHJldHVybiBuZXcgVGFyZ2V0TWFjaGluZUltcGwoVCwgVFQsIENQVSwgRlMsIE9wdGlvbnMsIFJNLCBDTSwgT0wsIEpJVCk7CisgIH0KK307CisKKy8vLyBSZWdpc3Rlck1DQXNtQmFja2VuZCAtIEhlbHBlciB0ZW1wbGF0ZSBmb3IgcmVnaXN0ZXJpbmcgYSB0YXJnZXQgc3BlY2lmaWMKKy8vLyBhc3NlbWJsZXIgYmFja2VuZC4gVXNhZ2U6CisvLy8KKy8vLyBleHRlcm4gIkMiIHZvaWQgTExWTUluaXRpYWxpemVGb29NQ0FzbUJhY2tlbmQoKSB7CisvLy8gICBleHRlcm4gVGFyZ2V0IFRoZUZvb1RhcmdldDsKKy8vLyAgIFJlZ2lzdGVyTUNBc21CYWNrZW5kPEZvb0FzbUxleGVyPiBYKFRoZUZvb1RhcmdldCk7CisvLy8gfQordGVtcGxhdGUgPGNsYXNzIE1DQXNtQmFja2VuZEltcGw+IHN0cnVjdCBSZWdpc3Rlck1DQXNtQmFja2VuZCB7CisgIFJlZ2lzdGVyTUNBc21CYWNrZW5kKFRhcmdldCAmVCkgeworICAgIFRhcmdldFJlZ2lzdHJ5OjpSZWdpc3Rlck1DQXNtQmFja2VuZChULCAmQWxsb2NhdG9yKTsKKyAgfQorCitwcml2YXRlOgorICBzdGF0aWMgTUNBc21CYWNrZW5kICpBbGxvY2F0b3IoY29uc3QgVGFyZ2V0ICZULCBjb25zdCBNQ1N1YnRhcmdldEluZm8gJlNUSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICZNUkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1RhcmdldE9wdGlvbnMgJk9wdGlvbnMpIHsKKyAgICByZXR1cm4gbmV3IE1DQXNtQmFja2VuZEltcGwoVCwgU1RJLCBNUkkpOworICB9Cit9OworCisvLy8gUmVnaXN0ZXJNQ0FzbVBhcnNlciAtIEhlbHBlciB0ZW1wbGF0ZSBmb3IgcmVnaXN0ZXJpbmcgYSB0YXJnZXQgc3BlY2lmaWMKKy8vLyBhc3NlbWJseSBwYXJzZXIsIGZvciB1c2UgaW4gdGhlIHRhcmdldCBtYWNoaW5lIGluaXRpYWxpemF0aW9uCisvLy8gZnVuY3Rpb24uIFVzYWdlOgorLy8vCisvLy8gZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplRm9vTUNBc21QYXJzZXIoKSB7CisvLy8gICBleHRlcm4gVGFyZ2V0IFRoZUZvb1RhcmdldDsKKy8vLyAgIFJlZ2lzdGVyTUNBc21QYXJzZXI8Rm9vQXNtUGFyc2VyPiBYKFRoZUZvb1RhcmdldCk7CisvLy8gfQordGVtcGxhdGUgPGNsYXNzIE1DQXNtUGFyc2VySW1wbD4gc3RydWN0IFJlZ2lzdGVyTUNBc21QYXJzZXIgeworICBSZWdpc3Rlck1DQXNtUGFyc2VyKFRhcmdldCAmVCkgeworICAgIFRhcmdldFJlZ2lzdHJ5OjpSZWdpc3Rlck1DQXNtUGFyc2VyKFQsICZBbGxvY2F0b3IpOworICB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyBNQ1RhcmdldEFzbVBhcnNlciAqQWxsb2NhdG9yKGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAmU1RJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNQ0FzbVBhcnNlciAmUCwgY29uc3QgTUNJbnN0ckluZm8gJk1JSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNUYXJnZXRPcHRpb25zICZPcHRpb25zKSB7CisgICAgcmV0dXJuIG5ldyBNQ0FzbVBhcnNlckltcGwoU1RJLCBQLCBNSUksIE9wdGlvbnMpOworICB9Cit9OworCisvLy8gUmVnaXN0ZXJBc21QcmludGVyIC0gSGVscGVyIHRlbXBsYXRlIGZvciByZWdpc3RlcmluZyBhIHRhcmdldCBzcGVjaWZpYworLy8vIGFzc2VtYmx5IHByaW50ZXIsIGZvciB1c2UgaW4gdGhlIHRhcmdldCBtYWNoaW5lIGluaXRpYWxpemF0aW9uCisvLy8gZnVuY3Rpb24uIFVzYWdlOgorLy8vCisvLy8gZXh0ZXJuICJDIiB2b2lkIExMVk1Jbml0aWFsaXplRm9vQXNtUHJpbnRlcigpIHsKKy8vLyAgIGV4dGVybiBUYXJnZXQgVGhlRm9vVGFyZ2V0OworLy8vICAgUmVnaXN0ZXJBc21QcmludGVyPEZvb0FzbVByaW50ZXI+IFgoVGhlRm9vVGFyZ2V0KTsKKy8vLyB9Cit0ZW1wbGF0ZSA8Y2xhc3MgQXNtUHJpbnRlckltcGw+IHN0cnVjdCBSZWdpc3RlckFzbVByaW50ZXIgeworICBSZWdpc3RlckFzbVByaW50ZXIoVGFyZ2V0ICZUKSB7CisgICAgVGFyZ2V0UmVnaXN0cnk6OlJlZ2lzdGVyQXNtUHJpbnRlcihULCAmQWxsb2NhdG9yKTsKKyAgfQorCitwcml2YXRlOgorICBzdGF0aWMgQXNtUHJpbnRlciAqQWxsb2NhdG9yKFRhcmdldE1hY2hpbmUgJlRNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxNQ1N0cmVhbWVyPiAmJlN0cmVhbWVyKSB7CisgICAgcmV0dXJuIG5ldyBBc21QcmludGVySW1wbChUTSwgc3RkOjptb3ZlKFN0cmVhbWVyKSk7CisgIH0KK307CisKKy8vLyBSZWdpc3Rlck1DQ29kZUVtaXR0ZXIgLSBIZWxwZXIgdGVtcGxhdGUgZm9yIHJlZ2lzdGVyaW5nIGEgdGFyZ2V0IHNwZWNpZmljCisvLy8gbWFjaGluZSBjb2RlIGVtaXR0ZXIsIGZvciB1c2UgaW4gdGhlIHRhcmdldCBpbml0aWFsaXphdGlvbgorLy8vIGZ1bmN0aW9uLiBVc2FnZToKKy8vLworLy8vIGV4dGVybiAiQyIgdm9pZCBMTFZNSW5pdGlhbGl6ZUZvb01DQ29kZUVtaXR0ZXIoKSB7CisvLy8gICBleHRlcm4gVGFyZ2V0IFRoZUZvb1RhcmdldDsKKy8vLyAgIFJlZ2lzdGVyTUNDb2RlRW1pdHRlcjxGb29Db2RlRW1pdHRlcj4gWChUaGVGb29UYXJnZXQpOworLy8vIH0KK3RlbXBsYXRlIDxjbGFzcyBNQ0NvZGVFbWl0dGVySW1wbD4gc3RydWN0IFJlZ2lzdGVyTUNDb2RlRW1pdHRlciB7CisgIFJlZ2lzdGVyTUNDb2RlRW1pdHRlcihUYXJnZXQgJlQpIHsKKyAgICBUYXJnZXRSZWdpc3RyeTo6UmVnaXN0ZXJNQ0NvZGVFbWl0dGVyKFQsICZBbGxvY2F0b3IpOworICB9CisKK3ByaXZhdGU6CisgIHN0YXRpYyBNQ0NvZGVFbWl0dGVyICpBbGxvY2F0b3IoY29uc3QgTUNJbnN0ckluZm8gJiAvKklJKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTUNSZWdpc3RlckluZm8gJiAvKk1SSSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DQ29udGV4dCAmIC8qQ3R4Ki8pIHsKKyAgICByZXR1cm4gbmV3IE1DQ29kZUVtaXR0ZXJJbXBsKCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfVEFSR0VUUkVHSVNUUllfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RhcmdldFNlbGVjdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RhcmdldFNlbGVjdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU4Mjc4NWMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVGFyZ2V0U2VsZWN0LmgKQEAgLTAsMCArMSwxNjUgQEAKKy8vPT09LSBUYXJnZXRTZWxlY3QuaCAtIFRhcmdldCBTZWxlY3Rpb24gJiBSZWdpc3RyYXRpb24gLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHV0aWxpdGllcyB0byBtYWtlIHN1cmUgdGhhdCBjZXJ0YWluIGNsYXNzZXMgb2YgdGFyZ2V0cyBhcmUKKy8vIGxpbmtlZCBpbnRvIHRoZSBtYWluIGFwcGxpY2F0aW9uIGV4ZWN1dGFibGUsIGFuZCBpbml0aWFsaXplIHRoZW0gYXMKKy8vIGFwcHJvcHJpYXRlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1RBUkdFVFNFTEVDVF9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9UQVJHRVRTRUxFQ1RfSAorCisjaW5jbHVkZSAibGx2bS9Db25maWcvbGx2bS1jb25maWcuaCIKKworZXh0ZXJuICJDIiB7CisgIC8vIERlY2xhcmUgYWxsIG9mIHRoZSB0YXJnZXQtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIHRoYXQgYXJlIGF2YWlsYWJsZS4KKyNkZWZpbmUgTExWTV9UQVJHRVQoVGFyZ2V0TmFtZSkgdm9pZCBMTFZNSW5pdGlhbGl6ZSMjVGFyZ2V0TmFtZSMjVGFyZ2V0SW5mbygpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL1RhcmdldHMuZGVmIgorCisjZGVmaW5lIExMVk1fVEFSR0VUKFRhcmdldE5hbWUpIHZvaWQgTExWTUluaXRpYWxpemUjI1RhcmdldE5hbWUjI1RhcmdldCgpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL1RhcmdldHMuZGVmIgorCisgIC8vIERlY2xhcmUgYWxsIG9mIHRoZSB0YXJnZXQtTUMtaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zIHRoYXQgYXJlIGF2YWlsYWJsZS4KKyNkZWZpbmUgTExWTV9UQVJHRVQoVGFyZ2V0TmFtZSkgdm9pZCBMTFZNSW5pdGlhbGl6ZSMjVGFyZ2V0TmFtZSMjVGFyZ2V0TUMoKTsKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9UYXJnZXRzLmRlZiIKKworICAvLyBEZWNsYXJlIGFsbCBvZiB0aGUgYXZhaWxhYmxlIGFzc2VtYmx5IHByaW50ZXIgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLgorI2RlZmluZSBMTFZNX0FTTV9QUklOVEVSKFRhcmdldE5hbWUpIHZvaWQgTExWTUluaXRpYWxpemUjI1RhcmdldE5hbWUjI0FzbVByaW50ZXIoKTsKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9Bc21QcmludGVycy5kZWYiCisKKyAgLy8gRGVjbGFyZSBhbGwgb2YgdGhlIGF2YWlsYWJsZSBhc3NlbWJseSBwYXJzZXIgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLgorI2RlZmluZSBMTFZNX0FTTV9QQVJTRVIoVGFyZ2V0TmFtZSkgdm9pZCBMTFZNSW5pdGlhbGl6ZSMjVGFyZ2V0TmFtZSMjQXNtUGFyc2VyKCk7CisjaW5jbHVkZSAibGx2bS9Db25maWcvQXNtUGFyc2Vycy5kZWYiCisKKyAgLy8gRGVjbGFyZSBhbGwgb2YgdGhlIGF2YWlsYWJsZSBkaXNhc3NlbWJsZXIgaW5pdGlhbGl6YXRpb24gZnVuY3Rpb25zLgorI2RlZmluZSBMTFZNX0RJU0FTU0VNQkxFUihUYXJnZXROYW1lKSBcCisgIHZvaWQgTExWTUluaXRpYWxpemUjI1RhcmdldE5hbWUjI0Rpc2Fzc2VtYmxlcigpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL0Rpc2Fzc2VtYmxlcnMuZGVmIgorfQorCituYW1lc3BhY2UgbGx2bSB7CisgIC8vLyBJbml0aWFsaXplQWxsVGFyZ2V0SW5mb3MgLSBUaGUgbWFpbiBwcm9ncmFtIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gaWYKKyAgLy8vIGl0IHdhbnRzIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHRhcmdldHMgdGhhdCBMTFZNIGlzIGNvbmZpZ3VyZWQgdG8KKyAgLy8vIHN1cHBvcnQsIHRvIG1ha2UgdGhlbSBhdmFpbGFibGUgdmlhIHRoZSBUYXJnZXRSZWdpc3RyeS4KKyAgLy8vCisgIC8vLyBJdCBpcyBsZWdhbCBmb3IgYSBjbGllbnQgdG8gbWFrZSBtdWx0aXBsZSBjYWxscyB0byB0aGlzIGZ1bmN0aW9uLgorICBpbmxpbmUgdm9pZCBJbml0aWFsaXplQWxsVGFyZ2V0SW5mb3MoKSB7CisjZGVmaW5lIExMVk1fVEFSR0VUKFRhcmdldE5hbWUpIExMVk1Jbml0aWFsaXplIyNUYXJnZXROYW1lIyNUYXJnZXRJbmZvKCk7CisjaW5jbHVkZSAibGx2bS9Db25maWcvVGFyZ2V0cy5kZWYiCisgIH0KKworICAvLy8gSW5pdGlhbGl6ZUFsbFRhcmdldHMgLSBUaGUgbWFpbiBwcm9ncmFtIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gaWYgaXQKKyAgLy8vIHdhbnRzIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHRhcmdldCBtYWNoaW5lcyB0aGF0IExMVk0gaXMgY29uZmlndXJlZCB0bworICAvLy8gc3VwcG9ydCwgdG8gbWFrZSB0aGVtIGF2YWlsYWJsZSB2aWEgdGhlIFRhcmdldFJlZ2lzdHJ5LgorICAvLy8KKyAgLy8vIEl0IGlzIGxlZ2FsIGZvciBhIGNsaWVudCB0byBtYWtlIG11bHRpcGxlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uCisgIGlubGluZSB2b2lkIEluaXRpYWxpemVBbGxUYXJnZXRzKCkgeworICAgIC8vIEZJWE1FOiBSZW1vdmUgdGhpcywgY2xpZW50cyBzaG91bGQgZG8gaXQuCisgICAgSW5pdGlhbGl6ZUFsbFRhcmdldEluZm9zKCk7CisKKyNkZWZpbmUgTExWTV9UQVJHRVQoVGFyZ2V0TmFtZSkgTExWTUluaXRpYWxpemUjI1RhcmdldE5hbWUjI1RhcmdldCgpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL1RhcmdldHMuZGVmIgorICB9CisKKyAgLy8vIEluaXRpYWxpemVBbGxUYXJnZXRNQ3MgLSBUaGUgbWFpbiBwcm9ncmFtIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gaWYgaXQKKyAgLy8vIHdhbnRzIGFjY2VzcyB0byBhbGwgYXZhaWxhYmxlIHRhcmdldCBNQyB0aGF0IExMVk0gaXMgY29uZmlndXJlZCB0bworICAvLy8gc3VwcG9ydCwgdG8gbWFrZSB0aGVtIGF2YWlsYWJsZSB2aWEgdGhlIFRhcmdldFJlZ2lzdHJ5LgorICAvLy8KKyAgLy8vIEl0IGlzIGxlZ2FsIGZvciBhIGNsaWVudCB0byBtYWtlIG11bHRpcGxlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uCisgIGlubGluZSB2b2lkIEluaXRpYWxpemVBbGxUYXJnZXRNQ3MoKSB7CisjZGVmaW5lIExMVk1fVEFSR0VUKFRhcmdldE5hbWUpIExMVk1Jbml0aWFsaXplIyNUYXJnZXROYW1lIyNUYXJnZXRNQygpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL1RhcmdldHMuZGVmIgorICB9CisKKyAgLy8vIEluaXRpYWxpemVBbGxBc21QcmludGVycyAtIFRoZSBtYWluIHByb2dyYW0gc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBpZgorICAvLy8gaXQgd2FudHMgYWxsIGFzbSBwcmludGVycyB0aGF0IExMVk0gaXMgY29uZmlndXJlZCB0byBzdXBwb3J0LCB0byBtYWtlIHRoZW0KKyAgLy8vIGF2YWlsYWJsZSB2aWEgdGhlIFRhcmdldFJlZ2lzdHJ5LgorICAvLy8KKyAgLy8vIEl0IGlzIGxlZ2FsIGZvciBhIGNsaWVudCB0byBtYWtlIG11bHRpcGxlIGNhbGxzIHRvIHRoaXMgZnVuY3Rpb24uCisgIGlubGluZSB2b2lkIEluaXRpYWxpemVBbGxBc21QcmludGVycygpIHsKKyNkZWZpbmUgTExWTV9BU01fUFJJTlRFUihUYXJnZXROYW1lKSBMTFZNSW5pdGlhbGl6ZSMjVGFyZ2V0TmFtZSMjQXNtUHJpbnRlcigpOworI2luY2x1ZGUgImxsdm0vQ29uZmlnL0FzbVByaW50ZXJzLmRlZiIKKyAgfQorCisgIC8vLyBJbml0aWFsaXplQWxsQXNtUGFyc2VycyAtIFRoZSBtYWluIHByb2dyYW0gc2hvdWxkIGNhbGwgdGhpcyBmdW5jdGlvbiBpZiBpdAorICAvLy8gd2FudHMgYWxsIGFzbSBwYXJzZXJzIHRoYXQgTExWTSBpcyBjb25maWd1cmVkIHRvIHN1cHBvcnQsIHRvIG1ha2UgdGhlbQorICAvLy8gYXZhaWxhYmxlIHZpYSB0aGUgVGFyZ2V0UmVnaXN0cnkuCisgIC8vLworICAvLy8gSXQgaXMgbGVnYWwgZm9yIGEgY2xpZW50IHRvIG1ha2UgbXVsdGlwbGUgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbi4KKyAgaW5saW5lIHZvaWQgSW5pdGlhbGl6ZUFsbEFzbVBhcnNlcnMoKSB7CisjZGVmaW5lIExMVk1fQVNNX1BBUlNFUihUYXJnZXROYW1lKSBMTFZNSW5pdGlhbGl6ZSMjVGFyZ2V0TmFtZSMjQXNtUGFyc2VyKCk7CisjaW5jbHVkZSAibGx2bS9Db25maWcvQXNtUGFyc2Vycy5kZWYiCisgIH0KKworICAvLy8gSW5pdGlhbGl6ZUFsbERpc2Fzc2VtYmxlcnMgLSBUaGUgbWFpbiBwcm9ncmFtIHNob3VsZCBjYWxsIHRoaXMgZnVuY3Rpb24gaWYKKyAgLy8vIGl0IHdhbnRzIGFsbCBkaXNhc3NlbWJsZXJzIHRoYXQgTExWTSBpcyBjb25maWd1cmVkIHRvIHN1cHBvcnQsIHRvIG1ha2UKKyAgLy8vIHRoZW0gYXZhaWxhYmxlIHZpYSB0aGUgVGFyZ2V0UmVnaXN0cnkuCisgIC8vLworICAvLy8gSXQgaXMgbGVnYWwgZm9yIGEgY2xpZW50IHRvIG1ha2UgbXVsdGlwbGUgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbi4KKyAgaW5saW5lIHZvaWQgSW5pdGlhbGl6ZUFsbERpc2Fzc2VtYmxlcnMoKSB7CisjZGVmaW5lIExMVk1fRElTQVNTRU1CTEVSKFRhcmdldE5hbWUpIExMVk1Jbml0aWFsaXplIyNUYXJnZXROYW1lIyNEaXNhc3NlbWJsZXIoKTsKKyNpbmNsdWRlICJsbHZtL0NvbmZpZy9EaXNhc3NlbWJsZXJzLmRlZiIKKyAgfQorCisgIC8vLyBJbml0aWFsaXplTmF0aXZlVGFyZ2V0IC0gVGhlIG1haW4gcHJvZ3JhbSBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvCisgIC8vLyBpbml0aWFsaXplIHRoZSBuYXRpdmUgdGFyZ2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGhvc3QuICBUaGlzIGlzIHVzZWZ1bAorICAvLy8gZm9yIEpJVCBhcHBsaWNhdGlvbnMgdG8gZW5zdXJlIHRoYXQgdGhlIHRhcmdldCBnZXRzIGxpbmtlZCBpbiBjb3JyZWN0bHkuCisgIC8vLworICAvLy8gSXQgaXMgbGVnYWwgZm9yIGEgY2xpZW50IHRvIG1ha2UgbXVsdGlwbGUgY2FsbHMgdG8gdGhpcyBmdW5jdGlvbi4KKyAgaW5saW5lIGJvb2wgSW5pdGlhbGl6ZU5hdGl2ZVRhcmdldCgpIHsKKyAgLy8gSWYgd2UgaGF2ZSBhIG5hdGl2ZSB0YXJnZXQsIGluaXRpYWxpemUgaXQgdG8gZW5zdXJlIGl0IGlzIGxpbmtlZCBpbi4KKyNpZmRlZiBMTFZNX05BVElWRV9UQVJHRVQKKyAgICBMTFZNX05BVElWRV9UQVJHRVRJTkZPKCk7CisgICAgTExWTV9OQVRJVkVfVEFSR0VUKCk7CisgICAgTExWTV9OQVRJVkVfVEFSR0VUTUMoKTsKKyAgICByZXR1cm4gZmFsc2U7CisjZWxzZQorICAgIHJldHVybiB0cnVlOworI2VuZGlmCisgIH0KKworICAvLy8gSW5pdGlhbGl6ZU5hdGl2ZVRhcmdldEFzbVByaW50ZXIgLSBUaGUgbWFpbiBwcm9ncmFtIHNob3VsZCBjYWxsCisgIC8vLyB0aGlzIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIG5hdGl2ZSB0YXJnZXQgYXNtIHByaW50ZXIuCisgIGlubGluZSBib29sIEluaXRpYWxpemVOYXRpdmVUYXJnZXRBc21QcmludGVyKCkgeworICAvLyBJZiB3ZSBoYXZlIGEgbmF0aXZlIHRhcmdldCwgaW5pdGlhbGl6ZSB0aGUgY29ycmVzcG9uZGluZyBhc20gcHJpbnRlci4KKyNpZmRlZiBMTFZNX05BVElWRV9BU01QUklOVEVSCisgICAgTExWTV9OQVRJVkVfQVNNUFJJTlRFUigpOworICAgIHJldHVybiBmYWxzZTsKKyNlbHNlCisgICAgcmV0dXJuIHRydWU7CisjZW5kaWYKKyAgfQorCisgIC8vLyBJbml0aWFsaXplTmF0aXZlVGFyZ2V0QXNtUGFyc2VyIC0gVGhlIG1haW4gcHJvZ3JhbSBzaG91bGQgY2FsbAorICAvLy8gdGhpcyBmdW5jdGlvbiB0byBpbml0aWFsaXplIHRoZSBuYXRpdmUgdGFyZ2V0IGFzbSBwYXJzZXIuCisgIGlubGluZSBib29sIEluaXRpYWxpemVOYXRpdmVUYXJnZXRBc21QYXJzZXIoKSB7CisgIC8vIElmIHdlIGhhdmUgYSBuYXRpdmUgdGFyZ2V0LCBpbml0aWFsaXplIHRoZSBjb3JyZXNwb25kaW5nIGFzbSBwYXJzZXIuCisjaWZkZWYgTExWTV9OQVRJVkVfQVNNUEFSU0VSCisgICAgTExWTV9OQVRJVkVfQVNNUEFSU0VSKCk7CisgICAgcmV0dXJuIGZhbHNlOworI2Vsc2UKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorICB9CisKKyAgLy8vIEluaXRpYWxpemVOYXRpdmVUYXJnZXREaXNhc3NlbWJsZXIgLSBUaGUgbWFpbiBwcm9ncmFtIHNob3VsZCBjYWxsCisgIC8vLyB0aGlzIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgdGhlIG5hdGl2ZSB0YXJnZXQgZGlzYXNzZW1ibGVyLgorICBpbmxpbmUgYm9vbCBJbml0aWFsaXplTmF0aXZlVGFyZ2V0RGlzYXNzZW1ibGVyKCkgeworICAvLyBJZiB3ZSBoYXZlIGEgbmF0aXZlIHRhcmdldCwgaW5pdGlhbGl6ZSB0aGUgY29ycmVzcG9uZGluZyBkaXNhc3NlbWJsZXIuCisjaWZkZWYgTExWTV9OQVRJVkVfRElTQVNTRU1CTEVSCisgICAgTExWTV9OQVRJVkVfRElTQVNTRU1CTEVSKCk7CisgICAgcmV0dXJuIGZhbHNlOworI2Vsc2UKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RocmVhZExvY2FsLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVGhyZWFkTG9jYWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjdhNjdlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RocmVhZExvY2FsLmgKQEAgLTAsMCArMSw2MyBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC9UaHJlYWRMb2NhbC5oIC0gVGhyZWFkIExvY2FsIERhdGEgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBsbHZtOjpzeXM6OlRocmVhZExvY2FsIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1RIUkVBRExPQ0FMX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1RIUkVBRExPQ0FMX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvVGhyZWFkaW5nLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKworbmFtZXNwYWNlIGxsdm0geworICBuYW1lc3BhY2Ugc3lzIHsKKyAgICAvLyBUaHJlYWRMb2NhbEltcGwgLSBDb21tb24gYmFzZSBjbGFzcyBvZiBhbGwgVGhyZWFkTG9jYWwgaW5zdGFudGlhdGlvbnMuCisgICAgLy8gWU9VIFNIT1VMRCBORVZFUiBVU0UgVEhJUyBESVJFQ1RMWS4KKyAgICBjbGFzcyBUaHJlYWRMb2NhbEltcGwgeworICAgICAgdHlwZWRlZiB1aW50NjRfdCBUaHJlYWRMb2NhbERhdGFUeTsKKyAgICAgIC8vLyBcYnJpZWYgUGxhdGZvcm0tc3BlY2lmaWMgdGhyZWFkIGxvY2FsIGRhdGEuCisgICAgICAvLy8KKyAgICAgIC8vLyBUaGlzIGlzIGVtYmVkZGVkIGluIHRoZSBjbGFzcyBhbmQgd2UgYXZvaWQgbWFsbG9jJ2luZy9mcmVlJ2luZyBpdCwKKyAgICAgIC8vLyB0byBtYWtlIHRoaXMgY2xhc3MgbW9yZSBzYWZlIGZvciB1c2UgYWxvbmcgd2l0aCBDcmFzaFJlY292ZXJ5Q29udGV4dC4KKyAgICAgIHVuaW9uIHsKKyAgICAgICAgY2hhciBkYXRhW3NpemVvZihUaHJlYWRMb2NhbERhdGFUeSldOworICAgICAgICBUaHJlYWRMb2NhbERhdGFUeSBhbGlnbl9kYXRhOworICAgICAgfTsKKyAgICBwdWJsaWM6CisgICAgICBUaHJlYWRMb2NhbEltcGwoKTsKKyAgICAgIHZpcnR1YWwgflRocmVhZExvY2FsSW1wbCgpOworICAgICAgdm9pZCBzZXRJbnN0YW5jZShjb25zdCB2b2lkKiBkKTsKKyAgICAgIHZvaWQgKmdldEluc3RhbmNlKCk7CisgICAgICB2b2lkIHJlbW92ZUluc3RhbmNlKCk7CisgICAgfTsKKworICAgIC8vLyBUaHJlYWRMb2NhbCAtIEEgY2xhc3MgdXNlZCB0byBhYnN0cmFjdCB0aHJlYWQtbG9jYWwgc3RvcmFnZS4gIEl0IGhvbGRzLAorICAgIC8vLyBmb3IgZWFjaCB0aHJlYWQsIGEgcG9pbnRlciBhIHNpbmdsZSBvYmplY3Qgb2YgdHlwZSBULgorICAgIHRlbXBsYXRlPGNsYXNzIFQ+CisgICAgY2xhc3MgVGhyZWFkTG9jYWwgOiBwdWJsaWMgVGhyZWFkTG9jYWxJbXBsIHsKKyAgICBwdWJsaWM6CisgICAgICBUaHJlYWRMb2NhbCgpIDogVGhyZWFkTG9jYWxJbXBsKCkgeyB9CisKKyAgICAgIC8vLyBnZXQgLSBGZXRjaGVzIGEgcG9pbnRlciB0byB0aGUgb2JqZWN0IGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudAorICAgICAgLy8vIHRocmVhZC4gIElmIG5vIG9iamVjdCBoYXMgeWV0IGJlZW4gYXNzb2NpYXRlZCwgaXQgcmV0dXJucyBOVUxMOworICAgICAgVCogZ2V0KCkgeyByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KGdldEluc3RhbmNlKCkpOyB9CisKKyAgICAgIC8vIHNldCAtIEFzc29jaWF0ZXMgYSBwb2ludGVyIHRvIGFuIG9iamVjdCB3aXRoIHRoZSBjdXJyZW50IHRocmVhZC4KKyAgICAgIHZvaWQgc2V0KFQqIGQpIHsgc2V0SW5zdGFuY2UoZCk7IH0KKworICAgICAgLy8gZXJhc2UgLSBSZW1vdmVzIHRoZSBwb2ludGVyIGFzc29jaWF0ZWQgd2l0aCB0aGUgY3VycmVudCB0aHJlYWQuCisgICAgICB2b2lkIGVyYXNlKCkgeyByZW1vdmVJbnN0YW5jZSgpOyB9CisgICAgfTsKKyAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UaHJlYWRQb29sLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVGhyZWFkUG9vbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiODI1NTkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVGhyZWFkUG9vbC5oCkBAIC0wLDAgKzEsMTAwIEBACisvLz09PS0tIGxsdm0vU3VwcG9ydC9UaHJlYWRQb29sLmggLSBBIFRocmVhZFBvb2wgaW1wbGVtZW50YXRpb24gLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgY3J1ZGUgQysrMTEgYmFzZWQgdGhyZWFkIHBvb2wuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfVEhSRUFEX1BPT0xfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfVEhSRUFEX1BPT0xfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3RocmVhZC5oIgorCisjaW5jbHVkZSA8ZnV0dXJlPgorCisjaW5jbHVkZSA8YXRvbWljPgorI2luY2x1ZGUgPGNvbmRpdGlvbl92YXJpYWJsZT4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxtdXRleD4KKyNpbmNsdWRlIDxxdWV1ZT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBIFRocmVhZFBvb2wgZm9yIGFzeW5jaHJvbm91cyBwYXJhbGxlbCBleGVjdXRpb24gb24gYSBkZWZpbmVkIG51bWJlciBvZgorLy8vIHRocmVhZHMuCisvLy8KKy8vLyBUaGUgcG9vbCBrZWVwcyBhIHZlY3RvciBvZiB0aHJlYWRzIGFsaXZlLCB3YWl0aW5nIG9uIGEgY29uZGl0aW9uIHZhcmlhYmxlCisvLy8gZm9yIHNvbWUgd29yayB0byBiZWNvbWUgYXZhaWxhYmxlLgorY2xhc3MgVGhyZWFkUG9vbCB7CitwdWJsaWM6CisgIHVzaW5nIFRhc2tUeSA9IHN0ZDo6ZnVuY3Rpb248dm9pZCgpPjsKKyAgdXNpbmcgUGFja2FnZWRUYXNrVHkgPSBzdGQ6OnBhY2thZ2VkX3Rhc2s8dm9pZCgpPjsKKworICAvLy8gQ29uc3RydWN0IGEgcG9vbCB3aXRoIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBmb3VuZCBieQorICAvLy8gaGFyZHdhcmVfY29uY3VycmVuY3koKS4KKyAgVGhyZWFkUG9vbCgpOworCisgIC8vLyBDb25zdHJ1Y3QgYSBwb29sIG9mIFxwIFRocmVhZENvdW50IHRocmVhZHMKKyAgVGhyZWFkUG9vbCh1bnNpZ25lZCBUaHJlYWRDb3VudCk7CisKKyAgLy8vIEJsb2NraW5nIGRlc3RydWN0b3I6IHRoZSBwb29sIHdpbGwgd2FpdCBmb3IgYWxsIHRoZSB0aHJlYWRzIHRvIGNvbXBsZXRlLgorICB+VGhyZWFkUG9vbCgpOworCisgIC8vLyBBc3luY2hyb25vdXMgc3VibWlzc2lvbiBvZiBhIHRhc2sgdG8gdGhlIHBvb2wuIFRoZSByZXR1cm5lZCBmdXR1cmUgY2FuIGJlCisgIC8vLyB1c2VkIHRvIHdhaXQgZm9yIHRoZSB0YXNrIHRvIGZpbmlzaCBhbmQgaXMgKm5vbi1ibG9ja2luZyogb24gZGVzdHJ1Y3Rpb24uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbiwgdHlwZW5hbWUuLi4gQXJncz4KKyAgaW5saW5lIHN0ZDo6c2hhcmVkX2Z1dHVyZTx2b2lkPiBhc3luYyhGdW5jdGlvbiAmJkYsIEFyZ3MgJiYuLi4gQXJnTGlzdCkgeworICAgIGF1dG8gVGFzayA9CisgICAgICAgIHN0ZDo6YmluZChzdGQ6OmZvcndhcmQ8RnVuY3Rpb24+KEYpLCBzdGQ6OmZvcndhcmQ8QXJncz4oQXJnTGlzdCkuLi4pOworICAgIHJldHVybiBhc3luY0ltcGwoc3RkOjptb3ZlKFRhc2spKTsKKyAgfQorCisgIC8vLyBBc3luY2hyb25vdXMgc3VibWlzc2lvbiBvZiBhIHRhc2sgdG8gdGhlIHBvb2wuIFRoZSByZXR1cm5lZCBmdXR1cmUgY2FuIGJlCisgIC8vLyB1c2VkIHRvIHdhaXQgZm9yIHRoZSB0YXNrIHRvIGZpbmlzaCBhbmQgaXMgKm5vbi1ibG9ja2luZyogb24gZGVzdHJ1Y3Rpb24uCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBGdW5jdGlvbj4KKyAgaW5saW5lIHN0ZDo6c2hhcmVkX2Z1dHVyZTx2b2lkPiBhc3luYyhGdW5jdGlvbiAmJkYpIHsKKyAgICByZXR1cm4gYXN5bmNJbXBsKHN0ZDo6Zm9yd2FyZDxGdW5jdGlvbj4oRikpOworICB9CisKKyAgLy8vIEJsb2NraW5nIHdhaXQgZm9yIGFsbCB0aGUgdGhyZWFkcyB0byBjb21wbGV0ZSBhbmQgdGhlIHF1ZXVlIHRvIGJlIGVtcHR5LgorICAvLy8gSXQgaXMgYW4gZXJyb3IgdG8gdHJ5IHRvIGFkZCBuZXcgdGFza3Mgd2hpbGUgYmxvY2tpbmcgb24gdGhpcyBjYWxsLgorICB2b2lkIHdhaXQoKTsKKworcHJpdmF0ZToKKyAgLy8vIEFzeW5jaHJvbm91cyBzdWJtaXNzaW9uIG9mIGEgdGFzayB0byB0aGUgcG9vbC4gVGhlIHJldHVybmVkIGZ1dHVyZSBjYW4gYmUKKyAgLy8vIHVzZWQgdG8gd2FpdCBmb3IgdGhlIHRhc2sgdG8gZmluaXNoIGFuZCBpcyAqbm9uLWJsb2NraW5nKiBvbiBkZXN0cnVjdGlvbi4KKyAgc3RkOjpzaGFyZWRfZnV0dXJlPHZvaWQ+IGFzeW5jSW1wbChUYXNrVHkgRik7CisKKyAgLy8vIFRocmVhZHMgaW4gZmxpZ2h0CisgIHN0ZDo6dmVjdG9yPGxsdm06OnRocmVhZD4gVGhyZWFkczsKKworICAvLy8gVGFza3Mgd2FpdGluZyBmb3IgZXhlY3V0aW9uIGluIHRoZSBwb29sLgorICBzdGQ6OnF1ZXVlPFBhY2thZ2VkVGFza1R5PiBUYXNrczsKKworICAvLy8gTG9ja2luZyBhbmQgc2lnbmFsaW5nIGZvciBhY2Nlc3NpbmcgdGhlIFRhc2tzIHF1ZXVlLgorICBzdGQ6Om11dGV4IFF1ZXVlTG9jazsKKyAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgUXVldWVDb25kaXRpb247CisKKyAgLy8vIExvY2tpbmcgYW5kIHNpZ25hbGluZyBmb3Igam9iIGNvbXBsZXRpb24KKyAgc3RkOjptdXRleCBDb21wbGV0aW9uTG9jazsKKyAgc3RkOjpjb25kaXRpb25fdmFyaWFibGUgQ29tcGxldGlvbkNvbmRpdGlvbjsKKworICAvLy8gS2VlcCB0cmFjayBvZiB0aGUgbnVtYmVyIG9mIHRocmVhZCBhY3R1YWxseSBidXN5CisgIHN0ZDo6YXRvbWljPHVuc2lnbmVkPiBBY3RpdmVUaHJlYWRzOworCisjaWYgTExWTV9FTkFCTEVfVEhSRUFEUyAvLyBhdm9pZHMgd2FybmluZyBmb3IgdW51c2VkIHZhcmlhYmxlCisgIC8vLyBTaWduYWwgZm9yIHRoZSBkZXN0cnVjdGlvbiBvZiB0aGUgcG9vbCwgYXNraW5nIHRocmVhZCB0byBleGl0LgorICBib29sIEVuYWJsZUZsYWc7CisjZW5kaWYKK307Cit9CisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfVEhSRUFEX1BPT0xfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RocmVhZGluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RocmVhZGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZkODEzYmMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVGhyZWFkaW5nLmgKQEAgLTAsMCArMSwxNjkgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L1RocmVhZGluZy5oIC0gQ29udHJvbCBtdWx0aXRocmVhZGluZyBtb2RlIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIGhlbHBlciBmdW5jdGlvbnMgZm9yIHJ1bm5pbmcgTExWTSBpbiBhIG11bHRpLXRocmVhZGVkCisvLyBlbnZpcm9ubWVudC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9USFJFQURJTkdfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfVEhSRUFESU5HX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9Db25maWcvbGx2bS1jb25maWcuaCIgLy8gZm9yIExMVk1fT05fVU5JWAorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgPGNpc282NDY+IC8vIFNvIHdlIGNhbiBjaGVjayB0aGUgQysrIHN0YW5kYXJkIGxpYiBtYWNyb3MuCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKworI2lmIGRlZmluZWQoX01TQ19WRVIpCisvLyBNU1ZDJ3MgY2FsbF9vbmNlIGltcGxlbWVudGF0aW9uIHdvcmtlZCBzaW5jZSBWUyAyMDE1LCB3aGljaCBpcyB0aGUgbWluaW11bQorLy8gc3VwcG9ydGVkIHZlcnNpb24gYXMgb2YgdGhpcyB3cml0aW5nLgorI2RlZmluZSBMTFZNX1RIUkVBRElOR19VU0VfU1REX0NBTExfT05DRSAxCisjZWxpZiBkZWZpbmVkKExMVk1fT05fVU5JWCkgJiYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChkZWZpbmVkKF9MSUJDUFBfVkVSU0lPTikgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIShkZWZpbmVkKF9fTmV0QlNEX18pIHx8IGRlZmluZWQoX19PcGVuQlNEX18pIHx8IGRlZmluZWQoX19wcGNfXykpKQorLy8gc3RkOjpjYWxsX29uY2UgZnJvbSBsaWJjKysgaXMgdXNlZCBvbiBhbGwgVW5peCBwbGF0Zm9ybXMuIE90aGVyCisvLyBpbXBsZW1lbnRhdGlvbnMgbGlrZSBsaWJzdGRjKysgYXJlIGtub3duIHRvIGhhdmUgcHJvYmxlbXMgb24gTmV0QlNELAorLy8gT3BlbkJTRCBhbmQgUG93ZXJQQy4KKyNkZWZpbmUgTExWTV9USFJFQURJTkdfVVNFX1NURF9DQUxMX09OQ0UgMQorI2Vsc2UKKyNkZWZpbmUgTExWTV9USFJFQURJTkdfVVNFX1NURF9DQUxMX09OQ0UgMAorI2VuZGlmCisKKyNpZiBMTFZNX1RIUkVBRElOR19VU0VfU1REX0NBTExfT05DRQorI2luY2x1ZGUgPG11dGV4PgorI2Vsc2UKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQXRvbWljLmgiCisjZW5kaWYKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgVHdpbmU7CisKKy8vLyBSZXR1cm5zIHRydWUgaWYgTExWTSBpcyBjb21waWxlZCB3aXRoIHN1cHBvcnQgZm9yIG11bHRpLXRocmVhZGluZywgYW5kCisvLy8gZmFsc2Ugb3RoZXJ3aXNlLgorYm9vbCBsbHZtX2lzX211bHRpdGhyZWFkZWQoKTsKKworLy8vIGxsdm1fZXhlY3V0ZV9vbl90aHJlYWQgLSBFeGVjdXRlIHRoZSBnaXZlbiBccCBVc2VyRm4gb24gYSBzZXBhcmF0ZQorLy8vIHRocmVhZCwgcGFzc2luZyBpdCB0aGUgcHJvdmlkZWQgXHAgVXNlckRhdGEgYW5kIHdhaXRzIGZvciB0aHJlYWQKKy8vLyBjb21wbGV0aW9uLgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCB0aGUgY29kZSB3aWxsIGFjdHVhbGx5IGJlIGV4ZWN1dGVkCisvLy8gb24gYSBzZXBhcmF0ZSB0aHJlYWQgb3IgaG9ub3JpbmcgdGhlIHJlcXVlc3RlZCBzdGFjayBzaXplLCBidXQgdHJpZXMgdG8gZG8KKy8vLyBzbyB3aGVyZSBzeXN0ZW0gc3VwcG9ydCBpcyBhdmFpbGFibGUuCisvLy8KKy8vLyBccGFyYW0gVXNlckZuIC0gVGhlIGNhbGxiYWNrIHRvIGV4ZWN1dGUuCisvLy8gXHBhcmFtIFVzZXJEYXRhIC0gQW4gYXJndW1lbnQgdG8gcGFzcyB0byB0aGUgY2FsbGJhY2sgZnVuY3Rpb24uCisvLy8gXHBhcmFtIFJlcXVlc3RlZFN0YWNrU2l6ZSAtIElmIG5vbi16ZXJvLCBhIHJlcXVlc3RlZCBzaXplIChpbiBieXRlcykgZm9yCisvLy8gdGhlIHRocmVhZCBzdGFjay4KK3ZvaWQgbGx2bV9leGVjdXRlX29uX3RocmVhZCh2b2lkICgqVXNlckZuKSh2b2lkICopLCB2b2lkICpVc2VyRGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBSZXF1ZXN0ZWRTdGFja1NpemUgPSAwKTsKKworI2lmIExMVk1fVEhSRUFESU5HX1VTRV9TVERfQ0FMTF9PTkNFCisKKyAgdHlwZWRlZiBzdGQ6Om9uY2VfZmxhZyBvbmNlX2ZsYWc7CisKKyNlbHNlCisKKyAgZW51bSBJbml0U3RhdHVzIHsgVW5pbml0aWFsaXplZCA9IDAsIFdhaXQgPSAxLCBEb25lID0gMiB9OworCisgIC8vLyBcYnJpZWYgVGhlIGxsdm06Om9uY2VfZmxhZyBzdHJ1Y3R1cmUKKyAgLy8vCisgIC8vLyBUaGlzIHR5cGUgaXMgbW9kZWxlZCBhZnRlciBzdGQ6Om9uY2VfZmxhZyB0byB1c2Ugd2l0aCBsbHZtOjpjYWxsX29uY2UuCisgIC8vLyBUaGlzIHN0cnVjdHVyZSBtdXN0IGJlIHVzZWQgYXMgYW4gb3BhcXVlIG9iamVjdC4gSXQgaXMgYSBzdHJ1Y3QgdG8gZm9yY2UKKyAgLy8vIGF1dG9pbml0aWFsaXphdGlvbiBhbmQgYmVoYXZlIGxpa2Ugc3RkOjpvbmNlX2ZsYWcuCisgIHN0cnVjdCBvbmNlX2ZsYWcgeworICAgIHZvbGF0aWxlIHN5czo6Y2FzX2ZsYWcgc3RhdHVzID0gVW5pbml0aWFsaXplZDsKKyAgfTsKKworI2VuZGlmCisKKyAgLy8vIFxicmllZiBFeGVjdXRlIHRoZSBmdW5jdGlvbiBzcGVjaWZpZWQgYXMgYSBwYXJhbWV0ZXIgb25jZS4KKyAgLy8vCisgIC8vLyBUeXBpY2FsIHVzYWdlOgorICAvLy8gXGNvZGUKKyAgLy8vICAgdm9pZCBmb28oKSB7Li4ufTsKKyAgLy8vICAgLi4uCisgIC8vLyAgIHN0YXRpYyBvbmNlX2ZsYWcgZmxhZzsKKyAgLy8vICAgY2FsbF9vbmNlKGZsYWcsIGZvbyk7CisgIC8vLyBcZW5kY29kZQorICAvLy8KKyAgLy8vIFxwYXJhbSBmbGFnIEZsYWcgdXNlZCBmb3IgdHJhY2tpbmcgd2hldGhlciBvciBub3QgdGhpcyBoYXMgcnVuLgorICAvLy8gXHBhcmFtIEYgRnVuY3Rpb24gdG8gY2FsbCBvbmNlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRnVuY3Rpb24sIHR5cGVuYW1lLi4uIEFyZ3M+CisgIHZvaWQgY2FsbF9vbmNlKG9uY2VfZmxhZyAmZmxhZywgRnVuY3Rpb24gJiZGLCBBcmdzICYmLi4uIEFyZ0xpc3QpIHsKKyNpZiBMTFZNX1RIUkVBRElOR19VU0VfU1REX0NBTExfT05DRQorICAgIHN0ZDo6Y2FsbF9vbmNlKGZsYWcsIHN0ZDo6Zm9yd2FyZDxGdW5jdGlvbj4oRiksCisgICAgICAgICAgICAgICAgICAgc3RkOjpmb3J3YXJkPEFyZ3M+KEFyZ0xpc3QpLi4uKTsKKyNlbHNlCisgICAgLy8gRm9yIG90aGVyIHBsYXRmb3JtcyB3ZSB1c2UgYSBnZW5lcmljIChpZiBicml0dGxlKSB2ZXJzaW9uIGJhc2VkIG9uIG91cgorICAgIC8vIGF0b21pY3MuCisgICAgc3lzOjpjYXNfZmxhZyBvbGRfdmFsID0gc3lzOjpDb21wYXJlQW5kU3dhcCgmZmxhZy5zdGF0dXMsIFdhaXQsIFVuaW5pdGlhbGl6ZWQpOworICAgIGlmIChvbGRfdmFsID09IFVuaW5pdGlhbGl6ZWQpIHsKKyAgICAgIHN0ZDo6Zm9yd2FyZDxGdW5jdGlvbj4oRikoc3RkOjpmb3J3YXJkPEFyZ3M+KEFyZ0xpc3QpLi4uKTsKKyAgICAgIHN5czo6TWVtb3J5RmVuY2UoKTsKKyAgICAgIFRzYW5JZ25vcmVXcml0ZXNCZWdpbigpOworICAgICAgVHNhbkhhcHBlbnNCZWZvcmUoJmZsYWcuc3RhdHVzKTsKKyAgICAgIGZsYWcuc3RhdHVzID0gRG9uZTsKKyAgICAgIFRzYW5JZ25vcmVXcml0ZXNFbmQoKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gV2FpdCB1bnRpbCBhbnkgdGhyZWFkIGRvaW5nIHRoZSBjYWxsIGhhcyBmaW5pc2hlZC4KKyAgICAgIHN5czo6Y2FzX2ZsYWcgdG1wID0gZmxhZy5zdGF0dXM7CisgICAgICBzeXM6Ok1lbW9yeUZlbmNlKCk7CisgICAgICB3aGlsZSAodG1wICE9IERvbmUpIHsKKyAgICAgICAgdG1wID0gZmxhZy5zdGF0dXM7CisgICAgICAgIHN5czo6TWVtb3J5RmVuY2UoKTsKKyAgICAgIH0KKyAgICB9CisgICAgVHNhbkhhcHBlbnNBZnRlcigmZmxhZy5zdGF0dXMpOworI2VuZGlmCisgIH0KKworICAvLy8gR2V0IHRoZSBhbW91bnQgb2YgY3VycmVuY3kgdG8gdXNlIGZvciB0YXNrcyByZXF1aXJpbmcgc2lnbmlmaWNhbnQKKyAgLy8vIG1lbW9yeSBvciBvdGhlciByZXNvdXJjZXMuIEN1cnJlbnRseSBiYXNlZCBvbiBwaHlzaWNhbCBjb3JlcywgaWYKKyAgLy8vIGF2YWlsYWJsZSBmb3IgdGhlIGhvc3Qgc3lzdGVtLCBvdGhlcndpc2UgZmFsbHMgYmFjayB0bworICAvLy8gdGhyZWFkOjpoYXJkd2FyZV9jb25jdXJyZW5jeSgpLgorICAvLy8gUmV0dXJucyAxIHdoZW4gTExWTSBpcyBjb25maWd1cmVkIHdpdGggTExWTV9FTkFCTEVfVEhSRUFEUz1PRkYKKyAgdW5zaWduZWQgaGVhdnl3ZWlnaHRfaGFyZHdhcmVfY29uY3VycmVuY3koKTsKKworICAvLy8gR2V0IHRoZSBudW1iZXIgb2YgdGhyZWFkcyB0aGF0IHRoZSBjdXJyZW50IHByb2dyYW0gY2FuIGV4ZWN1dGUKKyAgLy8vIGNvbmN1cnJlbnRseS4gT24gc29tZSBzeXN0ZW1zIHN0ZDo6dGhyZWFkOjpoYXJkd2FyZV9jb25jdXJyZW5jeSgpIHJldHVybnMKKyAgLy8vIHRoZSB0b3RhbCBudW1iZXIgb2YgY29yZXMsIHdpdGhvdXQgdGFraW5nIGFmZmluaXR5IGludG8gY29uc2lkZXJhdGlvbi4KKyAgLy8vIFJldHVybnMgMSB3aGVuIExMVk0gaXMgY29uZmlndXJlZCB3aXRoIExMVk1fRU5BQkxFX1RIUkVBRFM9T0ZGLgorICAvLy8gRmFsbGJhY2sgdG8gc3RkOjp0aHJlYWQ6OmhhcmR3YXJlX2NvbmN1cnJlbmN5KCkgaWYgc2NoZWRfZ2V0YWZmaW5pdHkgaXMKKyAgLy8vIG5vdCBhdmFpbGFibGUuCisgIHVuc2lnbmVkIGhhcmR3YXJlX2NvbmN1cnJlbmN5KCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdGhlIGN1cnJlbnQgdGhyZWFkIGlkLCBhcyB1c2VkIGluIHZhcmlvdXMgT1Mgc3lzdGVtIGNhbGxzLgorICAvLy8gTm90ZSB0aGF0IG5vdCBhbGwgcGxhdGZvcm1zIGd1YXJhbnRlZSB0aGF0IHRoZSB2YWx1ZSByZXR1cm5lZCB3aWxsIGJlCisgIC8vLyB1bmlxdWUgYWNyb3NzIHRoZSBlbnRpcmUgc3lzdGVtLCBzbyBwb3J0YWJsZSBjb2RlIHNob3VsZCBub3QgYXNzdW1lCisgIC8vLyB0aGlzLgorICB1aW50NjRfdCBnZXRfdGhyZWFkaWQoKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgbWF4aW11bSBsZW5ndGggb2YgYSB0aHJlYWQgbmFtZSBvbiB0aGlzIHBsYXRmb3JtLgorICAvLy8gQSB2YWx1ZSBvZiAwIG1lYW5zIHRoZXJlIGlzIG5vIGxpbWl0LgorICB1aW50MzJfdCBnZXRfbWF4X3RocmVhZF9uYW1lX2xlbmd0aCgpOworCisgIC8vLyBcYnJpZWYgU2V0IHRoZSBuYW1lIG9mIHRoZSBjdXJyZW50IHRocmVhZC4gIFNldHRpbmcgYSB0aHJlYWQncyBuYW1lIGNhbgorICAvLy8gYmUgaGVscGZ1bCBmb3IgZW5hYmxpbmcgdXNlZnVsIGRpYWdub3N0aWNzIHVuZGVyIGEgZGVidWdnZXIgb3Igd2hlbgorICAvLy8gbG9nZ2luZy4gIFRoZSBsZXZlbCBvZiBzdXBwb3J0IGZvciBzZXR0aW5nIGEgdGhyZWFkJ3MgbmFtZSB2YXJpZXMKKyAgLy8vIHdpbGRseSBhY3Jvc3Mgb3BlcmF0aW5nIHN5c3RlbXMsIGFuZCB3ZSBvbmx5IG1ha2UgYSBiZXN0IGVmZm9ydCB0bworICAvLy8gcGVyZm9ybSB0aGUgb3BlcmF0aW9uIG9uIHN1cHBvcnRlZCBwbGF0Zm9ybXMuICBObyBpbmRpY2F0aW9uIG9mIHN1Y2Nlc3MKKyAgLy8vIG9yIGZhaWx1cmUgaXMgcmV0dXJuZWQuCisgIHZvaWQgc2V0X3RocmVhZF9uYW1lKGNvbnN0IFR3aW5lICZOYW1lKTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgbmFtZSBvZiB0aGUgY3VycmVudCB0aHJlYWQuICBUaGUgbGV2ZWwgb2Ygc3VwcG9ydCBmb3IKKyAgLy8vIGdldHRpbmcgYSB0aHJlYWQncyBuYW1lIHZhcmllcyB3aWxkbHkgYWNyb3NzIG9wZXJhdGluZyBzeXN0ZW1zLCBhbmQgaXQKKyAgLy8vIGlzIG5vdCBldmVuIGd1YXJhbnRlZWQgdGhhdCBpZiB5b3UgY2FuIHN1Y2Nlc3NmdWxseSBzZXQgYSB0aHJlYWQncyBuYW1lCisgIC8vLyB0aGF0IHlvdSBjYW4gbGF0ZXIgZ2V0IGl0IGJhY2suICBUaGlzIGZ1bmN0aW9uIGlzIGludGVuZGVkIGZvciBkaWFnbm9zdGljCisgIC8vLyBwdXJwb3NlcywgYW5kIGFzIHdpdGggc2V0dGluZyBhIHRocmVhZCdzIG5hbWUgbm8gaW5kaWNhdGlvbiBvZiB3aGV0aGVyCisgIC8vLyB0aGUgb3BlcmF0aW9uIHN1Y2NlZWRlZCBvciBmYWlsZWQgaXMgcmV0dXJuZWQuCisgIHZvaWQgZ2V0X3RocmVhZF9uYW1lKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmTmFtZSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RpbWVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVGltZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOTg4NTVhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RpbWVyLmgKQEAgLTAsMCArMSwyMzEgQEAKKy8vPT09LS0gbGx2bS9TdXBwb3J0L1RpbWVyLmggLSBJbnRlcnZhbCBUaW1pbmcgU3VwcG9ydCAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1RJTUVSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1RJTUVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9EYXRhVHlwZXMuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBUaW1lcjsKK2NsYXNzIFRpbWVyR3JvdXA7CitjbGFzcyByYXdfb3N0cmVhbTsKKworY2xhc3MgVGltZVJlY29yZCB7CisgIGRvdWJsZSBXYWxsVGltZTsgICAgICAgLy8vPCBXYWxsIGNsb2NrIHRpbWUgZWxhcHNlZCBpbiBzZWNvbmRzLgorICBkb3VibGUgVXNlclRpbWU7ICAgICAgIC8vLzwgVXNlciB0aW1lIGVsYXBzZWQuCisgIGRvdWJsZSBTeXN0ZW1UaW1lOyAgICAgLy8vPCBTeXN0ZW0gdGltZSBlbGFwc2VkLgorICBzc2l6ZV90IE1lbVVzZWQ7ICAgICAgIC8vLzwgTWVtb3J5IGFsbG9jYXRlZCAoaW4gYnl0ZXMpLgorcHVibGljOgorICBUaW1lUmVjb3JkKCkgOiBXYWxsVGltZSgwKSwgVXNlclRpbWUoMCksIFN5c3RlbVRpbWUoMCksIE1lbVVzZWQoMCkge30KKworICAvLy8gR2V0IHRoZSBjdXJyZW50IHRpbWUgYW5kIG1lbW9yeSB1c2FnZS4gIElmIFN0YXJ0IGlzIHRydWUgd2UgZ2V0IHRoZSBtZW1vcnkKKyAgLy8vIHVzYWdlIGJlZm9yZSB0aGUgdGltZSwgb3RoZXJ3aXNlIHdlIGdldCB0aW1lIGJlZm9yZSBtZW1vcnkgdXNhZ2UuICBUaGlzCisgIC8vLyBtYXR0ZXJzIGlmIHRoZSB0aW1lIHRvIGdldCB0aGUgbWVtb3J5IHVzYWdlIGlzIHNpZ25pZmljYW50IGFuZCBzaG91bGRuJ3QKKyAgLy8vIGJlIGNvdW50ZWQgYXMgcGFydCBvZiBhIGR1cmF0aW9uLgorICBzdGF0aWMgVGltZVJlY29yZCBnZXRDdXJyZW50VGltZShib29sIFN0YXJ0ID0gdHJ1ZSk7CisKKyAgZG91YmxlIGdldFByb2Nlc3NUaW1lKCkgY29uc3QgeyByZXR1cm4gVXNlclRpbWUgKyBTeXN0ZW1UaW1lOyB9CisgIGRvdWJsZSBnZXRVc2VyVGltZSgpIGNvbnN0IHsgcmV0dXJuIFVzZXJUaW1lOyB9CisgIGRvdWJsZSBnZXRTeXN0ZW1UaW1lKCkgY29uc3QgeyByZXR1cm4gU3lzdGVtVGltZTsgfQorICBkb3VibGUgZ2V0V2FsbFRpbWUoKSBjb25zdCB7IHJldHVybiBXYWxsVGltZTsgfQorICBzc2l6ZV90IGdldE1lbVVzZWQoKSBjb25zdCB7IHJldHVybiBNZW1Vc2VkOyB9CisKKyAgYm9vbCBvcGVyYXRvcjwoY29uc3QgVGltZVJlY29yZCAmVCkgY29uc3QgeworICAgIC8vIFNvcnQgYnkgV2FsbCBUaW1lIGVsYXBzZWQsIGFzIGl0IGlzIHRoZSBvbmx5IHRoaW5nIHJlYWxseSBhY2N1cmF0ZQorICAgIHJldHVybiBXYWxsVGltZSA8IFQuV2FsbFRpbWU7CisgIH0KKworICB2b2lkIG9wZXJhdG9yKz0oY29uc3QgVGltZVJlY29yZCAmUkhTKSB7CisgICAgV2FsbFRpbWUgICArPSBSSFMuV2FsbFRpbWU7CisgICAgVXNlclRpbWUgICArPSBSSFMuVXNlclRpbWU7CisgICAgU3lzdGVtVGltZSArPSBSSFMuU3lzdGVtVGltZTsKKyAgICBNZW1Vc2VkICAgICs9IFJIUy5NZW1Vc2VkOworICB9CisgIHZvaWQgb3BlcmF0b3ItPShjb25zdCBUaW1lUmVjb3JkICZSSFMpIHsKKyAgICBXYWxsVGltZSAgIC09IFJIUy5XYWxsVGltZTsKKyAgICBVc2VyVGltZSAgIC09IFJIUy5Vc2VyVGltZTsKKyAgICBTeXN0ZW1UaW1lIC09IFJIUy5TeXN0ZW1UaW1lOworICAgIE1lbVVzZWQgICAgLT0gUkhTLk1lbVVzZWQ7CisgIH0KKworICAvLy8gUHJpbnQgdGhlIGN1cnJlbnQgdGltZSByZWNvcmQgdG8gXHAgT1MsIHdpdGggYSBicmVha2Rvd24gc2hvd2luZworICAvLy8gY29udHJpYnV0aW9ucyB0byB0aGUgXHAgVG90YWwgdGltZSByZWNvcmQuCisgIHZvaWQgcHJpbnQoY29uc3QgVGltZVJlY29yZCAmVG90YWwsIHJhd19vc3RyZWFtICZPUykgY29uc3Q7Cit9OworCisvLy8gVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHRyYWNrIHRoZSBhbW91bnQgb2YgdGltZSBzcGVudCBiZXR3ZWVuIGludm9jYXRpb25zIG9mCisvLy8gaXRzIHN0YXJ0VGltZXIoKS9zdG9wVGltZXIoKSBtZXRob2RzLiAgR2l2ZW4gYXBwcm9wcmlhdGUgT1Mgc3VwcG9ydCBpdCBjYW4KKy8vLyBhbHNvIGtlZXAgdHJhY2sgb2YgdGhlIFJTUyBvZiB0aGUgcHJvZ3JhbSBhdCB2YXJpb3VzIHBvaW50cy4gIEJ5IGRlZmF1bHQsCisvLy8gdGhlIFRpbWVyIHdpbGwgcHJpbnQgdGhlIGFtb3VudCBvZiB0aW1lIGl0IGhhcyBjYXB0dXJlZCB0byBzdGFuZGFyZCBlcnJvcgorLy8vIHdoZW4gdGhlIGxhc3QgdGltZXIgaXMgZGVzdHJveWVkLCBvdGhlcndpc2UgaXQgaXMgcHJpbnRlZCB3aGVuIGl0cworLy8vIFRpbWVyR3JvdXAgaXMgZGVzdHJveWVkLiAgVGltZXJzIGRvIG5vdCBwcmludCB0aGVpciBpbmZvcm1hdGlvbiBpZiB0aGV5IGFyZQorLy8vIG5ldmVyIHN0YXJ0ZWQuCitjbGFzcyBUaW1lciB7CisgIFRpbWVSZWNvcmQgVGltZTsgICAgICAgICAgLy8vPCBUaGUgdG90YWwgdGltZSBjYXB0dXJlZC4KKyAgVGltZVJlY29yZCBTdGFydFRpbWU7ICAgICAvLy88IFRoZSB0aW1lIHN0YXJ0VGltZXIoKSB3YXMgbGFzdCBjYWxsZWQuCisgIHN0ZDo6c3RyaW5nIE5hbWU7ICAgICAgICAgLy8vPCBUaGUgbmFtZSBvZiB0aGlzIHRpbWUgdmFyaWFibGUuCisgIHN0ZDo6c3RyaW5nIERlc2NyaXB0aW9uOyAgLy8vPCBEZXNjcmlwdGlvbiBvZiB0aGlzIHRpbWUgdmFyaWFibGUuCisgIGJvb2wgUnVubmluZzsgICAgICAgICAgICAgLy8vPCBJcyB0aGUgdGltZXIgY3VycmVudGx5IHJ1bm5pbmc/CisgIGJvb2wgVHJpZ2dlcmVkOyAgICAgICAgICAgLy8vPCBIYXMgdGhlIHRpbWVyIGV2ZXIgYmVlbiB0cmlnZ2VyZWQ/CisgIFRpbWVyR3JvdXAgKlRHID0gbnVsbHB0cjsgLy8vPCBUaGUgVGltZXJHcm91cCB0aGlzIFRpbWVyIGlzIGluLgorCisgIFRpbWVyICoqUHJldjsgICAgICAgICAgICAgLy8vPCBQb2ludGVyIHRvIFxwIE5leHQgb2YgcHJldmlvdXMgdGltZXIgaW4gZ3JvdXAuCisgIFRpbWVyICpOZXh0OyAgICAgICAgICAgICAgLy8vPCBOZXh0IHRpbWVyIGluIHRoZSBncm91cC4KK3B1YmxpYzoKKyAgZXhwbGljaXQgVGltZXIoU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBEZXNjcmlwdGlvbikgeworICAgIGluaXQoTmFtZSwgRGVzY3JpcHRpb24pOworICB9CisgIFRpbWVyKFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgRGVzY3JpcHRpb24sIFRpbWVyR3JvdXAgJnRnKSB7CisgICAgaW5pdChOYW1lLCBEZXNjcmlwdGlvbiwgdGcpOworICB9CisgIFRpbWVyKGNvbnN0IFRpbWVyICZSSFMpIHsKKyAgICBhc3NlcnQoIVJIUy5URyAmJiAiQ2FuIG9ubHkgY29weSB1bmluaXRpYWxpemVkIHRpbWVycyIpOworICB9CisgIGNvbnN0IFRpbWVyICZvcGVyYXRvcj0oY29uc3QgVGltZXIgJlQpIHsKKyAgICBhc3NlcnQoIVRHICYmICFULlRHICYmICJDYW4gb25seSBhc3NpZ24gdW5pbml0IHRpbWVycyIpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICB+VGltZXIoKTsKKworICAvLy8gQ3JlYXRlIGFuIHVuaW5pdGlhbGl6ZWQgdGltZXIsIGNsaWVudCBtdXN0IHVzZSAnaW5pdCcuCisgIGV4cGxpY2l0IFRpbWVyKCkge30KKyAgdm9pZCBpbml0KFN0cmluZ1JlZiBOYW1lLCBTdHJpbmdSZWYgRGVzY3JpcHRpb24pOworICB2b2lkIGluaXQoU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBEZXNjcmlwdGlvbiwgVGltZXJHcm91cCAmdGcpOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nICZnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gTmFtZTsgfQorICBjb25zdCBzdGQ6OnN0cmluZyAmZ2V0RGVzY3JpcHRpb24oKSBjb25zdCB7IHJldHVybiBEZXNjcmlwdGlvbjsgfQorICBib29sIGlzSW5pdGlhbGl6ZWQoKSBjb25zdCB7IHJldHVybiBURyAhPSBudWxscHRyOyB9CisKKyAgLy8vIENoZWNrIGlmIHRoZSB0aW1lciBpcyBjdXJyZW50bHkgcnVubmluZy4KKyAgYm9vbCBpc1J1bm5pbmcoKSBjb25zdCB7IHJldHVybiBSdW5uaW5nOyB9CisKKyAgLy8vIENoZWNrIGlmIHN0YXJ0VGltZXIoKSBoYXMgZXZlciBiZWVuIGNhbGxlZCBvbiB0aGlzIHRpbWVyLgorICBib29sIGhhc1RyaWdnZXJlZCgpIGNvbnN0IHsgcmV0dXJuIFRyaWdnZXJlZDsgfQorCisgIC8vLyBTdGFydCB0aGUgdGltZXIgcnVubmluZy4gIFRpbWUgYmV0d2VlbiBjYWxscyB0byBzdGFydFRpbWVyL3N0b3BUaW1lciBpcworICAvLy8gY291bnRlZCBieSB0aGUgVGltZXIgY2xhc3MuICBOb3RlIHRoYXQgdGhlc2UgY2FsbHMgbXVzdCBiZSBjb3JyZWN0bHkKKyAgLy8vIHBhaXJlZC4KKyAgdm9pZCBzdGFydFRpbWVyKCk7CisKKyAgLy8vIFN0b3AgdGhlIHRpbWVyLgorICB2b2lkIHN0b3BUaW1lcigpOworCisgIC8vLyBDbGVhciB0aGUgdGltZXIgc3RhdGUuCisgIHZvaWQgY2xlYXIoKTsKKworICAvLy8gUmV0dXJuIHRoZSBkdXJhdGlvbiBmb3Igd2hpY2ggdGhpcyB0aW1lciBoYXMgYmVlbiBydW5uaW5nLgorICBUaW1lUmVjb3JkIGdldFRvdGFsVGltZSgpIGNvbnN0IHsgcmV0dXJuIFRpbWU7IH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFRpbWVyR3JvdXA7Cit9OworCisvLy8gVGhlIFRpbWVSZWdpb24gY2xhc3MgaXMgdXNlZCBhcyBhIGhlbHBlciBjbGFzcyB0byBjYWxsIHRoZSBzdGFydFRpbWVyKCkgYW5kCisvLy8gc3RvcFRpbWVyKCkgbWV0aG9kcyBvZiB0aGUgVGltZXIgY2xhc3MuICBXaGVuIHRoZSBvYmplY3QgaXMgY29uc3RydWN0ZWQsIGl0CisvLy8gc3RhcnRzIHRoZSB0aW1lciBzcGVjaWZpZWQgYXMgaXRzIGFyZ3VtZW50LiAgV2hlbiBpdCBpcyBkZXN0cm95ZWQsIGl0IHN0b3BzCisvLy8gdGhlIHJlbGV2YW50IHRpbWVyLiAgVGhpcyBtYWtlcyBpdCBlYXN5IHRvIHRpbWUgYSByZWdpb24gb2YgY29kZS4KK2NsYXNzIFRpbWVSZWdpb24geworICBUaW1lciAqVDsKKyAgVGltZVJlZ2lvbihjb25zdCBUaW1lUmVnaW9uICYpID0gZGVsZXRlOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFRpbWVSZWdpb24oVGltZXIgJnQpIDogVCgmdCkgeworICAgIFQtPnN0YXJ0VGltZXIoKTsKKyAgfQorICBleHBsaWNpdCBUaW1lUmVnaW9uKFRpbWVyICp0KSA6IFQodCkgeworICAgIGlmIChUKSBULT5zdGFydFRpbWVyKCk7CisgIH0KKyAgflRpbWVSZWdpb24oKSB7CisgICAgaWYgKFQpIFQtPnN0b3BUaW1lcigpOworICB9Cit9OworCisvLy8gVGhpcyBjbGFzcyBpcyBiYXNpY2FsbHkgYSBjb21iaW5hdGlvbiBvZiBUaW1lUmVnaW9uIGFuZCBUaW1lci4gIEl0IGFsbG93cworLy8vIHlvdSB0byBkZWNsYXJlIGEgbmV3IHRpbWVyLCBBTkQgc3BlY2lmeSB0aGUgcmVnaW9uIHRvIHRpbWUsIGFsbCBpbiBvbmUKKy8vLyBzdGF0ZW1lbnQuICBBbGwgdGltZXJzIHdpdGggdGhlIHNhbWUgbmFtZSBhcmUgbWVyZ2VkLiAgVGhpcyBpcyBwcmltYXJpbHkKKy8vLyB1c2VkIGZvciBkZWJ1Z2dpbmcgYW5kIGZvciBodW50aW5nIHBlcmZvcm1hbmNlIHByb2JsZW1zLgorc3RydWN0IE5hbWVkUmVnaW9uVGltZXIgOiBwdWJsaWMgVGltZVJlZ2lvbiB7CisgIGV4cGxpY2l0IE5hbWVkUmVnaW9uVGltZXIoU3RyaW5nUmVmIE5hbWUsIFN0cmluZ1JlZiBEZXNjcmlwdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdSZWYgR3JvdXBOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBHcm91cERlc2NyaXB0aW9uLCBib29sIEVuYWJsZWQgPSB0cnVlKTsKK307CisKKy8vLyBUaGUgVGltZXJHcm91cCBjbGFzcyBpcyB1c2VkIHRvIGdyb3VwIHRvZ2V0aGVyIHJlbGF0ZWQgdGltZXJzIGludG8gYSBzaW5nbGUKKy8vLyByZXBvcnQgdGhhdCBpcyBwcmludGVkIHdoZW4gdGhlIFRpbWVyR3JvdXAgaXMgZGVzdHJveWVkLiAgSXQgaXMgaWxsZWdhbCB0bworLy8vIGRlc3Ryb3kgYSBUaW1lckdyb3VwIG9iamVjdCBiZWZvcmUgYWxsIG9mIHRoZSBUaW1lcnMgaW4gaXQgYXJlIGdvbmUuICBBCisvLy8gVGltZXJHcm91cCBjYW4gYmUgc3BlY2lmaWVkIGZvciBhIG5ld2x5IGNyZWF0ZWQgdGltZXIgaW4gaXRzIGNvbnN0cnVjdG9yLgorY2xhc3MgVGltZXJHcm91cCB7CisgIHN0cnVjdCBQcmludFJlY29yZCB7CisgICAgVGltZVJlY29yZCBUaW1lOworICAgIHN0ZDo6c3RyaW5nIE5hbWU7CisgICAgc3RkOjpzdHJpbmcgRGVzY3JpcHRpb247CisKKyAgICBQcmludFJlY29yZChjb25zdCBQcmludFJlY29yZCAmT3RoZXIpID0gZGVmYXVsdDsKKyAgICBQcmludFJlY29yZChjb25zdCBUaW1lUmVjb3JkICZUaW1lLCBjb25zdCBzdGQ6OnN0cmluZyAmTmFtZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyAmRGVzY3JpcHRpb24pCisgICAgICA6IFRpbWUoVGltZSksIE5hbWUoTmFtZSksIERlc2NyaXB0aW9uKERlc2NyaXB0aW9uKSB7fQorCisgICAgYm9vbCBvcGVyYXRvciA8KGNvbnN0IFByaW50UmVjb3JkICZPdGhlcikgY29uc3QgeworICAgICAgcmV0dXJuIFRpbWUgPCBPdGhlci5UaW1lOworICAgIH0KKyAgfTsKKyAgc3RkOjpzdHJpbmcgTmFtZTsKKyAgc3RkOjpzdHJpbmcgRGVzY3JpcHRpb247CisgIFRpbWVyICpGaXJzdFRpbWVyID0gbnVsbHB0cjsgLy8vPCBGaXJzdCB0aW1lciBpbiB0aGUgZ3JvdXAuCisgIHN0ZDo6dmVjdG9yPFByaW50UmVjb3JkPiBUaW1lcnNUb1ByaW50OworCisgIFRpbWVyR3JvdXAgKipQcmV2OyAvLy88IFBvaW50ZXIgdG8gTmV4dCBmaWVsZCBvZiBwcmV2aW91cyB0aW1lcmdyb3VwIGluIGxpc3QuCisgIFRpbWVyR3JvdXAgKk5leHQ7ICAvLy88IFBvaW50ZXIgdG8gbmV4dCB0aW1lcmdyb3VwIGluIGxpc3QuCisgIFRpbWVyR3JvdXAoY29uc3QgVGltZXJHcm91cCAmVEcpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBUaW1lckdyb3VwICZURykgPSBkZWxldGU7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgVGltZXJHcm91cChTdHJpbmdSZWYgTmFtZSwgU3RyaW5nUmVmIERlc2NyaXB0aW9uKTsKKyAgflRpbWVyR3JvdXAoKTsKKworICB2b2lkIHNldE5hbWUoU3RyaW5nUmVmIE5ld05hbWUsIFN0cmluZ1JlZiBOZXdEZXNjcmlwdGlvbikgeworICAgIE5hbWUuYXNzaWduKE5ld05hbWUuYmVnaW4oKSwgTmV3TmFtZS5lbmQoKSk7CisgICAgRGVzY3JpcHRpb24uYXNzaWduKE5ld0Rlc2NyaXB0aW9uLmJlZ2luKCksIE5ld0Rlc2NyaXB0aW9uLmVuZCgpKTsKKyAgfQorCisgIC8vLyBQcmludCBhbnkgc3RhcnRlZCB0aW1lcnMgaW4gdGhpcyBncm91cCBhbmQgemVybyB0aGVtLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUyk7CisKKyAgLy8vIFRoaXMgc3RhdGljIG1ldGhvZCBwcmludHMgYWxsIHRpbWVycyBhbmQgY2xlYXJzIHRoZW0gYWxsIG91dC4KKyAgc3RhdGljIHZvaWQgcHJpbnRBbGwocmF3X29zdHJlYW0gJk9TKTsKKworICAvLy8gUHJpbnRzIGFsbCB0aW1lcnMgYXMgSlNPTiBrZXkvdmFsdWUgcGFpcnMsIGFuZCBjbGVhcnMgdGhlbSBhbGwgb3V0LgorICBzdGF0aWMgY29uc3QgY2hhciAqcHJpbnRBbGxKU09OVmFsdWVzKHJhd19vc3RyZWFtICZPUywgY29uc3QgY2hhciAqZGVsaW0pOworCisgIC8vLyBFbnN1cmUgZ2xvYmFsIHRpbWVyIGdyb3VwIGxpc3RzIGFyZSBpbml0aWFsaXplZC4gVGhpcyBmdW5jdGlvbiBpcyBtb3N0bHkKKyAgLy8vIHVzZWQgYnkgdGhlIFN0YXRpc3RpYyBjb2RlIHRvIGluZmx1ZW5jZSB0aGUgY29uc3RydWN0aW9uIGFuZCBkZXN0cnVjdGlvbgorICAvLy8gb3JkZXIgb2YgdGhlIGdsb2JhbCB0aW1lciBsaXN0cy4KKyAgc3RhdGljIHZvaWQgQ29uc3RydWN0VGltZXJMaXN0cygpOworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIFRpbWVyOworICBmcmllbmQgdm9pZCBQcmludFN0YXRpc3RpY3NKU09OKHJhd19vc3RyZWFtICZPUyk7CisgIHZvaWQgYWRkVGltZXIoVGltZXIgJlQpOworICB2b2lkIHJlbW92ZVRpbWVyKFRpbWVyICZUKTsKKyAgdm9pZCBwcmVwYXJlVG9QcmludExpc3QoKTsKKyAgdm9pZCBQcmludFF1ZXVlZFRpbWVycyhyYXdfb3N0cmVhbSAmT1MpOworICB2b2lkIHByaW50SlNPTlZhbHVlKHJhd19vc3RyZWFtICZPUywgY29uc3QgUHJpbnRSZWNvcmQgJlIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3VmZml4LCBkb3VibGUgVmFsdWUpOworICBjb25zdCBjaGFyICpwcmludEpTT05WYWx1ZXMocmF3X29zdHJlYW0gJk9TLCBjb25zdCBjaGFyICpkZWxpbSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Ub29sT3V0cHV0RmlsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1Rvb2xPdXRwdXRGaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZkNWYyMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Ub29sT3V0cHV0RmlsZS5oCkBAIC0wLDAgKzEsNjMgQEAKKy8vPT09LSBUb29sT3V0cHV0RmlsZS5oIC0gT3V0cHV0IGZpbGVzIGZvciBjb21waWxlci1saWtlIHRvb2xzIC0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIFRvb2xPdXRwdXRGaWxlIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1RPT0xPVVRQVVRGSUxFX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1RPT0xPVVRQVVRGSUxFX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBUaGlzIGNsYXNzIGNvbnRhaW5zIGEgcmF3X2ZkX29zdHJlYW0gYW5kIGFkZHMgYSBmZXcgZXh0cmEgZmVhdHVyZXMgY29tbW9ubHkKKy8vLyBuZWVkZWQgZm9yIGNvbXBpbGVyLWxpa2UgdG9vbCBvdXRwdXQgZmlsZXM6CisvLy8gICAtIFRoZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZGVsZXRlZCBpZiB0aGUgcHJvY2VzcyBpcyBraWxsZWQuCisvLy8gICAtIFRoZSBmaWxlIGlzIGF1dG9tYXRpY2FsbHkgZGVsZXRlZCB3aGVuIHRoZSBUb29sT3V0cHV0RmlsZQorLy8vICAgICBvYmplY3QgaXMgZGVzdHJveWVkIHVubGVzcyB0aGUgY2xpZW50IGNhbGxzIGtlZXAoKS4KK2NsYXNzIFRvb2xPdXRwdXRGaWxlIHsKKyAgLy8vIFRoaXMgY2xhc3MgaXMgZGVjbGFyZWQgYmVmb3JlIHRoZSByYXdfZmRfb3N0cmVhbSBzbyB0aGF0IGl0IGlzIGNvbnN0cnVjdGVkCisgIC8vLyBiZWZvcmUgdGhlIHJhd19mZF9vc3RyZWFtIGlzIGNvbnN0cnVjdGVkIGFuZCBkZXN0cnVjdGVkIGFmdGVyIHRoZQorICAvLy8gcmF3X2ZkX29zdHJlYW0gaXMgZGVzdHJ1Y3RlZC4gSXQgaW5zdGFsbHMgY2xlYW51cHMgaW4gaXRzIGNvbnN0cnVjdG9yIGFuZAorICAvLy8gdW5pbnN0YWxscyB0aGVtIGluIGl0cyBkZXN0cnVjdG9yLgorICBjbGFzcyBDbGVhbnVwSW5zdGFsbGVyIHsKKyAgICAvLy8gVGhlIG5hbWUgb2YgdGhlIGZpbGUuCisgICAgc3RkOjpzdHJpbmcgRmlsZW5hbWU7CisgIHB1YmxpYzoKKyAgICAvLy8gVGhlIGZsYWcgd2hpY2ggaW5kaWNhdGVzIHdoZXRoZXIgd2Ugc2hvdWxkIG5vdCBkZWxldGUgdGhlIGZpbGUuCisgICAgYm9vbCBLZWVwOworCisgICAgZXhwbGljaXQgQ2xlYW51cEluc3RhbGxlcihTdHJpbmdSZWYgaWxlbmFtZSk7CisgICAgfkNsZWFudXBJbnN0YWxsZXIoKTsKKyAgfSBJbnN0YWxsZXI7CisKKyAgLy8vIFRoZSBjb250YWluZWQgc3RyZWFtLiBUaGlzIGlzIGludGVudGlvbmFsbHkgZGVjbGFyZWQgYWZ0ZXIgSW5zdGFsbGVyLgorICByYXdfZmRfb3N0cmVhbSBPUzsKKworcHVibGljOgorICAvLy8gVGhpcyBjb25zdHJ1Y3RvcidzIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRvIHJhd19mZF9vc3RyZWFtJ3MKKyAgLy8vIGNvbnN0cnVjdG9yLgorICBUb29sT3V0cHV0RmlsZShTdHJpbmdSZWYgRmlsZW5hbWUsIHN0ZDo6ZXJyb3JfY29kZSAmRUMsCisgICAgICAgICAgICAgICAgIHN5czo6ZnM6Ok9wZW5GbGFncyBGbGFncyk7CisKKyAgVG9vbE91dHB1dEZpbGUoU3RyaW5nUmVmIEZpbGVuYW1lLCBpbnQgRkQpOworCisgIC8vLyBSZXR1cm4gdGhlIGNvbnRhaW5lZCByYXdfZmRfb3N0cmVhbS4KKyAgcmF3X2ZkX29zdHJlYW0gJm9zKCkgeyByZXR1cm4gT1M7IH0KKworICAvLy8gSW5kaWNhdGUgdGhhdCB0aGUgdG9vbCdzIGpvYiB3cnQgdGhpcyBvdXRwdXQgZmlsZSBoYXMgYmVlbiBzdWNjZXNzZnVsIGFuZAorICAvLy8gdGhlIGZpbGUgc2hvdWxkIG5vdCBiZSBkZWxldGVkLgorICB2b2lkIGtlZXAoKSB7IEluc3RhbGxlci5LZWVwID0gdHJ1ZTsgfQorfTsKKworfSAvLyBlbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVHJhaWxpbmdPYmplY3RzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVHJhaWxpbmdPYmplY3RzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I1YTUyYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UcmFpbGluZ09iamVjdHMuaApAQCAtMCwwICsxLDQwMSBAQAorLy89PT0tLS0gVHJhaWxpbmdPYmplY3RzLmggLSBWYXJpYWJsZS1sZW5ndGggY2xhc3NlcyAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLworLy8vIFxmaWxlCisvLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyBzdXBwb3J0IGZvciBpbXBsZW1lbnRpbmcgY2xhc3NlcyB0aGF0IGhhdmUKKy8vLyBzb21lIHRyYWlsaW5nIG9iamVjdCAob3IgYXJyYXlzIG9mIG9iamVjdHMpIGFwcGVuZGVkIHRvIHRoZW0uIFRoZQorLy8vIG1haW4gcHVycG9zZSBpcyB0byBtYWtlIGl0IG9idmlvdXMgd2hlcmUgdGhpcyBpZGlvbSBpcyBiZWluZyB1c2VkLAorLy8vIGFuZCB0byBtYWtlIHRoZSB1c2FnZSBtb3JlIGlkaW9tYXRpYyBhbmQgbW9yZSBkaWZmaWN1bHQgdG8gZ2V0CisvLy8gd3JvbmcuCisvLy8KKy8vLyBUaGUgVHJhaWxpbmdPYmplY3QgdGVtcGxhdGUgYWJzdHJhY3RzIGF3YXkgdGhlIHJlaW50ZXJwcmV0X2Nhc3QsCisvLy8gcG9pbnRlciBhcml0aG1ldGljLCBhbmQgc2l6ZSBjYWxjdWxhdGlvbnMgdXNlZCBmb3IgdGhlIGFsbG9jYXRpb24KKy8vLyBhbmQgYWNjZXNzIG9mIGFwcGVuZGVkIGFycmF5cyBvZiBvYmplY3RzLCBhbmQgdGFrZXMgY2FyZSB0aGF0IHRoZXkKKy8vLyBhcmUgYWxsIGFsbG9jYXRlZCBhdCB0aGVpciByZXF1aXJlZCBhbGlnbm1lbnQuIEFkZGl0aW9uYWxseSwgaXQKKy8vLyBlbnN1cmVzIHRoYXQgdGhlIGJhc2UgdHlwZSBpcyBmaW5hbCAtLSBkZXJpdmluZyBmcm9tIGEgY2xhc3MgdGhhdAorLy8vIGV4cGVjdHMgZGF0YSBhcHBlbmRlZCBpbW1lZGlhdGVseSBhZnRlciBpdCBpcyB0eXBpY2FsbHkgbm90IHNhZmUuCisvLy8KKy8vLyBVc2VycyBhcmUgZXhwZWN0ZWQgdG8gZGVyaXZlIGZyb20gdGhpcyB0ZW1wbGF0ZSwgYW5kIHByb3ZpZGUKKy8vLyBudW1UcmFpbGluZ09iamVjdHMgaW1wbGVtZW50YXRpb25zIGZvciBlYWNoIHRyYWlsaW5nIHR5cGUgZXhjZXB0CisvLy8gdGhlIGxhc3QsIGUuZy4gbGlrZSB0aGlzIHNhbXBsZToKKy8vLworLy8vIFxjb2RlCisvLy8gY2xhc3MgVmFyTGVuZ3RoT2JqIDogcHJpdmF0ZSBUcmFpbGluZ09iamVjdHM8VmFyTGVuZ3RoT2JqLCBpbnQsIGRvdWJsZT4geworLy8vICAgZnJpZW5kIFRyYWlsaW5nT2JqZWN0czsKKy8vLworLy8vICAgdW5zaWduZWQgTnVtSW50cywgTnVtRG91YmxlczsKKy8vLyAgIHNpemVfdCBudW1UcmFpbGluZ09iamVjdHMoT3ZlcmxvYWRUb2tlbjxpbnQ+KSBjb25zdCB7IHJldHVybiBOdW1JbnRzOyB9CisvLy8gIH07CisvLy8gXGVuZGNvZGUKKy8vLworLy8vIFlvdSBjYW4gYWNjZXNzIHRoZSBhcHBlbmRlZCBhcnJheXMgdmlhICdnZXRUcmFpbGluZ09iamVjdHMnLCBhbmQKKy8vLyBkZXRlcm1pbmUgdGhlIHNpemUgbmVlZGVkIGZvciBhbGxvY2F0aW9uIHZpYQorLy8vICdhZGRpdGlvbmFsU2l6ZVRvQWxsb2MnIGFuZCAndG90YWxTaXplVG9BbGxvYycuCisvLy8KKy8vLyBBbGwgdGhlIG1ldGhvZHMgaW1wbGVtZW50ZWQgYnkgdGhpcyBjbGFzcyBhcmUgYXJlIGludGVuZGVkIGZvciB1c2UKKy8vLyBieSB0aGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGNsYXNzLCBub3QgYXMgcGFydCBvZiBpdHMgaW50ZXJmYWNlCisvLy8gKHRodXMsIHByaXZhdGUgaW5oZXJpdGFuY2UgaXMgc3VnZ2VzdGVkKS4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfVFJBSUxJTkdPQkpFQ1RTX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1RSQUlMSU5HT0JKRUNUU19ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxpZ25PZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9NYXRoRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSA8bmV3PgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorCituYW1lc3BhY2UgbGx2bSB7CisKK25hbWVzcGFjZSB0cmFpbGluZ19vYmplY3RzX2ludGVybmFsIHsKKy8vLyBIZWxwZXIgdGVtcGxhdGUgdG8gY2FsY3VsYXRlIHRoZSBtYXggYWxpZ25tZW50IHJlcXVpcmVtZW50IGZvciBhIHNldCBvZgorLy8vIG9iamVjdHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRmlyc3QsIHR5cGVuYW1lLi4uIFJlc3Q+IGNsYXNzIEFsaWdubWVudENhbGNIZWxwZXIgeworcHJpdmF0ZToKKyAgZW51bSB7CisgICAgRmlyc3RBbGlnbm1lbnQgPSBhbGlnbm9mKEZpcnN0KSwKKyAgICBSZXN0QWxpZ25tZW50ID0gQWxpZ25tZW50Q2FsY0hlbHBlcjxSZXN0Li4uPjo6QWxpZ25tZW50LAorICB9OworCitwdWJsaWM6CisgIGVudW0geworICAgIEFsaWdubWVudCA9IEZpcnN0QWxpZ25tZW50ID4gUmVzdEFsaWdubWVudCA/IEZpcnN0QWxpZ25tZW50IDogUmVzdEFsaWdubWVudAorICB9OworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0PiBjbGFzcyBBbGlnbm1lbnRDYWxjSGVscGVyPEZpcnN0PiB7CitwdWJsaWM6CisgIGVudW0geyBBbGlnbm1lbnQgPSBhbGlnbm9mKEZpcnN0KSB9OworfTsKKworLy8vIFRoZSBiYXNlIGNsYXNzIGZvciBUcmFpbGluZ09iamVjdHMqIGNsYXNzZXMuCitjbGFzcyBUcmFpbGluZ09iamVjdHNCYXNlIHsKK3Byb3RlY3RlZDoKKyAgLy8vIE92ZXJsb2FkVG9rZW4ncyBwdXJwb3NlIGlzIHRvIGFsbG93IHNwZWNpZnlpbmcgZnVuY3Rpb24gb3ZlcmxvYWRzCisgIC8vLyBmb3IgZGlmZmVyZW50IHR5cGVzLCB3aXRob3V0IGFjdHVhbGx5IHRha2luZyB0aGUgdHlwZXMgYXMKKyAgLy8vIHBhcmFtZXRlcnMuIChOZWNlc3NhcnkgYmVjYXVzZSBtZW1iZXIgZnVuY3Rpb24gdGVtcGxhdGVzIGNhbm5vdAorICAvLy8gYmUgc3BlY2lhbGl6ZWQsIHNvIG92ZXJsb2FkcyBtdXN0IGJlIHVzZWQgaW5zdGVhZCBvZgorICAvLy8gc3BlY2lhbGl6YXRpb24uKQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IE92ZXJsb2FkVG9rZW4ge307Cit9OworCisvLy8gVGhpcyBoZWxwZXIgdGVtcGxhdGUgd29ya3MtYXJvdW5kIE1TVkMgMjAxMydzIGxhY2sgb2YgdXNlZnVsCisvLy8gYWxpZ25hcygpIHN1cHBvcnQuIFRoZSBhcmd1bWVudCB0byBMTFZNX0FMSUdOQVMoKSwgaW4gTVNWQywgaXMKKy8vLyByZXF1aXJlZCB0byBiZSBhIGxpdGVyYWwgaW50ZWdlci4gQnV0LCB5b3UgKmNhbiogdXNlIHRlbXBsYXRlCisvLy8gc3BlY2lhbGl6YXRpb24gdG8gc2VsZWN0IGJldHdlZW4gYSBidW5jaCBvZiBkaWZmZXJlbnQgTExWTV9BTElHTkFTCisvLy8gZXhwcmVzc2lvbnMuLi4KK3RlbXBsYXRlIDxpbnQgQWxpZ24+CitjbGFzcyBUcmFpbGluZ09iamVjdHNBbGlnbmVyIDogcHVibGljIFRyYWlsaW5nT2JqZWN0c0Jhc2Uge307Cit0ZW1wbGF0ZSA8PgorY2xhc3MgTExWTV9BTElHTkFTKDEpIFRyYWlsaW5nT2JqZWN0c0FsaWduZXI8MT4gOiBwdWJsaWMgVHJhaWxpbmdPYmplY3RzQmFzZSB7fTsKK3RlbXBsYXRlIDw+CitjbGFzcyBMTFZNX0FMSUdOQVMoMikgVHJhaWxpbmdPYmplY3RzQWxpZ25lcjwyPiA6IHB1YmxpYyBUcmFpbGluZ09iamVjdHNCYXNlIHt9OwordGVtcGxhdGUgPD4KK2NsYXNzIExMVk1fQUxJR05BUyg0KSBUcmFpbGluZ09iamVjdHNBbGlnbmVyPDQ+IDogcHVibGljIFRyYWlsaW5nT2JqZWN0c0Jhc2Uge307Cit0ZW1wbGF0ZSA8PgorY2xhc3MgTExWTV9BTElHTkFTKDgpIFRyYWlsaW5nT2JqZWN0c0FsaWduZXI8OD4gOiBwdWJsaWMgVHJhaWxpbmdPYmplY3RzQmFzZSB7fTsKK3RlbXBsYXRlIDw+CitjbGFzcyBMTFZNX0FMSUdOQVMoMTYpIFRyYWlsaW5nT2JqZWN0c0FsaWduZXI8MTY+IDogcHVibGljIFRyYWlsaW5nT2JqZWN0c0Jhc2UgeworfTsKK3RlbXBsYXRlIDw+CitjbGFzcyBMTFZNX0FMSUdOQVMoMzIpIFRyYWlsaW5nT2JqZWN0c0FsaWduZXI8MzI+IDogcHVibGljIFRyYWlsaW5nT2JqZWN0c0Jhc2UgeworfTsKKworLy8gSnVzdCBhIGxpdHRsZSBoZWxwZXIgZm9yIHRyYW5zZm9ybWluZyBhIHR5cGUgcGFjayBpbnRvIHRoZSBzYW1lCisvLyBudW1iZXIgb2YgYSBkaWZmZXJlbnQgdHlwZS4gZS5nLjoKKy8vICAgRXh0cmFjdFNlY29uZFR5cGU8Rm9vLi4uLCBpbnQ+Ojp0eXBlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHkxLCB0eXBlbmFtZSBUeTI+IHN0cnVjdCBFeHRyYWN0U2Vjb25kVHlwZSB7CisgIHR5cGVkZWYgVHkyIHR5cGU7Cit9OworCisvLyBUcmFpbGluZ09iamVjdHNJbXBsIGlzIHNvbWV3aGF0IGNvbXBsaWNhdGVkLCBiZWNhdXNlIGl0IGlzIGEKKy8vIHJlY3Vyc2l2ZWx5IGluaGVyaXRpbmcgdGVtcGxhdGUsIGluIG9yZGVyIHRvIGhhbmRsZSB0aGUgdGVtcGxhdGUKKy8vIHZhcmFyZ3MuIEVhY2ggbGV2ZWwgb2YgaW5oZXJpdGFuY2UgcGlja3Mgb2ZmIGEgc2luZ2xlIHRyYWlsaW5nIHR5cGUKKy8vIHRoZW4gcmVjdXJzZXMgb24gdGhlIHJlc3QuIFRoZSAiQWxpZ24iLCAiQmFzZVR5IiwgYW5kCisvLyAiVG9wVHJhaWxpbmdPYmoiIGFyZ3VtZW50cyBhcmUgcGFzc2VkIHRocm91Z2ggdW5jaGFuZ2VkIHRocm91Z2ggdGhlCisvLyByZWN1cnNpb24uICJQcmV2VHkiIGlzLCBhdCBlYWNoIGxldmVsLCB0aGUgdHlwZSBoYW5kbGVkIGJ5IHRoZQorLy8gbGV2ZWwgcmlnaHQgYWJvdmUgaXQuCisKK3RlbXBsYXRlIDxpbnQgQWxpZ24sIHR5cGVuYW1lIEJhc2VUeSwgdHlwZW5hbWUgVG9wVHJhaWxpbmdPYmosIHR5cGVuYW1lIFByZXZUeSwKKyAgICAgICAgICB0eXBlbmFtZS4uLiBNb3JlVHlzPgorY2xhc3MgVHJhaWxpbmdPYmplY3RzSW1wbCB7CisgIC8vIFRoZSBtYWluIHRlbXBsYXRlIGRlZmluaXRpb24gaXMgbmV2ZXIgdXNlZCAtLSB0aGUgdHdvCisgIC8vIHNwZWNpYWxpemF0aW9ucyBjb3ZlciBhbGwgcG9zc2liaWxpdGllcy4KK307CisKK3RlbXBsYXRlIDxpbnQgQWxpZ24sIHR5cGVuYW1lIEJhc2VUeSwgdHlwZW5hbWUgVG9wVHJhaWxpbmdPYmosIHR5cGVuYW1lIFByZXZUeSwKKyAgICAgICAgICB0eXBlbmFtZSBOZXh0VHksIHR5cGVuYW1lLi4uIE1vcmVUeXM+CitjbGFzcyBUcmFpbGluZ09iamVjdHNJbXBsPEFsaWduLCBCYXNlVHksIFRvcFRyYWlsaW5nT2JqLCBQcmV2VHksIE5leHRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTW9yZVR5cy4uLj4KKyAgICA6IHB1YmxpYyBUcmFpbGluZ09iamVjdHNJbXBsPEFsaWduLCBCYXNlVHksIFRvcFRyYWlsaW5nT2JqLCBOZXh0VHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNb3JlVHlzLi4uPiB7CisKKyAgdHlwZWRlZiBUcmFpbGluZ09iamVjdHNJbXBsPEFsaWduLCBCYXNlVHksIFRvcFRyYWlsaW5nT2JqLCBOZXh0VHksIE1vcmVUeXMuLi4+CisgICAgICBQYXJlbnRUeXBlOworCisgIHN0cnVjdCBSZXF1aXJlc1JlYWxpZ25tZW50IHsKKyAgICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IGFsaWdub2YoUHJldlR5KSA8IGFsaWdub2YoTmV4dFR5KTsKKyAgfTsKKworICBzdGF0aWMgY29uc3RleHByIGJvb2wgcmVxdWlyZXNSZWFsaWdubWVudCgpIHsKKyAgICByZXR1cm4gUmVxdWlyZXNSZWFsaWdubWVudDo6dmFsdWU7CisgIH0KKworcHJvdGVjdGVkOgorICAvLyBFbnN1cmUgdGhlIGluaGVyaXRlZCBnZXRUcmFpbGluZ09iamVjdHNJbXBsIGlzIG5vdCBoaWRkZW4uCisgIHVzaW5nIFBhcmVudFR5cGU6OmdldFRyYWlsaW5nT2JqZWN0c0ltcGw7CisKKyAgLy8gVGhlc2UgdHdvIGZ1bmN0aW9ucyBhcmUgaGVscGVyIGZ1bmN0aW9ucyBmb3IKKyAgLy8gVHJhaWxpbmdPYmplY3RzOjpnZXRUcmFpbGluZ09iamVjdHMuIFRoZXkgcmVjdXJzZSB0byB0aGUgbGVmdCAtLQorICAvLyB0aGUgcmVzdWx0IGZvciBlYWNoIHR5cGUgaW4gdGhlIGxpc3Qgb2YgdHJhaWxpbmcgdHlwZXMgZGVwZW5kcyBvbgorICAvLyB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgdGhlIGZ1bmN0aW9uIG9uIHRoZSB0eXBlIHRvIHRoZQorICAvLyBsZWZ0LiBIb3dldmVyLCB0aGUgZnVuY3Rpb24gZm9yIHRoZSB0eXBlIHRvIHRoZSBsZWZ0IGlzCisgIC8vIGltcGxlbWVudGVkIGJ5IGEgKnN1YmNsYXNzKiBvZiB0aGlzIGNsYXNzLCBzbyB3ZSBpbnZva2UgaXQgdmlhCisgIC8vIHRoZSBUb3BUcmFpbGluZ09iaiwgd2hpY2ggaXMsIHZpYSB0aGUKKyAgLy8gY3VyaW91c2x5LXJlY3VycmluZy10ZW1wbGF0ZS1wYXR0ZXJuLCB0aGUgbW9zdC1kZXJpdmVkIHR5cGUgaW4KKyAgLy8gdGhpcyByZWN1cnNpb24sIGFuZCB0aHVzLCBjb250YWlucyBhbGwgdGhlIG92ZXJsb2Fkcy4KKyAgc3RhdGljIGNvbnN0IE5leHRUeSAqCisgIGdldFRyYWlsaW5nT2JqZWN0c0ltcGwoY29uc3QgQmFzZVR5ICpPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaWxpbmdPYmplY3RzQmFzZTo6T3ZlcmxvYWRUb2tlbjxOZXh0VHk+KSB7CisgICAgYXV0byAqUHRyID0gVG9wVHJhaWxpbmdPYmo6OmdldFRyYWlsaW5nT2JqZWN0c0ltcGwoCisgICAgICAgICAgICAgICAgICAgIE9iaiwgVHJhaWxpbmdPYmplY3RzQmFzZTo6T3ZlcmxvYWRUb2tlbjxQcmV2VHk+KCkpICsKKyAgICAgICAgICAgICAgICBUb3BUcmFpbGluZ09iajo6Y2FsbE51bVRyYWlsaW5nT2JqZWN0cygKKyAgICAgICAgICAgICAgICAgICAgT2JqLCBUcmFpbGluZ09iamVjdHNCYXNlOjpPdmVybG9hZFRva2VuPFByZXZUeT4oKSk7CisKKyAgICBpZiAocmVxdWlyZXNSZWFsaWdubWVudCgpKQorICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTmV4dFR5ICo+KAorICAgICAgICAgIGxsdm06OmFsaWduQWRkcihQdHIsIGFsaWdub2YoTmV4dFR5KSkpOworICAgIGVsc2UKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IE5leHRUeSAqPihQdHIpOworICB9CisKKyAgc3RhdGljIE5leHRUeSAqCisgIGdldFRyYWlsaW5nT2JqZWN0c0ltcGwoQmFzZVR5ICpPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaWxpbmdPYmplY3RzQmFzZTo6T3ZlcmxvYWRUb2tlbjxOZXh0VHk+KSB7CisgICAgYXV0byAqUHRyID0gVG9wVHJhaWxpbmdPYmo6OmdldFRyYWlsaW5nT2JqZWN0c0ltcGwoCisgICAgICAgICAgICAgICAgICAgIE9iaiwgVHJhaWxpbmdPYmplY3RzQmFzZTo6T3ZlcmxvYWRUb2tlbjxQcmV2VHk+KCkpICsKKyAgICAgICAgICAgICAgICBUb3BUcmFpbGluZ09iajo6Y2FsbE51bVRyYWlsaW5nT2JqZWN0cygKKyAgICAgICAgICAgICAgICAgICAgT2JqLCBUcmFpbGluZ09iamVjdHNCYXNlOjpPdmVybG9hZFRva2VuPFByZXZUeT4oKSk7CisKKyAgICBpZiAocmVxdWlyZXNSZWFsaWdubWVudCgpKQorICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8TmV4dFR5ICo+KGxsdm06OmFsaWduQWRkcihQdHIsIGFsaWdub2YoTmV4dFR5KSkpOworICAgIGVsc2UKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PE5leHRUeSAqPihQdHIpOworICB9CisKKyAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciBUcmFpbGluZ09iamVjdHM6OmFkZGl0aW9uYWxTaXplVG9BbGxvYzogdGhpcworICAvLyBmdW5jdGlvbiByZWN1cnNlcyB0byBzdXBlcmNsYXNzZXMsIGVhY2ggb2Ygd2hpY2ggcmVxdWlyZXMgb25lCisgIC8vIGZld2VyIHNpemVfdCBhcmd1bWVudCwgYW5kIGFkZHMgaXRzIG93biBzaXplLgorICBzdGF0aWMgY29uc3RleHByIHNpemVfdCBhZGRpdGlvbmFsU2l6ZVRvQWxsb2NJbXBsKAorICAgICAgc2l6ZV90IFNpemVTb0Zhciwgc2l6ZV90IENvdW50MSwKKyAgICAgIHR5cGVuYW1lIEV4dHJhY3RTZWNvbmRUeXBlPE1vcmVUeXMsIHNpemVfdD46OnR5cGUuLi4gTW9yZUNvdW50cykgeworICAgIHJldHVybiBQYXJlbnRUeXBlOjphZGRpdGlvbmFsU2l6ZVRvQWxsb2NJbXBsKAorICAgICAgICAocmVxdWlyZXNSZWFsaWdubWVudCgpID8gbGx2bTo6YWxpZ25UbzxhbGlnbm9mKE5leHRUeSk+KFNpemVTb0ZhcikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFNpemVTb0ZhcikgKworICAgICAgICAgICAgc2l6ZW9mKE5leHRUeSkgKiBDb3VudDEsCisgICAgICAgIE1vcmVDb3VudHMuLi4pOworICB9Cit9OworCisvLyBUaGUgYmFzZSBjYXNlIG9mIHRoZSBUcmFpbGluZ09iamVjdHNJbXBsIGluaGVyaXRhbmNlIHJlY3Vyc2lvbiwKKy8vIHdoZW4gdGhlcmUncyBubyBtb3JlIHRyYWlsaW5nIHR5cGVzLgordGVtcGxhdGUgPGludCBBbGlnbiwgdHlwZW5hbWUgQmFzZVR5LCB0eXBlbmFtZSBUb3BUcmFpbGluZ09iaiwgdHlwZW5hbWUgUHJldlR5PgorY2xhc3MgVHJhaWxpbmdPYmplY3RzSW1wbDxBbGlnbiwgQmFzZVR5LCBUb3BUcmFpbGluZ09iaiwgUHJldlR5PgorICAgIDogcHVibGljIFRyYWlsaW5nT2JqZWN0c0FsaWduZXI8QWxpZ24+IHsKK3Byb3RlY3RlZDoKKyAgLy8gVGhpcyBpcyBhIGR1bW15IG1ldGhvZCwgb25seSBoZXJlIHNvIHRoZSAidXNpbmciIGRvZXNuJ3QgZmFpbCAtLQorICAvLyBpdCB3aWxsIG5ldmVyIGJlIGNhbGxlZCwgYmVjYXVzZSB0aGlzIGZ1bmN0aW9uIHJlY3Vyc2VzIGJhY2t3YXJkcworICAvLyB1cCB0aGUgaW5oZXJpdGFuY2UgY2hhaW4gdG8gc3ViY2xhc3Nlcy4KKyAgc3RhdGljIHZvaWQgZ2V0VHJhaWxpbmdPYmplY3RzSW1wbCgpOworCisgIHN0YXRpYyBjb25zdGV4cHIgc2l6ZV90IGFkZGl0aW9uYWxTaXplVG9BbGxvY0ltcGwoc2l6ZV90IFNpemVTb0ZhcikgeworICAgIHJldHVybiBTaXplU29GYXI7CisgIH0KKworICB0ZW1wbGF0ZSA8Ym9vbCBDaGVja0FsaWdubWVudD4gc3RhdGljIHZvaWQgdmVyaWZ5VHJhaWxpbmdPYmplY3RzQWxpZ25tZW50KCkge30KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSB0cmFpbGluZ19vYmplY3RzX2ludGVybmFsCisKKy8vIEZpbmFsbHksIHRoZSBtYWluIHR5cGUgZGVmaW5lZCBpbiB0aGlzIGZpbGUsIHRoZSBvbmUgaW50ZW5kZWQgZm9yIHVzZXJzLi4uCisKKy8vLyBTZWUgdGhlIGZpbGUgY29tbWVudCBmb3IgZGV0YWlscyBvbiB0aGUgdXNhZ2Ugb2YgdGhlCisvLy8gVHJhaWxpbmdPYmplY3RzIHR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQmFzZVR5LCB0eXBlbmFtZS4uLiBUcmFpbGluZ1R5cz4KK2NsYXNzIFRyYWlsaW5nT2JqZWN0cyA6IHByaXZhdGUgdHJhaWxpbmdfb2JqZWN0c19pbnRlcm5hbDo6VHJhaWxpbmdPYmplY3RzSW1wbDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpbGluZ19vYmplY3RzX2ludGVybmFsOjpBbGlnbm1lbnRDYWxjSGVscGVyPAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFpbGluZ1R5cy4uLj46OkFsaWdubWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlVHksIFRyYWlsaW5nT2JqZWN0czxCYXNlVHksIFRyYWlsaW5nVHlzLi4uPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNlVHksIFRyYWlsaW5nVHlzLi4uPiB7CisKKyAgdGVtcGxhdGUgPGludCBBLCB0eXBlbmFtZSBCLCB0eXBlbmFtZSBULCB0eXBlbmFtZSBQLCB0eXBlbmFtZS4uLiBNPgorICBmcmllbmQgY2xhc3MgdHJhaWxpbmdfb2JqZWN0c19pbnRlcm5hbDo6VHJhaWxpbmdPYmplY3RzSW1wbDsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVHlzPiBjbGFzcyBGb28ge307CisKKyAgdHlwZWRlZiB0cmFpbGluZ19vYmplY3RzX2ludGVybmFsOjpUcmFpbGluZ09iamVjdHNJbXBsPAorICAgICAgdHJhaWxpbmdfb2JqZWN0c19pbnRlcm5hbDo6QWxpZ25tZW50Q2FsY0hlbHBlcjxUcmFpbGluZ1R5cy4uLj46OkFsaWdubWVudCwKKyAgICAgIEJhc2VUeSwgVHJhaWxpbmdPYmplY3RzPEJhc2VUeSwgVHJhaWxpbmdUeXMuLi4+LCBCYXNlVHksIFRyYWlsaW5nVHlzLi4uPgorICAgICAgUGFyZW50VHlwZTsKKyAgdXNpbmcgVHJhaWxpbmdPYmplY3RzQmFzZSA9IHRyYWlsaW5nX29iamVjdHNfaW50ZXJuYWw6OlRyYWlsaW5nT2JqZWN0c0Jhc2U7CisKKyAgdXNpbmcgUGFyZW50VHlwZTo6Z2V0VHJhaWxpbmdPYmplY3RzSW1wbDsKKworICAvLyBUaGlzIGZ1bmN0aW9uIGNvbnRhaW5zIG9ubHkgYSBzdGF0aWNfYXNzZXJ0IEJhc2VUeSBpcyBmaW5hbC4gVGhlCisgIC8vIHN0YXRpY19hc3NlcnQgbXVzdCBiZSBpbiBhIGZ1bmN0aW9uLCBhbmQgbm90IGF0IGNsYXNzLWxldmVsCisgIC8vIGJlY2F1c2UgQmFzZVR5IGlzbid0IGNvbXBsZXRlIGF0IGNsYXNzIGluc3RhbnRpYXRpb24gdGltZSwgYnV0CisgIC8vIHdpbGwgYmUgYnkgdGhlIHRpbWUgdGhpcyBmdW5jdGlvbiBpcyBpbnN0YW50aWF0ZWQuCisgIHN0YXRpYyB2b2lkIHZlcmlmeVRyYWlsaW5nT2JqZWN0c0Fzc2VydGlvbnMoKSB7CisjaWZkZWYgTExWTV9JU19GSU5BTAorICAgIHN0YXRpY19hc3NlcnQoTExWTV9JU19GSU5BTChCYXNlVHkpLCAiQmFzZVR5IG11c3QgYmUgZmluYWwuIik7CisjZW5kaWYKKyAgfQorCisgIC8vIFRoZXNlIHR3byBtZXRob2RzIGFyZSB0aGUgYmFzZSBvZiB0aGUgcmVjdXJzaW9uIGZvciB0aGlzIG1ldGhvZC4KKyAgc3RhdGljIGNvbnN0IEJhc2VUeSAqCisgIGdldFRyYWlsaW5nT2JqZWN0c0ltcGwoY29uc3QgQmFzZVR5ICpPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgVHJhaWxpbmdPYmplY3RzQmFzZTo6T3ZlcmxvYWRUb2tlbjxCYXNlVHk+KSB7CisgICAgcmV0dXJuIE9iajsKKyAgfQorCisgIHN0YXRpYyBCYXNlVHkgKgorICBnZXRUcmFpbGluZ09iamVjdHNJbXBsKEJhc2VUeSAqT2JqLAorICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWlsaW5nT2JqZWN0c0Jhc2U6Ok92ZXJsb2FkVG9rZW48QmFzZVR5PikgeworICAgIHJldHVybiBPYmo7CisgIH0KKworICAvLyBjYWxsTnVtVHJhaWxpbmdPYmplY3RzIHNpbXBseSBjYWxscyBudW1UcmFpbGluZ09iamVjdHMgb24gdGhlCisgIC8vIHByb3ZpZGVkIE9iaiAtLSBleGNlcHQgd2hlbiB0aGUgdHlwZSBiZWluZyBxdWVyaWVkIGlzIEJhc2VUeQorICAvLyBpdHNlbGYuIFRoZXJlIGlzIGFsd2F5cyBvbmx5IG9uZSBvZiB0aGUgYmFzZSBvYmplY3QsIHNvIHRoYXQgY2FzZQorICAvLyBpcyBoYW5kbGVkIGhlcmUuIChBbiBhZGRpdGlvbmFsIGJlbmVmaXQgb2YgaW5kaXJlY3RpbmcgdGhyb3VnaAorICAvLyB0aGlzIGZ1bmN0aW9uIGlzIHRoYXQgY29uc3VtZXJzIG9ubHkgc2F5ICJmcmllbmQKKyAgLy8gVHJhaWxpbmdPYmplY3RzIiwgYW5kIHRodXMsIG9ubHkgdGhpcyBjbGFzcyBpdHNlbGYgY2FuIGNhbGwgdGhlCisgIC8vIG51bVRyYWlsaW5nT2JqZWN0cyBmdW5jdGlvbi4pCisgIHN0YXRpYyBzaXplX3QKKyAgY2FsbE51bVRyYWlsaW5nT2JqZWN0cyhjb25zdCBCYXNlVHkgKk9iaiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBUcmFpbGluZ09iamVjdHNCYXNlOjpPdmVybG9hZFRva2VuPEJhc2VUeT4pIHsKKyAgICByZXR1cm4gMTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgc2l6ZV90IGNhbGxOdW1UcmFpbGluZ09iamVjdHMoY29uc3QgQmFzZVR5ICpPYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFpbGluZ09iamVjdHNCYXNlOjpPdmVybG9hZFRva2VuPFQ+KSB7CisgICAgcmV0dXJuIE9iai0+bnVtVHJhaWxpbmdPYmplY3RzKFRyYWlsaW5nT2JqZWN0c0Jhc2U6Ok92ZXJsb2FkVG9rZW48VD4oKSk7CisgIH0KKworcHVibGljOgorICAvLyBNYWtlIHRoaXMgKHByaXZhdGVseSBpbmhlcml0ZWQpIG1lbWJlciBwdWJsaWMuCisjaWZuZGVmIF9NU0NfVkVSCisgIHVzaW5nIFBhcmVudFR5cGU6Ok92ZXJsb2FkVG9rZW47CisjZWxzZQorICAvLyBNU1ZDIGJ1ZyBwcmV2ZW50cyB0aGUgYWJvdmUgZnJvbSB3b3JraW5nLCBhdCBsZWFzdCB1cCB0aHJvdWdoIENMCisgIC8vIDE5LjEwLjI0NjI5LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdXNpbmcgT3ZlcmxvYWRUb2tlbiA9IHR5cGVuYW1lIFBhcmVudFR5cGU6OnRlbXBsYXRlIE92ZXJsb2FkVG9rZW48VD47CisjZW5kaWYKKworICAvLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHRyYWlsaW5nIG9iamVjdCBhcnJheSBvZiB0aGUgZ2l2ZW4gdHlwZQorICAvLy8gKHdoaWNoIG11c3QgYmUgb25lIG9mIHRob3NlIHNwZWNpZmllZCBpbiB0aGUgY2xhc3MgdGVtcGxhdGUpLiBUaGUKKyAgLy8vIGFycmF5IG1heSBoYXZlIHplcm8gb3IgbW9yZSBlbGVtZW50cyBpbiBpdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNvbnN0IFQgKmdldFRyYWlsaW5nT2JqZWN0cygpIGNvbnN0IHsKKyAgICB2ZXJpZnlUcmFpbGluZ09iamVjdHNBc3NlcnRpb25zKCk7CisgICAgLy8gRm9yd2FyZHMgdG8gYW4gaW1wbCBmdW5jdGlvbiB3aXRoIG92ZXJsb2Fkcywgc2luY2UgbWVtYmVyCisgICAgLy8gZnVuY3Rpb24gdGVtcGxhdGVzIGNhbid0IGJlIHNwZWNpYWxpemVkLgorICAgIHJldHVybiB0aGlzLT5nZXRUcmFpbGluZ09iamVjdHNJbXBsKAorICAgICAgICBzdGF0aWNfY2FzdDxjb25zdCBCYXNlVHkgKj4odGhpcyksCisgICAgICAgIFRyYWlsaW5nT2JqZWN0c0Jhc2U6Ok92ZXJsb2FkVG9rZW48VD4oKSk7CisgIH0KKworICAvLy8gUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHRyYWlsaW5nIG9iamVjdCBhcnJheSBvZiB0aGUgZ2l2ZW4gdHlwZQorICAvLy8gKHdoaWNoIG11c3QgYmUgb25lIG9mIHRob3NlIHNwZWNpZmllZCBpbiB0aGUgY2xhc3MgdGVtcGxhdGUpLiBUaGUKKyAgLy8vIGFycmF5IG1heSBoYXZlIHplcm8gb3IgbW9yZSBlbGVtZW50cyBpbiBpdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IFQgKmdldFRyYWlsaW5nT2JqZWN0cygpIHsKKyAgICB2ZXJpZnlUcmFpbGluZ09iamVjdHNBc3NlcnRpb25zKCk7CisgICAgLy8gRm9yd2FyZHMgdG8gYW4gaW1wbCBmdW5jdGlvbiB3aXRoIG92ZXJsb2Fkcywgc2luY2UgbWVtYmVyCisgICAgLy8gZnVuY3Rpb24gdGVtcGxhdGVzIGNhbid0IGJlIHNwZWNpYWxpemVkLgorICAgIHJldHVybiB0aGlzLT5nZXRUcmFpbGluZ09iamVjdHNJbXBsKAorICAgICAgICBzdGF0aWNfY2FzdDxCYXNlVHkgKj4odGhpcyksIFRyYWlsaW5nT2JqZWN0c0Jhc2U6Ok92ZXJsb2FkVG9rZW48VD4oKSk7CisgIH0KKworICAvLy8gUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgdHJhaWxpbmcgZGF0YSwgaWYgYW4gb2JqZWN0IHdlcmUKKyAgLy8vIGFsbG9jYXRlZCB3aXRoIHRoZSBnaXZlbiBjb3VudHMgKFRoZSBjb3VudHMgYXJlIGluIHRoZSBzYW1lIG9yZGVyCisgIC8vLyBhcyB0aGUgdGVtcGxhdGUgYXJndW1lbnRzKS4gVGhpcyBkb2VzIG5vdCBpbmNsdWRlIHRoZSBzaXplIG9mIHRoZQorICAvLy8gYmFzZSBvYmplY3QuICBUaGUgdGVtcGxhdGUgYXJndW1lbnRzIG11c3QgYmUgdGhlIHNhbWUgYXMgdGhvc2UKKyAgLy8vIHVzZWQgaW4gdGhlIGNsYXNzOyB0aGV5IGFyZSBzdXBwbGllZCBoZXJlIHJlZHVuZGFudGx5IG9ubHkgc28KKyAgLy8vIHRoYXQgaXQncyBjbGVhciB3aGF0IHRoZSBjb3VudHMgYXJlIGNvdW50aW5nIGluIGNhbGxlcnMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUeXM+CisgIHN0YXRpYyBjb25zdGV4cHIgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8CisgICAgICBzdGQ6OmlzX3NhbWU8Rm9vPFRyYWlsaW5nVHlzLi4uPiwgRm9vPFR5cy4uLj4+Ojp2YWx1ZSwgc2l6ZV90Pjo6dHlwZQorICBhZGRpdGlvbmFsU2l6ZVRvQWxsb2ModHlwZW5hbWUgdHJhaWxpbmdfb2JqZWN0c19pbnRlcm5hbDo6RXh0cmFjdFNlY29uZFR5cGU8CisgICAgICAgICAgICAgICAgICAgICAgICBUcmFpbGluZ1R5cywgc2l6ZV90Pjo6dHlwZS4uLiBDb3VudHMpIHsKKyAgICByZXR1cm4gUGFyZW50VHlwZTo6YWRkaXRpb25hbFNpemVUb0FsbG9jSW1wbCgwLCBDb3VudHMuLi4pOworICB9CisKKyAgLy8vIFJldHVybnMgdGhlIHRvdGFsIHNpemUgb2YgYW4gb2JqZWN0IGlmIGl0IHdlcmUgYWxsb2NhdGVkIHdpdGggdGhlCisgIC8vLyBnaXZlbiB0cmFpbGluZyBvYmplY3QgY291bnRzLiBUaGlzIGlzIHRoZSBzYW1lIGFzCisgIC8vLyBhZGRpdGlvbmFsU2l6ZVRvQWxsb2MsIGV4Y2VwdCBpdCAqZG9lcyogaW5jbHVkZSB0aGUgc2l6ZSBvZiB0aGUgYmFzZQorICAvLy8gb2JqZWN0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVHlzPgorICBzdGF0aWMgY29uc3RleHByIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPAorICAgICAgc3RkOjppc19zYW1lPEZvbzxUcmFpbGluZ1R5cy4uLj4sIEZvbzxUeXMuLi4+Pjo6dmFsdWUsIHNpemVfdD46OnR5cGUKKyAgdG90YWxTaXplVG9BbGxvYyh0eXBlbmFtZSB0cmFpbGluZ19vYmplY3RzX2ludGVybmFsOjpFeHRyYWN0U2Vjb25kVHlwZTwKKyAgICAgICAgICAgICAgICAgICBUcmFpbGluZ1R5cywgc2l6ZV90Pjo6dHlwZS4uLiBDb3VudHMpIHsKKyAgICByZXR1cm4gc2l6ZW9mKEJhc2VUeSkgKyBQYXJlbnRUeXBlOjphZGRpdGlvbmFsU2l6ZVRvQWxsb2NJbXBsKDAsIENvdW50cy4uLik7CisgIH0KKworICAvLy8gQSB0eXBlIHdoZXJlIGl0cyA6OndpdGhfY291bnRzIHRlbXBsYXRlIG1lbWJlciBoYXMgYSA6OnR5cGUgbWVtYmVyCisgIC8vLyBzdWl0YWJsZSBmb3IgdXNlIGFzIHVuaW5pdGlhbGl6ZWQgc3RvcmFnZSBmb3IgYW4gb2JqZWN0IHdpdGggdGhlIGdpdmVuCisgIC8vLyB0cmFpbGluZyBvYmplY3QgY291bnRzLiBUaGUgdGVtcGxhdGUgYXJndW1lbnRzIGFyZSBzaW1pbGFyIHRvIHRob3NlCisgIC8vLyBvZiBhZGRpdGlvbmFsU2l6ZVRvQWxsb2MuCisgIC8vLworICAvLy8gVXNlIHdpdGggRml4ZWRTaXplU3RvcmFnZU93bmVyLCBlLmcuOgorICAvLy8KKyAgLy8vIFxjb2Rley5jcHB9CisgIC8vLworICAvLy8gTXlPYmo6OkZpeGVkU2l6ZVN0b3JhZ2U8dm9pZCAqPjo6d2l0aF9jb3VudHM8MXU+Ojp0eXBlIG15U3RhY2tPYmpTdG9yYWdlOworICAvLy8gTXlPYmo6OkZpeGVkU2l6ZVN0b3JhZ2VPd25lcgorICAvLy8gICAgIG15U3RhY2tPYmpPd25lcihuZXcgKCh2b2lkICopJm15U3RhY2tPYmpTdG9yYWdlKSBNeU9iaik7CisgIC8vLyBNeU9iaiAqY29uc3QgbXlTdGFja09ialB0ciA9IG15U3RhY2tPYmpPd25lci5nZXQoKTsKKyAgLy8vCisgIC8vLyBcZW5kY29kZQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUuLi4gVHlzPiBzdHJ1Y3QgRml4ZWRTaXplU3RvcmFnZSB7CisgICAgdGVtcGxhdGUgPHNpemVfdC4uLiBDb3VudHM+IHN0cnVjdCB3aXRoX2NvdW50cyB7CisgICAgICBlbnVtIHsgU2l6ZSA9IHRvdGFsU2l6ZVRvQWxsb2M8VHlzLi4uPihDb3VudHMuLi4pIH07CisgICAgICB0eXBlZGVmIGxsdm06OkFsaWduZWRDaGFyQXJyYXk8YWxpZ25vZihCYXNlVHkpLCBTaXplPiB0eXBlOworICAgIH07CisgIH07CisKKyAgLy8vIEEgdHlwZSB0aGF0IGFjdHMgYXMgdGhlIG93bmVyIGZvciBhbiBvYmplY3QgcGxhY2VkIGludG8gZml4ZWQgc3RvcmFnZS4KKyAgY2xhc3MgRml4ZWRTaXplU3RvcmFnZU93bmVyIHsKKyAgcHVibGljOgorICAgIEZpeGVkU2l6ZVN0b3JhZ2VPd25lcihCYXNlVHkgKnApIDogcChwKSB7fQorICAgIH5GaXhlZFNpemVTdG9yYWdlT3duZXIoKSB7CisgICAgICBhc3NlcnQocCAmJiAiRml4ZWRTaXplU3RvcmFnZU93bmVyIG93bnMgbnVsbD8iKTsKKyAgICAgIHAtPn5CYXNlVHkoKTsKKyAgICB9CisKKyAgICBCYXNlVHkgKmdldCgpIHsgcmV0dXJuIHA7IH0KKyAgICBjb25zdCBCYXNlVHkgKmdldCgpIGNvbnN0IHsgcmV0dXJuIHA7IH0KKworICBwcml2YXRlOgorICAgIEZpeGVkU2l6ZVN0b3JhZ2VPd25lcihjb25zdCBGaXhlZFNpemVTdG9yYWdlT3duZXIgJikgPSBkZWxldGU7CisgICAgRml4ZWRTaXplU3RvcmFnZU93bmVyKEZpeGVkU2l6ZVN0b3JhZ2VPd25lciAmJikgPSBkZWxldGU7CisgICAgRml4ZWRTaXplU3RvcmFnZU93bmVyICZvcGVyYXRvcj0oY29uc3QgRml4ZWRTaXplU3RvcmFnZU93bmVyICYpID0gZGVsZXRlOworICAgIEZpeGVkU2l6ZVN0b3JhZ2VPd25lciAmb3BlcmF0b3I9KEZpeGVkU2l6ZVN0b3JhZ2VPd25lciAmJikgPSBkZWxldGU7CisKKyAgICBCYXNlVHkgKmNvbnN0IHA7CisgIH07Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UcmlncmFtSW5kZXguaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UcmlncmFtSW5kZXguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYTBiNmRhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1RyaWdyYW1JbmRleC5oCkBAIC0wLDAgKzEsNzAgQEAKKy8vPT09LS0gVHJpZ3JhbUluZGV4LmggLSBhIGhldXJpc3RpYyBmb3IgU3BlY2lhbENhc2VMaXN0IC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUcmlncmFtSW5kZXggaW1wbGVtZW50cyBhIGhldXJpc3RpYyBmb3IgU3BlY2lhbENhc2VMaXN0IHRoYXQgYWxsb3dzIHRvCisvLyBmaWx0ZXIgb3V0IH45OSUgaW5jb21pbmcgcXVlcmllcyB3aGVuIGFsbCByZWd1bGFyIGV4cHJlc3Npb25zIGluIHRoZQorLy8gU3BlY2lhbENhc2VMaXN0IGFyZSBzaW1wbGUgd2lsZGNhcmRzIHdpdGggJyonIGFuZCAnLicuIElmIHJ1bGVzIGFyZSBtb3JlCisvLyBjb21wbGljYXRlZCwgdGhlIGNoZWNrIGlzIGRlZmVhdGVkIGFuZCBpdCB3aWxsIGFsd2F5cyBwYXNzIHRoZSBxdWVyaWVzIHRvIGEKKy8vIGZ1bGwgcmVnZXguCisvLworLy8gVGhlIGJhc2ljIGlkZWEgaXMgdGhhdCBpbiBvcmRlciBmb3IgYSB3aWxkY2FyZCB0byBtYXRjaCBhIHF1ZXJ5LCB0aGUgcXVlcnkKKy8vIG5lZWRzIHRvIGhhdmUgYWxsIHRyaWdyYW1zIHdoaWNoIG9jY3VyIGluIHRoZSB3aWxkY2FyZC4gV2UgY3JlYXRlIGEgdHJpZ3JhbQorLy8gaW5kZXggKHRyaWdyYW0gLT4gbGlzdCBvZiBydWxlcyB3aXRoIGl0KSBhbmQgdGhlbiBjb3VudCB0cmlncmFtcyBpbiB0aGUgcXVlcnkKKy8vIGZvciBlYWNoIHJ1bGUuIElmIHRoZSBjb3VudCBmb3Igb25lIG9mIHRoZSBydWxlcyByZWFjaGVzIHRoZSBleHBlY3RlZCB2YWx1ZSwKKy8vIHRoZSBjaGVjayBwYXNzZXMgdGhlIHF1ZXJ5IHRvIGEgcmVnZXguIElmIG5vbmUgb2YgdGhlIHJ1bGVzIGdvdCBlbm91Z2gKKy8vIHRyaWdyYW1zLCB0aGUgY2hlY2sgdGVsbHMgdGhhdCB0aGUgcXVlcnkgaXMgZGVmaW5pdGVseSBub3QgbWF0Y2hlZCBieSBhbnkKKy8vIG9mIHRoZSBydWxlcywgYW5kIG5vIHJlZ2V4IG1hdGNoaW5nIGlzIG5lZWRlZC4KKy8vIEEgc2ltaWxhciBpZGVhIHdhcyB1c2VkIGluIEdvb2dsZSBDb2RlIFNlYXJjaCBhcyBkZXNjcmliZWQgaW4gdGhlIGJsb2cgcG9zdDoKKy8vIGh0dHBzOi8vc3d0Y2guY29tL35yc2MvcmVnZXhwL3JlZ2V4cDQuaHRtbAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1RSSUdSQU1JTkRFWF9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9UUklHUkFNSU5ERVhfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgU3RyaW5nUmVmOworCitjbGFzcyBUcmlncmFtSW5kZXggeworIHB1YmxpYzoKKyAgLy8vIEluc2VydHMgYSBuZXcgUmVnZXggaW50byB0aGUgaW5kZXguCisgIHZvaWQgaW5zZXJ0KHN0ZDo6c3RyaW5nIFJlZ2V4KTsKKworICAvLy8gUmV0dXJucyB0cnVlLCBpZiBzcGVjaWFsIGNhc2UgbGlzdCBkZWZpbml0ZWx5IGRvZXMgbm90IGhhdmUgYSBsaW5lCisgIC8vLyB0aGF0IG1hdGNoZXMgdGhlIHF1ZXJ5LiBSZXR1cm5zIGZhbHNlLCBpZiBpdCdzIG5vdCBzdXJlLgorICBib29sIGlzRGVmaW5pdGVseU91dChTdHJpbmdSZWYgUXVlcnkpIGNvbnN0OworCisgIC8vLyBSZXR1cm5lZCB0cnVlLCBpZmYgdGhlIGhldXJpc3RpYyBpcyBkZWZlYXRlZCBhbmQgbm90IHVzZWZ1bC4KKyAgLy8vIEluIHRoaXMgY2FzZSBpc0RlZmluaXRlbHlPdXQgYWx3YXlzIHJldHVybnMgZmFsc2UuCisgIGJvb2wgaXNEZWZlYXRlZCgpIHsgcmV0dXJuIERlZmVhdGVkOyB9CisgcHJpdmF0ZToKKyAgLy8gSWYgdHJ1ZSwgdGhlIHJ1bGVzIGFyZSB0b28gY29tcGxpY2F0ZWQgZm9yIHRoZSBjaGVjayB0byB3b3JrLCBhbmQgZnVsbAorICAvLyByZWdleCBtYXRjaGluZyBpcyBuZWVkZWQgZm9yIGV2ZXJ5IHJ1bGUuCisgIGJvb2wgRGVmZWF0ZWQgPSBmYWxzZTsKKyAgLy8gVGhlIG1pbmltdW0gbnVtYmVyIG9mIHRyaWdyYW1zIHdoaWNoIHNob3VsZCBtYXRjaCBmb3IgYSBydWxlIHRvIGhhdmUgYQorICAvLyBjaGFuY2UgdG8gbWF0Y2ggdGhlIHF1ZXJ5LiBUaGUgbnVtYmVyIG9mIGVsZW1lbnRzIGVxdWFscyB0aGUgbnVtYmVyIG9mCisgIC8vIHJlZ2V4IHJ1bGVzIGluIHRoZSBTcGVjaWFsQ2FzZUxpc3QuCisgIHN0ZDo6dmVjdG9yPHVuc2lnbmVkPiBDb3VudHM7CisgIC8vIEluZGV4IGhvbGRzIGEgbGlzdCBvZiBydWxlcyBpbmRpY2VzIGZvciBlYWNoIHRyaWdyYW0uIFRoZSBzYW1lIGluZGljZXMKKyAgLy8gYXJlIHVzZWQgaW4gQ291bnRzIHRvIHN0b3JlIHBlci1ydWxlIGxpbWl0cy4KKyAgLy8gSWYgYSB0cmlncmFtIGlzIHRvbyBjb21tb24gKD40IHJ1bGVzIHdpdGggaXQpLCB3ZSBzdG9wIHRyYWNraW5nIGl0LAorICAvLyB3aGljaCBpbmNyZWFzZXMgdGhlIHByb2JhYmlsaXR5IGZvciBhIG5lZWQgdG8gbWF0Y2ggdXNpbmcgcmVnZXgsIGJ1dAorICAvLyBkZWNyZWFzZXMgdGhlIGNvc3RzIGluIHRoZSByZWd1bGFyIGNhc2UuCisgIHN0ZDo6dW5vcmRlcmVkX21hcDx1bnNpZ25lZCwgU21hbGxWZWN0b3I8c2l6ZV90LCA0Pj4gSW5kZXh7MjU2fTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAgLy8gTExWTV9TVVBQT1JUX1RSSUdSQU1JTkRFWF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVHlwZU5hbWUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9UeXBlTmFtZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYjdlYWQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVHlwZU5hbWUuaApAQCAtMCwwICsxLDY1IEBACisvLz09PS0gVHlwZU5hbWUuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9UWVBFTkFNRV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9UWVBFTkFNRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gV2UgcHJvdmlkZSBhIGZ1bmN0aW9uIHdoaWNoIHRyaWVzIHRvIGNvbXB1dGUgdGhlIChkZW1hbmdsZWQpIG5hbWUgb2YgYSB0eXBlCisvLy8gc3RhdGljYWxseS4KKy8vLworLy8vIFRoaXMgcm91dGluZSBtYXkgZmFpbCBvbiBzb21lIHBsYXRmb3JtcyBvciBmb3IgcGFydGljdWxhcmx5IHVudXN1YWwgdHlwZXMuCisvLy8gRG8gbm90IHVzZSBpdCBmb3IgYW55dGhpbmcgb3RoZXIgdGhhbiBsb2dnaW5nIGFuZCBkZWJ1Z2dpbmcgYWlkcy4gSXQgaXNuJ3QKKy8vLyBwb3J0YWJsZSBvciBkZXBlbmRlbmRhYmxlIGluIGFueSByZWFsIHNlbnNlLgorLy8vCisvLy8gVGhlIHJldHVybmVkIFN0cmluZ1JlZiB3aWxsIHBvaW50IGludG8gYSBzdGF0aWMgc3RvcmFnZSBkdXJhdGlvbiBzdHJpbmcuCisvLy8gSG93ZXZlciwgaXQgbWF5IG5vdCBiZSBudWxsIHRlcm1pbmF0ZWQgYW5kIG1heSBiZSBzb21lIHN0cmFuZ2VseSBhbGlnbmVkCisvLy8gaW5uZXIgc3Vic3RyaW5nIG9mIGEgbGFyZ2VyIHN0cmluZy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBEZXNpcmVkVHlwZU5hbWU+CitpbmxpbmUgU3RyaW5nUmVmIGdldFR5cGVOYW1lKCkgeworI2lmIGRlZmluZWQoX19jbGFuZ19fKSB8fCBkZWZpbmVkKF9fR05VQ19fKQorICBTdHJpbmdSZWYgTmFtZSA9IF9fUFJFVFRZX0ZVTkNUSU9OX187CisKKyAgU3RyaW5nUmVmIEtleSA9ICJEZXNpcmVkVHlwZU5hbWUgPSAiOworICBOYW1lID0gTmFtZS5zdWJzdHIoTmFtZS5maW5kKEtleSkpOworICBhc3NlcnQoIU5hbWUuZW1wdHkoKSAmJiAiVW5hYmxlIHRvIGZpbmQgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciEiKTsKKyAgTmFtZSA9IE5hbWUuZHJvcF9mcm9udChLZXkuc2l6ZSgpKTsKKworICBhc3NlcnQoTmFtZS5lbmRzd2l0aCgiXSIpICYmICJOYW1lIGRvZXNuJ3QgZW5kIGluIHRoZSBzdWJzdGl0dXRpb24ga2V5ISIpOworICByZXR1cm4gTmFtZS5kcm9wX2JhY2soMSk7CisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorICBTdHJpbmdSZWYgTmFtZSA9IF9fRlVOQ1NJR19fOworCisgIFN0cmluZ1JlZiBLZXkgPSAiZ2V0VHlwZU5hbWU8IjsKKyAgTmFtZSA9IE5hbWUuc3Vic3RyKE5hbWUuZmluZChLZXkpKTsKKyAgYXNzZXJ0KCFOYW1lLmVtcHR5KCkgJiYgIlVuYWJsZSB0byBmaW5kIHRoZSBmdW5jdGlvbiBuYW1lISIpOworICBOYW1lID0gTmFtZS5kcm9wX2Zyb250KEtleS5zaXplKCkpOworCisgIGZvciAoU3RyaW5nUmVmIFByZWZpeCA6IHsiY2xhc3MgIiwgInN0cnVjdCAiLCAidW5pb24gIiwgImVudW0gIn0pCisgICAgaWYgKE5hbWUuc3RhcnRzd2l0aChQcmVmaXgpKSB7CisgICAgICBOYW1lID0gTmFtZS5kcm9wX2Zyb250KFByZWZpeC5zaXplKCkpOworICAgICAgYnJlYWs7CisgICAgfQorCisgIGF1dG8gQW5nbGVQb3MgPSBOYW1lLnJmaW5kKCc+Jyk7CisgIGFzc2VydChBbmdsZVBvcyAhPSBTdHJpbmdSZWY6Om5wb3MgJiYgIlVuYWJsZSB0byBmaW5kIHRoZSBjbG9zaW5nICc+JyEiKTsKKyAgcmV0dXJuIE5hbWUuc3Vic3RyKDAsIEFuZ2xlUG9zKTsKKyNlbHNlCisgIC8vIE5vIGtub3duIHRlY2huaXF1ZSBmb3Igc3RhdGljYWxseSBleHRyYWN0aW5nIGEgdHlwZSBuYW1lIG9uIHRoaXMgY29tcGlsZXIuCisgIC8vIFdlIHJldHVybiBhIHN0cmluZyB0aGF0IGlzIHVubGlrZWx5IHRvIGxvb2sgbGlrZSBhbnkgdHlwZSBpbiBMTFZNLgorICByZXR1cm4gIlVOS05PV05fVFlQRSI7CisjZW5kaWYKK30KKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Vbmljb2RlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVW5pY29kZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNTQ4NGYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVW5pY29kZS5oCkBAIC0wLDAgKzEsNzEgQEAKKy8vPT09LSBsbHZtL1N1cHBvcnQvVW5pY29kZS5oIC0gVW5pY29kZSBjaGFyYWN0ZXIgcHJvcGVydGllcyAgLSotIEMrKyAtKi09PT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgZnVuY3Rpb25zIHRoYXQgYWxsb3cgcXVlcnlpbmcgY2VydGFpbiBwcm9wZXJ0aWVzIG9mIFVuaWNvZGUKKy8vIGNoYXJhY3RlcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfVU5JQ09ERV9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9VTklDT0RFX0gKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgU3RyaW5nUmVmOworCituYW1lc3BhY2Ugc3lzIHsKK25hbWVzcGFjZSB1bmljb2RlIHsKKworZW51bSBDb2x1bW5XaWR0aEVycm9ycyB7CisgIEVycm9ySW52YWxpZFVURjggPSAtMiwKKyAgRXJyb3JOb25QcmludGFibGVDaGFyYWN0ZXIgPSAtMQorfTsKKworLy8vIERldGVybWluZXMgaWYgYSBjaGFyYWN0ZXIgaXMgbGlrZWx5IHRvIGJlIGRpc3BsYXllZCBjb3JyZWN0bHkgb24gdGhlCisvLy8gdGVybWluYWwuIEV4YWN0IGltcGxlbWVudGF0aW9uIHdvdWxkIGhhdmUgdG8gZGVwZW5kIG9uIHRoZSBzcGVjaWZpYworLy8vIHRlcm1pbmFsLCBzbyB3ZSBkZWZpbmUgdGhlIHNlbWFudGljIHRoYXQgc2hvdWxkIGJlIHN1aXRhYmxlIGZvciBnZW5lcmljIGNhc2UKKy8vLyBvZiBhIHRlcm1pbmFsIGNhcGFibGUgdG8gb3V0cHV0IFVuaWNvZGUgY2hhcmFjdGVycy4KKy8vLworLy8vIEFsbCBjaGFyYWN0ZXJzIGZyb20gdGhlIFVuaWNvZGUgY29kZSBwb2ludCByYW5nZSBhcmUgY29uc2lkZXJlZCBwcmludGFibGUKKy8vLyBleGNlcHQgZm9yOgorLy8vICAgKiBDMCBhbmQgQzEgY29udHJvbCBjaGFyYWN0ZXIgcmFuZ2VzOworLy8vICAgKiBkZWZhdWx0IGlnbm9yYWJsZSBjb2RlIHBvaW50cyBhcyBwZXIgNS4yMSBvZgorLy8vICAgICBodHRwOi8vd3d3LnVuaWNvZGUub3JnL3ZlcnNpb25zL1VuaWNvZGU2LjIuMC9Vbmljb2RlU3RhbmRhcmQtNi4yLnBkZgorLy8vICAgICBleGNlcHQgZm9yIFUrMDBBRCBTT0ZUIEhZUEhFTiwgYXMgaXQncyBhY3R1YWxseSBkaXNwbGF5ZWQgb24gbW9zdAorLy8vICAgICB0ZXJtaW5hbHM7CisvLy8gICAqIGZvcm1hdCBjaGFyYWN0ZXJzIChjYXRlZ29yeSA9IENmKTsKKy8vLyAgICogc3Vycm9nYXRlcyAoY2F0ZWdvcnkgPSBDcyk7CisvLy8gICAqIHVuYXNzaWduZWQgY2hhcmFjdGVycyAoY2F0ZWdvcnkgPSBDbikuCisvLy8gXHJldHVybiB0cnVlIGlmIHRoZSBjaGFyYWN0ZXIgaXMgY29uc2lkZXJlZCBwcmludGFibGUuCitib29sIGlzUHJpbnRhYmxlKGludCBVQ1MpOworCisvLy8gR2V0cyB0aGUgbnVtYmVyIG9mIHBvc2l0aW9ucyB0aGUgVVRGOC1lbmNvZGVkIFxwIFRleHQgaXMgbGlrZWx5IHRvIG9jY3VweQorLy8vIHdoZW4gb3V0cHV0IG9uIGEgdGVybWluYWwgKCJjaGFyYWN0ZXIgd2lkdGgiKS4gVGhpcyBkZXBlbmRzIG9uIHRoZQorLy8vIGltcGxlbWVudGF0aW9uIG9mIHRoZSB0ZXJtaW5hbCwgYW5kIHRoZXJlJ3Mgbm8gc3RhbmRhcmQgZGVmaW5pdGlvbiBvZgorLy8vIGNoYXJhY3RlciB3aWR0aC4KKy8vLworLy8vIFRoZSBpbXBsZW1lbnRhdGlvbiBkZWZpbmVzIGl0IGluIGEgd2F5IHRoYXQgaXMgZXhwZWN0ZWQgdG8gYmUgY29tcGF0aWJsZQorLy8vIHdpdGggYSBnZW5lcmljIFVuaWNvZGUtY2FwYWJsZSB0ZXJtaW5hbC4KKy8vLworLy8vIFxyZXR1cm4gQ2hhcmFjdGVyIHdpZHRoOgorLy8vICAgKiBFcnJvck5vblByaW50YWJsZUNoYXJhY3RlciAoLTEpIGlmIFxwIFRleHQgY29udGFpbnMgbm9uLXByaW50YWJsZQorLy8vICAgICBjaGFyYWN0ZXJzIChhcyBpZGVudGlmaWVkIGJ5IGlzUHJpbnRhYmxlKTsKKy8vLyAgICogMCBmb3IgZWFjaCBub24tc3BhY2luZyBhbmQgZW5jbG9zaW5nIGNvbWJpbmluZyBtYXJrOworLy8vICAgKiAyIGZvciBlYWNoIENKSyBjaGFyYWN0ZXIgZXhjbHVkaW5nIGhhbGZ3aWR0aCBmb3JtczsKKy8vLyAgICogMSBmb3IgZWFjaCBvZiB0aGUgcmVtYWluaW5nIGNoYXJhY3RlcnMuCitpbnQgY29sdW1uV2lkdGhVVEY4KFN0cmluZ1JlZiBUZXh0KTsKKworLy8vIEZvbGQgaW5wdXQgdW5pY29kZSBjaGFyYWN0ZXIgYWNjb3JkaW5nIHRoZSB0aGUgU2ltcGxlIHVuaWNvZGUgY2FzZSBmb2xkaW5nCisvLy8gcnVsZXMuCitpbnQgZm9sZENoYXJTaW1wbGUoaW50IEMpOworCit9IC8vIG5hbWVzcGFjZSB1bmljb2RlCit9IC8vIG5hbWVzcGFjZSBzeXMKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVW5pY29kZUNoYXJSYW5nZXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9Vbmljb2RlQ2hhclJhbmdlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjNjU1ODMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVW5pY29kZUNoYXJSYW5nZXMuaApAQCAtMCwwICsxLDEwNyBAQAorLy89PT0tLS0gVW5pY29kZUNoYXJSYW5nZXMuaCAtIFR5cGVzIGFuZCBmdW5jdGlvbnMgZm9yIGNoYXJhY3RlciByYW5nZXMgLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9TVVBQT1JUX1VOSUNPREVDSEFSUkFOR0VTX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1VOSUNPREVDSEFSUkFOR0VTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTXV0ZXguaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvTXV0ZXhHdWFyZC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKworI2RlZmluZSBERUJVR19UWVBFICJ1bmljb2RlIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2Ugc3lzIHsKKworLy8vIFxicmllZiBSZXByZXNlbnRzIGEgY2xvc2VkIHJhbmdlIG9mIFVuaWNvZGUgY29kZSBwb2ludHMgW0xvd2VyLCBVcHBlcl0uCitzdHJ1Y3QgVW5pY29kZUNoYXJSYW5nZSB7CisgIHVpbnQzMl90IExvd2VyOworICB1aW50MzJfdCBVcHBlcjsKK307CisKK2lubGluZSBib29sIG9wZXJhdG9yPCh1aW50MzJfdCBWYWx1ZSwgVW5pY29kZUNoYXJSYW5nZSBSYW5nZSkgeworICByZXR1cm4gVmFsdWUgPCBSYW5nZS5Mb3dlcjsKK30KK2lubGluZSBib29sIG9wZXJhdG9yPChVbmljb2RlQ2hhclJhbmdlIFJhbmdlLCB1aW50MzJfdCBWYWx1ZSkgeworICByZXR1cm4gUmFuZ2UuVXBwZXIgPCBWYWx1ZTsKK30KKworLy8vIFxicmllZiBIb2xkcyBhIHJlZmVyZW5jZSB0byBhbiBvcmRlcmVkIGFycmF5IG9mIFVuaWNvZGVDaGFyUmFuZ2UgYW5kIGFsbG93cworLy8vIHRvIHF1aWNrbHkgY2hlY2sgaWYgYSBjb2RlIHBvaW50IGlzIGNvbnRhaW5lZCBpbiB0aGUgc2V0IHJlcHJlc2VudGVkIGJ5IHRoaXMKKy8vLyBhcnJheS4KK2NsYXNzIFVuaWNvZGVDaGFyU2V0IHsKK3B1YmxpYzoKKyAgdHlwZWRlZiBBcnJheVJlZjxVbmljb2RlQ2hhclJhbmdlPiBDaGFyUmFuZ2VzOworCisgIC8vLyBcYnJpZWYgQ29uc3RydWN0cyBhIFVuaWNvZGVDaGFyU2V0IGluc3RhbmNlIGZyb20gYW4gYXJyYXkgb2YKKyAgLy8vIFVuaWNvZGVDaGFyUmFuZ2VzLgorICAvLy8KKyAgLy8vIEFycmF5IHBvaW50ZWQgYnkgXHAgUmFuZ2VzIHNob3VsZCBoYXZlIHRoZSBsaWZldGltZSBhdCBsZWFzdCBhcyBsb25nIGFzCisgIC8vLyB0aGUgVW5pY29kZUNoYXJTZXQgaW5zdGFuY2UsIGFuZCBzaG91bGQgbm90IGNoYW5nZS4gQXJyYXkgaXMgdmFsaWRhdGVkIGJ5CisgIC8vLyB0aGUgY29uc3RydWN0b3IsIHNvIGl0IG1ha2VzIHNlbnNlIHRvIGNyZWF0ZSBhcyBmZXcgVW5pY29kZUNoYXJTZXQKKyAgLy8vIGluc3RhbmNlcyBwZXIgZWFjaCBhcnJheSBvZiByYW5nZXMsIGFzIHBvc3NpYmxlLgorI2lmZGVmIE5ERUJVRworCisgIC8vIEZJWE1FOiBUaGlzIGNvdWxkIHVzZSBjb25zdGV4cHIgKyBzdGF0aWNfYXNzZXJ0LiBUaGlzIHdheSB3ZQorICAvLyBtYXkgZ2V0IHJpZCBvZiBOREVCVUcgaW4gdGhpcyBoZWFkZXIuIFVuZm9ydHVuYXRlbHkgdGhlcmUgYXJlIHNvbWUKKyAgLy8gcHJvYmxlbXMgdG8gZ2V0IHRoaXMgd29ya2luZyB3aXRoIE1TVkMgMjAxMy4gQ2hhbmdlIHRoaXMgd2hlbgorICAvLyB0aGUgc3VwcG9ydCBmb3IgTVNWQyAyMDEzIGlzIGRyb3BwZWQuCisgIGNvbnN0ZXhwciBVbmljb2RlQ2hhclNldChDaGFyUmFuZ2VzIFJhbmdlcykgOiBSYW5nZXMoUmFuZ2VzKSB7fQorI2Vsc2UKKyAgVW5pY29kZUNoYXJTZXQoQ2hhclJhbmdlcyBSYW5nZXMpIDogUmFuZ2VzKFJhbmdlcykgeworICAgIGFzc2VydChyYW5nZXNBcmVWYWxpZCgpKTsKKyAgfQorI2VuZGlmCisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRydWUgaWYgdGhlIGNoYXJhY3RlciBzZXQgY29udGFpbnMgdGhlIFVuaWNvZGUgY29kZSBwb2ludAorICAvLy8gXHAgQy4KKyAgYm9vbCBjb250YWlucyh1aW50MzJfdCBDKSBjb25zdCB7CisgICAgcmV0dXJuIHN0ZDo6YmluYXJ5X3NlYXJjaChSYW5nZXMuYmVnaW4oKSwgUmFuZ2VzLmVuZCgpLCBDKTsKKyAgfQorCitwcml2YXRlOgorICAvLy8gXGJyaWVmIFJldHVybnMgdHJ1ZSBpZiBlYWNoIG9mIHRoZSByYW5nZXMgaXMgYSBwcm9wZXIgY2xvc2VkIHJhbmdlCisgIC8vLyBbbWluLCBtYXhdLCBhbmQgaWYgdGhlIHJhbmdlcyB0aGVtc2VsdmVzIGFyZSBvcmRlcmVkIGFuZCBub24tb3ZlcmxhcHBpbmcuCisgIGJvb2wgcmFuZ2VzQXJlVmFsaWQoKSBjb25zdCB7CisgICAgdWludDMyX3QgUHJldiA9IDA7CisgICAgZm9yIChDaGFyUmFuZ2VzOjpjb25zdF9pdGVyYXRvciBJID0gUmFuZ2VzLmJlZ2luKCksIEUgPSBSYW5nZXMuZW5kKCk7CisgICAgICAgICBJICE9IEU7ICsrSSkgeworICAgICAgaWYgKEkgIT0gUmFuZ2VzLmJlZ2luKCkgJiYgUHJldiA+PSBJLT5Mb3dlcikgeworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIlVwcGVyIGJvdW5kIDB4Iik7CisgICAgICAgIERFQlVHKGRiZ3MoKS53cml0ZV9oZXgoUHJldikpOworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIiBzaG91bGQgYmUgbGVzcyB0aGFuIHN1Y2NlZWRpbmcgbG93ZXIgYm91bmQgMHgiKTsKKyAgICAgICAgREVCVUcoZGJncygpLndyaXRlX2hleChJLT5Mb3dlcikgPDwgIlxuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmIChJLT5VcHBlciA8IEktPkxvd2VyKSB7CisgICAgICAgIERFQlVHKGRiZ3MoKSA8PCAiVXBwZXIgYm91bmQgMHgiKTsKKyAgICAgICAgREVCVUcoZGJncygpLndyaXRlX2hleChJLT5Mb3dlcikpOworICAgICAgICBERUJVRyhkYmdzKCkgPDwgIiBzaG91bGQgbm90IGJlIGxlc3MgdGhhbiBsb3dlciBib3VuZCAweCIpOworICAgICAgICBERUJVRyhkYmdzKCkud3JpdGVfaGV4KEktPlVwcGVyKSA8PCAiXG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgUHJldiA9IEktPlVwcGVyOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgY29uc3QgQ2hhclJhbmdlcyBSYW5nZXM7Cit9OworCit9IC8vIG5hbWVzcGFjZSBzeXMKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI3VuZGVmIERFQlVHX1RZUEUgLy8gInVuaWNvZGUiCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfVU5JQ09ERUNIQVJSQU5HRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1VuaXF1ZUxvY2suaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9VbmlxdWVMb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ2NzVmNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9VbmlxdWVMb2NrLmgKQEAgLTAsMCArMSw2OSBAQAorLy89PT0tIFN1cHBvcnQvVW5pcXVlTG9jay5oIC0gQWNxdWlyZS9SZWxlYXNlIE11dGV4IEluIFNjb3BlIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIGd1YXJkIGZvciBhIGJsb2NrIG9mIGNvZGUgdGhhdCBlbnN1cmVzIGEgTXV0ZXggaXMgbG9ja2VkCisvLyB1cG9uIGNvbnN0cnVjdGlvbiBhbmQgcmVsZWFzZWQgdXBvbiBkZXN0cnVjdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9VTklRVUVfTE9DS19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9VTklRVUVfTE9DS19ICisKKyNpbmNsdWRlIDxjYXNzZXJ0PgorCituYW1lc3BhY2UgbGx2bSB7CisKKyAgLy8vIEEgcGFyZWQtZG93biBpbWl0YXRpb24gb2Ygc3RkOjp1bmlxdWVfbG9jayBmcm9tIEMrKzExLiBDb250cmFyeSB0byB0aGUKKyAgLy8vIG5hbWUsIGl0J3MgcmVhbGx5IG1vcmUgb2YgYSB3cmFwcGVyIGZvciBhIGxvY2suIEl0IG1heSBvciBtYXkgbm90IGhhdmUKKyAgLy8vIGFuIGFzc29jaWF0ZWQgbXV0ZXgsIHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgbG9ja2VkIHVwb24gY3JlYXRpb24KKyAgLy8vIGFuZCB1bmxvY2tlZCBhZnRlciBkZXN0cnVjdGlvbi4gdW5pcXVlX2xvY2sgY2FuIGFsc28gdW5sb2NrIHRoZSBtdXRleAorICAvLy8gYW5kIHJlLWxvY2sgaXQgZnJlZWx5IGR1cmluZyBpdHMgbGlmZXRpbWUuCisgIC8vLyBAYnJpZWYgR3VhcmQgYSBzZWN0aW9uIG9mIGNvZGUgd2l0aCBhIG11dGV4LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBNdXRleFQ+CisgIGNsYXNzIHVuaXF1ZV9sb2NrIHsKKyAgICBNdXRleFQgKk0gPSBudWxscHRyOworICAgIGJvb2wgbG9ja2VkID0gZmFsc2U7CisKKyAgcHVibGljOgorICAgIHVuaXF1ZV9sb2NrKCkgPSBkZWZhdWx0OworICAgIGV4cGxpY2l0IHVuaXF1ZV9sb2NrKE11dGV4VCAmbSkgOiBNKCZtKSwgbG9ja2VkKHRydWUpIHsgTS0+bG9jaygpOyB9CisgICAgdW5pcXVlX2xvY2soY29uc3QgdW5pcXVlX2xvY2sgJikgPSBkZWxldGU7CisgICAgIHVuaXF1ZV9sb2NrICZvcGVyYXRvcj0oY29uc3QgdW5pcXVlX2xvY2sgJikgPSBkZWxldGU7CisKKyAgICB2b2lkIG9wZXJhdG9yPSh1bmlxdWVfbG9jayAmJm8pIHsKKyAgICAgIGlmIChvd25zX2xvY2soKSkKKyAgICAgICAgTS0+dW5sb2NrKCk7CisgICAgICBNID0gby5NOworICAgICAgbG9ja2VkID0gby5sb2NrZWQ7CisgICAgICBvLk0gPSBudWxscHRyOworICAgICAgby5sb2NrZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICB+dW5pcXVlX2xvY2soKSB7IGlmIChvd25zX2xvY2soKSkgTS0+dW5sb2NrKCk7IH0KKworICAgIHZvaWQgbG9jaygpIHsKKyAgICAgIGFzc2VydCghbG9ja2VkICYmICJtdXRleCBhbHJlYWR5IGxvY2tlZCEiKTsKKyAgICAgIGFzc2VydChNICYmICJubyBhc3NvY2lhdGVkIG11dGV4ISIpOworICAgICAgTS0+bG9jaygpOworICAgICAgbG9ja2VkID0gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIHVubG9jaygpIHsKKyAgICAgIGFzc2VydChsb2NrZWQgJiYgInVubG9ja2luZyBhIG11dGV4IHRoYXQgaXNuJ3QgbG9ja2VkISIpOworICAgICAgYXNzZXJ0KE0gJiYgIm5vIGFzc29jaWF0ZWQgbXV0ZXghIik7CisgICAgICBNLT51bmxvY2soKTsKKyAgICAgIGxvY2tlZCA9IGZhbHNlOworICAgIH0KKworICAgIGJvb2wgb3duc19sb2NrKCkgeyByZXR1cm4gbG9ja2VkOyB9CisgIH07CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfVU5JUVVFX0xPQ0tfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1ZDU1JldmlzaW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVkNTUmV2aXNpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTEwZWEyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1ZDU1JldmlzaW9uLmgKQEAgLTAsMCArMSBAQAorI2RlZmluZSBMTFZNX1JFVklTSU9OICJnaXQtMWQ3MzlmZmIwMzYiCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVmFsZ3JpbmQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9WYWxncmluZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4NGI5MDEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvVmFsZ3JpbmQuaApAQCAtMCwwICsxLDMyIEBACisvLz09PS0gbGx2bS9TdXBwb3J0L1ZhbGdyaW5kLmggLSBDb21tdW5pY2F0aW9uIHdpdGggVmFsZ3JpbmQgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIE1ldGhvZHMgZm9yIGNvbW11bmljYXRpbmcgd2l0aCBhIHZhbGdyaW5kIGluc3RhbmNlIHRoaXMgcHJvZ3JhbSBpcyBydW5uaW5nCisvLyB1bmRlci4gIFRoZXNlIGFyZSBhbGwgbm8tb3BzIHVubGVzcyBMTFZNIHdhcyBjb25maWd1cmVkIG9uIGEgc3lzdGVtIHdpdGggdGhlCisvLyB2YWxncmluZCBoZWFkZXJzIGluc3RhbGxlZCBhbmQgdmFsZ3JpbmQgaXMgY29udHJvbGxpbmcgdGhpcyBwcm9jZXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1ZBTEdSSU5EX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1ZBTEdSSU5EX0gKKworI2luY2x1ZGUgPGNzdGRkZWY+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBzeXMgeworICAvLyBUcnVlIGlmIFZhbGdyaW5kIGlzIGNvbnRyb2xsaW5nIHRoaXMgcHJvY2Vzcy4KKyAgYm9vbCBSdW5uaW5nT25WYWxncmluZCgpOworCisgIC8vIERpc2NhcmQgdmFsZ3JpbmQncyB0cmFuc2xhdGlvbiBvZiBjb2RlIGluIHRoZSByYW5nZSBbQWRkciAuLiBBZGRyICsgTGVuKS4KKyAgLy8gT3RoZXJ3aXNlIHZhbGdyaW5kIG1heSBjb250aW51ZSB0byBleGVjdXRlIHRoZSBvbGQgdmVyc2lvbiBvZiB0aGUgY29kZS4KKyAgdm9pZCBWYWxncmluZERpc2NhcmRUcmFuc2xhdGlvbnMoY29uc3Qgdm9pZCAqQWRkciwgc2l6ZV90IExlbik7Cit9IC8vIG5hbWVzcGFjZSBzeXMKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1NVUFBPUlRfVkFMR1JJTkRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1dhdGNoZG9nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvV2F0Y2hkb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWUxZDkyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1dhdGNoZG9nLmgKQEAgLTAsMCArMSwzOCBAQAorLy89PT0tLS0gV2F0Y2hkb2cuaCAtIFdhdGNoZG9nIHRpbWVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBsbHZtOjpzeXM6OldhdGNoZG9nIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1dBVENIRE9HX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1dBVENIRE9HX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIG5hbWVzcGFjZSBzeXMgeworCisgICAgLy8vIFRoaXMgY2xhc3MgcHJvdmlkZXMgYW4gYWJzdHJhY3Rpb24gZm9yIGEgdGltZW91dCBhcm91bmQgYW4gb3BlcmF0aW9uCisgICAgLy8vIHRoYXQgbXVzdCBjb21wbGV0ZSBpbiBhIGdpdmVuIGFtb3VudCBvZiB0aW1lLiBGYWlsdXJlIHRvIGNvbXBsZXRlIGJlZm9yZQorICAgIC8vLyB0aGUgdGltZW91dCBpcyBhbiB1bnJlY292ZXJhYmxlIHNpdHVhdGlvbiBhbmQgbm8gbWVjaGFuaXNtcyB0byBhdHRlbXB0CisgICAgLy8vIHRvIGhhbmRsZSBpdCBhcmUgcHJvdmlkZWQuCisgICAgY2xhc3MgV2F0Y2hkb2cgeworICAgIHB1YmxpYzoKKyAgICAgIFdhdGNoZG9nKHVuc2lnbmVkIGludCBzZWNvbmRzKTsKKyAgICAgIH5XYXRjaGRvZygpOworICAgIHByaXZhdGU6CisgICAgICAvLyBOb25jb3B5YWJsZS4KKyAgICAgIFdhdGNoZG9nKGNvbnN0IFdhdGNoZG9nICZvdGhlcikgPSBkZWxldGU7CisgICAgICBXYXRjaGRvZyAmb3BlcmF0b3I9KGNvbnN0IFdhdGNoZG9nICZvdGhlcikgPSBkZWxldGU7CisgICAgfTsKKyAgfQorfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9XaW42NEVILmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvV2luNjRFSC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY2YzQ5MjcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvV2luNjRFSC5oCkBAIC0wLDAgKzEsMTQ3IEBACisvLz09PS0tIGxsdm0vU3VwcG9ydC9XaW42NEVILmggLS0tV2luNjQgRUggQ29uc3RhbnRzLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBjb25zdGFudHMgYW5kIHN0cnVjdHVyZXMgdXNlZCBmb3IgaW1wbGVtZW50aW5nCisvLyBleGNlcHRpb24gaGFuZGxpbmcgb24gV2luNjQgcGxhdGZvcm1zLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlCisvLyBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvMWV5YXM4dGYuYXNweAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1dJTjY0RUhfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfV0lONjRFSF9ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGF0YVR5cGVzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgV2luNjRFSCB7CisKKy8vLyBVbndpbmRPcGNvZGVzIC0gRW51bWVyYXRpb24gd2hvc2UgdmFsdWVzIHNwZWNpZnkgYSBzaW5nbGUgb3BlcmF0aW9uIGluCisvLy8gdGhlIHByb2xvZyBvZiBhIGZ1bmN0aW9uLgorZW51bSBVbndpbmRPcGNvZGVzIHsKKyAgVU9QX1B1c2hOb25Wb2wgPSAwLAorICBVT1BfQWxsb2NMYXJnZSwKKyAgVU9QX0FsbG9jU21hbGwsCisgIFVPUF9TZXRGUFJlZywKKyAgVU9QX1NhdmVOb25Wb2wsCisgIFVPUF9TYXZlTm9uVm9sQmlnLAorICBVT1BfU2F2ZVhNTTEyOCA9IDgsCisgIFVPUF9TYXZlWE1NMTI4QmlnLAorICBVT1BfUHVzaE1hY2hGcmFtZQorfTsKKworLy8vIFVud2luZENvZGUgLSBUaGlzIHVuaW9uIGRlc2NyaWJlcyBhIHNpbmdsZSBvcGVyYXRpb24gaW4gYSBmdW5jdGlvbiBwcm9sb2csCisvLy8gb3IgcGFydCB0aGVyZW9mLgordW5pb24gVW53aW5kQ29kZSB7CisgIHN0cnVjdCB7CisgICAgdWludDhfdCBDb2RlT2Zmc2V0OworICAgIHVpbnQ4X3QgVW53aW5kT3BBbmRPcEluZm87CisgIH0gdTsKKyAgc3VwcG9ydDo6dWxpdHRsZTE2X3QgRnJhbWVPZmZzZXQ7CisKKyAgdWludDhfdCBnZXRVbndpbmRPcCgpIGNvbnN0IHsKKyAgICByZXR1cm4gdS5VbndpbmRPcEFuZE9wSW5mbyAmIDB4MEY7CisgIH0KKyAgdWludDhfdCBnZXRPcEluZm8oKSBjb25zdCB7CisgICAgcmV0dXJuICh1LlVud2luZE9wQW5kT3BJbmZvID4+IDQpICYgMHgwRjsKKyAgfQorfTsKKworZW51bSB7CisgIC8vLyBVTldfRXhjZXB0aW9uSGFuZGxlciAtIFNwZWNpZmllcyB0aGF0IHRoaXMgZnVuY3Rpb24gaGFzIGFuIGV4Y2VwdGlvbgorICAvLy8gaGFuZGxlci4KKyAgVU5XX0V4Y2VwdGlvbkhhbmRsZXIgPSAweDAxLAorICAvLy8gVU5XX1Rlcm1pbmF0ZUhhbmRsZXIgLSBTcGVjaWZpZXMgdGhhdCB0aGlzIGZ1bmN0aW9uIGhhcyBhIHRlcm1pbmF0aW9uCisgIC8vLyBoYW5kbGVyLgorICBVTldfVGVybWluYXRlSGFuZGxlciA9IDB4MDIsCisgIC8vLyBVTldfQ2hhaW5JbmZvIC0gU3BlY2lmaWVzIHRoYXQgdGhpcyBVbndpbmRJbmZvIHN0cnVjdHVyZSBpcyBjaGFpbmVkIHRvCisgIC8vLyBhbm90aGVyIG9uZS4KKyAgVU5XX0NoYWluSW5mbyA9IDB4MDQKK307CisKKy8vLyBSdW50aW1lRnVuY3Rpb24gLSBBbiBlbnRyeSBpbiB0aGUgdGFibGUgb2YgZnVuY3Rpb25zIHdpdGggdW53aW5kIGluZm8uCitzdHJ1Y3QgUnVudGltZUZ1bmN0aW9uIHsKKyAgc3VwcG9ydDo6dWxpdHRsZTMyX3QgU3RhcnRBZGRyZXNzOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBFbmRBZGRyZXNzOworICBzdXBwb3J0Ojp1bGl0dGxlMzJfdCBVbndpbmRJbmZvT2Zmc2V0OworfTsKKworLy8vIFVud2luZEluZm8gLSBBbiBlbnRyeSBpbiB0aGUgZXhjZXB0aW9uIHRhYmxlLgorc3RydWN0IFVud2luZEluZm8geworICB1aW50OF90IFZlcnNpb25BbmRGbGFnczsKKyAgdWludDhfdCBQcm9sb2dTaXplOworICB1aW50OF90IE51bUNvZGVzOworICB1aW50OF90IEZyYW1lUmVnaXN0ZXJBbmRPZmZzZXQ7CisgIFVud2luZENvZGUgVW53aW5kQ29kZXNbMV07CisKKyAgdWludDhfdCBnZXRWZXJzaW9uKCkgY29uc3QgeworICAgIHJldHVybiBWZXJzaW9uQW5kRmxhZ3MgJiAweDA3OworICB9CisgIHVpbnQ4X3QgZ2V0RmxhZ3MoKSBjb25zdCB7CisgICAgcmV0dXJuIChWZXJzaW9uQW5kRmxhZ3MgPj4gMykgJiAweDFmOworICB9CisgIHVpbnQ4X3QgZ2V0RnJhbWVSZWdpc3RlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gRnJhbWVSZWdpc3RlckFuZE9mZnNldCAmIDB4MGY7CisgIH0KKyAgdWludDhfdCBnZXRGcmFtZU9mZnNldCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKEZyYW1lUmVnaXN0ZXJBbmRPZmZzZXQgPj4gNCkgJiAweDBmOworICB9CisKKyAgLy8gVGhlIGRhdGEgYWZ0ZXIgdW53aW5kQ29kZXMgZGVwZW5kcyBvbiBmbGFncy4KKyAgLy8gSWYgVU5XX0V4Y2VwdGlvbkhhbmRsZXIgb3IgVU5XX1Rlcm1pbmF0ZUhhbmRsZXIgaXMgc2V0IHRoZW4gZm9sbG93cworICAvLyB0aGUgYWRkcmVzcyBvZiB0aGUgbGFuZ3VhZ2Utc3BlY2lmaWMgZXhjZXB0aW9uIGhhbmRsZXIuCisgIC8vIElmIFVOV19DaGFpbkluZm8gaXMgc2V0IHRoZW4gZm9sbG93cyBhIFJ1bnRpbWVGdW5jdGlvbiB3aGljaCBkZWZpbmVzCisgIC8vIHRoZSBjaGFpbmVkIHVud2luZCBpbmZvLgorICAvLyBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIE1TRE4gYXQ6CisgIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9kZHNzeHh5OC5hc3B4CisKKyAgLy8vIFxicmllZiBSZXR1cm4gcG9pbnRlciB0byBsYW5ndWFnZSBzcGVjaWZpYyBkYXRhIHBhcnQgb2YgVW53aW5kSW5mby4KKyAgdm9pZCAqZ2V0TGFuZ3VhZ2VTcGVjaWZpY0RhdGEoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCAqPigmVW53aW5kQ29kZXNbKE51bUNvZGVzKzEpICYgfjFdKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIHBvaW50ZXIgdG8gbGFuZ3VhZ2Ugc3BlY2lmaWMgZGF0YSBwYXJ0IG9mIFVud2luZEluZm8uCisgIGNvbnN0IHZvaWQgKmdldExhbmd1YWdlU3BlY2lmaWNEYXRhKCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHZvaWQgKj4oJlVud2luZENvZGVzWyhOdW1Db2RlcyArIDEpICYgfjFdKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUmV0dXJuIGltYWdlLXJlbGF0aXZlIG9mZnNldCBvZiBsYW5ndWFnZS1zcGVjaWZpYyBleGNlcHRpb24gaGFuZGxlci4KKyAgdWludDMyX3QgZ2V0TGFuZ3VhZ2VTcGVjaWZpY0hhbmRsZXJPZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IHN1cHBvcnQ6OnVsaXR0bGUzMl90ICo+KAorICAgICAgICAgICAgICAgZ2V0TGFuZ3VhZ2VTcGVjaWZpY0RhdGEoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFNldCBpbWFnZS1yZWxhdGl2ZSBvZmZzZXQgb2YgbGFuZ3VhZ2Utc3BlY2lmaWMgZXhjZXB0aW9uIGhhbmRsZXIuCisgIHZvaWQgc2V0TGFuZ3VhZ2VTcGVjaWZpY0hhbmRsZXJPZmZzZXQodWludDMyX3Qgb2Zmc2V0KSB7CisgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8c3VwcG9ydDo6dWxpdHRsZTMyX3QgKj4oZ2V0TGFuZ3VhZ2VTcGVjaWZpY0RhdGEoKSkgPQorICAgICAgICBvZmZzZXQ7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBwb2ludGVyIHRvIGV4Y2VwdGlvbi1zcGVjaWZpYyBkYXRhLgorICB2b2lkICpnZXRFeGNlcHRpb25EYXRhKCkgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHZvaWQgKj4ocmVpbnRlcnByZXRfY2FzdDx1aW50MzJfdCAqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0TGFuZ3VhZ2VTcGVjaWZpY0RhdGEoKSkrMSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJldHVybiBwb2ludGVyIHRvIGNoYWluZWQgdW53aW5kIGluZm8uCisgIFJ1bnRpbWVGdW5jdGlvbiAqZ2V0Q2hhaW5lZEZ1bmN0aW9uRW50cnkoKSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UnVudGltZUZ1bmN0aW9uICo+KGdldExhbmd1YWdlU3BlY2lmaWNEYXRhKCkpOworICB9CisKKyAgLy8vIFxicmllZiBSZXR1cm4gcG9pbnRlciB0byBjaGFpbmVkIHVud2luZCBpbmZvLgorICBjb25zdCBSdW50aW1lRnVuY3Rpb24gKmdldENoYWluZWRGdW5jdGlvbkVudHJ5KCkgY29uc3QgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFJ1bnRpbWVGdW5jdGlvbiAqPihnZXRMYW5ndWFnZVNwZWNpZmljRGF0YSgpKTsKKyAgfQorfTsKKworCit9IC8vIEVuZCBvZiBuYW1lc3BhY2UgV2luNjRFSAorfSAvLyBFbmQgb2YgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvV2luZG93c0Vycm9yLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvV2luZG93c0Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNiZmU1OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9XaW5kb3dzRXJyb3IuaApAQCAtMCwwICsxLDE5IEBACisvLz09PS0tIFdpbmRvd3NFcnJvci5oIC0gU3VwcG9ydCBmb3IgbWFwcGluZyB3aW5kb3dzIGVycm9ycyB0byBwb3NpeC0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9XSU5ET1dTRVJST1JfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfV0lORE9XU0VSUk9SX0gKKworI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKworbmFtZXNwYWNlIGxsdm0geworc3RkOjplcnJvcl9jb2RlIG1hcFdpbmRvd3NFcnJvcih1bnNpZ25lZCBFVik7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1dpdGhDb2xvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1dpdGhDb2xvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM5Yzk5NTMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvV2l0aENvbG9yLmgKQEAgLTAsMCArMSw0OCBAQAorLy89PT0tIFdpdGhDb2xvci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfV0lUSENPTE9SX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1dJVEhDT0xPUl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vIFN5bWJvbGljIG5hbWVzIGZvciB2YXJpb3VzIHN5bnRheCBlbGVtZW50cy4KK2VudW0gY2xhc3MgSGlnaGxpZ2h0Q29sb3IgeworICBBZGRyZXNzLAorICBTdHJpbmcsCisgIFRhZywKKyAgQXR0cmlidXRlLAorICBFbnVtZXJhdG9yLAorICBNYWNybywKKyAgRXJyb3IsCisgIFdhcm5pbmcsCisgIE5vdGUKK307CisKKy8vLyBBbiBSQUlJIG9iamVjdCB0aGF0IHRlbXBvcmFyaWx5IHN3aXRjaGVzIGFuIG91dHB1dCBzdHJlYW0gdG8gYSBzcGVjaWZpYworLy8vIGNvbG9yLgorY2xhc3MgV2l0aENvbG9yIHsKKyAgcmF3X29zdHJlYW0gJk9TOworICAvLy8gRGV0ZXJtaW5lIHdoZXRoZXIgY29sb3JzIHNob3VsZCBiZSBkaXNwbGF5ZWQuCisgIGJvb2wgY29sb3JzRW5hYmxlZChyYXdfb3N0cmVhbSAmT1MpOworCitwdWJsaWM6CisgIC8vLyBUbyBiZSB1c2VkIGxpa2UgdGhpczogV2l0aENvbG9yKE9TLCBIaWdobGlnaHRDb2xvcjo6U3RyaW5nKSA8PCAidGV4dCI7CisgIFdpdGhDb2xvcihyYXdfb3N0cmVhbSAmT1MsIEhpZ2hsaWdodENvbG9yIFMpOworICB+V2l0aENvbG9yKCk7CisKKyAgcmF3X29zdHJlYW0gJmdldCgpIHsgcmV0dXJuIE9TOyB9CisgIG9wZXJhdG9yIHJhd19vc3RyZWFtICYoKSB7IHJldHVybiBPUzsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fTElCX0RFQlVHSU5GT19XSVRIQ09MT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1g4NkRpc2Fzc2VtYmxlckRlY29kZXJDb21tb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9YODZEaXNhc3NlbWJsZXJEZWNvZGVyQ29tbW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWVmZmI5YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9YODZEaXNhc3NlbWJsZXJEZWNvZGVyQ29tbW9uLmgKQEAgLTAsMCArMSw0NjkgQEAKKy8vPT09LS0gWDg2RGlzYXNzZW1ibGVyRGVjb2RlckNvbW1vbi5oIC0gRGlzYXNzZW1ibGVyIGRlY29kZXIgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIFg4NiBEaXNhc3NlbWJsZXIuCisvLyBJdCBjb250YWlucyBjb21tb24gZGVmaW5pdGlvbnMgdXNlZCBieSBib3RoIHRoZSBkaXNhc3NlbWJsZXIgYW5kIHRoZSB0YWJsZQorLy8gIGdlbmVyYXRvci4KKy8vIERvY3VtZW50YXRpb24gZm9yIHRoZSBkaXNhc3NlbWJsZXIgY2FuIGJlIGZvdW5kIGluIFg4NkRpc2Fzc2VtYmxlci5oLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9MSUJfVEFSR0VUX1g4Nl9ESVNBU1NFTUJMRVJfWDg2RElTQVNTRU1CTEVSREVDT0RFUkNPTU1PTl9ICisjZGVmaW5lIExMVk1fTElCX1RBUkdFVF9YODZfRElTQVNTRU1CTEVSX1g4NkRJU0FTU0VNQkxFUkRFQ09ERVJDT01NT05fSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RhdGFUeXBlcy5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgWDg2RGlzYXNzZW1ibGVyIHsKKworI2RlZmluZSBJTlNUUlVDVElPTlNfU1lNICB4ODZEaXNhc3NlbWJsZXJJbnN0clNwZWNpZmllcnMKKyNkZWZpbmUgQ09OVEVYVFNfU1lNICAgICAgeDg2RGlzYXNzZW1ibGVyQ29udGV4dHMKKyNkZWZpbmUgT05FQllURV9TWU0gICAgICAgeDg2RGlzYXNzZW1ibGVyT25lQnl0ZU9wY29kZXMKKyNkZWZpbmUgVFdPQllURV9TWU0gICAgICAgeDg2RGlzYXNzZW1ibGVyVHdvQnl0ZU9wY29kZXMKKyNkZWZpbmUgVEhSRUVCWVRFMzhfU1lNICAgeDg2RGlzYXNzZW1ibGVyVGhyZWVCeXRlMzhPcGNvZGVzCisjZGVmaW5lIFRIUkVFQllURTNBX1NZTSAgIHg4NkRpc2Fzc2VtYmxlclRocmVlQnl0ZTNBT3Bjb2RlcworI2RlZmluZSBYT1A4X01BUF9TWU0gICAgICB4ODZEaXNhc3NlbWJsZXJYT1A4T3Bjb2RlcworI2RlZmluZSBYT1A5X01BUF9TWU0gICAgICB4ODZEaXNhc3NlbWJsZXJYT1A5T3Bjb2RlcworI2RlZmluZSBYT1BBX01BUF9TWU0gICAgICB4ODZEaXNhc3NlbWJsZXJYT1BBT3Bjb2RlcworI2RlZmluZSBUSFJFRUROT1dfTUFQX1NZTSB4ODZEaXNhc3NlbWJsZXIzRE5vd09wY29kZXMKKworI2RlZmluZSBJTlNUUlVDVElPTlNfU1RSICAieDg2RGlzYXNzZW1ibGVySW5zdHJTcGVjaWZpZXJzIgorI2RlZmluZSBDT05URVhUU19TVFIgICAgICAieDg2RGlzYXNzZW1ibGVyQ29udGV4dHMiCisjZGVmaW5lIE9ORUJZVEVfU1RSICAgICAgICJ4ODZEaXNhc3NlbWJsZXJPbmVCeXRlT3Bjb2RlcyIKKyNkZWZpbmUgVFdPQllURV9TVFIgICAgICAgIng4NkRpc2Fzc2VtYmxlclR3b0J5dGVPcGNvZGVzIgorI2RlZmluZSBUSFJFRUJZVEUzOF9TVFIgICAieDg2RGlzYXNzZW1ibGVyVGhyZWVCeXRlMzhPcGNvZGVzIgorI2RlZmluZSBUSFJFRUJZVEUzQV9TVFIgICAieDg2RGlzYXNzZW1ibGVyVGhyZWVCeXRlM0FPcGNvZGVzIgorI2RlZmluZSBYT1A4X01BUF9TVFIgICAgICAieDg2RGlzYXNzZW1ibGVyWE9QOE9wY29kZXMiCisjZGVmaW5lIFhPUDlfTUFQX1NUUiAgICAgICJ4ODZEaXNhc3NlbWJsZXJYT1A5T3Bjb2RlcyIKKyNkZWZpbmUgWE9QQV9NQVBfU1RSICAgICAgIng4NkRpc2Fzc2VtYmxlclhPUEFPcGNvZGVzIgorI2RlZmluZSBUSFJFRUROT1dfTUFQX1NUUiAieDg2RGlzYXNzZW1ibGVyM0ROb3dPcGNvZGVzIgorCisvLyBBdHRyaWJ1dGVzIG9mIGFuIGluc3RydWN0aW9uIHRoYXQgbXVzdCBiZSBrbm93biBiZWZvcmUgdGhlIG9wY29kZSBjYW4gYmUKKy8vIHByb2Nlc3NlZCBjb3JyZWN0bHkuICBNb3N0IG9mIHRoZXNlIGluZGljYXRlIHRoZSBwcmVzZW5jZSBvZiBwYXJ0aWN1bGFyCisvLyBwcmVmaXhlcywgYnV0IEFUVFJfNjRCSVQgaXMgc2ltcGx5IGFuIGF0dHJpYnV0ZSBvZiB0aGUgZGVjb2RpbmcgY29udGV4dC4KKyNkZWZpbmUgQVRUUklCVVRFX0JJVFMgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoQVRUUl9OT05FLCAgIDB4MDApICAgICAgICAgXAorICBFTlVNX0VOVFJZKEFUVFJfNjRCSVQsICAoMHgxIDw8IDApKSAgIFwKKyAgRU5VTV9FTlRSWShBVFRSX1hTLCAgICAgKDB4MSA8PCAxKSkgICBcCisgIEVOVU1fRU5UUlkoQVRUUl9YRCwgICAgICgweDEgPDwgMikpICAgXAorICBFTlVNX0VOVFJZKEFUVFJfUkVYVywgICAoMHgxIDw8IDMpKSAgIFwKKyAgRU5VTV9FTlRSWShBVFRSX09QU0laRSwgKDB4MSA8PCA0KSkgICBcCisgIEVOVU1fRU5UUlkoQVRUUl9BRFNJWkUsICgweDEgPDwgNSkpICAgXAorICBFTlVNX0VOVFJZKEFUVFJfVkVYLCAgICAoMHgxIDw8IDYpKSAgIFwKKyAgRU5VTV9FTlRSWShBVFRSX1ZFWEwsICAgKDB4MSA8PCA3KSkgICBcCisgIEVOVU1fRU5UUlkoQVRUUl9FVkVYLCAgICgweDEgPDwgOCkpICAgXAorICBFTlVNX0VOVFJZKEFUVFJfRVZFWEwsICAoMHgxIDw8IDkpKSAgIFwKKyAgRU5VTV9FTlRSWShBVFRSX0VWRVhMMiwgKDB4MSA8PCAxMCkpICBcCisgIEVOVU1fRU5UUlkoQVRUUl9FVkVYSywgICgweDEgPDwgMTEpKSAgXAorICBFTlVNX0VOVFJZKEFUVFJfRVZFWEtaLCAoMHgxIDw8IDEyKSkgIFwKKyAgRU5VTV9FTlRSWShBVFRSX0VWRVhCLCAgKDB4MSA8PCAxMykpCisKKyNkZWZpbmUgRU5VTV9FTlRSWShuLCB2KSBuID0gdiwKK2VudW0gYXR0cmlidXRlQml0cyB7CisgIEFUVFJJQlVURV9CSVRTCisgIEFUVFJfbWF4Cit9OworI3VuZGVmIEVOVU1fRU5UUlkKKworLy8gQ29tYmluYXRpb25zIG9mIHRoZSBhYm92ZSBhdHRyaWJ1dGVzIHRoYXQgYXJlIHJlbGV2YW50IHRvIGluc3RydWN0aW9uCisvLyBkZWNvZGUuIEFsdGhvdWdoIG90aGVyIGNvbWJpbmF0aW9ucyBhcmUgcG9zc2libGUsIHRoZXkgY2FuIGJlIHJlZHVjZWQgdG8KKy8vIHRoZXNlIHdpdGhvdXQgYWZmZWN0aW5nIHRoZSB1bHRpbWF0ZWx5IGRlY29kZWQgaW5zdHJ1Y3Rpb24uCisKKy8vICAgICAgICAgICBDbGFzcyBuYW1lICAgICAgICAgICBSYW5rICBSYXRpb25hbGUgZm9yIHJhbmsgYXNzaWdubWVudAorI2RlZmluZSBJTlNUUlVDVElPTl9DT05URVhUUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQywgICAgICAgICAgICAgICAgICAgIDAsICAic2F5cyBub3RoaW5nIGFib3V0IHRoZSBpbnN0cnVjdGlvbiIpICBcCisgIEVOVU1fRU5UUlkoSUNfNjRCSVQsICAgICAgICAgICAgICAxLCAgInNheXMgdGhlIGluc3RydWN0aW9uIGFwcGxpZXMgaW4gIiAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI2NC1iaXQgbW9kZSBidXQgbm8gbW9yZSIpICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19PUFNJWkUsICAgICAgICAgICAgIDMsICAicmVxdWlyZXMgYW4gT1BTSVpFIHByZWZpeCwgc28gIiAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wZXJhbmRzIGNoYW5nZSB3aWR0aCIpICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0FEU0laRSwgICAgICAgICAgICAgMywgICJyZXF1aXJlcyBhbiBBRFNJWkUgcHJlZml4LCBzbyAiICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3BlcmFuZHMgY2hhbmdlIHdpZHRoIikgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfT1BTSVpFX0FEU0laRSwgICAgICA0LCAgInJlcXVpcmVzIEFEU0laRSBhbmQgT1BTSVpFIHByZWZpeGVzIikgXAorICBFTlVNX0VOVFJZKElDX1hELCAgICAgICAgICAgICAgICAgMiwgICJtYXkgc2F5IHNvbWV0aGluZyBhYm91dCB0aGUgb3Bjb2RlICIgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnV0IG5vdCB0aGUgb3BlcmFuZHMiKSAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfWFMsICAgICAgICAgICAgICAgICAyLCAgIm1heSBzYXkgc29tZXRoaW5nIGFib3V0IHRoZSBvcGNvZGUgIiAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJidXQgbm90IHRoZSBvcGVyYW5kcyIpICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19YRF9PUFNJWkUsICAgICAgICAgIDMsICAicmVxdWlyZXMgYW4gT1BTSVpFIHByZWZpeCwgc28gIiAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wZXJhbmRzIGNoYW5nZSB3aWR0aCIpICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX1hTX09QU0laRSwgICAgICAgICAgMywgICJyZXF1aXJlcyBhbiBPUFNJWkUgcHJlZml4LCBzbyAiICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3BlcmFuZHMgY2hhbmdlIHdpZHRoIikgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfNjRCSVRfUkVYVywgICAgICAgICA1LCAgInJlcXVpcmVzIGEgUkVYLlcgcHJlZml4LCBzbyBvcGVyYW5kcyAiXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjaGFuZ2Ugd2lkdGg7IG92ZXJyaWRlcyBJQ19PUFNJWkUiKSAgIFwKKyAgRU5VTV9FTlRSWShJQ182NEJJVF9SRVhXX0FEU0laRSwgIDYsICAicmVxdWlyZXMgYSBSRVguVyBwcmVmaXggYW5kIDB4NjcgIiAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZWZpeCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDXzY0QklUX09QU0laRSwgICAgICAgMywgICJKdXN0IGFzIG1lYW5pbmdmdWwgYXMgSUNfT1BTSVpFIikgICAgIFwKKyAgRU5VTV9FTlRSWShJQ182NEJJVF9BRFNJWkUsICAgICAgIDMsICAiSnVzdCBhcyBtZWFuaW5nZnVsIGFzIElDX0FEU0laRSIpICAgICBcCisgIEVOVU1fRU5UUlkoSUNfNjRCSVRfT1BTSVpFX0FEU0laRSwgNCwgIkp1c3QgYXMgbWVhbmluZ2Z1bCBhcyBJQ19PUFNJWkUvIiAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJQ19BRFNJWkUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ182NEJJVF9YRCwgICAgICAgICAgIDYsICAiWEQgaW5zdHJ1Y3Rpb25zIGFyZSBTU0U7IFJFWC5XIGlzICIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInNlY29uZGFyeSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDXzY0QklUX1hTLCAgICAgICAgICAgNiwgICJKdXN0IGFzIG1lYW5pbmdmdWwgYXMgSUNfNjRCSVRfWEQiKSAgIFwKKyAgRU5VTV9FTlRSWShJQ182NEJJVF9YRF9PUFNJWkUsICAgIDMsICAiSnVzdCBhcyBtZWFuaW5nZnVsIGFzIElDX1hEX09QU0laRSIpICBcCisgIEVOVU1fRU5UUlkoSUNfNjRCSVRfWFNfT1BTSVpFLCAgICAzLCAgIkp1c3QgYXMgbWVhbmluZ2Z1bCBhcyBJQ19YU19PUFNJWkUiKSAgXAorICBFTlVNX0VOVFJZKElDXzY0QklUX1JFWFdfWFMsICAgICAgNywgICJPUFNJWkUgY291bGQgbWVhbiBhIGRpZmZlcmVudCAiICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3Bjb2RlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfNjRCSVRfUkVYV19YRCwgICAgICA3LCAgIkp1c3QgYXMgbWVhbmluZ2Z1bCBhcyAiICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJJQ182NEJJVF9SRVhXX1hTIikgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ182NEJJVF9SRVhXX09QU0laRSwgIDgsICAiVGhlIER5bmFtaWMgRHVvISAgUHJlZmVyIG92ZXIgYWxsICIgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVsc2UgYmVjYXVzZSB0aGlzIGNoYW5nZXMgbW9zdCAiICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcGVyYW5kcycgbWVhbmluZyIpICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19WRVgsICAgICAgICAgICAgICAgIDEsICAicmVxdWlyZXMgYSBWRVggcHJlZml4IikgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfVkVYX1hTLCAgICAgICAgICAgICAyLCAgInJlcXVpcmVzIFZFWCBhbmQgdGhlIFhTIHByZWZpeCIpICAgICAgXAorICBFTlVNX0VOVFJZKElDX1ZFWF9YRCwgICAgICAgICAgICAgMiwgICJyZXF1aXJlcyBWRVggYW5kIHRoZSBYRCBwcmVmaXgiKSAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19WRVhfT1BTSVpFLCAgICAgICAgIDIsICAicmVxdWlyZXMgVkVYIGFuZCB0aGUgT3BTaXplIHByZWZpeCIpICBcCisgIEVOVU1fRU5UUlkoSUNfVkVYX1csICAgICAgICAgICAgICAzLCAgInJlcXVpcmVzIFZFWCBhbmQgdGhlIFcgcHJlZml4IikgICAgICAgXAorICBFTlVNX0VOVFJZKElDX1ZFWF9XX1hTLCAgICAgICAgICAgNCwgICJyZXF1aXJlcyBWRVgsIFcsIGFuZCBYUyBwcmVmaXgiKSAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19WRVhfV19YRCwgICAgICAgICAgIDQsICAicmVxdWlyZXMgVkVYLCBXLCBhbmQgWEQgcHJlZml4IikgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfVkVYX1dfT1BTSVpFLCAgICAgICA0LCAgInJlcXVpcmVzIFZFWCwgVywgYW5kIE9wU2l6ZSIpICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX1ZFWF9MLCAgICAgICAgICAgICAgMywgICJyZXF1aXJlcyBWRVggYW5kIHRoZSBMIHByZWZpeCIpICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19WRVhfTF9YUywgICAgICAgICAgIDQsICAicmVxdWlyZXMgVkVYIGFuZCB0aGUgTCBhbmQgWFMgcHJlZml4IilcCisgIEVOVU1fRU5UUlkoSUNfVkVYX0xfWEQsICAgICAgICAgICA0LCAgInJlcXVpcmVzIFZFWCBhbmQgdGhlIEwgYW5kIFhEIHByZWZpeCIpXAorICBFTlVNX0VOVFJZKElDX1ZFWF9MX09QU0laRSwgICAgICAgNCwgICJyZXF1aXJlcyBWRVgsIEwsIGFuZCBPcFNpemUiKSAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19WRVhfTF9XLCAgICAgICAgICAgIDQsICAicmVxdWlyZXMgVkVYLCBMIGFuZCBXIikgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfVkVYX0xfV19YUywgICAgICAgICA1LCAgInJlcXVpcmVzIFZFWCwgTCwgVyBhbmQgWFMgcHJlZml4IikgICAgXAorICBFTlVNX0VOVFJZKElDX1ZFWF9MX1dfWEQsICAgICAgICAgNSwgICJyZXF1aXJlcyBWRVgsIEwsIFcgYW5kIFhEIHByZWZpeCIpICAgIFwKKyAgRU5VTV9FTlRSWShJQ19WRVhfTF9XX09QU0laRSwgICAgIDUsICAicmVxdWlyZXMgVkVYLCBMLCBXIGFuZCBPcFNpemUiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWCwgICAgICAgICAgICAgICAxLCAgInJlcXVpcmVzIGFuIEVWRVggcHJlZml4IikgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfWFMsICAgICAgICAgICAgMiwgICJyZXF1aXJlcyBFVkVYIGFuZCB0aGUgWFMgcHJlZml4IikgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX1hELCAgICAgICAgICAgIDIsICAicmVxdWlyZXMgRVZFWCBhbmQgdGhlIFhEIHByZWZpeCIpICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9PUFNJWkUsICAgICAgICAyLCAgInJlcXVpcmVzIEVWRVggYW5kIHRoZSBPcFNpemUgcHJlZml4IikgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfVywgICAgICAgICAgICAgMywgICJyZXF1aXJlcyBFVkVYIGFuZCB0aGUgVyBwcmVmaXgiKSAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX1dfWFMsICAgICAgICAgIDQsICAicmVxdWlyZXMgRVZFWCwgVywgYW5kIFhTIHByZWZpeCIpICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9XX1hELCAgICAgICAgICA0LCAgInJlcXVpcmVzIEVWRVgsIFcsIGFuZCBYRCBwcmVmaXgiKSAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfV19PUFNJWkUsICAgICAgNCwgICJyZXF1aXJlcyBFVkVYLCBXLCBhbmQgT3BTaXplIikgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wsICAgICAgICAgICAgIDMsICAicmVxdWlyZXMgRVZFWCBhbmQgdGhlIEwgcHJlZml4IikgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9YUywgICAgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYIGFuZCB0aGUgTCBhbmQgWFMgcHJlZml4IilcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1hELCAgICAgICAgICA0LCAgInJlcXVpcmVzIEVWRVggYW5kIHRoZSBMIGFuZCBYRCBwcmVmaXgiKVwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfT1BTSVpFLCAgICAgIDQsICAicmVxdWlyZXMgRVZFWCwgTCwgYW5kIE9wU2l6ZSIpICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9XLCAgICAgICAgICAgMywgICJyZXF1aXJlcyBFVkVYLCBMIGFuZCBXIikgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1dfWFMsICAgICAgICA0LCAgInJlcXVpcmVzIEVWRVgsIEwsIFcgYW5kIFhTIHByZWZpeCIpICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfV19YRCwgICAgICAgIDQsICAicmVxdWlyZXMgRVZFWCwgTCwgVyBhbmQgWEQgcHJlZml4IikgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9XX09QU0laRSwgICAgNCwgICJyZXF1aXJlcyBFVkVYLCBMLCBXIGFuZCBPcFNpemUiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMiwgICAgICAgICAgICAzLCAgInJlcXVpcmVzIEVWRVggYW5kIHRoZSBMMiBwcmVmaXgiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9YUywgICAgICAgICA0LCAgInJlcXVpcmVzIEVWRVggYW5kIHRoZSBMMiBhbmQgWFMgcHJlZml4IilcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9YRCwgICAgICAgICA0LCAgInJlcXVpcmVzIEVWRVggYW5kIHRoZSBMMiBhbmQgWEQgcHJlZml4IilcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9PUFNJWkUsICAgICA0LCAgInJlcXVpcmVzIEVWRVgsIEwyLCBhbmQgT3BTaXplIikgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9XLCAgICAgICAgICAzLCAgInJlcXVpcmVzIEVWRVgsIEwyIGFuZCBXIikgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9XX1hTLCAgICAgICA0LCAgInJlcXVpcmVzIEVWRVgsIEwyLCBXIGFuZCBYUyBwcmVmaXgiKSAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9XX1hELCAgICAgICA0LCAgInJlcXVpcmVzIEVWRVgsIEwyLCBXIGFuZCBYRCBwcmVmaXgiKSAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9XX09QU0laRSwgICA0LCAgInJlcXVpcmVzIEVWRVgsIEwyLCBXIGFuZCBPcFNpemUiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9LLCAgICAgICAgICAgICAxLCAgInJlcXVpcmVzIGFuIEVWRVhfSyBwcmVmaXgiKSAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9YU19LLCAgICAgICAgICAyLCAgInJlcXVpcmVzIEVWRVhfSyBhbmQgdGhlIFhTIHByZWZpeCIpICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9YRF9LLCAgICAgICAgICAyLCAgInJlcXVpcmVzIEVWRVhfSyBhbmQgdGhlIFhEIHByZWZpeCIpICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9PUFNJWkVfSywgICAgICAyLCAgInJlcXVpcmVzIEVWRVhfSyBhbmQgdGhlIE9wU2l6ZSBwcmVmaXgiKSBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9XX0ssICAgICAgICAgICAzLCAgInJlcXVpcmVzIEVWRVhfSyBhbmQgdGhlIFcgcHJlZml4IikgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9XX1hTX0ssICAgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfSywgVywgYW5kIFhTIHByZWZpeCIpICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9XX1hEX0ssICAgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfSywgVywgYW5kIFhEIHByZWZpeCIpICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9XX09QU0laRV9LLCAgICA0LCAgInJlcXVpcmVzIEVWRVhfSywgVywgYW5kIE9wU2l6ZSIpICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX0ssICAgICAgICAgICAzLCAgInJlcXVpcmVzIEVWRVhfSyBhbmQgdGhlIEwgcHJlZml4IikgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9YU19LLCAgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0sgYW5kIHRoZSBMIGFuZCBYUyBwcmVmaXgiKVwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfWERfSywgICAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9LIGFuZCB0aGUgTCBhbmQgWEQgcHJlZml4IilcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX09QU0laRV9LLCAgICA0LCAgInJlcXVpcmVzIEVWRVhfSywgTCwgYW5kIE9wU2l6ZSIpICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9XX0ssICAgICAgICAgMywgICJyZXF1aXJlcyBFVkVYX0ssIEwgYW5kIFciKSAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfV19YU19LLCAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9LLCBMLCBXIGFuZCBYUyBwcmVmaXgiKSAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1dfWERfSywgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfSywgTCwgVyBhbmQgWEQgcHJlZml4IikgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9XX09QU0laRV9LLCAgNCwgICJyZXF1aXJlcyBFVkVYX0ssIEwsIFcgYW5kIE9wU2l6ZSIpICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX0ssICAgICAgICAgIDMsICAicmVxdWlyZXMgRVZFWF9LIGFuZCB0aGUgTDIgcHJlZml4IikgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfWFNfSywgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0sgYW5kIHRoZSBMMiBhbmQgWFMgcHJlZml4IilcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9YRF9LLCAgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfSyBhbmQgdGhlIEwyIGFuZCBYRCBwcmVmaXgiKVwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX09QU0laRV9LLCAgIDQsICAicmVxdWlyZXMgRVZFWF9LLCBMMiwgYW5kIE9wU2l6ZSIpICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfV19LLCAgICAgICAgMywgICJyZXF1aXJlcyBFVkVYX0ssIEwyIGFuZCBXIikgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9XX1hTX0ssICAgICA0LCAgInJlcXVpcmVzIEVWRVhfSywgTDIsIFcgYW5kIFhTIHByZWZpeCIpICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX1dfWERfSywgICAgIDQsICAicmVxdWlyZXMgRVZFWF9LLCBMMiwgVyBhbmQgWEQgcHJlZml4IikgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfV19PUFNJWkVfSywgNCwgICJyZXF1aXJlcyBFVkVYX0ssIEwyLCBXIGFuZCBPcFNpemUiKSAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfQiwgICAgICAgICAgICAgMSwgICJyZXF1aXJlcyBhbiBFVkVYX0IgcHJlZml4IikgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfWFNfQiwgICAgICAgICAgMiwgICJyZXF1aXJlcyBFVkVYX0IgYW5kIHRoZSBYUyBwcmVmaXgiKSAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfWERfQiwgICAgICAgICAgMiwgICJyZXF1aXJlcyBFVkVYX0IgYW5kIHRoZSBYRCBwcmVmaXgiKSAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfT1BTSVpFX0IsICAgICAgMiwgICJyZXF1aXJlcyBFVkVYX0IgYW5kIHRoZSBPcFNpemUgcHJlZml4IikgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfV19CLCAgICAgICAgICAgMywgICJyZXF1aXJlcyBFVkVYX0IgYW5kIHRoZSBXIHByZWZpeCIpICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfV19YU19CLCAgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIFcsIGFuZCBYUyBwcmVmaXgiKSAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfV19YRF9CLCAgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIFcsIGFuZCBYRCBwcmVmaXgiKSAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfV19PUFNJWkVfQiwgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIFcsIGFuZCBPcFNpemUiKSAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9CLCAgICAgICAgICAgMywgICJyZXF1aXJlcyBFVkVYX0IgYW5kIHRoZSBMIHByZWZpeCIpICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfWFNfQiwgICAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9CIGFuZCB0aGUgTCBhbmQgWFMgcHJlZml4IilcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1hEX0IsICAgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfQiBhbmQgdGhlIEwgYW5kIFhEIHByZWZpeCIpXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9PUFNJWkVfQiwgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEwsIGFuZCBPcFNpemUiKSAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfV19CLCAgICAgICAgIDMsICAicmVxdWlyZXMgRVZFWF9CLCBMIGFuZCBXIikgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1dfWFNfQiwgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgTCwgVyBhbmQgWFMgcHJlZml4IikgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9XX1hEX0IsICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEwsIFcgYW5kIFhEIHByZWZpeCIpICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfV19PUFNJWkVfQiwgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBMLCBXIGFuZCBPcFNpemUiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9CLCAgICAgICAgICAzLCAgInJlcXVpcmVzIEVWRVhfQiBhbmQgdGhlIEwyIHByZWZpeCIpICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX1hTX0IsICAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9CIGFuZCB0aGUgTDIgYW5kIFhTIHByZWZpeCIpXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfWERfQiwgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IgYW5kIHRoZSBMMiBhbmQgWEQgcHJlZml4IilcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9PUFNJWkVfQiwgICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgTDIsIGFuZCBPcFNpemUiKSAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX1dfQiwgICAgICAgIDMsICAicmVxdWlyZXMgRVZFWF9CLCBMMiBhbmQgVyIpICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfV19YU19CLCAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEwyLCBXIGFuZCBYUyBwcmVmaXgiKSAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9XX1hEX0IsICAgICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgTDIsIFcgYW5kIFhEIHByZWZpeCIpICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX1dfT1BTSVpFX0IsIDQsICAicmVxdWlyZXMgRVZFWF9CLCBMMiwgVyBhbmQgT3BTaXplIikgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfS19CLCAgICAgICAgICAgMSwgICJyZXF1aXJlcyBFVkVYX0IgYW5kIEVWRVhfSyBwcmVmaXgiKSAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9YU19LX0IsICAgICAgICAyLCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LIGFuZCB0aGUgWFMgcHJlZml4IikgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX1hEX0tfQiwgICAgICAgIDIsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0sgYW5kIHRoZSBYRCBwcmVmaXgiKSAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfT1BTSVpFX0tfQiwgICAgMiwgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfSyBhbmQgdGhlIE9wU2l6ZSBwcmVmaXgiKSBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9XX0tfQiwgICAgICAgICAzLCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LIGFuZCB0aGUgVyBwcmVmaXgiKSAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX1dfWFNfS19CLCAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0ssIFcsIGFuZCBYUyBwcmVmaXgiKSAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfV19YRF9LX0IsICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfSywgVywgYW5kIFhEIHByZWZpeCIpICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9XX09QU0laRV9LX0IsICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LLCBXLCBhbmQgT3BTaXplIikgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfS19CLCAgICAgICAgIDMsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0sgYW5kIHRoZSBMIHByZWZpeCIpICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfWFNfS19CLCAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0sgYW5kIHRoZSBMIGFuZCBYUyBwcmVmaXgiKVwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfWERfS19CLCAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0sgYW5kIHRoZSBMIGFuZCBYRCBwcmVmaXgiKVwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfT1BTSVpFX0tfQiwgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0ssIEwsIGFuZCBPcFNpemUiKSAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfV19LX0IsICAgICAgIDMsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0ssIEwgYW5kIFciKSAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfV19YU19LX0IsICAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0ssIEwsIFcgYW5kIFhTIHByZWZpeCIpICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfV19YRF9LX0IsICAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0ssIEwsIFcgYW5kIFhEIHByZWZpeCIpICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfV19PUFNJWkVfS19CLDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0ssIEwsIFcgYW5kIE9wU2l6ZSIpICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX0tfQiwgICAgICAgIDMsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0sgYW5kIHRoZSBMMiBwcmVmaXgiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9YU19LX0IsICAgICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LIGFuZCB0aGUgTDIgYW5kIFhTIHByZWZpeCIpXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfWERfS19CLCAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfSyBhbmQgdGhlIEwyIGFuZCBYRCBwcmVmaXgiKVwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX09QU0laRV9LX0IsIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0ssIEwyLCBhbmQgT3BTaXplIikgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9XX0tfQiwgICAgICAzLCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LLCBMMiBhbmQgVyIpICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfV19YU19LX0IsICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfSywgTDIsIFcgYW5kIFhTIHByZWZpeCIpICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX1dfWERfS19CLCAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0ssIEwyLCBXIGFuZCBYRCBwcmVmaXgiKSAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9XX09QU0laRV9LX0IsNCwgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfSywgTDIsIFcgYW5kIE9wU2l6ZSIpICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0taX0IsICAgICAgICAgICAxLCAgInJlcXVpcmVzIEVWRVhfQiBhbmQgRVZFWF9LWiBwcmVmaXgiKSAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9YU19LWl9CLCAgICAgICAgMiwgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfS1ogYW5kIHRoZSBYUyBwcmVmaXgiKSAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfWERfS1pfQiwgICAgICAgIDIsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0taIGFuZCB0aGUgWEQgcHJlZml4IikgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX09QU0laRV9LWl9CLCAgICAyLCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LWiBhbmQgdGhlIE9wU2l6ZSBwcmVmaXgiKSBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9XX0taX0IsICAgICAgICAgMywgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfS1ogYW5kIHRoZSBXIHByZWZpeCIpICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfV19YU19LWl9CLCAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0taLCBXLCBhbmQgWFMgcHJlZml4IikgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX1dfWERfS1pfQiwgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LWiwgVywgYW5kIFhEIHByZWZpeCIpICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9XX09QU0laRV9LWl9CLCAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfS1osIFcsIGFuZCBPcFNpemUiKSAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9LWl9CLCAgICAgICAgICAgMywgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfS1ogYW5kIHRoZSBMIHByZWZpeCIpICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfWFNfS1pfQiwgICAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0taIGFuZCB0aGUgTCBhbmQgWFMgcHJlZml4IilcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1hEX0taX0IsICAgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LWiBhbmQgdGhlIEwgYW5kIFhEIHByZWZpeCIpXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9PUFNJWkVfS1pfQiwgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfS1osIEwsIGFuZCBPcFNpemUiKSAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfV19LWl9CLCAgICAgICAgIDMsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0taLCBMIGFuZCBXIikgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MX1dfWFNfS1pfQiwgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LWiwgTCwgVyBhbmQgWFMgcHJlZml4IikgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTF9XX1hEX0taX0IsICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfS1osIEwsIFcgYW5kIFhEIHByZWZpeCIpICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfV19PUFNJWkVfS1pfQiwgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0taLCBMLCBXIGFuZCBPcFNpemUiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9LWl9CLCAgICAgICAgICAzLCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LWiBhbmQgdGhlIEwyIHByZWZpeCIpICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX1hTX0taX0IsICAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0taIGFuZCB0aGUgTDIgYW5kIFhTIHByZWZpeCIpXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfWERfS1pfQiwgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfS1ogYW5kIHRoZSBMMiBhbmQgWEQgcHJlZml4IilcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9PUFNJWkVfS1pfQiwgICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LWiwgTDIsIGFuZCBPcFNpemUiKSAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX1dfS1pfQiwgICAgICAgIDMsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0taLCBMMiBhbmQgVyIpICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfV19YU19LWl9CLCAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0IsIEVWRVhfS1osIEwyLCBXIGFuZCBYUyBwcmVmaXgiKSAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9XX1hEX0taX0IsICAgICA0LCAgInJlcXVpcmVzIEVWRVhfQiwgRVZFWF9LWiwgTDIsIFcgYW5kIFhEIHByZWZpeCIpICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX1dfT1BTSVpFX0taX0IsIDQsICAicmVxdWlyZXMgRVZFWF9CLCBFVkVYX0taLCBMMiwgVyBhbmQgT3BTaXplIikgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfS1osICAgICAgICAgICAgIDEsICAicmVxdWlyZXMgYW4gRVZFWF9LWiBwcmVmaXgiKSAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9YU19LWiwgICAgICAgICAgMiwgICJyZXF1aXJlcyBFVkVYX0taIGFuZCB0aGUgWFMgcHJlZml4IikgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX1hEX0taLCAgICAgICAgICAyLCAgInJlcXVpcmVzIEVWRVhfS1ogYW5kIHRoZSBYRCBwcmVmaXgiKSAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfT1BTSVpFX0taLCAgICAgIDIsICAicmVxdWlyZXMgRVZFWF9LWiBhbmQgdGhlIE9wU2l6ZSBwcmVmaXgiKSBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9XX0taLCAgICAgICAgICAgMywgICJyZXF1aXJlcyBFVkVYX0taIGFuZCB0aGUgVyBwcmVmaXgiKSAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX1dfWFNfS1osICAgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfS1osIFcsIGFuZCBYUyBwcmVmaXgiKSAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfV19YRF9LWiwgICAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9LWiwgVywgYW5kIFhEIHByZWZpeCIpICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9XX09QU0laRV9LWiwgICAgNCwgICJyZXF1aXJlcyBFVkVYX0taLCBXLCBhbmQgT3BTaXplIikgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfS1osICAgICAgICAgICAzLCAgInJlcXVpcmVzIEVWRVhfS1ogYW5kIHRoZSBMIHByZWZpeCIpICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfWFNfS1osICAgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfS1ogYW5kIHRoZSBMIGFuZCBYUyBwcmVmaXgiKVwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfWERfS1osICAgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfS1ogYW5kIHRoZSBMIGFuZCBYRCBwcmVmaXgiKVwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfT1BTSVpFX0taLCAgICA0LCAgInJlcXVpcmVzIEVWRVhfS1osIEwsIGFuZCBPcFNpemUiKSAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfV19LWiwgICAgICAgICAzLCAgInJlcXVpcmVzIEVWRVhfS1osIEwgYW5kIFciKSAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfV19YU19LWiwgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfS1osIEwsIFcgYW5kIFhTIHByZWZpeCIpICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfV19YRF9LWiwgICAgICA0LCAgInJlcXVpcmVzIEVWRVhfS1osIEwsIFcgYW5kIFhEIHByZWZpeCIpICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0xfV19PUFNJWkVfS1osICA0LCAgInJlcXVpcmVzIEVWRVhfS1osIEwsIFcgYW5kIE9wU2l6ZSIpICAgICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX0taLCAgICAgICAgICAzLCAgInJlcXVpcmVzIEVWRVhfS1ogYW5kIHRoZSBMMiBwcmVmaXgiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9YU19LWiwgICAgICAgNCwgICJyZXF1aXJlcyBFVkVYX0taIGFuZCB0aGUgTDIgYW5kIFhTIHByZWZpeCIpXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfWERfS1osICAgICAgIDQsICAicmVxdWlyZXMgRVZFWF9LWiBhbmQgdGhlIEwyIGFuZCBYRCBwcmVmaXgiKVwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX09QU0laRV9LWiwgICA0LCAgInJlcXVpcmVzIEVWRVhfS1osIEwyLCBhbmQgT3BTaXplIikgICAgICAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9XX0taLCAgICAgICAgMywgICJyZXF1aXJlcyBFVkVYX0taLCBMMiBhbmQgVyIpICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKElDX0VWRVhfTDJfV19YU19LWiwgICAgIDQsICAicmVxdWlyZXMgRVZFWF9LWiwgTDIsIFcgYW5kIFhTIHByZWZpeCIpICAgIFwKKyAgRU5VTV9FTlRSWShJQ19FVkVYX0wyX1dfWERfS1osICAgICA0LCAgInJlcXVpcmVzIEVWRVhfS1osIEwyLCBXIGFuZCBYRCBwcmVmaXgiKSAgICBcCisgIEVOVU1fRU5UUlkoSUNfRVZFWF9MMl9XX09QU0laRV9LWiwgNCwgICJyZXF1aXJlcyBFVkVYX0taLCBMMiwgVyBhbmQgT3BTaXplIikKKworI2RlZmluZSBFTlVNX0VOVFJZKG4sIHIsIGQpIG4sCitlbnVtIEluc3RydWN0aW9uQ29udGV4dCB7CisgIElOU1RSVUNUSU9OX0NPTlRFWFRTCisgIElDX21heAorfTsKKyN1bmRlZiBFTlVNX0VOVFJZCisKKy8vIE9wY29kZSB0eXBlcywgd2hpY2ggZGV0ZXJtaW5lIHdoaWNoIGRlY29kZSB0YWJsZSB0byB1c2UsIGJvdGggaW4gdGhlIEludGVsCisvLyBtYW51YWwgYW5kIGFsc28gZm9yIHRoZSBkZWNvZGVyLgorZW51bSBPcGNvZGVUeXBlIHsKKyAgT05FQllURSAgICAgICA9IDAsCisgIFRXT0JZVEUgICAgICAgPSAxLAorICBUSFJFRUJZVEVfMzggID0gMiwKKyAgVEhSRUVCWVRFXzNBICA9IDMsCisgIFhPUDhfTUFQICAgICAgPSA0LAorICBYT1A5X01BUCAgICAgID0gNSwKKyAgWE9QQV9NQVAgICAgICA9IDYsCisgIFRIUkVFRE5PV19NQVAgPSA3Cit9OworCisvLyBUaGUgZm9sbG93aW5nIHN0cnVjdHMgYXJlIHVzZWQgZm9yIHRoZSBoaWVyYXJjaGljYWwgZGVjb2RlIHRhYmxlLiAgQWZ0ZXIKKy8vIGRldGVybWluaW5nIHRoZSBpbnN0cnVjdGlvbidzIGNsYXNzIChpLmUuLCB3aGljaCBJQ18qIGNvbnN0YW50IGFwcGxpZXMgdG8KKy8vIGl0KSwgdGhlIGRlY29kZXIgcmVhZHMgdGhlIG9wY29kZS4gIFNvbWUgaW5zdHJ1Y3Rpb25zIHJlcXVpcmUgc3BlY2lmaWMKKy8vIHZhbHVlcyBvZiB0aGUgTW9kUi9NIGJ5dGUsIHNvIHRoZSBNb2RSL00gYnl0ZSBpbmRleGVzIGludG8gdGhlIGZpbmFsIHRhYmxlLgorLy8KKy8vIElmIGEgTW9kUi9NIGJ5dGUgaXMgbm90IHJlcXVpcmVkLCAicmVxdWlyZWQiIGlzIGxlZnQgdW5zZXQsIGFuZCB0aGUgdmFsdWVzCisvLyBmb3IgZWFjaCBpbnN0cnVjdGlvbklEIGFyZSBpZGVudGljYWwuCit0eXBlZGVmIHVpbnQxNl90IEluc3RyVUlEOworCisvLyBNb2RSTURlY2lzaW9uVHlwZSAtIGRlc2NyaWJlcyB0aGUgdHlwZSBvZiBNb2RSL00gZGVjaXNpb24sIGFsbG93aW5nIHRoZQorLy8gY29uc3VtZXIgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZW50cmllcyBpbiBpdC4KKy8vCisvLyBNT0RSTV9PTkVFTlRSWSAtIE5vIG1hdHRlciB3aGF0IHRoZSB2YWx1ZSBvZiB0aGUgTW9kUi9NIGJ5dGUgaXMsIHRoZSBkZWNvZGVkCisvLyAgICAgICAgICAgICAgICAgIGluc3RydWN0aW9uIGlzIHRoZSBzYW1lLgorLy8gTU9EUk1fU1BMSVRSTSAgLSBJZiB0aGUgTW9kUi9NIGJ5dGUgaXMgYmV0d2VlbiAweDAwIGFuZCAweGJmLCB0aGUgb3Bjb2RlCisvLyAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIG9uZSBpbnN0cnVjdGlvbjsgb3RoZXJ3aXNlLCBpdCBjb3JyZXNwb25kcyB0bworLy8gICAgICAgICAgICAgICAgICBhIGRpZmZlcmVudCBpbnN0cnVjdGlvbi4KKy8vIE1PRFJNX1NQTElUTUlTQy0gSWYgdGhlIE1vZFIvTSBieXRlIGlzIGJldHdlZW4gMHgwMCBhbmQgMHhiZiwgTW9kUi9NIGJ5dGUKKy8vICAgICAgICAgICAgICAgICAgZGl2aWRlZCBieSA4IGlzIHVzZWQgdG8gc2VsZWN0IGluc3RydWN0aW9uOyBvdGhlcndpc2UsIGVhY2gKKy8vICAgICAgICAgICAgICAgICAgdmFsdWUgb2YgdGhlIE1vZFIvTSBieXRlIGNvdWxkIGNvcnJlc3BvbmQgdG8gYSBkaWZmZXJlbnQKKy8vICAgICAgICAgICAgICAgICAgaW5zdHJ1Y3Rpb24uCisvLyBNT0RSTV9TUExJVFJFRyAtIE1vZFIvTSBieXRlIGRpdmlkZWQgYnkgOCBpcyB1c2VkIHRvIHNlbGVjdCBpbnN0cnVjdGlvbi4gVGhpcworLy8gICAgICAgICAgICAgICAgICBjb3JyZXNwb25kcyB0byBpbnN0cnVjdGlvbnMgdGhhdCB1c2UgcmVnIGZpZWxkIGFzIG9wY29kZQorLy8gTU9EUk1fRlVMTCAgICAgLSBQb3RlbnRpYWxseSwgZWFjaCB2YWx1ZSBvZiB0aGUgTW9kUi9NIGJ5dGUgY291bGQgY29ycmVzcG9uZAorLy8gICAgICAgICAgICAgICAgICB0byBhIGRpZmZlcmVudCBpbnN0cnVjdGlvbi4KKyNkZWZpbmUgTU9EUk1UWVBFUyAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShNT0RSTV9PTkVFTlRSWSkgIFwKKyAgRU5VTV9FTlRSWShNT0RSTV9TUExJVFJNKSAgIFwKKyAgRU5VTV9FTlRSWShNT0RSTV9TUExJVE1JU0MpICBcCisgIEVOVU1fRU5UUlkoTU9EUk1fU1BMSVRSRUcpICBcCisgIEVOVU1fRU5UUlkoTU9EUk1fRlVMTCkKKworI2RlZmluZSBFTlVNX0VOVFJZKG4pIG4sCitlbnVtIE1vZFJNRGVjaXNpb25UeXBlIHsKKyAgTU9EUk1UWVBFUworICBNT0RSTV9tYXgKK307CisjdW5kZWYgRU5VTV9FTlRSWQorCisjZGVmaW5lIENBU0VfRU5DT0RJTkdfUk0gICAgIFwKKyAgICBjYXNlIEVOQ09ESU5HX1JNOiAgICAgICAgXAorICAgIGNhc2UgRU5DT0RJTkdfUk1fQ0QyOiAgICBcCisgICAgY2FzZSBFTkNPRElOR19STV9DRDQ6ICAgIFwKKyAgICBjYXNlIEVOQ09ESU5HX1JNX0NEODogICAgXAorICAgIGNhc2UgRU5DT0RJTkdfUk1fQ0QxNjogICBcCisgICAgY2FzZSBFTkNPRElOR19STV9DRDMyOiAgIFwKKyAgICBjYXNlIEVOQ09ESU5HX1JNX0NENjQKKworI2RlZmluZSBDQVNFX0VOQ09ESU5HX1ZTSUIgICBcCisgICAgY2FzZSBFTkNPRElOR19WU0lCOiAgICAgIFwKKyAgICBjYXNlIEVOQ09ESU5HX1ZTSUJfQ0QyOiAgXAorICAgIGNhc2UgRU5DT0RJTkdfVlNJQl9DRDQ6ICBcCisgICAgY2FzZSBFTkNPRElOR19WU0lCX0NEODogIFwKKyAgICBjYXNlIEVOQ09ESU5HX1ZTSUJfQ0QxNjogXAorICAgIGNhc2UgRU5DT0RJTkdfVlNJQl9DRDMyOiBcCisgICAgY2FzZSBFTkNPRElOR19WU0lCX0NENjQKKworLy8gUGh5c2ljYWwgZW5jb2RpbmdzIG9mIGluc3RydWN0aW9uIG9wZXJhbmRzLgorI2RlZmluZSBFTkNPRElOR1MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19OT05FLCAgICIiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfUkVHLCAgICAiUmVnaXN0ZXIgb3BlcmFuZCBpbiBNb2RSL00gYnl0ZS4iKSAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX1JNLCAgICAgIlIvTSBvcGVyYW5kIGluIE1vZFIvTSBieXRlLiIpICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19STV9DRDIsICJSL00gb3BlcmFuZCB3aXRoIENEaXNwIHNjYWxpbmcgb2YgMiIpICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfUk1fQ0Q0LCAiUi9NIG9wZXJhbmQgd2l0aCBDRGlzcCBzY2FsaW5nIG9mIDQiKSAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX1JNX0NEOCwgIlIvTSBvcGVyYW5kIHdpdGggQ0Rpc3Agc2NhbGluZyBvZiA4IikgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19STV9DRDE2LCJSL00gb3BlcmFuZCB3aXRoIENEaXNwIHNjYWxpbmcgb2YgMTYiKSAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfUk1fQ0QzMiwiUi9NIG9wZXJhbmQgd2l0aCBDRGlzcCBzY2FsaW5nIG9mIDMyIikgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX1JNX0NENjQsIlIvTSBvcGVyYW5kIHdpdGggQ0Rpc3Agc2NhbGluZyBvZiA2NCIpICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19WU0lCLCAgICAgIlZTSUIgb3BlcmFuZCBpbiBNb2RSL00gYnl0ZS4iKSAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfVlNJQl9DRDIsICJWU0lCIG9wZXJhbmQgd2l0aCBDRGlzcCBzY2FsaW5nIG9mIDIiKSAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX1ZTSUJfQ0Q0LCAiVlNJQiBvcGVyYW5kIHdpdGggQ0Rpc3Agc2NhbGluZyBvZiA0IikgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19WU0lCX0NEOCwgIlZTSUIgb3BlcmFuZCB3aXRoIENEaXNwIHNjYWxpbmcgb2YgOCIpICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfVlNJQl9DRDE2LCJWU0lCIG9wZXJhbmQgd2l0aCBDRGlzcCBzY2FsaW5nIG9mIDE2IikgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX1ZTSUJfQ0QzMiwiVlNJQiBvcGVyYW5kIHdpdGggQ0Rpc3Agc2NhbGluZyBvZiAzMiIpICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19WU0lCX0NENjQsIlZTSUIgb3BlcmFuZCB3aXRoIENEaXNwIHNjYWxpbmcgb2YgNjQiKSAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfVlZWViwgICAiUmVnaXN0ZXIgb3BlcmFuZCBpbiBWRVgudnZ2diBieXRlLiIpICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX1dSSVRFTUFTSywgIlJlZ2lzdGVyIG9wZXJhbmQgaW4gRVZFWC5hYWEgYnl0ZS4iKSAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19JQiwgICAgICIxLWJ5dGUgaW1tZWRpYXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfSVcsICAgICAiMi1ieXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX0lELCAgICAgIjQtYnl0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19JTywgICAgICI4LWJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfUkIsICAgICAiKEFMLi5ESUwsIFI4TC4uUjE1TCkgUmVnaXN0ZXIgY29kZSBhZGRlZCB0byAiICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBvcGNvZGUgYnl0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19SVywgICAgICIoQVguLkRJLCBSOFcuLlIxNVcpIikgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfUkQsICAgICAiKEVBWC4uRURJLCBSOEQuLlIxNUQpIikgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX1JPLCAgICAgIihSQVguLlJESSwgUjguLlIxNSkiKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19GUCwgICAgICJQb3NpdGlvbiBvbiBmbG9hdGluZy1wb2ludCBzdGFjayBpbiBNb2RSL00gIiAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYnl0ZS4iKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19JdiwgICAgICJJbW1lZGlhdGUgb2Ygb3BlcmFuZCBzaXplIikgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfSWEsICAgICAiSW1tZWRpYXRlIG9mIGFkZHJlc3Mgc2l6ZSIpICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX0lSQywgICAgIkltbWVkaWF0ZSBmb3Igc3RhdGljIHJvdW5kaW5nIGNvbnRyb2wiKSAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShFTkNPRElOR19SdiwgICAgICJSZWdpc3RlciBjb2RlIG9mIG9wZXJhbmQgc2l6ZSBhZGRlZCB0byB0aGUgIiAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3Bjb2RlIGJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX0RVUCwgICAgIkR1cGxpY2F0ZSBvZiBhbm90aGVyIG9wZXJhbmQ7IElEIGlzIGVuY29kZWQgIiAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiB0eXBlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoRU5DT0RJTkdfU0ksICAgICAiU291cmNlIGluZGV4OyBlbmNvZGVkIGluIE9wU2l6ZS9BZHNpemUgcHJlZml4IikgXAorICBFTlVNX0VOVFJZKEVOQ09ESU5HX0RJLCAgICAgIkRlc3RpbmF0aW9uIGluZGV4OyBlbmNvZGVkIGluIHByZWZpeGVzIikKKworI2RlZmluZSBFTlVNX0VOVFJZKG4sIGQpIG4sCitlbnVtIE9wZXJhbmRFbmNvZGluZyB7CisgIEVOQ09ESU5HUworICBFTkNPRElOR19tYXgKK307CisjdW5kZWYgRU5VTV9FTlRSWQorCisvLyBTZW1hbnRpYyBpbnRlcnByZXRhdGlvbnMgb2YgaW5zdHJ1Y3Rpb24gb3BlcmFuZHMuCisjZGVmaW5lIFRZUEVTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfTk9ORSwgICAgICAgIiIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX1JFTCwgICAgICAgICJpbW1lZGlhdGUgYWRkcmVzcyIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9SOCwgICAgICAgICAiMS1ieXRlIHJlZ2lzdGVyIG9wZXJhbmQiKSAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfUjE2LCAgICAgICAgIjItYnl0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX1IzMiwgICAgICAgICI0LWJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9SNjQsICAgICAgICAiOC1ieXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfSU1NLCAgICAgICAgImltbWVkaWF0ZSBvcGVyYW5kIikgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfSU1NMywgICAgICAgIjEtYnl0ZSBpbW1lZGlhdGUgb3BlcmFuZCBiZXR3ZWVuIDAgYW5kIDciKSAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX0lNTTUsICAgICAgICIxLWJ5dGUgaW1tZWRpYXRlIG9wZXJhbmQgYmV0d2VlbiAwIGFuZCAzMSIpICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9BVlg1MTJJQ0MsICAiMS1ieXRlIGltbWVkaWF0ZSBvcGVyYW5kIGZvciBBVlg1MTIgaWNtcCIpICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfVUlNTTgsICAgICAgIjEtYnl0ZSB1bnNpZ25lZCBpbW1lZGlhdGUgb3BlcmFuZCIpICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX00sICAgICAgICAgICJNZW1vcnkgb3BlcmFuZCIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9NVlNJQlgsICAgICAiTWVtb3J5IG9wZXJhbmQgdXNpbmcgWE1NIGluZGV4IikgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfTVZTSUJZLCAgICAgIk1lbW9yeSBvcGVyYW5kIHVzaW5nIFlNTSBpbmRleCIpICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX01WU0lCWiwgICAgICJNZW1vcnkgb3BlcmFuZCB1c2luZyBaTU0gaW5kZXgiKSAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9TUkNJRFgsICAgICAibWVtb3J5IGF0IHNvdXJjZSBpbmRleCIpICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfRFNUSURYLCAgICAgIm1lbW9yeSBhdCBkZXN0aW5hdGlvbiBpbmRleCIpICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX01PRkZTLCAgICAgICJtZW1vcnkgb2Zmc2V0IChyZWxhdGl2ZSB0byBzZWdtZW50IGJhc2UpIikgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9TVCwgICAgICAgICAiUG9zaXRpb24gb24gdGhlIGZsb2F0aW5nLXBvaW50IHN0YWNrIikgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfTU02NCwgICAgICAgIjgtYnl0ZSBNTVggcmVnaXN0ZXIiKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX1hNTSwgICAgICAgICIxNi1ieXRlIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9ZTU0sICAgICAgICAiMzItYnl0ZSIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfWk1NLCAgICAgICAgIjY0LWJ5dGUiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX1ZLLCAgICAgICAgICJtYXNrIHJlZ2lzdGVyIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9TRUdNRU5UUkVHLCAiU2VnbWVudCByZWdpc3RlciBvcGVyYW5kIikgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfREVCVUdSRUcsICAgIkRlYnVnIHJlZ2lzdGVyIG9wZXJhbmQiKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX0NPTlRST0xSRUcsICJDb250cm9sIHJlZ2lzdGVyIG9wZXJhbmQiKSAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9CTkRSLCAgICAgICAiTVBYIGJvdW5kcyByZWdpc3RlciIpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX1J2LCAgICAgICAgICJSZWdpc3RlciBvcGVyYW5kIG9mIG9wZXJhbmQgc2l6ZSIpICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9SRUx2LCAgICAgICAiSW1tZWRpYXRlIGFkZHJlc3Mgb2Ygb3BlcmFuZCBzaXplIikgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfRFVQMCwgICAgICAgIkR1cGxpY2F0ZSBvZiBvcGVyYW5kIDAiKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX0RVUDEsICAgICAgICJvcGVyYW5kIDEiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEVOVU1fRU5UUlkoVFlQRV9EVVAyLCAgICAgICAib3BlcmFuZCAyIikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFTlVNX0VOVFJZKFRZUEVfRFVQMywgICAgICAgIm9wZXJhbmQgMyIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRU5VTV9FTlRSWShUWVBFX0RVUDQsICAgICAgICJvcGVyYW5kIDQiKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKyNkZWZpbmUgRU5VTV9FTlRSWShuLCBkKSBuLAorZW51bSBPcGVyYW5kVHlwZSB7CisgIFRZUEVTCisgIFRZUEVfbWF4Cit9OworI3VuZGVmIEVOVU1fRU5UUlkKKworLy8vIFxicmllZiBUaGUgc3BlY2lmaWNhdGlvbiBmb3IgaG93IHRvIGV4dHJhY3QgYW5kIGludGVycHJldCBvbmUgb3BlcmFuZC4KK3N0cnVjdCBPcGVyYW5kU3BlY2lmaWVyIHsKKyAgdWludDhfdCBlbmNvZGluZzsKKyAgdWludDhfdCB0eXBlOworfTsKKworc3RhdGljIGNvbnN0IHVuc2lnbmVkIFg4Nl9NQVhfT1BFUkFORFMgPSA2OworCisvLy8gRGVjb2RpbmcgbW9kZSBmb3IgdGhlIEludGVsIGRpc2Fzc2VtYmxlci4gIDE2LWJpdCwgMzItYml0LCBhbmQgNjQtYml0IG1vZGUKKy8vLyBhcmUgc3VwcG9ydGVkLCBhbmQgcmVwcmVzZW50IHJlYWwgbW9kZSwgSUEtMzJlLCBhbmQgSUEtMzJlIGluIDY0LWJpdCBtb2RlLAorLy8vIHJlc3BlY3RpdmVseS4KK2VudW0gRGlzYXNzZW1ibGVyTW9kZSB7CisgIE1PREVfMTZCSVQsCisgIE1PREVfMzJCSVQsCisgIE1PREVfNjRCSVQKK307CisKK30gLy8gbmFtZXNwYWNlIFg4NkRpc2Fzc2VtYmxlcgorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9YODZUYXJnZXRQYXJzZXIuZGVmIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1g4NlRhcmdldFBhcnNlci5kZWYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM4YzU3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9YODZUYXJnZXRQYXJzZXIuZGVmCkBAIC0wLDAgKzEsMTU1IEBACisvLz09PS0gWDg2VGFyZ2V0UGFyc2VyLmRlZiAtIFg4NiB0YXJnZXQgcGFyc2luZyBkZWZpbmVzIC0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyBkZWZpbmVzIHRvIGJ1aWxkIHVwIHRoZSBYODYgdGFyZ2V0IHBhcnNlcidzIGxvZ2ljLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIE5PVEU6IE5PIElOQ0xVREUgR1VBUkQgREVTSVJFRCEKKworI2lmbmRlZiBYODZfVkVORE9SCisjZGVmaW5lIFg4Nl9WRU5ET1IoRU5VTSwgU1RSKQorI2VuZGlmCitYODZfVkVORE9SKFZFTkRPUl9JTlRFTCwgImludGVsIikKK1g4Nl9WRU5ET1IoVkVORE9SX0FNRCwgICAiYW1kIikKKyN1bmRlZiBYODZfVkVORE9SCisKKy8vIFRoaXMgbWFjcm8gaXMgdXNlZCB0byBpbXBsZW1lbnQgQ1BVIHR5cGVzIHRoYXQgaGF2ZSBhbiBhbGlhcy4gQXMgb2Ygbm93CisvLyB0aGVyZSBpcyBvbmx5IGV2ZXIgb25lIGFsaWFzLgorI2lmbmRlZiBYODZfQ1BVX1RZUEVfQ09NUEFUX1dJVEhfQUxJQVMKKyNkZWZpbmUgWDg2X0NQVV9UWVBFX0NPTVBBVF9XSVRIX0FMSUFTKEFSQ0hOQU1FLCBFTlVNLCBTVFIsIEFMSUFTKSBYODZfQ1BVX1RZUEVfQ09NUEFUKEFSQ0hOQU1FLCBFTlVNLCBTVFIpCisjZW5kaWYKKworLy8gVGhpcyBtYWNybyBpcyB1c2VkIGZvciBjcHUgdHlwZXMgcHJlc2VudCBpbiBjb21waWxlci1ydC9saWJnY2MuCisjaWZuZGVmIFg4Nl9DUFVfVFlQRV9DT01QQVQKKyNkZWZpbmUgWDg2X0NQVV9UWVBFX0NPTVBBVChBUkNITkFNRSwgRU5VTSwgU1RSKSBYODZfQ1BVX1RZUEUoQVJDSE5BTUUsIEVOVU0pCisjZW5kaWYKKworI2lmbmRlZiBYODZfQ1BVX1RZUEUKKyNkZWZpbmUgWDg2X0NQVV9UWVBFKEFSQ0hOQU1FLCBFTlVNKQorI2VuZGlmCitYODZfQ1BVX1RZUEVfQ09NUEFUX1dJVEhfQUxJQVMoImJvbm5lbGwiLCAgICBJTlRFTF9CT05ORUxMLCAgICAiYm9ubmVsbCIsICJhdG9tIikKK1g4Nl9DUFVfVFlQRV9DT01QQVQgICAgICAgICAgICgiY29yZTIiLCAgICAgIElOVEVMX0NPUkUyLCAgICAgICJjb3JlMiIpCitYODZfQ1BVX1RZUEVfQ09NUEFUICAgICAgICAgICAoIm5laGFsZW0iLCAgICBJTlRFTF9DT1JFSTcsICAgICAiY29yZWk3IikKK1g4Nl9DUFVfVFlQRV9DT01QQVRfV0lUSF9BTElBUygiYW1kZmFtMTAiLCAgIEFNREZBTTEwSCwgICAgICAgICJhbWRmYW0xMGgiLCAiYW1kZmFtMTAiKQorWDg2X0NQVV9UWVBFX0NPTVBBVF9XSVRIX0FMSUFTKCJiZHZlcjEiLCAgICAgQU1ERkFNMTVILCAgICAgICAgImFtZGZhbTE1aCIsICJhbWRmYW0xNSIpCitYODZfQ1BVX1RZUEVfQ09NUEFUX1dJVEhfQUxJQVMoInNpbHZlcm1vbnQiLCBJTlRFTF9TSUxWRVJNT05ULCAic2lsdmVybW9udCIsICJzbG0iKQorWDg2X0NQVV9UWVBFX0NPTVBBVCAgICAgICAgICAgKCJrbmwiLCAgICAgICAgSU5URUxfS05MLCAgICAgICAgImtubCIpCitYODZfQ1BVX1RZUEVfQ09NUEFUICAgICAgICAgICAoImJ0dmVyMSIsICAgICBBTURfQlRWRVIxLCAgICAgICAiYnR2ZXIxIikKK1g4Nl9DUFVfVFlQRV9DT01QQVQgICAgICAgICAgICgiYnR2ZXIyIiwgICAgIEFNRF9CVFZFUjIsICAgICAgICJidHZlcjIiKQorWDg2X0NQVV9UWVBFX0NPTVBBVCAgICAgICAgICAgKCJ6bnZlcjEiLCAgICAgQU1ERkFNMTdILCAgICAgICAgImFtZGZhbTE3aCIpCitYODZfQ1BVX1RZUEVfQ09NUEFUICAgICAgICAgICAoImtubSIsICAgICAgICBJTlRFTF9LTk0sICAgICAgICAia25tIikKKy8vIEVudHJpZXMgYmVsb3cgdGhpcyBhcmUgbm90IGluIGxpYmdjYy9jb21waWxlci1ydC4KK1g4Nl9DUFVfVFlQRSAgICAgICAgICAgICAgICAgICgiaTM4NiIsICAgICAgICBJTlRFTF9pMzg2KQorWDg2X0NQVV9UWVBFICAgICAgICAgICAgICAgICAgKCJpNDg2IiwgICAgICAgIElOVEVMX2k0ODYpCitYODZfQ1BVX1RZUEUgICAgICAgICAgICAgICAgICAoInBlbnRpdW0iLCAgICAgSU5URUxfUEVOVElVTSkKK1g4Nl9DUFVfVFlQRSAgICAgICAgICAgICAgICAgICgicGVudGl1bS1tbXgiLCBJTlRFTF9QRU5USVVNX01NWCkKK1g4Nl9DUFVfVFlQRSAgICAgICAgICAgICAgICAgICgicGVudGl1bXBybyIsICBJTlRFTF9QRU5USVVNX1BSTykKK1g4Nl9DUFVfVFlQRSAgICAgICAgICAgICAgICAgICgicGVudGl1bTIiLCAgICBJTlRFTF9QRU5USVVNX0lJKQorWDg2X0NQVV9UWVBFICAgICAgICAgICAgICAgICAgKCJwZW50aXVtMyIsICAgIElOVEVMX1BFTlRJVU1fSUlJKQorWDg2X0NQVV9UWVBFICAgICAgICAgICAgICAgICAgKCJwZW50aXVtNCIsICAgIElOVEVMX1BFTlRJVU1fSVYpCitYODZfQ1BVX1RZUEUgICAgICAgICAgICAgICAgICAoInBlbnRpdW0tbSIsICAgSU5URUxfUEVOVElVTV9NKQorWDg2X0NQVV9UWVBFICAgICAgICAgICAgICAgICAgKCJ5b25haCIsICAgICAgIElOVEVMX0NPUkVfRFVPKQorWDg2X0NQVV9UWVBFICAgICAgICAgICAgICAgICAgKCJub2NvbmEiLCAgICAgIElOVEVMX05PQ09OQSkKK1g4Nl9DUFVfVFlQRSAgICAgICAgICAgICAgICAgICgicHJlc2NvdHQiLCAgICBJTlRFTF9QUkVTQ09UVCkKK1g4Nl9DUFVfVFlQRSAgICAgICAgICAgICAgICAgICgiaTQ4NiIsICAgICAgICBBTURfaTQ4NikKK1g4Nl9DUFVfVFlQRSAgICAgICAgICAgICAgICAgICgicGVudGl1bSIsICAgICBBTURQRU5USVVNKQorWDg2X0NQVV9UWVBFICAgICAgICAgICAgICAgICAgKCJhdGhsb24iLCAgICAgIEFNRF9BVEhMT04pCitYODZfQ1BVX1RZUEUgICAgICAgICAgICAgICAgICAoImF0aGxvbi14cCIsICAgQU1EX0FUSExPTl9YUCkKK1g4Nl9DUFVfVFlQRSAgICAgICAgICAgICAgICAgICgiazgiLCAgICAgICAgICBBTURfSzgpCitYODZfQ1BVX1RZUEUgICAgICAgICAgICAgICAgICAoIms4LXNzZTMiLCAgICAgQU1EX0s4U1NFMykKK1g4Nl9DUFVfVFlQRSAgICAgICAgICAgICAgICAgICgiZ29sZG1vbnQiLCAgICBJTlRFTF9HT0xETU9OVCkKKyN1bmRlZiBYODZfQ1BVX1RZUEVfQ09NUEFUX1dJVEhfQUxJQVMKKyN1bmRlZiBYODZfQ1BVX1RZUEVfQ09NUEFUCisjdW5kZWYgWDg2X0NQVV9UWVBFCisKKy8vIFRoaXMgbWFjcm8gaXMgdXNlZCBmb3IgY3B1IHN1YnR5cGVzIHByZXNlbnQgaW4gY29tcGlsZXItcnQvbGliZ2NjLgorI2lmbmRlZiBYODZfQ1BVX1NVQlRZUEVfQ09NUEFUCisjZGVmaW5lIFg4Nl9DUFVfU1VCVFlQRV9DT01QQVQoQVJDSE5BTUUsIEVOVU0sIFNUUikgWDg2X0NQVV9TVUJUWVBFKEFSQ0hOQU1FLCBFTlVNKQorI2VuZGlmCisKKyNpZm5kZWYgWDg2X0NQVV9TVUJUWVBFCisjZGVmaW5lIFg4Nl9DUFVfU1VCVFlQRShBUkNITkFNRSwgRU5VTSkKKyNlbmRpZgorCitYODZfQ1BVX1NVQlRZUEVfQ09NUEFUKCJuZWhhbGVtIiwgICAgICAgIElOVEVMX0NPUkVJN19ORUhBTEVNLCAgICAgICAgIm5laGFsZW0iKQorWDg2X0NQVV9TVUJUWVBFX0NPTVBBVCgid2VzdG1lcmUiLCAgICAgICBJTlRFTF9DT1JFSTdfV0VTVE1FUkUsICAgICAgICJ3ZXN0bWVyZSIpCitYODZfQ1BVX1NVQlRZUEVfQ09NUEFUKCJzYW5keWJyaWRnZSIsICAgIElOVEVMX0NPUkVJN19TQU5EWUJSSURHRSwgICAgInNhbmR5YnJpZGdlIikKK1g4Nl9DUFVfU1VCVFlQRV9DT01QQVQoImFtZGZhbTEwIiwgICAgICAgQU1ERkFNMTBIX0JBUkNFTE9OQSwgICAgICAgICAiYmFyY2Vsb25hIikKK1g4Nl9DUFVfU1VCVFlQRV9DT01QQVQoImFtZGZhbTEwIiwgICAgICAgQU1ERkFNMTBIX1NIQU5HSEFJLCAgICAgICAgICAic2hhbmdoYWkiKQorWDg2X0NQVV9TVUJUWVBFX0NPTVBBVCgiYW1kZmFtMTAiLCAgICAgICBBTURGQU0xMEhfSVNUQU5CVUwsICAgICAgICAgICJpc3RhbmJ1bCIpCitYODZfQ1BVX1NVQlRZUEVfQ09NUEFUKCJiZHZlcjEiLCAgICAgICAgIEFNREZBTTE1SF9CRFZFUjEsICAgICAgICAgICAgImJkdmVyMSIpCitYODZfQ1BVX1NVQlRZUEVfQ09NUEFUKCJiZHZlcjIiLCAgICAgICAgIEFNREZBTTE1SF9CRFZFUjIsICAgICAgICAgICAgImJkdmVyMiIpCitYODZfQ1BVX1NVQlRZUEVfQ09NUEFUKCJiZHZlcjMiLCAgICAgICAgIEFNREZBTTE1SF9CRFZFUjMsICAgICAgICAgICAgImJkdmVyMyIpCitYODZfQ1BVX1NVQlRZUEVfQ09NUEFUKCJiZHZlcjQiLCAgICAgICAgIEFNREZBTTE1SF9CRFZFUjQsICAgICAgICAgICAgImJkdmVyNCIpCitYODZfQ1BVX1NVQlRZUEVfQ09NUEFUKCJ6bnZlcjEiLCAgICAgICAgIEFNREZBTTE3SF9aTlZFUjEsICAgICAgICAgICAgInpudmVyMSIpCitYODZfQ1BVX1NVQlRZUEVfQ09NUEFUKCJpdnlicmlkZ2UiLCAgICAgIElOVEVMX0NPUkVJN19JVllCUklER0UsICAgICAgIml2eWJyaWRnZSIpCitYODZfQ1BVX1NVQlRZUEVfQ09NUEFUKCJoYXN3ZWxsIiwgICAgICAgIElOVEVMX0NPUkVJN19IQVNXRUxMLCAgICAgICAgImhhc3dlbGwiKQorWDg2X0NQVV9TVUJUWVBFX0NPTVBBVCgiYnJvYWR3ZWxsIiwgICAgICBJTlRFTF9DT1JFSTdfQlJPQURXRUxMLCAgICAgICJicm9hZHdlbGwiKQorWDg2X0NQVV9TVUJUWVBFX0NPTVBBVCgic2t5bGFrZSIsICAgICAgICBJTlRFTF9DT1JFSTdfU0tZTEFLRSwgICAgICAgICJza3lsYWtlIikKK1g4Nl9DUFVfU1VCVFlQRV9DT01QQVQoInNreWxha2UtYXZ4NTEyIiwgSU5URUxfQ09SRUk3X1NLWUxBS0VfQVZYNTEyLCAic2t5bGFrZS1hdng1MTIiKQorWDg2X0NQVV9TVUJUWVBFX0NPTVBBVCgiY2Fubm9ubGFrZSIsICAgICBJTlRFTF9DT1JFSTdfQ0FOTk9OTEFLRSwgICAgICJjYW5ub25sYWtlIikKKy8vIEVudHJpZXMgYmVsb3cgdGhpcyBhcmUgbm90IGluIGxpYmdjYy9jb21waWxlci1ydC4KK1g4Nl9DUFVfU1VCVFlQRSAgICAgICAoImNvcmUyIiwgICAgICAgICAgSU5URUxfQ09SRTJfNjUpCitYODZfQ1BVX1NVQlRZUEUgICAgICAgKCJwZW5yeW4iLCAgICAgICAgIElOVEVMX0NPUkUyXzQ1KQorWDg2X0NQVV9TVUJUWVBFICAgICAgICgiazYiLCAgICAgICAgICAgICBBTURQRU5USVVNX0s2KQorWDg2X0NQVV9TVUJUWVBFICAgICAgICgiazYtMiIsICAgICAgICAgICBBTURQRU5USVVNX0s2MikKK1g4Nl9DUFVfU1VCVFlQRSAgICAgICAoIms2LTMiLCAgICAgICAgICAgQU1EUEVOVElVTV9LNjMpCitYODZfQ1BVX1NVQlRZUEUgICAgICAgKCJnZW9kZSIsICAgICAgICAgIEFNRFBFTlRJVU1fR0VPREUpCisjdW5kZWYgWDg2X0NQVV9TVUJUWVBFX0NPTVBBVAorI3VuZGVmIFg4Nl9DUFVfU1VCVFlQRQorCisKKy8vIFRoaXMgbWFjcm8gaXMgdXNlZCBmb3IgY3B1IHR5cGVzIHByZXNlbnQgaW4gY29tcGlsZXItcnQvbGliZ2NjLgorI2lmbmRlZiBYODZfRkVBVFVSRV9DT01QQVQKKyNkZWZpbmUgWDg2X0ZFQVRVUkVfQ09NUEFUKFZBTCwgRU5VTSwgU1RSKSBYODZfRkVBVFVSRShWQUwsIEVOVU0pCisjZW5kaWYKKworI2lmbmRlZiBYODZfRkVBVFVSRQorI2RlZmluZSBYODZfRkVBVFVSRShWQUwsIEVOVU0pCisjZW5kaWYKK1g4Nl9GRUFUVVJFX0NPTVBBVCggMCwgRkVBVFVSRV9DTU9WLCAgICAgICAgICAgICJjbW92IikKK1g4Nl9GRUFUVVJFX0NPTVBBVCggMSwgRkVBVFVSRV9NTVgsICAgICAgICAgICAgICJtbXgiKQorWDg2X0ZFQVRVUkVfQ09NUEFUKCAyLCBGRUFUVVJFX1BPUENOVCwgICAgICAgICAgInBvcGNudCIpCitYODZfRkVBVFVSRV9DT01QQVQoIDMsIEZFQVRVUkVfU1NFLCAgICAgICAgICAgICAic3NlIikKK1g4Nl9GRUFUVVJFX0NPTVBBVCggNCwgRkVBVFVSRV9TU0UyLCAgICAgICAgICAgICJzc2UyIikKK1g4Nl9GRUFUVVJFX0NPTVBBVCggNSwgRkVBVFVSRV9TU0UzLCAgICAgICAgICAgICJzc2UzIikKK1g4Nl9GRUFUVVJFX0NPTVBBVCggNiwgRkVBVFVSRV9TU1NFMywgICAgICAgICAgICJzc3NlMyIpCitYODZfRkVBVFVSRV9DT01QQVQoIDcsIEZFQVRVUkVfU1NFNF8xLCAgICAgICAgICAic3NlNC4xIikKK1g4Nl9GRUFUVVJFX0NPTVBBVCggOCwgRkVBVFVSRV9TU0U0XzIsICAgICAgICAgICJzc2U0LjIiKQorWDg2X0ZFQVRVUkVfQ09NUEFUKCA5LCBGRUFUVVJFX0FWWCwgICAgICAgICAgICAgImF2eCIpCitYODZfRkVBVFVSRV9DT01QQVQoMTAsIEZFQVRVUkVfQVZYMiwgICAgICAgICAgICAiYXZ4MiIpCitYODZfRkVBVFVSRV9DT01QQVQoMTEsIEZFQVRVUkVfU1NFNF9BLCAgICAgICAgICAic3NlNGEiKQorWDg2X0ZFQVRVUkVfQ09NUEFUKDEyLCBGRUFUVVJFX0ZNQTQsICAgICAgICAgICAgImZtYTQiKQorWDg2X0ZFQVRVUkVfQ09NUEFUKDEzLCBGRUFUVVJFX1hPUCwgICAgICAgICAgICAgInhvcCIpCitYODZfRkVBVFVSRV9DT01QQVQoMTQsIEZFQVRVUkVfRk1BLCAgICAgICAgICAgICAiZm1hIikKK1g4Nl9GRUFUVVJFX0NPTVBBVCgxNSwgRkVBVFVSRV9BVlg1MTJGLCAgICAgICAgICJhdng1MTJmIikKK1g4Nl9GRUFUVVJFX0NPTVBBVCgxNiwgRkVBVFVSRV9CTUksICAgICAgICAgICAgICJibWkiKQorWDg2X0ZFQVRVUkVfQ09NUEFUKDE3LCBGRUFUVVJFX0JNSTIsICAgICAgICAgICAgImJtaTIiKQorWDg2X0ZFQVRVUkVfQ09NUEFUKDE4LCBGRUFUVVJFX0FFUywgICAgICAgICAgICAgImFlcyIpCitYODZfRkVBVFVSRV9DT01QQVQoMTksIEZFQVRVUkVfUENMTVVMLCAgICAgICAgICAicGNsbXVsIikKK1g4Nl9GRUFUVVJFX0NPTVBBVCgyMCwgRkVBVFVSRV9BVlg1MTJWTCwgICAgICAgICJhdng1MTJ2bCIpCitYODZfRkVBVFVSRV9DT01QQVQoMjEsIEZFQVRVUkVfQVZYNTEyQlcsICAgICAgICAiYXZ4NTEyYnciKQorWDg2X0ZFQVRVUkVfQ09NUEFUKDIyLCBGRUFUVVJFX0FWWDUxMkRRLCAgICAgICAgImF2eDUxMmRxIikKK1g4Nl9GRUFUVVJFX0NPTVBBVCgyMywgRkVBVFVSRV9BVlg1MTJDRCwgICAgICAgICJhdng1MTJjZCIpCitYODZfRkVBVFVSRV9DT01QQVQoMjQsIEZFQVRVUkVfQVZYNTEyRVIsICAgICAgICAiYXZ4NTEyZXIiKQorWDg2X0ZFQVRVUkVfQ09NUEFUKDI1LCBGRUFUVVJFX0FWWDUxMlBGLCAgICAgICAgImF2eDUxMnBmIikKK1g4Nl9GRUFUVVJFX0NPTVBBVCgyNiwgRkVBVFVSRV9BVlg1MTJWQk1JLCAgICAgICJhdng1MTJ2Ym1pIikKK1g4Nl9GRUFUVVJFX0NPTVBBVCgyNywgRkVBVFVSRV9BVlg1MTJJRk1BLCAgICAgICJhdng1MTJpZm1hIikKK1g4Nl9GRUFUVVJFX0NPTVBBVCgyOCwgRkVBVFVSRV9BVlg1MTI0Vk5OSVcsICAgICJhdng1MTI0dm5uaXciKQorWDg2X0ZFQVRVUkVfQ09NUEFUKDI5LCBGRUFUVVJFX0FWWDUxMjRGTUFQUywgICAgImF2eDUxMjRmbWFwcyIpCitYODZfRkVBVFVSRV9DT01QQVQoMzAsIEZFQVRVUkVfQVZYNTEyVlBPUENOVERRLCAiYXZ4NTEydnBvcGNudGRxIikKKy8vIEZlYXR1cmVzIGJlbG93IGhlcmUgYXJlIG5vdCBpbiBsaWJnY2MvY29tcGlsZXItcnQuCitYODZfRkVBVFVSRSAgICAgICAoMzIsIEZFQVRVUkVfTU9WQkUpCitYODZfRkVBVFVSRSAgICAgICAoMzMsIEZFQVRVUkVfQURYKQorWDg2X0ZFQVRVUkUgICAgICAgKDM0LCBGRUFUVVJFX0VNNjRUKQorWDg2X0ZFQVRVUkUgICAgICAgKDM1LCBGRUFUVVJFX0NMRkxVU0hPUFQpCitYODZfRkVBVFVSRSAgICAgICAoMzYsIEZFQVRVUkVfU0hBKQorI3VuZGVmIFg4Nl9GRUFUVVJFX0NPTVBBVAorI3VuZGVmIFg4Nl9GRUFUVVJFCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvWUFNTFBhcnNlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1lBTUxQYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzMzYWQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1lBTUxQYXJzZXIuaApAQCAtMCwwICsxLDYyMCBAQAorLy89PT0tIFlBTUxQYXJzZXIuaCAtIFNpbXBsZSBZQU1MIHBhcnNlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBpcyBhIFlBTUwgMS4yIHBhcnNlci4KKy8vCisvLyAgU2VlIGh0dHA6Ly93d3cueWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sIGZvciB0aGUgZnVsbCBzdGFuZGFyZC4KKy8vCisvLyAgVGhpcyBjdXJyZW50bHkgZG9lcyBub3QgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmc6CisvLyAgICAqIE11bHRpLWxpbmUgbGl0ZXJhbCBmb2xkaW5nLgorLy8gICAgKiBUYWcgcmVzb2x1dGlvbi4KKy8vICAgICogVVRGLTE2LgorLy8gICAgKiBCT01zIGFueXdoZXJlIG90aGVyIHRoYW4gdGhlIGZpcnN0IFVuaWNvZGUgc2NhbGFyIHZhbHVlIGluIHRoZSBmaWxlLgorLy8KKy8vICBUaGUgbW9zdCBpbXBvcnRhbnQgY2xhc3MgaGVyZSBpcyBTdHJlYW0uIFRoaXMgcmVwcmVzZW50cyBhIFlBTUwgc3RyZWFtIHdpdGgKKy8vICAwLCAxLCBvciBtYW55IGRvY3VtZW50cy4KKy8vCisvLyAgU291cmNlTWdyIHNtOworLy8gIFN0cmluZ1JlZiBpbnB1dCA9IGdldElucHV0KCk7CisvLyAgeWFtbDo6U3RyZWFtIHN0cmVhbShpbnB1dCwgc20pOworLy8KKy8vICBmb3IgKHlhbWw6OmRvY3VtZW50X2l0ZXJhdG9yIGRpID0gc3RyZWFtLmJlZ2luKCksIGRlID0gc3RyZWFtLmVuZCgpOworLy8gICAgICAgZGkgIT0gZGU7ICsrZGkpIHsKKy8vICAgIHlhbWw6Ok5vZGUgKm4gPSBkaS0+Z2V0Um9vdCgpOworLy8gICAgaWYgKG4pIHsKKy8vICAgICAgLy8gRG8gc29tZXRoaW5nIHdpdGggbi4uLgorLy8gICAgfSBlbHNlCisvLyAgICAgIGJyZWFrOworLy8gIH0KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9ZQU1MUEFSU0VSX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1lBTUxQQVJTRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TTUxvYy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWVtb3J5QnVmZmVyUmVmOworY2xhc3MgU291cmNlTWdyOworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBUd2luZTsKKworbmFtZXNwYWNlIHlhbWwgeworCitjbGFzcyBEb2N1bWVudDsKK2NsYXNzIGRvY3VtZW50X2l0ZXJhdG9yOworY2xhc3MgTm9kZTsKK2NsYXNzIFNjYW5uZXI7CitzdHJ1Y3QgVG9rZW47CisKKy8vLyBcYnJpZWYgRHVtcCBhbGwgdGhlIHRva2VucyBpbiB0aGlzIHN0cmVhbSB0byBPUy4KKy8vLyBccmV0dXJucyB0cnVlIGlmIHRoZXJlIHdhcyBhbiBlcnJvciwgZmFsc2Ugb3RoZXJ3aXNlLgorYm9vbCBkdW1wVG9rZW5zKFN0cmluZ1JlZiBJbnB1dCwgcmF3X29zdHJlYW0gJik7CisKKy8vLyBcYnJpZWYgU2NhbnMgYWxsIHRva2VucyBpbiBpbnB1dCB3aXRob3V0IG91dHB1dHRpbmcgYW55dGhpbmcuIFRoaXMgaXMgdXNlZAorLy8vICAgICAgICBmb3IgYmVuY2htYXJraW5nIHRoZSB0b2tlbml6ZXIuCisvLy8gXHJldHVybnMgdHJ1ZSBpZiB0aGVyZSB3YXMgYW4gZXJyb3IsIGZhbHNlIG90aGVyd2lzZS4KK2Jvb2wgc2NhblRva2VucyhTdHJpbmdSZWYgSW5wdXQpOworCisvLy8gXGJyaWVmIEVzY2FwZSBcYSBJbnB1dCBmb3IgYSBkb3VibGUgcXVvdGVkIHNjYWxhcjsgaWYgXHAgRXNjYXBlUHJpbnRhYmxlCisvLy8gaXMgdHJ1ZSwgYWxsIFVURjggc2VxdWVuY2VzIHdpbGwgYmUgZXNjYXBlZCwgaWYgXHAgRXNjYXBlUHJpbnRhYmxlIGlzCisvLy8gZmFsc2UsIHRob3NlIFVURjggc2VxdWVuY2VzIGVuY29kaW5nIHByaW50YWJsZSB1bmljb2RlIHNjYWxhcnMgd2lsbCBub3QgYmUKKy8vLyBlc2NhcGVkLCBidXQgZW1pdHRlZCB2ZXJiYXRpbS4KK3N0ZDo6c3RyaW5nIGVzY2FwZShTdHJpbmdSZWYgSW5wdXQsIGJvb2wgRXNjYXBlUHJpbnRhYmxlID0gdHJ1ZSk7CisKKy8vLyBcYnJpZWYgVGhpcyBjbGFzcyByZXByZXNlbnRzIGEgWUFNTCBzdHJlYW0gcG90ZW50aWFsbHkgY29udGFpbmluZyBtdWx0aXBsZQorLy8vICAgICAgICBkb2N1bWVudHMuCitjbGFzcyBTdHJlYW0geworcHVibGljOgorICAvLy8gXGJyaWVmIFRoaXMga2VlcHMgYSByZWZlcmVuY2UgdG8gdGhlIHN0cmluZyByZWZlcmVuY2VkIGJ5IFxwIElucHV0LgorICBTdHJlYW0oU3RyaW5nUmVmIElucHV0LCBTb3VyY2VNZ3IgJiwgYm9vbCBTaG93Q29sb3JzID0gdHJ1ZSwKKyAgICAgICAgIHN0ZDo6ZXJyb3JfY29kZSAqRUMgPSBudWxscHRyKTsKKworICBTdHJlYW0oTWVtb3J5QnVmZmVyUmVmIElucHV0QnVmZmVyLCBTb3VyY2VNZ3IgJiwgYm9vbCBTaG93Q29sb3JzID0gdHJ1ZSwKKyAgICAgICAgIHN0ZDo6ZXJyb3JfY29kZSAqRUMgPSBudWxscHRyKTsKKyAgflN0cmVhbSgpOworCisgIGRvY3VtZW50X2l0ZXJhdG9yIGJlZ2luKCk7CisgIGRvY3VtZW50X2l0ZXJhdG9yIGVuZCgpOworICB2b2lkIHNraXAoKTsKKyAgYm9vbCBmYWlsZWQoKTsKKworICBib29sIHZhbGlkYXRlKCkgeworICAgIHNraXAoKTsKKyAgICByZXR1cm4gIWZhaWxlZCgpOworICB9CisKKyAgdm9pZCBwcmludEVycm9yKE5vZGUgKk4sIGNvbnN0IFR3aW5lICZNc2cpOworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3MgRG9jdW1lbnQ7CisKKyAgc3RkOjp1bmlxdWVfcHRyPFNjYW5uZXI+IHNjYW5uZXI7CisgIHN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gQ3VycmVudERvYzsKK307CisKKy8vLyBcYnJpZWYgQWJzdHJhY3QgYmFzZSBjbGFzcyBmb3IgYWxsIE5vZGVzLgorY2xhc3MgTm9kZSB7CisgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworcHVibGljOgorICBlbnVtIE5vZGVLaW5kIHsKKyAgICBOS19OdWxsLAorICAgIE5LX1NjYWxhciwKKyAgICBOS19CbG9ja1NjYWxhciwKKyAgICBOS19LZXlWYWx1ZSwKKyAgICBOS19NYXBwaW5nLAorICAgIE5LX1NlcXVlbmNlLAorICAgIE5LX0FsaWFzCisgIH07CisKKyAgTm9kZSh1bnNpZ25lZCBpbnQgVHlwZSwgc3RkOjp1bmlxdWVfcHRyPERvY3VtZW50PiAmLCBTdHJpbmdSZWYgQW5jaG9yLAorICAgICAgIFN0cmluZ1JlZiBUYWcpOworCisgIC8vIEl0J3Mgbm90IHNhZmUgdG8gY29weSBZQU1MIG5vZGVzOyB0aGUgZG9jdW1lbnQgaXMgc3RyZWFtZWQgYW5kIHRoZSBwb3NpdGlvbgorICAvLyBpcyBwYXJ0IG9mIHRoZSBzdGF0ZS4KKyAgTm9kZShjb25zdCBOb2RlICYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCBOb2RlICYpID0gZGVsZXRlOworCisgIHZvaWQgKm9wZXJhdG9yIG5ldyhzaXplX3QgU2l6ZSwgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2MsCisgICAgICAgICAgICAgICAgICAgICBzaXplX3QgQWxpZ25tZW50ID0gMTYpIG5vZXhjZXB0IHsKKyAgICByZXR1cm4gQWxsb2MuQWxsb2NhdGUoU2l6ZSwgQWxpZ25tZW50KTsKKyAgfQorCisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKlB0ciwgQnVtcFB0ckFsbG9jYXRvciAmQWxsb2MsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBTaXplKSBub2V4Y2VwdCB7CisgICAgQWxsb2MuRGVhbGxvY2F0ZShQdHIsIFNpemUpOworICB9CisKKyAgdm9pZCBvcGVyYXRvciBkZWxldGUodm9pZCAqKSBub2V4Y2VwdCA9IGRlbGV0ZTsKKworICAvLy8gXGJyaWVmIEdldCB0aGUgdmFsdWUgb2YgdGhlIGFuY2hvciBhdHRhY2hlZCB0byB0aGlzIG5vZGUuIElmIGl0IGRvZXMgbm90CisgIC8vLyAgICAgICAgaGF2ZSBvbmUsIGdldEFuY2hvcigpLnNpemUoKSB3aWxsIGJlIDAuCisgIFN0cmluZ1JlZiBnZXRBbmNob3IoKSBjb25zdCB7IHJldHVybiBBbmNob3I7IH0KKworICAvLy8gXGJyaWVmIEdldCB0aGUgdGFnIGFzIGl0IHdhcyB3cml0dGVuIGluIHRoZSBkb2N1bWVudC4gVGhpcyBkb2VzIG5vdAorICAvLy8gICBwZXJmb3JtIHRhZyByZXNvbHV0aW9uLgorICBTdHJpbmdSZWYgZ2V0UmF3VGFnKCkgY29uc3QgeyByZXR1cm4gVGFnOyB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHZlcmJhdGl1bSB0YWcgZm9yIGEgZ2l2ZW4gTm9kZS4gVGhpcyBwZXJmb3JtcyB0YWcgcmVzb2x1dG9uCisgIC8vLyAgIGFuZCBzdWJzdGl0dXRpb24uCisgIHN0ZDo6c3RyaW5nIGdldFZlcmJhdGltVGFnKCkgY29uc3Q7CisKKyAgU01SYW5nZSBnZXRTb3VyY2VSYW5nZSgpIGNvbnN0IHsgcmV0dXJuIFNvdXJjZVJhbmdlOyB9CisgIHZvaWQgc2V0U291cmNlUmFuZ2UoU01SYW5nZSBTUikgeyBTb3VyY2VSYW5nZSA9IFNSOyB9CisKKyAgLy8gVGhlc2UgZnVuY3Rpb25zIGZvcndhcmQgdG8gRG9jdW1lbnQgYW5kIFNjYW5uZXIuCisgIFRva2VuICZwZWVrTmV4dCgpOworICBUb2tlbiBnZXROZXh0KCk7CisgIE5vZGUgKnBhcnNlQmxvY2tOb2RlKCk7CisgIEJ1bXBQdHJBbGxvY2F0b3IgJmdldEFsbG9jYXRvcigpOworICB2b2lkIHNldEVycm9yKGNvbnN0IFR3aW5lICZNZXNzYWdlLCBUb2tlbiAmTG9jYXRpb24pIGNvbnN0OworICBib29sIGZhaWxlZCgpIGNvbnN0OworCisgIHZpcnR1YWwgdm9pZCBza2lwKCkge30KKworICB1bnNpZ25lZCBpbnQgZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5cGVJRDsgfQorCitwcm90ZWN0ZWQ6CisgIHN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gJkRvYzsKKyAgU01SYW5nZSBTb3VyY2VSYW5nZTsKKworICB+Tm9kZSgpID0gZGVmYXVsdDsKKworcHJpdmF0ZToKKyAgdW5zaWduZWQgaW50IFR5cGVJRDsKKyAgU3RyaW5nUmVmIEFuY2hvcjsKKyAgLy8vIFxicmllZiBUaGUgdGFnIGFzIHR5cGVkIGluIHRoZSBkb2N1bWVudC4KKyAgU3RyaW5nUmVmIFRhZzsKK307CisKKy8vLyBcYnJpZWYgQSBudWxsIHZhbHVlLgorLy8vCisvLy8gRXhhbXBsZToKKy8vLyAgICEhbnVsbCBudWxsCitjbGFzcyBOdWxsTm9kZSBmaW5hbCA6IHB1YmxpYyBOb2RlIHsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBOdWxsTm9kZShzdGQ6OnVuaXF1ZV9wdHI8RG9jdW1lbnQ+ICZEKQorICAgICAgOiBOb2RlKE5LX051bGwsIEQsIFN0cmluZ1JlZigpLCBTdHJpbmdSZWYoKSkge30KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE5vZGUgKk4pIHsgcmV0dXJuIE4tPmdldFR5cGUoKSA9PSBOS19OdWxsOyB9Cit9OworCisvLy8gXGJyaWVmIEEgc2NhbGFyIG5vZGUgaXMgYW4gb3BhcXVlIGRhdHVtIHRoYXQgY2FuIGJlIHByZXNlbnRlZCBhcyBhCisvLy8gICAgICAgIHNlcmllcyBvZiB6ZXJvIG9yIG1vcmUgVW5pY29kZSBzY2FsYXIgdmFsdWVzLgorLy8vCisvLy8gRXhhbXBsZToKKy8vLyAgIEFkZW5hCitjbGFzcyBTY2FsYXJOb2RlIGZpbmFsIDogcHVibGljIE5vZGUgeworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIFNjYWxhck5vZGUoc3RkOjp1bmlxdWVfcHRyPERvY3VtZW50PiAmRCwgU3RyaW5nUmVmIEFuY2hvciwgU3RyaW5nUmVmIFRhZywKKyAgICAgICAgICAgICBTdHJpbmdSZWYgVmFsKQorICAgICAgOiBOb2RlKE5LX1NjYWxhciwgRCwgQW5jaG9yLCBUYWcpLCBWYWx1ZShWYWwpIHsKKyAgICBTTUxvYyBTdGFydCA9IFNNTG9jOjpnZXRGcm9tUG9pbnRlcihWYWwuYmVnaW4oKSk7CisgICAgU01Mb2MgRW5kID0gU01Mb2M6OmdldEZyb21Qb2ludGVyKFZhbC5lbmQoKSk7CisgICAgU291cmNlUmFuZ2UgPSBTTVJhbmdlKFN0YXJ0LCBFbmQpOworICB9CisKKyAgLy8gUmV0dXJuIFZhbHVlIHdpdGhvdXQgYW55IGVzY2FwaW5nIG9yIGZvbGRpbmcgb3Igb3RoZXIgZnVuIFlBTUwgc3R1ZmYuIFRoaXMKKyAgLy8gaXMgdGhlIGV4YWN0IGJ5dGVzIHRoYXQgYXJlIGNvbnRhaW5lZCBpbiB0aGUgZmlsZSAoYWZ0ZXIgY29udmVyc2lvbiB0bworICAvLyB1dGY4KS4KKyAgU3RyaW5nUmVmIGdldFJhd1ZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKworICAvLy8gXGJyaWVmIEdldHMgdGhlIHZhbHVlIG9mIHRoaXMgbm9kZSBhcyBhIFN0cmluZ1JlZi4KKyAgLy8vCisgIC8vLyBccGFyYW0gU3RvcmFnZSBpcyB1c2VkIHRvIHN0b3JlIHRoZSBjb250ZW50IG9mIHRoZSByZXR1cm5lZCBTdHJpbmdSZWYgaWZmCisgIC8vLyAgICAgICAgaXQgcmVxdWlyZXMgYW55IG1vZGlmaWNhdGlvbiBmcm9tIGhvdyBpdCBhcHBlYXJlZCBpbiB0aGUgc291cmNlLgorICAvLy8gICAgICAgIFRoaXMgaGFwcGVucyB3aXRoIGVzY2FwZWQgY2hhcmFjdGVycyBhbmQgbXVsdGktbGluZSBsaXRlcmFscy4KKyAgU3RyaW5nUmVmIGdldFZhbHVlKFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmU3RvcmFnZSkgY29uc3Q7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBOb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldFR5cGUoKSA9PSBOS19TY2FsYXI7CisgIH0KKworcHJpdmF0ZToKKyAgU3RyaW5nUmVmIFZhbHVlOworCisgIFN0cmluZ1JlZiB1bmVzY2FwZURvdWJsZVF1b3RlZChTdHJpbmdSZWYgVW5xdW90ZWRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZjo6c2l6ZV90eXBlIFN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZTdG9yYWdlKSBjb25zdDsKK307CisKKy8vLyBcYnJpZWYgQSBibG9jayBzY2FsYXIgbm9kZSBpcyBhbiBvcGFxdWUgZGF0dW0gdGhhdCBjYW4gYmUgcHJlc2VudGVkIGFzIGEKKy8vLyAgICAgICAgc2VyaWVzIG9mIHplcm8gb3IgbW9yZSBVbmljb2RlIHNjYWxhciB2YWx1ZXMuCisvLy8KKy8vLyBFeGFtcGxlOgorLy8vICAgfAorLy8vICAgICBIZWxsbworLy8vICAgICBXb3JsZAorY2xhc3MgQmxvY2tTY2FsYXJOb2RlIGZpbmFsIDogcHVibGljIE5vZGUgeworICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCitwdWJsaWM6CisgIEJsb2NrU2NhbGFyTm9kZShzdGQ6OnVuaXF1ZV9wdHI8RG9jdW1lbnQ+ICZELCBTdHJpbmdSZWYgQW5jaG9yLCBTdHJpbmdSZWYgVGFnLAorICAgICAgICAgICAgICAgICAgU3RyaW5nUmVmIFZhbHVlLCBTdHJpbmdSZWYgUmF3VmFsKQorICAgICAgOiBOb2RlKE5LX0Jsb2NrU2NhbGFyLCBELCBBbmNob3IsIFRhZyksIFZhbHVlKFZhbHVlKSB7CisgICAgU01Mb2MgU3RhcnQgPSBTTUxvYzo6Z2V0RnJvbVBvaW50ZXIoUmF3VmFsLmJlZ2luKCkpOworICAgIFNNTG9jIEVuZCA9IFNNTG9jOjpnZXRGcm9tUG9pbnRlcihSYXdWYWwuZW5kKCkpOworICAgIFNvdXJjZVJhbmdlID0gU01SYW5nZShTdGFydCwgRW5kKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0cyB0aGUgdmFsdWUgb2YgdGhpcyBub2RlIGFzIGEgU3RyaW5nUmVmLgorICBTdHJpbmdSZWYgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiBWYWx1ZTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRUeXBlKCkgPT0gTktfQmxvY2tTY2FsYXI7CisgIH0KKworcHJpdmF0ZToKKyAgU3RyaW5nUmVmIFZhbHVlOworfTsKKworLy8vIFxicmllZiBBIGtleSBhbmQgdmFsdWUgcGFpci4gV2hpbGUgbm90IHRlY2huaWNhbGx5IGEgTm9kZSB1bmRlciB0aGUgWUFNTAorLy8vICAgICAgICByZXByZXNlbnRhdGlvbiBncmFwaCwgaXQgaXMgZWFzaWVyIHRvIHRyZWF0IHRoZW0gdGhpcyB3YXkuCisvLy8KKy8vLyBUT0RPOiBDb25zaWRlciBtYWtpbmcgdGhpcyBub3QgYSBjaGlsZCBvZiBOb2RlLgorLy8vCisvLy8gRXhhbXBsZToKKy8vLyAgIFNlY3Rpb246IC50ZXh0CitjbGFzcyBLZXlWYWx1ZU5vZGUgZmluYWwgOiBwdWJsaWMgTm9kZSB7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgS2V5VmFsdWVOb2RlKHN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gJkQpCisgICAgICA6IE5vZGUoTktfS2V5VmFsdWUsIEQsIFN0cmluZ1JlZigpLCBTdHJpbmdSZWYoKSkge30KKworICAvLy8gXGJyaWVmIFBhcnNlIGFuZCByZXR1cm4gdGhlIGtleS4KKyAgLy8vCisgIC8vLyBUaGlzIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCisgIC8vLworICAvLy8gXHJldHVybnMgVGhlIGtleSwgb3IgbnVsbHB0ciBpZiBmYWlsZWQoKSA9PSB0cnVlLgorICBOb2RlICpnZXRLZXkoKTsKKworICAvLy8gXGJyaWVmIFBhcnNlIGFuZCByZXR1cm4gdGhlIHZhbHVlLgorICAvLy8KKyAgLy8vIFRoaXMgbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KKyAgLy8vCisgIC8vLyBccmV0dXJucyBUaGUgdmFsdWUsIG9yIG51bGxwdHIgaWYgZmFpbGVkKCkgPT0gdHJ1ZS4KKyAgTm9kZSAqZ2V0VmFsdWUoKTsKKworICB2b2lkIHNraXAoKSBvdmVycmlkZSB7CisgICAgaWYgKE5vZGUgKktleSA9IGdldEtleSgpKSB7CisgICAgICBLZXktPnNraXAoKTsKKyAgICAgIGlmIChOb2RlICpWYWwgPSBnZXRWYWx1ZSgpKQorICAgICAgICBWYWwtPnNraXAoKTsKKyAgICB9CisgIH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE5vZGUgKk4pIHsKKyAgICByZXR1cm4gTi0+Z2V0VHlwZSgpID09IE5LX0tleVZhbHVlOworICB9CisKK3ByaXZhdGU6CisgIE5vZGUgKktleSA9IG51bGxwdHI7CisgIE5vZGUgKlZhbHVlID0gbnVsbHB0cjsKK307CisKKy8vLyBcYnJpZWYgVGhpcyBpcyBhbiBpdGVyYXRvciBhYnN0cmFjdGlvbiBvdmVyIFlBTUwgY29sbGVjdGlvbnMgc2hhcmVkIGJ5IGJvdGgKKy8vLyAgICAgICAgc2VxdWVuY2VzIGFuZCBtYXBzLgorLy8vCisvLy8gQmFzZVQgbXVzdCBoYXZlIGEgVmFsdWVUKiBtZW1iZXIgbmFtZWQgQ3VycmVudEVudHJ5IGFuZCBhIG1lbWJlciBmdW5jdGlvbgorLy8vIGluY3JlbWVudCgpIHdoaWNoIG11c3Qgc2V0IEN1cnJlbnRFbnRyeSB0byAwIHRvIGNyZWF0ZSBhbiBlbmQgaXRlcmF0b3IuCit0ZW1wbGF0ZSA8Y2xhc3MgQmFzZVQsIGNsYXNzIFZhbHVlVD4KK2NsYXNzIGJhc2ljX2NvbGxlY3Rpb25faXRlcmF0b3IKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnLCBWYWx1ZVQ+IHsKK3B1YmxpYzoKKyAgYmFzaWNfY29sbGVjdGlvbl9pdGVyYXRvcigpID0gZGVmYXVsdDsKKyAgYmFzaWNfY29sbGVjdGlvbl9pdGVyYXRvcihCYXNlVCAqQikgOiBCYXNlKEIpIHt9CisKKyAgVmFsdWVUICpvcGVyYXRvci0+KCkgY29uc3QgeworICAgIGFzc2VydChCYXNlICYmIEJhc2UtPkN1cnJlbnRFbnRyeSAmJiAiQXR0ZW1wdGVkIHRvIGFjY2VzcyBlbmQgaXRlcmF0b3IhIik7CisgICAgcmV0dXJuIEJhc2UtPkN1cnJlbnRFbnRyeTsKKyAgfQorCisgIFZhbHVlVCAmb3BlcmF0b3IqKCkgY29uc3QgeworICAgIGFzc2VydChCYXNlICYmIEJhc2UtPkN1cnJlbnRFbnRyeSAmJgorICAgICAgICAgICAiQXR0ZW1wdGVkIHRvIGRlcmVmZXJlbmNlIGVuZCBpdGVyYXRvciEiKTsKKyAgICByZXR1cm4gKkJhc2UtPkN1cnJlbnRFbnRyeTsKKyAgfQorCisgIG9wZXJhdG9yIFZhbHVlVCAqKCkgY29uc3QgeworICAgIGFzc2VydChCYXNlICYmIEJhc2UtPkN1cnJlbnRFbnRyeSAmJiAiQXR0ZW1wdGVkIHRvIGFjY2VzcyBlbmQgaXRlcmF0b3IhIik7CisgICAgcmV0dXJuIEJhc2UtPkN1cnJlbnRFbnRyeTsKKyAgfQorCisgIC8vLyBOb3RlIG9uIEVxdWFsaXR5Q29tcGFyYWJsZToKKyAgLy8vCisgIC8vLyBUaGUgaXRlcmF0b3IgaXMgbm90IHJlLWVudHJhbnQsCisgIC8vLyBpdCBpcyBtZWFudCB0byBiZSB1c2VkIGZvciBwYXJzaW5nIFlBTUwgb24tZGVtYW5kCisgIC8vLyBPbmNlIGl0ZXJhdGlvbiBzdGFydGVkIC0gaXQgY2FuIHBvaW50IG9ubHkgdG8gb25lIGVudHJ5IGF0IGEgdGltZQorICAvLy8gaGVuY2UgQmFzZS5DdXJyZW50RW50cnkgYW5kIE90aGVyLkJhc2UuQ3VycmVudEVudHJ5IGFyZSBlcXVhbAorICAvLy8gaWZmIEJhc2UgYW5kIE90aGVyLkJhc2UgYXJlIGVxdWFsLgorICBib29sIG9wZXJhdG9yPT0oY29uc3QgYmFzaWNfY29sbGVjdGlvbl9pdGVyYXRvciAmT3RoZXIpIGNvbnN0IHsKKyAgICBpZiAoQmFzZSAmJiAoQmFzZSA9PSBPdGhlci5CYXNlKSkgeworICAgICAgYXNzZXJ0KChCYXNlLT5DdXJyZW50RW50cnkgPT0gT3RoZXIuQmFzZS0+Q3VycmVudEVudHJ5KQorICAgICAgICAgICAgICYmICJFcXVhbCBCYXNlcyBleHBlY3RlZCB0byBwb2ludCB0byBlcXVhbCBFbnRyaWVzIik7CisgICAgfQorCisgICAgcmV0dXJuIEJhc2UgPT0gT3RoZXIuQmFzZTsKKyAgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBiYXNpY19jb2xsZWN0aW9uX2l0ZXJhdG9yICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiAhKEJhc2UgPT0gT3RoZXIuQmFzZSk7CisgIH0KKworICBiYXNpY19jb2xsZWN0aW9uX2l0ZXJhdG9yICZvcGVyYXRvcisrKCkgeworICAgIGFzc2VydChCYXNlICYmICJBdHRlbXB0ZWQgdG8gYWR2YW5jZSBpdGVyYXRvciBwYXN0IGVuZCEiKTsKKyAgICBCYXNlLT5pbmNyZW1lbnQoKTsKKyAgICAvLyBDcmVhdGUgYW4gZW5kIGl0ZXJhdG9yLgorICAgIGlmICghQmFzZS0+Q3VycmVudEVudHJ5KQorICAgICAgQmFzZSA9IG51bGxwdHI7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKK3ByaXZhdGU6CisgIEJhc2VUICpCYXNlID0gbnVsbHB0cjsKK307CisKKy8vIFRoZSBmb2xsb3dpbmcgdHdvIHRlbXBsYXRlcyBhcmUgdXNlZCBmb3IgYm90aCBNYXBwaW5nTm9kZSBhbmQgU2VxdWVuY2UgTm9kZS4KK3RlbXBsYXRlIDxjbGFzcyBDb2xsZWN0aW9uVHlwZT4KK3R5cGVuYW1lIENvbGxlY3Rpb25UeXBlOjppdGVyYXRvciBiZWdpbihDb2xsZWN0aW9uVHlwZSAmQykgeworICBhc3NlcnQoQy5Jc0F0QmVnaW5uaW5nICYmICJZb3UgbWF5IG9ubHkgaXRlcmF0ZSBvdmVyIGEgY29sbGVjdGlvbiBvbmNlISIpOworICBDLklzQXRCZWdpbm5pbmcgPSBmYWxzZTsKKyAgdHlwZW5hbWUgQ29sbGVjdGlvblR5cGU6Oml0ZXJhdG9yIHJldCgmQyk7CisgICsrcmV0OworICByZXR1cm4gcmV0OworfQorCit0ZW1wbGF0ZSA8Y2xhc3MgQ29sbGVjdGlvblR5cGU+IHZvaWQgc2tpcChDb2xsZWN0aW9uVHlwZSAmQykgeworICAvLyBUT0RPOiBzdXBwb3J0IHNraXBwaW5nIGZyb20gdGhlIG1pZGRsZSBvZiBhIHBhcnNlZCBjb2xsZWN0aW9uIDsvCisgIGFzc2VydCgoQy5Jc0F0QmVnaW5uaW5nIHx8IEMuSXNBdEVuZCkgJiYgIkNhbm5vdCBza2lwIG1pZCBwYXJzZSEiKTsKKyAgaWYgKEMuSXNBdEJlZ2lubmluZykKKyAgICBmb3IgKHR5cGVuYW1lIENvbGxlY3Rpb25UeXBlOjppdGVyYXRvciBpID0gYmVnaW4oQyksIGUgPSBDLmVuZCgpOyBpICE9IGU7CisgICAgICAgICArK2kpCisgICAgICBpLT5za2lwKCk7Cit9CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhIFlBTUwgbWFwIGNyZWF0ZWQgZnJvbSBlaXRoZXIgYSBibG9jayBtYXAgZm9yIGEgZmxvdyBtYXAuCisvLy8KKy8vLyBUaGlzIHBhcnNlcyB0aGUgWUFNTCBzdHJlYW0gYXMgaW5jcmVtZW50KCkgaXMgY2FsbGVkLgorLy8vCisvLy8gRXhhbXBsZToKKy8vLyAgIE5hbWU6IF9tYWluCisvLy8gICBTY29wZTogR2xvYmFsCitjbGFzcyBNYXBwaW5nTm9kZSBmaW5hbCA6IHB1YmxpYyBOb2RlIHsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBlbnVtIE1hcHBpbmdUeXBlIHsKKyAgICBNVF9CbG9jaywKKyAgICBNVF9GbG93LAorICAgIE1UX0lubGluZSAvLy88IEFuIGlubGluZSBtYXBwaW5nIG5vZGUgaXMgdXNlZCBmb3IgIltrZXk6IHZhbHVlXSIuCisgIH07CisKKyAgTWFwcGluZ05vZGUoc3RkOjp1bmlxdWVfcHRyPERvY3VtZW50PiAmRCwgU3RyaW5nUmVmIEFuY2hvciwgU3RyaW5nUmVmIFRhZywKKyAgICAgICAgICAgICAgTWFwcGluZ1R5cGUgTVQpCisgICAgICA6IE5vZGUoTktfTWFwcGluZywgRCwgQW5jaG9yLCBUYWcpLCBUeXBlKE1UKSB7fQorCisgIGZyaWVuZCBjbGFzcyBiYXNpY19jb2xsZWN0aW9uX2l0ZXJhdG9yPE1hcHBpbmdOb2RlLCBLZXlWYWx1ZU5vZGU+OworCisgIHVzaW5nIGl0ZXJhdG9yID0gYmFzaWNfY29sbGVjdGlvbl9pdGVyYXRvcjxNYXBwaW5nTm9kZSwgS2V5VmFsdWVOb2RlPjsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gZnJpZW5kIHR5cGVuYW1lIFQ6Oml0ZXJhdG9yIHlhbWw6OmJlZ2luKFQgJik7CisgIHRlbXBsYXRlIDxjbGFzcyBUPiBmcmllbmQgdm9pZCB5YW1sOjpza2lwKFQgJik7CisKKyAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiB5YW1sOjpiZWdpbigqdGhpcyk7IH0KKworICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBpdGVyYXRvcigpOyB9CisKKyAgdm9pZCBza2lwKCkgb3ZlcnJpZGUgeyB5YW1sOjpza2lwKCp0aGlzKTsgfQorCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTm9kZSAqTikgeworICAgIHJldHVybiBOLT5nZXRUeXBlKCkgPT0gTktfTWFwcGluZzsKKyAgfQorCitwcml2YXRlOgorICBNYXBwaW5nVHlwZSBUeXBlOworICBib29sIElzQXRCZWdpbm5pbmcgPSB0cnVlOworICBib29sIElzQXRFbmQgPSBmYWxzZTsKKyAgS2V5VmFsdWVOb2RlICpDdXJyZW50RW50cnkgPSBudWxscHRyOworCisgIHZvaWQgaW5jcmVtZW50KCk7Cit9OworCisvLy8gXGJyaWVmIFJlcHJlc2VudHMgYSBZQU1MIHNlcXVlbmNlIGNyZWF0ZWQgZnJvbSBlaXRoZXIgYSBibG9jayBzZXF1ZW5jZSBmb3IgYQorLy8vICAgICAgICBmbG93IHNlcXVlbmNlLgorLy8vCisvLy8gVGhpcyBwYXJzZXMgdGhlIFlBTUwgc3RyZWFtIGFzIGluY3JlbWVudCgpIGlzIGNhbGxlZC4KKy8vLworLy8vIEV4YW1wbGU6CisvLy8gICAtIEhlbGxvCisvLy8gICAtIFdvcmxkCitjbGFzcyBTZXF1ZW5jZU5vZGUgZmluYWwgOiBwdWJsaWMgTm9kZSB7CisgIHZvaWQgYW5jaG9yKCkgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgZW51bSBTZXF1ZW5jZVR5cGUgeworICAgIFNUX0Jsb2NrLAorICAgIFNUX0Zsb3csCisgICAgLy8gVXNlIGZvcjoKKyAgICAvLworICAgIC8vIGtleToKKyAgICAvLyAtIHZhbDEKKyAgICAvLyAtIHZhbDIKKyAgICAvLworICAgIC8vIEFzIGEgQmxvY2tNYXBwaW5nRW50cnkgYW5kIEJsb2NrRW5kIGFyZSBub3QgY3JlYXRlZCBpbiB0aGlzIGNhc2UuCisgICAgU1RfSW5kZW50bGVzcworICB9OworCisgIFNlcXVlbmNlTm9kZShzdGQ6OnVuaXF1ZV9wdHI8RG9jdW1lbnQ+ICZELCBTdHJpbmdSZWYgQW5jaG9yLCBTdHJpbmdSZWYgVGFnLAorICAgICAgICAgICAgICAgU2VxdWVuY2VUeXBlIFNUKQorICAgICAgOiBOb2RlKE5LX1NlcXVlbmNlLCBELCBBbmNob3IsIFRhZyksIFNlcVR5cGUoU1QpIHt9CisKKyAgZnJpZW5kIGNsYXNzIGJhc2ljX2NvbGxlY3Rpb25faXRlcmF0b3I8U2VxdWVuY2VOb2RlLCBOb2RlPjsKKworICB1c2luZyBpdGVyYXRvciA9IGJhc2ljX2NvbGxlY3Rpb25faXRlcmF0b3I8U2VxdWVuY2VOb2RlLCBOb2RlPjsKKworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gZnJpZW5kIHR5cGVuYW1lIFQ6Oml0ZXJhdG9yIHlhbWw6OmJlZ2luKFQgJik7CisgIHRlbXBsYXRlIDxjbGFzcyBUPiBmcmllbmQgdm9pZCB5YW1sOjpza2lwKFQgJik7CisKKyAgdm9pZCBpbmNyZW1lbnQoKTsKKworICBpdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIHlhbWw6OmJlZ2luKCp0aGlzKTsgfQorCisgIGl0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIGl0ZXJhdG9yKCk7IH0KKworICB2b2lkIHNraXAoKSBvdmVycmlkZSB7IHlhbWw6OnNraXAoKnRoaXMpOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBOb2RlICpOKSB7CisgICAgcmV0dXJuIE4tPmdldFR5cGUoKSA9PSBOS19TZXF1ZW5jZTsKKyAgfQorCitwcml2YXRlOgorICBTZXF1ZW5jZVR5cGUgU2VxVHlwZTsKKyAgYm9vbCBJc0F0QmVnaW5uaW5nID0gdHJ1ZTsKKyAgYm9vbCBJc0F0RW5kID0gZmFsc2U7CisgIGJvb2wgV2FzUHJldmlvdXNUb2tlbkZsb3dFbnRyeSA9IHRydWU7IC8vIFN0YXJ0IHdpdGggYW4gaW1hZ2luYXJ5ICcsJy4KKyAgTm9kZSAqQ3VycmVudEVudHJ5ID0gbnVsbHB0cjsKK307CisKKy8vLyBcYnJpZWYgUmVwcmVzZW50cyBhbiBhbGlhcyB0byBhIE5vZGUgd2l0aCBhbiBhbmNob3IuCisvLy8KKy8vLyBFeGFtcGxlOgorLy8vICAgKkFuY2hvck5hbWUKK2NsYXNzIEFsaWFzTm9kZSBmaW5hbCA6IHB1YmxpYyBOb2RlIHsKKyAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworcHVibGljOgorICBBbGlhc05vZGUoc3RkOjp1bmlxdWVfcHRyPERvY3VtZW50PiAmRCwgU3RyaW5nUmVmIFZhbCkKKyAgICAgIDogTm9kZShOS19BbGlhcywgRCwgU3RyaW5nUmVmKCksIFN0cmluZ1JlZigpKSwgTmFtZShWYWwpIHt9CisKKyAgU3RyaW5nUmVmIGdldE5hbWUoKSBjb25zdCB7IHJldHVybiBOYW1lOyB9CisgIE5vZGUgKmdldFRhcmdldCgpOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgTm9kZSAqTikgeyByZXR1cm4gTi0+Z2V0VHlwZSgpID09IE5LX0FsaWFzOyB9CisKK3ByaXZhdGU6CisgIFN0cmluZ1JlZiBOYW1lOworfTsKKworLy8vIFxicmllZiBBIFlBTUwgU3RyZWFtIGlzIGEgc2VxdWVuY2Ugb2YgRG9jdW1lbnRzLiBBIGRvY3VtZW50IGNvbnRhaW5zIGEgcm9vdAorLy8vICAgICAgICBub2RlLgorY2xhc3MgRG9jdW1lbnQgeworcHVibGljOgorICBEb2N1bWVudChTdHJlYW0gJlBhcmVudFN0cmVhbSk7CisKKyAgLy8vIFxicmllZiBSb290IGZvciBwYXJzaW5nIGEgbm9kZS4gUmV0dXJucyBhIHNpbmdsZSBub2RlLgorICBOb2RlICpwYXJzZUJsb2NrTm9kZSgpOworCisgIC8vLyBcYnJpZWYgRmluaXNoIHBhcnNpbmcgdGhlIGN1cnJlbnQgZG9jdW1lbnQgYW5kIHJldHVybiB0cnVlIGlmIHRoZXJlIGFyZQorICAvLy8gICAgICAgIG1vcmUuIFJldHVybiBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgc2tpcCgpOworCisgIC8vLyBcYnJpZWYgUGFyc2UgYW5kIHJldHVybiB0aGUgcm9vdCBsZXZlbCBub2RlLgorICBOb2RlICpnZXRSb290KCkgeworICAgIGlmIChSb290KQorICAgICAgcmV0dXJuIFJvb3Q7CisgICAgcmV0dXJuIFJvb3QgPSBwYXJzZUJsb2NrTm9kZSgpOworICB9CisKKyAgY29uc3Qgc3RkOjptYXA8U3RyaW5nUmVmLCBTdHJpbmdSZWY+ICZnZXRUYWdNYXAoKSBjb25zdCB7IHJldHVybiBUYWdNYXA7IH0KKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIE5vZGU7CisgIGZyaWVuZCBjbGFzcyBkb2N1bWVudF9pdGVyYXRvcjsKKworICAvLy8gXGJyaWVmIFN0cmVhbSB0byByZWFkIHRva2VucyBmcm9tLgorICBTdHJlYW0gJnN0cmVhbTsKKworICAvLy8gXGJyaWVmIFVzZWQgdG8gYWxsb2NhdGUgbm9kZXMgdG8uIEFsbCBhcmUgZGVzdHJveWVkIHdpdGhvdXQgY2FsbGluZyB0aGVpcgorICAvLy8gICAgICAgIGRlc3RydWN0b3Igd2hlbiB0aGUgZG9jdW1lbnQgaXMgZGVzdHJveWVkLgorICBCdW1wUHRyQWxsb2NhdG9yIE5vZGVBbGxvY2F0b3I7CisKKyAgLy8vIFxicmllZiBUaGUgcm9vdCBub2RlLiBVc2VkIHRvIHN1cHBvcnQgc2tpcHBpbmcgYSBwYXJ0aWFsbHkgcGFyc2VkCisgIC8vLyAgICAgICAgZG9jdW1lbnQuCisgIE5vZGUgKlJvb3Q7CisKKyAgLy8vIFxicmllZiBNYXBzIHRhZyBwcmVmaXhlcyB0byB0aGVpciBleHBhbnNpb24uCisgIHN0ZDo6bWFwPFN0cmluZ1JlZiwgU3RyaW5nUmVmPiBUYWdNYXA7CisKKyAgVG9rZW4gJnBlZWtOZXh0KCk7CisgIFRva2VuIGdldE5leHQoKTsKKyAgdm9pZCBzZXRFcnJvcihjb25zdCBUd2luZSAmTWVzc2FnZSwgVG9rZW4gJkxvY2F0aW9uKSBjb25zdDsKKyAgYm9vbCBmYWlsZWQoKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFBhcnNlICVCTEFIIGRpcmVjdGl2ZXMgYW5kIHJldHVybiB0cnVlIGlmIGFueSB3ZXJlIGVuY291bnRlcmVkLgorICBib29sIHBhcnNlRGlyZWN0aXZlcygpOworCisgIC8vLyBcYnJpZWYgUGFyc2UgJVlBTUwKKyAgdm9pZCBwYXJzZVlBTUxEaXJlY3RpdmUoKTsKKworICAvLy8gXGJyaWVmIFBhcnNlICVUQUcKKyAgdm9pZCBwYXJzZVRBR0RpcmVjdGl2ZSgpOworCisgIC8vLyBcYnJpZWYgQ29uc3VtZSB0aGUgbmV4dCB0b2tlbiBhbmQgZXJyb3IgaWYgaXQgaXMgbm90IFxhIFRLLgorICBib29sIGV4cGVjdFRva2VuKGludCBUSyk7Cit9OworCisvLy8gXGJyaWVmIEl0ZXJhdG9yIGFic3RyYWN0aW9uIGZvciBEb2N1bWVudHMgb3ZlciBhIFN0cmVhbS4KK2NsYXNzIGRvY3VtZW50X2l0ZXJhdG9yIHsKK3B1YmxpYzoKKyAgZG9jdW1lbnRfaXRlcmF0b3IoKSA9IGRlZmF1bHQ7CisgIGRvY3VtZW50X2l0ZXJhdG9yKHN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gJkQpIDogRG9jKCZEKSB7fQorCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBkb2N1bWVudF9pdGVyYXRvciAmT3RoZXIpIGNvbnN0IHsKKyAgICBpZiAoaXNBdEVuZCgpIHx8IE90aGVyLmlzQXRFbmQoKSkKKyAgICAgIHJldHVybiBpc0F0RW5kKCkgJiYgT3RoZXIuaXNBdEVuZCgpOworCisgICAgcmV0dXJuIERvYyA9PSBPdGhlci5Eb2M7CisgIH0KKyAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGRvY3VtZW50X2l0ZXJhdG9yICZPdGhlcikgY29uc3QgeworICAgIHJldHVybiAhKCp0aGlzID09IE90aGVyKTsKKyAgfQorCisgIGRvY3VtZW50X2l0ZXJhdG9yIG9wZXJhdG9yKysoKSB7CisgICAgYXNzZXJ0KERvYyAmJiAiaW5jcmVtZW50aW5nIGl0ZXJhdG9yIHBhc3QgdGhlIGVuZC4iKTsKKyAgICBpZiAoISgqRG9jKS0+c2tpcCgpKSB7CisgICAgICBEb2MtPnJlc2V0KG51bGxwdHIpOworICAgIH0gZWxzZSB7CisgICAgICBTdHJlYW0gJlMgPSAoKkRvYyktPnN0cmVhbTsKKyAgICAgIERvYy0+cmVzZXQobmV3IERvY3VtZW50KFMpKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgRG9jdW1lbnQgJm9wZXJhdG9yKigpIHsgcmV0dXJuICpEb2MtPmdldCgpOyB9CisKKyAgc3RkOjp1bmlxdWVfcHRyPERvY3VtZW50PiAmb3BlcmF0b3ItPigpIHsgcmV0dXJuICpEb2M7IH0KKworcHJpdmF0ZToKKyAgYm9vbCBpc0F0RW5kKCkgY29uc3QgeyByZXR1cm4gIURvYyB8fCAhKkRvYzsgfQorCisgIHN0ZDo6dW5pcXVlX3B0cjxEb2N1bWVudD4gKkRvYyA9IG51bGxwdHI7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgeWFtbAorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX1lBTUxQQVJTRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L1lBTUxUcmFpdHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9ZQU1MVHJhaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjg3NGFkNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9ZQU1MVHJhaXRzLmgKQEAgLTAsMCArMSwxNzYzIEBACisvLz09PS0gbGx2bS9TdXBwb3J0L1lBTUxUcmFpdHMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBMaW5rZXIKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9ZQU1MVFJBSVRTX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1lBTUxUUkFJVFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvT3B0aW9uYWwuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ0V4dHJhcy5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsaWduT2YuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0VuZGlhbi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9SZWdleC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Tb3VyY2VNZ3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvWUFNTFBhcnNlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y2N0eXBlPgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPG5ldz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3lzdGVtX2Vycm9yPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHlhbWwgeworCitzdHJ1Y3QgRW1wdHlDb250ZXh0IHt9OworCisvLy8gVGhpcyBjbGFzcyBzaG91bGQgYmUgc3BlY2lhbGl6ZWQgYnkgYW55IHR5cGUgdGhhdCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQKKy8vLyB0by9mcm9tIGEgWUFNTCBtYXBwaW5nLiAgRm9yIGV4YW1wbGU6CisvLy8KKy8vLyAgICAgc3RydWN0IE1hcHBpbmdUcmFpdHM8TXlTdHJ1Y3Q+IHsKKy8vLyAgICAgICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZpbywgTXlTdHJ1Y3QgJnMpIHsKKy8vLyAgICAgICAgIGlvLm1hcFJlcXVpcmVkKCJuYW1lIiwgcy5uYW1lKTsKKy8vLyAgICAgICAgIGlvLm1hcFJlcXVpcmVkKCJzaXplIiwgcy5zaXplKTsKKy8vLyAgICAgICAgIGlvLm1hcE9wdGlvbmFsKCJhZ2UiLCAgcy5hZ2UpOworLy8vICAgICAgIH0KKy8vLyAgICAgfTsKK3RlbXBsYXRlPGNsYXNzIFQ+CitzdHJ1Y3QgTWFwcGluZ1RyYWl0cyB7CisgIC8vIE11c3QgcHJvdmlkZToKKyAgLy8gc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmaW8sIFQgJmZpZWxkcyk7CisgIC8vIE9wdGlvbmFsbHkgbWF5IHByb3ZpZGU6CisgIC8vIHN0YXRpYyBTdHJpbmdSZWYgdmFsaWRhdGUoSU8gJmlvLCBUICZmaWVsZHMpOworICAvLworICAvLyBUaGUgb3B0aW9uYWwgZmxvdyBmbGFnIHdpbGwgY2F1c2UgZ2VuZXJhdGVkIFlBTUwgdG8gdXNlIGEgZmxvdyBtYXBwaW5nCisgIC8vIChlLmcuIHsgYTogMCwgYjogMSB9KToKKyAgLy8gc3RhdGljIGNvbnN0IGJvb2wgZmxvdyA9IHRydWU7Cit9OworCisvLy8gVGhpcyBjbGFzcyBpcyBzaW1pbGFyIHRvIE1hcHBpbmdUcmFpdHM8VD4gYnV0IGFsbG93cyB5b3UgdG8gcGFzcyBpbgorLy8vIGFkZGl0aW9uYWwgY29udGV4dCBmb3IgZWFjaCBtYXAgb3BlcmF0aW9uLiAgRm9yIGV4YW1wbGU6CisvLy8KKy8vLyAgICAgc3RydWN0IE1hcHBpbmdDb250ZXh0VHJhaXRzPE15U3RydWN0LCBNeUNvbnRleHQ+IHsKKy8vLyAgICAgICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZpbywgTXlTdHJ1Y3QgJnMsIE15Q29udGV4dCAmYykgeworLy8vICAgICAgICAgaW8ubWFwUmVxdWlyZWQoIm5hbWUiLCBzLm5hbWUpOworLy8vICAgICAgICAgaW8ubWFwUmVxdWlyZWQoInNpemUiLCBzLnNpemUpOworLy8vICAgICAgICAgaW8ubWFwT3B0aW9uYWwoImFnZSIsICBzLmFnZSk7CisvLy8gICAgICAgICArK2MuVGltZXNNYXBwZWQ7CisvLy8gICAgICAgfQorLy8vICAgICB9OwordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENvbnRleHQ+IHN0cnVjdCBNYXBwaW5nQ29udGV4dFRyYWl0cyB7CisgIC8vIE11c3QgcHJvdmlkZToKKyAgLy8gc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmaW8sIFQgJmZpZWxkcywgQ29udGV4dCAmQ3R4KTsKKyAgLy8gT3B0aW9uYWxseSBtYXkgcHJvdmlkZToKKyAgLy8gc3RhdGljIFN0cmluZ1JlZiB2YWxpZGF0ZShJTyAmaW8sIFQgJmZpZWxkcywgQ29udGV4dCAmQ3R4KTsKKyAgLy8KKyAgLy8gVGhlIG9wdGlvbmFsIGZsb3cgZmxhZyB3aWxsIGNhdXNlIGdlbmVyYXRlZCBZQU1MIHRvIHVzZSBhIGZsb3cgbWFwcGluZworICAvLyAoZS5nLiB7IGE6IDAsIGI6IDEgfSk6CisgIC8vIHN0YXRpYyBjb25zdCBib29sIGZsb3cgPSB0cnVlOworfTsKKworLy8vIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHNwZWNpYWxpemVkIGJ5IGFueSBpbnRlZ3JhbCB0eXBlIHRoYXQgY29udmVydHMKKy8vLyB0by9mcm9tIGEgWUFNTCBzY2FsYXIgd2hlcmUgdGhlcmUgaXMgYSBvbmUtdG8tb25lIG1hcHBpbmcgYmV0d2VlbgorLy8vIGluLW1lbW9yeSB2YWx1ZXMgYW5kIGEgc3RyaW5nIGluIFlBTUwuICBGb3IgZXhhbXBsZToKKy8vLworLy8vICAgICBzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8Q29sb3JzPiB7CisvLy8gICAgICAgICBzdGF0aWMgdm9pZCBlbnVtZXJhdGlvbihJTyAmaW8sIENvbG9ycyAmdmFsdWUpIHsKKy8vLyAgICAgICAgICAgaW8uZW51bUNhc2UodmFsdWUsICJyZWQiLCAgIGNSZWQpOworLy8vICAgICAgICAgICBpby5lbnVtQ2FzZSh2YWx1ZSwgImJsdWUiLCAgY0JsdWUpOworLy8vICAgICAgICAgICBpby5lbnVtQ2FzZSh2YWx1ZSwgImdyZWVuIiwgY0dyZWVuKTsKKy8vLyAgICAgICAgIH0KKy8vLyAgICAgICB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0cyB7CisgIC8vIE11c3QgcHJvdmlkZToKKyAgLy8gc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJmlvLCBUICZ2YWx1ZSk7Cit9OworCisvLy8gVGhpcyBjbGFzcyBzaG91bGQgYmUgc3BlY2lhbGl6ZWQgYnkgYW55IGludGVnZXIgdHlwZSB0aGF0IGlzIGEgdW5pb24KKy8vLyBvZiBiaXQgdmFsdWVzIGFuZCB0aGUgWUFNTCByZXByZXNlbnRhdGlvbiBpcyBhIGZsb3cgc2VxdWVuY2Ugb2YKKy8vLyBzdHJpbmdzLiAgRm9yIGV4YW1wbGU6CisvLy8KKy8vLyAgICAgIHN0cnVjdCBTY2FsYXJCaXRTZXRUcmFpdHM8TXlGbGFncz4geworLy8vICAgICAgICBzdGF0aWMgdm9pZCBiaXRzZXQoSU8gJmlvLCBNeUZsYWdzICZ2YWx1ZSkgeworLy8vICAgICAgICAgIGlvLmJpdFNldENhc2UodmFsdWUsICJiaWciLCAgIGZsYWdCaWcpOworLy8vICAgICAgICAgIGlvLmJpdFNldENhc2UodmFsdWUsICJmbGF0IiwgIGZsYWdGbGF0KTsKKy8vLyAgICAgICAgICBpby5iaXRTZXRDYXNlKHZhbHVlLCAicm91bmQiLCBmbGFnUm91bmQpOworLy8vICAgICAgICB9CisvLy8gICAgICB9OwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBTY2FsYXJCaXRTZXRUcmFpdHMgeworICAvLyBNdXN0IHByb3ZpZGU6CisgIC8vIHN0YXRpYyB2b2lkIGJpdHNldChJTyAmaW8sIFQgJnZhbHVlKTsKK307CisKKy8vLyBEZXNjcmliZSB3aGljaCB0eXBlIG9mIHF1b3RlcyBzaG91bGQgYmUgdXNlZCB3aGVuIHF1b3RpbmcgaXMgbmVjZXNzYXJ5LgorLy8vIFNvbWUgbm9uLXByaW50YWJsZSBjaGFyYWN0ZXJzIG5lZWQgdG8gYmUgZG91YmxlLXF1b3RlZCwgd2hpbGUgc29tZSBvdGhlcnMKKy8vLyBhcmUgZmluZSB3aXRoIHNpbXBsZS1xdW90aW5nLCBhbmQgc29tZSBkb24ndCBuZWVkIGFueSBxdW90aW5nLgorZW51bSBjbGFzcyBRdW90aW5nVHlwZSB7IE5vbmUsIFNpbmdsZSwgRG91YmxlIH07CisKKy8vLyBUaGlzIGNsYXNzIHNob3VsZCBiZSBzcGVjaWFsaXplZCBieSB0eXBlIHRoYXQgcmVxdWlyZXMgY3VzdG9tIGNvbnZlcnNpb24KKy8vLyB0by9mcm9tIGEgeWFtbCBzY2FsYXIuICBGb3IgZXhhbXBsZToKKy8vLworLy8vICAgIHRlbXBsYXRlPD4KKy8vLyAgICBzdHJ1Y3QgU2NhbGFyVHJhaXRzPE15VHlwZT4geworLy8vICAgICAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IE15VHlwZSAmdmFsLCB2b2lkKiwgbGx2bTo6cmF3X29zdHJlYW0gJm91dCkgeworLy8vICAgICAgICAvLyBzdHJlYW0gb3V0IGN1c3RvbSBmb3JtYXR0aW5nCisvLy8gICAgICAgIG91dCA8PCBsbHZtOjpmb3JtYXQoIiV4IiwgdmFsKTsKKy8vLyAgICAgIH0KKy8vLyAgICAgIHN0YXRpYyBTdHJpbmdSZWYgaW5wdXQoU3RyaW5nUmVmIHNjYWxhciwgdm9pZCosIE15VHlwZSAmdmFsdWUpIHsKKy8vLyAgICAgICAgLy8gcGFyc2Ugc2NhbGFyIGFuZCBzZXQgYHZhbHVlYAorLy8vICAgICAgICAvLyByZXR1cm4gZW1wdHkgc3RyaW5nIG9uIHN1Y2Nlc3MsIG9yIGVycm9yIHN0cmluZworLy8vICAgICAgICByZXR1cm4gU3RyaW5nUmVmKCk7CisvLy8gICAgICB9CisvLy8gICAgICBzdGF0aWMgUXVvdGluZ1R5cGUgbXVzdFF1b3RlKFN0cmluZ1JlZikgeyByZXR1cm4gUXVvdGluZ1R5cGU6OlNpbmdsZTsgfQorLy8vICAgIH07Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IFNjYWxhclRyYWl0cyB7CisgIC8vIE11c3QgcHJvdmlkZToKKyAgLy8KKyAgLy8gRnVuY3Rpb24gdG8gd3JpdGUgdGhlIHZhbHVlIGFzIGEgc3RyaW5nOgorICAvL3N0YXRpYyB2b2lkIG91dHB1dChjb25zdCBUICZ2YWx1ZSwgdm9pZCAqY3R4dCwgbGx2bTo6cmF3X29zdHJlYW0gJm91dCk7CisgIC8vCisgIC8vIEZ1bmN0aW9uIHRvIGNvbnZlcnQgYSBzdHJpbmcgdG8gYSB2YWx1ZS4gIFJldHVybnMgdGhlIGVtcHR5CisgIC8vIFN0cmluZ1JlZiBvbiBzdWNjZXNzIG9yIGFuIGVycm9yIHN0cmluZyBpZiBzdHJpbmcgaXMgbWFsZm9ybWVkOgorICAvL3N0YXRpYyBTdHJpbmdSZWYgaW5wdXQoU3RyaW5nUmVmIHNjYWxhciwgdm9pZCAqY3R4dCwgVCAmdmFsdWUpOworICAvLworICAvLyBGdW5jdGlvbiB0byBkZXRlcm1pbmUgaWYgdGhlIHZhbHVlIHNob3VsZCBiZSBxdW90ZWQuCisgIC8vc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYpOworfTsKKworLy8vIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHNwZWNpYWxpemVkIGJ5IHR5cGUgdGhhdCByZXF1aXJlcyBjdXN0b20gY29udmVyc2lvbgorLy8vIHRvL2Zyb20gYSBZQU1MIGxpdGVyYWwgYmxvY2sgc2NhbGFyLiBGb3IgZXhhbXBsZToKKy8vLworLy8vICAgIHRlbXBsYXRlIDw+CisvLy8gICAgc3RydWN0IEJsb2NrU2NhbGFyVHJhaXRzPE15VHlwZT4geworLy8vICAgICAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IE15VHlwZSAmVmFsdWUsIHZvaWQqLCBsbHZtOjpyYXdfb3N0cmVhbSAmT3V0KQorLy8vICAgICAgeworLy8vICAgICAgICAvLyBzdHJlYW0gb3V0IGN1c3RvbSBmb3JtYXR0aW5nCisvLy8gICAgICAgIE91dCA8PCBWYWw7CisvLy8gICAgICB9CisvLy8gICAgICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiBTY2FsYXIsIHZvaWQqLCBNeVR5cGUgJlZhbHVlKSB7CisvLy8gICAgICAgIC8vIHBhcnNlIHNjYWxhciBhbmQgc2V0IGB2YWx1ZWAKKy8vLyAgICAgICAgLy8gcmV0dXJuIGVtcHR5IHN0cmluZyBvbiBzdWNjZXNzLCBvciBlcnJvciBzdHJpbmcKKy8vLyAgICAgICAgcmV0dXJuIFN0cmluZ1JlZigpOworLy8vICAgICAgfQorLy8vICAgIH07Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBCbG9ja1NjYWxhclRyYWl0cyB7CisgIC8vIE11c3QgcHJvdmlkZToKKyAgLy8KKyAgLy8gRnVuY3Rpb24gdG8gd3JpdGUgdGhlIHZhbHVlIGFzIGEgc3RyaW5nOgorICAvLyBzdGF0aWMgdm9pZCBvdXRwdXQoY29uc3QgVCAmVmFsdWUsIHZvaWQgKmN0eCwgbGx2bTo6cmF3X29zdHJlYW0gJk91dCk7CisgIC8vCisgIC8vIEZ1bmN0aW9uIHRvIGNvbnZlcnQgYSBzdHJpbmcgdG8gYSB2YWx1ZS4gIFJldHVybnMgdGhlIGVtcHR5CisgIC8vIFN0cmluZ1JlZiBvbiBzdWNjZXNzIG9yIGFuIGVycm9yIHN0cmluZyBpZiBzdHJpbmcgaXMgbWFsZm9ybWVkOgorICAvLyBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiBTY2FsYXIsIHZvaWQgKmN0eHQsIFQgJlZhbHVlKTsKK307CisKKy8vLyBUaGlzIGNsYXNzIHNob3VsZCBiZSBzcGVjaWFsaXplZCBieSBhbnkgdHlwZSB0aGF0IG5lZWRzIHRvIGJlIGNvbnZlcnRlZAorLy8vIHRvL2Zyb20gYSBZQU1MIHNlcXVlbmNlLiAgRm9yIGV4YW1wbGU6CisvLy8KKy8vLyAgICB0ZW1wbGF0ZTw+CisvLy8gICAgc3RydWN0IFNlcXVlbmNlVHJhaXRzPE15Q29udGFpbmVyPiB7CisvLy8gICAgICBzdGF0aWMgc2l6ZV90IHNpemUoSU8gJmlvLCBNeUNvbnRhaW5lciAmc2VxKSB7CisvLy8gICAgICAgIHJldHVybiBzZXEuc2l6ZSgpOworLy8vICAgICAgfQorLy8vICAgICAgc3RhdGljIE15VHlwZSYgZWxlbWVudChJTyAmLCBNeUNvbnRhaW5lciAmc2VxLCBzaXplX3QgaW5kZXgpIHsKKy8vLyAgICAgICAgaWYgKCBpbmRleCA+PSBzZXEuc2l6ZSgpICkKKy8vLyAgICAgICAgICBzZXEucmVzaXplKGluZGV4KzEpOworLy8vICAgICAgICByZXR1cm4gc2VxW2luZGV4XTsKKy8vLyAgICAgIH0KKy8vLyAgICB9OwordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRW5hYmxlSWYgPSB2b2lkPgorc3RydWN0IFNlcXVlbmNlVHJhaXRzIHsKKyAgLy8gTXVzdCBwcm92aWRlOgorICAvLyBzdGF0aWMgc2l6ZV90IHNpemUoSU8gJmlvLCBUICZzZXEpOworICAvLyBzdGF0aWMgVDo6dmFsdWVfdHlwZSYgZWxlbWVudChJTyAmaW8sIFQgJnNlcSwgc2l6ZV90IGluZGV4KTsKKyAgLy8KKyAgLy8gVGhlIGZvbGxvd2luZyBpcyBvcHRpb24gYW5kIHdpbGwgY2F1c2UgZ2VuZXJhdGVkIFlBTUwgdG8gdXNlCisgIC8vIGEgZmxvdyBzZXF1ZW5jZSAoZS5nLiBbYSxiLGNdKS4KKyAgLy8gc3RhdGljIGNvbnN0IGJvb2wgZmxvdyA9IHRydWU7Cit9OworCisvLy8gVGhpcyBjbGFzcyBzaG91bGQgYmUgc3BlY2lhbGl6ZWQgYnkgYW55IHR5cGUgZm9yIHdoaWNoIHZlY3RvcnMgb2YgdGhhdAorLy8vIHR5cGUgbmVlZCB0byBiZSBjb252ZXJ0ZWQgdG8vZnJvbSBhIFlBTUwgc2VxdWVuY2UuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBFbmFibGVJZiA9IHZvaWQ+CitzdHJ1Y3QgU2VxdWVuY2VFbGVtZW50VHJhaXRzIHsKKyAgLy8gTXVzdCBwcm92aWRlOgorICAvLyBzdGF0aWMgY29uc3QgYm9vbCBmbG93OworfTsKKworLy8vIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHNwZWNpYWxpemVkIGJ5IGFueSB0eXBlIHRoYXQgbmVlZHMgdG8gYmUgY29udmVydGVkCisvLy8gdG8vZnJvbSBhIGxpc3Qgb2YgWUFNTCBkb2N1bWVudHMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IERvY3VtZW50TGlzdFRyYWl0cyB7CisgIC8vIE11c3QgcHJvdmlkZToKKyAgLy8gc3RhdGljIHNpemVfdCBzaXplKElPICZpbywgVCAmc2VxKTsKKyAgLy8gc3RhdGljIFQ6OnZhbHVlX3R5cGUmIGVsZW1lbnQoSU8gJmlvLCBUICZzZXEsIHNpemVfdCBpbmRleCk7Cit9OworCisvLy8gVGhpcyBjbGFzcyBzaG91bGQgYmUgc3BlY2lhbGl6ZWQgYnkgYW55IHR5cGUgdGhhdCBuZWVkcyB0byBiZSBjb252ZXJ0ZWQKKy8vLyB0by9mcm9tIGEgWUFNTCBtYXBwaW5nIGluIHRoZSBjYXNlIHdoZXJlIHRoZSBuYW1lcyBvZiB0aGUga2V5cyBhcmUgbm90IGtub3duCisvLy8gaW4gYWR2YW5jZSwgZS5nLiBhIHN0cmluZyBtYXAuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBDdXN0b21NYXBwaW5nVHJhaXRzIHsKKyAgLy8gc3RhdGljIHZvaWQgaW5wdXRPbmUoSU8gJmlvLCBTdHJpbmdSZWYga2V5LCBUICZlbGVtKTsKKyAgLy8gc3RhdGljIHZvaWQgb3V0cHV0KElPICZpbywgVCAmZWxlbSk7Cit9OworCisvLyBPbmx5IHVzZWQgZm9yIGJldHRlciBkaWFnbm9zdGljcyBvZiBtaXNzaW5nIHRyYWl0cwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgTWlzc2luZ1RyYWl0OworCisvLyBUZXN0IGlmIFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPFQ+IGlzIGRlZmluZWQgb24gdHlwZSBULgordGVtcGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3QgaGFzX1NjYWxhckVudW1lcmF0aW9uVHJhaXRzCit7CisgIHVzaW5nIFNpZ25hdHVyZV9lbnVtZXJhdGlvbiA9IHZvaWQgKCopKGNsYXNzIElPJiwgVCYpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBzdGF0aWMgY2hhciB0ZXN0KFNhbWVUeXBlPFNpZ25hdHVyZV9lbnVtZXJhdGlvbiwgJlU6OmVudW1lcmF0aW9uPiopOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBzdGF0aWMgZG91YmxlIHRlc3QoLi4uKTsKKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjb25zdCB2YWx1ZSA9CisgICAgKHNpemVvZih0ZXN0PFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPFQ+PihudWxscHRyKSkgPT0gMSk7Cit9OworCisvLyBUZXN0IGlmIFNjYWxhckJpdFNldFRyYWl0czxUPiBpcyBkZWZpbmVkIG9uIHR5cGUgVC4KK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IGhhc19TY2FsYXJCaXRTZXRUcmFpdHMKK3sKKyAgdXNpbmcgU2lnbmF0dXJlX2JpdHNldCA9IHZvaWQgKCopKGNsYXNzIElPJiwgVCYpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBzdGF0aWMgY2hhciB0ZXN0KFNhbWVUeXBlPFNpZ25hdHVyZV9iaXRzZXQsICZVOjpiaXRzZXQ+Kik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIHN0YXRpYyBkb3VibGUgdGVzdCguLi4pOworCitwdWJsaWM6CisgIHN0YXRpYyBib29sIGNvbnN0IHZhbHVlID0gKHNpemVvZih0ZXN0PFNjYWxhckJpdFNldFRyYWl0czxUPj4obnVsbHB0cikpID09IDEpOworfTsKKworLy8gVGVzdCBpZiBTY2FsYXJUcmFpdHM8VD4gaXMgZGVmaW5lZCBvbiB0eXBlIFQuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3N0cnVjdCBoYXNfU2NhbGFyVHJhaXRzCit7CisgIHVzaW5nIFNpZ25hdHVyZV9pbnB1dCA9IFN0cmluZ1JlZiAoKikoU3RyaW5nUmVmLCB2b2lkKiwgVCYpOworICB1c2luZyBTaWduYXR1cmVfb3V0cHV0ID0gdm9pZCAoKikoY29uc3QgVCYsIHZvaWQqLCByYXdfb3N0cmVhbSYpOworICB1c2luZyBTaWduYXR1cmVfbXVzdFF1b3RlID0gUXVvdGluZ1R5cGUgKCopKFN0cmluZ1JlZik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIHN0YXRpYyBjaGFyIHRlc3QoU2FtZVR5cGU8U2lnbmF0dXJlX2lucHV0LCAmVTo6aW5wdXQ+ICosCisgICAgICAgICAgICAgICAgICAgU2FtZVR5cGU8U2lnbmF0dXJlX291dHB1dCwgJlU6Om91dHB1dD4gKiwKKyAgICAgICAgICAgICAgICAgICBTYW1lVHlwZTxTaWduYXR1cmVfbXVzdFF1b3RlLCAmVTo6bXVzdFF1b3RlPiAqKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgc3RhdGljIGRvdWJsZSB0ZXN0KC4uLik7CisKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgY29uc3QgdmFsdWUgPQorICAgICAgKHNpemVvZih0ZXN0PFNjYWxhclRyYWl0czxUPj4obnVsbHB0ciwgbnVsbHB0ciwgbnVsbHB0cikpID09IDEpOworfTsKKworLy8gVGVzdCBpZiBCbG9ja1NjYWxhclRyYWl0czxUPiBpcyBkZWZpbmVkIG9uIHR5cGUgVC4KK3RlbXBsYXRlIDxjbGFzcyBUPgorc3RydWN0IGhhc19CbG9ja1NjYWxhclRyYWl0cworeworICB1c2luZyBTaWduYXR1cmVfaW5wdXQgPSBTdHJpbmdSZWYgKCopKFN0cmluZ1JlZiwgdm9pZCAqLCBUICYpOworICB1c2luZyBTaWduYXR1cmVfb3V0cHV0ID0gdm9pZCAoKikoY29uc3QgVCAmLCB2b2lkICosIHJhd19vc3RyZWFtICYpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBzdGF0aWMgY2hhciB0ZXN0KFNhbWVUeXBlPFNpZ25hdHVyZV9pbnB1dCwgJlU6OmlucHV0PiAqLAorICAgICAgICAgICAgICAgICAgIFNhbWVUeXBlPFNpZ25hdHVyZV9vdXRwdXQsICZVOjpvdXRwdXQ+ICopOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBzdGF0aWMgZG91YmxlIHRlc3QoLi4uKTsKKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjb25zdCB2YWx1ZSA9CisgICAgICAoc2l6ZW9mKHRlc3Q8QmxvY2tTY2FsYXJUcmFpdHM8VD4+KG51bGxwdHIsIG51bGxwdHIpKSA9PSAxKTsKK307CisKKy8vIFRlc3QgaWYgTWFwcGluZ0NvbnRleHRUcmFpdHM8VD4gaXMgZGVmaW5lZCBvbiB0eXBlIFQuCit0ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQ29udGV4dD4gc3RydWN0IGhhc19NYXBwaW5nVHJhaXRzIHsKKyAgdXNpbmcgU2lnbmF0dXJlX21hcHBpbmcgPSB2b2lkICgqKShjbGFzcyBJTyAmLCBUICYsIENvbnRleHQgJik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIHN0YXRpYyBjaGFyIHRlc3QoU2FtZVR5cGU8U2lnbmF0dXJlX21hcHBpbmcsICZVOjptYXBwaW5nPiopOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBzdGF0aWMgZG91YmxlIHRlc3QoLi4uKTsKKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjb25zdCB2YWx1ZSA9CisgICAgICAoc2l6ZW9mKHRlc3Q8TWFwcGluZ0NvbnRleHRUcmFpdHM8VCwgQ29udGV4dD4+KG51bGxwdHIpKSA9PSAxKTsKK307CisKKy8vIFRlc3QgaWYgTWFwcGluZ1RyYWl0czxUPiBpcyBkZWZpbmVkIG9uIHR5cGUgVC4KK3RlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgaGFzX01hcHBpbmdUcmFpdHM8VCwgRW1wdHlDb250ZXh0PiB7CisgIHVzaW5nIFNpZ25hdHVyZV9tYXBwaW5nID0gdm9pZCAoKikoY2xhc3MgSU8gJiwgVCAmKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgc3RhdGljIGNoYXIgdGVzdChTYW1lVHlwZTxTaWduYXR1cmVfbWFwcGluZywgJlU6Om1hcHBpbmc+ICopOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiBzdGF0aWMgZG91YmxlIHRlc3QoLi4uKTsKKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjb25zdCB2YWx1ZSA9IChzaXplb2YodGVzdDxNYXBwaW5nVHJhaXRzPFQ+PihudWxscHRyKSkgPT0gMSk7Cit9OworCisvLyBUZXN0IGlmIE1hcHBpbmdDb250ZXh0VHJhaXRzPFQ+Ojp2YWxpZGF0ZSgpIGlzIGRlZmluZWQgb24gdHlwZSBULgordGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIENvbnRleHQ+IHN0cnVjdCBoYXNfTWFwcGluZ1ZhbGlkYXRlVHJhaXRzIHsKKyAgdXNpbmcgU2lnbmF0dXJlX3ZhbGlkYXRlID0gU3RyaW5nUmVmICgqKShjbGFzcyBJTyAmLCBUICYsIENvbnRleHQgJik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIHN0YXRpYyBjaGFyIHRlc3QoU2FtZVR5cGU8U2lnbmF0dXJlX3ZhbGlkYXRlLCAmVTo6dmFsaWRhdGU+Kik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIHN0YXRpYyBkb3VibGUgdGVzdCguLi4pOworCitwdWJsaWM6CisgIHN0YXRpYyBib29sIGNvbnN0IHZhbHVlID0KKyAgICAgIChzaXplb2YodGVzdDxNYXBwaW5nQ29udGV4dFRyYWl0czxULCBDb250ZXh0Pj4obnVsbHB0cikpID09IDEpOworfTsKKworLy8gVGVzdCBpZiBNYXBwaW5nVHJhaXRzPFQ+Ojp2YWxpZGF0ZSgpIGlzIGRlZmluZWQgb24gdHlwZSBULgordGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBoYXNfTWFwcGluZ1ZhbGlkYXRlVHJhaXRzPFQsIEVtcHR5Q29udGV4dD4geworICB1c2luZyBTaWduYXR1cmVfdmFsaWRhdGUgPSBTdHJpbmdSZWYgKCopKGNsYXNzIElPICYsIFQgJik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIHN0YXRpYyBjaGFyIHRlc3QoU2FtZVR5cGU8U2lnbmF0dXJlX3ZhbGlkYXRlLCAmVTo6dmFsaWRhdGU+ICopOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiBzdGF0aWMgZG91YmxlIHRlc3QoLi4uKTsKKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjb25zdCB2YWx1ZSA9IChzaXplb2YodGVzdDxNYXBwaW5nVHJhaXRzPFQ+PihudWxscHRyKSkgPT0gMSk7Cit9OworCisvLyBUZXN0IGlmIFNlcXVlbmNlVHJhaXRzPFQ+IGlzIGRlZmluZWQgb24gdHlwZSBULgordGVtcGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3QgaGFzX1NlcXVlbmNlTWV0aG9kVHJhaXRzCit7CisgIHVzaW5nIFNpZ25hdHVyZV9zaXplID0gc2l6ZV90ICgqKShjbGFzcyBJTyYsIFQmKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgc3RhdGljIGNoYXIgdGVzdChTYW1lVHlwZTxTaWduYXR1cmVfc2l6ZSwgJlU6OnNpemU+Kik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIHN0YXRpYyBkb3VibGUgdGVzdCguLi4pOworCitwdWJsaWM6CisgIHN0YXRpYyBib29sIGNvbnN0IHZhbHVlID0gIChzaXplb2YodGVzdDxTZXF1ZW5jZVRyYWl0czxUPj4obnVsbHB0cikpID09IDEpOworfTsKKworLy8gVGVzdCBpZiBDdXN0b21NYXBwaW5nVHJhaXRzPFQ+IGlzIGRlZmluZWQgb24gdHlwZSBULgordGVtcGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3QgaGFzX0N1c3RvbU1hcHBpbmdUcmFpdHMKK3sKKyAgdXNpbmcgU2lnbmF0dXJlX2lucHV0ID0gdm9pZCAoKikoSU8gJmlvLCBTdHJpbmdSZWYga2V5LCBUICZ2KTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgc3RhdGljIGNoYXIgdGVzdChTYW1lVHlwZTxTaWduYXR1cmVfaW5wdXQsICZVOjppbnB1dE9uZT4qKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgc3RhdGljIGRvdWJsZSB0ZXN0KC4uLik7CisKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgY29uc3QgdmFsdWUgPQorICAgICAgKHNpemVvZih0ZXN0PEN1c3RvbU1hcHBpbmdUcmFpdHM8VD4+KG51bGxwdHIpKSA9PSAxKTsKK307CisKKy8vIGhhc19GbG93VHJhaXRzPGludD4gd2lsbCBjYXVzZSBhbiBlcnJvciB3aXRoIHNvbWUgY29tcGlsZXJzIGJlY2F1c2UKKy8vIGl0IHN1YmNsYXNzZXMgaW50LiAgVXNpbmcgdGhpcyB3cmFwcGVyIG9ubHkgaW5zdGFudGlhdGVzIHRoZQorLy8gcmVhbCBoYXNfRmxvd1RyYWl0cyBvbmx5IGlmIHRoZSB0ZW1wbGF0ZSB0eXBlIGlzIGEgY2xhc3MuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgYm9vbCBFbmFibGVkID0gc3RkOjppc19jbGFzczxUPjo6dmFsdWU+CitjbGFzcyBoYXNfRmxvd1RyYWl0cworeworcHVibGljOgorICAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPSBmYWxzZTsKK307CisKKy8vIFNvbWUgb2xkZXIgZ2NjIGNvbXBpbGVycyBkb24ndCBzdXBwb3J0IHN0cmFpZ2h0IGZvcndhcmQgdGVzdHMKKy8vIGZvciBtZW1iZXJzLCBzbyB0ZXN0IGZvciBhbWJpZ3VpdHkgY2F1c2UgYnkgdGhlIGJhc2UgYW5kIGRlcml2ZWQKKy8vIGNsYXNzZXMgYm90aCBkZWZpbmluZyB0aGUgbWVtYmVyLgordGVtcGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3QgaGFzX0Zsb3dUcmFpdHM8VCwgdHJ1ZT4KK3sKKyAgc3RydWN0IEZhbGxiYWNrIHsgYm9vbCBmbG93OyB9OworICBzdHJ1Y3QgRGVyaXZlZCA6IFQsIEZhbGxiYWNrIHsgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBDPgorICBzdGF0aWMgY2hhciAoJmYoU2FtZVR5cGU8Ym9vbCBGYWxsYmFjazo6KiwgJkM6OmZsb3c+KikpWzFdOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIEM+CisgIHN0YXRpYyBjaGFyICgmZiguLi4pKVsyXTsKKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjb25zdCB2YWx1ZSA9IHNpemVvZihmPERlcml2ZWQ+KG51bGxwdHIpKSA9PSAyOworfTsKKworLy8gVGVzdCBpZiBTZXF1ZW5jZVRyYWl0czxUPiBpcyBkZWZpbmVkIG9uIHR5cGUgVAordGVtcGxhdGU8dHlwZW5hbWUgVD4KK3N0cnVjdCBoYXNfU2VxdWVuY2VUcmFpdHMgOiBwdWJsaWMgc3RkOjppbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNfU2VxdWVuY2VNZXRob2RUcmFpdHM8VD46OnZhbHVlID4geyB9OworCisvLyBUZXN0IGlmIERvY3VtZW50TGlzdFRyYWl0czxUPiBpcyBkZWZpbmVkIG9uIHR5cGUgVAordGVtcGxhdGUgPGNsYXNzIFQ+CitzdHJ1Y3QgaGFzX0RvY3VtZW50TGlzdFRyYWl0cworeworICB1c2luZyBTaWduYXR1cmVfc2l6ZSA9IHNpemVfdCAoKikoY2xhc3MgSU8gJiwgVCAmKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgc3RhdGljIGNoYXIgdGVzdChTYW1lVHlwZTxTaWduYXR1cmVfc2l6ZSwgJlU6OnNpemU+Kik7CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIHN0YXRpYyBkb3VibGUgdGVzdCguLi4pOworCitwdWJsaWM6CisgIHN0YXRpYyBib29sIGNvbnN0IHZhbHVlID0gKHNpemVvZih0ZXN0PERvY3VtZW50TGlzdFRyYWl0czxUPj4obnVsbHB0cikpPT0xKTsKK307CisKK2lubGluZSBib29sIGlzTnVtYmVyKFN0cmluZ1JlZiBTKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyIE9jdGFsQ2hhcnNbXSA9ICIwMTIzNDU2NyI7CisgIGlmIChTLnN0YXJ0c3dpdGgoIjAiKSAmJgorICAgICAgUy5kcm9wX2Zyb250KCkuZmluZF9maXJzdF9ub3Rfb2YoT2N0YWxDaGFycykgPT0gU3RyaW5nUmVmOjpucG9zKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChTLnN0YXJ0c3dpdGgoIjBvIikgJiYKKyAgICAgIFMuZHJvcF9mcm9udCgyKS5maW5kX2ZpcnN0X25vdF9vZihPY3RhbENoYXJzKSA9PSBTdHJpbmdSZWY6Om5wb3MpCisgICAgcmV0dXJuIHRydWU7CisKKyAgc3RhdGljIGNvbnN0IGNoYXIgSGV4Q2hhcnNbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmQUJDREVGIjsKKyAgaWYgKFMuc3RhcnRzd2l0aCgiMHgiKSAmJgorICAgICAgUy5kcm9wX2Zyb250KDIpLmZpbmRfZmlyc3Rfbm90X29mKEhleENoYXJzKSA9PSBTdHJpbmdSZWY6Om5wb3MpCisgICAgcmV0dXJuIHRydWU7CisKKyAgc3RhdGljIGNvbnN0IGNoYXIgRGVjQ2hhcnNbXSA9ICIwMTIzNDU2Nzg5IjsKKyAgaWYgKFMuZmluZF9maXJzdF9ub3Rfb2YoRGVjQ2hhcnMpID09IFN0cmluZ1JlZjo6bnBvcykKKyAgICByZXR1cm4gdHJ1ZTsKKworICBpZiAoUy5lcXVhbHMoIi5pbmYiKSB8fCBTLmVxdWFscygiLkluZiIpIHx8IFMuZXF1YWxzKCIuSU5GIikpCisgICAgcmV0dXJuIHRydWU7CisKKyAgUmVnZXggRmxvYXRNYXRjaGVyKCJeKFxcLlswLTldK3xbMC05XSsoXFwuWzAtOV0qKT8pKFtlRV1bLStdP1swLTldKyk/JCIpOworICBpZiAoRmxvYXRNYXRjaGVyLm1hdGNoKFMpKQorICAgIHJldHVybiB0cnVlOworCisgIHJldHVybiBmYWxzZTsKK30KKworaW5saW5lIGJvb2wgaXNOdW1lcmljKFN0cmluZ1JlZiBTKSB7CisgIGlmICgoUy5mcm9udCgpID09ICctJyB8fCBTLmZyb250KCkgPT0gJysnKSAmJiBpc051bWJlcihTLmRyb3BfZnJvbnQoKSkpCisgICAgcmV0dXJuIHRydWU7CisKKyAgaWYgKGlzTnVtYmVyKFMpKQorICAgIHJldHVybiB0cnVlOworCisgIGlmIChTLmVxdWFscygiLm5hbiIpIHx8IFMuZXF1YWxzKCIuTmFOIikgfHwgUy5lcXVhbHMoIi5OQU4iKSkKKyAgICByZXR1cm4gdHJ1ZTsKKworICByZXR1cm4gZmFsc2U7Cit9CisKK2lubGluZSBib29sIGlzTnVsbChTdHJpbmdSZWYgUykgeworICByZXR1cm4gUy5lcXVhbHMoIm51bGwiKSB8fCBTLmVxdWFscygiTnVsbCIpIHx8IFMuZXF1YWxzKCJOVUxMIikgfHwKKyAgICAgICAgIFMuZXF1YWxzKCJ+Iik7Cit9CisKK2lubGluZSBib29sIGlzQm9vbChTdHJpbmdSZWYgUykgeworICByZXR1cm4gUy5lcXVhbHMoInRydWUiKSB8fCBTLmVxdWFscygiVHJ1ZSIpIHx8IFMuZXF1YWxzKCJUUlVFIikgfHwKKyAgICAgICAgIFMuZXF1YWxzKCJmYWxzZSIpIHx8IFMuZXF1YWxzKCJGYWxzZSIpIHx8IFMuZXF1YWxzKCJGQUxTRSIpOworfQorCisvLyA1LjEuIENoYXJhY3RlciBTZXQKKy8vIFRoZSBhbGxvd2VkIGNoYXJhY3RlciByYW5nZSBleHBsaWNpdGx5IGV4Y2x1ZGVzIHRoZSBDMCBjb250cm9sIGJsb2NrICN4MC0jeDFGCisvLyAoZXhjZXB0IGZvciBUQUIgI3g5LCBMRiAjeEEsIGFuZCBDUiAjeEQgd2hpY2ggYXJlIGFsbG93ZWQpLCBERUwgI3g3RiwgdGhlIEMxCisvLyBjb250cm9sIGJsb2NrICN4ODAtI3g5RiAoZXhjZXB0IGZvciBORUwgI3g4NSB3aGljaCBpcyBhbGxvd2VkKSwgdGhlIHN1cnJvZ2F0ZQorLy8gYmxvY2sgI3hEODAwLSN4REZGRiwgI3hGRkZFLCBhbmQgI3hGRkZGLgoraW5saW5lIFF1b3RpbmdUeXBlIG5lZWRzUXVvdGVzKFN0cmluZ1JlZiBTKSB7CisgIGlmIChTLmVtcHR5KCkpCisgICAgcmV0dXJuIFF1b3RpbmdUeXBlOjpTaW5nbGU7CisgIGlmIChpc3NwYWNlKFMuZnJvbnQoKSkgfHwgaXNzcGFjZShTLmJhY2soKSkpCisgICAgcmV0dXJuIFF1b3RpbmdUeXBlOjpTaW5nbGU7CisgIGlmIChpc051bGwoUykpCisgICAgcmV0dXJuIFF1b3RpbmdUeXBlOjpTaW5nbGU7CisgIGlmIChpc0Jvb2woUykpCisgICAgcmV0dXJuIFF1b3RpbmdUeXBlOjpTaW5nbGU7CisgIGlmIChpc051bWVyaWMoUykpCisgICAgcmV0dXJuIFF1b3RpbmdUeXBlOjpTaW5nbGU7CisKKyAgLy8gNy4zLjMgUGxhaW4gU3R5bGUKKyAgLy8gUGxhaW4gc2NhbGFycyBtdXN0IG5vdCBiZWdpbiB3aXRoIG1vc3QgaW5kaWNhdG9ycywgYXMgdGhpcyB3b3VsZCBjYXVzZQorICAvLyBhbWJpZ3VpdHkgd2l0aCBvdGhlciBZQU1MIGNvbnN0cnVjdHMuCisgIHN0YXRpYyBjb25zdGV4cHIgY2hhciBJbmRpY2F0b3JzW10gPSBSIigtPzpcLFtde30jJiohfD4nIiVAYCkiOworICBpZiAoUy5maW5kX2ZpcnN0X29mKEluZGljYXRvcnMpID09IDApCisgICAgcmV0dXJuIFF1b3RpbmdUeXBlOjpTaW5nbGU7CisKKyAgUXVvdGluZ1R5cGUgTWF4UXVvdGluZ05lZWRlZCA9IFF1b3RpbmdUeXBlOjpOb25lOworICBmb3IgKHVuc2lnbmVkIGNoYXIgQyA6IFMpIHsKKyAgICAvLyBBbHBoYW51bSBpcyBzYWZlLgorICAgIGlmIChpc0FsbnVtKEMpKQorICAgICAgY29udGludWU7CisKKyAgICBzd2l0Y2ggKEMpIHsKKyAgICAvLyBTYWZlIHNjYWxhciBjaGFyYWN0ZXJzLgorICAgIGNhc2UgJ18nOgorICAgIGNhc2UgJy0nOgorICAgIGNhc2UgJy8nOgorICAgIGNhc2UgJ14nOgorICAgIGNhc2UgJy4nOgorICAgIGNhc2UgJywnOgorICAgIGNhc2UgJyAnOgorICAgIC8vIFRBQiAoMHg5KSwgTEYgKDB4QSksIENSICgweEQpIGFuZCBORUwgKDB4ODUpIGFyZSBhbGxvd2VkLgorICAgIGNhc2UgMHg5OgorICAgIGNhc2UgMHhBOgorICAgIGNhc2UgMHhEOgorICAgIGNhc2UgMHg4NToKKyAgICAgIGNvbnRpbnVlOworICAgIC8vIERFTCAoMHg3RikgYXJlIGV4Y2x1ZGVkIGZyb20gdGhlIGFsbG93ZWQgY2hhcmFjdGVyIHJhbmdlLgorICAgIGNhc2UgMHg3RjoKKyAgICAgIHJldHVybiBRdW90aW5nVHlwZTo6RG91YmxlOworICAgIGRlZmF1bHQ6IHsKKyAgICAgIC8vIEMwIGNvbnRyb2wgYmxvY2sgKDB4MCAtIDB4MUYpIGlzIGV4Y2x1ZGVkIGZyb20gdGhlIGFsbG93ZWQgY2hhcmFjdGVyCisgICAgICAvLyByYW5nZS4KKyAgICAgIGlmIChDIDw9IDB4MUYpCisgICAgICAgIHJldHVybiBRdW90aW5nVHlwZTo6RG91YmxlOworCisgICAgICAvLyBBbHdheXMgZG91YmxlIHF1b3RlIFVURi04LgorICAgICAgaWYgKChDICYgMHg4MCkgIT0gMCkKKyAgICAgICAgcmV0dXJuIFF1b3RpbmdUeXBlOjpEb3VibGU7CisKKyAgICAgIC8vIFRoZSBjaGFyYWN0ZXIgaXMgbm90IHNhZmUsIGF0IGxlYXN0IHNpbXBsZSBxdW90aW5nIG5lZWRlZC4KKyAgICAgIE1heFF1b3RpbmdOZWVkZWQgPSBRdW90aW5nVHlwZTo6U2luZ2xlOworICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gTWF4UXVvdGluZ05lZWRlZDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENvbnRleHQ+CitzdHJ1Y3QgbWlzc2luZ1RyYWl0cworICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8Ym9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFoYXNfU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8VD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWhhc19TY2FsYXJCaXRTZXRUcmFpdHM8VD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWhhc19TY2FsYXJUcmFpdHM8VD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWhhc19CbG9ja1NjYWxhclRyYWl0czxUPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaGFzX01hcHBpbmdUcmFpdHM8VCwgQ29udGV4dD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWhhc19TZXF1ZW5jZVRyYWl0czxUPjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhaGFzX0N1c3RvbU1hcHBpbmdUcmFpdHM8VD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWhhc19Eb2N1bWVudExpc3RUcmFpdHM8VD46OnZhbHVlPiB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENvbnRleHQ+CitzdHJ1Y3QgdmFsaWRhdGVkTWFwcGluZ1RyYWl0cworICAgIDogcHVibGljIHN0ZDo6aW50ZWdyYWxfY29uc3RhbnQ8CisgICAgICAgICAgYm9vbCwgaGFzX01hcHBpbmdUcmFpdHM8VCwgQ29udGV4dD46OnZhbHVlICYmCisgICAgICAgICAgICAgICAgICAgIGhhc19NYXBwaW5nVmFsaWRhdGVUcmFpdHM8VCwgQ29udGV4dD46OnZhbHVlPiB7fTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENvbnRleHQ+CitzdHJ1Y3QgdW52YWxpZGF0ZWRNYXBwaW5nVHJhaXRzCisgICAgOiBwdWJsaWMgc3RkOjppbnRlZ3JhbF9jb25zdGFudDwKKyAgICAgICAgICBib29sLCBoYXNfTWFwcGluZ1RyYWl0czxULCBDb250ZXh0Pjo6dmFsdWUgJiYKKyAgICAgICAgICAgICAgICAgICAgIWhhc19NYXBwaW5nVmFsaWRhdGVUcmFpdHM8VCwgQ29udGV4dD46OnZhbHVlPiB7fTsKKworLy8gQmFzZSBjbGFzcyBmb3IgSW5wdXQgYW5kIE91dHB1dC4KK2NsYXNzIElPIHsKK3B1YmxpYzoKKyAgSU8odm9pZCAqQ3R4dCA9IG51bGxwdHIpOworICB2aXJ0dWFsIH5JTygpOworCisgIHZpcnR1YWwgYm9vbCBvdXRwdXR0aW5nKCkgPSAwOworCisgIHZpcnR1YWwgdW5zaWduZWQgYmVnaW5TZXF1ZW5jZSgpID0gMDsKKyAgdmlydHVhbCBib29sIHByZWZsaWdodEVsZW1lbnQodW5zaWduZWQsIHZvaWQgKiYpID0gMDsKKyAgdmlydHVhbCB2b2lkIHBvc3RmbGlnaHRFbGVtZW50KHZvaWQqKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBlbmRTZXF1ZW5jZSgpID0gMDsKKyAgdmlydHVhbCBib29sIGNhbkVsaWRlRW1wdHlTZXF1ZW5jZSgpID0gMDsKKworICB2aXJ0dWFsIHVuc2lnbmVkIGJlZ2luRmxvd1NlcXVlbmNlKCkgPSAwOworICB2aXJ0dWFsIGJvb2wgcHJlZmxpZ2h0Rmxvd0VsZW1lbnQodW5zaWduZWQsIHZvaWQgKiYpID0gMDsKKyAgdmlydHVhbCB2b2lkIHBvc3RmbGlnaHRGbG93RWxlbWVudCh2b2lkKikgPSAwOworICB2aXJ0dWFsIHZvaWQgZW5kRmxvd1NlcXVlbmNlKCkgPSAwOworCisgIHZpcnR1YWwgYm9vbCBtYXBUYWcoU3RyaW5nUmVmIFRhZywgYm9vbCBEZWZhdWx0PWZhbHNlKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBiZWdpbk1hcHBpbmcoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBlbmRNYXBwaW5nKCkgPSAwOworICB2aXJ0dWFsIGJvb2wgcHJlZmxpZ2h0S2V5KGNvbnN0IGNoYXIqLCBib29sLCBib29sLCBib29sICYsIHZvaWQgKiYpID0gMDsKKyAgdmlydHVhbCB2b2lkIHBvc3RmbGlnaHRLZXkodm9pZCopID0gMDsKKyAgdmlydHVhbCBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IGtleXMoKSA9IDA7CisKKyAgdmlydHVhbCB2b2lkIGJlZ2luRmxvd01hcHBpbmcoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBlbmRGbG93TWFwcGluZygpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgYmVnaW5FbnVtU2NhbGFyKCkgPSAwOworICB2aXJ0dWFsIGJvb2wgbWF0Y2hFbnVtU2NhbGFyKGNvbnN0IGNoYXIqLCBib29sKSA9IDA7CisgIHZpcnR1YWwgYm9vbCBtYXRjaEVudW1GYWxsYmFjaygpID0gMDsKKyAgdmlydHVhbCB2b2lkIGVuZEVudW1TY2FsYXIoKSA9IDA7CisKKyAgdmlydHVhbCBib29sIGJlZ2luQml0U2V0U2NhbGFyKGJvb2wgJikgPSAwOworICB2aXJ0dWFsIGJvb2wgYml0U2V0TWF0Y2goY29uc3QgY2hhciosIGJvb2wpID0gMDsKKyAgdmlydHVhbCB2b2lkIGVuZEJpdFNldFNjYWxhcigpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgc2NhbGFyU3RyaW5nKFN0cmluZ1JlZiAmLCBRdW90aW5nVHlwZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgYmxvY2tTY2FsYXJTdHJpbmcoU3RyaW5nUmVmICYpID0gMDsKKworICB2aXJ0dWFsIHZvaWQgc2V0RXJyb3IoY29uc3QgVHdpbmUgJikgPSAwOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIGVudW1DYXNlKFQgJlZhbCwgY29uc3QgY2hhciogU3RyLCBjb25zdCBUIENvbnN0VmFsKSB7CisgICAgaWYgKCBtYXRjaEVudW1TY2FsYXIoU3RyLCBvdXRwdXR0aW5nKCkgJiYgVmFsID09IENvbnN0VmFsKSApIHsKKyAgICAgIFZhbCA9IENvbnN0VmFsOworICAgIH0KKyAgfQorCisgIC8vIGFsbG93IGFub255bW91cyBlbnVtIHZhbHVlcyB0byBiZSB1c2VkIHdpdGggTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIGVudW1DYXNlKFQgJlZhbCwgY29uc3QgY2hhciogU3RyLCBjb25zdCB1aW50MzJfdCBDb25zdFZhbCkgeworICAgIGlmICggbWF0Y2hFbnVtU2NhbGFyKFN0ciwgb3V0cHV0dGluZygpICYmIFZhbCA9PSBzdGF0aWNfY2FzdDxUPihDb25zdFZhbCkpICkgeworICAgICAgVmFsID0gQ29uc3RWYWw7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEZCVCwgdHlwZW5hbWUgVD4KKyAgdm9pZCBlbnVtRmFsbGJhY2soVCAmVmFsKSB7CisgICAgaWYgKG1hdGNoRW51bUZhbGxiYWNrKCkpIHsKKyAgICAgIEVtcHR5Q29udGV4dCBDb250ZXh0OworICAgICAgLy8gRklYTUU6IEZvcmNlIGludGVncmFsIGNvbnZlcnNpb24gdG8gYWxsb3cgc3Ryb25nIHR5cGVkZWZzIHRvIGNvbnZlcnQuCisgICAgICBGQlQgUmVzID0gc3RhdGljX2Nhc3Q8dHlwZW5hbWUgRkJUOjpCYXNlVHlwZT4oVmFsKTsKKyAgICAgIHlhbWxpemUoKnRoaXMsIFJlcywgdHJ1ZSwgQ29udGV4dCk7CisgICAgICBWYWwgPSBzdGF0aWNfY2FzdDxUPihzdGF0aWNfY2FzdDx0eXBlbmFtZSBGQlQ6OkJhc2VUeXBlPihSZXMpKTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCBiaXRTZXRDYXNlKFQgJlZhbCwgY29uc3QgY2hhciogU3RyLCBjb25zdCBUIENvbnN0VmFsKSB7CisgICAgaWYgKCBiaXRTZXRNYXRjaChTdHIsIG91dHB1dHRpbmcoKSAmJiAoVmFsICYgQ29uc3RWYWwpID09IENvbnN0VmFsKSApIHsKKyAgICAgIFZhbCA9IHN0YXRpY19jYXN0PFQ+KFZhbCB8IENvbnN0VmFsKTsKKyAgICB9CisgIH0KKworICAvLyBhbGxvdyBhbm9ueW1vdXMgZW51bSB2YWx1ZXMgdG8gYmUgdXNlZCB3aXRoIExMVk1fWUFNTF9TVFJPTkdfVFlQRURFRgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgdm9pZCBiaXRTZXRDYXNlKFQgJlZhbCwgY29uc3QgY2hhciogU3RyLCBjb25zdCB1aW50MzJfdCBDb25zdFZhbCkgeworICAgIGlmICggYml0U2V0TWF0Y2goU3RyLCBvdXRwdXR0aW5nKCkgJiYgKFZhbCAmIENvbnN0VmFsKSA9PSBDb25zdFZhbCkgKSB7CisgICAgICBWYWwgPSBzdGF0aWNfY2FzdDxUPihWYWwgfCBDb25zdFZhbCk7CisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHZvaWQgbWFza2VkQml0U2V0Q2FzZShUICZWYWwsIGNvbnN0IGNoYXIgKlN0ciwgVCBDb25zdFZhbCwgVCBNYXNrKSB7CisgICAgaWYgKGJpdFNldE1hdGNoKFN0ciwgb3V0cHV0dGluZygpICYmIChWYWwgJiBNYXNrKSA9PSBDb25zdFZhbCkpCisgICAgICBWYWwgPSBWYWwgfCBDb25zdFZhbDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIG1hc2tlZEJpdFNldENhc2UoVCAmVmFsLCBjb25zdCBjaGFyICpTdHIsIHVpbnQzMl90IENvbnN0VmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgTWFzaykgeworICAgIGlmIChiaXRTZXRNYXRjaChTdHIsIG91dHB1dHRpbmcoKSAmJiAoVmFsICYgTWFzaykgPT0gQ29uc3RWYWwpKQorICAgICAgVmFsID0gVmFsIHwgQ29uc3RWYWw7CisgIH0KKworICB2b2lkICpnZXRDb250ZXh0KCk7CisgIHZvaWQgc2V0Q29udGV4dCh2b2lkICopOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIG1hcFJlcXVpcmVkKGNvbnN0IGNoYXIgKktleSwgVCAmVmFsKSB7CisgICAgRW1wdHlDb250ZXh0IEN0eDsKKyAgICB0aGlzLT5wcm9jZXNzS2V5KEtleSwgVmFsLCB0cnVlLCBDdHgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENvbnRleHQ+CisgIHZvaWQgbWFwUmVxdWlyZWQoY29uc3QgY2hhciAqS2V5LCBUICZWYWwsIENvbnRleHQgJkN0eCkgeworICAgIHRoaXMtPnByb2Nlc3NLZXkoS2V5LCBWYWwsIHRydWUsIEN0eCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBtYXBPcHRpb25hbChjb25zdCBjaGFyICpLZXksIFQgJlZhbCkgeworICAgIEVtcHR5Q29udGV4dCBDdHg7CisgICAgbWFwT3B0aW9uYWxXaXRoQ29udGV4dChLZXksIFZhbCwgQ3R4KTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICB2b2lkIG1hcE9wdGlvbmFsKGNvbnN0IGNoYXIgKktleSwgVCAmVmFsLCBjb25zdCBUICZEZWZhdWx0KSB7CisgICAgRW1wdHlDb250ZXh0IEN0eDsKKyAgICBtYXBPcHRpb25hbFdpdGhDb250ZXh0KEtleSwgVmFsLCBEZWZhdWx0LCBDdHgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENvbnRleHQ+CisgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGhhc19TZXF1ZW5jZVRyYWl0czxUPjo6dmFsdWUsIHZvaWQ+Ojp0eXBlCisgIG1hcE9wdGlvbmFsV2l0aENvbnRleHQoY29uc3QgY2hhciAqS2V5LCBUICZWYWwsIENvbnRleHQgJkN0eCkgeworICAgIC8vIG9taXQga2V5L3ZhbHVlIGluc3RlYWQgb2Ygb3V0cHV0dGluZyBlbXB0eSBzZXF1ZW5jZQorICAgIGlmICh0aGlzLT5jYW5FbGlkZUVtcHR5U2VxdWVuY2UoKSAmJiAhKFZhbC5iZWdpbigpICE9IFZhbC5lbmQoKSkpCisgICAgICByZXR1cm47CisgICAgdGhpcy0+cHJvY2Vzc0tleShLZXksIFZhbCwgZmFsc2UsIEN0eCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ29udGV4dD4KKyAgdm9pZCBtYXBPcHRpb25hbFdpdGhDb250ZXh0KGNvbnN0IGNoYXIgKktleSwgT3B0aW9uYWw8VD4gJlZhbCwgQ29udGV4dCAmQ3R4KSB7CisgICAgdGhpcy0+cHJvY2Vzc0tleVdpdGhEZWZhdWx0KEtleSwgVmFsLCBPcHRpb25hbDxUPigpLCAvKlJlcXVpcmVkPSovZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEN0eCk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ29udGV4dD4KKyAgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8IWhhc19TZXF1ZW5jZVRyYWl0czxUPjo6dmFsdWUsIHZvaWQ+Ojp0eXBlCisgIG1hcE9wdGlvbmFsV2l0aENvbnRleHQoY29uc3QgY2hhciAqS2V5LCBUICZWYWwsIENvbnRleHQgJkN0eCkgeworICAgIHRoaXMtPnByb2Nlc3NLZXkoS2V5LCBWYWwsIGZhbHNlLCBDdHgpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENvbnRleHQ+CisgIHZvaWQgbWFwT3B0aW9uYWxXaXRoQ29udGV4dChjb25zdCBjaGFyICpLZXksIFQgJlZhbCwgY29uc3QgVCAmRGVmYXVsdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQgJkN0eCkgeworICAgIHRoaXMtPnByb2Nlc3NLZXlXaXRoRGVmYXVsdChLZXksIFZhbCwgRGVmYXVsdCwgZmFsc2UsIEN0eCk7CisgIH0KKworcHJpdmF0ZToKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENvbnRleHQ+CisgIHZvaWQgcHJvY2Vzc0tleVdpdGhEZWZhdWx0KGNvbnN0IGNoYXIgKktleSwgT3B0aW9uYWw8VD4gJlZhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9uYWw8VD4gJkRlZmF1bHRWYWx1ZSwgYm9vbCBSZXF1aXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCAmQ3R4KSB7CisgICAgYXNzZXJ0KERlZmF1bHRWYWx1ZS5oYXNWYWx1ZSgpID09IGZhbHNlICYmCisgICAgICAgICAgICJPcHRpb25hbDxUPiBzaG91bGRuJ3QgaGF2ZSBhIHZhbHVlISIpOworICAgIHZvaWQgKlNhdmVJbmZvOworICAgIGJvb2wgVXNlRGVmYXVsdCA9IHRydWU7CisgICAgY29uc3QgYm9vbCBzYW1lQXNEZWZhdWx0ID0gb3V0cHV0dGluZygpICYmICFWYWwuaGFzVmFsdWUoKTsKKyAgICBpZiAoIW91dHB1dHRpbmcoKSAmJiAhVmFsLmhhc1ZhbHVlKCkpCisgICAgICBWYWwgPSBUKCk7CisgICAgaWYgKFZhbC5oYXNWYWx1ZSgpICYmCisgICAgICAgIHRoaXMtPnByZWZsaWdodEtleShLZXksIFJlcXVpcmVkLCBzYW1lQXNEZWZhdWx0LCBVc2VEZWZhdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2F2ZUluZm8pKSB7CisgICAgICB5YW1saXplKCp0aGlzLCBWYWwuZ2V0VmFsdWUoKSwgUmVxdWlyZWQsIEN0eCk7CisgICAgICB0aGlzLT5wb3N0ZmxpZ2h0S2V5KFNhdmVJbmZvKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKFVzZURlZmF1bHQpCisgICAgICAgIFZhbCA9IERlZmF1bHRWYWx1ZTsKKyAgICB9CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ29udGV4dD4KKyAgdm9pZCBwcm9jZXNzS2V5V2l0aERlZmF1bHQoY29uc3QgY2hhciAqS2V5LCBUICZWYWwsIGNvbnN0IFQgJkRlZmF1bHRWYWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBSZXF1aXJlZCwgQ29udGV4dCAmQ3R4KSB7CisgICAgdm9pZCAqU2F2ZUluZm87CisgICAgYm9vbCBVc2VEZWZhdWx0OworICAgIGNvbnN0IGJvb2wgc2FtZUFzRGVmYXVsdCA9IG91dHB1dHRpbmcoKSAmJiBWYWwgPT0gRGVmYXVsdFZhbHVlOworICAgIGlmICggdGhpcy0+cHJlZmxpZ2h0S2V5KEtleSwgUmVxdWlyZWQsIHNhbWVBc0RlZmF1bHQsIFVzZURlZmF1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYXZlSW5mbykgKSB7CisgICAgICB5YW1saXplKCp0aGlzLCBWYWwsIFJlcXVpcmVkLCBDdHgpOworICAgICAgdGhpcy0+cG9zdGZsaWdodEtleShTYXZlSW5mbyk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgaWYgKCBVc2VEZWZhdWx0ICkKKyAgICAgICAgVmFsID0gRGVmYXVsdFZhbHVlOworICAgIH0KKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBDb250ZXh0PgorICB2b2lkIHByb2Nlc3NLZXkoY29uc3QgY2hhciAqS2V5LCBUICZWYWwsIGJvb2wgUmVxdWlyZWQsIENvbnRleHQgJkN0eCkgeworICAgIHZvaWQgKlNhdmVJbmZvOworICAgIGJvb2wgVXNlRGVmYXVsdDsKKyAgICBpZiAoIHRoaXMtPnByZWZsaWdodEtleShLZXksIFJlcXVpcmVkLCBmYWxzZSwgVXNlRGVmYXVsdCwgU2F2ZUluZm8pICkgeworICAgICAgeWFtbGl6ZSgqdGhpcywgVmFsLCBSZXF1aXJlZCwgQ3R4KTsKKyAgICAgIHRoaXMtPnBvc3RmbGlnaHRLZXkoU2F2ZUluZm8pOworICAgIH0KKyAgfQorCitwcml2YXRlOgorICB2b2lkICpDdHh0OworfTsKKworbmFtZXNwYWNlIGRldGFpbCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBDb250ZXh0Pgordm9pZCBkb01hcHBpbmcoSU8gJmlvLCBUICZWYWwsIENvbnRleHQgJkN0eCkgeworICBNYXBwaW5nQ29udGV4dFRyYWl0czxULCBDb250ZXh0Pjo6bWFwcGluZyhpbywgVmFsLCBDdHgpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBkb01hcHBpbmcoSU8gJmlvLCBUICZWYWwsIEVtcHR5Q29udGV4dCAmQ3R4KSB7CisgIE1hcHBpbmdUcmFpdHM8VD46Om1hcHBpbmcoaW8sIFZhbCk7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBkZXRhaWwKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxoYXNfU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8VD46OnZhbHVlLCB2b2lkPjo6dHlwZQoreWFtbGl6ZShJTyAmaW8sIFQgJlZhbCwgYm9vbCwgRW1wdHlDb250ZXh0ICZDdHgpIHsKKyAgaW8uYmVnaW5FbnVtU2NhbGFyKCk7CisgIFNjYWxhckVudW1lcmF0aW9uVHJhaXRzPFQ+OjplbnVtZXJhdGlvbihpbywgVmFsKTsKKyAgaW8uZW5kRW51bVNjYWxhcigpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGhhc19TY2FsYXJCaXRTZXRUcmFpdHM8VD46OnZhbHVlLCB2b2lkPjo6dHlwZQoreWFtbGl6ZShJTyAmaW8sIFQgJlZhbCwgYm9vbCwgRW1wdHlDb250ZXh0ICZDdHgpIHsKKyAgYm9vbCBEb0NsZWFyOworICBpZiAoIGlvLmJlZ2luQml0U2V0U2NhbGFyKERvQ2xlYXIpICkgeworICAgIGlmICggRG9DbGVhciApCisgICAgICBWYWwgPSBzdGF0aWNfY2FzdDxUPigwKTsKKyAgICBTY2FsYXJCaXRTZXRUcmFpdHM8VD46OmJpdHNldChpbywgVmFsKTsKKyAgICBpby5lbmRCaXRTZXRTY2FsYXIoKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGhhc19TY2FsYXJUcmFpdHM8VD46OnZhbHVlLCB2b2lkPjo6dHlwZQoreWFtbGl6ZShJTyAmaW8sIFQgJlZhbCwgYm9vbCwgRW1wdHlDb250ZXh0ICZDdHgpIHsKKyAgaWYgKCBpby5vdXRwdXR0aW5nKCkgKSB7CisgICAgc3RkOjpzdHJpbmcgU3RvcmFnZTsKKyAgICByYXdfc3RyaW5nX29zdHJlYW0gQnVmZmVyKFN0b3JhZ2UpOworICAgIFNjYWxhclRyYWl0czxUPjo6b3V0cHV0KFZhbCwgaW8uZ2V0Q29udGV4dCgpLCBCdWZmZXIpOworICAgIFN0cmluZ1JlZiBTdHIgPSBCdWZmZXIuc3RyKCk7CisgICAgaW8uc2NhbGFyU3RyaW5nKFN0ciwgU2NhbGFyVHJhaXRzPFQ+OjptdXN0UXVvdGUoU3RyKSk7CisgIH0KKyAgZWxzZSB7CisgICAgU3RyaW5nUmVmIFN0cjsKKyAgICBpby5zY2FsYXJTdHJpbmcoU3RyLCBTY2FsYXJUcmFpdHM8VD46Om11c3RRdW90ZShTdHIpKTsKKyAgICBTdHJpbmdSZWYgUmVzdWx0ID0gU2NhbGFyVHJhaXRzPFQ+OjppbnB1dChTdHIsIGlvLmdldENvbnRleHQoKSwgVmFsKTsKKyAgICBpZiAoICFSZXN1bHQuZW1wdHkoKSApIHsKKyAgICAgIGlvLnNldEVycm9yKFR3aW5lKFJlc3VsdCkpOworICAgIH0KKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGhhc19CbG9ja1NjYWxhclRyYWl0czxUPjo6dmFsdWUsIHZvaWQ+Ojp0eXBlCit5YW1saXplKElPICZZYW1sSU8sIFQgJlZhbCwgYm9vbCwgRW1wdHlDb250ZXh0ICZDdHgpIHsKKyAgaWYgKFlhbWxJTy5vdXRwdXR0aW5nKCkpIHsKKyAgICBzdGQ6OnN0cmluZyBTdG9yYWdlOworICAgIHJhd19zdHJpbmdfb3N0cmVhbSBCdWZmZXIoU3RvcmFnZSk7CisgICAgQmxvY2tTY2FsYXJUcmFpdHM8VD46Om91dHB1dChWYWwsIFlhbWxJTy5nZXRDb250ZXh0KCksIEJ1ZmZlcik7CisgICAgU3RyaW5nUmVmIFN0ciA9IEJ1ZmZlci5zdHIoKTsKKyAgICBZYW1sSU8uYmxvY2tTY2FsYXJTdHJpbmcoU3RyKTsKKyAgfSBlbHNlIHsKKyAgICBTdHJpbmdSZWYgU3RyOworICAgIFlhbWxJTy5ibG9ja1NjYWxhclN0cmluZyhTdHIpOworICAgIFN0cmluZ1JlZiBSZXN1bHQgPQorICAgICAgICBCbG9ja1NjYWxhclRyYWl0czxUPjo6aW5wdXQoU3RyLCBZYW1sSU8uZ2V0Q29udGV4dCgpLCBWYWwpOworICAgIGlmICghUmVzdWx0LmVtcHR5KCkpCisgICAgICBZYW1sSU8uc2V0RXJyb3IoVHdpbmUoUmVzdWx0KSk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIENvbnRleHQ+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjx2YWxpZGF0ZWRNYXBwaW5nVHJhaXRzPFQsIENvbnRleHQ+Ojp2YWx1ZSwgdm9pZD46OnR5cGUKK3lhbWxpemUoSU8gJmlvLCBUICZWYWwsIGJvb2wsIENvbnRleHQgJkN0eCkgeworICBpZiAoaGFzX0Zsb3dUcmFpdHM8TWFwcGluZ1RyYWl0czxUPj46OnZhbHVlKQorICAgIGlvLmJlZ2luRmxvd01hcHBpbmcoKTsKKyAgZWxzZQorICAgIGlvLmJlZ2luTWFwcGluZygpOworICBpZiAoaW8ub3V0cHV0dGluZygpKSB7CisgICAgU3RyaW5nUmVmIEVyciA9IE1hcHBpbmdUcmFpdHM8VD46OnZhbGlkYXRlKGlvLCBWYWwpOworICAgIGlmICghRXJyLmVtcHR5KCkpIHsKKyAgICAgIGVycnMoKSA8PCBFcnIgPDwgIlxuIjsKKyAgICAgIGFzc2VydChFcnIuZW1wdHkoKSAmJiAiaW52YWxpZCBzdHJ1Y3QgdHJ5aW5nIHRvIGJlIHdyaXR0ZW4gYXMgeWFtbCIpOworICAgIH0KKyAgfQorICBkZXRhaWw6OmRvTWFwcGluZyhpbywgVmFsLCBDdHgpOworICBpZiAoIWlvLm91dHB1dHRpbmcoKSkgeworICAgIFN0cmluZ1JlZiBFcnIgPSBNYXBwaW5nVHJhaXRzPFQ+Ojp2YWxpZGF0ZShpbywgVmFsKTsKKyAgICBpZiAoIUVyci5lbXB0eSgpKQorICAgICAgaW8uc2V0RXJyb3IoRXJyKTsKKyAgfQorICBpZiAoaGFzX0Zsb3dUcmFpdHM8TWFwcGluZ1RyYWl0czxUPj46OnZhbHVlKQorICAgIGlvLmVuZEZsb3dNYXBwaW5nKCk7CisgIGVsc2UKKyAgICBpby5lbmRNYXBwaW5nKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBDb250ZXh0PgordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8dW52YWxpZGF0ZWRNYXBwaW5nVHJhaXRzPFQsIENvbnRleHQ+Ojp2YWx1ZSwgdm9pZD46OnR5cGUKK3lhbWxpemUoSU8gJmlvLCBUICZWYWwsIGJvb2wsIENvbnRleHQgJkN0eCkgeworICBpZiAoaGFzX0Zsb3dUcmFpdHM8TWFwcGluZ1RyYWl0czxUPj46OnZhbHVlKSB7CisgICAgaW8uYmVnaW5GbG93TWFwcGluZygpOworICAgIGRldGFpbDo6ZG9NYXBwaW5nKGlvLCBWYWwsIEN0eCk7CisgICAgaW8uZW5kRmxvd01hcHBpbmcoKTsKKyAgfSBlbHNlIHsKKyAgICBpby5iZWdpbk1hcHBpbmcoKTsKKyAgICBkZXRhaWw6OmRvTWFwcGluZyhpbywgVmFsLCBDdHgpOworICAgIGlvLmVuZE1hcHBpbmcoKTsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGhhc19DdXN0b21NYXBwaW5nVHJhaXRzPFQ+Ojp2YWx1ZSwgdm9pZD46OnR5cGUKK3lhbWxpemUoSU8gJmlvLCBUICZWYWwsIGJvb2wsIEVtcHR5Q29udGV4dCAmQ3R4KSB7CisgIGlmICggaW8ub3V0cHV0dGluZygpICkgeworICAgIGlvLmJlZ2luTWFwcGluZygpOworICAgIEN1c3RvbU1hcHBpbmdUcmFpdHM8VD46Om91dHB1dChpbywgVmFsKTsKKyAgICBpby5lbmRNYXBwaW5nKCk7CisgIH0gZWxzZSB7CisgICAgaW8uYmVnaW5NYXBwaW5nKCk7CisgICAgZm9yIChTdHJpbmdSZWYga2V5IDogaW8ua2V5cygpKQorICAgICAgQ3VzdG9tTWFwcGluZ1RyYWl0czxUPjo6aW5wdXRPbmUoaW8sIGtleSwgVmFsKTsKKyAgICBpby5lbmRNYXBwaW5nKCk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxtaXNzaW5nVHJhaXRzPFQsIEVtcHR5Q29udGV4dD46OnZhbHVlLCB2b2lkPjo6dHlwZQoreWFtbGl6ZShJTyAmaW8sIFQgJlZhbCwgYm9vbCwgRW1wdHlDb250ZXh0ICZDdHgpIHsKKyAgY2hhciBtaXNzaW5nX3lhbWxfdHJhaXRfZm9yX3R5cGVbc2l6ZW9mKE1pc3NpbmdUcmFpdDxUPildOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQ29udGV4dD4KK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGhhc19TZXF1ZW5jZVRyYWl0czxUPjo6dmFsdWUsIHZvaWQ+Ojp0eXBlCit5YW1saXplKElPICZpbywgVCAmU2VxLCBib29sLCBDb250ZXh0ICZDdHgpIHsKKyAgaWYgKCBoYXNfRmxvd1RyYWl0czwgU2VxdWVuY2VUcmFpdHM8VD4+Ojp2YWx1ZSApIHsKKyAgICB1bnNpZ25lZCBpbmNudCA9IGlvLmJlZ2luRmxvd1NlcXVlbmNlKCk7CisgICAgdW5zaWduZWQgY291bnQgPSBpby5vdXRwdXR0aW5nKCkgPyBTZXF1ZW5jZVRyYWl0czxUPjo6c2l6ZShpbywgU2VxKSA6IGluY250OworICAgIGZvcih1bnNpZ25lZCBpPTA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICB2b2lkICpTYXZlSW5mbzsKKyAgICAgIGlmICggaW8ucHJlZmxpZ2h0Rmxvd0VsZW1lbnQoaSwgU2F2ZUluZm8pICkgeworICAgICAgICB5YW1saXplKGlvLCBTZXF1ZW5jZVRyYWl0czxUPjo6ZWxlbWVudChpbywgU2VxLCBpKSwgdHJ1ZSwgQ3R4KTsKKyAgICAgICAgaW8ucG9zdGZsaWdodEZsb3dFbGVtZW50KFNhdmVJbmZvKTsKKyAgICAgIH0KKyAgICB9CisgICAgaW8uZW5kRmxvd1NlcXVlbmNlKCk7CisgIH0KKyAgZWxzZSB7CisgICAgdW5zaWduZWQgaW5jbnQgPSBpby5iZWdpblNlcXVlbmNlKCk7CisgICAgdW5zaWduZWQgY291bnQgPSBpby5vdXRwdXR0aW5nKCkgPyBTZXF1ZW5jZVRyYWl0czxUPjo6c2l6ZShpbywgU2VxKSA6IGluY250OworICAgIGZvcih1bnNpZ25lZCBpPTA7IGkgPCBjb3VudDsgKytpKSB7CisgICAgICB2b2lkICpTYXZlSW5mbzsKKyAgICAgIGlmICggaW8ucHJlZmxpZ2h0RWxlbWVudChpLCBTYXZlSW5mbykgKSB7CisgICAgICAgIHlhbWxpemUoaW8sIFNlcXVlbmNlVHJhaXRzPFQ+OjplbGVtZW50KGlvLCBTZXEsIGkpLCB0cnVlLCBDdHgpOworICAgICAgICBpby5wb3N0ZmxpZ2h0RWxlbWVudChTYXZlSW5mbyk7CisgICAgICB9CisgICAgfQorICAgIGlvLmVuZFNlcXVlbmNlKCk7CisgIH0KK30KKwordGVtcGxhdGU8Pgorc3RydWN0IFNjYWxhclRyYWl0czxib29sPiB7CisgIHN0YXRpYyB2b2lkIG91dHB1dChjb25zdCBib29sICYsIHZvaWQqICwgcmF3X29zdHJlYW0gJik7CisgIHN0YXRpYyBTdHJpbmdSZWYgaW5wdXQoU3RyaW5nUmVmLCB2b2lkICosIGJvb2wgJik7CisgIHN0YXRpYyBRdW90aW5nVHlwZSBtdXN0UXVvdGUoU3RyaW5nUmVmKSB7IHJldHVybiBRdW90aW5nVHlwZTo6Tm9uZTsgfQorfTsKKwordGVtcGxhdGU8Pgorc3RydWN0IFNjYWxhclRyYWl0czxTdHJpbmdSZWY+IHsKKyAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IFN0cmluZ1JlZiAmLCB2b2lkICosIHJhd19vc3RyZWFtICYpOworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiwgdm9pZCAqLCBTdHJpbmdSZWYgJik7CisgIHN0YXRpYyBRdW90aW5nVHlwZSBtdXN0UXVvdGUoU3RyaW5nUmVmIFMpIHsgcmV0dXJuIG5lZWRzUXVvdGVzKFMpOyB9Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgU2NhbGFyVHJhaXRzPHN0ZDo6c3RyaW5nPiB7CisgIHN0YXRpYyB2b2lkIG91dHB1dChjb25zdCBzdGQ6OnN0cmluZyAmLCB2b2lkICosIHJhd19vc3RyZWFtICYpOworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiwgdm9pZCAqLCBzdGQ6OnN0cmluZyAmKTsKKyAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYgUykgeyByZXR1cm4gbmVlZHNRdW90ZXMoUyk7IH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBTY2FsYXJUcmFpdHM8dWludDhfdD4geworICBzdGF0aWMgdm9pZCBvdXRwdXQoY29uc3QgdWludDhfdCAmLCB2b2lkICosIHJhd19vc3RyZWFtICYpOworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiwgdm9pZCAqLCB1aW50OF90ICYpOworICBzdGF0aWMgUXVvdGluZ1R5cGUgbXVzdFF1b3RlKFN0cmluZ1JlZikgeyByZXR1cm4gUXVvdGluZ1R5cGU6Ok5vbmU7IH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBTY2FsYXJUcmFpdHM8dWludDE2X3Q+IHsKKyAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IHVpbnQxNl90ICYsIHZvaWQgKiwgcmF3X29zdHJlYW0gJik7CisgIHN0YXRpYyBTdHJpbmdSZWYgaW5wdXQoU3RyaW5nUmVmLCB2b2lkICosIHVpbnQxNl90ICYpOworICBzdGF0aWMgUXVvdGluZ1R5cGUgbXVzdFF1b3RlKFN0cmluZ1JlZikgeyByZXR1cm4gUXVvdGluZ1R5cGU6Ok5vbmU7IH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBTY2FsYXJUcmFpdHM8dWludDMyX3Q+IHsKKyAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IHVpbnQzMl90ICYsIHZvaWQgKiwgcmF3X29zdHJlYW0gJik7CisgIHN0YXRpYyBTdHJpbmdSZWYgaW5wdXQoU3RyaW5nUmVmLCB2b2lkICosIHVpbnQzMl90ICYpOworICBzdGF0aWMgUXVvdGluZ1R5cGUgbXVzdFF1b3RlKFN0cmluZ1JlZikgeyByZXR1cm4gUXVvdGluZ1R5cGU6Ok5vbmU7IH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBTY2FsYXJUcmFpdHM8dWludDY0X3Q+IHsKKyAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IHVpbnQ2NF90ICYsIHZvaWQgKiwgcmF3X29zdHJlYW0gJik7CisgIHN0YXRpYyBTdHJpbmdSZWYgaW5wdXQoU3RyaW5nUmVmLCB2b2lkICosIHVpbnQ2NF90ICYpOworICBzdGF0aWMgUXVvdGluZ1R5cGUgbXVzdFF1b3RlKFN0cmluZ1JlZikgeyByZXR1cm4gUXVvdGluZ1R5cGU6Ok5vbmU7IH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBTY2FsYXJUcmFpdHM8aW50OF90PiB7CisgIHN0YXRpYyB2b2lkIG91dHB1dChjb25zdCBpbnQ4X3QgJiwgdm9pZCAqLCByYXdfb3N0cmVhbSAmKTsKKyAgc3RhdGljIFN0cmluZ1JlZiBpbnB1dChTdHJpbmdSZWYsIHZvaWQgKiwgaW50OF90ICYpOworICBzdGF0aWMgUXVvdGluZ1R5cGUgbXVzdFF1b3RlKFN0cmluZ1JlZikgeyByZXR1cm4gUXVvdGluZ1R5cGU6Ok5vbmU7IH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBTY2FsYXJUcmFpdHM8aW50MTZfdD4geworICBzdGF0aWMgdm9pZCBvdXRwdXQoY29uc3QgaW50MTZfdCAmLCB2b2lkICosIHJhd19vc3RyZWFtICYpOworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiwgdm9pZCAqLCBpbnQxNl90ICYpOworICBzdGF0aWMgUXVvdGluZ1R5cGUgbXVzdFF1b3RlKFN0cmluZ1JlZikgeyByZXR1cm4gUXVvdGluZ1R5cGU6Ok5vbmU7IH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBTY2FsYXJUcmFpdHM8aW50MzJfdD4geworICBzdGF0aWMgdm9pZCBvdXRwdXQoY29uc3QgaW50MzJfdCAmLCB2b2lkICosIHJhd19vc3RyZWFtICYpOworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiwgdm9pZCAqLCBpbnQzMl90ICYpOworICBzdGF0aWMgUXVvdGluZ1R5cGUgbXVzdFF1b3RlKFN0cmluZ1JlZikgeyByZXR1cm4gUXVvdGluZ1R5cGU6Ok5vbmU7IH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBTY2FsYXJUcmFpdHM8aW50NjRfdD4geworICBzdGF0aWMgdm9pZCBvdXRwdXQoY29uc3QgaW50NjRfdCAmLCB2b2lkICosIHJhd19vc3RyZWFtICYpOworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiwgdm9pZCAqLCBpbnQ2NF90ICYpOworICBzdGF0aWMgUXVvdGluZ1R5cGUgbXVzdFF1b3RlKFN0cmluZ1JlZikgeyByZXR1cm4gUXVvdGluZ1R5cGU6Ok5vbmU7IH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBTY2FsYXJUcmFpdHM8ZmxvYXQ+IHsKKyAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IGZsb2F0ICYsIHZvaWQgKiwgcmF3X29zdHJlYW0gJik7CisgIHN0YXRpYyBTdHJpbmdSZWYgaW5wdXQoU3RyaW5nUmVmLCB2b2lkICosIGZsb2F0ICYpOworICBzdGF0aWMgUXVvdGluZ1R5cGUgbXVzdFF1b3RlKFN0cmluZ1JlZikgeyByZXR1cm4gUXVvdGluZ1R5cGU6Ok5vbmU7IH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBTY2FsYXJUcmFpdHM8ZG91YmxlPiB7CisgIHN0YXRpYyB2b2lkIG91dHB1dChjb25zdCBkb3VibGUgJiwgdm9pZCAqLCByYXdfb3N0cmVhbSAmKTsKKyAgc3RhdGljIFN0cmluZ1JlZiBpbnB1dChTdHJpbmdSZWYsIHZvaWQgKiwgZG91YmxlICYpOworICBzdGF0aWMgUXVvdGluZ1R5cGUgbXVzdFF1b3RlKFN0cmluZ1JlZikgeyByZXR1cm4gUXVvdGluZ1R5cGU6Ok5vbmU7IH0KK307CisKKy8vIEZvciBlbmRpYW4gdHlwZXMsIHdlIGp1c3QgdXNlIHRoZSBleGlzdGluZyBTY2FsYXJUcmFpdHMgZm9yIHRoZSB1bmRlcmx5aW5nCisvLyB0eXBlLiAgVGhpcyB3YXkgZW5kaWFuIGF3YXJlIHR5cGVzIGFyZSBzdXBwb3J0ZWQgd2hlbmV2ZXIgYSBTY2FsYXJUcmFpdHMKKy8vIGlzIGRlZmluZWQgZm9yIHRoZSB1bmRlcmx5aW5nIHR5cGUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgdmFsdWVfdHlwZSwgc3VwcG9ydDo6ZW5kaWFubmVzcyBlbmRpYW4sIHNpemVfdCBhbGlnbm1lbnQ+CitzdHJ1Y3QgU2NhbGFyVHJhaXRzPHN1cHBvcnQ6OmRldGFpbDo6cGFja2VkX2VuZGlhbl9zcGVjaWZpY19pbnRlZ3JhbDwKKyAgICB2YWx1ZV90eXBlLCBlbmRpYW4sIGFsaWdubWVudD4+IHsKKyAgdXNpbmcgZW5kaWFuX3R5cGUgPQorICAgICAgc3VwcG9ydDo6ZGV0YWlsOjpwYWNrZWRfZW5kaWFuX3NwZWNpZmljX2ludGVncmFsPHZhbHVlX3R5cGUsIGVuZGlhbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbm1lbnQ+OworCisgIHN0YXRpYyB2b2lkIG91dHB1dChjb25zdCBlbmRpYW5fdHlwZSAmRSwgdm9pZCAqQ3R4LCByYXdfb3N0cmVhbSAmU3RyZWFtKSB7CisgICAgU2NhbGFyVHJhaXRzPHZhbHVlX3R5cGU+OjpvdXRwdXQoc3RhdGljX2Nhc3Q8dmFsdWVfdHlwZT4oRSksIEN0eCwgU3RyZWFtKTsKKyAgfQorCisgIHN0YXRpYyBTdHJpbmdSZWYgaW5wdXQoU3RyaW5nUmVmIFN0ciwgdm9pZCAqQ3R4LCBlbmRpYW5fdHlwZSAmRSkgeworICAgIHZhbHVlX3R5cGUgVjsKKyAgICBhdXRvIFIgPSBTY2FsYXJUcmFpdHM8dmFsdWVfdHlwZT46OmlucHV0KFN0ciwgQ3R4LCBWKTsKKyAgICBFID0gc3RhdGljX2Nhc3Q8ZW5kaWFuX3R5cGU+KFYpOworICAgIHJldHVybiBSOworICB9CisKKyAgc3RhdGljIFF1b3RpbmdUeXBlIG11c3RRdW90ZShTdHJpbmdSZWYgU3RyKSB7CisgICAgcmV0dXJuIFNjYWxhclRyYWl0czx2YWx1ZV90eXBlPjo6bXVzdFF1b3RlKFN0cik7CisgIH0KK307CisKKy8vIFV0aWxpdHkgZm9yIHVzZSB3aXRoaW4gTWFwcGluZ1RyYWl0czw+OjptYXBwaW5nKCkgbWV0aG9kCisvLyB0byBbZGVdbm9ybWFsaXplIGFuIG9iamVjdCBmb3IgdXNlIHdpdGggWUFNTCBjb252ZXJzaW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFROb3JtLCB0eXBlbmFtZSBURmluYWw+CitzdHJ1Y3QgTWFwcGluZ05vcm1hbGl6YXRpb24geworICBNYXBwaW5nTm9ybWFsaXphdGlvbihJTyAmaV9vLCBURmluYWwgJk9iaikKKyAgICAgIDogaW8oaV9vKSwgQnVmUHRyKG51bGxwdHIpLCBSZXN1bHQoT2JqKSB7CisgICAgaWYgKCBpby5vdXRwdXR0aW5nKCkgKSB7CisgICAgICBCdWZQdHIgPSBuZXcgKCZCdWZmZXIpIFROb3JtKGlvLCBPYmopOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgIEJ1ZlB0ciA9IG5ldyAoJkJ1ZmZlcikgVE5vcm0oaW8pOworICAgIH0KKyAgfQorCisgIH5NYXBwaW5nTm9ybWFsaXphdGlvbigpIHsKKyAgICBpZiAoICEgaW8ub3V0cHV0dGluZygpICkgeworICAgICAgUmVzdWx0ID0gQnVmUHRyLT5kZW5vcm1hbGl6ZShpbyk7CisgICAgfQorICAgIEJ1ZlB0ci0+flROb3JtKCk7CisgIH0KKworICBUTm9ybSogb3BlcmF0b3ItPigpIHsgcmV0dXJuIEJ1ZlB0cjsgfQorCitwcml2YXRlOgorICB1c2luZyBTdG9yYWdlID0gQWxpZ25lZENoYXJBcnJheVVuaW9uPFROb3JtPjsKKworICBTdG9yYWdlICAgICAgIEJ1ZmZlcjsKKyAgSU8gICAgICAgICAgICZpbzsKKyAgVE5vcm0gICAgICAgICpCdWZQdHI7CisgIFRGaW5hbCAgICAgICAmUmVzdWx0OworfTsKKworLy8gVXRpbGl0eSBmb3IgdXNlIHdpdGhpbiBNYXBwaW5nVHJhaXRzPD46Om1hcHBpbmcoKSBtZXRob2QKKy8vIHRvIFtkZV1ub3JtYWxpemUgYW4gb2JqZWN0IGZvciB1c2Ugd2l0aCBZQU1MIGNvbnZlcnNpb24uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVE5vcm0sIHR5cGVuYW1lIFRGaW5hbD4KK3N0cnVjdCBNYXBwaW5nTm9ybWFsaXphdGlvbkhlYXAgeworICBNYXBwaW5nTm9ybWFsaXphdGlvbkhlYXAoSU8gJmlfbywgVEZpbmFsICZPYmosIEJ1bXBQdHJBbGxvY2F0b3IgKmFsbG9jYXRvcikKKyAgICA6IGlvKGlfbyksIFJlc3VsdChPYmopIHsKKyAgICBpZiAoIGlvLm91dHB1dHRpbmcoKSApIHsKKyAgICAgIEJ1ZlB0ciA9IG5ldyAoJkJ1ZmZlcikgVE5vcm0oaW8sIE9iaik7CisgICAgfQorICAgIGVsc2UgaWYgKGFsbG9jYXRvcikgeworICAgICAgQnVmUHRyID0gYWxsb2NhdG9yLT5BbGxvY2F0ZTxUTm9ybT4oKTsKKyAgICAgIG5ldyAoQnVmUHRyKSBUTm9ybShpbyk7CisgICAgfSBlbHNlIHsKKyAgICAgIEJ1ZlB0ciA9IG5ldyBUTm9ybShpbyk7CisgICAgfQorICB9CisKKyAgfk1hcHBpbmdOb3JtYWxpemF0aW9uSGVhcCgpIHsKKyAgICBpZiAoIGlvLm91dHB1dHRpbmcoKSApIHsKKyAgICAgIEJ1ZlB0ci0+flROb3JtKCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgUmVzdWx0ID0gQnVmUHRyLT5kZW5vcm1hbGl6ZShpbyk7CisgICAgfQorICB9CisKKyAgVE5vcm0qIG9wZXJhdG9yLT4oKSB7IHJldHVybiBCdWZQdHI7IH0KKworcHJpdmF0ZToKKyAgdXNpbmcgU3RvcmFnZSA9IEFsaWduZWRDaGFyQXJyYXlVbmlvbjxUTm9ybT47CisKKyAgU3RvcmFnZSAgICAgICBCdWZmZXI7CisgIElPICAgICAgICAgICAmaW87CisgIFROb3JtICAgICAgICAqQnVmUHRyID0gbnVsbHB0cjsKKyAgVEZpbmFsICAgICAgICZSZXN1bHQ7Cit9OworCisvLy8KKy8vLyBUaGUgSW5wdXQgY2xhc3MgaXMgdXNlZCB0byBwYXJzZSBhIHlhbWwgZG9jdW1lbnQgaW50byBpbi1tZW1vcnkgc3RydWN0cworLy8vIGFuZCB2ZWN0b3JzLgorLy8vCisvLy8gSXQgd29ya3MgYnkgdXNpbmcgWUFNTFBhcnNlciB0byBkbyBhIHN5bnRheCBwYXJzZSBvZiB0aGUgZW50aXJlIHlhbWwKKy8vLyBkb2N1bWVudCwgdGhlbiB0aGUgSW5wdXQgY2xhc3MgYnVpbGRzIGEgZ3JhcGggb2YgSE5vZGVzIHdoaWNoIHdyYXBzCisvLy8gZWFjaCB5YW1sIE5vZGUuICBUaGUgZXh0cmEgbGF5ZXIgaXMgYnVmZmVyaW5nLiAgVGhlIGxvdyBsZXZlbCB5YW1sCisvLy8gcGFyc2VyIG9ubHkgbGV0cyB5b3UgbG9vayBhdCBlYWNoIG5vZGUgb25jZS4gIFRoZSBidWZmZXJpbmcgbGF5ZXIgbGV0cworLy8vIHlvdSBzZWFyY2ggYW5kIGludGVyYXRlIG11bHRpcGxlIHRpbWVzLiAgVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZQorLy8vIHRoZSBtYXBSZXF1aXJlZCgpIG1ldGhvZCBjYWxscyBtYXkgbm90IGJlIGluIHRoZSBzYW1lIG9yZGVyCisvLy8gYXMgdGhlIGtleXMgaW4gdGhlIGRvY3VtZW50LgorLy8vCitjbGFzcyBJbnB1dCA6IHB1YmxpYyBJTyB7CitwdWJsaWM6CisgIC8vIENvbnN0cnVjdCBhIHlhbWwgSW5wdXQgb2JqZWN0IGZyb20gYSBTdHJpbmdSZWYgYW5kIG9wdGlvbmFsCisgIC8vIHVzZXItZGF0YS4gVGhlIERpYWdIYW5kbGVyIGNhbiBiZSBzcGVjaWZpZWQgdG8gcHJvdmlkZQorICAvLyBhbHRlcm5hdGl2ZSBlcnJvciByZXBvcnRpbmcuCisgIElucHV0KFN0cmluZ1JlZiBJbnB1dENvbnRlbnQsCisgICAgICAgIHZvaWQgKkN0eHQgPSBudWxscHRyLAorICAgICAgICBTb3VyY2VNZ3I6OkRpYWdIYW5kbGVyVHkgRGlhZ0hhbmRsZXIgPSBudWxscHRyLAorICAgICAgICB2b2lkICpEaWFnSGFuZGxlckN0eHQgPSBudWxscHRyKTsKKyAgSW5wdXQoTWVtb3J5QnVmZmVyUmVmIElucHV0LAorICAgICAgICB2b2lkICpDdHh0ID0gbnVsbHB0ciwKKyAgICAgICAgU291cmNlTWdyOjpEaWFnSGFuZGxlclR5IERpYWdIYW5kbGVyID0gbnVsbHB0ciwKKyAgICAgICAgdm9pZCAqRGlhZ0hhbmRsZXJDdHh0ID0gbnVsbHB0cik7CisgIH5JbnB1dCgpIG92ZXJyaWRlOworCisgIC8vIENoZWNrIGlmIHRoZXJlIHdhcyBhbiBzeW50YXggb3Igc2VtYW50aWMgZXJyb3IgZHVyaW5nIHBhcnNpbmcuCisgIHN0ZDo6ZXJyb3JfY29kZSBlcnJvcigpOworCitwcml2YXRlOgorICBib29sIG91dHB1dHRpbmcoKSBvdmVycmlkZTsKKyAgYm9vbCBtYXBUYWcoU3RyaW5nUmVmLCBib29sKSBvdmVycmlkZTsKKyAgdm9pZCBiZWdpbk1hcHBpbmcoKSBvdmVycmlkZTsKKyAgdm9pZCBlbmRNYXBwaW5nKCkgb3ZlcnJpZGU7CisgIGJvb2wgcHJlZmxpZ2h0S2V5KGNvbnN0IGNoYXIgKiwgYm9vbCwgYm9vbCwgYm9vbCAmLCB2b2lkIComKSBvdmVycmlkZTsKKyAgdm9pZCBwb3N0ZmxpZ2h0S2V5KHZvaWQgKikgb3ZlcnJpZGU7CisgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4ga2V5cygpIG92ZXJyaWRlOworICB2b2lkIGJlZ2luRmxvd01hcHBpbmcoKSBvdmVycmlkZTsKKyAgdm9pZCBlbmRGbG93TWFwcGluZygpIG92ZXJyaWRlOworICB1bnNpZ25lZCBiZWdpblNlcXVlbmNlKCkgb3ZlcnJpZGU7CisgIHZvaWQgZW5kU2VxdWVuY2UoKSBvdmVycmlkZTsKKyAgYm9vbCBwcmVmbGlnaHRFbGVtZW50KHVuc2lnbmVkIGluZGV4LCB2b2lkIComKSBvdmVycmlkZTsKKyAgdm9pZCBwb3N0ZmxpZ2h0RWxlbWVudCh2b2lkICopIG92ZXJyaWRlOworICB1bnNpZ25lZCBiZWdpbkZsb3dTZXF1ZW5jZSgpIG92ZXJyaWRlOworICBib29sIHByZWZsaWdodEZsb3dFbGVtZW50KHVuc2lnbmVkICwgdm9pZCAqJikgb3ZlcnJpZGU7CisgIHZvaWQgcG9zdGZsaWdodEZsb3dFbGVtZW50KHZvaWQgKikgb3ZlcnJpZGU7CisgIHZvaWQgZW5kRmxvd1NlcXVlbmNlKCkgb3ZlcnJpZGU7CisgIHZvaWQgYmVnaW5FbnVtU2NhbGFyKCkgb3ZlcnJpZGU7CisgIGJvb2wgbWF0Y2hFbnVtU2NhbGFyKGNvbnN0IGNoYXIqLCBib29sKSBvdmVycmlkZTsKKyAgYm9vbCBtYXRjaEVudW1GYWxsYmFjaygpIG92ZXJyaWRlOworICB2b2lkIGVuZEVudW1TY2FsYXIoKSBvdmVycmlkZTsKKyAgYm9vbCBiZWdpbkJpdFNldFNjYWxhcihib29sICYpIG92ZXJyaWRlOworICBib29sIGJpdFNldE1hdGNoKGNvbnN0IGNoYXIgKiwgYm9vbCApIG92ZXJyaWRlOworICB2b2lkIGVuZEJpdFNldFNjYWxhcigpIG92ZXJyaWRlOworICB2b2lkIHNjYWxhclN0cmluZyhTdHJpbmdSZWYgJiwgUXVvdGluZ1R5cGUpIG92ZXJyaWRlOworICB2b2lkIGJsb2NrU2NhbGFyU3RyaW5nKFN0cmluZ1JlZiAmKSBvdmVycmlkZTsKKyAgdm9pZCBzZXRFcnJvcihjb25zdCBUd2luZSAmbWVzc2FnZSkgb3ZlcnJpZGU7CisgIGJvb2wgY2FuRWxpZGVFbXB0eVNlcXVlbmNlKCkgb3ZlcnJpZGU7CisKKyAgY2xhc3MgSE5vZGUgeworICAgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworICBwdWJsaWM6CisgICAgSE5vZGUoTm9kZSAqbikgOiBfbm9kZShuKSB7IH0KKyAgICB2aXJ0dWFsIH5ITm9kZSgpID0gZGVmYXVsdDsKKworICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSE5vZGUgKikgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgTm9kZSAqX25vZGU7CisgIH07CisKKyAgY2xhc3MgRW1wdHlITm9kZSA6IHB1YmxpYyBITm9kZSB7CisgICAgdm9pZCBhbmNob3IoKSBvdmVycmlkZTsKKworICBwdWJsaWM6CisgICAgRW1wdHlITm9kZShOb2RlICpuKSA6IEhOb2RlKG4pIHsgfQorCisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBITm9kZSAqbikgeyByZXR1cm4gTnVsbE5vZGU6OmNsYXNzb2Yobi0+X25vZGUpOyB9CisKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEVtcHR5SE5vZGUgKikgeyByZXR1cm4gdHJ1ZTsgfQorICB9OworCisgIGNsYXNzIFNjYWxhckhOb2RlIDogcHVibGljIEhOb2RlIHsKKyAgICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCisgIHB1YmxpYzoKKyAgICBTY2FsYXJITm9kZShOb2RlICpuLCBTdHJpbmdSZWYgcykgOiBITm9kZShuKSwgX3ZhbHVlKHMpIHsgfQorCisgICAgU3RyaW5nUmVmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gX3ZhbHVlOyB9CisKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEhOb2RlICpuKSB7CisgICAgICByZXR1cm4gU2NhbGFyTm9kZTo6Y2xhc3NvZihuLT5fbm9kZSkgfHwKKyAgICAgICAgICAgICBCbG9ja1NjYWxhck5vZGU6OmNsYXNzb2Yobi0+X25vZGUpOworICAgIH0KKworICAgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgU2NhbGFySE5vZGUgKikgeyByZXR1cm4gdHJ1ZTsgfQorCisgIHByb3RlY3RlZDoKKyAgICBTdHJpbmdSZWYgX3ZhbHVlOworICB9OworCisgIGNsYXNzIE1hcEhOb2RlIDogcHVibGljIEhOb2RlIHsKKyAgICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCisgIHB1YmxpYzoKKyAgICBNYXBITm9kZShOb2RlICpuKSA6IEhOb2RlKG4pIHsgfQorCisgICAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBITm9kZSAqbikgeworICAgICAgcmV0dXJuIE1hcHBpbmdOb2RlOjpjbGFzc29mKG4tPl9ub2RlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IE1hcEhOb2RlICopIHsgcmV0dXJuIHRydWU7IH0KKworICAgIHVzaW5nIE5hbWVUb05vZGUgPSBTdHJpbmdNYXA8c3RkOjp1bmlxdWVfcHRyPEhOb2RlPj47CisKKyAgICBOYW1lVG9Ob2RlIE1hcHBpbmc7CisgICAgU21hbGxWZWN0b3I8c3RkOjpzdHJpbmcsIDY+IFZhbGlkS2V5czsKKyAgfTsKKworICBjbGFzcyBTZXF1ZW5jZUhOb2RlIDogcHVibGljIEhOb2RlIHsKKyAgICB2b2lkIGFuY2hvcigpIG92ZXJyaWRlOworCisgIHB1YmxpYzoKKyAgICBTZXF1ZW5jZUhOb2RlKE5vZGUgKm4pIDogSE5vZGUobikgeyB9CisKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEhOb2RlICpuKSB7CisgICAgICByZXR1cm4gU2VxdWVuY2VOb2RlOjpjbGFzc29mKG4tPl9ub2RlKTsKKyAgICB9CisKKyAgICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFNlcXVlbmNlSE5vZGUgKikgeyByZXR1cm4gdHJ1ZTsgfQorCisgICAgc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPEhOb2RlPj4gRW50cmllczsKKyAgfTsKKworICBzdGQ6OnVuaXF1ZV9wdHI8SW5wdXQ6OkhOb2RlPiBjcmVhdGVITm9kZXMoTm9kZSAqbm9kZSk7CisgIHZvaWQgc2V0RXJyb3IoSE5vZGUgKmhub2RlLCBjb25zdCBUd2luZSAmbWVzc2FnZSk7CisgIHZvaWQgc2V0RXJyb3IoTm9kZSAqbm9kZSwgY29uc3QgVHdpbmUgJm1lc3NhZ2UpOworCitwdWJsaWM6CisgIC8vIFRoZXNlIGFyZSBvbmx5IHVzZWQgYnkgb3BlcmF0b3I+Pi4gVGhleSBjb3VsZCBiZSBwcml2YXRlCisgIC8vIGlmIHRob3NlIHRlbXBsYXRlZCB0aGluZ3MgY291bGQgYmUgbWFkZSBmcmllbmRzLgorICBib29sIHNldEN1cnJlbnREb2N1bWVudCgpOworICBib29sIG5leHREb2N1bWVudCgpOworCisgIC8vLyBSZXR1cm5zIHRoZSBjdXJyZW50IG5vZGUgdGhhdCdzIGJlaW5nIHBhcnNlZCBieSB0aGUgWUFNTCBQYXJzZXIuCisgIGNvbnN0IE5vZGUgKmdldEN1cnJlbnROb2RlKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIFNvdXJjZU1nciAgICAgICAgICAgICAgICAgICAgICAgICAgIFNyY01ncjsgLy8gbXVzdCBiZSBiZWZvcmUgU3RybQorICBzdGQ6OnVuaXF1ZV9wdHI8bGx2bTo6eWFtbDo6U3RyZWFtPiBTdHJtOworICBzdGQ6OnVuaXF1ZV9wdHI8SE5vZGU+ICAgICAgICAgICAgICBUb3BOb2RlOworICBzdGQ6OmVycm9yX2NvZGUgICAgICAgICAgICAgICAgICAgICBFQzsKKyAgQnVtcFB0ckFsbG9jYXRvciAgICAgICAgICAgICAgICAgICAgU3RyaW5nQWxsb2NhdG9yOworICBkb2N1bWVudF9pdGVyYXRvciAgICAgICAgICAgICAgICAgICBEb2NJdGVyYXRvcjsKKyAgc3RkOjp2ZWN0b3I8Ym9vbD4gICAgICAgICAgICAgICAgICAgQml0VmFsdWVzVXNlZDsKKyAgSE5vZGUgKkN1cnJlbnROb2RlID0gbnVsbHB0cjsKKyAgYm9vbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGFyTWF0Y2hGb3VuZDsKK307CisKKy8vLworLy8vIFRoZSBPdXRwdXQgY2xhc3MgaXMgdXNlZCB0byBnZW5lcmF0ZSBhIHlhbWwgZG9jdW1lbnQgZnJvbSBpbi1tZW1vcnkgc3RydWN0cworLy8vIGFuZCB2ZWN0b3JzLgorLy8vCitjbGFzcyBPdXRwdXQgOiBwdWJsaWMgSU8geworcHVibGljOgorICBPdXRwdXQocmF3X29zdHJlYW0gJiwgdm9pZCAqQ3R4dCA9IG51bGxwdHIsIGludCBXcmFwQ29sdW1uID0gNzApOworICB+T3V0cHV0KCkgb3ZlcnJpZGU7CisKKyAgLy8vIFxicmllZiBTZXQgd2hldGhlciBvciBub3QgdG8gb3V0cHV0IG9wdGlvbmFsIHZhbHVlcyB3aGljaCBhcmUgZXF1YWwKKyAgLy8vIHRvIHRoZSBkZWZhdWx0IHZhbHVlLiAgQnkgZGVmYXVsdCwgd2hlbiBvdXRwdXR0aW5nIGlmIHlvdSBhdHRlbXB0CisgIC8vLyB0byB3cml0ZSBhIHZhbHVlIHRoYXQgaXMgZXF1YWwgdG8gdGhlIGRlZmF1bHQsIHRoZSB2YWx1ZSBnZXRzIGlnbm9yZWQuCisgIC8vLyBTb21ldGltZXMsIGl0IGlzIHVzZWZ1bCB0byBiZSBhYmxlIHRvIHNlZSB0aGVzZSBpbiB0aGUgcmVzdWx0aW5nIFlBTUwKKyAgLy8vIGFueXdheS4KKyAgdm9pZCBzZXRXcml0ZURlZmF1bHRWYWx1ZXMoYm9vbCBXcml0ZSkgeyBXcml0ZURlZmF1bHRWYWx1ZXMgPSBXcml0ZTsgfQorCisgIGJvb2wgb3V0cHV0dGluZygpIG92ZXJyaWRlOworICBib29sIG1hcFRhZyhTdHJpbmdSZWYsIGJvb2wpIG92ZXJyaWRlOworICB2b2lkIGJlZ2luTWFwcGluZygpIG92ZXJyaWRlOworICB2b2lkIGVuZE1hcHBpbmcoKSBvdmVycmlkZTsKKyAgYm9vbCBwcmVmbGlnaHRLZXkoY29uc3QgY2hhciAqa2V5LCBib29sLCBib29sLCBib29sICYsIHZvaWQgKiYpIG92ZXJyaWRlOworICB2b2lkIHBvc3RmbGlnaHRLZXkodm9pZCAqKSBvdmVycmlkZTsKKyAgc3RkOjp2ZWN0b3I8U3RyaW5nUmVmPiBrZXlzKCkgb3ZlcnJpZGU7CisgIHZvaWQgYmVnaW5GbG93TWFwcGluZygpIG92ZXJyaWRlOworICB2b2lkIGVuZEZsb3dNYXBwaW5nKCkgb3ZlcnJpZGU7CisgIHVuc2lnbmVkIGJlZ2luU2VxdWVuY2UoKSBvdmVycmlkZTsKKyAgdm9pZCBlbmRTZXF1ZW5jZSgpIG92ZXJyaWRlOworICBib29sIHByZWZsaWdodEVsZW1lbnQodW5zaWduZWQsIHZvaWQgKiYpIG92ZXJyaWRlOworICB2b2lkIHBvc3RmbGlnaHRFbGVtZW50KHZvaWQgKikgb3ZlcnJpZGU7CisgIHVuc2lnbmVkIGJlZ2luRmxvd1NlcXVlbmNlKCkgb3ZlcnJpZGU7CisgIGJvb2wgcHJlZmxpZ2h0Rmxvd0VsZW1lbnQodW5zaWduZWQsIHZvaWQgKiYpIG92ZXJyaWRlOworICB2b2lkIHBvc3RmbGlnaHRGbG93RWxlbWVudCh2b2lkICopIG92ZXJyaWRlOworICB2b2lkIGVuZEZsb3dTZXF1ZW5jZSgpIG92ZXJyaWRlOworICB2b2lkIGJlZ2luRW51bVNjYWxhcigpIG92ZXJyaWRlOworICBib29sIG1hdGNoRW51bVNjYWxhcihjb25zdCBjaGFyKiwgYm9vbCkgb3ZlcnJpZGU7CisgIGJvb2wgbWF0Y2hFbnVtRmFsbGJhY2soKSBvdmVycmlkZTsKKyAgdm9pZCBlbmRFbnVtU2NhbGFyKCkgb3ZlcnJpZGU7CisgIGJvb2wgYmVnaW5CaXRTZXRTY2FsYXIoYm9vbCAmKSBvdmVycmlkZTsKKyAgYm9vbCBiaXRTZXRNYXRjaChjb25zdCBjaGFyICosIGJvb2wgKSBvdmVycmlkZTsKKyAgdm9pZCBlbmRCaXRTZXRTY2FsYXIoKSBvdmVycmlkZTsKKyAgdm9pZCBzY2FsYXJTdHJpbmcoU3RyaW5nUmVmICYsIFF1b3RpbmdUeXBlKSBvdmVycmlkZTsKKyAgdm9pZCBibG9ja1NjYWxhclN0cmluZyhTdHJpbmdSZWYgJikgb3ZlcnJpZGU7CisgIHZvaWQgc2V0RXJyb3IoY29uc3QgVHdpbmUgJm1lc3NhZ2UpIG92ZXJyaWRlOworICBib29sIGNhbkVsaWRlRW1wdHlTZXF1ZW5jZSgpIG92ZXJyaWRlOworCisgIC8vIFRoZXNlIGFyZSBvbmx5IHVzZWQgYnkgb3BlcmF0b3I8PC4gVGhleSBjb3VsZCBiZSBwcml2YXRlCisgIC8vIGlmIHRoYXQgdGVtcGxhdGVkIG9wZXJhdG9yIGNvdWxkIGJlIG1hZGUgYSBmcmllbmQuCisgIHZvaWQgYmVnaW5Eb2N1bWVudHMoKTsKKyAgYm9vbCBwcmVmbGlnaHREb2N1bWVudCh1bnNpZ25lZCk7CisgIHZvaWQgcG9zdGZsaWdodERvY3VtZW50KCk7CisgIHZvaWQgZW5kRG9jdW1lbnRzKCk7CisKK3ByaXZhdGU6CisgIHZvaWQgb3V0cHV0KFN0cmluZ1JlZiBzKTsKKyAgdm9pZCBvdXRwdXRVcFRvRW5kT2ZMaW5lKFN0cmluZ1JlZiBzKTsKKyAgdm9pZCBuZXdMaW5lQ2hlY2soKTsKKyAgdm9pZCBvdXRwdXROZXdMaW5lKCk7CisgIHZvaWQgcGFkZGVkS2V5KFN0cmluZ1JlZiBrZXkpOworICB2b2lkIGZsb3dLZXkoU3RyaW5nUmVmIEtleSk7CisKKyAgZW51bSBJblN0YXRlIHsKKyAgICBpblNlcSwKKyAgICBpbkZsb3dTZXEsCisgICAgaW5NYXBGaXJzdEtleSwKKyAgICBpbk1hcE90aGVyS2V5LAorICAgIGluRmxvd01hcEZpcnN0S2V5LAorICAgIGluRmxvd01hcE90aGVyS2V5CisgIH07CisKKyAgcmF3X29zdHJlYW0gJk91dDsKKyAgaW50IFdyYXBDb2x1bW47CisgIFNtYWxsVmVjdG9yPEluU3RhdGUsIDg+IFN0YXRlU3RhY2s7CisgIGludCBDb2x1bW4gPSAwOworICBpbnQgQ29sdW1uQXRGbG93U3RhcnQgPSAwOworICBpbnQgQ29sdW1uQXRNYXBGbG93U3RhcnQgPSAwOworICBib29sIE5lZWRCaXRWYWx1ZUNvbW1hID0gZmFsc2U7CisgIGJvb2wgTmVlZEZsb3dTZXF1ZW5jZUNvbW1hID0gZmFsc2U7CisgIGJvb2wgRW51bWVyYXRpb25NYXRjaEZvdW5kID0gZmFsc2U7CisgIGJvb2wgTmVlZHNOZXdMaW5lID0gZmFsc2U7CisgIGJvb2wgV3JpdGVEZWZhdWx0VmFsdWVzID0gZmFsc2U7Cit9OworCisvLy8gWUFNTCBJL08gZG9lcyBjb252ZXJzaW9uIGJhc2VkIG9uIHR5cGVzLiBCdXQgb2Z0ZW4gbmF0aXZlIGRhdGEgdHlwZXMKKy8vLyBhcmUganVzdCBhIHR5cGVkZWYgb2YgYnVpbHQgaW4gaW50ZXJncmFsIHR5cGVzIChlLmcuIGludCkuICBCdXQgdGhlIEMrKworLy8vIHR5cGUgbWF0Y2hpbmcgc3lzdGVtIHNlZXMgdGhyb3VnaCB0aGUgdHlwZWRlZiBhbmQgYWxsIHRoZSB0eXBlZGVmZWQgdHlwZXMKKy8vLyBsb29rIGxpa2UgYSBidWlsdCBpbiB0eXBlLiBUaGlzIHdpbGwgY2F1c2UgdGhlIGdlbmVyaWMgWUFNTCBJL08gY29udmVyc2lvbgorLy8vIHRvIGJlIHVzZWQuIFRvIHByb3ZpZGUgYmV0dGVyIGNvbnRyb2wgb3ZlciB0aGUgWUFNTCBjb252ZXJzaW9uLCB5b3UgY2FuCisvLy8gdXNlIHRoaXMgbWFjcm8gaW5zdGVhZCBvZiB0eXBlZGVmLiAgSXQgd2lsbCBjcmVhdGUgYSBjbGFzcyB3aXRoIG9uZSBmaWVsZAorLy8vIGFuZCBhdXRvbWF0aWMgY29udmVyc2lvbiBvcGVyYXRvcnMgdG8gYW5kIGZyb20gdGhlIGJhc2UgdHlwZS4KKy8vLyBCYXNlZCBvbiBCT09TVF9TVFJPTkdfVFlQRURFRgorI2RlZmluZSBMTFZNX1lBTUxfU1RST05HX1RZUEVERUYoX2Jhc2UsIF90eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdHJ1Y3QgX3R5cGUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF90eXBlKCkgPSBkZWZhdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfdHlwZShjb25zdCBfYmFzZSB2KSA6IHZhbHVlKHYpIHt9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX3R5cGUoY29uc3QgX3R5cGUgJnYpID0gZGVmYXVsdDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF90eXBlICZvcGVyYXRvcj0oY29uc3QgX3R5cGUgJnJocykgPSBkZWZhdWx0OyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfdHlwZSAmb3BlcmF0b3I9KGNvbnN0IF9iYXNlICZyaHMpIHsgdmFsdWUgPSByaHM7IHJldHVybiAqdGhpczsgfSAgICAgIFwKKyAgICAgICAgb3BlcmF0b3IgY29uc3QgX2Jhc2UgJiAoKSBjb25zdCB7IHJldHVybiB2YWx1ZTsgfSAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBfdHlwZSAmcmhzKSBjb25zdCB7IHJldHVybiB2YWx1ZSA9PSByaHMudmFsdWU7IH0gXAorICAgICAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgX2Jhc2UgJnJocykgY29uc3QgeyByZXR1cm4gdmFsdWUgPT0gcmhzOyB9ICAgICAgIFwKKyAgICAgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgX3R5cGUgJnJocykgY29uc3QgeyByZXR1cm4gdmFsdWUgPCByaHMudmFsdWU7IH0gICBcCisgICAgICAgIF9iYXNlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB1c2luZyBCYXNlVHlwZSA9IF9iYXNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9OworCisvLy8KKy8vLyBVc2UgdGhlc2UgdHlwZXMgaW5zdGVhZCBvZiB1aW50WFhfdCBpbiBhbnkgbWFwcGluZyB0byBoYXZlCisvLy8gaXRzIHlhbWwgb3V0cHV0IGZvcm1hdHRlZCBhcyBoZXhhZGVjaW1hbC4KKy8vLworTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQ4X3QsIEhleDgpCitMTFZNX1lBTUxfU1RST05HX1RZUEVERUYodWludDE2X3QsIEhleDE2KQorTExWTV9ZQU1MX1NUUk9OR19UWVBFREVGKHVpbnQzMl90LCBIZXgzMikKK0xMVk1fWUFNTF9TVFJPTkdfVFlQRURFRih1aW50NjRfdCwgSGV4NjQpCisKK3RlbXBsYXRlPD4KK3N0cnVjdCBTY2FsYXJUcmFpdHM8SGV4OD4geworICBzdGF0aWMgdm9pZCBvdXRwdXQoY29uc3QgSGV4OCAmLCB2b2lkICosIHJhd19vc3RyZWFtICYpOworICBzdGF0aWMgU3RyaW5nUmVmIGlucHV0KFN0cmluZ1JlZiwgdm9pZCAqLCBIZXg4ICYpOworICBzdGF0aWMgUXVvdGluZ1R5cGUgbXVzdFF1b3RlKFN0cmluZ1JlZikgeyByZXR1cm4gUXVvdGluZ1R5cGU6Ok5vbmU7IH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBTY2FsYXJUcmFpdHM8SGV4MTY+IHsKKyAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IEhleDE2ICYsIHZvaWQgKiwgcmF3X29zdHJlYW0gJik7CisgIHN0YXRpYyBTdHJpbmdSZWYgaW5wdXQoU3RyaW5nUmVmLCB2b2lkICosIEhleDE2ICYpOworICBzdGF0aWMgUXVvdGluZ1R5cGUgbXVzdFF1b3RlKFN0cmluZ1JlZikgeyByZXR1cm4gUXVvdGluZ1R5cGU6Ok5vbmU7IH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBTY2FsYXJUcmFpdHM8SGV4MzI+IHsKKyAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IEhleDMyICYsIHZvaWQgKiwgcmF3X29zdHJlYW0gJik7CisgIHN0YXRpYyBTdHJpbmdSZWYgaW5wdXQoU3RyaW5nUmVmLCB2b2lkICosIEhleDMyICYpOworICBzdGF0aWMgUXVvdGluZ1R5cGUgbXVzdFF1b3RlKFN0cmluZ1JlZikgeyByZXR1cm4gUXVvdGluZ1R5cGU6Ok5vbmU7IH0KK307CisKK3RlbXBsYXRlPD4KK3N0cnVjdCBTY2FsYXJUcmFpdHM8SGV4NjQ+IHsKKyAgc3RhdGljIHZvaWQgb3V0cHV0KGNvbnN0IEhleDY0ICYsIHZvaWQgKiwgcmF3X29zdHJlYW0gJik7CisgIHN0YXRpYyBTdHJpbmdSZWYgaW5wdXQoU3RyaW5nUmVmLCB2b2lkICosIEhleDY0ICYpOworICBzdGF0aWMgUXVvdGluZ1R5cGUgbXVzdFF1b3RlKFN0cmluZ1JlZikgeyByZXR1cm4gUXVvdGluZ1R5cGU6Ok5vbmU7IH0KK307CisKKy8vIERlZmluZSBub24tbWVtYmVyIG9wZXJhdG9yPj4gc28gdGhhdCBJbnB1dCBjYW4gc3RyZWFtIGluIGEgZG9jdW1lbnQgbGlzdC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxoYXNfRG9jdW1lbnRMaXN0VHJhaXRzPFQ+Ojp2YWx1ZSwgSW5wdXQgJj46OnR5cGUKK29wZXJhdG9yPj4oSW5wdXQgJnlpbiwgVCAmZG9jTGlzdCkgeworICBpbnQgaSA9IDA7CisgIEVtcHR5Q29udGV4dCBDdHg7CisgIHdoaWxlICggeWluLnNldEN1cnJlbnREb2N1bWVudCgpICkgeworICAgIHlhbWxpemUoeWluLCBEb2N1bWVudExpc3RUcmFpdHM8VD46OmVsZW1lbnQoeWluLCBkb2NMaXN0LCBpKSwgdHJ1ZSwgQ3R4KTsKKyAgICBpZiAoIHlpbi5lcnJvcigpICkKKyAgICAgIHJldHVybiB5aW47CisgICAgeWluLm5leHREb2N1bWVudCgpOworICAgICsraTsKKyAgfQorICByZXR1cm4geWluOworfQorCisvLyBEZWZpbmUgbm9uLW1lbWJlciBvcGVyYXRvcj4+IHNvIHRoYXQgSW5wdXQgY2FuIHN0cmVhbSBpbiBhIG1hcCBhcyBhIGRvY3VtZW50LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aGFzX01hcHBpbmdUcmFpdHM8VCwgRW1wdHlDb250ZXh0Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQgJj46OnR5cGUKK29wZXJhdG9yPj4oSW5wdXQgJnlpbiwgVCAmZG9jTWFwKSB7CisgIEVtcHR5Q29udGV4dCBDdHg7CisgIHlpbi5zZXRDdXJyZW50RG9jdW1lbnQoKTsKKyAgeWFtbGl6ZSh5aW4sIGRvY01hcCwgdHJ1ZSwgQ3R4KTsKKyAgcmV0dXJuIHlpbjsKK30KKworLy8gRGVmaW5lIG5vbi1tZW1iZXIgb3BlcmF0b3I+PiBzbyB0aGF0IElucHV0IGNhbiBzdHJlYW0gaW4gYSBzZXF1ZW5jZSBhcworLy8gYSBkb2N1bWVudC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxoYXNfU2VxdWVuY2VUcmFpdHM8VD46OnZhbHVlLCBJbnB1dCAmPjo6dHlwZQorb3BlcmF0b3I+PihJbnB1dCAmeWluLCBUICZkb2NTZXEpIHsKKyAgRW1wdHlDb250ZXh0IEN0eDsKKyAgaWYgKHlpbi5zZXRDdXJyZW50RG9jdW1lbnQoKSkKKyAgICB5YW1saXplKHlpbiwgZG9jU2VxLCB0cnVlLCBDdHgpOworICByZXR1cm4geWluOworfQorCisvLyBEZWZpbmUgbm9uLW1lbWJlciBvcGVyYXRvcj4+IHNvIHRoYXQgSW5wdXQgY2FuIHN0cmVhbSBpbiBhIGJsb2NrIHNjYWxhci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxoYXNfQmxvY2tTY2FsYXJUcmFpdHM8VD46OnZhbHVlLCBJbnB1dCAmPjo6dHlwZQorb3BlcmF0b3I+PihJbnB1dCAmSW4sIFQgJlZhbCkgeworICBFbXB0eUNvbnRleHQgQ3R4OworICBpZiAoSW4uc2V0Q3VycmVudERvY3VtZW50KCkpCisgICAgeWFtbGl6ZShJbiwgVmFsLCB0cnVlLCBDdHgpOworICByZXR1cm4gSW47Cit9CisKKy8vIERlZmluZSBub24tbWVtYmVyIG9wZXJhdG9yPj4gc28gdGhhdCBJbnB1dCBjYW4gc3RyZWFtIGluIGEgc3RyaW5nIG1hcC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxoYXNfQ3VzdG9tTWFwcGluZ1RyYWl0czxUPjo6dmFsdWUsIElucHV0ICY+Ojp0eXBlCitvcGVyYXRvcj4+KElucHV0ICZJbiwgVCAmVmFsKSB7CisgIEVtcHR5Q29udGV4dCBDdHg7CisgIGlmIChJbi5zZXRDdXJyZW50RG9jdW1lbnQoKSkKKyAgICB5YW1saXplKEluLCBWYWwsIHRydWUsIEN0eCk7CisgIHJldHVybiBJbjsKK30KKworLy8gUHJvdmlkZSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSBhYm91dCB0eXBlcyBtaXNzaW5nIGEgdHJhaXQgc3BlY2lhbGl6YXRpb24KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPG1pc3NpbmdUcmFpdHM8VCwgRW1wdHlDb250ZXh0Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5wdXQgJj46OnR5cGUKK29wZXJhdG9yPj4oSW5wdXQgJnlpbiwgVCAmZG9jU2VxKSB7CisgIGNoYXIgbWlzc2luZ195YW1sX3RyYWl0X2Zvcl90eXBlW3NpemVvZihNaXNzaW5nVHJhaXQ8VD4pXTsKKyAgcmV0dXJuIHlpbjsKK30KKworLy8gRGVmaW5lIG5vbi1tZW1iZXIgb3BlcmF0b3I8PCBzbyB0aGF0IE91dHB1dCBjYW4gc3RyZWFtIG91dCBkb2N1bWVudCBsaXN0LgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUKK3R5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPGhhc19Eb2N1bWVudExpc3RUcmFpdHM8VD46OnZhbHVlLCBPdXRwdXQgJj46OnR5cGUKK29wZXJhdG9yPDwoT3V0cHV0ICZ5b3V0LCBUICZkb2NMaXN0KSB7CisgIEVtcHR5Q29udGV4dCBDdHg7CisgIHlvdXQuYmVnaW5Eb2N1bWVudHMoKTsKKyAgY29uc3Qgc2l6ZV90IGNvdW50ID0gRG9jdW1lbnRMaXN0VHJhaXRzPFQ+OjpzaXplKHlvdXQsIGRvY0xpc3QpOworICBmb3Ioc2l6ZV90IGk9MDsgaSA8IGNvdW50OyArK2kpIHsKKyAgICBpZiAoIHlvdXQucHJlZmxpZ2h0RG9jdW1lbnQoaSkgKSB7CisgICAgICB5YW1saXplKHlvdXQsIERvY3VtZW50TGlzdFRyYWl0czxUPjo6ZWxlbWVudCh5b3V0LCBkb2NMaXN0LCBpKSwgdHJ1ZSwKKyAgICAgICAgICAgICAgQ3R4KTsKKyAgICAgIHlvdXQucG9zdGZsaWdodERvY3VtZW50KCk7CisgICAgfQorICB9CisgIHlvdXQuZW5kRG9jdW1lbnRzKCk7CisgIHJldHVybiB5b3V0OworfQorCisvLyBEZWZpbmUgbm9uLW1lbWJlciBvcGVyYXRvcjw8IHNvIHRoYXQgT3V0cHV0IGNhbiBzdHJlYW0gb3V0IGEgbWFwLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitpbmxpbmUgdHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aGFzX01hcHBpbmdUcmFpdHM8VCwgRW1wdHlDb250ZXh0Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0ICY+Ojp0eXBlCitvcGVyYXRvcjw8KE91dHB1dCAmeW91dCwgVCAmbWFwKSB7CisgIEVtcHR5Q29udGV4dCBDdHg7CisgIHlvdXQuYmVnaW5Eb2N1bWVudHMoKTsKKyAgaWYgKCB5b3V0LnByZWZsaWdodERvY3VtZW50KDApICkgeworICAgIHlhbWxpemUoeW91dCwgbWFwLCB0cnVlLCBDdHgpOworICAgIHlvdXQucG9zdGZsaWdodERvY3VtZW50KCk7CisgIH0KKyAgeW91dC5lbmREb2N1bWVudHMoKTsKKyAgcmV0dXJuIHlvdXQ7Cit9CisKKy8vIERlZmluZSBub24tbWVtYmVyIG9wZXJhdG9yPDwgc28gdGhhdCBPdXRwdXQgY2FuIHN0cmVhbSBvdXQgYSBzZXF1ZW5jZS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxoYXNfU2VxdWVuY2VUcmFpdHM8VD46OnZhbHVlLCBPdXRwdXQgJj46OnR5cGUKK29wZXJhdG9yPDwoT3V0cHV0ICZ5b3V0LCBUICZzZXEpIHsKKyAgRW1wdHlDb250ZXh0IEN0eDsKKyAgeW91dC5iZWdpbkRvY3VtZW50cygpOworICBpZiAoIHlvdXQucHJlZmxpZ2h0RG9jdW1lbnQoMCkgKSB7CisgICAgeWFtbGl6ZSh5b3V0LCBzZXEsIHRydWUsIEN0eCk7CisgICAgeW91dC5wb3N0ZmxpZ2h0RG9jdW1lbnQoKTsKKyAgfQorICB5b3V0LmVuZERvY3VtZW50cygpOworICByZXR1cm4geW91dDsKK30KKworLy8gRGVmaW5lIG5vbi1tZW1iZXIgb3BlcmF0b3I8PCBzbyB0aGF0IE91dHB1dCBjYW4gc3RyZWFtIG91dCBhIGJsb2NrIHNjYWxhci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lCit0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxoYXNfQmxvY2tTY2FsYXJUcmFpdHM8VD46OnZhbHVlLCBPdXRwdXQgJj46OnR5cGUKK29wZXJhdG9yPDwoT3V0cHV0ICZPdXQsIFQgJlZhbCkgeworICBFbXB0eUNvbnRleHQgQ3R4OworICBPdXQuYmVnaW5Eb2N1bWVudHMoKTsKKyAgaWYgKE91dC5wcmVmbGlnaHREb2N1bWVudCgwKSkgeworICAgIHlhbWxpemUoT3V0LCBWYWwsIHRydWUsIEN0eCk7CisgICAgT3V0LnBvc3RmbGlnaHREb2N1bWVudCgpOworICB9CisgIE91dC5lbmREb2N1bWVudHMoKTsKKyAgcmV0dXJuIE91dDsKK30KKworLy8gRGVmaW5lIG5vbi1tZW1iZXIgb3BlcmF0b3I8PCBzbyB0aGF0IE91dHB1dCBjYW4gc3RyZWFtIG91dCBhIHN0cmluZyBtYXAuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK2lubGluZQordHlwZW5hbWUgc3RkOjplbmFibGVfaWY8aGFzX0N1c3RvbU1hcHBpbmdUcmFpdHM8VD46OnZhbHVlLCBPdXRwdXQgJj46OnR5cGUKK29wZXJhdG9yPDwoT3V0cHV0ICZPdXQsIFQgJlZhbCkgeworICBFbXB0eUNvbnRleHQgQ3R4OworICBPdXQuYmVnaW5Eb2N1bWVudHMoKTsKKyAgaWYgKE91dC5wcmVmbGlnaHREb2N1bWVudCgwKSkgeworICAgIHlhbWxpemUoT3V0LCBWYWwsIHRydWUsIEN0eCk7CisgICAgT3V0LnBvc3RmbGlnaHREb2N1bWVudCgpOworICB9CisgIE91dC5lbmREb2N1bWVudHMoKTsKKyAgcmV0dXJuIE91dDsKK30KKworLy8gUHJvdmlkZSBiZXR0ZXIgZXJyb3IgbWVzc2FnZSBhYm91dCB0eXBlcyBtaXNzaW5nIGEgdHJhaXQgc3BlY2lhbGl6YXRpb24KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgoraW5saW5lIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPG1pc3NpbmdUcmFpdHM8VCwgRW1wdHlDb250ZXh0Pjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3V0cHV0ICY+Ojp0eXBlCitvcGVyYXRvcjw8KE91dHB1dCAmeW91dCwgVCAmc2VxKSB7CisgIGNoYXIgbWlzc2luZ195YW1sX3RyYWl0X2Zvcl90eXBlW3NpemVvZihNaXNzaW5nVHJhaXQ8VD4pXTsKKyAgcmV0dXJuIHlvdXQ7Cit9CisKK3RlbXBsYXRlIDxib29sIEI+IHN0cnVjdCBJc0Zsb3dTZXF1ZW5jZUJhc2Uge307Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgSXNGbG93U2VxdWVuY2VCYXNlPHRydWU+IHsgc3RhdGljIGNvbnN0IGJvb2wgZmxvdyA9IHRydWU7IH07CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBULCBib29sIEZsb3c+CitzdHJ1Y3QgU2VxdWVuY2VUcmFpdHNJbXBsIDogSXNGbG93U2VxdWVuY2VCYXNlPEZsb3c+IHsKK3ByaXZhdGU6CisgIHVzaW5nIHR5cGUgPSB0eXBlbmFtZSBUOjp2YWx1ZV90eXBlOworCitwdWJsaWM6CisgIHN0YXRpYyBzaXplX3Qgc2l6ZShJTyAmaW8sIFQgJnNlcSkgeyByZXR1cm4gc2VxLnNpemUoKTsgfQorCisgIHN0YXRpYyB0eXBlICZlbGVtZW50KElPICZpbywgVCAmc2VxLCBzaXplX3QgaW5kZXgpIHsKKyAgICBpZiAoaW5kZXggPj0gc2VxLnNpemUoKSkKKyAgICAgIHNlcS5yZXNpemUoaW5kZXggKyAxKTsKKyAgICByZXR1cm4gc2VxW2luZGV4XTsKKyAgfQorfTsKKworLy8gU2ltcGxlIGhlbHBlciB0byBjaGVjayBhbiBleHByZXNzaW9uIGNhbiBiZSB1c2VkIGFzIGEgYm9vbC12YWx1ZWQgdGVtcGxhdGUKKy8vIGFyZ3VtZW50LgordGVtcGxhdGUgPGJvb2w+IHN0cnVjdCBDaGVja0lzQm9vbCB7IHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gdHJ1ZTsgfTsKKworLy8gSWYgVCBoYXMgU2VxdWVuY2VFbGVtZW50VHJhaXRzLCB0aGVuIHZlY3RvcjxUPiBhbmQgU21hbGxWZWN0b3I8VCwgTj4gaGF2ZQorLy8gU2VxdWVuY2VUcmFpdHMgdGhhdCBkbyB0aGUgb2J2aW91cyB0aGluZy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFNlcXVlbmNlVHJhaXRzPHN0ZDo6dmVjdG9yPFQ+LAorICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPENoZWNrSXNCb29sPAorICAgICAgICAgICAgICAgICAgICAgICAgICBTZXF1ZW5jZUVsZW1lbnRUcmFpdHM8VD46OmZsb3c+Ojp2YWx1ZT46OnR5cGU+CisgICAgOiBTZXF1ZW5jZVRyYWl0c0ltcGw8c3RkOjp2ZWN0b3I8VD4sIFNlcXVlbmNlRWxlbWVudFRyYWl0czxUPjo6Zmxvdz4ge307Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdW5zaWduZWQgTj4KK3N0cnVjdCBTZXF1ZW5jZVRyYWl0czxTbWFsbFZlY3RvcjxULCBOPiwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxDaGVja0lzQm9vbDwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU2VxdWVuY2VFbGVtZW50VHJhaXRzPFQ+OjpmbG93Pjo6dmFsdWU+Ojp0eXBlPgorICAgIDogU2VxdWVuY2VUcmFpdHNJbXBsPFNtYWxsVmVjdG9yPFQsIE4+LCBTZXF1ZW5jZUVsZW1lbnRUcmFpdHM8VD46OmZsb3c+IHt9OworCisvLyBTZXF1ZW5jZXMgb2YgZnVuZGFtZW50YWwgdHlwZXMgdXNlIGZsb3cgZm9ybWF0dGluZy4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IFNlcXVlbmNlRWxlbWVudFRyYWl0czwKKyAgICBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX2Z1bmRhbWVudGFsPFQ+Ojp2YWx1ZT46OnR5cGU+IHsKKyAgc3RhdGljIGNvbnN0IGJvb2wgZmxvdyA9IHRydWU7Cit9OworCisvLyBTZXF1ZW5jZXMgb2Ygc3RyaW5ncyB1c2UgYmxvY2sgZm9ybWF0dGluZy4KK3RlbXBsYXRlPD4gc3RydWN0IFNlcXVlbmNlRWxlbWVudFRyYWl0czxzdGQ6OnN0cmluZz4geworICBzdGF0aWMgY29uc3QgYm9vbCBmbG93ID0gZmFsc2U7Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3QgU2VxdWVuY2VFbGVtZW50VHJhaXRzPFN0cmluZ1JlZj4geworICBzdGF0aWMgY29uc3QgYm9vbCBmbG93ID0gZmFsc2U7Cit9OwordGVtcGxhdGU8PiBzdHJ1Y3QgU2VxdWVuY2VFbGVtZW50VHJhaXRzPHN0ZDo6cGFpcjxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+PiB7CisgIHN0YXRpYyBjb25zdCBib29sIGZsb3cgPSBmYWxzZTsKK307CisKKy8vLyBJbXBsZW1lbnRhdGlvbiBvZiBDdXN0b21NYXBwaW5nVHJhaXRzIGZvciBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVD4uCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gc3RydWN0IFN0ZE1hcFN0cmluZ0N1c3RvbU1hcHBpbmdUcmFpdHNJbXBsIHsKKyAgdXNpbmcgbWFwX3R5cGUgPSBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgVD47CisKKyAgc3RhdGljIHZvaWQgaW5wdXRPbmUoSU8gJmlvLCBTdHJpbmdSZWYga2V5LCBtYXBfdHlwZSAmdikgeworICAgIGlvLm1hcFJlcXVpcmVkKGtleS5zdHIoKS5jX3N0cigpLCB2W2tleV0pOworICB9CisKKyAgc3RhdGljIHZvaWQgb3V0cHV0KElPICZpbywgbWFwX3R5cGUgJnYpIHsKKyAgICBmb3IgKGF1dG8gJnAgOiB2KQorICAgICAgaW8ubWFwUmVxdWlyZWQocC5maXJzdC5jX3N0cigpLCBwLnNlY29uZCk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSB5YW1sCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZGVmaW5lIExMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1JfSU1QTChUWVBFLCBGTE9XKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lc3BhY2UgbGx2bSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIHlhbWwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0YXRpY19hc3NlcnQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIXN0ZDo6aXNfZnVuZGFtZW50YWw8VFlQRT46OnZhbHVlICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICFzdGQ6OmlzX3NhbWU8VFlQRSwgc3RkOjpzdHJpbmc+Ojp2YWx1ZSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAhc3RkOjppc19zYW1lPFRZUEUsIGxsdm06OlN0cmluZ1JlZj46OnZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgIm9ubHkgdXNlIExMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IgZm9yIHR5cGVzIHlvdSBjb250cm9sIik7ICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gc3RydWN0IFNlcXVlbmNlRWxlbWVudFRyYWl0czxUWVBFPiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIGNvbnN0IGJvb2wgZmxvdyA9IEZMT1c7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworLy8vIFV0aWxpdHkgZm9yIGRlY2xhcmluZyB0aGF0IGEgc3RkOjp2ZWN0b3Igb2YgYSBwYXJ0aWN1bGFyIHR5cGUKKy8vLyBzaG91bGQgYmUgY29uc2lkZXJlZCBhIFlBTUwgc2VxdWVuY2UuCisjZGVmaW5lIExMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IodHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SX0lNUEwodHlwZSwgZmFsc2UpCisKKy8vLyBVdGlsaXR5IGZvciBkZWNsYXJpbmcgdGhhdCBhIHN0ZDo6dmVjdG9yIG9mIGEgcGFydGljdWxhciB0eXBlCisvLy8gc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBZQU1MIGZsb3cgc2VxdWVuY2UuCisjZGVmaW5lIExMVk1fWUFNTF9JU19GTE9XX1NFUVVFTkNFX1ZFQ1RPUih0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBMTFZNX1lBTUxfSVNfU0VRVUVOQ0VfVkVDVE9SX0lNUEwodHlwZSwgdHJ1ZSkKKworI2RlZmluZSBMTFZNX1lBTUxfREVDTEFSRV9NQVBQSU5HX1RSQUlUUyhUeXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIGxsdm0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSB5YW1sIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgTWFwcGluZ1RyYWl0czxUeXBlPiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgVHlwZSAmT2JqKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfQorCisjZGVmaW5lIExMVk1fWUFNTF9ERUNMQVJFX0VOVU1fVFJBSVRTKFR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lc3BhY2UgbGx2bSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIHlhbWwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czxUeXBlPiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyB2b2lkIGVudW1lcmF0aW9uKElPICZpbywgVHlwZSAmVmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKyNkZWZpbmUgTExWTV9ZQU1MX0RFQ0xBUkVfQklUU0VUX1RSQUlUUyhUeXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSBsbHZtIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lc3BhY2UgeWFtbCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gc3RydWN0IFNjYWxhckJpdFNldFRyYWl0czxUeXBlPiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIHZvaWQgYml0c2V0KElPICZJTywgVHlwZSAmT3B0aW9ucyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2RlZmluZSBMTFZNX1lBTUxfREVDTEFSRV9TQ0FMQVJfVFJBSVRTKFR5cGUsIE11c3RRdW90ZSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIGxsdm0geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSB5YW1sIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyVHJhaXRzPFR5cGU+IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBzdGF0aWMgdm9pZCBvdXRwdXQoY29uc3QgVHlwZSAmVmFsdWUsIHZvaWQgKmN0eCwgcmF3X29zdHJlYW0gJk91dCk7ICAgICAgICBcCisgICAgc3RhdGljIFN0cmluZ1JlZiBpbnB1dChTdHJpbmdSZWYgU2NhbGFyLCB2b2lkICpjdHh0LCBUeXBlICZWYWx1ZSk7ICAgICAgICAgXAorICAgIHN0YXRpYyBRdW90aW5nVHlwZSBtdXN0UXVvdGUoU3RyaW5nUmVmKSB7IHJldHVybiBNdXN0UXVvdGU7IH0gICAgICAgICAgICAgIFwKKyAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8vLyBVdGlsaXR5IGZvciBkZWNsYXJpbmcgdGhhdCBhIHN0ZDo6dmVjdG9yIG9mIGEgcGFydGljdWxhciB0eXBlCisvLy8gc2hvdWxkIGJlIGNvbnNpZGVyZWQgYSBZQU1MIGRvY3VtZW50IGxpc3QuCisjZGVmaW5lIExMVk1fWUFNTF9JU19ET0NVTUVOVF9MSVNUX1ZFQ1RPUihfdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lc3BhY2UgbGx2bSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgbmFtZXNwYWNlIHlhbWwgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx1bnNpZ25lZCBOPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdHJ1Y3QgRG9jdW1lbnRMaXN0VHJhaXRzPFNtYWxsVmVjdG9yPF90eXBlLCBOPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogcHVibGljIFNlcXVlbmNlVHJhaXRzSW1wbDxTbWFsbFZlY3RvcjxfdHlwZSwgTj4sIGZhbHNlPiB7fTsgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBzdHJ1Y3QgRG9jdW1lbnRMaXN0VHJhaXRzPHN0ZDo6dmVjdG9yPF90eXBlPj4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIDogcHVibGljIFNlcXVlbmNlVHJhaXRzSW1wbDxzdGQ6OnZlY3RvcjxfdHlwZT4sIGZhbHNlPiB7fTsgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9CisKKy8vLyBVdGlsaXR5IGZvciBkZWNsYXJpbmcgdGhhdCBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgX3R5cGU+IHNob3VsZCBiZSBjb25zaWRlcmVkCisvLy8gYSBZQU1MIG1hcC4KKyNkZWZpbmUgTExWTV9ZQU1MX0lTX1NUUklOR19NQVAoX3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSBsbHZtIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBuYW1lc3BhY2UgeWFtbCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHN0cnVjdCBDdXN0b21NYXBwaW5nVHJhaXRzPHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBfdHlwZT4+ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgOiBwdWJsaWMgU3RkTWFwU3RyaW5nQ3VzdG9tTWFwcGluZ1RyYWl0c0ltcGw8X3R5cGU+IHt9OyAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0KKworI2VuZGlmIC8vIExMVk1fU1VQUE9SVF9ZQU1MVFJBSVRTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9jaXJjdWxhcl9yYXdfb3N0cmVhbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L2NpcmN1bGFyX3Jhd19vc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQ2ZmQ3ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9jaXJjdWxhcl9yYXdfb3N0cmVhbS5oCkBAIC0wLDAgKzEsMTU2IEBACisvLz09PS0tIGxsdm0vU3VwcG9ydC9jaXJjdWxhcl9yYXdfb3N0cmVhbS5oIC0gQnVmZmVyZWQgc3RyZWFtcyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyByYXdfb3N0cmVhbSBpbXBsZW1lbnRhdGlvbnMgZm9yIHN0cmVhbXMgdG8gZG8gY2lyY3VsYXIKKy8vIGJ1ZmZlcmluZyBvZiB0aGVpciBvdXRwdXQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfQ0lSQ1VMQVJfUkFXX09TVFJFQU1fSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfQ0lSQ1VMQVJfUkFXX09TVFJFQU1fSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKyAgLy8vIGNpcmN1bGFyX3Jhd19vc3RyZWFtIC0gQSByYXdfb3N0cmVhbSB3aGljaCAqY2FuKiBzYXZlIGl0cyBkYXRhCisgIC8vLyB0byBhIGNpcmN1bGFyIGJ1ZmZlciwgb3IgY2FuIHBhc3MgaXQgdGhyb3VnaCBkaXJlY3RseSB0byBhbgorICAvLy8gdW5kZXJseWluZyBzdHJlYW0gaWYgc3BlY2lmaWVkIHdpdGggYSBidWZmZXIgb2YgemVyby4KKyAgLy8vCisgIGNsYXNzIGNpcmN1bGFyX3Jhd19vc3RyZWFtIDogcHVibGljIHJhd19vc3RyZWFtIHsKKyAgcHVibGljOgorICAgIC8vLyBUQUtFX09XTkVSU0hJUCAtIFRlbGwgdGhpcyBzdHJlYW0gdGhhdCBpdCBvd25zIHRoZSB1bmRlcmx5aW5nCisgICAgLy8vIHN0cmVhbSBhbmQgaXMgcmVzcG9uc2libGUgZm9yIGNsZWFudXAsIG1lbW9yeSBtYW5hZ2VtZW50CisgICAgLy8vIGlzc3VlcywgZXRjLgorICAgIC8vLworICAgIHN0YXRpYyBjb25zdCBib29sIFRBS0VfT1dORVJTSElQID0gdHJ1ZTsKKworICAgIC8vLyBSRUZFUkVOQ0VfT05MWSAtIFRlbGwgdGhpcyBzdHJlYW0gaXQgc2hvdWxkIG5vdCBtYW5hZ2UgdGhlCisgICAgLy8vIGhlbGQgc3RyZWFtLgorICAgIC8vLworICAgIHN0YXRpYyBjb25zdCBib29sIFJFRkVSRU5DRV9PTkxZID0gZmFsc2U7CisKKyAgcHJpdmF0ZToKKyAgICAvLy8gVGhlU3RyZWFtIC0gVGhlIHJlYWwgc3RyZWFtIHdlIG91dHB1dCB0by4gV2Ugc2V0IGl0IHRvIGJlCisgICAgLy8vIHVuYnVmZmVyZWQsIHNpbmNlIHdlJ3JlIGFscmVhZHkgZG9pbmcgb3VyIG93biBidWZmZXJpbmcuCisgICAgLy8vCisgICAgcmF3X29zdHJlYW0gKlRoZVN0cmVhbTsKKworICAgIC8vLyBPd25zU3RyZWFtIC0gQXJlIHdlIHJlc3BvbnNpYmxlIGZvciBtYW5hZ2luZyB0aGUgdW5kZXJseWluZworICAgIC8vLyBzdHJlYW0/CisgICAgLy8vCisgICAgYm9vbCBPd25zU3RyZWFtOworCisgICAgLy8vIEJ1ZmZlclNpemUgLSBUaGUgc2l6ZSBvZiB0aGUgYnVmZmVyIGluIGJ5dGVzLgorICAgIC8vLworICAgIHNpemVfdCBCdWZmZXJTaXplOworCisgICAgLy8vIEJ1ZmZlckFycmF5IC0gVGhlIGFjdHVhbCBidWZmZXIgc3RvcmFnZS4KKyAgICAvLy8KKyAgICBjaGFyICpCdWZmZXJBcnJheTsKKworICAgIC8vLyBDdXIgLSBQb2ludGVyIHRvIHRoZSBjdXJyZW50IG91dHB1dCBwb2ludCBpbiBCdWZmZXJBcnJheS4KKyAgICAvLy8KKyAgICBjaGFyICpDdXI7CisKKyAgICAvLy8gRmlsbGVkIC0gSW5kaWNhdGUgd2hldGhlciB0aGUgYnVmZmVyIGhhcyBiZWVuIGNvbXBsZXRlbHkKKyAgICAvLy8gZmlsbGVkLiAgVGhpcyBoZWxwcyBhdm9pZCBnYXJiYWdlIG91dHB1dC4KKyAgICAvLy8KKyAgICBib29sIEZpbGxlZDsKKworICAgIC8vLyBCYW5uZXIgLSBBIHBvaW50ZXIgdG8gYSBiYW5uZXIgdG8gcHJpbnQgYmVmb3JlIGR1bXBpbmcgdGhlCisgICAgLy8vIGxvZy4KKyAgICAvLy8KKyAgICBjb25zdCBjaGFyICpCYW5uZXI7CisKKyAgICAvLy8gZmx1c2hCdWZmZXIgLSBEdW1wIHRoZSBjb250ZW50cyBvZiB0aGUgYnVmZmVyIHRvIFN0cmVhbS4KKyAgICAvLy8KKyAgICB2b2lkIGZsdXNoQnVmZmVyKCkgeworICAgICAgaWYgKEZpbGxlZCkKKyAgICAgICAgLy8gV3JpdGUgdGhlIG9sZGVyIHBvcnRpb24gb2YgdGhlIGJ1ZmZlci4KKyAgICAgICAgVGhlU3RyZWFtLT53cml0ZShDdXIsIEJ1ZmZlckFycmF5ICsgQnVmZmVyU2l6ZSAtIEN1cik7CisgICAgICAvLyBXcml0ZSB0aGUgbmV3ZXIgcG9ydGlvbiBvZiB0aGUgYnVmZmVyLgorICAgICAgVGhlU3RyZWFtLT53cml0ZShCdWZmZXJBcnJheSwgQ3VyIC0gQnVmZmVyQXJyYXkpOworICAgICAgQ3VyID0gQnVmZmVyQXJyYXk7CisgICAgICBGaWxsZWQgPSBmYWxzZTsKKyAgICB9CisKKyAgICB2b2lkIHdyaXRlX2ltcGwoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSkgb3ZlcnJpZGU7CisKKyAgICAvLy8gY3VycmVudF9wb3MgLSBSZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBzdHJlYW0sCisgICAgLy8vIG5vdCBjb3VudGluZyB0aGUgYnl0ZXMgY3VycmVudGx5IGluIHRoZSBidWZmZXIuCisgICAgLy8vCisgICAgdWludDY0X3QgY3VycmVudF9wb3MoKSBjb25zdCBvdmVycmlkZSB7CisgICAgICAvLyBUaGlzIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgY2FsbGluZyBUaGVTdHJlYW0uY3VycmVudF9wb3MoKSwKKyAgICAgIC8vIGJ1dCB0aGF0IGludGVyZmFjZSBpcyBwcml2YXRlLgorICAgICAgcmV0dXJuIFRoZVN0cmVhbS0+dGVsbCgpIC0gVGhlU3RyZWFtLT5HZXROdW1CeXRlc0luQnVmZmVyKCk7CisgICAgfQorCisgIHB1YmxpYzoKKyAgICAvLy8gY2lyY3VsYXJfcmF3X29zdHJlYW0gLSBDb25zdHJ1Y3QgYW4gb3B0aW9uYWxseQorICAgIC8vLyBjaXJjdWxhci1idWZmZXJlZCBzdHJlYW0sIGhhbmRpbmcgaXQgYW4gdW5kZXJseWluZyBzdHJlYW0gdG8KKyAgICAvLy8gZG8gdGhlICJyZWFsIiBvdXRwdXQuCisgICAgLy8vCisgICAgLy8vIEFzIGEgc2lkZSBlZmZlY3QsIGlmIEJ1ZmZTaXplIGlzIG5vbnplcm8sIHRoZSBnaXZlbiBTdHJlYW0gaXMKKyAgICAvLy8gc2V0IHRvIGJlIFVuYnVmZmVyZWQuICBUaGlzIGlzIGJlY2F1c2UgY2lyY3VsYXJfcmF3X29zdHJlYW0KKyAgICAvLy8gZG9lcyBpdHMgb3duIGJ1ZmZlcmluZywgc28gaXQgZG9lc24ndCB3YW50IGFub3RoZXIgbGF5ZXIgb2YKKyAgICAvLy8gYnVmZmVyaW5nIHRvIGJlIGhhcHBlbmluZyB1bmRlcm5lYXRoIGl0LgorICAgIC8vLworICAgIC8vLyAiT3ducyIgdGVsbHMgdGhlIGNpcmN1bGFyX3Jhd19vc3RyZWFtIHdoZXRoZXIgaXQgaXMKKyAgICAvLy8gcmVzcG9uc2libGUgZm9yIG1hbmFnaW5nIHRoZSBoZWxkIHN0cmVhbSwgZG9pbmcgbWVtb3J5CisgICAgLy8vIG1hbmFnZW1lbnQgb2YgaXQsIGV0Yy4KKyAgICAvLy8KKyAgICBjaXJjdWxhcl9yYXdfb3N0cmVhbShyYXdfb3N0cmVhbSAmU3RyZWFtLCBjb25zdCBjaGFyICpIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IEJ1ZmZTaXplID0gMCwgYm9vbCBPd25zID0gUkVGRVJFTkNFX09OTFkpCisgICAgICAgIDogcmF3X29zdHJlYW0oLyp1bmJ1ZmZlcmVkKi8gdHJ1ZSksIFRoZVN0cmVhbShudWxscHRyKSwKKyAgICAgICAgICBPd25zU3RyZWFtKE93bnMpLCBCdWZmZXJTaXplKEJ1ZmZTaXplKSwgQnVmZmVyQXJyYXkobnVsbHB0ciksCisgICAgICAgICAgRmlsbGVkKGZhbHNlKSwgQmFubmVyKEhlYWRlcikgeworICAgICAgaWYgKEJ1ZmZlclNpemUgIT0gMCkKKyAgICAgICAgQnVmZmVyQXJyYXkgPSBuZXcgY2hhcltCdWZmZXJTaXplXTsKKyAgICAgIEN1ciA9IEJ1ZmZlckFycmF5OworICAgICAgc2V0U3RyZWFtKFN0cmVhbSwgT3ducyk7CisgICAgfQorCisgICAgfmNpcmN1bGFyX3Jhd19vc3RyZWFtKCkgb3ZlcnJpZGUgeworICAgICAgZmx1c2goKTsKKyAgICAgIGZsdXNoQnVmZmVyV2l0aEJhbm5lcigpOworICAgICAgcmVsZWFzZVN0cmVhbSgpOworICAgICAgZGVsZXRlW10gQnVmZmVyQXJyYXk7CisgICAgfQorCisgICAgLy8vIHNldFN0cmVhbSAtIFRlbGwgdGhlIGNpcmN1bGFyX3Jhd19vc3RyZWFtIHRvIG91dHB1dCBhCisgICAgLy8vIGRpZmZlcmVudCBzdHJlYW0uICAiT3ducyIgdGVsbHMgY2lyY3VsYXJfcmF3X29zdHJlYW0gd2hldGhlcgorICAgIC8vLyBpdCBzaG91bGQgdGFrZSByZXNwb25zaWJpbGl0eSBmb3IgbWFuYWdpbmcgdGhlIHVuZGVybHlpbmcKKyAgICAvLy8gc3RyZWFtLgorICAgIC8vLworICAgIHZvaWQgc2V0U3RyZWFtKHJhd19vc3RyZWFtICZTdHJlYW0sIGJvb2wgT3ducyA9IFJFRkVSRU5DRV9PTkxZKSB7CisgICAgICByZWxlYXNlU3RyZWFtKCk7CisgICAgICBUaGVTdHJlYW0gPSAmU3RyZWFtOworICAgICAgT3duc1N0cmVhbSA9IE93bnM7CisgICAgfQorCisgICAgLy8vIGZsdXNoQnVmZmVyV2l0aEJhbm5lciAtIEZvcmNlIG91dHB1dCBvZiB0aGUgYnVmZmVyIGFsb25nIHdpdGgKKyAgICAvLy8gYSBzbWFsbCBoZWFkZXIuCisgICAgLy8vCisgICAgdm9pZCBmbHVzaEJ1ZmZlcldpdGhCYW5uZXIoKTsKKworICBwcml2YXRlOgorICAgIC8vLyByZWxlYXNlU3RyZWFtIC0gRGVsZXRlIHRoZSBoZWxkIHN0cmVhbSBpZiBuZWVkZWQuIE90aGVyd2lzZSwKKyAgICAvLy8gdHJhbnNmZXIgdGhlIGJ1ZmZlciBzZXR0aW5ncyBmcm9tIHRoaXMgY2lyY3VsYXJfcmF3X29zdHJlYW0KKyAgICAvLy8gYmFjayB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0uCisgICAgLy8vCisgICAgdm9pZCByZWxlYXNlU3RyZWFtKCkgeworICAgICAgaWYgKCFUaGVTdHJlYW0pCisgICAgICAgIHJldHVybjsKKyAgICAgIGlmIChPd25zU3RyZWFtKQorICAgICAgICBkZWxldGUgVGhlU3RyZWFtOworICAgIH0KKyAgfTsKK30gLy8gZW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3Jhd19vc19vc3RyZWFtLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvcmF3X29zX29zdHJlYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTgzYWViCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3Jhd19vc19vc3RyZWFtLmgKQEAgLTAsMCArMSw0MiBAQAorLy89PT0tIHJhd19vc19vc3RyZWFtLmggLSBzdGQ6Om9zdHJlYW0gYWRhcHRvciBmb3IgcmF3X29zdHJlYW0gLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgVGhpcyBmaWxlIGRlZmluZXMgdGhlIHJhd19vc19vc3RyZWFtIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1JBV19PU19PU1RSRUFNX0gKKyNkZWZpbmUgTExWTV9TVVBQT1JUX1JBV19PU19PU1RSRUFNX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIgorI2luY2x1ZGUgPGlvc2Z3ZD4KKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gcmF3X29zX29zdHJlYW0gLSBBIHJhd19vc3RyZWFtIHRoYXQgd3JpdGVzIHRvIGFuIHN0ZDo6b3N0cmVhbS4gIFRoaXMgaXMgYQorLy8vIHNpbXBsZSBhZGFwdG9yIGNsYXNzLiAgSXQgZG9lcyBub3QgY2hlY2sgZm9yIG91dHB1dCBlcnJvcnM7IGNsaWVudHMgc2hvdWxkCisvLy8gdXNlIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSB0byBkZXRlY3QgZXJyb3JzLgorY2xhc3MgcmF3X29zX29zdHJlYW0gOiBwdWJsaWMgcmF3X29zdHJlYW0geworICBzdGQ6Om9zdHJlYW0gJk9TOworCisgIC8vLyB3cml0ZV9pbXBsIC0gU2VlIHJhd19vc3RyZWFtOjp3cml0ZV9pbXBsLgorICB2b2lkIHdyaXRlX2ltcGwoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSkgb3ZlcnJpZGU7CisKKyAgLy8vIGN1cnJlbnRfcG9zIC0gUmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgc3RyZWFtLCBub3QKKyAgLy8vIGNvdW50aW5nIHRoZSBieXRlcyBjdXJyZW50bHkgaW4gdGhlIGJ1ZmZlci4KKyAgdWludDY0X3QgY3VycmVudF9wb3MoKSBjb25zdCBvdmVycmlkZTsKKworcHVibGljOgorICByYXdfb3Nfb3N0cmVhbShzdGQ6Om9zdHJlYW0gJk8pIDogT1MoTykge30KKyAgfnJhd19vc19vc3RyZWFtKCkgb3ZlcnJpZGU7Cit9OworCit9IC8vIGVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDExZjVhOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9yYXdfb3N0cmVhbS5oCkBAIC0wLDAgKzEsNTQzIEBACisvLz09PS0tLSByYXdfb3N0cmVhbS5oIC0gUmF3IG91dHB1dCBzdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgcmF3X29zdHJlYW0gY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1NVUFBPUlRfUkFXX09TVFJFQU1fSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfUkFXX09TVFJFQU1fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlIDxjYXNzZXJ0PgorI2luY2x1ZGUgPGNzdGRkZWY+CisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxjc3RyaW5nPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzeXN0ZW1fZXJyb3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgZm9ybWF0dl9vYmplY3RfYmFzZTsKK2NsYXNzIGZvcm1hdF9vYmplY3RfYmFzZTsKK2NsYXNzIEZvcm1hdHRlZFN0cmluZzsKK2NsYXNzIEZvcm1hdHRlZE51bWJlcjsKK2NsYXNzIEZvcm1hdHRlZEJ5dGVzOworCituYW1lc3BhY2Ugc3lzIHsKK25hbWVzcGFjZSBmcyB7CitlbnVtIE9wZW5GbGFncyA6IHVuc2lnbmVkOworfSAvLyBlbmQgbmFtZXNwYWNlIGZzCit9IC8vIGVuZCBuYW1lc3BhY2Ugc3lzCisKKy8vLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgYW4gZXh0cmVtZWx5IGZhc3QgYnVsayBvdXRwdXQgc3RyZWFtIHRoYXQgY2FuICpvbmx5KgorLy8vIG91dHB1dCB0byBhIHN0cmVhbS4gIEl0IGRvZXMgbm90IHN1cHBvcnQgc2Vla2luZywgcmVvcGVuaW5nLCByZXdpbmRpbmcsIGxpbmUKKy8vLyBidWZmZXJlZCBkaXNjaXBsaW5lcyBldGMuIEl0IGlzIGEgc2ltcGxlIGJ1ZmZlciB0aGF0IG91dHB1dHMKKy8vLyBhIGNodW5rIGF0IGEgdGltZS4KK2NsYXNzIHJhd19vc3RyZWFtIHsKK3ByaXZhdGU6CisgIC8vLyBUaGUgYnVmZmVyIGlzIGhhbmRsZWQgaW4gc3VjaCBhIHdheSB0aGF0IHRoZSBidWZmZXIgaXMKKyAgLy8vIHVuaW5pdGlhbGl6ZWQsIHVuYnVmZmVyZWQsIG9yIG91dCBvZiBzcGFjZSB3aGVuIE91dEJ1ZkN1ciA+PQorICAvLy8gT3V0QnVmRW5kLiBUaHVzIGEgc2luZ2xlIGNvbXBhcmlzb24gc3VmZmljZXMgdG8gZGV0ZXJtaW5lIGlmIHdlCisgIC8vLyBuZWVkIHRvIHRha2UgdGhlIHNsb3cgcGF0aCB0byB3cml0ZSBhIHNpbmdsZSBjaGFyYWN0ZXIuCisgIC8vLworICAvLy8gVGhlIGJ1ZmZlciBpcyBpbiBvbmUgb2YgdGhyZWUgc3RhdGVzOgorICAvLy8gIDEuIFVuYnVmZmVyZWQgKEJ1ZmZlck1vZGUgPT0gVW5idWZmZXJlZCkKKyAgLy8vICAxLiBVbmluaXRpYWxpemVkIChCdWZmZXJNb2RlICE9IFVuYnVmZmVyZWQgJiYgT3V0QnVmU3RhcnQgPT0gMCkuCisgIC8vLyAgMi4gQnVmZmVyZWQgKEJ1ZmZlck1vZGUgIT0gVW5idWZmZXJlZCAmJiBPdXRCdWZTdGFydCAhPSAwICYmCisgIC8vLyAgICAgICAgICAgICAgIE91dEJ1ZkVuZCAtIE91dEJ1ZlN0YXJ0ID49IDEpLgorICAvLy8KKyAgLy8vIElmIGJ1ZmZlcmVkLCB0aGVuIHRoZSByYXdfb3N0cmVhbSBvd25zIHRoZSBidWZmZXIgaWYgKEJ1ZmZlck1vZGUgPT0KKyAgLy8vIEludGVybmFsQnVmZmVyKTsgb3RoZXJ3aXNlIHRoZSBidWZmZXIgaGFzIGJlZW4gc2V0IHZpYSBTZXRCdWZmZXIgYW5kIGlzCisgIC8vLyBtYW5hZ2VkIGJ5IHRoZSBzdWJjbGFzcy4KKyAgLy8vCisgIC8vLyBJZiBhIHN1YmNsYXNzIGluc3RhbGxzIGFuIGV4dGVybmFsIGJ1ZmZlciB1c2luZyBTZXRCdWZmZXIgdGhlbiBpdCBjYW4gd2FpdAorICAvLy8gZm9yIGEgXHNlZSB3cml0ZV9pbXBsKCkgY2FsbCB0byBoYW5kbGUgdGhlIGRhdGEgd2hpY2ggaGFzIGJlZW4gcHV0IGludG8KKyAgLy8vIHRoaXMgYnVmZmVyLgorICBjaGFyICpPdXRCdWZTdGFydCwgKk91dEJ1ZkVuZCwgKk91dEJ1ZkN1cjsKKworICBlbnVtIEJ1ZmZlcktpbmQgeworICAgIFVuYnVmZmVyZWQgPSAwLAorICAgIEludGVybmFsQnVmZmVyLAorICAgIEV4dGVybmFsQnVmZmVyCisgIH0gQnVmZmVyTW9kZTsKKworcHVibGljOgorICAvLyBjb2xvciBvcmRlciBtYXRjaGVzIEFOU0kgZXNjYXBlIHNlcXVlbmNlLCBkb24ndCBjaGFuZ2UKKyAgZW51bSBDb2xvcnMgeworICAgIEJMQUNLID0gMCwKKyAgICBSRUQsCisgICAgR1JFRU4sCisgICAgWUVMTE9XLAorICAgIEJMVUUsCisgICAgTUFHRU5UQSwKKyAgICBDWUFOLAorICAgIFdISVRFLAorICAgIFNBVkVEQ09MT1IKKyAgfTsKKworICBleHBsaWNpdCByYXdfb3N0cmVhbShib29sIHVuYnVmZmVyZWQgPSBmYWxzZSkKKyAgICAgIDogQnVmZmVyTW9kZSh1bmJ1ZmZlcmVkID8gVW5idWZmZXJlZCA6IEludGVybmFsQnVmZmVyKSB7CisgICAgLy8gU3RhcnQgb3V0IHJlYWR5IHRvIGZsdXNoLgorICAgIE91dEJ1ZlN0YXJ0ID0gT3V0QnVmRW5kID0gT3V0QnVmQ3VyID0gbnVsbHB0cjsKKyAgfQorCisgIHJhd19vc3RyZWFtKGNvbnN0IHJhd19vc3RyZWFtICYpID0gZGVsZXRlOworICB2b2lkIG9wZXJhdG9yPShjb25zdCByYXdfb3N0cmVhbSAmKSA9IGRlbGV0ZTsKKworICB2aXJ0dWFsIH5yYXdfb3N0cmVhbSgpOworCisgIC8vLyB0ZWxsIC0gUmV0dXJuIHRoZSBjdXJyZW50IG9mZnNldCB3aXRoIHRoZSBmaWxlLgorICB1aW50NjRfdCB0ZWxsKCkgY29uc3QgeyByZXR1cm4gY3VycmVudF9wb3MoKSArIEdldE51bUJ5dGVzSW5CdWZmZXIoKTsgfQorCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBDb25maWd1cmF0aW9uIEludGVyZmFjZQorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICAvLy8gU2V0IHRoZSBzdHJlYW0gdG8gYmUgYnVmZmVyZWQsIHdpdGggYW4gYXV0b21hdGljYWxseSBkZXRlcm1pbmVkIGJ1ZmZlcgorICAvLy8gc2l6ZS4KKyAgdm9pZCBTZXRCdWZmZXJlZCgpOworCisgIC8vLyBTZXQgdGhlIHN0cmVhbSB0byBiZSBidWZmZXJlZCwgdXNpbmcgdGhlIHNwZWNpZmllZCBidWZmZXIgc2l6ZS4KKyAgdm9pZCBTZXRCdWZmZXJTaXplKHNpemVfdCBTaXplKSB7CisgICAgZmx1c2goKTsKKyAgICBTZXRCdWZmZXJBbmRNb2RlKG5ldyBjaGFyW1NpemVdLCBTaXplLCBJbnRlcm5hbEJ1ZmZlcik7CisgIH0KKworICBzaXplX3QgR2V0QnVmZmVyU2l6ZSgpIGNvbnN0IHsKKyAgICAvLyBJZiB3ZSdyZSBzdXBwb3NlZCB0byBiZSBidWZmZXJlZCBidXQgaGF2ZW4ndCBhY3R1YWxseSBnb3R0ZW4gYXJvdW5kCisgICAgLy8gdG8gYWxsb2NhdGluZyB0aGUgYnVmZmVyIHlldCwgcmV0dXJuIHRoZSB2YWx1ZSB0aGF0IHdvdWxkIGJlIHVzZWQuCisgICAgaWYgKEJ1ZmZlck1vZGUgIT0gVW5idWZmZXJlZCAmJiBPdXRCdWZTdGFydCA9PSBudWxscHRyKQorICAgICAgcmV0dXJuIHByZWZlcnJlZF9idWZmZXJfc2l6ZSgpOworCisgICAgLy8gT3RoZXJ3aXNlIGp1c3QgcmV0dXJuIHRoZSBzaXplIG9mIHRoZSBhbGxvY2F0ZWQgYnVmZmVyLgorICAgIHJldHVybiBPdXRCdWZFbmQgLSBPdXRCdWZTdGFydDsKKyAgfQorCisgIC8vLyBTZXQgdGhlIHN0cmVhbSB0byBiZSB1bmJ1ZmZlcmVkLiBXaGVuIHVuYnVmZmVyZWQsIHRoZSBzdHJlYW0gd2lsbCBmbHVzaAorICAvLy8gYWZ0ZXIgZXZlcnkgd3JpdGUuIFRoaXMgcm91dGluZSB3aWxsIGFsc28gZmx1c2ggdGhlIGJ1ZmZlciBpbW1lZGlhdGVseQorICAvLy8gd2hlbiB0aGUgc3RyZWFtIGlzIGJlaW5nIHNldCB0byB1bmJ1ZmZlcmVkLgorICB2b2lkIFNldFVuYnVmZmVyZWQoKSB7CisgICAgZmx1c2goKTsKKyAgICBTZXRCdWZmZXJBbmRNb2RlKG51bGxwdHIsIDAsIFVuYnVmZmVyZWQpOworICB9CisKKyAgc2l6ZV90IEdldE51bUJ5dGVzSW5CdWZmZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIE91dEJ1ZkN1ciAtIE91dEJ1ZlN0YXJ0OworICB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIERhdGEgT3V0cHV0IEludGVyZmFjZQorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworICB2b2lkIGZsdXNoKCkgeworICAgIGlmIChPdXRCdWZDdXIgIT0gT3V0QnVmU3RhcnQpCisgICAgICBmbHVzaF9ub25lbXB0eSgpOworICB9CisKKyAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwoY2hhciBDKSB7CisgICAgaWYgKE91dEJ1ZkN1ciA+PSBPdXRCdWZFbmQpCisgICAgICByZXR1cm4gd3JpdGUoQyk7CisgICAgKk91dEJ1ZkN1cisrID0gQzsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PCh1bnNpZ25lZCBjaGFyIEMpIHsKKyAgICBpZiAoT3V0QnVmQ3VyID49IE91dEJ1ZkVuZCkKKyAgICAgIHJldHVybiB3cml0ZShDKTsKKyAgICAqT3V0QnVmQ3VyKysgPSBDOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHNpZ25lZCBjaGFyIEMpIHsKKyAgICBpZiAoT3V0QnVmQ3VyID49IE91dEJ1ZkVuZCkKKyAgICAgIHJldHVybiB3cml0ZShDKTsKKyAgICAqT3V0QnVmQ3VyKysgPSBDOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KFN0cmluZ1JlZiBTdHIpIHsKKyAgICAvLyBJbmxpbmUgZmFzdCBwYXRoLCBwYXJ0aWN1bGFybHkgZm9yIHN0cmluZ3Mgd2l0aCBhIGtub3duIGxlbmd0aC4KKyAgICBzaXplX3QgU2l6ZSA9IFN0ci5zaXplKCk7CisKKyAgICAvLyBNYWtlIHN1cmUgd2UgY2FuIHVzZSB0aGUgZmFzdCBwYXRoLgorICAgIGlmIChTaXplID4gKHNpemVfdCkoT3V0QnVmRW5kIC0gT3V0QnVmQ3VyKSkKKyAgICAgIHJldHVybiB3cml0ZShTdHIuZGF0YSgpLCBTaXplKTsKKworICAgIGlmIChTaXplKSB7CisgICAgICBtZW1jcHkoT3V0QnVmQ3VyLCBTdHIuZGF0YSgpLCBTaXplKTsKKyAgICAgIE91dEJ1ZkN1ciArPSBTaXplOworICAgIH0KKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChjb25zdCBjaGFyICpTdHIpIHsKKyAgICAvLyBJbmxpbmUgZmFzdCBwYXRoLCBwYXJ0aWN1bGFybHkgZm9yIGNvbnN0YW50IHN0cmluZ3Mgd2hlcmUgYSBzdWZmaWNpZW50bHkKKyAgICAvLyBzbWFydCBjb21waWxlciB3aWxsIHNpbXBsaWZ5IHN0cmxlbi4KKworICAgIHJldHVybiB0aGlzLT5vcGVyYXRvcjw8KFN0cmluZ1JlZihTdHIpKTsKKyAgfQorCisgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KGNvbnN0IHN0ZDo6c3RyaW5nICZTdHIpIHsKKyAgICAvLyBBdm9pZCB0aGUgZmFzdCBwYXRoLCBpdCB3b3VsZCBvbmx5IGluY3JlYXNlIGNvZGUgc2l6ZSBmb3IgYSBtYXJnaW5hbCB3aW4uCisgICAgcmV0dXJuIHdyaXRlKFN0ci5kYXRhKCksIFN0ci5sZW5ndGgoKSk7CisgIH0KKworICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChjb25zdCBTbWFsbFZlY3RvckltcGw8Y2hhcj4gJlN0cikgeworICAgIHJldHVybiB3cml0ZShTdHIuZGF0YSgpLCBTdHIuc2l6ZSgpKTsKKyAgfQorCisgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHVuc2lnbmVkIGxvbmcgTik7CisgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KGxvbmcgTik7CisgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHVuc2lnbmVkIGxvbmcgbG9uZyBOKTsKKyAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwobG9uZyBsb25nIE4pOworICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChjb25zdCB2b2lkICpQKTsKKworICByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PCh1bnNpZ25lZCBpbnQgTikgeworICAgIHJldHVybiB0aGlzLT5vcGVyYXRvcjw8KHN0YXRpY19jYXN0PHVuc2lnbmVkIGxvbmc+KE4pKTsKKyAgfQorCisgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KGludCBOKSB7CisgICAgcmV0dXJuIHRoaXMtPm9wZXJhdG9yPDwoc3RhdGljX2Nhc3Q8bG9uZz4oTikpOworICB9CisKKyAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwoZG91YmxlIE4pOworCisgIC8vLyBPdXRwdXQgXHAgTiBpbiBoZXhhZGVjaW1hbCwgd2l0aG91dCBhbnkgcHJlZml4IG9yIHBhZGRpbmcuCisgIHJhd19vc3RyZWFtICZ3cml0ZV9oZXgodW5zaWduZWQgbG9uZyBsb25nIE4pOworCisgIC8vLyBPdXRwdXQgYSBmb3JtYXR0ZWQgVVVJRCB3aXRoIGRhc2ggc2VwYXJhdG9ycy4KKyAgdXNpbmcgdXVpZF90ID0gdWludDhfdFsxNl07CisgIHJhd19vc3RyZWFtICZ3cml0ZV91dWlkKGNvbnN0IHV1aWRfdCBVVUlEKTsKKworICAvLy8gT3V0cHV0IFxwIFN0ciwgdHVybmluZyAnXFwnLCAnXHQnLCAnXG4nLCAnIicsIGFuZCBhbnl0aGluZyB0aGF0IGRvZXNuJ3QKKyAgLy8vIHNhdGlzZnkgc3RkOjppc3ByaW50IGludG8gYW4gZXNjYXBlIHNlcXVlbmNlLgorICByYXdfb3N0cmVhbSAmd3JpdGVfZXNjYXBlZChTdHJpbmdSZWYgU3RyLCBib29sIFVzZUhleEVzY2FwZXMgPSBmYWxzZSk7CisKKyAgcmF3X29zdHJlYW0gJndyaXRlKHVuc2lnbmVkIGNoYXIgQyk7CisgIHJhd19vc3RyZWFtICZ3cml0ZShjb25zdCBjaGFyICpQdHIsIHNpemVfdCBTaXplKTsKKworICAvLyBGb3JtYXR0ZWQgb3V0cHV0LCBzZWUgdGhlIGZvcm1hdCgpIGZ1bmN0aW9uIGluIFN1cHBvcnQvRm9ybWF0LmguCisgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KGNvbnN0IGZvcm1hdF9vYmplY3RfYmFzZSAmRm10KTsKKworICAvLyBGb3JtYXR0ZWQgb3V0cHV0LCBzZWUgdGhlIGxlZnRKdXN0aWZ5KCkgZnVuY3Rpb24gaW4gU3VwcG9ydC9Gb3JtYXQuaC4KKyAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwoY29uc3QgRm9ybWF0dGVkU3RyaW5nICYpOworCisgIC8vIEZvcm1hdHRlZCBvdXRwdXQsIHNlZSB0aGUgZm9ybWF0SGV4KCkgZnVuY3Rpb24gaW4gU3VwcG9ydC9Gb3JtYXQuaC4KKyAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwoY29uc3QgRm9ybWF0dGVkTnVtYmVyICYpOworCisgIC8vIEZvcm1hdHRlZCBvdXRwdXQsIHNlZSB0aGUgZm9ybWF0digpIGZ1bmN0aW9uIGluIFN1cHBvcnQvRm9ybWF0VmFyaWFkaWMuaC4KKyAgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwoY29uc3QgZm9ybWF0dl9vYmplY3RfYmFzZSAmKTsKKworICAvLyBGb3JtYXR0ZWQgb3V0cHV0LCBzZWUgdGhlIGZvcm1hdF9ieXRlcygpIGZ1bmN0aW9uIGluIFN1cHBvcnQvRm9ybWF0LmguCisgIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KGNvbnN0IEZvcm1hdHRlZEJ5dGVzICYpOworCisgIC8vLyBpbmRlbnQgLSBJbnNlcnQgJ051bVNwYWNlcycgc3BhY2VzLgorICByYXdfb3N0cmVhbSAmaW5kZW50KHVuc2lnbmVkIE51bVNwYWNlcyk7CisKKyAgLy8vIENoYW5nZXMgdGhlIGZvcmVncm91bmQgY29sb3Igb2YgdGV4dCB0aGF0IHdpbGwgYmUgb3V0cHV0IGZyb20gdGhpcyBwb2ludAorICAvLy8gZm9yd2FyZC4KKyAgLy8vIEBwYXJhbSBDb2xvciBBTlNJIGNvbG9yIHRvIHVzZSwgdGhlIHNwZWNpYWwgU0FWRURDT0xPUiBjYW4gYmUgdXNlZCB0bworICAvLy8gY2hhbmdlIG9ubHkgdGhlIGJvbGQgYXR0cmlidXRlLCBhbmQga2VlcCBjb2xvcnMgdW50b3VjaGVkCisgIC8vLyBAcGFyYW0gQm9sZCBib2xkL2JyaWdodGVyIHRleHQsIGRlZmF1bHQgZmFsc2UKKyAgLy8vIEBwYXJhbSBCRyBpZiB0cnVlIGNoYW5nZSB0aGUgYmFja2dyb3VuZCwgZGVmYXVsdDogY2hhbmdlIGZvcmVncm91bmQKKyAgLy8vIEByZXR1cm5zIGl0c2VsZiBzbyBpdCBjYW4gYmUgdXNlZCB3aXRoaW4gPDwgaW52b2NhdGlvbnMKKyAgdmlydHVhbCByYXdfb3N0cmVhbSAmY2hhbmdlQ29sb3IoZW51bSBDb2xvcnMgQ29sb3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQm9sZCA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEJHID0gZmFsc2UpIHsKKyAgICAodm9pZClDb2xvcjsKKyAgICAodm9pZClCb2xkOworICAgICh2b2lkKUJHOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIC8vLyBSZXNldHMgdGhlIGNvbG9ycyB0byB0ZXJtaW5hbCBkZWZhdWx0cy4gQ2FsbCB0aGlzIHdoZW4geW91IGFyZSBkb25lCisgIC8vLyBvdXRwdXR0aW5nIGNvbG9yZWQgdGV4dCwgb3IgYmVmb3JlIHByb2dyYW0gZXhpdC4KKyAgdmlydHVhbCByYXdfb3N0cmVhbSAmcmVzZXRDb2xvcigpIHsgcmV0dXJuICp0aGlzOyB9CisKKyAgLy8vIFJldmVyc2VzIHRoZSBmb3JlZ3JvdW5kIGFuZCBiYWNrZ3JvdW5kIGNvbG9ycy4KKyAgdmlydHVhbCByYXdfb3N0cmVhbSAmcmV2ZXJzZUNvbG9yKCkgeyByZXR1cm4gKnRoaXM7IH0KKworICAvLy8gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoaXMgc3RyZWFtIGlzIGNvbm5lY3RlZCB0byBhICJ0dHkiIG9yCisgIC8vLyAiY29uc29sZSIgd2luZG93LiBUaGF0IGlzLCB0aGUgb3V0cHV0IHdvdWxkIGJlIGRpc3BsYXllZCB0byB0aGUgdXNlcgorICAvLy8gcmF0aGVyIHRoYW4gYmVpbmcgcHV0IG9uIGEgcGlwZSBvciBzdG9yZWQgaW4gYSBmaWxlLgorICB2aXJ0dWFsIGJvb2wgaXNfZGlzcGxheWVkKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLy8gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIGlmIHRoaXMgc3RyZWFtIGlzIGRpc3BsYXllZCBhbmQgc3VwcG9ydHMgY29sb3JzLgorICB2aXJ0dWFsIGJvb2wgaGFzX2NvbG9ycygpIGNvbnN0IHsgcmV0dXJuIGlzX2Rpc3BsYXllZCgpOyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFN1YmNsYXNzIEludGVyZmFjZQorICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworcHJpdmF0ZToKKyAgLy8vIFRoZSBpcyB0aGUgcGllY2Ugb2YgdGhlIGNsYXNzIHRoYXQgaXMgaW1wbGVtZW50ZWQgYnkgc3ViY2xhc3Nlcy4gIFRoaXMKKyAgLy8vIHdyaXRlcyB0aGUgXHAgU2l6ZSBieXRlcyBzdGFydGluZyBhdAorICAvLy8gXHAgUHRyIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KKyAgLy8vCisgIC8vLyBUaGlzIGZ1bmN0aW9uIGlzIGd1YXJhbnRlZWQgdG8gb25seSBiZSBjYWxsZWQgYXQgYSBwb2ludCBhdCB3aGljaCBpdCBpcworICAvLy8gc2FmZSBmb3IgdGhlIHN1YmNsYXNzIHRvIGluc3RhbGwgYSBuZXcgYnVmZmVyIHZpYSBTZXRCdWZmZXIuCisgIC8vLworICAvLy8gXHBhcmFtIFB0ciBUaGUgc3RhcnQgb2YgdGhlIGRhdGEgdG8gYmUgd3JpdHRlbi4gRm9yIGJ1ZmZlcmVkIHN0cmVhbXMgdGhpcworICAvLy8gaXMgZ3VhcmFudGVlZCB0byBiZSB0aGUgc3RhcnQgb2YgdGhlIGJ1ZmZlci4KKyAgLy8vCisgIC8vLyBccGFyYW0gU2l6ZSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4uCisgIC8vLworICAvLy8gXGludmFyaWFudCB7IFNpemUgPiAwIH0KKyAgdmlydHVhbCB2b2lkIHdyaXRlX2ltcGwoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSkgPSAwOworCisgIC8vIEFuIG91dCBvZiBsaW5lIHZpcnR1YWwgbWV0aG9kIHRvIHByb3ZpZGUgYSBob21lIGZvciB0aGUgY2xhc3MgdnRhYmxlLgorICB2aXJ0dWFsIHZvaWQgaGFuZGxlKCk7CisKKyAgLy8vIFJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIHN0cmVhbSwgbm90IGNvdW50aW5nIHRoZSBieXRlcworICAvLy8gY3VycmVudGx5IGluIHRoZSBidWZmZXIuCisgIHZpcnR1YWwgdWludDY0X3QgY3VycmVudF9wb3MoKSBjb25zdCA9IDA7CisKK3Byb3RlY3RlZDoKKyAgLy8vIFVzZSB0aGUgcHJvdmlkZWQgYnVmZmVyIGFzIHRoZSByYXdfb3N0cmVhbSBidWZmZXIuIFRoaXMgaXMgaW50ZW5kZWQgZm9yCisgIC8vLyB1c2Ugb25seSBieSBzdWJjbGFzc2VzIHdoaWNoIGNhbiBhcnJhbmdlIGZvciB0aGUgb3V0cHV0IHRvIGdvIGRpcmVjdGx5CisgIC8vLyBpbnRvIHRoZSBkZXNpcmVkIG91dHB1dCBidWZmZXIsIGluc3RlYWQgb2YgYmVpbmcgY29waWVkIG9uIGVhY2ggZmx1c2guCisgIHZvaWQgU2V0QnVmZmVyKGNoYXIgKkJ1ZmZlclN0YXJ0LCBzaXplX3QgU2l6ZSkgeworICAgIFNldEJ1ZmZlckFuZE1vZGUoQnVmZmVyU3RhcnQsIFNpemUsIEV4dGVybmFsQnVmZmVyKTsKKyAgfQorCisgIC8vLyBSZXR1cm4gYW4gZWZmaWNpZW50IGJ1ZmZlciBzaXplIGZvciB0aGUgdW5kZXJseWluZyBvdXRwdXQgbWVjaGFuaXNtLgorICB2aXJ0dWFsIHNpemVfdCBwcmVmZXJyZWRfYnVmZmVyX3NpemUoKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgc3RyZWFtIGJ1ZmZlciwgb3IgMCBpZiB0aGUgc3RyZWFtIGlzCisgIC8vLyB1bmJ1ZmZlcmVkLgorICBjb25zdCBjaGFyICpnZXRCdWZmZXJTdGFydCgpIGNvbnN0IHsgcmV0dXJuIE91dEJ1ZlN0YXJ0OyB9CisKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFByaXZhdGUgSW50ZXJmYWNlCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworcHJpdmF0ZToKKyAgLy8vIEluc3RhbGwgdGhlIGdpdmVuIGJ1ZmZlciBhbmQgbW9kZS4KKyAgdm9pZCBTZXRCdWZmZXJBbmRNb2RlKGNoYXIgKkJ1ZmZlclN0YXJ0LCBzaXplX3QgU2l6ZSwgQnVmZmVyS2luZCBNb2RlKTsKKworICAvLy8gRmx1c2ggdGhlIGN1cnJlbnQgYnVmZmVyLCB3aGljaCBpcyBrbm93biB0byBiZSBub24tZW1wdHkuIFRoaXMgb3V0cHV0cyB0aGUKKyAgLy8vIGN1cnJlbnRseSBidWZmZXJlZCBkYXRhIGFuZCByZXNldHMgdGhlIGJ1ZmZlciB0byBlbXB0eS4KKyAgdm9pZCBmbHVzaF9ub25lbXB0eSgpOworCisgIC8vLyBDb3B5IGRhdGEgaW50byB0aGUgYnVmZmVyLiBTaXplIG11c3Qgbm90IGJlIGdyZWF0ZXIgdGhhbiB0aGUgbnVtYmVyIG9mCisgIC8vLyB1bnVzZWQgYnl0ZXMgaW4gdGhlIGJ1ZmZlci4KKyAgdm9pZCBjb3B5X3RvX2J1ZmZlcihjb25zdCBjaGFyICpQdHIsIHNpemVfdCBTaXplKTsKK307CisKKy8vLyBBbiBhYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBzdHJlYW1zIGltcGxlbWVudGF0aW9ucyB0aGF0IGFsc28gc3VwcG9ydCBhCisvLy8gcHdyaXRlIG9wZXJhdGlvbi4gVGhpcyBpcyB1c2VmdWwgZm9yIGNvZGUgdGhhdCBjYW4gbW9zdGx5IHN0cmVhbSBvdXQgZGF0YSwKKy8vLyBidXQgbmVlZHMgdG8gcGF0Y2ggaW4gYSBoZWFkZXIgdGhhdCBuZWVkcyB0byBrbm93IHRoZSBvdXRwdXQgc2l6ZS4KK2NsYXNzIHJhd19wd3JpdGVfc3RyZWFtIDogcHVibGljIHJhd19vc3RyZWFtIHsKKyAgdmlydHVhbCB2b2lkIHB3cml0ZV9pbXBsKGNvbnN0IGNoYXIgKlB0ciwgc2l6ZV90IFNpemUsIHVpbnQ2NF90IE9mZnNldCkgPSAwOworCitwdWJsaWM6CisgIGV4cGxpY2l0IHJhd19wd3JpdGVfc3RyZWFtKGJvb2wgVW5idWZmZXJlZCA9IGZhbHNlKQorICAgICAgOiByYXdfb3N0cmVhbShVbmJ1ZmZlcmVkKSB7fQorICB2b2lkIHB3cml0ZShjb25zdCBjaGFyICpQdHIsIHNpemVfdCBTaXplLCB1aW50NjRfdCBPZmZzZXQpIHsKKyNpZm5kZWYgTkRCRUJVRworICAgIHVpbnQ2NF90IFBvcyA9IHRlbGwoKTsKKyAgICAvLyAvZGV2L251bGwgYWx3YXlzIHJlcG9ydHMgYSBwb3Mgb2YgMCwgc28gd2UgY2Fubm90IHBlcmZvcm0gdGhpcyBjaGVjaworICAgIC8vIGluIHRoYXQgY2FzZS4KKyAgICBpZiAoUG9zKQorICAgICAgYXNzZXJ0KFNpemUgKyBPZmZzZXQgPD0gUG9zICYmICJXZSBkb24ndCBzdXBwb3J0IGV4dGVuZGluZyB0aGUgc3RyZWFtIik7CisjZW5kaWYKKyAgICBwd3JpdGVfaW1wbChQdHIsIFNpemUsIE9mZnNldCk7CisgIH0KK307CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBGaWxlIE91dHB1dCBTdHJlYW1zCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gQSByYXdfb3N0cmVhbSB0aGF0IHdyaXRlcyB0byBhIGZpbGUgZGVzY3JpcHRvci4KKy8vLworY2xhc3MgcmF3X2ZkX29zdHJlYW0gOiBwdWJsaWMgcmF3X3B3cml0ZV9zdHJlYW0geworICBpbnQgRkQ7CisgIGJvb2wgU2hvdWxkQ2xvc2U7CisKKyAgc3RkOjplcnJvcl9jb2RlIEVDOworCisgIHVpbnQ2NF90IHBvczsKKworICBib29sIFN1cHBvcnRzU2Vla2luZzsKKworICAvLy8gU2VlIHJhd19vc3RyZWFtOjp3cml0ZV9pbXBsLgorICB2b2lkIHdyaXRlX2ltcGwoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBwd3JpdGVfaW1wbChjb25zdCBjaGFyICpQdHIsIHNpemVfdCBTaXplLCB1aW50NjRfdCBPZmZzZXQpIG92ZXJyaWRlOworCisgIC8vLyBSZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBzdHJlYW0sIG5vdCBjb3VudGluZyB0aGUgYnl0ZXMKKyAgLy8vIGN1cnJlbnRseSBpbiB0aGUgYnVmZmVyLgorICB1aW50NjRfdCBjdXJyZW50X3BvcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHBvczsgfQorCisgIC8vLyBEZXRlcm1pbmUgYW4gZWZmaWNpZW50IGJ1ZmZlciBzaXplLgorICBzaXplX3QgcHJlZmVycmVkX2J1ZmZlcl9zaXplKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIFNldCB0aGUgZmxhZyBpbmRpY2F0aW5nIHRoYXQgYW4gb3V0cHV0IGVycm9yIGhhcyBiZWVuIGVuY291bnRlcmVkLgorICB2b2lkIGVycm9yX2RldGVjdGVkKHN0ZDo6ZXJyb3JfY29kZSBFQykgeyB0aGlzLT5FQyA9IEVDOyB9CisKK3B1YmxpYzoKKyAgLy8vIE9wZW4gdGhlIHNwZWNpZmllZCBmaWxlIGZvciB3cml0aW5nLiBJZiBhbiBlcnJvciBvY2N1cnMsIGluZm9ybWF0aW9uCisgIC8vLyBhYm91dCB0aGUgZXJyb3IgaXMgcHV0IGludG8gRUMsIGFuZCB0aGUgc3RyZWFtIHNob3VsZCBiZSBpbW1lZGlhdGVseQorICAvLy8gZGVzdHJveWVkOworICAvLy8gXHAgRmxhZ3MgYWxsb3dzIG9wdGlvbmFsIGZsYWdzIHRvIGNvbnRyb2wgaG93IHRoZSBmaWxlIHdpbGwgYmUgb3BlbmVkLgorICAvLy8KKyAgLy8vIEFzIGEgc3BlY2lhbCBjYXNlLCBpZiBGaWxlbmFtZSBpcyAiLSIsIHRoZW4gdGhlIHN0cmVhbSB3aWxsIHVzZQorICAvLy8gU1RET1VUX0ZJTEVOTyBpbnN0ZWFkIG9mIG9wZW5pbmcgYSBmaWxlLiBUaGlzIHdpbGwgbm90IGNsb3NlIHRoZSBzdGRvdXQKKyAgLy8vIGRlc2NyaXB0b3IuCisgIHJhd19mZF9vc3RyZWFtKFN0cmluZ1JlZiBGaWxlbmFtZSwgc3RkOjplcnJvcl9jb2RlICZFQywKKyAgICAgICAgICAgICAgICAgc3lzOjpmczo6T3BlbkZsYWdzIEZsYWdzKTsKKworICAvLy8gRkQgaXMgdGhlIGZpbGUgZGVzY3JpcHRvciB0aGF0IHRoaXMgd3JpdGVzIHRvLiAgSWYgU2hvdWxkQ2xvc2UgaXMgdHJ1ZSwKKyAgLy8vIHRoaXMgY2xvc2VzIHRoZSBmaWxlIHdoZW4gdGhlIHN0cmVhbSBpcyBkZXN0cm95ZWQuIElmIEZEIGlzIGZvciBzdGRvdXQgb3IKKyAgLy8vIHN0ZGVyciwgaXQgd2lsbCBub3QgYmUgY2xvc2VkLgorICByYXdfZmRfb3N0cmVhbShpbnQgZmQsIGJvb2wgc2hvdWxkQ2xvc2UsIGJvb2wgdW5idWZmZXJlZD1mYWxzZSk7CisKKyAgfnJhd19mZF9vc3RyZWFtKCkgb3ZlcnJpZGU7CisKKyAgLy8vIE1hbnVhbGx5IGZsdXNoIHRoZSBzdHJlYW0gYW5kIGNsb3NlIHRoZSBmaWxlLiBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBjYWxsCisgIC8vLyBmc3luYy4KKyAgdm9pZCBjbG9zZSgpOworCisgIGJvb2wgc3VwcG9ydHNTZWVraW5nKCkgeyByZXR1cm4gU3VwcG9ydHNTZWVraW5nOyB9CisKKyAgLy8vIEZsdXNoZXMgdGhlIHN0cmVhbSBhbmQgcmVwb3NpdGlvbnMgdGhlIHVuZGVybHlpbmcgZmlsZSBkZXNjcmlwdG9yIHBvc2l0aW9uCisgIC8vLyB0byB0aGUgb2Zmc2V0IHNwZWNpZmllZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUuCisgIHVpbnQ2NF90IHNlZWsodWludDY0X3Qgb2ZmKTsKKworICByYXdfb3N0cmVhbSAmY2hhbmdlQ29sb3IoZW51bSBDb2xvcnMgY29sb3JzLCBib29sIGJvbGQ9ZmFsc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGJnPWZhbHNlKSBvdmVycmlkZTsKKyAgcmF3X29zdHJlYW0gJnJlc2V0Q29sb3IoKSBvdmVycmlkZTsKKworICByYXdfb3N0cmVhbSAmcmV2ZXJzZUNvbG9yKCkgb3ZlcnJpZGU7CisKKyAgYm9vbCBpc19kaXNwbGF5ZWQoKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIGhhc19jb2xvcnMoKSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OmVycm9yX2NvZGUgZXJyb3IoKSBjb25zdCB7IHJldHVybiBFQzsgfQorCisgIC8vLyBSZXR1cm4gdGhlIHZhbHVlIG9mIHRoZSBmbGFnIGluIHRoaXMgcmF3X2ZkX29zdHJlYW0gaW5kaWNhdGluZyB3aGV0aGVyIGFuCisgIC8vLyBvdXRwdXQgZXJyb3IgaGFzIGJlZW4gZW5jb3VudGVyZWQuCisgIC8vLyBUaGlzIGRvZXNuJ3QgaW1wbGljaXRseSBmbHVzaCBhbnkgcGVuZGluZyBvdXRwdXQuICBBbHNvLCBpdCBkb2Vzbid0CisgIC8vLyBndWFyYW50ZWUgdG8gZGV0ZWN0IGFsbCBlcnJvcnMgdW5sZXNzIHRoZSBzdHJlYW0gaGFzIGJlZW4gY2xvc2VkLgorICBib29sIGhhc19lcnJvcigpIGNvbnN0IHsgcmV0dXJuIGJvb2woRUMpOyB9CisKKyAgLy8vIFNldCB0aGUgZmxhZyByZWFkIGJ5IGhhc19lcnJvcigpIHRvIGZhbHNlLiBJZiB0aGUgZXJyb3IgZmxhZyBpcyBzZXQgYXQgdGhlCisgIC8vLyB0aW1lIHdoZW4gdGhpcyByYXdfb3N0cmVhbSdzIGRlc3RydWN0b3IgaXMgY2FsbGVkLCByZXBvcnRfZmF0YWxfZXJyb3IgaXMKKyAgLy8vIGNhbGxlZCB0byByZXBvcnQgdGhlIGVycm9yLiBVc2UgY2xlYXJfZXJyb3IoKSBhZnRlciBoYW5kbGluZyB0aGUgZXJyb3IgdG8KKyAgLy8vIGF2b2lkIHRoaXMgYmVoYXZpb3IuCisgIC8vLworICAvLy8gICAiRXJyb3JzIHNob3VsZCBuZXZlciBwYXNzIHNpbGVudGx5LgorICAvLy8gICAgVW5sZXNzIGV4cGxpY2l0bHkgc2lsZW5jZWQuIgorICAvLy8gICAgICAtIGZyb20gVGhlIFplbiBvZiBQeXRob24sIGJ5IFRpbSBQZXRlcnMKKyAgLy8vCisgIHZvaWQgY2xlYXJfZXJyb3IoKSB7IEVDID0gc3RkOjplcnJvcl9jb2RlKCk7IH0KK307CisKKy8vLyBUaGlzIHJldHVybnMgYSByZWZlcmVuY2UgdG8gYSByYXdfb3N0cmVhbSBmb3Igc3RhbmRhcmQgb3V0cHV0LiBVc2UgaXQgbGlrZToKKy8vLyBvdXRzKCkgPDwgImZvbyIgPDwgImJhciI7CityYXdfb3N0cmVhbSAmb3V0cygpOworCisvLy8gVGhpcyByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgcmF3X29zdHJlYW0gZm9yIHN0YW5kYXJkIGVycm9yLiBVc2UgaXQgbGlrZToKKy8vLyBlcnJzKCkgPDwgImZvbyIgPDwgImJhciI7CityYXdfb3N0cmVhbSAmZXJycygpOworCisvLy8gVGhpcyByZXR1cm5zIGEgcmVmZXJlbmNlIHRvIGEgcmF3X29zdHJlYW0gd2hpY2ggc2ltcGx5IGRpc2NhcmRzIG91dHB1dC4KK3Jhd19vc3RyZWFtICZudWxscygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gT3V0cHV0IFN0cmVhbSBBZGFwdG9ycworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8vIEEgcmF3X29zdHJlYW0gdGhhdCB3cml0ZXMgdG8gYW4gc3RkOjpzdHJpbmcuICBUaGlzIGlzIGEgc2ltcGxlIGFkYXB0b3IKKy8vLyBjbGFzcy4gVGhpcyBjbGFzcyBkb2VzIG5vdCBlbmNvdW50ZXIgb3V0cHV0IGVycm9ycy4KK2NsYXNzIHJhd19zdHJpbmdfb3N0cmVhbSA6IHB1YmxpYyByYXdfb3N0cmVhbSB7CisgIHN0ZDo6c3RyaW5nICZPUzsKKworICAvLy8gU2VlIHJhd19vc3RyZWFtOjp3cml0ZV9pbXBsLgorICB2b2lkIHdyaXRlX2ltcGwoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSkgb3ZlcnJpZGU7CisKKyAgLy8vIFJldHVybiB0aGUgY3VycmVudCBwb3NpdGlvbiB3aXRoaW4gdGhlIHN0cmVhbSwgbm90IGNvdW50aW5nIHRoZSBieXRlcworICAvLy8gY3VycmVudGx5IGluIHRoZSBidWZmZXIuCisgIHVpbnQ2NF90IGN1cnJlbnRfcG9zKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gT1Muc2l6ZSgpOyB9CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgcmF3X3N0cmluZ19vc3RyZWFtKHN0ZDo6c3RyaW5nICZPKSA6IE9TKE8pIHt9CisgIH5yYXdfc3RyaW5nX29zdHJlYW0oKSBvdmVycmlkZTsKKworICAvLy8gRmx1c2hlcyB0aGUgc3RyZWFtIGNvbnRlbnRzIHRvIHRoZSB0YXJnZXQgc3RyaW5nIGFuZCByZXR1cm5zICB0aGUgc3RyaW5nJ3MKKyAgLy8vIHJlZmVyZW5jZS4KKyAgc3RkOjpzdHJpbmcmIHN0cigpIHsKKyAgICBmbHVzaCgpOworICAgIHJldHVybiBPUzsKKyAgfQorfTsKKworLy8vIEEgcmF3X29zdHJlYW0gdGhhdCB3cml0ZXMgdG8gYW4gU21hbGxWZWN0b3Igb3IgU21hbGxTdHJpbmcuICBUaGlzIGlzIGEKKy8vLyBzaW1wbGUgYWRhcHRvciBjbGFzcy4gVGhpcyBjbGFzcyBkb2VzIG5vdCBlbmNvdW50ZXIgb3V0cHV0IGVycm9ycy4KKy8vLyByYXdfc3ZlY3Rvcl9vc3RyZWFtIG9wZXJhdGVzIHdpdGhvdXQgYSBidWZmZXIsIGRlbGVnYXRpbmcgYWxsIG1lbW9yeQorLy8vIG1hbmFnZW1lbnQgdG8gdGhlIFNtYWxsU3RyaW5nLiBUaHVzIHRoZSBTbWFsbFN0cmluZyBpcyBhbHdheXMgdXAtdG8tZGF0ZSwKKy8vLyBtYXkgYmUgdXNlZCBkaXJlY3RseSBhbmQgdGhlcmUgaXMgbm8gbmVlZCB0byBjYWxsIGZsdXNoKCkuCitjbGFzcyByYXdfc3ZlY3Rvcl9vc3RyZWFtIDogcHVibGljIHJhd19wd3JpdGVfc3RyZWFtIHsKKyAgU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZPUzsKKworICAvLy8gU2VlIHJhd19vc3RyZWFtOjp3cml0ZV9pbXBsLgorICB2b2lkIHdyaXRlX2ltcGwoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSkgb3ZlcnJpZGU7CisKKyAgdm9pZCBwd3JpdGVfaW1wbChjb25zdCBjaGFyICpQdHIsIHNpemVfdCBTaXplLCB1aW50NjRfdCBPZmZzZXQpIG92ZXJyaWRlOworCisgIC8vLyBSZXR1cm4gdGhlIGN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBzdHJlYW0uCisgIHVpbnQ2NF90IGN1cnJlbnRfcG9zKCkgY29uc3Qgb3ZlcnJpZGU7CisKK3B1YmxpYzoKKyAgLy8vIENvbnN0cnVjdCBhIG5ldyByYXdfc3ZlY3Rvcl9vc3RyZWFtLgorICAvLy8KKyAgLy8vIFxwYXJhbSBPIFRoZSB2ZWN0b3IgdG8gd3JpdGUgdG87IHRoaXMgc2hvdWxkIGdlbmVyYWxseSBoYXZlIGF0IGxlYXN0IDEyOAorICAvLy8gYnl0ZXMgZnJlZSB0byBhdm9pZCBhbnkgZXh0cmFuZW91cyBtZW1vcnkgb3ZlcmhlYWQuCisgIGV4cGxpY2l0IHJhd19zdmVjdG9yX29zdHJlYW0oU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZPKSA6IE9TKE8pIHsKKyAgICBTZXRVbmJ1ZmZlcmVkKCk7CisgIH0KKworICB+cmF3X3N2ZWN0b3Jfb3N0cmVhbSgpIG92ZXJyaWRlID0gZGVmYXVsdDsKKworICB2b2lkIGZsdXNoKCkgPSBkZWxldGU7CisKKyAgLy8vIFJldHVybiBhIFN0cmluZ1JlZiBmb3IgdGhlIHZlY3RvciBjb250ZW50cy4KKyAgU3RyaW5nUmVmIHN0cigpIHsgcmV0dXJuIFN0cmluZ1JlZihPUy5kYXRhKCksIE9TLnNpemUoKSk7IH0KK307CisKKy8vLyBBIHJhd19vc3RyZWFtIHRoYXQgZGlzY2FyZHMgYWxsIG91dHB1dC4KK2NsYXNzIHJhd19udWxsX29zdHJlYW0gOiBwdWJsaWMgcmF3X3B3cml0ZV9zdHJlYW0geworICAvLy8gU2VlIHJhd19vc3RyZWFtOjp3cml0ZV9pbXBsLgorICB2b2lkIHdyaXRlX2ltcGwoY29uc3QgY2hhciAqUHRyLCBzaXplX3Qgc2l6ZSkgb3ZlcnJpZGU7CisgIHZvaWQgcHdyaXRlX2ltcGwoY29uc3QgY2hhciAqUHRyLCBzaXplX3QgU2l6ZSwgdWludDY0X3QgT2Zmc2V0KSBvdmVycmlkZTsKKworICAvLy8gUmV0dXJuIHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgc3RyZWFtLCBub3QgY291bnRpbmcgdGhlIGJ5dGVzCisgIC8vLyBjdXJyZW50bHkgaW4gdGhlIGJ1ZmZlci4KKyAgdWludDY0X3QgY3VycmVudF9wb3MoKSBjb25zdCBvdmVycmlkZTsKKworcHVibGljOgorICBleHBsaWNpdCByYXdfbnVsbF9vc3RyZWFtKCkgPSBkZWZhdWx0OworICB+cmF3X251bGxfb3N0cmVhbSgpIG92ZXJyaWRlOworfTsKKworY2xhc3MgYnVmZmVyX29zdHJlYW0gOiBwdWJsaWMgcmF3X3N2ZWN0b3Jfb3N0cmVhbSB7CisgIHJhd19vc3RyZWFtICZPUzsKKyAgU21hbGxWZWN0b3I8Y2hhciwgMD4gQnVmZmVyOworCitwdWJsaWM6CisgIGJ1ZmZlcl9vc3RyZWFtKHJhd19vc3RyZWFtICZPUykgOiByYXdfc3ZlY3Rvcl9vc3RyZWFtKEJ1ZmZlciksIE9TKE9TKSB7fQorICB+YnVmZmVyX29zdHJlYW0oKSBvdmVycmlkZSB7IE9TIDw8IHN0cigpOyB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX1JBV19PU1RSRUFNX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC9yYXdfc2hhMV9vc3RyZWFtLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvcmF3X3NoYTFfb3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNTVkOTgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvcmF3X3NoYTFfb3N0cmVhbS5oCkBAIC0wLDAgKzEsNDcgQEAKKy8vPT0tIHJhd19zaGExX29zdHJlYW0uaCAtIHJhd19vc3RyZWFtIHRoYXQgY29tcHV0ZSBTSEExICAgICAgICAtLSotIEMrKyAtKi09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSByYXdfc2hhMV9vc3RyZWFtIGNsYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1JBV19TSEExX09TVFJFQU1fSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfUkFXX1NIQTFfT1NUUkVBTV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TSEExLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEEgcmF3X29zdHJlYW0gdGhhdCBoYXNoIHRoZSBjb250ZW50IHVzaW5nIHRoZSBzaGExIGFsZ29yaXRobS4KK2NsYXNzIHJhd19zaGExX29zdHJlYW0gOiBwdWJsaWMgcmF3X29zdHJlYW0geworICBTSEExIFN0YXRlOworCisgIC8vLyBTZWUgcmF3X29zdHJlYW06OndyaXRlX2ltcGwuCisgIHZvaWQgd3JpdGVfaW1wbChjb25zdCBjaGFyICpQdHIsIHNpemVfdCBTaXplKSBvdmVycmlkZSB7CisgICAgU3RhdGUudXBkYXRlKEFycmF5UmVmPHVpbnQ4X3Q+KChjb25zdCB1aW50OF90ICopUHRyLCBTaXplKSk7CisgIH0KKworcHVibGljOgorICAvLy8gUmV0dXJuIHRoZSBjdXJyZW50IFNIQTEgaGFzaCBmb3IgdGhlIGNvbnRlbnQgb2YgdGhlIHN0cmVhbQorICBTdHJpbmdSZWYgc2hhMSgpIHsKKyAgICBmbHVzaCgpOworICAgIHJldHVybiBTdGF0ZS5yZXN1bHQoKTsKKyAgfQorCisgIC8vLyBSZXNldCB0aGUgaW50ZXJuYWwgc3RhdGUgdG8gc3RhcnQgb3ZlciBmcm9tIHNjcmF0Y2guCisgIHZvaWQgcmVzZXRIYXNoKCkgeyBTdGF0ZS5pbml0KCk7IH0KKworICB1aW50NjRfdCBjdXJyZW50X3BvcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIDA7IH0KK307CisKK30gLy8gZW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3RocmVhZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3RocmVhZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc4N2E1MTMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvdGhyZWFkLmgKQEAgLTAsMCArMSw1MyBAQAorLy89PT0tLSBsbHZtL1N1cHBvcnQvdGhyZWFkLmggLSBXcmFwcGVyIGZvciA8dGhyZWFkPiAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGhlYWRlciBpcyBhIHdyYXBwZXIgZm9yIDx0aHJlYWQ+IHRoYXQgd29ya3MgYXJvdW5kIHByb2JsZW1zIHdpdGggdGhlCisvLyBNU1ZDIGhlYWRlcnMgd2hlbiBleGNlcHRpb25zIGFyZSBkaXNhYmxlZC4gSXQgYWxzbyBwcm92aWRlcyBsbHZtOjp0aHJlYWQsCisvLyB3aGljaCBpcyBlaXRoZXIgYSB0eXBlZGVmIG9mIHN0ZDo6dGhyZWFkIG9yIGEgcmVwbGFjZW1lbnQgdGhhdCBjYWxscyB0aGUKKy8vIGZ1bmN0aW9uIHN5bmNocm9ub3VzbHkgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBMTFZNX0VOQUJMRV9USFJFQURTLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9TVVBQT1JUX1RIUkVBRF9ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9USFJFQURfSAorCisjaW5jbHVkZSAibGx2bS9Db25maWcvbGx2bS1jb25maWcuaCIKKworI2lmIExMVk1fRU5BQkxFX1RIUkVBRFMKKworI2luY2x1ZGUgPHRocmVhZD4KKworbmFtZXNwYWNlIGxsdm0gewordHlwZWRlZiBzdGQ6OnRocmVhZCB0aHJlYWQ7Cit9CisKKyNlbHNlIC8vICFMTFZNX0VOQUJMRV9USFJFQURTCisKKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK3N0cnVjdCB0aHJlYWQgeworICB0aHJlYWQoKSB7fQorICB0aHJlYWQodGhyZWFkICYmb3RoZXIpIHt9CisgIHRlbXBsYXRlIDxjbGFzcyBGdW5jdGlvbiwgY2xhc3MuLi4gQXJncz4KKyAgZXhwbGljaXQgdGhyZWFkKEZ1bmN0aW9uICYmZiwgQXJncyAmJi4uLiBhcmdzKSB7CisgICAgZihzdGQ6OmZvcndhcmQ8QXJncz4oYXJncykuLi4pOworICB9CisgIHRocmVhZChjb25zdCB0aHJlYWQgJikgPSBkZWxldGU7CisKKyAgdm9pZCBqb2luKCkge30KKyAgc3RhdGljIHVuc2lnbmVkIGhhcmR3YXJlX2NvbmN1cnJlbmN5KCkgeyByZXR1cm4gMTsgfTsKK307CisKK30KKworI2VuZGlmIC8vIExMVk1fRU5BQkxFX1RIUkVBRFMKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC90eXBlX3RyYWl0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjMDg3ODMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1N1cHBvcnQvdHlwZV90cmFpdHMuaApAQCAtMCwwICsxLDEyMiBAQAorLy89PT0tIGxsdm0vU3VwcG9ydC90eXBlX3RyYWl0cy5oIC0gU2ltcGxmaWVkIHR5cGUgdHJhaXRzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgdXNlZnVsIGFkZGl0aW9ucyB0byB0aGUgc3RhbmRhcmQgdHlwZV90cmFpdHMgbGlicmFyeS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9UWVBFX1RSQUlUU19ICisjZGVmaW5lIExMVk1fU1VQUE9SVF9UWVBFX1RSQUlUU19ICisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlIDx0eXBlX3RyYWl0cz4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCisjaWZuZGVmIF9faGFzX2ZlYXR1cmUKKyNkZWZpbmUgTExWTV9ERUZJTkVEX0hBU19GRUFUVVJFCisjZGVmaW5lIF9faGFzX2ZlYXR1cmUoeCkgMAorI2VuZGlmCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIGlzUG9kTGlrZSAtIFRoaXMgaXMgYSB0eXBlIHRyYWl0IHRoYXQgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hldGhlciBhIGdpdmVuCisvLy8gdHlwZSBjYW4gYmUgY29waWVkIGFyb3VuZCB3aXRoIG1lbWNweSBpbnN0ZWFkIG9mIHJ1bm5pbmcgY3RvcnMgZXRjLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgaXNQb2RMaWtlIHsKKyAgLy8gc3RkOjppc190cml2aWFsbHlfY29weWFibGUgaXMgYXZhaWxhYmxlIGluIGxpYmMrKyB3aXRoIGNsYW5nLCBsaWJzdGRjKysKKyAgLy8gdGhhdCBjb21lcyB3aXRoIEdDQyA1LgorI2lmIChfX2hhc19mZWF0dXJlKGlzX3RyaXZpYWxseV9jb3B5YWJsZSkgJiYgZGVmaW5lZChfTElCQ1BQX1ZFUlNJT04pKSB8fCAgICAgIFwKKyAgICAoZGVmaW5lZChfX0dOVUNfXykgJiYgX19HTlVDX18gPj0gNSkKKyAgLy8gSWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIHRoZSBpc190cml2aWFsbHlfY29weWFibGUgdHJhaXQgdXNlIGl0LCBhcyBpdAorICAvLyBtYXRjaGVzIHRoZSBkZWZpbml0aW9uIG9mIGlzUG9kTGlrZSBjbG9zZWx5LgorICBzdGF0aWMgY29uc3QgYm9vbCB2YWx1ZSA9IHN0ZDo6aXNfdHJpdmlhbGx5X2NvcHlhYmxlPFQ+Ojp2YWx1ZTsKKyNlbGlmIF9faGFzX2ZlYXR1cmUoaXNfdHJpdmlhbGx5X2NvcHlhYmxlKQorICAvLyBVc2UgdGhlIGludGVybmFsIG5hbWUgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGlzX3RyaXZpYWxseV9jb3B5YWJsZSBidXQgd2UKKyAgLy8gZG9uJ3Qga25vdyBpZiB0aGUgc3RhbmRhcmQgbGlicmFyeSBkb2VzLiBUaGlzIGlzIHRoZSBjYXNlIGZvciBjbGFuZyBpbgorICAvLyBjb25qdW5jdGlvbiB3aXRoIGxpYnN0ZGMrKyBmcm9tIEdDQyA0LnguCisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gX19pc190cml2aWFsbHlfY29weWFibGUoVCk7CisjZWxzZQorICAvLyBJZiB3ZSBkb24ndCBrbm93IGFueXRoaW5nIGVsc2UsIHdlIGNhbiAoYXQgbGVhc3QpIGFzc3VtZSB0aGF0IGFsbCBub24tY2xhc3MKKyAgLy8gdHlwZXMgYXJlIFBPRHMuCisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gIXN0ZDo6aXNfY2xhc3M8VD46OnZhbHVlOworI2VuZGlmCit9OworCisvLyBzdGQ6OnBhaXIncyBhcmUgcG9kLWxpa2UgaWYgdGhlaXIgZWxlbWVudHMgYXJlLgordGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KK3N0cnVjdCBpc1BvZExpa2U8c3RkOjpwYWlyPFQsIFU+PiB7CisgIHN0YXRpYyBjb25zdCBib29sIHZhbHVlID0gaXNQb2RMaWtlPFQ+Ojp2YWx1ZSAmJiBpc1BvZExpa2U8VT46OnZhbHVlOworfTsKKworLy8vIFxicmllZiBNZXRhZnVuY3Rpb24gdGhhdCBkZXRlcm1pbmVzIHdoZXRoZXIgdGhlIGdpdmVuIHR5cGUgaXMgZWl0aGVyIGFuCisvLy8gaW50ZWdyYWwgdHlwZSBvciBhbiBlbnVtZXJhdGlvbiB0eXBlLCBpbmNsdWRpbmcgZW51bSBjbGFzc2VzLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgYWNjZXB0cyBwb3RlbnRpYWxseSBtb3JlIGludGVncmFsIHR5cGVzIHRoYW4gaXNfaW50ZWdyYWwKKy8vLyBiZWNhdXNlIGl0IGlzIGJhc2VkIG9uIGJlaW5nIGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gYW4gaW50ZWdyYWwgdHlwZS4KKy8vLyBBbHNvIG5vdGUgdGhhdCBlbnVtIGNsYXNzZXMgYXJlbid0IGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gaW50ZWdyYWwgdHlwZXMsCisvLy8gdGhlIHZhbHVlIG1heSB0aGVyZWZvcmUgbmVlZCB0byBiZSBleHBsaWNpdGx5IGNvbnZlcnRlZCBiZWZvcmUgYmVpbmcgdXNlZC4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBpc19pbnRlZ3JhbF9vcl9lbnVtIHsKKyAgdXNpbmcgVW5kZXJseWluZ1QgPSB0eXBlbmFtZSBzdGQ6OnJlbW92ZV9yZWZlcmVuY2U8VD46OnR5cGU7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGJvb2wgdmFsdWUgPQorICAgICAgIXN0ZDo6aXNfY2xhc3M8VW5kZXJseWluZ1Q+Ojp2YWx1ZSAmJiAvLyBGaWx0ZXIgY29udmVyc2lvbiBvcGVyYXRvcnMuCisgICAgICAhc3RkOjppc19wb2ludGVyPFVuZGVybHlpbmdUPjo6dmFsdWUgJiYKKyAgICAgICFzdGQ6OmlzX2Zsb2F0aW5nX3BvaW50PFVuZGVybHlpbmdUPjo6dmFsdWUgJiYKKyAgICAgIChzdGQ6OmlzX2VudW08VW5kZXJseWluZ1Q+Ojp2YWx1ZSB8fAorICAgICAgIHN0ZDo6aXNfY29udmVydGlibGU8VW5kZXJseWluZ1QsIHVuc2lnbmVkIGxvbmcgbG9uZz46OnZhbHVlKTsKK307CisKKy8vLyBcYnJpZWYgSWYgVCBpcyBhIHBvaW50ZXIsIGp1c3QgcmV0dXJuIGl0LiBJZiBpdCBpcyBub3QsIHJldHVybiBUJi4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEVuYWJsZSA9IHZvaWQ+CitzdHJ1Y3QgYWRkX2x2YWx1ZV9yZWZlcmVuY2VfaWZfbm90X3BvaW50ZXIgeyB1c2luZyB0eXBlID0gVCAmOyB9OworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBhZGRfbHZhbHVlX3JlZmVyZW5jZV9pZl9ub3RfcG9pbnRlcjwKKyAgICBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3BvaW50ZXI8VD46OnZhbHVlPjo6dHlwZT4geworICB1c2luZyB0eXBlID0gVDsKK307CisKKy8vLyBcYnJpZWYgSWYgVCBpcyBhIHBvaW50ZXIgdG8gWCwgcmV0dXJuIGEgcG9pbnRlciB0byBjb25zdCBYLiBJZiBpdCBpcyBub3QsCisvLy8gcmV0dXJuIGNvbnN0IFQuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBFbmFibGUgPSB2b2lkPgorc3RydWN0IGFkZF9jb25zdF9wYXN0X3BvaW50ZXIgeyB1c2luZyB0eXBlID0gY29uc3QgVDsgfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgYWRkX2NvbnN0X3Bhc3RfcG9pbnRlcjwKKyAgICBULCB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxzdGQ6OmlzX3BvaW50ZXI8VD46OnZhbHVlPjo6dHlwZT4geworICB1c2luZyB0eXBlID0gY29uc3QgdHlwZW5hbWUgc3RkOjpyZW1vdmVfcG9pbnRlcjxUPjo6dHlwZSAqOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEVuYWJsZSA9IHZvaWQ+CitzdHJ1Y3QgY29uc3RfcG9pbnRlcl9vcl9jb25zdF9yZWYgeworICB1c2luZyB0eXBlID0gY29uc3QgVCAmOworfTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorc3RydWN0IGNvbnN0X3BvaW50ZXJfb3JfY29uc3RfcmVmPAorICAgIFQsIHR5cGVuYW1lIHN0ZDo6ZW5hYmxlX2lmPHN0ZDo6aXNfcG9pbnRlcjxUPjo6dmFsdWU+Ojp0eXBlPiB7CisgIHVzaW5nIHR5cGUgPSB0eXBlbmFtZSBhZGRfY29uc3RfcGFzdF9wb2ludGVyPFQ+Ojp0eXBlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworLy8gSWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIGRldGVjdGluZyB3aGV0aGVyIGEgY2xhc3MgaXMgZmluYWwsIGRlZmluZQorLy8gYW4gTExWTV9JU19GSU5BTCBtYWNyby4gSWYgaXQgY2Fubm90IGJlIGRlZmluZWQgcHJvcGVybHksIHRoaXMKKy8vIG1hY3JvIHdpbGwgYmUgbGVmdCB1bmRlZmluZWQuCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxNDAyTAorI2RlZmluZSBMTFZNX0lTX0ZJTkFMKFR5KSBzdGQ6OmlzX2ZpbmFsPFR5PigpCisjZWxpZiBfX2hhc19mZWF0dXJlKGlzX2ZpbmFsKSB8fCBMTFZNX0dOVUNfUFJFUkVRKDQsIDcsIDApCisjZGVmaW5lIExMVk1fSVNfRklOQUwoVHkpIF9faXNfZmluYWwoVHkpCisjZW5kaWYKKworI2lmZGVmIExMVk1fREVGSU5FRF9IQVNfRkVBVFVSRQorI3VuZGVmIF9faGFzX2ZlYXR1cmUKKyNlbmRpZgorCisjZW5kaWYgLy8gTExWTV9TVVBQT1JUX1RZUEVfVFJBSVRTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC94eGhhc2guaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vU3VwcG9ydC94eGhhc2guaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2NhNDYwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9TdXBwb3J0L3h4aGFzaC5oCkBAIC0wLDAgKzEsNDcgQEAKKy8qCisgICB4eEhhc2ggLSBFeHRyZW1lbHkgRmFzdCBIYXNoIGFsZ29yaXRobQorICAgSGVhZGVyIEZpbGUKKyAgIENvcHlyaWdodCAoQykgMjAxMi0yMDE2LCBZYW5uIENvbGxldC4KKworICAgQlNEIDItQ2xhdXNlIExpY2Vuc2UgKGh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwKQorCisgICBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAgIG1ldDoKKworICAgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKyAgIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKyAgIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKyAgIGRpc3RyaWJ1dGlvbi4KKworICAgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICAgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAgIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICAgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICAgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgICBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAgIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAgIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICAgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworICAgWW91IGNhbiBjb250YWN0IHRoZSBhdXRob3IgYXQgOgorICAgLSB4eEhhc2ggc291cmNlIHJlcG9zaXRvcnkgOiBodHRwczovL2dpdGh1Yi5jb20vQ3lhbjQ5NzMveHhIYXNoCisqLworCisvKiBiYXNlZCBvbiByZXZpc2lvbiBkMmRmMDRlZmNiZWY3ZDdmNjg4NmQzNDU4NjFlNWRmZGE0ZWRhY2MxIFJlbW92ZWQKKyAqIGV2ZXJ5dGhpbmcgYnV0IGEgc2ltcGxlIGludGVyZmFjZSBmb3IgY29tcHV0aW5nIFhYaDY0LiAqLworCisjaWZuZGVmIExMVk1fU1VQUE9SVF9YWEhBU0hfSAorI2RlZmluZSBMTFZNX1NVUFBPUlRfWFhIQVNIX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorCituYW1lc3BhY2UgbGx2bSB7Cit1aW50NjRfdCB4eEhhc2g2NChsbHZtOjpTdHJpbmdSZWYgRGF0YSk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYWJsZUdlbi9FcnJvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYWJsZUdlbi9FcnJvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlNGQzYmYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhYmxlR2VuL0Vycm9yLmgKQEAgLTAsMCArMSw0MSBAQAorLy89PT0tIGxsdm0vVGFibGVHZW4vRXJyb3IuaCAtIHRibGdlbiBlcnJvciBoYW5kbGluZyBoZWxwZXJzIC0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgZXJyb3IgaGFuZGxpbmcgaGVscGVyIHJvdXRpbmVzIHRvIHByZXR0eS1wcmludCBkaWFnbm9zdGljCisvLyBtZXNzYWdlcyBmcm9tIHRibGdlbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFCTEVHRU5fRVJST1JfSAorI2RlZmluZSBMTFZNX1RBQkxFR0VOX0VSUk9SX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Tb3VyY2VNZ3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworCit2b2lkIFByaW50Tm90ZShBcnJheVJlZjxTTUxvYz4gTm90ZUxvYywgY29uc3QgVHdpbmUgJk1zZyk7CisKK3ZvaWQgUHJpbnRXYXJuaW5nKEFycmF5UmVmPFNNTG9jPiBXYXJuaW5nTG9jLCBjb25zdCBUd2luZSAmTXNnKTsKK3ZvaWQgUHJpbnRXYXJuaW5nKGNvbnN0IGNoYXIgKkxvYywgY29uc3QgVHdpbmUgJk1zZyk7Cit2b2lkIFByaW50V2FybmluZyhjb25zdCBUd2luZSAmTXNnKTsKKwordm9pZCBQcmludEVycm9yKEFycmF5UmVmPFNNTG9jPiBFcnJvckxvYywgY29uc3QgVHdpbmUgJk1zZyk7Cit2b2lkIFByaW50RXJyb3IoY29uc3QgY2hhciAqTG9jLCBjb25zdCBUd2luZSAmTXNnKTsKK3ZvaWQgUHJpbnRFcnJvcihjb25zdCBUd2luZSAmTXNnKTsKKworTExWTV9BVFRSSUJVVEVfTk9SRVRVUk4gdm9pZCBQcmludEZhdGFsRXJyb3IoY29uc3QgVHdpbmUgJk1zZyk7CitMTFZNX0FUVFJJQlVURV9OT1JFVFVSTiB2b2lkIFByaW50RmF0YWxFcnJvcihBcnJheVJlZjxTTUxvYz4gRXJyb3JMb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUd2luZSAmTXNnKTsKKworZXh0ZXJuIFNvdXJjZU1nciBTcmNNZ3I7CitleHRlcm4gdW5zaWduZWQgRXJyb3JzUHJpbnRlZDsKKworfSAvLyBlbmQgbmFtZXNwYWNlICJsbHZtIgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFibGVHZW4vTWFpbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYWJsZUdlbi9NYWluLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjcwNTcyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFibGVHZW4vTWFpbi5oCkBAIC0wLDAgKzEsMzAgQEAKKy8vPT09LSBsbHZtL1RhYmxlR2VuL01haW4uaCAtIHRibGdlbiBlbnRyeSBwb2ludCAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHRoZSBjb21tb24gZW50cnkgcG9pbnQgZm9yIHRibGdlbiB0b29scy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFCTEVHRU5fTUFJTl9ICisjZGVmaW5lIExMVk1fVEFCTEVHRU5fTUFJTl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgcmF3X29zdHJlYW07CitjbGFzcyBSZWNvcmRLZWVwZXI7CisKKy8vLyBQZXJmb3JtIHRoZSBhY3Rpb24gdXNpbmcgUmVjb3JkcywgYW5kIHdyaXRlIG91dHB1dCB0byBPUy4KKy8vLyBSZXR1cm5zIHRydWUgb24gZXJyb3IsIGZhbHNlIG90aGVyd2lzZS4KK3VzaW5nIFRhYmxlR2VuTWFpbkZuID0gYm9vbCAocmF3X29zdHJlYW0gJk9TLCBSZWNvcmRLZWVwZXIgJlJlY29yZHMpOworCitpbnQgVGFibGVHZW5NYWluKGNoYXIgKmFyZ3YwLCBUYWJsZUdlbk1haW5GbiAqTWFpbkZuKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVEFCTEVHRU5fTUFJTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhYmxlR2VuL1JlY29yZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYWJsZUdlbi9SZWNvcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjJlYmFhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYWJsZUdlbi9SZWNvcmQuaApAQCAtMCwwICsxLDE5MTAgQEAKKy8vPT09LSBsbHZtL1RhYmxlR2VuL1JlY29yZC5oIC0gQ2xhc3NlcyBmb3IgVGFibGUgUmVjb3JkcyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIG1haW4gVGFibGVHZW4gZGF0YSBzdHJ1Y3R1cmVzLCBpbmNsdWRpbmcgdGhlIFRhYmxlR2VuCisvLyB0eXBlcywgdmFsdWVzLCBhbmQgaGlnaC1sZXZlbCBkYXRhIHN0cnVjdHVyZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBQkxFR0VOX1JFQ09SRF9ICisjZGVmaW5lIExMVk1fVEFCTEVHRU5fUkVDT1JEX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0ZvbGRpbmdTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb2ludGVySW50UGFpci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9TTUxvYy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9UcmFpbGluZ09iamVjdHMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTGlzdFJlY1R5Oworc3RydWN0IE11bHRpQ2xhc3M7CitjbGFzcyBSZWNvcmQ7CitjbGFzcyBSZWNvcmRLZWVwZXI7CitjbGFzcyBSZWNvcmRWYWw7CitjbGFzcyBSZXNvbHZlcjsKK2NsYXNzIFN0cmluZ0luaXQ7CitjbGFzcyBUeXBlZEluaXQ7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgVHlwZSBDbGFzc2VzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBSZWNUeSB7CitwdWJsaWM6CisgIC8vLyBcYnJpZWYgU3ViY2xhc3MgZGlzY3JpbWluYXRvciAoZm9yIGR5bl9jYXN0PD4gZXQgYWwuKQorICBlbnVtIFJlY1R5S2luZCB7CisgICAgQml0UmVjVHlLaW5kLAorICAgIEJpdHNSZWNUeUtpbmQsCisgICAgQ29kZVJlY1R5S2luZCwKKyAgICBJbnRSZWNUeUtpbmQsCisgICAgU3RyaW5nUmVjVHlLaW5kLAorICAgIExpc3RSZWNUeUtpbmQsCisgICAgRGFnUmVjVHlLaW5kLAorICAgIFJlY29yZFJlY1R5S2luZAorICB9OworCitwcml2YXRlOgorICBSZWNUeUtpbmQgS2luZDsKKyAgTGlzdFJlY1R5ICpMaXN0VHkgPSBudWxscHRyOworCitwdWJsaWM6CisgIFJlY1R5KFJlY1R5S2luZCBLKSA6IEtpbmQoSykge30KKyAgdmlydHVhbCB+UmVjVHkoKSA9IGRlZmF1bHQ7CisKKyAgUmVjVHlLaW5kIGdldFJlY1R5S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3QgPSAwOworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgeyBPUyA8PCBnZXRBc1N0cmluZygpOyB9CisgIHZvaWQgZHVtcCgpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBhbGwgdmFsdWVzIG9mICd0aGlzJyB0eXBlIGNhbiBiZSBjb252ZXJ0ZWQgdG8gdGhlIHNwZWNpZmllZAorICAvLy8gdHlwZS4KKyAgdmlydHVhbCBib29sIHR5cGVJc0NvbnZlcnRpYmxlVG8oY29uc3QgUmVjVHkgKlJIUykgY29uc3Q7CisKKyAgLy8vIFJldHVybiB0cnVlIGlmICd0aGlzJyB0eXBlIGlzIGVxdWFsIHRvIG9yIGEgc3VidHlwZSBvZiBSSFMuIEZvciBleGFtcGxlLAorICAvLy8gYSBiaXQgc2V0IGlzIG5vdCBhbiBpbnQsIGJ1dCB0aGV5IGFyZSBjb252ZXJ0aWJsZS4KKyAgdmlydHVhbCBib29sIHR5cGVJc0EoY29uc3QgUmVjVHkgKlJIUykgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIHR5cGUgcmVwcmVzZW50aW5nIGxpc3Q8dGhpcz4uCisgIExpc3RSZWNUeSAqZ2V0TGlzdFR5KCk7Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBSZWNUeSAmVHkpIHsKKyAgVHkucHJpbnQoT1MpOworICByZXR1cm4gT1M7Cit9CisKKy8vLyAnYml0JyAtIFJlcHJlc2VudCBhIHNpbmdsZSBiaXQKK2NsYXNzIEJpdFJlY1R5IDogcHVibGljIFJlY1R5IHsKKyAgc3RhdGljIEJpdFJlY1R5IFNoYXJlZDsKKworICBCaXRSZWNUeSgpIDogUmVjVHkoQml0UmVjVHlLaW5kKSB7fQorCitwdWJsaWM6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgUmVjVHkgKlJUKSB7CisgICAgcmV0dXJuIFJULT5nZXRSZWNUeUtpbmQoKSA9PSBCaXRSZWNUeUtpbmQ7CisgIH0KKworICBzdGF0aWMgQml0UmVjVHkgKmdldCgpIHsgcmV0dXJuICZTaGFyZWQ7IH0KKworICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuICJiaXQiOyB9CisKKyAgYm9vbCB0eXBlSXNDb252ZXJ0aWJsZVRvKGNvbnN0IFJlY1R5ICpSSFMpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vICdiaXRzPG4+JyAtIFJlcHJlc2VudCBhIGZpeGVkIG51bWJlciBvZiBiaXRzCitjbGFzcyBCaXRzUmVjVHkgOiBwdWJsaWMgUmVjVHkgeworICB1bnNpZ25lZCBTaXplOworCisgIGV4cGxpY2l0IEJpdHNSZWNUeSh1bnNpZ25lZCBTeikgOiBSZWNUeShCaXRzUmVjVHlLaW5kKSwgU2l6ZShTeikge30KKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFJlY1R5ICpSVCkgeworICAgIHJldHVybiBSVC0+Z2V0UmVjVHlLaW5kKCkgPT0gQml0c1JlY1R5S2luZDsKKyAgfQorCisgIHN0YXRpYyBCaXRzUmVjVHkgKmdldCh1bnNpZ25lZCBTeik7CisKKyAgdW5zaWduZWQgZ2V0TnVtQml0cygpIGNvbnN0IHsgcmV0dXJuIFNpemU7IH0KKworICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgdHlwZUlzQ29udmVydGlibGVUbyhjb25zdCBSZWNUeSAqUkhTKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIHR5cGVJc0EoY29uc3QgUmVjVHkgKlJIUykgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gJ2NvZGUnIC0gUmVwcmVzZW50IGEgY29kZSBmcmFnbWVudAorY2xhc3MgQ29kZVJlY1R5IDogcHVibGljIFJlY1R5IHsKKyAgc3RhdGljIENvZGVSZWNUeSBTaGFyZWQ7CisKKyAgQ29kZVJlY1R5KCkgOiBSZWNUeShDb2RlUmVjVHlLaW5kKSB7fQorCitwdWJsaWM6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgUmVjVHkgKlJUKSB7CisgICAgcmV0dXJuIFJULT5nZXRSZWNUeUtpbmQoKSA9PSBDb2RlUmVjVHlLaW5kOworICB9CisKKyAgc3RhdGljIENvZGVSZWNUeSAqZ2V0KCkgeyByZXR1cm4gJlNoYXJlZDsgfQorCisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gImNvZGUiOyB9CisKKyAgYm9vbCB0eXBlSXNDb252ZXJ0aWJsZVRvKGNvbnN0IFJlY1R5ICpSSFMpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vICdpbnQnIC0gUmVwcmVzZW50IGFuIGludGVnZXIgdmFsdWUgb2Ygbm8gcGFydGljdWxhciBzaXplCitjbGFzcyBJbnRSZWNUeSA6IHB1YmxpYyBSZWNUeSB7CisgIHN0YXRpYyBJbnRSZWNUeSBTaGFyZWQ7CisKKyAgSW50UmVjVHkoKSA6IFJlY1R5KEludFJlY1R5S2luZCkge30KKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFJlY1R5ICpSVCkgeworICAgIHJldHVybiBSVC0+Z2V0UmVjVHlLaW5kKCkgPT0gSW50UmVjVHlLaW5kOworICB9CisKKyAgc3RhdGljIEludFJlY1R5ICpnZXQoKSB7IHJldHVybiAmU2hhcmVkOyB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAiaW50IjsgfQorCisgIGJvb2wgdHlwZUlzQ29udmVydGlibGVUbyhjb25zdCBSZWNUeSAqUkhTKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vLyAnc3RyaW5nJyAtIFJlcHJlc2VudCBhbiBzdHJpbmcgdmFsdWUKK2NsYXNzIFN0cmluZ1JlY1R5IDogcHVibGljIFJlY1R5IHsKKyAgc3RhdGljIFN0cmluZ1JlY1R5IFNoYXJlZDsKKworICBTdHJpbmdSZWNUeSgpIDogUmVjVHkoU3RyaW5nUmVjVHlLaW5kKSB7fQorCitwdWJsaWM6CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgUmVjVHkgKlJUKSB7CisgICAgcmV0dXJuIFJULT5nZXRSZWNUeUtpbmQoKSA9PSBTdHJpbmdSZWNUeUtpbmQ7CisgIH0KKworICBzdGF0aWMgU3RyaW5nUmVjVHkgKmdldCgpIHsgcmV0dXJuICZTaGFyZWQ7IH0KKworICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgdHlwZUlzQ29udmVydGlibGVUbyhjb25zdCBSZWNUeSAqUkhTKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vLyAnbGlzdDxUeT4nIC0gUmVwcmVzZW50IGEgbGlzdCBvZiB2YWx1ZXMsIGFsbCBvZiB3aGljaCBtdXN0IGJlIG9mCisvLy8gdGhlIHNwZWNpZmllZCB0eXBlLgorY2xhc3MgTGlzdFJlY1R5IDogcHVibGljIFJlY1R5IHsKKyAgZnJpZW5kIExpc3RSZWNUeSAqUmVjVHk6OmdldExpc3RUeSgpOworCisgIFJlY1R5ICpUeTsKKworICBleHBsaWNpdCBMaXN0UmVjVHkoUmVjVHkgKlQpIDogUmVjVHkoTGlzdFJlY1R5S2luZCksIFR5KFQpIHt9CisKK3B1YmxpYzoKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBSZWNUeSAqUlQpIHsKKyAgICByZXR1cm4gUlQtPmdldFJlY1R5S2luZCgpID09IExpc3RSZWNUeUtpbmQ7CisgIH0KKworICBzdGF0aWMgTGlzdFJlY1R5ICpnZXQoUmVjVHkgKlQpIHsgcmV0dXJuIFQtPmdldExpc3RUeSgpOyB9CisgIFJlY1R5ICpnZXRFbGVtZW50VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFR5OyB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIHR5cGVJc0NvbnZlcnRpYmxlVG8oY29uc3QgUmVjVHkgKlJIUykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCB0eXBlSXNBKGNvbnN0IFJlY1R5ICpSSFMpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vICdkYWcnIC0gUmVwcmVzZW50IGEgZGFnIGZyYWdtZW50CitjbGFzcyBEYWdSZWNUeSA6IHB1YmxpYyBSZWNUeSB7CisgIHN0YXRpYyBEYWdSZWNUeSBTaGFyZWQ7CisKKyAgRGFnUmVjVHkoKSA6IFJlY1R5KERhZ1JlY1R5S2luZCkge30KKworcHVibGljOgorICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFJlY1R5ICpSVCkgeworICAgIHJldHVybiBSVC0+Z2V0UmVjVHlLaW5kKCkgPT0gRGFnUmVjVHlLaW5kOworICB9CisKKyAgc3RhdGljIERhZ1JlY1R5ICpnZXQoKSB7IHJldHVybiAmU2hhcmVkOyB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vLyAnW2NsYXNzbmFtZV0nIC0gVHlwZSBvZiByZWNvcmQgdmFsdWVzIHRoYXQgaGF2ZSB6ZXJvIG9yIG1vcmUgc3VwZXJjbGFzc2VzLgorLy8vCisvLy8gVGhlIGxpc3Qgb2Ygc3VwZXJjbGFzc2VzIGlzIG5vbi1yZWR1bmRhbnQsIGkuZS4gb25seSBjb250YWlucyBjbGFzc2VzIHRoYXQKKy8vLyBhcmUgbm90IHRoZSBzdXBlcmNsYXNzIG9mIHNvbWUgb3RoZXIgbGlzdGVkIGNsYXNzLgorY2xhc3MgUmVjb3JkUmVjVHkgZmluYWwgOiBwdWJsaWMgUmVjVHksIHB1YmxpYyBGb2xkaW5nU2V0Tm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFRyYWlsaW5nT2JqZWN0czxSZWNvcmRSZWNUeSwgUmVjb3JkICo+IHsKKyAgZnJpZW5kIGNsYXNzIFJlY29yZDsKKworICB1bnNpZ25lZCBOdW1DbGFzc2VzOworCisgIGV4cGxpY2l0IFJlY29yZFJlY1R5KHVuc2lnbmVkIE51bSkKKyAgICAgIDogUmVjVHkoUmVjb3JkUmVjVHlLaW5kKSwgTnVtQ2xhc3NlcyhOdW0pIHt9CisKK3B1YmxpYzoKKyAgUmVjb3JkUmVjVHkoY29uc3QgUmVjb3JkUmVjVHkgJikgPSBkZWxldGU7CisgIFJlY29yZFJlY1R5ICZvcGVyYXRvcj0oY29uc3QgUmVjb3JkUmVjVHkgJikgPSBkZWxldGU7CisKKyAgLy8gRG8gbm90IHVzZSBzaXplZCBkZWFsbG9jYXRpb24gZHVlIHRvIHRyYWlsaW5nIG9iamVjdHMuCisgIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQgKnApIHsgOjpvcGVyYXRvciBkZWxldGUocCk7IH0KKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFJlY1R5ICpSVCkgeworICAgIHJldHVybiBSVC0+Z2V0UmVjVHlLaW5kKCkgPT0gUmVjb3JkUmVjVHlLaW5kOworICB9CisKKyAgLy8vIEdldCB0aGUgcmVjb3JkIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gbm9uLXJlZHVuZGFudCBsaXN0IG9mIHN1cGVyY2xhc3Nlcy4KKyAgc3RhdGljIFJlY29yZFJlY1R5ICpnZXQoQXJyYXlSZWY8UmVjb3JkICo+IENsYXNzZXMpOworCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Q7CisKKyAgQXJyYXlSZWY8UmVjb3JkICo+IGdldENsYXNzZXMoKSBjb25zdCB7CisgICAgcmV0dXJuIG1ha2VBcnJheVJlZihnZXRUcmFpbGluZ09iamVjdHM8UmVjb3JkICo+KCksIE51bUNsYXNzZXMpOworICB9CisKKyAgdXNpbmcgY29uc3RfcmVjb3JkX2l0ZXJhdG9yID0gUmVjb3JkICogY29uc3QgKjsKKworICBjb25zdF9yZWNvcmRfaXRlcmF0b3IgY2xhc3Nlc19iZWdpbigpIGNvbnN0IHsgcmV0dXJuIGdldENsYXNzZXMoKS5iZWdpbigpOyB9CisgIGNvbnN0X3JlY29yZF9pdGVyYXRvciBjbGFzc2VzX2VuZCgpIGNvbnN0IHsgcmV0dXJuIGdldENsYXNzZXMoKS5lbmQoKTsgfQorCisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBpc1N1YkNsYXNzT2YoUmVjb3JkICpDbGFzcykgY29uc3Q7CisgIGJvb2wgdHlwZUlzQ29udmVydGlibGVUbyhjb25zdCBSZWNUeSAqUkhTKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIHR5cGVJc0EoY29uc3QgUmVjVHkgKlJIUykgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gRmluZCBhIGNvbW1vbiB0eXBlIHRoYXQgVDEgYW5kIFQyIGNvbnZlcnQgdG8uCisvLy8gUmV0dXJuIDAgaWYgbm8gc3VjaCB0eXBlIGV4aXN0cy4KK1JlY1R5ICpyZXNvbHZlVHlwZXMoUmVjVHkgKlQxLCBSZWNUeSAqVDIpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gIEluaXRpYWxpemVyIENsYXNzZXMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIEluaXQgeworcHJvdGVjdGVkOgorICAvLy8gXGJyaWVmIERpc2NyaW1pbmF0b3IgZW51bSAoZm9yIGlzYTw+LCBkeW5fY2FzdDw+LCBldCBhbC4pCisgIC8vLworICAvLy8gVGhpcyBlbnVtIGlzIGxhaWQgb3V0IGJ5IGEgcHJlb3JkZXIgdHJhdmVyc2FsIG9mIHRoZSBpbmhlcml0YW5jZQorICAvLy8gaGllcmFyY2h5LCBhbmQgZG9lcyBub3QgY29udGFpbiBhbiBlbnRyeSBmb3IgYWJzdHJhY3QgY2xhc3NlcywgYXMgcGVyCisgIC8vLyB0aGUgcmVjb21tZW5kYXRpb24gaW4gZG9jcy9Ib3dUb1NldFVwTExWTVN0eWxlUlRUSS5yc3QuCisgIC8vLworICAvLy8gV2UgYWxzbyBleHBsaWNpdGx5IGluY2x1ZGUgImZpcnN0IiBhbmQgImxhc3QiIHZhbHVlcyBmb3IgZWFjaAorICAvLy8gaW50ZXJpb3Igbm9kZSBvZiB0aGUgaW5oZXJpdGFuY2UgdHJlZSwgdG8gbWFrZSBpdCBlYXNpZXIgdG8gcmVhZCB0aGUKKyAgLy8vIGNvcnJlc3BvbmRpbmcgY2xhc3NvZigpLgorICAvLy8KKyAgLy8vIFdlIGNvdWxkIHBhY2sgdGhlc2UgYSBiaXQgdGlnaHRlciBieSBub3QgaGF2aW5nIHRoZSBJS19GaXJzdFhYWEluaXQKKyAgLy8vIGFuZCBJS19MYXN0WFhYSW5pdCBiZSB0aGVpciBvd24gdmFsdWVzLCBidXQgdGhhdCB3b3VsZCBkZWdyYWRlCisgIC8vLyByZWFkYWJpbGl0eSBmb3IgcmVhbGx5IG5vIGJlbmVmaXQuCisgIGVudW0gSW5pdEtpbmQgOiB1aW50OF90IHsKKyAgICBJS19GaXJzdCwgLy8gdW51c2VkOyBzaWxlbmNlIGEgc3B1cmlvdXMgd2FybmluZworICAgIElLX0ZpcnN0VHlwZWRJbml0LAorICAgIElLX0JpdEluaXQsCisgICAgSUtfQml0c0luaXQsCisgICAgSUtfQ29kZUluaXQsCisgICAgSUtfRGFnSW5pdCwKKyAgICBJS19EZWZJbml0LAorICAgIElLX0ZpZWxkSW5pdCwKKyAgICBJS19JbnRJbml0LAorICAgIElLX0xpc3RJbml0LAorICAgIElLX0ZpcnN0T3BJbml0LAorICAgIElLX0Jpbk9wSW5pdCwKKyAgICBJS19UZXJuT3BJbml0LAorICAgIElLX1VuT3BJbml0LAorICAgIElLX0xhc3RPcEluaXQsCisgICAgSUtfRm9sZE9wSW5pdCwKKyAgICBJS19Jc0FPcEluaXQsCisgICAgSUtfU3RyaW5nSW5pdCwKKyAgICBJS19WYXJJbml0LAorICAgIElLX1Zhckxpc3RFbGVtZW50SW5pdCwKKyAgICBJS19WYXJCaXRJbml0LAorICAgIElLX1ZhckRlZkluaXQsCisgICAgSUtfTGFzdFR5cGVkSW5pdCwKKyAgICBJS19VbnNldEluaXQKKyAgfTsKKworcHJpdmF0ZToKKyAgY29uc3QgSW5pdEtpbmQgS2luZDsKKworcHJvdGVjdGVkOgorICB1aW50OF90IE9wYzsgLy8gVXNlZCBieSBVbk9wSW5pdCwgQmluT3BJbml0LCBhbmQgVGVybk9wSW5pdAorCitwcml2YXRlOgorICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7CisKK3B1YmxpYzoKKyAgSW5pdEtpbmQgZ2V0S2luZCgpIGNvbnN0IHsgcmV0dXJuIEtpbmQ7IH0KKworcHJvdGVjdGVkOgorICBleHBsaWNpdCBJbml0KEluaXRLaW5kIEssIHVpbnQ4X3QgT3BjID0gMCkgOiBLaW5kKEspLCBPcGMoT3BjKSB7fQorCitwdWJsaWM6CisgIEluaXQoY29uc3QgSW5pdCAmKSA9IGRlbGV0ZTsKKyAgSW5pdCAmb3BlcmF0b3I9KGNvbnN0IEluaXQgJikgPSBkZWxldGU7CisgIHZpcnR1YWwgfkluaXQoKSA9IGRlZmF1bHQ7CisKKyAgLy8vIFRoaXMgdmlydHVhbCBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4gYnkgdmFsdWVzIHRoYXQgbWF5CisgIC8vLyBub3QgYmUgY29tcGxldGVseSBzcGVjaWZpZWQgeWV0LgorICB2aXJ0dWFsIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAvLy8gSXMgdGhpcyBhIGNvbmNyZXRlIGFuZCBmdWxseSByZXNvbHZlZCB2YWx1ZSB3aXRob3V0IGFueSByZWZlcmVuY2VzIG9yCisgIC8vLyBzdHVjayBvcGVyYXRpb25zPyBVbnNldCB2YWx1ZXMgYXJlIGNvbmNyZXRlLgorICB2aXJ0dWFsIGJvb2wgaXNDb25jcmV0ZSgpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8vIFByaW50IG91dCB0aGlzIHZhbHVlLgorICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgeyBPUyA8PCBnZXRBc1N0cmluZygpOyB9CisKKyAgLy8vIENvbnZlcnQgdGhpcyB2YWx1ZSB0byBhIHN0cmluZyBmb3JtLgorICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3QgPSAwOworICAvLy8gQ29udmVydCB0aGlzIHZhbHVlIHRvIGEgc3RyaW5nIGZvcm0sCisgIC8vLyB3aXRob3V0IGFkZGluZyBxdW90ZSBtYXJrZXJzLiAgVGhpcyBwcmltYXJ1bHkgYWZmZWN0cworICAvLy8gU3RyaW5nSW5pdHMgd2hlcmUgd2Ugd2lsbCBub3Qgc3Vycm91bmQgdGhlIHN0cmluZyB2YWx1ZSB3aXRoCisgIC8vLyBxdW90ZXMuCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgZ2V0QXNVbnF1b3RlZFN0cmluZygpIGNvbnN0IHsgcmV0dXJuIGdldEFzU3RyaW5nKCk7IH0KKworICAvLy8gRGVidWdnaW5nIG1ldGhvZCB0aGF0IG1heSBiZSBjYWxsZWQgdGhyb3VnaCBhIGRlYnVnZ2VyLCBqdXN0CisgIC8vLyBpbnZva2VzIHByaW50IG9uIHN0ZGVyci4KKyAgdm9pZCBkdW1wKCkgY29uc3Q7CisKKyAgLy8vIElmIHRoaXMgaW5pdGlhbGl6ZXIgaXMgY29udmVydGlibGUgdG8gVHksIHJldHVybiBhbiBpbml0aWFsaXplciB3aG9zZQorICAvLy8gdHlwZSBpcy1hIFR5LCBnZW5lcmF0aW5nIGEgIWNhc3Qgb3BlcmF0aW9uIGlmIHJlcXVpcmVkLiBPdGhlcndpc2UsIHJldHVybgorICAvLy8gbnVsbHB0ci4KKyAgdmlydHVhbCBJbml0ICpnZXRDYXN0VG8oUmVjVHkgKlR5KSBjb25zdCA9IDA7CisKKyAgLy8vIENvbnZlcnQgdG8gYW4gaW5pdGlhbGl6ZXIgd2hvc2UgdHlwZSBpcy1hIFR5LCBvciByZXR1cm4gbnVsbHB0ciBpZiB0aGlzCisgIC8vLyBpcyBub3QgcG9zc2libGUgKHRoaXMgY2FuIGhhcHBlbiBpZiB0aGUgaW5pdGlhbGl6ZXIncyB0eXBlIGlzIGNvbnZlcnRpYmxlCisgIC8vLyB0byBUeSwgYnV0IHRoZXJlIGFyZSB1bnJlc29sdmVkIHJlZmVyZW5jZXMpLgorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRJbml0aWFsaXplclRvKFJlY1R5ICpUeSkgY29uc3QgPSAwOworCisgIC8vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIGltcGxlbWVudCB0aGUgYml0cmFuZ2UKKyAgLy8vIHNlbGVjdGlvbiBvcGVyYXRvci4gIEdpdmVuIGFuIGluaXRpYWxpemVyLCBpdCBzZWxlY3RzIHRoZSBzcGVjaWZpZWQgYml0cworICAvLy8gb3V0LCByZXR1cm5pbmcgdGhlbSBhcyBhIG5ldyBpbml0IG9mIGJpdHMgdHlwZS4gIElmIGl0IGlzIG5vdCBsZWdhbCB0byB1c2UKKyAgLy8vIHRoZSBiaXQgc3Vic2NyaXB0IG9wZXJhdG9yIG9uIHRoaXMgaW5pdGlhbGl6ZXIsIHJldHVybiBudWxsLgorICB2aXJ0dWFsIEluaXQgKmNvbnZlcnRJbml0aWFsaXplckJpdFJhbmdlKEFycmF5UmVmPHVuc2lnbmVkPiBCaXRzKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIGxpc3Qgc2xpY2UKKyAgLy8vIHNlbGVjdGlvbiBvcGVyYXRvci4gIEdpdmVuIGFuIGluaXRpYWxpemVyLCBpdCBzZWxlY3RzIHRoZSBzcGVjaWZpZWQgbGlzdAorICAvLy8gZWxlbWVudHMsIHJldHVybmluZyB0aGVtIGFzIGEgbmV3IGluaXQgb2YgbGlzdCB0eXBlLiAgSWYgaXQgaXMgbm90IGxlZ2FsCisgIC8vLyB0byB0YWtlIGEgc2xpY2Ugb2YgdGhpcywgcmV0dXJuIG51bGwuCisgIHZpcnR1YWwgSW5pdCAqY29udmVydEluaXRMaXN0U2xpY2UoQXJyYXlSZWY8dW5zaWduZWQ+IEVsZW1lbnRzKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbXBsZW1lbnQgdGhlIEZpZWxkSW5pdCBjbGFzcy4KKyAgLy8vIEltcGxlbWVudG9ycyBvZiB0aGlzIG1ldGhvZCBzaG91bGQgcmV0dXJuIHRoZSB0eXBlIG9mIHRoZSBuYW1lZCBmaWVsZCBpZgorICAvLy8gdGhleSBhcmUgb2YgcmVjb3JkIHR5cGUuCisgIHZpcnR1YWwgUmVjVHkgKmdldEZpZWxkVHlwZShTdHJpbmdJbml0ICpGaWVsZE5hbWUpIGNvbnN0IHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IGNsYXNzZXMgdGhhdCByZWZlciB0byBvdGhlcgorICAvLy8gdmFyaWFibGVzIHdoaWNoIG1heSBub3QgYmUgZGVmaW5lZCBhdCB0aGUgdGltZSB0aGUgZXhwcmVzc2lvbiBpcyBmb3JtZWQuCisgIC8vLyBJZiBhIHZhbHVlIGlzIHNldCBmb3IgdGhlIHZhcmlhYmxlIGxhdGVyLCB0aGlzIG1ldGhvZCB3aWxsIGJlIGNhbGxlZCBvbgorICAvLy8gdXNlcnMgb2YgdGhlIHZhbHVlIHRvIGFsbG93IHRoZSB2YWx1ZSB0byBwcm9wYWdhdGUgb3V0LgorICB2aXJ0dWFsIEluaXQgKnJlc29sdmVSZWZlcmVuY2VzKFJlc29sdmVyICZSKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8SW5pdCAqPih0aGlzKTsKKyAgfQorCisgIC8vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIHRvIHJldHVybiB0aGUgaW5pdGlhbGl6ZXIgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIGJpdC4KKyAgdmlydHVhbCBJbml0ICpnZXRCaXQodW5zaWduZWQgQml0KSBjb25zdCA9IDA7Cit9OworCitpbmxpbmUgcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBJbml0ICZJKSB7CisgIEkucHJpbnQoT1MpOyByZXR1cm4gT1M7Cit9CisKKy8vLyBUaGlzIGlzIHRoZSBjb21tb24gc3VwZXItY2xhc3Mgb2YgdHlwZXMgdGhhdCBoYXZlIGEgc3BlY2lmaWMsCisvLy8gZXhwbGljaXQsIHR5cGUuCitjbGFzcyBUeXBlZEluaXQgOiBwdWJsaWMgSW5pdCB7CisgIFJlY1R5ICpUeTsKKworcHJvdGVjdGVkOgorICBleHBsaWNpdCBUeXBlZEluaXQoSW5pdEtpbmQgSywgUmVjVHkgKlQsIHVpbnQ4X3QgT3BjID0gMCkKKyAgICA6IEluaXQoSywgT3BjKSwgVHkoVCkge30KKworcHVibGljOgorICBUeXBlZEluaXQoY29uc3QgVHlwZWRJbml0ICYpID0gZGVsZXRlOworICBUeXBlZEluaXQgJm9wZXJhdG9yPShjb25zdCBUeXBlZEluaXQgJikgPSBkZWxldGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbml0ICpJKSB7CisgICAgcmV0dXJuIEktPmdldEtpbmQoKSA+PSBJS19GaXJzdFR5cGVkSW5pdCAmJgorICAgICAgICAgICBJLT5nZXRLaW5kKCkgPD0gSUtfTGFzdFR5cGVkSW5pdDsKKyAgfQorCisgIFJlY1R5ICpnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gVHk7IH0KKworICBJbml0ICpnZXRDYXN0VG8oUmVjVHkgKlR5KSBjb25zdCBvdmVycmlkZTsKKyAgSW5pdCAqY29udmVydEluaXRpYWxpemVyVG8oUmVjVHkgKlR5KSBjb25zdCBvdmVycmlkZTsKKworICBJbml0ICpjb252ZXJ0SW5pdGlhbGl6ZXJCaXRSYW5nZShBcnJheVJlZjx1bnNpZ25lZD4gQml0cykgY29uc3Qgb3ZlcnJpZGU7CisgIEluaXQgKmNvbnZlcnRJbml0TGlzdFNsaWNlKEFycmF5UmVmPHVuc2lnbmVkPiBFbGVtZW50cykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBGaWVsZEluaXQgY2xhc3MuCisgIC8vLyBJbXBsZW1lbnRvcnMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0aGUgdHlwZSBvZiB0aGUgbmFtZWQgZmllbGQgaWYKKyAgLy8vIHRoZXkgYXJlIG9mIHJlY29yZCB0eXBlLgorICAvLy8KKyAgUmVjVHkgKmdldEZpZWxkVHlwZShTdHJpbmdJbml0ICpGaWVsZE5hbWUpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vICc/JyAtIFJlcHJlc2VudHMgYW4gdW5pbml0aWFsaXplZCB2YWx1ZQorY2xhc3MgVW5zZXRJbml0IDogcHVibGljIEluaXQgeworICBVbnNldEluaXQoKSA6IEluaXQoSUtfVW5zZXRJbml0KSB7fQorCitwdWJsaWM6CisgIFVuc2V0SW5pdChjb25zdCBVbnNldEluaXQgJikgPSBkZWxldGU7CisgIFVuc2V0SW5pdCAmb3BlcmF0b3I9KGNvbnN0IFVuc2V0SW5pdCAmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluaXQgKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0S2luZCgpID09IElLX1Vuc2V0SW5pdDsKKyAgfQorCisgIHN0YXRpYyBVbnNldEluaXQgKmdldCgpOworCisgIEluaXQgKmdldENhc3RUbyhSZWNUeSAqVHkpIGNvbnN0IG92ZXJyaWRlOworICBJbml0ICpjb252ZXJ0SW5pdGlhbGl6ZXJUbyhSZWNUeSAqVHkpIGNvbnN0IG92ZXJyaWRlOworCisgIEluaXQgKmdldEJpdCh1bnNpZ25lZCBCaXQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxVbnNldEluaXQqPih0aGlzKTsKKyAgfQorCisgIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisgIGJvb2wgaXNDb25jcmV0ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAiPyI7IH0KK307CisKKy8vLyAndHJ1ZScvJ2ZhbHNlJyAtIFJlcHJlc2VudCBhIGNvbmNyZXRlIGluaXRpYWxpemVyIGZvciBhIGJpdC4KK2NsYXNzIEJpdEluaXQgZmluYWwgOiBwdWJsaWMgVHlwZWRJbml0IHsKKyAgYm9vbCBWYWx1ZTsKKworICBleHBsaWNpdCBCaXRJbml0KGJvb2wgVikgOiBUeXBlZEluaXQoSUtfQml0SW5pdCwgQml0UmVjVHk6OmdldCgpKSwgVmFsdWUoVikge30KKworcHVibGljOgorICBCaXRJbml0KGNvbnN0IEJpdEluaXQgJikgPSBkZWxldGU7CisgIEJpdEluaXQgJm9wZXJhdG9yPShCaXRJbml0ICYpID0gZGVsZXRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5pdCAqSSkgeworICAgIHJldHVybiBJLT5nZXRLaW5kKCkgPT0gSUtfQml0SW5pdDsKKyAgfQorCisgIHN0YXRpYyBCaXRJbml0ICpnZXQoYm9vbCBWKTsKKworICBib29sIGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKworICBJbml0ICpjb252ZXJ0SW5pdGlhbGl6ZXJUbyhSZWNUeSAqVHkpIGNvbnN0IG92ZXJyaWRlOworCisgIEluaXQgKmdldEJpdCh1bnNpZ25lZCBCaXQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBhc3NlcnQoQml0IDwgMSAmJiAiQml0IGluZGV4IG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxCaXRJbml0Kj4odGhpcyk7CisgIH0KKworICBib29sIGlzQ29uY3JldGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gVmFsdWUgPyAiMSIgOiAiMCI7IH0KK307CisKKy8vLyAneyBhLCBiLCBjIH0nIC0gUmVwcmVzZW50cyBhbiBpbml0aWFsaXplciBmb3IgYSBCaXRzUmVjVHkgdmFsdWUuCisvLy8gSXQgY29udGFpbnMgYSB2ZWN0b3Igb2YgYml0cywgd2hvc2Ugc2l6ZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSB0eXBlLgorY2xhc3MgQml0c0luaXQgZmluYWwgOiBwdWJsaWMgVHlwZWRJbml0LCBwdWJsaWMgRm9sZGluZ1NldE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBUcmFpbGluZ09iamVjdHM8Qml0c0luaXQsIEluaXQgKj4geworICB1bnNpZ25lZCBOdW1CaXRzOworCisgIEJpdHNJbml0KHVuc2lnbmVkIE4pCisgICAgOiBUeXBlZEluaXQoSUtfQml0c0luaXQsIEJpdHNSZWNUeTo6Z2V0KE4pKSwgTnVtQml0cyhOKSB7fQorCitwdWJsaWM6CisgIEJpdHNJbml0KGNvbnN0IEJpdHNJbml0ICYpID0gZGVsZXRlOworICBCaXRzSW5pdCAmb3BlcmF0b3I9KGNvbnN0IEJpdHNJbml0ICYpID0gZGVsZXRlOworCisgIC8vIERvIG5vdCB1c2Ugc2l6ZWQgZGVhbGxvY2F0aW9uIGR1ZSB0byB0cmFpbGluZyBvYmplY3RzLgorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwKSB7IDo6b3BlcmF0b3IgZGVsZXRlKHApOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbml0ICpJKSB7CisgICAgcmV0dXJuIEktPmdldEtpbmQoKSA9PSBJS19CaXRzSW5pdDsKKyAgfQorCisgIHN0YXRpYyBCaXRzSW5pdCAqZ2V0KEFycmF5UmVmPEluaXQgKj4gUmFuZ2UpOworCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Q7CisKKyAgdW5zaWduZWQgZ2V0TnVtQml0cygpIGNvbnN0IHsgcmV0dXJuIE51bUJpdHM7IH0KKworICBJbml0ICpjb252ZXJ0SW5pdGlhbGl6ZXJUbyhSZWNUeSAqVHkpIGNvbnN0IG92ZXJyaWRlOworICBJbml0ICpjb252ZXJ0SW5pdGlhbGl6ZXJCaXRSYW5nZShBcnJheVJlZjx1bnNpZ25lZD4gQml0cykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBpc0NvbXBsZXRlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGZvciAodW5zaWduZWQgaSA9IDA7IGkgIT0gZ2V0TnVtQml0cygpOyArK2kpCisgICAgICBpZiAoIWdldEJpdChpKS0+aXNDb21wbGV0ZSgpKSByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBib29sIGFsbEluQ29tcGxldGUoKSBjb25zdCB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSAhPSBnZXROdW1CaXRzKCk7ICsraSkKKyAgICAgIGlmIChnZXRCaXQoaSktPmlzQ29tcGxldGUoKSkgcmV0dXJuIGZhbHNlOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgYm9vbCBpc0NvbmNyZXRlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgSW5pdCAqcmVzb2x2ZVJlZmVyZW5jZXMoUmVzb2x2ZXIgJlIpIGNvbnN0IG92ZXJyaWRlOworCisgIEluaXQgKmdldEJpdCh1bnNpZ25lZCBCaXQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBhc3NlcnQoQml0IDwgTnVtQml0cyAmJiAiQml0IGluZGV4IG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPEluaXQgKj4oKVtCaXRdOworICB9Cit9OworCisvLy8gJzcnIC0gUmVwcmVzZW50IGFuIGluaXRpYWxpemF0aW9uIGJ5IGEgbGl0ZXJhbCBpbnRlZ2VyIHZhbHVlLgorY2xhc3MgSW50SW5pdCA6IHB1YmxpYyBUeXBlZEluaXQgeworICBpbnQ2NF90IFZhbHVlOworCisgIGV4cGxpY2l0IEludEluaXQoaW50NjRfdCBWKQorICAgIDogVHlwZWRJbml0KElLX0ludEluaXQsIEludFJlY1R5OjpnZXQoKSksIFZhbHVlKFYpIHt9CisKK3B1YmxpYzoKKyAgSW50SW5pdChjb25zdCBJbnRJbml0ICYpID0gZGVsZXRlOworICBJbnRJbml0ICZvcGVyYXRvcj0oY29uc3QgSW50SW5pdCAmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluaXQgKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0S2luZCgpID09IElLX0ludEluaXQ7CisgIH0KKworICBzdGF0aWMgSW50SW5pdCAqZ2V0KGludDY0X3QgVik7CisKKyAgaW50NjRfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgSW5pdCAqY29udmVydEluaXRpYWxpemVyVG8oUmVjVHkgKlR5KSBjb25zdCBvdmVycmlkZTsKKyAgSW5pdCAqY29udmVydEluaXRpYWxpemVyQml0UmFuZ2UoQXJyYXlSZWY8dW5zaWduZWQ+IEJpdHMpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgaXNDb25jcmV0ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKworICBJbml0ICpnZXRCaXQodW5zaWduZWQgQml0KSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIEJpdEluaXQ6OmdldCgoVmFsdWUgJiAoMVVMTCA8PCBCaXQpKSAhPSAwKTsKKyAgfQorfTsKKworLy8vICJmb28iIC0gUmVwcmVzZW50IGFuIGluaXRpYWxpemF0aW9uIGJ5IGEgc3RyaW5nIHZhbHVlLgorY2xhc3MgU3RyaW5nSW5pdCA6IHB1YmxpYyBUeXBlZEluaXQgeworICBTdHJpbmdSZWYgVmFsdWU7CisKKyAgZXhwbGljaXQgU3RyaW5nSW5pdChTdHJpbmdSZWYgVikKKyAgICAgIDogVHlwZWRJbml0KElLX1N0cmluZ0luaXQsIFN0cmluZ1JlY1R5OjpnZXQoKSksIFZhbHVlKFYpIHt9CisKK3B1YmxpYzoKKyAgU3RyaW5nSW5pdChjb25zdCBTdHJpbmdJbml0ICYpID0gZGVsZXRlOworICBTdHJpbmdJbml0ICZvcGVyYXRvcj0oY29uc3QgU3RyaW5nSW5pdCAmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluaXQgKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0S2luZCgpID09IElLX1N0cmluZ0luaXQ7CisgIH0KKworICBzdGF0aWMgU3RyaW5nSW5pdCAqZ2V0KFN0cmluZ1JlZik7CisKKyAgU3RyaW5nUmVmIGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKworICBJbml0ICpjb252ZXJ0SW5pdGlhbGl6ZXJUbyhSZWNUeSAqVHkpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgaXNDb25jcmV0ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIHRydWU7IH0KKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiAiXCIiICsgVmFsdWUuc3RyKCkgKyAiXCIiOyB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0QXNVbnF1b3RlZFN0cmluZygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgSW5pdCAqZ2V0Qml0KHVuc2lnbmVkIEJpdCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIklsbGVnYWwgYml0IHJlZmVyZW5jZSBvZmYgc3RyaW5nIik7CisgIH0KK307CisKK2NsYXNzIENvZGVJbml0IDogcHVibGljIFR5cGVkSW5pdCB7CisgIFN0cmluZ1JlZiBWYWx1ZTsKKworICBleHBsaWNpdCBDb2RlSW5pdChTdHJpbmdSZWYgVikKKyAgICAgIDogVHlwZWRJbml0KElLX0NvZGVJbml0LCBzdGF0aWNfY2FzdDxSZWNUeSAqPihDb2RlUmVjVHk6OmdldCgpKSksCisgICAgICAgIFZhbHVlKFYpIHt9CisKK3B1YmxpYzoKKyAgQ29kZUluaXQoY29uc3QgU3RyaW5nSW5pdCAmKSA9IGRlbGV0ZTsKKyAgQ29kZUluaXQgJm9wZXJhdG9yPShjb25zdCBTdHJpbmdJbml0ICYpID0gZGVsZXRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5pdCAqSSkgeworICAgIHJldHVybiBJLT5nZXRLaW5kKCkgPT0gSUtfQ29kZUluaXQ7CisgIH0KKworICBzdGF0aWMgQ29kZUluaXQgKmdldChTdHJpbmdSZWYpOworCisgIFN0cmluZ1JlZiBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgSW5pdCAqY29udmVydEluaXRpYWxpemVyVG8oUmVjVHkgKlR5KSBjb25zdCBvdmVycmlkZTsKKworICBib29sIGlzQ29uY3JldGUoKSBjb25zdCBvdmVycmlkZSB7IHJldHVybiB0cnVlOyB9CisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiAiW3siICsgVmFsdWUuc3RyKCkgKyAifV0iOworICB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0QXNVbnF1b3RlZFN0cmluZygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIFZhbHVlOyB9CisKKyAgSW5pdCAqZ2V0Qml0KHVuc2lnbmVkIEJpdCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGxsdm1fdW5yZWFjaGFibGUoIklsbGVnYWwgYml0IHJlZmVyZW5jZSBvZmYgc3RyaW5nIik7CisgIH0KK307CisKKy8vLyBbQUwsIEFILCBDTF0gLSBSZXByZXNlbnQgYSBsaXN0IG9mIGRlZnMKKy8vLworY2xhc3MgTGlzdEluaXQgZmluYWwgOiBwdWJsaWMgVHlwZWRJbml0LCBwdWJsaWMgRm9sZGluZ1NldE5vZGUsCisgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBUcmFpbGluZ09iamVjdHM8TGlzdEluaXQsIEluaXQgKj4geworICB1bnNpZ25lZCBOdW1WYWx1ZXM7CisKK3B1YmxpYzoKKyAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBJbml0ICpjb25zdCAqOworCitwcml2YXRlOgorICBleHBsaWNpdCBMaXN0SW5pdCh1bnNpZ25lZCBOLCBSZWNUeSAqRWx0VHkpCisgICAgOiBUeXBlZEluaXQoSUtfTGlzdEluaXQsIExpc3RSZWNUeTo6Z2V0KEVsdFR5KSksIE51bVZhbHVlcyhOKSB7fQorCitwdWJsaWM6CisgIExpc3RJbml0KGNvbnN0IExpc3RJbml0ICYpID0gZGVsZXRlOworICBMaXN0SW5pdCAmb3BlcmF0b3I9KGNvbnN0IExpc3RJbml0ICYpID0gZGVsZXRlOworCisgIC8vIERvIG5vdCB1c2Ugc2l6ZWQgZGVhbGxvY2F0aW9uIGR1ZSB0byB0cmFpbGluZyBvYmplY3RzLgorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwKSB7IDo6b3BlcmF0b3IgZGVsZXRlKHApOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbml0ICpJKSB7CisgICAgcmV0dXJuIEktPmdldEtpbmQoKSA9PSBJS19MaXN0SW5pdDsKKyAgfQorICBzdGF0aWMgTGlzdEluaXQgKmdldChBcnJheVJlZjxJbml0ICo+IFJhbmdlLCBSZWNUeSAqRWx0VHkpOworCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Q7CisKKyAgSW5pdCAqZ2V0RWxlbWVudCh1bnNpZ25lZCBpKSBjb25zdCB7CisgICAgYXNzZXJ0KGkgPCBOdW1WYWx1ZXMgJiYgIkxpc3QgZWxlbWVudCBpbmRleCBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxJbml0ICo+KClbaV07CisgIH0KKyAgUmVjVHkgKmdldEVsZW1lbnRUeXBlKCkgY29uc3QgeworICAgIHJldHVybiBjYXN0PExpc3RSZWNUeT4oZ2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKTsKKyAgfQorCisgIFJlY29yZCAqZ2V0RWxlbWVudEFzUmVjb3JkKHVuc2lnbmVkIGkpIGNvbnN0OworCisgIEluaXQgKmNvbnZlcnRJbml0TGlzdFNsaWNlKEFycmF5UmVmPHVuc2lnbmVkPiBFbGVtZW50cykgY29uc3Qgb3ZlcnJpZGU7CisKKyAgSW5pdCAqY29udmVydEluaXRpYWxpemVyVG8oUmVjVHkgKlR5KSBjb25zdCBvdmVycmlkZTsKKworICAvLy8gVGhpcyBtZXRob2QgaXMgdXNlZCBieSBjbGFzc2VzIHRoYXQgcmVmZXIgdG8gb3RoZXIKKyAgLy8vIHZhcmlhYmxlcyB3aGljaCBtYXkgbm90IGJlIGRlZmluZWQgYXQgdGhlIHRpbWUgdGhleSBleHByZXNzaW9uIGlzIGZvcm1lZC4KKyAgLy8vIElmIGEgdmFsdWUgaXMgc2V0IGZvciB0aGUgdmFyaWFibGUgbGF0ZXIsIHRoaXMgbWV0aG9kIHdpbGwgYmUgY2FsbGVkIG9uCisgIC8vLyB1c2VycyBvZiB0aGUgdmFsdWUgdG8gYWxsb3cgdGhlIHZhbHVlIHRvIHByb3BhZ2F0ZSBvdXQuCisgIC8vLworICBJbml0ICpyZXNvbHZlUmVmZXJlbmNlcyhSZXNvbHZlciAmUikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBpc0NvbmNyZXRlKCkgY29uc3Qgb3ZlcnJpZGU7CisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgQXJyYXlSZWY8SW5pdCo+IGdldFZhbHVlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWFrZUFycmF5UmVmKGdldFRyYWlsaW5nT2JqZWN0czxJbml0ICo+KCksIE51bVZhbHVlcyk7CisgIH0KKworICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGdldFRyYWlsaW5nT2JqZWN0czxJbml0ICo+KCk7IH0KKyAgY29uc3RfaXRlcmF0b3IgZW5kICAoKSBjb25zdCB7IHJldHVybiBiZWdpbigpICsgTnVtVmFsdWVzOyB9CisKKyAgc2l6ZV90ICAgICAgICAgc2l6ZSAoKSBjb25zdCB7IHJldHVybiBOdW1WYWx1ZXM7ICB9CisgIGJvb2wgICAgICAgICAgIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gTnVtVmFsdWVzID09IDA7IH0KKworICBJbml0ICpnZXRCaXQodW5zaWduZWQgQml0KSBjb25zdCBvdmVycmlkZSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiSWxsZWdhbCBiaXQgcmVmZXJlbmNlIG9mZiBsaXN0Iik7CisgIH0KK307CisKKy8vLyBCYXNlIGNsYXNzIGZvciBvcGVyYXRvcnMKKy8vLworY2xhc3MgT3BJbml0IDogcHVibGljIFR5cGVkSW5pdCB7Citwcm90ZWN0ZWQ6CisgIGV4cGxpY2l0IE9wSW5pdChJbml0S2luZCBLLCBSZWNUeSAqVHlwZSwgdWludDhfdCBPcGMpCisgICAgOiBUeXBlZEluaXQoSywgVHlwZSwgT3BjKSB7fQorCitwdWJsaWM6CisgIE9wSW5pdChjb25zdCBPcEluaXQgJikgPSBkZWxldGU7CisgIE9wSW5pdCAmb3BlcmF0b3I9KE9wSW5pdCAmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluaXQgKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0S2luZCgpID49IElLX0ZpcnN0T3BJbml0ICYmCisgICAgICAgICAgIEktPmdldEtpbmQoKSA8PSBJS19MYXN0T3BJbml0OworICB9CisKKyAgLy8gQ2xvbmUgLSBDbG9uZSB0aGlzIG9wZXJhdG9yLCByZXBsYWNpbmcgYXJndW1lbnRzIHdpdGggdGhlIG5ldyBsaXN0CisgIHZpcnR1YWwgT3BJbml0ICpjbG9uZShBcnJheVJlZjxJbml0ICo+IE9wZXJhbmRzKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCB1bnNpZ25lZCBnZXROdW1PcGVyYW5kcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBJbml0ICpnZXRPcGVyYW5kKHVuc2lnbmVkIGkpIGNvbnN0ID0gMDsKKworICBJbml0ICpnZXRCaXQodW5zaWduZWQgQml0KSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vLyAhb3AgKFgpIC0gVHJhbnNmb3JtIGFuIGluaXQuCisvLy8KK2NsYXNzIFVuT3BJbml0IDogcHVibGljIE9wSW5pdCwgcHVibGljIEZvbGRpbmdTZXROb2RlIHsKK3B1YmxpYzoKKyAgZW51bSBVbmFyeU9wIDogdWludDhfdCB7IENBU1QsIEhFQUQsIFRBSUwsIFNJWkUsIEVNUFRZIH07CisKK3ByaXZhdGU6CisgIEluaXQgKkxIUzsKKworICBVbk9wSW5pdChVbmFyeU9wIG9wYywgSW5pdCAqbGhzLCBSZWNUeSAqVHlwZSkKKyAgICA6IE9wSW5pdChJS19Vbk9wSW5pdCwgVHlwZSwgb3BjKSwgTEhTKGxocykge30KKworcHVibGljOgorICBVbk9wSW5pdChjb25zdCBVbk9wSW5pdCAmKSA9IGRlbGV0ZTsKKyAgVW5PcEluaXQgJm9wZXJhdG9yPShjb25zdCBVbk9wSW5pdCAmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluaXQgKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0S2luZCgpID09IElLX1VuT3BJbml0OworICB9CisKKyAgc3RhdGljIFVuT3BJbml0ICpnZXQoVW5hcnlPcCBvcGMsIEluaXQgKmxocywgUmVjVHkgKlR5cGUpOworCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Q7CisKKyAgLy8gQ2xvbmUgLSBDbG9uZSB0aGlzIG9wZXJhdG9yLCByZXBsYWNpbmcgYXJndW1lbnRzIHdpdGggdGhlIG5ldyBsaXN0CisgIE9wSW5pdCAqY2xvbmUoQXJyYXlSZWY8SW5pdCAqPiBPcGVyYW5kcykgY29uc3Qgb3ZlcnJpZGUgeworICAgIGFzc2VydChPcGVyYW5kcy5zaXplKCkgPT0gMSAmJgorICAgICAgICAgICAiV3JvbmcgbnVtYmVyIG9mIG9wZXJhbmRzIGZvciB1bmFyeSBvcGVyYXRpb24iKTsKKyAgICByZXR1cm4gVW5PcEluaXQ6OmdldChnZXRPcGNvZGUoKSwgKk9wZXJhbmRzLmJlZ2luKCksIGdldFR5cGUoKSk7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIDE7IH0KKworICBJbml0ICpnZXRPcGVyYW5kKHVuc2lnbmVkIGkpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBhc3NlcnQoaSA9PSAwICYmICJJbnZhbGlkIG9wZXJhbmQgaWQgZm9yIHVuYXJ5IG9wZXJhdG9yIik7CisgICAgcmV0dXJuIGdldE9wZXJhbmQoKTsKKyAgfQorCisgIFVuYXJ5T3AgZ2V0T3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gKFVuYXJ5T3ApT3BjOyB9CisgIEluaXQgKmdldE9wZXJhbmQoKSBjb25zdCB7IHJldHVybiBMSFM7IH0KKworICAvLyBGb2xkIC0gSWYgcG9zc2libGUsIGZvbGQgdGhpcyB0byBhIHNpbXBsZXIgaW5pdC4gIFJldHVybiB0aGlzIGlmIG5vdAorICAvLyBwb3NzaWJsZSB0byBmb2xkLgorICBJbml0ICpGb2xkKFJlY29yZCAqQ3VyUmVjLCBib29sIElzRmluYWwgPSBmYWxzZSkgY29uc3Q7CisKKyAgSW5pdCAqcmVzb2x2ZVJlZmVyZW5jZXMoUmVzb2x2ZXIgJlIpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gIW9wIChYLCBZKSAtIENvbWJpbmUgdHdvIGluaXRzLgorY2xhc3MgQmluT3BJbml0IDogcHVibGljIE9wSW5pdCwgcHVibGljIEZvbGRpbmdTZXROb2RlIHsKK3B1YmxpYzoKKyAgZW51bSBCaW5hcnlPcCA6IHVpbnQ4X3QgeyBBREQsIEFORCwgT1IsIFNITCwgU1JBLCBTUkwsIExJU1RDT05DQVQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU1RSQ09OQ0FULCBDT05DQVQsIEVRLCBORSwgTEUsIExULCBHRSwgR1QgfTsKKworcHJpdmF0ZToKKyAgSW5pdCAqTEhTLCAqUkhTOworCisgIEJpbk9wSW5pdChCaW5hcnlPcCBvcGMsIEluaXQgKmxocywgSW5pdCAqcmhzLCBSZWNUeSAqVHlwZSkgOgorICAgICAgT3BJbml0KElLX0Jpbk9wSW5pdCwgVHlwZSwgb3BjKSwgTEhTKGxocyksIFJIUyhyaHMpIHt9CisKK3B1YmxpYzoKKyAgQmluT3BJbml0KGNvbnN0IEJpbk9wSW5pdCAmKSA9IGRlbGV0ZTsKKyAgQmluT3BJbml0ICZvcGVyYXRvcj0oY29uc3QgQmluT3BJbml0ICYpID0gZGVsZXRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5pdCAqSSkgeworICAgIHJldHVybiBJLT5nZXRLaW5kKCkgPT0gSUtfQmluT3BJbml0OworICB9CisKKyAgc3RhdGljIEJpbk9wSW5pdCAqZ2V0KEJpbmFyeU9wIG9wYywgSW5pdCAqbGhzLCBJbml0ICpyaHMsCisgICAgICAgICAgICAgICAgICAgICAgICBSZWNUeSAqVHlwZSk7CisgIHN0YXRpYyBJbml0ICpnZXRTdHJDb25jYXQoSW5pdCAqbGhzLCBJbml0ICpyaHMpOworCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Q7CisKKyAgLy8gQ2xvbmUgLSBDbG9uZSB0aGlzIG9wZXJhdG9yLCByZXBsYWNpbmcgYXJndW1lbnRzIHdpdGggdGhlIG5ldyBsaXN0CisgIE9wSW5pdCAqY2xvbmUoQXJyYXlSZWY8SW5pdCAqPiBPcGVyYW5kcykgY29uc3Qgb3ZlcnJpZGUgeworICAgIGFzc2VydChPcGVyYW5kcy5zaXplKCkgPT0gMiAmJgorICAgICAgICAgICAiV3JvbmcgbnVtYmVyIG9mIG9wZXJhbmRzIGZvciBiaW5hcnkgb3BlcmF0aW9uIik7CisgICAgcmV0dXJuIEJpbk9wSW5pdDo6Z2V0KGdldE9wY29kZSgpLCBPcGVyYW5kc1swXSwgT3BlcmFuZHNbMV0sIGdldFR5cGUoKSk7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kcygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIDI7IH0KKyAgSW5pdCAqZ2V0T3BlcmFuZCh1bnNpZ25lZCBpKSBjb25zdCBvdmVycmlkZSB7CisgICAgc3dpdGNoIChpKSB7CisgICAgZGVmYXVsdDogbGx2bV91bnJlYWNoYWJsZSgiSW52YWxpZCBvcGVyYW5kIGlkIGZvciBiaW5hcnkgb3BlcmF0b3IiKTsKKyAgICBjYXNlIDA6IHJldHVybiBnZXRMSFMoKTsKKyAgICBjYXNlIDE6IHJldHVybiBnZXRSSFMoKTsKKyAgICB9CisgIH0KKworICBCaW5hcnlPcCBnZXRPcGNvZGUoKSBjb25zdCB7IHJldHVybiAoQmluYXJ5T3ApT3BjOyB9CisgIEluaXQgKmdldExIUygpIGNvbnN0IHsgcmV0dXJuIExIUzsgfQorICBJbml0ICpnZXRSSFMoKSBjb25zdCB7IHJldHVybiBSSFM7IH0KKworICAvLyBGb2xkIC0gSWYgcG9zc2libGUsIGZvbGQgdGhpcyB0byBhIHNpbXBsZXIgaW5pdC4gIFJldHVybiB0aGlzIGlmIG5vdAorICAvLyBwb3NzaWJsZSB0byBmb2xkLgorICBJbml0ICpGb2xkKFJlY29yZCAqQ3VyUmVjKSBjb25zdDsKKworICBJbml0ICpyZXNvbHZlUmVmZXJlbmNlcyhSZXNvbHZlciAmUikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vLyAhb3AgKFgsIFksIFopIC0gQ29tYmluZSB0d28gaW5pdHMuCitjbGFzcyBUZXJuT3BJbml0IDogcHVibGljIE9wSW5pdCwgcHVibGljIEZvbGRpbmdTZXROb2RlIHsKK3B1YmxpYzoKKyAgZW51bSBUZXJuYXJ5T3AgOiB1aW50OF90IHsgU1VCU1QsIEZPUkVBQ0gsIElGLCBEQUcgfTsKKworcHJpdmF0ZToKKyAgSW5pdCAqTEhTLCAqTUhTLCAqUkhTOworCisgIFRlcm5PcEluaXQoVGVybmFyeU9wIG9wYywgSW5pdCAqbGhzLCBJbml0ICptaHMsIEluaXQgKnJocywKKyAgICAgICAgICAgICBSZWNUeSAqVHlwZSkgOgorICAgICAgT3BJbml0KElLX1Rlcm5PcEluaXQsIFR5cGUsIG9wYyksIExIUyhsaHMpLCBNSFMobWhzKSwgUkhTKHJocykge30KKworcHVibGljOgorICBUZXJuT3BJbml0KGNvbnN0IFRlcm5PcEluaXQgJikgPSBkZWxldGU7CisgIFRlcm5PcEluaXQgJm9wZXJhdG9yPShjb25zdCBUZXJuT3BJbml0ICYpID0gZGVsZXRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5pdCAqSSkgeworICAgIHJldHVybiBJLT5nZXRLaW5kKCkgPT0gSUtfVGVybk9wSW5pdDsKKyAgfQorCisgIHN0YXRpYyBUZXJuT3BJbml0ICpnZXQoVGVybmFyeU9wIG9wYywgSW5pdCAqbGhzLAorICAgICAgICAgICAgICAgICAgICAgICAgIEluaXQgKm1ocywgSW5pdCAqcmhzLAorICAgICAgICAgICAgICAgICAgICAgICAgIFJlY1R5ICpUeXBlKTsKKworICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OworCisgIC8vIENsb25lIC0gQ2xvbmUgdGhpcyBvcGVyYXRvciwgcmVwbGFjaW5nIGFyZ3VtZW50cyB3aXRoIHRoZSBuZXcgbGlzdAorICBPcEluaXQgKmNsb25lKEFycmF5UmVmPEluaXQgKj4gT3BlcmFuZHMpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBhc3NlcnQoT3BlcmFuZHMuc2l6ZSgpID09IDMgJiYKKyAgICAgICAgICAgIldyb25nIG51bWJlciBvZiBvcGVyYW5kcyBmb3IgdGVybmFyeSBvcGVyYXRpb24iKTsKKyAgICByZXR1cm4gVGVybk9wSW5pdDo6Z2V0KGdldE9wY29kZSgpLCBPcGVyYW5kc1swXSwgT3BlcmFuZHNbMV0sIE9wZXJhbmRzWzJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VHlwZSgpKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bU9wZXJhbmRzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gMzsgfQorICBJbml0ICpnZXRPcGVyYW5kKHVuc2lnbmVkIGkpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICBkZWZhdWx0OiBsbHZtX3VucmVhY2hhYmxlKCJJbnZhbGlkIG9wZXJhbmQgaWQgZm9yIHRlcm5hcnkgb3BlcmF0b3IiKTsKKyAgICBjYXNlIDA6IHJldHVybiBnZXRMSFMoKTsKKyAgICBjYXNlIDE6IHJldHVybiBnZXRNSFMoKTsKKyAgICBjYXNlIDI6IHJldHVybiBnZXRSSFMoKTsKKyAgICB9CisgIH0KKworICBUZXJuYXJ5T3AgZ2V0T3Bjb2RlKCkgY29uc3QgeyByZXR1cm4gKFRlcm5hcnlPcClPcGM7IH0KKyAgSW5pdCAqZ2V0TEhTKCkgY29uc3QgeyByZXR1cm4gTEhTOyB9CisgIEluaXQgKmdldE1IUygpIGNvbnN0IHsgcmV0dXJuIE1IUzsgfQorICBJbml0ICpnZXRSSFMoKSBjb25zdCB7IHJldHVybiBSSFM7IH0KKworICAvLyBGb2xkIC0gSWYgcG9zc2libGUsIGZvbGQgdGhpcyB0byBhIHNpbXBsZXIgaW5pdC4gIFJldHVybiB0aGlzIGlmIG5vdAorICAvLyBwb3NzaWJsZSB0byBmb2xkLgorICBJbml0ICpGb2xkKFJlY29yZCAqQ3VyUmVjKSBjb25zdDsKKworICBib29sIGlzQ29tcGxldGUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIExIUy0+aXNDb21wbGV0ZSgpICYmIE1IUy0+aXNDb21wbGV0ZSgpICYmIFJIUy0+aXNDb21wbGV0ZSgpOworICB9CisKKyAgSW5pdCAqcmVzb2x2ZVJlZmVyZW5jZXMoUmVzb2x2ZXIgJlIpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gIWZvbGRsIChhLCBiLCBleHByLCBzdGFydCwgbHN0KSAtIEZvbGQgb3ZlciBhIGxpc3QuCitjbGFzcyBGb2xkT3BJbml0IDogcHVibGljIFR5cGVkSW5pdCwgcHVibGljIEZvbGRpbmdTZXROb2RlIHsKK3ByaXZhdGU6CisgIEluaXQgKlN0YXJ0OworICBJbml0ICpMaXN0OworICBJbml0ICpBOworICBJbml0ICpCOworICBJbml0ICpFeHByOworCisgIEZvbGRPcEluaXQoSW5pdCAqU3RhcnQsIEluaXQgKkxpc3QsIEluaXQgKkEsIEluaXQgKkIsIEluaXQgKkV4cHIsIFJlY1R5ICpUeXBlKQorICAgICAgOiBUeXBlZEluaXQoSUtfRm9sZE9wSW5pdCwgVHlwZSksIFN0YXJ0KFN0YXJ0KSwgTGlzdChMaXN0KSwgQShBKSwgQihCKSwKKyAgICAgICAgRXhwcihFeHByKSB7fQorCitwdWJsaWM6CisgIEZvbGRPcEluaXQoY29uc3QgRm9sZE9wSW5pdCAmKSA9IGRlbGV0ZTsKKyAgRm9sZE9wSW5pdCAmb3BlcmF0b3I9KGNvbnN0IEZvbGRPcEluaXQgJikgPSBkZWxldGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbml0ICpJKSB7IHJldHVybiBJLT5nZXRLaW5kKCkgPT0gSUtfRm9sZE9wSW5pdDsgfQorCisgIHN0YXRpYyBGb2xkT3BJbml0ICpnZXQoSW5pdCAqU3RhcnQsIEluaXQgKkxpc3QsIEluaXQgKkEsIEluaXQgKkIsIEluaXQgKkV4cHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVjVHkgKlR5cGUpOworCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Q7CisKKyAgLy8gRm9sZCAtIElmIHBvc3NpYmxlLCBmb2xkIHRoaXMgdG8gYSBzaW1wbGVyIGluaXQuICBSZXR1cm4gdGhpcyBpZiBub3QKKyAgLy8gcG9zc2libGUgdG8gZm9sZC4KKyAgSW5pdCAqRm9sZChSZWNvcmQgKkN1clJlYykgY29uc3Q7CisKKyAgYm9vbCBpc0NvbXBsZXRlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gZmFsc2U7IH0KKworICBJbml0ICpyZXNvbHZlUmVmZXJlbmNlcyhSZXNvbHZlciAmUikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgSW5pdCAqZ2V0Qml0KHVuc2lnbmVkIEJpdCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKK307CisKKy8vLyAhaXNhPHR5cGU+KGV4cHIpIC0gRHluYW1pY2FsbHkgZGV0ZXJtaW5lIHRoZSB0eXBlIG9mIGFuIGV4cHJlc3Npb24uCitjbGFzcyBJc0FPcEluaXQgOiBwdWJsaWMgVHlwZWRJbml0LCBwdWJsaWMgRm9sZGluZ1NldE5vZGUgeworcHJpdmF0ZToKKyAgUmVjVHkgKkNoZWNrVHlwZTsKKyAgSW5pdCAqRXhwcjsKKworICBJc0FPcEluaXQoUmVjVHkgKkNoZWNrVHlwZSwgSW5pdCAqRXhwcikKKyAgICAgIDogVHlwZWRJbml0KElLX0lzQU9wSW5pdCwgSW50UmVjVHk6OmdldCgpKSwgQ2hlY2tUeXBlKENoZWNrVHlwZSksCisgICAgICAgIEV4cHIoRXhwcikge30KKworcHVibGljOgorICBJc0FPcEluaXQoY29uc3QgSXNBT3BJbml0ICYpID0gZGVsZXRlOworICBJc0FPcEluaXQgJm9wZXJhdG9yPShjb25zdCBJc0FPcEluaXQgJikgPSBkZWxldGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbml0ICpJKSB7IHJldHVybiBJLT5nZXRLaW5kKCkgPT0gSUtfSXNBT3BJbml0OyB9CisKKyAgc3RhdGljIElzQU9wSW5pdCAqZ2V0KFJlY1R5ICpDaGVja1R5cGUsIEluaXQgKkV4cHIpOworCisgIHZvaWQgUHJvZmlsZShGb2xkaW5nU2V0Tm9kZUlEICZJRCkgY29uc3Q7CisKKyAgLy8gRm9sZCAtIElmIHBvc3NpYmxlLCBmb2xkIHRoaXMgdG8gYSBzaW1wbGVyIGluaXQuICBSZXR1cm4gdGhpcyBpZiBub3QKKyAgLy8gcG9zc2libGUgdG8gZm9sZC4KKyAgSW5pdCAqRm9sZCgpIGNvbnN0OworCisgIGJvb2wgaXNDb21wbGV0ZSgpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgSW5pdCAqcmVzb2x2ZVJlZmVyZW5jZXMoUmVzb2x2ZXIgJlIpIGNvbnN0IG92ZXJyaWRlOworCisgIEluaXQgKmdldEJpdCh1bnNpZ25lZCBCaXQpIGNvbnN0IG92ZXJyaWRlOworCisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gJ09wY29kZScgLSBSZXByZXNlbnQgYSByZWZlcmVuY2UgdG8gYW4gZW50aXJlIHZhcmlhYmxlIG9iamVjdC4KK2NsYXNzIFZhckluaXQgOiBwdWJsaWMgVHlwZWRJbml0IHsKKyAgSW5pdCAqVmFyTmFtZTsKKworICBleHBsaWNpdCBWYXJJbml0KEluaXQgKlZOLCBSZWNUeSAqVCkKKyAgICAgIDogVHlwZWRJbml0KElLX1ZhckluaXQsIFQpLCBWYXJOYW1lKFZOKSB7fQorCitwdWJsaWM6CisgIFZhckluaXQoY29uc3QgVmFySW5pdCAmKSA9IGRlbGV0ZTsKKyAgVmFySW5pdCAmb3BlcmF0b3I9KGNvbnN0IFZhckluaXQgJikgPSBkZWxldGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbml0ICpJKSB7CisgICAgcmV0dXJuIEktPmdldEtpbmQoKSA9PSBJS19WYXJJbml0OworICB9CisKKyAgc3RhdGljIFZhckluaXQgKmdldChTdHJpbmdSZWYgVk4sIFJlY1R5ICpUKTsKKyAgc3RhdGljIFZhckluaXQgKmdldChJbml0ICpWTiwgUmVjVHkgKlQpOworCisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3Q7CisgIEluaXQgKmdldE5hbWVJbml0KCkgY29uc3QgeyByZXR1cm4gVmFyTmFtZTsgfQorCisgIHN0ZDo6c3RyaW5nIGdldE5hbWVJbml0QXNTdHJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIGdldE5hbWVJbml0KCktPmdldEFzVW5xdW90ZWRTdHJpbmcoKTsKKyAgfQorCisgIC8vLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IGNsYXNzZXMgdGhhdCByZWZlciB0byBvdGhlcgorICAvLy8gdmFyaWFibGVzIHdoaWNoIG1heSBub3QgYmUgZGVmaW5lZCBhdCB0aGUgdGltZSB0aGV5IGV4cHJlc3Npb24gaXMgZm9ybWVkLgorICAvLy8gSWYgYSB2YWx1ZSBpcyBzZXQgZm9yIHRoZSB2YXJpYWJsZSBsYXRlciwgdGhpcyBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgb24KKyAgLy8vIHVzZXJzIG9mIHRoZSB2YWx1ZSB0byBhbGxvdyB0aGUgdmFsdWUgdG8gcHJvcGFnYXRlIG91dC4KKyAgLy8vCisgIEluaXQgKnJlc29sdmVSZWZlcmVuY2VzKFJlc29sdmVyICZSKSBjb25zdCBvdmVycmlkZTsKKworICBJbml0ICpnZXRCaXQodW5zaWduZWQgQml0KSBjb25zdCBvdmVycmlkZTsKKworICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlIHsgcmV0dXJuIGdldE5hbWUoKTsgfQorfTsKKworLy8vIE9wY29kZXswfSAtIFJlcHJlc2VudCBhY2Nlc3MgdG8gb25lIGJpdCBvZiBhIHZhcmlhYmxlIG9yIGZpZWxkLgorY2xhc3MgVmFyQml0SW5pdCBmaW5hbCA6IHB1YmxpYyBUeXBlZEluaXQgeworICBUeXBlZEluaXQgKlRJOworICB1bnNpZ25lZCBCaXQ7CisKKyAgVmFyQml0SW5pdChUeXBlZEluaXQgKlQsIHVuc2lnbmVkIEIpCisgICAgICA6IFR5cGVkSW5pdChJS19WYXJCaXRJbml0LCBCaXRSZWNUeTo6Z2V0KCkpLCBUSShUKSwgQml0KEIpIHsKKyAgICBhc3NlcnQoVC0+Z2V0VHlwZSgpICYmCisgICAgICAgICAgIChpc2E8SW50UmVjVHk+KFQtPmdldFR5cGUoKSkgfHwKKyAgICAgICAgICAgIChpc2E8Qml0c1JlY1R5PihULT5nZXRUeXBlKCkpICYmCisgICAgICAgICAgICAgY2FzdDxCaXRzUmVjVHk+KFQtPmdldFR5cGUoKSktPmdldE51bUJpdHMoKSA+IEIpKSAmJgorICAgICAgICAgICAiSWxsZWdhbCBWYXJCaXRJbml0IGV4cHJlc3Npb24hIik7CisgIH0KKworcHVibGljOgorICBWYXJCaXRJbml0KGNvbnN0IFZhckJpdEluaXQgJikgPSBkZWxldGU7CisgIFZhckJpdEluaXQgJm9wZXJhdG9yPShjb25zdCBWYXJCaXRJbml0ICYpID0gZGVsZXRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5pdCAqSSkgeworICAgIHJldHVybiBJLT5nZXRLaW5kKCkgPT0gSUtfVmFyQml0SW5pdDsKKyAgfQorCisgIHN0YXRpYyBWYXJCaXRJbml0ICpnZXQoVHlwZWRJbml0ICpULCB1bnNpZ25lZCBCKTsKKworICBJbml0ICpnZXRCaXRWYXIoKSBjb25zdCB7IHJldHVybiBUSTsgfQorICB1bnNpZ25lZCBnZXRCaXROdW0oKSBjb25zdCB7IHJldHVybiBCaXQ7IH0KKworICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworICBJbml0ICpyZXNvbHZlUmVmZXJlbmNlcyhSZXNvbHZlciAmUikgY29uc3Qgb3ZlcnJpZGU7CisKKyAgSW5pdCAqZ2V0Qml0KHVuc2lnbmVkIEIpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBhc3NlcnQoQiA8IDEgJiYgIkJpdCBpbmRleCBvdXQgb2YgcmFuZ2UhIik7CisgICAgcmV0dXJuIGNvbnN0X2Nhc3Q8VmFyQml0SW5pdCo+KHRoaXMpOworICB9Cit9OworCisvLy8gTGlzdFs0XSAtIFJlcHJlc2VudCBhY2Nlc3MgdG8gb25lIGVsZW1lbnQgb2YgYSB2YXIgb3IKKy8vLyBmaWVsZC4KK2NsYXNzIFZhckxpc3RFbGVtZW50SW5pdCA6IHB1YmxpYyBUeXBlZEluaXQgeworICBUeXBlZEluaXQgKlRJOworICB1bnNpZ25lZCBFbGVtZW50OworCisgIFZhckxpc3RFbGVtZW50SW5pdChUeXBlZEluaXQgKlQsIHVuc2lnbmVkIEUpCisgICAgICA6IFR5cGVkSW5pdChJS19WYXJMaXN0RWxlbWVudEluaXQsCisgICAgICAgICAgICAgICAgICBjYXN0PExpc3RSZWNUeT4oVC0+Z2V0VHlwZSgpKS0+Z2V0RWxlbWVudFR5cGUoKSksCisgICAgICAgIFRJKFQpLCBFbGVtZW50KEUpIHsKKyAgICBhc3NlcnQoVC0+Z2V0VHlwZSgpICYmIGlzYTxMaXN0UmVjVHk+KFQtPmdldFR5cGUoKSkgJiYKKyAgICAgICAgICAgIklsbGVnYWwgVmFyQml0SW5pdCBleHByZXNzaW9uISIpOworICB9CisKK3B1YmxpYzoKKyAgVmFyTGlzdEVsZW1lbnRJbml0KGNvbnN0IFZhckxpc3RFbGVtZW50SW5pdCAmKSA9IGRlbGV0ZTsKKyAgVmFyTGlzdEVsZW1lbnRJbml0ICZvcGVyYXRvcj0oY29uc3QgVmFyTGlzdEVsZW1lbnRJbml0ICYpID0gZGVsZXRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5pdCAqSSkgeworICAgIHJldHVybiBJLT5nZXRLaW5kKCkgPT0gSUtfVmFyTGlzdEVsZW1lbnRJbml0OworICB9CisKKyAgc3RhdGljIFZhckxpc3RFbGVtZW50SW5pdCAqZ2V0KFR5cGVkSW5pdCAqVCwgdW5zaWduZWQgRSk7CisKKyAgVHlwZWRJbml0ICpnZXRWYXJpYWJsZSgpIGNvbnN0IHsgcmV0dXJuIFRJOyB9CisgIHVuc2lnbmVkIGdldEVsZW1lbnROdW0oKSBjb25zdCB7IHJldHVybiBFbGVtZW50OyB9CisKKyAgc3RkOjpzdHJpbmcgZ2V0QXNTdHJpbmcoKSBjb25zdCBvdmVycmlkZTsKKyAgSW5pdCAqcmVzb2x2ZVJlZmVyZW5jZXMoUmVzb2x2ZXIgJlIpIGNvbnN0IG92ZXJyaWRlOworCisgIEluaXQgKmdldEJpdCh1bnNpZ25lZCBCaXQpIGNvbnN0IG92ZXJyaWRlOworfTsKKworLy8vIEFMIC0gUmVwcmVzZW50IGEgcmVmZXJlbmNlIHRvIGEgJ2RlZicgaW4gdGhlIGRlc2NyaXB0aW9uCitjbGFzcyBEZWZJbml0IDogcHVibGljIFR5cGVkSW5pdCB7CisgIGZyaWVuZCBjbGFzcyBSZWNvcmQ7CisKKyAgUmVjb3JkICpEZWY7CisKKyAgZXhwbGljaXQgRGVmSW5pdChSZWNvcmQgKkQpOworCitwdWJsaWM6CisgIERlZkluaXQoY29uc3QgRGVmSW5pdCAmKSA9IGRlbGV0ZTsKKyAgRGVmSW5pdCAmb3BlcmF0b3I9KGNvbnN0IERlZkluaXQgJikgPSBkZWxldGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbml0ICpJKSB7CisgICAgcmV0dXJuIEktPmdldEtpbmQoKSA9PSBJS19EZWZJbml0OworICB9CisKKyAgc3RhdGljIERlZkluaXQgKmdldChSZWNvcmQqKTsKKworICBJbml0ICpjb252ZXJ0SW5pdGlhbGl6ZXJUbyhSZWNUeSAqVHkpIGNvbnN0IG92ZXJyaWRlOworCisgIFJlY29yZCAqZ2V0RGVmKCkgY29uc3QgeyByZXR1cm4gRGVmOyB9CisKKyAgLy92aXJ0dWFsIEluaXQgKmNvbnZlcnRJbml0aWFsaXplckJpdFJhbmdlKEFycmF5UmVmPHVuc2lnbmVkPiBCaXRzKTsKKworICBSZWNUeSAqZ2V0RmllbGRUeXBlKFN0cmluZ0luaXQgKkZpZWxkTmFtZSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgYm9vbCBpc0NvbmNyZXRlKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworCisgIEluaXQgKmdldEJpdCh1bnNpZ25lZCBCaXQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbGxlZ2FsIGJpdCByZWZlcmVuY2Ugb2ZmIGRlZiIpOworICB9Cit9OworCisvLy8gY2xhc3NuYW1lPHRhcmdzLi4uPiAtIFJlcHJlc2VudCBhbiB1bmluc3RhbnRpYXRlZCBhbm9ueW1vdXMgY2xhc3MKKy8vLyBpbnN0YW50aWF0aW9uLgorY2xhc3MgVmFyRGVmSW5pdCBmaW5hbCA6IHB1YmxpYyBUeXBlZEluaXQsIHB1YmxpYyBGb2xkaW5nU2V0Tm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVHJhaWxpbmdPYmplY3RzPFZhckRlZkluaXQsIEluaXQgKj4geworICBSZWNvcmQgKkNsYXNzOworICBEZWZJbml0ICpEZWYgPSBudWxscHRyOyAvLyBhZnRlciBpbnN0YW50aWF0aW9uCisgIHVuc2lnbmVkIE51bUFyZ3M7CisKKyAgZXhwbGljaXQgVmFyRGVmSW5pdChSZWNvcmQgKkNsYXNzLCB1bnNpZ25lZCBOKQorICAgIDogVHlwZWRJbml0KElLX1ZhckRlZkluaXQsIFJlY29yZFJlY1R5OjpnZXQoQ2xhc3MpKSwgQ2xhc3MoQ2xhc3MpLCBOdW1BcmdzKE4pIHt9CisKKyAgRGVmSW5pdCAqaW5zdGFudGlhdGUoKTsKKworcHVibGljOgorICBWYXJEZWZJbml0KGNvbnN0IFZhckRlZkluaXQgJikgPSBkZWxldGU7CisgIFZhckRlZkluaXQgJm9wZXJhdG9yPShjb25zdCBWYXJEZWZJbml0ICYpID0gZGVsZXRlOworCisgIC8vIERvIG5vdCB1c2Ugc2l6ZWQgZGVhbGxvY2F0aW9uIGR1ZSB0byB0cmFpbGluZyBvYmplY3RzLgorICB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkICpwKSB7IDo6b3BlcmF0b3IgZGVsZXRlKHApOyB9CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBJbml0ICpJKSB7CisgICAgcmV0dXJuIEktPmdldEtpbmQoKSA9PSBJS19WYXJEZWZJbml0OworICB9CisgIHN0YXRpYyBWYXJEZWZJbml0ICpnZXQoUmVjb3JkICpDbGFzcywgQXJyYXlSZWY8SW5pdCAqPiBBcmdzKTsKKworICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OworCisgIEluaXQgKnJlc29sdmVSZWZlcmVuY2VzKFJlc29sdmVyICZSKSBjb25zdCBvdmVycmlkZTsKKyAgSW5pdCAqRm9sZCgpIGNvbnN0OworCisgIHN0ZDo6c3RyaW5nIGdldEFzU3RyaW5nKCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgSW5pdCAqZ2V0QXJnKHVuc2lnbmVkIGkpIGNvbnN0IHsKKyAgICBhc3NlcnQoaSA8IE51bUFyZ3MgJiYgIkFyZ3VtZW50IGluZGV4IG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPEluaXQgKj4oKVtpXTsKKyAgfQorCisgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gSW5pdCAqY29uc3QgKjsKKworICBjb25zdF9pdGVyYXRvciBhcmdzX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPEluaXQgKj4oKTsgfQorICBjb25zdF9pdGVyYXRvciBhcmdzX2VuZCAgKCkgY29uc3QgeyByZXR1cm4gYXJnc19iZWdpbigpICsgTnVtQXJnczsgfQorCisgIHNpemVfdCAgICAgICAgIGFyZ3Nfc2l6ZSAoKSBjb25zdCB7IHJldHVybiBOdW1BcmdzOyB9CisgIGJvb2wgICAgICAgICAgIGFyZ3NfZW1wdHkoKSBjb25zdCB7IHJldHVybiBOdW1BcmdzID09IDA7IH0KKworICBBcnJheVJlZjxJbml0ICo+IGFyZ3MoKSBjb25zdCB7IHJldHVybiBtYWtlQXJyYXlSZWYoYXJnc19iZWdpbigpLCBOdW1BcmdzKTsgfQorCisgIEluaXQgKmdldEJpdCh1bnNpZ25lZCBCaXQpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBsbHZtX3VucmVhY2hhYmxlKCJJbGxlZ2FsIGJpdCByZWZlcmVuY2Ugb2ZmIGFub255bW91cyBkZWYiKTsKKyAgfQorfTsKKworLy8vIFguWSAtIFJlcHJlc2VudCBhIHJlZmVyZW5jZSB0byBhIHN1YmZpZWxkIG9mIGEgdmFyaWFibGUKK2NsYXNzIEZpZWxkSW5pdCA6IHB1YmxpYyBUeXBlZEluaXQgeworICBJbml0ICpSZWM7ICAgICAgICAgICAgICAgIC8vIFJlY29yZCB3ZSBhcmUgcmVmZXJyaW5nIHRvCisgIFN0cmluZ0luaXQgKkZpZWxkTmFtZTsgICAgLy8gRmllbGQgd2UgYXJlIGFjY2Vzc2luZworCisgIEZpZWxkSW5pdChJbml0ICpSLCBTdHJpbmdJbml0ICpGTikKKyAgICAgIDogVHlwZWRJbml0KElLX0ZpZWxkSW5pdCwgUi0+Z2V0RmllbGRUeXBlKEZOKSksIFJlYyhSKSwgRmllbGROYW1lKEZOKSB7CisgICAgYXNzZXJ0KGdldFR5cGUoKSAmJiAiRmllbGRJbml0IHdpdGggbm9uLXJlY29yZCB0eXBlISIpOworICB9CisKK3B1YmxpYzoKKyAgRmllbGRJbml0KGNvbnN0IEZpZWxkSW5pdCAmKSA9IGRlbGV0ZTsKKyAgRmllbGRJbml0ICZvcGVyYXRvcj0oY29uc3QgRmllbGRJbml0ICYpID0gZGVsZXRlOworCisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgSW5pdCAqSSkgeworICAgIHJldHVybiBJLT5nZXRLaW5kKCkgPT0gSUtfRmllbGRJbml0OworICB9CisKKyAgc3RhdGljIEZpZWxkSW5pdCAqZ2V0KEluaXQgKlIsIFN0cmluZ0luaXQgKkZOKTsKKworICBJbml0ICpnZXRSZWNvcmQoKSBjb25zdCB7IHJldHVybiBSZWM7IH0KKyAgU3RyaW5nSW5pdCAqZ2V0RmllbGROYW1lKCkgY29uc3QgeyByZXR1cm4gRmllbGROYW1lOyB9CisKKyAgSW5pdCAqZ2V0Qml0KHVuc2lnbmVkIEJpdCkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgSW5pdCAqcmVzb2x2ZVJlZmVyZW5jZXMoUmVzb2x2ZXIgJlIpIGNvbnN0IG92ZXJyaWRlOworICBJbml0ICpGb2xkKFJlY29yZCAqQ3VyUmVjKSBjb25zdDsKKworICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gUmVjLT5nZXRBc1N0cmluZygpICsgIi4iICsgRmllbGROYW1lLT5nZXRWYWx1ZSgpLnN0cigpOworICB9Cit9OworCisvLy8gKHYgYSwgYikgLSBSZXByZXNlbnQgYSBEQUcgdHJlZSB2YWx1ZS4gIERBRyBpbml0cyBhcmUgcmVxdWlyZWQKKy8vLyB0byBoYXZlIGF0IGxlYXN0IG9uZSB2YWx1ZSB0aGVuIGEgKHBvc3NpYmx5IGVtcHR5KSBsaXN0IG9mIGFyZ3VtZW50cy4gIEVhY2gKKy8vLyBhcmd1bWVudCBjYW4gaGF2ZSBhIG5hbWUgYXNzb2NpYXRlZCB3aXRoIGl0LgorY2xhc3MgRGFnSW5pdCBmaW5hbCA6IHB1YmxpYyBUeXBlZEluaXQsIHB1YmxpYyBGb2xkaW5nU2V0Tm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICBwdWJsaWMgVHJhaWxpbmdPYmplY3RzPERhZ0luaXQsIEluaXQgKiwgU3RyaW5nSW5pdCAqPiB7CisgIGZyaWVuZCBUcmFpbGluZ09iamVjdHM7CisKKyAgSW5pdCAqVmFsOworICBTdHJpbmdJbml0ICpWYWxOYW1lOworICB1bnNpZ25lZCBOdW1BcmdzOworICB1bnNpZ25lZCBOdW1BcmdOYW1lczsKKworICBEYWdJbml0KEluaXQgKlYsIFN0cmluZ0luaXQgKlZOLCB1bnNpZ25lZCBOdW1BcmdzLCB1bnNpZ25lZCBOdW1BcmdOYW1lcykKKyAgICAgIDogVHlwZWRJbml0KElLX0RhZ0luaXQsIERhZ1JlY1R5OjpnZXQoKSksIFZhbChWKSwgVmFsTmFtZShWTiksCisgICAgICAgIE51bUFyZ3MoTnVtQXJncyksIE51bUFyZ05hbWVzKE51bUFyZ05hbWVzKSB7fQorCisgIHNpemVfdCBudW1UcmFpbGluZ09iamVjdHMoT3ZlcmxvYWRUb2tlbjxJbml0ICo+KSBjb25zdCB7IHJldHVybiBOdW1BcmdzOyB9CisKK3B1YmxpYzoKKyAgRGFnSW5pdChjb25zdCBEYWdJbml0ICYpID0gZGVsZXRlOworICBEYWdJbml0ICZvcGVyYXRvcj0oY29uc3QgRGFnSW5pdCAmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEluaXQgKkkpIHsKKyAgICByZXR1cm4gSS0+Z2V0S2luZCgpID09IElLX0RhZ0luaXQ7CisgIH0KKworICBzdGF0aWMgRGFnSW5pdCAqZ2V0KEluaXQgKlYsIFN0cmluZ0luaXQgKlZOLCBBcnJheVJlZjxJbml0ICo+IEFyZ1JhbmdlLAorICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFN0cmluZ0luaXQqPiBOYW1lUmFuZ2UpOworICBzdGF0aWMgRGFnSW5pdCAqZ2V0KEluaXQgKlYsIFN0cmluZ0luaXQgKlZOLAorICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPHN0ZDo6cGFpcjxJbml0KiwgU3RyaW5nSW5pdCo+PiBBcmdzKTsKKworICB2b2lkIFByb2ZpbGUoRm9sZGluZ1NldE5vZGVJRCAmSUQpIGNvbnN0OworCisgIEluaXQgKmdldE9wZXJhdG9yKCkgY29uc3QgeyByZXR1cm4gVmFsOyB9CisKKyAgU3RyaW5nSW5pdCAqZ2V0TmFtZSgpIGNvbnN0IHsgcmV0dXJuIFZhbE5hbWU7IH0KKworICBTdHJpbmdSZWYgZ2V0TmFtZVN0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gVmFsTmFtZSA/IFZhbE5hbWUtPmdldFZhbHVlKCkgOiBTdHJpbmdSZWYoKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldE51bUFyZ3MoKSBjb25zdCB7IHJldHVybiBOdW1BcmdzOyB9CisKKyAgSW5pdCAqZ2V0QXJnKHVuc2lnbmVkIE51bSkgY29uc3QgeworICAgIGFzc2VydChOdW0gPCBOdW1BcmdzICYmICJBcmcgbnVtYmVyIG91dCBvZiByYW5nZSEiKTsKKyAgICByZXR1cm4gZ2V0VHJhaWxpbmdPYmplY3RzPEluaXQgKj4oKVtOdW1dOworICB9CisKKyAgU3RyaW5nSW5pdCAqZ2V0QXJnTmFtZSh1bnNpZ25lZCBOdW0pIGNvbnN0IHsKKyAgICBhc3NlcnQoTnVtIDwgTnVtQXJnTmFtZXMgJiYgIkFyZyBudW1iZXIgb3V0IG9mIHJhbmdlISIpOworICAgIHJldHVybiBnZXRUcmFpbGluZ09iamVjdHM8U3RyaW5nSW5pdCAqPigpW051bV07CisgIH0KKworICBTdHJpbmdSZWYgZ2V0QXJnTmFtZVN0cih1bnNpZ25lZCBOdW0pIGNvbnN0IHsKKyAgICBTdHJpbmdJbml0ICpJbml0ID0gZ2V0QXJnTmFtZShOdW0pOworICAgIHJldHVybiBJbml0ID8gSW5pdC0+Z2V0VmFsdWUoKSA6IFN0cmluZ1JlZigpOworICB9CisKKyAgQXJyYXlSZWY8SW5pdCAqPiBnZXRBcmdzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlQXJyYXlSZWYoZ2V0VHJhaWxpbmdPYmplY3RzPEluaXQgKj4oKSwgTnVtQXJncyk7CisgIH0KKworICBBcnJheVJlZjxTdHJpbmdJbml0ICo+IGdldEFyZ05hbWVzKCkgY29uc3QgeworICAgIHJldHVybiBtYWtlQXJyYXlSZWYoZ2V0VHJhaWxpbmdPYmplY3RzPFN0cmluZ0luaXQgKj4oKSwgTnVtQXJnTmFtZXMpOworICB9CisKKyAgSW5pdCAqcmVzb2x2ZVJlZmVyZW5jZXMoUmVzb2x2ZXIgJlIpIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgaXNDb25jcmV0ZSgpIGNvbnN0IG92ZXJyaWRlOworICBzdGQ6OnN0cmluZyBnZXRBc1N0cmluZygpIGNvbnN0IG92ZXJyaWRlOworCisgIHVzaW5nIGNvbnN0X2FyZ19pdGVyYXRvciA9IFNtYWxsVmVjdG9ySW1wbDxJbml0Kj46OmNvbnN0X2l0ZXJhdG9yOworICB1c2luZyBjb25zdF9uYW1lX2l0ZXJhdG9yID0gU21hbGxWZWN0b3JJbXBsPFN0cmluZ0luaXQqPjo6Y29uc3RfaXRlcmF0b3I7CisKKyAgaW5saW5lIGNvbnN0X2FyZ19pdGVyYXRvciAgYXJnX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gZ2V0QXJncygpLmJlZ2luKCk7IH0KKyAgaW5saW5lIGNvbnN0X2FyZ19pdGVyYXRvciAgYXJnX2VuZCAgKCkgY29uc3QgeyByZXR1cm4gZ2V0QXJncygpLmVuZCgpOyB9CisKKyAgaW5saW5lIHNpemVfdCAgICAgICAgICAgICAgYXJnX3NpemUgKCkgY29uc3QgeyByZXR1cm4gTnVtQXJnczsgfQorICBpbmxpbmUgYm9vbCAgICAgICAgICAgICAgICBhcmdfZW1wdHkoKSBjb25zdCB7IHJldHVybiBOdW1BcmdzID09IDA7IH0KKworICBpbmxpbmUgY29uc3RfbmFtZV9pdGVyYXRvciBuYW1lX2JlZ2luKCkgY29uc3QgeyByZXR1cm4gZ2V0QXJnTmFtZXMoKS5iZWdpbigpO30KKyAgaW5saW5lIGNvbnN0X25hbWVfaXRlcmF0b3IgbmFtZV9lbmQgICgpIGNvbnN0IHsgcmV0dXJuIGdldEFyZ05hbWVzKCkuZW5kKCk7IH0KKworICBpbmxpbmUgc2l6ZV90ICAgICAgICAgICAgICBuYW1lX3NpemUgKCkgY29uc3QgeyByZXR1cm4gTnVtQXJnTmFtZXM7IH0KKyAgaW5saW5lIGJvb2wgICAgICAgICAgICAgICAgbmFtZV9lbXB0eSgpIGNvbnN0IHsgcmV0dXJuIE51bUFyZ05hbWVzID09IDA7IH0KKworICBJbml0ICpnZXRCaXQodW5zaWduZWQgQml0KSBjb25zdCBvdmVycmlkZSB7CisgICAgbGx2bV91bnJlYWNoYWJsZSgiSWxsZWdhbCBiaXQgcmVmZXJlbmNlIG9mZiBkYWciKTsKKyAgfQorfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vICBIaWdoLUxldmVsIENsYXNzZXMKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIFJlY29yZFZhbCB7CisgIGZyaWVuZCBjbGFzcyBSZWNvcmQ7CisKKyAgSW5pdCAqTmFtZTsKKyAgUG9pbnRlckludFBhaXI8UmVjVHkgKiwgMSwgYm9vbD4gVHlBbmRQcmVmaXg7CisgIEluaXQgKlZhbHVlOworCitwdWJsaWM6CisgIFJlY29yZFZhbChJbml0ICpOLCBSZWNUeSAqVCwgYm9vbCBQKTsKKworICBTdHJpbmdSZWYgZ2V0TmFtZSgpIGNvbnN0OworICBJbml0ICpnZXROYW1lSW5pdCgpIGNvbnN0IHsgcmV0dXJuIE5hbWU7IH0KKworICBzdGQ6OnN0cmluZyBnZXROYW1lSW5pdEFzU3RyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBnZXROYW1lSW5pdCgpLT5nZXRBc1VucXVvdGVkU3RyaW5nKCk7CisgIH0KKworICBib29sIGdldFByZWZpeCgpIGNvbnN0IHsgcmV0dXJuIFR5QW5kUHJlZml4LmdldEludCgpOyB9CisgIFJlY1R5ICpnZXRUeXBlKCkgY29uc3QgeyByZXR1cm4gVHlBbmRQcmVmaXguZ2V0UG9pbnRlcigpOyB9CisgIEluaXQgKmdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gVmFsdWU7IH0KKworICBib29sIHNldFZhbHVlKEluaXQgKlYpOworCisgIHZvaWQgZHVtcCgpIGNvbnN0OworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUywgYm9vbCBQcmludFNlbSA9IHRydWUpIGNvbnN0OworfTsKKworaW5saW5lIHJhd19vc3RyZWFtICZvcGVyYXRvcjw8KHJhd19vc3RyZWFtICZPUywgY29uc3QgUmVjb3JkVmFsICZSVikgeworICBSVi5wcmludChPUyA8PCAiICAiKTsKKyAgcmV0dXJuIE9TOworfQorCitjbGFzcyBSZWNvcmQgeworICBzdGF0aWMgdW5zaWduZWQgTGFzdElEOworCisgIEluaXQgKk5hbWU7CisgIC8vIExvY2F0aW9uIHdoZXJlIHJlY29yZCB3YXMgaW5zdGFudGlhdGVkLCBmb2xsb3dlZCBieSB0aGUgbG9jYXRpb24gb2YKKyAgLy8gbXVsdGljbGFzcyBwcm90b3R5cGVzIHVzZWQuCisgIFNtYWxsVmVjdG9yPFNNTG9jLCA0PiBMb2NzOworICBTbWFsbFZlY3RvcjxJbml0ICosIDA+IFRlbXBsYXRlQXJnczsKKyAgU21hbGxWZWN0b3I8UmVjb3JkVmFsLCAwPiBWYWx1ZXM7CisKKyAgLy8gQWxsIHN1cGVyY2xhc3NlcyBpbiB0aGUgaW5oZXJpdGFuY2UgZm9yZXN0IGluIHJldmVyc2UgcHJlb3JkZXIgKHllcywgaXQKKyAgLy8gbXVzdCBiZSBhIGZvcmVzdDsgZGlhbW9uZC1zaGFwZWQgaW5oZXJpdGFuY2UgaXMgbm90IGFsbG93ZWQpLgorICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8UmVjb3JkICosIFNNUmFuZ2U+LCAwPiBTdXBlckNsYXNzZXM7CisKKyAgLy8gVHJhY2tzIFJlY29yZCBpbnN0YW5jZXMuIE5vdCBvd25lZCBieSBSZWNvcmQuCisgIFJlY29yZEtlZXBlciAmVHJhY2tlZFJlY29yZHM7CisKKyAgRGVmSW5pdCAqVGhlSW5pdCA9IG51bGxwdHI7CisKKyAgLy8gVW5pcXVlIHJlY29yZCBJRC4KKyAgdW5zaWduZWQgSUQ7CisKKyAgYm9vbCBJc0Fub255bW91czsKKworICB2b2lkIGluaXQoKTsKKyAgdm9pZCBjaGVja05hbWUoKTsKKworcHVibGljOgorICAvLyBDb25zdHJ1Y3RzIGEgcmVjb3JkLgorICBleHBsaWNpdCBSZWNvcmQoSW5pdCAqTiwgQXJyYXlSZWY8U01Mb2M+IGxvY3MsIFJlY29yZEtlZXBlciAmcmVjb3JkcywKKyAgICAgICAgICAgICAgICAgIGJvb2wgQW5vbnltb3VzID0gZmFsc2UpIDoKKyAgICBOYW1lKE4pLCBMb2NzKGxvY3MuYmVnaW4oKSwgbG9jcy5lbmQoKSksIFRyYWNrZWRSZWNvcmRzKHJlY29yZHMpLAorICAgIElEKExhc3RJRCsrKSwgSXNBbm9ueW1vdXMoQW5vbnltb3VzKSB7CisgICAgaW5pdCgpOworICB9CisKKyAgZXhwbGljaXQgUmVjb3JkKFN0cmluZ1JlZiBOLCBBcnJheVJlZjxTTUxvYz4gbG9jcywgUmVjb3JkS2VlcGVyICZyZWNvcmRzKQorICAgICAgOiBSZWNvcmQoU3RyaW5nSW5pdDo6Z2V0KE4pLCBsb2NzLCByZWNvcmRzKSB7fQorCisgIC8vIFdoZW4gY29weS1jb25zdHJ1Y3RpbmcgYSBSZWNvcmQsIHdlIG11c3Qgc3RpbGwgZ3VhcmFudGVlIGEgZ2xvYmFsbHkgdW5pcXVlCisgIC8vIElEIG51bWJlci4gIERvbid0IGNvcHkgVGhlSW5pdCBlaXRoZXIgc2luY2UgaXQncyBvd25lZCBieSB0aGUgb3JpZ2luYWwKKyAgLy8gcmVjb3JkLiBBbGwgb3RoZXIgZmllbGRzIGNhbiBiZSBjb3BpZWQgbm9ybWFsbHkuCisgIFJlY29yZChjb25zdCBSZWNvcmQgJk8pIDoKKyAgICBOYW1lKE8uTmFtZSksIExvY3MoTy5Mb2NzKSwgVGVtcGxhdGVBcmdzKE8uVGVtcGxhdGVBcmdzKSwKKyAgICBWYWx1ZXMoTy5WYWx1ZXMpLCBTdXBlckNsYXNzZXMoTy5TdXBlckNsYXNzZXMpLAorICAgIFRyYWNrZWRSZWNvcmRzKE8uVHJhY2tlZFJlY29yZHMpLCBJRChMYXN0SUQrKyksCisgICAgSXNBbm9ueW1vdXMoTy5Jc0Fub255bW91cykgeyB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldE5ld1VJRCgpIHsgcmV0dXJuIExhc3RJRCsrOyB9CisKKyAgdW5zaWduZWQgZ2V0SUQoKSBjb25zdCB7IHJldHVybiBJRDsgfQorCisgIFN0cmluZ1JlZiBnZXROYW1lKCkgY29uc3QgeyByZXR1cm4gY2FzdDxTdHJpbmdJbml0PihOYW1lKS0+Z2V0VmFsdWUoKTsgfQorCisgIEluaXQgKmdldE5hbWVJbml0KCkgY29uc3QgeworICAgIHJldHVybiBOYW1lOworICB9CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZ2V0TmFtZUluaXRBc1N0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0TmFtZUluaXQoKS0+Z2V0QXNVbnF1b3RlZFN0cmluZygpOworICB9CisKKyAgdm9pZCBzZXROYW1lKEluaXQgKk5hbWUpOyAgICAgIC8vIEFsc28gdXBkYXRlcyBSZWNvcmRLZWVwZXIuCisKKyAgQXJyYXlSZWY8U01Mb2M+IGdldExvYygpIGNvbnN0IHsgcmV0dXJuIExvY3M7IH0KKyAgdm9pZCBhcHBlbmRMb2MoU01Mb2MgTG9jKSB7IExvY3MucHVzaF9iYWNrKExvYyk7IH0KKworICAvLyBNYWtlIHRoZSB0eXBlIHRoYXQgdGhpcyByZWNvcmQgc2hvdWxkIGhhdmUgYmFzZWQgb24gaXRzIHN1cGVyY2xhc3Nlcy4KKyAgUmVjb3JkUmVjVHkgKmdldFR5cGUoKTsKKworICAvLy8gZ2V0IHRoZSBjb3JyZXNwb25kaW5nIERlZkluaXQuCisgIERlZkluaXQgKmdldERlZkluaXQoKTsKKworICBBcnJheVJlZjxJbml0ICo+IGdldFRlbXBsYXRlQXJncygpIGNvbnN0IHsKKyAgICByZXR1cm4gVGVtcGxhdGVBcmdzOworICB9CisKKyAgQXJyYXlSZWY8UmVjb3JkVmFsPiBnZXRWYWx1ZXMoKSBjb25zdCB7IHJldHVybiBWYWx1ZXM7IH0KKworICBBcnJheVJlZjxzdGQ6OnBhaXI8UmVjb3JkICosIFNNUmFuZ2U+PiAgZ2V0U3VwZXJDbGFzc2VzKCkgY29uc3QgeworICAgIHJldHVybiBTdXBlckNsYXNzZXM7CisgIH0KKworICAvLy8gQXBwZW5kIHRoZSBkaXJlY3Qgc3VwZXIgY2xhc3NlcyBvZiB0aGlzIHJlY29yZCB0byBDbGFzc2VzLgorICB2b2lkIGdldERpcmVjdFN1cGVyQ2xhc3NlcyhTbWFsbFZlY3RvckltcGw8UmVjb3JkICo+ICZDbGFzc2VzKSBjb25zdDsKKworICBib29sIGlzVGVtcGxhdGVBcmcoSW5pdCAqTmFtZSkgY29uc3QgeworICAgIGZvciAoSW5pdCAqVEEgOiBUZW1wbGF0ZUFyZ3MpCisgICAgICBpZiAoVEEgPT0gTmFtZSkgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgY29uc3QgUmVjb3JkVmFsICpnZXRWYWx1ZShjb25zdCBJbml0ICpOYW1lKSBjb25zdCB7CisgICAgZm9yIChjb25zdCBSZWNvcmRWYWwgJlZhbCA6IFZhbHVlcykKKyAgICAgIGlmIChWYWwuTmFtZSA9PSBOYW1lKSByZXR1cm4gJlZhbDsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIGNvbnN0IFJlY29yZFZhbCAqZ2V0VmFsdWUoU3RyaW5nUmVmIE5hbWUpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0VmFsdWUoU3RyaW5nSW5pdDo6Z2V0KE5hbWUpKTsKKyAgfQorCisgIFJlY29yZFZhbCAqZ2V0VmFsdWUoY29uc3QgSW5pdCAqTmFtZSkgeworICAgIHJldHVybiBjb25zdF9jYXN0PFJlY29yZFZhbCAqPihzdGF0aWNfY2FzdDxjb25zdCBSZWNvcmQgKj4odGhpcyktPmdldFZhbHVlKE5hbWUpKTsKKyAgfQorCisgIFJlY29yZFZhbCAqZ2V0VmFsdWUoU3RyaW5nUmVmIE5hbWUpIHsKKyAgICByZXR1cm4gY29uc3RfY2FzdDxSZWNvcmRWYWwgKj4oc3RhdGljX2Nhc3Q8Y29uc3QgUmVjb3JkICo+KHRoaXMpLT5nZXRWYWx1ZShOYW1lKSk7CisgIH0KKworICB2b2lkIGFkZFRlbXBsYXRlQXJnKEluaXQgKk5hbWUpIHsKKyAgICBhc3NlcnQoIWlzVGVtcGxhdGVBcmcoTmFtZSkgJiYgIlRlbXBsYXRlIGFyZyBhbHJlYWR5IGRlZmluZWQhIik7CisgICAgVGVtcGxhdGVBcmdzLnB1c2hfYmFjayhOYW1lKTsKKyAgfQorCisgIHZvaWQgYWRkVmFsdWUoY29uc3QgUmVjb3JkVmFsICZSVikgeworICAgIGFzc2VydChnZXRWYWx1ZShSVi5nZXROYW1lSW5pdCgpKSA9PSBudWxscHRyICYmICJWYWx1ZSBhbHJlYWR5IGFkZGVkISIpOworICAgIFZhbHVlcy5wdXNoX2JhY2soUlYpOworICAgIGlmIChWYWx1ZXMuc2l6ZSgpID4gMSkKKyAgICAgIC8vIEtlZXAgTkFNRSBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0LiAgSXQgbWFrZXMgcmVjb3JkIGR1bXBzIGEKKyAgICAgIC8vIGJpdCBwcmV0dGllciBhbmQgYWxsb3dzIFRhYmxlR2VuIHRlc3RzIHRvIGJlIHdyaXR0ZW4gbW9yZQorICAgICAgLy8gbmF0dXJhbGx5LiAgVGVzdHMgY2FuIHVzZSBDSEVDSy1ORVhUIHRvIGxvb2sgZm9yIFJlY29yZAorICAgICAgLy8gZmllbGRzIHRoZXkgZXhwZWN0IHRvIHNlZSBhZnRlciBhIGRlZi4gIFRoZXkgY2FuJ3QgZG8gdGhhdCBpZgorICAgICAgLy8gTkFNRSBpcyB0aGUgZmlyc3QgUmVjb3JkIGZpZWxkLgorICAgICAgc3RkOjpzd2FwKFZhbHVlc1tWYWx1ZXMuc2l6ZSgpIC0gMl0sIFZhbHVlc1tWYWx1ZXMuc2l6ZSgpIC0gMV0pOworICB9CisKKyAgdm9pZCByZW1vdmVWYWx1ZShJbml0ICpOYW1lKSB7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IFZhbHVlcy5zaXplKCk7IGkgIT0gZTsgKytpKQorICAgICAgaWYgKFZhbHVlc1tpXS5nZXROYW1lSW5pdCgpID09IE5hbWUpIHsKKyAgICAgICAgVmFsdWVzLmVyYXNlKFZhbHVlcy5iZWdpbigpK2kpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgbGx2bV91bnJlYWNoYWJsZSgiQ2Fubm90IHJlbW92ZSBhbiBlbnRyeSB0aGF0IGRvZXMgbm90IGV4aXN0ISIpOworICB9CisKKyAgdm9pZCByZW1vdmVWYWx1ZShTdHJpbmdSZWYgTmFtZSkgeworICAgIHJlbW92ZVZhbHVlKFN0cmluZ0luaXQ6OmdldChOYW1lKSk7CisgIH0KKworICBib29sIGlzU3ViQ2xhc3NPZihjb25zdCBSZWNvcmQgKlIpIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJlNDUGFpciA6IFN1cGVyQ2xhc3NlcykKKyAgICAgIGlmIChTQ1BhaXIuZmlyc3QgPT0gUikKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgYm9vbCBpc1N1YkNsYXNzT2YoU3RyaW5nUmVmIE5hbWUpIGNvbnN0IHsKKyAgICBmb3IgKGNvbnN0IGF1dG8gJlNDUGFpciA6IFN1cGVyQ2xhc3NlcykgeworICAgICAgaWYgKGNvbnN0IGF1dG8gKlNJID0gZHluX2Nhc3Q8U3RyaW5nSW5pdD4oU0NQYWlyLmZpcnN0LT5nZXROYW1lSW5pdCgpKSkgeworICAgICAgICBpZiAoU0ktPmdldFZhbHVlKCkgPT0gTmFtZSkKKyAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0gZWxzZSBpZiAoU0NQYWlyLmZpcnN0LT5nZXROYW1lSW5pdEFzU3RyaW5nKCkgPT0gTmFtZSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgdm9pZCBhZGRTdXBlckNsYXNzKFJlY29yZCAqUiwgU01SYW5nZSBSYW5nZSkgeworICAgIGFzc2VydCghVGhlSW5pdCAmJiAiY2hhbmdpbmcgdHlwZSBvZiByZWNvcmQgYWZ0ZXIgaXQgaGFzIGJlZW4gcmVmZXJlbmNlZCIpOworICAgIGFzc2VydCghaXNTdWJDbGFzc09mKFIpICYmICJBbHJlYWR5IHN1YmNsYXNzaW5nIHJlY29yZCEiKTsKKyAgICBTdXBlckNsYXNzZXMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKFIsIFJhbmdlKSk7CisgIH0KKworICAvLy8gSWYgdGhlcmUgYXJlIGFueSBmaWVsZCByZWZlcmVuY2VzIHRoYXQgcmVmZXIgdG8gZmllbGRzCisgIC8vLyB0aGF0IGhhdmUgYmVlbiBmaWxsZWQgaW4sIHdlIGNhbiBwcm9wYWdhdGUgdGhlIHZhbHVlcyBub3cuCisgIC8vLworICAvLy8gVGhpcyBpcyBhIGZpbmFsIHJlc29sdmU6IGFueSBlcnJvciBtZXNzYWdlcywgZS5nLiBkdWUgdG8gdW5kZWZpbmVkCisgIC8vLyAhY2FzdCByZWZlcmVuY2VzLCBhcmUgZ2VuZXJhdGVkIG5vdy4KKyAgdm9pZCByZXNvbHZlUmVmZXJlbmNlcygpOworCisgIC8vLyBBcHBseSB0aGUgcmVzb2x2ZXIgdG8gdGhlIG5hbWUgb2YgdGhlIHJlY29yZCBhcyB3ZWxsIGFzIHRvIHRoZQorICAvLy8gaW5pdGlhbGl6ZXJzIG9mIGFsbCBmaWVsZHMgb2YgdGhlIHJlY29yZCBleGNlcHQgU2tpcFZhbC4KKyAgLy8vCisgIC8vLyBUaGUgcmVzb2x2ZXIgc2hvdWxkIG5vdCByZXNvbHZlIGFueSBvZiB0aGUgZmllbGRzIGl0c2VsZiwgdG8gYXZvaWQKKyAgLy8vIHJlY3Vyc2lvbiAvIGluZmluaXRlIGxvb3BzLgorICB2b2lkIHJlc29sdmVSZWZlcmVuY2VzKFJlc29sdmVyICZSLCBjb25zdCBSZWNvcmRWYWwgKlNraXBWYWwgPSBudWxscHRyKTsKKworICAvLy8gSWYgYW55dGhpbmcgaW4gdGhpcyByZWNvcmQgcmVmZXJzIHRvIFJWLCByZXBsYWNlIHRoZQorICAvLy8gcmVmZXJlbmNlIHRvIFJWIHdpdGggdGhlIFJIUyBvZiBSVi4gIElmIFJWIGlzIG51bGwsIHdlIHJlc29sdmUgYWxsCisgIC8vLyBwb3NzaWJsZSByZWZlcmVuY2VzLgorICB2b2lkIHJlc29sdmVSZWZlcmVuY2VzVG8oY29uc3QgUmVjb3JkVmFsICpSVik7CisKKyAgUmVjb3JkS2VlcGVyICZnZXRSZWNvcmRzKCkgY29uc3QgeworICAgIHJldHVybiBUcmFja2VkUmVjb3JkczsKKyAgfQorCisgIGJvb2wgaXNBbm9ueW1vdXMoKSBjb25zdCB7CisgICAgcmV0dXJuIElzQW5vbnltb3VzOworICB9CisKKyAgdm9pZCBwcmludChyYXdfb3N0cmVhbSAmT1MpIGNvbnN0OworICB2b2lkIGR1bXAoKSBjb25zdDsKKworICAvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyAgLy8gSGlnaC1sZXZlbCBtZXRob2RzIHVzZWZ1bCB0byB0YWJsZWdlbiBiYWNrLWVuZHMKKyAgLy8KKworICAvLy8gUmV0dXJuIHRoZSBpbml0aWFsaXplciBmb3IgYSB2YWx1ZSB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZSwKKyAgLy8vIG9yIHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgZG9lcyBub3QgZXhpc3QuCisgIEluaXQgKmdldFZhbHVlSW5pdChTdHJpbmdSZWYgRmllbGROYW1lKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRydWUgaWYgdGhlIG5hbWVkIGZpZWxkIGlzIHVuc2V0LgorICBib29sIGlzVmFsdWVVbnNldChTdHJpbmdSZWYgRmllbGROYW1lKSBjb25zdCB7CisgICAgcmV0dXJuIGlzYTxVbnNldEluaXQ+KGdldFZhbHVlSW5pdChGaWVsZE5hbWUpKTsKKyAgfQorCisgIC8vLyBUaGlzIG1ldGhvZCBsb29rcyB1cCB0aGUgc3BlY2lmaWVkIGZpZWxkIGFuZCByZXR1cm5zCisgIC8vLyBpdHMgdmFsdWUgYXMgYSBzdHJpbmcsIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgZG9lcyBub3QgZXhpc3QKKyAgLy8vIG9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgYSBzdHJpbmcuCisgIFN0cmluZ1JlZiBnZXRWYWx1ZUFzU3RyaW5nKFN0cmluZ1JlZiBGaWVsZE5hbWUpIGNvbnN0OworCisgIC8vLyBUaGlzIG1ldGhvZCBsb29rcyB1cCB0aGUgc3BlY2lmaWVkIGZpZWxkIGFuZCByZXR1cm5zCisgIC8vLyBpdHMgdmFsdWUgYXMgYSBCaXRzSW5pdCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdAorICAvLy8gb3IgaWYgdGhlIHZhbHVlIGlzIG5vdCB0aGUgcmlnaHQgdHlwZS4KKyAgQml0c0luaXQgKmdldFZhbHVlQXNCaXRzSW5pdChTdHJpbmdSZWYgRmllbGROYW1lKSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2QgbG9va3MgdXAgdGhlIHNwZWNpZmllZCBmaWVsZCBhbmQgcmV0dXJucworICAvLy8gaXRzIHZhbHVlIGFzIGEgTGlzdEluaXQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgZG9lcyBub3QgZXhpc3QKKyAgLy8vIG9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgdGhlIHJpZ2h0IHR5cGUuCisgIExpc3RJbml0ICpnZXRWYWx1ZUFzTGlzdEluaXQoU3RyaW5nUmVmIEZpZWxkTmFtZSkgY29uc3Q7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGxvb2tzIHVwIHRoZSBzcGVjaWZpZWQgZmllbGQgYW5kCisgIC8vLyByZXR1cm5zIGl0cyB2YWx1ZSBhcyBhIHZlY3RvciBvZiByZWNvcmRzLCB0aHJvd2luZyBhbiBleGNlcHRpb24gaWYgdGhlCisgIC8vLyBmaWVsZCBkb2VzIG5vdCBleGlzdCBvciBpZiB0aGUgdmFsdWUgaXMgbm90IHRoZSByaWdodCB0eXBlLgorICBzdGQ6OnZlY3RvcjxSZWNvcmQqPiBnZXRWYWx1ZUFzTGlzdE9mRGVmcyhTdHJpbmdSZWYgRmllbGROYW1lKSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2QgbG9va3MgdXAgdGhlIHNwZWNpZmllZCBmaWVsZCBhbmQKKyAgLy8vIHJldHVybnMgaXRzIHZhbHVlIGFzIGEgdmVjdG9yIG9mIGludGVnZXJzLCB0aHJvd2luZyBhbiBleGNlcHRpb24gaWYgdGhlCisgIC8vLyBmaWVsZCBkb2VzIG5vdCBleGlzdCBvciBpZiB0aGUgdmFsdWUgaXMgbm90IHRoZSByaWdodCB0eXBlLgorICBzdGQ6OnZlY3RvcjxpbnQ2NF90PiBnZXRWYWx1ZUFzTGlzdE9mSW50cyhTdHJpbmdSZWYgRmllbGROYW1lKSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2QgbG9va3MgdXAgdGhlIHNwZWNpZmllZCBmaWVsZCBhbmQKKyAgLy8vIHJldHVybnMgaXRzIHZhbHVlIGFzIGEgdmVjdG9yIG9mIHN0cmluZ3MsIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpZiB0aGUKKyAgLy8vIGZpZWxkIGRvZXMgbm90IGV4aXN0IG9yIGlmIHRoZSB2YWx1ZSBpcyBub3QgdGhlIHJpZ2h0IHR5cGUuCisgIHN0ZDo6dmVjdG9yPFN0cmluZ1JlZj4gZ2V0VmFsdWVBc0xpc3RPZlN0cmluZ3MoU3RyaW5nUmVmIEZpZWxkTmFtZSkgY29uc3Q7CisKKyAgLy8vIFRoaXMgbWV0aG9kIGxvb2tzIHVwIHRoZSBzcGVjaWZpZWQgZmllbGQgYW5kIHJldHVybnMgaXRzCisgIC8vLyB2YWx1ZSBhcyBhIFJlY29yZCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdCBvciBpZgorICAvLy8gdGhlIHZhbHVlIGlzIG5vdCB0aGUgcmlnaHQgdHlwZS4KKyAgUmVjb3JkICpnZXRWYWx1ZUFzRGVmKFN0cmluZ1JlZiBGaWVsZE5hbWUpIGNvbnN0OworCisgIC8vLyBUaGlzIG1ldGhvZCBsb29rcyB1cCB0aGUgc3BlY2lmaWVkIGZpZWxkIGFuZCByZXR1cm5zIGl0cworICAvLy8gdmFsdWUgYXMgYSBiaXQsIHRocm93aW5nIGFuIGV4Y2VwdGlvbiBpZiB0aGUgZmllbGQgZG9lcyBub3QgZXhpc3Qgb3IgaWYKKyAgLy8vIHRoZSB2YWx1ZSBpcyBub3QgdGhlIHJpZ2h0IHR5cGUuCisgIGJvb2wgZ2V0VmFsdWVBc0JpdChTdHJpbmdSZWYgRmllbGROYW1lKSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2QgbG9va3MgdXAgdGhlIHNwZWNpZmllZCBmaWVsZCBhbmQKKyAgLy8vIHJldHVybnMgaXRzIHZhbHVlIGFzIGEgYml0LiBJZiB0aGUgZmllbGQgaXMgdW5zZXQsIHNldHMgVW5zZXQgdG8gdHJ1ZSBhbmQKKyAgLy8vIHJldHVybnMgZmFsc2UuCisgIGJvb2wgZ2V0VmFsdWVBc0JpdE9yVW5zZXQoU3RyaW5nUmVmIEZpZWxkTmFtZSwgYm9vbCAmVW5zZXQpIGNvbnN0OworCisgIC8vLyBUaGlzIG1ldGhvZCBsb29rcyB1cCB0aGUgc3BlY2lmaWVkIGZpZWxkIGFuZCByZXR1cm5zIGl0cworICAvLy8gdmFsdWUgYXMgYW4gaW50NjRfdCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdCBvcgorICAvLy8gaWYgdGhlIHZhbHVlIGlzIG5vdCB0aGUgcmlnaHQgdHlwZS4KKyAgaW50NjRfdCBnZXRWYWx1ZUFzSW50KFN0cmluZ1JlZiBGaWVsZE5hbWUpIGNvbnN0OworCisgIC8vLyBUaGlzIG1ldGhvZCBsb29rcyB1cCB0aGUgc3BlY2lmaWVkIGZpZWxkIGFuZCByZXR1cm5zIGl0cworICAvLy8gdmFsdWUgYXMgYW4gRGFnLCB0aHJvd2luZyBhbiBleGNlcHRpb24gaWYgdGhlIGZpZWxkIGRvZXMgbm90IGV4aXN0IG9yIGlmCisgIC8vLyB0aGUgdmFsdWUgaXMgbm90IHRoZSByaWdodCB0eXBlLgorICBEYWdJbml0ICpnZXRWYWx1ZUFzRGFnKFN0cmluZ1JlZiBGaWVsZE5hbWUpIGNvbnN0OworfTsKKworcmF3X29zdHJlYW0gJm9wZXJhdG9yPDwocmF3X29zdHJlYW0gJk9TLCBjb25zdCBSZWNvcmQgJlIpOworCitzdHJ1Y3QgTXVsdGlDbGFzcyB7CisgIFJlY29yZCBSZWM7ICAvLyBQbGFjZWhvbGRlciBmb3IgdGVtcGxhdGUgYXJncyBhbmQgTmFtZS4KKyAgdXNpbmcgUmVjb3JkVmVjdG9yID0gc3RkOjp2ZWN0b3I8c3RkOjp1bmlxdWVfcHRyPFJlY29yZD4+OworICBSZWNvcmRWZWN0b3IgRGVmUHJvdG90eXBlczsKKworICB2b2lkIGR1bXAoKSBjb25zdDsKKworICBNdWx0aUNsYXNzKFN0cmluZ1JlZiBOYW1lLCBTTUxvYyBMb2MsIFJlY29yZEtlZXBlciAmUmVjb3JkcykgOgorICAgIFJlYyhOYW1lLCBMb2MsIFJlY29yZHMpIHt9Cit9OworCitjbGFzcyBSZWNvcmRLZWVwZXIgeworICBmcmllbmQgY2xhc3MgUmVjb3JkUmVjVHk7CisgIHVzaW5nIFJlY29yZE1hcCA9IHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzdGQ6OnVuaXF1ZV9wdHI8UmVjb3JkPj47CisgIFJlY29yZE1hcCBDbGFzc2VzLCBEZWZzOworICBGb2xkaW5nU2V0PFJlY29yZFJlY1R5PiBSZWNvcmRUeXBlUG9vbDsKKyAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIEluaXQgKj4gRXh0cmFHbG9iYWxzOworICB1bnNpZ25lZCBBbm9uQ291bnRlciA9IDA7CisKK3B1YmxpYzoKKyAgY29uc3QgUmVjb3JkTWFwICZnZXRDbGFzc2VzKCkgY29uc3QgeyByZXR1cm4gQ2xhc3NlczsgfQorICBjb25zdCBSZWNvcmRNYXAgJmdldERlZnMoKSBjb25zdCB7IHJldHVybiBEZWZzOyB9CisKKyAgUmVjb3JkICpnZXRDbGFzcyhTdHJpbmdSZWYgTmFtZSkgY29uc3QgeworICAgIGF1dG8gSSA9IENsYXNzZXMuZmluZChOYW1lKTsKKyAgICByZXR1cm4gSSA9PSBDbGFzc2VzLmVuZCgpID8gbnVsbHB0ciA6IEktPnNlY29uZC5nZXQoKTsKKyAgfQorCisgIFJlY29yZCAqZ2V0RGVmKFN0cmluZ1JlZiBOYW1lKSBjb25zdCB7CisgICAgYXV0byBJID0gRGVmcy5maW5kKE5hbWUpOworICAgIHJldHVybiBJID09IERlZnMuZW5kKCkgPyBudWxscHRyIDogSS0+c2Vjb25kLmdldCgpOworICB9CisKKyAgSW5pdCAqZ2V0R2xvYmFsKFN0cmluZ1JlZiBOYW1lKSBjb25zdCB7CisgICAgaWYgKFJlY29yZCAqUiA9IGdldERlZihOYW1lKSkKKyAgICAgIHJldHVybiBSLT5nZXREZWZJbml0KCk7CisgICAgYXV0byBJdCA9IEV4dHJhR2xvYmFscy5maW5kKE5hbWUpOworICAgIHJldHVybiBJdCA9PSBFeHRyYUdsb2JhbHMuZW5kKCkgPyBudWxscHRyIDogSXQtPnNlY29uZDsKKyAgfQorCisgIHZvaWQgYWRkQ2xhc3Moc3RkOjp1bmlxdWVfcHRyPFJlY29yZD4gUikgeworICAgIGJvb2wgSW5zID0gQ2xhc3Nlcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoUi0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKFIpKSkuc2Vjb25kOworICAgICh2b2lkKUluczsKKyAgICBhc3NlcnQoSW5zICYmICJDbGFzcyBhbHJlYWR5IGV4aXN0cyIpOworICB9CisKKyAgdm9pZCBhZGREZWYoc3RkOjp1bmlxdWVfcHRyPFJlY29yZD4gUikgeworICAgIGJvb2wgSW5zID0gRGVmcy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoUi0+Z2V0TmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptb3ZlKFIpKSkuc2Vjb25kOworICAgICh2b2lkKUluczsKKyAgICBhc3NlcnQoSW5zICYmICJSZWNvcmQgYWxyZWFkeSBleGlzdHMiKTsKKyAgfQorCisgIHZvaWQgYWRkRXh0cmFHbG9iYWwoU3RyaW5nUmVmIE5hbWUsIEluaXQgKkkpIHsKKyAgICBib29sIElucyA9IEV4dHJhR2xvYmFscy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoTmFtZSwgSSkpLnNlY29uZDsKKyAgICAodm9pZClJbnM7CisgICAgYXNzZXJ0KCFnZXREZWYoTmFtZSkpOworICAgIGFzc2VydChJbnMgJiYgIkdsb2JhbCBhbHJlYWR5IGV4aXN0cyIpOworICB9CisKKyAgSW5pdCAqZ2V0TmV3QW5vbnltb3VzTmFtZSgpOworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBIaWdoLWxldmVsIGhlbHBlciBtZXRob2RzLCB1c2VmdWwgZm9yIHRhYmxlZ2VuIGJhY2tlbmRzLi4uCisKKyAgLy8vIFRoaXMgbWV0aG9kIHJldHVybnMgYWxsIGNvbmNyZXRlIGRlZmluaXRpb25zCisgIC8vLyB0aGF0IGRlcml2ZSBmcm9tIHRoZSBzcGVjaWZpZWQgY2xhc3MgbmFtZS4gIEEgY2xhc3Mgd2l0aCB0aGUgc3BlY2lmaWVkCisgIC8vLyBuYW1lIG11c3QgZXhpc3QuCisgIHN0ZDo6dmVjdG9yPFJlY29yZCAqPiBnZXRBbGxEZXJpdmVkRGVmaW5pdGlvbnMoU3RyaW5nUmVmIENsYXNzTmFtZSkgY29uc3Q7CisKKyAgdm9pZCBkdW1wKCkgY29uc3Q7Cit9OworCisvLy8gU29ydGluZyBwcmVkaWNhdGUgdG8gc29ydCByZWNvcmQgcG9pbnRlcnMgYnkgbmFtZS4KK3N0cnVjdCBMZXNzUmVjb3JkIHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJlY29yZCAqUmVjMSwgY29uc3QgUmVjb3JkICpSZWMyKSBjb25zdCB7CisgICAgcmV0dXJuIFN0cmluZ1JlZihSZWMxLT5nZXROYW1lKCkpLmNvbXBhcmVfbnVtZXJpYyhSZWMyLT5nZXROYW1lKCkpIDwgMDsKKyAgfQorfTsKKworLy8vIFNvcnRpbmcgcHJlZGljYXRlIHRvIHNvcnQgcmVjb3JkIHBvaW50ZXJzIGJ5IHRoZWlyCisvLy8gdW5pcXVlIElELiBJZiB5b3UganVzdCBuZWVkIGEgZGV0ZXJtaW5pc3RpYyBvcmRlciwgdXNlIHRoaXMsIHNpbmNlIGl0CisvLy8ganVzdCBjb21wYXJlcyB0d28gYHVuc2lnbmVkYDsgdGhlIG90aGVyIHNvcnRpbmcgcHJlZGljYXRlcyByZXF1aXJlCisvLy8gc3RyaW5nIG1hbmlwdWxhdGlvbi4KK3N0cnVjdCBMZXNzUmVjb3JkQnlJRCB7CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBSZWNvcmQgKkxIUywgY29uc3QgUmVjb3JkICpSSFMpIGNvbnN0IHsKKyAgICByZXR1cm4gTEhTLT5nZXRJRCgpIDwgUkhTLT5nZXRJRCgpOworICB9Cit9OworCisvLy8gU29ydGluZyBwcmVkaWNhdGUgdG8gc29ydCByZWNvcmQgcG9pbnRlcnMgYnkgdGhlaXIKKy8vLyBuYW1lIGZpZWxkLgorc3RydWN0IExlc3NSZWNvcmRGaWVsZE5hbWUgeworICBib29sIG9wZXJhdG9yKCkoY29uc3QgUmVjb3JkICpSZWMxLCBjb25zdCBSZWNvcmQgKlJlYzIpIGNvbnN0IHsKKyAgICByZXR1cm4gUmVjMS0+Z2V0VmFsdWVBc1N0cmluZygiTmFtZSIpIDwgUmVjMi0+Z2V0VmFsdWVBc1N0cmluZygiTmFtZSIpOworICB9Cit9OworCitzdHJ1Y3QgTGVzc1JlY29yZFJlZ2lzdGVyIHsKKyAgc3RhdGljIGJvb2wgYXNjaWlfaXNkaWdpdChjaGFyIHgpIHsgcmV0dXJuIHggPj0gJzAnICYmIHggPD0gJzknOyB9CisKKyAgc3RydWN0IFJlY29yZFBhcnRzIHsKKyAgICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8IGJvb2wsIFN0cmluZ1JlZj4sIDQ+IFBhcnRzOworCisgICAgUmVjb3JkUGFydHMoU3RyaW5nUmVmIFJlYykgeworICAgICAgaWYgKFJlYy5lbXB0eSgpKQorICAgICAgICByZXR1cm47CisKKyAgICAgIHNpemVfdCBMZW4gPSAwOworICAgICAgY29uc3QgY2hhciAqU3RhcnQgPSBSZWMuZGF0YSgpOworICAgICAgY29uc3QgY2hhciAqQ3VyciA9IFN0YXJ0OworICAgICAgYm9vbCBpc0RpZ2l0UGFydCA9IGFzY2lpX2lzZGlnaXQoQ3VyclswXSk7CisgICAgICBmb3IgKHNpemVfdCBJID0gMCwgRSA9IFJlYy5zaXplKCk7IEkgIT0gRTsgKytJLCArK0xlbikgeworICAgICAgICBib29sIGlzRGlnaXQgPSBhc2NpaV9pc2RpZ2l0KEN1cnJbSV0pOworICAgICAgICBpZiAoaXNEaWdpdCAhPSBpc0RpZ2l0UGFydCkgeworICAgICAgICAgIFBhcnRzLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihpc0RpZ2l0UGFydCwgU3RyaW5nUmVmKFN0YXJ0LCBMZW4pKSk7CisgICAgICAgICAgTGVuID0gMDsKKyAgICAgICAgICBTdGFydCA9ICZDdXJyW0ldOworICAgICAgICAgIGlzRGlnaXRQYXJ0ID0gYXNjaWlfaXNkaWdpdChDdXJyW0ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLy8gUHVzaCB0aGUgbGFzdCBwYXJ0LgorICAgICAgUGFydHMucHVzaF9iYWNrKHN0ZDo6bWFrZV9wYWlyKGlzRGlnaXRQYXJ0LCBTdHJpbmdSZWYoU3RhcnQsIExlbikpKTsKKyAgICB9CisKKyAgICBzaXplX3Qgc2l6ZSgpIHsgcmV0dXJuIFBhcnRzLnNpemUoKTsgfQorCisgICAgc3RkOjpwYWlyPGJvb2wsIFN0cmluZ1JlZj4gZ2V0UGFydChzaXplX3QgaSkgeworICAgICAgYXNzZXJ0IChpIDwgUGFydHMuc2l6ZSgpICYmICJJbnZhbGlkIGlkeCEiKTsKKyAgICAgIHJldHVybiBQYXJ0c1tpXTsKKyAgICB9CisgIH07CisKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFJlY29yZCAqUmVjMSwgY29uc3QgUmVjb3JkICpSZWMyKSBjb25zdCB7CisgICAgUmVjb3JkUGFydHMgTEhTUGFydHMoU3RyaW5nUmVmKFJlYzEtPmdldE5hbWUoKSkpOworICAgIFJlY29yZFBhcnRzIFJIU1BhcnRzKFN0cmluZ1JlZihSZWMyLT5nZXROYW1lKCkpKTsKKworICAgIHNpemVfdCBMSFNOdW1QYXJ0cyA9IExIU1BhcnRzLnNpemUoKTsKKyAgICBzaXplX3QgUkhTTnVtUGFydHMgPSBSSFNQYXJ0cy5zaXplKCk7CisgICAgYXNzZXJ0IChMSFNOdW1QYXJ0cyAmJiBSSFNOdW1QYXJ0cyAmJiAiRXhwZWN0ZWQgYXQgbGVhc3Qgb25lIHBhcnQhIik7CisKKyAgICBpZiAoTEhTTnVtUGFydHMgIT0gUkhTTnVtUGFydHMpCisgICAgICByZXR1cm4gTEhTTnVtUGFydHMgPCBSSFNOdW1QYXJ0czsKKworICAgIC8vIFdlIGV4cGVjdCB0aGUgcmVnaXN0ZXJzIHRvIGJlIG9mIHRoZSBmb3JtIFtfYS16QS1aXSsoWzAtOV0qW19hLXpBLVpdKikqLgorICAgIGZvciAoc2l6ZV90IEkgPSAwLCBFID0gTEhTTnVtUGFydHM7IEkgPCBFOyBJKz0yKSB7CisgICAgICBzdGQ6OnBhaXI8Ym9vbCwgU3RyaW5nUmVmPiBMSFNQYXJ0ID0gTEhTUGFydHMuZ2V0UGFydChJKTsKKyAgICAgIHN0ZDo6cGFpcjxib29sLCBTdHJpbmdSZWY+IFJIU1BhcnQgPSBSSFNQYXJ0cy5nZXRQYXJ0KEkpOworICAgICAgLy8gRXhwZWN0IGV2ZW4gcGFydCB0byBhbHdheXMgYmUgYWxwaGEuCisgICAgICBhc3NlcnQgKExIU1BhcnQuZmlyc3QgPT0gZmFsc2UgJiYgUkhTUGFydC5maXJzdCA9PSBmYWxzZSAmJgorICAgICAgICAgICAgICAiRXhwZWN0ZWQgYm90aCBwYXJ0cyB0byBiZSBhbHBoYS4iKTsKKyAgICAgIGlmIChpbnQgUmVzID0gTEhTUGFydC5zZWNvbmQuY29tcGFyZShSSFNQYXJ0LnNlY29uZCkpCisgICAgICAgIHJldHVybiBSZXMgPCAwOworICAgIH0KKyAgICBmb3IgKHNpemVfdCBJID0gMSwgRSA9IExIU051bVBhcnRzOyBJIDwgRTsgSSs9MikgeworICAgICAgc3RkOjpwYWlyPGJvb2wsIFN0cmluZ1JlZj4gTEhTUGFydCA9IExIU1BhcnRzLmdldFBhcnQoSSk7CisgICAgICBzdGQ6OnBhaXI8Ym9vbCwgU3RyaW5nUmVmPiBSSFNQYXJ0ID0gUkhTUGFydHMuZ2V0UGFydChJKTsKKyAgICAgIC8vIEV4cGVjdCBvZGQgcGFydCB0byBhbHdheXMgYmUgbnVtZXJpYy4KKyAgICAgIGFzc2VydCAoTEhTUGFydC5maXJzdCA9PSB0cnVlICYmIFJIU1BhcnQuZmlyc3QgPT0gdHJ1ZSAmJgorICAgICAgICAgICAgICAiRXhwZWN0ZWQgYm90aCBwYXJ0cyB0byBiZSBudW1lcmljLiIpOworICAgICAgaWYgKExIU1BhcnQuc2Vjb25kLnNpemUoKSAhPSBSSFNQYXJ0LnNlY29uZC5zaXplKCkpCisgICAgICAgIHJldHVybiBMSFNQYXJ0LnNlY29uZC5zaXplKCkgPCBSSFNQYXJ0LnNlY29uZC5zaXplKCk7CisKKyAgICAgIHVuc2lnbmVkIExIU1ZhbCwgUkhTVmFsOworCisgICAgICBib29sIExIU0ZhaWxlZCA9IExIU1BhcnQuc2Vjb25kLmdldEFzSW50ZWdlcigxMCwgTEhTVmFsKTsgKHZvaWQpTEhTRmFpbGVkOworICAgICAgYXNzZXJ0KCFMSFNGYWlsZWQgJiYgIlVuYWJsZSB0byBjb252ZXJ0IExIUyB0byBpbnRlZ2VyLiIpOworICAgICAgYm9vbCBSSFNGYWlsZWQgPSBSSFNQYXJ0LnNlY29uZC5nZXRBc0ludGVnZXIoMTAsIFJIU1ZhbCk7ICh2b2lkKVJIU0ZhaWxlZDsKKyAgICAgIGFzc2VydCghUkhTRmFpbGVkICYmICJVbmFibGUgdG8gY29udmVydCBSSFMgdG8gaW50ZWdlci4iKTsKKworICAgICAgaWYgKExIU1ZhbCAhPSBSSFNWYWwpCisgICAgICAgIHJldHVybiBMSFNWYWwgPCBSSFNWYWw7CisgICAgfQorICAgIHJldHVybiBMSFNOdW1QYXJ0cyA8IFJIU051bVBhcnRzOworICB9Cit9OworCityYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IFJlY29yZEtlZXBlciAmUkspOworCisvLy8gUmV0dXJuIGFuIEluaXQgd2l0aCBhIHF1YWxpZmllciBwcmVmaXggcmVmZXJyaW5nCisvLy8gdG8gQ3VyUmVjJ3MgbmFtZS4KK0luaXQgKlF1YWxpZnlOYW1lKFJlY29yZCAmQ3VyUmVjLCBNdWx0aUNsYXNzICpDdXJNdWx0aUNsYXNzLAorICAgICAgICAgICAgICAgICAgSW5pdCAqTmFtZSwgU3RyaW5nUmVmIFNjb3Blcik7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyAgUmVzb2x2ZXJzCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLy8gSW50ZXJmYWNlIGZvciBsb29raW5nIHVwIHRoZSBpbml0aWFsaXplciBmb3IgYSB2YXJpYWJsZSBuYW1lLCB1c2VkIGJ5CisvLy8gSW5pdDo6cmVzb2x2ZVJlZmVyZW5jZXMuCitjbGFzcyBSZXNvbHZlciB7CisgIFJlY29yZCAqQ3VyUmVjOworICBib29sIElzRmluYWwgPSBmYWxzZTsKKworcHVibGljOgorICBleHBsaWNpdCBSZXNvbHZlcihSZWNvcmQgKkN1clJlYykgOiBDdXJSZWMoQ3VyUmVjKSB7fQorICB2aXJ0dWFsIH5SZXNvbHZlcigpIHt9CisKKyAgUmVjb3JkICpnZXRDdXJyZW50UmVjb3JkKCkgY29uc3QgeyByZXR1cm4gQ3VyUmVjOyB9CisKKyAgLy8vIFJldHVybiB0aGUgaW5pdGlhbGl6ZXIgZm9yIHRoZSBnaXZlbiB2YXJpYWJsZSBuYW1lIChzaG91bGQgbm9ybWFsbHkgYmUgYQorICAvLy8gU3RyaW5nSW5pdCksIG9yIG51bGxwdHIgaWYgdGhlIG5hbWUgY291bGQgbm90IGJlIHJlc29sdmVkLgorICB2aXJ0dWFsIEluaXQgKnJlc29sdmUoSW5pdCAqVmFyTmFtZSkgPSAwOworCisgIC8vIFdoZXRoZXIgYml0cyBpbiBhIEJpdHNJbml0IHNob3VsZCBzdGF5IHVucmVzb2x2ZWQgaWYgcmVzb2x2aW5nIHRoZW0gd291bGQKKyAgLy8gcmVzdWx0IGluIGEgPyAoVW5zZXRJbml0KS4gVGhpcyBiZWhhdmlvciBpcyB1c2VkIHRvIHJlcHJlc2VudCBpbnN0cnVjdGlvbgorICAvLyBlbmNvZGluZ3MgYnkga2VlcGluZyByZWZlcmVuY2VzIHRvIHVuc2V0IHZhcmlhYmxlcyB3aXRoaW4gYSByZWNvcmQuCisgIHZpcnR1YWwgYm9vbCBrZWVwVW5zZXRCaXRzKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKworICAvLyBXaGV0aGVyIHRoaXMgaXMgdGhlIGZpbmFsIHJlc29sdmUgc3RlcCBiZWZvcmUgYWRkaW5nIGEgcmVjb3JkIHRvIHRoZQorICAvLyBSZWNvcmRLZWVwZXIuIEVycm9yIHJlcG9ydGluZyBkdXJpbmcgcmVzb2x2ZSBhbmQgcmVsYXRlZCBjb25zdGFudCBmb2xkaW5nCisgIC8vIHNob3VsZCBvbmx5IGhhcHBlbiB3aGVuIHRoaXMgaXMgdHJ1ZS4KKyAgYm9vbCBpc0ZpbmFsKCkgY29uc3QgeyByZXR1cm4gSXNGaW5hbDsgfQorCisgIHZvaWQgc2V0RmluYWwoYm9vbCBGaW5hbCkgeyBJc0ZpbmFsID0gRmluYWw7IH0KK307CisKKy8vLyBSZXNvbHZlIGFyYml0cmFyeSBtYXBwaW5ncy4KK2NsYXNzIE1hcFJlc29sdmVyIGZpbmFsIDogcHVibGljIFJlc29sdmVyIHsKKyAgc3RydWN0IE1hcHBlZFZhbHVlIHsKKyAgICBJbml0ICpWOworICAgIGJvb2wgUmVzb2x2ZWQ7CisKKyAgICBNYXBwZWRWYWx1ZSgpIDogVihudWxscHRyKSwgUmVzb2x2ZWQoZmFsc2UpIHt9CisgICAgTWFwcGVkVmFsdWUoSW5pdCAqViwgYm9vbCBSZXNvbHZlZCkgOiBWKFYpLCBSZXNvbHZlZChSZXNvbHZlZCkge30KKyAgfTsKKworICBEZW5zZU1hcDxJbml0ICosIE1hcHBlZFZhbHVlPiBNYXA7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgTWFwUmVzb2x2ZXIoUmVjb3JkICpDdXJSZWMgPSBudWxscHRyKSA6IFJlc29sdmVyKEN1clJlYykge30KKworICB2b2lkIHNldChJbml0ICpLZXksIEluaXQgKlZhbHVlKSB7IE1hcFtLZXldID0ge1ZhbHVlLCBmYWxzZX07IH0KKworICBJbml0ICpyZXNvbHZlKEluaXQgKlZhck5hbWUpIG92ZXJyaWRlOworfTsKKworLy8vIFJlc29sdmUgYWxsIHZhcmlhYmxlcyBmcm9tIGEgcmVjb3JkIGV4Y2VwdCBmb3IgdW5zZXQgdmFyaWFibGVzLgorY2xhc3MgUmVjb3JkUmVzb2x2ZXIgZmluYWwgOiBwdWJsaWMgUmVzb2x2ZXIgeworICBEZW5zZU1hcDxJbml0ICosIEluaXQgKj4gQ2FjaGU7CisgIFNtYWxsVmVjdG9yPEluaXQgKiwgND4gU3RhY2s7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgUmVjb3JkUmVzb2x2ZXIoUmVjb3JkICZSKSA6IFJlc29sdmVyKCZSKSB7fQorCisgIEluaXQgKnJlc29sdmUoSW5pdCAqVmFyTmFtZSkgb3ZlcnJpZGU7CisKKyAgYm9vbCBrZWVwVW5zZXRCaXRzKCkgY29uc3Qgb3ZlcnJpZGUgeyByZXR1cm4gdHJ1ZTsgfQorfTsKKworLy8vIFJlc29sdmUgYWxsIHJlZmVyZW5jZXMgdG8gYSBzcGVjaWZpYyBSZWNvcmRWYWwuCisvLworLy8gVE9ETzogVGhpcyBpcyB1c2VkIGZvciByZXNvbHZpbmcgcmVmZXJlbmNlcyB0byB0ZW1wbGF0ZSBhcmd1bWVudHMsIGluIGEKKy8vICAgICAgIHJhdGhlciBpbmVmZmljaWVudCB3YXkuIENoYW5nZSB0aG9zZSB1c2VzIHRvIHJlc29sdmUgYWxsIHRlbXBsYXRlCisvLyAgICAgICBhcmd1bWVudHMgc2ltdWx0YW5lb3VzbHkgYW5kIGdldCByaWQgb2YgdGhpcyBjbGFzcy4KK2NsYXNzIFJlY29yZFZhbFJlc29sdmVyIGZpbmFsIDogcHVibGljIFJlc29sdmVyIHsKKyAgY29uc3QgUmVjb3JkVmFsICpSVjsKKworcHVibGljOgorICBleHBsaWNpdCBSZWNvcmRWYWxSZXNvbHZlcihSZWNvcmQgJlIsIGNvbnN0IFJlY29yZFZhbCAqUlYpCisgICAgICA6IFJlc29sdmVyKCZSKSwgUlYoUlYpIHt9CisKKyAgSW5pdCAqcmVzb2x2ZShJbml0ICpWYXJOYW1lKSBvdmVycmlkZSB7CisgICAgaWYgKFZhck5hbWUgPT0gUlYtPmdldE5hbWVJbml0KCkpCisgICAgICByZXR1cm4gUlYtPmdldFZhbHVlKCk7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KK307CisKKy8vLyBEZWxlZ2F0ZSByZXNvbHZpbmcgdG8gYSBzdWItcmVzb2x2ZXIsIGJ1dCBzaGFkb3cgc29tZSB2YXJpYWJsZSBuYW1lcy4KK2NsYXNzIFNoYWRvd1Jlc29sdmVyIGZpbmFsIDogcHVibGljIFJlc29sdmVyIHsKKyAgUmVzb2x2ZXIgJlI7CisgIERlbnNlU2V0PEluaXQgKj4gU2hhZG93ZWQ7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgU2hhZG93UmVzb2x2ZXIoUmVzb2x2ZXIgJlIpCisgICAgICA6IFJlc29sdmVyKFIuZ2V0Q3VycmVudFJlY29yZCgpKSwgUihSKSB7CisgICAgc2V0RmluYWwoUi5pc0ZpbmFsKCkpOworICB9CisKKyAgdm9pZCBhZGRTaGFkb3coSW5pdCAqS2V5KSB7IFNoYWRvd2VkLmluc2VydChLZXkpOyB9CisKKyAgSW5pdCAqcmVzb2x2ZShJbml0ICpWYXJOYW1lKSBvdmVycmlkZSB7CisgICAgaWYgKFNoYWRvd2VkLmNvdW50KFZhck5hbWUpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIFIucmVzb2x2ZShWYXJOYW1lKTsKKyAgfQorfTsKKworLy8vIChPcHRpb25hbGx5KSBkZWxlZ2F0ZSByZXNvbHZpbmcgdG8gYSBzdWItcmVzb2x2ZXIsIGFuZCBrZWVwIHRyYWNrIHdoZXRoZXIKKy8vLyB0aGVyZSB3ZXJlIHVucmVzb2x2ZWQgcmVmZXJlbmNlcy4KK2NsYXNzIFRyYWNrVW5yZXNvbHZlZFJlc29sdmVyIGZpbmFsIDogcHVibGljIFJlc29sdmVyIHsKKyAgUmVzb2x2ZXIgKlI7CisgIGJvb2wgRm91bmRVbnJlc29sdmVkID0gZmFsc2U7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgVHJhY2tVbnJlc29sdmVkUmVzb2x2ZXIoUmVzb2x2ZXIgKlIgPSBudWxscHRyKQorICAgICAgOiBSZXNvbHZlcihSID8gUi0+Z2V0Q3VycmVudFJlY29yZCgpIDogbnVsbHB0ciksIFIoUikge30KKworICBib29sIGZvdW5kVW5yZXNvbHZlZCgpIGNvbnN0IHsgcmV0dXJuIEZvdW5kVW5yZXNvbHZlZDsgfQorCisgIEluaXQgKnJlc29sdmUoSW5pdCAqVmFyTmFtZSkgb3ZlcnJpZGU7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UQUJMRUdFTl9SRUNPUkRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYWJsZUdlbi9TZWFyY2hhYmxlVGFibGUudGQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhYmxlR2VuL1NlYXJjaGFibGVUYWJsZS50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMmFhZjYwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYWJsZUdlbi9TZWFyY2hhYmxlVGFibGUudGQKQEAgLTAsMCArMSw0MSBAQAorLy89PT0tIFNlYXJjaGFibGVUYWJsZS50ZCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUga2V5IHRvcC1sZXZlbCBjbGFzc2VzIG5lZWRlZCB0byBwcm9kdWNlIGEgcmVhc29uYWJseQorLy8gZ2VuZXJpYyB0YWJsZSB0aGF0IGNhbiBiZSBiaW5hcnktc2VhcmNoZWQgdmlhIGludCBhbmQgc3RyaW5nIGVudHJpZXMuCisvLworLy8gRWFjaCB0YWJsZSBtdXN0IGluc3RhbnRpYXRlICJNYXBwaW5na2luZCIsIGxpc3RpbmcgdGhlIGZpZWxkcyB0aGF0IHNob3VsZCBiZQorLy8gaW5jbHVkZWQgYW5kIGZpZWxkcyB0aGF0IHNob291bGQgYmUgc2VhcmNoYWJsZS4gT25seSB0d28ga2luZHMgb2YgZmllbGRzIGFyZQorLy8gc2VhcmNoYWJsZSBhdCB0aGUgbW9tZW50OiAic3RyaW5ncyIgKHdoaWNoIGFyZSBjb21wYXJlZCBjYXNlLWluc2Vuc2l0aXZlbHkpLAorLy8gYW5kICJiaXRzIi4KKy8vCisvLyBGb3IgZWFjaCAiTWFwcGluZ0tpbmQiIHRoZSBnZW5lcmF0ZWQgaGVhZGVyIHdpbGwgY3JlYXRlIEdFVF9NQVBQSU5HS0lORF9ERUNMCisvLyBhbmQgR0VUX01BUFBJTkdLSU5EX0lNUEwgZ3VhcmRzLgorLy8KKy8vIEluc2lkZSB0aGUgREVDTCBndWFyZCB3aWxsIGJlIGEgc2V0IG9mIGZ1bmN0aW9uIGRlY2xhcmF0aW9uczoKKy8vICJsb29rdXB7SW5zdGFuY2VDbGFzc31CeXtTZWFyY2hhYmxlRmllbGR9IiwgcmV0dXJuaW5nICJjb25zdCB7SW5zdGFuY2VDbGFzc30KKy8vICoiIGFuZCBhY2NlcHRpbmcgZWl0aGVyIGEgU3RyaW5nUmVmIG9yIGEgdWludE5fdC4gQWRkaXRpb25hbGx5LCBpZgorLy8gRW51bU5hbWVGaWVsZCBpcyBzdGlsbCBkZWZpbmVkLCB0aGVyZSB3aWxsIGJlIGFuICJlbnVtIHtJbnN0YW5jZUNsYXNzfVZhbHVlcyIKKy8vIGFsbG93aW5nIEMrKyBjb2RlIHRvIHJlZmVyZW5jZSBlaXRoZXIgdGhlIHByaW1hcnkgZGF0YSB0YWJsZSdzIGVudHJpZXMgKGlmCisvLyBFbnVtVmFsdWVGaWVsZCBpcyBub3QgZGVmaW5lZCkgb3Igc29tZSBvdGhlciBmaWVsZCAoZS5nLiBlbmNvZGluZykgaWYgaXQgaXMuCisvLworLy8gSW5zaWRlIHRoZSBJTVBMIGd1YXJkIHdpbGwgYmUgYSBwcmltYXJ5IGRhdGEgdGFibGUgIntJbnN0YW5jZUNsYXNzfXNMaXN0IiBhbmQKKy8vIGFzIG1hbnkgc2VhcmNoYWJsZSBpbmRleGVzIGFzIHJlcXVlc3RlZAorLy8gKCJ7SW5zdGFuY2VDbGFzc31zQnl7U2VhcmNoYWJsZUZpZWxkfSIpLiBBZGRpdGlvbmFsbHkgaW1wbGVtZW50YXRpb25zIG9mIHRoZQorLy8gbG9va3VwIGZ1bmN0aW9uIHdpbGwgYmUgcHJvdmlkZWQuCisvLworLy8gU2VlIEFBcmNoNjRTeXN0ZW1PcGVyYW5kcy50ZCBhbmQgaXRzIGdlbmVyYXRlZCBoZWFkZXIgZm9yIGV4YW1wbGUgdXNlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCitjbGFzcyBTZWFyY2hhYmxlVGFibGUgeworICBsaXN0PHN0cmluZz4gU2VhcmNoYWJsZUZpZWxkczsKKyAgc3RyaW5nIEVudW1OYW1lRmllbGQgPSAiTmFtZSI7CisgIHN0cmluZyBFbnVtVmFsdWVGaWVsZDsKK30KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFibGVHZW4vU2V0VGhlb3J5LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhYmxlR2VuL1NldFRoZW9yeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMzJmOWUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhYmxlR2VuL1NldFRoZW9yeS5oCkBAIC0wLDAgKzEsMTQ1IEBACisvLz09PS0gU2V0VGhlb3J5LmggLSBHZW5lcmF0ZSBvcmRlcmVkIHNldHMgZnJvbSBEQUcgZXhwcmVzc2lvbnMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBTZXRUaGVvcnkgY2xhc3MgdGhhdCBjb21wdXRlcyBvcmRlcmVkIHNldHMgb2YKKy8vIFJlY29yZHMgZnJvbSBEQUcgZXhwcmVzc2lvbnMuICBPcGVyYXRvcnMgZm9yIHN0YW5kYXJkIHNldCBvcGVyYXRpb25zIGFyZQorLy8gcHJlZGVmaW5lZCwgYW5kIGl0IGlzIHBvc3NpYmxlIHRvIGFkZCBzcGVjaWFsIHB1cnBvc2Ugc2V0IG9wZXJhdG9ycyBhcyB3ZWxsLgorLy8KKy8vIFRoZSB1c2VyIG1heSBkZWZpbmUgbmFtZWQgc2V0cyBhcyBSZWNvcmRzIG9mIHByZWRlZmluZWQgY2xhc3Nlcy4gU2V0CisvLyBleHBhbmRlcnMgY2FuIGJlIGFkZGVkIHRvIGEgU2V0VGhlb3J5IGluc3RhbmNlIHRvIHRlYWNoIGl0IGhvdyB0byBmaW5kIHRoZQorLy8gZWxlbWVudHMgb2Ygc3VjaCBhIG5hbWVkIHNldC4KKy8vCisvLyBUaGVzZSBhcmUgdGhlIHByZWRlZmluZWQgb3BlcmF0b3JzLiBUaGUgYXJndW1lbnQgbGlzdHMgY2FuIGJlIGluZGl2aWR1YWwKKy8vIGVsZW1lbnRzIChkZWZzKSwgb3RoZXIgc2V0cyAoZGVmcyBvZiBleHBhbmRhYmxlIGNsYXNzZXMpLCBsaXN0cywgb3IgREFHCisvLyBleHByZXNzaW9ucyB0aGF0IGFyZSBldmFsdWF0ZWQgcmVjdXJzaXZlbHkuCisvLworLy8gLSAoYWRkIFMxLCBTMiAuLi4pIFVuaW9uIHNldHMuIFRoaXMgaXMgYWxzbyBob3cgc2V0cyBhcmUgY3JlYXRlZCBmcm9tIGVsZW1lbnQKKy8vICAgbGlzdHMuCisvLworLy8gLSAoc3ViIFMxLCBTMiwgLi4uKSBTZXQgZGlmZmVyZW5jZS4gRXZlcnkgZWxlbWVudCBpbiBTMSBleGNlcHQgZm9yIHRoZQorLy8gICBlbGVtZW50cyBpbiBTMiwgLi4uCisvLworLy8gLSAoYW5kIFMxLCBTMikgU2V0IGludGVyc2VjdGlvbi4gRXZlcnkgZWxlbWVudCBpbiBTMSB0aGF0IGlzIGFsc28gaW4gUzIuCisvLworLy8gLSAoc2hsIFMsIE4pIFNoaWZ0IGxlZnQuIFJlbW92ZSB0aGUgZmlyc3QgTiBlbGVtZW50cyBmcm9tIFMuCisvLworLy8gLSAodHJ1bmMgUywgTikgVHJ1bmNhdGUuIFRoZSBmaXJzdCBOIGVsZW1lbnRzIG9mIFMuCisvLworLy8gLSAocm90bCBTLCBOKSBSb3RhdGUgbGVmdC4gU2FtZSBhcyAoYWRkIChzaGwgUywgTiksICh0cnVuYyBTLCBOKSkuCisvLworLy8gLSAocm90ciBTLCBOKSBSb3RhdGUgcmlnaHQuCisvLworLy8gLSAoZGVjaW1hdGUgUywgTikgRGVjaW1hdGUgUyBieSBwaWNraW5nIGV2ZXJ5IE4ndGggZWxlbWVudCwgc3RhcnRpbmcgd2l0aAorLy8gICB0aGUgZmlyc3Qgb25lLiBGb3IgaW5zdGFuY2UsIChkZWNpbWF0ZSBTLCAyKSByZXR1cm5zIHRoZSBldmVuIGVsZW1lbnRzIG9mCisvLyAgIFMuCisvLworLy8gLSAoc2VxdWVuY2UgIkZvcm1hdCIsIEZyb20sIFRvKSBHZW5lcmF0ZSBhIHNlcXVlbmNlIG9mIGRlZnMgd2l0aCBwcmludGYuCisvLyAgIEZvciBpbnN0YW5jZSwgKHNlcXVlbmNlICJSJXUiLCAwLCAzKSAtPiBbIFIwLCBSMSwgUjIsIFIzIF0KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFCTEVHRU5fU0VUVEhFT1JZX0gKKyNkZWZpbmUgTExWTV9UQUJMRUdFTl9TRVRUSEVPUllfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU01Mb2MuaCIKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBEYWdJbml0OworY2xhc3MgSW5pdDsKK2NsYXNzIFJlY29yZDsKKworY2xhc3MgU2V0VGhlb3J5IHsKK3B1YmxpYzoKKyAgdXNpbmcgUmVjVmVjID0gc3RkOjp2ZWN0b3I8UmVjb3JkICo+OworICB1c2luZyBSZWNTZXQgPSBTbWFsbFNldFZlY3RvcjxSZWNvcmQgKiwgMTY+OworCisgIC8vLyBPcGVyYXRvciAtIEEgY2FsbGJhY2sgcmVwcmVzZW50aW5nIGEgREFHIG9wZXJhdG9yLgorICBjbGFzcyBPcGVyYXRvciB7CisgICAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCisgIHB1YmxpYzoKKyAgICB2aXJ0dWFsIH5PcGVyYXRvcigpID0gZGVmYXVsdDsKKworICAgIC8vLyBhcHBseSAtIEFwcGx5IHRoaXMgb3BlcmF0b3IgdG8gRXhwcidzIGFyZ3VtZW50cyBhbmQgaW5zZXJ0IHRoZSByZXN1bHQKKyAgICAvLy8gaW4gRWx0cy4KKyAgICB2aXJ0dWFsIHZvaWQgYXBwbHkoU2V0VGhlb3J5JiwgRGFnSW5pdCAqRXhwciwgUmVjU2V0ICZFbHRzLAorICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxTTUxvYz4gTG9jKSA9IDA7CisgIH07CisKKyAgLy8vIEV4cGFuZGVyIC0gQSBjYWxsYmFjayBmdW5jdGlvbiB0aGF0IGNhbiB0cmFuc2Zvcm0gYSBSZWNvcmQgcmVwcmVzZW50aW5nIGEKKyAgLy8vIHNldCBpbnRvIGEgZnVsbHkgZXhwYW5kZWQgbGlzdCBvZiBlbGVtZW50cy4gRXhwYW5kZXJzIHByb3ZpZGUgYSB3YXkgZm9yCisgIC8vLyB1c2VycyB0byBkZWZpbmUgbmFtZWQgc2V0cyB0aGF0IGNhbiBiZSB1c2VkIGluIERBRyBleHByZXNzaW9ucy4KKyAgY2xhc3MgRXhwYW5kZXIgeworICAgIHZpcnR1YWwgdm9pZCBhbmNob3IoKTsKKworICBwdWJsaWM6CisgICAgdmlydHVhbCB+RXhwYW5kZXIoKSA9IGRlZmF1bHQ7CisKKyAgICB2aXJ0dWFsIHZvaWQgZXhwYW5kKFNldFRoZW9yeSYsIFJlY29yZCosIFJlY1NldCAmRWx0cykgPSAwOworICB9OworCitwcml2YXRlOgorICAvLyBNYXAgc2V0IGRlZnMgdG8gdGhlaXIgZnVsbHkgZXhwYW5kZWQgY29udGVudHMuIFRoaXMgc2VydmVzIGFzIGEgbWVtb2l6YXRpb24KKyAgLy8gY2FjaGUgYW5kIGl0IG1ha2VzIGl0IHBvc3NpYmxlIHRvIHJldHVybiBjb25zdCByZWZlcmVuY2VzIG9uIHF1ZXJpZXMuCisgIHVzaW5nIEV4cGFuZE1hcCA9IHN0ZDo6bWFwPFJlY29yZCAqLCBSZWNWZWM+OworICBFeHBhbmRNYXAgRXhwYW5zaW9uczsKKworICAvLyBLbm93biBEQUcgb3BlcmF0b3JzIGJ5IG5hbWUuCisgIFN0cmluZ01hcDxzdGQ6OnVuaXF1ZV9wdHI8T3BlcmF0b3I+PiBPcGVyYXRvcnM7CisKKyAgLy8gVHlwZWQgZXhwYW5kZXJzIGJ5IGNsYXNzIG5hbWUuCisgIFN0cmluZ01hcDxzdGQ6OnVuaXF1ZV9wdHI8RXhwYW5kZXI+PiBFeHBhbmRlcnM7CisKK3B1YmxpYzoKKyAgLy8vIENyZWF0ZSBhIFNldFRoZW9yeSBpbnN0YW5jZSB3aXRoIG9ubHkgdGhlIHN0YW5kYXJkIG9wZXJhdG9ycy4KKyAgU2V0VGhlb3J5KCk7CisKKyAgLy8vIGFkZEV4cGFuZGVyIC0gQWRkIGFuIGV4cGFuZGVyIGZvciBSZWNvcmRzIHdpdGggdGhlIG5hbWVkIHN1cGVyIGNsYXNzLgorICB2b2lkIGFkZEV4cGFuZGVyKFN0cmluZ1JlZiBDbGFzc05hbWUsIHN0ZDo6dW5pcXVlX3B0cjxFeHBhbmRlcj4pOworCisgIC8vLyBhZGRGaWVsZEV4cGFuZGVyIC0gQWRkIGFuIGV4cGFuZGVyIGZvciBDbGFzc05hbWUgdGhhdCBzaW1wbHkgZXZhbHVhdGVzCisgIC8vLyBGaWVsZE5hbWUgaW4gdGhlIFJlY29yZCB0byBnZXQgdGhlIHNldCBlbGVtZW50cy4gIFRoYXQgaXMgYWxsIHRoYXQgaXMKKyAgLy8vIG5lZWRlZCBmb3IgYSBjbGFzcyBsaWtlOgorICAvLy8KKyAgLy8vICAgY2xhc3MgU2V0PGRhZyBkPiB7CisgIC8vLyAgICAgZGFnIEVsdHMgPSBkOworICAvLy8gICB9CisgIC8vLworICB2b2lkIGFkZEZpZWxkRXhwYW5kZXIoU3RyaW5nUmVmIENsYXNzTmFtZSwgU3RyaW5nUmVmIEZpZWxkTmFtZSk7CisKKyAgLy8vIGFkZE9wZXJhdG9yIC0gQWRkIGEgREFHIG9wZXJhdG9yLgorICB2b2lkIGFkZE9wZXJhdG9yKFN0cmluZ1JlZiBOYW1lLCBzdGQ6OnVuaXF1ZV9wdHI8T3BlcmF0b3I+KTsKKworICAvLy8gZXZhbHVhdGUgLSBFdmFsdWF0ZSBFeHByIGFuZCBhcHBlbmQgdGhlIHJlc3VsdGluZyBzZXQgdG8gRWx0cy4KKyAgdm9pZCBldmFsdWF0ZShJbml0ICpFeHByLCBSZWNTZXQgJkVsdHMsIEFycmF5UmVmPFNNTG9jPiBMb2MpOworCisgIC8vLyBldmFsdWF0ZSAtIEV2YWx1YXRlIGEgc2VxdWVuY2Ugb2YgSW5pdHMgYW5kIGFwcGVuZCB0byBFbHRzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBJdGVyPgorICB2b2lkIGV2YWx1YXRlKEl0ZXIgYmVnaW4sIEl0ZXIgZW5kLCBSZWNTZXQgJkVsdHMsIEFycmF5UmVmPFNNTG9jPiBMb2MpIHsKKyAgICB3aGlsZSAoYmVnaW4gIT0gZW5kKQorICAgICAgZXZhbHVhdGUoKmJlZ2luKyssIEVsdHMsIExvYyk7CisgIH0KKworICAvLy8gZXhwYW5kIC0gRXhwYW5kIGEgcmVjb3JkIGludG8gYSBzZXQgb2YgZWxlbWVudHMgaWYgcG9zc2libGUuICBSZXR1cm4gYQorICAvLy8gcG9pbnRlciB0byB0aGUgZXhwYW5kZWQgZWxlbWVudHMsIG9yIE5VTEwgaWYgU2V0IGNhbm5vdCBiZSBleHBhbmRlZAorICAvLy8gZnVydGhlci4KKyAgY29uc3QgUmVjVmVjICpleHBhbmQoUmVjb3JkICpTZXQpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVEFCTEVHRU5fU0VUVEhFT1JZX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFibGVHZW4vU3RyaW5nTWF0Y2hlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYWJsZUdlbi9TdHJpbmdNYXRjaGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDlkMjA5MgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFibGVHZW4vU3RyaW5nTWF0Y2hlci5oCkBAIC0wLDAgKzEsNTYgQEAKKy8vPT09LSBTdHJpbmdNYXRjaGVyLmggLSBHZW5lcmF0ZSBhIG1hdGNoZXIgZm9yIGlucHV0IHN0cmluZ3MgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIFN0cmluZ01hdGNoZXIgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBQkxFR0VOX1NUUklOR01BVENIRVJfSAorI2RlZmluZSBMTFZNX1RBQkxFR0VOX1NUUklOR01BVENIRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIHJhd19vc3RyZWFtOworCisvLy8gU3RyaW5nTWF0Y2hlciAtIEdpdmVuIGEgbGlzdCBvZiBzdHJpbmdzIGFuZCBjb2RlIHRvIGV4ZWN1dGUgd2hlbiB0aGV5IG1hdGNoLAorLy8vIG91dHB1dCBhIHNpbXBsZSBzd2l0Y2ggdHJlZSB0byBjbGFzc2lmeSB0aGUgaW5wdXQgc3RyaW5nLgorLy8vCisvLy8gSWYgYSBtYXRjaCBpcyBmb3VuZCwgdGhlIGNvZGUgaW4gVmFsc1tpXS5zZWNvbmQgaXMgZXhlY3V0ZWQ7IGNvbnRyb2wgbXVzdAorLy8vIG5vdCBleGl0IHRoaXMgY29kZSBmcmFnbWVudC4gIElmIG5vdGhpbmcgbWF0Y2hlcywgZXhlY3V0aW9uIGZhbGxzIHRocm91Z2guCisvLy8KK2NsYXNzIFN0cmluZ01hdGNoZXIgeworcHVibGljOgorICB1c2luZyBTdHJpbmdQYWlyID0gc3RkOjpwYWlyPHN0ZDo6c3RyaW5nLCBzdGQ6OnN0cmluZz47CisKK3ByaXZhdGU6CisgIFN0cmluZ1JlZiBTdHJWYXJpYWJsZU5hbWU7CisgIGNvbnN0IHN0ZDo6dmVjdG9yPFN0cmluZ1BhaXI+ICZNYXRjaGVzOworICByYXdfb3N0cmVhbSAmT1M7CisKK3B1YmxpYzoKKyAgU3RyaW5nTWF0Y2hlcihTdHJpbmdSZWYgc3RyVmFyaWFibGVOYW1lLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFN0cmluZ1BhaXI+ICZtYXRjaGVzLCByYXdfb3N0cmVhbSAmb3MpCisgICAgOiBTdHJWYXJpYWJsZU5hbWUoc3RyVmFyaWFibGVOYW1lKSwgTWF0Y2hlcyhtYXRjaGVzKSwgT1Mob3MpIHt9CisKKyAgdm9pZCBFbWl0KHVuc2lnbmVkIEluZGVudCA9IDAsIGJvb2wgSWdub3JlRHVwbGljYXRlcyA9IGZhbHNlKSBjb25zdDsKKworcHJpdmF0ZToKKyAgYm9vbCBFbWl0U3RyaW5nTWF0Y2hlckZvckNoYXIoY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgU3RyaW5nUGFpciAqPiAmTWF0Y2hlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgQ2hhck5vLCB1bnNpZ25lZCBJbmRlbnRDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJZ25vcmVEdXBsaWNhdGVzKSBjb25zdDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RBQkxFR0VOX1NUUklOR01BVENIRVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYWJsZUdlbi9TdHJpbmdUb09mZnNldFRhYmxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhYmxlR2VuL1N0cmluZ1RvT2Zmc2V0VGFibGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjExZTg4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYWJsZUdlbi9TdHJpbmdUb09mZnNldFRhYmxlLmgKQEAgLTAsMCArMSwxMDUgQEAKKy8vPT09LSBTdHJpbmdUb09mZnNldFRhYmxlLmggLSBFbWl0IGEgYmlnIGNvbmNhdGVuYXRlZCBzdHJpbmcgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQUJMRUdFTl9TVFJJTkdUT09GRlNFVFRBQkxFX0gKKyNkZWZpbmUgTExWTV9UQUJMRUdFTl9TVFJJTkdUT09GRlNFVFRBQkxFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSA8Y2N0eXBlPgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBTdHJpbmdUb09mZnNldFRhYmxlIC0gVGhpcyBjbGFzcyB1bmlxdWVzIGEgYnVuY2ggb2YgbnVsLXRlcm1pbmF0ZWQgc3RyaW5ncworLy8vIGFuZCBrZWVwcyB0cmFjayBvZiB0aGVpciBvZmZzZXQgaW4gYSBtYXNzaXZlIGNvbnRpZ3VvdXMgc3RyaW5nIGFsbG9jYXRpb24uCisvLy8gSXQgY2FuIHRoZW4gb3V0cHV0IHRoaXMgc3RyaW5nIGJsb2IgYW5kIHVzZSBpbmRleGVzIGludG8gdGhlIHN0cmluZyB0bworLy8vIHJlZmVyZW5jZSBlYWNoIHBpZWNlLgorY2xhc3MgU3RyaW5nVG9PZmZzZXRUYWJsZSB7CisgIFN0cmluZ01hcDx1bnNpZ25lZD4gU3RyaW5nT2Zmc2V0OworICBzdGQ6OnN0cmluZyBBZ2dyZWdhdGVTdHJpbmc7CisKK3B1YmxpYzoKKyAgYm9vbCBFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFN0cmluZ09mZnNldC5lbXB0eSgpOyB9CisKKyAgdW5zaWduZWQgR2V0T3JBZGRTdHJpbmdPZmZzZXQoU3RyaW5nUmVmIFN0ciwgYm9vbCBhcHBlbmRaZXJvID0gdHJ1ZSkgeworICAgIGF1dG8gSXRlckJvb2wgPQorICAgICAgICBTdHJpbmdPZmZzZXQuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKFN0ciwgQWdncmVnYXRlU3RyaW5nLnNpemUoKSkpOworICAgIGlmIChJdGVyQm9vbC5zZWNvbmQpIHsKKyAgICAgIC8vIEFkZCB0aGUgc3RyaW5nIHRvIHRoZSBhZ2dyZWdhdGUgaWYgdGhpcyBpcyB0aGUgZmlyc3QgdGltZSBmb3VuZC4KKyAgICAgIEFnZ3JlZ2F0ZVN0cmluZy5hcHBlbmQoU3RyLmJlZ2luKCksIFN0ci5lbmQoKSk7CisgICAgICBpZiAoYXBwZW5kWmVybykKKyAgICAgICAgQWdncmVnYXRlU3RyaW5nICs9ICdcMCc7CisgICAgfQorCisgICAgcmV0dXJuIEl0ZXJCb29sLmZpcnN0LT5zZWNvbmQ7CisgIH0KKworICB2b2lkIEVtaXRTdHJpbmcocmF3X29zdHJlYW0gJk8pIHsKKyAgICAvLyBFc2NhcGUgdGhlIHN0cmluZy4KKyAgICBTbWFsbFN0cmluZzwyNTY+IFN0cjsKKyAgICByYXdfc3ZlY3Rvcl9vc3RyZWFtKFN0cikud3JpdGVfZXNjYXBlZChBZ2dyZWdhdGVTdHJpbmcpOworICAgIEFnZ3JlZ2F0ZVN0cmluZyA9IFN0ci5zdHIoKTsKKworICAgIE8gPDwgIiAgICBcIiI7CisgICAgdW5zaWduZWQgQ2hhcnNQcmludGVkID0gMDsKKyAgICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gQWdncmVnYXRlU3RyaW5nLnNpemUoKTsgaSAhPSBlOyArK2kpIHsKKyAgICAgIGlmIChDaGFyc1ByaW50ZWQgPiA3MCkgeworICAgICAgICBPIDw8ICJcIlxuICAgIFwiIjsKKyAgICAgICAgQ2hhcnNQcmludGVkID0gMDsKKyAgICAgIH0KKyAgICAgIE8gPDwgQWdncmVnYXRlU3RyaW5nW2ldOworICAgICAgKytDaGFyc1ByaW50ZWQ7CisKKyAgICAgIC8vIFByaW50IGVzY2FwZSBzZXF1ZW5jZXMgYWxsIHRvZ2V0aGVyLgorICAgICAgaWYgKEFnZ3JlZ2F0ZVN0cmluZ1tpXSAhPSAnXFwnKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgYXNzZXJ0KGkgKyAxIDwgQWdncmVnYXRlU3RyaW5nLnNpemUoKSAmJiAiSW5jb21wbGV0ZSBlc2NhcGUgc2VxdWVuY2UhIik7CisgICAgICBpZiAoaXNkaWdpdChBZ2dyZWdhdGVTdHJpbmdbaSArIDFdKSkgeworICAgICAgICBhc3NlcnQoaXNkaWdpdChBZ2dyZWdhdGVTdHJpbmdbaSArIDJdKSAmJgorICAgICAgICAgICAgICAgaXNkaWdpdChBZ2dyZWdhdGVTdHJpbmdbaSArIDNdKSAmJgorICAgICAgICAgICAgICAgIkV4cGVjdGVkIDMgZGlnaXQgb2N0YWwgZXNjYXBlISIpOworICAgICAgICBPIDw8IEFnZ3JlZ2F0ZVN0cmluZ1srK2ldOworICAgICAgICBPIDw8IEFnZ3JlZ2F0ZVN0cmluZ1srK2ldOworICAgICAgICBPIDw8IEFnZ3JlZ2F0ZVN0cmluZ1srK2ldOworICAgICAgICBDaGFyc1ByaW50ZWQgKz0gMzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIE8gPDwgQWdncmVnYXRlU3RyaW5nWysraV07CisgICAgICAgICsrQ2hhcnNQcmludGVkOworICAgICAgfQorICAgIH0KKyAgICBPIDw8ICJcIiI7CisgIH0KKworICAvLy8gRW1pdCB0aGUgc3RyaW5nIHVzaW5nIGNoYXJhY3RlciBsaXRlcmFscy4gTVNWQyBoYXMgYSBsaW1pdGF0aW9uIHRoYXQKKyAgLy8vIHN0cmluZyBsaXRlcmFscyBjYW5ub3QgYmUgbG9uZ2VyIHRoYW4gNjRLLgorICB2b2lkIEVtaXRDaGFyQXJyYXkocmF3X29zdHJlYW0gJk8pIHsKKyAgICBhc3NlcnQoQWdncmVnYXRlU3RyaW5nLmZpbmQoJyknKSA9PSBzdGQ6OnN0cmluZzo6bnBvcyAmJgorICAgICAgICAgICAiY2FuJ3QgZW1pdCByYXcgc3RyaW5nIHdpdGggY2xvc2luZyBwYXJlbnMiKTsKKyAgICBpbnQgQ291bnQgPSAwOworICAgIE8gPDwgJyAnOworICAgIGZvciAoY2hhciBDIDogQWdncmVnYXRlU3RyaW5nKSB7CisgICAgICBPIDw8ICIgXCciOworICAgICAgTy53cml0ZV9lc2NhcGVkKFN0cmluZ1JlZigmQywgMSkpOworICAgICAgTyA8PCAiXCcsIjsKKyAgICAgIENvdW50Kys7CisgICAgICBpZiAoQ291bnQgPiAxNCkgeworICAgICAgICBPIDw8ICJcbiAiOworICAgICAgICBDb3VudCA9IDA7CisgICAgICB9CisgICAgfQorICAgIE8gPDwgJ1xuJzsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhYmxlR2VuL1RhYmxlR2VuQmFja2VuZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYWJsZUdlbi9UYWJsZUdlbkJhY2tlbmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMjI2ZjFmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYWJsZUdlbi9UYWJsZUdlbkJhY2tlbmQuaApAQCAtMCwwICsxLDI4IEBACisvLz09PS0gbGx2bS9UYWJsZUdlbi9UYWJsZUdlbkJhY2tlbmQuaCAtIEJhY2tlbmQgdXRpbGl0aWVzIC0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFVzZWZ1bCB1dGlsaXRpZXMgZm9yIFRhYmxlR2VuIGJhY2tlbmRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQUJMRUdFTl9UQUJMRUdFTkJBQ0tFTkRfSAorI2RlZmluZSBMTFZNX1RBQkxFR0VOX1RBQkxFR0VOQkFDS0VORF9ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgU3RyaW5nUmVmOworY2xhc3MgcmF3X29zdHJlYW07CisKKy8vLyBlbWl0U291cmNlRmlsZUhlYWRlciAtIE91dHB1dCBhbiBMTFZNIHN0eWxlIGZpbGUgaGVhZGVyIHRvIHRoZSBzcGVjaWZpZWQKKy8vLyByYXdfb3N0cmVhbS4KK3ZvaWQgZW1pdFNvdXJjZUZpbGVIZWFkZXIoU3RyaW5nUmVmIERlc2MsIHJhd19vc3RyZWFtICZPUyk7CisKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvQ29kZUdlbkNXcmFwcGVycy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvQ29kZUdlbkNXcmFwcGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5YTk5MDUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9Db2RlR2VuQ1dyYXBwZXJzLmgKQEAgLTAsMCArMSw2MSBAQAorLy89PT0tIGxsdm0vVGFyZ2V0L0NvZGVHZW5DV3JhcHBlcnMuaCAtIENvZGVHZW4gQyBXcmFwcGVycyAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBDIGJpbmRpbmdzIHdyYXBwZXJzIGZvciBlbnVtcyBpbiBsbHZtL1N1cHBvcnQvQ29kZUdlbi5oCisvLyB0aGF0IG5lZWQgdGhlbS4gIFRoZSB3cmFwcGVycyBhcmUgc2VwYXJhdGVkIHRvIGF2b2lkIGFkZGluZyBhbiBpbmRpcmVjdAorLy8gZGVwZW5kZW5jeSBvbiBsbHZtL0NvbmZpZy9UYXJnZXRzLmRlZiB0byBDb2RlR2VuLmguCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RBUkdFVF9DT0RFR0VOQ1dSQVBQRVJTX0gKKyNkZWZpbmUgTExWTV9UQVJHRVRfQ09ERUdFTkNXUkFQUEVSU19ICisKKyNpbmNsdWRlICJsbHZtLWMvVGFyZ2V0TWFjaGluZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvZGVHZW4uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2lubGluZSBPcHRpb25hbDxDb2RlTW9kZWw6Ok1vZGVsPiB1bndyYXAoTExWTUNvZGVNb2RlbCBNb2RlbCwgYm9vbCAmSklUKSB7CisgIEpJVCA9IGZhbHNlOworICBzd2l0Y2ggKE1vZGVsKSB7CisgIGNhc2UgTExWTUNvZGVNb2RlbEpJVERlZmF1bHQ6CisgICAgSklUID0gdHJ1ZTsKKyAgICBMTFZNX0ZBTExUSFJPVUdIOworICBjYXNlIExMVk1Db2RlTW9kZWxEZWZhdWx0OgorICAgIHJldHVybiBOb25lOworICBjYXNlIExMVk1Db2RlTW9kZWxTbWFsbDoKKyAgICByZXR1cm4gQ29kZU1vZGVsOjpTbWFsbDsKKyAgY2FzZSBMTFZNQ29kZU1vZGVsS2VybmVsOgorICAgIHJldHVybiBDb2RlTW9kZWw6Oktlcm5lbDsKKyAgY2FzZSBMTFZNQ29kZU1vZGVsTWVkaXVtOgorICAgIHJldHVybiBDb2RlTW9kZWw6Ok1lZGl1bTsKKyAgY2FzZSBMTFZNQ29kZU1vZGVsTGFyZ2U6CisgICAgcmV0dXJuIENvZGVNb2RlbDo6TGFyZ2U7CisgIH0KKyAgcmV0dXJuIENvZGVNb2RlbDo6U21hbGw7Cit9CisKK2lubGluZSBMTFZNQ29kZU1vZGVsIHdyYXAoQ29kZU1vZGVsOjpNb2RlbCBNb2RlbCkgeworICBzd2l0Y2ggKE1vZGVsKSB7CisgIGNhc2UgQ29kZU1vZGVsOjpTbWFsbDoKKyAgICByZXR1cm4gTExWTUNvZGVNb2RlbFNtYWxsOworICBjYXNlIENvZGVNb2RlbDo6S2VybmVsOgorICAgIHJldHVybiBMTFZNQ29kZU1vZGVsS2VybmVsOworICBjYXNlIENvZGVNb2RlbDo6TWVkaXVtOgorICAgIHJldHVybiBMTFZNQ29kZU1vZGVsTWVkaXVtOworICBjYXNlIENvZGVNb2RlbDo6TGFyZ2U6CisgICAgcmV0dXJuIExMVk1Db2RlTW9kZWxMYXJnZTsKKyAgfQorICBsbHZtX3VucmVhY2hhYmxlKCJCYWQgQ29kZU1vZGVsISIpOworfQorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L0dlbmVyaWNPcGNvZGVzLnRkIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvR2VuZXJpY09wY29kZXMudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFmNmE5YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L0dlbmVyaWNPcGNvZGVzLnRkCkBAIC0wLDAgKzEsNjQ0IEBACisvLz09PS0tIEdlbmVyaWNPcGNvZGVzLnRkIC0gT3Bjb2RlcyB1c2VkIHdpdGggR2xvYmFsSVNlbCAtLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBnZW5lcmljIG9wY29kZXMgdXNlZCB3aXRoIEdsb2JhbElTZWwuCisvLyBBZnRlciBpbnN0cnVjdGlvbiBzZWxlY3Rpb24sIHRoZXNlIG9wY29kZXMgc2hvdWxkIG5vdCBhcHBlYXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVuYXJ5IG9wcy4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIEdlbmVyaWNJbnN0cnVjdGlvbiA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb247CisKKy8vIEV4dGVuZCB0aGUgdW5kZXJseWluZyBzY2FsYXIgdHlwZSBvZiBhbiBvcGVyYXRpb24sIGxlYXZpbmcgdGhlIGhpZ2ggYml0cworLy8gdW5zcGVjaWZpZWQuCitkZWYgR19BTllFWFQgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUxOiRzcmMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCisvLyBTaWduIGV4dGVuZCB0aGUgdW5kZXJseWluZyBzY2FsYXIgdHlwZSBvZiBhbiBvcGVyYXRpb24sIGNvcHlpbmcgdGhlIHNpZ24gYml0CisvLyBpbnRvIHRoZSBuZXdseS1jcmVhdGVkIHNwYWNlLgorZGVmIEdfU0VYVCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTE6JHNyYyk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKKy8vIFplcm8gZXh0ZW5kIHRoZSB1bmRlcmx5aW5nIHNjYWxhciB0eXBlIG9mIGFuIG9wZXJhdGlvbiwgcHV0dGluZyB6ZXJvIGJpdHMKKy8vIGludG8gdGhlIG5ld2x5LWNyZWF0ZWQgc3BhY2UuCitkZWYgR19aRVhUIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMTokc3JjKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworCisvLyBUcnVuY2F0ZSB0aGUgdW5kZXJseWluZyBzY2FsYXIgdHlwZSBvZiBhbiBvcGVyYXRpb24uIFRoaXMgaXMgZXF1aXZhbGVudCB0bworLy8gR19FWFRSQUNUIGZvciBzY2FsYXIgdHlwZXMsIGJ1dCBhY3RzIGVsZW1lbnR3aXNlIG9uIHZlY3RvcnMuCitkZWYgR19UUlVOQyA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTE6JHNyYyk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKK2RlZiBHX0lNUExJQ0lUX0RFRiA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCitkZWYgR19QSEkgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHZhcmlhYmxlX29wcyk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKK2RlZiBHX0ZSQU1FX0lOREVYIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB1bmtub3duOiRzcmMyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworZGVmIEdfR0xPQkFMX1ZBTFVFIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB1bmtub3duOiRzcmMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCitkZWYgR19JTlRUT1BUUiA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTE6JHNyYyk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKK2RlZiBHX1BUUlRPSU5UIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMTokc3JjKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworZGVmIEdfQklUQ0FTVCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTE6JHNyYyk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKK2RlZiBHX0NPTlNUQU5UIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB1bmtub3duOiRpbW0pOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCitkZWYgR19GQ09OU1RBTlQgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHVua25vd246JGltbSk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKK2RlZiBHX1ZBU1RBUlQgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokbGlzdCk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBtYXlTdG9yZSA9IDE7Cit9CisKK2RlZiBHX1ZBQVJHIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JHZhbCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMTokbGlzdCwgdW5rbm93bjokYWxpZ24pOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgbWF5TG9hZCA9IDE7CisgIGxldCBtYXlTdG9yZSA9IDE7Cit9CisKK2RlZiBHX0JTV0FQIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJpbmFyeSBvcHMuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBHZW5lcmljIGFkZGl0aW9uLgorZGVmIEdfQUREIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNDb21tdXRhYmxlID0gMTsKK30KKworLy8gR2VuZXJpYyBzdWJ0cmFjdGlvbi4KK2RlZiBHX1NVQiA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYzEsIHR5cGUwOiRzcmMyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IGlzQ29tbXV0YWJsZSA9IDA7Cit9CisKKy8vIEdlbmVyaWMgbXVsdGlwbGljYXRpb24uCitkZWYgR19NVUwgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxLCB0eXBlMDokc3JjMik7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc0NvbW11dGFibGUgPSAxOworfQorCisvLyBHZW5lcmljIHNpZ25lZCBkaXZpc2lvbi4KK2RlZiBHX1NESVYgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxLCB0eXBlMDokc3JjMik7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc0NvbW11dGFibGUgPSAwOworfQorCisvLyBHZW5lcmljIHVuc2lnbmVkIGRpdmlzaW9uLgorZGVmIEdfVURJViA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYzEsIHR5cGUwOiRzcmMyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IGlzQ29tbXV0YWJsZSA9IDA7Cit9CisKKy8vIEdlbmVyaWMgc2lnbmVkIHJlbWFpbmRlci4KK2RlZiBHX1NSRU0gOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxLCB0eXBlMDokc3JjMik7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc0NvbW11dGFibGUgPSAwOworfQorCisvLyBHZW5lcmljIHVuc2lnbmVkIHJlbWFpbmRlci4KK2RlZiBHX1VSRU0gOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxLCB0eXBlMDokc3JjMik7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc0NvbW11dGFibGUgPSAwOworfQorCisvLyBHZW5lcmljIGJpdHdpc2UgYW5kLgorZGVmIEdfQU5EIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNDb21tdXRhYmxlID0gMTsKK30KKworLy8gR2VuZXJpYyBiaXR3aXNlIG9yLgorZGVmIEdfT1IgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxLCB0eXBlMDokc3JjMik7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc0NvbW11dGFibGUgPSAxOworfQorCisvLyBHZW5lcmljIGJpdHdpc2UgeG9yLgorZGVmIEdfWE9SIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNDb21tdXRhYmxlID0gMTsKK30KKworLy8gR2VuZXJpYyBsZWZ0LXNoaWZ0LgorZGVmIEdfU0hMIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCisvLyBHZW5lcmljIGxvZ2ljYWwgcmlnaHQtc2hpZnQuCitkZWYgR19MU0hSIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCisvLyBHZW5lcmljIGFyaXRobWV0aWMgcmlnaHQtc2hpZnQuCitkZWYgR19BU0hSIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCisvLyBHZW5lcmljIGludGVnZXIgY29tcGFyaXNvbi4KK2RlZiBHX0lDTVAgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHVua25vd246JHRzdCwgdHlwZTE6JHNyYzEsIHR5cGUxOiRzcmMyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8gR2VuZXJpYyBmbG9hdGluZy1wb2ludCBjb21wYXJpc29uLgorZGVmIEdfRkNNUCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdW5rbm93bjokdHN0LCB0eXBlMTokc3JjMSwgdHlwZTE6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCisvLyBHZW5lcmljIHNlbGVjdAorZGVmIEdfU0VMRUNUIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMTokdHN0LCB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCisvLyBHZW5lcmljIHBvaW50ZXIgb2Zmc2V0LgorZGVmIEdfR0VQIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTE6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCitkZWYgR19QVFJfTUFTSyA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYywgdW5rbm93bjokYml0cyk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPdmVyZmxvdyBvcHMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEdlbmVyaWMgdW5zaWduZWQgYWRkaXRpb24gY29uc3VtaW5nIGFuZCBwcm9kdWNpbmcgYSBjYXJyeSBmbGFnLgorZGVmIEdfVUFEREUgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0LCB0eXBlMTokY2Fycnlfb3V0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxLCB0eXBlMDokc3JjMiwgdHlwZTE6JGNhcnJ5X2luKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8gR2VuZXJpYyBzaWduZWQgYWRkaXRpb24gcHJvZHVjaW5nIGEgY2FycnkgZmxhZy4KK2RlZiBHX1NBRERPIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCwgdHlwZTE6JGNhcnJ5X291dCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNDb21tdXRhYmxlID0gMTsKK30KKworLy8gR2VuZXJpYyB1bnNpZ25lZCBzdWJ0cmFjdGlvbiBjb25zdW1pbmcgYW5kIHByb2R1Y2luZyBhIGNhcnJ5IGZsYWcuCitkZWYgR19VU1VCRSA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QsIHR5cGUxOiRjYXJyeV9vdXQpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYzEsIHR5cGUwOiRzcmMyLCB0eXBlMTokY2FycnlfaW4pOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCisvLyBHZW5lcmljIHVuc2lnbmVkIHN1YnRyYWN0aW9uIHByb2R1Y2luZyBhIGNhcnJ5IGZsYWcuCitkZWYgR19TU1VCTyA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QsIHR5cGUxOiRjYXJyeV9vdXQpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYzEsIHR5cGUwOiRzcmMyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8gR2VuZXJpYyB1bnNpZ25lZCBtdWx0aXBsaWNhdGlvbiBwcm9kdWNpbmcgYSBjYXJyeSBmbGFnLgorZGVmIEdfVU1VTE8gOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0LCB0eXBlMTokY2Fycnlfb3V0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxLCB0eXBlMDokc3JjMik7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc0NvbW11dGFibGUgPSAxOworfQorCisvLyBHZW5lcmljIHNpZ25lZCBtdWx0aXBsaWNhdGlvbiBwcm9kdWNpbmcgYSBjYXJyeSBmbGFnLgorZGVmIEdfU01VTE8gOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0LCB0eXBlMTokY2Fycnlfb3V0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxLCB0eXBlMDokc3JjMik7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc0NvbW11dGFibGUgPSAxOworfQorCisvLyBNdWx0aXBseSB0d28gbnVtYmVycyBhdCB0d2ljZSB0aGUgaW5jb21pbmcgYml0IHdpZHRoICh1bnNpZ25lZCkgYW5kIHJldHVybgorLy8gdGhlIGhpZ2ggaGFsZiBvZiB0aGUgcmVzdWx0LgorZGVmIEdfVU1VTEggOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxLCB0eXBlMDokc3JjMik7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc0NvbW11dGFibGUgPSAxOworfQorCisvLyBNdWx0aXBseSB0d28gbnVtYmVycyBhdCB0d2ljZSB0aGUgaW5jb21pbmcgYml0IHdpZHRoIChzaWduZWQpIGFuZCByZXR1cm4KKy8vIHRoZSBoaWdoIGhhbGYgb2YgdGhlIHJlc3VsdC4KK2RlZiBHX1NNVUxIIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNDb21tdXRhYmxlID0gMTsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZsb2F0aW5nIFBvaW50IFVuYXJ5IE9wcy4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2RlZiBHX0ZORUcgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCitkZWYgR19GUEVYVCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTE6JHNyYyk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKK2RlZiBHX0ZQVFJVTkMgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUxOiRzcmMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCitkZWYgR19GUFRPU0kgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUxOiRzcmMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCitkZWYgR19GUFRPVUkgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUxOiRzcmMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCitkZWYgR19TSVRPRlAgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUxOiRzcmMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCitkZWYgR19VSVRPRlAgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUxOiRzcmMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCitkZWYgR19GQUJTIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEZsb2F0aW5nIFBvaW50IEJpbmFyeSBvcHMuCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBHZW5lcmljIEZQIGFkZGl0aW9uLgorZGVmIEdfRkFERCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYzEsIHR5cGUwOiRzcmMyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IGlzQ29tbXV0YWJsZSA9IDE7Cit9CisKKy8vIEdlbmVyaWMgRlAgc3VidHJhY3Rpb24uCitkZWYgR19GU1VCIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNDb21tdXRhYmxlID0gMDsKK30KKworLy8gR2VuZXJpYyBGUCBtdWx0aXBsaWNhdGlvbi4KK2RlZiBHX0ZNVUwgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxLCB0eXBlMDokc3JjMik7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc0NvbW11dGFibGUgPSAxOworfQorCisvLyBHZW5lcmljIGZ1c2VkIG11bHRpcGx5LWFkZCBpbnN0cnVjdGlvbi4KKy8vIEJlaGF2ZXMgbGlrZSBsbHZtIGZtYSBpbnRyaW5zaWMgaWUgc3JjMSAqIHNyYzIgKyBzcmMzCitkZWYgR19GTUEgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxLCB0eXBlMDokc3JjMiwgdHlwZTA6JHNyYzMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNDb21tdXRhYmxlID0gMDsKK30KKworLy8gR2VuZXJpYyBGUCBkaXZpc2lvbi4KK2RlZiBHX0ZESVYgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxLCB0eXBlMDokc3JjMik7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKKy8vIEdlbmVyaWMgRlAgcmVtYWluZGVyLgorZGVmIEdfRlJFTSA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYzEsIHR5cGUwOiRzcmMyKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8gRmxvYXRpbmcgcG9pbnQgZXhwb25lbnRpYXRpb24uCitkZWYgR19GUE9XIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSwgdHlwZTA6JHNyYzIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCisvLyBGbG9hdGluZyBwb2ludCBiYXNlLWUgZXhwb25lbnRpYWwgb2YgYSB2YWx1ZS4KK2RlZiBHX0ZFWFAgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8gRmxvYXRpbmcgcG9pbnQgYmFzZS0yIGV4cG9uZW50aWFsIG9mIGEgdmFsdWUuCitkZWYgR19GRVhQMiA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYzEpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCisvLyBGbG9hdGluZyBwb2ludCBiYXNlLTIgbG9nYXJpdGhtIG9mIGEgdmFsdWUuCitkZWYgR19GTE9HIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKKy8vIEZsb2F0aW5nIHBvaW50IGJhc2UtMiBsb2dhcml0aG0gb2YgYSB2YWx1ZS4KK2RlZiBHX0ZMT0cyIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjMSk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNZW1vcnkgb3BzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBHZW5lcmljIGxvYWQuIEV4cGVjdHMgYSBNYWNoaW5lTWVtT3BlcmFuZCBpbiBhZGRpdGlvbiB0byBleHBsaWNpdCBvcGVyYW5kcy4KK2RlZiBHX0xPQUQgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHB0eXBlMTokYWRkcik7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBtYXlMb2FkID0gMTsKK30KKworLy8gR2VuZXJpYyBzdG9yZS4gRXhwZWN0cyBhIE1hY2hpbmVNZW1PcGVyYW5kIGluIGFkZGl0aW9uIHRvIGV4cGxpY2l0IG9wZXJhbmRzLgorZGVmIEdfU1RPUkUgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMDokc3JjLCBwdHlwZTE6JGFkZHIpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgbWF5U3RvcmUgPSAxOworfQorCisvLyBHZW5lcmljIGF0b21pYyBjbXB4Y2hnIHdpdGggaW50ZXJuYWwgc3VjY2VzcyBjaGVjay4gRXhwZWN0cyBhCisvLyBNYWNoaW5lTWVtT3BlcmFuZCBpbiBhZGRpdGlvbiB0byBleHBsaWNpdCBvcGVyYW5kcy4KK2RlZiBHX0FUT01JQ19DTVBYQ0hHX1dJVEhfU1VDQ0VTUyA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRvbGR2YWwsIHR5cGUxOiRzdWNjZXNzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUyOiRhZGRyLCB0eXBlMDokY21wdmFsLCB0eXBlMDokbmV3dmFsKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IG1heUxvYWQgPSAxOworICBsZXQgbWF5U3RvcmUgPSAxOworfQorCisvLyBHZW5lcmljIGF0b21pYyBjbXB4Y2hnLiBFeHBlY3RzIGEgTWFjaGluZU1lbU9wZXJhbmQgaW4gYWRkaXRpb24gdG8gZXhwbGljaXQKKy8vIG9wZXJhbmRzLgorZGVmIEdfQVRPTUlDX0NNUFhDSEcgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokb2xkdmFsKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHB0eXBlMTokYWRkciwgdHlwZTA6JGNtcHZhbCwgdHlwZTA6JG5ld3ZhbCk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBtYXlMb2FkID0gMTsKKyAgbGV0IG1heVN0b3JlID0gMTsKK30KKworLy8gR2VuZXJpYyBhdG9taWNybXcuIEV4cGVjdHMgYSBNYWNoaW5lTWVtT3BlcmFuZCBpbiBhZGRpdGlvbiB0byBleHBsaWNpdAorLy8gb3BlcmFuZHMuCitjbGFzcyBHX0FUT01JQ1JNV19PUCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRvbGR2YWwpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgcHR5cGUxOiRhZGRyLCB0eXBlMDokdmFsKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IG1heUxvYWQgPSAxOworICBsZXQgbWF5U3RvcmUgPSAxOworfQorCitkZWYgR19BVE9NSUNSTVdfWENIRyA6IEdfQVRPTUlDUk1XX09QOworZGVmIEdfQVRPTUlDUk1XX0FERCA6IEdfQVRPTUlDUk1XX09QOworZGVmIEdfQVRPTUlDUk1XX1NVQiA6IEdfQVRPTUlDUk1XX09QOworZGVmIEdfQVRPTUlDUk1XX0FORCA6IEdfQVRPTUlDUk1XX09QOworZGVmIEdfQVRPTUlDUk1XX05BTkQgOiBHX0FUT01JQ1JNV19PUDsKK2RlZiBHX0FUT01JQ1JNV19PUiA6IEdfQVRPTUlDUk1XX09QOworZGVmIEdfQVRPTUlDUk1XX1hPUiA6IEdfQVRPTUlDUk1XX09QOworZGVmIEdfQVRPTUlDUk1XX01BWCA6IEdfQVRPTUlDUk1XX09QOworZGVmIEdfQVRPTUlDUk1XX01JTiA6IEdfQVRPTUlDUk1XX09QOworZGVmIEdfQVRPTUlDUk1XX1VNQVggOiBHX0FUT01JQ1JNV19PUDsKK2RlZiBHX0FUT01JQ1JNV19VTUlOIDogR19BVE9NSUNSTVdfT1A7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWYXJpYWRpYyBvcHMKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEV4dHJhY3QgYSByZWdpc3RlciBvZiB0aGUgc3BlY2lmaWVkIHNpemUsIHN0YXJ0aW5nIGZyb20gdGhlIGJsb2NrIGdpdmVuIGJ5CisvLyBpbmRleC4gVGhpcyB3aWxsIGFsbW9zdCBjZXJ0YWlubHkgYmUgbWFwcGVkIHRvIHN1Yi1yZWdpc3RlciBDT1BZcyBhZnRlcgorLy8gcmVnaXN0ZXIgYmFua3MgaGF2ZSBiZWVuIHNlbGVjdGVkLgorZGVmIEdfRVhUUkFDVCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRyZXMpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTE6JHNyYywgdW5rbm93bjokb2Zmc2V0KTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8gRXh0cmFjdCBtdWx0aXBsZSByZWdpc3RlcnMgc3BlY2lmaWVkIHNpemUsIHN0YXJ0aW5nIGZyb20gYmxvY2tzIGdpdmVuIGJ5CisvLyBpbmRleGVzLiBUaGlzIHdpbGwgYWxtb3N0IGNlcnRhaW5seSBiZSBtYXBwZWQgdG8gc3ViLXJlZ2lzdGVyIENPUFlzIGFmdGVyCisvLyByZWdpc3RlciBiYW5rcyBoYXZlIGJlZW4gc2VsZWN0ZWQuCitkZWYgR19VTk1FUkdFX1ZBTFVFUyA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QwLCB2YXJpYWJsZV9vcHMpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTE6JHNyYyk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKKy8vIEluc2VydCBhIHNtYWxsZXIgcmVnaXN0ZXIgaW50byBhIGxhcmdlciBvbmUgYXQgdGhlIHNwZWNpZmllZCBiaXQtaW5kZXguCitkZWYgR19JTlNFUlQgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMsIHR5cGUxOiRvcCwgdW5rbm93bjokb2Zmc2V0KTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8vIENvbmNhdGVuYXRlIG11bHRpcGxlIHJlZ2lzdGVycyBvZiB0aGUgc2FtZSBzaXplIGludG8gYSB3aWRlciByZWdpc3Rlci4KK2RlZiBHX01FUkdFX1ZBTFVFUyA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTE6JHNyYzAsIHZhcmlhYmxlX29wcyk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKKy8vIEludHJpbnNpYyB3aXRob3V0IHNpZGUgZWZmZWN0cy4KK2RlZiBHX0lOVFJJTlNJQyA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHVua25vd246JGludHJpbiwgdmFyaWFibGVfb3BzKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KKworLy8gSW50cmluc2ljIHdpdGggc2lkZSBlZmZlY3RzLgorZGVmIEdfSU5UUklOU0lDX1dfU0lERV9FRkZFQ1RTIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdW5rbm93bjokaW50cmluLCB2YXJpYWJsZV9vcHMpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAxOworICBsZXQgbWF5TG9hZCA9IDE7CisgIGxldCBtYXlTdG9yZSA9IDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCcmFuY2hlcy4KKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEdlbmVyaWMgdW5jb25kaXRpb25hbCBicmFuY2guCitkZWYgR19CUiA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHVua25vd246JHNyYzEpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNCcmFuY2ggPSAxOworICBsZXQgaXNUZXJtaW5hdG9yID0gMTsKKyAgbGV0IGlzQmFycmllciA9IDE7Cit9CisKKy8vIEdlbmVyaWMgY29uZGl0aW9uYWwgYnJhbmNoLgorZGVmIEdfQlJDT05EIDogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHRzdCwgdW5rbm93bjokdHJ1ZWJiKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IGlzQnJhbmNoID0gMTsKKyAgbGV0IGlzVGVybWluYXRvciA9IDE7Cit9CisKKy8vIEdlbmVyaWMgaW5kaXJlY3QgYnJhbmNoLgorZGVmIEdfQlJJTkRJUkVDVCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUwOiRzcmMxKTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IGlzQnJhbmNoID0gMTsKKyAgbGV0IGlzVGVybWluYXRvciA9IDE7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBWZWN0b3Igb3BzCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBHZW5lcmljIGluc2VydGVsZW1lbnQuCitkZWYgR19JTlNFUlRfVkVDVE9SX0VMVCA6IEdlbmVyaWNJbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHR5cGUwOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdHlwZTA6JHNyYywgdHlwZTE6JGVsdCwgdHlwZTI6JGlkeCk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CisKKy8vIEdlbmVyaWMgZXh0cmFjdGVsZW1lbnQuCitkZWYgR19FWFRSQUNUX1ZFQ1RPUl9FTFQgOiBHZW5lcmljSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB0eXBlMDokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHR5cGUxOiRzcmMsIHR5cGUyOiRpZHgpOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCisvLyBHZW5lcmljIHNodWZmbGV2ZWN0b3IuCitkZWYgR19TSFVGRkxFX1ZFQ1RPUjogR2VuZXJpY0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdHlwZTA6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB0eXBlMTokdjEsIHR5cGUxOiR2MiwgdHlwZTI6JG1hc2spOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorCisvLyBUT0RPOiBBZGQgdGhlIG90aGVyIGdlbmVyaWMgb3Bjb2Rlcy4KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L0dsb2JhbElTZWwvUmVnaXN0ZXJCYW5rLnRkIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvR2xvYmFsSVNlbC9SZWdpc3RlckJhbmsudGQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRmZDEzOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L0dsb2JhbElTZWwvUmVnaXN0ZXJCYW5rLnRkCkBAIC0wLDAgKzEsMTYgQEAKKy8vPT09LSBSZWdpc3RlckJhbmsudGQgLSBSZWdpc3RlciBiYW5rIGRlZmluaXRpb25zIC0tLS0tLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIFJlZ2lzdGVyQmFuazxzdHJpbmcgbmFtZSwgbGlzdDxSZWdpc3RlckNsYXNzPiBjbGFzc2VzPiB7CisgIHN0cmluZyBOYW1lID0gbmFtZTsKKyAgbGlzdDxSZWdpc3RlckNsYXNzPiBSZWdpc3RlckNsYXNzZXMgPSBjbGFzc2VzOworfQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvR2xvYmFsSVNlbC9TZWxlY3Rpb25EQUdDb21wYXQudGQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9HbG9iYWxJU2VsL1NlbGVjdGlvbkRBR0NvbXBhdC50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDNiNGE0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvR2xvYmFsSVNlbC9TZWxlY3Rpb25EQUdDb21wYXQudGQKQEAgLTAsMCArMSwxMjAgQEAKKy8vPT09LSBUYXJnZXRHbG9iYWxJU2VsLnRkIC0gQ29tbW9uIGNvZGUgZm9yIEdsb2JhbElTZWwgLS0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIHRhcmdldC1pbmRlcGVuZGVudCBpbnRlcmZhY2VzIHVzZWQgdG8gc3VwcG9ydAorLy8gU2VsZWN0aW9uREFHIGluc3RydWN0aW9uIHNlbGVjdGlvbiBwYXR0ZXJucyAoc3BlY2lmaWVkIGluCisvLyBUYXJnZXRTZWxlY3Rpb25EQUcudGQpIHdoZW4gZ2VuZXJhdGluZyBHbG9iYWxJU2VsIGluc3RydWN0aW9uIHNlbGVjdG9ycy4KKy8vCisvLyBUaGlzIGlzIGludGVuZGVkIGFzIGEgY29tcGF0aWJpbGl0eSBsYXllciwgdG8gZW5hYmxlIHJldXNlIG9mIHRhcmdldAorLy8gZGVzY3JpcHRpb25zIHdyaXR0ZW4gZm9yIFNlbGVjdGlvbkRBRyB3aXRob3V0IHJlcXVpcmluZyBleHBsaWNpdCBHbG9iYWxJU2VsCisvLyBzdXBwb3J0LiAgSXQgd2lsbCBldmVudHVhbGx5IHN1cGVyc2VkZSBTZWxlY3Rpb25EQUcgcGF0dGVybnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gRGVjbGFyZSB0aGF0IGEgZ2VuZXJpYyBJbnN0cnVjdGlvbiBpcyAnZXF1aXZhbGVudCcgdG8gYW4gU0ROb2RlLCB0aGF0IGlzLAorLy8gU2VsZWN0aW9uREFHIHBhdHRlcm5zIGludm9sdmluZyB0aGUgU0ROb2RlIGNhbiBiZSB0cmFuc2Zvcm1lZCB0byBtYXRjaCB0aGUKKy8vIEluc3RydWN0aW9uIGluc3RlYWQuCitjbGFzcyBHSU5vZGVFcXVpdjxJbnN0cnVjdGlvbiBpLCBTRE5vZGUgbm9kZT4geworICBJbnN0cnVjdGlvbiBJID0gaTsKKyAgU0ROb2RlIE5vZGUgPSBub2RlOworCisgIC8vIFNlbGVjdGlvbkRBRyBoYXMgc2VwYXJhdGUgbm9kZXMgZm9yIGF0b21pYyBhbmQgbm9uLWF0b21pYyBtZW1vcnkgb3BlcmF0aW9ucworICAvLyAoSVNEOjpMT0FELCBJU0Q6OkFUT01JQ19MT0FELCBJU0Q6OlNUT1JFLCBJU0Q6OkFUT01JQ19TVE9SRSkgYnV0IEdsb2JhbElTZWwKKyAgLy8gc3RvcmVzIHRoaXMgaW5mb3JtYXRpb24gaW4gdGhlIE1hY2hpbmVNZW1vcnlPcGVyYW5kLgorICBiaXQgQ2hlY2tNTU9Jc05vbkF0b21pYyA9IDA7Cit9CisKKy8vIFRoZXNlIGFyZSBkZWZpbmVkIGluIHRoZSBzYW1lIG9yZGVyIGFzIHRoZSBHXyogaW5zdHJ1Y3Rpb25zLgorZGVmIDogR0lOb2RlRXF1aXY8R19BTllFWFQsIGFueWV4dD47CitkZWYgOiBHSU5vZGVFcXVpdjxHX1NFWFQsIHNleHQ+OworZGVmIDogR0lOb2RlRXF1aXY8R19aRVhULCB6ZXh0PjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfVFJVTkMsIHRydW5jPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfQklUQ0FTVCwgYml0Y29udmVydD47CisvLyBHX0lOVFRPUFRSIC0gU2VsZWN0aW9uREFHIGhhcyBubyBlcXVpdmFsZW50LgorLy8gR19QVFJUT0lOVCAtIFNlbGVjdGlvbkRBRyBoYXMgbm8gZXF1aXZhbGVudC4KK2RlZiA6IEdJTm9kZUVxdWl2PEdfQ09OU1RBTlQsIGltbT47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0ZDT05TVEFOVCwgZnBpbW0+OworZGVmIDogR0lOb2RlRXF1aXY8R19BREQsIGFkZD47CitkZWYgOiBHSU5vZGVFcXVpdjxHX1NVQiwgc3ViPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfTVVMLCBtdWw+OworZGVmIDogR0lOb2RlRXF1aXY8R19TRElWLCBzZGl2PjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfVURJViwgdWRpdj47CitkZWYgOiBHSU5vZGVFcXVpdjxHX1NSRU0sIHNyZW0+OworZGVmIDogR0lOb2RlRXF1aXY8R19VUkVNLCB1cmVtPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfQU5ELCBhbmQ+OworZGVmIDogR0lOb2RlRXF1aXY8R19PUiwgb3I+OworZGVmIDogR0lOb2RlRXF1aXY8R19YT1IsIHhvcj47CitkZWYgOiBHSU5vZGVFcXVpdjxHX1NITCwgc2hsPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfTFNIUiwgc3JsPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfQVNIUiwgc3JhPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfU0VMRUNULCBzZWxlY3Q+OworZGVmIDogR0lOb2RlRXF1aXY8R19GTkVHLCBmbmVnPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfRlBFWFQsIGZwZXh0ZW5kPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfRlBUUlVOQywgZnByb3VuZD47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0ZQVE9TSSwgZnBfdG9fc2ludD47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0ZQVE9VSSwgZnBfdG9fdWludD47CitkZWYgOiBHSU5vZGVFcXVpdjxHX1NJVE9GUCwgc2ludF90b19mcD47CitkZWYgOiBHSU5vZGVFcXVpdjxHX1VJVE9GUCwgdWludF90b19mcD47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0ZBREQsIGZhZGQ+OworZGVmIDogR0lOb2RlRXF1aXY8R19GU1VCLCBmc3ViPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfRk1BLCBmbWE+OworZGVmIDogR0lOb2RlRXF1aXY8R19GTVVMLCBmbXVsPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfRkRJViwgZmRpdj47CitkZWYgOiBHSU5vZGVFcXVpdjxHX0ZSRU0sIGZyZW0+OworZGVmIDogR0lOb2RlRXF1aXY8R19GUE9XLCBmcG93PjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfRkVYUDIsIGZleHAyPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfRkxPRzIsIGZsb2cyPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfSU5UUklOU0lDLCBpbnRyaW5zaWNfd29fY2hhaW4+OworLy8gSVNEOjpJTlRSSU5TSUNfVk9JRCBjYW4gYWxzbyBiZSBoYW5kbGVkIHdpdGggR19JTlRSSU5TSUNfV19TSURFX0VGRkVDVFMuCitkZWYgOiBHSU5vZGVFcXVpdjxHX0lOVFJJTlNJQ19XX1NJREVfRUZGRUNUUywgaW50cmluc2ljX3ZvaWQ+OworZGVmIDogR0lOb2RlRXF1aXY8R19JTlRSSU5TSUNfV19TSURFX0VGRkVDVFMsIGludHJpbnNpY193X2NoYWluPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfQlIsIGJyPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfQlNXQVAsIGJzd2FwPjsKKworLy8gQnJvYWRseSBzcGVha2luZyBHX0xPQUQgaXMgZXF1aXZhbGVudCB0byBJU0Q6OkxPQUQgYnV0IHRoZXJlIGFyZSBzb21lCisvLyBjb21wbGljYXRpb25zIHRoYXQgdGFibGVnZW4gbXVzdCB0YWtlIGNhcmUgb2YuIEZvciBleGFtcGxlLCBQcmVkaWNhdGVzIHN1Y2gKKy8vIGFzIGlzU2lnbkV4dExvYWQgcmVxdWlyZSB0aGF0IHRoaXMgaXMgbm90IGEgcGVyZmVjdCAxOjEgbWFwcGluZyBzaW5jZSBhCisvLyBzaWduLWV4dGVuZGluZyBsb2FkIGlzIChHX1NFWFQgKEdfTE9BRCB4KSkgaW4gR2xvYmFsSVNlbC4gQWRkaXRpb25hbGx5LAorLy8gR19MT0FEIGhhbmRsZXMgYm90aCBhdG9taWMgYW5kIG5vbi1hdG9taWMgbG9hZHMgd2hlcmUgYXMgU2VsZWN0aW9uREFHIGhhZAorLy8gc2VwYXJhdGUgbm9kZXMgZm9yIHRoZW0uIFRoaXMgR0lOb2RlRXF1aXYgbWFwcyB0aGUgbm9uLWF0b21pYyBsb2FkcyB0bworLy8gR19MT0FEIHdpdGggYSBub24tYXRvbWljIE1hY2hpbmVNZW1PcGVyYW5kLgorZGVmIDogR0lOb2RlRXF1aXY8R19MT0FELCBsZD4geyBsZXQgQ2hlY2tNTU9Jc05vbkF0b21pYyA9IDE7IH0KKy8vIEJyb2FkbHkgc3BlYWtpbmcgR19TVE9SRSBpcyBlcXVpdmFsZW50IHRvIElTRDo6U1RPUkUgYnV0IHRoZXJlIGFyZSBzb21lCisvLyBjb21wbGljYXRpb25zIHRoYXQgdGFibGVnZW4gbXVzdCB0YWtlIGNhcmUgb2YuIEZvciBleGFtcGxlLCBwcmVkaWNhdGVzIHN1Y2gKKy8vIGFzIGlzVHJ1bmNTdG9yZSByZXF1aXJlIHRoYXQgdGhpcyBpcyBub3QgYSBwZXJmZWN0IDE6MSBtYXBwaW5nIHNpbmNlIGEKKy8vIHRydW5jYXRpbmcgc3RvcmUgaXMgKEdfU1RPUkUgKEdfVFJVTkNBVEUgeCkpIGluIEdsb2JhbElTZWwuIEFkZGl0aW9uYWxseSwKKy8vIEdfU1RPUkUgaGFuZGxlcyBib3RoIGF0b21pYyBhbmQgbm9uLWF0b21pYyBzdG9yZXMgd2hlcmUgYXMgU2VsZWN0aW9uREFHIGhhZAorLy8gc2VwYXJhdGUgbm9kZXMgZm9yIHRoZW0uIFRoaXMgR0lOb2RlRXF1aXYgbWFwcyB0aGUgbm9uLWF0b21pYyBzdG9yZXMgdG8KKy8vIEdfU1RPUkUgd2l0aCBhIG5vbi1hdG9taWMgTWFjaGluZU1lbU9wZXJhbmQuCitkZWYgOiBHSU5vZGVFcXVpdjxHX1NUT1JFLCBzdD4geyBsZXQgQ2hlY2tNTU9Jc05vbkF0b21pYyA9IDE7IH0KKworZGVmIDogR0lOb2RlRXF1aXY8R19BVE9NSUNfQ01QWENIRywgYXRvbWljX2NtcF9zd2FwPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfQVRPTUlDUk1XX1hDSEcsIGF0b21pY19zd2FwPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfQVRPTUlDUk1XX0FERCwgYXRvbWljX2xvYWRfYWRkPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfQVRPTUlDUk1XX1NVQiwgYXRvbWljX2xvYWRfc3ViPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfQVRPTUlDUk1XX0FORCwgYXRvbWljX2xvYWRfYW5kPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfQVRPTUlDUk1XX05BTkQsIGF0b21pY19sb2FkX25hbmQ+OworZGVmIDogR0lOb2RlRXF1aXY8R19BVE9NSUNSTVdfT1IsIGF0b21pY19sb2FkX29yPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfQVRPTUlDUk1XX1hPUiwgYXRvbWljX2xvYWRfeG9yPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfQVRPTUlDUk1XX01JTiwgYXRvbWljX2xvYWRfbWluPjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfQVRPTUlDUk1XX01BWCwgYXRvbWljX2xvYWRfbWF4PjsKK2RlZiA6IEdJTm9kZUVxdWl2PEdfQVRPTUlDUk1XX1VNSU4sIGF0b21pY19sb2FkX3VtaW4+OworZGVmIDogR0lOb2RlRXF1aXY8R19BVE9NSUNSTVdfVU1BWCwgYXRvbWljX2xvYWRfdW1heD47CisKKy8vIFNwZWNpZmllcyB0aGUgR2xvYmFsSVNlbCBlcXVpdmFsZW50cyBmb3IgU2VsZWN0aW9uREFHJ3MgQ29tcGxleFBhdHRlcm4uCisvLyBTaG91bGQgYmUgdXNlZCBvbiBkZWZzIHRoYXQgc3ViY2xhc3MgR0lDb21wbGV4T3BlcmFuZE1hdGNoZXI8Pi4KK2NsYXNzIEdJQ29tcGxleFBhdHRlcm5FcXVpdjxDb21wbGV4UGF0dGVybiBzZWxkYWc+IHsKKyAgQ29tcGxleFBhdHRlcm4gU2VsREFHRXF1aXZhbGVudCA9IHNlbGRhZzsKK30KKworLy8gU3BlY2lmaWVzIHRoZSBHbG9iYWxJU2VsIGVxdWl2YWxlbnRzIGZvciBTZWxlY3Rpb25EQUcncyBTRE5vZGVYRm9ybS4KKy8vIFNob3VsZCBiZSB1c2VkIG9uIGRlZnMgdGhhdCBzdWJjbGFzcyBHSUN1c3RvbU9wZXJhbmRSZW5kZXJlcjw+LgorY2xhc3MgR0lTRE5vZGVYRm9ybUVxdWl2PFNETm9kZVhGb3JtIHNlbGRhZz4geworICBTRE5vZGVYRm9ybSBTZWxEQUdFcXVpdmFsZW50ID0gc2VsZGFnOworfQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvR2xvYmFsSVNlbC9UYXJnZXQudGQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9HbG9iYWxJU2VsL1RhcmdldC50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzQwZjQwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvR2xvYmFsSVNlbC9UYXJnZXQudGQKQEAgLTAsMCArMSw2MSBAQAorLy89PT0tIFRhcmdldC50ZCAtIERlZmluZSBHbG9iYWxJU2VsIHJ1bGVzIC0tLS0tLS0tLS0tLS0tLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgdGFyZ2V0LWluZGVwZW5kZW50IGludGVyZmFjZXMgdXNlZCB0byBzdXBwb3J0CisvLyBTZWxlY3Rpb25EQUcgaW5zdHJ1Y3Rpb24gc2VsZWN0aW9uIHBhdHRlcm5zIChzcGVjaWZpZWQgaW4KKy8vIFRhcmdldFNlbGVjdGlvbkRBRy50ZCkgd2hlbiBnZW5lcmF0aW5nIEdsb2JhbElTZWwgaW5zdHJ1Y3Rpb24gc2VsZWN0b3JzLgorLy8KKy8vIFRoaXMgaXMgaW50ZW5kZWQgYXMgYSBjb21wYXRpYmlsaXR5IGxheWVyLCB0byBlbmFibGUgcmV1c2Ugb2YgdGFyZ2V0CisvLyBkZXNjcmlwdGlvbnMgd3JpdHRlbiBmb3IgU2VsZWN0aW9uREFHIHdpdGhvdXQgcmVxdWlyaW5nIGV4cGxpY2l0IEdsb2JhbElTZWwKKy8vIHN1cHBvcnQuICBJdCB3aWxsIGV2ZW50dWFsbHkgc3VwZXJzZWRlIFNlbGVjdGlvbkRBRyBwYXR0ZXJucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBEZWZpbml0aW9ucyB0aGF0IGluaGVyaXQgZnJvbSBMTFQgZGVmaW5lIHR5cGVzIHRoYXQgd2lsbCBiZSB1c2VkIGluIHRoZQorLy8gR2xvYmFsSVNlbCBtYXRjaGVyLgorY2xhc3MgTExUOworCitkZWYgczMyIDogTExUOworZGVmIHM2NCA6IExMVDsKKworLy8gRGVmaW5lcyBhIG1hdGNoZXIgZm9yIGNvbXBsZXggb3BlcmFuZHMuIFRoaXMgaXMgYW5hbG9nb3VzIHRvIENvbXBsZXhQYXR0ZXJuCisvLyBmcm9tIFNlbGVjdGlvbkRBRy4KKy8vCisvLyBEZWZpbml0aW9ucyB0aGF0IGluaGVyaXQgZnJvbSB0aGlzIG1heSBhbHNvIGluaGVyaXQgZnJvbQorLy8gR0lDb21wbGV4UGF0dGVybkVxdWl2IHRvIGVuYWJsZSB0aGUgaW1wb3J0IG9mIFNlbGVjdGlvbkRBRyBwYXR0ZXJucyBpbnZvbHZpbmcKKy8vIHRob3NlIENvbXBsZXhQYXR0ZXJucy4KK2NsYXNzIEdJQ29tcGxleE9wZXJhbmRNYXRjaGVyPExMVCB0eXBlLCBzdHJpbmcgbWF0Y2hlcmZuPiB7CisgIC8vIFRoZSBleHBlY3RlZCB0eXBlIG9mIHRoZSByb290IG9mIHRoZSBtYXRjaC4KKyAgLy8KKyAgLy8gVE9ETzogV2Ugc2hvdWxkIHByb2JhYmx5IHN1cHBvcnQsIGFueS10eXBlLCBhbnktc2NhbGFyLCBhbmQgbXVsdGlwbGUgdHlwZXMKKyAgLy8gICAgICAgaW4gdGhlIGZ1dHVyZS4KKyAgTExUIFR5cGUgPSB0eXBlOworCisgIC8vIFRoZSBmdW5jdGlvbiB0aGF0IGRldGVybWluZXMgd2hldGhlciB0aGUgb3BlcmFuZCBtYXRjaGVzLiBJdCBzaG91bGQgYmUgb2YKKyAgLy8gdGhlIGZvcm06CisgIC8vICAgYm9vbCBzZWxlY3QoY29uc3QgTWF0Y2hPcGVyYW5kICZSb290LCBNYXRjaE9wZXJhbmQgJlJlc3VsdDEpCisgIC8vIGFuZCBzaG91bGQgaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YgUmVzdWx0WCBhcmd1bWVudHMgYXMgdGhlIG51bWJlciBvZgorICAvLyByZXN1bHQgb3BlcmFuZHMuIEl0IG11c3QgcmV0dXJuIHRydWUgb24gc3VjY2Vzc2Z1bCBtYXRjaCBhbmQgZmFsc2UKKyAgLy8gb3RoZXJ3aXNlLiBJZiBpdCByZXR1cm5zIHRydWUsIHRoZW4gYWxsIHRoZSBSZXN1bHRYIGFyZ3VtZW50cyBtdXN0IGJlCisgIC8vIG92ZXJ3cml0dGVuLgorICBzdHJpbmcgTWF0Y2hlckZuID0gbWF0Y2hlcmZuOworfQorCisvLyBEZWZpbmVzIGEgY3VzdG9tIHJlbmRlcmVyLiBUaGlzIGlzIGFuYWxvZ291cyB0byBTRE5vZGVYRm9ybSBmcm9tCisvLyBTZWxlY3Rpb25EQUcuIFVubGlrZSBTRE5vZGVYRm9ybSwgdGhpcyBtYXRjaGVzIGEgTWFjaGluZUluc3RyIGFuZAorLy8gcmVuZGVycyBkaXJlY3RseSB0byB0aGUgcmVzdWx0IGluc3RydWN0aW9uIHdpdGhvdXQgYW4gaW50ZXJtZWRpYXRlIG5vZGUuCisvLworLy8gRGVmaW5pdGlvbnMgdGhhdCBpbmhlcml0IGZyb20gdGhpcyBtYXkgYWxzbyBpbmhlcml0IGZyb20gR0lTRE5vZGVYRm9ybUVxdWl2CisvLyB0byBlbmFibGUgdGhlIGltcG9ydCBvZiBTZWxlY3Rpb25EQUcgcGF0dGVybnMgaW52b2x2aW5nIHRob3NlIFNETm9kZVhGb3Jtcy4KK2NsYXNzIEdJQ3VzdG9tT3BlcmFuZFJlbmRlcmVyPHN0cmluZyByZW5kZXJlcmZuPiB7CisgIC8vIFRoZSBmdW5jdGlvbiByZW5kZXJzIHRoZSBvcGVyYW5kKHMpIG9mIHRoZSBtYXRjaGVkIGluc3RydWN0aW9uIHRvCisgIC8vIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24uIEl0IHNob3VsZCBiZSBvZiB0aGUgZm9ybToKKyAgLy8gICB2b2lkIHJlbmRlcihNYWNoaW5lSW5zdHJCdWlsZGVyICZNSUIsIGNvbnN0IE1hY2hpbmVJbnN0ciAmTUkpCisgIHN0cmluZyBSZW5kZXJlckZuID0gcmVuZGVyZXJmbjsKK30KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldC50ZCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldC50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTA5ZTliCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0LnRkCkBAIC0wLDAgKzEsMTUyNyBAQAorLy89PT0tIFRhcmdldC50ZCAtIFRhcmdldCBJbmRlcGVuZGVudCBUYWJsZUdlbiBpbnRlcmZhY2UgLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgdGFyZ2V0LWluZGVwZW5kZW50IGludGVyZmFjZXMgd2hpY2ggc2hvdWxkIGJlCisvLyBpbXBsZW1lbnRlZCBieSBlYWNoIHRhcmdldCB3aGljaCBpcyB1c2luZyBhIFRhYmxlR2VuIGJhc2VkIGNvZGUgZ2VuZXJhdG9yLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vIEluY2x1ZGUgYWxsIGluZm9ybWF0aW9uIGFib3V0IExMVk0gaW50cmluc2ljcy4KK2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljcy50ZCIKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFJlZ2lzdGVyIGZpbGUgZGVzY3JpcHRpb24gLSBUaGVzZSBjbGFzc2VzIGFyZSB1c2VkIHRvIGZpbGwgaW4gdGhlIHRhcmdldAorLy8gZGVzY3JpcHRpb24gY2xhc3Nlcy4KKworY2xhc3MgUmVnaXN0ZXJDbGFzczsgLy8gRm9yd2FyZCBkZWYKKworY2xhc3MgSHdNb2RlPHN0cmluZyBGUz4geworICAvLyBBIHN0cmluZyByZXByZXNlbnRpbmcgc3VidGFyZ2V0IGZlYXR1cmVzIHRoYXQgdHVybiBvbiB0aGlzIEhXIG1vZGUuCisgIC8vIEZvciBleGFtcGxlLCAiK2ZlYXQxLC1mZWF0MiIgd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSBtb2RlIGlzIGFjdGl2ZQorICAvLyB3aGVuICJmZWF0MSIgaXMgZW5hYmxlZCBhbmQgImZlYXQyIiBpcyBkaXNhYmxlZCBhdCB0aGUgc2FtZSB0aW1lLgorICAvLyBBbnkgb3RoZXIgZmVhdHVyZXMgYXJlIG5vdCBjaGVja2VkLgorICAvLyBXaGVuIG11bHRpcGxlIG1vZGVzIGFyZSB1c2VkLCB0aGV5IHNob3VsZCBiZSBtdXR1YWxseSBleGNsdXNpdmUsCisgIC8vIG90aGVyd2lzZSB0aGUgcmVzdWx0cyBhcmUgdW5wcmVkaWN0YWJsZS4KKyAgc3RyaW5nIEZlYXR1cmVzID0gRlM7Cit9CisKKy8vIEEgc3BlY2lhbCBtb2RlIHJlY29nbml6ZWQgYnkgdGFibGVnZW4uIFRoaXMgbW9kZSBpcyBjb25zaWRlcmVkIGFjdGl2ZQorLy8gd2hlbiBubyBvdGhlciBtb2RlIGlzIGFjdGl2ZS4gRm9yIHRhcmdldHMgdGhhdCBkbyBub3QgdXNlIHNwZWNpZmljIGh3CisvLyBtb2RlcywgdGhpcyBpcyB0aGUgb25seSBtb2RlLgorZGVmIERlZmF1bHRNb2RlIDogSHdNb2RlPCIiPjsKKworLy8gQSBjbGFzcyB1c2VkIHRvIGFzc29jaWF0ZSBvYmplY3RzIHdpdGggSFcgbW9kZXMuIEl0IGlzIG9ubHkgaW50ZW5kZWQgdG8KKy8vIGJlIHVzZWQgYXMgYSBiYXNlIGNsYXNzLCB3aGVyZSB0aGUgZGVyaXZlZCBjbGFzcyBzaG91bGQgY29udGFpbiBhIG1lbWJlcgorLy8gIk9iamVjdHMiLCB3aGljaCBpcyBhIGxpc3Qgb2YgdGhlIHNhbWUgbGVuZ3RoIGFzIHRoZSBsaXN0IG9mIG1vZGVzLgorLy8gVGhlIG4tdGggZWxlbWVudCBvbiB0aGUgT2JqZWN0cyBsaXN0IHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIHRoZSBuLXRoCisvLyBlbGVtZW50IG9uIHRoZSBNb2RlcyBsaXN0LgorY2xhc3MgSHdNb2RlU2VsZWN0PGxpc3Q8SHdNb2RlPiBNcz4geworICBsaXN0PEh3TW9kZT4gTW9kZXMgPSBNczsKK30KKworLy8gQSBjb21tb24gY2xhc3MgdGhhdCBpbXBsZW1lbnRzIGEgY291bnRlcnBhcnQgb2YgVmFsdWVUeXBlLCB3aGljaCBpcworLy8gZGVwZW5kZW50IG9uIGEgSFcgbW9kZS4gVGhpcyBjbGFzcyBpbmhlcml0cyBmcm9tIFZhbHVlVHlwZSBpdHNlbGYsCisvLyB3aGljaCBtYWtlcyBpdCBwb3NzaWJsZSB0byB1c2Ugb2JqZWN0cyBvZiB0aGlzIGNsYXNzIHdoZXJlIFZhbHVlVHlwZQorLy8gb2JqZWN0cyBjb3VsZCBiZSB1c2VkLiBUaGlzIGlzIHNwZWNpZmljYWxseSBhcHBsaWNhYmxlIHRvIHNlbGVjdGlvbgorLy8gcGF0dGVybnMuCitjbGFzcyBWYWx1ZVR5cGVCeUh3TW9kZTxsaXN0PEh3TW9kZT4gTXMsIGxpc3Q8VmFsdWVUeXBlPiBUcz4KKyAgICA6IEh3TW9kZVNlbGVjdDxNcz4sIFZhbHVlVHlwZTwwLCAwPiB7CisgIC8vIFRoZSBsZW5ndGggb2YgdGhpcyBsaXN0IG11c3QgYmUgdGhlIHNhbWUgYXMgdGhlIGxlbmd0aCBvZiBNcy4KKyAgbGlzdDxWYWx1ZVR5cGU+IE9iamVjdHMgPSBUczsKK30KKworLy8gQSBjbGFzcyByZXByZXNlbnRpbmcgdGhlIHJlZ2lzdGVyIHNpemUsIHNwaWxsIHNpemUgYW5kIHNwaWxsIGFsaWdubWVudAorLy8gaW4gYml0cyBvZiBhIHJlZ2lzdGVyLgorY2xhc3MgUmVnSW5mbzxpbnQgUlMsIGludCBTUywgaW50IFNBPiB7CisgIGludCBSZWdTaXplID0gUlM7ICAgICAgICAgLy8gUmVnaXN0ZXIgc2l6ZSBpbiBiaXRzLgorICBpbnQgU3BpbGxTaXplID0gU1M7ICAgICAgIC8vIFNwaWxsIHNsb3Qgc2l6ZSBpbiBiaXRzLgorICBpbnQgU3BpbGxBbGlnbm1lbnQgPSBTQTsgIC8vIFNwaWxsIHNsb3QgYWxpZ25tZW50IGluIGJpdHMuCit9CisKKy8vIFRoZSByZWdpc3RlciBzaXplL2FsaWdubWVudCBpbmZvcm1hdGlvbiwgcGFyYW1ldGVyaXplZCBieSBhIEhXIG1vZGUuCitjbGFzcyBSZWdJbmZvQnlId01vZGU8bGlzdDxId01vZGU+IE1zID0gW10sIGxpc3Q8UmVnSW5mbz4gVHMgPSBbXT4KKyAgICA6IEh3TW9kZVNlbGVjdDxNcz4geworICAvLyBUaGUgbGVuZ3RoIG9mIHRoaXMgbGlzdCBtdXN0IGJlIHRoZSBzYW1lIGFzIHRoZSBsZW5ndGggb2YgTXMuCisgIGxpc3Q8UmVnSW5mbz4gT2JqZWN0cyA9IFRzOworfQorCisvLyBTdWJSZWdJbmRleCAtIFVzZSBpbnN0YW5jZXMgb2YgU3ViUmVnSW5kZXggdG8gaWRlbnRpZnkgc3VicmVnaXN0ZXJzLgorY2xhc3MgU3ViUmVnSW5kZXg8aW50IHNpemUsIGludCBvZmZzZXQgPSAwPiB7CisgIHN0cmluZyBOYW1lc3BhY2UgPSAiIjsKKworICAvLyBTaXplIC0gU2l6ZSAoaW4gYml0cykgb2YgdGhlIHN1Yi1yZWdpc3RlcnMgcmVwcmVzZW50ZWQgYnkgdGhpcyBpbmRleC4KKyAgaW50IFNpemUgPSBzaXplOworCisgIC8vIE9mZnNldCAtIE9mZnNldCBvZiB0aGUgZmlyc3QgYml0IHRoYXQgaXMgcGFydCBvZiB0aGlzIHN1Yi1yZWdpc3RlciBpbmRleC4KKyAgLy8gU2V0IGl0IHRvIC0xIGlmIHRoZSBzYW1lIGluZGV4IGlzIHVzZWQgdG8gcmVwcmVzZW50IHN1Yi1yZWdpc3RlcnMgdGhhdCBjYW4KKyAgLy8gYmUgYXQgZGlmZmVyZW50IG9mZnNldHMgKGZvciBleGFtcGxlIHdoZW4gdXNpbmcgYW4gaW5kZXggdG8gYWNjZXNzIGFuCisgIC8vIGVsZW1lbnQgaW4gYSByZWdpc3RlciB0dXBsZSkuCisgIGludCBPZmZzZXQgPSBvZmZzZXQ7CisKKyAgLy8gQ29tcG9zZWRPZiAtIEEgbGlzdCBvZiB0d28gU3ViUmVnSW5kZXggaW5zdGFuY2VzLCBbQSwgQl0uCisgIC8vIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhpcyBTdWJSZWdJbmRleCBpcyB0aGUgcmVzdWx0IG9mIGNvbXBvc2luZyBBIGFuZCBCLgorICAvLyBTZWUgQ29tcG9zZWRTdWJSZWdJbmRleC4KKyAgbGlzdDxTdWJSZWdJbmRleD4gQ29tcG9zZWRPZiA9IFtdOworCisgIC8vIENvdmVyaW5nU3ViUmVnSW5kaWNlcyAtIEEgbGlzdCBvZiB0d28gb3IgbW9yZSBzdWItcmVnaXN0ZXIgaW5kZXhlcyB0aGF0CisgIC8vIGNvdmVyIHRoaXMgc3ViLXJlZ2lzdGVyLgorICAvLworICAvLyBUaGlzIGZpZWxkIHNob3VsZCBub3JtYWxseSBiZSBsZWZ0IGJsYW5rIGFzIFRhYmxlR2VuIGNhbiBpbmZlciBpdC4KKyAgLy8KKyAgLy8gVGFibGVHZW4gYXV0b21hdGljYWxseSBkZXRlY3RzIHN1Yi1yZWdpc3RlcnMgdGhhdCBzdHJhZGRsZSB0aGUgcmVnaXN0ZXJzCisgIC8vIGluIHRoZSBTdWJSZWdzIGZpZWxkIG9mIGEgUmVnaXN0ZXIgZGVmaW5pdGlvbi4gRm9yIGV4YW1wbGU6CisgIC8vCisgIC8vICAgUTAgICAgPSBkc3ViXzAgLT4gRDAsIGRzdWJfMSAtPiBEMQorICAvLyAgIFExICAgID0gZHN1Yl8wIC0+IEQyLCBkc3ViXzEgLT4gRDMKKyAgLy8gICBEMV9EMiA9IGRzdWJfMCAtPiBEMSwgZHN1Yl8xIC0+IEQyCisgIC8vICAgUVEwICAgPSBxc3ViXzAgLT4gUTAsIHFzdWJfMSAtPiBRMQorICAvLworICAvLyBUYWJsZUdlbiB3aWxsIGluZmVyIHRoYXQgRDFfRDIgaXMgYSBzdWItcmVnaXN0ZXIgb2YgUVEwLiBJdCB3aWxsIGJlIGdpdmVuCisgIC8vIHRoZSBzeW50aGV0aWMgaW5kZXggZHN1Yl8xX2RzdWJfMiB1bmxlc3Mgc29tZSBTdWJSZWdJbmRleCBpcyBkZWZpbmVkIHdpdGgKKyAgLy8gQ292ZXJpbmdTdWJSZWdJbmRpY2VzID0gW2RzdWJfMSwgZHN1Yl8yXS4KKyAgbGlzdDxTdWJSZWdJbmRleD4gQ292ZXJpbmdTdWJSZWdJbmRpY2VzID0gW107Cit9CisKKy8vIENvbXBvc2VkU3ViUmVnSW5kZXggLSBBIHN1Yi1yZWdpc3RlciB0aGF0IGlzIHRoZSByZXN1bHQgb2YgY29tcG9zaW5nIEEgYW5kIEIuCisvLyBPZmZzZXQgaXMgc2V0IHRvIHRoZSBzdW0gb2YgQSBhbmQgQidzIE9mZnNldHMuIFNpemUgaXMgc2V0IHRvIEIncyBTaXplLgorY2xhc3MgQ29tcG9zZWRTdWJSZWdJbmRleDxTdWJSZWdJbmRleCBBLCBTdWJSZWdJbmRleCBCPgorICA6IFN1YlJlZ0luZGV4PEIuU2l6ZSwgIWlmKCFlcShBLk9mZnNldCwgLTEpLCAtMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICFpZighZXEoQi5PZmZzZXQsIC0xKSwgLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWFkZChBLk9mZnNldCwgQi5PZmZzZXQpKSk+IHsKKyAgLy8gU2VlIFN1YlJlZ0luZGV4LgorICBsZXQgQ29tcG9zZWRPZiA9IFtBLCBCXTsKK30KKworLy8gUmVnQWx0TmFtZUluZGV4IC0gVGhlIGFsdGVybmF0ZSBuYW1lIHNldCB0byB1c2UgZm9yIHJlZ2lzdGVyIG9wZXJhbmRzIG9mCisvLyB0aGlzIHJlZ2lzdGVyIGNsYXNzIHdoZW4gcHJpbnRpbmcuCitjbGFzcyBSZWdBbHROYW1lSW5kZXggeworICBzdHJpbmcgTmFtZXNwYWNlID0gIiI7Cit9CitkZWYgTm9SZWdBbHROYW1lIDogUmVnQWx0TmFtZUluZGV4OworCisvLyBSZWdpc3RlciAtIFlvdSBzaG91bGQgZGVmaW5lIG9uZSBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGZvciBlYWNoIHJlZ2lzdGVyCisvLyBpbiB0aGUgdGFyZ2V0IG1hY2hpbmUuICBTdHJpbmcgbiB3aWxsIGJlY29tZSB0aGUgIm5hbWUiIG9mIHRoZSByZWdpc3Rlci4KK2NsYXNzIFJlZ2lzdGVyPHN0cmluZyBuLCBsaXN0PHN0cmluZz4gYWx0TmFtZXMgPSBbXT4geworICBzdHJpbmcgTmFtZXNwYWNlID0gIiI7CisgIHN0cmluZyBBc21OYW1lID0gbjsKKyAgbGlzdDxzdHJpbmc+IEFsdE5hbWVzID0gYWx0TmFtZXM7CisKKyAgLy8gQWxpYXNlcyAtIEEgbGlzdCBvZiByZWdpc3RlcnMgdGhhdCB0aGlzIHJlZ2lzdGVyIG92ZXJsYXBzIHdpdGguICBBIHJlYWQgb3IKKyAgLy8gbW9kaWZpY2F0aW9uIG9mIHRoaXMgcmVnaXN0ZXIgY2FuIHBvdGVudGlhbGx5IHJlYWQgb3IgbW9kaWZ5IHRoZSBhbGlhc2VkCisgIC8vIHJlZ2lzdGVycy4KKyAgbGlzdDxSZWdpc3Rlcj4gQWxpYXNlcyA9IFtdOworCisgIC8vIFN1YlJlZ3MgLSBBIGxpc3Qgb2YgcmVnaXN0ZXJzIHRoYXQgYXJlIHBhcnRzIG9mIHRoaXMgcmVnaXN0ZXIuIE5vdGUgdGhlc2UKKyAgLy8gYXJlICJpbW1lZGlhdGUiIHN1Yi1yZWdpc3RlcnMgYW5kIHRoZSByZWdpc3RlcnMgd2l0aGluIHRoZSBsaXN0IGRvIG5vdAorICAvLyB0aGVtc2VsdmVzIG92ZXJsYXAuIGUuZy4gRm9yIFg4NiwgRUFYJ3MgU3ViUmVncyBsaXN0IGNvbnRhaW5zIG9ubHkgW0FYXSwKKyAgLy8gbm90IFtBWCwgQUgsIEFMXS4KKyAgbGlzdDxSZWdpc3Rlcj4gU3ViUmVncyA9IFtdOworCisgIC8vIFN1YlJlZ0luZGljZXMgLSBGb3IgZWFjaCByZWdpc3RlciBpbiBTdWJSZWdzLCBzcGVjaWZ5IHRoZSBTdWJSZWdJbmRleCB1c2VkCisgIC8vIHRvIGFkZHJlc3MgaXQuIFN1Yi1zdWItcmVnaXN0ZXIgaW5kaWNlcyBhcmUgYXV0b21hdGljYWxseSBpbmhlcml0ZWQgZnJvbQorICAvLyBTdWJSZWdzLgorICBsaXN0PFN1YlJlZ0luZGV4PiBTdWJSZWdJbmRpY2VzID0gW107CisKKyAgLy8gUmVnQWx0TmFtZUluZGljZXMgLSBUaGUgYWx0ZXJuYXRlIG5hbWUgaW5kaWNlcyB3aGljaCBhcmUgdmFsaWQgZm9yIHRoaXMKKyAgLy8gcmVnaXN0ZXIuCisgIGxpc3Q8UmVnQWx0TmFtZUluZGV4PiBSZWdBbHROYW1lSW5kaWNlcyA9IFtdOworCisgIC8vIER3YXJmTnVtYmVycyAtIE51bWJlcnMgdXNlZCBpbnRlcm5hbGx5IGJ5IGdjYy9nZGIgdG8gaWRlbnRpZnkgdGhlIHJlZ2lzdGVyLgorICAvLyBUaGVzZSB2YWx1ZXMgY2FuIGJlIGRldGVybWluZWQgYnkgbG9jYXRpbmcgdGhlIDx0YXJnZXQ+LmggZmlsZSBpbiB0aGUKKyAgLy8gZGlyZWN0b3J5IGxsdm1nY2MvZ2NjL2NvbmZpZy88dGFyZ2V0Pi8gYW5kIGxvb2tpbmcgZm9yIFJFR0lTVEVSX05BTUVTLiAgVGhlCisgIC8vIG9yZGVyIG9mIHRoZXNlIG5hbWVzIGNvcnJlc3BvbmQgdG8gdGhlIGVudW1lcmF0aW9uIHVzZWQgYnkgZ2NjLiAgQSB2YWx1ZSBvZgorICAvLyAtMSBpbmRpY2F0ZXMgdGhhdCB0aGUgZ2NjIG51bWJlciBpcyB1bmRlZmluZWQgYW5kIC0yIHRoYXQgcmVnaXN0ZXIgbnVtYmVyCisgIC8vIGlzIGludmFsaWQgZm9yIHRoaXMgbW9kZS9mbGF2b3VyLgorICBsaXN0PGludD4gRHdhcmZOdW1iZXJzID0gW107CisKKyAgLy8gQ29zdFBlclVzZSAtIEFkZGl0aW9uYWwgY29zdCBvZiBpbnN0cnVjdGlvbnMgdXNpbmcgdGhpcyByZWdpc3RlciBjb21wYXJlZAorICAvLyB0byBvdGhlciByZWdpc3RlcnMgaW4gaXRzIGNsYXNzLiBUaGUgcmVnaXN0ZXIgYWxsb2NhdG9yIHdpbGwgdHJ5IHRvCisgIC8vIG1pbmltaXplIHRoZSBudW1iZXIgb2YgaW5zdHJ1Y3Rpb25zIHVzaW5nIGEgcmVnaXN0ZXIgd2l0aCBhIENvc3RQZXJVc2UuCisgIC8vIFRoaXMgaXMgdXNlZCBieSB0aGUgeDg2LTY0IGFuZCBBUk0gVGh1bWIgdGFyZ2V0cyB3aGVyZSBzb21lIHJlZ2lzdGVycworICAvLyByZXF1aXJlIGxhcmdlciBpbnN0cnVjdGlvbiBlbmNvZGluZ3MuCisgIGludCBDb3N0UGVyVXNlID0gMDsKKworICAvLyBDb3ZlcmVkQnlTdWJSZWdzIC0gV2hlbiB0aGlzIGJpdCBpcyBzZXQsIHRoZSB2YWx1ZSBvZiB0aGlzIHJlZ2lzdGVyIGlzCisgIC8vIGNvbXBsZXRlbHkgZGV0ZXJtaW5lZCBieSB0aGUgdmFsdWUgb2YgaXRzIHN1Yi1yZWdpc3RlcnMuICBGb3IgZXhhbXBsZSwgdGhlCisgIC8vIHg4NiByZWdpc3RlciBBWCBpcyBjb3ZlcmVkIGJ5IGl0cyBzdWItcmVnaXN0ZXJzIEFMIGFuZCBBSCwgYnV0IEVBWCBpcyBub3QKKyAgLy8gY292ZXJlZCBieSBpdHMgc3ViLXJlZ2lzdGVyIEFYLgorICBiaXQgQ292ZXJlZEJ5U3ViUmVncyA9IDA7CisKKyAgLy8gSFdFbmNvZGluZyAtIFRoZSB0YXJnZXQgc3BlY2lmaWMgaGFyZHdhcmUgZW5jb2RpbmcgZm9yIHRoaXMgcmVnaXN0ZXIuCisgIGJpdHM8MTY+IEhXRW5jb2RpbmcgPSAwOworCisgIGJpdCBpc0FydGlmaWNpYWwgPSAwOworfQorCisvLyBSZWdpc3RlcldpdGhTdWJSZWdzIC0gVGhpcyBjYW4gYmUgdXNlZCB0byBkZWZpbmUgaW5zdGFuY2VzIG9mIFJlZ2lzdGVyIHdoaWNoCisvLyBuZWVkIHRvIHNwZWNpZnkgc3ViLXJlZ2lzdGVycy4KKy8vIExpc3QgInN1YnJlZ3MiIHNwZWNpZmllcyB3aGljaCByZWdpc3RlcnMgYXJlIHN1Yi1yZWdpc3RlcnMgdG8gdGhpcyBvbmUuIFRoaXMKKy8vIGlzIHVzZWQgdG8gcG9wdWxhdGUgdGhlIFN1YlJlZ3MgYW5kIEFsaWFzU2V0IGZpZWxkcyBvZiBUYXJnZXRSZWdpc3RlckRlc2MuCisvLyBUaGlzIGFsbG93cyB0aGUgY29kZSBnZW5lcmF0b3IgdG8gYmUgY2FyZWZ1bCBub3QgdG8gcHV0IHR3byB2YWx1ZXMgd2l0aAorLy8gb3ZlcmxhcHBpbmcgbGl2ZSByYW5nZXMgaW50byByZWdpc3RlcnMgd2hpY2ggYWxpYXMuCitjbGFzcyBSZWdpc3RlcldpdGhTdWJSZWdzPHN0cmluZyBuLCBsaXN0PFJlZ2lzdGVyPiBzdWJyZWdzPiA6IFJlZ2lzdGVyPG4+IHsKKyAgbGV0IFN1YlJlZ3MgPSBzdWJyZWdzOworfQorCisvLyBEQUdPcGVyYW5kIC0gQW4gZW1wdHkgYmFzZSBjbGFzcyB0aGF0IHVuaWZpZXMgUmVnaXN0ZXJDbGFzcydzIGFuZCBvdGhlciBmb3JtcworLy8gb2YgT3BlcmFuZCdzIHRoYXQgYXJlIGxlZ2FsIGFzIHR5cGUgcXVhbGlmaWVycyBpbiBEQUcgcGF0dGVybnMuICBUaGlzIHNob3VsZAorLy8gb25seSBldmVyIGJlIHVzZWQgZm9yIGRlZmluaW5nIG11bHRpY2xhc3NlcyB0aGF0IGFyZSBwb2x5bW9ycGhpYyBvdmVyIGJvdGgKKy8vIFJlZ2lzdGVyQ2xhc3MncyBhbmQgb3RoZXIgT3BlcmFuZCdzLgorY2xhc3MgREFHT3BlcmFuZCB7CisgIHN0cmluZyBPcGVyYW5kTmFtZXNwYWNlID0gIk1DT0kiOworICBzdHJpbmcgRGVjb2Rlck1ldGhvZCA9ICIiOworfQorCisvLyBSZWdpc3RlckNsYXNzIC0gTm93IHRoYXQgYWxsIG9mIHRoZSByZWdpc3RlcnMgYXJlIGRlZmluZWQsIGFuZCBhbGlhc2VzCisvLyBiZXR3ZWVuIHJlZ2lzdGVycyBhcmUgZGVmaW5lZCwgc3BlY2lmeSB3aGljaCByZWdpc3RlcnMgYmVsb25nIHRvIHdoaWNoCisvLyByZWdpc3RlciBjbGFzc2VzLiAgVGhpcyBhbHNvIGRlZmluZXMgdGhlIGRlZmF1bHQgYWxsb2NhdGlvbiBvcmRlciBvZgorLy8gcmVnaXN0ZXJzIGJ5IHJlZ2lzdGVyIGFsbG9jYXRvcnMuCisvLworY2xhc3MgUmVnaXN0ZXJDbGFzczxzdHJpbmcgbmFtZXNwYWNlLCBsaXN0PFZhbHVlVHlwZT4gcmVnVHlwZXMsIGludCBhbGlnbm1lbnQsCisgICAgICAgICAgICAgICAgICAgIGRhZyByZWdMaXN0LCBSZWdBbHROYW1lSW5kZXggaWR4ID0gTm9SZWdBbHROYW1lPgorICA6IERBR09wZXJhbmQgeworICBzdHJpbmcgTmFtZXNwYWNlID0gbmFtZXNwYWNlOworCisgIC8vIFRoZSByZWdpc3RlciBzaXplL2FsaWdubWVudCBpbmZvcm1hdGlvbiwgcGFyYW1ldGVyaXplZCBieSBhIEhXIG1vZGUuCisgIFJlZ0luZm9CeUh3TW9kZSBSZWdJbmZvczsKKworICAvLyBSZWdUeXBlIC0gU3BlY2lmeSB0aGUgbGlzdCBWYWx1ZVR5cGUgb2YgdGhlIHJlZ2lzdGVycyBpbiB0aGlzIHJlZ2lzdGVyCisgIC8vIGNsYXNzLiAgTm90ZSB0aGF0IGFsbCByZWdpc3RlcnMgaW4gYSByZWdpc3RlciBjbGFzcyBtdXN0IGhhdmUgdGhlIHNhbWUKKyAgLy8gVmFsdWVUeXBlcy4gIFRoaXMgaXMgYSBsaXN0IGJlY2F1c2Ugc29tZSB0YXJnZXRzIHBlcm1pdCBzdG9yaW5nIGRpZmZlcmVudAorICAvLyB0eXBlcyBpbiBzYW1lIHJlZ2lzdGVyLCBmb3IgZXhhbXBsZSB2ZWN0b3IgdmFsdWVzIHdpdGggMTI4LWJpdCB0b3RhbCBzaXplLAorICAvLyBidXQgZGlmZmVyZW50IGNvdW50L3NpemUgb2YgaXRlbXMsIGxpa2UgU1NFIG9uIHg4Ni4KKyAgLy8KKyAgbGlzdDxWYWx1ZVR5cGU+IFJlZ1R5cGVzID0gcmVnVHlwZXM7CisKKyAgLy8gU2l6ZSAtIFNwZWNpZnkgdGhlIHNwaWxsIHNpemUgaW4gYml0cyBvZiB0aGUgcmVnaXN0ZXJzLiAgQSBkZWZhdWx0IHZhbHVlIG9mCisgIC8vIHplcm8gbGV0cyB0YWJsZ2VuIHBpY2sgYW4gYXBwcm9wcmlhdGUgc2l6ZS4KKyAgaW50IFNpemUgPSAwOworCisgIC8vIEFsaWdubWVudCAtIFNwZWNpZnkgdGhlIGFsaWdubWVudCByZXF1aXJlZCBvZiB0aGUgcmVnaXN0ZXJzIHdoZW4gdGhleSBhcmUKKyAgLy8gc3RvcmVkIG9yIGxvYWRlZCB0byBtZW1vcnkuCisgIC8vCisgIGludCBBbGlnbm1lbnQgPSBhbGlnbm1lbnQ7CisKKyAgLy8gQ29weUNvc3QgLSBUaGlzIHZhbHVlIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgY29zdCBvZiBjb3B5aW5nIGEgdmFsdWUKKyAgLy8gYmV0d2VlbiB0d28gcmVnaXN0ZXJzIGluIHRoaXMgcmVnaXN0ZXIgY2xhc3MuIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG9uZQorICAvLyBtZWFuaW5nIGl0IHRha2VzIGEgc2luZ2xlIGluc3RydWN0aW9uIHRvIHBlcmZvcm0gdGhlIGNvcHlpbmcuIEEgbmVnYXRpdmUKKyAgLy8gdmFsdWUgbWVhbnMgY29weWluZyBpcyBleHRyZW1lbHkgZXhwZW5zaXZlIG9yIGltcG9zc2libGUuCisgIGludCBDb3B5Q29zdCA9IDE7CisKKyAgLy8gTWVtYmVyTGlzdCAtIFNwZWNpZnkgd2hpY2ggcmVnaXN0ZXJzIGFyZSBpbiB0aGlzIGNsYXNzLiAgSWYgdGhlCisgIC8vIGFsbG9jYXRpb25fb3JkZXJfKiBtZXRob2QgYXJlIG5vdCBzcGVjaWZpZWQsIHRoaXMgYWxzbyBkZWZpbmVzIHRoZSBvcmRlciBvZgorICAvLyBhbGxvY2F0aW9uIHVzZWQgYnkgdGhlIHJlZ2lzdGVyIGFsbG9jYXRvci4KKyAgLy8KKyAgZGFnIE1lbWJlckxpc3QgPSByZWdMaXN0OworCisgIC8vIEFsdE5hbWVJbmRleCAtIFRoZSBhbHRlcm5hdGUgcmVnaXN0ZXIgbmFtZSB0byB1c2Ugd2hlbiBwcmludGluZyBvcGVyYW5kcworICAvLyBvZiB0aGlzIHJlZ2lzdGVyIGNsYXNzLiBFdmVyeSByZWdpc3RlciBpbiB0aGUgcmVnaXN0ZXIgY2xhc3MgbXVzdCBoYXZlCisgIC8vIGEgdmFsaWQgYWx0ZXJuYXRlIG5hbWUgZm9yIHRoZSBnaXZlbiBpbmRleC4KKyAgUmVnQWx0TmFtZUluZGV4IGFsdE5hbWVJbmRleCA9IGlkeDsKKworICAvLyBpc0FsbG9jYXRhYmxlIC0gU3BlY2lmeSB0aGF0IHRoZSByZWdpc3RlciBjbGFzcyBjYW4gYmUgdXNlZCBmb3IgdmlydHVhbAorICAvLyByZWdpc3RlcnMgYW5kIHJlZ2lzdGVyIGFsbG9jYXRpb24uICBTb21lIHJlZ2lzdGVyIGNsYXNzZXMgYXJlIG9ubHkgdXNlZCB0bworICAvLyBtb2RlbCBpbnN0cnVjdGlvbiBvcGVyYW5kIGNvbnN0cmFpbnRzLCBhbmQgc2hvdWxkIGhhdmUgaXNBbGxvY2F0YWJsZSA9IDAuCisgIGJpdCBpc0FsbG9jYXRhYmxlID0gMTsKKworICAvLyBBbHRPcmRlcnMgLSBMaXN0IG9mIGFsdGVybmF0aXZlIGFsbG9jYXRpb24gb3JkZXJzLiBUaGUgZGVmYXVsdCBvcmRlciBpcworICAvLyBNZW1iZXJMaXN0IGl0c2VsZiwgYW5kIHRoYXQgaXMgZ29vZCBlbm91Z2ggZm9yIG1vc3QgdGFyZ2V0cyBzaW5jZSB0aGUKKyAgLy8gcmVnaXN0ZXIgYWxsb2NhdG9ycyBhdXRvbWF0aWNhbGx5IHJlbW92ZSByZXNlcnZlZCByZWdpc3RlcnMgYW5kIG1vdmUKKyAgLy8gY2FsbGVlLXNhdmVkIHJlZ2lzdGVycyB0byB0aGUgZW5kLgorICBsaXN0PGRhZz4gQWx0T3JkZXJzID0gW107CisKKyAgLy8gQWx0T3JkZXJTZWxlY3QgLSBUaGUgYm9keSBvZiBhIGZ1bmN0aW9uIHRoYXQgc2VsZWN0cyB0aGUgYWxsb2NhdGlvbiBvcmRlcgorICAvLyB0byB1c2UgaW4gYSBnaXZlbiBtYWNoaW5lIGZ1bmN0aW9uLiBUaGUgY29kZSB3aWxsIGJlIGluc2VydGVkIGluIGEKKyAgLy8gZnVuY3Rpb24gbGlrZSB0aGlzOgorICAvLworICAvLyAgIHN0YXRpYyBpbmxpbmUgdW5zaWduZWQgZihjb25zdCBNYWNoaW5lRnVuY3Rpb24gJk1GKSB7IC4uLiB9CisgIC8vCisgIC8vIFRoZSBmdW5jdGlvbiBzaG91bGQgcmV0dXJuIDAgdG8gc2VsZWN0IHRoZSBkZWZhdWx0IG9yZGVyIGRlZmluZWQgYnkKKyAgLy8gTWVtYmVyTGlzdCwgMSB0byBzZWxlY3QgdGhlIGZpcnN0IEFsdE9yZGVycyBlbnRyeSBhbmQgc28gb24uCisgIGNvZGUgQWx0T3JkZXJTZWxlY3QgPSBbe31dOworCisgIC8vIFNwZWNpZnkgYWxsb2NhdGlvbiBwcmlvcml0eSBmb3IgcmVnaXN0ZXIgYWxsb2NhdG9ycyB1c2luZyBhIGdyZWVkeQorICAvLyBoZXVyaXN0aWMuIENsYXNzZXMgd2l0aCBoaWdoZXIgcHJpb3JpdHkgdmFsdWVzIGFyZSBhc3NpZ25lZCBmaXJzdC4gVGhpcyBpcworICAvLyB1c2VmdWwgYXMgaXQgaXMgc29tZXRpbWVzIGJlbmVmaWNpYWwgdG8gYXNzaWduIHJlZ2lzdGVycyB0byBoaWdobHkKKyAgLy8gY29uc3RyYWluZWQgY2xhc3NlcyBmaXJzdC4gVGhlIHZhbHVlIGhhcyB0byBiZSBpbiB0aGUgcmFuZ2UgWzAsNjNdLgorICBpbnQgQWxsb2NhdGlvblByaW9yaXR5ID0gMDsKKworICAvLyBUaGUgZGlhZ25vc3RpYyB0eXBlIHRvIHByZXNlbnQgd2hlbiByZWZlcmVuY2luZyB0aGlzIG9wZXJhbmQgaW4gYSBtYXRjaAorICAvLyBmYWlsdXJlIGVycm9yIG1lc3NhZ2UuIElmIHRoaXMgaXMgZW1wdHksIHRoZSBkZWZhdWx0IE1hdGNoX0ludmFsaWRPcGVyYW5kCisgIC8vIGRpYWdub3N0aWMgdHlwZSB3aWxsIGJlIHVzZWQuIElmIHRoaXMgaXMgIjxuYW1lPiIsIGEgTWF0Y2hfPG5hbWU+IGVudW0KKyAgLy8gdmFsdWUgd2lsbCBiZSBnZW5lcmF0ZWQgYW5kIHVzZWQgZm9yIHRoaXMgb3BlcmFuZCB0eXBlLiBUaGUgdGFyZ2V0CisgIC8vIGFzc2VtYmx5IHBhcnNlciBpcyByZXNwb25zaWJsZSBmb3IgY29udmVydGluZyB0aGlzIGludG8gYSB1c2VyLWZhY2luZworICAvLyBkaWFnbm9zdGljIG1lc3NhZ2UuCisgIHN0cmluZyBEaWFnbm9zdGljVHlwZSA9ICIiOworCisgIC8vIEEgZGlhZ25vc3RpYyBtZXNzYWdlIHRvIGVtaXQgd2hlbiBhbiBpbnZhbGlkIHZhbHVlIGlzIHByb3ZpZGVkIGZvciB0aGlzCisgIC8vIHJlZ2lzdGVyIGNsYXNzIHdoZW4gaXQgaXMgYmVpbmcgdXNlZCBhbiBhbiBhc3NlbWJseSBvcGVyYW5kLiBJZiB0aGlzIGlzCisgIC8vIG5vbi1lbXB0eSwgYW4gYW5vbnltb3VzIGRpYWdub3N0aWMgdHlwZSBlbnVtIHZhbHVlIHdpbGwgYmUgZ2VuZXJhdGVkLCBhbmQKKyAgLy8gdGhlIGFzc2VtYmx5IG1hdGNoZXIgd2lsbCBwcm92aWRlIGEgZnVuY3Rpb24gdG8gbWFwIGZyb20gZGlhZ25vc3RpYyB0eXBlcworICAvLyB0byBtZXNzYWdlIHN0cmluZ3MuCisgIHN0cmluZyBEaWFnbm9zdGljU3RyaW5nID0gIiI7Cit9CisKKy8vIFRoZSBtZW1iZXJMaXN0IGluIGEgUmVnaXN0ZXJDbGFzcyBpcyBhIGRhZyBvZiBzZXQgb3BlcmF0aW9ucy4gVGFibGVHZW4KKy8vIGV2YWx1YXRlcyB0aGVzZSBzZXQgb3BlcmF0aW9ucyBhbmQgZXhwYW5kIHRoZW0gaW50byByZWdpc3RlciBsaXN0cy4gVGhlc2UKKy8vIGFyZSB0aGUgbW9zdCBjb21tb24gb3BlcmF0aW9uLCBzZWUgdGVzdC9UYWJsZUdlbi9TZXRUaGVvcnkudGQgZm9yIG1vcmUKKy8vIGV4YW1wbGVzIG9mIHdoYXQgaXMgcG9zc2libGU6CisvLworLy8gKGFkZCBSMCwgUjEsIFIyKSAtIFNldCBVbmlvbi4gRWFjaCBhcmd1bWVudCBjYW4gYmUgYW4gaW5kaXZpZHVhbCByZWdpc3RlciwgYQorLy8gcmVnaXN0ZXIgY2xhc3MsIG9yIGEgc3ViLWV4cHJlc3Npb24uIFRoaXMgaXMgYWxzbyB0aGUgd2F5IHRvIHNpbXBseSBsaXN0CisvLyByZWdpc3RlcnMuCisvLworLy8gKHN1YiBHUFIsIFNQKSAtIFNldCBkaWZmZXJlbmNlLiBTdWJ0cmFjdCB0aGUgbGFzdCBhcmd1bWVudHMgZnJvbSB0aGUgZmlyc3QuCisvLworLy8gKGFuZCBHUFIsIENTUikgLSBTZXQgaW50ZXJzZWN0aW9uLiBBbGwgcmVnaXN0ZXJzIGZyb20gdGhlIGZpcnN0IHNldCB0aGF0IGFyZQorLy8gYWxzbyBpbiB0aGUgc2Vjb25kIHNldC4KKy8vCisvLyAoc2VxdWVuY2UgIlIldSIsIDAsIDE1KSAtPiBbUjAsIFIxLCAuLi4sIFIxNV0uIEdlbmVyYXRlIGEgc2VxdWVuY2Ugb2YKKy8vIG51bWJlcmVkIHJlZ2lzdGVycy4gIFRha2VzIGFuIG9wdGlvbmFsIDR0aCBvcGVyYW5kIHdoaWNoIGlzIGEgc3RyaWRlIHRvIHVzZQorLy8gd2hlbiBnZW5lcmF0aW5nIHRoZSBzZXF1ZW5jZS4KKy8vCisvLyAoc2hsIEdQUiwgNCkgLSBSZW1vdmUgdGhlIGZpcnN0IE4gZWxlbWVudHMuCisvLworLy8gKHRydW5jIEdQUiwgNCkgLSBUcnVuY2F0ZSBhZnRlciB0aGUgZmlyc3QgTiBlbGVtZW50cy4KKy8vCisvLyAocm90bCBHUFIsIDEpIC0gUm90YXRlIE4gcGxhY2VzIHRvIHRoZSBsZWZ0LgorLy8KKy8vIChyb3RyIEdQUiwgMSkgLSBSb3RhdGUgTiBwbGFjZXMgdG8gdGhlIHJpZ2h0LgorLy8KKy8vIChkZWNpbWF0ZSBHUFIsIDIpIC0gUGljayBldmVyeSBOJ3RoIGVsZW1lbnQsIHN0YXJ0aW5nIHdpdGggdGhlIGZpcnN0LgorLy8KKy8vIChpbnRlcmxlYXZlIEEsIEIsIC4uLikgLSBJbnRlcmxlYXZlIHRoZSBlbGVtZW50cyBmcm9tIGVhY2ggYXJndW1lbnQgbGlzdC4KKy8vCisvLyBBbGwgb2YgdGhlc2Ugb3BlcmF0b3JzIHdvcmsgb24gb3JkZXJlZCBzZXRzLCBub3QgbGlzdHMuIFRoYXQgbWVhbnMKKy8vIGR1cGxpY2F0ZXMgYXJlIHJlbW92ZWQgZnJvbSBzdWItZXhwcmVzc2lvbnMuCisKKy8vIFNldCBvcGVyYXRvcnMuIFRoZSByZXN0IGlzIGRlZmluZWQgaW4gVGFyZ2V0U2VsZWN0aW9uREFHLnRkLgorZGVmIHNlcXVlbmNlOworZGVmIGRlY2ltYXRlOworZGVmIGludGVybGVhdmU7CisKKy8vIFJlZ2lzdGVyVHVwbGVzIC0gQXV0b21hdGljYWxseSBnZW5lcmF0ZSBzdXBlci1yZWdpc3RlcnMgYnkgZm9ybWluZyB0dXBsZXMgb2YKKy8vIHN1Yi1yZWdpc3RlcnMuIFRoaXMgaXMgdXNlZnVsIGZvciBtb2RlbGluZyByZWdpc3RlciBzZXF1ZW5jZSBjb25zdHJhaW50cworLy8gd2l0aCBwc2V1ZG8tcmVnaXN0ZXJzIHRoYXQgYXJlIGxhcmdlciB0aGFuIHRoZSBhcmNoaXRlY3R1cmFsIHJlZ2lzdGVycy4KKy8vCisvLyBUaGUgc3ViLXJlZ2lzdGVyIGxpc3RzIGFyZSB6aXBwZWQgdG9nZXRoZXI6CisvLworLy8gICBkZWYgRXZlbk9kZCA6IFJlZ2lzdGVyVHVwbGVzPFtzdWJlLCBzdWJvXSwgWyhhZGQgUjAsIFIyKSwgKGFkZCBSMSwgUjMpXT47CisvLworLy8gR2VuZXJhdGVzIHRoZSBzYW1lIHJlZ2lzdGVycyBhczoKKy8vCisvLyAgIGxldCBTdWJSZWdJbmRpY2VzID0gW3N1YmUsIHN1Ym9dIGluIHsKKy8vICAgICBkZWYgUjBfUjEgOiBSZWdpc3RlcldpdGhTdWJSZWdzPCIiLCBbUjAsIFIxXT47CisvLyAgICAgZGVmIFIyX1IzIDogUmVnaXN0ZXJXaXRoU3ViUmVnczwiIiwgW1IyLCBSM10+OworLy8gICB9CisvLworLy8gVGhlIGdlbmVyYXRlZCBwc2V1ZG8tcmVnaXN0ZXJzIGluaGVyaXQgc3VwZXItY2xhc3NlcyBhbmQgZmllbGRzIGZyb20gdGhlaXIKKy8vIGZpcnN0IHN1Yi1yZWdpc3Rlci4gTW9zdCBmaWVsZHMgZnJvbSB0aGUgUmVnaXN0ZXIgY2xhc3MgYXJlIGluZmVycmVkLCBhbmQKKy8vIHRoZSBBc21OYW1lIGFuZCBEd2FyZiBudW1iZXJzIGFyZSBjbGVhcmVkLgorLy8KKy8vIFJlZ2lzdGVyVHVwbGVzIGluc3RhbmNlcyBjYW4gYmUgdXNlZCBpbiBvdGhlciBzZXQgb3BlcmF0aW9ucyB0byBmb3JtCisvLyByZWdpc3RlciBjbGFzc2VzIGFuZCBzbyBvbi4gVGhpcyBpcyB0aGUgb25seSB3YXkgb2YgdXNpbmcgdGhlIGdlbmVyYXRlZAorLy8gcmVnaXN0ZXJzLgorY2xhc3MgUmVnaXN0ZXJUdXBsZXM8bGlzdDxTdWJSZWdJbmRleD4gSW5kaWNlcywgbGlzdDxkYWc+IFJlZ3M+IHsKKyAgLy8gU3ViUmVncyAtIE4gbGlzdHMgb2YgcmVnaXN0ZXJzIHRvIGJlIHppcHBlZCB1cC4gU3VwZXItcmVnaXN0ZXJzIGFyZQorICAvLyBzeW50aGVzaXplZCBmcm9tIHRoZSBmaXJzdCBlbGVtZW50IG9mIGVhY2ggU3ViUmVncyBsaXN0LCB0aGUgc2Vjb25kCisgIC8vIGVsZW1lbnQgYW5kIHNvIG9uLgorICBsaXN0PGRhZz4gU3ViUmVncyA9IFJlZ3M7CisKKyAgLy8gU3ViUmVnSW5kaWNlcyAtIE4gU3ViUmVnSW5kZXggaW5zdGFuY2VzLiBUaGlzIHByb3ZpZGVzIHRoZSBuYW1lcyBvZiB0aGUKKyAgLy8gc3ViLXJlZ2lzdGVycyBpbiB0aGUgc3ludGhlc2l6ZWQgc3VwZXItcmVnaXN0ZXJzLgorICBsaXN0PFN1YlJlZ0luZGV4PiBTdWJSZWdJbmRpY2VzID0gSW5kaWNlczsKK30KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gRHdhcmZSZWdOdW0gLSBUaGlzIGNsYXNzIHByb3ZpZGVzIGEgbWFwcGluZyBvZiB0aGUgbGx2bSByZWdpc3RlciBlbnVtZXJhdGlvbgorLy8gdG8gdGhlIHJlZ2lzdGVyIG51bWJlcmluZyB1c2VkIGJ5IGdjYyBhbmQgZ2RiLiAgVGhlc2UgdmFsdWVzIGFyZSB1c2VkIGJ5IGEKKy8vIGRlYnVnIGluZm9ybWF0aW9uIHdyaXRlciB0byBkZXNjcmliZSB3aGVyZSB2YWx1ZXMgbWF5IGJlIGxvY2F0ZWQgZHVyaW5nCisvLyBleGVjdXRpb24uCitjbGFzcyBEd2FyZlJlZ051bTxsaXN0PGludD4gTnVtYmVycz4geworICAvLyBEd2FyZk51bWJlcnMgLSBOdW1iZXJzIHVzZWQgaW50ZXJuYWxseSBieSBnY2MvZ2RiIHRvIGlkZW50aWZ5IHRoZSByZWdpc3Rlci4KKyAgLy8gVGhlc2UgdmFsdWVzIGNhbiBiZSBkZXRlcm1pbmVkIGJ5IGxvY2F0aW5nIHRoZSA8dGFyZ2V0Pi5oIGZpbGUgaW4gdGhlCisgIC8vIGRpcmVjdG9yeSBsbHZtZ2NjL2djYy9jb25maWcvPHRhcmdldD4vIGFuZCBsb29raW5nIGZvciBSRUdJU1RFUl9OQU1FUy4gIFRoZQorICAvLyBvcmRlciBvZiB0aGVzZSBuYW1lcyBjb3JyZXNwb25kIHRvIHRoZSBlbnVtZXJhdGlvbiB1c2VkIGJ5IGdjYy4gIEEgdmFsdWUgb2YKKyAgLy8gLTEgaW5kaWNhdGVzIHRoYXQgdGhlIGdjYyBudW1iZXIgaXMgdW5kZWZpbmVkIGFuZCAtMiB0aGF0IHJlZ2lzdGVyIG51bWJlcgorICAvLyBpcyBpbnZhbGlkIGZvciB0aGlzIG1vZGUvZmxhdm91ci4KKyAgbGlzdDxpbnQ+IER3YXJmTnVtYmVycyA9IE51bWJlcnM7Cit9CisKKy8vIER3YXJmUmVnQWxpYXMgLSBUaGlzIGNsYXNzIGRlY2xhcmVzIHRoYXQgYSBnaXZlbiByZWdpc3RlciB1c2VzIHRoZSBzYW1lIGR3YXJmCisvLyBudW1iZXJzIGFzIGFub3RoZXIgb25lLiBUaGlzIGlzIHVzZWZ1bCBmb3IgbWFraW5nIGl0IGNsZWFyIHRoYXQgdGhlIHR3bworLy8gcmVnaXN0ZXJzIGRvIGhhdmUgdGhlIHNhbWUgbnVtYmVyLiBJdCBhbHNvIGxldHMgdXMgYnVpbGQgYSBtYXBwaW5nCisvLyBmcm9tIGR3YXJmIHJlZ2lzdGVyIG51bWJlciB0byBsbHZtIHJlZ2lzdGVyLgorY2xhc3MgRHdhcmZSZWdBbGlhczxSZWdpc3RlciByZWc+IHsKKyAgICAgIFJlZ2lzdGVyIER3YXJmQWxpYXMgPSByZWc7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQdWxsIGluIHRoZSBjb21tb24gc3VwcG9ydCBmb3Igc2NoZWR1bGluZworLy8KK2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldFNjaGVkdWxlLnRkIgorCitjbGFzcyBQcmVkaWNhdGU7IC8vIEZvcndhcmQgZGVmCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBJbnN0cnVjdGlvbiBzZXQgZGVzY3JpcHRpb24gLSBUaGVzZSBjbGFzc2VzIGNvcnJlc3BvbmQgdG8gdGhlIEMrKyBjbGFzc2VzIGluCisvLyB0aGUgVGFyZ2V0L1RhcmdldEluc3RySW5mby5oIGZpbGUuCisvLworY2xhc3MgSW5zdHJ1Y3Rpb24geworICBzdHJpbmcgTmFtZXNwYWNlID0gIiI7CisKKyAgZGFnIE91dE9wZXJhbmRMaXN0OyAgICAgICAvLyBBbiBkYWcgY29udGFpbmluZyB0aGUgTUkgZGVmIG9wZXJhbmQgbGlzdC4KKyAgZGFnIEluT3BlcmFuZExpc3Q7ICAgICAgICAvLyBBbiBkYWcgY29udGFpbmluZyB0aGUgTUkgdXNlIG9wZXJhbmQgbGlzdC4KKyAgc3RyaW5nIEFzbVN0cmluZyA9ICIiOyAgICAvLyBUaGUgLnMgZm9ybWF0IHRvIHByaW50IHRoZSBpbnN0cnVjdGlvbiB3aXRoLgorCisgIC8vIFBhdHRlcm4gLSBTZXQgdG8gdGhlIERBRyBwYXR0ZXJuIGZvciB0aGlzIGluc3RydWN0aW9uLCBpZiB3ZSBrbm93IG9mIG9uZSwKKyAgLy8gb3RoZXJ3aXNlLCB1bmluaXRpYWxpemVkLgorICBsaXN0PGRhZz4gUGF0dGVybjsKKworICAvLyBUaGUgZm9sbG93IHN0YXRlIHdpbGwgZXZlbnR1YWxseSBiZSBpbmZlcnJlZCBhdXRvbWF0aWNhbGx5IGZyb20gdGhlCisgIC8vIGluc3RydWN0aW9uIHBhdHRlcm4uCisKKyAgbGlzdDxSZWdpc3Rlcj4gVXNlcyA9IFtdOyAvLyBEZWZhdWx0IHRvIHVzaW5nIG5vIG5vbi1vcGVyYW5kIHJlZ2lzdGVycworICBsaXN0PFJlZ2lzdGVyPiBEZWZzID0gW107IC8vIERlZmF1bHQgdG8gbW9kaWZ5aW5nIG5vIG5vbi1vcGVyYW5kIHJlZ2lzdGVycworCisgIC8vIFByZWRpY2F0ZXMgLSBMaXN0IG9mIHByZWRpY2F0ZXMgd2hpY2ggd2lsbCBiZSB0dXJuZWQgaW50byBpc2VsIG1hdGNoaW5nCisgIC8vIGNvZGUuCisgIGxpc3Q8UHJlZGljYXRlPiBQcmVkaWNhdGVzID0gW107CisKKyAgLy8gU2l6ZSAtIFNpemUgb2YgZW5jb2RlZCBpbnN0cnVjdGlvbiwgb3IgemVybyBpZiB0aGUgc2l6ZSBjYW5ub3QgYmUgZGV0ZXJtaW5lZAorICAvLyBmcm9tIHRoZSBvcGNvZGUuCisgIGludCBTaXplID0gMDsKKworICAvLyBEZWNvZGVyTmFtZXNwYWNlIC0gVGhlICJuYW1lc3BhY2UiIGluIHdoaWNoIHRoaXMgaW5zdHJ1Y3Rpb24gZXhpc3RzLCBvbgorICAvLyB0YXJnZXRzIGxpa2UgQVJNIHdoaWNoIG11bHRpcGxlIElTQSBuYW1lc3BhY2VzIGV4aXN0LgorICBzdHJpbmcgRGVjb2Rlck5hbWVzcGFjZSA9ICIiOworCisgIC8vIENvZGUgc2l6ZSwgZm9yIGluc3RydWN0aW9uIHNlbGVjdGlvbi4KKyAgLy8gRklYTUU6IFdoYXQgZG9lcyB0aGlzIGFjdHVhbGx5IG1lYW4/CisgIGludCBDb2RlU2l6ZSA9IDA7CisKKyAgLy8gQWRkZWQgY29tcGxleGl0eSBwYXNzZWQgb250byBtYXRjaGluZyBwYXR0ZXJuLgorICBpbnQgQWRkZWRDb21wbGV4aXR5ICA9IDA7CisKKyAgLy8gVGhlc2UgYml0cyBjYXB0dXJlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBoaWdoLWxldmVsIHNlbWFudGljcyBvZiB0aGUKKyAgLy8gaW5zdHJ1Y3Rpb24uCisgIGJpdCBpc1JldHVybiAgICAgPSAwOyAgICAgLy8gSXMgdGhpcyBpbnN0cnVjdGlvbiBhIHJldHVybiBpbnN0cnVjdGlvbj8KKyAgYml0IGlzQnJhbmNoICAgICA9IDA7ICAgICAvLyBJcyB0aGlzIGluc3RydWN0aW9uIGEgYnJhbmNoIGluc3RydWN0aW9uPworICBiaXQgaXNJbmRpcmVjdEJyYW5jaCA9IDA7IC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24gYW4gaW5kaXJlY3QgYnJhbmNoPworICBiaXQgaXNDb21wYXJlICAgID0gMDsgICAgIC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24gYSBjb21wYXJpc29uIGluc3RydWN0aW9uPworICBiaXQgaXNNb3ZlSW1tICAgID0gMDsgICAgIC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24gYSBtb3ZlIGltbWVkaWF0ZSBpbnN0cnVjdGlvbj8KKyAgYml0IGlzQml0Y2FzdCAgICA9IDA7ICAgICAvLyBJcyB0aGlzIGluc3RydWN0aW9uIGEgYml0Y2FzdCBpbnN0cnVjdGlvbj8KKyAgYml0IGlzU2VsZWN0ICAgICA9IDA7ICAgICAvLyBJcyB0aGlzIGluc3RydWN0aW9uIGEgc2VsZWN0IGluc3RydWN0aW9uPworICBiaXQgaXNCYXJyaWVyICAgID0gMDsgICAgIC8vIENhbiBjb250cm9sIGZsb3cgZmFsbCB0aHJvdWdoIHRoaXMgaW5zdHJ1Y3Rpb24/CisgIGJpdCBpc0NhbGwgICAgICAgPSAwOyAgICAgLy8gSXMgdGhpcyBpbnN0cnVjdGlvbiBhIGNhbGwgaW5zdHJ1Y3Rpb24/CisgIGJpdCBpc0FkZCAgICAgICAgPSAwOyAgICAgLy8gSXMgdGhpcyBpbnN0cnVjdGlvbiBhbiBhZGQgaW5zdHJ1Y3Rpb24/CisgIGJpdCBjYW5Gb2xkQXNMb2FkID0gMDsgICAgLy8gQ2FuIHRoaXMgYmUgZm9sZGVkIGFzIGEgc2ltcGxlIG1lbW9yeSBvcGVyYW5kPworICBiaXQgbWF5TG9hZCAgICAgID0gPzsgICAgIC8vIElzIGl0IHBvc3NpYmxlIGZvciB0aGlzIGluc3QgdG8gcmVhZCBtZW1vcnk/CisgIGJpdCBtYXlTdG9yZSAgICAgPSA/OyAgICAgLy8gSXMgaXQgcG9zc2libGUgZm9yIHRoaXMgaW5zdCB0byB3cml0ZSBtZW1vcnk/CisgIGJpdCBpc0NvbnZlcnRpYmxlVG9UaHJlZUFkZHJlc3MgPSAwOyAgLy8gQ2FuIHRoaXMgMi1hZGRyIGluc3RydWN0aW9uIHByb21vdGU/CisgIGJpdCBpc0NvbW11dGFibGUgPSAwOyAgICAgLy8gSXMgdGhpcyAzIG9wZXJhbmQgaW5zdHJ1Y3Rpb24gY29tbXV0YWJsZT8KKyAgYml0IGlzVGVybWluYXRvciA9IDA7ICAgICAvLyBJcyB0aGlzIHBhcnQgb2YgdGhlIHRlcm1pbmF0b3IgZm9yIGEgYmFzaWMgYmxvY2s/CisgIGJpdCBpc1JlTWF0ZXJpYWxpemFibGUgPSAwOyAvLyBJcyB0aGlzIGluc3RydWN0aW9uIHJlLW1hdGVyaWFsaXphYmxlPworICBiaXQgaXNQcmVkaWNhYmxlID0gMDsgICAgIC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24gcHJlZGljYWJsZT8KKyAgYml0IGhhc0RlbGF5U2xvdCA9IDA7ICAgICAvLyBEb2VzIHRoaXMgaW5zdHJ1Y3Rpb24gaGF2ZSBhbiBkZWxheSBzbG90PworICBiaXQgdXNlc0N1c3RvbUluc2VydGVyID0gMDsgLy8gUHNldWRvIGluc3RyIG5lZWRpbmcgc3BlY2lhbCBoZWxwLgorICBiaXQgaGFzUG9zdElTZWxIb29rID0gMDsgIC8vIFRvIGJlICphZGp1c3RlZCogYWZ0ZXIgaXNlbCBieSB0YXJnZXQgaG9vay4KKyAgYml0IGhhc0N0cmxEZXAgICA9IDA7ICAgICAvLyBEb2VzIHRoaXMgaW5zdHJ1Y3Rpb24gci93IGN0cmwtZmxvdyBjaGFpbnM/CisgIGJpdCBpc05vdER1cGxpY2FibGUgPSAwOyAgLy8gSXMgaXQgdW5zYWZlIHRvIGR1cGxpY2F0ZSB0aGlzIGluc3RydWN0aW9uPworICBiaXQgaXNDb252ZXJnZW50ID0gMDsgICAgIC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24gY29udmVyZ2VudD8KKyAgYml0IGlzQXNDaGVhcEFzQU1vdmUgPSAwOyAvLyBBcyBjaGVhcCAob3IgY2hlYXBlcikgdGhhbiBhIG1vdmUgaW5zdHJ1Y3Rpb24uCisgIGJpdCBoYXNFeHRyYVNyY1JlZ0FsbG9jUmVxID0gMDsgLy8gU291cmNlcyBoYXZlIHNwZWNpYWwgcmVnYWxsb2MgcmVxdWlyZW1lbnQ/CisgIGJpdCBoYXNFeHRyYURlZlJlZ0FsbG9jUmVxID0gMDsgLy8gRGVmcyBoYXZlIHNwZWNpYWwgcmVnYWxsb2MgcmVxdWlyZW1lbnQ/CisgIGJpdCBpc1JlZ1NlcXVlbmNlID0gMDsgICAgLy8gSXMgdGhpcyBpbnN0cnVjdGlvbiBhIGtpbmQgb2YgcmVnIHNlcXVlbmNlPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHNvLCBtYWtlIHN1cmUgdG8gb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUYXJnZXRJbnN0ckluZm86OmdldFJlZ1NlcXVlbmNlTGlrZUlucHV0cy4KKyAgYml0IGlzUHNldWRvICAgICA9IDA7ICAgICAvLyBJcyB0aGlzIGluc3RydWN0aW9uIGEgcHNldWRvLWluc3RydWN0aW9uPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHNvLCB3b24ndCBoYXZlIGVuY29kaW5nIGluZm9ybWF0aW9uIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBbTUNdQ29kZUVtaXR0ZXIgc3R1ZmYuCisgIGJpdCBpc0V4dHJhY3RTdWJyZWcgPSAwOyAgLy8gSXMgdGhpcyBpbnN0cnVjdGlvbiBhIGtpbmQgb2YgZXh0cmFjdCBzdWJyZWc/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHNvLCBtYWtlIHN1cmUgdG8gb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGFyZ2V0SW5zdHJJbmZvOjpnZXRFeHRyYWN0U3VicmVnTGlrZUlucHV0cy4KKyAgYml0IGlzSW5zZXJ0U3VicmVnID0gMDsgICAvLyBJcyB0aGlzIGluc3RydWN0aW9uIGEga2luZCBvZiBpbnNlcnQgc3VicmVnPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIHNvLCBtYWtlIHN1cmUgdG8gb3ZlcnJpZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUYXJnZXRJbnN0ckluZm86OmdldEluc2VydFN1YnJlZ0xpa2VJbnB1dHMuCisKKyAgLy8gRG9lcyB0aGUgaW5zdHJ1Y3Rpb24gaGF2ZSBzaWRlIGVmZmVjdHMgdGhhdCBhcmUgbm90IGNhcHR1cmVkIGJ5IGFueQorICAvLyBvcGVyYW5kcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gb3Igb3RoZXIgZmxhZ3M/CisgIGJpdCBoYXNTaWRlRWZmZWN0cyA9ID87CisKKyAgLy8gSXMgdGhpcyBpbnN0cnVjdGlvbiBhICJyZWFsIiBpbnN0cnVjdGlvbiAod2l0aCBhIGRpc3RpbmN0IG1hY2hpbmUKKyAgLy8gZW5jb2RpbmcpLCBvciBpcyBpdCBhIHBzZXVkbyBpbnN0cnVjdGlvbiB1c2VkIGZvciBjb2RlZ2VuIG1vZGVsaW5nCisgIC8vIHB1cnBvc2VzLgorICAvLyBGSVhNRTogRm9yIG5vdyB0aGlzIGlzIGRpc3RpbmN0IGZyb20gaXNQc2V1ZG8sIGFib3ZlLCBhcyBjb2RlLWdlbi1vbmx5CisgIC8vIGluc3RydWN0aW9ucyBjYW4gKGFuZCBvZnRlbiBkbykgc3RpbGwgaGF2ZSBlbmNvZGluZyBpbmZvcm1hdGlvbgorICAvLyBhc3NvY2lhdGVkIHdpdGggdGhlbS4gT25jZSB3ZSd2ZSBtaWdyYXRlZCBhbGwgb2YgdGhlbSBvdmVyIHRvIHRydWUKKyAgLy8gcHNldWRvLWluc3RydWN0aW9ucyB0aGF0IGFyZSBsb3dlcmVkIHRvIHJlYWwgaW5zdHJ1Y3Rpb25zIHByaW9yIHRvCisgIC8vIHRoZSBwcmludGVyL2VtaXR0ZXIsIHdlIGNhbiByZW1vdmUgdGhpcyBhdHRyaWJ1dGUgYW5kIGp1c3QgdXNlIGlzUHNldWRvLgorICAvLworICAvLyBUaGUgaW50ZW5kZWQgdXNlIGlzOgorICAvLyBpc1BzZXVkbzogRG9lcyBub3QgaGF2ZSBlbmNvZGluZyBpbmZvcm1hdGlvbiBhbmQgc2hvdWxkIGJlIGV4cGFuZGVkLAorICAvLyAgIGF0IHRoZSBsYXRlc3QsIGR1cmluZyBsb3dlcmluZyB0byBNQ0luc3QuCisgIC8vCisgIC8vIGlzQ29kZUdlbk9ubHk6IERvZXMgaGF2ZSBlbmNvZGluZyBpbmZvcm1hdGlvbiBhbmQgY2FuIGdvIHRocm91Z2ggdG8gdGhlCisgIC8vICAgQ29kZUVtaXR0ZXIgdW5jaGFuZ2VkLCBidXQgZHVwbGljYXRlcyBhIGNhbm9uaWNhbCBpbnN0cnVjdGlvbgorICAvLyAgIGRlZmluaXRpb24ncyBlbmNvZGluZyBhbmQgc2hvdWxkIGJlIGlnbm9yZWQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlCisgIC8vICAgYXNzZW1ibGVyIG1hdGNoIHRhYmxlcy4KKyAgYml0IGlzQ29kZUdlbk9ubHkgPSAwOworCisgIC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24gYSBwc2V1ZG8gaW5zdHJ1Y3Rpb24gZm9yIHVzZSBieSB0aGUgYXNzZW1ibGVyIHBhcnNlci4KKyAgYml0IGlzQXNtUGFyc2VyT25seSA9IDA7CisKKyAgLy8gVGhpcyBpbnN0cnVjdGlvbiBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgcXVlcmllZCBmb3Igc2NoZWR1bGluZyBsYXRlbmNpZXMKKyAgLy8gYW5kIHRoZXJlZm9yZSBuZWVkcyBubyBzY2hlZHVsaW5nIGluZm9ybWF0aW9uIGV2ZW4gZm9yIGEgY29tcGxldGUKKyAgLy8gc2NoZWR1bGluZyBtb2RlbC4KKyAgYml0IGhhc05vU2NoZWR1bGluZ0luZm8gPSAwOworCisgIEluc3RySXRpbkNsYXNzIEl0aW5lcmFyeSA9IE5vSXRpbmVyYXJ5Oy8vIEV4ZWN1dGlvbiBzdGVwcyB1c2VkIGZvciBzY2hlZHVsaW5nLgorCisgIC8vIFNjaGVkdWxpbmcgaW5mb3JtYXRpb24gZnJvbSBUYXJnZXRTY2hlZHVsZS50ZC4KKyAgbGlzdDxTY2hlZFJlYWRXcml0ZT4gU2NoZWRSVzsKKworICBzdHJpbmcgQ29uc3RyYWludHMgPSAiIjsgIC8vIE9wZXJhbmRDb25zdHJhaW50LCBlLmcuICRzcmMgPSAkZHN0LgorCisgIC8vLyBEaXNhYmxlRW5jb2RpbmcgLSBMaXN0IG9mIG9wZXJhbmQgbmFtZXMgKGUuZy4gIiRvcDEsJG9wMiIpIHRoYXQgc2hvdWxkIG5vdAorICAvLy8gYmUgZW5jb2RlZCBpbnRvIHRoZSBvdXRwdXQgbWFjaGluZWluc3RyLgorICBzdHJpbmcgRGlzYWJsZUVuY29kaW5nID0gIiI7CisKKyAgc3RyaW5nIFBvc3RFbmNvZGVyTWV0aG9kID0gIiI7CisgIHN0cmluZyBEZWNvZGVyTWV0aG9kID0gIiI7CisKKyAgLy8gSXMgdGhlIGluc3RydWN0aW9uIGRlY29kZXIgbWV0aG9kIGFibGUgdG8gY29tcGxldGVseSBkZXRlcm1pbmUgaWYgdGhlCisgIC8vIGdpdmVuIGluc3RydWN0aW9uIGlzIHZhbGlkIG9yIG5vdC4gSWYgdGhlIFRhYmxlR2VuIGRlZmluaXRpb24gb2YgdGhlCisgIC8vIGluc3RydWN0aW9uIHNwZWNpZmllcyBiaXRwYXR0ZXJuIEE/P0Igd2hlcmUgQSBhbmQgQiBhcmUgc3RhdGljIGJpdHMsIHRoZQorICAvLyBoYXNDb21wbGV0ZURlY29kZXIgZmxhZyBzYXlzIHdoZXRoZXIgdGhlIGRlY29kZXIgbWV0aG9kIGZ1bGx5IGhhbmRsZXMgdGhlCisgIC8vID8/IHNwYWNlLCBpLmUuIGlmIGl0IGlzIGEgZmluYWwgYXJiaXRlciBmb3IgdGhlIGluc3RydWN0aW9uIHZhbGlkaXR5LgorICAvLyBJZiBub3QgdGhlbiB0aGUgZGVjb2RlciBhdHRlbXB0cyB0byBjb250aW51ZSBkZWNvZGluZyB3aGVuIHRoZSBkZWNvZGVyCisgIC8vIG1ldGhvZCBmYWlscy4KKyAgLy8KKyAgLy8gVGhpcyBhbGxvd3MgdG8gaGFuZGxlIHNpdHVhdGlvbnMgd2hlcmUgdGhlIGVuY29kaW5nIGlzIG5vdCBmdWxseQorICAvLyBvcnRob2dvbmFsLiBFeGFtcGxlOgorICAvLyAqIEluc3RBIHdpdGggYml0cGF0dGVybiAwYjAwMDA/Pz8/LAorICAvLyAqIEluc3RCIHdpdGggYml0cGF0dGVybiAwYjAwMDAwMD8/IGJ1dCB0aGUgYXNzb2NpYXRlZCBkZWNvZGVyIG1ldGhvZAorICAvLyAgIERlY29kZUluc3RCKCkgcmV0dXJucyBGYWlsIHdoZW4gPz8gaXMgMGIwMCBvciAwYjExLgorICAvLworICAvLyBUaGUgZGVjb2RlciB0cmllcyB0byBkZWNvZGUgYSBiaXRwYXR0ZXJuIHRoYXQgbWF0Y2hlcyBib3RoIEluc3RBIGFuZAorICAvLyBJbnN0QiBiaXRwYXR0ZXJucyBmaXJzdCBhcyBJbnN0QiAoYmVjYXVzZSBpdCBpcyB0aGUgbW9zdCBzcGVjaWZpYworICAvLyBlbmNvZGluZykuIEluIHRoZSBkZWZhdWx0IGNhc2UgKGhhc0NvbXBsZXRlRGVjb2RlciA9IDEpLCB3aGVuCisgIC8vIERlY29kZUluc3RCKCkgcmV0dXJucyBGYWlsIHRoZSBiaXRwYXR0ZXJuIGdldHMgcmVqZWN0ZWQuIEJ5IHNldHRpbmcKKyAgLy8gaGFzQ29tcGxldGVEZWNvZGVyID0gMCBpbiBJbnN0QiwgdGhlIGRlY29kZXIgaXMgaW5mb3JtZWQgdGhhdAorICAvLyBEZWNvZGVJbnN0QigpIGlzIG5vdCBhYmxlIHRvIGRldGVybWluZSBpZiBhbGwgcG9zc2libGUgdmFsdWVzIG9mID8/IGFyZQorICAvLyB2YWxpZCBvciBub3QuIElmIERlY29kZUluc3RCKCkgcmV0dXJucyBGYWlsIHRoZSBkZWNvZGVyIHdpbGwgYXR0ZW1wdCB0bworICAvLyBkZWNvZGUgdGhlIGJpdHBhdHRlcm4gYXMgSW5zdEEgdG9vLgorICBiaXQgaGFzQ29tcGxldGVEZWNvZGVyID0gMTsKKworICAvLy8gVGFyZ2V0LXNwZWNpZmljIGZsYWdzLiBUaGlzIGJlY29tZXMgdGhlIFRTRmxhZ3MgZmllbGQgaW4gVGFyZ2V0SW5zdHJEZXNjLgorICBiaXRzPDY0PiBUU0ZsYWdzID0gMDsKKworICAvLy9AbmFtZSBBc3NlbWJsZXIgUGFyc2VyIFN1cHBvcnQKKyAgLy8vQHsKKworICBzdHJpbmcgQXNtTWF0Y2hDb252ZXJ0ZXIgPSAiIjsKKworICAvLy8gVHdvT3BlcmFuZEFsaWFzQ29uc3RyYWludCAtIEVuYWJsZSBUYWJsZUdlbiB0byBhdXRvLWdlbmVyYXRlIGEKKyAgLy8vIHR3by1vcGVyYW5kIG1hdGNoZXIgaW5zdC1hbGlhcyBmb3IgYSB0aHJlZSBvcGVyYW5kIGluc3RydWN0aW9uLgorICAvLy8gRm9yIGV4YW1wbGUsIHRoZSBhcm0gaW5zdHJ1Y3Rpb24gImFkZCByMywgcjMsIHI1IiBjYW4gYmUgd3JpdHRlbgorICAvLy8gYXMgImFkZCByMywgcjUiLiBUaGUgY29uc3RyYWludCBpcyBvZiB0aGUgc2FtZSBmb3JtIGFzIGEgdGllZC1vcGVyYW5kCisgIC8vLyBjb25zdHJhaW50LiBGb3IgZXhhbXBsZSwgIiRSbiA9ICRSZCIuCisgIHN0cmluZyBUd29PcGVyYW5kQWxpYXNDb25zdHJhaW50ID0gIiI7CisKKyAgLy8vIEFzc2VtYmxlciB2YXJpYW50IG5hbWUgdG8gdXNlIGZvciB0aGlzIGluc3RydWN0aW9uLiBJZiBzcGVjaWZpZWQgdGhlbgorICAvLy8gaW5zdHJ1Y3Rpb24gd2lsbCBiZSBwcmVzZW50ZWQgb25seSBpbiBNYXRjaFRhYmxlIGZvciB0aGlzIHZhcmlhbnQuIElmCisgIC8vLyBub3Qgc3BlY2lmaWVkIHRoZW4gYXNzZW1ibGVyIHZhcmlhbnRzIHdpbGwgYmUgZGV0ZXJtaW5lZCBiYXNlZCBvbgorICAvLy8gQXNtU3RyaW5nCisgIHN0cmluZyBBc21WYXJpYW50TmFtZSA9ICIiOworCisgIC8vL0B9CisKKyAgLy8vIFVzZU5hbWVkT3BlcmFuZFRhYmxlIC0gSWYgc2V0LCB0aGUgb3BlcmFuZCBpbmRpY2VzIG9mIHRoaXMgaW5zdHJ1Y3Rpb24KKyAgLy8vIGNhbiBiZSBxdWVyaWVkIHZpYSB0aGUgZ2V0TmFtZWRPcGVyYW5kSWR4KCkgZnVuY3Rpb24gd2hpY2ggaXMgZ2VuZXJhdGVkCisgIC8vLyBieSBUYWJsZUdlbi4KKyAgYml0IFVzZU5hbWVkT3BlcmFuZFRhYmxlID0gMDsKK30KKworLy8vIFBzZXVkb0luc3RFeHBhbnNpb24gLSBFeHBhbnNpb24gaW5mb3JtYXRpb24gZm9yIGEgcHNldWRvLWluc3RydWN0aW9uLgorLy8vIFdoaWNoIGluc3RydWN0aW9uIGl0IGV4cGFuZHMgdG8gYW5kIGhvdyB0aGUgb3BlcmFuZHMgbWFwIGZyb20gdGhlCisvLy8gcHNldWRvLgorY2xhc3MgUHNldWRvSW5zdEV4cGFuc2lvbjxkYWcgUmVzdWx0PiB7CisgIGRhZyBSZXN1bHRJbnN0ID0gUmVzdWx0OyAgICAgLy8gVGhlIGluc3RydWN0aW9uIHRvIGdlbmVyYXRlLgorICBiaXQgaXNQc2V1ZG8gPSAxOworfQorCisvLy8gUHJlZGljYXRlcyAtIFRoZXNlIGFyZSBleHRyYSBjb25kaXRpb25hbHMgd2hpY2ggYXJlIHR1cm5lZCBpbnRvIGluc3RydWN0aW9uCisvLy8gc2VsZWN0b3IgbWF0Y2hpbmcgY29kZS4gQ3VycmVudGx5IGVhY2ggcHJlZGljYXRlIGlzIGp1c3QgYSBzdHJpbmcuCitjbGFzcyBQcmVkaWNhdGU8c3RyaW5nIGNvbmQ+IHsKKyAgc3RyaW5nIENvbmRTdHJpbmcgPSBjb25kOworCisgIC8vLyBBc3NlbWJsZXJNYXRjaGVyUHJlZGljYXRlIC0gSWYgdGhpcyBmZWF0dXJlIGNhbiBiZSB1c2VkIGJ5IHRoZSBhc3NlbWJsZXIKKyAgLy8vIG1hdGNoZXIsIHRoaXMgaXMgdHJ1ZS4gIFRhcmdldHMgc2hvdWxkIHNldCB0aGlzIGJ5IGluaGVyaXRpbmcgdGhlaXIKKyAgLy8vIGZlYXR1cmUgZnJvbSB0aGUgQXNzZW1ibGVyUHJlZGljYXRlIGNsYXNzIGluIGFkZGl0aW9uIHRvIFByZWRpY2F0ZS4KKyAgYml0IEFzc2VtYmxlck1hdGNoZXJQcmVkaWNhdGUgPSAwOworCisgIC8vLyBBc3NlbWJsZXJDb25kU3RyaW5nIC0gTmFtZSBvZiB0aGUgc3VidGFyZ2V0IGZlYXR1cmUgYmVpbmcgdGVzdGVkIHVzZWQKKyAgLy8vIGFzIGFsdGVybmF0aXZlIGNvbmRpdGlvbiBzdHJpbmcgdXNlZCBmb3IgYXNzZW1ibGVyIG1hdGNoZXIuCisgIC8vLyBlLmcuICJNb2RlVGh1bWIiIGlzIHRyYW5zbGF0ZWQgdG8gIihCaXRzICYgTW9kZVRodW1iKSAhPSAwIi4KKyAgLy8vICAgICAgIiFNb2RlVGh1bWIiIGlzIHRyYW5zbGF0ZWQgdG8gIihCaXRzICYgTW9kZVRodW1iKSA9PSAwIi4KKyAgLy8vIEl0IGNhbiBhbHNvIGxpc3QgbXVsdGlwbGUgZmVhdHVyZXMgc2VwYXJhdGVkIGJ5ICIsIi4KKyAgLy8vIGUuZy4gIk1vZGVUaHVtYixGZWF0dXJlVGh1bWIyIiBpcyB0cmFuc2xhdGVkIHRvCisgIC8vLyAgICAgICIoQml0cyAmIE1vZGVUaHVtYikgIT0gMCAmJiAoQml0cyAmIEZlYXR1cmVUaHVtYjIpICE9IDAiLgorICBzdHJpbmcgQXNzZW1ibGVyQ29uZFN0cmluZyA9ICIiOworCisgIC8vLyBQcmVkaWNhdGVOYW1lIC0gVXNlci1sZXZlbCBuYW1lIHRvIHVzZSBmb3IgdGhlIHByZWRpY2F0ZS4gTWFpbmx5IGZvciB1c2UKKyAgLy8vIGluIGRpYWdub3N0aWNzIHN1Y2ggYXMgbWlzc2luZyBmZWF0dXJlIGVycm9ycyBpbiB0aGUgYXNtIG1hdGNoZXIuCisgIHN0cmluZyBQcmVkaWNhdGVOYW1lID0gIiI7CisKKyAgLy8vIFNldHRpbmcgdGhpcyB0byAnMScgaW5kaWNhdGVzIHRoYXQgdGhlIHByZWRpY2F0ZSBtdXN0IGJlIHJlY29tcHV0ZWQgb24KKyAgLy8vIGV2ZXJ5IGZ1bmN0aW9uIGNoYW5nZS4gTW9zdCBwcmVkaWNhdGVzIGNhbiBsZWF2ZSB0aGlzIGF0ICcwJy4KKyAgLy8vCisgIC8vLyBJZ25vcmVkIGJ5IFNlbGVjdGlvbkRBRywgaXQgYWx3YXlzIHJlY29tcHV0ZXMgdGhlIHByZWRpY2F0ZSBvbiBldmVyeSB1c2UuCisgIGJpdCBSZWNvbXB1dGVQZXJGdW5jdGlvbiA9IDA7Cit9CisKKy8vLyBOb0hvbm9yU2lnbkRlcGVuZGVudFJvdW5kaW5nIC0gVGhpcyBwcmVkaWNhdGUgaXMgdHJ1ZSBpZiBzdXBwb3J0IGZvcgorLy8vIHNpZ24tZGVwZW5kZW50LXJvdW5kaW5nIGlzIG5vdCBlbmFibGVkLgorZGVmIE5vSG9ub3JTaWduRGVwZW5kZW50Um91bmRpbmcKKyA6IFByZWRpY2F0ZTwiIVRNLk9wdGlvbnMuSG9ub3JTaWduRGVwZW5kZW50Um91bmRpbmdGUE1hdGgoKSI+OworCitjbGFzcyBSZXF1aXJlczxsaXN0PFByZWRpY2F0ZT4gcHJlZHM+IHsKKyAgbGlzdDxQcmVkaWNhdGU+IFByZWRpY2F0ZXMgPSBwcmVkczsKK30KKworLy8vIG9wcyBkZWZpbml0aW9uIC0gVGhpcyBpcyBqdXN0IGEgc2ltcGxlIG1hcmtlciB1c2VkIHRvIGlkZW50aWZ5IHRoZSBvcGVyYW5kCisvLy8gbGlzdCBmb3IgYW4gaW5zdHJ1Y3Rpb24uIG91dHMgYW5kIGlucyBhcmUgaWRlbnRpY2FsIGJvdGggc3ludGFjdGljYWxseSBhbmQKKy8vLyBzZW1hbnRpY2FsbHk7IHRoZXkgYXJlIHVzZWQgdG8gZGVmaW5lIGRlZiBvcGVyYW5kcyBhbmQgdXNlIG9wZXJhbmRzIHRvCisvLy8gaW1wcm92ZSByZWFkaWJpbGl0eS4gVGhpcyBzaG91bGQgYmUgdXNlZCBsaWtlIHRoaXM6CisvLy8gICAgIChvdXRzIFIzMjokZHN0KSwgKGlucyBSMzI6JHNyYzEsIFIzMjokc3JjMikgb3Igc29tZXRoaW5nIHNpbWlsYXIuCitkZWYgb3BzOworZGVmIG91dHM7CitkZWYgaW5zOworCisvLy8gdmFyaWFibGVfb3BzIGRlZmluaXRpb24gLSBNYXJrIHRoaXMgaW5zdHJ1Y3Rpb24gYXMgdGFraW5nIGEgdmFyaWFibGUgbnVtYmVyCisvLy8gb2Ygb3BlcmFuZHMuCitkZWYgdmFyaWFibGVfb3BzOworCisKKy8vLyBQb2ludGVyTGlrZVJlZ0NsYXNzIC0gVmFsdWVzIHRoYXQgYXJlIGRlc2lnbmVkIHRvIGhhdmUgcG9pbnRlciB3aWR0aCBhcmUKKy8vLyBkZXJpdmVkIGZyb20gdGhpcy4gIFRhYmxlR2VuIHRyZWF0cyB0aGUgcmVnaXN0ZXIgY2xhc3MgYXMgaGF2aW5nIGEgc3ltYm9saWMKKy8vLyB0eXBlIHRoYXQgaXQgZG9lc24ndCBrbm93LCBhbmQgcmVzb2x2ZXMgdGhlIGFjdHVhbCByZWdjbGFzcyB0byB1c2UgYnkgdXNpbmcKKy8vLyB0aGUgVGFyZ2V0UmVnaXN0ZXJJbmZvOjpnZXRQb2ludGVyUmVnQ2xhc3MoKSBob29rIGF0IGNvZGVnZW4gdGltZS4KK2NsYXNzIFBvaW50ZXJMaWtlUmVnQ2xhc3M8aW50IEtpbmQ+IHsKKyAgaW50IFJlZ0NsYXNzS2luZCA9IEtpbmQ7Cit9CisKKworLy8vIHB0cl9yYyBkZWZpbml0aW9uIC0gTWFyayB0aGlzIG9wZXJhbmQgYXMgYmVpbmcgYSBwb2ludGVyIHZhbHVlIHdob3NlCisvLy8gcmVnaXN0ZXIgY2xhc3MgaXMgcmVzb2x2ZWQgZHluYW1pY2FsbHkgdmlhIGEgY2FsbGJhY2sgdG8gVGFyZ2V0SW5zdHJJbmZvLgorLy8vIEZJWE1FOiBXZSBzaG91bGQgcHJvYmFibHkgY2hhbmdlIHRoaXMgdG8gYSBjbGFzcyB3aGljaCBjb250YWluIGEgbGlzdCBvZgorLy8vIGZsYWdzLiBCdXQgY3VycmVudGx5IHdlIGhhdmUgYnV0IG9uZSBmbGFnLgorZGVmIHB0cl9yYyA6IFBvaW50ZXJMaWtlUmVnQ2xhc3M8MD47CisKKy8vLyB1bmtub3duIGRlZmluaXRpb24gLSBNYXJrIHRoaXMgb3BlcmFuZCBhcyBiZWluZyBvZiB1bmtub3duIHR5cGUsIGNhdXNpbmcKKy8vLyBpdCB0byBiZSByZXNvbHZlZCBieSBpbmZlcmVuY2UgaW4gdGhlIGNvbnRleHQgaXQgaXMgdXNlZC4KK2NsYXNzIHVua25vd25fY2xhc3M7CitkZWYgdW5rbm93biA6IHVua25vd25fY2xhc3M7CisKKy8vLyBBc21PcGVyYW5kQ2xhc3MgLSBSZXByZXNlbnRhdGlvbiBmb3IgdGhlIGtpbmRzIG9mIG9wZXJhbmRzIHdoaWNoIHRoZSB0YXJnZXQKKy8vLyBzcGVjaWZpYyBwYXJzZXIgY2FuIGNyZWF0ZSBhbmQgdGhlIGFzc2VtYmx5IG1hdGNoZXIgbWF5IG5lZWQgdG8gZGlzdGluZ3Vpc2guCisvLy8KKy8vLyBPcGVyYW5kIGNsYXNzZXMgYXJlIHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBpbiB3aGljaCBpbnN0cnVjdGlvbnMgYXJlCisvLy8gbWF0Y2hlZCwgdG8gZW5zdXJlIHRoYXQgdGhlIGluc3RydWN0aW9uIHdoaWNoIGdldHMgbWF0Y2hlZCBmb3IgYW55CisvLy8gcGFydGljdWxhciBsaXN0IG9mIG9wZXJhbmRzIGlzIGRldGVybWluaXN0aWMuCisvLy8KKy8vLyBUaGUgdGFyZ2V0IHNwZWNpZmljIHBhcnNlciBtdXN0IGJlIGFibGUgdG8gY2xhc3NpZnkgYSBwYXJzZWQgb3BlcmFuZCBpbnRvIGEKKy8vLyB1bmlxdWUgY2xhc3Mgd2hpY2ggZG9lcyBub3QgcGFydGlhbGx5IG92ZXJsYXAgd2l0aCBhbnkgb3RoZXIgY2xhc3Nlcy4gSXQgY2FuCisvLy8gbWF0Y2ggYSBzdWJzZXQgb2Ygc29tZSBvdGhlciBjbGFzcywgaW4gd2hpY2ggY2FzZSB0aGUgc3VwZXIgY2xhc3MgZmllbGQKKy8vLyBzaG91bGQgYmUgZGVmaW5lZC4KK2NsYXNzIEFzbU9wZXJhbmRDbGFzcyB7CisgIC8vLyBUaGUgbmFtZSB0byB1c2UgZm9yIHRoaXMgY2xhc3MsIHdoaWNoIHNob3VsZCBiZSB1c2FibGUgYXMgYW4gZW51bSB2YWx1ZS4KKyAgc3RyaW5nIE5hbWUgPSA/OworCisgIC8vLyBUaGUgc3VwZXIgY2xhc3NlcyBvZiB0aGlzIG9wZXJhbmQuCisgIGxpc3Q8QXNtT3BlcmFuZENsYXNzPiBTdXBlckNsYXNzZXMgPSBbXTsKKworICAvLy8gVGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHNwZWNpZmljIG9wZXJhbmQgdG8gY2FsbCB0byB0ZXN0CisgIC8vLyB3aGV0aGVyIHRoZSBvcGVyYW5kIGlzIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MuIElmIG5vdCBzZXQsIHRoaXMgd2lsbAorICAvLy8gZGVmYXVsdCB0byAiaXNGb28iLCB3aGVyZSBGb28gaXMgdGhlIEFzbU9wZXJhbmRDbGFzcyBuYW1lLiBUaGUgbWV0aG9kCisgIC8vLyBzaWduYXR1cmUgc2hvdWxkIGJlOgorICAvLy8gICBib29sIGlzRm9vKCkgY29uc3Q7CisgIHN0cmluZyBQcmVkaWNhdGVNZXRob2QgPSA/OworCisgIC8vLyBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIG9uIHRoZSB0YXJnZXQgc3BlY2lmaWMgb3BlcmFuZCB0byBjYWxsIHRvIGFkZCB0aGUKKyAgLy8vIHRhcmdldCBzcGVjaWZpYyBvcGVyYW5kIHRvIGFuIE1DSW5zdC4gSWYgbm90IHNldCwgdGhpcyB3aWxsIGRlZmF1bHQgdG8KKyAgLy8vICJhZGRGb29PcGVyYW5kcyIsIHdoZXJlIEZvbyBpcyB0aGUgQXNtT3BlcmFuZENsYXNzIG5hbWUuIFRoZSBtZXRob2QKKyAgLy8vIHNpZ25hdHVyZSBzaG91bGQgYmU6CisgIC8vLyAgIHZvaWQgYWRkRm9vT3BlcmFuZHMoTUNJbnN0ICZJbnN0LCB1bnNpZ25lZCBOKSBjb25zdDsKKyAgc3RyaW5nIFJlbmRlck1ldGhvZCA9ID87CisKKyAgLy8vIFRoZSBuYW1lIG9mIHRoZSBtZXRob2Qgb24gdGhlIHRhcmdldCBzcGVjaWZpYyBvcGVyYW5kIHRvIGNhbGwgdG8gY3VzdG9tCisgIC8vLyBoYW5kbGUgdGhlIG9wZXJhbmQgcGFyc2luZy4gVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgb3BlcmFuZHMgZG8gbm90IHJlbGF0ZQorICAvLy8gdG8gaW1tZWRpYXRlcyBvciByZWdpc3RlcnMgYW5kIGFyZSB2ZXJ5IGluc3RydWN0aW9uIHNwZWNpZmljIChhcyBmbGFncyB0bworICAvLy8gc2V0IGluIGEgcHJvY2Vzc29yIHJlZ2lzdGVyLCBjb3Byb2Nlc3NvciBudW1iZXIsIC4uLikuCisgIHN0cmluZyBQYXJzZXJNZXRob2QgPSA/OworCisgIC8vIFRoZSBkaWFnbm9zdGljIHR5cGUgdG8gcHJlc2VudCB3aGVuIHJlZmVyZW5jaW5nIHRoaXMgb3BlcmFuZCBpbiBhCisgIC8vIG1hdGNoIGZhaWx1cmUgZXJyb3IgbWVzc2FnZS4gQnkgZGVmYXVsdCwgdXNlIGEgZ2VuZXJpYyAiaW52YWxpZCBvcGVyYW5kIgorICAvLyBkaWFnbm9zdGljLiBUaGUgdGFyZ2V0IEFzbVBhcnNlciBtYXBzIHRoZXNlIGNvZGVzIHRvIHRleHQuCisgIHN0cmluZyBEaWFnbm9zdGljVHlwZSA9ICIiOworCisgIC8vLyBBIGRpYWdub3N0aWMgbWVzc2FnZSB0byBlbWl0IHdoZW4gYW4gaW52YWxpZCB2YWx1ZSBpcyBwcm92aWRlZCBmb3IgdGhpcworICAvLy8gb3BlcmFuZC4KKyAgc3RyaW5nIERpYWdub3N0aWNTdHJpbmcgPSAiIjsKKworICAvLy8gU2V0IHRvIDEgaWYgdGhpcyBvcGVyYW5kIGlzIG9wdGlvbmFsIGFuZCBub3QgYWx3YXlzIHJlcXVpcmVkLiBUeXBpY2FsbHksCisgIC8vLyB0aGUgQXNtUGFyc2VyIHdpbGwgZW1pdCBhbiBlcnJvciB3aGVuIGl0IGZpbmlzaGVzIHBhcnNpbmcgYW4KKyAgLy8vIGluc3RydWN0aW9uIGlmIGl0IGhhc24ndCBtYXRjaGVkIGFsbCB0aGUgb3BlcmFuZHMgeWV0LiAgSG93ZXZlciwgdGhpcworICAvLy8gZXJyb3Igd2lsbCBiZSBzdXBwcmVzc2VkIGlmIGFsbCBvZiB0aGUgcmVtYWluaW5nIHVubWF0Y2hlZCBvcGVyYW5kcyBhcmUKKyAgLy8vIG1hcmtlZCBhcyBJc09wdGlvbmFsLgorICAvLy8KKyAgLy8vIE9wdGlvbmFsIGFyZ3VtZW50cyBtdXN0IGJlIGF0IHRoZSBlbmQgb2YgdGhlIG9wZXJhbmQgbGlzdC4KKyAgYml0IElzT3B0aW9uYWwgPSAwOworCisgIC8vLyBUaGUgbmFtZSBvZiB0aGUgbWV0aG9kIG9uIHRoZSB0YXJnZXQgc3BlY2lmaWMgYXNtIHBhcnNlciB0aGF0IHJldHVybnMgdGhlCisgIC8vLyBkZWZhdWx0IG9wZXJhbmQgZm9yIHRoaXMgb3B0aW9uYWwgb3BlcmFuZC4gVGhpcyBtZXRob2QgaXMgb25seSB1c2VkIGlmCisgIC8vLyBJc09wdGlvbmFsID09IDEuIElmIG5vdCBzZXQsIHRoaXMgd2lsbCBkZWZhdWx0IHRvICJkZWZhdWx0Rm9vT3BlcmFuZHMiLAorICAvLy8gd2hlcmUgRm9vIGlzIHRoZSBBc21PcGVyYW5kQ2xhc3MgbmFtZS4gVGhlIG1ldGhvZCBzaWduYXR1cmUgc2hvdWxkIGJlOgorICAvLy8gICBzdGQ6OnVuaXF1ZV9wdHI8TUNQYXJzZWRBc21PcGVyYW5kPiBkZWZhdWx0Rm9vT3BlcmFuZHMoKSBjb25zdDsKKyAgc3RyaW5nIERlZmF1bHRNZXRob2QgPSA/OworfQorCitkZWYgSW1tQXNtT3BlcmFuZCA6IEFzbU9wZXJhbmRDbGFzcyB7CisgIGxldCBOYW1lID0gIkltbSI7Cit9CisKKy8vLyBPcGVyYW5kIFR5cGVzIC0gVGhlc2UgcHJvdmlkZSB0aGUgYnVpbHQtaW4gb3BlcmFuZCB0eXBlcyB0aGF0IG1heSBiZSB1c2VkCisvLy8gYnkgYSB0YXJnZXQuICBUYXJnZXRzIGNhbiBvcHRpb25hbGx5IHByb3ZpZGUgdGhlaXIgb3duIG9wZXJhbmQgdHlwZXMgYXMKKy8vLyBuZWVkZWQsIHRob3VnaCB0aGlzIHNob3VsZCBub3QgYmUgbmVlZGVkIGZvciBSSVNDIHRhcmdldHMuCitjbGFzcyBPcGVyYW5kPFZhbHVlVHlwZSB0eT4gOiBEQUdPcGVyYW5kIHsKKyAgVmFsdWVUeXBlIFR5cGUgPSB0eTsKKyAgc3RyaW5nIFByaW50TWV0aG9kID0gInByaW50T3BlcmFuZCI7CisgIHN0cmluZyBFbmNvZGVyTWV0aG9kID0gIiI7CisgIGJpdCBoYXNDb21wbGV0ZURlY29kZXIgPSAxOworICBzdHJpbmcgT3BlcmFuZFR5cGUgPSAiT1BFUkFORF9VTktOT1dOIjsKKyAgZGFnIE1JT3BlcmFuZEluZm8gPSAob3BzKTsKKworICAvLyBNQ09wZXJhbmRQcmVkaWNhdGUgLSBPcHRpb25hbGx5LCBhIGNvZGUgZnJhZ21lbnQgb3BlcmF0aW5nIG9uCisgIC8vIGNvbnN0IE1DT3BlcmFuZCAmTUNPcCwgYW5kIHJldHVybmluZyBhIGJvb2wsIHRvIGluZGljYXRlIGlmCisgIC8vIHRoZSB2YWx1ZSBvZiBNQ09wIGlzIHZhbGlkIGZvciB0aGUgc3BlY2lmaWMgc3ViY2xhc3Mgb2YgT3BlcmFuZAorICBjb2RlIE1DT3BlcmFuZFByZWRpY2F0ZTsKKworICAvLyBQYXJzZXJNYXRjaENsYXNzIC0gVGhlICJtYXRjaCBjbGFzcyIgdGhhdCBvcGVyYW5kcyBvZiB0aGlzIHR5cGUgZml0CisgIC8vIGluLiBNYXRjaCBjbGFzc2VzIGFyZSB1c2VkIHRvIGRlZmluZSB0aGUgb3JkZXIgaW4gd2hpY2ggaW5zdHJ1Y3Rpb25zIGFyZQorICAvLyBtYXRjaCwgdG8gZW5zdXJlIHRoYXQgd2hpY2ggaW5zdHJ1Y3Rpb25zIGdldHMgbWF0Y2hlZCBpcyBkZXRlcm1pbmlzdGljLgorICAvLworICAvLyBUaGUgdGFyZ2V0IHNwZWNpZmljIHBhcnNlciBtdXN0IGJlIGFibGUgdG8gY2xhc3NpZnkgYW4gcGFyc2VkIG9wZXJhbmQgaW50bworICAvLyBhIHVuaXF1ZSBjbGFzcywgd2hpY2ggZG9lcyBub3QgcGFydGlhbGx5IG92ZXJsYXAgd2l0aCBhbnkgb3RoZXIgY2xhc3Nlcy4gSXQKKyAgLy8gY2FuIG1hdGNoIGEgc3Vic2V0IG9mIHNvbWUgb3RoZXIgY2xhc3MsIGluIHdoaWNoIGNhc2UgdGhlIEFzbU9wZXJhbmRDbGFzcworICAvLyBzaG91bGQgZGVjbGFyZSB0aGUgb3RoZXIgb3BlcmFuZCBhcyBvbmUgb2YgaXRzIHN1cGVyIGNsYXNzZXMuCisgIEFzbU9wZXJhbmRDbGFzcyBQYXJzZXJNYXRjaENsYXNzID0gSW1tQXNtT3BlcmFuZDsKK30KKworY2xhc3MgUmVnaXN0ZXJPcGVyYW5kPFJlZ2lzdGVyQ2xhc3MgcmVnY2xhc3MsIHN0cmluZyBwbSA9ICJwcmludE9wZXJhbmQiPgorICA6IERBR09wZXJhbmQgeworICAvLyBSZWdDbGFzcyAtIFRoZSByZWdpc3RlciBjbGFzcyBvZiB0aGUgb3BlcmFuZC4KKyAgUmVnaXN0ZXJDbGFzcyBSZWdDbGFzcyA9IHJlZ2NsYXNzOworICAvLyBQcmludE1ldGhvZCAtIFRoZSB0YXJnZXQgbWV0aG9kIHRvIGNhbGwgdG8gcHJpbnQgcmVnaXN0ZXIgb3BlcmFuZHMgb2YKKyAgLy8gdGhpcyB0eXBlLiBUaGUgbWV0aG9kIG5vcm1hbGx5IHdpbGwganVzdCB1c2UgYW4gYWx0LW5hbWUgaW5kZXggdG8gbG9vaworICAvLyB1cCB0aGUgbmFtZSB0byBwcmludC4gRGVmYXVsdCB0byB0aGUgZ2VuZXJpYyBwcmludE9wZXJhbmQoKS4KKyAgc3RyaW5nIFByaW50TWV0aG9kID0gcG07CisKKyAgLy8gRW5jb2Rlck1ldGhvZCAtIFRoZSB0YXJnZXQgbWV0aG9kIG5hbWUgdG8gY2FsbCB0byBlbmNvZGUgdGhpcyByZWdpc3RlcgorICAvLyBvcGVyYW5kLgorICBzdHJpbmcgRW5jb2Rlck1ldGhvZCA9ICIiOworCisgIC8vIFBhcnNlck1hdGNoQ2xhc3MgLSBUaGUgIm1hdGNoIGNsYXNzIiB0aGF0IG9wZXJhbmRzIG9mIHRoaXMgdHlwZSBmaXQKKyAgLy8gaW4uIE1hdGNoIGNsYXNzZXMgYXJlIHVzZWQgdG8gZGVmaW5lIHRoZSBvcmRlciBpbiB3aGljaCBpbnN0cnVjdGlvbnMgYXJlCisgIC8vIG1hdGNoLCB0byBlbnN1cmUgdGhhdCB3aGljaCBpbnN0cnVjdGlvbnMgZ2V0cyBtYXRjaGVkIGlzIGRldGVybWluaXN0aWMuCisgIC8vCisgIC8vIFRoZSB0YXJnZXQgc3BlY2lmaWMgcGFyc2VyIG11c3QgYmUgYWJsZSB0byBjbGFzc2lmeSBhbiBwYXJzZWQgb3BlcmFuZCBpbnRvCisgIC8vIGEgdW5pcXVlIGNsYXNzLCB3aGljaCBkb2VzIG5vdCBwYXJ0aWFsbHkgb3ZlcmxhcCB3aXRoIGFueSBvdGhlciBjbGFzc2VzLiBJdAorICAvLyBjYW4gbWF0Y2ggYSBzdWJzZXQgb2Ygc29tZSBvdGhlciBjbGFzcywgaW4gd2hpY2ggY2FzZSB0aGUgQXNtT3BlcmFuZENsYXNzCisgIC8vIHNob3VsZCBkZWNsYXJlIHRoZSBvdGhlciBvcGVyYW5kIGFzIG9uZSBvZiBpdHMgc3VwZXIgY2xhc3Nlcy4KKyAgQXNtT3BlcmFuZENsYXNzIFBhcnNlck1hdGNoQ2xhc3M7CisKKyAgc3RyaW5nIE9wZXJhbmRUeXBlID0gIk9QRVJBTkRfUkVHSVNURVIiOworCisgIC8vIFdoZW4gcmVmZXJlbmNlZCBpbiB0aGUgcmVzdWx0IG9mIGEgQ29kZUdlbiBwYXR0ZXJuLCBHbG9iYWxJU2VsIHdpbGwKKyAgLy8gbm9ybWFsbHkgY29weSB0aGUgbWF0Y2hlZCBvcGVyYW5kIHRvIHRoZSByZXN1bHQuIFdoZW4gdGhpcyBpcyBzZXQsIGl0IHdpbGwKKyAgLy8gZW1pdCBhIHNwZWNpYWwgY29weSB0aGF0IHdpbGwgcmVwbGFjZSB6ZXJvLWltbWVkaWF0ZXMgd2l0aCB0aGUgc3BlY2lmaWVkCisgIC8vIHplcm8tcmVnaXN0ZXIuCisgIFJlZ2lzdGVyIEdJWmVyb1JlZ2lzdGVyID0gPzsKK30KKworbGV0IE9wZXJhbmRUeXBlID0gIk9QRVJBTkRfSU1NRURJQVRFIiBpbiB7CitkZWYgaTFpbW0gIDogT3BlcmFuZDxpMT47CitkZWYgaThpbW0gIDogT3BlcmFuZDxpOD47CitkZWYgaTE2aW1tIDogT3BlcmFuZDxpMTY+OworZGVmIGkzMmltbSA6IE9wZXJhbmQ8aTMyPjsKK2RlZiBpNjRpbW0gOiBPcGVyYW5kPGk2ND47CisKK2RlZiBmMzJpbW0gOiBPcGVyYW5kPGYzMj47CitkZWYgZjY0aW1tIDogT3BlcmFuZDxmNjQ+OworfQorCisvLyBSZWdpc3RlciBvcGVyYW5kcyBmb3IgZ2VuZXJpYyBpbnN0cnVjdGlvbnMgZG9uJ3QgaGF2ZSBhbiBNVlQsIGJ1dCBkbyBoYXZlCisvLyBjb25zdHJhaW50cyBsaW5raW5nIHRoZSBvcGVyYW5kcyAoZS5nLiBhbGwgb3BlcmFuZHMgb2YgYSBHX0FERCBtdXN0CisvLyBoYXZlIHRoZSBzYW1lIExMVCkuCitjbGFzcyBUeXBlZE9wZXJhbmQ8c3RyaW5nIFR5PiA6IE9wZXJhbmQ8dW50eXBlZD4geworICBsZXQgT3BlcmFuZFR5cGUgPSBUeTsKKyAgYml0IElzUG9pbnRlciA9IDA7Cit9CisKK2RlZiB0eXBlMCA6IFR5cGVkT3BlcmFuZDwiT1BFUkFORF9HRU5FUklDXzAiPjsKK2RlZiB0eXBlMSA6IFR5cGVkT3BlcmFuZDwiT1BFUkFORF9HRU5FUklDXzEiPjsKK2RlZiB0eXBlMiA6IFR5cGVkT3BlcmFuZDwiT1BFUkFORF9HRU5FUklDXzIiPjsKK2RlZiB0eXBlMyA6IFR5cGVkT3BlcmFuZDwiT1BFUkFORF9HRU5FUklDXzMiPjsKK2RlZiB0eXBlNCA6IFR5cGVkT3BlcmFuZDwiT1BFUkFORF9HRU5FUklDXzQiPjsKK2RlZiB0eXBlNSA6IFR5cGVkT3BlcmFuZDwiT1BFUkFORF9HRU5FUklDXzUiPjsKKworbGV0IElzUG9pbnRlciA9IDEgaW4geworICBkZWYgcHR5cGUwIDogVHlwZWRPcGVyYW5kPCJPUEVSQU5EX0dFTkVSSUNfMCI+OworICBkZWYgcHR5cGUxIDogVHlwZWRPcGVyYW5kPCJPUEVSQU5EX0dFTkVSSUNfMSI+OworICBkZWYgcHR5cGUyIDogVHlwZWRPcGVyYW5kPCJPUEVSQU5EX0dFTkVSSUNfMiI+OworICBkZWYgcHR5cGUzIDogVHlwZWRPcGVyYW5kPCJPUEVSQU5EX0dFTkVSSUNfMyI+OworICBkZWYgcHR5cGU0IDogVHlwZWRPcGVyYW5kPCJPUEVSQU5EX0dFTkVSSUNfNCI+OworICBkZWYgcHR5cGU1IDogVHlwZWRPcGVyYW5kPCJPUEVSQU5EX0dFTkVSSUNfNSI+OworfQorCisvLy8gemVyb19yZWcgZGVmaW5pdGlvbiAtIFNwZWNpYWwgbm9kZSB0byBzdGFuZCBmb3IgdGhlIHplcm8gcmVnaXN0ZXIuCisvLy8KK2RlZiB6ZXJvX3JlZzsKKworLy8vIEFsbCBvcGVyYW5kcyB3aGljaCB0aGUgTUMgbGF5ZXIgY2xhc3NpZmllcyBhcyBwcmVkaWNhdGVzIHNob3VsZCBpbmhlcml0IGZyb20KKy8vLyB0aGlzIGNsYXNzIGluIHNvbWUgbWFubmVyLiBUaGlzIGlzIGFscmVhZHkgaGFuZGxlZCBmb3IgdGhlIG1vc3QgY29tbW9ubHkKKy8vLyB1c2VkIFByZWRpY2F0ZU9wZXJhbmQsIGJ1dCBtYXkgYmUgdXNlZnVsIGluIG90aGVyIGNpcmN1bXN0YW5jZXMuCitjbGFzcyBQcmVkaWNhdGVPcDsKKworLy8vIE9wZXJhbmRXaXRoRGVmYXVsdE9wcyAtIFRoaXMgT3BlcmFuZCBjbGFzcyBjYW4gYmUgdXNlZCBhcyB0aGUgcGFyZW50IGNsYXNzCisvLy8gZm9yIGFuIE9wZXJhbmQgdGhhdCBuZWVkcyB0byBiZSBpbml0aWFsaXplZCB3aXRoIGEgZGVmYXVsdCB2YWx1ZSBpZgorLy8vIG5vIHZhbHVlIGlzIHN1cHBsaWVkIGluIGEgcGF0dGVybi4gIFRoaXMgY2xhc3MgY2FuIGJlIHVzZWQgdG8gc2ltcGxpZnkgdGhlCisvLy8gcGF0dGVybiBkZWZpbml0aW9ucyBmb3IgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZSB0YXJnZXQgc3BlY2lmaWMgZmxhZ3MKKy8vLyBlbmNvZGVkIGFzIGltbWVkaWF0ZSBvcGVyYW5kcy4KK2NsYXNzIE9wZXJhbmRXaXRoRGVmYXVsdE9wczxWYWx1ZVR5cGUgdHksIGRhZyBkZWZhdWx0b3BzPgorICA6IE9wZXJhbmQ8dHk+IHsKKyAgZGFnIERlZmF1bHRPcHMgPSBkZWZhdWx0b3BzOworfQorCisvLy8gUHJlZGljYXRlT3BlcmFuZCAtIFRoaXMgY2FuIGJlIHVzZWQgdG8gZGVmaW5lIGEgcHJlZGljYXRlIG9wZXJhbmQgZm9yIGFuCisvLy8gaW5zdHJ1Y3Rpb24uICBPcFR5cGVzIHNwZWNpZmllcyB0aGUgTUlPcGVyYW5kSW5mbyBmb3IgdGhlIG9wZXJhbmQsIGFuZAorLy8vIEFsd2F5c1ZhbCBzcGVjaWZpZXMgdGhlIHZhbHVlIG9mIHRoaXMgcHJlZGljYXRlIHdoZW4gc2V0IHRvICJhbHdheXMKKy8vLyBleGVjdXRlIi4KK2NsYXNzIFByZWRpY2F0ZU9wZXJhbmQ8VmFsdWVUeXBlIHR5LCBkYWcgT3BUeXBlcywgZGFnIEFsd2F5c1ZhbD4KKyAgOiBPcGVyYW5kV2l0aERlZmF1bHRPcHM8dHksIEFsd2F5c1ZhbD4sIFByZWRpY2F0ZU9wIHsKKyAgbGV0IE1JT3BlcmFuZEluZm8gPSBPcFR5cGVzOworfQorCisvLy8gT3B0aW9uYWxEZWZPcGVyYW5kIC0gVGhpcyBpcyB1c2VkIHRvIGRlZmluZSBhIG9wdGlvbmFsIGRlZmluaXRpb24gb3BlcmFuZAorLy8vIGZvciBhbiBpbnN0cnVjdGlvbi4gRGVmYXVsdE9wcyBpcyB0aGUgcmVnaXN0ZXIgdGhlIG9wZXJhbmQgcmVwcmVzZW50cyBpZgorLy8vIG5vbmUgaXMgc3VwcGxpZWQsIGUuZy4gemVyb19yZWcuCitjbGFzcyBPcHRpb25hbERlZk9wZXJhbmQ8VmFsdWVUeXBlIHR5LCBkYWcgT3BUeXBlcywgZGFnIGRlZmF1bHRvcHM+CisgIDogT3BlcmFuZFdpdGhEZWZhdWx0T3BzPHR5LCBkZWZhdWx0b3BzPiB7CisgIGxldCBNSU9wZXJhbmRJbmZvID0gT3BUeXBlczsKK30KKworCisvLyBJbnN0ckluZm8gLSBUaGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIGluc3RhbnRpYXRlZCBvbmNlIHRvIHByb3ZpZGUgcGFyYW1ldGVycworLy8gd2hpY2ggYXJlIGdsb2JhbCB0byB0aGUgdGFyZ2V0IG1hY2hpbmUuCisvLworY2xhc3MgSW5zdHJJbmZvIHsKKyAgLy8gVGFyZ2V0IGNhbiBzcGVjaWZ5IGl0cyBpbnN0cnVjdGlvbnMgaW4gZWl0aGVyIGJpZyBvciBsaXR0bGUtZW5kaWFuIGZvcm1hdHMuCisgIC8vIEZvciBpbnN0YW5jZSwgd2hpbGUgYm90aCBTcGFyYyBhbmQgUG93ZXJQQyBhcmUgYmlnLWVuZGlhbiBwbGF0Zm9ybXMsIHRoZQorICAvLyBTcGFyYyBtYW51YWwgc3BlY2lmaWVzIGl0cyBpbnN0cnVjdGlvbnMgaW4gdGhlIGZvcm1hdCBbMzEuLjBdIChiaWcpLCB3aGlsZQorICAvLyBQb3dlclBDIHNwZWNpZmllcyB0aGVtIHVzaW5nIHRoZSBmb3JtYXQgWzAuLjMxXSAobGl0dGxlKS4KKyAgYml0IGlzTGl0dGxlRW5kaWFuRW5jb2RpbmcgPSAwOworCisgIC8vIFRoZSBpbnN0cnVjdGlvbiBwcm9wZXJ0aWVzIG1heUxvYWQsIG1heVN0b3JlLCBhbmQgaGFzU2lkZUVmZmVjdHMgYXJlIHVuc2V0CisgIC8vIGJ5IGRlZmF1bHQsIGFuZCBUYWJsZUdlbiB3aWxsIGluZmVyIHRoZWlyIHZhbHVlIGZyb20gdGhlIGluc3RydWN0aW9uCisgIC8vIHBhdHRlcm4gd2hlbiBwb3NzaWJsZS4KKyAgLy8KKyAgLy8gTm9ybWFsbHksIFRhYmxlR2VuIHdpbGwgaXNzdWUgYW4gZXJyb3IgaXQgaXQgY2FuJ3QgaW5mZXIgdGhlIHZhbHVlIG9mIGEKKyAgLy8gcHJvcGVydHkgdGhhdCBoYXNuJ3QgYmVlbiBzZXQgZXhwbGljaXRseS4gV2hlbiBndWVzc0luc3RydWN0aW9uUHJvcGVydGllcworICAvLyBpcyBzZXQsIGl0IHdpbGwgZ3Vlc3MgYSBzYWZlIHZhbHVlIGluc3RlYWQuCisgIC8vCisgIC8vIFRoaXMgb3B0aW9uIGlzIGEgdGVtcG9yYXJ5IG1pZ3JhdGlvbiBoZWxwLiBJdCB3aWxsIGdvIGF3YXkuCisgIGJpdCBndWVzc0luc3RydWN0aW9uUHJvcGVydGllcyA9IDE7CisKKyAgLy8gVGFibGVHZW4ncyBpbnN0cnVjdGlvbiBlbmNvZGVyIGdlbmVyYXRvciBoYXMgc3VwcG9ydCBmb3IgbWF0Y2hpbmcgb3BlcmFuZHMKKyAgLy8gdG8gYml0LWZpZWxkIHZhcmlhYmxlcyBib3RoIGJ5IG5hbWUgYW5kIGJ5IHBvc2l0aW9uLiBXaGlsZSBtYXRjaGluZyBieQorICAvLyBuYW1lIGlzIHByZWZlcnJlZCwgdGhpcyBpcyBjdXJyZW50bHkgbm90IHBvc3NpYmxlIGZvciBjb21wbGV4IG9wZXJhbmRzLAorICAvLyBhbmQgc29tZSB0YXJnZXRzIHN0aWxsIHJlcGx5IG9uIHRoZSBwb3NpdGlvbmFsIGVuY29kaW5nIHJ1bGVzLiBXaGVuCisgIC8vIGdlbmVyYXRpbmcgYSBkZWNvZGVyIGZvciBzdWNoIHRhcmdldHMsIHRoZSBwb3NpdGlvbmFsIGVuY29kaW5nIHJ1bGVzIG11c3QKKyAgLy8gYmUgdXNlZCBieSB0aGUgZGVjb2RlciBnZW5lcmF0b3IgYXMgd2VsbC4KKyAgLy8KKyAgLy8gVGhpcyBvcHRpb24gaXMgdGVtcG9yYXJ5OyBpdCB3aWxsIGdvIGF3YXkgb25jZSB0aGUgVGFibGVHZW4gZGVjb2RlcgorICAvLyBnZW5lcmF0b3IgaGFzIGJldHRlciBzdXBwb3J0IGZvciBjb21wbGV4IG9wZXJhbmRzIGFuZCB0YXJnZXRzIGhhdmUKKyAgLy8gbWlncmF0ZWQgYXdheSBmcm9tIHVzaW5nIHBvc2l0aW9uYWxseSBlbmNvZGVkIG9wZXJhbmRzLgorICBiaXQgZGVjb2RlUG9zaXRpb25hbGx5RW5jb2RlZE9wZXJhbmRzID0gMDsKKworICAvLyBXaGVuIHNldCwgdGhpcyBpbmRpY2F0ZXMgdGhhdCB0aGVyZSB3aWxsIGJlIG5vIG92ZXJsYXAgYmV0d2VlbiB0aG9zZQorICAvLyBvcGVyYW5kcyB0aGF0IGFyZSBtYXRjaGVkIGJ5IG9yZGVyaW5nIChwb3NpdGlvbmFsIG9wZXJhbmRzKSBhbmQgdGhvc2UKKyAgLy8gbWF0Y2hlZCBieSBuYW1lLgorICAvLworICAvLyBUaGlzIG9wdGlvbiBpcyB0ZW1wb3Jhcnk7IGl0IHdpbGwgZ28gYXdheSBvbmNlIHRoZSBUYWJsZUdlbiBkZWNvZGVyCisgIC8vIGdlbmVyYXRvciBoYXMgYmV0dGVyIHN1cHBvcnQgZm9yIGNvbXBsZXggb3BlcmFuZHMgYW5kIHRhcmdldHMgaGF2ZQorICAvLyBtaWdyYXRlZCBhd2F5IGZyb20gdXNpbmcgcG9zaXRpb25hbGx5IGVuY29kZWQgb3BlcmFuZHMuCisgIGJpdCBub05hbWVkUG9zaXRpb25hbGx5RW5jb2RlZE9wZXJhbmRzID0gMDsKK30KKworLy8gU3RhbmRhcmQgUHNldWRvIEluc3RydWN0aW9ucy4KKy8vIFRoaXMgbGlzdCBtdXN0IG1hdGNoIFRhcmdldE9wY29kZXMuaCBhbmQgQ29kZUdlblRhcmdldC5jcHAuCisvLyBPbmx5IHRoZXNlIGluc3RydWN0aW9ucyBhcmUgYWxsb3dlZCBpbiB0aGUgVGFyZ2V0T3Bjb2RlIG5hbWVzcGFjZS4KKy8vIEVuc3VyZSBtYXlMb2FkIGFuZCBtYXlTdG9yZSBoYXZlIGEgZGVmYXVsdCB2YWx1ZSwgc28gYXMgbm90IHRvIGJyZWFrCisvLyB0YXJnZXRzIHRoYXQgc2V0IGd1ZXNzSW5zdHJ1Y3Rpb25Qcm9wZXJ0aWVzPTAuIEFueSBsb2NhbCBkZWZpbml0aW9uIG9mCisvLyBtYXlMb2FkL21heVN0b3JlIHRha2VzIHByZWNlZGVuY2Ugb3ZlciB0aGVzZSBkZWZhdWx0IHZhbHVlcy4KK2NsYXNzIFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24gOiBJbnN0cnVjdGlvbiB7CisgIGxldCBtYXlMb2FkID0gMDsKKyAgbGV0IG1heVN0b3JlID0gMDsKKyAgbGV0IGlzQ29kZUdlbk9ubHkgPSAxOworICBsZXQgaXNQc2V1ZG8gPSAxOworICBsZXQgaGFzTm9TY2hlZHVsaW5nSW5mbyA9IDE7CisgIGxldCBOYW1lc3BhY2UgPSAiVGFyZ2V0T3Bjb2RlIjsKK30KK2RlZiBQSEkgOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdW5rbm93bjokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHZhcmlhYmxlX29wcyk7CisgIGxldCBBc21TdHJpbmcgPSAiUEhJTk9ERSI7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CitkZWYgSU5MSU5FQVNNIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHZhcmlhYmxlX29wcyk7CisgIGxldCBBc21TdHJpbmcgPSAiIjsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsgIC8vIE5vdGUgc2lkZSBlZmZlY3QgaXMgZW5jb2RlZCBpbiBhbiBvcGVyYW5kLgorfQorZGVmIENGSV9JTlNUUlVDVElPTiA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyBpMzJpbW06JGlkKTsKKyAgbGV0IEFzbVN0cmluZyA9ICIiOworICBsZXQgaGFzQ3RybERlcCA9IDE7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc05vdER1cGxpY2FibGUgPSAxOworfQorZGVmIEVIX0xBQkVMIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIGkzMmltbTokaWQpOworICBsZXQgQXNtU3RyaW5nID0gIiI7CisgIGxldCBoYXNDdHJsRGVwID0gMTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IGlzTm90RHVwbGljYWJsZSA9IDE7Cit9CitkZWYgR0NfTEFCRUwgOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgaTMyaW1tOiRpZCk7CisgIGxldCBBc21TdHJpbmcgPSAiIjsKKyAgbGV0IGhhc0N0cmxEZXAgPSAxOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworICBsZXQgaXNOb3REdXBsaWNhYmxlID0gMTsKK30KK2RlZiBBTk5PVEFUSU9OX0xBQkVMIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIGkzMmltbTokaWQpOworICBsZXQgQXNtU3RyaW5nID0gIiI7CisgIGxldCBoYXNDdHJsRGVwID0gMTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IGlzTm90RHVwbGljYWJsZSA9IDE7Cit9CitkZWYgS0lMTCA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB2YXJpYWJsZV9vcHMpOworICBsZXQgQXNtU3RyaW5nID0gIiI7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CitkZWYgRVhUUkFDVF9TVUJSRUcgOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdW5rbm93bjokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHVua25vd246JHN1cGVyc3JjLCBpMzJpbW06JHN1YmlkeCk7CisgIGxldCBBc21TdHJpbmcgPSAiIjsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KK2RlZiBJTlNFUlRfU1VCUkVHIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHVua25vd246JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB1bmtub3duOiRzdXBlcnNyYywgdW5rbm93bjokc3Vic3JjLCBpMzJpbW06JHN1YmlkeCk7CisgIGxldCBBc21TdHJpbmcgPSAiIjsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IENvbnN0cmFpbnRzID0gIiRzdXBlcnNyYyA9ICRkc3QiOworfQorZGVmIElNUExJQ0lUX0RFRiA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB1bmtub3duOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMpOworICBsZXQgQXNtU3RyaW5nID0gIiI7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc1JlTWF0ZXJpYWxpemFibGUgPSAxOworICBsZXQgaXNBc0NoZWFwQXNBTW92ZSA9IDE7Cit9CitkZWYgU1VCUkVHX1RPX1JFRyA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB1bmtub3duOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdW5rbm93bjokaW1wbHNyYywgdW5rbm93bjokc3Vic3JjLCBpMzJpbW06JHN1YmlkeCk7CisgIGxldCBBc21TdHJpbmcgPSAiIjsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKK30KK2RlZiBDT1BZX1RPX1JFR0NMQVNTIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHVua25vd246JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB1bmtub3duOiRzcmMsIGkzMmltbTokcmVnY2xhc3MpOworICBsZXQgQXNtU3RyaW5nID0gIiI7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBpc0FzQ2hlYXBBc0FNb3ZlID0gMTsKK30KK2RlZiBEQkdfVkFMVUUgOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdmFyaWFibGVfb3BzKTsKKyAgbGV0IEFzbVN0cmluZyA9ICJEQkdfVkFMVUUiOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorZGVmIFJFR19TRVFVRU5DRSA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB1bmtub3duOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdW5rbm93bjokc3VwZXJzcmMsIHZhcmlhYmxlX29wcyk7CisgIGxldCBBc21TdHJpbmcgPSAiIjsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IGlzQXNDaGVhcEFzQU1vdmUgPSAxOworfQorZGVmIENPUFkgOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdW5rbm93bjokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHVua25vd246JHNyYyk7CisgIGxldCBBc21TdHJpbmcgPSAiIjsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsKKyAgbGV0IGlzQXNDaGVhcEFzQU1vdmUgPSAxOworICBsZXQgaGFzTm9TY2hlZHVsaW5nSW5mbyA9IDA7Cit9CitkZWYgQlVORExFIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHZhcmlhYmxlX29wcyk7CisgIGxldCBBc21TdHJpbmcgPSAiQlVORExFIjsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMTsKK30KK2RlZiBMSUZFVElNRV9TVEFSVCA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyBpMzJpbW06JGlkKTsKKyAgbGV0IEFzbVN0cmluZyA9ICJMSUZFVElNRV9TVEFSVCI7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CitkZWYgTElGRVRJTUVfRU5EIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIGkzMmltbTokaWQpOworICBsZXQgQXNtU3RyaW5nID0gIkxJRkVUSU1FX0VORCI7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7Cit9CitkZWYgU1RBQ0tNQVAgOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgaTY0aW1tOiRpZCwgaTMyaW1tOiRuYnl0ZXMsIHZhcmlhYmxlX29wcyk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDE7CisgIGxldCBpc0NhbGwgPSAxOworICBsZXQgbWF5TG9hZCA9IDE7CisgIGxldCB1c2VzQ3VzdG9tSW5zZXJ0ZXIgPSAxOworfQorZGVmIFBBVENIUE9JTlQgOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdW5rbm93bjokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIGk2NGltbTokaWQsIGkzMmltbTokbmJ5dGVzLCB1bmtub3duOiRjYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgIGkzMmltbTokbmFyZ3MsIGkzMmltbTokY2MsIHZhcmlhYmxlX29wcyk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDE7CisgIGxldCBpc0NhbGwgPSAxOworICBsZXQgbWF5TG9hZCA9IDE7CisgIGxldCB1c2VzQ3VzdG9tSW5zZXJ0ZXIgPSAxOworfQorZGVmIFNUQVRFUE9JTlQgOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdmFyaWFibGVfb3BzKTsKKyAgbGV0IHVzZXNDdXN0b21JbnNlcnRlciA9IDE7CisgIGxldCBtYXlMb2FkID0gMTsKKyAgbGV0IG1heVN0b3JlID0gMTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMTsKKyAgbGV0IGlzQ2FsbCA9IDE7Cit9CitkZWYgTE9BRF9TVEFDS19HVUFSRCA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyBwdHJfcmM6JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyk7CisgIGxldCBtYXlMb2FkID0gMTsKKyAgYml0IGlzUmVNYXRlcmlhbGl6YWJsZSA9IDE7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGJpdCBpc1BzZXVkbyA9IDE7Cit9CitkZWYgTE9DQUxfRVNDQVBFIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIC8vIFRoaXMgaW5zdHJ1Y3Rpb24gaXMgcmVhbGx5IGp1c3QgYSBsYWJlbC4gSXQgaGFzIHRvIGJlIHBhcnQgb2YgdGhlIGNoYWluIHNvCisgIC8vIHRoYXQgaXQgZG9lc24ndCBnZXQgZHJvcHBlZCBmcm9tIHRoZSBEQUcsIGJ1dCBpdCBwcm9kdWNlcyBub3RoaW5nIGFuZCBoYXMKKyAgLy8gbm8gc2lkZSBlZmZlY3RzLgorICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyBwdHJfcmM6JHN5bWJvbCwgaTMyaW1tOiRpZCk7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDA7CisgIGxldCBoYXNDdHJsRGVwID0gMTsKK30KK2RlZiBGQVVMVElOR19PUCA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB1bmtub3duOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdmFyaWFibGVfb3BzKTsKKyAgbGV0IHVzZXNDdXN0b21JbnNlcnRlciA9IDE7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDE7CisgIGxldCBtYXlMb2FkID0gMTsKKyAgbGV0IG1heVN0b3JlID0gMTsKKyAgbGV0IGlzVGVybWluYXRvciA9IDE7CisgIGxldCBpc0JyYW5jaCA9IDE7Cit9CitkZWYgUEFUQ0hBQkxFX09QIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHVua25vd246JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB2YXJpYWJsZV9vcHMpOworICBsZXQgdXNlc0N1c3RvbUluc2VydGVyID0gMTsKKyAgbGV0IG1heUxvYWQgPSAxOworICBsZXQgbWF5U3RvcmUgPSAxOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAxOworfQorZGVmIFBBVENIQUJMRV9GVU5DVElPTl9FTlRFUiA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyk7CisgIGxldCBBc21TdHJpbmcgPSAiIyBYUmF5IEZ1bmN0aW9uIEVudGVyLiI7CisgIGxldCB1c2VzQ3VzdG9tSW5zZXJ0ZXIgPSAxOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAwOworfQorZGVmIFBBVENIQUJMRV9SRVQgOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdW5rbm93bjokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHZhcmlhYmxlX29wcyk7CisgIGxldCBBc21TdHJpbmcgPSAiIyBYUmF5IEZ1bmN0aW9uIFBhdGNoYWJsZSBSRVQuIjsKKyAgbGV0IHVzZXNDdXN0b21JbnNlcnRlciA9IDE7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDE7CisgIGxldCBpc1Rlcm1pbmF0b3IgPSAxOworICBsZXQgaXNSZXR1cm4gPSAxOworfQorZGVmIFBBVENIQUJMRV9GVU5DVElPTl9FWElUIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzKTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zKTsKKyAgbGV0IEFzbVN0cmluZyA9ICIjIFhSYXkgRnVuY3Rpb24gRXhpdC4iOworICBsZXQgdXNlc0N1c3RvbUluc2VydGVyID0gMTsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMDsgLy8gRklYTUU6IGlzIHRoaXMgY29ycmVjdD8KKyAgbGV0IGlzUmV0dXJuID0gMDsgLy8gT3JpZ2luYWwgcmV0dXJuIGluc3RydWN0aW9uIHdpbGwgZm9sbG93Cit9CitkZWYgUEFUQ0hBQkxFX1RBSUxfQ0FMTCA6IFN0YW5kYXJkUHNldWRvSW5zdHJ1Y3Rpb24geworICBsZXQgT3V0T3BlcmFuZExpc3QgPSAob3V0cyB1bmtub3duOiRkc3QpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgdmFyaWFibGVfb3BzKTsKKyAgbGV0IEFzbVN0cmluZyA9ICIjIFhSYXkgVGFpbCBDYWxsIEV4aXQuIjsKKyAgbGV0IHVzZXNDdXN0b21JbnNlcnRlciA9IDE7CisgIGxldCBoYXNTaWRlRWZmZWN0cyA9IDE7CisgIGxldCBpc1JldHVybiA9IDE7Cit9CitkZWYgUEFUQ0hBQkxFX0VWRU5UX0NBTEwgOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMpOworICBsZXQgSW5PcGVyYW5kTGlzdCA9IChpbnMgcHRyX3JjOiRldmVudCwgaThpbW06JHNpemUpOworICBsZXQgQXNtU3RyaW5nID0gIiMgWFJheSBDdXN0b20gRXZlbnQgTG9nLiI7CisgIGxldCB1c2VzQ3VzdG9tSW5zZXJ0ZXIgPSAxOworICBsZXQgaXNDYWxsID0gMTsKKyAgbGV0IG1heUxvYWQgPSAxOworICBsZXQgbWF5U3RvcmUgPSAxOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAxOworfQorZGVmIEZFTlRSWV9DQUxMIDogU3RhbmRhcmRQc2V1ZG9JbnN0cnVjdGlvbiB7CisgIGxldCBPdXRPcGVyYW5kTGlzdCA9IChvdXRzIHVua25vd246JGRzdCk7CisgIGxldCBJbk9wZXJhbmRMaXN0ID0gKGlucyB2YXJpYWJsZV9vcHMpOworICBsZXQgQXNtU3RyaW5nID0gIiMgRkVudHJ5IGNhbGwiOworICBsZXQgdXNlc0N1c3RvbUluc2VydGVyID0gMTsKKyAgbGV0IG1heUxvYWQgPSAxOworICBsZXQgbWF5U3RvcmUgPSAxOworICBsZXQgaGFzU2lkZUVmZmVjdHMgPSAxOworfQorZGVmIElDQUxMX0JSQU5DSF9GVU5ORUwgOiBTdGFuZGFyZFBzZXVkb0luc3RydWN0aW9uIHsKKyAgbGV0IE91dE9wZXJhbmRMaXN0ID0gKG91dHMgdW5rbm93bjokZHN0KTsKKyAgbGV0IEluT3BlcmFuZExpc3QgPSAoaW5zIHZhcmlhYmxlX29wcyk7CisgIGxldCBBc21TdHJpbmcgPSAiIjsKKyAgbGV0IGhhc1NpZGVFZmZlY3RzID0gMTsKK30KKworLy8gR2VuZXJpYyBvcGNvZGVzIHVzZWQgaW4gR2xvYmFsSVNlbC4KK2luY2x1ZGUgImxsdm0vVGFyZ2V0L0dlbmVyaWNPcGNvZGVzLnRkIgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQXNtUGFyc2VyIC0gVGhpcyBjbGFzcyBjYW4gYmUgaW1wbGVtZW50ZWQgYnkgdGFyZ2V0cyB0aGF0IHdpc2ggdG8gaW1wbGVtZW50CisvLyAucyBmaWxlIHBhcnNpbmcuCisvLworLy8gU3VidGFyZ2V0cyBjYW4gaGF2ZSBtdWx0aXBsZSBkaWZmZXJlbnQgYXNzZW1ibHkgcGFyc2VycyAoZS5nLiBBVCZUIHZzIEludGVsCisvLyBzeW50YXggb24gWDg2IGZvciBleGFtcGxlKS4KKy8vCitjbGFzcyBBc21QYXJzZXIgeworICAvLyBBc21QYXJzZXJDbGFzc05hbWUgLSBUaGlzIHNwZWNpZmllcyB0aGUgc3VmZml4IHRvIHVzZSBmb3IgdGhlIGFzbXBhcnNlcgorICAvLyBjbGFzcy4gIEdlbmVyYXRlZCBBc21QYXJzZXIgY2xhc3NlcyBhcmUgYWx3YXlzIHByZWZpeGVkIHdpdGggdGhlIHRhcmdldAorICAvLyBuYW1lLgorICBzdHJpbmcgQXNtUGFyc2VyQ2xhc3NOYW1lICA9ICJBc21QYXJzZXIiOworCisgIC8vIEFzbVBhcnNlckluc3RDbGVhbnVwIC0gSWYgbm9uLWVtcHR5LCB0aGlzIGlzIHRoZSBuYW1lIG9mIGEgY3VzdG9tIG1lbWJlcgorICAvLyBmdW5jdGlvbiBvZiB0aGUgQXNtUGFyc2VyIGNsYXNzIHRvIGNhbGwgb24gZXZlcnkgbWF0Y2hlZCBpbnN0cnVjdGlvbi4KKyAgLy8gVGhpcyBjYW4gYmUgdXNlZCB0byBwZXJmb3JtIHRhcmdldCBzcGVjaWZpYyBpbnN0cnVjdGlvbiBwb3N0LXByb2Nlc3NpbmcuCisgIHN0cmluZyBBc21QYXJzZXJJbnN0Q2xlYW51cCAgPSAiIjsKKworICAvLyBTaG91bGRFbWl0TWF0Y2hSZWdpc3Rlck5hbWUgLSBTZXQgdG8gZmFsc2UgaWYgdGhlIHRhcmdldCBuZWVkcyBhIGhhbmQKKyAgLy8gd3JpdHRlbiByZWdpc3RlciBuYW1lIG1hdGNoZXIKKyAgYml0IFNob3VsZEVtaXRNYXRjaFJlZ2lzdGVyTmFtZSA9IDE7CisKKyAgLy8gU2V0IHRvIHRydWUgaWYgdGhlIHRhcmdldCBuZWVkcyBhIGdlbmVyYXRlZCAnYWx0ZXJuYXRpdmUgcmVnaXN0ZXIgbmFtZScKKyAgLy8gbWF0Y2hlci4KKyAgLy8KKyAgLy8gVGhpcyBnZW5lcmF0ZXMgYSBmdW5jdGlvbiB3aGljaCBjYW4gYmUgdXNlZCB0byBsb29rdXAgcmVnaXN0ZXJzIGZyb20KKyAgLy8gdGhlaXIgYWxpYXNlcy4gVGhpcyBmdW5jdGlvbiB3aWxsIGZhaWwgd2hlbiBjYWxsZWQgb24gdGFyZ2V0cyB3aGVyZQorICAvLyBzZXZlcmFsIHJlZ2lzdGVycyBzaGFyZSB0aGUgc2FtZSBhbGlhcyAoaS5lLiBub3QgYSAxOjEgbWFwcGluZykuCisgIGJpdCBTaG91bGRFbWl0TWF0Y2hSZWdpc3RlckFsdE5hbWUgPSAwOworCisgIC8vIFNldCB0byB0cnVlIGlmIE1hdGNoUmVnaXN0ZXJOYW1lIGFuZCBNYXRjaFJlZ2lzdGVyQWx0TmFtZSBmdW5jdGlvbnMKKyAgLy8gc2hvdWxkIGJlIGdlbmVyYXRlZCBldmVuIGlmIHRoZXJlIGFyZSBkdXBsaWNhdGUgcmVnaXN0ZXIgbmFtZXMuIFRoZQorICAvLyB0YXJnZXQgaXMgcmVzcG9uc2libGUgZm9yIGNvZXJjaW5nIGFsaWFzZWQgcmVnaXN0ZXJzIGFzIG5lY2Vzc2FyeQorICAvLyAoZS5nLiBpbiB2YWxpZGF0ZVRhcmdldE9wZXJhbmRDbGFzcyksIGFuZCB0aGVyZSBhcmUgbm8gZ3VhcmFudGVlcyBhYm91dAorICAvLyB3aGljaCBudW1lcmljIHJlZ2lzdGVyIGlkZW50aWZpZXIgd2lsbCBiZSByZXR1cm5lZCBpbiB0aGUgY2FzZSBvZgorICAvLyBtdWx0aXBsZSBtYXRjaGVzLgorICBiaXQgQWxsb3dEdXBsaWNhdGVSZWdpc3Rlck5hbWVzID0gMDsKKworICAvLyBIYXNNbmVtb25pY0ZpcnN0IC0gU2V0IHRvIGZhbHNlIGlmIHRhcmdldCBpbnN0cnVjdGlvbnMgZG9uJ3QgYWx3YXlzCisgIC8vIHN0YXJ0IHdpdGggYSBtbmVtb25pYyBhcyB0aGUgZmlyc3QgdG9rZW4uCisgIGJpdCBIYXNNbmVtb25pY0ZpcnN0ID0gMTsKKworICAvLyBSZXBvcnRNdWx0aXBsZU5lYXJNaXNzZXMgLQorICAvLyBXaGVuIDAsIHRoZSBhc3NlbWJseSBtYXRjaGVyIHJlcG9ydHMgYW4gZXJyb3IgZm9yIG9uZSBlbmNvZGluZyBvciBvcGVyYW5kCisgIC8vIHRoYXQgZGlkIG5vdCBtYXRjaCB0aGUgcGFyc2VkIGluc3RydWN0aW9uLgorICAvLyBXaGVuIDEsIHRoZSBhc3NtZWJseSBtYXRjaGVyIHJldHVybnMgYSBsaXN0IG9mIGVuY29kaW5ncyB0aGF0IHdlcmUgY2xvc2UKKyAgLy8gdG8gbWF0Y2hpbmcgdGhlIHBhcnNlZCBpbnN0cnVjdGlvbiwgc28gdG8gYWxsb3cgbW9yZSBkZXRhaWxlZCBlcnJvcgorICAvLyBtZXNzYWdlcy4KKyAgYml0IFJlcG9ydE11bHRpcGxlTmVhck1pc3NlcyA9IDA7Cit9CitkZWYgRGVmYXVsdEFzbVBhcnNlciA6IEFzbVBhcnNlcjsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEFzbVBhcnNlclZhcmlhbnQgLSBTdWJ0YXJnZXRzIGNhbiBoYXZlIG11bHRpcGxlIGRpZmZlcmVudCBhc3NlbWJseSBwYXJzZXJzCisvLyAoZS5nLiBBVCZUIHZzIEludGVsIHN5bnRheCBvbiBYODYgZm9yIGV4YW1wbGUpLiBUaGlzIGNsYXNzIGNhbiBiZQorLy8gaW1wbGVtZW50ZWQgYnkgdGFyZ2V0cyB0byBkZXNjcmliZSBzdWNoIHZhcmlhbnRzLgorLy8KK2NsYXNzIEFzbVBhcnNlclZhcmlhbnQgeworICAvLyBWYXJpYW50IC0gQXNtUGFyc2VycyBjYW4gYmUgb2YgbXVsdGlwbGUgZGlmZmVyZW50IHZhcmlhbnRzLiAgVmFyaWFudHMgYXJlCisgIC8vIHVzZWQgdG8gc3VwcG9ydCB0YXJnZXRzIHRoYXQgbmVlZCB0byBwYXJzZXIgbXVsdGlwbGUgZm9ybWF0cyBmb3IgdGhlCisgIC8vIGFzc2VtYmx5IGxhbmd1YWdlLgorICBpbnQgVmFyaWFudCA9IDA7CisKKyAgLy8gTmFtZSAtIFRoZSBBc21QYXJzZXIgdmFyaWFudCBuYW1lIChlLmcuLCBBVCZUIHZzIEludGVsKS4KKyAgc3RyaW5nIE5hbWUgPSAiIjsKKworICAvLyBDb21tZW50RGVsaW1pdGVyIC0gSWYgZ2l2ZW4sIHRoZSBkZWxpbWl0ZXIgc3RyaW5nIHVzZWQgdG8gcmVjb2duaXplCisgIC8vIGNvbW1lbnRzIHdoaWNoIGFyZSBoYXJkIGNvZGVkIGluIHRoZSAudGQgYXNzZW1ibGVyIHN0cmluZ3MgZm9yIGluZGl2aWR1YWwKKyAgLy8gaW5zdHJ1Y3Rpb25zLgorICBzdHJpbmcgQ29tbWVudERlbGltaXRlciA9ICIiOworCisgIC8vIFJlZ2lzdGVyUHJlZml4IC0gSWYgZ2l2ZW4sIHRoZSB0b2tlbiBwcmVmaXggd2hpY2ggaW5kaWNhdGVzIGEgcmVnaXN0ZXIKKyAgLy8gdG9rZW4uIFRoaXMgaXMgdXNlZCBieSB0aGUgbWF0Y2hlciB0byBhdXRvbWF0aWNhbGx5IHJlY29nbml6ZSBoYXJkIGNvZGVkCisgIC8vIHJlZ2lzdGVyIHRva2VucyBhcyBjb25zdHJhaW5lZCByZWdpc3RlcnMsIGluc3RlYWQgb2YgdG9rZW5zLCBmb3IgdGhlCisgIC8vIHB1cnBvc2VzIG9mIG1hdGNoaW5nLgorICBzdHJpbmcgUmVnaXN0ZXJQcmVmaXggPSAiIjsKKworICAvLyBUb2tlbml6aW5nQ2hhcmFjdGVycyAtIENoYXJhY3RlcnMgdGhhdCBhcmUgc3RhbmRhbG9uZSB0b2tlbnMKKyAgc3RyaW5nIFRva2VuaXppbmdDaGFyYWN0ZXJzID0gIltdKiEiOworCisgIC8vIFNlcGFyYXRvckNoYXJhY3RlcnMgLSBDaGFyYWN0ZXJzIHRoYXQgYXJlIG5vdCB0b2tlbnMKKyAgc3RyaW5nIFNlcGFyYXRvckNoYXJhY3RlcnMgPSAiIFx0LCI7CisKKyAgLy8gQnJlYWtDaGFyYWN0ZXJzIC0gQ2hhcmFjdGVycyB0aGF0IHN0YXJ0IG5ldyBpZGVudGlmaWVycworICBzdHJpbmcgQnJlYWtDaGFyYWN0ZXJzID0gIiI7Cit9CitkZWYgRGVmYXVsdEFzbVBhcnNlclZhcmlhbnQgOiBBc21QYXJzZXJWYXJpYW50OworCisvLy8gQXNzZW1ibGVyUHJlZGljYXRlIC0gVGhpcyBpcyBhIFByZWRpY2F0ZSB0aGF0IGNhbiBiZSB1c2VkIHdoZW4gdGhlIGFzc2VtYmxlcgorLy8vIG1hdGNoZXMgaW5zdHJ1Y3Rpb25zIGFuZCBhbGlhc2VzLgorY2xhc3MgQXNzZW1ibGVyUHJlZGljYXRlPHN0cmluZyBjb25kLCBzdHJpbmcgbmFtZSA9ICIiPiB7CisgIGJpdCBBc3NlbWJsZXJNYXRjaGVyUHJlZGljYXRlID0gMTsKKyAgc3RyaW5nIEFzc2VtYmxlckNvbmRTdHJpbmcgPSBjb25kOworICBzdHJpbmcgUHJlZGljYXRlTmFtZSA9IG5hbWU7Cit9CisKKy8vLyBUb2tlbkFsaWFzIC0gVGhpcyBjbGFzcyBhbGxvd3MgdGFyZ2V0cyB0byBkZWZpbmUgYXNzZW1ibGVyIHRva2VuCisvLy8gb3BlcmFuZCBhbGlhc2VzLiBUaGF0IGlzLCBhIHRva2VuIGxpdGVyYWwgb3BlcmFuZCB3aGljaCBpcyBlcXVpdmFsZW50CisvLy8gdG8gYW5vdGhlciwgY2Fub25pY2FsLCB0b2tlbiBsaXRlcmFsLiBGb3IgZXhhbXBsZSwgQVJNIGFsbG93czoKKy8vLyAgIHZtb3YudTMyIHM0LCAjMCAgLT4gdm1vdi5pMzIsICMwCisvLy8gJ3UzMicgaXMgYSBtb3JlIHNwZWNpZmljIGRlc2lnbmF0b3IgZm9yIHRoZSAzMi1iaXQgaW50ZWdlciB0eXBlIHNwZWNpZmllcgorLy8vIGFuZCBpcyBsZWdhbCBmb3IgYW55IGluc3RydWN0aW9uIHdoaWNoIGFjY2VwdHMgJ2kzMicgYXMgYSBkYXRhdHlwZSBzdWZmaXguCisvLy8gICBkZWYgOiBUb2tlbkFsaWFzPCIudTMyIiwgIi5pMzIiPjsKKy8vLworLy8vIFRoaXMgd29ya3MgYnkgbWFya2luZyB0aGUgbWF0Y2ggY2xhc3Mgb2YgJ0Zyb20nIGFzIGEgc3ViY2xhc3Mgb2YgdGhlCisvLy8gbWF0Y2ggY2xhc3Mgb2YgJ1RvJy4KK2NsYXNzIFRva2VuQWxpYXM8c3RyaW5nIEZyb20sIHN0cmluZyBUbz4geworICBzdHJpbmcgRnJvbVRva2VuID0gRnJvbTsKKyAgc3RyaW5nIFRvVG9rZW4gPSBUbzsKK30KKworLy8vIE1uZW1vbmljQWxpYXMgLSBUaGlzIGNsYXNzIGFsbG93cyB0YXJnZXRzIHRvIGRlZmluZSBhc3NlbWJsZXIgbW5lbW9uaWMKKy8vLyBhbGlhc2VzLiAgVGhpcyBzaG91bGQgYmUgdXNlZCB3aGVuIGFsbCBmb3JtcyBvZiBvbmUgbW5lbW9uaWMgYXJlIGFjY2VwdGVkCisvLy8gd2l0aCBhIGRpZmZlcmVudCBtbmVtb25pYy4gIEZvciBleGFtcGxlLCBYODYgYWxsb3dzOgorLy8vICAgc2FsICVhbCwgMSAgICAtPiBzaGwgJWFsLCAxCisvLy8gICBzYWwgJWF4LCAlY2wgIC0+IHNobCAlYXgsICVjbAorLy8vICAgc2FsICVlYXgsICVjbCAtPiBzaGwgJWVheCwgJWNsCisvLy8gZXRjLiAgVGhvdWdoICJzYWwiIGlzIGFjY2VwdGVkIHdpdGggbWFueSBmb3JtcywgYWxsIG9mIHRoZW0gYXJlIGRpcmVjdGx5CisvLy8gdHJhbnNsYXRlZCB0byBhIHNobCwgc28gaXQgY2FuIGJlIGhhbmRsZWQgd2l0aCAoaW4gdGhlIGNhc2Ugb2YgWDg2LCBpdAorLy8vIGFjdHVhbGx5IGhhcyBvbmUgZm9yIGVhY2ggc3VmZml4IGFzIHdlbGwpOgorLy8vICAgZGVmIDogTW5lbW9uaWNBbGlhczwic2FsIiwgInNobCI+OworLy8vCisvLy8gTW5lbW9uaWMgYWxpYXNlcyBhcmUgbWFwcGVkIGJlZm9yZSBhbnkgb3RoZXIgdHJhbnNsYXRpb24gaW4gdGhlIG1hdGNoIHBoYXNlLAorLy8vIGFuZCBkbyBhbGxvdyBSZXF1aXJlcyBwcmVkaWNhdGVzLCBlLmcuOgorLy8vCisvLy8gIGRlZiA6IE1uZW1vbmljQWxpYXM8InB1c2hmIiwgInB1c2hmcSI+LCBSZXF1aXJlczxbSW42NEJpdE1vZGVdPjsKKy8vLyAgZGVmIDogTW5lbW9uaWNBbGlhczwicHVzaGYiLCAicHVzaGZsIj4sIFJlcXVpcmVzPFtJbjMyQml0TW9kZV0+OworLy8vCisvLy8gTW5lbW9uaWMgYWxpYXNlcyBjYW4gYWxzbyBiZSBjb25zdHJhaW5lZCB0byBzcGVjaWZpYyB2YXJpYW50cywgZS5nLjoKKy8vLworLy8vICBkZWYgOiBNbmVtb25pY0FsaWFzPCJwdXNoZiIsICJwdXNoZnEiLCAiYXR0Ij4sIFJlcXVpcmVzPFtJbjY0Qml0TW9kZV0+OworLy8vCisvLy8gSWYgbm8gdmFyaWFudCAoZS5nLiwgImF0dCIgb3IgImludGVsIikgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGFsaWFzIGlzCisvLy8gYXBwbGllZCB1bmNvbmRpdGlvbmFsbHkuCitjbGFzcyBNbmVtb25pY0FsaWFzPHN0cmluZyBGcm9tLCBzdHJpbmcgVG8sIHN0cmluZyBWYXJpYW50TmFtZSA9ICIiPiB7CisgIHN0cmluZyBGcm9tTW5lbW9uaWMgPSBGcm9tOworICBzdHJpbmcgVG9NbmVtb25pYyA9IFRvOworICBzdHJpbmcgQXNtVmFyaWFudE5hbWUgPSBWYXJpYW50TmFtZTsKKworICAvLyBQcmVkaWNhdGVzIC0gUHJlZGljYXRlcyB0aGF0IG11c3QgYmUgdHJ1ZSBmb3IgdGhpcyByZW1hcHBpbmcgdG8gaGFwcGVuLgorICBsaXN0PFByZWRpY2F0ZT4gUHJlZGljYXRlcyA9IFtdOworfQorCisvLy8gSW5zdEFsaWFzIC0gVGhpcyBkZWZpbmVzIGFuIGFsdGVybmF0ZSBhc3NlbWJseSBzeW50YXggdGhhdCBpcyBhbGxvd2VkIHRvCisvLy8gbWF0Y2ggYW4gaW5zdHJ1Y3Rpb24gdGhhdCBoYXMgYSBkaWZmZXJlbnQgKG1vcmUgY2Fub25pY2FsKSBhc3NlbWJseQorLy8vIHJlcHJlc2VudGF0aW9uLgorY2xhc3MgSW5zdEFsaWFzPHN0cmluZyBBc20sIGRhZyBSZXN1bHQsIGludCBFbWl0ID0gMT4geworICBzdHJpbmcgQXNtU3RyaW5nID0gQXNtOyAgICAgIC8vIFRoZSAucyBmb3JtYXQgdG8gbWF0Y2ggdGhlIGluc3RydWN0aW9uIHdpdGguCisgIGRhZyBSZXN1bHRJbnN0ID0gUmVzdWx0OyAgICAgLy8gVGhlIE1DSW5zdCB0byBnZW5lcmF0ZS4KKworICAvLyBUaGlzIGRldGVybWluZXMgd2hpY2ggb3JkZXIgdGhlIEluc3RQcmludGVyIGRldGVjdHMgYWxpYXNlcyBmb3IKKyAgLy8gcHJpbnRpbmcuIEEgbGFyZ2VyIHZhbHVlIG1ha2VzIHRoZSBhbGlhcyBtb3JlIGxpa2VseSB0byBiZQorICAvLyBlbWl0dGVkLiBUaGUgSW5zdHJ1Y3Rpb24ncyBvd24gZGVmaW5pdGlvbiBpcyBub3Rpb25hbGx5IDAuNSwgc28gMAorICAvLyBkaXNhYmxlcyBwcmludGluZyBhbmQgMSBlbmFibGVzIGl0IGlmIHRoZXJlIGFyZSBubyBjb25mbGljdGluZyBhbGlhc2VzLgorICBpbnQgRW1pdFByaW9yaXR5ID0gRW1pdDsKKworICAvLyBQcmVkaWNhdGVzIC0gUHJlZGljYXRlcyB0aGF0IG11c3QgYmUgdHJ1ZSBmb3IgdGhpcyB0byBtYXRjaC4KKyAgbGlzdDxQcmVkaWNhdGU+IFByZWRpY2F0ZXMgPSBbXTsKKworICAvLyBJZiB0aGUgaW5zdHJ1Y3Rpb24gc3BlY2lmaWVkIGluIFJlc3VsdCBoYXMgZGVmaW5lZCBhbiBBc21NYXRjaENvbnZlcnRlcgorICAvLyB0aGVuIHNldHRpbmcgdGhpcyB0byAxIHdpbGwgY2F1c2UgdGhlIGFsaWFzIHRvIHVzZSB0aGUgQXNtTWF0Y2hDb252ZXJ0ZXIKKyAgLy8gZnVuY3Rpb24gd2hlbiBjb252ZXJ0aW5nIHRoZSBPcGVyYW5kVmVjdG9yIGludG8gYW4gTUNJbnN0IGluc3RlYWQgb2YgdGhlCisgIC8vIGZ1bmN0aW9uIHRoYXQgaXMgZ2VuZXJhdGVkIGJ5IHRoZSBkYWcgUmVzdWx0LgorICAvLyBTZXR0aW5nIHRoaXMgdG8gMCB3aWxsIGNhdXNlIHRoZSBhbGlhcyB0byBpZ25vcmUgdGhlIFJlc3VsdCBpbnN0cnVjdGlvbidzCisgIC8vIGRlZmluZWQgQXNtTWF0Y2hDb252ZXJ0ZXIgYW5kIGluc3RlYWQgdXNlIHRoZSBmdW5jdGlvbiBnZW5lcmF0ZWQgYnkgdGhlCisgIC8vIGRhZyBSZXN1bHQuCisgIGJpdCBVc2VJbnN0QXNtTWF0Y2hDb252ZXJ0ZXIgPSAxOworCisgIC8vIEFzc2VtYmxlciB2YXJpYW50IG5hbWUgdG8gdXNlIGZvciB0aGlzIGFsaWFzLiBJZiBub3Qgc3BlY2lmaWVkIHRoZW4KKyAgLy8gYXNzZW1ibGVyIHZhcmlhbnRzIHdpbGwgYmUgZGV0ZXJtaW5lZCBiYXNlZCBvbiBBc21TdHJpbmcKKyAgc3RyaW5nIEFzbVZhcmlhbnROYW1lID0gIiI7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBBc21Xcml0ZXIgLSBUaGlzIGNsYXNzIGNhbiBiZSBpbXBsZW1lbnRlZCBieSB0YXJnZXRzIHRoYXQgbmVlZCB0byBjdXN0b21pemUKKy8vIHRoZSBmb3JtYXQgb2YgdGhlIC5zIGZpbGUgd3JpdGVyLgorLy8KKy8vIFN1YnRhcmdldHMgY2FuIGhhdmUgbXVsdGlwbGUgZGlmZmVyZW50IGFzbXdyaXRlcnMgKGUuZy4gQVQmVCB2cyBJbnRlbCBzeW50YXgKKy8vIG9uIFg4NiBmb3IgZXhhbXBsZSkuCisvLworY2xhc3MgQXNtV3JpdGVyIHsKKyAgLy8gQXNtV3JpdGVyQ2xhc3NOYW1lIC0gVGhpcyBzcGVjaWZpZXMgdGhlIHN1ZmZpeCB0byB1c2UgZm9yIHRoZSBhc213cml0ZXIKKyAgLy8gY2xhc3MuICBHZW5lcmF0ZWQgQXNtV3JpdGVyIGNsYXNzZXMgYXJlIGFsd2F5cyBwcmVmaXhlZCB3aXRoIHRoZSB0YXJnZXQKKyAgLy8gbmFtZS4KKyAgc3RyaW5nIEFzbVdyaXRlckNsYXNzTmFtZSAgPSAiSW5zdFByaW50ZXIiOworCisgIC8vIFBhc3NTdWJ0YXJnZXQgLSBEZXRlcm1pbmVzIHdoZXRoZXIgTUNTdWJ0YXJnZXRJbmZvIHNob3VsZCBiZSBwYXNzZWQgdG8KKyAgLy8gdGhlIHZhcmlvdXMgcHJpbnQgbWV0aG9kcy4KKyAgLy8gRklYTUU6IFJlbW92ZSBhZnRlciBhbGwgcG9ydHMgYXJlIHVwZGF0ZWQuCisgIGludCBQYXNzU3VidGFyZ2V0ID0gMDsKKworICAvLyBWYXJpYW50IC0gQXNtV3JpdGVycyBjYW4gYmUgb2YgbXVsdGlwbGUgZGlmZmVyZW50IHZhcmlhbnRzLiAgVmFyaWFudHMgYXJlCisgIC8vIHVzZWQgdG8gc3VwcG9ydCB0YXJnZXRzIHRoYXQgbmVlZCB0byBlbWl0IGFzc2VtYmx5IGNvZGUgaW4gd2F5cyB0aGF0IGFyZQorICAvLyBtb3N0bHkgdGhlIHNhbWUgZm9yIGRpZmZlcmVudCB0YXJnZXRzLCBidXQgaGF2ZSBtaW5vciBkaWZmZXJlbmNlcyBpbgorICAvLyBzeW50YXguICBJZiB0aGUgYXNtc3RyaW5nIGNvbnRhaW5zIHt8fSBjaGFyYWN0ZXJzIGluIHRoZW0sIHRoaXMgaW50ZWdlcgorICAvLyB3aWxsIHNwZWNpZnkgd2hpY2ggYWx0ZXJuYXRpdmUgdG8gdXNlLiAgRm9yIGV4YW1wbGUgInt4fHl8en0iIHdpdGggVmFyaWFudAorICAvLyA9PSAxLCB3aWxsIGV4cGFuZCB0byAieSIuCisgIGludCBWYXJpYW50ID0gMDsKK30KK2RlZiBEZWZhdWx0QXNtV3JpdGVyIDogQXNtV3JpdGVyOworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBUYXJnZXQgLSBUaGlzIGNsYXNzIGNvbnRhaW5zIHRoZSAiZ2xvYmFsIiB0YXJnZXQgaW5mb3JtYXRpb24KKy8vCitjbGFzcyBUYXJnZXQgeworICAvLyBJbnN0cnVjdGlvblNldCAtIEluc3RydWN0aW9uIHNldCBkZXNjcmlwdGlvbiBmb3IgdGhpcyB0YXJnZXQuCisgIEluc3RySW5mbyBJbnN0cnVjdGlvblNldDsKKworICAvLyBBc3NlbWJseVBhcnNlcnMgLSBUaGUgQXNtUGFyc2VyIGluc3RhbmNlcyBhdmFpbGFibGUgZm9yIHRoaXMgdGFyZ2V0LgorICBsaXN0PEFzbVBhcnNlcj4gQXNzZW1ibHlQYXJzZXJzID0gW0RlZmF1bHRBc21QYXJzZXJdOworCisgIC8vLyBBc3NlbWJseVBhcnNlclZhcmlhbnRzIC0gVGhlIEFzbVBhcnNlclZhcmlhbnQgaW5zdGFuY2VzIGF2YWlsYWJsZSBmb3IKKyAgLy8vIHRoaXMgdGFyZ2V0LgorICBsaXN0PEFzbVBhcnNlclZhcmlhbnQ+IEFzc2VtYmx5UGFyc2VyVmFyaWFudHMgPSBbRGVmYXVsdEFzbVBhcnNlclZhcmlhbnRdOworCisgIC8vIEFzc2VtYmx5V3JpdGVycyAtIFRoZSBBc21Xcml0ZXIgaW5zdGFuY2VzIGF2YWlsYWJsZSBmb3IgdGhpcyB0YXJnZXQuCisgIGxpc3Q8QXNtV3JpdGVyPiBBc3NlbWJseVdyaXRlcnMgPSBbRGVmYXVsdEFzbVdyaXRlcl07CisKKyAgLy8gQWxsb3dSZWdpc3RlclJlbmFtaW5nIC0gQ29udHJvbHMgd2hldGhlciB0aGlzIHRhcmdldCBhbGxvd3MKKyAgLy8gcG9zdC1yZWdpc3Rlci1hbGxvY2F0aW9uIHJlbmFtaW5nIG9mIHJlZ2lzdGVycy4gIFRoaXMgaXMgZG9uZSBieQorICAvLyBzZXR0aW5nIGhhc0V4dHJhRGVmUmVnQWxsb2NSZXEgYW5kIGhhc0V4dHJhU3JjUmVnQWxsb2NSZXEgdG8gMQorICAvLyBmb3IgYWxsIG9wY29kZXMgaWYgdGhpcyBmbGFnIGlzIHNldCB0byAwLgorICBpbnQgQWxsb3dSZWdpc3RlclJlbmFtaW5nID0gMDsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFN1YnRhcmdldEZlYXR1cmUgLSBBIGNoYXJhY3RlcmlzdGljIG9mIHRoZSBjaGlwIHNldC4KKy8vCitjbGFzcyBTdWJ0YXJnZXRGZWF0dXJlPHN0cmluZyBuLCBzdHJpbmcgYSwgIHN0cmluZyB2LCBzdHJpbmcgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgbGlzdDxTdWJ0YXJnZXRGZWF0dXJlPiBpID0gW10+IHsKKyAgLy8gTmFtZSAtIEZlYXR1cmUgbmFtZS4gIFVzZWQgYnkgY29tbWFuZCBsaW5lICgtbWF0dHI9KSB0byBkZXRlcm1pbmUgdGhlCisgIC8vIGFwcHJvcHJpYXRlIHRhcmdldCBjaGlwLgorICAvLworICBzdHJpbmcgTmFtZSA9IG47CisKKyAgLy8gQXR0cmlidXRlIC0gQXR0cmlidXRlIHRvIGJlIHNldCBieSBmZWF0dXJlLgorICAvLworICBzdHJpbmcgQXR0cmlidXRlID0gYTsKKworICAvLyBWYWx1ZSAtIFZhbHVlIHRoZSBhdHRyaWJ1dGUgdG8gYmUgc2V0IHRvIGJ5IGZlYXR1cmUuCisgIC8vCisgIHN0cmluZyBWYWx1ZSA9IHY7CisKKyAgLy8gRGVzYyAtIEZlYXR1cmUgZGVzY3JpcHRpb24uICBVc2VkIGJ5IGNvbW1hbmQgbGluZSAoLW1hdHRyPSkgdG8gZGlzcGxheSBoZWxwCisgIC8vIGluZm9ybWF0aW9uLgorICAvLworICBzdHJpbmcgRGVzYyA9IGQ7CisKKyAgLy8gSW1wbGllcyAtIEZlYXR1cmVzIHRoYXQgdGhpcyBmZWF0dXJlIGltcGxpZXMgYXJlIHByZXNlbnQuIElmIG9uZSBvZiB0aG9zZQorICAvLyBmZWF0dXJlcyBpc24ndCBzZXQsIHRoZW4gdGhpcyBvbmUgc2hvdWxkbid0IGJlIHNldCBlaXRoZXIuCisgIC8vCisgIGxpc3Q8U3VidGFyZ2V0RmVhdHVyZT4gSW1wbGllcyA9IGk7Cit9CisKKy8vLyBTcGVjaWZpZXMgYSBTdWJ0YXJnZXQgZmVhdHVyZSB0aGF0IHRoaXMgaW5zdHJ1Y3Rpb24gaXMgZGVwcmVjYXRlZCBvbi4KK2NsYXNzIERlcHJlY2F0ZWQ8U3VidGFyZ2V0RmVhdHVyZSBkZXA+IHsKKyAgU3VidGFyZ2V0RmVhdHVyZSBEZXByZWNhdGVkRmVhdHVyZU1hc2sgPSBkZXA7Cit9CisKKy8vLyBBIGN1c3RvbSBwcmVkaWNhdGUgdXNlZCB0byBkZXRlcm1pbmUgaWYgYW4gaW5zdHJ1Y3Rpb24gaXMKKy8vLyBkZXByZWNhdGVkIG9yIG5vdC4KK2NsYXNzIENvbXBsZXhEZXByZWNhdGlvblByZWRpY2F0ZTxzdHJpbmcgZGVwPiB7CisgIHN0cmluZyBDb21wbGV4RGVwcmVjYXRpb25QcmVkaWNhdGUgPSBkZXA7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQcm9jZXNzb3IgY2hpcCBzZXRzIC0gVGhlc2UgdmFsdWVzIHJlcHJlc2VudCBlYWNoIG9mIHRoZSBjaGlwIHNldHMgc3VwcG9ydGVkCisvLyBieSB0aGUgc2NoZWR1bGVyLiAgRWFjaCBQcm9jZXNzb3IgZGVmaW5pdGlvbiByZXF1aXJlcyBjb3JyZXNwb25kaW5nCisvLyBpbnN0cnVjdGlvbiBpdGluZXJhcmllcy4KKy8vCitjbGFzcyBQcm9jZXNzb3I8c3RyaW5nIG4sIFByb2Nlc3Nvckl0aW5lcmFyaWVzIHBpLCBsaXN0PFN1YnRhcmdldEZlYXR1cmU+IGY+IHsKKyAgLy8gTmFtZSAtIENoaXAgc2V0IG5hbWUuICBVc2VkIGJ5IGNvbW1hbmQgbGluZSAoLW1jcHU9KSB0byBkZXRlcm1pbmUgdGhlCisgIC8vIGFwcHJvcHJpYXRlIHRhcmdldCBjaGlwLgorICAvLworICBzdHJpbmcgTmFtZSA9IG47CisKKyAgLy8gU2NoZWRNb2RlbCAtIFRoZSBtYWNoaW5lIG1vZGVsIGZvciBzY2hlZHVsaW5nIGFuZCBpbnN0cnVjdGlvbiBjb3N0LgorICAvLworICBTY2hlZE1hY2hpbmVNb2RlbCBTY2hlZE1vZGVsID0gTm9TY2hlZE1vZGVsOworCisgIC8vIFByb2NJdGluIC0gVGhlIHNjaGVkdWxpbmcgaW5mb3JtYXRpb24gZm9yIHRoZSB0YXJnZXQgcHJvY2Vzc29yLgorICAvLworICBQcm9jZXNzb3JJdGluZXJhcmllcyBQcm9jSXRpbiA9IHBpOworCisgIC8vIEZlYXR1cmVzIC0gbGlzdCBvZgorICBsaXN0PFN1YnRhcmdldEZlYXR1cmU+IEZlYXR1cmVzID0gZjsKK30KKworLy8gUHJvY2Vzc29yTW9kZWwgYWxsb3dzIHN1YnRhcmdldHMgdG8gc3BlY2lmeSB0aGUgbW9yZSBnZW5lcmFsCisvLyBTY2hlZE1hY2hpbmVNb2RlbCBpbnN0ZWFkIGlmIGEgUHJvY2Vzc29ySXRpbmVyYXJ5LiBTdWJ0YXJnZXRzIHdpbGwKKy8vIGdyYWR1YWxseSBtb3ZlIHRvIHRoaXMgbmV3ZXIgZm9ybS4KKy8vCisvLyBBbHRob3VnaCB0aGlzIGNsYXNzIGFsd2F5cyBwYXNzZXMgTm9JdGluZXJhcmllcyB0byB0aGUgUHJvY2Vzc29yCisvLyBjbGFzcywgdGhlIFNjaGVkTWFjaGluZU1vZGVsIG1heSBzdGlsbCBkZWZpbmUgdmFsaWQgSXRpbmVyYXJpZXMuCitjbGFzcyBQcm9jZXNzb3JNb2RlbDxzdHJpbmcgbiwgU2NoZWRNYWNoaW5lTW9kZWwgbSwgbGlzdDxTdWJ0YXJnZXRGZWF0dXJlPiBmPgorICA6IFByb2Nlc3NvcjxuLCBOb0l0aW5lcmFyaWVzLCBmPiB7CisgIGxldCBTY2hlZE1vZGVsID0gbTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RyTWFwcGluZyAtIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBjcmVhdGUgbWFwcGluZyB0YWJsZXMgdG8gcmVsYXRlCisvLyBpbnN0cnVjdGlvbnMgd2l0aCBlYWNoIG90aGVyIGJhc2VkIG9uIHRoZSB2YWx1ZXMgc3BlY2lmaWVkIGluIFJvd0ZpZWxkcywKKy8vIENvbEZpZWxkcywgS2V5Q29sIGFuZCBWYWx1ZUNvbHMuCisvLworY2xhc3MgSW5zdHJNYXBwaW5nIHsKKyAgLy8gRmlsdGVyQ2xhc3MgLSBVc2VkIHRvIGxpbWl0IHNlYXJjaCBzcGFjZSBvbmx5IHRvIHRoZSBpbnN0cnVjdGlvbnMgdGhhdAorICAvLyBkZWZpbmUgdGhlIHJlbGF0aW9uc2hpcCBtb2RlbGVkIGJ5IHRoaXMgSW5zdHJNYXBwaW5nIHJlY29yZC4KKyAgc3RyaW5nIEZpbHRlckNsYXNzOworCisgIC8vIFJvd0ZpZWxkcyAtIExpc3Qgb2YgZmllbGRzL2F0dHJpYnV0ZXMgdGhhdCBzaG91bGQgYmUgc2FtZSBmb3IgYWxsIHRoZQorICAvLyBpbnN0cnVjdGlvbnMgaW4gYSByb3cgb2YgdGhlIHJlbGF0aW9uIHRhYmxlLiBUaGluayBvZiB0aGlzIGFzIGEgc2V0IG9mCisgIC8vIHByb3BlcnRpZXMgc2hhcmVkIGJ5IGFsbCB0aGUgaW5zdHJ1Y3Rpb25zIHJlbGF0ZWQgYnkgdGhpcyByZWxhdGlvbnNoaXAKKyAgLy8gbW9kZWwgYW5kIGlzIHVzZWQgdG8gY2F0ZWdvcml6ZSBpbnN0cnVjdGlvbnMgaW50byBzdWJncm91cHMuIEZvciBpbnN0YW5jZSwKKyAgLy8gaWYgd2Ugd2FudCB0byBkZWZpbmUgYSByZWxhdGlvbiB0aGF0IG1hcHMgJ0FkZCcgaW5zdHJ1Y3Rpb24gdG8gaXRzCisgIC8vIHByZWRpY2F0ZWQgZm9ybXMsIHdlIGNhbiBkZWZpbmUgUm93RmllbGRzIGxpa2UgdGhpczoKKyAgLy8KKyAgLy8gbGV0IFJvd0ZpZWxkcyA9IEJhc2VPcAorICAvLyBBbGwgYWRkIGluc3RydWN0aW9uIHByZWRpY2F0ZWQvbm9uLXByZWRpY2F0ZWQgd2lsbCBoYXZlIHRvIHNldCB0aGVpciBCYXNlT3AKKyAgLy8gdG8gdGhlIHNhbWUgdmFsdWUuCisgIC8vCisgIC8vIGRlZiBBZGQ6IHsgbGV0IEJhc2VPcCA9ICdBREQnOyBsZXQgcHJlZFNlbnNlID0gJ25vcHJlZCcgfQorICAvLyBkZWYgQWRkX3ByZWR0cnVlOiB7IGxldCBCYXNlT3AgPSAnQUREJzsgbGV0IHByZWRTZW5zZSA9ICd0cnVlJyB9CisgIC8vIGRlZiBBZGRfcHJlZGZhbHNlOiB7IGxldCBCYXNlT3AgPSAnQUREJzsgbGV0IHByZWRTZW5zZSA9ICdmYWxzZScgIH0KKyAgbGlzdDxzdHJpbmc+IFJvd0ZpZWxkcyA9IFtdOworCisgIC8vIExpc3Qgb2YgZmllbGRzL2F0dHJpYnV0ZXMgdGhhdCBhcmUgc2FtZSBmb3IgYWxsIHRoZSBpbnN0cnVjdGlvbnMKKyAgLy8gaW4gYSBjb2x1bW4gb2YgdGhlIHJlbGF0aW9uIHRhYmxlLgorICAvLyBFeDogbGV0IENvbEZpZWxkcyA9ICdwcmVkU2Vuc2UnIC0tIEl0IG1lYW5zIHRoYXQgdGhlIGNvbHVtbnMgYXJlIGFycmFuZ2VkCisgIC8vIGJhc2VkIG9uIHRoZSAncHJlZFNlbnNlJyB2YWx1ZXMuIEFsbCB0aGUgaW5zdHJ1Y3Rpb24gaW4gYSBzcGVjaWZpYworICAvLyBjb2x1bW4gaGF2ZSB0aGUgc2FtZSB2YWx1ZSBhbmQgaXQgaXMgZml4ZWQgZm9yIHRoZSBjb2x1bW4gYWNjb3JkaW5nCisgIC8vIHRvIHRoZSB2YWx1ZXMgc2V0IGluICdWYWx1ZUNvbHMnLgorICBsaXN0PHN0cmluZz4gQ29sRmllbGRzID0gW107CisKKyAgLy8gVmFsdWVzIGZvciB0aGUgZmllbGRzL2F0dHJpYnV0ZXMgbGlzdGVkIGluICdDb2xGaWVsZHMnLgorICAvLyBFeDogbGV0IEtleUNvbCA9ICdub3ByZWQnIC0tIEl0IG1lYW5zIHRoYXQgdGhlIGtleSBpbnN0cnVjdGlvbiAoaW5zdHJ1Y3Rpb24KKyAgLy8gdGhhdCBtb2RlbHMgdGhpcyByZWxhdGlvbikgc2hvdWxkIGJlIG5vbi1wcmVkaWNhdGVkLgorICAvLyBJbiB0aGUgZXhhbXBsZSBhYm92ZSwgJ0FkZCcgaXMgdGhlIGtleSBpbnN0cnVjdGlvbi4KKyAgbGlzdDxzdHJpbmc+IEtleUNvbCA9IFtdOworCisgIC8vIExpc3Qgb2YgdmFsdWVzIGZvciB0aGUgZmllbGRzL2F0dHJpYnV0ZXMgbGlzdGVkIGluICdDb2xGaWVsZHMnLCBvbmUgZm9yCisgIC8vIGVhY2ggY29sdW1uIGluIHRoZSByZWxhdGlvbiB0YWJsZS4KKyAgLy8KKyAgLy8gRXg6IGxldCBWYWx1ZUNvbHMgPSBbWyd0cnVlJ10sWydmYWxzZSddXSAtLSBJdCBhZGRzIHR3byBjb2x1bW5zIGluIHRoZQorICAvLyB0YWJsZS4gRmlyc3QgY29sdW1uIHJlcXVpcmVzIGFsbCB0aGUgaW5zdHJ1Y3Rpb25zIHRvIGhhdmUgcHJlZFNlbnNlCisgIC8vIHNldCB0byAndHJ1ZScgYW5kIHNlY29uZCBjb2x1bW4gcmVxdWlyZXMgaXQgdG8gYmUgJ2ZhbHNlJy4KKyAgbGlzdDxsaXN0PHN0cmluZz4gPiBWYWx1ZUNvbHMgPSBbXTsKK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFB1bGwgaW4gdGhlIGNvbW1vbiBzdXBwb3J0IGZvciBjYWxsaW5nIGNvbnZlbnRpb25zLgorLy8KK2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldENhbGxpbmdDb252LnRkIgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUHVsbCBpbiB0aGUgY29tbW9uIHN1cHBvcnQgZm9yIERBRyBpc2VsIGdlbmVyYXRpb24uCisvLworaW5jbHVkZSAibGx2bS9UYXJnZXQvVGFyZ2V0U2VsZWN0aW9uREFHLnRkIgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUHVsbCBpbiB0aGUgY29tbW9uIHN1cHBvcnQgZm9yIEdsb2JhbCBJU2VsIHJlZ2lzdGVyIGJhbmsgaW5mbyBnZW5lcmF0aW9uLgorLy8KK2luY2x1ZGUgImxsdm0vVGFyZ2V0L0dsb2JhbElTZWwvUmVnaXN0ZXJCYW5rLnRkIgorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUHVsbCBpbiB0aGUgY29tbW9uIHN1cHBvcnQgZm9yIERBRyBpc2VsIGdlbmVyYXRpb24uCisvLworaW5jbHVkZSAibGx2bS9UYXJnZXQvR2xvYmFsSVNlbC9UYXJnZXQudGQiCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQdWxsIGluIHRoZSBjb21tb24gc3VwcG9ydCBmb3IgdGhlIEdsb2JhbCBJU2VsIERBRy1iYXNlZCBzZWxlY3RvciBnZW5lcmF0aW9uLgorLy8KK2luY2x1ZGUgImxsdm0vVGFyZ2V0L0dsb2JhbElTZWwvU2VsZWN0aW9uREFHQ29tcGF0LnRkIgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0Q2FsbGluZ0NvbnYudGQgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRDYWxsaW5nQ29udi50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDg2MzlkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0Q2FsbGluZ0NvbnYudGQKQEAgLTAsMCArMSwxODcgQEAKKy8vPT09LSBUYXJnZXRDYWxsaW5nQ29udi50ZCAtIFRhcmdldCBDYWxsaW5nIENvbnZlbnRpb25zIC0tLSotIHRhYmxlZ2VuIC0qLT09PS8vCisvLyAKKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vIAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgdGFyZ2V0LWluZGVwZW5kZW50IGludGVyZmFjZXMgd2l0aCB3aGljaCB0YXJnZXRzCisvLyBkZXNjcmliZSB0aGVpciBjYWxsaW5nIGNvbnZlbnRpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKK2NsYXNzIENDQWN0aW9uOworY2xhc3MgQ2FsbGluZ0NvbnY7CisKKy8vLyBDQ0N1c3RvbSAtIENhbGxzIGEgY3VzdG9tIGFyZyBoYW5kbGluZyBmdW5jdGlvbi4KK2NsYXNzIENDQ3VzdG9tPHN0cmluZyBmbj4gOiBDQ0FjdGlvbiB7CisgIHN0cmluZyBGdW5jTmFtZSA9IGZuOworfQorCisvLy8gQ0NQcmVkaWNhdGVBY3Rpb24gLSBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBjaGVjayBzb21lIHByZWRpY2F0ZSwgdGhlbgorLy8vIGRlbGVnYXRlIHRvIGFub3RoZXIgYWN0aW9uIGlmIHRoZSBwcmVkaWNhdGUgaXMgdHJ1ZS4KK2NsYXNzIENDUHJlZGljYXRlQWN0aW9uPENDQWN0aW9uIEE+IDogQ0NBY3Rpb24geworICBDQ0FjdGlvbiBTdWJBY3Rpb24gPSBBOworfQorCisvLy8gQ0NJZlR5cGUgLSBJZiB0aGUgY3VycmVudCBhcmd1bWVudCBpcyBvbmUgb2YgdGhlIHNwZWNpZmllZCB0eXBlcywgYXBwbHkKKy8vLyBBY3Rpb24gQS4KK2NsYXNzIENDSWZUeXBlPGxpc3Q8VmFsdWVUeXBlPiB2dHMsIENDQWN0aW9uIEE+IDogQ0NQcmVkaWNhdGVBY3Rpb248QT4geworICBsaXN0PFZhbHVlVHlwZT4gVlRzID0gdnRzOworfQorCisvLy8gQ0NJZiAtIElmIHRoZSBwcmVkaWNhdGUgbWF0Y2hlcywgYXBwbHkgQS4KK2NsYXNzIENDSWY8c3RyaW5nIHByZWRpY2F0ZSwgQ0NBY3Rpb24gQT4gOiBDQ1ByZWRpY2F0ZUFjdGlvbjxBPiB7CisgIHN0cmluZyBQcmVkaWNhdGUgPSBwcmVkaWNhdGU7Cit9CisKKy8vLyBDQ0lmQnlWYWwgLSBJZiB0aGUgY3VycmVudCBhcmd1bWVudCBoYXMgQnlWYWwgcGFyYW1ldGVyIGF0dHJpYnV0ZSwgYXBwbHkKKy8vLyBBY3Rpb24gQS4KK2NsYXNzIENDSWZCeVZhbDxDQ0FjdGlvbiBBPiA6IENDSWY8IkFyZ0ZsYWdzLmlzQnlWYWwoKSIsIEE+IHsKK30KKworLy8vIENDSWZTd2lmdFNlbGYgLSBJZiB0aGUgY3VycmVudCBhcmd1bWVudCBoYXMgc3dpZnRzZWxmIHBhcmFtZXRlciBhdHRyaWJ1dGUsCisvLy8gYXBwbHkgQWN0aW9uIEEuCitjbGFzcyBDQ0lmU3dpZnRTZWxmPENDQWN0aW9uIEE+IDogQ0NJZjwiQXJnRmxhZ3MuaXNTd2lmdFNlbGYoKSIsIEE+IHsKK30KKworLy8vIENDSWZTd2lmdEVycm9yIC0gSWYgdGhlIGN1cnJlbnQgYXJndW1lbnQgaGFzIHN3aWZ0ZXJyb3IgcGFyYW1ldGVyIGF0dHJpYnV0ZSwKKy8vLyBhcHBseSBBY3Rpb24gQS4KK2NsYXNzIENDSWZTd2lmdEVycm9yPENDQWN0aW9uIEE+IDogQ0NJZjwiQXJnRmxhZ3MuaXNTd2lmdEVycm9yKCkiLCBBPiB7Cit9CisKKy8vLyBDQ0lmQ29uc2VjdXRpdmVSZWdzIC0gSWYgdGhlIGN1cnJlbnQgYXJndW1lbnQgaGFzIEluQ29uc2VjdXRpdmVSZWdzCisvLy8gcGFyYW1ldGVyIGF0dHJpYnV0ZSwgYXBwbHkgQWN0aW9uIEEuCitjbGFzcyBDQ0lmQ29uc2VjdXRpdmVSZWdzPENDQWN0aW9uIEE+IDogQ0NJZjwiQXJnRmxhZ3MuaXNJbkNvbnNlY3V0aXZlUmVncygpIiwgQT4geworfQorCisvLy8gQ0NJZkNDIC0gTWF0Y2ggaWYgdGhlIGN1cnJlbnQgY2FsbGluZyBjb252ZW50aW9uIGlzICdDQycuCitjbGFzcyBDQ0lmQ0M8c3RyaW5nIENDLCBDQ0FjdGlvbiBBPgorICA6IENDSWY8IXN0cmNvbmNhdCgiU3RhdGUuZ2V0Q2FsbGluZ0NvbnYoKSA9PSAiLCBDQyksIEE+IHt9CisKKy8vLyBDQ0lmSW5SZWcgLSBJZiB0aGlzIGFyZ3VtZW50IGlzIG1hcmtlZCB3aXRoIHRoZSAnaW5yZWcnIGF0dHJpYnV0ZSwgYXBwbHkKKy8vLyB0aGUgc3BlY2lmaWVkIGFjdGlvbi4KK2NsYXNzIENDSWZJblJlZzxDQ0FjdGlvbiBBPiA6IENDSWY8IkFyZ0ZsYWdzLmlzSW5SZWcoKSIsIEE+IHt9CisKKy8vLyBDQ0lmTmVzdCAtIElmIHRoaXMgYXJndW1lbnQgaXMgbWFya2VkIHdpdGggdGhlICduZXN0JyBhdHRyaWJ1dGUsIGFwcGx5CisvLy8gdGhlIHNwZWNpZmllZCBhY3Rpb24uCitjbGFzcyBDQ0lmTmVzdDxDQ0FjdGlvbiBBPiA6IENDSWY8IkFyZ0ZsYWdzLmlzTmVzdCgpIiwgQT4ge30KKworLy8vIENDSWZTcGxpdCAtIElmIHRoaXMgYXJndW1lbnQgaXMgbWFya2VkIHdpdGggdGhlICdzcGxpdCcgYXR0cmlidXRlLCBhcHBseQorLy8vIHRoZSBzcGVjaWZpZWQgYWN0aW9uLgorY2xhc3MgQ0NJZlNwbGl0PENDQWN0aW9uIEE+IDogQ0NJZjwiQXJnRmxhZ3MuaXNTcGxpdCgpIiwgQT4ge30KKworLy8vIENDSWZTUmV0IC0gSWYgdGhpcyBhcmd1bWVudCBpcyBtYXJrZWQgd2l0aCB0aGUgJ3NyZXQnIGF0dHJpYnV0ZSwgYXBwbHkKKy8vLyB0aGUgc3BlY2lmaWVkIGFjdGlvbi4KK2NsYXNzIENDSWZTUmV0PENDQWN0aW9uIEE+IDogQ0NJZjwiQXJnRmxhZ3MuaXNTUmV0KCkiLCBBPiB7fQorCisvLy8gQ0NJZlZhckFyZyAtIElmIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGlzIHZhcmFyZyAtIGFwcGx5IHRoZSBhY3Rpb24KK2NsYXNzIENDSWZWYXJBcmc8Q0NBY3Rpb24gQT4gOiBDQ0lmPCJTdGF0ZS5pc1ZhckFyZygpIiwgQT4ge30KKworLy8vIENDSWZOb3RWYXJBcmcgLSBJZiB0aGUgY3VycmVudCBmdW5jdGlvbiBpcyBub3QgdmFyYXJnIC0gYXBwbHkgdGhlIGFjdGlvbgorY2xhc3MgQ0NJZk5vdFZhckFyZzxDQ0FjdGlvbiBBPiA6IENDSWY8IiFTdGF0ZS5pc1ZhckFyZygpIiwgQT4ge30KKworLy8vIENDQXNzaWduVG9SZWcgLSBUaGlzIGFjdGlvbiBtYXRjaGVzIGlmIHRoZXJlIGlzIGEgcmVnaXN0ZXIgaW4gdGhlIHNwZWNpZmllZAorLy8vIGxpc3QgdGhhdCBpcyBzdGlsbCBhdmFpbGFibGUuICBJZiBzbywgaXQgYXNzaWducyB0aGUgdmFsdWUgdG8gdGhlIGZpcnN0CisvLy8gYXZhaWxhYmxlIHJlZ2lzdGVyIGFuZCBzdWNjZWVkcy4KK2NsYXNzIENDQXNzaWduVG9SZWc8bGlzdDxSZWdpc3Rlcj4gcmVnTGlzdD4gOiBDQ0FjdGlvbiB7CisgIGxpc3Q8UmVnaXN0ZXI+IFJlZ0xpc3QgPSByZWdMaXN0OworfQorCisvLy8gQ0NBc3NpZ25Ub1JlZ1dpdGhTaGFkb3cgLSBTYW1lIGFzIENDQXNzaWduVG9SZWcsIGJ1dCB3aXRoIGxpc3Qgb2YgcmVnaXN0ZXJzCisvLy8gd2hpY2ggYmVjYW1lIHNoYWRvd2VkLCB3aGVuIHNvbWUgcmVnaXN0ZXIgaXMgdXNlZC4KK2NsYXNzIENDQXNzaWduVG9SZWdXaXRoU2hhZG93PGxpc3Q8UmVnaXN0ZXI+IHJlZ0xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0PFJlZ2lzdGVyPiBzaGFkb3dMaXN0PiA6IENDQWN0aW9uIHsKKyAgbGlzdDxSZWdpc3Rlcj4gUmVnTGlzdCA9IHJlZ0xpc3Q7CisgIGxpc3Q8UmVnaXN0ZXI+IFNoYWRvd1JlZ0xpc3QgPSBzaGFkb3dMaXN0OworfQorCisvLy8gQ0NBc3NpZ25Ub1N0YWNrIC0gVGhpcyBhY3Rpb24gYWx3YXlzIG1hdGNoZXM6IGl0IGFzc2lnbnMgdGhlIHZhbHVlIHRvIGEKKy8vLyBzdGFjayBzbG90IG9mIHRoZSBzcGVjaWZpZWQgc2l6ZSBhbmQgYWxpZ25tZW50IG9uIHRoZSBzdGFjay4gIElmIHNpemUgaXMKKy8vLyB6ZXJvIHRoZW4gdGhlIEFCSSBzaXplIGlzIHVzZWQ7IGlmIGFsaWduIGlzIHplcm8gdGhlbiB0aGUgQUJJIGFsaWdubWVudAorLy8vIGlzIHVzZWQgLSB0aGVzZSBtYXkgZGVwZW5kIG9uIHRoZSB0YXJnZXQgb3Igc3VidGFyZ2V0LgorY2xhc3MgQ0NBc3NpZ25Ub1N0YWNrPGludCBzaXplLCBpbnQgYWxpZ24+IDogQ0NBY3Rpb24geworICBpbnQgU2l6ZSA9IHNpemU7CisgIGludCBBbGlnbiA9IGFsaWduOworfQorCisvLy8gQ0NBc3NpZ25Ub1N0YWNrV2l0aFNoYWRvdyAtIFNhbWUgYXMgQ0NBc3NpZ25Ub1N0YWNrLCBidXQgd2l0aCBhIGxpc3Qgb2YKKy8vLyByZWdpc3RlcnMgdG8gYmUgc2hhZG93ZWQuIE5vdGUgdGhhdCwgdW5saWtlIENDQXNzaWduVG9SZWdXaXRoU2hhZG93LCB0aGlzCisvLy8gc2hhZG93cyBBTEwgb2YgdGhlIHJlZ2lzdGVycyBpbiBzaGFkb3dMaXN0LgorY2xhc3MgQ0NBc3NpZ25Ub1N0YWNrV2l0aFNoYWRvdzxpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFsaWduLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0PFJlZ2lzdGVyPiBzaGFkb3dMaXN0PiA6IENDQWN0aW9uIHsKKyAgaW50IFNpemUgPSBzaXplOworICBpbnQgQWxpZ24gPSBhbGlnbjsKKyAgbGlzdDxSZWdpc3Rlcj4gU2hhZG93UmVnTGlzdCA9IHNoYWRvd0xpc3Q7Cit9CisKKy8vLyBDQ1Bhc3NCeVZhbCAtIFRoaXMgYWN0aW9uIGFsd2F5cyBtYXRjaGVzOiBpdCBhc3NpZ25zIHRoZSB2YWx1ZSB0byBhIHN0YWNrCisvLy8gc2xvdCB0byBpbXBsZW1lbnQgQnlWYWwgYWdncmVnYXRlIHBhcmFtZXRlciBwYXNzaW5nLiBTaXplIGFuZCBhbGlnbm1lbnQKKy8vLyBzcGVjaWZ5IHRoZSBtaW5pbXVtIHNpemUgYW5kIGFsaWdubWVudCBmb3IgdGhlIHN0YWNrIHNsb3QuCitjbGFzcyBDQ1Bhc3NCeVZhbDxpbnQgc2l6ZSwgaW50IGFsaWduPiA6IENDQWN0aW9uIHsKKyAgaW50IFNpemUgPSBzaXplOworICBpbnQgQWxpZ24gPSBhbGlnbjsKK30KKworLy8vIENDUHJvbW90ZVRvVHlwZSAtIElmIGFwcGxpZWQsIHRoaXMgcHJvbW90ZXMgdGhlIHNwZWNpZmllZCBjdXJyZW50IHZhbHVlIHRvCisvLy8gdGhlIHNwZWNpZmllZCB0eXBlLgorY2xhc3MgQ0NQcm9tb3RlVG9UeXBlPFZhbHVlVHlwZSBkZXN0VHk+IDogQ0NBY3Rpb24geworICBWYWx1ZVR5cGUgRGVzdFR5ID0gZGVzdFR5OworfQorCisvLy8gQ0NQcm9tb3RlVG9VcHBlckJpdHNJblR5cGUgLSBJZiBhcHBsaWVkLCB0aGlzIHByb21vdGVzIHRoZSBzcGVjaWZpZWQgY3VycmVudAorLy8vIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgdHlwZSBhbmQgc2hpZnRzIHRoZSB2YWx1ZSBpbnRvIHRoZSB1cHBlciBiaXRzLgorY2xhc3MgQ0NQcm9tb3RlVG9VcHBlckJpdHNJblR5cGU8VmFsdWVUeXBlIGRlc3RUeT4gOiBDQ0FjdGlvbiB7CisgIFZhbHVlVHlwZSBEZXN0VHkgPSBkZXN0VHk7Cit9CisKKy8vLyBDQ0JpdENvbnZlcnRUb1R5cGUgLSBJZiBhcHBsaWVkLCB0aGlzIGJpdGNvbnZlcnRzIHRoZSBzcGVjaWZpZWQgY3VycmVudAorLy8vIHZhbHVlIHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KK2NsYXNzIENDQml0Q29udmVydFRvVHlwZTxWYWx1ZVR5cGUgZGVzdFR5PiA6IENDQWN0aW9uIHsKKyAgVmFsdWVUeXBlIERlc3RUeSA9IGRlc3RUeTsKK30KKworLy8vIENDUGFzc0luZGlyZWN0IC0gSWYgYXBwbGllZCwgdGhpcyBzdG9yZXMgdGhlIHZhbHVlIHRvIHN0YWNrIGFuZCBwYXNzZXMgdGhlIHBvaW50ZXIKKy8vLyBhcyBub3JtYWwgYXJndW1lbnQuCitjbGFzcyBDQ1Bhc3NJbmRpcmVjdDxWYWx1ZVR5cGUgZGVzdFR5PiA6IENDQWN0aW9uIHsKKyAgVmFsdWVUeXBlIERlc3RUeSA9IGRlc3RUeTsKK30KKworLy8vIENDRGVsZWdhdGVUbyAtIFRoaXMgYWN0aW9uIGludm9rZXMgdGhlIHNwZWNpZmllZCBzdWItY2FsbGluZy1jb252ZW50aW9uLiAgSXQKKy8vLyBpcyBzdWNjZXNzZnVsIGlmIHRoZSBzcGVjaWZpZWQgQ0MgbWF0Y2hlcy4KK2NsYXNzIENDRGVsZWdhdGVUbzxDYWxsaW5nQ29udiBjYz4gOiBDQ0FjdGlvbiB7CisgIENhbGxpbmdDb252IENDID0gY2M7Cit9CisKKy8vLyBDYWxsaW5nQ29udiAtIEFuIGluc3RhbmNlIG9mIHRoaXMgaXMgdXNlZCB0byBkZWZpbmUgZWFjaCBjYWxsaW5nIGNvbnZlbnRpb24KKy8vLyB0aGF0IHRoZSB0YXJnZXQgc3VwcG9ydHMuCitjbGFzcyBDYWxsaW5nQ29udjxsaXN0PENDQWN0aW9uPiBhY3Rpb25zPiB7CisgIGxpc3Q8Q0NBY3Rpb24+IEFjdGlvbnMgPSBhY3Rpb25zOworICBiaXQgQ3VzdG9tID0gMDsKK30KKworLy8vIEN1c3RvbUNhbGxpbmdDb252IC0gQW4gaW5zdGFuY2Ugb2YgdGhpcyBpcyB1c2VkIHRvIGRlY2xhcmUgY2FsbGluZworLy8vIGNvbnZlbnRpb25zIHRoYXQgYXJlIGltcGxlbWVudGVkIHVzaW5nIGEgY3VzdG9tIGZ1bmN0aW9uIG9mIHRoZSBzYW1lIG5hbWUuCitjbGFzcyBDdXN0b21DYWxsaW5nQ29udiA6IENhbGxpbmdDb252PFtdPiB7CisgIGxldCBDdXN0b20gPSAxOworfQorCisvLy8gQ2FsbGVlU2F2ZWRSZWdzIC0gQSBsaXN0IG9mIGNhbGxlZSBzYXZlZCByZWdpc3RlcnMgZm9yIGEgZ2l2ZW4gY2FsbGluZworLy8vIGNvbnZlbnRpb24uICBUaGUgb3JkZXIgb2YgcmVnaXN0ZXJzIGlzIHVzZWQgYnkgUHJvbG9nRXBpbG9nSW5zZXJ0aW9uIHdoZW4KKy8vLyBhbGxvY2F0aW9uIHN0YWNrIHNsb3RzIGZvciBzYXZlZCByZWdpc3RlcnMuCisvLy8KKy8vLyBGb3IgZWFjaCBDYWxsZWVTYXZlZFJlZ3MgZGVmLCBUYWJsZUdlbiB3aWxsIGVtaXQgYSBGT09fU2F2ZUxpc3QgYXJyYXkgZm9yCisvLy8gcmV0dXJuaW5nIGZyb20gZ2V0Q2FsbGVlU2F2ZWRSZWdzKCksIGFuZCBhIEZPT19SZWdNYXNrIGJpdCBtYXNrIHN1aXRhYmxlIGZvcgorLy8vIHJldHVybmluZyBmcm9tIGdldENhbGxQcmVzZXJ2ZWRNYXNrKCkuCitjbGFzcyBDYWxsZWVTYXZlZFJlZ3M8ZGFnIHNhdmVzPiB7CisgIGRhZyBTYXZlTGlzdCA9IHNhdmVzOworCisgIC8vIFJlZ2lzdGVycyB0aGF0IGFyZSBhbHNvIHByZXNlcnZlZCBhY3Jvc3MgZnVuY3Rpb24gY2FsbHMsIGJ1dCBzaG91bGQgbm90IGJlCisgIC8vIGluY2x1ZGVkIGluIHRoZSBnZW5lcmF0ZWQgRk9PX1NhdmVMaXN0IGFycmF5LiBUaGVzZSByZWdpc3RlcnMgd2lsbCBiZQorICAvLyBpbmNsdWRlZCBpbiB0aGUgRk9PX1JlZ01hc2sgYml0IG1hc2suIFRoaXMgY2FuIGJlIHVzZWQgZm9yIHJlZ2lzdGVycyB0aGF0CisgIC8vIGFyZSBzYXZlZCBhdXRvbWF0aWNhbGx5LCBsaWtlIHRoZSBTUEFSQyByZWdpc3RlciB3aW5kb3dzLgorICBkYWcgT3RoZXJQcmVzZXJ2ZWQ7Cit9CmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRJbnRyaW5zaWNJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRJbnRyaW5zaWNJbmZvLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE5MmJkZQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldEludHJpbnNpY0luZm8uaApAQCAtMCwwICsxLDcwIEBACisvLz09PS0tIGxsdm0vVGFyZ2V0L1RhcmdldEludHJpbnNpY0luZm8uaCAtIEluc3RydWN0aW9uIEluZm8gLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHRhcmdldCBpbnRyaW5zaWMgaW5zdHJ1Y3Rpb25zIHRvIHRoZSBjb2RlIGdlbmVyYXRvci4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVEFSR0VUX1RBUkdFVElOVFJJTlNJQ0lORk9fSAorI2RlZmluZSBMTFZNX1RBUkdFVF9UQVJHRVRJTlRSSU5TSUNJTkZPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgPHN0cmluZz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIFR5cGU7CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLy8KKy8vLyBUYXJnZXRJbnRyaW5zaWNJbmZvIC0gSW50ZXJmYWNlIHRvIGRlc2NyaXB0aW9uIG9mIG1hY2hpbmUgaW5zdHJ1Y3Rpb24gc2V0CisvLy8KK2NsYXNzIFRhcmdldEludHJpbnNpY0luZm8geworICBUYXJnZXRJbnRyaW5zaWNJbmZvKGNvbnN0IFRhcmdldEludHJpbnNpY0luZm8gJikgPSBkZWxldGU7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFRhcmdldEludHJpbnNpY0luZm8gJikgPSBkZWxldGU7CitwdWJsaWM6CisgIFRhcmdldEludHJpbnNpY0luZm8oKTsKKyAgdmlydHVhbCB+VGFyZ2V0SW50cmluc2ljSW5mbygpOworCisgIC8vLyBSZXR1cm4gdGhlIG5hbWUgb2YgYSB0YXJnZXQgaW50cmluc2ljLCBlLmcuICJsbHZtLmJmaW4uc3N5bmMiLgorICAvLy8gVGhlIFR5cyBhbmQgbnVtVHlzIHBhcmFtZXRlcnMgYXJlIGZvciBpbnRyaW5zaWNzIHdpdGggb3ZlcmxvYWRlZCB0eXBlcworICAvLy8gKGUuZy4sIHRob3NlIHVzaW5nIGlBbnkgb3IgZkFueSkuIEZvciBhIGRlY2xhcmF0aW9uIGZvciBhbiBvdmVybG9hZGVkCisgIC8vLyBpbnRyaW5zaWMsIFR5cyBzaG91bGQgcG9pbnQgdG8gYW4gYXJyYXkgb2YgbnVtVHlzIHBvaW50ZXJzIHRvIFR5cGUsCisgIC8vLyBhbmQgbXVzdCBwcm92aWRlIGV4YWN0bHkgb25lIHR5cGUgZm9yIGVhY2ggb3ZlcmxvYWRlZCB0eXBlIGluIHRoZQorICAvLy8gaW50cmluc2ljLgorICB2aXJ0dWFsIHN0ZDo6c3RyaW5nIGdldE5hbWUodW5zaWduZWQgSUlELCBUeXBlICoqVHlzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIG51bVR5cyA9IDApIGNvbnN0ID0gMDsKKworICAvLy8gTG9vayB1cCB0YXJnZXQgaW50cmluc2ljIGJ5IG5hbWUuIFJldHVybiBpbnRyaW5zaWMgSUQgb3IgMCBmb3IgdW5rbm93bgorICAvLy8gbmFtZXMuCisgIHZpcnR1YWwgdW5zaWduZWQgbG9va3VwTmFtZShjb25zdCBjaGFyICpOYW1lLCB1bnNpZ25lZCBMZW4pIGNvbnN0ID0wOworCisgIHVuc2lnbmVkIGxvb2t1cE5hbWUoU3RyaW5nUmVmIE5hbWUpIGNvbnN0IHsKKyAgICByZXR1cm4gbG9va3VwTmFtZShOYW1lLmRhdGEoKSwgTmFtZS5zaXplKCkpOworICB9CisKKyAgLy8vIFJldHVybiB0aGUgdGFyZ2V0IGludHJpbnNpYyBJRCBvZiBhIGZ1bmN0aW9uLCBvciAwLgorICB2aXJ0dWFsIHVuc2lnbmVkIGdldEludHJpbnNpY0lEKGNvbnN0IEZ1bmN0aW9uICpGKSBjb25zdDsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBpbnRyaW5zaWMgY2FuIGJlIG92ZXJsb2FkZWQuCisgIHZpcnR1YWwgYm9vbCBpc092ZXJsb2FkZWQodW5zaWduZWQgSUlEKSBjb25zdCA9IDA7CisKKyAgLy8vIENyZWF0ZSBvciBpbnNlcnQgYW4gTExWTSBGdW5jdGlvbiBkZWNsYXJhdGlvbiBmb3IgYW4gaW50cmluc2ljLAorICAvLy8gYW5kIHJldHVybiBpdC4gVGhlIFR5cyBhbmQgbnVtVHlzIGFyZSBmb3IgaW50cmluc2ljcyB3aXRoIG92ZXJsb2FkZWQKKyAgLy8vIHR5cGVzLiBTZWUgYWJvdmUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCisgIHZpcnR1YWwgRnVuY3Rpb24gKmdldERlY2xhcmF0aW9uKE1vZHVsZSAqTSwgdW5zaWduZWQgSUQsIFR5cGUgKipUeXMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBudW1UeXMgPSAwKSBjb25zdCA9IDA7Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldEl0aW5lcmFyeS50ZCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldEl0aW5lcmFyeS50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODIwNTRkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0SXRpbmVyYXJ5LnRkCkBAIC0wLDAgKzEsMTUyIEBACisvLz09PS0gVGFyZ2V0SXRpbmVyYXJ5LnRkIC0gVGFyZ2V0IEl0aW5pZXJhcnkgRGVzY3JpcHRpb24gLS0qLSB0YWJsZWdlbiAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSB0YXJnZXQtaW5kZXBlbmRlbnQgc2NoZWR1bGluZyBpbnRlcmZhY2VzCisvLyB3aGljaCBzaG91bGQgYmUgaW1wbGVtZW50ZWQgYnkgZWFjaCB0YXJnZXQgdGhhdCB1c2VzIGluc3RydWN0aW9uCisvLyBpdGluZXJhcmllcyBmb3Igc2NoZWR1bGluZy4gSXRpbmVyYXJpZXMgYXJlIGRldGFpbHMgcmVzZXJ2YXRpb24KKy8vIHRhYmxlcyBmb3IgZWFjaCBpbnN0cnVjdGlvbiBjbGFzcy4gVGhleSBhcmUgbW9zdCBhcHByb3ByaWF0ZSBmb3IKKy8vIGluLW9yZGVyIG1hY2hpbmUgd2l0aCBjb21wbGljYXRlZCBzY2hlZHVsaW5nIG9yIGJ1bmRsaW5nIGNvbnN0cmFpbnRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQcm9jZXNzb3IgZnVuY3Rpb25hbCB1bml0IC0gVGhlc2UgdmFsdWVzIHJlcHJlc2VudCB0aGUgZnVuY3Rpb24gdW5pdHMKKy8vIGF2YWlsYWJsZSBhY3Jvc3MgYWxsIGNoaXAgc2V0cyBmb3IgdGhlIHRhcmdldC4gIEVnLiwgSW50VW5pdCwgRlBVbml0LCAuLi4KKy8vIFRoZXNlIG1heSBiZSBpbmRlcGVuZGVudCB2YWx1ZXMgZm9yIGVhY2ggY2hpcCBzZXQgb3IgbWF5IGJlIHNoYXJlZCBhY3Jvc3MKKy8vIGFsbCBjaGlwIHNldHMgb2YgdGhlIHRhcmdldC4gIEVhY2ggZnVuY3Rpb25hbCB1bml0IGlzIHRyZWF0ZWQgYXMgYSByZXNvdXJjZQorLy8gZHVyaW5nIHNjaGVkdWxpbmcgYW5kIGhhcyBhbiBhZmZlY3QgaW5zdHJ1Y3Rpb24gb3JkZXIgYmFzZWQgb24gYXZhaWxhYmlsaXR5CisvLyBkdXJpbmcgYSB0aW1lIGludGVydmFsLgorLy8KK2NsYXNzIEZ1bmNVbml0OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUGlwZWxpbmUgYnlwYXNzIC8gZm9yd2FyZGluZyAtIFRoZXNlIHZhbHVlcyBzcGVjaWZpZXMgdGhlIHN5bWJvbGljIG5hbWVzIG9mCisvLyBwaXBlbGluZSBieXBhc3NlcyB3aGljaCBjYW4gYmUgdXNlZCB0byBmb3J3YXJkIHJlc3VsdHMgb2YgaW5zdHJ1Y3Rpb25zCisvLyB0aGF0IGFyZSBmb3J3YXJkZWQgdG8gdXNlcy4KK2NsYXNzIEJ5cGFzczsKK2RlZiBOb0J5cGFzcyA6IEJ5cGFzczsKKworY2xhc3MgUmVzZXJ2YXRpb25LaW5kPGJpdHM8MT4gdmFsPiB7CisgIGludCBWYWx1ZSA9IHZhbDsKK30KKworZGVmIFJlcXVpcmVkIDogUmVzZXJ2YXRpb25LaW5kPDA+OworZGVmIFJlc2VydmVkIDogUmVzZXJ2YXRpb25LaW5kPDE+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb24gc3RhZ2UgLSBUaGVzZSB2YWx1ZXMgcmVwcmVzZW50IGEgbm9uLXBpcGVsaW5lZCBzdGVwIGluCisvLyB0aGUgZXhlY3V0aW9uIG9mIGFuIGluc3RydWN0aW9uLiAgQ3ljbGVzIHJlcHJlc2VudHMgdGhlIG51bWJlciBvZgorLy8gZGlzY3JldGUgdGltZSBzbG90cyBuZWVkZWQgdG8gY29tcGxldGUgdGhlIHN0YWdlLiAgVW5pdHMgcmVwcmVzZW50CisvLyB0aGUgY2hvaWNlIG9mIGZ1bmN0aW9uYWwgdW5pdHMgdGhhdCBjYW4gYmUgdXNlZCB0byBjb21wbGV0ZSB0aGUKKy8vIHN0YWdlLiAgRWcuIEludFVuaXQxLCBJbnRVbml0Mi4gVGltZUluYyBpbmRpY2F0ZXMgaG93IG1hbnkgY3ljbGVzCisvLyBzaG91bGQgZWxhcHNlIGZyb20gdGhlIHN0YXJ0IG9mIHRoaXMgc3RhZ2UgdG8gdGhlIHN0YXJ0IG9mIHRoZSBuZXh0CisvLyBzdGFnZSBpbiB0aGUgaXRpbmVyYXJ5LiAgRm9yIGV4YW1wbGU6CisvLworLy8gQSBzdGFnZSBpcyBzcGVjaWZpZWQgaW4gb25lIG9mIHR3byB3YXlzOgorLy8KKy8vICAgSW5zdHJTdGFnZTwxLCBbRlVfeCwgRlVfeV0+ICAgICAtIFRpbWVJbmMgZGVmYXVsdHMgdG8gQ3ljbGVzCisvLyAgIEluc3RyU3RhZ2U8MSwgW0ZVX3gsIEZVX3ldLCAwPiAgLSBUaW1lSW5jIGV4cGxpY2l0CisvLworCitjbGFzcyBJbnN0clN0YWdlPGludCBjeWNsZXMsIGxpc3Q8RnVuY1VuaXQ+IHVuaXRzLAorICAgICAgICAgICAgICAgICBpbnQgdGltZWluYyA9IC0xLAorICAgICAgICAgICAgICAgICBSZXNlcnZhdGlvbktpbmQga2luZCA9IFJlcXVpcmVkPiB7CisgIGludCBDeWNsZXMgICAgICAgICAgPSBjeWNsZXM7ICAgICAgIC8vIGxlbmd0aCBvZiBzdGFnZSBpbiBtYWNoaW5lIGN5Y2xlcworICBsaXN0PEZ1bmNVbml0PiBVbml0cyA9IHVuaXRzOyAgICAgICAvLyBjaG9pY2Ugb2YgZnVuY3Rpb25hbCB1bml0cworICBpbnQgVGltZUluYyAgICAgICAgID0gdGltZWluYzsgICAgICAvLyBjeWNsZXMgdGlsbCBzdGFydCBvZiBuZXh0IHN0YWdlCisgIGludCBLaW5kICAgICAgICAgICAgPSBraW5kLlZhbHVlOyAgIC8vIGtpbmQgb2YgRlUgcmVzZXJ2YXRpb24KK30KKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIEluc3RydWN0aW9uIGl0aW5lcmFyeSAtIEFuIGl0aW5lcmFyeSByZXByZXNlbnRzIGEgc2VxdWVudGlhbCBzZXJpZXMgb2Ygc3RlcHMKKy8vIHJlcXVpcmVkIHRvIGNvbXBsZXRlIGFuIGluc3RydWN0aW9uLiAgSXRpbmVyYXJpZXMgYXJlIHJlcHJlc2VudGVkIGFzIGxpc3RzIG9mCisvLyBpbnN0cnVjdGlvbiBzdGFnZXMuCisvLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb24gaXRpbmVyYXJ5IGNsYXNzZXMgLSBUaGVzZSB2YWx1ZXMgcmVwcmVzZW50ICduYW1lZCcgaW5zdHJ1Y3Rpb24KKy8vIGl0aW5lcmFyeS4gIFVzaW5nIG5hbWVkIGl0aW5lcmFyaWVzIHNpbXBsaWZpZXMgbWFuYWdpbmcgZ3JvdXBzIG9mCisvLyBpbnN0cnVjdGlvbnMgYWNyb3NzIGNoaXAgc2V0cy4gIEFuIGluc3RydWN0aW9uIHVzZXMgdGhlIHNhbWUgaXRpbmVyYXJ5IGNsYXNzCisvLyBhY3Jvc3MgYWxsIGNoaXAgc2V0cy4gIFRodXMgYSBuZXcgY2hpcCBzZXQgY2FuIGJlIGFkZGVkIHdpdGhvdXQgbW9kaWZ5aW5nCisvLyBpbnN0cnVjdGlvbiBpbmZvcm1hdGlvbi4KKy8vCitjbGFzcyBJbnN0ckl0aW5DbGFzczsKK2RlZiBOb0l0aW5lcmFyeSA6IEluc3RySXRpbkNsYXNzOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gSW5zdHJ1Y3Rpb24gaXRpbmVyYXJ5IGRhdGEgLSBUaGVzZSB2YWx1ZXMgcHJvdmlkZSBhIHJ1bnRpbWUgbWFwIG9mIGFuCisvLyBpbnN0cnVjdGlvbiBpdGluZXJhcnkgY2xhc3MgKG5hbWUpIHRvIGl0cyBpdGluZXJhcnkgZGF0YS4KKy8vCisvLyBOdW1NaWNyb09wcyByZXByZXNlbnRzIHRoZSBudW1iZXIgb2YgbWljcm8tb3BlcmF0aW9ucyB0aGF0IGVhY2ggaW5zdHJ1Y3Rpb24KKy8vIGluIHRoZSBjbGFzcyBhcmUgZGVjb2RlZCB0by4gSWYgdGhlIG51bWJlciBpcyB6ZXJvLCB0aGVuIGl0IG1lYW5zIHRoZQorLy8gaW5zdHJ1Y3Rpb24gY2FuIGRlY29kZSBpbnRvIHZhcmlhYmxlIG51bWJlciBvZiBtaWNyby1vcHMgYW5kIGl0IG11c3QgYmUKKy8vIGRldGVybWluZWQgZHluYW1pY2FsbHkuIFRoaXMgZGlyZWN0bHkgcmVsYXRlcyB0byB0aGUgaXRpbmVyYXJpZXMKKy8vIGdsb2JhbCBJc3N1ZVdpZHRoIHByb3BlcnR5LCB3aGljaCBjb25zdHJhaW5zIHRoZSBudW1iZXIgb2YgbWljcm9vcHMKKy8vIHRoYXQgY2FuIGlzc3VlIHBlciBjeWNsZS4KKy8vCisvLyBPcGVyYW5kQ3ljbGVzIGFyZSBvcHRpb25hbCAiY3ljbGUgY291bnRzIi4gVGhleSBzcGVjaWZ5IHRoZSBjeWNsZSBhZnRlcgorLy8gaW5zdHJ1Y3Rpb24gaXNzdWUgdGhlIHZhbHVlcyB3aGljaCBjb3JyZXNwb25kIHRvIHNwZWNpZmljIG9wZXJhbmQgaW5kaWNlcworLy8gYXJlIGRlZmluZWQgb3IgcmVhZC4gQnlwYXNzZXMgYXJlIG9wdGlvbmFsICJwaXBlbGluZSBmb3J3YXJkaW5nIHBhdGhzIiwgaWYKKy8vIGEgZGVmIGJ5IGFuIGluc3RydWN0aW9uIGlzIGF2YWlsYWJsZSBvbiBhIHNwZWNpZmljIGJ5cGFzcyBhbmQgdGhlIHVzZSBjYW4KKy8vIHJlYWQgZnJvbSB0aGUgc2FtZSBieXBhc3MsIHRoZW4gdGhlIG9wZXJhbmQgdXNlIGxhdGVuY3kgaXMgcmVkdWNlZCBieSBvbmUuCisvLworLy8gIEluc3RySXRpbkRhdGE8SUlDX2lMb2FkX2kgLCBbSW5zdHJTdGFnZTwxLCBbQTlfUGlwZTFdPiwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RyU3RhZ2U8MSwgW0E5X0FHVV0+XSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzMsIDFdLCBbQTlfTGRCeXBhc3NdPiwKKy8vICBJbnN0ckl0aW5EYXRhPElJQ19pTVZOciAgICwgW0luc3RyU3RhZ2U8MSwgW0E5X1BpcGUwLCBBOV9QaXBlMV0+XSwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzEsIDFdLCBbTm9CeXBhc3MsIEE5X0xkQnlwYXNzXT4sCisvLworLy8gSW4gdGhpcyBleGFtcGxlLCB0aGUgaW5zdHJ1Y3Rpb24gb2YgSUlDX2lMb2FkaSByZWFkcyBpdHMgaW5wdXQgb24gY3ljbGUgMQorLy8gKGFmdGVyIGlzc3VlKSBhbmQgdGhlIHJlc3VsdCBvZiB0aGUgbG9hZCBpcyBhdmFpbGFibGUgb24gY3ljbGUgMy4gVGhlIHJlc3VsdAorLy8gaXMgYXZhaWxhYmxlIHZpYSBmb3J3YXJkaW5nIHBhdGggQTlfTGRCeXBhc3MuIElmIGl0J3MgdXNlZCBieSB0aGUgZmlyc3QKKy8vIHNvdXJjZSBvcGVyYW5kIG9mIGluc3RydWN0aW9ucyBvZiBJSUNfaU1WTnIgY2xhc3MsIHRoZW4gdGhlIG9wZXJhbmQgbGF0ZW5jeQorLy8gaXMgcmVkdWNlZCBieSAxLgorY2xhc3MgSW5zdHJJdGluRGF0YTxJbnN0ckl0aW5DbGFzcyBDbGFzcywgbGlzdDxJbnN0clN0YWdlPiBzdGFnZXMsCisgICAgICAgICAgICAgICAgICAgIGxpc3Q8aW50PiBvcGVyYW5kY3ljbGVzID0gW10sCisgICAgICAgICAgICAgICAgICAgIGxpc3Q8QnlwYXNzPiBieXBhc3NlcyA9IFtdLCBpbnQgdW9wcyA9IDE+IHsKKyAgSW5zdHJJdGluQ2xhc3MgVGhlQ2xhc3MgPSBDbGFzczsKKyAgaW50IE51bU1pY3JvT3BzID0gdW9wczsKKyAgbGlzdDxJbnN0clN0YWdlPiBTdGFnZXMgPSBzdGFnZXM7CisgIGxpc3Q8aW50PiBPcGVyYW5kQ3ljbGVzID0gb3BlcmFuZGN5Y2xlczsKKyAgbGlzdDxCeXBhc3M+IEJ5cGFzc2VzID0gYnlwYXNzZXM7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBQcm9jZXNzb3IgaXRpbmVyYXJpZXMgLSBUaGVzZSB2YWx1ZXMgcmVwcmVzZW50IHRoZSBzZXQgb2YgYWxsIGl0aW5lcmFyeQorLy8gY2xhc3NlcyBmb3IgYSBnaXZlbiBjaGlwIHNldC4KKy8vCisvLyBTZXQgcHJvcGVydHkgdmFsdWVzIHRvIC0xIHRvIHVzZSB0aGUgZGVmYXVsdC4KKy8vIFNlZSBJbnN0ckl0aW5lcmFyeVByb3BzIGZvciBjb21tZW50cyBhbmQgZGVmYXVsdHMuCitjbGFzcyBQcm9jZXNzb3JJdGluZXJhcmllczxsaXN0PEZ1bmNVbml0PiBmdSwgbGlzdDxCeXBhc3M+IGJwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdDxJbnN0ckl0aW5EYXRhPiBpaWQ+IHsKKyAgbGlzdDxGdW5jVW5pdD4gRlUgPSBmdTsKKyAgbGlzdDxCeXBhc3M+IEJQID0gYnA7CisgIGxpc3Q8SW5zdHJJdGluRGF0YT4gSUlEID0gaWlkOworfQorCisvLyBOb0l0aW5lcmFyaWVzIC0gQSBtYXJrZXIgdGhhdCBjYW4gYmUgdXNlZCBieSBwcm9jZXNzb3JzIHdpdGhvdXQgc2NoZWR1bGUKKy8vIGluZm8uIFN1YnRhcmdldHMgdXNpbmcgTm9JdGluZXJhcmllcyBjYW4gYnlwYXNzIHRoZSBzY2hlZHVsZXIncworLy8gZXhwZW5zaXZlIEhhemFyZFJlY29nbml6ZXIgYmVjYXVzZSBubyByZXNlcnZhdGlvbiB0YWJsZSBpcyBuZWVkZWQuCitkZWYgTm9JdGluZXJhcmllcyA6IFByb2Nlc3Nvckl0aW5lcmFyaWVzPFtdLCBbXSwgW10+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ29tYm8gRnVuY3Rpb24gVW5pdCBkYXRhIC0gVGhpcyBpcyBhIG1hcCBvZiBjb21ibyBmdW5jdGlvbiB1bml0IG5hbWVzIHRvCisvLyB0aGUgbGlzdCBvZiBmdW5jdGlvbmFsIHVuaXRzIHRoYXQgYXJlIGluY2x1ZGVkIGluIHRoZSBjb21iaW5hdGlvbi4KKy8vCitjbGFzcyBDb21ib0Z1bmNEYXRhPEZ1bmNVbml0IENvbWJvRnVuYywgbGlzdDxGdW5jVW5pdD4gZnVuY2xpc3Q+IHsKKyAgRnVuY1VuaXQgVGhlQ29tYm9GdW5jID0gQ29tYm9GdW5jOworICBsaXN0PEZ1bmNVbml0PiBGdW5jTGlzdCA9IGZ1bmNsaXN0OworfQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ29tYm8gRnVuY3Rpb24gVW5pdHMgLSBUaGlzIGlzIGEgbGlzdCBvZiBhbGwgY29tYm8gZnVuY3Rpb24gdW5pdCBkYXRhLgorY2xhc3MgQ29tYm9GdW5jVW5pdHM8bGlzdDxDb21ib0Z1bmNEYXRhPiBjZmQ+IHsKKyAgbGlzdDxDb21ib0Z1bmNEYXRhPiBDRkQgPSBjZmQ7Cit9CisKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nT2JqZWN0RmlsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDVhYzNjZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nT2JqZWN0RmlsZS5oCkBAIC0wLDAgKzEsMTk3IEBACisvLz09PS0tIGxsdm0vVGFyZ2V0L1RhcmdldExvd2VyaW5nT2JqZWN0RmlsZS5oIC0gT2JqZWN0IEluZm8gLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGNsYXNzZXMgdXNlZCB0byBoYW5kbGUgbG93ZXJpbmdzIHNwZWNpZmljIHRvIGNvbW1vbgorLy8gb2JqZWN0IGZpbGUgZm9ybWF0cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fQ09ERUdFTl9UQVJHRVRMT1dFUklOR09CSkVDVEZJTEVfSAorI2RlZmluZSBMTFZNX0NPREVHRU5fVEFSR0VUTE9XRVJJTkdPQkpFQ1RGSUxFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL01DL01DT2JqZWN0RmlsZUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL01DL1NlY3Rpb25LaW5kLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBHbG9iYWxWYWx1ZTsKK2NsYXNzIE1hY2hpbmVNb2R1bGVJbmZvOworY2xhc3MgTWFuZ2xlcjsKK2NsYXNzIE1DQ29udGV4dDsKK2NsYXNzIE1DRXhwcjsKK2NsYXNzIE1DU2VjdGlvbjsKK2NsYXNzIE1DU3ltYm9sOworY2xhc3MgTUNTeW1ib2xSZWZFeHByOworY2xhc3MgTUNTdHJlYW1lcjsKK2NsYXNzIE1DVmFsdWU7CitjbGFzcyBUYXJnZXRNYWNoaW5lOworCitjbGFzcyBUYXJnZXRMb3dlcmluZ09iamVjdEZpbGUgOiBwdWJsaWMgTUNPYmplY3RGaWxlSW5mbyB7CisgIE1DQ29udGV4dCAqQ3R4ID0gbnVsbHB0cjsKKworICAvLy8gTmFtZS1tYW5nbGVyIGZvciBnbG9iYWwgbmFtZXMuCisgIE1hbmdsZXIgKk1hbmcgPSBudWxscHRyOworCitwcm90ZWN0ZWQ6CisgIGJvb2wgU3VwcG9ydEluZGlyZWN0U3ltVmlhR09UUENSZWwgPSBmYWxzZTsKKyAgYm9vbCBTdXBwb3J0R09UUENSZWxXaXRoT2Zmc2V0ID0gdHJ1ZTsKKworICAvLy8gVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBzdGF0aWMgY29uc3RydWN0b3IgcG9pbnRlciBsaXN0LgorICBNQ1NlY3Rpb24gKlN0YXRpY0N0b3JTZWN0aW9uID0gbnVsbHB0cjsKKworICAvLy8gVGhpcyBzZWN0aW9uIGNvbnRhaW5zIHRoZSBzdGF0aWMgZGVzdHJ1Y3RvciBwb2ludGVyIGxpc3QuCisgIE1DU2VjdGlvbiAqU3RhdGljRHRvclNlY3Rpb24gPSBudWxscHRyOworCitwdWJsaWM6CisgIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZSgpID0gZGVmYXVsdDsKKyAgVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlKGNvbnN0IFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZSAmKSA9IGRlbGV0ZTsKKyAgVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlICYKKyAgb3BlcmF0b3I9KGNvbnN0IFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZSAmKSA9IGRlbGV0ZTsKKyAgdmlydHVhbCB+VGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlKCk7CisKKyAgTUNDb250ZXh0ICZnZXRDb250ZXh0KCkgY29uc3QgeyByZXR1cm4gKkN0eDsgfQorICBNYW5nbGVyICZnZXRNYW5nbGVyKCkgY29uc3QgeyByZXR1cm4gKk1hbmc7IH0KKworICAvLy8gVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYmVmb3JlIGFueSBhY3R1YWwgbG93ZXJpbmcgaXMgZG9uZS4gIFRoaXMKKyAgLy8vIHNwZWNpZmllcyB0aGUgY3VycmVudCBjb250ZXh0IGZvciBjb2RlZ2VuLCBhbmQgZ2l2ZXMgdGhlIGxvd2VyaW5nCisgIC8vLyBpbXBsZW1lbnRhdGlvbnMgYSBjaGFuY2UgdG8gc2V0IHVwIHRoZWlyIGRlZmF1bHQgc2VjdGlvbnMuCisgIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKE1DQ29udGV4dCAmY3R4LCBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSk7CisKKyAgdmlydHVhbCB2b2lkIGVtaXRQZXJzb25hbGl0eVZhbHVlKE1DU3RyZWFtZXIgJlN0cmVhbWVyLCBjb25zdCBEYXRhTGF5b3V0ICZUTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICpTeW0pIGNvbnN0OworCisgIC8vLyBFbWl0IHRoZSBtb2R1bGUtbGV2ZWwgbWV0YWRhdGEgdGhhdCB0aGUgcGxhdGZvcm0gY2FyZXMgYWJvdXQuCisgIHZpcnR1YWwgdm9pZCBlbWl0TW9kdWxlTWV0YWRhdGEoTUNTdHJlYW1lciAmU3RyZWFtZXIsIE1vZHVsZSAmTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSkgY29uc3Qge30KKworICAvLy8gR2l2ZW4gYSBjb25zdGFudCB3aXRoIHRoZSBTZWN0aW9uS2luZCwgcmV0dXJuIGEgc2VjdGlvbiB0aGF0IGl0IHNob3VsZCBiZQorICAvLy8gcGxhY2VkIGluLgorICB2aXJ0dWFsIE1DU2VjdGlvbiAqZ2V0U2VjdGlvbkZvckNvbnN0YW50KGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlY3Rpb25LaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ29uc3RhbnQgKkMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgJkFsaWduKSBjb25zdDsKKworICAvLy8gQ2xhc3NpZnkgdGhlIHNwZWNpZmllZCBnbG9iYWwgdmFyaWFibGUgaW50byBhIHNldCBvZiB0YXJnZXQgaW5kZXBlbmRlbnQKKyAgLy8vIGNhdGVnb3JpZXMgZW1ib2RpZWQgaW4gU2VjdGlvbktpbmQuCisgIHN0YXRpYyBTZWN0aW9uS2luZCBnZXRLaW5kRm9yR2xvYmFsKGNvbnN0IEdsb2JhbE9iamVjdCAqR08sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKTsKKworICAvLy8gVGhpcyBtZXRob2QgY29tcHV0ZXMgdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb24gdG8gZW1pdCB0aGUgc3BlY2lmaWVkIGdsb2JhbAorICAvLy8gdmFyaWFibGUgb3IgZnVuY3Rpb24gZGVmaW5pdGlvbi4gVGhpcyBzaG91bGQgbm90IGJlIHBhc3NlZCBleHRlcm5hbCAob3IKKyAgLy8vIGF2YWlsYWJsZSBleHRlcm5hbGx5KSBnbG9iYWxzLgorICBNQ1NlY3Rpb24gKlNlY3Rpb25Gb3JHbG9iYWwoY29uc3QgR2xvYmFsT2JqZWN0ICpHTywgU2VjdGlvbktpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBjb25zdDsKKworICAvLy8gVGhpcyBtZXRob2QgY29tcHV0ZXMgdGhlIGFwcHJvcHJpYXRlIHNlY3Rpb24gdG8gZW1pdCB0aGUgc3BlY2lmaWVkIGdsb2JhbAorICAvLy8gdmFyaWFibGUgb3IgZnVuY3Rpb24gZGVmaW5pdGlvbi4gVGhpcyBzaG91bGQgbm90IGJlIHBhc3NlZCBleHRlcm5hbCAob3IKKyAgLy8vIGF2YWlsYWJsZSBleHRlcm5hbGx5KSBnbG9iYWxzLgorICBNQ1NlY3Rpb24gKlNlY3Rpb25Gb3JHbG9iYWwoY29uc3QgR2xvYmFsT2JqZWN0ICpHTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBjb25zdCB7CisgICAgcmV0dXJuIFNlY3Rpb25Gb3JHbG9iYWwoR08sIGdldEtpbmRGb3JHbG9iYWwoR08sIFRNKSwgVE0pOworICB9CisKKyAgdmlydHVhbCB2b2lkIGdldE5hbWVXaXRoUHJlZml4KFNtYWxsVmVjdG9ySW1wbDxjaGFyPiAmT3V0TmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdsb2JhbFZhbHVlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBjb25zdDsKKworICB2aXJ0dWFsIE1DU2VjdGlvbiAqZ2V0U2VjdGlvbkZvckp1bXBUYWJsZShjb25zdCBGdW5jdGlvbiAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0OworCisgIHZpcnR1YWwgYm9vbCBzaG91bGRQdXRKdW1wVGFibGVJbkZ1bmN0aW9uU2VjdGlvbihib29sIFVzZXNMYWJlbERpZmZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbiAmRikgY29uc3Q7CisKKyAgLy8vIFRhcmdldHMgc2hvdWxkIGltcGxlbWVudCB0aGlzIG1ldGhvZCB0byBhc3NpZ24gYSBzZWN0aW9uIHRvIGdsb2JhbHMgd2l0aAorICAvLy8gYW4gZXhwbGljaXQgc2VjdGlvbiBzcGVjZmllZC4gVGhlIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgbWV0aG9kIGNhbgorICAvLy8gYXNzdW1lIHRoYXQgR08tPmhhc1NlY3Rpb24oKSBpcyB0cnVlLgorICB2aXJ0dWFsIE1DU2VjdGlvbiAqCisgIGdldEV4cGxpY2l0U2VjdGlvbkdsb2JhbChjb25zdCBHbG9iYWxPYmplY3QgKkdPLCBTZWN0aW9uS2luZCBLaW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0ID0gMDsKKworICAvLy8gUmV0dXJuIGFuIE1DRXhwciB0byB1c2UgZm9yIGEgcmVmZXJlbmNlIHRvIHRoZSBzcGVjaWZpZWQgZ2xvYmFsIHZhcmlhYmxlCisgIC8vLyBmcm9tIGV4Y2VwdGlvbiBoYW5kbGluZyBpbmZvcm1hdGlvbi4KKyAgdmlydHVhbCBjb25zdCBNQ0V4cHIgKmdldFRUeXBlR2xvYmFsUmVmZXJlbmNlKGNvbnN0IEdsb2JhbFZhbHVlICpHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEVuY29kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYWNoaW5lTW9kdWxlSW5mbyAqTU1JLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTdHJlYW1lciAmU3RyZWFtZXIpIGNvbnN0OworCisgIC8vLyBSZXR1cm4gdGhlIE1DU3ltYm9sIGZvciBhIHByaXZhdGUgc3ltYm9sIHdpdGggZ2xvYmFsIHZhbHVlIG5hbWUgYXMgaXRzCisgIC8vLyBiYXNlLCB3aXRoIHRoZSBzcGVjaWZpZWQgc3VmZml4LgorICBNQ1N5bWJvbCAqZ2V0U3ltYm9sV2l0aEdsb2JhbFZhbHVlQmFzZShjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE1hY2hpbmUgJlRNKSBjb25zdDsKKworICAvLyBUaGUgc3ltYm9sIHRoYXQgZ2V0cyBwYXNzZWQgdG8gLmNmaV9wZXJzb25hbGl0eS4KKyAgdmlydHVhbCBNQ1N5bWJvbCAqZ2V0Q0ZJUGVyc29uYWxpdHlTeW1ib2woY29uc3QgR2xvYmFsVmFsdWUgKkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRNYWNoaW5lICZUTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWFjaGluZU1vZHVsZUluZm8gKk1NSSkgY29uc3Q7CisKKyAgY29uc3QgTUNFeHByICpnZXRUVHlwZVJlZmVyZW5jZShjb25zdCBNQ1N5bWJvbFJlZkV4cHIgKlN5bSwgdW5zaWduZWQgRW5jb2RpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUNTdHJlYW1lciAmU3RyZWFtZXIpIGNvbnN0OworCisgIHZpcnR1YWwgTUNTZWN0aW9uICpnZXRTdGF0aWNDdG9yU2VjdGlvbih1bnNpZ25lZCBQcmlvcml0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1DU3ltYm9sICpLZXlTeW0pIGNvbnN0IHsKKyAgICByZXR1cm4gU3RhdGljQ3RvclNlY3Rpb247CisgIH0KKworICB2aXJ0dWFsIE1DU2VjdGlvbiAqZ2V0U3RhdGljRHRvclNlY3Rpb24odW5zaWduZWQgUHJpb3JpdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1N5bWJvbCAqS2V5U3ltKSBjb25zdCB7CisgICAgcmV0dXJuIFN0YXRpY0R0b3JTZWN0aW9uOworICB9CisKKyAgLy8vIFxicmllZiBDcmVhdGUgYSBzeW1ib2wgcmVmZXJlbmNlIHRvIGRlc2NyaWJlIHRoZSBnaXZlbiBUTFMgdmFyaWFibGUgd2hlbgorICAvLy8gZW1pdHRpbmcgdGhlIGFkZHJlc3MgaW4gZGVidWcgaW5mby4KKyAgdmlydHVhbCBjb25zdCBNQ0V4cHIgKmdldERlYnVnVGhyZWFkTG9jYWxTeW1ib2woY29uc3QgTUNTeW1ib2wgKlN5bSkgY29uc3Q7CisKKyAgdmlydHVhbCBjb25zdCBNQ0V4cHIgKmxvd2VyUmVsYXRpdmVSZWZlcmVuY2UoY29uc3QgR2xvYmFsVmFsdWUgKkxIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR2xvYmFsVmFsdWUgKlJIUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0IHsKKyAgICByZXR1cm4gbnVsbHB0cjsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGFyZ2V0IHN1cHBvcnRzIHJlcGxhY2luZyBhIGRhdGEgIlBDIi1yZWxhdGl2ZSBhY2Nlc3MgdG8gYSBzeW1ib2wKKyAgLy8vIHRocm91Z2ggYW5vdGhlciBzeW1ib2wsIGJ5IGFjY2Vzc2luZyB0aGUgbGF0ZXIgdmlhIGEgR09UIGVudHJ5IGluc3RlYWQ/CisgIGJvb2wgc3VwcG9ydEluZGlyZWN0U3ltVmlhR09UUENSZWwoKSBjb25zdCB7CisgICAgcmV0dXJuIFN1cHBvcnRJbmRpcmVjdFN5bVZpYUdPVFBDUmVsOworICB9CisKKyAgLy8vIFxicmllZiBUYXJnZXQgR09UICJQQyItcmVsYXRpdmUgcmVsb2NhdGlvbiBzdXBwb3J0cyBlbmNvZGluZyBhbiBhZGRpdGlvbmFsCisgIC8vLyBiaW5hcnkgZXhwcmVzc2lvbiB3aXRoIGFuIG9mZnNldD8KKyAgYm9vbCBzdXBwb3J0R09UUENSZWxXaXRoT2Zmc2V0KCkgY29uc3QgeworICAgIHJldHVybiBTdXBwb3J0R09UUENSZWxXaXRoT2Zmc2V0OworICB9CisKKyAgLy8vIFxicmllZiBHZXQgdGhlIHRhcmdldCBzcGVjaWZpYyBQQyByZWxhdGl2ZSBHT1QgZW50cnkgcmVsb2NhdGlvbgorICB2aXJ0dWFsIGNvbnN0IE1DRXhwciAqZ2V0SW5kaXJlY3RTeW1WaWFHT1RQQ1JlbChjb25zdCBNQ1N5bWJvbCAqU3ltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNQ1ZhbHVlICZNViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNb2R1bGVJbmZvICpNTUksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1DU3RyZWFtZXIgJlN0cmVhbWVyKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICB2aXJ0dWFsIHZvaWQgZW1pdExpbmtlckZsYWdzRm9yR2xvYmFsKHJhd19vc3RyZWFtICZPUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YpIGNvbnN0IHt9CisKKyAgdmlydHVhbCB2b2lkIGVtaXRMaW5rZXJGbGFnc0ZvclVzZWQocmF3X29zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHbG9iYWxWYWx1ZSAqR1YpIGNvbnN0IHt9CisKK3Byb3RlY3RlZDoKKyAgdmlydHVhbCBNQ1NlY3Rpb24gKlNlbGVjdFNlY3Rpb25Gb3JHbG9iYWwoY29uc3QgR2xvYmFsT2JqZWN0ICpHTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VjdGlvbktpbmQgS2luZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TWFjaGluZSAmVE0pIGNvbnN0ID0gMDsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX0NPREVHRU5fVEFSR0VUTE9XRVJJTkdPQkpFQ1RGSUxFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjVkODZlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0TWFjaGluZS5oCkBAIC0wLDAgKzEsMzQ5IEBACisvLz09PS0tIGxsdm0vVGFyZ2V0L1RhcmdldE1hY2hpbmUuaCAtIFRhcmdldCBJbmZvcm1hdGlvbiAtLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBUYXJnZXRNYWNoaW5lIGFuZCBMTFZNVGFyZ2V0TWFjaGluZSBjbGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQVJHRVRfVEFSR0VUTUFDSElORV9ICisjZGVmaW5lIExMVk1fVEFSR0VUX1RBUkdFVE1BQ0hJTkVfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvVHJpcGxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9EYXRhTGF5b3V0LmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvZGVHZW4uaCIKKyNpbmNsdWRlICJsbHZtL1RhcmdldC9UYXJnZXRPcHRpb25zLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBNYWNoaW5lTW9kdWxlSW5mbzsKK2NsYXNzIE1hbmdsZXI7CitjbGFzcyBNQ0FzbUluZm87CitjbGFzcyBNQ0NvbnRleHQ7CitjbGFzcyBNQ0luc3RySW5mbzsKK2NsYXNzIE1DUmVnaXN0ZXJJbmZvOworY2xhc3MgTUNTdWJ0YXJnZXRJbmZvOworY2xhc3MgTUNTeW1ib2w7CitjbGFzcyByYXdfcHdyaXRlX3N0cmVhbTsKK2NsYXNzIFBhc3NNYW5hZ2VyQnVpbGRlcjsKK2NsYXNzIFRhcmdldDsKK2NsYXNzIFRhcmdldEludHJpbnNpY0luZm87CitjbGFzcyBUYXJnZXRJUkFuYWx5c2lzOworY2xhc3MgVGFyZ2V0VHJhbnNmb3JtSW5mbzsKK2NsYXNzIFRhcmdldExvd2VyaW5nT2JqZWN0RmlsZTsKK2NsYXNzIFRhcmdldFBhc3NDb25maWc7CitjbGFzcyBUYXJnZXRTdWJ0YXJnZXRJbmZvOworCisvLyBUaGUgb2xkIHBhc3MgbWFuYWdlciBpbmZyYXN0cnVjdHVyZSBpcyBoaWRkZW4gaW4gYSBsZWdhY3kgbmFtZXNwYWNlIG5vdy4KK25hbWVzcGFjZSBsZWdhY3kgeworY2xhc3MgUGFzc01hbmFnZXJCYXNlOworfQordXNpbmcgbGVnYWN5OjpQYXNzTWFuYWdlckJhc2U7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8KKy8vLyBQcmltYXJ5IGludGVyZmFjZSB0byB0aGUgY29tcGxldGUgbWFjaGluZSBkZXNjcmlwdGlvbiBmb3IgdGhlIHRhcmdldAorLy8vIG1hY2hpbmUuICBBbGwgdGFyZ2V0LXNwZWNpZmljIGluZm9ybWF0aW9uIHNob3VsZCBiZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhpcworLy8vIGludGVyZmFjZS4KKy8vLworY2xhc3MgVGFyZ2V0TWFjaGluZSB7Citwcm90ZWN0ZWQ6IC8vIENhbiBvbmx5IGNyZWF0ZSBzdWJjbGFzc2VzLgorICBUYXJnZXRNYWNoaW5lKGNvbnN0IFRhcmdldCAmVCwgU3RyaW5nUmVmIERhdGFMYXlvdXRTdHJpbmcsCisgICAgICAgICAgICAgICAgY29uc3QgVHJpcGxlICZUYXJnZXRUcmlwbGUsIFN0cmluZ1JlZiBDUFUsIFN0cmluZ1JlZiBGUywKKyAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRPcHRpb25zICZPcHRpb25zKTsKKworICAvLy8gVGhlIFRhcmdldCB0aGF0IHRoaXMgbWFjaGluZSB3YXMgY3JlYXRlZCBmb3IuCisgIGNvbnN0IFRhcmdldCAmVGhlVGFyZ2V0OworCisgIC8vLyBEYXRhTGF5b3V0IGZvciB0aGUgdGFyZ2V0OiBrZWVwIEFCSSB0eXBlIHNpemUgYW5kIGFsaWdubWVudC4KKyAgLy8vCisgIC8vLyBUaGUgRGF0YUxheW91dCBpcyBjcmVhdGVkIGJhc2VkIG9uIHRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gcHJvdmlkZWQKKyAgLy8vIGR1cmluZyBjb25zdHJ1Y3Rpb24uIEl0IGlzIGtlcHQgaGVyZSBvbmx5IHRvIGF2b2lkIHJlcGFyc2luZyB0aGUgc3RyaW5nCisgIC8vLyBidXQgc2hvdWxkIG5vdCByZWFsbHkgYmUgdXNlZCBkdXJpbmcgY29tcGlsYXRpb24sIGJlY2F1c2UgaXQgaGFzIGFuCisgIC8vLyBpbnRlcm5hbCBjYWNoZSB0aGF0IGlzIGNvbnRleHQgc3BlY2lmaWMuCisgIGNvbnN0IERhdGFMYXlvdXQgREw7CisKKyAgLy8vIFRyaXBsZSBzdHJpbmcsIENQVSBuYW1lLCBhbmQgdGFyZ2V0IGZlYXR1cmUgc3RyaW5ncyB0aGUgVGFyZ2V0TWFjaGluZQorICAvLy8gaW5zdGFuY2UgaXMgY3JlYXRlZCB3aXRoLgorICBUcmlwbGUgVGFyZ2V0VHJpcGxlOworICBzdGQ6OnN0cmluZyBUYXJnZXRDUFU7CisgIHN0ZDo6c3RyaW5nIFRhcmdldEZTOworCisgIFJlbG9jOjpNb2RlbCBSTSA9IFJlbG9jOjpTdGF0aWM7CisgIENvZGVNb2RlbDo6TW9kZWwgQ01Nb2RlbCA9IENvZGVNb2RlbDo6U21hbGw7CisgIENvZGVHZW5PcHQ6OkxldmVsIE9wdExldmVsID0gQ29kZUdlbk9wdDo6RGVmYXVsdDsKKworICAvLy8gQ29udGFpbnMgdGFyZ2V0IHNwZWNpZmljIGFzbSBpbmZvcm1hdGlvbi4KKyAgY29uc3QgTUNBc21JbmZvICpBc21JbmZvOworCisgIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICpNUkk7CisgIGNvbnN0IE1DSW5zdHJJbmZvICpNSUk7CisgIGNvbnN0IE1DU3VidGFyZ2V0SW5mbyAqU1RJOworCisgIHVuc2lnbmVkIFJlcXVpcmVTdHJ1Y3R1cmVkQ0ZHIDogMTsKKyAgdW5zaWduZWQgTzBXYW50c0Zhc3RJU2VsIDogMTsKKworcHVibGljOgorICBjb25zdCBUYXJnZXRPcHRpb25zIERlZmF1bHRPcHRpb25zOworICBtdXRhYmxlIFRhcmdldE9wdGlvbnMgT3B0aW9uczsKKworICBUYXJnZXRNYWNoaW5lKGNvbnN0IFRhcmdldE1hY2hpbmUgJikgPSBkZWxldGU7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFRhcmdldE1hY2hpbmUgJikgPSBkZWxldGU7CisgIHZpcnR1YWwgflRhcmdldE1hY2hpbmUoKTsKKworICBjb25zdCBUYXJnZXQgJmdldFRhcmdldCgpIGNvbnN0IHsgcmV0dXJuIFRoZVRhcmdldDsgfQorCisgIGNvbnN0IFRyaXBsZSAmZ2V0VGFyZ2V0VHJpcGxlKCkgY29uc3QgeyByZXR1cm4gVGFyZ2V0VHJpcGxlOyB9CisgIFN0cmluZ1JlZiBnZXRUYXJnZXRDUFUoKSBjb25zdCB7IHJldHVybiBUYXJnZXRDUFU7IH0KKyAgU3RyaW5nUmVmIGdldFRhcmdldEZlYXR1cmVTdHJpbmcoKSBjb25zdCB7IHJldHVybiBUYXJnZXRGUzsgfQorCisgIC8vLyBWaXJ0dWFsIG1ldGhvZCBpbXBsZW1lbnRlZCBieSBzdWJjbGFzc2VzIHRoYXQgcmV0dXJucyBhIHJlZmVyZW5jZSB0byB0aGF0CisgIC8vLyB0YXJnZXQncyBUYXJnZXRTdWJ0YXJnZXRJbmZvLWRlcml2ZWQgbWVtYmVyIHZhcmlhYmxlLgorICB2aXJ0dWFsIGNvbnN0IFRhcmdldFN1YnRhcmdldEluZm8gKmdldFN1YnRhcmdldEltcGwoY29uc3QgRnVuY3Rpb24gJikgY29uc3QgeworICAgIHJldHVybiBudWxscHRyOworICB9CisgIHZpcnR1YWwgVGFyZ2V0TG93ZXJpbmdPYmplY3RGaWxlICpnZXRPYmpGaWxlTG93ZXJpbmcoKSBjb25zdCB7CisgICAgcmV0dXJuIG51bGxwdHI7CisgIH0KKworICAvLy8gVGhpcyBtZXRob2QgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIHNwZWNpZmllZCB0eXBlIG9mCisgIC8vLyBUYXJnZXRTdWJ0YXJnZXRJbmZvLiAgSW4gZGVidWcgYnVpbGRzLCBpdCB2ZXJpZmllcyB0aGF0IHRoZSBvYmplY3QgYmVpbmcKKyAgLy8vIHJldHVybmVkIGlzIG9mIHRoZSBjb3JyZWN0IHR5cGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTVEM+IGNvbnN0IFNUQyAmZ2V0U3VidGFyZ2V0KGNvbnN0IEZ1bmN0aW9uICZGKSBjb25zdCB7CisgICAgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBTVEMqPihnZXRTdWJ0YXJnZXRJbXBsKEYpKTsKKyAgfQorCisgIC8vLyBDcmVhdGUgYSBEYXRhTGF5b3V0LgorICBjb25zdCBEYXRhTGF5b3V0IGNyZWF0ZURhdGFMYXlvdXQoKSBjb25zdCB7IHJldHVybiBETDsgfQorCisgIC8vLyBUZXN0IGlmIGEgRGF0YUxheW91dCBpZiBjb21wYXRpYmxlIHdpdGggdGhlIENvZGVHZW4gZm9yIHRoaXMgdGFyZ2V0LgorICAvLy8KKyAgLy8vIFRoZSBMTFZNIE1vZHVsZSBvd25zIGEgRGF0YUxheW91dCB0aGF0IGlzIHVzZWQgZm9yIHRoZSB0YXJnZXQgaW5kZXBlbmRlbnQKKyAgLy8vIG9wdGltaXphdGlvbnMgYW5kIGNvZGUgZ2VuZXJhdGlvbi4gVGhpcyBob29rIHByb3ZpZGVzIGEgdGFyZ2V0IHNwZWNpZmljCisgIC8vLyBjaGVjayBvbiB0aGUgdmFsaWRpdHkgb2YgdGhpcyBEYXRhTGF5b3V0LgorICBib29sIGlzQ29tcGF0aWJsZURhdGFMYXlvdXQoY29uc3QgRGF0YUxheW91dCAmQ2FuZGlkYXRlKSBjb25zdCB7CisgICAgcmV0dXJuIERMID09IENhbmRpZGF0ZTsKKyAgfQorCisgIC8vLyBHZXQgdGhlIHBvaW50ZXIgc2l6ZSBmb3IgdGhpcyB0YXJnZXQuCisgIC8vLworICAvLy8gVGhpcyBpcyB0aGUgb25seSB0aW1lIHRoZSBEYXRhTGF5b3V0IGluIHRoZSBUYXJnZXRNYWNoaW5lIGlzIHVzZWQuCisgIHVuc2lnbmVkIGdldFBvaW50ZXJTaXplKHVuc2lnbmVkIEFTKSBjb25zdCB7CisgICAgcmV0dXJuIERMLmdldFBvaW50ZXJTaXplKEFTKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFBvaW50ZXJTaXplSW5CaXRzKHVuc2lnbmVkIEFTKSBjb25zdCB7CisgICAgcmV0dXJuIERMLmdldFBvaW50ZXJTaXplSW5CaXRzKEFTKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldFByb2dyYW1Qb2ludGVyU2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gREwuZ2V0UG9pbnRlclNpemUoREwuZ2V0UHJvZ3JhbUFkZHJlc3NTcGFjZSgpKTsKKyAgfQorCisgIHVuc2lnbmVkIGdldEFsbG9jYVBvaW50ZXJTaXplKCkgY29uc3QgeworICAgIHJldHVybiBETC5nZXRQb2ludGVyU2l6ZShETC5nZXRBbGxvY2FBZGRyU3BhY2UoKSk7CisgIH0KKworICAvLy8gXGJyaWVmIFJlc2V0IHRoZSB0YXJnZXQgb3B0aW9ucyBiYXNlZCBvbiB0aGUgZnVuY3Rpb24ncyBhdHRyaWJ1dGVzLgorICAvLyBGSVhNRTogUmVtb3ZlIFRhcmdldE9wdGlvbnMgdGhhdCBhZmZlY3QgcGVyLWZ1bmN0aW9uIGNvZGUgZ2VuZXJhdGlvbgorICAvLyBmcm9tIFRhcmdldE1hY2hpbmUuCisgIHZvaWQgcmVzZXRUYXJnZXRPcHRpb25zKGNvbnN0IEZ1bmN0aW9uICZGKSBjb25zdDsKKworICAvLy8gUmV0dXJuIHRhcmdldCBzcGVjaWZpYyBhc20gaW5mb3JtYXRpb24uCisgIGNvbnN0IE1DQXNtSW5mbyAqZ2V0TUNBc21JbmZvKCkgY29uc3QgeyByZXR1cm4gQXNtSW5mbzsgfQorCisgIGNvbnN0IE1DUmVnaXN0ZXJJbmZvICpnZXRNQ1JlZ2lzdGVySW5mbygpIGNvbnN0IHsgcmV0dXJuIE1SSTsgfQorICBjb25zdCBNQ0luc3RySW5mbyAqZ2V0TUNJbnN0ckluZm8oKSBjb25zdCB7IHJldHVybiBNSUk7IH0KKyAgY29uc3QgTUNTdWJ0YXJnZXRJbmZvICpnZXRNQ1N1YnRhcmdldEluZm8oKSBjb25zdCB7IHJldHVybiBTVEk7IH0KKworICAvLy8gSWYgaW50cmluc2ljIGluZm9ybWF0aW9uIGlzIGF2YWlsYWJsZSwgcmV0dXJuIGl0LiAgSWYgbm90LCByZXR1cm4gbnVsbC4KKyAgdmlydHVhbCBjb25zdCBUYXJnZXRJbnRyaW5zaWNJbmZvICpnZXRJbnRyaW5zaWNJbmZvKCkgY29uc3QgeworICAgIHJldHVybiBudWxscHRyOworICB9CisKKyAgYm9vbCByZXF1aXJlc1N0cnVjdHVyZWRDRkcoKSBjb25zdCB7IHJldHVybiBSZXF1aXJlU3RydWN0dXJlZENGRzsgfQorICB2b2lkIHNldFJlcXVpcmVzU3RydWN0dXJlZENGRyhib29sIFZhbHVlKSB7IFJlcXVpcmVTdHJ1Y3R1cmVkQ0ZHID0gVmFsdWU7IH0KKworICAvLy8gUmV0dXJucyB0aGUgY29kZSBnZW5lcmF0aW9uIHJlbG9jYXRpb24gbW9kZWwuIFRoZSBjaG9pY2VzIGFyZSBzdGF0aWMsIFBJQywKKyAgLy8vIGFuZCBkeW5hbWljLW5vLXBpYywgYW5kIHRhcmdldCBkZWZhdWx0LgorICBSZWxvYzo6TW9kZWwgZ2V0UmVsb2NhdGlvbk1vZGVsKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIGNvZGUgbW9kZWwuIFRoZSBjaG9pY2VzIGFyZSBzbWFsbCwga2VybmVsLCBtZWRpdW0sIGxhcmdlLCBhbmQKKyAgLy8vIHRhcmdldCBkZWZhdWx0LgorICBDb2RlTW9kZWw6Ok1vZGVsIGdldENvZGVNb2RlbCgpIGNvbnN0OworCisgIGJvb2wgaXNQb3NpdGlvbkluZGVwZW5kZW50KCkgY29uc3Q7CisKKyAgYm9vbCBzaG91bGRBc3N1bWVEU09Mb2NhbChjb25zdCBNb2R1bGUgJk0sIGNvbnN0IEdsb2JhbFZhbHVlICpHVikgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHRhcmdldCB1c2VzIGVtdWxhdGVkIFRMUy4KKyAgYm9vbCB1c2VFbXVsYXRlZFRMUygpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSBUTFMgbW9kZWwgd2hpY2ggc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiBnbG9iYWwgdmFyaWFibGUuCisgIFRMU01vZGVsOjpNb2RlbCBnZXRUTFNNb2RlbChjb25zdCBHbG9iYWxWYWx1ZSAqR1YpIGNvbnN0OworCisgIC8vLyBSZXR1cm5zIHRoZSBvcHRpbWl6YXRpb24gbGV2ZWw6IE5vbmUsIExlc3MsIERlZmF1bHQsIG9yIEFnZ3Jlc3NpdmUuCisgIENvZGVHZW5PcHQ6OkxldmVsIGdldE9wdExldmVsKCkgY29uc3Q7CisKKyAgLy8vIFxicmllZiBPdmVycmlkZXMgdGhlIG9wdGltaXphdGlvbiBsZXZlbC4KKyAgdm9pZCBzZXRPcHRMZXZlbChDb2RlR2VuT3B0OjpMZXZlbCBMZXZlbCk7CisKKyAgdm9pZCBzZXRGYXN0SVNlbChib29sIEVuYWJsZSkgeyBPcHRpb25zLkVuYWJsZUZhc3RJU2VsID0gRW5hYmxlOyB9CisgIGJvb2wgZ2V0TzBXYW50c0Zhc3RJU2VsKCkgeyByZXR1cm4gTzBXYW50c0Zhc3RJU2VsOyB9CisgIHZvaWQgc2V0TzBXYW50c0Zhc3RJU2VsKGJvb2wgRW5hYmxlKSB7IE8wV2FudHNGYXN0SVNlbCA9IEVuYWJsZTsgfQorICB2b2lkIHNldEdsb2JhbElTZWwoYm9vbCBFbmFibGUpIHsgT3B0aW9ucy5FbmFibGVHbG9iYWxJU2VsID0gRW5hYmxlOyB9CisKKyAgYm9vbCBzaG91bGRQcmludE1hY2hpbmVDb2RlKCkgY29uc3QgeyByZXR1cm4gT3B0aW9ucy5QcmludE1hY2hpbmVDb2RlOyB9CisKKyAgYm9vbCBnZXRVbmlxdWVTZWN0aW9uTmFtZXMoKSBjb25zdCB7IHJldHVybiBPcHRpb25zLlVuaXF1ZVNlY3Rpb25OYW1lczsgfQorCisgIC8vLyBSZXR1cm4gdHJ1ZSBpZiBkYXRhIG9iamVjdHMgc2hvdWxkIGJlIGVtaXR0ZWQgaW50byB0aGVpciBvd24gc2VjdGlvbiwKKyAgLy8vIGNvcnJlc3BvbmRzIHRvIC1mZGF0YS1zZWN0aW9ucy4KKyAgYm9vbCBnZXREYXRhU2VjdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIE9wdGlvbnMuRGF0YVNlY3Rpb25zOworICB9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGZ1bmN0aW9ucyBzaG91bGQgYmUgZW1pdHRlZCBpbnRvIHRoZWlyIG93biBzZWN0aW9uLAorICAvLy8gY29ycmVzcG9uZGluZyB0byAtZmZ1bmN0aW9uLXNlY3Rpb25zLgorICBib29sIGdldEZ1bmN0aW9uU2VjdGlvbnMoKSBjb25zdCB7CisgICAgcmV0dXJuIE9wdGlvbnMuRnVuY3Rpb25TZWN0aW9uczsKKyAgfQorCisgIC8vLyBcYnJpZWYgR2V0IGEgXGMgVGFyZ2V0SVJBbmFseXNpcyBhcHByb3ByaWF0ZSBmb3IgdGhlIHRhcmdldC4KKyAgLy8vCisgIC8vLyBUaGlzIGlzIHVzZWQgdG8gY29uc3RydWN0IHRoZSBuZXcgcGFzcyBtYW5hZ2VyJ3MgdGFyZ2V0IElSIGFuYWx5c2lzIHBhc3MsCisgIC8vLyBzZXQgdXAgYXBwcm9wcmlhdGVseSBmb3IgdGhpcyB0YXJnZXQgbWFjaGluZS4gRXZlbiB0aGUgb2xkIHBhc3MgbWFuYWdlcgorICAvLy8gdXNlcyB0aGlzIHRvIGFuc3dlciBxdWVyaWVzIGFib3V0IHRoZSBJUi4KKyAgVGFyZ2V0SVJBbmFseXNpcyBnZXRUYXJnZXRJUkFuYWx5c2lzKCk7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gYSBUYXJnZXRUcmFuc2Zvcm1JbmZvIGZvciBhIGdpdmVuIGZ1bmN0aW9uLgorICAvLy8KKyAgLy8vIFRoZSByZXR1cm5lZCBUYXJnZXRUcmFuc2Zvcm1JbmZvIGlzIHNwZWNpYWxpemVkIHRvIHRoZSBzdWJ0YXJnZXQKKyAgLy8vIGNvcnJlc3BvbmRpbmcgdG8gXHAgRi4KKyAgdmlydHVhbCBUYXJnZXRUcmFuc2Zvcm1JbmZvIGdldFRhcmdldFRyYW5zZm9ybUluZm8oY29uc3QgRnVuY3Rpb24gJkYpOworCisgIC8vLyBBbGxvdyB0aGUgdGFyZ2V0IHRvIG1vZGlmeSB0aGUgcGFzcyBtYW5hZ2VyLCBlLmcuIGJ5IGNhbGxpbmcKKyAgLy8vIFBhc3NNYW5hZ2VyQnVpbGRlcjo6YWRkRXh0ZW5zaW9uLgorICB2aXJ0dWFsIHZvaWQgYWRqdXN0UGFzc01hbmFnZXIoUGFzc01hbmFnZXJCdWlsZGVyICYpIHt9CisKKyAgLy8vIFRoZXNlIGVudW1zIGFyZSBtZWFudCB0byBiZSBwYXNzZWQgaW50byBhZGRQYXNzZXNUb0VtaXRGaWxlIHRvIGluZGljYXRlCisgIC8vLyB3aGF0IHR5cGUgb2YgZmlsZSB0byBlbWl0LCBhbmQgcmV0dXJuZWQgYnkgaXQgdG8gaW5kaWNhdGUgd2hhdCB0eXBlIG9mCisgIC8vLyBmaWxlIGNvdWxkIGFjdHVhbGx5IGJlIG1hZGUuCisgIGVudW0gQ29kZUdlbkZpbGVUeXBlIHsKKyAgICBDR0ZUX0Fzc2VtYmx5RmlsZSwKKyAgICBDR0ZUX09iamVjdEZpbGUsCisgICAgQ0dGVF9OdWxsICAgICAgICAgLy8gRG8gbm90IGVtaXQgYW55IG91dHB1dC4KKyAgfTsKKworICAvLy8gQWRkIHBhc3NlcyB0byB0aGUgc3BlY2lmaWVkIHBhc3MgbWFuYWdlciB0byBnZXQgdGhlIHNwZWNpZmllZCBmaWxlCisgIC8vLyBlbWl0dGVkLiAgVHlwaWNhbGx5IHRoaXMgd2lsbCBpbnZvbHZlIHNldmVyYWwgc3RlcHMgb2YgY29kZSBnZW5lcmF0aW9uLgorICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIHJldHVybiB0cnVlIGlmIGVtaXNzaW9uIG9mIHRoaXMgZmlsZSB0eXBlIGlzIG5vdAorICAvLy8gc3VwcG9ydGVkLCBvciBmYWxzZSBvbiBzdWNjZXNzLgorICAvLy8gXHAgTU1JIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0aGF0LCBpZiBzZXQgdG8gbm9uLW51bGxwdHIsCisgIC8vLyB3aWxsIGJlIHVzZWQgdG8gc2V0IHRoZSBNYWNoaW5lTW9kdWxvSW5mbyBmb3IgdGhpcyBQTS4KKyAgdmlydHVhbCBib29sIGFkZFBhc3Nlc1RvRW1pdEZpbGUoUGFzc01hbmFnZXJCYXNlICYsIHJhd19wd3JpdGVfc3RyZWFtICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5GaWxlVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAvKkRpc2FibGVWZXJpZnkqLyA9IHRydWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNb2R1bGVJbmZvICpNTUkgPSBudWxscHRyKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gQWRkIHBhc3NlcyB0byB0aGUgc3BlY2lmaWVkIHBhc3MgbWFuYWdlciB0byBnZXQgbWFjaGluZSBjb2RlIGVtaXR0ZWQgd2l0aAorICAvLy8gdGhlIE1DSklULiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgbWFjaGluZSBjb2RlIGlzIG5vdCBzdXBwb3J0ZWQuIEl0CisgIC8vLyBmaWxscyB0aGUgTUNDb250ZXh0IEN0eCBwb2ludGVyIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGN1c3RvbQorICAvLy8gTUNTdHJlYW1lci4KKyAgLy8vCisgIHZpcnR1YWwgYm9vbCBhZGRQYXNzZXNUb0VtaXRNQyhQYXNzTWFuYWdlckJhc2UgJiwgTUNDb250ZXh0IComLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X3B3cml0ZV9zdHJlYW0gJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgLypEaXNhYmxlVmVyaWZ5Ki8gPSB0cnVlKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLy8gVHJ1ZSBpZiBzdWJ0YXJnZXQgaW5zZXJ0cyB0aGUgZmluYWwgc2NoZWR1bGluZyBwYXNzIG9uIGl0cyBvd24uCisgIC8vLworICAvLy8gQnJhbmNoIHJlbGF4YXRpb24sIHdoaWNoIG11c3QgaGFwcGVuIGFmdGVyIGJsb2NrIHBsYWNlbWVudCwgY2FuCisgIC8vLyBvbiBzb21lIHRhcmdldHMgKGUuZy4gU3lzdGVtWikgZXhwb3NlIGFkZGl0aW9uYWwgcG9zdC1SQQorICAvLy8gc2NoZWR1bGluZyBvcHBvcnR1bml0aWVzLgorICB2aXJ0dWFsIGJvb2wgdGFyZ2V0U2NoZWR1bGVzUG9zdFJBU2NoZWR1bGluZygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9OworCisgIHZvaWQgZ2V0TmFtZVdpdGhQcmVmaXgoU21hbGxWZWN0b3JJbXBsPGNoYXI+ICZOYW1lLCBjb25zdCBHbG9iYWxWYWx1ZSAqR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgTWFuZ2xlciAmTWFuZywgYm9vbCBNYXlBbHdheXNVc2VQcml2YXRlID0gZmFsc2UpIGNvbnN0OworICBNQ1N5bWJvbCAqZ2V0U3ltYm9sKGNvbnN0IEdsb2JhbFZhbHVlICpHVikgY29uc3Q7CisKKyAgLy8vIFRydWUgaWYgdGhlIHRhcmdldCB1c2VzIHBoeXNpY2FsIHJlZ3MgYXQgUHJvbG9nL0VwaWxvZyBpbnNlcnRpb24KKyAgLy8vIHRpbWUuIElmIHRydWUgKG1vc3QgbWFjaGluZXMpLCBhbGwgdnJlZ3MgbXVzdCBiZSBhbGxvY2F0ZWQgYmVmb3JlCisgIC8vLyBQRUkuIElmIGZhbHNlICh2aXJ0dWFsLXJlZ2lzdGVyIG1hY2hpbmVzKSwgdGhlbiBjYWxsZWUtc2F2ZSByZWdpc3RlcgorICAvLy8gc3BpbGxpbmcgYW5kIHNjYXZlbmdpbmcgYXJlIG5vdCBuZWVkZWQgb3IgdXNlZC4KKyAgdmlydHVhbCBib29sIHVzZXNQaHlzUmVnc0ZvclBFSSgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAvLy8gVHJ1ZSBpZiB0aGUgdGFyZ2V0IHdhbnRzIHRvIHVzZSBpbnRlcnByb2NlZHVyYWwgcmVnaXN0ZXIgYWxsb2NhdGlvbiBieQorICAvLy8gZGVmYXVsdC4gVGhlIC1lbmFibGUtaXByYSBmbGFnIGNhbiBiZSB1c2VkIHRvIG92ZXJyaWRlIHRoaXMuCisgIHZpcnR1YWwgYm9vbCB1c2VJUFJBKCkgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfTsKKworLy8vIFRoaXMgY2xhc3MgZGVzY3JpYmVzIGEgdGFyZ2V0IG1hY2hpbmUgdGhhdCBpcyBpbXBsZW1lbnRlZCB3aXRoIHRoZSBMTFZNCisvLy8gdGFyZ2V0LWluZGVwZW5kZW50IGNvZGUgZ2VuZXJhdG9yLgorLy8vCitjbGFzcyBMTFZNVGFyZ2V0TWFjaGluZSA6IHB1YmxpYyBUYXJnZXRNYWNoaW5lIHsKK3Byb3RlY3RlZDogLy8gQ2FuIG9ubHkgY3JlYXRlIHN1YmNsYXNzZXMuCisgIExMVk1UYXJnZXRNYWNoaW5lKGNvbnN0IFRhcmdldCAmVCwgU3RyaW5nUmVmIERhdGFMYXlvdXRTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRyaXBsZSAmVGFyZ2V0VHJpcGxlLCBTdHJpbmdSZWYgQ1BVLCBTdHJpbmdSZWYgRlMsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldE9wdGlvbnMgJk9wdGlvbnMsIFJlbG9jOjpNb2RlbCBSTSwKKyAgICAgICAgICAgICAgICAgICAgQ29kZU1vZGVsOjpNb2RlbCBDTSwgQ29kZUdlbk9wdDo6TGV2ZWwgT0wpOworCisgIHZvaWQgaW5pdEFzbUluZm8oKTsKKworcHVibGljOgorICAvLy8gXGJyaWVmIEdldCBhIFRhcmdldFRyYW5zZm9ybUluZm8gaW1wbGVtZW50YXRpb24gZm9yIHRoZSB0YXJnZXQuCisgIC8vLworICAvLy8gVGhlIFRUSSByZXR1cm5lZCB1c2VzIHRoZSBjb21tb24gY29kZSBnZW5lcmF0b3IgdG8gYW5zd2VyIHF1ZXJpZXMgYWJvdXQKKyAgLy8vIHRoZSBJUi4KKyAgVGFyZ2V0VHJhbnNmb3JtSW5mbyBnZXRUYXJnZXRUcmFuc2Zvcm1JbmZvKGNvbnN0IEZ1bmN0aW9uICZGKSBvdmVycmlkZTsKKworICAvLy8gQ3JlYXRlIGEgcGFzcyBjb25maWd1cmF0aW9uIG9iamVjdCB0byBiZSB1c2VkIGJ5IGFkZFBhc3NUb0VtaXRYIG1ldGhvZHMKKyAgLy8vIGZvciBnZW5lcmF0aW5nIGEgcGlwZWxpbmUgb2YgQ29kZUdlbiBwYXNzZXMuCisgIHZpcnR1YWwgVGFyZ2V0UGFzc0NvbmZpZyAqY3JlYXRlUGFzc0NvbmZpZyhQYXNzTWFuYWdlckJhc2UgJlBNKTsKKworICAvLy8gQWRkIHBhc3NlcyB0byB0aGUgc3BlY2lmaWVkIHBhc3MgbWFuYWdlciB0byBnZXQgdGhlIHNwZWNpZmllZCBmaWxlCisgIC8vLyBlbWl0dGVkLiAgVHlwaWNhbGx5IHRoaXMgd2lsbCBpbnZvbHZlIHNldmVyYWwgc3RlcHMgb2YgY29kZSBnZW5lcmF0aW9uLgorICAvLy8gXHAgTU1JIGlzIGFuIG9wdGlvbmFsIHBhcmFtZXRlciB0aGF0LCBpZiBzZXQgdG8gbm9uLW51bGxwdHIsCisgIC8vLyB3aWxsIGJlIHVzZWQgdG8gc2V0IHRoZSBNYWNoaW5lTW9kdWxvSW5mb2ZvciB0aGlzIFBNLgorICBib29sIGFkZFBhc3Nlc1RvRW1pdEZpbGUoUGFzc01hbmFnZXJCYXNlICZQTSwgcmF3X3B3cml0ZV9zdHJlYW0gJk91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5GaWxlVHlwZSBGaWxlVHlwZSwgYm9vbCBEaXNhYmxlVmVyaWZ5ID0gdHJ1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hY2hpbmVNb2R1bGVJbmZvICpNTUkgPSBudWxscHRyKSBvdmVycmlkZTsKKworICAvLy8gQWRkIHBhc3NlcyB0byB0aGUgc3BlY2lmaWVkIHBhc3MgbWFuYWdlciB0byBnZXQgbWFjaGluZSBjb2RlIGVtaXR0ZWQgd2l0aAorICAvLy8gdGhlIE1DSklULiBUaGlzIG1ldGhvZCByZXR1cm5zIHRydWUgaWYgbWFjaGluZSBjb2RlIGlzIG5vdCBzdXBwb3J0ZWQuIEl0CisgIC8vLyBmaWxscyB0aGUgTUNDb250ZXh0IEN0eCBwb2ludGVyIHdoaWNoIGNhbiBiZSB1c2VkIHRvIGJ1aWxkIGN1c3RvbQorICAvLy8gTUNTdHJlYW1lci4KKyAgYm9vbCBhZGRQYXNzZXNUb0VtaXRNQyhQYXNzTWFuYWdlckJhc2UgJlBNLCBNQ0NvbnRleHQgKiZDdHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X3B3cml0ZV9zdHJlYW0gJk9TLAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGlzYWJsZVZlcmlmeSA9IHRydWUpIG92ZXJyaWRlOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRhcmdldCBpcyBleHBlY3RlZCB0byBwYXNzIGFsbCBtYWNoaW5lIHZlcmlmaWVyCisgIC8vLyBjaGVja3MuIFRoaXMgaXMgYSBzdG9wZ2FwIG1lYXN1cmUgdG8gZml4IHRhcmdldHMgb25lIGJ5IG9uZS4gV2Ugd2lsbAorICAvLy8gcmVtb3ZlIHRoaXMgYXQgc29tZSBwb2ludCBhbmQgYWx3YXlzIGVuYWJsZSB0aGUgdmVyaWZpZXIgd2hlbgorICAvLy8gRVhQRU5TSVZFX0NIRUNLUyBpcyBlbmFibGVkLgorICB2aXJ0dWFsIGJvb2wgaXNNYWNoaW5lVmVyaWZpZXJDbGVhbigpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKworICAvLy8gXGJyaWVmIEFkZHMgYW4gQXNtUHJpbnRlciBwYXNzIHRvIHRoZSBwaXBlbGluZSB0aGF0IHByaW50cyBhc3NlbWJseSBvcgorICAvLy8gbWFjaGluZSBjb2RlIGZyb20gdGhlIE1JIHJlcHJlc2VudGF0aW9uLgorICBib29sIGFkZEFzbVByaW50ZXIoUGFzc01hbmFnZXJCYXNlICZQTSwgcmF3X3B3cml0ZV9zdHJlYW0gJk91dCwKKyAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5GaWxlVHlwZSBGaWxlVFlwZSwgTUNDb250ZXh0ICZDb250ZXh0KTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RBUkdFVF9UQVJHRVRNQUNISU5FX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDQwMzFmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0T3B0aW9ucy5oCkBAIC0wLDAgKzEsMjc4IEBACisvLz09PS0tIGxsdm0vVGFyZ2V0L1RhcmdldE9wdGlvbnMuaCAtIFRhcmdldCBPcHRpb25zIC0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGNvbW1hbmQgbGluZSBvcHRpb24gZmxhZ3MgdGhhdCBhcmUgc2hhcmVkIGFjcm9zcyB2YXJpb3VzCisvLyB0YXJnZXRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UQVJHRVRfVEFSR0VUT1BUSU9OU19ICisjZGVmaW5lIExMVk1fVEFSR0VUX1RBUkdFVE9QVElPTlNfSAorCisjaW5jbHVkZSAibGx2bS9NQy9NQ1RhcmdldE9wdGlvbnMuaCIKKworbmFtZXNwYWNlIGxsdm0geworICBjbGFzcyBNYWNoaW5lRnVuY3Rpb247CisgIGNsYXNzIE1vZHVsZTsKKworICBuYW1lc3BhY2UgRmxvYXRBQkkgeworICAgIGVudW0gQUJJVHlwZSB7CisgICAgICBEZWZhdWx0LCAvLyBUYXJnZXQtc3BlY2lmaWMgKGVpdGhlciBzb2Z0IG9yIGhhcmQgZGVwZW5kaW5nIG9uIHRyaXBsZSwgZXRjKS4KKyAgICAgIFNvZnQsICAgIC8vIFNvZnQgZmxvYXQuCisgICAgICBIYXJkICAgICAvLyBIYXJkIGZsb2F0LgorICAgIH07CisgIH0KKworICBuYW1lc3BhY2UgRlBPcEZ1c2lvbiB7CisgICAgZW51bSBGUE9wRnVzaW9uTW9kZSB7CisgICAgICBGYXN0LCAgICAgLy8gRW5hYmxlIGZ1c2lvbiBvZiBGUCBvcHMgd2hlcmV2ZXIgaXQncyBwcm9maXRhYmxlLgorICAgICAgU3RhbmRhcmQsIC8vIE9ubHkgYWxsb3cgZnVzaW9uIG9mICdibGVzc2VkJyBvcHMgKGN1cnJlbnRseSBqdXN0IGZtdWxhZGQpLgorICAgICAgU3RyaWN0ICAgIC8vIE5ldmVyIGZ1c2UgRlAtb3BzLgorICAgIH07CisgIH0KKworICBuYW1lc3BhY2UgSnVtcFRhYmxlIHsKKyAgICBlbnVtIEp1bXBUYWJsZVR5cGUgeworICAgICAgU2luZ2xlLCAgICAgICAgICAvLyBVc2UgYSBzaW5nbGUgdGFibGUgZm9yIGFsbCBpbmRpcmVjdCBqdW1wdGFibGUgY2FsbHMuCisgICAgICBBcml0eSwgICAgICAgICAgIC8vIFVzZSBvbmUgdGFibGUgcGVyIG51bWJlciBvZiBmdW5jdGlvbiBwYXJhbWV0ZXJzLgorICAgICAgU2ltcGxpZmllZCwgICAgICAvLyBVc2Ugb25lIHRhYmxlIHBlciBmdW5jdGlvbiB0eXBlLCB3aXRoIHR5cGVzIHByb2plY3RlZAorICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRvIDQgdHlwZXM6IHBvaW50ZXIgdG8gbm9uLWZ1bmN0aW9uLCBzdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgIC8vIHByaW1pdGl2ZSwgYW5kIGZ1bmN0aW9uIHBvaW50ZXIuCisgICAgICBGdWxsICAgICAgICAgICAgIC8vIFVzZSBvbmUgdGFibGUgcGVyIHVuaXF1ZSBmdW5jdGlvbiB0eXBlCisgICAgfTsKKyAgfQorCisgIG5hbWVzcGFjZSBUaHJlYWRNb2RlbCB7CisgICAgZW51bSBNb2RlbCB7CisgICAgICBQT1NJWCwgIC8vIFBPU0lYIFRocmVhZHMKKyAgICAgIFNpbmdsZSAgLy8gU2luZ2xlIFRocmVhZGVkIEVudmlyb25tZW50CisgICAgfTsKKyAgfQorCisgIG5hbWVzcGFjZSBGUERlbm9ybWFsIHsKKyAgICBlbnVtIERlbm9ybWFsTW9kZSB7CisgICAgICBJRUVFLCAgICAgICAgICAgLy8gSUVFRSA3NTQgZGVub3JtYWwgbnVtYmVycworICAgICAgUHJlc2VydmVTaWduLCAgIC8vIHRoZSBzaWduIG9mIGEgZmx1c2hlZC10by16ZXJvIG51bWJlciBpcyBwcmVzZXJ2ZWQgaW4KKyAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc2lnbiBvZiAwCisgICAgICBQb3NpdGl2ZVplcm8gICAgLy8gZGVub3JtYWxzIGFyZSBmbHVzaGVkIHRvIHBvc2l0aXZlIHplcm8KKyAgICB9OworICB9CisKKyAgZW51bSBjbGFzcyBFQUJJIHsKKyAgICBVbmtub3duLAorICAgIERlZmF1bHQsIC8vIERlZmF1bHQgbWVhbnMgbm90IHNwZWNpZmllZAorICAgIEVBQkk0LCAgIC8vIFRhcmdldC1zcGVjaWZpYyAoZWl0aGVyIDQsIDUgb3IgZ251IGRlcGVuZGluZyBvbiB0cmlwbGUpLgorICAgIEVBQkk1LAorICAgIEdOVQorICB9OworCisgIC8vLyBJZGVudGlmeSBhIGRlYnVnZ2VyIGZvciAidHVuaW5nIiB0aGUgZGVidWcgaW5mby4KKyAgLy8vCisgIC8vLyBUaGUgImRlYnVnZ2VyIHR1bmluZyIgY29uY2VwdCBhbGxvd3MgdXMgdG8gcHJlc2VudCBhIG1vcmUgaW50dWl0aXZlCisgIC8vLyBpbnRlcmZhY2UgdGhhdCB1bnBhY2tzIGludG8gZGlmZmVyZW50IHNldHMgb2YgZGVmYXVsdHMgZm9yIHRoZSB2YXJpb3VzCisgIC8vLyBpbmRpdmlkdWFsIGZlYXR1cmUtZmxhZyBzZXR0aW5ncywgdGhhdCBzdWl0IHRoZSBwcmVmZXJlbmNlcyBvZiB0aGUKKyAgLy8vIHZhcmlvdXMgZGVidWdnZXJzLiAgSG93ZXZlciwgaXQncyB3b3J0aCByZW1lbWJlcmluZyB0aGF0IGRlYnVnZ2VycyBhcmUKKyAgLy8vIG5vdCB0aGUgb25seSBjb25zdW1lcnMgb2YgZGVidWcgaW5mbywgYW5kIHNvbWUgdmFyaWF0aW9ucyBpbiBEV0FSRiBtaWdodAorICAvLy8gYmV0dGVyIGJlIHRyZWF0ZWQgYXMgdGFyZ2V0L3BsYXRmb3JtIGlzc3Vlcy4gRnVuZGFtZW50YWxseSwKKyAgLy8vIG8gaWYgdGhlIGZlYXR1cmUgaXMgdXNlZnVsIChvciBub3QpIHRvIGEgcGFydGljdWxhciBkZWJ1Z2dlciwgcmVnYXJkbGVzcworICAvLy8gICBvZiB0aGUgdGFyZ2V0LCB0aGF0J3MgYSB0dW5pbmcgZGVjaXNpb247CisgIC8vLyBvIGlmIHRoZSBmZWF0dXJlIGlzIHVzZWZ1bCAob3Igbm90KSBvbiBhIHBhcnRpY3VsYXIgcGxhdGZvcm0sIHJlZ2FyZGxlc3MKKyAgLy8vICAgb2YgdGhlIGRlYnVnZ2VyLCB0aGF0J3MgYSB0YXJnZXQgZGVjaXNpb24uCisgIC8vLyBJdCdzIG5vdCBpbXBvc3NpYmxlIHRvIHNlZSBib3RoIGZhY3RvcnMgaW4gc29tZSBzcGVjaWZpYyBjYXNlLgorICAvLy8KKyAgLy8vIFRoZSAidHVuaW5nIiBzaG91bGQgYmUgdXNlZCB0byBzZXQgZGVmYXVsdHMgZm9yIGluZGl2aWR1YWwgZmVhdHVyZSBmbGFncworICAvLy8gaW4gRHdhcmZEZWJ1ZzsgaWYgYSBnaXZlbiBmZWF0dXJlIGhhcyBhIG1vcmUgc3BlY2lmaWMgY29tbWFuZC1saW5lIG9wdGlvbiwKKyAgLy8vIHRoYXQgb3B0aW9uIHNob3VsZCB0YWtlIHByZWNlZGVuY2Ugb3ZlciB0aGUgdHVuaW5nLgorICBlbnVtIGNsYXNzIERlYnVnZ2VyS2luZCB7CisgICAgRGVmYXVsdCwgIC8vIE5vIHNwZWNpZmljIHR1bmluZyByZXF1ZXN0ZWQuCisgICAgR0RCLCAgICAgIC8vIFR1bmUgZGVidWcgaW5mbyBmb3IgZ2RiLgorICAgIExMREIsICAgICAvLyBUdW5lIGRlYnVnIGluZm8gZm9yIGxsZGIuCisgICAgU0NFICAgICAgIC8vIFR1bmUgZGVidWcgaW5mbyBmb3IgU0NFIHRhcmdldHMgKGUuZy4gUFM0KS4KKyAgfTsKKworICBjbGFzcyBUYXJnZXRPcHRpb25zIHsKKyAgcHVibGljOgorICAgIFRhcmdldE9wdGlvbnMoKQorICAgICAgICA6IFByaW50TWFjaGluZUNvZGUoZmFsc2UpLCBVbnNhZmVGUE1hdGgoZmFsc2UpLCBOb0luZnNGUE1hdGgoZmFsc2UpLAorICAgICAgICAgIE5vTmFOc0ZQTWF0aChmYWxzZSksIE5vVHJhcHBpbmdGUE1hdGgoZmFsc2UpLAorICAgICAgICAgIE5vU2lnbmVkWmVyb3NGUE1hdGgoZmFsc2UpLAorICAgICAgICAgIEhvbm9yU2lnbkRlcGVuZGVudFJvdW5kaW5nRlBNYXRoT3B0aW9uKGZhbHNlKSwgTm9aZXJvc0luQlNTKGZhbHNlKSwKKyAgICAgICAgICBHdWFyYW50ZWVkVGFpbENhbGxPcHQoZmFsc2UpLCBTdGFja1N5bWJvbE9yZGVyaW5nKHRydWUpLAorICAgICAgICAgIEVuYWJsZUZhc3RJU2VsKGZhbHNlKSwgRW5hYmxlR2xvYmFsSVNlbChmYWxzZSksIFVzZUluaXRBcnJheShmYWxzZSksCisgICAgICAgICAgRGlzYWJsZUludGVncmF0ZWRBUyhmYWxzZSksIFJlbGF4RUxGUmVsb2NhdGlvbnMoZmFsc2UpLAorICAgICAgICAgIEZ1bmN0aW9uU2VjdGlvbnMoZmFsc2UpLCBEYXRhU2VjdGlvbnMoZmFsc2UpLAorICAgICAgICAgIFVuaXF1ZVNlY3Rpb25OYW1lcyh0cnVlKSwgVHJhcFVucmVhY2hhYmxlKGZhbHNlKSwKKyAgICAgICAgICBFbXVsYXRlZFRMUyhmYWxzZSksIEV4cGxpY2l0RW11bGF0ZWRUTFMoZmFsc2UpLAorICAgICAgICAgIEVuYWJsZUlQUkEoZmFsc2UpLCBFbWl0U3RhY2tTaXplU2VjdGlvbihmYWxzZSkge30KKworICAgIC8vLyBQcmludE1hY2hpbmVDb2RlIC0gVGhpcyBmbGFnIGlzIGVuYWJsZWQgd2hlbiB0aGUgLXByaW50LW1hY2hpbmVpbnN0cnMKKyAgICAvLy8gb3B0aW9uIGlzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLCBhbmQgc2hvdWxkIGVuYWJsZSBkZWJ1Z2dpbmcKKyAgICAvLy8gb3V0cHV0IGZyb20gdGhlIGNvZGUgZ2VuZXJhdG9yLgorICAgIHVuc2lnbmVkIFByaW50TWFjaGluZUNvZGUgOiAxOworCisgICAgLy8vIERpc2FibGVGcmFtZVBvaW50ZXJFbGltIC0gVGhpcyByZXR1cm5zIHRydWUgaWYgZnJhbWUgcG9pbnRlciBlbGltaW5hdGlvbgorICAgIC8vLyBvcHRpbWl6YXRpb24gc2hvdWxkIGJlIGRpc2FibGVkIGZvciB0aGUgZ2l2ZW4gbWFjaGluZSBmdW5jdGlvbi4KKyAgICBib29sIERpc2FibGVGcmFtZVBvaW50ZXJFbGltKGNvbnN0IE1hY2hpbmVGdW5jdGlvbiAmTUYpIGNvbnN0OworCisgICAgLy8vIFVuc2FmZUZQTWF0aCAtIFRoaXMgZmxhZyBpcyBlbmFibGVkIHdoZW4gdGhlCisgICAgLy8vIC1lbmFibGUtdW5zYWZlLWZwLW1hdGggZmxhZyBpcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gIFdoZW4KKyAgICAvLy8gdGhpcyBmbGFnIGlzIG9mZiAodGhlIGRlZmF1bHQpLCB0aGUgY29kZSBnZW5lcmF0b3IgaXMgbm90IGFsbG93ZWQgdG8KKyAgICAvLy8gcHJvZHVjZSByZXN1bHRzIHRoYXQgYXJlICJsZXNzIHByZWNpc2UiIHRoYW4gSUVFRSBhbGxvd3MuICBUaGlzIGluY2x1ZGVzCisgICAgLy8vIHVzZSBvZiBYODYgaW5zdHJ1Y3Rpb25zIGxpa2UgRlNJTiBhbmQgRkNPUyBpbnN0ZWFkIG9mIGxpYmNhbGxzLgorICAgIHVuc2lnbmVkIFVuc2FmZUZQTWF0aCA6IDE7CisKKyAgICAvLy8gTm9JbmZzRlBNYXRoIC0gVGhpcyBmbGFnIGlzIGVuYWJsZWQgd2hlbiB0aGUKKyAgICAvLy8gLWVuYWJsZS1uby1pbmZzLWZwLW1hdGggZmxhZyBpcyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZS4gV2hlbgorICAgIC8vLyB0aGlzIGZsYWcgaXMgb2ZmICh0aGUgZGVmYXVsdCksIHRoZSBjb2RlIGdlbmVyYXRvciBpcyBub3QgYWxsb3dlZCB0bworICAgIC8vLyBhc3N1bWUgdGhlIEZQIGFyaXRobWV0aWMgYXJndW1lbnRzIGFuZCByZXN1bHRzIGFyZSBuZXZlciArLUluZnMuCisgICAgdW5zaWduZWQgTm9JbmZzRlBNYXRoIDogMTsKKworICAgIC8vLyBOb05hTnNGUE1hdGggLSBUaGlzIGZsYWcgaXMgZW5hYmxlZCB3aGVuIHRoZQorICAgIC8vLyAtZW5hYmxlLW5vLW5hbnMtZnAtbWF0aCBmbGFnIGlzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiBXaGVuCisgICAgLy8vIHRoaXMgZmxhZyBpcyBvZmYgKHRoZSBkZWZhdWx0KSwgdGhlIGNvZGUgZ2VuZXJhdG9yIGlzIG5vdCBhbGxvd2VkIHRvCisgICAgLy8vIGFzc3VtZSB0aGUgRlAgYXJpdGhtZXRpYyBhcmd1bWVudHMgYW5kIHJlc3VsdHMgYXJlIG5ldmVyIE5hTnMuCisgICAgdW5zaWduZWQgTm9OYU5zRlBNYXRoIDogMTsKKworICAgIC8vLyBOb1RyYXBwaW5nRlBNYXRoIC0gVGhpcyBmbGFnIGlzIGVuYWJsZWQgd2hlbiB0aGUKKyAgICAvLy8gLWVuYWJsZS1uby10cmFwcGluZy1mcC1tYXRoIGlzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiBUaGlzCisgICAgLy8vIHNwZWNpZmllcyB0aGF0IHRoZXJlIGFyZSBubyB0cmFwIGhhbmRsZXJzIHRvIGhhbmRsZSBleGNlcHRpb25zLgorICAgIHVuc2lnbmVkIE5vVHJhcHBpbmdGUE1hdGggOiAxOworCisgICAgLy8vIE5vU2lnbmVkWmVyb3NGUE1hdGggLSBUaGlzIGZsYWcgaXMgZW5hYmxlZCB3aGVuIHRoZQorICAgIC8vLyAtZW5hYmxlLW5vLXNpZ25lZC16ZXJvcy1mcC1tYXRoIGlzIHNwZWNpZmllZCBvbiB0aGUgY29tbWFuZCBsaW5lLiBUaGlzCisgICAgLy8vIHNwZWNpZmllcyB0aGF0IG9wdGltaXphdGlvbnMgYXJlIGFsbG93ZWQgdG8gdHJlYXQgdGhlIHNpZ24gb2YgYSB6ZXJvCisgICAgLy8vIGFyZ3VtZW50IG9yIHJlc3VsdCBhcyBpbnNpZ25pZmljYW50LgorICAgIHVuc2lnbmVkIE5vU2lnbmVkWmVyb3NGUE1hdGggOiAxOworCisgICAgLy8vIEhvbm9yU2lnbkRlcGVuZGVudFJvdW5kaW5nRlBNYXRoIC0gVGhpcyByZXR1cm5zIHRydWUgd2hlbiB0aGUKKyAgICAvLy8gLWVuYWJsZS1zaWduLWRlcGVuZGVudC1yb3VuZGluZy1mcC1tYXRoIGlzIHNwZWNpZmllZC4gIElmIHRoaXMgcmV0dXJucworICAgIC8vLyBmYWxzZSAodGhlIGRlZmF1bHQpLCB0aGUgY29kZSBnZW5lcmF0b3IgaXMgYWxsb3dlZCB0byBhc3N1bWUgdGhhdCB0aGUKKyAgICAvLy8gcm91bmRpbmcgYmVoYXZpb3IgaXMgdGhlIGRlZmF1bHQgKHJvdW5kLXRvLXplcm8gZm9yIGFsbCBmbG9hdGluZyBwb2ludAorICAgIC8vLyB0byBpbnRlZ2VyIGNvbnZlcnNpb25zLCBhbmQgcm91bmQtdG8tbmVhcmVzdCBmb3IgYWxsIG90aGVyIGFyaXRobWV0aWMKKyAgICAvLy8gdHJ1bmNhdGlvbnMpLiAgSWYgdGhpcyBpcyBlbmFibGVkIChzZXQgdG8gdHJ1ZSksIHRoZSBjb2RlIGdlbmVyYXRvciBtdXN0CisgICAgLy8vIGFzc3VtZSB0aGF0IHRoZSByb3VuZGluZyBtb2RlIG1heSBkeW5hbWljYWxseSBjaGFuZ2UuCisgICAgdW5zaWduZWQgSG9ub3JTaWduRGVwZW5kZW50Um91bmRpbmdGUE1hdGhPcHRpb24gOiAxOworICAgIGJvb2wgSG9ub3JTaWduRGVwZW5kZW50Um91bmRpbmdGUE1hdGgoKSBjb25zdDsKKworICAgIC8vLyBOb1plcm9zSW5CU1MgLSBCeSBkZWZhdWx0IHNvbWUgY29kZWdlbnMgcGxhY2UgemVyby1pbml0aWFsaXplZCBkYXRhIHRvCisgICAgLy8vIC5ic3Mgc2VjdGlvbi4gVGhpcyBmbGFnIGRpc2FibGVzIHN1Y2ggYmVoYXZpb3VyIChuZWNlc3NhcnksIGUuZy4gZm9yCisgICAgLy8vIGNydCoubyBjb21waWxpbmcpLgorICAgIHVuc2lnbmVkIE5vWmVyb3NJbkJTUyA6IDE7CisKKyAgICAvLy8gR3VhcmFudGVlZFRhaWxDYWxsT3B0IC0gVGhpcyBmbGFnIGlzIGVuYWJsZWQgd2hlbiAtdGFpbGNhbGxvcHQgaXMKKyAgICAvLy8gc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kbGluZS4gV2hlbiB0aGUgZmxhZyBpcyBvbiwgcGFydGljaXBhdGluZyB0YXJnZXRzCisgICAgLy8vIHdpbGwgcGVyZm9ybSB0YWlsIGNhbGwgb3B0aW1pemF0aW9uIG9uIGFsbCBjYWxscyB3aGljaCB1c2UgdGhlIGZhc3RjYworICAgIC8vLyBjYWxsaW5nIGNvbnZlbnRpb24gYW5kIHdoaWNoIHNhdGlzZnkgY2VydGFpbiB0YXJnZXQtaW5kZXBlbmRlbnQKKyAgICAvLy8gY3JpdGVyaWEgKGJlaW5nIGF0IHRoZSBlbmQgb2YgYSBmdW5jdGlvbiwgaGF2aW5nIHRoZSBzYW1lIHJldHVybiB0eXBlCisgICAgLy8vIGFzIHRoZWlyIHBhcmVudCBmdW5jdGlvbiwgZXRjLiksIHVzaW5nIGFuIGFsdGVybmF0ZSBBQkkgaWYgbmVjZXNzYXJ5LgorICAgIHVuc2lnbmVkIEd1YXJhbnRlZWRUYWlsQ2FsbE9wdCA6IDE7CisKKyAgICAvLy8gU3RhY2tBbGlnbm1lbnRPdmVycmlkZSAtIE92ZXJyaWRlIGRlZmF1bHQgc3RhY2sgYWxpZ25tZW50IGZvciB0YXJnZXQuCisgICAgdW5zaWduZWQgU3RhY2tBbGlnbm1lbnRPdmVycmlkZSA9IDA7CisKKyAgICAvLy8gU3RhY2tTeW1ib2xPcmRlcmluZyAtIFdoZW4gdHJ1ZSwgdGhpcyB3aWxsIGFsbG93IENvZGVHZW4gdG8gb3JkZXIKKyAgICAvLy8gdGhlIGxvY2FsIHN0YWNrIHN5bWJvbHMgKGZvciBjb2RlIHNpemUsIGNvZGUgbG9jYWxpdHksIG9yIGFueSBvdGhlcgorICAgIC8vLyBoZXVyaXN0aWNzKS4gV2hlbiBmYWxzZSwgdGhlIGxvY2FsIHN5bWJvbHMgYXJlIGxlZnQgaW4gd2hhdGV2ZXIgb3JkZXIKKyAgICAvLy8gdGhleSB3ZXJlIGdlbmVyYXRlZC4gRGVmYXVsdCBpcyB0cnVlLgorICAgIHVuc2lnbmVkIFN0YWNrU3ltYm9sT3JkZXJpbmcgOiAxOworCisgICAgLy8vIEVuYWJsZUZhc3RJU2VsIC0gVGhpcyBmbGFnIGVuYWJsZXMgZmFzdC1wYXRoIGluc3RydWN0aW9uIHNlbGVjdGlvbgorICAgIC8vLyB3aGljaCB0cmFkZXMgYXdheSBnZW5lcmF0ZWQgY29kZSBxdWFsaXR5IGluIGZhdm9yIG9mIHJlZHVjaW5nCisgICAgLy8vIGNvbXBpbGUgdGltZS4KKyAgICB1bnNpZ25lZCBFbmFibGVGYXN0SVNlbCA6IDE7CisKKyAgICAvLy8gRW5hYmxlR2xvYmFsSVNlbCAtIFRoaXMgZmxhZyBlbmFibGVzIGdsb2JhbCBpbnN0cnVjdGlvbiBzZWxlY3Rpb24uCisgICAgdW5zaWduZWQgRW5hYmxlR2xvYmFsSVNlbCA6IDE7CisKKyAgICAvLy8gVXNlSW5pdEFycmF5IC0gVXNlIC5pbml0X2FycmF5IGluc3RlYWQgb2YgLmN0b3JzIGZvciBzdGF0aWMKKyAgICAvLy8gY29uc3RydWN0b3JzLgorICAgIHVuc2lnbmVkIFVzZUluaXRBcnJheSA6IDE7CisKKyAgICAvLy8gRGlzYWJsZSB0aGUgaW50ZWdyYXRlZCBhc3NlbWJsZXIuCisgICAgdW5zaWduZWQgRGlzYWJsZUludGVncmF0ZWRBUyA6IDE7CisKKyAgICAvLy8gQ29tcHJlc3MgRFdBUkYgZGVidWcgc2VjdGlvbnMuCisgICAgRGVidWdDb21wcmVzc2lvblR5cGUgQ29tcHJlc3NEZWJ1Z1NlY3Rpb25zID0gRGVidWdDb21wcmVzc2lvblR5cGU6Ok5vbmU7CisKKyAgICB1bnNpZ25lZCBSZWxheEVMRlJlbG9jYXRpb25zIDogMTsKKworICAgIC8vLyBFbWl0IGZ1bmN0aW9ucyBpbnRvIHNlcGFyYXRlIHNlY3Rpb25zLgorICAgIHVuc2lnbmVkIEZ1bmN0aW9uU2VjdGlvbnMgOiAxOworCisgICAgLy8vIEVtaXQgZGF0YSBpbnRvIHNlcGFyYXRlIHNlY3Rpb25zLgorICAgIHVuc2lnbmVkIERhdGFTZWN0aW9ucyA6IDE7CisKKyAgICB1bnNpZ25lZCBVbmlxdWVTZWN0aW9uTmFtZXMgOiAxOworCisgICAgLy8vIEVtaXQgdGFyZ2V0LXNwZWNpZmljIHRyYXAgaW5zdHJ1Y3Rpb24gZm9yICd1bnJlYWNoYWJsZScgSVIgaW5zdHJ1Y3Rpb25zLgorICAgIHVuc2lnbmVkIFRyYXBVbnJlYWNoYWJsZSA6IDE7CisKKyAgICAvLy8gRW11bGF0ZWRUTFMgLSBUaGlzIGZsYWcgZW5hYmxlcyBlbXVsYXRlZCBUTFMgbW9kZWwsIHVzaW5nIGVtdXRscworICAgIC8vLyBmdW5jdGlvbiBpbiB0aGUgcnVudGltZSBsaWJyYXJ5Li4KKyAgICB1bnNpZ25lZCBFbXVsYXRlZFRMUyA6IDE7CisKKyAgICAvLy8gV2hldGhlciAtZW11bGF0ZWQtdGxzIG9yIC1uby1lbXVsYXRlZC10bHMgaXMgc2V0LgorICAgIHVuc2lnbmVkIEV4cGxpY2l0RW11bGF0ZWRUTFMgOiAxOworCisgICAgLy8vIFRoaXMgZmxhZyBlbmFibGVzIEludGVyUHJvY2VkdXJhbCBSZWdpc3RlciBBbGxvY2F0aW9uIChJUFJBKS4KKyAgICB1bnNpZ25lZCBFbmFibGVJUFJBIDogMTsKKworICAgIC8vLyBFbWl0IHNlY3Rpb24gY29udGFpbmluZyBtZXRhZGF0YSBvbiBmdW5jdGlvbiBzdGFjayBzaXplcy4KKyAgICB1bnNpZ25lZCBFbWl0U3RhY2tTaXplU2VjdGlvbiA6IDE7CisKKyAgICAvLy8gRmxvYXRBQklUeXBlIC0gVGhpcyBzZXR0aW5nIGlzIHNldCBieSAtZmxvYXQtYWJpPXh4eCBvcHRpb24gaXMgc3BlY2ZpZWQKKyAgICAvLy8gb24gdGhlIGNvbW1hbmQgbGluZS4gVGhpcyBzZXR0aW5nIG1heSBlaXRoZXIgYmUgRGVmYXVsdCwgU29mdCwgb3IgSGFyZC4KKyAgICAvLy8gRGVmYXVsdCBzZWxlY3RzIHRoZSB0YXJnZXQncyBkZWZhdWx0IGJlaGF2aW9yLiBTb2Z0IHNlbGVjdHMgdGhlIEFCSSBmb3IKKyAgICAvLy8gc29mdHdhcmUgZmxvYXRpbmcgcG9pbnQsIGJ1dCBkb2VzIG5vdCBpbmRpY2F0ZSB0aGF0IEZQIGhhcmR3YXJlIG1heSBub3QKKyAgICAvLy8gYmUgdXNlZC4gU3VjaCBhIGNvbWJpbmF0aW9uIGlzIHVuZm9ydHVuYXRlbHkgcG9wdWxhciAoZS5nLgorICAgIC8vLyBhcm0tYXBwbGUtZGFyd2luKS4gSGFyZCBwcmVzdW1lcyB0aGF0IHRoZSBub3JtYWwgRlAgQUJJIGlzIHVzZWQuCisgICAgRmxvYXRBQkk6OkFCSVR5cGUgRmxvYXRBQklUeXBlID0gRmxvYXRBQkk6OkRlZmF1bHQ7CisKKyAgICAvLy8gQWxsb3dGUE9wRnVzaW9uIC0gVGhpcyBmbGFnIGlzIHNldCBieSB0aGUgLWZ1c2UtZnAtb3BzPXh4eCBvcHRpb24uCisgICAgLy8vIFRoaXMgY29udHJvbHMgdGhlIGNyZWF0aW9uIG9mIGZ1c2VkIEZQIG9wcyB0aGF0IHN0b3JlIGludGVybWVkaWF0ZQorICAgIC8vLyByZXN1bHRzIGluIGhpZ2hlciBwcmVjaXNpb24gdGhhbiBJRUVFIGFsbG93cyAoRS5nLiBGTUFzKS4KKyAgICAvLy8KKyAgICAvLy8gRmFzdCBtb2RlIC0gYWxsb3dzIGZvcm1hdGlvbiBvZiBmdXNlZCBGUCBvcHMgd2hlbmV2ZXIgdGhleSdyZQorICAgIC8vLyBwcm9maXRhYmxlLgorICAgIC8vLyBTdGFuZGFyZCBtb2RlIC0gYWxsb3cgZnVzaW9uIG9ubHkgZm9yICdibGVzc2VkJyBGUCBvcHMuIEF0IHByZXNlbnQgdGhlCisgICAgLy8vIG9ubHkgYmxlc3NlZCBvcCBpcyB0aGUgZm11bGFkZCBpbnRyaW5zaWMuIEluIHRoZSBmdXR1cmUgbW9yZSBibGVzc2VkIG9wcworICAgIC8vLyBtYXkgYmUgYWRkZWQuCisgICAgLy8vIFN0cmljdCBtb2RlIC0gYWxsb3cgZnVzaW9uIG9ubHkgaWYvd2hlbiBpdCBjYW4gYmUgcHJvdmVuIHRoYXQgdGhlIGV4Y2VzcworICAgIC8vLyBwcmVjaXNpb24gd29uJ3QgZWZmZWN0IHRoZSByZXN1bHQuCisgICAgLy8vCisgICAgLy8vIE5vdGU6IFRoaXMgb3B0aW9uIG9ubHkgY29udHJvbHMgZm9ybWF0aW9uIG9mIGZ1c2VkIG9wcyBieSB0aGUKKyAgICAvLy8gb3B0aW1pemVycy4gIEZ1c2VkIG9wZXJhdGlvbnMgdGhhdCBhcmUgZXhwbGljaXRseSBzcGVjaWZpZWQgKGUuZy4gRk1BCisgICAgLy8vIHZpYSB0aGUgbGx2bS5mbWEuKiBpbnRyaW5zaWMpIHdpbGwgYWx3YXlzIGJlIGhvbm9yZWQsIHJlZ2FyZGxlc3Mgb2YKKyAgICAvLy8gdGhlIHZhbHVlIG9mIHRoaXMgb3B0aW9uLgorICAgIEZQT3BGdXNpb246OkZQT3BGdXNpb25Nb2RlIEFsbG93RlBPcEZ1c2lvbiA9IEZQT3BGdXNpb246OlN0YW5kYXJkOworCisgICAgLy8vIFRocmVhZE1vZGVsIC0gVGhpcyBmbGFnIHNwZWNpZmllcyB0aGUgdHlwZSBvZiB0aHJlYWRpbmcgbW9kZWwgdG8gYXNzdW1lCisgICAgLy8vIGZvciB0aGluZ3MgbGlrZSBhdG9taWNzCisgICAgVGhyZWFkTW9kZWw6Ok1vZGVsIFRocmVhZE1vZGVsID0gVGhyZWFkTW9kZWw6OlBPU0lYOworCisgICAgLy8vIEVBQklWZXJzaW9uIC0gVGhpcyBmbGFnIHNwZWNpZmllcyB0aGUgRUFCSSB2ZXJzaW9uCisgICAgRUFCSSBFQUJJVmVyc2lvbiA9IEVBQkk6OkRlZmF1bHQ7CisKKyAgICAvLy8gV2hpY2ggZGVidWdnZXIgdG8gdHVuZSBmb3IuCisgICAgRGVidWdnZXJLaW5kIERlYnVnZ2VyVHVuaW5nID0gRGVidWdnZXJLaW5kOjpEZWZhdWx0OworCisgICAgLy8vIEZQRGVub3JtYWxNb2RlIC0gVGhpcyBmbGFncyBzcGVjaWZpY2llcyB3aGljaCBkZW5vcm1hbCBudW1iZXJzIHRoZSBjb2RlCisgICAgLy8vIGlzIHBlcm1pdHRlZCB0byByZXF1aXJlLgorICAgIEZQRGVub3JtYWw6OkRlbm9ybWFsTW9kZSBGUERlbm9ybWFsTW9kZSA9IEZQRGVub3JtYWw6OklFRUU7CisKKyAgICAvLy8gV2hhdCBleGNlcHRpb24gbW9kZWwgdG8gdXNlCisgICAgRXhjZXB0aW9uSGFuZGxpbmcgRXhjZXB0aW9uTW9kZWwgPSBFeGNlcHRpb25IYW5kbGluZzo6Tm9uZTsKKworICAgIC8vLyBNYWNoaW5lIGxldmVsIG9wdGlvbnMuCisgICAgTUNUYXJnZXRPcHRpb25zIE1DT3B0aW9uczsKKyAgfTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRTY2hlZHVsZS50ZCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldFNjaGVkdWxlLnRkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmYTliYWUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RhcmdldC9UYXJnZXRTY2hlZHVsZS50ZApAQCAtMCwwICsxLDQ0NCBAQAorLy89PT0tIFRhcmdldFNjaGVkdWxlLnRkIC0gVGFyZ2V0IEluZGVwZW5kZW50IFNjaGVkdWxpbmcgLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgdGFyZ2V0LWluZGVwZW5kZW50IHNjaGVkdWxpbmcgaW50ZXJmYWNlcyB3aGljaCBzaG91bGQKKy8vIGJlIGltcGxlbWVudGVkIGJ5IGVhY2ggdGFyZ2V0IHdoaWNoIGlzIHVzaW5nIFRhYmxlR2VuIGJhc2VkIHNjaGVkdWxpbmcuCisvLworLy8gVGhlIFNjaGVkTWFjaGluZU1vZGVsIGlzIGRlZmluZWQgYnkgc3VidGFyZ2V0cyBmb3IgdGhyZWUgY2F0ZWdvcmllcyBvZiBkYXRhOgorLy8gMS4gQmFzaWMgcHJvcGVydGllcyBmb3IgY29hcnNlIGdyYWluZWQgaW5zdHJ1Y3Rpb24gY29zdCBtb2RlbC4KKy8vIDIuIFNjaGVkdWxlciBSZWFkL1dyaXRlIHJlc291cmNlcyBmb3Igc2ltcGxlIHBlci1vcGNvZGUgY29zdCBtb2RlbC4KKy8vIDMuIEluc3RydWN0aW9uIGl0aW5lcmFyaWVzIGZvciBkZXRhaWxlZCByZXNlcnZhdGlvbiB0YWJsZXMuCisvLworLy8gKDEpIEJhc2ljIHByb3BlcnRpZXMgYXJlIGRlZmluZWQgYnkgdGhlIFNjaGVkTWFjaGluZU1vZGVsCisvLyBjbGFzcy4gVGFyZ2V0IGhvb2tzIGFsbG93IHN1YnRhcmdldHMgdG8gYXNzb2NpYXRlIG9wY29kZXMgd2l0aAorLy8gdGhvc2UgcHJvcGVydGllcy4KKy8vCisvLyAoMikgQSBwZXItb3BlcmFuZCBtYWNoaW5lIG1vZGVsIGNhbiBiZSBpbXBsZW1lbnRlZCBpbiBhbnkKKy8vIGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgd2F5czoKKy8vCisvLyBBLiBBc3NvY2lhdGUgcGVyLW9wZXJhbmQgU2NoZWRSZWFkV3JpdGUgdHlwZXMgd2l0aCBJbnN0cnVjdGlvbnMgYnkKKy8vIG1vZGlmeWluZyB0aGUgSW5zdHJ1Y3Rpb24gZGVmaW5pdGlvbiB0byBpbmhlcml0IGZyb20gU2NoZWQuIEZvcgorLy8gZWFjaCBzdWJ0YXJnZXQsIGRlZmluZSBXcml0ZVJlcyBhbmQgUmVhZEFkdmFuY2UgdG8gYXNzb2NpYXRlCisvLyBwcm9jZXNzb3IgcmVzb3VyY2VzIGFuZCBsYXRlbmN5IHdpdGggZWFjaCBTY2hlZFJlYWRXcml0ZSB0eXBlLgorLy8KKy8vIEIuIEluIGVhY2ggaW5zdHJ1Y3Rpb24gZGVmaW5pdGlvbiwgbmFtZSBhbiBJdGluZXJhcnlDbGFzcy4gRm9yIGVhY2gKKy8vIHN1YnRhcmdldCwgZGVmaW5lIEl0aW5SVyBlbnRyaWVzIHRvIG1hcCBJdGluZXJhcnlDbGFzcyB0bworLy8gcGVyLW9wZXJhbmQgU2NoZWRSZWFkV3JpdGUgdHlwZXMuIFVubGlrZSBtZXRob2QgQSwgdGhlc2UgdHlwZXMgbWF5CisvLyBiZSBzdWJ0YXJnZXQgc3BlY2lmaWMgYW5kIGNhbiBiZSBkaXJlY3RseSBhc3NvY2lhdGVkIHdpdGggcmVzb3VyY2VzCisvLyBieSBkZWZpbmluZyBTY2hlZFdyaXRlUmVzIGFuZCBTY2hlZFJlYWRBZHZhbmNlLgorLy8KKy8vIEMuIEluIHRoZSBzdWJ0YXJnZXQsIG1hcCBTY2hlZFJlYWRXcml0ZSB0eXBlcyB0byBzcGVjaWZpYworLy8gb3Bjb2Rlcy4gVGhpcyBvdmVycmlkZXMgYW55IFNjaGVkUmVhZFdyaXRlIHR5cGVzIG9yCisvLyBJdGluZXJhcnlDbGFzc2VzIGRlZmluZWQgYnkgdGhlIEluc3RydWN0aW9uLiBBcyBpbiBtZXRob2QgQiwgdGhlCisvLyBzdWJ0YXJnZXQgY2FuIGRpcmVjdGx5IGFzc29jaWF0ZSByZXNvdXJjZXMgd2l0aCBTY2hlZFJlYWRXcml0ZQorLy8gdHlwZXMgYnkgZGVmaW5pbmcgU2NoZWRXcml0ZVJlcyBhbmQgU2NoZWRSZWFkQWR2YW5jZS4KKy8vCisvLyBELiBJbiBlaXRoZXIgdGhlIHRhcmdldCBvciBzdWJ0YXJnZXQsIGRlZmluZSBTY2hlZFdyaXRlVmFyaWFudCBvcgorLy8gU2NoZWRSZWFkVmFyaWFudCB0byBtYXAgb25lIFNjaGVkUmVhZFdyaXRlIHR5cGUgb250byBhbm90aGVyCisvLyBzZXF1ZW5jZSBvZiBTY2hlZFJlYWRXcml0ZSB0eXBlcy4gVGhpcyBhbGxvd3MgZHluYW1pYyBzZWxlY3Rpb24gb2YKKy8vIGFuIGluc3RydWN0aW9uJ3MgbWFjaGluZSBtb2RlbCB2aWEgY3VzdG9tIEMrKyBjb2RlLiBJdCBhbHNvIGFsbG93cworLy8gYSBtYWNoaW5lLWluZGVwZW5kZW50IFNjaGVkUmVhZFdyaXRlIHR5cGUgdG8gbWFwIHRvIGEgc2VxdWVuY2Ugb2YKKy8vIG1hY2hpbmUtZGVwZW5kZW50IHR5cGVzLgorLy8KKy8vICgzKSBBIHBlci1waXBlbGluZS1zdGFnZSBtYWNoaW5lIG1vZGVsIGNhbiBiZSBpbXBsZW1lbnRlZCBieSBwcm92aWRpbmcKKy8vIEl0aW5lcmFyaWVzIGluIGFkZGl0aW9uIHRvIG1hcHBpbmcgaW5zdHJ1Y3Rpb25zIHRvIEl0aW5lcmFyeUNsYXNzZXMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisvLyBJbmNsdWRlIGxlZ2FjeSBzdXBwb3J0IGZvciBpbnN0cnVjdGlvbiBpdGluZXJhcmllcy4KK2luY2x1ZGUgImxsdm0vVGFyZ2V0L1RhcmdldEl0aW5lcmFyeS50ZCIKKworY2xhc3MgSW5zdHJ1Y3Rpb247IC8vIEZvcndhcmQgZGVmCisKK2NsYXNzIFByZWRpY2F0ZTsgLy8gRm9yd2FyZCBkZWYKKworLy8gREFHIG9wZXJhdG9yIHRoYXQgaW50ZXJwcmV0cyB0aGUgREFHIGFyZ3MgYXMgSW5zdHJ1Y3Rpb24gZGVmcy4KK2RlZiBpbnN0cnM7CisKKy8vIERBRyBvcGVyYXRvciB0aGF0IGludGVycHJldHMgZWFjaCBEQUcgYXJnIGFzIGEgcmVnZXggcGF0dGVybiBmb3IKKy8vIG1hdGNoaW5nIEluc3RydWN0aW9uIG9wY29kZSBuYW1lcy4KKy8vIFRoZSByZWdleCBtdXN0IG1hdGNoIHRoZSBiZWdpbm5pbmcgb2YgdGhlIG9wY29kZSAoYXMgaW4gUHl0aG9uIHJlLm1hdGNoKS4KKy8vIFRvIGF2b2lkIG1hdGNoaW5nIHByZWZpeGVzLCBhcHBlbmQgJyQnIHRvIHRoZSBwYXR0ZXJuLgorZGVmIGluc3RyZWdleDsKKworLy8gRGVmaW5lIHRoZSBTY2hlZE1hY2hpbmVNb2RlbCBhbmQgcHJvdmlkZSBiYXNpYyBwcm9wZXJ0aWVzIGZvcgorLy8gY29hcnNlIGdyYWluZWQgaW5zdHJ1Y3Rpb24gY29zdCBtb2RlbC4gRGVmYXVsdCB2YWx1ZXMgZm9yIHRoZQorLy8gcHJvcGVydGllcyBhcmUgZGVmaW5lZCBpbiBNQ1NjaGVkTW9kZWwuIEEgdmFsdWUgb2YgIi0xIiBpbiB0aGUKKy8vIHRhcmdldCBkZXNjcmlwdGlvbidzIFNjaGVkTWFjaGluZU1vZGVsIGluZGljYXRlcyB0aGF0IHRoZSBwcm9wZXJ0eQorLy8gaXMgbm90IG92ZXJyaWRlbiBieSB0aGUgdGFyZ2V0LgorLy8KKy8vIFRhcmdldCBob29rcyBhbGxvdyBzdWJ0YXJnZXRzIHRvIGFzc29jaWF0ZSBMb2FkTGF0ZW5jeSBhbmQKKy8vIEhpZ2hMYXRlbmN5IHdpdGggZ3JvdXBzIG9mIG9wY29kZXMuCisvLworLy8gU2VlIE1DU2NoZWR1bGUuaCBmb3IgZGV0YWlsZWQgY29tbWVudHMuCitjbGFzcyBTY2hlZE1hY2hpbmVNb2RlbCB7CisgIGludCBJc3N1ZVdpZHRoID0gLTE7IC8vIE1heCBtaWNyby1vcHMgdGhhdCBtYXkgYmUgc2NoZWR1bGVkIHBlciBjeWNsZS4KKyAgaW50IE1pY3JvT3BCdWZmZXJTaXplID0gLTE7IC8vIE1heCBtaWNyby1vcHMgdGhhdCBjYW4gYmUgYnVmZmVyZWQuCisgIGludCBMb29wTWljcm9PcEJ1ZmZlclNpemUgPSAtMTsgLy8gTWF4IG1pY3JvLW9wcyB0aGF0IGNhbiBiZSBidWZmZXJlZCBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvcHRpbWl6ZWQgbG9vcCBkaXNwYXRjaC9leGVjdXRpb24uCisgIGludCBMb2FkTGF0ZW5jeSA9IC0xOyAvLyBDeWNsZXMgZm9yIGxvYWRzIHRvIGFjY2VzcyB0aGUgY2FjaGUuCisgIGludCBIaWdoTGF0ZW5jeSA9IC0xOyAvLyBBcHByb3hpbWF0aW9uIG9mIGN5Y2xlcyBmb3IgImhpZ2ggbGF0ZW5jeSIgb3BzLgorICBpbnQgTWlzcHJlZGljdFBlbmFsdHkgPSAtMTsgLy8gRXh0cmEgY3ljbGVzIGZvciBhIG1pc3ByZWRpY3RlZCBicmFuY2guCisKKyAgLy8gUGVyLWN5Y2xlIHJlc291cmNlcyB0YWJsZXMuCisgIFByb2Nlc3Nvckl0aW5lcmFyaWVzIEl0aW5lcmFyaWVzID0gTm9JdGluZXJhcmllczsKKworICBiaXQgUG9zdFJBU2NoZWR1bGVyID0gMDsgLy8gRW5hYmxlIFBvc3QgUmVnQWxsb2MgU2NoZWR1bGVyIHBhc3MuCisKKyAgLy8gU3VidGFyZ2V0cyB0aGF0IGRlZmluZSBhIG1vZGVsIGZvciBvbmx5IGEgc3Vic2V0IG9mIGluc3RydWN0aW9ucworICAvLyB0aGF0IGhhdmUgYSBzY2hlZHVsaW5nIGNsYXNzIChpdGluZXJhcnkgY2xhc3Mgb3IgU2NoZWRSVyBsaXN0KQorICAvLyBhbmQgbWF5IGFjdHVhbGx5IGJlIGdlbmVyYXRlZCBmb3IgdGhhdCBzdWJ0YXJnZXQgbXVzdCBjbGVhciB0aGlzCisgIC8vIGJpdC4gT3RoZXJ3aXNlLCB0aGUgc2NoZWR1bGVyIGNvbnNpZGVycyBhbiB1bm1vZGVsbGVkIG9wY29kZSB0bworICAvLyBiZSBhbiBlcnJvci4gVGhpcyBzaG91bGQgb25seSBiZSBzZXQgZHVyaW5nIGluaXRpYWwgYnJpbmd1cCwKKyAgLy8gb3IgdGhlcmUgd2lsbCBiZSBubyB3YXkgdG8gY2F0Y2ggc2ltcGxlIGVycm9ycyBpbiB0aGUgbW9kZWwKKyAgLy8gcmVzdWx0aW5nIGZyb20gY2hhbmdlcyB0byB0aGUgaW5zdHJ1Y3Rpb24gZGVmaW5pdGlvbnMuCisgIGJpdCBDb21wbGV0ZU1vZGVsID0gMTsKKworICAvLyBJbmRpY2F0ZXMgdGhhdCB3ZSBzaG91bGQgZG8gZnVsbCBvdmVybGFwIGNoZWNraW5nIGZvciBtdWx0aXBsZSBJbnN0clJXcworICAvLyBkZWZpbmluaW5nIHRoZSBzYW1lIGluc3RydWN0aW9ucyB3aXRoaW4gdGhlIHNhbWUgU2NoZWRNYWNoaW5lTW9kZWwuCisgIC8vIEZJWE1FOiBSZW1vdmUgd2hlbiBhbGwgaW4gdHJlZSB0YXJnZXRzIGFyZSBjbGVhbiB3aXRoIHRoZSBmdWxsIGNoZWNrCisgIC8vIGVuYWJsZWQuCisgIGJpdCBGdWxsSW5zdFJXT3ZlcmxhcENoZWNrID0gMTsKKworICAvLyBBIHByb2Nlc3NvciBtYXkgb25seSBpbXBsZW1lbnQgcGFydCBvZiBwdWJsaXNoZWQgSVNBLCBkdWUgdG8gZWl0aGVyIG5ldyBJU0EKKyAgLy8gZXh0ZW5zaW9ucywgKGUuZy4gUGVudGl1bSA0IGRvZXNuJ3QgaGF2ZSBBVlgpIG9yIGltcGxlbWVudGF0aW9uCisgIC8vIChBUk0vTUlQUy9Qb3dlclBDL1NQQVJDIHNvZnQgZmxvYXQgY29yZXMpLgorICAvLworICAvLyBGb3IgYSBwcm9jZXNzb3Igd2hpY2ggZG9lc24ndCBzdXBwb3J0IHNvbWUgZmVhdHVyZShzKSwgdGhlIHNjaGVkdWxlIG1vZGVsCisgIC8vIGNhbiB1c2U6CisgIC8vCisgIC8vIGxldDxQcmVkaWNhdGU+IFVuc3VwcG9ydGVkRmVhdHVyZXMgPSBbSGF2ZUEsLi4sSGF2ZVldOworICAvLworICAvLyB0byBza2lwIHRoZSBjaGVja3MgZm9yIHNjaGVkdWxpbmcgaW5mb3JtYXRpb24gd2hlbiBidWlsZGluZyBMTFZNIGZvcgorICAvLyBpbnN0cnVjdGlvbnMgd2hpY2ggaGF2ZSBhbnkgb2YgdGhlIGxpc3RlZCBwcmVkaWNhdGVzIGluIHRoZWlyIFByZWRpY2F0ZXMKKyAgLy8gZmllbGQuCisgIGxpc3Q8UHJlZGljYXRlPiBVbnN1cHBvcnRlZEZlYXR1cmVzID0gW107CisKKyAgYml0IE5vTW9kZWwgPSAwOyAvLyBTcGVjaWFsIHRhZyB0byBpbmRpY2F0ZSBtaXNzaW5nIG1hY2hpbmUgbW9kZWwuCit9CisKK2RlZiBOb1NjaGVkTW9kZWwgOiBTY2hlZE1hY2hpbmVNb2RlbCB7CisgIGxldCBOb01vZGVsID0gMTsKKyAgbGV0IENvbXBsZXRlTW9kZWwgPSAwOworfQorCisvLyBEZWZpbmUgYSBraW5kIG9mIHByb2Nlc3NvciByZXNvdXJjZSB0aGF0IG1heSBiZSBjb21tb24gYWNyb3NzCisvLyBzaW1pbGFyIHN1YnRhcmdldHMuCitjbGFzcyBQcm9jUmVzb3VyY2VLaW5kOworCisvLyBEZWZpbmUgYSBudW1iZXIgb2YgaW50ZXJjaGFuZ2VhYmxlIHByb2Nlc3NvciByZXNvdXJjZXMuIE51bVVuaXRzCisvLyBkZXRlcm1pbmVzIHRoZSB0aHJvdWdocHV0IG9mIGluc3RydWN0aW9ucyB0aGF0IHJlcXVpcmUgdGhlIHJlc291cmNlLgorLy8KKy8vIEFuIG9wdGlvbmFsIFN1cGVyIHJlc291cmNlIG1heSBiZSBnaXZlbiB0byBtb2RlbCB0aGVzZSByZXNvdXJjZXMgYXMKKy8vIGEgc3Vic2V0IG9mIHRoZSBtb3JlIGdlbmVyYWwgc3VwZXIgcmVzb3VyY2VzLiBVc2luZyBvbmUgb2YgdGhlc2UKKy8vIHJlc291cmNlcyBpbXBsaWVzIHVzaW5nIG9uZSBvZiB0aGUgc3VwZXIgcmVzb3J1Y2VzLgorLy8KKy8vIFByb2NSZXNvdXJjZVVuaXRzIG5vcm1hbGx5IG1vZGVsIGEgZmV3IGJ1ZmZlcmVkIHJlc291cmNlcyB3aXRoaW4gYW4KKy8vIG91dC1vZi1vcmRlciBlbmdpbmUuIEJ1ZmZlcmVkIHJlc291cmNlcyBtYXkgYmUgaGVsZCBmb3IgbXVsdGlwbGUKKy8vIGNsb2NrIGN5Y2xlcywgYnV0IHRoZSBzY2hlZHVsZXIgZG9lcyBub3QgcGluIHRoZW0gdG8gYSBwYXJ0aWN1bGFyCisvLyBjbG9jayBjeWNsZSByZWxhdGl2ZSB0byBpbnN0cnVjdGlvbiBkaXNwYXRjaC4gU2V0dGluZyBCdWZmZXJTaXplPTAKKy8vIGNoYW5nZXMgdGhpcyB0byBhbiBpbi1vcmRlciBpc3N1ZS9kaXNwYXRjaCByZXNvdXJjZS4gSW4gdGhpcyBjYXNlLAorLy8gdGhlIHNjaGVkdWxlciBjb3VudHMgZG93biBmcm9tIHRoZSBjeWNsZSB0aGF0IHRoZSBpbnN0cnVjdGlvbgorLy8gaXNzdWVzIGluLW9yZGVyLCBmb3JjaW5nIGEgc3RhbGwgd2hlbmV2ZXIgYSBzdWJzZXF1ZW50IGluc3RydWN0aW9uCisvLyByZXF1aXJlcyB0aGUgc2FtZSByZXNvdXJjZSB1bnRpbCB0aGUgbnVtYmVyIG9mIFJlc291cmNlQ3ljbGVzCisvLyBzcGVjaWZpZWQgaW4gV3JpdGVSZXMgZXhwaXJlLiBTZXR0aW5nIEJ1ZmZlclNpemU9MSBjaGFuZ2VzIHRoaXMgdG8KKy8vIGFuIGluLW9yZGVyIGxhdGVuY3kgcmVzb3VyY2UuIEluIHRoaXMgY2FzZSwgdGhlIHNjaGVkdWxlciBtb2RlbHMKKy8vIHByb2R1Y2VyL2NvbnN1bWVyIHN0YWxscyBiZXR3ZWVuIGluc3RydWN0aW9ucyB0aGF0IHVzZSB0aGUKKy8vIHJlc291cmNlLgorLy8KKy8vIEV4YW1wbGVzIChhbGwgYXNzdW1lIGFuIG91dC1vZi1vcmRlciBlbmdpbmUpOgorLy8KKy8vIFVzZSBCdWZmZXJTaXplID0gLTEgZm9yICJpc3N1ZSBwb3J0cyIgZmVkIGJ5IGEgdW5pZmllZCByZXNlcnZhdGlvbgorLy8gc3RhdGlvbi4gSGVyZSB0aGUgc2l6ZSBvZiB0aGUgcmVzZXJ2YXRpb24gc3RhdGlvbiBpcyBtb2RlbGVkIGJ5CisvLyBNaWNyb09wQnVmZmVyU2l6ZSwgd2hpY2ggc2hvdWxkIGJlIHRoZSBtaW5pbXVtIHNpemUgb2YgZWl0aGVyIHRoZQorLy8gcmVnaXN0ZXIgcmVuYW1lIHBvb2wsIHVuaWZpZWQgcmVzZXJ2YXRpb24gc3RhdGlvbiwgb3IgcmVvcmRlcgorLy8gYnVmZmVyLgorLy8KKy8vIFVzZSBCdWZmZXJTaXplID0gMCBmb3IgcmVzb3VyY2VzIHRoYXQgZm9yY2UgImRpc3BhdGNoL2lzc3VlCisvLyBncm91cHMiLiAoRGlmZmVyZW50IHByb2Nlc3NvcnMgZGVmaW5lIGRpc3BhdGgvaXNzdWUKKy8vIGRpZmZlcmVudGx5LiBIZXJlIHdlIHJlZmVyIHRvIHN0YWdlIGJldHdlZW4gZGVjb2RpbmcgaW50byBtaWNyby1vcHMKKy8vIGFuZCBtb3ZpbmcgdGhlbSBpbnRvIGEgcmVzZXJ2YXRpb24gc3RhdGlvbi4pIE5vcm1hbGx5IE51bU1pY3JvT3BzCisvLyBpcyBzdWZmaWNpZW50IHRvIGxpbWl0IGRpc3BhdGNoL2lzc3VlIGdyb3Vwcy4gSG93ZXZlciwgc29tZQorLy8gcHJvY2Vzc29ycyBjYW4gZm9ybSBncm91cHMgb2Ygd2l0aCBvbmx5IGNlcnRhaW4gY29tYmluaXRpb25zIG9mCisvLyBpbnN0cnVjdGlvbiB0eXBlcy4gZS5nLiBQT1dFUjcuCisvLworLy8gVXNlIEJ1ZmZlclNpemUgPSAxIGZvciBpbi1vcmRlciBleGVjdXRpb24gdW5pdHMuIFRoaXMgaXMgdXNlZCBmb3IKKy8vIGFuIGluLW9yZGVyIHBpcGVsaW5lIHdpdGhpbiBhbiBvdXQtb2Ytb3JkZXIgY29yZSB3aGVyZSBzY2hlZHVsaW5nCisvLyBkZXBlbmRlbnQgb3BlcmF0aW9ucyBiYWNrLXRvLWJhY2sgaXMgZ3VhcmFudGVlZCB0byBjYXVzZSBhCisvLyBidWJibGUuIGUuZy4gQ29ydGV4LWE5IGZsb2F0aW5nLXBvaW50LgorLy8KKy8vIFVzZSBCdWZmZXJTaXplID4gMSBmb3Igb3V0LW9mLW9yZGVyIGV4ZWN1dGlvbnMgdW5pdHMgd2l0aCBhCisvLyBzZXBhcmF0ZSByZXNlcnZhdGlvbiBzdGF0aW9uLiBUaGlzIHNpbXBseSBtb2RlbHMgdGhlIHNpemUgb2YgdGhlCisvLyByZXNlcnZhdGlvbiBzdGF0aW9uLgorLy8KKy8vIFRvIG1vZGVsIGJvdGggZGlzcGF0Y2gvaXNzdWUgZ3JvdXBzIGFuZCBpbi1vcmRlciBleGVjdXRpb24gdW5pdHMsCisvLyBjcmVhdGUgdHdvIHR5cGVzIG9mIHVuaXRzLCBvbmUgd2l0aCBCdWZmZXJTaXplPTAgYW5kIG9uZSB3aXRoCisvLyBCdWZmZXJTaXplPTEuCisvLworLy8gU2NoZWRNb2RlbCB0aWVzIHRoZXNlIHVuaXRzIHRvIGEgcHJvY2Vzc29yIGZvciBhbnkgc3RhbmQtYWxvbmUgZGVmcworLy8gb2YgdGhpcyBjbGFzcy4KK2NsYXNzIFByb2NSZXNvdXJjZVVuaXRzPFByb2NSZXNvdXJjZUtpbmQga2luZCwgaW50IG51bT4geworICBQcm9jUmVzb3VyY2VLaW5kIEtpbmQgPSBraW5kOworICBpbnQgTnVtVW5pdHMgPSBudW07CisgIFByb2NSZXNvdXJjZUtpbmQgU3VwZXIgPSA/OworICBpbnQgQnVmZmVyU2l6ZSA9IC0xOworICBTY2hlZE1hY2hpbmVNb2RlbCBTY2hlZE1vZGVsID0gPzsKK30KKworLy8gRXBvbnltb3VzUHJvY1Jlc291cmNlS2luZCBoZWxwcyBpbXBsZW1lbnQgUHJvY1Jlc291cmNlVW5pdHMgYnkKKy8vIGFsbG93aW5nIGEgUHJvY1Jlc291cmNlVW5pdHMgZGVmaW5pdGlvbiB0byByZWZlcmVuY2UgaXRzZWxmLiBJdAorLy8gc2hvdWxkIG5vdCBiZSByZWZlcmVuY2VkIGFueXdoZXJlIGVsc2UuCitkZWYgRXBvbnltb3VzUHJvY1Jlc291cmNlS2luZCA6IFByb2NSZXNvdXJjZUtpbmQ7CisKKy8vIFN1YnRhcmdldHMgdHlwaWNhbGx5IGRlZmluZSBwcm9jZXNzb3IgcmVzb3VyY2Uga2luZCBhbmQgbnVtYmVyIG9mCisvLyB1bml0cyBpbiBvbmUgcGxhY2UuCitjbGFzcyBQcm9jUmVzb3VyY2U8aW50IG51bT4gOiBQcm9jUmVzb3VyY2VLaW5kLAorICBQcm9jUmVzb3VyY2VVbml0czxFcG9ueW1vdXNQcm9jUmVzb3VyY2VLaW5kLCBudW0+OworCitjbGFzcyBQcm9jUmVzR3JvdXA8bGlzdDxQcm9jUmVzb3VyY2U+IHJlc291cmNlcz4gOiBQcm9jUmVzb3VyY2VLaW5kIHsKKyAgbGlzdDxQcm9jUmVzb3VyY2U+IFJlc291cmNlcyA9IHJlc291cmNlczsKKyAgU2NoZWRNYWNoaW5lTW9kZWwgU2NoZWRNb2RlbCA9ID87CisgIGludCBCdWZmZXJTaXplID0gLTE7Cit9CisKKy8vIEEgdGFyZ2V0IGFyY2hpdGVjdHVyZSBtYXkgZGVmaW5lIFNjaGVkUmVhZFdyaXRlIHR5cGVzIGFuZCBhc3NvY2lhdGUKKy8vIHRoZW0gd2l0aCBpbnN0cnVjdGlvbiBvcGVyYW5kcy4KK2NsYXNzIFNjaGVkUmVhZFdyaXRlOworCisvLyBMaXN0IHRoZSBwZXItb3BlcmFuZCB0eXBlcyB0aGF0IG1hcCB0byB0aGUgbWFjaGluZSBtb2RlbCBvZiBhbgorLy8gaW5zdHJ1Y3Rpb24uIE9uZSBTY2hlZFdyaXRlIHR5cGUgbXVzdCBiZSBsaXN0ZWQgZm9yIGVhY2ggZXhwbGljaXQKKy8vIGRlZiBvcGVyYW5kIGluIG9yZGVyLiBBZGRpdGlvbmFsIFNjaGVkV3JpdGUgdHlwZXMgbWF5IG9wdGlvbmFsbHkgYmUKKy8vIGxpc3RlZCBmb3IgaW1wbGljaXQgZGVmIG9wZXJhbmRzLiAgU2NoZWRSZWFkIHR5cGVzIG1heSBvcHRpb25hbGx5CisvLyBiZSBsaXN0ZWQgZm9yIHVzZSBvcGVyYW5kcyBpbiBvcmRlci4gVGhlIG9yZGVyIG9mIGRlZnMgcmVsYXRpdmUgdG8KKy8vIHVzZXMgaXMgaW5zaWduaWZpY2FudC4gVGhpcyB3YXksIHRoZSBzYW1lIFNjaGVkUmVhZFdyaXRlIGxpc3QgbWF5CisvLyBiZSB1c2VkIGZvciBtdWx0aXBsZSBmb3JtcyBvZiBhbiBvcGVyYXRpb24uIEZvciBleGFtcGxlLCBhCisvLyB0d28tYWRkcmVzcyBpbnN0cnVjdGlvbiBjb3VsZCBoYXZlIHR3byB0aWVkIG9wZXJhbmRzIG9yIHNpbmdsZQorLy8gb3BlcmFuZCB0aGF0IGJvdGggcmVhZHMgYW5kIHdyaXRlcyBhIHJlZy4gSW4gYm90aCBjYXNlcyB3ZSBoYXZlIGEKKy8vIHNpbmdsZSBTY2hlZFdyaXRlIGFuZCBzaW5nbGUgU2NoZWRSZWFkIGluIGFueSBvcmRlci4KK2NsYXNzIFNjaGVkPGxpc3Q8U2NoZWRSZWFkV3JpdGU+IHNjaGVkcnc+IHsKKyAgbGlzdDxTY2hlZFJlYWRXcml0ZT4gU2NoZWRSVyA9IHNjaGVkcnc7Cit9CisKKy8vIERlZmluZSBhIHNjaGVkdWxlciByZXNvdXJjZSBhc3NvY2lhdGVkIHdpdGggYSBkZWYgb3BlcmFuZC4KK2NsYXNzIFNjaGVkV3JpdGUgOiBTY2hlZFJlYWRXcml0ZTsKK2RlZiBOb1dyaXRlIDogU2NoZWRXcml0ZTsKKworLy8gRGVmaW5lIGEgc2NoZWR1bGVyIHJlc291cmNlIGFzc29jaWF0ZWQgd2l0aCBhIHVzZSBvcGVyYW5kLgorY2xhc3MgU2NoZWRSZWFkICA6IFNjaGVkUmVhZFdyaXRlOworCisvLyBEZWZpbmUgYSBTY2hlZFdyaXRlIHRoYXQgaXMgbW9kZWxlZCBhcyBhIHNlcXVlbmNlIG9mIG90aGVyCisvLyBTY2hlZFdyaXRlcyB3aXRoIGFkZGl0aXZlIGxhdGVuY3kuIFRoaXMgYWxsb3dzIGEgc2luZ2xlIG9wZXJhbmQgdG8KKy8vIGJlIG1hcHBlZCB0aGUgcmVzb3VyY2VzIGNvbXBvc2VkIGZyb20gYSBzZXQgb2YgcHJldmlvdXNseSBkZWZpbmVkCisvLyBTY2hlZFdyaXRlcy4KKy8vCisvLyBJZiB0aGUgZmluYWwgd3JpdGUgaW4gdGhpcyBzZXF1ZW5jZSBpcyBhIFNjaGVkV3JpdGVWYXJpYW50IG1hcmtlZAorLy8gVmFyaWFkaWMsIHRoZW4gdGhlIGxpc3Qgb2YgcHJpb3Igd3JpdGVzIGFyZSBkaXN0cmlidXRlZCBhY3Jvc3MgYWxsCisvLyBvcGVyYW5kcyBhZnRlciByZXNvbHZpbmcgdGhlIHByZWRpY2F0ZSBmb3IgdGhlIGZpbmFsIHdyaXRlLgorLy8KKy8vIFNjaGVkTW9kZWwgc2lsZW5jZXMgd2FybmluZ3MgYnV0IGlzIGlnbm9yZWQuCitjbGFzcyBXcml0ZVNlcXVlbmNlPGxpc3Q8U2NoZWRXcml0ZT4gd3JpdGVzLCBpbnQgcmVwID0gMT4gOiBTY2hlZFdyaXRlIHsKKyAgbGlzdDxTY2hlZFdyaXRlPiBXcml0ZXMgPSB3cml0ZXM7CisgIGludCBSZXBlYXQgPSByZXA7CisgIFNjaGVkTWFjaGluZU1vZGVsIFNjaGVkTW9kZWwgPSA/OworfQorCisvLyBEZWZpbmUgdmFsdWVzIGNvbW1vbiB0byBXcml0ZVJlcyBhbmQgU2NoZWRXcml0ZVJlcy4KKy8vCisvLyBTY2hlZE1vZGVsIHRpZXMgdGhlc2UgcmVzb3VyY2VzIHRvIGEgcHJvY2Vzc29yLgorY2xhc3MgUHJvY1dyaXRlUmVzb3VyY2VzPGxpc3Q8UHJvY1Jlc291cmNlS2luZD4gcmVzb3VyY2VzPiB7CisgIGxpc3Q8UHJvY1Jlc291cmNlS2luZD4gUHJvY1Jlc291cmNlcyA9IHJlc291cmNlczsKKyAgbGlzdDxpbnQ+IFJlc291cmNlQ3ljbGVzID0gW107CisgIGludCBMYXRlbmN5ID0gMTsKKyAgaW50IE51bU1pY3JvT3BzID0gMTsKKyAgYml0IEJlZ2luR3JvdXAgPSAwOworICBiaXQgRW5kR3JvdXAgPSAwOworICAvLyBBbGxvdyBhIHByb2Nlc3NvciB0byBtYXJrIHNvbWUgc2NoZWR1bGluZyBjbGFzc2VzIGFzIHVuc3VwcG9ydGVkCisgIC8vIGZvciBzdHJvbmdlciB2ZXJpZmljYXRpb24uCisgIGJpdCBVbnN1cHBvcnRlZCA9IDA7CisgIC8vIEFsbG93IGEgcHJvY2Vzc29yIHRvIG1hcmsgc29tZSBzY2hlZHVsaW5nIGNsYXNzZXMgYXMgc2luZ2xlLWlzc3VlLgorICAvLyBTaW5nbGVJc3N1ZSBpcyBhbiBhbGlhcyBmb3IgQmVnaW4vRW5kIEdyb3VwLgorICBiaXQgU2luZ2xlSXNzdWUgPSAwOworICBTY2hlZE1hY2hpbmVNb2RlbCBTY2hlZE1vZGVsID0gPzsKK30KKworLy8gRGVmaW5lIHRoZSByZXNvdXJjZXMgYW5kIGxhdGVuY3kgb2YgYSBTY2hlZFdyaXRlLiBUaGlzIHdpbGwgYmUgdXNlZAorLy8gZGlyZWN0bHkgYnkgdGFyZ2V0cyB0aGF0IGhhdmUgbm8gaXRpbmVyYXJ5IGNsYXNzZXMuIEluIHRoaXMgY2FzZSwKKy8vIFNjaGVkV3JpdGUgaXMgZGVmaW5lZCBieSB0aGUgdGFyZ2V0LCB3aGlsZSBXcml0ZVJlc291cmNlcyBpcworLy8gZGVmaW5lZCBieSB0aGUgc3VidGFyZ2V0LCBhbmQgbWFwcyB0aGUgU2NoZWRXcml0ZSB0byBwcm9jZXNzb3IKKy8vIHJlc291cmNlcy4KKy8vCisvLyBJZiBhIHRhcmdldCBhbHJlYWR5IGhhcyBpdGluZXJhcnkgY2xhc3NlcywgU2NoZWRXcml0ZVJlc291cmNlcyBjYW4KKy8vIGJlIHVzZWQgaW5zdGVhZCB0byBkZWZpbmUgc3VidGFyZ2V0IHNwZWNpZmljIFNjaGVkV3JpdGVzIGFuZCBtYXAKKy8vIHRoZW0gdG8gcHJvY2Vzc29yIHJlc291cmNlcyBpbiBvbmUgcGxhY2UuIFRoZW4gSXRpblJXIGNhbiBtYXAKKy8vIGl0aW5lcmFyeSBjbGFzc2VzIHRvIHRoZSBzdWJ0YXJnZXQncyBTY2hlZFdyaXRlcy4KKy8vCisvLyBQcm9jUmVzb3VyY2VzIGluZGljYXRlcyB0aGUgc2V0IG9mIHJlc291cmNlcyBjb25zdW1lZCBieSB0aGUgd3JpdGUuCisvLyBPcHRpb25hbGx5LCBSZXNvdXJjZUN5Y2xlcyBpbmRpY2F0ZXMgdGhlIG51bWJlciBvZiBjeWNsZXMgdGhlCisvLyByZXNvdXJjZSBpcyBjb25zdW1lZC4gRWFjaCBSZXNvdXJjZUN5Y2xlcyBpdGVtIGlzIHBhaXJlZCB3aXRoIHRoZQorLy8gUHJvY1Jlc291cmNlIGl0ZW0gYXQgdGhlIHNhbWUgcG9zaXRpb24gaW4gaXRzIGxpc3QuIFNpbmNlCisvLyBSZXNvdXJjZUN5Y2xlcyBhcmUgcmFyZWx5IHNwZWNpYWxpemVkLCB0aGUgbGlzdCBtYXkgYmUKKy8vIGluY29tcGxldGUuIEJ5IGRlZmF1bHQsIHJlc291cmNlcyBhcmUgY29uc3VtZWQgZm9yIGEgc2luZ2xlIGN5Y2xlLAorLy8gcmVnYXJkbGVzcyBvZiBsYXRlbmN5LCB3aGljaCBtb2RlbHMgYSBmdWxseSBwaXBlbGluZWQgcHJvY2Vzc2luZworLy8gdW5pdC4gQSB2YWx1ZSBvZiAwIGZvciBSZXNvdXJjZUN5Y2xlcyBtZWFucyB0aGF0IHRoZSByZXNvdXJjZSBtdXN0CisvLyBiZSBhdmFpbGFibGUgYnV0IGlzIG5vdCBjb25zdW1lZCwgd2hpY2ggaXMgb25seSByZWxldmFudCBmb3IKKy8vIHVuYnVmZmVyZWQgcmVzb3VyY2VzLgorLy8KKy8vIEJ5IGRlZmF1bHQsIGVhY2ggU2NoZWRXcml0ZSB0YWtlcyBvbmUgbWljcm8tb3AsIHdoaWNoIGlzIGNvdW50ZWQKKy8vIGFnYWluc3QgdGhlIHByb2Nlc3NvcidzIElzc3VlV2lkdGggbGltaXQuIElmIGFuIGluc3RydWN0aW9uIGNhbgorLy8gd3JpdGUgbXVsdGlwbGUgcmVnaXN0ZXJzIHdpdGggYSBzaW5nbGUgbWljcm8tb3AsIHRoZSBzdWJ0YXJnZXQKKy8vIHNob3VsZCBkZWZpbmUgb25lIG9mIHRoZSB3cml0ZXMgdG8gYmUgemVybyBtaWNyby1vcHMuIElmIGEKKy8vIHN1YnRhcmdldCByZXF1aXJlcyBtdWx0aXBsZSBtaWNyby1vcHMgdG8gd3JpdGUgYSBzaW5nbGUgcmVzdWx0LCBpdAorLy8gc2hvdWxkIGVpdGhlciBvdmVycmlkZSB0aGUgd3JpdGUncyBOdW1NaWNyb09wcyB0byBiZSBncmVhdGVyIHRoYW4gMQorLy8gb3IgcmVxdWlyZSBhZGRpdGlvbmFsIHdyaXRlcy4gRXh0cmEgd3JpdGVzIGNhbiBiZSByZXF1aXJlZCBlaXRoZXIKKy8vIGJ5IGRlZmluaW5nIGEgV3JpdGVTZXF1ZW5jZSwgb3Igc2ltcGx5IGxpc3RpbmcgZXh0cmEgd3JpdGVzIGluIHRoZQorLy8gaW5zdHJ1Y3Rpb24ncyBsaXN0IG9mIHdyaXRlcnMgYmV5b25kIHRoZSBudW1iZXIgb2YgImRlZiIKKy8vIG9wZXJhbmRzLiBUaGUgc2NoZWR1bGVyIGFzc3VtZXMgdGhhdCBhbGwgbWljcm8tb3BzIG11c3QgYmUKKy8vIGRpc3BhdGNoZWQgaW4gdGhlIHNhbWUgY3ljbGUuIFRoZXNlIG1pY3JvLW9wcyBtYXkgYmUgcmVxdWlyZWQgdG8KKy8vIGJlZ2luIG9yIGVuZCB0aGUgY3VycmVudCBkaXNwYXRjaCBncm91cC4KK2NsYXNzIFdyaXRlUmVzPFNjaGVkV3JpdGUgd3JpdGUsIGxpc3Q8UHJvY1Jlc291cmNlS2luZD4gcmVzb3VyY2VzPgorICA6IFByb2NXcml0ZVJlc291cmNlczxyZXNvdXJjZXM+IHsKKyAgU2NoZWRXcml0ZSBXcml0ZVR5cGUgPSB3cml0ZTsKK30KKworLy8gRGlyZWN0bHkgbmFtZSBhIHNldCBvZiBXcml0ZVJlc291cmNlcyBkZWZpbmluZyBhIG5ldyBTY2hlZFdyaXRlCisvLyB0eXBlIGF0IHRoZSBzYW1lIHRpbWUuIFRoaXMgY2xhc3MgaXMgdW5hd2FyZSBvZiBpdHMgU2NoZWRNb2RlbCBzbworLy8gbXVzdCBiZSByZWZlcmVuY2VkIGJ5IEluc3RSVyBvciBJdGluUlcuCitjbGFzcyBTY2hlZFdyaXRlUmVzPGxpc3Q8UHJvY1Jlc291cmNlS2luZD4gcmVzb3VyY2VzPiA6IFNjaGVkV3JpdGUsCisgIFByb2NXcml0ZVJlc291cmNlczxyZXNvdXJjZXM+OworCisvLyBEZWZpbmUgdmFsdWVzIGNvbW1vbiB0byBSZWFkQWR2YW5jZSBhbmQgU2NoZWRSZWFkQWR2YW5jZS4KKy8vCisvLyBTY2hlZE1vZGVsIHRpZXMgdGhlc2UgcmVzb3VyY2VzIHRvIGEgcHJvY2Vzc29yLgorY2xhc3MgUHJvY1JlYWRBZHZhbmNlPGludCBjeWNsZXMsIGxpc3Q8U2NoZWRXcml0ZT4gd3JpdGVzID0gW10+IHsKKyAgaW50IEN5Y2xlcyA9IGN5Y2xlczsKKyAgbGlzdDxTY2hlZFdyaXRlPiBWYWxpZFdyaXRlcyA9IHdyaXRlczsKKyAgLy8gQWxsb3cgYSBwcm9jZXNzb3IgdG8gbWFyayBzb21lIHNjaGVkdWxpbmcgY2xhc3NlcyBhcyB1bnN1cHBvcnRlZAorICAvLyBmb3Igc3Ryb25nZXIgdmVyaWZpY2F0aW9uLgorICBiaXQgVW5zdXBwb3J0ZWQgPSAwOworICBTY2hlZE1hY2hpbmVNb2RlbCBTY2hlZE1vZGVsID0gPzsKK30KKworLy8gQSBwcm9jZXNzb3IgbWF5IGRlZmluZSBhIFJlYWRBZHZhbmNlIGFzc29jaWF0ZWQgd2l0aCBhIFNjaGVkUmVhZAorLy8gdG8gcmVkdWNlIGxhdGVuY3kgb2YgYSBwcmlvciB3cml0ZSBieSBOIGN5Y2xlcy4gQSBuZWdhdGl2ZSBhZHZhbmNlCisvLyBlZmZlY3RpdmVseSBpbmNyZWFzZXMgbGF0ZW5jeSwgd2hpY2ggbWF5IGJlIHVzZWQgZm9yIGNyb3NzLWRvbWFpbgorLy8gc3RhbGxzLgorLy8KKy8vIEEgUmVhZEFkdmFuY2UgbWF5IGJlIGFzc29jaWF0ZWQgd2l0aCBhIGxpc3Qgb2YgU2NoZWRXcml0ZXMKKy8vIHRvIGltcGxlbWVudCBwaXBlbGluZSBieXBhc3MuIFRoZSBXcml0ZXMgbGlzdCBtYXkgYmUgZW1wdHkgdG8KKy8vIGluZGljYXRlIG9wZXJhbmRzIHRoYXQgYXJlIGFsd2F5cyByZWFkIHRoaXMgbnVtYmVyIG9mIEN5Y2xlcyBsYXRlcgorLy8gdGhhbiBhIG5vcm1hbCByZWdpc3RlciByZWFkLCBhbGxvd2luZyB0aGUgcmVhZCdzIHBhcmVudCBpbnN0cnVjdGlvbgorLy8gdG8gaXNzdWUgZWFybGllciByZWxhdGl2ZSB0byB0aGUgd3JpdGVyLgorY2xhc3MgUmVhZEFkdmFuY2U8U2NoZWRSZWFkIHJlYWQsIGludCBjeWNsZXMsIGxpc3Q8U2NoZWRXcml0ZT4gd3JpdGVzID0gW10+CisgIDogUHJvY1JlYWRBZHZhbmNlPGN5Y2xlcywgd3JpdGVzPiB7CisgIFNjaGVkUmVhZCBSZWFkVHlwZSA9IHJlYWQ7Cit9CisKKy8vIERpcmVjdGx5IGFzc29jaWF0ZSBhIG5ldyBTY2hlZFJlYWQgdHlwZSB3aXRoIGEgZGVsYXkgYW5kIG9wdGlvbmFsCisvLyBwaXBlbGluZSBieXBhc3MuIEZvciB1c2Ugd2l0aCBJbnN0Ulcgb3IgSXRpblJXLgorY2xhc3MgU2NoZWRSZWFkQWR2YW5jZTxpbnQgY3ljbGVzLCBsaXN0PFNjaGVkV3JpdGU+IHdyaXRlcyA9IFtdPiA6IFNjaGVkUmVhZCwKKyAgUHJvY1JlYWRBZHZhbmNlPGN5Y2xlcywgd3JpdGVzPjsKKworLy8gRGVmaW5lIFNjaGVkUmVhZCBkZWZhdWx0cy4gUmVhZHMgc2VsZG9tIG5lZWQgc3BlY2lhbCB0cmVhdG1lbnQuCitkZWYgUmVhZERlZmF1bHQgOiBTY2hlZFJlYWQ7CitkZWYgTm9SZWFkQWR2YW5jZSA6IFNjaGVkUmVhZEFkdmFuY2U8MD47CisKKy8vIERlZmluZSBzaGFyZWQgY29kZSB0aGF0IHdpbGwgYmUgaW4gdGhlIHNhbWUgc2NvcGUgYXMgYWxsCisvLyBTY2hlZFByZWRpY2F0ZXMuIEF2YWlsYWJsZSB2YXJpYWJsZXMgYXJlOgorLy8gKGNvbnN0IE1hY2hpbmVJbnN0ciAqTUksIGNvbnN0IFRhcmdldFNjaGVkTW9kZWwgKlNjaGVkTW9kZWwpCitjbGFzcyBQcmVkaWNhdGVQcm9sb2c8Y29kZSBjPiB7CisgIGNvZGUgQ29kZSA9IGM7Cit9CisKKy8vIERlZmluZSBhIHByZWRpY2F0ZSB0byBkZXRlcm1pbmUgd2hpY2ggU2NoZWRWYXJpYW50IGFwcGxpZXMgdG8gYQorLy8gcGFydGljdWxhciBNYWNoaW5lSW5zdHIuIFRoZSBjb2RlIHNuaXBwZXQgaXMgdXNlZCBhcyBhbgorLy8gaWYtc3RhdGVtZW50J3MgZXhwcmVzc2lvbi4gQXZhaWxhYmxlIHZhcmlhYmxlcyBhcmUgTUksIFNjaGVkTW9kZWwsCisvLyBhbmQgYW55dGhpbmcgZGVmaW5lZCBpbiBhIFByZWRpY2F0ZVByb2xvZy4KKy8vCisvLyBTY2hlZE1vZGVsIHNpbGVuY2VzIHdhcm5pbmdzIGJ1dCBpcyBpZ25vcmVkLgorY2xhc3MgU2NoZWRQcmVkaWNhdGU8Y29kZSBwcmVkPiB7CisgIFNjaGVkTWFjaGluZU1vZGVsIFNjaGVkTW9kZWwgPSA/OworICBjb2RlIFByZWRpY2F0ZSA9IHByZWQ7Cit9CitkZWYgTm9TY2hlZFByZWQgOiBTY2hlZFByZWRpY2F0ZTxbe3RydWV9XT47CisKKy8vIEFzc29jaWF0ZSBhIHByZWRpY2F0ZSB3aXRoIGEgbGlzdCBvZiBTY2hlZFJlYWRXcml0ZXMuIEJ5IGRlZmF1bHQsCisvLyB0aGUgc2VsZWN0ZWQgU2NoZWRSZWFkV3JpdGVzIGFyZSBzdGlsbCBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUKKy8vIG9wZXJhbmQgYW5kIGFzc3VtZWQgdG8gZXhlY3V0ZSBzZXF1ZW50aWFsbHkgd2l0aCBhZGRpdGl2ZQorLy8gbGF0ZW5jeS4gSG93ZXZlciwgaWYgdGhlIHBhcmVudCBTY2hlZFdyaXRlVmFyaWFudCBvcgorLy8gU2NoZWRSZWFkVmFyaWFudCBpcyBtYXJrZWQgIlZhcmlhZGljIiwgdGhlbiBlYWNoIFNlbGVjdGVkCisvLyBTY2hlZFJlYWRXcml0ZSBpcyBtYXBwZWQgaW4gcGxhY2UgdG8gdGhlIGluc3RydWN0aW9uJ3MgdmFyaWFkaWMKKy8vIG9wZXJhbmRzLiBJbiB0aGlzIGNhc2UsIGxhdGVuY3kgaXMgbm90IGFkZGl0aXZlLiBJZiB0aGUgY3VycmVudCBWYXJpYW50CisvLyBpcyBhbHJlYWR5IHBhcnQgb2YgYSBTZXF1ZW5jZSwgdGhlbiB0aGF0IGVudGlyZSBjaGFpbiBsZWFkaW5nIHVwIHRvCisvLyB0aGUgVmFyaWFudCBpcyBkaXN0cmlidXRlZCBvdmVyIHRoZSB2YXJpYWRpYyBvcGVyYW5kcy4KK2NsYXNzIFNjaGVkVmFyPFNjaGVkUHJlZGljYXRlIHByZWQsIGxpc3Q8U2NoZWRSZWFkV3JpdGU+IHNlbGVjdGVkPiB7CisgIFNjaGVkUHJlZGljYXRlIFByZWRpY2F0ZSA9IHByZWQ7CisgIGxpc3Q8U2NoZWRSZWFkV3JpdGU+IFNlbGVjdGVkID0gc2VsZWN0ZWQ7Cit9CisKKy8vIFNjaGVkTW9kZWwgc2lsZW5jZXMgd2FybmluZ3MgYnV0IGlzIGlnbm9yZWQuCitjbGFzcyBTY2hlZFZhcmlhbnQ8bGlzdDxTY2hlZFZhcj4gdmFyaWFudHM+IHsKKyAgbGlzdDxTY2hlZFZhcj4gVmFyaWFudHMgPSB2YXJpYW50czsKKyAgYml0IFZhcmlhZGljID0gMDsKKyAgU2NoZWRNYWNoaW5lTW9kZWwgU2NoZWRNb2RlbCA9ID87Cit9CisKKy8vIEEgU2NoZWRXcml0ZVZhcmlhbnQgaXMgYSBzaW5nbGUgU2NoZWRXcml0ZSB0eXBlIHRoYXQgbWFwcyB0byBhIGxpc3QKKy8vIG9mIFNjaGVkV3JpdGUgdHlwZXMgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZGVmaW5lZCBieSBpdHMgcHJlZGljYXRlcy4KKy8vCisvLyBBIFZhcmlhZGljIHdyaXRlIGlzIGV4cGFuZGVkIHRvIGNvdmVyIG11bHRpcGxlICJkZWYiIG9wZXJhbmRzLiBUaGUKKy8vIFNjaGVkVmFyaWFudCdzIEV4cGFuc2lvbiBsaXN0IGlzIHRoZW4gaW50ZXJwcmV0ZWQgYXMgb25lIHdyaXRlCisvLyBwZXItb3BlcmFuZCBpbnN0ZWFkIG9mIHRoZSB1c3VhbCBzZXF1ZW50aWFsIHdyaXRlcyBmZWVkaW5nIGEgc2luZ2xlCisvLyBvcGVyYW5kLgorY2xhc3MgU2NoZWRXcml0ZVZhcmlhbnQ8bGlzdDxTY2hlZFZhcj4gdmFyaWFudHM+IDogU2NoZWRXcml0ZSwKKyAgU2NoZWRWYXJpYW50PHZhcmlhbnRzPiB7Cit9CisKKy8vIEEgU2NoZWRSZWFkVmFyaWFudCBpcyBhIHNpbmdsZSBTY2hlZFJlYWQgdHlwZSB0aGF0IG1hcHMgdG8gYSBsaXN0CisvLyBvZiBTY2hlZFJlYWQgdHlwZXMgdW5kZXIgdGhlIGNvbmRpdGlvbnMgZGVmaW5lZCBieSBpdHMgcHJlZGljYXRlcy4KKy8vCisvLyBBIFZhcmlhZGljIHdyaXRlIGlzIGV4cGFuZGVkIHRvIGNvdmVyIG11bHRpcGxlICJyZWFkc1JlZyIgb3BlcmFuZHMgYXMKKy8vIGV4cGxhaW5lZCBhYm92ZS4KK2NsYXNzIFNjaGVkUmVhZFZhcmlhbnQ8bGlzdDxTY2hlZFZhcj4gdmFyaWFudHM+IDogU2NoZWRSZWFkLAorICBTY2hlZFZhcmlhbnQ8dmFyaWFudHM+IHsKK30KKworLy8gTWFwIGEgc2V0IG9mIG9wY29kZXMgdG8gYSBsaXN0IG9mIFNjaGVkUmVhZFdyaXRlIHR5cGVzLiBUaGlzIGFsbG93cworLy8gdGhlIHN1YnRhcmdldCB0byBlYXNpbHkgb3ZlcnJpZGUgc3BlY2lmaWMgb3BlcmF0aW9ucy4KKy8vCisvLyBTY2hlZE1vZGVsIHRpZXMgdGhpcyBvcGNvZGUgbWFwcGluZyB0byBhIHByb2Nlc3Nvci4KK2NsYXNzIEluc3RSVzxsaXN0PFNjaGVkUmVhZFdyaXRlPiBydywgZGFnIGluc3RybGlzdD4geworICBsaXN0PFNjaGVkUmVhZFdyaXRlPiBPcGVyYW5kUmVhZFdyaXRlcyA9IHJ3OworICBkYWcgSW5zdHJzID0gaW5zdHJsaXN0OworICBTY2hlZE1hY2hpbmVNb2RlbCBTY2hlZE1vZGVsID0gPzsKKyAgLy8gQWxsb3cgYSBzdWJ0YXJnZXQgdG8gbWFyayBzb21lIGluc3RydWN0aW9ucyBhcyB1bnN1cHBvcnRlZC4KKyAgYml0IFVuc3VwcG9ydGVkID0gMDsKK30KKworLy8gTWFwIGEgc2V0IG9mIGl0aW5lcmFyeSBjbGFzc2VzIHRvIFNjaGVkUmVhZFdyaXRlIHJlc291cmNlcy4gVGhpcyBpcworLy8gdXNlZCB0byBib290c3RyYXAgYSB0YXJnZXQgKGUuZy4gQVJNKSB3aGVuIGl0aW5lcmFyaWVzIGFscmVhZHkKKy8vIGV4aXN0IGFuZCBjaGFuZ2luZyBJbnN0ckluZm8gaXMgdW5kZXNpcmFibGUuCisvLworLy8gU2NoZWRNb2RlbCB0aWVzIHRoaXMgSXRpbmVyYXJ5Q2xhc3MgbWFwcGluZyB0byBhIHByb2Nlc3Nvci4KK2NsYXNzIEl0aW5SVzxsaXN0PFNjaGVkUmVhZFdyaXRlPiBydywgbGlzdDxJbnN0ckl0aW5DbGFzcz4gaWljPiB7CisgIGxpc3Q8SW5zdHJJdGluQ2xhc3M+IE1hdGNoZWRJdGluQ2xhc3NlcyA9IGlpYzsKKyAgbGlzdDxTY2hlZFJlYWRXcml0ZT4gT3BlcmFuZFJlYWRXcml0ZXMgPSBydzsKKyAgU2NoZWRNYWNoaW5lTW9kZWwgU2NoZWRNb2RlbCA9ID87Cit9CisKKy8vIEFsaWFzIGEgdGFyZ2V0LWRlZmluZWQgU2NoZWRSZWFkV3JpdGUgdG8gYSBwcm9jZXNzb3Igc3BlY2lmaWMKKy8vIFNjaGVkUmVhZFdyaXRlLiBUaGlzIGFsbG93cyBhIHN1YnRhcmdldCB0byBlYXNpbHkgbWFwIGEKKy8vIFNjaGVkUmVhZFdyaXRlIHR5cGUgb250byBhIFdyaXRlU2VxdWVuY2UsIFNjaGVkV3JpdGVWYXJpYW50LCBvcgorLy8gU2NoZWRSZWFkVmFyaWFudC4KKy8vCisvLyBTY2hlZE1vZGVsIHdpbGwgdXN1YWxseSBiZSBwcm92aWRlZCBieSBzdXJyb3VuZGluZyBsZXQgc3RhdGVtZW50CisvLyBhbmQgdGllcyB0aGlzIFNjaGVkQWxpYXMgbWFwcGluZyB0byBhIHByb2Nlc3Nvci4KK2NsYXNzIFNjaGVkQWxpYXM8U2NoZWRSZWFkV3JpdGUgbWF0Y2gsIFNjaGVkUmVhZFdyaXRlIGFsaWFzPiB7CisgIFNjaGVkUmVhZFdyaXRlIE1hdGNoUlcgPSBtYXRjaDsKKyAgU2NoZWRSZWFkV3JpdGUgQWxpYXNSVyA9IGFsaWFzOworICBTY2hlZE1hY2hpbmVNb2RlbCBTY2hlZE1vZGVsID0gPzsKK30KZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldFNlbGVjdGlvbkRBRy50ZCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGFyZ2V0L1RhcmdldFNlbGVjdGlvbkRBRy50ZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YmE4ZjdlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UYXJnZXQvVGFyZ2V0U2VsZWN0aW9uREFHLnRkCkBAIC0wLDAgKzEsMTMyNiBAQAorLy89PT0tIFRhcmdldFNlbGVjdGlvbkRBRy50ZCAtIENvbW1vbiBjb2RlIGZvciBEQUcgaXNlbHMgLS0tKi0gdGFibGVnZW4gLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgdGFyZ2V0LWluZGVwZW5kZW50IGludGVyZmFjZXMgdXNlZCBieSBTZWxlY3Rpb25EQUcKKy8vIGluc3RydWN0aW9uIHNlbGVjdGlvbiBnZW5lcmF0b3JzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTZWxlY3Rpb24gREFHIFR5cGUgQ29uc3RyYWludCBkZWZpbml0aW9ucy4KKy8vCisvLyBOb3RlIHRoYXQgdGhlIHNlbWFudGljcyBvZiB0aGVzZSBjb25zdHJhaW50cyBhcmUgaGFyZCBjb2RlZCBpbnRvIHRibGdlbi4gIFRvCisvLyBtb2RpZnkgb3IgYWRkIGNvbnN0cmFpbnRzLCB5b3UgaGF2ZSB0byBoYWNrIHRibGdlbi4KKy8vCisKK2NsYXNzIFNEVHlwZUNvbnN0cmFpbnQ8aW50IG9wbnVtPiB7CisgIGludCBPcGVyYW5kTnVtID0gb3BudW07Cit9CisKKy8vIFNEVENpc1ZUIC0gVGhlIHNwZWNpZmllZCBvcGVyYW5kIGhhcyBleGFjdGx5IHRoaXMgVlQuCitjbGFzcyBTRFRDaXNWVDxpbnQgT3BOdW0sIFZhbHVlVHlwZSB2dD4gOiBTRFR5cGVDb25zdHJhaW50PE9wTnVtPiB7CisgIFZhbHVlVHlwZSBWVCA9IHZ0OworfQorCitjbGFzcyBTRFRDaXNQdHJUeTxpbnQgT3BOdW0+IDogU0RUeXBlQ29uc3RyYWludDxPcE51bT47CisKKy8vIFNEVENpc0ludCAtIFRoZSBzcGVjaWZpZWQgb3BlcmFuZCBoYXMgaW50ZWdlciB0eXBlLgorY2xhc3MgU0RUQ2lzSW50PGludCBPcE51bT4gOiBTRFR5cGVDb25zdHJhaW50PE9wTnVtPjsKKworLy8gU0RUQ2lzRlAgLSBUaGUgc3BlY2lmaWVkIG9wZXJhbmQgaGFzIGZsb2F0aW5nLXBvaW50IHR5cGUuCitjbGFzcyBTRFRDaXNGUDxpbnQgT3BOdW0+IDogU0RUeXBlQ29uc3RyYWludDxPcE51bT47CisKKy8vIFNEVENpc1ZlYyAtIFRoZSBzcGVjaWZpZWQgb3BlcmFuZCBoYXMgYSB2ZWN0b3IgdHlwZS4KK2NsYXNzIFNEVENpc1ZlYzxpbnQgT3BOdW0+IDogU0RUeXBlQ29uc3RyYWludDxPcE51bT47CisKKy8vIFNEVENpc1NhbWVBcyAtIFRoZSB0d28gc3BlY2lmaWVkIG9wZXJhbmRzIGhhdmUgaWRlbnRpY2FsIHR5cGVzLgorY2xhc3MgU0RUQ2lzU2FtZUFzPGludCBPcE51bSwgaW50IE90aGVyT3A+IDogU0RUeXBlQ29uc3RyYWludDxPcE51bT4geworICBpbnQgT3RoZXJPcGVyYW5kTnVtID0gT3RoZXJPcDsKK30KKworLy8gU0RUQ2lzVlRTbWFsbGVyVGhhbk9wIC0gVGhlIHNwZWNpZmllZCBvcGVyYW5kIGlzIGEgVlQgU0ROb2RlLCBhbmQgaXRzIHR5cGUgaXMKKy8vIHNtYWxsZXIgdGhhbiB0aGUgJ090aGVyJyBvcGVyYW5kLgorY2xhc3MgU0RUQ2lzVlRTbWFsbGVyVGhhbk9wPGludCBPcE51bSwgaW50IE90aGVyT3A+IDogU0RUeXBlQ29uc3RyYWludDxPcE51bT4geworICBpbnQgT3RoZXJPcGVyYW5kTnVtID0gT3RoZXJPcDsKK30KKworY2xhc3MgU0RUQ2lzT3BTbWFsbGVyVGhhbk9wPGludCBTbWFsbE9wLCBpbnQgQmlnT3A+IDogU0RUeXBlQ29uc3RyYWludDxTbWFsbE9wPnsKKyAgaW50IEJpZ09wZXJhbmROdW0gPSBCaWdPcDsKK30KKworLy8vIFNEVENpc0VsdE9mVmVjIC0gVGhpcyBpbmRpY2F0ZXMgdGhhdCBUaGlzT3AgaXMgYSBzY2FsYXIgdHlwZSBvZiB0aGUgc2FtZQorLy8vIHR5cGUgYXMgdGhlIGVsZW1lbnQgdHlwZSBvZiBPdGhlck9wLCB3aGljaCBpcyBhIHZlY3RvciB0eXBlLgorY2xhc3MgU0RUQ2lzRWx0T2ZWZWM8aW50IFRoaXNPcCwgaW50IE90aGVyT3A+CisgIDogU0RUeXBlQ29uc3RyYWludDxUaGlzT3A+IHsKKyAgaW50IE90aGVyT3BOdW0gPSBPdGhlck9wOworfQorCisvLy8gU0RUQ2lzU3ViVmVjT2ZWZWMgLSBUaGlzIGluZGljYXRlcyB0aGF0IFRoaXNPcCBpcyBhIHZlY3RvciB0eXBlCisvLy8gd2l0aCBsZW5ndGggbGVzcyB0aGF0IG9mIE90aGVyT3AsIHdoaWNoIGlzIGEgdmVjdG9yIHR5cGUuCitjbGFzcyBTRFRDaXNTdWJWZWNPZlZlYzxpbnQgVGhpc09wLCBpbnQgT3RoZXJPcD4KKyAgOiBTRFR5cGVDb25zdHJhaW50PFRoaXNPcD4geworICBpbnQgT3RoZXJPcE51bSA9IE90aGVyT3A7Cit9CisKKy8vIFNEVENWZWNFbHRpc1ZUIC0gVGhlIHNwZWNpZmllZCBvcGVyYW5kIGlzIHZlY3RvciB0eXBlIHdpdGggZWxlbWVudCB0eXBlCisvLyBvZiBWVC4KK2NsYXNzIFNEVENWZWNFbHRpc1ZUPGludCBPcE51bSwgVmFsdWVUeXBlIHZ0PiA6IFNEVHlwZUNvbnN0cmFpbnQ8T3BOdW0+IHsKKyAgVmFsdWVUeXBlIFZUID0gdnQ7Cit9CisKKy8vIFNEVENpc1NhbWVOdW1FbHRzQXMgLSBUaGUgdHdvIHNwZWNpZmllZCBvcGVyYW5kcyBoYXZlIGlkZW50aWNhbCBudW1iZXIKKy8vIG9mIGVsZW1lbnRzLgorY2xhc3MgU0RUQ2lzU2FtZU51bUVsdHNBczxpbnQgT3BOdW0sIGludCBPdGhlck9wPiA6IFNEVHlwZUNvbnN0cmFpbnQ8T3BOdW0+IHsKKyAgaW50IE90aGVyT3BlcmFuZE51bSA9IE90aGVyT3A7Cit9CisKKy8vIFNEVENpc1NhbWVTaXplQXMgLSBUaGUgdHdvIHNwZWNpZmllZCBvcGVyYW5kcyBoYXZlIGlkZW50aWNhbCBzaXplLgorY2xhc3MgU0RUQ2lzU2FtZVNpemVBczxpbnQgT3BOdW0sIGludCBPdGhlck9wPiA6IFNEVHlwZUNvbnN0cmFpbnQ8T3BOdW0+IHsKKyAgaW50IE90aGVyT3BlcmFuZE51bSA9IE90aGVyT3A7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTZWxlY3Rpb24gREFHIFR5cGUgUHJvZmlsZSBkZWZpbml0aW9ucy4KKy8vCisvLyBUaGVzZSB1c2UgdGhlIGNvbnN0cmFpbnRzIGRlZmluZWQgYWJvdmUgdG8gZGVzY3JpYmUgdGhlIHR5cGUgcmVxdWlyZW1lbnRzIG9mCisvLyB0aGUgdmFyaW91cyBub2Rlcy4gIFRoZXNlIGFyZSBub3QgaGFyZCBjb2RlZCBpbnRvIHRibGdlbiwgYWxsb3dpbmcgdGFyZ2V0cyB0bworLy8gYWRkIHRoZWlyIG93biBpZiBuZWVkZWQuCisvLworCisvLyBTRFR5cGVQcm9maWxlIC0gVGhpcyBwcm9maWxlIGRlc2NyaWJlcyB0aGUgdHlwZSByZXF1aXJlbWVudHMgb2YgYSBTZWxlY3Rpb24KKy8vIERBRyBub2RlLgorY2xhc3MgU0RUeXBlUHJvZmlsZTxpbnQgbnVtcmVzdWx0cywgaW50IG51bW9wZXJhbmRzLAorICAgICAgICAgICAgICAgICAgICBsaXN0PFNEVHlwZUNvbnN0cmFpbnQ+IGNvbnN0cmFpbnRzPiB7CisgIGludCBOdW1SZXN1bHRzID0gbnVtcmVzdWx0czsKKyAgaW50IE51bU9wZXJhbmRzID0gbnVtb3BlcmFuZHM7CisgIGxpc3Q8U0RUeXBlQ29uc3RyYWludD4gQ29uc3RyYWludHMgPSBjb25zdHJhaW50czsKK30KKworLy8gQnVpbHRpbiBwcm9maWxlcy4KK2RlZiBTRFRJbnRMZWFmOiBTRFR5cGVQcm9maWxlPDEsIDAsIFtTRFRDaXNJbnQ8MD5dPjsgICAgICAgICAvLyBmb3IgJ2ltbScuCitkZWYgU0RURlBMZWFmIDogU0RUeXBlUHJvZmlsZTwxLCAwLCBbU0RUQ2lzRlA8MD5dPjsgICAgICAgICAgLy8gZm9yICdmcGltbScuCitkZWYgU0RUUHRyTGVhZjogU0RUeXBlUHJvZmlsZTwxLCAwLCBbU0RUQ2lzUHRyVHk8MD5dPjsgICAgICAgLy8gZm9yICcmZycuCitkZWYgU0RUT3RoZXIgIDogU0RUeXBlUHJvZmlsZTwxLCAwLCBbU0RUQ2lzVlQ8MCwgT3RoZXJWVD5dPjsgLy8gZm9yICd2dCcuCitkZWYgU0RUVU5ERUYgIDogU0RUeXBlUHJvZmlsZTwxLCAwLCBbXT47ICAgICAgICAgICAgICAgICAgICAgLy8gZm9yICd1bmRlZicuCitkZWYgU0RUVW5hcnlPcCAgOiBTRFR5cGVQcm9maWxlPDEsIDEsIFtdPjsgICAgICAgICAgICAgICAgICAgLy8gZm9yIGJpdGNvbnZlcnQuCisKK2RlZiBTRFRJbnRCaW5PcCA6IFNEVHlwZVByb2ZpbGU8MSwgMiwgWyAgICAgLy8gYWRkLCBhbmQsIG9yLCB4b3IsIHVkaXYsIGV0Yy4KKyAgU0RUQ2lzU2FtZUFzPDAsIDE+LCBTRFRDaXNTYW1lQXM8MCwgMj4sIFNEVENpc0ludDwwPgorXT47CitkZWYgU0RUSW50U2hpZnRPcCA6IFNEVHlwZVByb2ZpbGU8MSwgMiwgWyAgIC8vIHNobCwgc3JhLCBzcmwKKyAgU0RUQ2lzU2FtZUFzPDAsIDE+LCBTRFRDaXNJbnQ8MD4sIFNEVENpc0ludDwyPgorXT47CitkZWYgU0RUSW50U2F0Tm9TaE9wIDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbICAgLy8gc3NhdCB3aXRoIG5vIHNoaWZ0CisgIFNEVENpc1NhbWVBczwwLCAxPiwgU0RUQ2lzSW50PDI+CitdPjsKK2RlZiBTRFRJbnRCaW5IaUxvT3AgOiBTRFR5cGVQcm9maWxlPDIsIDIsIFsgLy8gbXVsaGksIG11bGxvLCBzZGl2cmVtLCB1ZGl2cmVtCisgIFNEVENpc1NhbWVBczwwLCAxPiwgU0RUQ2lzU2FtZUFzPDAsIDI+LCBTRFRDaXNTYW1lQXM8MCwgMz4sU0RUQ2lzSW50PDA+CitdPjsKKworZGVmIFNEVEZQQmluT3AgOiBTRFR5cGVQcm9maWxlPDEsIDIsIFsgICAgICAvLyBmYWRkLCBmbXVsLCBldGMuCisgIFNEVENpc1NhbWVBczwwLCAxPiwgU0RUQ2lzU2FtZUFzPDAsIDI+LCBTRFRDaXNGUDwwPgorXT47CitkZWYgU0RURlBTaWduT3AgOiBTRFR5cGVQcm9maWxlPDEsIDIsIFsgICAgIC8vIGZjb3B5c2lnbi4KKyAgU0RUQ2lzU2FtZUFzPDAsIDE+LCBTRFRDaXNGUDwwPiwgU0RUQ2lzRlA8Mj4KK10+OworZGVmIFNEVEZQVGVybmFyeU9wIDogU0RUeXBlUHJvZmlsZTwxLCAzLCBbICAvLyBmbWFkZCwgZm5tc3ViLCBldGMuCisgIFNEVENpc1NhbWVBczwwLCAxPiwgU0RUQ2lzU2FtZUFzPDAsIDI+LCBTRFRDaXNTYW1lQXM8MCwgMz4sIFNEVENpc0ZQPDA+CitdPjsKK2RlZiBTRFRJbnRVbmFyeU9wIDogU0RUeXBlUHJvZmlsZTwxLCAxLCBbICAgLy8gY3RseiwgY3R0egorICBTRFRDaXNTYW1lQXM8MCwgMT4sIFNEVENpc0ludDwwPgorXT47CitkZWYgU0RUSW50RXh0ZW5kT3AgOiBTRFR5cGVQcm9maWxlPDEsIDEsIFsgIC8vIHNleHQsIHpleHQsIGFueWV4dAorICBTRFRDaXNJbnQ8MD4sIFNEVENpc0ludDwxPiwgU0RUQ2lzT3BTbWFsbGVyVGhhbk9wPDEsIDA+LCBTRFRDaXNTYW1lTnVtRWx0c0FzPDAsIDE+CitdPjsKK2RlZiBTRFRJbnRUcnVuY09wICA6IFNEVHlwZVByb2ZpbGU8MSwgMSwgWyAgLy8gdHJ1bmMKKyAgU0RUQ2lzSW50PDA+LCBTRFRDaXNJbnQ8MT4sIFNEVENpc09wU21hbGxlclRoYW5PcDwwLCAxPiwgU0RUQ2lzU2FtZU51bUVsdHNBczwwLCAxPgorXT47CitkZWYgU0RURlBVbmFyeU9wICA6IFNEVHlwZVByb2ZpbGU8MSwgMSwgWyAgIC8vIGZuZWcsIGZzcXJ0LCBldGMKKyAgU0RUQ2lzU2FtZUFzPDAsIDE+LCBTRFRDaXNGUDwwPgorXT47CitkZWYgU0RURlBSb3VuZE9wICA6IFNEVHlwZVByb2ZpbGU8MSwgMSwgWyAgIC8vIGZyb3VuZAorICBTRFRDaXNGUDwwPiwgU0RUQ2lzRlA8MT4sIFNEVENpc09wU21hbGxlclRoYW5PcDwwLCAxPiwgU0RUQ2lzU2FtZU51bUVsdHNBczwwLCAxPgorXT47CitkZWYgU0RURlBFeHRlbmRPcCAgOiBTRFR5cGVQcm9maWxlPDEsIDEsIFsgIC8vIGZleHRlbmQKKyAgU0RUQ2lzRlA8MD4sIFNEVENpc0ZQPDE+LCBTRFRDaXNPcFNtYWxsZXJUaGFuT3A8MSwgMD4sIFNEVENpc1NhbWVOdW1FbHRzQXM8MCwgMT4KK10+OworZGVmIFNEVEludFRvRlBPcCA6IFNEVHlwZVByb2ZpbGU8MSwgMSwgWyAgICAvLyBbc3VdaW50X3RvX2ZwCisgIFNEVENpc0ZQPDA+LCBTRFRDaXNJbnQ8MT4sIFNEVENpc1NhbWVOdW1FbHRzQXM8MCwgMT4KK10+OworZGVmIFNEVEZQVG9JbnRPcCA6IFNEVHlwZVByb2ZpbGU8MSwgMSwgWyAgICAvLyBmcF90b19bc3VdaW50CisgIFNEVENpc0ludDwwPiwgU0RUQ2lzRlA8MT4sIFNEVENpc1NhbWVOdW1FbHRzQXM8MCwgMT4KK10+OworZGVmIFNEVEV4dElucmVnIDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbICAgICAvLyBzZXh0X2lucmVnCisgIFNEVENpc1NhbWVBczwwLCAxPiwgU0RUQ2lzSW50PDA+LCBTRFRDaXNWVDwyLCBPdGhlclZUPiwKKyAgU0RUQ2lzVlRTbWFsbGVyVGhhbk9wPDIsIDE+CitdPjsKK2RlZiBTRFRFeHRJbnZlYyA6IFNEVHlwZVByb2ZpbGU8MSwgMSwgWyAgICAgLy8gc2V4dF9pbnZlYworICBTRFRDaXNJbnQ8MD4sIFNEVENpc1ZlYzwwPiwgU0RUQ2lzSW50PDE+LCBTRFRDaXNWZWM8MT4sCisgIFNEVENpc09wU21hbGxlclRoYW5PcDwxLCAwPiwgU0RUQ2lzU2FtZVNpemVBczwwLDE+CitdPjsKKworZGVmIFNEVFNldENDIDogU0RUeXBlUHJvZmlsZTwxLCAzLCBbICAgICAgICAvLyBzZXRjYworICBTRFRDaXNJbnQ8MD4sIFNEVENpc1NhbWVBczwxLCAyPiwgU0RUQ2lzVlQ8MywgT3RoZXJWVD4KK10+OworCitkZWYgU0RUU2VsZWN0IDogU0RUeXBlUHJvZmlsZTwxLCAzLCBbICAgICAgIC8vIHNlbGVjdAorICBTRFRDaXNJbnQ8MT4sIFNEVENpc1NhbWVBczwwLCAyPiwgU0RUQ2lzU2FtZUFzPDIsIDM+CitdPjsKKworZGVmIFNEVFZTZWxlY3QgOiBTRFR5cGVQcm9maWxlPDEsIDMsIFsgICAgICAgLy8gdnNlbGVjdAorICBTRFRDaXNWZWM8MD4sIFNEVENpc0ludDwxPiwgU0RUQ2lzU2FtZUFzPDAsIDI+LCBTRFRDaXNTYW1lQXM8MiwgMz4sIFNEVENpc1NhbWVOdW1FbHRzQXM8MCwgMT4KK10+OworCitkZWYgU0RUU2VsZWN0Q0MgOiBTRFR5cGVQcm9maWxlPDEsIDUsIFsgICAgIC8vIHNlbGVjdF9jYworICBTRFRDaXNTYW1lQXM8MSwgMj4sIFNEVENpc1NhbWVBczwzLCA0PiwgU0RUQ2lzU2FtZUFzPDAsIDM+LAorICBTRFRDaXNWVDw1LCBPdGhlclZUPgorXT47CisKK2RlZiBTRFRCciA6IFNEVHlwZVByb2ZpbGU8MCwgMSwgWyAgICAgICAgICAgLy8gYnIKKyAgU0RUQ2lzVlQ8MCwgT3RoZXJWVD4KK10+OworCitkZWYgU0RUQnJDQyA6IFNEVHlwZVByb2ZpbGU8MCwgNCwgWyAgICAgICAvLyBicmNjCisgIFNEVENpc1ZUPDAsIE90aGVyVlQ+LCBTRFRDaXNTYW1lQXM8MSwgMj4sIFNEVENpc1ZUPDMsIE90aGVyVlQ+CitdPjsKKworZGVmIFNEVEJyY29uZCA6IFNEVHlwZVByb2ZpbGU8MCwgMiwgWyAgICAgICAvLyBicmNvbmQKKyAgU0RUQ2lzSW50PDA+LCBTRFRDaXNWVDwxLCBPdGhlclZUPgorXT47CisKK2RlZiBTRFRCcmluZCA6IFNEVHlwZVByb2ZpbGU8MCwgMSwgWyAgICAgICAgLy8gYnJpbmQKKyAgU0RUQ2lzUHRyVHk8MD4KK10+OworCitkZWYgU0RUQ2F0Y2hyZXQgOiBTRFR5cGVQcm9maWxlPDAsIDIsIFsgICAgIC8vIGNhdGNocmV0CisgIFNEVENpc1ZUPDAsIE90aGVyVlQ+LCBTRFRDaXNWVDwxLCBPdGhlclZUPgorXT47CisKK2RlZiBTRFROb25lIDogU0RUeXBlUHJvZmlsZTwwLCAwLCBbXT47ICAgICAgLy8gcmV0LCB0cmFwCisKK2RlZiBTRFRMb2FkIDogU0RUeXBlUHJvZmlsZTwxLCAxLCBbICAgICAgICAgLy8gbG9hZAorICBTRFRDaXNQdHJUeTwxPgorXT47CisKK2RlZiBTRFRTdG9yZSA6IFNEVHlwZVByb2ZpbGU8MCwgMiwgWyAgICAgICAgLy8gc3RvcmUKKyAgU0RUQ2lzUHRyVHk8MT4KK10+OworCitkZWYgU0RUSVN0b3JlIDogU0RUeXBlUHJvZmlsZTwxLCAzLCBbICAgICAgIC8vIGluZGV4ZWQgc3RvcmUKKyAgU0RUQ2lzU2FtZUFzPDAsIDI+LCBTRFRDaXNQdHJUeTwwPiwgU0RUQ2lzUHRyVHk8Mz4KK10+OworCitkZWYgU0RUTWFza2VkU3RvcmU6IFNEVHlwZVByb2ZpbGU8MCwgMywgWyAgICAgICAvLyBtYXNrZWQgc3RvcmUKKyAgU0RUQ2lzUHRyVHk8MD4sIFNEVENpc1ZlYzwxPiwgU0RUQ2lzVmVjPDI+LCBTRFRDaXNTYW1lTnVtRWx0c0FzPDEsIDI+CitdPjsKKworZGVmIFNEVE1hc2tlZExvYWQ6IFNEVHlwZVByb2ZpbGU8MSwgMywgWyAgICAgICAvLyBtYXNrZWQgbG9hZAorICBTRFRDaXNWZWM8MD4sIFNEVENpc1B0clR5PDE+LCBTRFRDaXNWZWM8Mj4sIFNEVENpc1NhbWVBczwwLCAzPiwKKyAgU0RUQ2lzU2FtZU51bUVsdHNBczwwLCAyPgorXT47CisKK2RlZiBTRFRNYXNrZWRHYXRoZXI6IFNEVHlwZVByb2ZpbGU8MiwgMywgWyAgICAgICAvLyBtYXNrZWQgZ2F0aGVyCisgIFNEVENpc1ZlYzwwPiwgU0RUQ2lzVmVjPDE+LCBTRFRDaXNTYW1lQXM8MCwgMj4sIFNEVENpc1NhbWVBczwxLCAzPiwKKyAgU0RUQ2lzUHRyVHk8ND4sIFNEVENWZWNFbHRpc1ZUPDEsIGkxPiwgU0RUQ2lzU2FtZU51bUVsdHNBczwwLCAxPgorXT47CisKK2RlZiBTRFRNYXNrZWRTY2F0dGVyOiBTRFR5cGVQcm9maWxlPDEsIDMsIFsgICAgICAgLy8gbWFza2VkIHNjYXR0ZXIKKyAgU0RUQ2lzVmVjPDA+LCBTRFRDaXNWZWM8MT4sIFNEVENpc1NhbWVBczwwLCAyPiwgU0RUQ2lzU2FtZU51bUVsdHNBczwwLCAxPiwKKyAgU0RUQ1ZlY0VsdGlzVlQ8MCwgaTE+LCBTRFRDaXNQdHJUeTwzPgorXT47CisKK2RlZiBTRFRWZWNTaHVmZmxlIDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbCisgIFNEVENpc1NhbWVBczwwLCAxPiwgU0RUQ2lzU2FtZUFzPDEsIDI+CitdPjsKK2RlZiBTRFRWZWNFeHRyYWN0IDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbICAgLy8gdmVjdG9yIGV4dHJhY3QKKyAgU0RUQ2lzRWx0T2ZWZWM8MCwgMT4sIFNEVENpc1B0clR5PDI+CitdPjsKK2RlZiBTRFRWZWNJbnNlcnQgOiBTRFR5cGVQcm9maWxlPDEsIDMsIFsgICAgLy8gdmVjdG9yIGluc2VydAorICBTRFRDaXNFbHRPZlZlYzwyLCAxPiwgU0RUQ2lzU2FtZUFzPDAsIDE+LCBTRFRDaXNQdHJUeTwzPgorXT47CisKK2RlZiBTRFRTdWJWZWNFeHRyYWN0IDogU0RUeXBlUHJvZmlsZTwxLCAyLCBbLy8gc3VidmVjdG9yIGV4dHJhY3QKKyAgU0RUQ2lzU3ViVmVjT2ZWZWM8MCwxPiwgU0RUQ2lzSW50PDI+CitdPjsKK2RlZiBTRFRTdWJWZWNJbnNlcnQgOiBTRFR5cGVQcm9maWxlPDEsIDMsIFsgLy8gc3VidmVjdG9yIGluc2VydAorICBTRFRDaXNTdWJWZWNPZlZlYzwyLCAxPiwgU0RUQ2lzU2FtZUFzPDAsMT4sIFNEVENpc0ludDwzPgorXT47CisKK2RlZiBTRFRQcmVmZXRjaCA6IFNEVHlwZVByb2ZpbGU8MCwgNCwgWyAgICAgLy8gcHJlZmV0Y2gKKyAgU0RUQ2lzUHRyVHk8MD4sIFNEVENpc1NhbWVBczwxLCAyPiwgU0RUQ2lzU2FtZUFzPDEsIDM+LCBTRFRDaXNJbnQ8MT4KK10+OworCitkZWYgU0RUTWVtQmFycmllciA6IFNEVHlwZVByb2ZpbGU8MCwgNSwgWyAgIC8vIG1lbW9yeSBiYXJyaWVyCisgIFNEVENpc1NhbWVBczwwLDE+LCAgU0RUQ2lzU2FtZUFzPDAsMj4sICBTRFRDaXNTYW1lQXM8MCwzPiwgU0RUQ2lzU2FtZUFzPDAsND4sCisgIFNEVENpc0ludDwwPgorXT47CitkZWYgU0RUQXRvbWljRmVuY2UgOiBTRFR5cGVQcm9maWxlPDAsIDIsIFsKKyAgU0RUQ2lzU2FtZUFzPDAsMT4sIFNEVENpc1B0clR5PDA+CitdPjsKK2RlZiBTRFRBdG9taWMzIDogU0RUeXBlUHJvZmlsZTwxLCAzLCBbCisgIFNEVENpc1NhbWVBczwwLDI+LCAgU0RUQ2lzU2FtZUFzPDAsMz4sIFNEVENpc0ludDwwPiwgU0RUQ2lzUHRyVHk8MT4KK10+OworZGVmIFNEVEF0b21pYzIgOiBTRFR5cGVQcm9maWxlPDEsIDIsIFsKKyAgU0RUQ2lzU2FtZUFzPDAsMj4sIFNEVENpc0ludDwwPiwgU0RUQ2lzUHRyVHk8MT4KK10+OworZGVmIFNEVEF0b21pY1N0b3JlIDogU0RUeXBlUHJvZmlsZTwwLCAyLCBbCisgIFNEVENpc1B0clR5PDA+LCBTRFRDaXNJbnQ8MT4KK10+OworZGVmIFNEVEF0b21pY0xvYWQgOiBTRFR5cGVQcm9maWxlPDEsIDEsIFsKKyAgU0RUQ2lzSW50PDA+LCBTRFRDaXNQdHJUeTwxPgorXT47CisKK2RlZiBTRFRDb252ZXJ0T3AgOiBTRFR5cGVQcm9maWxlPDEsIDUsIFsgLy9jdnRzcywgc3UsIHVzLCB1dSwgZmYsIGZzLCBmdSwgc2YsIHN1CisgIFNEVENpc1ZUPDIsIE90aGVyVlQ+LCBTRFRDaXNWVDwzLCBPdGhlclZUPiwgU0RUQ2lzUHRyVHk8ND4sIFNEVENpc1B0clR5PDU+CitdPjsKKworY2xhc3MgU0RDYWxsU2VxU3RhcnQ8bGlzdDxTRFR5cGVDb25zdHJhaW50PiBjb25zdHJhaW50cz4gOgorICAgICAgICBTRFR5cGVQcm9maWxlPDAsIDIsIGNvbnN0cmFpbnRzPjsKK2NsYXNzIFNEQ2FsbFNlcUVuZDxsaXN0PFNEVHlwZUNvbnN0cmFpbnQ+IGNvbnN0cmFpbnRzPiA6CisgICAgICAgIFNEVHlwZVByb2ZpbGU8MCwgMiwgY29uc3RyYWludHM+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU2VsZWN0aW9uIERBRyBOb2RlIGRlZmluaXRpb25zLgorLy8KK2NsYXNzIFNETm9kZTxzdHJpbmcgb3Bjb2RlLCBTRFR5cGVQcm9maWxlIHR5cGVwcm9mLAorICAgICAgICAgICAgIGxpc3Q8U0ROb2RlUHJvcGVydHk+IHByb3BzID0gW10sIHN0cmluZyBzZGNsYXNzID0gIlNETm9kZSI+CisgICAgICAgICAgICAgOiBTRFBhdHRlcm5PcGVyYXRvciB7CisgIHN0cmluZyBPcGNvZGUgID0gb3Bjb2RlOworICBzdHJpbmcgU0RDbGFzcyA9IHNkY2xhc3M7CisgIGxldCBQcm9wZXJ0aWVzID0gcHJvcHM7CisgIFNEVHlwZVByb2ZpbGUgVHlwZVByb2ZpbGUgPSB0eXBlcHJvZjsKK30KKworLy8gU3BlY2lhbCBUYWJsZUdlbi1yZWNvZ25pemVkIGRhZyBub2RlcworZGVmIHNldDsKK2RlZiBpbXBsaWNpdDsKK2RlZiBub2RlOworZGVmIHNyY3ZhbHVlOworCitkZWYgaW1tICAgICAgICA6IFNETm9kZTwiSVNEOjpDb25zdGFudCIgICwgU0RUSW50TGVhZiAsIFtdLCAiQ29uc3RhbnRTRE5vZGUiPjsKK2RlZiB0aW1tICAgICAgIDogU0ROb2RlPCJJU0Q6OlRhcmdldENvbnN0YW50IixTRFRJbnRMZWFmLCBbXSwgIkNvbnN0YW50U0ROb2RlIj47CitkZWYgZnBpbW0gICAgICA6IFNETm9kZTwiSVNEOjpDb25zdGFudEZQIiwgU0RURlBMZWFmICAsIFtdLCAiQ29uc3RhbnRGUFNETm9kZSI+OworZGVmIHZ0ICAgICAgICAgOiBTRE5vZGU8IklTRDo6VkFMVUVUWVBFIiAsIFNEVE90aGVyICAgLCBbXSwgIlZUU0ROb2RlIj47CitkZWYgYmIgICAgICAgICA6IFNETm9kZTwiSVNEOjpCYXNpY0Jsb2NrIiwgU0RUT3RoZXIgICAsIFtdLCAiQmFzaWNCbG9ja1NETm9kZSI+OworZGVmIGNvbmQgICAgICAgOiBTRE5vZGU8IklTRDo6Q09ORENPREUiICAsIFNEVE90aGVyICAgLCBbXSwgIkNvbmRDb2RlU0ROb2RlIj47CitkZWYgdW5kZWYgICAgICA6IFNETm9kZTwiSVNEOjpVTkRFRiIgICAgICwgU0RUVU5ERUYgICAsIFtdPjsKK2RlZiBnbG9iYWxhZGRyIDogU0ROb2RlPCJJU0Q6Okdsb2JhbEFkZHJlc3MiLCAgICAgICAgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgIkdsb2JhbEFkZHJlc3NTRE5vZGUiPjsKK2RlZiB0Z2xvYmFsYWRkciA6IFNETm9kZTwiSVNEOjpUYXJnZXRHbG9iYWxBZGRyZXNzIiwgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICJHbG9iYWxBZGRyZXNzU0ROb2RlIj47CitkZWYgZ2xvYmFsdGxzYWRkciA6IFNETm9kZTwiSVNEOjpHbG9iYWxUTFNBZGRyZXNzIiwgICAgICAgICBTRFRQdHJMZWFmLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkdsb2JhbEFkZHJlc3NTRE5vZGUiPjsKK2RlZiB0Z2xvYmFsdGxzYWRkciA6IFNETm9kZTwiSVNEOjpUYXJnZXRHbG9iYWxUTFNBZGRyZXNzIiwgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdsb2JhbEFkZHJlc3NTRE5vZGUiPjsKK2RlZiBjb25zdHBvb2wgICA6IFNETm9kZTwiSVNEOjpDb25zdGFudFBvb2wiLCAgICAgICAgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICJDb25zdGFudFBvb2xTRE5vZGUiPjsKK2RlZiB0Y29uc3Rwb29sICA6IFNETm9kZTwiSVNEOjpUYXJnZXRDb25zdGFudFBvb2wiLCAgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICJDb25zdGFudFBvb2xTRE5vZGUiPjsKK2RlZiBqdW1wdGFibGUgICA6IFNETm9kZTwiSVNEOjpKdW1wVGFibGUiLCAgICAgICAgICAgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICJKdW1wVGFibGVTRE5vZGUiPjsKK2RlZiB0anVtcHRhYmxlICA6IFNETm9kZTwiSVNEOjpUYXJnZXRKdW1wVGFibGUiLCAgICAgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICJKdW1wVGFibGVTRE5vZGUiPjsKK2RlZiBmcmFtZWluZGV4ICA6IFNETm9kZTwiSVNEOjpGcmFtZUluZGV4IiwgICAgICAgICAgIFNEVFB0ckxlYWYsIFtdLAorICAgICAgICAgICAgICAgICAgICAgICAgICJGcmFtZUluZGV4U0ROb2RlIj47CitkZWYgdGZyYW1laW5kZXggOiBTRE5vZGU8IklTRDo6VGFyZ2V0RnJhbWVJbmRleCIsICAgICBTRFRQdHJMZWFmLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiRnJhbWVJbmRleFNETm9kZSI+OworZGVmIGV4dGVybmFsc3ltIDogU0ROb2RlPCJJU0Q6OkV4dGVybmFsU3ltYm9sIiwgICAgICAgU0RUUHRyTGVhZiwgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIkV4dGVybmFsU3ltYm9sU0ROb2RlIj47CitkZWYgdGV4dGVybmFsc3ltOiBTRE5vZGU8IklTRDo6VGFyZ2V0RXh0ZXJuYWxTeW1ib2wiLCBTRFRQdHJMZWFmLCBbXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiRXh0ZXJuYWxTeW1ib2xTRE5vZGUiPjsKK2RlZiBtY3N5bTogU0ROb2RlPCJJU0Q6Ok1DU3ltYm9sIiwgU0RUUHRyTGVhZiwgW10sICJNQ1N5bWJvbFNETm9kZSI+OworZGVmIGJsb2NrYWRkcmVzcyA6IFNETm9kZTwiSVNEOjpCbG9ja0FkZHJlc3MiLCAgICAgICAgU0RUUHRyTGVhZiwgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIkJsb2NrQWRkcmVzc1NETm9kZSI+OworZGVmIHRibG9ja2FkZHJlc3M6IFNETm9kZTwiSVNEOjpUYXJnZXRCbG9ja0FkZHJlc3MiLCAgU0RUUHRyTGVhZiwgW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgIkJsb2NrQWRkcmVzc1NETm9kZSI+OworCitkZWYgYWRkICAgICAgICA6IFNETm9kZTwiSVNEOjpBREQiICAgICAgICwgU0RUSW50QmluT3AgICAsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUENvbW11dGF0aXZlLCBTRE5QQXNzb2NpYXRpdmVdPjsKK2RlZiBzdWIgICAgICAgIDogU0ROb2RlPCJJU0Q6OlNVQiIgICAgICAgLCBTRFRJbnRCaW5PcD47CitkZWYgbXVsICAgICAgICA6IFNETm9kZTwiSVNEOjpNVUwiICAgICAgICwgU0RUSW50QmluT3AsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUENvbW11dGF0aXZlLCBTRE5QQXNzb2NpYXRpdmVdPjsKK2RlZiBtdWxocyAgICAgIDogU0ROb2RlPCJJU0Q6Ok1VTEhTIiAgICAgLCBTRFRJbnRCaW5PcCwgW1NETlBDb21tdXRhdGl2ZV0+OworZGVmIG11bGh1ICAgICAgOiBTRE5vZGU8IklTRDo6TVVMSFUiICAgICAsIFNEVEludEJpbk9wLCBbU0ROUENvbW11dGF0aXZlXT47CitkZWYgc211bGxvaGkgICA6IFNETm9kZTwiSVNEOjpTTVVMX0xPSEkiICwgU0RUSW50QmluSGlMb09wLCBbU0ROUENvbW11dGF0aXZlXT47CitkZWYgdW11bGxvaGkgICA6IFNETm9kZTwiSVNEOjpVTVVMX0xPSEkiICwgU0RUSW50QmluSGlMb09wLCBbU0ROUENvbW11dGF0aXZlXT47CitkZWYgc2RpdiAgICAgICA6IFNETm9kZTwiSVNEOjpTRElWIiAgICAgICwgU0RUSW50QmluT3A+OworZGVmIHVkaXYgICAgICAgOiBTRE5vZGU8IklTRDo6VURJViIgICAgICAsIFNEVEludEJpbk9wPjsKK2RlZiBzcmVtICAgICAgIDogU0ROb2RlPCJJU0Q6OlNSRU0iICAgICAgLCBTRFRJbnRCaW5PcD47CitkZWYgdXJlbSAgICAgICA6IFNETm9kZTwiSVNEOjpVUkVNIiAgICAgICwgU0RUSW50QmluT3A+OworZGVmIHNkaXZyZW0gICAgOiBTRE5vZGU8IklTRDo6U0RJVlJFTSIgICAsIFNEVEludEJpbkhpTG9PcD47CitkZWYgdWRpdnJlbSAgICA6IFNETm9kZTwiSVNEOjpVRElWUkVNIiAgICwgU0RUSW50QmluSGlMb09wPjsKK2RlZiBzcmwgICAgICAgIDogU0ROb2RlPCJJU0Q6OlNSTCIgICAgICAgLCBTRFRJbnRTaGlmdE9wPjsKK2RlZiBzcmEgICAgICAgIDogU0ROb2RlPCJJU0Q6OlNSQSIgICAgICAgLCBTRFRJbnRTaGlmdE9wPjsKK2RlZiBzaGwgICAgICAgIDogU0ROb2RlPCJJU0Q6OlNITCIgICAgICAgLCBTRFRJbnRTaGlmdE9wPjsKK2RlZiByb3RsICAgICAgIDogU0ROb2RlPCJJU0Q6OlJPVEwiICAgICAgLCBTRFRJbnRTaGlmdE9wPjsKK2RlZiByb3RyICAgICAgIDogU0ROb2RlPCJJU0Q6OlJPVFIiICAgICAgLCBTRFRJbnRTaGlmdE9wPjsKK2RlZiBhbmQgICAgICAgIDogU0ROb2RlPCJJU0Q6OkFORCIgICAgICAgLCBTRFRJbnRCaW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QQ29tbXV0YXRpdmUsIFNETlBBc3NvY2lhdGl2ZV0+OworZGVmIG9yICAgICAgICAgOiBTRE5vZGU8IklTRDo6T1IiICAgICAgICAsIFNEVEludEJpbk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBDb21tdXRhdGl2ZSwgU0ROUEFzc29jaWF0aXZlXT47CitkZWYgeG9yICAgICAgICA6IFNETm9kZTwiSVNEOjpYT1IiICAgICAgICwgU0RUSW50QmluT3AsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUENvbW11dGF0aXZlLCBTRE5QQXNzb2NpYXRpdmVdPjsKK2RlZiBhZGRjICAgICAgIDogU0ROb2RlPCJJU0Q6OkFEREMiICAgICAgLCBTRFRJbnRCaW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QQ29tbXV0YXRpdmUsIFNETlBPdXRHbHVlXT47CitkZWYgYWRkZSAgICAgICA6IFNETm9kZTwiSVNEOjpBRERFIiAgICAgICwgU0RUSW50QmluT3AsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUENvbW11dGF0aXZlLCBTRE5QT3V0R2x1ZSwgU0ROUEluR2x1ZV0+OworZGVmIHN1YmMgICAgICAgOiBTRE5vZGU8IklTRDo6U1VCQyIgICAgICAsIFNEVEludEJpbk9wLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBPdXRHbHVlXT47CitkZWYgc3ViZSAgICAgICA6IFNETm9kZTwiSVNEOjpTVUJFIiAgICAgICwgU0RUSW50QmluT3AsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUE91dEdsdWUsIFNETlBJbkdsdWVdPjsKK2RlZiBzbWluICAgICAgIDogU0ROb2RlPCJJU0Q6OlNNSU4iICAgICAgLCBTRFRJbnRCaW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUENvbW11dGF0aXZlLCBTRE5QQXNzb2NpYXRpdmVdPjsKK2RlZiBzbWF4ICAgICAgIDogU0ROb2RlPCJJU0Q6OlNNQVgiICAgICAgLCBTRFRJbnRCaW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUENvbW11dGF0aXZlLCBTRE5QQXNzb2NpYXRpdmVdPjsKK2RlZiB1bWluICAgICAgIDogU0ROb2RlPCJJU0Q6OlVNSU4iICAgICAgLCBTRFRJbnRCaW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUENvbW11dGF0aXZlLCBTRE5QQXNzb2NpYXRpdmVdPjsKK2RlZiB1bWF4ICAgICAgIDogU0ROb2RlPCJJU0Q6OlVNQVgiICAgICAgLCBTRFRJbnRCaW5PcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUENvbW11dGF0aXZlLCBTRE5QQXNzb2NpYXRpdmVdPjsKKworZGVmIHNleHRfaW5yZWcgOiBTRE5vZGU8IklTRDo6U0lHTl9FWFRFTkRfSU5SRUciLCBTRFRFeHRJbnJlZz47CitkZWYgc2V4dF9pbnZlYyA6IFNETm9kZTwiSVNEOjpTSUdOX0VYVEVORF9WRUNUT1JfSU5SRUciLCBTRFRFeHRJbnZlYz47CitkZWYgemV4dF9pbnZlYyA6IFNETm9kZTwiSVNEOjpaRVJPX0VYVEVORF9WRUNUT1JfSU5SRUciLCBTRFRFeHRJbnZlYz47CisKK2RlZiBhYnMgICAgICAgIDogU0ROb2RlPCJJU0Q6OkFCUyIgICAgICAgICwgU0RUSW50VW5hcnlPcD47CitkZWYgYml0cmV2ZXJzZSA6IFNETm9kZTwiSVNEOjpCSVRSRVZFUlNFIiAsIFNEVEludFVuYXJ5T3A+OworZGVmIGJzd2FwICAgICAgOiBTRE5vZGU8IklTRDo6QlNXQVAiICAgICAgLCBTRFRJbnRVbmFyeU9wPjsKK2RlZiBjdGx6ICAgICAgIDogU0ROb2RlPCJJU0Q6OkNUTFoiICAgICAgICwgU0RUSW50VW5hcnlPcD47CitkZWYgY3R0eiAgICAgICA6IFNETm9kZTwiSVNEOjpDVFRaIiAgICAgICAsIFNEVEludFVuYXJ5T3A+OworZGVmIGN0cG9wICAgICAgOiBTRE5vZGU8IklTRDo6Q1RQT1AiICAgICAgLCBTRFRJbnRVbmFyeU9wPjsKK2RlZiBjdGx6X3plcm9fdW5kZWYgOiBTRE5vZGU8IklTRDo6Q1RMWl9aRVJPX1VOREVGIiwgU0RUSW50VW5hcnlPcD47CitkZWYgY3R0el96ZXJvX3VuZGVmIDogU0ROb2RlPCJJU0Q6OkNUVFpfWkVST19VTkRFRiIsIFNEVEludFVuYXJ5T3A+OworZGVmIHNleHQgICAgICAgOiBTRE5vZGU8IklTRDo6U0lHTl9FWFRFTkQiLCBTRFRJbnRFeHRlbmRPcD47CitkZWYgemV4dCAgICAgICA6IFNETm9kZTwiSVNEOjpaRVJPX0VYVEVORCIsIFNEVEludEV4dGVuZE9wPjsKK2RlZiBhbnlleHQgICAgIDogU0ROb2RlPCJJU0Q6OkFOWV9FWFRFTkQiICwgU0RUSW50RXh0ZW5kT3A+OworZGVmIHRydW5jICAgICAgOiBTRE5vZGU8IklTRDo6VFJVTkNBVEUiICAgLCBTRFRJbnRUcnVuY09wPjsKK2RlZiBiaXRjb252ZXJ0IDogU0ROb2RlPCJJU0Q6OkJJVENBU1QiICAgICwgU0RUVW5hcnlPcD47CitkZWYgYWRkcnNwYWNlY2FzdCA6IFNETm9kZTwiSVNEOjpBRERSU1BBQ0VDQVNUIiwgU0RUVW5hcnlPcD47CitkZWYgZXh0cmFjdGVsdCA6IFNETm9kZTwiSVNEOjpFWFRSQUNUX1ZFQ1RPUl9FTFQiLCBTRFRWZWNFeHRyYWN0PjsKK2RlZiBpbnNlcnRlbHQgIDogU0ROb2RlPCJJU0Q6OklOU0VSVF9WRUNUT1JfRUxUIiwgU0RUVmVjSW5zZXJ0PjsKKworZGVmIGZhZGQgICAgICAgOiBTRE5vZGU8IklTRDo6RkFERCIgICAgICAgLCBTRFRGUEJpbk9wLCBbU0ROUENvbW11dGF0aXZlXT47CitkZWYgZnN1YiAgICAgICA6IFNETm9kZTwiSVNEOjpGU1VCIiAgICAgICAsIFNEVEZQQmluT3A+OworZGVmIGZtdWwgICAgICAgOiBTRE5vZGU8IklTRDo6Rk1VTCIgICAgICAgLCBTRFRGUEJpbk9wLCBbU0ROUENvbW11dGF0aXZlXT47CitkZWYgZmRpdiAgICAgICA6IFNETm9kZTwiSVNEOjpGRElWIiAgICAgICAsIFNEVEZQQmluT3A+OworZGVmIGZyZW0gICAgICAgOiBTRE5vZGU8IklTRDo6RlJFTSIgICAgICAgLCBTRFRGUEJpbk9wPjsKK2RlZiBmbWEgICAgICAgIDogU0ROb2RlPCJJU0Q6OkZNQSIgICAgICAgICwgU0RURlBUZXJuYXJ5T3A+OworZGVmIGZtYWQgICAgICAgOiBTRE5vZGU8IklTRDo6Rk1BRCIgICAgICAgLCBTRFRGUFRlcm5hcnlPcD47CitkZWYgZmFicyAgICAgICA6IFNETm9kZTwiSVNEOjpGQUJTIiAgICAgICAsIFNEVEZQVW5hcnlPcD47CitkZWYgZm1pbm51bSAgICA6IFNETm9kZTwiSVNEOjpGTUlOTlVNIiAgICAsIFNEVEZQQmluT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBDb21tdXRhdGl2ZSwgU0ROUEFzc29jaWF0aXZlXT47CitkZWYgZm1heG51bSAgICA6IFNETm9kZTwiSVNEOjpGTUFYTlVNIiAgICAsIFNEVEZQQmluT3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBDb21tdXRhdGl2ZSwgU0ROUEFzc29jaWF0aXZlXT47CitkZWYgZm1pbm5hbiAgICA6IFNETm9kZTwiSVNEOjpGTUlOTkFOIiAgICAsIFNEVEZQQmluT3A+OworZGVmIGZtYXhuYW4gICAgOiBTRE5vZGU8IklTRDo6Rk1BWE5BTiIgICAgLCBTRFRGUEJpbk9wPjsKK2RlZiBmZ2V0c2lnbiAgIDogU0ROb2RlPCJJU0Q6OkZHRVRTSUdOIiAgICwgU0RURlBUb0ludE9wPjsKK2RlZiBmY2Fub25pY2FsaXplIDogU0ROb2RlPCJJU0Q6OkZDQU5PTklDQUxJWkUiLCBTRFRGUFVuYXJ5T3A+OworZGVmIGZuZWcgICAgICAgOiBTRE5vZGU8IklTRDo6Rk5FRyIgICAgICAgLCBTRFRGUFVuYXJ5T3A+OworZGVmIGZzcXJ0ICAgICAgOiBTRE5vZGU8IklTRDo6RlNRUlQiICAgICAgLCBTRFRGUFVuYXJ5T3A+OworZGVmIGZzaW4gICAgICAgOiBTRE5vZGU8IklTRDo6RlNJTiIgICAgICAgLCBTRFRGUFVuYXJ5T3A+OworZGVmIGZjb3MgICAgICAgOiBTRE5vZGU8IklTRDo6RkNPUyIgICAgICAgLCBTRFRGUFVuYXJ5T3A+OworZGVmIGZleHAyICAgICAgOiBTRE5vZGU8IklTRDo6RkVYUDIiICAgICAgLCBTRFRGUFVuYXJ5T3A+OworZGVmIGZwb3cgICAgICAgOiBTRE5vZGU8IklTRDo6RlBPVyIgICAgICAgLCBTRFRGUEJpbk9wPjsKK2RlZiBmbG9nMiAgICAgIDogU0ROb2RlPCJJU0Q6OkZMT0cyIiAgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmcmludCAgICAgIDogU0ROb2RlPCJJU0Q6OkZSSU5UIiAgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmdHJ1bmMgICAgIDogU0ROb2RlPCJJU0Q6OkZUUlVOQyIgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmY2VpbCAgICAgIDogU0ROb2RlPCJJU0Q6OkZDRUlMIiAgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmZmxvb3IgICAgIDogU0ROb2RlPCJJU0Q6OkZGTE9PUiIgICAgICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmbmVhcmJ5aW50IDogU0ROb2RlPCJJU0Q6OkZORUFSQllJTlQiICwgU0RURlBVbmFyeU9wPjsKK2RlZiBmcm91bmQgICAgIDogU0ROb2RlPCJJU0Q6OkZST1VORCIgICAgICwgU0RURlBVbmFyeU9wPjsKKworZGVmIGZwcm91bmQgICAgOiBTRE5vZGU8IklTRDo6RlBfUk9VTkQiICAgLCBTRFRGUFJvdW5kT3A+OworZGVmIGZwZXh0ZW5kICAgOiBTRE5vZGU8IklTRDo6RlBfRVhURU5EIiAgLCBTRFRGUEV4dGVuZE9wPjsKK2RlZiBmY29weXNpZ24gIDogU0ROb2RlPCJJU0Q6OkZDT1BZU0lHTiIgICwgU0RURlBTaWduT3A+OworCitkZWYgc2ludF90b19mcCA6IFNETm9kZTwiSVNEOjpTSU5UX1RPX0ZQIiAsIFNEVEludFRvRlBPcD47CitkZWYgdWludF90b19mcCA6IFNETm9kZTwiSVNEOjpVSU5UX1RPX0ZQIiAsIFNEVEludFRvRlBPcD47CitkZWYgZnBfdG9fc2ludCA6IFNETm9kZTwiSVNEOjpGUF9UT19TSU5UIiAsIFNEVEZQVG9JbnRPcD47CitkZWYgZnBfdG9fdWludCA6IFNETm9kZTwiSVNEOjpGUF9UT19VSU5UIiAsIFNEVEZQVG9JbnRPcD47CitkZWYgZjE2X3RvX2ZwICA6IFNETm9kZTwiSVNEOjpGUDE2X1RPX0ZQIiAsIFNEVEludFRvRlBPcD47CitkZWYgZnBfdG9fZjE2ICA6IFNETm9kZTwiSVNEOjpGUF9UT19GUDE2IiAsIFNEVEZQVG9JbnRPcD47CisKK2RlZiBzZXRjYyAgICAgIDogU0ROb2RlPCJJU0Q6OlNFVENDIiAgICAgICwgU0RUU2V0Q0M+OworZGVmIHNlbGVjdCAgICAgOiBTRE5vZGU8IklTRDo6U0VMRUNUIiAgICAgLCBTRFRTZWxlY3Q+OworZGVmIHZzZWxlY3QgICAgOiBTRE5vZGU8IklTRDo6VlNFTEVDVCIgICAgLCBTRFRWU2VsZWN0PjsKK2RlZiBzZWxlY3RjYyAgIDogU0ROb2RlPCJJU0Q6OlNFTEVDVF9DQyIgICwgU0RUU2VsZWN0Q0M+OworCitkZWYgYnJjYyAgICAgICA6IFNETm9kZTwiSVNEOjpCUl9DQyIgICAgICAsIFNEVEJyQ0MsICAgW1NETlBIYXNDaGFpbl0+OworZGVmIGJyY29uZCAgICAgOiBTRE5vZGU8IklTRDo6QlJDT05EIiAgICAgLCBTRFRCcmNvbmQsIFtTRE5QSGFzQ2hhaW5dPjsKK2RlZiBicmluZCAgICAgIDogU0ROb2RlPCJJU0Q6OkJSSU5EIiAgICAgICwgU0RUQnJpbmQsICBbU0ROUEhhc0NoYWluXT47CitkZWYgYnIgICAgICAgICA6IFNETm9kZTwiSVNEOjpCUiIgICAgICAgICAsIFNEVEJyLCAgICAgW1NETlBIYXNDaGFpbl0+OworZGVmIGNhdGNocmV0ICAgOiBTRE5vZGU8IklTRDo6Q0FUQ0hSRVQiICAgLCBTRFRDYXRjaHJldCwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBTaWRlRWZmZWN0XT47CitkZWYgY2xlYW51cHJldCA6IFNETm9kZTwiSVNEOjpDTEVBTlVQUkVUIiAsIFNEVE5vbmUsICAgW1NETlBIYXNDaGFpbl0+OworZGVmIGNhdGNocGFkICAgOiBTRE5vZGU8IklTRDo6Q0FUQ0hQQUQiICAgLCBTRFROb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUFNpZGVFZmZlY3RdPjsKKworZGVmIHRyYXAgICAgICAgOiBTRE5vZGU8IklTRDo6VFJBUCIgICAgICAgLCBTRFROb25lLAorICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUFNpZGVFZmZlY3RdPjsKK2RlZiBkZWJ1Z3RyYXAgIDogU0ROb2RlPCJJU0Q6OkRFQlVHVFJBUCIgICwgU0RUTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBTaWRlRWZmZWN0XT47CisKK2RlZiBwcmVmZXRjaCAgIDogU0ROb2RlPCJJU0Q6OlBSRUZFVENIIiAgICwgU0RUUHJlZmV0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5TG9hZCwgU0ROUE1heVN0b3JlLAorICAgICAgICAgICAgICAgICAgICAgICAgIFNETlBNZW1PcGVyYW5kXT47CisKK2RlZiByZWFkY3ljbGVjb3VudGVyIDogU0ROb2RlPCJJU0Q6OlJFQURDWUNMRUNPVU5URVIiLCBTRFRJbnRMZWFmLAorICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUFNpZGVFZmZlY3RdPjsKKworZGVmIGF0b21pY19mZW5jZSA6IFNETm9kZTwiSVNEOjpBVE9NSUNfRkVOQ0UiICwgU0RUQXRvbWljRmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBTaWRlRWZmZWN0XT47CisKK2RlZiBhdG9taWNfY21wX3N3YXAgOiBTRE5vZGU8IklTRDo6QVRPTUlDX0NNUF9TV0FQIiAsIFNEVEF0b21pYzMsCisgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZSwgU0ROUE1heUxvYWQsIFNETlBNZW1PcGVyYW5kXT47CitkZWYgYXRvbWljX2xvYWRfYWRkIDogU0ROb2RlPCJJU0Q6OkFUT01JQ19MT0FEX0FERCIgLCBTRFRBdG9taWMyLAorICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmUsIFNETlBNYXlMb2FkLCBTRE5QTWVtT3BlcmFuZF0+OworZGVmIGF0b21pY19zd2FwICAgICA6IFNETm9kZTwiSVNEOjpBVE9NSUNfU1dBUCIsIFNEVEF0b21pYzIsCisgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZSwgU0ROUE1heUxvYWQsIFNETlBNZW1PcGVyYW5kXT47CitkZWYgYXRvbWljX2xvYWRfc3ViIDogU0ROb2RlPCJJU0Q6OkFUT01JQ19MT0FEX1NVQiIgLCBTRFRBdG9taWMyLAorICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmUsIFNETlBNYXlMb2FkLCBTRE5QTWVtT3BlcmFuZF0+OworZGVmIGF0b21pY19sb2FkX2FuZCA6IFNETm9kZTwiSVNEOjpBVE9NSUNfTE9BRF9BTkQiICwgU0RUQXRvbWljMiwKKyAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlLCBTRE5QTWF5TG9hZCwgU0ROUE1lbU9wZXJhbmRdPjsKK2RlZiBhdG9taWNfbG9hZF9jbHIgOiBTRE5vZGU8IklTRDo6QVRPTUlDX0xPQURfQ0xSIiAsIFNEVEF0b21pYzIsCisgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZSwgU0ROUE1heUxvYWQsIFNETlBNZW1PcGVyYW5kXT47CitkZWYgYXRvbWljX2xvYWRfb3IgIDogU0ROb2RlPCJJU0Q6OkFUT01JQ19MT0FEX09SIiAsIFNEVEF0b21pYzIsCisgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZSwgU0ROUE1heUxvYWQsIFNETlBNZW1PcGVyYW5kXT47CitkZWYgYXRvbWljX2xvYWRfeG9yIDogU0ROb2RlPCJJU0Q6OkFUT01JQ19MT0FEX1hPUiIgLCBTRFRBdG9taWMyLAorICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmUsIFNETlBNYXlMb2FkLCBTRE5QTWVtT3BlcmFuZF0+OworZGVmIGF0b21pY19sb2FkX25hbmQ6IFNETm9kZTwiSVNEOjpBVE9NSUNfTE9BRF9OQU5EIiwgU0RUQXRvbWljMiwKKyAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlLCBTRE5QTWF5TG9hZCwgU0ROUE1lbU9wZXJhbmRdPjsKK2RlZiBhdG9taWNfbG9hZF9taW4gOiBTRE5vZGU8IklTRDo6QVRPTUlDX0xPQURfTUlOIiwgU0RUQXRvbWljMiwKKyAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlLCBTRE5QTWF5TG9hZCwgU0ROUE1lbU9wZXJhbmRdPjsKK2RlZiBhdG9taWNfbG9hZF9tYXggOiBTRE5vZGU8IklTRDo6QVRPTUlDX0xPQURfTUFYIiwgU0RUQXRvbWljMiwKKyAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlLCBTRE5QTWF5TG9hZCwgU0ROUE1lbU9wZXJhbmRdPjsKK2RlZiBhdG9taWNfbG9hZF91bWluIDogU0ROb2RlPCJJU0Q6OkFUT01JQ19MT0FEX1VNSU4iLCBTRFRBdG9taWMyLAorICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmUsIFNETlBNYXlMb2FkLCBTRE5QTWVtT3BlcmFuZF0+OworZGVmIGF0b21pY19sb2FkX3VtYXggOiBTRE5vZGU8IklTRDo6QVRPTUlDX0xPQURfVU1BWCIsIFNEVEF0b21pYzIsCisgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZSwgU0ROUE1heUxvYWQsIFNETlBNZW1PcGVyYW5kXT47CitkZWYgYXRvbWljX2xvYWQgICAgICA6IFNETm9kZTwiSVNEOjpBVE9NSUNfTE9BRCIsIFNEVEF0b21pY0xvYWQsCisgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlMb2FkLCBTRE5QTWVtT3BlcmFuZF0+OworZGVmIGF0b21pY19zdG9yZSAgICAgOiBTRE5vZGU8IklTRDo6QVRPTUlDX1NUT1JFIiwgU0RUQXRvbWljU3RvcmUsCisgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZSwgU0ROUE1lbU9wZXJhbmRdPjsKKworZGVmIG1hc2tlZF9zdG9yZSA6IFNETm9kZTwiSVNEOjpNU1RPUkUiLCAgU0RUTWFza2VkU3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZSwgU0ROUE1lbU9wZXJhbmRdPjsKK2RlZiBtYXNrZWRfbG9hZCAgOiBTRE5vZGU8IklTRDo6TUxPQUQiLCAgU0RUTWFza2VkTG9hZCwKKyAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heUxvYWQsIFNETlBNZW1PcGVyYW5kXT47CitkZWYgbWFza2VkX3NjYXR0ZXIgOiBTRE5vZGU8IklTRDo6TVNDQVRURVIiLCAgU0RUTWFza2VkU2NhdHRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbiwgU0ROUE1heVN0b3JlLCBTRE5QTWVtT3BlcmFuZF0+OworZGVmIG1hc2tlZF9nYXRoZXIgIDogU0ROb2RlPCJJU0Q6Ok1HQVRIRVIiLCAgU0RUTWFza2VkR2F0aGVyLAorICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5TG9hZCwgU0ROUE1lbU9wZXJhbmRdPjsKKworLy8gRG8gbm90IHVzZSBsZCwgc3QgZGlyZWN0bHkuIFVzZSBsb2FkLCBleHRsb2FkLCBzZXh0bG9hZCwgemV4dGxvYWQsIHN0b3JlLAorLy8gYW5kIHRydW5jc3QgKHNlZSBiZWxvdykuCitkZWYgbGQgICAgICAgICA6IFNETm9kZTwiSVNEOjpMT0FEIiAgICAgICAsIFNEVExvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5TG9hZCwgU0ROUE1lbU9wZXJhbmRdPjsKK2RlZiBzdCAgICAgICAgIDogU0ROb2RlPCJJU0Q6OlNUT1JFIiAgICAgICwgU0RUU3RvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICBbU0ROUEhhc0NoYWluLCBTRE5QTWF5U3RvcmUsIFNETlBNZW1PcGVyYW5kXT47CitkZWYgaXN0ICAgICAgICA6IFNETm9kZTwiSVNEOjpTVE9SRSIgICAgICAsIFNEVElTdG9yZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW4sIFNETlBNYXlTdG9yZSwgU0ROUE1lbU9wZXJhbmRdPjsKKworZGVmIHZlY3Rvcl9zaHVmZmxlIDogU0ROb2RlPCJJU0Q6OlZFQ1RPUl9TSFVGRkxFIiwgU0RUVmVjU2h1ZmZsZSwgW10+OworZGVmIGJ1aWxkX3ZlY3RvciA6IFNETm9kZTwiSVNEOjpCVUlMRF9WRUNUT1IiLCBTRFR5cGVQcm9maWxlPDEsIC0xLCBbXT4sIFtdPjsKK2RlZiBzY2FsYXJfdG9fdmVjdG9yIDogU0ROb2RlPCJJU0Q6OlNDQUxBUl9UT19WRUNUT1IiLCBTRFR5cGVQcm9maWxlPDEsIDEsIFtdPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtdPjsKKworLy8gdmVjdG9yX2V4dHJhY3QvdmVjdG9yX2luc2VydCBhcmUgZGVwcmVjYXRlZC4gZXh0cmFjdGVsdC9pbnNlcnRlbHQKKy8vIGFyZSBwcmVmZXJyZWQuCitkZWYgdmVjdG9yX2V4dHJhY3QgOiBTRE5vZGU8IklTRDo6RVhUUkFDVF9WRUNUT1JfRUxUIiwKKyAgICBTRFR5cGVQcm9maWxlPDEsIDIsIFtTRFRDaXNQdHJUeTwyPl0+LCBbXT47CitkZWYgdmVjdG9yX2luc2VydCA6IFNETm9kZTwiSVNEOjpJTlNFUlRfVkVDVE9SX0VMVCIsCisgICAgU0RUeXBlUHJvZmlsZTwxLCAzLCBbU0RUQ2lzU2FtZUFzPDAsIDE+LCBTRFRDaXNQdHJUeTwzPl0+LCBbXT47CitkZWYgY29uY2F0X3ZlY3RvcnMgOiBTRE5vZGU8IklTRDo6Q09OQ0FUX1ZFQ1RPUlMiLAorICAgIFNEVHlwZVByb2ZpbGU8MSwgMiwgW1NEVENpc1N1YlZlY09mVmVjPDEsIDA+LCBTRFRDaXNTYW1lQXM8MSwgMj5dPixbXT47CisKKy8vIFRoaXMgb3BlcmF0b3IgZG9lcyBub3QgZG8gc3VidmVjdG9yIHR5cGUgY2hlY2tpbmcuICBUaGUgQVJNCisvLyBiYWNrZW5kLCBhdCBsZWFzdCwgbmVlZHMgaXQuCitkZWYgdmVjdG9yX2V4dHJhY3Rfc3VidmVjIDogU0ROb2RlPCJJU0Q6OkVYVFJBQ1RfU1VCVkVDVE9SIiwKKyAgICBTRFR5cGVQcm9maWxlPDEsIDIsIFtTRFRDaXNJbnQ8Mj4sIFNEVENpc1ZlYzwxPiwgU0RUQ2lzVmVjPDA+XT4sCisgICAgW10+OworCisvLyBUaGlzIG9wZXJhdG9yIGRvZXMgc3VidmVjdG9yIHR5cGUgY2hlY2tpbmcuCitkZWYgZXh0cmFjdF9zdWJ2ZWN0b3IgOiBTRE5vZGU8IklTRDo6RVhUUkFDVF9TVUJWRUNUT1IiLCBTRFRTdWJWZWNFeHRyYWN0LCBbXT47CitkZWYgaW5zZXJ0X3N1YnZlY3RvciA6IFNETm9kZTwiSVNEOjpJTlNFUlRfU1VCVkVDVE9SIiwgU0RUU3ViVmVjSW5zZXJ0LCBbXT47CisKKy8vIE5vZGVzIGZvciBpbnRyaW5zaWNzLCB5b3Ugc2hvdWxkIHVzZSB0aGUgaW50cmluc2ljIGl0c2VsZiBhbmQgbGV0IHRibGdlbiB1c2UKKy8vIHRoZXNlIGludGVybmFsbHkuICBEb24ndCByZWZlcmVuY2UgdGhlc2UgZGlyZWN0bHkuCitkZWYgaW50cmluc2ljX3ZvaWQgOiBTRE5vZGU8IklTRDo6SU5UUklOU0lDX1ZPSUQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNEVHlwZVByb2ZpbGU8MCwgLTEsIFtTRFRDaXNQdHJUeTwwPl0+LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtTRE5QSGFzQ2hhaW5dPjsKK2RlZiBpbnRyaW5zaWNfd19jaGFpbiA6IFNETm9kZTwiSVNEOjpJTlRSSU5TSUNfV19DSEFJTiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU0RUeXBlUHJvZmlsZTwxLCAtMSwgW1NEVENpc1B0clR5PDE+XT4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1NETlBIYXNDaGFpbl0+OworZGVmIGludHJpbnNpY193b19jaGFpbiA6IFNETm9kZTwiSVNEOjpJTlRSSU5TSUNfV09fQ0hBSU4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTRFR5cGVQcm9maWxlPDEsIC0xLCBbU0RUQ2lzUHRyVHk8MT5dPiwgW10+OworCitkZWYgU0RUX2Fzc2VydGV4dCA6IFNEVHlwZVByb2ZpbGU8MSwgMSwKKyAgW1NEVENpc0ludDwwPiwgU0RUQ2lzSW50PDE+LCBTRFRDaXNTYW1lQXM8MSwgMD5dPjsKK2RlZiBhc3NlcnRzZXh0IDogU0ROb2RlPCJJU0Q6OkFzc2VydFNleHQiLCBTRFRfYXNzZXJ0ZXh0PjsKK2RlZiBhc3NlcnR6ZXh0IDogU0ROb2RlPCJJU0Q6OkFzc2VydFpleHQiLCBTRFRfYXNzZXJ0ZXh0PjsKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU2VsZWN0aW9uIERBRyBDb25kaXRpb24gQ29kZXMKKworY2xhc3MgQ29uZENvZGU7IC8vIElTRDo6Q29uZENvZGUgZW51bXMKK2RlZiBTRVRPRVEgOiBDb25kQ29kZTsgZGVmIFNFVE9HVCA6IENvbmRDb2RlOworZGVmIFNFVE9HRSA6IENvbmRDb2RlOyBkZWYgU0VUT0xUIDogQ29uZENvZGU7IGRlZiBTRVRPTEUgOiBDb25kQ29kZTsKK2RlZiBTRVRPTkUgOiBDb25kQ29kZTsgZGVmIFNFVE8gICA6IENvbmRDb2RlOyBkZWYgU0VUVU8gIDogQ29uZENvZGU7CitkZWYgU0VUVUVRIDogQ29uZENvZGU7IGRlZiBTRVRVR1QgOiBDb25kQ29kZTsgZGVmIFNFVFVHRSA6IENvbmRDb2RlOworZGVmIFNFVFVMVCA6IENvbmRDb2RlOyBkZWYgU0VUVUxFIDogQ29uZENvZGU7IGRlZiBTRVRVTkUgOiBDb25kQ29kZTsKKworZGVmIFNFVEVRIDogQ29uZENvZGU7IGRlZiBTRVRHVCA6IENvbmRDb2RlOyBkZWYgU0VUR0UgOiBDb25kQ29kZTsKK2RlZiBTRVRMVCA6IENvbmRDb2RlOyBkZWYgU0VUTEUgOiBDb25kQ29kZTsgZGVmIFNFVE5FIDogQ29uZENvZGU7CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNlbGVjdGlvbiBEQUcgTm9kZSBUcmFuc2Zvcm1hdGlvbiBGdW5jdGlvbnMuCisvLworLy8gVGhpcyBtZWNoYW5pc20gYWxsb3dzIHRhcmdldHMgdG8gbWFuaXB1bGF0ZSBub2RlcyBpbiB0aGUgb3V0cHV0IERBRyBvbmNlIGEKKy8vIG1hdGNoIGhhcyBiZWVuIGZvcm1lZC4gIFRoaXMgaXMgdHlwaWNhbGx5IHVzZWQgdG8gbWFuaXB1bGF0ZSBpbW1lZGlhdGUKKy8vIHZhbHVlcy4KKy8vCitjbGFzcyBTRE5vZGVYRm9ybTxTRE5vZGUgb3BjLCBjb2RlIHhmb3JtRnVuY3Rpb24+IHsKKyAgU0ROb2RlIE9wY29kZSA9IG9wYzsKKyAgY29kZSBYRm9ybUZ1bmN0aW9uID0geGZvcm1GdW5jdGlvbjsKK30KKworZGVmIE5PT1BfU0ROb2RlWEZvcm0gOiBTRE5vZGVYRm9ybTxpbW0sIFt7fV0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gUGF0UHJlZCBTdWJjbGFzc2VzLgorLy8KKy8vIFRoZXNlIGFsbG93IHNwZWNpZnlpbmcgZGlmZmVyZW50IHNvcnRzIG9mIHByZWRpY2F0ZXMgdGhhdCBjb250cm9sIHdoZXRoZXIgYQorLy8gbm9kZSBpcyBtYXRjaGVkLgorLy8KK2NsYXNzIFBhdFByZWQ7CisKK2NsYXNzIENvZGVQYXRQcmVkPGNvZGUgcHJlZGljYXRlPiA6IFBhdFByZWQgeworICBjb2RlIFByZWRpY2F0ZUNvZGUgPSBwcmVkaWNhdGU7Cit9CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vIFNlbGVjdGlvbiBEQUcgUGF0dGVybiBGcmFnbWVudHMuCisvLworLy8gUGF0dGVybiBmcmFnbWVudHMgYXJlIHJldXNhYmxlIGNodW5rcyBvZiBkYWdzIHRoYXQgbWF0Y2ggc3BlY2lmaWMgdGhpbmdzLgorLy8gVGhleSBjYW4gdGFrZSBhcmd1bWVudHMgYW5kIGhhdmUgQysrIHByZWRpY2F0ZXMgdGhhdCBjb250cm9sIHdoZXRoZXIgdGhleQorLy8gbWF0Y2guICBUaGV5IGFyZSBpbnRlbmRlZCB0byBtYWtlIHRoZSBwYXR0ZXJucyBmb3IgY29tbW9uIGluc3RydWN0aW9ucyBtb3JlCisvLyBjb21wYWN0IGFuZCByZWFkYWJsZS4KKy8vCisKKy8vLyBQYXRGcmFnIC0gUmVwcmVzZW50cyBhIHBhdHRlcm4gZnJhZ21lbnQuICBUaGlzIGNhbiBtYXRjaCBzb21ldGhpbmcgb24gdGhlCisvLy8gREFHLCBmcm9tIGEgc2luZ2xlIG5vZGUgdG8gbXVsdGlwbGUgbmVzdGVkIG90aGVyIGZyYWdtZW50cy4KKy8vLworY2xhc3MgUGF0RnJhZzxkYWcgb3BzLCBkYWcgZnJhZywgY29kZSBwcmVkID0gW3t9XSwKKyAgICAgICAgICAgICAgU0ROb2RlWEZvcm0geGZvcm0gPSBOT09QX1NETm9kZVhGb3JtPiA6IFNEUGF0dGVybk9wZXJhdG9yIHsKKyAgZGFnIE9wZXJhbmRzID0gb3BzOworICBkYWcgRnJhZ21lbnQgPSBmcmFnOworICBjb2RlIFByZWRpY2F0ZUNvZGUgPSBwcmVkOworICBjb2RlIEltbWVkaWF0ZUNvZGUgPSBbe31dOworICBTRE5vZGVYRm9ybSBPcGVyYW5kVHJhbnNmb3JtID0geGZvcm07CisKKyAgLy8gRGVmaW5lIGEgZmV3IHByZS1wYWNrYWdlZCBwcmVkaWNhdGVzLiBUaGlzIGhlbHBzIEdsb2JhbElTZWwgaW1wb3J0CisgIC8vIGV4aXN0aW5nIHJ1bGVzIGZyb20gU2VsZWN0aW9uREFHIGZvciBtYW55IGNvbW1vbiBjYXNlcy4KKyAgLy8gVGhleSB3aWxsIGJlIHRlc3RlZCBwcmlvciB0byB0aGUgY29kZSBpbiBwcmVkIGFuZCBtdXN0IG5vdCBiZSB1c2VkIGluCisgIC8vIEltbUxlYWYgYW5kIGl0cyBzdWJjbGFzc2VzLgorCisgIC8vIElzIHRoZSBkZXNpcmVkIHByZS1wYWNrYWdlZCBwcmVkaWNhdGUgZm9yIGEgbG9hZD8KKyAgYml0IElzTG9hZCA9ID87CisgIC8vIElzIHRoZSBkZXNpcmVkIHByZS1wYWNrYWdlZCBwcmVkaWNhdGUgZm9yIGEgc3RvcmU/CisgIGJpdCBJc1N0b3JlID0gPzsKKyAgLy8gSXMgdGhlIGRlc2lyZWQgcHJlLXBhY2thZ2VkIHByZWRpY2F0ZSBmb3IgYW4gYXRvbWljPworICBiaXQgSXNBdG9taWMgPSA/OworCisgIC8vIGNhc3Q8TG9hZFNETm9kZT4oTiktPmdldEFkZHJlc3NpbmdNb2RlKCkgPT0gSVNEOjpVTklOREVYRUQ7CisgIC8vIGNhc3Q8U3RvcmVTRE5vZGU+KE4pLT5nZXRBZGRyZXNzaW5nTW9kZSgpID09IElTRDo6VU5JTkRFWEVEOworICBiaXQgSXNVbmluZGV4ZWQgPSA/OworCisgIC8vIGNhc3Q8TG9hZFNETm9kZT4oTiktPmdldEV4dGVuc2lvblR5cGUoKSAhPSBJU0Q6Ok5PTl9FWFRMT0FECisgIGJpdCBJc05vbkV4dExvYWQgPSA/OworICAvLyBjYXN0PExvYWRTRE5vZGU+KE4pLT5nZXRFeHRlbnNpb25UeXBlKCkgPT0gSVNEOjpFWFRMT0FEOworICBiaXQgSXNBbnlFeHRMb2FkID0gPzsKKyAgLy8gY2FzdDxMb2FkU0ROb2RlPihOKS0+Z2V0RXh0ZW5zaW9uVHlwZSgpID09IElTRDo6U0VYVExPQUQ7CisgIGJpdCBJc1NpZ25FeHRMb2FkID0gPzsKKyAgLy8gY2FzdDxMb2FkU0ROb2RlPihOKS0+Z2V0RXh0ZW5zaW9uVHlwZSgpID09IElTRDo6WkVYVExPQUQ7CisgIGJpdCBJc1plcm9FeHRMb2FkID0gPzsKKyAgLy8gIWNhc3Q8U3RvcmVTRE5vZGU+KE4pLT5pc1RydW5jYXRpbmdTdG9yZSgpOworICAvLyBjYXN0PFN0b3JlU0ROb2RlPihOKS0+aXNUcnVuY2F0aW5nU3RvcmUoKTsKKyAgYml0IElzVHJ1bmNTdG9yZSA9ID87CisKKyAgLy8gY2FzdDxBdG9taWNTRE5vZGU+KE4pLT5nZXRPcmRlcmluZygpID09IEF0b21pY09yZGVyaW5nOjpNb25vdG9uaWMKKyAgYml0IElzQXRvbWljT3JkZXJpbmdNb25vdG9uaWMgPSA/OworICAvLyBjYXN0PEF0b21pY1NETm9kZT4oTiktPmdldE9yZGVyaW5nKCkgPT0gQXRvbWljT3JkZXJpbmc6OkFjcXVpcmUKKyAgYml0IElzQXRvbWljT3JkZXJpbmdBY3F1aXJlID0gPzsKKyAgLy8gY2FzdDxBdG9taWNTRE5vZGU+KE4pLT5nZXRPcmRlcmluZygpID09IEF0b21pY09yZGVyaW5nOjpSZWxlYXNlCisgIGJpdCBJc0F0b21pY09yZGVyaW5nUmVsZWFzZSA9ID87CisgIC8vIGNhc3Q8QXRvbWljU0ROb2RlPihOKS0+Z2V0T3JkZXJpbmcoKSA9PSBBdG9taWNPcmRlcmluZzo6QWNxdWlyZVJlbGVhc2UKKyAgYml0IElzQXRvbWljT3JkZXJpbmdBY3F1aXJlUmVsZWFzZSA9ID87CisgIC8vIGNhc3Q8QXRvbWljU0ROb2RlPihOKS0+Z2V0T3JkZXJpbmcoKSA9PSBBdG9taWNPcmRlcmluZzo6U2VxdWVudGlhbGx5Q29uc2lzdGVudAorICBiaXQgSXNBdG9taWNPcmRlcmluZ1NlcXVlbnRpYWxseUNvbnNpc3RlbnQgPSA/OworCisgIC8vIGlzQWNxdWlyZU9yU3Ryb25nZXIoY2FzdDxBdG9taWNTRE5vZGU+KE4pLT5nZXRPcmRlcmluZygpKQorICAvLyAhaXNBY3F1aXJlT3JTdHJvbmdlcihjYXN0PEF0b21pY1NETm9kZT4oTiktPmdldE9yZGVyaW5nKCkpCisgIGJpdCBJc0F0b21pY09yZGVyaW5nQWNxdWlyZU9yU3Ryb25nZXIgPSA/OworCisgIC8vIGlzUmVsZWFzZU9yU3Ryb25nZXIoY2FzdDxBdG9taWNTRE5vZGU+KE4pLT5nZXRPcmRlcmluZygpKQorICAvLyAhaXNSZWxlYXNlT3JTdHJvbmdlcihjYXN0PEF0b21pY1NETm9kZT4oTiktPmdldE9yZGVyaW5nKCkpCisgIGJpdCBJc0F0b21pY09yZGVyaW5nUmVsZWFzZU9yU3Ryb25nZXIgPSA/OworCisgIC8vIGNhc3Q8TG9hZFNETm9kZT4oTiktPmdldE1lbW9yeVZUKCkgPT0gTVZUOjo8VlQ+OworICAvLyBjYXN0PFN0b3JlU0ROb2RlPihOKS0+Z2V0TWVtb3J5VlQoKSA9PSBNVlQ6OjxWVD47CisgIFZhbHVlVHlwZSBNZW1vcnlWVCA9ID87CisgIC8vIGNhc3Q8TG9hZFNETm9kZT4oTiktPmdldE1lbW9yeVZUKCkuZ2V0U2NhbGFyVHlwZSgpID09IE1WVDo6PFZUPjsKKyAgLy8gY2FzdDxTdG9yZVNETm9kZT4oTiktPmdldE1lbW9yeVZUKCkuZ2V0U2NhbGFyVHlwZSgpID09IE1WVDo6PFZUPjsKKyAgVmFsdWVUeXBlIFNjYWxhck1lbW9yeVZUID0gPzsKK30KKworLy8gT3V0UGF0RnJhZyBpcyBhIHBhdHRlcm4gZnJhZ21lbnQgdGhhdCBpcyB1c2VkIGFzIHBhcnQgb2YgYW4gb3V0cHV0IHBhdHRlcm4KKy8vIChub3QgYW4gaW5wdXQgcGF0dGVybikuIFRoZXNlIGRvIG5vdCBoYXZlIHByZWRpY2F0ZXMgb3IgdHJhbnNmb3JtcywgYnV0IGFyZQorLy8gdXNlZCB0byBhdm9pZCByZXBlYXRlZCBzdWJleHByZXNzaW9ucyBpbiBvdXRwdXQgcGF0dGVybnMuCitjbGFzcyBPdXRQYXRGcmFnPGRhZyBvcHMsIGRhZyBmcmFnPgorIDogUGF0RnJhZzxvcHMsIGZyYWcsIFt7fV0sIE5PT1BfU0ROb2RlWEZvcm0+OworCisvLyBQYXRMZWFmJ3MgYXJlIHBhdHRlcm4gZnJhZ21lbnRzIHRoYXQgaGF2ZSBubyBvcGVyYW5kcy4gIFRoaXMgaXMganVzdCBhIGhlbHBlcgorLy8gdG8gZGVmaW5lIGltbWVkaWF0ZXMgYW5kIG90aGVyIGNvbW1vbiB0aGluZ3MgY29uY2lzZWx5LgorY2xhc3MgUGF0TGVhZjxkYWcgZnJhZywgY29kZSBwcmVkID0gW3t9XSwgU0ROb2RlWEZvcm0geGZvcm0gPSBOT09QX1NETm9kZVhGb3JtPgorIDogUGF0RnJhZzwob3BzKSwgZnJhZywgcHJlZCwgeGZvcm0+OworCisKKy8vIEltbUxlYWYgaXMgYSBwYXR0ZXJuIGZyYWdtZW50IHdpdGggYSBjb25zdHJhaW50IG9uIHRoZSBpbW1lZGlhdGUuICBUaGUKKy8vIGNvbnN0cmFpbnQgaXMgYSBmdW5jdGlvbiB0aGF0IGlzIHJ1biBvbiB0aGUgaW1tZWRpYXRlIChhbHdheXMgd2l0aCB0aGUgdmFsdWUKKy8vIHNpZ24gZXh0ZW5kZWQgb3V0IHRvIGFuIGludDY0X3QpIGFzIEltbS4gIEZvciBleGFtcGxlOgorLy8KKy8vICBkZWYgaW1tU0V4dDggOiBJbW1MZWFmPGkxNiwgW3sgcmV0dXJuIChjaGFyKUltbSA9PSBJbW07IH1dPjsKKy8vCisvLyB0aGlzIGlzIGEgbW9yZSBjb252ZW5pZW50IGZvcm0gdG8gbWF0Y2ggJ2ltbScgbm9kZXMgaW4gdGhhbiBQYXRMZWFmIGFuZCBhbHNvCisvLyBpcyBwcmVmZXJyZWQgb3ZlciB1c2luZyBQYXRMZWFmIGJlY2F1c2UgaXQgYWxsb3dzIHRoZSBjb2RlIGdlbmVyYXRvciB0bworLy8gcmVhc29uIG1vcmUgYWJvdXQgdGhlIGNvbnN0cmFpbnQuCisvLworLy8gSWYgRmFzdElzZWwgc2hvdWxkIGlnbm9yZSBhbGwgaW5zdHJ1Y3Rpb25zIHRoYXQgaGF2ZSBhbiBvcGVyYW5kIG9mIHRoaXMgdHlwZSwKKy8vIHRoZSBGYXN0SXNlbFNob3VsZElnbm9yZSBmbGFnIGNhbiBiZSBzZXQuICBUaGlzIGlzIGFuIG9wdGltaXphdGlvbiB0byByZWR1Y2UKKy8vIHRoZSBjb2RlIHNpemUgb2YgdGhlIGdlbmVyYXRlZCBmYXN0IGluc3RydWN0aW9uIHNlbGVjdG9yLgorY2xhc3MgSW1tTGVhZjxWYWx1ZVR5cGUgdnQsIGNvZGUgcHJlZCwgU0ROb2RlWEZvcm0geGZvcm0gPSBOT09QX1NETm9kZVhGb3JtLAorICAgICAgICAgICAgICBTRE5vZGUgSW1tTm9kZSA9IGltbT4KKyAgOiBQYXRGcmFnPChvcHMpLCAodnQgSW1tTm9kZSksIFt7fV0sIHhmb3JtPiB7CisgIGxldCBJbW1lZGlhdGVDb2RlID0gcHJlZDsKKyAgYml0IEZhc3RJc2VsU2hvdWxkSWdub3JlID0gMDsKKworICAvLyBJcyB0aGUgZGF0YSB0eXBlIG9mIHRoZSBpbW1lZGlhdGUgYW4gQVBJbnQ/CisgIGJpdCBJc0FQSW50ID0gMDsKKworICAvLyBJcyB0aGUgZGF0YSB0eXBlIG9mIHRoZSBpbW1lZGlhdGUgYW4gQVBGbG9hdD8KKyAgYml0IElzQVBGbG9hdCA9IDA7Cit9CisKKy8vIEFuIEltbUxlYWYgZXhjZXB0IHRoYXQgSW1tIGlzIGFuIEFQSW50LiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIHRvCisvLyB6ZXJvLWV4dGVuZCB0aGUgaW1tZWRpYXRlIGluc3RlYWQgb2Ygc2lnbi1leHRlbmQgaXQuCisvLworLy8gTm90ZSB0aGF0IEZhc3RJU2VsIGRvZXMgbm90IGN1cnJlbnRseSB1bmRlcnN0YW5kIEludEltbUxlYWYgYW5kIHdpbGwgbm90CisvLyBnZW5lcmF0ZSBjb2RlIGZvciBydWxlcyB0aGF0IG1ha2UgdXNlIG9mIGl0LiBBcyBzdWNoLCBpdCBkb2VzIG5vdCBtYWtlIHNlbnNlCisvLyB0byByZXBsYWNlIEltbUxlYWYgd2l0aCBJbnRJbW1MZWFmLiBIb3dldmVyLCByZXBsYWNpbmcgUGF0TGVhZiB3aXRoIGFuCisvLyBJbnRJbW1MZWFmIHdpbGwgYWxsb3cgR2xvYmFsSVNlbCB0byBpbXBvcnQgdGhlIHJ1bGUuCitjbGFzcyBJbnRJbW1MZWFmPFZhbHVlVHlwZSB2dCwgY29kZSBwcmVkLCBTRE5vZGVYRm9ybSB4Zm9ybSA9IE5PT1BfU0ROb2RlWEZvcm0+CisgICAgOiBJbW1MZWFmPHZ0LCBwcmVkLCB4Zm9ybT4geworICBsZXQgSXNBUEludCA9IDE7CisgIGxldCBGYXN0SXNlbFNob3VsZElnbm9yZSA9IDE7Cit9CisKKy8vIEFuIEltbUxlYWYgZXhjZXB0IHRoYXQgSW1tIGlzIGFuIEFQRmxvYXQuCisvLworLy8gTm90ZSB0aGF0IEZhc3RJU2VsIGRvZXMgbm90IGN1cnJlbnRseSB1bmRlcnN0YW5kIEZQSW1tTGVhZiBhbmQgd2lsbCBub3QKKy8vIGdlbmVyYXRlIGNvZGUgZm9yIHJ1bGVzIHRoYXQgbWFrZSB1c2Ugb2YgaXQuCitjbGFzcyBGUEltbUxlYWY8VmFsdWVUeXBlIHZ0LCBjb2RlIHByZWQsIFNETm9kZVhGb3JtIHhmb3JtID0gTk9PUF9TRE5vZGVYRm9ybT4KKyAgOiBJbW1MZWFmPHZ0LCBwcmVkLCB4Zm9ybSwgZnBpbW0+IHsKKyAgbGV0IElzQVBGbG9hdCA9IDE7CisgIGxldCBGYXN0SXNlbFNob3VsZElnbm9yZSA9IDE7Cit9CisKKy8vIExlYWYgZnJhZ21lbnRzLgorCitkZWYgdnRJbnQgICAgICA6IFBhdExlYWY8KHZ0KSwgIFt7IHJldHVybiBOLT5nZXRWVCgpLmlzSW50ZWdlcigpOyB9XT47CitkZWYgdnRGUCAgICAgICA6IFBhdExlYWY8KHZ0KSwgIFt7IHJldHVybiBOLT5nZXRWVCgpLmlzRmxvYXRpbmdQb2ludCgpOyB9XT47CisKK2RlZiBpbW1BbGxPbmVzVjogUGF0TGVhZjwoYnVpbGRfdmVjdG9yKSwgW3sKKyAgcmV0dXJuIElTRDo6aXNCdWlsZFZlY3RvckFsbE9uZXMoTik7Cit9XT47CitkZWYgaW1tQWxsWmVyb3NWOiBQYXRMZWFmPChidWlsZF92ZWN0b3IpLCBbeworICByZXR1cm4gSVNEOjppc0J1aWxkVmVjdG9yQWxsWmVyb3MoTik7Cit9XT47CisKKworCisvLyBPdGhlciBoZWxwZXIgZnJhZ21lbnRzLgorZGVmIG5vdCAgOiBQYXRGcmFnPChvcHMgbm9kZTokaW4pLCAoeG9yIG5vZGU6JGluLCAtMSk+OworZGVmIHZub3QgOiBQYXRGcmFnPChvcHMgbm9kZTokaW4pLCAoeG9yIG5vZGU6JGluLCBpbW1BbGxPbmVzVik+OworZGVmIGluZWcgOiBQYXRGcmFnPChvcHMgbm9kZTokaW4pLCAoc3ViIDAsIG5vZGU6JGluKT47CisKKy8vIG51bGxfZnJhZyAtIFRoZSBudWxsIHBhdHRlcm4gb3BlcmF0b3IgaXMgdXNlZCBpbiBtdWx0aWNsYXNzIGluc3RhbnRpYXRpb25zCisvLyB3aGljaCBhY2NlcHQgYW4gU0RQYXR0ZXJuT3BlcmF0b3IgZm9yIHVzZSBpbiBtYXRjaGluZyBwYXR0ZXJucyBmb3IgaW50ZXJuYWwKKy8vIGRlZmluaXRpb25zLiBXaGVuIGV4cGFuZGluZyBhIHBhdHRlcm4sIGlmIHRoZSBudWxsIGZyYWdtZW50IGlzIHJlZmVyZW5jZWQKKy8vIGluIHRoZSBleHBhbnNpb24sIHRoZSBwYXR0ZXJuIGlzIGRpc2NhcmRlZCBhbmQgaXQgaXMgYXMtaWYgJ1tdJyBoYWQgYmVlbgorLy8gc3BlY2lmaWVkLiBUaGlzIGFsbG93cyBtdWx0aWNsYXNzZXMgdG8gaGF2ZSB0aGUgaXNlbCBwYXR0ZXJucyBiZSBvcHRpb25hbC4KK2RlZiBudWxsX2ZyYWcgOiBTRFBhdHRlcm5PcGVyYXRvcjsKKworLy8gbG9hZCBmcmFnbWVudHMuCitkZWYgdW5pbmRleGVkbG9hZCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAobGQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IElzVW5pbmRleGVkID0gMTsKK30KK2RlZiBsb2FkIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh1bmluZGV4ZWRsb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzTG9hZCA9IDE7CisgIGxldCBJc05vbkV4dExvYWQgPSAxOworfQorCisvLyBleHRlbmRpbmcgbG9hZCBmcmFnbWVudHMuCitkZWYgZXh0bG9hZCAgIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh1bmluZGV4ZWRsb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzTG9hZCA9IDE7CisgIGxldCBJc0FueUV4dExvYWQgPSAxOworfQorZGVmIHNleHRsb2FkICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAodW5pbmRleGVkbG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgSXNTaWduRXh0TG9hZCA9IDE7Cit9CitkZWYgemV4dGxvYWQgIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh1bmluZGV4ZWRsb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzTG9hZCA9IDE7CisgIGxldCBJc1plcm9FeHRMb2FkID0gMTsKK30KKworZGVmIGV4dGxvYWRpMSAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGV4dGxvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gaTE7Cit9CitkZWYgZXh0bG9hZGk4ICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgTWVtb3J5VlQgPSBpODsKK30KK2RlZiBleHRsb2FkaTE2IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChleHRsb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzTG9hZCA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGkxNjsKK30KK2RlZiBleHRsb2FkaTMyIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChleHRsb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzTG9hZCA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGkzMjsKK30KK2RlZiBleHRsb2FkZjMyIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChleHRsb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzTG9hZCA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGYzMjsKK30KK2RlZiBleHRsb2FkZjY0IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChleHRsb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzTG9hZCA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGY2NDsKK30KKworZGVmIHNleHRsb2FkaTEgIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChzZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgTWVtb3J5VlQgPSBpMTsKK30KK2RlZiBzZXh0bG9hZGk4ICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoc2V4dGxvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gaTg7Cit9CitkZWYgc2V4dGxvYWRpMTYgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHNleHRsb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzTG9hZCA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGkxNjsKK30KK2RlZiBzZXh0bG9hZGkzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoc2V4dGxvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gaTMyOworfQorCitkZWYgemV4dGxvYWRpMSAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHpleHRsb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzTG9hZCA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGkxOworfQorZGVmIHpleHRsb2FkaTggIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh6ZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgTWVtb3J5VlQgPSBpODsKK30KK2RlZiB6ZXh0bG9hZGkxNiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoemV4dGxvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gaTE2OworfQorZGVmIHpleHRsb2FkaTMyIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh6ZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgTWVtb3J5VlQgPSBpMzI7Cit9CisKK2RlZiBleHRsb2FkdmkxICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgU2NhbGFyTWVtb3J5VlQgPSBpMTsKK30KK2RlZiBleHRsb2Fkdmk4ICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgU2NhbGFyTWVtb3J5VlQgPSBpODsKK30KK2RlZiBleHRsb2FkdmkxNiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgU2NhbGFyTWVtb3J5VlQgPSBpMTY7Cit9CitkZWYgZXh0bG9hZHZpMzIgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKGV4dGxvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IFNjYWxhck1lbW9yeVZUID0gaTMyOworfQorZGVmIGV4dGxvYWR2ZjMyIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChleHRsb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzTG9hZCA9IDE7CisgIGxldCBTY2FsYXJNZW1vcnlWVCA9IGYzMjsKK30KK2RlZiBleHRsb2FkdmY2NCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgU2NhbGFyTWVtb3J5VlQgPSBmNjQ7Cit9CisKK2RlZiBzZXh0bG9hZHZpMSAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHNleHRsb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzTG9hZCA9IDE7CisgIGxldCBTY2FsYXJNZW1vcnlWVCA9IGkxOworfQorZGVmIHNleHRsb2Fkdmk4ICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoc2V4dGxvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IFNjYWxhck1lbW9yeVZUID0gaTg7Cit9CitkZWYgc2V4dGxvYWR2aTE2IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChzZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgU2NhbGFyTWVtb3J5VlQgPSBpMTY7Cit9CitkZWYgc2V4dGxvYWR2aTMyIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksIChzZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgU2NhbGFyTWVtb3J5VlQgPSBpMzI7Cit9CisKK2RlZiB6ZXh0bG9hZHZpMSAgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwgKHpleHRsb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzTG9hZCA9IDE7CisgIGxldCBTY2FsYXJNZW1vcnlWVCA9IGkxOworfQorZGVmIHpleHRsb2Fkdmk4ICA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLCAoemV4dGxvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNMb2FkID0gMTsKKyAgbGV0IFNjYWxhck1lbW9yeVZUID0gaTg7Cit9CitkZWYgemV4dGxvYWR2aTE2IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh6ZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgU2NhbGFyTWVtb3J5VlQgPSBpMTY7Cit9CitkZWYgemV4dGxvYWR2aTMyIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksICh6ZXh0bG9hZCBub2RlOiRwdHIpPiB7CisgIGxldCBJc0xvYWQgPSAxOworICBsZXQgU2NhbGFyTWVtb3J5VlQgPSBpMzI7Cit9CisKKy8vIHN0b3JlIGZyYWdtZW50cy4KK2RlZiB1bmluZGV4ZWRzdG9yZSA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdCBub2RlOiR2YWwsIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzU3RvcmUgPSAxOworICBsZXQgSXNVbmluZGV4ZWQgPSAxOworfQorZGVmIHN0b3JlIDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgKHVuaW5kZXhlZHN0b3JlIG5vZGU6JHZhbCwgbm9kZTokcHRyKT4geworICBsZXQgSXNTdG9yZSA9IDE7CisgIGxldCBJc1RydW5jU3RvcmUgPSAwOworfQorCisvLyB0cnVuY3N0b3JlIGZyYWdtZW50cy4KK2RlZiB0cnVuY3N0b3JlIDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAodW5pbmRleGVkc3RvcmUgbm9kZTokdmFsLCBub2RlOiRwdHIpPiB7CisgIGxldCBJc1N0b3JlID0gMTsKKyAgbGV0IElzVHJ1bmNTdG9yZSA9IDE7Cit9CitkZWYgdHJ1bmNzdG9yZWk4IDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cnVuY3N0b3JlIG5vZGU6JHZhbCwgbm9kZTokcHRyKT4geworICBsZXQgSXNTdG9yZSA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGk4OworfQorZGVmIHRydW5jc3RvcmVpMTYgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cnVuY3N0b3JlIG5vZGU6JHZhbCwgbm9kZTokcHRyKT4geworICBsZXQgSXNTdG9yZSA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGkxNjsKK30KK2RlZiB0cnVuY3N0b3JlaTMyIDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJ1bmNzdG9yZSBub2RlOiR2YWwsIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzU3RvcmUgPSAxOworICBsZXQgTWVtb3J5VlQgPSBpMzI7Cit9CitkZWYgdHJ1bmNzdG9yZWYzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHRydW5jc3RvcmUgbm9kZTokdmFsLCBub2RlOiRwdHIpPiB7CisgIGxldCBJc1N0b3JlID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gZjMyOworfQorZGVmIHRydW5jc3RvcmVmNjQgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cnVuY3N0b3JlIG5vZGU6JHZhbCwgbm9kZTokcHRyKT4geworICBsZXQgSXNTdG9yZSA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGY2NDsKK30KKworZGVmIHRydW5jc3RvcmV2aTggOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cnVuY3N0b3JlIG5vZGU6JHZhbCwgbm9kZTokcHRyKT4geworICBsZXQgSXNTdG9yZSA9IDE7CisgIGxldCBTY2FsYXJNZW1vcnlWVCA9IGk4OworfQorCitkZWYgdHJ1bmNzdG9yZXZpMTYgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodHJ1bmNzdG9yZSBub2RlOiR2YWwsIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzU3RvcmUgPSAxOworICBsZXQgU2NhbGFyTWVtb3J5VlQgPSBpMTY7Cit9CisKK2RlZiB0cnVuY3N0b3JldmkzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0cnVuY3N0b3JlIG5vZGU6JHZhbCwgbm9kZTokcHRyKT4geworICBsZXQgSXNTdG9yZSA9IDE7CisgIGxldCBTY2FsYXJNZW1vcnlWVCA9IGkzMjsKK30KKworLy8gaW5kZXhlZCBzdG9yZSBmcmFnbWVudHMuCitkZWYgaXN0b3JlIDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgIChpc3Qgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpPiB7CisgIGxldCBJc1N0b3JlID0gMTsKKyAgbGV0IElzVHJ1bmNTdG9yZSA9IDA7Cit9CisKK2RlZiBwcmVfc3RvcmUgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGlzdG9yZSBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksIFt7CisgIElTRDo6TWVtSW5kZXhlZE1vZGUgQU0gPSBjYXN0PFN0b3JlU0ROb2RlPihOKS0+Z2V0QWRkcmVzc2luZ01vZGUoKTsKKyAgcmV0dXJuIEFNID09IElTRDo6UFJFX0lOQyB8fCBBTSA9PSBJU0Q6OlBSRV9ERUM7Cit9XT47CisKK2RlZiBpdHJ1bmNzdG9yZSA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIChpc3Qgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpPiB7CisgIGxldCBJc1N0b3JlID0gMTsKKyAgbGV0IElzVHJ1bmNTdG9yZSA9IDE7Cit9CitkZWYgcHJlX3RydW5jc3QgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRydW5jc3RvcmUgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLCBbeworICBJU0Q6Ok1lbUluZGV4ZWRNb2RlIEFNID0gY2FzdDxTdG9yZVNETm9kZT4oTiktPmdldEFkZHJlc3NpbmdNb2RlKCk7CisgIHJldHVybiBBTSA9PSBJU0Q6OlBSRV9JTkMgfHwgQU0gPT0gSVNEOjpQUkVfREVDOworfV0+OworZGVmIHByZV90cnVuY3N0aTEgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmVfdHJ1bmNzdCBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCk+IHsKKyAgbGV0IElzU3RvcmUgPSAxOworICBsZXQgTWVtb3J5VlQgPSBpMTsKK30KK2RlZiBwcmVfdHJ1bmNzdGk4IDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJlX3RydW5jc3Qgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpPiB7CisgIGxldCBJc1N0b3JlID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gaTg7Cit9CitkZWYgcHJlX3RydW5jc3RpMTYgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocHJlX3RydW5jc3Qgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpPiB7CisgIGxldCBJc1N0b3JlID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gaTE2OworfQorZGVmIHByZV90cnVuY3N0aTMyIDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByZV90cnVuY3N0IG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KT4geworICBsZXQgSXNTdG9yZSA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGkzMjsKK30KK2RlZiBwcmVfdHJ1bmNzdGYzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwcmVfdHJ1bmNzdCBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCk+IHsKKyAgbGV0IElzU3RvcmUgPSAxOworICBsZXQgTWVtb3J5VlQgPSBmMzI7Cit9CisKK2RlZiBwb3N0X3N0b3JlIDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokcHRyLCBub2RlOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgIChpc3RvcmUgbm9kZTokdmFsLCBub2RlOiRwdHIsIG5vZGU6JG9mZnNldCksIFt7CisgIElTRDo6TWVtSW5kZXhlZE1vZGUgQU0gPSBjYXN0PFN0b3JlU0ROb2RlPihOKS0+Z2V0QWRkcmVzc2luZ01vZGUoKTsKKyAgcmV0dXJuIEFNID09IElTRDo6UE9TVF9JTkMgfHwgQU0gPT0gSVNEOjpQT1NUX0RFQzsKK31dPjsKKworZGVmIHBvc3RfdHJ1bmNzdCA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAoaXRydW5jc3RvcmUgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLCBbeworICBJU0Q6Ok1lbUluZGV4ZWRNb2RlIEFNID0gY2FzdDxTdG9yZVNETm9kZT4oTiktPmdldEFkZHJlc3NpbmdNb2RlKCk7CisgIHJldHVybiBBTSA9PSBJU0Q6OlBPU1RfSU5DIHx8IEFNID09IElTRDo6UE9TVF9ERUM7Cit9XT47CitkZWYgcG9zdF90cnVuY3N0aTEgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9zdF90cnVuY3N0IG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KT4geworICBsZXQgSXNTdG9yZSA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGkxOworfQorZGVmIHBvc3RfdHJ1bmNzdGk4IDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvc3RfdHJ1bmNzdCBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCk+IHsKKyAgbGV0IElzU3RvcmUgPSAxOworICBsZXQgTWVtb3J5VlQgPSBpODsKK30KK2RlZiBwb3N0X3RydW5jc3RpMTYgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHBvc3RfdHJ1bmNzdCBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCk+IHsKKyAgbGV0IElzU3RvcmUgPSAxOworICBsZXQgTWVtb3J5VlQgPSBpMTY7Cit9CitkZWYgcG9zdF90cnVuY3N0aTMyIDogUGF0RnJhZzwob3BzIG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChwb3N0X3RydW5jc3Qgbm9kZTokdmFsLCBub2RlOiRiYXNlLCBub2RlOiRvZmZzZXQpPiB7CisgIGxldCBJc1N0b3JlID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gaTMyOworfQorZGVmIHBvc3RfdHJ1bmNzdGYzMiA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JGJhc2UsIG5vZGU6JG9mZnNldCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAocG9zdF90cnVuY3N0IG5vZGU6JHZhbCwgbm9kZTokYmFzZSwgbm9kZTokb2Zmc2V0KT4geworICBsZXQgSXNTdG9yZSA9IDE7CisgIGxldCBNZW1vcnlWVCA9IGYzMjsKK30KKworLy8gbm9udGVtcG9yYWwgc3RvcmUgZnJhZ21lbnRzLgorZGVmIG5vbnRlbXBvcmFsc3RvcmUgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdG9yZSBub2RlOiR2YWwsIG5vZGU6JHB0ciksIFt7CisgIHJldHVybiBjYXN0PFN0b3JlU0ROb2RlPihOKS0+aXNOb25UZW1wb3JhbCgpOworfV0+OworCitkZWYgYWxpZ25lZG5vbnRlbXBvcmFsc3RvcmUgOiBQYXRGcmFnPChvcHMgbm9kZTokdmFsLCBub2RlOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm9udGVtcG9yYWxzdG9yZSBub2RlOiR2YWwsIG5vZGU6JHB0ciksIFt7CisgIFN0b3JlU0ROb2RlICpTdCA9IGNhc3Q8U3RvcmVTRE5vZGU+KE4pOworICByZXR1cm4gU3QtPmdldEFsaWdubWVudCgpID49IFN0LT5nZXRNZW1vcnlWVCgpLmdldFN0b3JlU2l6ZSgpOworfV0+OworCitkZWYgdW5hbGlnbmVkbm9udGVtcG9yYWxzdG9yZSA6IFBhdEZyYWc8KG9wcyBub2RlOiR2YWwsIG5vZGU6JHB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG5vbnRlbXBvcmFsc3RvcmUgbm9kZTokdmFsLCBub2RlOiRwdHIpLCBbeworICBTdG9yZVNETm9kZSAqU3QgPSBjYXN0PFN0b3JlU0ROb2RlPihOKTsKKyAgcmV0dXJuIFN0LT5nZXRBbGlnbm1lbnQoKSA8IFN0LT5nZXRNZW1vcnlWVCgpLmdldFN0b3JlU2l6ZSgpOworfV0+OworCisvLyBub250ZW1wb3JhbCBsb2FkIGZyYWdtZW50cy4KK2RlZiBub250ZW1wb3JhbGxvYWQgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobG9hZCBub2RlOiRwdHIpLCBbeworICByZXR1cm4gY2FzdDxMb2FkU0ROb2RlPihOKS0+aXNOb25UZW1wb3JhbCgpOworfV0+OworCitkZWYgYWxpZ25lZG5vbnRlbXBvcmFsbG9hZCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobm9udGVtcG9yYWxsb2FkIG5vZGU6JHB0ciksIFt7CisgIExvYWRTRE5vZGUgKkxkID0gY2FzdDxMb2FkU0ROb2RlPihOKTsKKyAgcmV0dXJuIExkLT5nZXRBbGlnbm1lbnQoKSA+PSBMZC0+Z2V0TWVtb3J5VlQoKS5nZXRTdG9yZVNpemUoKTsKK31dPjsKKworLy8gc2V0Y2MgY29udmVuaWVuY2UgZnJhZ21lbnRzLgorZGVmIHNldG9lcSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVE9FUSk+OworZGVmIHNldG9ndCA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVE9HVCk+OworZGVmIHNldG9nZSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVE9HRSk+OworZGVmIHNldG9sdCA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVE9MVCk+OworZGVmIHNldG9sZSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVE9MRSk+OworZGVmIHNldG9uZSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVE9ORSk+OworZGVmIHNldG8gICA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVE8pPjsKK2RlZiBzZXR1byAgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRVTyk+OworZGVmIHNldHVlcSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVFVFUSk+OworZGVmIHNldHVndCA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVFVHVCk+OworZGVmIHNldHVnZSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVFVHRSk+OworZGVmIHNldHVsdCA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVFVMVCk+OworZGVmIHNldHVsZSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVFVMRSk+OworZGVmIHNldHVuZSA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVFVORSk+OworZGVmIHNldGVxICA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVEVRKT47CitkZWYgc2V0Z3QgIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwKKyAgICAgICAgICAgICAgICAgICAgIChzZXRjYyBub2RlOiRsaHMsIG5vZGU6JHJocywgU0VUR1QpPjsKK2RlZiBzZXRnZSAgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRHRSk+OworZGVmIHNldGx0ICA6IFBhdEZyYWc8KG9wcyBub2RlOiRsaHMsIG5vZGU6JHJocyksCisgICAgICAgICAgICAgICAgICAgICAoc2V0Y2Mgbm9kZTokbGhzLCBub2RlOiRyaHMsIFNFVExUKT47CitkZWYgc2V0bGUgIDogUGF0RnJhZzwob3BzIG5vZGU6JGxocywgbm9kZTokcmhzKSwKKyAgICAgICAgICAgICAgICAgICAgIChzZXRjYyBub2RlOiRsaHMsIG5vZGU6JHJocywgU0VUTEUpPjsKK2RlZiBzZXRuZSAgOiBQYXRGcmFnPChvcHMgbm9kZTokbGhzLCBub2RlOiRyaHMpLAorICAgICAgICAgICAgICAgICAgICAgKHNldGNjIG5vZGU6JGxocywgbm9kZTokcmhzLCBTRVRORSk+OworCittdWx0aWNsYXNzIGJpbmFyeV9hdG9taWNfb3Bfb3JkPFNETm9kZSBhdG9taWNfb3A+IHsKKyAgZGVmICNOQU1FI19tb25vdG9uaWMgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyLCBub2RlOiR2YWwpLAorICAgICAgKCFjYXN0PFNEUGF0dGVybk9wZXJhdG9yPigjTkFNRSkgbm9kZTokcHRyLCBub2RlOiR2YWwpPiB7CisgICAgbGV0IElzQXRvbWljID0gMTsKKyAgICBsZXQgSXNBdG9taWNPcmRlcmluZ01vbm90b25pYyA9IDE7CisgIH0KKyAgZGVmICNOQU1FI19hY3F1aXJlIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciwgbm9kZTokdmFsKSwKKyAgICAgICghY2FzdDxTRFBhdHRlcm5PcGVyYXRvcj4oI05BTUUpIG5vZGU6JHB0ciwgbm9kZTokdmFsKT4geworICAgIGxldCBJc0F0b21pYyA9IDE7CisgICAgbGV0IElzQXRvbWljT3JkZXJpbmdBY3F1aXJlID0gMTsKKyAgfQorICBkZWYgI05BTUUjX3JlbGVhc2UgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyLCBub2RlOiR2YWwpLAorICAgICAgKCFjYXN0PFNEUGF0dGVybk9wZXJhdG9yPigjTkFNRSkgbm9kZTokcHRyLCBub2RlOiR2YWwpPiB7CisgICAgbGV0IElzQXRvbWljID0gMTsKKyAgICBsZXQgSXNBdG9taWNPcmRlcmluZ1JlbGVhc2UgPSAxOworICB9CisgIGRlZiAjTkFNRSNfYWNxX3JlbCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIsIG5vZGU6JHZhbCksCisgICAgICAoIWNhc3Q8U0RQYXR0ZXJuT3BlcmF0b3I+KCNOQU1FKSBub2RlOiRwdHIsIG5vZGU6JHZhbCk+IHsKKyAgICBsZXQgSXNBdG9taWMgPSAxOworICAgIGxldCBJc0F0b21pY09yZGVyaW5nQWNxdWlyZVJlbGVhc2UgPSAxOworICB9CisgIGRlZiAjTkFNRSNfc2VxX2NzdCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIsIG5vZGU6JHZhbCksCisgICAgICAoIWNhc3Q8U0RQYXR0ZXJuT3BlcmF0b3I+KCNOQU1FKSBub2RlOiRwdHIsIG5vZGU6JHZhbCk+IHsKKyAgICBsZXQgSXNBdG9taWMgPSAxOworICAgIGxldCBJc0F0b21pY09yZGVyaW5nU2VxdWVudGlhbGx5Q29uc2lzdGVudCA9IDE7CisgIH0KK30KKworbXVsdGljbGFzcyB0ZXJuYXJ5X2F0b21pY19vcF9vcmQ8U0ROb2RlIGF0b21pY19vcD4geworICBkZWYgI05BTUUjX21vbm90b25pYyA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIsIG5vZGU6JGNtcCwgbm9kZTokdmFsKSwKKyAgICAgICghY2FzdDxTRFBhdHRlcm5PcGVyYXRvcj4oI05BTUUpIG5vZGU6JHB0ciwgbm9kZTokY21wLCBub2RlOiR2YWwpPiB7CisgICAgbGV0IElzQXRvbWljID0gMTsKKyAgICBsZXQgSXNBdG9taWNPcmRlcmluZ01vbm90b25pYyA9IDE7CisgIH0KKyAgZGVmICNOQU1FI19hY3F1aXJlIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciwgbm9kZTokY21wLCBub2RlOiR2YWwpLAorICAgICAgKCFjYXN0PFNEUGF0dGVybk9wZXJhdG9yPigjTkFNRSkgbm9kZTokcHRyLCBub2RlOiRjbXAsIG5vZGU6JHZhbCk+IHsKKyAgICBsZXQgSXNBdG9taWMgPSAxOworICAgIGxldCBJc0F0b21pY09yZGVyaW5nQWNxdWlyZSA9IDE7CisgIH0KKyAgZGVmICNOQU1FI19yZWxlYXNlIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciwgbm9kZTokY21wLCBub2RlOiR2YWwpLAorICAgICAgKCFjYXN0PFNEUGF0dGVybk9wZXJhdG9yPigjTkFNRSkgbm9kZTokcHRyLCBub2RlOiRjbXAsIG5vZGU6JHZhbCk+IHsKKyAgICBsZXQgSXNBdG9taWMgPSAxOworICAgIGxldCBJc0F0b21pY09yZGVyaW5nUmVsZWFzZSA9IDE7CisgIH0KKyAgZGVmICNOQU1FI19hY3FfcmVsIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciwgbm9kZTokY21wLCBub2RlOiR2YWwpLAorICAgICAgKCFjYXN0PFNEUGF0dGVybk9wZXJhdG9yPigjTkFNRSkgbm9kZTokcHRyLCBub2RlOiRjbXAsIG5vZGU6JHZhbCk+IHsKKyAgICBsZXQgSXNBdG9taWMgPSAxOworICAgIGxldCBJc0F0b21pY09yZGVyaW5nQWNxdWlyZVJlbGVhc2UgPSAxOworICB9CisgIGRlZiAjTkFNRSNfc2VxX2NzdCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIsIG5vZGU6JGNtcCwgbm9kZTokdmFsKSwKKyAgICAgICghY2FzdDxTRFBhdHRlcm5PcGVyYXRvcj4oI05BTUUpIG5vZGU6JHB0ciwgbm9kZTokY21wLCBub2RlOiR2YWwpPiB7CisgICAgbGV0IElzQXRvbWljID0gMTsKKyAgICBsZXQgSXNBdG9taWNPcmRlcmluZ1NlcXVlbnRpYWxseUNvbnNpc3RlbnQgPSAxOworICB9Cit9CisKK211bHRpY2xhc3MgYmluYXJ5X2F0b21pY19vcDxTRE5vZGUgYXRvbWljX29wPiB7CisgIGRlZiBfOCA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIsIG5vZGU6JHZhbCksCisgICAgICAgICAgICAgICAgICAgKGF0b21pY19vcCAgbm9kZTokcHRyLCBub2RlOiR2YWwpPiB7CisgICAgbGV0IElzQXRvbWljID0gMTsKKyAgICBsZXQgTWVtb3J5VlQgPSBpODsKKyAgfQorICBkZWYgXzE2IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciwgbm9kZTokdmFsKSwKKyAgICAgICAgICAgICAgICAgICAgKGF0b21pY19vcCBub2RlOiRwdHIsIG5vZGU6JHZhbCk+IHsKKyAgICBsZXQgSXNBdG9taWMgPSAxOworICAgIGxldCBNZW1vcnlWVCA9IGkxNjsKKyAgfQorICBkZWYgXzMyIDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciwgbm9kZTokdmFsKSwKKyAgICAgICAgICAgICAgICAgICAgKGF0b21pY19vcCBub2RlOiRwdHIsIG5vZGU6JHZhbCk+IHsKKyAgICBsZXQgSXNBdG9taWMgPSAxOworICAgIGxldCBNZW1vcnlWVCA9IGkzMjsKKyAgfQorICBkZWYgXzY0IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciwgbm9kZTokdmFsKSwKKyAgICAgICAgICAgICAgICAgICAgKGF0b21pY19vcCBub2RlOiRwdHIsIG5vZGU6JHZhbCk+IHsKKyAgICBsZXQgSXNBdG9taWMgPSAxOworICAgIGxldCBNZW1vcnlWVCA9IGk2NDsKKyAgfQorCisgIGRlZm0gTkFNRSNfOCAgOiBiaW5hcnlfYXRvbWljX29wX29yZDxhdG9taWNfb3A+OworICBkZWZtIE5BTUUjXzE2IDogYmluYXJ5X2F0b21pY19vcF9vcmQ8YXRvbWljX29wPjsKKyAgZGVmbSBOQU1FI18zMiA6IGJpbmFyeV9hdG9taWNfb3Bfb3JkPGF0b21pY19vcD47CisgIGRlZm0gTkFNRSNfNjQgOiBiaW5hcnlfYXRvbWljX29wX29yZDxhdG9taWNfb3A+OworfQorCittdWx0aWNsYXNzIHRlcm5hcnlfYXRvbWljX29wPFNETm9kZSBhdG9taWNfb3A+IHsKKyAgZGVmIF84IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciwgbm9kZTokY21wLCBub2RlOiR2YWwpLAorICAgICAgICAgICAgICAgICAgIChhdG9taWNfb3AgIG5vZGU6JHB0ciwgbm9kZTokY21wLCBub2RlOiR2YWwpPiB7CisgICAgbGV0IElzQXRvbWljID0gMTsKKyAgICBsZXQgTWVtb3J5VlQgPSBpODsKKyAgfQorICBkZWYgXzE2IDogUGF0RnJhZzwob3BzIG5vZGU6JHB0ciwgbm9kZTokY21wLCBub2RlOiR2YWwpLAorICAgICAgICAgICAgICAgICAgICAoYXRvbWljX29wIG5vZGU6JHB0ciwgbm9kZTokY21wLCBub2RlOiR2YWwpPiB7CisgICAgbGV0IElzQXRvbWljID0gMTsKKyAgICBsZXQgTWVtb3J5VlQgPSBpMTY7CisgIH0KKyAgZGVmIF8zMiA6IFBhdEZyYWc8KG9wcyBub2RlOiRwdHIsIG5vZGU6JGNtcCwgbm9kZTokdmFsKSwKKyAgICAgICAgICAgICAgICAgICAgKGF0b21pY19vcCBub2RlOiRwdHIsIG5vZGU6JGNtcCwgbm9kZTokdmFsKT4geworICAgIGxldCBJc0F0b21pYyA9IDE7CisgICAgbGV0IE1lbW9yeVZUID0gaTMyOworICB9CisgIGRlZiBfNjQgOiBQYXRGcmFnPChvcHMgbm9kZTokcHRyLCBub2RlOiRjbXAsIG5vZGU6JHZhbCksCisgICAgICAgICAgICAgICAgICAgIChhdG9taWNfb3Agbm9kZTokcHRyLCBub2RlOiRjbXAsIG5vZGU6JHZhbCk+IHsKKyAgICBsZXQgSXNBdG9taWMgPSAxOworICAgIGxldCBNZW1vcnlWVCA9IGk2NDsKKyAgfQorCisgIGRlZm0gTkFNRSNfOCAgOiB0ZXJuYXJ5X2F0b21pY19vcF9vcmQ8YXRvbWljX29wPjsKKyAgZGVmbSBOQU1FI18xNiA6IHRlcm5hcnlfYXRvbWljX29wX29yZDxhdG9taWNfb3A+OworICBkZWZtIE5BTUUjXzMyIDogdGVybmFyeV9hdG9taWNfb3Bfb3JkPGF0b21pY19vcD47CisgIGRlZm0gTkFNRSNfNjQgOiB0ZXJuYXJ5X2F0b21pY19vcF9vcmQ8YXRvbWljX29wPjsKK30KKworZGVmbSBhdG9taWNfbG9hZF9hZGQgIDogYmluYXJ5X2F0b21pY19vcDxhdG9taWNfbG9hZF9hZGQ+OworZGVmbSBhdG9taWNfc3dhcCAgICAgIDogYmluYXJ5X2F0b21pY19vcDxhdG9taWNfc3dhcD47CitkZWZtIGF0b21pY19sb2FkX3N1YiAgOiBiaW5hcnlfYXRvbWljX29wPGF0b21pY19sb2FkX3N1Yj47CitkZWZtIGF0b21pY19sb2FkX2FuZCAgOiBiaW5hcnlfYXRvbWljX29wPGF0b21pY19sb2FkX2FuZD47CitkZWZtIGF0b21pY19sb2FkX2NsciAgOiBiaW5hcnlfYXRvbWljX29wPGF0b21pY19sb2FkX2Nscj47CitkZWZtIGF0b21pY19sb2FkX29yICAgOiBiaW5hcnlfYXRvbWljX29wPGF0b21pY19sb2FkX29yPjsKK2RlZm0gYXRvbWljX2xvYWRfeG9yICA6IGJpbmFyeV9hdG9taWNfb3A8YXRvbWljX2xvYWRfeG9yPjsKK2RlZm0gYXRvbWljX2xvYWRfbmFuZCA6IGJpbmFyeV9hdG9taWNfb3A8YXRvbWljX2xvYWRfbmFuZD47CitkZWZtIGF0b21pY19sb2FkX21pbiAgOiBiaW5hcnlfYXRvbWljX29wPGF0b21pY19sb2FkX21pbj47CitkZWZtIGF0b21pY19sb2FkX21heCAgOiBiaW5hcnlfYXRvbWljX29wPGF0b21pY19sb2FkX21heD47CitkZWZtIGF0b21pY19sb2FkX3VtaW4gOiBiaW5hcnlfYXRvbWljX29wPGF0b21pY19sb2FkX3VtaW4+OworZGVmbSBhdG9taWNfbG9hZF91bWF4IDogYmluYXJ5X2F0b21pY19vcDxhdG9taWNfbG9hZF91bWF4PjsKK2RlZm0gYXRvbWljX3N0b3JlICAgICA6IGJpbmFyeV9hdG9taWNfb3A8YXRvbWljX3N0b3JlPjsKK2RlZm0gYXRvbWljX2NtcF9zd2FwICA6IHRlcm5hcnlfYXRvbWljX29wPGF0b21pY19jbXBfc3dhcD47CisKK2RlZiBhdG9taWNfbG9hZF84IDoKKyAgUGF0RnJhZzwob3BzIG5vZGU6JHB0ciksCisgICAgICAgICAgKGF0b21pY19sb2FkIG5vZGU6JHB0cik+IHsKKyAgbGV0IElzQXRvbWljID0gMTsKKyAgbGV0IE1lbW9yeVZUID0gaTg7Cit9CitkZWYgYXRvbWljX2xvYWRfMTYgOgorICBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwKKyAgICAgICAgICAoYXRvbWljX2xvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNBdG9taWMgPSAxOworICBsZXQgTWVtb3J5VlQgPSBpMTY7Cit9CitkZWYgYXRvbWljX2xvYWRfMzIgOgorICBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwKKyAgICAgICAgICAoYXRvbWljX2xvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNBdG9taWMgPSAxOworICBsZXQgTWVtb3J5VlQgPSBpMzI7Cit9CitkZWYgYXRvbWljX2xvYWRfNjQgOgorICBQYXRGcmFnPChvcHMgbm9kZTokcHRyKSwKKyAgICAgICAgICAoYXRvbWljX2xvYWQgbm9kZTokcHRyKT4geworICBsZXQgSXNBdG9taWMgPSAxOworICBsZXQgTWVtb3J5VlQgPSBpNjQ7Cit9CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBTZWxlY3Rpb24gREFHIFBhdHRlcm4gU3VwcG9ydC4KKy8vCisvLyBQYXR0ZXJucyBhcmUgd2hhdCBhcmUgYWN0dWFsbHkgbWF0Y2hlZCBhZ2FpbnN0IGJ5IHRoZSB0YXJnZXQtZmxhdm9yZWQKKy8vIGluc3RydWN0aW9uIHNlbGVjdGlvbiBEQUcuICBJbnN0cnVjdGlvbnMgZGVmaW5lZCBieSB0aGUgdGFyZ2V0IGltcGxpY2l0bHkKKy8vIGRlZmluZSBwYXR0ZXJucyBpbiBtb3N0IGNhc2VzLCBidXQgcGF0dGVybnMgY2FuIGFsc28gYmUgZXhwbGljaXRseSBhZGRlZCB3aGVuCisvLyBhbiBvcGVyYXRpb24gaXMgZGVmaW5lZCBieSBhIHNlcXVlbmNlIG9mIGluc3RydWN0aW9ucyAoZS5nLiBsb2FkaW5nIGEgbGFyZ2UKKy8vIGltbWVkaWF0ZSB2YWx1ZSBvbiBSSVNDIHRhcmdldHMgdGhhdCBkbyBub3Qgc3VwcG9ydCBpbW1lZGlhdGVzIGFzIGxhcmdlIGFzCisvLyB0aGVpciBHUFJzKS4KKy8vCisKK2NsYXNzIFBhdHRlcm48ZGFnIHBhdHRlcm5Ub01hdGNoLCBsaXN0PGRhZz4gcmVzdWx0SW5zdHJzPiB7CisgIGRhZyAgICAgICAgICAgICBQYXR0ZXJuVG9NYXRjaCAgPSBwYXR0ZXJuVG9NYXRjaDsKKyAgbGlzdDxkYWc+ICAgICAgIFJlc3VsdEluc3RycyAgICA9IHJlc3VsdEluc3RyczsKKyAgbGlzdDxQcmVkaWNhdGU+IFByZWRpY2F0ZXMgICAgICA9IFtdOyAgLy8gU2VlIGNsYXNzIEluc3RydWN0aW9uIGluIFRhcmdldC50ZC4KKyAgaW50ICAgICAgICAgICAgIEFkZGVkQ29tcGxleGl0eSA9IDA7ICAgLy8gU2VlIGNsYXNzIEluc3RydWN0aW9uIGluIFRhcmdldC50ZC4KK30KKworLy8gUGF0IC0gQSBzaW1wbGUgKGJ1dCBjb21tb24pIGZvcm0gb2YgYSBwYXR0ZXJuLCB3aGljaCBwcm9kdWNlcyBhIHNpbXBsZSByZXN1bHQKKy8vIG5vdCBuZWVkaW5nIGEgZnVsbCBsaXN0LgorY2xhc3MgUGF0PGRhZyBwYXR0ZXJuLCBkYWcgcmVzdWx0PiA6IFBhdHRlcm48cGF0dGVybiwgW3Jlc3VsdF0+OworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gQ29tcGxleCBwYXR0ZXJuIGRlZmluaXRpb25zLgorLy8KKworLy8gQ29tcGxleCBwYXR0ZXJucywgZS5nLiBYODYgYWRkcmVzc2luZyBtb2RlLCByZXF1aXJlcyBwYXR0ZXJuIG1hdGNoaW5nIGNvZGUKKy8vIGluIEMrKy4gTnVtT3BlcmFuZHMgaXMgdGhlIG51bWJlciBvZiBvcGVyYW5kcyByZXR1cm5lZCBieSB0aGUgc2VsZWN0IGZ1bmN0aW9uOworLy8gU2VsZWN0RnVuYyBpcyB0aGUgbmFtZSBvZiB0aGUgZnVuY3Rpb24gdXNlZCB0byBwYXR0ZXJuIG1hdGNoIHRoZSBtYXguIHBhdHRlcm47CisvLyBSb290Tm9kZXMgYXJlIHRoZSBsaXN0IG9mIHBvc3NpYmxlIHJvb3Qgbm9kZXMgb2YgdGhlIHN1Yi1kYWdzIHRvIG1hdGNoLgorLy8gZS5nLiBYODYgYWRkcmVzc2luZyBtb2RlIC0gZGVmIGFkZHIgOiBDb21wbGV4UGF0dGVybjw0LCAiU2VsZWN0QWRkciIsIFthZGRdPjsKKy8vCitjbGFzcyBDb21wbGV4UGF0dGVybjxWYWx1ZVR5cGUgdHksIGludCBudW1vcHMsIHN0cmluZyBmbiwKKyAgICAgICAgICAgICAgICAgICAgIGxpc3Q8U0ROb2RlPiByb290cyA9IFtdLCBsaXN0PFNETm9kZVByb3BlcnR5PiBwcm9wcyA9IFtdLAorICAgICAgICAgICAgICAgICAgICAgaW50IGNvbXBsZXhpdHkgPSAtMT4geworICBWYWx1ZVR5cGUgVHkgPSB0eTsKKyAgaW50IE51bU9wZXJhbmRzID0gbnVtb3BzOworICBzdHJpbmcgU2VsZWN0RnVuYyA9IGZuOworICBsaXN0PFNETm9kZT4gUm9vdE5vZGVzID0gcm9vdHM7CisgIGxpc3Q8U0ROb2RlUHJvcGVydHk+IFByb3BlcnRpZXMgPSBwcm9wczsKKyAgaW50IENvbXBsZXhpdHkgPSBjb21wbGV4aXR5OworfQpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UZXN0aW5nL1N1cHBvcnQvRXJyb3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGVzdGluZy9TdXBwb3J0L0Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTA4ODliOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGVzdGluZy9TdXBwb3J0L0Vycm9yLmgKQEAgLTAsMCArMSwxMDcgQEAKKy8vPT09LSBsbHZtL1Rlc3RpbmcvU3VwcG9ydC9FcnJvci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9URVNUSU5HX1NVUFBPUlRfRVJST1JfSAorI2RlZmluZSBMTFZNX1RFU1RJTkdfU1VQUE9SVF9FUlJPUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vVGVzdGluZy9TdXBwb3J0L1N1cHBvcnRIZWxwZXJzLmgiCisKKyNpbmNsdWRlICJnbW9jay9nbW9jay5oIgorI2luY2x1ZGUgPG9zdHJlYW0+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBkZXRhaWwgeworRXJyb3JIb2xkZXIgVGFrZUVycm9yKEVycm9yIEVycik7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBFeHBlY3RlZEhvbGRlcjxUPiBUYWtlRXhwZWN0ZWQoRXhwZWN0ZWQ8VD4gJkV4cCkgeworICByZXR1cm4ge1Rha2VFcnJvcihFeHAudGFrZUVycm9yKCkpLCBFeHB9OworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gRXhwZWN0ZWRIb2xkZXI8VD4gVGFrZUV4cGVjdGVkKEV4cGVjdGVkPFQ+ICYmRXhwKSB7CisgIHJldHVybiBUYWtlRXhwZWN0ZWQoRXhwKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBWYWx1ZU1hdGNoZXNNb25vCisgICAgOiBwdWJsaWMgdGVzdGluZzo6TWF0Y2hlckludGVyZmFjZTxjb25zdCBFeHBlY3RlZEhvbGRlcjxUPiAmPiB7CitwdWJsaWM6CisgIGV4cGxpY2l0IFZhbHVlTWF0Y2hlc01vbm8oY29uc3QgdGVzdGluZzo6TWF0Y2hlcjxUPiAmTWF0Y2hlcikKKyAgICAgIDogTWF0Y2hlcihNYXRjaGVyKSB7fQorCisgIGJvb2wgTWF0Y2hBbmRFeHBsYWluKGNvbnN0IEV4cGVjdGVkSG9sZGVyPFQ+ICZIb2xkZXIsCisgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6Ok1hdGNoUmVzdWx0TGlzdGVuZXIgKmxpc3RlbmVyKSBjb25zdCBvdmVycmlkZSB7CisgICAgaWYgKCFIb2xkZXIuU3VjY2VzcykKKyAgICAgIHJldHVybiBmYWxzZTsKKworICAgIGJvb2wgcmVzdWx0ID0gTWF0Y2hlci5NYXRjaEFuZEV4cGxhaW4oKkhvbGRlci5FeHAsIGxpc3RlbmVyKTsKKworICAgIGlmIChyZXN1bHQpCisgICAgICByZXR1cm4gcmVzdWx0OworICAgICpsaXN0ZW5lciA8PCAiKCI7CisgICAgTWF0Y2hlci5EZXNjcmliZU5lZ2F0aW9uVG8obGlzdGVuZXItPnN0cmVhbSgpKTsKKyAgICAqbGlzdGVuZXIgPDwgIikiOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKworICB2b2lkIERlc2NyaWJlVG8oc3RkOjpvc3RyZWFtICpPUykgY29uc3Qgb3ZlcnJpZGUgeworICAgICpPUyA8PCAic3VjY2VlZGVkIHdpdGggdmFsdWUgKCI7CisgICAgTWF0Y2hlci5EZXNjcmliZVRvKE9TKTsKKyAgICAqT1MgPDwgIikiOworICB9CisKKyAgdm9pZCBEZXNjcmliZU5lZ2F0aW9uVG8oc3RkOjpvc3RyZWFtICpPUykgY29uc3Qgb3ZlcnJpZGUgeworICAgICpPUyA8PCAiZGlkIG5vdCBzdWNjZWVkIG9yIHZhbHVlICgiOworICAgIE1hdGNoZXIuRGVzY3JpYmVOZWdhdGlvblRvKE9TKTsKKyAgICAqT1MgPDwgIikiOworICB9CisKK3ByaXZhdGU6CisgIHRlc3Rpbmc6Ok1hdGNoZXI8VD4gTWF0Y2hlcjsKK307CisKK3RlbXBsYXRlPHR5cGVuYW1lIE0+CitjbGFzcyBWYWx1ZU1hdGNoZXNQb2x5IHsKK3B1YmxpYzoKKyAgZXhwbGljaXQgVmFsdWVNYXRjaGVzUG9seShjb25zdCBNICZNYXRjaGVyKSA6IE1hdGNoZXIoTWF0Y2hlcikge30KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgb3BlcmF0b3IgdGVzdGluZzo6TWF0Y2hlcjxjb25zdCBFeHBlY3RlZEhvbGRlcjxUPiAmPigpIGNvbnN0IHsKKyAgICByZXR1cm4gTWFrZU1hdGNoZXIoCisgICAgICAgIG5ldyBWYWx1ZU1hdGNoZXNNb25vPFQ+KHRlc3Rpbmc6OlNhZmVNYXRjaGVyQ2FzdDxUPihNYXRjaGVyKSkpOworICB9CisKK3ByaXZhdGU6CisgIE0gTWF0Y2hlcjsKK307CisKK30gLy8gbmFtZXNwYWNlIGRldGFpbAorCisjZGVmaW5lIEVYUEVDVF9USEFUX0VSUk9SKEVyciwgTWF0Y2hlcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBFWFBFQ1RfVEhBVChsbHZtOjpkZXRhaWw6OlRha2VFcnJvcihFcnIpLCBNYXRjaGVyKQorI2RlZmluZSBBU1NFUlRfVEhBVF9FUlJPUihFcnIsIE1hdGNoZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQVNTRVJUX1RIQVQobGx2bTo6ZGV0YWlsOjpUYWtlRXJyb3IoRXJyKSwgTWF0Y2hlcikKKworI2RlZmluZSBFWFBFQ1RfVEhBVF9FWFBFQ1RFRChFcnIsIE1hdGNoZXIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgRVhQRUNUX1RIQVQobGx2bTo6ZGV0YWlsOjpUYWtlRXhwZWN0ZWQoRXJyKSwgTWF0Y2hlcikKKyNkZWZpbmUgQVNTRVJUX1RIQVRfRVhQRUNURUQoRXJyLCBNYXRjaGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIEFTU0VSVF9USEFUKGxsdm06OmRldGFpbDo6VGFrZUV4cGVjdGVkKEVyciksIE1hdGNoZXIpCisKK01BVENIRVIoU3VjY2VlZGVkLCAiIikgeyByZXR1cm4gYXJnLlN1Y2Nlc3M7IH0KK01BVENIRVIoRmFpbGVkLCAiIikgeyByZXR1cm4gIWFyZy5TdWNjZXNzOyB9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBNPgorZGV0YWlsOjpWYWx1ZU1hdGNoZXNQb2x5PE0+IEhhc1ZhbHVlKE0gTWF0Y2hlcikgeworICByZXR1cm4gZGV0YWlsOjpWYWx1ZU1hdGNoZXNQb2x5PE0+KE1hdGNoZXIpOworfQorCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UZXN0aW5nL1N1cHBvcnQvU3VwcG9ydEhlbHBlcnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGVzdGluZy9TdXBwb3J0L1N1cHBvcnRIZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdmMGM3MQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVGVzdGluZy9TdXBwb3J0L1N1cHBvcnRIZWxwZXJzLmgKQEAgLTAsMCArMSw0OSBAQAorLy89PT0tIFRlc3RpbmcvU3VwcG9ydC9TdXBwb3J0SGVscGVycy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RFU1RJTkdfU1VQUE9SVF9TVVBQT1JUSEVMUEVSU19ICisjZGVmaW5lIExMVk1fVEVTVElOR19TVVBQT1JUX1NVUFBPUlRIRUxQRVJTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImd0ZXN0L2d0ZXN0LXByaW50ZXJzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSBkZXRhaWwgeworc3RydWN0IEVycm9ySG9sZGVyIHsKKyAgYm9vbCBTdWNjZXNzOworICBzdGQ6OnN0cmluZyBNZXNzYWdlOworfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHN0cnVjdCBFeHBlY3RlZEhvbGRlciA6IHB1YmxpYyBFcnJvckhvbGRlciB7CisgIEV4cGVjdGVkSG9sZGVyKEVycm9ySG9sZGVyIEVyciwgRXhwZWN0ZWQ8VD4gJkV4cCkKKyAgICAgIDogRXJyb3JIb2xkZXIoc3RkOjptb3ZlKEVycikpLCBFeHAoRXhwKSB7fQorCisgIEV4cGVjdGVkPFQ+ICZFeHA7Cit9OworCitpbmxpbmUgdm9pZCBQcmludFRvKGNvbnN0IEVycm9ySG9sZGVyICZFcnIsIHN0ZDo6b3N0cmVhbSAqT3V0KSB7CisgICpPdXQgPDwgKEVyci5TdWNjZXNzID8gInN1Y2NlZWRlZCIgOiAiZmFpbGVkIik7CisgIGlmICghRXJyLlN1Y2Nlc3MpIHsKKyAgICAqT3V0IDw8ICIgICgiIDw8IFN0cmluZ1JlZihFcnIuTWVzc2FnZSkudHJpbSgpLnN0cigpIDw8ICIpIjsKKyAgfQorfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3ZvaWQgUHJpbnRUbyhjb25zdCBFeHBlY3RlZEhvbGRlcjxUPiAmSXRlbSwgc3RkOjpvc3RyZWFtICpPdXQpIHsKKyAgaWYgKEl0ZW0uU3VjY2VzcykgeworICAgICpPdXQgPDwgInN1Y2NlZWRlZCB3aXRoIHZhbHVlICIgPDwgOjp0ZXN0aW5nOjpQcmludFRvU3RyaW5nKCpJdGVtLkV4cCk7CisgIH0gZWxzZSB7CisgICAgUHJpbnRUbyhzdGF0aWNfY2FzdDxjb25zdCBFcnJvckhvbGRlciAmPihJdGVtKSwgT3V0KTsKKyAgfQorfQorfSAvLyBuYW1lc3BhY2UgZGV0YWlsCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Ub29sRHJpdmVycy9sbHZtLWRsbHRvb2wvRGxsdG9vbERyaXZlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Ub29sRHJpdmVycy9sbHZtLWRsbHRvb2wvRGxsdG9vbERyaXZlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NGIwZjcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1Rvb2xEcml2ZXJzL2xsdm0tZGxsdG9vbC9EbGx0b29sRHJpdmVyLmgKQEAgLTAsMCArMSwyNCBAQAorLy89PT0tIERsbHRvb2xEcml2ZXIuaCAtIGRsbHRvb2wuZXhlLWNvbXBhdGlibGUgZHJpdmVyIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEZWZpbmVzIGFuIGludGVyZmFjZSB0byBhIGRsbHRvb2wuZXhlLWNvbXBhdGlibGUgZHJpdmVyLgorLy8gVXNlZCBieSBsbHZtLWRsbHRvb2wuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RPT0xEUklWRVJTX0xMVk1fRExMVE9PTF9ETExUT09MRFJJVkVSX0gKKyNkZWZpbmUgTExWTV9UT09MRFJJVkVSU19MTFZNX0RMTFRPT0xfRExMVE9PTERSSVZFUl9ICisKK25hbWVzcGFjZSBsbHZtIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheVJlZjsKKworaW50IGRsbHRvb2xEcml2ZXJNYWluKEFycmF5UmVmPGNvbnN0IGNoYXIgKj4gQXJnc0Fycik7Cit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9Ub29sRHJpdmVycy9sbHZtLWxpYi9MaWJEcml2ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVG9vbERyaXZlcnMvbGx2bS1saWIvTGliRHJpdmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTQ4MDZhYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVG9vbERyaXZlcnMvbGx2bS1saWIvTGliRHJpdmVyLmgKQEAgLTAsMCArMSwyNCBAQAorLy89PT0tIGxsdm0tbGliL0xpYkRyaXZlci5oIC0gbGliLmV4ZS1jb21wYXRpYmxlIGRyaXZlciAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEZWZpbmVzIGFuIGludGVyZmFjZSB0byBhIGxpYi5leGUtY29tcGF0aWJsZSBkcml2ZXIgdGhhdCBhbHNvIHVuZGVyc3RhbmRzCisvLyBiaXRjb2RlIGZpbGVzLiBVc2VkIGJ5IGxsdm0tbGliIGFuZCBsbGQtbGluayAvbGliLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UT09MRFJJVkVSU19MTFZNX0xJQl9MSUJEUklWRVJfSAorI2RlZmluZSBMTFZNX1RPT0xEUklWRVJTX0xMVk1fTElCX0xJQkRSSVZFUl9ICisKK25hbWVzcGFjZSBsbHZtIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheVJlZjsKKworaW50IGxpYkRyaXZlck1haW4oQXJyYXlSZWY8Y29uc3QgY2hhciAqPiBBUmdzKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvQWdncmVzc2l2ZUluc3RDb21iaW5lL0FnZ3Jlc3NpdmVJbnN0Q29tYmluZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0FnZ3Jlc3NpdmVJbnN0Q29tYmluZS9BZ2dyZXNzaXZlSW5zdENvbWJpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzE4ZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0FnZ3Jlc3NpdmVJbnN0Q29tYmluZS9BZ2dyZXNzaXZlSW5zdENvbWJpbmUuaApAQCAtMCwwICsxLDM0IEBACisvLz09PS0gQWdncmVzc2l2ZUluc3RDb21iaW5lLmggLSBBZ2dyZXNzaXZlSW5zdENvbWJpbmUgcGFzcyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8KKy8vLyBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIHByaW1hcnkgaW50ZXJmYWNlIHRvIHRoZSBhZ2dyZXNzaXZlIGluc3Rjb21iaW5lIHBhc3MuCisvLy8gVGhpcyBwYXNzIGlzIHN1aXRhYmxlIGZvciB1c2UgaW4gdGhlIG5ldyBwYXNzIG1hbmFnZXIuIEZvciBhIHBhc3MgdGhhdCB3b3JrcworLy8vIHdpdGggdGhlIGxlZ2FjeSBwYXNzIG1hbmFnZXIsIHBsZWFzZSBsb29rIGZvcgorLy8vIFxjIGNyZWF0ZUFnZ3Jlc3NpdmVJbnN0Q29tYmluZXJQYXNzKCkgaW4gU2NhbGFyLmguCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0FHR1JFU1NJVkVfSU5TVENPTUJJTkVfSU5TVENPTUJJTkVfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfQUdHUkVTU0lWRV9JTlNUQ09NQklORV9JTlNUQ09NQklORV9ICisKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFnZ3Jlc3NpdmVJbnN0Q29tYmluZVBhc3MKKyAgICA6IHB1YmxpYyBQYXNzSW5mb01peGluPEFnZ3Jlc3NpdmVJbnN0Q29tYmluZVBhc3M+IHsKKworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9Db3JvdXRpbmVzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvQ29yb3V0aW5lcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxYmViNDQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvQ29yb3V0aW5lcy5oCkBAIC0wLDAgKzEsMzggQEAKKy8vPT09LS0gQ29yb3V0aW5lcy5oIC0gQ29yb3V0aW5lIFRyYW5zZm9ybWF0aW9ucyAtLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBEZWNsYXJlIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgY29yb3V0aW5lIGxvd2VyaW5nIHBhc3Nlcy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0NPUk9VVElORVNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfQ09ST1VUSU5FU19ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgUGFzczsKK2NsYXNzIFBhc3NNYW5hZ2VyQnVpbGRlcjsKKworLy8vIEFkZCBhbGwgY29yb3V0aW5lIHBhc3NlcyB0byBhcHByb3ByaWF0ZSBleHRlbnNpb24gcG9pbnRzLgordm9pZCBhZGRDb3JvdXRpbmVQYXNzZXNUb0V4dGVuc2lvblBvaW50cyhQYXNzTWFuYWdlckJ1aWxkZXIgJkJ1aWxkZXIpOworCisvLy8gTG93ZXIgY29yb3V0aW5lIGludHJpbnNpY3MgdGhhdCBhcmUgbm90IG5lZWRlZCBieSBsYXRlciBwYXNzZXMuCitQYXNzICpjcmVhdGVDb3JvRWFybHlQYXNzKCk7CisKKy8vLyBTcGxpdCB1cCBjb3JvdXRpbmVzIGludG8gbXVsdGlwbGUgZnVuY3Rpb25zIGRyaXZpbmcgdGhlaXIgc3RhdGUgbWFjaGluZXMuCitQYXNzICpjcmVhdGVDb3JvU3BsaXRQYXNzKCk7CisKKy8vLyBBbmFseXplIGNvcm91dGluZXMgdXNlIHNpdGVzLCBkZXZpcnR1YWxpemUgcmVzdW1lL2Rlc3Ryb3kgY2FsbHMgYW5kIGVsaWRlCisvLy8gaGVhcCBhbGxvY2F0aW9uIGZvciBjb3JvdXRpbmUgZnJhbWUgd2hlcmUgcG9zc2libGUuCitQYXNzICpjcmVhdGVDb3JvRWxpZGVQYXNzKCk7CisKKy8vLyBMb3dlciBhbGwgcmVtYWluaW5nIGNvcm91dGluZSBpbnRyaW5zaWNzLgorUGFzcyAqY3JlYXRlQ29yb0NsZWFudXBQYXNzKCk7CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTUxNDMzNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8uaApAQCAtMCwwICsxLDI3MSBAQAorLy89PT0tIGxsdm0vVHJhbnNmb3Jtcy9JUE8uaCAtIEludGVycHJvY2VkdXJhbCBUcmFuc2Zvcm1hdGlvbnMgLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgcHJvdG90eXBlcyBmb3IgYWNjZXNzb3IgZnVuY3Rpb25zIHRoYXQgZXhwb3NlIHBhc3NlcworLy8gaW4gdGhlIElQTyB0cmFuc2Zvcm1hdGlvbnMgbGlicmFyeS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19JUE9fSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfSVBPX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworc3RydWN0IElubGluZVBhcmFtczsKK2NsYXNzIFN0cmluZ1JlZjsKK2NsYXNzIE1vZHVsZVN1bW1hcnlJbmRleDsKK2NsYXNzIE1vZHVsZVBhc3M7CitjbGFzcyBQYXNzOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyByYXdfb3N0cmVhbTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGVzZSBmdW5jdGlvbnMgcmVtb3ZlcyBzeW1ib2xzIGZyb20gZnVuY3Rpb25zIGFuZCBtb2R1bGVzLiAgSWYgT25seURlYnVnSW5mbworLy8gaXMgdHJ1ZSwgb25seSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgcmVtb3ZlZCBmcm9tIHRoZSBtb2R1bGUuCisvLworTW9kdWxlUGFzcyAqY3JlYXRlU3RyaXBTeW1ib2xzUGFzcyhib29sIE9ubHlEZWJ1Z0luZm8gPSBmYWxzZSk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhlc2UgZnVuY3Rpb25zIHN0cmlwcyBzeW1ib2xzIGZyb20gZnVuY3Rpb25zIGFuZCBtb2R1bGVzLgorLy8gT25seSBkZWJ1Z2dpbmcgaW5mb3JtYXRpb24gaXMgbm90IHN0cmlwcGVkLgorLy8KK01vZHVsZVBhc3MgKmNyZWF0ZVN0cmlwTm9uRGVidWdTeW1ib2xzUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyByZW1vdmVzIGxsdm0uZGJnLmRlY2xhcmUgaW50cmluc2ljcy4KK01vZHVsZVBhc3MgKmNyZWF0ZVN0cmlwRGVidWdEZWNsYXJlUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyByZW1vdmVzIHVudXNlZCBzeW1ib2xzJyBkZWJ1ZyBpbmZvLgorTW9kdWxlUGFzcyAqY3JlYXRlU3RyaXBEZWFkRGVidWdJbmZvUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIGNyZWF0ZUNvbnN0YW50TWVyZ2VQYXNzIC0gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IHBhc3MgdGhhdCBtZXJnZXMKKy8vLyBkdXBsaWNhdGUgZ2xvYmFsIGNvbnN0YW50cyB0b2dldGhlciBpbnRvIGEgc2luZ2xlIGNvbnN0YW50IHRoYXQgaXMgc2hhcmVkLgorLy8vIFRoaXMgaXMgdXNlZnVsIGJlY2F1c2Ugc29tZSBwYXNzZXMgKGllIFRyYWNlVmFsdWVzKSBpbnNlcnQgYSBsb3Qgb2Ygc3RyaW5nCisvLy8gY29uc3RhbnRzIGludG8gdGhlIHByb2dyYW0sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgdGhleSBkdXBsaWNhdGUgYW4KKy8vLyBleGlzdGluZyBzdHJpbmcuCisvLy8KK01vZHVsZVBhc3MgKmNyZWF0ZUNvbnN0YW50TWVyZ2VQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gY3JlYXRlR2xvYmFsT3B0aW1pemVyUGFzcyAtIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhIG5ldyBwYXNzIHRoYXQgb3B0aW1pemVzCisvLy8gbm9uLWFkZHJlc3MgdGFrZW4gaW50ZXJuYWwgZ2xvYmFscy4KKy8vLworTW9kdWxlUGFzcyAqY3JlYXRlR2xvYmFsT3B0aW1pemVyUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIGNyZWF0ZUdsb2JhbERDRVBhc3MgLSBUaGlzIHRyYW5zZm9ybSBpcyBkZXNpZ25lZCB0byBlbGltaW5hdGUgdW5yZWFjaGFibGUKKy8vLyBpbnRlcm5hbCBnbG9iYWxzIChmdW5jdGlvbnMgb3IgZ2xvYmFsIHZhcmlhYmxlcykKKy8vLworTW9kdWxlUGFzcyAqY3JlYXRlR2xvYmFsRENFUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFRoaXMgdHJhbnNmb3JtIGlzIGRlc2lnbmVkIHRvIGVsaW1pbmF0ZSBhdmFpbGFibGUgZXh0ZXJuYWwgZ2xvYmFscworLy8vIChmdW5jdGlvbnMgb3IgZ2xvYmFsIHZhcmlhYmxlcykKKy8vLworTW9kdWxlUGFzcyAqY3JlYXRlRWxpbWluYXRlQXZhaWxhYmxlRXh0ZXJuYWxseVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVHVkV4dHJhY3Rpb25QYXNzIC0gSWYgZGVsZXRlRm4gaXMgdHJ1ZSwgdGhpcyBwYXNzIGRlbGV0ZXMKKy8vLyB0aGUgc3BlY2lmaWVkIGdsb2JhbCB2YWx1ZXMuIE90aGVyd2lzZSwgaXQgZGVsZXRlcyBhcyBtdWNoIG9mIHRoZSBtb2R1bGUgYXMKKy8vLyBwb3NzaWJsZSwgZXhjZXB0IGZvciB0aGUgZ2xvYmFsIHZhbHVlcyBzcGVjaWZpZWQuCisvLy8KK01vZHVsZVBhc3MgKmNyZWF0ZUdWRXh0cmFjdGlvblBhc3Moc3RkOjp2ZWN0b3I8R2xvYmFsVmFsdWUqPiYgR1ZzLCBib29sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlbGV0ZUZuID0gZmFsc2UpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFRoaXMgcGFzcyBwZXJmb3JtcyBpdGVyYXRpdmUgZnVuY3Rpb24gaW1wb3J0aW5nIGZyb20gb3RoZXIgbW9kdWxlcy4KK1Bhc3MgKmNyZWF0ZUZ1bmN0aW9uSW1wb3J0UGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIGNyZWF0ZUZ1bmN0aW9uSW5saW5pbmdQYXNzIC0gUmV0dXJuIGEgbmV3IHBhc3Mgb2JqZWN0IHRoYXQgdXNlcyBhIGhldXJpc3RpYworLy8vIHRvIGlubGluZSBkaXJlY3QgZnVuY3Rpb24gY2FsbHMgdG8gc21hbGwgZnVuY3Rpb25zLgorLy8vCisvLy8gVGhlIFRocmVzaG9sZCBjYW4gYmUgcGFzc2VkIGRpcmVjdGx5LCBvciBhc2tlZCB0byBiZSBjb21wdXRlZCBmcm9tIHRoZQorLy8vIGdpdmVuIG9wdGltaXphdGlvbiBhbmQgc2l6ZSBvcHRpbWl6YXRpb24gYXJndW1lbnRzLgorLy8vCisvLy8gVGhlIC1pbmxpbmUtdGhyZXNob2xkIGNvbW1hbmQgbGluZSBvcHRpb24gdGFrZXMgcHJlY2VkZW5jZSBvdmVyIHRoZQorLy8vIHRocmVzaG9sZCBnaXZlbiBoZXJlLgorUGFzcyAqY3JlYXRlRnVuY3Rpb25JbmxpbmluZ1Bhc3MoKTsKK1Bhc3MgKmNyZWF0ZUZ1bmN0aW9uSW5saW5pbmdQYXNzKGludCBUaHJlc2hvbGQpOworUGFzcyAqY3JlYXRlRnVuY3Rpb25JbmxpbmluZ1Bhc3ModW5zaWduZWQgT3B0TGV2ZWwsIHVuc2lnbmVkIFNpemVPcHRMZXZlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRGlzYWJsZUlubGluZUhvdENhbGxTaXRlKTsKK1Bhc3MgKmNyZWF0ZUZ1bmN0aW9uSW5saW5pbmdQYXNzKElubGluZVBhcmFtcyAmUGFyYW1zKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVQcnVuZUVIUGFzcyAtIFJldHVybiBhIG5ldyBwYXNzIG9iamVjdCB3aGljaCB0cmFuc2Zvcm1zIGludm9rZQorLy8vIGluc3RydWN0aW9ucyBpbnRvIGNhbGxzLCBpZiB0aGUgY2FsbGVlIGNhbiBfbm90XyB1bndpbmQgdGhlIHN0YWNrLgorLy8vCitQYXNzICpjcmVhdGVQcnVuZUVIUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIGNyZWF0ZUludGVybmFsaXplUGFzcyAtIFRoaXMgcGFzcyBsb29wcyBvdmVyIGFsbCBvZiB0aGUgZnVuY3Rpb25zIGluIHRoZQorLy8vIGlucHV0IG1vZHVsZSwgaW50ZXJuYWxpemluZyBhbGwgZ2xvYmFscyAoZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMpIGl0IGNhbi4KKy8vLy8KKy8vLyBCZWZvcmUgaW50ZXJuYWxpemluZyBhIHN5bWJvbCwgdGhlIGNhbGxiYWNrIFxwIE11c3RQcmVzZXJ2ZUdWIGlzIGludm9rZWQgYW5kCisvLy8gZ2l2ZXMgdG8gdGhlIGNsaWVudCB0aGUgYWJpbGl0eSB0byBwcmV2ZW50IGludGVybmFsaXppbmcgc3BlY2lmaWMgc3ltYm9scy4KKy8vLworLy8vIFRoZSBzeW1ib2wgaW4gRFNPTGlzdCBhcmUgaW50ZXJuYWxpemVkIGlmIGl0IGlzIHNhZmUgdG8gZHJvcCB0aGVtIGZyb20KKy8vLyB0aGUgc3ltYm9sIHRhYmxlLgorLy8vCisvLy8gTm90ZSB0aGF0IGNvbW1hbmRsaW5lIG9wdGlvbnMgdGhhdCBhcmUgdXNlZCB3aXRoIHRoZSBhYm92ZSBmdW5jdGlvbiBhcmUgbm90CisvLy8gdXNlZCBub3chCitNb2R1bGVQYXNzICoKK2NyZWF0ZUludGVybmFsaXplUGFzcyhzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgR2xvYmFsVmFsdWUgJik+IE11c3RQcmVzZXJ2ZUdWKTsKKworLy8vIGNyZWF0ZUludGVybmFsaXplUGFzcyAtIFNhbWUgYXMgYWJvdmUsIGJ1dCB3aXRoIGFuIGVtcHR5IGV4cG9ydExpc3QuCitNb2R1bGVQYXNzICpjcmVhdGVJbnRlcm5hbGl6ZVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVEZWFkQXJnRWxpbWluYXRpb25QYXNzIC0gVGhpcyBwYXNzIHJlbW92ZXMgYXJndW1lbnRzIGZyb20gZnVuY3Rpb25zCisvLy8gd2hpY2ggYXJlIG5vdCB1c2VkIGJ5IHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbi4KKy8vLworTW9kdWxlUGFzcyAqY3JlYXRlRGVhZEFyZ0VsaW1pbmF0aW9uUGFzcygpOworCisvLy8gRGVhZEFyZ0hhY2tpbmcgcGFzcyAtIFNhbWUgYXMgREFFLCBidXQgZGVsZXRlIGFyZ3VtZW50cyBvZiBleHRlcm5hbAorLy8vIGZ1bmN0aW9ucyBhcyB3ZWxsLiAgVGhpcyBpcyBkZWZpbml0ZWx5IG5vdCBzYWZlLCBhbmQgc2hvdWxkIG9ubHkgYmUgdXNlZCBieQorLy8vIGJ1Z3BvaW50LgorTW9kdWxlUGFzcyAqY3JlYXRlRGVhZEFyZ0hhY2tpbmdQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gY3JlYXRlQXJndW1lbnRQcm9tb3Rpb25QYXNzIC0gVGhpcyBwYXNzIHByb21vdGVzICJieSByZWZlcmVuY2UiIGFyZ3VtZW50cyB0bworLy8vIGJlIHBhc3NlZCBieSB2YWx1ZSBpZiB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIHBhc3NlZCBpcyBzbWFsbGVyIG9yCisvLy8gZXF1YWwgdG8gbWF4RWxlbWVudHMgKG1heEVsZW1lbnRzID09IDAgbWVhbnMgYWx3YXlzIHByb21vdGUpLgorLy8vCitQYXNzICpjcmVhdGVBcmd1bWVudFByb21vdGlvblBhc3ModW5zaWduZWQgbWF4RWxlbWVudHMgPSAzKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVJUENvbnN0YW50UHJvcGFnYXRpb25QYXNzIC0gVGhpcyBwYXNzIHByb3BhZ2F0ZXMgY29uc3RhbnRzIGZyb20gY2FsbAorLy8vIHNpdGVzIGludG8gdGhlIGJvZGllcyBvZiBmdW5jdGlvbnMuCisvLy8KK01vZHVsZVBhc3MgKmNyZWF0ZUlQQ29uc3RhbnRQcm9wYWdhdGlvblBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVJUFNDQ1BQYXNzIC0gVGhpcyBwYXNzIHByb3BhZ2F0ZXMgY29uc3RhbnRzIGZyb20gY2FsbCBzaXRlcyBpbnRvIHRoZQorLy8vIGJvZGllcyBvZiBmdW5jdGlvbnMsIGFuZCBrZWVwcyB0cmFjayBvZiB3aGV0aGVyIGJhc2ljIGJsb2NrcyBhcmUgZXhlY3V0YWJsZQorLy8vIGluIHRoZSBwcm9jZXNzLgorLy8vCitNb2R1bGVQYXNzICpjcmVhdGVJUFNDQ1BQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIGNyZWF0ZUxvb3BFeHRyYWN0b3JQYXNzIC0gVGhpcyBwYXNzIGV4dHJhY3RzIGFsbCBuYXR1cmFsIGxvb3BzIGZyb20gdGhlCisvLy8gcHJvZ3JhbSBpbnRvIGEgZnVuY3Rpb24gaWYgaXQgY2FuLgorLy8vCitQYXNzICpjcmVhdGVMb29wRXh0cmFjdG9yUGFzcygpOworCisvLy8gY3JlYXRlU2luZ2xlTG9vcEV4dHJhY3RvclBhc3MgLSBUaGlzIHBhc3MgZXh0cmFjdHMgb25lIG5hdHVyYWwgbG9vcCBmcm9tIHRoZQorLy8vIHByb2dyYW0gaW50byBhIGZ1bmN0aW9uIGlmIGl0IGNhbi4gIFRoaXMgaXMgdXNlZCBieSBidWdwb2ludC4KKy8vLworUGFzcyAqY3JlYXRlU2luZ2xlTG9vcEV4dHJhY3RvclBhc3MoKTsKKworLy8vIGNyZWF0ZUJsb2NrRXh0cmFjdG9yUGFzcyAtIFRoaXMgcGFzcyBleHRyYWN0cyBhbGwgdGhlIHNwZWNpZmllZCBibG9ja3MKKy8vLyBmcm9tIHRoZSBmdW5jdGlvbnMgaW4gdGhlIG1vZHVsZS4KKy8vLworTW9kdWxlUGFzcyAqY3JlYXRlQmxvY2tFeHRyYWN0b3JQYXNzKCk7CitNb2R1bGVQYXNzICoKK2NyZWF0ZUJsb2NrRXh0cmFjdG9yUGFzcyhjb25zdCBTbWFsbFZlY3RvckltcGw8QmFzaWNCbG9jayAqPiAmQmxvY2tzVG9FeHRyYWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRXJhc2VGdW5jdGlvbnMpOworCisvLy8gY3JlYXRlU3RyaXBEZWFkUHJvdG90eXBlc1Bhc3MgLSBUaGlzIHBhc3MgcmVtb3ZlcyBhbnkgZnVuY3Rpb24gZGVjbGFyYXRpb25zCisvLy8gKHByb3RvdHlwZXMpIHRoYXQgYXJlIG5vdCB1c2VkLgorTW9kdWxlUGFzcyAqY3JlYXRlU3RyaXBEZWFkUHJvdG90eXBlc1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVSZXZlcnNlUG9zdE9yZGVyRnVuY3Rpb25BdHRyc1Bhc3MgLSBUaGlzIHBhc3Mgd2Fsa3MgU0NDcyBvZiB0aGUgY2FsbAorLy8vIGdyYXBoIGluIFJQTyB0byBkZWR1Y2UgYW5kIHByb3BhZ2F0ZSBmdW5jdGlvbiBhdHRyaWJ1dGVzLiBDdXJyZW50bHkgaXQKKy8vLyBvbmx5IGhhbmRsZXMgc3ludGhlc2l6aW5nIG5vcmVjdXJzZSBhdHRyaWJ1dGVzLgorLy8vCitQYXNzICpjcmVhdGVSZXZlcnNlUG9zdE9yZGVyRnVuY3Rpb25BdHRyc1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVNZXJnZUZ1bmN0aW9uc1Bhc3MgLSBUaGlzIHBhc3MgZGlzY292ZXJzIGlkZW50aWNhbCBmdW5jdGlvbnMgYW5kCisvLy8gY29sbGFwc2VzIHRoZW0uCisvLy8KK01vZHVsZVBhc3MgKmNyZWF0ZU1lcmdlRnVuY3Rpb25zUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIGNyZWF0ZVBhcnRpYWxJbmxpbmluZ1Bhc3MgLSBUaGlzIHBhc3MgaW5saW5lcyBwYXJ0cyBvZiBmdW5jdGlvbnMuCisvLy8KK01vZHVsZVBhc3MgKmNyZWF0ZVBhcnRpYWxJbmxpbmluZ1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBjcmVhdGVCYXJyaWVyTm9vcFBhc3MgLSBUaGlzIHBhc3MgaXMgcHVyZWx5IGEgbW9kdWxlIHBhc3MgYmFycmllciBpbiBhIHBhc3MKKy8vLyBtYW5hZ2VyLgorTW9kdWxlUGFzcyAqY3JlYXRlQmFycmllck5vb3BQYXNzKCk7CisKKy8vLyBjcmVhdGVDYWxsZWRWYWx1ZVByb3BhZ2F0aW9uUGFzcyAtIEF0dGFjaCBtZXRhZGF0YSB0byBpbmRpcmN0IGNhbGwgc2l0ZXMKKy8vLyBpbmRpY2F0aW5nIHRoZSBzZXQgb2YgZnVuY3Rpb25zIHRoZXkgbWF5IHRhcmdldCBhdCBydW4tdGltZS4KK01vZHVsZVBhc3MgKmNyZWF0ZUNhbGxlZFZhbHVlUHJvcGFnYXRpb25QYXNzKCk7CisKKy8vLyBXaGF0IHRvIGRvIHdpdGggdGhlIHN1bW1hcnkgd2hlbiBydW5uaW5nIHBhc3NlcyB0aGF0IG9wZXJhdGUgb24gaXQuCitlbnVtIGNsYXNzIFBhc3NTdW1tYXJ5QWN0aW9uIHsKKyAgTm9uZSwgICAvLy88IERvIG5vdGhpbmcuCisgIEltcG9ydCwgLy8vPCBJbXBvcnQgaW5mb3JtYXRpb24gZnJvbSBzdW1tYXJ5LgorICBFeHBvcnQsIC8vLzwgRXhwb3J0IGluZm9ybWF0aW9uIHRvIHN1bW1hcnkuCit9OworCisvLy8gXGJyaWVmIFRoaXMgcGFzcyBsb3dlcnMgdHlwZSBtZXRhZGF0YSBhbmQgdGhlIGxsdm0udHlwZS50ZXN0IGludHJpbnNpYyB0bworLy8vIGJpdHNldHMuCisvLy8KKy8vLyBUaGUgYmVoYXZpb3IgZGVwZW5kcyBvbiB0aGUgc3VtbWFyeSBhcmd1bWVudHM6CisvLy8gLSBJZiBFeHBvcnRTdW1tYXJ5IGlzIG5vbi1udWxsLCB0aGlzIHBhc3Mgd2lsbCBleHBvcnQgdHlwZSBpZGVudGlmaWVycyB0bworLy8vICAgdGhlIGdpdmVuIHN1bW1hcnkuCisvLy8gLSBPdGhlcndpc2UsIGlmIEltcG9ydFN1bW1hcnkgaXMgbm9uLW51bGwsIHRoaXMgcGFzcyB3aWxsIGltcG9ydCB0eXBlCisvLy8gICBpZGVudGlmaWVycyBmcm9tIHRoZSBnaXZlbiBzdW1tYXJ5LgorLy8vIC0gT3RoZXJ3aXNlIGl0IGRvZXMgbmVpdGhlci4KKy8vLyBJdCBpcyBpbnZhbGlkIGZvciBib3RoIEV4cG9ydFN1bW1hcnkgYW5kIEltcG9ydFN1bW1hcnkgdG8gYmUgbm9uLW51bGwuCitNb2R1bGVQYXNzICpjcmVhdGVMb3dlclR5cGVUZXN0c1Bhc3MoTW9kdWxlU3VtbWFyeUluZGV4ICpFeHBvcnRTdW1tYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1vZHVsZVN1bW1hcnlJbmRleCAqSW1wb3J0U3VtbWFyeSk7CisKKy8vLyBcYnJpZWYgVGhpcyBwYXNzIGV4cG9ydCBDRkkgY2hlY2tzIGZvciB1c2UgYnkgZXh0ZXJuYWwgbW9kdWxlcy4KK01vZHVsZVBhc3MgKmNyZWF0ZUNyb3NzRFNPQ0ZJUGFzcygpOworCisvLy8gXGJyaWVmIFRoaXMgcGFzcyBpbXBsZW1lbnRzIHdob2xlLXByb2dyYW0gZGV2aXJ0dWFsaXphdGlvbiB1c2luZyB0eXBlCisvLy8gbWV0YWRhdGEuCisvLy8KKy8vLyBUaGUgYmVoYXZpb3IgZGVwZW5kcyBvbiB0aGUgc3VtbWFyeSBhcmd1bWVudHM6CisvLy8gLSBJZiBFeHBvcnRTdW1tYXJ5IGlzIG5vbi1udWxsLCB0aGlzIHBhc3Mgd2lsbCBleHBvcnQgdHlwZSBpZGVudGlmaWVycyB0bworLy8vICAgdGhlIGdpdmVuIHN1bW1hcnkuCisvLy8gLSBPdGhlcndpc2UsIGlmIEltcG9ydFN1bW1hcnkgaXMgbm9uLW51bGwsIHRoaXMgcGFzcyB3aWxsIGltcG9ydCB0eXBlCisvLy8gICBpZGVudGlmaWVycyBmcm9tIHRoZSBnaXZlbiBzdW1tYXJ5LgorLy8vIC0gT3RoZXJ3aXNlIGl0IGRvZXMgbmVpdGhlci4KKy8vLyBJdCBpcyBpbnZhbGlkIGZvciBib3RoIEV4cG9ydFN1bW1hcnkgYW5kIEltcG9ydFN1bW1hcnkgdG8gYmUgbm9uLW51bGwuCitNb2R1bGVQYXNzICoKK2NyZWF0ZVdob2xlUHJvZ3JhbURldmlydFBhc3MoTW9kdWxlU3VtbWFyeUluZGV4ICpFeHBvcnRTdW1tYXJ5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNb2R1bGVTdW1tYXJ5SW5kZXggKkltcG9ydFN1bW1hcnkpOworCisvLy8gVGhpcyBwYXNzIHNwbGl0cyBnbG9iYWxzIGludG8gcGllY2VzIGZvciB0aGUgYmVuZWZpdCBvZiB3aG9sZS1wcm9ncmFtCisvLy8gZGV2aXJ0dWFsaXphdGlvbiBhbmQgY29udHJvbC1mbG93IGludGVncml0eS4KK01vZHVsZVBhc3MgKmNyZWF0ZUdsb2JhbFNwbGl0UGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gU2FtcGxlUHJvZmlsZVBhc3MgLSBMb2FkcyBzYW1wbGUgcHJvZmlsZSBkYXRhIGZyb20gZGlzayBhbmQgZ2VuZXJhdGVzCisvLyBJUiBtZXRhZGF0YSB0byByZWZsZWN0IHRoZSBwcm9maWxlLgorTW9kdWxlUGFzcyAqY3JlYXRlU2FtcGxlUHJvZmlsZUxvYWRlclBhc3MoKTsKK01vZHVsZVBhc3MgKmNyZWF0ZVNhbXBsZVByb2ZpbGVMb2FkZXJQYXNzKFN0cmluZ1JlZiBOYW1lKTsKKworLy8vIFdyaXRlIFRoaW5MVE8tcmVhZHkgYml0Y29kZSB0byBTdHIuCitNb2R1bGVQYXNzICpjcmVhdGVXcml0ZVRoaW5MVE9CaXRjb2RlUGFzcyhyYXdfb3N0cmVhbSAmU3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3X29zdHJlYW0gKlRoaW5MaW5rT1MgPSBudWxscHRyKTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0Fsd2F5c0lubGluZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vQWx3YXlzSW5saW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MmMwZmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0Fsd2F5c0lubGluZXIuaApAQCAtMCwwICsxLDQ2IEBACisvLz09PS0tIEFsd2F5c0lubGluZXIuaCAtIFBhc3MgdG8gaW5saW5lICJhbHdheXNfaW5saW5lIiBmdW5jdGlvbnMgLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBQcm92aWRlcyBwYXNzZXMgdG8gaW5saW5pbmcgImFsd2F5c19pbmxpbmUiIGZ1bmN0aW9ucy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX0FMV0FZU0lOTElORVJfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfSVBPX0FMV0FZU0lOTElORVJfSAorCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBJbmxpbmVzIGZ1bmN0aW9ucyBtYXJrZWQgYXMgImFsd2F5c19pbmxpbmUiLgorLy8vCisvLy8gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgaW5saW5lIGNhbGwgc2l0ZXMgbWFya2VkIGFzIGFsd2F5c19pbmxpbmUgYW5kIGRvZXMKKy8vLyBub3QgZGVsZXRlIHRoZSBmdW5jdGlvbnMgZXZlbiB3aGVuIGFsbCB1c2VycyBhcmUgaW5saW5lZC4gVGhlIG5vcm1hbAorLy8vIGlubGluZXIgc2hvdWxkIGJlIHVzZWQgdG8gaGFuZGxlIGNhbGwgc2l0ZSBpbmxpbmluZywgdGhpcyBwYXNzJ3MgZ29hbCBpcyB0bworLy8vIGJlIHRoZSBzaW1wbGVzdCBwb3NzaWJsZSBwYXNzIHRvIHJlbW92ZSBhbHdheXNfaW5saW5lIGZ1bmN0aW9uIGRlZmluaXRpb25zJworLy8vIHVzZXMgYnkgaW5saW5pbmcgdGhlbS4gVGhlIFxjIEdsb2JhbERDRSBwYXNzIGNhbiBiZSB1c2VkIHRvIHJlbW92ZSB0aGVzZQorLy8vIGZ1bmN0aW9ucyBvbmNlIGFsbCB1c2VycyBhcmUgZ29uZS4KK2NsYXNzIEFsd2F5c0lubGluZXJQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48QWx3YXlzSW5saW5lclBhc3M+IHsKKyAgYm9vbCBJbnNlcnRMaWZldGltZTsKKworcHVibGljOgorICBBbHdheXNJbmxpbmVyUGFzcyhib29sIEluc2VydExpZmV0aW1lID0gdHJ1ZSkKKyAgICAgIDogSW5zZXJ0TGlmZXRpbWUoSW5zZXJ0TGlmZXRpbWUpIHt9CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICYpOworfTsKKworLy8vIENyZWF0ZSBhIGxlZ2FjeSBwYXNzIG1hbmFnZXIgaW5zdGFuY2Ugb2YgYSBwYXNzIHRvIGlubGluZSBhbmQgcmVtb3ZlCisvLy8gZnVuY3Rpb25zIG1hcmtlZCBhcyAiYWx3YXlzX2lubGluZSIuCitQYXNzICpjcmVhdGVBbHdheXNJbmxpbmVyTGVnYWN5UGFzcyhib29sIEluc2VydExpZmV0aW1lID0gdHJ1ZSk7CisKK30KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19JUE9fQUxXQVlTSU5MSU5FUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0FyZ3VtZW50UHJvbW90aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0FyZ3VtZW50UHJvbW90aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDljYTZjYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vQXJndW1lbnRQcm9tb3Rpb24uaApAQCAtMCwwICsxLDM2IEBACisvLz09PS0gQXJndW1lbnRQcm9tb3Rpb24uaCAtIFByb21vdGUgYnktcmVmZXJlbmNlIGFyZ3VtZW50cyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19JUE9fQVJHVU1FTlRQUk9NT1RJT05fSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfSVBPX0FSR1VNRU5UUFJPTU9USU9OX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQ0dTQ0NQYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTGF6eUNhbGxHcmFwaC5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQXJndW1lbnQgcHJvbW90aW9uIHBhc3MuCisvLy8KKy8vLyBUaGlzIHBhc3Mgd2Fsa3MgdGhlIGZ1bmN0aW9ucyBpbiBlYWNoIFNDQyBhbmQgZm9yIGVhY2ggb25lIHRyaWVzIHRvCisvLy8gdHJhbnNmb3JtIGl0IGFuZCBhbGwgb2YgaXRzIGNhbGxlcnMgdG8gcmVwbGFjZSBpbmRpcmVjdCBhcmd1bWVudHMgd2l0aAorLy8vIGRpcmVjdCAoYnktdmFsdWUpIGFyZ3VtZW50cy4KK2NsYXNzIEFyZ3VtZW50UHJvbW90aW9uUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPEFyZ3VtZW50UHJvbW90aW9uUGFzcz4geworICB1bnNpZ25lZCBNYXhFbGVtZW50czsKKworcHVibGljOgorICBBcmd1bWVudFByb21vdGlvblBhc3ModW5zaWduZWQgTWF4RWxlbWVudHMgPSAzdSkgOiBNYXhFbGVtZW50cyhNYXhFbGVtZW50cykge30KKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTGF6eUNhbGxHcmFwaDo6U0NDICZDLCBDR1NDQ0FuYWx5c2lzTWFuYWdlciAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICBMYXp5Q2FsbEdyYXBoICZDRywgQ0dTQ0NVcGRhdGVSZXN1bHQgJlVSKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfSVBPX0FSR1VNRU5UUFJPTU9USU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vQ2FsbGVkVmFsdWVQcm9wYWdhdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9DYWxsZWRWYWx1ZVByb3BhZ2F0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzUyYmRjNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vQ2FsbGVkVmFsdWVQcm9wYWdhdGlvbi5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vPT09LSBDYWxsZWRWYWx1ZVByb3BhZ2F0aW9uLmggLSBQcm9wYWdhdGUgY2FsbGVkIHZhbHVlcyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgYSB0cmFuc2Zvcm1hdGlvbiB0aGF0IGF0dGFjaGVzICFjYWxsZWVzIG1ldGFkYXRhIHRvCisvLyBpbmRpcmVjdCBjYWxsIHNpdGVzLiBGb3IgYSBnaXZlbiBjYWxsIHNpdGUsIHRoZSBtZXRhZGF0YSwgaWYgcHJlc2VudCwKKy8vIGluZGljYXRlcyB0aGUgc2V0IG9mIGZ1bmN0aW9ucyB0aGUgY2FsbCBzaXRlIGNvdWxkIHBvc3NpYmx5IHRhcmdldCBhdAorLy8gcnVuLXRpbWUuIFRoaXMgbWV0YWRhdGEgaXMgYWRkZWQgdG8gaW5kaXJlY3QgY2FsbCBzaXRlcyB3aGVuIHRoZSBzZXQgb2YKKy8vIHBvc3NpYmxlIHRhcmdldHMgY2FuIGJlIGRldGVybWluZWQgYnkgYW5hbHlzaXMgYW5kIGlzIGtub3duIHRvIGJlIHNtYWxsLiBUaGUKKy8vIGFuYWx5c2lzIGRyaXZpbmcgdGhlIHRyYW5zZm9ybWF0aW9uIGlzIHNpbWlsYXIgdG8gY29uc3RhbnQgcHJvcGFnYXRpb24gYW5kCisvLyBtYWtlcyB1c2VzIG9mIHRoZSBnZW5lcmljIHNwYXJzZSBwcm9wYWdhdGlvbiBzb2x2ZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX0NBTExFRFZBTFVFUFJPUEFHQVRJT05fSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfSVBPX0NBTExFRFZBTFVFUFJPUEFHQVRJT05fSAorCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQ2FsbGVkVmFsdWVQcm9wYWdhdGlvblBhc3MKKyAgICA6IHB1YmxpYyBQYXNzSW5mb01peGluPENhbGxlZFZhbHVlUHJvcGFnYXRpb25QYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmKTsKK307Cit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfSVBPX0NBTExFRFZBTFVFUFJPUEFHQVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9Db25zdGFudE1lcmdlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0NvbnN0YW50TWVyZ2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDRkM2FlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9Db25zdGFudE1lcmdlLmgKQEAgLTAsMCArMSwzNyBAQAorLy89PT0tIENvbnN0YW50TWVyZ2UuaCAtIE1lcmdlIGR1cGxpY2F0ZSBnbG9iYWwgY29uc3RhbnRzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgaW50ZXJmYWNlIHRvIGEgcGFzcyB0aGF0IG1lcmdlcyBkdXBsaWNhdGUgZ2xvYmFsCisvLyBjb25zdGFudHMgdG9nZXRoZXIgaW50byBhIHNpbmdsZSBjb25zdGFudCB0aGF0IGlzIHNoYXJlZC4gIFRoaXMgaXMgdXNlZnVsCisvLyBiZWNhdXNlIHNvbWUgcGFzc2VzIChpZSBUcmFjZVZhbHVlcykgaW5zZXJ0IGEgbG90IG9mIHN0cmluZyBjb25zdGFudHMgaW50bworLy8gdGhlIHByb2dyYW0sIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgYW4gZXhpc3Rpbmcgc3RyaW5nIGlzIGF2YWlsYWJsZS4KKy8vCisvLyBBbGdvcml0aG06IENvbnN0YW50TWVyZ2UgaXMgZGVzaWduZWQgdG8gYnVpbGQgdXAgYSBtYXAgb2YgYXZhaWxhYmxlIGNvbnN0YW50cworLy8gYW5kIGVsaW1pbmF0ZSBkdXBsaWNhdGVzIHdoZW4gaXQgaXMgaW5pdGlhbGl6ZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX0NPTlNUQU5UTUVSR0VfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfSVBPX0NPTlNUQU5UTUVSR0VfSAorCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1vZHVsZTsKKworLy8vIEEgcGFzcyB0aGF0IG1lcmdlcyBkdXBsaWNhdGUgZ2xvYmFsIGNvbnN0YW50cyBpbnRvIGEgc2luZ2xlIGNvbnN0YW50LgorY2xhc3MgQ29uc3RhbnRNZXJnZVBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxDb25zdGFudE1lcmdlUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX0lQT19DT05TVEFOVE1FUkdFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vQ3Jvc3NEU09DRkkuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vQ3Jvc3NEU09DRkkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOTc5ZjViCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9Dcm9zc0RTT0NGSS5oCkBAIC0wLDAgKzEsMjggQEAKKy8vPT09LS0gQ3Jvc3NEU09DRkkuY3BwIC0gRXh0ZXJuYWxpemUgdGhpcyBtb2R1bGUncyBDRkkgY2hlY2tzIC0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIGV4cG9ydHMgYWxsIGxsdm0uYml0c2V0J3MgZm91bmQgaW4gdGhlIG1vZHVsZSBpbiB0aGUgZm9ybSBvZiBhCisvLyBfX2NmaV9jaGVjayBmdW5jdGlvbiwgd2hpY2ggY2FuIGJlIHVzZWQgdG8gdmVyaWZ5IGNyb3NzLURTTyBjYWxsIHRhcmdldHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX0NST1NTRFNPQ0ZJX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19DUk9TU0RTT0NGSV9ICisKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgQ3Jvc3NEU09DRklQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48Q3Jvc3NEU09DRklQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKK30KKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfSVBPX0NST1NTRFNPQ0ZJX0gKKwpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9EZWFkQXJndW1lbnRFbGltaW5hdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9EZWFkQXJndW1lbnRFbGltaW5hdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNTY2NmYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0RlYWRBcmd1bWVudEVsaW1pbmF0aW9uLmgKQEAgLTAsMCArMSwxNDQgQEAKKy8vPT09LSBEZWFkQXJndW1lbnRFbGltaW5hdGlvbi5oIC0gRWxpbWluYXRlIERlYWQgQXJncyAtLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIGRlbGV0ZXMgZGVhZCBhcmd1bWVudHMgZnJvbSBpbnRlcm5hbCBmdW5jdGlvbnMuICBEZWFkIGFyZ3VtZW50CisvLyBlbGltaW5hdGlvbiByZW1vdmVzIGFyZ3VtZW50cyB3aGljaCBhcmUgZGlyZWN0bHkgZGVhZCwgYXMgd2VsbCBhcyBhcmd1bWVudHMKKy8vIG9ubHkgcGFzc2VkIGludG8gZnVuY3Rpb24gY2FsbHMgYXMgZGVhZCBhcmd1bWVudHMgb2Ygb3RoZXIgZnVuY3Rpb25zLiAgVGhpcworLy8gcGFzcyBhbHNvIGRlbGV0ZXMgZGVhZCByZXR1cm4gdmFsdWVzIGluIGEgc2ltaWxhciB3YXkuCisvLworLy8gVGhpcyBwYXNzIGlzIG9mdGVuIHVzZWZ1bCBhcyBhIGNsZWFudXAgcGFzcyB0byBydW4gYWZ0ZXIgYWdncmVzc2l2ZQorLy8gaW50ZXJwcm9jZWR1cmFsIHBhc3Nlcywgd2hpY2ggYWRkIHBvc3NpYmx5LWRlYWQgYXJndW1lbnRzIG9yIHJldHVybiB2YWx1ZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX0RFQURBUkdVTUVOVEVMSU1JTkFUSU9OX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19ERUFEQVJHVU1FTlRFTElNSU5BVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1R3aW5lLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx0dXBsZT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNb2R1bGU7CitjbGFzcyBVc2U7CitjbGFzcyBWYWx1ZTsKKworLy8vIEVsaW1pbmF0ZSBkZWFkIGFyZ3VtZW50cyAoYW5kIHJldHVybiB2YWx1ZXMpIGZyb20gZnVuY3Rpb25zLgorY2xhc3MgRGVhZEFyZ3VtZW50RWxpbWluYXRpb25QYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxEZWFkQXJndW1lbnRFbGltaW5hdGlvblBhc3M+IHsKK3B1YmxpYzoKKyAgLy8vIFN0cnVjdCB0aGF0IHJlcHJlc2VudHMgKHBhcnQgb2YpIGVpdGhlciBhIHJldHVybiB2YWx1ZSBvciBhIGZ1bmN0aW9uCisgIC8vLyBhcmd1bWVudC4gIFVzZWQgc28gdGhhdCBhcmd1bWVudHMgYW5kIHJldHVybiB2YWx1ZXMgY2FuIGJlIHVzZWQKKyAgLy8vIGludGVyY2hhbmdlYWJseS4KKyAgc3RydWN0IFJldE9yQXJnIHsKKyAgICBjb25zdCBGdW5jdGlvbiAqRjsKKyAgICB1bnNpZ25lZCBJZHg7CisgICAgYm9vbCBJc0FyZzsKKworICAgIFJldE9yQXJnKGNvbnN0IEZ1bmN0aW9uICpGLCB1bnNpZ25lZCBJZHgsIGJvb2wgSXNBcmcpCisgICAgICAgIDogRihGKSwgSWR4KElkeCksIElzQXJnKElzQXJnKSB7fQorCisgICAgLy8vIE1ha2UgUmV0T3JBcmcgY29tcGFyYWJsZSwgc28gd2UgY2FuIHB1dCBpdCBpbnRvIGEgbWFwLgorICAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFJldE9yQXJnICZPKSBjb25zdCB7CisgICAgICByZXR1cm4gc3RkOjp0aWUoRiwgSWR4LCBJc0FyZykgPCBzdGQ6OnRpZShPLkYsIE8uSWR4LCBPLklzQXJnKTsKKyAgICB9CisKKyAgICAvLy8gTWFrZSBSZXRPckFyZyBjb21wYXJhYmxlLCBzbyB3ZSBjYW4gZWFzaWx5IGl0ZXJhdGUgdGhlIG11bHRpbWFwLgorICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBSZXRPckFyZyAmTykgY29uc3QgeworICAgICAgcmV0dXJuIEYgPT0gTy5GICYmIElkeCA9PSBPLklkeCAmJiBJc0FyZyA9PSBPLklzQXJnOworICAgIH0KKworICAgIHN0ZDo6c3RyaW5nIGdldERlc2NyaXB0aW9uKCkgY29uc3QgeworICAgICAgcmV0dXJuIChUd2luZShJc0FyZyA/ICJBcmd1bWVudCAjIiA6ICJSZXR1cm4gdmFsdWUgIyIpICsgVHdpbmUoSWR4KSArCisgICAgICAgICAgICAgICIgb2YgZnVuY3Rpb24gIiArIEYtPmdldE5hbWUoKSkKKyAgICAgICAgICAuc3RyKCk7CisgICAgfQorICB9OworCisgIC8vLyBMaXZlbmVzcyBlbnVtIC0gRHVyaW5nIG91ciBpbml0aWFsIHBhc3Mgb3ZlciB0aGUgcHJvZ3JhbSwgd2UgZGV0ZXJtaW5lCisgIC8vLyB0aGF0IHRoaW5ncyBhcmUgZWl0aGVyIGFsaXZlIG9yIG1heWJlIGFsaXZlLiBXZSBkb24ndCBtYXJrIGFueXRoaW5nCisgIC8vLyBleHBsaWNpdGx5IGRlYWQgKGV2ZW4gaWYgd2Uga25vdyB0aGV5IGFyZSksIHNpbmNlIGFueXRoaW5nIG5vdCBhbGl2ZQorICAvLy8gd2l0aCBubyByZWdpc3RlcmVkIHVzZXMgKGluIFVzZXMpIHdpbGwgbmV2ZXIgYmUgbWFya2VkIGFsaXZlIGFuZCB3aWxsCisgIC8vLyB0aHVzIGJlY29tZSBkZWFkIGluIHRoZSBlbmQuCisgIGVudW0gTGl2ZW5lc3MgeyBMaXZlLCBNYXliZUxpdmUgfTsKKworICBEZWFkQXJndW1lbnRFbGltaW5hdGlvblBhc3MoYm9vbCBTaG91bGRIYWNrQXJndW1lbnRzXyA9IGZhbHNlKQorICAgICAgOiBTaG91bGRIYWNrQXJndW1lbnRzKFNob3VsZEhhY2tBcmd1bWVudHNfKSB7fQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmKTsKKworICAvLy8gQ29udmVuaWVuY2Ugd3JhcHBlcgorICBSZXRPckFyZyBDcmVhdGVSZXQoY29uc3QgRnVuY3Rpb24gKkYsIHVuc2lnbmVkIElkeCkgeworICAgIHJldHVybiBSZXRPckFyZyhGLCBJZHgsIGZhbHNlKTsKKyAgfQorCisgIC8vLyBDb252ZW5pZW5jZSB3cmFwcGVyCisgIFJldE9yQXJnIENyZWF0ZUFyZyhjb25zdCBGdW5jdGlvbiAqRiwgdW5zaWduZWQgSWR4KSB7CisgICAgcmV0dXJuIFJldE9yQXJnKEYsIElkeCwgdHJ1ZSk7CisgIH0KKworICB1c2luZyBVc2VNYXAgPSBzdGQ6Om11bHRpbWFwPFJldE9yQXJnLCBSZXRPckFyZz47CisKKyAgLy8vIFRoaXMgbWFwcyBhIHJldHVybiB2YWx1ZSBvciBhcmd1bWVudCB0byBhbnkgTWF5YmVMaXZlIHJldHVybiB2YWx1ZXMgb3IKKyAgLy8vIGFyZ3VtZW50cyBpdCB1c2VzLiBUaGlzIGFsbG93cyB0aGUgTWF5YmVMaXZlIHZhbHVlcyB0byBiZSBtYXJrZWQgbGl2ZQorICAvLy8gd2hlbiBhbnkgb2YgaXRzIHVzZXJzIGlzIG1hcmtlZCBsaXZlLgorICAvLy8gRm9yIGV4YW1wbGUgKGluZGljZXMgYXJlIGxlZnQgb3V0IGZvciBjbGFyaXR5KToKKyAgLy8vICAtIFVzZXNbcmV0IEZdID0gcmV0IEcKKyAgLy8vICAgIFRoaXMgbWVhbnMgdGhhdCBGIGNhbGxzIEcsIGFuZCBGIHJldHVybnMgdGhlIHZhbHVlIHJldHVybmVkIGJ5IEcuCisgIC8vLyAgLSBVc2VzW2FyZyBGXSA9IHJldCBHCisgIC8vLyAgICBUaGlzIG1lYW5zIHRoYXQgc29tZSBmdW5jdGlvbiBjYWxscyBHIGFuZCBwYXNzZXMgaXRzIHJlc3VsdCBhcyBhbgorICAvLy8gICAgYXJndW1lbnQgdG8gRi4KKyAgLy8vICAtIFVzZXNbcmV0IEZdID0gYXJnIEYKKyAgLy8vICAgIFRoaXMgbWVhbnMgdGhhdCBGIHJldHVybnMgb25lIG9mIGl0cyBvd24gYXJndW1lbnRzLgorICAvLy8gIC0gVXNlc1thcmcgRl0gPSBhcmcgRworICAvLy8gICAgVGhpcyBtZWFucyB0aGF0IEcgY2FsbHMgRiBhbmQgcGFzc2VzIG9uZSBvZiBpdHMgb3duIChHJ3MpIGFyZ3VtZW50cworICAvLy8gICAgZGlyZWN0bHkgdG8gRi4KKyAgVXNlTWFwIFVzZXM7CisKKyAgdXNpbmcgTGl2ZVNldCA9IHN0ZDo6c2V0PFJldE9yQXJnPjsKKyAgdXNpbmcgTGl2ZUZ1bmNTZXQgPSBzdGQ6OnNldDxjb25zdCBGdW5jdGlvbiAqPjsKKworICAvLy8gVGhpcyBzZXQgY29udGFpbnMgYWxsIHZhbHVlcyB0aGF0IGhhdmUgYmVlbiBkZXRlcm1pbmVkIHRvIGJlIGxpdmUuCisgIExpdmVTZXQgTGl2ZVZhbHVlczsKKworICAvLy8gVGhpcyBzZXQgY29udGFpbnMgYWxsIHZhbHVlcyB0aGF0IGFyZSBjYW5ub3QgYmUgY2hhbmdlZCBpbiBhbnkgd2F5LgorICBMaXZlRnVuY1NldCBMaXZlRnVuY3Rpb25zOworCisgIHVzaW5nIFVzZVZlY3RvciA9IFNtYWxsVmVjdG9yPFJldE9yQXJnLCA1PjsKKworICAvLy8gVGhpcyBhbGxvd3MgdGhpcyBwYXNzIHRvIGRvIGRvdWJsZS1kdXR5IGFzIHRoZSBkZWFkIGFyZyBoYWNraW5nIHBhc3MKKyAgLy8vICh1c2VkIG9ubHkgYnkgYnVncG9pbnQpLgorICBib29sIFNob3VsZEhhY2tBcmd1bWVudHMgPSBmYWxzZTsKKworcHJpdmF0ZToKKyAgTGl2ZW5lc3MgTWFya0lmTm90TGl2ZShSZXRPckFyZyBVc2UsIFVzZVZlY3RvciAmTWF5YmVMaXZlVXNlcyk7CisgIExpdmVuZXNzIFN1cnZleVVzZShjb25zdCBVc2UgKlUsIFVzZVZlY3RvciAmTWF5YmVMaXZlVXNlcywKKyAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFJldFZhbE51bSA9IC0xVSk7CisgIExpdmVuZXNzIFN1cnZleVVzZXMoY29uc3QgVmFsdWUgKlYsIFVzZVZlY3RvciAmTWF5YmVMaXZlVXNlcyk7CisKKyAgdm9pZCBTdXJ2ZXlGdW5jdGlvbihjb25zdCBGdW5jdGlvbiAmRik7CisgIHZvaWQgTWFya1ZhbHVlKGNvbnN0IFJldE9yQXJnICZSQSwgTGl2ZW5lc3MgTCwKKyAgICAgICAgICAgICAgICAgY29uc3QgVXNlVmVjdG9yICZNYXliZUxpdmVVc2VzKTsKKyAgdm9pZCBNYXJrTGl2ZShjb25zdCBSZXRPckFyZyAmUkEpOworICB2b2lkIE1hcmtMaXZlKGNvbnN0IEZ1bmN0aW9uICZGKTsKKyAgdm9pZCBQcm9wYWdhdGVMaXZlbmVzcyhjb25zdCBSZXRPckFyZyAmUkEpOworICBib29sIFJlbW92ZURlYWRTdHVmZkZyb21GdW5jdGlvbihGdW5jdGlvbiAqRik7CisgIGJvb2wgRGVsZXRlRGVhZFZhcmFyZ3MoRnVuY3Rpb24gJkZuKTsKKyAgYm9vbCBSZW1vdmVEZWFkQXJndW1lbnRzRnJvbUNhbGxlcnMoRnVuY3Rpb24gJkZuKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfSVBPX0RFQURBUkdVTUVOVEVMSU1JTkFUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vRWxpbUF2YWlsRXh0ZXJuLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0VsaW1BdmFpbEV4dGVybi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0Y2I5NTQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0VsaW1BdmFpbEV4dGVybi5oCkBAIC0wLDAgKzEsMzMgQEAKKy8vPT09LSBFbGltQXZhaWxFeHRlcm4uaCAtIE9wdGltaXplIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyB0cmFuc2Zvcm0gaXMgZGVzaWduZWQgdG8gZWxpbWluYXRlIGF2YWlsYWJsZSBleHRlcm5hbCBnbG9iYWwKKy8vIGRlZmluaXRpb25zIGZyb20gdGhlIHByb2dyYW0sIHR1cm5pbmcgdGhlbSBpbnRvIGRlY2xhcmF0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19JUE9fRUxJTUFWQUlMRVhURVJOX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19FTElNQVZBSUxFWFRFUk5fSAorCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1vZHVsZTsKKworLy8vIEEgcGFzcyB0aGF0IHRyYW5zZm9ybXMgZXh0ZXJuYWwgZ2xvYmFsIGRlZmluaXRpb25zIGludG8gZGVjbGFyYXRpb25zLgorY2xhc3MgRWxpbWluYXRlQXZhaWxhYmxlRXh0ZXJuYWxseVBhc3MKKyAgICA6IHB1YmxpYyBQYXNzSW5mb01peGluPEVsaW1pbmF0ZUF2YWlsYWJsZUV4dGVybmFsbHlQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfSVBPX0VMSU1BVkFJTEVYVEVSTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0ZvcmNlRnVuY3Rpb25BdHRycy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9Gb3JjZUZ1bmN0aW9uQXR0cnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjhhNjU0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9Gb3JjZUZ1bmN0aW9uQXR0cnMuaApAQCAtMCwwICsxLDMzIEBACisvLz09PS0tIEZvcmNlRnVuY3Rpb25BdHRycy5oIC0gRm9yY2UgZnVuY3Rpb24gYXR0cnMgZm9yIGRlYnVnZ2luZyAtLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gU3VwZXIgc2ltcGxlIHBhc3NlcyB0byBmb3JjZSBzcGVjaWZpYyBmdW5jdGlvbiBhdHRycyBmcm9tIHRoZSBjb21tYW5kbGluZQorLy8vIGludG8gdGhlIElSIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19JUE9fRk9SQ0VGVU5DVElPTkFUVFJTX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19GT1JDRUZVTkNUSU9OQVRUUlNfSAorCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFBhc3Mgd2hpY2ggZm9yY2VzIHNwZWNpZmljIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgaW50byB0aGUgSVIsIHByaW1hcmlseSBhcworLy8vIGEgZGVidWdnaW5nIHRvb2wuCitzdHJ1Y3QgRm9yY2VGdW5jdGlvbkF0dHJzUGFzcyA6IFBhc3NJbmZvTWl4aW48Rm9yY2VGdW5jdGlvbkF0dHJzUGFzcz4geworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJik7Cit9OworCisvLy8gQ3JlYXRlIGEgbGVnYWN5IHBhc3MgbWFuYWdlciBpbnN0YW5jZSBvZiBhIHBhc3MgdG8gZm9yY2UgZnVuY3Rpb24gYXR0cnMuCitQYXNzICpjcmVhdGVGb3JjZUZ1bmN0aW9uQXR0cnNMZWdhY3lQYXNzKCk7CisKK30KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19JUE9fRk9SQ0VGVU5DVElPTkFUVFJTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vRnVuY3Rpb25BdHRycy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9GdW5jdGlvbkF0dHJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGM5ZjE4YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vRnVuY3Rpb25BdHRycy5oCkBAIC0wLDAgKzEsNzcgQEAKKy8vPT09LSBGdW5jdGlvbkF0dHJzLmggLSBDb21wdXRlIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gUHJvdmlkZXMgcGFzc2VzIGZvciBjb21wdXRpbmcgZnVuY3Rpb24gYXR0cmlidXRlcyBiYXNlZCBvbiBpbnRlcnByb2NlZHVyYWwKKy8vLyBhbmFseXNlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19JUE9fRlVOQ1RJT05BVFRSU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JUE9fRlVOQ1RJT05BVFRSU19ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0NHU0NDUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xhenlDYWxsR3JhcGguaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQUFSZXN1bHRzOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBNb2R1bGU7CitjbGFzcyBQYXNzOworCisvLy8gVGhlIHRocmVlIGtpbmRzIG9mIG1lbW9yeSBhY2Nlc3MgcmVsZXZhbnQgdG8gJ3JlYWRvbmx5JyBhbmQKKy8vLyAncmVhZG5vbmUnIGF0dHJpYnV0ZXMuCitlbnVtIE1lbW9yeUFjY2Vzc0tpbmQgeworICBNQUtfUmVhZE5vbmUgPSAwLAorICBNQUtfUmVhZE9ubHkgPSAxLAorICBNQUtfTWF5V3JpdGUgPSAyCit9OworCisvLy8gUmV0dXJucyB0aGUgbWVtb3J5IGFjY2VzcyBwcm9wZXJ0aWVzIG9mIHRoaXMgY29weSBvZiB0aGUgZnVuY3Rpb24uCitNZW1vcnlBY2Nlc3NLaW5kIGNvbXB1dGVGdW5jdGlvbkJvZHlNZW1vcnlBY2Nlc3MoRnVuY3Rpb24gJkYsIEFBUmVzdWx0cyAmQUFSKTsKKworLy8vIENvbXB1dGVzIGZ1bmN0aW9uIGF0dHJpYnV0ZXMgaW4gcG9zdC1vcmRlciBvdmVyIHRoZSBjYWxsIGdyYXBoLgorLy8vCisvLy8gQnkgb3BlcmF0aW5nIGluIHBvc3Qtb3JkZXIsIHRoaXMgcGFzcyBjb21wdXRlcyBwcmVjaXNlIGF0dHJpYnV0ZXMgZm9yCisvLy8gY2FsbGVkIGZ1bmN0aW9ucyBwcmlvciB0byBwcm9jZXNzc2luZyB0aGVpciBjYWxsZXJzLiBUaGlzICJib3R0b20tdXAiCisvLy8gYXBwcm9hY2ggYWxsb3dzIHBvd2VyZnVsIGludGVycHJvY2VkdXJhbCBpbmZlcmVuY2Ugb2YgZnVuY3Rpb24gYXR0cmlidXRlcworLy8vIGxpa2UgbWVtb3J5IGFjY2VzcyBwYXR0ZXJucywgZXRjLiBJdCBjYW4gZGlzY292ZXIgZnVuY3Rpb25zIHRoYXQgZG8gbm90CisvLy8gYWNjZXNzIG1lbW9yeSwgb3Igb25seSByZWFkIG1lbW9yeSwgYW5kIGdpdmUgdGhlbSB0aGUgcmVhZG5vbmUvcmVhZG9ubHkKKy8vLyBhdHRyaWJ1dGUuIEl0IGFsc28gZGlzY292ZXJzIGZ1bmN0aW9uIGFyZ3VtZW50cyB0aGF0IGFyZSBub3QgY2FwdHVyZWQgYnkKKy8vLyB0aGUgZnVuY3Rpb24gYW5kIG1hcmtzIHRoZW0gd2l0aCB0aGUgbm9jYXB0dXJlIGF0dHJpYnV0ZS4KK3N0cnVjdCBQb3N0T3JkZXJGdW5jdGlvbkF0dHJzUGFzcyA6IFBhc3NJbmZvTWl4aW48UG9zdE9yZGVyRnVuY3Rpb25BdHRyc1Bhc3M+IHsKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKExhenlDYWxsR3JhcGg6OlNDQyAmQywgQ0dTQ0NBbmFseXNpc01hbmFnZXIgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgTGF6eUNhbGxHcmFwaCAmQ0csIENHU0NDVXBkYXRlUmVzdWx0ICZVUik7Cit9OworCisvLy8gQ3JlYXRlIGEgbGVnYWN5IHBhc3MgbWFuYWdlciBpbnN0YW5jZSBvZiBhIHBhc3MgdG8gY29tcHV0ZSBmdW5jdGlvbiBhdHRycworLy8vIGluIHBvc3Qtb3JkZXIuCitQYXNzICpjcmVhdGVQb3N0T3JkZXJGdW5jdGlvbkF0dHJzTGVnYWN5UGFzcygpOworCisvLy8gQSBwYXNzIHRvIGRvIFJQTyBkZWR1Y3Rpb24gYW5kIHByb3BhZ2F0aW9uIG9mIGZ1bmN0aW9uIGF0dHJpYnV0ZXMuCisvLy8KKy8vLyBUaGlzIHBhc3MgcHJvdmlkZXMgYSBnZW5lcmFsIFJQTyBvciAidG9wIGRvd24iIHByb3BhZ2F0aW9uIG9mCisvLy8gZnVuY3Rpb24gYXR0cmlidXRlcy4gRm9yIGEgZmV3IChyYXJlKSBjYXNlcywgd2UgY2FuIGRlZHVjZSBzaWduaWZpY2FudGx5CisvLy8gbW9yZSBhYm91dCBmdW5jdGlvbiBhdHRyaWJ1dGVzIGJ5IHdvcmtpbmcgaW4gUlBPLCBzbyB0aGlzIHBhc3MKKy8vLyBwcm92aWRlcyB0aGUgY29tcGxlbWVudCB0byB0aGUgcG9zdC1vcmRlciBwYXNzIGFib3ZlIHdoZXJlIHRoZSBtYWpvcml0eSBvZgorLy8vIGRlZHVjdGlvbiBpcyBwZXJmb3JtZWQuCisvLyBGSVhNRTogQ3VycmVudGx5IHRoZXJlIGlzIG5vIFJQTyBDR1NDQyBwYXNzIHN0cnVjdHVyZSB0byBzbGlkZSBpbnRvIGFuZCBzbworLy8gdGhpcyBpcyBhIGJvcmluZyBtb2R1bGUgcGFzcywgYnV0IGV2ZW50dWFsbHkgaXQgc2hvdWxkIGJlIGFuIFJQTyBDR1NDQyBwYXNzCisvLyB3aGVuIHN1Y2ggaW5mcmFzdHJ1Y3R1cmUgaXMgYXZhaWxhYmxlLgorY2xhc3MgUmV2ZXJzZVBvc3RPcmRlckZ1bmN0aW9uQXR0cnNQYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxSZXZlcnNlUG9zdE9yZGVyRnVuY3Rpb25BdHRyc1Bhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX0lQT19GVU5DVElPTkFUVFJTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vRnVuY3Rpb25JbXBvcnQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vRnVuY3Rpb25JbXBvcnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmVkZGUxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9GdW5jdGlvbkltcG9ydC5oCkBAIC0wLDAgKzEsMTYyIEBACisvLz09PS0gbGx2bS9UcmFuc2Zvcm1zL0lQTy9GdW5jdGlvbkltcG9ydC5oIC0gVGhpbkxUTyBpbXBvcnRpbmcgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX0ZVTkNUSU9OSU1QT1JUX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19GVU5DVElPTklNUE9SVF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZVNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZVN1bW1hcnlJbmRleC5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHN5c3RlbV9lcnJvcj4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorI2luY2x1ZGUgPHV0aWxpdHk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTW9kdWxlOworCisvLy8gVGhlIGZ1bmN0aW9uIGltcG9ydGVyIGlzIGF1dG9tYXRpY2FsbHkgaW1wb3J0aW5nIGZ1bmN0aW9uIGZyb20gb3RoZXIgbW9kdWxlcworLy8vIGJhc2VkIG9uIHRoZSBwcm92aWRlZCBzdW1tYXJ5IGluZm9ybWF0aW9ucy4KK2NsYXNzIEZ1bmN0aW9uSW1wb3J0ZXIgeworcHVibGljOgorICAvLy8gU2V0IG9mIGZ1bmN0aW9ucyB0byBpbXBvcnQgZnJvbSBhIHNvdXJjZSBtb2R1bGUuIEVhY2ggZW50cnkgaXMgYSBtYXAKKyAgLy8vIGNvbnRhaW5pbmcgYWxsIHRoZSBmdW5jdGlvbnMgdG8gaW1wb3J0IGZvciBhIHNvdXJjZSBtb2R1bGUuCisgIC8vLyBUaGUga2V5cyBpcyB0aGUgR1VJRCBpZGVudGlmeWluZyBhIGZ1bmN0aW9uIHRvIGltcG9ydCwgYW5kIHRoZSB2YWx1ZQorICAvLy8gaXMgdGhlIHRocmVzaG9sZCBhcHBsaWVkIHdoZW4gZGVjaWRpbmcgdG8gaW1wb3J0IGl0LgorICB1c2luZyBGdW5jdGlvbnNUb0ltcG9ydFR5ID0gc3RkOjptYXA8R2xvYmFsVmFsdWU6OkdVSUQsIHVuc2lnbmVkPjsKKworICAvLy8gVGhlIG1hcCBjb250YWlucyBhbiBlbnRyeSBmb3IgZXZlcnkgbW9kdWxlIHRvIGltcG9ydCBmcm9tLCB0aGUga2V5IGJlaW5nCisgIC8vLyB0aGUgbW9kdWxlIGlkZW50aWZpZXIgdG8gcGFzcyB0byB0aGUgTW9kdWxlTG9hZGVyLiBUaGUgdmFsdWUgaXMgdGhlIHNldCBvZgorICAvLy8gZnVuY3Rpb25zIHRvIGltcG9ydC4KKyAgdXNpbmcgSW1wb3J0TWFwVHkgPSBTdHJpbmdNYXA8RnVuY3Rpb25zVG9JbXBvcnRUeT47CisKKyAgLy8vIFRoZSBzZXQgY29udGFpbnMgYW4gZW50cnkgZm9yIGV2ZXJ5IGdsb2JhbCB2YWx1ZSB0aGUgbW9kdWxlIGV4cG9ydHMuCisgIHVzaW5nIEV4cG9ydFNldFR5ID0gc3RkOjp1bm9yZGVyZWRfc2V0PEdsb2JhbFZhbHVlOjpHVUlEPjsKKworICAvLy8gQSBmdW5jdGlvbiBvZiB0aGlzIHR5cGUgaXMgdXNlZCB0byBsb2FkIG1vZHVsZXMgcmVmZXJlbmNlZCBieSB0aGUgaW5kZXguCisgIHVzaW5nIE1vZHVsZUxvYWRlclR5ID0KKyAgICAgIHN0ZDo6ZnVuY3Rpb248RXhwZWN0ZWQ8c3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4+KFN0cmluZ1JlZiBJZGVudGlmaWVyKT47CisKKyAgLy8vIENyZWF0ZSBhIEZ1bmN0aW9uIEltcG9ydGVyLgorICBGdW5jdGlvbkltcG9ydGVyKGNvbnN0IE1vZHVsZVN1bW1hcnlJbmRleCAmSW5kZXgsIE1vZHVsZUxvYWRlclR5IE1vZHVsZUxvYWRlcikKKyAgICAgIDogSW5kZXgoSW5kZXgpLCBNb2R1bGVMb2FkZXIoc3RkOjptb3ZlKE1vZHVsZUxvYWRlcikpIHt9CisKKyAgLy8vIEltcG9ydCBmdW5jdGlvbnMgaW4gTW9kdWxlIFxwIE0gYmFzZWQgb24gdGhlIHN1cHBsaWVkIGltcG9ydCBsaXN0LgorICBFeHBlY3RlZDxib29sPiBpbXBvcnRGdW5jdGlvbnMoTW9kdWxlICZNLCBjb25zdCBJbXBvcnRNYXBUeSAmSW1wb3J0TGlzdCk7CisKK3ByaXZhdGU6CisgIC8vLyBUaGUgc3VtbWFyaWVzIGluZGV4IHVzZWQgdG8gdHJpZ2dlciBpbXBvcnRpbmcuCisgIGNvbnN0IE1vZHVsZVN1bW1hcnlJbmRleCAmSW5kZXg7CisKKyAgLy8vIEZhY3RvcnkgZnVuY3Rpb24gdG8gbG9hZCBhIE1vZHVsZSBmb3IgYSBnaXZlbiBpZGVudGlmaWVyCisgIE1vZHVsZUxvYWRlclR5IE1vZHVsZUxvYWRlcjsKK307CisKKy8vLyBUaGUgZnVuY3Rpb24gaW1wb3J0aW5nIHBhc3MKK2NsYXNzIEZ1bmN0aW9uSW1wb3J0UGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPEZ1bmN0aW9uSW1wb3J0UGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBDb21wdXRlIGFsbCB0aGUgaW1wb3J0cyBhbmQgZXhwb3J0cyBmb3IgZXZlcnkgbW9kdWxlIGluIHRoZSBJbmRleC4KKy8vLworLy8vIFxwIE1vZHVsZVRvRGVmaW5lZEdWU3VtbWFyaWVzIGNvbnRhaW5zIGZvciBlYWNoIE1vZHVsZSBhIG1hcAorLy8vIChHVUlEIC0+IFN1bW1hcnkpIGZvciBldmVyeSBnbG9iYWwgZGVmaW5lZCBpbiB0aGUgbW9kdWxlLgorLy8vCisvLy8gXHAgSW1wb3J0TGlzdHMgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhbiBlbnRyeSBmb3IgZXZlcnkgTW9kdWxlIHdlIGFyZQorLy8vIGltcG9ydGluZyBpbnRvLiBUaGlzIGVudHJ5IGlzIGl0c2VsZiBhIG1hcCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8KKy8vLyBGdW5jdGlvbkltcG9ydGVyOjppbXBvcnRGdW5jdGlvbnMoKSBhYm92ZSAoc2VlIGRlc2NyaXB0aW9uIHRoZXJlKS4KKy8vLworLy8vIFxwIEV4cG9ydExpc3RzIGNvbnRhaW5zIGZvciBlYWNoIE1vZHVsZSB0aGUgc2V0IG9mIGdsb2JhbHMgKEdVSUQpIHRoYXQgd2lsbAorLy8vIGJlIGltcG9ydGVkIGJ5IGFub3RoZXIgbW9kdWxlLCBvciByZWZlcmVuY2VkIGJ5IHN1Y2ggYSBmdW5jdGlvbi4gSS5lLiB0aGlzCisvLy8gaXMgdGhlIHNldCBvZiBnbG9iYWxzIHRoYXQgbmVlZCB0byBiZSBwcm9tb3RlZC9yZW5hbWVkIGFwcHJvcHJpYXRlbHkuCit2b2lkIENvbXB1dGVDcm9zc01vZHVsZUltcG9ydCgKKyAgICBjb25zdCBNb2R1bGVTdW1tYXJ5SW5kZXggJkluZGV4LAorICAgIGNvbnN0IFN0cmluZ01hcDxHVlN1bW1hcnlNYXBUeT4gJk1vZHVsZVRvRGVmaW5lZEdWU3VtbWFyaWVzLAorICAgIFN0cmluZ01hcDxGdW5jdGlvbkltcG9ydGVyOjpJbXBvcnRNYXBUeT4gJkltcG9ydExpc3RzLAorICAgIFN0cmluZ01hcDxGdW5jdGlvbkltcG9ydGVyOjpFeHBvcnRTZXRUeT4gJkV4cG9ydExpc3RzKTsKKworLy8vIENvbXB1dGUgYWxsIHRoZSBpbXBvcnRzIGZvciB0aGUgZ2l2ZW4gbW9kdWxlIHVzaW5nIHRoZSBJbmRleC4KKy8vLworLy8vIFxwIEltcG9ydExpc3Qgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhIG1hcCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8KKy8vLyBGdW5jdGlvbkltcG9ydGVyOjppbXBvcnRGdW5jdGlvbnMoKSBhYm92ZSAoc2VlIGRlc2NyaXB0aW9uIHRoZXJlKS4KK3ZvaWQgQ29tcHV0ZUNyb3NzTW9kdWxlSW1wb3J0Rm9yTW9kdWxlKAorICAgIFN0cmluZ1JlZiBNb2R1bGVQYXRoLCBjb25zdCBNb2R1bGVTdW1tYXJ5SW5kZXggJkluZGV4LAorICAgIEZ1bmN0aW9uSW1wb3J0ZXI6OkltcG9ydE1hcFR5ICZJbXBvcnRMaXN0KTsKKworLy8vIE1hcmsgYWxsIGV4dGVybmFsIHN1bW1hcmllcyBpbiBccCBJbmRleCBmb3IgaW1wb3J0IGludG8gdGhlIGdpdmVuIG1vZHVsZS4KKy8vLyBVc2VkIGZvciBkaXN0cmlidXRlZCBidWlsZHMgdXNpbmcgYSBkaXN0cmlidXRlZCBpbmRleC4KKy8vLworLy8vIFxwIEltcG9ydExpc3Qgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCBhIG1hcCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8KKy8vLyBGdW5jdGlvbkltcG9ydGVyOjppbXBvcnRGdW5jdGlvbnMoKSBhYm92ZSAoc2VlIGRlc2NyaXB0aW9uIHRoZXJlKS4KK3ZvaWQgQ29tcHV0ZUNyb3NzTW9kdWxlSW1wb3J0Rm9yTW9kdWxlRnJvbUluZGV4KAorICAgIFN0cmluZ1JlZiBNb2R1bGVQYXRoLCBjb25zdCBNb2R1bGVTdW1tYXJ5SW5kZXggJkluZGV4LAorICAgIEZ1bmN0aW9uSW1wb3J0ZXI6OkltcG9ydE1hcFR5ICZJbXBvcnRMaXN0KTsKKworLy8vIFByZXZhaWxpbmdUeXBlIGVudW0gdXNlZCBhcyBhIHJldHVybiB0eXBlIG9mIGNhbGxiYWNrIHBhc3NlZAorLy8vIHRvIGNvbXB1dGVEZWFkU3ltYm9scy4gWWVzIGFuZCBObyB2YWx1ZXMgdXNlZCB3aGVuIHN0YXR1cyBleHBsaWNpdGx5CisvLy8gc2V0IGJ5IHN5bWJvbHMgcmVzb2x1dGlvbiwgb3RoZXJ3aXNlIHN0YXR1cyBpcyBVbmtub3duLgorZW51bSBjbGFzcyBQcmV2YWlsaW5nVHlwZSB7IFllcywgTm8sIFVua25vd24gfTsKKworLy8vIENvbXB1dGUgYWxsIHRoZSBzeW1ib2xzIHRoYXQgYXJlICJkZWFkIjogaS5lIHRoZXNlIHRoYXQgY2FuJ3QgYmUgcmVhY2hlZAorLy8vIGluIHRoZSBncmFwaCBmcm9tIGFueSBvZiB0aGUgZ2l2ZW4gc3ltYm9scyBsaXN0ZWQgaW4KKy8vLyBccCBHVUlEUHJlc2VydmVkU3ltYm9scy4gTm9uLXByZXZhaWxpbmcgc3ltYm9scyBhcmUgc3ltYm9scyB3aXRob3V0IGEKKy8vLyBwcmV2YWlsaW5nIGNvcHkgYW55d2hlcmUgaW4gSVIgYW5kIGFyZSBub3JtYWxseSBkZWFkLCBccCBpc1ByZXZhaWxpbmcKKy8vLyBwcmVkaWNhdGUgcmV0dXJucyBzdGF0dXMgb2Ygc3ltYm9sLgordm9pZCBjb21wdXRlRGVhZFN5bWJvbHMoCisgICAgTW9kdWxlU3VtbWFyeUluZGV4ICZJbmRleCwKKyAgICBjb25zdCBEZW5zZVNldDxHbG9iYWxWYWx1ZTo6R1VJRD4gJkdVSURQcmVzZXJ2ZWRTeW1ib2xzLAorICAgIGZ1bmN0aW9uX3JlZjxQcmV2YWlsaW5nVHlwZShHbG9iYWxWYWx1ZTo6R1VJRCk+IGlzUHJldmFpbGluZyk7CisKKy8vLyBDb252ZXJ0cyB2YWx1ZSBccCBHViB0byBkZWNsYXJhdGlvbiwgb3IgcmVwbGFjZXMgd2l0aCBhIGRlY2xhcmF0aW9uIGlmCisvLy8gaXQgaXMgYW4gYWxpYXMuIFJldHVybnMgdHJ1ZSBpZiBjb252ZXJ0ZWQsIGZhbHNlIGlmIHJlcGxhY2VkLgorYm9vbCBjb252ZXJ0VG9EZWNsYXJhdGlvbihHbG9iYWxWYWx1ZSAmR1YpOworCisvLy8gQ29tcHV0ZSB0aGUgc2V0IG9mIHN1bW1hcmllcyBuZWVkZWQgZm9yIGEgVGhpbkxUTyBiYWNrZW5kIGNvbXBpbGF0aW9uIG9mCisvLy8gXHAgTW9kdWxlUGF0aC4KKy8vCisvLy8gVGhpcyBpbmNsdWRlcyBzdW1tYXJpZXMgZnJvbSB0aGF0IG1vZHVsZSAoaW4gY2FzZSBhbnkgZ2xvYmFsIHN1bW1hcnkgYmFzZWQKKy8vLyBvcHRpbWl6YXRpb25zIHdlcmUgcmVjb3JkZWQpIGFuZCBmcm9tIGFueSBkZWZpbml0aW9ucyBpbiBvdGhlciBtb2R1bGVzIHRoYXQKKy8vLyBzaG91bGQgYmUgaW1wb3J0ZWQuCisvLworLy8vIFxwIE1vZHVsZVRvU3VtbWFyaWVzRm9ySW5kZXggd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCB0aGUgbmVlZGVkIHN1bW1hcmllcworLy8vIGZyb20gZWFjaCByZXF1aXJlZCBtb2R1bGUgcGF0aC4gVXNlIGEgc3RkOjptYXAgaW5zdGVhZCBvZiBTdHJpbmdNYXAgdG8gZ2V0CisvLy8gc3RhYmxlIG9yZGVyIGZvciBiaXRjb2RlIGVtaXNzaW9uLgordm9pZCBnYXRoZXJJbXBvcnRlZFN1bW1hcmllc0Zvck1vZHVsZSgKKyAgICBTdHJpbmdSZWYgTW9kdWxlUGF0aCwKKyAgICBjb25zdCBTdHJpbmdNYXA8R1ZTdW1tYXJ5TWFwVHk+ICZNb2R1bGVUb0RlZmluZWRHVlN1bW1hcmllcywKKyAgICBjb25zdCBGdW5jdGlvbkltcG9ydGVyOjpJbXBvcnRNYXBUeSAmSW1wb3J0TGlzdCwKKyAgICBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgR1ZTdW1tYXJ5TWFwVHk+ICZNb2R1bGVUb1N1bW1hcmllc0ZvckluZGV4KTsKKworLy8vIEVtaXQgaW50byBccCBPdXRwdXRGaWxlbmFtZSB0aGUgZmlsZXMgbW9kdWxlIFxwIE1vZHVsZVBhdGggd2lsbCBpbXBvcnQgZnJvbS4KK3N0ZDo6ZXJyb3JfY29kZQorRW1pdEltcG9ydHNGaWxlcyhTdHJpbmdSZWYgTW9kdWxlUGF0aCwgU3RyaW5nUmVmIE91dHB1dEZpbGVuYW1lLAorICAgICAgICAgICAgICAgICBjb25zdCBGdW5jdGlvbkltcG9ydGVyOjpJbXBvcnRNYXBUeSAmTW9kdWxlSW1wb3J0cyk7CisKKy8vLyBSZXNvbHZlIFdlYWtGb3JMaW5rZXIgdmFsdWVzIGluIFxwIFRoZU1vZHVsZSBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24KKy8vLyByZWNvcmRlZCBpbiB0aGUgc3VtbWFyaWVzIGR1cmluZyBnbG9iYWwgc3VtbWFyeS1iYXNlZCBhbmFseXNpcy4KK3ZvaWQgdGhpbkxUT1Jlc29sdmVXZWFrRm9yTGlua2VyTW9kdWxlKE1vZHVsZSAmVGhlTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZTdW1tYXJ5TWFwVHkgJkRlZmluZWRHbG9iYWxzKTsKKworLy8vIEludGVybmFsaXplIFxwIFRoZU1vZHVsZSBiYXNlZCBvbiB0aGUgaW5mb3JtYXRpb24gcmVjb3JkZWQgaW4gdGhlIHN1bW1hcmllcworLy8vIGR1cmluZyBnbG9iYWwgc3VtbWFyeS1iYXNlZCBhbmFseXNpcy4KK3ZvaWQgdGhpbkxUT0ludGVybmFsaXplTW9kdWxlKE1vZHVsZSAmVGhlTW9kdWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1ZTdW1tYXJ5TWFwVHkgJkRlZmluZWRHbG9iYWxzKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19JUE9fRlVOQ1RJT05JTVBPUlRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9HbG9iYWxEQ0UuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vR2xvYmFsRENFLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2NhMjQxZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vR2xvYmFsRENFLmgKQEAgLTAsMCArMSw1NyBAQAorLy89PT0tLSBHbG9iYWxEQ0UuaCAtIERDRSB1bnJlYWNoYWJsZSBpbnRlcm5hbCBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHRyYW5zZm9ybSBpcyBkZXNpZ25lZCB0byBlbGltaW5hdGUgdW5yZWFjaGFibGUgaW50ZXJuYWwgZ2xvYmFscyBmcm9tIHRoZQorLy8gcHJvZ3JhbS4gIEl0IHVzZXMgYW4gYWdncmVzc2l2ZSBhbGdvcml0aG0sIHNlYXJjaGluZyBvdXQgZ2xvYmFscyB0aGF0IGFyZQorLy8ga25vd24gdG8gYmUgYWxpdmUuICBBZnRlciBpdCBmaW5kcyBhbGwgb2YgdGhlIGdsb2JhbHMgd2hpY2ggYXJlIG5lZWRlZCwgaXQKKy8vIGRlbGV0ZXMgd2hhdGV2ZXIgaXMgbGVmdCBvdmVyLiAgVGhpcyBhbGxvd3MgaXQgdG8gZGVsZXRlIHJlY3Vyc2l2ZSBjaHVua3Mgb2YKKy8vIHRoZSBwcm9ncmFtIHdoaWNoIGFyZSB1bnJlYWNoYWJsZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19JUE9fR0xPQkFMRENFX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19HTE9CQUxEQ0VfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFBhc3MgdG8gcmVtb3ZlIHVudXNlZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCitjbGFzcyBHbG9iYWxEQ0VQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48R2xvYmFsRENFUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJik7CisKK3ByaXZhdGU6CisgIFNtYWxsUHRyU2V0PEdsb2JhbFZhbHVlKiwgMzI+IEFsaXZlR2xvYmFsczsKKworICAvLy8gR2xvYmFsIC0+IEdsb2JhbCB0aGF0IHVzZXMgdGhpcyBnbG9iYWwuCisgIERlbnNlTWFwPEdsb2JhbFZhbHVlICosIFNtYWxsUHRyU2V0PEdsb2JhbFZhbHVlICosIDQ+PiBHVkRlcGVuZGVuY2llczsKKworICAvLy8gQ29uc3RhbnQgLT4gR2xvYmFscyB0aGF0IHVzZSB0aGlzIGdsb2JhbCBjYWNoZS4KKyAgc3RkOjp1bm9yZGVyZWRfbWFwPENvbnN0YW50ICosIFNtYWxsUHRyU2V0PEdsb2JhbFZhbHVlICosIDg+PgorICAgICAgQ29uc3RhbnREZXBlbmRlbmNpZXNDYWNoZTsKKworICAvLy8gQ29tZGF0IC0+IEdsb2JhbHMgaW4gdGhhdCBDb21kYXQgc2VjdGlvbi4KKyAgc3RkOjp1bm9yZGVyZWRfbXVsdGltYXA8Q29tZGF0ICosIEdsb2JhbFZhbHVlICo+IENvbWRhdE1lbWJlcnM7CisKKyAgdm9pZCBVcGRhdGVHVkRlcGVuZGVuY2llcyhHbG9iYWxWYWx1ZSAmR1YpOworICB2b2lkIE1hcmtMaXZlKEdsb2JhbFZhbHVlICZHViwKKyAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8R2xvYmFsVmFsdWUgKj4gKlVwZGF0ZXMgPSBudWxscHRyKTsKKyAgYm9vbCBSZW1vdmVVbnVzZWRHbG9iYWxWYWx1ZShHbG9iYWxWYWx1ZSAmR1YpOworCisgIHZvaWQgQ29tcHV0ZURlcGVuZGVuY2llcyhWYWx1ZSAqViwgU21hbGxQdHJTZXRJbXBsPEdsb2JhbFZhbHVlICo+ICZVKTsKK307CisKK30KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19JUE9fR0xPQkFMRENFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vR2xvYmFsT3B0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0dsb2JhbE9wdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViNDg3ODYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0dsb2JhbE9wdC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8vPT09LSBHbG9iYWxPcHQuaCAtIE9wdGltaXplIEdsb2JhbCBWYXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIHRyYW5zZm9ybXMgc2ltcGxlIGdsb2JhbCB2YXJpYWJsZXMgdGhhdCBuZXZlciBoYXZlIHRoZWlyIGFkZHJlc3MKKy8vIHRha2VuLiAgSWYgb2J2aW91c2x5IHRydWUsIGl0IG1hcmtzIHJlYWQvd3JpdGUgZ2xvYmFscyBhcyBjb25zdGFudCwgZGVsZXRlcworLy8gdmFyaWFibGVzIG9ubHkgc3RvcmVkIHRvLCBldGMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX0dMT0JBTE9QVF9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JUE9fR0xPQkFMT1BUX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNb2R1bGU7CisKKy8vLyBPcHRpbWl6ZSBnbG9iYWxzIHRoYXQgbmV2ZXIgaGF2ZSB0aGVpciBhZGRyZXNzIHRha2VuLgorY2xhc3MgR2xvYmFsT3B0UGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPEdsb2JhbE9wdFBhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX0lQT19HTE9CQUxPUFRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9HbG9iYWxTcGxpdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9HbG9iYWxTcGxpdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2Y2VmYjcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0dsb2JhbFNwbGl0LmgKQEAgLTAsMCArMSwzNCBAQAorLy89PT0tIEdsb2JhbFNwbGl0LmggLSBnbG9iYWwgdmFyaWFibGUgc3BsaXR0ZXIgLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgdXNlcyBpbnJhbmdlIGFubm90YXRpb25zIG9uIEdFUCBpbmRpY2VzIHRvIHNwbGl0IGdsb2JhbHMgd2hlcmUKKy8vIGJlbmVmaWNpYWwuIENsYW5nIGN1cnJlbnRseSBhdHRhY2hlcyB0aGVzZSBhbm5vdGF0aW9ucyB0byByZWZlcmVuY2VzIHRvCisvLyB2aXJ0dWFsIHRhYmxlIGdsb2JhbHMgdW5kZXIgdGhlIEl0YW5pdW0gQUJJIGZvciB0aGUgYmVuZWZpdCBvZiB0aGUKKy8vIHdob2xlLXByb2dyYW0gdmlydHVhbCBjYWxsIG9wdGltaXphdGlvbiBhbmQgY29udHJvbCBmbG93IGludGVncml0eSBwYXNzZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX0dMT0JBTFNQTElUX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19HTE9CQUxTUExJVF9ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTW9kdWxlOworCisvLy8gUGFzcyB0byBwZXJmb3JtIHNwbGl0IG9mIGdsb2JhbCB2YXJpYWJsZXMuCitjbGFzcyBHbG9iYWxTcGxpdFBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxHbG9iYWxTcGxpdFBhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX0lQT19HTE9CQUxTUExJVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0luZmVyRnVuY3Rpb25BdHRycy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9JbmZlckZ1bmN0aW9uQXR0cnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NGUxYzI0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9JbmZlckZ1bmN0aW9uQXR0cnMuaApAQCAtMCwwICsxLDM2IEBACisvLz09PS0tIEluZmVyRnVuY3Rpb25BdHRycy5oIC0gSW5mZXIgaW1wbGljaXQgZnVuY3Rpb24gYXR0cmlidXRlcyAtLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBJbnRlcmZhY2VzIGZvciBwYXNzZXMgd2hpY2ggaW5mZXIgaW1wbGljaXQgZnVuY3Rpb24gYXR0cmlidXRlcyBmcm9tIHRoZQorLy8vIG5hbWUgYW5kIHNpZ25hdHVyZSBvZiBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0lQT19JTkZFUkZVTkNUSU9OQVRUUlNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfSVBPX0lORkVSRlVOQ1RJT05BVFRSU19ICisKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQSBwYXNzIHdoaWNoIGluZmVycyBmdW5jdGlvbiBhdHRyaWJ1dGVzIGZyb20gdGhlIG5hbWVzIGFuZCBzaWduYXR1cmVzIG9mCisvLy8gZnVuY3Rpb24gZGVjbGFyYXRpb25zIGluIGEgbW9kdWxlLgorc3RydWN0IEluZmVyRnVuY3Rpb25BdHRyc1Bhc3MgOiBQYXNzSW5mb01peGluPEluZmVyRnVuY3Rpb25BdHRyc1Bhc3M+IHsKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gQ3JlYXRlIGEgbGVnYWN5IHBhc3MgbWFuYWdlciBpbnN0YW5jZSBvZiBhIHBhc3MgdG8gaW5mZXIgZnVuY3Rpb24KKy8vLyBhdHRyaWJ1dGVzLgorUGFzcyAqY3JlYXRlSW5mZXJGdW5jdGlvbkF0dHJzTGVnYWN5UGFzcygpOworCit9CisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfSVBPX0lORkVSRlVOQ1RJT05BVFRSU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0lubGluZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vSW5saW5lci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYThjZjQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0lubGluZXIuaApAQCAtMCwwICsxLDEwOSBAQAorLy89PT0tIElubGluZXIuaCAtIElubGluZXIgcGFzcyBhbmQgaW5mcmFzdHJ1Y3R1cmUgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX0lOTElORVJfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfSVBPX0lOTElORVJfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9DR1NDQ1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9DYWxsR3JhcGhTQ0NQYXNzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9JbmxpbmVDb3N0LmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9MYXp5Q2FsbEdyYXBoLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvSW1wb3J0ZWRGdW5jdGlvbnNJbmxpbmluZ1N0YXRpc3RpY3MuaCIKKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFzc3VtcHRpb25DYWNoZVRyYWNrZXI7CitjbGFzcyBDYWxsR3JhcGg7CitjbGFzcyBQcm9maWxlU3VtbWFyeUluZm87CisKKy8vLyBUaGlzIGNsYXNzIGNvbnRhaW5zIGFsbCBvZiB0aGUgaGVscGVyIGNvZGUgd2hpY2ggaXMgdXNlZCB0byBwZXJmb3JtIHRoZQorLy8vIGlubGluaW5nIG9wZXJhdGlvbnMgdGhhdCBkbyBub3QgZGVwZW5kIG9uIHRoZSBwb2xpY3kuIEl0IGNvbnRhaW5zIHRoZSBjb3JlCisvLy8gYm90dG9tLXVwIGlubGluaW5nIGluZnJhc3RydWN0dXJlIHRoYXQgc3BlY2lmaWMgaW5saW5lciBwYXNzZXMgdXNlLgorc3RydWN0IExlZ2FjeUlubGluZXJCYXNlIDogcHVibGljIENhbGxHcmFwaFNDQ1Bhc3MgeworICBleHBsaWNpdCBMZWdhY3lJbmxpbmVyQmFzZShjaGFyICZJRCk7CisgIGV4cGxpY2l0IExlZ2FjeUlubGluZXJCYXNlKGNoYXIgJklELCBib29sIEluc2VydExpZmV0aW1lKTsKKworICAvLy8gRm9yIHRoaXMgY2xhc3MsIHdlIGRlY2xhcmUgdGhhdCB3ZSByZXF1aXJlIGFuZCBwcmVzZXJ2ZSB0aGUgY2FsbCBncmFwaC4KKyAgLy8vIElmIHRoZSBkZXJpdmVkIGNsYXNzIGltcGxlbWVudHMgdGhpcyBtZXRob2QsIGl0IHNob3VsZCBhbHdheXMgZXhwbGljaXRseQorICAvLy8gY2FsbCB0aGUgaW1wbGVtZW50YXRpb24gaGVyZS4KKyAgdm9pZCBnZXRBbmFseXNpc1VzYWdlKEFuYWx5c2lzVXNhZ2UgJkluZm8pIGNvbnN0IG92ZXJyaWRlOworCisgIGJvb2wgZG9Jbml0aWFsaXphdGlvbihDYWxsR3JhcGggJkNHKSBvdmVycmlkZTsKKworICAvLy8gTWFpbiBydW4gaW50ZXJmYWNlIG1ldGhvZCwgdGhpcyBpbXBsZW1lbnRzIHRoZSBpbnRlcmZhY2UgcmVxdWlyZWQgYnkgdGhlCisgIC8vLyBQYXNzIGNsYXNzLgorICBib29sIHJ1bk9uU0NDKENhbGxHcmFwaFNDQyAmU0NDKSBvdmVycmlkZTsKKworICB1c2luZyBsbHZtOjpQYXNzOjpkb0ZpbmFsaXphdGlvbjsKKworICAvLy8gUmVtb3ZlIG5vdy1kZWFkIGxpbmtvbmNlIGZ1bmN0aW9ucyBhdCB0aGUgZW5kIG9mIHByb2Nlc3NpbmcgdG8gYXZvaWQKKyAgLy8vIGJyZWFraW5nIHRoZSBTQ0MgdHJhdmVyc2FsLgorICBib29sIGRvRmluYWxpemF0aW9uKENhbGxHcmFwaCAmQ0cpIG92ZXJyaWRlOworCisgIC8vLyBUaGlzIG1ldGhvZCBtdXN0IGJlIGltcGxlbWVudGVkIGJ5IHRoZSBzdWJjbGFzcyB0byBkZXRlcm1pbmUgdGhlIGNvc3Qgb2YKKyAgLy8vIGlubGluaW5nIHRoZSBzcGVjaWZpZWQgY2FsbCBzaXRlLiAgSWYgdGhlIGNvc3QgcmV0dXJuZWQgaXMgZ3JlYXRlciB0aGFuCisgIC8vLyB0aGUgY3VycmVudCBpbmxpbmUgdGhyZXNob2xkLCB0aGUgY2FsbCBzaXRlIGlzIG5vdCBpbmxpbmVkLgorICB2aXJ0dWFsIElubGluZUNvc3QgZ2V0SW5saW5lQ29zdChDYWxsU2l0ZSBDUykgPSAwOworCisgIC8vLyBSZW1vdmUgZGVhZCBmdW5jdGlvbnMuCisgIC8vLworICAvLy8gVGhpcyBhbHNvIGluY2x1ZGVzIGEgaGFjayBpbiB0aGUgZm9ybSBvZiB0aGUgJ0Fsd2F5c0lubGluZU9ubHknIGZsYWcKKyAgLy8vIHdoaWNoIHJlc3RyaWN0cyBpdCB0byBkZWxldGluZyBmdW5jdGlvbnMgd2l0aCBhbiAnQWx3YXlzSW5saW5lJworICAvLy8gYXR0cmlidXRlLiBUaGlzIGlzIHVzZWZ1bCBmb3IgdGhlIElubGluZUFsd2F5cyBwYXNzIHRoYXQgb25seSB3YW50cyB0bworICAvLy8gZGVhbCB3aXRoIHRoYXQgc3Vic2V0IG9mIHRoZSBmdW5jdGlvbnMuCisgIGJvb2wgcmVtb3ZlRGVhZEZ1bmN0aW9ucyhDYWxsR3JhcGggJkNHLCBib29sIEFsd2F5c0lubGluZU9ubHkgPSBmYWxzZSk7CisKKyAgLy8vIFRoaXMgZnVuY3Rpb24gcGVyZm9ybXMgdGhlIG1haW4gd29yayBvZiB0aGUgcGFzcy4gIFRoZSBkZWZhdWx0IG9mCisgIC8vLyBJbmxpbnRlcjo6cnVuT25TQ0MoKSBjYWxscyBza2lwU0NDKCkgYmVmb3JlIGNhbGxpbmcgdGhpcyBtZXRob2QsIGJ1dAorICAvLy8gZGVyaXZlZCBjbGFzc2VzIHdoaWNoIGNhbm5vdCBiZSBza2lwcGVkIGNhbiBvdmVycmlkZSB0aGF0IG1ldGhvZCBhbmQgY2FsbAorICAvLy8gdGhpcyBmdW5jdGlvbiB1bmNvbmRpdGlvbmFsbHkuCisgIGJvb2wgaW5saW5lQ2FsbHMoQ2FsbEdyYXBoU0NDICZTQ0MpOworCitwcml2YXRlOgorICAvLyBJbnNlcnQgQGxsdm0ubGlmZXRpbWUgaW50cmluc2ljcy4KKyAgYm9vbCBJbnNlcnRMaWZldGltZSA9IHRydWU7CisKK3Byb3RlY3RlZDoKKyAgQXNzdW1wdGlvbkNhY2hlVHJhY2tlciAqQUNUOworICBQcm9maWxlU3VtbWFyeUluZm8gKlBTSTsKKyAgSW1wb3J0ZWRGdW5jdGlvbnNJbmxpbmluZ1N0YXRpc3RpY3MgSW1wb3J0ZWRGdW5jdGlvbnNTdGF0czsKK307CisKKy8vLyBUaGUgaW5saW5lciBwYXNzIGZvciB0aGUgbmV3IHBhc3MgbWFuYWdlci4KKy8vLworLy8vIFRoaXMgcGFzcyB3aXJlcyB0b2dldGhlciB0aGUgaW5saW5pbmcgdXRpbGl0aWVzIGFuZCB0aGUgaW5saW5lIGNvc3QKKy8vLyBhbmFseXNpcyBpbnRvIGEgQ0dTQ0MgcGFzcy4gSXQgY29uc2lkZXJzIGV2ZXJ5IGNhbGwgaW4gZXZlcnkgZnVuY3Rpb24gaW4KKy8vLyB0aGUgU0NDIGFuZCB0cmllcyB0byBpbmxpbmUgaWYgcHJvZml0YWJsZS4gSXQgY2FuIGJlIHR1bmVkIHdpdGggYSBudW1iZXIgb2YKKy8vLyBwYXJhbWV0ZXJzIHRvIGNvbnRyb2wgd2hhdCBjb3N0IG1vZGVsIGlzIHVzZWQgYW5kIHdoYXQgdHJhZGVvZmZzIGFyZSBtYWRlCisvLy8gd2hlbiBtYWtpbmcgdGhlIGRlY2lzaW9uLgorLy8vCisvLy8gSXQgc2hvdWxkIGJlIG5vdGVkIHRoYXQgdGhlIGxlZ2FjeSBpbmxpbmVycyBkbyBjb25zaWRlcmFibHkgbW9yZSB0aGFuIHRoaXMKKy8vLyBpbmxpbmVyIHBhc3MgZG9lcy4gVGhleSBwcm92aWRlIGxvZ2ljIGZvciBtYW51YWxseSBtZXJnaW5nIGFsbG9jYXMsIGFuZAorLy8vIGRvaW5nIGNvbnNpZGVyYWJsZSBEQ0UgaW5jbHVkaW5nIHRoZSBEQ0Ugb2YgZGVhZCBmdW5jdGlvbnMuIFRoaXMgcGFzcyBtYWtlcworLy8vIGV2ZXJ5IGF0dGVtcHQgdG8gYmUgc2ltcGxlci4gRENFIG9mIGZ1bmN0aW9ucyByZXF1aXJlcyBjb21wbGV4IHJlYXNvbmluZworLy8vIGFib3V0IGNvbWRhdCBncm91cHMsIGV0Yy4gSW5zdGVhZCwgaXQgaXMgZXhwZWN0ZWQgdGhhdCBvdGhlciBtb3JlIGZvY3VzZWQKKy8vLyBwYXNzZXMgYmUgY29tcG9zZWQgdG8gYWNoaWV2ZSB0aGUgc2FtZSBlbmQgcmVzdWx0LgorY2xhc3MgSW5saW5lclBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxJbmxpbmVyUGFzcz4geworcHVibGljOgorICBJbmxpbmVyUGFzcyhJbmxpbmVQYXJhbXMgUGFyYW1zID0gZ2V0SW5saW5lUGFyYW1zKCkpCisgICAgICA6IFBhcmFtcyhzdGQ6Om1vdmUoUGFyYW1zKSkge30KKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTGF6eUNhbGxHcmFwaDo6U0NDICZDLCBDR1NDQ0FuYWx5c2lzTWFuYWdlciAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICBMYXp5Q2FsbEdyYXBoICZDRywgQ0dTQ0NVcGRhdGVSZXN1bHQgJlVSKTsKKworcHJpdmF0ZToKKyAgSW5saW5lUGFyYW1zIFBhcmFtczsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfSVBPX0lOTElORVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9JbnRlcm5hbGl6ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9JbnRlcm5hbGl6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1ZDY3NmQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0ludGVybmFsaXplLmgKQEAgLTAsMCArMSw3OSBAQAorLy89PT09LSBJbnRlcm5hbGl6ZS5oIC0gSW50ZXJuYWxpemF0aW9uIEFQSSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIGxvb3BzIG92ZXIgYWxsIG9mIHRoZSBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBpbiB0aGUgaW5wdXQgbW9kdWxlLgorLy8gSWYgdGhlIGZ1bmN0aW9uIG9yIHZhcmlhYmxlIGRvZXMgbm90IG5lZWQgdG8gYmUgcHJlc2VydmVkIGFjY29yZGluZyB0byB0aGUKKy8vIGNsaWVudCBzdXBwbGllZCBjYWxsYmFjaywgaXQgaXMgbWFya2VkIGFzIGludGVybmFsLgorLy8KKy8vIFRoaXMgdHJhbnNmb3JtYXRpb24gd291bGQgbm90IGJlIGxlZ2FsIGluIGEgcmVndWxhciBjb21waWxhdGlvbiwgYnV0IGl0IGdldHMKKy8vIGV4dHJhIGluZm9ybWF0aW9uIGZyb20gdGhlIGxpbmtlciBhYm91dCB3aGF0IGlzIHNhZmUuCisvLworLy8gRm9yIGV4YW1wbGU6IEludGVybmFsaXppbmcgYSBmdW5jdGlvbiB3aXRoIGV4dGVybmFsIGxpbmthZ2UuIE9ubHkgaWYgd2UgYXJlCisvLyB0b2xkIGl0IGlzIG9ubHkgdXNlZCBmcm9tIHdpdGhpbiB0aGlzIG1vZHVsZSwgaXQgaXMgc2FmZSB0byBkbyBpdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19JUE9fSU5URVJOQUxJWkVfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfSVBPX0lOVEVSTkFMSVpFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1NldC5oIgorI2luY2x1ZGUgImxsdm0vSVIvR2xvYmFsVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSA8ZnVuY3Rpb25hbD4KKyNpbmNsdWRlIDxzZXQ+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIENhbGxHcmFwaDsKKworLy8vIEEgcGFzcyB0aGF0IGludGVybmFsaXplcyBhbGwgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgb3RoZXIgdGhhbiB0aG9zZSB0aGF0CisvLy8gbXVzdCBiZSBwcmVzZXJ2ZWQgYWNjb3JkaW5nIHRvIFxjIE11c3RQcmVzZXJ2ZUdWLgorY2xhc3MgSW50ZXJuYWxpemVQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48SW50ZXJuYWxpemVQYXNzPiB7CisgIC8vLyBDbGllbnQgc3VwcGxpZWQgY2FsbGJhY2sgdG8gY29udHJvbCB3aGV0ZXIgYSBzeW1ib2wgbXVzdCBiZSBwcmVzZXJ2ZWQuCisgIGNvbnN0IHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBHbG9iYWxWYWx1ZSAmKT4gTXVzdFByZXNlcnZlR1Y7CisgIC8vLyBTZXQgb2Ygc3ltYm9scyBwcml2YXRlIHRvIHRoZSBjb21waWxlciB0aGF0IHRoaXMgcGFzcyBzaG91bGQgbm90IHRvdWNoLgorICBTdHJpbmdTZXQ8PiBBbHdheXNQcmVzZXJ2ZWQ7CisKKyAgLy8vIFJldHVybiBmYWxzZSBpZiB3ZSdyZSBhbGxvd2VkIHRvIGludGVybmFsaXplIHRoaXMgR1YuCisgIGJvb2wgc2hvdWxkUHJlc2VydmVHVihjb25zdCBHbG9iYWxWYWx1ZSAmR1YpOworICAvLy8gSW50ZXJuYWxpemUgR1YgaWYgaXQgaXMgcG9zc2libGUgdG8gZG8gc28sIGkuZS4gaXQgaXMgbm90IGV4dGVybmFsbHkKKyAgLy8vIHZpc2libGUgYW5kIGlzIG5vdCBhIG1lbWJlciBvZiBhbiBleHRlcm5hbGx5IHZpc2libGUgY29tZGF0LgorICBib29sIG1heWJlSW50ZXJuYWxpemUoR2xvYmFsVmFsdWUgJkdWLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzZXQ8Y29uc3QgQ29tZGF0ICo+ICZFeHRlcm5hbENvbWRhdHMpOworICAvLy8gSWYgR1YgaXMgcGFydCBvZiBhIGNvbWRhdCBhbmQgaXMgZXh0ZXJuYWxseSB2aXNpYmxlLCBrZWVwIHRyYWNrIG9mIGl0cworICAvLy8gY29tZGF0IHNvIHRoYXQgd2UgZG9uJ3QgaW50ZXJuYWxpemUgYW55IG9mIGl0cyBtZW1iZXJzLgorICB2b2lkIGNoZWNrQ29tZGF0VmlzaWJpbGl0eShHbG9iYWxWYWx1ZSAmR1YsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c2V0PGNvbnN0IENvbWRhdCAqPiAmRXh0ZXJuYWxDb21kYXRzKTsKKworcHVibGljOgorICBJbnRlcm5hbGl6ZVBhc3MoKTsKKyAgSW50ZXJuYWxpemVQYXNzKHN0ZDo6ZnVuY3Rpb248Ym9vbChjb25zdCBHbG9iYWxWYWx1ZSAmKT4gTXVzdFByZXNlcnZlR1YpCisgICAgICA6IE11c3RQcmVzZXJ2ZUdWKHN0ZDo6bW92ZShNdXN0UHJlc2VydmVHVikpIHt9CisKKyAgLy8vIFJ1biB0aGUgaW50ZXJuYWxpemVyIG9uIFxwIFRoZU1vZHVsZSwgcmV0dXJucyB0cnVlIGlmIGFueSBjaGFuZ2VzIHdhcworICAvLy8gbWFkZS4KKyAgLy8vCisgIC8vLyBJZiB0aGUgQ2FsbEdyYXBoIFxwIENHIGlzIHN1cHBsaWVkLCBpdCB3aWxsIGJlIHVwZGF0ZWQgd2hlbgorICAvLy8gaW50ZXJuYWxpemluZyBhIGZ1bmN0aW9uIChieSByZW1vdmluZyBhbnkgZWRnZSBmcm9tIHRoZSAiZXh0ZXJuYWwgbm9kZSIpCisgIGJvb2wgaW50ZXJuYWxpemVNb2R1bGUoTW9kdWxlICZUaGVNb2R1bGUsIENhbGxHcmFwaCAqQ0cgPSBudWxscHRyKTsKKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBIZWxwZXIgZnVuY3Rpb24gdG8gaW50ZXJuYWxpemUgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgaW4gYSBNb2R1bGUuCitpbmxpbmUgYm9vbAoraW50ZXJuYWxpemVNb2R1bGUoTW9kdWxlICZUaGVNb2R1bGUsCisgICAgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgR2xvYmFsVmFsdWUgJik+IE11c3RQcmVzZXJ2ZUdWLAorICAgICAgICAgICAgICAgICAgQ2FsbEdyYXBoICpDRyA9IG51bGxwdHIpIHsKKyAgcmV0dXJuIEludGVybmFsaXplUGFzcyhzdGQ6Om1vdmUoTXVzdFByZXNlcnZlR1YpKQorICAgICAgLmludGVybmFsaXplTW9kdWxlKFRoZU1vZHVsZSwgQ0cpOworfQorfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19JUE9fSU5URVJOQUxJWkVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9Mb3dlclR5cGVUZXN0cy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9Mb3dlclR5cGVUZXN0cy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNiY2ZlNjUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL0xvd2VyVHlwZVRlc3RzLmgKQEAgLTAsMCArMSwyMDUgQEAKKy8vPT09LSBMb3dlclR5cGVUZXN0cy5oIC0gdHlwZSBtZXRhZGF0YSBsb3dlcmluZyBwYXNzIC0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgcGFydHMgb2YgdGhlIHR5cGUgdGVzdCBsb3dlcmluZyBwYXNzIGltcGxlbWVudGF0aW9uIHRoYXQKKy8vIG1heSBiZSB1c2VmdWxseSB1bml0IHRlc3RlZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19JUE9fTE9XRVJUWVBFVEVTVFNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfSVBPX0xPV0VSVFlQRVRFU1RTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNb2R1bGU7CitjbGFzcyByYXdfb3N0cmVhbTsKKworbmFtZXNwYWNlIGxvd2VydHlwZXRlc3RzIHsKKworc3RydWN0IEJpdFNldEluZm8geworICAvLyBUaGUgaW5kaWNlcyBvZiB0aGUgc2V0IGJpdHMgaW4gdGhlIGJpdHNldC4KKyAgc3RkOjpzZXQ8dWludDY0X3Q+IEJpdHM7CisKKyAgLy8gVGhlIGJ5dGUgb2Zmc2V0IGludG8gdGhlIGNvbWJpbmVkIGdsb2JhbCByZXByZXNlbnRlZCBieSB0aGUgYml0c2V0LgorICB1aW50NjRfdCBCeXRlT2Zmc2V0OworCisgIC8vIFRoZSBzaXplIG9mIHRoZSBiaXRzZXQgaW4gYml0cy4KKyAgdWludDY0X3QgQml0U2l6ZTsKKworICAvLyBMb2cyIGFsaWdubWVudCBvZiB0aGUgYml0IHNldCByZWxhdGl2ZSB0byB0aGUgY29tYmluZWQgZ2xvYmFsLgorICAvLyBGb3IgZXhhbXBsZSwgYSBsb2cyIGFsaWdubWVudCBvZiAzIG1lYW5zIHRoYXQgYml0cyBpbiB0aGUgYml0c2V0CisgIC8vIHJlcHJlc2VudCBhZGRyZXNzZXMgOCBieXRlcyBhcGFydC4KKyAgdW5zaWduZWQgQWxpZ25Mb2cyOworCisgIGJvb2wgaXNTaW5nbGVPZmZzZXQoKSBjb25zdCB7CisgICAgcmV0dXJuIEJpdHMuc2l6ZSgpID09IDE7CisgIH0KKworICBib29sIGlzQWxsT25lcygpIGNvbnN0IHsKKyAgICByZXR1cm4gQml0cy5zaXplKCkgPT0gQml0U2l6ZTsKKyAgfQorCisgIGJvb2wgY29udGFpbnNHbG9iYWxPZmZzZXQodWludDY0X3QgT2Zmc2V0KSBjb25zdDsKKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3Q7Cit9OworCitzdHJ1Y3QgQml0U2V0QnVpbGRlciB7CisgIFNtYWxsVmVjdG9yPHVpbnQ2NF90LCAxNj4gT2Zmc2V0czsKKyAgdWludDY0X3QgTWluID0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50NjRfdD46Om1heCgpOworICB1aW50NjRfdCBNYXggPSAwOworCisgIEJpdFNldEJ1aWxkZXIoKSA9IGRlZmF1bHQ7CisKKyAgdm9pZCBhZGRPZmZzZXQodWludDY0X3QgT2Zmc2V0KSB7CisgICAgaWYgKE1pbiA+IE9mZnNldCkKKyAgICAgIE1pbiA9IE9mZnNldDsKKyAgICBpZiAoTWF4IDwgT2Zmc2V0KQorICAgICAgTWF4ID0gT2Zmc2V0OworCisgICAgT2Zmc2V0cy5wdXNoX2JhY2soT2Zmc2V0KTsKKyAgfQorCisgIEJpdFNldEluZm8gYnVpbGQoKTsKK307CisKKy8vLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSBsYXlvdXQgYWxnb3JpdGhtIGZvciBnbG9iYWxzIHJlZmVyZW5jZWQgYnkgYml0IHNldHMKKy8vLyB0aGF0IHRyaWVzIHRvIGtlZXAgbWVtYmVycyBvZiBzbWFsbCBiaXQgc2V0cyB0b2dldGhlci4gVGhpcyBjYW4KKy8vLyBzaWduaWZpY2FudGx5IHJlZHVjZSBiaXQgc2V0IHNpemVzIGluIG1hbnkgY2FzZXMuCisvLy8KKy8vLyBJdCB3b3JrcyBieSBhc3NlbWJsaW5nIGZyYWdtZW50cyBvZiBsYXlvdXQgZnJvbSBzZXRzIG9mIHJlZmVyZW5jZWQgZ2xvYmFscy4KKy8vLyBFYWNoIHNldCBvZiByZWZlcmVuY2VkIGdsb2JhbHMgY2F1c2VzIHRoZSBhbGdvcml0aG0gdG8gY3JlYXRlIGEgbmV3CisvLy8gZnJhZ21lbnQsIHdoaWNoIGlzIGFzc2VtYmxlZCBieSBhcHBlbmRpbmcgZWFjaCByZWZlcmVuY2VkIGdsb2JhbCBpbiB0aGUgc2V0CisvLy8gaW50byB0aGUgZnJhZ21lbnQuIElmIGEgcmVmZXJlbmNlZCBnbG9iYWwgaGFzIGFscmVhZHkgYmVlbiByZWZlcmVuY2VkIGJ5IGFuCisvLy8gZnJhZ21lbnQgY3JlYXRlZCBlYXJsaWVyLCB3ZSBpbnN0ZWFkIGRlbGV0ZSB0aGF0IGZyYWdtZW50IGFuZCBhcHBlbmQgaXRzCisvLy8gY29udGVudHMgaW50byB0aGUgZnJhZ21lbnQgd2UgYXJlIGFzc2VtYmxpbmcuCisvLy8KKy8vLyBCeSBzdGFydGluZyB3aXRoIHRoZSBzbWFsbGVzdCBmcmFnbWVudHMsIHdlIG1pbmltaXplIHRoZSBzaXplIG9mIHRoZQorLy8vIGZyYWdtZW50cyB0aGF0IGFyZSBjb3BpZWQgaW50byBsYXJnZXIgZnJhZ21lbnRzLiBUaGlzIGlzIG1vc3QgaW50dWl0aXZlbHkKKy8vLyB0aG91Z2h0IGFib3V0IHdoZW4gY29uc2lkZXJpbmcgdGhlIGNhc2Ugd2hlcmUgdGhlIGdsb2JhbHMgYXJlIHZpcnR1YWwgdGFibGVzCisvLy8gYW5kIHRoZSBiaXQgc2V0cyByZXByZXNlbnQgdGhlaXIgZGVyaXZlZCBjbGFzc2VzOiBpbiBhIHNpbmdsZSBpbmhlcml0YW5jZQorLy8vIGhpZXJhcmNoeSwgdGhlIG9wdGltdW0gbGF5b3V0IHdvdWxkIGludm9sdmUgYSBkZXB0aC1maXJzdCBzZWFyY2ggb2YgdGhlCisvLy8gY2xhc3MgaGllcmFyY2h5IChhbmQgaW4gZmFjdCB0aGUgY29tcHV0ZWQgbGF5b3V0IGVuZHMgdXAgbG9va2luZyBhIGxvdCBsaWtlCisvLy8gYSBERlMpLCBidXQgYSBuYWl2ZSBERlMgd291bGQgbm90IHdvcmsgd2VsbCBpbiB0aGUgcHJlc2VuY2Ugb2YgbXVsdGlwbGUKKy8vLyBpbmhlcml0YW5jZS4gVGhpcyBhc3BlY3Qgb2YgdGhlIGFsZ29yaXRobSBlbmRzIHVwIGZpdHRpbmcgc21hbGxlcgorLy8vIGhpZXJhcmNoaWVzIGluc2lkZSBsYXJnZXIgb25lcyB3aGVyZSB0aGF0IHdvdWxkIGJlIGJlbmVmaWNpYWwuCisvLy8KKy8vLyBGb3IgZXhhbXBsZSwgY29uc2lkZXIgdGhpcyBjbGFzcyBoaWVyYXJjaHk6CisvLy8KKy8vLyBBICAgICAgIEIKKy8vLyAgIFwgICAvIHwgXAorLy8vICAgICBDICAgRCAgIEUKKy8vLworLy8vIFdlIGhhdmUgZml2ZSBiaXQgc2V0czogYnNBIChBLCBDKSwgYnNCIChCLCBDLCBELCBFKSwgYnNDIChDKSwgYnNEIChEKSBhbmQKKy8vLyBic0UgKEUpLiBJZiB3ZSBsYWlkIG91dCBvdXIgb2JqZWN0cyBieSBERlMgdHJhdmVyc2luZyBCIGZvbGxvd2VkIGJ5IEEsIG91cgorLy8vIGxheW91dCB3b3VsZCBiZSB7QiwgQywgRCwgRSwgQX0uIFRoaXMgaXMgb3B0aW1hbCBmb3IgYnNCIGFzIGl0IG5lZWRzIHRvCisvLy8gY292ZXIgdGhlIG9ubHkgNCBvYmplY3RzIGluIGl0cyBoaWVyYXJjaHksIGJ1dCBub3QgZm9yIGJzQSBhcyBpdCBuZWVkcyB0bworLy8vIGNvdmVyIDUgb2JqZWN0cywgaS5lLiB0aGUgZW50aXJlIGxheW91dC4gT3VyIGFsZ29yaXRobSBwcm9jZWVkcyBhcyBmb2xsb3dzOgorLy8vCisvLy8gQWRkIGJzQywgZnJhZ21lbnRzIHt7Q319CisvLy8gQWRkIGJzRCwgZnJhZ21lbnRzIHt7Q30sIHtEfX0KKy8vLyBBZGQgYnNFLCBmcmFnbWVudHMge3tDfSwge0R9LCB7RX19CisvLy8gQWRkIGJzQSwgZnJhZ21lbnRzIHt7QSwgQ30sIHtEfSwge0V9fQorLy8vIEFkZCBic0IsIGZyYWdtZW50cyB7e0IsIEEsIEMsIEQsIEV9fQorLy8vCisvLy8gVGhpcyBsYXlvdXQgaXMgb3B0aW1hbCBmb3IgYnNBLCBhcyBpdCBub3cgb25seSBuZWVkcyB0byBjb3ZlciB0d28gKGkuZS4gMworLy8vIGZld2VyKSBvYmplY3RzLCBhdCB0aGUgY29zdCBvZiBic0IgbmVlZGluZyB0byBjb3ZlciAxIG1vcmUgb2JqZWN0LgorLy8vCisvLy8gVGhlIGJpdCBzZXQgbG93ZXJpbmcgcGFzcyBhc3NpZ25zIGFuIG9iamVjdCBpbmRleCB0byBlYWNoIG9iamVjdCB0aGF0IG5lZWRzCisvLy8gdG8gYmUgbGFpZCBvdXQsIGFuZCBjYWxscyBhZGRGcmFnbWVudCBmb3IgZWFjaCBiaXQgc2V0IHBhc3NpbmcgdGhlIG9iamVjdAorLy8vIGluZGljZXMgb2YgaXRzIHJlZmVyZW5jZWQgZ2xvYmFscy4gSXQgdGhlbiBhc3NlbWJsZXMgYSBsYXlvdXQgZnJvbSB0aGUKKy8vLyBjb21wdXRlZCBsYXlvdXQgaW4gdGhlIEZyYWdtZW50cyBmaWVsZC4KK3N0cnVjdCBHbG9iYWxMYXlvdXRCdWlsZGVyIHsKKyAgLy8vIFRoZSBjb21wdXRlZCBsYXlvdXQuIEVhY2ggZWxlbWVudCBvZiB0aGlzIHZlY3RvciBjb250YWlucyBhIGZyYWdtZW50IG9mCisgIC8vLyBsYXlvdXQgKHdoaWNoIG1heSBiZSBlbXB0eSkgY29uc2lzdGluZyBvZiBvYmplY3QgaW5kaWNlcy4KKyAgc3RkOjp2ZWN0b3I8c3RkOjp2ZWN0b3I8dWludDY0X3Q+PiBGcmFnbWVudHM7CisKKyAgLy8vIE1hcHBpbmcgZnJvbSBvYmplY3QgaW5kZXggdG8gZnJhZ21lbnQgaW5kZXguCisgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBGcmFnbWVudE1hcDsKKworICBHbG9iYWxMYXlvdXRCdWlsZGVyKHVpbnQ2NF90IE51bU9iamVjdHMpCisgICAgICA6IEZyYWdtZW50cygxKSwgRnJhZ21lbnRNYXAoTnVtT2JqZWN0cykge30KKworICAvLy8gQWRkIEYgdG8gdGhlIGxheW91dCB3aGlsZSB0cnlpbmcgdG8ga2VlcCBpdHMgaW5kaWNlcyBjb250aWd1b3VzLgorICAvLy8gSWYgYSBwcmV2aW91c2x5IHNlZW4gZnJhZ21lbnQgdXNlcyBhbnkgb2YgRidzIGluZGljZXMsIHRoYXQKKyAgLy8vIGZyYWdtZW50IHdpbGwgYmUgbGFpZCBvdXQgaW5zaWRlIEYuCisgIHZvaWQgYWRkRnJhZ21lbnQoY29uc3Qgc3RkOjpzZXQ8dWludDY0X3Q+ICZGKTsKK307CisKKy8vLyBUaGlzIGNsYXNzIGlzIHVzZWQgdG8gYnVpbGQgYSBieXRlIGFycmF5IGNvbnRhaW5pbmcgb3ZlcmxhcHBpbmcgYml0IHNldHMuIEJ5CisvLy8gbG9hZGluZyBmcm9tIGluZGV4ZWQgb2Zmc2V0cyBpbnRvIHRoZSBieXRlIGFycmF5IGFuZCBhcHBseWluZyBhIG1hc2ssIGEKKy8vLyBwcm9ncmFtIGNhbiB0ZXN0IGJpdHMgZnJvbSB0aGUgYml0IHNldCB3aXRoIGEgcmVsYXRpdmVseSBzaG9ydCBpbnN0cnVjdGlvbgorLy8vIHNlcXVlbmNlLiBGb3IgZXhhbXBsZSwgc3VwcG9zZSB3ZSBoYXZlIDE1IGJpdCBzZXRzIHRvIGxheSBvdXQ6CisvLy8KKy8vLyBBICgxNiBiaXRzKSwgQiAoMTUgYml0cyksIEMgKDE0IGJpdHMpLCBEICgxMyBiaXRzKSwgRSAoMTIgYml0cyksCisvLy8gRiAoMTEgYml0cyksIEcgKDEwIGJpdHMpLCBIICg5IGJpdHMpLCBJICg3IGJpdHMpLCBKICg2IGJpdHMpLCBLICg1IGJpdHMpLAorLy8vIEwgKDQgYml0cyksIE0gKDMgYml0cyksIE4gKDIgYml0cyksIE8gKDEgYml0KQorLy8vCisvLy8gVGhlc2UgYml0cyBjYW4gYmUgbGFpZCBvdXQgaW4gYSAxNi1ieXRlIGFycmF5IGxpa2UgdGhpczoKKy8vLworLy8vICAgICAgIEJ5dGUgT2Zmc2V0CisvLy8gICAgIDAxMjM0NTY3ODlBQkNERUYKKy8vLyBCaXQKKy8vLyAgIDcgSEhISEhISEhISUlJSUlJSQorLy8vICAgNiBHR0dHR0dHR0dHSkpKSkpKCisvLy8gICA1IEZGRkZGRkZGRkZGS0tLS0sKKy8vLyAgIDQgRUVFRUVFRUVFRUVFTExMTAorLy8vICAgMyBERERERERERERERERETU1NCisvLy8gICAyIENDQ0NDQ0NDQ0NDQ0NDTk4KKy8vLyAgIDEgQkJCQkJCQkJCQkJCQkJCTworLy8vICAgMCBBQUFBQUFBQUFBQUFBQUFBCisvLy8KKy8vLyBGb3IgZXhhbXBsZSwgdG8gdGVzdCBiaXQgWCBvZiBBLCB3ZSBldmFsdWF0ZSAoKGJpdHNbWF0gJiAxKSAhPSAwKSwgb3IgdG8KKy8vLyB0ZXN0IGJpdCBYIG9mIEksIHdlIGV2YWx1YXRlICgoYml0c1s5ICsgWF0gJiAweDgwKSAhPSAwKS4gVGhpcyBjYW4gYmUgZG9uZQorLy8vIGluIDEtMiBtYWNoaW5lIGluc3RydWN0aW9ucyBvbiB4ODYsIG9yIDQtNiBpbnN0cnVjdGlvbnMgb24gQVJNLgorLy8vCisvLy8gVGhpcyBpcyBhIGJ5dGUgYXJyYXksIHJhdGhlciB0aGFuIChzYXkpIGEgMi1ieXRlIGFycmF5IG9yIGEgNC1ieXRlIGFycmF5LAorLy8vIGJlY2F1c2UgZm9yIG9uZSB0aGluZyBpdCBnaXZlcyB1cyBiZXR0ZXIgcGFja2luZyAodGhlIG1vcmUgYmlucyB0aGVyZSBhcmUsCisvLy8gdGhlIGxlc3MgZXZlbmx5IHRoZXkgd2lsbCBiZSBmaWxsZWQpLCBhbmQgZm9yIGFub3RoZXIsIHRoZSBpbnN0cnVjdGlvbgorLy8vIHNlcXVlbmNlcyBjYW4gYmUgc2xpZ2h0bHkgc2hvcnRlciwgYm90aCBvbiB4ODYgYW5kIEFSTS4KK3N0cnVjdCBCeXRlQXJyYXlCdWlsZGVyIHsKKyAgLy8vIFRoZSBieXRlIGFycmF5IGJ1aWx0IHNvIGZhci4KKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gQnl0ZXM7CisKKyAgZW51bSB7IEJpdHNQZXJCeXRlID0gOCB9OworCisgIC8vLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBzbyBmYXIgZm9yIGVhY2ggb2YgdGhlIGJpdHMuCisgIHVpbnQ2NF90IEJpdEFsbG9jc1tCaXRzUGVyQnl0ZV07CisKKyAgQnl0ZUFycmF5QnVpbGRlcigpIHsKKyAgICBtZW1zZXQoQml0QWxsb2NzLCAwLCBzaXplb2YoQml0QWxsb2NzKSk7CisgIH0KKworICAvLy8gQWxsb2NhdGUgQml0U2l6ZSBiaXRzIGluIHRoZSBieXRlIGFycmF5IHdoZXJlIEJpdHMgY29udGFpbnMgdGhlIGJpdHMgdG8KKyAgLy8vIHNldC4gQWxsb2NCeXRlT2Zmc2V0IGlzIHNldCB0byB0aGUgb2Zmc2V0IHdpdGhpbiB0aGUgYnl0ZSBhcnJheSBhbmQKKyAgLy8vIEFsbG9jTWFzayBpcyBzZXQgdG8gdGhlIGJpdG1hc2sgZm9yIHRob3NlIGJpdHMuIFRoaXMgdXNlcyB0aGUgTFBUIChMb25nZXN0CisgIC8vLyBQcm9jZXNzaW5nIFRpbWUpIG11bHRpcHJvY2Vzc29yIHNjaGVkdWxpbmcgYWxnb3JpdGhtIHRvIGxheSBvdXQgdGhlIGJpdHMKKyAgLy8vIGVmZmljaWVudGx5OyB0aGUgcGFzcyBhbGxvY2F0ZXMgYml0IHNldHMgaW4gZGVjcmVhc2luZyBzaXplIG9yZGVyLgorICB2b2lkIGFsbG9jYXRlKGNvbnN0IHN0ZDo6c2V0PHVpbnQ2NF90PiAmQml0cywgdWludDY0X3QgQml0U2l6ZSwKKyAgICAgICAgICAgICAgICB1aW50NjRfdCAmQWxsb2NCeXRlT2Zmc2V0LCB1aW50OF90ICZBbGxvY01hc2spOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxvd2VydHlwZXRlc3RzCisKK2NsYXNzIExvd2VyVHlwZVRlc3RzUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPExvd2VyVHlwZVRlc3RzUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfSVBPX0xPV0VSVFlQRVRFU1RTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vUGFydGlhbElubGluaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL1BhcnRpYWxJbmxpbmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjNmRkMzYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL1BhcnRpYWxJbmxpbmluZy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vPT09LSBQYXJ0aWFsSW5saW5pbmcuaCAtIElubGluZSBwYXJ0cyBvZiBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIHBlcmZvcm1zIHBhcnRpYWwgaW5saW5pbmcsIHR5cGljYWxseSBieSBpbmxpbmluZyBhbiBpZiBzdGF0ZW1lbnQKKy8vIHRoYXQgc3Vycm91bmRzIHRoZSBib2R5IG9mIHRoZSBmdW5jdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19JUE9fUEFSVElBTElOTElOSU5HX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19QQVJUSUFMSU5MSU5JTkdfSAorCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1vZHVsZTsKKworLy8vIFBhc3MgdG8gcmVtb3ZlIHVudXNlZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMuCitjbGFzcyBQYXJ0aWFsSW5saW5lclBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxQYXJ0aWFsSW5saW5lclBhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICYpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19JUE9fUEFSVElBTElOTElOSU5HX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vUGFzc01hbmFnZXJCdWlsZGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL1Bhc3NNYW5hZ2VyQnVpbGRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3NjMwNmYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL1Bhc3NNYW5hZ2VyQnVpbGRlci5oCkBAIC0wLDAgKzEsMjE3IEBACisvLyBsbHZtL1RyYW5zZm9ybXMvSVBPL1Bhc3NNYW5hZ2VyQnVpbGRlci5oIC0gQnVpbGQgU3RhbmRhcmQgUGFzcyAtKi0gQysrIC0qLT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBQYXNzTWFuYWdlckJ1aWxkZXIgY2xhc3MsIHdoaWNoIGlzIHVzZWQgdG8gc2V0IHVwIGEKKy8vICJzdGFuZGFyZCIgb3B0aW1pemF0aW9uIHNlcXVlbmNlIHN1aXRhYmxlIGZvciBsYW5ndWFnZXMgbGlrZSBDIGFuZCBDKysuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX1BBU1NNQU5BR0VSQlVJTERFUl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JUE9fUEFTU01BTkFHRVJCVUlMREVSX0gKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisjaW5jbHVkZSA8bWVtb3J5PgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1vZHVsZVN1bW1hcnlJbmRleDsKK2NsYXNzIFBhc3M7CitjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mb0ltcGw7CitjbGFzcyBUYXJnZXRNYWNoaW5lOworCisvLyBUaGUgb2xkIHBhc3MgbWFuYWdlciBpbmZyYXN0cnVjdHVyZSBpcyBoaWRkZW4gaW4gYSBsZWdhY3kgbmFtZXNwYWNlIG5vdy4KK25hbWVzcGFjZSBsZWdhY3kgeworY2xhc3MgRnVuY3Rpb25QYXNzTWFuYWdlcjsKK2NsYXNzIFBhc3NNYW5hZ2VyQmFzZTsKK30KKworLy8vIFBhc3NNYW5hZ2VyQnVpbGRlciAtIFRoaXMgY2xhc3MgaXMgdXNlZCB0byBzZXQgdXAgYSBzdGFuZGFyZCBvcHRpbWl6YXRpb24KKy8vLyBzZXF1ZW5jZSBmb3IgbGFuZ3VhZ2VzIGxpa2UgQyBhbmQgQysrLCBhbGxvd2luZyBzb21lIEFQSXMgdG8gY3VzdG9taXplIHRoZQorLy8vIHBhc3Mgc2VxdWVuY2UgaW4gdmFyaW91cyB3YXlzLiBBIHNpbXBsZSBleGFtcGxlIG9mIHVzaW5nIGl0IHdvdWxkIGJlOgorLy8vCisvLy8gIFBhc3NNYW5hZ2VyQnVpbGRlciBCdWlsZGVyOworLy8vICBCdWlsZGVyLk9wdExldmVsID0gMjsKKy8vLyAgQnVpbGRlci5wb3B1bGF0ZUZ1bmN0aW9uUGFzc01hbmFnZXIoRlBNKTsKKy8vLyAgQnVpbGRlci5wb3B1bGF0ZU1vZHVsZVBhc3NNYW5hZ2VyKE1QTSk7CisvLy8KKy8vLyBJbiBhZGRpdGlvbiB0byBzZXR0aW5nIHVwIHRoZSBiYXNpYyBwYXNzZXMsIFBhc3NNYW5hZ2VyQnVpbGRlciBhbGxvd3MKKy8vLyBmcm9udGVuZHMgdG8gdmVuZCBhIHBsdWdpbiBBUEksIHdoZXJlIHBsdWdpbnMgYXJlIGFsbG93ZWQgdG8gYWRkIGV4dGVuc2lvbnMKKy8vLyB0byB0aGUgZGVmYXVsdCBwYXNzIG1hbmFnZXIuICBUaGV5IGRvIHRoaXMgYnkgc3BlY2lmeWluZyB3aGVyZSBpbiB0aGUgcGFzcworLy8vIHBpcGVsaW5lIHRoZXkgd2FudCB0byBiZSBhZGRlZCwgYWxvbmcgd2l0aCBhIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgYWRkcworLy8vIHRoZSBwYXNzKGVzKS4gIEZvciBleGFtcGxlLCBhIHBsdWdpbiB0aGF0IHdhbnRlZCB0byBhZGQgYSBsb29wIG9wdGltaXphdGlvbgorLy8vIGNvdWxkIGRvIHNvbWV0aGluZyBsaWtlIHRoaXM6CisvLy8KKy8vLyBzdGF0aWMgdm9pZCBhZGRNeUxvb3BQYXNzKGNvbnN0IFBNQnVpbGRlciAmQnVpbGRlciwgUGFzc01hbmFnZXJCYXNlICZQTSkgeworLy8vICAgaWYgKEJ1aWxkZXIuZ2V0T3B0TGV2ZWwoKSA+IDIgJiYgQnVpbGRlci5nZXRPcHRTaXplTGV2ZWwoKSA9PSAwKQorLy8vICAgICBQTS5hZGQoY3JlYXRlTXlBd2Vzb21lUGFzcygpKTsKKy8vLyB9CisvLy8gICAuLi4KKy8vLyAgIEJ1aWxkZXIuYWRkRXh0ZW5zaW9uKFBhc3NNYW5hZ2VyQnVpbGRlcjo6RVBfTG9vcE9wdGltaXplckVuZCwKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgIGFkZE15TG9vcFBhc3MpOworLy8vICAgLi4uCitjbGFzcyBQYXNzTWFuYWdlckJ1aWxkZXIgeworcHVibGljOgorICAvLy8gRXh0ZW5zaW9ucyBhcmUgcGFzc2VkIHRoZSBidWlsZGVyIGl0c2VsZiAoc28gdGhleSBjYW4gc2VlIGhvdyBpdCBpcworICAvLy8gY29uZmlndXJlZCkgYXMgd2VsbCBhcyB0aGUgcGFzcyBtYW5hZ2VyIHRvIGFkZCBzdHVmZiB0by4KKyAgdHlwZWRlZiBzdGQ6OmZ1bmN0aW9uPHZvaWQoY29uc3QgUGFzc01hbmFnZXJCdWlsZGVyICZCdWlsZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWdhY3k6OlBhc3NNYW5hZ2VyQmFzZSAmUE0pPgorICAgICAgRXh0ZW5zaW9uRm47CisgIGVudW0gRXh0ZW5zaW9uUG9pbnRUeSB7CisgICAgLy8vIEVQX0Vhcmx5QXNQb3NzaWJsZSAtIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhZGRpbmcgcGFzc2VzIGJlZm9yZQorICAgIC8vLyBhbnkgb3RoZXIgdHJhbnNmb3JtYXRpb25zLCBhbGxvd2luZyB0aGVtIHRvIHNlZSB0aGUgY29kZSBhcyBpdCBpcyBjb21pbmcKKyAgICAvLy8gb3V0IG9mIHRoZSBmcm9udGVuZC4KKyAgICBFUF9FYXJseUFzUG9zc2libGUsCisKKyAgICAvLy8gRVBfTW9kdWxlT3B0aW1pemVyRWFybHkgLSBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYWRkaW5nIHBhc3NlcworICAgIC8vLyBqdXN0IGJlZm9yZSB0aGUgbWFpbiBtb2R1bGUtbGV2ZWwgb3B0aW1pemF0aW9uIHBhc3Nlcy4KKyAgICBFUF9Nb2R1bGVPcHRpbWl6ZXJFYXJseSwKKworICAgIC8vLyBFUF9Mb29wT3B0aW1pemVyRW5kIC0gVGhpcyBleHRlbnNpb24gcG9pbnQgYWxsb3dzIGFkZGluZyBsb29wIHBhc3NlcyB0bworICAgIC8vLyB0aGUgZW5kIG9mIHRoZSBsb29wIG9wdGltaXplci4KKyAgICBFUF9Mb29wT3B0aW1pemVyRW5kLAorCisgICAgLy8vIEVQX1NjYWxhck9wdGltaXplckxhdGUgLSBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYWRkaW5nIG9wdGltaXphdGlvbgorICAgIC8vLyBwYXNzZXMgYWZ0ZXIgbW9zdCBvZiB0aGUgbWFpbiBvcHRpbWl6YXRpb25zLCBidXQgYmVmb3JlIHRoZSBsYXN0CisgICAgLy8vIGNsZWFudXAtaXNoIG9wdGltaXphdGlvbnMuCisgICAgRVBfU2NhbGFyT3B0aW1pemVyTGF0ZSwKKworICAgIC8vLyBFUF9PcHRpbWl6ZXJMYXN0IC0tIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhZGRpbmcgcGFzc2VzIHRoYXQKKyAgICAvLy8gcnVuIGFmdGVyIGV2ZXJ5dGhpbmcgZWxzZS4KKyAgICBFUF9PcHRpbWl6ZXJMYXN0LAorCisgICAgLy8vIEVQX1ZlY3Rvcml6ZXJTdGFydCAtIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhZGRpbmcgb3B0aW1pemF0aW9uCisgICAgLy8vIHBhc3NlcyBiZWZvcmUgdGhlIHZlY3Rvcml6ZXIgYW5kIG90aGVyIGhpZ2hseSB0YXJnZXQgc3BlY2lmaWMKKyAgICAvLy8gb3B0aW1pemF0aW9uIHBhc3NlcyBhcmUgZXhlY3V0ZWQuCisgICAgRVBfVmVjdG9yaXplclN0YXJ0LAorCisgICAgLy8vIEVQX0VuYWJsZWRPbk9wdExldmVsMCAtIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhZGRpbmcgcGFzc2VzIHRoYXQKKyAgICAvLy8gc2hvdWxkIG5vdCBiZSBkaXNhYmxlZCBieSBPMCBvcHRpbWl6YXRpb24gbGV2ZWwuIFRoZSBwYXNzZXMgd2lsbCBiZQorICAgIC8vLyBpbnNlcnRlZCBhZnRlciB0aGUgaW5saW5pbmcgcGFzcy4KKyAgICBFUF9FbmFibGVkT25PcHRMZXZlbDAsCisKKyAgICAvLy8gRVBfUGVlcGhvbGUgLSBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYWRkaW5nIHBhc3NlcyB0aGF0IHBlcmZvcm0KKyAgICAvLy8gcGVlcGhvbGUgb3B0aW1pemF0aW9ucyBzaW1pbGFyIHRvIHRoZSBpbnN0cnVjdGlvbiBjb21iaW5lci4gVGhlc2UgcGFzc2VzCisgICAgLy8vIHdpbGwgYmUgaW5zZXJ0ZWQgYWZ0ZXIgZWFjaCBpbnN0YW5jZSBvZiB0aGUgaW5zdHJ1Y3Rpb24gY29tYmluZXIgcGFzcy4KKyAgICBFUF9QZWVwaG9sZSwKKworICAgIC8vLyBFUF9MYXRlTG9vcE9wdGltaXphdGlvbnMgLSBUaGlzIGV4dGVuc2lvbiBwb2ludCBhbGxvd3MgYWRkaW5nIGxhdGUgbG9vcAorICAgIC8vLyBjYW5vbmljYWxpemF0aW9uIGFuZCBzaW1wbGlmaWNhdGlvbiBwYXNzZXMuIFRoaXMgaXMgdGhlIGxhc3QgcG9pbnQgaW4KKyAgICAvLy8gdGhlIGxvb3Agb3B0aW1pemF0aW9uIHBpcGVsaW5lIGJlZm9yZSBsb29wIGRlbGV0aW9uLiBFYWNoIHBhc3MgYWRkZWQKKyAgICAvLy8gaGVyZSBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIExvb3BQYXNzLgorICAgIC8vLyBUaGlzIGlzIHRoZSBwbGFjZSB0byBhZGQgcGFzc2VzIHRoYXQgY2FuIHJlbW92ZSBsb29wcywgc3VjaCBhcyB0YXJnZXQtCisgICAgLy8vIHNwZWNpZmljIGxvb3AgaWRpb20gcmVjb2duaXRpb24uCisgICAgRVBfTGF0ZUxvb3BPcHRpbWl6YXRpb25zLAorCisgICAgLy8vIEVQX0NHU0NDT3B0aW1pemVyTGF0ZSAtIFRoaXMgZXh0ZW5zaW9uIHBvaW50IGFsbG93cyBhZGRpbmcgQ2FsbEdyYXBoU0NDCisgICAgLy8vIHBhc3NlcyBhdCB0aGUgZW5kIG9mIHRoZSBtYWluIENhbGxHcmFwaFNDQyBwYXNzZXMgYW5kIGJlZm9yZSBhbnkKKyAgICAvLy8gZnVuY3Rpb24gc2ltcGxpZmljYXRpb24gcGFzc2VzIHJ1biBieSBDR1Bhc3NNYW5hZ2VyLgorICAgIEVQX0NHU0NDT3B0aW1pemVyTGF0ZSwKKyAgfTsKKworICAvLy8gVGhlIE9wdGltaXphdGlvbiBMZXZlbCAtIFNwZWNpZnkgdGhlIGJhc2ljIG9wdGltaXphdGlvbiBsZXZlbC4KKyAgLy8vICAgIDAgPSAtTzAsIDEgPSAtTzEsIDIgPSAtTzIsIDMgPSAtTzMKKyAgdW5zaWduZWQgT3B0TGV2ZWw7CisKKyAgLy8vIFNpemVMZXZlbCAtIEhvdyBtdWNoIHdlJ3JlIG9wdGltaXppbmcgZm9yIHNpemUuCisgIC8vLyAgICAwID0gbm9uZSwgMSA9IC1PcywgMiA9IC1PegorICB1bnNpZ25lZCBTaXplTGV2ZWw7CisKKyAgLy8vIExpYnJhcnlJbmZvIC0gU3BlY2lmaWVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBydW50aW1lIGxpYnJhcnkgZm9yIHRoZQorICAvLy8gb3B0aW1pemVyLiAgSWYgdGhpcyBpcyBub24tbnVsbCwgaXQgaXMgYWRkZWQgdG8gYm90aCB0aGUgZnVuY3Rpb24gYW5kCisgIC8vLyBwZXItbW9kdWxlIHBhc3MgcGlwZWxpbmUuCisgIFRhcmdldExpYnJhcnlJbmZvSW1wbCAqTGlicmFyeUluZm87CisKKyAgLy8vIElubGluZXIgLSBTcGVjaWZpZXMgdGhlIGlubGluZXIgdG8gdXNlLiAgSWYgdGhpcyBpcyBub24tbnVsbCwgaXQgaXMKKyAgLy8vIGFkZGVkIHRvIHRoZSBwZXItbW9kdWxlIHBhc3Nlcy4KKyAgUGFzcyAqSW5saW5lcjsKKworICAvLy8gVGhlIG1vZHVsZSBzdW1tYXJ5IGluZGV4IHRvIHVzZSBmb3IgZXhwb3J0aW5nIGluZm9ybWF0aW9uIGZyb20gdGhlCisgIC8vLyByZWd1bGFyIExUTyBwaGFzZSwgZm9yIGV4YW1wbGUgZm9yIHRoZSBDRkkgYW5kIGRldmlydHVhbGl6YXRpb24gdHlwZQorICAvLy8gdGVzdHMuCisgIE1vZHVsZVN1bW1hcnlJbmRleCAqRXhwb3J0U3VtbWFyeSA9IG51bGxwdHI7CisKKyAgLy8vIFRoZSBtb2R1bGUgc3VtbWFyeSBpbmRleCB0byB1c2UgZm9yIGltcG9ydGluZyBpbmZvcm1hdGlvbiB0byB0aGUKKyAgLy8vIHRoaW4gTFRPIGJhY2tlbmRzLCBmb3IgZXhhbXBsZSBmb3IgdGhlIENGSSBhbmQgZGV2aXJ0dWFsaXphdGlvbiB0eXBlCisgIC8vLyB0ZXN0cy4KKyAgY29uc3QgTW9kdWxlU3VtbWFyeUluZGV4ICpJbXBvcnRTdW1tYXJ5ID0gbnVsbHB0cjsKKworICBib29sIERpc2FibGVUYWlsQ2FsbHM7CisgIGJvb2wgRGlzYWJsZVVuaXRBdEFUaW1lOworICBib29sIERpc2FibGVVbnJvbGxMb29wczsKKyAgYm9vbCBTTFBWZWN0b3JpemU7CisgIGJvb2wgTG9vcFZlY3Rvcml6ZTsKKyAgYm9vbCBSZXJvbGxMb29wczsKKyAgYm9vbCBOZXdHVk47CisgIGJvb2wgRGlzYWJsZUdWTkxvYWRQUkU7CisgIGJvb2wgVmVyaWZ5SW5wdXQ7CisgIGJvb2wgVmVyaWZ5T3V0cHV0OworICBib29sIE1lcmdlRnVuY3Rpb25zOworICBib29sIFByZXBhcmVGb3JMVE87CisgIGJvb2wgUHJlcGFyZUZvclRoaW5MVE87CisgIGJvb2wgUGVyZm9ybVRoaW5MVE87CisgIGJvb2wgRGl2ZXJnZW50VGFyZ2V0OworCisgIC8vLyBFbmFibGUgcHJvZmlsZSBpbnN0cnVtZW50YXRpb24gcGFzcy4KKyAgYm9vbCBFbmFibGVQR09JbnN0ckdlbjsKKyAgLy8vIFByb2ZpbGUgZGF0YSBmaWxlIG5hbWUgdGhhdCB0aGUgaW5zdHJ1bWVudGF0aW9uIHdpbGwgYmUgd3JpdHRlbiB0by4KKyAgc3RkOjpzdHJpbmcgUEdPSW5zdHJHZW47CisgIC8vLyBQYXRoIG9mIHRoZSBwcm9maWxlIGRhdGEgZmlsZS4KKyAgc3RkOjpzdHJpbmcgUEdPSW5zdHJVc2U7CisgIC8vLyBQYXRoIG9mIHRoZSBzYW1wbGUgUHJvZmlsZSBkYXRhIGZpbGUuCisgIHN0ZDo6c3RyaW5nIFBHT1NhbXBsZVVzZTsKKworcHJpdmF0ZToKKyAgLy8vIEV4dGVuc2lvbkxpc3QgLSBUaGlzIGlzIGxpc3Qgb2YgYWxsIG9mIHRoZSBleHRlbnNpb25zIHRoYXQgYXJlIHJlZ2lzdGVyZWQuCisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxFeHRlbnNpb25Qb2ludFR5LCBFeHRlbnNpb25Gbj4+IEV4dGVuc2lvbnM7CisKK3B1YmxpYzoKKyAgUGFzc01hbmFnZXJCdWlsZGVyKCk7CisgIH5QYXNzTWFuYWdlckJ1aWxkZXIoKTsKKyAgLy8vIEFkZHMgYW4gZXh0ZW5zaW9uIHRoYXQgd2lsbCBiZSB1c2VkIGJ5IGFsbCBQYXNzTWFuYWdlckJ1aWxkZXIgaW5zdGFuY2VzLgorICAvLy8gVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IHBsdWdpbnMsIHRvIHJlZ2lzdGVyIGEgc2V0IG9mCisgIC8vLyBvcHRpbWlzYXRpb25zIHRvIHJ1biBhdXRvbWF0aWNhbGx5LgorICBzdGF0aWMgdm9pZCBhZGRHbG9iYWxFeHRlbnNpb24oRXh0ZW5zaW9uUG9pbnRUeSBUeSwgRXh0ZW5zaW9uRm4gRm4pOworICB2b2lkIGFkZEV4dGVuc2lvbihFeHRlbnNpb25Qb2ludFR5IFR5LCBFeHRlbnNpb25GbiBGbik7CisKK3ByaXZhdGU6CisgIHZvaWQgYWRkRXh0ZW5zaW9uc1RvUE0oRXh0ZW5zaW9uUG9pbnRUeSBFVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgbGVnYWN5OjpQYXNzTWFuYWdlckJhc2UgJlBNKSBjb25zdDsKKyAgdm9pZCBhZGRJbml0aWFsQWxpYXNBbmFseXNpc1Bhc3NlcyhsZWdhY3k6OlBhc3NNYW5hZ2VyQmFzZSAmUE0pIGNvbnN0OworICB2b2lkIGFkZExUT09wdGltaXphdGlvblBhc3NlcyhsZWdhY3k6OlBhc3NNYW5hZ2VyQmFzZSAmUE0pOworICB2b2lkIGFkZExhdGVMVE9PcHRpbWl6YXRpb25QYXNzZXMobGVnYWN5OjpQYXNzTWFuYWdlckJhc2UgJlBNKTsKKyAgdm9pZCBhZGRQR09JbnN0clBhc3NlcyhsZWdhY3k6OlBhc3NNYW5hZ2VyQmFzZSAmTVBNKTsKKyAgdm9pZCBhZGRGdW5jdGlvblNpbXBsaWZpY2F0aW9uUGFzc2VzKGxlZ2FjeTo6UGFzc01hbmFnZXJCYXNlICZNUE0pOworICB2b2lkIGFkZEluc3RydWN0aW9uQ29tYmluaW5nUGFzcyhsZWdhY3k6OlBhc3NNYW5hZ2VyQmFzZSAmTVBNKSBjb25zdDsKKworcHVibGljOgorICAvLy8gcG9wdWxhdGVGdW5jdGlvblBhc3NNYW5hZ2VyIC0gVGhpcyBmaWxscyBpbiB0aGUgZnVuY3Rpb24gcGFzcyBtYW5hZ2VyLAorICAvLy8gd2hpY2ggaXMgZXhwZWN0ZWQgdG8gYmUgcnVuIG9uIGVhY2ggZnVuY3Rpb24gaW1tZWRpYXRlbHkgYXMgaXQgaXMKKyAgLy8vIGdlbmVyYXRlZC4gIFRoZSBpZGVhIGlzIHRvIHJlZHVjZSB0aGUgc2l6ZSBvZiB0aGUgSVIgaW4gbWVtb3J5LgorICB2b2lkIHBvcHVsYXRlRnVuY3Rpb25QYXNzTWFuYWdlcihsZWdhY3k6OkZ1bmN0aW9uUGFzc01hbmFnZXIgJkZQTSk7CisKKyAgLy8vIHBvcHVsYXRlTW9kdWxlUGFzc01hbmFnZXIgLSBUaGlzIHNldHMgdXAgdGhlIHByaW1hcnkgcGFzcyBtYW5hZ2VyLgorICB2b2lkIHBvcHVsYXRlTW9kdWxlUGFzc01hbmFnZXIobGVnYWN5OjpQYXNzTWFuYWdlckJhc2UgJk1QTSk7CisgIHZvaWQgcG9wdWxhdGVMVE9QYXNzTWFuYWdlcihsZWdhY3k6OlBhc3NNYW5hZ2VyQmFzZSAmUE0pOworICB2b2lkIHBvcHVsYXRlVGhpbkxUT1Bhc3NNYW5hZ2VyKGxlZ2FjeTo6UGFzc01hbmFnZXJCYXNlICZQTSk7Cit9OworCisvLy8gUmVnaXN0ZXJzIGEgZnVuY3Rpb24gZm9yIGFkZGluZyBhIHN0YW5kYXJkIHNldCBvZiBwYXNzZXMuICBUaGlzIHNob3VsZCBiZQorLy8vIHVzZWQgYnkgb3B0aW1pemVyIHBsdWdpbnMgdG8gYWxsb3cgYWxsIGZyb250IGVuZHMgdG8gdHJhbnNwYXJlbnRseSB1c2UKKy8vLyB0aGVtLiAgQ3JlYXRlIGEgc3RhdGljIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaW4geW91ciBwbHVnaW4sIHByb3ZpZGluZyBhCisvLy8gcHJpdmF0ZSBmdW5jdGlvbiB0aGF0IHRoZSBQYXNzTWFuYWdlckJ1aWxkZXIgY2FuIHVzZSB0byBhZGQgeW91ciBwYXNzZXMuCitzdHJ1Y3QgUmVnaXN0ZXJTdGFuZGFyZFBhc3NlcyB7CisgIFJlZ2lzdGVyU3RhbmRhcmRQYXNzZXMoUGFzc01hbmFnZXJCdWlsZGVyOjpFeHRlbnNpb25Qb2ludFR5IFR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIFBhc3NNYW5hZ2VyQnVpbGRlcjo6RXh0ZW5zaW9uRm4gRm4pIHsKKyAgICBQYXNzTWFuYWdlckJ1aWxkZXI6OmFkZEdsb2JhbEV4dGVuc2lvbihUeSwgc3RkOjptb3ZlKEZuKSk7CisgIH0KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vU0NDUC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9TQ0NQLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRiNzg2NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vU0NDUC5oCkBAIC0wLDAgKzEsMzggQEAKKy8vPT09LSBTQ0NQLmggLSBTcGFyc2UgQ29uZGl0aW9uYWwgQ29uc3RhbnQgUHJvcGFnYXRpb24gLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIGltcGxlbWVudHMgIGludGVycHJvY2VkdXJhbCBzcGFyc2UgY29uZGl0aW9uYWwgY29uc3RhbnQKKy8vIHByb3BhZ2F0aW9uIGFuZCBtZXJnaW5nLgorLy8KKy8vIFNwZWNpZmljYWxseSwgdGhpczoKKy8vICAgKiBBc3N1bWVzIHZhbHVlcyBhcmUgY29uc3RhbnQgdW5sZXNzIHByb3ZlbiBvdGhlcndpc2UKKy8vICAgKiBBc3N1bWVzIEJhc2ljQmxvY2tzIGFyZSBkZWFkIHVubGVzcyBwcm92ZW4gb3RoZXJ3aXNlCisvLyAgICogUHJvdmVzIHZhbHVlcyB0byBiZSBjb25zdGFudCwgYW5kIHJlcGxhY2VzIHRoZW0gd2l0aCBjb25zdGFudHMKKy8vICAgKiBQcm92ZXMgY29uZGl0aW9uYWwgYnJhbmNoZXMgdG8gYmUgdW5jb25kaXRpb25hbAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0lQT19TQ0NQX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19TQ0NQX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBNb2R1bGU7CisKKy8vLyBQYXNzIHRvIHBlcmZvcm0gaW50ZXJwcm9jZWR1cmFsIGNvbnN0YW50IHByb3BhZ2F0aW9uLgorY2xhc3MgSVBTQ0NQUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPElQU0NDUFBhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX0lQT19TQ0NQX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vU2FtcGxlUHJvZmlsZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9TYW1wbGVQcm9maWxlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2Q1YTA1NgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vU2FtcGxlUHJvZmlsZS5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vPT09LSBTYW1wbGVQcm9maWxlLmggLSBTYW1wbGVQR08gcGFzcyAtLS0tLS0tLS0tIC0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgZm9yIHRoZSBzYW1wbGVkIFBHTyBsb2FkZXIgcGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19JUE9fU0FNUExFUFJPRklMRV9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JUE9fU0FNUExFUFJPRklMRV9ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1vZHVsZTsKKworLy8vIFRoZSBzYW1wbGUgcHJvZmlsZXIgZGF0YSBsb2FkZXIgcGFzcy4KK2NsYXNzIFNhbXBsZVByb2ZpbGVMb2FkZXJQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48U2FtcGxlUHJvZmlsZUxvYWRlclBhc3M+IHsKK3B1YmxpYzoKKyAgU2FtcGxlUHJvZmlsZUxvYWRlclBhc3Moc3RkOjpzdHJpbmcgRmlsZSA9ICIiLCBib29sIElzVGhpbkxUT1ByZUxpbmsgPSBmYWxzZSkKKyAgICAgIDogUHJvZmlsZUZpbGVOYW1lKEZpbGUpLCBJc1RoaW5MVE9QcmVMaW5rKElzVGhpbkxUT1ByZUxpbmspIHt9CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZBTSk7CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIFByb2ZpbGVGaWxlTmFtZTsKKyAgYm9vbCBJc1RoaW5MVE9QcmVMaW5rOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQU1QTEVQUk9GSUxFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vU3RyaXBEZWFkUHJvdG90eXBlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9TdHJpcERlYWRQcm90b3R5cGVzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWEwNWNkNwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vU3RyaXBEZWFkUHJvdG90eXBlcy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vPT09LS0gU3RyaXBEZWFkUHJvdG90eXBlcy5oIC0gUmVtb3ZlIHVudXNlZCBmdW5jdGlvbiBkZWNsYXJhdGlvbnMgLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIGxvb3BzIG92ZXIgYWxsIG9mIHRoZSBmdW5jdGlvbnMgaW4gdGhlIGlucHV0IG1vZHVsZSwgbG9va2luZyBmb3IKKy8vIGRlYWQgZGVjbGFyYXRpb25zIGFuZCByZW1vdmVzIHRoZW0uIERlYWQgZGVjbGFyYXRpb25zIGFyZSBkZWNsYXJhdGlvbnMgb2YKKy8vIGZ1bmN0aW9ucyBmb3Igd2hpY2ggbm8gaW1wbGVtZW50YXRpb24gaXMgYXZhaWxhYmxlIChpLmUuLCBkZWNsYXJhdGlvbnMgZm9yCisvLyB1bnVzZWQgbGlicmFyeSBmdW5jdGlvbnMpLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0lQT19TVFJJUERFQURQUk9UT1RZUEVTX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19TVFJJUERFQURQUk9UT1RZUEVTX0gKKworI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBQYXNzIHRvIHJlbW92ZSB1bnVzZWQgZnVuY3Rpb24gZGVjbGFyYXRpb25zLgorc3RydWN0IFN0cmlwRGVhZFByb3RvdHlwZXNQYXNzIDogUGFzc0luZm9NaXhpbjxTdHJpcERlYWRQcm90b3R5cGVzUGFzcz4geworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJik7Cit9OworCit9CisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfSVBPX1NUUklQREVBRFBST1RPVFlQRVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9TeW50aGV0aWNDb3VudHNQcm9wYWdhdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9TeW50aGV0aWNDb3VudHNQcm9wYWdhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBiM2JhODYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL1N5bnRoZXRpY0NvdW50c1Byb3BhZ2F0aW9uLmgKQEAgLTAsMCArMSwxOSBAQAorI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX1NZTlRIRVRJQ19DT1VOVFNfUFJPUEFHQVRJT05fSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfSVBPX1NZTlRIRVRJQ19DT1VOVFNfUFJPUEFHQVRJT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvU2NhbGVkTnVtYmVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgTW9kdWxlOworCitjbGFzcyBTeW50aGV0aWNDb3VudHNQcm9wYWdhdGlvbgorICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48U3ludGhldGljQ291bnRzUHJvcGFnYXRpb24+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZNQU0pOworfTsKK30gLy8gbmFtZXNwYWNlIGxsdm0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9UaGluTFRPQml0Y29kZVdyaXRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9UaGluTFRPQml0Y29kZVdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmMDRiYmYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSVBPL1RoaW5MVE9CaXRjb2RlV3JpdGVyLmgKQEAgLTAsMCArMSw0MSBAQAorLy89PT0tIFRoaW5MVE9CaXRjb2RlV3JpdGVyLmggLSBCaXRjb2RlIHdyaXRpbmcgcGFzcyBmb3IgVGhpbkxUTyAtLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgcHJlcGFyZXMgYSBtb2R1bGUgY29udGFpbmluZyB0eXBlIG1ldGFkYXRhIGZvciBUaGluTFRPIGJ5IHNwbGl0dGluZworLy8gaXQgaW50byByZWd1bGFyIGFuZCB0aGluIExUTyBwYXJ0cyBpZiBwb3NzaWJsZSwgYW5kIHdyaXRpbmcgYm90aCBwYXJ0cyB0bworLy8gYSBtdWx0aS1tb2R1bGUgYml0Y29kZSBmaWxlLiBNb2R1bGVzIHRoYXQgZG8gbm90IGNvbnRhaW4gdHlwZSBtZXRhZGF0YSBhcmUKKy8vIHdyaXR0ZW4gdW5tb2RpZmllZCBhcyBhIHNpbmdsZSBtb2R1bGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfSVBPX1RISU5MVE9CSVRDT0RFV1JJVEVSX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19USElOTFRPQklUQ09ERVdSSVRFUl9ICisKKyNpbmNsdWRlIDxsbHZtL0lSL1Bhc3NNYW5hZ2VyLmg+CisjaW5jbHVkZSA8bGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmg+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVGhpbkxUT0JpdGNvZGVXcml0ZXJQYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxUaGluTFRPQml0Y29kZVdyaXRlclBhc3M+IHsKKyAgcmF3X29zdHJlYW0gJk9TOworICByYXdfb3N0cmVhbSAqVGhpbkxpbmtPUzsKKworcHVibGljOgorICAvLyBXcml0ZXMgYml0Y29kZSB0byBPUy4gQWxzbyB3cml0ZSB0aGluIGxpbmsgZmlsZSB0byBUaGluTGlua09TLCBpZgorICAvLyBpdCdzIG5vdCBudWxscHRyLgorICBUaGluTFRPQml0Y29kZVdyaXRlclBhc3MocmF3X29zdHJlYW0gJk9TLCByYXdfb3N0cmVhbSAqVGhpbkxpbmtPUykKKyAgICAgIDogT1MoT1MpLCBUaGluTGlua09TKFRoaW5MaW5rT1MpIHt9CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0lQTy9XaG9sZVByb2dyYW1EZXZpcnQuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vV2hvbGVQcm9ncmFtRGV2aXJ0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWFhNGM2ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JUE8vV2hvbGVQcm9ncmFtRGV2aXJ0LmgKQEAgLTAsMCArMSwyMjYgQEAKKy8vPT09LSBXaG9sZVByb2dyYW1EZXZpcnQuaCAtIFdob2xlLXByb2dyYW0gZGV2aXJ0IHBhc3MgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgcGFydHMgb2YgdGhlIHdob2xlLXByb2dyYW0gZGV2aXJ0dWFsaXphdGlvbiBwYXNzCisvLyBpbXBsZW1lbnRhdGlvbiB0aGF0IG1heSBiZSB1c2VmdWxseSB1bml0IHRlc3RlZC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19JUE9fV0hPTEVQUk9HUkFNREVWSVJUX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lQT19XSE9MRVBST0dSQU1ERVZJUlRfSAorCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPHV0aWxpdHk+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheVJlZjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBNdXRhYmxlQXJyYXlSZWY7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEdsb2JhbFZhcmlhYmxlOworCituYW1lc3BhY2Ugd2hvbGVwcm9ncmFtZGV2aXJ0IHsKKworLy8gQSBiaXQgdmVjdG9yIHRoYXQga2VlcHMgdHJhY2sgb2Ygd2hpY2ggYml0cyBhcmUgdXNlZC4gV2UgdXNlIHRoaXMgdG8KKy8vIHBhY2sgY29uc3RhbnQgdmFsdWVzIGNvbXBhY3RseSBiZWZvcmUgYW5kIGFmdGVyIGVhY2ggdmlydHVhbCB0YWJsZS4KK3N0cnVjdCBBY2N1bUJpdFZlY3RvciB7CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IEJ5dGVzOworCisgIC8vIEJpdHMgaW4gQnl0ZXNVc2VkW0ldIGFyZSAxIGlmIG1hdGNoaW5nIGJpdCBpbiBCeXRlc1tJXSBpcyB1c2VkLCAwIGlmIG5vdC4KKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gQnl0ZXNVc2VkOworCisgIHN0ZDo6cGFpcjx1aW50OF90ICosIHVpbnQ4X3QgKj4gZ2V0UHRyVG9EYXRhKHVpbnQ2NF90IFBvcywgdWludDhfdCBTaXplKSB7CisgICAgaWYgKEJ5dGVzLnNpemUoKSA8IFBvcyArIFNpemUpIHsKKyAgICAgIEJ5dGVzLnJlc2l6ZShQb3MgKyBTaXplKTsKKyAgICAgIEJ5dGVzVXNlZC5yZXNpemUoUG9zICsgU2l6ZSk7CisgICAgfQorICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihCeXRlcy5kYXRhKCkgKyBQb3MsIEJ5dGVzVXNlZC5kYXRhKCkgKyBQb3MpOworICB9CisKKyAgLy8gU2V0IGxpdHRsZS1lbmRpYW4gdmFsdWUgVmFsIHdpdGggc2l6ZSBTaXplIGF0IGJpdCBwb3NpdGlvbiBQb3MsCisgIC8vIGFuZCBtYXJrIGJ5dGVzIGFzIHVzZWQuCisgIHZvaWQgc2V0TEUodWludDY0X3QgUG9zLCB1aW50NjRfdCBWYWwsIHVpbnQ4X3QgU2l6ZSkgeworICAgIGFzc2VydChQb3MgJSA4ID09IDApOworICAgIGF1dG8gRGF0YVVzZWQgPSBnZXRQdHJUb0RhdGEoUG9zIC8gOCwgU2l6ZSk7CisgICAgZm9yICh1bnNpZ25lZCBJID0gMDsgSSAhPSBTaXplOyArK0kpIHsKKyAgICAgIERhdGFVc2VkLmZpcnN0W0ldID0gVmFsID4+IChJICogOCk7CisgICAgICBhc3NlcnQoIURhdGFVc2VkLnNlY29uZFtJXSk7CisgICAgICBEYXRhVXNlZC5zZWNvbmRbSV0gPSAweGZmOworICAgIH0KKyAgfQorCisgIC8vIFNldCBiaWctZW5kaWFuIHZhbHVlIFZhbCB3aXRoIHNpemUgU2l6ZSBhdCBiaXQgcG9zaXRpb24gUG9zLAorICAvLyBhbmQgbWFyayBieXRlcyBhcyB1c2VkLgorICB2b2lkIHNldEJFKHVpbnQ2NF90IFBvcywgdWludDY0X3QgVmFsLCB1aW50OF90IFNpemUpIHsKKyAgICBhc3NlcnQoUG9zICUgOCA9PSAwKTsKKyAgICBhdXRvIERhdGFVc2VkID0gZ2V0UHRyVG9EYXRhKFBvcyAvIDgsIFNpemUpOworICAgIGZvciAodW5zaWduZWQgSSA9IDA7IEkgIT0gU2l6ZTsgKytJKSB7CisgICAgICBEYXRhVXNlZC5maXJzdFtTaXplIC0gSSAtIDFdID0gVmFsID4+IChJICogOCk7CisgICAgICBhc3NlcnQoIURhdGFVc2VkLnNlY29uZFtTaXplIC0gSSAtIDFdKTsKKyAgICAgIERhdGFVc2VkLnNlY29uZFtTaXplIC0gSSAtIDFdID0gMHhmZjsKKyAgICB9CisgIH0KKworICAvLyBTZXQgYml0IGF0IGJpdCBwb3NpdGlvbiBQb3MgdG8gYiBhbmQgbWFyayBiaXQgYXMgdXNlZC4KKyAgdm9pZCBzZXRCaXQodWludDY0X3QgUG9zLCBib29sIGIpIHsKKyAgICBhdXRvIERhdGFVc2VkID0gZ2V0UHRyVG9EYXRhKFBvcyAvIDgsIDEpOworICAgIGlmIChiKQorICAgICAgKkRhdGFVc2VkLmZpcnN0IHw9IDEgPDwgKFBvcyAlIDgpOworICAgIGFzc2VydCghKCpEYXRhVXNlZC5zZWNvbmQgJiAoMSA8PCBQb3MgJSA4KSkpOworICAgICpEYXRhVXNlZC5zZWNvbmQgfD0gMSA8PCAoUG9zICUgOCk7CisgIH0KK307CisKKy8vIFRoZSBiaXRzIHRoYXQgd2lsbCBiZSBzdG9yZWQgYmVmb3JlIGFuZCBhZnRlciBhIHBhcnRpY3VsYXIgdnRhYmxlLgorc3RydWN0IFZUYWJsZUJpdHMgeworICAvLyBUaGUgdnRhYmxlIGdsb2JhbC4KKyAgR2xvYmFsVmFyaWFibGUgKkdWOworCisgIC8vIENhY2hlIG9mIHRoZSB2dGFibGUncyBzaXplIGluIGJ5dGVzLgorICB1aW50NjRfdCBPYmplY3RTaXplID0gMDsKKworICAvLyBUaGUgYml0IHZlY3RvciB0aGF0IHdpbGwgYmUgbGFpZCBvdXQgYmVmb3JlIHRoZSB2dGFibGUuIE5vdGUgdGhhdCB0aGVzZQorICAvLyBieXRlcyBhcmUgc3RvcmVkIGluIHJldmVyc2Ugb3JkZXIgdW50aWwgdGhlIGdsb2JhbHMgYXJlIHJlYnVpbHQuIFRoaXMgbWVhbnMKKyAgLy8gdGhhdCBhbnkgdmFsdWVzIGluIHRoZSBhcnJheSBtdXN0IGJlIHN0b3JlZCB1c2luZyB0aGUgb3Bwb3NpdGUgZW5kaWFubmVzcworICAvLyBmcm9tIHRoZSB0YXJnZXQuCisgIEFjY3VtQml0VmVjdG9yIEJlZm9yZTsKKworICAvLyBUaGUgYml0IHZlY3RvciB0aGF0IHdpbGwgYmUgbGFpZCBvdXQgYWZ0ZXIgdGhlIHZ0YWJsZS4KKyAgQWNjdW1CaXRWZWN0b3IgQWZ0ZXI7Cit9OworCisvLyBJbmZvcm1hdGlvbiBhYm91dCBhIG1lbWJlciBvZiBhIHBhcnRpY3VsYXIgdHlwZSBpZGVudGlmaWVyLgorc3RydWN0IFR5cGVNZW1iZXJJbmZvIHsKKyAgLy8gVGhlIFZUYWJsZUJpdHMgZm9yIHRoZSB2dGFibGUuCisgIFZUYWJsZUJpdHMgKkJpdHM7CisKKyAgLy8gVGhlIG9mZnNldCBpbiBieXRlcyBmcm9tIHRoZSBzdGFydCBvZiB0aGUgdnRhYmxlIChpLmUuIHRoZSBhZGRyZXNzIHBvaW50KS4KKyAgdWludDY0X3QgT2Zmc2V0OworCisgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFR5cGVNZW1iZXJJbmZvICZvdGhlcikgY29uc3QgeworICAgIHJldHVybiBCaXRzIDwgb3RoZXIuQml0cyB8fCAoQml0cyA9PSBvdGhlci5CaXRzICYmIE9mZnNldCA8IG90aGVyLk9mZnNldCk7CisgIH0KK307CisKKy8vIEEgdmlydHVhbCBjYWxsIHRhcmdldCwgaS5lLiBhbiBlbnRyeSBpbiBhIHBhcnRpY3VsYXIgdnRhYmxlLgorc3RydWN0IFZpcnR1YWxDYWxsVGFyZ2V0IHsKKyAgVmlydHVhbENhbGxUYXJnZXQoRnVuY3Rpb24gKkZuLCBjb25zdCBUeXBlTWVtYmVySW5mbyAqVE0pOworCisgIC8vIEZvciB0ZXN0aW5nIG9ubHkuCisgIFZpcnR1YWxDYWxsVGFyZ2V0KGNvbnN0IFR5cGVNZW1iZXJJbmZvICpUTSwgYm9vbCBJc0JpZ0VuZGlhbikKKyAgICAgIDogRm4obnVsbHB0ciksIFRNKFRNKSwgSXNCaWdFbmRpYW4oSXNCaWdFbmRpYW4pLCBXYXNEZXZpcnQoZmFsc2UpIHt9CisKKyAgLy8gVGhlIGZ1bmN0aW9uIHN0b3JlZCBpbiB0aGUgdnRhYmxlLgorICBGdW5jdGlvbiAqRm47CisKKyAgLy8gQSBwb2ludGVyIHRvIHRoZSB0eXBlIGlkZW50aWZpZXIgbWVtYmVyIHRocm91Z2ggd2hpY2ggdGhlIHBvaW50ZXIgdG8gRm4gaXMKKyAgLy8gYWNjZXNzZWQuCisgIGNvbnN0IFR5cGVNZW1iZXJJbmZvICpUTTsKKworICAvLyBXaGVuIGRvaW5nIHZpcnR1YWwgY29uc3RhbnQgcHJvcGFnYXRpb24sIHRoaXMgc3RvcmVzIHRoZSByZXR1cm4gdmFsdWUgZm9yCisgIC8vIHRoZSBmdW5jdGlvbiB3aGVuIHBhc3NlZCB0aGUgY3VycmVudGx5IGNvbnNpZGVyZWQgYXJndW1lbnQgbGlzdC4KKyAgdWludDY0X3QgUmV0VmFsOworCisgIC8vIFdoZXRoZXIgdGhlIHRhcmdldCBpcyBiaWcgZW5kaWFuLgorICBib29sIElzQmlnRW5kaWFuOworCisgIC8vIFdoZXRoZXIgYXQgbGVhc3Qgb25lIGNhbGwgc2l0ZSB0byB0aGUgdGFyZ2V0IHdhcyBkZXZpcnR1YWxpemVkLgorICBib29sIFdhc0RldmlydDsKKworICAvLyBUaGUgbWluaW11bSBieXRlIG9mZnNldCBiZWZvcmUgdGhlIGFkZHJlc3MgcG9pbnQuIFRoaXMgY292ZXJzIHRoZSBieXRlcyBpbgorICAvLyB0aGUgdnRhYmxlIG9iamVjdCBiZWZvcmUgdGhlIGFkZHJlc3MgcG9pbnQgKGUuZy4gUlRUSSwgYWNjZXNzLXRvLXRvcCwKKyAgLy8gdnRhYmxlcyBmb3Igb3RoZXIgYmFzZSBjbGFzc2VzKSBhbmQgaXMgZXF1YWwgdG8gdGhlIG9mZnNldCBmcm9tIHRoZSBzdGFydAorICAvLyBvZiB0aGUgdnRhYmxlIG9iamVjdCB0byB0aGUgYWRkcmVzcyBwb2ludC4KKyAgdWludDY0X3QgbWluQmVmb3JlQnl0ZXMoKSBjb25zdCB7IHJldHVybiBUTS0+T2Zmc2V0OyB9CisKKyAgLy8gVGhlIG1pbmltdW0gYnl0ZSBvZmZzZXQgYWZ0ZXIgdGhlIGFkZHJlc3MgcG9pbnQuIFRoaXMgY292ZXJzIHRoZSBieXRlcyBpbgorICAvLyB0aGUgdnRhYmxlIG9iamVjdCBhZnRlciB0aGUgYWRkcmVzcyBwb2ludCAoZS5nLiB0aGUgdnRhYmxlIGZvciB0aGUgY3VycmVudAorICAvLyBjbGFzcyBhbmQgYW55IGxhdGVyIGJhc2UgY2xhc3NlcykgYW5kIGlzIGVxdWFsIHRvIHRoZSBzaXplIG9mIHRoZSB2dGFibGUKKyAgLy8gb2JqZWN0IG1pbnVzIHRoZSBvZmZzZXQgZnJvbSB0aGUgc3RhcnQgb2YgdGhlIHZ0YWJsZSBvYmplY3QgdG8gdGhlIGFkZHJlc3MKKyAgLy8gcG9pbnQuCisgIHVpbnQ2NF90IG1pbkFmdGVyQnl0ZXMoKSBjb25zdCB7IHJldHVybiBUTS0+Qml0cy0+T2JqZWN0U2l6ZSAtIFRNLT5PZmZzZXQ7IH0KKworICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCAoZm9yIHRoZSB2dGFibGUgcGx1cyB0aGUgYnl0ZSBhcnJheSkgYmVmb3JlCisgIC8vIHRoZSBhZGRyZXNzIHBvaW50LgorICB1aW50NjRfdCBhbGxvY2F0ZWRCZWZvcmVCeXRlcygpIGNvbnN0IHsKKyAgICByZXR1cm4gbWluQmVmb3JlQnl0ZXMoKSArIFRNLT5CaXRzLT5CZWZvcmUuQnl0ZXMuc2l6ZSgpOworICB9CisKKyAgLy8gVGhlIG51bWJlciBvZiBieXRlcyBhbGxvY2F0ZWQgKGZvciB0aGUgdnRhYmxlIHBsdXMgdGhlIGJ5dGUgYXJyYXkpIGFmdGVyCisgIC8vIHRoZSBhZGRyZXNzIHBvaW50LgorICB1aW50NjRfdCBhbGxvY2F0ZWRBZnRlckJ5dGVzKCkgY29uc3QgeworICAgIHJldHVybiBtaW5BZnRlckJ5dGVzKCkgKyBUTS0+Qml0cy0+QWZ0ZXIuQnl0ZXMuc2l6ZSgpOworICB9CisKKyAgLy8gU2V0IHRoZSBiaXQgYXQgcG9zaXRpb24gUG9zIGJlZm9yZSB0aGUgYWRkcmVzcyBwb2ludCB0byBSZXRWYWwuCisgIHZvaWQgc2V0QmVmb3JlQml0KHVpbnQ2NF90IFBvcykgeworICAgIGFzc2VydChQb3MgPj0gOCAqIG1pbkJlZm9yZUJ5dGVzKCkpOworICAgIFRNLT5CaXRzLT5CZWZvcmUuc2V0Qml0KFBvcyAtIDggKiBtaW5CZWZvcmVCeXRlcygpLCBSZXRWYWwpOworICB9CisKKyAgLy8gU2V0IHRoZSBiaXQgYXQgcG9zaXRpb24gUG9zIGFmdGVyIHRoZSBhZGRyZXNzIHBvaW50IHRvIFJldFZhbC4KKyAgdm9pZCBzZXRBZnRlckJpdCh1aW50NjRfdCBQb3MpIHsKKyAgICBhc3NlcnQoUG9zID49IDggKiBtaW5BZnRlckJ5dGVzKCkpOworICAgIFRNLT5CaXRzLT5BZnRlci5zZXRCaXQoUG9zIC0gOCAqIG1pbkFmdGVyQnl0ZXMoKSwgUmV0VmFsKTsKKyAgfQorCisgIC8vIFNldCB0aGUgYnl0ZXMgYXQgcG9zaXRpb24gUG9zIGJlZm9yZSB0aGUgYWRkcmVzcyBwb2ludCB0byBSZXRWYWwuCisgIC8vIEJlY2F1c2UgdGhlIGJ5dGVzIGluIEJlZm9yZSBhcmUgc3RvcmVkIGluIHJldmVyc2Ugb3JkZXIsIHdlIHVzZSB0aGUKKyAgLy8gb3Bwb3NpdGUgZW5kaWFubmVzcyB0byB0aGUgdGFyZ2V0LgorICB2b2lkIHNldEJlZm9yZUJ5dGVzKHVpbnQ2NF90IFBvcywgdWludDhfdCBTaXplKSB7CisgICAgYXNzZXJ0KFBvcyA+PSA4ICogbWluQmVmb3JlQnl0ZXMoKSk7CisgICAgaWYgKElzQmlnRW5kaWFuKQorICAgICAgVE0tPkJpdHMtPkJlZm9yZS5zZXRMRShQb3MgLSA4ICogbWluQmVmb3JlQnl0ZXMoKSwgUmV0VmFsLCBTaXplKTsKKyAgICBlbHNlCisgICAgICBUTS0+Qml0cy0+QmVmb3JlLnNldEJFKFBvcyAtIDggKiBtaW5CZWZvcmVCeXRlcygpLCBSZXRWYWwsIFNpemUpOworICB9CisKKyAgLy8gU2V0IHRoZSBieXRlcyBhdCBwb3NpdGlvbiBQb3MgYWZ0ZXIgdGhlIGFkZHJlc3MgcG9pbnQgdG8gUmV0VmFsLgorICB2b2lkIHNldEFmdGVyQnl0ZXModWludDY0X3QgUG9zLCB1aW50OF90IFNpemUpIHsKKyAgICBhc3NlcnQoUG9zID49IDggKiBtaW5BZnRlckJ5dGVzKCkpOworICAgIGlmIChJc0JpZ0VuZGlhbikKKyAgICAgIFRNLT5CaXRzLT5BZnRlci5zZXRCRShQb3MgLSA4ICogbWluQWZ0ZXJCeXRlcygpLCBSZXRWYWwsIFNpemUpOworICAgIGVsc2UKKyAgICAgIFRNLT5CaXRzLT5BZnRlci5zZXRMRShQb3MgLSA4ICogbWluQWZ0ZXJCeXRlcygpLCBSZXRWYWwsIFNpemUpOworICB9Cit9OworCisvLyBGaW5kIHRoZSBtaW5pbXVtIG9mZnNldCB0aGF0IHdlIG1heSBzdG9yZSBhIHZhbHVlIG9mIHNpemUgU2l6ZSBiaXRzIGF0LiBJZgorLy8gSXNBZnRlciBpcyBzZXQsIGxvb2sgZm9yIGFuIG9mZnNldCBiZWZvcmUgdGhlIG9iamVjdCwgb3RoZXJ3aXNlIGxvb2sgZm9yIGFuCisvLyBvZmZzZXQgYWZ0ZXIgdGhlIG9iamVjdC4KK3VpbnQ2NF90IGZpbmRMb3dlc3RPZmZzZXQoQXJyYXlSZWY8VmlydHVhbENhbGxUYXJnZXQ+IFRhcmdldHMsIGJvb2wgSXNBZnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgU2l6ZSk7CisKKy8vIFNldCB0aGUgc3RvcmVkIHZhbHVlIGluIGVhY2ggb2YgVGFyZ2V0cyB0byBWaXJ0dWFsQ2FsbFRhcmdldDo6UmV0VmFsIGF0IHRoZQorLy8gZ2l2ZW4gYWxsb2NhdGlvbiBvZmZzZXQgYmVmb3JlIHRoZSB2dGFibGUgYWRkcmVzcy4gU3RvcmVzIHRoZSBjb21wdXRlZAorLy8gYnl0ZS9iaXQgb2Zmc2V0IHRvIE9mZnNldEJ5dGUvT2Zmc2V0Qml0Lgordm9pZCBzZXRCZWZvcmVSZXR1cm5WYWx1ZXMoTXV0YWJsZUFycmF5UmVmPFZpcnR1YWxDYWxsVGFyZ2V0PiBUYXJnZXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgQWxsb2NCZWZvcmUsIHVuc2lnbmVkIEJpdFdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAmT2Zmc2V0Qnl0ZSwgdWludDY0X3QgJk9mZnNldEJpdCk7CisKKy8vIFNldCB0aGUgc3RvcmVkIHZhbHVlIGluIGVhY2ggb2YgVGFyZ2V0cyB0byBWaXJ0dWFsQ2FsbFRhcmdldDo6UmV0VmFsIGF0IHRoZQorLy8gZ2l2ZW4gYWxsb2NhdGlvbiBvZmZzZXQgYWZ0ZXIgdGhlIHZ0YWJsZSBhZGRyZXNzLiBTdG9yZXMgdGhlIGNvbXB1dGVkCisvLyBieXRlL2JpdCBvZmZzZXQgdG8gT2Zmc2V0Qnl0ZS9PZmZzZXRCaXQuCit2b2lkIHNldEFmdGVyUmV0dXJuVmFsdWVzKE11dGFibGVBcnJheVJlZjxWaXJ0dWFsQ2FsbFRhcmdldD4gVGFyZ2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgQWxsb2NBZnRlciwgdW5zaWduZWQgQml0V2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgJk9mZnNldEJ5dGUsIHVpbnQ2NF90ICZPZmZzZXRCaXQpOworCit9IC8vIGVuZCBuYW1lc3BhY2Ugd2hvbGVwcm9ncmFtZGV2aXJ0CisKK3N0cnVjdCBXaG9sZVByb2dyYW1EZXZpcnRQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48V2hvbGVQcm9ncmFtRGV2aXJ0UGFzcz4geworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJik7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX0lQT19XSE9MRVBST0dSQU1ERVZJUlRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSW5zdENvbWJpbmUvSW5zdENvbWJpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YmQyMmRjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lLmgKQEAgLTAsMCArMSw2MSBAQAorLy89PT0tIEluc3RDb21iaW5lLmggLSBJbnN0Q29tYmluZSBwYXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vCisvLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSBwcmltYXJ5IGludGVyZmFjZSB0byB0aGUgaW5zdGNvbWJpbmUgcGFzcy4gVGhpcyBwYXNzCisvLy8gaXMgc3VpdGFibGUgZm9yIHVzZSBpbiB0aGUgbmV3IHBhc3MgbWFuYWdlci4gRm9yIGEgcGFzcyB0aGF0IHdvcmtzIHdpdGggdGhlCisvLy8gbGVnYWN5IHBhc3MgbWFuYWdlciwgcGxlYXNlIGxvb2sgZm9yIFxjIGNyZWF0ZUluc3RydWN0aW9uQ29tYmluaW5nUGFzcygpIGluCisvLy8gU2NhbGFyLmguCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0lOU1RDT01CSU5FX0lOU1RDT01CSU5FX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lOU1RDT01CSU5FX0lOU1RDT01CSU5FX0gKKworI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL0luc3RDb21iaW5lL0luc3RDb21iaW5lV29ya2xpc3QuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBJbnN0Q29tYmluZVBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxJbnN0Q29tYmluZVBhc3M+IHsKKyAgSW5zdENvbWJpbmVXb3JrbGlzdCBXb3JrbGlzdDsKKyAgYm9vbCBFeHBlbnNpdmVDb21iaW5lczsKKworcHVibGljOgorICBzdGF0aWMgU3RyaW5nUmVmIG5hbWUoKSB7IHJldHVybiAiSW5zdENvbWJpbmVQYXNzIjsgfQorCisgIGV4cGxpY2l0IEluc3RDb21iaW5lUGFzcyhib29sIEV4cGVuc2l2ZUNvbWJpbmVzID0gdHJ1ZSkKKyAgICAgIDogRXhwZW5zaXZlQ29tYmluZXMoRXhwZW5zaXZlQ29tYmluZXMpIHt9CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworLy8vIFxicmllZiBUaGUgbGVnYWN5IHBhc3MgbWFuYWdlcidzIGluc3Rjb21iaW5lIHBhc3MuCisvLy8KKy8vLyBUaGlzIGlzIGEgYmFzaWMgd2hvbGUtZnVuY3Rpb24gd3JhcHBlciBhcm91bmQgdGhlIGluc3Rjb21iaW5lIHV0aWxpdHkuIEl0CisvLy8gd2lsbCB0cnkgdG8gY29tYmluZSBhbGwgaW5zdHJ1Y3Rpb25zIGluIHRoZSBmdW5jdGlvbi4KK2NsYXNzIEluc3RydWN0aW9uQ29tYmluaW5nUGFzcyA6IHB1YmxpYyBGdW5jdGlvblBhc3MgeworICBJbnN0Q29tYmluZVdvcmtsaXN0IFdvcmtsaXN0OworICBjb25zdCBib29sIEV4cGVuc2l2ZUNvbWJpbmVzOworCitwdWJsaWM6CisgIHN0YXRpYyBjaGFyIElEOyAvLyBQYXNzIGlkZW50aWZpY2F0aW9uLCByZXBsYWNlbWVudCBmb3IgdHlwZWlkCisKKyAgSW5zdHJ1Y3Rpb25Db21iaW5pbmdQYXNzKGJvb2wgRXhwZW5zaXZlQ29tYmluZXMgPSB0cnVlKQorICAgICAgOiBGdW5jdGlvblBhc3MoSUQpLCBFeHBlbnNpdmVDb21iaW5lcyhFeHBlbnNpdmVDb21iaW5lcykgeworICAgIGluaXRpYWxpemVJbnN0cnVjdGlvbkNvbWJpbmluZ1Bhc3NQYXNzKCpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpKTsKKyAgfQorCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRikgb3ZlcnJpZGU7Cit9OworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JbnN0Q29tYmluZS9JbnN0Q29tYmluZVdvcmtsaXN0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSW5zdENvbWJpbmUvSW5zdENvbWJpbmVXb3JrbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3MWU4OTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSW5zdENvbWJpbmUvSW5zdENvbWJpbmVXb3JrbGlzdC5oCkBAIC0wLDAgKzEsMTA5IEBACisvLz09PS0gSW5zdENvbWJpbmVXb3JrbGlzdC5oIC0gV29ya2xpc3QgZm9yIEluc3RDb21iaW5lIHBhc3MgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19JTlNUQ09NQklORV9JTlNUQ09NQklORVdPUktMSVNUX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0lOU1RDT01CSU5FX0lOU1RDT01CSU5FV09SS0xJU1RfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJ1Y3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRGVidWcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKworI2RlZmluZSBERUJVR19UWVBFICJpbnN0Y29tYmluZSIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gSW5zdENvbWJpbmVXb3JrbGlzdCAtIFRoaXMgaXMgdGhlIHdvcmtsaXN0IG1hbmFnZW1lbnQgbG9naWMgZm9yCisvLy8gSW5zdENvbWJpbmUuCitjbGFzcyBJbnN0Q29tYmluZVdvcmtsaXN0IHsKKyAgU21hbGxWZWN0b3I8SW5zdHJ1Y3Rpb24qLCAyNTY+IFdvcmtsaXN0OworICBEZW5zZU1hcDxJbnN0cnVjdGlvbiosIHVuc2lnbmVkPiBXb3JrbGlzdE1hcDsKKworcHVibGljOgorICBJbnN0Q29tYmluZVdvcmtsaXN0KCkgPSBkZWZhdWx0OworCisgIEluc3RDb21iaW5lV29ya2xpc3QoSW5zdENvbWJpbmVXb3JrbGlzdCAmJikgPSBkZWZhdWx0OworICBJbnN0Q29tYmluZVdvcmtsaXN0ICZvcGVyYXRvcj0oSW5zdENvbWJpbmVXb3JrbGlzdCAmJikgPSBkZWZhdWx0OworCisgIGJvb2wgaXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuIFdvcmtsaXN0LmVtcHR5KCk7IH0KKworICAvLy8gQWRkIC0gQWRkIHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gdG8gdGhlIHdvcmtsaXN0IGlmIGl0IGlzbid0IGFscmVhZHkKKyAgLy8vIGluIGl0LgorICB2b2lkIEFkZChJbnN0cnVjdGlvbiAqSSkgeworICAgIGlmIChXb3JrbGlzdE1hcC5pbnNlcnQoc3RkOjptYWtlX3BhaXIoSSwgV29ya2xpc3Quc2l6ZSgpKSkuc2Vjb25kKSB7CisgICAgICBERUJVRyhkYmdzKCkgPDwgIklDOiBBREQ6ICIgPDwgKkkgPDwgJ1xuJyk7CisgICAgICBXb3JrbGlzdC5wdXNoX2JhY2soSSk7CisgICAgfQorICB9CisKKyAgdm9pZCBBZGRWYWx1ZShWYWx1ZSAqVikgeworICAgIGlmIChJbnN0cnVjdGlvbiAqSSA9IGR5bl9jYXN0PEluc3RydWN0aW9uPihWKSkKKyAgICAgIEFkZChJKTsKKyAgfQorCisgIC8vLyBBZGRJbml0aWFsR3JvdXAgLSBBZGQgdGhlIHNwZWNpZmllZCBiYXRjaCBvZiBzdHVmZiBpbiByZXZlcnNlIG9yZGVyLgorICAvLy8gd2hpY2ggc2hvdWxkIG9ubHkgYmUgZG9uZSB3aGVuIHRoZSB3b3JrbGlzdCBpcyBlbXB0eSBhbmQgd2hlbiB0aGUgZ3JvdXAKKyAgLy8vIGhhcyBubyBkdXBsaWNhdGVzLgorICB2b2lkIEFkZEluaXRpYWxHcm91cChBcnJheVJlZjxJbnN0cnVjdGlvbiAqPiBMaXN0KSB7CisgICAgYXNzZXJ0KFdvcmtsaXN0LmVtcHR5KCkgJiYgIldvcmtsaXN0IG11c3QgYmUgZW1wdHkgdG8gYWRkIGluaXRpYWwgZ3JvdXAiKTsKKyAgICBXb3JrbGlzdC5yZXNlcnZlKExpc3Quc2l6ZSgpKzE2KTsKKyAgICBXb3JrbGlzdE1hcC5yZXNlcnZlKExpc3Quc2l6ZSgpKTsKKyAgICBERUJVRyhkYmdzKCkgPDwgIklDOiBBRERJTkc6ICIgPDwgTGlzdC5zaXplKCkgPDwgIiBpbnN0cnMgdG8gd29ya2xpc3RcbiIpOworICAgIHVuc2lnbmVkIElkeCA9IDA7CisgICAgZm9yIChJbnN0cnVjdGlvbiAqSSA6IHJldmVyc2UoTGlzdCkpIHsKKyAgICAgIFdvcmtsaXN0TWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihJLCBJZHgrKykpOworICAgICAgV29ya2xpc3QucHVzaF9iYWNrKEkpOworICAgIH0KKyAgfQorCisgIC8vIFJlbW92ZSAtIHJlbW92ZSBJIGZyb20gdGhlIHdvcmtsaXN0IGlmIGl0IGV4aXN0cy4KKyAgdm9pZCBSZW1vdmUoSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICBEZW5zZU1hcDxJbnN0cnVjdGlvbiosIHVuc2lnbmVkPjo6aXRlcmF0b3IgSXQgPSBXb3JrbGlzdE1hcC5maW5kKEkpOworICAgIGlmIChJdCA9PSBXb3JrbGlzdE1hcC5lbmQoKSkgcmV0dXJuOyAvLyBOb3QgaW4gd29ya2xpc3QuCisKKyAgICAvLyBEb24ndCBib3RoZXIgbW92aW5nIGV2ZXJ5dGhpbmcgZG93biwganVzdCBudWxsIG91dCB0aGUgc2xvdC4KKyAgICBXb3JrbGlzdFtJdC0+c2Vjb25kXSA9IG51bGxwdHI7CisKKyAgICBXb3JrbGlzdE1hcC5lcmFzZShJdCk7CisgIH0KKworICBJbnN0cnVjdGlvbiAqUmVtb3ZlT25lKCkgeworICAgIEluc3RydWN0aW9uICpJID0gV29ya2xpc3QucG9wX2JhY2tfdmFsKCk7CisgICAgV29ya2xpc3RNYXAuZXJhc2UoSSk7CisgICAgcmV0dXJuIEk7CisgIH0KKworICAvLy8gQWRkVXNlcnNUb1dvcmtMaXN0IC0gV2hlbiBhbiBpbnN0cnVjdGlvbiBpcyBzaW1wbGlmaWVkLCBhZGQgYWxsIHVzZXJzIG9mCisgIC8vLyB0aGUgaW5zdHJ1Y3Rpb24gdG8gdGhlIHdvcmsgbGlzdHMgYmVjYXVzZSB0aGV5IG1pZ2h0IGdldCBtb3JlIHNpbXBsaWZpZWQKKyAgLy8vIG5vdy4KKyAgLy8vCisgIHZvaWQgQWRkVXNlcnNUb1dvcmtMaXN0KEluc3RydWN0aW9uICZJKSB7CisgICAgZm9yIChVc2VyICpVIDogSS51c2VycygpKQorICAgICAgQWRkKGNhc3Q8SW5zdHJ1Y3Rpb24+KFUpKTsKKyAgfQorCisKKyAgLy8vIFphcCAtIGNoZWNrIHRoYXQgdGhlIHdvcmtsaXN0IGlzIGVtcHR5IGFuZCBudWtlIHRoZSBiYWNraW5nIHN0b3JlIGZvcgorICAvLy8gdGhlIG1hcCBpZiBpdCBpcyBsYXJnZS4KKyAgdm9pZCBaYXAoKSB7CisgICAgYXNzZXJ0KFdvcmtsaXN0TWFwLmVtcHR5KCkgJiYgIldvcmtsaXN0IGVtcHR5LCBidXQgbWFwIG5vdD8iKTsKKworICAgIC8vIERvIGFuIGV4cGxpY2l0IGNsZWFyLCB0aGlzIHNocmlua3MgdGhlIG1hcCBpZiBuZWVkZWQuCisgICAgV29ya2xpc3RNYXAuY2xlYXIoKTsKKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0uCisKKyN1bmRlZiBERUJVR19UWVBFCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZTEzZjEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uLmgKQEAgLTAsMCArMSwyMTEgQEAKKy8vPT09LSBUcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi5oIC0gSW5zdHJ1bWVudGF0aW9uIHBhc3NlcyAtLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgY29uc3RydWN0b3IgZnVuY3Rpb25zIGZvciBpbnN0cnVtZW50YXRpb24gcGFzc2VzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0lOU1RSVU1FTlRBVElPTl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JTlNUUlVNRU5UQVRJT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxjc3RkaW50PgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uUGFzczsKK2NsYXNzIE1vZHVsZVBhc3M7CitjbGFzcyBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyOworCisvLy8gSW5zdHJ1bWVudGF0aW9uIHBhc3NlcyBvZnRlbiBpbnNlcnQgY29uZGl0aW9uYWwgY2hlY2tzIGludG8gZW50cnkgYmxvY2tzLgorLy8vIENhbGwgdGhpcyBmdW5jdGlvbiBiZWZvcmUgc3BsaXR0aW5nIHRoZSBlbnRyeSBibG9jayB0byBtb3ZlIGluc3RydWN0aW9ucworLy8vIHRoYXQgbXVzdCByZW1haW4gaW4gdGhlIGVudHJ5IGJsb2NrIHVwIGJlZm9yZSB0aGUgc3BsaXQgcG9pbnQuIFN0YXRpYworLy8vIGFsbG9jYXMgYW5kIGxsdm0ubG9jYWxlc2NhcGUgY2FsbHMsIGZvciBleGFtcGxlLCBtdXN0IHJlbWFpbiBpbiB0aGUgZW50cnkKKy8vLyBibG9jay4KK0Jhc2ljQmxvY2s6Oml0ZXJhdG9yIFByZXBhcmVUb1NwbGl0RW50cnlCbG9jayhCYXNpY0Jsb2NrICZCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrOjppdGVyYXRvciBJUCk7CisKKy8vIEluc2VydCBHQ09WIHByb2ZpbGluZyBpbnN0cnVtZW50YXRpb24KK3N0cnVjdCBHQ09WT3B0aW9ucyB7CisgIHN0YXRpYyBHQ09WT3B0aW9ucyBnZXREZWZhdWx0KCk7CisKKyAgLy8gU3BlY2lmeSB3aGV0aGVyIHRvIGVtaXQgLmdjbm8gZmlsZXMuCisgIGJvb2wgRW1pdE5vdGVzOworCisgIC8vIFNwZWNpZnkgd2hldGhlciB0byBtb2RpZnkgdGhlIHByb2dyYW0gdG8gZW1pdCAuZ2NkYSBmaWxlcyB3aGVuIHJ1bi4KKyAgYm9vbCBFbWl0RGF0YTsKKworICAvLyBBIGZvdXItYnl0ZSB2ZXJzaW9uIHN0cmluZy4gVGhlIG1lYW5pbmcgb2YgYSB2ZXJzaW9uIHN0cmluZyBpcyBkZXNjcmliZWQgaW4KKyAgLy8gZ2NjJ3MgZ2Nvdi1pby5oCisgIGNoYXIgVmVyc2lvbls0XTsKKworICAvLyBFbWl0IGEgImNmZyBjaGVja3N1bSIgdGhhdCBmb2xsb3dzIHRoZSAibGluZSBudW1iZXIgY2hlY2tzdW0iIG9mIGEKKyAgLy8gZnVuY3Rpb24uIFRoaXMgYWZmZWN0cyBib3RoIC5nY25vIGFuZCAuZ2NkYSBmaWxlcy4KKyAgYm9vbCBVc2VDZmdDaGVja3N1bTsKKworICAvLyBBZGQgdGhlICdub3JlZHpvbmUnIGF0dHJpYnV0ZSB0byBhZGRlZCBydW50aW1lIGxpYnJhcnkgY2FsbHMuCisgIGJvb2wgTm9SZWRab25lOworCisgIC8vIEVtaXQgdGhlIG5hbWUgb2YgdGhlIGZ1bmN0aW9uIGluIHRoZSAuZ2NkYSBmaWxlcy4gVGhpcyBpcyByZWR1bmRhbnQsIGFzCisgIC8vIHRoZSBmdW5jdGlvbiBpZGVudGlmaWVyIGNhbiBiZSB1c2VkIHRvIGZpbmQgdGhlIG5hbWUgZnJvbSB0aGUgLmdjbm8gZmlsZS4KKyAgYm9vbCBGdW5jdGlvbk5hbWVzSW5EYXRhOworCisgIC8vIEVtaXQgdGhlIGV4aXQgYmxvY2sgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHN0YXJ0IGJsb2NrLCByYXRoZXIgdGhhbiBhZnRlcgorICAvLyBhbGwgb2YgdGhlIGZ1bmN0aW9uIGJvZHkncyBibG9ja3MuCisgIGJvb2wgRXhpdEJsb2NrQmVmb3JlQm9keTsKK307CisKK01vZHVsZVBhc3MgKmNyZWF0ZUdDT1ZQcm9maWxlclBhc3MoY29uc3QgR0NPVk9wdGlvbnMgJk9wdGlvbnMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHQ09WT3B0aW9uczo6Z2V0RGVmYXVsdCgpKTsKKworLy8gUEdPIEluc3RydW1lbnRpb24KK01vZHVsZVBhc3MgKmNyZWF0ZVBHT0luc3RydW1lbnRhdGlvbkdlbkxlZ2FjeVBhc3MoKTsKK01vZHVsZVBhc3MgKgorY3JlYXRlUEdPSW5zdHJ1bWVudGF0aW9uVXNlTGVnYWN5UGFzcyhTdHJpbmdSZWYgRmlsZW5hbWUgPSBTdHJpbmdSZWYoIiIpKTsKK01vZHVsZVBhc3MgKmNyZWF0ZVBHT0luZGlyZWN0Q2FsbFByb21vdGlvbkxlZ2FjeVBhc3MoYm9vbCBJbkxUTyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFNhbXBsZVBHTyA9IGZhbHNlKTsKK0Z1bmN0aW9uUGFzcyAqY3JlYXRlUEdPTWVtT1BTaXplT3B0TGVnYWN5UGFzcygpOworCisvLyBUaGUgcGdvLXNwZWNpZmljIGluZGlyZWN0IGNhbGwgcHJvbW90aW9uIGZ1bmN0aW9uIGRlY2xhcmVkIGJlbG93IGlzIHVzZWQgYnkKKy8vIHRoZSBwZ28tZHJpdmVuIGluZGlyZWN0IGNhbGwgcHJvbW90aW9uIGFuZCBzYW1wbGUgcHJvZmlsZSBwYXNzZXMuIEl0J3MgYQorLy8gd3JhcHBlciBhcm91bmQgbGx2bTo6cHJvbW90ZUNhbGwsIGV0IGFsLiB0aGF0IGFkZGl0aW9uYWxseSBjb21wdXRlcyAhcHJvZgorLy8gbWV0YWRhdGEuIFdlIHBsYWNlIGl0IGluIGEgcGdvIG5hbWVzcGFjZSBzbyBpdCdzIG5vdCBjb25mdXNlZCB3aXRoIHRoZQorLy8gZ2VuZXJpYyB1dGlsaXRpZXMuCituYW1lc3BhY2UgcGdvIHsKKworLy8gSGVscGVyIGZ1bmN0aW9uIHRoYXQgdHJhbnNmb3JtcyBJbnN0IChlaXRoZXIgYW4gaW5kaXJlY3QtY2FsbCBpbnN0cnVjdGlvbiwgb3IKKy8vIGFuIGludm9rZSBpbnN0cnVjdGlvbiAsIHRvIGEgY29uZGl0aW9uYWwgY2FsbCB0byBGLiBUaGlzIGlzIGxpa2U6CisvLyAgICAgaWYgKEluc3QuQ2FsbGVkVmFsdWUgPT0gRikKKy8vICAgICAgICBGKC4uLik7CisvLyAgICAgZWxzZQorLy8gICAgICAgIEluc3QoLi4uKTsKKy8vICAgICBlbmQKKy8vIFRvdGFsQ291bnQgaXMgdGhlIHByb2ZpbGUgY291bnQgdmFsdWUgdGhhdCB0aGUgaW5zdHJ1Y3Rpb24gZXhlY3V0ZXMuCisvLyBDb3VudCBpcyB0aGUgcHJvZmlsZSBjb3VudCB2YWx1ZSB0aGF0IEYgaXMgdGhlIHRhcmdldCBmdW5jdGlvbi4KKy8vIFRoZXNlIHR3byB2YWx1ZXMgYXJlIHVzZWQgdG8gdXBkYXRlIHRoZSBicmFuY2ggd2VpZ2h0LgorLy8gSWYgXHAgQXR0YWNoUHJvZlRvRGlyZWN0Q2FsbCBpcyB0cnVlLCBhIHByb2YgbWV0YWRhdGEgaXMgYXR0YWNoZWQgdG8gdGhlCisvLyBuZXcgZGlyZWN0IGNhbGwgdG8gY29udGFpbiBccCBDb3VudC4KKy8vIFJldHVybnMgdGhlIHByb21vdGVkIGRpcmVjdCBjYWxsIGluc3RydWN0aW9uLgorSW5zdHJ1Y3Rpb24gKnByb21vdGVJbmRpcmVjdENhbGwoSW5zdHJ1Y3Rpb24gKkluc3QsIEZ1bmN0aW9uICpGLCB1aW50NjRfdCBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IFRvdGFsQ291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIEF0dGFjaFByb2ZUb0RpcmVjdENhbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyICpPUkUpOworfSAvLyBuYW1lc3BhY2UgcGdvCisKKy8vLyBPcHRpb25zIGZvciB0aGUgZnJvbnRlbmQgaW5zdHJ1bWVudGF0aW9uIGJhc2VkIHByb2ZpbGluZyBwYXNzLgorc3RydWN0IEluc3RyUHJvZk9wdGlvbnMgeworICAvLyBBZGQgdGhlICdub3JlZHpvbmUnIGF0dHJpYnV0ZSB0byBhZGRlZCBydW50aW1lIGxpYnJhcnkgY2FsbHMuCisgIGJvb2wgTm9SZWRab25lID0gZmFsc2U7CisKKyAgLy8gRG8gY291bnRlciByZWdpc3RlciBwcm9tb3Rpb24KKyAgYm9vbCBEb0NvdW50ZXJQcm9tb3Rpb24gPSBmYWxzZTsKKworICAvLyBOYW1lIG9mIHRoZSBwcm9maWxlIGZpbGUgdG8gdXNlIGFzIG91dHB1dAorICBzdGQ6OnN0cmluZyBJbnN0clByb2ZpbGVPdXRwdXQ7CisKKyAgSW5zdHJQcm9mT3B0aW9ucygpID0gZGVmYXVsdDsKK307CisKKy8vLyBJbnNlcnQgZnJvbnRlbmQgaW5zdHJ1bWVudGF0aW9uIGJhc2VkIHByb2ZpbGluZy4KK01vZHVsZVBhc3MgKmNyZWF0ZUluc3RyUHJvZmlsaW5nTGVnYWN5UGFzcygKKyAgICBjb25zdCBJbnN0clByb2ZPcHRpb25zICZPcHRpb25zID0gSW5zdHJQcm9mT3B0aW9ucygpKTsKKworLy8gSW5zZXJ0IEFkZHJlc3NTYW5pdGl6ZXIgKGFkZHJlc3Mgc2FuaXR5IGNoZWNraW5nKSBpbnN0cnVtZW50YXRpb24KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlQWRkcmVzc1Nhbml0aXplckZ1bmN0aW9uUGFzcyhib29sIENvbXBpbGVLZXJuZWwgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFJlY292ZXIgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVzZUFmdGVyU2NvcGUgPSBmYWxzZSk7CitNb2R1bGVQYXNzICpjcmVhdGVBZGRyZXNzU2FuaXRpemVyTW9kdWxlUGFzcyhib29sIENvbXBpbGVLZXJuZWwgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVjb3ZlciA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVc2VHbG9iYWxzR0MgPSB0cnVlKTsKKworLy8gSW5zZXJ0IE1lbW9yeVNhbml0aXplciBpbnN0cnVtZW50YXRpb24gKGRldGVjdGlvbiBvZiB1bmluaXRpYWxpemVkIHJlYWRzKQorRnVuY3Rpb25QYXNzICpjcmVhdGVNZW1vcnlTYW5pdGl6ZXJQYXNzKGludCBUcmFja09yaWdpbnMgPSAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgUmVjb3ZlciA9IGZhbHNlKTsKKworRnVuY3Rpb25QYXNzICpjcmVhdGVIV0FkZHJlc3NTYW5pdGl6ZXJQYXNzKGJvb2wgUmVjb3ZlciA9IGZhbHNlKTsKKworLy8gSW5zZXJ0IFRocmVhZFNhbml0aXplciAocmFjZSBkZXRlY3Rpb24pIGluc3RydW1lbnRhdGlvbgorRnVuY3Rpb25QYXNzICpjcmVhdGVUaHJlYWRTYW5pdGl6ZXJQYXNzKCk7CisKKy8vIEluc2VydCBEYXRhRmxvd1Nhbml0aXplciAoZHluYW1pYyBkYXRhIGZsb3cgYW5hbHlzaXMpIGluc3RydW1lbnRhdGlvbgorTW9kdWxlUGFzcyAqY3JlYXRlRGF0YUZsb3dTYW5pdGl6ZXJQYXNzKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiAmQUJJTGlzdEZpbGVzID0gc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KCksCisgICAgdm9pZCAqKCpnZXRBcmdUTFMpKCkgPSBudWxscHRyLCB2b2lkICooKmdldFJldFZhbFRMUykoKSA9IG51bGxwdHIpOworCisvLyBPcHRpb25zIGZvciBFZmZpY2llbmN5U2FuaXRpemVyIHN1Yi10b29scy4KK3N0cnVjdCBFZmZpY2llbmN5U2FuaXRpemVyT3B0aW9ucyB7CisgIGVudW0gVHlwZSB7CisgICAgRVNBTl9Ob25lID0gMCwKKyAgICBFU0FOX0NhY2hlRnJhZywKKyAgICBFU0FOX1dvcmtpbmdTZXQsCisgIH0gVG9vbFR5cGUgPSBFU0FOX05vbmU7CisKKyAgRWZmaWNpZW5jeVNhbml0aXplck9wdGlvbnMoKSA9IGRlZmF1bHQ7Cit9OworCisvLyBJbnNlcnQgRWZmaWNpZW5jeVNhbml0aXplciBpbnN0cnVtZW50YXRpb24uCitNb2R1bGVQYXNzICpjcmVhdGVFZmZpY2llbmN5U2FuaXRpemVyUGFzcygKKyAgICBjb25zdCBFZmZpY2llbmN5U2FuaXRpemVyT3B0aW9ucyAmT3B0aW9ucyA9IEVmZmljaWVuY3lTYW5pdGl6ZXJPcHRpb25zKCkpOworCisvLyBPcHRpb25zIGZvciBzYW5pdGl6ZXIgY292ZXJhZ2UgaW5zdHJ1bWVudGF0aW9uLgorc3RydWN0IFNhbml0aXplckNvdmVyYWdlT3B0aW9ucyB7CisgIGVudW0gVHlwZSB7CisgICAgU0NLX05vbmUgPSAwLAorICAgIFNDS19GdW5jdGlvbiwKKyAgICBTQ0tfQkIsCisgICAgU0NLX0VkZ2UKKyAgfSBDb3ZlcmFnZVR5cGUgPSBTQ0tfTm9uZTsKKyAgYm9vbCBJbmRpcmVjdENhbGxzID0gZmFsc2U7CisgIGJvb2wgVHJhY2VCQiA9IGZhbHNlOworICBib29sIFRyYWNlQ21wID0gZmFsc2U7CisgIGJvb2wgVHJhY2VEaXYgPSBmYWxzZTsKKyAgYm9vbCBUcmFjZUdlcCA9IGZhbHNlOworICBib29sIFVzZThiaXRDb3VudGVycyA9IGZhbHNlOworICBib29sIFRyYWNlUEMgPSBmYWxzZTsKKyAgYm9vbCBUcmFjZVBDR3VhcmQgPSBmYWxzZTsKKyAgYm9vbCBJbmxpbmU4Yml0Q291bnRlcnMgPSBmYWxzZTsKKyAgYm9vbCBQQ1RhYmxlID0gZmFsc2U7CisgIGJvb2wgTm9QcnVuZSA9IGZhbHNlOworICBib29sIFN0YWNrRGVwdGggPSBmYWxzZTsKKworICBTYW5pdGl6ZXJDb3ZlcmFnZU9wdGlvbnMoKSA9IGRlZmF1bHQ7Cit9OworCisvLyBJbnNlcnQgU2FuaXRpemVyQ292ZXJhZ2UgaW5zdHJ1bWVudGF0aW9uLgorTW9kdWxlUGFzcyAqY3JlYXRlU2FuaXRpemVyQ292ZXJhZ2VNb2R1bGVQYXNzKAorICAgIGNvbnN0IFNhbml0aXplckNvdmVyYWdlT3B0aW9ucyAmT3B0aW9ucyA9IFNhbml0aXplckNvdmVyYWdlT3B0aW9ucygpKTsKKworLy8vIFxicmllZiBDYWxjdWxhdGUgd2hhdCB0byBkaXZpZGUgYnkgdG8gc2NhbGUgY291bnRzLgorLy8vCisvLy8gR2l2ZW4gdGhlIG1heGltdW0gY291bnQsIGNhbGN1bGF0ZSBhIGRpdmlzb3IgdGhhdCB3aWxsIHNjYWxlIGFsbCB0aGUKKy8vLyB3ZWlnaHRzIHRvIHN0cmljdGx5IGxlc3MgdGhhbiBzdGQ6Om51bWVyaWNfbGltaXRzPHVpbnQzMl90Pjo6bWF4KCkuCitzdGF0aWMgaW5saW5lIHVpbnQ2NF90IGNhbGN1bGF0ZUNvdW50U2NhbGUodWludDY0X3QgTWF4Q291bnQpIHsKKyAgcmV0dXJuIE1heENvdW50IDwgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpCisgICAgICAgICAgICAgPyAxCisgICAgICAgICAgICAgOiBNYXhDb3VudCAvIHN0ZDo6bnVtZXJpY19saW1pdHM8dWludDMyX3Q+OjptYXgoKSArIDE7Cit9CisKKy8vLyBcYnJpZWYgU2NhbGUgYW4gaW5kaXZpZHVhbCBicmFuY2ggY291bnQuCisvLy8KKy8vLyBTY2FsZSBhIDY0LWJpdCB3ZWlnaHQgZG93biB0byAzMi1iaXRzIHVzaW5nIFxjIFNjYWxlLgorLy8vCitzdGF0aWMgaW5saW5lIHVpbnQzMl90IHNjYWxlQnJhbmNoQ291bnQodWludDY0X3QgQ291bnQsIHVpbnQ2NF90IFNjYWxlKSB7CisgIHVpbnQ2NF90IFNjYWxlZCA9IENvdW50IC8gU2NhbGU7CisgIGFzc2VydChTY2FsZWQgPD0gc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzJfdD46Om1heCgpICYmICJvdmVyZmxvdyAzMi1iaXRzIik7CisgIHJldHVybiBTY2FsZWQ7Cit9CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfSU5TVFJVTUVOVEFUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24vQm91bmRzQ2hlY2tpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24vQm91bmRzQ2hlY2tpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDRmNjJjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9Cb3VuZHNDaGVja2luZy5oCkBAIC0wLDAgKzEsMjkgQEAKKy8vPT09LSBCb3VuZHNDaGVja2luZy5oIC0gQm91bmRzIGNoZWNraW5nIGluc3RydW1lbnRhdGlvbiAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX0lOU1RSVU1FTlRBVElPTl9CT1VORFNDSEVDS0lOR19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JTlNUUlVNRU5UQVRJT05fQk9VTkRTQ0hFQ0tJTkdfSAorCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBIHBhc3MgdG8gaW5zdHJ1bWVudCBjb2RlIGFuZCBwZXJmb3JtIHJ1bi10aW1lIGJvdW5kcyBjaGVja2luZyBvbiBsb2FkcywKKy8vLyBzdG9yZXMsIGFuZCBvdGhlciBtZW1vcnkgaW50cmluc2ljcy4KK3N0cnVjdCBCb3VuZHNDaGVja2luZ1Bhc3MgOiBQYXNzSW5mb01peGluPEJvdW5kc0NoZWNraW5nUGFzcz4geworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisKKy8vLyBMZWdhY3kgcGFzcyBjcmVhdGlvbiBmdW5jdGlvbiBmb3IgdGhlIGFib3ZlIHBhc3MuCitGdW5jdGlvblBhc3MgKmNyZWF0ZUJvdW5kc0NoZWNraW5nTGVnYWN5UGFzcygpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX0lOU1RSVU1FTlRBVElPTl9CT1VORFNDSEVDS0lOR19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uL0dDT1ZQcm9maWxlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9HQ09WUHJvZmlsZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDU1ZmJlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9HQ09WUHJvZmlsZXIuaApAQCAtMCwwICsxLDMxIEBACisvLz09PS0gVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24vR0NPVlByb2ZpbGVyLmggLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgZm9yIHRoZSBHQ09WIHN0eWxlIHByb2ZpbGVyICBwYXNzLgorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfR0NPVlBST0ZJTEVSX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX0dDT1ZQUk9GSUxFUl9ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisvLy8gVGhlIGdjb3Ytc3R5bGUgaW5zdHJ1bWVudGF0aW9uIHBhc3MKK2NsYXNzIEdDT1ZQcm9maWxlclBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxHQ09WUHJvZmlsZXJQYXNzPiB7CitwdWJsaWM6CisgIEdDT1ZQcm9maWxlclBhc3MoY29uc3QgR0NPVk9wdGlvbnMgJk9wdGlvbnMgPSBHQ09WT3B0aW9uczo6Z2V0RGVmYXVsdCgpKSA6IEdDT1ZPcHRzKE9wdGlvbnMpIHsgfQorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oTW9kdWxlICZNLCBNb2R1bGVBbmFseXNpc01hbmFnZXIgJkFNKTsKKworcHJpdmF0ZToKKyAgR0NPVk9wdGlvbnMgR0NPVk9wdHM7Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uL0luc3RyUHJvZmlsaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uL0luc3RyUHJvZmlsaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTNmYjNkYgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24vSW5zdHJQcm9maWxpbmcuaApAQCAtMCwwICsxLDEyNSBAQAorLy89PT0tIFRyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uL0luc3RyUHJvZmlsaW5nLmggLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIGZvciBMTFZNJ3MgUEdPIEluc3RydW1lbnRhdGlvbiBsb3dlcmluZworLy8vIHBhc3MuCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19JTlNUUlBST0ZJTElOR19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19JTlNUUlBST0ZJTElOR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1Byb2ZpbGVEYXRhL0luc3RyUHJvZi5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24uaCIKKyNpbmNsdWRlIDxjc3RkZGVmPgorI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8Y3N0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87Cit1c2luZyBMb2FkU3RvcmVQYWlyID0gc3RkOjpwYWlyPEluc3RydWN0aW9uICosIEluc3RydWN0aW9uICo+OworCisvLy8gSW5zdHJ1bWVudGF0aW9uIGJhc2VkIHByb2ZpbGluZyBsb3dlcmluZyBwYXNzLiBUaGlzIHBhc3MgbG93ZXJzCisvLy8gdGhlIHByb2ZpbGUgaW5zdHJ1bWVudGVkIGNvZGUgZ2VuZXJhdGVkIGJ5IEZFIG9yIHRoZSBJUiBiYXNlZAorLy8vIGluc3RydW1lbnRhdGlvbiBwYXNzLgorY2xhc3MgSW5zdHJQcm9maWxpbmcgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxJbnN0clByb2ZpbGluZz4geworcHVibGljOgorICBJbnN0clByb2ZpbGluZygpID0gZGVmYXVsdDsKKyAgSW5zdHJQcm9maWxpbmcoY29uc3QgSW5zdHJQcm9mT3B0aW9ucyAmT3B0aW9ucykgOiBPcHRpb25zKE9wdGlvbnMpIHt9CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZBTSk7CisgIGJvb2wgcnVuKE1vZHVsZSAmTSwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gJlRMSSk7CisKK3ByaXZhdGU6CisgIEluc3RyUHJvZk9wdGlvbnMgT3B0aW9uczsKKyAgTW9kdWxlICpNOworICBUcmlwbGUgVFQ7CisgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEk7CisgIHN0cnVjdCBQZXJGdW5jdGlvblByb2ZpbGVEYXRhIHsKKyAgICB1aW50MzJfdCBOdW1WYWx1ZVNpdGVzW0lQVktfTGFzdCArIDFdOworICAgIEdsb2JhbFZhcmlhYmxlICpSZWdpb25Db3VudGVycyA9IG51bGxwdHI7CisgICAgR2xvYmFsVmFyaWFibGUgKkRhdGFWYXIgPSBudWxscHRyOworCisgICAgUGVyRnVuY3Rpb25Qcm9maWxlRGF0YSgpIHsKKyAgICAgIG1lbXNldChOdW1WYWx1ZVNpdGVzLCAwLCBzaXplb2YodWludDMyX3QpICogKElQVktfTGFzdCArIDEpKTsKKyAgICB9CisgIH07CisgIERlbnNlTWFwPEdsb2JhbFZhcmlhYmxlICosIFBlckZ1bmN0aW9uUHJvZmlsZURhdGE+IFByb2ZpbGVEYXRhTWFwOworICBzdGQ6OnZlY3RvcjxHbG9iYWxWYWx1ZSAqPiBVc2VkVmFyczsKKyAgc3RkOjp2ZWN0b3I8R2xvYmFsVmFyaWFibGUgKj4gUmVmZXJlbmNlZE5hbWVzOworICBHbG9iYWxWYXJpYWJsZSAqTmFtZXNWYXI7CisgIHNpemVfdCBOYW1lc1NpemU7CisKKyAgLy8gdmVjdG9yIG9mIGNvdW50ZXIgbG9hZC9zdG9yZSBwYWlycyB0byBiZSByZWdpc3RlciBwcm9tb3RlZC4KKyAgc3RkOjp2ZWN0b3I8TG9hZFN0b3JlUGFpcj4gUHJvbW90aW9uQ2FuZGlkYXRlczsKKworICAvLyBUaGUgc3RhcnQgdmFsdWUgb2YgcHJlY2lzZSB2YWx1ZSBwcm9maWxlIHJhbmdlIGZvciBtZW1vcnkgaW50cmluc2ljIHNpemVzLgorICBpbnQ2NF90IE1lbU9QU2l6ZVJhbmdlU3RhcnQ7CisgIC8vIFRoZSBlbmQgdmFsdWUgb2YgcHJlY2lzZSB2YWx1ZSBwcm9maWxlIHJhbmdlIGZvciBtZW1vcnkgaW50cmluc2ljIHNpemVzLgorICBpbnQ2NF90IE1lbU9QU2l6ZVJhbmdlTGFzdDsKKworICBpbnQ2NF90IFRvdGFsQ291bnRlcnNQcm9tb3RlZCA9IDA7CisKKyAgLy8vIExvd2VyIGluc3RydW1lbnRhdGlvbiBpbnRyaW5zaWNzIGluIHRoZSBmdW5jdGlvbi4gUmV0dXJucyB0cnVlIGlmIHRoZXJlCisgIC8vLyBhbnkgbG93ZXJpbmcuCisgIGJvb2wgbG93ZXJJbnRyaW5zaWNzKEZ1bmN0aW9uICpGKTsKKworICAvLy8gUmVnaXN0ZXItcHJvbW90ZSBjb3VudGVyIGxvYWRzIGFuZCBzdG9yZXMgaW4gbG9vcHMuCisgIHZvaWQgcHJvbW90ZUNvdW50ZXJMb2FkU3RvcmVzKEZ1bmN0aW9uICpGKTsKKworICAvLy8gUmV0dXJucyB0cnVlIGlmIHByb2ZpbGUgY291bnRlciB1cGRhdGUgcmVnaXN0ZXIgcHJvbW90aW9uIGlzIGVuYWJsZWQuCisgIGJvb2wgaXNDb3VudGVyUHJvbW90aW9uRW5hYmxlZCgpIGNvbnN0OworCisgIC8vLyBDb3VudCB0aGUgbnVtYmVyIG9mIGluc3RydW1lbnRlZCB2YWx1ZSBzaXRlcyBmb3IgdGhlIGZ1bmN0aW9uLgorICB2b2lkIGNvbXB1dGVOdW1WYWx1ZVNpdGVDb3VudHMoSW5zdHJQcm9mVmFsdWVQcm9maWxlSW5zdCAqSW5zKTsKKworICAvLy8gUmVwbGFjZSBpbnN0cnByb2ZfdmFsdWVfcHJvZmlsZSB3aXRoIGEgY2FsbCB0byBydW50aW1lIGxpYnJhcnkuCisgIHZvaWQgbG93ZXJWYWx1ZVByb2ZpbGVJbnN0KEluc3RyUHJvZlZhbHVlUHJvZmlsZUluc3QgKklucyk7CisKKyAgLy8vIFJlcGxhY2UgaW5zdHJwcm9mX2luY3JlbWVudCB3aXRoIGFuIGluY3JlbWVudCBvZiB0aGUgYXBwcm9wcmlhdGUgdmFsdWUuCisgIHZvaWQgbG93ZXJJbmNyZW1lbnQoSW5zdHJQcm9mSW5jcmVtZW50SW5zdCAqSW5jKTsKKworICAvLy8gRm9yY2UgZW1pdHRpbmcgb2YgbmFtZSB2YXJzIGZvciB1bnVzZWQgZnVuY3Rpb25zLgorICB2b2lkIGxvd2VyQ292ZXJhZ2VEYXRhKEdsb2JhbFZhcmlhYmxlICpDb3ZlcmFnZU5hbWVzVmFyKTsKKworICAvLy8gR2V0IHRoZSByZWdpb24gY291bnRlcnMgZm9yIGFuIGluY3JlbWVudCwgY3JlYXRpbmcgdGhlbSBpZiBuZWNlc3NhcnkuCisgIC8vLworICAvLy8gSWYgdGhlIGNvdW50ZXIgYXJyYXkgZG9lc24ndCB5ZXQgZXhpc3QsIHRoZSBwcm9maWxlIGRhdGEgdmFyaWFibGVzCisgIC8vLyByZWZlcnJpbmcgdG8gdGhlbSB3aWxsIGFsc28gYmUgY3JlYXRlZC4KKyAgR2xvYmFsVmFyaWFibGUgKmdldE9yQ3JlYXRlUmVnaW9uQ291bnRlcnMoSW5zdHJQcm9mSW5jcmVtZW50SW5zdCAqSW5jKTsKKworICAvLy8gRW1pdCB0aGUgc2VjdGlvbiB3aXRoIGNvbXByZXNzZWQgZnVuY3Rpb24gbmFtZXMuCisgIHZvaWQgZW1pdE5hbWVEYXRhKCk7CisKKyAgLy8vIEVtaXQgdmFsdWUgbm9kZXMgc2VjdGlvbiBmb3IgdmFsdWUgcHJvZmlsaW5nLgorICB2b2lkIGVtaXRWTm9kZXMoKTsKKworICAvLy8gRW1pdCBydW50aW1lIHJlZ2lzdHJhdGlvbiBmdW5jdGlvbnMgZm9yIGVhY2ggcHJvZmlsZSBkYXRhIHZhcmlhYmxlLgorICB2b2lkIGVtaXRSZWdpc3RyYXRpb24oKTsKKworICAvLy8gRW1pdCB0aGUgbmVjZXNzYXJ5IHBsdW1iaW5nIHRvIHB1bGwgaW4gdGhlIHJ1bnRpbWUgaW5pdGlhbGl6YXRpb24uCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgYSBjaGFuZ2Ugd2FzIG1hZGUuCisgIGJvb2wgZW1pdFJ1bnRpbWVIb29rKCk7CisKKyAgLy8vIEFkZCB1c2VzIG9mIG91ciBkYXRhIHZhcmlhYmxlcyBhbmQgcnVudGltZSBob29rLgorICB2b2lkIGVtaXRVc2VzKCk7CisKKyAgLy8vIENyZWF0ZSBhIHN0YXRpYyBpbml0aWFsaXplciBmb3Igb3VyIGRhdGEsIG9uIHBsYXRmb3JtcyB0aGF0IG5lZWQgaXQsCisgIC8vLyBhbmQgZm9yIGFueSBwcm9maWxlIG91dHB1dCBmaWxlIHRoYXQgd2FzIHNwZWNpZmllZC4KKyAgdm9pZCBlbWl0SW5pdGlhbGl6YXRpb24oKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfSU5TVFJQUk9GSUxJTkdfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL0luc3RydW1lbnRhdGlvbi9QR09JbnN0cnVtZW50YXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24vUEdPSW5zdHJ1bWVudGF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBiMzdjNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9JbnN0cnVtZW50YXRpb24vUEdPSW5zdHJ1bWVudGF0aW9uLmgKQEAgLTAsMCArMSw3NSBAQAorLy89PT0tIFRyYW5zZm9ybXMvSW5zdHJ1bWVudGF0aW9uL1BHT0luc3RydW1lbnRhdGlvbi5oIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIGludGVyZmFjZSBmb3IgSVIgYmFzZWQgaW5zdHJ1bWVudGF0aW9uIHBhc3NlcyAoCisvLy8gKHByb2ZpbGUtZ2VuLCBhbmQgcHJvZmlsZS11c2UpLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1BHT0lOU1RSVU1FTlRBVElPTl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19QR09JTlNUUlVNRU5UQVRJT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIE1vZHVsZTsKKworLy8vIFRoZSBpbnN0cnVtZW50YXRpb24gKHByb2ZpbGUtaW5zdHItZ2VuKSBwYXNzIGZvciBJUiBiYXNlZCBQR08uCitjbGFzcyBQR09JbnN0cnVtZW50YXRpb25HZW4gOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxQR09JbnN0cnVtZW50YXRpb25HZW4+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gVGhlIHByb2ZpbGUgYW5ub3RhdGlvbiAocHJvZmlsZS1pbnN0ci11c2UpIHBhc3MgZm9yIElSIGJhc2VkIFBHTy4KK2NsYXNzIFBHT0luc3RydW1lbnRhdGlvblVzZSA6IHB1YmxpYyBQYXNzSW5mb01peGluPFBHT0luc3RydW1lbnRhdGlvblVzZT4geworcHVibGljOgorICBQR09JbnN0cnVtZW50YXRpb25Vc2Uoc3RkOjpzdHJpbmcgRmlsZW5hbWUgPSAiIik7CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKE1vZHVsZSAmTSwgTW9kdWxlQW5hbHlzaXNNYW5hZ2VyICZBTSk7CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIFByb2ZpbGVGaWxlTmFtZTsKK307CisKKy8vLyBUaGUgaW5kaXJlY3QgZnVuY3Rpb24gY2FsbCBwcm9tb3Rpb24gcGFzcy4KK2NsYXNzIFBHT0luZGlyZWN0Q2FsbFByb21vdGlvbiA6IHB1YmxpYyBQYXNzSW5mb01peGluPFBHT0luZGlyZWN0Q2FsbFByb21vdGlvbj4geworcHVibGljOgorICBQR09JbmRpcmVjdENhbGxQcm9tb3Rpb24oYm9vbCBJc0luTFRPID0gZmFsc2UsIGJvb2wgU2FtcGxlUEdPID0gZmFsc2UpCisgICAgICA6IEluTFRPKElzSW5MVE8pLCBTYW1wbGVQR08oU2FtcGxlUEdPKSB7fQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworCitwcml2YXRlOgorICBib29sIEluTFRPOworICBib29sIFNhbXBsZVBHTzsKK307CisKKy8vLyBUaGUgcHJvZmlsZSBzaXplIGJhc2VkIG9wdGltaXphdGlvbiBwYXNzIGZvciBtZW1vcnkgaW50cmluc2ljcy4KK2NsYXNzIFBHT01lbU9QU2l6ZU9wdCA6IHB1YmxpYyBQYXNzSW5mb01peGluPFBHT01lbU9QU2l6ZU9wdD4geworcHVibGljOgorICBQR09NZW1PUFNpemVPcHQoKSA9IGRlZmF1bHQ7CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKwordm9pZCBzZXRQcm9mTWV0YWRhdGEoTW9kdWxlICpNLCBJbnN0cnVjdGlvbiAqVEksIEFycmF5UmVmPHVpbnQ2NF90PiBFZGdlQ291bnRzLAorICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgTWF4Q291bnQpOworCit2b2lkIHNldElyckxvb3BIZWFkZXJNZXRhZGF0YShNb2R1bGUgKk0sIEluc3RydWN0aW9uICpUSSwgdWludDY0X3QgQ291bnQpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1BHT0lOU1RSVU1FTlRBVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvT2JqQ0FSQy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL09iakNBUkMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODk3YWRjCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL09iakNBUkMuaApAQCAtMCwwICsxLDQ4IEBACisvLz09PS0tIE9iakNBUkMuaCAtIE9iakNBUkMgU2NhbGFyIFRyYW5zZm9ybWF0aW9ucyAtLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaGVhZGVyIGZpbGUgZGVmaW5lcyBwcm90b3R5cGVzIGZvciBhY2Nlc3NvciBmdW5jdGlvbnMgdGhhdCBleHBvc2UgcGFzc2VzCisvLyBpbiB0aGUgT2JqQ0FSQyBTY2FsYXIgVHJhbnNmb3JtYXRpb25zIGxpYnJhcnkuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfT0JKQ0FSQ19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19PQkpDQVJDX0gKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBQYXNzOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIE9iakNBUkNBUEVsaW0gLSBPYmpDIEFSQyBhdXRvcmVsZWFzZSBwb29sIGVsaW1pbmF0aW9uLgorLy8KK1Bhc3MgKmNyZWF0ZU9iakNBUkNBUEVsaW1QYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gT2JqQ0FSQ0V4cGFuZCAtIE9iakMgQVJDIHByZWxpbWluYXJ5IHNpbXBsaWZpY2F0aW9ucy4KKy8vCitQYXNzICpjcmVhdGVPYmpDQVJDRXhwYW5kUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIE9iakNBUkNDb250cmFjdCAtIExhdGUgT2JqQyBBUkMgY2xlYW51cHMuCisvLworUGFzcyAqY3JlYXRlT2JqQ0FSQ0NvbnRyYWN0UGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIE9iakNBUkNPcHQgLSBPYmpDIEFSQyBvcHRpbWl6YXRpb24uCisvLworUGFzcyAqY3JlYXRlT2JqQ0FSQ09wdFBhc3MoKTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRjN2JkNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIuaApAQCAtMCwwICsxLDQ5NyBAQAorLy89PT0tLSBTY2FsYXIuaCAtIFNjYWxhciBUcmFuc2Zvcm1hdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgcHJvdG90eXBlcyBmb3IgYWNjZXNzb3IgZnVuY3Rpb25zIHRoYXQgZXhwb3NlIHBhc3NlcworLy8gaW4gdGhlIFNjYWxhciB0cmFuc2Zvcm1hdGlvbnMgbGlicmFyeS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0gKKworI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmFzaWNCbG9ja1Bhc3M7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEZ1bmN0aW9uUGFzczsKK2NsYXNzIE1vZHVsZVBhc3M7CitjbGFzcyBQYXNzOworY2xhc3MgR2V0RWxlbWVudFB0ckluc3Q7CitjbGFzcyBQYXNzSW5mbzsKK2NsYXNzIFRlcm1pbmF0b3JJbnN0OworY2xhc3MgVGFyZ2V0TG93ZXJpbmc7CitjbGFzcyBUYXJnZXRNYWNoaW5lOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIENvbnN0YW50UHJvcGFnYXRpb24gLSBBIHdvcmtsaXN0IGRyaXZlbiBjb25zdGFudCBwcm9wYWdhdGlvbiBwYXNzCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVDb25zdGFudFByb3BhZ2F0aW9uUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEFsaWdubWVudEZyb21Bc3N1bXB0aW9ucyAtIFVzZSBhc3N1bWUgaW50cmluc2ljcyB0byBzZXQgbG9hZC9zdG9yZQorLy8gYWxpZ25tZW50cy4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZUFsaWdubWVudEZyb21Bc3N1bXB0aW9uc1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBTQ0NQIC0gU3BhcnNlIGNvbmRpdGlvbmFsIGNvbnN0YW50IHByb3BhZ2F0aW9uLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlU0NDUFBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEZWFkSW5zdEVsaW1pbmF0aW9uIC0gVGhpcyBwYXNzIHF1aWNrbHkgcmVtb3ZlcyB0cml2aWFsbHkgZGVhZCBpbnN0cnVjdGlvbnMKKy8vIHdpdGhvdXQgbW9kaWZ5aW5nIHRoZSBDRkcgb2YgdGhlIGZ1bmN0aW9uLiAgSXQgaXMgYSBCYXNpY0Jsb2NrUGFzcywgc28gaXQKKy8vIHJ1bnMgZWZmaWNpZW50bHkgd2hlbiBxdWV1ZWQgbmV4dCB0byBvdGhlciBCYXNpY0Jsb2NrUGFzcydzLgorLy8KK1Bhc3MgKmNyZWF0ZURlYWRJbnN0RWxpbWluYXRpb25QYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGVhZENvZGVFbGltaW5hdGlvbiAtIFRoaXMgcGFzcyBpcyBtb3JlIHBvd2VyZnVsIHRoYW4gRGVhZEluc3RFbGltaW5hdGlvbiwKKy8vIGJlY2F1c2UgaXQgaXMgd29ya2xpc3QgZHJpdmVuIHRoYXQgY2FuIHBvdGVudGlhbGx5IHJldmlzaXQgaW5zdHJ1Y3Rpb25zIHdoZW4KKy8vIHRoZWlyIG90aGVyIGluc3RydWN0aW9ucyBiZWNvbWUgZGVhZCwgdG8gZWxpbWluYXRlIGNoYWlucyBvZiBkZWFkCisvLyBjb21wdXRhdGlvbnMuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVEZWFkQ29kZUVsaW1pbmF0aW9uUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIERlYWRTdG9yZUVsaW1pbmF0aW9uIC0gVGhpcyBwYXNzIGRlbGV0ZXMgc3RvcmVzIHRoYXQgYXJlIHBvc3QtZG9taW5hdGVkIGJ5CisvLyBtdXN0LWFsaWFzZWQgc3RvcmVzIGFuZCBhcmUgbm90IGxvYWRlZCB1c2VkIGJldHdlZW4gdGhlIHN0b3Jlcy4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZURlYWRTdG9yZUVsaW1pbmF0aW9uUGFzcygpOworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gQ2FsbFNpdGVTcGxpdHRpbmcgLSBUaGlzIHBhc3Mgc3BsaXQgY2FsbC1zaXRlIGJhc2VkIG9uIGl0cyBrbm93biBhcmd1bWVudAorLy8gdmFsdWVzLgorRnVuY3Rpb25QYXNzICpjcmVhdGVDYWxsU2l0ZVNwbGl0dGluZ1Bhc3MoKTsKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEFnZ3Jlc3NpdmVEQ0UgLSBUaGlzIHBhc3MgdXNlcyB0aGUgU1NBIGJhc2VkIEFnZ3Jlc3NpdmUgRENFIGFsZ29yaXRobS4gIFRoaXMKKy8vIGFsZ29yaXRobSBhc3N1bWVzIGluc3RydWN0aW9ucyBhcmUgZGVhZCB1bnRpbCBwcm92ZW4gb3RoZXJ3aXNlLCB3aGljaCBtYWtlcworLy8gaXQgbW9yZSBzdWNjZXNzZnVsIGFyZSByZW1vdmluZyBub24tb2J2aW91c2x5IGRlYWQgaW5zdHJ1Y3Rpb25zLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlQWdncmVzc2l2ZURDRVBhc3MoKTsKKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEd1YXJkV2lkZW5pbmcgLSBBbiBvcHRpbWl6YXRpb24gb3ZlciB0aGUgQGxsdm0uZXhwZXJpbWVudGFsLmd1YXJkIGludHJpbnNpYworLy8gdGhhdCAob3B0aW1pc3RpY2FsbHkpIGNvbWJpbmVzIG11bHRpcGxlIGd1YXJkcyBpbnRvIG9uZSB0byBoYXZlIGZld2VyIGNoZWNrcworLy8gYXQgcnVudGltZS4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZUd1YXJkV2lkZW5pbmdQYXNzKCk7CisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBCaXRUcmFja2luZ0RDRSAtIFRoaXMgcGFzcyB1c2VzIGEgYml0LXRyYWNraW5nIERDRSBhbGdvcml0aG0gaW4gb3JkZXIgdG8KKy8vIHJlbW92ZSBjb21wdXRhdGlvbnMgb2YgZGVhZCBiaXRzLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlQml0VHJhY2tpbmdEQ0VQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gU1JPQSAtIFJlcGxhY2UgYWdncmVnYXRlcyBvciBwaWVjZXMgb2YgYWdncmVnYXRlcyB3aXRoIHNjYWxhciBTU0EgdmFsdWVzLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlU1JPQVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBJbmR1Y3RpdmVSYW5nZUNoZWNrRWxpbWluYXRpb24gLSBUcmFuc2Zvcm0gbG9vcHMgdG8gZWxpZGUgcmFuZ2UgY2hlY2tzIG9uCisvLyBsaW5lYXIgZnVuY3Rpb25zIG9mIHRoZSBpbmR1Y3Rpb24gdmFyaWFibGUuCisvLworUGFzcyAqY3JlYXRlSW5kdWN0aXZlUmFuZ2VDaGVja0VsaW1pbmF0aW9uUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEluZHVjdGlvblZhcmlhYmxlU2ltcGxpZnkgLSBUcmFuc2Zvcm0gaW5kdWN0aW9uIHZhcmlhYmxlcyBpbiBhIHByb2dyYW0gdG8gYWxsCisvLyB1c2UgYSBzaW5nbGUgY2Fub25pY2FsIGluZHVjdGlvbiB2YXJpYWJsZSBwZXIgbG9vcC4KKy8vCitQYXNzICpjcmVhdGVJbmRWYXJTaW1wbGlmeVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBJbnN0cnVjdGlvbkNvbWJpbmluZyAtIENvbWJpbmUgaW5zdHJ1Y3Rpb25zIHRvIGZvcm0gZmV3ZXIsIHNpbXBsZQorLy8gaW5zdHJ1Y3Rpb25zLiBUaGlzIHBhc3MgZG9lcyBub3QgbW9kaWZ5IHRoZSBDRkcsIGFuZCBoYXMgYSB0ZW5kZW5jeSB0byBtYWtlCisvLyBpbnN0cnVjdGlvbnMgZGVhZCwgc28gYSBzdWJzZXF1ZW50IERDRSBwYXNzIGlzIHVzZWZ1bC4KKy8vCisvLyBUaGlzIHBhc3MgY29tYmluZXMgdGhpbmdzIGxpa2U6CisvLyAgICAlWSA9IGFkZCBpbnQgMSwgJVgKKy8vICAgICVaID0gYWRkIGludCAxLCAlWQorLy8gaW50bzoKKy8vICAgICVaID0gYWRkIGludCAyLCAlWAorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlSW5zdHJ1Y3Rpb25Db21iaW5pbmdQYXNzKGJvb2wgRXhwZW5zaXZlQ29tYmluZXMgPSB0cnVlKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBBZ2dyZXNzaXZlSW5zdENvbWJpbmVyIC0gQ29tYmluZSBleHByZXNzaW9uIHBhdHRlcm5zIHRvIGZvcm0gZXhwcmVzc2lvbnMgd2l0aAorLy8gZmV3ZXIsIHNpbXBsZSBpbnN0cnVjdGlvbnMuIFRoaXMgcGFzcyBkb2VzIG5vdCBtb2RpZnkgdGhlIENGRy4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZUFnZ3Jlc3NpdmVJbnN0Q29tYmluZXJQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTElDTSAtIFRoaXMgcGFzcyBpcyBhIGxvb3AgaW52YXJpYW50IGNvZGUgbW90aW9uIGFuZCBtZW1vcnkgcHJvbW90aW9uIHBhc3MuCisvLworUGFzcyAqY3JlYXRlTElDTVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb29wU2luayAtIFRoaXMgcGFzcyBzaW5rcyBpbnZhcmlhbnRzIGZyb20gcHJlaGVhZGVyIHRvIGxvb3AgYm9keSB3aGVyZQorLy8gZnJlcXVlbmN5IGlzIGxvd2VyIHRoYW4gbG9vcCBwcmVoZWFkZXIuCisvLworUGFzcyAqY3JlYXRlTG9vcFNpbmtQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG9vcFByZWRpY2F0aW9uIC0gVGhpcyBwYXNzIGRvZXMgbG9vcCBwcmVkaWNhdGlvbiBvbiBndWFyZHMuCisvLworUGFzcyAqY3JlYXRlTG9vcFByZWRpY2F0aW9uUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvb3BJbnRlcmNoYW5nZSAtIFRoaXMgcGFzcyBpbnRlcmNoYW5nZXMgbG9vcHMgdG8gcHJvdmlkZSBhIG1vcmUKKy8vIGNhY2hlLWZyaWVuZGx5IG1lbW9yeSBhY2Nlc3MgcGF0dGVybnMuCisvLworUGFzcyAqY3JlYXRlTG9vcEludGVyY2hhbmdlUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvb3BTdHJlbmd0aFJlZHVjZSAtIFRoaXMgcGFzcyBpcyBzdHJlbmd0aCByZWR1Y2VzIEdFUCBpbnN0cnVjdGlvbnMgdGhhdCB1c2UKKy8vIGEgbG9vcCdzIGNhbm9uaWNhbCBpbmR1Y3Rpb24gdmFyaWFibGUgYXMgb25lIG9mIHRoZWlyIGluZGljZXMuCisvLworUGFzcyAqY3JlYXRlTG9vcFN0cmVuZ3RoUmVkdWNlUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvb3BVbnN3aXRjaCAtIFRoaXMgcGFzcyBpcyBhIHNpbXBsZSBsb29wIHVuc3dpdGNoaW5nIHBhc3MuCisvLworUGFzcyAqY3JlYXRlTG9vcFVuc3dpdGNoUGFzcyhib29sIE9wdGltaXplRm9yU2l6ZSA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc0JyYW5jaERpdmVyZ2VuY2UgPSBmYWxzZSk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG9vcFVucm9sbCAtIFRoaXMgcGFzcyBpcyBhIHNpbXBsZSBsb29wIHVucm9sbGluZyBwYXNzLgorLy8KK1Bhc3MgKmNyZWF0ZUxvb3BVbnJvbGxQYXNzKGludCBPcHRMZXZlbCA9IDIsIGludCBUaHJlc2hvbGQgPSAtMSwgaW50IENvdW50ID0gLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgQWxsb3dQYXJ0aWFsID0gLTEsIGludCBSdW50aW1lID0gLTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgVXBwZXJCb3VuZCA9IC0xLCBpbnQgQWxsb3dQZWVsaW5nID0gLTEpOworLy8gQ3JlYXRlIGFuIHVucm9sbGluZyBwYXNzIGZvciBmdWxsIHVucm9sbGluZyB0aGF0IHVzZXMgZXhhY3QgdHJpcCBjb3VudCBvbmx5LgorUGFzcyAqY3JlYXRlU2ltcGxlTG9vcFVucm9sbFBhc3MoaW50IE9wdExldmVsID0gMik7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG9vcFJlcm9sbCAtIFRoaXMgcGFzcyBpcyBhIHNpbXBsZSBsb29wIHJlcm9sbGluZyBwYXNzLgorLy8KK1Bhc3MgKmNyZWF0ZUxvb3BSZXJvbGxQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG9vcFJvdGF0ZSAtIFRoaXMgcGFzcyBpcyBhIHNpbXBsZSBsb29wIHJvdGF0aW5nIHBhc3MuCisvLworUGFzcyAqY3JlYXRlTG9vcFJvdGF0ZVBhc3MoaW50IE1heEhlYWRlclNpemUgPSAtMSk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG9vcElkaW9tIC0gVGhpcyBwYXNzIHJlY29nbml6ZXMgYW5kIHJlcGxhY2VzIGlkaW9tcyBpbiBsb29wcy4KKy8vCitQYXNzICpjcmVhdGVMb29wSWRpb21QYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG9vcFZlcnNpb25pbmdMSUNNIC0gVGhpcyBwYXNzIGlzIGEgbG9vcCB2ZXJzaW9uaW5nIHBhc3MgZm9yIExJQ00uCisvLworUGFzcyAqY3JlYXRlTG9vcFZlcnNpb25pbmdMSUNNUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIERlbW90ZVJlZ2lzdGVyVG9NZW1vcnlQYXNzIC0gVGhpcyBwYXNzIGlzIHVzZWQgdG8gZGVtb3RlIHJlZ2lzdGVycyB0byBtZW1vcnkKKy8vIHJlZmVyZW5jZXMuIEluIGJhc2ljYWxseSB1bmRvZXMgdGhlIFByb21vdGVNZW1vcnlUb1JlZ2lzdGVyIHBhc3MgdG8gbWFrZSBjZmcKKy8vIGhhY2tpbmcgZWFzaWVyLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlRGVtb3RlUmVnaXN0ZXJUb01lbW9yeVBhc3MoKTsKK2V4dGVybiBjaGFyICZEZW1vdGVSZWdpc3RlclRvTWVtb3J5SUQ7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gUmVhc3NvY2lhdGUgLSBUaGlzIHBhc3MgcmVhc3NvY2lhdGVzIGNvbW11dGF0aXZlIGV4cHJlc3Npb25zIGluIGFuIG9yZGVyIHRoYXQKKy8vIGlzIGRlc2lnbmVkIHRvIHByb21vdGUgYmV0dGVyIGNvbnN0YW50IHByb3BhZ2F0aW9uLCBHQ1NFLCBMSUNNLCBQUkUuLi4KKy8vCisvLyBGb3IgZXhhbXBsZTogIDQgKyAoeCArIDUpICAtPiAgeCArICg0ICsgNSkKKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZVJlYXNzb2NpYXRlUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEp1bXBUaHJlYWRpbmcgLSBUaHJlYWQgY29udHJvbCB0aHJvdWdoIG11bHQtcHJlZC9tdWx0aS1zdWNjIGJsb2NrcyB3aGVyZSBzb21lCisvLyBwcmVkcyBhbHdheXMgZ28gdG8gc29tZSBzdWNjLiBUaHJlc2hvbGRzIG90aGVyIHRoYW4gbWludXMgb25lIG92ZXJyaWRlIHRoZQorLy8gaW50ZXJuYWwgQkIgZHVwbGljYXRpb24gZGVmYXVsdCB0aHJlc2hvbGQuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVKdW1wVGhyZWFkaW5nUGFzcyhpbnQgVGhyZXNob2xkID0gLTEpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIENGR1NpbXBsaWZpY2F0aW9uIC0gTWVyZ2UgYmFzaWMgYmxvY2tzLCBlbGltaW5hdGUgdW5yZWFjaGFibGUgYmxvY2tzLAorLy8gc2ltcGxpZnkgdGVybWluYXRvciBpbnN0cnVjdGlvbnMsIGNvbnZlcnQgc3dpdGNoZXMgdG8gbG9va3VwIHRhYmxlcywgZXRjLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlQ0ZHU2ltcGxpZmljYXRpb25QYXNzKAorICAgIHVuc2lnbmVkIFRocmVzaG9sZCA9IDEsIGJvb2wgRm9yd2FyZFN3aXRjaENvbmQgPSBmYWxzZSwKKyAgICBib29sIENvbnZlcnRTd2l0Y2ggPSBmYWxzZSwgYm9vbCBLZWVwTG9vcHMgPSB0cnVlLCBib29sIFNpbmtDb21tb24gPSBmYWxzZSwKKyAgICBzdGQ6OmZ1bmN0aW9uPGJvb2woY29uc3QgRnVuY3Rpb24gJik+IEZ0b3IgPSBudWxscHRyKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBGbGF0dGVuQ0ZHIC0gZmxhdHRlbiBDRkcsIHJlZHVjZSBudW1iZXIgb2YgY29uZGl0aW9uYWwgYnJhbmNoZXMgYnkgdXNpbmcKKy8vIHBhcmFsbGVsLWFuZCBhbmQgcGFyYWxsZWwtb3IgbW9kZSwgZXRjLi4uCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVGbGF0dGVuQ0ZHUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIENGRyBTdHJ1Y3R1cml6YXRpb24gLSBSZW1vdmUgaXJyZWR1Y2libGUgY29udHJvbCBmbG93CisvLworLy8vCisvLy8gV2hlbiBccCBTa2lwVW5pZm9ybVJlZ2lvbnMgaXMgdHJ1ZSB0aGUgc3RydWN0aXplciB3aWxsIG5vdCBzdHJ1Y3R1cml6ZQorLy8vIHJlZ2lvbnMgdGhhdCBvbmx5IGNvbnRhaW4gdW5pZm9ybSBicmFuY2hlcy4KK1Bhc3MgKmNyZWF0ZVN0cnVjdHVyaXplQ0ZHUGFzcyhib29sIFNraXBVbmlmb3JtUmVnaW9ucyA9IGZhbHNlKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUYWlsQ2FsbEVsaW1pbmF0aW9uIC0gVGhpcyBwYXNzIGVsaW1pbmF0ZXMgY2FsbCBpbnN0cnVjdGlvbnMgdG8gdGhlIGN1cnJlbnQKKy8vIGZ1bmN0aW9uIHdoaWNoIG9jY3VyIGltbWVkaWF0ZWx5IGJlZm9yZSByZXR1cm4gaW5zdHJ1Y3Rpb25zLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlVGFpbENhbGxFbGltaW5hdGlvblBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBFYXJseUNTRSAtIFRoaXMgcGFzcyBwZXJmb3JtcyBhIHNpbXBsZSBhbmQgZmFzdCBDU0UgcGFzcyBvdmVyIHRoZSBkb21pbmF0b3IKKy8vIHRyZWUuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVFYXJseUNTRVBhc3MoYm9vbCBVc2VNZW1vcnlTU0EgPSBmYWxzZSk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gR1ZOSG9pc3QgLSBUaGlzIHBhc3MgcGVyZm9ybXMgYSBzaW1wbGUgYW5kIGZhc3QgR1ZOIHBhc3Mgb3ZlciB0aGUgZG9taW5hdG9yCisvLyB0cmVlIHRvIGhvaXN0IGNvbW1vbiBleHByZXNzaW9ucyBmcm9tIHNpYmxpbmcgYnJhbmNoZXMuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVHVk5Ib2lzdFBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBHVk5TaW5rIC0gVGhpcyBwYXNzIHVzZXMgYW4gImludmVydGVkIiB2YWx1ZSBudW1iZXJpbmcgdG8gZGVjaWRlIHRoZQorLy8gc2ltaWxhcml0eSBvZiBleHByZXNzaW9ucyBhbmQgc2lua3Mgc2ltaWxhciBleHByZXNzaW9ucyBpbnRvIHN1Y2Nlc3NvcnMuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVHVk5TaW5rUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIE1lcmdlZExvYWRTdG9yZU1vdGlvbiAtIFRoaXMgcGFzcyBtZXJnZXMgbG9hZHMgYW5kIHN0b3JlcyBpbiBkaWFtb25kcy4gTG9hZHMKKy8vIGFyZSBob2lzdGVkIGludG8gdGhlIGhlYWRlciwgd2hpbGUgc3RvcmVzIHNpbmsgaW50byB0aGUgZm9vdGVyLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlTWVyZ2VkTG9hZFN0b3JlTW90aW9uUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEdWTiAtIFRoaXMgcGFzcyBwZXJmb3JtcyBnbG9iYWwgdmFsdWUgbnVtYmVyaW5nIGFuZCByZWR1bmRhbnQgbG9hZAorLy8gZWxpbWluYXRpb24gY290ZW1wb3JhbmVvdXNseS4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZU5ld0dWTlBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEaXZSZW1QYWlycyAtIEhvaXN0L2RlY29tcG9zZSBpbnRlZ2VyIGRpdmlzaW9uIGFuZCByZW1haW5kZXIgaW5zdHJ1Y3Rpb25zLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlRGl2UmVtUGFpcnNQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTWVtQ3B5T3B0IC0gVGhpcyBwYXNzIHBlcmZvcm1zIG9wdGltaXphdGlvbnMgcmVsYXRlZCB0byBlbGltaW5hdGluZyBtZW1jcHkKKy8vIGNhbGxzIGFuZC9vciBjb21iaW5pbmcgbXVsdGlwbGUgc3RvcmVzIGludG8gbWVtc2V0J3MuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVNZW1DcHlPcHRQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG9vcERlbGV0aW9uIC0gVGhpcyBwYXNzIHBlcmZvcm1zIERDRSBvZiBub24taW5maW5pdGUgbG9vcHMgdGhhdCBpdAorLy8gY2FuIHByb3ZlIGFyZSBkZWFkLgorLy8KK1Bhc3MgKmNyZWF0ZUxvb3BEZWxldGlvblBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBDb25zdGFudEhvaXN0aW5nIC0gVGhpcyBwYXNzIHByZXBhcmVzIGEgZnVuY3Rpb24gZm9yIGV4cGVuc2l2ZSBjb25zdGFudHMuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVDb25zdGFudEhvaXN0aW5nUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFNpbmsgLSBDb2RlIFNpbmtpbmcKKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZVNpbmtpbmdQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG93ZXJBdG9taWMgLSBMb3dlciBhdG9taWMgaW50cmluc2ljcyB0byBub24tYXRvbWljIGZvcm0KKy8vCitQYXNzICpjcmVhdGVMb3dlckF0b21pY1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb3dlckd1YXJkSW50cmluc2ljIC0gTG93ZXIgZ3VhcmQgaW50cmluc2ljcyB0byBub3JtYWwgY29udHJvbCBmbG93LgorLy8KK1Bhc3MgKmNyZWF0ZUxvd2VyR3VhcmRJbnRyaW5zaWNQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTWVyZ2VJQ21wcyAtIE1lcmdlIGludGVnZXIgY29tcGFyaXNvbiBjaGFpbnMgaW50byBhIG1lbWNtcAorLy8KK1Bhc3MgKmNyZWF0ZU1lcmdlSUNtcHNQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVmFsdWVQcm9wYWdhdGlvbiAtIFByb3BhZ2F0ZSBDRkctZGVyaXZlZCB2YWx1ZSBpbmZvcm1hdGlvbgorLy8KK1Bhc3MgKmNyZWF0ZUNvcnJlbGF0ZWRWYWx1ZVByb3BhZ2F0aW9uUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEluZmVyQWRkcmVzc1NwYWNlcyAtIE1vZGlmeSB1c2VycyBvZiBhZGRyc3BhY2VjYXN0IGluc3RydWN0aW9ucyB3aXRoIHZhbHVlcworLy8gaW4gdGhlIHNvdXJjZSBhZGRyZXNzIHNwYWNlIGlmIHVzaW5nIHRoZSBkZXN0aW5hdGlvbiBhZGRyZXNzIHNwYWNlIGlzIHNsb3dlcgorLy8gb24gdGhlIHRhcmdldC4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZUluZmVyQWRkcmVzc1NwYWNlc1Bhc3MoKTsKK2V4dGVybiBjaGFyICZJbmZlckFkZHJlc3NTcGFjZXNJRDsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb3dlckV4cGVjdEludHJpbnNpY3MgLSBSZW1vdmVzIGxsdm0uZXhwZWN0IGludHJpbnNpY3MgYW5kIGNyZWF0ZXMKKy8vICJibG9ja193ZWlnaHRzIiBtZXRhZGF0YS4KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlTG93ZXJFeHBlY3RJbnRyaW5zaWNQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gUGFydGlhbGx5SW5saW5lTGliQ2FsbHMgLSBUcmllcyB0byBpbmxpbmUgdGhlIGZhc3QgcGF0aCBvZiBsaWJyYXJ5CisvLyBjYWxscyBzdWNoIGFzIHNxcnQuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVQYXJ0aWFsbHlJbmxpbmVMaWJDYWxsc1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBTY2FsYXJpemVyUGFzcyAtIENvbnZlcnRzIHZlY3RvciBvcGVyYXRpb25zIGludG8gc2NhbGFyIG9wZXJhdGlvbnMKKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZVNjYWxhcml6ZXJQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gU2VwYXJhdGVDb25zdE9mZnNldEZyb21HRVAgLSBTcGxpdCBHRVBzIGZvciBiZXR0ZXIgQ1NFCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVTZXBhcmF0ZUNvbnN0T2Zmc2V0RnJvbUdFUFBhc3MoYm9vbCBMb3dlckdFUCA9IGZhbHNlKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBTcGVjdWxhdGl2ZUV4ZWN1dGlvbiAtIEFnZ3Jlc3NpdmVseSBob2lzdCBpbnN0cnVjdGlvbnMgdG8gZW5hYmxlCisvLyBzcGVjdWxhdGl2ZSBleGVjdXRpb24gb24gdGFyZ2V0cyB3aGVyZSBicmFuY2hlcyBhcmUgZXhwZW5zaXZlLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlU3BlY3VsYXRpdmVFeGVjdXRpb25QYXNzKCk7CisKKy8vIFNhbWUgYXMgY3JlYXRlU3BlY3VsYXRpdmVFeGVjdXRpb25QYXNzLCBidXQgZG9lcyBub3RoaW5nIHVubGVzcworLy8gVGFyZ2V0VHJhbnNmb3JtSW5mbzo6aGFzQnJhbmNoRGl2ZXJnZW5jZSgpIGlzIHRydWUuCitGdW5jdGlvblBhc3MgKmNyZWF0ZVNwZWN1bGF0aXZlRXhlY3V0aW9uSWZIYXNCcmFuY2hEaXZlcmdlbmNlUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFN0cmFpZ2h0TGluZVN0cmVuZ3RoUmVkdWNlIC0gVGhpcyBwYXNzIHN0cmVuZ3RoLXJlZHVjZXMgc29tZSBjZXJ0YWluCisvLyBpbnN0cnVjdGlvbiBwYXR0ZXJucyBpbiBzdHJhaWdodC1saW5lIGNvZGUuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVTdHJhaWdodExpbmVTdHJlbmd0aFJlZHVjZVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBQbGFjZVNhZmVwb2ludHMgLSBSZXdyaXRlIGFueSBJUiBjYWxscyB0byBnYy5zdGF0ZXBvaW50cyBhbmQgaW5zZXJ0IGFueQorLy8gc2FmZXBvaW50IHBvbGxzIChtZXRob2QgZW50cnksIGJhY2tlZGdlKSB0aGF0IG1pZ2h0IGJlIHJlcXVpcmVkLiAgVGhpcyBwYXNzCisvLyBkb2VzIG5vdCBnZW5lcmF0ZSBleHBsaWNpdCByZWxvY2F0aW9uIHNlcXVlbmNlcyAtIHRoYXQncyBoYW5kbGVkIGJ5CisvLyBSZXdyaXRlU3RhdGVwb2ludHNGb3JHQyB3aGljaCBjYW4gYmUgcnVuIGF0IGFuIGFyYml0cmFyeSBwb2ludCBpbiB0aGUgcGFzcworLy8gb3JkZXIgZm9sbG93aW5nIHRoaXMgcGFzcy4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZVBsYWNlU2FmZXBvaW50c1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBSZXdyaXRlU3RhdGVwb2ludHNGb3JHQyAtIFJld3JpdGUgYW55IGdjLnN0YXRlcG9pbnRzIHdoaWNoIGRvIG5vdCB5ZXQgaGF2ZQorLy8gZXhwbGljaXQgcmVsb2NhdGlvbnMgdG8gaW5jbHVkZSBleHBsaWNpdCByZWxvY2F0aW9ucy4KKy8vCitNb2R1bGVQYXNzICpjcmVhdGVSZXdyaXRlU3RhdGVwb2ludHNGb3JHQ0xlZ2FjeVBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBGbG9hdDJJbnQgLSBEZW1vdGUgZmxvYXRzIHRvIGludHMgd2hlcmUgcG9zc2libGUuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVGbG9hdDJJbnRQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTmFyeVJlYXNzb2NpYXRlIC0gU2ltcGxpZnkgbi1hcnkgb3BlcmF0aW9ucyBieSByZWFzc29jaWF0aW9uLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlTmFyeVJlYXNzb2NpYXRlUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvb3BEaXN0cmlidXRlIC0gRGlzdHJpYnV0ZSBsb29wcy4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZUxvb3BEaXN0cmlidXRlUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvb3BMb2FkRWxpbWluYXRpb24gLSBQZXJmb3JtIGxvb3AtYXdhcmUgbG9hZCBlbGltaW5hdGlvbi4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZUxvb3BMb2FkRWxpbWluYXRpb25QYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG9vcFZlcnNpb25pbmcgLSBQZXJmb3JtIGxvb3AgbXVsdGktdmVyc2lvbmluZy4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZUxvb3BWZXJzaW9uaW5nUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvb3BEYXRhUHJlZmV0Y2ggLSBQZXJmb3JtIGRhdGEgcHJlZmV0Y2hpbmcgaW4gbG9vcHMuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVMb29wRGF0YVByZWZldGNoUGFzcygpOworCisvLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworTW9kdWxlUGFzcyAqY3JlYXRlTmFtZUFub25HbG9iYWxQYXNzKCk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTGliQ2FsbHNTaHJpbmtXcmFwIC0gU2hyaW5rLXdyYXBzIGEgY2FsbCB0byBmdW5jdGlvbiBpZiB0aGUgcmVzdWx0IGlzIG5vdAorLy8gdXNlZC4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZUxpYkNhbGxzU2hyaW5rV3JhcFBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb29wU2ltcGxpZnlDRkcgLSBUaGlzIHBhc3MgcGVyZm9ybXMgYmFzaWMgQ0ZHIHNpbXBsaWZpY2F0aW9uIG9uIGxvb3BzLAorLy8gcHJpbWFyaWx5IHRvIGhlbHAgb3RoZXIgbG9vcCBwYXNzZXMuCisvLworUGFzcyAqY3JlYXRlTG9vcFNpbXBsaWZ5Q0ZHUGFzcygpOworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0FEQ0UuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvQURDRS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OGFmNjIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0FEQ0UuaApAQCAtMCwwICsxLDM4IEBACisvLz09PS0gQURDRS5oIC0gQWdncmVzc2l2ZSBkZWFkIGNvZGUgZWxpbWluYXRpb24gLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgQWdncmVzc2l2ZSBEZWFkIENvZGUgRWxpbWluYXRpb24KKy8vIHBhc3MuIFRoaXMgcGFzcyBvcHRpbWlzdGljYWxseSBhc3N1bWVzIHRoYXQgYWxsIGluc3RydWN0aW9ucyBhcmUgZGVhZCB1bnRpbAorLy8gcHJvdmVuIG90aGVyd2lzZSwgYWxsb3dpbmcgaXQgdG8gZWxpbWluYXRlIGRlYWQgY29tcHV0YXRpb25zIHRoYXQgb3RoZXIgRENFCisvLyBwYXNzZXMgZG8gbm90IGNhdGNoLCBwYXJ0aWN1bGFybHkgaW52b2x2aW5nIGxvb3AgY29tcHV0YXRpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9BRENFX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9BRENFX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKKworLy8vIEEgRENFIHBhc3MgdGhhdCBhc3N1bWVzIGluc3RydWN0aW9ucyBhcmUgZGVhZCB1bnRpbCBwcm92ZW4gb3RoZXJ3aXNlLgorLy8vCisvLy8gVGhpcyBwYXNzIGVsaW1pbmF0ZXMgZGVhZCBjb2RlIGJ5IG9wdGltaXN0aWNhbGx5IGFzc3VtaW5nIHRoYXQgYWxsCisvLy8gaW5zdHJ1Y3Rpb25zIGFyZSBkZWFkIHVudGlsIHByb3ZlbiBvdGhlcndpc2UuIFRoaXMgYWxsb3dzIGl0IHRvIGVsaW1pbmF0ZQorLy8vIGRlYWQgY29tcHV0YXRpb25zIHRoYXQgb3RoZXIgRENFIHBhc3NlcyBkbyBub3QgY2F0Y2gsIHBhcnRpY3VsYXJseSBpbnZvbHZpbmcKKy8vLyBsb29wIGNvbXB1dGF0aW9ucy4KK3N0cnVjdCBBRENFUGFzcyA6IFBhc3NJbmZvTWl4aW48QURDRVBhc3M+IHsKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0FEQ0VfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9BbGlnbm1lbnRGcm9tQXNzdW1wdGlvbnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvQWxpZ25tZW50RnJvbUFzc3VtcHRpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjE5NzUwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvQWxpZ25tZW50RnJvbUFzc3VtcHRpb25zLmgKQEAgLTAsMCArMSw0NSBAQAorLy89PT0tLS0tIEFsaWdubWVudEZyb21Bc3N1bXB0aW9ucy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBhIFNjYWxhckV2b2x1dGlvbi1iYXNlZCB0cmFuc2Zvcm1hdGlvbiB0byBzZXQKKy8vIHRoZSBhbGlnbm1lbnRzIG9mIGxvYWQsIHN0b3JlcyBhbmQgbWVtb3J5IGludHJpbnNpY3MgYmFzZWQgb24gdGhlIHRydXRoCisvLyBleHByZXNzaW9ucyBvZiBhc3N1bWUgaW50cmluc2ljcy4gVGhlIHByaW1hcnkgbW90aXZhdGlvbiBpcyB0byBoYW5kbGUKKy8vIGNvbXBsZXggYWxpZ25tZW50IGFzc3VtcHRpb25zIHRoYXQgYXBwbHkgdG8gdmVjdG9yIGxvYWRzIGFuZCBzdG9yZXMgdGhhdAorLy8gYXBwZWFyIGFmdGVyIHZlY3Rvcml6YXRpb24gYW5kIHVucm9sbGluZy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfQUxJR05NRU5URlJPTUFTU1VNUFRJT05TX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9BTElHTk1FTlRGUk9NQVNTVU1QVElPTlNfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnRyaW5zaWNJbnN0LmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK3N0cnVjdCBBbGlnbm1lbnRGcm9tQXNzdW1wdGlvbnNQYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxBbGlnbm1lbnRGcm9tQXNzdW1wdGlvbnNQYXNzPiB7CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKKworICAvLyBHbHVlIGZvciBvbGQgUE0uCisgIGJvb2wgcnVuSW1wbChGdW5jdGlvbiAmRiwgQXNzdW1wdGlvbkNhY2hlICZBQywgU2NhbGFyRXZvbHV0aW9uICpTRV8sCisgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICpEVF8pOworCisgIFNjYWxhckV2b2x1dGlvbiAqU0UgPSBudWxscHRyOworICBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHI7CisKKyAgYm9vbCBleHRyYWN0QWxpZ25tZW50SW5mbyhDYWxsSW5zdCAqSSwgVmFsdWUgKiZBQVB0ciwgY29uc3QgU0NFViAqJkFsaWduU0NFViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTQ0VWIComT2ZmU0NFVik7CisgIGJvb2wgcHJvY2Vzc0Fzc3VtcHRpb24oQ2FsbEluc3QgKkkpOworfTsKK30KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfQUxJR05NRU5URlJPTUFTU1VNUFRJT05TX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvQkRDRS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9CRENFLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdkMjczMAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvQkRDRS5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vPT09LS0tLSBCRENFLmNwcCAtIEJpdC10cmFja2luZyBkZWFkIGNvZGUgZWxpbWluYXRpb24gLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgdGhlIEJpdC1UcmFja2luZyBEZWFkIENvZGUgRWxpbWluYXRpb24gcGFzcy4gU29tZQorLy8gaW5zdHJ1Y3Rpb25zIChzaGlmdHMsIHNvbWUgYW5kcywgb3JzLCBldGMuKSBraWxsIHNvbWUgb2YgdGhlaXIgaW5wdXQgYml0cy4KKy8vIFdlIHRyYWNrIHRoZXNlIGRlYWQgYml0cyBhbmQgcmVtb3ZlIGluc3RydWN0aW9ucyB0aGF0IGNvbXB1dGUgb25seSB0aGVzZQorLy8gZGVhZCBiaXRzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9CRENFX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9CRENFX0gKKworI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8gVGhlIEJpdC1UcmFja2luZyBEZWFkIENvZGUgRWxpbWluYXRpb24gcGFzcy4KK3N0cnVjdCBCRENFUGFzcyA6IFBhc3NJbmZvTWl4aW48QkRDRVBhc3M+IHsKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKK30KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfQkRDRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0NhbGxTaXRlU3BsaXR0aW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0NhbGxTaXRlU3BsaXR0aW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFiOTUxYQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvQ2FsbFNpdGVTcGxpdHRpbmcuaApAQCAtMCwwICsxLDI5IEBACisvLz09PS0gQ2FsbFNpdGVTcGxpdHRpbmcuLmggLSBDYWxsc2l0ZSBTcGxpdHRpbmcgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9DQUxMU0lURVNQTElUVElOR19fSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0NBTExTSVRFU1BMSVRUSU5HX19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0Fzc3VtcHRpb25DYWNoZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0NvbXBpbGVyLmgiCisjaW5jbHVkZSA8dmVjdG9yPgorCituYW1lc3BhY2UgbGx2bSB7CisKK3N0cnVjdCBDYWxsU2l0ZVNwbGl0dGluZ1Bhc3MgOiBQYXNzSW5mb01peGluPENhbGxTaXRlU3BsaXR0aW5nUGFzcz4geworICAvLy8gXGJyaWVmIFJ1biB0aGUgcGFzcyBvdmVyIHRoZSBmdW5jdGlvbi4KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0NBTExTSVRFU1BMSVRUSU5HX19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0NvbnN0YW50SG9pc3RpbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvQ29uc3RhbnRIb2lzdGluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzMzIyZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0NvbnN0YW50SG9pc3RpbmcuaApAQCAtMCwwICsxLDE2NyBAQAorLy89PS0gQ29uc3RhbnRIb2lzdGluZy5oIC0gUHJlcGFyZSBjb2RlIGZvciBleHBlbnNpdmUgY29uc3RhbnRzIC0tKi0gQysrIC0qLT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgaWRlbnRpZmllcyBleHBlbnNpdmUgY29uc3RhbnRzIHRvIGhvaXN0IGFuZCBjb2FsZXNjZXMgdGhlbSB0bworLy8gYmV0dGVyIHByZXBhcmUgaXQgZm9yIFNlbGVjdGlvbkRBRy1iYXNlZCBjb2RlIGdlbmVyYXRpb24uIFRoaXMgd29ya3MgYXJvdW5kCisvLyB0aGUgbGltaXRhdGlvbnMgb2YgdGhlIGJhc2ljLWJsb2NrLWF0LWEtdGltZSBhcHByb2FjaC4KKy8vCisvLyBGaXJzdCBpdCBzY2FucyBhbGwgaW5zdHJ1Y3Rpb25zIGZvciBpbnRlZ2VyIGNvbnN0YW50cyBhbmQgY2FsY3VsYXRlcyBpdHMKKy8vIGNvc3QuIElmIHRoZSBjb25zdGFudCBjYW4gYmUgZm9sZGVkIGludG8gdGhlIGluc3RydWN0aW9uICh0aGUgY29zdCBpcworLy8gVENDX0ZyZWUpIG9yIHRoZSBjb3N0IGlzIGp1c3QgYSBzaW1wbGUgb3BlcmF0aW9uIChUQ0NfQkFTSUMpLCB0aGVuIHdlIGRvbid0CisvLyBjb25zaWRlciBpdCBleHBlbnNpdmUgYW5kIGxlYXZlIGl0IGFsb25lLiBUaGlzIGlzIHRoZSBkZWZhdWx0IGJlaGF2aW9yIGFuZAorLy8gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgZ2V0SW50SW1tQ29zdCB3aWxsIGFsd2F5cyByZXR1cm4gVENDX0ZyZWUuCisvLworLy8gSWYgdGhlIGNvc3QgaXMgbW9yZSB0aGFuIFRDQ19CQVNJQywgdGhlbiB0aGUgaW50ZWdlciBjb25zdGFudCBjYW4ndCBiZSBmb2xkZWQKKy8vIGludG8gdGhlIGluc3RydWN0aW9uIGFuZCBpdCBtaWdodCBiZSBiZW5lZmljaWFsIHRvIGhvaXN0IHRoZSBjb25zdGFudC4KKy8vIFNpbWlsYXIgY29uc3RhbnRzIGFyZSBjb2FsZXNjZWQgdG8gcmVkdWNlIHJlZ2lzdGVyIHByZXNzdXJlIGFuZAorLy8gbWF0ZXJpYWxpemF0aW9uIGNvZGUuCisvLworLy8gV2hlbiBhIGNvbnN0YW50IGlzIGhvaXN0ZWQsIGl0IGlzIGFsc28gaGlkZGVuIGJlaGluZCBhIGJpdGNhc3QgdG8gZm9yY2UgaXQgdG8KKy8vIGJlIGxpdmUtb3V0IG9mIHRoZSBiYXNpYyBibG9jay4gT3RoZXJ3aXNlIHRoZSBjb25zdGFudCB3b3VsZCBiZSBqdXN0CisvLyBkdXBsaWNhdGVkIGFuZCBlYWNoIGJhc2ljIGJsb2NrIHdvdWxkIGhhdmUgaXRzIG93biBjb3B5IGluIHRoZSBTZWxlY3Rpb25EQUcuCisvLyBUaGUgU2VsZWN0aW9uREFHIHJlY29nbml6ZXMgc3VjaCBjb25zdGFudHMgYXMgb3BhcXVlIGFuZCBkb2Vzbid0IHBlcmZvcm0KKy8vIGNlcnRhaW4gdHJhbnNmb3JtYXRpb25zIG9uIHRoZW0sIHdoaWNoIHdvdWxkIGNyZWF0ZSBhIG5ldyBleHBlbnNpdmUgY29uc3RhbnQuCisvLworLy8gVGhpcyBvcHRpbWl6YXRpb24gaXMgb25seSBhcHBsaWVkIHRvIGludGVnZXIgY29uc3RhbnRzIGluIGluc3RydWN0aW9ucyBhbmQKKy8vIHNpbXBsZSAodGhpcyBtZWFucyBub3QgbmVzdGVkKSBjb25zdGFudCBjYXN0IGV4cHJlc3Npb25zLiBGb3IgZXhhbXBsZToKKy8vICUwID0gbG9hZCBpNjQqIGludHRvcHRyIChpNjQgYmlnX2NvbnN0YW50IHRvIGk2NCopCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0NPTlNUQU5USE9JU1RJTkdfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0NPTlNUQU5USE9JU1RJTkdfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIEJsb2NrRnJlcXVlbmN5SW5mbzsKK2NsYXNzIENvbnN0YW50OworY2xhc3MgQ29uc3RhbnRJbnQ7CitjbGFzcyBEb21pbmF0b3JUcmVlOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIFRhcmdldFRyYW5zZm9ybUluZm87CisKKy8vLyBBIHByaXZhdGUgIm1vZHVsZSIgbmFtZXNwYWNlIGZvciB0eXBlcyBhbmQgdXRpbGl0aWVzIHVzZWQgYnkKKy8vLyBDb25zdGFudEhvaXN0aW5nLiBUaGVzZSBhcmUgaW1wbGVtZW50YXRpb24gZGV0YWlscyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5CisvLy8gY2xpZW50cy4KK25hbWVzcGFjZSBjb25zdGhvaXN0IHsKKworLy8vIFxicmllZiBLZWVwcyB0cmFjayBvZiB0aGUgdXNlciBvZiBhIGNvbnN0YW50IGFuZCB0aGUgb3BlcmFuZCBpbmRleCB3aGVyZSB0aGUKKy8vLyBjb25zdGFudCBpcyB1c2VkLgorc3RydWN0IENvbnN0YW50VXNlciB7CisgIEluc3RydWN0aW9uICpJbnN0OworICB1bnNpZ25lZCBPcG5kSWR4OworCisgIENvbnN0YW50VXNlcihJbnN0cnVjdGlvbiAqSW5zdCwgdW5zaWduZWQgSWR4KSA6IEluc3QoSW5zdCksIE9wbmRJZHgoSWR4KSB7fQorfTsKKwordXNpbmcgQ29uc3RhbnRVc2VMaXN0VHlwZSA9IFNtYWxsVmVjdG9yPENvbnN0YW50VXNlciwgOD47CisKKy8vLyBcYnJpZWYgS2VlcHMgdHJhY2sgb2YgYSBjb25zdGFudCBjYW5kaWRhdGUgYW5kIGl0cyB1c2VzLgorc3RydWN0IENvbnN0YW50Q2FuZGlkYXRlIHsKKyAgQ29uc3RhbnRVc2VMaXN0VHlwZSBVc2VzOworICBDb25zdGFudEludCAqQ29uc3RJbnQ7CisgIHVuc2lnbmVkIEN1bXVsYXRpdmVDb3N0ID0gMDsKKworICBDb25zdGFudENhbmRpZGF0ZShDb25zdGFudEludCAqQ29uc3RJbnQpIDogQ29uc3RJbnQoQ29uc3RJbnQpIHt9CisKKyAgLy8vIFxicmllZiBBZGQgdGhlIHVzZXIgdG8gdGhlIHVzZSBsaXN0IGFuZCB1cGRhdGUgdGhlIGNvc3QuCisgIHZvaWQgYWRkVXNlcihJbnN0cnVjdGlvbiAqSW5zdCwgdW5zaWduZWQgSWR4LCB1bnNpZ25lZCBDb3N0KSB7CisgICAgQ3VtdWxhdGl2ZUNvc3QgKz0gQ29zdDsKKyAgICBVc2VzLnB1c2hfYmFjayhDb25zdGFudFVzZXIoSW5zdCwgSWR4KSk7CisgIH0KK307CisKKy8vLyBcYnJpZWYgVGhpcyByZXByZXNlbnRzIGEgY29uc3RhbnQgdGhhdCBoYXMgYmVlbiByZWJhc2VkIHdpdGggcmVzcGVjdCB0byBhCisvLy8gYmFzZSBjb25zdGFudC4gVGhlIGRpZmZlcmVuY2UgdG8gdGhlIGJhc2UgY29uc3RhbnQgaXMgcmVjb3JkZWQgaW4gT2Zmc2V0Lgorc3RydWN0IFJlYmFzZWRDb25zdGFudEluZm8geworICBDb25zdGFudFVzZUxpc3RUeXBlIFVzZXM7CisgIENvbnN0YW50ICpPZmZzZXQ7CisKKyAgUmViYXNlZENvbnN0YW50SW5mbyhDb25zdGFudFVzZUxpc3RUeXBlICYmVXNlcywgQ29uc3RhbnQgKk9mZnNldCkKKyAgICA6IFVzZXMoc3RkOjptb3ZlKFVzZXMpKSwgT2Zmc2V0KE9mZnNldCkge30KK307CisKK3VzaW5nIFJlYmFzZWRDb25zdGFudExpc3RUeXBlID0gU21hbGxWZWN0b3I8UmViYXNlZENvbnN0YW50SW5mbywgND47CisKKy8vLyBcYnJpZWYgQSBiYXNlIGNvbnN0YW50IGFuZCBhbGwgaXRzIHJlYmFzZWQgY29uc3RhbnRzLgorc3RydWN0IENvbnN0YW50SW5mbyB7CisgIENvbnN0YW50SW50ICpCYXNlQ29uc3RhbnQ7CisgIFJlYmFzZWRDb25zdGFudExpc3RUeXBlIFJlYmFzZWRDb25zdGFudHM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgY29uc3Rob2lzdAorCitjbGFzcyBDb25zdGFudEhvaXN0aW5nUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPENvbnN0YW50SG9pc3RpbmdQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKKworICAvLyBHbHVlIGZvciBvbGQgUE0uCisgIGJvb2wgcnVuSW1wbChGdW5jdGlvbiAmRiwgVGFyZ2V0VHJhbnNmb3JtSW5mbyAmVFRJLCBEb21pbmF0b3JUcmVlICZEVCwKKyAgICAgICAgICAgICAgIEJsb2NrRnJlcXVlbmN5SW5mbyAqQkZJLCBCYXNpY0Jsb2NrICZFbnRyeSk7CisKKyAgdm9pZCByZWxlYXNlTWVtb3J5KCkgeworICAgIENvbnN0YW50VmVjLmNsZWFyKCk7CisgICAgQ2xvbmVkQ2FzdE1hcC5jbGVhcigpOworICAgIENvbnN0Q2FuZFZlYy5jbGVhcigpOworICB9CisKK3ByaXZhdGU6CisgIHVzaW5nIENvbnN0Q2FuZE1hcFR5cGUgPSBEZW5zZU1hcDxDb25zdGFudEludCAqLCB1bnNpZ25lZD47CisgIHVzaW5nIENvbnN0Q2FuZFZlY1R5cGUgPSBzdGQ6OnZlY3Rvcjxjb25zdGhvaXN0OjpDb25zdGFudENhbmRpZGF0ZT47CisKKyAgY29uc3QgVGFyZ2V0VHJhbnNmb3JtSW5mbyAqVFRJOworICBEb21pbmF0b3JUcmVlICpEVDsKKyAgQmxvY2tGcmVxdWVuY3lJbmZvICpCRkk7CisgIEJhc2ljQmxvY2sgKkVudHJ5OworCisgIC8vLyBLZWVwcyB0cmFjayBvZiBjb25zdGFudCBjYW5kaWRhdGVzIGZvdW5kIGluIHRoZSBmdW5jdGlvbi4KKyAgQ29uc3RDYW5kVmVjVHlwZSBDb25zdENhbmRWZWM7CisKKyAgLy8vIEtlZXAgdHJhY2sgb2YgY2FzdCBpbnN0cnVjdGlvbnMgd2UgYWxyZWFkeSBjbG9uZWQuCisgIFNtYWxsRGVuc2VNYXA8SW5zdHJ1Y3Rpb24gKiwgSW5zdHJ1Y3Rpb24gKj4gQ2xvbmVkQ2FzdE1hcDsKKworICAvLy8gVGhlc2UgYXJlIHRoZSBmaW5hbCBjb25zdGFudHMgd2UgZGVjaWRlZCB0byBob2lzdC4KKyAgU21hbGxWZWN0b3I8Y29uc3Rob2lzdDo6Q29uc3RhbnRJbmZvLCA4PiBDb25zdGFudFZlYzsKKworICBJbnN0cnVjdGlvbiAqZmluZE1hdEluc2VydFB0KEluc3RydWN0aW9uICpJbnN0LCB1bnNpZ25lZCBJZHggPSB+MFUpIGNvbnN0OworICBTbWFsbFB0clNldDxJbnN0cnVjdGlvbiAqLCA4PgorICBmaW5kQ29uc3RhbnRJbnNlcnRpb25Qb2ludChjb25zdCBjb25zdGhvaXN0OjpDb25zdGFudEluZm8gJkNvbnN0SW5mbykgY29uc3Q7CisgIHZvaWQgY29sbGVjdENvbnN0YW50Q2FuZGlkYXRlcyhDb25zdENhbmRNYXBUeXBlICZDb25zdENhbmRNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zdCwgdW5zaWduZWQgSWR4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RhbnRJbnQgKkNvbnN0SW50KTsKKyAgdm9pZCBjb2xsZWN0Q29uc3RhbnRDYW5kaWRhdGVzKENvbnN0Q2FuZE1hcFR5cGUgJkNvbnN0Q2FuZE1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpJbnN0LCB1bnNpZ25lZCBJZHgpOworICB2b2lkIGNvbGxlY3RDb25zdGFudENhbmRpZGF0ZXMoQ29uc3RDYW5kTWFwVHlwZSAmQ29uc3RDYW5kTWFwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkluc3QpOworICB2b2lkIGNvbGxlY3RDb25zdGFudENhbmRpZGF0ZXMoRnVuY3Rpb24gJkZuKTsKKyAgdm9pZCBmaW5kQW5kTWFrZUJhc2VDb25zdGFudChDb25zdENhbmRWZWNUeXBlOjppdGVyYXRvciBTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0Q2FuZFZlY1R5cGU6Oml0ZXJhdG9yIEUpOworICB1bnNpZ25lZCBtYXhpbWl6ZUNvbnN0YW50c0luUmFuZ2UoQ29uc3RDYW5kVmVjVHlwZTo6aXRlcmF0b3IgUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0Q2FuZFZlY1R5cGU6Oml0ZXJhdG9yIEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdENhbmRWZWNUeXBlOjppdGVyYXRvciAmTWF4Q29zdEl0cik7CisgIHZvaWQgZmluZEJhc2VDb25zdGFudHMoKTsKKyAgdm9pZCBlbWl0QmFzZUNvbnN0YW50cyhJbnN0cnVjdGlvbiAqQmFzZSwgQ29uc3RhbnQgKk9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjb25zdGhvaXN0OjpDb25zdGFudFVzZXIgJkNvbnN0VXNlcik7CisgIGJvb2wgZW1pdEJhc2VDb25zdGFudHMoKTsKKyAgdm9pZCBkZWxldGVEZWFkQ2FzdEluc3QoKSBjb25zdDsKKyAgYm9vbCBvcHRpbWl6ZUNvbnN0YW50cyhGdW5jdGlvbiAmRm4pOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfQ09OU1RBTlRIT0lTVElOR19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0NvcnJlbGF0ZWRWYWx1ZVByb3BhZ2F0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0NvcnJlbGF0ZWRWYWx1ZVByb3BhZ2F0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA5MzA2OQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvQ29ycmVsYXRlZFZhbHVlUHJvcGFnYXRpb24uaApAQCAtMCwwICsxLDI2IEBACisvLz09PS0gQ29ycmVsYXRlZFZhbHVlUHJvcGFnYXRpb24uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfQ09SUkVMQVRFRFZBTFVFUFJPUEFHQVRJT05fSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0NPUlJFTEFURURWQUxVRVBST1BBR0FUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKKworc3RydWN0IENvcnJlbGF0ZWRWYWx1ZVByb3BhZ2F0aW9uUGFzcworICAgIDogUGFzc0luZm9NaXhpbjxDb3JyZWxhdGVkVmFsdWVQcm9wYWdhdGlvblBhc3M+IHsKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfQ09SUkVMQVRFRFZBTFVFUFJPUEFHQVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9EQ0UuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvRENFLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczMzQ2YwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvRENFLmgKQEAgLTAsMCArMSwyOSBAQAorLy89PT0tIERDRS5oIC0gRGVhZCBjb2RlIGVsaW1pbmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIGludGVyZmFjZSBmb3IgdGhlIERlYWQgQ29kZSBFbGltaW5hdGlvbiBwYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9EQ0VfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0RDRV9ICisKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBCYXNpYyBEZWFkIENvZGUgRWxpbWluYXRpb24gcGFzcy4KK2NsYXNzIERDRVBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxEQ0VQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307Cit9CisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0RDRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0RlYWRTdG9yZUVsaW1pbmF0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0RlYWRTdG9yZUVsaW1pbmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2ZlYjIxOAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvRGVhZFN0b3JlRWxpbWluYXRpb24uaApAQCAtMCwwICsxLDM2IEBACisvLz09PS0gRGVhZFN0b3JlRWxpbWluYXRpb24uaCAtIEZhc3QgRGVhZCBTdG9yZSBFbGltaW5hdGlvbiAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBpbXBsZW1lbnRzIGEgdHJpdmlhbCBkZWFkIHN0b3JlIGVsaW1pbmF0aW9uIHRoYXQgb25seSBjb25zaWRlcnMKKy8vIGJhc2ljLWJsb2NrIGxvY2FsIHJlZHVuZGFudCBzdG9yZXMuCisvLworLy8gRklYTUU6IFRoaXMgc2hvdWxkIGV2ZW50dWFsbHkgYmUgZXh0ZW5kZWQgdG8gYmUgYSBwb3N0LWRvbWluYXRvciB0cmVlCisvLyB0cmF2ZXJzYWwuICBEb2luZyBzbyB3b3VsZCBiZSBwcmV0dHkgdHJpdmlhbC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfREVBRFNUT1JFRUxJTUlOQVRJT05fSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0RFQURTVE9SRUVMSU1JTkFUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKKworLy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHRyaXZpYWwgZGVhZCBzdG9yZSBlbGltaW5hdGlvbi4gV2UgY29uc2lkZXIKKy8vLyBvbmx5IHRoZSByZWR1bmRhbnQgc3RvcmVzIHRoYXQgYXJlIGxvY2FsIHRvIGEgc2luZ2xlIEJhc2ljIEJsb2NrLgorY2xhc3MgRFNFUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPERTRVBhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmRkFNKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0RFQURTVE9SRUVMSU1JTkFUSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvRGl2UmVtUGFpcnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvRGl2UmVtUGFpcnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTQzNDZmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9EaXZSZW1QYWlycy5oCkBAIC0wLDAgKzEsMzEgQEAKKy8vPT09LSBEaXZSZW1QYWlycy5oIC0gSG9pc3QvZGVjb21wb3NlIGludGVnZXIgZGl2aXNpb24gYW5kIHJlbWFpbmRlciAtLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIGhvaXN0cyBhbmQvb3IgZGVjb21wb3NlcyBpbnRlZ2VyIGRpdmlzaW9uIGFuZCByZW1haW5kZXIKKy8vIGluc3RydWN0aW9ucyB0byBlbmFibGUgQ0ZHIGltcHJvdmVtZW50cyBhbmQgYmV0dGVyIGNvZGVnZW4uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0RJVlJFTVBBSVJTX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9ESVZSRU1QQUlSU19ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEhvaXN0L2RlY29tcG9zZSBpbnRlZ2VyIGRpdmlzaW9uIGFuZCByZW1haW5kZXIgaW5zdHJ1Y3Rpb25zIHRvIGVuYWJsZSBDRkcKKy8vLyBpbXByb3ZlbWVudHMgYW5kIGJldHRlciBjb2RlZ2VuLgorc3RydWN0IERpdlJlbVBhaXJzUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPERpdlJlbVBhaXJzUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICYpOworfTsKKworfQorI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfRElWUkVNUEFJUlNfSAorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0Vhcmx5Q1NFLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0Vhcmx5Q1NFLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGNhM2IyZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvRWFybHlDU0UuaApAQCAtMCwwICsxLDQyIEBACisvLz09PS0gRWFybHlDU0UuaCAtIFNpbXBsZSBhbmQgZmFzdCBDU0UgcGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vLyBcZmlsZQorLy8vIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIGZvciBhIHNpbXBsZSwgZmFzdCBDU0UgcGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfRUFSTFlDU0VfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0VBUkxZQ1NFX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKKworLy8vIFxicmllZiBBIHNpbXBsZSBhbmQgZmFzdCBkb210cmVlLWJhc2VkIENTRSBwYXNzLgorLy8vCisvLy8gVGhpcyBwYXNzIGRvZXMgYSBzaW1wbGUgZGVwdGgtZmlyc3Qgd2FsayBvdmVyIHRoZSBkb21pbmF0b3IgdHJlZSwKKy8vLyBlbGltaW5hdGluZyB0cml2aWFsbHkgcmVkdW5kYW50IGluc3RydWN0aW9ucyBhbmQgdXNpbmcgaW5zdHNpbXBsaWZ5IHRvCisvLy8gY2Fub25pY2FsaXplIHRoaW5ncyBhcyBpdCBnb2VzLiBJdCBpcyBpbnRlbmRlZCB0byBiZSBmYXN0IGFuZCBjYXRjaCBvYnZpb3VzCisvLy8gY2FzZXMgc28gdGhhdCBpbnN0Y29tYmluZSBhbmQgb3RoZXIgcGFzc2VzIGFyZSBtb3JlIGVmZmVjdGl2ZS4gSXQgaXMKKy8vLyBleHBlY3RlZCB0aGF0IGEgbGF0ZXIgcGFzcyBvZiBHVk4gd2lsbCBjYXRjaCB0aGUgaW50ZXJlc3RpbmcvaGFyZCBjYXNlcy4KK3N0cnVjdCBFYXJseUNTRVBhc3MgOiBQYXNzSW5mb01peGluPEVhcmx5Q1NFUGFzcz4geworICBFYXJseUNTRVBhc3MoYm9vbCBVc2VNZW1vcnlTU0EgPSBmYWxzZSkgOiBVc2VNZW1vcnlTU0EoVXNlTWVtb3J5U1NBKSB7fQorCisgIC8vLyBcYnJpZWYgUnVuIHRoZSBwYXNzIG92ZXIgdGhlIGZ1bmN0aW9uLgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7CisKKyAgYm9vbCBVc2VNZW1vcnlTU0E7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9FQVJMWUNTRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0Zsb2F0MkludC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9GbG9hdDJJbnQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMDZlZTk4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9GbG9hdDJJbnQuaApAQCAtMCwwICsxLDUxIEBACisvLz09PS0tIEZsb2F0MkludC5oIC0gRGVtb3RlIGZsb2F0aW5nIHBvaW50IG9wcyB0byB3b3JrIG9uIGludGVnZXJzIC0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgRmxvYXQySW50IHBhc3MsIHdoaWNoIGFpbXMgdG8gZGVtb3RlIGZsb2F0aW5nCisvLyBwb2ludCBvcGVyYXRpb25zIHRvIHdvcmsgb24gaW50ZWdlcnMsIHdoZXJlIHRoYXQgaXMgbG9zc2xlc3NseSBwb3NzaWJsZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfRkxPQVQySU5UX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9GTE9BVDJJTlRfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRXF1aXZhbGVuY2VDbGFzc2VzLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvTWFwVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Db25zdGFudFJhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgRmxvYXQySW50UGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPEZsb2F0MkludFBhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworCisgIC8vIEdsdWUgZm9yIG9sZCBQTS4KKyAgYm9vbCBydW5JbXBsKEZ1bmN0aW9uICZGKTsKKworcHJpdmF0ZToKKyAgdm9pZCBmaW5kUm9vdHMoRnVuY3Rpb24gJkYsIFNtYWxsUHRyU2V0PEluc3RydWN0aW9uICosIDg+ICZSb290cyk7CisgIHZvaWQgc2VlbihJbnN0cnVjdGlvbiAqSSwgQ29uc3RhbnRSYW5nZSBSKTsKKyAgQ29uc3RhbnRSYW5nZSBiYWRSYW5nZSgpOworICBDb25zdGFudFJhbmdlIHVua25vd25SYW5nZSgpOworICBDb25zdGFudFJhbmdlIHZhbGlkYXRlUmFuZ2UoQ29uc3RhbnRSYW5nZSBSKTsKKyAgdm9pZCB3YWxrQmFja3dhcmRzKGNvbnN0IFNtYWxsUHRyU2V0SW1wbDxJbnN0cnVjdGlvbiAqPiAmUm9vdHMpOworICB2b2lkIHdhbGtGb3J3YXJkcygpOworICBib29sIHZhbGlkYXRlQW5kVHJhbnNmb3JtKCk7CisgIFZhbHVlICpjb252ZXJ0KEluc3RydWN0aW9uICpJLCBUeXBlICpUb1R5KTsKKyAgdm9pZCBjbGVhbnVwKCk7CisKKyAgTWFwVmVjdG9yPEluc3RydWN0aW9uICosIENvbnN0YW50UmFuZ2U+IFNlZW5JbnN0czsKKyAgU21hbGxQdHJTZXQ8SW5zdHJ1Y3Rpb24gKiwgOD4gUm9vdHM7CisgIEVxdWl2YWxlbmNlQ2xhc3NlczxJbnN0cnVjdGlvbiAqPiBFQ3M7CisgIE1hcFZlY3RvcjxJbnN0cnVjdGlvbiAqLCBWYWx1ZSAqPiBDb252ZXJ0ZWRJbnN0czsKKyAgTExWTUNvbnRleHQgKkN0eDsKK307Cit9CisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9GTE9BVDJJTlRfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9HVk4uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvR1ZOLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDQwZDNmNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvR1ZOLmgKQEAgLTAsMCArMSwzMTAgQEAKKy8vPT09LSBHVk4uaCAtIEVsaW1pbmF0ZSByZWR1bmRhbnQgdmFsdWVzIGFuZCBsb2FkcyAtLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIGludGVyZmFjZSBmb3IgTExWTSdzIEdsb2JhbCBWYWx1ZSBOdW1iZXJpbmcgcGFzcworLy8vIHdoaWNoIGVsaW1pbmF0ZXMgZnVsbHkgcmVkdW5kYW50IGluc3RydWN0aW9ucy4gSXQgYWxzbyBkb2VzIHNvbWV3aGF0IEFkLUhvYworLy8vIFBSRSBhbmQgZGVhZCBsb2FkIGVsaW1pbmF0aW9uLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfR1ZOX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9HVk5fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9NYXBWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qb3N0T3JkZXJJdGVyYXRvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9NZW1vcnlEZXBlbmRlbmNlQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RyVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9PcmRlcmVkSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBc3N1bXB0aW9uQ2FjaGU7CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgQnJhbmNoSW5zdDsKK2NsYXNzIENhbGxJbnN0OworY2xhc3MgQ29uc3RhbnQ7CitjbGFzcyBFeHRyYWN0VmFsdWVJbnN0OworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBGdW5jdGlvblBhc3M7CitjbGFzcyBJbnRyaW5zaWNJbnN0OworY2xhc3MgTG9hZEluc3Q7CitjbGFzcyBMb29wSW5mbzsKK2NsYXNzIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXI7CitjbGFzcyBQSElOb2RlOworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CitjbGFzcyBWYWx1ZTsKKworLy8vIEEgcHJpdmF0ZSAibW9kdWxlIiBuYW1lc3BhY2UgZm9yIHR5cGVzIGFuZCB1dGlsaXRpZXMgdXNlZCBieSBHVk4uIFRoZXNlCisvLy8gYXJlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBjbGllbnRzLgorbmFtZXNwYWNlIGd2biBMTFZNX0xJQlJBUllfVklTSUJJTElUWSB7CisKK3N0cnVjdCBBdmFpbGFibGVWYWx1ZTsKK3N0cnVjdCBBdmFpbGFibGVWYWx1ZUluQmxvY2s7CitjbGFzcyBHVk5MZWdhY3lQYXNzOworCit9IC8vIGVuZCBuYW1lc3BhY2UgZ3ZuCisKKy8vLyBUaGUgY29yZSBHVk4gcGFzcyBvYmplY3QuCisvLy8KKy8vLyBGSVhNRTogV2Ugc2hvdWxkIGhhdmUgYSBnb29kIHN1bW1hcnkgb2YgdGhlIEdWTiBhbGdvcml0aG0gaW1wbGVtZW50ZWQgYnkKKy8vLyB0aGlzIHBhcnRpY3VsYXIgcGFzcyBoZXJlLgorY2xhc3MgR1ZOIDogcHVibGljIFBhc3NJbmZvTWl4aW48R1ZOPiB7CitwdWJsaWM6CisgIHN0cnVjdCBFeHByZXNzaW9uOworCisgIC8vLyBcYnJpZWYgUnVuIHRoZSBwYXNzIG92ZXIgdGhlIGZ1bmN0aW9uLgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7CisKKyAgLy8vIFRoaXMgcmVtb3ZlcyB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIGZyb20KKyAgLy8vIG91ciB2YXJpb3VzIG1hcHMgYW5kIG1hcmtzIGl0IGZvciBkZWxldGlvbi4KKyAgdm9pZCBtYXJrSW5zdHJ1Y3Rpb25Gb3JEZWxldGlvbihJbnN0cnVjdGlvbiAqSSkgeworICAgIFZOLmVyYXNlKEkpOworICAgIEluc3Ryc1RvRXJhc2UucHVzaF9iYWNrKEkpOworICB9CisKKyAgRG9taW5hdG9yVHJlZSAmZ2V0RG9taW5hdG9yVHJlZSgpIGNvbnN0IHsgcmV0dXJuICpEVDsgfQorICBBbGlhc0FuYWx5c2lzICpnZXRBbGlhc0FuYWx5c2lzKCkgY29uc3QgeyByZXR1cm4gVk4uZ2V0QWxpYXNBbmFseXNpcygpOyB9CisgIE1lbW9yeURlcGVuZGVuY2VSZXN1bHRzICZnZXRNZW1EZXAoKSBjb25zdCB7IHJldHVybiAqTUQ7IH0KKworICAvLy8gVGhpcyBjbGFzcyBob2xkcyB0aGUgbWFwcGluZyBiZXR3ZWVuIHZhbHVlcyBhbmQgdmFsdWUgbnVtYmVycy4gIEl0IGlzIHVzZWQKKyAgLy8vIGFzIGFuIGVmZmljaWVudCBtZWNoYW5pc20gdG8gZGV0ZXJtaW5lIHRoZSBleHByZXNzaW9uLXdpc2UgZXF1aXZhbGVuY2Ugb2YKKyAgLy8vIHR3byB2YWx1ZXMuCisgIGNsYXNzIFZhbHVlVGFibGUgeworICAgIERlbnNlTWFwPFZhbHVlICosIHVpbnQzMl90PiB2YWx1ZU51bWJlcmluZzsKKyAgICBEZW5zZU1hcDxFeHByZXNzaW9uLCB1aW50MzJfdD4gZXhwcmVzc2lvbk51bWJlcmluZzsKKworICAgIC8vIEV4cHJlc3Npb25zIGlzIHRoZSB2ZWN0b3Igb2YgRXhwcmVzc2lvbi4gRXhwcklkeCBpcyB0aGUgbWFwcGluZyBmcm9tCisgICAgLy8gdmFsdWUgbnVtYmVyIHRvIHRoZSBpbmRleCBvZiBFeHByZXNzaW9uIGluIEV4cHJlc3Npb25zLiBXZSB1c2UgaXQKKyAgICAvLyBpbnN0ZWFkIG9mIGEgRGVuc2VNYXAgYmVjYXVzZSBmaWxsaW5nIHN1Y2ggbWFwcGluZyBpcyBmYXN0ZXIgdGhhbgorICAgIC8vIGZpbGxpbmcgYSBEZW5zZU1hcCBhbmQgdGhlIGNvbXBpbGUgdGltZSBpcyBhIGxpdHRsZSBiZXR0ZXIuCisgICAgdWludDMyX3QgbmV4dEV4cHJOdW1iZXI7CisKKyAgICBzdGQ6OnZlY3RvcjxFeHByZXNzaW9uPiBFeHByZXNzaW9uczsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50MzJfdD4gRXhwcklkeDsKKworICAgIC8vIFZhbHVlIG51bWJlciB0byBQSElOb2RlIG1hcHBpbmcuIFVzZWQgZm9yIHBoaS10cmFuc2xhdGUgaW4gc2NhbGFycHJlLgorICAgIERlbnNlTWFwPHVpbnQzMl90LCBQSElOb2RlICo+IE51bWJlcmluZ1BoaTsKKworICAgIC8vIENhY2hlIGZvciBwaGktdHJhbnNsYXRlIGluIHNjYWxhcnByZS4KKyAgICB1c2luZyBQaGlUcmFuc2xhdGVNYXAgPQorICAgICAgICBEZW5zZU1hcDxzdGQ6OnBhaXI8dWludDMyX3QsIGNvbnN0IEJhc2ljQmxvY2sgKj4sIHVpbnQzMl90PjsKKyAgICBQaGlUcmFuc2xhdGVNYXAgUGhpVHJhbnNsYXRlVGFibGU7CisKKyAgICBBbGlhc0FuYWx5c2lzICpBQTsKKyAgICBNZW1vcnlEZXBlbmRlbmNlUmVzdWx0cyAqTUQ7CisgICAgRG9taW5hdG9yVHJlZSAqRFQ7CisKKyAgICB1aW50MzJfdCBuZXh0VmFsdWVOdW1iZXIgPSAxOworCisgICAgRXhwcmVzc2lvbiBjcmVhdGVFeHByKEluc3RydWN0aW9uICpJKTsKKyAgICBFeHByZXNzaW9uIGNyZWF0ZUNtcEV4cHIodW5zaWduZWQgT3Bjb2RlLCBDbXBJbnN0OjpQcmVkaWNhdGUgUHJlZGljYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTKTsKKyAgICBFeHByZXNzaW9uIGNyZWF0ZUV4dHJhY3R2YWx1ZUV4cHIoRXh0cmFjdFZhbHVlSW5zdCAqRUkpOworICAgIHVpbnQzMl90IGxvb2t1cE9yQWRkQ2FsbChDYWxsSW5zdCAqQyk7CisgICAgdWludDMyX3QgcGhpVHJhbnNsYXRlSW1wbChjb25zdCBCYXNpY0Jsb2NrICpCQiwgY29uc3QgQmFzaWNCbG9jayAqUGhpQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBOdW0sIEdWTiAmR3ZuKTsKKyAgICBzdGQ6OnBhaXI8dWludDMyX3QsIGJvb2w+IGFzc2lnbkV4cE5ld1ZhbHVlTnVtKEV4cHJlc3Npb24gJmV4cCk7CisgICAgYm9vbCBhcmVBbGxWYWxzSW5CQih1aW50MzJfdCBudW0sIGNvbnN0IEJhc2ljQmxvY2sgKkJCLCBHVk4gJkd2bik7CisKKyAgcHVibGljOgorICAgIFZhbHVlVGFibGUoKTsKKyAgICBWYWx1ZVRhYmxlKGNvbnN0IFZhbHVlVGFibGUgJkFyZyk7CisgICAgVmFsdWVUYWJsZShWYWx1ZVRhYmxlICYmQXJnKTsKKyAgICB+VmFsdWVUYWJsZSgpOworCisgICAgdWludDMyX3QgbG9va3VwT3JBZGQoVmFsdWUgKlYpOworICAgIHVpbnQzMl90IGxvb2t1cChWYWx1ZSAqViwgYm9vbCBWZXJpZnkgPSB0cnVlKSBjb25zdDsKKyAgICB1aW50MzJfdCBsb29rdXBPckFkZENtcCh1bnNpZ25lZCBPcGNvZGUsIENtcEluc3Q6OlByZWRpY2F0ZSBQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpMSFMsIFZhbHVlICpSSFMpOworICAgIHVpbnQzMl90IHBoaVRyYW5zbGF0ZShjb25zdCBCYXNpY0Jsb2NrICpCQiwgY29uc3QgQmFzaWNCbG9jayAqUGhpQmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IE51bSwgR1ZOICZHdm4pOworICAgIHZvaWQgZXJhc2VUcmFuc2xhdGVDYWNoZUVudHJ5KHVpbnQzMl90IE51bSwgY29uc3QgQmFzaWNCbG9jayAmQ3VyckJsb2NrKTsKKyAgICBib29sIGV4aXN0cyhWYWx1ZSAqVikgY29uc3Q7CisgICAgdm9pZCBhZGQoVmFsdWUgKlYsIHVpbnQzMl90IG51bSk7CisgICAgdm9pZCBjbGVhcigpOworICAgIHZvaWQgZXJhc2UoVmFsdWUgKnYpOworICAgIHZvaWQgc2V0QWxpYXNBbmFseXNpcyhBbGlhc0FuYWx5c2lzICpBKSB7IEFBID0gQTsgfQorICAgIEFsaWFzQW5hbHlzaXMgKmdldEFsaWFzQW5hbHlzaXMoKSBjb25zdCB7IHJldHVybiBBQTsgfQorICAgIHZvaWQgc2V0TWVtRGVwKE1lbW9yeURlcGVuZGVuY2VSZXN1bHRzICpNKSB7IE1EID0gTTsgfQorICAgIHZvaWQgc2V0RG9tVHJlZShEb21pbmF0b3JUcmVlICpEKSB7IERUID0gRDsgfQorICAgIHVpbnQzMl90IGdldE5leHRVbnVzZWRWYWx1ZU51bWJlcigpIHsgcmV0dXJuIG5leHRWYWx1ZU51bWJlcjsgfQorICAgIHZvaWQgdmVyaWZ5UmVtb3ZlZChjb25zdCBWYWx1ZSAqKSBjb25zdDsKKyAgfTsKKworcHJpdmF0ZToKKyAgZnJpZW5kIGNsYXNzIGd2bjo6R1ZOTGVnYWN5UGFzczsKKyAgZnJpZW5kIHN0cnVjdCBEZW5zZU1hcEluZm88RXhwcmVzc2lvbj47CisKKyAgTWVtb3J5RGVwZW5kZW5jZVJlc3VsdHMgKk1EOworICBEb21pbmF0b3JUcmVlICpEVDsKKyAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSTsKKyAgQXNzdW1wdGlvbkNhY2hlICpBQzsKKyAgU2V0VmVjdG9yPEJhc2ljQmxvY2sgKj4gRGVhZEJsb2NrczsKKyAgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciAqT1JFOworICAvLyBNYXBzIGEgYmxvY2sgdG8gdGhlIHRvcG1vc3QgaW5zdHJ1Y3Rpb24gd2l0aCBpbXBsaWNpdCBjb250cm9sIGZsb3cgaW4gaXQuCisgIERlbnNlTWFwPGNvbnN0IEJhc2ljQmxvY2sgKiwgY29uc3QgSW5zdHJ1Y3Rpb24gKj4KKyAgICAgIEZpcnN0SW1wbGljaXRDb250cm9sRmxvd0luc3RzOworCisgIE9yZGVyZWRJbnN0cnVjdGlvbnMgKk9JOworICBWYWx1ZVRhYmxlIFZOOworCisgIC8vLyBBIG1hcHBpbmcgZnJvbSB2YWx1ZSBudW1iZXJzIHRvIGxpc3RzIG9mIFZhbHVlKidzIHRoYXQKKyAgLy8vIGhhdmUgdGhhdCB2YWx1ZSBudW1iZXIuICBVc2UgZmluZExlYWRlciB0byBxdWVyeSBpdC4KKyAgc3RydWN0IExlYWRlclRhYmxlRW50cnkgeworICAgIFZhbHVlICpWYWw7CisgICAgY29uc3QgQmFzaWNCbG9jayAqQkI7CisgICAgTGVhZGVyVGFibGVFbnRyeSAqTmV4dDsKKyAgfTsKKyAgRGVuc2VNYXA8dWludDMyX3QsIExlYWRlclRhYmxlRW50cnk+IExlYWRlclRhYmxlOworICBCdW1wUHRyQWxsb2NhdG9yIFRhYmxlQWxsb2NhdG9yOworCisgIC8vIEJsb2NrLWxvY2FsIG1hcCBvZiBlcXVpdmFsZW50IHZhbHVlcyB0byB0aGVpciBsZWFkZXIsIGRvZXMgbm90CisgIC8vIHByb3BhZ2F0ZSB0byBhbnkgc3VjY2Vzc29ycy4gRW50cmllcyBhZGRlZCBtaWQtYmxvY2sgYXJlIGFwcGxpZWQKKyAgLy8gdG8gdGhlIHJlbWFpbmluZyBpbnN0cnVjdGlvbnMgaW4gdGhlIGJsb2NrLgorICBTbWFsbE1hcFZlY3RvcjxWYWx1ZSAqLCBDb25zdGFudCAqLCA0PiBSZXBsYWNlV2l0aENvbnN0TWFwOworICBTbWFsbFZlY3RvcjxJbnN0cnVjdGlvbiAqLCA4PiBJbnN0cnNUb0VyYXNlOworCisgIC8vIE1hcCB0aGUgYmxvY2sgdG8gcmV2ZXJzZWQgcG9zdG9yZGVyIHRyYXZlcnNhbCBudW1iZXIuIEl0IGlzIHVzZWQgdG8KKyAgLy8gZmluZCBiYWNrIGVkZ2UgZWFzaWx5LgorICBEZW5zZU1hcDxjb25zdCBCYXNpY0Jsb2NrICosIHVpbnQzMl90PiBCbG9ja1JQT051bWJlcjsKKworICB1c2luZyBMb2FkRGVwVmVjdCA9IFNtYWxsVmVjdG9yPE5vbkxvY2FsRGVwUmVzdWx0LCA2ND47CisgIHVzaW5nIEF2YWlsVmFsSW5CbGtWZWN0ID0gU21hbGxWZWN0b3I8Z3ZuOjpBdmFpbGFibGVWYWx1ZUluQmxvY2ssIDY0PjsKKyAgdXNpbmcgVW5hdmFpbEJsa1ZlY3QgPSBTbWFsbFZlY3RvcjxCYXNpY0Jsb2NrICosIDY0PjsKKworICBib29sIHJ1bkltcGwoRnVuY3Rpb24gJkYsIEFzc3VtcHRpb25DYWNoZSAmUnVuQUMsIERvbWluYXRvclRyZWUgJlJ1bkRULAorICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gJlJ1blRMSSwgQUFSZXN1bHRzICZSdW5BQSwKKyAgICAgICAgICAgICAgIE1lbW9yeURlcGVuZGVuY2VSZXN1bHRzICpSdW5NRCwgTG9vcEluZm8gKkxJLAorICAgICAgICAgICAgICAgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciAqT1JFKTsKKworICAvLy8gUHVzaCBhIG5ldyBWYWx1ZSB0byB0aGUgTGVhZGVyVGFibGUgb250byB0aGUgbGlzdCBmb3IgaXRzIHZhbHVlIG51bWJlci4KKyAgdm9pZCBhZGRUb0xlYWRlclRhYmxlKHVpbnQzMl90IE4sIFZhbHVlICpWLCBjb25zdCBCYXNpY0Jsb2NrICpCQikgeworICAgIExlYWRlclRhYmxlRW50cnkgJkN1cnIgPSBMZWFkZXJUYWJsZVtOXTsKKyAgICBpZiAoIUN1cnIuVmFsKSB7CisgICAgICBDdXJyLlZhbCA9IFY7CisgICAgICBDdXJyLkJCID0gQkI7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgTGVhZGVyVGFibGVFbnRyeSAqTm9kZSA9IFRhYmxlQWxsb2NhdG9yLkFsbG9jYXRlPExlYWRlclRhYmxlRW50cnk+KCk7CisgICAgTm9kZS0+VmFsID0gVjsKKyAgICBOb2RlLT5CQiA9IEJCOworICAgIE5vZGUtPk5leHQgPSBDdXJyLk5leHQ7CisgICAgQ3Vyci5OZXh0ID0gTm9kZTsKKyAgfQorCisgIC8vLyBTY2FuIHRoZSBsaXN0IG9mIHZhbHVlcyBjb3JyZXNwb25kaW5nIHRvIGEgZ2l2ZW4KKyAgLy8vIHZhbHVlIG51bWJlciwgYW5kIHJlbW92ZSB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gaWYgZW5jb3VudGVyZWQuCisgIHZvaWQgcmVtb3ZlRnJvbUxlYWRlclRhYmxlKHVpbnQzMl90IE4sIEluc3RydWN0aW9uICpJLCBCYXNpY0Jsb2NrICpCQikgeworICAgIExlYWRlclRhYmxlRW50cnkgKlByZXYgPSBudWxscHRyOworICAgIExlYWRlclRhYmxlRW50cnkgKkN1cnIgPSAmTGVhZGVyVGFibGVbTl07CisKKyAgICB3aGlsZSAoQ3VyciAmJiAoQ3Vyci0+VmFsICE9IEkgfHwgQ3Vyci0+QkIgIT0gQkIpKSB7CisgICAgICBQcmV2ID0gQ3VycjsKKyAgICAgIEN1cnIgPSBDdXJyLT5OZXh0OworICAgIH0KKworICAgIGlmICghQ3VycikKKyAgICAgIHJldHVybjsKKworICAgIGlmIChQcmV2KSB7CisgICAgICBQcmV2LT5OZXh0ID0gQ3Vyci0+TmV4dDsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKCFDdXJyLT5OZXh0KSB7CisgICAgICAgIEN1cnItPlZhbCA9IG51bGxwdHI7CisgICAgICAgIEN1cnItPkJCID0gbnVsbHB0cjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIExlYWRlclRhYmxlRW50cnkgKk5leHQgPSBDdXJyLT5OZXh0OworICAgICAgICBDdXJyLT5WYWwgPSBOZXh0LT5WYWw7CisgICAgICAgIEN1cnItPkJCID0gTmV4dC0+QkI7CisgICAgICAgIEN1cnItPk5leHQgPSBOZXh0LT5OZXh0OworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIExpc3Qgb2YgY3JpdGljYWwgZWRnZXMgdG8gYmUgc3BsaXQgYmV0d2VlbiBpdGVyYXRpb25zLgorICBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8VGVybWluYXRvckluc3QgKiwgdW5zaWduZWQ+LCA0PiB0b1NwbGl0OworCisgIC8vIEhlbHBlciBmdW5jdGlvbnMgb2YgcmVkdW5kYW50IGxvYWQgZWxpbWluYXRpb24KKyAgYm9vbCBwcm9jZXNzTG9hZChMb2FkSW5zdCAqTCk7CisgIGJvb2wgcHJvY2Vzc05vbkxvY2FsTG9hZChMb2FkSW5zdCAqTCk7CisgIGJvb2wgcHJvY2Vzc0Fzc3VtZUludHJpbnNpYyhJbnRyaW5zaWNJbnN0ICpJSSk7CisKKyAgLy8vIEdpdmVuIGEgbG9jYWwgZGVwZW5kZW5jeSAoRGVmIG9yIENsb2JiZXIpIGRldGVybWluZSBpZiBhIHZhbHVlIGlzCisgIC8vLyBhdmFpbGFibGUgZm9yIHRoZSBsb2FkLiAgUmV0dXJucyB0cnVlIGlmIGFuIHZhbHVlIGlzIGtub3duIHRvIGJlCisgIC8vLyBhdmFpbGFibGUgYW5kIHBvcHVsYXRlcyBSZXMuICBSZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KKyAgYm9vbCBBbmFseXplTG9hZEF2YWlsYWJpbGl0eShMb2FkSW5zdCAqTEksIE1lbURlcFJlc3VsdCBEZXBJbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpBZGRyZXNzLCBndm46OkF2YWlsYWJsZVZhbHVlICZSZXMpOworCisgIC8vLyBHaXZlbiBhIGxpc3Qgb2Ygbm9uLWxvY2FsIGRlcGVuZGVuY2llcywgZGV0ZXJtaW5lIGlmIGEgdmFsdWUgaXMKKyAgLy8vIGF2YWlsYWJsZSBmb3IgdGhlIGxvYWQgaW4gZWFjaCBzcGVjaWZpZWQgYmxvY2suICBJZiBpdCBpcywgYWRkIGl0IHRvCisgIC8vLyBWYWx1ZXNQZXJCbG9jay4gIElmIG5vdCwgYWRkIGl0IHRvIFVuYXZhaWxhYmxlQmxvY2tzLgorICB2b2lkIEFuYWx5emVMb2FkQXZhaWxhYmlsaXR5KExvYWRJbnN0ICpMSSwgTG9hZERlcFZlY3QgJkRlcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXZhaWxWYWxJbkJsa1ZlY3QgJlZhbHVlc1BlckJsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuYXZhaWxCbGtWZWN0ICZVbmF2YWlsYWJsZUJsb2Nrcyk7CisKKyAgYm9vbCBQZXJmb3JtTG9hZFBSRShMb2FkSW5zdCAqTEksIEF2YWlsVmFsSW5CbGtWZWN0ICZWYWx1ZXNQZXJCbG9jaywKKyAgICAgICAgICAgICAgICAgICAgICBVbmF2YWlsQmxrVmVjdCAmVW5hdmFpbGFibGVCbG9ja3MpOworCisgIC8vIE90aGVyIGhlbHBlciByb3V0aW5lcworICBib29sIHByb2Nlc3NJbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAqSSk7CisgIGJvb2wgcHJvY2Vzc0Jsb2NrKEJhc2ljQmxvY2sgKkJCKTsKKyAgdm9pZCBkdW1wKERlbnNlTWFwPHVpbnQzMl90LCBWYWx1ZSAqPiAmZCkgY29uc3Q7CisgIGJvb2wgaXRlcmF0ZU9uRnVuY3Rpb24oRnVuY3Rpb24gJkYpOworICBib29sIHBlcmZvcm1QUkUoRnVuY3Rpb24gJkYpOworICBib29sIHBlcmZvcm1TY2FsYXJQUkUoSW5zdHJ1Y3Rpb24gKkkpOworICBib29sIHBlcmZvcm1TY2FsYXJQUkVJbnNlcnRpb24oSW5zdHJ1Y3Rpb24gKkluc3RyLCBCYXNpY0Jsb2NrICpQcmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqQ3VyciwgdW5zaWduZWQgaW50IFZhbE5vKTsKKyAgVmFsdWUgKmZpbmRMZWFkZXIoY29uc3QgQmFzaWNCbG9jayAqQkIsIHVpbnQzMl90IG51bSk7CisgIHZvaWQgY2xlYW51cEdsb2JhbFNldHMoKTsKKyAgdm9pZCBmaWxsSW1wbGljaXRDb250cm9sRmxvd0luZm8oQmFzaWNCbG9jayAqQkIpOworICB2b2lkIHZlcmlmeVJlbW92ZWQoY29uc3QgSW5zdHJ1Y3Rpb24gKkkpIGNvbnN0OworICBib29sIHNwbGl0Q3JpdGljYWxFZGdlcygpOworICBCYXNpY0Jsb2NrICpzcGxpdENyaXRpY2FsRWRnZXMoQmFzaWNCbG9jayAqUHJlZCwgQmFzaWNCbG9jayAqU3VjYyk7CisgIGJvb2wgcmVwbGFjZU9wZXJhbmRzV2l0aENvbnN0cyhJbnN0cnVjdGlvbiAqSSkgY29uc3Q7CisgIGJvb2wgcHJvcGFnYXRlRXF1YWxpdHkoVmFsdWUgKkxIUywgVmFsdWUgKlJIUywgY29uc3QgQmFzaWNCbG9ja0VkZ2UgJlJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBEb21pbmF0ZXNCeUVkZ2UpOworICBib29sIHByb2Nlc3NGb2xkYWJsZUNvbmRCcihCcmFuY2hJbnN0ICpCSSk7CisgIHZvaWQgYWRkRGVhZEJsb2NrKEJhc2ljQmxvY2sgKkJCKTsKKyAgdm9pZCBhc3NpZ25WYWxOdW1Gb3JEZWFkQ29kZSgpOworICB2b2lkIGFzc2lnbkJsb2NrUlBPTnVtYmVyKEZ1bmN0aW9uICZGKTsKK307CisKKy8vLyBDcmVhdGUgYSBsZWdhY3kgR1ZOIHBhc3MuIFRoaXMgYWxzbyBhbGxvd3MgcGFyYW1ldGVyaXppbmcgd2hldGhlciBvciBub3QKKy8vLyBsb2FkcyBhcmUgZWxpbWluYXRlZCBieSB0aGUgcGFzcy4KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlR1ZOUGFzcyhib29sIE5vTG9hZHMgPSBmYWxzZSk7CisKKy8vLyBcYnJpZWYgQSBzaW1wbGUgYW5kIGZhc3QgZG9tdHJlZS1iYXNlZCBHVk4gcGFzcyB0byBob2lzdCBjb21tb24gZXhwcmVzc2lvbnMKKy8vLyBmcm9tIHNpYmxpbmcgYnJhbmNoZXMuCitzdHJ1Y3QgR1ZOSG9pc3RQYXNzIDogUGFzc0luZm9NaXhpbjxHVk5Ib2lzdFBhc3M+IHsKKyAgLy8vIFxicmllZiBSdW4gdGhlIHBhc3Mgb3ZlciB0aGUgZnVuY3Rpb24uCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBcYnJpZWYgVXNlcyBhbiAiaW52ZXJ0ZWQiIHZhbHVlIG51bWJlcmluZyB0byBkZWNpZGUgdGhlIHNpbWlsYXJpdHkgb2YKKy8vLyBleHByZXNzaW9ucyBhbmQgc2lua3Mgc2ltaWxhciBleHByZXNzaW9ucyBpbnRvIHN1Y2Nlc3NvcnMuCitzdHJ1Y3QgR1ZOU2lua1Bhc3MgOiBQYXNzSW5mb01peGluPEdWTlNpbmtQYXNzPiB7CisgIC8vLyBcYnJpZWYgUnVuIHRoZSBwYXNzIG92ZXIgdGhlIGZ1bmN0aW9uLgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9HVk5fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9HVk5FeHByZXNzaW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0dWTkV4cHJlc3Npb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWRhZTE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9HVk5FeHByZXNzaW9uLmgKQEAgLTAsMCArMSw2NjEgQEAKKy8vPT09LSBHVk5FeHByZXNzaW9uLmggLSBHVk4gRXhwcmVzc2lvbiBjbGFzc2VzIC0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8KKy8vLyBUaGUgaGVhZGVyIGZpbGUgZm9yIHRoZSBHVk4gcGFzcyB0aGF0IGNvbnRhaW5zIGV4cHJlc3Npb24gaGFuZGxpbmcKKy8vLyBjbGFzc2VzCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0dWTkVYUFJFU1NJT05fSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0dWTkVYUFJFU1NJT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvSGFzaGluZy5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yX3JhbmdlLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9NZW1vcnlTU0EuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NvbnN0YW50LmgiCisjaW5jbHVkZSAibGx2bS9JUi9JbnN0cnVjdGlvbnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0FsbG9jYXRvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BcnJheVJlY3ljbGVyLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8Y2Fzc2VydD4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDx1dGlsaXR5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBUeXBlOworCituYW1lc3BhY2UgR1ZORXhwcmVzc2lvbiB7CisKK2VudW0gRXhwcmVzc2lvblR5cGUgeworICBFVF9CYXNlLAorICBFVF9Db25zdGFudCwKKyAgRVRfVmFyaWFibGUsCisgIEVUX0RlYWQsCisgIEVUX1Vua25vd24sCisgIEVUX0Jhc2ljU3RhcnQsCisgIEVUX0Jhc2ljLAorICBFVF9BZ2dyZWdhdGVWYWx1ZSwKKyAgRVRfUGhpLAorICBFVF9NZW1vcnlTdGFydCwKKyAgRVRfQ2FsbCwKKyAgRVRfTG9hZCwKKyAgRVRfU3RvcmUsCisgIEVUX01lbW9yeUVuZCwKKyAgRVRfQmFzaWNFbmQKK307CisKK2NsYXNzIEV4cHJlc3Npb24geworcHJpdmF0ZToKKyAgRXhwcmVzc2lvblR5cGUgRVR5cGU7CisgIHVuc2lnbmVkIE9wY29kZTsKKyAgbXV0YWJsZSBoYXNoX2NvZGUgSGFzaFZhbCA9IDA7CisKK3B1YmxpYzoKKyAgRXhwcmVzc2lvbihFeHByZXNzaW9uVHlwZSBFVCA9IEVUX0Jhc2UsIHVuc2lnbmVkIE8gPSB+MlUpCisgICAgICA6IEVUeXBlKEVUKSwgT3Bjb2RlKE8pIHt9CisgIEV4cHJlc3Npb24oY29uc3QgRXhwcmVzc2lvbiAmKSA9IGRlbGV0ZTsKKyAgRXhwcmVzc2lvbiAmb3BlcmF0b3I9KGNvbnN0IEV4cHJlc3Npb24gJikgPSBkZWxldGU7CisgIHZpcnR1YWwgfkV4cHJlc3Npb24oKTsKKworICBzdGF0aWMgdW5zaWduZWQgZ2V0RW1wdHlLZXkoKSB7IHJldHVybiB+MFU7IH0KKyAgc3RhdGljIHVuc2lnbmVkIGdldFRvbWJzdG9uZUtleSgpIHsgcmV0dXJuIH4xVTsgfQorCisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBFeHByZXNzaW9uICZPdGhlcikgY29uc3QgeyByZXR1cm4gISgqdGhpcyA9PSBPdGhlcik7IH0KKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEV4cHJlc3Npb24gJk90aGVyKSBjb25zdCB7CisgICAgaWYgKGdldE9wY29kZSgpICE9IE90aGVyLmdldE9wY29kZSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGlmIChnZXRPcGNvZGUoKSA9PSBnZXRFbXB0eUtleSgpIHx8IGdldE9wY29kZSgpID09IGdldFRvbWJzdG9uZUtleSgpKQorICAgICAgcmV0dXJuIHRydWU7CisgICAgLy8gQ29tcGFyZSB0aGUgZXhwcmVzc2lvbiB0eXBlIGZvciBhbnl0aGluZyBidXQgbG9hZCBhbmQgc3RvcmUuCisgICAgLy8gRm9yIGxvYWQgYW5kIHN0b3JlIHdlIHNldCB0aGUgb3Bjb2RlIHRvIHplcm8gdG8gbWFrZSB0aGVtIGVxdWFsLgorICAgIGlmIChnZXRFeHByZXNzaW9uVHlwZSgpICE9IEVUX0xvYWQgJiYgZ2V0RXhwcmVzc2lvblR5cGUoKSAhPSBFVF9TdG9yZSAmJgorICAgICAgICBnZXRFeHByZXNzaW9uVHlwZSgpICE9IE90aGVyLmdldEV4cHJlc3Npb25UeXBlKCkpCisgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICByZXR1cm4gZXF1YWxzKE90aGVyKTsKKyAgfQorCisgIGhhc2hfY29kZSBnZXRDb21wdXRlZEhhc2goKSBjb25zdCB7CisgICAgLy8gSXQncyB0aGVvcmV0aWNhbGx5IHBvc3NpYmxlIGZvciBhIHRoaW5nIHRvIGhhc2ggdG8gemVyby4gIEluIHRoYXQgY2FzZSwKKyAgICAvLyB3ZSB3aWxsIGp1c3QgY29tcHV0ZSB0aGUgaGFzaCBhIGZldyBleHRyYSB0aW1lcywgd2hpY2ggaXMgbm8gd29yc2UgdGhhdAorICAgIC8vIHdlIGRpZCBiZWZvcmUsIHdoaWNoIHdhcyB0byBjb21wdXRlIGl0IGFsd2F5cy4KKyAgICBpZiAoc3RhdGljX2Nhc3Q8dW5zaWduZWQ+KEhhc2hWYWwpID09IDApCisgICAgICBIYXNoVmFsID0gZ2V0SGFzaFZhbHVlKCk7CisgICAgcmV0dXJuIEhhc2hWYWw7CisgIH0KKworICB2aXJ0dWFsIGJvb2wgZXF1YWxzKGNvbnN0IEV4cHJlc3Npb24gJk90aGVyKSBjb25zdCB7IHJldHVybiB0cnVlOyB9CisKKyAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIHR3byBleHByZXNzaW9ucyBhcmUgZXhhY3RseSB0aGUgc2FtZSwgaW5jbHVkaW5nIHRoZQorICAvLyBub3JtYWxseSBpZ25vcmVkIGZpZWxkcy4KKyAgdmlydHVhbCBib29sIGV4YWN0bHlFcXVhbHMoY29uc3QgRXhwcmVzc2lvbiAmT3RoZXIpIGNvbnN0IHsKKyAgICByZXR1cm4gZ2V0RXhwcmVzc2lvblR5cGUoKSA9PSBPdGhlci5nZXRFeHByZXNzaW9uVHlwZSgpICYmIGVxdWFscyhPdGhlcik7CisgIH0KKworICB1bnNpZ25lZCBnZXRPcGNvZGUoKSBjb25zdCB7IHJldHVybiBPcGNvZGU7IH0KKyAgdm9pZCBzZXRPcGNvZGUodW5zaWduZWQgb3Bjb2RlKSB7IE9wY29kZSA9IG9wY29kZTsgfQorICBFeHByZXNzaW9uVHlwZSBnZXRFeHByZXNzaW9uVHlwZSgpIGNvbnN0IHsgcmV0dXJuIEVUeXBlOyB9CisKKyAgLy8gV2UgZGVsaWJlcmF0ZWx5IGxlYXZlIHRoZSBleHByZXNzaW9uIHR5cGUgb3V0IG9mIHRoZSBoYXNoIHZhbHVlLgorICB2aXJ0dWFsIGhhc2hfY29kZSBnZXRIYXNoVmFsdWUoKSBjb25zdCB7IHJldHVybiBnZXRPcGNvZGUoKTsgfQorCisgIC8vIERlYnVnZ2luZyBzdXBwb3J0CisgIHZpcnR1YWwgdm9pZCBwcmludEludGVybmFsKHJhd19vc3RyZWFtICZPUywgYm9vbCBQcmludEVUeXBlKSBjb25zdCB7CisgICAgaWYgKFByaW50RVR5cGUpCisgICAgICBPUyA8PCAiZXR5cGUgPSAiIDw8IGdldEV4cHJlc3Npb25UeXBlKCkgPDwgIiwiOworICAgIE9TIDw8ICJvcGNvZGUgPSAiIDw8IGdldE9wY29kZSgpIDw8ICIsICI7CisgIH0KKworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICZPUykgY29uc3QgeworICAgIE9TIDw8ICJ7ICI7CisgICAgcHJpbnRJbnRlcm5hbChPUywgdHJ1ZSk7CisgICAgT1MgPDwgIn0iOworICB9CisKKyAgTExWTV9EVU1QX01FVEhPRCB2b2lkIGR1bXAoKSBjb25zdDsKK307CisKK2lubGluZSByYXdfb3N0cmVhbSAmb3BlcmF0b3I8PChyYXdfb3N0cmVhbSAmT1MsIGNvbnN0IEV4cHJlc3Npb24gJkUpIHsKKyAgRS5wcmludChPUyk7CisgIHJldHVybiBPUzsKK30KKworY2xhc3MgQmFzaWNFeHByZXNzaW9uIDogcHVibGljIEV4cHJlc3Npb24geworcHJpdmF0ZToKKyAgdXNpbmcgUmVjeWNsZXJUeXBlID0gQXJyYXlSZWN5Y2xlcjxWYWx1ZSAqPjsKKyAgdXNpbmcgUmVjeWNsZXJDYXBhY2l0eSA9IFJlY3ljbGVyVHlwZTo6Q2FwYWNpdHk7CisKKyAgVmFsdWUgKipPcGVyYW5kcyA9IG51bGxwdHI7CisgIHVuc2lnbmVkIE1heE9wZXJhbmRzOworICB1bnNpZ25lZCBOdW1PcGVyYW5kcyA9IDA7CisgIFR5cGUgKlZhbHVlVHlwZSA9IG51bGxwdHI7CisKK3B1YmxpYzoKKyAgQmFzaWNFeHByZXNzaW9uKHVuc2lnbmVkIE51bU9wZXJhbmRzKQorICAgICAgOiBCYXNpY0V4cHJlc3Npb24oTnVtT3BlcmFuZHMsIEVUX0Jhc2ljKSB7fQorICBCYXNpY0V4cHJlc3Npb24odW5zaWduZWQgTnVtT3BlcmFuZHMsIEV4cHJlc3Npb25UeXBlIEVUKQorICAgICAgOiBFeHByZXNzaW9uKEVUKSwgTWF4T3BlcmFuZHMoTnVtT3BlcmFuZHMpIHt9CisgIEJhc2ljRXhwcmVzc2lvbigpID0gZGVsZXRlOworICBCYXNpY0V4cHJlc3Npb24oY29uc3QgQmFzaWNFeHByZXNzaW9uICYpID0gZGVsZXRlOworICBCYXNpY0V4cHJlc3Npb24gJm9wZXJhdG9yPShjb25zdCBCYXNpY0V4cHJlc3Npb24gJikgPSBkZWxldGU7CisgIH5CYXNpY0V4cHJlc3Npb24oKSBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEV4cHJlc3Npb24gKkVCKSB7CisgICAgRXhwcmVzc2lvblR5cGUgRVQgPSBFQi0+Z2V0RXhwcmVzc2lvblR5cGUoKTsKKyAgICByZXR1cm4gRVQgPiBFVF9CYXNpY1N0YXJ0ICYmIEVUIDwgRVRfQmFzaWNFbmQ7CisgIH0KKworICAvLy8gXGJyaWVmIFN3YXAgdHdvIG9wZXJhbmRzLiBVc2VkIGR1cmluZyBHVk4gdG8gcHV0IGNvbW11dGF0aXZlIG9wZXJhbmRzIGluCisgIC8vLyBvcmRlci4KKyAgdm9pZCBzd2FwT3BlcmFuZHModW5zaWduZWQgRmlyc3QsIHVuc2lnbmVkIFNlY29uZCkgeworICAgIHN0ZDo6c3dhcChPcGVyYW5kc1tGaXJzdF0sIE9wZXJhbmRzW1NlY29uZF0pOworICB9CisKKyAgVmFsdWUgKmdldE9wZXJhbmQodW5zaWduZWQgTikgY29uc3QgeworICAgIGFzc2VydChPcGVyYW5kcyAmJiAiT3BlcmFuZHMgbm90IGFsbG9jYXRlZCIpOworICAgIGFzc2VydChOIDwgTnVtT3BlcmFuZHMgJiYgIk9wZXJhbmQgb3V0IG9mIHJhbmdlIik7CisgICAgcmV0dXJuIE9wZXJhbmRzW05dOworICB9CisKKyAgdm9pZCBzZXRPcGVyYW5kKHVuc2lnbmVkIE4sIFZhbHVlICpWKSB7CisgICAgYXNzZXJ0KE9wZXJhbmRzICYmICJPcGVyYW5kcyBub3QgYWxsb2NhdGVkIGJlZm9yZSBzZXR0aW5nIik7CisgICAgYXNzZXJ0KE4gPCBOdW1PcGVyYW5kcyAmJiAiT3BlcmFuZCBvdXQgb2YgcmFuZ2UiKTsKKyAgICBPcGVyYW5kc1tOXSA9IFY7CisgIH0KKworICB1bnNpZ25lZCBnZXROdW1PcGVyYW5kcygpIGNvbnN0IHsgcmV0dXJuIE51bU9wZXJhbmRzOyB9CisKKyAgdXNpbmcgb3BfaXRlcmF0b3IgPSBWYWx1ZSAqKjsKKyAgdXNpbmcgY29uc3Rfb3BfaXRlcmF0b3IgPSBWYWx1ZSAqY29uc3QgKjsKKworICBvcF9pdGVyYXRvciBvcF9iZWdpbigpIHsgcmV0dXJuIE9wZXJhbmRzOyB9CisgIG9wX2l0ZXJhdG9yIG9wX2VuZCgpIHsgcmV0dXJuIE9wZXJhbmRzICsgTnVtT3BlcmFuZHM7IH0KKyAgY29uc3Rfb3BfaXRlcmF0b3Igb3BfYmVnaW4oKSBjb25zdCB7IHJldHVybiBPcGVyYW5kczsgfQorICBjb25zdF9vcF9pdGVyYXRvciBvcF9lbmQoKSBjb25zdCB7IHJldHVybiBPcGVyYW5kcyArIE51bU9wZXJhbmRzOyB9CisgIGl0ZXJhdG9yX3JhbmdlPG9wX2l0ZXJhdG9yPiBvcGVyYW5kcygpIHsKKyAgICByZXR1cm4gaXRlcmF0b3JfcmFuZ2U8b3BfaXRlcmF0b3I+KG9wX2JlZ2luKCksIG9wX2VuZCgpKTsKKyAgfQorICBpdGVyYXRvcl9yYW5nZTxjb25zdF9vcF9pdGVyYXRvcj4gb3BlcmFuZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIGl0ZXJhdG9yX3JhbmdlPGNvbnN0X29wX2l0ZXJhdG9yPihvcF9iZWdpbigpLCBvcF9lbmQoKSk7CisgIH0KKworICB2b2lkIG9wX3B1c2hfYmFjayhWYWx1ZSAqQXJnKSB7CisgICAgYXNzZXJ0KE51bU9wZXJhbmRzIDwgTWF4T3BlcmFuZHMgJiYgIlRyaWVkIHRvIGFkZCB0b28gbWFueSBvcGVyYW5kcyIpOworICAgIGFzc2VydChPcGVyYW5kcyAmJiAiT3BlcmFuZHNzIG5vdCBhbGxvY2F0ZWQgYmVmb3JlIHB1c2hpbmciKTsKKyAgICBPcGVyYW5kc1tOdW1PcGVyYW5kcysrXSA9IEFyZzsKKyAgfQorICBib29sIG9wX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gZ2V0TnVtT3BlcmFuZHMoKSA9PSAwOyB9CisKKyAgdm9pZCBhbGxvY2F0ZU9wZXJhbmRzKFJlY3ljbGVyVHlwZSAmUmVjeWNsZXIsIEJ1bXBQdHJBbGxvY2F0b3IgJkFsbG9jYXRvcikgeworICAgIGFzc2VydCghT3BlcmFuZHMgJiYgIk9wZXJhbmRzIGFscmVhZHkgYWxsb2NhdGVkIik7CisgICAgT3BlcmFuZHMgPSBSZWN5Y2xlci5hbGxvY2F0ZShSZWN5Y2xlckNhcGFjaXR5OjpnZXQoTWF4T3BlcmFuZHMpLCBBbGxvY2F0b3IpOworICB9CisgIHZvaWQgZGVhbGxvY2F0ZU9wZXJhbmRzKFJlY3ljbGVyVHlwZSAmUmVjeWNsZXIpIHsKKyAgICBSZWN5Y2xlci5kZWFsbG9jYXRlKFJlY3ljbGVyQ2FwYWNpdHk6OmdldChNYXhPcGVyYW5kcyksIE9wZXJhbmRzKTsKKyAgfQorCisgIHZvaWQgc2V0VHlwZShUeXBlICpUKSB7IFZhbHVlVHlwZSA9IFQ7IH0KKyAgVHlwZSAqZ2V0VHlwZSgpIGNvbnN0IHsgcmV0dXJuIFZhbHVlVHlwZTsgfQorCisgIGJvb2wgZXF1YWxzKGNvbnN0IEV4cHJlc3Npb24gJk90aGVyKSBjb25zdCBvdmVycmlkZSB7CisgICAgaWYgKGdldE9wY29kZSgpICE9IE90aGVyLmdldE9wY29kZSgpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgY29uc3QgYXV0byAmT0UgPSBjYXN0PEJhc2ljRXhwcmVzc2lvbj4oT3RoZXIpOworICAgIHJldHVybiBnZXRUeXBlKCkgPT0gT0UuZ2V0VHlwZSgpICYmIE51bU9wZXJhbmRzID09IE9FLk51bU9wZXJhbmRzICYmCisgICAgICAgICAgIHN0ZDo6ZXF1YWwob3BfYmVnaW4oKSwgb3BfZW5kKCksIE9FLm9wX2JlZ2luKCkpOworICB9CisKKyAgaGFzaF9jb2RlIGdldEhhc2hWYWx1ZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gaGFzaF9jb21iaW5lKHRoaXMtPkV4cHJlc3Npb246OmdldEhhc2hWYWx1ZSgpLCBWYWx1ZVR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX2NvbWJpbmVfcmFuZ2Uob3BfYmVnaW4oKSwgb3BfZW5kKCkpKTsKKyAgfQorCisgIC8vIERlYnVnZ2luZyBzdXBwb3J0CisgIHZvaWQgcHJpbnRJbnRlcm5hbChyYXdfb3N0cmVhbSAmT1MsIGJvb2wgUHJpbnRFVHlwZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGlmIChQcmludEVUeXBlKQorICAgICAgT1MgPDwgIkV4cHJlc3Npb25UeXBlQmFzaWMsICI7CisKKyAgICB0aGlzLT5FeHByZXNzaW9uOjpwcmludEludGVybmFsKE9TLCBmYWxzZSk7CisgICAgT1MgPDwgIm9wZXJhbmRzID0geyI7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGdldE51bU9wZXJhbmRzKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBPUyA8PCAiWyIgPDwgaSA8PCAiXSA9ICI7CisgICAgICBPcGVyYW5kc1tpXS0+cHJpbnRBc09wZXJhbmQoT1MpOworICAgICAgT1MgPDwgIiAgIjsKKyAgICB9CisgICAgT1MgPDwgIn0gIjsKKyAgfQorfTsKKworY2xhc3Mgb3BfaW5zZXJ0ZXIKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6b3V0cHV0X2l0ZXJhdG9yX3RhZywgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZD4geworcHJpdmF0ZToKKyAgdXNpbmcgQ29udGFpbmVyID0gQmFzaWNFeHByZXNzaW9uOworCisgIENvbnRhaW5lciAqQkU7CisKK3B1YmxpYzoKKyAgZXhwbGljaXQgb3BfaW5zZXJ0ZXIoQmFzaWNFeHByZXNzaW9uICZFKSA6IEJFKCZFKSB7fQorICBleHBsaWNpdCBvcF9pbnNlcnRlcihCYXNpY0V4cHJlc3Npb24gKkUpIDogQkUoRSkge30KKworICBvcF9pbnNlcnRlciAmb3BlcmF0b3I9KFZhbHVlICp2YWwpIHsKKyAgICBCRS0+b3BfcHVzaF9iYWNrKHZhbCk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisgIG9wX2luc2VydGVyICZvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQorICBvcF9pbnNlcnRlciAmb3BlcmF0b3IrKygpIHsgcmV0dXJuICp0aGlzOyB9CisgIG9wX2luc2VydGVyICZvcGVyYXRvcisrKGludCkgeyByZXR1cm4gKnRoaXM7IH0KK307CisKK2NsYXNzIE1lbW9yeUV4cHJlc3Npb24gOiBwdWJsaWMgQmFzaWNFeHByZXNzaW9uIHsKK3ByaXZhdGU6CisgIGNvbnN0IE1lbW9yeUFjY2VzcyAqTWVtb3J5TGVhZGVyOworCitwdWJsaWM6CisgIE1lbW9yeUV4cHJlc3Npb24odW5zaWduZWQgTnVtT3BlcmFuZHMsIGVudW0gRXhwcmVzc2lvblR5cGUgRVR5cGUsCisgICAgICAgICAgICAgICAgICAgY29uc3QgTWVtb3J5QWNjZXNzICpNZW1vcnlMZWFkZXIpCisgICAgICA6IEJhc2ljRXhwcmVzc2lvbihOdW1PcGVyYW5kcywgRVR5cGUpLCBNZW1vcnlMZWFkZXIoTWVtb3J5TGVhZGVyKSB7fQorICBNZW1vcnlFeHByZXNzaW9uKCkgPSBkZWxldGU7CisgIE1lbW9yeUV4cHJlc3Npb24oY29uc3QgTWVtb3J5RXhwcmVzc2lvbiAmKSA9IGRlbGV0ZTsKKyAgTWVtb3J5RXhwcmVzc2lvbiAmb3BlcmF0b3I9KGNvbnN0IE1lbW9yeUV4cHJlc3Npb24gJikgPSBkZWxldGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBFeHByZXNzaW9uICpFQikgeworICAgIHJldHVybiBFQi0+Z2V0RXhwcmVzc2lvblR5cGUoKSA+IEVUX01lbW9yeVN0YXJ0ICYmCisgICAgICAgICAgIEVCLT5nZXRFeHByZXNzaW9uVHlwZSgpIDwgRVRfTWVtb3J5RW5kOworICB9CisKKyAgaGFzaF9jb2RlIGdldEhhc2hWYWx1ZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gaGFzaF9jb21iaW5lKHRoaXMtPkJhc2ljRXhwcmVzc2lvbjo6Z2V0SGFzaFZhbHVlKCksIE1lbW9yeUxlYWRlcik7CisgIH0KKworICBib29sIGVxdWFscyhjb25zdCBFeHByZXNzaW9uICZPdGhlcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIGlmICghdGhpcy0+QmFzaWNFeHByZXNzaW9uOjplcXVhbHMoT3RoZXIpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNvbnN0IE1lbW9yeUV4cHJlc3Npb24gJk90aGVyTUNFID0gY2FzdDxNZW1vcnlFeHByZXNzaW9uPihPdGhlcik7CisKKyAgICByZXR1cm4gTWVtb3J5TGVhZGVyID09IE90aGVyTUNFLk1lbW9yeUxlYWRlcjsKKyAgfQorCisgIGNvbnN0IE1lbW9yeUFjY2VzcyAqZ2V0TWVtb3J5TGVhZGVyKCkgY29uc3QgeyByZXR1cm4gTWVtb3J5TGVhZGVyOyB9CisgIHZvaWQgc2V0TWVtb3J5TGVhZGVyKGNvbnN0IE1lbW9yeUFjY2VzcyAqTUwpIHsgTWVtb3J5TGVhZGVyID0gTUw7IH0KK307CisKK2NsYXNzIENhbGxFeHByZXNzaW9uIGZpbmFsIDogcHVibGljIE1lbW9yeUV4cHJlc3Npb24geworcHJpdmF0ZToKKyAgQ2FsbEluc3QgKkNhbGw7CisKK3B1YmxpYzoKKyAgQ2FsbEV4cHJlc3Npb24odW5zaWduZWQgTnVtT3BlcmFuZHMsIENhbGxJbnN0ICpDLAorICAgICAgICAgICAgICAgICBjb25zdCBNZW1vcnlBY2Nlc3MgKk1lbW9yeUxlYWRlcikKKyAgICAgIDogTWVtb3J5RXhwcmVzc2lvbihOdW1PcGVyYW5kcywgRVRfQ2FsbCwgTWVtb3J5TGVhZGVyKSwgQ2FsbChDKSB7fQorICBDYWxsRXhwcmVzc2lvbigpID0gZGVsZXRlOworICBDYWxsRXhwcmVzc2lvbihjb25zdCBDYWxsRXhwcmVzc2lvbiAmKSA9IGRlbGV0ZTsKKyAgQ2FsbEV4cHJlc3Npb24gJm9wZXJhdG9yPShjb25zdCBDYWxsRXhwcmVzc2lvbiAmKSA9IGRlbGV0ZTsKKyAgfkNhbGxFeHByZXNzaW9uKCkgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBFeHByZXNzaW9uICpFQikgeworICAgIHJldHVybiBFQi0+Z2V0RXhwcmVzc2lvblR5cGUoKSA9PSBFVF9DYWxsOworICB9CisKKyAgLy8gRGVidWdnaW5nIHN1cHBvcnQKKyAgdm9pZCBwcmludEludGVybmFsKHJhd19vc3RyZWFtICZPUywgYm9vbCBQcmludEVUeXBlKSBjb25zdCBvdmVycmlkZSB7CisgICAgaWYgKFByaW50RVR5cGUpCisgICAgICBPUyA8PCAiRXhwcmVzc2lvblR5cGVDYWxsLCAiOworICAgIHRoaXMtPkJhc2ljRXhwcmVzc2lvbjo6cHJpbnRJbnRlcm5hbChPUywgZmFsc2UpOworICAgIE9TIDw8ICIgcmVwcmVzZW50cyBjYWxsIGF0ICI7CisgICAgQ2FsbC0+cHJpbnRBc09wZXJhbmQoT1MpOworICB9Cit9OworCitjbGFzcyBMb2FkRXhwcmVzc2lvbiBmaW5hbCA6IHB1YmxpYyBNZW1vcnlFeHByZXNzaW9uIHsKK3ByaXZhdGU6CisgIExvYWRJbnN0ICpMb2FkOworICB1bnNpZ25lZCBBbGlnbm1lbnQ7CisKK3B1YmxpYzoKKyAgTG9hZEV4cHJlc3Npb24odW5zaWduZWQgTnVtT3BlcmFuZHMsIExvYWRJbnN0ICpMLAorICAgICAgICAgICAgICAgICBjb25zdCBNZW1vcnlBY2Nlc3MgKk1lbW9yeUxlYWRlcikKKyAgICAgIDogTG9hZEV4cHJlc3Npb24oRVRfTG9hZCwgTnVtT3BlcmFuZHMsIEwsIE1lbW9yeUxlYWRlcikge30KKworICBMb2FkRXhwcmVzc2lvbihlbnVtIEV4cHJlc3Npb25UeXBlIEVUeXBlLCB1bnNpZ25lZCBOdW1PcGVyYW5kcywgTG9hZEluc3QgKkwsCisgICAgICAgICAgICAgICAgIGNvbnN0IE1lbW9yeUFjY2VzcyAqTWVtb3J5TGVhZGVyKQorICAgICAgOiBNZW1vcnlFeHByZXNzaW9uKE51bU9wZXJhbmRzLCBFVHlwZSwgTWVtb3J5TGVhZGVyKSwgTG9hZChMKSB7CisgICAgQWxpZ25tZW50ID0gTCA/IEwtPmdldEFsaWdubWVudCgpIDogMDsKKyAgfQorCisgIExvYWRFeHByZXNzaW9uKCkgPSBkZWxldGU7CisgIExvYWRFeHByZXNzaW9uKGNvbnN0IExvYWRFeHByZXNzaW9uICYpID0gZGVsZXRlOworICBMb2FkRXhwcmVzc2lvbiAmb3BlcmF0b3I9KGNvbnN0IExvYWRFeHByZXNzaW9uICYpID0gZGVsZXRlOworICB+TG9hZEV4cHJlc3Npb24oKSBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEV4cHJlc3Npb24gKkVCKSB7CisgICAgcmV0dXJuIEVCLT5nZXRFeHByZXNzaW9uVHlwZSgpID09IEVUX0xvYWQ7CisgIH0KKworICBMb2FkSW5zdCAqZ2V0TG9hZEluc3QoKSBjb25zdCB7IHJldHVybiBMb2FkOyB9CisgIHZvaWQgc2V0TG9hZEluc3QoTG9hZEluc3QgKkwpIHsgTG9hZCA9IEw7IH0KKworICB1bnNpZ25lZCBnZXRBbGlnbm1lbnQoKSBjb25zdCB7IHJldHVybiBBbGlnbm1lbnQ7IH0KKyAgdm9pZCBzZXRBbGlnbm1lbnQodW5zaWduZWQgQWxpZ24pIHsgQWxpZ25tZW50ID0gQWxpZ247IH0KKworICBib29sIGVxdWFscyhjb25zdCBFeHByZXNzaW9uICZPdGhlcikgY29uc3Qgb3ZlcnJpZGU7CisgIGJvb2wgZXhhY3RseUVxdWFscyhjb25zdCBFeHByZXNzaW9uICZPdGhlcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBFeHByZXNzaW9uOjpleGFjdGx5RXF1YWxzKE90aGVyKSAmJgorICAgICAgICAgICBjYXN0PExvYWRFeHByZXNzaW9uPihPdGhlcikuZ2V0TG9hZEluc3QoKSA9PSBnZXRMb2FkSW5zdCgpOworICB9CisKKyAgLy8gRGVidWdnaW5nIHN1cHBvcnQKKyAgdm9pZCBwcmludEludGVybmFsKHJhd19vc3RyZWFtICZPUywgYm9vbCBQcmludEVUeXBlKSBjb25zdCBvdmVycmlkZSB7CisgICAgaWYgKFByaW50RVR5cGUpCisgICAgICBPUyA8PCAiRXhwcmVzc2lvblR5cGVMb2FkLCAiOworICAgIHRoaXMtPkJhc2ljRXhwcmVzc2lvbjo6cHJpbnRJbnRlcm5hbChPUywgZmFsc2UpOworICAgIE9TIDw8ICIgcmVwcmVzZW50cyBMb2FkIGF0ICI7CisgICAgTG9hZC0+cHJpbnRBc09wZXJhbmQoT1MpOworICAgIE9TIDw8ICIgd2l0aCBNZW1vcnlMZWFkZXIgIiA8PCAqZ2V0TWVtb3J5TGVhZGVyKCk7CisgIH0KK307CisKK2NsYXNzIFN0b3JlRXhwcmVzc2lvbiBmaW5hbCA6IHB1YmxpYyBNZW1vcnlFeHByZXNzaW9uIHsKK3ByaXZhdGU6CisgIFN0b3JlSW5zdCAqU3RvcmU7CisgIFZhbHVlICpTdG9yZWRWYWx1ZTsKKworcHVibGljOgorICBTdG9yZUV4cHJlc3Npb24odW5zaWduZWQgTnVtT3BlcmFuZHMsIFN0b3JlSW5zdCAqUywgVmFsdWUgKlN0b3JlZFZhbHVlLAorICAgICAgICAgICAgICAgICAgY29uc3QgTWVtb3J5QWNjZXNzICpNZW1vcnlMZWFkZXIpCisgICAgICA6IE1lbW9yeUV4cHJlc3Npb24oTnVtT3BlcmFuZHMsIEVUX1N0b3JlLCBNZW1vcnlMZWFkZXIpLCBTdG9yZShTKSwKKyAgICAgICAgU3RvcmVkVmFsdWUoU3RvcmVkVmFsdWUpIHt9CisgIFN0b3JlRXhwcmVzc2lvbigpID0gZGVsZXRlOworICBTdG9yZUV4cHJlc3Npb24oY29uc3QgU3RvcmVFeHByZXNzaW9uICYpID0gZGVsZXRlOworICBTdG9yZUV4cHJlc3Npb24gJm9wZXJhdG9yPShjb25zdCBTdG9yZUV4cHJlc3Npb24gJikgPSBkZWxldGU7CisgIH5TdG9yZUV4cHJlc3Npb24oKSBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEV4cHJlc3Npb24gKkVCKSB7CisgICAgcmV0dXJuIEVCLT5nZXRFeHByZXNzaW9uVHlwZSgpID09IEVUX1N0b3JlOworICB9CisKKyAgU3RvcmVJbnN0ICpnZXRTdG9yZUluc3QoKSBjb25zdCB7IHJldHVybiBTdG9yZTsgfQorICBWYWx1ZSAqZ2V0U3RvcmVkVmFsdWUoKSBjb25zdCB7IHJldHVybiBTdG9yZWRWYWx1ZTsgfQorCisgIGJvb2wgZXF1YWxzKGNvbnN0IEV4cHJlc3Npb24gJk90aGVyKSBjb25zdCBvdmVycmlkZTsKKworICBib29sIGV4YWN0bHlFcXVhbHMoY29uc3QgRXhwcmVzc2lvbiAmT3RoZXIpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gRXhwcmVzc2lvbjo6ZXhhY3RseUVxdWFscyhPdGhlcikgJiYKKyAgICAgICAgICAgY2FzdDxTdG9yZUV4cHJlc3Npb24+KE90aGVyKS5nZXRTdG9yZUluc3QoKSA9PSBnZXRTdG9yZUluc3QoKTsKKyAgfQorCisgIC8vIERlYnVnZ2luZyBzdXBwb3J0CisgIHZvaWQgcHJpbnRJbnRlcm5hbChyYXdfb3N0cmVhbSAmT1MsIGJvb2wgUHJpbnRFVHlwZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGlmIChQcmludEVUeXBlKQorICAgICAgT1MgPDwgIkV4cHJlc3Npb25UeXBlU3RvcmUsICI7CisgICAgdGhpcy0+QmFzaWNFeHByZXNzaW9uOjpwcmludEludGVybmFsKE9TLCBmYWxzZSk7CisgICAgT1MgPDwgIiByZXByZXNlbnRzIFN0b3JlICAiIDw8ICpTdG9yZTsKKyAgICBPUyA8PCAiIHdpdGggU3RvcmVkVmFsdWUgIjsKKyAgICBTdG9yZWRWYWx1ZS0+cHJpbnRBc09wZXJhbmQoT1MpOworICAgIE9TIDw8ICIgYW5kIE1lbW9yeUxlYWRlciAiIDw8ICpnZXRNZW1vcnlMZWFkZXIoKTsKKyAgfQorfTsKKworY2xhc3MgQWdncmVnYXRlVmFsdWVFeHByZXNzaW9uIGZpbmFsIDogcHVibGljIEJhc2ljRXhwcmVzc2lvbiB7Citwcml2YXRlOgorICB1bnNpZ25lZCBNYXhJbnRPcGVyYW5kczsKKyAgdW5zaWduZWQgTnVtSW50T3BlcmFuZHMgPSAwOworICB1bnNpZ25lZCAqSW50T3BlcmFuZHMgPSBudWxscHRyOworCitwdWJsaWM6CisgIEFnZ3JlZ2F0ZVZhbHVlRXhwcmVzc2lvbih1bnNpZ25lZCBOdW1PcGVyYW5kcywgdW5zaWduZWQgTnVtSW50T3BlcmFuZHMpCisgICAgICA6IEJhc2ljRXhwcmVzc2lvbihOdW1PcGVyYW5kcywgRVRfQWdncmVnYXRlVmFsdWUpLAorICAgICAgICBNYXhJbnRPcGVyYW5kcyhOdW1JbnRPcGVyYW5kcykge30KKyAgQWdncmVnYXRlVmFsdWVFeHByZXNzaW9uKCkgPSBkZWxldGU7CisgIEFnZ3JlZ2F0ZVZhbHVlRXhwcmVzc2lvbihjb25zdCBBZ2dyZWdhdGVWYWx1ZUV4cHJlc3Npb24gJikgPSBkZWxldGU7CisgIEFnZ3JlZ2F0ZVZhbHVlRXhwcmVzc2lvbiAmCisgIG9wZXJhdG9yPShjb25zdCBBZ2dyZWdhdGVWYWx1ZUV4cHJlc3Npb24gJikgPSBkZWxldGU7CisgIH5BZ2dyZWdhdGVWYWx1ZUV4cHJlc3Npb24oKSBvdmVycmlkZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEV4cHJlc3Npb24gKkVCKSB7CisgICAgcmV0dXJuIEVCLT5nZXRFeHByZXNzaW9uVHlwZSgpID09IEVUX0FnZ3JlZ2F0ZVZhbHVlOworICB9CisKKyAgdXNpbmcgaW50X2FyZ19pdGVyYXRvciA9IHVuc2lnbmVkICo7CisgIHVzaW5nIGNvbnN0X2ludF9hcmdfaXRlcmF0b3IgPSBjb25zdCB1bnNpZ25lZCAqOworCisgIGludF9hcmdfaXRlcmF0b3IgaW50X29wX2JlZ2luKCkgeyByZXR1cm4gSW50T3BlcmFuZHM7IH0KKyAgaW50X2FyZ19pdGVyYXRvciBpbnRfb3BfZW5kKCkgeyByZXR1cm4gSW50T3BlcmFuZHMgKyBOdW1JbnRPcGVyYW5kczsgfQorICBjb25zdF9pbnRfYXJnX2l0ZXJhdG9yIGludF9vcF9iZWdpbigpIGNvbnN0IHsgcmV0dXJuIEludE9wZXJhbmRzOyB9CisgIGNvbnN0X2ludF9hcmdfaXRlcmF0b3IgaW50X29wX2VuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW50T3BlcmFuZHMgKyBOdW1JbnRPcGVyYW5kczsKKyAgfQorICB1bnNpZ25lZCBpbnRfb3Bfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIE51bUludE9wZXJhbmRzOyB9CisgIGJvb2wgaW50X29wX2VtcHR5KCkgY29uc3QgeyByZXR1cm4gTnVtSW50T3BlcmFuZHMgPT0gMDsgfQorICB2b2lkIGludF9vcF9wdXNoX2JhY2sodW5zaWduZWQgSW50T3BlcmFuZCkgeworICAgIGFzc2VydChOdW1JbnRPcGVyYW5kcyA8IE1heEludE9wZXJhbmRzICYmCisgICAgICAgICAgICJUcmllZCB0byBhZGQgdG9vIG1hbnkgaW50IG9wZXJhbmRzIik7CisgICAgYXNzZXJ0KEludE9wZXJhbmRzICYmICJPcGVyYW5kcyBub3QgYWxsb2NhdGVkIGJlZm9yZSBwdXNoaW5nIik7CisgICAgSW50T3BlcmFuZHNbTnVtSW50T3BlcmFuZHMrK10gPSBJbnRPcGVyYW5kOworICB9CisKKyAgdmlydHVhbCB2b2lkIGFsbG9jYXRlSW50T3BlcmFuZHMoQnVtcFB0ckFsbG9jYXRvciAmQWxsb2NhdG9yKSB7CisgICAgYXNzZXJ0KCFJbnRPcGVyYW5kcyAmJiAiT3BlcmFuZHMgYWxyZWFkeSBhbGxvY2F0ZWQiKTsKKyAgICBJbnRPcGVyYW5kcyA9IEFsbG9jYXRvci5BbGxvY2F0ZTx1bnNpZ25lZD4oTWF4SW50T3BlcmFuZHMpOworICB9CisKKyAgYm9vbCBlcXVhbHMoY29uc3QgRXhwcmVzc2lvbiAmT3RoZXIpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBpZiAoIXRoaXMtPkJhc2ljRXhwcmVzc2lvbjo6ZXF1YWxzKE90aGVyKSkKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICBjb25zdCBBZ2dyZWdhdGVWYWx1ZUV4cHJlc3Npb24gJk9FID0gY2FzdDxBZ2dyZWdhdGVWYWx1ZUV4cHJlc3Npb24+KE90aGVyKTsKKyAgICByZXR1cm4gTnVtSW50T3BlcmFuZHMgPT0gT0UuTnVtSW50T3BlcmFuZHMgJiYKKyAgICAgICAgICAgc3RkOjplcXVhbChpbnRfb3BfYmVnaW4oKSwgaW50X29wX2VuZCgpLCBPRS5pbnRfb3BfYmVnaW4oKSk7CisgIH0KKworICBoYXNoX2NvZGUgZ2V0SGFzaFZhbHVlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBoYXNoX2NvbWJpbmUodGhpcy0+QmFzaWNFeHByZXNzaW9uOjpnZXRIYXNoVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfY29tYmluZV9yYW5nZShpbnRfb3BfYmVnaW4oKSwgaW50X29wX2VuZCgpKSk7CisgIH0KKworICAvLyBEZWJ1Z2dpbmcgc3VwcG9ydAorICB2b2lkIHByaW50SW50ZXJuYWwocmF3X29zdHJlYW0gJk9TLCBib29sIFByaW50RVR5cGUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBpZiAoUHJpbnRFVHlwZSkKKyAgICAgIE9TIDw8ICJFeHByZXNzaW9uVHlwZUFnZ3JlZ2F0ZVZhbHVlLCAiOworICAgIHRoaXMtPkJhc2ljRXhwcmVzc2lvbjo6cHJpbnRJbnRlcm5hbChPUywgZmFsc2UpOworICAgIE9TIDw8ICIsIGludG9wZXJhbmRzID0geyI7CisgICAgZm9yICh1bnNpZ25lZCBpID0gMCwgZSA9IGludF9vcF9zaXplKCk7IGkgIT0gZTsgKytpKSB7CisgICAgICBPUyA8PCAiWyIgPDwgaSA8PCAiXSA9ICIgPDwgSW50T3BlcmFuZHNbaV0gPDwgIiAgIjsKKyAgICB9CisgICAgT1MgPDwgIn0iOworICB9Cit9OworCitjbGFzcyBpbnRfb3BfaW5zZXJ0ZXIKKyAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6b3V0cHV0X2l0ZXJhdG9yX3RhZywgdm9pZCwgdm9pZCwgdm9pZCwgdm9pZD4geworcHJpdmF0ZToKKyAgdXNpbmcgQ29udGFpbmVyID0gQWdncmVnYXRlVmFsdWVFeHByZXNzaW9uOworCisgIENvbnRhaW5lciAqQVZFOworCitwdWJsaWM6CisgIGV4cGxpY2l0IGludF9vcF9pbnNlcnRlcihBZ2dyZWdhdGVWYWx1ZUV4cHJlc3Npb24gJkUpIDogQVZFKCZFKSB7fQorICBleHBsaWNpdCBpbnRfb3BfaW5zZXJ0ZXIoQWdncmVnYXRlVmFsdWVFeHByZXNzaW9uICpFKSA6IEFWRShFKSB7fQorCisgIGludF9vcF9pbnNlcnRlciAmb3BlcmF0b3I9KHVuc2lnbmVkIGludCB2YWwpIHsKKyAgICBBVkUtPmludF9vcF9wdXNoX2JhY2sodmFsKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgaW50X29wX2luc2VydGVyICZvcGVyYXRvciooKSB7IHJldHVybiAqdGhpczsgfQorICBpbnRfb3BfaW5zZXJ0ZXIgJm9wZXJhdG9yKysoKSB7IHJldHVybiAqdGhpczsgfQorICBpbnRfb3BfaW5zZXJ0ZXIgJm9wZXJhdG9yKysoaW50KSB7IHJldHVybiAqdGhpczsgfQorfTsKKworY2xhc3MgUEhJRXhwcmVzc2lvbiBmaW5hbCA6IHB1YmxpYyBCYXNpY0V4cHJlc3Npb24geworcHJpdmF0ZToKKyAgQmFzaWNCbG9jayAqQkI7CisKK3B1YmxpYzoKKyAgUEhJRXhwcmVzc2lvbih1bnNpZ25lZCBOdW1PcGVyYW5kcywgQmFzaWNCbG9jayAqQikKKyAgICAgIDogQmFzaWNFeHByZXNzaW9uKE51bU9wZXJhbmRzLCBFVF9QaGkpLCBCQihCKSB7fQorICBQSElFeHByZXNzaW9uKCkgPSBkZWxldGU7CisgIFBISUV4cHJlc3Npb24oY29uc3QgUEhJRXhwcmVzc2lvbiAmKSA9IGRlbGV0ZTsKKyAgUEhJRXhwcmVzc2lvbiAmb3BlcmF0b3I9KGNvbnN0IFBISUV4cHJlc3Npb24gJikgPSBkZWxldGU7CisgIH5QSElFeHByZXNzaW9uKCkgb3ZlcnJpZGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBFeHByZXNzaW9uICpFQikgeworICAgIHJldHVybiBFQi0+Z2V0RXhwcmVzc2lvblR5cGUoKSA9PSBFVF9QaGk7CisgIH0KKworICBib29sIGVxdWFscyhjb25zdCBFeHByZXNzaW9uICZPdGhlcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIGlmICghdGhpcy0+QmFzaWNFeHByZXNzaW9uOjplcXVhbHMoT3RoZXIpKQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNvbnN0IFBISUV4cHJlc3Npb24gJk9FID0gY2FzdDxQSElFeHByZXNzaW9uPihPdGhlcik7CisgICAgcmV0dXJuIEJCID09IE9FLkJCOworICB9CisKKyAgaGFzaF9jb2RlIGdldEhhc2hWYWx1ZSgpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICByZXR1cm4gaGFzaF9jb21iaW5lKHRoaXMtPkJhc2ljRXhwcmVzc2lvbjo6Z2V0SGFzaFZhbHVlKCksIEJCKTsKKyAgfQorCisgIC8vIERlYnVnZ2luZyBzdXBwb3J0CisgIHZvaWQgcHJpbnRJbnRlcm5hbChyYXdfb3N0cmVhbSAmT1MsIGJvb2wgUHJpbnRFVHlwZSkgY29uc3Qgb3ZlcnJpZGUgeworICAgIGlmIChQcmludEVUeXBlKQorICAgICAgT1MgPDwgIkV4cHJlc3Npb25UeXBlUGhpLCAiOworICAgIHRoaXMtPkJhc2ljRXhwcmVzc2lvbjo6cHJpbnRJbnRlcm5hbChPUywgZmFsc2UpOworICAgIE9TIDw8ICJiYiA9ICIgPDwgQkI7CisgIH0KK307CisKK2NsYXNzIERlYWRFeHByZXNzaW9uIGZpbmFsIDogcHVibGljIEV4cHJlc3Npb24geworcHVibGljOgorICBEZWFkRXhwcmVzc2lvbigpIDogRXhwcmVzc2lvbihFVF9EZWFkKSB7fQorICBEZWFkRXhwcmVzc2lvbihjb25zdCBEZWFkRXhwcmVzc2lvbiAmKSA9IGRlbGV0ZTsKKyAgRGVhZEV4cHJlc3Npb24gJm9wZXJhdG9yPShjb25zdCBEZWFkRXhwcmVzc2lvbiAmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEV4cHJlc3Npb24gKkUpIHsKKyAgICByZXR1cm4gRS0+Z2V0RXhwcmVzc2lvblR5cGUoKSA9PSBFVF9EZWFkOworICB9Cit9OworCitjbGFzcyBWYXJpYWJsZUV4cHJlc3Npb24gZmluYWwgOiBwdWJsaWMgRXhwcmVzc2lvbiB7Citwcml2YXRlOgorICBWYWx1ZSAqVmFyaWFibGVWYWx1ZTsKKworcHVibGljOgorICBWYXJpYWJsZUV4cHJlc3Npb24oVmFsdWUgKlYpIDogRXhwcmVzc2lvbihFVF9WYXJpYWJsZSksIFZhcmlhYmxlVmFsdWUoVikge30KKyAgVmFyaWFibGVFeHByZXNzaW9uKCkgPSBkZWxldGU7CisgIFZhcmlhYmxlRXhwcmVzc2lvbihjb25zdCBWYXJpYWJsZUV4cHJlc3Npb24gJikgPSBkZWxldGU7CisgIFZhcmlhYmxlRXhwcmVzc2lvbiAmb3BlcmF0b3I9KGNvbnN0IFZhcmlhYmxlRXhwcmVzc2lvbiAmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEV4cHJlc3Npb24gKkVCKSB7CisgICAgcmV0dXJuIEVCLT5nZXRFeHByZXNzaW9uVHlwZSgpID09IEVUX1ZhcmlhYmxlOworICB9CisKKyAgVmFsdWUgKmdldFZhcmlhYmxlVmFsdWUoKSBjb25zdCB7IHJldHVybiBWYXJpYWJsZVZhbHVlOyB9CisgIHZvaWQgc2V0VmFyaWFibGVWYWx1ZShWYWx1ZSAqVikgeyBWYXJpYWJsZVZhbHVlID0gVjsgfQorCisgIGJvb2wgZXF1YWxzKGNvbnN0IEV4cHJlc3Npb24gJk90aGVyKSBjb25zdCBvdmVycmlkZSB7CisgICAgY29uc3QgVmFyaWFibGVFeHByZXNzaW9uICZPQyA9IGNhc3Q8VmFyaWFibGVFeHByZXNzaW9uPihPdGhlcik7CisgICAgcmV0dXJuIFZhcmlhYmxlVmFsdWUgPT0gT0MuVmFyaWFibGVWYWx1ZTsKKyAgfQorCisgIGhhc2hfY29kZSBnZXRIYXNoVmFsdWUoKSBjb25zdCBvdmVycmlkZSB7CisgICAgcmV0dXJuIGhhc2hfY29tYmluZSh0aGlzLT5FeHByZXNzaW9uOjpnZXRIYXNoVmFsdWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlVmFsdWUtPmdldFR5cGUoKSwgVmFyaWFibGVWYWx1ZSk7CisgIH0KKworICAvLyBEZWJ1Z2dpbmcgc3VwcG9ydAorICB2b2lkIHByaW50SW50ZXJuYWwocmF3X29zdHJlYW0gJk9TLCBib29sIFByaW50RVR5cGUpIGNvbnN0IG92ZXJyaWRlIHsKKyAgICBpZiAoUHJpbnRFVHlwZSkKKyAgICAgIE9TIDw8ICJFeHByZXNzaW9uVHlwZVZhcmlhYmxlLCAiOworICAgIHRoaXMtPkV4cHJlc3Npb246OnByaW50SW50ZXJuYWwoT1MsIGZhbHNlKTsKKyAgICBPUyA8PCAiIHZhcmlhYmxlID0gIiA8PCAqVmFyaWFibGVWYWx1ZTsKKyAgfQorfTsKKworY2xhc3MgQ29uc3RhbnRFeHByZXNzaW9uIGZpbmFsIDogcHVibGljIEV4cHJlc3Npb24geworcHJpdmF0ZToKKyAgQ29uc3RhbnQgKkNvbnN0YW50VmFsdWUgPSBudWxscHRyOworCitwdWJsaWM6CisgIENvbnN0YW50RXhwcmVzc2lvbigpIDogRXhwcmVzc2lvbihFVF9Db25zdGFudCkge30KKyAgQ29uc3RhbnRFeHByZXNzaW9uKENvbnN0YW50ICpjb25zdGFudFZhbHVlKQorICAgICAgOiBFeHByZXNzaW9uKEVUX0NvbnN0YW50KSwgQ29uc3RhbnRWYWx1ZShjb25zdGFudFZhbHVlKSB7fQorICBDb25zdGFudEV4cHJlc3Npb24oY29uc3QgQ29uc3RhbnRFeHByZXNzaW9uICYpID0gZGVsZXRlOworICBDb25zdGFudEV4cHJlc3Npb24gJm9wZXJhdG9yPShjb25zdCBDb25zdGFudEV4cHJlc3Npb24gJikgPSBkZWxldGU7CisKKyAgc3RhdGljIGJvb2wgY2xhc3NvZihjb25zdCBFeHByZXNzaW9uICpFQikgeworICAgIHJldHVybiBFQi0+Z2V0RXhwcmVzc2lvblR5cGUoKSA9PSBFVF9Db25zdGFudDsKKyAgfQorCisgIENvbnN0YW50ICpnZXRDb25zdGFudFZhbHVlKCkgY29uc3QgeyByZXR1cm4gQ29uc3RhbnRWYWx1ZTsgfQorICB2b2lkIHNldENvbnN0YW50VmFsdWUoQ29uc3RhbnQgKlYpIHsgQ29uc3RhbnRWYWx1ZSA9IFY7IH0KKworICBib29sIGVxdWFscyhjb25zdCBFeHByZXNzaW9uICZPdGhlcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIGNvbnN0IENvbnN0YW50RXhwcmVzc2lvbiAmT0MgPSBjYXN0PENvbnN0YW50RXhwcmVzc2lvbj4oT3RoZXIpOworICAgIHJldHVybiBDb25zdGFudFZhbHVlID09IE9DLkNvbnN0YW50VmFsdWU7CisgIH0KKworICBoYXNoX2NvZGUgZ2V0SGFzaFZhbHVlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBoYXNoX2NvbWJpbmUodGhpcy0+RXhwcmVzc2lvbjo6Z2V0SGFzaFZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICBDb25zdGFudFZhbHVlLT5nZXRUeXBlKCksIENvbnN0YW50VmFsdWUpOworICB9CisKKyAgLy8gRGVidWdnaW5nIHN1cHBvcnQKKyAgdm9pZCBwcmludEludGVybmFsKHJhd19vc3RyZWFtICZPUywgYm9vbCBQcmludEVUeXBlKSBjb25zdCBvdmVycmlkZSB7CisgICAgaWYgKFByaW50RVR5cGUpCisgICAgICBPUyA8PCAiRXhwcmVzc2lvblR5cGVDb25zdGFudCwgIjsKKyAgICB0aGlzLT5FeHByZXNzaW9uOjpwcmludEludGVybmFsKE9TLCBmYWxzZSk7CisgICAgT1MgPDwgIiBjb25zdGFudCA9ICIgPDwgKkNvbnN0YW50VmFsdWU7CisgIH0KK307CisKK2NsYXNzIFVua25vd25FeHByZXNzaW9uIGZpbmFsIDogcHVibGljIEV4cHJlc3Npb24geworcHJpdmF0ZToKKyAgSW5zdHJ1Y3Rpb24gKkluc3Q7CisKK3B1YmxpYzoKKyAgVW5rbm93bkV4cHJlc3Npb24oSW5zdHJ1Y3Rpb24gKkkpIDogRXhwcmVzc2lvbihFVF9Vbmtub3duKSwgSW5zdChJKSB7fQorICBVbmtub3duRXhwcmVzc2lvbigpID0gZGVsZXRlOworICBVbmtub3duRXhwcmVzc2lvbihjb25zdCBVbmtub3duRXhwcmVzc2lvbiAmKSA9IGRlbGV0ZTsKKyAgVW5rbm93bkV4cHJlc3Npb24gJm9wZXJhdG9yPShjb25zdCBVbmtub3duRXhwcmVzc2lvbiAmKSA9IGRlbGV0ZTsKKworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IEV4cHJlc3Npb24gKkVCKSB7CisgICAgcmV0dXJuIEVCLT5nZXRFeHByZXNzaW9uVHlwZSgpID09IEVUX1Vua25vd247CisgIH0KKworICBJbnN0cnVjdGlvbiAqZ2V0SW5zdHJ1Y3Rpb24oKSBjb25zdCB7IHJldHVybiBJbnN0OyB9CisgIHZvaWQgc2V0SW5zdHJ1Y3Rpb24oSW5zdHJ1Y3Rpb24gKkkpIHsgSW5zdCA9IEk7IH0KKworICBib29sIGVxdWFscyhjb25zdCBFeHByZXNzaW9uICZPdGhlcikgY29uc3Qgb3ZlcnJpZGUgeworICAgIGNvbnN0IGF1dG8gJk9VID0gY2FzdDxVbmtub3duRXhwcmVzc2lvbj4oT3RoZXIpOworICAgIHJldHVybiBJbnN0ID09IE9VLkluc3Q7CisgIH0KKworICBoYXNoX2NvZGUgZ2V0SGFzaFZhbHVlKCkgY29uc3Qgb3ZlcnJpZGUgeworICAgIHJldHVybiBoYXNoX2NvbWJpbmUodGhpcy0+RXhwcmVzc2lvbjo6Z2V0SGFzaFZhbHVlKCksIEluc3QpOworICB9CisKKyAgLy8gRGVidWdnaW5nIHN1cHBvcnQKKyAgdm9pZCBwcmludEludGVybmFsKHJhd19vc3RyZWFtICZPUywgYm9vbCBQcmludEVUeXBlKSBjb25zdCBvdmVycmlkZSB7CisgICAgaWYgKFByaW50RVR5cGUpCisgICAgICBPUyA8PCAiRXhwcmVzc2lvblR5cGVVbmtub3duLCAiOworICAgIHRoaXMtPkV4cHJlc3Npb246OnByaW50SW50ZXJuYWwoT1MsIGZhbHNlKTsKKyAgICBPUyA8PCAiIGluc3QgPSAiIDw8ICpJbnN0OworICB9Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgR1ZORXhwcmVzc2lvbgorCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9HVk5FWFBSRVNTSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvR3VhcmRXaWRlbmluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9HdWFyZFdpZGVuaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJjMDk0MAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvR3VhcmRXaWRlbmluZy5oCkBAIC0wLDAgKzEsMzIgQEAKKy8vPT09LSBHdWFyZFdpZGVuaW5nLmggLSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gR3VhcmQgd2lkZW5pbmcgaXMgYW4gb3B0aW1pemF0aW9uIG92ZXIgdGhlIEBsbHZtLmV4cGVyaW1lbnRhbC5ndWFyZCBpbnRyaW5zaWMKKy8vIHRoYXQgKG9wdGltaXN0aWNhbGx5KSBjb21iaW5lcyBtdWx0aXBsZSBndWFyZHMgaW50byBvbmUgdG8gaGF2ZSBmZXdlciBjaGVja3MKKy8vIGF0IHJ1bnRpbWUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfR1VBUkRfV0lERU5JTkdfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0dVQVJEX1dJREVOSU5HX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKKworc3RydWN0IEd1YXJkV2lkZW5pbmdQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48R3VhcmRXaWRlbmluZ1Bhc3M+IHsKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKK30KKworCisjZW5kaWYgIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfR1VBUkRfV0lERU5JTkdfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9JVlVzZXJzUHJpbnRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9JVlVzZXJzUHJpbnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhZDAwZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0lWVXNlcnNQcmludGVyLmgKQEAgLTAsMCArMSwzMCBAQAorLy89PT0tIElWVXNlcnNQcmludGVyLmggLSBJbmR1Y3Rpb24gVmFyaWFibGUgVXNlcnMgUHJpbnRpbmcgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0lWVVNFUlNQUklOVEVSX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9JVlVTRVJTUFJJTlRFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0lWVXNlcnMuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvcmF3X29zdHJlYW0uaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BQYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBQcmludGVyIHBhc3MgZm9yIHRoZSBcYyBJVlVzZXJzIGZvciBhIGxvb3AuCitjbGFzcyBJVlVzZXJzUHJpbnRlclBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxJVlVzZXJzUHJpbnRlclBhc3M+IHsKKyAgcmF3X29zdHJlYW0gJk9TOworCitwdWJsaWM6CisgIGV4cGxpY2l0IElWVXNlcnNQcmludGVyUGFzcyhyYXdfb3N0cmVhbSAmT1MpIDogT1MoT1MpIHt9CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihMb29wICZMLCBMb29wQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmQVIsIExQTVVwZGF0ZXIgJlUpOworfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0luZFZhclNpbXBsaWZ5LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0luZFZhclNpbXBsaWZ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTMyMWM4ZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvSW5kVmFyU2ltcGxpZnkuaApAQCAtMCwwICsxLDM0IEBACisvLz09PS0gSW5kVmFyU2ltcGxpZnkuaCAtIEluZHVjdGlvbiBWYXJpYWJsZSBTaW1wbGlmaWNhdGlvbiAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgSW5kdWN0aW9uIFZhcmlhYmxlCisvLyBTaW1wbGlmaWNhdGlvbiBwYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9JTkRWQVJTSU1QTElGWV9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfSU5EVkFSU0lNUExJRllfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wQW5hbHlzaXNNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExvb3A7CitjbGFzcyBMUE1VcGRhdGVyOworCitjbGFzcyBJbmRWYXJTaW1wbGlmeVBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxJbmRWYXJTaW1wbGlmeVBhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKExvb3AgJkwsIExvb3BBbmFseXNpc01hbmFnZXIgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9vcFN0YW5kYXJkQW5hbHlzaXNSZXN1bHRzICZBUiwgTFBNVXBkYXRlciAmVSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9JTkRWQVJTSU1QTElGWV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0luZHVjdGl2ZVJhbmdlQ2hlY2tFbGltaW5hdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9JbmR1Y3RpdmVSYW5nZUNoZWNrRWxpbWluYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMTFjNTQ5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9JbmR1Y3RpdmVSYW5nZUNoZWNrRWxpbWluYXRpb24uaApAQCAtMCwwICsxLDMxIEBACisvLz09PS0gSW5kdWN0aXZlUmFuZ2VDaGVja0VsaW1pbmF0aW9uLmggLSBJUkNFIC0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgSW5kdWN0aXZlIFJhbmdlIENoZWNrIEVsaW1pbmF0aW9uCisvLyBsb29wIHBhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0lORFVDVElWRVJBTkdFQ0hFQ0tFTElNSU5BVElPTl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfSU5EVUNUSVZFUkFOR0VDSEVDS0VMSU1JTkFUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BQYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIElSQ0VQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48SVJDRVBhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKExvb3AgJkwsIExvb3BBbmFseXNpc01hbmFnZXIgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9vcFN0YW5kYXJkQW5hbHlzaXNSZXN1bHRzICZBUiwgTFBNVXBkYXRlciAmVSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9JTkRVQ1RJVkVSQU5HRUNIRUNLRUxJTUlOQVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9KdW1wVGhyZWFkaW5nLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0p1bXBUaHJlYWRpbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzQ5M2EyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9KdW1wVGhyZWFkaW5nLmgKQEAgLTAsMCArMSwxNjEgQEAKKy8vPT09LSBKdW1wVGhyZWFkaW5nLmggLSB0aHJlYWQgY29udHJvbCB0aHJvdWdoIGNvbmRpdGlvbmFsIEJCcyAtKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gU2VlIHRoZSBjb21tZW50cyBvbiBKdW1wVGhyZWFkaW5nUGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfSlVNUFRIUkVBRElOR19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfSlVNUFRIUkVBRElOR19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9CbG9ja0ZyZXF1ZW5jeUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0JyYW5jaFByb2JhYmlsaXR5SW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgQmluYXJ5T3BlcmF0b3I7CitjbGFzcyBCcmFuY2hJbnN0OworY2xhc3MgQ21wSW5zdDsKK2NsYXNzIENvbnN0YW50OworY2xhc3MgRGVmZXJyZWREb21pbmFuY2U7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgSW50cmluc2ljSW5zdDsKK2NsYXNzIExhenlWYWx1ZUluZm87CitjbGFzcyBMb2FkSW5zdDsKK2NsYXNzIFBISU5vZGU7CitjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mbzsKK2NsYXNzIFZhbHVlOworCisvLy8gQSBwcml2YXRlICJtb2R1bGUiIG5hbWVzcGFjZSBmb3IgdHlwZXMgYW5kIHV0aWxpdGllcyB1c2VkIGJ5CisvLy8gSnVtcFRocmVhZGluZy4KKy8vLyBUaGVzZSBhcmUgaW1wbGVtZW50YXRpb24gZGV0YWlscyBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IGNsaWVudHMuCituYW1lc3BhY2UganVtcHRocmVhZGluZyB7CisKKy8vIFRoZXNlIGFyZSBhdCBnbG9iYWwgc2NvcGUgc28gc3RhdGljIGZ1bmN0aW9ucyBjYW4gdXNlIHRoZW0gdG9vLgordXNpbmcgUHJlZFZhbHVlSW5mbyA9IFNtYWxsVmVjdG9ySW1wbDxzdGQ6OnBhaXI8Q29uc3RhbnQgKiwgQmFzaWNCbG9jayAqPj47Cit1c2luZyBQcmVkVmFsdWVJbmZvVHkgPSBTbWFsbFZlY3RvcjxzdGQ6OnBhaXI8Q29uc3RhbnQgKiwgQmFzaWNCbG9jayAqPiwgOD47CisKKy8vIFRoaXMgaXMgdXNlZCB0byBrZWVwIHRyYWNrIG9mIHdoYXQga2luZCBvZiBjb25zdGFudCB3ZSdyZSBjdXJyZW50bHkgaG9waW5nCisvLyB0byBmaW5kLgorZW51bSBDb25zdGFudFByZWZlcmVuY2UgeyBXYW50SW50ZWdlciwgV2FudEJsb2NrQWRkcmVzcyB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UganVtcHRocmVhZGluZworCisvLy8gVGhpcyBwYXNzIHBlcmZvcm1zICdqdW1wIHRocmVhZGluZycsIHdoaWNoIGxvb2tzIGF0IGJsb2NrcyB0aGF0IGhhdmUKKy8vLyBtdWx0aXBsZSBwcmVkZWNlc3NvcnMgYW5kIG11bHRpcGxlIHN1Y2Nlc3NvcnMuICBJZiBvbmUgb3IgbW9yZSBvZiB0aGUKKy8vLyBwcmVkZWNlc3NvcnMgb2YgdGhlIGJsb2NrIGNhbiBiZSBwcm92ZW4gdG8gYWx3YXlzIGp1bXAgdG8gb25lIG9mIHRoZQorLy8vIHN1Y2Nlc3NvcnMsIHdlIGZvcndhcmQgdGhlIGVkZ2UgZnJvbSB0aGUgcHJlZGVjZXNzb3IgdG8gdGhlIHN1Y2Nlc3NvciBieQorLy8vIGR1cGxpY2F0aW5nIHRoZSBjb250ZW50cyBvZiB0aGlzIGJsb2NrLgorLy8vCisvLy8gQW4gZXhhbXBsZSBvZiB3aGVuIHRoaXMgY2FuIG9jY3VyIGlzIGNvZGUgbGlrZSB0aGlzOgorLy8vCisvLy8gICBpZiAoKSB7IC4uLgorLy8vICAgICBYID0gNDsKKy8vLyAgIH0KKy8vLyAgIGlmIChYIDwgMykgeworLy8vCisvLy8gSW4gdGhpcyBjYXNlLCB0aGUgdW5jb25kaXRpb25hbCBicmFuY2ggYXQgdGhlIGVuZCBvZiB0aGUgZmlyc3QgaWYgY2FuIGJlCisvLy8gcmV2ZWN0b3JlZCB0byB0aGUgZmFsc2Ugc2lkZSBvZiB0aGUgc2Vjb25kIGlmLgorY2xhc3MgSnVtcFRocmVhZGluZ1Bhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxKdW1wVGhyZWFkaW5nUGFzcz4geworICBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJOworICBMYXp5VmFsdWVJbmZvICpMVkk7CisgIEFsaWFzQW5hbHlzaXMgKkFBOworICBEZWZlcnJlZERvbWluYW5jZSAqRERUOworICBzdGQ6OnVuaXF1ZV9wdHI8QmxvY2tGcmVxdWVuY3lJbmZvPiBCRkk7CisgIHN0ZDo6dW5pcXVlX3B0cjxCcmFuY2hQcm9iYWJpbGl0eUluZm8+IEJQSTsKKyAgYm9vbCBIYXNQcm9maWxlRGF0YSA9IGZhbHNlOworICBib29sIEhhc0d1YXJkcyA9IGZhbHNlOworI2lmZGVmIE5ERUJVRworICBTbWFsbFB0clNldDxjb25zdCBCYXNpY0Jsb2NrICosIDE2PiBMb29wSGVhZGVyczsKKyNlbHNlCisgIFNtYWxsU2V0PEFzc2VydGluZ1ZIPGNvbnN0IEJhc2ljQmxvY2s+LCAxNj4gTG9vcEhlYWRlcnM7CisjZW5kaWYKKyAgRGVuc2VTZXQ8c3RkOjpwYWlyPFZhbHVlICosIEJhc2ljQmxvY2sgKj4+IFJlY3Vyc2lvblNldDsKKworICB1bnNpZ25lZCBCQkR1cFRocmVzaG9sZDsKKworICAvLyBSQUlJIGhlbHBlciBmb3IgdXBkYXRpbmcgdGhlIHJlY3Vyc2lvbiBzdGFjay4KKyAgc3RydWN0IFJlY3Vyc2lvblNldFJlbW92ZXIgeworICAgIERlbnNlU2V0PHN0ZDo6cGFpcjxWYWx1ZSAqLCBCYXNpY0Jsb2NrICo+PiAmVGhlU2V0OworICAgIHN0ZDo6cGFpcjxWYWx1ZSAqLCBCYXNpY0Jsb2NrICo+IFRoZVBhaXI7CisKKyAgICBSZWN1cnNpb25TZXRSZW1vdmVyKERlbnNlU2V0PHN0ZDo6cGFpcjxWYWx1ZSAqLCBCYXNpY0Jsb2NrICo+PiAmUywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6cGFpcjxWYWx1ZSAqLCBCYXNpY0Jsb2NrICo+IFApCisgICAgICAgIDogVGhlU2V0KFMpLCBUaGVQYWlyKFApIHt9CisKKyAgICB+UmVjdXJzaW9uU2V0UmVtb3ZlcigpIHsgVGhlU2V0LmVyYXNlKFRoZVBhaXIpOyB9CisgIH07CisKK3B1YmxpYzoKKyAgSnVtcFRocmVhZGluZ1Bhc3MoaW50IFQgPSAtMSk7CisKKyAgLy8gR2x1ZSBmb3Igb2xkIFBNLgorICBib29sIHJ1bkltcGwoRnVuY3Rpb24gJkYsIFRhcmdldExpYnJhcnlJbmZvICpUTElfLCBMYXp5VmFsdWVJbmZvICpMVklfLAorICAgICAgICAgICAgICAgQWxpYXNBbmFseXNpcyAqQUFfLCBEZWZlcnJlZERvbWluYW5jZSAqRERUXywKKyAgICAgICAgICAgICAgIGJvb2wgSGFzUHJvZmlsZURhdGFfLCBzdGQ6OnVuaXF1ZV9wdHI8QmxvY2tGcmVxdWVuY3lJbmZvPiBCRklfLAorICAgICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPEJyYW5jaFByb2JhYmlsaXR5SW5mbz4gQlBJXyk7CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworCisgIHZvaWQgcmVsZWFzZU1lbW9yeSgpIHsKKyAgICBCRkkucmVzZXQoKTsKKyAgICBCUEkucmVzZXQoKTsKKyAgfQorCisgIHZvaWQgRmluZExvb3BIZWFkZXJzKEZ1bmN0aW9uICZGKTsKKyAgYm9vbCBQcm9jZXNzQmxvY2soQmFzaWNCbG9jayAqQkIpOworICBib29sIFRocmVhZEVkZ2UoQmFzaWNCbG9jayAqQkIsIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxCYXNpY0Jsb2NrICo+ICZQcmVkQkJzLAorICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqU3VjY0JCKTsKKyAgYm9vbCBEdXBsaWNhdGVDb25kQnJhbmNoT25QSElJbnRvUHJlZCgKKyAgICAgIEJhc2ljQmxvY2sgKkJCLCBjb25zdCBTbWFsbFZlY3RvckltcGw8QmFzaWNCbG9jayAqPiAmUHJlZEJCcyk7CisKKyAgYm9vbAorICBDb21wdXRlVmFsdWVLbm93bkluUHJlZGVjZXNzb3JzKFZhbHVlICpWLCBCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqdW1wdGhyZWFkaW5nOjpQcmVkVmFsdWVJbmZvICZSZXN1bHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganVtcHRocmVhZGluZzo6Q29uc3RhbnRQcmVmZXJlbmNlIFByZWZlcmVuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkN4dEkgPSBudWxscHRyKTsKKyAgYm9vbCBQcm9jZXNzVGhyZWFkYWJsZUVkZ2VzKFZhbHVlICpDb25kLCBCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGp1bXB0aHJlYWRpbmc6OkNvbnN0YW50UHJlZmVyZW5jZSBQcmVmZXJlbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW5zdHJ1Y3Rpb24gKkN4dEkgPSBudWxscHRyKTsKKworICBib29sIFByb2Nlc3NCcmFuY2hPblBISShQSElOb2RlICpQTik7CisgIGJvb2wgUHJvY2Vzc0JyYW5jaE9uWE9SKEJpbmFyeU9wZXJhdG9yICpCTyk7CisgIGJvb2wgUHJvY2Vzc0ltcGxpZWRDb25kaXRpb24oQmFzaWNCbG9jayAqQkIpOworCisgIGJvb2wgU2ltcGxpZnlQYXJ0aWFsbHlSZWR1bmRhbnRMb2FkKExvYWRJbnN0ICpMSSk7CisgIGJvb2wgVHJ5VG9VbmZvbGRTZWxlY3QoQ21wSW5zdCAqQ29uZENtcCwgQmFzaWNCbG9jayAqQkIpOworICBib29sIFRyeVRvVW5mb2xkU2VsZWN0SW5DdXJyQkIoQmFzaWNCbG9jayAqQkIpOworCisgIGJvb2wgUHJvY2Vzc0d1YXJkcyhCYXNpY0Jsb2NrICpCQik7CisgIGJvb2wgVGhyZWFkR3VhcmQoQmFzaWNCbG9jayAqQkIsIEludHJpbnNpY0luc3QgKkd1YXJkLCBCcmFuY2hJbnN0ICpCSSk7CisKK3ByaXZhdGU6CisgIEJhc2ljQmxvY2sgKlNwbGl0QmxvY2tQcmVkcyhCYXNpY0Jsb2NrICpCQiwgQXJyYXlSZWY8QmFzaWNCbG9jayAqPiBQcmVkcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKlN1ZmZpeCk7CisgIHZvaWQgVXBkYXRlQmxvY2tGcmVxQW5kRWRnZVdlaWdodChCYXNpY0Jsb2NrICpQcmVkQkIsIEJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqTmV3QkIsIEJhc2ljQmxvY2sgKlN1Y2NCQik7CisgIC8vLyBDaGVjayBpZiB0aGUgYmxvY2sgaGFzIHByb2ZpbGUgbWV0YWRhdGEgZm9yIGl0cyBvdXRnb2luZyBlZGdlcy4KKyAgYm9vbCBkb2VzQmxvY2tIYXZlUHJvZmlsZURhdGEoQmFzaWNCbG9jayAqQkIpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfSlVNUFRIUkVBRElOR19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xJQ00uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTElDTS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4YWQxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xJQ00uaApAQCAtMCwwICsxLDUwIEBACisvLz09PS0gTElDTS5oIC0gTG9vcCBJbnZhcmlhbnQgQ29kZSBNb3Rpb24gUGFzcyAtLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIHBlcmZvcm1zIGxvb3AgaW52YXJpYW50IGNvZGUgbW90aW9uLCBhdHRlbXB0aW5nIHRvIHJlbW92ZSBhcyBtdWNoCisvLyBjb2RlIGZyb20gdGhlIGJvZHkgb2YgYSBsb29wIGFzIHBvc3NpYmxlLiAgSXQgZG9lcyB0aGlzIGJ5IGVpdGhlciBob2lzdGluZworLy8gY29kZSBpbnRvIHRoZSBwcmVoZWFkZXIgYmxvY2ssIG9yIGJ5IHNpbmtpbmcgY29kZSB0byB0aGUgZXhpdCBibG9ja3MgaWYgaXQgaXMKKy8vIHNhZmUuICBUaGlzIHBhc3MgYWxzbyBwcm9tb3RlcyBtdXN0LWFsaWFzZWQgbWVtb3J5IGxvY2F0aW9ucyBpbiB0aGUgbG9vcCB0bworLy8gbGl2ZSBpbiByZWdpc3RlcnMsIHRodXMgaG9pc3RpbmcgYW5kIHNpbmtpbmcgImludmFyaWFudCIgbG9hZHMgYW5kIHN0b3Jlcy4KKy8vCisvLyBUaGlzIHBhc3MgdXNlcyBhbGlhcyBhbmFseXNpcyBmb3IgdHdvIHB1cnBvc2VzOgorLy8KKy8vICAxLiBNb3ZpbmcgbG9vcCBpbnZhcmlhbnQgbG9hZHMgYW5kIGNhbGxzIG91dCBvZiBsb29wcy4gIElmIHdlIGNhbiBkZXRlcm1pbmUKKy8vICAgICB0aGF0IGEgbG9hZCBvciBjYWxsIGluc2lkZSBvZiBhIGxvb3AgbmV2ZXIgYWxpYXNlcyBhbnl0aGluZyBzdG9yZWQgdG8sCisvLyAgICAgd2UgY2FuIGhvaXN0IGl0IG9yIHNpbmsgaXQgbGlrZSBhbnkgb3RoZXIgaW5zdHJ1Y3Rpb24uCisvLyAgMi4gU2NhbGFyIFByb21vdGlvbiBvZiBNZW1vcnkgLSBJZiB0aGVyZSBpcyBhIHN0b3JlIGluc3RydWN0aW9uIGluc2lkZSBvZgorLy8gICAgIHRoZSBsb29wLCB3ZSB0cnkgdG8gbW92ZSB0aGUgc3RvcmUgdG8gaGFwcGVuIEFGVEVSIHRoZSBsb29wIGluc3RlYWQgb2YKKy8vICAgICBpbnNpZGUgb2YgdGhlIGxvb3AuICBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiBhIGZldyBjb25kaXRpb25zIGFyZSB0cnVlOgorLy8gICAgICAgQS4gVGhlIHBvaW50ZXIgc3RvcmVkIHRocm91Z2ggaXMgbG9vcCBpbnZhcmlhbnQKKy8vICAgICAgIEIuIFRoZXJlIGFyZSBubyBzdG9yZXMgb3IgbG9hZHMgaW4gdGhlIGxvb3Agd2hpY2ggX21heV8gYWxpYXMgdGhlCisvLyAgICAgICAgICBwb2ludGVyLiAgVGhlcmUgYXJlIG5vIGNhbGxzIGluIHRoZSBsb29wIHdoaWNoIG1vZC9yZWYgdGhlIHBvaW50ZXIuCisvLyAgICAgSWYgdGhlc2UgY29uZGl0aW9ucyBhcmUgdHJ1ZSwgd2UgY2FuIHByb21vdGUgdGhlIGxvYWRzIGFuZCBzdG9yZXMgaW4gdGhlCisvLyAgICAgbG9vcCBvZiB0aGUgcG9pbnRlciB0byB1c2UgYSB0ZW1wb3JhcnkgYWxsb2NhJ2QgdmFyaWFibGUuICBXZSB0aGVuIHVzZQorLy8gICAgIHRoZSBTU0FVcGRhdGVyIHRvIGNvbnN0cnVjdCB0aGUgYXBwcm9wcmlhdGUgU1NBIGZvcm0gZm9yIHRoZSB2YWx1ZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTElDTV9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTElDTV9ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFBhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFBlcmZvcm1zIExvb3AgSW52YXJpYW50IENvZGUgTW90aW9uIFBhc3MuCitjbGFzcyBMSUNNUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPExJQ01QYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihMb29wICZMLCBMb29wQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmQVIsIExQTVVwZGF0ZXIgJlUpOworfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xJQ01fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wQWNjZXNzQW5hbHlzaXNQcmludGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BBY2Nlc3NBbmFseXNpc1ByaW50ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWRkZDVmCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wQWNjZXNzQW5hbHlzaXNQcmludGVyLmgKQEAgLTAsMCArMSwzMSBAQAorLy89PT0tIGxsdm0vQW5hbHlzaXMvTG9vcEFjY2Vzc0FuYWx5c2lzUHJpbnRlci5oIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BBQ0NFU1NBTkFMWVNJU1BSSU5URVJfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BBQ0NFU1NBTkFMWVNJU1BSSU5URVJfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gXGJyaWVmIFByaW50ZXIgcGFzcyBmb3IgdGhlIFxjIExvb3BBY2Nlc3NJbmZvIHJlc3VsdHMuCitjbGFzcyBMb29wQWNjZXNzSW5mb1ByaW50ZXJQYXNzCisgICAgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxMb29wQWNjZXNzSW5mb1ByaW50ZXJQYXNzPiB7CisgIHJhd19vc3RyZWFtICZPUzsKKworcHVibGljOgorICBleHBsaWNpdCBMb29wQWNjZXNzSW5mb1ByaW50ZXJQYXNzKHJhd19vc3RyZWFtICZPUykgOiBPUyhPUykge30KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKExvb3AgJkwsIExvb3BBbmFseXNpc01hbmFnZXIgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9vcFN0YW5kYXJkQW5hbHlzaXNSZXN1bHRzICZBUiwgTFBNVXBkYXRlciAmVSk7Cit9OworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcERhdGFQcmVmZXRjaC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wRGF0YVByZWZldGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTJjN2EwMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcERhdGFQcmVmZXRjaC5oCkBAIC0wLDAgKzEsMzMgQEAKKy8vPT09LS0tLS0tLS0gTG9vcERhdGFQcmVmZXRjaC5oIC0gTG9vcCBEYXRhIFByZWZldGNoaW5nIFBhc3MgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vIFxmaWxlCisvLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgZm9yIExMVk0ncyBMb29wIERhdGEgUHJlZmV0Y2hpbmcgUGFzcy4KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QREFUQVBSRUZFVENIX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QREFUQVBSRUZFVENIX0gKKworI2luY2x1ZGUgImxsdm0vSVIvRnVuY3Rpb24uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEFuIG9wdGltaXphdGlvbiBwYXNzIGluc2VydGluZyBkYXRhIHByZWZldGNoZXMgaW4gbG9vcHMuCitjbGFzcyBMb29wRGF0YVByZWZldGNoUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPExvb3BEYXRhUHJlZmV0Y2hQYXNzPiB7CitwdWJsaWM6CisgIExvb3BEYXRhUHJlZmV0Y2hQYXNzKCkgPSBkZWZhdWx0OworCisgIC8vLyBcYnJpZWYgUnVuIHRoZSBwYXNzIG92ZXIgdGhlIGZ1bmN0aW9uLgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QREFUQVBSRUZFVENIX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcERlbGV0aW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BEZWxldGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiOGNiMWUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BEZWxldGlvbi5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vPT09LSBMb29wRGVsZXRpb24uaCAtIExvb3AgRGVsZXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgZm9yIHRoZSBMb29wIERlbGV0aW9uIFBhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BERUxFVElPTl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUERFTEVUSU9OX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcEFuYWx5c2lzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BQYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExvb3BEZWxldGlvblBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxMb29wRGVsZXRpb25QYXNzPiB7CitwdWJsaWM6CisgIExvb3BEZWxldGlvblBhc3MoKSA9IGRlZmF1bHQ7CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKExvb3AgJkwsIExvb3BBbmFseXNpc01hbmFnZXIgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9vcFN0YW5kYXJkQW5hbHlzaXNSZXN1bHRzICZBUiwgTFBNVXBkYXRlciAmVSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QREVMRVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wRGlzdHJpYnV0ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wRGlzdHJpYnV0ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiZjFjOWQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BEaXN0cmlidXRlLmgKQEAgLTAsMCArMSwzMyBAQAorLy89PT0tIExvb3BEaXN0cmlidXRlLmNwcCAtIExvb3AgRGlzdHJpYnV0aW9uIFBhc3MgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgTG9vcCBEaXN0cmlidXRpb24gUGFzcy4gIEl0cyBtYWluIGZvY3VzIGlzIHRvCisvLyBkaXN0cmlidXRlIGxvb3BzIHRoYXQgY2Fubm90IGJlIHZlY3Rvcml6ZWQgZHVlIHRvIGRlcGVuZGVuY2UgY3ljbGVzLiAgSXQKKy8vIHRyaWVzIHRvIGlzb2xhdGUgdGhlIG9mZmVuZGluZyBkZXBlbmRlbmNlcyBpbnRvIGEgbmV3IGxvb3AgYWxsb3dpbmcKKy8vIHZlY3Rvcml6YXRpb24gb2YgdGhlIHJlbWFpbmluZyBwYXJ0cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUERJU1RSSUJVVEVfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BESVNUUklCVVRFX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBGdW5jdGlvbjsKKworY2xhc3MgTG9vcERpc3RyaWJ1dGVQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48TG9vcERpc3RyaWJ1dGVQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BESVNUUklCVVRFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcElkaW9tUmVjb2duaXplLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BJZGlvbVJlY29nbml6ZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZGRlZDgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BJZGlvbVJlY29nbml6ZS5oCkBAIC0wLDAgKzEsMzYgQEAKKy8vPT09LSBMb29wSWRpb21SZWNvZ25pemUuaCAtIExvb3AgSWRpb20gUmVjb2duaXplIFBhc3MgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIGltcGxlbWVudHMgYW4gaWRpb20gcmVjb2duaXplciB0aGF0IHRyYW5zZm9ybXMgc2ltcGxlIGxvb3BzIGludG8gYQorLy8gbm9uLWxvb3AgZm9ybS4gIEluIGNhc2VzIHRoYXQgdGhpcyBraWNrcyBpbiwgaXQgY2FuIGJlIGEgc2lnbmlmaWNhbnQKKy8vIHBlcmZvcm1hbmNlIHdpbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUElESU9NUkVDT0dOSVpFX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QSURJT01SRUNPR05JWkVfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wQW5hbHlzaXNNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExvb3A7CitjbGFzcyBMUE1VcGRhdGVyOworCisvLy8gUGVyZm9ybXMgTG9vcCBJZGlvbSBSZWNvZ25pemUgUGFzcy4KK2NsYXNzIExvb3BJZGlvbVJlY29nbml6ZVBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxMb29wSWRpb21SZWNvZ25pemVQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihMb29wICZMLCBMb29wQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmQVIsIExQTVVwZGF0ZXIgJlUpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUElESU9NUkVDT0dOSVpFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcExvYWRFbGltaW5hdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wTG9hZEVsaW1pbmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjA1MTRhNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcExvYWRFbGltaW5hdGlvbi5oCkBAIC0wLDAgKzEsMzQgQEAKKy8vPT09LSBMb29wTG9hZEVsaW1pbmF0aW9uLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8vIFxmaWxlCisvLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyB0aGUgTG9vcExvYWRFbGltaW5hdGlvblBhc3Mgb2JqZWN0LiBUaGlzIHBhc3MgZm9yd2FyZHMKKy8vLyBsb2FkZWQgdmFsdWVzIGFyb3VuZCBsb29wIGJhY2tlZGdlcyB0byBhbGxvdyB0aGVpciB1c2UgaW4gc3Vic2VxdWVudAorLy8vIGl0ZXJhdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BMT0FERUxJTUlOQVRJT05fSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BMT0FERUxJTUlOQVRJT05fSAorCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworCisvLy8gUGFzcyB0byBmb3J3YXJkIGxvYWRzIGluIGEgbG9vcCBhcm91bmQgdGhlIGJhY2tlZGdlIHRvIHN1YnNlcXVlbnQKKy8vLyBpdGVyYXRpb25zLgorc3RydWN0IExvb3BMb2FkRWxpbWluYXRpb25QYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48TG9vcExvYWRFbGltaW5hdGlvblBhc3M+IHsKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUExPQURFTElNSU5BVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BQYXNzTWFuYWdlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wUGFzc01hbmFnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NmE0NWVkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wUGFzc01hbmFnZXIuaApAQCAtMCwwICsxLDQwNiBAQAorLy89PT0tIExvb3BQYXNzTWFuYWdlci5oIC0gTG9vcCBwYXNzIG1hbmFnZW1lbnQgLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vCisvLy8gVGhpcyBoZWFkZXIgcHJvdmlkZXMgY2xhc3NlcyBmb3IgbWFuYWdpbmcgYSBwaXBlbGluZSBvZiBwYXNzZXMgb3ZlciBsb29wcworLy8vIGluIExMVk0gSVIuCisvLy8KKy8vLyBUaGUgcHJpbWFyeSBsb29wIHBhc3MgcGlwZWxpbmUgaXMgbWFuYWdlZCBpbiBhIHZlcnkgcGFydGljdWxhciB3YXkgdG8KKy8vLyBwcm92aWRlIGEgc2V0IG9mIGNvcmUgZ3VhcmFudGVlczoKKy8vLyAxKSBMb29wcyBhcmUsIHdoZXJlIHBvc3NpYmxlLCBpbiBzaW1wbGlmaWVkIGZvcm0uCisvLy8gMikgTG9vcHMgYXJlICphbHdheXMqIGluIExDU1NBIGZvcm0uCisvLy8gMykgQSBjb2xsZWN0aW9uIG9mIExvb3Atc3BlY2lmaWMgYW5hbHlzaXMgcmVzdWx0cyBhcmUgYXZhaWxhYmxlOgorLy8vICAgIC0gTG9vcEluZm8KKy8vLyAgICAtIERvbWluYXRvclRyZWUKKy8vLyAgICAtIFNjYWxhckV2b2x1dGlvbgorLy8vICAgIC0gQUFNYW5hZ2VyCisvLy8gNCkgQWxsIGxvb3AgcGFzc2VzIHByZXNlcnZlICMxICh3aGVyZSBwb3NzaWJsZSksICMyLCBhbmQgIzMuCisvLy8gNSkgTG9vcCBwYXNzZXMgcnVuIG92ZXIgZWFjaCBsb29wIGluIHRoZSBsb29wIG5lc3QgZnJvbSB0aGUgaW5uZXJtb3N0IHRvCisvLy8gICAgdGhlIG91dGVybW9zdC4gU3BlY2lmaWNhbGx5LCBhbGwgaW5uZXIgbG9vcHMgYXJlIHByb2Nlc3NlZCBiZWZvcmUKKy8vLyAgICBwYXNzZXMgcnVuIG92ZXIgb3V0ZXIgbG9vcHMuIFdoZW4gcnVubmluZyB0aGUgcGlwZWxpbmUgYWNyb3NzIGFuIGlubmVyCisvLy8gICAgbG9vcCBjcmVhdGVzIG5ldyBpbm5lciBsb29wcywgdGhvc2UgYXJlIGFkZGVkIGFuZCBwcm9jZXNzZWQgaW4gdGhpcworLy8vICAgIG9yZGVyIGFzIHdlbGwuCisvLy8KKy8vLyBUaGlzIHByb2Nlc3MgaXMgZGVzaWduZWQgdG8gZmFjaWxpdGF0ZSB0cmFuc2Zvcm1hdGlvbnMgd2hpY2ggc2ltcGxpZnksCisvLy8gcmVkdWNlLCBhbmQgcmVtb3ZlIGxvb3BzLiBGb3IgcGFzc2VzIHdoaWNoIGFyZSBtb3JlIG9yaWVudGVkIHRvd2FyZHMKKy8vLyBvcHRpbWl6aW5nIGxvb3BzLCBlc3BlY2lhbGx5IG9wdGltaXppbmcgbG9vcCAqbmVzdHMqIGluc3RlYWQgb2Ygc2luZ2xlCisvLy8gbG9vcHMgaW4gaXNvbGF0aW9uLCB0aGlzIGZyYW1ld29yayBpcyBsZXNzIGludGVyZXN0aW5nLgorLy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUFBBU1NNQU5BR0VSX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QUEFTU01BTkFHRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvUG9zdE9yZGVySXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Qcmlvcml0eVdvcmtsaXN0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9CYXNpY0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0dsb2JhbHNNb2RSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BBbmFseXNpc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9TY2FsYXJFdm9sdXRpb24uaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbkFsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1RhcmdldExpYnJhcnlJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9UYXJnZXRUcmFuc2Zvcm1JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9MQ1NTQS5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb29wU2ltcGxpZnkuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLyBGb3J3YXJkIGRlY2xhcmF0aW9ucyBvZiBhbiB1cGRhdGUgdHJhY2tpbmcgQVBJIHVzZWQgaW4gdGhlIHBhc3MgbWFuYWdlci4KK2NsYXNzIExQTVVwZGF0ZXI7CisKKy8vIEV4cGxpY2l0IHNwZWNpYWxpemF0aW9uIGFuZCBpbnN0YW50aWF0aW9uIGRlY2xhcmF0aW9ucyBmb3IgdGhlIHBhc3MgbWFuYWdlci4KKy8vIFNlZSB0aGUgY29tbWVudHMgb24gdGhlIGRlZmluaXRpb24gb2YgdGhlIHNwZWNpYWxpemF0aW9uIGZvciBkZXRhaWxzIG9uIGhvdworLy8gaXQgZGlmZmVycyBmcm9tIHRoZSBwcmltYXJ5IHRlbXBsYXRlLgordGVtcGxhdGUgPD4KK1ByZXNlcnZlZEFuYWx5c2VzCitQYXNzTWFuYWdlcjxMb29wLCBMb29wQW5hbHlzaXNNYW5hZ2VyLCBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgJiwKKyAgICAgICAgICAgIExQTVVwZGF0ZXIgJj46OnJ1bihMb29wICZJbml0aWFsTCwgTG9vcEFuYWx5c2lzTWFuYWdlciAmQU0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcFN0YW5kYXJkQW5hbHlzaXNSZXN1bHRzICZBbmFseXNpc1Jlc3VsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTFBNVXBkYXRlciAmVSk7CitleHRlcm4gdGVtcGxhdGUgY2xhc3MgUGFzc01hbmFnZXI8TG9vcCwgTG9vcEFuYWx5c2lzTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgJiwgTFBNVXBkYXRlciAmPjsKKworLy8vIFxicmllZiBUaGUgTG9vcCBwYXNzIG1hbmFnZXIuCisvLy8KKy8vLyBTZWUgdGhlIGRvY3VtZW50YXRpb24gZm9yIHRoZSBQYXNzTWFuYWdlciB0ZW1wbGF0ZSBmb3IgZGV0YWlscy4gSXQgcnVucworLy8vIGEgc2VxdWVuY2Ugb2YgTG9vcCBwYXNzZXMgb3ZlciBlYWNoIExvb3AgdGhhdCB0aGUgbWFuYWdlciBpcyBydW4gb3Zlci4gVGhpcworLy8vIHR5cGVkZWYgc2VydmVzIGFzIGEgY29udmVuaWVudCB3YXkgdG8gcmVmZXIgdG8gdGhpcyBjb25zdHJ1Y3QuCit0eXBlZGVmIFBhc3NNYW5hZ2VyPExvb3AsIExvb3BBbmFseXNpc01hbmFnZXIsIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmLAorICAgICAgICAgICAgICAgICAgICBMUE1VcGRhdGVyICY+CisgICAgTG9vcFBhc3NNYW5hZ2VyOworCisvLy8gQSBwYXJ0aWFsIHNwZWNpYWxpemF0aW9uIG9mIHRoZSByZXF1aXJlIGFuYWx5c2lzIHRlbXBsYXRlIHBhc3MgdG8gZm9yd2FyZAorLy8vIHRoZSBleHRyYSBwYXJhbWV0ZXJzIGZyb20gYSB0cmFuc2Zvcm1hdGlvbidzIHJ1biBtZXRob2QgdG8gdGhlCisvLy8gQW5hbHlzaXNNYW5hZ2VyJ3MgZ2V0UmVzdWx0LgordGVtcGxhdGUgPHR5cGVuYW1lIEFuYWx5c2lzVD4KK3N0cnVjdCBSZXF1aXJlQW5hbHlzaXNQYXNzPEFuYWx5c2lzVCwgTG9vcCwgTG9vcEFuYWx5c2lzTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmLCBMUE1VcGRhdGVyICY+CisgICAgOiBQYXNzSW5mb01peGluPAorICAgICAgICAgIFJlcXVpcmVBbmFseXNpc1Bhc3M8QW5hbHlzaXNULCBMb29wLCBMb29wQW5hbHlzaXNNYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcFN0YW5kYXJkQW5hbHlzaXNSZXN1bHRzICYsIExQTVVwZGF0ZXIgJj4+IHsKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKExvb3AgJkwsIExvb3BBbmFseXNpc01hbmFnZXIgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9vcFN0YW5kYXJkQW5hbHlzaXNSZXN1bHRzICZBUiwgTFBNVXBkYXRlciAmKSB7CisgICAgKHZvaWQpQU0udGVtcGxhdGUgZ2V0UmVzdWx0PEFuYWx5c2lzVD4oTCwgQVIpOworICAgIHJldHVybiBQcmVzZXJ2ZWRBbmFseXNlczo6YWxsKCk7CisgIH0KK307CisKKy8vLyBBbiBhbGlhcyB0ZW1wbGF0ZSB0byBlYXNpbHkgbmFtZSBhIHJlcXVpcmUgYW5hbHlzaXMgbG9vcCBwYXNzLgordGVtcGxhdGUgPHR5cGVuYW1lIEFuYWx5c2lzVD4KK3VzaW5nIFJlcXVpcmVBbmFseXNpc0xvb3BQYXNzID0KKyAgICBSZXF1aXJlQW5hbHlzaXNQYXNzPEFuYWx5c2lzVCwgTG9vcCwgTG9vcEFuYWx5c2lzTWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmLCBMUE1VcGRhdGVyICY+OworCituYW1lc3BhY2UgaW50ZXJuYWwgeworLy8vIEhlbHBlciB0byBpbXBsZW1lbnQgYXBwZW5kaW5nIG9mIGxvb3BzIG9udG8gYSB3b3JrbGlzdC4KKy8vLworLy8vIFdlIHdhbnQgdG8gcHJvY2VzcyBsb29wcyBpbiBwb3N0b3JkZXIsIGJ1dCB0aGUgd29ya2xpc3QgaXMgYSBMSUZPIGRhdGEKKy8vLyBzdHJ1Y3R1cmUsIHNvIHdlIGFwcGVuZCB0byBpdCBpbiAqcmV2ZXJzZSogcG9zdG9yZGVyLgorLy8vCisvLy8gRm9yIHRyZWVzLCBhIHByZW9yZGVyIHRyYXZlcnNhbCBpcyBhIHZpYWJsZSByZXZlcnNlIHBvc3RvcmRlciwgc28gd2UKKy8vLyBhY3R1YWxseSBhcHBlbmQgdXNpbmcgYSBwcmVvcmRlciB3YWxrIGFsZ29yaXRobS4KK3RlbXBsYXRlIDx0eXBlbmFtZSBSYW5nZVQ+CitpbmxpbmUgdm9pZCBhcHBlbmRMb29wc1RvV29ya2xpc3QoUmFuZ2VUICYmTG9vcHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQcmlvcml0eVdvcmtsaXN0PExvb3AgKiwgND4gJldvcmtsaXN0KSB7CisgIC8vIFdlIHVzZSBhbiBpbnRlcm5hbCB3b3JrbGlzdCB0byBidWlsZCB1cCB0aGUgcHJlb3JkZXIgdHJhdmVyc2FsIHdpdGhvdXQKKyAgLy8gcmVjdXJzaW9uLgorICBTbWFsbFZlY3RvcjxMb29wICosIDQ+IFByZU9yZGVyTG9vcHMsIFByZU9yZGVyV29ya2xpc3Q7CisKKyAgLy8gV2Ugd2FsayB0aGUgaW5pdGlhbCBzZXF1ZW5jZSBvZiBsb29wcyBpbiByZXZlcnNlIGJlY2F1c2Ugd2UgZ2VuZXJhbGx5IHdhbnQKKyAgLy8gdG8gdmlzaXQgZGVmcyBiZWZvcmUgdXNlcyBhbmQgdGhlIHdvcmtsaXN0IGlzIExJRk8uCisgIGZvciAoTG9vcCAqUm9vdEwgOiByZXZlcnNlKExvb3BzKSkgeworICAgIGFzc2VydChQcmVPcmRlckxvb3BzLmVtcHR5KCkgJiYgIk11c3Qgc3RhcnQgd2l0aCBhbiBlbXB0eSBwcmVvcmRlciB3YWxrLiIpOworICAgIGFzc2VydChQcmVPcmRlcldvcmtsaXN0LmVtcHR5KCkgJiYKKyAgICAgICAgICAgIk11c3Qgc3RhcnQgd2l0aCBhbiBlbXB0eSBwcmVvcmRlciB3YWxrIHdvcmtsaXN0LiIpOworICAgIFByZU9yZGVyV29ya2xpc3QucHVzaF9iYWNrKFJvb3RMKTsKKyAgICBkbyB7CisgICAgICBMb29wICpMID0gUHJlT3JkZXJXb3JrbGlzdC5wb3BfYmFja192YWwoKTsKKyAgICAgIFByZU9yZGVyV29ya2xpc3QuYXBwZW5kKEwtPmJlZ2luKCksIEwtPmVuZCgpKTsKKyAgICAgIFByZU9yZGVyTG9vcHMucHVzaF9iYWNrKEwpOworICAgIH0gd2hpbGUgKCFQcmVPcmRlcldvcmtsaXN0LmVtcHR5KCkpOworCisgICAgV29ya2xpc3QuaW5zZXJ0KHN0ZDo6bW92ZShQcmVPcmRlckxvb3BzKSk7CisgICAgUHJlT3JkZXJMb29wcy5jbGVhcigpOworICB9Cit9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBMb29wUGFzc1Q+IGNsYXNzIEZ1bmN0aW9uVG9Mb29wUGFzc0FkYXB0b3I7CisKKy8vLyBUaGlzIGNsYXNzIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgdXBkYXRpbmcgdGhlIGxvb3AgcGFzcyBtYW5hZ2VyIGJhc2VkCisvLy8gb24gbXV0YXRpb25zIHRvIHRoZSBsb29wIG5lc3QuCisvLy8KKy8vLyBBIHJlZmVyZW5jZSB0byBhbiBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIHBhc3NlZCBhcyBhbiBhcmd1bWVudCB0byBlYWNoCisvLy8gTG9vcCBwYXNzLCBhbmQgTG9vcCBwYXNzZXMgc2hvdWxkIHVzZSBpdCB0byB1cGRhdGUgTFBNIGluZnJhc3RydWN0dXJlIGlmCisvLy8gdGhleSBtb2RpZnkgdGhlIGxvb3AgbmVzdCBzdHJ1Y3R1cmUuCitjbGFzcyBMUE1VcGRhdGVyIHsKK3B1YmxpYzoKKyAgLy8vIFRoaXMgY2FuIGJlIHF1ZXJpZWQgYnkgbG9vcCBwYXNzZXMgd2hpY2ggcnVuIG90aGVyIGxvb3AgcGFzc2VzIChsaWtlIHBhc3MKKyAgLy8vIG1hbmFnZXJzKSB0byBrbm93IHdoZXRoZXIgdGhlIGxvb3AgbmVlZHMgdG8gYmUgc2tpcHBlZCBkdWUgdG8gdXBkYXRlcyB0bworICAvLy8gdGhlIGxvb3AgbmVzdC4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIHJldHVybnMgdHJ1ZSwgdGhlIGxvb3Agb2JqZWN0IG1heSBoYXZlIGJlZW4gZGVsZXRlZCwgc28gcGFzc2VzCisgIC8vLyBzaG91bGQgdGFrZSBjYXJlIG5vdCB0byB0b3VjaCB0aGUgb2JqZWN0LgorICBib29sIHNraXBDdXJyZW50TG9vcCgpIGNvbnN0IHsgcmV0dXJuIFNraXBDdXJyZW50TG9vcDsgfQorCisgIC8vLyBMb29wIHBhc3NlcyBzaG91bGQgdXNlIHRoaXMgbWV0aG9kIHRvIGluZGljYXRlIHRoZXkgaGF2ZSBkZWxldGVkIGEgbG9vcAorICAvLy8gZnJvbSB0aGUgbmVzdC4KKyAgLy8vCisgIC8vLyBOb3RlIHRoYXQgdGhpcyBsb29wIG11c3QgZWl0aGVyIGJlIHRoZSBjdXJyZW50IGxvb3Agb3IgYSBzdWJsb29wIG9mIHRoZQorICAvLy8gY3VycmVudCBsb29wLiBUaGlzIHJvdXRpbmUgbXVzdCBiZSBjYWxsZWQgcHJpb3IgdG8gcmVtb3ZpbmcgdGhlIGxvb3AgZnJvbQorICAvLy8gdGhlIGxvb3AgbmVzdC4KKyAgLy8vCisgIC8vLyBJZiB0aGlzIGlzIGNhbGxlZCBmb3IgdGhlIGN1cnJlbnQgbG9vcCwgaW4gYWRkaXRpb24gdG8gY2xlYXJpbmcgYW55CisgIC8vLyBzdGF0ZSwgdGhpcyByb3V0aW5lIHdpbGwgbWFyayB0aGF0IHRoZSBjdXJyZW50IGxvb3Agc2hvdWxkIGJlIHNraXBwZWQgYnkKKyAgLy8vIHRoZSByZXN0IG9mIHRoZSBwYXNzIG1hbmFnZW1lbnQgaW5mcmFzdHJ1Y3R1cmUuCisgIHZvaWQgbWFya0xvb3BBc0RlbGV0ZWQoTG9vcCAmTCwgbGx2bTo6U3RyaW5nUmVmIE5hbWUpIHsKKyAgICBMQU0uY2xlYXIoTCwgTmFtZSk7CisgICAgYXNzZXJ0KCgmTCA9PSBDdXJyZW50TCB8fCBDdXJyZW50TC0+Y29udGFpbnMoJkwpKSAmJgorICAgICAgICAgICAiQ2Fubm90IGRlbGV0ZSBhIGxvb3Agb3V0c2lkZSBvZiB0aGUgIgorICAgICAgICAgICAic3VibG9vcCB0cmVlIGN1cnJlbnRseSBiZWluZyBwcm9jZXNzZWQuIik7CisgICAgaWYgKCZMID09IEN1cnJlbnRMKQorICAgICAgU2tpcEN1cnJlbnRMb29wID0gdHJ1ZTsKKyAgfQorCisgIC8vLyBMb29wIHBhc3NlcyBzaG91bGQgdXNlIHRoaXMgbWV0aG9kIHRvIGluZGljYXRlIHRoZXkgaGF2ZSBhZGRlZCBuZXcgY2hpbGQKKyAgLy8vIGxvb3BzIG9mIHRoZSBjdXJyZW50IGxvb3AuCisgIC8vLworICAvLy8gXHAgTmV3Q2hpbGRMb29wcyBtdXN0IGNvbnRhaW4gb25seSB0aGUgaW1tZWRpYXRlIGNoaWxkcmVuLiBBbnkgbmVzdGVkCisgIC8vLyBsb29wcyB3aXRoaW4gdGhlbSB3aWxsIGJlIHZpc2l0ZWQgaW4gcG9zdG9yZGVyIGFzIHVzdWFsIGZvciB0aGUgbG9vcCBwYXNzCisgIC8vLyBtYW5hZ2VyLgorICB2b2lkIGFkZENoaWxkTG9vcHMoQXJyYXlSZWY8TG9vcCAqPiBOZXdDaGlsZExvb3BzKSB7CisgICAgLy8gSW5zZXJ0IG91cnNlbHZlcyBiYWNrIGludG8gdGhlIHdvcmtsaXN0IGZpcnN0LCBhcyB0aGlzIGxvb3Agc2hvdWxkIGJlCisgICAgLy8gcmV2aXNpdGVkIGFmdGVyIGFsbCB0aGUgY2hpbGRyZW4gaGF2ZSBiZWVuIHByb2Nlc3NlZC4KKyAgICBXb3JrbGlzdC5pbnNlcnQoQ3VycmVudEwpOworCisjaWZuZGVmIE5ERUJVRworICAgIGZvciAoTG9vcCAqTmV3TCA6IE5ld0NoaWxkTG9vcHMpCisgICAgICBhc3NlcnQoTmV3TC0+Z2V0UGFyZW50TG9vcCgpID09IEN1cnJlbnRMICYmICJBbGwgb2YgdGhlIG5ldyBsb29wcyBtdXN0ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJlIGltbWVkaWF0ZSBjaGlsZHJlbiBvZiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGUgY3VycmVudCBsb29wISIpOworI2VuZGlmCisKKyAgICBpbnRlcm5hbDo6YXBwZW5kTG9vcHNUb1dvcmtsaXN0KE5ld0NoaWxkTG9vcHMsIFdvcmtsaXN0KTsKKworICAgIC8vIEFsc28gc2tpcCBmdXJ0aGVyIHByb2Nlc3Npbmcgb2YgdGhlIGN1cnJlbnQgbG9vcC0taXQgd2lsbCBiZSByZXZpc2l0ZWQKKyAgICAvLyBhZnRlciBhbGwgb2YgaXRzIG5ld2x5IGFkZGVkIGNoaWxkcmVuIGFyZSBhY2NvdW50ZWQgZm9yLgorICAgIFNraXBDdXJyZW50TG9vcCA9IHRydWU7CisgIH0KKworICAvLy8gTG9vcCBwYXNzZXMgc2hvdWxkIHVzZSB0aGlzIG1ldGhvZCB0byBpbmRpY2F0ZSB0aGV5IGhhdmUgYWRkZWQgbmV3CisgIC8vLyBzaWJsaW5nIGxvb3BzIHRvIHRoZSBjdXJyZW50IGxvb3AuCisgIC8vLworICAvLy8gXHAgTmV3U2liTG9vcHMgbXVzdCBvbmx5IGNvbnRhaW4gdGhlIGltbWVkaWF0ZSBzaWJsaW5nIGxvb3BzLiBBbnkgbmVzdGVkCisgIC8vLyBsb29wcyB3aXRoaW4gdGhlbSB3aWxsIGJlIHZpc2l0ZWQgaW4gcG9zdG9yZGVyIGFzIHVzdWFsIGZvciB0aGUgbG9vcCBwYXNzCisgIC8vLyBtYW5hZ2VyLgorICB2b2lkIGFkZFNpYmxpbmdMb29wcyhBcnJheVJlZjxMb29wICo+IE5ld1NpYkxvb3BzKSB7CisjaWZuZGVmIE5ERUJVRworICAgIGZvciAoTG9vcCAqTmV3TCA6IE5ld1NpYkxvb3BzKQorICAgICAgYXNzZXJ0KE5ld0wtPmdldFBhcmVudExvb3AoKSA9PSBQYXJlbnRMICYmCisgICAgICAgICAgICAgIkFsbCBvZiB0aGUgbmV3IGxvb3BzIG11c3QgYmUgc2libGluZ3Mgb2YgdGhlIGN1cnJlbnQgbG9vcCEiKTsKKyNlbmRpZgorCisgICAgaW50ZXJuYWw6OmFwcGVuZExvb3BzVG9Xb3JrbGlzdChOZXdTaWJMb29wcywgV29ya2xpc3QpOworCisgICAgLy8gTm8gbmVlZCB0byBza2lwIHRoZSBjdXJyZW50IGxvb3Agb3IgcmV2aXNpdCBpdCwgYXMgc2libGluZyBsb29wcworICAgIC8vIHNob3VsZG4ndCBpbXBhY3QgYW55dGhpbmcuCisgIH0KKworICAvLy8gUmVzdGFydCB0aGUgY3VycmVudCBsb29wLgorICAvLy8KKyAgLy8vIExvb3AgcGFzc2VzIHNob3VsZCBjYWxsIHRoaXMgbWV0aG9kIHRvIGluZGljYXRlIHRoZSBjdXJyZW50IGxvb3AgaGFzIGJlZW4KKyAgLy8vIHN1ZmZpY2llbnRseSBjaGFuZ2VkIHRoYXQgaXQgc2hvdWxkIGJlIHJlLXZpc2l0ZWQgZnJvbSB0aGUgYmVnaW5pbmcgb2YKKyAgLy8vIHRoZSBsb29wIHBhc3MgcGlwZWxpbmUgcmF0aGVyIHRoYW4gY29udGludWluZy4KKyAgdm9pZCByZXZpc2l0Q3VycmVudExvb3AoKSB7CisgICAgLy8gVGVsbCB0aGUgY3VycmVudGx5IGluLWZsaWdodCBwaXBlbGluZSB0byBzdG9wIHJ1bm5pbmcuCisgICAgU2tpcEN1cnJlbnRMb29wID0gdHJ1ZTsKKworICAgIC8vIEFuZCBpbnNlcnQgb3Vyc2VsdmVzIGJhY2sgaW50byB0aGUgd29ya2xpc3QuCisgICAgV29ya2xpc3QuaW5zZXJ0KEN1cnJlbnRMKTsKKyAgfQorCitwcml2YXRlOgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgTG9vcFBhc3NUPiBmcmllbmQgY2xhc3MgbGx2bTo6RnVuY3Rpb25Ub0xvb3BQYXNzQWRhcHRvcjsKKworICAvLy8gVGhlIFxjIEZ1bmN0aW9uVG9Mb29wUGFzc0FkYXB0b3IncyB3b3JrbGlzdCBvZiBsb29wcyB0byBwcm9jZXNzLgorICBTbWFsbFByaW9yaXR5V29ya2xpc3Q8TG9vcCAqLCA0PiAmV29ya2xpc3Q7CisKKyAgLy8vIFRoZSBhbmFseXNpcyBtYW5hZ2VyIGZvciB1c2UgaW4gdGhlIGN1cnJlbnQgbG9vcCBuZXN0LgorICBMb29wQW5hbHlzaXNNYW5hZ2VyICZMQU07CisKKyAgTG9vcCAqQ3VycmVudEw7CisgIGJvb2wgU2tpcEN1cnJlbnRMb29wOworCisjaWZuZGVmIE5ERUJVRworICAvLyBJbiBkZWJ1ZyBidWlsZHMgd2UgYWxzbyB0cmFjayB0aGUgcGFyZW50IGxvb3AgdG8gaW1wbGVtZW50IGFzc2VydHMgZXZlbiBpbgorICAvLyB0aGUgZmFjZSBvZiBsb29wIGRlbGV0aW9uLgorICBMb29wICpQYXJlbnRMOworI2VuZGlmCisKKyAgTFBNVXBkYXRlcihTbWFsbFByaW9yaXR5V29ya2xpc3Q8TG9vcCAqLCA0PiAmV29ya2xpc3QsCisgICAgICAgICAgICAgTG9vcEFuYWx5c2lzTWFuYWdlciAmTEFNKQorICAgICAgOiBXb3JrbGlzdChXb3JrbGlzdCksIExBTShMQU0pIHt9Cit9OworCisvLy8gXGJyaWVmIEFkYXB0b3IgdGhhdCBtYXBzIGZyb20gYSBmdW5jdGlvbiB0byBpdHMgbG9vcHMuCisvLy8KKy8vLyBEZXNpZ25lZCB0byBhbGxvdyBjb21wb3NpdGlvbiBvZiBhIExvb3BQYXNzKE1hbmFnZXIpIGFuZCBhCisvLy8gRnVuY3Rpb25QYXNzTWFuYWdlci4gTm90ZSB0aGF0IGlmIHRoaXMgcGFzcyBpcyBjb25zdHJ1Y3RlZCB3aXRoIGEgXGMKKy8vLyBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciBpdCB3aWxsIHJ1biB0aGUgXGMgTG9vcEFuYWx5c2lzTWFuYWdlckZ1bmN0aW9uUHJveHkKKy8vLyBhbmFseXNpcyBwcmlvciB0byBydW5uaW5nIHRoZSBsb29wIHBhc3NlcyBvdmVyIHRoZSBmdW5jdGlvbiB0byBlbmFibGUgYSBcYworLy8vIExvb3BBbmFseXNpc01hbmFnZXIgdG8gYmUgdXNlZCB3aXRoaW4gdGhpcyBydW4gc2FmZWx5LgordGVtcGxhdGUgPHR5cGVuYW1lIExvb3BQYXNzVD4KK2NsYXNzIEZ1bmN0aW9uVG9Mb29wUGFzc0FkYXB0b3IKKyAgICA6IHB1YmxpYyBQYXNzSW5mb01peGluPEZ1bmN0aW9uVG9Mb29wUGFzc0FkYXB0b3I8TG9vcFBhc3NUPj4geworcHVibGljOgorICBleHBsaWNpdCBGdW5jdGlvblRvTG9vcFBhc3NBZGFwdG9yKExvb3BQYXNzVCBQYXNzLCBib29sIERlYnVnTG9nZ2luZyA9IGZhbHNlKQorICAgICAgOiBQYXNzKHN0ZDo6bW92ZShQYXNzKSksIExvb3BDYW5vbmljYWxpemF0aW9uRlBNKERlYnVnTG9nZ2luZykgeworICAgIExvb3BDYW5vbmljYWxpemF0aW9uRlBNLmFkZFBhc3MoTG9vcFNpbXBsaWZ5UGFzcygpKTsKKyAgICBMb29wQ2Fub25pY2FsaXphdGlvbkZQTS5hZGRQYXNzKExDU1NBUGFzcygpKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgUnVucyB0aGUgbG9vcCBwYXNzZXMgYWNyb3NzIGV2ZXJ5IGxvb3AgaW4gdGhlIGZ1bmN0aW9uLgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSkgeworICAgIC8vIEJlZm9yZSB3ZSBldmVuIGNvbXB1dGUgYW55IGxvb3AgYW5hbHlzZXMsIGZpcnN0IHJ1biBhIG1pbmlhdHVyZSBmdW5jdGlvbgorICAgIC8vIHBhc3MgcGlwZWxpbmUgdG8gcHV0IGxvb3BzIGludG8gdGhlaXIgY2Fub25pY2FsIGZvcm0uIE5vdGUgdGhhdCB3ZSBjYW4KKyAgICAvLyBkaXJlY3RseSBidWlsZCB1cCBmdW5jdGlvbiBhbmFseXNlcyBhZnRlciB0aGlzIGFzIHRoZSBmdW5jdGlvbiBwYXNzCisgICAgLy8gbWFuYWdlciBoYW5kbGVzIGFsbCB0aGUgaW52YWxpZGF0aW9uIGF0IHRoYXQgbGF5ZXIuCisgICAgUHJlc2VydmVkQW5hbHlzZXMgUEEgPSBMb29wQ2Fub25pY2FsaXphdGlvbkZQTS5ydW4oRiwgQU0pOworCisgICAgLy8gR2V0IHRoZSBsb29wIHN0cnVjdHVyZSBmb3IgdGhpcyBmdW5jdGlvbgorICAgIExvb3BJbmZvICZMSSA9IEFNLmdldFJlc3VsdDxMb29wQW5hbHlzaXM+KEYpOworCisgICAgLy8gSWYgdGhlcmUgYXJlIG5vIGxvb3BzLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIGhlcmUuCisgICAgaWYgKExJLmVtcHR5KCkpCisgICAgICByZXR1cm4gUEE7CisKKyAgICAvLyBHZXQgdGhlIGFuYWx5c2lzIHJlc3VsdHMgbmVlZGVkIGJ5IGxvb3AgcGFzc2VzLgorICAgIE1lbW9yeVNTQSAqTVNTQSA9IEVuYWJsZU1TU0FMb29wRGVwZW5kZW5jeQorICAgICAgICAgICAgICAgICAgICAgICAgICA/ICgmQU0uZ2V0UmVzdWx0PE1lbW9yeVNTQUFuYWx5c2lzPihGKS5nZXRNU1NBKCkpCisgICAgICAgICAgICAgICAgICAgICAgICAgIDogbnVsbHB0cjsKKyAgICBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgTEFSID0ge0FNLmdldFJlc3VsdDxBQU1hbmFnZXI+KEYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU0uZ2V0UmVzdWx0PEFzc3VtcHRpb25BbmFseXNpcz4oRiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBTS5nZXRSZXN1bHQ8RG9taW5hdG9yVHJlZUFuYWx5c2lzPihGKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNLmdldFJlc3VsdDxMb29wQW5hbHlzaXM+KEYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU0uZ2V0UmVzdWx0PFNjYWxhckV2b2x1dGlvbkFuYWx5c2lzPihGKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFNLmdldFJlc3VsdDxUYXJnZXRMaWJyYXJ5QW5hbHlzaXM+KEYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQU0uZ2V0UmVzdWx0PFRhcmdldElSQW5hbHlzaXM+KEYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTVNTQX07CisKKyAgICAvLyBTZXR1cCB0aGUgbG9vcCBhbmFseXNpcyBtYW5hZ2VyIGZyb20gaXRzIHByb3h5LiBJdCBpcyBpbXBvcnRhbnQgdGhhdAorICAgIC8vIHRoaXMgaXMgb25seSBkb25lIHdoZW4gdGhlcmUgYXJlIGxvb3BzIHRvIHByb2Nlc3MgYW5kIHdlIGhhdmUgYnVpbHQgdGhlCisgICAgLy8gTG9vcFN0YW5kYXJkQW5hbHlzaXNSZXN1bHRzIG9iamVjdC4gVGhlIGxvb3AgYW5hbHlzZXMgY2FjaGVkIGluIHRoaXMKKyAgICAvLyBtYW5hZ2VyIGhhdmUgYWNjZXNzIHRvIHRob3NlIGFuYWx5c2lzIHJlc3VsdHMgYW5kIHNvIGl0IG11c3QgaW52YWxpZGF0ZQorICAgIC8vIGl0c2VsZiB3aGVuIHRoZXkgZ28gYXdheS4KKyAgICBMb29wQW5hbHlzaXNNYW5hZ2VyICZMQU0gPQorICAgICAgICBBTS5nZXRSZXN1bHQ8TG9vcEFuYWx5c2lzTWFuYWdlckZ1bmN0aW9uUHJveHk+KEYpLmdldE1hbmFnZXIoKTsKKworICAgIC8vIEEgcG9zdG9yZGVyIHdvcmtsaXN0IG9mIGxvb3BzIHRvIHByb2Nlc3MuCisgICAgU21hbGxQcmlvcml0eVdvcmtsaXN0PExvb3AgKiwgND4gV29ya2xpc3Q7CisKKyAgICAvLyBSZWdpc3RlciB0aGUgd29ya2xpc3QgYW5kIGxvb3AgYW5hbHlzaXMgbWFuYWdlciBzbyB0aGF0IGxvb3AgcGFzc2VzIGNhbgorICAgIC8vIHVwZGF0ZSB0aGVtIHdoZW4gdGhleSBtdXRhdGUgdGhlIGxvb3AgbmVzdCBzdHJ1Y3R1cmUuCisgICAgTFBNVXBkYXRlciBVcGRhdGVyKFdvcmtsaXN0LCBMQU0pOworCisgICAgLy8gQWRkIHRoZSBsb29wIG5lc3RzIGluIHRoZSByZXZlcnNlIG9yZGVyIG9mIExvb3BJbmZvLiBGb3Igc29tZSByZWFzb24sCisgICAgLy8gdGhleSBhcmUgc3RvcmVkIGluIFJQTyB3LnIudC4gdGhlIGNvbnRyb2wgZmxvdyBncmFwaCBpbiBMb29wSW5mby4gRm9yCisgICAgLy8gdGhlIHB1cnBvc2Ugb2YgdW5yb2xsaW5nLCBsb29wIGRlbGV0aW9uLCBhbmQgTElDTSwgd2UgbGFyZ2VseSB3YW50IHRvCisgICAgLy8gd29yayBmb3J3YXJkIGFjcm9zcyB0aGUgQ0ZHIHNvIHRoYXQgd2UgdmlzaXQgZGVmcyBiZWZvcmUgdXNlcyBhbmQgY2FuCisgICAgLy8gcHJvcGFnYXRlIHNpbXBsaWZpY2F0aW9ucyBmcm9tIG9uZSBsb29wIG5lc3QgaW50byB0aGUgbmV4dC4KKyAgICAvLyBGSVhNRTogQ29uc2lkZXIgY2hhbmdpbmcgdGhlIG9yZGVyIGluIExvb3BJbmZvLgorICAgIGludGVybmFsOjphcHBlbmRMb29wc1RvV29ya2xpc3QocmV2ZXJzZShMSSksIFdvcmtsaXN0KTsKKworICAgIGRvIHsKKyAgICAgIExvb3AgKkwgPSBXb3JrbGlzdC5wb3BfYmFja192YWwoKTsKKworICAgICAgLy8gUmVzZXQgdGhlIHVwZGF0ZSBzdHJ1Y3R1cmUgZm9yIHRoaXMgbG9vcC4KKyAgICAgIFVwZGF0ZXIuQ3VycmVudEwgPSBMOworICAgICAgVXBkYXRlci5Ta2lwQ3VycmVudExvb3AgPSBmYWxzZTsKKworI2lmbmRlZiBOREVCVUcKKyAgICAgIC8vIFNhdmUgYSBwYXJlbnQgbG9vcCBwb2ludGVyIGZvciBhc3NlcnRzLgorICAgICAgVXBkYXRlci5QYXJlbnRMID0gTC0+Z2V0UGFyZW50TG9vcCgpOworCisgICAgICAvLyBWZXJpZnkgdGhlIGxvb3Agc3RydWN0dXJlIGFuZCBMQ1NTQSBmb3JtIGJlZm9yZSB2aXNpdGluZyB0aGUgbG9vcC4KKyAgICAgIEwtPnZlcmlmeUxvb3AoKTsKKyAgICAgIGFzc2VydChMLT5pc1JlY3Vyc2l2ZWx5TENTU0FGb3JtKExBUi5EVCwgTEkpICYmCisgICAgICAgICAgICAgIkxvb3BzIG11c3QgcmVtYWluIGluIExDU1NBIGZvcm0hIik7CisjZW5kaWYKKworICAgICAgUHJlc2VydmVkQW5hbHlzZXMgUGFzc1BBID0gUGFzcy5ydW4oKkwsIExBTSwgTEFSLCBVcGRhdGVyKTsKKyAgICAgIC8vIEZJWE1FOiBXZSBzaG91bGQgdmVyaWZ5IHRoZSBzZXQgb2YgYW5hbHlzZXMgcmVsZXZhbnQgdG8gTG9vcCBwYXNzZXMKKyAgICAgIC8vIGFyZSBwcmVzZXJ2ZWQuCisKKyAgICAgIC8vIElmIHRoZSBsb29wIGhhc24ndCBiZWVuIGRlbGV0ZWQsIHdlIG5lZWQgdG8gaGFuZGxlIGludmFsaWRhdGlvbiBoZXJlLgorICAgICAgaWYgKCFVcGRhdGVyLnNraXBDdXJyZW50TG9vcCgpKQorICAgICAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGxvb3AgcGFzcyBjb3VsZG4ndCBoYXZlIGludmFsaWRhdGVkIGFueSBvdGhlcgorICAgICAgICAvLyBsb29wJ3MgYW5hbHlzZXMgKHRoYXQncyB0aGUgY29udHJhY3Qgb2YgYSBsb29wIHBhc3MpLCBzbyBkaXJlY3RseQorICAgICAgICAvLyBoYW5kbGUgdGhlIGxvb3AgYW5hbHlzaXMgbWFuYWdlcidzIGludmFsaWRhdGlvbiBoZXJlLgorICAgICAgICBMQU0uaW52YWxpZGF0ZSgqTCwgUGFzc1BBKTsKKworICAgICAgLy8gVGhlbiBpbnRlcnNlY3QgdGhlIHByZXNlcnZlZCBzZXQgc28gdGhhdCBpbnZhbGlkYXRpb24gb2YgbW9kdWxlCisgICAgICAvLyBhbmFseXNlcyB3aWxsIGV2ZW50dWFsbHkgb2NjdXIgd2hlbiB0aGUgbW9kdWxlIHBhc3MgY29tcGxldGVzLgorICAgICAgUEEuaW50ZXJzZWN0KHN0ZDo6bW92ZShQYXNzUEEpKTsKKyAgICB9IHdoaWxlICghV29ya2xpc3QuZW1wdHkoKSk7CisKKyAgICAvLyBCeSBkZWZpbml0aW9uIHdlIHByZXNlcnZlIHRoZSBwcm94eS4gV2UgYWxzbyBwcmVzZXJ2ZSBhbGwgYW5hbHlzZXMgb24KKyAgICAvLyBMb29wcy4gVGhpcyBwcmVjbHVkZXMgKmFueSogaW52YWxpZGF0aW9uIG9mIGxvb3AgYW5hbHlzZXMgYnkgdGhlIHByb3h5LAorICAgIC8vIGJ1dCB0aGF0J3MgT0sgYmVjYXVzZSB3ZSd2ZSB0YWtlbiBjYXJlIHRvIGludmFsaWRhdGUgYW5hbHlzZXMgaW4gdGhlCisgICAgLy8gbG9vcCBhbmFseXNpcyBtYW5hZ2VyIGluY3JlbWVudGFsbHkgYWJvdmUuCisgICAgUEEucHJlc2VydmVTZXQ8QWxsQW5hbHlzZXNPbjxMb29wPj4oKTsKKyAgICBQQS5wcmVzZXJ2ZTxMb29wQW5hbHlzaXNNYW5hZ2VyRnVuY3Rpb25Qcm94eT4oKTsKKyAgICAvLyBXZSBhbHNvIHByZXNlcnZlIHRoZSBzZXQgb2Ygc3RhbmRhcmQgYW5hbHlzZXMuCisgICAgUEEucHJlc2VydmU8RG9taW5hdG9yVHJlZUFuYWx5c2lzPigpOworICAgIFBBLnByZXNlcnZlPExvb3BBbmFseXNpcz4oKTsKKyAgICBQQS5wcmVzZXJ2ZTxTY2FsYXJFdm9sdXRpb25BbmFseXNpcz4oKTsKKyAgICAvLyBGSVhNRTogVW5jb21tZW50IHRoaXMgd2hlbiBhbGwgbG9vcCBwYXNzZXMgcHJlc2VydmUgTWVtb3J5U1NBCisgICAgLy8gUEEucHJlc2VydmU8TWVtb3J5U1NBQW5hbHlzaXM+KCk7CisgICAgLy8gRklYTUU6IFdoYXQgd2UgcmVhbGx5IHdhbnQgdG8gZG8gaGVyZSBpcyBwcmVzZXJ2ZSBhbiBBQSBjYXRlZ29yeSwgYnV0CisgICAgLy8gdGhhdCBjb25jZXB0IGRvZXNuJ3QgZXhpc3QgeWV0LgorICAgIFBBLnByZXNlcnZlPEFBTWFuYWdlcj4oKTsKKyAgICBQQS5wcmVzZXJ2ZTxCYXNpY0FBPigpOworICAgIFBBLnByZXNlcnZlPEdsb2JhbHNBQT4oKTsKKyAgICBQQS5wcmVzZXJ2ZTxTQ0VWQUE+KCk7CisgICAgcmV0dXJuIFBBOworICB9CisKK3ByaXZhdGU6CisgIExvb3BQYXNzVCBQYXNzOworCisgIEZ1bmN0aW9uUGFzc01hbmFnZXIgTG9vcENhbm9uaWNhbGl6YXRpb25GUE07Cit9OworCisvLy8gXGJyaWVmIEEgZnVuY3Rpb24gdG8gZGVkdWNlIGEgbG9vcCBwYXNzIHR5cGUgYW5kIHdyYXAgaXQgaW4gdGhlIHRlbXBsYXRlZAorLy8vIGFkYXB0b3IuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgTG9vcFBhc3NUPgorRnVuY3Rpb25Ub0xvb3BQYXNzQWRhcHRvcjxMb29wUGFzc1Q+CitjcmVhdGVGdW5jdGlvblRvTG9vcFBhc3NBZGFwdG9yKExvb3BQYXNzVCBQYXNzLCBib29sIERlYnVnTG9nZ2luZyA9IGZhbHNlKSB7CisgIHJldHVybiBGdW5jdGlvblRvTG9vcFBhc3NBZGFwdG9yPExvb3BQYXNzVD4oc3RkOjptb3ZlKFBhc3MpLCBEZWJ1Z0xvZ2dpbmcpOworfQorCisvLy8gXGJyaWVmIFBhc3MgZm9yIHByaW50aW5nIGEgbG9vcCdzIGNvbnRlbnRzIGFzIHRleHR1YWwgSVIuCitjbGFzcyBQcmludExvb3BQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48UHJpbnRMb29wUGFzcz4geworICByYXdfb3N0cmVhbSAmT1M7CisgIHN0ZDo6c3RyaW5nIEJhbm5lcjsKKworcHVibGljOgorICBQcmludExvb3BQYXNzKCk7CisgIFByaW50TG9vcFBhc3MocmF3X29zdHJlYW0gJk9TLCBjb25zdCBzdGQ6OnN0cmluZyAmQmFubmVyID0gIiIpOworCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihMb29wICZMLCBMb29wQW5hbHlzaXNNYW5hZ2VyICYsCisgICAgICAgICAgICAgICAgICAgICAgICBMb29wU3RhbmRhcmRBbmFseXNpc1Jlc3VsdHMgJiwgTFBNVXBkYXRlciAmKTsKK307Cit9CisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BQQVNTTUFOQUdFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BQcmVkaWNhdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wUHJlZGljYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NzM5OGJkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wUHJlZGljYXRpb24uaApAQCAtMCwwICsxLDMyIEBACisvLz09PS0gTG9vcFByZWRpY2F0aW9uLmggLSBHdWFyZCBiYXNlZCBsb29wIHByZWRpY2F0aW9uIHBhc3MgLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyB0cmllcyB0byBjb252ZXJ0IGxvb3AgdmFyaWFudCByYW5nZSBjaGVja3MgdG8gbG9vcCBpbnZhcmlhbnQgYnkKKy8vIHdpZGVuaW5nIGNoZWNrcyBhY3Jvc3MgbG9vcCBpdGVyYXRpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QUFJFRElDQVRJT05fSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BQUkVESUNBVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFBhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFBlcmZvcm1zIExvb3AgUHJlZGljYXRpb24gUGFzcy4KK2NsYXNzIExvb3BQcmVkaWNhdGlvblBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxMb29wUHJlZGljYXRpb25QYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihMb29wICZMLCBMb29wQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmQVIsIExQTVVwZGF0ZXIgJlUpOworfTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BQUkVESUNBVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvb3BSb3RhdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wUm90YXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYThkNTYxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wUm90YXRpb24uaApAQCAtMCwwICsxLDM1IEBACisvLz09PS0gTG9vcFJvdGF0aW9uLmggLSBMb29wIFJvdGF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIGZvciB0aGUgTG9vcCBSb3RhdGlvbiBwYXNzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QUk9UQVRJT05fSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BST1RBVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFBhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIEEgc2ltcGxlIGxvb3Agcm90YXRpb24gdHJhbnNmb3JtYXRpb24uCitjbGFzcyBMb29wUm90YXRlUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPExvb3BSb3RhdGVQYXNzPiB7CitwdWJsaWM6CisgIExvb3BSb3RhdGVQYXNzKGJvb2wgRW5hYmxlSGVhZGVyRHVwbGljYXRpb24gPSB0cnVlKTsKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKExvb3AgJkwsIExvb3BBbmFseXNpc01hbmFnZXIgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9vcFN0YW5kYXJkQW5hbHlzaXNSZXN1bHRzICZBUiwgTFBNVXBkYXRlciAmVSk7CisKK3ByaXZhdGU6CisgIGNvbnN0IGJvb2wgRW5hYmxlSGVhZGVyRHVwbGljYXRpb247Cit9OworfQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QUk9UQVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wU2ltcGxpZnlDRkcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFNpbXBsaWZ5Q0ZHLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyOGM3NAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFNpbXBsaWZ5Q0ZHLmgKQEAgLTAsMCArMSwzNCBAQAorLy89PT0tIExvb3BTaW1wbGlmeUNGRy5jcHAgLSBMb29wIENGRyBTaW1wbGlmaWNhdGlvbiBQYXNzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyB0aGUgTG9vcCBTaW1wbGlmeUNGRyBQYXNzLiBUaGlzIHBhc3MgaXMgcmVzcG9uc2libGUgZm9yCisvLyBiYXNpYyBsb29wIENGRyBjbGVhbnVwLCBwcmltYXJpbHkgdG8gYXNzaXN0IG90aGVyIGxvb3AgcGFzc2VzLiBJZiB5b3UKKy8vIGVuY291bnRlciBhIG5vbmNhbm9uaWNhbCBDRkcgY29uc3RydWN0IHRoYXQgY2F1c2VzIGFub3RoZXIgbG9vcCBwYXNzIHRvCisvLyBwZXJmb3JtIHN1Ym9wdGltYWxseSwgdGhpcyBpcyB0aGUgcGxhY2UgdG8gZml4IGl0IHVwLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QU0lNUExJRllDRkdfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BTSU1QTElGWUNGR19ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0xvb3BJbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFBhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFBlcmZvcm1zIGJhc2ljIENGRyBzaW1wbGlmaWNhdGlvbnMgdG8gYXNzaXN0IG90aGVyIGxvb3AgcGFzc2VzLgorY2xhc3MgTG9vcFNpbXBsaWZ5Q0ZHUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPExvb3BTaW1wbGlmeUNGR1Bhc3M+IHsKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKExvb3AgJkwsIExvb3BBbmFseXNpc01hbmFnZXIgJkFNLAorICAgICAgICAgICAgICAgICAgICAgICAgTG9vcFN0YW5kYXJkQW5hbHlzaXNSZXN1bHRzICZBUiwgTFBNVXBkYXRlciAmVSk7Cit9OworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUFNJTVBMSUZZQ0ZHX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFNpbmsuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFNpbmsuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNzFhN2M4Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wU2luay5oCkBAIC0wLDAgKzEsNDAgQEAKKy8vPT09LSBMb29wU2luay5oIC0gTG9vcCBTaW5rIFBhc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIHByb3ZpZGVzIHRoZSBpbnRlcmZhY2UgZm9yIHRoZSBMb29wIFNpbmsgcGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUFNJTktfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX0xPT1BTSU5LX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQSBwYXNzIHRoYXQgZG9lcyBwcm9maWxlLWd1aWRlZCBzaW5raW5nIG9mIGluc3RydWN0aW9ucyBpbnRvIGxvb3BzLgorLy8vCisvLy8gVGhpcyBpcyBhIGZ1bmN0aW9uIHBhc3MgYXMgaXQgc2hvdWxkbid0IGJlIGNvbXBvc2VkIGludG8gYW55IGtpbmQgb2YKKy8vLyB1bmlmaWVkIGxvb3AgcGFzcyBwaXBlbGluZS4gVGhlIGdvYWwgb2YgaXQgaXMgdG8gc2luayBjb2RlIGludG8gbG9vcHMgdGhhdAorLy8vIGlzIGxvb3AgaW52YXJpYW50IGJ1dCBvbmx5IHJlcXVpcmVkIHdpdGhpbiB0aGUgbG9vcCBib2R5IHdoZW4gZG9pbmcgc28KKy8vLyByZWR1Y2VzIHRoZSBnbG9iYWwgZXhwZWN0ZWQgZHluYW1pYyBmcmVxdWVuY3kgd2l0aCB3aGljaCBpdCBleGVjdXRlcy4KKy8vLyBBIGNsYXNzaWMgZXhhbXBsZSBpcyBhbiBleHRyZW1lbHkgY29sZCBicmFuY2ggd2l0aGluIGEgbG9vcCBib2R5LgorLy8vCisvLy8gV2UgZG8gdGhpcyBhcyBhIHNlcGFyYXRlIHBhc3Mgc28gdGhhdCBkdXJpbmcgbm9ybWFsIG9wdGltaXphdGlvbiBhbGwKKy8vLyBpbnZhcmlhbnQgb3BlcmF0aW9ucyBjYW4gYmUgaGVsZCBvdXRzaWRlIHRoZSBsb29wIGJvZHkgdG8gc2ltcGxpZnkKKy8vLyBmdW5kYW1lbnRhbCBhbmFseXNlcyBhbmQgdHJhbnNmb3JtcyBvZiB0aGUgbG9vcC4KK2NsYXNzIExvb3BTaW5rUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPExvb3BTaW5rUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZGQU0pOworfTsKK30KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUFNJTktfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wU3RyZW5ndGhSZWR1Y2UuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFN0cmVuZ3RoUmVkdWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjJjMDM4YQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFN0cmVuZ3RoUmVkdWNlLmgKQEAgLTAsMCArMSw0MiBAQAorLy89PT0tIExvb3BTdHJlbmd0aFJlZHVjZS5oIC0gTG9vcCBTdHJlbmd0aCBSZWR1Y2UgUGFzcyAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHRyYW5zZm9ybWF0aW9uIGFuYWx5emVzIGFuZCB0cmFuc2Zvcm1zIHRoZSBpbmR1Y3Rpb24gdmFyaWFibGVzIChhbmQKKy8vIGNvbXB1dGF0aW9ucyBkZXJpdmVkIGZyb20gdGhlbSkgaW50byBmb3JtcyBzdWl0YWJsZSBmb3IgZWZmaWNpZW50IGV4ZWN1dGlvbgorLy8gb24gdGhlIHRhcmdldC4KKy8vCisvLyBUaGlzIHBhc3MgcGVyZm9ybXMgYSBzdHJlbmd0aCByZWR1Y3Rpb24gb24gYXJyYXkgcmVmZXJlbmNlcyBpbnNpZGUgbG9vcHMgdGhhdAorLy8gaGF2ZSBhcyBvbmUgb3IgbW9yZSBvZiB0aGVpciBjb21wb25lbnRzIHRoZSBsb29wIGluZHVjdGlvbiB2YXJpYWJsZSwgaXQKKy8vIHJld3JpdGVzIGV4cHJlc3Npb25zIHRvIHRha2UgYWR2YW50YWdlIG9mIHNjYWxlZC1pbmRleCBhZGRyZXNzaW5nIG1vZGVzCisvLyBhdmFpbGFibGUgb24gdGhlIHRhcmdldCwgYW5kIGl0IHBlcmZvcm1zIGEgdmFyaWV0eSBvZiBvdGhlciBvcHRpbWl6YXRpb25zCisvLyByZWxhdGVkIHRvIGxvb3AgaW5kdWN0aW9uIHZhcmlhYmxlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUFNUUkVOR1RIUkVEVUNFX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QU1RSRU5HVEhSRURVQ0VfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wQW5hbHlzaXNNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExvb3A7CitjbGFzcyBMUE1VcGRhdGVyOworCisvLy8gUGVyZm9ybXMgTG9vcCBTdHJlbmd0aCBSZWR1Y2UgUGFzcy4KK2NsYXNzIExvb3BTdHJlbmd0aFJlZHVjZVBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxMb29wU3RyZW5ndGhSZWR1Y2VQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihMb29wICZMLCBMb29wQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmQVIsIExQTVVwZGF0ZXIgJlUpOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUFNUUkVOR1RIUkVEVUNFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFVucm9sbFBhc3MuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG9vcFVucm9sbFBhc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODQ4ZTBkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wVW5yb2xsUGFzcy5oCkBAIC0wLDAgKzEsNDkgQEAKKy8vPT09LSBMb29wVW5yb2xsUGFzcy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT09QVU5ST0xMUEFTU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUFVOUk9MTFBBU1NfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wQW5hbHlzaXNNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgTG9vcDsKK2NsYXNzIExQTVVwZGF0ZXI7CisKKy8vLyBMb29wIHVucm9sbCBwYXNzIHRoYXQgb25seSBkb2VzIGZ1bGwgbG9vcCB1bnJvbGxpbmcuCitjbGFzcyBMb29wRnVsbFVucm9sbFBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxMb29wRnVsbFVucm9sbFBhc3M+IHsKKyAgY29uc3QgaW50IE9wdExldmVsOworCitwdWJsaWM6CisgIGV4cGxpY2l0IExvb3BGdWxsVW5yb2xsUGFzcyhpbnQgT3B0TGV2ZWwgPSAyKSA6IE9wdExldmVsKE9wdExldmVsKSB7fQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihMb29wICZMLCBMb29wQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmQVIsIExQTVVwZGF0ZXIgJlUpOworfTsKKworLy8vIExvb3AgdW5yb2xsIHBhc3MgdGhhdCB3aWxsIHN1cHBvcnQgYm90aCBmdWxsIGFuZCBwYXJ0aWFsIHVucm9sbGluZy4KKy8vLyBJdCBpcyBhIGZ1bmN0aW9uIHBhc3MgdG8gaGF2ZSBhY2Nlc3MgdG8gZnVuY3Rpb24gYW5kIG1vZHVsZSBhbmFseXNlcy4KKy8vLyBJdCB3aWxsIGFsc28gcHV0IGxvb3BzIGludG8gY2Fub25pY2FsIGZvcm0gKHNpbXBsaWZpZWQgYW5kIExDU1NBKS4KK2NsYXNzIExvb3BVbnJvbGxQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48TG9vcFVucm9sbFBhc3M+IHsKKyAgY29uc3QgaW50IE9wdExldmVsOworCitwdWJsaWM6CisgIC8vLyBUaGlzIHVzZXMgdGhlIHRhcmdldCBpbmZvcm1hdGlvbiAob3IgZmxhZ3MpIHRvIGNvbnRyb2wgdGhlIHRocmVzaG9sZHMgZm9yCisgIC8vLyBkaWZmZXJlbnQgdW5yb2xsaW5nIHN0YXRlZ2llcyBidXQgc3VwcG9ydHMgYWxsIG9mIHRoZW0uCisgIGV4cGxpY2l0IExvb3BVbnJvbGxQYXNzKGludCBPcHRMZXZlbCA9IDIpIDogT3B0TGV2ZWwoT3B0TGV2ZWwpIHt9CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9PUFVOUk9MTFBBU1NfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb3dlckF0b21pYy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb3dlckF0b21pYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0YTJlN2EKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvd2VyQXRvbWljLmgKQEAgLTAsMCArMSwyOSBAQAorLy89PT0tIExvd2VyQXRvbWljLmNwcCAtIExvd2VyIGF0b21pYyBpbnRyaW5zaWNzIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8gVGhpcyBwYXNzIGxvd2VycyBhdG9taWMgaW50cmluc2ljcyB0byBub24tYXRvbWljIGZvcm0gZm9yIHVzZSBpbiBhIGtub3duCisvLyBub24tcHJlZW1wdGlibGUgZW52aXJvbm1lbnQuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT1dFUkFUT01JQ19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9XRVJBVE9NSUNfSAorCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBBIHBhc3MgdGhhdCBsb3dlcnMgYXRvbWljIGludHJpbnNpYyBpbnRvIG5vbi1hdG9taWMgaW50cmluc2ljcy4KK2NsYXNzIExvd2VyQXRvbWljUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPExvd2VyQXRvbWljUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICYpOworfTsKK30KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9XRVJBVE9NSUNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb3dlckV4cGVjdEludHJpbnNpYy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb3dlckV4cGVjdEludHJpbnNpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFiOWRlYzAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvd2VyRXhwZWN0SW50cmluc2ljLmgKQEAgLTAsMCArMSwzNyBAQAorLy89PT0tIExvd2VyRXhwZWN0SW50cmluc2ljLmggLSBMb3dlckV4cGVjdEludHJpbnNpYyBwYXNzIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vCisvLy8gVGhlIGhlYWRlciBmaWxlIGZvciB0aGUgTG93ZXJFeHBlY3RJbnRyaW5zaWMgcGFzcyBhcyB1c2VkIGJ5IHRoZSBuZXcgcGFzcworLy8vIG1hbmFnZXIuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT1dFUkVYUEVDVElOVFJJTlNJQ19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTE9XRVJFWFBFQ1RJTlRSSU5TSUNfSAorCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitzdHJ1Y3QgTG93ZXJFeHBlY3RJbnRyaW5zaWNQYXNzIDogUGFzc0luZm9NaXhpbjxMb3dlckV4cGVjdEludHJpbnNpY1Bhc3M+IHsKKyAgLy8vIFxicmllZiBSdW4gdGhlIHBhc3Mgb3ZlciB0aGUgZnVuY3Rpb24uCisgIC8vLworICAvLy8gVGhpcyB3aWxsIGxvd2VyIGFsbCBvZiB0aGUgZXhwZWN0IGludHJpbnNpYyBjYWxscyBpbiB0aGlzIGZ1bmN0aW9uIGludG8KKyAgLy8vIGJyYW5jaCB3ZWlnaHQgbWV0YWRhdGEuIFRoYXQgbWV0YWRhdGEgd2lsbCBzdWJzZXF1ZW50bHkgZmVlZCB0aGUgYW5hbHlzaXMKKyAgLy8vIG9mIHRoZSBwcm9iYWJpbGl0aWVzIGFuZCBmcmVxdWVuY2llcyBvZiB0aGUgQ0ZHLiBBZnRlciBydW5uaW5nIHRoaXMgcGFzcywKKyAgLy8vIG5vIG1vcmUgZXhwZWN0IGludHJpbnNpY3MgcmVtYWluLCBhbGxvd2luZyB0aGUgcmVzdCBvZiB0aGUgb3B0aW1pemVyIHRvCisgIC8vLyBpZ25vcmUgdGhlbS4KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmKTsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvd2VyR3VhcmRJbnRyaW5zaWMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTG93ZXJHdWFyZEludHJpbnNpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5ZjE5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL0xvd2VyR3VhcmRJbnRyaW5zaWMuaApAQCAtMCwwICsxLDI4IEBACisvLz09PS0tLSBMb3dlckd1YXJkSW50cmluc2ljLmggLSBMb3dlciB0aGUgZ3VhcmQgaW50cmluc2ljIC0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIGxvd2VycyB0aGUgbGx2bS5leHBlcmltZW50YWwuZ3VhcmQgaW50cmluc2ljIHRvIGEgY29uZGl0aW9uYWwgY2FsbAorLy8gdG8gQGxsdm0uZXhwZXJpbWVudGFsLmRlb3B0aW1pemUuICBPbmNlIHRoaXMgaGFwcGVucywgdGhlIGd1YXJkIGNhbiBubyBsb25nZXIKKy8vIGJlIHdpZGVuZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT1dFUkdVQVJESU5UUklOU0lDX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT1dFUkdVQVJESU5UUklOU0lDX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitzdHJ1Y3QgTG93ZXJHdWFyZEludHJpbnNpY1Bhc3MgOiBQYXNzSW5mb01peGluPExvd2VyR3VhcmRJbnRyaW5zaWNQYXNzPiB7CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKK30KKworI2VuZGlmIC8vTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9MT1dFUkdVQVJESU5UUklOU0lDX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTWVtQ3B5T3B0aW1pemVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL01lbUNweU9wdGltaXplci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NmM4MDgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL01lbUNweU9wdGltaXplci5oCkBAIC0wLDAgKzEsNzkgQEAKKy8vPT09LSBNZW1DcHlPcHRpbWl6ZXIuaCAtIG1lbWNweSBvcHRpbWl6YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIHBlcmZvcm1zIHZhcmlvdXMgdHJhbnNmb3JtYXRpb25zIHJlbGF0ZWQgdG8gZWxpbWluYXRpbmcgbWVtY3B5CisvLyBjYWxscywgb3IgdHJhbnNmb3JtaW5nIHNldHMgb2Ygc3RvcmVzIGludG8gbWVtc2V0J3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX01FTUNQWU9QVElNSVpFUl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTUVNQ1BZT1BUSU1JWkVSX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vSVIvQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFzc3VtcHRpb25DYWNoZTsKK2NsYXNzIENhbGxJbnN0OworY2xhc3MgRG9taW5hdG9yVHJlZTsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBNZW1DcHlJbnN0OworY2xhc3MgTWVtTW92ZUluc3Q7CitjbGFzcyBNZW1vcnlEZXBlbmRlbmNlUmVzdWx0czsKK2NsYXNzIE1lbVNldEluc3Q7CitjbGFzcyBTdG9yZUluc3Q7CitjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mbzsKK2NsYXNzIFZhbHVlOworCitjbGFzcyBNZW1DcHlPcHRQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48TWVtQ3B5T3B0UGFzcz4geworICBNZW1vcnlEZXBlbmRlbmNlUmVzdWx0cyAqTUQgPSBudWxscHRyOworICBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJID0gbnVsbHB0cjsKKyAgc3RkOjpmdW5jdGlvbjxBbGlhc0FuYWx5c2lzICYoKT4gTG9va3VwQWxpYXNBbmFseXNpczsKKyAgc3RkOjpmdW5jdGlvbjxBc3N1bXB0aW9uQ2FjaGUgJigpPiBMb29rdXBBc3N1bXB0aW9uQ2FjaGU7CisgIHN0ZDo6ZnVuY3Rpb248RG9taW5hdG9yVHJlZSAmKCk+IExvb2t1cERvbVRyZWU7CisKK3B1YmxpYzoKKyAgTWVtQ3B5T3B0UGFzcygpID0gZGVmYXVsdDsKKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7CisKKyAgLy8gR2x1ZSBmb3IgdGhlIG9sZCBQTS4KKyAgYm9vbCBydW5JbXBsKEZ1bmN0aW9uICZGLCBNZW1vcnlEZXBlbmRlbmNlUmVzdWx0cyAqTURfLAorICAgICAgICAgICAgICAgVGFyZ2V0TGlicmFyeUluZm8gKlRMSV8sCisgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPEFsaWFzQW5hbHlzaXMgJigpPiBMb29rdXBBbGlhc0FuYWx5c2lzXywKKyAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248QXNzdW1wdGlvbkNhY2hlICYoKT4gTG9va3VwQXNzdW1wdGlvbkNhY2hlXywKKyAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248RG9taW5hdG9yVHJlZSAmKCk+IExvb2t1cERvbVRyZWVfKTsKKworcHJpdmF0ZToKKyAgLy8gSGVscGVyIGZ1bmN0aW9ucworICBib29sIHByb2Nlc3NTdG9yZShTdG9yZUluc3QgKlNJLCBCYXNpY0Jsb2NrOjppdGVyYXRvciAmQkJJKTsKKyAgYm9vbCBwcm9jZXNzTWVtU2V0KE1lbVNldEluc3QgKlNJLCBCYXNpY0Jsb2NrOjppdGVyYXRvciAmQkJJKTsKKyAgYm9vbCBwcm9jZXNzTWVtQ3B5KE1lbUNweUluc3QgKk0pOworICBib29sIHByb2Nlc3NNZW1Nb3ZlKE1lbU1vdmVJbnN0ICpNKTsKKyAgYm9vbCBwZXJmb3JtQ2FsbFNsb3RPcHR6bihJbnN0cnVjdGlvbiAqY3B5LCBWYWx1ZSAqY3B5RHN0LCBWYWx1ZSAqY3B5U3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGNweUxlbiwgdW5zaWduZWQgY3B5QWxpZ24sIENhbGxJbnN0ICpDKTsKKyAgYm9vbCBwcm9jZXNzTWVtQ3B5TWVtQ3B5RGVwZW5kZW5jZShNZW1DcHlJbnN0ICpNLCBNZW1DcHlJbnN0ICpNRGVwKTsKKyAgYm9vbCBwcm9jZXNzTWVtU2V0TWVtQ3B5RGVwZW5kZW5jZShNZW1DcHlJbnN0ICpNLCBNZW1TZXRJbnN0ICpNRGVwKTsKKyAgYm9vbCBwZXJmb3JtTWVtQ3B5VG9NZW1TZXRPcHR6bihNZW1DcHlJbnN0ICpNLCBNZW1TZXRJbnN0ICpNRGVwKTsKKyAgYm9vbCBwcm9jZXNzQnlWYWxBcmd1bWVudChDYWxsU2l0ZSBDUywgdW5zaWduZWQgQXJnTm8pOworICBJbnN0cnVjdGlvbiAqdHJ5TWVyZ2luZ0ludG9NZW1zZXQoSW5zdHJ1Y3Rpb24gKkksIFZhbHVlICpTdGFydFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpCeXRlVmFsKTsKKworICBib29sIGl0ZXJhdGVPbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX01FTUNQWU9QVElNSVpFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL01lcmdlZExvYWRTdG9yZU1vdGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9NZXJnZWRMb2FkU3RvcmVNb3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zY2FkN2JiCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9NZXJnZWRMb2FkU3RvcmVNb3Rpb24uaApAQCAtMCwwICsxLDM5IEBACisvLz09PS0gTWVyZ2VkTG9hZFN0b3JlTW90aW9uLmggLSBtZXJnZSBhbmQgaG9pc3Qvc2luayBsb2FkL3N0b3JlcyAtLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vISBcZmlsZQorLy8hIFxicmllZiBUaGlzIHBhc3MgcGVyZm9ybXMgbWVyZ2VzIG9mIGxvYWRzIGFuZCBzdG9yZXMgb24gYm90aCBzaWRlcyBvZiBhCisvLyAgZGlhbW9uZCAoaGFtbW9jaykuIEl0IGhvaXN0cyB0aGUgbG9hZHMgYW5kIHNpbmtzIHRoZSBzdG9yZXMuCisvLworLy8gVGhlIGFsZ29yaXRobSBpdGVyYXRpdmVseSBob2lzdHMgdHdvIGxvYWRzIHRvIHRoZSBzYW1lIGFkZHJlc3Mgb3V0IG9mIGEKKy8vIGRpYW1vbmQgKGhhbW1vY2spIGFuZCBtZXJnZXMgdGhlbSBpbnRvIGEgc2luZ2xlIGxvYWQgaW4gdGhlIGhlYWRlci4gU2ltaWxhcgorLy8gaXQgc2lua3MgYW5kIG1lcmdlcyB0d28gc3RvcmVzIHRvIHRoZSB0YWlsIGJsb2NrIChmb290ZXIpLiBUaGUgYWxnb3JpdGhtCisvLyBpdGVyYXRlcyBvdmVyIHRoZSBpbnN0cnVjdGlvbnMgb2Ygb25lIHNpZGUgb2YgdGhlIGRpYW1vbmQgYW5kIGF0dGVtcHRzIHRvCisvLyBmaW5kIGEgbWF0Y2hpbmcgbG9hZC9zdG9yZSBvbiB0aGUgb3RoZXIgc2lkZS4gSXQgaG9pc3RzIC8gc2lua3Mgd2hlbiBpdAorLy8gdGhpbmtzIGl0IHNhZmUgdG8gZG8gc28uICBUaGlzIG9wdGltaXphdGlvbiBoZWxwcyB3aXRoIGVnLiBoaWRpbmcgbG9hZAorLy8gbGF0ZW5jaWVzLCB0cmlnZ2VyaW5nIGlmLWNvbnZlcnNpb24sIGFuZCByZWR1Y2luZyBzdGF0aWMgY29kZSBzaXplLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9NRVJHRURMT0FEU1RPUkVNT1RJT05fSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX01FUkdFRExPQURTVE9SRU1PVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgTWVyZ2VkTG9hZFN0b3JlTW90aW9uUGFzcworICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48TWVyZ2VkTG9hZFN0b3JlTW90aW9uUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9CisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX01FUkdFRExPQURTVE9SRU1PVElPTl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL05hcnlSZWFzc29jaWF0ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9OYXJ5UmVhc3NvY2lhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODM1YmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9OYXJ5UmVhc3NvY2lhdGUuaApAQCAtMCwwICsxLDE4OSBAQAorLy89PT0tIE5hcnlSZWFzc29jaWF0ZS5oIC0gUmVhc3NvY2lhdGUgbi1hcnkgZXhwcmVzc2lvbnMgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgcmVhc3NvY2lhdGVzIG4tYXJ5IGFkZCBleHByZXNzaW9ucyBhbmQgZWxpbWluYXRlcyB0aGUgcmVkdW5kYW5jeQorLy8gZXhwb3NlZCBieSB0aGUgcmVhc3NvY2lhdGlvbi4KKy8vCisvLyBBIG1vdGl2YXRpbmcgZXhhbXBsZToKKy8vCisvLyAgIHZvaWQgZm9vKGludCBhLCBpbnQgYikgeworLy8gICAgIGJhcihhICsgYik7CisvLyAgICAgYmFyKChhICsgMikgKyBiKTsKKy8vICAgfQorLy8KKy8vIEFuIGlkZWFsIGNvbXBpbGVyIHNob3VsZCByZWFzc29jaWF0ZSAoYSArIDIpICsgYiB0byAoYSArIGIpICsgMiBhbmQgc2ltcGxpZnkKKy8vIHRoZSBhYm92ZSBjb2RlIHRvCisvLworLy8gICBpbnQgdCA9IGEgKyBiOworLy8gICBiYXIodCk7CisvLyAgIGJhcih0ICsgMik7CisvLworLy8gSG93ZXZlciwgdGhlIFJlYXNzb2NpYXRlIHBhc3MgaXMgdW5hYmxlIHRvIGRvIHRoYXQgYmVjYXVzZSBpdCBwcm9jZXNzZXMgZWFjaAorLy8gaW5zdHJ1Y3Rpb24gaW5kaXZpZHVhbGx5IGFuZCBiZWxpZXZlcyAoYSArIDIpICsgYiBpcyB0aGUgYmVzdCBmb3JtIGFjY29yZGluZworLy8gdG8gaXRzIHJhbmsgc3lzdGVtLgorLy8KKy8vIFRvIGFkZHJlc3MgdGhpcyBsaW1pdGF0aW9uLCBOYXJ5UmVhc3NvY2lhdGUgcmVhc3NvY2lhdGVzIGFuIGV4cHJlc3Npb24gaW4gYQorLy8gZm9ybSB0aGF0IHJldXNlcyBleGlzdGluZyBpbnN0cnVjdGlvbnMuIEFzIGEgcmVzdWx0LCBOYXJ5UmVhc3NvY2lhdGUgY2FuCisvLyByZWFzc29jaWF0ZSAoYSArIDIpICsgYiBpbiB0aGUgZXhhbXBsZSB0byAoYSArIGIpICsgMiBiZWNhdXNlIGl0IGRldGVjdHMgdGhhdAorLy8gKGEgKyBiKSBpcyBjb21wdXRlZCBiZWZvcmUuCisvLworLy8gTmFyeVJlYXNzb2NpYXRlIHdvcmtzIGFzIGZvbGxvd3MuIEZvciBldmVyeSBpbnN0cnVjdGlvbiBpbiB0aGUgZm9ybSBvZiAoYSArCisvLyBiKSArIGMsIGl0IGNoZWNrcyB3aGV0aGVyIGEgKyBjIG9yIGIgKyBjIGlzIGFscmVhZHkgY29tcHV0ZWQgYnkgYSBkb21pbmF0aW5nCisvLyBpbnN0cnVjdGlvbi4gSWYgc28sIGl0IHRoZW4gcmVhc3NvY2lhdGVzIChhICsgYikgKyBjIGludG8gKGEgKyBjKSArIGIgb3IgKGIgKworLy8gYykgKyBhIGFuZCByZW1vdmVzIHRoZSByZWR1bmRhbmN5IGFjY29yZGluZ2x5LiBUbyBlZmZpY2llbnRseSBsb29rIHVwIHdoZXRoZXIKKy8vIGFuIGV4cHJlc3Npb24gaXMgY29tcHV0ZWQgYmVmb3JlLCB3ZSBzdG9yZSBlYWNoIGluc3RydWN0aW9uIHNlZW4gYW5kIGl0cyBTQ0VWCisvLyBpbnRvIGFuIFNDRVYtdG8taW5zdHJ1Y3Rpb24gbWFwLgorLy8KKy8vIEFsdGhvdWdoIHRoZSBhbGdvcml0aG0gcGF0dGVybi1tYXRjaGVzIG9ubHkgdGVybmFyeSBhZGRpdGlvbnMsIGl0CisvLyBhdXRvbWF0aWNhbGx5IGhhbmRsZXMgbWFueSA+My1hcnkgZXhwcmVzc2lvbnMgYnkgd2Fsa2luZyB0aHJvdWdoIHRoZSBmdW5jdGlvbgorLy8gaW4gdGhlIGRlcHRoLWZpcnN0IG9yZGVyLiBGb3IgZXhhbXBsZSwgZ2l2ZW4KKy8vCisvLyAgIChhICsgYykgKyBkCisvLyAgICgoYSArIGIpICsgYykgKyBkCisvLworLy8gTmFyeVJlYXNzb2NpYXRlIGZpcnN0IHJld3JpdGVzIChhICsgYikgKyBjIHRvIChhICsgYykgKyBiLCBhbmQgdGhlbiByZXdyaXRlcworLy8gKChhICsgYykgKyBiKSArIGQgaW50byAoKGEgKyBjKSArIGQpICsgYi4KKy8vCisvLyBGaW5hbGx5LCB0aGUgYWJvdmUgZG9taW5hdG9yLWJhc2VkIGFsZ29yaXRobSBtYXkgbmVlZCB0byBiZSBydW4gbXVsdGlwbGUKKy8vIGl0ZXJhdGlvbnMgYmVmb3JlIGVtaXR0aW5nIG9wdGltYWwgY29kZS4gT25lIHNvdXJjZSBvZiB0aGlzIG5lZWQgaXMgdGhhdCB3ZQorLy8gb25seSBzcGxpdCBhbiBvcGVyYW5kIHdoZW4gaXQgaXMgdXNlZCBvbmx5IG9uY2UuIFRoZSBhYm92ZSBhbGdvcml0aG0gY2FuCisvLyBlbGltaW5hdGUgYW4gaW5zdHJ1Y3Rpb24gYW5kIGRlY3JlYXNlIHRoZSB1c2FnZSBjb3VudCBvZiBpdHMgb3BlcmFuZHMuIEFzIGEKKy8vIHJlc3VsdCwgYW4gaW5zdHJ1Y3Rpb24gdGhhdCBwcmV2aW91c2x5IGhhZCBtdWx0aXBsZSB1c2VzIG1heSBiZWNvbWUgYQorLy8gc2luZ2xlLXVzZSBpbnN0cnVjdGlvbiBhbmQgdGh1cyBlbGlnaWJsZSBmb3Igc3BsaXQgY29uc2lkZXJhdGlvbi4gRm9yCisvLyBleGFtcGxlLAorLy8KKy8vICAgYWMgPSBhICsgYworLy8gICBhYiA9IGEgKyBiCisvLyAgIGFiYyA9IGFiICsgYworLy8gICBhYjIgPSBhYiArIGIKKy8vICAgYWIyYyA9IGFiMiArIGMKKy8vCisvLyBJbiB0aGUgZmlyc3QgaXRlcmF0aW9uLCB3ZSBjYW5ub3QgcmVhc3NvY2lhdGUgYWJjIHRvIGFjK2IgYmVjYXVzZSBhYiBpcyB1c2VkCisvLyB0d2ljZS4gSG93ZXZlciwgd2UgY2FuIHJlYXNzb2NpYXRlIGFiMmMgdG8gYWJjK2IgaW4gdGhlIGZpcnN0IGl0ZXJhdGlvbi4gQXMgYQorLy8gcmVzdWx0LCBhYjIgYmVjb21lcyBkZWFkIGFuZCBhYiB3aWxsIGJlIHVzZWQgb25seSBvbmNlIGluIHRoZSBzZWNvbmQKKy8vIGl0ZXJhdGlvbi4KKy8vCisvLyBMaW1pdGF0aW9ucyBhbmQgVE9ETyBpdGVtczoKKy8vCisvLyAxKSBXZSBvbmx5IGNvbnNpZGVycyBuLWFyeSBhZGRzIGFuZCBtdWxzIGZvciBub3cuIFRoaXMgc2hvdWxkIGJlIGV4dGVuZGVkCisvLyBhbmQgZ2VuZXJhbGl6ZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX05BUllSRUFTU09DSUFURV9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTkFSWVJFQVNTT0NJQVRFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZUhhbmRsZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFzc3VtcHRpb25DYWNoZTsKK2NsYXNzIEJpbmFyeU9wZXJhdG9yOworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEdldEVsZW1lbnRQdHJJbnN0OworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBTY2FsYXJFdm9sdXRpb247CitjbGFzcyBTQ0VWOworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CitjbGFzcyBUYXJnZXRUcmFuc2Zvcm1JbmZvOworY2xhc3MgVHlwZTsKK2NsYXNzIFZhbHVlOworCitjbGFzcyBOYXJ5UmVhc3NvY2lhdGVQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48TmFyeVJlYXNzb2NpYXRlUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7CisKKyAgLy8gR2x1ZSBmb3Igb2xkIFBNLgorICBib29sIHJ1bkltcGwoRnVuY3Rpb24gJkYsIEFzc3VtcHRpb25DYWNoZSAqQUNfLCBEb21pbmF0b3JUcmVlICpEVF8sCisgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gKlNFXywgVGFyZ2V0TGlicmFyeUluZm8gKlRMSV8sCisgICAgICAgICAgICAgICBUYXJnZXRUcmFuc2Zvcm1JbmZvICpUVElfKTsKKworcHJpdmF0ZToKKyAgLy8gUnVucyBvbmx5IG9uZSBpdGVyYXRpb24gb2YgdGhlIGRvbWluYXRvci1iYXNlZCBhbGdvcml0aG0uIFNlZSB0aGUgaGVhZGVyCisgIC8vIGNvbW1lbnRzIGZvciB3aHkgd2UgbmVlZCBtdWx0aXBsZSBpdGVyYXRpb25zLgorICBib29sIGRvT25lSXRlcmF0aW9uKEZ1bmN0aW9uICZGKTsKKworICAvLyBSZWFzc29jaWF0ZXMgSSBmb3IgYmV0dGVyIENTRS4KKyAgSW5zdHJ1Y3Rpb24gKnRyeVJlYXNzb2NpYXRlKEluc3RydWN0aW9uICpJKTsKKworICAvLyBSZWFzc29jaWF0ZSBHRVAgZm9yIGJldHRlciBDU0UuCisgIEluc3RydWN0aW9uICp0cnlSZWFzc29jaWF0ZUdFUChHZXRFbGVtZW50UHRySW5zdCAqR0VQKTsKKworICAvLyBUcnkgc3BsaXR0aW5nIEdFUCBhdCB0aGUgSS10aCBpbmRleCBhbmQgc2VlIHdoZXRoZXIgZWl0aGVyIHBhcnQgY2FuIGJlCisgIC8vIENTRSdlZC4gVGhpcyBpcyBhIGhlbHBlciBmdW5jdGlvbiBmb3IgdHJ5UmVhc3NvY2lhdGVHRVAuCisgIC8vCisgIC8vIFxwIEluZGV4ZWRUeXBlIFRoZSBlbGVtZW50IHR5cGUgaW5kZXhlZCBieSBHRVAncyBJLXRoIGluZGV4LiBUaGlzIGlzCisgIC8vICAgICAgICAgICAgICAgIGVxdWl2YWxlbnQgdG8KKyAgLy8gICAgICAgICAgICAgICAgICBHRVAtPmdldEluZGV4ZWRUeXBlKEdFUC0+Z2V0UG9pbnRlck9wZXJhbmQoKSwgMC10aCBpbmRleCwKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiwgaS10aCBpbmRleCkuCisgIEdldEVsZW1lbnRQdHJJbnN0ICp0cnlSZWFzc29jaWF0ZUdFUEF0SW5kZXgoR2V0RWxlbWVudFB0ckluc3QgKkdFUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBJLCBUeXBlICpJbmRleGVkVHlwZSk7CisKKyAgLy8gR2l2ZW4gR0VQJ3MgSS10aCBpbmRleCA9IExIUyArIFJIUywgc2VlIHdoZXRoZXIgJkJhc2VbLi5dW0xIU11bLi5dIG9yCisgIC8vICZCYXNlWy4uXVtSSFNdWy4uXSBjYW4gYmUgQ1NFJ2VkIGFuZCByZXdyaXRlIEdFUCBhY2NvcmRpbmdseS4KKyAgR2V0RWxlbWVudFB0ckluc3QgKnRyeVJlYXNzb2NpYXRlR0VQQXRJbmRleChHZXRFbGVtZW50UHRySW5zdCAqR0VQLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIEksIFZhbHVlICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKlJIUywgVHlwZSAqSW5kZXhlZFR5cGUpOworCisgIC8vIFJlYXNzb2NpYXRlIGJpbmFyeSBvcGVyYXRvcnMgZm9yIGJldHRlciBDU0UuCisgIEluc3RydWN0aW9uICp0cnlSZWFzc29jaWF0ZUJpbmFyeU9wKEJpbmFyeU9wZXJhdG9yICpJKTsKKworICAvLyBBIGhlbHBlciBmdW5jdGlvbiBmb3IgdHJ5UmVhc3NvY2lhdGVCaW5hcnlPcC4gTEhTIGFuZCBSSFMgYXJlIGV4cGxpY2l0bHkKKyAgLy8gcGFzc2VkLgorICBJbnN0cnVjdGlvbiAqdHJ5UmVhc3NvY2lhdGVCaW5hcnlPcChWYWx1ZSAqTEhTLCBWYWx1ZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRvciAqSSk7CisgIC8vIFJld3JpdGVzIEkgdG8gKExIUyBvcCBSSFMpIGlmIExIUyBpcyBjb21wdXRlZCBhbHJlYWR5LgorICBJbnN0cnVjdGlvbiAqdHJ5UmVhc3NvY2lhdGVkQmluYXJ5T3AoY29uc3QgU0NFViAqTEhTLCBWYWx1ZSAqUkhTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmluYXJ5T3BlcmF0b3IgKkkpOworCisgIC8vIFRyaWVzIHRvIG1hdGNoIE9wMSBhbmQgT3AyIGJ5IHVzaW5nIFYuCisgIGJvb2wgbWF0Y2hUZXJuYXJ5T3AoQmluYXJ5T3BlcmF0b3IgKkksIFZhbHVlICpWLCBWYWx1ZSAqJk9wMSwgVmFsdWUgKiZPcDIpOworCisgIC8vIEdldHMgU0NFViBmb3IgKExIUyBvcCBSSFMpLgorICBjb25zdCBTQ0VWICpnZXRCaW5hcnlTQ0VWKEJpbmFyeU9wZXJhdG9yICpJLCBjb25zdCBTQ0VWICpMSFMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU0NFViAqUkhTKTsKKworICAvLyBSZXR1cm5zIHRoZSBjbG9zZXN0IGRvbWluYXRvciBvZiBcYyBEb21pbmF0ZWUgdGhhdCBjb21wdXRlcworICAvLyBcYyBDYW5kaWRhdGVFeHByLiBSZXR1cm5zIG51bGwgaWYgbm90IGZvdW5kLgorICBJbnN0cnVjdGlvbiAqZmluZENsb3Nlc3RNYXRjaGluZ0RvbWluYXRvcihjb25zdCBTQ0VWICpDYW5kaWRhdGVFeHByLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqRG9taW5hdGVlKTsKKworICAvLyBHZXRFbGVtZW50UHRySW5zdCBpbXBsaWNpdGx5IHNpZ24tZXh0ZW5kcyBhbiBpbmRleCBpZiB0aGUgaW5kZXggaXMgc2hvcnRlcgorICAvLyB0aGFuIHRoZSBwb2ludGVyIHNpemUuIFRoaXMgZnVuY3Rpb24gcmV0dXJucyB3aGV0aGVyIEluZGV4IGlzIHNob3J0ZXIgdGhhbgorICAvLyBHRVAncyBwb2ludGVyIHNpemUsIGkuZS4sIHdoZXRoZXIgSW5kZXggbmVlZHMgdG8gYmUgc2lnbi1leHRlbmRlZCBpbiBvcmRlcgorICAvLyB0byBiZSBhbiBpbmRleCBvZiBHRVAuCisgIGJvb2wgcmVxdWlyZXNTaWduRXh0ZW5zaW9uKFZhbHVlICpJbmRleCwgR2V0RWxlbWVudFB0ckluc3QgKkdFUCk7CisKKyAgQXNzdW1wdGlvbkNhY2hlICpBQzsKKyAgY29uc3QgRGF0YUxheW91dCAqREw7CisgIERvbWluYXRvclRyZWUgKkRUOworICBTY2FsYXJFdm9sdXRpb24gKlNFOworICBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJOworICBUYXJnZXRUcmFuc2Zvcm1JbmZvICpUVEk7CisKKyAgLy8gQSBsb29rdXAgdGFibGUgcXVpY2tseSB0ZWxsaW5nIHdoaWNoIGluc3RydWN0aW9ucyBjb21wdXRlIHRoZSBnaXZlbiBTQ0VWLgorICAvLyBOb3RlIHRoYXQgdGhlcmUgY2FuIGJlIG11bHRpcGxlIGluc3RydWN0aW9ucyBhdCBkaWZmZXJlbnQgbG9jYXRpb25zCisgIC8vIGNvbXB1dGluZyB0byB0aGUgc2FtZSBTQ0VWLCBzbyB3ZSBtYXAgYSBTQ0VWIHRvIGFuIGluc3RydWN0aW9uIGxpc3QuICBGb3IKKyAgLy8gZXhhbXBsZSwKKyAgLy8KKyAgLy8gICBpZiAocDEpCisgIC8vICAgICBmb28oYSArIGIpOworICAvLyAgIGlmIChwMikKKyAgLy8gICAgIGJhcihhICsgYik7CisgIERlbnNlTWFwPGNvbnN0IFNDRVYgKiwgU21hbGxWZWN0b3I8V2Vha1RyYWNraW5nVkgsIDI+PiBTZWVuRXhwcnM7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9OQVJZUkVBU1NPQ0lBVEVfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9OZXdHVk4uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTmV3R1ZOLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkYjI1NQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvTmV3R1ZOLmgKQEAgLTAsMCArMSwzMyBAQAorLy89PT0tIE5ld0dWTi5oIC0gR2xvYmFsIFZhbHVlIE51bWJlcmluZyBQYXNzIC0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIGludGVyZmFjZSBmb3IgTExWTSdzIEdsb2JhbCBWYWx1ZSBOdW1iZXJpbmcgcGFzcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfTkVXR1ZOX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9ORVdHVk5fSAorCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworCitjbGFzcyBOZXdHVk5QYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48TmV3R1ZOUGFzcz4geworcHVibGljOgorICAvLy8gXGJyaWVmIFJ1biB0aGUgcGFzcyBvdmVyIHRoZSBmdW5jdGlvbi4KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBBbmFseXNpc01hbmFnZXI8RnVuY3Rpb24+ICZBTSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9ORVdHVk5fSAorCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1BhcnRpYWxseUlubGluZUxpYkNhbGxzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1BhcnRpYWxseUlubGluZUxpYkNhbGxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3MzgzMQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvUGFydGlhbGx5SW5saW5lTGliQ2FsbHMuaApAQCAtMCwwICsxLDMwIEBACisvLz09PS0tLSBQYXJ0aWFsbHlJbmxpbmVMaWJDYWxscy5oIC0gUGFydGlhbGx5IGlubGluZSBsaWJjYWxscyAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyB0cmllcyB0byBwYXJ0aWFsbHkgaW5saW5lIHRoZSBmYXN0IHBhdGggb2Ygd2VsbC1rbm93biBsaWJyYXJ5CisvLyBmdW5jdGlvbnMsIHN1Y2ggYXMgdXNpbmcgc3F1YXJlLXJvb3QgaW5zdHJ1Y3Rpb25zIGZvciBjYXNlcyB3aGVyZSBzcXJ0KCkKKy8vIGRvZXMgbm90IG5lZWQgdG8gc2V0IGVycm5vLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9QQVJUSUFMTFlJTkxJTkVMSUJDQUxMU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfUEFSVElBTExZSU5MSU5FTElCQ0FMTFNfSAorCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFBhcnRpYWxseUlubGluZUxpYkNhbGxzUGFzcworICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48UGFydGlhbGx5SW5saW5lTGliQ2FsbHNQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307Cit9CisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX1BBUlRJQUxMWUlOTElORUxJQkNBTExTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvUmVhc3NvY2lhdGUuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvUmVhc3NvY2lhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OTk3ZGZhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9SZWFzc29jaWF0ZS5oCkBAIC0wLDAgKzEsMTIwIEBACisvLz09PS0gUmVhc3NvY2lhdGUuaCAtIFJlYXNzb2NpYXRlIGJpbmFyeSBleHByZXNzaW9ucyAtLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyByZWFzc29jaWF0ZXMgY29tbXV0YXRpdmUgZXhwcmVzc2lvbnMgaW4gYW4gb3JkZXIgdGhhdCBpcyBkZXNpZ25lZAorLy8gdG8gcHJvbW90ZSBiZXR0ZXIgY29uc3RhbnQgcHJvcGFnYXRpb24sIEdDU0UsIExJQ00sIFBSRSwgZXRjLgorLy8KKy8vIEZvciBleGFtcGxlOiA0ICsgKHggKyA1KSAtPiB4ICsgKDQgKyA1KQorLy8KKy8vIEluIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGFsZ29yaXRobSwgY29uc3RhbnRzIGFyZSBhc3NpZ25lZCByYW5rID0gMCwKKy8vIGZ1bmN0aW9uIGFyZ3VtZW50cyBhcmUgcmFuayA9IDEsIGFuZCBvdGhlciB2YWx1ZXMgYXJlIGFzc2lnbmVkIHJhbmtzCisvLyBjb3JyZXNwb25kaW5nIHRvIHRoZSByZXZlcnNlIHBvc3Qgb3JkZXIgdHJhdmVyc2FsIG9mIGN1cnJlbnQgZnVuY3Rpb24KKy8vIChzdGFydGluZyBhdCAyKSwgd2hpY2ggZWZmZWN0aXZlbHkgZ2l2ZXMgdmFsdWVzIGluIGRlZXAgbG9vcHMgaGlnaGVyIHJhbmsKKy8vIHRoYW4gdmFsdWVzIG5vdCBpbiBsb29wcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfUkVBU1NPQ0lBVEVfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX1JFQVNTT0NJQVRFX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvUG9zdE9yZGVySXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TZXRWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0lSQnVpbGRlci5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlSGFuZGxlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQVBJbnQ7CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgQmluYXJ5T3BlcmF0b3I7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgVmFsdWU7CisKKy8vLyBBIHByaXZhdGUgIm1vZHVsZSIgbmFtZXNwYWNlIGZvciB0eXBlcyBhbmQgdXRpbGl0aWVzIHVzZWQgYnkgUmVhc3NvY2lhdGUuCisvLy8gVGhlc2UgYXJlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBjbGllbnRzLgorbmFtZXNwYWNlIHJlYXNzb2NpYXRlIHsKKworc3RydWN0IFZhbHVlRW50cnkgeworICB1bnNpZ25lZCBSYW5rOworICBWYWx1ZSAqT3A7CisKKyAgVmFsdWVFbnRyeSh1bnNpZ25lZCBSLCBWYWx1ZSAqTykgOiBSYW5rKFIpLCBPcChPKSB7fQorfTsKKworaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFZhbHVlRW50cnkgJkxIUywgY29uc3QgVmFsdWVFbnRyeSAmUkhTKSB7CisgIHJldHVybiBMSFMuUmFuayA+IFJIUy5SYW5rOyAvLyBTb3J0IHNvIHRoYXQgaGlnaGVzdCByYW5rIGdvZXMgdG8gc3RhcnQuCit9CisKKy8vLyBcYnJpZWYgVXRpbGl0eSBjbGFzcyByZXByZXNlbnRpbmcgYSBiYXNlIGFuZCBleHBvbmVudCBwYWlyIHdoaWNoIGZvcm0gb25lCisvLy8gZmFjdG9yIG9mIHNvbWUgcHJvZHVjdC4KK3N0cnVjdCBGYWN0b3IgeworICBWYWx1ZSAqQmFzZTsKKyAgdW5zaWduZWQgUG93ZXI7CisKKyAgRmFjdG9yKFZhbHVlICpCYXNlLCB1bnNpZ25lZCBQb3dlcikgOiBCYXNlKEJhc2UpLCBQb3dlcihQb3dlcikge30KK307CisKK2NsYXNzIFhvck9wbmQ7CisKK30gLy8gZW5kIG5hbWVzcGFjZSByZWFzc29jaWF0ZQorCisvLy8gUmVhc3NvY2lhdGUgY29tbXV0YXRpdmUgZXhwcmVzc2lvbnMuCitjbGFzcyBSZWFzc29jaWF0ZVBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxSZWFzc29jaWF0ZVBhc3M+IHsKKyAgRGVuc2VNYXA8QmFzaWNCbG9jayAqLCB1bnNpZ25lZD4gUmFua01hcDsKKyAgRGVuc2VNYXA8QXNzZXJ0aW5nVkg8VmFsdWU+LCB1bnNpZ25lZD4gVmFsdWVSYW5rTWFwOworICBTZXRWZWN0b3I8QXNzZXJ0aW5nVkg8SW5zdHJ1Y3Rpb24+PiBSZWRvSW5zdHM7CisKKyAgLy8gQXJiaXRyYXJ5LCBidXQgcHJldmVudHMgcXVhZHJhdGljIGJlaGF2aW9yLgorICBzdGF0aWMgY29uc3QgdW5zaWduZWQgR2xvYmFsUmVhc3NvY2lhdGVMaW1pdCA9IDEwOworICBzdGF0aWMgY29uc3QgdW5zaWduZWQgTnVtQmluYXJ5T3BzID0KKyAgICAgIEluc3RydWN0aW9uOjpCaW5hcnlPcHNFbmQgLSBJbnN0cnVjdGlvbjo6QmluYXJ5T3BzQmVnaW47CisgIERlbnNlTWFwPHN0ZDo6cGFpcjxWYWx1ZSAqLCBWYWx1ZSAqPiwgdW5zaWduZWQ+IFBhaXJNYXBbTnVtQmluYXJ5T3BzXTsKKworICBib29sIE1hZGVDaGFuZ2U7CisKK3B1YmxpYzoKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmKTsKKworcHJpdmF0ZToKKyAgdm9pZCBCdWlsZFJhbmtNYXAoRnVuY3Rpb24gJkYsIFJldmVyc2VQb3N0T3JkZXJUcmF2ZXJzYWw8RnVuY3Rpb24gKj4gJlJQT1QpOworICB1bnNpZ25lZCBnZXRSYW5rKFZhbHVlICpWKTsKKyAgdm9pZCBjYW5vbmljYWxpemVPcGVyYW5kcyhJbnN0cnVjdGlvbiAqSSk7CisgIHZvaWQgUmVhc3NvY2lhdGVFeHByZXNzaW9uKEJpbmFyeU9wZXJhdG9yICpJKTsKKyAgdm9pZCBSZXdyaXRlRXhwclRyZWUoQmluYXJ5T3BlcmF0b3IgKkksCisgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxyZWFzc29jaWF0ZTo6VmFsdWVFbnRyeT4gJk9wcyk7CisgIFZhbHVlICpPcHRpbWl6ZUV4cHJlc3Npb24oQmluYXJ5T3BlcmF0b3IgKkksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHJlYXNzb2NpYXRlOjpWYWx1ZUVudHJ5PiAmT3BzKTsKKyAgVmFsdWUgKk9wdGltaXplQWRkKEluc3RydWN0aW9uICpJLAorICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHJlYXNzb2NpYXRlOjpWYWx1ZUVudHJ5PiAmT3BzKTsKKyAgVmFsdWUgKk9wdGltaXplWG9yKEluc3RydWN0aW9uICpJLAorICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPHJlYXNzb2NpYXRlOjpWYWx1ZUVudHJ5PiAmT3BzKTsKKyAgYm9vbCBDb21iaW5lWG9yT3BuZChJbnN0cnVjdGlvbiAqSSwgcmVhc3NvY2lhdGU6Olhvck9wbmQgKk9wbmQxLAorICAgICAgICAgICAgICAgICAgICAgIEFQSW50ICZDb25zdE9wbmQsIFZhbHVlIComUmVzKTsKKyAgYm9vbCBDb21iaW5lWG9yT3BuZChJbnN0cnVjdGlvbiAqSSwgcmVhc3NvY2lhdGU6Olhvck9wbmQgKk9wbmQxLAorICAgICAgICAgICAgICAgICAgICAgIHJlYXNzb2NpYXRlOjpYb3JPcG5kICpPcG5kMiwgQVBJbnQgJkNvbnN0T3BuZCwKKyAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSAqJlJlcyk7CisgIFZhbHVlICpidWlsZE1pbmltYWxNdWx0aXBseURBRyhJUkJ1aWxkZXI8PiAmQnVpbGRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxyZWFzc29jaWF0ZTo6RmFjdG9yPiAmRmFjdG9ycyk7CisgIFZhbHVlICpPcHRpbWl6ZU11bChCaW5hcnlPcGVyYXRvciAqSSwKKyAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxyZWFzc29jaWF0ZTo6VmFsdWVFbnRyeT4gJk9wcyk7CisgIFZhbHVlICpSZW1vdmVGYWN0b3JGcm9tRXhwcmVzc2lvbihWYWx1ZSAqViwgVmFsdWUgKkZhY3Rvcik7CisgIHZvaWQgRXJhc2VJbnN0KEluc3RydWN0aW9uICpJKTsKKyAgdm9pZCBSZWN1cnNpdmVseUVyYXNlRGVhZEluc3RzKEluc3RydWN0aW9uICpJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0VmVjdG9yPEFzc2VydGluZ1ZIPEluc3RydWN0aW9uPj4gJkluc3RzKTsKKyAgdm9pZCBPcHRpbWl6ZUluc3QoSW5zdHJ1Y3Rpb24gKkkpOworICBJbnN0cnVjdGlvbiAqY2Fub25pY2FsaXplTmVnQ29uc3RFeHByKEluc3RydWN0aW9uICpJKTsKKyAgdm9pZCBCdWlsZFBhaXJNYXAoUmV2ZXJzZVBvc3RPcmRlclRyYXZlcnNhbDxGdW5jdGlvbiAqPiAmUlBPVCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9SRUFTU09DSUFURV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1Jld3JpdGVTdGF0ZXBvaW50c0ZvckdDLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1Jld3JpdGVTdGF0ZXBvaW50c0ZvckdDLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTI4ZjE3NgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvUmV3cml0ZVN0YXRlcG9pbnRzRm9yR0MuaApAQCAtMCwwICsxLDM5IEBACisvLz09PS0gUmV3cml0ZVN0YXRlcG9pbnRzRm9yR0MuaCAtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBwcm92aWRlcyBpbnRlcmZhY2UgdG8gIlJld3JpdGUgU3RhdGVwb2ludHMgZm9yIEdDIiBwYXNzLgorLy8KKy8vIFRoaXMgcGFzc2UgcmV3cml0ZXMgY2FsbC9pbnZva2UgaW5zdHJ1Y3Rpb25zIHNvIGFzIHRvIG1ha2UgcG90ZW50aWFsCisvLyByZWxvY2F0aW9ucyBwZXJmb3JtZWQgYnkgdGhlIGdhcmJhZ2UgY29sbGVjdG9yIGV4cGxpY2l0IGluIHRoZSBJUi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfUkVXUklURV9TVEFURVBPSU5UU19GT1JfR0NfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX1JFV1JJVEVfU1RBVEVQT0lOVFNfRk9SX0dDX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBEb21pbmF0b3JUcmVlOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBNb2R1bGU7CitjbGFzcyBUYXJnZXRUcmFuc2Zvcm1JbmZvOworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CisKK3N0cnVjdCBSZXdyaXRlU3RhdGVwb2ludHNGb3JHQyA6IHB1YmxpYyBQYXNzSW5mb01peGluPFJld3JpdGVTdGF0ZXBvaW50c0ZvckdDPiB7CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworCisgIGJvb2wgcnVuT25GdW5jdGlvbihGdW5jdGlvbiAmRiwgRG9taW5hdG9yVHJlZSAmLCBUYXJnZXRUcmFuc2Zvcm1JbmZvICYsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAmKTsKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfUkVXUklURV9TVEFURVBPSU5UU19GT1JfR0NfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9TQ0NQLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1NDQ1AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTI5NGM5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9TQ0NQLmgKQEAgLTAsMCArMSw0MyBAQAorLy89PT0tIFNDQ1AuY3BwIC0gU3BhcnNlIENvbmRpdGlvbmFsIENvbnN0YW50IFByb3BhZ2F0aW9uIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBcZmlsZQorLy8gVGhpcyBmaWxlIGltcGxlbWVudHMgc3BhcnNlIGNvbmRpdGlvbmFsIGNvbnN0YW50IHByb3BhZ2F0aW9uIGFuZCBtZXJnaW5nOgorLy8KKy8vIFNwZWNpZmljYWxseSwgdGhpczoKKy8vICAgKiBBc3N1bWVzIHZhbHVlcyBhcmUgY29uc3RhbnQgdW5sZXNzIHByb3ZlbiBvdGhlcndpc2UKKy8vICAgKiBBc3N1bWVzIEJhc2ljQmxvY2tzIGFyZSBkZWFkIHVubGVzcyBwcm92ZW4gb3RoZXJ3aXNlCisvLyAgICogUHJvdmVzIHZhbHVlcyB0byBiZSBjb25zdGFudCwgYW5kIHJlcGxhY2VzIHRoZW0gd2l0aCBjb25zdGFudHMKKy8vICAgKiBQcm92ZXMgY29uZGl0aW9uYWwgYnJhbmNoZXMgdG8gYmUgdW5jb25kaXRpb25hbAorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9TQ0NQX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9TQ0NQX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvVGFyZ2V0TGlicmFyeUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RhdGFMYXlvdXQuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Nb2R1bGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CisKKy8vLyBUaGlzIHBhc3MgcGVyZm9ybXMgZnVuY3Rpb24tbGV2ZWwgY29uc3RhbnQgcHJvcGFnYXRpb24gYW5kIG1lcmdpbmcuCitjbGFzcyBTQ0NQUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPFNDQ1BQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKK2Jvb2wgcnVuSVBTQ0NQKE1vZHVsZSAmTSwgY29uc3QgRGF0YUxheW91dCAmREwsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkpOworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfU0NDUF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1NST0EuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvU1JPQS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhMzIxZTcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1NST0EuaApAQCAtMCwwICsxLDEzOSBAQAorLy89PT0tIFNST0EuaCAtIFNjYWxhciBSZXBsYWNlbWVudCBPZiBBZ2dyZWdhdGVzIC0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBcZmlsZQorLy8vIFRoaXMgZmlsZSBwcm92aWRlcyB0aGUgaW50ZXJmYWNlIGZvciBMTFZNJ3MgU2NhbGFyIFJlcGxhY2VtZW50IG9mCisvLy8gQWdncmVnYXRlcyBwYXNzLiBUaGlzIHBhc3MgcHJvdmlkZXMgYm90aCBhZ2dyZWdhdGUgc3BsaXR0aW5nIGFuZCB0aGUKKy8vLyBwcmltYXJ5IFNTQSBmb3JtYXRpb24gdXNlZCBpbiB0aGUgY29tcGlsZXIuCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9TUk9BX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9TUk9BX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9Db21waWxlci5oIgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBbGxvY2FJbnN0OworY2xhc3MgQXNzdW1wdGlvbkNhY2hlOworY2xhc3MgRG9taW5hdG9yVHJlZTsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBMTFZNQ29udGV4dDsKK2NsYXNzIFBISU5vZGU7CitjbGFzcyBTZWxlY3RJbnN0OworY2xhc3MgVXNlOworCisvLy8gQSBwcml2YXRlICJtb2R1bGUiIG5hbWVzcGFjZSBmb3IgdHlwZXMgYW5kIHV0aWxpdGllcyB1c2VkIGJ5IFNST0EuIFRoZXNlCisvLy8gYXJlIGltcGxlbWVudGF0aW9uIGRldGFpbHMgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSBjbGllbnRzLgorbmFtZXNwYWNlIHNyb2EgTExWTV9MSUJSQVJZX1ZJU0lCSUxJVFkgeworCitjbGFzcyBBbGxvY2FTbGljZVJld3JpdGVyOworY2xhc3MgQWxsb2NhU2xpY2VzOworY2xhc3MgUGFydGl0aW9uOworY2xhc3MgU1JPQUxlZ2FjeVBhc3M7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBzcm9hCisKKy8vLyBcYnJpZWYgQW4gb3B0aW1pemF0aW9uIHBhc3MgcHJvdmlkaW5nIFNjYWxhciBSZXBsYWNlbWVudCBvZiBBZ2dyZWdhdGVzLgorLy8vCisvLy8gVGhpcyBwYXNzIHRha2VzIGFsbG9jYXRpb25zIHdoaWNoIGNhbiBiZSBjb21wbGV0ZWx5IGFuYWx5emVkICh0aGF0IGlzLCB0aGV5CisvLy8gZG9uJ3QgZXNjYXBlKSBhbmQgdHJpZXMgdG8gdHVybiB0aGVtIGludG8gc2NhbGFyIFNTQSB2YWx1ZXMuIFRoZXJlIGFyZQorLy8vIGEgZmV3IHN0ZXBzIHRvIHRoaXMgcHJvY2Vzcy4KKy8vLworLy8vIDEpIEl0IHRha2VzIGFsbG9jYXRpb25zIG9mIGFnZ3JlZ2F0ZXMgYW5kIGFuYWx5emVzIHRoZSB3YXlzIGluIHdoaWNoIHRoZXkKKy8vLyAgICBhcmUgdXNlZCB0byB0cnkgdG8gc3BsaXQgdGhlbSBpbnRvIHNtYWxsZXIgYWxsb2NhdGlvbnMsIGlkZWFsbHkgb2YKKy8vLyAgICBhIHNpbmdsZSBzY2FsYXIgZGF0YSB0eXBlLiBJdCB3aWxsIHNwbGl0IHVwIG1lbWNweSBhbmQgbWVtc2V0IGFjY2Vzc2VzCisvLy8gICAgYXMgbmVjZXNzYXJ5IGFuZCB0cnkgdG8gaXNvbGF0ZSBpbmRpdmlkdWFsIHNjYWxhciBhY2Nlc3Nlcy4KKy8vLyAyKSBJdCB3aWxsIHRyYW5zZm9ybSBhY2Nlc3NlcyBpbnRvIGZvcm1zIHdoaWNoIGFyZSBzdWl0YWJsZSBmb3IgU1NBIHZhbHVlCisvLy8gICAgcHJvbW90aW9uLiBUaGlzIGNhbiBiZSByZXBsYWNpbmcgYSBtZW1zZXQgd2l0aCBhIHNjYWxhciBzdG9yZSBvZiBhbgorLy8vICAgIGludGVnZXIgdmFsdWUsIG9yIGl0IGNhbiBpbnZvbHZlIHNwZWN1bGF0aW5nIG9wZXJhdGlvbnMgb24gYSBQSEkgb3IKKy8vLyAgICBzZWxlY3QgdG8gYmUgYSBQSEkgb3Igc2VsZWN0IG9mIHRoZSByZXN1bHRzLgorLy8vIDMpIEZpbmFsbHksIHRoaXMgd2lsbCB0cnkgdG8gZGV0ZWN0IGEgcGF0dGVybiBvZiBhY2Nlc3NlcyB3aGljaCBtYXAgY2xlYW5seQorLy8vICAgIG9udG8gaW5zZXJ0IGFuZCBleHRyYWN0IG9wZXJhdGlvbnMgb24gYSB2ZWN0b3IgdmFsdWUsIGFuZCBjb252ZXJ0IHRoZW0gdG8KKy8vLyAgICB0aGlzIGZvcm0uIEJ5IGRvaW5nIHNvLCBpdCB3aWxsIGVuYWJsZSBwcm9tb3Rpb24gb2YgdmVjdG9yIGFnZ3JlZ2F0ZXMgdG8KKy8vLyAgICBTU0EgdmVjdG9yIHZhbHVlcy4KK2NsYXNzIFNST0EgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxTUk9BPiB7CisgIExMVk1Db250ZXh0ICpDID0gbnVsbHB0cjsKKyAgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyOworICBBc3N1bXB0aW9uQ2FjaGUgKkFDID0gbnVsbHB0cjsKKworICAvLy8gXGJyaWVmIFdvcmtsaXN0IG9mIGFsbG9jYSBpbnN0cnVjdGlvbnMgdG8gc2ltcGxpZnkuCisgIC8vLworICAvLy8gRWFjaCBhbGxvY2EgaW4gdGhlIGZ1bmN0aW9uIGlzIGFkZGVkIHRvIHRoaXMuIEVhY2ggbmV3IGFsbG9jYSBmb3JtZWQgZ2V0cworICAvLy8gYWRkZWQgdG8gaXQgYXMgd2VsbCB0byByZWN1cnNpdmVseSBzaW1wbGlmeSB1bmxlc3MgdGhhdCBhbGxvY2EgY2FuIGJlCisgIC8vLyBkaXJlY3RseSBwcm9tb3RlZC4gRmluYWxseSwgZWFjaCB0aW1lIHdlIHJld3JpdGUgYSB1c2Ugb2YgYW4gYWxsb2NhIG90aGVyCisgIC8vLyB0aGUgb25lIGJlaW5nIGFjdGl2ZWx5IHJld3JpdHRlbiwgd2UgYWRkIGl0IGJhY2sgb250byB0aGUgbGlzdCBpZiBub3QKKyAgLy8vIGFscmVhZHkgcHJlc2VudCB0byBlbnN1cmUgaXQgaXMgcmUtdmlzaXRlZC4KKyAgU2V0VmVjdG9yPEFsbG9jYUluc3QgKiwgU21hbGxWZWN0b3I8QWxsb2NhSW5zdCAqLCAxNj4+IFdvcmtsaXN0OworCisgIC8vLyBcYnJpZWYgQSBjb2xsZWN0aW9uIG9mIGluc3RydWN0aW9ucyB0byBkZWxldGUuCisgIC8vLyBXZSB0cnkgdG8gYmF0Y2ggZGVsZXRpb25zIHRvIHNpbXBsaWZ5IGNvZGUgYW5kIG1ha2UgdGhpbmdzIGEgYml0IG1vcmUKKyAgLy8vIGVmZmljaWVudC4KKyAgU2V0VmVjdG9yPEluc3RydWN0aW9uICosIFNtYWxsVmVjdG9yPEluc3RydWN0aW9uICosIDg+PiBEZWFkSW5zdHM7CisKKyAgLy8vIFxicmllZiBQb3N0LXByb21vdGlvbiB3b3JrbGlzdC4KKyAgLy8vCisgIC8vLyBTb21ldGltZXMgd2UgZGlzY292ZXIgYW4gYWxsb2NhIHdoaWNoIGhhcyBhIGhpZ2ggcHJvYmFiaWxpdHkgb2YgYmVjb21pbmcKKyAgLy8vIHZpYWJsZSBmb3IgU1JPQSBhZnRlciBhIHJvdW5kIG9mIHByb21vdGlvbiB0YWtlcyBwbGFjZS4gSW4gdGhvc2UgY2FzZXMsCisgIC8vLyB0aGUgYWxsb2NhIGlzIGVucXVldWVkIGhlcmUgZm9yIHJlLXByb2Nlc3NpbmcuCisgIC8vLworICAvLy8gTm90ZSB0aGF0IHdlIGhhdmUgdG8gYmUgdmVyeSBjYXJlZnVsIHRvIGNsZWFyIGFsbG9jYXMgb3V0IG9mIHRoaXMgbGlzdCBpbgorICAvLy8gdGhlIGV2ZW50IHRoZXkgYXJlIGRlbGV0ZWQuCisgIFNldFZlY3RvcjxBbGxvY2FJbnN0ICosIFNtYWxsVmVjdG9yPEFsbG9jYUluc3QgKiwgMTY+PiBQb3N0UHJvbW90aW9uV29ya2xpc3Q7CisKKyAgLy8vIFxicmllZiBBIGNvbGxlY3Rpb24gb2YgYWxsb2NhIGluc3RydWN0aW9ucyB3ZSBjYW4gZGlyZWN0bHkgcHJvbW90ZS4KKyAgc3RkOjp2ZWN0b3I8QWxsb2NhSW5zdCAqPiBQcm9tb3RhYmxlQWxsb2NhczsKKworICAvLy8gXGJyaWVmIEEgd29ya2xpc3Qgb2YgUEhJcyB0byBzcGVjdWxhdGUgcHJpb3IgdG8gcHJvbW90aW5nIGFsbG9jYXMuCisgIC8vLworICAvLy8gQWxsIG9mIHRoZXNlIFBISXMgaGF2ZSBiZWVuIGNoZWNrZWQgZm9yIHRoZSBzYWZldHkgb2Ygc3BlY3VsYXRpb24gYW5kIGJ5CisgIC8vLyBiZWluZyBzcGVjdWxhdGVkIHdpbGwgYWxsb3cgcHJvbW90aW5nIGFsbG9jYXMgY3VycmVudGx5IGluIHRoZSBwcm9tb3RhYmxlCisgIC8vLyBxdWV1ZS4KKyAgU2V0VmVjdG9yPFBISU5vZGUgKiwgU21hbGxWZWN0b3I8UEhJTm9kZSAqLCAyPj4gU3BlY3VsYXRhYmxlUEhJczsKKworICAvLy8gXGJyaWVmIEEgd29ya2xpc3Qgb2Ygc2VsZWN0IGluc3RydWN0aW9ucyB0byBzcGVjdWxhdGUgcHJpb3IgdG8gcHJvbW90aW5nCisgIC8vLyBhbGxvY2FzLgorICAvLy8KKyAgLy8vIEFsbCBvZiB0aGVzZSBzZWxlY3QgaW5zdHJ1Y3Rpb25zIGhhdmUgYmVlbiBjaGVja2VkIGZvciB0aGUgc2FmZXR5IG9mCisgIC8vLyBzcGVjdWxhdGlvbiBhbmQgYnkgYmVpbmcgc3BlY3VsYXRlZCB3aWxsIGFsbG93IHByb21vdGluZyBhbGxvY2FzCisgIC8vLyBjdXJyZW50bHkgaW4gdGhlIHByb21vdGFibGUgcXVldWUuCisgIFNldFZlY3RvcjxTZWxlY3RJbnN0ICosIFNtYWxsVmVjdG9yPFNlbGVjdEluc3QgKiwgMj4+IFNwZWN1bGF0YWJsZVNlbGVjdHM7CisKK3B1YmxpYzoKKyAgU1JPQSgpID0gZGVmYXVsdDsKKworICAvLy8gXGJyaWVmIFJ1biB0aGUgcGFzcyBvdmVyIHRoZSBmdW5jdGlvbi4KKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworCitwcml2YXRlOgorICBmcmllbmQgY2xhc3Mgc3JvYTo6QWxsb2NhU2xpY2VSZXdyaXRlcjsKKyAgZnJpZW5kIGNsYXNzIHNyb2E6OlNST0FMZWdhY3lQYXNzOworCisgIC8vLyBIZWxwZXIgdXNlZCBieSBib3RoIHRoZSBwdWJsaWMgcnVuIG1ldGhvZCBhbmQgYnkgdGhlIGxlZ2FjeSBwYXNzLgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW5JbXBsKEZ1bmN0aW9uICZGLCBEb21pbmF0b3JUcmVlICZSdW5EVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3N1bXB0aW9uQ2FjaGUgJlJ1bkFDKTsKKworICBib29sIHByZXNwbGl0TG9hZHNBbmRTdG9yZXMoQWxsb2NhSW5zdCAmQUksIHNyb2E6OkFsbG9jYVNsaWNlcyAmQVMpOworICBBbGxvY2FJbnN0ICpyZXdyaXRlUGFydGl0aW9uKEFsbG9jYUluc3QgJkFJLCBzcm9hOjpBbGxvY2FTbGljZXMgJkFTLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyb2E6OlBhcnRpdGlvbiAmUCk7CisgIGJvb2wgc3BsaXRBbGxvY2EoQWxsb2NhSW5zdCAmQUksIHNyb2E6OkFsbG9jYVNsaWNlcyAmQVMpOworICBib29sIHJ1bk9uQWxsb2NhKEFsbG9jYUluc3QgJkFJKTsKKyAgdm9pZCBjbG9iYmVyVXNlKFVzZSAmVSk7CisgIGJvb2wgZGVsZXRlRGVhZEluc3RydWN0aW9ucyhTbWFsbFB0clNldEltcGw8QWxsb2NhSW5zdCAqPiAmRGVsZXRlZEFsbG9jYXMpOworICBib29sIHByb21vdGVBbGxvY2FzKEZ1bmN0aW9uICZGKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX1NST0FfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9TaW1wbGVMb29wVW5zd2l0Y2guaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvU2ltcGxlTG9vcFVuc3dpdGNoLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjNiZmU2MwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvU2ltcGxlTG9vcFVuc3dpdGNoLmgKQEAgLTAsMCArMSw1NSBAQAorLy89PT0tIFNpbXBsZUxvb3BVbnN3aXRjaC5oIC0gSG9pc3QgbG9vcC1pbnZhcmlhbnQgY29udHJvbCBmbG93IC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX1NJTVBMRUxPT1BVTlNXSVRDSF9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfU0lNUExFTE9PUFVOU1dJVENIX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcEFuYWx5c2lzTWFuYWdlci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvTG9vcEluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9Mb29wUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gVGhpcyBwYXNzIHRyYW5zZm9ybXMgbG9vcHMgdGhhdCBjb250YWluIGJyYW5jaGVzIG9uIGxvb3AtaW52YXJpYW50CisvLy8gY29uZGl0aW9ucyB0byBoYXZlIG11bHRpcGxlIGxvb3BzLiBGb3IgZXhhbXBsZSwgaXQgdHVybnMgdGhlIGxlZnQgaW50byB0aGUKKy8vLyByaWdodCBjb2RlOgorLy8vCisvLy8gIGZvciAoLi4uKSAgICAgICAgICAgICAgICAgIGlmIChsaWMpCisvLy8gICAgQSAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yICguLi4pCisvLy8gICAgaWYgKGxpYykgICAgICAgICAgICAgICAgICAgICBBOyBCOyBDCisvLy8gICAgICBCICAgICAgICAgICAgICAgICAgICAgIGVsc2UKKy8vLyAgICBDICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKC4uLikKKy8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEE7IEMKKy8vLworLy8vIFRoaXMgY2FuIGluY3JlYXNlIHRoZSBzaXplIG9mIHRoZSBjb2RlIGV4cG9uZW50aWFsbHkgKGRvdWJsaW5nIGl0IGV2ZXJ5IHRpbWUKKy8vLyBhIGxvb3AgaXMgdW5zd2l0Y2hlZCkgc28gd2Ugb25seSB1bnN3aXRjaCBpZiB0aGUgcmVzdWx0YW50IGNvZGUgd2lsbCBiZQorLy8vIHNtYWxsZXIgdGhhbiBhIHRocmVzaG9sZC4KKy8vLworLy8vIFRoaXMgcGFzcyBleHBlY3RzIExJQ00gdG8gYmUgcnVuIGJlZm9yZSBpdCB0byBob2lzdCBpbnZhcmlhbnQgY29uZGl0aW9ucyBvdXQKKy8vLyBvZiB0aGUgbG9vcCwgdG8gbWFrZSB0aGUgdW5zd2l0Y2hpbmcgb3Bwb3J0dW5pdHkgb2J2aW91cy4KKy8vLworY2xhc3MgU2ltcGxlTG9vcFVuc3dpdGNoUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPFNpbXBsZUxvb3BVbnN3aXRjaFBhc3M+IHsKKyAgYm9vbCBOb25Ucml2aWFsOworCitwdWJsaWM6CisgIFNpbXBsZUxvb3BVbnN3aXRjaFBhc3MoYm9vbCBOb25Ucml2aWFsID0gZmFsc2UpIDogTm9uVHJpdmlhbChOb25Ucml2aWFsKSB7fQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihMb29wICZMLCBMb29wQW5hbHlzaXNNYW5hZ2VyICZBTSwKKyAgICAgICAgICAgICAgICAgICAgICAgIExvb3BTdGFuZGFyZEFuYWx5c2lzUmVzdWx0cyAmQVIsIExQTVVwZGF0ZXIgJlUpOworfTsKKworLy8vIENyZWF0ZSB0aGUgbGVnYWN5IHBhc3Mgb2JqZWN0IGZvciB0aGUgc2ltcGxlIGxvb3AgdW5zd2l0Y2hlci4KKy8vLworLy8vIFNlZSB0aGUgZG9jdW1lbnRhaW9uIGZvciBgU2ltcGxlTG9vcFVuc3dpdGNoUGFzc2AgZm9yIGRldGFpbHMuCitQYXNzICpjcmVhdGVTaW1wbGVMb29wVW5zd2l0Y2hMZWdhY3lQYXNzKGJvb2wgTm9uVHJpdmlhbCA9IGZhbHNlKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfU0lNUExFTE9PUFVOU1dJVENIX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvU2ltcGxpZnlDRkcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvU2ltcGxpZnlDRkcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTk4OTU3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9TaW1wbGlmeUNGRy5oCkBAIC0wLDAgKzEsNTUgQEAKKy8vPT09LSBTaW1wbGlmeUNGRy5oIC0gU2ltcGxpZnkgYW5kIGNhbm9uaWNhbGl6ZSB0aGUgQ0ZHIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUKKy8vLyBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIGludGVyZmFjZSBmb3IgdGhlIHBhc3MgcmVzcG9uc2libGUgZm9yIGJvdGgKKy8vLyBzaW1wbGlmeWluZyBhbmQgY2Fub25pY2FsaXppbmcgdGhlIENGRy4KKy8vLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX1NJTVBMSUZZQ0ZHX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9TSU1QTElGWUNGR19ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1V0aWxzL0xvY2FsLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQSBwYXNzIHRvIHNpbXBsaWZ5IGFuZCBjYW5vbmljYWxpemUgdGhlIENGRyBvZiBhIGZ1bmN0aW9uLgorLy8vCisvLy8gVGhpcyBwYXNzIGl0ZXJhdGl2ZWx5IHNpbXBsaWZpZXMgdGhlIGVudGlyZSBDRkcgb2YgYSBmdW5jdGlvbi4gSXQgbWF5IGNoYW5nZQorLy8vIG9yIHJlbW92ZSBjb250cm9sIGZsb3cgdG8gcHV0IHRoZSBDRkcgaW50byBhIGNhbm9uaWNhbCBmb3JtIGV4cGVjdGVkIGJ5CisvLy8gb3RoZXIgcGFzc2VzIG9mIHRoZSBtaWQtbGV2ZWwgb3B0aW1pemVyLiBEZXBlbmRpbmcgb24gdGhlIHNwZWNpZmllZCBvcHRpb25zLAorLy8vIGl0IG1heSBmdXJ0aGVyIG9wdGltaXplIGNvbnRyb2wtZmxvdyB0byBjcmVhdGUgbm9uLWNhbm9uaWNhbCBmb3Jtcy4KK2NsYXNzIFNpbXBsaWZ5Q0ZHUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPFNpbXBsaWZ5Q0ZHUGFzcz4geworICBTaW1wbGlmeUNGR09wdGlvbnMgT3B0aW9uczsKKworcHVibGljOgorICAvLy8gVGhlIGRlZmF1bHQgY29uc3RydWN0b3Igc2V0cyB0aGUgcGFzcyBvcHRpb25zIHRvIGNyZWF0ZSBjYW5vbmljYWwgSVIsCisgIC8vLyByYXRoZXIgdGhhbiBvcHRpbWFsIElSLiBUaGF0IGlzLCBieSBkZWZhdWx0IHdlIGJ5cGFzcyB0cmFuc2Zvcm1hdGlvbnMgdGhhdAorICAvLy8gYXJlIGxpa2VseSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlIGJ1dCBtYWtlIGFuYWx5c2lzIGZvciBvdGhlciBwYXNzZXMgbW9yZQorICAvLy8gZGlmZmljdWx0LgorICBTaW1wbGlmeUNGR1Bhc3MoKQorICAgICAgOiBTaW1wbGlmeUNGR1Bhc3MoU2ltcGxpZnlDRkdPcHRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuZm9yd2FyZFN3aXRjaENvbmRUb1BoaShmYWxzZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAuY29udmVydFN3aXRjaFRvTG9va3VwVGFibGUoZmFsc2UpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm5lZWRDYW5vbmljYWxMb29wcyh0cnVlKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5zaW5rQ29tbW9uSW5zdHMoZmFsc2UpKSB7fQorCisKKyAgLy8vIENvbnN0cnVjdCBhIHBhc3Mgd2l0aCBvcHRpb25hbCBvcHRpbWl6YXRpb25zLgorICBTaW1wbGlmeUNGR1Bhc3MoY29uc3QgU2ltcGxpZnlDRkdPcHRpb25zICZQYXNzT3B0aW9ucyk7CisKKyAgLy8vIFxicmllZiBSdW4gdGhlIHBhc3Mgb3ZlciB0aGUgZnVuY3Rpb24uCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1NpbmsuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvU2luay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5YjNjYjAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1NpbmsuaApAQCAtMCwwICsxLDMwIEBACisvLz09PS0tIFNpbmsuaCAtIENvZGUgU2lua2luZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBtb3ZlcyBpbnN0cnVjdGlvbnMgaW50byBzdWNjZXNzb3IgYmxvY2tzLCB3aGVuIHBvc3NpYmxlLCBzbyB0aGF0CisvLyB0aGV5IGFyZW4ndCBleGVjdXRlZCBvbiBwYXRocyB3aGVyZSB0aGVpciByZXN1bHRzIGFyZW4ndCBuZWVkZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX1NJTktfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX1NJTktfSAorCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gTW92ZSBpbnN0cnVjdGlvbnMgaW50byBzdWNjZXNzb3IgYmxvY2tzIHdoZW4gcG9zc2libGUuCitjbGFzcyBTaW5raW5nUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPFNpbmtpbmdQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307Cit9CisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX1NJTktfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9TcGVjdWxhdGVBcm91bmRQSElzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1NwZWN1bGF0ZUFyb3VuZFBISXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzllMDNkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9TcGVjdWxhdGVBcm91bmRQSElzLmgKQEAgLTAsMCArMSwxMTEgQEAKKy8vPT09LSBTcGVjdWxhdGVBcm91bmRQSElzLmggLSBTcGVjdWxhdGUgYXJvdW5kIFBISXMgLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9TUEVDVUxBVEVBUk9VTkRQSElTX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9TUEVDVUxBVEVBUk9VTkRQSElTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQXNzdW1wdGlvbkNhY2hlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8vIFRoaXMgcGFzcyBoYW5kbGVzIHNpbXBsZSBzcGVjdWxhdGluZyBvZiAgaW5zdHJ1Y3Rpb25zIGFyb3VuZCBQSElzIHdoZW4KKy8vLyBkb2luZyBzbyBpcyBwcm9maXRhYmxlIGZvciBhIHBhcnRpY3VsYXIgdGFyZ2V0IGRlc3BpdGUgZHVwbGljYXRlZAorLy8vIGluc3RydWN0aW9ucy4KKy8vLworLy8vIFRoZSBtb3RpdmF0aW5nIGV4YW1wbGUgYXJlIFBISXMgb2YgY29uc3RhbnRzIHdoaWNoIHdpbGwgcmVxdWlyZQorLy8vIG1hdGVyaWFsaXppbmcgdGhlIGNvbnN0YW50cyBhbG9uZyBlYWNoIGVkZ2UuIElmIHRoZSBQSEkgaXMgdXNlZCBieSBhbgorLy8vIGluc3RydWN0aW9uIHdoZXJlIHRoZSB0YXJnZXQgY2FuIG1hdGVyaWFsaXplIHRoZSBjb25zdGFudCBhcyBwYXJ0IG9mIHRoZQorLy8vIGluc3RydWN0aW9uLCBpdCBpcyBwcm9maXRhYmxlIHRvIHNwZWN1bGF0ZSB0aG9zZSBpbnN0cnVjdGlvbnMgYXJvdW5kIHRoZQorLy8vIFBISSBub2RlLiBUaGlzIGNhbiByZWR1Y2UgZHluYW1pYyBpbnN0cnVjdGlvbiBjb3VudCBhcyB3ZWxsIGFzIGRlY3JlYXNlCisvLy8gcmVnaXN0ZXIgcHJlc3N1cmUuCisvLy8KKy8vLyBDb25zaWRlciB0aGlzIElSIGZvciBleGFtcGxlOgorLy8vICAgYGBgCisvLy8gICBlbnRyeToKKy8vLyAgICAgYnIgaTEgJWZsYWcsIGxhYmVsICVhLCBsYWJlbCAlYgorLy8vCisvLy8gICBhOgorLy8vICAgICBiciBsYWJlbCAlZXhpdAorLy8vCisvLy8gICBiOgorLy8vICAgICBiciBsYWJlbCAlZXhpdAorLy8vCisvLy8gICBleGl0OgorLy8vICAgICAlcCA9IHBoaSBpMzIgWyA3LCAlYSBdLCBbIDExLCAlYiBdCisvLy8gICAgICVzdW0gPSBhZGQgaTMyICVhcmcsICVwCisvLy8gICAgIHJldCBpMzIgJXN1bQorLy8vICAgYGBgCisvLy8gVG8gbWF0ZXJpYWxpemUgdGhlIGlucHV0cyB0byB0aGlzIFBISSBub2RlIG1heSByZXF1aXJlIGFuIGV4cGxpY2l0CisvLy8gaW5zdHJ1Y3Rpb24uIEZvciBleGFtcGxlLCBvbiB4ODYgdGhpcyB3b3VsZCB0dXJuIGludG8gc29tZXRoaW5nIGxpa2UKKy8vLyAgIGBgYAorLy8vICAgICB0ZXN0cSAlZWF4LCAlZWF4CisvLy8gICAgIG1vdmwgJDcsICVyTk4KKy8vLyAgICAgam5lIC5MCisvLy8gICAgIG1vdmwgJDExLCAlck5OCisvLy8gICAuTDoKKy8vLyAgICAgYWRkbCAlZWRpLCAlck5OCisvLy8gICAgIG1vdmwgJXJOTiwgJWVheAorLy8vICAgICByZXRxCisvLy8gICBgYGAKKy8vLyBXaGVuIHRoZXNlIGNvbnN0YW50cyBjYW4gYmUgZm9sZGVkIGRpcmVjdGx5IGludG8gYW5vdGhlciBpbnN0cnVjdGlvbiwgaXQKKy8vLyB3b3VsZCBiZSBwcmVmZXJhYmxlIHRvIGF2b2lkIHRoZSBwb3RlbnRpYWwgZm9yIHJlZ2lzdGVyIHByZXNzdXJlIChhYm92ZSB3ZQorLy8vIGNhbiBlYXNpbHkgYXZvaWQgaXQsIGJ1dCB0aGF0IGlzbid0IGFsd2F5cyB0cnVlKSBhbmQgc2ltcGx5IGR1cGxpY2F0ZSB0aGUKKy8vLyBpbnN0cnVjdGlvbiB1c2luZyB0aGUgUEhJOgorLy8vICAgYGBgCisvLy8gICBlbnRyeToKKy8vLyAgICAgYnIgaTEgJWZsYWcsIGxhYmVsICVhLCBsYWJlbCAlYgorLy8vCisvLy8gICBhOgorLy8vICAgICAlc3VtLjEgPSBhZGQgaTMyICVhcmcsIDcKKy8vLyAgICAgYnIgbGFiZWwgJWV4aXQKKy8vLworLy8vICAgYjoKKy8vLyAgICAgJXN1bS4yID0gYWRkIGkzMiAlYXJnLCAxMQorLy8vICAgICBiciBsYWJlbCAlZXhpdAorLy8vCisvLy8gICBleGl0OgorLy8vICAgICAlcCA9IHBoaSBpMzIgWyAlc3VtLjEsICVhIF0sIFsgJXN1bS4yLCAlYiBdCisvLy8gICAgIHJldCBpMzIgJXAKKy8vLyAgIGBgYAorLy8vIFdoaWNoIHdpbGwgZ2VuZXJhdGUgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyBvbiB4ODY6CisvLy8gICBgYGAKKy8vLyAgICAgdGVzdHEgJWVheCwgJWVheAorLy8vICAgICBhZGRsICQ3LCAlZWRpCisvLy8gICAgIGpuZSAuTAorLy8vICAgICBhZGRsICQxMSwgJWVkaQorLy8vICAgLkw6CisvLy8gICAgIG1vdmwgJWVkaSwgJWVheAorLy8vICAgICByZXRxCisvLy8gICBgYGAKKy8vLworLy8vIEl0IGlzIGltcG9ydGFudCB0byBub3RlIHRoYXQgdGhpcyBwYXNzIGlzIG5ldmVyIGludGVuZGVkIHRvIGhhbmRsZSBtb3JlCisvLy8gY29tcGxleCBjYXNlcyB3aGVyZSBzcGVjdWxhdGluZyBhcm91bmQgUEhJcyBhbGxvd3Mgc2ltcGxpZmljYXRpb25zIG9mIHRoZQorLy8vIElSIGl0c2VsZiBvciBvdGhlciBzdWJzZXF1ZW50IG9wdGltaXphdGlvbnMuIFRob3NlIGNhbiBhbmQgc2hvdWxkIGFscmVhZHkKKy8vLyBiZSBoYW5kbGVkIGJlZm9yZSB0aGlzIHBhc3MgaXMgZXZlciBydW4gYnkgYSBtb3JlIHBvd2VyZnVsIGFuYWx5c2lzIHRoYXQKKy8vLyBjYW4gcmVhc29uIGFib3V0IGVxdWl2YWxlbmNlcyBhbmQgY29tbW9uIHN1YmV4cHJlc3Npb25zLiBDbGFzc2ljYWxseSwgdGhvc2UKKy8vLyBjYXNlcyB3b3VsZCBiZSBoYW5kbGVkIGJ5IGEgR1ZOLXBvd2VyZWQgUFJFIG9yIHNpbWlsYXIgdHJhbnNmb3JtLiBUaGlzCisvLy8gcGFzcywgaW4gY29udHJhc3QsIGlzICpvbmx5KiBpbnRlcmVzdGVkIGluIGNhc2VzIHdoZXJlIGRlc3BpdGUgbm8KKy8vLyBzaW1wbGlmaWNhdGlvbnMgdG8gdGhlIElSIGl0c2VsZiwgc3BlY3VsYXRpb24gaXMgKmZhc3RlciogdG8gZXhlY3V0ZS4gVGhlCisvLy8gcmVzdWx0IG9mIHRoaXMgaXMgdGhhdCB0aGUgY29zdCBtb2RlbHMgd2hpY2ggYXJlIGFwcHJvcHJpYXRlIHRvIGNvbnNpZGVyCisvLy8gaGVyZSBhcmUgcmVsYXRpdmVseSBzaW1wbGUgb25lcyBhcm91bmQgZXhlY3V0aW9uIGFuZCBjb2Rlc2l6ZSBjb3N0LCB3aXRob3V0CisvLy8gYW55IG5lZWQgdG8gY29uc2lkZXIgc2ltcGxpZmljYXRpb25zIG9yIG90aGVyIHRyYW5zZm9ybWF0aW9ucy4KK3N0cnVjdCBTcGVjdWxhdGVBcm91bmRQSElzUGFzcyA6IFBhc3NJbmZvTWl4aW48U3BlY3VsYXRlQXJvdW5kUEhJc1Bhc3M+IHsKKyAgLy8vIFxicmllZiBSdW4gdGhlIHBhc3Mgb3ZlciB0aGUgZnVuY3Rpb24uCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX1NQRUNVTEFURUFST1VORFBISVNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9TcGVjdWxhdGl2ZUV4ZWN1dGlvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9TcGVjdWxhdGl2ZUV4ZWN1dGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2OGY4MTcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvU2NhbGFyL1NwZWN1bGF0aXZlRXhlY3V0aW9uLmgKQEAgLTAsMCArMSw5MiBAQAorLy89PT0tIFNwZWN1bGF0aXZlRXhlY3V0aW9uLmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgaG9pc3RzIGluc3RydWN0aW9ucyB0byBlbmFibGUgc3BlY3VsYXRpdmUgZXhlY3V0aW9uIG9uCisvLyB0YXJnZXRzIHdoZXJlIGJyYW5jaGVzIGFyZSBleHBlbnNpdmUuIFRoaXMgaXMgYWltZWQgYXQgR1BVcy4gSXQKKy8vIGN1cnJlbnRseSB3b3JrcyBvbiBzaW1wbGUgaWYtdGhlbiBhbmQgaWYtdGhlbi1lbHNlCisvLyBwYXR0ZXJucy4KKy8vCisvLyBSZW1vdmluZyBicmFuY2hlcyBpcyBub3QgdGhlIG9ubHkgbW90aXZhdGlvbiBmb3IgdGhpcworLy8gcGFzcy4gRS5nLiBjb25zaWRlciB0aGlzIGNvZGUgYW5kIGFzc3VtZSB0aGF0IHRoZXJlIGlzIG5vCisvLyBhZGRyZXNzaW5nIG1vZGUgZm9yIG11bHRpcGx5aW5nIGJ5IHNpemVvZigqYSk6CisvLworLy8gICBpZiAoYiA+IDApCisvLyAgICAgYyA9IGFbaSArIDFdCisvLyAgIGlmIChkID4gMCkKKy8vICAgICBlID0gYVtpICsgMl0KKy8vCisvLyB0dXJucyBpbnRvCisvLworLy8gICBwID0gJmFbaSArIDFdOworLy8gICBpZiAoYiA+IDApCisvLyAgICAgYyA9ICpwOworLy8gICBxID0gJmFbaSArIDJdOworLy8gICBpZiAoZCA+IDApCisvLyAgICAgZSA9ICpxOworLy8KKy8vIHdoaWNoIGNvdWxkIGxhdGVyIGJlIG9wdGltaXplZCB0bworLy8KKy8vICAgciA9ICZhW2ldOworLy8gICBpZiAoYiA+IDApCisvLyAgICAgYyA9IHJbMV07CisvLyAgIGlmIChkID4gMCkKKy8vICAgICBlID0gclsyXTsKKy8vCisvLyBMYXRlciBwYXNzZXMgc2luayBiYWNrIG11Y2ggb2YgdGhlIHNwZWN1bGF0ZWQgY29kZSB0aGF0IGRpZCBub3QgZW5hYmxlCisvLyBmdXJ0aGVyIG9wdGltaXphdGlvbi4KKy8vCisvLyBUaGlzIHBhc3MgaXMgbW9yZSBhZ2dyZXNzaXZlIHRoYW4gdGhlIGZ1bmN0aW9uIFNwZWN1bGF0aXZleUV4ZWN1dGVCQiBpbgorLy8gU2ltcGxpZnlDRkcuIFNpbXBsaWZ5Q0ZHIHdpbGwgbm90IHNwZWN1bGF0ZSBpZiBubyBzZWxlY3RzIGFyZSBpbnRyb2R1Y2VkIGFuZAorLy8gaXQgd2lsbCBzcGVjdWxhdGUgYXQgbW9zdCBvbmUgaW5zdHJ1Y3Rpb24uIEl0IGFsc28gd2lsbCBub3Qgc3BlY3VsYXRlIGlmCisvLyB0aGVyZSBpcyBhIHZhbHVlIGRlZmluZWQgaW4gdGhlIGlmLWJsb2NrIHRoYXQgaXMgb25seSB1c2VkIGluIHRoZSB0aGVuLWJsb2NrLgorLy8gVGhlc2UgcmVzdHJpY3Rpb25zIG1ha2Ugc2Vuc2Ugc2luY2UgdGhlIHNwZWN1bGF0aW9uIGluIFNpbXBsaWZ5Q0ZHIHNlZW1zCisvLyBhaW1lZCBhdCBpbnRyb2R1Y2luZyBjaGVhcCBzZWxlY3RzLCB3aGlsZSB0aGlzIHBhc3MgaXMgaW50ZW5kZWQgdG8gZG8gbW9yZQorLy8gYWdncmVzc2l2ZSBzcGVjdWxhdGlvbiB3aGlsZSBjb3VudGluZyBvbiBsYXRlciBwYXNzZXMgdG8gZWl0aGVyIGNhcGl0YWxpemUgb24KKy8vIHRoYXQgb3IgY2xlYW4gaXQgdXAuCisvLworLy8gSWYgdGhlIHBhc3Mgd2FzIGNyZWF0ZWQgYnkgY2FsbGluZworLy8gY3JlYXRlU3BlY3VsYXRpdmVFeGVjdXRpb25JZkhhc0JyYW5jaERpdmVyZ2VuY2VQYXNzIG9yIHRoZQorLy8gLXNwZWMtZXhlYy1vbmx5LWlmLWRpdmVyZ2VudC10YXJnZXQgb3B0aW9uIGlzIHByZXNlbnQsIHRoaXMgcGFzcyBvbmx5IGhhcyBhbgorLy8gZWZmZWN0IG9uIHRhcmdldHMgd2hlcmUgVGFyZ2V0VHJhbnNmb3JtSW5mbzo6aGFzQnJhbmNoRGl2ZXJnZW5jZSgpIGlzIHRydWU7CisvLyBvbiBvdGhlciB0YXJnZXRzLCBpdCBpcyBhIG5vcC4KKy8vCisvLyBUaGlzIGxldHMgeW91IGluY2x1ZGUgdGhpcyBwYXNzIHVuY29uZGl0aW9uYWxseSBpbiB0aGUgSVIgcGFzcyBwaXBlbGluZSwgYnV0CisvLyBvbmx5IGVuYWJsZSBpdCBmb3IgcmVsZXZhbnQgdGFyZ2V0cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfU0NBTEFSX1NQRUNVTEFUSVZFRVhFQ1VUSU9OX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9TUEVDVUxBVElWRUVYRUNVVElPTl9ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1RhcmdldFRyYW5zZm9ybUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFNwZWN1bGF0aXZlRXhlY3V0aW9uUGFzcworICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48U3BlY3VsYXRpdmVFeGVjdXRpb25QYXNzPiB7CitwdWJsaWM6CisgIFNwZWN1bGF0aXZlRXhlY3V0aW9uUGFzcyhib29sIE9ubHlJZkRpdmVyZ2VudFRhcmdldCA9IGZhbHNlKTsKKworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7CisKKyAgLy8gR2x1ZSBmb3Igb2xkIFBNCisgIGJvb2wgcnVuSW1wbChGdW5jdGlvbiAmRiwgVGFyZ2V0VHJhbnNmb3JtSW5mbyAqVFRJKTsKKworcHJpdmF0ZToKKyAgYm9vbCBydW5PbkJhc2ljQmxvY2soQmFzaWNCbG9jayAmQik7CisgIGJvb2wgY29uc2lkZXJIb2lzdGluZ0Zyb21UbyhCYXNpY0Jsb2NrICZGcm9tQmxvY2ssIEJhc2ljQmxvY2sgJlRvQmxvY2spOworCisgIC8vIElmIHRydWUsIHRoaXMgcGFzcyBpcyBhIG5vcCB1bmxlc3MgdGhlIHRhcmdldCBhcmNoaXRlY3R1cmUgaGFzIGJyYW5jaAorICAvLyBkaXZlcmdlbmNlLiAgCisgIGNvbnN0IGJvb2wgT25seUlmRGl2ZXJnZW50VGFyZ2V0ID0gZmFsc2U7CisKKyAgVGFyZ2V0VHJhbnNmb3JtSW5mbyAqVFRJID0gbnVsbHB0cjsKK307Cit9CisKKyNlbmRpZiAvL0xMVk1fVFJBTlNGT1JNU19TQ0FMQVJfU1BFQ1VMQVRJVkVFWEVDVVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1NjYWxhci9UYWlsUmVjdXJzaW9uRWxpbWluYXRpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvVGFpbFJlY3Vyc2lvbkVsaW1pbmF0aW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzkzZjliYwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9TY2FsYXIvVGFpbFJlY3Vyc2lvbkVsaW1pbmF0aW9uLmgKQEAgLTAsMCArMSw2NiBAQAorLy89PT0tLS0tIFRhaWxSZWN1cnNpb25FbGltaW5hdGlvbi5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgdHJhbnNmb3JtcyBjYWxscyBvZiB0aGUgY3VycmVudCBmdW5jdGlvbiAoc2VsZiByZWN1cnNpb24pIGZvbGxvd2VkCisvLyBieSBhIHJldHVybiBpbnN0cnVjdGlvbiB3aXRoIGEgYnJhbmNoIHRvIHRoZSBlbnRyeSBvZiB0aGUgZnVuY3Rpb24sIGNyZWF0aW5nCisvLyBhIGxvb3AuICBUaGlzIHBhc3MgYWxzbyBpbXBsZW1lbnRzIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9ucyB0byB0aGUgYmFzaWMKKy8vIGFsZ29yaXRobToKKy8vCisvLyAgMS4gVHJpdmlhbCBpbnN0cnVjdGlvbnMgYmV0d2VlbiB0aGUgY2FsbCBhbmQgcmV0dXJuIGRvIG5vdCBwcmV2ZW50IHRoZQorLy8gICAgIHRyYW5zZm9ybWF0aW9uIGZyb20gdGFraW5nIHBsYWNlLCB0aG91Z2ggY3VycmVudGx5IHRoZSBhbmFseXNpcyBjYW5ub3QKKy8vICAgICBzdXBwb3J0IG1vdmluZyBhbnkgcmVhbGx5IHVzZWZ1bCBpbnN0cnVjdGlvbnMgKG9ubHkgZGVhZCBvbmVzKS4KKy8vICAyLiBUaGlzIHBhc3MgdHJhbnNmb3JtcyBmdW5jdGlvbnMgdGhhdCBhcmUgcHJldmVudGVkIGZyb20gYmVpbmcgdGFpbAorLy8gICAgIHJlY3Vyc2l2ZSBieSBhbiBhc3NvY2lhdGl2ZSBhbmQgY29tbXV0YXRpdmUgZXhwcmVzc2lvbiB0byB1c2UgYW4KKy8vICAgICBhY2N1bXVsYXRvciB2YXJpYWJsZSwgdGh1cyBjb21waWxpbmcgdGhlIHR5cGljYWwgbmFpdmUgZmFjdG9yaWFsIG9yCisvLyAgICAgJ2ZpYicgaW1wbGVtZW50YXRpb24gaW50byBlZmZpY2llbnQgY29kZS4KKy8vICAzLiBUUkUgaXMgcGVyZm9ybWVkIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zIHZvaWQsIGlmIHRoZSByZXR1cm4KKy8vICAgICByZXR1cm5zIHRoZSByZXN1bHQgcmV0dXJuZWQgYnkgdGhlIGNhbGwsIG9yIGlmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGEKKy8vICAgICBydW4tdGltZSBjb25zdGFudCBvbiBhbGwgZXhpdHMgZnJvbSB0aGUgZnVuY3Rpb24uICBJdCBpcyBwb3NzaWJsZSwgdGhvdWdoCisvLyAgICAgdW5saWtlbHksIHRoYXQgdGhlIHJldHVybiByZXR1cm5zIHNvbWV0aGluZyBlbHNlIChsaWtlIGNvbnN0YW50IDApLCBhbmQKKy8vICAgICBjYW4gc3RpbGwgYmUgVFJFJ2QuICBJdCBjYW4gYmUgVFJFJ2QgaWYgQUxMIE9USEVSIHJldHVybiBpbnN0cnVjdGlvbnMgaW4KKy8vICAgICB0aGUgZnVuY3Rpb24gcmV0dXJuIHRoZSBleGFjdCBzYW1lIHZhbHVlLgorLy8gIDQuIElmIGl0IGNhbiBwcm92ZSB0aGF0IGNhbGxlZXMgZG8gbm90IGFjY2VzcyB0aGVpciBjYWxsZXIgc3RhY2sgZnJhbWUsCisvLyAgICAgdGhleSBhcmUgbWFya2VkIGFzIGVsaWdpYmxlIGZvciB0YWlsIGNhbGwgZWxpbWluYXRpb24gKGJ5IHRoZSBjb2RlCisvLyAgICAgZ2VuZXJhdG9yKS4KKy8vCisvLyBUaGVyZSBhcmUgc2V2ZXJhbCBpbXByb3ZlbWVudHMgdGhhdCBjb3VsZCBiZSBtYWRlOgorLy8KKy8vICAxLiBJZiB0aGUgZnVuY3Rpb24gaGFzIGFueSBhbGxvY2EgaW5zdHJ1Y3Rpb25zLCB0aGVzZSBpbnN0cnVjdGlvbnMgd2lsbCBiZQorLy8gICAgIG1vdmVkIG91dCBvZiB0aGUgZW50cnkgYmxvY2sgb2YgdGhlIGZ1bmN0aW9uLCBjYXVzaW5nIHRoZW0gdG8gYmUKKy8vICAgICBldmFsdWF0ZWQgZWFjaCB0aW1lIHRocm91Z2ggdGhlIHRhaWwgcmVjdXJzaW9uLiAgU2FmZWx5IGtlZXBpbmcgYWxsb2NhcworLy8gICAgIGluIHRoZSBlbnRyeSBibG9jayByZXF1aXJlcyBhbmFseXNpcyB0byBwcm92ZXMgdGhhdCB0aGUgdGFpbC1jYWxsZWQKKy8vICAgICBmdW5jdGlvbiBkb2VzIG5vdCByZWFkIG9yIHdyaXRlIHRoZSBzdGFjayBvYmplY3QuCisvLyAgMi4gVGFpbCByZWN1cnNpb24gaXMgb25seSBwZXJmb3JtZWQgaWYgdGhlIGNhbGwgaW1tZWRpYXRlbHkgcHJlY2VkZXMgdGhlCisvLyAgICAgcmV0dXJuIGluc3RydWN0aW9uLiAgSXQncyBwb3NzaWJsZSB0aGF0IHRoZXJlIGNvdWxkIGJlIGEganVtcCBiZXR3ZWVuCisvLyAgICAgdGhlIGNhbGwgYW5kIHRoZSByZXR1cm4uCisvLyAgMy4gVGhlcmUgY2FuIGJlIGludGVydmVuaW5nIG9wZXJhdGlvbnMgYmV0d2VlbiB0aGUgY2FsbCBhbmQgdGhlIHJldHVybiB0aGF0CisvLyAgICAgcHJldmVudCB0aGUgVFJFIGZyb20gb2NjdXJyaW5nLiAgRm9yIGV4YW1wbGUsIHRoZXJlIGNvdWxkIGJlIEdFUCdzIGFuZAorLy8gICAgIHN0b3JlcyB0byBtZW1vcnkgdGhhdCB3aWxsIG5vdCBiZSByZWFkIG9yIHdyaXR0ZW4gYnkgdGhlIGNhbGwuICBUaGlzCisvLyAgICAgcmVxdWlyZXMgc29tZSBzdWJzdGFudGlhbCBhbmFseXNpcyAoc3VjaCBhcyB3aXRoIERTQSkgdG8gcHJvdmUgc2FmZSB0bworLy8gICAgIG1vdmUgYWhlYWQgb2YgdGhlIGNhbGwsIGJ1dCBkb2luZyBzbyBjb3VsZCBhbGxvdyBtYW55IG1vcmUgVFJFcyB0byBiZQorLy8gICAgIHBlcmZvcm1lZCwgZm9yIGV4YW1wbGUgaW4gVHJlZUFkZC9UcmVlQWxsb2MgZnJvbSB0aGUgdHJlZWFkZCBiZW5jaG1hcmsuCisvLyAgNC4gVGhlIGFsZ29yaXRobSB3ZSB1c2UgdG8gZGV0ZWN0IGlmIGNhbGxlZXMgYWNjZXNzIHRoZWlyIGNhbGxlciBzdGFjaworLy8gICAgIGZyYW1lcyBpcyB2ZXJ5IHByaW1pdGl2ZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19TQ0FMQVJfVEFJTFJFQ1VSU0lPTkVMSU1JTkFUSU9OX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9UQUlMUkVDVVJTSU9ORUxJTUlOQVRJT05fSAorCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitzdHJ1Y3QgVGFpbENhbGxFbGltUGFzcyA6IFBhc3NJbmZvTWl4aW48VGFpbENhbGxFbGltUGFzcz4geworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworfQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1NDQUxBUl9UQUlMUkVDVVJTSU9ORUxJTUlOQVRJT05fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZmI4OWQxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzLmgKQEAgLTAsMCArMSwxMjUgQEAKKy8vPT09LSBsbHZtL1RyYW5zZm9ybXMvVXRpbHMuaCAtIFV0aWxpdHkgVHJhbnNmb3JtYXRpb25zIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBoZWFkZXIgZmlsZSBkZWZpbmVzIHByb3RvdHlwZXMgZm9yIGFjY2Vzc29yIGZ1bmN0aW9ucyB0aGF0IGV4cG9zZSBwYXNzZXMKKy8vIGluIHRoZSBVdGlscyB0cmFuc2Zvcm1hdGlvbnMgbGlicmFyeS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19ICisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTW9kdWxlUGFzczsKK2NsYXNzIEZ1bmN0aW9uUGFzczsKK2NsYXNzIFBhc3M7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLyBjcmVhdGVNZXRhUmVuYW1lclBhc3MgLSBSZW5hbWUgZXZlcnl0aGluZyB3aXRoIG1ldGFzeW50YXRpYyBuYW1lcy4KKy8vCitNb2R1bGVQYXNzICpjcmVhdGVNZXRhUmVuYW1lclBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb3dlckludm9rZSAtIFRoaXMgcGFzcyByZW1vdmVzIGludm9rZSBpbnN0cnVjdGlvbnMsIGNvbnZlcnRpbmcgdGhlbSB0byBjYWxsCisvLyBpbnN0cnVjdGlvbnMuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVMb3dlckludm9rZVBhc3MoKTsKK2V4dGVybiBjaGFyICZMb3dlckludm9rZVBhc3NJRDsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBJbnN0cnVjdGlvbk5hbWVyIC0gR2l2ZSBhbnkgdW5uYW1lZCBub24tdm9pZCBpbnN0cnVjdGlvbnMgInRtcCIgbmFtZXMuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVJbnN0cnVjdGlvbk5hbWVyUGFzcygpOworZXh0ZXJuIGNoYXIgJkluc3RydWN0aW9uTmFtZXJJRDsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb3dlclN3aXRjaCAtIFRoaXMgcGFzcyBjb252ZXJ0cyBTd2l0Y2hJbnN0IGluc3RydWN0aW9ucyBpbnRvIGEgc2VxdWVuY2Ugb2YKKy8vIGNoYWluZWQgYmluYXJ5IGJyYW5jaCBpbnN0cnVjdGlvbnMuCisvLworRnVuY3Rpb25QYXNzICpjcmVhdGVMb3dlclN3aXRjaFBhc3MoKTsKK2V4dGVybiBjaGFyICZMb3dlclN3aXRjaElEOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEVudHJ5RXhpdEluc3RydW1lbnRlciBwYXNzIC0gSW5zdHJ1bWVudCBmdW5jdGlvbiBlbnRyeS9leGl0IHdpdGggY2FsbHMgdG8KKy8vIG1jb3VudCgpLCBAX19jeWdfcHJvZmlsZV9mdW5jX3tlbnRlcixleGl0fSBhbmQgdGhlIGxpa2UuIFRoZXJlIGFyZSB0d28KKy8vIHZhcmlhbnRzLCBpbnRlbmRlZCB0byBydW4gcHJlLSBhbmQgcG9zdC1pbmxpbmluZywgcmVzcGVjdGl2ZWx5LgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlRW50cnlFeGl0SW5zdHJ1bWVudGVyUGFzcygpOworRnVuY3Rpb25QYXNzICpjcmVhdGVQb3N0SW5saW5lRW50cnlFeGl0SW5zdHJ1bWVudGVyUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEJyZWFrQ3JpdGljYWxFZGdlcyAtIEJyZWFrIGFsbCBvZiB0aGUgY3JpdGljYWwgZWRnZXMgaW4gdGhlIENGRyBieSBpbnNlcnRpbmcKKy8vIGEgZHVtbXkgYmFzaWMgYmxvY2suIFRoaXMgcGFzcyBtYXkgYmUgInJlcXVpcmVkIiBieSBwYXNzZXMgdGhhdCBjYW5ub3QgZGVhbAorLy8gd2l0aCBjcml0aWNhbCBlZGdlcy4gRm9yIHRoaXMgdXNhZ2UsIGEgcGFzcyBtdXN0IGNhbGw6CisvLworLy8gICBBVS5hZGRSZXF1aXJlZElEKEJyZWFrQ3JpdGljYWxFZGdlc0lEKTsKKy8vCisvLyBUaGlzIHBhc3Mgb2J2aW91c2x5IGludmFsaWRhdGVzIHRoZSBDRkcsIGJ1dCBjYW4gdXBkYXRlIGZvcndhcmQgZG9taW5hdG9yCisvLyAoc2V0LCBpbW1lZGlhdGUgZG9taW5hdG9ycywgdHJlZSwgYW5kIGZyb250aWVyKSBpbmZvcm1hdGlvbi4KKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZUJyZWFrQ3JpdGljYWxFZGdlc1Bhc3MoKTsKK2V4dGVybiBjaGFyICZCcmVha0NyaXRpY2FsRWRnZXNJRDsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMQ1NTQSAtIFRoaXMgcGFzcyBpbnNlcnRzIHBoaSBub2RlcyBhdCBsb29wIGJvdW5kYXJpZXMgdG8gc2ltcGxpZnkgb3RoZXIgbG9vcAorLy8gb3B0aW1pemF0aW9ucy4KKy8vCitQYXNzICpjcmVhdGVMQ1NTQVBhc3MoKTsKK2V4dGVybiBjaGFyICZMQ1NTQUlEOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEFkZERpc2NyaW1pbmF0b3JzIC0gQWRkIERXQVJGIHBhdGggZGlzY3JpbWluYXRvcnMgdG8gdGhlIElSLgorRnVuY3Rpb25QYXNzICpjcmVhdGVBZGREaXNjcmltaW5hdG9yc1Bhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBQcm9tb3RlTWVtb3J5VG9SZWdpc3RlciAtIFRoaXMgcGFzcyBpcyB1c2VkIHRvIHByb21vdGUgbWVtb3J5IHJlZmVyZW5jZXMgdG8KKy8vIGJlIHJlZ2lzdGVyIHJlZmVyZW5jZXMuIEEgc2ltcGxlIGV4YW1wbGUgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIHBlcmZvcm1lZCBieQorLy8gdGhpcyBwYXNzIGlzOgorLy8KKy8vICAgICAgICBGUk9NIENPREUgICAgICAgICAgICAgICAgICAgICAgICAgICBUTyBDT0RFCisvLyAgICVYID0gYWxsb2NhIGkzMiwgaTMyIDEgICAgICAgICAgICAgICAgIHJldCBpMzIgNDIKKy8vICAgc3RvcmUgaTMyIDQyLCBpMzIgKiVYCisvLyAgICVZID0gbG9hZCBpMzIqICVYCisvLyAgIHJldCBpMzIgJVkKKy8vCitGdW5jdGlvblBhc3MgKmNyZWF0ZVByb21vdGVNZW1vcnlUb1JlZ2lzdGVyUGFzcygpOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIExvb3BTaW1wbGlmeSAtIEluc2VydCBQcmUtaGVhZGVyIGJsb2NrcyBpbnRvIHRoZSBDRkcgZm9yIGV2ZXJ5IGZ1bmN0aW9uIGluCisvLyB0aGUgbW9kdWxlLiAgVGhpcyBwYXNzIHVwZGF0ZXMgZG9taW5hdG9yIGluZm9ybWF0aW9uLCBsb29wIGluZm9ybWF0aW9uLCBhbmQKKy8vIGRvZXMgbm90IGFkZCBjcml0aWNhbCBlZGdlcyB0byB0aGUgQ0ZHLgorLy8KKy8vICAgQVUuYWRkUmVxdWlyZWRJRChMb29wU2ltcGxpZnlJRCk7CisvLworUGFzcyAqY3JlYXRlTG9vcFNpbXBsaWZ5UGFzcygpOworZXh0ZXJuIGNoYXIgJkxvb3BTaW1wbGlmeUlEOworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEluc3RydWN0aW9uU2ltcGxpZmllciAtIFJlbW92ZSByZWR1bmRhbnQgaW5zdHJ1Y3Rpb25zLgorLy8KK0Z1bmN0aW9uUGFzcyAqY3JlYXRlSW5zdHJ1Y3Rpb25TaW1wbGlmaWVyUGFzcygpOworZXh0ZXJuIGNoYXIgJkluc3RydWN0aW9uU2ltcGxpZmllcklEOworCisvLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGEgbmV3IHBhc3MgdGhhdCBkb3duZ3JhZGVzIHRoZSBkZWJ1ZyBpbmZvIGluIHRoZQorLy8vIG1vZHVsZSB0byBsaW5lIHRhYmxlcyBvbmx5LgorTW9kdWxlUGFzcyAqY3JlYXRlU3RyaXBOb25MaW5lVGFibGVEZWJ1Z0luZm9QYXNzKCk7Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0FTYW5TdGFja0ZyYW1lTGF5b3V0LmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQVNhblN0YWNrRnJhbWVMYXlvdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYWFkMDZhCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0FTYW5TdGFja0ZyYW1lTGF5b3V0LmgKQEAgLTAsMCArMSw4MSBAQAorLy89PT0tIEFTYW5TdGFja0ZyYW1lTGF5b3V0LmggLSBDb21wdXRlQVNhblN0YWNrRnJhbWVMYXlvdXQgLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGhlYWRlciBkZWZpbmVzIENvbXB1dGVBU2FuU3RhY2tGcmFtZUxheW91dCBhbmQgYXV4aWxpYXJ5IGRhdGEgc3RydWN0cy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQVNBTlNUQUNLRlJBTUVMQVlPVVRfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQVNBTlNUQUNLRlJBTUVMQVlPVVRfSAorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsU3RyaW5nLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBbGxvY2FJbnN0OworCisvLyBUaGVzZSBtYWdpYyBjb25zdGFudHMgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIGluCisvLyBpbiBhc2FuX2ludGVybmFsLmggZnJvbSBBU2FuIHJ1bnRpbWUgaW4gY29tcGlsZXItcnQuCitzdGF0aWMgY29uc3QgaW50IGtBc2FuU3RhY2tMZWZ0UmVkem9uZU1hZ2ljID0gMHhmMTsKK3N0YXRpYyBjb25zdCBpbnQga0FzYW5TdGFja01pZFJlZHpvbmVNYWdpYyA9IDB4ZjI7CitzdGF0aWMgY29uc3QgaW50IGtBc2FuU3RhY2tSaWdodFJlZHpvbmVNYWdpYyA9IDB4ZjM7CitzdGF0aWMgY29uc3QgaW50IGtBc2FuU3RhY2tVc2VBZnRlclJldHVybk1hZ2ljID0gMHhmNTsKK3N0YXRpYyBjb25zdCBpbnQga0FzYW5TdGFja1VzZUFmdGVyU2NvcGVNYWdpYyA9IDB4Zjg7CisKKy8vIElucHV0L291dHB1dCBkYXRhIHN0cnVjdCBmb3IgQ29tcHV0ZUFTYW5TdGFja0ZyYW1lTGF5b3V0Lgorc3RydWN0IEFTYW5TdGFja1ZhcmlhYmxlRGVzY3JpcHRpb24geworICBjb25zdCBjaGFyICpOYW1lOyAgICAvLyBOYW1lIG9mIHRoZSB2YXJpYWJsZSB0aGF0IHdpbGwgYmUgZGlzcGxheWVkIGJ5IGFzYW4KKyAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgYSBzdGFjay1yZWxhdGVkIGJ1ZyBpcyByZXBvcnRlZC4KKyAgdWludDY0X3QgU2l6ZTsgICAgICAgLy8gU2l6ZSBvZiB0aGUgdmFyaWFibGUgaW4gYnl0ZXMuCisgIHNpemVfdCBMaWZldGltZVNpemU7IC8vIFNpemUgaW4gYnl0ZXMgdG8gdXNlIGZvciBsaWZldGltZSBhbmFseXNpcyBjaGVjay4KKyAgICAgICAgICAgICAgICAgICAgICAgLy8gV2lsbCBiZSByb3VuZGVkIHVwIHRvIEdyYW51bGFyaXR5LgorICBzaXplX3QgQWxpZ25tZW50OyAgICAvLyBBbGlnbm1lbnQgb2YgdGhlIHZhcmlhYmxlIChwb3dlciBvZiAyKS4KKyAgQWxsb2NhSW5zdCAqQUk7ICAgICAgLy8gVGhlIGFjdHVhbCBBbGxvY2FJbnN0LgorICBzaXplX3QgT2Zmc2V0OyAgICAgICAvLyBPZmZzZXQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBmcmFtZTsKKyAgICAgICAgICAgICAgICAgICAgICAgLy8gc2V0IGJ5IENvbXB1dGVBU2FuU3RhY2tGcmFtZUxheW91dC4KKyAgdW5zaWduZWQgTGluZTsgICAgICAgLy8gTGluZSBudW1iZXIuCit9OworCisvLyBPdXRwdXQgZGF0YSBzdHJ1Y3QgZm9yIENvbXB1dGVBU2FuU3RhY2tGcmFtZUxheW91dC4KK3N0cnVjdCBBU2FuU3RhY2tGcmFtZUxheW91dCB7CisgIHNpemVfdCBHcmFudWxhcml0eTsgICAgIC8vIFNoYWRvdyBncmFudWxhcml0eS4KKyAgc2l6ZV90IEZyYW1lQWxpZ25tZW50OyAgLy8gQWxpZ25tZW50IGZvciB0aGUgZW50aXJlIGZyYW1lLgorICBzaXplX3QgRnJhbWVTaXplOyAgICAgICAvLyBTaXplIG9mIHRoZSBmcmFtZSBpbiBieXRlcy4KK307CisKK0FTYW5TdGFja0ZyYW1lTGF5b3V0IENvbXB1dGVBU2FuU3RhY2tGcmFtZUxheW91dCgKKyAgICAvLyBUaGUgYXJyYXkgb2Ygc3RhY2sgdmFyaWFibGVzLiBUaGUgZWxlbWVudHMgbWF5IGdldCByZW9yZGVyZWQgYW5kIGNoYW5nZWQuCisgICAgU21hbGxWZWN0b3JJbXBsPEFTYW5TdGFja1ZhcmlhYmxlRGVzY3JpcHRpb24+ICZWYXJzLAorICAgIC8vIEFkZHJlc3NTYW5pdGl6ZXIncyBzaGFkb3cgZ3JhbnVsYXJpdHkuIFVzdWFsbHkgOCwgbWF5IGFsc28gYmUgMTYsIDMyLCA2NC4KKyAgICBzaXplX3QgR3JhbnVsYXJpdHksCisgICAgLy8gVGhlIG1pbmltYWwgc2l6ZSBvZiB0aGUgbGVmdC1tb3N0IHJlZHpvbmUgKGhlYWRlcikuCisgICAgLy8gQXQgbGVhc3QgNCBwb2ludGVyIHNpemVzLCBwb3dlciBvZiAyLCBhbmQgPj0gR3JhbnVsYXJpdHkuCisgICAgLy8gVGhlIHJlc3VsdGluZyBGcmFtZVNpemUgc2hvdWxkIGJlIG11bHRpcGxlIG9mIE1pbkhlYWRlclNpemUuCisgICAgc2l6ZV90IE1pbkhlYWRlclNpemUpOworCisvLyBDb21wdXRlIGZyYW1lIGRlc2NyaXB0aW9uLCBzZWUgRGVzY3JpYmVBZGRyZXNzSWZTdGFjayBpbiBBU2FuIHJ1bnRpbWUuCitTbWFsbFN0cmluZzw2ND4gQ29tcHV0ZUFTYW5TdGFja0ZyYW1lRGVzY3JpcHRpb24oCisgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPEFTYW5TdGFja1ZhcmlhYmxlRGVzY3JpcHRpb24+ICZWYXJzKTsKKworLy8gUmV0dXJucyBzaGFkb3cgYnl0ZXMgd2l0aCBtYXJrZWQgcmVkIHpvbmVzLiBUaGlzIHNoYWRvdyByZXByZXNlbnRzIHRoZSBzdGF0ZQorLy8gaWYgdGhlIHN0YWNrIGZyYW1lIHdoZW4gYWxsIGxvY2FsIHZhcmlhYmxlcyBhcmUgaW5zaWRlIG9mIHRoZSBvd24gc2NvcGUuCitTbWFsbFZlY3Rvcjx1aW50OF90LCA2ND4KK0dldFNoYWRvd0J5dGVzKGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxBU2FuU3RhY2tWYXJpYWJsZURlc2NyaXB0aW9uPiAmVmFycywKKyAgICAgICAgICAgICAgIGNvbnN0IEFTYW5TdGFja0ZyYW1lTGF5b3V0ICZMYXlvdXQpOworCisvLyBSZXR1cm5zIHNoYWRvdyBieXRlcyB3aXRoIG1hcmtlZCByZWQgem9uZXMgYW5kIGFmdGVyIHNjb3BlLiBUaGlzIHNoYWRvdworLy8gcmVwcmVzZW50cyB0aGUgc3RhdGUgaWYgdGhlIHN0YWNrIGZyYW1lIHdoZW4gYWxsIGxvY2FsIHZhcmlhYmxlcyBhcmUgb3V0c2lkZQorLy8gb2YgdGhlIG93biBzY29wZS4KK1NtYWxsVmVjdG9yPHVpbnQ4X3QsIDY0PiBHZXRTaGFkb3dCeXRlc0FmdGVyU2NvcGUoCisgICAgLy8gVGhlIGFycmF5IG9mIHN0YWNrIHZhcmlhYmxlcy4gVGhlIGVsZW1lbnRzIG1heSBnZXQgcmVvcmRlcmVkIGFuZCBjaGFuZ2VkLgorICAgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxBU2FuU3RhY2tWYXJpYWJsZURlc2NyaXB0aW9uPiAmVmFycywKKyAgICBjb25zdCBBU2FuU3RhY2tGcmFtZUxheW91dCAmTGF5b3V0KTsKKworfSAvLyBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYgIC8vIExMVk1fVFJBTlNGT1JNU19VVElMU19BU0FOU1RBQ0tGUkFNRUxBWU9VVF9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQWRkRGlzY3JpbWluYXRvcnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9BZGREaXNjcmltaW5hdG9ycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkYWQwNmUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQWRkRGlzY3JpbWluYXRvcnMuaApAQCAtMCwwICsxLDMyIEBACisvLz09PS0gQWRkRGlzY3JpbWluYXRvcnMuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBhZGRzIERXQVJGIGRpc2NyaW1pbmF0b3JzIHRvIHRoZSBJUi4gUGF0aCBkaXNjcmltaW5hdG9ycyBhcmUgdXNlZAorLy8gdG8gZGVjaWRlIHdoYXQgQ0ZHIHBhdGggd2FzIHRha2VuIGluc2lkZSBzdWItZ3JhcGhzIHdob3NlIGluc3RydWN0aW9ucyBzaGFyZQorLy8gdGhlIHNhbWUgbGluZSBhbmQgY29sdW1uIG51bWJlciBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19BRERESVNDUklNSU5BVE9SU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19BRERESVNDUklNSU5BVE9SU19ICisKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgRnVuY3Rpb247CisKK2NsYXNzIEFkZERpc2NyaW1pbmF0b3JzUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPEFkZERpc2NyaW1pbmF0b3JzUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0FERERJU0NSSU1JTkFUT1JTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9CYXNpY0Jsb2NrVXRpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9CYXNpY0Jsb2NrVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjBkMmRlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0Jhc2ljQmxvY2tVdGlscy5oCkBAIC0wLDAgKzEsMzE0IEBACisvLz09PS0gVHJhbnNmb3JtL1V0aWxzL0Jhc2ljQmxvY2tVdGlscy5oIC0gQmFzaWNCbG9jayBVdGlscyAtLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmFtaWx5IG9mIGZ1bmN0aW9ucyBwZXJmb3JtIG1hbmlwdWxhdGlvbnMgb24gYmFzaWMgYmxvY2tzLCBhbmQKKy8vIGluc3RydWN0aW9ucyBjb250YWluZWQgd2l0aGluIGJhc2ljIGJsb2Nrcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19CQVNJQ0JMT0NLVVRJTFNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQkFTSUNCTE9DS1VUSUxTX0gKKworLy8gRklYTUU6IE1vdmUgdG8gdGhpcyBmaWxlOiBCYXNpY0Jsb2NrOjpyZW1vdmVQcmVkZWNlc3NvciwgQkI6OnNwbGl0QmFzaWNCbG9jaworCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0lSL0NGRy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW5zdHJUeXBlcy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQmxvY2tGcmVxdWVuY3lJbmZvOworY2xhc3MgQnJhbmNoUHJvYmFiaWxpdHlJbmZvOworY2xhc3MgRGVmZXJyZWREb21pbmFuY2U7CitjbGFzcyBEb21pbmF0b3JUcmVlOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIExvb3BJbmZvOworY2xhc3MgTUROb2RlOworY2xhc3MgTWVtb3J5RGVwZW5kZW5jZVJlc3VsdHM7CitjbGFzcyBSZXR1cm5JbnN0OworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CitjbGFzcyBWYWx1ZTsKKworLy8vIERlbGV0ZSB0aGUgc3BlY2lmaWVkIGJsb2NrLCB3aGljaCBtdXN0IGhhdmUgbm8gcHJlZGVjZXNzb3JzLgordm9pZCBEZWxldGVEZWFkQmxvY2soQmFzaWNCbG9jayAqQkIsIERlZmVycmVkRG9taW5hbmNlICpERFQgPSBudWxscHRyKTsKKworLy8vIFdlIGtub3cgdGhhdCBCQiBoYXMgb25lIHByZWRlY2Vzc29yLiBJZiB0aGVyZSBhcmUgYW55IHNpbmdsZS1lbnRyeSBQSEkgbm9kZXMKKy8vLyBpbiBpdCwgZm9sZCB0aGVtIGF3YXkuIFRoaXMgaGFuZGxlcyB0aGUgY2FzZSB3aGVuIGFsbCBlbnRyaWVzIHRvIHRoZSBQSEkKKy8vLyBub2RlcyBpbiBhIGJsb2NrIGFyZSBndWFyYW50ZWVkIGVxdWFsLCBzdWNoIGFzIHdoZW4gdGhlIGJsb2NrIGhhcyBleGFjdGx5CisvLy8gb25lIHByZWRlY2Vzc29yLgordm9pZCBGb2xkU2luZ2xlRW50cnlQSElOb2RlcyhCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVtb3J5RGVwZW5kZW5jZVJlc3VsdHMgKk1lbURlcCA9IG51bGxwdHIpOworCisvLy8gRXhhbWluZSBlYWNoIFBISSBpbiB0aGUgZ2l2ZW4gYmxvY2sgYW5kIGRlbGV0ZSBpdCBpZiBpdCBpcyBkZWFkLiBBbHNvCisvLy8gcmVjdXJzaXZlbHkgZGVsZXRlIGFueSBvcGVyYW5kcyB0aGF0IGJlY29tZSBkZWFkIGFzIGEgcmVzdWx0LiBUaGlzIGluY2x1ZGVzCisvLy8gdHJhY2luZyB0aGUgZGVmLXVzZSBsaXN0IGZyb20gdGhlIFBISSB0byBzZWUgaWYgaXQgaXMgdWx0aW1hdGVseSB1bnVzZWQgb3IKKy8vLyBpZiBpdCByZWFjaGVzIGFuIHVudXNlZCBjeWNsZS4gUmV0dXJuIHRydWUgaWYgYW55IFBISXMgd2VyZSBkZWxldGVkLgorYm9vbCBEZWxldGVEZWFkUEhJcyhCYXNpY0Jsb2NrICpCQiwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSA9IG51bGxwdHIpOworCisvLy8gQXR0ZW1wdHMgdG8gbWVyZ2UgYSBibG9jayBpbnRvIGl0cyBwcmVkZWNlc3NvciwgaWYgcG9zc2libGUuIFRoZSByZXR1cm4KKy8vLyB2YWx1ZSBpbmRpY2F0ZXMgc3VjY2VzcyBvciBmYWlsdXJlLgorYm9vbCBNZXJnZUJsb2NrSW50b1ByZWRlY2Vzc29yKEJhc2ljQmxvY2sgKkJCLCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcEluZm8gKkxJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1vcnlEZXBlbmRlbmNlUmVzdWx0cyAqTWVtRGVwID0gbnVsbHB0cik7CisKKy8vLyBSZXBsYWNlIGFsbCB1c2VzIG9mIGFuIGluc3RydWN0aW9uIChzcGVjaWZpZWQgYnkgQkkpIHdpdGggYSB2YWx1ZSwgdGhlbgorLy8vIHJlbW92ZSBhbmQgZGVsZXRlIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbi4KK3ZvaWQgUmVwbGFjZUluc3RXaXRoVmFsdWUoQmFzaWNCbG9jazo6SW5zdExpc3RUeXBlICZCSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2s6Oml0ZXJhdG9yICZCSSwgVmFsdWUgKlYpOworCisvLy8gUmVwbGFjZSB0aGUgaW5zdHJ1Y3Rpb24gc3BlY2lmaWVkIGJ5IEJJIHdpdGggdGhlIGluc3RydWN0aW9uIHNwZWNpZmllZCBieSBJLgorLy8vIENvcGllcyBEZWJ1Z0xvYyBmcm9tIEJJIHRvIEksIGlmIEkgZG9lc24ndCBhbHJlYWR5IGhhdmUgYSBEZWJ1Z0xvYy4gVGhlCisvLy8gb3JpZ2luYWwgaW5zdHJ1Y3Rpb24gaXMgZGVsZXRlZCBhbmQgQkkgaXMgdXBkYXRlZCB0byBwb2ludCB0byB0aGUgbmV3CisvLy8gaW5zdHJ1Y3Rpb24uCit2b2lkIFJlcGxhY2VJbnN0V2l0aEluc3QoQmFzaWNCbG9jazo6SW5zdExpc3RUeXBlICZCSUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jazo6aXRlcmF0b3IgJkJJLCBJbnN0cnVjdGlvbiAqSSk7CisKKy8vLyBSZXBsYWNlIHRoZSBpbnN0cnVjdGlvbiBzcGVjaWZpZWQgYnkgRnJvbSB3aXRoIHRoZSBpbnN0cnVjdGlvbiBzcGVjaWZpZWQgYnkKKy8vLyBUby4gQ29waWVzIERlYnVnTG9jIGZyb20gQkkgdG8gSSwgaWYgSSBkb2Vzbid0IGFscmVhZHkgaGF2ZSBhIERlYnVnTG9jLgordm9pZCBSZXBsYWNlSW5zdFdpdGhJbnN0KEluc3RydWN0aW9uICpGcm9tLCBJbnN0cnVjdGlvbiAqVG8pOworCisvLy8gT3B0aW9uIGNsYXNzIGZvciBjcml0aWNhbCBlZGdlIHNwbGl0dGluZy4KKy8vLworLy8vIFRoaXMgcHJvdmlkZXMgYSBidWlsZGVyIGludGVyZmFjZSBmb3Igb3ZlcnJpZGluZyB0aGUgZGVmYXVsdCBvcHRpb25zIHVzZWQKKy8vLyBkdXJpbmcgY3JpdGljYWwgZWRnZSBzcGxpdHRpbmcuCitzdHJ1Y3QgQ3JpdGljYWxFZGdlU3BsaXR0aW5nT3B0aW9ucyB7CisgIERvbWluYXRvclRyZWUgKkRUOworICBMb29wSW5mbyAqTEk7CisgIGJvb2wgTWVyZ2VJZGVudGljYWxFZGdlcyA9IGZhbHNlOworICBib29sIERvbnREZWxldGVVc2VsZXNzUEhJcyA9IGZhbHNlOworICBib29sIFByZXNlcnZlTENTU0EgPSBmYWxzZTsKKworICBDcml0aWNhbEVkZ2VTcGxpdHRpbmdPcHRpb25zKERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wSW5mbyAqTEkgPSBudWxscHRyKQorICAgICAgOiBEVChEVCksIExJKExJKSB7fQorCisgIENyaXRpY2FsRWRnZVNwbGl0dGluZ09wdGlvbnMgJnNldE1lcmdlSWRlbnRpY2FsRWRnZXMoKSB7CisgICAgTWVyZ2VJZGVudGljYWxFZGdlcyA9IHRydWU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQ3JpdGljYWxFZGdlU3BsaXR0aW5nT3B0aW9ucyAmc2V0RG9udERlbGV0ZVVzZWxlc3NQSElzKCkgeworICAgIERvbnREZWxldGVVc2VsZXNzUEhJcyA9IHRydWU7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgQ3JpdGljYWxFZGdlU3BsaXR0aW5nT3B0aW9ucyAmc2V0UHJlc2VydmVMQ1NTQSgpIHsKKyAgICBQcmVzZXJ2ZUxDU1NBID0gdHJ1ZTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KK307CisKKy8vLyBJZiB0aGlzIGVkZ2UgaXMgYSBjcml0aWNhbCBlZGdlLCBpbnNlcnQgYSBuZXcgbm9kZSB0byBzcGxpdCB0aGUgY3JpdGljYWwKKy8vLyBlZGdlLiBUaGlzIHdpbGwgdXBkYXRlIHRoZSBhbmFseXNlcyBwYXNzZWQgaW4gdGhyb3VnaCB0aGUgb3B0aW9uIHN0cnVjdC4KKy8vLyBUaGlzIHJldHVybnMgdGhlIG5ldyBibG9jayBpZiB0aGUgZWRnZSB3YXMgc3BsaXQsIG51bGwgb3RoZXJ3aXNlLgorLy8vCisvLy8gSWYgTWVyZ2VJZGVudGljYWxFZGdlcyBpbiB0aGUgb3B0aW9ucyBzdHJ1Y3QgaXMgdHJ1ZSAobm90IHRoZSBkZWZhdWx0KSwKKy8vLyAqYWxsKiBlZGdlcyBmcm9tIFRJIHRvIHRoZSBzcGVjaWZpZWQgc3VjY2Vzc29yIHdpbGwgYmUgbWVyZ2VkIGludG8gdGhlIHNhbWUKKy8vLyBjcml0aWNhbCBlZGdlIGJsb2NrLiBUaGlzIGlzIG1vc3QgY29tbW9ubHkgaW50ZXJlc3Rpbmcgd2l0aCBzd2l0Y2gKKy8vLyBpbnN0cnVjdGlvbnMsIHdoaWNoIG1heSBoYXZlIG1hbnkgZWRnZXMgdG8gYW55IG9uZSBkZXN0aW5hdGlvbi4gIFRoaXMKKy8vLyBlbnN1cmVzIHRoYXQgYWxsIGVkZ2VzIHRvIHRoYXQgZGVzdCBnbyB0byBvbmUgYmxvY2sgaW5zdGVhZCBvZiBlYWNoIGdvaW5nCisvLy8gdG8gYSBkaWZmZXJlbnQgYmxvY2ssIGJ1dCBpc24ndCB0aGUgc3RhbmRhcmQgZGVmaW5pdGlvbiBvZiBhICJjcml0aWNhbAorLy8vIGVkZ2UiLgorLy8vCisvLy8gSXQgaXMgaW52YWxpZCB0byBjYWxsIHRoaXMgZnVuY3Rpb24gb24gYSBjcml0aWNhbCBlZGdlIHRoYXQgc3RhcnRzIGF0IGFuCisvLy8gSW5kaXJlY3RCckluc3QuICBTcGxpdHRpbmcgdGhlc2UgZWRnZXMgd2lsbCBhbG1vc3QgYWx3YXlzIGNyZWF0ZSBhbiBpbnZhbGlkCisvLy8gcHJvZ3JhbSBiZWNhdXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBuZXcgYmxvY2sgd29uJ3QgYmUgdGhlIG9uZSB0aGF0IGlzIGp1bXBlZAorLy8vIHRvLgorQmFzaWNCbG9jayAqU3BsaXRDcml0aWNhbEVkZ2UoVGVybWluYXRvckluc3QgKlRJLCB1bnNpZ25lZCBTdWNjTnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3JpdGljYWxFZGdlU3BsaXR0aW5nT3B0aW9ucyAmT3B0aW9ucyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JpdGljYWxFZGdlU3BsaXR0aW5nT3B0aW9ucygpKTsKKworaW5saW5lIEJhc2ljQmxvY2sgKgorU3BsaXRDcml0aWNhbEVkZ2UoQmFzaWNCbG9jayAqQkIsIHN1Y2NfaXRlcmF0b3IgU0ksCisgICAgICAgICAgICAgICAgICBjb25zdCBDcml0aWNhbEVkZ2VTcGxpdHRpbmdPcHRpb25zICZPcHRpb25zID0KKyAgICAgICAgICAgICAgICAgICAgICBDcml0aWNhbEVkZ2VTcGxpdHRpbmdPcHRpb25zKCkpIHsKKyAgcmV0dXJuIFNwbGl0Q3JpdGljYWxFZGdlKEJCLT5nZXRUZXJtaW5hdG9yKCksIFNJLmdldFN1Y2Nlc3NvckluZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25zKTsKK30KKworLy8vIElmIHRoZSBlZGdlIGZyb20gKlBJIHRvIEJCIGlzIG5vdCBjcml0aWNhbCwgcmV0dXJuIGZhbHNlLiBPdGhlcndpc2UsIHNwbGl0CisvLy8gYWxsIGVkZ2VzIGJldHdlZW4gdGhlIHR3byBibG9ja3MgYW5kIHJldHVybiB0cnVlLiBUaGlzIHVwZGF0ZXMgYWxsIG9mIHRoZQorLy8vIHNhbWUgYW5hbHlzZXMgYXMgdGhlIG90aGVyIFNwbGl0Q3JpdGljYWxFZGdlIGZ1bmN0aW9uLiBJZiBQIGlzIHNwZWNpZmllZCwgaXQKKy8vLyB1cGRhdGVzIHRoZSBhbmFseXNlcyBkZXNjcmliZWQgYWJvdmUuCitpbmxpbmUgYm9vbCBTcGxpdENyaXRpY2FsRWRnZShCYXNpY0Jsb2NrICpTdWNjLCBwcmVkX2l0ZXJhdG9yIFBJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ3JpdGljYWxFZGdlU3BsaXR0aW5nT3B0aW9ucyAmT3B0aW9ucyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ3JpdGljYWxFZGdlU3BsaXR0aW5nT3B0aW9ucygpKSB7CisgIGJvb2wgTWFkZUNoYW5nZSA9IGZhbHNlOworICBUZXJtaW5hdG9ySW5zdCAqVEkgPSAoKlBJKS0+Z2V0VGVybWluYXRvcigpOworICBmb3IgKHVuc2lnbmVkIGkgPSAwLCBlID0gVEktPmdldE51bVN1Y2Nlc3NvcnMoKTsgaSAhPSBlOyArK2kpCisgICAgaWYgKFRJLT5nZXRTdWNjZXNzb3IoaSkgPT0gU3VjYykKKyAgICAgIE1hZGVDaGFuZ2UgfD0gISFTcGxpdENyaXRpY2FsRWRnZShUSSwgaSwgT3B0aW9ucyk7CisgIHJldHVybiBNYWRlQ2hhbmdlOworfQorCisvLy8gSWYgYW4gZWRnZSBmcm9tIFNyYyB0byBEc3QgaXMgY3JpdGljYWwsIHNwbGl0IHRoZSBlZGdlIGFuZCByZXR1cm4gdHJ1ZSwKKy8vLyBvdGhlcndpc2UgcmV0dXJuIGZhbHNlLiBUaGlzIG1ldGhvZCByZXF1aXJlcyB0aGF0IHRoZXJlIGJlIGFuIGVkZ2UgYmV0d2VlbgorLy8vIHRoZSB0d28gYmxvY2tzLiBJdCB1cGRhdGVzIHRoZSBhbmFseXNlcyBwYXNzZWQgaW4gdGhlIG9wdGlvbnMgc3RydWN0CitpbmxpbmUgQmFzaWNCbG9jayAqCitTcGxpdENyaXRpY2FsRWRnZShCYXNpY0Jsb2NrICpTcmMsIEJhc2ljQmxvY2sgKkRzdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IENyaXRpY2FsRWRnZVNwbGl0dGluZ09wdGlvbnMgJk9wdGlvbnMgPQorICAgICAgICAgICAgICAgICAgICAgIENyaXRpY2FsRWRnZVNwbGl0dGluZ09wdGlvbnMoKSkgeworICBUZXJtaW5hdG9ySW5zdCAqVEkgPSBTcmMtPmdldFRlcm1pbmF0b3IoKTsKKyAgdW5zaWduZWQgaSA9IDA7CisgIHdoaWxlICh0cnVlKSB7CisgICAgYXNzZXJ0KGkgIT0gVEktPmdldE51bVN1Y2Nlc3NvcnMoKSAmJiAiRWRnZSBkb2Vzbid0IGV4aXN0ISIpOworICAgIGlmIChUSS0+Z2V0U3VjY2Vzc29yKGkpID09IERzdCkKKyAgICAgIHJldHVybiBTcGxpdENyaXRpY2FsRWRnZShUSSwgaSwgT3B0aW9ucyk7CisgICAgKytpOworICB9Cit9CisKKy8vLyBMb29wIG92ZXIgYWxsIG9mIHRoZSBlZGdlcyBpbiB0aGUgQ0ZHLCBicmVha2luZyBjcml0aWNhbCBlZGdlcyBhcyB0aGV5IGFyZQorLy8vIGZvdW5kLiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnJva2VuIGVkZ2VzLgordW5zaWduZWQgU3BsaXRBbGxDcml0aWNhbEVkZ2VzKEZ1bmN0aW9uICZGLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENyaXRpY2FsRWRnZVNwbGl0dGluZ09wdGlvbnMgJk9wdGlvbnMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDcml0aWNhbEVkZ2VTcGxpdHRpbmdPcHRpb25zKCkpOworCisvLy8gU3BsaXQgdGhlIGVkZ2UgY29ubmVjdGluZyBzcGVjaWZpZWQgYmxvY2suCitCYXNpY0Jsb2NrICpTcGxpdEVkZ2UoQmFzaWNCbG9jayAqRnJvbSwgQmFzaWNCbG9jayAqVG8sCisgICAgICAgICAgICAgICAgICAgICAgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyLCBMb29wSW5mbyAqTEkgPSBudWxscHRyKTsKKworLy8vIFNwbGl0IHRoZSBzcGVjaWZpZWQgYmxvY2sgYXQgdGhlIHNwZWNpZmllZCBpbnN0cnVjdGlvbiAtIGV2ZXJ5dGhpbmcgYmVmb3JlCisvLy8gU3BsaXRQdCBzdGF5cyBpbiBPbGQgYW5kIGV2ZXJ5dGhpbmcgc3RhcnRpbmcgd2l0aCBTcGxpdFB0IG1vdmVzIHRvIGEgbmV3CisvLy8gYmxvY2suIFRoZSB0d28gYmxvY2tzIGFyZSBqb2luZWQgYnkgYW4gdW5jb25kaXRpb25hbCBicmFuY2ggYW5kIHRoZSBsb29wCisvLy8gaW5mbyBpcyB1cGRhdGVkLgorQmFzaWNCbG9jayAqU3BsaXRCbG9jayhCYXNpY0Jsb2NrICpPbGQsIEluc3RydWN0aW9uICpTcGxpdFB0LAorICAgICAgICAgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIsIExvb3BJbmZvICpMSSA9IG51bGxwdHIpOworCisvLy8gVGhpcyBtZXRob2QgaW50cm9kdWNlcyBhdCBsZWFzdCBvbmUgbmV3IGJhc2ljIGJsb2NrIGludG8gdGhlIGZ1bmN0aW9uIGFuZAorLy8vIG1vdmVzIHNvbWUgb2YgdGhlIHByZWRlY2Vzc29ycyBvZiBCQiB0byBiZSBwcmVkZWNlc3NvcnMgb2YgdGhlIG5ldyBibG9jay4KKy8vLyBUaGUgbmV3IHByZWRlY2Vzc29ycyBhcmUgaW5kaWNhdGVkIGJ5IHRoZSBQcmVkcyBhcnJheS4gVGhlIG5ldyBibG9jayBpcworLy8vIGdpdmVuIGEgc3VmZml4IG9mICdTdWZmaXgnLiBSZXR1cm5zIG5ldyBiYXNpYyBibG9jayB0byB3aGljaCBwcmVkZWNlc3NvcnMKKy8vLyBmcm9tIFByZWRzIGFyZSBub3cgcG9pbnRpbmcuCisvLy8KKy8vLyBJZiBCQiBpcyBhIGxhbmRpbmdwYWQgYmxvY2sgdGhlbiBhZGRpdGlvbmFsIGJhc2ljYmxvY2sgbWlnaHQgYmUgaW50cm9kdWNlZC4KKy8vLyBJdCB3aWxsIGhhdmUgU3VmZml4KyIuc3BsaXRfbHAiLiBTZWUgU3BsaXRMYW5kaW5nUGFkUHJlZGVjZXNzb3JzIGZvciBtb3JlCisvLy8gZGV0YWlscyBvbiB0aGlzIGNhc2UuCisvLy8KKy8vLyBUaGlzIGN1cnJlbnRseSB1cGRhdGVzIHRoZSBMTFZNIElSLCBEb21pbmF0b3JUcmVlLCBMb29wSW5mbywgYW5kIExDQ1NBIGJ1dAorLy8vIG5vIG90aGVyIGFuYWx5c2VzLiBJbiBwYXJ0aWN1bGFyLCBpdCBkb2VzIG5vdCBwcmVzZXJ2ZSBMb29wU2ltcGxpZnkKKy8vLyAoYmVjYXVzZSBpdCdzIGNvbXBsaWNhdGVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBvbmUgb2YgdGhlIGVkZ2VzIGJlaW5nCisvLy8gc3BsaXQgaXMgYW4gZXhpdCBvZiBhIGxvb3Agd2l0aCBvdGhlciBleGl0cykuCitCYXNpY0Jsb2NrICpTcGxpdEJsb2NrUHJlZGVjZXNzb3JzKEJhc2ljQmxvY2sgKkJCLCBBcnJheVJlZjxCYXNpY0Jsb2NrICo+IFByZWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpTdWZmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcEluZm8gKkxJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQcmVzZXJ2ZUxDU1NBID0gZmFsc2UpOworCisvLy8gVGhpcyBtZXRob2QgdHJhbnNmb3JtcyB0aGUgbGFuZGluZyBwYWQsIE9yaWdCQiwgYnkgaW50cm9kdWNpbmcgdHdvIG5ldyBiYXNpYworLy8vIGJsb2NrcyBpbnRvIHRoZSBmdW5jdGlvbi4gT25lIG9mIHRob3NlIG5ldyBiYXNpYyBibG9ja3MgZ2V0cyB0aGUKKy8vLyBwcmVkZWNlc3NvcnMgbGlzdGVkIGluIFByZWRzLiBUaGUgb3RoZXIgYmFzaWMgYmxvY2sgZ2V0cyB0aGUgcmVtYWluaW5nCisvLy8gcHJlZGVjZXNzb3JzIG9mIE9yaWdCQi4gVGhlIGxhbmRpbmdwYWQgaW5zdHJ1Y3Rpb24gT3JpZ0JCIGlzIGNsb25lIGludG8gYm90aAorLy8vIG9mIHRoZSBuZXcgYmFzaWMgYmxvY2tzLiBUaGUgbmV3IGJsb2NrcyBhcmUgZ2l2ZW4gdGhlIHN1ZmZpeGVzICdTdWZmaXgxJyBhbmQKKy8vLyAnU3VmZml4MicsIGFuZCBhcmUgcmV0dXJuZWQgaW4gdGhlIE5ld0JCcyB2ZWN0b3IuCisvLy8KKy8vLyBUaGlzIGN1cnJlbnRseSB1cGRhdGVzIHRoZSBMTFZNIElSLCBEb21pbmF0b3JUcmVlLCBMb29wSW5mbywgYW5kIExDQ1NBIGJ1dAorLy8vIG5vIG90aGVyIGFuYWx5c2VzLiBJbiBwYXJ0aWN1bGFyLCBpdCBkb2VzIG5vdCBwcmVzZXJ2ZSBMb29wU2ltcGxpZnkKKy8vLyAoYmVjYXVzZSBpdCdzIGNvbXBsaWNhdGVkIHRvIGhhbmRsZSB0aGUgY2FzZSB3aGVyZSBvbmUgb2YgdGhlIGVkZ2VzIGJlaW5nCisvLy8gc3BsaXQgaXMgYW4gZXhpdCBvZiBhIGxvb3Agd2l0aCBvdGhlciBleGl0cykuCit2b2lkIFNwbGl0TGFuZGluZ1BhZFByZWRlY2Vzc29ycyhCYXNpY0Jsb2NrICpPcmlnQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxCYXNpY0Jsb2NrICo+IFByZWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqU3VmZml4LCBjb25zdCBjaGFyICpTdWZmaXgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEJhc2ljQmxvY2sgKj4gJk5ld0JCcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BJbmZvICpMSSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFByZXNlcnZlTENTU0EgPSBmYWxzZSk7CisKKy8vLyBUaGlzIG1ldGhvZCBkdXBsaWNhdGVzIHRoZSBzcGVjaWZpZWQgcmV0dXJuIGluc3RydWN0aW9uIGludG8gYSBwcmVkZWNlc3NvcgorLy8vIHdoaWNoIGVuZHMgaW4gYW4gdW5jb25kaXRpb25hbCBicmFuY2guIElmIHRoZSByZXR1cm4gaW5zdHJ1Y3Rpb24gcmV0dXJucyBhCisvLy8gdmFsdWUgZGVmaW5lZCBieSBhIFBISSwgcHJvcGFnYXRlIHRoZSByaWdodCB2YWx1ZSBpbnRvIHRoZSByZXR1cm4uIEl0CisvLy8gcmV0dXJucyB0aGUgbmV3IHJldHVybiBpbnN0cnVjdGlvbiBpbiB0aGUgcHJlZGVjZXNzb3IuCitSZXR1cm5JbnN0ICpGb2xkUmV0dXJuSW50b1VuY29uZEJyYW5jaChSZXR1cm5JbnN0ICpSSSwgQmFzaWNCbG9jayAqQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpQcmVkKTsKKworLy8vIFNwbGl0IHRoZSBjb250YWluaW5nIGJsb2NrIGF0IHRoZSBzcGVjaWZpZWQgaW5zdHJ1Y3Rpb24gLSBldmVyeXRoaW5nIGJlZm9yZQorLy8vIFNwbGl0QmVmb3JlIHN0YXlzIGluIHRoZSBvbGQgYmFzaWMgYmxvY2ssIGFuZCB0aGUgcmVzdCBvZiB0aGUgaW5zdHJ1Y3Rpb25zCisvLy8gaW4gdGhlIEJCIGFyZSBtb3ZlZCB0byBhIG5ldyBibG9jay4gVGhlIHR3byBibG9ja3MgYXJlIGNvbm5lY3RlZCBieSBhCisvLy8gY29uZGl0aW9uYWwgYnJhbmNoICh3aXRoIHZhbHVlIG9mIENtcCBiZWluZyB0aGUgY29uZGl0aW9uKS4KKy8vLyBCZWZvcmU6CisvLy8gICBIZWFkCisvLy8gICBTcGxpdEJlZm9yZQorLy8vICAgVGFpbAorLy8vIEFmdGVyOgorLy8vICAgSGVhZAorLy8vICAgaWYgKENvbmQpCisvLy8gICAgIFRoZW5CbG9jaworLy8vICAgU3BsaXRCZWZvcmUKKy8vLyAgIFRhaWwKKy8vLworLy8vIElmIFVucmVhY2hhYmxlIGlzIHRydWUsIHRoZW4gVGhlbkJsb2NrIGVuZHMgd2l0aAorLy8vIFVucmVhY2hhYmxlSW5zdCwgb3RoZXJ3aXNlIGl0IGJyYW5jaGVzIHRvIFRhaWwuCisvLy8gUmV0dXJucyB0aGUgTmV3QmFzaWNCbG9jaydzIHRlcm1pbmF0b3IuCisvLy8KKy8vLyBVcGRhdGVzIERUIGFuZCBMSSBpZiBnaXZlbi4KK1Rlcm1pbmF0b3JJbnN0ICpTcGxpdEJsb2NrQW5kSW5zZXJ0SWZUaGVuKFZhbHVlICpDb25kLCBJbnN0cnVjdGlvbiAqU3BsaXRCZWZvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFVucmVhY2hhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTUROb2RlICpCcmFuY2hXZWlnaHRzID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3BJbmZvICpMSSA9IG51bGxwdHIpOworCisvLy8gU3BsaXRCbG9ja0FuZEluc2VydElmVGhlbkVsc2UgaXMgc2ltaWxhciB0byBTcGxpdEJsb2NrQW5kSW5zZXJ0SWZUaGVuLAorLy8vIGJ1dCBhbHNvIGNyZWF0ZXMgdGhlIEVsc2VCbG9jay4KKy8vLyBCZWZvcmU6CisvLy8gICBIZWFkCisvLy8gICBTcGxpdEJlZm9yZQorLy8vICAgVGFpbAorLy8vIEFmdGVyOgorLy8vICAgSGVhZAorLy8vICAgaWYgKENvbmQpCisvLy8gICAgIFRoZW5CbG9jaworLy8vICAgZWxzZQorLy8vICAgICBFbHNlQmxvY2sKKy8vLyAgIFNwbGl0QmVmb3JlCisvLy8gICBUYWlsCit2b2lkIFNwbGl0QmxvY2tBbmRJbnNlcnRJZlRoZW5FbHNlKFZhbHVlICpDb25kLCBJbnN0cnVjdGlvbiAqU3BsaXRCZWZvcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlcm1pbmF0b3JJbnN0ICoqVGhlblRlcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlcm1pbmF0b3JJbnN0ICoqRWxzZVRlcm0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqQnJhbmNoV2VpZ2h0cyA9IG51bGxwdHIpOworCisvLy8gQ2hlY2sgd2hldGhlciBCQiBpcyB0aGUgbWVyZ2UgcG9pbnQgb2YgYSBpZi1yZWdpb24uCisvLy8gSWYgc28sIHJldHVybiB0aGUgYm9vbGVhbiBjb25kaXRpb24gdGhhdCBkZXRlcm1pbmVzIHdoaWNoIGVudHJ5IGludG8KKy8vLyBCQiB3aWxsIGJlIHRha2VuLiAgQWxzbywgcmV0dXJuIGJ5IHJlZmVyZW5jZXMgdGhlIGJsb2NrIHRoYXQgd2lsbCBiZQorLy8vIGVudGVyZWQgZnJvbSBpZiB0aGUgY29uZGl0aW9uIGlzIHRydWUsIGFuZCB0aGUgYmxvY2sgdGhhdCB3aWxsIGJlCisvLy8gZW50ZXJlZCBpZiB0aGUgY29uZGl0aW9uIGlzIGZhbHNlLgorLy8vCisvLy8gVGhpcyBkb2VzIG5vIGNoZWNraW5nIHRvIHNlZSBpZiB0aGUgdHJ1ZS9mYWxzZSBibG9ja3MgaGF2ZSBsYXJnZSBvciB1bnNhdm9yeQorLy8vIGluc3RydWN0aW9ucyBpbiB0aGVtLgorVmFsdWUgKkdldElmQ29uZGl0aW9uKEJhc2ljQmxvY2sgKkJCLCBCYXNpY0Jsb2NrIComSWZUcnVlLAorICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKiZJZkZhbHNlKTsKKworLy8gU3BsaXQgY3JpdGljYWwgZWRnZXMgd2hlcmUgdGhlIHNvdXJjZSBvZiB0aGUgZWRnZSBpcyBhbiBpbmRpcmVjdGJyCisvLyBpbnN0cnVjdGlvbi4gVGhpcyBpc24ndCBhbHdheXMgcG9zc2libGUsIGJ1dCB3ZSBjYW4gaGFuZGxlIHNvbWUgZWFzeSBjYXNlcy4KKy8vIFRoaXMgaXMgdXNlZnVsIGJlY2F1c2UgTUkgaXMgdW5hYmxlIHRvIHNwbGl0IHN1Y2ggY3JpdGljYWwgZWRnZXMsCisvLyB3aGljaCBtZWFucyBpdCB3aWxsIG5vdCBiZSBhYmxlIHRvIHNpbmsgaW5zdHJ1Y3Rpb25zIGFsb25nIHRob3NlIGVkZ2VzLgorLy8gVGhpcyBpcyBlc3BlY2lhbGx5IHBhaW5mdWwgZm9yIGluZGlyZWN0IGJyYW5jaGVzIHdpdGggbWFueSBzdWNjZXNzb3JzLCB3aGVyZQorLy8gd2UgZW5kIHVwIGhhdmluZyB0byBwcmVwYXJlIGFsbCBvdXRnb2luZyB2YWx1ZXMgaW4gdGhlIG9yaWdpbiBibG9jay4KKy8vCisvLyBPdXIgbm9ybWFsIGFsZ29yaXRobSBmb3Igc3BsaXR0aW5nIGNyaXRpY2FsIGVkZ2VzIHJlcXVpcmVzIHVzIHRvIHVwZGF0ZQorLy8gdGhlIG91dGdvaW5nIGVkZ2VzIG9mIHRoZSBlZGdlIG9yaWdpbiBibG9jaywgYnV0IGZvciBhbiBpbmRpcmVjdGJyIHRoaXMKKy8vIGlzIGhhcmQsIHNpbmNlIGl0IHdvdWxkIHJlcXVpcmUgZmluZGluZyBhbmQgdXBkYXRpbmcgdGhlIGJsb2NrIGFkZHJlc3NlcworLy8gdGhlIGluZGlyZWN0IGJyYW5jaCB1c2VzLiBCdXQgaWYgYSBibG9jayBvbmx5IGhhcyBhIHNpbmdsZSBpbmRpcmVjdGJyCisvLyBwcmVkZWNlc3Nvciwgd2l0aCB0aGUgb3RoZXJzIGJlaW5nIHJlZ3VsYXIgYnJhbmNoZXMsIHdlIGNhbiBkbyBpdCBpbiBhCisvLyBkaWZmZXJlbnQgd2F5LgorLy8gU2F5IHdlIGhhdmUgQSAtPiBELCBCIC0+IEQsIEkgLT4gRCB3aGVyZSBvbmx5IEkgLT4gRCBpcyBhbiBpbmRpcmVjdGJyLgorLy8gV2UgY2FuIHNwbGl0IEQgaW50byBEMCBhbmQgRDEsIHdoZXJlIEQwIGNvbnRhaW5zIG9ubHkgdGhlIFBISXMgZnJvbSBELAorLy8gYW5kIEQxIGlzIHRoZSBEIGJsb2NrIGJvZHkuIFdlIGNhbiB0aGVuIGR1cGxpY2F0ZSBEMCBhcyBEMEEgYW5kIEQwQiwgYW5kCisvLyBjcmVhdGUgdGhlIGZvbGxvd2luZyBzdHJ1Y3R1cmU6CisvLyBBIC0+IEQwQSwgQiAtPiBEMEEsIEkgLT4gRDBCLCBEMEEgLT4gRDEsIEQwQiAtPiBEMQorLy8gSWYgQlBJIGFuZCBCRkkgYXJlbid0IG5vbi1udWxsLCBCUEkvQkZJIHdpbGwgYmUgdXBkYXRlZCBhY2NvcmRpbmdseS4KK2Jvb2wgU3BsaXRJbmRpcmVjdEJyQ3JpdGljYWxFZGdlcyhGdW5jdGlvbiAmRiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCcmFuY2hQcm9iYWJpbGl0eUluZm8gKkJQSSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmxvY2tGcmVxdWVuY3lJbmZvICpCRkkgPSBudWxscHRyKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19VVElMU19CQVNJQ0JMT0NLVVRJTFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0JyZWFrQ3JpdGljYWxFZGdlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0JyZWFrQ3JpdGljYWxFZGdlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljYzgxYTEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQnJlYWtDcml0aWNhbEVkZ2VzLmgKQEAgLTAsMCArMSwyOSBAQAorLy89PT0tIEJyZWFrQ3JpdGljYWxFZGdlcy5oIC0gQ3JpdGljYWwgRWRnZSBFbGltaW5hdGlvbiBQYXNzIC0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBCcmVha0NyaXRpY2FsRWRnZXMgcGFzcyAtIEJyZWFrIGFsbCBvZiB0aGUgY3JpdGljYWwgZWRnZXMgaW4gdGhlIENGRyBieQorLy8gaW5zZXJ0aW5nIGEgZHVtbXkgYmFzaWMgYmxvY2suICBUaGlzIHBhc3MgbWF5IGJlICJyZXF1aXJlZCIgYnkgcGFzc2VzIHRoYXQKKy8vIGNhbm5vdCBkZWFsIHdpdGggY3JpdGljYWwgZWRnZXMuICBGb3IgdGhpcyB1c2FnZSwgdGhlIHN0cnVjdHVyZSB0eXBlIGlzCisvLyBmb3J3YXJkIGRlY2xhcmVkLiAgVGhpcyBwYXNzIG9idmlvdXNseSBpbnZhbGlkYXRlcyB0aGUgQ0ZHLCBidXQgY2FuIHVwZGF0ZQorLy8gZG9taW5hdG9yIHRyZWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0JSRUFLQ1JJVElDQUxFREdFU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19CUkVBS0NSSVRJQ0FMRURHRVNfSAorCisjaW5jbHVkZSAibGx2bS9JUi9GdW5jdGlvbi5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworc3RydWN0IEJyZWFrQ3JpdGljYWxFZGdlc1Bhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxCcmVha0NyaXRpY2FsRWRnZXNQYXNzPiB7CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307Cit9IC8vIG5hbWVzcGFjZSBsbHZtCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0JSRUFLQ1JJVElDQUxFREdFU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQnVpbGRMaWJDYWxscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0J1aWxkTGliQ2FsbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTcxNTU5Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0J1aWxkTGliQ2FsbHMuaApAQCAtMCwwICsxLDEyNSBAQAorLy89PT0tIEJ1aWxkTGliQ2FsbHMuaCAtIFV0aWxpdHkgYnVpbGRlciBmb3IgbGliY2FsbHMgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZXhwb3NlcyBhbiBpbnRlcmZhY2UgdG8gYnVpbGQgc29tZSBDIGxhbmd1YWdlIGxpYmNhbGxzIGZvcgorLy8gb3B0aW1pemF0aW9uIHBhc3NlcyB0aGF0IG5lZWQgdG8gY2FsbCB0aGUgdmFyaW91cyBmdW5jdGlvbnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQlVJTERMSUJDQUxMU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19CVUlMRExJQkNBTExTX0gKKworI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvVGFyZ2V0TGlicmFyeUluZm8uaCIKKyNpbmNsdWRlICJsbHZtL0lSL0lSQnVpbGRlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisgIGNsYXNzIFZhbHVlOworICBjbGFzcyBEYXRhTGF5b3V0OworICBjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mbzsKKworICAvLy8gQW5hbHl6ZSB0aGUgbmFtZSBhbmQgcHJvdG90eXBlIG9mIHRoZSBnaXZlbiBmdW5jdGlvbiBhbmQgc2V0IGFueQorICAvLy8gYXBwbGljYWJsZSBhdHRyaWJ1dGVzLgorICAvLy8gSWYgdGhlIGxpYnJhcnkgZnVuY3Rpb24gaXMgdW5hdmFpbGFibGUsIHRoaXMgZG9lc24ndCBtb2RpZnkgaXQuCisgIC8vLworICAvLy8gUmV0dXJucyB0cnVlIGlmIGFueSBhdHRyaWJ1dGVzIHdlcmUgc2V0IGFuZCBmYWxzZSBvdGhlcndpc2UuCisgIGJvb2wgaW5mZXJMaWJGdW5jQXR0cmlidXRlcyhGdW5jdGlvbiAmRiwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gJlRMSSk7CisKKyAgLy8vIENoZWNrIHdoZXRoZXIgdGhlIG92ZXJsb2FkZWQgdW5hcnkgZmxvYXRpbmcgcG9pbnQgZnVuY3Rpb24KKyAgLy8vIGNvcnJlc3BvbmRpbmcgdG8gXGEgVHkgaXMgYXZhaWxhYmxlLgorICBib29sIGhhc1VuYXJ5RmxvYXRGbihjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJLCBUeXBlICpUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgTGliRnVuYyBEb3VibGVGbiwgTGliRnVuYyBGbG9hdEZuLAorICAgICAgICAgICAgICAgICAgICAgICBMaWJGdW5jIExvbmdEb3VibGVGbik7CisKKyAgLy8vIFJldHVybiBWIGlmIGl0IGlzIGFuIGk4Kiwgb3RoZXJ3aXNlIGNhc3QgaXQgdG8gaTgqLgorICBWYWx1ZSAqY2FzdFRvQ1N0cihWYWx1ZSAqViwgSVJCdWlsZGVyPD4gJkIpOworCisgIC8vLyBFbWl0IGEgY2FsbCB0byB0aGUgc3RybGVuIGZ1bmN0aW9uIHRvIHRoZSBidWlsZGVyLCBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gcG9pbnRlci4gUHRyIGlzIHJlcXVpcmVkIHRvIGJlIHNvbWUgcG9pbnRlciB0eXBlLCBhbmQgdGhlIHJldHVybiB2YWx1ZSBoYXMKKyAgLy8vICdpbnRwdHJfdCcgdHlwZS4KKyAgVmFsdWUgKmVtaXRTdHJMZW4oVmFsdWUgKlB0ciwgSVJCdWlsZGVyPD4gJkIsIGNvbnN0IERhdGFMYXlvdXQgJkRMLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKTsKKworICAvLy8gRW1pdCBhIGNhbGwgdG8gdGhlIHN0cm5sZW4gZnVuY3Rpb24gdG8gdGhlIGJ1aWxkZXIsIGZvciB0aGUgc3BlY2lmaWVkCisgIC8vLyBwb2ludGVyLiBQdHIgaXMgcmVxdWlyZWQgdG8gYmUgc29tZSBwb2ludGVyIHR5cGUsIE1heExlbiBtdXN0IGJlIG9mIHNpemVfdAorICAvLy8gdHlwZSwgYW5kIHRoZSByZXR1cm4gdmFsdWUgaGFzICdpbnRwdHJfdCcgdHlwZS4KKyAgVmFsdWUgKmVtaXRTdHJOTGVuKFZhbHVlICpQdHIsIFZhbHVlICpNYXhMZW4sIElSQnVpbGRlcjw+ICZCLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkpOworCisgIC8vLyBFbWl0IGEgY2FsbCB0byB0aGUgc3RyY2hyIGZ1bmN0aW9uIHRvIHRoZSBidWlsZGVyLCBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gcG9pbnRlciBhbmQgY2hhcmFjdGVyLiBQdHIgaXMgcmVxdWlyZWQgdG8gYmUgc29tZSBwb2ludGVyIHR5cGUsIGFuZCB0aGUKKyAgLy8vIHJldHVybiB2YWx1ZSBoYXMgJ2k4KicgdHlwZS4KKyAgVmFsdWUgKmVtaXRTdHJDaHIoVmFsdWUgKlB0ciwgY2hhciBDLCBJUkJ1aWxkZXI8PiAmQiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSk7CisKKyAgLy8vIEVtaXQgYSBjYWxsIHRvIHRoZSBzdHJuY21wIGZ1bmN0aW9uIHRvIHRoZSBidWlsZGVyLgorICBWYWx1ZSAqZW1pdFN0ck5DbXAoVmFsdWUgKlB0cjEsIFZhbHVlICpQdHIyLCBWYWx1ZSAqTGVuLCBJUkJ1aWxkZXI8PiAmQiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKTsKKworICAvLy8gRW1pdCBhIGNhbGwgdG8gdGhlIHN0cmNweSBmdW5jdGlvbiB0byB0aGUgYnVpbGRlciwgZm9yIHRoZSBzcGVjaWZpZWQKKyAgLy8vIHBvaW50ZXIgYXJndW1lbnRzLgorICBWYWx1ZSAqZW1pdFN0ckNweShWYWx1ZSAqRHN0LCBWYWx1ZSAqU3JjLCBJUkJ1aWxkZXI8PiAmQiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSwgU3RyaW5nUmVmIE5hbWUgPSAic3RyY3B5Iik7CisKKyAgLy8vIEVtaXQgYSBjYWxsIHRvIHRoZSBzdHJuY3B5IGZ1bmN0aW9uIHRvIHRoZSBidWlsZGVyLCBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gcG9pbnRlciBhcmd1bWVudHMgYW5kIGxlbmd0aC4KKyAgVmFsdWUgKmVtaXRTdHJOQ3B5KFZhbHVlICpEc3QsIFZhbHVlICpTcmMsIFZhbHVlICpMZW4sIElSQnVpbGRlcjw+ICZCLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSwgU3RyaW5nUmVmIE5hbWUgPSAic3RybmNweSIpOworCisgIC8vLyBFbWl0IGEgY2FsbCB0byB0aGUgX19tZW1jcHlfY2hrIGZ1bmN0aW9uIHRvIHRoZSBidWlsZGVyLiBUaGlzIGV4cGVjdHMgdGhhdAorICAvLy8gdGhlIExlbiBhbmQgT2JqU2l6ZSBoYXZlIHR5cGUgJ2ludHB0cl90JyBhbmQgRHN0L1NyYyBhcmUgcG9pbnRlcnMuCisgIFZhbHVlICplbWl0TWVtQ3B5Q2hrKFZhbHVlICpEc3QsIFZhbHVlICpTcmMsIFZhbHVlICpMZW4sIFZhbHVlICpPYmpTaXplLAorICAgICAgICAgICAgICAgICAgICAgICBJUkJ1aWxkZXI8PiAmQiwgY29uc3QgRGF0YUxheW91dCAmREwsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkpOworCisgIC8vLyBFbWl0IGEgY2FsbCB0byB0aGUgbWVtY2hyIGZ1bmN0aW9uLiBUaGlzIGFzc3VtZXMgdGhhdCBQdHIgaXMgYSBwb2ludGVyLAorICAvLy8gVmFsIGlzIGFuIGkzMiB2YWx1ZSwgYW5kIExlbiBpcyBhbiAnaW50cHRyX3QnIHZhbHVlLgorICBWYWx1ZSAqZW1pdE1lbUNocihWYWx1ZSAqUHRyLCBWYWx1ZSAqVmFsLCBWYWx1ZSAqTGVuLCBJUkJ1aWxkZXI8PiAmQiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YUxheW91dCAmREwsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkpOworCisgIC8vLyBFbWl0IGEgY2FsbCB0byB0aGUgbWVtY21wIGZ1bmN0aW9uLgorICBWYWx1ZSAqZW1pdE1lbUNtcChWYWx1ZSAqUHRyMSwgVmFsdWUgKlB0cjIsIFZhbHVlICpMZW4sIElSQnVpbGRlcjw+ICZCLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSk7CisKKyAgLy8vIEVtaXQgYSBjYWxsIHRvIHRoZSB1bmFyeSBmdW5jdGlvbiBuYW1lZCAnTmFtZScgKGUuZy4gICdmbG9vcicpLiBUaGlzCisgIC8vLyBmdW5jdGlvbiBpcyBrbm93biB0byB0YWtlIGEgc2luZ2xlIG9mIHR5cGUgbWF0Y2hpbmcgJ09wJyBhbmQgcmV0dXJucyBvbmUKKyAgLy8vIHZhbHVlIHdpdGggdGhlIHNhbWUgdHlwZS4gSWYgJ09wJyBpcyBhIGxvbmcgZG91YmxlLCAnbCcgaXMgYWRkZWQgYXMgdGhlCisgIC8vLyBzdWZmaXggb2YgbmFtZSwgaWYgJ09wJyBpcyBhIGZsb2F0LCB3ZSBhZGQgYSAnZicgc3VmZml4LgorICBWYWx1ZSAqZW1pdFVuYXJ5RmxvYXRGbkNhbGwoVmFsdWUgKk9wLCBTdHJpbmdSZWYgTmFtZSwgSVJCdWlsZGVyPD4gJkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdHRyaWJ1dGVMaXN0ICZBdHRycyk7CisKKyAgLy8vIEVtaXQgYSBjYWxsIHRvIHRoZSBiaW5hcnkgZnVuY3Rpb24gbmFtZWQgJ05hbWUnIChlLmcuICdmbWluJykuIFRoaXMKKyAgLy8vIGZ1bmN0aW9uIGlzIGtub3duIHRvIHRha2UgdHlwZSBtYXRjaGluZyAnT3AxJyBhbmQgJ09wMicgYW5kIHJldHVybiBvbmUKKyAgLy8vIHZhbHVlIHdpdGggdGhlIHNhbWUgdHlwZS4gSWYgJ09wMS9PcDInIGFyZSBsb25nIGRvdWJsZSwgJ2wnIGlzIGFkZGVkIGFzCisgIC8vLyB0aGUgc3VmZml4IG9mIG5hbWUsIGlmICdPcDEvT3AyJyBhcmUgZmxvYXQsIHdlIGFkZCBhICdmJyBzdWZmaXguCisgIFZhbHVlICplbWl0QmluYXJ5RmxvYXRGbkNhbGwoVmFsdWUgKk9wMSwgVmFsdWUgKk9wMiwgU3RyaW5nUmVmIE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJCdWlsZGVyPD4gJkIsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgJkF0dHJzKTsKKworICAvLy8gRW1pdCBhIGNhbGwgdG8gdGhlIHB1dGNoYXIgZnVuY3Rpb24uIFRoaXMgYXNzdW1lcyB0aGF0IENoYXIgaXMgYW4gaW50ZWdlci4KKyAgVmFsdWUgKmVtaXRQdXRDaGFyKFZhbHVlICpDaGFyLCBJUkJ1aWxkZXI8PiAmQiwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSk7CisKKyAgLy8vIEVtaXQgYSBjYWxsIHRvIHRoZSBwdXRzIGZ1bmN0aW9uLiBUaGlzIGFzc3VtZXMgdGhhdCBTdHIgaXMgc29tZSBwb2ludGVyLgorICBWYWx1ZSAqZW1pdFB1dFMoVmFsdWUgKlN0ciwgSVJCdWlsZGVyPD4gJkIsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkpOworCisgIC8vLyBFbWl0IGEgY2FsbCB0byB0aGUgZnB1dGMgZnVuY3Rpb24uIFRoaXMgYXNzdW1lcyB0aGF0IENoYXIgaXMgYW4gaTMyLCBhbmQKKyAgLy8vIEZpbGUgaXMgYSBwb2ludGVyIHRvIEZJTEUuCisgIFZhbHVlICplbWl0RlB1dEMoVmFsdWUgKkNoYXIsIFZhbHVlICpGaWxlLCBJUkJ1aWxkZXI8PiAmQiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKTsKKworICAvLy8gRW1pdCBhIGNhbGwgdG8gdGhlIHB1dHMgZnVuY3Rpb24uIFN0ciBpcyByZXF1aXJlZCB0byBiZSBhIHBvaW50ZXIgYW5kCisgIC8vLyBGaWxlIGlzIGEgcG9pbnRlciB0byBGSUxFLgorICBWYWx1ZSAqZW1pdEZQdXRTKFZhbHVlICpTdHIsIFZhbHVlICpGaWxlLCBJUkJ1aWxkZXI8PiAmQiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKTsKKworICAvLy8gRW1pdCBhIGNhbGwgdG8gdGhlIGZ3cml0ZSBmdW5jdGlvbi4gVGhpcyBhc3N1bWVzIHRoYXQgUHRyIGlzIGEgcG9pbnRlciwKKyAgLy8vIFNpemUgaXMgYW4gJ2ludHB0cl90JywgYW5kIEZpbGUgaXMgYSBwb2ludGVyIHRvIEZJTEUuCisgIFZhbHVlICplbWl0RldyaXRlKFZhbHVlICpQdHIsIFZhbHVlICpTaXplLCBWYWx1ZSAqRmlsZSwgSVJCdWlsZGVyPD4gJkIsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFMYXlvdXQgJkRMLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQnlwYXNzU2xvd0RpdmlzaW9uLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQnlwYXNzU2xvd0RpdmlzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVjYTVlZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9CeXBhc3NTbG93RGl2aXNpb24uaApAQCAtMCwwICsxLDcwIEBACisvLz09PS0gbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0J5cGFzc1Nsb3dEaXZpc2lvbi5oIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBjb250YWlucyBhbiBvcHRpbWl6YXRpb24gZm9yIGRpdiBhbmQgcmVtIG9uIGFyY2hpdGVjdHVyZXMgdGhhdAorLy8gZXhlY3V0ZSBzaG9ydCBpbnN0cnVjdGlvbnMgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdGhhbiBsb25nZXIgaW5zdHJ1Y3Rpb25zLgorLy8gRm9yIGV4YW1wbGUsIG9uIEludGVsIEF0b20gMzItYml0IGRpdmlkZXMgYXJlIHNsb3cgZW5vdWdoIHRoYXQgZHVyaW5nCisvLyBydW50aW1lIGl0IGlzIHByb2ZpdGFibGUgdG8gY2hlY2sgdGhlIHZhbHVlIG9mIHRoZSBvcGVyYW5kcywgYW5kIGlmIHRoZXkgYXJlCisvLyBwb3NpdGl2ZSBhbmQgbGVzcyB0aGFuIDI1NiB1c2UgYW4gdW5zaWduZWQgOC1iaXQgZGl2aWRlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0JZUEFTU1NMT1dESVZJU0lPTl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19CWVBBU1NTTE9XRElWSVNJT05fSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcEluZm8uaCIKKyNpbmNsdWRlIDxjc3RkaW50PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBWYWx1ZTsKKworc3RydWN0IERpdlJlbU1hcEtleSB7CisgIGJvb2wgU2lnbmVkT3A7CisgIFZhbHVlICpEaXZpZGVuZDsKKyAgVmFsdWUgKkRpdmlzb3I7CisKKyAgRGl2UmVtTWFwS2V5KGJvb2wgSW5TaWduZWRPcCwgVmFsdWUgKkluRGl2aWRlbmQsIFZhbHVlICpJbkRpdmlzb3IpCisgICAgICA6IFNpZ25lZE9wKEluU2lnbmVkT3ApLCBEaXZpZGVuZChJbkRpdmlkZW5kKSwgRGl2aXNvcihJbkRpdmlzb3IpIHt9Cit9OworCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgRGVuc2VNYXBJbmZvPERpdlJlbU1hcEtleT4geworICBzdGF0aWMgYm9vbCBpc0VxdWFsKGNvbnN0IERpdlJlbU1hcEtleSAmVmFsMSwgY29uc3QgRGl2UmVtTWFwS2V5ICZWYWwyKSB7CisgICAgcmV0dXJuIFZhbDEuU2lnbmVkT3AgPT0gVmFsMi5TaWduZWRPcCAmJiBWYWwxLkRpdmlkZW5kID09IFZhbDIuRGl2aWRlbmQgJiYKKyAgICAgICAgICAgVmFsMS5EaXZpc29yID09IFZhbDIuRGl2aXNvcjsKKyAgfQorCisgIHN0YXRpYyBEaXZSZW1NYXBLZXkgZ2V0RW1wdHlLZXkoKSB7CisgICAgcmV0dXJuIERpdlJlbU1hcEtleShmYWxzZSwgbnVsbHB0ciwgbnVsbHB0cik7CisgIH0KKworICBzdGF0aWMgRGl2UmVtTWFwS2V5IGdldFRvbWJzdG9uZUtleSgpIHsKKyAgICByZXR1cm4gRGl2UmVtTWFwS2V5KHRydWUsIG51bGxwdHIsIG51bGxwdHIpOworICB9CisKKyAgc3RhdGljIHVuc2lnbmVkIGdldEhhc2hWYWx1ZShjb25zdCBEaXZSZW1NYXBLZXkgJlZhbCkgeworICAgIHJldHVybiAodW5zaWduZWQpKHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PihWYWwuRGl2aWRlbmQpIF4KKyAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oVmFsLkRpdmlzb3IpKSBeCisgICAgICAgICAgICh1bnNpZ25lZClWYWwuU2lnbmVkT3A7CisgIH0KK307CisKKy8vLyBUaGlzIG9wdGltaXphdGlvbiBpZGVudGlmaWVzIERJViBpbnN0cnVjdGlvbnMgaW4gYSBCQiB0aGF0IGNhbiBiZQorLy8vIHByb2ZpdGFibHkgYnlwYXNzZWQgYW5kIGNhcnJpZWQgb3V0IHdpdGggYSBzaG9ydGVyLCBmYXN0ZXIgZGl2aWRlLgorLy8vCisvLy8gVGhpcyBvcHRpbWl6YXRpb24gbWF5IGFkZCBiYXNpYyBibG9ja3MgaW1tZWRpYXRlbHkgYWZ0ZXIgQkI7IGZvciBvYnZpb3VzCisvLy8gcmVhc29ucywgeW91IHNob3VsZG4ndCBwYXNzIHRob3NlIGJsb2NrcyB0byBieXBhc3NTbG93RGl2aXNpb24uCitib29sIGJ5cGFzc1Nsb3dEaXZpc2lvbigKKyAgICBCYXNpY0Jsb2NrICpCQiwgY29uc3QgRGVuc2VNYXA8dW5zaWduZWQgaW50LCB1bnNpZ25lZCBpbnQ+ICZCeXBhc3NXaWR0aCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQllQQVNTU0xPV0RJVklTSU9OX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9DYWxsUHJvbW90aW9uVXRpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9DYWxsUHJvbW90aW9uVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZThlY2U3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0NhbGxQcm9tb3Rpb25VdGlscy5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vPT09LSBDYWxsUHJvbW90aW9uVXRpbHMuaCAtIFV0aWxpdGllcyBmb3IgY2FsbCBwcm9tb3Rpb24gLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlY2xhcmVzIHV0aWxpdGllcyB1c2VmdWwgZm9yIHByb21vdGluZyBpbmRpcmVjdCBjYWxsIHNpdGVzIHRvCisvLyBkaXJlY3QgY2FsbCBzaXRlcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19DQUxMUFJPTU9USU9OVVRJTFNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQ0FMTFBST01PVElPTlVUSUxTX0gKKworI2luY2x1ZGUgImxsdm0vSVIvQ2FsbFNpdGUuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIGluZGlyZWN0IGNhbGwgc2l0ZSBjYW4gYmUgbWFkZSB0byBjYWxsIFxwIENhbGxlZS4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gZW5zdXJlcyB0aGF0IHRoZSBudW1iZXIgYW5kIHR5cGUgb2YgdGhlIGNhbGwgc2l0ZSdzIGFyZ3VtZW50cworLy8vIGFuZCByZXR1cm4gdmFsdWUgbWF0Y2ggdGhvc2Ugb2YgdGhlIGdpdmVuIGZ1bmN0aW9uLiBJZiB0aGUgdHlwZXMgZG8gbm90CisvLy8gbWF0Y2ggZXhhY3RseSwgdGhleSBtdXN0IGF0IGxlYXN0IGJlIGJpdGNhc3QgY29tcGF0aWJsZS4gSWYgXHAgRmFpbHVyZVJlYXNvbgorLy8vIGlzIG5vbi1udWxsIGFuZCB0aGUgaW5kaXJlY3QgY2FsbCBjYW5ub3QgYmUgcHJvbW90ZWQsIHRoZSBmYWlsdXJlIHJlYXNvbgorLy8vIHdpbGwgYmUgc3RvcmVkIGluIGl0LgorYm9vbCBpc0xlZ2FsVG9Qcm9tb3RlKENhbGxTaXRlIENTLCBGdW5jdGlvbiAqQ2FsbGVlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKipGYWlsdXJlUmVhc29uID0gbnVsbHB0cik7CisKKy8vLyBQcm9tb3RlIHRoZSBnaXZlbiBpbmRpcmVjdCBjYWxsIHNpdGUgdG8gdW5jb25kaXRpb25hbGx5IGNhbGwgXHAgQ2FsbGVlLgorLy8vCisvLy8gVGhpcyBmdW5jdGlvbiBwcm9tb3RlcyB0aGUgZ2l2ZW4gY2FsbCBzaXRlLCByZXR1cm5pbmcgdGhlIGRpcmVjdCBjYWxsIG9yCisvLy8gaW52b2tlIGluc3RydWN0aW9uLiBJZiB0aGUgZnVuY3Rpb24gdHlwZSBvZiB0aGUgY2FsbCBzaXRlIGRvZXNuJ3QgbWF0Y2ggdGhhdAorLy8vIG9mIHRoZSBjYWxsZWUsIGJpdGNhc3QgaW5zdHJ1Y3Rpb25zIGFyZSBpbnNlcnRlZCB3aGVyZSBhcHByb3ByaWF0ZS4gSWYgXHAKKy8vLyBSZXRCaXRDYXN0IGlzIG5vbi1udWxsLCBpdCB3aWxsIGJlIHVzZWQgdG8gc3RvcmUgdGhlIHJldHVybiB2YWx1ZSBiaXRjYXN0LAorLy8vIGlmIGNyZWF0ZWQuCitJbnN0cnVjdGlvbiAqcHJvbW90ZUNhbGwoQ2FsbFNpdGUgQ1MsIEZ1bmN0aW9uICpDYWxsZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2FzdEluc3QgKipSZXRCaXRDYXN0ID0gbnVsbHB0cik7CisKKy8vLyBQcm9tb3RlIHRoZSBnaXZlbiBpbmRpcmVjdCBjYWxsIHNpdGUgdG8gY29uZGl0aW9uYWxseSBjYWxsIFxwIENhbGxlZS4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gY3JlYXRlcyBhbiBpZi10aGVuLWVsc2Ugc3RydWN0dXJlIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgY2FsbAorLy8vIHNpdGUuIFRoZSBvcmlnaW5hbCBjYWxsIHNpdGUgaXMgbW92ZWQgaW50byB0aGUgImVsc2UiIGJsb2NrLiBBIGNsb25lIG9mIHRoZQorLy8vIGluZGlyZWN0IGNhbGwgc2l0ZSBpcyBwcm9tb3RlZCwgcGxhY2VkIGluIHRoZSAidGhlbiIgYmxvY2ssIGFuZCByZXR1cm5lZC4gSWYKKy8vLyBccCBCcmFuY2hXZWlnaHRzIGlzIG5vbi1udWxsLCBpdCB3aWxsIGJlIHVzZWQgdG8gc2V0ICFwcm9mIG1ldGFkYXRhIG9uIHRoZQorLy8vIG5ldyBjb25kaXRpb25hbCBicmFuY2guCitJbnN0cnVjdGlvbiAqcHJvbW90ZUNhbGxXaXRoSWZUaGVuRWxzZShDYWxsU2l0ZSBDUywgRnVuY3Rpb24gKkNhbGxlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1ETm9kZSAqQnJhbmNoV2VpZ2h0cyA9IG51bGxwdHIpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0NBTExQUk9NT1RJT05VVElMU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQ2xvbmluZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0Nsb25pbmcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZDAyY2E2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0Nsb25pbmcuaApAQCAtMCwwICsxLDI3MiBAQAorLy89PT0tIENsb25pbmcuaCAtIENsb25lIHZhcmlvdXMgcGFydHMgb2YgTExWTSBwcm9ncmFtcyAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB2YXJpb3VzIGZ1bmN0aW9ucyB0aGF0IGFyZSB1c2VkIHRvIGNsb25lIGNodW5rcyBvZiBMTFZNCisvLyBjb2RlIGZvciB2YXJpb3VzIHB1cnBvc2VzLiAgVGhpcyB2YXJpZXMgZnJvbSBjb3B5aW5nIHdob2xlIG1vZHVsZXMgaW50byBuZXcKKy8vIG1vZHVsZXMsIHRvIGNsb25pbmcgZnVuY3Rpb25zIHdpdGggZGlmZmVyZW50IGFyZ3VtZW50cywgdG8gaW5saW5pbmcKKy8vIGZ1bmN0aW9ucywgdG8gY29weWluZyBiYXNpYyBibG9ja3MgdG8gc3VwcG9ydCBsb29wIHVucm9sbGluZyBvciBzdXBlcmJsb2NrCisvLyBmb3JtYXRpb24sIGV0Yy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19DTE9OSU5HX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0NMT05JTkdfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ud2luZS5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQXNzdW1wdGlvbkNhY2hlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9DYWxsU2l0ZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvVmFsdWVNYXBwZXIuaCIKKyNpbmNsdWRlIDxmdW5jdGlvbmFsPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQWxsb2NhSW5zdDsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBCbG9ja0ZyZXF1ZW5jeUluZm87CitjbGFzcyBDYWxsSW5zdDsKK2NsYXNzIENhbGxHcmFwaDsKK2NsYXNzIERlYnVnSW5mb0ZpbmRlcjsKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgSW52b2tlSW5zdDsKK2NsYXNzIExvb3A7CitjbGFzcyBMb29wSW5mbzsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIFByb2ZpbGVTdW1tYXJ5SW5mbzsKK2NsYXNzIFJldHVybkluc3Q7CisKKy8vLyBSZXR1cm4gYW4gZXhhY3QgY29weSBvZiB0aGUgc3BlY2lmaWVkIG1vZHVsZQorLy8vCitzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBDbG9uZU1vZHVsZShjb25zdCBNb2R1bGUgJk0pOworc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4gQ2xvbmVNb2R1bGUoY29uc3QgTW9kdWxlICZNLCBWYWx1ZVRvVmFsdWVNYXBUeSAmVk1hcCk7CisKKy8vLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgbW9kdWxlLiBUaGUgU2hvdWxkQ2xvbmVEZWZpbml0aW9uIGZ1bmN0aW9uCisvLy8gY29udHJvbHMgd2hldGhlciBhIHNwZWNpZmljIEdsb2JhbFZhbHVlJ3MgZGVmaW5pdGlvbiBpcyBjbG9uZWQuIElmIHRoZQorLy8vIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UsIHRoZSBtb2R1bGUgY29weSB3aWxsIGNvbnRhaW4gYW4gZXh0ZXJuYWwgcmVmZXJlbmNlCisvLy8gaW4gcGxhY2Ugb2YgdGhlIGdsb2JhbCBkZWZpbml0aW9uLgorc3RkOjp1bmlxdWVfcHRyPE1vZHVsZT4KK0Nsb25lTW9kdWxlKGNvbnN0IE1vZHVsZSAmTSwgVmFsdWVUb1ZhbHVlTWFwVHkgJlZNYXAsCisgICAgICAgICAgICBmdW5jdGlvbl9yZWY8Ym9vbChjb25zdCBHbG9iYWxWYWx1ZSAqKT4gU2hvdWxkQ2xvbmVEZWZpbml0aW9uKTsKKworLy8vIENsb25lZENvZGVJbmZvIC0gVGhpcyBzdHJ1Y3QgY2FuIGJlIHVzZWQgdG8gY2FwdHVyZSBpbmZvcm1hdGlvbiBhYm91dCBjb2RlCisvLy8gYmVpbmcgY2xvbmVkLCB3aGlsZSBpdCBpcyBiZWluZyBjbG9uZWQuCitzdHJ1Y3QgQ2xvbmVkQ29kZUluZm8geworICAvLy8gQ29udGFpbnNDYWxscyAtIFRoaXMgaXMgc2V0IHRvIHRydWUgaWYgdGhlIGNsb25lZCBjb2RlIGNvbnRhaW5zIGEgbm9ybWFsCisgIC8vLyBjYWxsIGluc3RydWN0aW9uLgorICBib29sIENvbnRhaW5zQ2FsbHMgPSBmYWxzZTsKKworICAvLy8gQ29udGFpbnNEeW5hbWljQWxsb2NhcyAtIFRoaXMgaXMgc2V0IHRvIHRydWUgaWYgdGhlIGNsb25lZCBjb2RlIGNvbnRhaW5zCisgIC8vLyBhICdkeW5hbWljJyBhbGxvY2EuICBEeW5hbWljIGFsbG9jYXMgYXJlIGFsbG9jYXMgdGhhdCBhcmUgZWl0aGVyIG5vdCBpbgorICAvLy8gdGhlIGVudHJ5IGJsb2NrIG9yIHRoZXkgYXJlIGluIHRoZSBlbnRyeSBibG9jayBidXQgYXJlIG5vdCBhIGNvbnN0YW50CisgIC8vLyBzaXplLgorICBib29sIENvbnRhaW5zRHluYW1pY0FsbG9jYXMgPSBmYWxzZTsKKworICAvLy8gQWxsIGNsb25lZCBjYWxsIHNpdGVzIHRoYXQgaGF2ZSBvcGVyYW5kIGJ1bmRsZXMgYXR0YWNoZWQgYXJlIGFwcGVuZGVkIHRvCisgIC8vLyB0aGlzIHZlY3Rvci4gIFRoaXMgdmVjdG9yIG1heSBjb250YWluIG51bGxzIG9yIHVuZGVmcyBpZiBzb21lIG9mIHRoZQorICAvLy8gb3JpZ2luYWxseSBpbnNlcnRlZCBjYWxsc2l0ZXMgd2VyZSBEQ0UnZWQgYWZ0ZXIgdGhleSB3ZXJlIGNsb25lZC4KKyAgc3RkOjp2ZWN0b3I8V2Vha1RyYWNraW5nVkg+IE9wZXJhbmRCdW5kbGVDYWxsU2l0ZXM7CisKKyAgQ2xvbmVkQ29kZUluZm8oKSA9IGRlZmF1bHQ7Cit9OworCisvLy8gQ2xvbmVCYXNpY0Jsb2NrIC0gUmV0dXJuIGEgY29weSBvZiB0aGUgc3BlY2lmaWVkIGJhc2ljIGJsb2NrLCBidXQgd2l0aG91dAorLy8vIGVtYmVkZGluZyB0aGUgYmxvY2sgaW50byBhIHBhcnRpY3VsYXIgZnVuY3Rpb24uICBUaGUgYmxvY2sgcmV0dXJuZWQgaXMgYW4KKy8vLyBleGFjdCBjb3B5IG9mIHRoZSBzcGVjaWZpZWQgYmFzaWMgYmxvY2ssIHdpdGhvdXQgYW55IHJlbWFwcGluZyBoYXZpbmcgYmVlbgorLy8vIHBlcmZvcm1lZC4gIEJlY2F1c2Ugb2YgdGhpcywgdGhpcyBpcyBvbmx5IHN1aXRhYmxlIGZvciBhcHBsaWNhdGlvbnMgd2hlcmUKKy8vLyB0aGUgYmFzaWMgYmxvY2sgd2lsbCBiZSBpbnNlcnRlZCBpbnRvIHRoZSBzYW1lIGZ1bmN0aW9uIHRoYXQgaXQgd2FzIGNsb25lZAorLy8vIGZyb20gKGxvb3AgdW5yb2xsaW5nIHdvdWxkIHVzZSB0aGlzLCBmb3IgZXhhbXBsZSkuCisvLy8KKy8vLyBBbHNvLCBub3RlIHRoYXQgdGhpcyBmdW5jdGlvbiBtYWtlcyBhIGRpcmVjdCBjb3B5IG9mIHRoZSBiYXNpYyBibG9jaywgYW5kCisvLy8gY2FuIHRodXMgcHJvZHVjZSBpbGxlZ2FsIExMVk0gY29kZS4gIEluIHBhcnRpY3VsYXIsIGl0IHdpbGwgY29weSBhbnkgUEhJCisvLy8gbm9kZXMgZnJvbSB0aGUgb3JpZ2luYWwgYmxvY2ssIGV2ZW4gdGhvdWdoIHRoZXJlIGFyZSBubyBwcmVkZWNlc3NvcnMgZm9yIHRoZQorLy8vIG5ld2x5IGNsb25lZCBibG9jayAodGh1cywgcGhpIG5vZGVzIHdpbGwgaGF2ZSB0byBiZSB1cGRhdGVkKS4gIEFsc28sIHRoaXMKKy8vLyBibG9jayB3aWxsIGJyYW5jaCB0byB0aGUgb2xkIHN1Y2Nlc3NvcnMgb2YgdGhlIG9yaWdpbmFsIGJsb2NrOiB0aGVzZQorLy8vIHN1Y2Nlc3NvcnMgd2lsbCBoYXZlIHRvIGhhdmUgYW55IFBISSBub2RlcyB1cGRhdGVkIHRvIGFjY291bnQgZm9yIHRoZSBuZXcKKy8vLyBpbmNvbWluZyBlZGdlcy4KKy8vLworLy8vIFRoZSBjb3JyZWxhdGlvbiBiZXR3ZWVuIGluc3RydWN0aW9ucyBpbiB0aGUgc291cmNlIGFuZCByZXN1bHQgYmFzaWMgYmxvY2tzCisvLy8gaXMgcmVjb3JkZWQgaW4gdGhlIFZNYXAgbWFwLgorLy8vCisvLy8gSWYgeW91IGhhdmUgYSBwYXJ0aWN1bGFyIHN1ZmZpeCB5b3UnZCBsaWtlIHRvIHVzZSB0byBhZGQgdG8gYW55IGNsb25lZAorLy8vIG5hbWVzLCBzcGVjaWZ5IGl0IGFzIHRoZSBvcHRpb25hbCB0aGlyZCBwYXJhbWV0ZXIuCisvLy8KKy8vLyBJZiB5b3Ugd291bGQgbGlrZSB0aGUgYmFzaWMgYmxvY2sgdG8gYmUgYXV0by1pbnNlcnRlZCBpbnRvIHRoZSBlbmQgb2YgYQorLy8vIGZ1bmN0aW9uLCB5b3UgY2FuIHNwZWNpZnkgaXQgYXMgdGhlIG9wdGlvbmFsIGZvdXJ0aCBwYXJhbWV0ZXIuCisvLy8KKy8vLyBJZiB5b3Ugd291bGQgbGlrZSB0byBjb2xsZWN0IGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGNsb25lZAorLy8vIGZ1bmN0aW9uLCB5b3UgY2FuIHNwZWNpZnkgYSBDbG9uZWRDb2RlSW5mbyBvYmplY3Qgd2l0aCB0aGUgb3B0aW9uYWwgZmlmdGgKKy8vLyBwYXJhbWV0ZXIuCisvLy8KK0Jhc2ljQmxvY2sgKkNsb25lQmFzaWNCbG9jayhjb25zdCBCYXNpY0Jsb2NrICpCQiwgVmFsdWVUb1ZhbHVlTWFwVHkgJlZNYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdWZmaXggPSAiIiwgRnVuY3Rpb24gKkYgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsb25lZENvZGVJbmZvICpDb2RlSW5mbyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVidWdJbmZvRmluZGVyICpESUZpbmRlciA9IG51bGxwdHIpOworCisvLy8gQ2xvbmVGdW5jdGlvbiAtIFJldHVybiBhIGNvcHkgb2YgdGhlIHNwZWNpZmllZCBmdW5jdGlvbiBhbmQgYWRkIGl0IHRvIHRoYXQKKy8vLyBmdW5jdGlvbidzIG1vZHVsZS4gIEFsc28sIGFueSByZWZlcmVuY2VzIHNwZWNpZmllZCBpbiB0aGUgVk1hcCBhcmUgY2hhbmdlZAorLy8vIHRvIHJlZmVyIHRvIHRoZWlyIG1hcHBlZCB2YWx1ZSBpbnN0ZWFkIG9mIHRoZSBvcmlnaW5hbCBvbmUuICBJZiBhbnkgb2YgdGhlCisvLy8gYXJndW1lbnRzIHRvIHRoZSBmdW5jdGlvbiBhcmUgaW4gdGhlIFZNYXAsIHRoZSBhcmd1bWVudHMgYXJlIGRlbGV0ZWQgZnJvbQorLy8vIHRoZSByZXN1bHRhbnQgZnVuY3Rpb24uICBUaGUgVk1hcCBpcyB1cGRhdGVkIHRvIGluY2x1ZGUgbWFwcGluZ3MgZnJvbSBhbGwgb2YKKy8vLyB0aGUgaW5zdHJ1Y3Rpb25zIGFuZCBiYXNpY2Jsb2NrcyBpbiB0aGUgZnVuY3Rpb24gZnJvbSB0aGVpciBvbGQgdG8gbmV3CisvLy8gdmFsdWVzLiAgVGhlIGZpbmFsIGFyZ3VtZW50IGNhcHR1cmVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjbG9uZWQgY29kZSBpZgorLy8vIG5vbi1udWxsLgorLy8vCisvLy8gVk1hcCBjb250YWlucyBubyBub24taWRlbnRpdHkgR2xvYmFsVmFsdWUgbWFwcGluZ3MgYW5kIGRlYnVnIGluZm8gbWV0YWRhdGEKKy8vLyB3aWxsIG5vdCBiZSBjbG9uZWQuCisvLy8KK0Z1bmN0aW9uICpDbG9uZUZ1bmN0aW9uKEZ1bmN0aW9uICpGLCBWYWx1ZVRvVmFsdWVNYXBUeSAmVk1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENsb25lZENvZGVJbmZvICpDb2RlSW5mbyA9IG51bGxwdHIpOworCisvLy8gQ2xvbmUgT2xkRnVuYyBpbnRvIE5ld0Z1bmMsIHRyYW5zZm9ybWluZyB0aGUgb2xkIGFyZ3VtZW50cyBpbnRvIHJlZmVyZW5jZXMKKy8vLyB0byBWTWFwIHZhbHVlcy4gIE5vdGUgdGhhdCBpZiBOZXdGdW5jIGFscmVhZHkgaGFzIGJhc2ljIGJsb2NrcywgdGhlIG9uZXMKKy8vLyBjbG9uZWQgaW50byBpdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmQgb2YgdGhlIGZ1bmN0aW9uLiAgVGhpcyBmdW5jdGlvbgorLy8vIGZpbGxzIGluIGEgbGlzdCBvZiByZXR1cm4gaW5zdHJ1Y3Rpb25zLCBhbmQgY2FuIG9wdGlvbmFsbHkgcmVtYXAgdHlwZXMKKy8vLyBhbmQvb3IgYXBwZW5kIHRoZSBzcGVjaWZpZWQgc3VmZml4IHRvIGFsbCB2YWx1ZXMgY2xvbmVkLgorLy8vCisvLy8gSWYgTW9kdWxlTGV2ZWxDaGFuZ2VzIGlzIGZhbHNlLCBWTWFwIGNvbnRhaW5zIG5vIG5vbi1pZGVudGl0eSBHbG9iYWxWYWx1ZQorLy8vIG1hcHBpbmdzLgorLy8vCit2b2lkIENsb25lRnVuY3Rpb25JbnRvKEZ1bmN0aW9uICpOZXdGdW5jLCBjb25zdCBGdW5jdGlvbiAqT2xkRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVUb1ZhbHVlTWFwVHkgJlZNYXAsIGJvb2wgTW9kdWxlTGV2ZWxDaGFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8UmV0dXJuSW5zdCo+ICZSZXR1cm5zLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpOYW1lU3VmZml4ID0gIiIsCisgICAgICAgICAgICAgICAgICAgICAgIENsb25lZENvZGVJbmZvICpDb2RlSW5mbyA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlTWFwVHlwZVJlbWFwcGVyICpUeXBlTWFwcGVyID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVNYXRlcmlhbGl6ZXIgKk1hdGVyaWFsaXplciA9IG51bGxwdHIpOworCit2b2lkIENsb25lQW5kUHJ1bmVJbnRvRnJvbUluc3QoRnVuY3Rpb24gKk5ld0Z1bmMsIGNvbnN0IEZ1bmN0aW9uICpPbGRGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpTdGFydGluZ0luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVUb1ZhbHVlTWFwVHkgJlZNYXAsIGJvb2wgTW9kdWxlTGV2ZWxDaGFuZ2VzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxSZXR1cm5JbnN0ICo+ICZSZXR1cm5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWVTdWZmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbG9uZWRDb2RlSW5mbyAqQ29kZUluZm8gPSBudWxscHRyKTsKKworLy8vIENsb25lQW5kUHJ1bmVGdW5jdGlvbkludG8gLSBUaGlzIHdvcmtzIGV4YWN0bHkgbGlrZSBDbG9uZUZ1bmN0aW9uSW50bywKKy8vLyBleGNlcHQgdGhhdCBpdCBkb2VzIHNvbWUgc2ltcGxlIGNvbnN0YW50IHByb3AgYW5kIERDRSBvbiB0aGUgZmx5LiAgVGhlCisvLy8gZWZmZWN0IG9mIHRoaXMgaXMgdG8gY29weSBzaWduaWZpY2FudGx5IGxlc3MgY29kZSBpbiBjYXNlcyB3aGVyZSAoZm9yCisvLy8gZXhhbXBsZSkgYSBmdW5jdGlvbiBjYWxsIHdpdGggY29uc3RhbnQgYXJndW1lbnRzIGlzIGlubGluZWQsIGFuZCB0aG9zZQorLy8vIGNvbnN0YW50IGFyZ3VtZW50cyBjYXVzZSBhIHNpZ25pZmljYW50IGFtb3VudCBvZiBjb2RlIGluIHRoZSBjYWxsZWUgdG8gYmUKKy8vLyBkZWFkLiAgU2luY2UgdGhpcyBkb2Vzbid0IHByb2R1Y2UgYW4gZXhhY3RseSBjb3B5IG9mIHRoZSBpbnB1dCwgaXQgY2FuJ3QgYmUKKy8vLyB1c2VkIGZvciB0aGluZ3MgbGlrZSBDbG9uZUZ1bmN0aW9uIG9yIENsb25lTW9kdWxlLgorLy8vCisvLy8gSWYgTW9kdWxlTGV2ZWxDaGFuZ2VzIGlzIGZhbHNlLCBWTWFwIGNvbnRhaW5zIG5vIG5vbi1pZGVudGl0eSBHbG9iYWxWYWx1ZQorLy8vIG1hcHBpbmdzLgorLy8vCit2b2lkIENsb25lQW5kUHJ1bmVGdW5jdGlvbkludG8oRnVuY3Rpb24gKk5ld0Z1bmMsIGNvbnN0IEZ1bmN0aW9uICpPbGRGdW5jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlVG9WYWx1ZU1hcFR5ICZWTWFwLCBib29sIE1vZHVsZUxldmVsQ2hhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8UmV0dXJuSW5zdCo+ICZSZXR1cm5zLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKk5hbWVTdWZmaXggPSAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbG9uZWRDb2RlSW5mbyAqQ29kZUluZm8gPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpUaGVDYWxsID0gbnVsbHB0cik7CisKKy8vLyBJbmxpbmVGdW5jdGlvbkluZm8gLSBUaGlzIGNsYXNzIGNhcHR1cmVzIHRoZSBkYXRhIGlucHV0IHRvIHRoZQorLy8vIElubGluZUZ1bmN0aW9uIGNhbGwsIGFuZCByZWNvcmRzIHRoZSBhdXhpbGlhcnkgcmVzdWx0cyBwcm9kdWNlZCBieSBpdC4KK2NsYXNzIElubGluZUZ1bmN0aW9uSW5mbyB7CitwdWJsaWM6CisgIGV4cGxpY2l0IElubGluZUZ1bmN0aW9uSW5mbyhDYWxsR3JhcGggKmNnID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6ZnVuY3Rpb248QXNzdW1wdGlvbkNhY2hlICYoRnVuY3Rpb24gJik+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKkdldEFzc3VtcHRpb25DYWNoZSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9maWxlU3VtbWFyeUluZm8gKlBTSSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0ZyZXF1ZW5jeUluZm8gKkNhbGxlckJGSSA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCbG9ja0ZyZXF1ZW5jeUluZm8gKkNhbGxlZUJGSSA9IG51bGxwdHIpCisgICAgICA6IENHKGNnKSwgR2V0QXNzdW1wdGlvbkNhY2hlKEdldEFzc3VtcHRpb25DYWNoZSksIFBTSShQU0kpLAorICAgICAgICBDYWxsZXJCRkkoQ2FsbGVyQkZJKSwgQ2FsbGVlQkZJKENhbGxlZUJGSSkge30KKworICAvLy8gQ0cgLSBJZiBub24tbnVsbCwgSW5saW5lRnVuY3Rpb24gd2lsbCB1cGRhdGUgdGhlIGNhbGxncmFwaCB0byByZWZsZWN0IHRoZQorICAvLy8gY2hhbmdlcyBpdCBtYWtlcy4KKyAgQ2FsbEdyYXBoICpDRzsKKyAgc3RkOjpmdW5jdGlvbjxBc3N1bXB0aW9uQ2FjaGUgJihGdW5jdGlvbiAmKT4gKkdldEFzc3VtcHRpb25DYWNoZTsKKyAgUHJvZmlsZVN1bW1hcnlJbmZvICpQU0k7CisgIEJsb2NrRnJlcXVlbmN5SW5mbyAqQ2FsbGVyQkZJLCAqQ2FsbGVlQkZJOworCisgIC8vLyBTdGF0aWNBbGxvY2FzIC0gSW5saW5lRnVuY3Rpb24gZmlsbHMgdGhpcyBpbiB3aXRoIGFsbCBzdGF0aWMgYWxsb2NhcyB0aGF0CisgIC8vLyBnZXQgY29waWVkIGludG8gdGhlIGNhbGxlci4KKyAgU21hbGxWZWN0b3I8QWxsb2NhSW5zdCAqLCA0PiBTdGF0aWNBbGxvY2FzOworCisgIC8vLyBJbmxpbmVkQ2FsbHMgLSBJbmxpbmVGdW5jdGlvbiBmaWxscyB0aGlzIGluIHdpdGggY2FsbHNpdGVzIHRoYXQgd2VyZQorICAvLy8gaW5saW5lZCBmcm9tIHRoZSBjYWxsZWUuICBUaGlzIGlzIG9ubHkgZmlsbGVkIGluIGlmIENHIGlzIG5vbi1udWxsLgorICBTbWFsbFZlY3RvcjxXZWFrVHJhY2tpbmdWSCwgOD4gSW5saW5lZENhbGxzOworCisgIC8vLyBBbGwgb2YgdGhlIG5ldyBjYWxsIHNpdGVzIGlubGluZWQgaW50byB0aGUgY2FsbGVyLgorICAvLy8KKyAgLy8vICdJbmxpbmVGdW5jdGlvbicgZmlsbHMgdGhpcyBpbiBieSBzY2FubmluZyB0aGUgaW5saW5lZCBpbnN0cnVjdGlvbnMsIGFuZAorICAvLy8gb25seSBpZiBDRyBpcyBudWxsLiBJZiBDRyBpcyBub24tbnVsbCwgaW5zdGVhZCB0aGUgdmFsdWUgaGFuZGxlCisgIC8vLyBgSW5saW5lZENhbGxzYCBhYm92ZSBpcyB1c2VkLgorICBTbWFsbFZlY3RvcjxDYWxsU2l0ZSwgOD4gSW5saW5lZENhbGxTaXRlczsKKworICB2b2lkIHJlc2V0KCkgeworICAgIFN0YXRpY0FsbG9jYXMuY2xlYXIoKTsKKyAgICBJbmxpbmVkQ2FsbHMuY2xlYXIoKTsKKyAgICBJbmxpbmVkQ2FsbFNpdGVzLmNsZWFyKCk7CisgIH0KK307CisKKy8vLyBJbmxpbmVGdW5jdGlvbiAtIFRoaXMgZnVuY3Rpb24gaW5saW5lcyB0aGUgY2FsbGVkIGZ1bmN0aW9uIGludG8gdGhlIGJhc2ljCisvLy8gYmxvY2sgb2YgdGhlIGNhbGxlci4gIFRoaXMgcmV0dXJucyBmYWxzZSBpZiBpdCBpcyBub3QgcG9zc2libGUgdG8gaW5saW5lCisvLy8gdGhpcyBjYWxsLiAgVGhlIHByb2dyYW0gaXMgc3RpbGwgaW4gYSB3ZWxsIGRlZmluZWQgc3RhdGUgaWYgdGhpcyBvY2N1cnMKKy8vLyB0aG91Z2guCisvLy8KKy8vLyBOb3RlIHRoYXQgdGhpcyBvbmx5IGRvZXMgb25lIGxldmVsIG9mIGlubGluaW5nLiAgRm9yIGV4YW1wbGUsIGlmIHRoZQorLy8vIGluc3RydWN0aW9uICdjYWxsIEInIGlzIGlubGluZWQsIGFuZCAnQicgY2FsbHMgJ0MnLCB0aGVuIHRoZSBjYWxsIHRvICdDJyBub3cKKy8vLyBleGlzdHMgaW4gdGhlIGluc3RydWN0aW9uIHN0cmVhbS4gIFNpbWlsYXJseSB0aGlzIHdpbGwgaW5saW5lIGEgcmVjdXJzaXZlCisvLy8gZnVuY3Rpb24gYnkgb25lIGxldmVsLgorLy8vCisvLy8gTm90ZSB0aGF0IHdoaWxlIHRoaXMgcm91dGluZSBpcyBhbGxvd2VkIHRvIGNsZWFudXAgYW5kIG9wdGltaXplIHRoZQorLy8vICppbmxpbmVkKiBjb2RlIHRvIG1pbmltaXplIHRoZSBhY3R1YWwgaW5zZXJ0ZWQgY29kZSwgaXQgbXVzdCBub3QgZGVsZXRlCisvLy8gY29kZSBpbiB0aGUgY2FsbGVyIGFzIHVzZXJzIG9mIHRoaXMgcm91dGluZSBtYXkgaGF2ZSBwb2ludGVycyB0bworLy8vIGluc3RydWN0aW9ucyBpbiB0aGUgY2FsbGVyIHRoYXQgbmVlZCB0byByZW1haW4gc3RhYmxlLgorLy8vCisvLy8gSWYgRm9yd2FyZFZhckFyZ3NUbyBpcyBwYXNzZWQsIGlubGluaW5nIGEgZnVuY3Rpb24gd2l0aCB2YXJhcmdzIGlzIGFsbG93ZWQKKy8vLyBhbmQgYWxsIHZhcmFyZ3MgYXQgdGhlIGNhbGxzaXRlIHdpbGwgYmUgcGFzc2VkIHRvIGFueSBjYWxscyB0bworLy8vIEZvcndhcmRWYXJBcmdzVG8uIFRoZSBjYWxsZXIgb2YgSW5saW5lRnVuY3Rpb24gaGFzIHRvIG1ha2Ugc3VyZSBhbnkgdmFyYXJncworLy8vIGFyZSBvbmx5IHVzZWQgYnkgRm9yd2FyZFZhckFyZ3NUby4KK2Jvb2wgSW5saW5lRnVuY3Rpb24oQ2FsbEluc3QgKkMsIElubGluZUZ1bmN0aW9uSW5mbyAmSUZJLAorICAgICAgICAgICAgICAgICAgICBBQVJlc3VsdHMgKkNhbGxlZUFBUiA9IG51bGxwdHIsIGJvb2wgSW5zZXJ0TGlmZXRpbWUgPSB0cnVlKTsKK2Jvb2wgSW5saW5lRnVuY3Rpb24oSW52b2tlSW5zdCAqSUksIElubGluZUZ1bmN0aW9uSW5mbyAmSUZJLAorICAgICAgICAgICAgICAgICAgICBBQVJlc3VsdHMgKkNhbGxlZUFBUiA9IG51bGxwdHIsIGJvb2wgSW5zZXJ0TGlmZXRpbWUgPSB0cnVlKTsKK2Jvb2wgSW5saW5lRnVuY3Rpb24oQ2FsbFNpdGUgQ1MsIElubGluZUZ1bmN0aW9uSW5mbyAmSUZJLAorICAgICAgICAgICAgICAgICAgICBBQVJlc3VsdHMgKkNhbGxlZUFBUiA9IG51bGxwdHIsIGJvb2wgSW5zZXJ0TGlmZXRpbWUgPSB0cnVlLAorICAgICAgICAgICAgICAgICAgICBGdW5jdGlvbiAqRm9yd2FyZFZhckFyZ3NUbyA9IG51bGxwdHIpOworCisvLy8gXGJyaWVmIENsb25lcyBhIGxvb3AgXHAgT3JpZ0xvb3AuICBSZXR1cm5zIHRoZSBsb29wIGFuZCB0aGUgYmxvY2tzIGluIFxwCisvLy8gQmxvY2tzLgorLy8vCisvLy8gVXBkYXRlcyBMb29wSW5mbyBhbmQgRG9taW5hdG9yVHJlZSBhc3N1bWluZyB0aGUgbG9vcCBpcyBkb21pbmF0ZWQgYnkgYmxvY2sKKy8vLyBccCBMb29wRG9tQkIuICBJbnNlcnQgdGhlIG5ldyBibG9ja3MgYmVmb3JlIGJsb2NrIHNwZWNpZmllZCBpbiBccCBCZWZvcmUuCisvLy8gTm90ZTogT25seSBpbm5lcm1vc3QgbG9vcHMgYXJlIHN1cHBvcnRlZC4KK0xvb3AgKmNsb25lTG9vcFdpdGhQcmVoZWFkZXIoQmFzaWNCbG9jayAqQmVmb3JlLCBCYXNpY0Jsb2NrICpMb29wRG9tQkIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExvb3AgKk9yaWdMb29wLCBWYWx1ZVRvVmFsdWVNYXBUeSAmVk1hcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVHdpbmUgJk5hbWVTdWZmaXgsIExvb3BJbmZvICpMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9taW5hdG9yVHJlZSAqRFQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxCYXNpY0Jsb2NrICo+ICZCbG9ja3MpOworCisvLy8gXGJyaWVmIFJlbWFwcyBpbnN0cnVjdGlvbnMgaW4gXHAgQmxvY2tzIHVzaW5nIHRoZSBtYXBwaW5nIGluIFxwIFZNYXAuCit2b2lkIHJlbWFwSW5zdHJ1Y3Rpb25zSW5CbG9ja3MoY29uc3QgU21hbGxWZWN0b3JJbXBsPEJhc2ljQmxvY2sgKj4gJkJsb2NrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVRvVmFsdWVNYXBUeSAmVk1hcCk7CisKKy8vLyBTcGxpdCBlZGdlIGJldHdlZW4gQkIgYW5kIFByZWRCQiBhbmQgZHVwbGljYXRlIGFsbCBub24tUGhpIGluc3RydWN0aW9ucworLy8vIGZyb20gQkIgYmV0d2VlbiBpdHMgYmVnaW5uaW5nIGFuZCB0aGUgU3RvcEF0IGluc3RydWN0aW9uIGludG8gdGhlIHNwbGl0CisvLy8gYmxvY2suIFBoaSBub2RlcyBhcmUgbm90IGR1cGxpY2F0ZWQsIGJ1dCB0aGVpciB1c2VzIGFyZSBoYW5kbGVkIGNvcnJlY3RseToKKy8vLyB3ZSByZXBsYWNlIHRoZW0gd2l0aCB0aGUgdXNlcyBvZiBjb3JyZXNwb25kaW5nIFBoaSBpbnB1dHMuIFZhbHVlTWFwcGluZworLy8vIGlzIHVzZWQgdG8gbWFwIHRoZSBvcmlnaW5hbCBpbnN0cnVjdGlvbnMgZnJvbSBCQiB0byB0aGVpciBuZXdseS1jcmVhdGVkCisvLy8gY29waWVzLiBSZXR1cm5zIHRoZSBzcGxpdCBibG9jay4KK0Jhc2ljQmxvY2sgKgorRHVwbGljYXRlSW5zdHJ1Y3Rpb25zSW5TcGxpdEJldHdlZW4oQmFzaWNCbG9jayAqQkIsIEJhc2ljQmxvY2sgKlByZWRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RydWN0aW9uICpTdG9wQXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVRvVmFsdWVNYXBUeSAmVmFsdWVNYXBwaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyKTsKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfQ0xPTklOR19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQ29kZUV4dHJhY3Rvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0NvZGVFeHRyYWN0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2QzNDUxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0NvZGVFeHRyYWN0b3IuaApAQCAtMCwwICsxLDE3MiBAQAorLy89PT0tIFRyYW5zZm9ybS9VdGlscy9Db2RlRXh0cmFjdG9yLmggLSBDb2RlIGV4dHJhY3Rpb24gdXRpbCAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBBIHV0aWxpdHkgdG8gc3VwcG9ydCBleHRyYWN0aW5nIGNvZGUgZnJvbSBvbmUgZnVuY3Rpb24gaW50byBpdHMgb3duCisvLyBzdGFuZC1hbG9uZSBmdW5jdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19DT0RFRVhUUkFDVE9SX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0NPREVFWFRSQUNUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgorI2luY2x1ZGUgPGxpbWl0cz4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgQmxvY2tGcmVxdWVuY3k7CitjbGFzcyBCbG9ja0ZyZXF1ZW5jeUluZm87CitjbGFzcyBCcmFuY2hQcm9iYWJpbGl0eUluZm87CitjbGFzcyBEb21pbmF0b3JUcmVlOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIExvb3A7CitjbGFzcyBNb2R1bGU7CitjbGFzcyBUeXBlOworY2xhc3MgVmFsdWU7CisKKyAgLy8vIFxicmllZiBVdGlsaXR5IGNsYXNzIGZvciBleHRyYWN0aW5nIGNvZGUgaW50byBhIG5ldyBmdW5jdGlvbi4KKyAgLy8vCisgIC8vLyBUaGlzIHV0aWxpdHkgcHJvdmlkZXMgYSBzaW1wbGUgaW50ZXJmYWNlIGZvciBleHRyYWN0aW5nIHNvbWUgc2VxdWVuY2Ugb2YKKyAgLy8vIGNvZGUgaW50byBpdHMgb3duIGZ1bmN0aW9uLCByZXBsYWNpbmcgaXQgd2l0aCBhIGNhbGwgdG8gdGhhdCBmdW5jdGlvbi4gSXQKKyAgLy8vIGFsc28gcHJvdmlkZXMgdmFyaW91cyBtZXRob2RzIHRvIHF1ZXJ5IGFib3V0IHRoZSBuYXR1cmUgYW5kIHJlc3VsdCBvZgorICAvLy8gc3VjaCBhIHRyYW5zZm9ybWF0aW9uLgorICAvLy8KKyAgLy8vIFRoZSByb3VnaCBhbGdvcml0aG0gdXNlZCBpczoKKyAgLy8vIDEpIEZpbmQgYm90aCB0aGUgaW5wdXRzIGFuZCBvdXRwdXRzIGZvciB0aGUgZXh0cmFjdGVkIHJlZ2lvbi4KKyAgLy8vIDIpIFBhc3MgdGhlIGlucHV0cyBhcyBhcmd1bWVudHMsIHJlbWFwcGluZyB0aGVtIHdpdGhpbiB0aGUgZXh0cmFjdGVkCisgIC8vLyAgICBmdW5jdGlvbiB0byBhcmd1bWVudHMuCisgIC8vLyAzKSBBZGQgYWxsb2NhcyBmb3IgYW55IHNjYWxhciBvdXRwdXRzLCBhZGRpbmcgYWxsIG9mIHRoZSBvdXRwdXRzJyBhbGxvY2FzCisgIC8vLyAgICBhcyBhcmd1bWVudHMsIGFuZCBpbnNlcnRpbmcgc3RvcmVzIHRvIHRoZSBhcmd1bWVudHMgZm9yIGFueSBzY2FsYXJzLgorICBjbGFzcyBDb2RlRXh0cmFjdG9yIHsKKyAgICB1c2luZyBWYWx1ZVNldCA9IFNldFZlY3RvcjxWYWx1ZSAqPjsKKworICAgIC8vIFZhcmlvdXMgYml0cyBvZiBzdGF0ZSBjb21wdXRlZCBvbiBjb25zdHJ1Y3Rpb24uCisgICAgRG9taW5hdG9yVHJlZSAqY29uc3QgRFQ7CisgICAgY29uc3QgYm9vbCBBZ2dyZWdhdGVBcmdzOworICAgIEJsb2NrRnJlcXVlbmN5SW5mbyAqQkZJOworICAgIEJyYW5jaFByb2JhYmlsaXR5SW5mbyAqQlBJOworCisgICAgLy8gSWYgdHJ1ZSwgdmFyYXJncyBmdW5jdGlvbnMgY2FuIGJlIGV4dHJhY3RlZC4KKyAgICBib29sIEFsbG93VmFyQXJnczsKKworICAgIC8vIEJpdHMgb2YgaW50ZXJtZWRpYXRlIHN0YXRlIGNvbXB1dGVkIGF0IHZhcmlvdXMgcGhhc2VzIG9mIGV4dHJhY3Rpb24uCisgICAgU2V0VmVjdG9yPEJhc2ljQmxvY2sgKj4gQmxvY2tzOworICAgIHVuc2lnbmVkIE51bUV4aXRCbG9ja3MgPSBzdGQ6Om51bWVyaWNfbGltaXRzPHVuc2lnbmVkPjo6bWF4KCk7CisgICAgVHlwZSAqUmV0VHk7CisKKyAgcHVibGljOgorICAgIC8vLyBcYnJpZWYgQ3JlYXRlIGEgY29kZSBleHRyYWN0b3IgZm9yIGEgc2VxdWVuY2Ugb2YgYmxvY2tzLgorICAgIC8vLworICAgIC8vLyBHaXZlbiBhIHNlcXVlbmNlIG9mIGJhc2ljIGJsb2NrcyB3aGVyZSB0aGUgZmlyc3QgYmxvY2sgaW4gdGhlIHNlcXVlbmNlCisgICAgLy8vIGRvbWluYXRlcyB0aGUgcmVzdCwgcHJlcGFyZSBhIGNvZGUgZXh0cmFjdG9yIG9iamVjdCBmb3IgcHVsbGluZyB0aGlzCisgICAgLy8vIHNlcXVlbmNlIG91dCBpbnRvIGl0cyBuZXcgZnVuY3Rpb24uIFdoZW4gYSBEb21pbmF0b3JUcmVlIGlzIGFsc28gZ2l2ZW4sCisgICAgLy8vIGV4dHJhIGNoZWNraW5nIGFuZCB0cmFuc2Zvcm1hdGlvbnMgYXJlIGVuYWJsZWQuIElmIEFsbG93VmFyQXJncyBpcyB0cnVlLAorICAgIC8vLyB2YXJhcmcgZnVuY3Rpb25zIGNhbiBiZSBleHRyYWN0ZWQuIFRoaXMgaXMgc2FmZSwgaWYgYWxsIHZhcmFyZyBoYW5kbGluZworICAgIC8vLyBjb2RlIGlzIGV4dHJhY3RlZCwgaW5jbHVkaW5nIHZhc3RhcnQuCisgICAgQ29kZUV4dHJhY3RvcihBcnJheVJlZjxCYXNpY0Jsb2NrICo+IEJCcywgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgYm9vbCBBZ2dyZWdhdGVBcmdzID0gZmFsc2UsIEJsb2NrRnJlcXVlbmN5SW5mbyAqQkZJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgIEJyYW5jaFByb2JhYmlsaXR5SW5mbyAqQlBJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dWYXJBcmdzID0gZmFsc2UpOworCisgICAgLy8vIFxicmllZiBDcmVhdGUgYSBjb2RlIGV4dHJhY3RvciBmb3IgYSBsb29wIGJvZHkuCisgICAgLy8vCisgICAgLy8vIEJlaGF2ZXMganVzdCBsaWtlIHRoZSBnZW5lcmljIGNvZGUgc2VxdWVuY2UgY29uc3RydWN0b3IsIGJ1dCB1c2VzIHRoZQorICAgIC8vLyBibG9jayBzZXF1ZW5jZSBvZiB0aGUgbG9vcC4KKyAgICBDb2RlRXh0cmFjdG9yKERvbWluYXRvclRyZWUgJkRULCBMb29wICZMLCBib29sIEFnZ3JlZ2F0ZUFyZ3MgPSBmYWxzZSwKKyAgICAgICAgICAgICAgICAgIEJsb2NrRnJlcXVlbmN5SW5mbyAqQkZJID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgIEJyYW5jaFByb2JhYmlsaXR5SW5mbyAqQlBJID0gbnVsbHB0cik7CisKKyAgICAvLy8gXGJyaWVmIENoZWNrIHRvIHNlZSBpZiBhIGJsb2NrIGlzIHZhbGlkIGZvciBleHRyYWN0aW9uLgorICAgIC8vLworICAgIC8vLyBCbG9ja3MgY29udGFpbmluZyBFSFBhZHMsIGFsbG9jYXMgYW5kIGludm9rZXMgYXJlIG5vdCB2YWxpZC4gSWYKKyAgICAvLy8gQWxsb3dWYXJBcmdzIGlzIHRydWUsIGJsb2NrcyB3aXRoIHZhc3RhcnQgY2FuIGJlIGV4dHJhY3RlZC4gVGhpcyBpcworICAgIC8vLyBzYWZlLCBpZiBhbGwgdmFyYXJnIGhhbmRsaW5nIGNvZGUgaXMgZXh0cmFjdGVkLCBpbmNsdWRpbmcgdmFzdGFydC4KKyAgICBzdGF0aWMgYm9vbCBpc0Jsb2NrVmFsaWRGb3JFeHRyYWN0aW9uKGNvbnN0IEJhc2ljQmxvY2sgJkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd1ZhckFyZ3MpOworCisgICAgLy8vIFxicmllZiBQZXJmb3JtIHRoZSBleHRyYWN0aW9uLCByZXR1cm5pbmcgdGhlIG5ldyBmdW5jdGlvbi4KKyAgICAvLy8KKyAgICAvLy8gUmV0dXJucyB6ZXJvIHdoZW4gY2FsbGVkIG9uIGEgQ29kZUV4dHJhY3RvciBpbnN0YW5jZSB3aGVyZSBpc0VsaWdpYmxlCisgICAgLy8vIHJldHVybnMgZmFsc2UuCisgICAgRnVuY3Rpb24gKmV4dHJhY3RDb2RlUmVnaW9uKCk7CisKKyAgICAvLy8gXGJyaWVmIFRlc3Qgd2hldGhlciB0aGlzIGNvZGUgZXh0cmFjdG9yIGlzIGVsaWdpYmxlLgorICAgIC8vLworICAgIC8vLyBCYXNlZCBvbiB0aGUgYmxvY2tzIHVzZWQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGNvZGUgZXh0cmFjdG9yLAorICAgIC8vLyBkZXRlcm1pbmUgd2hldGhlciBpdCBpcyBlbGlnaWJsZSBmb3IgZXh0cmFjdGlvbi4KKyAgICBib29sIGlzRWxpZ2libGUoKSBjb25zdCB7IHJldHVybiAhQmxvY2tzLmVtcHR5KCk7IH0KKworICAgIC8vLyBcYnJpZWYgQ29tcHV0ZSB0aGUgc2V0IG9mIGlucHV0IHZhbHVlcyBhbmQgb3V0cHV0IHZhbHVlcyBmb3IgdGhlIGNvZGUuCisgICAgLy8vCisgICAgLy8vIFRoZXNlIGNhbiBiZSB1c2VkIGVpdGhlciB3aGVuIHBlcmZvcm1pbmcgdGhlIGV4dHJhY3Rpb24gb3IgdG8gZXZhbHVhdGUKKyAgICAvLy8gdGhlIGV4cGVjdGVkIHNpemUgb2YgYSBjYWxsIHRvIHRoZSBleHRyYWN0ZWQgZnVuY3Rpb24uIE5vdGUgdGhhdCB0aGlzCisgICAgLy8vIHdvcmsgY2Fubm90IGJlIGNhY2hlZCBiZXR3ZWVuIHRoZSB0d28gYXMgb25jZSB3ZSBkZWNpZGUgdG8gZXh0cmFjdAorICAgIC8vLyBhIGNvZGUgc2VxdWVuY2UsIHRoYXQgc2VxdWVuY2UgaXMgbW9kaWZpZWQsIGluY2x1ZGluZyBjaGFuZ2luZyB0aGVzZQorICAgIC8vLyBzZXRzLCBiZWZvcmUgZXh0cmFjdGlvbiBvY2N1cnMuIFRoZXNlIG1vZGlmaWNhdGlvbnMgd29uJ3QgaGF2ZSBhbnkKKyAgICAvLy8gc2lnbmlmaWNhbnQgaW1wYWN0IG9uIHRoZSBjb3N0IGhvd2V2ZXIuCisgICAgdm9pZCBmaW5kSW5wdXRzT3V0cHV0cyhWYWx1ZVNldCAmSW5wdXRzLCBWYWx1ZVNldCAmT3V0cHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhbHVlU2V0ICZBbGxvY2FzKSBjb25zdDsKKworICAgIC8vLyBDaGVjayBpZiBsaWZlIHRpbWUgbWFya2VyIG5vZGVzIGNhbiBiZSBob2lzdGVkL3N1bmsgaW50byB0aGUgb3V0bGluZQorICAgIC8vLyByZWdpb24uCisgICAgLy8vCisgICAgLy8vIFJldHVybnMgdHJ1ZSBpZiBpdCBpcyBzYWZlIHRvIGRvIHRoZSBjb2RlIG1vdGlvbi4KKyAgICBib29sIGlzTGVnYWxUb1Nocmlua3dyYXBMaWZldGltZU1hcmtlcnMoSW5zdHJ1Y3Rpb24gKkFsbG9jYUFkZHIpIGNvbnN0OworCisgICAgLy8vIEZpbmQgdGhlIHNldCBvZiBhbGxvY2FzIHdob3NlIGxpZmUgcmFuZ2VzIGFyZSBjb250YWluZWQgd2l0aGluIHRoZQorICAgIC8vLyBvdXRsaW5lZCByZWdpb24uCisgICAgLy8vCisgICAgLy8vIEFsbG9jYXMgd2hpY2ggaGF2ZSBsaWZlX3RpbWUgbWFya2VycyBjb250YWluZWQgaW4gdGhlIG91dGxpbmVkIHJlZ2lvbgorICAgIC8vLyBzaG91bGQgYmUgcHVzaGVkIHRvIHRoZSBvdXRsaW5lZCBmdW5jdGlvbi4gVGhlIGFkZHJlc3MgYml0Y2FzdHMgdGhhdAorICAgIC8vLyBhcmUgdXNlZCBieSB0aGUgbGlmZXRpbWUgbWFya2VycyBhcmUgYWxzbyBjYW5kaWRhdGVzIGZvciBzaHJpbmstCisgICAgLy8vIHdyYXBwaW5nLiBUaGUgaW5zdHJ1Y3Rpb25zIHRoYXQgbmVlZCB0byBiZSBzdW5rIGFyZSBjb2xsZWN0ZWQgaW4KKyAgICAvLy8gJ0FsbG9jYXMnLgorICAgIHZvaWQgZmluZEFsbG9jYXMoVmFsdWVTZXQgJlNpbmtDYW5kcywgVmFsdWVTZXQgJkhvaXN0Q2FuZHMsCisgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrIComRXhpdEJsb2NrKSBjb25zdDsKKworICAgIC8vLyBGaW5kIG9yIGNyZWF0ZSBhIGJsb2NrIHdpdGhpbiB0aGUgb3V0bGluZSByZWdpb24gZm9yIHBsYWNpbmcgaG9pc3RlZAorICAgIC8vLyBjb2RlLgorICAgIC8vLworICAgIC8vLyBDb21tb25FeGl0QmxvY2sgaXMgYmxvY2sgb3V0c2lkZSB0aGUgb3V0bGluZSByZWdpb24uIEl0IGlzIHRoZSBjb21tb24KKyAgICAvLy8gc3VjY2Vzc29yIG9mIGJsb2NrcyBpbnNpZGUgdGhlIHJlZ2lvbi4gSWYgdGhlcmUgZXhpc3RzIGEgc2luZ2xlIGJsb2NrCisgICAgLy8vIGluc2lkZSB0aGUgcmVnaW9uIHRoYXQgaXMgdGhlIHByZWRlY2Vzc29yIG9mIENvbW1vbkV4aXRCbG9jaywgdGhhdCBibG9jaworICAgIC8vLyB3aWxsIGJlIHJldHVybmVkLiBPdGhlcndpc2UgQ29tbW9uRXhpdEJsb2NrIHdpbGwgYmUgc3BsaXQgYW5kIHRoZQorICAgIC8vLyBvcmlnaW5hbCBibG9jayB3aWxsIGJlIGFkZGVkIHRvIHRoZSBvdXRsaW5lIHJlZ2lvbi4KKyAgICBCYXNpY0Jsb2NrICpmaW5kT3JDcmVhdGVCbG9ja0ZvckhvaXN0aW5nKEJhc2ljQmxvY2sgKkNvbW1vbkV4aXRCbG9jayk7CisKKyAgcHJpdmF0ZToKKyAgICB2b2lkIHNldmVyU3BsaXRQSElOb2RlcyhCYXNpY0Jsb2NrIComSGVhZGVyKTsKKyAgICB2b2lkIHNwbGl0UmV0dXJuQmxvY2tzKCk7CisKKyAgICBGdW5jdGlvbiAqY29uc3RydWN0RnVuY3Rpb24oY29uc3QgVmFsdWVTZXQgJmlucHV0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmFsdWVTZXQgJm91dHB1dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKmhlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQmFzaWNCbG9jayAqbmV3Um9vdE5vZGUsIEJhc2ljQmxvY2sgKm5ld0hlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRnVuY3Rpb24gKm9sZEZ1bmN0aW9uLCBNb2R1bGUgKk0pOworCisgICAgdm9pZCBtb3ZlQ29kZVRvRnVuY3Rpb24oRnVuY3Rpb24gKm5ld0Z1bmN0aW9uKTsKKworICAgIHZvaWQgY2FsY3VsYXRlTmV3Q2FsbFRlcm1pbmF0b3JXZWlnaHRzKAorICAgICAgICBCYXNpY0Jsb2NrICpDb2RlUmVwbGFjZXIsCisgICAgICAgIERlbnNlTWFwPEJhc2ljQmxvY2sgKiwgQmxvY2tGcmVxdWVuY3k+ICZFeGl0V2VpZ2h0cywKKyAgICAgICAgQnJhbmNoUHJvYmFiaWxpdHlJbmZvICpCUEkpOworCisgICAgdm9pZCBlbWl0Q2FsbEFuZFN3aXRjaFN0YXRlbWVudChGdW5jdGlvbiAqbmV3RnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYXNpY0Jsb2NrICpuZXdIZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZVNldCAmaW5wdXRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVTZXQgJm91dHB1dHMpOworICB9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0NPREVFWFRSQUNUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0N0b3JVdGlscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0N0b3JVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZTU2NGQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvQ3RvclV0aWxzLmgKQEAgLTAsMCArMSwzMiBAQAorLy89PT0tIEN0b3JVdGlscy5oIC0gSGVscGVycyBmb3Igd29ya2luZyB3aXRoIGdsb2JhbF9jdG9ycyAtLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBmdW5jdGlvbnMgdGhhdCBhcmUgdXNlZCB0byBwcm9jZXNzIGxsdm0uZ2xvYmFsX2N0b3JzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0NUT1JVVElMU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19DVE9SVVRJTFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgR2xvYmFsVmFyaWFibGU7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIE1vZHVsZTsKKworLy8vIENhbGwgIlNob3VsZFJlbW92ZSIgZm9yIGV2ZXJ5IGVudHJ5IGluIE0ncyBnbG9iYWxfY3RvciBsaXN0IGFuZCByZW1vdmUgdGhlCisvLy8gZW50cmllcyBmb3Igd2hpY2ggaXQgcmV0dXJucyB0cnVlLiAgUmV0dXJuIHRydWUgaWYgYW55dGhpbmcgY2hhbmdlZC4KK2Jvb2wgb3B0aW1pemVHbG9iYWxDdG9yc0xpc3QoTW9kdWxlICZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdW5jdGlvbl9yZWY8Ym9vbChGdW5jdGlvbiAqKT4gU2hvdWxkUmVtb3ZlKTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvRW50cnlFeGl0SW5zdHJ1bWVudGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvRW50cnlFeGl0SW5zdHJ1bWVudGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjUwYzVjOQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9FbnRyeUV4aXRJbnN0cnVtZW50ZXIuaApAQCAtMCwwICsxLDM2IEBACisvLz09PS0gRW50cnlFeGl0SW5zdHJ1bWVudGVyLmggLSBGdW5jdGlvbiBFbnRyeS9FeGl0IEluc3RydW1lbnRhdGlvbiAtLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIEVudHJ5RXhpdEluc3RydW1lbnRlciBwYXNzIC0gSW5zdHJ1bWVudCBmdW5jdGlvbiBlbnRyeS9leGl0IHdpdGggY2FsbHMgdG8KKy8vIG1jb3VudCgpLCBAX19jeWdfcHJvZmlsZV9mdW5jX3tlbnRlcixleGl0fSBhbmQgdGhlIGxpa2UuIFRoZXJlIGFyZSB0d28KKy8vIHZhcmlhbnRzLCBpbnRlbmRlZCB0byBydW4gcHJlLSBhbmQgcG9zdC1pbmxpbmluZywgcmVzcGVjdGl2ZWx5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0VOVFJZRVhJVElOU1RSVU1FTlRFUl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19FTlRSWUVYSVRJTlNUUlVNRU5URVJfSAorCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworCitzdHJ1Y3QgRW50cnlFeGl0SW5zdHJ1bWVudGVyUGFzcworICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48RW50cnlFeGl0SW5zdHJ1bWVudGVyUGFzcz4geworICBFbnRyeUV4aXRJbnN0cnVtZW50ZXJQYXNzKGJvb2wgUG9zdElubGluaW5nKSA6IFBvc3RJbmxpbmluZyhQb3N0SW5saW5pbmcpIHt9CisKKyAgUHJlc2VydmVkQW5hbHlzZXMgcnVuKEZ1bmN0aW9uICZGLCBGdW5jdGlvbkFuYWx5c2lzTWFuYWdlciAmQU0pOworCisgIGJvb2wgUG9zdElubGluaW5nOworfTsKKworfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0VOVFJZRVhJVElOU1RSVU1FTlRFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvRXNjYXBlRW51bWVyYXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0VzY2FwZUVudW1lcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjU2ZGZkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0VzY2FwZUVudW1lcmF0b3IuaApAQCAtMCwwICsxLDQ5IEBACisvLz09PS0tIEVzY2FwZUVudW1lcmF0b3IuaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIERlZmluZXMgYSBoZWxwZXIgY2xhc3MgdGhhdCBlbnVtZXJhdGVzIGFsbCBwb3NzaWJsZSBleGl0cyBmcm9tIGEgZnVuY3Rpb24sCisvLyBpbmNsdWRpbmcgZXhjZXB0aW9uIGhhbmRsaW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0VTQ0FQRUVOVU1FUkFUT1JfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfRVNDQVBFRU5VTUVSQVRPUl9ICisKKyNpbmNsdWRlICJsbHZtL0lSL0Z1bmN0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JUkJ1aWxkZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gRXNjYXBlRW51bWVyYXRvciAtIFRoaXMgaXMgYSBsaXR0bGUgYWxnb3JpdGhtIHRvIGZpbmQgYWxsIGVzY2FwZSBwb2ludHMKKy8vLyBmcm9tIGEgZnVuY3Rpb24gc28gdGhhdCAiZmluYWxseSItc3R5bGUgY29kZSBjYW4gYmUgaW5zZXJ0ZWQuIEluIGFkZGl0aW9uCisvLy8gdG8gZmluZGluZyB0aGUgZXhpc3RpbmcgcmV0dXJuIGFuZCB1bndpbmQgaW5zdHJ1Y3Rpb25zLCBpdCBhbHNvIChpZgorLy8vIG5lY2Vzc2FyeSkgdHJhbnNmb3JtcyBhbnkgY2FsbCBpbnN0cnVjdGlvbnMgaW50byBpbnZva2VzIGFuZCBzZW5kcyB0aGVtIHRvCisvLy8gYSBsYW5kaW5nIHBhZC4KK2NsYXNzIEVzY2FwZUVudW1lcmF0b3IgeworICBGdW5jdGlvbiAmRjsKKyAgY29uc3QgY2hhciAqQ2xlYW51cEJCTmFtZTsKKworICBGdW5jdGlvbjo6aXRlcmF0b3IgU3RhdGVCQiwgU3RhdGVFOworICBJUkJ1aWxkZXI8PiBCdWlsZGVyOworICBib29sIERvbmU7CisgIGJvb2wgSGFuZGxlRXhjZXB0aW9uczsKKworcHVibGljOgorICBFc2NhcGVFbnVtZXJhdG9yKEZ1bmN0aW9uICZGLCBjb25zdCBjaGFyICpOID0gImNsZWFudXAiLAorICAgICAgICAgICAgICAgICAgIGJvb2wgSGFuZGxlRXhjZXB0aW9ucyA9IHRydWUpCisgICAgICA6IEYoRiksIENsZWFudXBCQk5hbWUoTiksIFN0YXRlQkIoRi5iZWdpbigpKSwgU3RhdGVFKEYuZW5kKCkpLAorICAgICAgICBCdWlsZGVyKEYuZ2V0Q29udGV4dCgpKSwgRG9uZShmYWxzZSksCisgICAgICAgIEhhbmRsZUV4Y2VwdGlvbnMoSGFuZGxlRXhjZXB0aW9ucykge30KKworICBJUkJ1aWxkZXI8PiAqTmV4dCgpOworfTsKKworfQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0VTQ0FQRUVOVU1FUkFUT1JfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0V2YWx1YXRvci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0V2YWx1YXRvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlOTg3YjkKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvRXZhbHVhdG9yLmgKQEAgLTAsMCArMSwxMjAgQEAKKy8vPT09LSBFdmFsdWF0b3IuaCAtIExMVk0gSVIgZXZhbHVhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRnVuY3Rpb24gZXZhbHVhdG9yIGZvciBMTFZNIElSLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0VWQUxVQVRPUl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19FVkFMVUFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFB0clNldC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1NtYWxsVmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9CYXNpY0Jsb2NrLmgiCisjaW5jbHVkZSAibGx2bS9JUi9HbG9iYWxWYXJpYWJsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWUuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ2FzdGluZy5oIgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8ZGVxdWU+CisjaW5jbHVkZSA8bWVtb3J5PgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIERhdGFMYXlvdXQ7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIFRhcmdldExpYnJhcnlJbmZvOworCisvLy8gVGhpcyBjbGFzcyBldmFsdWF0ZXMgTExWTSBJUiwgcHJvZHVjaW5nIHRoZSBDb25zdGFudCByZXByZXNlbnRpbmcgZWFjaCBTU0EKKy8vLyBpbnN0cnVjdGlvbi4gIENoYW5nZXMgdG8gZ2xvYmFsIHZhcmlhYmxlcyBhcmUgc3RvcmVkIGluIGEgbWFwcGluZyB0aGF0IGNhbgorLy8vIGJlIGl0ZXJhdGVkIG92ZXIgYWZ0ZXIgdGhlIGV2YWx1YXRpb24gaXMgY29tcGxldGUuICBPbmNlIGFuIGV2YWx1YXRpb24gY2FsbAorLy8vIGZhaWxzLCB0aGUgZXZhbHVhdGlvbiBvYmplY3Qgc2hvdWxkIG5vdCBiZSByZXVzZWQuCitjbGFzcyBFdmFsdWF0b3IgeworcHVibGljOgorICBFdmFsdWF0b3IoY29uc3QgRGF0YUxheW91dCAmREwsIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEkpCisgICAgICA6IERMKERMKSwgVExJKFRMSSkgeworICAgIFZhbHVlU3RhY2suZW1wbGFjZV9iYWNrKCk7CisgIH0KKworICB+RXZhbHVhdG9yKCkgeworICAgIGZvciAoYXV0byAmVG1wIDogQWxsb2NhVG1wcykKKyAgICAgIC8vIElmIHRoZXJlIGFyZSBzdGlsbCB1c2VycyBvZiB0aGUgYWxsb2NhLCB0aGUgcHJvZ3JhbSBpcyBkb2luZyBzb21ldGhpbmcKKyAgICAgIC8vIHNpbGx5LCBlLmcuIHN0b3JpbmcgdGhlIGFkZHJlc3Mgb2YgdGhlIGFsbG9jYSBzb21ld2hlcmUgYW5kIHVzaW5nIGl0CisgICAgICAvLyBsYXRlci4gIFNpbmNlIHRoaXMgaXMgdW5kZWZpbmVkLCB3ZSdsbCBqdXN0IG1ha2UgaXQgYmUgbnVsbC4KKyAgICAgIGlmICghVG1wLT51c2VfZW1wdHkoKSkKKyAgICAgICAgVG1wLT5yZXBsYWNlQWxsVXNlc1dpdGgoQ29uc3RhbnQ6OmdldE51bGxWYWx1ZShUbXAtPmdldFR5cGUoKSkpOworICB9CisKKyAgLy8vIEV2YWx1YXRlIGEgY2FsbCB0byBmdW5jdGlvbiBGLCByZXR1cm5pbmcgdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZSBpZiB3ZQorICAvLy8gY2FuJ3QgZXZhbHVhdGUgaXQuICBBY3R1YWxBcmdzIGNvbnRhaW5zIHRoZSBmb3JtYWwgYXJndW1lbnRzIGZvciB0aGUKKyAgLy8vIGZ1bmN0aW9uLgorICBib29sIEV2YWx1YXRlRnVuY3Rpb24oRnVuY3Rpb24gKkYsIENvbnN0YW50IComUmV0VmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU21hbGxWZWN0b3JJbXBsPENvbnN0YW50Kj4gJkFjdHVhbEFyZ3MpOworCisgIC8vLyBFdmFsdWF0ZSBhbGwgaW5zdHJ1Y3Rpb25zIGluIGJsb2NrIEJCLCByZXR1cm5pbmcgdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZQorICAvLy8gaWYgd2UgY2FuJ3QgZXZhbHVhdGUgaXQuICBOZXdCQiByZXR1cm5zIHRoZSBuZXh0IEJCIHRoYXQgY29udHJvbCBmbG93cworICAvLy8gaW50bywgb3IgbnVsbCB1cG9uIHJldHVybi4KKyAgYm9vbCBFdmFsdWF0ZUJsb2NrKEJhc2ljQmxvY2s6Oml0ZXJhdG9yIEN1ckluc3QsIEJhc2ljQmxvY2sgKiZOZXh0QkIpOworCisgIENvbnN0YW50ICpnZXRWYWwoVmFsdWUgKlYpIHsKKyAgICBpZiAoQ29uc3RhbnQgKkNWID0gZHluX2Nhc3Q8Q29uc3RhbnQ+KFYpKSByZXR1cm4gQ1Y7CisgICAgQ29uc3RhbnQgKlIgPSBWYWx1ZVN0YWNrLmJhY2soKS5sb29rdXAoVik7CisgICAgYXNzZXJ0KFIgJiYgIlJlZmVyZW5jZSB0byBhbiB1bmNvbXB1dGVkIHZhbHVlISIpOworICAgIHJldHVybiBSOworICB9CisKKyAgdm9pZCBzZXRWYWwoVmFsdWUgKlYsIENvbnN0YW50ICpDKSB7CisgICAgVmFsdWVTdGFjay5iYWNrKClbVl0gPSBDOworICB9CisKKyAgY29uc3QgRGVuc2VNYXA8Q29uc3RhbnQqLCBDb25zdGFudCo+ICZnZXRNdXRhdGVkTWVtb3J5KCkgY29uc3QgeworICAgIHJldHVybiBNdXRhdGVkTWVtb3J5OworICB9CisKKyAgY29uc3QgU21hbGxQdHJTZXRJbXBsPEdsb2JhbFZhcmlhYmxlKj4gJmdldEludmFyaWFudHMoKSBjb25zdCB7CisgICAgcmV0dXJuIEludmFyaWFudHM7CisgIH0KKworcHJpdmF0ZToKKyAgQ29uc3RhbnQgKkNvbXB1dGVMb2FkUmVzdWx0KENvbnN0YW50ICpQKTsKKworICAvLy8gQXMgd2UgY29tcHV0ZSBTU0EgcmVnaXN0ZXIgdmFsdWVzLCB3ZSBzdG9yZSB0aGVpciBjb250ZW50cyBoZXJlLiBUaGUgYmFjaworICAvLy8gb2YgdGhlIGRlcXVlIGNvbnRhaW5zIHRoZSBjdXJyZW50IGZ1bmN0aW9uIGFuZCB0aGUgc3RhY2sgY29udGFpbnMgdGhlCisgIC8vLyB2YWx1ZXMgaW4gdGhlIGNhbGxpbmcgZnJhbWVzLgorICBzdGQ6OmRlcXVlPERlbnNlTWFwPFZhbHVlKiwgQ29uc3RhbnQqPj4gVmFsdWVTdGFjazsKKworICAvLy8gVGhpcyBpcyB1c2VkIHRvIGRldGVjdCByZWN1cnNpb24uICBJbiBwYXRob2xvZ2ljYWwgc2l0dWF0aW9ucyB3ZSBjb3VsZCBoaXQKKyAgLy8vIGV4cG9uZW50aWFsIGJlaGF2aW9yLCBidXQgYXQgbGVhc3QgdGhlcmUgaXMgbm90aGluZyB1bmJvdW5kZWQuCisgIFNtYWxsVmVjdG9yPEZ1bmN0aW9uKiwgND4gQ2FsbFN0YWNrOworCisgIC8vLyBGb3IgZWFjaCBzdG9yZSB3ZSBleGVjdXRlLCB3ZSB1cGRhdGUgdGhpcyBtYXAuICBMb2FkcyBjaGVjayB0aGlzIHRvIGdldAorICAvLy8gdGhlIG1vc3QgdXAtdG8tZGF0ZSB2YWx1ZS4gIElmIGV2YWx1YXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhpcyBzdGF0ZSBpcworICAvLy8gY29tbWl0dGVkIHRvIHRoZSBwcm9jZXNzLgorICBEZW5zZU1hcDxDb25zdGFudCosIENvbnN0YW50Kj4gTXV0YXRlZE1lbW9yeTsKKworICAvLy8gVG8gJ2V4ZWN1dGUnIGFuIGFsbG9jYSwgd2UgY3JlYXRlIGEgdGVtcG9yYXJ5IGdsb2JhbCB2YXJpYWJsZSB0byByZXByZXNlbnQKKyAgLy8vIGl0cyBib2R5LiAgVGhpcyB2ZWN0b3IgaXMgbmVlZGVkIHNvIHdlIGNhbiBkZWxldGUgdGhlIHRlbXBvcmFyeSBnbG9iYWxzCisgIC8vLyB3aGVuIHdlIGFyZSBkb25lLgorICBTbWFsbFZlY3RvcjxzdGQ6OnVuaXF1ZV9wdHI8R2xvYmFsVmFyaWFibGU+LCAzMj4gQWxsb2NhVG1wczsKKworICAvLy8gVGhlc2UgZ2xvYmFsIHZhcmlhYmxlcyBoYXZlIGJlZW4gbWFya2VkIGludmFyaWFudCBieSB0aGUgc3RhdGljCisgIC8vLyBjb25zdHJ1Y3Rvci4KKyAgU21hbGxQdHJTZXQ8R2xvYmFsVmFyaWFibGUqLCA4PiBJbnZhcmlhbnRzOworCisgIC8vLyBUaGVzZSBhcmUgY29uc3RhbnRzIHdlIGhhdmUgY2hlY2tlZCBhbmQga25vdyB0byBiZSBzaW1wbGUgZW5vdWdoIHRvIGxpdmUKKyAgLy8vIGluIGEgc3RhdGljIGluaXRpYWxpemVyIG9mIGEgZ2xvYmFsLgorICBTbWFsbFB0clNldDxDb25zdGFudCosIDg+IFNpbXBsZUNvbnN0YW50czsKKworICBjb25zdCBEYXRhTGF5b3V0ICZETDsKKyAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfRVZBTFVBVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9GdW5jdGlvbkNvbXBhcmF0b3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9GdW5jdGlvbkNvbXBhcmF0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Njk4YTA2Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0Z1bmN0aW9uQ29tcGFyYXRvci5oCkBAIC0wLDAgKzEsMzkzIEBACisvLz09PS0gRnVuY3Rpb25Db21wYXJhdG9yLmggLSBGdW5jdGlvbiBDb21wYXJhdG9yIC0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHRoZSBGdW5jdGlvbkNvbXBhcmF0b3IgYW5kIEdsb2JhbE51bWJlclN0YXRlIGNsYXNzZXMgd2hpY2gKKy8vIGFyZSB1c2VkIGJ5IHRoZSBNZXJnZUZ1bmN0aW9ucyBwYXNzIGZvciBjb21wYXJpbmcgZnVuY3Rpb25zLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0ZVTkNUSU9OQ09NUEFSQVRPUl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19GVU5DVElPTkNPTVBBUkFUT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0F0dHJpYnV0ZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9ucy5oIiAKKyNpbmNsdWRlICJsbHZtL0lSL09wZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9BdG9taWNPcmRlcmluZy5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx0dXBsZT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBUEZsb2F0OworY2xhc3MgQVBJbnQ7CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgQ29uc3RhbnQ7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEdsb2JhbFZhbHVlOworY2xhc3MgSW5saW5lQXNtOworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBNRE5vZGU7CitjbGFzcyBUeXBlOworY2xhc3MgVmFsdWU7CisKKy8vLyBHbG9iYWxOdW1iZXJTdGF0ZSBhc3NpZ25zIGFuIGludGVnZXIgdG8gZWFjaCBnbG9iYWwgdmFsdWUgaW4gdGhlIHByb2dyYW0sCisvLy8gd2hpY2ggaXMgdXNlZCBieSB0aGUgY29tcGFyaXNvbiByb3V0aW5lIHRvIG9yZGVyIHJlZmVyZW5jZXMgdG8gZ2xvYmFscy4gVGhpcworLy8vIHN0YXRlIG11c3QgYmUgcHJlc2VydmVkIHRocm91Z2hvdXQgdGhlIHBhc3MsIGJlY2F1c2UgRnVuY3Rpb25zIGFuZCBvdGhlcgorLy8vIGdsb2JhbHMgbmVlZCB0byBtYWludGFpbiB0aGVpciByZWxhdGl2ZSBvcmRlci4gR2xvYmFscyBhcmUgYXNzaWduZWQgYSBudW1iZXIKKy8vLyB3aGVuIHRoZXkgYXJlIGZpcnN0IHZpc2l0ZWQuIFRoaXMgb3JkZXIgaXMgZGV0ZXJtaW5pc3RpYywgYW5kIHNvIHRoZQorLy8vIGFzc2lnbmVkIG51bWJlcnMgYXJlIGFzIHdlbGwuIFdoZW4gdHdvIGZ1bmN0aW9ucyBhcmUgbWVyZ2VkLCBuZWl0aGVyIG51bWJlcgorLy8vIGlzIHVwZGF0ZWQuIElmIHRoZSBzeW1ib2xzIGFyZSB3ZWFrLCB0aGlzIHdvdWxkIGJlIGluY29ycmVjdC4gSWYgdGhleSBhcmUKKy8vLyBzdHJvbmcsIHRoZW4gb25lIHdpbGwgYmUgcmVwbGFjZWQgYXQgYWxsIHJlZmVyZW5jZXMgdG8gdGhlIG90aGVyLCBhbmQgc28KKy8vLyBkaXJlY3QgY2FsbHNpdGVzIHdpbGwgbm93IHNlZSBvbmUgb3IgdGhlIG90aGVyIHN5bWJvbCwgYW5kIG5vIHVwZGF0ZSBpcworLy8vIG5lY2Vzc2FyeS4gTm90ZSB0aGF0IGlmIHdlIHdlcmUgZ3VhcmFudGVlZCB1bmlxdWUgbmFtZXMsIHdlIGNvdWxkIGp1c3QKKy8vLyBjb21wYXJlIHRob3NlLCBidXQgdGhpcyB3b3VsZCBub3Qgd29yayBmb3Igc3RyaXBwZWQgYml0Y29kZXMgb3IgZm9yIHRob3NlCisvLy8gZmV3IHN5bWJvbHMgd2l0aG91dCBhIG5hbWUuCitjbGFzcyBHbG9iYWxOdW1iZXJTdGF0ZSB7CisgIHN0cnVjdCBDb25maWcgOiBWYWx1ZU1hcENvbmZpZzxHbG9iYWxWYWx1ZSAqPiB7CisgICAgZW51bSB7IEZvbGxvd1JBVVcgPSBmYWxzZSB9OworICB9OworCisgIC8vIEVhY2ggR2xvYmFsVmFsdWUgaXMgbWFwcGVkIHRvIGFuIGlkZW50aWZpZXIuIFRoZSBDb25maWcgZW5zdXJlcyB3aGVuIFJBVVcKKyAgLy8gb2NjdXJzLCB0aGUgbWFwcGluZyBkb2VzIG5vdCBjaGFuZ2UuIFRyYWNraW5nIGNoYW5nZXMgaXMgdW5uZWNlc3NhcnksIGFuZAorICAvLyBhbHNvIHByb2JsZW1hdGljIGZvciB3ZWFrIHN5bWJvbHMgKHdoaWNoIG1heSBiZSBvdmVyd3JpdHRlbikuCisgIHVzaW5nIFZhbHVlTnVtYmVyTWFwID0gVmFsdWVNYXA8R2xvYmFsVmFsdWUgKiwgdWludDY0X3QsIENvbmZpZz47CisgIFZhbHVlTnVtYmVyTWFwIEdsb2JhbE51bWJlcnM7CisKKyAgLy8gVGhlIG5leHQgdW51c2VkIHNlcmlhbCBudW1iZXIgdG8gYXNzaWduIHRvIGEgZ2xvYmFsLgorICB1aW50NjRfdCBOZXh0TnVtYmVyID0gMDsKKworcHVibGljOgorICBHbG9iYWxOdW1iZXJTdGF0ZSgpID0gZGVmYXVsdDsKKworICB1aW50NjRfdCBnZXROdW1iZXIoR2xvYmFsVmFsdWUqIEdsb2JhbCkgeworICAgIFZhbHVlTnVtYmVyTWFwOjppdGVyYXRvciBNYXBJdGVyOworICAgIGJvb2wgSW5zZXJ0ZWQ7CisgICAgc3RkOjp0aWUoTWFwSXRlciwgSW5zZXJ0ZWQpID0gR2xvYmFsTnVtYmVycy5pbnNlcnQoe0dsb2JhbCwgTmV4dE51bWJlcn0pOworICAgIGlmIChJbnNlcnRlZCkKKyAgICAgIE5leHROdW1iZXIrKzsKKyAgICByZXR1cm4gTWFwSXRlci0+c2Vjb25kOworICB9CisKKyAgdm9pZCBlcmFzZShHbG9iYWxWYWx1ZSAqR2xvYmFsKSB7CisgICAgR2xvYmFsTnVtYmVycy5lcmFzZShHbG9iYWwpOworICB9CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBHbG9iYWxOdW1iZXJzLmNsZWFyKCk7CisgIH0KK307CisKKy8vLyBGdW5jdGlvbkNvbXBhcmF0b3IgLSBDb21wYXJlcyB0d28gZnVuY3Rpb25zIHRvIGRldGVybWluZSB3aGV0aGVyIG9yIG5vdAorLy8vIHRoZXkgd2lsbCBnZW5lcmF0ZSBtYWNoaW5lIGNvZGUgd2l0aCB0aGUgc2FtZSBiZWhhdmlvdXIuIERhdGFMYXlvdXQgaXMKKy8vLyB1c2VkIGlmIGF2YWlsYWJsZS4gVGhlIGNvbXBhcmF0b3IgYWx3YXlzIGZhaWxzIGNvbnNlcnZhdGl2ZWx5IChlcnJpbmcgb24gdGhlCisvLy8gc2lkZSBvZiBjbGFpbWluZyB0aGF0IHR3byBmdW5jdGlvbnMgYXJlIGRpZmZlcmVudCkuCitjbGFzcyBGdW5jdGlvbkNvbXBhcmF0b3IgeworcHVibGljOgorICBGdW5jdGlvbkNvbXBhcmF0b3IoY29uc3QgRnVuY3Rpb24gKkYxLCBjb25zdCBGdW5jdGlvbiAqRjIsCisgICAgICAgICAgICAgICAgICAgICBHbG9iYWxOdW1iZXJTdGF0ZSogR04pCisgICAgICA6IEZuTChGMSksIEZuUihGMiksIEdsb2JhbE51bWJlcnMoR04pIHt9CisKKyAgLy8vIFRlc3Qgd2hldGhlciB0aGUgdHdvIGZ1bmN0aW9ucyBoYXZlIGVxdWl2YWxlbnQgYmVoYXZpb3VyLgorICBpbnQgY29tcGFyZSgpOworCisgIC8vLyBIYXNoIGEgZnVuY3Rpb24uIEVxdWl2YWxlbnQgZnVuY3Rpb25zIHdpbGwgaGF2ZSB0aGUgc2FtZSBoYXNoLCBhbmQgdW5lcXVhbAorICAvLy8gZnVuY3Rpb25zIHdpbGwgaGF2ZSBkaWZmZXJlbnQgaGFzaGVzIHdpdGggaGlnaCBwcm9iYWJpbGl0eS4KKyAgdXNpbmcgRnVuY3Rpb25IYXNoID0gdWludDY0X3Q7CisgIHN0YXRpYyBGdW5jdGlvbkhhc2ggZnVuY3Rpb25IYXNoKEZ1bmN0aW9uICYpOworCitwcm90ZWN0ZWQ6CisgIC8vLyBTdGFydCB0aGUgY29tcGFyaXNvbi4KKyAgdm9pZCBiZWdpbkNvbXBhcmUoKSB7CisgICAgc25fbWFwTC5jbGVhcigpOworICAgIHNuX21hcFIuY2xlYXIoKTsKKyAgfQorCisgIC8vLyBDb21wYXJlcyB0aGUgc2lnbmF0dXJlIGFuZCBvdGhlciBnZW5lcmFsIGF0dHJpYnV0ZXMgb2YgdGhlIHR3byBmdW5jdGlvbnMuCisgIGludCBjb21wYXJlU2lnbmF0dXJlKCkgY29uc3Q7CisKKyAgLy8vIFRlc3Qgd2hldGhlciB0d28gYmFzaWMgYmxvY2tzIGhhdmUgZXF1aXZhbGVudCBiZWhhdmlvdXIuCisgIGludCBjbXBCYXNpY0Jsb2Nrcyhjb25zdCBCYXNpY0Jsb2NrICpCQkwsIGNvbnN0IEJhc2ljQmxvY2sgKkJCUikgY29uc3Q7CisKKyAgLy8vIENvbnN0YW50cyBjb21wYXJpc29uLgorICAvLy8gSXRzIGFuYWxvZyB0byBsZXhpY29ncmFwaGljYWwgY29tcGFyaXNvbiBiZXR3ZWVuIGh5cG90aGV0aWNhbCBudW1iZXJzCisgIC8vLyBvZiBuZXh0IGZvcm1hdDoKKyAgLy8vIDxiaXRjYXN0YWJpbGl0eS10cmFpdD48cmF3LWJpdC1jb250ZW50cz4KKyAgLy8vCisgIC8vLyAxLiBCaXRjYXN0YWJpbGl0eS4KKyAgLy8vIENoZWNrIHdoZXRoZXIgTCdzIHR5cGUgY291bGQgYmUgbG9zc2xlc3NseSBiaXRjYXN0ZWQgdG8gUidzIHR5cGUuCisgIC8vLyBPbiB0aGlzIHN0YWdlIG1ldGhvZCwgaW4gY2FzZSB3aGVuIGxvc3NsZXNzIGJpdGNhc3QgaXMgbm90IHBvc3NpYmxlCisgIC8vLyBtZXRob2QgcmV0dXJucyAtMSBvciAxLCB0aHVzIGFsc28gZGVmaW5pbmcgd2hpY2ggdHlwZSBpcyBncmVhdGVyIGluCisgIC8vLyBjb250ZXh0IG9mIGJpdGNhc3RhYmlsaXR5LgorICAvLy8gU3RhZ2UgMDogSWYgdHlwZXMgYXJlIGVxdWFsIGluIHRlcm1zIG9mIGNtcFR5cGVzLCB0aGVuIHdlIGNhbiBnbyBzdHJhaWdodAorICAvLy8gICAgICAgICAgdG8gdGhlIGNvbnRlbnRzIGNvbXBhcmlzb24uCisgIC8vLyAgICAgICAgICBJZiB0eXBlcyBkaWZmZXIsIHJlbWVtYmVyIHR5cGVzIGNvbXBhcmlzb24gcmVzdWx0IGFuZCBjaGVjaworICAvLy8gICAgICAgICAgd2hldGhlciB3ZSBzdGlsbCBjYW4gYml0Y2FzdCB0eXBlcy4KKyAgLy8vIFN0YWdlIDE6IFR5cGVzIHRoYXQgc2F0aXNmaWVzIGlzRmlyc3RDbGFzc1R5cGUgY29uZGl0aW9ucyBhcmUgYWx3YXlzCisgIC8vLyAgICAgICAgICBncmVhdGVyIHRoZW4gb3RoZXJzLgorICAvLy8gU3RhZ2UgMjogVmVjdG9yIGlzIGdyZWF0ZXIgdGhlbiBub24tdmVjdG9yLgorICAvLy8gICAgICAgICAgSWYgYm90aCB0eXBlcyBhcmUgdmVjdG9ycywgdGhlbiB2ZWN0b3Igd2l0aCBncmVhdGVyIGJpdHdpZHRoIGlzCisgIC8vLyAgICAgICAgICBncmVhdGVyLgorICAvLy8gICAgICAgICAgSWYgYm90aCB0eXBlcyBhcmUgdmVjdG9ycyB3aXRoIHRoZSBzYW1lIGJpdHdpZHRoLCB0aGVuIHR5cGVzCisgIC8vLyAgICAgICAgICBhcmUgYml0Y2FzdGFibGUsIGFuZCB3ZSBjYW4gc2tpcCBvdGhlciBzdGFnZXMsIGFuZCBnbyB0byBjb250ZW50cworICAvLy8gICAgICAgICAgY29tcGFyaXNvbi4KKyAgLy8vIFN0YWdlIDM6IFBvaW50ZXIgdHlwZXMgYXJlIGdyZWF0ZXIgdGhhbiBub24tcG9pbnRlcnMuIElmIGJvdGggdHlwZXMgYXJlCisgIC8vLyAgICAgICAgICBwb2ludGVycyBvZiB0aGUgc2FtZSBhZGRyZXNzIHNwYWNlIC0gZ28gdG8gY29udGVudHMgY29tcGFyaXNvbi4KKyAgLy8vICAgICAgICAgIERpZmZlcmVudCBhZGRyZXNzIHNwYWNlczogcG9pbnRlciB3aXRoIGdyZWF0ZXIgYWRkcmVzcyBzcGFjZSBpcworICAvLy8gICAgICAgICAgZ3JlYXRlci4KKyAgLy8vIFN0YWdlIDQ6IFR5cGVzIGFyZSBuZWl0aGVyIHZlY3RvcnMsIG5vciBwb2ludGVycy4gQW5kIHRoZXkgZGlmZmVyLgorICAvLy8gICAgICAgICAgV2UgZG9uJ3Qga25vdyBob3cgdG8gYml0Y2FzdCB0aGVtLiBTbywgd2UgYmV0dGVyIGRvbid0IGRvIGl0LAorICAvLy8gICAgICAgICAgYW5kIHJldHVybiB0eXBlcyBjb21wYXJpc29uIHJlc3VsdCAoc28gaXQgZGV0ZXJtaW5lcyB0aGUKKyAgLy8vICAgICAgICAgIHJlbGF0aW9uc2hpcCBhbW9uZyBjb25zdGFudHMgd2UgZG9uJ3Qga25vdyBob3cgdG8gYml0Y2FzdCkuCisgIC8vLworICAvLy8gSnVzdCBmb3IgY2xlYXJhbmNlLCBsZXQncyBzZWUgaG93IHRoZSBzZXQgb2YgY29uc3RhbnRzIGNvdWxkIGxvb2sKKyAgLy8vIG9uIHNpbmdsZSBkaW1lbnNpb24gYXhpczoKKyAgLy8vCisgIC8vLyBbTkZDVF0sIFtGQ1QsICJvdGhlcnMiXSwgW0ZDVCwgcG9pbnRlcnNdLCBbRkNULCB2ZWN0b3JzXQorICAvLy8gV2hlcmU6IE5GQ1QgLSBOb3QgYSBGaXJzdENsYXNzVHlwZQorICAvLy8gICAgICAgIEZDVCAtIEZpcnN0Q2xhc3NUeXA6CisgIC8vLworICAvLy8gMi4gQ29tcGFyZSByYXcgY29udGVudHMuCisgIC8vLyBJdCBpZ25vcmVzIHR5cGVzIG9uIHRoaXMgc3RhZ2UgYW5kIG9ubHkgY29tcGFyZXMgYml0cyBmcm9tIEwgYW5kIFIuCisgIC8vLyBSZXR1cm5zIDAsIGlmIEwgYW5kIFIgaGFzIGVxdWl2YWxlbnQgY29udGVudHMuCisgIC8vLyAtMSBvciAxIGlmIHZhbHVlcyBhcmUgZGlmZmVyZW50LgorICAvLy8gUHJldHR5IHRyaXZpYWw6CisgIC8vLyAyLjEuIElmIGNvbnRlbnRzIGFyZSBudW1iZXJzLCBjb21wYXJlIG51bWJlcnMuCisgIC8vLyAgICBJbnRzIHdpdGggZ3JlYXRlciBiaXR3aWR0aCBhcmUgZ3JlYXRlci4gSW50cyB3aXRoIHNhbWUgYml0d2lkdGhzCisgIC8vLyAgICBjb21wYXJlZCBieSB0aGVpciBjb250ZW50cy4KKyAgLy8vIDIuMi4gIkFuZCBzbyBvbiIuIEp1c3QgdG8gYXZvaWQgZGlzY3JlcGFuY2llcyB3aXRoIGNvbW1lbnRzCisgIC8vLyBwZXJoYXBzIGl0IHdvdWxkIGJlIGJldHRlciB0byByZWFkIHRoZSBpbXBsZW1lbnRhdGlvbiBpdHNlbGYuCisgIC8vLyAzLiBBbmQgYWdhaW4gYWJvdXQgb3ZlcmFsbCBwaWN0dXJlLiBMZXQncyBsb29rIGJhY2sgYXQgaG93IHRoZSBvcmRlcmVkIHNldAorICAvLy8gb2YgY29uc3RhbnRzIHdpbGwgbG9vayBsaWtlOgorICAvLy8gW05GQ1RdLCBbRkNULCAib3RoZXJzIl0sIFtGQ1QsIHBvaW50ZXJzXSwgW0ZDVCwgdmVjdG9yc10KKyAgLy8vCisgIC8vLyBOb3cgbG9vaywgd2hhdCBjb3VsZCBiZSBpbnNpZGUgW0ZDVCwgIm90aGVycyJdLCBmb3IgZXhhbXBsZToKKyAgLy8vIFtGQ1QsICJvdGhlcnMiXSA9CisgIC8vLyBbCisgIC8vLyAgIFtkb3VibGUgMC4xXSwgW2RvdWJsZSAxLjIzXSwKKyAgLy8vICAgW2kzMiAxXSwgW2kzMiAyXSwKKyAgLy8vICAgeyBkb3VibGUgMS4wIH0sICAgICAgIDsgU3RydWN0VHlJRCwgTnVtRWxlbWVudHMgPSAxCisgIC8vLyAgIHsgaTMyIDEgfSwgICAgICAgICAgICA7IFN0cnVjdFR5SUQsIE51bUVsZW1lbnRzID0gMQorICAvLy8gICB7IGRvdWJsZSAxLCBpMzIgMSB9LCAgOyBTdHJ1Y3RUeUlELCBOdW1FbGVtZW50cyA9IDIKKyAgLy8vICAgeyBpMzIgMSwgZG91YmxlIDEgfSAgIDsgU3RydWN0VHlJRCwgTnVtRWxlbWVudHMgPSAyCisgIC8vLyBdCisgIC8vLworICAvLy8gTGV0J3MgZXhwbGFpbiB0aGUgb3JkZXIuIEZsb2F0IG51bWJlcnMgd2lsbCBiZSBsZXNzIHRoYW4gaW50ZWdlcnMsIGp1c3QKKyAgLy8vIGJlY2F1c2Ugb2YgY21wVHlwZSB0ZXJtczogRmxvYXRUeUlEIDwgSW50ZWdlclR5SUQuCisgIC8vLyBGbG9hdHMgKHdpdGggc2FtZSBmbHRTZW1hbnRpY3MpIGFyZSBzb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZWlyIHZhbHVlLgorICAvLy8gVGhlbiB5b3UgY2FuIHNlZSBpbnRlZ2VycywgYW5kIHRoZXkgYXJlLCBsaWtlIGEgZmxvYXRzLAorICAvLy8gY291bGQgYmUgZWFzeSBzb3J0ZWQgYW1vbmcgZWFjaCBvdGhlcnMuCisgIC8vLyBUaGUgc3RydWN0dXJlcy4gU3RydWN0dXJlcyBhcmUgZ3JvdXBlZCBhdCB0aGUgdGFpbCwgYWdhaW4gYmVjYXVzZSBvZiB0aGVpcgorICAvLy8gVHlwZUlEOiBTdHJ1Y3RUeUlEID4gSW50ZWdlclR5SUQgPiBGbG9hdFR5SUQuCisgIC8vLyBTdHJ1Y3R1cmVzIHdpdGggZ3JlYXRlciBudW1iZXIgb2YgZWxlbWVudHMgYXJlIGdyZWF0ZXIuIFN0cnVjdHVyZXMgd2l0aAorICAvLy8gZ3JlYXRlciBlbGVtZW50cyBnb2luZyBmaXJzdCBhcmUgZ3JlYXRlci4KKyAgLy8vIFRoZSBzYW1lIGxvZ2ljIHdpdGggdmVjdG9ycywgYXJyYXlzIGFuZCBvdGhlciBwb3NzaWJsZSBjb21wbGV4IHR5cGVzLgorICAvLy8KKyAgLy8vIEJpdGNhc3RhYmxlIGNvbnN0YW50cy4KKyAgLy8vIExldCdzIGFzc3VtZSwgdGhhdCBzb21lIGNvbnN0YW50LCBiZWxvbmdzIHRvIHNvbWUgZ3JvdXAgb2YKKyAgLy8vICJzby1jYWxsZWQtZXF1YWwiIHZhbHVlcyB3aXRoIGRpZmZlcmVudCB0eXBlcywgYW5kIGF0IHRoZSBzYW1lIHRpbWUKKyAgLy8vIGJlbG9uZ3MgdG8gYW5vdGhlciBncm91cCBvZiBjb25zdGFudHMgd2l0aCBlcXVhbCB0eXBlcworICAvLy8gYW5kICJyZWFsbHkiIGVxdWFsIHZhbHVlcy4KKyAgLy8vCisgIC8vLyBOb3csIHByb3ZlIHRoYXQgdGhpcyBpcyBpbXBvc3NpYmxlOgorICAvLy8KKyAgLy8vIElmIGNvbnN0YW50IEEgd2l0aCB0eXBlIFR5QSBpcyBiaXRjYXN0YWJsZSB0byBCIHdpdGggdHlwZSBUeUIsIHRoZW46CisgIC8vLyAxLiBBbGwgY29uc3RhbnRzIHdpdGggZXF1YWwgdHlwZXMgdG8gVHlBLCBhcmUgYml0Y2FzdGFibGUgdG8gQi4gU2luY2UKKyAgLy8vICAgIHRob3NlIHNob3VsZCBiZSB2ZWN0b3JzIChpZiBUeUEgaXMgdmVjdG9yKSwgcG9pbnRlcnMKKyAgLy8vICAgIChpZiBUeUEgaXMgcG9pbnRlciksIG9yIGVsc2UgKGlmIFR5QSBlcXVhbCB0byBUeUIpLCB0aG9zZSB0eXBlcyBzaG91bGQKKyAgLy8vICAgIGJlIGVxdWFsIHRvIFR5Qi4KKyAgLy8vIDIuIEFsbCBjb25zdGFudHMgd2l0aCBub24tZXF1YWwsIGJ1dCBiaXRjYXN0YWJsZSB0eXBlcyB0byBUeUEsIGFyZQorICAvLy8gICAgYml0Y2FzdGFibGUgdG8gQi4KKyAgLy8vICAgIE9uY2UgYWdhaW4sIGp1c3QgYmVjYXVzZSB3ZSBhbGxvdyBpdCB0byB2ZWN0b3JzIGFuZCBwb2ludGVycyBvbmx5LgorICAvLy8gICAgVGhpcyBzdGF0ZW1lbnQgY291bGQgYmUgZXhwYW5kZWQgYXMgYmVsb3c6CisgIC8vLyAyLjEuIEFsbCB2ZWN0b3JzIHdpdGggZXF1YWwgYml0d2lkdGggdG8gdmVjdG9yIEEsIGhhcyBlcXVhbCBiaXR3aWR0aCB0bworICAvLy8gICAgICB2ZWN0b3IgQiwgYW5kIHRodXMgYml0Y2FzdGFibGUgdG8gQiBhcyB3ZWxsLgorICAvLy8gMi4yLiBBbGwgcG9pbnRlcnMgb2YgdGhlIHNhbWUgYWRkcmVzcyBzcGFjZSwgbm8gbWF0dGVyIHdoYXQgdGhleSBwb2ludCB0bywKKyAgLy8vICAgICAgYml0Y2FzdGFibGUuIFNvIGlmIEMgaXMgcG9pbnRlciwgaXQgY291bGQgYmUgYml0Y2FzdGVkIHRvIEEgYW5kIHRvIEIuCisgIC8vLyBTbyBhbnkgY29uc3RhbnQgZXF1YWwgb3IgYml0Y2FzdGFibGUgdG8gQSBpcyBlcXVhbCBvciBiaXRjYXN0YWJsZSB0byBCLgorICAvLy8gUUVELgorICAvLy8KKyAgLy8vIEluIGFub3RoZXIgd29yZHMsIGZvciBwb2ludGVycyBhbmQgdmVjdG9ycywgd2UgaWdub3JlIHRvcC1sZXZlbCB0eXBlIGFuZAorICAvLy8gbG9vayBhdCB0aGVpciBwYXJ0aWN1bGFyIHByb3BlcnRpZXMgKGJpdC13aWR0aCBmb3IgdmVjdG9ycywgYW5kCisgIC8vLyBhZGRyZXNzIHNwYWNlIGZvciBwb2ludGVycykuCisgIC8vLyBJZiB0aGVzZSBwcm9wZXJ0aWVzIGFyZSBlcXVhbCAtIGNvbXBhcmUgdGhlaXIgY29udGVudHMuCisgIGludCBjbXBDb25zdGFudHMoY29uc3QgQ29uc3RhbnQgKkwsIGNvbnN0IENvbnN0YW50ICpSKSBjb25zdDsKKworICAvLy8gQ29tcGFyZXMgdHdvIGdsb2JhbCB2YWx1ZXMgYnkgbnVtYmVyLiBVc2VzIHRoZSBHbG9iYWxOdW1iZXJzU3RhdGUgdG8KKyAgLy8vIGlkZW50aWZ5IHRoZSBzYW1lIGdvYmFscyBhY3Jvc3MgZnVuY3Rpb24gY2FsbHMuCisgIGludCBjbXBHbG9iYWxWYWx1ZXMoR2xvYmFsVmFsdWUgKkwsIEdsb2JhbFZhbHVlICpSKSBjb25zdDsKKworICAvLy8gQXNzaWduIG9yIGxvb2sgdXAgcHJldmlvdXNseSBhc3NpZ25lZCBudW1iZXJzIGZvciB0aGUgdHdvIHZhbHVlcywgYW5kCisgIC8vLyByZXR1cm4gd2hldGhlciB0aGUgbnVtYmVycyBhcmUgZXF1YWwuIE51bWJlcnMgYXJlIGFzc2lnbmVkIGluIHRoZSBvcmRlcgorICAvLy8gdmlzaXRlZC4KKyAgLy8vIENvbXBhcmlzb24gb3JkZXI6CisgIC8vLyBTdGFnZSAwOiBWYWx1ZSB0aGF0IGlzIGZ1bmN0aW9uIGl0c2VsZiBpcyBhbHdheXMgZ3JlYXRlciB0aGVuIG90aGVycy4KKyAgLy8vICAgICAgICAgIElmIGxlZnQgYW5kIHJpZ2h0IHZhbHVlcyBhcmUgcmVmZXJlbmNlcyB0byB0aGVpciBmdW5jdGlvbnMsIHRoZW4KKyAgLy8vICAgICAgICAgIHRoZXkgYXJlIGVxdWFsLgorICAvLy8gU3RhZ2UgMTogQ29uc3RhbnRzIGFyZSBncmVhdGVyIHRoYW4gbm9uLWNvbnN0YW50cy4KKyAgLy8vICAgICAgICAgIElmIGJvdGggbGVmdCBhbmQgcmlnaHQgYXJlIGNvbnN0YW50cywgdGhlbiB0aGUgcmVzdWx0IG9mCisgIC8vLyAgICAgICAgICBjbXBDb25zdGFudHMgaXMgdXNlZCBhcyBjbXBWYWx1ZXMgcmVzdWx0LgorICAvLy8gU3RhZ2UgMjogSW5saW5lQXNtIGluc3RhbmNlcyBhcmUgZ3JlYXRlciB0aGFuIG90aGVycy4gSWYgYm90aCBsZWZ0IGFuZAorICAvLy8gICAgICAgICAgcmlnaHQgYXJlIElubGluZUFzbSBpbnN0YW5jZXMsIElubGluZUFzbSogcG9pbnRlcnMgY2FzdGVkIHRvCisgIC8vLyAgICAgICAgICBpbnRlZ2VycyBhbmQgY29tcGFyZWQgYXMgbnVtYmVycy4KKyAgLy8vIFN0YWdlIDM6IEZvciBhbGwgb3RoZXIgY2FzZXMgd2UgY29tcGFyZSBvcmRlciB3ZSBtZWV0IHRoZXNlIHZhbHVlcyBpbgorICAvLy8gICAgICAgICAgdGhlaXIgZnVuY3Rpb25zLiBJZiByaWdodCB2YWx1ZSB3YXMgbWV0IGZpcnN0IGR1cmluZyBzY2FubmluZywKKyAgLy8vICAgICAgICAgIHRoZW4gbGVmdCB2YWx1ZSBpcyBncmVhdGVyLgorICAvLy8gICAgICAgICAgSW4gYW5vdGhlciB3b3Jkcywgd2UgY29tcGFyZSBzZXJpYWwgbnVtYmVycywgZm9yIG1vcmUgZGV0YWlscworICAvLy8gICAgICAgICAgc2VlIGNvbW1lbnRzIGZvciBzbl9tYXBMIGFuZCBzbl9tYXBSLgorICBpbnQgY21wVmFsdWVzKGNvbnN0IFZhbHVlICpMLCBjb25zdCBWYWx1ZSAqUikgY29uc3Q7CisKKyAgLy8vIENvbXBhcmUgdHdvIEluc3RydWN0aW9ucyBmb3IgZXF1aXZhbGVuY2UsIHNpbWlsYXIgdG8KKyAgLy8vIEluc3RydWN0aW9uOjppc1NhbWVPcGVyYXRpb25Bcy4KKyAgLy8vCisgIC8vLyBTdGFnZXMgYXJlIGxpc3RlZCBpbiAibW9zdCBzaWduaWZpY2FudCBzdGFnZSBmaXJzdCIgb3JkZXI6CisgIC8vLyBPbiBlYWNoIHN0YWdlIGJlbG93LCB3ZSBkbyBjb21wYXJpc29uIGJldHdlZW4gc29tZSBsZWZ0IGFuZCByaWdodAorICAvLy8gb3BlcmF0aW9uIHBhcnRzLiBJZiBwYXJ0cyBhcmUgbm9uLWVxdWFsLCB3ZSBhc3NpZ24gcGFydHMgY29tcGFyaXNvbgorICAvLy8gcmVzdWx0IHRvIHRoZSBvcGVyYXRpb24gY29tcGFyaXNvbiByZXN1bHQgYW5kIGV4aXQgZnJvbSBtZXRob2QuCisgIC8vLyBPdGhlcndpc2Ugd2UgcHJvY2VlZCB0byB0aGUgbmV4dCBzdGFnZS4KKyAgLy8vIFN0YWdlczoKKyAgLy8vIDEuIE9wZXJhdGlvbnMgb3Bjb2Rlcy4gQ29tcGFyZWQgYXMgbnVtYmVycy4KKyAgLy8vIDIuIE51bWJlciBvZiBvcGVyYW5kcy4KKyAgLy8vIDMuIE9wZXJhdGlvbiB0eXBlcy4gQ29tcGFyZWQgd2l0aCBjbXBUeXBlIG1ldGhvZC4KKyAgLy8vIDQuIENvbXBhcmUgb3BlcmF0aW9uIHN1YmNsYXNzIG9wdGlvbmFsIGRhdGEgYXMgc3RyZWFtIG9mIGJ5dGVzOgorICAvLy8ganVzdCBjb252ZXJ0IGl0IHRvIGludGVnZXJzIGFuZCBjYWxsIGNtcE51bWJlcnMuCisgIC8vLyA1LiBDb21wYXJlIGluIG9wZXJhdGlvbiBvcGVyYW5kIHR5cGVzIHdpdGggY21wVHlwZSBpbgorICAvLy8gbW9zdCBzaWduaWZpY2FudCBvcGVyYW5kIGZpcnN0IG9yZGVyLgorICAvLy8gNi4gTGFzdCBzdGFnZS4gQ2hlY2sgb3BlcmF0aW9ucyBmb3Igc29tZSBzcGVjaWZpYyBhdHRyaWJ1dGVzLgorICAvLy8gRm9yIGV4YW1wbGUsIGZvciBMb2FkIGl0IHdvdWxkIGJlOgorICAvLy8gNi4xLkxvYWQ6IHZvbGF0aWxlIChhcyBib29sZWFuIGZsYWcpCisgIC8vLyA2LjIuTG9hZDogYWxpZ25tZW50IChhcyBpbnRlZ2VyIG51bWJlcnMpCisgIC8vLyA2LjMuTG9hZDogb3JkZXJpbmcgKGFzIHVuZGVybHlpbmcgZW51bSBjbGFzcyB2YWx1ZSkKKyAgLy8vIDYuNC5Mb2FkOiBzeW5jaC1zY29wZSAoYXMgaW50ZWdlciBudW1iZXJzKQorICAvLy8gNi41LkxvYWQ6IHJhbmdlIG1ldGFkYXRhIChhcyBpbnRlZ2VyIHJhbmdlcykKKyAgLy8vIE9uIHRoaXMgc3RhZ2UgaXRzIGJldHRlciB0byBzZWUgdGhlIGNvZGUsIHNpbmNlIGl0cyBub3QgbW9yZSB0aGFuIDEwLTE1CisgIC8vLyBzdHJpbmdzIGZvciBwYXJ0aWN1bGFyIGluc3RydWN0aW9uLCBhbmQgY291bGQgY2hhbmdlIHNvbWV0aW1lcy4KKyAgLy8vCisgIC8vLyBTZXRzIFxwIG5lZWRUb0NtcE9wZXJhbmRzIHRvIHRydWUgaWYgdGhlIG9wZXJhbmRzIG9mIHRoZSBpbnN0cnVjdGlvbnMKKyAgLy8vIHN0aWxsIG11c3QgYmUgY29tcGFyZWQgYWZ0ZXJ3YXJkcy4gSW4gdGhpcyBjYXNlIGl0J3MgYWxyZWFkeSBndWFyYW50ZWVkCisgIC8vLyB0aGF0IGJvdGggaW5zdHJ1Y3Rpb25zIGhhdmUgdGhlIHNhbWUgbnVtYmVyIG9mIG9wZXJhbmRzLgorICBpbnQgY21wT3BlcmF0aW9ucyhjb25zdCBJbnN0cnVjdGlvbiAqTCwgY29uc3QgSW5zdHJ1Y3Rpb24gKlIsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgJm5lZWRUb0NtcE9wZXJhbmRzKSBjb25zdDsKKworICAvLy8gY21wVHlwZSAtIGNvbXBhcmVzIHR3byB0eXBlcywKKyAgLy8vIGRlZmluZXMgdG90YWwgb3JkZXJpbmcgYW1vbmcgdGhlIHR5cGVzIHNldC4KKyAgLy8vCisgIC8vLyBSZXR1cm4gdmFsdWVzOgorICAvLy8gMCBpZiB0eXBlcyBhcmUgZXF1YWwsCisgIC8vLyAtMSBpZiBMZWZ0IGlzIGxlc3MgdGhhbiBSaWdodCwKKyAgLy8vICsxIGlmIExlZnQgaXMgZ3JlYXRlciB0aGFuIFJpZ2h0LgorICAvLy8KKyAgLy8vIERlc2NyaXB0aW9uOgorICAvLy8gQ29tcGFyaXNvbiBpcyBicm9rZW4gb250byBzdGFnZXMuIExpa2UgaW4gbGV4aWNvZ3JhcGhpY2FsIGNvbXBhcmlzb24KKyAgLy8vIHN0YWdlIGNvbWluZyBmaXJzdCBoYXMgaGlnaGVyIHByaW9yaXR5LgorICAvLy8gT24gZWFjaCBleHBsYW5hdGlvbiBzdGFnZSBrZWVwIGluIG1pbmQgdG90YWwgb3JkZXJpbmcgcHJvcGVydGllcy4KKyAgLy8vCisgIC8vLyAwLiBCZWZvcmUgY29tcGFyaXNvbiB3ZSBjb2VyY2UgcG9pbnRlciB0eXBlcyBvZiAwIGFkZHJlc3Mgc3BhY2UgdG8KKyAgLy8vIGludGVnZXIuCisgIC8vLyBXZSBhbHNvIGRvbid0IGJvdGhlciB3aXRoIHNhbWUgdHlwZSBhdCBsZWZ0IGFuZCByaWdodCwgc28KKyAgLy8vIGp1c3QgcmV0dXJuIDAgaW4gdGhpcyBjYXNlLgorICAvLy8KKyAgLy8vIDEuIElmIHR5cGVzIGFyZSBvZiBkaWZmZXJlbnQga2luZCAoZGlmZmVyZW50IHR5cGUgSURzKS4KKyAgLy8vICAgIFJldHVybiByZXN1bHQgb2YgdHlwZSBJRHMgY29tcGFyaXNvbiwgdHJlYXRpbmcgdGhlbSBhcyBudW1iZXJzLgorICAvLy8gMi4gSWYgdHlwZXMgYXJlIGludGVnZXJzLCBjaGVjayB0aGF0IHRoZXkgaGF2ZSB0aGUgc2FtZSB3aWR0aC4gSWYgdGhleQorICAvLy8gYXJlIHZlY3RvcnMsIGNoZWNrIHRoYXQgdGhleSBoYXZlIHRoZSBzYW1lIGNvdW50IGFuZCBzdWJ0eXBlLgorICAvLy8gMy4gVHlwZXMgaGF2ZSB0aGUgc2FtZSBJRCwgc28gY2hlY2sgd2hldGhlciB0aGV5IGFyZSBvbmUgb2Y6CisgIC8vLyAqIFZvaWQKKyAgLy8vICogRmxvYXQKKyAgLy8vICogRG91YmxlCisgIC8vLyAqIFg4Nl9GUDgwCisgIC8vLyAqIEZQMTI4CisgIC8vLyAqIFBQQ19GUDEyOAorICAvLy8gKiBMYWJlbAorICAvLy8gKiBNZXRhZGF0YQorICAvLy8gV2UgY2FuIHRyZWF0IHRoZXNlIHR5cGVzIGFzIGVxdWFsIHdoZW5ldmVyIHRoZWlyIElEcyBhcmUgc2FtZS4KKyAgLy8vIDQuIElmIExlZnQgYW5kIFJpZ2h0IGFyZSBwb2ludGVycywgcmV0dXJuIHJlc3VsdCBvZiBhZGRyZXNzIHNwYWNlCisgIC8vLyBjb21wYXJpc29uIChudW1iZXJzIGNvbXBhcmlzb24pLiBXZSBjYW4gdHJlYXQgcG9pbnRlciB0eXBlcyBvZiBzYW1lCisgIC8vLyBhZGRyZXNzIHNwYWNlIGFzIGVxdWFsLgorICAvLy8gNS4gSWYgdHlwZXMgYXJlIGNvbXBsZXguCisgIC8vLyBUaGVuIGJvdGggTGVmdCBhbmQgUmlnaHQgYXJlIHRvIGJlIGV4cGFuZGVkIGFuZCB0aGVpciBlbGVtZW50IHR5cGVzIHdpbGwKKyAgLy8vIGJlIGNoZWNrZWQgd2l0aCB0aGUgc2FtZSB3YXkuIElmIHdlIGdldCBSZXMgIT0gMCBvbiBzb21lIHN0YWdlLCByZXR1cm4gaXQuCisgIC8vLyBPdGhlcndpc2UgcmV0dXJuIDAuCisgIC8vLyA2LiBGb3IgYWxsIG90aGVyIGNhc2VzIHB1dCBsbHZtX3VucmVhY2hhYmxlLgorICBpbnQgY21wVHlwZXMoVHlwZSAqVHlMLCBUeXBlICpUeVIpIGNvbnN0OworCisgIGludCBjbXBOdW1iZXJzKHVpbnQ2NF90IEwsIHVpbnQ2NF90IFIpIGNvbnN0OworICBpbnQgY21wQVBJbnRzKGNvbnN0IEFQSW50ICZMLCBjb25zdCBBUEludCAmUikgY29uc3Q7CisgIGludCBjbXBBUEZsb2F0cyhjb25zdCBBUEZsb2F0ICZMLCBjb25zdCBBUEZsb2F0ICZSKSBjb25zdDsKKyAgaW50IGNtcE1lbShTdHJpbmdSZWYgTCwgU3RyaW5nUmVmIFIpIGNvbnN0OworCisgIC8vIFRoZSB0d28gZnVuY3Rpb25zIHVuZGVyZ29pbmcgY29tcGFyaXNvbi4KKyAgY29uc3QgRnVuY3Rpb24gKkZuTCwgKkZuUjsKKworcHJpdmF0ZToKKyAgaW50IGNtcE9yZGVyaW5ncyhBdG9taWNPcmRlcmluZyBMLCBBdG9taWNPcmRlcmluZyBSKSBjb25zdDsKKyAgaW50IGNtcElubGluZUFzbShjb25zdCBJbmxpbmVBc20gKkwsIGNvbnN0IElubGluZUFzbSAqUikgY29uc3Q7CisgIGludCBjbXBBdHRycyhjb25zdCBBdHRyaWJ1dGVMaXN0IEwsIGNvbnN0IEF0dHJpYnV0ZUxpc3QgUikgY29uc3Q7CisgIGludCBjbXBSYW5nZU1ldGFkYXRhKGNvbnN0IE1ETm9kZSAqTCwgY29uc3QgTUROb2RlICpSKSBjb25zdDsKKyAgaW50IGNtcE9wZXJhbmRCdW5kbGVzU2NoZW1hKGNvbnN0IEluc3RydWN0aW9uICpMLCBjb25zdCBJbnN0cnVjdGlvbiAqUikgY29uc3Q7CisKKyAgLy8vIENvbXBhcmUgdHdvIEdFUHMgZm9yIGVxdWl2YWxlbnQgcG9pbnRlciBhcml0aG1ldGljLgorICAvLy8gUGFydHMgdG8gYmUgY29tcGFyZWQgZm9yIGVhY2ggY29tcGFyaXNvbiBzdGFnZSwKKyAgLy8vIG1vc3Qgc2lnbmlmaWNhbnQgc3RhZ2UgZmlyc3Q6CisgIC8vLyAxLiBBZGRyZXNzIHNwYWNlLiBBcyBudW1iZXJzLgorICAvLy8gMi4gQ29uc3RhbnQgb2Zmc2V0LCAodXNpbmcgR0VQT3BlcmF0b3I6OmFjY3VtdWxhdGVDb25zdGFudE9mZnNldCBtZXRob2QpLgorICAvLy8gMy4gUG9pbnRlciBvcGVyYW5kIHR5cGUgKHVzaW5nIGNtcFR5cGUgbWV0aG9kKS4KKyAgLy8vIDQuIE51bWJlciBvZiBvcGVyYW5kcy4KKyAgLy8vIDUuIENvbXBhcmUgb3BlcmFuZHMsIHVzaW5nIGNtcFZhbHVlcyBtZXRob2QuCisgIGludCBjbXBHRVBzKGNvbnN0IEdFUE9wZXJhdG9yICpHRVBMLCBjb25zdCBHRVBPcGVyYXRvciAqR0VQUikgY29uc3Q7CisgIGludCBjbXBHRVBzKGNvbnN0IEdldEVsZW1lbnRQdHJJbnN0ICpHRVBMLAorICAgICAgICAgICAgICBjb25zdCBHZXRFbGVtZW50UHRySW5zdCAqR0VQUikgY29uc3QgeworICAgIHJldHVybiBjbXBHRVBzKGNhc3Q8R0VQT3BlcmF0b3I+KEdFUEwpLCBjYXN0PEdFUE9wZXJhdG9yPihHRVBSKSk7CisgIH0KKworICAvLy8gQXNzaWduIHNlcmlhbCBudW1iZXJzIHRvIHZhbHVlcyBmcm9tIGxlZnQgZnVuY3Rpb24sIGFuZCB2YWx1ZXMgZnJvbQorICAvLy8gcmlnaHQgZnVuY3Rpb24uCisgIC8vLyBFeHBsYW5hdGlvbjoKKyAgLy8vIEJlaW5nIGNvbXBhcmluZyBmdW5jdGlvbnMgd2UgbmVlZCB0byBjb21wYXJlIHZhbHVlcyB3ZSBtZWV0IGF0IGxlZnQgYW5kCisgIC8vLyByaWdodCBzaWRlcy4KKyAgLy8vIEl0cyBlYXN5IHRvIHNvcnQgdGhpbmdzIG91dCBmb3IgZXh0ZXJuYWwgdmFsdWVzLiBJdCBqdXN0IHNob3VsZCBiZQorICAvLy8gdGhlIHNhbWUgdmFsdWUgYXQgbGVmdCBhbmQgcmlnaHQuCisgIC8vLyBCdXQgZm9yIGxvY2FsIHZhbHVlcyAodGhvc2Ugd2VyZSBpbnRyb2R1Y2VkIGluc2lkZSBmdW5jdGlvbiBib2R5KQorICAvLy8gd2UgaGF2ZSB0byBlbnN1cmUgdGhleSB3ZXJlIGludHJvZHVjZWQgYXQgZXhhY3RseSB0aGUgc2FtZSBwbGFjZSwKKyAgLy8vIGFuZCBwbGF5cyB0aGUgc2FtZSByb2xlLgorICAvLy8gTGV0J3MgYXNzaWduIHNlcmlhbCBudW1iZXIgdG8gZWFjaCB2YWx1ZSB3aGVuIHdlIG1lZXQgaXQgZmlyc3QgdGltZS4KKyAgLy8vIFZhbHVlcyB0aGF0IHdlcmUgbWV0IGF0IHNhbWUgcGxhY2Ugd2lsbCBiZSB3aXRoIHNhbWUgc2VyaWFsIG51bWJlcnMuCisgIC8vLyBJbiB0aGlzIGNhc2UgaXQgd291bGQgYmUgZ29vZCB0byBleHBsYWluIGZldyBwb2ludHMgYWJvdXQgdmFsdWVzIGFzc2lnbmVkCisgIC8vLyB0byBCQnMgYW5kIG90aGVyIHdheXMgb2YgaW1wbGVtZW50YXRpb24gKHNlZSBiZWxvdykuCisgIC8vLworICAvLy8gMS4gU2FmZXR5IG9mIEJCIHJlb3JkZXJpbmcuCisgIC8vLyBJdCdzIHNhZmUgdG8gY2hhbmdlIHRoZSBvcmRlciBvZiBCYXNpY0Jsb2NrcyBpbiBmdW5jdGlvbi4KKyAgLy8vIFJlbGF0aW9uc2hpcCB3aXRoIG90aGVyIGZ1bmN0aW9ucyBhbmQgc2VyaWFsIG51bWJlcmluZyB3aWxsIG5vdCBiZQorICAvLy8gY2hhbmdlZCBpbiB0aGlzIGNhc2UuCisgIC8vLyBBcyBmb2xsb3dzIGZyb20gRnVuY3Rpb25Db21wYXJhdG9yOjpjb21wYXJlKCksIHdlIGRvIENGRyB3YWxrOiB3ZSBzdGFydAorICAvLy8gZnJvbSB0aGUgZW50cnksIGFuZCB0aGVuIHRha2UgZWFjaCB0ZXJtaW5hdG9yLiBTbyBpdCBkb2Vzbid0IG1hdHRlciBob3cgaW4KKyAgLy8vIGZhY3QgQkJzIGFyZSBvcmRlcmVkIGluIGZ1bmN0aW9uLiBBbmQgc2luY2UgY21wVmFsdWVzIGFyZSBjYWxsZWQgZHVyaW5nCisgIC8vLyB0aGlzIHdhbGssIHRoZSBudW1iZXJpbmcgZGVwZW5kcyBvbmx5IG9uIGhvdyBCQnMgbG9jYXRlZCBpbnNpZGUgdGhlIENGRy4KKyAgLy8vIFNvIHRoZSBhbnN3ZXIgaXMgLSB5ZXMuIFdlIHdpbGwgZ2V0IHRoZSBzYW1lIG51bWJlcmluZy4KKyAgLy8vCisgIC8vLyAyLiBJbXBvc3NpYmlsaXR5IHRvIHVzZSBkb21pbmFuY2UgcHJvcGVydGllcyBvZiB2YWx1ZXMuCisgIC8vLyBJZiB3ZSBjb21wYXJlIHR3byBpbnN0cnVjdGlvbiBvcGVyYW5kczogZmlyc3QgaXMgdXNhZ2Ugb2YgbG9jYWwKKyAgLy8vIHZhcmlhYmxlIEFMIGZyb20gZnVuY3Rpb24gRkwsIGFuZCBzZWNvbmQgaXMgdXNhZ2Ugb2YgbG9jYWwgdmFyaWFibGUgQVIKKyAgLy8vIGZyb20gRlIsIHdlIGNvdWxkIGNvbXBhcmUgdGhlaXIgb3JpZ2lucyBhbmQgY2hlY2sgd2hldGhlciB0aGV5IGFyZQorICAvLy8gZGVmaW5lZCBhdCB0aGUgc2FtZSBwbGFjZS4KKyAgLy8vIEJ1dCwgd2UgYXJlIHN0aWxsIG5vdCBhYmxlIHRvIGNvbXBhcmUgb3BlcmFuZHMgb2YgUEhJIG5vZGVzLCBzaW5jZSB0aG9zZQorICAvLy8gY291bGQgYmUgb3BlcmFuZHMgZnJvbSBmdXJ0aGVyIEJCcyB3ZSBkaWRuJ3Qgc2NhbiB5ZXQuCisgIC8vLyBTbyBpdCdzIGltcG9zc2libGUgdG8gdXNlIGRvbWluYW5jZSBwcm9wZXJ0aWVzIGluIGdlbmVyYWwuCisgIG11dGFibGUgRGVuc2VNYXA8Y29uc3QgVmFsdWUqLCBpbnQ+IHNuX21hcEwsIHNuX21hcFI7CisKKyAgLy8gVGhlIGdsb2JhbCBzdGF0ZSB3ZSB3aWxsIHVzZQorICBHbG9iYWxOdW1iZXJTdGF0ZSogR2xvYmFsTnVtYmVyczsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfRlVOQ1RJT05DT01QQVJBVE9SX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9GdW5jdGlvbkltcG9ydFV0aWxzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvRnVuY3Rpb25JbXBvcnRVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI5ZmJlZjAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvRnVuY3Rpb25JbXBvcnRVdGlscy5oCkBAIC0wLDAgKzEsMTE5IEBACisvLz09PS0gRnVuY3Rpb25JbXBvcnRVdGlscy5oIC0gSW1wb3J0aW5nIHN1cHBvcnQgdXRpbGl0aWVzIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIEZ1bmN0aW9uSW1wb3J0R2xvYmFsUHJvY2Vzc2luZyBjbGFzcyB3aGljaCBpcyB1c2VkCisvLyB0byBwZXJmb3JtIHRoZSBuZWNlc3NhcnkgZ2xvYmFsIHZhbHVlIGhhbmRsaW5nIGZvciBmdW5jdGlvbiBpbXBvcnRpbmcuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfRlVOQ1RJT05JTVBPUlRVVElMU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19GVU5DVElPTklNUE9SVFVUSUxTX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1NldFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlU3VtbWFyeUluZGV4LmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1vZHVsZTsKKworLy8vIENsYXNzIHRvIGhhbmRsZSBuZWNlc3NhcnkgR2xvYmFsVmFsdWUgY2hhbmdlcyByZXF1aXJlZCBieSBUaGluTFRPCisvLy8gZnVuY3Rpb24gaW1wb3J0aW5nLCBpbmNsdWRpbmcgbGlua2FnZSBjaGFuZ2VzIGFuZCBhbnkgbmVjZXNzYXJ5IHJlbmFtaW5nLgorY2xhc3MgRnVuY3Rpb25JbXBvcnRHbG9iYWxQcm9jZXNzaW5nIHsKKyAgLy8vIFRoZSBNb2R1bGUgd2hpY2ggd2UgYXJlIGV4cG9ydGluZyBvciBpbXBvcnRpbmcgZnVuY3Rpb25zIGZyb20uCisgIE1vZHVsZSAmTTsKKworICAvLy8gTW9kdWxlIHN1bW1hcnkgaW5kZXggcGFzc2VkIGluIGZvciBmdW5jdGlvbiBpbXBvcnRpbmcvZXhwb3J0aW5nIGhhbmRsaW5nLgorICBjb25zdCBNb2R1bGVTdW1tYXJ5SW5kZXggJkltcG9ydEluZGV4OworCisgIC8vLyBHbG9iYWxzIHRvIGltcG9ydCBmcm9tIHRoaXMgbW9kdWxlLCBhbGwgb3RoZXIgZnVuY3Rpb25zIHdpbGwgYmUKKyAgLy8vIGltcG9ydGVkIGFzIGRlY2xhcmF0aW9ucyBpbnN0ZWFkIG9mIGRlZmluaXRpb25zLgorICBTZXRWZWN0b3I8R2xvYmFsVmFsdWUgKj4gKkdsb2JhbHNUb0ltcG9ydDsKKworICAvLy8gU2V0IHRvIHRydWUgaWYgdGhlIGdpdmVuIE1vZHVsZVN1bW1hcnlJbmRleCBjb250YWlucyBhbnkgZnVuY3Rpb25zCisgIC8vLyBmcm9tIHRoaXMgc291cmNlIG1vZHVsZSwgaW4gd2hpY2ggY2FzZSB3ZSBtdXN0IGNvbnNlcnZhdGl2ZWx5IGFzc3VtZQorICAvLy8gdGhhdCBhbnkgb2YgaXRzIGZ1bmN0aW9ucyBtYXkgYmUgaW1wb3J0ZWQgaW50byBhbm90aGVyIG1vZHVsZQorICAvLy8gYXMgcGFydCBvZiBhIGRpZmZlcmVudCBiYWNrZW5kIGNvbXBpbGF0aW9uIHByb2Nlc3MuCisgIGJvb2wgSGFzRXhwb3J0ZWRGdW5jdGlvbnMgPSBmYWxzZTsKKworICAvLy8gU2V0IG9mIGxsdm0uKnVzZWQgdmFsdWVzLCBpbiBvcmRlciB0byB2YWxpZGF0ZSB0aGF0IHdlIGRvbid0IHRyeQorICAvLy8gdG8gcHJvbW90ZSBhbnkgbm9uLXJlbmFtYWJsZSB2YWx1ZXMuCisgIFNtYWxsUHRyU2V0PEdsb2JhbFZhbHVlICosIDg+IFVzZWQ7CisKKyAgLy8vIENoZWNrIGlmIHdlIHNob3VsZCBwcm9tb3RlIHRoZSBnaXZlbiBsb2NhbCB2YWx1ZSB0byBnbG9iYWwgc2NvcGUuCisgIGJvb2wgc2hvdWxkUHJvbW90ZUxvY2FsVG9HbG9iYWwoY29uc3QgR2xvYmFsVmFsdWUgKlNHVik7CisKKyNpZm5kZWYgTkRFQlVHCisgIC8vLyBDaGVjayBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgYSBsb2NhbCB0aGF0IGNhbid0IGJlIHJlbmFtZWQgKHByb21vdGVkKS4KKyAgLy8vIE9ubHkgdXNlZCBpbiBhc3NlcnRpb24gY2hlY2tpbmcsIGFuZCBkaXNhYmxlZCB1bmRlciBOREVCVUcgc2luY2UgdGhlIFVzZWQKKyAgLy8vIHNldCB3aWxsIG5vdCBiZSBwb3B1bGF0ZWQuCisgIGJvb2wgaXNOb25SZW5hbWFibGVMb2NhbChjb25zdCBHbG9iYWxWYWx1ZSAmR1YpIGNvbnN0OworI2VuZGlmCisKKyAgLy8vIEhlbHBlciBtZXRob2RzIHRvIGNoZWNrIGlmIHdlIGFyZSBpbXBvcnRpbmcgZnJvbSBvciBwb3RlbnRpYWxseQorICAvLy8gZXhwb3J0aW5nIGZyb20gdGhlIGN1cnJlbnQgc291cmNlIG1vZHVsZS4KKyAgYm9vbCBpc1BlcmZvcm1pbmdJbXBvcnQoKSBjb25zdCB7IHJldHVybiBHbG9iYWxzVG9JbXBvcnQgIT0gbnVsbHB0cjsgfQorICBib29sIGlzTW9kdWxlRXhwb3J0aW5nKCkgY29uc3QgeyByZXR1cm4gSGFzRXhwb3J0ZWRGdW5jdGlvbnM7IH0KKworICAvLy8gSWYgd2UgYXJlIGltcG9ydGluZyBmcm9tIHRoZSBzb3VyY2UgbW9kdWxlLCBjaGVja3MgaWYgd2Ugc2hvdWxkCisgIC8vLyBpbXBvcnQgU0dWIGFzIGEgZGVmaW5pdGlvbiwgb3RoZXJ3aXNlIGltcG9ydCBhcyBhIGRlY2xhcmF0aW9uLgorICBib29sIGRvSW1wb3J0QXNEZWZpbml0aW9uKGNvbnN0IEdsb2JhbFZhbHVlICpTR1YpOworCisgIC8vLyBHZXQgdGhlIG5hbWUgZm9yIFNHViB0aGF0IHNob3VsZCBiZSB1c2VkIGluIHRoZSBsaW5rZWQgZGVzdGluYXRpb24KKyAgLy8vIG1vZHVsZS4gU3BlY2lmaWNhbGx5LCB0aGlzIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgd2UgbmVlZCB0byByZW5hbWUKKyAgLy8vIGEgbG9jYWwgdGhhdCBpcyBiZWluZyBwcm9tb3RlZCB0byBnbG9iYWwgc2NvcGUsIHdoaWNoIGl0IHdpbGwgYWx3YXlzCisgIC8vLyBkbyB3aGVuIFxwIERvUHJvbW90ZSBpcyB0cnVlIChvciB3aGVuIGltcG9ydGluZyBhIGxvY2FsKS4KKyAgc3RkOjpzdHJpbmcgZ2V0TmFtZShjb25zdCBHbG9iYWxWYWx1ZSAqU0dWLCBib29sIERvUHJvbW90ZSk7CisKKyAgLy8vIFByb2Nlc3MgZ2xvYmFscyBzbyB0aGF0IHRoZXkgY2FuIGJlIHVzZWQgaW4gVGhpbkxUTy4gVGhpcyBpbmNsdWRlcworICAvLy8gcHJvbW90aW5nIGxvY2FsIHZhcmlhYmxlcyBzbyB0aGF0IHRoZXkgY2FuIGJlIHJlZmVyZW5jZSBleHRlcm5hbGx5IGJ5CisgIC8vLyB0aGluIGx0byBpbXBvcnRlZCBnbG9iYWxzIGFuZCBjb252ZXJ0aW5nIHN0cm9uZyBleHRlcm5hbCBnbG9iYWxzIHRvCisgIC8vLyBhdmFpbGFibGVfZXh0ZXJuYWxseS4KKyAgdm9pZCBwcm9jZXNzR2xvYmFsc0ZvclRoaW5MVE8oKTsKKyAgdm9pZCBwcm9jZXNzR2xvYmFsRm9yVGhpbkxUTyhHbG9iYWxWYWx1ZSAmR1YpOworCisgIC8vLyBHZXQgdGhlIG5ldyBsaW5rYWdlIGZvciBTR1YgdGhhdCBzaG91bGQgYmUgdXNlZCBpbiB0aGUgbGlua2VkIGRlc3RpbmF0aW9uCisgIC8vLyBtb2R1bGUuIFNwZWNpZmljYWxseSwgZm9yIFRoaW5MVE8gaW1wb3J0aW5nIG9yIGV4cG9ydGluZyBpdCBtYXkgbmVlZAorICAvLy8gdG8gYmUgYWRqdXN0ZWQuIFdoZW4gXHAgRG9Qcm9tb3RlIGlzIHRydWUgdGhlbiB3ZSBtdXN0IGFkanVzdCB0aGUKKyAgLy8vIGxpbmthZ2UgZm9yIGEgcmVxdWlyZWQgcHJvbW90aW9uIG9mIGEgbG9jYWwgdG8gZ2xvYmFsIHNjb3BlLgorICBHbG9iYWxWYWx1ZTo6TGlua2FnZVR5cGVzIGdldExpbmthZ2UoY29uc3QgR2xvYmFsVmFsdWUgKlNHViwgYm9vbCBEb1Byb21vdGUpOworCitwdWJsaWM6CisgIEZ1bmN0aW9uSW1wb3J0R2xvYmFsUHJvY2Vzc2luZygKKyAgICAgIE1vZHVsZSAmTSwgY29uc3QgTW9kdWxlU3VtbWFyeUluZGV4ICZJbmRleCwKKyAgICAgIFNldFZlY3RvcjxHbG9iYWxWYWx1ZSAqPiAqR2xvYmFsc1RvSW1wb3J0ID0gbnVsbHB0cikKKyAgICAgIDogTShNKSwgSW1wb3J0SW5kZXgoSW5kZXgpLCBHbG9iYWxzVG9JbXBvcnQoR2xvYmFsc1RvSW1wb3J0KSB7CisgICAgLy8gSWYgd2UgaGF2ZSBhIE1vZHVsZVN1bW1hcnlJbmRleCBidXQgbm8gZnVuY3Rpb24gdG8gaW1wb3J0LAorICAgIC8vIHRoZW4gdGhpcyBpcyB0aGUgcHJpbWFyeSBtb2R1bGUgYmVpbmcgY29tcGlsZWQgaW4gYSBUaGluTFRPCisgICAgLy8gYmFja2VuZCBjb21waWxhdGlvbiwgYW5kIHdlIG5lZWQgdG8gc2VlIGlmIGl0IGhhcyBmdW5jdGlvbnMgdGhhdAorICAgIC8vIG1heSBiZSBleHBvcnRlZCB0byBhbm90aGVyIGJhY2tlbmQgY29tcGlsYXRpb24uCisgICAgaWYgKCFHbG9iYWxzVG9JbXBvcnQpCisgICAgICBIYXNFeHBvcnRlZEZ1bmN0aW9ucyA9IEltcG9ydEluZGV4Lmhhc0V4cG9ydGVkRnVuY3Rpb25zKE0pOworCisjaWZuZGVmIE5ERUJVRworICAgIC8vIEZpcnN0IGNvbGxlY3QgdGhvc2UgaW4gdGhlIGxsdm0udXNlZCBzZXQuCisgICAgY29sbGVjdFVzZWRHbG9iYWxWYXJpYWJsZXMoTSwgVXNlZCwgLypDb21waWxlclVzZWQqLyBmYWxzZSk7CisgICAgLy8gTmV4dCBjb2xsZWN0IHRob3NlIGluIHRoZSBsbHZtLmNvbXBpbGVyLnVzZWQgc2V0LgorICAgIGNvbGxlY3RVc2VkR2xvYmFsVmFyaWFibGVzKE0sIFVzZWQsIC8qQ29tcGlsZXJVc2VkKi8gdHJ1ZSk7CisjZW5kaWYKKyAgfQorCisgIGJvb2wgcnVuKCk7CisKKyAgc3RhdGljIGJvb2wgZG9JbXBvcnRBc0RlZmluaXRpb24oY29uc3QgR2xvYmFsVmFsdWUgKlNHViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0VmVjdG9yPEdsb2JhbFZhbHVlICo+ICpHbG9iYWxzVG9JbXBvcnQpOworfTsKKworLy8vIFBlcmZvcm0gaW4tcGxhY2UgZ2xvYmFsIHZhbHVlIGhhbmRsaW5nIG9uIHRoZSBnaXZlbiBNb2R1bGUgZm9yCisvLy8gZXhwb3J0ZWQgbG9jYWwgZnVuY3Rpb25zIHJlbmFtZWQgYW5kIHByb21vdGVkIGZvciBUaGluTFRPLgorYm9vbCByZW5hbWVNb2R1bGVGb3JUaGluTFRPKAorICAgIE1vZHVsZSAmTSwgY29uc3QgTW9kdWxlU3VtbWFyeUluZGV4ICZJbmRleCwKKyAgICBTZXRWZWN0b3I8R2xvYmFsVmFsdWUgKj4gKkdsb2JhbHNUb0ltcG9ydCA9IG51bGxwdHIpOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9HbG9iYWxTdGF0dXMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9HbG9iYWxTdGF0dXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2MyNjViCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0dsb2JhbFN0YXR1cy5oCkBAIC0wLDAgKzEsODUgQEAKKy8vPT09LSBHbG9iYWxTdGF0dXMuaCAtIENvbXB1dGUgc3RhdHVzIGluZm8gZm9yIGdsb2JhbHMgLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0dMT0JBTFNUQVRVU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19HTE9CQUxTVEFUVVNfSAorCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0F0b21pY09yZGVyaW5nLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQ29uc3RhbnQ7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIFZhbHVlOworCisvLy8gSXQgaXMgc2FmZSB0byBkZXN0cm95IGEgY29uc3RhbnQgaWZmIGl0IGlzIG9ubHkgdXNlZCBieSBjb25zdGFudHMgaXRzZWxmLgorLy8vIE5vdGUgdGhhdCBjb25zdGFudHMgY2Fubm90IGJlIGN5Y2xpYywgc28gdGhpcyB0ZXN0IGlzIHByZXR0eSBlYXN5IHRvCisvLy8gaW1wbGVtZW50IHJlY3Vyc2l2ZWx5LgorLy8vCitib29sIGlzU2FmZVRvRGVzdHJveUNvbnN0YW50KGNvbnN0IENvbnN0YW50ICpDKTsKKworLy8vIEFzIHdlIGFuYWx5emUgZWFjaCBnbG9iYWwsIGtlZXAgdHJhY2sgb2Ygc29tZSBpbmZvcm1hdGlvbiBhYm91dCBpdC4gIElmIHdlCisvLy8gZmluZCBvdXQgdGhhdCB0aGUgYWRkcmVzcyBvZiB0aGUgZ2xvYmFsIGlzIHRha2VuLCBub25lIG9mIHRoaXMgaW5mbyB3aWxsIGJlCisvLy8gYWNjdXJhdGUuCitzdHJ1Y3QgR2xvYmFsU3RhdHVzIHsKKyAgLy8vIFRydWUgaWYgdGhlIGdsb2JhbCdzIGFkZHJlc3MgaXMgdXNlZCBpbiBhIGNvbXBhcmlzb24uCisgIGJvb2wgSXNDb21wYXJlZCA9IGZhbHNlOworCisgIC8vLyBUcnVlIGlmIHRoZSBnbG9iYWwgaXMgZXZlciBsb2FkZWQuICBJZiB0aGUgZ2xvYmFsIGlzbid0IGV2ZXIgbG9hZGVkIGl0CisgIC8vLyBjYW4gYmUgZGVsZXRlZC4KKyAgYm9vbCBJc0xvYWRlZCA9IGZhbHNlOworCisgIC8vLyBLZWVwIHRyYWNrIG9mIHdoYXQgc3RvcmVzIHRvIHRoZSBnbG9iYWwgbG9vayBsaWtlLgorICBlbnVtIFN0b3JlZFR5cGUgeworICAgIC8vLyBUaGVyZSBpcyBubyBzdG9yZSB0byB0aGlzIGdsb2JhbC4gIEl0IGNhbiB0aHVzIGJlIG1hcmtlZCBjb25zdGFudC4KKyAgICBOb3RTdG9yZWQsCisKKyAgICAvLy8gVGhpcyBnbG9iYWwgaXMgc3RvcmVkIHRvLCBidXQgdGhlIG9ubHkgdGhpbmcgc3RvcmVkIGlzIHRoZSBjb25zdGFudCBpdAorICAgIC8vLyB3YXMgaW5pdGlhbGl6ZWQgd2l0aC4gVGhpcyBpcyBvbmx5IHRyYWNrZWQgZm9yIHNjYWxhciBnbG9iYWxzLgorICAgIEluaXRpYWxpemVyU3RvcmVkLAorCisgICAgLy8vIFRoaXMgZ2xvYmFsIGlzIHN0b3JlZCB0bywgYnV0IG9ubHkgaXRzIGluaXRpYWxpemVyIGFuZCBvbmUgb3RoZXIgdmFsdWUKKyAgICAvLy8gaXMgZXZlciBzdG9yZWQgdG8gaXQuICBJZiB0aGlzIGdsb2JhbCBpc1N0b3JlZE9uY2UsIHdlIHRyYWNrIHRoZSB2YWx1ZQorICAgIC8vLyBzdG9yZWQgdG8gaXQgaW4gU3RvcmVkT25jZVZhbHVlIGJlbG93LiAgVGhpcyBpcyBvbmx5IHRyYWNrZWQgZm9yIHNjYWxhcgorICAgIC8vLyBnbG9iYWxzLgorICAgIFN0b3JlZE9uY2UsCisKKyAgICAvLy8gVGhpcyBnbG9iYWwgaXMgc3RvcmVkIHRvIGJ5IG11bHRpcGxlIHZhbHVlcyBvciBzb21ldGhpbmcgZWxzZSB0aGF0IHdlCisgICAgLy8vIGNhbm5vdCB0cmFjay4KKyAgICBTdG9yZWQKKyAgfSBTdG9yZWRUeXBlID0gTm90U3RvcmVkOworCisgIC8vLyBJZiBvbmx5IG9uZSB2YWx1ZSAoYmVzaWRlcyB0aGUgaW5pdGlhbGl6ZXIgY29uc3RhbnQpIGlzIGV2ZXIgc3RvcmVkIHRvCisgIC8vLyB0aGlzIGdsb2JhbCwga2VlcCB0cmFjayBvZiB3aGF0IHZhbHVlIGl0IGlzLgorICBWYWx1ZSAqU3RvcmVkT25jZVZhbHVlID0gbnVsbHB0cjsKKworICAvLy8gVGhlc2Ugc3RhcnQgb3V0IG51bGwvZmFsc2UuICBXaGVuIHRoZSBmaXJzdCBhY2Nlc3NpbmcgZnVuY3Rpb24gaXMgbm90aWNlZCwKKyAgLy8vIGl0IGlzIHJlY29yZGVkLiBXaGVuIGEgc2Vjb25kIGRpZmZlcmVudCBhY2Nlc3NpbmcgZnVuY3Rpb24gaXMgbm90aWNlZCwKKyAgLy8vIEhhc011bHRpcGxlQWNjZXNzaW5nRnVuY3Rpb25zIGlzIHNldCB0byB0cnVlLgorICBjb25zdCBGdW5jdGlvbiAqQWNjZXNzaW5nRnVuY3Rpb24gPSBudWxscHRyOworICBib29sIEhhc011bHRpcGxlQWNjZXNzaW5nRnVuY3Rpb25zID0gZmFsc2U7CisKKyAgLy8vIFNldCB0byB0cnVlIGlmIHRoaXMgZ2xvYmFsIGhhcyBhIHVzZXIgdGhhdCBpcyBub3QgYW4gaW5zdHJ1Y3Rpb24gKGUuZy4gYQorICAvLy8gY29uc3RhbnQgZXhwciBvciBHViBpbml0aWFsaXplcikuCisgIGJvb2wgSGFzTm9uSW5zdHJ1Y3Rpb25Vc2VyID0gZmFsc2U7CisKKyAgLy8vIFNldCB0byB0aGUgc3Ryb25nZXN0IGF0b21pYyBvcmRlcmluZyByZXF1aXJlbWVudC4KKyAgQXRvbWljT3JkZXJpbmcgT3JkZXJpbmcgPSBBdG9taWNPcmRlcmluZzo6Tm90QXRvbWljOworCisgIEdsb2JhbFN0YXR1cygpOworCisgIC8vLyBMb29rIGF0IGFsbCB1c2VzIG9mIHRoZSBnbG9iYWwgYW5kIGZpbGwgaW4gdGhlIEdsb2JhbFN0YXR1cyBzdHJ1Y3R1cmUuICBJZgorICAvLy8gdGhlIGdsb2JhbCBoYXMgaXRzIGFkZHJlc3MgdGFrZW4sIHJldHVybiB0cnVlIHRvIGluZGljYXRlIHdlIGNhbid0IGRvCisgIC8vLyBhbnl0aGluZyB3aXRoIGl0LgorICBzdGF0aWMgYm9vbCBhbmFseXplR2xvYmFsKGNvbnN0IFZhbHVlICpWLCBHbG9iYWxTdGF0dXMgJkdTKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfR0xPQkFMU1RBVFVTX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9JbXBvcnRlZEZ1bmN0aW9uc0lubGluaW5nU3RhdGlzdGljcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0ltcG9ydGVkRnVuY3Rpb25zSW5saW5pbmdTdGF0aXN0aWNzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhM2QxMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9JbXBvcnRlZEZ1bmN0aW9uc0lubGluaW5nU3RhdGlzdGljcy5oCkBAIC0wLDAgKzEsMTA3IEBACisvLz09PS0tIEltcG9ydGVkRnVuY3Rpb25zSW5saW5pbmdTdGF0cy5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gR2VuZXJhdGluZyBpbmxpbmVyIHN0YXRpc3RpY3MgZm9yIGltcG9ydGVkIGZ1bmN0aW9ucywgbW9zdGx5IHVzZWZ1bCBmb3IKKy8vIFRoaW5MVE8uCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19JTVBPUlRFREZVTkNUSU9OU0lOTElOSU5HU1RBVElTVElDU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19JTVBPUlRFREZVTkNUSU9OU0lOTElOSU5HU1RBVElTVElDU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ01hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIEZ1bmN0aW9uOworLy8vIFxicmllZiBDYWxjdWxhdGUgYW5kIGR1bXAgVGhpbkxUTyBzcGVjaWZpYyBpbmxpbmVyIHN0YXRzLgorLy8vIFRoZSBtYWluIHN0YXRpc3RpY3MgYXJlOgorLy8vICgxKSBOdW1iZXIgb2YgaW5saW5lZCBpbXBvcnRlZCBmdW5jdGlvbnMsCisvLy8gKDIpIE51bWJlciBvZiBpbXBvcnRlZCBmdW5jdGlvbnMgaW5saW5lZCBpbnRvIGltcG9ydGluZyBtb2R1bGUgKGluZGlyZWN0KSwKKy8vLyAoMykgTnVtYmVyIG9mIG5vbiBpbXBvcnRlZCBmdW5jdGlvbnMgaW5saW5lZCBpbnRvIGltcG9ydGluZyBtb2R1bGUKKy8vLyAoaW5kaXJlY3QpLgorLy8vIFRoZSBkaWZmZXJlbmNlIGJldHdlZW4gZmlyc3QgYW5kIHRoZSBzZWNvbmQgaXMgdGhhdCBmaXJzdCBzdGF0IGNvdW50cworLy8vIGFsbCBwZXJmb3JtZWQgaW5saW5lcyBvbiBpbXBvcnRlZCBmdW5jdGlvbnMsIGJ1dCB0aGUgc2Vjb25kIG9uZSBvbmx5IHRoZQorLy8vIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYmVlbiBldmVudHVhbGx5IGlubGluZWQgdG8gYSBmdW5jdGlvbiBpbiB0aGUgaW1wb3J0aW5nCisvLy8gbW9kdWxlIChieSBhIGNoYWluIG9mIGlubGluZXMpLiBCZWNhdXNlIGxsdm0gdXNlcyBib3R0b20tdXAgaW5saW5lciwgaXQgaXMKKy8vLyBwb3NzaWJsZSB0byBlLmcuIGltcG9ydCBmdW5jdGlvbiBgQWAsIGBCYCBhbmQgdGhlbiBpbmxpbmUgYEJgIHRvIGBBYCwKKy8vLyBhbmQgYWZ0ZXIgdGhpcyBgQWAgbWlnaHQgYmUgdG9vIGJpZyB0byBiZSBpbmxpbmVkIGludG8gc29tZSBvdGhlciBmdW5jdGlvbgorLy8vIHRoYXQgY2FsbHMgaXQuIEl0IGNhbGN1bGF0ZXMgdGhpcyBzdGF0aXN0aWMgYnkgYnVpbGRpbmcgZ3JhcGgsIHdoZXJlCisvLy8gdGhlIG5vZGVzIGFyZSBmdW5jdGlvbnMsIGFuZCBlZGdlcyBhcmUgcGVyZm9ybWVkIGlubGluZXMgYW5kIHRoZW4gYnkgbWFya2luZworLy8vIHRoZSBlZGdlcyBzdGFydGluZyBmcm9tIG5vdCBpbXBvcnRlZCBmdW5jdGlvbi4KKy8vLworLy8vIElmIGBWZXJib3NlYCBpcyBzZXQgdG8gdHJ1ZSwgdGhlbiBpdCBhbHNvIGR1bXBzIHN0YXRpc3RpY3MKKy8vLyBwZXIgZWFjaCBpbmxpbmVkIGZ1bmN0aW9uLCBzb3J0ZWQgYnkgdGhlIGdyZWF0ZXN0IGlubGluZXMgY291bnQgbGlrZQorLy8vIC0gbnVtYmVyIG9mIHBlcmZvcm1lZCBpbmxpbmVzCisvLy8gLSBudW1iZXIgb2YgcGVyZm9ybWVkIGlubGluZXMgdG8gaW1wb3J0aW5nIG1vZHVsZQorY2xhc3MgSW1wb3J0ZWRGdW5jdGlvbnNJbmxpbmluZ1N0YXRpc3RpY3MgeworcHJpdmF0ZToKKyAgLy8vIElubGluZUdyYXBoTm9kZSByZXByZXNlbnRzIG5vZGUgaW4gZ3JhcGggb2YgaW5saW5lZCBmdW5jdGlvbnMuCisgIHN0cnVjdCBJbmxpbmVHcmFwaE5vZGUgeworICAgIC8vIERlZmF1bHQtY29uc3RydWN0aWJsZSBhbmQgbW92YWJsZS4KKyAgICBJbmxpbmVHcmFwaE5vZGUoKSA9IGRlZmF1bHQ7CisgICAgSW5saW5lR3JhcGhOb2RlKElubGluZUdyYXBoTm9kZSAmJikgPSBkZWZhdWx0OworICAgIElubGluZUdyYXBoTm9kZSAmb3BlcmF0b3I9KElubGluZUdyYXBoTm9kZSAmJikgPSBkZWZhdWx0OworCisgICAgbGx2bTo6U21hbGxWZWN0b3I8SW5saW5lR3JhcGhOb2RlICosIDg+IElubGluZWRDYWxsZWVzOworICAgIC8vLyBJbmNyZW1lbnRlZCBldmVyeSBkaXJlY3QgaW5saW5lLgorICAgIGludDMyX3QgTnVtYmVyT2ZJbmxpbmVzID0gMDsKKyAgICAvLy8gTnVtYmVyIG9mIGlubGluZXMgaW50byBub24gaW1wb3J0ZWQgZnVuY3Rpb24gKHBvc3NpYmx5IGluZGlyZWN0IHZpYQorICAgIC8vLyBpbnRlcm1lZGlhdGUgaW5saW5lcykuIENvbXB1dGVkIGJhc2VkIG9uIGdyYXBoIHNlYXJjaC4KKyAgICBpbnQzMl90IE51bWJlck9mUmVhbElubGluZXMgPSAwOworICAgIGJvb2wgSW1wb3J0ZWQgPSBmYWxzZTsKKyAgICBib29sIFZpc2l0ZWQgPSBmYWxzZTsKKyAgfTsKKworcHVibGljOgorICBJbXBvcnRlZEZ1bmN0aW9uc0lubGluaW5nU3RhdGlzdGljcygpID0gZGVmYXVsdDsKKyAgSW1wb3J0ZWRGdW5jdGlvbnNJbmxpbmluZ1N0YXRpc3RpY3MoCisgICAgICBjb25zdCBJbXBvcnRlZEZ1bmN0aW9uc0lubGluaW5nU3RhdGlzdGljcyAmKSA9IGRlbGV0ZTsKKworICAvLy8gU2V0IGluZm9ybWF0aW9uIGxpa2UgQWxsRnVuY3Rpb25zLCBJbXBvcnRlZEZ1bmN0aW9ucywgTW9kdWxlTmFtZS4KKyAgdm9pZCBzZXRNb2R1bGVJbmZvKGNvbnN0IE1vZHVsZSAmTSk7CisgIC8vLyBSZWNvcmQgaW5saW5lIG9mIEBwYXJhbSBDYWxsZWUgdG8gQHBhcmFtIENhbGxlciBmb3Igc3RhdGlzdGlzLgorICB2b2lkIHJlY29yZElubGluZShjb25zdCBGdW5jdGlvbiAmQ2FsbGVyLCBjb25zdCBGdW5jdGlvbiAmQ2FsbGVlKTsKKyAgLy8vIER1bXAgc3RhdHMgY29tcHV0ZWQgd2l0aCBJbmxpbmVyU3RhdGlzdGljcyBjbGFzcy4KKyAgLy8vIElmIEBwYXJhbSBWZXJib3NlIGlzIHRydWUgdGhlbiBzZXBhcmF0ZSBzdGF0aXN0aWNzIGZvciBldmVyeSBpbmxpbmVkCisgIC8vLyBmdW5jdGlvbiB3aWxsIGJlIHByaW50ZWQuCisgIHZvaWQgZHVtcChib29sIFZlcmJvc2UpOworCitwcml2YXRlOgorICAvLy8gQ3JlYXRlcyBuZXcgTm9kZSBpbiBOb2RlTWFwIGFuZCBzZXRzIGF0dHJpYnV0ZXMsIG9yIHJldHVybnMgZXhpc3RlZCBvbmUuCisgIElubGluZUdyYXBoTm9kZSAmY3JlYXRlSW5saW5lR3JhcGhOb2RlKGNvbnN0IEZ1bmN0aW9uICYpOworICB2b2lkIGNhbGN1bGF0ZVJlYWxJbmxpbmVzKCk7CisgIHZvaWQgZGZzKElubGluZUdyYXBoTm9kZSAmR3JhcGhOb2RlKTsKKworICB1c2luZyBOb2Rlc01hcFR5ID0KKyAgICAgIGxsdm06OlN0cmluZ01hcDxzdGQ6OnVuaXF1ZV9wdHI8SW5saW5lR3JhcGhOb2RlPj47CisgIHVzaW5nIFNvcnRlZE5vZGVzVHkgPQorICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgTm9kZXNNYXBUeTo6TWFwRW50cnlUeSo+OworICAvLy8gUmV0dXJucyB2ZWN0b3Igb2YgZWxlbWVudHMgc29ydGVkIGJ5CisgIC8vLyAoLU51bWJlck9mSW5saW5lcywgLU51bWJlck9mUmVhbElubGluZXMsIEZ1bmN0aW9uTmFtZSkuCisgIFNvcnRlZE5vZGVzVHkgZ2V0U29ydGVkTm9kZXMoKTsKKworcHJpdmF0ZToKKyAgLy8vIFRoaXMgbWFwIG1hbmFnZSBsaWZlIG9mIGFsbCBJbmxpbmVHcmFwaE5vZGVzLiBVbmlxdWUgcG9pbnRlciB0bworICAvLy8gSW5saW5lR3JhcGhOb2RlIHVzZWQgc2luY2UgdGhlIG5vZGUgcG9pbnRlcnMgYXJlIGFsc28gc2F2ZWQgaW4gdGhlCisgIC8vLyBJbmxpbmVkQ2FsbGVlcyB2ZWN0b3IuIElmIGl0IHdvdWxkIHN0b3JlIElubGluZUdyYXBoTm9kZSBpbnN0ZWFkIHRoZW4gdGhlCisgIC8vLyBhZGRyZXNzIG9mIHRoZSBub2RlIHdvdWxkIG5vdCBiZSBpbnZhcmlhbnQuCisgIE5vZGVzTWFwVHkgTm9kZXNNYXA7CisgIC8vLyBOb24gZXh0ZXJuYWwgZnVuY3Rpb25zIHRoYXQgaGF2ZSBzb21lIG90aGVyIGZ1bmN0aW9uIGlubGluZWQgaW5zaWRlLgorICBzdGQ6OnZlY3RvcjxTdHJpbmdSZWY+IE5vbkltcG9ydGVkQ2FsbGVyczsKKyAgaW50IEFsbEZ1bmN0aW9ucyA9IDA7CisgIGludCBJbXBvcnRlZEZ1bmN0aW9ucyA9IDA7CisgIFN0cmluZ1JlZiBNb2R1bGVOYW1lOworfTsKKworfSAvLyBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfSU1QT1JURURGVU5DVElPTlNJTkxJTklOR1NUQVRJU1RJQ1NfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0ludGVnZXJEaXZpc2lvbi5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0ludGVnZXJEaXZpc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBlYzMzMjEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvSW50ZWdlckRpdmlzaW9uLmgKQEAgLTAsMCArMSw3MyBAQAorLy89PT0tIGxsdm0vVHJhbnNmb3Jtcy9VdGlscy9JbnRlZ2VyRGl2aXNpb24uaCAtLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgY29udGFpbnMgYW4gaW1wbGVtZW50YXRpb24gb2YgMzJiaXQgYW5kIDY0Yml0IHNjYWxhciBpbnRlZ2VyCisvLyBkaXZpc2lvbiBmb3IgdGFyZ2V0cyB0aGF0IGRvbid0IGhhdmUgbmF0aXZlIHN1cHBvcnQuIEl0J3MgbGFyZ2VseSBkZXJpdmVkCisvLyBmcm9tIGNvbXBpbGVyLXJ0J3MgaW1wbGVtZW50YXRpb25zIG9mIF9fdWRpdnNpMyBhbmQgX191ZGl2bW9kZGk0LAorLy8gYnV0IGhhbmQtdHVuZWQgZm9yIHRhcmdldHMgdGhhdCBwcmVmZXIgbGVzcyBjb250cm9sIGZsb3cuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfSU5URUdFUkRJVklTSU9OX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0lOVEVHRVJESVZJU0lPTl9ICisKK25hbWVzcGFjZSBsbHZtIHsKKyAgY2xhc3MgQmluYXJ5T3BlcmF0b3I7Cit9CisKK25hbWVzcGFjZSBsbHZtIHsKKworICAvLy8gR2VuZXJhdGUgY29kZSB0byBjYWxjdWxhdGUgdGhlIHJlbWFpbmRlciBvZiB0d28gaW50ZWdlcnMsIHJlcGxhY2luZyBSZW0KKyAgLy8vIHdpdGggdGhlIGdlbmVyYXRlZCBjb2RlLiBUaGlzIGN1cnJlbnRseSBnZW5lcmF0ZXMgY29kZSB1c2luZyB0aGUgdWRpdgorICAvLy8gZXhwYW5zaW9uLCBidXQgZnV0dXJlIHdvcmsgaW5jbHVkZXMgZ2VuZXJhdGluZyBtb3JlIHNwZWNpYWxpemVkIGNvZGUsCisgIC8vLyBlLmcuIHdoZW4gbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3BlcmFuZHMgYXJlIGtub3duLiBJbXBsZW1lbnRzIGJvdGgKKyAgLy8vIDMyYml0IGFuZCA2NGJpdCBzY2FsYXIgZGl2aXNpb24uCisgIC8vLworICAvLy8gQGJyaWVmIFJlcGxhY2UgUmVtIHdpdGggZ2VuZXJhdGVkIGNvZGUuCisgIGJvb2wgZXhwYW5kUmVtYWluZGVyKEJpbmFyeU9wZXJhdG9yICpSZW0pOworCisgIC8vLyBHZW5lcmF0ZSBjb2RlIHRvIGRpdmlkZSB0d28gaW50ZWdlcnMsIHJlcGxhY2luZyBEaXYgd2l0aCB0aGUgZ2VuZXJhdGVkCisgIC8vLyBjb2RlLiBUaGlzIGN1cnJlbnRseSBnZW5lcmF0ZXMgY29kZSBzaW1pbGFybHkgdG8gY29tcGlsZXItcnQncworICAvLy8gaW1wbGVtZW50YXRpb25zLCBidXQgZnV0dXJlIHdvcmsgaW5jbHVkZXMgZ2VuZXJhdGluZyBtb3JlIHNwZWNpYWxpemVkIGNvZGUKKyAgLy8vIHdoZW4gbW9yZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3BlcmFuZHMgYXJlIGtub3duLiBJbXBsZW1lbnRzIGJvdGgKKyAgLy8vIDMyYml0IGFuZCA2NGJpdCBzY2FsYXIgZGl2aXNpb24uCisgIC8vLworICAvLy8gQGJyaWVmIFJlcGxhY2UgRGl2IHdpdGggZ2VuZXJhdGVkIGNvZGUuCisgIGJvb2wgZXhwYW5kRGl2aXNpb24oQmluYXJ5T3BlcmF0b3IqIERpdik7CisKKyAgLy8vIEdlbmVyYXRlIGNvZGUgdG8gY2FsY3VsYXRlIHRoZSByZW1haW5kZXIgb2YgdHdvIGludGVnZXJzLCByZXBsYWNpbmcgUmVtCisgIC8vLyB3aXRoIHRoZSBnZW5lcmF0ZWQgY29kZS4gVXNlcyBFeHBhbmRSZW1pbmRlciB3aXRoIGEgMzJiaXQgUmVtIHdoaWNoCisgIC8vLyBtYWtlcyBpdCB1c2VmdWwgZm9yIHRhcmdldHMgd2l0aCBsaXR0bGUgb3Igbm8gc3VwcG9ydCBmb3IgbGVzcyB0aGFuCisgIC8vLyAzMiBiaXQgYXJpdGhtZXRpYy4KKyAgLy8vCisgIC8vLyBAYnJpZWYgUmVwbGFjZSBSZW0gd2l0aCBnZW5lcmF0ZWQgY29kZS4KKyAgYm9vbCBleHBhbmRSZW1haW5kZXJVcFRvMzJCaXRzKEJpbmFyeU9wZXJhdG9yICpSZW0pOworCisgIC8vLyBHZW5lcmF0ZSBjb2RlIHRvIGNhbGN1bGF0ZSB0aGUgcmVtYWluZGVyIG9mIHR3byBpbnRlZ2VycywgcmVwbGFjaW5nIFJlbQorICAvLy8gd2l0aCB0aGUgZ2VuZXJhdGVkIGNvZGUuIFVzZXMgRXhwYW5kUmVtaW5kZXIgd2l0aCBhIDY0Yml0IFJlbS4KKyAgLy8vCisgIC8vLyBAYnJpZWYgUmVwbGFjZSBSZW0gd2l0aCBnZW5lcmF0ZWQgY29kZS4KKyAgYm9vbCBleHBhbmRSZW1haW5kZXJVcFRvNjRCaXRzKEJpbmFyeU9wZXJhdG9yICpSZW0pOworCisgIC8vLyBHZW5lcmF0ZSBjb2RlIHRvIGRpdmlkZSB0d28gaW50ZWdlcnMsIHJlcGxhY2luZyBEaXYgd2l0aCB0aGUgZ2VuZXJhdGVkCisgIC8vLyBjb2RlLiBVc2VzIEV4cGFuZERpdmlzaW9uIHdpdGggYSAzMmJpdCBEaXYgd2hpY2ggbWFrZXMgaXQgdXNlZnVsIGZvcgorICAvLy8gdGFyZ2V0cyB3aXRoIGxpdHRsZSBvciBubyBzdXBwb3J0IGZvciBsZXNzIHRoYW4gMzIgYml0IGFyaXRobWV0aWMuCisgIC8vLworICAvLy8gQGJyaWVmIFJlcGxhY2UgUmVtIHdpdGggZ2VuZXJhdGVkIGNvZGUuCisgIGJvb2wgZXhwYW5kRGl2aXNpb25VcFRvMzJCaXRzKEJpbmFyeU9wZXJhdG9yICpEaXYpOworCisgIC8vLyBHZW5lcmF0ZSBjb2RlIHRvIGRpdmlkZSB0d28gaW50ZWdlcnMsIHJlcGxhY2luZyBEaXYgd2l0aCB0aGUgZ2VuZXJhdGVkCisgIC8vLyBjb2RlLiBVc2VzIEV4cGFuZERpdmlzaW9uIHdpdGggYSA2NGJpdCBEaXYuCisgIC8vLworICAvLy8gQGJyaWVmIFJlcGxhY2UgUmVtIHdpdGggZ2VuZXJhdGVkIGNvZGUuCisgIGJvb2wgZXhwYW5kRGl2aXNpb25VcFRvNjRCaXRzKEJpbmFyeU9wZXJhdG9yICpEaXYpOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9MQ1NTQS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xDU1NBLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmU3MTdlNQotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9MQ1NTQS5oCkBAIC0wLDAgKzEsNDQgQEAKKy8vPT09LSBMQ1NTQS5oIC0gTG9vcC1jbG9zZWQgU1NBIHRyYW5zZm9ybSBQYXNzIC0tLS0tLS0tLS0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBwYXNzIHRyYW5zZm9ybXMgbG9vcHMgYnkgcGxhY2luZyBwaGkgbm9kZXMgYXQgdGhlIGVuZCBvZiB0aGUgbG9vcHMgZm9yCisvLyBhbGwgdmFsdWVzIHRoYXQgYXJlIGxpdmUgYWNyb3NzIHRoZSBsb29wIGJvdW5kYXJ5LiAgRm9yIGV4YW1wbGUsIGl0IHR1cm5zCisvLyB0aGUgbGVmdCBpbnRvIHRoZSByaWdodCBjb2RlOgorLy8KKy8vIGZvciAoLi4uKSAgICAgICAgICAgICAgICBmb3IgKC4uLikKKy8vICAgaWYgKGMpICAgICAgICAgICAgICAgICAgIGlmIChjKQorLy8gICAgIFgxID0gLi4uICAgICAgICAgICAgICAgICBYMSA9IC4uLgorLy8gICBlbHNlICAgICAgICAgICAgICAgICAgICAgZWxzZQorLy8gICAgIFgyID0gLi4uICAgICAgICAgICAgICAgICBYMiA9IC4uLgorLy8gICBYMyA9IHBoaShYMSwgWDIpICAgICAgICAgWDMgPSBwaGkoWDEsIFgyKQorLy8gLi4uID0gWDMgKyA0ICAgICAgICAgICAgIFg0ID0gcGhpKFgzKQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC4uLiA9IFg0ICsgNAorLy8KKy8vIFRoaXMgaXMgc3RpbGwgdmFsaWQgTExWTTsgdGhlIGV4dHJhIHBoaSBub2RlcyBhcmUgcHVyZWx5IHJlZHVuZGFudCwgYW5kIHdpbGwKKy8vIGJlIHRyaXZpYWxseSBlbGltaW5hdGVkIGJ5IEluc3RDb21iaW5lLiAgVGhlIG1ham9yIGJlbmVmaXQgb2YgdGhpcworLy8gdHJhbnNmb3JtYXRpb24gaXMgdGhhdCBpdCBtYWtlcyBtYW55IG90aGVyIGxvb3Agb3B0aW1pemF0aW9ucywgc3VjaCBhcworLy8gTG9vcFVuc3dpdGNoaW5nLCBzaW1wbGVyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0xDU1NBX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0xDU1NBX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gQ29udmVydHMgbG9vcHMgaW50byBsb29wLWNsb3NlZCBTU0EgZm9ybS4KK2NsYXNzIExDU1NBUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPExDU1NBUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19VVElMU19MQ1NTQV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTGliQ2FsbHNTaHJpbmtXcmFwLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTGliQ2FsbHNTaHJpbmtXcmFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzlkZjUzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9MaWJDYWxsc1Nocmlua1dyYXAuaApAQCAtMCwwICsxLDI3IEBACisvLz09PS0gTGliQ2FsbHNTaHJpbmtXcmFwLmggLSBTaHJpbmsgV3JhcCBMaWJyYXJ5IENhbGxzIC0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0xJQkNBTExTU0hSSU5LV1JBUF9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19MSUJDQUxMU1NIUklOS1dSQVBfSAorCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExpYkNhbGxzU2hyaW5rV3JhcFBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxMaWJDYWxsc1Nocmlua1dyYXBQYXNzPiB7CitwdWJsaWM6CisgIHN0YXRpYyBTdHJpbmdSZWYgbmFtZSgpIHsgcmV0dXJuICJMaWJDYWxsc1Nocmlua1dyYXBQYXNzIjsgfQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkZBTSk7Cit9OworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19VVElMU19MSUJDQUxMU1NIUklOS1dSQVBfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvb3BSb3RhdGlvblV0aWxzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTG9vcFJvdGF0aW9uVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYTRkMmNkCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvb3BSb3RhdGlvblV0aWxzLmgKQEAgLTAsMCArMSwzNSBAQAorLy89PT0tIExvb3BSb3RhdGlvblV0aWxzLmggLSBVdGlsaXRpZXMgdG8gcGVyZm9ybSBsb29wIHJvdGF0aW9uIC0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgdXRpbGl0aWVzIHRvIGNvbnZlcnQgYSBsb29wIGludG8gYSBsb29wIHdpdGggYm90dG9tIHRlc3QuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTE9PUFJPVEFUSU9OVVRJTFNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTE9PUFJPVEFUSU9OVVRJTFNfSAorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFzc3VtcHRpb25DYWNoZTsKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBMb29wOworY2xhc3MgTG9vcEluZm87CitjbGFzcyBTY2FsYXJFdm9sdXRpb247CitzdHJ1Y3QgU2ltcGxpZnlRdWVyeTsKK2NsYXNzIFRhcmdldFRyYW5zZm9ybUluZm87CisKKy8vLyBcYnJpZWYgQ29udmVydCBhIGxvb3AgaW50byBhIGxvb3Agd2l0aCBib3R0b20gdGVzdC4KK2Jvb2wgTG9vcFJvdGF0aW9uKExvb3AgKkwsIHVuc2lnbmVkIE1heEhlYWRlclNpemUsIExvb3BJbmZvICpMSSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IFRhcmdldFRyYW5zZm9ybUluZm8gKlRUSSwgQXNzdW1wdGlvbkNhY2hlICpBQywKKyAgICAgICAgICAgICAgICAgIERvbWluYXRvclRyZWUgKkRULCBTY2FsYXJFdm9sdXRpb24gKlNFLAorICAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxpZnlRdWVyeSAmU1EpOworCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvb3BTaW1wbGlmeS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvb3BTaW1wbGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzODI4YmMKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTG9vcFNpbXBsaWZ5LmgKQEAgLTAsMCArMSw2NSBAQAorLy89PT0tIExvb3BTaW1wbGlmeS5oIC0gTG9vcCBDYW5vbmljYWxpemF0aW9uIFBhc3MgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIHBhc3MgcGVyZm9ybXMgc2V2ZXJhbCB0cmFuc2Zvcm1hdGlvbnMgdG8gdHJhbnNmb3JtIG5hdHVyYWwgbG9vcHMgaW50byBhCisvLyBzaW1wbGVyIGZvcm0sIHdoaWNoIG1ha2VzIHN1YnNlcXVlbnQgYW5hbHlzZXMgYW5kIHRyYW5zZm9ybWF0aW9ucyBzaW1wbGVyIGFuZAorLy8gbW9yZSBlZmZlY3RpdmUuCisvLworLy8gTG9vcCBwcmUtaGVhZGVyIGluc2VydGlvbiBndWFyYW50ZWVzIHRoYXQgdGhlcmUgaXMgYSBzaW5nbGUsIG5vbi1jcml0aWNhbAorLy8gZW50cnkgZWRnZSBmcm9tIG91dHNpZGUgb2YgdGhlIGxvb3AgdG8gdGhlIGxvb3AgaGVhZGVyLiAgVGhpcyBzaW1wbGlmaWVzIGEKKy8vIG51bWJlciBvZiBhbmFseXNlcyBhbmQgdHJhbnNmb3JtYXRpb25zLCBzdWNoIGFzIExJQ00uCisvLworLy8gTG9vcCBleGl0LWJsb2NrIGluc2VydGlvbiBndWFyYW50ZWVzIHRoYXQgYWxsIGV4aXQgYmxvY2tzIGZyb20gdGhlIGxvb3AKKy8vIChibG9ja3Mgd2hpY2ggYXJlIG91dHNpZGUgb2YgdGhlIGxvb3AgdGhhdCBoYXZlIHByZWRlY2Vzc29ycyBpbnNpZGUgb2YgdGhlCisvLyBsb29wKSBvbmx5IGhhdmUgcHJlZGVjZXNzb3JzIGZyb20gaW5zaWRlIG9mIHRoZSBsb29wIChhbmQgYXJlIHRodXMgZG9taW5hdGVkCisvLyBieSB0aGUgbG9vcCBoZWFkZXIpLiAgVGhpcyBzaW1wbGlmaWVzIHRyYW5zZm9ybWF0aW9ucyBzdWNoIGFzIHN0b3JlLXNpbmtpbmcKKy8vIHRoYXQgYXJlIGJ1aWx0IGludG8gTElDTS4KKy8vCisvLyBUaGlzIHBhc3MgYWxzbyBndWFyYW50ZWVzIHRoYXQgbG9vcHMgd2lsbCBoYXZlIGV4YWN0bHkgb25lIGJhY2tlZGdlLgorLy8KKy8vIEluZGlyZWN0YnIgaW5zdHJ1Y3Rpb25zIGludHJvZHVjZSBzZXZlcmFsIGNvbXBsaWNhdGlvbnMuIElmIHRoZSBsb29wCisvLyBjb250YWlucyBvciBpcyBlbnRlcmVkIGJ5IGFuIGluZGlyZWN0YnIgaW5zdHJ1Y3Rpb24sIGl0IG1heSBub3QgYmUgcG9zc2libGUKKy8vIHRvIHRyYW5zZm9ybSB0aGUgbG9vcCBhbmQgbWFrZSB0aGVzZSBndWFyYW50ZWVzLiBDbGllbnQgY29kZSBzaG91bGQgY2hlY2sKKy8vIHRoYXQgdGhlc2UgY29uZGl0aW9ucyBhcmUgdHJ1ZSBiZWZvcmUgcmVseWluZyBvbiB0aGVtLgorLy8KKy8vIE5vdGUgdGhhdCB0aGUgc2ltcGxpZnljZmcgcGFzcyB3aWxsIGNsZWFuIHVwIGJsb2NrcyB3aGljaCBhcmUgc3BsaXQgb3V0IGJ1dAorLy8gZW5kIHVwIGJlaW5nIHVubmVjZXNzYXJ5LCBzbyB1c2FnZSBvZiB0aGlzIHBhc3Mgc2hvdWxkIG5vdCBwZXNzaW1pemUKKy8vIGdlbmVyYXRlZCBjb2RlLgorLy8KKy8vIFRoaXMgcGFzcyBvYnZpb3VzbHkgbW9kaWZpZXMgdGhlIENGRywgYnV0IHVwZGF0ZXMgbG9vcCBpbmZvcm1hdGlvbiBhbmQKKy8vIGRvbWluYXRvciBpbmZvcm1hdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTE9PUFNJTVBMSUZZX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0xPT1BTSU1QTElGWV9ICisKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0Fzc3VtcHRpb25DYWNoZS5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvU2NhbGFyRXZvbHV0aW9uLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBUaGlzIHBhc3MgaXMgcmVzcG9uc2libGUgZm9yIGxvb3AgY2Fub25pY2FsaXphdGlvbi4KK2NsYXNzIExvb3BTaW1wbGlmeVBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxMb29wU2ltcGxpZnlQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKKy8vLyBcYnJpZWYgU2ltcGxpZnkgZWFjaCBsb29wIGluIGEgbG9vcCBuZXN0IHJlY3Vyc2l2ZWx5LgorLy8vCisvLy8gVGhpcyB0YWtlcyBhIHBvdGVudGlhbGx5IHVuLXNpbXBsaWZpZWQgbG9vcCBMIChhbmQgaXRzIGNoaWxkcmVuKSBhbmQgdHVybnMKKy8vLyBpdCBpbnRvIGEgc2ltcGxpZmllZCBsb29wIG5lc3Qgd2l0aCBwcmVoZWFkZXJzIGFuZCBzaW5nbGUgYmFja2VkZ2VzLiBJdCB3aWxsCisvLy8gdXBkYXRlIFxjIEFsaWFzQW5hbHlzaXMgYW5kIFxjIFNjYWxhckV2b2x1dGlvbiBhbmFseXNlcyBpZiB0aGV5J3JlIG5vbi1udWxsLgorYm9vbCBzaW1wbGlmeUxvb3AoTG9vcCAqTCwgRG9taW5hdG9yVHJlZSAqRFQsIExvb3BJbmZvICpMSSwgU2NhbGFyRXZvbHV0aW9uICpTRSwKKyAgICAgICAgICAgICAgICAgIEFzc3VtcHRpb25DYWNoZSAqQUMsIGJvb2wgUHJlc2VydmVMQ1NTQSk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTE9PUFNJTVBMSUZZX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb29wVXRpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb29wVXRpbHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzFhNGIwCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvb3BVdGlscy5oCkBAIC0wLDAgKzEsNTQ2IEBACisvLz09PS0gbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvb3BVdGlscy5oIC0gTG9vcCB1dGlsaXRpZXMgLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHNvbWUgbG9vcCB0cmFuc2Zvcm1hdGlvbiB1dGlsaXRpZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTE9PUFVUSUxTX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0xPT1BVVElMU19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL09wdGlvbmFsLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU2V0VmVjdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvQWxpYXNBbmFseXNpcy5oIgorI2luY2x1ZGUgImxsdm0vQW5hbHlzaXMvRGVtYW5kZWRCaXRzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9FSFBlcnNvbmFsaXRpZXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL011c3RFeGVjdXRlLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9UYXJnZXRUcmFuc2Zvcm1JbmZvLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Eb21pbmF0b3JzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9JUkJ1aWxkZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RyVHlwZXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL09wZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZUhhbmRsZS5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9DYXN0aW5nLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQWxpYXNTZXQ7CitjbGFzcyBBbGlhc1NldFRyYWNrZXI7CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIExvb3A7CitjbGFzcyBMb29wSW5mbzsKK2NsYXNzIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXI7CitjbGFzcyBQcmVkaWNhdGVkU2NhbGFyRXZvbHV0aW9uOworY2xhc3MgUHJlZEl0ZXJhdG9yQ2FjaGU7CitjbGFzcyBTY2FsYXJFdm9sdXRpb247CitjbGFzcyBTQ0VWOworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CitjbGFzcyBUYXJnZXRUcmFuc2Zvcm1JbmZvOworCisKKy8vLyBUaGUgUmVjdXJyZW5jZURlc2NyaXB0b3IgaXMgdXNlZCB0byBpZGVudGlmeSByZWN1cnJlbmNlcyB2YXJpYWJsZXMgaW4gYQorLy8vIGxvb3AuIFJlZHVjdGlvbiBpcyBhIHNwZWNpYWwgY2FzZSBvZiByZWN1cnJlbmNlIHRoYXQgaGFzIHVzZXMgb2YgdGhlCisvLy8gcmVjdXJyZW5jZSB2YXJpYWJsZSBvdXRzaWRlIHRoZSBsb29wLiBUaGUgbWV0aG9kIGlzUmVkdWN0aW9uUEhJIGlkZW50aWZpZXMKKy8vLyByZWR1Y3Rpb25zIHRoYXQgYXJlIGJhc2ljIHJlY3VycmVuY2VzLgorLy8vCisvLy8gQmFzaWMgcmVjdXJyZW5jZXMgYXJlIGRlZmluZWQgYXMgdGhlIHN1bW1hdGlvbiwgcHJvZHVjdCwgT1IsIEFORCwgWE9SLCBtaW4sCisvLy8gb3IgbWF4IG9mIGEgc2V0IG9mIHRlcm1zLiBGb3IgZXhhbXBsZTogZm9yKGk9MDsgaTxuOyBpKyspIHsgdG90YWwgKz0KKy8vLyBhcnJheVtpXTsgfSBpcyBhIHN1bW1hdGlvbiBvZiBhcnJheSBlbGVtZW50cy4gQmFzaWMgcmVjdXJyZW5jZXMgYXJlIGEKKy8vLyBzcGVjaWFsIGNhc2Ugb2YgY2hhaW5zIG9mIHJlY3VycmVuY2VzIChDUikuIFNlZSBTY2FsYXJFdm9sdXRpb24gZm9yIENSCisvLy8gcmVmZXJlbmNlcy4KKworLy8vIFRoaXMgc3RydWN0IGhvbGRzIGluZm9ybWF0aW9uIGFib3V0IHJlY3VycmVuY2UgdmFyaWFibGVzLgorY2xhc3MgUmVjdXJyZW5jZURlc2NyaXB0b3IgeworcHVibGljOgorICAvLy8gVGhpcyBlbnVtIHJlcHJlc2VudHMgdGhlIGtpbmRzIG9mIHJlY3VycmVuY2VzIHRoYXQgd2Ugc3VwcG9ydC4KKyAgZW51bSBSZWN1cnJlbmNlS2luZCB7CisgICAgUktfTm9SZWN1cnJlbmNlLCAgLy8vPCBOb3QgYSByZWN1cnJlbmNlLgorICAgIFJLX0ludGVnZXJBZGQsICAgIC8vLzwgU3VtIG9mIGludGVnZXJzLgorICAgIFJLX0ludGVnZXJNdWx0LCAgIC8vLzwgUHJvZHVjdCBvZiBpbnRlZ2Vycy4KKyAgICBSS19JbnRlZ2VyT3IsICAgICAvLy88IEJpdHdpc2Ugb3IgbG9naWNhbCBPUiBvZiBudW1iZXJzLgorICAgIFJLX0ludGVnZXJBbmQsICAgIC8vLzwgQml0d2lzZSBvciBsb2dpY2FsIEFORCBvZiBudW1iZXJzLgorICAgIFJLX0ludGVnZXJYb3IsICAgIC8vLzwgQml0d2lzZSBvciBsb2dpY2FsIFhPUiBvZiBudW1iZXJzLgorICAgIFJLX0ludGVnZXJNaW5NYXgsIC8vLzwgTWluL21heCBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBzZWxlY3QoY21wKCkpLgorICAgIFJLX0Zsb2F0QWRkLCAgICAgIC8vLzwgU3VtIG9mIGZsb2F0cy4KKyAgICBSS19GbG9hdE11bHQsICAgICAvLy88IFByb2R1Y3Qgb2YgZmxvYXRzLgorICAgIFJLX0Zsb2F0TWluTWF4ICAgIC8vLzwgTWluL21heCBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBzZWxlY3QoY21wKCkpLgorICB9OworCisgIC8vIFRoaXMgZW51bSByZXByZXNlbnRzIHRoZSBraW5kIG9mIG1pbm1heCByZWN1cnJlbmNlLgorICBlbnVtIE1pbk1heFJlY3VycmVuY2VLaW5kIHsKKyAgICBNUktfSW52YWxpZCwKKyAgICBNUktfVUludE1pbiwKKyAgICBNUktfVUludE1heCwKKyAgICBNUktfU0ludE1pbiwKKyAgICBNUktfU0ludE1heCwKKyAgICBNUktfRmxvYXRNaW4sCisgICAgTVJLX0Zsb2F0TWF4CisgIH07CisKKyAgUmVjdXJyZW5jZURlc2NyaXB0b3IoKSA9IGRlZmF1bHQ7CisKKyAgUmVjdXJyZW5jZURlc2NyaXB0b3IoVmFsdWUgKlN0YXJ0LCBJbnN0cnVjdGlvbiAqRXhpdCwgUmVjdXJyZW5jZUtpbmQgSywKKyAgICAgICAgICAgICAgICAgICAgICAgTWluTWF4UmVjdXJyZW5jZUtpbmQgTUssIEluc3RydWN0aW9uICpVQUksIFR5cGUgKlJULAorICAgICAgICAgICAgICAgICAgICAgICBib29sIFNpZ25lZCwgU21hbGxQdHJTZXRJbXBsPEluc3RydWN0aW9uICo+ICZDSSkKKyAgICAgIDogU3RhcnRWYWx1ZShTdGFydCksIExvb3BFeGl0SW5zdHIoRXhpdCksIEtpbmQoSyksIE1pbk1heEtpbmQoTUspLAorICAgICAgICBVbnNhZmVBbGdlYnJhSW5zdChVQUkpLCBSZWN1cnJlbmNlVHlwZShSVCksIElzU2lnbmVkKFNpZ25lZCkgeworICAgIENhc3RJbnN0cy5pbnNlcnQoQ0kuYmVnaW4oKSwgQ0kuZW5kKCkpOworICB9CisKKyAgLy8vIFRoaXMgUE9EIHN0cnVjdCBob2xkcyBpbmZvcm1hdGlvbiBhYm91dCBhIHBvdGVudGlhbCByZWN1cnJlbmNlIG9wZXJhdGlvbi4KKyAgY2xhc3MgSW5zdERlc2MgeworICBwdWJsaWM6CisgICAgSW5zdERlc2MoYm9vbCBJc1JlY3VyLCBJbnN0cnVjdGlvbiAqSSwgSW5zdHJ1Y3Rpb24gKlVBSSA9IG51bGxwdHIpCisgICAgICAgIDogSXNSZWN1cnJlbmNlKElzUmVjdXIpLCBQYXR0ZXJuTGFzdEluc3QoSSksIE1pbk1heEtpbmQoTVJLX0ludmFsaWQpLAorICAgICAgICAgIFVuc2FmZUFsZ2VicmFJbnN0KFVBSSkge30KKworICAgIEluc3REZXNjKEluc3RydWN0aW9uICpJLCBNaW5NYXhSZWN1cnJlbmNlS2luZCBLLCBJbnN0cnVjdGlvbiAqVUFJID0gbnVsbHB0cikKKyAgICAgICAgOiBJc1JlY3VycmVuY2UodHJ1ZSksIFBhdHRlcm5MYXN0SW5zdChJKSwgTWluTWF4S2luZChLKSwKKyAgICAgICAgICBVbnNhZmVBbGdlYnJhSW5zdChVQUkpIHt9CisKKyAgICBib29sIGlzUmVjdXJyZW5jZSgpIHsgcmV0dXJuIElzUmVjdXJyZW5jZTsgfQorCisgICAgYm9vbCBoYXNVbnNhZmVBbGdlYnJhKCkgeyByZXR1cm4gVW5zYWZlQWxnZWJyYUluc3QgIT0gbnVsbHB0cjsgfQorCisgICAgSW5zdHJ1Y3Rpb24gKmdldFVuc2FmZUFsZ2VicmFJbnN0KCkgeyByZXR1cm4gVW5zYWZlQWxnZWJyYUluc3Q7IH0KKworICAgIE1pbk1heFJlY3VycmVuY2VLaW5kIGdldE1pbk1heEtpbmQoKSB7IHJldHVybiBNaW5NYXhLaW5kOyB9CisKKyAgICBJbnN0cnVjdGlvbiAqZ2V0UGF0dGVybkluc3QoKSB7IHJldHVybiBQYXR0ZXJuTGFzdEluc3Q7IH0KKworICBwcml2YXRlOgorICAgIC8vIElzIHRoaXMgaW5zdHJ1Y3Rpb24gYSByZWN1cnJlbmNlIGNhbmRpZGF0ZS4KKyAgICBib29sIElzUmVjdXJyZW5jZTsKKyAgICAvLyBUaGUgbGFzdCBpbnN0cnVjdGlvbiBpbiBhIG1pbi9tYXggcGF0dGVybiAoc2VsZWN0IG9mIHRoZSBzZWxlY3QoaWNtcCgpKQorICAgIC8vIHBhdHRlcm4pLCBvciB0aGUgY3VycmVudCByZWN1cnJlbmNlIGluc3RydWN0aW9uIG90aGVyd2lzZS4KKyAgICBJbnN0cnVjdGlvbiAqUGF0dGVybkxhc3RJbnN0OworICAgIC8vIElmIHRoaXMgaXMgYSBtaW4vbWF4IHBhdHRlcm4gdGhlIGNvbXBhcmlzb24gcHJlZGljYXRlLgorICAgIE1pbk1heFJlY3VycmVuY2VLaW5kIE1pbk1heEtpbmQ7CisgICAgLy8gUmVjdXJyZW5jZSBoYXMgdW5zYWZlIGFsZ2VicmEuCisgICAgSW5zdHJ1Y3Rpb24gKlVuc2FmZUFsZ2VicmFJbnN0OworICB9OworCisgIC8vLyBSZXR1cm5zIGEgc3RydWN0IGRlc2NyaWJpbmcgaWYgdGhlIGluc3RydWN0aW9uICdJJyBjYW4gYmUgYSByZWN1cnJlbmNlCisgIC8vLyB2YXJpYWJsZSBvZiB0eXBlICdLaW5kJy4gSWYgdGhlIHJlY3VycmVuY2UgaXMgYSBtaW4vbWF4IHBhdHRlcm4gb2YKKyAgLy8vIHNlbGVjdChpY21wKCkpIHRoaXMgZnVuY3Rpb24gYWR2YW5jZXMgdGhlIGluc3RydWN0aW9uIHBvaW50ZXIgJ0knIGZyb20gdGhlCisgIC8vLyBjb21wYXJlIGluc3RydWN0aW9uIHRvIHRoZSBzZWxlY3QgaW5zdHJ1Y3Rpb24gYW5kIHN0b3JlcyB0aGlzIHBvaW50ZXIgaW4KKyAgLy8vICdQYXR0ZXJuTGFzdEluc3QnIG1lbWJlciBvZiB0aGUgcmV0dXJuZWQgc3RydWN0LgorICBzdGF0aWMgSW5zdERlc2MgaXNSZWN1cnJlbmNlSW5zdHIoSW5zdHJ1Y3Rpb24gKkksIFJlY3VycmVuY2VLaW5kIEtpbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0RGVzYyAmUHJldiwgYm9vbCBIYXNGdW5Ob05hTkF0dHIpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgaW5zdHJ1Y3Rpb24gSSBoYXMgbXVsdGlwbGUgdXNlcyBpbiBJbnN0cworICBzdGF0aWMgYm9vbCBoYXNNdWx0aXBsZVVzZXNPZihJbnN0cnVjdGlvbiAqSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxQdHJTZXRJbXBsPEluc3RydWN0aW9uICo+ICZJbnN0cyk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbGwgdXNlcyBvZiB0aGUgaW5zdHJ1Y3Rpb24gSSBpcyB3aXRoaW4gdGhlIFNldC4KKyAgc3RhdGljIGJvb2wgYXJlQWxsVXNlc0luKEluc3RydWN0aW9uICpJLCBTbWFsbFB0clNldEltcGw8SW5zdHJ1Y3Rpb24gKj4gJlNldCk7CisKKyAgLy8vIFJldHVybnMgYSBzdHJ1Y3QgZGVzY3JpYmluZyBpZiB0aGUgaW5zdHJ1Y3Rpb24gaWYgdGhlIGluc3RydWN0aW9uIGlzIGEKKyAgLy8vIFNlbGVjdChJQ21wKFgsIFkpLCBYLCBZKSBpbnN0cnVjdGlvbiBwYXR0ZXJuIGNvcnJlc3BvbmRpbmcgdG8gYSBtaW4oWCwgWSkKKyAgLy8vIG9yIG1heChYLCBZKS4KKyAgc3RhdGljIEluc3REZXNjIGlzTWluTWF4U2VsZWN0Q21wUGF0dGVybihJbnN0cnVjdGlvbiAqSSwgSW5zdERlc2MgJlByZXYpOworCisgIC8vLyBSZXR1cm5zIGlkZW50aXR5IGNvcnJlc3BvbmRpbmcgdG8gdGhlIFJlY3VycmVuY2VLaW5kLgorICBzdGF0aWMgQ29uc3RhbnQgKmdldFJlY3VycmVuY2VJZGVudGl0eShSZWN1cnJlbmNlS2luZCBLLCBUeXBlICpUcCk7CisKKyAgLy8vIFJldHVybnMgdGhlIG9wY29kZSBvZiBiaW5hcnkgb3BlcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gdGhlCisgIC8vLyBSZWN1cnJlbmNlS2luZC4KKyAgc3RhdGljIHVuc2lnbmVkIGdldFJlY3VycmVuY2VCaW5PcChSZWN1cnJlbmNlS2luZCBLaW5kKTsKKworICAvLy8gUmV0dXJucyBhIE1pbi9NYXggb3BlcmF0aW9uIGNvcnJlc3BvbmRpbmcgdG8gTWluTWF4UmVjdXJyZW5jZUtpbmQuCisgIHN0YXRpYyBWYWx1ZSAqY3JlYXRlTWluTWF4T3AoSVJCdWlsZGVyPD4gJkJ1aWxkZXIsIE1pbk1heFJlY3VycmVuY2VLaW5kIFJLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlICpMZWZ0LCBWYWx1ZSAqUmlnaHQpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgUGhpIGlzIGEgcmVkdWN0aW9uIG9mIHR5cGUgS2luZCBhbmQgYWRkcyBpdCB0byB0aGUKKyAgLy8vIFJlY3VycmVuY2VEZXNjcmlwdG9yLiBJZiBlaXRoZXIgXHAgREIgaXMgbm9uLW51bGwgb3IgXHAgQUMgYW5kIFxwIERUIGFyZQorICAvLy8gbm9uLW51bGwsIHRoZSBtaW5pbWFsIGJpdCB3aWR0aCBuZWVkZWQgdG8gY29tcHV0ZSB0aGUgcmVkdWN0aW9uIHdpbGwgYmUKKyAgLy8vIGNvbXB1dGVkLgorICBzdGF0aWMgYm9vbCBBZGRSZWR1Y3Rpb25WYXIoUEhJTm9kZSAqUGhpLCBSZWN1cnJlbmNlS2luZCBLaW5kLCBMb29wICpUaGVMb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBIYXNGdW5Ob05hTkF0dHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZWN1cnJlbmNlRGVzY3JpcHRvciAmUmVkRGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVtYW5kZWRCaXRzICpEQiA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3N1bXB0aW9uQ2FjaGUgKkFDID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbWluYXRvclRyZWUgKkRUID0gbnVsbHB0cik7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBQaGkgaXMgYSByZWR1Y3Rpb24gaW4gVGhlTG9vcC4gVGhlIFJlY3VycmVuY2VEZXNjcmlwdG9yCisgIC8vLyBpcyByZXR1cm5lZCBpbiBSZWREZXMuIElmIGVpdGhlciBccCBEQiBpcyBub24tbnVsbCBvciBccCBBQyBhbmQgXHAgRFQgYXJlCisgIC8vLyBub24tbnVsbCwgdGhlIG1pbmltYWwgYml0IHdpZHRoIG5lZWRlZCB0byBjb21wdXRlIHRoZSByZWR1Y3Rpb24gd2lsbCBiZQorICAvLy8gY29tcHV0ZWQuCisgIHN0YXRpYyBib29sIGlzUmVkdWN0aW9uUEhJKFBISU5vZGUgKlBoaSwgTG9vcCAqVGhlTG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdXJyZW5jZURlc2NyaXB0b3IgJlJlZERlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVtYW5kZWRCaXRzICpEQiA9IG51bGxwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFzc3VtcHRpb25DYWNoZSAqQUMgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHIpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgUGhpIGlzIGEgZmlyc3Qtb3JkZXIgcmVjdXJyZW5jZS4gQSBmaXJzdC1vcmRlciByZWN1cnJlbmNlCisgIC8vLyBpcyBhIG5vbi1yZWR1Y3Rpb24gcmVjdXJyZW5jZSByZWxhdGlvbiBpbiB3aGljaCB0aGUgdmFsdWUgb2YgdGhlCisgIC8vLyByZWN1cnJlbmNlIGluIHRoZSBjdXJyZW50IGxvb3AgaXRlcmF0aW9uIGVxdWFscyBhIHZhbHVlIGRlZmluZWQgaW4gdGhlCisgIC8vLyBwcmV2aW91cyBpdGVyYXRpb24uIFxwIFNpbmtBZnRlciBpbmNsdWRlcyBwYWlycyBvZiBpbnN0cnVjdGlvbnMgd2hlcmUgdGhlCisgIC8vLyBmaXJzdCB3aWxsIGJlIHJlc2NoZWR1bGVkIHRvIGFwcGVhciBhZnRlciB0aGUgc2Vjb25kIGlmL3doZW4gdGhlIGxvb3AgaXMKKyAgLy8vIHZlY3Rvcml6ZWQuIEl0IG1heSBiZSBhdWdtZW50ZWQgd2l0aCBhZGRpdGlvbmFsIHBhaXJzIGlmIG5lZWRlZCBpbiBvcmRlcgorICAvLy8gdG8gaGFuZGxlIFBoaSBhcyBhIGZpcnN0LW9yZGVyIHJlY3VycmVuY2UuCisgIHN0YXRpYyBib29sCisgIGlzRmlyc3RPcmRlclJlY3VycmVuY2UoUEhJTm9kZSAqUGhpLCBMb29wICpUaGVMb29wLAorICAgICAgICAgICAgICAgICAgICAgICAgIERlbnNlTWFwPEluc3RydWN0aW9uICosIEluc3RydWN0aW9uICo+ICZTaW5rQWZ0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgRG9taW5hdG9yVHJlZSAqRFQpOworCisgIFJlY3VycmVuY2VLaW5kIGdldFJlY3VycmVuY2VLaW5kKCkgeyByZXR1cm4gS2luZDsgfQorCisgIE1pbk1heFJlY3VycmVuY2VLaW5kIGdldE1pbk1heFJlY3VycmVuY2VLaW5kKCkgeyByZXR1cm4gTWluTWF4S2luZDsgfQorCisgIFRyYWNraW5nVkg8VmFsdWU+IGdldFJlY3VycmVuY2VTdGFydFZhbHVlKCkgeyByZXR1cm4gU3RhcnRWYWx1ZTsgfQorCisgIEluc3RydWN0aW9uICpnZXRMb29wRXhpdEluc3RyKCkgeyByZXR1cm4gTG9vcEV4aXRJbnN0cjsgfQorCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHJlY3VycmVuY2UgaGFzIHVuc2FmZSBhbGdlYnJhIHdoaWNoIHJlcXVpcmVzIGEgcmVsYXhlZAorICAvLy8gZmxvYXRpbmctcG9pbnQgbW9kZWwuCisgIGJvb2wgaGFzVW5zYWZlQWxnZWJyYSgpIHsgcmV0dXJuIFVuc2FmZUFsZ2VicmFJbnN0ICE9IG51bGxwdHI7IH0KKworICAvLy8gUmV0dXJucyBmaXJzdCB1bnNhZmUgYWxnZWJyYSBpbnN0cnVjdGlvbiBpbiB0aGUgUEhJIG5vZGUncyB1c2UtY2hhaW4uCisgIEluc3RydWN0aW9uICpnZXRVbnNhZmVBbGdlYnJhSW5zdCgpIHsgcmV0dXJuIFVuc2FmZUFsZ2VicmFJbnN0OyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVjdXJyZW5jZSBraW5kIGlzIGFuIGludGVnZXIga2luZC4KKyAgc3RhdGljIGJvb2wgaXNJbnRlZ2VyUmVjdXJyZW5jZUtpbmQoUmVjdXJyZW5jZUtpbmQgS2luZCk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVjdXJyZW5jZSBraW5kIGlzIGEgZmxvYXRpbmcgcG9pbnQga2luZC4KKyAgc3RhdGljIGJvb2wgaXNGbG9hdGluZ1BvaW50UmVjdXJyZW5jZUtpbmQoUmVjdXJyZW5jZUtpbmQgS2luZCk7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgcmVjdXJyZW5jZSBraW5kIGlzIGFuIGFyaXRobWV0aWMga2luZC4KKyAgc3RhdGljIGJvb2wgaXNBcml0aG1ldGljUmVjdXJyZW5jZUtpbmQoUmVjdXJyZW5jZUtpbmQgS2luZCk7CisKKyAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIHJlY3VycmVuY2UuIFRoaXMgdHlwZSBjYW4gYmUgbmFycm93ZXIgdGhhbiB0aGUKKyAgLy8vIGFjdHVhbCB0eXBlIG9mIHRoZSBQaGkgaWYgdGhlIHJlY3VycmVuY2UgaGFzIGJlZW4gdHlwZS1wcm9tb3RlZC4KKyAgVHlwZSAqZ2V0UmVjdXJyZW5jZVR5cGUoKSB7IHJldHVybiBSZWN1cnJlbmNlVHlwZTsgfQorCisgIC8vLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBpbnN0cnVjdGlvbnMgdXNlZCBmb3IgdHlwZS1wcm9tb3RpbmcgdGhlCisgIC8vLyByZWN1cnJlbmNlLgorICBTbWFsbFB0clNldDxJbnN0cnVjdGlvbiAqLCA4PiAmZ2V0Q2FzdEluc3RzKCkgeyByZXR1cm4gQ2FzdEluc3RzOyB9CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBhbGwgc291cmNlIG9wZXJhbmRzIG9mIHRoZSByZWN1cnJlbmNlIGFyZSBTRXh0SW5zdHMuCisgIGJvb2wgaXNTaWduZWQoKSB7IHJldHVybiBJc1NpZ25lZDsgfQorCitwcml2YXRlOgorICAvLyBUaGUgc3RhcnRpbmcgdmFsdWUgb2YgdGhlIHJlY3VycmVuY2UuCisgIC8vIEl0IGRvZXMgbm90IGhhdmUgdG8gYmUgemVybyEKKyAgVHJhY2tpbmdWSDxWYWx1ZT4gU3RhcnRWYWx1ZTsKKyAgLy8gVGhlIGluc3RydWN0aW9uIHdobydzIHZhbHVlIGlzIHVzZWQgb3V0c2lkZSB0aGUgbG9vcC4KKyAgSW5zdHJ1Y3Rpb24gKkxvb3BFeGl0SW5zdHIgPSBudWxscHRyOworICAvLyBUaGUga2luZCBvZiB0aGUgcmVjdXJyZW5jZS4KKyAgUmVjdXJyZW5jZUtpbmQgS2luZCA9IFJLX05vUmVjdXJyZW5jZTsKKyAgLy8gSWYgdGhpcyBhIG1pbi9tYXggcmVjdXJyZW5jZSB0aGUga2luZCBvZiByZWN1cnJlbmNlLgorICBNaW5NYXhSZWN1cnJlbmNlS2luZCBNaW5NYXhLaW5kID0gTVJLX0ludmFsaWQ7CisgIC8vIEZpcnN0IG9jY3VycmVuY2Ugb2YgdW5hc2ZlIGFsZ2VicmEgaW4gdGhlIFBISSdzIHVzZS1jaGFpbi4KKyAgSW5zdHJ1Y3Rpb24gKlVuc2FmZUFsZ2VicmFJbnN0ID0gbnVsbHB0cjsKKyAgLy8gVGhlIHR5cGUgb2YgdGhlIHJlY3VycmVuY2UuCisgIFR5cGUgKlJlY3VycmVuY2VUeXBlID0gbnVsbHB0cjsKKyAgLy8gVHJ1ZSBpZiBhbGwgc291cmNlIG9wZXJhbmRzIG9mIHRoZSByZWN1cnJlbmNlIGFyZSBTRXh0SW5zdHMuCisgIGJvb2wgSXNTaWduZWQgPSBmYWxzZTsKKyAgLy8gSW5zdHJ1Y3Rpb25zIHVzZWQgZm9yIHR5cGUtcHJvbW90aW5nIHRoZSByZWN1cnJlbmNlLgorICBTbWFsbFB0clNldDxJbnN0cnVjdGlvbiAqLCA4PiBDYXN0SW5zdHM7Cit9OworCisvLy8gQSBzdHJ1Y3QgZm9yIHNhdmluZyBpbmZvcm1hdGlvbiBhYm91dCBpbmR1Y3Rpb24gdmFyaWFibGVzLgorY2xhc3MgSW5kdWN0aW9uRGVzY3JpcHRvciB7CitwdWJsaWM6CisgIC8vLyBUaGlzIGVudW0gcmVwcmVzZW50cyB0aGUga2luZHMgb2YgaW5kdWN0aW9ucyB0aGF0IHdlIHN1cHBvcnQuCisgIGVudW0gSW5kdWN0aW9uS2luZCB7CisgICAgSUtfTm9JbmR1Y3Rpb24sICAvLy88IE5vdCBhbiBpbmR1Y3Rpb24gdmFyaWFibGUuCisgICAgSUtfSW50SW5kdWN0aW9uLCAvLy88IEludGVnZXIgaW5kdWN0aW9uIHZhcmlhYmxlLiBTdGVwID0gQy4KKyAgICBJS19QdHJJbmR1Y3Rpb24sIC8vLzwgUG9pbnRlciBpbmR1Y3Rpb24gdmFyLiBTdGVwID0gQyAvIHNpemVvZihlbGVtKS4KKyAgICBJS19GcEluZHVjdGlvbiAgIC8vLzwgRmxvYXRpbmcgcG9pbnQgaW5kdWN0aW9uIHZhcmlhYmxlLgorICB9OworCitwdWJsaWM6CisgIC8vLyBEZWZhdWx0IGNvbnN0cnVjdG9yIC0gY3JlYXRlcyBhbiBpbnZhbGlkIGluZHVjdGlvbi4KKyAgSW5kdWN0aW9uRGVzY3JpcHRvcigpID0gZGVmYXVsdDsKKworICAvLy8gR2V0IHRoZSBjb25zZWN1dGl2ZSBkaXJlY3Rpb24uIFJldHVybnM6CisgIC8vLyAgIDAgLSB1bmtub3duIG9yIG5vbi1jb25zZWN1dGl2ZS4KKyAgLy8vICAgMSAtIGNvbnNlY3V0aXZlIGFuZCBpbmNyZWFzaW5nLgorICAvLy8gIC0xIC0gY29uc2VjdXRpdmUgYW5kIGRlY3JlYXNpbmcuCisgIGludCBnZXRDb25zZWN1dGl2ZURpcmVjdGlvbigpIGNvbnN0OworCisgIC8vLyBDb21wdXRlIHRoZSB0cmFuc2Zvcm1lZCB2YWx1ZSBvZiBJbmRleCBhdCBvZmZzZXQgU3RhcnRWYWx1ZSB1c2luZyBzdGVwCisgIC8vLyBTdGVwVmFsdWUuCisgIC8vLyBGb3IgaW50ZWdlciBpbmR1Y3Rpb24sIHJldHVybnMgU3RhcnRWYWx1ZSArIEluZGV4ICogU3RlcFZhbHVlLgorICAvLy8gRm9yIHBvaW50ZXIgaW5kdWN0aW9uLCByZXR1cm5zIFN0YXJ0VmFsdWVbSW5kZXggKiBTdGVwVmFsdWVdLgorICAvLy8gRklYTUU6IFRoZSBuZXdseSBjcmVhdGVkIGJpbmFyeSBpbnN0cnVjdGlvbnMgc2hvdWxkIGNvbnRhaW4gbnN3L251dworICAvLy8gZmxhZ3MsIHdoaWNoIGNhbiBiZSBmb3VuZCBmcm9tIHRoZSBvcmlnaW5hbCBzY2FsYXIgb3BlcmF0aW9ucy4KKyAgVmFsdWUgKnRyYW5zZm9ybShJUkJ1aWxkZXI8PiAmQiwgVmFsdWUgKkluZGV4LCBTY2FsYXJFdm9sdXRpb24gKlNFLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IERhdGFMYXlvdXQmIERMKSBjb25zdDsKKworICBWYWx1ZSAqZ2V0U3RhcnRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIFN0YXJ0VmFsdWU7IH0KKyAgSW5kdWN0aW9uS2luZCBnZXRLaW5kKCkgY29uc3QgeyByZXR1cm4gSUs7IH0KKyAgY29uc3QgU0NFViAqZ2V0U3RlcCgpIGNvbnN0IHsgcmV0dXJuIFN0ZXA7IH0KKyAgQ29uc3RhbnRJbnQgKmdldENvbnN0SW50U3RlcFZhbHVlKCkgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBccCBQaGkgaXMgYW4gaW5kdWN0aW9uIGluIHRoZSBsb29wIFxwIEwuIElmIFxwIFBoaSBpcyBhbgorICAvLy8gaW5kdWN0aW9uLCB0aGUgaW5kdWN0aW9uIGRlc2NyaXB0b3IgXHAgRCB3aWxsIGNvbnRhaW4gdGhlIGRhdGEgZGVzY3JpYmluZworICAvLy8gdGhpcyBpbmR1Y3Rpb24uIElmIGJ5IHNvbWUgb3RoZXIgbWVhbnMgdGhlIGNhbGxlciBoYXMgYSBiZXR0ZXIgU0NFVgorICAvLy8gZXhwcmVzc2lvbiBmb3IgXHAgUGhpIHRoYW4gdGhlIG9uZSByZXR1cm5lZCBieSB0aGUgU2NhbGFyRXZvbHV0aW9uCisgIC8vLyBhbmFseXNpcywgaXQgY2FuIGJlIHBhc3NlZCB0aHJvdWdoIFxwIEV4cHIuIElmIHRoZSBkZWYtdXNlIGNoYWluIAorICAvLy8gYXNzb2NpYXRlZCB3aXRoIHRoZSBwaGkgaW5jbHVkZXMgY2FzdHMgKHRoYXQgd2Uga25vdyB3ZSBjYW4gaWdub3JlCisgIC8vLyB1bmRlciBwcm9wZXIgcnVudGltZSBjaGVja3MpLCB0aGV5IGFyZSBwYXNzZWQgdGhyb3VnaCBccCBDYXN0c1RvSWdub3JlLgorICBzdGF0aWMgYm9vbCAKKyAgaXNJbmR1Y3Rpb25QSEkoUEhJTm9kZSAqUGhpLCBjb25zdCBMb29wKiBMLCBTY2FsYXJFdm9sdXRpb24gKlNFLAorICAgICAgICAgICAgICAgICBJbmR1Y3Rpb25EZXNjcmlwdG9yICZELCBjb25zdCBTQ0VWICpFeHByID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEluc3RydWN0aW9uICo+ICpDYXN0c1RvSWdub3JlID0gbnVsbHB0cik7CisKKyAgLy8vIFJldHVybnMgdHJ1ZSBpZiBccCBQaGkgaXMgYSBmbG9hdGluZyBwb2ludCBpbmR1Y3Rpb24gaW4gdGhlIGxvb3AgXHAgTC4KKyAgLy8vIElmIFxwIFBoaSBpcyBhbiBpbmR1Y3Rpb24sIHRoZSBpbmR1Y3Rpb24gZGVzY3JpcHRvciBccCBEIHdpbGwgY29udGFpbiAKKyAgLy8vIHRoZSBkYXRhIGRlc2NyaWJpbmcgdGhpcyBpbmR1Y3Rpb24uCisgIHN0YXRpYyBib29sIGlzRlBJbmR1Y3Rpb25QSEkoUEhJTm9kZSAqUGhpLCBjb25zdCBMb29wKiBMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhckV2b2x1dGlvbiAqU0UsIEluZHVjdGlvbkRlc2NyaXB0b3IgJkQpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgXHAgUGhpIGlzIGEgbG9vcCBccCBMIGluZHVjdGlvbiwgaW4gdGhlIGNvbnRleHQgYXNzb2NpYXRlZAorICAvLy8gd2l0aCB0aGUgcnVuLXRpbWUgcHJlZGljYXRlIG9mIFBTRS4gSWYgXHAgQXNzdW1lIGlzIHRydWUsIHRoaXMgY2FuIGFkZAorICAvLy8gZnVydGhlciBTQ0VWIHByZWRpY2F0ZXMgdG8gXHAgUFNFIGluIG9yZGVyIHRvIHByb3ZlIHRoYXQgXHAgUGhpIGlzIGFuCisgIC8vLyBpbmR1Y3Rpb24uCisgIC8vLyBJZiBccCBQaGkgaXMgYW4gaW5kdWN0aW9uLCBccCBEIHdpbGwgY29udGFpbiB0aGUgZGF0YSBkZXNjcmliaW5nIHRoaXMKKyAgLy8vIGluZHVjdGlvbi4KKyAgc3RhdGljIGJvb2wgaXNJbmR1Y3Rpb25QSEkoUEhJTm9kZSAqUGhpLCBjb25zdCBMb29wKiBMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkaWNhdGVkU2NhbGFyRXZvbHV0aW9uICZQU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluZHVjdGlvbkRlc2NyaXB0b3IgJkQsIGJvb2wgQXNzdW1lID0gZmFsc2UpOworCisgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIGluZHVjdGlvbiB0eXBlIGlzIEZQIGFuZCB0aGUgYmluYXJ5IG9wZXJhdG9yIGRvZXMKKyAgLy8vIG5vdCBoYXZlIHRoZSAiZmFzdC1tYXRoIiBwcm9wZXJ0eS4gU3VjaCBvcGVyYXRpb24gcmVxdWlyZXMgYSByZWxheGVkIEZQCisgIC8vLyBtb2RlLgorICBib29sIGhhc1Vuc2FmZUFsZ2VicmEoKSB7CisgICAgcmV0dXJuIEluZHVjdGlvbkJpbk9wICYmICFjYXN0PEZQTWF0aE9wZXJhdG9yPihJbmR1Y3Rpb25CaW5PcCktPmlzRmFzdCgpOworICB9CisKKyAgLy8vIFJldHVybnMgaW5kdWN0aW9uIG9wZXJhdG9yIHRoYXQgZG9lcyBub3QgaGF2ZSAiZmFzdC1tYXRoIiBwcm9wZXJ0eQorICAvLy8gYW5kIHJlcXVpcmVzIEZQIHVuc2FmZSBtb2RlLgorICBJbnN0cnVjdGlvbiAqZ2V0VW5zYWZlQWxnZWJyYUluc3QoKSB7CisgICAgaWYgKCFJbmR1Y3Rpb25CaW5PcCB8fCBjYXN0PEZQTWF0aE9wZXJhdG9yPihJbmR1Y3Rpb25CaW5PcCktPmlzRmFzdCgpKQorICAgICAgcmV0dXJuIG51bGxwdHI7CisgICAgcmV0dXJuIEluZHVjdGlvbkJpbk9wOworICB9CisKKyAgLy8vIFJldHVybnMgYmluYXJ5IG9wY29kZSBvZiB0aGUgaW5kdWN0aW9uIG9wZXJhdG9yLgorICBJbnN0cnVjdGlvbjo6QmluYXJ5T3BzIGdldEluZHVjdGlvbk9wY29kZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gSW5kdWN0aW9uQmluT3AgPyBJbmR1Y3Rpb25CaW5PcC0+Z2V0T3Bjb2RlKCkgOgorICAgICAgSW5zdHJ1Y3Rpb246OkJpbmFyeU9wc0VuZDsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSB0eXBlIGNhc3QgaW5zdHJ1Y3Rpb25zIGluIHRoZSBpbmR1Y3Rpb24gCisgIC8vLyB1cGRhdGUgY2hhaW4sIHRoYXQgYXJlIHJlZHVuZGFudCB3aGVuIGd1YXJkZWQgd2l0aCBhIHJ1bnRpbWUKKyAgLy8vIFNDRVYgb3ZlcmZsb3cgY2hlY2suCisgIGNvbnN0IFNtYWxsVmVjdG9ySW1wbDxJbnN0cnVjdGlvbiAqPiAmZ2V0Q2FzdEluc3RzKCkgY29uc3QgeyAKKyAgICByZXR1cm4gUmVkdW5kYW50Q2FzdHM7IAorICB9CisKK3ByaXZhdGU6CisgIC8vLyBQcml2YXRlIGNvbnN0cnVjdG9yIC0gdXNlZCBieSBcYyBpc0luZHVjdGlvblBISS4KKyAgSW5kdWN0aW9uRGVzY3JpcHRvcihWYWx1ZSAqU3RhcnQsIEluZHVjdGlvbktpbmQgSywgY29uc3QgU0NFViAqU3RlcCwKKyAgICAgICAgICAgICAgICAgICAgICBCaW5hcnlPcGVyYXRvciAqSW5kdWN0aW9uQmluT3AgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxJbnN0cnVjdGlvbiAqPiAqQ2FzdHMgPSBudWxscHRyKTsKKworICAvLy8gU3RhcnQgdmFsdWUuCisgIFRyYWNraW5nVkg8VmFsdWU+IFN0YXJ0VmFsdWU7CisgIC8vLyBJbmR1Y3Rpb24ga2luZC4KKyAgSW5kdWN0aW9uS2luZCBJSyA9IElLX05vSW5kdWN0aW9uOworICAvLy8gU3RlcCB2YWx1ZS4KKyAgY29uc3QgU0NFViAqU3RlcCA9IG51bGxwdHI7CisgIC8vIEluc3RydWN0aW9uIHRoYXQgYWR2YW5jZXMgaW5kdWN0aW9uIHZhcmlhYmxlLgorICBCaW5hcnlPcGVyYXRvciAqSW5kdWN0aW9uQmluT3AgPSBudWxscHRyOworICAvLyBJbnN0cnVjdGlvbnMgdXNlZCBmb3IgdHlwZS1jYXN0cyBvZiB0aGUgaW5kdWN0aW9uIHZhcmlhYmxlLAorICAvLyB0aGF0IGFyZSByZWR1bmRhbnQgd2hlbiBndWFyZGVkIHdpdGggYSBydW50aW1lIFNDRVYgb3ZlcmZsb3cgY2hlY2suCisgIFNtYWxsVmVjdG9yPEluc3RydWN0aW9uICosIDI+IFJlZHVuZGFudENhc3RzOworfTsKKworQmFzaWNCbG9jayAqSW5zZXJ0UHJlaGVhZGVyRm9yTG9vcChMb29wICpMLCBEb21pbmF0b3JUcmVlICpEVCwgTG9vcEluZm8gKkxJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFByZXNlcnZlTENTU0EpOworCisvLy8gRW5zdXJlIHRoYXQgYWxsIGV4aXQgYmxvY2tzIG9mIHRoZSBsb29wIGFyZSBkZWRpY2F0ZWQgZXhpdHMuCisvLy8KKy8vLyBGb3IgYW55IGxvb3AgZXhpdCBibG9jayB3aXRoIG5vbi1sb29wIHByZWRlY2Vzc29ycywgd2Ugc3BsaXQgdGhlIGxvb3AKKy8vLyBwcmVkZWNlc3NvcnMgdG8gdXNlIGEgZGVkaWNhdGVkIGxvb3AgZXhpdCBibG9jay4gV2UgdXBkYXRlIHRoZSBkb21pbmF0b3IKKy8vLyB0cmVlIGFuZCBsb29wIGluZm8gaWYgcHJvdmlkZWQsIGFuZCB3aWxsIHByZXNlcnZlIExDU1NBIGlmIHJlcXVlc3RlZC4KK2Jvb2wgZm9ybURlZGljYXRlZEV4aXRCbG9ja3MoTG9vcCAqTCwgRG9taW5hdG9yVHJlZSAqRFQsIExvb3BJbmZvICpMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQcmVzZXJ2ZUxDU1NBKTsKKworLy8vIEVuc3VyZXMgTENTU0EgZm9ybSBmb3IgZXZlcnkgaW5zdHJ1Y3Rpb24gZnJvbSB0aGUgV29ya2xpc3QgaW4gdGhlIHNjb3BlIG9mCisvLy8gaW5uZXJtb3N0IGNvbnRhaW5pbmcgbG9vcC4KKy8vLworLy8vIEZvciB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gd2hpY2ggaGF2ZSB1c2VzIG91dHNpZGUgb2YgdGhlIGxvb3AsIGFuIExDU1NBIFBISQorLy8vIG5vZGUgaXMgaW5zZXJ0ZWQgYW5kIHRoZSB1c2VzIG91dHNpZGUgdGhlIGxvb3AgYXJlIHJld3JpdHRlbiB0byB1c2UgdGhpcworLy8vIG5vZGUuCisvLy8KKy8vLyBMb29wSW5mbyBhbmQgRG9taW5hdG9yVHJlZSBhcmUgcmVxdWlyZWQgYW5kLCBzaW5jZSB0aGUgcm91dGluZSBtYWtlcyBubworLy8vIGNoYW5nZXMgdG8gQ0ZHLCBwcmVzZXJ2ZWQuCisvLy8KKy8vLyBSZXR1cm5zIHRydWUgaWYgYW55IG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUuCitib29sIGZvcm1MQ1NTQUZvckluc3RydWN0aW9ucyhTbWFsbFZlY3RvckltcGw8SW5zdHJ1Y3Rpb24gKj4gJldvcmtsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRG9taW5hdG9yVHJlZSAmRFQsIExvb3BJbmZvICZMSSk7CisKKy8vLyBcYnJpZWYgUHV0IGxvb3AgaW50byBMQ1NTQSBmb3JtLgorLy8vCisvLy8gTG9va3MgYXQgYWxsIGluc3RydWN0aW9ucyBpbiB0aGUgbG9vcCB3aGljaCBoYXZlIHVzZXMgb3V0c2lkZSBvZiB0aGUKKy8vLyBjdXJyZW50IGxvb3AuIEZvciBlYWNoLCBhbiBMQ1NTQSBQSEkgbm9kZSBpcyBpbnNlcnRlZCBhbmQgdGhlIHVzZXMgb3V0c2lkZQorLy8vIHRoZSBsb29wIGFyZSByZXdyaXR0ZW4gdG8gdXNlIHRoaXMgbm9kZS4KKy8vLworLy8vIExvb3BJbmZvIGFuZCBEb21pbmF0b3JUcmVlIGFyZSByZXF1aXJlZCBhbmQgcHJlc2VydmVkLgorLy8vCisvLy8gSWYgU2NhbGFyRXZvbHV0aW9uIGlzIHBhc3NlZCBpbiwgaXQgd2lsbCBiZSBwcmVzZXJ2ZWQuCisvLy8KKy8vLyBSZXR1cm5zIHRydWUgaWYgYW55IG1vZGlmaWNhdGlvbnMgYXJlIG1hZGUgdG8gdGhlIGxvb3AuCitib29sIGZvcm1MQ1NTQShMb29wICZMLCBEb21pbmF0b3JUcmVlICZEVCwgTG9vcEluZm8gKkxJLCBTY2FsYXJFdm9sdXRpb24gKlNFKTsKKworLy8vIFxicmllZiBQdXQgYSBsb29wIG5lc3QgaW50byBMQ1NTQSBmb3JtLgorLy8vCisvLy8gVGhpcyByZWN1cnNpdmVseSBmb3JtcyBMQ1NTQSBmb3IgYSBsb29wIG5lc3QuCisvLy8KKy8vLyBMb29wSW5mbyBhbmQgRG9taW5hdG9yVHJlZSBhcmUgcmVxdWlyZWQgYW5kIHByZXNlcnZlZC4KKy8vLworLy8vIElmIFNjYWxhckV2b2x1dGlvbiBpcyBwYXNzZWQgaW4sIGl0IHdpbGwgYmUgcHJlc2VydmVkLgorLy8vCisvLy8gUmV0dXJucyB0cnVlIGlmIGFueSBtb2RpZmljYXRpb25zIGFyZSBtYWRlIHRvIHRoZSBsb29wLgorYm9vbCBmb3JtTENTU0FSZWN1cnNpdmVseShMb29wICZMLCBEb21pbmF0b3JUcmVlICZEVCwgTG9vcEluZm8gKkxJLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gKlNFKTsKKworLy8vIFxicmllZiBXYWxrIHRoZSBzcGVjaWZpZWQgcmVnaW9uIG9mIHRoZSBDRkcgKGRlZmluZWQgYnkgYWxsIGJsb2NrcworLy8vIGRvbWluYXRlZCBieSB0aGUgc3BlY2lmaWVkIGJsb2NrLCBhbmQgdGhhdCBhcmUgaW4gdGhlIGN1cnJlbnQgbG9vcCkgaW4KKy8vLyByZXZlcnNlIGRlcHRoIGZpcnN0IG9yZGVyIHcuci50IHRoZSBEb21pbmF0b3JUcmVlLiBUaGlzIGFsbG93cyB1cyB0byB2aXNpdAorLy8vIHVzZXMgYmVmb3JlIGRlZmluaXRpb25zLCBhbGxvd2luZyB1cyB0byBzaW5rIGEgbG9vcCBib2R5IGluIG9uZSBwYXNzIHdpdGhvdXQKKy8vLyBpdGVyYXRpb24uIFRha2VzIERvbVRyZWVOb2RlLCBBbGlhc0FuYWx5c2lzLCBMb29wSW5mbywgRG9taW5hdG9yVHJlZSwKKy8vLyBEYXRhTGF5b3V0LCBUYXJnZXRMaWJyYXJ5SW5mbywgTG9vcCwgQWxpYXNTZXQgaW5mb3JtYXRpb24gZm9yIGFsbAorLy8vIGluc3RydWN0aW9ucyBvZiB0aGUgbG9vcCBhbmQgbG9vcCBzYWZldHkgaW5mb3JtYXRpb24gYXMKKy8vLyBhcmd1bWVudHMuIERpYWdub3N0aWNzIGlzIGVtaXR0ZWQgdmlhIFxwIE9SRS4gSXQgcmV0dXJucyBjaGFuZ2VkIHN0YXR1cy4KK2Jvb2wgc2lua1JlZ2lvbihEb21UcmVlTm9kZSAqLCBBbGlhc0FuYWx5c2lzICosIExvb3BJbmZvICosIERvbWluYXRvclRyZWUgKiwKKyAgICAgICAgICAgICAgICBUYXJnZXRMaWJyYXJ5SW5mbyAqLCBUYXJnZXRUcmFuc2Zvcm1JbmZvICosIExvb3AgKiwKKyAgICAgICAgICAgICAgICBBbGlhc1NldFRyYWNrZXIgKiwgTG9vcFNhZmV0eUluZm8gKiwKKyAgICAgICAgICAgICAgICBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyICpPUkUpOworCisvLy8gXGJyaWVmIFdhbGsgdGhlIHNwZWNpZmllZCByZWdpb24gb2YgdGhlIENGRyAoZGVmaW5lZCBieSBhbGwgYmxvY2tzCisvLy8gZG9taW5hdGVkIGJ5IHRoZSBzcGVjaWZpZWQgYmxvY2ssIGFuZCB0aGF0IGFyZSBpbiB0aGUgY3VycmVudCBsb29wKSBpbiBkZXB0aAorLy8vIGZpcnN0IG9yZGVyIHcuci50IHRoZSBEb21pbmF0b3JUcmVlLiAgVGhpcyBhbGxvd3MgdXMgdG8gdmlzaXQgZGVmaW5pdGlvbnMKKy8vLyBiZWZvcmUgdXNlcywgYWxsb3dpbmcgdXMgdG8gaG9pc3QgYSBsb29wIGJvZHkgaW4gb25lIHBhc3Mgd2l0aG91dCBpdGVyYXRpb24uCisvLy8gVGFrZXMgRG9tVHJlZU5vZGUsIEFsaWFzQW5hbHlzaXMsIExvb3BJbmZvLCBEb21pbmF0b3JUcmVlLCBEYXRhTGF5b3V0LAorLy8vIFRhcmdldExpYnJhcnlJbmZvLCBMb29wLCBBbGlhc1NldCBpbmZvcm1hdGlvbiBmb3IgYWxsIGluc3RydWN0aW9ucyBvZiB0aGUKKy8vLyBsb29wIGFuZCBsb29wIHNhZmV0eSBpbmZvcm1hdGlvbiBhcyBhcmd1bWVudHMuIERpYWdub3N0aWNzIGlzIGVtaXR0ZWQgdmlhIFxwCisvLy8gT1JFLiBJdCByZXR1cm5zIGNoYW5nZWQgc3RhdHVzLgorYm9vbCBob2lzdFJlZ2lvbihEb21UcmVlTm9kZSAqLCBBbGlhc0FuYWx5c2lzICosIExvb3BJbmZvICosIERvbWluYXRvclRyZWUgKiwKKyAgICAgICAgICAgICAgICAgVGFyZ2V0TGlicmFyeUluZm8gKiwgTG9vcCAqLCBBbGlhc1NldFRyYWNrZXIgKiwKKyAgICAgICAgICAgICAgICAgTG9vcFNhZmV0eUluZm8gKiwgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciAqT1JFKTsKKworLy8vIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyBkZWFkIGxvb3BzLiBUaGUgY2FsbGVyIG9mIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8KKy8vLyBndWFyYW50ZWUgdGhhdCB0aGUgbG9vcCBpcyBpbmZhY3QgZGVhZC4KKy8vLyBUaGUgZnVuY3Rpb24gcmVxdWlyZXMgYSBidW5jaCBvciBwcmVyZXF1aXNpdGVzIHRvIGJlIHByZXNlbnQ6CisvLy8gICAtIFRoZSBsb29wIG5lZWRzIHRvIGJlIGluIExDU1NBIGZvcm0KKy8vLyAgIC0gVGhlIGxvb3AgbmVlZHMgdG8gaGF2ZSBhIFByZWhlYWRlcgorLy8vICAgLSBBIHVuaXF1ZSBkZWRpY2F0ZWQgZXhpdCBibG9jayBtdXN0IGV4aXN0CisvLy8KKy8vLyBUaGlzIGFsc28gdXBkYXRlcyB0aGUgcmVsZXZhbnQgYW5hbHlzaXMgaW5mb3JtYXRpb24gaW4gXHAgRFQsIFxwIFNFLCBhbmQgXHAKKy8vLyBMSSBpZiBwb2ludGVycyB0byB0aG9zZSBhcmUgcHJvdmlkZWQuCisvLy8gSXQgYWxzbyB1cGRhdGVzIHRoZSBsb29wIFBNIGlmIGFuIHVwZGF0ZXIgc3RydWN0IGlzIHByb3ZpZGVkLgorCit2b2lkIGRlbGV0ZURlYWRMb29wKExvb3AgKkwsIERvbWluYXRvclRyZWUgKkRULCBTY2FsYXJFdm9sdXRpb24gKlNFLAorICAgICAgICAgICAgICAgICAgICBMb29wSW5mbyAqTEkpOworCisvLy8gXGJyaWVmIFRyeSB0byBwcm9tb3RlIG1lbW9yeSB2YWx1ZXMgdG8gc2NhbGFycyBieSBzaW5raW5nIHN0b3JlcyBvdXQgb2YKKy8vLyB0aGUgbG9vcCBhbmQgbW92aW5nIGxvYWRzIHRvIGJlZm9yZSB0aGUgbG9vcC4gIFdlIGRvIHRoaXMgYnkgbG9vcGluZyBvdmVyCisvLy8gdGhlIHN0b3JlcyBpbiB0aGUgbG9vcCwgbG9va2luZyBmb3Igc3RvcmVzIHRvIE11c3QgcG9pbnRlcnMgd2hpY2ggYXJlCisvLy8gbG9vcCBpbnZhcmlhbnQuIEl0IHRha2VzIGEgc2V0IG9mIG11c3QtYWxpYXMgdmFsdWVzLCBMb29wIGV4aXQgYmxvY2tzCisvLy8gdmVjdG9yLCBsb29wIGV4aXQgYmxvY2tzIGluc2VydGlvbiBwb2ludCB2ZWN0b3IsIFByZWRJdGVyYXRvckNhY2hlLAorLy8vIExvb3BJbmZvLCBEb21pbmF0b3JUcmVlLCBMb29wLCBBbGlhc1NldCBpbmZvcm1hdGlvbiBmb3IgYWxsIGluc3RydWN0aW9ucworLy8vIG9mIHRoZSBsb29wIGFuZCBsb29wIHNhZmV0eSBpbmZvcm1hdGlvbiBhcyBhcmd1bWVudHMuCisvLy8gRGlhZ25vc3RpY3MgaXMgZW1pdHRlZCB2aWEgXHAgT1JFLiBJdCByZXR1cm5zIGNoYW5nZWQgc3RhdHVzLgorYm9vbCBwcm9tb3RlTG9vcEFjY2Vzc2VzVG9TY2FsYXJzKGNvbnN0IFNtYWxsU2V0VmVjdG9yPFZhbHVlICosIDg+ICYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPEJhc2ljQmxvY2sgKj4gJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8SW5zdHJ1Y3Rpb24gKj4gJiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcmVkSXRlcmF0b3JDYWNoZSAmLCBMb29wSW5mbyAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbWluYXRvclRyZWUgKiwgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wICosIEFsaWFzU2V0VHJhY2tlciAqLCBMb29wU2FmZXR5SW5mbyAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgKik7CisKKy8vLyBEb2VzIGEgQkZTIGZyb20gYSBnaXZlbiBub2RlIHRvIGFsbCBvZiBpdHMgY2hpbGRyZW4gaW5zaWRlIGEgZ2l2ZW4gbG9vcC4KKy8vLyBUaGUgcmV0dXJuZWQgdmVjdG9yIG9mIG5vZGVzIGluY2x1ZGVzIHRoZSBzdGFydGluZyBwb2ludC4KK1NtYWxsVmVjdG9yPERvbVRyZWVOb2RlICosIDE2PiBjb2xsZWN0Q2hpbGRyZW5Jbkxvb3AoRG9tVHJlZU5vZGUgKk4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvb3AgKkN1ckxvb3ApOworCisvLy8gXGJyaWVmIFJldHVybnMgdGhlIGluc3RydWN0aW9ucyB0aGF0IHVzZSB2YWx1ZXMgZGVmaW5lZCBpbiB0aGUgbG9vcC4KK1NtYWxsVmVjdG9yPEluc3RydWN0aW9uICosIDg+IGZpbmREZWZzVXNlZE91dHNpZGVPZkxvb3AoTG9vcCAqTCk7CisKKy8vLyBcYnJpZWYgRmluZCBzdHJpbmcgbWV0YWRhdGEgZm9yIGxvb3AKKy8vLworLy8vIElmIGl0IGhhcyBhIHZhbHVlIChlLmcuIHsibGx2bS5kaXN0cmlidXRlIiwgMX0gcmV0dXJuIHRoZSB2YWx1ZSBhcyBhbgorLy8vIG9wZXJhbmQgb3IgbnVsbCBvdGhlcndpc2UuICBJZiB0aGUgc3RyaW5nIG1ldGFkYXRhIGlzIG5vdCBmb3VuZCByZXR1cm4KKy8vLyBPcHRpb25hbCdzIG5vdC1hLXZhbHVlLgorT3B0aW9uYWw8Y29uc3QgTURPcGVyYW5kICo+IGZpbmRTdHJpbmdNZXRhZGF0YUZvckxvb3AoTG9vcCAqVGhlTG9vcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1JlZiBOYW1lKTsKKworLy8vIFxicmllZiBTZXQgaW5wdXQgc3RyaW5nIGludG8gbG9vcCBtZXRhZGF0YSBieSBrZWVwaW5nIG90aGVyIHZhbHVlcyBpbnRhY3QuCit2b2lkIGFkZFN0cmluZ01ldGFkYXRhVG9Mb29wKExvb3AgKlRoZUxvb3AsIGNvbnN0IGNoYXIgKk1EU3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWID0gMCk7CisKKy8vLyBcYnJpZWYgR2V0IGEgbG9vcCdzIGVzdGltYXRlZCB0cmlwIGNvdW50IGJhc2VkIG9uIGJyYW5jaCB3ZWlnaHQgbWV0YWRhdGEuCisvLy8gUmV0dXJucyAwIHdoZW4gdGhlIGNvdW50IGlzIGVzdGltYXRlZCB0byBiZSAwLCBvciBOb25lIHdoZW4gYSBtZWFuaW5nZnVsCisvLy8gZXN0aW1hdGUgY2FuIG5vdCBiZSBtYWRlLgorT3B0aW9uYWw8dW5zaWduZWQ+IGdldExvb3BFc3RpbWF0ZWRUcmlwQ291bnQoTG9vcCAqTCk7CisKKy8vLyBIZWxwZXIgdG8gY29uc2lzdGVudGx5IGFkZCB0aGUgc2V0IG9mIHN0YW5kYXJkIHBhc3NlcyB0byBhIGxvb3AgcGFzcydzIFxjCisvLy8gQW5hbHlzaXNVc2FnZS4KKy8vLworLy8vIEFsbCBsb29wIHBhc3NlcyBzaG91bGQgY2FsbCB0aGlzIGFzIHBhcnQgb2YgaW1wbGVtZW50aW5nIHRoZWlyIFxjCisvLy8gZ2V0QW5hbHlzaXNVc2FnZS4KK3ZvaWQgZ2V0TG9vcEFuYWx5c2lzVXNhZ2UoQW5hbHlzaXNVc2FnZSAmQVUpOworCisvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBob2lzdGVyIGFuZCBzaW5rZXIgY2FuIGhhbmRsZSB0aGlzIGluc3RydWN0aW9uLgorLy8vIElmIFNhZmV0eUluZm8gaXMgbnVsbCwgd2UgYXJlIGNoZWNraW5nIGZvciBzaW5raW5nIGluc3RydWN0aW9ucyBmcm9tCisvLy8gcHJlaGVhZGVyIHRvIGxvb3AgYm9keSAobm8gc3BlY3VsYXRpb24pLgorLy8vIElmIFNhZmV0eUluZm8gaXMgbm90IG51bGwsIHdlIGFyZSBjaGVja2luZyBmb3IgaG9pc3Rpbmcvc2lua2luZworLy8vIGluc3RydWN0aW9ucyBmcm9tIGxvb3AgYm9keSB0byBwcmVoZWFkZXIvZXhpdC4gQ2hlY2sgaWYgdGhlIGluc3RydWN0aW9uCisvLy8gY2FuIGV4ZWN1dGUgc3BlY3VsYXRpdmVseS4KKy8vLyBJZiBccCBPUkUgaXMgc2V0IHVzZSBpdCB0byBlbWl0IG9wdGltaXphdGlvbiByZW1hcmtzLgorYm9vbCBjYW5TaW5rT3JIb2lzdEluc3QoSW5zdHJ1Y3Rpb24gJkksIEFBUmVzdWx0cyAqQUEsIERvbWluYXRvclRyZWUgKkRULAorICAgICAgICAgICAgICAgICAgICAgICAgTG9vcCAqQ3VyTG9vcCwgQWxpYXNTZXRUcmFja2VyICpDdXJBU1QsCisgICAgICAgICAgICAgICAgICAgICAgICBMb29wU2FmZXR5SW5mbyAqU2FmZXR5SW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgKk9SRSA9IG51bGxwdHIpOworCisvLy8gR2VuZXJhdGVzIGEgdmVjdG9yIHJlZHVjdGlvbiB1c2luZyBzaHVmZmxldmVjdG9ycyB0byByZWR1Y2UgdGhlIHZhbHVlLgorVmFsdWUgKmdldFNodWZmbGVSZWR1Y3Rpb24oSVJCdWlsZGVyPD4gJkJ1aWxkZXIsIFZhbHVlICpTcmMsIHVuc2lnbmVkIE9wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdXJyZW5jZURlc2NyaXB0b3I6Ok1pbk1heFJlY3VycmVuY2VLaW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWluTWF4S2luZCA9IFJlY3VycmVuY2VEZXNjcmlwdG9yOjpNUktfSW52YWxpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5UmVmPFZhbHVlICo+IFJlZE9wcyA9IEFycmF5UmVmPFZhbHVlICo+KCkpOworCisvLy8gQ3JlYXRlIGEgdGFyZ2V0IHJlZHVjdGlvbiBvZiB0aGUgZ2l2ZW4gdmVjdG9yLiBUaGUgcmVkdWN0aW9uIG9wZXJhdGlvbgorLy8vIGlzIGRlc2NyaWJlZCBieSB0aGUgXHAgT3Bjb2RlIHBhcmFtZXRlci4gbWluL21heCByZWR1Y3Rpb25zIHJlcXVpcmUKKy8vLyBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHN1cHBsaWVkIGluIFxwIEZsYWdzLgorLy8vIFRoZSB0YXJnZXQgaXMgcXVlcmllZCB0byBkZXRlcm1pbmUgaWYgaW50cmluc2ljcyBvciBzaHVmZmxlIHNlcXVlbmNlcyBhcmUKKy8vLyByZXF1aXJlZCB0byBpbXBsZW1lbnQgdGhlIHJlZHVjdGlvbi4KK1ZhbHVlICoKK2NyZWF0ZVNpbXBsZVRhcmdldFJlZHVjdGlvbihJUkJ1aWxkZXI8PiAmQiwgY29uc3QgVGFyZ2V0VHJhbnNmb3JtSW5mbyAqVFRJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE9wY29kZSwgVmFsdWUgKlNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBUYXJnZXRUcmFuc2Zvcm1JbmZvOjpSZWR1Y3Rpb25GbGFncyBGbGFncyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhcmdldFRyYW5zZm9ybUluZm86OlJlZHVjdGlvbkZsYWdzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8VmFsdWUgKj4gUmVkT3BzID0gQXJyYXlSZWY8VmFsdWUgKj4oKSk7CisKKy8vLyBDcmVhdGUgYSBnZW5lcmljIHRhcmdldCByZWR1Y3Rpb24gdXNpbmcgYSByZWN1cnJlbmNlIGRlc2NyaXB0b3IgXHAgRGVzYworLy8vIFRoZSB0YXJnZXQgaXMgcXVlcmllZCB0byBkZXRlcm1pbmUgaWYgaW50cmluc2ljcyBvciBzaHVmZmxlIHNlcXVlbmNlcyBhcmUKKy8vLyByZXF1aXJlZCB0byBpbXBsZW1lbnQgdGhlIHJlZHVjdGlvbi4KK1ZhbHVlICpjcmVhdGVUYXJnZXRSZWR1Y3Rpb24oSVJCdWlsZGVyPD4gJkIsIGNvbnN0IFRhcmdldFRyYW5zZm9ybUluZm8gKlRUSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVjdXJyZW5jZURlc2NyaXB0b3IgJkRlc2MsIFZhbHVlICpTcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgTm9OYU4gPSBmYWxzZSk7CisKKy8vLyBHZXQgdGhlIGludGVyc2VjdGlvbiAobG9naWNhbCBhbmQpIG9mIGFsbCBvZiB0aGUgcG90ZW50aWFsIElSIGZsYWdzCisvLy8gb2YgZWFjaCBzY2FsYXIgb3BlcmF0aW9uIChWTCkgdGhhdCB3aWxsIGJlIGNvbnZlcnRlZCBpbnRvIGEgdmVjdG9yIChJKS4KKy8vLyBJZiBPcFZhbHVlIGlzIG5vbi1udWxsLCB3ZSBvbmx5IGNvbnNpZGVyIG9wZXJhdGlvbnMgc2ltaWxhciB0byBPcFZhbHVlCisvLy8gd2hlbiBpbnRlcnNlY3RpbmcuCisvLy8gRmxhZyBzZXQ6IE5TVywgTlVXLCBleGFjdCwgYW5kIGFsbCBvZiBmYXN0LW1hdGguCit2b2lkIHByb3BhZ2F0ZUlSRmxhZ3MoVmFsdWUgKkksIEFycmF5UmVmPFZhbHVlICo+IFZMLCBWYWx1ZSAqT3BWYWx1ZSA9IG51bGxwdHIpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX0xPT1BVVElMU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTG9vcFZlcnNpb25pbmcuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb29wVmVyc2lvbmluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhNWQ3ODQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTG9vcFZlcnNpb25pbmcuaApAQCAtMCwwICsxLDE1MiBAQAorLy89PT0tIExvb3BWZXJzaW9uaW5nLmggLSBVdGlsaXR5IHRvIHZlcnNpb24gYSBsb29wIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyBhIHV0aWxpdHkgY2xhc3MgdG8gcGVyZm9ybSBsb29wIHZlcnNpb25pbmcuICBUaGUgdmVyc2lvbmVkCisvLyBsb29wIHNwZWN1bGF0ZXMgdGhhdCBvdGhlcndpc2UgbWF5LWFsaWFzaW5nIG1lbW9yeSBhY2Nlc3NlcyBkb24ndCBvdmVybGFwIGFuZAorLy8gZW1pdHMgY2hlY2tzIHRvIHByb3ZlIHRoaXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTE9PUFZFUlNJT05JTkdfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTE9PUFZFUlNJT05JTkdfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Mb29wQWNjZXNzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1NjYWxhckV2b2x1dGlvbi5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb29wVXRpbHMuaCIKKyNpbmNsdWRlICJsbHZtL1RyYW5zZm9ybXMvVXRpbHMvVmFsdWVNYXBwZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBMb29wOworY2xhc3MgTG9vcEFjY2Vzc0luZm87CitjbGFzcyBMb29wSW5mbzsKK2NsYXNzIFNjYWxhckV2b2x1dGlvbjsKKworLy8vIFxicmllZiBUaGlzIGNsYXNzIGVtaXRzIGEgdmVyc2lvbiBvZiB0aGUgbG9vcCB3aGVyZSBydW4tdGltZSBjaGVja3MgZW5zdXJlCisvLy8gdGhhdCBtYXktYWxpYXMgcG9pbnRlcnMgY2FuJ3Qgb3ZlcmxhcC4KKy8vLworLy8vIEl0IGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHNpbmdsZS1leGl0IGxvb3BzIGFuZCBhc3N1bWVzIHRoYXQgdGhlIGxvb3AKKy8vLyBhbHJlYWR5IGhhcyBhIHByZWhlYWRlci4KK2NsYXNzIExvb3BWZXJzaW9uaW5nIHsKK3B1YmxpYzoKKyAgLy8vIFxicmllZiBFeHBlY3RzIExvb3BBY2Nlc3NJbmZvLCBMb29wLCBMb29wSW5mbywgRG9taW5hdG9yVHJlZSBhcyBpbnB1dC4KKyAgLy8vIEl0IHVzZXMgcnVudGltZSBjaGVjayBwcm92aWRlZCBieSB0aGUgdXNlci4gSWYgXHAgVXNlTEFJQ2hlY2tzIGlzIHRydWUsCisgIC8vLyB3ZSB3aWxsIHJldGFpbiB0aGUgZGVmYXVsdCBjaGVja3MgbWFkZSBieSBMQUkuIE90aGVyd2lzZSwgY29uc3RydWN0IGFuCisgIC8vLyBvYmplY3QgaGF2aW5nIG5vIGNoZWNrcyBhbmQgd2UgZXhwZWN0IHRoZSB1c2VyIHRvIGFkZCB0aGVtLgorICBMb29wVmVyc2lvbmluZyhjb25zdCBMb29wQWNjZXNzSW5mbyAmTEFJLCBMb29wICpMLCBMb29wSW5mbyAqTEksCisgICAgICAgICAgICAgICAgIERvbWluYXRvclRyZWUgKkRULCBTY2FsYXJFdm9sdXRpb24gKlNFLAorICAgICAgICAgICAgICAgICBib29sIFVzZUxBSUNoZWNrcyA9IHRydWUpOworCisgIC8vLyBcYnJpZWYgUGVyZm9ybXMgdGhlIENGRyBtYW5pcHVsYXRpb24gcGFydCBvZiB2ZXJzaW9uaW5nIHRoZSBsb29wIGluY2x1ZGluZworICAvLy8gdGhlIERvbWluYXRvclRyZWUgYW5kIExvb3BJbmZvIHVwZGF0ZXMuCisgIC8vLworICAvLy8gVGhlIGxvb3AgdGhhdCB3YXMgdXNlZCB0byBjb25zdHJ1Y3QgdGhlIGNsYXNzIHdpbGwgYmUgdGhlICJ2ZXJzaW9uZWQiIGxvb3AKKyAgLy8vIGkuZS4gdGhlIGxvb3AgdGhhdCB3aWxsIHJlY2VpdmUgY29udHJvbCBpZiBhbGwgdGhlIG1lbWNoZWNrcyBwYXNzLgorICAvLy8KKyAgLy8vIFRoaXMgYWxsb3dzIHRoZSBsb29wIHRyYW5zZm9ybSBwYXNzIHRvIG9wZXJhdGUgb24gdGhlIHNhbWUgbG9vcCByZWdhcmRsZXNzCisgIC8vLyBvZiB3aGV0aGVyIHZlcnNpb25pbmcgd2FzIG5lY2Vzc2FyeSBvciBub3Q6CisgIC8vLworICAvLy8gICAgZm9yIGVhY2ggbG9vcCBMOgorICAvLy8gICAgICAgIGFuYWx5emUgTAorICAvLy8gICAgICAgIGlmIHZlcnNpb25pbmcgaXMgbmVjZXNzYXJ5IHZlcnNpb24gTAorICAvLy8gICAgICAgIHRyYW5zZm9ybSBMCisgIHZvaWQgdmVyc2lvbkxvb3AoKSB7IHZlcnNpb25Mb29wKGZpbmREZWZzVXNlZE91dHNpZGVPZkxvb3AoVmVyc2lvbmVkTG9vcCkpOyB9CisKKyAgLy8vIFxicmllZiBTYW1lIGJ1dCBpZiB0aGUgY2xpZW50IGhhcyBhbHJlYWR5IHByZWNvbXB1dGVkIHRoZSBzZXQgb2YgdmFsdWVzCisgIC8vLyB1c2VkIG91dHNpZGUgdGhlIGxvb3AsIHRoaXMgQVBJIHdpbGwgYWxsb3dzIHBhc3NpbmcgdGhhdC4KKyAgdm9pZCB2ZXJzaW9uTG9vcChjb25zdCBTbWFsbFZlY3RvckltcGw8SW5zdHJ1Y3Rpb24gKj4gJkRlZnNVc2VkT3V0c2lkZSk7CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSB2ZXJzaW9uZWQgbG9vcC4gIENvbnRyb2wgZmxvd3MgaGVyZSBpZiBwb2ludGVycyBpbiB0aGUKKyAgLy8vIGxvb3AgZG9uJ3QgYWxpYXMgKGkuZS4gYWxsIG1lbWNoZWNrcyBwYXNzZWQpLiAgKFRoaXMgbG9vcCBpcyBhY3R1YWxseSB0aGUKKyAgLy8vIHNhbWUgYXMgdGhlIG9yaWdpbmFsIGxvb3AgdGhhdCB3ZSBnb3QgY29uc3RydWN0ZWQgd2l0aC4pCisgIExvb3AgKmdldFZlcnNpb25lZExvb3AoKSB7IHJldHVybiBWZXJzaW9uZWRMb29wOyB9CisKKyAgLy8vIFxicmllZiBSZXR1cm5zIHRoZSBmYWxsLWJhY2sgbG9vcC4gIENvbnRyb2wgZmxvd3MgaGVyZSBpZiBwb2ludGVycyBpbiB0aGUKKyAgLy8vIGxvb3AgbWF5IGFsaWFzIChpLmUuIG9uZSBvZiB0aGUgbWVtY2hlY2tzIGZhaWxlZCkuCisgIExvb3AgKmdldE5vblZlcnNpb25lZExvb3AoKSB7IHJldHVybiBOb25WZXJzaW9uZWRMb29wOyB9CisKKyAgLy8vIFxicmllZiBTZXRzIHRoZSBydW50aW1lIGFsaWFzIGNoZWNrcyBmb3IgdmVyc2lvbmluZyB0aGUgbG9vcC4KKyAgdm9pZCBzZXRBbGlhc0NoZWNrcygKKyAgICAgIFNtYWxsVmVjdG9yPFJ1bnRpbWVQb2ludGVyQ2hlY2tpbmc6OlBvaW50ZXJDaGVjaywgND4gQ2hlY2tzKTsKKworICAvLy8gXGJyaWVmIFNldHMgdGhlIHJ1bnRpbWUgU0NFViBjaGVja3MgZm9yIHZlcnNpb25pbmcgdGhlIGxvb3AuCisgIHZvaWQgc2V0U0NFVkNoZWNrcyhTQ0VWVW5pb25QcmVkaWNhdGUgQ2hlY2spOworCisgIC8vLyBcYnJpZWYgQW5ub3RhdGUgbWVtb3J5IGluc3RydWN0aW9ucyBpbiB0aGUgdmVyc2lvbmVkIGxvb3Agd2l0aCBuby1hbGlhcworICAvLy8gbWV0YWRhdGEgYmFzZWQgb24gdGhlIG1lbWNoZWNrcyBpc3N1ZWQuCisgIC8vLworICAvLy8gVGhpcyBpcyBqdXN0IHdyYXBwZXIgdGhhdCBjYWxscyBwcmVwYXJlTm9BbGlhc01ldGFkYXRhIGFuZAorICAvLy8gYW5ub3RhdGVJbnN0V2l0aE5vQWxpYXMgb24gdGhlIGluc3RydWN0aW9ucyBvZiB0aGUgdmVyc2lvbmVkIGxvb3AuCisgIHZvaWQgYW5ub3RhdGVMb29wV2l0aE5vQWxpYXMoKTsKKworICAvLy8gXGJyaWVmIFNldCB1cCB0aGUgYWxpYXNpbmcgc2NvcGVzIGJhc2VkIG9uIHRoZSBtZW1jaGVja3MuICBUaGlzIG5lZWRzIHRvCisgIC8vLyBiZSBjYWxsZWQgYmVmb3JlIHRoZSBmaXJzdCBjYWxsIHRvIGFubm90YXRlSW5zdFdpdGhOb0FsaWFzLgorICB2b2lkIHByZXBhcmVOb0FsaWFzTWV0YWRhdGEoKTsKKworICAvLy8gXGJyaWVmIEFkZCB0aGUgbm9hbGlhcyBhbm5vdGF0aW9ucyB0byBccCBWZXJzaW9uZWRJbnN0LgorICAvLy8KKyAgLy8vIFxwIE9yaWdJbnN0IGlzIHRoZSBpbnN0cnVjdGlvbiBjb3JyZXNwb25kaW5nIHRvIFxwIFZlcnNpb25lZEluc3QgaW4gdGhlCisgIC8vLyBvcmlnaW5hbCBsb29wLiAgSW5pdGlhbGl6ZSB0aGUgYWxpYXNpbmcgc2NvcGVzIHdpdGgKKyAgLy8vIHByZXBhcmVOb0FsaWFzTWV0YWRhdGEgb25jZSBiZWZvcmUgdGhpcyBjYW4gYmUgY2FsbGVkLgorICB2b2lkIGFubm90YXRlSW5zdFdpdGhOb0FsaWFzKEluc3RydWN0aW9uICpWZXJzaW9uZWRJbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluc3RydWN0aW9uICpPcmlnSW5zdCk7CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgQWRkcyB0aGUgbmVjZXNzYXJ5IFBISSBub2RlcyBmb3IgdGhlIHZlcnNpb25lZCBsb29wcyBiYXNlZCBvbiB0aGUKKyAgLy8vIGxvb3AtZGVmaW5lZCB2YWx1ZXMgdXNlZCBvdXRzaWRlIG9mIHRoZSBsb29wLgorICAvLy8KKyAgLy8vIFRoaXMgbmVlZHMgdG8gYmUgY2FsbGVkIGFmdGVyIHZlcnNpb25Mb29wIGlmIHRoZXJlIGFyZSBkZWZzIGluIHRoZSBsb29wCisgIC8vLyB0aGF0IGFyZSB1c2VkIG91dHNpZGUgdGhlIGxvb3AuCisgIHZvaWQgYWRkUEhJTm9kZXMoY29uc3QgU21hbGxWZWN0b3JJbXBsPEluc3RydWN0aW9uICo+ICZEZWZzVXNlZE91dHNpZGUpOworCisgIC8vLyBcYnJpZWYgQWRkIHRoZSBub2FsaWFzIGFubm90YXRpb25zIHRvIFxwIEkuICBJbml0aWFsaXplIHRoZSBhbGlhc2luZworICAvLy8gc2NvcGVzIHdpdGggcHJlcGFyZU5vQWxpYXNNZXRhZGF0YSBvbmNlIGJlZm9yZSB0aGlzIGNhbiBiZSBjYWxsZWQuCisgIHZvaWQgYW5ub3RhdGVJbnN0V2l0aE5vQWxpYXMoSW5zdHJ1Y3Rpb24gKkkpIHsKKyAgICBhbm5vdGF0ZUluc3RXaXRoTm9BbGlhcyhJLCBJKTsKKyAgfQorCisgIC8vLyBcYnJpZWYgVGhlIG9yaWdpbmFsIGxvb3AuICBUaGlzIGJlY29tZXMgdGhlICJ2ZXJzaW9uZWQiIG9uZS4gIEkuZS4sCisgIC8vLyBjb250cm9sIGZsb3dzIGhlcmUgaWYgcG9pbnRlcnMgaW4gdGhlIGxvb3AgZG9uJ3QgYWxpYXMuCisgIExvb3AgKlZlcnNpb25lZExvb3A7CisgIC8vLyBcYnJpZWYgVGhlIGZhbGwtYmFjayBsb29wLiAgSS5lLiBjb250cm9sIGZsb3dzIGhlcmUgaWYgcG9pbnRlcnMgaW4gdGhlCisgIC8vLyBsb29wIG1heSBhbGlhcyAobWVtY2hlY2tzIGZhaWxlZCkuCisgIExvb3AgKk5vblZlcnNpb25lZExvb3A7CisKKyAgLy8vIFxicmllZiBUaGlzIG1hcHMgdGhlIGluc3RydWN0aW9ucyBmcm9tIFZlcnNpb25lZExvb3AgdG8gdGhlaXIgY291bnRlcnBhcnQKKyAgLy8vIGluIE5vblZlcnNpb25lZExvb3AuCisgIFZhbHVlVG9WYWx1ZU1hcFR5IFZNYXA7CisKKyAgLy8vIFxicmllZiBUaGUgc2V0IG9mIGFsaWFzIGNoZWNrcyB0aGF0IHdlIGFyZSB2ZXJzaW9uaW5nIGZvci4KKyAgU21hbGxWZWN0b3I8UnVudGltZVBvaW50ZXJDaGVja2luZzo6UG9pbnRlckNoZWNrLCA0PiBBbGlhc0NoZWNrczsKKworICAvLy8gXGJyaWVmIFRoZSBzZXQgb2YgU0NFViBjaGVja3MgdGhhdCB3ZSBhcmUgdmVyc2lvbmluZyBmb3IuCisgIFNDRVZVbmlvblByZWRpY2F0ZSBQcmVkczsKKworICAvLy8gXGJyaWVmIE1hcHMgYSBwb2ludGVyIHRvIHRoZSBwb2ludGVyIGNoZWNraW5nIGdyb3VwIHRoYXQgdGhlIHBvaW50ZXIKKyAgLy8vIGJlbG9uZ3MgdG8uCisgIERlbnNlTWFwPGNvbnN0IFZhbHVlICosIGNvbnN0IFJ1bnRpbWVQb2ludGVyQ2hlY2tpbmc6OkNoZWNraW5nUHRyR3JvdXAgKj4KKyAgICAgIFB0clRvR3JvdXA7CisKKyAgLy8vIFxicmllZiBUaGUgYWxpYXMgc2NvcGUgY29ycmVzcG9uZGluZyB0byBhIHBvaW50ZXIgY2hlY2tpbmcgZ3JvdXAuCisgIERlbnNlTWFwPGNvbnN0IFJ1bnRpbWVQb2ludGVyQ2hlY2tpbmc6OkNoZWNraW5nUHRyR3JvdXAgKiwgTUROb2RlICo+CisgICAgICBHcm91cFRvU2NvcGU7CisKKyAgLy8vIFxicmllZiBUaGUgbGlzdCBvZiBhbGlhcyBzY29wZXMgdGhhdCBhIHBvaW50ZXIgY2hlY2tpbmcgZ3JvdXAgY2FuJ3QgYWxpYXMuCisgIERlbnNlTWFwPGNvbnN0IFJ1bnRpbWVQb2ludGVyQ2hlY2tpbmc6OkNoZWNraW5nUHRyR3JvdXAgKiwgTUROb2RlICo+CisgICAgICBHcm91cFRvTm9uQWxpYXNpbmdTY29wZUxpc3Q7CisKKyAgLy8vIFxicmllZiBBbmFseXNlcyB1c2VkLgorICBjb25zdCBMb29wQWNjZXNzSW5mbyAmTEFJOworICBMb29wSW5mbyAqTEk7CisgIERvbWluYXRvclRyZWUgKkRUOworICBTY2FsYXJFdm9sdXRpb24gKlNFOworfTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTG93ZXJJbnZva2UuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb3dlckludm9rZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyNzc0YzcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTG93ZXJJbnZva2UuaApAQCAtMCwwICsxLDMwIEBACisvLz09PS0gTG93ZXJJbnZva2UuaCAtIEVsaW1pbmF0ZSBJbnZva2UgaW5zdHJ1Y3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgdHJhbnNmb3JtYXRpb24gaXMgZGVzaWduZWQgZm9yIHVzZSBieSBjb2RlIGdlbmVyYXRvcnMgd2hpY2ggZG8gbm90IHlldAorLy8gc3VwcG9ydCBzdGFjayB1bndpbmRpbmcuICBUaGlzIHBhc3MgY29udmVydHMgJ2ludm9rZScgaW5zdHJ1Y3Rpb25zIHRvICdjYWxsJworLy8gaW5zdHJ1Y3Rpb25zLCBzbyB0aGF0IGFueSBleGNlcHRpb24taGFuZGxpbmcgJ2xhbmRpbmdwYWQnIGJsb2NrcyBiZWNvbWUgZGVhZAorLy8gY29kZSAod2hpY2ggY2FuIGJlIHJlbW92ZWQgYnkgcnVubmluZyB0aGUgJy1zaW1wbGlmeWNmZycgcGFzcyBhZnRlcndhcmRzKS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTE9XRVJJTlZPS0VfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTE9XRVJJTlZPS0VfSAorCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIExvd2VySW52b2tlUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPExvd2VySW52b2tlUGFzcz4geworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9CisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTE9XRVJJTlZPS0VfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvd2VyTWVtSW50cmluc2ljcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL0xvd2VyTWVtSW50cmluc2ljcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiN2QwZjYKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTG93ZXJNZW1JbnRyaW5zaWNzLmgKQEAgLTAsMCArMSw1NiBAQAorLy89PT0tIGxsdm0vVHJhbnNmb3Jtcy9VdGlscy9Mb3dlck1lbWludHJpbnNpY3MuaCAtLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb3dlciBtZW1zZXQsIG1lbWNweSwgbWVtbW92IGludHJpbnNpY3MgdG8gbG9vcHMgKGUuZy4gZm9yIHRhcmdldHMgd2l0aG91dAorLy8gbGlicmFyeSBzdXBwb3J0KS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19MT1dFUk1FTUlOVFJJTlNJQ1NfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTE9XRVJNRU1JTlRSSU5TSUNTX0gKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBDb25zdGFudEludDsKK2NsYXNzIEluc3RydWN0aW9uOworY2xhc3MgTWVtQ3B5SW5zdDsKK2NsYXNzIE1lbU1vdmVJbnN0OworY2xhc3MgTWVtU2V0SW5zdDsKK2NsYXNzIFRhcmdldFRyYW5zZm9ybUluZm87CitjbGFzcyBWYWx1ZTsKKworLy8vIEVtaXQgYSBsb29wIGltcGxlbWVudGluZyB0aGUgc2VtYW50aWNzIG9mIGxsdm0ubWVtY3B5IHdoZXJlIHRoZSBzaXplIGlzIG5vdAorLy8vIGEgY29tcGlsZS10aW1lIGNvbnN0YW50LiBMb29wIHdpbGwgYmUgaW5zdGVydGVkIGF0IFxwIEluc2VydEJlZm9yZS4KK3ZvaWQgY3JlYXRlTWVtQ3B5TG9vcFVua25vd25TaXplKEluc3RydWN0aW9uICpJbnNlcnRCZWZvcmUsIFZhbHVlICpTcmNBZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKkRzdEFkZHIsIFZhbHVlICpDb3B5TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgU3JjQWxpZ24sIHVuc2lnbmVkIERlc3RBbGlnbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgU3JjSXNWb2xhdGlsZSwgYm9vbCBEc3RJc1ZvbGF0aWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0VHJhbnNmb3JtSW5mbyAmVFRJKTsKKworLy8vIEVtaXQgYSBsb29wIGltcGxlbWVudGluZyB0aGUgc2VtYW50aWNzIG9mIGFuIGxsdm0ubWVtY3B5IHdob3NlIHNpemUgaXMgYQorLy8vIGNvbXBpbGUgdGltZSBjb25zdGFudC4gTG9vcCBpcyBpbnNlcnRlZCBhdCBccCBJbnNlcnRCZWZvcmUuCit2b2lkIGNyZWF0ZU1lbUNweUxvb3BLbm93blNpemUoSW5zdHJ1Y3Rpb24gKkluc2VydEJlZm9yZSwgVmFsdWUgKlNyY0FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgKkRzdEFkZHIsIENvbnN0YW50SW50ICpDb3B5TGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFNyY0FsaWduLCB1bnNpZ25lZCBEZXN0QWxpZ24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBTcmNJc1ZvbGF0aWxlLCBib29sIERzdElzVm9sYXRpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGFyZ2V0VHJhbnNmb3JtSW5mbyAmVFRJKTsKKworCisvLy8gRXhwYW5kIFxwIE1lbUNweSBhcyBhIGxvb3AuIFxwIE1lbUNweSBpcyBub3QgZGVsZXRlZC4KK3ZvaWQgZXhwYW5kTWVtQ3B5QXNMb29wKE1lbUNweUluc3QgKk1lbUNweSwgY29uc3QgVGFyZ2V0VHJhbnNmb3JtSW5mbyAmVFRJKTsKKworLy8vIEV4cGFuZCBccCBNZW1Nb3ZlIGFzIGEgbG9vcC4gXHAgTWVtTW92ZSBpcyBub3QgZGVsZXRlZC4KK3ZvaWQgZXhwYW5kTWVtTW92ZUFzTG9vcChNZW1Nb3ZlSW5zdCAqTWVtTW92ZSk7CisKKy8vLyBFeHBhbmQgXHAgTWVtU2V0IGFzIGEgbG9vcC4gXHAgTWVtU2V0IGlzIG5vdCBkZWxldGVkLgordm9pZCBleHBhbmRNZW1TZXRBc0xvb3AoTWVtU2V0SW5zdCAqTWVtU2V0KTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTWVtMlJlZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL01lbTJSZWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDc2ODQzCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL01lbTJSZWcuaApAQCAtMCwwICsxLDMxIEBACisvLz09PS0gTWVtMlJlZy5oIC0gVGhlIC1tZW0ycmVnIHBhc3MsIGEgd3JhcHBlciBhcm91bmQgdGhlIFV0aWxzIGxpYiAtLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBpcyBhIHNpbXBsZSBwYXNzIHdyYXBwZXIgYXJvdW5kIHRoZSBQcm9tb3RlTWVtVG9SZWcgZnVuY3Rpb24gY2FsbAorLy8gZXhwb3NlZCBieSB0aGUgVXRpbHMgbGlicmFyeS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19NRU0yUkVHX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX01FTTJSRUdfSAorCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEZ1bmN0aW9uOworCitjbGFzcyBQcm9tb3RlUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPFByb21vdGVQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTUVNMlJFR19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTW9kdWxlVXRpbHMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9Nb2R1bGVVdGlscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiOWJjODIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTW9kdWxlVXRpbHMuaApAQCAtMCwwICsxLDEwMSBAQAorLy89PT0tLSBNb2R1bGVVdGlscy5oIC0gRnVuY3Rpb25zIHRvIG1hbmlwdWxhdGUgTW9kdWxlcyAtLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZhbWlseSBvZiBmdW5jdGlvbnMgcGVyZm9ybSBtYW5pcHVsYXRpb25zIG9uIE1vZHVsZXMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTU9EVUxFVVRJTFNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTU9EVUxFVVRJTFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8dXRpbGl0eT4gLy8gZm9yIHN0ZDo6cGFpcgorCituYW1lc3BhY2UgbGx2bSB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBBcnJheVJlZjsKK2NsYXNzIE1vZHVsZTsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgR2xvYmFsVmFsdWU7CitjbGFzcyBHbG9iYWxWYXJpYWJsZTsKK2NsYXNzIENvbnN0YW50OworY2xhc3MgU3RyaW5nUmVmOworY2xhc3MgVmFsdWU7CitjbGFzcyBUeXBlOworCisvLy8gQXBwZW5kIEYgdG8gdGhlIGxpc3Qgb2YgZ2xvYmFsIGN0b3JzIG9mIG1vZHVsZSBNIHdpdGggdGhlIGdpdmVuIFByaW9yaXR5LgorLy8vIFRoaXMgd3JhcHMgdGhlIGZ1bmN0aW9uIGluIHRoZSBhcHByb3ByaWF0ZSBzdHJ1Y3R1cmUgYW5kIHN0b3JlcyBpdCBhbG9uZworLy8vIHNpZGUgb3RoZXIgZ2xvYmFsIGNvbnN0cnVjdG9ycy4gRm9yIGRldGFpbHMgc2VlCisvLy8gaHR0cDovL2xsdm0ub3JnL2RvY3MvTGFuZ1JlZi5odG1sI2ludGdfZ2xvYmFsX2N0b3JzCit2b2lkIGFwcGVuZFRvR2xvYmFsQ3RvcnMoTW9kdWxlICZNLCBGdW5jdGlvbiAqRiwgaW50IFByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpEYXRhID0gbnVsbHB0cik7CisKKy8vLyBTYW1lIGFzIGFwcGVuZFRvR2xvYmFsQ3RvcnMoKSwgYnV0IGZvciBnbG9iYWwgZHRvcnMuCit2b2lkIGFwcGVuZFRvR2xvYmFsRHRvcnMoTW9kdWxlICZNLCBGdW5jdGlvbiAqRiwgaW50IFByaW9yaXR5LAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0YW50ICpEYXRhID0gbnVsbHB0cik7CisKKy8vIFZhbGlkYXRlIHRoZSByZXN1bHQgb2YgTW9kdWxlOjpnZXRPckluc2VydEZ1bmN0aW9uIGNhbGxlZCBmb3IgYW4gaW50ZXJmYWNlCisvLyBmdW5jdGlvbiBvZiBnaXZlbiBzYW5pdGl6ZXIuIElmIHRoZSBpbnN0cnVtZW50ZWQgbW9kdWxlIGRlZmluZXMgYSBmdW5jdGlvbgorLy8gd2l0aCB0aGUgc2FtZSBuYW1lLCB0aGVpciBwcm90b3R5cGVzIG11c3QgbWF0Y2gsIG90aGVyd2lzZQorLy8gZ2V0T3JJbnNlcnRGdW5jdGlvbiByZXR1cm5zIGEgYml0Y2FzdC4KK0Z1bmN0aW9uICpjaGVja1Nhbml0aXplckludGVyZmFjZUZ1bmN0aW9uKENvbnN0YW50ICpGdW5jT3JCaXRjYXN0KTsKKworRnVuY3Rpb24gKmRlY2xhcmVTYW5pdGl6ZXJJbml0RnVuY3Rpb24oTW9kdWxlICZNLCBTdHJpbmdSZWYgSW5pdE5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheVJlZjxUeXBlICo+IEluaXRBcmdUeXBlcyk7CisKKy8vLyBcYnJpZWYgQ3JlYXRlcyBzYW5pdGl6ZXIgY29uc3RydWN0b3IgZnVuY3Rpb24sIGFuZCBjYWxscyBzYW5pdGl6ZXIncyBpbml0CisvLy8gZnVuY3Rpb24gZnJvbSBpdC4KKy8vLyBccmV0dXJuIFJldHVybnMgcGFpciBvZiBwb2ludGVycyB0byBjb25zdHJ1Y3RvciwgYW5kIGluaXQgZnVuY3Rpb25zCisvLy8gcmVzcGVjdGl2ZWx5Lgorc3RkOjpwYWlyPEZ1bmN0aW9uICosIEZ1bmN0aW9uICo+IGNyZWF0ZVNhbml0aXplckN0b3JBbmRJbml0RnVuY3Rpb25zKAorICAgIE1vZHVsZSAmTSwgU3RyaW5nUmVmIEN0b3JOYW1lLCBTdHJpbmdSZWYgSW5pdE5hbWUsCisgICAgQXJyYXlSZWY8VHlwZSAqPiBJbml0QXJnVHlwZXMsIEFycmF5UmVmPFZhbHVlICo+IEluaXRBcmdzLAorICAgIFN0cmluZ1JlZiBWZXJzaW9uQ2hlY2tOYW1lID0gU3RyaW5nUmVmKCkpOworCisvLy8gUmVuYW1lIGFsbCB0aGUgYW5vbiBnbG9iYWxzIGluIHRoZSBtb2R1bGUgdXNpbmcgYSBoYXNoIGNvbXB1dGVkIGZyb20KKy8vLyB0aGUgbGlzdCBvZiBwdWJsaWMgZ2xvYmFscyBpbiB0aGUgbW9kdWxlLgorYm9vbCBuYW1lVW5hbWVkR2xvYmFscyhNb2R1bGUgJk0pOworCisvLy8gXGJyaWVmIEFkZHMgZ2xvYmFsIHZhbHVlcyB0byB0aGUgbGx2bS51c2VkIGxpc3QuCit2b2lkIGFwcGVuZFRvVXNlZChNb2R1bGUgJk0sIEFycmF5UmVmPEdsb2JhbFZhbHVlICo+IFZhbHVlcyk7CisKKy8vLyBcYnJpZWYgQWRkcyBnbG9iYWwgdmFsdWVzIHRvIHRoZSBsbHZtLmNvbXBpbGVyLnVzZWQgbGlzdC4KK3ZvaWQgYXBwZW5kVG9Db21waWxlclVzZWQoTW9kdWxlICZNLCBBcnJheVJlZjxHbG9iYWxWYWx1ZSAqPiBWYWx1ZXMpOworCisvLy8gRmlsdGVyIG91dCBwb3RlbnRpYWxseSBkZWFkIGNvbWRhdCBmdW5jdGlvbnMgd2hlcmUgb3RoZXIgZW50cmllcyBrZWVwIHRoZQorLy8vIGVudGlyZSBjb21kYXQgZ3JvdXAgYWxpdmUuCisvLy8KKy8vLyBUaGlzIGlzIGRlc2lnbmVkIGZvciBjYXNlcyB3aGVyZSBmdW5jdGlvbnMgYXBwZWFyIHRvIGJlY29tZSBkZWFkIGJ1dCByZW1haW4KKy8vLyBhbGl2ZSBkdWUgdG8gb3RoZXIgbGl2ZSBlbnRyaWVzIGluIHRoZWlyIGNvbWRhdCBncm91cC4KKy8vLworLy8vIFRoZSBccCBEZWFkQ29tZGF0RnVuY3Rpb25zIGNvbnRhaW5lciBzaG91bGQgb25seSBoYXZlIHBvaW50ZXJzIHRvCisvLy8gYEZ1bmN0aW9uYHMgd2hpY2ggYXJlIG1lbWJlcnMgb2YgYSBjb21kYXQgZ3JvdXAgYW5kIGFyZSBiZWxpZXZlZCB0byBiZQorLy8vIGRlYWQuCisvLy8KKy8vLyBBZnRlciB0aGlzIHJvdXRpbmUgZmluaXNoZXMsIHRoZSBvbmx5IHJlbWFpbmluZyBgRnVuY3Rpb25gcyBpbiBccAorLy8vIERlYWRDb21kYXRGdW5jdGlvbnMgYXJlIHRob3NlIHdoZXJlIGV2ZXJ5IG1lbWJlciBvZiB0aGUgY29tZGF0IGlzIGxpc3RlZAorLy8vIGFuZCB0aHVzIHJlbW92aW5nIHRoZW0gaXMgc2FmZSAocHJvdmlkZWQgKmFsbCogYXJlIHJlbW92ZWQpLgordm9pZCBmaWx0ZXJEZWFkQ29tZGF0RnVuY3Rpb25zKAorICAgIE1vZHVsZSAmTSwgU21hbGxWZWN0b3JJbXBsPEZ1bmN0aW9uICo+ICZEZWFkQ29tZGF0RnVuY3Rpb25zKTsKKworLy8vIFxicmllZiBQcm9kdWNlIGEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgbW9kdWxlIGJ5IHRha2luZyB0aGUgTUQ1IHN1bSBvZgorLy8vIHRoZSBuYW1lcyBvZiB0aGUgbW9kdWxlJ3Mgc3Ryb25nIGV4dGVybmFsIHN5bWJvbHMgdGhhdCBhcmUgbm90IGNvbWRhdAorLy8vIG1lbWJlcnMuCisvLy8KKy8vLyBUaGlzIGlkZW50aWZpZXIgaXMgbm9ybWFsbHkgZ3VhcmFudGVlZCB0byBiZSB1bmlxdWUsIG9yIHRoZSBwcm9ncmFtIHdvdWxkCisvLy8gZmFpbCB0byBsaW5rIGR1ZSB0byBtdWx0aXBseSBkZWZpbmVkIHN5bWJvbHMuCisvLy8KKy8vLyBJZiB0aGUgbW9kdWxlIGhhcyBubyBzdHJvbmcgZXh0ZXJuYWwgc3ltYm9scyAoc3VjaCBhIG1vZHVsZSBtYXkgc3RpbGwgaGF2ZSBhCisvLy8gc2VtYW50aWMgZWZmZWN0IGlmIGl0IHBlcmZvcm1zIGdsb2JhbCBpbml0aWFsaXphdGlvbiksIHdlIGNhbm5vdCBwcm9kdWNlIGEKKy8vLyB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhpcyBtb2R1bGUsIHNvIHdlIHJldHVybiB0aGUgZW1wdHkgc3RyaW5nLgorc3RkOjpzdHJpbmcgZ2V0VW5pcXVlTW9kdWxlSWQoTW9kdWxlICpNKTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmIC8vICBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTU9EVUxFVVRJTFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL05hbWVBbm9uR2xvYmFscy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL05hbWVBbm9uR2xvYmFscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE3ZmM5MDIKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvTmFtZUFub25HbG9iYWxzLmgKQEAgLTAsMCArMSwzMyBAQAorLy89PT0tLSBOYW1lQW5vbkdsb2JhbHMuaCAtIEFub255bW91cyBHbG9iYWwgTmFtaW5nIFBhc3MgLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgaW1wbGVtZW50cyBuYW1pbmcgYW5vbnltb3VzIGdsb2JhbHMgdG8gbWFrZSBzdXJlIHRoZXkgY2FuIGJlCisvLyByZWZlcnJlZCB0byBieSBUaGluTFRPLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX05BTUVBTk9OR0xPQkFMU1NfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfTkFNRUFOT05HTE9CQUxTU19ICisKKyNpbmNsdWRlICJsbHZtL0lSL01vZHVsZS5oIgorI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKworbmFtZXNwYWNlIGxsdm0geworCisvLy8gU2ltcGxlIHBhc3MgdGhhdCBwcm92aWRlcyBhIG5hbWUgdG8gZXZlcnkgYW5vbnltb3VzIGdsb2JhbHMuCitjbGFzcyBOYW1lQW5vbkdsb2JhbFBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxOYW1lQW5vbkdsb2JhbFBhc3M+IHsKK3B1YmxpYzoKKyAgTmFtZUFub25HbG9iYWxQYXNzKCkgPSBkZWZhdWx0OworCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19VVElMU19OQU1FQU5PTkdMT0JBTFNfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL09yZGVyZWRJbnN0cnVjdGlvbnMuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9PcmRlcmVkSW5zdHJ1Y3Rpb25zLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY1ZDRiZAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9PcmRlcmVkSW5zdHJ1Y3Rpb25zLmgKQEAgLTAsMCArMSw1NCBAQAorLy89PT0tIGxsdm0vVHJhbnNmb3Jtcy9VdGlscy9PcmRlcmVkSW5zdHJ1Y3Rpb25zLmggLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIGFuIGVmZmljaWVudCB3YXkgdG8gY2hlY2sgZm9yIGRvbWluYW5jZSByZWxhdGlvbiBiZXR3ZWVuIDIKKy8vIGluc3RydWN0aW9ucy4KKy8vCisvLyBUaGlzIGludGVyZmFjZSBkaXNwYXRjaGVzIHRvIGFwcHJvcHJpYXRlIGRvbWluYW5jZSBjaGVjayBnaXZlbiAyCisvLyBpbnN0cnVjdGlvbnMsIGkuZS4gaW4gY2FzZSB0aGUgaW5zdHJ1Y3Rpb25zIGFyZSBpbiB0aGUgc2FtZSBiYXNpYyBibG9jaywKKy8vIE9yZGVyZWRCYXNpY0Jsb2NrICh3aXRoIGluc3RydWN0aW9uIG51bWJlcmluZyBhbmQgY2FjaGluZykgYXJlIHVzZWQuCisvLyBPdGhlcndpc2UsIGRvbWluYXRvciB0cmVlIGlzIHVzZWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfT1JERVJFRElOU1RSVUNUSU9OU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19PUkRFUkVESU5TVFJVQ1RJT05TX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9PcmRlcmVkQmFzaWNCbG9jay5oIgorI2luY2x1ZGUgImxsdm0vSVIvRG9taW5hdG9ycy5oIgorI2luY2x1ZGUgImxsdm0vSVIvT3BlcmF0b3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBPcmRlcmVkSW5zdHJ1Y3Rpb25zIHsKKyAgLy8vIFVzZWQgdG8gY2hlY2sgZG9taW5hbmNlIGZvciBpbnN0cnVjdGlvbnMgaW4gc2FtZSBiYXNpYyBibG9jay4KKyAgbXV0YWJsZSBEZW5zZU1hcDxjb25zdCBCYXNpY0Jsb2NrICosIHN0ZDo6dW5pcXVlX3B0cjxPcmRlcmVkQmFzaWNCbG9jaz4+CisgICAgICBPQkJNYXA7CisKKyAgLy8vIFRoZSBkb21pbmF0b3IgdHJlZSBvZiB0aGUgcGFyZW50IGZ1bmN0aW9uLgorICBEb21pbmF0b3JUcmVlICpEVDsKKworcHVibGljOgorICAvLy8gQ29uc3RydWN0b3IuCisgIE9yZGVyZWRJbnN0cnVjdGlvbnMoRG9taW5hdG9yVHJlZSAqRFQpIDogRFQoRFQpIHt9CisKKyAgLy8vIFJldHVybiB0cnVlIGlmIGZpcnN0IGluc3RydWN0aW9uIGRvbWluYXRlcyB0aGUgc2Vjb25kLgorICBib29sIGRvbWluYXRlcyhjb25zdCBJbnN0cnVjdGlvbiAqLCBjb25zdCBJbnN0cnVjdGlvbiAqKSBjb25zdDsKKworICAvLy8gSW52YWxpZGF0ZSB0aGUgT3JkZXJlZEJhc2ljQmxvY2sgY2FjaGUgd2hlbiBpdHMgYmFzaWMgYmxvY2sgY2hhbmdlcy4KKyAgLy8vIGkuZS4gSWYgYW4gaW5zdHJ1Y3Rpb24gaXMgZGVsZXRlZCBvciBhZGRlZCB0byB0aGUgYmFzaWMgYmxvY2ssIHRoZSB1c2VyCisgIC8vLyBzaG91bGQgY2FsbCB0aGlzIGZ1bmN0aW9uIHRvIGludmFsaWRhdGUgdGhlIE9yZGVyZWRCYXNpY0Jsb2NrIGNhY2hlIGZvcgorICAvLy8gdGhpcyBiYXNpYyBibG9jay4KKyAgdm9pZCBpbnZhbGlkYXRlQmxvY2soY29uc3QgQmFzaWNCbG9jayAqQkIpIHsgT0JCTWFwLmVyYXNlKEJCKTsgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19VVElMU19PUkRFUkVESU5TVFJVQ1RJT05TX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9QcmVkaWNhdGVJbmZvLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvUHJlZGljYXRlSW5mby5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxNTBmMTUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvUHJlZGljYXRlSW5mby5oCkBAIC0wLDAgKzEsMjk1IEBACisvLz09PS0gUHJlZGljYXRlSW5mby5oIC0gQnVpbGQgUHJlZGljYXRlSW5mbyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi1DKystKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vCisvLy8gXGZpbGUKKy8vLyBcYnJpZWYgIFRoaXMgZmlsZSBpbXBsZW1lbnRzIHRoZSBQcmVkaWNhdGVJbmZvIGFuYWx5c2lzLCB3aGljaCBjcmVhdGVzIGFuIEV4dGVuZGVkCisvLy8gU1NBIGZvcm0gZm9yIG9wZXJhdGlvbnMgdXNlZCBpbiBicmFuY2ggY29tcGFyaXNvbnMgYW5kIGxsdm0uYXNzdW1lCisvLy8gY29tcGFyaXNvbnMuCisvLy8KKy8vLyBDb3BpZXMgb2YgdGhlc2Ugb3BlcmF0aW9ucyBhcmUgaW5zZXJ0ZWQgaW50byB0aGUgdHJ1ZS9mYWxzZSBlZGdlIChhbmQgYWZ0ZXIKKy8vLyBhc3N1bWVzKSwgYW5kIGluZm9ybWF0aW9uIGF0dGFjaGVkIHRvIHRoZSBjb3BpZXMuICBBbGwgdXNlcyBvZiB0aGUgb3JpZ2luYWwKKy8vLyBvcGVyYXRpb24gaW4gYmxvY2tzIGRvbWluYXRlZCBieSB0aGUgdHJ1ZS9mYWxzZSBlZGdlIChhbmQgYXNzdW1lKSwgYXJlCisvLy8gcmVwbGFjZWQgd2l0aCB1c2VzIG9mIHRoZSBjb3BpZXMuICBUaGlzIGVuYWJsZXMgcGFzc2VzIHRvIGVhc2lseSBhbmQgc3BhcnNlbHkKKy8vLyBwcm9wYWdhdGUgY29uZGl0aW9uIGJhc2VkIGluZm8gaW50byB0aGUgb3BlcmF0aW9ucyB0aGF0IG1heSBiZSBhZmZlY3RlZC4KKy8vLworLy8vIEV4YW1wbGU6CisvLy8gJWNtcCA9IGljbXAgZXEgaTMyICV4LCA1MAorLy8vIGJyIGkxICVjbXAsIGxhYmVsICV0cnVlLCBsYWJlbCAlZmFsc2UKKy8vLyB0cnVlOgorLy8vIHJldCBpMzIgJXgKKy8vLyBmYWxzZToKKy8vLyByZXQgaTMyIDEKKy8vLworLy8vIHdpbGwgYmVjb21lCisvLy8KKy8vLyAlY21wID0gaWNtcCBlcSBpMzIsICV4LCA1MAorLy8vIGJyIGkxICVjbXAsIGxhYmVsICV0cnVlLCBsYWJlbCAlZmFsc2UKKy8vLyB0cnVlOgorLy8vICV4LjAgPSBjYWxsIEBsbHZtLnNzYV9jb3B5LmkzMihpMzIgJXgpCisvLy8gcmV0IGkzMiAleC4wCisvLy8gZmFsc2U6CisvLy8gcmV0IGkzMiAxCisvLy8KKy8vLyBVc2luZyBnZXRQcmVkaWNhdGVJbmZvRm9yIG9uIHguMCB3aWxsIGdpdmUgeW91IHRoZSBjb21wYXJpc29uIGl0IGlzCisvLy8gZG9taW5hdGVkIGJ5ICh0aGUgaWNtcCksIGFuZCB0aGF0IHlvdSBhcmUgbG9jYXRlZCBpbiB0aGUgdHJ1ZSBlZGdlIG9mIHRoYXQKKy8vLyBjb21wYXJpc29uLCB3aGljaCB0ZWxscyB5b3UgeC4wIGlzIDUwLgorLy8vCisvLy8gSW4gb3JkZXIgdG8gcmVkdWNlIHRoZSBudW1iZXIgb2YgY29waWVzIGluc2VydGVkLCBwcmVkaWNhdGVpbmZvIGlzIG9ubHkKKy8vLyBpbnNlcnRlZCB3aGVyZSBpdCB3b3VsZCBhY3R1YWxseSBiZSBsaXZlLiAgVGhpcyBtZWFucyBpZiB0aGVyZSBhcmUgbm8gdXNlcyBvZgorLy8vIGFuIG9wZXJhdGlvbiBkb21pbmF0ZWQgYnkgdGhlIGJyYW5jaCBlZGdlcywgb3IgYnkgYW4gYXNzdW1lLCB0aGUgYXNzb2NpYXRlZAorLy8vIHByZWRpY2F0ZSBpbmZvIGlzIG5ldmVyIGluc2VydGVkLgorLy8vCisvLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1BSRURJQ0FURUlORk9fSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfUFJFRElDQVRFSU5GT19ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxQdHJTZXQuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TbWFsbFZlY3Rvci5oIgorI2luY2x1ZGUgImxsdm0vQURUL2lsaXN0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaWxpc3Rfbm9kZS5oIgorI2luY2x1ZGUgImxsdm0vQURUL2l0ZXJhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9Bc3N1bXB0aW9uQ2FjaGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0Jhc2ljQmxvY2suaCIKKyNpbmNsdWRlICJsbHZtL0lSL0RvbWluYXRvcnMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL0luc3RydWN0aW9ucy5oIgorI2luY2x1ZGUgImxsdm0vSVIvSW50cmluc2ljSW5zdC5oIgorI2luY2x1ZGUgImxsdm0vSVIvTW9kdWxlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9PcGVyYW5kVHJhaXRzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9UeXBlLmgiCisjaW5jbHVkZSAibGx2bS9JUi9Vc2UuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1VzZXIuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzLmgiCisjaW5jbHVkZSAibGx2bS9QYXNzQW5hbHlzaXNTdXBwb3J0LmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Nhc3RpbmcuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQ29tcGlsZXIuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3JIYW5kbGluZy5oIgorI2luY2x1ZGUgImxsdm0vVHJhbnNmb3Jtcy9VdGlscy9PcmRlcmVkSW5zdHJ1Y3Rpb25zLmgiCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGNhc3NlcnQ+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBEb21pbmF0b3JUcmVlOworY2xhc3MgRnVuY3Rpb247CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIE1lbW9yeUFjY2VzczsKK2NsYXNzIExMVk1Db250ZXh0OworY2xhc3MgcmF3X29zdHJlYW07CisKK2VudW0gUHJlZGljYXRlVHlwZSB7IFBUX0JyYW5jaCwgUFRfQXNzdW1lLCBQVF9Td2l0Y2ggfTsKKworLy8gQmFzZSBjbGFzcyBmb3IgYWxsIHByZWRpY2F0ZSBpbmZvcm1hdGlvbiB3ZSBwcm92aWRlLgorLy8gQWxsIG9mIG91ciBwcmVkaWNhdGUgaW5mb3JtYXRpb24gaGFzIGF0IGxlYXN0IGEgY29tcGFyaXNvbi4KK2NsYXNzIFByZWRpY2F0ZUJhc2UgOiBwdWJsaWMgaWxpc3Rfbm9kZTxQcmVkaWNhdGVCYXNlPiB7CitwdWJsaWM6CisgIFByZWRpY2F0ZVR5cGUgVHlwZTsKKyAgLy8gVGhlIG9yaWdpbmFsIG9wZXJhbmQgYmVmb3JlIHdlIHJlbmFtZWQgaXQuCisgIC8vIFRoaXMgY2FuIGJlIHVzZSBieSBwYXNzZXMsIHdoZW4gZGVzdHJveWluZyBwcmVkaWNhdGVpbmZvLCB0byBrbm93CisgIC8vIHdoZXRoZXIgdGhleSBjYW4ganVzdCBkcm9wIHRoZSBpbnRyaW5zaWMsIG9yIGhhdmUgdG8gbWVyZ2UgbWV0YWRhdGEuCisgIFZhbHVlICpPcmlnaW5hbE9wOworICBQcmVkaWNhdGVCYXNlKGNvbnN0IFByZWRpY2F0ZUJhc2UgJikgPSBkZWxldGU7CisgIFByZWRpY2F0ZUJhc2UgJm9wZXJhdG9yPShjb25zdCBQcmVkaWNhdGVCYXNlICYpID0gZGVsZXRlOworICBQcmVkaWNhdGVCYXNlKCkgPSBkZWxldGU7CisgIHZpcnR1YWwgflByZWRpY2F0ZUJhc2UoKSA9IGRlZmF1bHQ7CisKK3Byb3RlY3RlZDoKKyAgUHJlZGljYXRlQmFzZShQcmVkaWNhdGVUeXBlIFBULCBWYWx1ZSAqT3ApIDogVHlwZShQVCksIE9yaWdpbmFsT3AoT3ApIHt9Cit9OworCitjbGFzcyBQcmVkaWNhdGVXaXRoQ29uZGl0aW9uIDogcHVibGljIFByZWRpY2F0ZUJhc2UgeworcHVibGljOgorICBWYWx1ZSAqQ29uZGl0aW9uOworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFByZWRpY2F0ZUJhc2UgKlBCKSB7CisgICAgcmV0dXJuIFBCLT5UeXBlID09IFBUX0Fzc3VtZSB8fCBQQi0+VHlwZSA9PSBQVF9CcmFuY2ggfHwKKyAgICAgICAgICAgUEItPlR5cGUgPT0gUFRfU3dpdGNoOworICB9CisKK3Byb3RlY3RlZDoKKyAgUHJlZGljYXRlV2l0aENvbmRpdGlvbihQcmVkaWNhdGVUeXBlIFBULCBWYWx1ZSAqT3AsIFZhbHVlICpDb25kaXRpb24pCisgICAgICA6IFByZWRpY2F0ZUJhc2UoUFQsIE9wKSwgQ29uZGl0aW9uKENvbmRpdGlvbikge30KK307CisKKy8vIFByb3ZpZGVzIHByZWRpY2F0ZSBpbmZvcm1hdGlvbiBmb3IgYXNzdW1lcy4gIFNpbmNlIGFzc3VtZXMgYXJlIGFsd2F5cyB0cnVlLAorLy8gd2Ugc2ltcGx5IHByb3ZpZGUgdGhlIGFzc3VtZSBpbnN0cnVjdGlvbiwgc28geW91IGNhbiB0ZWxsIHlvdXIgcmVsYXRpdmUKKy8vIHBvc2l0aW9uIHRvIGl0LgorY2xhc3MgUHJlZGljYXRlQXNzdW1lIDogcHVibGljIFByZWRpY2F0ZVdpdGhDb25kaXRpb24geworcHVibGljOgorICBJbnRyaW5zaWNJbnN0ICpBc3N1bWVJbnN0OworICBQcmVkaWNhdGVBc3N1bWUoVmFsdWUgKk9wLCBJbnRyaW5zaWNJbnN0ICpBc3N1bWVJbnN0LCBWYWx1ZSAqQ29uZGl0aW9uKQorICAgICAgOiBQcmVkaWNhdGVXaXRoQ29uZGl0aW9uKFBUX0Fzc3VtZSwgT3AsIENvbmRpdGlvbiksCisgICAgICAgIEFzc3VtZUluc3QoQXNzdW1lSW5zdCkge30KKyAgUHJlZGljYXRlQXNzdW1lKCkgPSBkZWxldGU7CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgUHJlZGljYXRlQmFzZSAqUEIpIHsKKyAgICByZXR1cm4gUEItPlR5cGUgPT0gUFRfQXNzdW1lOworICB9Cit9OworCisvLyBNaXhpbiBjbGFzcyBmb3IgZWRnZSBwcmVkaWNhdGVzLiAgVGhlIEZST00gYmxvY2sgaXMgdGhlIGJsb2NrIHdoZXJlIHRoZQorLy8gcHJlZGljYXRlIG9yaWdpbmF0ZXMsIGFuZCB0aGUgVE8gYmxvY2sgaXMgdGhlIGJsb2NrIHdoZXJlIHRoZSBwcmVkaWNhdGUgaXMKKy8vIHZhbGlkLgorY2xhc3MgUHJlZGljYXRlV2l0aEVkZ2UgOiBwdWJsaWMgUHJlZGljYXRlV2l0aENvbmRpdGlvbiB7CitwdWJsaWM6CisgIEJhc2ljQmxvY2sgKkZyb207CisgIEJhc2ljQmxvY2sgKlRvOworICBQcmVkaWNhdGVXaXRoRWRnZSgpID0gZGVsZXRlOworICBzdGF0aWMgYm9vbCBjbGFzc29mKGNvbnN0IFByZWRpY2F0ZUJhc2UgKlBCKSB7CisgICAgcmV0dXJuIFBCLT5UeXBlID09IFBUX0JyYW5jaCB8fCBQQi0+VHlwZSA9PSBQVF9Td2l0Y2g7CisgIH0KKworcHJvdGVjdGVkOgorICBQcmVkaWNhdGVXaXRoRWRnZShQcmVkaWNhdGVUeXBlIFBUeXBlLCBWYWx1ZSAqT3AsIEJhc2ljQmxvY2sgKkZyb20sCisgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKlRvLCBWYWx1ZSAqQ29uZCkKKyAgICAgIDogUHJlZGljYXRlV2l0aENvbmRpdGlvbihQVHlwZSwgT3AsIENvbmQpLCBGcm9tKEZyb20pLCBUbyhUbykge30KK307CisKKy8vIFByb3ZpZGVzIHByZWRpY2F0ZSBpbmZvcm1hdGlvbiBmb3IgYnJhbmNoZXMuCitjbGFzcyBQcmVkaWNhdGVCcmFuY2ggOiBwdWJsaWMgUHJlZGljYXRlV2l0aEVkZ2UgeworcHVibGljOgorICAvLyBJZiB0cnVlLCBTcGxpdEJCIGlzIHRoZSB0cnVlIHN1Y2Nlc3Nvciwgb3RoZXJ3aXNlIGl0J3MgdGhlIGZhbHNlIHN1Y2Nlc3Nvci4KKyAgYm9vbCBUcnVlRWRnZTsKKyAgUHJlZGljYXRlQnJhbmNoKFZhbHVlICpPcCwgQmFzaWNCbG9jayAqQnJhbmNoQkIsIEJhc2ljQmxvY2sgKlNwbGl0QkIsCisgICAgICAgICAgICAgICAgICBWYWx1ZSAqQ29uZGl0aW9uLCBib29sIFRha2VuRWRnZSkKKyAgICAgIDogUHJlZGljYXRlV2l0aEVkZ2UoUFRfQnJhbmNoLCBPcCwgQnJhbmNoQkIsIFNwbGl0QkIsIENvbmRpdGlvbiksCisgICAgICAgIFRydWVFZGdlKFRha2VuRWRnZSkge30KKyAgUHJlZGljYXRlQnJhbmNoKCkgPSBkZWxldGU7CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgUHJlZGljYXRlQmFzZSAqUEIpIHsKKyAgICByZXR1cm4gUEItPlR5cGUgPT0gUFRfQnJhbmNoOworICB9Cit9OworCitjbGFzcyBQcmVkaWNhdGVTd2l0Y2ggOiBwdWJsaWMgUHJlZGljYXRlV2l0aEVkZ2UgeworcHVibGljOgorICBWYWx1ZSAqQ2FzZVZhbHVlOworICAvLyBUaGlzIGlzIHRoZSBzd2l0Y2ggaW5zdHJ1Y3Rpb24uCisgIFN3aXRjaEluc3QgKlN3aXRjaDsKKyAgUHJlZGljYXRlU3dpdGNoKFZhbHVlICpPcCwgQmFzaWNCbG9jayAqU3dpdGNoQkIsIEJhc2ljQmxvY2sgKlRhcmdldEJCLAorICAgICAgICAgICAgICAgICAgVmFsdWUgKkNhc2VWYWx1ZSwgU3dpdGNoSW5zdCAqU0kpCisgICAgICA6IFByZWRpY2F0ZVdpdGhFZGdlKFBUX1N3aXRjaCwgT3AsIFN3aXRjaEJCLCBUYXJnZXRCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgU0ktPmdldENvbmRpdGlvbigpKSwKKyAgICAgICAgQ2FzZVZhbHVlKENhc2VWYWx1ZSksIFN3aXRjaChTSSkge30KKyAgUHJlZGljYXRlU3dpdGNoKCkgPSBkZWxldGU7CisgIHN0YXRpYyBib29sIGNsYXNzb2YoY29uc3QgUHJlZGljYXRlQmFzZSAqUEIpIHsKKyAgICByZXR1cm4gUEItPlR5cGUgPT0gUFRfU3dpdGNoOworICB9Cit9OworCisvLyBUaGlzIG5hbWUgaXMgdXNlZCBpbiBhIGZldyBwbGFjZXMsIHNvIGtpY2sgaXQgaW50byB0aGVpciBvd24gbmFtZXNwYWNlCituYW1lc3BhY2UgUHJlZGljYXRlSW5mb0NsYXNzZXMgeworc3RydWN0IFZhbHVlREZTOworfQorCisvLy8gXGJyaWVmIEVuY2Fwc3VsYXRlcyBQcmVkaWNhdGVJbmZvLCBpbmNsdWRpbmcgYWxsIGRhdGEgYXNzb2NpYXRlZCB3aXRoIG1lbW9yeQorLy8vIGFjY2Vzc2VzLgorY2xhc3MgUHJlZGljYXRlSW5mbyB7Citwcml2YXRlOgorICAvLyBVc2VkIHRvIHN0b3JlIGluZm9ybWF0aW9uIGFib3V0IGVhY2ggdmFsdWUgd2UgbWlnaHQgcmVuYW1lLgorICBzdHJ1Y3QgVmFsdWVJbmZvIHsKKyAgICAvLyBJbmZvcm1hdGlvbiBhYm91dCBlYWNoIHBvc3NpYmxlIGNvcHkuIER1cmluZyBwcm9jZXNzaW5nLCB0aGlzIGlzIGVhY2gKKyAgICAvLyBpbnNlcnRlZCBpbmZvLiBBZnRlciBwcm9jZXNzaW5nLCB3ZSBtb3ZlIHRoZSB1bmluc2VydGVkIG9uZXMgdG8gdGhlCisgICAgLy8gdW5pbnNlcnRlZCB2ZWN0b3IuCisgICAgU21hbGxWZWN0b3I8UHJlZGljYXRlQmFzZSAqLCA0PiBJbmZvczsKKyAgICBTbWFsbFZlY3RvcjxQcmVkaWNhdGVCYXNlICosIDQ+IFVuaW5zZXJ0ZWRJbmZvczsKKyAgfTsKKyAgLy8gVGhpcyBvd25zIHRoZSBhbGwgdGhlIHByZWRpY2F0ZSBpbmZvcyBpbiB0aGUgZnVuY3Rpb24sIHBsYWNlZCBvciBub3QuCisgIGlwbGlzdDxQcmVkaWNhdGVCYXNlPiBBbGxJbmZvczsKKworcHVibGljOgorICBQcmVkaWNhdGVJbmZvKEZ1bmN0aW9uICYsIERvbWluYXRvclRyZWUgJiwgQXNzdW1wdGlvbkNhY2hlICYpOworICB+UHJlZGljYXRlSW5mbygpOworCisgIHZvaWQgdmVyaWZ5UHJlZGljYXRlSW5mbygpIGNvbnN0OworCisgIHZvaWQgZHVtcCgpIGNvbnN0OworICB2b2lkIHByaW50KHJhd19vc3RyZWFtICYpIGNvbnN0OworCisgIGNvbnN0IFByZWRpY2F0ZUJhc2UgKmdldFByZWRpY2F0ZUluZm9Gb3IoY29uc3QgVmFsdWUgKlYpIGNvbnN0IHsKKyAgICByZXR1cm4gUHJlZGljYXRlTWFwLmxvb2t1cChWKTsKKyAgfQorCitwcm90ZWN0ZWQ6CisgIC8vIFVzZWQgYnkgUHJlZGljYXRlSW5mbyBhbm5vdGF0ZXIsIGR1bXBlcnMsIGFuZCB3cmFwcGVyIHBhc3MuCisgIGZyaWVuZCBjbGFzcyBQcmVkaWNhdGVJbmZvQW5ub3RhdGVkV3JpdGVyOworICBmcmllbmQgY2xhc3MgUHJlZGljYXRlSW5mb1ByaW50ZXJMZWdhY3lQYXNzOworCitwcml2YXRlOgorICB2b2lkIGJ1aWxkUHJlZGljYXRlSW5mbygpOworICB2b2lkIHByb2Nlc3NBc3N1bWUoSW50cmluc2ljSW5zdCAqLCBCYXNpY0Jsb2NrICosIFNtYWxsUHRyU2V0SW1wbDxWYWx1ZSAqPiAmKTsKKyAgdm9pZCBwcm9jZXNzQnJhbmNoKEJyYW5jaEluc3QgKiwgQmFzaWNCbG9jayAqLCBTbWFsbFB0clNldEltcGw8VmFsdWUgKj4gJik7CisgIHZvaWQgcHJvY2Vzc1N3aXRjaChTd2l0Y2hJbnN0ICosIEJhc2ljQmxvY2sgKiwgU21hbGxQdHJTZXRJbXBsPFZhbHVlICo+ICYpOworICB2b2lkIHJlbmFtZVVzZXMoU21hbGxQdHJTZXRJbXBsPFZhbHVlICo+ICYpOworICB1c2luZyBWYWx1ZURGUyA9IFByZWRpY2F0ZUluZm9DbGFzc2VzOjpWYWx1ZURGUzsKKyAgdHlwZWRlZiBTbWFsbFZlY3RvckltcGw8VmFsdWVERlM+IFZhbHVlREZTU3RhY2s7CisgIHZvaWQgY29udmVydFVzZXNUb0RGU09yZGVyZWQoVmFsdWUgKiwgU21hbGxWZWN0b3JJbXBsPFZhbHVlREZTPiAmKTsKKyAgVmFsdWUgKm1hdGVyaWFsaXplU3RhY2sodW5zaWduZWQgaW50ICYsIFZhbHVlREZTU3RhY2sgJiwgVmFsdWUgKik7CisgIGJvb2wgc3RhY2tJc0luU2NvcGUoY29uc3QgVmFsdWVERlNTdGFjayAmLCBjb25zdCBWYWx1ZURGUyAmKSBjb25zdDsKKyAgdm9pZCBwb3BTdGFja1VudGlsREZTU2NvcGUoVmFsdWVERlNTdGFjayAmLCBjb25zdCBWYWx1ZURGUyAmKTsKKyAgVmFsdWVJbmZvICZnZXRPckNyZWF0ZVZhbHVlSW5mbyhWYWx1ZSAqKTsKKyAgdm9pZCBhZGRJbmZvRm9yKFNtYWxsUHRyU2V0SW1wbDxWYWx1ZSAqPiAmT3BzVG9SZW5hbWUsIFZhbHVlICpPcCwKKyAgICAgICAgICAgICAgICAgIFByZWRpY2F0ZUJhc2UgKlBCKTsKKyAgY29uc3QgVmFsdWVJbmZvICZnZXRWYWx1ZUluZm8oVmFsdWUgKikgY29uc3Q7CisgIEZ1bmN0aW9uICZGOworICBEb21pbmF0b3JUcmVlICZEVDsKKyAgQXNzdW1wdGlvbkNhY2hlICZBQzsKKyAgT3JkZXJlZEluc3RydWN0aW9ucyBPSTsKKyAgLy8gVGhpcyBtYXBzIGZyb20gY29weSBvcGVyYW5kcyB0byBQcmVkaWNhdGUgSW5mby4gTm90ZSB0aGF0IGl0IGRvZXMgbm90IG93bgorICAvLyB0aGUgUHJlZGljYXRlIEluZm8sIHRoZXkgYmVsb25nIHRvIHRoZSBWYWx1ZUluZm8gc3RydWN0cyBpbiB0aGUgVmFsdWVJbmZvcworICAvLyB2ZWN0b3IuCisgIERlbnNlTWFwPGNvbnN0IFZhbHVlICosIGNvbnN0IFByZWRpY2F0ZUJhc2UgKj4gUHJlZGljYXRlTWFwOworICAvLyBUaGlzIHN0b3JlcyBpbmZvIGFib3V0IGVhY2ggb3BlcmFuZCBvciBjb21wYXJpc29uIHJlc3VsdCB3ZSBtYWtlIGNvcGllcworICAvLyBvZi4gIFRoZSByZWFsIFZhbHVlSW5mb3Mgc3RhcnQgYXQgaW5kZXggMSwgaW5kZXggMCBpcyB1bnVzZWQgc28gdGhhdCB3ZSBjYW4KKyAgLy8gbW9yZSBlYXNpbHkgZGV0ZWN0IGludmFsaWQgaW5kZXhpbmcuCisgIFNtYWxsVmVjdG9yPFZhbHVlSW5mbywgMzI+IFZhbHVlSW5mb3M7CisgIC8vIFRoaXMgZ2l2ZXMgdGhlIGluZGV4IGludG8gdGhlIFZhbHVlSW5mb3MgYXJyYXkgZm9yIGEgZ2l2ZW4gVmFsdWUuICBCZWNhdXNlCisgIC8vIDAgaXMgbm90IGEgdmFsaWQgVmFsdWUgSW5mbyBpbmRleCwgeW91IGNhbiB1c2UgRGVuc2VNYXA6Omxvb2t1cCBhbmQgdGVsbAorICAvLyB3aGV0aGVyIGl0IHJldHVybmVkIGEgdmFsaWQgcmVzdWx0LgorICBEZW5zZU1hcDxWYWx1ZSAqLCB1bnNpZ25lZCBpbnQ+IFZhbHVlSW5mb051bXM7CisgIC8vIFRoZSBzZXQgb2YgZWRnZXMgYWxvbmcgd2hpY2ggd2UgY2FuIG9ubHkgaGFuZGxlIHBoaSB1c2VzLCBkdWUgdG8gY3JpdGljYWwKKyAgLy8gZWRnZXMuCisgIERlbnNlU2V0PHN0ZDo6cGFpcjxCYXNpY0Jsb2NrICosIEJhc2ljQmxvY2sgKj4+IEVkZ2VVc2VzT25seTsKK307CisKKy8vIFRoaXMgcGFzcyBkb2VzIGVhZ2VyIGJ1aWxkaW5nIGFuZCB0aGVuIHByaW50aW5nIG9mIFByZWRpY2F0ZUluZm8uIEl0IGlzIHVzZWQKKy8vIGJ5CisvLyB0aGUgdGVzdHMgdG8gYmUgYWJsZSB0byBidWlsZCwgZHVtcCwgYW5kIHZlcmlmeSBQcmVkaWNhdGVJbmZvLgorY2xhc3MgUHJlZGljYXRlSW5mb1ByaW50ZXJMZWdhY3lQYXNzIDogcHVibGljIEZ1bmN0aW9uUGFzcyB7CitwdWJsaWM6CisgIFByZWRpY2F0ZUluZm9QcmludGVyTGVnYWN5UGFzcygpOworCisgIHN0YXRpYyBjaGFyIElEOworICBib29sIHJ1bk9uRnVuY3Rpb24oRnVuY3Rpb24gJikgb3ZlcnJpZGU7CisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7Cit9OworCisvLy8gXGJyaWVmIFByaW50ZXIgcGFzcyBmb3IgXGMgUHJlZGljYXRlSW5mby4KK2NsYXNzIFByZWRpY2F0ZUluZm9QcmludGVyUGFzcworICAgIDogcHVibGljIFBhc3NJbmZvTWl4aW48UHJlZGljYXRlSW5mb1ByaW50ZXJQYXNzPiB7CisgIHJhd19vc3RyZWFtICZPUzsKKworcHVibGljOgorICBleHBsaWNpdCBQcmVkaWNhdGVJbmZvUHJpbnRlclBhc3MocmF3X29zdHJlYW0gJk9TKSA6IE9TKE9TKSB7fQorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCisvLy8gXGJyaWVmIFZlcmlmaWVyIHBhc3MgZm9yIFxjIFByZWRpY2F0ZUluZm8uCitzdHJ1Y3QgUHJlZGljYXRlSW5mb1ZlcmlmaWVyUGFzcyA6IFBhc3NJbmZvTWl4aW48UHJlZGljYXRlSW5mb1ZlcmlmaWVyUGFzcz4geworICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1BSRURJQ0FURUlORk9fSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1Byb21vdGVNZW1Ub1JlZy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1Byb21vdGVNZW1Ub1JlZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOGE2MWEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvUHJvbW90ZU1lbVRvUmVnLmgKQEAgLTAsMCArMSw0NiBAQAorLy89PT0tIFByb21vdGVNZW1Ub1JlZy5oIC0gUHJvbW90ZSBBbGxvY2FzIHRvIFNjYWxhcnMgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZXhwb3NlcyBhbiBpbnRlcmZhY2UgdG8gcHJvbW90ZSBhbGxvY2EgaW5zdHJ1Y3Rpb25zIHRvIFNTQQorLy8gcmVnaXN0ZXJzLCBieSB1c2luZyB0aGUgU1NBIGNvbnN0cnVjdGlvbiBhbGdvcml0aG0uCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfUFJPTU9URU1FTVRPUkVHX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1BST01PVEVNRU1UT1JFR19ICisKK25hbWVzcGFjZSBsbHZtIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIEFycmF5UmVmOworY2xhc3MgQWxsb2NhSW5zdDsKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBBbGlhc1NldFRyYWNrZXI7CitjbGFzcyBBc3N1bXB0aW9uQ2FjaGU7CisKKy8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhpcyBhbGxvY2EgaXMgbGVnYWwgZm9yIHByb21vdGlvbi4KKy8vLworLy8vIFRoaXMgaXMgdHJ1ZSBpZiB0aGVyZSBhcmUgb25seSBsb2Fkcywgc3RvcmVzLCBhbmQgbGlmZXRpbWUgbWFya2VycworLy8vICh0cmFuc2l0aXZlbHkpIHVzaW5nIHRoaXMgYWxsb2NhLiBUaGlzIGFsc28gZW5mb3JjZXMgdGhhdCB0aGVyZSBpcyBvbmx5CisvLy8gZXZlciBvbmUgbGF5ZXIgb2YgYml0Y2FzdHMgb3IgR0VQcyBiZXR3ZWVuIHRoZSBhbGxvY2EgYW5kIHRoZSBsaWZldGltZQorLy8vIG1hcmtlcnMuCitib29sIGlzQWxsb2NhUHJvbW90YWJsZShjb25zdCBBbGxvY2FJbnN0ICpBSSk7CisKKy8vLyBcYnJpZWYgUHJvbW90ZSB0aGUgc3BlY2lmaWVkIGxpc3Qgb2YgYWxsb2NhIGluc3RydWN0aW9ucyBpbnRvIHNjYWxhcgorLy8vIHJlZ2lzdGVycywgaW5zZXJ0aW5nIFBISSBub2RlcyBhcyBhcHByb3ByaWF0ZS4KKy8vLworLy8vIFRoaXMgZnVuY3Rpb24gbWFrZXMgdXNlIG9mIERvbWluYW5jZUZyb250aWVyIGluZm9ybWF0aW9uLiAgVGhpcyBmdW5jdGlvbgorLy8vIGRvZXMgbm90IG1vZGlmeSB0aGUgQ0ZHIG9mIHRoZSBmdW5jdGlvbiBhdCBhbGwuICBBbGwgYWxsb2NhcyBtdXN0IGJlIGZyb20KKy8vLyB0aGUgc2FtZSBmdW5jdGlvbi4KKy8vLwordm9pZCBQcm9tb3RlTWVtVG9SZWcoQXJyYXlSZWY8QWxsb2NhSW5zdCAqPiBBbGxvY2FzLCBEb21pbmF0b3JUcmVlICZEVCwKKyAgICAgICAgICAgICAgICAgICAgIEFzc3VtcHRpb25DYWNoZSAqQUMgPSBudWxscHRyKTsKKworfSAvLyBFbmQgbGx2bSBuYW1lc3BhY2UKKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvU1NBVXBkYXRlci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1NTQVVwZGF0ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Y2Q5ZjE1Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1NTQVVwZGF0ZXIuaApAQCAtMCwwICsxLDE3MyBAQAorLy89PT0tIFNTQVVwZGF0ZXIuaCAtIFVuc3RydWN0dXJlZCBTU0EgVXBkYXRlIFRvb2wgLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVjbGFyZXMgdGhlIFNTQVVwZGF0ZXIgY2xhc3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfU1NBVVBEQVRFUl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19TU0FVUERBVEVSX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0FycmF5UmVmLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSA8c3RyaW5nPgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIExvYWRJbnN0OworY2xhc3MgUEhJTm9kZTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBTbWFsbFZlY3RvckltcGw7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgU1NBVXBkYXRlclRyYWl0czsKK2NsYXNzIFR5cGU7CitjbGFzcyBVc2U7CitjbGFzcyBWYWx1ZTsKKworLy8vIFxicmllZiBIZWxwZXIgY2xhc3MgZm9yIFNTQSBmb3JtYXRpb24gb24gYSBzZXQgb2YgdmFsdWVzIGRlZmluZWQgaW4KKy8vLyBtdWx0aXBsZSBibG9ja3MuCisvLy8KKy8vLyBUaGlzIGlzIHVzZWQgd2hlbiBjb2RlIGR1cGxpY2F0aW9uIG9yIGFub3RoZXIgdW5zdHJ1Y3R1cmVkCisvLy8gdHJhbnNmb3JtYXRpb24gd2FudHMgdG8gcmV3cml0ZSBhIHNldCBvZiB1c2VzIG9mIG9uZSB2YWx1ZSB3aXRoIHVzZXMgb2YgYQorLy8vIHNldCBvZiB2YWx1ZXMuCitjbGFzcyBTU0FVcGRhdGVyIHsKKyAgZnJpZW5kIGNsYXNzIFNTQVVwZGF0ZXJUcmFpdHM8U1NBVXBkYXRlcj47CisKK3ByaXZhdGU6CisgIC8vLyBUaGlzIGtlZXBzIHRyYWNrIG9mIHdoaWNoIHZhbHVlIHRvIHVzZSBvbiBhIHBlci1ibG9jayBiYXNpcy4gV2hlbiB3ZQorICAvLy8gaW5zZXJ0IFBISSBub2Rlcywgd2Uga2VlcCB0cmFjayBvZiB0aGVtIGhlcmUuCisgIHZvaWQgKkFWID0gbnVsbHB0cjsKKworICAvLy8gUHJvdG9UeXBlIGhvbGRzIHRoZSB0eXBlIG9mIHRoZSB2YWx1ZXMgYmVpbmcgcmV3cml0dGVuLgorICBUeXBlICpQcm90b1R5cGUgPSBudWxscHRyOworCisgIC8vLyBQSEkgbm9kZXMgYXJlIGdpdmVuIGEgbmFtZSBiYXNlZCBvbiBQcm90b05hbWUuCisgIHN0ZDo6c3RyaW5nIFByb3RvTmFtZTsKKworICAvLy8gSWYgdGhpcyBpcyBub24tbnVsbCwgdGhlIFNTQVVwZGF0ZXIgYWRkcyBhbGwgUEhJIG5vZGVzIHRoYXQgaXQgY3JlYXRlcyB0bworICAvLy8gdGhlIHZlY3Rvci4KKyAgU21hbGxWZWN0b3JJbXBsPFBISU5vZGUgKj4gKkluc2VydGVkUEhJczsKKworcHVibGljOgorICAvLy8gSWYgSW5zZXJ0ZWRQSElzIGlzIHNwZWNpZmllZCwgaXQgd2lsbCBiZSBmaWxsZWQKKyAgLy8vIGluIHdpdGggYWxsIFBISSBOb2RlcyBjcmVhdGVkIGJ5IHJld3JpdGluZy4KKyAgZXhwbGljaXQgU1NBVXBkYXRlcihTbWFsbFZlY3RvckltcGw8UEhJTm9kZSAqPiAqSW5zZXJ0ZWRQSElzID0gbnVsbHB0cik7CisgIFNTQVVwZGF0ZXIoY29uc3QgU1NBVXBkYXRlciAmKSA9IGRlbGV0ZTsKKyAgU1NBVXBkYXRlciAmb3BlcmF0b3I9KGNvbnN0IFNTQVVwZGF0ZXIgJikgPSBkZWxldGU7CisgIH5TU0FVcGRhdGVyKCk7CisKKyAgLy8vIFxicmllZiBSZXNldCB0aGlzIG9iamVjdCB0byBnZXQgcmVhZHkgZm9yIGEgbmV3IHNldCBvZiBTU0EgdXBkYXRlcyB3aXRoCisgIC8vLyB0eXBlICdUeScuCisgIC8vLworICAvLy8gUEhJIG5vZGVzIGdldCBhIG5hbWUgYmFzZWQgb24gJ05hbWUnLgorICB2b2lkIEluaXRpYWxpemUoVHlwZSAqVHksIFN0cmluZ1JlZiBOYW1lKTsKKworICAvLy8gXGJyaWVmIEluZGljYXRlIHRoYXQgYSByZXdyaXR0ZW4gdmFsdWUgaXMgYXZhaWxhYmxlIGluIHRoZSBzcGVjaWZpZWQgYmxvY2sKKyAgLy8vIHdpdGggdGhlIHNwZWNpZmllZCB2YWx1ZS4KKyAgdm9pZCBBZGRBdmFpbGFibGVWYWx1ZShCYXNpY0Jsb2NrICpCQiwgVmFsdWUgKlYpOworCisgIC8vLyBcYnJpZWYgUmV0dXJuIHRydWUgaWYgdGhlIFNTQVVwZGF0ZXIgYWxyZWFkeSBoYXMgYSB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gYmxvY2suCisgIGJvb2wgSGFzVmFsdWVGb3JCbG9jayhCYXNpY0Jsb2NrICpCQikgY29uc3Q7CisKKyAgLy8vIFxicmllZiBDb25zdHJ1Y3QgU1NBIGZvcm0sIG1hdGVyaWFsaXppbmcgYSB2YWx1ZSB0aGF0IGlzIGxpdmUgYXQgdGhlIGVuZAorICAvLy8gb2YgdGhlIHNwZWNpZmllZCBibG9jay4KKyAgVmFsdWUgKkdldFZhbHVlQXRFbmRPZkJsb2NrKEJhc2ljQmxvY2sgKkJCKTsKKworICAvLy8gXGJyaWVmIENvbnN0cnVjdCBTU0EgZm9ybSwgbWF0ZXJpYWxpemluZyBhIHZhbHVlIHRoYXQgaXMgbGl2ZSBpbiB0aGUKKyAgLy8vIG1pZGRsZSBvZiB0aGUgc3BlY2lmaWVkIGJsb2NrLgorICAvLy8KKyAgLy8vIFxjIEdldFZhbHVlSW5NaWRkbGVPZkJsb2NrIGlzIHRoZSBzYW1lIGFzIFxjIEdldFZhbHVlQXRFbmRPZkJsb2NrIGV4Y2VwdAorICAvLy8gaW4gb25lIGltcG9ydGFudCBjYXNlOiBpZiB0aGVyZSBpcyBhIGRlZmluaXRpb24gb2YgdGhlIHJld3JpdHRlbiB2YWx1ZQorICAvLy8gYWZ0ZXIgdGhlICd1c2UnIGluIEJCLiAgQ29uc2lkZXIgY29kZSBsaWtlIHRoaXM6CisgIC8vLworICAvLy8gXGNvZGUKKyAgLy8vICAgICAgWDEgPSAuLi4KKyAgLy8vICAgU29tZUJCOgorICAvLy8gICAgICB1c2UoWCkKKyAgLy8vICAgICAgWDIgPSAuLi4KKyAgLy8vICAgICAgYnIgQ29uZCwgU29tZUJCLCBPdXRCQgorICAvLy8gXGVuZGNvZGUKKyAgLy8vCisgIC8vLyBJbiB0aGlzIGNhc2UsIHRoZXJlIGFyZSB0d28gdmFsdWVzIChYMSBhbmQgWDIpIGFkZGVkIHRvIHRoZSBBdmFpbGFibGVWYWxzCisgIC8vLyBzZXQgYnkgdGhlIGNsaWVudCBvZiB0aGUgcmV3cml0ZXIsIGFuZCB0aG9zZSB2YWx1ZXMgYXJlIGJvdGggbGl2ZSBvdXQgb2YKKyAgLy8vIHRoZWlyIHJlc3BlY3RpdmUgYmxvY2tzLiAgSG93ZXZlciwgdGhlIHVzZSBvZiBYIGhhcHBlbnMgaW4gdGhlICptaWRkbGUqIG9mCisgIC8vLyBhIGJsb2NrLiAgQmVjYXVzZSBvZiB0aGlzLCB3ZSBuZWVkIHRvIGluc2VydCBhIG5ldyBQSEkgbm9kZSBpbiBTb21lQkIgdG8KKyAgLy8vIG1lcmdlIHRoZSBhcHByb3ByaWF0ZSB2YWx1ZXMsIGFuZCB0aGlzIHZhbHVlIGlzbid0IGxpdmUgb3V0IG9mIHRoZSBibG9jay4KKyAgVmFsdWUgKkdldFZhbHVlSW5NaWRkbGVPZkJsb2NrKEJhc2ljQmxvY2sgKkJCKTsKKworICAvLy8gXGJyaWVmIFJld3JpdGUgYSB1c2Ugb2YgdGhlIHN5bWJvbGljIHZhbHVlLgorICAvLy8KKyAgLy8vIFRoaXMgaGFuZGxlcyBQSEkgbm9kZXMsIHdoaWNoIHVzZSB0aGVpciB2YWx1ZSBpbiB0aGUgY29ycmVzcG9uZGluZworICAvLy8gcHJlZGVjZXNzb3IuIE5vdGUgdGhhdCB0aGlzIHdpbGwgbm90IHdvcmsgaWYgdGhlIHVzZSBpcyBzdXBwb3NlZCB0byBiZQorICAvLy8gcmV3cml0dGVuIHRvIGEgdmFsdWUgZGVmaW5lZCBpbiB0aGUgc2FtZSBibG9jayBhcyB0aGUgdXNlLCBidXQgYWJvdmUgaXQuCisgIC8vLyBBbnkgJ0FkZEF2YWlsYWJsZVZhbHVlJ3MgYWRkZWQgZm9yIHRoZSB1c2UncyBibG9jayB3aWxsIGJlIGNvbnNpZGVyZWQgdG8KKyAgLy8vIGJlIGJlbG93IGl0LgorICB2b2lkIFJld3JpdGVVc2UoVXNlICZVKTsKKworICAvLy8gXGJyaWVmIFJld3JpdGUgYSB1c2UgbGlrZSBcYyBSZXdyaXRlVXNlIGJ1dCBoYW5kbGluZyBpbi1ibG9jayBkZWZpbml0aW9ucy4KKyAgLy8vCisgIC8vLyBUaGlzIHZlcnNpb24gb2YgdGhlIG1ldGhvZCBjYW4gcmV3cml0ZSB1c2VzIGluIHRoZSBzYW1lIGJsb2NrIGFzCisgIC8vLyBhIGRlZmluaXRpb24sIGJlY2F1c2UgaXQgYXNzdW1lcyB0aGF0IGFsbCB1c2VzIG9mIGEgdmFsdWUgYXJlIGJlbG93IGFueQorICAvLy8gaW5zZXJ0ZWQgdmFsdWVzLgorICB2b2lkIFJld3JpdGVVc2VBZnRlckluc2VydGlvbnMoVXNlICZVKTsKKworcHJpdmF0ZToKKyAgVmFsdWUgKkdldFZhbHVlQXRFbmRPZkJsb2NrSW50ZXJuYWwoQmFzaWNCbG9jayAqQkIpOworfTsKKworLy8vIFxicmllZiBIZWxwZXIgY2xhc3MgZm9yIHByb21vdGluZyBhIGNvbGxlY3Rpb24gb2YgbG9hZHMgYW5kIHN0b3JlcyBpbnRvIFNTQQorLy8vIEZvcm0gdXNpbmcgdGhlIFNTQVVwZGF0ZXIuCisvLy8KKy8vLyBUaGlzIGhhbmRsZXMgY29tcGxleGl0aWVzIHRoYXQgU1NBVXBkYXRlciBkb2Vzbid0LCBzdWNoIGFzIG11bHRpcGxlIGxvYWRzCisvLy8gYW5kIHN0b3JlcyBpbiBvbmUgYmxvY2suCisvLy8KKy8vLyBDbGllbnRzIG9mIHRoaXMgY2xhc3MgYXJlIGV4cGVjdGVkIHRvIHN1YmNsYXNzIHRoaXMgYW5kIGltcGxlbWVudCB0aGUKKy8vLyB2aXJ0dWFsIG1ldGhvZHMuCitjbGFzcyBMb2FkQW5kU3RvcmVQcm9tb3RlciB7Citwcm90ZWN0ZWQ6CisgIFNTQVVwZGF0ZXIgJlNTQTsKKworcHVibGljOgorICBMb2FkQW5kU3RvcmVQcm9tb3RlcihBcnJheVJlZjxjb25zdCBJbnN0cnVjdGlvbiAqPiBJbnN0cywKKyAgICAgICAgICAgICAgICAgICAgICAgU1NBVXBkYXRlciAmUywgU3RyaW5nUmVmIE5hbWUgPSBTdHJpbmdSZWYoKSk7CisgIHZpcnR1YWwgfkxvYWRBbmRTdG9yZVByb21vdGVyKCkgPSBkZWZhdWx0OworCisgIC8vLyBcYnJpZWYgVGhpcyBkb2VzIHRoZSBwcm9tb3Rpb24uCisgIC8vLworICAvLy8gSW5zdHMgaXMgYSBsaXN0IG9mIGxvYWRzIGFuZCBzdG9yZXMgdG8gcHJvbW90ZSwgYW5kIE5hbWUgaXMgdGhlIGJhc2VuYW1lCisgIC8vLyBmb3IgdGhlIFBISXMgdG8gaW5zZXJ0LiBBZnRlciB0aGlzIGlzIGNvbXBsZXRlLCB0aGUgbG9hZHMgYW5kIHN0b3JlcyBhcmUKKyAgLy8vIHJlbW92ZWQgZnJvbSB0aGUgY29kZS4KKyAgdm9pZCBydW4oY29uc3QgU21hbGxWZWN0b3JJbXBsPEluc3RydWN0aW9uICo+ICZJbnN0cykgY29uc3Q7CisKKyAgLy8vIFxicmllZiBSZXR1cm4gdHJ1ZSBpZiB0aGUgc3BlY2lmaWVkIGluc3RydWN0aW9uIGlzIGluIHRoZSBJbnN0IGxpc3QuCisgIC8vLworICAvLy8gVGhlIEluc3RzIGxpc3QgaXMgdGhlIG9uZSBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3IuIENsaWVudHMgc2hvdWxkCisgIC8vLyBpbXBsZW1lbnQgdGhpcyB3aXRoIGEgbW9yZSBlZmZpY2llbnQgdmVyc2lvbiBpZiBwb3NzaWJsZS4KKyAgdmlydHVhbCBib29sIGlzSW5zdEluTGlzdChJbnN0cnVjdGlvbiAqSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTbWFsbFZlY3RvckltcGw8SW5zdHJ1Y3Rpb24gKj4gJkluc3RzKSBjb25zdDsKKworICAvLy8gXGJyaWVmIFRoaXMgaG9vayBpcyBpbnZva2VkIGFmdGVyIGFsbCB0aGUgc3RvcmVzIGFyZSBmb3VuZCBhbmQgaW5zZXJ0ZWQgYXMKKyAgLy8vIGF2YWlsYWJsZSB2YWx1ZXMuCisgIHZpcnR1YWwgdm9pZCBkb0V4dHJhUmV3cml0ZXNCZWZvcmVGaW5hbERlbGV0aW9uKCkgY29uc3Qge30KKworICAvLy8gXGJyaWVmIENsaWVudHMgY2FuIGNob29zZSB0byBpbXBsZW1lbnQgdGhpcyB0byBnZXQgbm90aWZpZWQgcmlnaHQgYmVmb3JlCisgIC8vLyBhIGxvYWQgaXMgUkFVVydkIGFub3RoZXIgdmFsdWUuCisgIHZpcnR1YWwgdm9pZCByZXBsYWNlTG9hZFdpdGhWYWx1ZShMb2FkSW5zdCAqTEksIFZhbHVlICpWKSBjb25zdCB7fQorCisgIC8vLyBcYnJpZWYgQ2FsbGVkIGJlZm9yZSBlYWNoIGluc3RydWN0aW9uIGlzIGRlbGV0ZWQuCisgIHZpcnR1YWwgdm9pZCBpbnN0cnVjdGlvbkRlbGV0ZWQoSW5zdHJ1Y3Rpb24gKkkpIGNvbnN0IHt9CisKKyAgLy8vIFxicmllZiBDYWxsZWQgdG8gdXBkYXRlIGRlYnVnIGluZm8gYXNzb2NpYXRlZCB3aXRoIHRoZSBpbnN0cnVjdGlvbi4KKyAgdmlydHVhbCB2b2lkIHVwZGF0ZURlYnVnSW5mbyhJbnN0cnVjdGlvbiAqSSkgY29uc3Qge30KK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfU1NBVVBEQVRFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvU1NBVXBkYXRlckltcGwuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9TU0FVcGRhdGVySW1wbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOGJkMTcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvU1NBVXBkYXRlckltcGwuaApAQCAtMCwwICsxLDQ2OSBAQAorLy89PT0tIFNTQVVwZGF0ZXJJbXBsLmggLSBTU0EgVXBkYXRlciBJbXBsZW1lbnRhdGlvbiAtLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgYSB0ZW1wbGF0ZSB0aGF0IGltcGxlbWVudHMgdGhlIGNvcmUgYWxnb3JpdGhtIGZvciB0aGUKKy8vIFNTQVVwZGF0ZXIgYW5kIE1hY2hpbmVTU0FVcGRhdGVyLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1NTQVVQREFURVJJTVBMX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1NTQVVQREFURVJJTVBMX0gKKworI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvQWxsb2NhdG9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0RlYnVnLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKKyNkZWZpbmUgREVCVUdfVFlQRSAic3NhdXBkYXRlciIKKworbmFtZXNwYWNlIGxsdm0geworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBTU0FVcGRhdGVyVHJhaXRzOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBVcGRhdGVyVD4KK2NsYXNzIFNTQVVwZGF0ZXJJbXBsIHsKK3ByaXZhdGU6CisgIFVwZGF0ZXJUICpVcGRhdGVyOworCisgIHVzaW5nIFRyYWl0cyA9IFNTQVVwZGF0ZXJUcmFpdHM8VXBkYXRlclQ+OworICB1c2luZyBCbGtUID0gdHlwZW5hbWUgVHJhaXRzOjpCbGtUOworICB1c2luZyBWYWxUID0gdHlwZW5hbWUgVHJhaXRzOjpWYWxUOworICB1c2luZyBQaGlUID0gdHlwZW5hbWUgVHJhaXRzOjpQaGlUOworCisgIC8vLyBCQkluZm8gLSBQZXItYmFzaWMgYmxvY2sgaW5mb3JtYXRpb24gdXNlZCBpbnRlcm5hbGx5IGJ5IFNTQVVwZGF0ZXJJbXBsLgorICAvLy8gVGhlIHByZWRlY2Vzc29ycyBvZiBlYWNoIGJsb2NrIGFyZSBjYWNoZWQgaGVyZSBzaW5jZSBwcmVkX2l0ZXJhdG9yIGlzCisgIC8vLyBzbG93IGFuZCB3ZSBuZWVkIHRvIGl0ZXJhdGUgb3ZlciB0aGUgYmxvY2tzIGF0IGxlYXN0IGEgZmV3IHRpbWVzLgorICBjbGFzcyBCQkluZm8geworICBwdWJsaWM6CisgICAgLy8gQmFjay1wb2ludGVyIHRvIHRoZSBjb3JyZXNwb25kaW5nIGJsb2NrLgorICAgIEJsa1QgKkJCOworCisgICAgLy8gVmFsdWUgdG8gdXNlIGluIHRoaXMgYmxvY2suCisgICAgVmFsVCBBdmFpbGFibGVWYWw7CisKKyAgICAvLyBCbG9jayB0aGF0IGRlZmluZXMgdGhlIGF2YWlsYWJsZSB2YWx1ZS4KKyAgICBCQkluZm8gKkRlZkJCOworCisgICAgLy8gUG9zdG9yZGVyIG51bWJlci4KKyAgICBpbnQgQmxrTnVtID0gMDsKKworICAgIC8vIEltbWVkaWF0ZSBkb21pbmF0b3IuCisgICAgQkJJbmZvICpJRG9tID0gbnVsbHB0cjsKKworICAgIC8vIE51bWJlciBvZiBwcmVkZWNlc3NvciBibG9ja3MuCisgICAgdW5zaWduZWQgTnVtUHJlZHMgPSAwOworCisgICAgLy8gQXJyYXlbTnVtUHJlZHNdIG9mIHByZWRlY2Vzc29yIGJsb2Nrcy4KKyAgICBCQkluZm8gKipQcmVkcyA9IG51bGxwdHI7CisKKyAgICAvLyBNYXJrZXIgZm9yIGV4aXN0aW5nIFBISXMgdGhhdCBtYXRjaC4KKyAgICBQaGlUICpQSElUYWcgPSBudWxscHRyOworCisgICAgQkJJbmZvKEJsa1QgKlRoaXNCQiwgVmFsVCBWKQorICAgICAgOiBCQihUaGlzQkIpLCBBdmFpbGFibGVWYWwoViksIERlZkJCKFYgPyB0aGlzIDogbnVsbHB0cikge30KKyAgfTsKKworICB1c2luZyBBdmFpbGFibGVWYWxzVHkgPSBEZW5zZU1hcDxCbGtUICosIFZhbFQ+OworCisgIEF2YWlsYWJsZVZhbHNUeSAqQXZhaWxhYmxlVmFsczsKKworICBTbWFsbFZlY3RvckltcGw8UGhpVCAqPiAqSW5zZXJ0ZWRQSElzOworCisgIHVzaW5nIEJsb2NrTGlzdFR5ID0gU21hbGxWZWN0b3JJbXBsPEJCSW5mbyAqPjsKKyAgdXNpbmcgQkJNYXBUeSA9IERlbnNlTWFwPEJsa1QgKiwgQkJJbmZvICo+OworCisgIEJCTWFwVHkgQkJNYXA7CisgIEJ1bXBQdHJBbGxvY2F0b3IgQWxsb2NhdG9yOworCitwdWJsaWM6CisgIGV4cGxpY2l0IFNTQVVwZGF0ZXJJbXBsKFVwZGF0ZXJUICpVLCBBdmFpbGFibGVWYWxzVHkgKkEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxQaGlUICo+ICpJbnMpIDoKKyAgICBVcGRhdGVyKFUpLCBBdmFpbGFibGVWYWxzKEEpLCBJbnNlcnRlZFBISXMoSW5zKSB7fQorCisgIC8vLyBHZXRWYWx1ZSAtIENoZWNrIHRvIHNlZSBpZiBBdmFpbGFibGVWYWxzIGhhcyBhbiBlbnRyeSBmb3IgdGhlIHNwZWNpZmllZAorICAvLy8gQkIgYW5kIGlmIHNvLCByZXR1cm4gaXQuICBJZiBub3QsIGNvbnN0cnVjdCBTU0EgZm9ybSBieSBmaXJzdAorICAvLy8gY2FsY3VsYXRpbmcgdGhlIHJlcXVpcmVkIHBsYWNlbWVudCBvZiBQSElzIGFuZCB0aGVuIGluc2VydGluZyBuZXcgUEhJcworICAvLy8gd2hlcmUgbmVlZGVkLgorICBWYWxUIEdldFZhbHVlKEJsa1QgKkJCKSB7CisgICAgU21hbGxWZWN0b3I8QkJJbmZvICosIDEwMD4gQmxvY2tMaXN0OworICAgIEJCSW5mbyAqUHNldWRvRW50cnkgPSBCdWlsZEJsb2NrTGlzdChCQiwgJkJsb2NrTGlzdCk7CisKKyAgICAvLyBTcGVjaWFsIGNhc2U6IGJhaWwgb3V0IGlmIEJCIGlzIHVucmVhY2hhYmxlLgorICAgIGlmIChCbG9ja0xpc3Quc2l6ZSgpID09IDApIHsKKyAgICAgIFZhbFQgViA9IFRyYWl0czo6R2V0VW5kZWZWYWwoQkIsIFVwZGF0ZXIpOworICAgICAgKCpBdmFpbGFibGVWYWxzKVtCQl0gPSBWOworICAgICAgcmV0dXJuIFY7CisgICAgfQorCisgICAgRmluZERvbWluYXRvcnMoJkJsb2NrTGlzdCwgUHNldWRvRW50cnkpOworICAgIEZpbmRQSElQbGFjZW1lbnQoJkJsb2NrTGlzdCk7CisgICAgRmluZEF2YWlsYWJsZVZhbHMoJkJsb2NrTGlzdCk7CisKKyAgICByZXR1cm4gQkJNYXBbQkJdLT5EZWZCQi0+QXZhaWxhYmxlVmFsOworICB9CisKKyAgLy8vIEJ1aWxkQmxvY2tMaXN0IC0gU3RhcnRpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIGJhc2ljIGJsb2NrLCB0cmF2ZXJzZSBiYWNrCisgIC8vLyB0aHJvdWdoIGl0cyBwcmVkZWNlc3NvcnMgdW50aWwgcmVhY2hpbmcgYmxvY2tzIHdpdGgga25vd24gdmFsdWVzLgorICAvLy8gQ3JlYXRlIEJCSW5mbyBzdHJ1Y3R1cmVzIGZvciB0aGUgYmxvY2tzIGFuZCBhcHBlbmQgdGhlbSB0byB0aGUgYmxvY2sKKyAgLy8vIGxpc3QuCisgIEJCSW5mbyAqQnVpbGRCbG9ja0xpc3QoQmxrVCAqQkIsIEJsb2NrTGlzdFR5ICpCbG9ja0xpc3QpIHsKKyAgICBTbWFsbFZlY3RvcjxCQkluZm8gKiwgMTA+IFJvb3RMaXN0OworICAgIFNtYWxsVmVjdG9yPEJCSW5mbyAqLCA2ND4gV29ya0xpc3Q7CisKKyAgICBCQkluZm8gKkluZm8gPSBuZXcgKEFsbG9jYXRvcikgQkJJbmZvKEJCLCAwKTsKKyAgICBCQk1hcFtCQl0gPSBJbmZvOworICAgIFdvcmtMaXN0LnB1c2hfYmFjayhJbmZvKTsKKworICAgIC8vIFNlYXJjaCBiYWNrd2FyZCBmcm9tIEJCLCBjcmVhdGluZyBCQkluZm9zIGFsb25nIHRoZSB3YXkgYW5kIHN0b3BwaW5nCisgICAgLy8gd2hlbiByZWFjaGluZyBibG9ja3MgdGhhdCBkZWZpbmUgdGhlIHZhbHVlLiAgUmVjb3JkIHRob3NlIGRlZmluaW5nCisgICAgLy8gYmxvY2tzIG9uIHRoZSBSb290TGlzdC4KKyAgICBTbWFsbFZlY3RvcjxCbGtUICosIDEwPiBQcmVkczsKKyAgICB3aGlsZSAoIVdvcmtMaXN0LmVtcHR5KCkpIHsKKyAgICAgIEluZm8gPSBXb3JrTGlzdC5wb3BfYmFja192YWwoKTsKKyAgICAgIFByZWRzLmNsZWFyKCk7CisgICAgICBUcmFpdHM6OkZpbmRQcmVkZWNlc3NvckJsb2NrcyhJbmZvLT5CQiwgJlByZWRzKTsKKyAgICAgIEluZm8tPk51bVByZWRzID0gUHJlZHMuc2l6ZSgpOworICAgICAgaWYgKEluZm8tPk51bVByZWRzID09IDApCisgICAgICAgIEluZm8tPlByZWRzID0gbnVsbHB0cjsKKyAgICAgIGVsc2UKKyAgICAgICAgSW5mby0+UHJlZHMgPSBzdGF0aWNfY2FzdDxCQkluZm8gKio+KEFsbG9jYXRvci5BbGxvY2F0ZSgKKyAgICAgICAgICAgIEluZm8tPk51bVByZWRzICogc2l6ZW9mKEJCSW5mbyAqKSwgYWxpZ25vZihCQkluZm8gKikpKTsKKworICAgICAgZm9yICh1bnNpZ25lZCBwID0gMDsgcCAhPSBJbmZvLT5OdW1QcmVkczsgKytwKSB7CisgICAgICAgIEJsa1QgKlByZWQgPSBQcmVkc1twXTsKKyAgICAgICAgLy8gQ2hlY2sgaWYgQkJNYXAgYWxyZWFkeSBoYXMgYSBCQkluZm8gZm9yIHRoZSBwcmVkZWNlc3NvciBibG9jay4KKyAgICAgICAgdHlwZW5hbWUgQkJNYXBUeTo6dmFsdWVfdHlwZSAmQkJNYXBCdWNrZXQgPQorICAgICAgICAgIEJCTWFwLkZpbmRBbmRDb25zdHJ1Y3QoUHJlZCk7CisgICAgICAgIGlmIChCQk1hcEJ1Y2tldC5zZWNvbmQpIHsKKyAgICAgICAgICBJbmZvLT5QcmVkc1twXSA9IEJCTWFwQnVja2V0LnNlY29uZDsKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBCQkluZm8gZm9yIHRoZSBwcmVkZWNlc3Nvci4KKyAgICAgICAgVmFsVCBQcmVkVmFsID0gQXZhaWxhYmxlVmFscy0+bG9va3VwKFByZWQpOworICAgICAgICBCQkluZm8gKlByZWRJbmZvID0gbmV3IChBbGxvY2F0b3IpIEJCSW5mbyhQcmVkLCBQcmVkVmFsKTsKKyAgICAgICAgQkJNYXBCdWNrZXQuc2Vjb25kID0gUHJlZEluZm87CisgICAgICAgIEluZm8tPlByZWRzW3BdID0gUHJlZEluZm87CisKKyAgICAgICAgaWYgKFByZWRJbmZvLT5BdmFpbGFibGVWYWwpIHsKKyAgICAgICAgICBSb290TGlzdC5wdXNoX2JhY2soUHJlZEluZm8pOworICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIFdvcmtMaXN0LnB1c2hfYmFjayhQcmVkSW5mbyk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gTm93IHRoYXQgd2Uga25vdyB3aGF0IGJsb2NrcyBhcmUgYmFja3dhcmRzLXJlYWNoYWJsZSBmcm9tIHRoZSBzdGFydGluZworICAgIC8vIGJsb2NrLCBkbyBhIGZvcndhcmQgZGVwdGgtZmlyc3QgdHJhdmVyc2FsIHRvIGFzc2lnbiBwb3N0b3JkZXIgbnVtYmVycworICAgIC8vIHRvIHRob3NlIGJsb2Nrcy4KKyAgICBCQkluZm8gKlBzZXVkb0VudHJ5ID0gbmV3IChBbGxvY2F0b3IpIEJCSW5mbyhudWxscHRyLCAwKTsKKyAgICB1bnNpZ25lZCBCbGtOdW0gPSAxOworCisgICAgLy8gSW5pdGlhbGl6ZSB0aGUgd29ya2xpc3Qgd2l0aCB0aGUgcm9vdHMgZnJvbSB0aGUgYmFja3dhcmQgdHJhdmVyc2FsLgorICAgIHdoaWxlICghUm9vdExpc3QuZW1wdHkoKSkgeworICAgICAgSW5mbyA9IFJvb3RMaXN0LnBvcF9iYWNrX3ZhbCgpOworICAgICAgSW5mby0+SURvbSA9IFBzZXVkb0VudHJ5OworICAgICAgSW5mby0+QmxrTnVtID0gLTE7CisgICAgICBXb3JrTGlzdC5wdXNoX2JhY2soSW5mbyk7CisgICAgfQorCisgICAgd2hpbGUgKCFXb3JrTGlzdC5lbXB0eSgpKSB7CisgICAgICBJbmZvID0gV29ya0xpc3QuYmFjaygpOworCisgICAgICBpZiAoSW5mby0+QmxrTnVtID09IC0yKSB7CisgICAgICAgIC8vIEFsbCB0aGUgc3VjY2Vzc29ycyBoYXZlIGJlZW4gaGFuZGxlZDsgYXNzaWduIHRoZSBwb3N0b3JkZXIgbnVtYmVyLgorICAgICAgICBJbmZvLT5CbGtOdW0gPSBCbGtOdW0rKzsKKyAgICAgICAgLy8gSWYgbm90IGEgcm9vdCwgcHV0IGl0IG9uIHRoZSBCbG9ja0xpc3QuCisgICAgICAgIGlmICghSW5mby0+QXZhaWxhYmxlVmFsKQorICAgICAgICAgIEJsb2NrTGlzdC0+cHVzaF9iYWNrKEluZm8pOworICAgICAgICBXb3JrTGlzdC5wb3BfYmFjaygpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKworICAgICAgLy8gTGVhdmUgdGhpcyBlbnRyeSBvbiB0aGUgd29ya2xpc3QsIGJ1dCBzZXQgaXRzIEJsa051bSB0byBtYXJrIHRoYXQgaXRzCisgICAgICAvLyBzdWNjZXNzb3JzIGhhdmUgYmVlbiBwdXQgb24gdGhlIHdvcmtsaXN0LiAgV2hlbiBpdCByZXR1cm5zIHRvIHRoZSB0b3AKKyAgICAgIC8vIHRoZSBsaXN0LCBhZnRlciBoYW5kbGluZyBpdHMgc3VjY2Vzc29ycywgaXQgd2lsbCBiZSBhc3NpZ25lZCBhCisgICAgICAvLyBudW1iZXIuCisgICAgICBJbmZvLT5CbGtOdW0gPSAtMjsKKworICAgICAgLy8gQWRkIHVudmlzaXRlZCBzdWNjZXNzb3JzIHRvIHRoZSB3b3JrIGxpc3QuCisgICAgICBmb3IgKHR5cGVuYW1lIFRyYWl0czo6QmxrU3VjY19pdGVyYXRvciBTSSA9CisgICAgICAgICAgICAgVHJhaXRzOjpCbGtTdWNjX2JlZ2luKEluZm8tPkJCKSwKKyAgICAgICAgICAgICBFID0gVHJhaXRzOjpCbGtTdWNjX2VuZChJbmZvLT5CQik7IFNJICE9IEU7ICsrU0kpIHsKKyAgICAgICAgQkJJbmZvICpTdWNjSW5mbyA9IEJCTWFwWypTSV07CisgICAgICAgIGlmICghU3VjY0luZm8gfHwgU3VjY0luZm8tPkJsa051bSkKKyAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgU3VjY0luZm8tPkJsa051bSA9IC0xOworICAgICAgICBXb3JrTGlzdC5wdXNoX2JhY2soU3VjY0luZm8pOworICAgICAgfQorICAgIH0KKyAgICBQc2V1ZG9FbnRyeS0+QmxrTnVtID0gQmxrTnVtOworICAgIHJldHVybiBQc2V1ZG9FbnRyeTsKKyAgfQorCisgIC8vLyBJbnRlcnNlY3REb21pbmF0b3JzIC0gVGhpcyBpcyB0aGUgZGF0YWZsb3cgbGF0dGljZSAibWVldCIgb3BlcmF0aW9uIGZvcgorICAvLy8gZmluZGluZyBkb21pbmF0b3JzLiAgR2l2ZW4gdHdvIGJhc2ljIGJsb2NrcywgaXQgd2Fsa3MgdXAgdGhlIGRvbWluYXRvcgorICAvLy8gdHJlZSB1bnRpbCBpdCBmaW5kcyBhIGNvbW1vbiBkb21pbmF0b3Igb2YgYm90aC4gIEl0IHVzZXMgdGhlIHBvc3RvcmRlcgorICAvLy8gbnVtYmVyIG9mIHRoZSBibG9ja3MgdG8gZGV0ZXJtaW5lIGhvdyB0byBkbyB0aGF0LgorICBCQkluZm8gKkludGVyc2VjdERvbWluYXRvcnMoQkJJbmZvICpCbGsxLCBCQkluZm8gKkJsazIpIHsKKyAgICB3aGlsZSAoQmxrMSAhPSBCbGsyKSB7CisgICAgICB3aGlsZSAoQmxrMS0+QmxrTnVtIDwgQmxrMi0+QmxrTnVtKSB7CisgICAgICAgIEJsazEgPSBCbGsxLT5JRG9tOworICAgICAgICBpZiAoIUJsazEpCisgICAgICAgICAgcmV0dXJuIEJsazI7CisgICAgICB9CisgICAgICB3aGlsZSAoQmxrMi0+QmxrTnVtIDwgQmxrMS0+QmxrTnVtKSB7CisgICAgICAgIEJsazIgPSBCbGsyLT5JRG9tOworICAgICAgICBpZiAoIUJsazIpCisgICAgICAgICAgcmV0dXJuIEJsazE7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBCbGsxOworICB9CisKKyAgLy8vIEZpbmREb21pbmF0b3JzIC0gQ2FsY3VsYXRlIHRoZSBkb21pbmF0b3IgdHJlZSBmb3IgdGhlIHN1YnNldCBvZiB0aGUgQ0ZHCisgIC8vLyBjb3JyZXNwb25kaW5nIHRvIHRoZSBiYXNpYyBibG9ja3Mgb24gdGhlIEJsb2NrTGlzdC4gIFRoaXMgdXNlcyB0aGUKKyAgLy8vIGFsZ29yaXRobSBmcm9tOiAiQSBTaW1wbGUsIEZhc3QgRG9taW5hbmNlIEFsZ29yaXRobSIgYnkgQ29vcGVyLCBIYXJ2ZXkKKyAgLy8vIGFuZCBLZW5uZWR5LCBwdWJsaXNoZWQgaW4gU29mdHdhcmUtLVByYWN0aWNlIGFuZCBFeHBlcmllbmNlLCAyMDAxLAorICAvLy8gNDoxLTEwLiAgQmVjYXVzZSB0aGUgQ0ZHIHN1YnNldCBkb2VzIG5vdCBpbmNsdWRlIGFueSBlZGdlcyBsZWFkaW5nIGludG8KKyAgLy8vIGJsb2NrcyB0aGF0IGRlZmluZSB0aGUgdmFsdWUsIHRoZSByZXN1bHRzIGFyZSBub3QgdGhlIHVzdWFsIGRvbWluYXRvcgorICAvLy8gdHJlZS4gIFRoZSBDRkcgc3Vic2V0IGhhcyBhIHNpbmdsZSBwc2V1ZG8tZW50cnkgbm9kZSB3aXRoIGVkZ2VzIHRvIGEgc2V0CisgIC8vLyBvZiByb290IG5vZGVzIGZvciBibG9ja3MgdGhhdCBkZWZpbmUgdGhlIHZhbHVlLiAgVGhlIGRvbWluYXRvcnMgZm9yIHRoaXMKKyAgLy8vIHN1YnNldCBDRkcgYXJlIG5vdCB0aGUgc3RhbmRhcmQgZG9taW5hdG9ycyBidXQgdGhleSBhcmUgYWRlcXVhdGUgZm9yCisgIC8vLyBwbGFjaW5nIFBISXMgd2l0aGluIHRoZSBzdWJzZXQgQ0ZHLgorICB2b2lkIEZpbmREb21pbmF0b3JzKEJsb2NrTGlzdFR5ICpCbG9ja0xpc3QsIEJCSW5mbyAqUHNldWRvRW50cnkpIHsKKyAgICBib29sIENoYW5nZWQ7CisgICAgZG8geworICAgICAgQ2hhbmdlZCA9IGZhbHNlOworICAgICAgLy8gSXRlcmF0ZSBvdmVyIHRoZSBsaXN0IGluIHJldmVyc2Ugb3JkZXIsIGkuZS4sIGZvcndhcmQgb24gQ0ZHIGVkZ2VzLgorICAgICAgZm9yICh0eXBlbmFtZSBCbG9ja0xpc3RUeTo6cmV2ZXJzZV9pdGVyYXRvciBJID0gQmxvY2tMaXN0LT5yYmVnaW4oKSwKKyAgICAgICAgICAgICBFID0gQmxvY2tMaXN0LT5yZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICAgIEJCSW5mbyAqSW5mbyA9ICpJOworICAgICAgICBCQkluZm8gKk5ld0lEb20gPSBudWxscHRyOworCisgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgYmxvY2sncyBwcmVkZWNlc3NvcnMuCisgICAgICAgIGZvciAodW5zaWduZWQgcCA9IDA7IHAgIT0gSW5mby0+TnVtUHJlZHM7ICsrcCkgeworICAgICAgICAgIEJCSW5mbyAqUHJlZCA9IEluZm8tPlByZWRzW3BdOworCisgICAgICAgICAgLy8gVHJlYXQgYW4gdW5yZWFjaGFibGUgcHJlZGVjZXNzb3IgYXMgYSBkZWZpbml0aW9uIHdpdGggJ3VuZGVmJy4KKyAgICAgICAgICBpZiAoUHJlZC0+QmxrTnVtID09IDApIHsKKyAgICAgICAgICAgIFByZWQtPkF2YWlsYWJsZVZhbCA9IFRyYWl0czo6R2V0VW5kZWZWYWwoUHJlZC0+QkIsIFVwZGF0ZXIpOworICAgICAgICAgICAgKCpBdmFpbGFibGVWYWxzKVtQcmVkLT5CQl0gPSBQcmVkLT5BdmFpbGFibGVWYWw7CisgICAgICAgICAgICBQcmVkLT5EZWZCQiA9IFByZWQ7CisgICAgICAgICAgICBQcmVkLT5CbGtOdW0gPSBQc2V1ZG9FbnRyeS0+QmxrTnVtOworICAgICAgICAgICAgUHNldWRvRW50cnktPkJsa051bSsrOworICAgICAgICAgIH0KKworICAgICAgICAgIGlmICghTmV3SURvbSkKKyAgICAgICAgICAgIE5ld0lEb20gPSBQcmVkOworICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgIE5ld0lEb20gPSBJbnRlcnNlY3REb21pbmF0b3JzKE5ld0lEb20sIFByZWQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIElEb20gdmFsdWUgaGFzIGNoYW5nZWQuCisgICAgICAgIGlmIChOZXdJRG9tICYmIE5ld0lEb20gIT0gSW5mby0+SURvbSkgeworICAgICAgICAgIEluZm8tPklEb20gPSBOZXdJRG9tOworICAgICAgICAgIENoYW5nZWQgPSB0cnVlOworICAgICAgICB9CisgICAgICB9CisgICAgfSB3aGlsZSAoQ2hhbmdlZCk7CisgIH0KKworICAvLy8gSXNEZWZJbkRvbUZyb250aWVyIC0gU2VhcmNoIHVwIHRoZSBkb21pbmF0b3IgdHJlZSBmcm9tIFByZWQgdG8gSURvbSBmb3IKKyAgLy8vIGFueSBibG9ja3MgY29udGFpbmluZyBkZWZpbml0aW9ucyBvZiB0aGUgdmFsdWUuICBJZiBvbmUgaXMgZm91bmQsIHRoZW4KKyAgLy8vIHRoZSBzdWNjZXNzb3Igb2YgUHJlZCBpcyBpbiB0aGUgZG9taW5hbmNlIGZyb250aWVyIGZvciB0aGUgZGVmaW5pdGlvbiwKKyAgLy8vIGFuZCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZS4KKyAgYm9vbCBJc0RlZkluRG9tRnJvbnRpZXIoY29uc3QgQkJJbmZvICpQcmVkLCBjb25zdCBCQkluZm8gKklEb20pIHsKKyAgICBmb3IgKDsgUHJlZCAhPSBJRG9tOyBQcmVkID0gUHJlZC0+SURvbSkgeworICAgICAgaWYgKFByZWQtPkRlZkJCID09IFByZWQpCisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLy8gRmluZFBISVBsYWNlbWVudCAtIFBISXMgYXJlIG5lZWRlZCBpbiB0aGUgaXRlcmF0ZWQgZG9taW5hbmNlIGZyb250aWVycworICAvLy8gb2YgdGhlIGtub3duIGRlZmluaXRpb25zLiAgSXRlcmF0aXZlbHkgYWRkIFBISXMgaW4gdGhlIGRvbSBmcm9udGllcnMKKyAgLy8vIHVudGlsIG5vdGhpbmcgY2hhbmdlcy4gIEFsb25nIHRoZSB3YXksIGtlZXAgdHJhY2sgb2YgdGhlIG5lYXJlc3QKKyAgLy8vIGRvbWluYXRpbmcgZGVmaW5pdGlvbnMgZm9yIG5vbi1QSEkgYmxvY2tzLgorICB2b2lkIEZpbmRQSElQbGFjZW1lbnQoQmxvY2tMaXN0VHkgKkJsb2NrTGlzdCkgeworICAgIGJvb2wgQ2hhbmdlZDsKKyAgICBkbyB7CisgICAgICBDaGFuZ2VkID0gZmFsc2U7CisgICAgICAvLyBJdGVyYXRlIG92ZXIgdGhlIGxpc3QgaW4gcmV2ZXJzZSBvcmRlciwgaS5lLiwgZm9yd2FyZCBvbiBDRkcgZWRnZXMuCisgICAgICBmb3IgKHR5cGVuYW1lIEJsb2NrTGlzdFR5OjpyZXZlcnNlX2l0ZXJhdG9yIEkgPSBCbG9ja0xpc3QtPnJiZWdpbigpLAorICAgICAgICAgICAgIEUgPSBCbG9ja0xpc3QtPnJlbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgICAgQkJJbmZvICpJbmZvID0gKkk7CisKKyAgICAgICAgLy8gSWYgdGhpcyBibG9jayBhbHJlYWR5IG5lZWRzIGEgUEhJLCB0aGVyZSBpcyBub3RoaW5nIHRvIGRvIGhlcmUuCisgICAgICAgIGlmIChJbmZvLT5EZWZCQiA9PSBJbmZvKQorICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIC8vIERlZmF1bHQgdG8gdXNlIHRoZSBzYW1lIGRlZiBhcyB0aGUgaW1tZWRpYXRlIGRvbWluYXRvci4KKyAgICAgICAgQkJJbmZvICpOZXdEZWZCQiA9IEluZm8tPklEb20tPkRlZkJCOworICAgICAgICBmb3IgKHVuc2lnbmVkIHAgPSAwOyBwICE9IEluZm8tPk51bVByZWRzOyArK3ApIHsKKyAgICAgICAgICBpZiAoSXNEZWZJbkRvbUZyb250aWVyKEluZm8tPlByZWRzW3BdLCBJbmZvLT5JRG9tKSkgeworICAgICAgICAgICAgLy8gTmVlZCBhIFBISSBoZXJlLgorICAgICAgICAgICAgTmV3RGVmQkIgPSBJbmZvOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgYW55dGhpbmcgY2hhbmdlZC4KKyAgICAgICAgaWYgKE5ld0RlZkJCICE9IEluZm8tPkRlZkJCKSB7CisgICAgICAgICAgSW5mby0+RGVmQkIgPSBOZXdEZWZCQjsKKyAgICAgICAgICBDaGFuZ2VkID0gdHJ1ZTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gd2hpbGUgKENoYW5nZWQpOworICB9CisKKyAgLy8vIEZpbmRBdmFpbGFibGVWYWwgLSBJZiB0aGlzIGJsb2NrIHJlcXVpcmVzIGEgUEhJLCBmaXJzdCBjaGVjayBpZiBhbgorICAvLy8gZXhpc3RpbmcgUEhJIG1hdGNoZXMgdGhlIFBISSBwbGFjZW1lbnQgYW5kIHJlYWNoaW5nIGRlZmluaXRpb25zIGNvbXB1dGVkCisgIC8vLyBlYXJsaWVyLCBhbmQgaWYgbm90LCBjcmVhdGUgYSBuZXcgUEhJLiAgVmlzaXQgYWxsIHRoZSBibG9jaydzCisgIC8vLyBwcmVkZWNlc3NvcnMgdG8gY2FsY3VsYXRlIHRoZSBhdmFpbGFibGUgdmFsdWUgZm9yIGVhY2ggb25lIGFuZCBmaWxsIGluCisgIC8vLyB0aGUgaW5jb21pbmcgdmFsdWVzIGZvciBhIG5ldyBQSEkuCisgIHZvaWQgRmluZEF2YWlsYWJsZVZhbHMoQmxvY2tMaXN0VHkgKkJsb2NrTGlzdCkgeworICAgIC8vIEdvIHRocm91Z2ggdGhlIHdvcmtsaXN0IGluIGZvcndhcmQgb3JkZXIgKGkuZS4sIGJhY2t3YXJkIHRocm91Z2ggdGhlIENGRykKKyAgICAvLyBhbmQgY2hlY2sgaWYgZXhpc3RpbmcgUEhJcyBjYW4gYmUgdXNlZC4gIElmIG5vdCwgY3JlYXRlIGVtcHR5IFBISXMgd2hlcmUKKyAgICAvLyB0aGV5IGFyZSBuZWVkZWQuCisgICAgZm9yICh0eXBlbmFtZSBCbG9ja0xpc3RUeTo6aXRlcmF0b3IgSSA9IEJsb2NrTGlzdC0+YmVnaW4oKSwKKyAgICAgICAgICAgRSA9IEJsb2NrTGlzdC0+ZW5kKCk7IEkgIT0gRTsgKytJKSB7CisgICAgICBCQkluZm8gKkluZm8gPSAqSTsKKyAgICAgIC8vIENoZWNrIGlmIHRoZXJlIG5lZWRzIHRvIGJlIGEgUEhJIGluIEJCLgorICAgICAgaWYgKEluZm8tPkRlZkJCICE9IEluZm8pCisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAvLyBMb29rIGZvciBhbiBleGlzdGluZyBQSEkuCisgICAgICBGaW5kRXhpc3RpbmdQSEkoSW5mby0+QkIsIEJsb2NrTGlzdCk7CisgICAgICBpZiAoSW5mby0+QXZhaWxhYmxlVmFsKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgVmFsVCBQSEkgPSBUcmFpdHM6OkNyZWF0ZUVtcHR5UEhJKEluZm8tPkJCLCBJbmZvLT5OdW1QcmVkcywgVXBkYXRlcik7CisgICAgICBJbmZvLT5BdmFpbGFibGVWYWwgPSBQSEk7CisgICAgICAoKkF2YWlsYWJsZVZhbHMpW0luZm8tPkJCXSA9IFBISTsKKyAgICB9CisKKyAgICAvLyBOb3cgZ28gYmFjayB0aHJvdWdoIHRoZSB3b3JrbGlzdCBpbiByZXZlcnNlIG9yZGVyIHRvIGZpbGwgaW4gdGhlCisgICAgLy8gYXJndW1lbnRzIGZvciBhbnkgbmV3IFBISXMgYWRkZWQgaW4gdGhlIGZvcndhcmQgdHJhdmVyc2FsLgorICAgIGZvciAodHlwZW5hbWUgQmxvY2tMaXN0VHk6OnJldmVyc2VfaXRlcmF0b3IgSSA9IEJsb2NrTGlzdC0+cmJlZ2luKCksCisgICAgICAgICAgIEUgPSBCbG9ja0xpc3QtPnJlbmQoKTsgSSAhPSBFOyArK0kpIHsKKyAgICAgIEJCSW5mbyAqSW5mbyA9ICpJOworCisgICAgICBpZiAoSW5mby0+RGVmQkIgIT0gSW5mbykgeworICAgICAgICAvLyBSZWNvcmQgdGhlIGF2YWlsYWJsZSB2YWx1ZSBhdCBqb2luIG5vZGVzIHRvIHNwZWVkIHVwIHN1YnNlcXVlbnQKKyAgICAgICAgLy8gdXNlcyBvZiB0aGlzIFNTQVVwZGF0ZXIgZm9yIHRoZSBzYW1lIHZhbHVlLgorICAgICAgICBpZiAoSW5mby0+TnVtUHJlZHMgPiAxKQorICAgICAgICAgICgqQXZhaWxhYmxlVmFscylbSW5mby0+QkJdID0gSW5mby0+RGVmQkItPkF2YWlsYWJsZVZhbDsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisKKyAgICAgIC8vIENoZWNrIGlmIHRoaXMgYmxvY2sgY29udGFpbnMgYSBuZXdseSBhZGRlZCBQSEkuCisgICAgICBQaGlUICpQSEkgPSBUcmFpdHM6OlZhbHVlSXNOZXdQSEkoSW5mby0+QXZhaWxhYmxlVmFsLCBVcGRhdGVyKTsKKyAgICAgIGlmICghUEhJKQorICAgICAgICBjb250aW51ZTsKKworICAgICAgLy8gSXRlcmF0ZSB0aHJvdWdoIHRoZSBibG9jaydzIHByZWRlY2Vzc29ycy4KKyAgICAgIGZvciAodW5zaWduZWQgcCA9IDA7IHAgIT0gSW5mby0+TnVtUHJlZHM7ICsrcCkgeworICAgICAgICBCQkluZm8gKlByZWRJbmZvID0gSW5mby0+UHJlZHNbcF07CisgICAgICAgIEJsa1QgKlByZWQgPSBQcmVkSW5mby0+QkI7CisgICAgICAgIC8vIFNraXAgdG8gdGhlIG5lYXJlc3QgcHJlY2VkaW5nIGRlZmluaXRpb24uCisgICAgICAgIGlmIChQcmVkSW5mby0+RGVmQkIgIT0gUHJlZEluZm8pCisgICAgICAgICAgUHJlZEluZm8gPSBQcmVkSW5mby0+RGVmQkI7CisgICAgICAgIFRyYWl0czo6QWRkUEhJT3BlcmFuZChQSEksIFByZWRJbmZvLT5BdmFpbGFibGVWYWwsIFByZWQpOworICAgICAgfQorCisgICAgICBERUJVRyhkYmdzKCkgPDwgIiAgSW5zZXJ0ZWQgUEhJOiAiIDw8ICpQSEkgPDwgIlxuIik7CisKKyAgICAgIC8vIElmIHRoZSBjbGllbnQgd2FudHMgdG8ga25vdyBhYm91dCBhbGwgbmV3IGluc3RydWN0aW9ucywgdGVsbCBpdC4KKyAgICAgIGlmIChJbnNlcnRlZFBISXMpIEluc2VydGVkUEhJcy0+cHVzaF9iYWNrKFBISSk7CisgICAgfQorICB9CisKKyAgLy8vIEZpbmRFeGlzdGluZ1BISSAtIExvb2sgdGhyb3VnaCB0aGUgUEhJIG5vZGVzIGluIGEgYmxvY2sgdG8gc2VlIGlmIGFueSBvZgorICAvLy8gdGhlbSBtYXRjaCB3aGF0IGlzIG5lZWRlZC4KKyAgdm9pZCBGaW5kRXhpc3RpbmdQSEkoQmxrVCAqQkIsIEJsb2NrTGlzdFR5ICpCbG9ja0xpc3QpIHsKKyAgICBmb3IgKGF1dG8gJlNvbWVQSEkgOiBCQi0+cGhpcygpKSB7CisgICAgICBpZiAoQ2hlY2tJZlBISU1hdGNoZXMoJlNvbWVQSEkpKSB7CisgICAgICAgIFJlY29yZE1hdGNoaW5nUEhJcyhCbG9ja0xpc3QpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8vIE1hdGNoIGZhaWxlZDogY2xlYXIgYWxsIHRoZSBQSElUYWcgdmFsdWVzLgorICAgICAgZm9yICh0eXBlbmFtZSBCbG9ja0xpc3RUeTo6aXRlcmF0b3IgSSA9IEJsb2NrTGlzdC0+YmVnaW4oKSwKKyAgICAgICAgICAgICBFID0gQmxvY2tMaXN0LT5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICAgICgqSSktPlBISVRhZyA9IG51bGxwdHI7CisgICAgfQorICB9CisKKyAgLy8vIENoZWNrSWZQSElNYXRjaGVzIC0gQ2hlY2sgaWYgYSBQSEkgbm9kZSBtYXRjaGVzIHRoZSBwbGFjZW1lbnQgYW5kIHZhbHVlcworICAvLy8gaW4gdGhlIEJCTWFwLgorICBib29sIENoZWNrSWZQSElNYXRjaGVzKFBoaVQgKlBISSkgeworICAgIFNtYWxsVmVjdG9yPFBoaVQgKiwgMjA+IFdvcmtMaXN0OworICAgIFdvcmtMaXN0LnB1c2hfYmFjayhQSEkpOworCisgICAgLy8gTWFyayB0aGF0IHRoZSBibG9jayBjb250YWluaW5nIHRoaXMgUEhJIGhhcyBiZWVuIHZpc2l0ZWQuCisgICAgQkJNYXBbUEhJLT5nZXRQYXJlbnQoKV0tPlBISVRhZyA9IFBISTsKKworICAgIHdoaWxlICghV29ya0xpc3QuZW1wdHkoKSkgeworICAgICAgUEhJID0gV29ya0xpc3QucG9wX2JhY2tfdmFsKCk7CisKKyAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgUEhJJ3MgaW5jb21pbmcgdmFsdWVzLgorICAgICAgZm9yICh0eXBlbmFtZSBUcmFpdHM6OlBISV9pdGVyYXRvciBJID0gVHJhaXRzOjpQSElfYmVnaW4oUEhJKSwKKyAgICAgICAgICAgICBFID0gVHJhaXRzOjpQSElfZW5kKFBISSk7IEkgIT0gRTsgKytJKSB7CisgICAgICAgIFZhbFQgSW5jb21pbmdWYWwgPSBJLmdldEluY29taW5nVmFsdWUoKTsKKyAgICAgICAgQkJJbmZvICpQcmVkSW5mbyA9IEJCTWFwW0kuZ2V0SW5jb21pbmdCbG9jaygpXTsKKyAgICAgICAgLy8gU2tpcCB0byB0aGUgbmVhcmVzdCBwcmVjZWRpbmcgZGVmaW5pdGlvbi4KKyAgICAgICAgaWYgKFByZWRJbmZvLT5EZWZCQiAhPSBQcmVkSW5mbykKKyAgICAgICAgICBQcmVkSW5mbyA9IFByZWRJbmZvLT5EZWZCQjsKKworICAgICAgICAvLyBDaGVjayBpZiBpdCBtYXRjaGVzIHRoZSBleHBlY3RlZCB2YWx1ZS4KKyAgICAgICAgaWYgKFByZWRJbmZvLT5BdmFpbGFibGVWYWwpIHsKKyAgICAgICAgICBpZiAoSW5jb21pbmdWYWwgPT0gUHJlZEluZm8tPkF2YWlsYWJsZVZhbCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSB2YWx1ZSBpcyBhIFBISSBpbiB0aGUgY29ycmVjdCBibG9jay4KKyAgICAgICAgUGhpVCAqSW5jb21pbmdQSElWYWwgPSBUcmFpdHM6OlZhbHVlSXNQSEkoSW5jb21pbmdWYWwsIFVwZGF0ZXIpOworICAgICAgICBpZiAoIUluY29taW5nUEhJVmFsIHx8IEluY29taW5nUEhJVmFsLT5nZXRQYXJlbnQoKSAhPSBQcmVkSW5mby0+QkIpCisgICAgICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgICAgIC8vIElmIHRoaXMgYmxvY2sgaGFzIGFscmVhZHkgYmVlbiB2aXNpdGVkLCBjaGVjayBpZiB0aGlzIFBISSBtYXRjaGVzLgorICAgICAgICBpZiAoUHJlZEluZm8tPlBISVRhZykgeworICAgICAgICAgIGlmIChJbmNvbWluZ1BISVZhbCA9PSBQcmVkSW5mby0+UEhJVGFnKQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIFByZWRJbmZvLT5QSElUYWcgPSBJbmNvbWluZ1BISVZhbDsKKworICAgICAgICBXb3JrTGlzdC5wdXNoX2JhY2soSW5jb21pbmdQSElWYWwpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vLyBSZWNvcmRNYXRjaGluZ1BISXMgLSBGb3IgZWFjaCBQSEkgbm9kZSB0aGF0IG1hdGNoZXMsIHJlY29yZCBpdCBpbiBib3RoCisgIC8vLyB0aGUgQkJNYXAgYW5kIHRoZSBBdmFpbGFibGVWYWxzIG1hcHBpbmcuCisgIHZvaWQgUmVjb3JkTWF0Y2hpbmdQSElzKEJsb2NrTGlzdFR5ICpCbG9ja0xpc3QpIHsKKyAgICBmb3IgKHR5cGVuYW1lIEJsb2NrTGlzdFR5OjppdGVyYXRvciBJID0gQmxvY2tMaXN0LT5iZWdpbigpLAorICAgICAgICAgICBFID0gQmxvY2tMaXN0LT5lbmQoKTsgSSAhPSBFOyArK0kpCisgICAgICBpZiAoUGhpVCAqUEhJID0gKCpJKS0+UEhJVGFnKSB7CisgICAgICAgIEJsa1QgKkJCID0gUEhJLT5nZXRQYXJlbnQoKTsKKyAgICAgICAgVmFsVCBQSElWYWwgPSBUcmFpdHM6OkdldFBISVZhbHVlKFBISSk7CisgICAgICAgICgqQXZhaWxhYmxlVmFscylbQkJdID0gUEhJVmFsOworICAgICAgICBCQk1hcFtCQl0tPkF2YWlsYWJsZVZhbCA9IFBISVZhbDsKKyAgICAgIH0KKyAgfQorfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI3VuZGVmIERFQlVHX1RZUEUgLy8gInNzYXVwZGF0ZXIiCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfU1NBVVBEQVRFUklNUExfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1Nhbml0aXplclN0YXRzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvU2FuaXRpemVyU3RhdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMzZlMzQyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1Nhbml0aXplclN0YXRzLmgKQEAgLTAsMCArMSw1NiBAQAorLy89PT0tIFNhbml0aXplclN0YXRzLmggLSBTYW5pdGl6ZXIgc3RhdGlzdGljcyBnYXRoZXJpbmcgIC0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEZWNsYXJlcyBmdW5jdGlvbnMgYW5kIGRhdGEgc3RydWN0dXJlcyBmb3Igc2FuaXRpemVyIHN0YXRpc3RpY3MgZ2F0aGVyaW5nLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1NBTklUSVpFUlNUQVRTX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1NBTklUSVpFUlNUQVRTX0gKKworI2luY2x1ZGUgImxsdm0vSVIvSVJCdWlsZGVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworLy8gTnVtYmVyIG9mIGJpdHMgaW4gZGF0YSB0aGF0IGFyZSB1c2VkIGZvciB0aGUgc2FuaXRpemVyIGtpbmQuIE5lZWRzIHRvIG1hdGNoCisvLyBfX3Nhbml0aXplcjo6a0tpbmRCaXRzIGluIGNvbXBpbGVyLXJ0L2xpYi9zdGF0cy9zdGF0cy5oCitlbnVtIHsga1Nhbml0aXplclN0YXRLaW5kQml0cyA9IDMgfTsKKworZW51bSBTYW5pdGl6ZXJTdGF0S2luZCB7CisgIFNhblN0YXRfQ0ZJX1ZDYWxsLAorICBTYW5TdGF0X0NGSV9OVkNhbGwsCisgIFNhblN0YXRfQ0ZJX0Rlcml2ZWRDYXN0LAorICBTYW5TdGF0X0NGSV9VbnJlbGF0ZWRDYXN0LAorICBTYW5TdGF0X0NGSV9JQ2FsbCwKK307CisKK3N0cnVjdCBTYW5pdGl6ZXJTdGF0UmVwb3J0IHsKKyAgU2FuaXRpemVyU3RhdFJlcG9ydChNb2R1bGUgKk0pOworCisgIC8vLyBHZW5lcmF0ZXMgY29kZSBpbnRvIEIgdGhhdCBpbmNyZW1lbnRzIGEgbG9jYXRpb24tc3BlY2lmaWMgY291bnRlciB0YWdnZWQKKyAgLy8vIHdpdGggdGhlIGdpdmVuIHNhbml0aXplciBraW5kIFNLLgorICB2b2lkIGNyZWF0ZShJUkJ1aWxkZXI8PiAmQiwgU2FuaXRpemVyU3RhdEtpbmQgU0spOworCisgIC8vLyBGaW5hbGl6ZSBtb2R1bGUgc3RhdHMgYXJyYXkgYW5kIGFkZCBnbG9iYWwgY29uc3RydWN0b3IgdG8gcmVnaXN0ZXIgaXQuCisgIHZvaWQgZmluaXNoKCk7CisKK3ByaXZhdGU6CisgIE1vZHVsZSAqTTsKKyAgR2xvYmFsVmFyaWFibGUgKk1vZHVsZVN0YXRzR1Y7CisgIEFycmF5VHlwZSAqU3RhdFR5OworICBTdHJ1Y3RUeXBlICpFbXB0eU1vZHVsZVN0YXRzVHk7CisKKyAgc3RkOjp2ZWN0b3I8Q29uc3RhbnQgKj4gSW5pdHM7CisgIEFycmF5VHlwZSAqbWFrZU1vZHVsZVN0YXRzQXJyYXlUeSgpOworICBTdHJ1Y3RUeXBlICptYWtlTW9kdWxlU3RhdHNUeSgpOworfTsKKworfQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9TaW1wbGlmeUluZFZhci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1NpbXBsaWZ5SW5kVmFyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFkZmVkMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9TaW1wbGlmeUluZFZhci5oCkBAIC0wLDAgKzEsNjAgQEAKKy8vPT09LS0gbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1NpbXBsaWZ5SW5kVmFyLmggLSBJbmR2YXIgVXRpbHMgLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgaW4gaW50ZXJmYWNlIGZvciBpbmR1Y3Rpb24gdmFyaWFibGUgc2ltcGxpZmljYXRpb24uIEl0IGRvZXMKKy8vIG5vdCBkZWZpbmUgYW55IGFjdHVhbCBwYXNzIG9yIHBvbGljeSwgYnV0IHByb3ZpZGVzIGEgc2luZ2xlIGZ1bmN0aW9uIHRvCisvLyBzaW1wbGlmeSBhIGxvb3AncyBpbmR1Y3Rpb24gdmFyaWFibGVzIGJhc2VkIG9uIFNjYWxhckV2b2x1dGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19TSU1QTElGWUlORFZBUl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19TSU1QTElGWUlORFZBUl9ICisKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlSGFuZGxlLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQ2FzdEluc3Q7CitjbGFzcyBEb21pbmF0b3JUcmVlOworY2xhc3MgTG9vcDsKK2NsYXNzIExvb3BJbmZvOworY2xhc3MgUEhJTm9kZTsKK2NsYXNzIFNjYWxhckV2b2x1dGlvbjsKK2NsYXNzIFNDRVZFeHBhbmRlcjsKKworLy8vIEludGVyZmFjZSBmb3IgdmlzaXRpbmcgaW50ZXJlc3RpbmcgSVYgdXNlcnMgdGhhdCBhcmUgcmVjb2duaXplZCBidXQgbm90CisvLy8gc2ltcGxpZmllZCBieSB0aGlzIHV0aWxpdHkuCitjbGFzcyBJVlZpc2l0b3IgeworcHJvdGVjdGVkOgorICBjb25zdCBEb21pbmF0b3JUcmVlICpEVCA9IG51bGxwdHI7CisKKyAgdmlydHVhbCB2b2lkIGFuY2hvcigpOworCitwdWJsaWM6CisgIElWVmlzaXRvcigpID0gZGVmYXVsdDsKKyAgdmlydHVhbCB+SVZWaXNpdG9yKCkgPSBkZWZhdWx0OworCisgIGNvbnN0IERvbWluYXRvclRyZWUgKmdldERvbVRyZWUoKSBjb25zdCB7IHJldHVybiBEVDsgfQorICB2aXJ0dWFsIHZvaWQgdmlzaXRDYXN0KENhc3RJbnN0ICpDYXN0KSA9IDA7Cit9OworCisvLy8gc2ltcGxpZnlVc2Vyc09mSVYgLSBTaW1wbGlmeSBpbnN0cnVjdGlvbnMgdGhhdCB1c2UgdGhpcyBpbmR1Y3Rpb24gdmFyaWFibGUKKy8vLyBieSB1c2luZyBTY2FsYXJFdm9sdXRpb24gdG8gYW5hbHl6ZSB0aGUgSVYncyByZWN1cnJlbmNlLgorYm9vbCBzaW1wbGlmeVVzZXJzT2ZJVihQSElOb2RlICpDdXJySVYsIFNjYWxhckV2b2x1dGlvbiAqU0UsIERvbWluYXRvclRyZWUgKkRULAorICAgICAgICAgICAgICAgICAgICAgICBMb29wSW5mbyAqTEksIFNtYWxsVmVjdG9ySW1wbDxXZWFrVHJhY2tpbmdWSD4gJkRlYWQsCisgICAgICAgICAgICAgICAgICAgICAgIFNDRVZFeHBhbmRlciAmUmV3cml0ZXIsIElWVmlzaXRvciAqViA9IG51bGxwdHIpOworCisvLy8gU2ltcGxpZnlMb29wSVZzIC0gU2ltcGxpZnkgdXNlcnMgb2YgaW5kdWN0aW9uIHZhcmlhYmxlcyB3aXRoaW4gdGhpcworLy8vIGxvb3AuIFRoaXMgZG9lcyBub3QgYWN0dWFsbHkgY2hhbmdlIG9yIGFkZCBJVnMuCitib29sIHNpbXBsaWZ5TG9vcElWcyhMb29wICpMLCBTY2FsYXJFdm9sdXRpb24gKlNFLCBEb21pbmF0b3JUcmVlICpEVCwKKyAgICAgICAgICAgICAgICAgICAgIExvb3BJbmZvICpMSSwgU21hbGxWZWN0b3JJbXBsPFdlYWtUcmFja2luZ1ZIPiAmRGVhZCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfU0lNUExJRllJTkRWQVJfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1NpbXBsaWZ5SW5zdHJ1Y3Rpb25zLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvU2ltcGxpZnlJbnN0cnVjdGlvbnMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjgzODYxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1NpbXBsaWZ5SW5zdHJ1Y3Rpb25zLmgKQEAgLTAsMCArMSwzMSBAQAorLy89PT0tIFNpbXBsaWZ5SW5zdHJ1Y3Rpb25zLmggLSBSZW1vdmUgcmVkdW5kYW50IGluc3RydWN0aW9ucyAtLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGlzIGEgdXRpbGl0eSBwYXNzIHVzZWQgZm9yIHRlc3RpbmcgdGhlIEluc3RydWN0aW9uU2ltcGxpZnkgYW5hbHlzaXMuCisvLyBUaGUgYW5hbHlzaXMgaXMgYXBwbGllZCB0byBldmVyeSBpbnN0cnVjdGlvbiwgYW5kIGlmIGl0IHNpbXBsaWZpZXMgdGhlbiB0aGUKKy8vIGluc3RydWN0aW9uIGlzIHJlcGxhY2VkIGJ5IHRoZSBzaW1wbGlmaWNhdGlvbi4gIElmIHlvdSBhcmUgbG9va2luZyBmb3IgYSBwYXNzCisvLyB0aGF0IHBlcmZvcm1zIHNlcmlvdXMgaW5zdHJ1Y3Rpb24gZm9sZGluZywgdXNlIHRoZSBpbnN0Y29tYmluZSBwYXNzIGluc3RlYWQuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfU0lNUExJRllJTlNUUlVDVElPTlNfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVVRJTFNfU0lNUExJRllJTlNUUlVDVElPTlNfSAorCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vLyBUaGlzIHBhc3MgcmVtb3ZlcyByZWR1bmRhbnQgaW5zdHJ1Y3Rpb25zLgorY2xhc3MgSW5zdFNpbXBsaWZpZXJQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48SW5zdFNpbXBsaWZpZXJQYXNzPiB7CitwdWJsaWM6CisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKK307Cit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1NJTVBMSUZZSU5TVFJVQ1RJT05TX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9TaW1wbGlmeUxpYkNhbGxzLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvU2ltcGxpZnlMaWJDYWxscy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczYTYyZjUKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvU2ltcGxpZnlMaWJDYWxscy5oCkBAIC0wLDAgKzEsMTgzIEBACisvLz09PS0gU2ltcGxpZnlMaWJDYWxscy5oIC0gTGlicmFyeSBjYWxsIHNpbXBsaWZpZXIgLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBleHBvc2VzIGFuIGludGVyZmFjZSB0byBidWlsZCBzb21lIEMgbGFuZ3VhZ2UgbGliY2FsbHMgZm9yCisvLyBvcHRpbWl6YXRpb24gcGFzc2VzIHRoYXQgbmVlZCB0byBjYWxsIHRoZSB2YXJpb3VzIGZ1bmN0aW9ucy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19TSU1QTElGWUxJQkNBTExTX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1NJTVBMSUZZTElCQ0FMTFNfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU1RMRXh0cmFzLmgiCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9UYXJnZXRMaWJyYXJ5SW5mby5oIgorI2luY2x1ZGUgImxsdm0vSVIvSVJCdWlsZGVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIFN0cmluZ1JlZjsKK2NsYXNzIFZhbHVlOworY2xhc3MgQ2FsbEluc3Q7CitjbGFzcyBEYXRhTGF5b3V0OworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBUYXJnZXRMaWJyYXJ5SW5mbzsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXI7CisKKy8vLyBcYnJpZWYgVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHNpbXBsaWZpY2F0aW9ucyBmb3IgY2FsbHMgdG8gZm9ydGlmaWVkIGxpYnJhcnkKKy8vLyBmdW5jdGlvbnMgKF9fc3QqY3B5X2NoaywgX19tZW1jcHlfY2hrLCBfX21lbW1vdmVfY2hrLCBfX21lbXNldF9jaGspLCB0bywKKy8vLyB3aGVuIHBvc3NpYmxlLCByZXBsYWNlIHRoZW0gd2l0aCB0aGVpciBub24tY2hlY2tpbmcgY291bnRlcnBhcnRzLgorLy8vIE90aGVyIG9wdGltaXphdGlvbnMgY2FuIGFsc28gYmUgZG9uZSwgYnV0IGl0J3MgcG9zc2libGUgdG8gZGlzYWJsZSB0aGVtIGFuZAorLy8vIG9ubHkgc2ltcGxpZnkgbmVlZGxlc3MgdXNlIG9mIHRoZSBjaGVja2luZyB2ZXJzaW9ucyAod2hlbiB0aGUgb2JqZWN0IHNpemUKKy8vLyBpcyB1bmtub3duKSBieSBwYXNzaW5nIHRydWUgZm9yIE9ubHlMb3dlclVua25vd25TaXplLgorY2xhc3MgRm9ydGlmaWVkTGliQ2FsbFNpbXBsaWZpZXIgeworcHJpdmF0ZToKKyAgY29uc3QgVGFyZ2V0TGlicmFyeUluZm8gKlRMSTsKKyAgYm9vbCBPbmx5TG93ZXJVbmtub3duU2l6ZTsKKworcHVibGljOgorICBGb3J0aWZpZWRMaWJDYWxsU2ltcGxpZmllcihjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIE9ubHlMb3dlclVua25vd25TaXplID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgVGFrZSB0aGUgZ2l2ZW4gY2FsbCBpbnN0cnVjdGlvbiBhbmQgcmV0dXJuIGEgbW9yZQorICAvLy8gb3B0aW1hbCB2YWx1ZSB0byByZXBsYWNlIHRoZSBpbnN0cnVjdGlvbiB3aXRoIG9yIDAgaWYgYSBtb3JlCisgIC8vLyBvcHRpbWFsIGZvcm0gY2FuJ3QgYmUgZm91bmQuCisgIC8vLyBUaGUgY2FsbCBtdXN0IG5vdCBiZSBhbiBpbmRpcmVjdCBjYWxsLgorICBWYWx1ZSAqb3B0aW1pemVDYWxsKENhbGxJbnN0ICpDSSk7CisKK3ByaXZhdGU6CisgIFZhbHVlICpvcHRpbWl6ZU1lbUNweUNoayhDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplTWVtTW92ZUNoayhDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplTWVtU2V0Q2hrKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworCisgIC8vIFN0ci9TdHAgY3B5IGFyZSBzaW1pbGFyIGVub3VnaCB0byBiZSBoYW5kbGVkIGluIHRoZSBzYW1lIGZ1bmN0aW9ucy4KKyAgVmFsdWUgKm9wdGltaXplU3RycENweUNoayhDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCLCBMaWJGdW5jIEZ1bmMpOworICBWYWx1ZSAqb3B0aW1pemVTdHJwTkNweUNoayhDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCLCBMaWJGdW5jIEZ1bmMpOworCisgIC8vLyBcYnJpZWYgQ2hlY2tzIHdoZXRoZXIgdGhlIGNhbGwgXHAgQ0kgdG8gYSBmb3J0aWZpZWQgbGliY2FsbCBpcyBmb2xkYWJsZQorICAvLy8gdG8gdGhlIG5vbi1mb3J0aWZpZWQgdmVyc2lvbi4KKyAgYm9vbCBpc0ZvcnRpZmllZENhbGxGb2xkYWJsZShDYWxsSW5zdCAqQ0ksIHVuc2lnbmVkIE9ialNpemVPcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBTaXplT3AsIGJvb2wgaXNTdHJpbmcpOworfTsKKworLy8vIExpYkNhbGxTaW1wbGlmaWVyIC0gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgY29sbGVjdGlvbiBvZiBvcHRpbWl6YXRpb25zCisvLy8gdGhhdCByZXBsYWNlIHdlbGwgZm9ybWVkIGNhbGxzIHRvIGxpYnJhcnkgZnVuY3Rpb25zIHdpdGggYSBtb3JlIG9wdGltYWwKKy8vLyBmb3JtLiAgRm9yIGV4YW1wbGUsIHJlcGxhY2luZyAncHJpbnRmKCJIZWxsbyEiKScgd2l0aCAncHV0cygiSGVsbG8hIiknLgorY2xhc3MgTGliQ2FsbFNpbXBsaWZpZXIgeworcHJpdmF0ZToKKyAgRm9ydGlmaWVkTGliQ2FsbFNpbXBsaWZpZXIgRm9ydGlmaWVkU2ltcGxpZmllcjsKKyAgY29uc3QgRGF0YUxheW91dCAmREw7CisgIGNvbnN0IFRhcmdldExpYnJhcnlJbmZvICpUTEk7CisgIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgJk9SRTsKKyAgYm9vbCBVbnNhZmVGUFNocmluazsKKyAgZnVuY3Rpb25fcmVmPHZvaWQoSW5zdHJ1Y3Rpb24gKiwgVmFsdWUgKik+IFJlcGxhY2VyOworCisgIC8vLyBcYnJpZWYgSW50ZXJuYWwgd3JhcHBlciBmb3IgUkFVVyB0aGF0IGlzIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uLgorICAvLy8KKyAgLy8vIE90aGVyIHVzZXJzIG1heSBwcm92aWRlIGFuIGFsdGVybmF0ZSBmdW5jdGlvbiB3aXRoIHRoaXMgc2lnbmF0dXJlIGluc3RlYWQKKyAgLy8vIG9mIHRoaXMgb25lLgorICBzdGF0aWMgdm9pZCByZXBsYWNlQWxsVXNlc1dpdGhEZWZhdWx0KEluc3RydWN0aW9uICpJLCBWYWx1ZSAqV2l0aCk7CisKKyAgLy8vIFxicmllZiBSZXBsYWNlIGFuIGluc3RydWN0aW9uJ3MgdXNlcyB3aXRoIGEgdmFsdWUgdXNpbmcgb3VyIHJlcGxhY2VyLgorICB2b2lkIHJlcGxhY2VBbGxVc2VzV2l0aChJbnN0cnVjdGlvbiAqSSwgVmFsdWUgKldpdGgpOworCitwdWJsaWM6CisgIExpYkNhbGxTaW1wbGlmaWVyKGNvbnN0IERhdGFMYXlvdXQgJkRMLCBjb25zdCBUYXJnZXRMaWJyYXJ5SW5mbyAqVExJLAorICAgICAgICAgICAgICAgICAgICBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyICZPUkUsCisgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uX3JlZjx2b2lkKEluc3RydWN0aW9uICosIFZhbHVlICopPiBSZXBsYWNlciA9CisgICAgICAgICAgICAgICAgICAgICAgICAmcmVwbGFjZUFsbFVzZXNXaXRoRGVmYXVsdCk7CisKKyAgLy8vIG9wdGltaXplQ2FsbCAtIFRha2UgdGhlIGdpdmVuIGNhbGwgaW5zdHJ1Y3Rpb24gYW5kIHJldHVybiBhIG1vcmUKKyAgLy8vIG9wdGltYWwgdmFsdWUgdG8gcmVwbGFjZSB0aGUgaW5zdHJ1Y3Rpb24gd2l0aCBvciAwIGlmIGEgbW9yZQorICAvLy8gb3B0aW1hbCBmb3JtIGNhbid0IGJlIGZvdW5kLiAgTm90ZSB0aGF0IHRoZSByZXR1cm5lZCB2YWx1ZSBtYXkKKyAgLy8vIGJlIGVxdWFsIHRvIHRoZSBpbnN0cnVjdGlvbiBiZWluZyBvcHRpbWl6ZWQuICBJbiB0aGlzIGNhc2UgYWxsCisgIC8vLyBvdGhlciBpbnN0cnVjdGlvbnMgdGhhdCB1c2UgdGhlIGdpdmVuIGluc3RydWN0aW9uIHdlcmUgbW9kaWZpZWQKKyAgLy8vIGFuZCB0aGUgZ2l2ZW4gaW5zdHJ1Y3Rpb24gaXMgZGVhZC4KKyAgLy8vIFRoZSBjYWxsIG11c3Qgbm90IGJlIGFuIGluZGlyZWN0IGNhbGwuCisgIFZhbHVlICpvcHRpbWl6ZUNhbGwoQ2FsbEluc3QgKkNJKTsKKworcHJpdmF0ZToKKyAgLy8gU3RyaW5nIGFuZCBNZW1vcnkgTGlicmFyeSBDYWxsIE9wdGltaXphdGlvbnMKKyAgVmFsdWUgKm9wdGltaXplU3RyQ2F0KENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVTdHJOQ2F0KENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVTdHJDaHIoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZVN0clJDaHIoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZVN0ckNtcChDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplU3RyTkNtcChDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplU3RyQ3B5KENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVTdHBDcHkoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZVN0ck5DcHkoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZVN0ckxlbihDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplU3RyUEJyayhDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplU3RyVG8oQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZVN0clNwbihDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplU3RyQ1NwbihDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplU3RyU3RyKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVNZW1DaHIoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZU1lbUNtcChDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplTWVtQ3B5KENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVNZW1Nb3ZlKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVNZW1TZXQoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZVdjc2xlbihDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgLy8gV3JhcHBlciBmb3IgYWxsIFN0cmluZy9NZW1vcnkgTGlicmFyeSBDYWxsIE9wdGltaXphdGlvbnMKKyAgVmFsdWUgKm9wdGltaXplU3RyaW5nTWVtb3J5TGliQ2FsbChDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKworICAvLyBNYXRoIExpYnJhcnkgT3B0aW1pemF0aW9ucworICBWYWx1ZSAqb3B0aW1pemVDQWJzKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVDb3MoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZVBvdyhDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKnJlcGxhY2VQb3dXaXRoU3FydChDYWxsSW5zdCAqUG93LCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZUV4cDIoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZUZNaW5GTWF4KENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVMb2coQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZVNxcnQoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZVNpbkNvc1BpKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVUYW4oQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIC8vIFdyYXBwZXIgZm9yIGFsbCBmbG9hdGluZyBwb2ludCBsaWJyYXJ5IGNhbGwgb3B0aW1pemF0aW9ucworICBWYWx1ZSAqb3B0aW1pemVGbG9hdGluZ1BvaW50TGliQ2FsbChDYWxsSW5zdCAqQ0ksIExpYkZ1bmMgRnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJCdWlsZGVyPD4gJkIpOworCisgIC8vIEludGVnZXIgTGlicmFyeSBDYWxsIE9wdGltaXphdGlvbnMKKyAgVmFsdWUgKm9wdGltaXplRkZTKENhbGxJbnN0ICpDSSwgSVJCdWlsZGVyPD4gJkIpOworICBWYWx1ZSAqb3B0aW1pemVGbHMoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZUFicyhDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplSXNEaWdpdChDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplSXNBc2NpaShDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplVG9Bc2NpaShDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKworICAvLyBGb3JtYXR0aW5nIGFuZCBJTyBMaWJyYXJ5IENhbGwgT3B0aW1pemF0aW9ucworICBWYWx1ZSAqb3B0aW1pemVFcnJvclJlcG9ydGluZyhDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgU3RyZWFtQXJnID0gLTEpOworICBWYWx1ZSAqb3B0aW1pemVQcmludEYoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZVNQcmludEYoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZUZQcmludEYoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZUZXcml0ZShDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplRlB1dHMoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisgIFZhbHVlICpvcHRpbWl6ZVB1dHMoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQik7CisKKyAgLy8gSGVscGVyIG1ldGhvZHMKKyAgVmFsdWUgKmVtaXRTdHJMZW5NZW1DcHkoVmFsdWUgKlNyYywgVmFsdWUgKkRzdCwgdWludDY0X3QgTGVuLCBJUkJ1aWxkZXI8PiAmQik7CisgIHZvaWQgY2xhc3NpZnlBcmdVc2UoVmFsdWUgKlZhbCwgRnVuY3Rpb24gKkYsIGJvb2wgSXNGbG9hdCwKKyAgICAgICAgICAgICAgICAgICAgICBTbWFsbFZlY3RvckltcGw8Q2FsbEluc3QgKj4gJlNpbkNhbGxzLAorICAgICAgICAgICAgICAgICAgICAgIFNtYWxsVmVjdG9ySW1wbDxDYWxsSW5zdCAqPiAmQ29zQ2FsbHMsCisgICAgICAgICAgICAgICAgICAgICAgU21hbGxWZWN0b3JJbXBsPENhbGxJbnN0ICo+ICZTaW5Db3NDYWxscyk7CisgIFZhbHVlICpvcHRpbWl6ZVByaW50RlN0cmluZyhDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplU1ByaW50RlN0cmluZyhDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKyAgVmFsdWUgKm9wdGltaXplRlByaW50RlN0cmluZyhDYWxsSW5zdCAqQ0ksIElSQnVpbGRlcjw+ICZCKTsKKworICAvLy8gaGFzRmxvYXRWZXJzaW9uIC0gQ2hlY2tzIGlmIHRoZXJlIGlzIGEgZmxvYXQgdmVyc2lvbiBvZiB0aGUgc3BlY2lmaWVkCisgIC8vLyBmdW5jdGlvbiBieSBjaGVja2luZyBmb3IgYW4gZXhpc3RpbmcgZnVuY3Rpb24gd2l0aCBuYW1lIEZ1bmNOYW1lICsgZgorICBib29sIGhhc0Zsb2F0VmVyc2lvbihTdHJpbmdSZWYgRnVuY05hbWUpOworCisgIC8vLyBTaGFyZWQgY29kZSB0byBvcHRpbWl6ZSBzdHJsZW4rd2NzbGVuLgorICBWYWx1ZSAqb3B0aW1pemVTdHJpbmdMZW5ndGgoQ2FsbEluc3QgKkNJLCBJUkJ1aWxkZXI8PiAmQiwgdW5zaWduZWQgQ2hhclNpemUpOworfTsKK30gLy8gRW5kIGxsdm0gbmFtZXNwYWNlCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1NwbGl0TW9kdWxlLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvU3BsaXRNb2R1bGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMmMzMWYyCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1NwbGl0TW9kdWxlLmgKQEAgLTAsMCArMSw0MyBAQAorLy89PT0tIFNwbGl0TW9kdWxlLmggLSBTcGxpdCBhIG1vZHVsZSBpbnRvIHBhcnRpdGlvbnMgLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgZGVmaW5lcyB0aGUgZnVuY3Rpb24gbGx2bTo6U3BsaXRNb2R1bGUsIHdoaWNoIHNwbGl0cyBhIG1vZHVsZQorLy8gaW50byBtdWx0aXBsZSBsaW5rYWJsZSBwYXJ0aXRpb25zLiBJdCBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgcGFyYWxsZWwgY29kZQorLy8gZ2VuZXJhdGlvbiBmb3IgbGluay10aW1lIG9wdGltaXphdGlvbi4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19TUExJVE1PRFVMRV9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19TUExJVE1PRFVMRV9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9TVExFeHRyYXMuaCIKKyNpbmNsdWRlIDxtZW1vcnk+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTW9kdWxlOworCisvLy8gU3BsaXRzIHRoZSBtb2R1bGUgTSBpbnRvIE4gbGlua2FibGUgcGFydGl0aW9ucy4gVGhlIGZ1bmN0aW9uIE1vZHVsZUNhbGxiYWNrCisvLy8gaXMgY2FsbGVkIE4gdGltZXMgcGFzc2luZyBlYWNoIGluZGl2aWR1YWwgcGFydGl0aW9uIGFzIHRoZSBNUGFydCBhcmd1bWVudC4KKy8vLworLy8vIEZJWE1FOiBUaGlzIGZ1bmN0aW9uIGRvZXMgbm90IGRlYWwgd2l0aCB0aGUgc29tZXdoYXQgc3VidGxlIHN5bWJvbAorLy8vIHZpc2liaWxpdHkgaXNzdWVzIGFyb3VuZCBtb2R1bGUgc3BsaXR0aW5nLCBpbmNsdWRpbmcgKGJ1dCBub3QgbGltaXRlZCB0byk6CisvLy8KKy8vLyAtIEludGVybmFsIHN5bWJvbHMgc2hvdWxkIG5vdCBjb2xsaWRlIHdpdGggc3ltYm9scyBkZWZpbmVkIG91dHNpZGUgdGhlCisvLy8gICBtb2R1bGUuCisvLy8gLSBJbnRlcm5hbCBzeW1ib2xzIGRlZmluZWQgaW4gbW9kdWxlLWxldmVsIGlubGluZSBhc20gc2hvdWxkIGJlIHZpc2libGUgdG8KKy8vLyAgIGVhY2ggcGFydGl0aW9uLgordm9pZCBTcGxpdE1vZHVsZSgKKyAgICBzdGQ6OnVuaXF1ZV9wdHI8TW9kdWxlPiBNLCB1bnNpZ25lZCBOLAorICAgIGZ1bmN0aW9uX3JlZjx2b2lkKHN0ZDo6dW5pcXVlX3B0cjxNb2R1bGU+IE1QYXJ0KT4gTW9kdWxlQ2FsbGJhY2ssCisgICAgYm9vbCBQcmVzZXJ2ZUxvY2FscyA9IGZhbHNlKTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19VVElMU19TUExJVE1PRFVMRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvU3ltYm9sUmV3cml0ZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9TeW1ib2xSZXdyaXRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwY2FmNzcKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvU3ltYm9sUmV3cml0ZXIuaApAQCAtMCwwICsxLDE0MiBAQAorLy89PT0tIFN5bWJvbFJld3JpdGVyLmggLSBTeW1ib2wgUmV3cml0aW5nIFBhc3MgLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgdGhlIHByb3RvdHlwZXMgYW5kIGRlZmluaXRpb25zIHJlbGF0ZWQgdG8gdGhlIFN5bWJvbAorLy8gUmV3cml0ZXIgcGFzcy4KKy8vCisvLyBUaGUgU3ltYm9sIFJld3JpdGVyIHBhc3MgdGFrZXMgYSBzZXQgb2YgcmV3cml0ZSBkZXNjcmlwdG9ycyB3aGljaCBkZWZpbmUKKy8vIHRyYW5zZm9ybWF0aW9ucyBmb3Igc3ltYm9sIG5hbWVzLiAgVGhlc2UgY2FuIGJlIGVpdGhlciBzaW5nbGUgbmFtZSB0byBuYW1lCisvLyB0cm5zZm9ybWF0aW9uIG9yIG1vcmUgYnJvYWQgcmVndWxhciBleHByZXNzaW9uIGJhc2VkIHRyYW5zZm9ybWF0aW9ucy4KKy8vCisvLyBBbGwgdGhlIGZ1bmN0aW9ucyBhcmUgcmUtd3JpdHRlbiBhdCB0aGUgSVIgbGV2ZWwuICBUaGUgU3ltYm9sIFJld3JpdGVyIGl0c2VsZgorLy8gaXMgZXhwb3NlZCBhcyBhIG1vZHVsZSBsZXZlbCBwYXNzLiAgQWxsIHN5bWJvbHMgYXQgdGhlIG1vZHVsZSBsZXZlbCBhcmUKKy8vIGl0ZXJhdGVkLiAgRm9yIGFueSBtYXRjaGluZyBzeW1ib2wsIHRoZSByZXF1ZXN0ZWQgdHJhbnNmb3JtYXRpb24gaXMgYXBwbGllZCwKKy8vIHVwZGF0aW5nIHJlZmVyZW5jZXMgdG8gaXQgYXMgd2VsbCAoYSBsYSBSQVVXKS4gIFRoZSByZXN1bHRpbmcgYmluYXJ5IHdpbGwKKy8vIG9ubHkgY29udGFpbiB0aGUgcmV3cml0dGVuIHN5bWJvbHMuCisvLworLy8gQnkgcGVyZm9ybWluZyB0aGlzIG9wZXJhdGlvbiBpbiB0aGUgY29tcGlsZXIsIHdlIGFyZSBhYmxlIHRvIGNhdGNoIHN5bWJvbHMKKy8vIHRoYXQgd291bGQgb3RoZXJ3aXNlIG5vdCBiZSBwb3NzaWJsZSB0byBjYXRjaCAoZS5nLiBpbmxpbmVkIHN5bWJvbHMpLgorLy8KKy8vIFRoaXMgbWFrZXMgaXQgcG9zc2libGUgdG8gY2xlYW5seSB0cmFuc2Zvcm0gc3ltYm9scyB3aXRob3V0IHJlc29ydGluZyB0bworLy8gb3Zlcmx5LWNvbXBsZXggbWFjcm8gdHJpY2tzIGFuZCB0aGUgcHJlLXByb2Nlc3Nvci4gIEFuIGV4YW1wbGUgb2Ygd2hlcmUgdGhpcworLy8gaXMgdXNlZnVsIGlzIHRoZSBzYW5pdGl6ZXJzIHdoZXJlIHdlIHdvdWxkIGxpa2UgdG8gaW50ZXJjZXB0IGEgd2VsbC1kZWZpbmVkCisvLyBzZXQgb2YgZnVuY3Rpb25zIGFjcm9zcyB0aGUgbW9kdWxlLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1NZTUJPTFJFV1JJVEVSX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1NZTUJPTFJFV1JJVEVSX0gKKworI2luY2x1ZGUgImxsdm0vSVIvUGFzc01hbmFnZXIuaCIKKyNpbmNsdWRlIDxsaXN0PgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpbmNsdWRlIDxzdHJpbmc+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgTWVtb3J5QnVmZmVyOworY2xhc3MgTW9kdWxlOworY2xhc3MgTW9kdWxlUGFzczsKKworbmFtZXNwYWNlIHlhbWwgeworCitjbGFzcyBLZXlWYWx1ZU5vZGU7CitjbGFzcyBNYXBwaW5nTm9kZTsKK2NsYXNzIFNjYWxhck5vZGU7CitjbGFzcyBTdHJlYW07CisKK30gLy8gZW5kIG5hbWVzcGFjZSB5YW1sCisKK25hbWVzcGFjZSBTeW1ib2xSZXdyaXRlciB7CisKKy8vLyBUaGUgYmFzaWMgZW50aXR5IHJlcHJlc2VudGluZyBhIHJld3JpdGUgb3BlcmF0aW9uLiAgSXQgc2VydmVzIGFzIHRoZSBiYXNlCisvLy8gY2xhc3MgZm9yIGFueSByZXdyaXRlIGRlc2NyaXB0b3IuICBJdCBoYXMgYSBjZXJ0YWluIHNldCBvZiBzcGVjaWFsaXphdGlvbnMKKy8vLyB3aGljaCBkZXNjcmliZSBhIHBhcnRpY3VsYXIgcmV3cml0ZS4KKy8vLworLy8vIFRoZSBSZXdyaXRlTWFwUGFyc2VyIGNhbiBiZSB1c2VkIHRvIHBhcnNlIGEgbWFwcGluZyBmaWxlIHRoYXQgcHJvdmlkZXMgdGhlCisvLy8gbWFwcGluZyBmb3IgcmV3cml0aW5nIHRoZSBzeW1ib2xzLiAgVGhlIGRlc2NyaXB0b3JzIGluZGl2aWR1YWxseSBkZXNjcmliZQorLy8vIHdoZXRoZXIgdG8gcmV3cml0ZSBhIGZ1bmN0aW9uLCBnbG9iYWwgdmFyaWFibGUsIG9yIGdsb2JhbCBhbGlhcy4gIEVhY2ggb2YKKy8vLyB0aGVzZSBjYW4gYmUgc2VsZWN0ZWQgZWl0aGVyIGJ5IGV4cGxpY2l0bHkgcHJvdmlkaW5nIGEgbmFtZSBmb3IgdGhlIG9uZXMgdG8KKy8vLyBiZSByZXdyaXR0ZW4gb3IgcHJvdmlkaW5nIGEgKHBvc2l4IGNvbXBhdGlibGUpIHJlZ3VsYXIgZXhwcmVzc2lvbiB0aGF0IHdpbGwKKy8vLyBzZWxlY3QgdGhlIHN5bWJvbHMgdG8gcmV3cml0ZS4gIFRoaXMgZGVzY3JpcHRvciBsaXN0IGlzIHBhc3NlZCB0byB0aGUKKy8vLyBTeW1ib2xSZXdyaXRlciBwYXNzLgorY2xhc3MgUmV3cml0ZURlc2NyaXB0b3IgeworcHVibGljOgorICBlbnVtIGNsYXNzIFR5cGUgeworICAgIEludmFsaWQsICAgICAgICAvLy8gaW52YWxpZAorICAgIEZ1bmN0aW9uLCAgICAgICAvLy8gZnVuY3Rpb24gLSBkZXNjcmlwdG9yIHJld3JpdGVzIGEgZnVuY3Rpb24KKyAgICBHbG9iYWxWYXJpYWJsZSwgLy8vIGdsb2JhbCB2YXJpYWJsZSAtIGRlc2NyaXB0b3IgcmV3cml0ZXMgYSBnbG9iYWwgdmFyaWFibGUKKyAgICBOYW1lZEFsaWFzLCAgICAgLy8vIG5hbWVkIGFsaWFzIC0gZGVzY3JpcHRvciByZXdyaXRlcyBhIGdsb2JhbCBhbGlhcworICB9OworCisgIFJld3JpdGVEZXNjcmlwdG9yKGNvbnN0IFJld3JpdGVEZXNjcmlwdG9yICYpID0gZGVsZXRlOworICBSZXdyaXRlRGVzY3JpcHRvciAmb3BlcmF0b3I9KGNvbnN0IFJld3JpdGVEZXNjcmlwdG9yICYpID0gZGVsZXRlOworICB2aXJ0dWFsIH5SZXdyaXRlRGVzY3JpcHRvcigpID0gZGVmYXVsdDsKKworICBUeXBlIGdldFR5cGUoKSBjb25zdCB7IHJldHVybiBLaW5kOyB9CisKKyAgdmlydHVhbCBib29sIHBlcmZvcm1Pbk1vZHVsZShNb2R1bGUgJk0pID0gMDsKKworcHJvdGVjdGVkOgorICBleHBsaWNpdCBSZXdyaXRlRGVzY3JpcHRvcihUeXBlIFQpIDogS2luZChUKSB7fQorCitwcml2YXRlOgorICBjb25zdCBUeXBlIEtpbmQ7Cit9OworCit1c2luZyBSZXdyaXRlRGVzY3JpcHRvckxpc3QgPSBzdGQ6Omxpc3Q8c3RkOjp1bmlxdWVfcHRyPFJld3JpdGVEZXNjcmlwdG9yPj47CisKK2NsYXNzIFJld3JpdGVNYXBQYXJzZXIgeworcHVibGljOgorICBib29sIHBhcnNlKGNvbnN0IHN0ZDo6c3RyaW5nICZNYXBGaWxlLCBSZXdyaXRlRGVzY3JpcHRvckxpc3QgKkRlc2NyaXB0b3JzKTsKKworcHJpdmF0ZToKKyAgYm9vbCBwYXJzZShzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiAmTWFwRmlsZSwgUmV3cml0ZURlc2NyaXB0b3JMaXN0ICpETCk7CisgIGJvb2wgcGFyc2VFbnRyeSh5YW1sOjpTdHJlYW0gJlN0cmVhbSwgeWFtbDo6S2V5VmFsdWVOb2RlICZFbnRyeSwKKyAgICAgICAgICAgICAgICAgIFJld3JpdGVEZXNjcmlwdG9yTGlzdCAqREwpOworICBib29sIHBhcnNlUmV3cml0ZUZ1bmN0aW9uRGVzY3JpcHRvcih5YW1sOjpTdHJlYW0gJlN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWFtbDo6U2NhbGFyTm9kZSAqS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5YW1sOjpNYXBwaW5nTm9kZSAqVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJld3JpdGVEZXNjcmlwdG9yTGlzdCAqREwpOworICBib29sIHBhcnNlUmV3cml0ZUdsb2JhbFZhcmlhYmxlRGVzY3JpcHRvcih5YW1sOjpTdHJlYW0gJlN0cmVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeWFtbDo6U2NhbGFyTm9kZSAqS2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5YW1sOjpNYXBwaW5nTm9kZSAqVmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJld3JpdGVEZXNjcmlwdG9yTGlzdCAqREwpOworICBib29sIHBhcnNlUmV3cml0ZUdsb2JhbEFsaWFzRGVzY3JpcHRvcih5YW1sOjpTdHJlYW0gJllTLCB5YW1sOjpTY2FsYXJOb2RlICpLLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5YW1sOjpNYXBwaW5nTm9kZSAqViwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmV3cml0ZURlc2NyaXB0b3JMaXN0ICpETCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgU3ltYm9sUmV3cml0ZXIKKworTW9kdWxlUGFzcyAqY3JlYXRlUmV3cml0ZVN5bWJvbHNQYXNzKCk7CitNb2R1bGVQYXNzICpjcmVhdGVSZXdyaXRlU3ltYm9sc1Bhc3MoU3ltYm9sUmV3cml0ZXI6OlJld3JpdGVEZXNjcmlwdG9yTGlzdCAmKTsKKworY2xhc3MgUmV3cml0ZVN5bWJvbFBhc3MgOiBwdWJsaWMgUGFzc0luZm9NaXhpbjxSZXdyaXRlU3ltYm9sUGFzcz4geworcHVibGljOgorICBSZXdyaXRlU3ltYm9sUGFzcygpIHsgbG9hZEFuZFBhcnNlTWFwRmlsZXMoKTsgfQorCisgIFJld3JpdGVTeW1ib2xQYXNzKFN5bWJvbFJld3JpdGVyOjpSZXdyaXRlRGVzY3JpcHRvckxpc3QgJkRMKSB7CisgICAgRGVzY3JpcHRvcnMuc3BsaWNlKERlc2NyaXB0b3JzLmJlZ2luKCksIERMKTsKKyAgfQorCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihNb2R1bGUgJk0sIE1vZHVsZUFuYWx5c2lzTWFuYWdlciAmQU0pOworCisgIC8vIEdsdWUgZm9yIG9sZCBQTQorICBib29sIHJ1bkltcGwoTW9kdWxlICZNKTsKKworcHJpdmF0ZToKKyAgdm9pZCBsb2FkQW5kUGFyc2VNYXBGaWxlcygpOworCisgIFN5bWJvbFJld3JpdGVyOjpSZXdyaXRlRGVzY3JpcHRvckxpc3QgRGVzY3JpcHRvcnM7ICAKK307CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvL0xMVk1fVFJBTlNGT1JNU19VVElMU19TWU1CT0xSRVdSSVRFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvVW5pZnlGdW5jdGlvbkV4aXROb2Rlcy5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1VuaWZ5RnVuY3Rpb25FeGl0Tm9kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjJjNjAxCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1VuaWZ5RnVuY3Rpb25FeGl0Tm9kZXMuaApAQCAtMCwwICsxLDU0IEBACisvLz09PS0tIFVuaWZ5RnVuY3Rpb25FeGl0Tm9kZXMuaCAtIEVuc3VyZSBmbidzIGhhdmUgb25lIHJldHVybiAtLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgcGFzcyBpcyB1c2VkIHRvIGVuc3VyZSB0aGF0IGZ1bmN0aW9ucyBoYXZlIGF0IG1vc3Qgb25lIHJldHVybiBhbmQgb25lCisvLyB1bndpbmQgaW5zdHJ1Y3Rpb24gaW4gdGhlbS4gIEFkZGl0aW9uYWxseSwgaXQga2VlcHMgdHJhY2sgb2Ygd2hpY2ggbm9kZSBpcworLy8gdGhlIG5ldyBleGl0IG5vZGUgb2YgdGhlIENGRy4gIElmIHRoZXJlIGFyZSBubyByZXR1cm4gb3IgdW53aW5kIGluc3RydWN0aW9ucworLy8gaW4gdGhlIGZ1bmN0aW9uLCB0aGUgZ2V0UmV0dXJuQmxvY2svZ2V0VW53aW5kQmxvY2sgbWV0aG9kcyB3aWxsIHJldHVybiBhIG51bGwKKy8vIHBvaW50ZXIuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVVRJTFNfVU5JRllGVU5DVElPTkVYSVROT0RFU19ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19VTklGWUZVTkNUSU9ORVhJVE5PREVTX0gKKworI2luY2x1ZGUgImxsdm0vUGFzcy5oIgorI2luY2x1ZGUgImxsdm0vUGFzc1JlZ2lzdHJ5LmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworc3RydWN0IFVuaWZ5RnVuY3Rpb25FeGl0Tm9kZXMgOiBwdWJsaWMgRnVuY3Rpb25QYXNzIHsKKyAgQmFzaWNCbG9jayAqUmV0dXJuQmxvY2sgPSBudWxscHRyOworICBCYXNpY0Jsb2NrICpVbndpbmRCbG9jayA9IG51bGxwdHI7CisgIEJhc2ljQmxvY2sgKlVucmVhY2hhYmxlQmxvY2s7CisKK3B1YmxpYzoKKyAgc3RhdGljIGNoYXIgSUQ7IC8vIFBhc3MgaWRlbnRpZmljYXRpb24sIHJlcGxhY2VtZW50IGZvciB0eXBlaWQKKyAgVW5pZnlGdW5jdGlvbkV4aXROb2RlcygpIDogRnVuY3Rpb25QYXNzKElEKSB7CisgICAgaW5pdGlhbGl6ZVVuaWZ5RnVuY3Rpb25FeGl0Tm9kZXNQYXNzKCpQYXNzUmVnaXN0cnk6OmdldFBhc3NSZWdpc3RyeSgpKTsKKyAgfQorCisgIC8vIFdlIGNhbiBwcmVzZXJ2ZSBub24tY3JpdGljYWwtZWRnZW5lc3Mgd2hlbiB3ZSB1bmlmeSBmdW5jdGlvbiBleGl0IG5vZGVzCisgIHZvaWQgZ2V0QW5hbHlzaXNVc2FnZShBbmFseXNpc1VzYWdlICZBVSkgY29uc3Qgb3ZlcnJpZGU7CisKKyAgLy8gZ2V0UmV0dXJufFVud2luZHxVbnJlYWNoYWJsZUJsb2NrIC0gUmV0dXJuIHRoZSBuZXcgc2luZ2xlIChvciBub25leGlzdGVudCkKKyAgLy8gcmV0dXJuLCB1bndpbmQsIG9yIHVucmVhY2hhYmxlICBiYXNpYyBibG9ja3MgaW4gdGhlIENGRy4KKyAgLy8KKyAgQmFzaWNCbG9jayAqZ2V0UmV0dXJuQmxvY2soKSBjb25zdCB7IHJldHVybiBSZXR1cm5CbG9jazsgfQorICBCYXNpY0Jsb2NrICpnZXRVbndpbmRCbG9jaygpIGNvbnN0IHsgcmV0dXJuIFVud2luZEJsb2NrOyB9CisgIEJhc2ljQmxvY2sgKmdldFVucmVhY2hhYmxlQmxvY2soKSBjb25zdCB7IHJldHVybiBVbnJlYWNoYWJsZUJsb2NrOyB9CisKKyAgYm9vbCBydW5PbkZ1bmN0aW9uKEZ1bmN0aW9uICZGKSBvdmVycmlkZTsKK307CisKK1Bhc3MgKmNyZWF0ZVVuaWZ5RnVuY3Rpb25FeGl0Tm9kZXNQYXNzKCk7CisKK30gLy8gZW5kIG5hbWVzcGFjZSBsbHZtCisKKyNlbmRpZiAvLyBMTFZNX1RSQU5TRk9STVNfVVRJTFNfVU5JRllGVU5DVElPTkVYSVROT0RFU19ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvVW5yb2xsTG9vcC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1Vucm9sbExvb3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTgzNjM3Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1Vucm9sbExvb3AuaApAQCAtMCwwICsxLDgzIEBACisvLz09PS0gbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1Vucm9sbExvb3AuaCAtIFVucm9sbGluZyB1dGlsaXRpZXMgLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSBkZWZpbmVzIHNvbWUgbG9vcCB1bnJvbGxpbmcgdXRpbGl0aWVzLiBJdCBkb2VzIG5vdCBkZWZpbmUgYW55CisvLyBhY3R1YWwgcGFzcyBvciBwb2xpY3ksIGJ1dCBwcm92aWRlcyBhIHNpbmdsZSBmdW5jdGlvbiB0byBwZXJmb3JtIGxvb3AKKy8vIHVucm9sbGluZy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19VTlJPTExMT09QX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1VOUk9MTExPT1BfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvRGVuc2VNYXAuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9TdHJpbmdSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL1RhcmdldFRyYW5zZm9ybUluZm8uaCIKKworbmFtZXNwYWNlIGxsdm0geworCitjbGFzcyBBc3N1bXB0aW9uQ2FjaGU7CitjbGFzcyBCYXNpY0Jsb2NrOworY2xhc3MgRG9taW5hdG9yVHJlZTsKK2NsYXNzIExvb3A7CitjbGFzcyBMb29wSW5mbzsKK2NsYXNzIE1ETm9kZTsKK2NsYXNzIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXI7CitjbGFzcyBTY2FsYXJFdm9sdXRpb247CisKK3VzaW5nIE5ld0xvb3BzTWFwID0gU21hbGxEZW5zZU1hcDxjb25zdCBMb29wICosIExvb3AgKiwgND47CisKK2NvbnN0IExvb3AqIGFkZENsb25lZEJsb2NrVG9Mb29wSW5mbyhCYXNpY0Jsb2NrICpPcmlnaW5hbEJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkNsb25lZEJCLCBMb29wSW5mbyAqTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTmV3TG9vcHNNYXAgJk5ld0xvb3BzKTsKKworLy8vIFJlcHJlc2VudHMgdGhlIHJlc3VsdCBvZiBhIFxjIFVucm9sbExvb3AgaW52b2NhdGlvbi4KK2VudW0gY2xhc3MgTG9vcFVucm9sbFJlc3VsdCB7CisgIC8vLyBUaGUgbG9vcCB3YXMgbm90IG1vZGlmaWVkLgorICBVbm1vZGlmaWVkLAorCisgIC8vLyBUaGUgbG9vcCB3YXMgcGFydGlhbGx5IHVucm9sbGVkIC0tIHdlIHN0aWxsIGhhdmUgYSBsb29wLCBidXQgd2l0aCBhCisgIC8vLyBzbWFsbGVyIHRyaXAgY291bnQuICBXZSBtYXkgYWxzbyBoYXZlIGVtaXR0ZWQgZXBpbG9ndWUgbG9vcCBpZiB0aGUgbG9vcAorICAvLy8gaGFkIGEgbm9uLWNvbnN0YW50IHRyaXAgY291bnQuCisgIFBhcnRpYWxseVVucm9sbGVkLAorCisgIC8vLyBUaGUgbG9vcCB3YXMgZnVsbHkgdW5yb2xsZWQgaW50byBzdHJhaWdodC1saW5lIGNvZGUuICBXZSBubyBsb25nZXIgaGF2ZQorICAvLy8gYW55IGJhY2stZWRnZXMuCisgIEZ1bGx5VW5yb2xsZWQKK307CisKK0xvb3BVbnJvbGxSZXN1bHQgVW5yb2xsTG9vcChMb29wICpMLCB1bnNpZ25lZCBDb3VudCwgdW5zaWduZWQgVHJpcENvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgRm9yY2UsIGJvb2wgQWxsb3dSdW50aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgQWxsb3dFeHBlbnNpdmVUcmlwQ291bnQsIGJvb2wgUHJlc2VydmVDb25kQnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBQcmVzZXJ2ZU9ubHlGaXJzdCwgdW5zaWduZWQgVHJpcE11bHRpcGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIFBlZWxDb3VudCwgYm9vbCBVbnJvbGxSZW1haW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTG9vcEluZm8gKkxJLCBTY2FsYXJFdm9sdXRpb24gKlNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIERvbWluYXRvclRyZWUgKkRULCBBc3N1bXB0aW9uQ2FjaGUgKkFDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXIgKk9SRSwgYm9vbCBQcmVzZXJ2ZUxDU1NBKTsKKworYm9vbCBVbnJvbGxSdW50aW1lTG9vcFJlbWFpbmRlcihMb29wICpMLCB1bnNpZ25lZCBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbGxvd0V4cGVuc2l2ZVRyaXBDb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBVc2VFcGlsb2dSZW1haW5kZXIsIGJvb2wgVW5yb2xsUmVtYWluZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMb29wSW5mbyAqTEksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNjYWxhckV2b2x1dGlvbiAqU0UsIERvbWluYXRvclRyZWUgKkRULAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBc3N1bXB0aW9uQ2FjaGUgKkFDLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIFByZXNlcnZlTENTU0EpOworCit2b2lkIGNvbXB1dGVQZWVsQ291bnQoTG9vcCAqTCwgdW5zaWduZWQgTG9vcFNpemUsCisgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0VHJhbnNmb3JtSW5mbzo6VW5yb2xsaW5nUHJlZmVyZW5jZXMgJlVQLAorICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkICZUcmlwQ291bnQsIFNjYWxhckV2b2x1dGlvbiAmU0UpOworCitib29sIHBlZWxMb29wKExvb3AgKkwsIHVuc2lnbmVkIFBlZWxDb3VudCwgTG9vcEluZm8gKkxJLCBTY2FsYXJFdm9sdXRpb24gKlNFLAorICAgICAgICAgICAgICBEb21pbmF0b3JUcmVlICpEVCwgQXNzdW1wdGlvbkNhY2hlICpBQywgYm9vbCBQcmVzZXJ2ZUxDU1NBKTsKKworTUROb2RlICpHZXRVbnJvbGxNZXRhZGF0YShNRE5vZGUgKkxvb3BJRCwgU3RyaW5nUmVmIE5hbWUpOworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1VOUk9MTExPT1BfSApkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1ZOQ29lcmNpb24uaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9WTkNvZXJjaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWJhYTliNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9VdGlscy9WTkNvZXJjaW9uLmgKQEAgLTAsMCArMSwxMDggQEAKKy8vPT09LSBWTkNvZXJjaW9uLmggLSBWYWx1ZSBOdW1iZXJpbmcgQ29lcmNpb24gVXRpbGl0aWVzIC0tLS0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLy8gXGZpbGUgLyBUaGlzIGZpbGUgcHJvdmlkZXMgcm91dGluZXMgdXNlZCBieSBMTFZNJ3MgdmFsdWUgbnVtYmVyaW5nIHBhc3NlcyB0bworLy8vIHBlcmZvcm0gdmFyaW91cyBmb3JtcyBvZiB2YWx1ZSBleHRyYWN0aW9uIGZyb20gbWVtb3J5IHdoZW4gdGhlIHR5cGVzIGFyZSBub3QKKy8vLyBpZGVudGljYWwuICBGb3IgZXhhbXBsZSwgZ2l2ZW4KKy8vLworLy8vIHN0b3JlIGkzMiA4LCBpMzIgKiVmb28KKy8vLyAlYSA9IGJpdGNhc3QgaTMyIColZm9vIHRvIGkxNgorLy8vICV2YWwgPSBsb2FkIGkxNiwgaTE2IColYQorLy8vCisvLy8gSXQgcG9zc2libGUgdG8gZXh0cmFjdCB0aGUgdmFsdWUgb2YgdGhlIGxvYWQgb2YgJWEgZnJvbSB0aGUgc3RvcmUgdG8gJWZvby4KKy8vLyBUaGVzZSByb3V0aW5lcyBrbm93IGhvdyB0byB0ZWxsIHdoZXRoZXIgdGhleSBjYW4gZG8gdGhhdCAodGhlIGFuYWx5emUqCisvLy8gcm91dGluZXMpLCBhbmQgY2FuIGFsc28gaW5zZXJ0IHRoZSBuZWNlc3NhcnkgSVIgdG8gZG8gaXQgKHRoZSBnZXQqCisvLy8gcm91dGluZXMpLgorCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19WTkNPRVJDSU9OX0gKKyNkZWZpbmUgTExWTV9UUkFOU0ZPUk1TX1VUSUxTX1ZOQ09FUkNJT05fSAorI2luY2x1ZGUgImxsdm0vSVIvSVJCdWlsZGVyLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgU3RvcmVJbnN0OworY2xhc3MgTG9hZEluc3Q7CitjbGFzcyBNZW1JbnRyaW5zaWM7CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIFZhbHVlOworY2xhc3MgVHlwZTsKK2NsYXNzIERhdGFMYXlvdXQ7CituYW1lc3BhY2UgVk5Db2VyY2lvbiB7CisvLy8gUmV0dXJuIHRydWUgaWYgQ29lcmNlQXZhaWxhYmxlVmFsdWVUb0xvYWRUeXBlIHdvdWxkIHN1Y2NlZWQgaWYgaXQgd2FzCisvLy8gY2FsbGVkLgorYm9vbCBjYW5Db2VyY2VNdXN0QWxpYXNlZFZhbHVlVG9Mb2FkKFZhbHVlICpTdG9yZWRWYWwsIFR5cGUgKkxvYWRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCk7CisKKy8vLyBJZiB3ZSBzYXcgYSBzdG9yZSBvZiBhIHZhbHVlIHRvIG1lbW9yeSwgYW5kIHRoZW4gYSBsb2FkIGZyb20gYSBtdXN0LWFsaWFzZWQKKy8vLyBwb2ludGVyIG9mIGEgZGlmZmVyZW50IHR5cGUsIHRyeSB0byBjb2VyY2UgdGhlIHN0b3JlZCB2YWx1ZSB0byB0aGUgbG9hZGVkCisvLy8gdHlwZS4gIExvYWRlZFR5IGlzIHRoZSB0eXBlIG9mIHRoZSBsb2FkIHdlIHdhbnQgdG8gcmVwbGFjZS4gIElSQiBpcworLy8vIElSQnVpbGRlciB1c2VkIHRvIGluc2VydCBuZXcgaW5zdHJ1Y3Rpb25zLgorLy8vCisvLy8gSWYgd2UgY2FuJ3QgZG8gaXQsIHJldHVybiBudWxsLgorVmFsdWUgKmNvZXJjZUF2YWlsYWJsZVZhbHVlVG9Mb2FkVHlwZShWYWx1ZSAqU3RvcmVkVmFsLCBUeXBlICpMb2FkZWRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJCdWlsZGVyPD4gJklSQiwgY29uc3QgRGF0YUxheW91dCAmREwpOworCisvLy8gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIHdoZXRoZXIgYSB2YWx1ZSBmb3IgdGhlIHBvaW50ZXIgTG9hZFB0ciBjYW4gYmUKKy8vLyBleHRyYWN0ZWQgZnJvbSB0aGUgc3RvcmUgYXQgRGVwU0kuCisvLy8KKy8vLyBPbiBzdWNjZXNzLCBpdCByZXR1cm5zIHRoZSBvZmZzZXQgaW50byBEZXBTSSB0aGF0IGV4dHJhY3Rpb24gd291bGQgc3RhcnQuCisvLy8gT24gZmFpbHVyZSwgaXQgcmV0dXJucyAtMS4KK2ludCBhbmFseXplTG9hZEZyb21DbG9iYmVyaW5nU3RvcmUoVHlwZSAqTG9hZFR5LCBWYWx1ZSAqTG9hZFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmVJbnN0ICpEZXBTSSwgY29uc3QgRGF0YUxheW91dCAmREwpOworCisvLy8gVGhpcyBmdW5jdGlvbiBkZXRlcm1pbmVzIHdoZXRoZXIgYSB2YWx1ZSBmb3IgdGhlIHBvaW50ZXIgTG9hZFB0ciBjYW4gYmUKKy8vLyBleHRyYWN0ZWQgZnJvbSB0aGUgbG9hZCBhdCBEZXBMSS4KKy8vLworLy8vIE9uIHN1Y2Nlc3MsIGl0IHJldHVybnMgdGhlIG9mZnNldCBpbnRvIERlcExJIHRoYXQgZXh0cmFjdGlvbiB3b3VsZCBzdGFydC4KKy8vLyBPbiBmYWlsdXJlLCBpdCByZXR1cm5zIC0xLgoraW50IGFuYWx5emVMb2FkRnJvbUNsb2JiZXJpbmdMb2FkKFR5cGUgKkxvYWRUeSwgVmFsdWUgKkxvYWRQdHIsIExvYWRJbnN0ICpEZXBMSSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCk7CisKKy8vLyBUaGlzIGZ1bmN0aW9uIGRldGVybWluZXMgd2hldGhlciBhIHZhbHVlIGZvciB0aGUgcG9pbnRlciBMb2FkUHRyIGNhbiBiZQorLy8vIGV4dHJhY3RlZCBmcm9tIHRoZSBtZW1vcnkgaW50cmluc2ljIGF0IERlcE1JLgorLy8vCisvLy8gT24gc3VjY2VzcywgaXQgcmV0dXJucyB0aGUgb2Zmc2V0IGludG8gRGVwTUkgdGhhdCBleHRyYWN0aW9uIHdvdWxkIHN0YXJ0LgorLy8vIE9uIGZhaWx1cmUsIGl0IHJldHVybnMgLTEuCitpbnQgYW5hbHl6ZUxvYWRGcm9tQ2xvYmJlcmluZ01lbUluc3QoVHlwZSAqTG9hZFR5LCBWYWx1ZSAqTG9hZFB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZW1JbnRyaW5zaWMgKkRlcE1JLCBjb25zdCBEYXRhTGF5b3V0ICZETCk7CisKKy8vLyBJZiBhbmFseXplTG9hZEZyb21DbG9iYmVyaW5nU3RvcmUgcmV0dXJuZWQgYW4gb2Zmc2V0LCB0aGlzIGZ1bmN0aW9uIGNhbiBiZQorLy8vIHVzZWQgdG8gYWN0dWFsbHkgcGVyZm9ybSB0aGUgZXh0cmFjdGlvbiBvZiB0aGUgYml0cyBmcm9tIHRoZSBzdG9yZS4gSXQKKy8vLyBpbnNlcnRzIGluc3RydWN0aW9ucyB0byBkbyBzbyBhdCBJbnNlcnRQdCwgYW5kIHJldHVybnMgdGhlIGV4dHJhY3RlZCB2YWx1ZS4KK1ZhbHVlICpnZXRTdG9yZVZhbHVlRm9yTG9hZChWYWx1ZSAqU3JjVmFsLCB1bnNpZ25lZCBPZmZzZXQsIFR5cGUgKkxvYWRUeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0UHQsIGNvbnN0IERhdGFMYXlvdXQgJkRMKTsKKy8vIFRoaXMgaXMgdGhlIHNhbWUgYXMgZ2V0U3RvcmVWYWx1ZUZvckxvYWQsIGV4Y2VwdCBpdCBwZXJmb3JtcyBubyBpbnNlcnRpb24KKy8vIEl0IG9ubHkgYWxsb3dzIGNvbnN0YW50IGlucHV0cy4KK0NvbnN0YW50ICpnZXRDb25zdGFudFN0b3JlVmFsdWVGb3JMb2FkKENvbnN0YW50ICpTcmNWYWwsIHVuc2lnbmVkIE9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgKkxvYWRUeSwgY29uc3QgRGF0YUxheW91dCAmREwpOworCisvLy8gSWYgYW5hbHl6ZUxvYWRGcm9tQ2xvYmJlcmluZ0xvYWQgcmV0dXJuZWQgYW4gb2Zmc2V0LCB0aGlzIGZ1bmN0aW9uIGNhbiBiZQorLy8vIHVzZWQgdG8gYWN0dWFsbHkgcGVyZm9ybSB0aGUgZXh0cmFjdGlvbiBvZiB0aGUgYml0cyBmcm9tIHRoZSBsb2FkLCBpbmNsdWRpbmcKKy8vLyBhbnkgbmVjZXNzYXJ5IGxvYWQgd2lkZW5pbmcuICBJdCBpbnNlcnRzIGluc3RydWN0aW9ucyB0byBkbyBzbyBhdCBJbnNlcnRQdCwKKy8vLyBhbmQgcmV0dXJucyB0aGUgZXh0cmFjdGVkIHZhbHVlLgorVmFsdWUgKmdldExvYWRWYWx1ZUZvckxvYWQoTG9hZEluc3QgKlNyY1ZhbCwgdW5zaWduZWQgT2Zmc2V0LCBUeXBlICpMb2FkVHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBJbnN0cnVjdGlvbiAqSW5zZXJ0UHQsIGNvbnN0IERhdGFMYXlvdXQgJkRMKTsKKy8vIFRoaXMgaXMgdGhlIHNhbWUgYXMgZ2V0TG9hZFZhbHVlRm9yTG9hZCwgZXhjZXB0IGl0IGlzIGdpdmVuIHRoZSBsb2FkIHZhbHVlIGFzCisvLyBhIGNvbnN0YW50LiBJdCByZXR1cm5zIG51bGxwdHIgaWYgaXQgd291bGQgcmVxdWlyZSB3aWRlbmluZyB0aGUgbG9hZC4KK0NvbnN0YW50ICpnZXRDb25zdGFudExvYWRWYWx1ZUZvckxvYWQoQ29uc3RhbnQgKlNyY1ZhbCwgdW5zaWduZWQgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpMb2FkVHksIGNvbnN0IERhdGFMYXlvdXQgJkRMKTsKKworLy8vIElmIGFuYWx5emVMb2FkRnJvbUNsb2JiZXJpbmdNZW1JbnN0IHJldHVybmVkIGFuIG9mZnNldCwgdGhpcyBmdW5jdGlvbiBjYW4gYmUKKy8vLyB1c2VkIHRvIGFjdHVhbGx5IHBlcmZvcm0gdGhlIGV4dHJhY3Rpb24gb2YgdGhlIGJpdHMgZnJvbSB0aGUgbWVtb3J5CisvLy8gaW50cmluc2ljLiAgSXQgaW5zZXJ0cyBpbnN0cnVjdGlvbnMgdG8gZG8gc28gYXQgSW5zZXJ0UHQsIGFuZCByZXR1cm5zIHRoZQorLy8vIGV4dHJhY3RlZCB2YWx1ZS4KK1ZhbHVlICpnZXRNZW1JbnN0VmFsdWVGb3JMb2FkKE1lbUludHJpbnNpYyAqU3JjSW5zdCwgdW5zaWduZWQgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSAqTG9hZFR5LCBJbnN0cnVjdGlvbiAqSW5zZXJ0UHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEYXRhTGF5b3V0ICZETCk7CisvLyBUaGlzIGlzIHRoZSBzYW1lIGFzIGdldFN0b3JlVmFsdWVGb3JMb2FkLCBleGNlcHQgaXQgcGVyZm9ybXMgbm8gaW5zZXJ0aW9uLgorLy8gSXQgcmV0dXJucyBudWxscHRyIGlmIGl0IGNhbm5vdCBwcm9kdWNlIGEgY29uc3RhbnQuCitDb25zdGFudCAqZ2V0Q29uc3RhbnRNZW1JbnN0VmFsdWVGb3JMb2FkKE1lbUludHJpbnNpYyAqU3JjSW5zdCwgdW5zaWduZWQgT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUeXBlICpMb2FkVHksIGNvbnN0IERhdGFMYXlvdXQgJkRMKTsKK30KK30KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1ZhbHVlTWFwcGVyLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVXRpbHMvVmFsdWVNYXBwZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZWNiMjNlCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1V0aWxzL1ZhbHVlTWFwcGVyLmgKQEAgLTAsMCArMSwyODEgQEAKKy8vPT09LSBWYWx1ZU1hcHBlci5oIC0gUmVtYXBwaW5nIGZvciBjb25zdGFudHMgYW5kIG1ldGFkYXRhIC0tLS0tKi0gQysrIC0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gVGhpcyBmaWxlIGRlZmluZXMgdGhlIE1hcFZhbHVlIGludGVyZmFjZSB3aGljaCBpcyB1c2VkIGJ5IHZhcmlvdXMgcGFydHMgb2YKKy8vIHRoZSBUcmFuc2Zvcm1zL1V0aWxzIGxpYnJhcnkgdG8gaW1wbGVtZW50IGNsb25pbmcgYW5kIGxpbmtpbmcgZmFjaWxpdGllcy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19VVElMU19WQUxVRU1BUFBFUl9ICisjZGVmaW5lIExMVk1fVFJBTlNGT1JNU19VVElMU19WQUxVRU1BUFBFUl9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9BcnJheVJlZi5oIgorI2luY2x1ZGUgImxsdm0vSVIvVmFsdWVIYW5kbGUuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1ZhbHVlTWFwLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQ29uc3RhbnQ7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEdsb2JhbEFsaWFzOworY2xhc3MgR2xvYmFsVmFyaWFibGU7CitjbGFzcyBJbnN0cnVjdGlvbjsKK2NsYXNzIE1ETm9kZTsKK2NsYXNzIE1ldGFkYXRhOworY2xhc3MgVHlwZTsKK2NsYXNzIFZhbHVlOworCit1c2luZyBWYWx1ZVRvVmFsdWVNYXBUeSA9IFZhbHVlTWFwPGNvbnN0IFZhbHVlICosIFdlYWtUcmFja2luZ1ZIPjsKKworLy8vIFRoaXMgaXMgYSBjbGFzcyB0aGF0IGNhbiBiZSBpbXBsZW1lbnRlZCBieSBjbGllbnRzIHRvIHJlbWFwIHR5cGVzIHdoZW4KKy8vLyBjbG9uaW5nIGNvbnN0YW50cyBhbmQgaW5zdHJ1Y3Rpb25zLgorY2xhc3MgVmFsdWVNYXBUeXBlUmVtYXBwZXIgeworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7IC8vIE91dCBvZiBsaW5lIG1ldGhvZC4KKworcHVibGljOgorICB2aXJ0dWFsIH5WYWx1ZU1hcFR5cGVSZW1hcHBlcigpID0gZGVmYXVsdDsKKworICAvLy8gVGhlIGNsaWVudCBzaG91bGQgaW1wbGVtZW50IHRoaXMgbWV0aG9kIGlmIHRoZXkgd2FudCB0byByZW1hcCB0eXBlcyB3aGlsZQorICAvLy8gbWFwcGluZyB2YWx1ZXMuCisgIHZpcnR1YWwgVHlwZSAqcmVtYXBUeXBlKFR5cGUgKlNyY1R5KSA9IDA7Cit9OworCisvLy8gVGhpcyBpcyBhIGNsYXNzIHRoYXQgY2FuIGJlIGltcGxlbWVudGVkIGJ5IGNsaWVudHMgdG8gbWF0ZXJpYWxpemUgVmFsdWVzIG9uCisvLy8gZGVtYW5kLgorY2xhc3MgVmFsdWVNYXRlcmlhbGl6ZXIgeworICB2aXJ0dWFsIHZvaWQgYW5jaG9yKCk7IC8vIE91dCBvZiBsaW5lIG1ldGhvZC4KKworcHJvdGVjdGVkOgorICBWYWx1ZU1hdGVyaWFsaXplcigpID0gZGVmYXVsdDsKKyAgVmFsdWVNYXRlcmlhbGl6ZXIoY29uc3QgVmFsdWVNYXRlcmlhbGl6ZXIgJikgPSBkZWZhdWx0OworICBWYWx1ZU1hdGVyaWFsaXplciAmb3BlcmF0b3I9KGNvbnN0IFZhbHVlTWF0ZXJpYWxpemVyICYpID0gZGVmYXVsdDsKKyAgflZhbHVlTWF0ZXJpYWxpemVyKCkgPSBkZWZhdWx0OworCitwdWJsaWM6CisgIC8vLyBUaGlzIG1ldGhvZCBjYW4gYmUgaW1wbGVtZW50ZWQgdG8gZ2VuZXJhdGUgYSBtYXBwZWQgVmFsdWUgb24gZGVtYW5kLiBGb3IKKyAgLy8vIGV4YW1wbGUsIGlmIGxpbmtpbmcgbGF6aWx5LiBSZXR1cm5zIG51bGwgaWYgdGhlIHZhbHVlIGlzIG5vdCBtYXRlcmlhbGl6ZWQuCisgIHZpcnR1YWwgVmFsdWUgKm1hdGVyaWFsaXplKFZhbHVlICpWKSA9IDA7Cit9OworCisvLy8gVGhlc2UgYXJlIGZsYWdzIHRoYXQgdGhlIHZhbHVlIG1hcHBpbmcgQVBJcyBhbGxvdy4KK2VudW0gUmVtYXBGbGFncyB7CisgIFJGX05vbmUgPSAwLAorCisgIC8vLyBJZiB0aGlzIGZsYWcgaXMgc2V0LCB0aGUgcmVtYXBwZXIga25vd3MgdGhhdCBvbmx5IGxvY2FsIHZhbHVlcyB3aXRoaW4gYQorICAvLy8gZnVuY3Rpb24gKHN1Y2ggYXMgYW4gaW5zdHJ1Y3Rpb24gb3IgYXJndW1lbnQpIGFyZSBtYXBwZWQsIG5vdCBnbG9iYWwKKyAgLy8vIHZhbHVlcyBsaWtlIGZ1bmN0aW9ucyBhbmQgZ2xvYmFsIG1ldGFkYXRhLgorICBSRl9Ob01vZHVsZUxldmVsQ2hhbmdlcyA9IDEsCisKKyAgLy8vIElmIHRoaXMgZmxhZyBpcyBzZXQsIHRoZSByZW1hcHBlciBpZ25vcmVzIG1pc3NpbmcgZnVuY3Rpb24tbG9jYWwgZW50cmllcworICAvLy8gKEFyZ3VtZW50LCBJbnN0cnVjdGlvbiwgQmFzaWNCbG9jaykgdGhhdCBhcmUgbm90IGluIHRoZSB2YWx1ZSBtYXAuICBJZiBpdAorICAvLy8gaXMgdW5zZXQsIGl0IGFib3J0cyBpZiBhbiBvcGVyYW5kIGlzIGFza2VkIHRvIGJlIHJlbWFwcGVkIHdoaWNoIGRvZXNuJ3QKKyAgLy8vIGV4aXN0IGluIHRoZSBtYXBwaW5nLgorICAvLy8KKyAgLy8vIFRoZXJlIGFyZSBubyBzdWNoIGFzc2VydGlvbnMgaW4gTWFwVmFsdWUoKSwgd2hvc2UgcmVzdWx0cyBhcmUgYWxtb3N0CisgIC8vLyB1bmNoYW5nZWQgYnkgdGhpcyBmbGFnLiAgVGhpcyBmbGFnIG1haW5seSBjaGFuZ2VzIHRoZSBhc3NlcnRpb24gYmVoYXZpb3VyCisgIC8vLyBpbiBSZW1hcEluc3RydWN0aW9uKCkuCisgIC8vLworICAvLy8gU2luY2UgYW4gSW5zdHJ1Y3Rpb24ncyBtZXRhZGF0YSBvcGVyYW5kcyAoZXZlbiB0aGF0IHBvaW50IHRvIFNTQSB2YWx1ZXMpCisgIC8vLyBhcmVuJ3QgZ3VhcmFudGVlZCB0byBiZSBkb21pbmF0ZWQgYnkgdGhlaXIgZGVmaW5pdGlvbnMsIE1hcE1ldGFkYXRhIHdpbGwKKyAgLy8vIHJldHVybiAiIXt9IiBpbnN0ZWFkIG9mICJudWxsIiBmb3IgXGEgTG9jYWxBc01ldGFkYXRhIGluc3RhbmNlcyB3aG9zZSBTU0EKKyAgLy8vIHZhbHVlcyBhcmUgdW5tYXBwZWQgd2hlbiB0aGlzIGZsYWcgaXMgc2V0LiAgT3RoZXJ3aXNlLCBcYSBNYXBWYWx1ZSgpCisgIC8vLyBjb21wbGV0ZWx5IGlnbm9yZXMgdGhpcyBmbGFnLgorICAvLy8KKyAgLy8vIFxhIE1hcE1ldGFkYXRhKCkgYWx3YXlzIGlnbm9yZXMgdGhpcyBmbGFnLgorICBSRl9JZ25vcmVNaXNzaW5nTG9jYWxzID0gMiwKKworICAvLy8gSW5zdHJ1Y3QgdGhlIHJlbWFwcGVyIHRvIG1vdmUgZGlzdGluY3QgbWV0YWRhdGEgaW5zdGVhZCBvZiBkdXBsaWNhdGluZyBpdAorICAvLy8gd2hlbiB0aGVyZSBhcmUgbW9kdWxlLWxldmVsIGNoYW5nZXMuCisgIFJGX01vdmVEaXN0aW5jdE1EcyA9IDQsCisKKyAgLy8vIEFueSBnbG9iYWwgdmFsdWVzIG5vdCBpbiB2YWx1ZSBtYXAgYXJlIG1hcHBlZCB0byBudWxsIGluc3RlYWQgb2YgbWFwcGluZworICAvLy8gdG8gc2VsZi4gIElsbGVnYWwgaWYgUkZfSWdub3JlTWlzc2luZ0xvY2FscyBpcyBhbHNvIHNldC4KKyAgUkZfTnVsbE1hcE1pc3NpbmdHbG9iYWxWYWx1ZXMgPSA4LAorfTsKKworaW5saW5lIFJlbWFwRmxhZ3Mgb3BlcmF0b3J8KFJlbWFwRmxhZ3MgTEhTLCBSZW1hcEZsYWdzIFJIUykgeworICByZXR1cm4gUmVtYXBGbGFncyh1bnNpZ25lZChMSFMpIHwgdW5zaWduZWQoUkhTKSk7Cit9CisKKy8vLyBDb250ZXh0IGZvciAocmUtKW1hcHBpbmcgdmFsdWVzIChhbmQgbWV0YWRhdGEpLgorLy8vCisvLy8gQSBzaGFyZWQgY29udGV4dCB1c2VkIGZvciBtYXBwaW5nIGFuZCByZW1hcHBpbmcgb2YgVmFsdWUgYW5kIE1ldGFkYXRhCisvLy8gaW5zdGFuY2VzIHVzaW5nIFxhIFZhbHVlVG9WYWx1ZU1hcFR5LCBcYSBSZW1hcEZsYWdzLCBcYQorLy8vIFZhbHVlTWFwVHlwZVJlbWFwcGVyLCBhbmQgXGEgVmFsdWVNYXRlcmlhbGl6ZXIuCisvLy8KKy8vLyBUaGVyZSBhcmUgYSBudW1iZXIgb2YgdG9wLWxldmVsIGVudHJ5IHBvaW50czoKKy8vLyAtIFxhIG1hcFZhbHVlKCkgKGFuZCBcYSBtYXBDb25zdGFudCgpKTsKKy8vLyAtIFxhIG1hcE1ldGFkYXRhKCkgKGFuZCBcYSBtYXBNRE5vZGUoKSk7CisvLy8gLSBcYSByZW1hcEluc3RydWN0aW9uKCk7IGFuZAorLy8vIC0gXGEgcmVtYXBGdW5jdGlvbigpLgorLy8vCisvLy8gVGhlIFxhIFZhbHVlTWF0ZXJpYWxpemVyIGNhbiBiZSB1c2VkIGFzIGEgY2FsbGJhY2ssIGJ1dCBjYW5ub3QgaW52b2tlIGFueQorLy8vIG9mIHRoZXNlIHRvcC1sZXZlbCBmdW5jdGlvbnMgcmVjdXJzaXZlbHkuICBJbnN0ZWFkLCBjYWxsYmFja3Mgc2hvdWxkIHVzZQorLy8vIG9uZSBvZiB0aGUgZm9sbG93aW5nIHRvIHNjaGVkdWxlIHdvcmsgbGF6aWx5IGluIHRoZSBcYSBWYWx1ZU1hcHBlcgorLy8vIGluc3RhbmNlOgorLy8vIC0gXGEgc2NoZWR1bGVNYXBHbG9iYWxJbml0aWFsaXplcigpCisvLy8gLSBcYSBzY2hlZHVsZU1hcEFwcGVuZGluZ1ZhcmlhYmxlKCkKKy8vLyAtIFxhIHNjaGVkdWxlTWFwR2xvYmFsQWxpYXNlZSgpCisvLy8gLSBcYSBzY2hlZHVsZVJlbWFwRnVuY3Rpb24oKQorLy8vCisvLy8gU29tZXRpbWVzIGEgY2FsbGJhY2sgbmVlZHMgYSBkaWZmZXJlbnQgbWFwcGluZyBjb250ZXh0LiAgU3VjaCBhIGNvbnRleHQgY2FuCisvLy8gYmUgcmVnaXN0ZXJlZCB1c2luZyBcYSByZWdpc3RlckFsdGVybmF0ZU1hcHBpbmdDb250ZXh0KCksIHdoaWNoIHRha2VzIGFuCisvLy8gYWx0ZXJuYXRlIFxhIFZhbHVlVG9WYWx1ZU1hcFR5IGFuZCBcYSBWYWx1ZU1hdGVyaWFsaXplciBhbmQgcmV0dXJucyBhIElEIHRvCisvLy8gcGFzcyBpbnRvIHRoZSBzY2hlZHVsZSooKSBmdW5jdGlvbnMuCisvLy8KKy8vLyBUT0RPOiBsaWIvTGlua2VyIHJlYWxseSBkb2Vzbid0IG5lZWQgdGhlIFxhIFZhbHVlSGFuZGxlIGluIHRoZSBcYQorLy8vIFZhbHVlVG9WYWx1ZU1hcFR5LiAgV2Ugc2hvdWxkIHRlbXBsYXRlIFxhIFZhbHVlTWFwcGVyIChhbmQgaXRzCisvLy8gaW1wbGVtZW50YXRpb24gY2xhc3NlcyksIGFuZCBleHBsaWNpdGx5IGluc3RhbnRpYXRlIG9uIHR3byBjb25jcmV0ZQorLy8vIGluc3RhbmNlcyBvZiBcYSBWYWx1ZU1hcCAob25lIGFzIFxhIFZhbHVlVG9WYWx1ZU1hcCwgYW5kIG9uZSB3aXRoIHJhdyBcYQorLy8vIFZhbHVlIHBvaW50ZXJzKS4gIEl0IG1heSBiZSB2aWFibGUgdG8gZG8gYXdheSB3aXRoIFxhIFRyYWNraW5nTURSZWYgaW4gdGhlCisvLy8gXGEgTWV0YWRhdGEgc2lkZSBtYXAgZm9yIHRoZSBsaWIvTGlua2VyIGNhc2UgYXMgd2VsbCwgaW4gd2hpY2ggY2FzZSB3ZSdsbAorLy8vIG5lZWQgYSBuZXcgdGVtcGxhdGUgcGFyYW1ldGVyIG9uIFxhIFZhbHVlTWFwLgorLy8vCisvLy8gVE9ETzogVXBkYXRlIGNhbGxlcnMgb2YgXGEgUmVtYXBJbnN0cnVjdGlvbigpIGFuZCBcYSBNYXBWYWx1ZSgpIChldGMuKSB0bworLy8vIHVzZSBcYSBWYWx1ZU1hcHBlciBkaXJlY3RseS4KK2NsYXNzIFZhbHVlTWFwcGVyIHsKKyAgdm9pZCAqcEltcGw7CisKK3B1YmxpYzoKKyAgVmFsdWVNYXBwZXIoVmFsdWVUb1ZhbHVlTWFwVHkgJlZNLCBSZW1hcEZsYWdzIEZsYWdzID0gUkZfTm9uZSwKKyAgICAgICAgICAgICAgVmFsdWVNYXBUeXBlUmVtYXBwZXIgKlR5cGVNYXBwZXIgPSBudWxscHRyLAorICAgICAgICAgICAgICBWYWx1ZU1hdGVyaWFsaXplciAqTWF0ZXJpYWxpemVyID0gbnVsbHB0cik7CisgIFZhbHVlTWFwcGVyKFZhbHVlTWFwcGVyICYmKSA9IGRlbGV0ZTsKKyAgVmFsdWVNYXBwZXIoY29uc3QgVmFsdWVNYXBwZXIgJikgPSBkZWxldGU7CisgIFZhbHVlTWFwcGVyICZvcGVyYXRvcj0oVmFsdWVNYXBwZXIgJiYpID0gZGVsZXRlOworICBWYWx1ZU1hcHBlciAmb3BlcmF0b3I9KGNvbnN0IFZhbHVlTWFwcGVyICYpID0gZGVsZXRlOworICB+VmFsdWVNYXBwZXIoKTsKKworICAvLy8gUmVnaXN0ZXIgYW4gYWx0ZXJuYXRlIG1hcHBpbmcgY29udGV4dC4KKyAgLy8vCisgIC8vLyBSZXR1cm5zIGEgTWFwcGluZ0NvbnRleHRJRCB0aGF0IGNhbiBiZSB1c2VkIHdpdGggdGhlIHZhcmlvdXMgc2NoZWR1bGUqKCkKKyAgLy8vIEFQSSB0byBzd2l0Y2ggaW4gYSBkaWZmZXJlbnQgdmFsdWUgbWFwIG9uLXRoZS1mbHkuCisgIHVuc2lnbmVkCisgIHJlZ2lzdGVyQWx0ZXJuYXRlTWFwcGluZ0NvbnRleHQoVmFsdWVUb1ZhbHVlTWFwVHkgJlZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlTWF0ZXJpYWxpemVyICpNYXRlcmlhbGl6ZXIgPSBudWxscHRyKTsKKworICAvLy8gQWRkIHRvIHRoZSBjdXJyZW50IFxhIFJlbWFwRmxhZ3MuCisgIC8vLworICAvLy8gXG5vdGUgTGlrZSB0aGUgdG9wLWxldmVsIG1hcHBpbmcgZnVuY3Rpb25zLCBcYSBhZGRGbGFncygpIG11c3QgYmUgY2FsbGVkCisgIC8vLyBhdCB0aGUgdG9wIGxldmVsLCBub3QgZHVyaW5nIGEgY2FsbGJhY2sgaW4gYSBcYSBWYWx1ZU1hdGVyaWFsaXplci4KKyAgdm9pZCBhZGRGbGFncyhSZW1hcEZsYWdzIEZsYWdzKTsKKworICBNZXRhZGF0YSAqbWFwTWV0YWRhdGEoY29uc3QgTWV0YWRhdGEgJk1EKTsKKyAgTUROb2RlICptYXBNRE5vZGUoY29uc3QgTUROb2RlICZOKTsKKworICBWYWx1ZSAqbWFwVmFsdWUoY29uc3QgVmFsdWUgJlYpOworICBDb25zdGFudCAqbWFwQ29uc3RhbnQoY29uc3QgQ29uc3RhbnQgJkMpOworCisgIHZvaWQgcmVtYXBJbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAmSSk7CisgIHZvaWQgcmVtYXBGdW5jdGlvbihGdW5jdGlvbiAmRik7CisKKyAgdm9pZCBzY2hlZHVsZU1hcEdsb2JhbEluaXRpYWxpemVyKEdsb2JhbFZhcmlhYmxlICZHViwgQ29uc3RhbnQgJkluaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBNYXBwaW5nQ29udGV4dElEID0gMCk7CisgIHZvaWQgc2NoZWR1bGVNYXBBcHBlbmRpbmdWYXJpYWJsZShHbG9iYWxWYXJpYWJsZSAmR1YsIENvbnN0YW50ICpJbml0UHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBJc09sZEN0b3JEdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXlSZWY8Q29uc3RhbnQgKj4gTmV3TWVtYmVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIE1hcHBpbmdDb250ZXh0SUQgPSAwKTsKKyAgdm9pZCBzY2hlZHVsZU1hcEdsb2JhbEFsaWFzZWUoR2xvYmFsQWxpYXMgJkdBLCBDb25zdGFudCAmQWxpYXNlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgTWFwcGluZ0NvbnRleHRJRCA9IDApOworICB2b2lkIHNjaGVkdWxlUmVtYXBGdW5jdGlvbihGdW5jdGlvbiAmRiwgdW5zaWduZWQgTWFwcGluZ0NvbnRleHRJRCA9IDApOworfTsKKworLy8vIExvb2sgdXAgb3IgY29tcHV0ZSBhIHZhbHVlIGluIHRoZSB2YWx1ZSBtYXAuCisvLy8KKy8vLyBSZXR1cm4gYSBtYXBwZWQgdmFsdWUgZm9yIGEgZnVuY3Rpb24tbG9jYWwgdmFsdWUgKEFyZ3VtZW50LCBJbnN0cnVjdGlvbiwKKy8vLyBCYXNpY0Jsb2NrKSwgb3IgY29tcHV0ZSBhbmQgbWVtb2l6ZSBhIHZhbHVlIGZvciBhIENvbnN0YW50LgorLy8vCisvLy8gIDEuIElmIFxjIFYgaXMgaW4gVk0sIHJldHVybiB0aGUgcmVzdWx0LgorLy8vICAyLiBFbHNlIGlmIFxjIFYgY2FuIGJlIG1hdGVyaWFsaXplZCB3aXRoIFxjIE1hdGVyaWFsaXplciwgZG8gc28sIG1lbW9pemUKKy8vLyAgICAgaXQgaW4gXGMgVk0sIGFuZCByZXR1cm4gaXQuCisvLy8gIDMuIEVsc2UgaWYgXGMgViBpcyBhIGZ1bmN0aW9uLWxvY2FsIHZhbHVlLCByZXR1cm4gbnVsbHB0ci4KKy8vLyAgNC4gRWxzZSBpZiBcYyBWIGlzIGEgXGEgR2xvYmFsVmFsdWUsIHJldHVybiBcYyBudWxscHRyIG9yIFxjIFYgZGVwZW5kaW5nCisvLy8gICAgIG9uIFxhIFJGX051bGxNYXBNaXNzaW5nR2xvYmFsVmFsdWVzLgorLy8vICA1LiBFbHNlIGlmIFxjIFYgaXMgYSBcYSBNZXRhZGF0YUFzVmFsdWUgd3JhcHBpbmcgYSBMb2NhbEFzTWV0YWRhdGEsCisvLy8gICAgIHJlY3Vyc2Ugb24gdGhlIGxvY2FsIFNTQSB2YWx1ZSwgYW5kIHJldHVybiBudWxscHRyIG9yICJtZXRhZGF0YSAhe30iIG9uCisvLy8gICAgIG1pc3NpbmcgZGVwZW5kaW5nIG9uIFJGX0lnbm9yZU1pc3NpbmdWYWx1ZXMuCisvLy8gIDYuIEVsc2UgaWYgXGMgViBpcyBhIFxhIE1ldGFkYXRhQXNWYWx1ZSwgcmV3cmFwIHRoZSByZXR1cm4gb2YgXGEKKy8vLyAgICAgTWFwTWV0YWRhdGEoKS4KKy8vLyAgNy4gRWxzZSwgY29tcHV0ZSB0aGUgZXF1aXZhbGVudCBjb25zdGFudCwgYW5kIHJldHVybiBpdC4KK2lubGluZSBWYWx1ZSAqTWFwVmFsdWUoY29uc3QgVmFsdWUgKlYsIFZhbHVlVG9WYWx1ZU1hcFR5ICZWTSwKKyAgICAgICAgICAgICAgICAgICAgICAgUmVtYXBGbGFncyBGbGFncyA9IFJGX05vbmUsCisgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlTWFwVHlwZVJlbWFwcGVyICpUeXBlTWFwcGVyID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVNYXRlcmlhbGl6ZXIgKk1hdGVyaWFsaXplciA9IG51bGxwdHIpIHsKKyAgcmV0dXJuIFZhbHVlTWFwcGVyKFZNLCBGbGFncywgVHlwZU1hcHBlciwgTWF0ZXJpYWxpemVyKS5tYXBWYWx1ZSgqVik7Cit9CisKKy8vLyBMb29rdXAgb3IgY29tcHV0ZSBhIG1hcHBpbmcgZm9yIGEgcGllY2Ugb2YgbWV0YWRhdGEuCisvLy8KKy8vLyBDb21wdXRlIGFuZCBtZW1vaXplIGEgbWFwcGluZyBmb3IgXGMgTUQuCisvLy8KKy8vLyAgMS4gSWYgXGMgTUQgaXMgbWFwcGVkLCByZXR1cm4gaXQuCisvLy8gIDIuIEVsc2UgaWYgXGEgUkZfTm9Nb2R1bGVMZXZlbENoYW5nZXMgb3IgXGMgTUQgaXMgYW4gXGEgTURTdHJpbmcsIHJldHVybgorLy8vICAgICBcYyBNRC4KKy8vLyAgMy4gRWxzZSBpZiBcYyBNRCBpcyBhIFxhIENvbnN0YW50QXNNZXRhZGF0YSwgY2FsbCBcYSBNYXBWYWx1ZSgpIGFuZAorLy8vICAgICByZS13cmFwIGl0cyByZXR1cm4gKHJldHVybmluZyBudWxscHRyIG9uIG51bGxwdHIpLgorLy8vICA0LiBFbHNlLCBcYyBNRCBpcyBhbiBcYSBNRE5vZGUuICBUaGVzZSBhcmUgcmVtYXBwZWQsIGFsb25nIHdpdGggdGhlaXIKKy8vLyAgICAgdHJhbnNpdGl2ZSBvcGVyYW5kcy4gIERpc3RpbmN0IG5vZGVzIGFyZSBkdXBsaWNhdGVkIG9yIG1vdmVkIGRlcGVuZGluZworLy8vICAgICBvbiBcYSBSRl9Nb3ZlRGlzdGluY3ROb2Rlcy4gIFVuaXF1ZWQgbm9kZXMgYXJlIHJlbWFwcGVkIGxpa2UgY29uc3RhbnRzLgorLy8vCisvLy8gXG5vdGUgXGEgTG9jYWxBc01ldGFkYXRhIGlzIGNvbXBsZXRlbHkgdW5zdXBwb3J0ZWQgYnkgXGEgTWFwTWV0YWRhdGEuCisvLy8gSW5zdGVhZCwgdXNlIFxhIE1hcFZhbHVlKCkgd2l0aCBpdHMgd3JhcHBpbmcgXGEgTWV0YWRhdGFBc1ZhbHVlIGluc3RhbmNlLgoraW5saW5lIE1ldGFkYXRhICpNYXBNZXRhZGF0YShjb25zdCBNZXRhZGF0YSAqTUQsIFZhbHVlVG9WYWx1ZU1hcFR5ICZWTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtYXBGbGFncyBGbGFncyA9IFJGX05vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlTWFwVHlwZVJlbWFwcGVyICpUeXBlTWFwcGVyID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVNYXRlcmlhbGl6ZXIgKk1hdGVyaWFsaXplciA9IG51bGxwdHIpIHsKKyAgcmV0dXJuIFZhbHVlTWFwcGVyKFZNLCBGbGFncywgVHlwZU1hcHBlciwgTWF0ZXJpYWxpemVyKS5tYXBNZXRhZGF0YSgqTUQpOworfQorCisvLy8gVmVyc2lvbiBvZiBNYXBNZXRhZGF0YSB3aXRoIHR5cGUgc2FmZXR5IGZvciBNRE5vZGUuCitpbmxpbmUgTUROb2RlICpNYXBNZXRhZGF0YShjb25zdCBNRE5vZGUgKk1ELCBWYWx1ZVRvVmFsdWVNYXBUeSAmVk0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1hcEZsYWdzIEZsYWdzID0gUkZfTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlTWFwVHlwZVJlbWFwcGVyICpUeXBlTWFwcGVyID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlTWF0ZXJpYWxpemVyICpNYXRlcmlhbGl6ZXIgPSBudWxscHRyKSB7CisgIHJldHVybiBWYWx1ZU1hcHBlcihWTSwgRmxhZ3MsIFR5cGVNYXBwZXIsIE1hdGVyaWFsaXplcikubWFwTUROb2RlKCpNRCk7Cit9CisKKy8vLyBDb252ZXJ0IHRoZSBpbnN0cnVjdGlvbiBvcGVyYW5kcyBmcm9tIHJlZmVyZW5jaW5nIHRoZSBjdXJyZW50IHZhbHVlcyBpbnRvCisvLy8gdGhvc2Ugc3BlY2lmaWVkIGJ5IFZNLgorLy8vCisvLy8gSWYgXGEgUkZfSWdub3JlTWlzc2luZ0xvY2FscyBpcyBzZXQgYW5kIGFuIG9wZXJhbmQgY2FuJ3QgYmUgZm91bmQgdmlhIFxhCisvLy8gTWFwVmFsdWUoKSwgdXNlIHRoZSBvbGQgdmFsdWUuICBPdGhlcndpc2UgYXNzZXJ0IHRoYXQgdGhpcyBkb2Vzbid0IGhhcHBlbi4KKy8vLworLy8vIE5vdGUgdGhhdCBcYSBNYXBWYWx1ZSgpIG9ubHkgcmV0dXJucyBcYyBudWxscHRyIGZvciBTU0EgdmFsdWVzIG1pc3NpbmcgZnJvbQorLy8vIFxjIFZNLgoraW5saW5lIHZvaWQgUmVtYXBJbnN0cnVjdGlvbihJbnN0cnVjdGlvbiAqSSwgVmFsdWVUb1ZhbHVlTWFwVHkgJlZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1hcEZsYWdzIEZsYWdzID0gUkZfTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVNYXBUeXBlUmVtYXBwZXIgKlR5cGVNYXBwZXIgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZU1hdGVyaWFsaXplciAqTWF0ZXJpYWxpemVyID0gbnVsbHB0cikgeworICBWYWx1ZU1hcHBlcihWTSwgRmxhZ3MsIFR5cGVNYXBwZXIsIE1hdGVyaWFsaXplcikucmVtYXBJbnN0cnVjdGlvbigqSSk7Cit9CisKKy8vLyBSZW1hcCB0aGUgb3BlcmFuZHMsIG1ldGFkYXRhLCBhcmd1bWVudHMsIGFuZCBpbnN0cnVjdGlvbnMgb2YgYSBmdW5jdGlvbi4KKy8vLworLy8vIENhbGxzIFxhIE1hcFZhbHVlKCkgb24gcHJlZml4IGRhdGEsIHByb2xvZ3VlIGRhdGEsIGFuZCBwZXJzb25hbGl0eQorLy8vIGZ1bmN0aW9uOyBjYWxscyBcYSBNYXBNZXRhZGF0YSgpIG9uIGVhY2ggYXR0YWNoZWQgTUROb2RlOyByZW1hcHMgdGhlCisvLy8gYXJndW1lbnQgdHlwZXMgdXNpbmcgdGhlIHByb3ZpZGVkIFxjIFR5cGVNYXBwZXI7IGFuZCBjYWxscyBcYQorLy8vIFJlbWFwSW5zdHJ1Y3Rpb24oKSBvbiBldmVyeSBpbnN0cnVjdGlvbi4KK2lubGluZSB2b2lkIFJlbWFwRnVuY3Rpb24oRnVuY3Rpb24gJkYsIFZhbHVlVG9WYWx1ZU1hcFR5ICZWTSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgUmVtYXBGbGFncyBGbGFncyA9IFJGX05vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlTWFwVHlwZVJlbWFwcGVyICpUeXBlTWFwcGVyID0gbnVsbHB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVNYXRlcmlhbGl6ZXIgKk1hdGVyaWFsaXplciA9IG51bGxwdHIpIHsKKyAgVmFsdWVNYXBwZXIoVk0sIEZsYWdzLCBUeXBlTWFwcGVyLCBNYXRlcmlhbGl6ZXIpLnJlbWFwRnVuY3Rpb24oRik7Cit9CisKKy8vLyBWZXJzaW9uIG9mIE1hcFZhbHVlIHdpdGggdHlwZSBzYWZldHkgZm9yIENvbnN0YW50LgoraW5saW5lIENvbnN0YW50ICpNYXBWYWx1ZShjb25zdCBDb25zdGFudCAqViwgVmFsdWVUb1ZhbHVlTWFwVHkgJlZNLAorICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1hcEZsYWdzIEZsYWdzID0gUkZfTm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWVNYXBUeXBlUmVtYXBwZXIgKlR5cGVNYXBwZXIgPSBudWxscHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZU1hdGVyaWFsaXplciAqTWF0ZXJpYWxpemVyID0gbnVsbHB0cikgeworICByZXR1cm4gVmFsdWVNYXBwZXIoVk0sIEZsYWdzLCBUeXBlTWFwcGVyLCBNYXRlcmlhbGl6ZXIpLm1hcENvbnN0YW50KCpWKTsKK30KKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19VVElMU19WQUxVRU1BUFBFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVmVjdG9yaXplLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1RyYW5zZm9ybXMvVmVjdG9yaXplLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk4NDVlNAotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9WZWN0b3JpemUuaApAQCAtMCwwICsxLDE0NCBAQAorLy89PT0tLSBWZWN0b3JpemUuaCAtIFZlY3Rvcml6YXRpb24gVHJhbnNmb3JtYXRpb25zIC0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGhlYWRlciBmaWxlIGRlZmluZXMgcHJvdG90eXBlcyBmb3IgYWNjZXNzb3IgZnVuY3Rpb25zIHRoYXQgZXhwb3NlIHBhc3NlcworLy8gaW4gdGhlIFZlY3Rvcml6ZSB0cmFuc2Zvcm1hdGlvbnMgbGlicmFyeS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fVFJBTlNGT1JNU19WRUNUT1JJWkVfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVkVDVE9SSVpFX0gKKworbmFtZXNwYWNlIGxsdm0geworY2xhc3MgQmFzaWNCbG9jazsKK2NsYXNzIEJhc2ljQmxvY2tQYXNzOworY2xhc3MgUGFzczsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBAYnJpZWYgVmVjdG9yaXplIGNvbmZpZ3VyYXRpb24uCitzdHJ1Y3QgVmVjdG9yaXplQ29uZmlnIHsKKyAgLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisgIC8vIFRhcmdldCBhcmNoaXRlY3R1cmUgcmVsYXRlZCBwYXJhbWV0ZXJzCisKKyAgLy8vIEBicmllZiBUaGUgc2l6ZSBvZiB0aGUgbmF0aXZlIHZlY3RvciByZWdpc3RlcnMuCisgIHVuc2lnbmVkIFZlY3RvckJpdHM7CisKKyAgLy8vIEBicmllZiBWZWN0b3JpemUgYm9vbGVhbiB2YWx1ZXMuCisgIGJvb2wgVmVjdG9yaXplQm9vbHM7CisKKyAgLy8vIEBicmllZiBWZWN0b3JpemUgaW50ZWdlciB2YWx1ZXMuCisgIGJvb2wgVmVjdG9yaXplSW50czsKKworICAvLy8gQGJyaWVmIFZlY3Rvcml6ZSBmbG9hdGluZy1wb2ludCB2YWx1ZXMuCisgIGJvb2wgVmVjdG9yaXplRmxvYXRzOworCisgIC8vLyBAYnJpZWYgVmVjdG9yaXplIHBvaW50ZXIgdmFsdWVzLgorICBib29sIFZlY3Rvcml6ZVBvaW50ZXJzOworCisgIC8vLyBAYnJpZWYgVmVjdG9yaXplIGNhc3RpbmcgKGNvbnZlcnNpb24pIG9wZXJhdGlvbnMuCisgIGJvb2wgVmVjdG9yaXplQ2FzdHM7CisKKyAgLy8vIEBicmllZiBWZWN0b3JpemUgZmxvYXRpbmctcG9pbnQgbWF0aCBpbnRyaW5zaWNzLgorICBib29sIFZlY3Rvcml6ZU1hdGg7CisKKyAgLy8vIEBicmllZiBWZWN0b3JpemUgYml0IGludHJpbnNpY3MuCisgIGJvb2wgVmVjdG9yaXplQml0TWFuaXB1bGF0aW9uczsKKworICAvLy8gQGJyaWVmIFZlY3Rvcml6ZSB0aGUgZnVzZWQtbXVsdGlwbHktYWRkIGludHJpbnNpYy4KKyAgYm9vbCBWZWN0b3JpemVGTUE7CisKKyAgLy8vIEBicmllZiBWZWN0b3JpemUgc2VsZWN0IGluc3RydWN0aW9ucy4KKyAgYm9vbCBWZWN0b3JpemVTZWxlY3Q7CisKKyAgLy8vIEBicmllZiBWZWN0b3JpemUgY29tcGFyaXNvbiBpbnN0cnVjdGlvbnMuCisgIGJvb2wgVmVjdG9yaXplQ21wOworCisgIC8vLyBAYnJpZWYgVmVjdG9yaXplIGdldGVsZW1lbnRwdHIgaW5zdHJ1Y3Rpb25zLgorICBib29sIFZlY3Rvcml6ZUdFUDsKKworICAvLy8gQGJyaWVmIFZlY3Rvcml6ZSBsb2FkcyBhbmQgc3RvcmVzLgorICBib29sIFZlY3Rvcml6ZU1lbU9wczsKKworICAvLy8gQGJyaWVmIE9ubHkgZ2VuZXJhdGUgYWxpZ25lZCBsb2FkcyBhbmQgc3RvcmVzLgorICBib29sIEFsaWduZWRPbmx5OworCisgIC8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworICAvLyBNaXNjIHBhcmFtZXRlcnMKKworICAvLy8gQGJyaWVmIFRoZSByZXF1aXJlZCBjaGFpbiBkZXB0aCBmb3IgdmVjdG9yaXphdGlvbi4KKyAgdW5zaWduZWQgUmVxQ2hhaW5EZXB0aDsKKworICAvLy8gQGJyaWVmIFRoZSBtYXhpbXVtIHNlYXJjaCBkaXN0YW5jZSBmb3IgaW5zdHJ1Y3Rpb24gcGFpcnMuCisgIHVuc2lnbmVkIFNlYXJjaExpbWl0OworCisgIC8vLyBAYnJpZWYgVGhlIG1heGltdW0gbnVtYmVyIG9mIGNhbmRpZGF0ZSBwYWlycyB3aXRoIHdoaWNoIHRvIHVzZSBhIGZ1bGwKKyAgLy8vICAgICAgICBjeWNsZSBjaGVjay4KKyAgdW5zaWduZWQgTWF4Q2FuZFBhaXJzRm9yQ3ljbGVDaGVjazsKKworICAvLy8gQGJyaWVmIFJlcGxpY2F0aW5nIG9uZSBlbGVtZW50IHRvIGEgcGFpciBicmVha3MgdGhlIGNoYWluLgorICBib29sIFNwbGF0QnJlYWtzQ2hhaW47CisKKyAgLy8vIEBicmllZiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFpcmFibGUgaW5zdHJ1Y3Rpb25zIHBlciBncm91cC4KKyAgdW5zaWduZWQgTWF4SW5zdHM7CisKKyAgLy8vIEBicmllZiBUaGUgbWF4aW11bSBudW1iZXIgb2YgY2FuZGlkYXRlIGluc3RydWN0aW9uIHBhaXJzIHBlciBncm91cC4KKyAgdW5zaWduZWQgTWF4UGFpcnM7CisKKyAgLy8vIEBicmllZiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcGFpcmluZyBpdGVyYXRpb25zLgorICB1bnNpZ25lZCBNYXhJdGVyOworCisgIC8vLyBAYnJpZWYgRG9uJ3QgdHJ5IHRvIGZvcm0gb2RkLWxlbmd0aCB2ZWN0b3JzLgorICBib29sIFBvdzJMZW5Pbmx5OworCisgIC8vLyBAYnJpZWYgRG9uJ3QgYm9vc3QgdGhlIGNoYWluLWRlcHRoIGNvbnRyaWJ1dGlvbiBvZiBsb2FkcyBhbmQgc3RvcmVzLgorICBib29sIE5vTWVtT3BCb29zdDsKKworICAvLy8gQGJyaWVmIFVzZSBhIGZhc3QgaW5zdHJ1Y3Rpb24gZGVwZW5kZW5jeSBhbmFseXNpcy4KKyAgYm9vbCBGYXN0RGVwOworCisgIC8vLyBAYnJpZWYgSW5pdGlhbGl6ZSB0aGUgVmVjdG9yaXplQ29uZmlnIGZyb20gY29tbWFuZCBsaW5lIG9wdGlvbnMuCisgIFZlY3Rvcml6ZUNvbmZpZygpOworfTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBMb29wVmVjdG9yaXplIC0gQ3JlYXRlIGEgbG9vcCB2ZWN0b3JpemF0aW9uIHBhc3MuCisvLworUGFzcyAqY3JlYXRlTG9vcFZlY3Rvcml6ZVBhc3MoYm9vbCBOb1Vucm9sbGluZyA9IGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBBbHdheXNWZWN0b3JpemUgPSB0cnVlKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBTTFBWZWN0b3JpemVyIC0gQ3JlYXRlIGEgYm90dG9tLXVwIFNMUCB2ZWN0b3JpemVyIHBhc3MuCisvLworUGFzcyAqY3JlYXRlU0xQVmVjdG9yaXplclBhc3MoKTsKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vLyBAYnJpZWYgVmVjdG9yaXplIHRoZSBCYXNpY0Jsb2NrLgorLy8vCisvLy8gQHBhcmFtIEJCIFRoZSBCYXNpY0Jsb2NrIHRvIGJlIHZlY3Rvcml6ZWQKKy8vLyBAcGFyYW0gUCAgVGhlIGN1cnJlbnQgcnVubmluZyBwYXNzLCBzaG91bGQgcmVxdWlyZSBBbGlhc0FuYWx5c2lzIGFuZAorLy8vICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24uIEFmdGVyIHRoZSB2ZWN0b3JpemF0aW9uLCBBbGlhc0FuYWx5c2lzLAorLy8vICAgICAgICAgICBTY2FsYXJFdm9sdXRpb24gYW5kIENGRyBhcmUgcHJlc2VydmVkLgorLy8vCisvLy8gQHJldHVybiBUcnVlIGlmIHRoZSBCQiBpcyBjaGFuZ2VkLCBmYWxzZSBvdGhlcndpc2UuCisvLy8KK2Jvb2wgdmVjdG9yaXplQmFzaWNCbG9jayhQYXNzICpQLCBCYXNpY0Jsb2NrICZCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBWZWN0b3JpemVDb25maWcgJkMgPSBWZWN0b3JpemVDb25maWcoKSk7CisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gTG9hZFN0b3JlVmVjdG9yaXplciAtIENyZWF0ZSB2ZWN0b3IgbG9hZHMgYW5kIHN0b3JlcywgYnV0IGxlYXZlIHNjYWxhcgorLy8gb3BlcmF0aW9ucy4KKy8vCitQYXNzICpjcmVhdGVMb2FkU3RvcmVWZWN0b3JpemVyUGFzcygpOworCit9IC8vIEVuZCBsbHZtIG5hbWVzcGFjZQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9WZWN0b3JpemUvTG9vcFZlY3Rvcml6ZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1ZlY3Rvcml6ZS9Mb29wVmVjdG9yaXplLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJiNTZkMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9WZWN0b3JpemUvTG9vcFZlY3Rvcml6ZS5oCkBAIC0wLDAgKzEsMTA3IEBACisvLz09PS0gTG9vcFZlY3Rvcml6ZS5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgaXMgdGhlIExMVk0gbG9vcCB2ZWN0b3JpemVyLiBUaGlzIHBhc3MgbW9kaWZpZXMgJ3ZlY3Rvcml6YWJsZScgbG9vcHMKKy8vIGFuZCBnZW5lcmF0ZXMgdGFyZ2V0LWluZGVwZW5kZW50IExMVk0tSVIuCisvLyBUaGUgdmVjdG9yaXplciB1c2VzIHRoZSBUYXJnZXRUcmFuc2Zvcm1JbmZvIGFuYWx5c2lzIHRvIGVzdGltYXRlIHRoZSBjb3N0cworLy8gb2YgaW5zdHJ1Y3Rpb25zIGluIG9yZGVyIHRvIGVzdGltYXRlIHRoZSBwcm9maXRhYmlsaXR5IG9mIHZlY3Rvcml6YXRpb24uCisvLworLy8gVGhlIGxvb3AgdmVjdG9yaXplciBjb21iaW5lcyBjb25zZWN1dGl2ZSBsb29wIGl0ZXJhdGlvbnMgaW50byBhIHNpbmdsZQorLy8gJ3dpZGUnIGl0ZXJhdGlvbi4gQWZ0ZXIgdGhpcyB0cmFuc2Zvcm1hdGlvbiB0aGUgaW5kZXggaXMgaW5jcmVtZW50ZWQKKy8vIGJ5IHRoZSBTSU1EIHZlY3RvciB3aWR0aCwgYW5kIG5vdCBieSBvbmUuCisvLworLy8gVGhpcyBwYXNzIGhhcyB0aHJlZSBwYXJ0czoKKy8vIDEuIFRoZSBtYWluIGxvb3AgcGFzcyB0aGF0IGRyaXZlcyB0aGUgZGlmZmVyZW50IHBhcnRzLgorLy8gMi4gTG9vcFZlY3Rvcml6YXRpb25MZWdhbGl0eSAtIEEgdW5pdCB0aGF0IGNoZWNrcyBmb3IgdGhlIGxlZ2FsaXR5CisvLyAgICBvZiB0aGUgdmVjdG9yaXphdGlvbi4KKy8vIDMuIElubmVyTG9vcFZlY3Rvcml6ZXIgLSBBIHVuaXQgdGhhdCBwZXJmb3JtcyB0aGUgYWN0dWFsCisvLyAgICB3aWRlbmluZyBvZiBpbnN0cnVjdGlvbnMuCisvLyA0LiBMb29wVmVjdG9yaXphdGlvbkNvc3RNb2RlbCAtIEEgdW5pdCB0aGF0IGNoZWNrcyBmb3IgdGhlIHByb2ZpdGFiaWxpdHkKKy8vICAgIG9mIHZlY3Rvcml6YXRpb24uIEl0IGRlY2lkZXMgb24gdGhlIG9wdGltYWwgdmVjdG9yIHdpZHRoLCB3aGljaAorLy8gICAgY2FuIGJlIG9uZSwgaWYgdmVjdG9yaXphdGlvbiBpcyBub3QgcHJvZml0YWJsZS4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoZSByZWR1Y3Rpb24tdmFyaWFibGUgdmVjdG9yaXphdGlvbiBpcyBiYXNlZCBvbiB0aGUgcGFwZXI6CisvLyAgRC4gTnV6bWFuIGFuZCBSLiBIZW5kZXJzb24uIE11bHRpLXBsYXRmb3JtIEF1dG8tdmVjdG9yaXphdGlvbi4KKy8vCisvLyBWYXJpYWJsZSB1bmlmb3JtaXR5IGNoZWNrcyBhcmUgaW5zcGlyZWQgYnk6CisvLyAgS2FycmVuYmVyZywgUi4gYW5kIEhhY2ssIFMuIFdob2xlIEZ1bmN0aW9uIFZlY3Rvcml6YXRpb24uCisvLworLy8gVGhlIGludGVybGVhdmVkIGFjY2VzcyB2ZWN0b3JpemF0aW9uIGlzIGJhc2VkIG9uIHRoZSBwYXBlcjoKKy8vICBEb3JpdCBOdXptYW4sIElyYSBSb3NlbiBhbmQgQXlhbCBaYWtzLiAgQXV0by1WZWN0b3JpemF0aW9uIG9mIEludGVybGVhdmVkCisvLyAgRGF0YSBmb3IgU0lNRAorLy8KKy8vIE90aGVyIGlkZWFzL2NvbmNlcHRzIGFyZSBmcm9tOgorLy8gIEEuIFpha3MgYW5kIEQuIE51em1hbi4gQXV0b3ZlY3Rvcml6YXRpb24gaW4gR0NDLXR3byB5ZWFycyBsYXRlci4KKy8vCisvLyAgUy4gTWFsZWtpLCBZLiBHYW8sIE0uIEdhcnphcmFuLCBULiBXb25nIGFuZCBELiBQYWR1YS4gIEFuIEV2YWx1YXRpb24gb2YKKy8vICBWZWN0b3JpemluZyBDb21waWxlcnMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVkVDVE9SSVpFX0xPT1BWRUNUT1JJWkVfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVkVDVE9SSVpFX0xPT1BWRUNUT1JJWkVfSAorCisjaW5jbHVkZSAibGx2bS9BbmFseXNpcy9BbGlhc0FuYWx5c2lzLmgiCisjaW5jbHVkZSAibGx2bS9JUi9QYXNzTWFuYWdlci5oIgorI2luY2x1ZGUgPGZ1bmN0aW9uYWw+CisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgQXNzdW1wdGlvbkNhY2hlOworY2xhc3MgQmxvY2tGcmVxdWVuY3lJbmZvOworY2xhc3MgRGVtYW5kZWRCaXRzOworY2xhc3MgRG9taW5hdG9yVHJlZTsKK2NsYXNzIEZ1bmN0aW9uOworY2xhc3MgTG9vcDsKK2NsYXNzIExvb3BBY2Nlc3NJbmZvOworY2xhc3MgTG9vcEluZm87CitjbGFzcyBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyOworY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CitjbGFzcyBUYXJnZXRUcmFuc2Zvcm1JbmZvOworCisvLy8gVGhlIExvb3BWZWN0b3JpemUgUGFzcy4KK3N0cnVjdCBMb29wVmVjdG9yaXplUGFzcyA6IHB1YmxpYyBQYXNzSW5mb01peGluPExvb3BWZWN0b3JpemVQYXNzPiB7CisgIGJvb2wgRGlzYWJsZVVucm9sbGluZyA9IGZhbHNlOworCisgIC8vLyBJZiB0cnVlLCBjb25zaWRlciBhbGwgbG9vcHMgZm9yIHZlY3Rvcml6YXRpb24uCisgIC8vLyBJZiBmYWxzZSwgb25seSBsb29wcyB0aGF0IGV4cGxpY2l0bHkgcmVxdWVzdCB2ZWN0b3JpemF0aW9uIGFyZQorICAvLy8gY29uc2lkZXJlZC4KKyAgYm9vbCBBbHdheXNWZWN0b3JpemUgPSB0cnVlOworCisgIFNjYWxhckV2b2x1dGlvbiAqU0U7CisgIExvb3BJbmZvICpMSTsKKyAgVGFyZ2V0VHJhbnNmb3JtSW5mbyAqVFRJOworICBEb21pbmF0b3JUcmVlICpEVDsKKyAgQmxvY2tGcmVxdWVuY3lJbmZvICpCRkk7CisgIFRhcmdldExpYnJhcnlJbmZvICpUTEk7CisgIERlbWFuZGVkQml0cyAqREI7CisgIEFsaWFzQW5hbHlzaXMgKkFBOworICBBc3N1bXB0aW9uQ2FjaGUgKkFDOworICBzdGQ6OmZ1bmN0aW9uPGNvbnN0IExvb3BBY2Nlc3NJbmZvICYoTG9vcCAmKT4gKkdldExBQTsKKyAgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciAqT1JFOworCisgIFByZXNlcnZlZEFuYWx5c2VzIHJ1bihGdW5jdGlvbiAmRiwgRnVuY3Rpb25BbmFseXNpc01hbmFnZXIgJkFNKTsKKworICAvLyBTaGltIGZvciBvbGQgUE0uCisgIGJvb2wgcnVuSW1wbChGdW5jdGlvbiAmRiwgU2NhbGFyRXZvbHV0aW9uICZTRV8sIExvb3BJbmZvICZMSV8sCisgICAgICAgICAgICAgICBUYXJnZXRUcmFuc2Zvcm1JbmZvICZUVElfLCBEb21pbmF0b3JUcmVlICZEVF8sCisgICAgICAgICAgICAgICBCbG9ja0ZyZXF1ZW5jeUluZm8gJkJGSV8sIFRhcmdldExpYnJhcnlJbmZvICpUTElfLAorICAgICAgICAgICAgICAgRGVtYW5kZWRCaXRzICZEQl8sIEFsaWFzQW5hbHlzaXMgJkFBXywgQXNzdW1wdGlvbkNhY2hlICZBQ18sCisgICAgICAgICAgICAgICBzdGQ6OmZ1bmN0aW9uPGNvbnN0IExvb3BBY2Nlc3NJbmZvICYoTG9vcCAmKT4gJkdldExBQV8sCisgICAgICAgICAgICAgICBPcHRpbWl6YXRpb25SZW1hcmtFbWl0dGVyICZPUkUpOworCisgIGJvb2wgcHJvY2Vzc0xvb3AoTG9vcCAqTCk7Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9UUkFOU0ZPUk1TX1ZFQ1RPUklaRV9MT09QVkVDVE9SSVpFX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9WZWN0b3JpemUvU0xQVmVjdG9yaXplci5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9UcmFuc2Zvcm1zL1ZlY3Rvcml6ZS9TTFBWZWN0b3JpemVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTc5ZDVlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vVHJhbnNmb3Jtcy9WZWN0b3JpemUvU0xQVmVjdG9yaXplci5oCkBAIC0wLDAgKzEsMTU0IEBACisvLz09PS0gU0xQVmVjdG9yaXplci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKyAtKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8gVGhpcyBwYXNzIGltcGxlbWVudHMgdGhlIEJvdHRvbSBVcCBTTFAgdmVjdG9yaXplci4gSXQgZGV0ZWN0cyBjb25zZWN1dGl2ZQorLy8gc3RvcmVzIHRoYXQgY2FuIGJlIHB1dCB0b2dldGhlciBpbnRvIHZlY3Rvci1zdG9yZXMuIE5leHQsIGl0IGF0dGVtcHRzIHRvCisvLyBjb25zdHJ1Y3QgdmVjdG9yaXphYmxlIHRyZWUgdXNpbmcgdGhlIHVzZS1kZWYgY2hhaW5zLiBJZiBhIHByb2ZpdGFibGUgdHJlZQorLy8gd2FzIGZvdW5kLCB0aGUgU0xQIHZlY3Rvcml6ZXIgcGVyZm9ybXMgdmVjdG9yaXphdGlvbiBvbiB0aGUgdHJlZS4KKy8vCisvLyBUaGUgcGFzcyBpcyBpbnNwaXJlZCBieSB0aGUgd29yayBkZXNjcmliZWQgaW4gdGhlIHBhcGVyOgorLy8gICJMb29wLUF3YXJlIFNMUCBpbiBHQ0MiIGJ5IElyYSBSb3NlbiwgRG9yaXQgTnV6bWFuLCBBeWFsIFpha3MuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBMTFZNX1RSQU5TRk9STVNfVkVDVE9SSVpFX1NMUFZFQ1RPUklaRVJfSAorI2RlZmluZSBMTFZNX1RSQU5TRk9STVNfVkVDVE9SSVpFX1NMUFZFQ1RPUklaRVJfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvQXJyYXlSZWYuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9NYXBWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FEVC9Ob25lLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU21hbGxWZWN0b3IuaCIKKyNpbmNsdWRlICJsbHZtL0FuYWx5c2lzL0FsaWFzQW5hbHlzaXMuaCIKKyNpbmNsdWRlICJsbHZtL0lSL1Bhc3NNYW5hZ2VyLmgiCisjaW5jbHVkZSAibGx2bS9JUi9WYWx1ZUhhbmRsZS5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIEFzc3VtcHRpb25DYWNoZTsKK2NsYXNzIEJhc2ljQmxvY2s7CitjbGFzcyBDbXBJbnN0OworY2xhc3MgRGF0YUxheW91dDsKK2NsYXNzIERlbWFuZGVkQml0czsKK2NsYXNzIERvbWluYXRvclRyZWU7CitjbGFzcyBGdW5jdGlvbjsKK2NsYXNzIEluc2VydEVsZW1lbnRJbnN0OworY2xhc3MgSW5zZXJ0VmFsdWVJbnN0OworY2xhc3MgSW5zdHJ1Y3Rpb247CitjbGFzcyBMb29wSW5mbzsKK2NsYXNzIE9wdGltaXphdGlvblJlbWFya0VtaXR0ZXI7CitjbGFzcyBQSElOb2RlOworY2xhc3MgU2NhbGFyRXZvbHV0aW9uOworY2xhc3MgU3RvcmVJbnN0OworY2xhc3MgVGFyZ2V0TGlicmFyeUluZm87CitjbGFzcyBUYXJnZXRUcmFuc2Zvcm1JbmZvOworY2xhc3MgVmFsdWU7CisKKy8vLyBBIHByaXZhdGUgIm1vZHVsZSIgbmFtZXNwYWNlIGZvciB0eXBlcyBhbmQgdXRpbGl0aWVzIHVzZWQgYnkgdGhpcyBwYXNzLgorLy8vIFRoZXNlIGFyZSBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgYnkgY2xpZW50cy4KK25hbWVzcGFjZSBzbHB2ZWN0b3JpemVyIHsKKworY2xhc3MgQm9VcFNMUDsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHNscHZlY3Rvcml6ZXIKKworc3RydWN0IFNMUFZlY3Rvcml6ZXJQYXNzIDogcHVibGljIFBhc3NJbmZvTWl4aW48U0xQVmVjdG9yaXplclBhc3M+IHsKKyAgdXNpbmcgU3RvcmVMaXN0ID0gU21hbGxWZWN0b3I8U3RvcmVJbnN0ICosIDg+OworICB1c2luZyBTdG9yZUxpc3RNYXAgPSBNYXBWZWN0b3I8VmFsdWUgKiwgU3RvcmVMaXN0PjsKKyAgdXNpbmcgV2Vha1RyYWNraW5nVkhMaXN0ID0gU21hbGxWZWN0b3I8V2Vha1RyYWNraW5nVkgsIDg+OworICB1c2luZyBXZWFrVHJhY2tpbmdWSExpc3RNYXAgPSBNYXBWZWN0b3I8VmFsdWUgKiwgV2Vha1RyYWNraW5nVkhMaXN0PjsKKworICBTY2FsYXJFdm9sdXRpb24gKlNFID0gbnVsbHB0cjsKKyAgVGFyZ2V0VHJhbnNmb3JtSW5mbyAqVFRJID0gbnVsbHB0cjsKKyAgVGFyZ2V0TGlicmFyeUluZm8gKlRMSSA9IG51bGxwdHI7CisgIEFsaWFzQW5hbHlzaXMgKkFBID0gbnVsbHB0cjsKKyAgTG9vcEluZm8gKkxJID0gbnVsbHB0cjsKKyAgRG9taW5hdG9yVHJlZSAqRFQgPSBudWxscHRyOworICBBc3N1bXB0aW9uQ2FjaGUgKkFDID0gbnVsbHB0cjsKKyAgRGVtYW5kZWRCaXRzICpEQiA9IG51bGxwdHI7CisgIGNvbnN0IERhdGFMYXlvdXQgKkRMID0gbnVsbHB0cjsKKworcHVibGljOgorICBQcmVzZXJ2ZWRBbmFseXNlcyBydW4oRnVuY3Rpb24gJkYsIEZ1bmN0aW9uQW5hbHlzaXNNYW5hZ2VyICZBTSk7CisKKyAgLy8gR2x1ZSBmb3Igb2xkIFBNLgorICBib29sIHJ1bkltcGwoRnVuY3Rpb24gJkYsIFNjYWxhckV2b2x1dGlvbiAqU0VfLCBUYXJnZXRUcmFuc2Zvcm1JbmZvICpUVElfLAorICAgICAgICAgICAgICAgVGFyZ2V0TGlicmFyeUluZm8gKlRMSV8sIEFsaWFzQW5hbHlzaXMgKkFBXywgTG9vcEluZm8gKkxJXywKKyAgICAgICAgICAgICAgIERvbWluYXRvclRyZWUgKkRUXywgQXNzdW1wdGlvbkNhY2hlICpBQ18sIERlbWFuZGVkQml0cyAqREJfLAorICAgICAgICAgICAgICAgT3B0aW1pemF0aW9uUmVtYXJrRW1pdHRlciAqT1JFXyk7CisKK3ByaXZhdGU6CisgIC8vLyBcYnJpZWYgQ29sbGVjdCBzdG9yZSBhbmQgZ2V0ZWxlbWVudHB0ciBpbnN0cnVjdGlvbnMgYW5kIG9yZ2FuaXplIHRoZW0KKyAgLy8vIGFjY29yZGluZyB0byB0aGUgdW5kZXJseWluZyBvYmplY3Qgb2YgdGhlaXIgcG9pbnRlciBvcGVyYW5kcy4gV2Ugc29ydCB0aGUKKyAgLy8vIGluc3RydWN0aW9ucyBieSB0aGVpciB1bmRlcmx5aW5nIG9iamVjdHMgdG8gcmVkdWNlIHRoZSBjb3N0IG9mCisgIC8vLyBjb25zZWN1dGl2ZSBhY2Nlc3MgcXVlcmllcy4KKyAgLy8vCisgIC8vLyBUT0RPOiBXZSBjYW4gZnVydGhlciByZWR1Y2UgdGhpcyBjb3N0IGlmIHdlIGZsdXNoIHRoZSBjaGFpbiBjcmVhdGlvbgorICAvLy8gICAgICAgZXZlcnkgdGltZSB3ZSBydW4gaW50byBhIG1lbW9yeSBiYXJyaWVyLgorICB2b2lkIGNvbGxlY3RTZWVkSW5zdHJ1Y3Rpb25zKEJhc2ljQmxvY2sgKkJCKTsKKworICAvLy8gXGJyaWVmIFRyeSB0byB2ZWN0b3JpemUgYSBjaGFpbiB0aGF0IHN0YXJ0cyBhdCB0d28gYXJpdGhtZXRpYyBpbnN0cnMuCisgIGJvb2wgdHJ5VG9WZWN0b3JpemVQYWlyKFZhbHVlICpBLCBWYWx1ZSAqQiwgc2xwdmVjdG9yaXplcjo6Qm9VcFNMUCAmUik7CisKKyAgLy8vIFxicmllZiBUcnkgdG8gdmVjdG9yaXplIGEgbGlzdCBvZiBvcGVyYW5kcy4KKyAgLy8vIFxwYXJhbSBVc2VyQ29zdCBDb3N0IG9mIHRoZSB1c2VyIG9wZXJhdGlvbnMgb2YgXHAgVkwgaWYgdGhleSBtYXkgYWZmZWN0CisgIC8vLyB0aGUgY29zdCBvZiB0aGUgdmVjdG9yaXphdGlvbi4KKyAgLy8vIFxyZXR1cm5zIHRydWUgaWYgYSB2YWx1ZSB3YXMgdmVjdG9yaXplZC4KKyAgYm9vbCB0cnlUb1ZlY3Rvcml6ZUxpc3QoQXJyYXlSZWY8VmFsdWUgKj4gVkwsIHNscHZlY3Rvcml6ZXI6OkJvVXBTTFAgJlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBVc2VyQ29zdCA9IDAsIGJvb2wgQWxsb3dSZW9yZGVyID0gZmFsc2UpOworCisgIC8vLyBcYnJpZWYgVHJ5IHRvIHZlY3Rvcml6ZSBhIGNoYWluIHRoYXQgbWF5IHN0YXJ0IGF0IHRoZSBvcGVyYW5kcyBvZiBccCBJLgorICBib29sIHRyeVRvVmVjdG9yaXplKEluc3RydWN0aW9uICpJLCBzbHB2ZWN0b3JpemVyOjpCb1VwU0xQICZSKTsKKworICAvLy8gXGJyaWVmIFZlY3Rvcml6ZSB0aGUgc3RvcmUgaW5zdHJ1Y3Rpb25zIGNvbGxlY3RlZCBpbiBTdG9yZXMuCisgIGJvb2wgdmVjdG9yaXplU3RvcmVDaGFpbnMoc2xwdmVjdG9yaXplcjo6Qm9VcFNMUCAmUik7CisKKyAgLy8vIFxicmllZiBWZWN0b3JpemUgdGhlIGluZGV4IGNvbXB1dGF0aW9ucyBvZiB0aGUgZ2V0ZWxlbWVudHB0ciBpbnN0cnVjdGlvbnMKKyAgLy8vIGNvbGxlY3RlZCBpbiBHRVBzLgorICBib29sIHZlY3Rvcml6ZUdFUEluZGljZXMoQmFzaWNCbG9jayAqQkIsIHNscHZlY3Rvcml6ZXI6OkJvVXBTTFAgJlIpOworCisgIC8vLyBUcnkgdG8gZmluZCBob3Jpem9udGFsIHJlZHVjdGlvbiBvciBvdGhlcndpc2UgdmVjdG9yaXplIGEgY2hhaW4gb2YgYmluYXJ5CisgIC8vLyBvcGVyYXRvcnMuCisgIGJvb2wgdmVjdG9yaXplUm9vdEluc3RydWN0aW9uKFBISU5vZGUgKlAsIFZhbHVlICpWLCBCYXNpY0Jsb2NrICpCQiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xwdmVjdG9yaXplcjo6Qm9VcFNMUCAmUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFyZ2V0VHJhbnNmb3JtSW5mbyAqVFRJKTsKKworICAvLy8gVHJ5IHRvIHZlY3Rvcml6ZSB0cmVlcyB0aGF0IHN0YXJ0IGF0IGluc2VydHZhbHVlIGluc3RydWN0aW9ucy4KKyAgYm9vbCB2ZWN0b3JpemVJbnNlcnRWYWx1ZUluc3QoSW5zZXJ0VmFsdWVJbnN0ICpJVkksIEJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzbHB2ZWN0b3JpemVyOjpCb1VwU0xQICZSKTsKKworICAvLy8gVHJ5IHRvIHZlY3Rvcml6ZSB0cmVlcyB0aGF0IHN0YXJ0IGF0IGluc2VydGVsZW1lbnQgaW5zdHJ1Y3Rpb25zLgorICBib29sIHZlY3Rvcml6ZUluc2VydEVsZW1lbnRJbnN0KEluc2VydEVsZW1lbnRJbnN0ICpJRUksIEJhc2ljQmxvY2sgKkJCLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNscHZlY3Rvcml6ZXI6OkJvVXBTTFAgJlIpOworCisgIC8vLyBUcnkgdG8gdmVjdG9yaXplIHRyZWVzIHRoYXQgc3RhcnQgYXQgY29tcGFyZSBpbnN0cnVjdGlvbnMuCisgIGJvb2wgdmVjdG9yaXplQ21wSW5zdChDbXBJbnN0ICpDSSwgQmFzaWNCbG9jayAqQkIsIHNscHZlY3Rvcml6ZXI6OkJvVXBTTFAgJlIpOworCisgIC8vLyBUcmllcyB0byB2ZWN0b3JpemUgY29uc3RydWN0cyBzdGFydGVkIGZyb20gQ21wSW5zdCwgSW5zZXJ0VmFsdWVJbnN0IG9yCisgIC8vLyBJbnNlcnRFbGVtZW50SW5zdCBpbnN0cnVjdGlvbnMuCisgIGJvb2wgdmVjdG9yaXplU2ltcGxlSW5zdHJ1Y3Rpb25zKFNtYWxsVmVjdG9ySW1wbDxXZWFrVkg+ICZJbnN0cnVjdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJhc2ljQmxvY2sgKkJCLCBzbHB2ZWN0b3JpemVyOjpCb1VwU0xQICZSKTsKKworICAvLy8gXGJyaWVmIFNjYW4gdGhlIGJhc2ljIGJsb2NrIGFuZCBsb29rIGZvciBwYXR0ZXJucyB0aGF0IGFyZSBsaWtlbHkgdG8gc3RhcnQKKyAgLy8vIGEgdmVjdG9yaXphdGlvbiBjaGFpbi4KKyAgYm9vbCB2ZWN0b3JpemVDaGFpbnNJbkJsb2NrKEJhc2ljQmxvY2sgKkJCLCBzbHB2ZWN0b3JpemVyOjpCb1VwU0xQICZSKTsKKworICBib29sIHZlY3Rvcml6ZVN0b3JlQ2hhaW4oQXJyYXlSZWY8VmFsdWUgKj4gQ2hhaW4sIHNscHZlY3Rvcml6ZXI6OkJvVXBTTFAgJlIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBWZWNSZWdTaXplKTsKKworICBib29sIHZlY3Rvcml6ZVN0b3JlcyhBcnJheVJlZjxTdG9yZUluc3QgKj4gU3RvcmVzLCBzbHB2ZWN0b3JpemVyOjpCb1VwU0xQICZSKTsKKworICAvLy8gVGhlIHN0b3JlIGluc3RydWN0aW9ucyBpbiBhIGJhc2ljIGJsb2NrIG9yZ2FuaXplZCBieSBiYXNlIHBvaW50ZXIuCisgIFN0b3JlTGlzdE1hcCBTdG9yZXM7CisKKyAgLy8vIFRoZSBnZXRlbGVtZW50cHRyIGluc3RydWN0aW9ucyBpbiBhIGJhc2ljIGJsb2NrIG9yZ2FuaXplZCBieSBiYXNlIHBvaW50ZXIuCisgIFdlYWtUcmFja2luZ1ZITGlzdE1hcCBHRVBzOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fVFJBTlNGT1JNU19WRUNUT1JJWkVfU0xQVkVDVE9SSVpFUl9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1dpbmRvd3NNYW5pZmVzdC9XaW5kb3dzTWFuaWZlc3RNZXJnZXIuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vV2luZG93c01hbmlmZXN0L1dpbmRvd3NNYW5pZmVzdE1lcmdlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMwMmQzNzAKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1dpbmRvd3NNYW5pZmVzdC9XaW5kb3dzTWFuaWZlc3RNZXJnZXIuaApAQCAtMCwwICsxLDY2IEBACisvLz09PS0tIFdpbmRvd3NNYW5pZmVzdE1lcmdlci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKy0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGZpbGUgcHJvdmlkZXMgYSB1dGlsaXR5IGZvciBtZXJnaW5nIE1pY3Jvc29mdCAubWFuaWZlc3QgZmlsZXMuICBUaGVzZQorLy8gZmlsZXMgYXJlIHhtbCBkb2N1bWVudHMgd2hpY2ggY29udGFpbiBtZXRhLWluZm9ybWF0aW9uIGFib3V0IGFwcGxpY2F0aW9ucywKKy8vIHN1Y2ggYXMgd2hldGhlciBvciBub3QgYWRtaW4gYWNjZXNzIGlzIHJlcXVpcmVkLCBzeXN0ZW0gY29tcGF0aWJpbGl0eSwKKy8vIHZlcnNpb25zLCBldGMuICBQYXJ0IG9mIHRoZSBsaW5raW5nIHByb2Nlc3Mgb2YgYW4gZXhlY3V0YWJsZSBtYXkgcmVxdWlyZQorLy8gbWVyZ2luZyBzZXZlcmFsIG9mIHRoZXNlIC5tYW5pZmVzdCBmaWxlcyB1c2luZyBhIHRyZWUtbWVyZ2UgZm9sbG93aW5nCisvLyBzcGVjaWZpYyBydWxlcy4gIFVuZm9ydHVuYXRlbHksIHRoZXNlIHJ1bGVzIGFyZSBub3QgZG9jdW1lbnRlZCB3ZWxsCisvLyBhbnl3aGVyZS4gIEhvd2V2ZXIsIGEgY2FyZWZ1bCBpbnZlc3RpZ2F0aW9uIG9mIHRoZSBiZWhhdmlvciBvZiB0aGUgb3JpZ2luYWwKKy8vIE1pY3Jvc29mdCBNYW5pZmVzdCBUb29sIChtdC5leGUpIHJldmVhbGVkIHRoZSBydWxlcyBvZiB0aGlzIG1lcmdlLiAgQXMgdGhlCisvLyBzYXlpbmcgZ29lcywgY29kZSBpcyB0aGUgYmVzdCBkb2N1bWVudGF0aW9uLCBzbyBwbGVhc2UgbG9vayBiZWxvdyBpZiB5b3UgYXJlCisvLyBpbnRlcmVzdGVkIGluIHRoZSBleGFjdCBtZXJnaW5nIHJlcXVpcmVtZW50cy4KKy8vCisvLyBSZWY6CisvLyBodHRwczovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L3dpbmRvd3MvZGVza3RvcC9hYTM3NDE5MSh2PXZzLjg1KS5hc3B4CisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIExMVk1fSU5DTFVERV9MTFZNX1NVUFBPUlRfV0lORE9XU19NQU5JRkVTVF9NRVJHRVJfSAorI2RlZmluZSBMTFZNX0lOQ0xVREVfTExWTV9TVVBQT1JUX1dJTkRPV1NfTUFOSUZFU1RfTUVSR0VSX0gKKworI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKK2NsYXNzIE1lbW9yeUJ1ZmZlcjsKKworbmFtZXNwYWNlIHdpbmRvd3NfbWFuaWZlc3QgeworCitib29sIGlzQXZhaWxhYmxlKCk7CisKK2NsYXNzIFdpbmRvd3NNYW5pZmVzdEVycm9yIDogcHVibGljIEVycm9ySW5mbzxXaW5kb3dzTWFuaWZlc3RFcnJvciwgRUNFcnJvcj4geworcHVibGljOgorICBzdGF0aWMgY2hhciBJRDsKKyAgV2luZG93c01hbmlmZXN0RXJyb3IoY29uc3QgVHdpbmUgJk1zZyk7CisgIHZvaWQgbG9nKHJhd19vc3RyZWFtICZPUykgY29uc3Qgb3ZlcnJpZGU7CisKK3ByaXZhdGU6CisgIHN0ZDo6c3RyaW5nIE1zZzsKK307CisKK2NsYXNzIFdpbmRvd3NNYW5pZmVzdE1lcmdlciB7CitwdWJsaWM6CisgIFdpbmRvd3NNYW5pZmVzdE1lcmdlcigpOworICB+V2luZG93c01hbmlmZXN0TWVyZ2VyKCk7CisgIEVycm9yIG1lcmdlKGNvbnN0IE1lbW9yeUJ1ZmZlciAmTWFuaWZlc3QpOworCisgIC8vIFJldHVybnMgdmVjdG9yIGNvbnRhaW5pbmcgbWVyZ2VkIHhtbCBtYW5pZmVzdCwgb3IgdW5pbml0aWFsaXplZCB2ZWN0b3IgZm9yCisgIC8vIGVtcHR5IG1hbmlmZXN0LgorICBzdGQ6OnVuaXF1ZV9wdHI8TWVtb3J5QnVmZmVyPiBnZXRNZXJnZWRNYW5pZmVzdCgpOworCitwcml2YXRlOgorICBjbGFzcyBXaW5kb3dzTWFuaWZlc3RNZXJnZXJJbXBsOworICBzdGQ6OnVuaXF1ZV9wdHI8V2luZG93c01hbmlmZXN0TWVyZ2VySW1wbD4gSW1wbDsKK307CisKK30gLy8gbmFtZXNwYWNlIHdpbmRvd3NfbWFuaWZlc3QKK30gLy8gbmFtZXNwYWNlIGxsdm0KKyNlbmRpZgpkaWZmIC0tZ2l0IGEvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9XaW5kb3dzUmVzb3VyY2UvUmVzb3VyY2VQcm9jZXNzb3IuaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vV2luZG93c1Jlc291cmNlL1Jlc291cmNlUHJvY2Vzc29yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGNhMGE0YgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vV2luZG93c1Jlc291cmNlL1Jlc291cmNlUHJvY2Vzc29yLmgKQEAgLTAsMCArMSw1MSBAQAorLy89PT0tLSBSZXNvdXJjZVByb2Nlc3Nvci5oIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKystKi09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JTkNMVURFX0xMVk1fU1VQUE9SVF9XSU5ET1dTX1JFU09VUkNFX1BST0NFU1NPUl9ICisjZGVmaW5lIExMVk1fSU5DTFVERV9MTFZNX1NVUFBPUlRfV0lORE9XU19SRVNPVVJDRV9QUk9DRVNTT1JfSAorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nTWFwLmgiCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L3Jhd19vc3RyZWFtLmgiCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaW5jbHVkZSA8dmVjdG9yPgorCisKK25hbWVzcGFjZSBsbHZtIHsKKworY2xhc3MgV2luZG93c1Jlc291cmNlUHJvY2Vzc29yIHsKK3B1YmxpYzoKKyAgdXNpbmcgUGF0aFR5cGUgPSBTbWFsbFZlY3RvcjxjaGFyLCA2ND47CisKKyAgV2luZG93c1Jlc291cmNlUHJvY2Vzc29yKCkge30KKworICB2b2lkIGFkZERlZmluZShTdHJpbmdSZWYgS2V5LCBTdHJpbmdSZWYgVmFsdWUgPSBTdHJpbmdSZWYoKSkgeworICAgIFByZXByb2Nlc3NvckRlZmluZXMuZW1wbGFjZV9iYWNrKEtleSwgVmFsdWUpOworICB9CisgIHZvaWQgYWRkSW5jbHVkZShjb25zdCBQYXRoVHlwZSAmSW5jbHVkZVBhdGgpIHsKKyAgICBJbmNsdWRlTGlzdC5wdXNoX2JhY2soSW5jbHVkZVBhdGgpOworICB9CisgIHZvaWQgc2V0VmVyYm9zZShib29sIFZlcmJvc2UpIHsgSXNWZXJib3NlID0gVmVyYm9zZTsgfQorICB2b2lkIHNldE51bGxBdEVuZChib29sIE51bGxBdEVuZCkgeyBBcHBlbmROdWxsID0gTnVsbEF0RW5kOyB9CisKKyAgRXJyb3IgcHJvY2VzcyhTdHJpbmdSZWYgSW5wdXREYXRhLAorICAgIHN0ZDo6dW5pcXVlX3B0cjxyYXdfZmRfb3N0cmVhbT4gT3V0cHV0U3RyZWFtKTsKKworcHJpdmF0ZToKKyAgU3RyaW5nUmVmIElucHV0RGF0YTsKKyAgc3RkOjp2ZWN0b3I8UGF0aFR5cGU+IEluY2x1ZGVMaXN0OworICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8U3RyaW5nUmVmLCBTdHJpbmdSZWY+PiBQcmVwcm9jZXNzb3JEZWZpbmVzOworICBib29sIElzVmVyYm9zZSwgQXBwZW5kTnVsbDsKK307CisKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1dpbmRvd3NSZXNvdXJjZS9SZXNvdXJjZVNjcmlwdFRva2VuLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1dpbmRvd3NSZXNvdXJjZS9SZXNvdXJjZVNjcmlwdFRva2VuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDk0YWUzMgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vV2luZG93c1Jlc291cmNlL1Jlc291cmNlU2NyaXB0VG9rZW4uaApAQCAtMCwwICsxLDU5IEBACisvLz09PS0tIFJlc291cmNlU2NyaXB0VG9rZW4uaCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKy0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGRlY2xhcmVzIHRoZSAucmMgc2NyaXB0IHRva2Vucy4KKy8vIFRoZSBsaXN0IG9mIGF2YWlsYWJsZSB0b2tlbnMgaXMgbG9jYXRlZCBhdCBSZXNvdXJjZVNjcmlwdFRva2VuTGlzdC5oLgorLy8KKy8vIFJlZjogbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2luZG93cy9kZXNrdG9wL2FhMzgwNTk5KHY9dnMuODUpLmFzcHgKKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9JTkNMVURFX0xMVk1fU1VQUE9SVF9XSU5ET1dTX1JFU09VUkNFX1NDUklQVFRPS0VOX0gKKyNkZWZpbmUgTExWTV9JTkNMVURFX0xMVk1fU1VQUE9SVF9XSU5ET1dTX1JFU09VUkNFX1NDUklQVFRPS0VOX0gKKworI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorCituYW1lc3BhY2UgbGx2bSB7CisKKy8vIEEgZGVmaW5pdGlvbiBvZiBhIHNpbmdsZSByZXNvdXJjZSBzY3JpcHQgdG9rZW4uIEVhY2ggdG9rZW4gaGFzIGl0cyBraW5kCisvLyAoZGVjbGFyZWQgaW4gUmVzb3VyY2VTY3JpcHRUb2tlbkxpc3QpIGFuZCBob2xkcyBhIHZhbHVlIC0gYSByZWZlcmVuY2UKKy8vIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB0b2tlbi4KKy8vIFJDVG9rZW4gZG9lcyBub3QgY2xhaW0gb3duZXJzaGlwIG9uIGl0cyB2YWx1ZS4gQSBtZW1vcnkgYnVmZmVyIGNvbnRhaW5pbmcKKy8vIHRoZSB0b2tlbiB2YWx1ZSBzaG91bGQgYmUgc3RvcmVkIGluIGEgc2FmZSBwbGFjZSBhbmQgY2Fubm90IGJlIGZyZWVkCisvLyBub3IgcmVhbGxvY2F0ZWQuCitjbGFzcyBSQ1Rva2VuIHsKK3B1YmxpYzoKKyAgZW51bSBjbGFzcyBLaW5kIHsKKyNkZWZpbmUgVE9LRU4oTmFtZSkgTmFtZSwKKyNkZWZpbmUgU0hPUlRfVE9LRU4oTmFtZSwgQ2gpIE5hbWUsCisjaW5jbHVkZSAiUmVzb3VyY2VTY3JpcHRUb2tlbkxpc3QuaCIKKyN1bmRlZiBUT0tFTgorI3VuZGVmIFNIT1JUX1RPS0VOCisgIH07CisKKyAgUkNUb2tlbihSQ1Rva2VuOjpLaW5kIFJDVG9rZW5LaW5kLCBTdHJpbmdSZWYgVmFsdWUpOworCisgIC8vIEdldCBhbiBpbnRlZ2VyIHZhbHVlIG9mIHRoZSBpbnRlZ2VyIHRva2VuLgorICB1aW50MzJfdCBpbnRWYWx1ZSgpIGNvbnN0OworICBib29sIGlzTG9uZ0ludCgpIGNvbnN0OworCisgIFN0cmluZ1JlZiB2YWx1ZSgpIGNvbnN0OworICBLaW5kIGtpbmQoKSBjb25zdDsKKworICAvLyBDaGVjayBpZiBhIHRva2VuIGRlc2NyaWJlcyBhIGJpbmFyeSBvcGVyYXRvci4KKyAgYm9vbCBpc0JpbmFyeU9wKCkgY29uc3Q7CisKK3ByaXZhdGU6CisgIEtpbmQgVG9rZW5LaW5kOworICBTdHJpbmdSZWYgVG9rZW5WYWx1ZTsKK307CisKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1dpbmRvd3NSZXNvdXJjZS9SZXNvdXJjZVNjcmlwdFRva2VuTGlzdC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9XaW5kb3dzUmVzb3VyY2UvUmVzb3VyY2VTY3JpcHRUb2tlbkxpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmVlZDExCi0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9XaW5kb3dzUmVzb3VyY2UvUmVzb3VyY2VTY3JpcHRUb2tlbkxpc3QuaApAQCAtMCwwICsxLDM1IEBACisvLz09PS0tIFJlc291cmNlU2NyaXB0VG9rZW5MaXN0LmggLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSotIEMrKy0qLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBUaGlzIGlzIGEgcGFydCBvZiBsbHZtLXJjIHRva2VucyBoZWFkZXIuIEl0IGxpc3RzIGFsbCB0aGUgcG9zc2libGUgdG9rZW5zCisvLyB0aGF0IG1pZ2h0IG9jY3VyIGluIGEgY29ycmVjdCAucmMgc2NyaXB0LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyBMb25nIHRva2Vucy4gVGhleSBtaWdodCBjb25zaXN0IG9mIG1vcmUgdGhhbiBvbmUgY2hhcmFjdGVyLgorVE9LRU4oSW52YWxpZCkgICAgICAvLyBJbnZhbGlkIHRva2VuLiBTaG91bGQgbm90IG9jY3VyIGluIGEgdmFsaWQgc2NyaXB0LgorVE9LRU4oSW50KSAgICAgICAgICAvLyBJbnRlZ2VyIChkZWNpbWFsLCBvY3RhbCBvciBoZXhhZGVjaW1hbCkuCitUT0tFTihTdHJpbmcpICAgICAgIC8vIFN0cmluZyB2YWx1ZS4KK1RPS0VOKElkZW50aWZpZXIpICAgLy8gU2NyaXB0IGlkZW50aWZpZXIgKHJlc291cmNlIG5hbWUgb3IgdHlwZSkuCisKKy8vIFNob3J0IHRva2Vucy4gVGhleSB1c3VhbGx5IGNvbnNpc3Qgb2YgZXhhY3RseSBvbmUgY2hhcmFjdGVyLgorLy8gVGhlIGRlZmluaXRpb25zIGFyZSBvZiB0aGUgZm9ybSBTSE9SVF9UT0tFTihUb2tlbk5hbWUsIFRva2VuQ2hhcikuCisvLyBUb2tlbkNoYXIgaXMgdGhlIG9uZS1jaGFyYWN0ZXIgdG9rZW4gcmVwcmVzZW50YXRpb24gb2NjdXJpbmcgaW4gdGhlIGNvcnJlY3QKKy8vIC5yYyBzY3JpcHRzLgorU0hPUlRfVE9LRU4oQmxvY2tCZWdpbiwgJ3snKSAgIC8vIFN0YXJ0IG9mIHRoZSBzY3JpcHQgYmxvY2s7IGNhbiBhbHNvIGJlIEJFR0lOLgorU0hPUlRfVE9LRU4oQmxvY2tFbmQsICd9JykgICAgIC8vIEVuZCBvZiB0aGUgYmxvY2s7IGNhbiBhbHNvIGJlIEVORC4KK1NIT1JUX1RPS0VOKENvbW1hLCAnLCcpICAgICAgICAvLyBDb21tYSAtIHJlc291cmNlIGFyZ3VtZW50cyBzZXBhcmF0b3IuCitTSE9SVF9UT0tFTihQbHVzLCAnKycpICAgICAgICAgLy8gQWRkaXRpb24gb3BlcmF0b3IuCitTSE9SVF9UT0tFTihNaW51cywgJy0nKSAgICAgICAgLy8gU3VidHJhY3Rpb24gb3BlcmF0b3IuCitTSE9SVF9UT0tFTihQaXBlLCAnfCcpICAgICAgICAgLy8gQml0d2lzZS1PUiBvcGVyYXRvci4KK1NIT1JUX1RPS0VOKEFtcCwgJyYnKSAgICAgICAgICAvLyBCaXR3aXNlLUFORCBvcGVyYXRvci4KK1NIT1JUX1RPS0VOKFRpbGRlLCAnficpICAgICAgICAvLyBCaXR3aXNlLU5PVCBvcGVyYXRvci4KK1NIT1JUX1RPS0VOKExlZnRQYXJlbiwgJygnKSAgICAvLyBMZWZ0IHBhcmVudGhlc2lzIGluIHRoZSBzY3JpcHQgZXhwcmVzc2lvbnMuCitTSE9SVF9UT0tFTihSaWdodFBhcmVuLCAnKScpICAgLy8gUmlnaHQgcGFyZW50aGVzaXMuCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1hSYXkvR3JhcGguaCBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vWFJheS9HcmFwaC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0ZDM0YTgKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1hSYXkvR3JhcGguaApAQCAtMCwwICsxLDQ5NCBAQAorLy89PT0tLSBHcmFwaC5oIC0gWFJheSBHcmFwaCBDbGFzcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBBIEdyYXBoIERhdGF0eXBlIGZvciBYUmF5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9YUkFZX0dSQVBIX1RfSAorI2RlZmluZSBMTFZNX1hSQVlfR1JBUEhfVF9ICisKKyNpbmNsdWRlIDxpbml0aWFsaXplcl9saXN0PgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgPHR5cGVfdHJhaXRzPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKKyNpbmNsdWRlICJsbHZtL0FEVC9EZW5zZU1hcC5oIgorI2luY2x1ZGUgImxsdm0vQURUL0RlbnNlU2V0LmgiCisjaW5jbHVkZSAibGx2bS9BRFQvaXRlcmF0b3IuaCIKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvRXJyb3IuaCIKKworbmFtZXNwYWNlIGxsdm0geworbmFtZXNwYWNlIHhyYXkgeworCisvLy8gQSBHcmFwaCBvYmplY3QgcmVwcmVzZW50cyBhIERpcmVjdGVkIEdyYXBoIGFuZCBpcyB1c2VkIGluIFhSYXkgdG8gY29tcHV0ZQorLy8vIGFuZCBzdG9yZSBmdW5jdGlvbiBjYWxsIGdyYXBocyBhbmQgYXNzb2NpYXRlZCBzdGF0aXN0aWNhbCBpbmZvcm1hdGlvbi4KKy8vLworLy8vIFRoZSBncmFwaCB0YWtlcyBpbiBmb3VyIHRlbXBsYXRlIHBhcmFtZXRlcnMsIHRoZXNlIGFyZToKKy8vLyAgLSBWZXJ0ZXhBdHRyaWJ1dGUsIHRoaXMgaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggaXMgc3RvcmVkIGZvciBlYWNoIHZlcnRleC4KKy8vLyAgICBNdXN0IGJlIERlZmF1bHRDb25zdHJ1Y3RpYmxlLCBDb3B5Q29uc3RydWN0aWJsZSwgQ29weUFzc2lnbmFibGUgYW5kCisvLy8gICAgRGVzdHJ1Y3RpYmxlLgorLy8vICAtIEVkZ2VBdHRyaWJ1dGUsIHRoaXMgaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggaXMgc3RvcmVkIGZvciBlYWNoIGVkZ2UKKy8vLyAgICBNdXN0IGJlIERlZmF1bHRDb25zdHJ1Y3RpYmxlLCBDb3B5Q29uc3RydWN0aWJsZSwgQ29weUFzc2lnbmFibGUgYW5kCisvLy8gICAgRGVzdHJ1Y3RpYmxlLgorLy8vICAtIEVkZ2VBdHRyaWJ1dGUsIHRoaXMgaXMgYSBzdHJ1Y3R1cmUgd2hpY2ggaXMgc3RvcmVkIGZvciBlYWNoIHZhcmlhYmxlCisvLy8gIC0gVkksIHRoaXMgaXMgYSB0eXBlIG92ZXIgd2hpY2ggRGVuc2VNYXBJbmZvIGlzIGRlZmluZWQgYW5kIGlzIHRoZSB0eXBlCisvLy8gICAgdXNlZCBsb29rIHVwIHN0cmluZ3MsIGF2YWlsYWJsZSBhcyBWZXJ0ZXhJZGVudGlmaWVyLgorLy8vICAtIElmIHRoZSBidWlsdCBpbiBEZW5zZU1hcEluZm8gaXMgbm90IGRlZmluZWQsIHByb3ZpZGUgYSBzcGVjaWFsaXphdGlvbgorLy8vICAgIGNsYXNzIHR5cGUgaGVyZS4KKy8vLworLy8vIEdyYXBoIGlzIENvcHlDb25zdHJ1Y3RpYmxlLCBDb3B5QXNzaWduYWJsZSwgTW92ZUNvbnN0cnVjdGlibGUgYW5kCisvLy8gTW92ZUFzc2lnbmFibGUgYnV0IGlzIG5vdCBFcXVhbGl0eUNvbXBhcmlibGUgb3IgTGVzc1RoYW5Db21wYXJpYmxlLgorLy8vCisvLy8gVXNhZ2UgRXhhbXBsZSBHcmFwaCB3aXRoIHdlaWdodGVkIGVkZ2VzIGFuZCB2ZXJ0aWNlczoKKy8vLyAgIEdyYXBoPGludCwgaW50LCBpbnQ+IEc7CisvLy8KKy8vLyAgIEdbMV0gPSAwOworLy8vICAgR1syXSA9IDI7CisvLy8gICBHW3sxLDJ9XSA9IDE7CisvLy8gICBHW3syLDF9XSA9IC0xOworLy8vICAgZm9yKGNvbnN0IGF1dG8gJnYgOiBHLnZlcnRpY2VzKCkpeworLy8vICAgICAvLyBEbyBzb21ldGhpbmcgd2l0aCB0aGUgdmVydGljZXMgaW4gdGhlIGdyYXBoOworLy8vICAgfQorLy8vICAgZm9yKGNvbnN0IGF1dG8gJmUgOiBHLmVkZ2VzKCkpeworLy8vICAgICAvLyBEbyBzb21ldGhpbmcgd2l0aCB0aGUgZWRnZXMgaW4gdGhlIGdyYXBoOworLy8vICAgfQorLy8vCisvLy8gVXNhZ2UgRXhhbXBsZSB3aXRoIFN0clJlZiBrZXlzLgorLy8vICAgR3JhcGg8aW50LCBkb3VibGUsIFN0clJlZj4gU3RyRzsKKy8vLyAgICBjaGFyIHZhW10gPSAiVmVydGV4IEEiOworLy8vICAgIGNoYXIgdmFhW10gPSAiVmVydGV4IEEiOworLy8vICAgIGNoYXIgdmJbXSA9ICJWZXJ0ZXggQiI7IC8vIFZlcnRpY2VzIGFyZSByZWZlcmVuY2VkIGJ5IFN0cmluZyBSZWZzLgorLy8vICAgIEdbdmFdID0gMDsKKy8vLyAgICBHW3ZiXSA9IDE7CisvLy8gICAgR1t7dmEsIHZifV0gPSAxLjA7CisvLy8gICAgY291dCgpIDw8IEdbdmFhXSA8PCAiICIgPDwgR1t7dmFhLCB2Yn1dOyAvL3ByaW50cyAiMCAxLjAiLgorLy8vCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVmVydGV4QXR0cmlidXRlLCB0eXBlbmFtZSBFZGdlQXR0cmlidXRlLAorICAgICAgICAgIHR5cGVuYW1lIFZJID0gaW50MzJfdD4KK2NsYXNzIEdyYXBoIHsKK3B1YmxpYzoKKyAgLy8vIFRoZXNlIG9iamVjdHMgYXJlIHVzZWQgdG8gbmFtZSBlZGdlcyBhbmQgdmVydGljZXMgaW4gdGhlIGdyYXBoLgorICB0eXBlZGVmIFZJIFZlcnRleElkZW50aWZpZXI7CisgIHR5cGVkZWYgc3RkOjpwYWlyPFZJLCBWST4gRWRnZUlkZW50aWZpZXI7CisKKyAgLy8vIFRoaXMgdHlwZSBpcyB0aGUgdmFsdWVfdHlwZSBvZiBhbGwgaXRlcmF0b3JzIHdoaWNoIHJhbmdlIG92ZXIgdmVydGljZXMsCisgIC8vLyBEZXRlcm1pbmVkIGJ5IHRoZSBWZXJ0aWNlcyBEZW5zZU1hcAorICB1c2luZyBWZXJ0ZXhWYWx1ZVR5cGUgPQorICAgICAgZGV0YWlsOjpEZW5zZU1hcFBhaXI8VmVydGV4SWRlbnRpZmllciwgVmVydGV4QXR0cmlidXRlPjsKKworICAvLy8gVGhpcyB0eXBlIGlzIHRoZSB2YWx1ZV90eXBlIG9mIGFsbCBpdGVyYXRvcnMgd2hpY2ggcmFuZ2Ugb3ZlciBlZGdlcywKKyAgLy8vIERldGVybWluZWQgYnkgdGhlIEVkZ2VzIERlbnNlTWFwLgorICB1c2luZyBFZGdlVmFsdWVUeXBlID0gZGV0YWlsOjpEZW5zZU1hcFBhaXI8RWRnZUlkZW50aWZpZXIsIEVkZ2VBdHRyaWJ1dGU+OworCisgIHVzaW5nIHNpemVfdHlwZSA9IHN0ZDo6c2l6ZV90OworCitwcml2YXRlOgorICAvLy8gVGhlIHR5cGUgdXNlZCBmb3Igc3RvcmluZyB0aGUgRWRnZUF0dHJpYnV0ZSBmb3IgZWFjaCBlZGdlIGluIHRoZSBncmFwaAorICB1c2luZyBFZGdlTWFwVCA9IERlbnNlTWFwPEVkZ2VJZGVudGlmaWVyLCBFZGdlQXR0cmlidXRlPjsKKworICAvLy8gVGhlIHR5cGUgdXNlZCBmb3Igc3RvcmluZyB0aGUgVmVydGV4QXR0cmlidXRlIGZvciBlYWNoIHZlcnRleCBpbgorICAvLy8gdGhlIGdyYXBoLgorICB1c2luZyBWZXJ0ZXhNYXBUID0gRGVuc2VNYXA8VmVydGV4SWRlbnRpZmllciwgVmVydGV4QXR0cmlidXRlPjsKKworICAvLy8gVGhlIHR5cGUgdXNlZCBmb3Igc3RvcmluZyB0aGUgZWRnZXMgZW50ZXJpbmcgYSB2ZXJ0ZXguIEluZGV4ZWQgYnkKKyAgLy8vIHRoZSBWZXJ0ZXhJZGVudGlmaWVyIG9mIHRoZSBzdGFydCBvZiB0aGUgZWRnZS4gT25seSB1c2VkIHRvIGRldGVybWluZQorICAvLy8gd2hlcmUgdGhlIGluY29taW5nIGVkZ2VzIGFyZSwgdGhlIEVkZ2VJZGVudGlmaWVycyBhcmUgc3RvcmVkIGluIGFuCisgIC8vLyBJbm5lckVkZ2VNYXBULgorICB1c2luZyBOZWlnaGJvclNldFQgPSBEZW5zZVNldDxWZXJ0ZXhJZGVudGlmaWVyPjsKKworICAvLy8gVGhlIHR5cGUgc3RvcmluZyB0aGUgSW5uZXJJbnZHcmFwaFQgY29ycmVzcG9uZGluZyB0byBlYWNoIHZlcnRleCBpbgorICAvLy8gdGhlIGdyYXBoIChXaGVuIGEgdmVydGV4IGhhcyBhbiBpbmNvbWluZyBlZGdlIGluY2lkZW50IHRvIGl0KQorICB1c2luZyBOZWlnaGJvckxvb2t1cFQgPSBEZW5zZU1hcDxWZXJ0ZXhJZGVudGlmaWVyLCBOZWlnaGJvclNldFQ+OworCitwcml2YXRlOgorICAvLy8gU3RvcmVzIHRoZSBtYXAgZnJvbSB0aGUgc3RhcnQgYW5kIGVuZCB2ZXJ0ZXggb2YgYW4gZWRnZSB0byBpdCdzCisgIC8vLyBFZGdlQXR0cmlidXRlCisgIEVkZ2VNYXBUIEVkZ2VzOworCisgIC8vLyBTdG9yZXMgdGhlIG1hcCBmcm9tIFZlcnRleElkZW50aWZpZXIgdG8gVmVydGV4QXR0cmlidXRlCisgIFZlcnRleE1hcFQgVmVydGljZXM7CisKKyAgLy8vIEFsbG93cyBmYXN0IGxvb2t1cCBmb3IgdGhlIGluY29taW5nIGVkZ2Ugc2V0IG9mIGFueSBnaXZlbiB2ZXJ0ZXguCisgIE5laWdoYm9yTG9va3VwVCBJbk5laWdoYm9yczsKKworICAvLy8gQWxsb3dzIGZhc3QgbG9va3VwIGZvciB0aGUgb3V0Z29pbmcgZWRnZSBzZXQgb2YgYW55IGdpdmVuIHZlcnRleC4KKyAgTmVpZ2hib3JMb29rdXBUIE91dE5laWdoYm9yczsKKworICAvLy8gQW4gSXRlcmF0b3IgYWRhcHRlciB1c2luZyBhbiBJbm5lckludkdyYXBoVDo6aXRlcmF0b3IgYXMgYSBiYXNlIGl0ZXJhdG9yLAorICAvLy8gYW5kIHN0b3JpbmcgdGhlIFZlcnRleElkZW50aWZpZXIgdGhlIGl0ZXJhdG9yIHJhbmdlIGNvbWVzIGZyb20uIFRoZQorICAvLy8gZGVyZWZlcmVuY2Ugb3BlcmF0b3IgaXMgdGhlbiBwZXJmb3JtZWQgdXNpbmcgYSBwb2ludGVyIHRvIHRoZSBncmFwaCdzIGVkZ2UKKyAgLy8vIHNldC4KKyAgdGVtcGxhdGUgPGJvb2wgSXNDb25zdCwgYm9vbCBJc091dCwKKyAgICAgICAgICAgIHR5cGVuYW1lIEJhc2VJdCA9IHR5cGVuYW1lIE5laWdoYm9yU2V0VDo6Y29uc3RfaXRlcmF0b3IsCisgICAgICAgICAgICB0eXBlbmFtZSBUID0gdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxJc0NvbnN0LCBjb25zdCBFZGdlVmFsdWVUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRWRnZVZhbHVlVHlwZT46OnR5cGU+CisgIGNsYXNzIE5laWdoYm9yRWRnZUl0ZXJhdG9yVAorICAgICAgOiBwdWJsaWMgaXRlcmF0b3JfYWRhcHRvcl9iYXNlPAorICAgICAgICAgICAgTmVpZ2hib3JFZGdlSXRlcmF0b3JUPElzQ29uc3QsIElzT3V0PiwgQmFzZUl0LAorICAgICAgICAgICAgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8QmFzZUl0Pjo6aXRlcmF0b3JfY2F0ZWdvcnksIFQ+IHsKKyAgICB1c2luZyBJbnRlcm5hbEVkZ2VNYXBUID0KKyAgICAgICAgdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxJc0NvbnN0LCBjb25zdCBFZGdlTWFwVCwgRWRnZU1hcFQ+Ojp0eXBlOworCisgICAgZnJpZW5kIGNsYXNzIE5laWdoYm9yRWRnZUl0ZXJhdG9yVDxmYWxzZSwgSXNPdXQsIEJhc2VJdCwgRWRnZVZhbHVlVHlwZT47CisgICAgZnJpZW5kIGNsYXNzIE5laWdoYm9yRWRnZUl0ZXJhdG9yVDx0cnVlLCBJc091dCwgQmFzZUl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRWRnZVZhbHVlVHlwZT47CisKKyAgICBJbnRlcm5hbEVkZ2VNYXBUICpNUDsKKyAgICBWZXJ0ZXhJZGVudGlmaWVyIFNJOworCisgIHB1YmxpYzoKKyAgICB0ZW1wbGF0ZSA8Ym9vbCBJc0NvbnN0RGVzdCwKKyAgICAgICAgICAgICAgdHlwZW5hbWUgPSB0eXBlbmFtZSBzdGQ6OmVuYWJsZV9pZjxJc0NvbnN0RGVzdCAmJiAhSXNDb25zdD46OnR5cGU+CisgICAgb3BlcmF0b3IgTmVpZ2hib3JFZGdlSXRlcmF0b3JUPElzQ29uc3REZXN0LCBJc091dCwgQmFzZUl0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFZGdlVmFsdWVUeXBlPigpIGNvbnN0IHsKKyAgICAgIHJldHVybiBOZWlnaGJvckVkZ2VJdGVyYXRvclQ8SXNDb25zdERlc3QsIElzT3V0LCBCYXNlSXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVkZ2VWYWx1ZVR5cGU+KHRoaXMtPkksIE1QLCBTSSk7CisgICAgfQorCisgICAgTmVpZ2hib3JFZGdlSXRlcmF0b3JUKCkgPSBkZWZhdWx0OworICAgIE5laWdoYm9yRWRnZUl0ZXJhdG9yVChCYXNlSXQgX0ksIEludGVybmFsRWRnZU1hcFQgKl9NUCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgVmVydGV4SWRlbnRpZmllciBfU0kpCisgICAgICAgIDogaXRlcmF0b3JfYWRhcHRvcl9iYXNlPAorICAgICAgICAgICAgICBOZWlnaGJvckVkZ2VJdGVyYXRvclQ8SXNDb25zdCwgSXNPdXQ+LCBCYXNlSXQsCisgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPEJhc2VJdD46Oml0ZXJhdG9yX2NhdGVnb3J5LCBUPihfSSksCisgICAgICAgICAgTVAoX01QKSwgU0koX1NJKSB7fQorCisgICAgVCAmb3BlcmF0b3IqKCkgY29uc3QgeworICAgICAgaWYgKCFJc091dCkKKyAgICAgICAgcmV0dXJuICooTVAtPmZpbmQoeyoodGhpcy0+SSksIFNJfSkpOworICAgICAgZWxzZQorICAgICAgICByZXR1cm4gKihNUC0+ZmluZCh7U0ksICoodGhpcy0+SSl9KSk7CisgICAgfQorICB9OworCitwdWJsaWM6CisgIC8vLyBBIGNvbnN0IGl0ZXJhdG9yIHR5cGUgZm9yIGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBzZXQgb2YgZWRnZXMgZW50ZXJpbmcgYQorICAvLy8gdmVydGV4LgorICAvLy8KKyAgLy8vIEhhcyBhIGNvbnN0IEVkZ2VWYWx1ZVR5cGUgYXMgaXRzIHZhbHVlX3R5cGUKKyAgdXNpbmcgQ29uc3RJbkVkZ2VJdGVyYXRvciA9IE5laWdoYm9yRWRnZUl0ZXJhdG9yVDx0cnVlLCBmYWxzZT47CisKKyAgLy8vIEFuIGl0ZXJhdG9yIHR5cGUgZm9yIGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBzZXQgb2YgZWRnZXMgbGVhdmluZyBhIHZlcnRleC4KKyAgLy8vCisgIC8vLyBIYXMgYW4gRWRnZVZhbHVlVHlwZSBhcyBpdHMgdmFsdWVfdHlwZQorICB1c2luZyBJbkVkZ2VJdGVyYXRvciA9IE5laWdoYm9yRWRnZUl0ZXJhdG9yVDxmYWxzZSwgZmFsc2U+OworCisgIC8vLyBBIGNvbnN0IGl0ZXJhdG9yIHR5cGUgZm9yIGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBzZXQgb2YgZWRnZXMgZW50ZXJpbmcgYQorICAvLy8gdmVydGV4LgorICAvLy8KKyAgLy8vIEhhcyBhIGNvbnN0IEVkZ2VWYWx1ZVR5cGUgYXMgaXRzIHZhbHVlX3R5cGUKKyAgdXNpbmcgQ29uc3RPdXRFZGdlSXRlcmF0b3IgPSBOZWlnaGJvckVkZ2VJdGVyYXRvclQ8dHJ1ZSwgdHJ1ZT47CisKKyAgLy8vIEFuIGl0ZXJhdG9yIHR5cGUgZm9yIGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBzZXQgb2YgZWRnZXMgbGVhdmluZyBhIHZlcnRleC4KKyAgLy8vCisgIC8vLyBIYXMgYW4gRWRnZVZhbHVlVHlwZSBhcyBpdHMgdmFsdWVfdHlwZQorICB1c2luZyBPdXRFZGdlSXRlcmF0b3IgPSBOZWlnaGJvckVkZ2VJdGVyYXRvclQ8ZmFsc2UsIHRydWU+OworCisgIC8vLyBBIGNsYXNzIGZvciByYW5naW5nIG92ZXIgdGhlIGluY29taW5nIGVkZ2VzIGluY2lkZW50IHRvIGEgdmVydGV4LgorICAvLy8KKyAgLy8vIExpa2UgYWxsIHZpZXdzIGluIHRoaXMgY2xhc3MgaXQgcHJvdmlkZXMgbWV0aG9kcyB0byBnZXQgdGhlIGJlZ2lubmluZyBhbmQKKyAgLy8vIHBhc3QgdGhlIHJhbmdlIGl0ZXJhdG9ycyBmb3IgdGhlIHJhbmdlLCBhcyB3ZWxsIGFzIG1ldGhvZHMgdG8gZGV0ZXJtaW5lCisgIC8vLyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoZSByYW5nZSBhbmQgd2hldGhlciB0aGUgcmFuZ2UgaXMgZW1wdHkuCisgIHRlbXBsYXRlIDxib29sIGlzQ29uc3QsIGJvb2wgaXNPdXQ+IGNsYXNzIEluT3V0RWRnZVZpZXcgeworICBwdWJsaWM6CisgICAgdXNpbmcgaXRlcmF0b3IgPSBOZWlnaGJvckVkZ2VJdGVyYXRvclQ8aXNDb25zdCwgaXNPdXQ+OworICAgIHVzaW5nIGNvbnN0X2l0ZXJhdG9yID0gTmVpZ2hib3JFZGdlSXRlcmF0b3JUPHRydWUsIGlzT3V0PjsKKyAgICB1c2luZyBHcmFwaFQgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPGlzQ29uc3QsIGNvbnN0IEdyYXBoLCBHcmFwaD46OnR5cGU7CisgICAgdXNpbmcgSW50ZXJuYWxFZGdlTWFwVCA9CisgICAgICAgIHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8aXNDb25zdCwgY29uc3QgRWRnZU1hcFQsIEVkZ2VNYXBUPjo6dHlwZTsKKworICBwcml2YXRlOgorICAgIEludGVybmFsRWRnZU1hcFQgJk07CisgICAgY29uc3QgVmVydGV4SWRlbnRpZmllciBBOworICAgIGNvbnN0IE5laWdoYm9yTG9va3VwVCAmTkw7CisKKyAgcHVibGljOgorICAgIGl0ZXJhdG9yIGJlZ2luKCkgeworICAgICAgYXV0byBJdCA9IE5MLmZpbmQoQSk7CisgICAgICBpZiAoSXQgPT0gTkwuZW5kKCkpCisgICAgICAgIHJldHVybiBpdGVyYXRvcigpOworICAgICAgcmV0dXJuIGl0ZXJhdG9yKEl0LT5zZWNvbmQuYmVnaW4oKSwgJk0sIEEpOworICAgIH0KKworICAgIGNvbnN0X2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0IHsKKyAgICAgIGF1dG8gSXQgPSBOTC5maW5kKEEpOworICAgICAgaWYgKEl0ID09IE5MLmVuZCgpKQorICAgICAgICByZXR1cm4gY29uc3RfaXRlcmF0b3IoKTsKKyAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcihJdC0+c2Vjb25kLmJlZ2luKCksICZNLCBBKTsKKyAgICB9CisKKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIGNiZWdpbigpOyB9CisKKyAgICBpdGVyYXRvciBlbmQoKSB7CisgICAgICBhdXRvIEl0ID0gTkwuZmluZChBKTsKKyAgICAgIGlmIChJdCA9PSBOTC5lbmQoKSkKKyAgICAgICAgcmV0dXJuIGl0ZXJhdG9yKCk7CisgICAgICByZXR1cm4gaXRlcmF0b3IoSXQtPnNlY29uZC5lbmQoKSwgJk0sIEEpOworICAgIH0KKyAgICBjb25zdF9pdGVyYXRvciBjZW5kKCkgY29uc3QgeworICAgICAgYXV0byBJdCA9IE5MLmZpbmQoQSk7CisgICAgICBpZiAoSXQgPT0gTkwuZW5kKCkpCisgICAgICAgIHJldHVybiBjb25zdF9pdGVyYXRvcigpOworICAgICAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yKEl0LT5zZWNvbmQuZW5kKCksICZNLCBBKTsKKyAgICB9CisKKyAgICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBjZW5kKCk7IH0KKworICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeworICAgICAgYXV0byBJID0gTkwuZmluZChBKTsKKyAgICAgIGlmIChJID09IE5MLmVuZCgpKQorICAgICAgICByZXR1cm4gMDsKKyAgICAgIGVsc2UKKyAgICAgICAgcmV0dXJuIEktPnNlY29uZC5zaXplKCk7CisgICAgfQorCisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIE5MLmNvdW50KEEpID09IDA7IH07CisKKyAgICBJbk91dEVkZ2VWaWV3KEdyYXBoVCAmRywgVmVydGV4SWRlbnRpZmllciBBKQorICAgICAgICA6IE0oRy5FZGdlcyksIEEoQSksIE5MKGlzT3V0ID8gRy5PdXROZWlnaGJvcnMgOiBHLkluTmVpZ2hib3JzKSB7fQorICB9OworCisgIC8vLyBBIGNvbnN0IGl0ZXJhdG9yIHR5cGUgZm9yIGl0ZXJhdGluZyB0aHJvdWdoIHRoZSB3aG9sZSB2ZXJ0ZXggc2V0IG9mIHRoZQorICAvLy8gZ3JhcGguCisgIC8vLworICAvLy8gSGFzIGEgY29uc3QgVmVydGV4VmFsdWVUeXBlIGFzIGl0cyB2YWx1ZV90eXBlCisgIHVzaW5nIENvbnN0VmVydGV4SXRlcmF0b3IgPSB0eXBlbmFtZSBWZXJ0ZXhNYXBUOjpjb25zdF9pdGVyYXRvcjsKKworICAvLy8gQW4gaXRlcmF0b3IgdHlwZSBmb3IgaXRlcmF0aW5nIHRocm91Z2ggdGhlIHdob2xlIHZlcnRleCBzZXQgb2YgdGhlIGdyYXBoLgorICAvLy8KKyAgLy8vIEhhcyBhIFZlcnRleFZhbHVlVHlwZSBhcyBpdHMgdmFsdWVfdHlwZQorICB1c2luZyBWZXJ0ZXhJdGVyYXRvciA9IHR5cGVuYW1lIFZlcnRleE1hcFQ6Oml0ZXJhdG9yOworCisgIC8vLyBBIGNsYXNzIGZvciByYW5naW5nIG92ZXIgdGhlIHZlcnRpY2VzIGluIHRoZSBncmFwaC4KKyAgLy8vCisgIC8vLyBMaWtlIGFsbCB2aWV3cyBpbiB0aGlzIGNsYXNzIGl0IHByb3ZpZGVzIG1ldGhvZHMgdG8gZ2V0IHRoZSBiZWdpbm5pbmcgYW5kCisgIC8vLyBwYXN0IHRoZSByYW5nZSBpdGVyYXRvcnMgZm9yIHRoZSByYW5nZSwgYXMgd2VsbCBhcyBtZXRob2RzIHRvIGRldGVybWluZQorICAvLy8gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgYW5kIHdoZXRoZXIgdGhlIHJhbmdlIGlzIGVtcHR5LgorICB0ZW1wbGF0ZSA8Ym9vbCBpc0NvbnN0PiBjbGFzcyBWZXJ0ZXhWaWV3IHsKKyAgcHVibGljOgorICAgIHVzaW5nIGl0ZXJhdG9yID0gdHlwZW5hbWUgc3RkOjpjb25kaXRpb25hbDxpc0NvbnN0LCBDb25zdFZlcnRleEl0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJ0ZXhJdGVyYXRvcj46OnR5cGU7CisgICAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBDb25zdFZlcnRleEl0ZXJhdG9yOworICAgIHVzaW5nIEdyYXBoVCA9IHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8aXNDb25zdCwgY29uc3QgR3JhcGgsIEdyYXBoPjo6dHlwZTsKKworICBwcml2YXRlOgorICAgIEdyYXBoVCAmRzsKKworICBwdWJsaWM6CisgICAgaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBHLlZlcnRpY2VzLmJlZ2luKCk7IH0KKyAgICBpdGVyYXRvciBlbmQoKSB7IHJldHVybiBHLlZlcnRpY2VzLmVuZCgpOyB9CisgICAgY29uc3RfaXRlcmF0b3IgY2JlZ2luKCkgY29uc3QgeyByZXR1cm4gRy5WZXJ0aWNlcy5jYmVnaW4oKTsgfQorICAgIGNvbnN0X2l0ZXJhdG9yIGNlbmQoKSBjb25zdCB7IHJldHVybiBHLlZlcnRpY2VzLmNlbmQoKTsgfQorICAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gRy5WZXJ0aWNlcy5iZWdpbigpOyB9CisgICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gRy5WZXJ0aWNlcy5lbmQoKTsgfQorICAgIHNpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gRy5WZXJ0aWNlcy5zaXplKCk7IH0KKyAgICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gRy5WZXJ0aWNlcy5lbXB0eSgpOyB9CisgICAgVmVydGV4VmlldyhHcmFwaFQgJl9HKSA6IEcoX0cpIHt9CisgIH07CisKKyAgLy8vIEEgY29uc3QgaXRlcmF0b3IgZm9yIGl0ZXJhdGluZyB0aHJvdWdoIHRoZSBlbnRpcmUgZWRnZSBzZXQgb2YgdGhlIGdyYXBoLgorICAvLy8KKyAgLy8vIEhhcyBhIGNvbnN0IEVkZ2VWYWx1ZVR5cGUgYXMgaXRzIHZhbHVlX3R5cGUKKyAgdXNpbmcgQ29uc3RFZGdlSXRlcmF0b3IgPSB0eXBlbmFtZSBFZGdlTWFwVDo6Y29uc3RfaXRlcmF0b3I7CisKKyAgLy8vIEFuIGl0ZXJhdG9yIGZvciBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgZW50aXJlIGVkZ2Ugc2V0IG9mIHRoZSBncmFwaC4KKyAgLy8vCisgIC8vLyBIYXMgYW4gRWRnZVZhbHVlVHlwZSBhcyBpdHMgdmFsdWVfdHlwZQorICB1c2luZyBFZGdlSXRlcmF0b3IgPSB0eXBlbmFtZSBFZGdlTWFwVDo6aXRlcmF0b3I7CisKKyAgLy8vIEEgY2xhc3MgZm9yIHJhbmdpbmcgb3ZlciBhbGwgdGhlIGVkZ2VzIGluIHRoZSBncmFwaC4KKyAgLy8vCisgIC8vLyBMaWtlIGFsbCB2aWV3cyBpbiB0aGlzIGNsYXNzIGl0IHByb3ZpZGVzIG1ldGhvZHMgdG8gZ2V0IHRoZSBiZWdpbm5pbmcgYW5kCisgIC8vLyBwYXN0IHRoZSByYW5nZSBpdGVyYXRvcnMgZm9yIHRoZSByYW5nZSwgYXMgd2VsbCBhcyBtZXRob2RzIHRvIGRldGVybWluZQorICAvLy8gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgYW5kIHdoZXRoZXIgdGhlIHJhbmdlIGlzIGVtcHR5LgorICB0ZW1wbGF0ZSA8Ym9vbCBpc0NvbnN0PiBjbGFzcyBFZGdlVmlldyB7CisgIHB1YmxpYzoKKyAgICB1c2luZyBpdGVyYXRvciA9IHR5cGVuYW1lIHN0ZDo6Y29uZGl0aW9uYWw8aXNDb25zdCwgQ29uc3RFZGdlSXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVkZ2VJdGVyYXRvcj46OnR5cGU7CisgICAgdXNpbmcgY29uc3RfaXRlcmF0b3IgPSBDb25zdEVkZ2VJdGVyYXRvcjsKKyAgICB1c2luZyBHcmFwaFQgPSB0eXBlbmFtZSBzdGQ6OmNvbmRpdGlvbmFsPGlzQ29uc3QsIGNvbnN0IEdyYXBoLCBHcmFwaD46OnR5cGU7CisKKyAgcHJpdmF0ZToKKyAgICBHcmFwaFQgJkc7CisKKyAgcHVibGljOgorICAgIGl0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gRy5FZGdlcy5iZWdpbigpOyB9CisgICAgaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gRy5FZGdlcy5lbmQoKTsgfQorICAgIGNvbnN0X2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEcuRWRnZXMuY2JlZ2luKCk7IH0KKyAgICBjb25zdF9pdGVyYXRvciBjZW5kKCkgY29uc3QgeyByZXR1cm4gRy5FZGdlcy5jZW5kKCk7IH0KKyAgICBjb25zdF9pdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIEcuRWRnZXMuYmVnaW4oKTsgfQorICAgIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIEcuRWRnZXMuZW5kKCk7IH0KKyAgICBzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIEcuRWRnZXMuc2l6ZSgpOyB9CisgICAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIEcuRWRnZXMuZW1wdHkoKTsgfQorICAgIEVkZ2VWaWV3KEdyYXBoVCAmX0cpIDogRyhfRykge30KKyAgfTsKKworcHVibGljOgorICAvLyBUT0RPOiBpbXBsZW1lbnQgY29uc3RydWN0b3IgdG8gZW5hYmxlIEdyYXBoIEluaXRpYWxpc2F0aW9uLlwKKyAgLy8gU29tZXRoaW5nIGxpa2U6CisgIC8vICAgR3JhcGg8aW50LCBpbnQsIGludD4gRygKKyAgLy8gICB7MSwgMiwgMywgNCwgNX0sCisgIC8vICAge3sxLCAyfSwgezIsIDN9LCB7MywgNH19KTsKKworICAvLy8gRW1wdHkgdGhlIEdyYXBoCisgIHZvaWQgY2xlYXIoKSB7CisgICAgRWRnZXMuY2xlYXIoKTsKKyAgICBWZXJ0aWNlcy5jbGVhcigpOworICAgIEluTmVpZ2hib3JzLmNsZWFyKCk7CisgICAgT3V0TmVpZ2hib3JzLmNsZWFyKCk7CisgIH0KKworICAvLy8gUmV0dXJucyBhIHZpZXcgb2JqZWN0IGFsbG93aW5nIGl0ZXJhdGlvbiBvdmVyIHRoZSB2ZXJ0aWNlcyBvZiB0aGUgZ3JhcGguCisgIC8vLyBhbHNvIGFsbG93cyBhY2Nlc3MgdG8gdGhlIHNpemUgb2YgdGhlIHZlcnRleCBzZXQuCisgIFZlcnRleFZpZXc8ZmFsc2U+IHZlcnRpY2VzKCkgeyByZXR1cm4gVmVydGV4VmlldzxmYWxzZT4oKnRoaXMpOyB9CisKKyAgVmVydGV4Vmlldzx0cnVlPiB2ZXJ0aWNlcygpIGNvbnN0IHsgcmV0dXJuIFZlcnRleFZpZXc8dHJ1ZT4oKnRoaXMpOyB9CisKKyAgLy8vIFJldHVybnMgYSB2aWV3IG9iamVjdCBhbGxvd2luZyBpdGVyYXRpb24gb3ZlciB0aGUgZWRnZXMgb2YgdGhlIGdyYXBoLgorICAvLy8gYWxzbyBhbGxvd3MgYWNjZXNzIHRvIHRoZSBzaXplIG9mIHRoZSBlZGdlIHNldC4KKyAgRWRnZVZpZXc8ZmFsc2U+IGVkZ2VzKCkgeyByZXR1cm4gRWRnZVZpZXc8ZmFsc2U+KCp0aGlzKTsgfQorCisgIEVkZ2VWaWV3PHRydWU+IGVkZ2VzKCkgY29uc3QgeyByZXR1cm4gRWRnZVZpZXc8dHJ1ZT4oKnRoaXMpOyB9CisKKyAgLy8vIFJldHVybnMgYSB2aWV3IG9iamVjdCBhbGxvd2luZyBpdGVyYXRpb24gb3ZlciB0aGUgZWRnZXMgd2hpY2ggc3RhcnQgYXQKKyAgLy8vIGEgdmVydGV4IEkuCisgIEluT3V0RWRnZVZpZXc8ZmFsc2UsIHRydWU+IG91dEVkZ2VzKGNvbnN0IFZlcnRleElkZW50aWZpZXIgSSkgeworICAgIHJldHVybiBJbk91dEVkZ2VWaWV3PGZhbHNlLCB0cnVlPigqdGhpcywgSSk7CisgIH0KKworICBJbk91dEVkZ2VWaWV3PHRydWUsIHRydWU+IG91dEVkZ2VzKGNvbnN0IFZlcnRleElkZW50aWZpZXIgSSkgY29uc3QgeworICAgIHJldHVybiBJbk91dEVkZ2VWaWV3PHRydWUsIHRydWU+KCp0aGlzLCBJKTsKKyAgfQorCisgIC8vLyBSZXR1cm5zIGEgdmlldyBvYmplY3QgYWxsb3dpbmcgaXRlcmF0aW9uIG92ZXIgdGhlIGVkZ2VzIHdoaWNoIHBvaW50IHRvCisgIC8vLyBhIHZlcnRleCBJLgorICBJbk91dEVkZ2VWaWV3PGZhbHNlLCBmYWxzZT4gaW5FZGdlcyhjb25zdCBWZXJ0ZXhJZGVudGlmaWVyIEkpIHsKKyAgICByZXR1cm4gSW5PdXRFZGdlVmlldzxmYWxzZSwgZmFsc2U+KCp0aGlzLCBJKTsKKyAgfQorCisgIEluT3V0RWRnZVZpZXc8dHJ1ZSwgZmFsc2U+IGluRWRnZXMoY29uc3QgVmVydGV4SWRlbnRpZmllciBJKSBjb25zdCB7CisgICAgcmV0dXJuIEluT3V0RWRnZVZpZXc8dHJ1ZSwgZmFsc2U+KCp0aGlzLCBJKTsKKyAgfQorCisgIC8vLyBMb29rcyB1cCB0aGUgdmVydGV4IHdpdGggaWRlbnRpZmllciBJLCBpZiBpdCBkb2VzIG5vdCBleGlzdCBpdCBkZWZhdWx0CisgIC8vLyBjb25zdHJ1Y3RzIGl0LgorICBWZXJ0ZXhBdHRyaWJ1dGUgJm9wZXJhdG9yW10oY29uc3QgVmVydGV4SWRlbnRpZmllciAmSSkgeworICAgIHJldHVybiBWZXJ0aWNlcy5GaW5kQW5kQ29uc3RydWN0KEkpLnNlY29uZDsKKyAgfQorCisgIC8vLyBMb29rcyB1cCB0aGUgZWRnZSB3aXRoIGlkZW50aWZpZXIgSSwgaWYgaXQgZG9lcyBub3QgZXhpc3QgaXQgZGVmYXVsdAorICAvLy8gY29uc3RydWN0cyBpdCwgaWYgaXQncyBlbmRwb2ludHMgZG8gbm90IGV4aXN0IGl0IGFsc28gZGVmYXVsdCBjb25zdHJ1Y3RzCisgIC8vLyB0aGVtLgorICBFZGdlQXR0cmlidXRlICZvcGVyYXRvcltdKGNvbnN0IEVkZ2VJZGVudGlmaWVyICZJKSB7CisgICAgYXV0byAmUCA9IEVkZ2VzLkZpbmRBbmRDb25zdHJ1Y3QoSSk7CisgICAgVmVydGljZXMuRmluZEFuZENvbnN0cnVjdChJLmZpcnN0KTsKKyAgICBWZXJ0aWNlcy5GaW5kQW5kQ29uc3RydWN0KEkuc2Vjb25kKTsKKyAgICBJbk5laWdoYm9yc1tJLnNlY29uZF0uaW5zZXJ0KEkuZmlyc3QpOworICAgIE91dE5laWdoYm9yc1tJLmZpcnN0XS5pbnNlcnQoSS5zZWNvbmQpOworICAgIHJldHVybiBQLnNlY29uZDsKKyAgfQorCisgIC8vLyBMb29rcyB1cCBhIHZlcnRleCB3aXRoIElkZW50aWZpZXIgSSwgb3IgYW4gZXJyb3IgaWYgaXQgZG9lcyBub3QgZXhpc3QuCisgIEV4cGVjdGVkPFZlcnRleEF0dHJpYnV0ZSAmPiBhdChjb25zdCBWZXJ0ZXhJZGVudGlmaWVyICZJKSB7CisgICAgYXV0byBJdCA9IFZlcnRpY2VzLmZpbmQoSSk7CisgICAgaWYgKEl0ID09IFZlcnRpY2VzLmVuZCgpKQorICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8U3RyaW5nRXJyb3I+KAorICAgICAgICAgICJWZXJ0ZXggSWRlbnRpZmllciBEb2VzIE5vdCBFeGlzdCIsCisgICAgICAgICAgc3RkOjptYWtlX2Vycm9yX2NvZGUoc3RkOjplcnJjOjppbnZhbGlkX2FyZ3VtZW50KSk7CisgICAgcmV0dXJuIEl0LT5zZWNvbmQ7CisgIH0KKworICBFeHBlY3RlZDxjb25zdCBWZXJ0ZXhBdHRyaWJ1dGUgJj4gYXQoY29uc3QgVmVydGV4SWRlbnRpZmllciAmSSkgY29uc3QgeworICAgIGF1dG8gSXQgPSBWZXJ0aWNlcy5maW5kKEkpOworICAgIGlmIChJdCA9PSBWZXJ0aWNlcy5lbmQoKSkKKyAgICAgIHJldHVybiBtYWtlX2Vycm9yPFN0cmluZ0Vycm9yPigKKyAgICAgICAgICAiVmVydGV4IElkZW50aWZpZXIgRG9lcyBOb3QgRXhpc3QiLAorICAgICAgICAgIHN0ZDo6bWFrZV9lcnJvcl9jb2RlKHN0ZDo6ZXJyYzo6aW52YWxpZF9hcmd1bWVudCkpOworICAgIHJldHVybiBJdC0+c2Vjb25kOworICB9CisKKyAgLy8vIExvb2tzIHVwIGFuIGVkZ2Ugd2l0aCBJZGVudGlmaWVyIEksIG9yIGFuIGVycm9yIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICBFeHBlY3RlZDxFZGdlQXR0cmlidXRlICY+IGF0KGNvbnN0IEVkZ2VJZGVudGlmaWVyICZJKSB7CisgICAgYXV0byBJdCA9IEVkZ2VzLmZpbmQoSSk7CisgICAgaWYgKEl0ID09IEVkZ2VzLmVuZCgpKQorICAgICAgcmV0dXJuIG1ha2VfZXJyb3I8U3RyaW5nRXJyb3I+KAorICAgICAgICAgICJFZGdlIElkZW50aWZpZXIgRG9lcyBOb3QgRXhpc3QiLAorICAgICAgICAgIHN0ZDo6bWFrZV9lcnJvcl9jb2RlKHN0ZDo6ZXJyYzo6aW52YWxpZF9hcmd1bWVudCkpOworICAgIHJldHVybiBJdC0+c2Vjb25kOworICB9CisKKyAgRXhwZWN0ZWQ8Y29uc3QgRWRnZUF0dHJpYnV0ZSAmPiBhdChjb25zdCBFZGdlSWRlbnRpZmllciAmSSkgY29uc3QgeworICAgIGF1dG8gSXQgPSBFZGdlcy5maW5kKEkpOworICAgIGlmIChJdCA9PSBFZGdlcy5lbmQoKSkKKyAgICAgIHJldHVybiBtYWtlX2Vycm9yPFN0cmluZ0Vycm9yPigKKyAgICAgICAgICAiRWRnZSBJZGVudGlmaWVyIERvZXMgTm90IEV4aXN0IiwKKyAgICAgICAgICBzdGQ6Om1ha2VfZXJyb3JfY29kZShzdGQ6OmVycmM6OmludmFsaWRfYXJndW1lbnQpKTsKKyAgICByZXR1cm4gSXQtPnNlY29uZDsKKyAgfQorCisgIC8vLyBMb29rcyBmb3IgYSB2ZXJ0ZXggd2l0aCBpZGVudGlmaWVyIEksIHJldHVybnMgMSBpZiBvbmUgZXhpc3RzLCBhbmQKKyAgLy8vIDAgb3RoZXJ3aXNlCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBWZXJ0ZXhJZGVudGlmaWVyICZJKSBjb25zdCB7CisgICAgcmV0dXJuIFZlcnRpY2VzLmNvdW50KEkpOworICB9CisKKyAgLy8vIExvb2tzIGZvciBhbiBlZGdlIHdpdGggSWRlbnRpZmllciBJLCByZXR1cm5zIDEgaWYgb25lIGV4aXN0cyBhbmQgMAorICAvLy8gb3RoZXJ3aXNlCisgIHNpemVfdHlwZSBjb3VudChjb25zdCBFZGdlSWRlbnRpZmllciAmSSkgY29uc3QgeyByZXR1cm4gRWRnZXMuY291bnQoSSk7IH0KKworICAvLy8gSW5zZXJ0cyBhIHZlcnRleCBpbnRvIHRoZSBncmFwaCB3aXRoIElkZW50aWZpZXIgVmFsLmZpcnN0LCBhbmQKKyAgLy8vIEF0dHJpYnV0ZSBWYWwuc2Vjb25kLgorICBzdGQ6OnBhaXI8VmVydGV4SXRlcmF0b3IsIGJvb2w+CisgIGluc2VydChjb25zdCBzdGQ6OnBhaXI8VmVydGV4SWRlbnRpZmllciwgVmVydGV4QXR0cmlidXRlPiAmVmFsKSB7CisgICAgcmV0dXJuIFZlcnRpY2VzLmluc2VydChWYWwpOworICB9CisKKyAgc3RkOjpwYWlyPFZlcnRleEl0ZXJhdG9yLCBib29sPgorICBpbnNlcnQoc3RkOjpwYWlyPFZlcnRleElkZW50aWZpZXIsIFZlcnRleEF0dHJpYnV0ZT4gJiZWYWwpIHsKKyAgICByZXR1cm4gVmVydGljZXMuaW5zZXJ0KHN0ZDo6bW92ZShWYWwpKTsKKyAgfQorCisgIC8vLyBJbnNlcnRzIGFuIGVkZ2UgaW50byB0aGUgZ3JhcGggd2l0aCBJZGVudGlmaWVyIFZhbC5maXJzdCwgYW5kCisgIC8vLyBBdHRyaWJ1dGUgVmFsLnNlY29uZC4gSWYgdGhlIGtleSBpcyBhbHJlYWR5IGluIHRoZSBtYXAsIGl0IHJldHVybnMgZmFsc2UKKyAgLy8vIGFuZCBkb2Vzbid0IHVwZGF0ZSB0aGUgdmFsdWUuCisgIHN0ZDo6cGFpcjxFZGdlSXRlcmF0b3IsIGJvb2w+CisgIGluc2VydChjb25zdCBzdGQ6OnBhaXI8RWRnZUlkZW50aWZpZXIsIEVkZ2VBdHRyaWJ1dGU+ICZWYWwpIHsKKyAgICBjb25zdCBhdXRvICZwID0gRWRnZXMuaW5zZXJ0KFZhbCk7CisgICAgaWYgKHAuc2Vjb25kKSB7CisgICAgICBjb25zdCBhdXRvICZFSSA9IFZhbC5maXJzdDsKKyAgICAgIFZlcnRpY2VzLkZpbmRBbmRDb25zdHJ1Y3QoRUkuZmlyc3QpOworICAgICAgVmVydGljZXMuRmluZEFuZENvbnN0cnVjdChFSS5zZWNvbmQpOworICAgICAgSW5OZWlnaGJvcnNbRUkuc2Vjb25kXS5pbnNlcnQoRUkuZmlyc3QpOworICAgICAgT3V0TmVpZ2hib3JzW0VJLmZpcnN0XS5pbnNlcnQoRUkuc2Vjb25kKTsKKyAgICB9OworCisgICAgcmV0dXJuIHA7CisgIH0KKworICAvLy8gSW5zZXJ0cyBhbiBlZGdlIGludG8gdGhlIGdyYXBoIHdpdGggSWRlbnRpZmllciBWYWwuZmlyc3QsIGFuZAorICAvLy8gQXR0cmlidXRlIFZhbC5zZWNvbmQuIElmIHRoZSBrZXkgaXMgYWxyZWFkeSBpbiB0aGUgbWFwLCBpdCByZXR1cm5zIGZhbHNlCisgIC8vLyBhbmQgZG9lc24ndCB1cGRhdGUgdGhlIHZhbHVlLgorICBzdGQ6OnBhaXI8RWRnZUl0ZXJhdG9yLCBib29sPgorICBpbnNlcnQoc3RkOjpwYWlyPEVkZ2VJZGVudGlmaWVyLCBFZGdlQXR0cmlidXRlPiAmJlZhbCkgeworICAgIGF1dG8gRUkgPSBWYWwuZmlyc3Q7CisgICAgY29uc3QgYXV0byAmcCA9IEVkZ2VzLmluc2VydChzdGQ6Om1vdmUoVmFsKSk7CisgICAgaWYgKHAuc2Vjb25kKSB7CisgICAgICBWZXJ0aWNlcy5GaW5kQW5kQ29uc3RydWN0KEVJLmZpcnN0KTsKKyAgICAgIFZlcnRpY2VzLkZpbmRBbmRDb25zdHJ1Y3QoRUkuc2Vjb25kKTsKKyAgICAgIEluTmVpZ2hib3JzW0VJLnNlY29uZF0uaW5zZXJ0KEVJLmZpcnN0KTsKKyAgICAgIE91dE5laWdoYm9yc1tFSS5maXJzdF0uaW5zZXJ0KEVJLnNlY29uZCk7CisgICAgfTsKKworICAgIHJldHVybiBwOworICB9Cit9OworfQorfQorI2VuZGlmCmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1hSYXkvSW5zdHJ1bWVudGF0aW9uTWFwLmggYi9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1hSYXkvSW5zdHJ1bWVudGF0aW9uTWFwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDJiZmNhMwotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vWFJheS9JbnN0cnVtZW50YXRpb25NYXAuaApAQCAtMCwwICsxLDEzNSBAQAorLy89PT0tIEluc3RydW1lbnRhdGlvbk1hcC5oIC0gWFJheSBJbnN0cnVtZW50YXRpb24gTWFwIC0tLS0tLS0tLS0qLSBDKysgLSotPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4gU291cmNlCisvLyBMaWNlbnNlLiBTZWUgTElDRU5TRS5UWFQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyBEZWZpbmVzIHRoZSBpbnRlcmZhY2UgZm9yIGV4dHJhY3RpbmcgdGhlIGluc3RydW1lbnRhdGlvbiBtYXAgZnJvbSBhbgorLy8gWFJheS1pbnN0cnVtZW50ZWQgYmluYXJ5LgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgTExWTV9YUkFZX0lOU1RSVU1FTlRBVElPTl9NQVBfSAorI2RlZmluZSBMTFZNX1hSQVlfSU5TVFJVTUVOVEFUSU9OX01BUF9ICisKKyNpbmNsdWRlICJsbHZtL0FEVC9PcHRpb25hbC5oIgorI2luY2x1ZGUgImxsdm0vQURUL1N0cmluZ1JlZi5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9FcnJvci5oIgorI2luY2x1ZGUgImxsdm0vU3VwcG9ydC9ZQU1MVHJhaXRzLmgiCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworbmFtZXNwYWNlIGxsdm0geworCituYW1lc3BhY2UgeHJheSB7CisKKy8vIEZvcndhcmQgZGVjbGFyZSB0byBtYWtlIGEgZnJpZW5kLgorY2xhc3MgSW5zdHJ1bWVudGF0aW9uTWFwOworCisvLy8gTG9hZHMgdGhlIGluc3RydW1lbnRhdGlvbiBtYXAgZnJvbSB8RmlsZW5hbWV8LiBUaGlzIGF1dG8tZGVkdWNlcyB0aGUgdHlwZSBvZgorLy8vIHRoZSBpbnN0cnVtZW50YXRpb24gbWFwLgorRXhwZWN0ZWQ8SW5zdHJ1bWVudGF0aW9uTWFwPiBsb2FkSW5zdHJ1bWVudGF0aW9uTWFwKFN0cmluZ1JlZiBGaWxlbmFtZSk7CisKKy8vLyBSZXByZXNlbnRzIGFuIFhSYXkgaW5zdHJ1bWVudGF0aW9uIHNsZWQgZW50cnkgZnJvbSBhbiBvYmplY3QgZmlsZS4KK3N0cnVjdCBTbGVkRW50cnkgeworICAvLy8gRWFjaCBlbnRyeSBoZXJlIHJlcHJlc2VudHMgdGhlIGtpbmRzIG9mIHN1cHBvcnRlZCBpbnN0cnVtZW50YXRpb24gbWFwCisgIC8vLyBlbnRyaWVzLgorICBlbnVtIGNsYXNzIEZ1bmN0aW9uS2luZHMgeyBFTlRSWSwgRVhJVCwgVEFJTCwgTE9HX0FSR1NfRU5URVIsIENVU1RPTV9FVkVOVCB9OworCisgIC8vLyBUaGUgYWRkcmVzcyBvZiB0aGUgc2xlZC4KKyAgdWludDY0X3QgQWRkcmVzczsKKworICAvLy8gVGhlIGFkZHJlc3Mgb2YgdGhlIGZ1bmN0aW9uLgorICB1aW50NjRfdCBGdW5jdGlvbjsKKworICAvLy8gVGhlIGtpbmQgb2Ygc2xlZC4KKyAgRnVuY3Rpb25LaW5kcyBLaW5kOworCisgIC8vLyBXaGV0aGVyIHRoZSBzbGVkIHdhcyBhbm5vdGF0ZWQgdG8gYWx3YXlzIGJlIGluc3RydW1lbnRlZC4KKyAgYm9vbCBBbHdheXNJbnN0cnVtZW50OworfTsKKworc3RydWN0IFlBTUxYUmF5U2xlZEVudHJ5IHsKKyAgaW50MzJfdCBGdW5jSWQ7CisgIHlhbWw6OkhleDY0IEFkZHJlc3M7CisgIHlhbWw6OkhleDY0IEZ1bmN0aW9uOworICBTbGVkRW50cnk6OkZ1bmN0aW9uS2luZHMgS2luZDsKKyAgYm9vbCBBbHdheXNJbnN0cnVtZW50OworICBzdGQ6OnN0cmluZyBGdW5jdGlvbk5hbWU7Cit9OworCisvLy8gVGhlIEluc3RydW1lbnRhdGlvbk1hcCByZXByZXNlbnRzIHRoZSBjb21wdXRlZCBmdW5jdGlvbiBpZCdzIGFuZCBpbmRpY2F0ZWQKKy8vLyBmdW5jdGlvbiBhZGRyZXNzZXMgZnJvbSBhbiBvYmplY3QgZmlsZSAob3IgYSBZQU1MIGZpbGUpLiBUaGlzIHByb3ZpZGVzIGFuCisvLy8gaW50ZXJmYWNlIHRvIGp1c3QgdGhlIG1hcHBpbmcgYmV0d2VlbiB0aGUgZnVuY3Rpb24gaWQsIGFuZCB0aGUgZnVuY3Rpb24KKy8vLyBhZGRyZXNzLgorLy8vCisvLy8gV2UgYWxzbyBwcm92aWRlIHJhdyBhY2Nlc3MgdG8gdGhlIGFjdHVhbCBpbnN0cnVtZW50YXRpb24gbWFwIGVudHJpZXMgd2UgZmluZAorLy8vIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgb2JqZWN0IGZpbGUuCisvLy8KK2NsYXNzIEluc3RydW1lbnRhdGlvbk1hcCB7CitwdWJsaWM6CisgIHVzaW5nIEZ1bmN0aW9uQWRkcmVzc01hcCA9IHN0ZDo6dW5vcmRlcmVkX21hcDxpbnQzMl90LCB1aW50NjRfdD47CisgIHVzaW5nIEZ1bmN0aW9uQWRkcmVzc1JldmVyc2VNYXAgPSBzdGQ6OnVub3JkZXJlZF9tYXA8dWludDY0X3QsIGludDMyX3Q+OworICB1c2luZyBTbGVkQ29udGFpbmVyID0gc3RkOjp2ZWN0b3I8U2xlZEVudHJ5PjsKKworcHJpdmF0ZToKKyAgU2xlZENvbnRhaW5lciBTbGVkczsKKyAgRnVuY3Rpb25BZGRyZXNzTWFwIEZ1bmN0aW9uQWRkcmVzc2VzOworICBGdW5jdGlvbkFkZHJlc3NSZXZlcnNlTWFwIEZ1bmN0aW9uSWRzOworCisgIGZyaWVuZCBFeHBlY3RlZDxJbnN0cnVtZW50YXRpb25NYXA+IGxvYWRJbnN0cnVtZW50YXRpb25NYXAoU3RyaW5nUmVmKTsKKworcHVibGljOgorICAvLy8gUHJvdmlkZXMgYSByYXcgYWNjZXNzb3IgdG8gdGhlIHVub3JkZXJlZCBtYXAgb2YgZnVuY3Rpb24gYWRkcmVzc2VzLgorICBjb25zdCBGdW5jdGlvbkFkZHJlc3NNYXAgJmdldEZ1bmN0aW9uQWRkcmVzc2VzKCkgeyByZXR1cm4gRnVuY3Rpb25BZGRyZXNzZXM7IH0KKworICAvLy8gUmV0dXJucyBhbiBYUmF5IGNvbXB1dGVkIGZ1bmN0aW9uIGlkLCBwcm92aWRlZCBhIGZ1bmN0aW9uIGFkZHJlc3MuCisgIE9wdGlvbmFsPGludDMyX3Q+IGdldEZ1bmN0aW9uSWQodWludDY0X3QgQWRkcikgY29uc3Q7CisKKyAgLy8vIFJldHVybnMgdGhlIGZ1bmN0aW9uIGFkZHJlc3MgZm9yIGEgZnVuY3Rpb24gaWQuCisgIE9wdGlvbmFsPHVpbnQ2NF90PiBnZXRGdW5jdGlvbkFkZHIoaW50MzJfdCBGdW5jSWQpIGNvbnN0OworCisgIC8vLyBQcm92aWRlIHJlYWQtb25seSBhY2Nlc3MgdG8gdGhlIGVudHJpZXMgb2YgdGhlIGluc3RydW1lbnRhdGlvbiBtYXAuCisgIGNvbnN0IFNsZWRDb250YWluZXIgJnNsZWRzKCkgY29uc3QgeyByZXR1cm4gU2xlZHM7IH07Cit9OworCit9IC8vIGVuZCBuYW1lc3BhY2UgeHJheQorCituYW1lc3BhY2UgeWFtbCB7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBTY2FsYXJFbnVtZXJhdGlvblRyYWl0czx4cmF5OjpTbGVkRW50cnk6OkZ1bmN0aW9uS2luZHM+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCB4cmF5OjpTbGVkRW50cnk6OkZ1bmN0aW9uS2luZHMgJktpbmQpIHsKKyAgICBJTy5lbnVtQ2FzZShLaW5kLCAiZnVuY3Rpb24tZW50ZXIiLCB4cmF5OjpTbGVkRW50cnk6OkZ1bmN0aW9uS2luZHM6OkVOVFJZKTsKKyAgICBJTy5lbnVtQ2FzZShLaW5kLCAiZnVuY3Rpb24tZXhpdCIsIHhyYXk6OlNsZWRFbnRyeTo6RnVuY3Rpb25LaW5kczo6RVhJVCk7CisgICAgSU8uZW51bUNhc2UoS2luZCwgInRhaWwtZXhpdCIsIHhyYXk6OlNsZWRFbnRyeTo6RnVuY3Rpb25LaW5kczo6VEFJTCk7CisgICAgSU8uZW51bUNhc2UoS2luZCwgImxvZy1hcmdzLWVudGVyIiwKKyAgICAgICAgICAgICAgICB4cmF5OjpTbGVkRW50cnk6OkZ1bmN0aW9uS2luZHM6OkxPR19BUkdTX0VOVEVSKTsKKyAgICBJTy5lbnVtQ2FzZShLaW5kLCAiY3VzdG9tLWV2ZW50IiwKKyAgICAgICAgICAgICAgICB4cmF5OjpTbGVkRW50cnk6OkZ1bmN0aW9uS2luZHM6OkNVU1RPTV9FVkVOVCk7CisgIH0KK307CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBNYXBwaW5nVHJhaXRzPHhyYXk6OllBTUxYUmF5U2xlZEVudHJ5PiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCB4cmF5OjpZQU1MWFJheVNsZWRFbnRyeSAmRW50cnkpIHsKKyAgICBJTy5tYXBSZXF1aXJlZCgiaWQiLCBFbnRyeS5GdW5jSWQpOworICAgIElPLm1hcFJlcXVpcmVkKCJhZGRyZXNzIiwgRW50cnkuQWRkcmVzcyk7CisgICAgSU8ubWFwUmVxdWlyZWQoImZ1bmN0aW9uIiwgRW50cnkuRnVuY3Rpb24pOworICAgIElPLm1hcFJlcXVpcmVkKCJraW5kIiwgRW50cnkuS2luZCk7CisgICAgSU8ubWFwUmVxdWlyZWQoImFsd2F5cy1pbnN0cnVtZW50IiwgRW50cnkuQWx3YXlzSW5zdHJ1bWVudCk7CisgICAgSU8ubWFwT3B0aW9uYWwoImZ1bmN0aW9uLW5hbWUiLCBFbnRyeS5GdW5jdGlvbk5hbWUpOworICB9CisKKyAgc3RhdGljIGNvbnN0ZXhwciBib29sIGZsb3cgPSB0cnVlOworfTsKKworfSAvLyBlbmQgbmFtZXNwYWNlIHlhbWwKKworfSAvLyBlbmQgbmFtZXNwYWNlIGxsdm0KKworTExWTV9ZQU1MX0lTX1NFUVVFTkNFX1ZFQ1RPUih4cmF5OjpZQU1MWFJheVNsZWRFbnRyeSkKKworI2VuZGlmIC8vIExMVk1fWFJBWV9JTlNUUlVNRU5UQVRJT05fTUFQX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vWFJheS9UcmFjZS5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9YUmF5L1RyYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIwMzNkNgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vWFJheS9UcmFjZS5oCkBAIC0wLDAgKzEsNzEgQEAKKy8vPT09LSBUcmFjZS5oIC0gWFJheSBUcmFjZSBBYnN0cmFjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkaXN0cmlidXRlZCB1bmRlciB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuIFNvdXJjZQorLy8gTGljZW5zZS4gU2VlIExJQ0VOU0UuVFhUIGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gRGVmaW5lcyB0aGUgWFJheSBUcmFjZSBjbGFzcyByZXByZXNlbnRpbmcgcmVjb3JkcyBpbiBhbiBYUmF5IHRyYWNlIGZpbGUuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgTExWTV9YUkFZX1RSQUNFX0gKKyNkZWZpbmUgTExWTV9YUkFZX1RSQUNFX0gKKworI2luY2x1ZGUgPGNzdGRpbnQ+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAibGx2bS9BRFQvU3RyaW5nUmVmLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0Vycm9yLmgiCisjaW5jbHVkZSAibGx2bS9TdXBwb3J0L0ZpbGVTeXN0ZW0uaCIKKyNpbmNsdWRlICJsbHZtL1hSYXkvWFJheVJlY29yZC5oIgorCituYW1lc3BhY2UgbGx2bSB7CituYW1lc3BhY2UgeHJheSB7CisKKy8vLyBBIFRyYWNlIG9iamVjdCByZXByZXNlbnRzIHRoZSByZWNvcmRzIHRoYXQgaGF2ZSBiZWVuIGxvYWRlZCBmcm9tIFhSYXkKKy8vLyBsb2cgZmlsZXMgZ2VuZXJhdGVkIGJ5IGluc3RydW1lbnRlZCBiaW5hcmllcy4gV2UgZW5jYXBzdWxhdGUgdGhlIGxvZ2ljIG9mCisvLy8gcmVhZGluZyB0aGUgdHJhY2VzIGluIGZhY3RvcnkgZnVuY3Rpb25zIHRoYXQgcG9wdWxhdGUgdGhlIFRyYWNlIG9iamVjdAorLy8vIGFwcHJvcHJpYXRlbHkuCisvLy8KKy8vLyBUcmFjZSBvYmplY3RzIHByb3ZpZGUgYW4gYWNjZXNzb3IgdG8gYW4gWFJheUZpbGVIZWFkZXIgd2hpY2ggc2F5cyBtb3JlIGFib3V0CisvLy8gZGV0YWlscyBvZiB0aGUgZmlsZSBmcm9tIHdoaWNoIHRoZSBYUmF5IHRyYWNlIHdhcyBsb2FkZWQgZnJvbS4KKy8vLworLy8vIFVzYWdlOgorLy8vCisvLy8gICBpZiAoYXV0byBUcmFjZU9yRXJyID0gbG9hZFRyYWNlRmlsZSgieHJheS1sb2cuc29tZXRoaW5nLnhyYXkiKSkgeworLy8vICAgICBhdXRvJiBUID0gKlRyYWNlT3JFcnI7CisvLy8gICAgIC8vIFQuZ2V0RmlsZUhlYWRlcigpIHdpbGwgcHJvdmlkZSBpbmZvcm1hdGlvbiBmcm9tIHRoZSB0cmFjZSBoZWFkZXIuCisvLy8gICAgIGZvciAoY29uc3QgWFJheVJlY29yZCAmUiA6IFQpIHsKKy8vLyAgICAgICAvLyAuLi4gZG8gc29tZXRoaW5nIHdpdGggUiBoZXJlLgorLy8vICAgICB9CisvLy8gICB9IGVsc2UgeworLy8vICAgICAvLyBIYW5kbGUgdGhlIGVycm9yIGhlcmUuCisvLy8gICB9CisvLy8KK2NsYXNzIFRyYWNlIHsKKyAgWFJheUZpbGVIZWFkZXIgRmlsZUhlYWRlcjsKKyAgc3RkOjp2ZWN0b3I8WFJheVJlY29yZD4gUmVjb3JkczsKKworICB0eXBlZGVmIHN0ZDo6dmVjdG9yPFhSYXlSZWNvcmQ+Ojpjb25zdF9pdGVyYXRvciBjaXRlcmF0b3I7CisKKyAgZnJpZW5kIEV4cGVjdGVkPFRyYWNlPiBsb2FkVHJhY2VGaWxlKFN0cmluZ1JlZiwgYm9vbCk7CisKK3B1YmxpYzoKKyAgLy8vIFByb3ZpZGVzIGFjY2VzcyB0byB0aGUgbG9hZGVkIFhSYXkgdHJhY2UgZmlsZSBoZWFkZXIuCisgIGNvbnN0IFhSYXlGaWxlSGVhZGVyICZnZXRGaWxlSGVhZGVyKCkgY29uc3QgeyByZXR1cm4gRmlsZUhlYWRlcjsgfQorCisgIGNpdGVyYXRvciBiZWdpbigpIGNvbnN0IHsgcmV0dXJuIFJlY29yZHMuYmVnaW4oKTsgfQorICBjaXRlcmF0b3IgZW5kKCkgY29uc3QgeyByZXR1cm4gUmVjb3Jkcy5lbmQoKTsgfQorICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIFJlY29yZHMuc2l6ZSgpOyB9Cit9OworCisvLy8gVGhpcyBmdW5jdGlvbiB3aWxsIGF0dGVtcHQgdG8gbG9hZCBYUmF5IHRyYWNlIHJlY29yZHMgZnJvbSB0aGUgcHJvdmlkZWQKKy8vLyB8RmlsZW5hbWV8LgorRXhwZWN0ZWQ8VHJhY2U+IGxvYWRUcmFjZUZpbGUoU3RyaW5nUmVmIEZpbGVuYW1lLCBib29sIFNvcnQgPSBmYWxzZSk7CisKK30gLy8gbmFtZXNwYWNlIHhyYXkKK30gLy8gbmFtZXNwYWNlIGxsdm0KKworI2VuZGlmIC8vIExMVk1fWFJBWV9UUkFDRV9ICmRpZmYgLS1naXQgYS9saW51eC14NjQvY2xhbmcvaW5jbHVkZS9sbHZtL1hSYXkvWFJheVJlY29yZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9YUmF5L1hSYXlSZWNvcmQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzVlOWY0Ci0tLSAvZGV2L251bGwKKysrIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9YUmF5L1hSYXlSZWNvcmQuaApAQCAtMCwwICsxLDg1IEBACisvLz09PS0gWFJheVJlY29yZC5oIC0gWFJheSBUcmFjZSBSZWNvcmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFRoaXMgZmlsZSByZXBsaWNhdGVzIHRoZSByZWNvcmQgZGVmaW5pdGlvbiBmb3IgWFJheSBsb2cgZW50cmllcy4gVGhpcyBzaG91bGQKKy8vIGZvbGxvdyB0aGUgZXZvbHV0aW9uIG9mIHRoZSBsb2cgcmVjb3JkIHZlcnNpb25zIHN1cHBvcnRlZCBpbiB0aGUgY29tcGlsZXItcnQKKy8vIHhyYXkgcHJvamVjdC4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworI2lmbmRlZiBMTFZNX1hSQVlfWFJBWV9SRUNPUkRfSAorI2RlZmluZSBMTFZNX1hSQVlfWFJBWV9SRUNPUkRfSAorCisjaW5jbHVkZSA8Y3N0ZGludD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSB4cmF5IHsKKworLy8vIFhSYXkgdHJhY2VzIGFsbCBoYXZlIGEgaGVhZGVyIHByb3ZpZGluZyBzb21lIHRvcC1tYXR0ZXIgaW5mb3JtYXRpb24gdXNlZnVsCisvLy8gdG8gaGVscCB0b29scyBkZXRlcm1pbmUgaG93IHRvIGludGVycHJldCB0aGUgaW5mb3JtYXRpb24gYXZhaWxhYmxlIGluIHRoZQorLy8vIHRyYWNlLgorc3RydWN0IFhSYXlGaWxlSGVhZGVyIHsKKyAgLy8vIFZlcnNpb24gb2YgdGhlIFhSYXkgaW1wbGVtZW50YXRpb24gdGhhdCBwcm9kdWNlZCB0aGlzIGZpbGUuCisgIHVpbnQxNl90IFZlcnNpb24gPSAwOworCisgIC8vLyBBIG51bWVyaWMgaWRlbnRpZmllciBmb3IgdGhlIHR5cGUgb2YgZmlsZSB0aGlzIGlzLiBCZXN0IHVzZWQgaW4KKyAgLy8vIGNvbWJpbmF0aW9uIHdpdGggVmVyc2lvbi4KKyAgdWludDE2X3QgVHlwZSA9IDA7CisKKyAgLy8vIFdoZXRoZXIgdGhlIENQVSB0aGF0IHByb2R1Y2VkIHRoZSB0aW1lc3RhbXAgY291bnRlcnMgKFRTQykgbW92ZSBhdCBhCisgIC8vLyBjb25zdGFudCByYXRlLgorICBib29sIENvbnN0YW50VFNDOworCisgIC8vLyBXaGV0aGVyIHRoZSBDUFUgdGhhdCBwcm9kdWNlZCB0aGUgdGltZXN0YW1wIGNvdW50ZXJzIChUU0MpIGRvIG5vdCBzdG9wLgorICBib29sIE5vbnN0b3BUU0M7CisKKyAgLy8vIFRoZSBudW1iZXIgb2YgY3ljbGVzIHBlciBzZWNvbmQgZm9yIHRoZSBDUFUgdGhhdCBwcm9kdWNlZCB0aGUgdGltZXN0YW1wCisgIC8vLyBjb3VudGVyIChUU0MpIHZhbHVlcy4gVXNlZnVsIGZvciBlc3RpbWF0aW5nIHRoZSBhbW91bnQgb2YgdGltZSB0aGF0CisgIC8vLyBlbGFwc2VkIGJldHdlZW4gdHdvIFRTQ3Mgb24gc29tZSBwbGF0Zm9ybXMuCisgIHVpbnQ2NF90IEN5Y2xlRnJlcXVlbmN5ID0gMDsKKworICAvLyBUaGlzIGlzIGRpZmZlcmVudCBkZXBlbmRpbmcgb24gdGhlIHR5cGUgb2YgeHJheSByZWNvcmQuIFRoZSBuYWl2ZSBmb3JtYXQKKyAgLy8gc3RvcmVzIGEgV2FsbGNsb2NrIHRpbWVzcGVjLiBGRFIgbG9nZ2luZyBzdG9yZXMgdGhlIHNpemUgb2YgYSB0aHJlYWQKKyAgLy8gYnVmZmVyLgorICBjaGFyIEZyZWVGb3JtRGF0YVsxNl07Cit9OworCisvLy8gRGV0ZXJtaW5lcyB0aGUgc3VwcG9ydGVkIHR5cGVzIG9mIHJlY29yZHMgdGhhdCBjb3VsZCBiZSBzZWVuIGluIFhSYXkgdHJhY2VzLgorLy8vIFRoaXMgbWF5IG9yIG1heSBub3QgY29ycmVzcG9uZCB0byBhY3R1YWwgcmVjb3JkIHR5cGVzIGluIHRoZSByYXcgdHJhY2UgKGFzCisvLy8gdGhlIGxvYWRlciBpbXBsZW1lbnRhdGlvbiBtYXkgc3ludGhlc2l6ZSB0aGlzIGluZm9ybWF0aW9uIGluIHRoZSBwcm9jZXNzIG9mCisvLy8gb2YgbG9hZGluZykuCitlbnVtIGNsYXNzIFJlY29yZFR5cGVzIHsgRU5URVIsIEVYSVQsIFRBSUxfRVhJVCwgRU5URVJfQVJHIH07CisKK3N0cnVjdCBYUmF5UmVjb3JkIHsKKyAgLy8vIFRoZSB0eXBlIG9mIHJlY29yZC4KKyAgdWludDE2X3QgUmVjb3JkVHlwZTsKKworICAvLy8gVGhlIENQVSB3aGVyZSB0aGUgdGhyZWFkIGlzIHJ1bm5pbmcuIFdlIGFzc3VtZSBudW1iZXIgb2YgQ1BVcyA8PSA2NTUzNi4KKyAgdWludDE2X3QgQ1BVOworCisgIC8vLyBJZGVudGlmaWVzIHRoZSB0eXBlIG9mIHJlY29yZC4KKyAgUmVjb3JkVHlwZXMgVHlwZTsKKworICAvLy8gVGhlIGZ1bmN0aW9uIElEIGZvciB0aGUgcmVjb3JkLgorICBpbnQzMl90IEZ1bmNJZDsKKworICAvLy8gR2V0IHRoZSBmdWxsIDggYnl0ZXMgb2YgdGhlIFRTQyB3aGVuIHdlIGdldCB0aGUgbG9nIHJlY29yZC4KKyAgdWludDY0X3QgVFNDOworCisgIC8vLyBUaGUgdGhyZWFkIElEIGZvciB0aGUgY3VycmVudGx5IHJ1bm5pbmcgdGhyZWFkLgorICB1aW50MzJfdCBUSWQ7CisKKyAgLy8vIFRoZSBmdW5jdGlvbiBjYWxsIGFyZ3VtZW50cy4KKyAgc3RkOjp2ZWN0b3I8dWludDY0X3Q+IENhbGxBcmdzOworfTsKKworfSAvLyBuYW1lc3BhY2UgeHJheQorfSAvLyBuYW1lc3BhY2UgbGx2bQorCisjZW5kaWYgLy8gTExWTV9YUkFZX1hSQVlfUkVDT1JEX0gKZGlmZiAtLWdpdCBhL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vWFJheS9ZQU1MWFJheVJlY29yZC5oIGIvbGludXgteDY0L2NsYW5nL2luY2x1ZGUvbGx2bS9YUmF5L1lBTUxYUmF5UmVjb3JkLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjQzNmFlZgotLS0gL2Rldi9udWxsCisrKyBiL2xpbnV4LXg2NC9jbGFuZy9pbmNsdWRlL2xsdm0vWFJheS9ZQU1MWFJheVJlY29yZC5oCkBAIC0wLDAgKzEsMTAzIEBACisvLz09PS0gWUFNTFhSYXlSZWNvcmQuaCAtIFhSYXkgUmVjb3JkIFlBTUwgU3VwcG9ydCBEZWZpbml0aW9ucyAtLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbiBTb3VyY2UKKy8vIExpY2Vuc2UuIFNlZSBMSUNFTlNFLlRYVCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vIFR5cGVzIGFuZCB0cmFpdHMgc3BlY2lhbGlzYXRpb25zIGZvciBZQU1MIEkvTyBvZiBYUmF5IGxvZyBlbnRyaWVzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjaWZuZGVmIExMVk1fWFJBWV9ZQU1MX1hSQVlfUkVDT1JEX0gKKyNkZWZpbmUgTExWTV9YUkFZX1lBTUxfWFJBWV9SRUNPUkRfSAorCisjaW5jbHVkZSA8dHlwZV90cmFpdHM+CisKKyNpbmNsdWRlICJsbHZtL1N1cHBvcnQvWUFNTFRyYWl0cy5oIgorI2luY2x1ZGUgImxsdm0vWFJheS9YUmF5UmVjb3JkLmgiCisKK25hbWVzcGFjZSBsbHZtIHsKK25hbWVzcGFjZSB4cmF5IHsKKworc3RydWN0IFlBTUxYUmF5RmlsZUhlYWRlciB7CisgIHVpbnQxNl90IFZlcnNpb247CisgIHVpbnQxNl90IFR5cGU7CisgIGJvb2wgQ29uc3RhbnRUU0M7CisgIGJvb2wgTm9uc3RvcFRTQzsKKyAgdWludDY0X3QgQ3ljbGVGcmVxdWVuY3k7Cit9OworCitzdHJ1Y3QgWUFNTFhSYXlSZWNvcmQgeworICB1aW50MTZfdCBSZWNvcmRUeXBlOworICB1aW50MTZfdCBDUFU7CisgIFJlY29yZFR5cGVzIFR5cGU7CisgIGludDMyX3QgRnVuY0lkOworICBzdGQ6OnN0cmluZyBGdW5jdGlvbjsKKyAgdWludDY0X3QgVFNDOworICB1aW50MzJfdCBUSWQ7CisgIHN0ZDo6dmVjdG9yPHVpbnQ2NF90PiBDYWxsQXJnczsKK307CisKK3N0cnVjdCBZQU1MWFJheVRyYWNlIHsKKyAgWUFNTFhSYXlGaWxlSGVhZGVyIEhlYWRlcjsKKyAgc3RkOjp2ZWN0b3I8WUFNTFhSYXlSZWNvcmQ+IFJlY29yZHM7Cit9OworCit9IC8vIG5hbWVzcGFjZSB4cmF5CisKK25hbWVzcGFjZSB5YW1sIHsKKworLy8gWUFNTCBUcmFpdHMKKy8vIC0tLS0tLS0tLS0tCit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgU2NhbGFyRW51bWVyYXRpb25UcmFpdHM8eHJheTo6UmVjb3JkVHlwZXM+IHsKKyAgc3RhdGljIHZvaWQgZW51bWVyYXRpb24oSU8gJklPLCB4cmF5OjpSZWNvcmRUeXBlcyAmVHlwZSkgeworICAgIElPLmVudW1DYXNlKFR5cGUsICJmdW5jdGlvbi1lbnRlciIsIHhyYXk6OlJlY29yZFR5cGVzOjpFTlRFUik7CisgICAgSU8uZW51bUNhc2UoVHlwZSwgImZ1bmN0aW9uLWV4aXQiLCB4cmF5OjpSZWNvcmRUeXBlczo6RVhJVCk7CisgICAgSU8uZW51bUNhc2UoVHlwZSwgImZ1bmN0aW9uLXRhaWwtZXhpdCIsIHhyYXk6OlJlY29yZFR5cGVzOjpUQUlMX0VYSVQpOworICAgIElPLmVudW1DYXNlKFR5cGUsICJmdW5jdGlvbi1lbnRlci1hcmciLCB4cmF5OjpSZWNvcmRUeXBlczo6RU5URVJfQVJHKTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8eHJheTo6WUFNTFhSYXlGaWxlSGVhZGVyPiB7CisgIHN0YXRpYyB2b2lkIG1hcHBpbmcoSU8gJklPLCB4cmF5OjpZQU1MWFJheUZpbGVIZWFkZXIgJkhlYWRlcikgeworICAgIElPLm1hcFJlcXVpcmVkKCJ2ZXJzaW9uIiwgSGVhZGVyLlZlcnNpb24pOworICAgIElPLm1hcFJlcXVpcmVkKCJ0eXBlIiwgSGVhZGVyLlR5cGUpOworICAgIElPLm1hcFJlcXVpcmVkKCJjb25zdGFudC10c2MiLCBIZWFkZXIuQ29uc3RhbnRUU0MpOworICAgIElPLm1hcFJlcXVpcmVkKCJub25zdG9wLXRzYyIsIEhlYWRlci5Ob25zdG9wVFNDKTsKKyAgICBJTy5tYXBSZXF1aXJlZCgiY3ljbGUtZnJlcXVlbmN5IiwgSGVhZGVyLkN5Y2xlRnJlcXVlbmN5KTsKKyAgfQorfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8eHJheTo6WUFNTFhSYXlSZWNvcmQ+IHsKKyAgc3RhdGljIHZvaWQgbWFwcGluZyhJTyAmSU8sIHhyYXk6OllBTUxYUmF5UmVjb3JkICZSZWNvcmQpIHsKKyAgICAvLyBGSVhNRTogTWFrZSB0aGlzIHR5cGUgYWN0dWFsbHkgYmUgZGVzY3JpcHRpdmUKKyAgICBJTy5tYXBSZXF1aXJlZCgidHlwZSIsIFJlY29yZC5SZWNvcmRUeXBlKTsKKyAgICBJTy5tYXBSZXF1aXJlZCgiZnVuYy1pZCIsIFJlY29yZC5GdW5jSWQpOworICAgIElPLm1hcE9wdGlvbmFsKCJmdW5jdGlvbiIsIFJlY29yZC5GdW5jdGlvbik7CisgICAgSU8ubWFwT3B0aW9uYWwoImFyZ3MiLCBSZWNvcmQuQ2FsbEFyZ3MpOworICAgIElPLm1hcFJlcXVpcmVkKCJjcHUiLCBSZWNvcmQuQ1BVKTsKKyAgICBJTy5tYXBSZXF1aXJlZCgidGhyZWFkIiwgUmVjb3JkLlRJZCk7CisgICAgSU8ubWFwUmVxdWlyZWQoImtpbmQiLCBSZWNvcmQuVHlwZSk7CisgICAgSU8ubWFwUmVxdWlyZWQoInRzYyIsIFJlY29yZC5UU0MpOworICB9CisKKyAgc3RhdGljIGNvbnN0ZXhwciBib29sIGZsb3cgPSB0cnVlOworfTsKKwordGVtcGxhdGUgPD4gc3RydWN0IE1hcHBpbmdUcmFpdHM8eHJheTo6WUFNTFhSYXlUcmFjZT4geworICBzdGF0aWMgdm9pZCBtYXBwaW5nKElPICZJTywgeHJheTo6WUFNTFhSYXlUcmFjZSAmVHJhY2UpIHsKKyAgICAvLyBBIHRyYWNlIGZpbGUgY29udGFpbnMgdHdvIHBhcnRzLCB0aGUgaGVhZGVyIGFuZCB0aGUgbGlzdCBvZiBhbGwgdGhlCisgICAgLy8gdHJhY2UgcmVjb3Jkcy4KKyAgICBJTy5tYXBSZXF1aXJlZCgiaGVhZGVyIiwgVHJhY2UuSGVhZGVyKTsKKyAgICBJTy5tYXBSZXF1aXJlZCgicmVjb3JkcyIsIFRyYWNlLlJlY29yZHMpOworICB9Cit9OworCit9IC8vIG5hbWVzcGFjZSB5YW1sCit9IC8vIG5hbWVzcGFjZSBsbHZtCisKK0xMVk1fWUFNTF9JU19TRVFVRU5DRV9WRUNUT1IoeHJheTo6WUFNTFhSYXlSZWNvcmQpCisKKyNlbmRpZiAvLyBMTFZNX1hSQVlfWUFNTF9YUkFZX1JFQ09SRF9ICg==